ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDhmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9BVVRIT1JTCkBAIC0wLDAgKzEsMTc2IEBACitMaXN0IG9mIHRoZSBhdXRob3JzIG9mIGNvZGUgY29udGFpbmVkIGluIEJ1c3lCb3guCisKK0lmIHlvdSBoYXZlIGNvZGUgaW4gQnVzeUJveCwgeW91IHNob3VsZCBiZSBsaXN0ZWQgaGVyZS4gIElmIHlvdSBzaG91bGQgYmUKK2xpc3RlZCwgb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91IGhhdmUgZG9uZSBuZWVkcyBtb3JlIGRldGFpbCwgb3IgaXMKK2luY29ycmVjdCwgX3BsZWFzZV8gbGV0IG1lIGtub3cuCisKKyAtRXJpaworCistLS0tLS0tLS0tLQorCitQZXRlciBXaWxsaXMgPHBzeXBocmVha0BwaHJlYWtlci5uZXQ+CisgICAgZWplY3QKKworRW1hbnVlbGUgQWluYSA8ZW1hbnVlbGUuYWluYUB0aXNjYWxpLml0PgorICAgIHJ1bi1wYXJ0cworCitFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgICAgVG9ucyBvZiBuZXcgc3R1ZmYsIG1ham9yIHJld3JpdGUgb2YgbW9zdCBvZiB0aGUKKyAgICBjb3JlIGFwcHMsIHRvbnMgb2YgbmV3IGFwcHMgYXMgbm90ZWQgaW4gaGVhZGVyIGZpbGVzLgorICAgIExvdHMgb2YgdGVkaW91cyBlZmZvcnQgd3JpdGluZyB0aGVzZSBib3JpbmcgZG9jcyB0aGF0CisgICAgbm9ib2R5IGlzIGdvaW5nIHRvIGFjdHVhbGx5IHJlYWQuCisKK0xhdXJlbmNlIEFuZGVyc29uIDxsLmQuYW5kZXJzb25Ad2Fyd2ljay5hYy51az4KKyAgICBycG0yY3BpbywgdW56aXAsIGdldF9oZWFkZXJfY3BpbywgcmVhZF9neiBpbnRlcmZhY2UsIHJwbQorCitKZWZmIEFuZ2llbHNraSA8amVmZkB0aGVwdHJncm91cC5jb20+CisgICAgZnRwcHV0LCBmdHBnZXQKKworRW5yaWsgQmVya2hhbiA8RW5yaWsuQmVya2hhbkBpbmthLmRlPgorICAgIHNldGNvbnNvbGUKKworSmltIEJhdWVyIDxqZmJhdWVyQG5mci5jb20+CisgICAgbW9kcHJvYmUgc2hlbGwgZGVwZW5kZW5jeQorCitFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPgorICAgIGV4cHIsIGhvc3RpZCwgbG9nbmFtZSwgd2hvYW1pCisKK0pvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAgICBkdSwgbnNsb29rdXAsIHNvcnQKKworRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICAgemNpcAorCitCcmlhbiBDYW5kbGVyIDxCLkNhbmRsZXJAcG9ib3guY29tPgorICAgIHRpbnktbHMobHMpCisKK1JhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICAgIGZic2V0LCBwaW5nLCBob3N0bmFtZQorCitEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorICAgIG1vcmUodjIpLCBtYWtlZGV2cywgZHV0bXAsIG1vZHVsYXJpemF0aW9uLCBhdXRvIGxpbmtzIGZpbGUsCisgICAgdmFyaW91cyBmaXhlcywgTGludXggUm91dGVyIFByb2plY3QgbWFpbnRlbmFuY2UKKworSm9yZGFuIENyb3VzZSA8am9yZGFuQGNvc21pY3Blbmd1aW4ubmV0PgorICAgIGlwY2FsYworCitNYWdudXMgRGFtbSA8ZGFtbUBvcGVuc291cmNlLnNlPgorICAgIHRmdHAgY2xpZW50CisgICAgaW5zbW9kIHBvd2VycGMgc3VwcG9ydAorCitMYXJyeSBEb29saXR0bGUgPGxkb29saXR0QHJlY3ljbGUubGJsLmdvdj4KKyAgICBwcmlzdGluZSBzb3VyY2UgZGlyZWN0b3J5IGNvbXBpbGF0aW9uLCBsb3RzIG9mIHBhdGNoZXMgYW5kIGZpeGVzLgorCitHbGVubiBFbmdlbCA8Z2xlbm5lQGVuZ2VsLm9yZz4KKyAgICBodHRwZAorCitHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+CisgICAgU3lza2xvZ2QgKHNpbmdsZSB0aHJlYWRlZCBzeXNsb2dkLCBJUEMgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQsCisgICAgbG9ncmVhZCksIHZhcmlvdXMgZml4ZXMuCisKK1JvYmVydCBHcmllYmwgPHNhbmRtYW5AaGFuZGhlbGRzLm9yZz4KKyAgICBtb2Rwcm9iZSwgaHdjbG9jaywgc3VpZC9zZ2lkIGhhbmRsaW5nLCB0aW55bG9naW4gaW50ZWdyYXRpb24KKyAgICBtYW55IGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMKKworS2FybCBNLiBIZWdibG9vbSA8a2FybGhlZ0BkZWJpYW4ub3JnPgorICAgIGNwX212LmMsIHRoZSB0ZXN0IHN1aXRlLCB2YXJpb3VzIGZpeGVzIHRvIHV0aWxpdHkuYywgJmMuCisKK0RhbmllbCBKYWNvYm93aXR6IDxkYW5AZGViaWFuLm9yZz4KKyAgICBta3RlbXAuYworCitNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY211LmVkdT4KKyAgICBkb2N1bWVudGF0aW9uLCBidWdmaXhlcywgdGVzdCBzdWl0ZQorCitSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICAgIEJlY2FtZSBidXN5Ym94IG1haW50YWluZXIgaW4gMjAwNi4KKworICAgIHNlZCAobWFqb3IgcmV3cml0ZSBpbiAyMDAzLCBhbmQgSSBub3cgbWFpbnRhaW4gdGhlIHRoaW5nKQorICAgIGJ1bnppcDIgKGNvbXBsZXRlIGZyb20tc2NyYXRjaCByZXdyaXRlLCB0aGVuIG1qbjMgb3B0aW1pemVkIHRoZSByZXN1bHQpCisgICAgc29ydCAobW9yZSBvciBsZXNzIGZyb20gc2NyYXRjaCByZXdyaXRlIGluIDIwMDQsIEkgbm93IG1haW50YWluIGl0KQorICAgIG1vdW50IChyZXdyaXRlIGluIDIwMDUsIEkgbWFpbnRhaW4gdGhlIG5ldyBvbmUpCisKK1N0ZXBoYW4gTGlueiA8bGluekBsaS1wcm8ubmV0PgorICAgIGlwY2FsYywgUmVkIEhhdCBlcXVpdmFsZW5jZQorCitKb2huIExvbWJhcmRvIDxqb2huQGRlbHRhbmV0LmNvbT4KKyAgICB0cgorCitHbGVubiBNY0dyYXRoIDxnbGVubi5sLm1jZ3JhdGhAZ21haWwuY29tPgorICAgIENvbW1vbiB1bmFyY2hpdmluZyBjb2RlIGFuZCB1bmFyY2hpdmluZyBhcHBsZXRzLCBpZnVwZG93biwgZnRwZ2V0cHV0LAorICAgIG5hbWVpZiwgc2VkLCBwYXRjaCwgZm9sZCwgaW5zdGFsbCwgdXVkZWNvZGUuCisgICAgVmFyaW91cyBidWdmaXhlcywgcmV2aWV3IGFuZCBhcHBseSBudW1lcm91cyBwYXRjaGVzLgorCitNYW51ZWwgTm92b2EgSUlJIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAgICBjYXQsIGhlYWQsIG1rZmlmbywgbWtub2QsIHJtZGlyLCBzbGVlcCwgdGVlLCB0dHksIHVuaXEsIHVzbGVlcCwgd2MsIHllcywKKyAgICBtZXNnLCB2Y29uZmlnLCBuaWNlLCByZW5pY2UsCisgICAgbWFrZV9kaXJlY3RvcnksIHBhcnNlX21vZGUsIGRpcm5hbWUsIG1vZGVfc3RyaW5nLAorICAgIGdldF9sYXN0X3BhdGhfY29tcG9uZW50LCBzaW1wbGlmeV9wYXRoLCBhbmQgYSBudW1iZXIgdHJpdmlhbCBsaWJiYiByb3V0aW5lcworCisgICAgYWxzbyBidWcgZml4ZXMsIHBhcnRpYWwgcmV3cml0ZXMsIGFuZCBzaXplIG9wdGltaXphdGlvbnMgaW4KKyAgICBhc2gsIGJhc2VuYW1lLCBjYWwsIGNtcCwgY3AsIGRmLCBkdSwgZWNobywgZW52LCBsbiwgbG9nbmFtZSwgbWQ1c3VtLCBta2RpciwKKyAgICBtdiwgcmVhbHBhdGgsIHJtLCBzb3J0LCB0YWlsLCB0b3VjaCwgdW5hbWUsIHdhdGNoLCBhcml0aCwgaHVtYW5fcmVhZGFibGUsCisgICAgaW50ZXJmYWNlLCBkdXRtcCwgaWZjb25maWcsIHJvdXRlCisKK1ZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAgICBjbWRlZGl0OyBiYl9ta2RlcCwgeGFyZ3MoY3VycmVudCksIGh0dHBkKGN1cnJlbnQpOworICAgIHBvcnRzOiBhc2gsIGNyb25kLCBmZGlzayAoaW5pdGlhbCwgdW5tYWludGFpbmVkIG5vdyksIGluZXRkLCBzdHR5LCB0cmFjZXJvdXRlLAorICAgIHRvcDsKKyAgICBsb2NhbGUsIHZhcmlvdXMgZml4ZXMKKyAgICBhbmQgaXJyZWNvbmNpbGFibGUgY3JpdGljIG9mIGV2ZXJ5dGhpbmcgbm90IHBlcmZlY3QuCisKK0JydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPgorICAgIE9yaWdpbmFsIGF1dGhvciBvZiBCdXN5Qm94IGluIDE5OTUsIDE5OTYuIFNvbWUgb2YgaGlzIGNvZGUgY2FuCisgICAgc3RpbGwgYmUgZm91bmQgaGlkaW5nIGhlcmUgYW5kIHRoZXJlLi4uCisKK1JvZG5leSBSYWRmb3JkIDxycmFkZm9yZEBtaW5kc3ByaW5nLmNvbT4KKyAgICBpcGNzLCBpcGNybQorCitUaW0gUmlrZXIgPFRpbUBSaWtlcnMub3JnPgorICAgIGJ1ZyBmaXhlcywgbWVtYmVyIG9mIGZhbiBjbHViCisKK0tlbnQgUm9ib3R0aSA8cm9ib3R0aUBtZXRjb25uZWN0LmNvbT4KKyAgICByZXNldCwgdG9ucyBhbmQgdG9ucyBvZiBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcy4KKworQ2hpcCBSb3NlbnRoYWwgPGNoaXBAdW5pY29tLmNvbT4sIDxjcm9zZW50aEBjb3ZhZC5jb20+CisgICAgd2dldCAtIENvbnRyaWJ1dGVkIGJ5IHBlcm1pc3Npb24gb2YgQ292YWQgQ29tbXVuaWNhdGlvbnMKKworUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4KKyAgICBMb3RzIG9mIGJ1Z3MgZml4ZXMgYW5kIHBhdGNoZXMuCisKK0d5ZXBpIFNhbSA8Z3llcGlAcHJheGlzLXN3LmNvbT4KKyAgICBSZW1vdGUgbG9nZ2luZyBmZWF0dXJlIGZvciBzeXNsb2dkCisKK1JvYiBTdWxsaXZhbiA8Y29naXRvLmVyZ28uY29naXRvQGdtYWlsLmNvbT4KKyAgICBjb21tCisKK0xpbnVzIFRvcnZhbGRzCisgICAgbWtzd2FwLCBmc2NrLm1pbml4LCBta2ZzLm1pbml4CisKK01hcmsgV2hpdGxleSA8bWFya3dAY29kZXBvZXQub3JnPgorICAgIGdyZXAsIHNlZCwgY3V0LCB4YXJncyhwcmV2aW91cyksCisgICAgc3R5bGUtZ3VpZGUsIG5ldy1hcHBsZXQtSE9XVE8sIGJ1ZyBmaXhlcywgZXRjLgorCitDaGFybGVzIFAuIFdyaWdodCA8Y3B3cmlnaHRAdmlsbGFnZW5ldC5jb20+CisgICAgZ3ppcCwgbWluaS1uZXRjYXQobmMpCisKK0VucmlxdWUgWmFuYXJkaSA8ZXphbmFyZGlAdWxsLmVzPgorICAgIHRhcmNhdCAoc2luY2UgcmVtb3ZlZCksIGxvYWRrbWFwLCB2YXJpb3VzIGZpeGVzLCBEZWJpYW4gbWFpbnRlbmFuY2UKKworVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICAgIGRldmZzZCBhbmQgc2l6ZSBvcHRpbWl6YXRpb25zIGluIHN0cmluZ3MsIG9wZW52dCwgY2h2dCwgZGVhbGxvY3Z0LCBoZHBhcm0sCisgICAgZmRmb3JtYXQsIGxzYXR0ciwgY2hhdHRyLCBpZCBhbmQgZWplY3QuCisKK1BhdWwgRm94IDxwZ2ZAZm94aGFycC5ib3N0b24ubWEudXM+CisgICAgdmkgZWRpdGluZyBtb2RlIGZvciBhc2gsIHZhcmlvdXMgb3RoZXIgcGF0Y2hlcy9maXhlcworCitSb2JlcnRvIEEuIEZvZ2xpZXR0YSA8bWVAcm9iZXJ0by5mb2dsaWV0dGEubmFtZT4KKyAgICBwb3J0OiBkbnNkCisKK0Jlcm5oYXJkIFJldXRuZXItRmlzY2hlciA8cmVwLmRvdC5ub3BAZ21haWwuY29tPgorICAgIG1pc2MKKworTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorICAgIGluaXRpYWwgZTJmc3Byb2dzLCBwcmludGVudiwgc2V0YXJjaCwgc3VtLCBtaXNjCisKK0ppZSBaaGFuZyA8amllLnpoYW5nQGFuYWxvZy5jb20+CisgICAgZml4ZWQgdHdvIGJ1Z3MgaW4gbXNoIGFuZCBodXNoIChleGl0Y29kZSBvZiBraWxsZWQgcHJvY2Vzc2VzKQpkaWZmIC0tZ2l0IGEvQ29uZmlnLmluIGIvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzE4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9Db25maWcuaW4KQEAgLTAsMCArMSw3NzkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21haW5tZW51ICJCdXN5Qm94IENvbmZpZ3VyYXRpb24iCisKK2NvbmZpZyBIQVZFX0RPVF9DT05GSUcKKwlib29sCisJZGVmYXVsdCB5CisKK21lbnUgIkJ1c3lib3ggU2V0dGluZ3MiCisKK21lbnUgIkdlbmVyYWwgQ29uZmlndXJhdGlvbiIKKworY29uZmlnIERFU0tUT1AKKwlib29sICJFbmFibGUgb3B0aW9ucyBmb3IgZnVsbC1ibG93biBkZXNrdG9wIHN5c3RlbXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzIHdoaWNoIGFyZSBub3QgZXNzZW50aWFsLgorCSAgU2VsZWN0IHRoaXMgb25seSBpZiB5b3UgcGxhbiB0byB1c2UgYnVzeWJveCBvbiBmdWxsLWJsb3duCisJICBkZXNrdG9wIG1hY2hpbmUgd2l0aCBjb21tb24gTGludXggZGlzdHJvLCBub3Qgb24gYW4gZW1iZWRkZWQgYm94LgorCitjb25maWcgRVhUUkFfQ09NUEFUCisJYm9vbCAiUHJvdmlkZSBjb21wYXRpYmxlIGJlaGF2aW9yIGZvciByYXJlIGNvcm5lciBjYXNlcyAoYmlnZ2VyIGNvZGUpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIGdyZXAsIHNlZCBldGMgaGFuZGxlIHJhcmUgY29ybmVyIGNhc2VzCisJICAoZW1iZWRkZWQgTlVMIGJ5dGVzIGFuZCBzdWNoKS4gVGhpcyBtYWtlcyBjb2RlIGJpZ2dlciBhbmQgdXNlcworCSAgc29tZSBHTlUgZXh0ZW5zaW9ucyBpbiBsaWJjLiBZb3UgcHJvYmFibHkgb25seSBuZWVkIHRoaXMgb3B0aW9uCisJICBpZiB5b3UgcGxhbiB0byBydW4gYnVzeWJveCBvbiBkZXNrdG9wLgorCitjb25maWcgSU5DTFVERV9TVVN2MgorCWJvb2wgIkVuYWJsZSBvYnNvbGV0ZSBmZWF0dXJlcyByZW1vdmVkIGJlZm9yZSBTVVN2MyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFN1U3YyLAorCSAgc3BlY2lmaWNhbGx5LCBvbGQtc3R5bGUgbnVtZXJpYyBvcHRpb25zICgnY29tbWFuZCAtMSA8ZmlsZT4nKQorCSAgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gaGVhZCwgdGFpbCwgYW5kIGZvbGQuIChOb3RlOiBzaG91bGQKKwkgIGFmZmVjdCByZW5pY2UgdG9vLikKKworY29uZmlnIFVTRV9QT1JUQUJMRV9DT0RFCisJYm9vbCAiQXZvaWQgdXNpbmcgR0NDLXNwZWNpZmljIGNvZGUgY29uc3RydWN0cyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBVc2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSB0cnlpbmcgdG8gY29tcGlsZSBidXN5Ym94IHdpdGgKKwkgIGNvbXBpbGVyIG90aGVyIHRoYW4gZ2NjLgorCSAgSWYgeW91IGRvIHVzZSBnY2MsIHRoaXMgb3B0aW9uIG1heSBuZWVkbGVzc2x5IGluY3JlYXNlIGNvZGUgc2l6ZS4KKworY29uZmlnIFBMQVRGT1JNX0xJTlVYCisJYm9vbCAiRW5hYmxlIExpbnV4LXNwZWNpZmljIGFwcGxldHMgYW5kIGZlYXR1cmVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEZvciB0aGUgbW9zdCBwYXJ0LCBidXN5Ym94IHJlcXVpcmVzIG9ubHkgUE9TSVggY29tcGF0aWJpbGl0eQorCSAgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSwgYnV0IHNvbWUgYXBwbGV0cyBhbmQgZmVhdHVyZXMgdXNlCisJICBMaW51eC1zcGVjaWZpYyBpbnRlcmZhY2VzLgorCisJICBBbnN3ZXJpbmcgJ04nIGhlcmUgd2lsbCBkaXNhYmxlIHN1Y2ggYXBwbGV0cyBhbmQgaGlkZSB0aGUKKwkgIGNvcnJlc3BvbmRpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLgorCitjaG9pY2UKKwlwcm9tcHQgIkJ1ZmZlciBhbGxvY2F0aW9uIHBvbGljeSIKKwlkZWZhdWx0IEZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DCisJaGVscAorCSAgVGhlcmUgYXJlIDMgd2F5cyBCdXN5Qm94IGNhbiBoYW5kbGUgYnVmZmVyIGFsbG9jYXRpb25zOgorCSAgLSBVc2UgbWFsbG9jLiBUaGlzIGNvc3RzIGNvZGUgc2l6ZSBmb3IgdGhlIGNhbGwgdG8geG1hbGxvYy4KKwkgIC0gUHV0IHRoZW0gb24gc3RhY2suIEZvciBzb21lIHZlcnkgc21hbGwgbWFjaGluZXMgd2l0aCBsaW1pdGVkIHN0YWNrCisJICAgIHNwYWNlLCB0aGlzIGNhbiBiZSBkZWFkbHkuIEZvciBtb3N0IGZvbGtzLCB0aGlzIHdvcmtzIGp1c3QgZmluZS4KKwkgIC0gUHV0IHRoZW0gaW4gQlNTLiBUaGlzIHdvcmtzIGJlYXV0aWZ1bGx5IGZvciBjb21wdXRlcnMgd2l0aCBhIHJlYWwKKwkgICAgTU1VIChhbmQgT1Mgc3VwcG9ydCksIGJ1dCB3YXN0ZXMgcnVudGltZSBSQU0gZm9yIHVDTGludXguIFRoaXMKKwkgICAgYmVoYXZpb3Igd2FzIHRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIEJ1c3lCb3ggdmVyc2lvbnMgMC40OCBhbmQKKwkgICAgZWFybGllci4KKworY29uZmlnIEZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DCisJYm9vbCAiQWxsb2NhdGUgd2l0aCBNYWxsb2MiCisKK2NvbmZpZyBGRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sKKwlib29sICJBbGxvY2F0ZSBvbiB0aGUgU3RhY2siCisKK2NvbmZpZyBGRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTCisJYm9vbCAiQWxsb2NhdGUgaW4gdGhlIC5ic3Mgc2VjdGlvbiIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBTSE9XX1VTQUdFCisJYm9vbCAiU2hvdyB0ZXJzZSBhcHBsZXQgdXNhZ2UgbWVzc2FnZXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQWxsIEJ1c3lCb3ggYXBwbGV0cyB3aWxsIHNob3cgaGVscCBtZXNzYWdlcyB3aGVuIGludm9rZWQgd2l0aAorCSAgd3JvbmcgYXJndW1lbnRzLiBZb3UgY2FuIHR1cm4gb2ZmIHByaW50aW5nIHRoZXNlIHRlcnNlIHVzYWdlCisJICBtZXNzYWdlcyBpZiB5b3Ugc2F5IG5vIGhlcmUuCisJICBUaGlzIHdpbGwgc2F2ZSB5b3UgdXAgdG8gN2suCisKK2NvbmZpZyBGRUFUVVJFX1ZFUkJPU0VfVVNBR0UKKwlib29sICJTaG93IHZlcmJvc2UgYXBwbGV0IHVzYWdlIG1lc3NhZ2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0hPV19VU0FHRQorCWhlbHAKKwkgIEFsbCBCdXN5Qm94IGFwcGxldHMgd2lsbCBzaG93IG1vcmUgdmVyYm9zZSBoZWxwIG1lc3NhZ2VzIHdoZW4KKwkgIGJ1c3lib3ggaXMgaW52b2tlZCB3aXRoIC0taGVscC4gVGhpcyB3aWxsIGFkZCBhIGxvdCBvZiB0ZXh0IHRvIHRoZQorCSAgYnVzeWJveCBiaW5hcnkuIEluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHRoaXMgd2lsbCBhZGQgYWJvdXQKKwkgIDEzaywgYnV0IGl0IGNhbiBhZGQgbXVjaCBtb3JlIGRlcGVuZGluZyBvbiB5b3VyIGNvbmZpZ3VyYXRpb24uCisKK2NvbmZpZyBGRUFUVVJFX0NPTVBSRVNTX1VTQUdFCisJYm9vbCAiU3RvcmUgYXBwbGV0IHVzYWdlIG1lc3NhZ2VzIGluIGNvbXByZXNzZWQgZm9ybSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNIT1dfVVNBR0UKKwloZWxwCisJICBTdG9yZSB1c2FnZSBtZXNzYWdlcyBpbiBjb21wcmVzc2VkIGZvcm0sIHVuY29tcHJlc3MgdGhlbSBvbi10aGUtZmx5CisJICB3aGVuIDxhcHBsZXQ+IC0taGVscCBpcyBjYWxsZWQuCisKKwkgIElmIHlvdSBoYXZlIGEgcmVhbGx5IHRpbnkgYnVzeWJveCB3aXRoIGZldyBhcHBsZXRzIGVuYWJsZWQgKGFuZAorCSAgYnVuemlwMiBpc24ndCBvbmUgb2YgdGhlbSksIHRoZSBvdmVyaGVhZCBvZiB0aGUgZGVjb21wcmVzc29yIG1pZ2h0CisJICBiZSBub3RpY2VhYmxlLiBBbHNvLCBpZiB5b3UgcnVuIGV4ZWN1dGFibGVzIGRpcmVjdGx5IGZyb20gUk9NCisJICBhbmQgaGF2ZSB2ZXJ5IGxpdHRsZSBtZW1vcnksIHRoaXMgbWlnaHQgbm90IGJlIGEgd2luLiBPdGhlcndpc2UsCisJICB5b3UgcHJvYmFibHkgd2FudCB0aGlzLgorCitjb25maWcgRkVBVFVSRV9JTlNUQUxMRVIKKwlib29sICJTdXBwb3J0IC0taW5zdGFsbCBbLXNdIHRvIGluc3RhbGwgYXBwbGV0IGxpbmtzIGF0IHJ1bnRpbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlICdidXN5Ym94IC0taW5zdGFsbCBbLXNdJyBzdXBwb3J0LiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIHVzZQorCSAgYnVzeWJveCBhdCBydW50aW1lIHRvIGNyZWF0ZSBoYXJkIGxpbmtzIG9yIHN5bWxpbmtzIGZvciBhbGwgdGhlCisJICBhcHBsZXRzIHRoYXQgYXJlIGNvbXBpbGVkIGludG8gYnVzeWJveC4KKworY29uZmlnIElOU1RBTExfTk9fVVNSCisJYm9vbCAiRG9uJ3QgdXNlIC91c3IiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRGlzYWJsZSB1c2Ugb2YgL3Vzci4gYnVzeWJveCAtLWluc3RhbGwgYW5kICJtYWtlIGluc3RhbGwiCisJICB3aWxsIGluc3RhbGwgYXBwbGV0cyBvbmx5IHRvIC9iaW4gYW5kIC9zYmluLAorCSAgbmV2ZXIgdG8gL3Vzci9iaW4gb3IgL3Vzci9zYmluLgorCitjb25maWcgTE9DQUxFX1NVUFBPUlQKKwlib29sICJFbmFibGUgbG9jYWxlIHN1cHBvcnQgKHN5c3RlbSBuZWVkcyBsb2NhbGUgZm9yIHRoaXMgdG8gd29yaykiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGxvY2FsZSBzdXBwb3J0IGFuZCB5b3Ugd291bGQgbGlrZQorCSAgYnVzeWJveCB0byBzdXBwb3J0IGxvY2FsZSBzZXR0aW5ncy4KKworY29uZmlnIFVOSUNPREVfU1VQUE9SVAorCWJvb2wgIlN1cHBvcnQgVW5pY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG1ha2VzIHZhcmlvdXMgYXBwbGV0cyBhd2FyZSB0aGF0IG9uZSBieXRlIGlzIG5vdAorCSAgb25lIGNoYXJhY3RlciBvbiBzY3JlZW4uCisKKwkgIEJ1c3lib3ggYWltcyB0byBldmVudHVhbGx5IHdvcmsgY29ycmVjdGx5IHdpdGggVW5pY29kZSBkaXNwbGF5cy4KKwkgIEFueSBvbGRlciBlbmNvZGluZ3MgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsuCisJICBQcm9iYWJseSBieSB0aGUgdGltZSB3aGVuIGJ1c3lib3ggd2lsbCBiZSBmdWxseSBVbmljb2RlLWNsZWFuLAorCSAgb3RoZXIgZW5jb2RpbmdzIHdpbGwgYmUgbWFpbmx5IG9mIGhpc3RvcmljIGludGVyZXN0LgorCitjb25maWcgVU5JQ09ERV9VU0lOR19MT0NBTEUKKwlib29sICJVc2UgbGliYyByb3V0aW5lcyBmb3IgVW5pY29kZSAoZWxzZSB1c2VzIGludGVybmFsIG9uZXMpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVU5JQ09ERV9TVVBQT1JUICYmIExPQ0FMRV9TVVBQT1JUCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgVW5pY29kZSBzdXBwb3J0IGlzIGltcGxlbWVudGVkIHVzaW5nIGxpYmMKKwkgIHJvdXRpbmVzLiBPdGhlcndpc2UsIGludGVybmFsIGltcGxlbWVudGF0aW9uIGlzIHVzZWQuCisJICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBpcyBzbWFsbGVyLgorCitjb25maWcgRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOVgorCWJvb2wgIkNoZWNrICRMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVU5JQ09ERV9TVVBQT1JUICYmICFVTklDT0RFX1VTSU5HX0xPQ0FMRQorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIFVuaWNvZGUgc3VwcG9ydCBpcyBhY3RpdmF0ZWQKKwkgIG9ubHkgaWYgTEFORyB2YXJpYWJsZSBoYXMgdGhlIHZhbHVlIG9mIHRoZSBmb3JtICJ4eHh4LnV0ZjgiCisKKwkgIE90aGVyd2lzZSwgVW5pY29kZSBzdXBwb3J0IHdpbGwgYmUgYWx3YXlzIGVuYWJsZWQgYW5kIGFjdGl2ZS4KKworY29uZmlnIFNVQlNUX1dDSEFSCisJaW50ICJDaGFyYWN0ZXIgY29kZSB0byBzdWJzdGl0dXRlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgd2l0aCIKKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWRlZmF1bHQgNjMKKwloZWxwCisJICBUeXBpY2FsIHZhbHVlcyBhcmUgNjMgZm9yICc/JyAod29ya3Mgd2l0aCBhbnkgb3V0cHV0IGRldmljZSksCisJICAzMCBmb3IgQVNDSUkgc3Vic3RpdHV0ZSBjb250cm9sIGNvZGUsCisJICA2NTUzMyAoMHhmZmZkKSBmb3IgVW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuCisKK2NvbmZpZyBMQVNUX1NVUFBPUlRFRF9XQ0hBUgorCWludCAiUmFuZ2Ugb2Ygc3VwcG9ydGVkIFVuaWNvZGUgY2hhcmFjdGVycyIKKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWRlZmF1bHQgNzY3CisJaGVscAorCSAgQW55IGNoYXJhY3RlciB3aXRoIFVuaWNvZGUgdmFsdWUgYmlnZ2VyIHRoYW4gdGhpcyBpcyBhc3N1bWVkCisJICB0byBiZSBub24tcHJpbnRhYmxlIG9uIG91dHB1dCBkZXZpY2UuIE1hbnkgYXBwbGV0cyByZXBsYWNlCisJICBzdWNoIGNoYXJzIHdpdGggc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4KKworCSAgVGhlIGlkZWEgaXMgdGhhdCBtYW55IHZhbGlkIHByaW50YWJsZSBVbmljb2RlIGNoYXJzIGFyZQorCSAgbmV2ZXJ0aGVsZXNzIGFyZSBub3QgZGlzcGxheWVkIGNvcnJlY3RseS4gVGhpbmsgYWJvdXQKKwkgIGNvbWJpbmluZyBjaGFyYWNoZXJzLCBkb3VibGUtd2lkZSBoaWVyb2dseXBocywgb2JzY3VyZQorCSAgY2hhcmFjdGVycyBpbiBkb3plbnMgb2YgYW5jaWVudCBzY3JpcHRzLi4uCisJICBNYW55IHRlcm1pbmFscywgdGVybWluYWwgZW11bGF0b3JzLCB4dGVybXMgZXRjIHdpbGwgZmFpbAorCSAgdG8gaGFuZGxlIHRoZW0gY29ycmVjdGx5LiBDaG9vc2UgdGhlIHNtYWxsZXN0IHZhbHVlCisJICB3aGljaCBzdWl0cyB5b3VyIG5lZWRzLgorCisJICBUeXBpY2FsIHZhbHVlcyBhcmU6CisJICAxMjYgLSBBU0NJSSBvbmx5CisJICA3NjcgKDB4MmZmKSAtIHRoZXJlIGFyZSBubyBjb21iaW5pbmcgY2hhcnMgaW4gWzAuLjc2N10gcmFuZ2UKKwkJCSh0aGUgcmFuZ2UgaW5jbHVkZXMgTGF0aW4gMSwgTGF0aW4gRXh0LiBBIGFuZCBCKSwKKwkJCWNvZGUgaXMgfjcwMCBieXRlcyBzbWFsbGVyIGZvciB0aGlzIGNhc2UuCisJICA0MzUxICgweDEwZmYpIC0gdGhlcmUgYXJlIG5vIGRvdWJsZS13aWRlIGNoYXJzIGluIFswLi40MzUxXSByYW5nZSwKKwkJCWNvZGUgaXMgfjMwMCBieXRlcyBzbWFsbGVyIGZvciB0aGlzIGNhc2UuCisJICAxMjc5OSAoMHgzMWZmKSAtIG5lYXJseSBhbGwgbm9uLWlkZW9ncmFwaGljIGNoYXJhY3RlcnMgYXJlCisJCQlhdmFpbGFibGUgaW4gWzAuLjEyNzk5XSByYW5nZSwgaW5jbHVkaW5nCisJCQlFYXN0IEFzaWFuIHNjcmlwdHMgbGlrZSBrYXRha2FuYSwgaGlyYWdhbmEsIGhhbmd1bCwKKwkJCWJvcG9tb2ZvLi4uCisJICAwIC0gb2ZmLCBhbnkgdmFsaWQgcHJpbnRhYmxlIFVuaWNvZGUgY2hhcmFjdGVyIHdpbGwgYmUgcHJpbnRlZC4KKworY29uZmlnIFVOSUNPREVfQ09NQklOSU5HX1dDSEFSUworCWJvb2wgIkFsbG93IHplcm8td2lkdGggVW5pY29kZSBjaGFyYWN0ZXJzIG9uIG91dHB1dCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb2ZmLCBhbnkgVW5pY29kZSBjaGFyIHdpdGggd2lkdGggb2YgMAorCSAgaXMgc3Vic3RpdHV0ZWQgb24gb3V0cHV0LgorCitjb25maWcgVU5JQ09ERV9XSURFX1dDSEFSUworCWJvb2wgIkFsbG93IHdpZGUgVW5pY29kZSBjaGFyYWN0ZXJzIG9uIG91dHB1dCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb2ZmLCBhbnkgVW5pY29kZSBjaGFyIHdpdGggd2lkdGggPiAxCisJICBpcyBzdWJzdGl0dXRlZCBvbiBvdXRwdXQuCisKK2NvbmZpZyBVTklDT0RFX0JJRElfU1VQUE9SVAorCWJvb2wgIkJpZGlyZWN0aW9uYWwgY2hhcmFjdGVyLWF3YXJlIGxpbmUgaW5wdXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQgJiYgIVVOSUNPREVfVVNJTkdfTE9DQUxFCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgcmlnaHQtdG8tbGVmdCBVbmljb2RlIGNoYXJhY3RlcnMKKwkgIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IG9uIGlucHV0IChlLmcuIGN1cnNvciBtb3ZlbWVudCkuCisKK2NvbmZpZyBVTklDT0RFX05FVVRSQUxfVEFCTEUKKwlib29sICJJbiBiaWRpIGlucHV0LCBzdXBwb3J0IG5vbi1BU0NJSSBuZXV0cmFsIGNoYXJzIHRvbyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfQklESV9TVVBQT1JUCisJaGVscAorCSAgSW4gbW9zdCBjYXNlcyBpdCdzIGVub3VnaCB0byB0cmVhdCBvbmx5IEFTQ0lJIG5vbi1sZXR0ZXJzCisJICAoaS5lLiBwdW5jdHVhdGlvbiwgbnVtYmVycyBhbmQgc3BhY2UpIGFzIGNoYXJhY3RlcnMKKwkgIHdpdGggbmV1dHJhbCBkaXJlY3Rpb25hbGl0eS4KKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIG1vcmUgZXh0ZW5zaXZlIChhbmQgYmlnZ2VyKSB0YWJsZQorCSAgb2YgbmV1dHJhbCBjaGFycyB3aWxsIGJlIHVzZWQuCisKK2NvbmZpZyBVTklDT0RFX1BSRVNFUlZFX0JST0tFTgorCWJvb2wgIk1ha2UgaXQgcG9zc2libGUgdG8gZW50ZXIgc2VxdWVuY2VzIG9mIGNoYXJzIHdoaWNoIGFyZSBub3QgVW5pY29kZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIG9uIGxpbmUtZWRpdGluZyBpbnB1dCAoc3VjaCBhcyB1c2VkIGJ5IHNoZWxscykKKwkgIGludmFsaWQgVVRGLTggYnl0ZXMgYXJlIG5vdCBzdWJzdGl0dXRlZCB3aXRoIHRoZSBzZWxlY3RlZAorCSAgc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4KKwkgIEZvciBleGFtcGxlLCB0aGlzIG1lYW5zIHRoYXQgZW50ZXJpbmcgJ2wnLCAncycsICcgJywgMHhmZiwgW0VudGVyXQorCSAgYXQgc2hlbGwgcHJvbXB0IHdpbGwgbGlzdCBmaWxlIG5hbWVkIDB4ZmYgKHNpbmdsZSBjaGFyIG5hbWUKKwkgIHdpdGggY2hhciB2YWx1ZSAyNTUpLCBub3QgZmlsZSBuYW1lZCAnPycuCisKK2NvbmZpZyBMT05HX09QVFMKKwlib29sICJTdXBwb3J0IGZvciAtLWxvbmctb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCBidXN5Ym94IGFwcGxldHMgdG8gdXNlIHRoZSBnbnUgLS1sb25nLW9wdGlvbgorCSAgc3R5bGUsIGluIGFkZGl0aW9uIHRvIHNpbmdsZSBjaGFyYWN0ZXIgLWEgLWIgLWMgc3R5bGUgb3B0aW9ucy4KKworY29uZmlnIEZFQVRVUkVfREVWUFRTCisJYm9vbCAiVXNlIHRoZSBkZXZwdHMgZmlsZXN5c3RlbSBmb3IgVW5peDk4IFBUWXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIGlmIHlvdSB3YW50IEJ1c3lCb3ggdG8gdXNlIFVuaXg5OCBQVFkgc3VwcG9ydC4gSWYgZW5hYmxlZCwKKwkgIGJ1c3lib3ggd2lsbCB1c2UgL2Rldi9wdG14IGZvciB0aGUgbWFzdGVyIHNpZGUgb2YgdGhlIHBzZXVkb3Rlcm1pbmFsCisJICBhbmQgL2Rldi9wdHMvPG51bWJlcj4gZm9yIHRoZSBzbGF2ZSBzaWRlLiBPdGhlcndpc2UsIEJTRCBzdHlsZQorCSAgL2Rldi90dHlwPG51bWJlcj4gd2lsbCBiZSB1c2VkLiBUbyB1c2UgdGhpcyBvcHRpb24sIHlvdSBzaG91bGQgaGF2ZQorCSAgZGV2cHRzIG1vdW50ZWQuCisKK2NvbmZpZyBGRUFUVVJFX0NMRUFOX1VQCisJYm9vbCAiQ2xlYW4gdXAgYWxsIG1lbW9yeSBiZWZvcmUgZXhpdGluZyAodXN1YWxseSBub3QgbmVlZGVkKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBBcyBhIHNpemUgb3B0aW1pemF0aW9uLCBidXN5Ym94IG5vcm1hbGx5IGV4aXRzIHdpdGhvdXQgZXhwbGljaXRseQorCSAgZnJlZWluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5IG9yIGNsb3NpbmcgZmlsZXMuIFRoaXMgc2F2ZXMKKwkgIHNwYWNlIHNpbmNlIHRoZSBPUyB3aWxsIGNsZWFuIHVwIGZvciB1cywgYnV0IGl0IGNhbiBjb25mdXNlIGRlYnVnZ2VycworCSAgbGlrZSB2YWxncmluZCwgd2hpY2ggcmVwb3J0IHRvbnMgb2YgbWVtb3J5IGFuZCByZXNvdXJjZSBsZWFrcy4KKworCSAgRG9uJ3QgZW5hYmxlIHRoaXMgdW5sZXNzIHlvdSBoYXZlIGEgcmVhbGx5IGdvb2QgcmVhc29uIHRvIGNsZWFuCisJICB0aGluZ3MgdXAgbWFudWFsbHkuCisKK2NvbmZpZyBGRUFUVVJFX1VUTVAKKwlib29sICJTdXBwb3J0IHV0bXAgZmlsZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgZmlsZSAvdmFyL3J1bi91dG1wIGlzIHVzZWQgdG8gdHJhY2sgd2hvIGlzIGN1cnJlbnRseSBsb2dnZWQgaW4uCisJICBXaXRoIHRoaXMgb3B0aW9uIG9uLCBjZXJ0YWluIGFwcGxldHMgKGdldHR5LCBsb2dpbiwgdGVsbmV0ZCBldGMpCisJICB3aWxsIGNyZWF0ZSBhbmQgZGVsZXRlIGVudHJpZXMgdGhlcmUuCisJICAid2hvIiBhcHBsZXQgcmVxdWlyZXMgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX1dUTVAKKwlib29sICJTdXBwb3J0IHd0bXAgZmlsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfVVRNUAorCWhlbHAKKwkgIFRoZSBmaWxlIC92YXIvcnVuL3d0bXAgaXMgdXNlZCB0byB0cmFjayB3aGVuIHVzZXJzIGhhdmUgbG9nZ2VkIGludG8KKwkgIGFuZCBsb2dnZWQgb3V0IG9mIHRoZSBzeXN0ZW0uCisJICBXaXRoIHRoaXMgb3B0aW9uIG9uLCBjZXJ0YWluIGFwcGxldHMgKGdldHR5LCBsb2dpbiwgdGVsbmV0ZCBldGMpCisJICB3aWxsIGFwcGVuZCBuZXcgZW50cmllcyB0aGVyZS4KKwkgICJsYXN0IiBhcHBsZXQgcmVxdWlyZXMgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX1BJREZJTEUKKwlib29sICJTdXBwb3J0IHdyaXRpbmcgcGlkZmlsZXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gbWFrZXMgc29tZSBhcHBsZXRzIChlLmcuIGNyb25kLCBzeXNsb2dkLCBpbmV0ZCkgd3JpdGUKKwkgIGEgcGlkZmlsZSBpbiAvdmFyL3J1bi4gU29tZSBhcHBsaWNhdGlvbnMgcmVseSBvbiB0aGVtLgorCitjb25maWcgRkVBVFVSRV9TVUlECisJYm9vbCAiU3VwcG9ydCBmb3IgU1VJRC9TR0lEIGhhbmRsaW5nIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24geW91IGNhbiBpbnN0YWxsIHRoZSBidXN5Ym94IGJpbmFyeSBiZWxvbmdpbmcKKwkgIHRvIHJvb3Qgd2l0aCB0aGUgc3VpZCBiaXQgc2V0LCBlbmFibGluZyBzb21lIGFwcGxldHMgdG8gcGVyZm9ybQorCSAgcm9vdC1sZXZlbCBvcGVyYXRpb25zIGV2ZW4gd2hlbiBydW4gYnkgb3JkaW5hcnkgdXNlcnMKKwkgIChmb3IgZXhhbXBsZSwgbW91bnRpbmcgb2YgdXNlciBtb3VudHMgaW4gZnN0YWIgbmVlZHMgdGhpcykuCisKKwkgIEJ1c3lib3ggd2lsbCBhdXRvbWF0aWNhbGx5IGRyb3AgcHJpdmlsZWRnZXMgZm9yIGFwcGxldHMKKwkgIHRoYXQgZG9uJ3QgbmVlZCByb290IGFjY2Vzcy4KKworCSAgSWYgeW91IGFyZSByZWFsbHkgcGFyYW5vaWQgYW5kIGRvbid0IHdhbnQgdG8gZG8gdGhpcywgYnVpbGQgdHdvCisJICBidXN5Ym94IGJpbmFyaWVzIHdpdGggZGlmZmVyZW50IGFwcGxldHMgaW4gdGhlbSAoYW5kIHRoZSBhcHByb3ByaWF0ZQorCSAgc3ltbGlua3MgcG9pbnRpbmcgdG8gZWFjaCBiaW5hcnkpLCBhbmQgb25seSBzZXQgdGhlIHN1aWQgYml0IG9uIHRoZQorCSAgb25lIHRoYXQgbmVlZHMgaXQuCisKKwkgIFRoZSBhcHBsZXRzIHdoaWNoIHJlcXVpcmUgcm9vdCByaWdodHMgKG5lZWQgc3VpZCBiaXQgb3IKKwkgIHRvIGJlIHJ1biBieSByb290KSBhbmQgd2lsbCByZWZ1c2UgdG8gZXhlY3V0ZSBvdGhlcndpc2U6CisJICBjcm9udGFiLCBsb2dpbiwgcGFzc3dkLCBzdSwgdmxvY2ssIHdhbGwuCisKKwkgIFRoZSBhcHBsZXRzIHdoaWNoIHdpbGwgdXNlIHJvb3QgcmlnaHRzIGlmIHRoZXkgaGF2ZSB0aGVtCisJICAodmlhIHN1aWQgYml0LCBvciBiZWNhdXNlIHJ1biBieSByb290KSwgYnV0IHdvdWxkIHRyeSB0byB3b3JrCisJICB3aXRob3V0IHJvb3QgcmlnaHQgbmV2ZXJ0aGVsZXNzOgorCSAgZmluZGZzLCBwaW5nWzZdLCB0cmFjZXJvdXRlWzZdLCBtb3VudC4KKworCSAgTm90ZSB0aGF0IGlmIHlvdSBET05UIHNlbGVjdCB0aGlzIG9wdGlvbiwgYnV0IERPIG1ha2UgYnVzeWJveAorCSAgc3VpZCByb290LCBBTEwgYXBwbGV0cyB3aWxsIHJ1biB1bmRlciByb290LCB3aGljaCBpcyBhIGh1Z2UKKwkgIHNlY3VyaXR5IGhvbGUgKHRoaW5rICJjcCAvc29tZS9maWxlIC9ldGMvcGFzc3dkIikuCisKK2NvbmZpZyBGRUFUVVJFX1NVSURfQ09ORklHCisJYm9vbCAiUnVudGltZSBTVUlEL1NHSUQgY29uZmlndXJhdGlvbiB2aWEgL2V0Yy9idXN5Ym94LmNvbmYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1NVSUQKKwloZWxwCisJICBBbGxvdyB0aGUgU1VJRCAvIFNHSUQgc3RhdGUgb2YgYW4gYXBwbGV0IHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQorCSAgYnkgY2hlY2tpbmcgL2V0Yy9idXN5Ym94LmNvbmYuIChUaGlzIGlzIHNvcnQgb2YgYSBwb29yIG1hbidzIHN1ZG8uKQorCSAgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgYXMgZm9sbG93czoKKworCSAgQVBQTEVUID0gW1NzeC1dW1NzeC1dW3gtXSBbVVNFUi5HUk9VUF0KKworCSAgczogVVNFUiBvciBHUk9VUCBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgQVBQTEVULgorCSAgICAgQVBQTEVUIHdpbGwgcnVuIHVuZGVyIFVTRVIgb3IgR1JPVVAKKwkgICAgIChyZWFnYXJkbGVzcyBvZiB3aG8ncyBydW5uaW5nIGl0KS4KKwkgIFM6IFVTRVIgb3IgR1JPVVAgaXMgTk9UIGFsbG93ZWQgdG8gZXhlY3V0ZSBBUFBMRVQuCisJICAgICBBUFBMRVQgd2lsbCBydW4gdW5kZXIgVVNFUiBvciBHUk9VUC4KKwkgICAgIFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHNlbnNpY2FsLgorCSAgeDogVVNFUi9HUk9VUC9vdGhlcnMgYXJlIGFsbG93ZWQgdG8gZXhlY3V0ZSBBUFBMRVQuCisJICAgICBObyBVSUQvR0lEIGNoYW5nZSB3aWxsIGJlIGRvbmUgd2hlbiBpdCBpcyBydW4uCisJICAtOiBVU0VSL0dST1VQL290aGVycyBhcmUgbm90IGFsbG93ZWQgdG8gZXhlY3V0ZSBBUFBMRVQuCisKKwkgIEFuIGV4YW1wbGUgbWlnaHQgaGVscDoKKworCSAgW1NVSURdCisJICBzdSA9IHNzeCByb290LjAgIyBhcHBsZXQgc3UgY2FuIGJlIHJ1biBieSBhbnlvbmUgYW5kIHJ1bnMgd2l0aAorCSAgICAgICAgICAgICAgICAgICMgZXVpZD0wL2VnaWQ9MAorCSAgc3UgPSBzc3ggICAgICAgICMgZXhhY3RseSB0aGUgc2FtZQorCisJICBtb3VudCA9IHN4LSByb290LmRpc2sgIyBhcHBsZXQgbW91bnQgY2FuIGJlIHJ1biBieSByb290IGFuZCBtZW1iZXJzCisJICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiBncm91cCBkaXNrIChidXQgbm90IGFueW9uZSBlbHNlKQorCSAgICAgICAgICAgICAgICAgICAgICAgICMgYW5kIHJ1bnMgd2l0aCBldWlkPTAgKGVnaWQgaXMgbm90IGNoYW5nZWQpCisKKwkgIGNwID0gLS0tICMgZGlzYWJsZSBhcHBsZXQgY3AgZm9yIGV2ZXJ5b25lCisKKwkgIFRoZSBmaWxlIGhhcyB0byBiZSBvd25lZCBieSB1c2VyIHJvb3QsIGdyb3VwIHJvb3QgYW5kIGhhcyB0byBiZQorCSAgd3JpdGVhYmxlIG9ubHkgYnkgcm9vdDoKKwkgICAgICAgIChjaG93biAwLjAgL2V0Yy9idXN5Ym94LmNvbmY7IGNobW9kIDYwMCAvZXRjL2J1c3lib3guY29uZikKKwkgIFRoZSBidXN5Ym94IGV4ZWN1dGFibGUgaGFzIHRvIGJlIG93bmVkIGJ5IHVzZXIgcm9vdCwgZ3JvdXAKKwkgIHJvb3QgYW5kIGhhcyB0byBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyB0byB3b3JrOgorCSAgICAgICAgKGNob3duIDAuMCAvYmluL2J1c3lib3g7IGNobW9kIDQ3NTUgL2Jpbi9idXN5Ym94KQorCisJICBSb2JlcnQgJ3NhbmRtYW4nIEdyaWVibCBoYXMgbW9yZSBpbmZvcm1hdGlvbiBoZXJlOgorCSAgPHVybDogaHR0cDovL3d3dy5zb2Z0Zm9yZ2UuZGUvYmIvc3VpZC5odG1sID4uCisKK2NvbmZpZyBGRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUCisJYm9vbCAiU3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlIGlmIC9ldGMvYnVzeWJveC5jb25mIGlzIG5vdCByZWFkYWJsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfU1VJRF9DT05GSUcKKwloZWxwCisJICAvZXRjL2J1c3lib3guY29uZiBzaG91bGQgYmUgcmVhZGFibGUgYnkgdGhlIHVzZXIgbmVlZGluZyB0aGUgU1VJRCwKKwkgIGNoZWNrIHRoaXMgb3B0aW9uIHRvIGF2b2lkIHVzZXJzIHRvIGJlIG5vdGlmaWVkIGFib3V0IG1pc3NpbmcKKwkgIHBlcm1pc3Npb25zLgorCitjb25maWcgU0VMSU5VWAorCWJvb2wgIlN1cHBvcnQgTlNBIFNlY3VyaXR5IEVuaGFuY2VkIExpbnV4IgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBTRUxpbnV4IGluIGFwcGxldHMgbHMsIHBzLCBhbmQgaWQuIEFsc28gcHJvdmlkZQorCSAgdGhlIG9wdGlvbiBvZiBjb21waWxpbmcgaW4gU0VMaW51eCBhcHBsZXRzLgorCisJICBJZiB5b3UgZG8gbm90IGhhdmUgYSBjb21wbGV0ZSBTRUxpbnV4IHVzZXJsYW5kIGluc3RhbGxlZCwgdGhpcyBzdHVmZgorCSAgd2lsbCBub3QgY29tcGlsZS4gR28gdmlzaXQKKwkJaHR0cDovL3d3dy5uc2EuZ292L3NlbGludXgvaW5kZXguaHRtbAorCSAgdG8gZG93bmxvYWQgdGhlIG5lY2Vzc2FyeSBzdHVmZiB0byBhbGxvdyBidXN5Ym94IHRvIGNvbXBpbGUgd2l0aAorCSAgdGhpcyBvcHRpb24gZW5hYmxlZC4gU3BlY2lmaWFsbHksIGxpYnNlbGludXggMS4yOCBvciBiZXR0ZXIgaXMKKwkgIGRpcmVjdGx5IHJlcXVpcmVkIGJ5IGJ1c3lib3guIElmIHRoZSBpbnN0YWxsYXRpb24gaXMgbG9jYXRlZCBpbiBhCisJICBub24tc3RhbmRhcmQgZGlyZWN0b3J5LCBwcm92aWRlIGl0IGJ5IGludm9raW5nIG1ha2UgYXMgZm9sbG93czoKKwkJQ0ZMQUdTPS1JPGxpYnNlbGludXgtaW5jbHVkZS1wYXRoPiBcCisJCUxERkxBR1M9LUw8bGlic2VsaW51eC1saWItcGF0aD4gXAorCQltYWtlCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgbGVhdmUgdGhpcyBzZXQgdG8gJ04nLgorCitjb25maWcgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworCWJvb2wgImV4ZWMgcHJlZmVycyBhcHBsZXRzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIG9wdGlvbiB3aGljaCBkaXJlY3RzIGFwcGxldHMgYWJvdXQgdG8KKwkgIGNhbGwgJ2V4ZWMnIHRvIHRyeSBhbmQgZmluZCBhbiBhcHBsaWNhYmxlIGJ1c3lib3ggYXBwbGV0IGJlZm9yZQorCSAgc2VhcmNoaW5nIHRoZSBQQVRILiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGJ5IGV4ZWMnaW5nCisJICAvcHJvYy9zZWxmL2V4ZS4KKwkgIFRoaXMgbWF5IGFmZmVjdCBzaGVsbCwgZmluZCAtZXhlYywgeGFyZ3MgYW5kIHNpbWlsYXIgYXBwbGV0cy4KKwkgIFRoZXkgd2lsbCB1c2UgYXBwbGV0cyBldmVuIGlmIC9iaW4vPGFwcGxldD4gLT4gYnVzeWJveCBsaW5rCisJICBpcyBtaXNzaW5nIChvciBpcyBub3QgYSBsaW5rIHRvIGJ1c3lib3gpLiBIb3dldmVyLCB0aGlzIGNhdXNlcworCSAgcHJvYmxlbXMgaW4gY2hyb290IGphaWxzIHdpdGhvdXQgbW91bnRlZCAvcHJvYyBhbmQgd2l0aCBwcy90b3AKKwkgIChjb21tYW5kIG5hbWUgY2FuIGJlIHNob3duIGFzICdleGUnIGZvciBhcHBsZXRzIHN0YXJ0ZWQgdGhpcyB3YXkpLgorCitjb25maWcgQlVTWUJPWF9FWEVDX1BBVEgKKwlzdHJpbmcgIlBhdGggdG8gQnVzeUJveCBleGVjdXRhYmxlIgorCWRlZmF1bHQgIi9wcm9jL3NlbGYvZXhlIgorCWhlbHAKKwkgIFdoZW4gQnVzeWJveCBhcHBsZXRzIG5lZWQgdG8gcnVuIG90aGVyIGJ1c3lib3ggYXBwbGV0cywgQnVzeUJveAorCSAgc29tZXRpbWVzIG5lZWRzIHRvIGV4ZWMoKSBpdHNlbGYuIFdoZW4gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gaXMKKwkgIG1vdW50ZWQsIC9wcm9jL3NlbGYvZXhlIGFsd2F5cyBwb2ludHMgdG8gdGhlIGN1cnJlbnRseSBydW5uaW5nCisJICBleGVjdXRhYmxlLiBJZiB5b3UgaGF2ZW4ndCBnb3QgL3Byb2MsIHNldCB0aGlzIHRvIHdoZXJldmVyIHlvdQorCSAgd2FudCB0byBydW4gQnVzeUJveCBmcm9tLgorCisjIFRoZXNlIGFyZSBhdXRvLXNlbGVjdGVkIGJ5IG90aGVyIG9wdGlvbnMKKworY29uZmlnIEZFQVRVUkVfU1lTTE9HCisJYm9vbCAjTm8gZGVzY3JpcHRpb24gbWFrZXMgaXQgYSBoaWRkZW4gb3B0aW9uCisJZGVmYXVsdCBuCisJI2hlbHAKKwkjICBUaGlzIG9wdGlvbiBpcyBhdXRvLXNlbGVjdGVkIHdoZW4geW91IHNlbGVjdCBhbnkgYXBwbGV0IHdoaWNoIG1heQorCSMgIHNlbmQgaXRzIG91dHB1dCB0byBzeXNsb2cuIFlvdSBkbyBub3QgbmVlZCB0byBzZWxlY3QgaXQgbWFudWFsbHkuCisKK2NvbmZpZyBGRUFUVVJFX0hBVkVfUlBDCisJYm9vbCAjTm8gZGVzY3JpcHRpb24gbWFrZXMgaXQgYSBoaWRkZW4gb3B0aW9uCisJZGVmYXVsdCBuCisJI2hlbHAKKwkjICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgaWYgYW55IG9mIGVuYWJsZWQgYXBwbGV0cyBuZWVkIGl0LgorCSMgIFlvdSBkbyBub3QgbmVlZCB0byBzZWxlY3QgaXQgbWFudWFsbHkuCisKK2VuZG1lbnUKKworbWVudSAnQnVpbGQgT3B0aW9ucycKKworY29uZmlnIFNUQVRJQworCWJvb2wgIkJ1aWxkIEJ1c3lCb3ggYXMgYSBzdGF0aWMgYmluYXJ5IChubyBzaGFyZWQgbGlicykiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gYnVpbGQgYSBzdGF0aWMgQnVzeUJveCBiaW5hcnksIHdoaWNoIGRvZXMgbm90CisJICB1c2Ugb3IgcmVxdWlyZSBhbnkgc2hhcmVkIGxpYnJhcmllcywgdGhlbiBlbmFibGUgdGhpcyBvcHRpb24uCisJICBUaGlzIGNhbiBjYXVzZSBCdXN5Qm94IHRvIGJlIGNvbnNpZGVyYWJseSBsYXJnZXIsIHNvIHlvdSBzaG91bGQKKwkgIGxlYXZlIHRoaXMgb3B0aW9uIGZhbHNlIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uIChpLmUuCisJICB5b3VyIHRhcmdldCBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMsIG9yCisJICB5b3UgYXJlIGJ1aWxkaW5nIGFuIGluaXRyZCB3aGljaCBkb2Vzbid0IG5lZWQgYW55dGhpbmcgYnV0CisJICBCdXN5Qm94LCBldGMpLgorCisJICBNb3N0IHBlb3BsZSB3aWxsIGxlYXZlIHRoaXMgc2V0IHRvICdOJy4KKworY29uZmlnIFBJRQorCWJvb2wgIkJ1aWxkIEJ1c3lCb3ggYXMgYSBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIVNUQVRJQworCWhlbHAKKwkgIEhhcmRlbmVkIGNvZGUgb3B0aW9uLiBQSUUgYmluYXJpZXMgYXJlIGxvYWRlZCBhdCBhIGRpZmZlcmVudAorCSAgYWRkcmVzcyBhdCBlYWNoIGludm9jYXRpb24uIFRoaXMgaGFzIHNvbWUgb3ZlcmhlYWQsCisJICBwYXJ0aWN1bGFybHkgb24geDg2LTMyIHdoaWNoIGlzIHNob3J0IG9uIHJlZ2lzdGVycy4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBsZWF2ZSB0aGlzIHNldCB0byAnTicuCisKK2NvbmZpZyBOT01NVQorCWJvb2wgIkZvcmNlIE5PTU1VIGJ1aWxkIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEJ1c3lib3ggdHJpZXMgdG8gZGV0ZWN0IHdoZXRoZXIgYXJjaGl0ZWN0dXJlIGl0IGlzIGJlaW5nCisJICBidWlsdCBhZ2FpbnN0IHN1cHBvcnRzIE1NVSBvciBub3QuIElmIHRoaXMgZGV0ZWN0aW9uIGZhaWxzLAorCSAgb3IgaWYgeW91IHdhbnQgdG8gYnVpbGQgTk9NTVUgdmVyc2lvbiBvZiBidXN5Ym94IGZvciB0ZXN0aW5nLAorCSAgeW91IG1heSBmb3JjZSBOT01NVSBidWlsZCBoZXJlLgorCisJICBNb3N0IHBlb3BsZSB3aWxsIGxlYXZlIHRoaXMgc2V0IHRvICdOJy4KKworIyBQSUUgY2FuIGJlIG1hZGUgdG8gd29yayB3aXRoIEJVSUxEX0xJQkJVU1lCT1gsIGJ1dCBjdXJyZW50bHkKKyMgYnVpbGQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhhdAorY29uZmlnIEJVSUxEX0xJQkJVU1lCT1gKKwlib29sICJCdWlsZCBzaGFyZWQgbGliYnVzeWJveCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFGRUFUVVJFX1BSRUZFUl9BUFBMRVRTICYmICFQSUUgJiYgIVNUQVRJQworCWhlbHAKKwkgIEJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgbGliYnVzeWJveC5zby5OLk4uTiB3aGljaCBjb250YWlucyBhbGwKKwkgIGJ1c3lib3ggY29kZS4KKworCSAgVGhpcyBmZWF0dXJlIGFsbG93cyBldmVyeSBhcHBsZXQgdG8gYmUgYnVpbHQgYXMgYSB0aW55CisJICBzZXBhcmF0ZSBleGVjdXRhYmxlLiBFbmFibGluZyBpdCBmb3IgIm9uZSBiaWcgYnVzeWJveCBiaW5hcnkiCisJICBhcHByb2FjaCBzZXJ2ZXMgbm8gcHVycG9zZSBhbmQgaW5jcmVhc2VzIGNvZGUgc2l6ZS4KKwkgIFlvdSBzaG91bGQgYWxtb3N0IGNlcnRhaW5seSBzYXkgIm5vIiB0byB0aGlzLgorCisjIyMgY29uZmlnIEZFQVRVUkVfRlVMTF9MSUJCVVNZQk9YCisjIyMJYm9vbCAiRmVhdHVyZS1jb21wbGV0ZSBsaWJidXN5Ym94IgorIyMjCWRlZmF1bHQgbiBpZiAhRkVBVFVSRV9TSEFSRURfQlVTWUJPWAorIyMjCWRlcGVuZHMgb24gQlVJTERfTElCQlVTWUJPWAorIyMjCWhlbHAKKyMjIwkgIEJ1aWxkIGEgbGliYnVzeWJveCB3aXRoIHRoZSBjb21wbGV0ZSBmZWF0dXJlLXNldCwgZGlzcmVnYXJkaW5nCisjIyMJICB0aGUgYWN0dWFsbHkgc2VsZWN0ZWQgY29uZmlnLgorIyMjCisjIyMJICBOb3JtYWxseSwgbGliYnVzeWJveCB3aWxsIG9ubHkgY29udGFpbiB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlCisjIyMJICB1c2VkIGJ5IGJ1c3lib3ggaXRzZWxmLiBJZiB5b3UgcGxhbiB0byB3cml0ZSBhIHNlcGFyYXRlCisjIyMJICBzdGFuZGFsb25lIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbGliYnVzeWJveCBzYXkgJ1knLgorIyMjCisjIyMJICBOb3RlOiBsaWJidXN5Ym94IGlzIEdQTCwgbm90IExHUEwsIGFuZCBleHBvcnRzIG5vIHN0YWJsZSBBUEkgdGhhdAorIyMjCSAgbWlnaHQgYWN0IGFzIGEgY29weXJpZ2h0IGJhcnJpZXIuIFdlIGNhbiBhbmQgd2lsbCBtb2RpZnkgdGhlCisjIyMJICBleHBvcnRlZCBmdW5jdGlvbiBzZXQgYmV0d2VlbiByZWxlYXNlcyAoZXZlbiBtaW5vciB2ZXJzaW9uIG51bWJlcgorIyMjCSAgY2hhbmdlcyksIGFuZCBoYXBwaWx5IGJyZWFrIG91dC1vZi10cmVlIGZlYXR1cmVzLgorIyMjCisjIyMJICBTYXkgJ04nIGlmIGluIGRvdWJ0LgorCitjb25maWcgRkVBVFVSRV9JTkRJVklEVUFMCisJYm9vbCAiUHJvZHVjZSBhIGJpbmFyeSBmb3IgZWFjaCBhcHBsZXQsIGxpbmtlZCBhZ2FpbnN0IGxpYmJ1c3lib3giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCVUlMRF9MSUJCVVNZQk9YCisJaGVscAorCSAgSWYgeW91ciBDUFUgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgYWxsb3cgZm9yIHNoYXJpbmcgdGV4dC9yb2RhdGEKKwkgIHNlY3Rpb25zIG9mIHJ1bm5pbmcgYmluYXJpZXMsIGJ1dCBhbGxvd3MgZm9yIHJ1bnRpbWUgZHluYW1pYworCSAgbGlicmFyaWVzLCB0aGlzIG9wdGlvbiB3aWxsIGFsbG93IHlvdSB0byByZWR1Y2UgbWVtb3J5IGZvb3RwcmludAorCSAgd2hlbiB5b3UgaGF2ZSBtYW55IGRpZmZlcmVudCBhcHBsZXRzIHJ1bm5pbmcgYXQgb25jZS4KKworCSAgSWYgeW91ciBDUFUgYXJjaGl0ZWN0dXJlIGFsbG93cyBmb3Igc2hhcmluZyB0ZXh0L3JvZGF0YSwKKwkgIGhhdmluZyBzaW5nbGUgYmluYXJ5IGlzIG1vcmUgb3B0aW1hbC4KKworCSAgRWFjaCBhcHBsZXQgd2lsbCBiZSBhIHRpbnkgcHJvZ3JhbSwgZHluYW1pY2FsbHkgbGlua2VkCisJICBhZ2FpbnN0IGxpYmJ1c3lib3guc28uTi5OLk4uCisKKwkgIFlvdSBuZWVkIHRvIGhhdmUgYSB3b3JraW5nIGR5bmFtaWMgbGlua2VyLgorCitjb25maWcgRkVBVFVSRV9TSEFSRURfQlVTWUJPWAorCWJvb2wgIlByb2R1Y2UgYWRkaXRpb25hbCBidXN5Ym94IGJpbmFyeSBsaW5rZWQgYWdhaW5zdCBsaWJidXN5Ym94IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlVJTERfTElCQlVTWUJPWAorCWhlbHAKKwkgIEJ1aWxkIGJ1c3lib3gsIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYmJ1c3lib3guc28uTi5OLk4uCisKKwkgIFlvdSBuZWVkIHRvIGhhdmUgYSB3b3JraW5nIGR5bmFtaWMgbGlua2VyLgorCisjIyMgY29uZmlnIEJVSUxEX0FUX09OQ0UKKyMjIwlib29sICJDb21waWxlIGFsbCBzb3VyY2VzIGF0IG9uY2UiCisjIyMJZGVmYXVsdCBuCisjIyMJaGVscAorIyMjCSAgTm9ybWFsbHkgZWFjaCBzb3VyY2UtZmlsZSBpcyBjb21waWxlZCB3aXRoIG9uZSBpbnZvY2F0aW9uIG9mCisjIyMJICB0aGUgY29tcGlsZXIuCisjIyMJICBJZiB5b3Ugc2V0IHRoaXMgb3B0aW9uLCBhbGwgc291cmNlcyBhcmUgY29tcGlsZWQgYXQgb25jZS4KKyMjIwkgIFRoaXMgZ2l2ZXMgdGhlIGNvbXBpbGVyIG1vcmUgb3Bwb3J0dW5pdGllcyB0byBvcHRpbWl6ZSB3aGljaCBjYW4KKyMjIwkgIHJlc3VsdCBpbiBzbWFsbGVyIGFuZC9vciBmYXN0ZXIgYmluYXJpZXMuCisjIyMKKyMjIwkgIFNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBjb25zdW1lIGFsb3Qgb2YgbWVtb3J5LCBlLmcuIGlmIHlvdQorIyMjCSAgZW5hYmxlIGFsbCBhcHBsZXRzIHdpdGggYWxsIGZlYXR1cmVzLCBnY2MgdXNlcyBtb3JlIHRoYW4gMzAwTUIKKyMjIwkgIFJBTSBkdXJpbmcgY29tcGlsYXRpb24gb2YgYnVzeWJveC4KKyMjIworIyMjCSAgVGhpcyBvcHRpb24gaXMgbW9zdCBsaWtlbHkgb25seSBiZW5lZmljaWFsIGZvciBuZXdlciBjb21waWxlcnMKKyMjIwkgIHN1Y2ggYXMgZ2NjLTQuMSBhbmQgYWJvdmUuCisjIyMKKyMjIwkgIFNheSAnTicgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKworY29uZmlnIExGUworCWJvb2wgIkJ1aWxkIHdpdGggTGFyZ2UgRmlsZSBTdXBwb3J0IChmb3IgYWNjZXNzaW5nIGZpbGVzID4gMiBHQikiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gYnVpbGQgQnVzeUJveCB3aXRoIGxhcmdlIGZpbGUgc3VwcG9ydCwgdGhlbiBlbmFibGUKKwkgIHRoaXMgb3B0aW9uLiBUaGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QgaWYgeW91ciBrZXJuZWwgb3IgeW91ciBDCisJICBsaWJyYXJ5IGxhY2tzIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZXMuIFNvbWUgb2YgdGhlCisJICBwcm9ncmFtcyB0aGF0IGNhbiBiZW5lZml0IGZyb20gbGFyZ2UgZmlsZSBzdXBwb3J0IGluY2x1ZGUgZGQsIGd6aXAsCisJICBjcCwgbW91bnQsIHRhciwgYW5kIG1hbnkgb3RoZXJzLiBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgZmlsZXMgbGFyZ2VyCisJICB0aGFuIDIgR2lnYWJ5dGVzLCBlbmFibGUgdGhpcyBvcHRpb24uIE90aGVyd2lzZSwgbGVhdmUgaXQgc2V0IHRvICdOJy4KKworY29uZmlnIENST1NTX0NPTVBJTEVSX1BSRUZJWAorCXN0cmluZyAiQ3Jvc3MgQ29tcGlsZXIgcHJlZml4IgorCWRlZmF1bHQgIiIKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBidWlsZCBCdXN5Qm94IHdpdGggYSBjcm9zcyBjb21waWxlciwgdGhlbiB5b3UKKwkgIHdpbGwgbmVlZCB0byBzZXQgdGhpcyB0byB0aGUgY3Jvc3MtY29tcGlsZXIgcHJlZml4LCBmb3IgZXhhbXBsZSwKKwkgICJpMzg2LXVjbGliYy0iLgorCisJICBOb3RlIHRoYXQgQ1JPU1NfQ09NUElMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvcgorCSAgIm1ha2UgQ1JPU1NfQ09NUElMRT14eHggLi4uIiB3aWxsIG92ZXJyaWRlIHRoaXMgc2VsZWN0aW9uLgorCisJICBOYXRpdmUgYnVpbGRzIGxlYXZlIHRoaXMgZW1wdHkuCisKK2NvbmZpZyBFWFRSQV9DRkxBR1MKKwlzdHJpbmcgIkFkZGl0aW9uYWwgQ0ZMQUdTIgorCWRlZmF1bHQgIiIKKwloZWxwCisJICBBZGRpdGlvbmFsIENGTEFHUyB0byBwYXNzIHRvIHRoZSBjb21waWxlciB2ZXJiYXRpbS4KKworZW5kbWVudQorCittZW51ICdEZWJ1Z2dpbmcgT3B0aW9ucycKKworY29uZmlnIERFQlVHCisJYm9vbCAiQnVpbGQgQnVzeUJveCB3aXRoIGV4dHJhIERlYnVnZ2luZyBzeW1ib2xzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdpc2ggdG8gZXhhbWluZSBCdXN5Qm94IGludGVybmFscyB3aGlsZSBhcHBsZXRzIGFyZQorCSAgcnVubmluZy4gVGhpcyBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGJpbmFyeSBjb25zaWRlcmFibHksIGFuZAorCSAgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGRvaW5nIGRldmVsb3BtZW50LiBJZiB5b3UgYXJlIGRvaW5nCisJICBkZXZlbG9wbWVudCBhbmQgd2FudCB0byBkZWJ1ZyBCdXN5Qm94LCBhbnN3ZXIgWS4KKworCSAgTW9zdCBwZW9wbGUgc2hvdWxkIGFuc3dlciBOLgorCitjb25maWcgREVCVUdfUEVTU0lNSVpFCisJYm9vbCAiRGlzYWJsZSBjb21waWxlciBvcHRpbWl6YXRpb25zIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gREVCVUcKKwloZWxwCisJICBUaGUgY29tcGlsZXIncyBvcHRpbWl6YXRpb24gb2Ygc291cmNlIGNvZGUgY2FuIGVsaW1pbmF0ZSBhbmQgcmVvcmRlcgorCSAgY29kZSwgcmVzdWx0aW5nIGluIGFuIGV4ZWN1dGFibGUgdGhhdCdzIGhhcmQgdG8gdW5kZXJzdGFuZCB3aGVuCisJICBzdGVwcGluZyB0aHJvdWdoIGl0IHdpdGggYSBkZWJ1Z2dlci4gVGhpcyBzd2l0Y2hlcyBpdCBvZmYsIHJlc3VsdGluZworCSAgaW4gYSBtdWNoIGJpZ2dlciBleGVjdXRhYmxlIHRoYXQgbW9yZSBjbG9zZWx5IG1hdGNoZXMgdGhlIHNvdXJjZQorCSAgY29kZS4KKworY29uZmlnIFdFUlJPUgorCWJvb2wgIkFib3J0IGNvbXBpbGF0aW9uIG9uIGFueSB3YXJuaW5nIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIHdpbGwgYWRkIC1XZXJyb3IgdG8gZ2NjIGNvbW1hbmQgbGluZS4KKworCSAgTW9zdCBwZW9wbGUgc2hvdWxkIGFuc3dlciBOLgorCitjaG9pY2UKKwlwcm9tcHQgIkFkZGl0aW9uYWwgZGVidWdnaW5nIGxpYnJhcnkiCisJZGVmYXVsdCBOT19ERUJVR19MSUIKKwloZWxwCisJICBVc2luZyBhbiBhZGRpdGlvbmFsIGRlYnVnZ2luZyBsaWJyYXJ5IHdpbGwgbWFrZSBCdXN5Qm94IGJlY29tZQorCSAgY29uc2lkZXJhYmxlIGxhcmdlciBhbmQgd2lsbCBjYXVzZSBpdCB0byBydW4gbW9yZSBzbG93bHkuIFlvdQorCSAgc2hvdWxkIGFsd2F5cyBsZWF2ZSB0aGlzIG9wdGlvbiBkaXNhYmxlZCBmb3IgcHJvZHVjdGlvbiB1c2UuCisKKwkgIGRtYWxsb2Mgc3VwcG9ydDoKKwkgIC0tLS0tLS0tLS0tLS0tLS0KKwkgIFRoaXMgZW5hYmxlcyBjb21waWxpbmcgd2l0aCBkbWFsbG9jICggaHR0cDovL2RtYWxsb2MuY29tLyApCisJICB3aGljaCBpcyBhbiBleGNlbGxlbnQgcHVibGljIGRvbWFpbiBtZW0gbGVhayBhbmQgbWFsbG9jIHByb2JsZW0KKwkgIGRldGVjdG9yLiBUbyBlbmFibGUgZG1hbGxvYywgYmVmb3JlIHJ1bm5pbmcgYnVzeWJveCB5b3Ugd2lsbAorCSAgd2FudCB0byBwcm9wZXJseSBzZXQgeW91ciBlbnZpcm9ubWVudCwgZm9yIGV4YW1wbGU6CisJICAgIGV4cG9ydCBETUFMTE9DX09QVElPTlM9ZGVidWc9MHgzNGY0N2Q4MyxpbnRlcj0xMDAsbG9nPWxvZ2ZpbGUKKwkgIFRoZSAnZGVidWc9JyB2YWx1ZSBpcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kCisJICAgIGRtYWxsb2MgLXAgbG9nLXN0YXRzIC1wIGxvZy1ub24tZnJlZSAtcCBsb2ctYmFkLXNwYWNlIFwKKwkgICAgICAgLXAgbG9nLWVsYXBzZWQtdGltZSAtcCBjaGVjay1mZW5jZSAtcCBjaGVjay1oZWFwIFwKKwkgICAgICAgLXAgY2hlY2stbGlzdHMgLXAgY2hlY2stYmxhbmsgLXAgY2hlY2stZnVuY3MgLXAgcmVhbGxvYy1jb3B5IFwKKwkgICAgICAgLXAgYWxsb3ctZnJlZS1udWxsCisKKwkgIEVsZWN0cmljLWZlbmNlIHN1cHBvcnQ6CisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgVGhpcyBlbmFibGVzIGNvbXBpbGluZyB3aXRoIEVsZWN0cmljLWZlbmNlIHN1cHBvcnQuIEVsZWN0cmljCisJICBmZW5jZSBpcyBhbm90aGVyIHZlcnkgdXNlZnVsIG1hbGxvYyBkZWJ1Z2dpbmcgbGlicmFyeSB3aGljaCB1c2VzCisJICB5b3VyIGNvbXB1dGVyJ3MgdmlydHVhbCBtZW1vcnkgaGFyZHdhcmUgdG8gZGV0ZWN0IGlsbGVnYWwgbWVtb3J5CisJICBhY2Nlc3Nlcy4gVGhpcyBzdXBwb3J0IHdpbGwgbWFrZSBCdXN5Qm94IGJlIGNvbnNpZGVyYWJsZSBsYXJnZXIKKwkgIGFuZCBydW4gc2xvd2VyLCBzbyB5b3Ugc2hvdWxkIGxlYXZlIHRoaXMgb3B0aW9uIGRpc2FibGVkIHVubGVzcworCSAgeW91IGFyZSBodW50aW5nIGEgaGFyZCB0byBmaW5kIG1lbW9yeSBwcm9ibGVtLgorCisKK2NvbmZpZyBOT19ERUJVR19MSUIKKwlib29sICJOb25lIgorCitjb25maWcgRE1BTExPQworCWJvb2wgIkRtYWxsb2MiCisKK2NvbmZpZyBFRkVOQ0UKKwlib29sICJFbGVjdHJpYy1mZW5jZSIKKworZW5kY2hvaWNlCisKK2VuZG1lbnUKKworbWVudSAnSW5zdGFsbGF0aW9uIE9wdGlvbnMgKCJtYWtlIGluc3RhbGwiIGJlaGF2aW9yKScKKworY2hvaWNlCisJcHJvbXB0ICJXaGF0IGtpbmQgb2YgYXBwbGV0IGxpbmtzIHRvIGluc3RhbGwiCisJZGVmYXVsdCBJTlNUQUxMX0FQUExFVF9TWU1MSU5LUworCWhlbHAKKwkgIENob29zZSB3aGF0IGtpbmQgb2YgbGlua3MgdG8gYXBwbGV0cyBhcmUgY3JlYXRlZCBieSAibWFrZSBpbnN0YWxsIi4KKworY29uZmlnIElOU1RBTExfQVBQTEVUX1NZTUxJTktTCisJYm9vbCAiYXMgc29mdC1saW5rcyIKKwloZWxwCisJICBJbnN0YWxsIGFwcGxldHMgYXMgc29mdC1saW5rcyB0byB0aGUgYnVzeWJveCBiaW5hcnkuIFRoaXMgbmVlZHMgc29tZQorCSAgZnJlZSBpbm9kZXMgb24gdGhlIGZpbGVzeXN0ZW0sIGJ1dCBtaWdodCBoZWxwIHdpdGggZmlsZXN5c3RlbQorCSAgZ2VuZXJhdG9ycyB0aGF0IGNhbid0IGNvcGUgd2l0aCBoYXJkLWxpbmtzLgorCitjb25maWcgSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTCisJYm9vbCAiYXMgaGFyZC1saW5rcyIKKwloZWxwCisJICBJbnN0YWxsIGFwcGxldHMgYXMgaGFyZC1saW5rcyB0byB0aGUgYnVzeWJveCBiaW5hcnkuIFRoaXMgbWlnaHQKKwkgIGNvdW50IG9uIGEgZmlsZXN5c3RlbSB3aXRoIGZldyBpbm9kZXMuCisKK2NvbmZpZyBJTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMKKwlib29sICJhcyBzY3JpcHQgd3JhcHBlcnMiCisJaGVscAorCSAgSW5zdGFsbCBhcHBsZXRzIGFzIHNjcmlwdCB3cmFwcGVycyB0aGF0IGNhbGwgdGhlIGJ1c3lib3ggYmluYXJ5LgorCitjb25maWcgSU5TVEFMTF9BUFBMRVRfRE9OVAorCWJvb2wgIm5vdCBpbnN0YWxsZWQiCisJaGVscAorCSAgRG8gbm90IGluc3RhbGwgYXBwbGV0IGxpbmtzLiBVc2VmdWwgd2hlbiB5b3UgcGxhbiB0byB1c2UKKwkgIGJ1c3lib3ggLS1pbnN0YWxsIGZvciBpbnN0YWxsaW5nIGxpbmtzLCBvciBwbGFuIHRvIHVzZQorCSAgYSBzdGFuZGFsb25lIHNoZWxsIGFuZCB0aHVzIGRvbid0IG5lZWQgYXBwbGV0IGxpbmtzLgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICIvYmluL3NoIGFwcGxldCBsaW5rIgorCWRlZmF1bHQgSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSworCWRlcGVuZHMgb24gSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTCisJaGVscAorCSAgQ2hvb3NlIGhvdyB5b3UgaW5zdGFsbCAvYmluL3NoIGFwcGxldCBsaW5rLgorCitjb25maWcgSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSworCWJvb2wgImFzIHNvZnQtbGluayIKKwloZWxwCisJICBJbnN0YWxsIC9iaW4vc2ggYXBwbGV0IGFzIHNvZnQtbGluayB0byB0aGUgYnVzeWJveCBiaW5hcnkuCisKK2NvbmZpZyBJTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSworCWJvb2wgImFzIGhhcmQtbGluayIKKwloZWxwCisJICBJbnN0YWxsIC9iaW4vc2ggYXBwbGV0IGFzIGhhcmQtbGluayB0byB0aGUgYnVzeWJveCBiaW5hcnkuCisKK2NvbmZpZyBJTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUgorCWJvb2wgImFzIHNjcmlwdCB3cmFwcGVyIgorCWhlbHAKKwkgIEluc3RhbGwgL2Jpbi9zaCBhcHBsZXQgYXMgc2NyaXB0IHdyYXBwZXIgdGhhdCBjYWxscworCSAgdGhlIGJ1c3lib3ggYmluYXJ5LgorCitlbmRjaG9pY2UKKworY29uZmlnIFBSRUZJWAorCXN0cmluZyAiQnVzeUJveCBpbnN0YWxsYXRpb24gcHJlZml4IgorCWRlZmF1bHQgIi4vX2luc3RhbGwiCisJaGVscAorCSAgRGVmaW5lIHlvdXIgZGlyZWN0b3J5IHRvIGluc3RhbGwgQnVzeUJveCBmaWxlcy9zdWJkaXJzIGluLgorCitlbmRtZW51CisKK3NvdXJjZSBsaWJiYi9Db25maWcuaW4KKworZW5kbWVudQorCitjb21tZW50ICJBcHBsZXRzIgorCitzb3VyY2UgYXJjaGl2YWwvQ29uZmlnLmluCitzb3VyY2UgY29yZXV0aWxzL0NvbmZpZy5pbgorc291cmNlIGNvbnNvbGUtdG9vbHMvQ29uZmlnLmluCitzb3VyY2UgZGViaWFudXRpbHMvQ29uZmlnLmluCitzb3VyY2UgZWRpdG9ycy9Db25maWcuaW4KK3NvdXJjZSBmaW5kdXRpbHMvQ29uZmlnLmluCitzb3VyY2UgaW5pdC9Db25maWcuaW4KK3NvdXJjZSBsb2dpbnV0aWxzL0NvbmZpZy5pbgorc291cmNlIGUyZnNwcm9ncy9Db25maWcuaW4KK3NvdXJjZSBtb2R1dGlscy9Db25maWcuaW4KK3NvdXJjZSB1dGlsLWxpbnV4L0NvbmZpZy5pbgorc291cmNlIG1pc2N1dGlscy9Db25maWcuaW4KK3NvdXJjZSBuZXR3b3JraW5nL0NvbmZpZy5pbgorc291cmNlIHByaW50dXRpbHMvQ29uZmlnLmluCitzb3VyY2UgbWFpbHV0aWxzL0NvbmZpZy5pbgorc291cmNlIHByb2Nwcy9Db25maWcuaW4KK3NvdXJjZSBydW5pdC9Db25maWcuaW4KK3NvdXJjZSBzZWxpbnV4L0NvbmZpZy5pbgorc291cmNlIHNoZWxsL0NvbmZpZy5pbgorc291cmNlIHN5c2tsb2dkL0NvbmZpZy5pbgpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzZTVmYgotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwKQEAgLTAsMCArMSwxMzkgQEAKK0J1aWxkaW5nOgorPT09PT09PT09CisKK1RoZSBCdXN5Qm94IGJ1aWxkIHByb2Nlc3MgaXMgc2ltaWxhciB0byB0aGUgTGludXgga2VybmVsIGJ1aWxkOgorCisgIG1ha2UgbWVudWNvbmZpZyAgICAgIyBUaGlzIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCAiLmNvbmZpZyIKKyAgbWFrZSAgICAgICAgICAgICAgICAjIFRoaXMgY3JlYXRlcyB0aGUgImJ1c3lib3giIGV4ZWN1dGFibGUKKyAgbWFrZSBpbnN0YWxsICAgICAgICAjIG9yIG1ha2UgQ09ORklHX1BSRUZJWD0vcGF0aC9mcm9tL3Jvb3QgaW5zdGFsbAorCitUaGUgZnVsbCBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gYW5kIGluc3RhbGwgb3B0aW9ucyBpcyBhdmFpbGFibGUgYnkgdHlwaW5nOgorCisgIG1ha2UgaGVscAorCitRdWljayBTdGFydDoKKz09PT09PT09PT09PQorCitUaGUgZWFzeSB3YXkgdG8gdHJ5IG91dCBCdXN5Qm94IGZvciB0aGUgZmlyc3QgdGltZSwgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFsbAoraXQsIGlzIHRvIGVuYWJsZSBhbGwgZmVhdHVyZXMgYW5kIHRoZW4gdXNlICJzdGFuZGFsb25lIHNoZWxsIiBtb2RlIHdpdGggYQorYmxhbmsgY29tbWFuZCAkUEFUSC4KKworVG8gZW5hYmxlIGFsbCBmZWF0dXJlcywgdXNlICJtYWtlIGRlZmNvbmZpZyIsIHdoaWNoIHByb2R1Y2VzIHRoZSBsYXJnZXN0CitnZW5lcmFsLXB1cnBvc2UgY29uZmlndXJhdGlvbi4gIEl0J3MgYWxseWVzY29uZmlnIG1pbnVzIGRlYnVnZ2luZyBvcHRpb25zLAorb3B0aW9uYWwgcGFja2FnaW5nIGNob2ljZXMsIGFuZCBhIGZldyBzcGVjaWFsLXB1cnBvc2UgZmVhdHVyZXMgcmVxdWlyaW5nCitleHRyYSBjb25maWd1cmF0aW9uIHRvIHVzZS4gIFRoZW4gZW5hYmxlICJzdGFuZGFsb25lIHNoZWxsIiBmZWF0dXJlOgorCisgIG1ha2UgZGVmY29uZmlnCisgIG1ha2UgbWVudWNvbmZpZworICAjIHNlbGVjdCBCdXN5Ym94IFNldHRpbmdzCisgICMgICB0aGVuIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorICAjICAgICB0aGVuIGV4ZWMgcHJlZmVycyBhcHBsZXRzCisgICMgICBleGl0IGJhY2sgdG8gdG9wIGxldmVsIG1lbnUKKyAgIyAgIHNlbGVjdCBTaGVsbHMKKyAgIyAgICAgdGhlbiBTdGFuZGFsb25lIHNoZWxsCisgICMgICBleGl0IGJhY2sgdG8gdG9wIGxldmVsIG1lbnUKKyAgIyBleGl0IGFuZCBzYXZlIG5ldyBjb25maWd1cmF0aW9uCisgICMgICBPUgorICAjIHVzZSB0aGVzZSBjb21tYW5kcyB0byBtb2RpZnkgLmNvbmZpZyBkaXJlY3RseToKKyAgc2VkIC1lICdzLy4qRkVBVFVSRV9QUkVGRVJfQVBQTEVUUy4qL0NPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTPXkvJyAtaSAuY29uZmlnCisgIHNlZCAtZSAncy8uKkZFQVRVUkVfU0hfU1RBTkRBTE9ORS4qL0NPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkU9eS8nIC1pIC5jb25maWcKKyAgbWFrZQorICBQQVRIPSAuL2J1c3lib3ggYXNoCisKK1N0YW5kYWxvbmUgc2hlbGwgbW9kZSBjYXVzZXMgYnVzeWJveCdzIGJ1aWx0LWluIGNvbW1hbmQgc2hlbGwgdG8gcnVuCithbnkgYnVpbHQtaW4gYnVzeWJveCBhcHBsZXRzIGRpcmVjdGx5LCB3aXRob3V0IGxvb2tpbmcgZm9yIGV4dGVybmFsCitwcm9ncmFtcyBieSB0aGF0IG5hbWUuICBTdXBwbHlpbmcgYW4gZW1wdHkgY29tbWFuZCBwYXRoIChhcyBhYm92ZSkgbWVhbnMKK3RoZSBvbmx5IGNvbW1hbmRzIGJ1c3lib3ggY2FuIGZpbmQgYXJlIHRoZSBidWlsdC1pbiBvbmVzLgorCitOb3RlIHRoYXQgdGhlIHN0YW5kYWxvbmUgc2hlbGwgcmVxdWlyZXMgQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRICit0byBiZSBzZXQgYXBwcm9wcmlhdGVseSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IC9wcm9jL3NlbGYvZXhlIGlzCithdmFpbGFibGUgb3Igbm90LiBJZiB5b3UgZG8gbm90IGhhdmUgL3Byb2MsIHRoZW4gcG9pbnQgdGhhdCBjb25maWcgb3B0aW9uCit0byB0aGUgbG9jYXRpb24gb2YgeW91ciBidXN5Ym94IGJpbmFyeSwgdXN1YWxseSAvYmluL2J1c3lib3guCisKK0NvbmZpZ3VyaW5nIEJ1c3lib3g6Cis9PT09PT09PT09PT09PT09PT09PQorCitCdXN5Ym94IGlzIG9wdGltaXplZCBmb3Igc2l6ZSwgYnV0IGVuYWJsaW5nIHRoZSBmdWxsIHNldCBvZiBmdW5jdGlvbmFsaXR5CitzdGlsbCByZXN1bHRzIGluIGEgZmFpcmx5IGxhcmdlIGV4ZWN1dGFibGUgLS0gbW9yZSB0aGFuIDEgbWVnYWJ5dGUgd2hlbgorc3RhdGljYWxseSBsaW5rZWQuICBUbyBzYXZlIHNwYWNlLCBidXN5Ym94IGNhbiBiZSBjb25maWd1cmVkIHdpdGggb25seSB0aGUKK3NldCBvZiBhcHBsZXRzIG5lZWRlZCBmb3IgZWFjaCBlbnZpcm9ubWVudC4gIFRoZSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24sIHdpdGgKK2FsbCBhcHBsZXRzIGRpc2FibGVkLCBwcm9kdWNlcyBhIDRrIGV4ZWN1dGFibGUuICAoSXQncyB1c2VsZXNzLCBidXQgdmVyeSBzbWFsbC4pCisKK1RoZSBtYW51YWwgY29uZmlndXJhdG9yICJtYWtlIG1lbnVjb25maWciIG1vZGlmaWVzIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLgorKEZvciBzeXN0ZW1zIHdpdGhvdXQgbmN1cnNlcywgdHJ5ICJtYWtlIGNvbmZpZyIgaW5zdGVhZC4pIFRoZSB0d28gbW9zdAoraW50ZXJlc3Rpbmcgc3RhcnRpbmcgY29uZmlndXJhdGlvbnMgYXJlICJtYWtlIGFsbG5vY29uZmlnIiAodG8gc3RhcnQgd2l0aAorZXZlcnl0aGluZyBkaXNhYmxlZCBhbmQgYWRkIGp1c3Qgd2hhdCB5b3UgbmVlZCksIGFuZCAibWFrZSBkZWZjb25maWciICh0bworc3RhcnQgd2l0aCBldmVyeXRoaW5nIGVuYWJsZWQgYW5kIHJlbW92ZSB3aGF0IHlvdSBkb24ndCBuZWVkKS4gIElmIG1lbnVjb25maWcKK2lzIHJ1biB3aXRob3V0IGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24sIG1ha2UgZGVmY29uZmlnIHdpbGwgcnVuIGZpcnN0IHRvCitjcmVhdGUgYSBrbm93biBzdGFydGluZyBwb2ludC4KKworT3RoZXIgc3RhcnRpbmcgY29uZmlndXJhdGlvbnMgKG1vc3RseSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzKSBpbmNsdWRlCisibWFrZSBhbGxiYXJlY29uZmlnIiAoZW5hYmxlcyBhbGwgYXBwbGV0cyBidXQgZGlzYWJsZXMgYWxsIG9wdGlvbmFsIGZlYXR1cmVzKSwKKyJtYWtlIGFsbHllc2NvbmZpZyIgKGVuYWJsZXMgYWJzb2x1dGVseSBldmVyeXRoaW5nIGluY2x1ZGluZyBkZWJ1ZyBmZWF0dXJlcyksCithbmQgIm1ha2UgcmFuZGNvbmZpZyIgKHByb2R1Y2UgYSByYW5kb20gY29uZmlndXJhdGlvbikuICBUaGUgY29uZmlncy8gZGlyZWN0b3J5Citjb250YWlucyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgZW5kaW5nIGluIF9kZWZjb25maWcgd2hpY2gKK2FyZSB1c2VmdWwgaW4gc3BlY2lmaWMgY2FzZXMuICAibWFrZSBoZWxwIiB3aWxsIGxpc3QgdGhlbS4KKworQ29uZmlndXJpbmcgQnVzeUJveCBwcm9kdWNlcyBhIGZpbGUgIi5jb25maWciLCB3aGljaCBjYW4gYmUgc2F2ZWQgZm9yIGZ1dHVyZQordXNlLiAgUnVuICJtYWtlIG9sZGNvbmZpZyIgdG8gYnJpbmcgYSAuY29uZmlnIGZpbGUgZnJvbSBhbiBvbGRlciB2ZXJzaW9uIG9mCitidXN5Ym94IHVwIHRvIGRhdGUuCisKK0luc3RhbGxpbmcgQnVzeWJveDoKKz09PT09PT09PT09PT09PT09PT0KKworQnVzeWJveCBpcyBhIHNpbmdsZSBleGVjdXRhYmxlIHRoYXQgY2FuIGJlaGF2ZSBsaWtlIG1hbnkgZGlmZmVyZW50IGNvbW1hbmRzLAorYW5kIEJ1c3lCb3ggdXNlcyB0aGUgbmFtZSBpdCB3YXMgaW52b2tlZCB1bmRlciB0byBkZXRlcm1pbmUgdGhlIGRlc2lyZWQKK2JlaGF2aW9yLiAgKFRyeSAibXYgYnVzeWJveCBscyIgYW5kIHRoZW4gIi4vbHMgLWwiLikKKworSW5zdGFsbGluZyBidXN5Ym94IGNvbnNpc3RzIG9mIGNyZWF0aW5nIHN5bWxpbmtzIChvciBoYXJkbGlua3MpIHRvIHRoZSBidXN5Ym94CitiaW5hcnkgZm9yIGVhY2ggYXBwbGV0IGVuYWJsZWQgaW4gYnVzeWJveCwgYW5kIG1ha2luZyBzdXJlIHRoZXNlIHN5bWxpbmtzIGFyZQoraW4gdGhlIHNoZWxsJ3MgY29tbWFuZCAkUEFUSC4gIFJ1bm5pbmcgIm1ha2UgaW5zdGFsbCIgY3JlYXRlcyB0aGVzZSBzeW1saW5rcywKK29yICJtYWtlIGluc3RhbGwtaGFyZGxpbmtzIiBjcmVhdGVzIGhhcmRsaW5rcyBpbnN0ZWFkICh1c2VmdWwgb24gc3lzdGVtcyB3aXRoCithIGxpbWl0ZWQgbnVtYmVyIG9mIGlub2RlcykuICBUaGlzIGluc3RhbGwgcHJvY2VzcyB1c2VzIHRoZSBmaWxlCisiYnVzeWJveC5saW5rcyIgKGNyZWF0ZWQgYnkgbWFrZSksIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGVuYWJsZWQgYXBwbGV0cworYW5kIHRoZSBwYXRoIGF0IHdoaWNoIHRvIGluc3RhbGwgdGhlbS4KKworSW5zdGFsbGluZyBsaW5rcyB0byBidXN5Ym94IGlzIG5vdCBhbHdheXMgbmVjZXNzYXJ5LiAgVGhlIHNwZWNpYWwgYXBwbGV0IG5hbWUKKyJidXN5Ym94IiAob3Igd2l0aCBhbnkgb3B0aW9uYWwgc3VmZml4LCBzdWNoIGFzICJidXN5Ym94LXN0YXRpYyIpIHVzZXMgdGhlCitmaXJzdCBhcmd1bWVudCB0byBkZXRlcm1pbmUgd2hpY2ggYXBwbGV0IHRvIGJlaGF2ZSBhcywgZm9yIGV4YW1wbGUKKyIuL2J1c3lib3ggY2F0IExJQ0VOU0UiLiAgKFJ1bm5pbmcgdGhlIGJ1c3lib3ggYXBwbGV0IHdpdGggbm8gYXJndW1lbnRzIGdpdmVzCithIGxpc3Qgb2YgYWxsIGVuYWJsZWQgYXBwbGV0cy4pIFRoZSBzdGFuZGFsb25lIHNoZWxsIGNhbiBhbHNvIGNhbGwgYnVzeWJveAorYXBwbGV0cyB3aXRob3V0IGxpbmtzIHRvIGJ1c3lib3ggdW5kZXIgb3RoZXIgbmFtZXMgaW4gdGhlIGZpbGVzeXN0ZW0uICBZb3UgY2FuCithbHNvIGNvbmZpZ3VyZSBhIHN0YW5kYWxvbmUgaW5zdGFsbCBjYXBhYmlsaXR5IGludG8gdGhlIGJ1c3lib3ggYmFzZSBhcHBsZXQsCithbmQgdGhlbiBpbnN0YWxsIHN1Y2ggbGlua3MgYXQgcnVudGltZSB3aXRoIG9uZSBvZiAiYnVzeWJveCAtLWluc3RhbGwiIChmb3IKK2hhcmRsaW5rcykgb3IgImJ1c3lib3ggLS1pbnN0YWxsIC1zIiAoZm9yIHN5bWxpbmtzKS4KKworSWYgeW91IGVuYWJsZWQgdGhlIGJ1c3lib3ggc2hhcmVkIGxpYnJhcnkgZmVhdHVyZSAobGliYnVzeWJveC5zbykgYW5kIHdhbnQKK3RvIHJ1biB0ZXN0cyB3aXRob3V0IGluc3RhbGxpbmcsIHNldCB5b3VyIExEX0xJQlJBUllfUEFUSCBhY2NvcmRpbmdseSB3aGVuCitydW5uaW5nIHRoZSBleGVjdXRhYmxlOgorCisgIExEX0xJQlJBUllfUEFUSD1gcHdkYCAuL2J1c3lib3gKKworQnVpbGRpbmcgb3V0LW9mLXRyZWU6Cis9PT09PT09PT09PT09PT09PT09PT0KKworQnkgZGVmYXVsdCwgdGhlIEJ1c3lCb3ggYnVpbGQgcHV0cyBpdHMgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZS4KK0J1aWxkaW5nIGZyb20gYSByZWFkLW9ubHkgc291cmNlIHRyZWUsIG9yIGJ1aWxkaW5nIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zIGZyb20KK3RoZSBzYW1lIHNvdXJjZSBkaXJlY3RvcnksIHJlcXVpcmVzIHRoZSBhYmlsaXR5IHRvIHB1dCB0aGUgdGVtcG9yYXJ5IGZpbGVzCitzb21ld2hlcmUgZWxzZS4KKworVG8gYnVpbGQgb3V0IG9mIHRyZWUsIGNkIHRvIGFuIGVtcHR5IGRpcmVjdG9yeSBhbmQgY29uZmlndXJlIGJ1c3lib3ggZnJvbSB0aGVyZToKKworICBtYWtlIEtCVUlMRF9TUkM9L3BhdGgvdG8vc291cmNlIC1mIC9wYXRoL3RvL3NvdXJjZS9NYWtlZmlsZSBkZWZjb25maWcKKyAgbWFrZQorICBtYWtlIGluc3RhbGwKKworQWx0ZXJuYXRlbHksIHVzZSB0aGUgTz0kQlVJTERQQVRIIG9wdGlvbiAod2l0aCBhbiBhYnNvbHV0ZSBwYXRoKSBkdXJpbmcgdGhlCitjb25maWd1cmF0aW9uIHN0ZXAsIGFzIGluOgorCisgIG1ha2UgTz0vc29tZS9lbXB0eS9kaXJlY3RvcnkgYWxseWVzY29uZmlnCisgIGNkIC9zb21lL2VtcHR5L2RpcmVjdG9yeQorICBtYWtlCisgIG1ha2UgQ09ORklHX1BSRUZJWD0uIGluc3RhbGwKKworTW9yZSBJbmZvcm1hdGlvbjoKKz09PT09PT09PT09PT09PT09CisKK1NlIGFsc28gdGhlIGJ1c3lib3ggRkFRLCB1bmRlciB0aGUgcXVlc3Rpb25zICJIb3cgY2FuIEkgZ2V0IHN0YXJ0ZWQgdXNpbmcKK0J1c3lCb3giIGFuZCAiSG93IGRvIEkgYnVpbGQgYSBCdXN5Qm94LWJhc2VkIHN5c3RlbT8iICBUaGUgQnVzeUJveCBGQVEgaXMKK2F2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuYnVzeWJveC5uZXQvRkFRLmh0bWwKZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTBhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCkBAIC0wLDAgKzEsMzQ4IEBACistLS0gQSBub3RlIG9uIEdQTCB2ZXJzaW9ucworCitCdXN5Qm94IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoaW5jbHVkZWQKK2luIGl0cyBlbnRpcmV0eSwgYmVsb3cpLiAgVmVyc2lvbiAyIGlzIHRoZSBvbmx5IHZlcnNpb24gb2YgdGhpcyBsaWNlbnNlIHdoaWNoCit0aGlzIHZlcnNpb24gb2YgQnVzeUJveCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgZGVyaXZlZCBmcm9tIHRoaXMgb25lKSBtYXkgYmUKK2Rpc3RyaWJ1dGVkIHVuZGVyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDhjOWMKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZQpAQCAtMCwwICsxLDEzNDEgQEAKK1ZFUlNJT04gPSAxCitQQVRDSExFVkVMID0gMTkKK1NVQkxFVkVMID0gMworRVhUUkFWRVJTSU9OID0KK05BTUUgPSBVbm5hbWVkCisKKyMgKkRPQ1VNRU5UQVRJT04qCisjIFRvIHNlZSBhIGxpc3Qgb2YgdHlwaWNhbCB0YXJnZXRzIGV4ZWN1dGUgIm1ha2UgaGVscCIKKyMgTW9yZSBpbmZvIGNhbiBiZSBsb2NhdGVkIGluIC4vUkVBRE1FCisjIENvbW1lbnRzIGluIHRoaXMgZmlsZSBhcmUgdGFyZ2V0ZWQgb25seSB0byB0aGUgZGV2ZWxvcGVyLCBkbyBub3QKKyMgZXhwZWN0IHRvIGxlYXJuIGhvdyB0byBidWlsZCB0aGUga2VybmVsIHJlYWRpbmcgdGhpcyBmaWxlLgorCisjIERvIG5vdCBwcmludCAiRW50ZXJpbmcgZGlyZWN0b3J5IC4uLiIKK01BS0VGTEFHUyArPSAtLW5vLXByaW50LWRpcmVjdG9yeQorCisjIFdlIGFyZSB1c2luZyBhIHJlY3Vyc2l2ZSBidWlsZCwgc28gd2UgbmVlZCB0byBkbyBhIGxpdHRsZSB0aGlua2luZworIyB0byBnZXQgdGhlIG9yZGVyaW5nIHJpZ2h0LgorIworIyBNb3N0IGltcG9ydGFudGx5OiBzdWItTWFrZWZpbGVzIHNob3VsZCBvbmx5IGV2ZXIgbW9kaWZ5IGZpbGVzIGluCisjIHRoZWlyIG93biBkaXJlY3RvcnkuIElmIGluIHNvbWUgZGlyZWN0b3J5IHdlIGhhdmUgYSBkZXBlbmRlbmN5IG9uCisjIGEgZmlsZSBpbiBhbm90aGVyIGRpciAod2hpY2ggZG9lc24ndCBoYXBwZW4gb2Z0ZW4sIGJ1dCBpdCdzIG9mdGVuCisjIHVuYXZvaWRhYmxlIHdoZW4gbGlua2luZyB0aGUgYnVpbHQtaW4ubyB0YXJnZXRzIHdoaWNoIGZpbmFsbHkKKyMgdHVybiBpbnRvIGJ1c3lib3gpLCB3ZSB3aWxsIGNhbGwgYSBzdWIgbWFrZSBpbiB0aGF0IG90aGVyIGRpciwgYW5kCisjIGFmdGVyIHRoYXQgd2UgYXJlIHN1cmUgdGhhdCBldmVyeXRoaW5nIHdoaWNoIGlzIGluIHRoYXQgb3RoZXIgZGlyCisjIGlzIG5vdyB1cCB0byBkYXRlLgorIworIyBUaGUgb25seSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvIG1vZGlmeSBmaWxlcyB3aGljaCBoYXZlIGdsb2JhbAorIyBlZmZlY3RzIGFyZSB0aHVzIHNlcGFyYXRlZCBvdXQgYW5kIGRvbmUgYmVmb3JlIHRoZSByZWN1cnNpdmUKKyMgZGVzY2VuZGluZyBpcyBzdGFydGVkLiBUaGV5IGFyZSBub3cgZXhwbGljaXRseSBsaXN0ZWQgYXMgdGhlCisjIHByZXBhcmUgcnVsZS4KKworIyBUbyBwdXQgbW9yZSBmb2N1cyBvbiB3YXJuaW5ncywgYmUgbGVzcyB2ZXJib3NlIGFzIGRlZmF1bHQKKyMgVXNlICdtYWtlIFY9MScgdG8gc2VlIHRoZSBmdWxsIGNvbW1hbmRzCisKK2lmZGVmIFYKKyAgaWZlcSAoIiQob3JpZ2luIFYpIiwgImNvbW1hbmQgbGluZSIpCisgICAgS0JVSUxEX1ZFUkJPU0UgPSAkKFYpCisgIGVuZGlmCitlbmRpZgoraWZuZGVmIEtCVUlMRF9WRVJCT1NFCisgIEtCVUlMRF9WRVJCT1NFID0gMAorZW5kaWYKKworIyBDYWxsIHNwYXJzZSBhcyBwYXJ0IG9mIGNvbXBpbGF0aW9uIG9mIEMgZmlsZXMKKyMgVXNlICdtYWtlIEM9MScgdG8gZW5hYmxlIHNwYXJzZSBjaGVja2luZworCitpZmRlZiBDCisgIGlmZXEgKCIkKG9yaWdpbiBDKSIsICJjb21tYW5kIGxpbmUiKQorICAgIEtCVUlMRF9DSEVDS1NSQyA9ICQoQykKKyAgZW5kaWYKK2VuZGlmCitpZm5kZWYgS0JVSUxEX0NIRUNLU1JDCisgIEtCVUlMRF9DSEVDS1NSQyA9IDAKK2VuZGlmCisKKyMgVXNlIG1ha2UgTT1kaXIgdG8gc3BlY2lmeSBkaXJlY3Rvcnkgb2YgZXh0ZXJuYWwgbW9kdWxlIHRvIGJ1aWxkCisjIE9sZCBzeW50YXggbWFrZSAuLi4gU1VCRElSUz0kUFdEIGlzIHN0aWxsIHN1cHBvcnRlZAorIyBTZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBLQlVJTERfRVhUTU9EIHRha2UgcHJlY2VkZW5jZQoraWZkZWYgU1VCRElSUworICBLQlVJTERfRVhUTU9EID89ICQoU1VCRElSUykKK2VuZGlmCitpZmRlZiBNCisgIGlmZXEgKCIkKG9yaWdpbiBNKSIsICJjb21tYW5kIGxpbmUiKQorICAgIEtCVUlMRF9FWFRNT0QgOj0gJChNKQorICBlbmRpZgorZW5kaWYKKworCisjIGtidWlsZCBzdXBwb3J0cyBzYXZpbmcgb3V0cHV0IGZpbGVzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LgorIyBUbyBsb2NhdGUgb3V0cHV0IGZpbGVzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5IHR3byBzeW50YXhlcyBhcmUgc3VwcG9ydGVkLgorIyBJbiBib3RoIGNhc2VzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIHRoZSByb290IG9mIHRoZSBrZXJuZWwgc3JjLgorIyAxKSBPPQorIyBVc2UgIm1ha2UgTz1kaXIvdG8vc3RvcmUvb3V0cHV0L2ZpbGVzLyIKKyMKKyMgMikgU2V0IEtCVUlMRF9PVVRQVVQKKyMgU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBLQlVJTERfT1VUUFVUIHRvIHBvaW50IHRvIHRoZSBkaXJlY3RvcnkKKyMgd2hlcmUgdGhlIG91dHB1dCBmaWxlcyBzaGFsbCBiZSBwbGFjZWQuCisjIGV4cG9ydCBLQlVJTERfT1VUUFVUPWRpci90by9zdG9yZS9vdXRwdXQvZmlsZXMvCisjIG1ha2UKKyMKKyMgVGhlIE89IGFzc2lnbm1lbnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBLQlVJTERfT1VUUFVUIGVudmlyb25tZW50CisjIHZhcmlhYmxlLgorCisKKyMgS0JVSUxEX1NSQyBpcyBzZXQgb24gaW52b2NhdGlvbiBvZiBtYWtlIGluIE9CSiBkaXJlY3RvcnkKKyMgS0JVSUxEX1NSQyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcmVndWxhciB1c2VyIChmb3Igbm93KQoraWZlcSAoJChLQlVJTERfU1JDKSwpCisKKyMgT0ssIE1ha2UgY2FsbGVkIGluIGRpcmVjdG9yeSB3aGVyZSBrZXJuZWwgc3JjIHJlc2lkZXMKKyMgRG8gd2Ugd2FudCB0byBsb2NhdGUgb3V0cHV0IGZpbGVzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5PworaWZkZWYgTworICBpZmVxICgiJChvcmlnaW4gTykiLCAiY29tbWFuZCBsaW5lIikKKyAgICBLQlVJTERfT1VUUFVUIDo9ICQoTykKKyAgZW5kaWYKK2VuZGlmCisKKyMgVGhhdCdzIG91ciBkZWZhdWx0IHRhcmdldCB3aGVuIG5vbmUgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZQorUEhPTlkgOj0gX2FsbAorX2FsbDoKKworaWZuZXEgKCQoS0JVSUxEX09VVFBVVCksKQorIyBJbnZva2UgYSBzZWNvbmQgbWFrZSBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgcGFzc2luZyByZWxldmFudCB2YXJpYWJsZXMKKyMgY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBhY3R1YWxseSBleGlzdHMKK3NhdmVkLW91dHB1dCA6PSAkKEtCVUlMRF9PVVRQVVQpCitLQlVJTERfT1VUUFVUIDo9ICQoc2hlbGwgY2QgJChLQlVJTERfT1VUUFVUKSAmJiAvYmluL3B3ZCkKKyQoaWYgJChLQlVJTERfT1VUUFVUKSwsIFwKKyAgICAgJChlcnJvciBvdXRwdXQgZGlyZWN0b3J5ICIkKHNhdmVkLW91dHB1dCkiIGRvZXMgbm90IGV4aXN0KSkKKworUEhPTlkgKz0gJChNQUtFQ01ER09BTFMpCisKKyQoZmlsdGVyLW91dCBfYWxsLCQoTUFLRUNNREdPQUxTKSkgX2FsbDoKKwkkKGlmICQoS0JVSUxEX1ZFUkJPU0U6MT0pLEApJChNQUtFKSAtQyAkKEtCVUlMRF9PVVRQVVQpIFwKKwlLQlVJTERfU1JDPSQoQ1VSRElSKSBcCisJS0JVSUxEX0VYVE1PRD0iJChLQlVJTERfRVhUTU9EKSIgLWYgJChDVVJESVIpL01ha2VmaWxlICRACisKKyMgTGVhdmUgcHJvY2Vzc2luZyB0byBhYm92ZSBpbnZvY2F0aW9uIG9mIG1ha2UKK3NraXAtbWFrZWZpbGUgOj0gMQorZW5kaWYgIyBpZm5lcSAoJChLQlVJTERfT1VUUFVUKSwpCitlbmRpZiAjIGlmZXEgKCQoS0JVSUxEX1NSQyksKQorCisjIFdlIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIE1ha2VmaWxlIGlmIHRoaXMgaXMgdGhlIGZpbmFsIGludm9jYXRpb24gb2YgbWFrZQoraWZlcSAoJChza2lwLW1ha2VmaWxlKSwpCisKKyMgSWYgYnVpbGRpbmcgYW4gZXh0ZXJuYWwgbW9kdWxlIHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBhbGw6IHJ1bGUKKyMgYnV0IGluc3RlYWQgX2FsbCBkZXBlbmQgb24gbW9kdWxlcworUEhPTlkgKz0gYWxsCitpZmVxICgkKEtCVUlMRF9FWFRNT0QpLCkKK19hbGw6IGFsbAorZWxzZQorX2FsbDogbW9kdWxlcworZW5kaWYKKworc3JjdHJlZQkJOj0gJChpZiAkKEtCVUlMRF9TUkMpLCQoS0JVSUxEX1NSQyksJChDVVJESVIpKQorVE9QRElSCQk6PSAkKHNyY3RyZWUpCisjIEZJWE1FIC0gVE9QRElSIGlzIG9ic29sZXRlLCB1c2Ugc3JjdHJlZS9vYmp0cmVlCitvYmp0cmVlCQk6PSAkKENVUkRJUikKK3NyYwkJOj0gJChzcmN0cmVlKQorb2JqCQk6PSAkKG9ianRyZWUpCisKK1ZQQVRICQk6PSAkKHNyY3RyZWUpJChpZiAkKEtCVUlMRF9FWFRNT0QpLDokKEtCVUlMRF9FWFRNT0QpKQorCitleHBvcnQgc3JjdHJlZSBvYmp0cmVlIFZQQVRIIFRPUERJUgorCisKKyMgQ3Jvc3MgY29tcGlsaW5nIGFuZCBzZWxlY3RpbmcgZGlmZmVyZW50IHNldCBvZiBnY2MvYmluLXV0aWxzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBXaGVuIHBlcmZvcm1pbmcgY3Jvc3MgY29tcGlsYXRpb24gZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgQVJDSCBzaGFsbCBiZSBzZXQKKyMgdG8gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIChTZWUgYXJjaC8qIGZvciB0aGUgcG9zc2liaWxpdGllcykuCisjIEFSQ0ggY2FuIGJlIHNldCBkdXJpbmcgaW52b2NhdGlvbiBvZiBtYWtlOgorIyBtYWtlIEFSQ0g9aWE2NAorIyBBbm90aGVyIHdheSBpcyB0byBoYXZlIEFSQ0ggc2V0IGluIHRoZSBlbnZpcm9ubWVudC4KKyMgVGhlIGRlZmF1bHQgQVJDSCBpcyB0aGUgaG9zdCB3aGVyZSBtYWtlIGlzIGV4ZWN1dGVkLgorCisjIENST1NTX0NPTVBJTEUgc3BlY2lmeSB0aGUgcHJlZml4IHVzZWQgZm9yIGFsbCBleGVjdXRhYmxlcyB1c2VkCisjIGR1cmluZyBjb21waWxhdGlvbi4gT25seSBnY2MgYW5kIHJlbGF0ZWQgYmluLXV0aWxzIGV4ZWN1dGFibGVzCisjIGFyZSBwcmVmaXhlZCB3aXRoICQoQ1JPU1NfQ09NUElMRSkuCisjIENST1NTX0NPTVBJTEUgY2FuIGJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lCisjIG1ha2UgQ1JPU1NfQ09NUElMRT1pYTY0LWxpbnV4LQorIyBBbHRlcm5hdGl2ZWx5IENST1NTX0NPTVBJTEUgY2FuIGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQuCisjIERlZmF1bHQgdmFsdWUgZm9yIENST1NTX0NPTVBJTEUgaXMgbm90IHRvIHByZWZpeCBleGVjdXRhYmxlcworIyBOb3RlOiBTb21lIGFyY2hpdGVjdHVyZXMgYXNzaWduIENST1NTX0NPTVBJTEUgaW4gdGhlaXIgYXJjaC8qL01ha2VmaWxlCisKK0NST1NTX0NPTVBJTEUgPz0KKyMgYmJveDogd2UgbWF5IGhhdmUgQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWCBpbiAuY29uZmlnLAorIyBhbmQgaXQgaGFzIG5vdCBiZWVuIGluY2x1ZGVkIHlldC4uLiB0aHVzIHVzaW5nIGFuIGF3a3dhcmQgc3ludGF4LgoraWZlcSAoJChDUk9TU19DT01QSUxFKSwpCitDUk9TU19DT01QSUxFIDo9ICQoc2hlbGwgZ3JlcCBeQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWCAuY29uZmlnIDI+L2Rldi9udWxsKQorQ1JPU1NfQ09NUElMRSA6PSAkKHN1YnN0IENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9LCwkKENST1NTX0NPTVBJTEUpKQorQ1JPU1NfQ09NUElMRSA6PSAkKHN1YnN0ICIsLCQoQ1JPU1NfQ09NUElMRSkpCisjIikKK2VuZGlmCisKKyMgU1VCQVJDSCB0ZWxscyB0aGUgdXNlcm1vZGUgYnVpbGQgd2hhdCB0aGUgdW5kZXJseWluZyBhcmNoIGlzLiAgVGhhdCBpcyBzZXQKKyMgZmlyc3QsIGFuZCBpZiBhIHVzZXJtb2RlIGJ1aWxkIGlzIGhhcHBlbmluZywgdGhlICJBUkNIPXVtIiBvbiB0aGUgY29tbWFuZAorIyBsaW5lIG92ZXJyaWRlcyB0aGUgc2V0dGluZyBvZiBBUkNIIGJlbG93LiAgSWYgYSBuYXRpdmUgYnVpbGQgaXMgaGFwcGVuaW5nLAorIyB0aGVuIEFSQ0ggaXMgYXNzaWduZWQsIGdldHRpbmcgd2hhdGV2ZXIgdmFsdWUgaXQgZ2V0cyBub3JtYWxseSwgYW5kCisjIFNVQkFSQ0ggaXMgc3Vic2VxdWVudGx5IGlnbm9yZWQuCisKK2lmbmVxICgkKENST1NTX0NPTVBJTEUpLCkKK1NVQkFSQ0ggOj0gJChzaGVsbCBlY2hvICQoQ1JPU1NfQ09NUElMRSkgfCBjdXQgLWQtIC1mMSkKK2Vsc2UKK1NVQkFSQ0ggOj0gJChzaGVsbCB1bmFtZSAtbSkKK2VuZGlmCitTVUJBUkNIIDo9ICQoc2hlbGwgZWNobyAkKFNVQkFSQ0gpIHwgc2VkIC1lIHMvaS44Ni9pMzg2LyAtZSBzL3N1bjR1L3NwYXJjNjQvIFwKKwkJCQkJIC1lIHMvYXJtLiovYXJtLyAtZSBzL3NhMTEwL2FybS8gXAorCQkJCQkgLWUgcy9zMzkweC9zMzkwLyAtZSBzL3BhcmlzYzY0L3BhcmlzYy8gXAorCQkJCQkgLWUgcy9wcGMuKi9wb3dlcnBjLyAtZSBzL21pcHMuKi9taXBzLyApCisKK0FSQ0ggPz0gJChTVUJBUkNIKQorCisjIEFyY2hpdGVjdHVyZSBhcyBwcmVzZW50IGluIGNvbXBpbGUuaAorVVRTX01BQ0hJTkUgOj0gJChBUkNIKQorCisjIFNIRUxMIHVzZWQgYnkga2J1aWxkCitDT05GSUdfU0hFTEwgOj0gJChzaGVsbCBpZiBbIC14ICIkJEJBU0giIF07IHRoZW4gZWNobyAkJEJBU0g7IFwKKwkgIGVsc2UgaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlbiBlY2hvIC9iaW4vYmFzaDsgXAorCSAgZWxzZSBlY2hvIHNoOyBmaSA7IGZpKQorCisjIAlEZWNpZGUgd2hldGhlciB0byBidWlsZCBidWlsdC1pbiwgbW9kdWxhciwgb3IgYm90aC4KKyMJTm9ybWFsbHksIGp1c3QgZG8gYnVpbHQtaW4uCisKK0tCVUlMRF9NT0RVTEVTIDo9CitLQlVJTERfQlVJTFRJTiA6PSAxCisKKyMJSWYgd2UgaGF2ZSBvbmx5ICJtYWtlIG1vZHVsZXMiLCBkb24ndCBjb21waWxlIGJ1aWx0LWluIG9iamVjdHMuCisjCVdoZW4gd2UncmUgYnVpbGRpbmcgbW9kdWxlcyB3aXRoIG1vZHZlcnNpb25zLCB3ZSBuZWVkIHRvIGNvbnNpZGVyCisjCXRoZSBidWlsdC1pbiBvYmplY3RzIGR1cmluZyB0aGUgZGVzY2VuZCBhcyB3ZWxsLCBpbiBvcmRlciB0bworIwltYWtlIHN1cmUgdGhlIGNoZWNrc3VtcyBhcmUgdXB0b2RhdGUgYmVmb3JlIHdlIHJlY29yZCB0aGVtLgorCitpZmVxICgkKE1BS0VDTURHT0FMUyksbW9kdWxlcykKKyAgS0JVSUxEX0JVSUxUSU4gOj0gJChpZiAkKENPTkZJR19NT0RWRVJTSU9OUyksMSkKK2VuZGlmCisKKyMJSWYgd2UgaGF2ZSAibWFrZSA8d2hhdGV2ZXI+IG1vZHVsZXMiLCBjb21waWxlIG1vZHVsZXMKKyMJaW4gYWRkaXRpb24gdG8gd2hhdGV2ZXIgd2UgZG8gYW55d2F5LgorIwlKdXN0ICJtYWtlIiBvciAibWFrZSBhbGwiIHNoYWxsIGJ1aWxkIG1vZHVsZXMgYXMgd2VsbAorCitpZm5lcSAoJChmaWx0ZXIgYWxsIF9hbGwgbW9kdWxlcywkKE1BS0VDTURHT0FMUykpLCkKKyAgS0JVSUxEX01PRFVMRVMgOj0gMQorZW5kaWYKKworaWZlcSAoJChNQUtFQ01ER09BTFMpLCkKKyAgS0JVSUxEX01PRFVMRVMgOj0gMQorZW5kaWYKKworZXhwb3J0IEtCVUlMRF9NT0RVTEVTIEtCVUlMRF9CVUlMVElOCitleHBvcnQgS0JVSUxEX0NIRUNLU1JDIEtCVUlMRF9TUkMgS0JVSUxEX0VYVE1PRAorCisjIEJlYXV0aWZ5IG91dHB1dAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgTm9ybWFsbHksIHdlIGVjaG8gdGhlIHdob2xlIGNvbW1hbmQgYmVmb3JlIGV4ZWN1dGluZyBpdC4gQnkgbWFraW5nCisjIHRoYXQgZWNobyAkKCQocXVpZXQpJChjbWQpKSwgd2Ugbm93IGhhdmUgdGhlIHBvc3NpYmlsaXR5IHRvIHNldAorIyAkKHF1aWV0KSB0byBjaG9vc2Ugb3RoZXIgZm9ybXMgb2Ygb3V0cHV0IGluc3RlYWQsIGUuZy4KKyMKKyMgICAgICAgICBxdWlldF9jbWRfY2Nfb19jID0gQ29tcGlsaW5nICQoUkVMRElSKS8kQAorIyAgICAgICAgIGNtZF9jY19vX2MgICAgICAgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICRAICQ8CisjCisjIElmICQocXVpZXQpIGlzIGVtcHR5LCB0aGUgd2hvbGUgY29tbWFuZCB3aWxsIGJlIHByaW50ZWQuCisjIElmIGl0IGlzIHNldCB0byAicXVpZXRfIiwgb25seSB0aGUgc2hvcnQgdmVyc2lvbiB3aWxsIGJlIHByaW50ZWQuCisjIElmIGl0IGlzIHNldCB0byAic2lsZW50XyIsIG5vdGhpbmcgd2lsIGJlIHByaW50ZWQgYXQgYWxsLCBzaW5jZQorIyB0aGUgdmFyaWFibGUgJChzaWxlbnRfY21kX2NjX29fYykgZG9lc24ndCBleGlzdC4KKyMKKyMgQSBzaW1wbGUgdmFyaWFudCBpcyB0byBwcmVmaXggY29tbWFuZHMgd2l0aCAkKFEpIC0gdGhhdCdzIHVzZWZ1bAorIyBmb3IgY29tbWFuZHMgdGhhdCBzaGFsbCBiZSBoaWRkZW4gaW4gbm9uLXZlcmJvc2UgbW9kZS4KKyMKKyMJJChRKWxuICRAIDo8CisjCisjIElmIEtCVUlMRF9WRVJCT1NFIGVxdWFscyAwIHRoZW4gdGhlIGFib3ZlIGNvbW1hbmQgd2lsbCBiZSBoaWRkZW4uCisjIElmIEtCVUlMRF9WRVJCT1NFIGVxdWFscyAxIHRoZW4gdGhlIGFib3ZlIGNvbW1hbmQgaXMgZGlzcGxheWVkLgorCitpZmVxICgkKEtCVUlMRF9WRVJCT1NFKSwxKQorICBxdWlldCA9CisgIFEgPQorZWxzZQorICBxdWlldD1xdWlldF8KKyAgUSA9IEAKK2VuZGlmCisKKyMgSWYgdGhlIHVzZXIgaXMgcnVubmluZyBtYWtlIC1zIChzaWxlbnQgbW9kZSksIHN1cHByZXNzIGVjaG9pbmcgb2YKKyMgY29tbWFuZHMKKworaWZuZXEgKCQoZmluZHN0cmluZyBzLCQoTUFLRUZMQUdTKSksKQorICBxdWlldD1zaWxlbnRfCitlbmRpZgorCitleHBvcnQgcXVpZXQgUSBLQlVJTERfVkVSQk9TRQorCisKKyMgTG9vayBmb3IgbWFrZSBpbmNsdWRlIGZpbGVzIHJlbGF0aXZlIHRvIHJvb3Qgb2Yga2VybmVsIHNyYworTUFLRUZMQUdTICs9IC0taW5jbHVkZS1kaXI9JChzcmN0cmVlKQorCitIT1NUQ0MgIAk9IGdjYworSE9TVENYWCAgCT0gZysrCitIT1NUQ0ZMQUdTCTo9CitIT1NUQ1hYRkxBR1MJOj0KKyMgV2UgbmVlZCBzb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMKK2luY2x1ZGUgJChzcmN0cmVlKS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisKK0hPU1RDRkxBR1MJKz0gJChjYWxsIGhvc3RjYy1vcHRpb24sLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIsKQorSE9TVENYWEZMQUdTCSs9IC1PMgorCisjIEZvciBtYXhpbXVtIHBlcmZvcm1hbmNlICgrIHBvc3NpYmx5IHJhbmRvbSBicmVha2FnZSwgdW5jb21tZW50CisjIHRoZSBmb2xsb3dpbmcpCisKK01BS0VGTEFHUyArPSAtclIKKworIyBNYWtlIHZhcmlhYmxlcyAoQ0MsIGV0Yy4uLikKKworQVMJCT0gJChDUk9TU19DT01QSUxFKWFzCitDQwkJPSAkKENST1NTX0NPTVBJTEUpZ2NjCitMRAkJPSAkKENDKSAtbm9zdGRsaWIKK0NQUAkJPSAkKENDKSAtRQorQVIJCT0gJChDUk9TU19DT01QSUxFKWFyCitOTQkJPSAkKENST1NTX0NPTVBJTEUpbm0KK1NUUklQCQk9ICQoQ1JPU1NfQ09NUElMRSlzdHJpcAorT0JKQ09QWQkJPSAkKENST1NTX0NPTVBJTEUpb2JqY29weQorT0JKRFVNUAkJPSAkKENST1NTX0NPTVBJTEUpb2JqZHVtcAorQVdLCQk9IGF3aworR0VOS1NZTVMJPSBzY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zCitERVBNT0QJCT0gL3NiaW4vZGVwbW9kCitLQUxMU1lNUwk9IHNjcmlwdHMva2FsbHN5bXMKK1BFUkwJCT0gcGVybAorQ0hFQ0sJCT0gc3BhcnNlCisKK0NIRUNLRkxBR1MgICAgIDo9IC1EX19saW51eF9fIC1EbGludXggLURfX1NURENfXyAtRHVuaXggLURfX3VuaXhfXyAtV2JpdHdpc2UgJChDRikKK01PREZMQUdTCT0gLURNT0RVTEUKK0NGTEFHU19NT0RVTEUgICA9ICQoTU9ERkxBR1MpCitBRkxBR1NfTU9EVUxFICAgPSAkKE1PREZMQUdTKQorTERGTEFHU19NT0RVTEUgID0gLXIKK0NGTEFHU19LRVJORUwJPQorQUZMQUdTX0tFUk5FTAk9CisKKworIyBVc2UgTElOVVhJTkNMVURFIHdoZW4geW91IG11c3QgcmVmZXJlbmNlIHRoZSBpbmNsdWRlLyBkaXJlY3RvcnkuCisjIE5lZWRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIE89IG9wdGlvbgorQ0ZMQUdTCQk6PSAkKENGTEFHUykKKyMgQWRkZWQgb25seSB0byBmaW5hbCBsaW5rIHN0YWdlIG9mIGJ1c3lib3ggYmluYXJ5CitDRkxBR1NfYnVzeWJveAk6PSAkKENGTEFHU19idXN5Ym94KQorQ1BQRkxBR1MJOj0gJChDUFBGTEFHUykKK0FGTEFHUwkJOj0gJChBRkxBR1MpCitMREZMQUdTCQk6PSAkKExERkxBR1MpCitMRExJQlMJCTo9CisKKyMgUmVhZCBLRVJORUxSRUxFQVNFIGZyb20gLmtlcm5lbHJlbGVhc2UgKGlmIGl0IGV4aXN0cykKK0tFUk5FTFJFTEVBU0UgPSAkKHNoZWxsIGNhdCAua2VybmVscmVsZWFzZSAyPiAvZGV2L251bGwpCitLRVJORUxWRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCisKK2V4cG9ydAlWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgS0VSTkVMUkVMRUFTRSBLRVJORUxWRVJTSU9OIFwKKwlBUkNIIENPTkZJR19TSEVMTCBIT1NUQ0MgSE9TVENGTEFHUyBDUk9TU19DT01QSUxFIEFTIExEIENDIFwKKwlDUFAgQVIgTk0gU1RSSVAgT0JKQ09QWSBPQkpEVU1QIE1BS0UgQVdLIEdFTktTWU1TIFBFUkwgVVRTX01BQ0hJTkUgXAorCUhPU1RDWFggSE9TVENYWEZMQUdTIExERkxBR1NfTU9EVUxFIENIRUNLIENIRUNLRkxBR1MKKworZXhwb3J0IENQUEZMQUdTIE5PU1RESU5DX0ZMQUdTIExJTlVYSU5DTFVERSBPQkpDT1BZRkxBR1MgTERGTEFHUworZXhwb3J0IENGTEFHUyBDRkxBR1NfS0VSTkVMIENGTEFHU19NT0RVTEUKK2V4cG9ydCBBRkxBR1MgQUZMQUdTX0tFUk5FTCBBRkxBR1NfTU9EVUxFCitleHBvcnQgRkxURkxBR1MKKworIyBXaGVuIGNvbXBpbGluZyBvdXQtb2YtdHJlZSBtb2R1bGVzLCBwdXQgTU9EVkVSRElSIGluIHRoZSBtb2R1bGUKKyMgdHJlZSByYXRoZXIgdGhhbiBpbiB0aGUga2VybmVsIHRyZWUuIFRoZSBrZXJuZWwgdHJlZSBtaWdodAorIyBldmVuIGJlIHJlYWQtb25seS4KK2V4cG9ydCBNT0RWRVJESVIgOj0gJChpZiAkKEtCVUlMRF9FWFRNT0QpLCQoZmlyc3R3b3JkICQoS0JVSUxEX0VYVE1PRCkpLykudG1wX3ZlcnNpb25zCisKKyMgRmlsZXMgdG8gaWdub3JlIGluIGZpbmQgLi4uIHN0YXRlbWVudHMKKworUkNTX0ZJTkRfSUdOT1JFIDo9IFwoIC1uYW1lIFNDQ1MgLW8gLW5hbWUgQml0S2VlcGVyIC1vIC1uYW1lIC5zdm4gLW8gLW5hbWUgQ1ZTIC1vIC1uYW1lIC5wYyAtbyAtbmFtZSAuaGcgLW8gLW5hbWUgLmdpdCBcKSAtcHJ1bmUgLW8KK2V4cG9ydCBSQ1NfVEFSX0lHTk9SRSA6PSAtLWV4Y2x1ZGUgU0NDUyAtLWV4Y2x1ZGUgQml0S2VlcGVyIC0tZXhjbHVkZSAuc3ZuIC0tZXhjbHVkZSBDVlMgLS1leGNsdWRlIC5wYyAtLWV4Y2x1ZGUgLmhnIC0tZXhjbHVkZSAuZ2l0CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFJ1bGVzIHNoYXJlZCBiZXR3ZWVuICpjb25maWcgdGFyZ2V0cyBhbmQgYnVpbGQgdGFyZ2V0cworCisjIEJhc2ljIGhlbHBlcnMgYnVpbHQgaW4gc2NyaXB0cy8KK1BIT05ZICs9IHNjcmlwdHNfYmFzaWMKK3NjcmlwdHNfYmFzaWM6CisJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9iYXNpYworCisjIFRvIGF2b2lkIGFueSBpbXBsaWNpdCBydWxlIHRvIGtpY2sgaW4sIGRlZmluZSBhbiBlbXB0eSBjb21tYW5kLgorc2NyaXB0cy9iYXNpYy8lOiBzY3JpcHRzX2Jhc2ljIDsKKworIyBUaGlzIHRhcmdldCBnZW5lcmF0ZXMgS2J1aWxkJ3MgYW5kIENvbmZpZy5pbidzIGZyb20gKi5jIGZpbGVzCitQSE9OWSArPSBnZW5fYnVpbGRfZmlsZXMKK2dlbl9idWlsZF9maWxlczogJCh3aWxkY2FyZCAkKHNyY3RyZWUpLyovKi5jKSAkKHdpbGRjYXJkICQoc3JjdHJlZSkvKi8qLyouYykKKwkkKFEpJChzcmN0cmVlKS9zY3JpcHRzL2dlbl9idWlsZF9maWxlcy5zaCAkKHNyY3RyZWUpICQob2JqdHJlZSkKKworIyBiYm94OiB3ZSBoYXZlIGhlbHBlcnMgaW4gYXBwbGV0cy8KKyMgd2UgZGVwZW5kIG9uIHNjcmlwdHNfYmFzaWMsIHNpbmNlIHNjcmlwdHMvYmFzaWMvZml4ZGVwCisjIG11c3QgYmUgYnVpbHQgYmVmb3JlIGFueSBvdGhlciBob3N0IHByb2cKK1BIT05ZICs9IGFwcGxldHNfZGlyCithcHBsZXRzX2Rpcjogc2NyaXB0c19iYXNpYyBnZW5fYnVpbGRfZmlsZXMKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcHBsZXRzCisKK2FwcGxldHMvJTogYXBwbGV0c19kaXIgOworCitQSE9OWSArPSBvdXRwdXRtYWtlZmlsZQorIyBvdXRwdXRtYWtlZmlsZSBnZW5lcmF0ZXMgYSBNYWtlZmlsZSBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgaWYgdXNpbmcgYQorIyBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5LiBUaGlzIGFsbG93cyBjb252ZW5pZW50IHVzZSBvZiBtYWtlIGluIHRoZQorIyBvdXRwdXQgZGlyZWN0b3J5Lgorb3V0cHV0bWFrZWZpbGU6CitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisJJChRKSQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvbWttYWtlZmlsZSBcCisJICAgICQoc3JjdHJlZSkgJChvYmp0cmVlKSAkKFZFUlNJT04pICQoUEFUQ0hMRVZFTCkKK2VuZGlmCisKKyMgVG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBpbmNsdWRlIC5jb25maWcgZm9yIGFueSBvZiB0aGUgKmNvbmZpZyB0YXJnZXRzCisjIGNhdGNoIHRoZW0gZWFybHksIGFuZCBoYW5kIHRoZW0gb3ZlciB0byBzY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKyMgSXQgaXMgYWxsb3dlZCB0byBzcGVjaWZ5IG1vcmUgdGFyZ2V0cyB3aGVuIGNhbGxpbmcgbWFrZSwgaW5jbHVkaW5nCisjIG1peGluZyAqY29uZmlnIHRhcmdldHMgYW5kIGJ1aWxkIHRhcmdldHMuCisjIEZvciBleGFtcGxlICdtYWtlIG9sZGNvbmZpZyBhbGwnLgorIyBEZXRlY3Qgd2hlbiBtaXhlZCB0YXJnZXRzIGlzIHNwZWNpZmllZCwgYW5kIG1ha2UgYSBzZWNvbmQgaW52b2NhdGlvbgorIyBvZiBtYWtlIHNvIC5jb25maWcgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgY2FzZSBlaXRoZXIgKGZvciAqY29uZmlnKS4KKworbm8tZG90LWNvbmZpZy10YXJnZXRzIDo9IGNsZWFuIG1ycHJvcGVyIGRpc3RjbGVhbiBcCisJCQkgY3Njb3BlIFRBR1MgdGFncyBoZWxwICVkb2NzCisjYmJveCMgY2hlY2slIGlzIHJlbW92ZWQgZnJvbSBhYm92ZQorCitjb25maWctdGFyZ2V0cyA6PSAwCittaXhlZC10YXJnZXRzICA6PSAwCitkb3QtY29uZmlnICAgICA6PSAxCisKK2lmbmVxICgkKGZpbHRlciAkKG5vLWRvdC1jb25maWctdGFyZ2V0cyksICQoTUFLRUNNREdPQUxTKSksKQorCWlmZXEgKCQoZmlsdGVyLW91dCAkKG5vLWRvdC1jb25maWctdGFyZ2V0cyksICQoTUFLRUNNREdPQUxTKSksKQorCQlkb3QtY29uZmlnIDo9IDAKKwllbmRpZgorZW5kaWYKKworaWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCisgICAgICAgIGlmbmVxICgkKGZpbHRlciBjb25maWcgJWNvbmZpZywkKE1BS0VDTURHT0FMUykpLCkKKyAgICAgICAgICAgICAgICBjb25maWctdGFyZ2V0cyA6PSAxCisgICAgICAgICAgICAgICAgaWZuZXEgKCQoZmlsdGVyLW91dCBjb25maWcgJWNvbmZpZywkKE1BS0VDTURHT0FMUykpLCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVkLXRhcmdldHMgOj0gMQorICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKG1peGVkLXRhcmdldHMpLDEpCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXZSdyZSBjYWxsZWQgd2l0aCBtaXhlZCB0YXJnZXRzICgqY29uZmlnIGFuZCBidWlsZCB0YXJnZXRzKS4KKyMgSGFuZGxlIHRoZW0gb25lIGJ5IG9uZS4KKworJTo6IEZPUkNFCisJJChRKSQoTUFLRSkgLUMgJChzcmN0cmVlKSBLQlVJTERfU1JDPSAkQAorCitlbHNlCitpZmVxICgkKGNvbmZpZy10YXJnZXRzKSwxKQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgKmNvbmZpZyB0YXJnZXRzIG9ubHkgLSBtYWtlIHN1cmUgcHJlcmVxdWlzaXRlcyBhcmUgdXBkYXRlZCwgYW5kIGRlc2NlbmQKKyMgaW4gc2NyaXB0cy9rY29uZmlnIHRvIG1ha2UgdGhlICpjb25maWcgdGFyZ2V0CisKKyMgUmVhZCBhcmNoIHNwZWNpZmljIE1ha2VmaWxlIHRvIHNldCBLQlVJTERfREVGQ09ORklHIGFzIG5lZWRlZC4KKyMgS0JVSUxEX0RFRkNPTkZJRyBtYXkgcG9pbnQgb3V0IGFuIGFsdGVybmF0aXZlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorIyB1c2VkIGZvciAnbWFrZSBkZWZjb25maWcnCistaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChBUkNIKS9NYWtlZmlsZQorZXhwb3J0IEtCVUlMRF9ERUZDT05GSUcKKworY29uZmlnOiBzY3JpcHRzX2Jhc2ljIG91dHB1dG1ha2VmaWxlIGdlbl9idWlsZF9maWxlcyBGT1JDRQorCSQoUSlta2RpciAtcCBpbmNsdWRlCisJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9rY29uZmlnICRACisJJChRKSQoTUFLRSkgLUMgJChzcmN0cmVlKSBLQlVJTERfU1JDPSAua2VybmVscmVsZWFzZQorCislY29uZmlnOiBzY3JpcHRzX2Jhc2ljIG91dHB1dG1ha2VmaWxlIGdlbl9idWlsZF9maWxlcyBGT1JDRQorCSQoUSlta2RpciAtcCBpbmNsdWRlCisJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9rY29uZmlnICRACisJJChRKSQoTUFLRSkgLUMgJChzcmN0cmVlKSBLQlVJTERfU1JDPSAua2VybmVscmVsZWFzZQorCitlbHNlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZCB0YXJnZXRzIG9ubHkgLSB0aGlzIGluY2x1ZGVzIGJ1c3lib3gsIGFyY2ggc3BlY2lmaWMgdGFyZ2V0cywgY2xlYW4KKyMgdGFyZ2V0cyBhbmQgb3RoZXJzLiBJbiBnZW5lcmFsIGFsbCB0YXJnZXRzIGV4Y2VwdCAqY29uZmlnIHRhcmdldHMuCisKK2lmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQorIyBBZGRpdGlvbmFsIGhlbHBlcnMgYnVpbHQgaW4gc2NyaXB0cy8KKyMgQ2FyZWZ1bGx5IGxpc3QgZGVwZW5kZW5jaWVzIHNvIHdlIGRvIG5vdCB0cnkgdG8gYnVpbGQgc2NyaXB0cyB0d2ljZQorIyBpbiBwYXJhbGxlbAorUEhPTlkgKz0gc2NyaXB0cworc2NyaXB0czogZ2VuX2J1aWxkX2ZpbGVzIHNjcmlwdHNfYmFzaWMgaW5jbHVkZS9jb25maWcvTUFSS0VSCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChAKQorCitzY3JpcHRzX2Jhc2ljOiBpbmNsdWRlL2F1dG9jb25mLmgKKworIyBPYmplY3RzIHdlIHdpbGwgbGluayBpbnRvIGJ1c3lib3ggLyBzdWJkaXJzIHdlIG5lZWQgdG8gdmlzaXQKK2NvcmUteQkJOj0gXAorCQlhcHBsZXRzLyBcCisKK2xpYnMteQkJOj0gXAorCQlhcmNoaXZhbC8gXAorCQlhcmNoaXZhbC9saWJhcmNoaXZlLyBcCisJCWNvbnNvbGUtdG9vbHMvIFwKKwkJY29yZXV0aWxzLyBcCisJCWNvcmV1dGlscy9saWJjb3JldXRpbHMvIFwKKwkJZGViaWFudXRpbHMvIFwKKwkJZTJmc3Byb2dzLyBcCisJCWVkaXRvcnMvIFwKKwkJZmluZHV0aWxzLyBcCisJCWluaXQvIFwKKwkJbGliYmIvIFwKKwkJbGlicHdkZ3JwLyBcCisJCWxvZ2ludXRpbHMvIFwKKwkJbWFpbHV0aWxzLyBcCisJCW1pc2N1dGlscy8gXAorCQltb2R1dGlscy8gXAorCQluZXR3b3JraW5nLyBcCisJCW5ldHdvcmtpbmcvbGliaXByb3V0ZS8gXAorCQluZXR3b3JraW5nL3VkaGNwLyBcCisJCXByaW50dXRpbHMvIFwKKwkJcHJvY3BzLyBcCisJCXJ1bml0LyBcCisJCXNlbGludXgvIFwKKwkJc2hlbGwvIFwKKwkJc3lza2xvZ2QvIFwKKwkJdXRpbC1saW51eC8gXAorCQl1dGlsLWxpbnV4L3ZvbHVtZV9pZC8gXAorCitlbmRpZiAjIEtCVUlMRF9FWFRNT0QKKworaWZlcSAoJChkb3QtY29uZmlnKSwxKQorIyBJbiB0aGlzIHNlY3Rpb24sIHdlIG5lZWQgLmNvbmZpZworCisjIFJlYWQgaW4gZGVwZW5kZW5jaWVzIHRvIGFsbCBLY29uZmlnKiBmaWxlcywgbWFrZSBzdXJlIHRvIHJ1bgorIyBvbGRjb25maWcgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCistaW5jbHVkZSAua2NvbmZpZy5kCisKKy1pbmNsdWRlIC5jb25maWcKKworIyBJZiAuY29uZmlnIG5lZWRzIHRvIGJlIHVwZGF0ZWQsIGl0IHdpbGwgYmUgZG9uZSB2aWEgdGhlIGRlcGVuZGVuY3kKKyMgdGhhdCBhdXRvY29uZiBoYXMgb24gLmNvbmZpZy4KKyMgVG8gYXZvaWQgYW55IGltcGxpY2l0IHJ1bGUgdG8ga2ljayBpbiwgZGVmaW5lIGFuIGVtcHR5IGNvbW1hbmQKKy5jb25maWcgLmtjb25maWcuZDogOworCisjIE5vdyB3ZSBjYW4gZGVmaW5lIENGTEFHUyBldGMgYWNjb3JkaW5nIHRvIC5jb25maWcKK2luY2x1ZGUgJChzcmN0cmVlKS9NYWtlZmlsZS5mbGFncworCisjIElmIC5jb25maWcgaXMgbmV3ZXIgdGhhbiBpbmNsdWRlL2F1dG9jb25mLmgsIHNvbWVvbmUgdGlua2VyZWQKKyMgd2l0aCBpdCBhbmQgZm9yZ290IHRvIHJ1biBtYWtlIG9sZGNvbmZpZy4KKyMgSWYga2NvbmZpZy5kIGlzIG1pc3NpbmcgdGhlbiB3ZSBhcmUgcHJvYmFybHkgaW4gYSBjbGVhbmVkIHRyZWUgc28KKyMgd2UgZXhlY3V0ZSB0aGUgY29uZmlnIHN0ZXAgdG8gYmUgc3VyZSB0byBjYXRjaCB1cGRhdGVkIEtjb25maWcgZmlsZXMKK2luY2x1ZGUvYXV0b2NvbmYuaDogLmtjb25maWcuZCAuY29uZmlnICQod2lsZGNhcmQgJChzcmN0cmVlKS8qLyouYykgJCh3aWxkY2FyZCAkKHNyY3RyZWUpLyovKi8qLmMpIHwgZ2VuX2J1aWxkX2ZpbGVzCisJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS9NYWtlZmlsZSBzaWxlbnRvbGRjb25maWcKKworaW5jbHVkZS91c2FnZS5oOiBnZW5fYnVpbGRfZmlsZXMKKworZWxzZQorIyBEdW1teSB0YXJnZXQgbmVlZGVkLCBiZWNhdXNlIHVzZWQgYXMgcHJlcmVxdWlzaXRlCitpbmNsdWRlL2F1dG9jb25mLmg6IDsKK2VuZGlmCisKKyMgVGhlIGFsbDogdGFyZ2V0IGlzIHRoZSBkZWZhdWx0IHdoZW4gbm8gdGFyZ2V0IGlzIGdpdmVuIG9uIHRoZQorIyBjb21tYW5kIGxpbmUuCisjIFRoaXMgYWxsb3cgYSB1c2VyIHRvIGlzc3VlIG9ubHkgJ21ha2UnIHRvIGJ1aWxkIGEga2VybmVsIGluY2x1ZGluZyBtb2R1bGVzCisjIERlZmF1bHRzIGJ1c3lib3ggYnV0IGl0IGlzIHVzdWFsbHkgb3ZlcnJpZGRlbiBpbiB0aGUgYXJjaCBtYWtlZmlsZQorYWxsOiBidXN5Ym94IGRvYworCistaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChBUkNIKS9NYWtlZmlsZQorCisjIGFyY2ggTWFrZWZpbGUgbWF5IG92ZXJyaWRlIENDIHNvIGtlZXAgdGhpcyBhZnRlciBhcmNoIE1ha2VmaWxlIGlzIGluY2x1ZGVkCisjYmJveCMgTk9TVERJTkNfRkxBR1MgKz0gLW5vc3RkaW5jIC1pc3lzdGVtICQoc2hlbGwgJChDQykgLXByaW50LWZpbGUtbmFtZT1pbmNsdWRlKQorQ0hFQ0tGTEFHUyArPSAkKE5PU1RESU5DX0ZMQUdTKQorCisjIERlZmF1bHQga2VybmVsIGltYWdlIHRvIGJ1aWxkIHdoZW4gbm8gc3BlY2lmaWMgdGFyZ2V0IGlzIGdpdmVuLgorIyBLQlVJTERfSU1BR0UgbWF5IGJlIG92ZXJydWxlZCBvbiB0aGUgY29tbWFuZGxpbmUgb3IKKyMgc2V0IGluIHRoZSBlbnZpcm9ubWVudAorIyBBbHNvIGFueSBhc3NpZ25tZW50cyBpbiBhcmNoLyQoQVJDSCkvTWFrZWZpbGUgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyMgdGhpcyBkZWZhdWx0IHZhbHVlCitleHBvcnQgS0JVSUxEX0lNQUdFID89IGJ1c3lib3gKKworIworIyBJTlNUQUxMX1BBVEggc3BlY2lmaWVzIHdoZXJlIHRvIHBsYWNlIHRoZSB1cGRhdGVkIGtlcm5lbCBhbmQgc3lzdGVtIG1hcAorIyBpbWFnZXMuIERlZmF1bHQgaXMgL2Jvb3QsIGJ1dCB5b3UgY2FuIHNldCBpdCB0byBvdGhlciB2YWx1ZXMKK2V4cG9ydAlJTlNUQUxMX1BBVEggPz0gL2Jvb3QKKworIworIyBJTlNUQUxMX01PRF9QQVRIIHNwZWNpZmllcyBhIHByZWZpeCB0byBNT0RMSUIgZm9yIG1vZHVsZSBkaXJlY3RvcnkKKyMgcmVsb2NhdGlvbnMgcmVxdWlyZWQgYnkgYnVpbGQgcm9vdHMuICBUaGlzIGlzIG5vdCBkZWZpbmVkIGluIHRoZQorIyBtYWtlZmlsZSBidXQgdGhlIGFyZ3VlbWVudCBjYW4gYmUgcGFzc2VkIHRvIG1ha2UgaWYgbmVlZGVkLgorIworCitNT0RMSUIJPSAkKElOU1RBTExfTU9EX1BBVEgpL2xpYi9tb2R1bGVzLyQoS0VSTkVMUkVMRUFTRSkKK2V4cG9ydCBNT0RMSUIKKworCitpZmVxICgkKEtCVUlMRF9FWFRNT0QpLCkKK2J1c3lib3gtZGlycwk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoY29yZS15KSAkKGNvcmUtbSkgJChsaWJzLXkpICQobGlicy1tKSkpCisKK2J1c3lib3gtYWxsZGlycwk6PSAkKHNvcnQgJChidXN5Ym94LWRpcnMpICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgXAorCQkgICAgICQoY29yZS1uKSAkKGNvcmUtKSAkKGxpYnMtbikgJChsaWJzLSkgXAorCQkpKSkKKworY29yZS15CQk6PSAkKHBhdHN1YnN0ICUvLCAlL2J1aWx0LWluLm8sICQoY29yZS15KSkKK2xpYnMteTEJCTo9ICQocGF0c3Vic3QgJS8sICUvbGliLmEsICQobGlicy15KSkKK2xpYnMteTIJCTo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChsaWJzLXkpKQorbGlicy15CQk6PSAkKGxpYnMteTEpICQobGlicy15MikKKworIyBCdWlsZCBidXN5Ym94CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBidXN5Ym94IGlzIGJ1aWxkIGZyb20gdGhlIG9iamVjdHMgc2VsZWN0ZWQgYnkgJChidXN5Ym94LWluaXQpIGFuZAorIyAkKGJ1c3lib3gtbWFpbikuIE1vc3QgYXJlIGJ1aWx0LWluLm8gZmlsZXMgZnJvbSB0b3AtbGV2ZWwgZGlyZWN0b3JpZXMKKyMgaW4gdGhlIGtlcm5lbCB0cmVlLCBvdGhlcnMgYXJlIHNwZWNpZmllZCBpbiBhcmNoLyQoQVJDSClNYWtlZmlsZS4KKyMgT3JkZXJpbmcgd2hlbiBsaW5raW5nIGlzIGltcG9ydGFudCwgYW5kICQoYnVzeWJveC1pbml0KSBtdXN0IGJlIGZpcnN0LgorIworIyBidXN5Ym94CisjICAgXgorIyAgIHwKKyMgICArLTwgJChidXN5Ym94LWluaXQpCisjICAgfCAgICstLTwgaW5pdC92ZXJzaW9uLm8gKyBtb3JlCisjICAgfAorIyAgICstLTwgJChidXN5Ym94LW1haW4pCisjICAgfCAgICArLS08IGRyaXZlci9idWlsdC1pbi5vIG1tL2J1aWx0LWluLm8gKyBtb3JlCisjICAgfAorIyAgICstPCBrYWxsc3ltcy5vIChzZWUgZGVzY3JpcHRpb24gaW4gQ09ORklHX0tBTExTWU1TIHNlY3Rpb24pCisjCisjIGJ1c3lib3ggdmVyc2lvbiAodW5hbWUgLXYpIGNhbm5vdCBiZSB1cGRhdGVkIGR1cmluZyBub3JtYWwKKyMgZGVzY2VuZGluZy1pbnRvLXN1YmRpcnMgcGhhc2Ugc2luY2Ugd2UgZG8gbm90IHlldCBrbm93IGlmIHdlIG5lZWQgdG8KKyMgdXBkYXRlIGJ1c3lib3guCisjIFRoZXJlZm9yZSB0aGlzIHN0ZXAgaXMgZGVsYXllZCB1bnRpbCBqdXN0IGJlZm9yZSBmaW5hbCBsaW5rIG9mIGJ1c3lib3ggLQorIyBleGNlcHQgaW4gdGhlIGthbGxzeW1zIGNhc2Ugd2hlcmUgaXQgaXMgZG9uZSBqdXN0IGJlZm9yZSBhZGRpbmcgdGhlCisjIHN5bWJvbHMgdG8gdGhlIGtlcm5lbC4KKyMKKyMgU3lzdGVtLm1hcCBpcyBnZW5lcmF0ZWQgdG8gZG9jdW1lbnQgYWRkcmVzc2VzIG9mIGFsbCBrZXJuZWwgc3ltYm9scworCitidXN5Ym94LWFsbCAgOj0gJChjb3JlLXkpICQobGlicy15KQorCisjIFJ1bGUgdG8gbGluayBidXN5Ym94IC0gYWxzbyB1c2VkIGR1cmluZyBDT05GSUdfS0FMTFNZTVMKKyMgTWF5IGJlIG92ZXJyaWRkZW4gYnkgYXJjaC8kKEFSQ0gpL01ha2VmaWxlCitxdWlldF9jbWRfYnVzeWJveF9fID89IExJTksgICAgJEAKKyAgICAgIGNtZF9idXN5Ym94X18gPz0gJChzcmN0cmVlKS9zY3JpcHRzL3RyeWxpbmsgXAorICAgICAgIiRAIiBcCisgICAgICAiJChDQykiIFwKKyAgICAgICIkKENGTEFHUykgJChDRkxBR1NfYnVzeWJveCkiIFwKKyAgICAgICIkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykiIFwKKyAgICAgICIkKGNvcmUteSkiIFwKKyAgICAgICIkKGxpYnMteSkiIFwKKyAgICAgICIkKExETElCUykiCisKKyMgR2VuZXJhdGUgU3lzdGVtLm1hcAorcXVpZXRfY21kX3N5c21hcCA9IFNZU01BUAorICAgICAgY21kX3N5c21hcCA9ICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvbWtzeXNtYXAKKworIyBMaW5rIG9mIGJ1c3lib3gKKyMgSWYgQ09ORklHX0tBTExTWU1TIGlzIHNldCAudmVyc2lvbiBpcyBhbHJlYWR5IHVwZGF0ZWQKKyMgR2VuZXJhdGUgU3lzdGVtLm1hcCBhbmQgdmVyaWZ5IHRoYXQgdGhlIGNvbnRlbnQgaXMgY29uc2lzdGVudAorIyBVc2UgKyBpbiBmcm9udCBvZiB0aGUgYnVzeWJveF92ZXJzaW9uIHJ1bGUgdG8gc2lsZW50IHdhcm5pbmcgd2l0aCBtYWtlIC1qMgorIyBGaXJzdCBjb21tYW5kIGlzICc6JyB0byBhbGxvdyB1cyB0byB1c2UgKyBpbiBmcm9udCBvZiB0aGUgcnVsZQorZGVmaW5lIHJ1bGVfYnVzeWJveF9fCisJOgorCSQoY2FsbCBjbWQsYnVzeWJveF9fKQorCSQoUSllY2hvICdjbWRfJEAgOj0gJChjbWRfYnVzeWJveF9fKScgPiAkKEBEKS8uJChARikuY21kCitlbmRlZgorCisKK2lmZGVmIENPTkZJR19LQUxMU1lNUworIyBHZW5lcmF0ZSBzZWN0aW9uIGxpc3RpbmcgYWxsIHN5bWJvbHMgYW5kIGFkZCBpdCBpbnRvIGJ1c3lib3ggJChrYWxsc3ltcy5vKQorIyBJdCdzIGEgdGhyZWUgc3RhZ2UgcHJvY2VzczoKKyMgbyAudG1wX2J1c3lib3gxIGhhcyBhbGwgc3ltYm9scyBhbmQgc2VjdGlvbnMsIGJ1dCBfX2thbGxzeW1zIGlzCisjICAgZW1wdHkKKyMgICBSdW5uaW5nIGthbGxzeW1zIG9uIHRoYXQgZ2l2ZXMgdXMgLnRtcF9rYWxsc3ltczEubyB3aXRoCisjICAgdGhlIHJpZ2h0IHNpemUgLSBidXN5Ym94IHZlcnNpb24gKHVuYW1lIC12KSBpcyB1cGRhdGVkIGR1cmluZyB0aGlzIHN0ZXAKKyMgbyAudG1wX2J1c3lib3gyIG5vdyBoYXMgYSBfX2thbGxzeW1zIHNlY3Rpb24gb2YgdGhlIHJpZ2h0IHNpemUsCisjICAgYnV0IGR1ZSB0byB0aGUgYWRkZWQgc2VjdGlvbiwgc29tZSBhZGRyZXNzZXMgaGF2ZSBzaGlmdGVkLgorIyAgIEZyb20gaGVyZSwgd2UgZ2VuZXJhdGUgYSBjb3JyZWN0IC50bXBfa2FsbHN5bXMyLm8KKyMgbyBUaGUgY29ycmVjdCAudG1wX2thbGxzeW1zMi5vIGlzIGxpbmtlZCBpbnRvIHRoZSBmaW5hbCBidXN5Ym94LgorIyBvIFZlcmlmeSB0aGF0IHRoZSBTeXN0ZW0ubWFwIGZyb20gYnVzeWJveCBtYXRjaGVzIHRoZSBtYXAgZnJvbQorIyAgIC50bXBfYnVzeWJveDIsIGp1c3QgaW4gY2FzZSB3ZSBkaWQgbm90IGdlbmVyYXRlIGthbGxzeW1zIGNvcnJlY3RseS4KKyMgbyBJZiBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBzZXQsIGRvIGFuIGV4dHJhIHBhc3MgdXNpbmcKKyMgICAudG1wX2J1c3lib3gzIGFuZCAudG1wX2thbGxzeW1zMy5vLiAgVGhpcyBpcyBvbmx5IG1lYW50IGFzIGEKKyMgICB0ZW1wb3JhcnkgYnlwYXNzIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8gYmUgYnVpbHQgd2hpbGUgdGhlCisjICAgbWFpbnRhaW5lcnMgd29yayBvdXQgd2hhdCB3ZW50IHdyb25nIHdpdGgga2FsbHN5bXMuCisKK2lmZGVmIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTCitsYXN0X2thbGxzeW1zIDo9IDMKK2Vsc2UKK2xhc3Rfa2FsbHN5bXMgOj0gMgorZW5kaWYKKwora2FsbHN5bXMubyA6PSAudG1wX2thbGxzeW1zJChsYXN0X2thbGxzeW1zKS5vCisKK2RlZmluZSB2ZXJpZnlfa2FsbHN5bXMKKwkkKFEpJChpZiAkKCQocXVpZXQpY21kX3N5c21hcCksICAgICAgICAgICAgICAgICAgICAgICBcCisJICBlY2hvICcgICQoJChxdWlldCljbWRfc3lzbWFwKSAudG1wX1N5c3RlbS5tYXAnICYmKSAgXAorCSAgJChjbWRfc3lzbWFwKSAudG1wX2J1c3lib3gkKGxhc3Rfa2FsbHN5bXMpIC50bXBfU3lzdGVtLm1hcAorCSQoUSljbXAgLXMgU3lzdGVtLm1hcCAudG1wX1N5c3RlbS5tYXAgfHwgICAgICAgICAgICAgIFwKKwkJKGVjaG8gSW5jb25zaXN0ZW50IGthbGxzeW1zIGRhdGE7ICAgICAgICAgICAgIFwKKwkJIGVjaG8gVHJ5IHNldHRpbmcgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M7IFwKKwkJIHJtIC50bXBfa2FsbHN5bXMqIDsgL2Jpbi9mYWxzZSApCitlbmRlZgorCisjIFVwZGF0ZSBidXN5Ym94IHZlcnNpb24gYmVmb3JlIGxpbmsKKyMgVXNlICsgaW4gZnJvbnQgb2YgdGhpcyBydWxlIHRvIHNpbGVudCB3YXJuaW5nIGFib3V0IG1ha2UgLWoxCisjIEZpcnN0IGNvbW1hbmQgaXMgJzonIHRvIGFsbG93IHVzIHRvIHVzZSArIGluIGZyb250IG9mIHRoaXMgcnVsZQorY21kX2tzeW1fbGQgPSAkKGNtZF9idXN5Ym94X18pCitkZWZpbmUgcnVsZV9rc3ltX2xkCisJOgorCSskKGNhbGwgY21kLGJ1c3lib3hfdmVyc2lvbikKKwkkKGNhbGwgY21kLGJ1c3lib3hfXykKKwkkKFEpZWNobyAnY21kXyRAIDo9ICQoY21kX2J1c3lib3hfXyknID4gJChARCkvLiQoQEYpLmNtZAorZW5kZWYKKworIyBHZW5lcmF0ZSAuUyBmaWxlIHdpdGggYWxsIGtlcm5lbCBzeW1ib2xzCitxdWlldF9jbWRfa2FsbHN5bXMgPSBLU1lNICAgICRACisgICAgICBjbWRfa2FsbHN5bXMgPSAkKE5NKSAtbiAkPCB8ICQoS0FMTFNZTVMpIFwKKyAgICAgICAgICAgICAgICAgICAgICQoaWYgJChDT05GSUdfS0FMTFNZTVNfQUxMKSwtLWFsbC1zeW1ib2xzKSA+ICRACisKKy50bXBfa2FsbHN5bXMxLm8gLnRtcF9rYWxsc3ltczIubyAudG1wX2thbGxzeW1zMy5vOiAlLm86ICUuUyBzY3JpcHRzIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGFzX29fUykKKworLnRtcF9rYWxsc3ltcyUuUzogLnRtcF9idXN5Ym94JSAkKEtBTExTWU1TKQorCSQoY2FsbCBjbWQsa2FsbHN5bXMpCisKKyMgLnRtcF9idXN5Ym94MSBtdXN0IGJlIGNvbXBsZXRlIGV4Y2VwdCBrYWxsc3ltcywgc28gdXBkYXRlIGJ1c3lib3ggdmVyc2lvbgorLnRtcF9idXN5Ym94MTogJChidXN5Ym94LWxkcykgJChidXN5Ym94LWFsbCkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGtzeW1fbGQpCisKKy50bXBfYnVzeWJveDI6ICQoYnVzeWJveC1sZHMpICQoYnVzeWJveC1hbGwpIC50bXBfa2FsbHN5bXMxLm8gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxidXN5Ym94X18pCisKKy50bXBfYnVzeWJveDM6ICQoYnVzeWJveC1sZHMpICQoYnVzeWJveC1hbGwpIC50bXBfa2FsbHN5bXMyLm8gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxidXN5Ym94X18pCisKKyMgTmVlZHMgdG8gdmlzaXQgc2NyaXB0cy8gYmVmb3JlICQoS0FMTFNZTVMpIGNhbiBiZSB1c2VkLgorJChLQUxMU1lNUyk6IHNjcmlwdHMgOworCisjIEdlbmVyYXRlIHNvbWUgZGF0YSBmb3IgZGVidWdnaW5nIHN0cmFuZ2Uga2FsbHN5bXMgcHJvYmxlbXMKK2RlYnVnX2thbGxzeW1zOiAudG1wX21hcCQobGFzdF9rYWxsc3ltcykKKworLnRtcF9tYXAlOiAudG1wX2J1c3lib3glIEZPUkNFCisJKCQoT0JKRFVNUCkgLWggJDwgfCAkKEFXSykgJy9eICtbMC05XS97cHJpbnQgJCQ0ICIgMCAiICQkMn0nOyAkKE5NKSAkPCkgfCBzb3J0ID4gJEAKKworLnRtcF9tYXAzOiAudG1wX21hcDIKKworLnRtcF9tYXAyOiAudG1wX21hcDEKKworZW5kaWYgIyBpZmRlZiBDT05GSUdfS0FMTFNZTVMKKworIyBidXN5Ym94IGltYWdlIC0gaW5jbHVkaW5nIHVwZGF0ZWQga2VybmVsIHN5bWJvbHMKK2J1c3lib3hfdW5zdHJpcHBlZDogJChidXN5Ym94LWFsbCkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGJ1c3lib3hfXykKKwkkKFEpcm0gLWYgLm9sZF92ZXJzaW9uCisKK2J1c3lib3g6IGJ1c3lib3hfdW5zdHJpcHBlZAoraWZlcSAoJChTS0lQX1NUUklQKSx5KQorCSQoUSljcCAkPCAkQAorZWxzZQorCSQoUSkkKFNUUklQKSAtcyAtLXJlbW92ZS1zZWN0aW9uPS5ub3RlIC0tcmVtb3ZlLXNlY3Rpb249LmNvbW1lbnQgXAorCQlidXN5Ym94X3Vuc3RyaXBwZWQgLW8gJEAKKyMgc3RyaXAgaXMgY29uZnVzZWQgYnkgUElFIGV4ZWN1dGFibGUgYW5kIGRvZXMgbm90IHNldCBleGVjIGJpdHMKKwkkKFEpY2htb2QgYSt4ICRACitlbmRpZgorCisjIFRoZSBhY3R1YWwgb2JqZWN0cyBhcmUgZ2VuZXJhdGVkIHdoZW4gZGVzY2VuZGluZywKKyMgbWFrZSBzdXJlIG5vIGltcGxpY2l0IHJ1bGUga2lja3MgaW4KKyQoc29ydCAkKGJ1c3lib3gtYWxsKSk6ICQoYnVzeWJveC1kaXJzKSA7CisKKyMgSGFuZGxlIGRlc2NlbmRpbmcgaW50byBzdWJkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJChidXN5Ym94LWRpcnMpCisjIFByZXNldCBsb2NhbGUgdmFyaWFibGVzIHRvIHNwZWVkIHVwIHRoZSBidWlsZCBwcm9jZXNzLiBMaW1pdCBsb2NhbGUKKyMgdHdlYWtzIHRvIHRoaXMgc3BvdCB0byBhdm9pZCB3cm9uZyBsYW5ndWFnZSBzZXR0aW5ncyB3aGVuIHJ1bm5pbmcKKyMgbWFrZSBtZW51Y29uZmlnIGV0Yy4KKyMgRXJyb3IgbWVzc2FnZXMgc3RpbGwgYXBwZWFycyBpbiB0aGUgb3JpZ2luYWwgbGFuZ3VhZ2UKKworUEhPTlkgKz0gJChidXN5Ym94LWRpcnMpCiskKGJ1c3lib3gtZGlycyk6IHByZXBhcmUgc2NyaXB0cworCSQoUSkkKE1BS0UpICQoYnVpbGQpPSRACisKKyMgQnVpbGQgdGhlIGtlcm5lbCByZWxlYXNlIHN0cmluZworIyBUaGUgS0VSTkVMUkVMRUFTRSBpcyBzdG9yZWQgaW4gYSBmaWxlIG5hbWVkIC5rZXJuZWxyZWxlYXNlCisjIHRvIGJlIHVzZWQgd2hlbiBleGVjdXRpbmcgZm9yIGV4YW1wbGUgbWFrZSBpbnN0YWxsIG9yIG1ha2UgbW9kdWxlc19pbnN0YWxsCisjCisjIFRha2UgdGhlIGNvbnRlbnRzIG9mIGFueSBmaWxlcyBjYWxsZWQgbG9jYWx2ZXJzaW9uKiBhbmQgdGhlIGNvbmZpZworIyB2YXJpYWJsZSBDT05GSUdfTE9DQUxWRVJTSU9OIGFuZCBhcHBlbmQgdGhlbSB0byBLRVJORUxSRUxFQVNFLgorIyBMT0NBTFZFUlNJT04gZnJvbSB0aGUgY29tbWFuZCBsaW5lIG92ZXJyaWRlIGFsbCBvZiB0aGlzCisKK251bGxzdHJpbmcgOj0KK3NwYWNlICAgICAgOj0gJChudWxsc3RyaW5nKSAjIGVuZCBvZiBsaW5lCisKK19fX2xvY2FsdmVyID0gJChvYmp0cmVlKS9sb2NhbHZlcnNpb24qICQoc3JjdHJlZSkvbG9jYWx2ZXJzaW9uKgorX19sb2NhbHZlciAgPSAkKHNvcnQgJCh3aWxkY2FyZCAkKF9fX2xvY2FsdmVyKSkpCisjIHNraXAgYmFja3VwIGZpbGVzIChjb250YWluaW5nICd+JykKK19sb2NhbHZlciA9ICQoZm9yZWFjaCBmLCAkKF9fbG9jYWx2ZXIpLCAkKGlmICQoZmluZHN0cmluZyB+LCAkKGYpKSwsJChmKSkpCisKK2xvY2FsdmVyID0gJChzdWJzdCAkKHNwYWNlKSwsIFwKKwkgICAkKHNoZWxsIGNhdCAvZGV2L251bGwgJChfbG9jYWx2ZXIpKSBcCisJICAgJChwYXRzdWJzdCAiJSIsJSwkKENPTkZJR19MT0NBTFZFUlNJT04pKSkKKworIyBJZiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgc2V0IHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGlzIGNhbGxlZAorIyBhbmQgaWYgdGhlIFNDTSBpcyBrbm93IGEgdGFnIGZyb20gdGhlIFNDTSBpcyBhcHBlbmRlZC4KKyMgVGhlIGFwcGVuZGVkIHRhZyBpcyBkZXRlcm1pbmRlZCBieSB0aGUgU0NNIHVzZWQuCisjCisjIEN1cnJlbnRseSwgb25seSBnaXQgaXMgc3VwcG9ydGVkLgorIyBPdGhlciBTQ01zIGNhbiBlZGl0IHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlCisjIGNoZWNrcyBhcyBuZWVkZWQuCitpZmRlZiBfQkJfRElTQUJMRURfQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPCisJX2xvY2FsdmVyLWF1dG8gPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSBcCisJICAgICAgICAgICAgICAgICAgJChzcmN0cmVlKS9zY3JpcHRzL3NldGxvY2FsdmVyc2lvbiAkKHNyY3RyZWUpKQorCWxvY2FsdmVyLWF1dG8gID0gJChMT0NBTFZFUlNJT04pJChfbG9jYWx2ZXItYXV0bykKK2VuZGlmCisKK2xvY2FsdmVyLWZ1bGwgPSAkKGxvY2FsdmVyKSQobG9jYWx2ZXItYXV0bykKKworIyBTdG9yZSAobmV3KSBLRVJORUxSRUxBU0Ugc3RyaW5nIGluIC5rZXJuZWxyZWxlYXNlCitrZXJuZWxyZWxlYXNlID0gJChLRVJORUxWRVJTSU9OKSQobG9jYWx2ZXItZnVsbCkKKy5rZXJuZWxyZWxlYXNlOiBGT1JDRQorCSQoUSlybSAtZiAkQAorCSQoUSllY2hvICQoa2VybmVscmVsZWFzZSkgPiAkQAorCisKKyMgVGhpbmdzIHdlIG5lZWQgdG8gZG8gYmVmb3JlIHdlIHJlY3Vyc2l2ZWx5IHN0YXJ0IGJ1aWxkaW5nIHRoZSBrZXJuZWwKKyMgb3IgdGhlIG1vZHVsZXMgYXJlIGxpc3RlZCBpbiAicHJlcGFyZSIuCisjIEEgbXVsdGkgbGV2ZWwgYXBwcm9hY2ggaXMgdXNlZC4gcHJlcGFyZU4gaXMgcHJvY2Vzc2VkIGJlZm9yZSBwcmVwYXJlTi0xLgorIyBhcmNocHJlcGFyZSBpcyB1c2VkIGluIGFyY2ggTWFrZWZpbGVzIGFuZCB3aGVuIHByb2Nlc3NlZCBhc20gc3ltbGluaywKKyMgdmVyc2lvbi5oIGFuZCBzY3JpcHRzX2Jhc2ljIGlzIHByb2Nlc3NlZCAvIGNyZWF0ZWQuCisKKyMgTGlzdGVkIGluIGRlcGVuZGVuY3kgb3JkZXIKK1BIT05ZICs9IHByZXBhcmUgYXJjaHByZXBhcmUgcHJlcGFyZTAgcHJlcGFyZTEgcHJlcGFyZTIgcHJlcGFyZTMKKworIyBwcmVwYXJlLWFsbCBpcyBkZXByZWNhdGVkLCB1c2UgcHJlcGFyZSBhcyB2YWxpZCByZXBsYWNlbWVudAorUEhPTlkgKz0gcHJlcGFyZS1hbGwKKworIyBwcmVwYXJlMyBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIGFyZSBidWlsZGluZyBpbiBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnksCisjIGFuZCBpZiBzbyBkbzoKKyMgMSkgQ2hlY2sgdGhhdCBtYWtlIGhhcyBub3QgYmVlbiBleGVjdXRlZCBpbiB0aGUga2VybmVsIHNyYyAkKHNyY3RyZWUpCisjIDIpIENyZWF0ZSB0aGUgaW5jbHVkZTIgZGlyZWN0b3J5LCB1c2VkIGZvciB0aGUgc2Vjb25kIGFzbSBzeW1saW5rCitwcmVwYXJlMzogLmtlcm5lbHJlbGVhc2UKK2lmbmVxICgkKEtCVUlMRF9TUkMpLCkKKwlAZWNobyAnICBVc2luZyAkKHNyY3RyZWUpIGFzIHNvdXJjZSBmb3IgYnVzeWJveCcKKwkkKFEpaWYgWyAtZiAkKHNyY3RyZWUpLy5jb25maWcgXTsgdGhlbiBcCisJCWVjaG8gIiAgJChzcmN0cmVlKSBpcyBub3QgY2xlYW4sIHBsZWFzZSBydW4gJ21ha2UgbXJwcm9wZXInIjtcCisJCWVjaG8gIiAgaW4gdGhlICckKHNyY3RyZWUpJyBkaXJlY3RvcnkuIjtcCisJCS9iaW4vZmFsc2U7IFwKKwlmaTsKKwkkKFEpaWYgWyAhIC1kIGluY2x1ZGUyIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZTI7IGZpOworCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKSBpbmNsdWRlMi9hc20KK2VuZGlmCisKKyMgcHJlcGFyZTIgY3JlYXRlcyBhIG1ha2VmaWxlIGlmIHVzaW5nIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeQorcHJlcGFyZTI6IHByZXBhcmUzIG91dHB1dG1ha2VmaWxlCisKK3ByZXBhcmUxOiBwcmVwYXJlMiBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKK2lmbmVxICgkKEtCVUlMRF9NT0RVTEVTKSwpCisJJChRKW1rZGlyIC1wICQoTU9EVkVSRElSKQorCSQoUSlybSAtZiAkKE1PRFZFUkRJUikvKgorZW5kaWYKKworYXJjaHByZXBhcmU6IHByZXBhcmUxIHNjcmlwdHNfYmFzaWMgYXBwbGV0c19kaXIKKworcHJlcGFyZTA6IGFyY2hwcmVwYXJlIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9LgorCisjIEFsbCB0aGUgcHJlcGFyaW5nLi4KK3ByZXBhcmUgcHJlcGFyZS1hbGw6IHByZXBhcmUwCisKKyMJTGVhdmUgdGhpcyBhcyBkZWZhdWx0IGZvciBwcmVwcm9jZXNzaW5nIGJ1c3lib3gubGRzLlMsIHdoaWNoIGlzIG5vdworIwlkb25lIGluIGFyY2gvJChBUkNIKS9rZXJuZWwvTWFrZWZpbGUKKworZXhwb3J0IENQUEZMQUdTX2J1c3lib3gubGRzICs9IC1QIC1DIC1VJChBUkNIKQorCisjIAlGSVhNRTogVGhlIGFzbSBzeW1saW5rIGNoYW5nZXMgd2hlbiAkKEFSQ0gpIGNoYW5nZXMuIFRoYXQncworIwloYXJkIHRvIGRldGVjdCwgYnV0IEkgc3VwcG9zZSAibWFrZSBtcnByb3BlciIgaXMgYSBnb29kIGlkZWEKKyMJYmVmb3JlIHN3aXRjaGluZyBiZXR3ZWVuIGFyY2hzIGFueXdheS4KKworI2Jib3gjIGluY2x1ZGUvYXNtOgorI2Jib3gjIAlAZWNobyAnICBTWU1MSU5LICRAIC0+IGluY2x1ZGUvYXNtLSQoQVJDSCknCisjYmJveCMgCSQoUSlpZiBbICEgLWQgaW5jbHVkZSBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGU7IGZpOworI2Jib3gjIAlAbG4gLWZzbiBhc20tJChBUkNIKSAkQAorCisjIAlTcGxpdCBhdXRvY29uZi5oIGludG8gaW5jbHVkZS9saW51eC9jb25maWcvKgorcXVpZXRfY21kX2dlbl9iYmNvbmZpZ29wdHMgPSBHRU4gICAgIGluY2x1ZGUvYmJjb25maWdvcHRzLmgKKyAgICAgIGNtZF9nZW5fYmJjb25maWdvcHRzID0gJChzcmN0cmVlKS9zY3JpcHRzL21rY29uZmlncyBpbmNsdWRlL2JiY29uZmlnb3B0cy5oIGluY2x1ZGUvYmJjb25maWdvcHRzX2J6Mi5oCitxdWlldF9jbWRfc3BsaXRfYXV0b2NvbmYgICA9IFNQTElUICAgaW5jbHVkZS9hdXRvY29uZi5oIC0+IGluY2x1ZGUvY29uZmlnLyoKKyAgICAgIGNtZF9zcGxpdF9hdXRvY29uZiAgID0gc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlIGluY2x1ZGUvYXV0b2NvbmYuaCBpbmNsdWRlL2NvbmZpZworI2Jib3gjIHBpZ2d5YmFja2VkIGdlbmVyYXRpb24gb2YgZmV3IC5oIGZpbGVzCitpbmNsdWRlL2NvbmZpZy9NQVJLRVI6IHNjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZSBpbmNsdWRlL2F1dG9jb25mLmgKKwkkKGNhbGwgY21kLHNwbGl0X2F1dG9jb25mKQorCSQoY2FsbCBjbWQsZ2VuX2JiY29uZmlnb3B0cykKKwlAdG91Y2ggJEAKKworIyBHZW5lcmF0ZSBzb21lIGZpbGVzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEtFUk5FTFJFTEVBU0UgY2FuIGNoYW5nZSBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXMsIG1lYW5pbmcgdmVyc2lvbi5oCisjIG5lZWRzIHRvIGJlIHVwZGF0ZWQsIHNvIHRoaXMgY2hlY2sgaXMgZm9yY2VkIG9uIGFsbCBidWlsZHMKKwordXRzX2xlbiA6PSA2NAorCitkZWZpbmUgZmlsZWNoa192ZXJzaW9uLmgKKwlpZiBbIGBlY2hvIC1uICIkKEtFUk5FTFJFTEVBU0UpIiB8IHdjIC1jIGAgLWd0ICQodXRzX2xlbikgXTsgdGhlbiBcCisJICBlY2hvICciJChLRVJORUxSRUxFQVNFKSIgZXhjZWVkcyAkKHV0c19sZW4pIGNoYXJhY3RlcnMnID4mMjsgXAorCSAgZXhpdCAxOyBcCisJZmk7IFwKKwkoZWNobyBcI2RlZmluZSBVVFNfUkVMRUFTRSBcIiQoS0VSTkVMUkVMRUFTRSlcIjsgXAorCSAgZWNobyBcI2RlZmluZSBMSU5VWF9WRVJTSU9OX0NPREUgYGV4cHIgJChWRVJTSU9OKSBcXCogNjU1MzYgKyAkKFBBVENITEVWRUwpIFxcKiAyNTYgKyAkKFNVQkxFVkVMKWA7IFwKKwkgZWNobyAnI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSknOyBcCisJKQorZW5kZWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUEhPTlkgKz0gZGVwZW5kIGRlcAorZGVwZW5kIGRlcDoKKwlAZWNobyAnKioqIFdhcm5pbmc6IG1ha2UgJEAgaXMgdW5uZWNlc3Nhcnkgbm93LicKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTW9kdWxlcworCitpZmRlZiBfQkJfRElTQUJMRURfQ09ORklHX01PRFVMRVMKKworIyAJQnkgZGVmYXVsdCwgYnVpbGQgbW9kdWxlcyBhcyB3ZWxsCisKK2FsbDogbW9kdWxlcworCisjCUJ1aWxkIG1vZHVsZXMKKworUEhPTlkgKz0gbW9kdWxlcworbW9kdWxlczogJChidXN5Ym94LWRpcnMpICQoaWYgJChLQlVJTERfQlVJTFRJTiksYnVzeWJveCkKKwlAZWNobyAnICBCdWlsZGluZyBtb2R1bGVzLCBzdGFnZSAyLic7CisJJChRKSQoTUFLRSkgLXJSIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisKKworIyBUYXJnZXQgdG8gcHJlcGFyZSBidWlsZGluZyBleHRlcm5hbCBtb2R1bGVzCitQSE9OWSArPSBtb2R1bGVzX3ByZXBhcmUKK21vZHVsZXNfcHJlcGFyZTogcHJlcGFyZSBzY3JpcHRzCisKKyMgVGFyZ2V0IHRvIGluc3RhbGwgbW9kdWxlcworUEhPTlkgKz0gbW9kdWxlc19pbnN0YWxsCittb2R1bGVzX2luc3RhbGw6IF9tb2RpbnN0XyBfbW9kaW5zdF9wb3N0CisKK1BIT05ZICs9IF9tb2RpbnN0XworX21vZGluc3RfOgorCUBpZiBbIC16ICJgJChERVBNT0QpIC1WIDI+L2Rldi9udWxsIHwgZ3JlcCBtb2R1bGUtaW5pdC10b29sc2AiIF07IHRoZW4gXAorCQllY2hvICJXYXJuaW5nOiB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBtb2R1bGUtaW5pdC10b29scyI7IFwKKwkJZWNobyAiU2VlIGh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvZG9jcy9wb3N0LWhhbGxvd2Vlbi0yLjYudHh0IjtcCisJCXNsZWVwIDE7IFwKKwlmaQorCUBybSAtcmYgJChNT0RMSUIpL2tlcm5lbAorCUBybSAtZiAkKE1PRExJQikvc291cmNlCisJQG1rZGlyIC1wICQoTU9ETElCKS9rZXJuZWwKKwlAbG4gLXMgJChzcmN0cmVlKSAkKE1PRExJQikvc291cmNlCisJQGlmIFsgISAkKG9ianRyZWUpIC1lZiAgJChNT0RMSUIpL2J1aWxkIF07IHRoZW4gXAorCQlybSAtZiAkKE1PRExJQikvYnVpbGQgOyBcCisJCWxuIC1zICQob2JqdHJlZSkgJChNT0RMSUIpL2J1aWxkIDsgXAorCWZpCisJJChRKSQoTUFLRSkgLXJSIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0CisKKyMgSWYgU3lzdGVtLm1hcCBleGlzdHMsIHJ1biBkZXBtb2QuICBUaGlzIGRlbGliZXJhdGVseSBkb2VzIG5vdCBoYXZlIGEKKyMgZGVwZW5kZW5jeSBvbiBTeXN0ZW0ubWFwIHNpbmNlIHRoYXQgd291bGQgcnVuIHRoZSBkZXBlbmRlbmN5IHRyZWUgb24KKyMgYnVzeWJveC4gIFRoaXMgZGVwbW9kIGlzIG9ubHkgZm9yIGNvbnZlbmllbmNlIHRvIGdpdmUgdGhlIGluaXRpYWwKKyMgYm9vdCBhIG1vZHVsZXMuZGVwIGV2ZW4gYmVmb3JlIC8gaXMgbW91bnRlZCByZWFkLXdyaXRlLiAgSG93ZXZlciB0aGUKKyMgYm9vdCBzY3JpcHQgZGVwbW9kIGlzIHRoZSBtYXN0ZXIgdmVyc2lvbi4KK2lmZXEgIiQoc3RyaXAgJChJTlNUQUxMX01PRF9QQVRIKSkiICIiCitkZXBtb2Rfb3B0cwk6PQorZWxzZQorZGVwbW9kX29wdHMJOj0gLWIgJChJTlNUQUxMX01PRF9QQVRIKSAtcgorZW5kaWYKK1BIT05ZICs9IF9tb2RpbnN0X3Bvc3QKK19tb2RpbnN0X3Bvc3Q6IF9tb2RpbnN0XworCWlmIFsgLXIgU3lzdGVtLm1hcCAtYSAteCAkKERFUE1PRCkgXTsgdGhlbiAkKERFUE1PRCkgLWFlIC1GIFN5c3RlbS5tYXAgJChkZXBtb2Rfb3B0cykgJChLRVJORUxSRUxFQVNFKTsgZmkKKworZWxzZSAjIENPTkZJR19NT0RVTEVTCisKKyMgTW9kdWxlcyBub3QgY29uZmlndXJlZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbW9kdWxlcyBtb2R1bGVzX2luc3RhbGw6IEZPUkNFCisJQGVjaG8KKwlAZWNobyAiVGhlIHByZXNlbnQgYnVzeWJveCBjb25maWd1cmF0aW9uIGhhcyBtb2R1bGVzIGRpc2FibGVkLiIKKwlAZWNobyAiVHlwZSAnbWFrZSBjb25maWcnIGFuZCBlbmFibGUgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQuIgorCUBlY2hvICJUaGVuIGJ1aWxkIGEga2VybmVsIHdpdGggbW9kdWxlIHN1cHBvcnQgZW5hYmxlZC4iCisJQGVjaG8KKwlAZXhpdCAxCisKK2VuZGlmICMgQ09ORklHX01PRFVMRVMKKworIyMjCisjIENsZWFuaW5nIGlzIGRvbmUgb24gdGhyZWUgbGV2ZWxzLgorIyBtYWtlIGNsZWFuICAgICBEZWxldGUgbW9zdCBnZW5lcmF0ZWQgZmlsZXMKKyMgICAgICAgICAgICAgICAgTGVhdmUgZW5vdWdoIHRvIGJ1aWxkIGV4dGVybmFsIG1vZHVsZXMKKyMgbWFrZSBtcnByb3BlciAgRGVsZXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGFuZCBhbGwgZ2VuZXJhdGVkIGZpbGVzCisjIG1ha2UgZGlzdGNsZWFuIFJlbW92ZSBlZGl0b3IgYmFja3VwIGZpbGVzLCBwYXRjaCBsZWZ0b3ZlciBmaWxlcyBhbmQgdGhlIGxpa2UKKworIyBEaXJlY3RvcmllcyAmIGZpbGVzIHJlbW92ZWQgd2l0aCAnbWFrZSBjbGVhbicKK0NMRUFOX0RJUlMgICs9ICQoTU9EVkVSRElSKSBfaW5zdGFsbCAwX2xpYgorQ0xFQU5fRklMRVMgKz0JYnVzeWJveCBidXN5Ym94X3Vuc3RyaXBwZWQqIGJ1c3lib3gubGlua3MgXAorICAgICAgICAgICAgICAgIFN5c3RlbS5tYXAgLmtlcm5lbHJlbGVhc2UgXAorICAgICAgICAgICAgICAgIC50bXBfa2FsbHN5bXMqIC50bXBfdmVyc2lvbiAudG1wX2J1c3lib3gqIC50bXBfU3lzdGVtLm1hcAorCisjIERpcmVjdG9yaWVzICYgZmlsZXMgcmVtb3ZlZCB3aXRoICdtYWtlIG1ycHJvcGVyJworTVJQUk9QRVJfRElSUyAgKz0gaW5jbHVkZS9jb25maWcgaW5jbHVkZTIKK01SUFJPUEVSX0ZJTEVTICs9IC5jb25maWcgLmNvbmZpZy5vbGQgaW5jbHVkZS9hc20gLnZlcnNpb24gLm9sZF92ZXJzaW9uIFwKKwkJICBpbmNsdWRlL05VTV9BUFBMRVRTLmggXAorCQkgIGluY2x1ZGUvYXV0b2NvbmYuaCBcCisJCSAgaW5jbHVkZS9iYmNvbmZpZ29wdHMuaCBcCisJCSAgaW5jbHVkZS9iYmNvbmZpZ29wdHNfYnoyLmggXAorCQkgIGluY2x1ZGUvdXNhZ2VfY29tcHJlc3NlZC5oIFwKKwkJICBpbmNsdWRlL2FwcGxldF90YWJsZXMuaCBcCisJCSAgaW5jbHVkZS9hcHBsZXRzLmggXAorCQkgIGluY2x1ZGUvdXNhZ2UuaCBcCisJCSAgYXBwbGV0cy91c2FnZSBcCisJCSAgLmtlcm5lbHJlbGVhc2UgTW9kdWxlLnN5bXZlcnMgdGFncyBUQUdTIGNzY29wZSogXAorCQkgIGJ1c3lib3hfb2xkCisKKyMgY2xlYW4gLSBEZWxldGUgbW9zdCwgYnV0IGxlYXZlIGVub3VnaCB0byBidWlsZCBleHRlcm5hbCBtb2R1bGVzCisjCitjbGVhbjogcm0tZGlycyAgOj0gJChDTEVBTl9ESVJTKQorY2xlYW46IHJtLWZpbGVzIDo9ICQoQ0xFQU5fRklMRVMpCitjbGVhbi1kaXJzICAgICAgOj0gJChhZGRwcmVmaXggX2NsZWFuXywkKHNyY3RyZWUpICQoYnVzeWJveC1hbGxkaXJzKSkKKworUEhPTlkgKz0gJChjbGVhbi1kaXJzKSBjbGVhbiBhcmNoY2xlYW4KKyQoY2xlYW4tZGlycyk6CisJJChRKSQoTUFLRSkgJChjbGVhbik9JChwYXRzdWJzdCBfY2xlYW5fJSwlLCRAKQorCitjbGVhbjogYXJjaGNsZWFuICQoY2xlYW4tZGlycykKKwkkKGNhbGwgY21kLHJtZGlycykKKwkkKGNhbGwgY21kLHJtZmlsZXMpCisJQGZpbmQgLiAkKFJDU19GSU5EX0lHTk9SRSkgXAorCQlcKCAtbmFtZSAnKi5bb2FzXScgLW8gLW5hbWUgJyoua28nIC1vIC1uYW1lICcuKi5jbWQnIFwKKwkJLW8gLW5hbWUgJy4qLmQnIC1vIC1uYW1lICcuKi50bXAnIC1vIC1uYW1lICcqLm1vZC5jJyBcKSBcCisJCS10eXBlIGYgLXByaW50IHwgeGFyZ3Mgcm0gLWYKKworUEhPTlkgKz0gZG9jLWNsZWFuCitkb2MtY2xlYW46IHJtLWZpbGVzIDo9IGRvY3MvYnVzeWJveC5wb2QgXAorCQkgIGRvY3MvQnVzeUJveC5odG1sIGRvY3MvYnVzeWJveC4xIGRvY3MvQnVzeUJveC50eHQKK2RvYy1jbGVhbjoKKwkkKGNhbGwgY21kLHJtZmlsZXMpCisKKyMgbXJwcm9wZXIgLSBEZWxldGUgYWxsIGdlbmVyYXRlZCBmaWxlcywgaW5jbHVkaW5nIC5jb25maWcKKyMKK21ycHJvcGVyOiBybS1kaXJzICA6PSAkKHdpbGRjYXJkICQoTVJQUk9QRVJfRElSUykpCittcnByb3Blcjogcm0tZmlsZXMgOj0gJCh3aWxkY2FyZCAkKE1SUFJPUEVSX0ZJTEVTKSkKK21ycHJvcGVyLWRpcnMgICAgICA6PSAkKGFkZHByZWZpeCBfbXJwcm9wZXJfLHNjcmlwdHMpCisKK1BIT05ZICs9ICQobXJwcm9wZXItZGlycykgbXJwcm9wZXIgYXJjaG1ycHJvcGVyCiskKG1ycHJvcGVyLWRpcnMpOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQocGF0c3Vic3QgX21ycHJvcGVyXyUsJSwkQCkKKworbXJwcm9wZXI6IGNsZWFuIGFyY2htcnByb3BlciAkKG1ycHJvcGVyLWRpcnMpCisJJChjYWxsIGNtZCxybWRpcnMpCisJJChjYWxsIGNtZCxybWZpbGVzKQorCUBmaW5kIC4gLW5hbWUgQ29uZmlnLnNyYyB8IHNlZCAncy8uc3JjJCQvLmluLycgfCB4YXJncyAtciBybSAtZgorCUBmaW5kIC4gLW5hbWUgS2J1aWxkLnNyYyB8IHNlZCAncy8uc3JjJCQvLycgfCB4YXJncyAtciBybSAtZgorCisjIGRpc3RjbGVhbgorIworUEhPTlkgKz0gZGlzdGNsZWFuCisKK2Rpc3RjbGVhbjogbXJwcm9wZXIKKwlAZmluZCAkKHNyY3RyZWUpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJCVwoIC1uYW1lICcqLm9yaWcnIC1vIC1uYW1lICcqLnJlaicgLW8gLW5hbWUgJyp+JyBcCisJCS1vIC1uYW1lICcqLmJhaycgLW8gLW5hbWUgJyMqIycgLW8gLW5hbWUgJy4qLm9yaWcnIFwKKwkJLW8gLW5hbWUgJy4qLnJlaicgLW8gLW5hbWUgJyoudG1wJyAtbyAtc2l6ZSAwIFwKKwkJLW8gLW5hbWUgJyolJyAtbyAtbmFtZSAnLiouY21kJyAtbyAtbmFtZSAnY29yZScgXCkgXAorCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCisKKworIyBQYWNrYWdpbmcgb2YgdGhlIGtlcm5lbCB0byB2YXJpb3VzIGZvcm1hdHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHJwbSB0YXJnZXQga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorcGFja2FnZS1kaXIJOj0gJChzcmN0cmVlKS9zY3JpcHRzL3BhY2thZ2UKKworJXBrZzogRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSAkQAorcnBtOiBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQocGFja2FnZS1kaXIpICRACisKKworIyBCcmllZiBkb2N1bWVudGF0aW9uIG9mIHRoZSB0eXBpY2FsIHRhcmdldHMgdXNlZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9hcmRzIDo9ICQod2lsZGNhcmQgJChzcmN0cmVlKS9jb25maWdzLypfZGVmY29uZmlnKQorYm9hcmRzIDo9ICQobm90ZGlyICQoYm9hcmRzKSkKKworLWluY2x1ZGUgJChzcmN0cmVlKS9NYWtlZmlsZS5oZWxwCisKKyMgRG9jdW1lbnRhdGlvbiB0YXJnZXRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJWRvY3M6IHNjcmlwdHNfYmFzaWMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1Eb2N1bWVudGF0aW9uL0RvY0Jvb2sgJEAKKworZWxzZSAjIEtCVUlMRF9FWFRNT0QKKworIyMjCisjIEV4dGVybmFsIG1vZHVsZSBzdXBwb3J0LgorIyBXaGVuIGJ1aWxkaW5nIGV4dGVybmFsIG1vZHVsZXMgdGhlIGtlcm5lbCB1c2VkIGFzIGJhc2lzIGlzIGNvbnNpZGVyZWQKKyMgcmVhZC1vbmx5LCBhbmQgbm8gY29uc2lzdGVuY3kgY2hlY2tzIGFyZSBtYWRlIGFuZCB0aGUgbWFrZQorIyBzeXN0ZW0gaXMgbm90IHVzZWQgb24gdGhlIGJhc2lzIGtlcm5lbC4gSWYgdXBkYXRlcyBhcmUgcmVxdWlyZWQKKyMgaW4gdGhlIGJhc2lzIGtlcm5lbCBvcmRpbmFyeSBtYWtlIGNvbW1hbmRzICh3aXRob3V0IE09Li4uKSBtdXN0CisjIGJlIHVzZWQuCisjCisjIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBvbmx5IHZhbGlkIHRhcmdldHMgd2hlbiBidWlsZGluZyBleHRlcm5hbAorIyBtb2R1bGVzLgorIyBtYWtlIE09ZGlyIGNsZWFuICAgICBEZWxldGUgYWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzCisjIG1ha2UgTT1kaXIgbW9kdWxlcyAgIE1ha2UgYWxsIG1vZHVsZXMgaW4gc3BlY2lmaWVkIGRpcgorIyBtYWtlIE09ZGlyCSAgICAgICBTYW1lIGFzICdtYWtlIE09ZGlyIG1vZHVsZXMnCisjIG1ha2UgTT1kaXIgbW9kdWxlc19pbnN0YWxsCisjICAgICAgICAgICAgICAgICAgICAgIEluc3RhbGwgdGhlIG1vZHVsZXMgYnVpbGQgaW4gdGhlIG1vZHVsZSBkaXJlY3RvcnkKKyMgICAgICAgICAgICAgICAgICAgICAgQXNzdW1lcyBpbnN0YWxsIGRpcmVjdG9yeSBpcyBhbHJlYWR5IGNyZWF0ZWQKKworIyBXZSBhcmUgYWx3YXlzIGJ1aWxkaW5nIG1vZHVsZXMKK0tCVUlMRF9NT0RVTEVTIDo9IDEKK1BIT05ZICs9IGNybW9kdmVyZGlyCitjcm1vZHZlcmRpcjoKKwkkKFEpbWtkaXIgLXAgJChNT0RWRVJESVIpCisJJChRKXJtIC1mICQoTU9EVkVSRElSKS8qCisKK1BIT05ZICs9ICQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnMKKyQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnM6CisJQHRlc3QgLWUgJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycyB8fCAoIFwKKwllY2hvOyBcCisJZWNobyAiICBXQVJOSU5HOiBTeW1ib2wgdmVyc2lvbiBkdW1wICQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnMiOyBcCisJZWNobyAiICAgICAgICAgICBpcyBtaXNzaW5nOyBtb2R1bGVzIHdpbGwgaGF2ZSBubyBkZXBlbmRlbmNpZXMgYW5kIG1vZHZlcnNpb25zLiI7IFwKKwllY2hvICkKKworbW9kdWxlLWRpcnMgOj0gJChhZGRwcmVmaXggX21vZHVsZV8sJChLQlVJTERfRVhUTU9EKSkKK1BIT05ZICs9ICQobW9kdWxlLWRpcnMpIG1vZHVsZXMKKyQobW9kdWxlLWRpcnMpOiBjcm1vZHZlcmRpciAkKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChwYXRzdWJzdCBfbW9kdWxlXyUsJSwkQCkKKworbW9kdWxlczogJChtb2R1bGUtZGlycykKKwlAZWNobyAnICBCdWlsZGluZyBtb2R1bGVzLCBzdGFnZSAyLic7CisJJChRKSQoTUFLRSkgLXJSIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisKK1BIT05ZICs9IG1vZHVsZXNfaW5zdGFsbAorbW9kdWxlc19pbnN0YWxsOiBfZW1vZGluc3RfIF9lbW9kaW5zdF9wb3N0CisKK2luc3RhbGwtZGlyIDo9ICQoaWYgJChJTlNUQUxMX01PRF9ESVIpLCQoSU5TVEFMTF9NT0RfRElSKSxleHRyYSkKK1BIT05ZICs9IF9lbW9kaW5zdF8KK19lbW9kaW5zdF86CisJJChRKW1rZGlyIC1wICQoTU9ETElCKS8kKGluc3RhbGwtZGlyKQorCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kaW5zdAorCisjIFJ1biBkZXBtb2Qgb25seSBpcyB3ZSBoYXZlIFN5c3RlbS5tYXAgYW5kIGRlcG1vZCBpcyBleGVjdXRhYmxlCitxdWlldF9jbWRfZGVwbW9kID0gREVQTU9EICAkKEtFUk5FTFJFTEVBU0UpCisgICAgICBjbWRfZGVwbW9kID0gaWYgWyAtciBTeXN0ZW0ubWFwIC1hIC14ICQoREVQTU9EKSBdOyB0aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKERFUE1PRCkgLWFlIC1GIFN5c3RlbS5tYXAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICQoaWYgJChzdHJpcCAkKElOU1RBTExfTU9EX1BBVEgpKSwgICAgICBcCisJCSAgICAgIC1iICQoSU5TVEFMTF9NT0RfUEFUSCkgLXIpICAgICAgICAgICAgICBcCisJCSAgICAgICQoS0VSTkVMUkVMRUFTRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgZmkKKworUEhPTlkgKz0gX2Vtb2RpbnN0X3Bvc3QKK19lbW9kaW5zdF9wb3N0OiBfZW1vZGluc3RfCisJJChjYWxsIGNtZCxkZXBtb2QpCisKK2NsZWFuLWRpcnMgOj0gJChhZGRwcmVmaXggX2NsZWFuXywkKEtCVUlMRF9FWFRNT0QpKQorCitQSE9OWSArPSAkKGNsZWFuLWRpcnMpIGNsZWFuCiskKGNsZWFuLWRpcnMpOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQocGF0c3Vic3QgX2NsZWFuXyUsJSwkQCkKKworY2xlYW46CXJtLWRpcnMgOj0gJChNT0RWRVJESVIpCitjbGVhbjogJChjbGVhbi1kaXJzKQorCSQoY2FsbCBjbWQscm1kaXJzKQorCUBmaW5kICQoS0JVSUxEX0VYVE1PRCkgJChSQ1NfRklORF9JR05PUkUpIFwKKwkJXCggLW5hbWUgJyouW29hc10nIC1vIC1uYW1lICcqLmtvJyAtbyAtbmFtZSAnLiouY21kJyBcCisJCS1vIC1uYW1lICcuKi5kJyAtbyAtbmFtZSAnLioudG1wJyAtbyAtbmFtZSAnKi5tb2QuYycgXCkgXAorCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCisKKyMgRHVtbWllcy4uLgorUEhPTlkgKz0gcHJlcGFyZSBzY3JpcHRzCitwcmVwYXJlOiA7CitzY3JpcHRzOiA7CitlbmRpZiAjIEtCVUlMRF9FWFRNT0QKKworIyBHZW5lcmF0ZSB0YWdzIGZvciBlZGl0b3JzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjV2Ugd2FudCBfX3NyY3RyZWUgdG8gdG90YWxseSB2YW5pc2ggb3V0IHdoZW4gS0JVSUxEX09VVFBVVCBpcyBub3Qgc2V0CisjKHdoaWNoIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlIElNSE8pIHRvIGF2b2lkIHVubmVlZGVkIGNsdXR0ZXIgaW4gdGhlIGJpZyB0YWdzIGZpbGUuCisjQWRkaW5nICQoc3JjdHJlZSkgYWRkcyBhYm91dCAyME0gb24gaTM4NiB0byB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGZpbGUhCisKK2lmZXEgKCQoc3JjKSwkKG9iaikpCitfX3NyY3RyZWUgPQorZWxzZQorX19zcmN0cmVlID0gJChzcmN0cmVlKS8KK2VuZGlmCisKK2lmZXEgKCQoQUxMU09VUkNFX0FSQ0hTKSwpCitpZmVxICgkKEFSQ0gpLHVtKQorQUxMSU5DTFVERV9BUkNIUyA6PSAkKEFSQ0gpICQoU1VCQVJDSCkKK2Vsc2UKK0FMTElOQ0xVREVfQVJDSFMgOj0gJChBUkNIKQorZW5kaWYKK2Vsc2UKKyNBbGxvdyB1c2VyIHRvIHNwZWNpZnkgb25seSBBTExTT1VSQ0VfUEFUSFMgb24gdGhlIGNvbW1hbmQgbGluZSwga2VlcGluZyBleGlzdGluZyBiZWhhdmlvdXIuCitBTExJTkNMVURFX0FSQ0hTIDo9ICQoQUxMU09VUkNFX0FSQ0hTKQorZW5kaWYKKworQUxMU09VUkNFX0FSQ0hTIDo9ICQoQVJDSCkKKworZGVmaW5lIGFsbC1zb3VyY2VzCisJKCBmaW5kICQoX19zcmN0cmVlKSAkKFJDU19GSU5EX0lHTk9SRSkgXAorCSAgICAgICBcKCAtbmFtZSBpbmNsdWRlIC1vIC1uYW1lIGFyY2ggXCkgLXBydW5lIC1vIFwKKwkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAorCSAgZm9yIEFSQ0ggaW4gJChBTExTT1VSQ0VfQVJDSFMpIDsgZG8gXAorCSAgICAgICBmaW5kICQoX19zcmN0cmVlKWFyY2gvJCR7QVJDSH0gJChSQ1NfRklORF9JR05PUkUpIFwKKwkgICAgICAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICBkb25lIDsgXAorCSAgZmluZCAkKF9fc3JjdHJlZSlzZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUgJChSQ1NfRklORF9JR05PUkUpIFwKKwkgICAgICAgLW5hbWUgJyouW2NoU10nIC1wcmludDsgXAorCSAgZmluZCAkKF9fc3JjdHJlZSlpbmNsdWRlICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJICAgICAgIFwoIC1uYW1lIGNvbmZpZyAtbyAtbmFtZSAnYXNtLSonIFwpIC1wcnVuZSBcCisJICAgICAgIC1vIC1uYW1lICcqLltjaFNdJyAtcHJpbnQ7IFwKKwkgIGZvciBBUkNIIGluICQoQUxMSU5DTFVERV9BUkNIUykgOyBkbyBcCisJICAgICAgIGZpbmQgJChfX3NyY3RyZWUpaW5jbHVkZS9hc20tJCR7QVJDSH0gJChSQ1NfRklORF9JR05PUkUpIFwKKwkgICAgICAgICAgICAtbmFtZSAnKi5bY2hTXScgLXByaW50OyBcCisJICBkb25lIDsgXAorCSAgZmluZCAkKF9fc3JjdHJlZSlpbmNsdWRlL2FzbS1nZW5lcmljICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJICAgICAgIC1uYW1lICcqLltjaFNdJyAtcHJpbnQgKQorZW5kZWYKKworcXVpZXRfY21kX2NzY29wZS1maWxlID0gRklMRUxTVCBjc2NvcGUuZmlsZXMKKyAgICAgIGNtZF9jc2NvcGUtZmlsZSA9IChlY2hvIFwtazsgZWNobyBcLXE7ICQoYWxsLXNvdXJjZXMpKSA+IGNzY29wZS5maWxlcworCitxdWlldF9jbWRfY3Njb3BlID0gTUFLRSAgICBjc2NvcGUub3V0CisgICAgICBjbWRfY3Njb3BlID0gY3Njb3BlIC1iCisKK2NzY29wZTogRk9SQ0UKKwkkKGNhbGwgY21kLGNzY29wZS1maWxlKQorCSQoY2FsbCBjbWQsY3Njb3BlKQorCitxdWlldF9jbWRfVEFHUyA9IE1BS0UgICAkQAorZGVmaW5lIGNtZF9UQUdTCisJcm0gLWYgJEA7IFwKKwlFVEFHU0Y9YGV0YWdzIC0tdmVyc2lvbiB8IGdyZXAgLWkgZXh1YmVyYW50ID4vZGV2L251bGwgJiYgICAgIFwKKyAgICAgICAgICAgICAgICBlY2hvICItSSBfX2luaXRkYXRhLF9fZXhpdGRhdGEsX19hY3F1aXJlcyxfX3JlbGVhc2VzICBcCisgICAgICAgICAgICAgICAgICAgICAgLUkgRVhQT1JUX1NZTUJPTCxFWFBPUlRfU1lNQk9MX0dQTCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC0tZXh0cmE9K2YgLS1jLWtpbmRzPStweCJgOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAkKGFsbC1zb3VyY2VzKSB8IHhhcmdzIGV0YWdzICQkRVRBR1NGIC1hCitlbmRlZgorCitUQUdTOiBGT1JDRQorCSQoY2FsbCBjbWQsVEFHUykKKworCitxdWlldF9jbWRfdGFncyA9IE1BS0UgICAkQAorZGVmaW5lIGNtZF90YWdzCisJcm0gLWYgJEA7IFwKKwlDVEFHU0Y9YGN0YWdzIC0tdmVyc2lvbiB8IGdyZXAgLWkgZXh1YmVyYW50ID4vZGV2L251bGwgJiYgICAgIFwKKyAgICAgICAgICAgICAgICBlY2hvICItSSBfX2luaXRkYXRhLF9fZXhpdGRhdGEsX19hY3F1aXJlcyxfX3JlbGVhc2VzICBcCisgICAgICAgICAgICAgICAgICAgICAgLUkgRVhQT1JUX1NZTUJPTCxFWFBPUlRfU1lNQk9MX0dQTCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC0tZXh0cmE9K2YgLS1jLWtpbmRzPStweCJgOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAkKGFsbC1zb3VyY2VzKSB8IHhhcmdzIGN0YWdzICQkQ1RBR1NGIC1hCitlbmRlZgorCit0YWdzOiBGT1JDRQorCSQoY2FsbCBjbWQsdGFncykKKworCisjIFNjcmlwdHMgdG8gY2hlY2sgdmFyaW91cyB0aGluZ3MgZm9yIGNvbnNpc3RlbmN5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmNsdWRlY2hlY2s6CisJZmluZCAqICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJCS1uYW1lICcqLltoY1NdJyAtdHlwZSBmIC1wcmludCB8IHNvcnQgXAorCQl8IHhhcmdzICQoUEVSTCkgLXcgc2NyaXB0cy9jaGVja2luY2x1ZGVzLnBsCisKK3ZlcnNpb25jaGVjazoKKwlmaW5kICogJChSQ1NfRklORF9JR05PUkUpIFwKKwkJLW5hbWUgJyouW2hjU10nIC10eXBlIGYgLXByaW50IHwgc29ydCBcCisJCXwgeGFyZ3MgJChQRVJMKSAtdyBzY3JpcHRzL2NoZWNrdmVyc2lvbi5wbAorCituYW1lc3BhY2VjaGVjazoKKwkkKFBFUkwpICQoc3JjdHJlZSkvc2NyaXB0cy9uYW1lc3BhY2UucGwKKworZW5kaWYgI2lmZXEgKCQoY29uZmlnLXRhcmdldHMpLDEpCitlbmRpZiAjaWZlcSAoJChtaXhlZC10YXJnZXRzKSwxKQorCitQSE9OWSArPSBjaGVja3N0YWNrCitjaGVja3N0YWNrOgorCSQoT0JKRFVNUCkgLWQgYnVzeWJveCAkJChmaW5kIC4gLW5hbWUgJyoua28nKSB8IFwKKwkkKFBFUkwpICQoc3JjKS9zY3JpcHRzL2NoZWNrc3RhY2sucGwgJChBUkNIKQorCitrZXJuZWxyZWxlYXNlOgorCSQoaWYgJCh3aWxkY2FyZCAua2VybmVscmVsZWFzZSksICQoUSllY2hvICQoS0VSTkVMUkVMRUFTRSksIFwKKwkkKGVycm9yIGtlcm5lbHJlbGVhc2Ugbm90IHZhbGlkIC0gcnVuICdtYWtlICpjb25maWcnIHRvIHVwZGF0ZSBpdCkpCitrZXJuZWx2ZXJzaW9uOgorCUBlY2hvICQoS0VSTkVMVkVSU0lPTikKKworIyBTaW5nbGUgdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2luZ2xlIHRhcmdldHMgYXJlIGNvbXBhdGlibGUgd2l0aDoKKyMgLSBidWlsZCB3aGl0aCBtaXhlZCBzb3VyY2UgYW5kIG91dHB1dAorIyAtIGJ1aWxkIHdpdGggc2VwYXJhdGUgb3V0cHV0IGRpciAnbWFrZSBPPS4uLicKKyMgLSBleHRlcm5hbCBtb2R1bGVzCisjCisjICB0YXJnZXQtZGlyID0+IHdoZXJlIHRvIHN0b3JlIG91dHB1dGZpbGUKKyMgIGJ1aWxkLWRpciAgPT4gZGlyZWN0b3J5IGluIGtlcm5lbCBzb3VyY2UgdHJlZSB0byB1c2UKKworaWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCisgICAgICAgIGJ1aWxkLWRpciAgPSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJEApKQorICAgICAgICB0YXJnZXQtZGlyID0gJChkaXIgJEApCitlbHNlCisgICAgICAgIHphcC1zbGFzaD0kKGZpbHRlci1vdXQgLiwkKHBhdHN1YnN0ICUvLCUsJChkaXIgJEApKSkKKyAgICAgICAgYnVpbGQtZGlyICA9ICQoS0JVSUxEX0VYVE1PRCkkKGlmICQoemFwLXNsYXNoKSwvJCh6YXAtc2xhc2gpKQorICAgICAgICB0YXJnZXQtZGlyID0gJChpZiAkKEtCVUlMRF9FWFRNT0QpLCQoZGlyICQ8KSwkKGRpciAkQCkpCitlbmRpZgorCislLnM6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorJS5pOiAlLmMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKyUubzogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCislLmxzdDogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCislLnM6ICUuUyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorJS5vOiAlLlMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKworIyBNb2R1bGVzCislLzogcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgS0JVSUxEX01PRFVMRVM9JChpZiAkKENPTkZJR19NT0RVTEVTKSwxKSBcCisJJChidWlsZCk9JChidWlsZC1kaXIpCisvOiBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSBLQlVJTERfTU9EVUxFUz0kKGlmICQoQ09ORklHX01PRFVMRVMpLDEpIFwKKwkkKGJ1aWxkKT0kKGJ1aWxkLWRpcikKKworJS5rbzogcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgS0JVSUxEX01PRFVMRVM9JChpZiAkKENPTkZJR19NT0RVTEVTKSwxKSAgIFwKKwkkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJChAOi5rbz0ubykKKwkkKFEpJChNQUtFKSAtclIgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKKworIyBGSVhNRSBTaG91bGQgZ28gaW50byBhIG1ha2UubGliIG9yIHNvbWV0aGluZworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcXVpZXRfY21kX3JtZGlycyA9ICQoaWYgJCh3aWxkY2FyZCAkKHJtLWRpcnMpKSxDTEVBTiAgICQod2lsZGNhcmQgJChybS1kaXJzKSkpCisgICAgICBjbWRfcm1kaXJzID0gcm0gLXJmICQocm0tZGlycykKKworcXVpZXRfY21kX3JtZmlsZXMgPSAkKGlmICQod2lsZGNhcmQgJChybS1maWxlcykpLENMRUFOICAgJCh3aWxkY2FyZCAkKHJtLWZpbGVzKSkpCisgICAgICBjbWRfcm1maWxlcyA9IHJtIC1mICQocm0tZmlsZXMpCisKKworYV9mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKEFGTEFHUykgJChBRkxBR1NfS0VSTkVMKSBcCisJICAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJICAkKG1vZGtlcm5fYWZsYWdzKSAkKEVYVFJBX0FGTEFHUykgJChBRkxBR1NfJCgqRikubykKKworcXVpZXRfY21kX2FzX29fUyA9IEFTICAgICAgJEAKK2NtZF9hc19vX1MgICAgICAgPSAkKENDKSAkKGFfZmxhZ3MpIC1jIC1vICRAICQ8CisKKyMgcmVhZCBhbGwgc2F2ZWQgY29tbWFuZCBsaW5lcworCit0YXJnZXRzIDo9ICQod2lsZGNhcmQgJChzb3J0ICQodGFyZ2V0cykpKQorY21kX2ZpbGVzIDo9ICQod2lsZGNhcmQgLiouY21kICQoZm9yZWFjaCBmLCQodGFyZ2V0cyksJChkaXIgJChmKSkuJChub3RkaXIgJChmKSkuY21kKSkKKworaWZuZXEgKCQoY21kX2ZpbGVzKSwpCisgICQoY21kX2ZpbGVzKTogOwkjIERvIG5vdCB0cnkgdG8gdXBkYXRlIGluY2x1ZGVkIGRlcGVuZGVuY3kgZmlsZXMKKyAgaW5jbHVkZSAkKGNtZF9maWxlcykKK2VuZGlmCisKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSAtZiBzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iaj1kaXIKKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoY2xlYW4pPWRpcgorY2xlYW4gOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqCisKK2VuZGlmCSMgc2tpcC1tYWtlZmlsZQorCitQSE9OWSArPSBGT1JDRQorRk9SQ0U6CisKKy1pbmNsdWRlICQoc3JjdHJlZSkvTWFrZWZpbGUuY3VzdG9tCisKKyMgRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhlIC5QSE9OWSB2YXJpYWJsZSBhcyBwaG9ueS4gIFdlIGtlZXAgdGhhdAorIyBpbmZvcm1hdGlvbiBpbiBhIHZhcmlhYmxlIHNlIHdlIGNhbiB1c2UgaXQgaW4gaWZfY2hhbmdlZCBhbmQgZnJpZW5kcy4KKy5QSE9OWTogJChQSE9OWSkKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmN1c3RvbSBiL01ha2VmaWxlLmN1c3RvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE3OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuY3VzdG9tCkBAIC0wLDAgKzEsMTc4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkIHN5c3RlbQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitidXN5Ym94LmxpbmtzOiAkKHNyY3RyZWUpL2FwcGxldHMvYnVzeWJveC5ta2xsICQob2JqdHJlZSkvaW5jbHVkZS9hdXRvY29uZi5oIGluY2x1ZGUvYXBwbGV0cy5oCisJJChRKS0kKFNIRUxMKSAkXiA+JEAKKworLlBIT05ZOiBpbnN0YWxsCitpZmVxICgkKENPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUykseSkKK0lOU1RBTExfT1BUUzo9IC0tc3ltbGlua3MKK2VuZGlmCitpZmVxICgkKENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MpLHkpCitJTlNUQUxMX09QVFM6PSAtLWhhcmRsaW5rcworZW5kaWYKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUykseSkKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTkspLHkpCitJTlNUQUxMX09QVFM6PSAtLXN3LXNoLXN5bQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LKSx5KQorSU5TVEFMTF9PUFRTOj0gLS1zdy1zaC1oYXJkCitlbmRpZgoraWZlcSAoJChDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIpLHkpCitJTlNUQUxMX09QVFM6PSAtLXNjcmlwdHdyYXBwZXIKK2VuZGlmCitlbmRpZgoraW5zdGFsbDogJChzcmN0cmVlKS9hcHBsZXRzL2luc3RhbGwuc2ggYnVzeWJveCBidXN5Ym94LmxpbmtzCisJJChRKURPX0lOU1RBTExfTElCUz0iJChzdHJpcCAkKExJQkJVU1lCT1hfU09OQU1FKSAkKERPX0lOU1RBTExfTElCUykpIiBcCisJCSQoU0hFTEwpICQ8ICQoQ09ORklHX1BSRUZJWCkgJChJTlNUQUxMX09QVFMpCitpZmVxICgkKHN0cmlwICQoQ09ORklHX0ZFQVRVUkVfU1VJRCkpLHkpCisJQGVjaG8KKwlAZWNobworCUBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQGVjaG8gWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBtYWtlIHlvdXIgYnVzeWJveCBiaW5hcnkKKwlAZWNobyBzZXR1aWQgcm9vdCB0byBlbnN1cmUgYWxsIGNvbmZpZ3VyZWQgYXBwbGV0cyB3aWxsCisJQGVjaG8gd29yayBwcm9wZXJseS4KKwlAZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBlY2hvCitlbmRpZgorCit1bmluc3RhbGw6IGJ1c3lib3gubGlua3MKKwlybSAtZiAkKENPTkZJR19QUkVGSVgpL2Jpbi9idXN5Ym94CisJZm9yIGkgaW4gYGNhdCBidXN5Ym94LmxpbmtzYCA7IGRvIHJtIC1mICQoQ09ORklHX1BSRUZJWCkkJGk7IGRvbmUKK2lmbmVxICgkKHN0cmlwICQoRE9fSU5TVEFMTF9MSUJTKSksbikKKwlmb3IgaSBpbiAkKExJQkJVU1lCT1hfU09OQU1FKSAkKERPX0lOU1RBTExfTElCUyk7IGRvIFwKKwkJcm0gLWYgJChDT05GSUdfUFJFRklYKSQkaTsgXAorCWRvbmUKK2VuZGlmCisKKyMgTm90IHZlcnkgZWxlZ2FudDogY29waWVzIHRlc3RzdWl0ZSB0byBvYmpkaXIuLi4KKyMgKGNwIC1wUFIgaXMgUE9TSVgtY29tcGxpYW50IChjcCAtZHBSIG9yIGNwIC1hIHdvdWxkIG5vdCBiZSkpCisuUEhPTlk6IGNoZWNrCisuUEhPTlk6IHRlc3QKK2NoZWNrIHRlc3Q6IGJ1c3lib3ggYnVzeWJveC5saW5rcworCXRlc3QgLWQgJChvYmp0cmVlKS90ZXN0c3VpdGUgfHwgY3AgLXBQUiAkKHNyY3RyZWUpL3Rlc3RzdWl0ZSAkKG9ianRyZWUpCisJYmluZGlyPSQob2JqdHJlZSkgc3JjZGlyPSQoc3JjdHJlZSkvdGVzdHN1aXRlIFwKKwkkKFNIRUxMKSAtYyAiY2QgJChvYmp0cmVlKS90ZXN0c3VpdGUgJiYgJChzcmN0cmVlKS90ZXN0c3VpdGUvcnVudGVzdCAkKGlmICQoS0JVSUxEX1ZFUkJPU0U6MD0pLC12KSIKKworLlBIT05ZOiByZWxlYXNlCityZWxlYXNlOiBkaXN0Y2xlYW4KKwljZCAuLjsgXAorCXJtIC1yIC1mIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pOyBcCisJY3AgLXBQUiBidXN5Ym94IGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pICYmIHsgXAorCWZpbmQgYnVzeWJveC0kKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikvIC10eXBlIGQgXAorCQktbmFtZSAuc3ZuIFwKKwkJLXByaW50IFwKKwkJLWV4ZWMgcm0gLXIgLWYge30gXDsgOyBcCisJZmluZCBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKS8gLXR5cGUgZCBcCisJCS1uYW1lIC5naXQgXAorCQktcHJpbnQgXAorCQktZXhlYyBybSAtciAtZiB7fSBcOyA7IFwKKwlmaW5kIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLyAtdHlwZSBmIFwKKwkJLW5hbWUgLlwjKiBcCisJCS1wcmludCBcCisJCS1leGVjIHJtIC1mIHt9IFw7IDsgXAorCXRhciAtY3pmIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLnRhci5neiBcCisJCWJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLyA7IH0KKworLlBIT05ZOiBjaGVja2hlbHAKK2NoZWNraGVscDoKKwkkKFEpJChzcmN0cmVlKS9zY3JpcHRzL2NoZWNraGVscC5hd2sgXAorCQkkKHBhdHN1YnN0ICUsJChzcmN0cmVlKS8lLCQod2lsZGNhcmQgJChwYXRzdWJzdCAlLCUvQ29uZmlnLmluLCQoYnVzeWJveC1kaXJzKSAuLykpKQorCisuUEhPTlk6IHNpemVzCitzaXplczogYnVzeWJveF91bnN0cmlwcGVkCisJJChOTSkgLS1zaXplLXNvcnQgJCg8KQorCisuUEhPTlk6IGJsb2F0Y2hlY2sKK2Jsb2F0Y2hlY2s6IGJ1c3lib3hfb2xkIGJ1c3lib3hfdW5zdHJpcHBlZAorCUAkKHNyY3RyZWUpL3NjcmlwdHMvYmxvYXQtby1tZXRlciBidXN5Ym94X29sZCBidXN5Ym94X3Vuc3RyaXBwZWQKKwlAJChDUk9TU19DT01QSUxFKXNpemUgYnVzeWJveF9vbGQgYnVzeWJveF91bnN0cmlwcGVkCisKKy5QSE9OWTogYmFzZWxpbmUKK2Jhc2VsaW5lOiBidXN5Ym94X3Vuc3RyaXBwZWQKKwlAbXYgYnVzeWJveF91bnN0cmlwcGVkIGJ1c3lib3hfb2xkCisKKy5QSE9OWTogb2Jqc2l6ZXMKK29ianNpemVzOiBidXN5Ym94X3Vuc3RyaXBwZWQKKwkkKHNyY3RyZWUpL3NjcmlwdHMvb2Jqc2l6ZXMKKworLlBIT05ZOiBzdGtzaXplcworc3Rrc2l6ZXM6IGJ1c3lib3hfdW5zdHJpcHBlZAorCSQoQ1JPU1NfQ09NUElMRSlvYmpkdW1wIC1kIGJ1c3lib3hfdW5zdHJpcHBlZCB8ICQoc3JjdHJlZSkvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkgfCB1bmlxCisKKy5QSE9OWTogYmlnZGF0YQorYmlnZGF0YTogYnVzeWJveF91bnN0cmlwcGVkCisJJChDUk9TU19DT01QSUxFKW5tIC0tc2l6ZS1zb3J0IGJ1c3lib3hfdW5zdHJpcHBlZCB8IGdyZXAgLXZpICcgW3Ryd10gJworCisjIERvY3VtZW50YXRpb24gVGFyZ2V0cworLlBIT05ZOiBkb2MKK2RvYzogZG9jcy9idXN5Ym94LnBvZCBkb2NzL0J1c3lCb3gudHh0IGRvY3MvYnVzeWJveC4xIGRvY3MvQnVzeUJveC5odG1sCisKKyMgRklYTUU6IERvZXNuJ3QgYmVsb25nIGhlcmUKKyAgICAgICBjbWRfZG9jID0KKyBxdWlldF9jbWRfZG9jID0gJChRKWVjaG8gIiAgRE9DICAgICAkKEBGKSIKK3NpbGVudF9jbWRfZG9jID0KK2Rpc3BfZG9jICAgICAgID0gJCgkKHF1aWV0KWNtZF9kb2MpCisKKyMgc2VkIGFkZHMgbmV3bGluZXMgYWZ0ZXIgIk9wdGlvbnM6IiBldGMsCisjIHRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGdldCBnb29kIEJ1c3lCb3guezEsdHh0LGh0bWx9Citkb2NzL2J1c3lib3gucG9kOiAkKHNyY3RyZWUpL2RvY3MvYnVzeWJveF9oZWFkZXIucG9kIFwKKwkJaW5jbHVkZS91c2FnZS5oIFwKKwkJJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfZm9vdGVyLnBvZCBcCisJCWFwcGxldHMvdXNhZ2VfcG9kCisJJChkaXNwX2RvYykKKwkkKFEpLW1rZGlyIC1wIGRvY3MKKwkkKFEpLSggXAorCSAgICBjYXQgJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZDsgXAorCSAgICBlY2hvOyBcCisJICAgIGFwcGxldHMvdXNhZ2VfcG9kIHwgc2VkICdzL15bQS1aYS16XVtBLVphLXogXSpbYS16XTokJC8mXG4vJzsgXAorCSAgICBjYXQgJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfZm9vdGVyLnBvZDsgXAorCSAgICApID4gZG9jcy9idXN5Ym94LnBvZAorCitkb2NzL0J1c3lCb3gudHh0OiBkb2NzL2J1c3lib3gucG9kCisJJChkaXNwX2RvYykKKwkkKFEpLW1rZGlyIC1wIGRvY3MKKwkkKFEpLXBvZDJ0ZXh0ICQ8ID4gJEAKKworZG9jcy9idXN5Ym94LjE6IGRvY3MvYnVzeWJveC5wb2QKKwkkKGRpc3BfZG9jKQorCSQoUSktbWtkaXIgLXAgZG9jcworCSQoUSktcG9kMm1hbiAtLWNlbnRlcj1idXN5Ym94IC0tcmVsZWFzZT0idmVyc2lvbiAkKEtFUk5FTFZFUlNJT04pIiAkPCA+ICRACisKK2RvY3MvQnVzeUJveC5odG1sOiBkb2NzL2J1c3lib3gubmV0L0J1c3lCb3guaHRtbAorCSQoZGlzcF9kb2MpCisJJChRKS1ta2RpciAtcCBkb2NzCisJJChRKS1ybSAtZiBkb2NzL0J1c3lCb3guaHRtbAorCSQoUSktY3AgZG9jcy9idXN5Ym94Lm5ldC9CdXN5Qm94Lmh0bWwgZG9jcy9CdXN5Qm94Lmh0bWwKKworZG9jcy9idXN5Ym94Lm5ldC9CdXN5Qm94Lmh0bWw6IGRvY3MvYnVzeWJveC5wb2QKKwkkKFEpLW1rZGlyIC1wIGRvY3MvYnVzeWJveC5uZXQKKwkkKFEpLXBvZDJodG1sIC0tbm9pbmRleCAkPCA+ICRACisJJChRKS1ybSAtZiBwb2QyaHRtKgorCisjIGRvY3VtZW50YXRpb24sIGNyb3NzLXJlZmVyZW5jZQorIyBNb2Rlcm4gZGlzdHJpYnV0aW9ucyBhbHJlYWR5IHNoaXAgc3lub3BzaXMgcGFja2FnZXMgKGUuZy4gZGViaWFuKQorIyBJZiB5b3UgaGF2ZSBhbiBvbGQgZGlzdHJpYnV0aW9uIGdvIHRvIGh0dHA6Ly9zeW5vcHNpcy5mcmVzY28ub3JnLworc3luX3RndCA9ICQod2lsZGNhcmQgJChwYXRzdWJzdCAlLCUvKi5jLCQoYnVzeWJveC1hbGxkaXJzKSkpCitzeW4gICAgID0gJChwYXRzdWJzdCAlLmMsICUuc3luLCAkKHN5bl90Z3QpKQorCitjb21tYTo9ICwKK2JyYWNlX29wZW46PSAoCiticmFjZV9jbG9zZTo9ICkKKworU1lOX0NQUEZMQUdTIDo9ICQoc3RyaXAgJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykpCitTWU5fQ1BQRkxBR1MgOj0gJChzdWJzdCAkKGJyYWNlX29wZW4pLFwkKGJyYWNlX29wZW4pLCQoU1lOX0NQUEZMQUdTKSkKK1NZTl9DUFBGTEFHUyA6PSAkKHN1YnN0ICQoYnJhY2VfY2xvc2UpLFwkKGJyYWNlX2Nsb3NlKSwkKFNZTl9DUFBGTEFHUykpCisjU1lOX0NQUEZMQUdTIDo9ICQoc3Vic3QgIixcIiwkKFNZTl9DUFBGTEFHUykpCisjIikKKyNTWU5fQ1BQRkxBR1MgOj0gWyQocGF0c3Vic3QgJSwnJSckKGNvbW1hKSwkKFNZTl9DUFBGTEFHUykpJyddCisKKyUuc3luOiAlLmMKKwlzeW5vcHNpcyAtcCBDIC1sIENvbW1lbnRzLlNTREZpbHRlcixDb21tZW50cy5QcmV2aW91cyAtV3AscHJlcHJvY2Vzcz1UcnVlLGNwcGZsYWdzPSInJChTWU5fQ1BQRkxBR1MpJyIgLW8gJEAgJDwKKworLlBIT05ZOiBodG1sCitodG1sOiAkKHN5bikKKwlzeW5vcHNpcyAtZiBIVE1MIC1XZix0aXRsZT0iJ0J1c3lCb3ggRG9jdW1lbnRhdGlvbiciIC1vICRAICReCisKKy1pbmNsdWRlICQoc3JjdHJlZSkvTWFrZWZpbGUubG9jYWwKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmZsYWdzIGIvTWFrZWZpbGUuZmxhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMTM3MQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmZsYWdzCkBAIC0wLDAgKzEsMTMyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkIHN5c3RlbQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCQl9WRVIgPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKK2V4cG9ydCBCQl9WRVIKK1NLSVBfU1RSSVAgPz0gbgorCisjIC1zdGQ9Z251OTkgbmVlZGVkIGZvciBbVV1MTE9OR19NQVggb24gc29tZSBzeXN0ZW1zCitDUFBGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1zdGQ9Z251OTksKQorCitDUFBGTEFHUyArPSBcCisJLUlpbmNsdWRlIC1JbGliYmIgXAorCSQoaWYgJChLQlVJTERfU1JDKSwtSWluY2x1ZGUyIC1JJChzcmN0cmVlKS9pbmNsdWRlIC1JJChzcmN0cmVlKS9saWJiYikgXAorCS1pbmNsdWRlIGluY2x1ZGUvYXV0b2NvbmYuaCBcCisJLURfR05VX1NPVVJDRSAtRE5ERUJVRyBcCisJJChpZiAkKENPTkZJR19MRlMpLC1EX0xBUkdFRklMRV9TT1VSQ0UgLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQpIFwKKwktRCJCQl9WRVI9S0JVSUxEX1NUUigkKEJCX1ZFUikpIiAtREJCX0JUPUFVVE9DT05GX1RJTUVTVEFNUAorCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2FsbCwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3NoYWRvdywpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3dyaXRlLXN0cmluZ3MsKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVd1bmRlZiwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3N0cmljdC1wcm90b3R5cGVzLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XdW51c2VkIC1XdW51c2VkLXBhcmFtZXRlciwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3VudXNlZC1mdW5jdGlvbiAtV3VudXNlZC12YWx1ZSwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zLCkKKyMgd2FybiBhYm91dCBDOTkgZGVjbGFyYXRpb24gYWZ0ZXIgc3RhdGVtZW50CitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCwpCisjIElmIHlvdSB3YW50IHRvIGFkZCBtb3JlIC1Xc29tZXRoaW5nIGFib3ZlLCBtYWtlIHN1cmUgdGhhdCBpdCBpcworIyBzdGlsbCBwb3NzaWJsZSB0byBidWlsZCBiYm94IHdpdGhvdXQgd2FybmluZ3MuCisKK2lmZXEgKCQoQ09ORklHX1dFUlJPUikseSkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XZXJyb3IsKQorIyMgVE9ETzoKKyMjIGdjYyB2ZXJzaW9uIDQuNC4wIDIwMDkwNTA2IChSZWQgSGF0IDQuNC4wLTQpIChHQ0MpIGlzIGEgUElUQToKKyMjIGNvbnN0IGNoYXIgKnB0cjsgLi4uIG9mZl90IHYgPSAqKG9mZl90KilwdHI7IC0+IEJPT00KKyMjIGFuZCBubyBlYXN5IHdheSB0byBjb252aW5jZSBpdCB0byBzaHV0IHRoZSBoZWxsIHVwLgorIyMgV2UgaGF2ZSBhIGxvdCBvZiBzdWNoIHRoaW5ncyBhbGwgb3ZlciB0aGUgcGxhY2UuCisjIyBDbGFzc2ljICoob2ZmX3QqKSh2b2lkKilwdHIgZG9lcyBub3Qgd29yaywKKyMjIGFuZCBJIGFtIHVud2lsbGluZyB0byBkbyBjcmF6eSBnY2Mgc3BlY2lmaWMgKHsgdm9pZCAqcHBwID0gLi4uOyB9KQorIyMgc3R1ZmYgaW4gbWFjcm9zLiBUaGlzIHdvdWxkIG9iZnVzY2F0ZSB0aGUgY29kZSB0b28gbXVjaC4KKyMjIE1heWJlIHRyeSBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSk/CisjQ0ZMQUdTICs9ICQoY2FsbCBjYy1pZnZlcnNpb24sIC1lcSwgMDQwNCwgLWZuby1zdHJpY3QtYWxpYXNpbmcpCitlbmRpZgorIyBnY2MgMy54IGVtaXRzIGJvZ3VzICJvbGQgc3R5bGUgcHJvdG8iIHdhcm5pbmcgb24gZmluZC5jOmFsbG9jX2FjdGlvbigpCitDRkxBR1MgKz0gJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDAwLCAtV29sZC1zdHlsZS1kZWZpbml0aW9uKQorCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLWJ1aWx0aW4tc3RybGVuIC1maW5saW5lLWxpbWl0PTAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMsKQorIyAtZm5vLWd1ZXNzLWJyYW5jaC1wcm9iYWJpbGl0eTogcHJvaGliaXQgcHNldWRvLXJhbmRvbSBndWVzc2luZworIyBvZiBicmFuY2ggcHJvYmFiaWxpdGllcyAoaG9wZWZ1bGx5IG1ha2VzIGJsb2F0Y2hlY2sgbW9yZSBzdGFibGUpOgorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby1ndWVzcy1icmFuY2gtcHJvYmFiaWxpdHksKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bnNpZ25lZC1jaGFyIC1zdGF0aWMtbGliZ2NjLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbGFiZWxzPTEgLWZhbGlnbi1sb29wcz0xLCkKKworIyBGSVhNRTogVGhlc2Ugd2FybmluZ3MgYXJlIGF0IGxlYXN0IHBhcnRpYWxseSB0byBiZSBjb25jZXJuZWQgYWJvdXQgYW5kIHNob3VsZAorIyBiZSBmaXhlZC4uCisjQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVdjb252ZXJzaW9uLCkKKworaWZuZXEgKCQoQ09ORklHX0RFQlVHKSx5KQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLU9zLCQoY2FsbCBjYy1vcHRpb24sLU8yLCkpCitlbHNlCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZywpCisjQ0ZMQUdTICs9ICItRF9GT1JUSUZZX1NPVVJDRT0yIgoraWZlcSAoJChDT05GSUdfREVCVUdfUEVTU0lNSVpFKSx5KQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLU8wLCkKK2Vsc2UKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1PcywkKGNhbGwgY2Mtb3B0aW9uLC1PMiwpKQorZW5kaWYKK2VuZGlmCisKKyMgSWYgYXJjaC8kKEFSQ0gpL01ha2VmaWxlIGRpZCBub3Qgb3ZlcnJpZGUgaXQgKHdpdGgsIHNheSwgLWZQSUMpLi4uCitBUkNIX0ZQSUMgPz0gLWZwaWMKK0FSQ0hfRlBJRSA/PSAtZnBpZQorQVJDSF9QSUUgPz0gLXBpZQorCitpZmVxICgkKENPTkZJR19CVUlMRF9MSUJCVVNZQk9YKSx5KQorIyBvbiBpMzg2OiAxNCUgc21hbGxlciBsaWJidXN5Ym94LnNvCisjIChjb2RlIGl0c2VsZiBpcyA5JSBiaWdnZXIsIHdlIHNhdmUgb24gcmVsb2NzL1BMVC9HT1QpCitDRkxBR1MgKz0gJChBUkNIX0ZQSUMpCisjIGFuZCBhbm90aGVyIDQlIHJlZHVjdGlvbiBvZiBsaWJidXN5Ym94LnNvOgorIyAoZXh0ZXJuYWwgZW50cnkgcG9pbnRzIG11c3QgYmUgbWFya2VkIEVYVEVSTkFMTFlfVklTSUJMRSkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mdmlzaWJpbGl0eT1oaWRkZW4pCitlbmRpZgorCitpZmVxICgkKENPTkZJR19TVEFUSUMpLHkpCitDRkxBR1NfYnVzeWJveCArPSAtc3RhdGljCitlbmRpZgorCitpZmVxICgkKENPTkZJR19QSUUpLHkpCitDRkxBR1NfYnVzeWJveCArPSAkKEFSQ0hfUElFKQorQ0ZMQUdTICs9ICQoQVJDSF9GUElFKQorZW5kaWYKKworaWZuZXEgKCQoQ09ORklHX0VYVFJBX0NGTEFHUyksKQorQ0ZMQUdTICs9ICQoc3RyaXAgJChzdWJzdCAiLCwkKENPTkZJR19FWFRSQV9DRkxBR1MpKSkKKyMiKSkKK2VuZGlmCisKK0xETElCUyArPSBtIGNyeXB0CisKK2lmZXEgKCQoQ09ORklHX1BBTSkseSkKK0xETElCUyArPSBwYW0gcGFtX21pc2MKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1NFTElOVVgpLHkpCitMRExJQlMgKz0gc2VsaW51eCBzZXBvbAorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRUZFTkNFKSx5KQorTERMSUJTICs9IGVmZW5jZQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRE1BTExPQykseSkKK0xETElCUyArPSBkbWFsbG9jCitlbmRpZgorCisjIElmIGEgZmxhdCBiaW5hcnkgc2hvdWxkIGJlIGJ1aWx0LCBDRkxBR1NfYnVzeWJveD0iLWVsZjJmbHQiCisjIGVudiB2YXIgc2hvdWxkIGJlIHNldCBmb3IgbWFrZSBpbnZvY2F0aW9uLgorIyBIZXJlIHdlIGNoZWNrIHdoZXRoZXIgQ0ZMQUdTX2J1c3lib3ggaW5kZWVkIGNvbnRhaW5zIHRoYXQgZmxhZy4KKyMgKEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHdlIGFsc28gY2hlY2sgTERGTEFHUywgd2hpY2ggZG9lc24ndAorIyBzZWVtIHRvIGJlIGVudGlyZWx5IGNvcnJlY3QgdmFyaWFibGUgdG8gcHV0ICItZWxmMmZsdCIgaW50bykuCitXX0VMRjJGTFQgPSAtZWxmMmZsdAoraWZuZXEgKCwkKGZpbmRzdHJpbmcgJChXX0VMRjJGTFQpLCQoTERGTEFHUykgJChDRkxBR1NfYnVzeWJveCkpKQorU0tJUF9TVFJJUCA9IHkKK2VuZGlmCisKKyMgQnVzeWJveCBpcyBhIHN0YWNrLWZhdHR5IHNvIG1ha2Ugc3VyZSB3ZSBpbmNyZWFzZSBkZWZhdWx0IHNpemUKKyMgVE9ETzogdXNlICJtYWtlIHN0a3NpemVzIiB0byBmaW5kICYgZml4IGJpZyBzdGFjayB1c2VycworIyAod2Ugc3RvbGUgc2NyaXB0cy9jaGVja3N0YWNrLnBsIGZyb20gdGhlIGtlcm5lbC4uLiB0aGFua3MgZ3V5cyEpCisjIFJlZHVjZWQgZnJvbSAyMGsgdG8gMTZrIGluIDEuOS4wLgorRkxURkxBR1MgKz0gLXMgMTYwMDAKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmhlbHAgYi9NYWtlZmlsZS5oZWxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWRkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5oZWxwCkBAIC0wLDAgKzEsNDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGQgc3lzdGVtCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2hlbHA6CisJQGVjaG8gJ0NsZWFuaW5nOicKKwlAZWNobyAnICBjbGVhbgkJCS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIGJ5IGJ1aWxkJworCUBlY2hvICcgIGRpc3RjbGVhbgkJLSBkZWxldGUgYWxsIG5vbi1zb3VyY2UgZmlsZXMgKGluY2x1ZGluZyAuY29uZmlnKScKKwlAZWNobyAnICBkb2MtY2xlYW4JCS0gZGVsZXRlIGFsbCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicKKwlAZWNobworCUBlY2hvICdCdWlsZDonCisJQGVjaG8gJyAgYWxsCQkJLSBFeGVjdXRhYmxlIGFuZCBkb2N1bWVudGF0aW9uJworCUBlY2hvICcgIGJ1c3lib3gJCS0gdGhlIHN3aXNzLWFybXkgZXhlY3V0YWJsZScKKwlAZWNobyAnICBkb2MJCQktIGRvY3MvQnVzeUJveC57dHh0LGh0bWwsMX0nCisJQGVjaG8gJyAgaHRtbAkJCS0gY3JlYXRlIGh0bWwtYmFzZWQgY3Jvc3MtcmVmZXJlbmNlJworCUBlY2hvCisJQGVjaG8gJ0NvbmZpZ3VyYXRpb246JworCUBlY2hvICcgIGFsbG5vY29uZmlnCQktIGRpc2FibGUgYWxsIHN5bWJvbHMgaW4gLmNvbmZpZycKKwlAZWNobyAnICBhbGx5ZXNjb25maWcJCS0gZW5hYmxlIGFsbCBzeW1ib2xzIGluIC5jb25maWcgKHNlZSBkZWZjb25maWcpJworCUBlY2hvICcgIGNvbmZpZwkJLSB0ZXh0IGJhc2VkIGNvbmZpZ3VyYXRvciAob2YgbGFzdCByZXNvcnQpJworCUBlY2hvICcgIGRlZmNvbmZpZwkJLSBzZXQgLmNvbmZpZyB0byBsYXJnZXN0IGdlbmVyaWMgY29uZmlndXJhdGlvbicKKwlAZWNobyAnICBtZW51Y29uZmlnCQktIGludGVyYWN0aXZlIGN1cnNlcy1iYXNlZCBjb25maWd1cmF0b3InCisJQGVjaG8gJyAgb2xkY29uZmlnCQktIHJlc29sdmUgYW55IHVucmVzb2x2ZWQgc3ltYm9scyBpbiAuY29uZmlnJworCUBlY2hvICcgIGhvc3R0b29scyAgCQktIGJ1aWxkIHNlZCBmb3IgdGhlIGhvc3QuJworCUBlY2hvICcgIAkJCSAgWW91IGNhbiB1c2UgdGhlc2UgY29tbWFuZHMgaWYgdGhlIGNvbW1hbmRzIG9uIHRoZSBob3N0JworCUBlY2hvICcgIAkJCSAgaXMgdW51c2FibGUuIEFmdGVyd2FyZHMgdXNlIGl0IGxpa2U6JworCUBlY2hvICcgIAkJCSAgbWFrZSBTRUQ9IiQob2JqdHJlZSkvc2VkIicKKwlAJChpZiAkKGJvYXJkcyksIFwKKwkJJChmb3JlYWNoIGIsICQoYm9hcmRzKSwgXAorCQlwcmludGYgIiAgJS0yMXMgLSBCdWlsZCBmb3IgJXNcXG4iICQoYikgJChzdWJzdCBfZGVmY29uZmlnLCwkKGIpKTspIFwKKwkJZWNobyAnJykKKwlAZWNobworCUBlY2hvICdJbnN0YWxsYXRpb246JworCUBlY2hvICcgIGluc3RhbGwJCS0gaW5zdGFsbCBidXN5Ym94IGludG8gQ09ORklHX1BSRUZJWCcKKwlAZWNobyAnICB1bmluc3RhbGwnCisJQGVjaG8KKwlAZWNobyAnRGV2ZWxvcG1lbnQ6JworCUBlY2hvICcgIGJhc2VsaW5lCQktIGNyZWF0ZSBidXN5Ym94X29sZCBmb3IgYmxvYXRjaGVjay4nCisJQGVjaG8gJyAgYmxvYXRjaGVjawkJLSBzaG93IHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHZlcnNpb25zJworCUBlY2hvICcgIGNoZWNrCQkJLSBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIGFsbCBhcHBsZXRzJworCUBlY2hvICcgIGNoZWNraGVscAkJLSBjaGVjayBmb3IgbWlzc2luZyBoZWxwLWVudHJpZXMgaW4gQ29uZmlnLmluJworCUBlY2hvICcgIHJhbmRjb25maWcJCS0gZ2VuZXJhdGUgYSByYW5kb20gY29uZmlndXJhdGlvbicKKwlAZWNobyAnICByZWxlYXNlCQktIGNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiB0YXJiYWxsJworCUBlY2hvICcgIHNpemVzCQkJLSBzaG93IHNpemUgb2YgYWxsIGVuYWJsZWQgYnVzeWJveCBzeW1ib2xzJworCUBlY2hvICcgIG9ianNpemVzCQktIHNob3cgc2l6ZSBvZiBlYWNoIC5vIG9iamVjdCBidWlsdCcKKwlAZWNobyAnICBiaWdkYXRhCQktIHNob3cgZGF0YSBvYmplY3RzLCBiaWdnZXN0IGZpcnN0JworCUBlY2hvICcgIHN0a3NpemVzCQktIHNob3cgc3RhY2sgdXNlcnMsIGJpZ2dlc3QgZmlyc3QnCisJQGVjaG8KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQwZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMjA0IEBACitQbGVhc2Ugc2VlIHRoZSBMSUNFTlNFIGZpbGUgZm9yIGRldGFpbHMgb24gY29weWluZyBhbmQgdXNhZ2UuCitQbGVhc2UgcmVmZXIgdG8gdGhlIElOU1RBTEwgZmlsZSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBidWlsZC4KKworV2hhdCBpcyBidXN5Ym94OgorCisgIEJ1c3lCb3ggY29tYmluZXMgdGlueSB2ZXJzaW9ucyBvZiBtYW55IGNvbW1vbiBVTklYIHV0aWxpdGllcyBpbnRvIGEgc2luZ2xlCisgIHNtYWxsIGV4ZWN1dGFibGUuICBJdCBwcm92aWRlcyBtaW5pbWFsaXN0IHJlcGxhY2VtZW50cyBmb3IgbW9zdCBvZiB0aGUKKyAgdXRpbGl0aWVzIHlvdSB1c3VhbGx5IGZpbmQgaW4gYnppcDIsIGNvcmV1dGlscywgZGhjcCwgZGlmZnV0aWxzLCBlMmZzcHJvZ3MsCisgIGZpbGUsIGZpbmR1dGlscywgZ2F3aywgZ3JlcCwgaW5ldHV0aWxzLCBsZXNzLCBtb2R1dGlscywgbmV0LXRvb2xzLCBwcm9jcHMsCisgIHNlZCwgc2hhZG93LCBzeXNrbG9nZCwgc3lzdmluaXQsIHRhciwgdXRpbC1saW51eCwgYW5kIHZpbS4gIFRoZSB1dGlsaXRpZXMKKyAgaW4gQnVzeUJveCBvZnRlbiBoYXZlIGZld2VyIG9wdGlvbnMgdGhhbiB0aGVpciBmdWxsLWZlYXR1cmVkIGNvdXNpbnM7CisgIGhvd2V2ZXIsIHRoZSBvcHRpb25zIHRoYXQgYXJlIGluY2x1ZGVkIHByb3ZpZGUgdGhlIGV4cGVjdGVkIGZ1bmN0aW9uYWxpdHkKKyAgYW5kIGJlaGF2ZSB2ZXJ5IG11Y2ggbGlrZSB0aGVpciBsYXJnZXIgY291bnRlcnBhcnRzLgorCisgIEJ1c3lCb3ggaGFzIGJlZW4gd3JpdHRlbiB3aXRoIHNpemUtb3B0aW1pemF0aW9uIGFuZCBsaW1pdGVkIHJlc291cmNlcyBpbgorICBtaW5kLCBib3RoIHRvIHByb2R1Y2Ugc21hbGwgYmluYXJpZXMgYW5kIHRvIHJlZHVjZSBydW4tdGltZSBtZW1vcnkgdXNhZ2UuCisgIEJ1c3lib3ggaXMgYWxzbyBleHRyZW1lbHkgbW9kdWxhciBzbyB5b3UgY2FuIGVhc2lseSBpbmNsdWRlIG9yIGV4Y2x1ZGUKKyAgY29tbWFuZHMgKG9yIGZlYXR1cmVzKSBhdCBjb21waWxlIHRpbWUuICBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gY3VzdG9taXplCisgIGVtYmVkZGVkIHN5c3RlbXM7IHRvIGNyZWF0ZSBhIHdvcmtpbmcgc3lzdGVtLCBqdXN0IGFkZCAvZGV2LCAvZXRjLCBhbmQgYQorICBMaW51eCBrZXJuZWwuICBCdXN5Ym94ICh1c3VhbGx5IHRvZ2V0aGVyIHdpdGggdUNsaWJjKSBoYXMgYWxzbyBiZWVuIHVzZWQgYXMKKyAgYSBjb21wb25lbnQgb2YgInRoaW4gY2xpZW50IiBkZXNrdG9wIHN5c3RlbXMsIGxpdmUtQ0QgZGlzdHJpYnV0aW9ucywgcmVzY3VlCisgIGRpc2tzLCBpbnN0YWxsZXJzLCBhbmQgc28gb24uCisKKyAgQnVzeUJveCBwcm92aWRlcyBhIGZhaXJseSBjb21wbGV0ZSBQT1NJWCBlbnZpcm9ubWVudCBmb3IgYW55IHNtYWxsIHN5c3RlbSwKKyAgYm90aCBlbWJlZGRlZCBlbnZpcm9ubWVudHMgYW5kIG1vcmUgZnVsbCBmZWF0dXJlZCBzeXN0ZW1zIGNvbmNlcm5lZCBhYm91dAorICBzcGFjZS4gIEJ1c3lib3ggaXMgc2xvd2x5IHdvcmtpbmcgdG93YXJkcyBpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgU2luZ2xlIFVuaXgKKyAgU3BlY2lmaWNhdGlvbiBWMyAoaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5LyksIGJ1dCBpc24ndAorICB0aGVyZSB5ZXQgKGFuZCBmb3Igc2l6ZSByZWFzb25zIHdpbGwgcHJvYmFibHkgc3VwcG9ydCBhdCBtb3N0IFVURi04IGZvcgorICBpbnRlcm5hdGlvbmFsaXphdGlvbikuICBXZSBhcmUgYWxzbyBpbnRlcmVzdGVkIGluIHBhc3NpbmcgdGhlIExpbnV4IFRlc3QKKyAgUHJvamVjdCAoaHR0cDovL2x0cC5zb3VyY2Vmb3JnZS5uZXQpLgorCistLS0tLS0tLS0tLS0tLS0tCisKK1VzaW5nIGJ1c3lib3g6CisKKyAgQnVzeUJveCBpcyBleHRyZW1lbHkgY29uZmlndXJhYmxlLiAgVGhpcyBhbGxvd3MgeW91IHRvIGluY2x1ZGUgb25seSB0aGUKKyAgY29tcG9uZW50cyBhbmQgb3B0aW9ucyB5b3UgbmVlZCwgdGhlcmVieSByZWR1Y2luZyBiaW5hcnkgc2l6ZS4gIFJ1biAnbWFrZQorICBjb25maWcnIG9yICdtYWtlIG1lbnVjb25maWcnIHRvIHNlbGVjdCB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHlvdSB3aXNoIHRvCisgIGVuYWJsZS4gIChTZWUgJ21ha2UgaGVscCcgZm9yIG1vcmUgY29tbWFuZHMuKQorCisgIFRoZSBiZWhhdmlvciBvZiBidXN5Ym94IGlzIGRldGVybWluZWQgYnkgdGhlIG5hbWUgaXQncyBjYWxsZWQgdW5kZXI6IGFzCisgICJjcCIgaXQgYmVoYXZlcyBsaWtlIGNwLCBhcyAic2VkIiBpdCBiZWhhdmVzIGxpa2Ugc2VkLCBhbmQgc28gb24uICBDYWxsZWQKKyAgYXMgImJ1c3lib3giIGl0IHRha2VzIHRoZSBzZWNvbmQgYXJndW1lbnQgYXMgdGhlIG5hbWUgb2YgdGhlIGFwcGxldCB0bworICBydW4gKEkuRS4gIi4vYnVzeWJveCBscyAtbCAvcHJvYyIpLgorCisgIFRoZSAic3RhbmRhbG9uZSBzaGVsbCIgbW9kZSBpcyBhbiBlYXN5IHdheSB0byB0cnkgb3V0IGJ1c3lib3g7IHRoaXMgaXMgYQorICBjb21tYW5kIHNoZWxsIHRoYXQgY2FsbHMgdGhlIGJ1aWx0LWluIGFwcGxldHMgd2l0aG91dCBuZWVkaW5nIHRoZW0gdG8gYmUKKyAgaW5zdGFsbGVkIGluIHRoZSBwYXRoLiAgKE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIC9wcm9jIHRvIGJlIG1vdW50ZWQsIGlmCisgIHRlc3RpbmcgZnJvbSBhIGJvb3QgZmxvcHB5IG9yIGluIGEgY2hyb290IGVudmlyb25tZW50LikKKworICBUaGUgYnVpbGQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgYSBmaWxlICJidXN5Ym94LmxpbmtzIiwgd2hpY2ggaXMgdXNlZCBieQorICAnbWFrZSBpbnN0YWxsJyB0byBjcmVhdGUgc3ltbGlua3MgdG8gdGhlIEJ1c3lCb3ggYmluYXJ5IGZvciBhbGwgY29tcGlsZWQgaW4KKyAgY29tbWFuZHMuICBUaGlzIHVzZXMgdGhlIENPTkZJR19QUkVGSVggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc3BlY2lmeQorICB3aGVyZSB0byBpbnN0YWxsLCBhbmQgaW5zdGFsbHMgaGFyZGxpbmtzIG9yIHN5bWxpbmtzIGRlcGVuZGluZworICBvbiB0aGUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlcy4gIChZb3UgY2FuIGFsc28gbWFudWFsbHkgcnVuCisgIHRoZSBpbnN0YWxsIHNjcmlwdCBhdCAiYXBwbGV0cy9pbnN0YWxsLnNoIikuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworRG93bmxvYWRpbmcgdGhlIGN1cnJlbnQgc291cmNlIGNvZGU6CisKKyAgU291cmNlIGZvciB0aGUgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb24sIGFzIHdlbGwgYXMgZGFpbHkgc25hcHNob3RzLCBjYW4gYWx3YXlzCisgIGJlIGRvd25sb2FkZWQgZnJvbQorCisgICAgaHR0cDovL2J1c3lib3gubmV0L2Rvd25sb2Fkcy8KKworICBZb3UgY2FuIGJyb3dzZSB0aGUgdXAgdG8gdGhlIG1pbnV0ZSBzb3VyY2UgY29kZSBhbmQgY2hhbmdlIGhpc3Rvcnkgb25saW5lLgorCisgICAgaHR0cDovL2dpdC5idXN5Ym94Lm5ldC9idXN5Ym94LworCisgIEFub255bW91cyBHSVQgYWNjZXNzIGlzIGF2YWlsYWJsZS4gIEZvciBpbnN0cnVjdGlvbnMsIGNoZWNrIG91dDoKKworICAgIGh0dHA6Ly93d3cuYnVzeWJveC5uZXQvc291cmNlLmh0bWwKKworICBGb3IgdGhvc2UgdGhhdCBhcmUgYWN0aXZlbHkgY29udHJpYnV0aW5nIGFuZCB3b3VsZCBsaWtlIHRvIGNoZWNrIGZpbGVzIGluLAorICBzZWU6CisKKyAgICBodHRwOi8vYnVzeWJveC5uZXQvZGV2ZWxvcGVyLmh0bWwKKworICBUaGUgZGV2ZWxvcGVycyBhbHNvIGhhdmUgYSBidWcgYW5kIHBhdGNoIHRyYWNraW5nIHN5c3RlbQorICAoaHR0cHM6Ly9idWdzLmJ1c3lib3gubmV0KSBhbHRob3VnaCBwb3N0aW5nIGEgYnVnL3BhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QKKyAgaXMgZ2VuZXJhbGx5IGEgZmFzdGVyIHdheSBvZiBnZXR0aW5nIGl0IGZpeGVkLCBhbmQgdGhlIGNvbXBsZXRlIGFyY2hpdmUgb2YKKyAgd2hhdCBoYXBwZW5lZCBpcyB0aGUgZ2l0IGNoYW5nZWxvZy4KKworICBOb3RlOiBpZiB5b3Ugd2FudCB0byBjb21waWxlIGJ1c3lib3ggaW4gYSBidXN5Ym94IGVudmlyb25tZW50IHlvdSBtdXN0CisgIHNlbGVjdCBDT05GSUdfREVTS1RPUC4KKworLS0tLS0tLS0tLS0tLS0tLQorCitHZXR0aW5nIGhlbHA6CisKKyAgd2hlbiB5b3UgZmluZCB5b3UgbmVlZCBoZWxwLCB5b3UgY2FuIGNoZWNrIG91dCB0aGUgYnVzeWJveCBtYWlsaW5nIGxpc3QKKyAgYXJjaGl2ZXMgYXQgaHR0cDovL2J1c3lib3gubmV0L2xpc3RzL2J1c3lib3gvIG9yIGV2ZW4gam9pbgorICB0aGUgbWFpbGluZyBsaXN0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZC4KKworLS0tLS0tLS0tLS0tLS0tLQorCitCdWdzOgorCisgIGlmIHlvdSBmaW5kIGJ1Z3MsIHBsZWFzZSBzdWJtaXQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IHRvIHRoZSBidXN5Ym94IG1haWxpbmcKKyAgbGlzdCBhdCBidXN5Ym94QGJ1c3lib3gubmV0LiAgYSB3ZWxsLXdyaXR0ZW4gYnVnIHJlcG9ydCBzaG91bGQgaW5jbHVkZSBhCisgIHRyYW5zY3JpcHQgb2YgYSBzaGVsbCBzZXNzaW9uIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBiYWQgYmVoYXZpb3IgYW5kIGVuYWJsZXMKKyAgYW55b25lIGVsc2UgdG8gZHVwbGljYXRlIHRoZSBidWcgb24gdGhlaXIgb3duIG1hY2hpbmUuIHRoZSBmb2xsb3dpbmcgaXMgc3VjaAorICBhbiBleGFtcGxlOgorCisgICAgdG86IGJ1c3lib3hAYnVzeWJveC5uZXQKKyAgICBmcm9tOiBkaWxpZ2VudEB0ZXN0aW5nLmxpbnV4Lm9yZworICAgIHN1YmplY3Q6IC9iaW4vZGF0ZSBkb2Vzbid0IHdvcmsKKworICAgIHBhY2thZ2U6IGJ1c3lib3gKKyAgICB2ZXJzaW9uOiAxLjAwCisKKyAgICB3aGVuIGkgZXhlY3V0ZSBidXN5Ym94ICdkYXRlJyBpdCBwcm9kdWNlcyB1bmV4cGVjdGVkIHJlc3VsdHMuCisgICAgd2l0aCBnbnUgZGF0ZSBpIGdldCB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworCSQgZGF0ZQorCWZyaSBvY3QgIDggMTQ6MTk6NDEgbWR0IDIwMDQKKworICAgIGJ1dCB3aGVuIGkgdXNlIGJ1c3lib3ggZGF0ZSBpIGdldCB0aGlzIGluc3RlYWQ6CisKKwkkIGRhdGUKKwlpbGxlZ2FsIGluc3RydWN0aW9uCisKKyAgICBpIGFtIHVzaW5nIGRlYmlhbiB1bnN0YWJsZSwga2VybmVsIHZlcnNpb24gMi40LjI1LXZyczIgb24gYSBuZXR3aW5kZXIsCisgICAgYW5kIHRoZSBsYXRlc3QgdWNsaWJjIGZyb20gY3ZzLgorCisJLWRpbGlnZW50CisKKyAgbm90ZSB0aGUgY2FyZWZ1bCBkZXNjcmlwdGlvbiBhbmQgdXNlIG9mIGV4YW1wbGVzIHNob3dpbmcgbm90IG9ubHkgd2hhdAorICBidXN5Ym94IGRvZXMsIGJ1dCBhbHNvIGEgY291bnRlciBleGFtcGxlIHNob3dpbmcgd2hhdCBhbiBlcXVpdmFsZW50IGFwcAorICBkb2VzIChvciBwb2ludGluZyB0byB0aGUgdGV4dCBvZiBhIHJlbGV2YW50IHN0YW5kYXJkKS4gIEJ1ZyByZXBvcnRzIGxhY2tpbmcKKyAgc3VjaCBkZXRhaWwgbWF5IG5ldmVyIGJlIGZpeGVkLi4uICBUaGFua3MgZm9yIHVuZGVyc3RhbmRpbmcuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworUG9ydGFiaWxpdHk6CisKKyAgQnVzeWJveCBpcyBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbiBMaW51eCAyLjQgYW5kIDIuNiBrZXJuZWxzLCBjb21waWxlZAorICB3aXRoIGdjYyAodGhlIHVuaXQtYXQtYS10aW1lIG9wdGltaXphdGlvbnMgaW4gdmVyc2lvbiAzLjQgYW5kIGxhdGVyIGFyZQorICB3b3J0aCB1cGdyYWRpbmcgdG8gZ2V0LCBidXQgb2xkZXIgdmVyc2lvbnMgc2hvdWxkIHdvcmspLCBhbmQgbGlua2VkIGFnYWluc3QKKyAgdUNsaWJjICgwLjkuMjcgb3IgZ3JlYXRlcikgb3IgZ2xpYmMgKDIuMiBvciBncmVhdGVyKS4gIEluIHN1Y2ggYW4KKyAgZW52aXJvbm1lbnQsIHRoZSBmdWxsIHNldCBvZiBidXN5Ym94IGZlYXR1cmVzIHNob3VsZCB3b3JrLCBhbmQgaWYKKyAgYW55dGhpbmcgZG9lc24ndCB3ZSB3YW50IHRvIGtub3cgYWJvdXQgaXQgc28gd2UgY2FuIGZpeCBpdC4KKworICBUaGVyZSBhcmUgbWFueSBvdGhlciBlbnZpcm9ubWVudHMgb3V0IHRoZXJlLCBpbiB3aGljaCBidXN5Ym94IG1heSBidWlsZAorICBhbmQgcnVuIGp1c3QgZmluZS4gIFdlIGp1c3QgZG9uJ3QgdGVzdCB0aGVtLiAgU2luY2UgYnVzeWJveCBjb25zaXN0cyBvZiBhCisgIGxhcmdlIG51bWJlciBvZiBtb3JlIG9yIGxlc3MgaW5kZXBlbmRlbnQgYXBwbGV0cywgcG9ydGFiaWxpdHkgaXMgYSBxdWVzdGlvbgorICBvZiB3aGljaCBmZWF0dXJlcyB3b3JrIHdoZXJlLiAgU29tZSBidXN5Ym94IGFwcGxldHMgKHN1Y2ggYXMgY2F0IGFuZCBybSkgYXJlCisgIGhpZ2hseSBwb3J0YWJsZSBhbmQgbGlrZWx5IHRvIHdvcmsganVzdCBhYm91dCBhbnl3aGVyZSwgd2hpbGUgb3RoZXJzIChzdWNoIGFzCisgIGluc21vZCBhbmQgbG9zZXR1cCkgcmVxdWlyZSByZWNlbnQgTGludXgga2VybmVscyB3aXRoIHJlY2VudCBDIGxpYnJhcmllcy4KKworICBFYXJsaWVyIHZlcnNpb25zIG9mIExpbnV4IGFuZCBnbGliYyBtYXkgb3IgbWF5IG5vdCB3b3JrLCBmb3IgYW55IGdpdmVuCisgIGNvbmZpZ3VyYXRpb24uICBMaW51eCAyLjIgb3IgZWFybGllciBzaG91bGQgbW9zdGx5IHdvcmsgKHRoZXJlJ3Mgc3RpbGwKKyAgc29tZSBzdXBwb3J0IGNvZGUgaW4gdGhpbmdzIGxpa2UgbW91bnQuYykgYnV0IHRoaXMgaXMgbm8gbG9uZ2VyIHJlZ3VsYXJseQorICB0ZXN0ZWQsIGFuZCBpbmhlcmVudGx5IHdvbid0IHN1cHBvcnQgY2VydGFpbiBmZWF0dXJlcyAoc3VjaCBhcyBsb25nIGZpbGVzCisgIGFuZCAtLWJpbmQgbW91bnRzKS4gIFRoZSBzYW1lIGlzIHRydWUgZm9yIGdsaWJjIDIuMCBhbmQgMi4xOiBleHBlY3QgYSBoaWdoZXIKKyAgdGVzdGluZyBhbmQgZGVidWdnaW5nIGJ1cmRlbiB1c2luZyBzdWNoIG9sZCBpbmZyYXN0cnVjdHVyZS4gIChUaGUgYnVzeWJveAorICBkZXZlbG9wZXJzIGFyZSBub3QgdmVyeSBpbnRlcmVzdGVkIGluIHN1cHBvcnRpbmcgdGhlc2Ugb2xkZXIgdmVyc2lvbnMsIGJ1dAorICB3aWxsIHByb2JhYmx5IGFjY2VwdCBzbWFsbCBzZWxmLWNvbnRhaW5lZCBwYXRjaGVzIHRvIGZpeCBzaW1wbGUgcHJvYmxlbXMuKQorCisgIFNvbWUgZW52aXJvbm1lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQuICBFYXJseSB2ZXJzaW9ucyBvZiB1Q2xpYmMgd2VyZSBidWdneQorICBhbmQgbWlzc2luZyBtYW55IGZlYXR1cmVzOiB1cGdyYWRlLiAgTGlua2luZyBhZ2FpbnN0IGxpYmM1IG9yIGRpZXRsaWJjIGlzCisgIG5vdCBzdXBwb3J0ZWQgYW5kIG5vdCBpbnRlcmVzdGluZyB0byB0aGUgYnVzeWJveCBkZXZlbG9wZXJzLiAgKFRoZSBmaXJzdCBpcworICBvYnNvbGV0ZSBhbmQgaGFzIG5vIGtub3duIHNpemUgb3IgZmVhdHVyZSBhZHZhbnRhZ2VzIG92ZXIgdUNsaWJjLCB0aGUgc2Vjb25kCisgIGhhcyBrbm93biBidWdzIHRoYXQgaXRzIGRldmVsb3BlcnMgaGF2ZSBhY3RpdmVseSByZWZ1c2VkIHRvIGZpeC4pICBBbmNpZW50CisgIExpbnV4IGtlcm5lbHMgKDIuMC54IGFuZCBlYXJsaWVyKSBhcmUgc2ltaWxhcmx5IHVuaW50ZXJlc3RpbmcuCisKKyAgSW4gdGhlb3J5IGl0J3MgcG9zc2libGUgdG8gdXNlIEJ1c3lib3ggdW5kZXIgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgKHN1Y2ggYXMKKyAgTWFjT1MgWCwgU29sYXJpcywgQ3lnd2luLCBvciB0aGUgQlNEIEZvcmsgRHUgSm91cikuICBUaGlzIGdlbmVyYWxseSBpbnZvbHZlcworICBhIGRpZmZlcmVudCBrZXJuZWwgYW5kIGEgZGlmZmVyZW50IEMgbGlicmFyeSBhdCB0aGUgc2FtZSB0aW1lLiAgV2hpbGUgaXQKKyAgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHBvcnQgdGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlIHRvIHdvcmsgaW4gb25lIG9mCisgIHRoZXNlIGVudmlyb25tZW50cywgZG9uJ3QgYmUgc3VycHJpc2VkIGlmIGl0IGRvZXNuJ3Qgd29yayBvdXQgb2YgdGhlIGJveC4gIElmCisgIHlvdSdyZSBpbnRvIHRoYXQgc29ydCBvZiB0aGluZywgc3RhcnQgc21hbGwgKHNlbGVjdGluZyBqdXN0IGEgZmV3IGFwcGxldHMpCisgIGFuZCB3b3JrIHlvdXIgd2F5IHVwLgorCisgIEluIDIwMDUgU2hhdW4gSmFja21hbiBoYXMgcG9ydGVkIGJ1c3lib3ggdG8gYSBjb21iaW5hdGlvbiBvZiBuZXdsaWIKKyAgYW5kIGxpYmdsb3NzLCBhbmQgc29tZSBvZiBoaXMgcGF0Y2hlcyBoYXZlIGJlZW4gaW50ZWdyYXRlZC4KKworU3VwcG9ydGVkIGhhcmR3YXJlOgorCisgIEJ1c3lCb3ggaW4gZ2VuZXJhbCB3aWxsIGJ1aWxkIG9uIGFueSBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkIGJ5IGdjYy4gIFdlCisgIHN1cHBvcnQgYm90aCAzMiBhbmQgNjQgYml0IHBsYXRmb3JtcywgYW5kIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuCisgIHN5c3RlbXMuCisKKyAgVW5kZXIgMi40IExpbnV4IGtlcm5lbHMsIGtlcm5lbCBtb2R1bGUgbG9hZGluZyB3YXMgaW1wbGVtZW50ZWQgaW4gYQorICBwbGF0Zm9ybS1zcGVjaWZpYyBtYW5uZXIuICBCdXN5Ym94J3MgaW5zbW9kIHV0aWxpdHkgaGFzIGJlZW4gcmVwb3J0ZWQgdG8KKyAgd29yayB1bmRlciBBUk0sIENSSVMsIEg4LzMwMCwgeDg2LCBpYTY0LCB4ODZfNjQsIG02OGssIE1JUFMsIFBvd2VyUEMsIFMzOTAsCisgIFNIMy80LzUsIFNwYXJjLCB2ODUwZSwgYW5kIHg4Nl82NC4gIEFueXRoaW5nIGVsc2UgcHJvYmFibHkgd29uJ3Qgd29yay4KKworICBUaGUgbW9kdWxlIGxvYWRpbmcgbWVjaGFuaXNtIGZvciB0aGUgMi42IGtlcm5lbCBpcyBtdWNoIG1vcmUgZ2VuZXJpYywgYW5kCisgIHdlIGJlbGlldmUgMi42Lngga2VybmVsIG1vZHVsZSBsb2FkaW5nIHN1cHBvcnQgc2hvdWxkIHdvcmsgb24gYWxsCisgIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworUGxlYXNlIGZlZWQgc3VnZ2VzdGlvbnMsIGJ1ZyByZXBvcnRzLCBpbnN1bHRzLCBhbmQgYnJpYmVzIGJhY2sgdG8gdGhlIGJ1c3lib3gKK21haWxpbmcgbGlzdDoKKworCWJ1c3lib3hAYnVzeWJveC5uZXQKKworYW5kL29yIG1haW50YWluZXI6CisKKwlEZW55cyBWbGFzZW5rbworCTx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CmRpZmYgLS1naXQgYS9UT0RPIGIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjlmODdmCi0tLSAvZGV2L251bGwKKysrIGIvVE9ETwpAQCAtMCwwICsxLDI3NiBAQAorQnVzeWJveCBUT0RPCisKK0hhcnZlc3QgcGF0Y2hlcyBmcm9tCitodHRwOi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvY2dpdC5jZ2kvb3BlbmVtYmVkZGVkL3RyZWUvcmVjaXBlcy9idXN5Ym94LworCitTdHVmZiB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuICBUaGlzIGlzIG9yZ2FuaXplZCBieSB3aG8gcGxhbnMgdG8gZ2V0IGFyb3VuZCB0bworZG9pbmcgaXQgZXZlbnR1YWxseSwgYnV0IHRoYXQgZG9lc24ndCBtZWFuIHRoZXkgIm93biIgdGhlIGl0ZW0uICBJZiB5b3Ugd2FudCB0bworZG8gb25lIG9mIHRoZXNlIGJvdW5jZSBhbiBlbWFpbCBvZmYgdGhlIHBlcnNvbiBpdCdzIGxpc3RlZCB1bmRlciB0byBzZWUgaWYgdGhleQoraGF2ZSBhbnkgc3VnZ2VzdGlvbnMgaG93IHRoZXkgcGxhbiB0byBnbyBhYm91dCBpdCwgYW5kIHRvIG1pbmltaXplIGNvbmZsaWN0cworYmV0d2VlbiB5b3VyIHdvcmsgYW5kIHRoZWlycy4gIEJ1dCBvdGhlcndpc2UsIGFsbCBvZiB0aGVzZSBhcmUgZmFpciBnYW1lLgorCitSb2IgTGFuZGxleSBzdWdnZXN0ZWQgdGhpczoKKyAgSW1wbGVtZW50IGJiX3JlYWxwYXRoKCkgdGhhdCBjYW4gaGFuZGxlIE5VTEwgb24gbm9uLWdsaWJjLgorCisgIHNoCisgICAgVGhlIGNvbW1hbmQgc2hlbGwgc2l0dWF0aW9uIGlzIGEgbWVzcy4gIFdlIGhhdmUgdHdvIGRpZmZlcmVudAorICAgIHNoZWxscyB0aGF0IGRvbid0IHJlYWxseSBzaGFyZSBhbnkgY29kZSwgYW5kIHRoZSAic3RhbmRhbG9uZSBzaGVsbCIgZG9lc24ndAorICAgIHdvcmsgYWxsIHRoYXQgd2VsbCAoZXNwZWNpYWxseSBub3QgaW4gYSBjaHJvb3QgZW52aXJvbm1lbnQpLCBkdWUgdG8gYXBwcyBub3QKKyAgICBiZWluZyByZWVudHJhbnQuCisKKyAgRG8gYSBTVVN2MyBhdWRpdAorICAgIExvb2sgYXQgdGhlIGZ1bGwgU2luZ2xlIFVuaXggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDMgKGF2YWlsYWJsZSBvbmxpbmUgYXQKKyAgICAiaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L25maW5kZXguaHRtbCIpIGFuZAorICAgIGZpZ3VyZSBvdXQgd2hpY2ggb2Ygb3VyIGFwcHMgYXJlIGNvbXBsaWFudCwgYW5kIHdoYXQgd2UncmUgbWlzc2luZyB0aGF0CisgICAgd2UgbWlnaHQgYWN0dWFsbHkgY2FyZSBhYm91dC4KKworICAgIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIHNvbWUga2luZCBvZiBhdXRvbWF0ZWQgY29tcGxpYW5jZSB0ZXN0IGhhcm5lc3MgdGhhdAorICAgIGV4ZXJjaXNlcyBlYWNoIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIHRoZSB2YXJpb3VzIGNvcm5lciBjYXNlcy4KKworICBJbnRlcm5hdGlvbmFsaXphdGlvbgorICAgIEhvdyBtdWNoIGludGVybmF0aW9uYWxpemF0aW9uIHNob3VsZCB3ZSBkbz8KKworICAgIFRoZSBsb3cgaGFuZ2luZyBmcnVpdCBpcyBVVEYtOCBjaGFyYWN0ZXIgc2V0IHN1cHBvcnQuICBXZSBzaG91bGQgZG8gdGhpcy4KKyAgICBTZWUgVE9ET191bmljb2RlIGZpbGUuCisKKyAgICBXZSBhbHNvIGhhdmUgbG90cyBvZiBoYXJkd2lyZWQgZW5nbGlzaCB0ZXh0IG1lc3NhZ2VzLiAgQ29uc29saWRhdGluZyB0aGlzCisgICAgaW50byBzb21lIGtpbmQgb2YgbWVzc2FnZSB0YWJsZSBub3Qgb25seSBtYWtlcyB0cmFuc2xhdGlvbiBlYXNpZXIsIGJ1dAorICAgIGFsc28gYWxsb3dzIHVzIHRvIGNvbnNvbGlkYXRlIHJlZHVuZGFudCAob3IgY2xvc2UpIHN0cmluZ3MuCisKKyAgICBXZSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGJlIGJsb2F0ZWQgd2l0aCBsb2NhbGUgc3VwcG9ydC4gIChOb3QgdW5sZXNzIHdlCisgICAgY2FuIGNsZWFubHkgZXhwb3J0IGl0IGZyb20gb3VyIHVuZGVybHlpbmcgQyBsaWJyYXJ5IHdpdGhvdXQgaGF2aW5nIHRvCisgICAgY29uY2VybiBvdXJzZWx2ZXMgd2l0aCBpdCBkaXJlY3RseS4gIFBlcmhhcHMgYSBmZXcgc3BlY2lmaWMgdGhpbmdzIGxpa2UgYQorICAgIGNvbmZpZyBvcHRpb24gZm9yICJkYXRlIiBhcmUgbG93IGhhbmdpbmcgZnJ1aXQgaGVyZT8pCisKKyAgICBXaGF0IGxldmVsIHNob3VsZCB0aGluZ3MgaGFwcGVuIGF0PyAgSG93IG11Y2ggZG8gd2UgY2FyZSBhYm91dAorICAgIGludGVybmF0aW9uYWxpemluZyB0aGUgdGV4dCBjb25zb2xlIHdoZW4gWDExIGFuZCB4dGVybXMgYXJlIHNvIG11Y2ggYmV0dGVyCisgICAgYXQgaXQ/ICAoVGhlcmUncyBzb21lIGluZnJhc3RydWN0dXJlIGhlcmUgd2UgZG9uJ3QgaW1wbGVtZW50OiBUaGUKKyAgICAidW5pY29kZV9zdGFydCIgYW5kICJ1bmljb2RlX3N0b3AiIHNoZWxsIHNjcmlwdHMgbmVlZCAidnQtaXMtVVRGOCIgYW5kIGEKKyAgICAtLXVuaWNvZGUgb3B0aW9uIHRvIGxvYWRrZXlzLiAgVGhhdCBpbXBsaWVzIGEgcmVhbCBsb2Fka2V5cy9kdW1wa2V5cworICAgIGltcGxlbWVudGF0aW9uIHRvIHJlcGxhY2UgbG9hZGttYXAvZHVtcGttYXAuICBQbHVzIG1lc3Npbmcgd2l0aCBjb25zb2xlIGZvbnQKKyAgICBsb2FkaW5nLiAgSXMgaXQgd29ydGggaXQsIG9yIGRvIHdlIGp1c3Qgc2F5ICJ1c2UgWCI/KQorCisgIEluZGl2aWR1YWwgY29tcGlsYXRpb24gb2YgYXBwbGV0cy4KKyAgICBJdCB3b3VsZCBiZSBuaWNlIGlmIGJ1c3lib3ggaGFkIHRoZSBvcHRpb24gdG8gY29tcGlsZSB0byBpbmRpdmlkdWFsIGFwcGxldHMsCisgICAgZm9yIHBlb3BsZSB3aG8gd2FudCBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gbGVzcyBibG9hdGVkIHRoYW4gdGhlIGdudQorICAgIHV0aWxzIChvciBzaW1wbHkgd2l0aCBsZXNzIHBvbGl0aWNhbCBiYWdnYWdlKSwgYnV0IHdpdGhvdXQgaXQgYmVpbmcgb25lIGJpZworICAgIGV4ZWN1dGFibGUuCisKKyAgICBUdXJuaW5nIGxpYmJiIGludG8gYSByZWFsIGRsbCBpcyBhbm90aGVyIHBvc3NpYmlsaXR5LCBlc3BlY2lhbGx5IGlmIGxpYmJiCisgICAgY291bGQgZXhwb3J0IHNvbWUgb2YgdGhlIG90aGVyIGxpYnJhcnkgaW50ZXJmYWNlcyB3ZSd2ZSBhbHJlYWR5IG1vcmUgb3IgbGVzcworICAgIGdvdCB0aGUgY29kZSBmb3IgKGxpa2UgemxpYikuCisKKyAgYnVpbGRyb290IC0gTWFrZSBhICJkb2dmb29kIiBvcHRpb24KKyAgICBCdXN5Ym94IDEuMSB3aWxsIGJlIGNhcGFibGUgb2YgcmVwbGFjaW5nIG1vc3QgZ251IHBhY2thZ2VzIGZvciByZWFsIHdvcmxkCisgICAgdXNlLCBzdWNoIGFzIGRldmVsb3Bpbmcgc29mdHdhcmUgb3IgaW4gYSBsaXZlIENELiAgSXQgbmVlZHMgd2lkZXIgdGVzdGluZy4KKworICAgIEJ1c3lib3ggc2hvdWxkIG5vdyBiZSBhYmxlIHRvIHJlcGxhY2UgYnppcDIsIGNvcmV1dGlscywgZTJmc3Byb2dzLCBmaWxlLAorICAgIGZpbmR1dGlscywgZ2F3aywgZ3JlcCwgaW5ldHV0aWxzLCBsZXNzLCBtb2R1dGlscywgbmV0LXRvb2xzLCBwYXRjaCwgcHJvY3BzLAorICAgIHNlZCwgc2hhZG93LCBzeXNrbG9nZCwgc3lzdmluaXQsIHRhciwgdXRpbC1saW51eCwgYW5kIHZpbS4gIFRoZSByZXN1bHRpbmcKKyAgICBzeXN0ZW0gc2hvdWxkIGJlIHNlbGYtaG9zdGluZyAoSS5FLiBhYmxlIHRvIHJlYnVpbGQgaXRzZWxmIGZyb20gc291cmNlCisgICAgY29kZSkuICBUaGlzIG1lYW5zIGl0IHdvdWxkIG5lZWQgKGF0IGxlYXN0KSBiaW51dGlscywgZ2NjLCBhbmQgbWFrZSwgb3IKKyAgICBlcXVpdmFsZW50cy4KKworICAgIEl0IHdvdWxkIGJlIGEgZ29vZCAiZWF0aW5nIG91ciBvd24gZG9nZm9vZCIgdGVzdCBpZiBidWlsZHJvb3QgaGFkIHRoZSBvcHRpb24KKyAgICBvZiB1c2luZyBhICJtYWtlIGFsbHllc2NvbmZpZyIgYnVzeWJveCBpbnN0ZWFkIG9mIHRoZSBhbGwgb2YgdGhlIGFib3ZlCisgICAgcGFja2FnZXMuICBBbnl0aGluZyB0aGF0J3Mgd3Jvbmcgd2l0aCB0aGUgcmVzdWx0aW5nIHN5c3RlbSwgd2UgY2FuIGZpeC4gIChJdAorICAgIHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byB1cGdyYWRlIGJ1c3lib3ggdG8gYmUgYWJsZSB0byByZXBsYWNlIGJhc2ggYW5kCisgICAgZGlmZnV0aWxzIGFzIHdlbGwsIGJ1dCB3ZSdyZSBub3QgdGhlcmUgeWV0LikKKworICAgIE9uZSBleGFtcGxlIG9mIGFuIGV4aXN0aW5nIHN5c3RlbSB0aGF0IGRvZXMgdGhpcyBhbHJlYWR5IGlzIEZpcm13YXJlIExpbnV4OgorICAgICAgaHR0cDovL3d3dy5sYW5kbGV5Lm5ldC9jb2RlL2Zpcm13YXJlCisKKyAgaW5pdHJhbWZzCisgICAgQnVzeWJveCBzaG91bGQgaGF2ZSBhIHNhbXBsZSBpbml0cmFtZnMgYnVpbGQgc2NyaXB0LiAgVGhpcyBkZXBlbmRzIG9uCisgICAgc2hlbGwsIG1kZXYsIGFuZCBzd2l0Y2hfcm9vdC4KKworICBta2RlcAorICAgIFdyaXRlIGEgbWtkZXAgdGhhdCBkb2Vzbid0IHNlZ2ZhdWx0IGlmIHRoZXJlJ3MgYSBkaXJlY3RvcnkgaXQgZG9lc24ndAorICAgIGhhdmUgcGVybWlzc2lvbiB0byByZWFkLCBpc24ndCBiYXNlZCBvbiBtYW51YWxseSBlZGl0aW5nIHRoZSBvdXRwdXQgb2YKKyAgICBsZXh4IGFuZCB5YWNjLCBkb2Vzbid0IG1ha2Ugc3VjaCBhIG1lc3MgdW5kZXIgaW5jbHVkZS9jb25maWcsIGV0Yy4KKworICBHcm91cCBnbG9iYWxzIGludG8gdW5pb25zIG9mIHN0cnVjdHVyZXMuCisgICAgR28gdGhyb3VnaCBhbmQgdHVybiBhbGwgdGhlIGdsb2JhbCBhbmQgc3RhdGljIHZhcmlhYmxlcyBpbnRvIHN0cnVjdHVyZXMsCisgICAgYW5kIGhhdmUgYWxsIHRob3NlIHN0cnVjdHVyZXMgYmUgaW4gYSBiaWcgdW5pb24gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLAorICAgIHNvIGJ1c3lib3ggdXNlcyBsZXNzIGJzcy4gIChUaGlzIGlzIGEgYmlnIHdpbiBvbiBub21tdSBtYWNoaW5lcy4pICBTZWUKKyAgICBzZWQuYyBhbmQgbWRldi5jIGZvciBleGFtcGxlcy4KKworICBHbyB0aHJvdWdoIGJ1Z3MuYnVzeWJveC5uZXQgYW5kIGNsb3NlIG91dCBhbGwgb2YgdGhhdCBzb21laG93LgorICAgIFRoaXMgb25lJ3Mgb3BlbiB0byBldmVyeWJvZHksIGJ1dCBJJ2xsIHdpbmQgdXAgZG9pbmcgaXQuLi4KKworQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIDxidXN5Ym94QGJ1c3lib3gubmV0PiBzdWdnZXN0cyB0byBsb29rIGF0IHRoZXNlOgorICBOZXcgZGVidWcgb3B0aW9uczoKKyAgICAtV2xhcmdlci10aGFuLTEyNworICAgIENsZWFudXAgYW55IGJpZyB1c2VycworICBDb2xsYXRlIEJVRlNJWiBJT0JVRl9TSVpFIE1ZX0JVRl9TSVpFIFBJUEVfUFJPR1JFU1NfU0laRSBCVUZTSVpFIFBJUEVTSVpFCisgICAgbWFrZSBiYl9jb21tb25fYnVmc2l6MSBjb25maWd1cmFibGUsIHNpemUgd2lzZS4KKyAgICBtYWtlIHBpcGVzaXplIGNvbmZpZ3VyYWJsZSwgc2l6ZSB3aXNlLgorICAgIFVzZSBiYl9jb21tb25fYnVmc2l6MSB0aHJvdWdob3V0IGFwcGxldHMhCisKK0FzIHlldCB1bmNsYWltZWQ6CisKKy0tLS0KK2RpZmYKKyAgTWFrZSBzdXJlIHdlIGhhbmRsZSBlbXB0eSBmaWxlcyBwcm9wZXJseToKKyAgICBGcm9tIHRoZSBwYXRjaCBtYW4gcGFnZToKKworICAgIHlvdSBjYW4gcmVtb3ZlIGEgZmlsZSBieSBzZW5kaW5nIG91dCBhIGNvbnRleHQgZGlmZiB0aGF0IGNvbXBhcmVzCisgICAgdGhlIGZpbGUgdG8gYmUgZGVsZXRlZCB3aXRoIGFuIGVtcHR5IGZpbGUgZGF0ZWQgdGhlIEVwb2NoLiAgVGhlCisgICAgZmlsZSB3aWxsIGJlIHJlbW92ZWQgdW5sZXNzIHBhdGNoIGlzIGNvbmZvcm1pbmcgdG8gUE9TSVggYW5kIHRoZQorICAgIC1FIG9yIC0tcmVtb3ZlLWVtcHR5LWZpbGVzIG9wdGlvbiBpcyBub3QgZ2l2ZW4uCistLS0KK3BhdGNoCisgIFNob3VsZCBoYXZlIHNpbXBsZSBmdXp6IGZhY3RvciBzdXBwb3J0IHRvIGFwcGx5IHBhdGNoZXMgYXQgYW4gb2Zmc2V0IHdoaWNoCisgIHNob3VsZG4ndCB0YWtlIHVwIHRvbyBtdWNoIHNwYWNlLgorCisgIEFuZCB3aGlsZSB3ZSdyZSBhdCBpdCwgYSBuZXcgcGF0Y2ggZmlsZW5hbWUgcXVvdGluZyBmb3JtYXQgaXMgYXBwYXJlbnRseQorICBjb21pbmcgc29vbjogIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTEyOTI3MzE2NDA4NjkwJnc9MgorLS0tCitzdHR5IC8gY2F0dgorICBzdHR5J3MgdmlzaWJsZSgpIGZ1bmN0aW9uIGFuZCBjYXR2J3MgZ3V0cyBhcmUgaWRlbnRpY2FsLiBNZXJnZSB0aGVtIGludG8KKyAgYW4gYXBwcm9wcmlhdGUgbGliYmIgZnVuY3Rpb24uCistLS0KK3N0cnVjdCBzdWZmaXhfbXVsdAorICBTZXZlcmFsIGR1cGxpY2F0ZSB1c2VycyBvZjogZ3JlcCAtciAiMTAyNFwqMTAyNCIgKiAtQjIgLUExCisgIE1lcmdlIHRvIGEgc2luZ2xlIHNpemVfc3VmZml4ZXNbXSBpbiBsaWJiYi4KKyAgVXNlcnM6IGhlYWQgdGFpbCBvZF9ibG9hdHkgaGV4ZHVtcCBhbmQgKHBhcnRpYWxseSBhcyBpdCB3b3VsZG4ndCBodXJ0KSBzdmxvZ2QKKy0tLQordGFpbAorICAuL2J1c3lib3ggdGFpbCAtZiBmb28uY34gVE9ETworICBzaG91bGQgbm90IHByaW50IGZtdD1oZWFkZXJfZm10IGZvciBzdWJzZXF1ZW50IGRhdGUgPj4gVE9ETzsgaS5lLiBvbmx5CisgIGZtdCsgaWYgYW5vdGhlciAobm90IHRoZSBjdXJyZW50KSBmaWxlIGRpZCBjaGFuZ2UKKworQXJjaGl0ZWN0dXJhbCBpc3N1ZXM6CisKK2JiX2Nsb3NlKCkgd2l0aCBmc3luYygpCisgIFdlIHNob3VsZCBoYXZlIGEgYmJfY2xvc2UoKSBpbiBwbGFjZSBvZiBub3JtYWwgY2xvc2UsIHdpdGggYSBDT05GSUdfIG9wdGlvbgorICB0byBub3QganVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGNsb3NlKCkgZm9yIGFuIGVycm9yLCBidXQgZnN5bmMoKS4KKyAgQ2xvc2UgY2FuJ3QgcmVsaWFibHkgcmVwb3J0IGFueXRoaW5nIHVzZWZ1bCBiZWNhdXNlIGlmIHdyaXRlKCkgYWNjZXB0ZWQgdGhlCisgIGRhdGEgdGhlbiBpdCBlaXRoZXIgd2VudCBvdXQgdG8gdGhlIG5ldHdvcmsgb3IgaXQncyBpbiBjYWNoZSBvciBhIHBpcGUKKyAgYnVmZmVyLiAgRWl0aGVyIHdheSwgdGhlcmUncyBubyBndWFyYW50ZWUgaXQnbGwgbWFrZSBpdCB0byBpdHMgZmluYWwKKyAgZGVzdGluYXRpb24gYmVmb3JlIGNsb3NlKCkgZ2V0cyBjYWxsZWQsIHNvIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgYW55CisgIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQuCisKKyAgWW91IG5lZWQgdG8gY2FsbCBmc3luYygpIGlmIHlvdSBjYXJlIGFib3V0IGVycm9ycyB0aGF0IG9jY3VyIGFmdGVyIHdyaXRlKCksCisgIGJ1dCB0aGF0IGNhbiBoYXZlIGEgYmlnIHBlcmZvcm1hbmNlIGltcGFjdC4gIFNvIG1ha2UgaXQgYSBjb25maWcgb3B0aW9uLgorLS0tCitVbmlmeSBhcmNoaXZlcnMKKyAgTG90cyBvZiBhcmNoaXZlcnMgaGF2ZSB0aGUgc2FtZSBnZW5lcmFsIGluZnJhc3RydWN0dXJlLiAgVGhlIGRpcmVjdG9yeQorICB0cmF2ZXJzYWwgY29kZSBzaG91bGQgYmUgZmFjdG9yZWQgb3V0LCBhbmQgdGhlIGd1dHMgb2YgZWFjaCBhcmNoaXZlciBjb3VsZAorICBiZSBzb21lIHNldHVwIGNvZGUgYW5kIGEgc2VyaWVzIG9mIGNhbGxiYWNrcyBmb3IgImFkZCB0aGlzIGZpbGUiLAorICAiYWRkIHRoaXMgZGlyZWN0b3J5IiwgImFkZCB0aGlzIHN5bWxpbmsiIGFuZCBzbyBvbi4KKworICBUaGlzIGNvdWxkIGNsZWFuIHVwIHRhciBhbmQgemlwLCBhbmQgbWFrZSBpdCBjaGVhcGVyIHRvIGFkZCBjcGlvIGFuZCBhcgorICB3cml0ZSBzdXBwb3J0LCBhbmQgcG9zc2libHkgZXZlbiBjaGVhcGx5IGFkZCB0aGluZ3MgbGlrZSBta2lzb2ZzIG9yCisgIG1rc3F1YXNoZnMgc29tZWRheSwgaWYgdGhleSBiZWNvbWUgcmVsZXZhbnQuCistLS0KK1RleHQgYnVmZmVyIHN1cHBvcnQuCisgIFNldmVyYWwgZXhpc3RpbmcgYXBwbGV0cyAoc29ydCwgdmksIGxlc3MuLi4pIHJlYWQKKyAgYSB3aG9sZSBmaWxlIGludG8gbWVtb3J5IGFuZCBhY3Qgb24gaXQuICBVc2Ugb3Blbl9yZWFkX2Nsb3NlKCkuCistLS0KK01lbW9yeSBBbGxvY2F0aW9uCisgIFdlIGhhdmUgYSBDT05GSUdfQlVGRkVSIG1lY2hhbmlzbSB0aGF0IGxldHMgdXMgc2VsZWN0IHdoZXRoZXIgdG8gZG8gbWVtb3J5CisgIGFsbG9jYXRpb24gb24gdGhlIHN0YWNrIG9yIHRoZSBoZWFwLiAgVW5mb3J0dW5hdGVseSwgd2UncmUgbm90IHVzaW5nIGl0IG11Y2guCisgIFdlIG5lZWQgdG8gYXVkaXQgb3VyIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgdHVybiBhIGxvdCBvZiBtYWxsb2MvZnJlZSBjYWxscworICBpbnRvIFJFU0VSVkVfQ09ORklHX0JVRkZFUi9SRUxFQVNFX0NPTkZJR19CVUZGRVIuCisgIEZvciBhIHN0YXJ0LCBzZWUgZS5nLiBtYWtlIEVYVFJBX0NGTEFHUz0tV2xhcmdlci10aGFuLTY0CisKKyAgQW5kIHdoaWxlIHdlJ3JlIGF0IGl0LCBtYW55IG9mIHRoZSBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCAjaWZkZWZzIHdpbGwgYmUKKyAgb3B0aW1pemVkIG91dCBieSB0aGUgY29tcGlsZXIgaW4gdGhlIHN0YWNrIGFsbG9jYXRpb24gY2FzZSAoc2luY2UgdGhlcmUncyBubworICBmcmVlIGZvciBhbiBhbGxvY2EoKSksIGFuZCB0aGlzIG1lYW5zIHRoYXQgdmFyaW91cyBjbGVhbnVwIGxvb3BzIHRoYXQganVzdAorICBjYWxsIGZyZWUgbWlnaHQgYWxzbyBiZSBvcHRpbWl6ZWQgb3V0IGJ5IHRoZSBjb21waWxlciBpZiB3cml0dGVuIHJpZ2h0LCBzbworICB3ZSBjYW4geWFuayB0aG9zZSAjaWZkZWZzIHRvbywgYW5kIGdlbmVyYWxseSBjbGVhbiB1cCB0aGUgY29kZS4KKy0tLQorRkVBVFVSRV9DTEVBTl9VUAorICBUaGlzIGlzIG1vcmUgYW4gdW5yZXNvbHZlZCBpc3N1ZSB0aGFuIGEgdG8tZG8gaXRlbS4gIE1vcmUgdGhvdWdodCBpcyBuZWVkZWQuCisKKyAgTm9ybWFsbHkgd2UgcmVseSBvbiBleGl0KCkgdG8gZnJlZSBtZW1vcnksIGNsb3NlIGZpbGVzIGFuZCB1bm1hcCBzZWdtZW50cworICBmb3IgdXMuICBUaGlzIG1ha2VzIG1vc3QgY2FsbHMgdG8gZnJlZSgpLCBjbG9zZSgpLCBhbmQgdW5tYXAoKSBvcHRpb25hbCBpbgorICBidXN5Ym94IGFwcGxldHMgdGhhdCBkb24ndCBpbnRlbmQgdG8gcnVuIGZvciB2ZXJ5IGxvbmcsIGFuZCBvcHRpb25hbCBzdHVmZgorICBjYW4gYmUgb21pdHRlZCB0byBzYXZlIHNpemUuCisKKyAgVGhlIGlkZWEgd2FzIHJhaXNlZCB0aGF0IHdlIGNvdWxkIHNpbXVsYXRlIGZvcmsvZXhpdCB3aXRoIHNldGptcC9sb25nam1wCisgIGZvciBfcmVhbGx5XyBicmFpbmxlc3MgZW1iZWRkZWQgc3lzdGVtcywgb3Igc3BlZWQgdXAgdGhlIHN0YW5kYWxvbmUgc2hlbGwKKyAgYnkgbm90IGZvcmtpbmcuICBEb2luZyBzbyB3b3VsZCByZXF1aXJlIGEgcmVsaWFibGUgRkVBVFVSRV9DTEVBTl9VUC4KKyAgVW5mb3J0dW5hdGVseSwgdGhpcyBpc24ndCBhcyBlYXN5IGFzIGl0IHNvdW5kcy4KKworICBUaGUgcHJvYmxlbSBpcywgbG90cyBvZiB0aGluZ3MgZXhpdCgpLCBzb21ldGltZXMgdW5leHBlY3RlZGx5ICh4bWFsbG9jKCkpCisgIGFuZCBzb21ldGltZXMgcmVsaWFibHkgKGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgpIG9yIHNob3dfdXNhZ2UoKSkuICBUaGlzCisgIGp1bXBzIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgY29udHJvbCBhbmQgYnlwYXNzZXMgYW55IGNsZWFudXAgY29kZSB3ZQorICBwdXQgYXQgdGhlIGVuZCBvZiBvdXIgYXBwbGV0cy4KKworICBJdCdzIHBvc3NpYmxlIHRvIGFkZCBob29rcyB0byBsaWJiYiBmdW5jdGlvbnMgbGlrZSB4bWFsbG9jKCkgYW5kIHhvcGVuKCkKKyAgdG8gYWRkIHRoZWlyIGVudHJpZXMgdG8gYSBsaW5rZWQgbGlzdCwgd2hpY2ggY291bGQgYmUgdHJhdmVyc2VkIGFuZAorICBmcmVlZC9jbG9zZWQgYXV0b21hdGljYWxseS4gIChUaGlzIHdvdWxkIG5lZWQgdG8gYmUgYWJsZSB0byBmcmVlIGp1c3QgdGhlCisgIGVudHJpZXMgYWZ0ZXIgYSBjaGVja3BvaW50IHRvIGJlIHVzYWJsZSBmb3IgYSBmb3JrbGVzcyBzdGFuZGFsb25lIHNoZWxsLgorICBZb3UgZG9uJ3Qgd2FudCB0byBmcmVlIHRoZSBzaGVsbCdzIG93biByZXNvdXJjZXMuKQorCisgIFJpZ2h0IG5vdywgRkVBVFVSRV9DTEVBTl9VUCBpcyBtb3JlIG9yIGxlc3MgYSBkZWJ1Z2dpbmcgYWlkLCB0byBtYWtlIHRoaW5ncworICBsaWtlIHZhbGdyaW5kIGhhcHB5LiAgSXQncyBhbHNvIGRvY3VtZW50YXRpb24gb2YgX3doYXRfIHdlJ3JlIHRydXN0aW5nCisgIGV4aXQoKSB0byBjbGVhbiB1cCBmb3IgdXMuICBCdXQgbmV3IGluZnJhc3RydWN0dXJlIHRvIGF1dG8tZnJlZSBzdHVmZiB3b3VsZAorICByZW5kZXIgdGhlIGV4aXN0aW5nIEZFQVRVUkVfQ0xFQU5fVVAgY29kZSByZWR1bmRhbnQuCisKKyAgRm9yIHJpZ2h0IG5vdywgZXhpdCgpIGhhbmRsZXMgaXQganVzdCBmaW5lLgorCisKK01pbm9yIHN0dWZmOgorICB3YXRjaGRvZy5jIGNvdWxkIGF1dG9kZXRlY3QgdGhlIHRpbWVyIGR1cmF0aW9uIHZpYToKKyAgICBpZighaW9jdGwgKGZkLCBXRElPQ19HRVRUSU1FT1VULCAmdG1vKSkgdGltZXJfZHVyYXRpb24gPSAxICsgKHRtbyAvIDIpOworICBVbmZvcnR1bmF0ZWx5LCB0aGF0IG5lZWRzIGxpbnV4L3dhdGNoZG9nLmggYW5kIHRoYXQgY29udGFpbnMgdW5maWx0ZXJlZAorICBrZXJuZWwgdHlwZXMgb24gc29tZSBkaXN0cm9zLCB3aGljaCBicmVha3MgdGhlIGJ1aWxkLgorLS0tCisgIHVzZSBiYl9lcnJvcl9tc2cgd2hlcmUgYXBwcm9wcmlhdGU6IFNlZQorICBlZ3JlcCAiKHByaW50Zi4qXChbWzpzcGFjZTpdXSooc3RkZXJyfDIpfFteX113cml0ZS4qXChbWzpzcGFjZTpdXSooc3RkZXJyfDIpKSIKKy0tLQorICB1c2UgYmJfcGVycm9yX21zZyB3aGVyZSBhcHByb3ByaWF0ZTogU2VlCisgIGVncmVwICJbXl9dcGVycm9yIgorLS0tCisgIHBvc3NpYmxlIGNvZGUgZHVwbGljYXRpb24gaW5ncm91cCgpIGFuZCBpc19hX2dyb3VwX21lbWJlcigpCistLS0KKyAgTW92ZSBfX2dldF9oeigpIHRvIGEgYmV0dGVyIHBsYWNlIGFuZCAocmUpdXNlIGl0IGluIHJvdXRlLmMsIGFzaC5jCistLS0KKyAgU2VlIGdyZXAgLXIgc3RydG9kCisgIEFsb3Qgb2YgZHVwbGljYXRpb24gdGhhdCB3YW50cyBjbGVhbnVwLgorLS0tCisgIGluX2V0aGVyIGR1cGxpY2F0ZWQgaW4gbmV0d29yay97aW50ZXJmYWNlLGlmY29uZmlnfS5jCistLS0KKyAgdW5pZnkgcHJvZ3Jlc3NfbWV0ZXIuIHdnZXQsIGZsYXNoX2VyYXNlYWxsLCBwaXBlX3Byb2dyZXNzLCBmYnNwbGFzaCwgc2V0ZmlsZXMuCistLS0KKyAgc3VwcG9ydCBzdGFydC1zdG9wLWRhZW1vbiAtZCA8Y2hkaXItcGF0aD4KKy0tLQordmRwcmludGYoKSAtPiBzaW1pbGFyIHNpemVkIGZ1bmN0aW9uYWxpdHkKKy0tLQorCisoVE9ETyBsaXN0IGFmdGVyIGRpc2N1c3Npb24gMTEuMDUuMjAwOSkKKworKiBzaHJpbmsgdGMvYnJjdGwvaXAKKyAgdGMvYnJjdGwgc2VlbSBsaWtlIGZhaXJseSBsYXJnZSB0aGluZ3MgdG8gdHJ5IGFuZCB0YWNrbGUgaW4geW91ciB0aW1lZnJhbWUsCisgIGFuZCBpIHRoaW5rIHBlb3BsZSBoYXZlIHBvc3RlZCBhdHRlbXB0cyBpbiB0aGUgcGFzdC4gQWRkaW5nIGFkZGl0aW9uYWwKKyAgb3B0aW9ucyB0byBpcCB0aG91Z2ggc2VlbXMgcmVhc29uYWJsZS4KKworKiBhZGQgdGVzdHMgZm9yIHNvbWUgYXBwbGV0cworCisqIGltcGxlbWVudCBQT1NJWCB1dGlsaXRpZXMgYW5kIGF1ZGl0IHRoZW0gZm9yIFBPU0lYIGNvbmZvcm1hbmNlLiB0aGVuCisgIGF1ZGl0IHRoZW0gZm9yIEdOVSBjb25mb3JtYW5jZS4gdGhlbiBkb2N1bWVudCBhbGwgeW91ciBmaW5kaW5ncyBpbiBhIG5ldworICBkb2MvY29uZm9ybWFuY2UudHh0IGZpbGUgd2hpbGUgcGVyaGFwcyBpbXBsZW1lbnRpbmcgc29tZSBvZiB0aGUgbWlzc2luZworICBmZWF0dXJlcy4KKyAgeW91IGNhbiBmaW5kIHRoZSBsYXRlc3QgUE9TSVggZG9jdW1lbnRhdGlvbiAoMTAwMy4xLTIwMDgpIGhlcmU6CisgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvCisgIGFuZCB0aGUgY29tcGxldGUgbGlzdCBvZiBhbGwgdXRpbGl0aWVzIHRoYXQgUE9TSVggY292ZXJzOgorICBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2lkeC91dGlsaXRpZXMuaHRtbAorICBUaGUgZmlyc3Qgc3RlcCB3b3VsZCB0byBnZW5lcmF0ZSBhIGZpbGUvbWF0cml4IHdoYXQgaXMgYWxyZWFkeSBhcmNoaXZlZAorICAoYWxzbyBJUFY2KQorCisqIGltcGxlbWVudCAnYXQnCisKKyogcnBjYmluZCAoZm9ybWVyIHBvcnRtYXApIG9yIGVxdWl2YWxlbnQKKyAgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHVzZSAtbyBub2xvY2sgb24gbmZzIG1vdW50cworCisqIGNoZWNrIElQVjYgY29tcGxpYW5jZQorCisqIGdlbmVyYXRlIGEgbWluaSBleGFtcGxlIHVzaW5nIGtlcm5lbCtidXN5Ym94IG9ubHkgKCtsaWJjKSBmb3IgZXhhbXBsZQorCisqIG1vcmUgc3VwcG9ydCBmb3IgYWR2YW5jZWQgbGludXggMi42LnggZmVhdHVyZXMsIHNlZTogaW90b3AKKyAgbW9zdCBsaWtlbHkgdGhlcmUgaXMgbW9yZQorCisqIGV2ZW4gbW9yZSBzdXBwb3J0IGZvciBzdGF0aXN0aWNzOiBtcHN0YXQsIGlvc3RhdCwgcG93ZXJ0b3AuLi4uCmRpZmYgLS1naXQgYS9UT0RPX3VuaWNvZGUgYi9UT0RPX3VuaWNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxMGU4ZAotLS0gL2Rldi9udWxsCisrKyBiL1RPRE9fdW5pY29kZQpAQCAtMCwwICsxLDQ1IEBACitBbHJlYWR5IGZpeGVkIGFwcGxldHM6CitjYWwKK2xzbW9kCitkZgorZHVtcGxlYXNlcworCitBcHBsZXRzIHdoaWNoIG1heSBuZWVkIHVuaWNvZGUgaGFuZGxpbmcgKG1vcmUgZXh0ZW5zaXZlIHRoYW4gc2FuaXRpemluZworb2YgZmlsZW5hbWVzIGluIGVycm9yIG1lc3NhZ2VzKToKKworbHMgLSB3b3JrIGluIHByb2dyZXNzCitleHBhbmQsIHVuZXhwYW5kIC0gdXNlcyB1bmljb2RlX3N0cmxlbiwgbm90IHNjcmxlbgorYXNoLCBodXNoIHRocm91Z2ggbGluZWVkaXQgLSB1c2VzIHVuaWNvZGVfc3RybGVuLCBub3Qgc2NybGVuCit0b3AgLSBuZWVkIHRvIHNhbml0aXplIHByb2Nlc3MgYXJncworcHMgLSBuZWVkIHRvIHNhbml0aXplIHByb2Nlc3MgYXJncworbGVzcworbW9yZQordmkKK2VkCitjdXQKK2F3aworc2VkCit0cgorZ3JlcCBlZ3JlcCBmZ3JlcAorZm9sZAorc29ydAoraGVhZCwgdGFpbAorY2F0diAtICJkaXNwbGF5IG5vbnByaW50aW5nIGNoYXJzIiAtIHdoYXQgdGhpcyBjb3VsZCBtZWFuIGZvciB1bmljb2RlPword2MKK2NoYXQKK2R1bXBrbWFwCitsYXN0IC0ganVzdCBsaW5lIHVwIGNvbHVtbnMKK21hbgorbWljcm9jb20KK3N0cmluZ3MKK3dhdGNoCisKK1Vuc3VyZSwgbWF5IG5lZWQgZml4aW5nOgorCitob3N0bmFtZSAtIGRvIHdlIHJlYWxseSB3YW50IHRvIHByb3RlY3QgYWdhaW5zdCBiYWQgY2hhcnMgaW4gaXQ/CitwYXRjaAorYWRkZ3JvdXAsIGFkZHVzZXIsIGRlbGdyb3VwLCBkZWx1c2VyCit0ZWxuZXQKK3RlbG5ldGQKK29kCitwcmludGYKZGlmZiAtLWdpdCBhL2FwcGxldHMvS2J1aWxkLnNyYyBiL2FwcGxldHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEyMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNDcgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitvYmoteSA6PQorb2JqLXkgKz0gYXBwbGV0cy5vCisKK2hvc3Rwcm9ncy15Oj0KK2hvc3Rwcm9ncy15ICs9IHVzYWdlIHVzYWdlX3BvZCBhcHBsZXRfdGFibGVzCisKK2Fsd2F5czo9ICQoaG9zdHByb2dzLXkpCisKKyMgR2VuZXJhdGVkIGZpbGVzIG5lZWQgYWRkaXRpb25hbCBsb3ZlCisKKyMgVGhpcyB0cmljayBkZWNyZWFzZXMgYW1vdW50IG9mIHJlYnVpbGRzCisjIGlmIHRyZWUgaXMgbWVyZWx5IHJlbmFtZWQvY29waWVkCitpZmVxICgkKHNyY3RyZWUpLCQob2JqdHJlZSkpCitzcmN0cmVlX3NsYXNoID0KK2Vsc2UKK3NyY3RyZWVfc2xhc2ggPSAkKHNyY3RyZWUpLworZW5kaWYKKworSE9TVENGTEFHU191c2FnZS5vID0gLUkkKHNyY3RyZWVfc2xhc2gpaW5jbHVkZSAtSWluY2x1ZGUKK0hPU1RDRkxBR1NfdXNhZ2VfcG9kLm8gPSAtSSQoc3JjdHJlZV9zbGFzaClpbmNsdWRlIC1JaW5jbHVkZQorCithcHBsZXRzL2FwcGxldHMubzogaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmggaW5jbHVkZS9hcHBsZXRfdGFibGVzLmgKKworYXBwbGV0cy9hcHBsZXRfdGFibGVzOiAuY29uZmlnIGluY2x1ZGUvYXBwbGV0cy5oCithcHBsZXRzL3VzYWdlOiAgICAgICAgIC5jb25maWcgaW5jbHVkZS9hcHBsZXRzLmgKK2FwcGxldHMvdXNhZ2VfcG9kOiAgICAgLmNvbmZpZyBpbmNsdWRlL2FwcGxldF90YWJsZXMuaCBpbmNsdWRlL2FwcGxldHMuaAorCitxdWlldF9jbWRfZ2VuX3VzYWdlX2NvbXByZXNzZWQgPSBHRU4gICAgIGluY2x1ZGUvdXNhZ2VfY29tcHJlc3NlZC5oCisgICAgICBjbWRfZ2VuX3VzYWdlX2NvbXByZXNzZWQgPSAkKHNyY3RyZWVfc2xhc2gpYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkIGluY2x1ZGUvdXNhZ2VfY29tcHJlc3NlZC5oIGFwcGxldHMKKworaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmg6IGFwcGxldHMvdXNhZ2UgJChzcmN0cmVlX3NsYXNoKWFwcGxldHMvdXNhZ2VfY29tcHJlc3NlZAorCSQoY2FsbCBjbWQsZ2VuX3VzYWdlX2NvbXByZXNzZWQpCisKK3F1aWV0X2NtZF9nZW5fYXBwbGV0X3RhYmxlcyA9IEdFTiAgICAgaW5jbHVkZS9hcHBsZXRfdGFibGVzLmgKKyAgICAgIGNtZF9nZW5fYXBwbGV0X3RhYmxlcyA9IGFwcGxldHMvYXBwbGV0X3RhYmxlcyBpbmNsdWRlL2FwcGxldF90YWJsZXMuaCBpbmNsdWRlL05VTV9BUFBMRVRTLmgKKworaW5jbHVkZS9hcHBsZXRfdGFibGVzLmg6IGFwcGxldHMvYXBwbGV0X3RhYmxlcworCSQoY2FsbCBjbWQsZ2VuX2FwcGxldF90YWJsZXMpCisKK2luY2x1ZGUvTlVNX0FQUExFVFMuaDogYXBwbGV0cy9hcHBsZXRfdGFibGVzCisJJChjYWxsIGNtZCxnZW5fYXBwbGV0X3RhYmxlcykKZGlmZiAtLWdpdCBhL2FwcGxldHMvYXBwbGV0X3RhYmxlcy5jIGIvYXBwbGV0cy9hcHBsZXRfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3NTc0NwotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldHMvYXBwbGV0X3RhYmxlcy5jCkBAIC0wLDAgKzEsMTY0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBcHBsZXQgdGFibGUgZ2VuZXJhdG9yLgorICogUnVucyBvbiBob3N0IGFuZCBwcm9kdWNlcyBpbmNsdWRlL2FwcGxldF90YWJsZXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI3VuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoKHVuc2lnbmVkKShzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2F1dG9jb25mLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9hcHBsZXRfbWV0YWRhdGEuaCIKKworc3RydWN0IGJiX2FwcGxldCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICptYWluOworCWVudW0gYmJfaW5zdGFsbF9sb2NfdCBpbnN0YWxsX2xvYzsKKwllbnVtIGJiX3N1aWRfdCBuZWVkX3N1aWQ7CisJLyogdHJ1ZSBpZiBpbnN0ZWFkIG9mIGZvcmsoKTsgZXhlYygiYXBwbGV0Iik7IHdhaXRwaWQoKTsKKwkgKiBvbmUgY2FuIGRvIGZvcmsoKTsgZXhpdChhcHBsZXRfbWFpbihhcmdjLGFyZ3YpKTsgd2FpdHBpZCgpOyAqLworCXVuc2lnbmVkIGNoYXIgbm9leGVjOworCS8qIEV2ZW4gbmljZXIgKi8KKwkvKiB0cnVlIGlmIGluc3RlYWQgb2YgZm9yaygpOyBleGVjKCJhcHBsZXQiKTsgd2FpdHBpZCgpOworCSAqIG9uZSBjYW4gc2ltcGx5IGNhbGwgYXBwbGV0X21haW4oYXJnYyxhcmd2KTsgKi8KKwl1bnNpZ25lZCBjaGFyIG5vZm9yazsKK307CisKKy8qIERlZmluZSBzdHJ1Y3QgYmJfYXBwbGV0IGFwcGxldHNbXSAqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvYXBwbGV0cy5oIgorCitlbnVtIHsgTlVNX0FQUExFVFMgPSBBUlJBWV9TSVpFKGFwcGxldHMpIH07CisKK3N0YXRpYyBpbnQgb2Zmc2V0W05VTV9BUFBMRVRTXTsKKworc3RhdGljIGludCBjbXBfbmFtZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBiYl9hcHBsZXQgKmFhID0gYTsKKwljb25zdCBzdHJ1Y3QgYmJfYXBwbGV0ICpiYiA9IGI7CisJcmV0dXJuIHN0cmNtcChhYS0+bmFtZSwgYmItPm5hbWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJaW50IG9mczsKKwl1bnNpZ25lZCBNQVhfQVBQTEVUX05BTUVfTEVOID0gMTsKKworCXFzb3J0KGFwcGxldHMsIE5VTV9BUFBMRVRTLCBzaXplb2YoYXBwbGV0c1swXSksIGNtcF9uYW1lKTsKKworCW9mcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJb2Zmc2V0W2ldID0gb2ZzOworCQlvZnMgKz0gc3RybGVuKGFwcGxldHNbaV0ubmFtZSkgKyAxOworCX0KKwkvKiBXZSByZXVzZSA0IGhpZ2gtb3JkZXIgYml0cyBvZiBvZmZzZXQgYXJyYXkgZm9yIG90aGVyIHB1cnBvc2VzLAorCSAqIHNvIGlmIHRoZXkgYXJlIGluZGVlZCBuZWVkZWQsIHJlZnVzZSB0byBwcm9jZWVkICovCisJaWYgKG9mcyA+IDB4ZmZmKQorCQlyZXR1cm4gMTsKKwlpZiAoIWFyZ3ZbMV0pCisJCXJldHVybiAxOworCisJaSA9IG9wZW4oYXJndlsxXSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgMDY2Nik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gMTsKKwlkdXAyKGksIDEpOworCisJLyogS2VlcCBpbiBzeW5jIHdpdGggaW5jbHVkZS9idXN5Ym94LmghICovCisKKwlwcmludGYoIi8qIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZSwgZG9uJ3QgZWRpdCAqL1xuXG4iKTsKKworCXByaW50ZigiI2RlZmluZSBOVU1fQVBQTEVUUyAldVxuIiwgTlVNX0FQUExFVFMpOworCWlmIChOVU1fQVBQTEVUUyA9PSAxKSB7CisJCWNoYXIgKmRhc2hfdG9fdW5kZXJzY29yZSwgKnA7CisJCXByaW50ZigiI2RlZmluZSBTSU5HTEVfQVBQTEVUX1NUUiBcIiVzXCJcbiIsIGFwcGxldHNbMF0ubmFtZSk7CisJCS8qIEV4YW1wbGU6ICJldGhlci13YWtlIiAtPiAiZXRoZXJfd2FrZSIgKi8KKwkJcCA9IGRhc2hfdG9fdW5kZXJzY29yZSA9IHN0cmR1cChhcHBsZXRzWzBdLm5hbWUpOworCQlwLS07CisJCXdoaWxlICgqKytwKQorCQkJaWYgKCpwID09ICctJykKKwkJCQkqcCA9ICdfJzsKKwkJcHJpbnRmKCIjZGVmaW5lIFNJTkdMRV9BUFBMRVRfTUFJTiAlc19tYWluXG4iLCBkYXNoX3RvX3VuZGVyc2NvcmUpOworCX0KKwlwcmludGYoIlxuIik7CisKKwkvL3ByaW50ZigiI2lmbmRlZiBTS0lQX2RlZmluaXRpb25zXG4iKTsKKwlwcmludGYoImNvbnN0IGNoYXIgYXBwbGV0X25hbWVzW10gQUxJR04xID0gXCJcIlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJcHJpbnRmKCJcIiVzXCIgXCJcXDBcIlxuIiwgYXBwbGV0c1tpXS5uYW1lKTsKKwkJaWYgKE1BWF9BUFBMRVRfTkFNRV9MRU4gPCBzdHJsZW4oYXBwbGV0c1tpXS5uYW1lKSkKKwkJCU1BWF9BUFBMRVRfTkFNRV9MRU4gPSBzdHJsZW4oYXBwbGV0c1tpXS5uYW1lKTsKKwl9CisJcHJpbnRmKCI7XG5cbiIpOworCisJcHJpbnRmKCIjaWZuZGVmIFNLSVBfYXBwbGV0X21haW5cbiIpOworCXByaW50ZigiaW50ICgqY29uc3QgYXBwbGV0X21haW5bXSkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSA9IHtcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVBQTEVUUzsgaSsrKSB7CisJCXByaW50ZigiJXNfbWFpbixcbiIsIGFwcGxldHNbaV0ubWFpbik7CisJfQorCXByaW50ZigifTtcbiIpOworCXByaW50ZigiI2VuZGlmXG5cbiIpOworCisJcHJpbnRmKCJjb25zdCB1aW50MTZfdCBhcHBsZXRfbmFtZW9mc1tdIEFMSUdOMiA9IHtcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVBQTEVUUzsgaSsrKSB7CisJCXByaW50ZigiMHglMDR4LFxuIiwKKwkJCW9mZnNldFtpXQorI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisJCQkrIChhcHBsZXRzW2ldLm5vZm9yayA8PCAxMikKKwkJCSsgKGFwcGxldHNbaV0ubm9leGVjIDw8IDEzKQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRAorCQkJKyAoYXBwbGV0c1tpXS5uZWVkX3N1aWQgPDwgMTQpIC8qIDIgYml0cyAqLworI2VuZGlmCisJCSk7CisJfQorCXByaW50ZigifTtcblxuIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNUQUxMRVIKKwlwcmludGYoImNvbnN0IHVpbnQ4X3QgYXBwbGV0X2luc3RhbGxfbG9jW10gQUxJR04xID0ge1xuIik7CisJaSA9IDA7CisJd2hpbGUgKGkgPCBOVU1fQVBQTEVUUykgeworCQlpbnQgdiA9IGFwcGxldHNbaV0uaW5zdGFsbF9sb2M7IC8qIDMgYml0cyAqLworCQlpZiAoKytpIDwgTlVNX0FQUExFVFMpCisJCQl2IHw9IGFwcGxldHNbaV0uaW5zdGFsbF9sb2MgPDwgNDsgLyogMyBiaXRzICovCisJCXByaW50ZigiMHglMDJ4LFxuIiwgdik7CisJCWkrKzsKKwl9CisJcHJpbnRmKCJ9O1xuIik7CisjZW5kaWYKKwkvL3ByaW50ZigiI2VuZGlmIC8qIFNLSVBfZGVmaW5pdGlvbnMgKi9cbiIpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIiNkZWZpbmUgTUFYX0FQUExFVF9OQU1FX0xFTiAldVxuIiwgTUFYX0FQUExFVF9OQU1FX0xFTik7CisKKwlpZiAoYXJndlsyXSkgeworCQljaGFyIGxpbmVfb2xkWzgwXTsKKwkJY2hhciBsaW5lX25ld1s4MF07CisJCUZJTEUgKmZwOworCisJCWxpbmVfb2xkWzBdID0gMDsKKwkJZnAgPSBmb3Blbihhcmd2WzJdLCAiciIpOworCQlpZiAoZnApIHsKKwkJCWZnZXRzKGxpbmVfb2xkLCBzaXplb2YobGluZV9vbGQpLCBmcCk7CisJCQlmY2xvc2UoZnApOworCQl9CisJCXNwcmludGYobGluZV9uZXcsICIjZGVmaW5lIE5VTV9BUFBMRVRTICV1XG4iLCBOVU1fQVBQTEVUUyk7CisJCWlmIChzdHJjbXAobGluZV9vbGQsIGxpbmVfbmV3KSAhPSAwKSB7CisJCQlmcCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7CisJCQlpZiAoIWZwKQorCQkJCXJldHVybiAxOworCQkJZnB1dHMobGluZV9uZXcsIGZwKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9hcHBsZXRzLmMgYi9hcHBsZXRzL2FwcGxldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMyYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9hcHBsZXRzLmMKQEAgLTAsMCArMSwxNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3R1YiBmb3IgbGlua2luZyBidXN5Ym94IGJpbmFyeSBhZ2FpbnN0IGxpYmJ1c3lib3guCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImJ1c3lib3guaCIKKworI2lmIEVOQUJMRV9CVUlMRF9MSUJCVVNZQk9YCitpbnQgbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBsYmJfbWFpbihhcmd2KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9idXN5Ym94Lm1rbGwgYi9hcHBsZXRzL2J1c3lib3gubWtsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGRiZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9idXN5Ym94Lm1rbGwKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL3NoCisjIE1ha2UgYnVzeWJveCBsaW5rcyBsaXN0IGZpbGUuCisKKyMgaW5wdXQgJDE6IGZ1bGwgcGF0aCB0byBDb25maWcuaAorIyBpbnB1dCAkMjogZnVsbCBwYXRoIHRvIGFwcGxldHMuaAorIyBvdXRwdXQgKHN0ZG91dCk6IGxpc3Qgb2YgcGF0aG5hbWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCB0byBidXN5Ym94CisKKyMgTWFpbnRhaW5lcjogTGFycnkgRG9vbGl0dGxlIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisKK2V4cG9ydCBMQ19BTEw9UE9TSVgKK2V4cG9ydCBMQ19DVFlQRT1QT1NJWAorCitDT05GSUdfSD0kezE6LWluY2x1ZGUvYXV0b2NvbmYuaH0KK0FQUExFVFNfSD0kezI6LWluY2x1ZGUvYXBwbGV0cy5ofQorJEhPU1RDQyAtRSAtRE1BS0VfTElOS1MgLWluY2x1ZGUgJENPTkZJR19IICRBUFBMRVRTX0ggfAorICBhd2sgJy9eWyBcdF0qTElOSy97CisJZGlyPXN1YnN0cigkMiw3KQorCWdzdWIoIl8iLCIvIixkaXIpCisJaWYoZGlyPT0iL1JPT1QiKSBkaXI9IiIKKwlmaWxlPSQzCisJZ3N1YigiXCIiLCIiLGZpbGUpCisJaWYgKGZpbGU9PSJidXN5Ym94IikgbmV4dAorCXByaW50IHRvbG93ZXIoZGlyKSAiLyIgZmlsZQorICB9JwpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9pbmRpdmlkdWFsLmMgYi9hcHBsZXRzL2luZGl2aWR1YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9pbmRpdmlkdWFsLmMKQEAgLTAsMCArMSwyNCBAQAorLyogTWluaW1hbCB3cmFwcGVyIHRvIGJ1aWxkIGFuIGluZGl2aWR1YWwgYnVzeWJveCBhcHBsZXQuCisgKgorICogQ29weXJpZ2h0IDIwMDUgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworY29uc3QgY2hhciAqYXBwbGV0X25hbWU7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInVzYWdlLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlhcHBsZXRfbmFtZSA9IGFyZ3ZbMF07CisJcmV0dXJuIEFQUExFVF9tYWluKGFyZ2MsYXJndik7Cit9CisKK3ZvaWQgYmJfc2hvd191c2FnZSh2b2lkKQoreworCWZwdXRzKEFQUExFVF9mdWxsX3VzYWdlICJcbiIsIHN0ZG91dCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9pbnN0YWxsLnNoIGIvYXBwbGV0cy9pbnN0YWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1YjQ3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL2luc3RhbGwuc2gKQEAgLTAsMCArMSwxMTMgQEAKKyMhL2Jpbi9zaAorCitleHBvcnQgTENfQUxMPVBPU0lYCitleHBvcnQgTENfQ1RZUEU9UE9TSVgKKworcHJlZml4PSQxCitpZiBbIC16ICIkcHJlZml4IiBdOyB0aGVuCisJZWNobyAidXNhZ2U6IGFwcGxldHMvaW5zdGFsbC5zaCBERVNUSU5BVElPTiBbLS1zeW1saW5rcy8tLWhhcmRsaW5rcy8tLXNjcmlwdHdyYXBwZXJdIgorCWV4aXQgMQorZmkKKworaD1gc29ydCBidXN5Ym94LmxpbmtzIHwgdW5pcWAKKworbGlua29wdHM9IiIKK3NjcmlwdHdyYXBwZXI9Im4iCitjbGVhbnVwPSIwIgorbm9jbG9iYmVyPSIwIgorY2FzZSAiJDIiIGluCisJLS1oYXJkbGlua3MpICAgICBsaW5rb3B0cz0iLWYiOzsKKwktLXN5bWxpbmtzKSAgICAgIGxpbmtvcHRzPSItZnMiOzsKKwktLXNjcmlwdHdyYXBwZXIpIHNjcmlwdHdyYXBwZXI9InkiO3N3cmFwYWxsPSJ5Ijs7CisJLS1zdy1zaC1oYXJkKSAgICBzY3JpcHR3cmFwcGVyPSJ5IjtsaW5rb3B0cz0iLWYiOzsKKwktLXN3LXNoLXN5bSkgICAgIHNjcmlwdHdyYXBwZXI9InkiO2xpbmtvcHRzPSItZnMiOzsKKwktLWNsZWFudXApICAgICAgIGNsZWFudXA9IjEiOzsKKwktLW5vY2xvYmJlcikgICAgIG5vY2xvYmJlcj0iMSI7OworCSIiKSAgICAgICAgICAgICAgaD0iIjs7CisJKikgICAgICAgICAgICAgICBlY2hvICJVbmtub3duIGluc3RhbGwgb3B0aW9uOiAkMiI7IGV4aXQgMTs7Citlc2FjCisKK2lmIFsgLW4gIiRET19JTlNUQUxMX0xJQlMiIF0gJiYgWyAiJERPX0lOU1RBTExfTElCUyIgIT0gIm4iIF07IHRoZW4KKwkjIGdldCB0aGUgdGFyZ2V0IGRpciBmb3IgdGhlIGxpYnMKKwkjIGFzc3VtZSBpdCBzdGFydHMgd2l0aCBsaWIKKwlsaWJkaXI9JCgkQ0MgLXByaW50LWZpbGUtbmFtZT1saWJjLnNvIHwgXAorCQkgc2VkIC1uICdzJV4uKlwoL2xpYlteXC9dKlwpL2xpYmMuc28lXDElcCcpCisJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJbGliZGlyPS9saWIKKwlmaQorCisJbWtkaXIgLXAgIiRwcmVmaXgvJGxpYmRpciIgfHwgZXhpdCAxCisJZm9yIGkgaW4gJERPX0lOU1RBTExfTElCUzsgZG8KKwkJcm0gLWYgIiRwcmVmaXgvJGxpYmRpci8kaSIgfHwgZXhpdCAxCisJCWlmIFsgLWYgIiRpIiBdOyB0aGVuCisJCQljcCAtcFBSICIkaSIgIiRwcmVmaXgvJGxpYmRpci8iIHx8IGV4aXQgMQorCQkJY2htb2QgMDY0NCAiJHByZWZpeC8kbGliZGlyLyRpIiB8fCBleGl0IDEKKwkJZmkKKwlkb25lCitmaQorCitpZiBbICIkY2xlYW51cCIgPSAiMSIgXSAmJiBbIC1lICIkcHJlZml4L2Jpbi9idXN5Ym94IiBdOyB0aGVuCisJaW5vZGU9YGxzIC1pICIkcHJlZml4L2Jpbi9idXN5Ym94IiB8IGF3ayAne3ByaW50ICQxfSdgCisJc3ViX3NoZWxsX2l0PWAKKwkJY2QgIiRwcmVmaXgiCisJCWZvciBkIGluIHVzci9zYmluIHVzci9iaW4gc2JpbiBiaW47IGRvCisJCQlwZD0kUFdECisJCQlpZiBbIC1kICIkZCIgXTsgdGhlbgorCQkJCWNkICIkZCIKKwkJCQlscyAtaUwgLiB8IGdyZXAgIl4gKiRpbm9kZSIgfCBhd2sgJ3twcmludCAkMn0nIHwgZW52IC1pIHhhcmdzIHJtIC1mCisJCQlmaQorCQkJY2QgIiRwZCIKKwkJZG9uZQorCQlgCisJZXhpdCAwCitmaQorCitybSAtZiAiJHByZWZpeC9iaW4vYnVzeWJveCIgfHwgZXhpdCAxCitta2RpciAtcCAiJHByZWZpeC9iaW4iIHx8IGV4aXQgMQoraW5zdGFsbCAtbSA3NTUgYnVzeWJveCAiJHByZWZpeC9iaW4vYnVzeWJveCIgfHwgZXhpdCAxCisKK2ZvciBpIGluICRoOyBkbworCWFwcGRpcj1gZGlybmFtZSAiJGkiYAorCW1rZGlyIC1wICIkcHJlZml4LyRhcHBkaXIiIHx8IGV4aXQgMQorCWlmIFsgIiRzY3JpcHR3cmFwcGVyIiA9ICJ5IiBdOyB0aGVuCisJCWlmIFsgIiRzd3JhcGFsbCIgIT0gInkiIF0gJiYgWyAiJGkiID0gIi9iaW4vc2giIF07IHRoZW4KKwkJCWxuICRsaW5rb3B0cyBidXN5Ym94ICIkcHJlZml4LyRpIiB8fCBleGl0IDEKKwkJZWxzZQorCQkJcm0gLWYgIiRwcmVmaXgvJGkiCisJCQllY2hvICIjIS9iaW4vYnVzeWJveCIgPiIkcHJlZml4LyRpIgorCQkJY2htb2QgK3ggIiRwcmVmaXgvJGkiCisJCWZpCisJCWVjaG8gIgkkcHJlZml4LyRpIgorCWVsc2UKKwkJaWYgWyAiJDIiID0gIi0taGFyZGxpbmtzIiBdOyB0aGVuCisJCQliYl9wYXRoPSIkcHJlZml4L2Jpbi9idXN5Ym94IgorCQllbHNlCisJCQljYXNlICIkYXBwZGlyIiBpbgorCQkJLykKKwkJCQliYl9wYXRoPSJiaW4vYnVzeWJveCIKKwkJCTs7CisJCQkvYmluKQorCQkJCWJiX3BhdGg9ImJ1c3lib3giCisJCQk7OworCQkJL3NiaW4pCisJCQkJYmJfcGF0aD0iLi4vYmluL2J1c3lib3giCisJCQk7OworCQkJL3Vzci9iaW4gfCAvdXNyL3NiaW4pCisJCQkJYmJfcGF0aD0iLi4vLi4vYmluL2J1c3lib3giCisJCQk7OworCQkJKikKKwkJCQllY2hvICJVbmtub3duIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk6ICRhcHBkaXIiCisJCQkJZXhpdCAxCisJCQk7OworCQkJZXNhYworCQlmaQorCQlpZiBbICIkbm9jbG9iYmVyIiA9ICIwIiBdIHx8IFsgISAtZSAiJHByZWZpeC8kaSIgXTsgdGhlbgorCQkJZWNobyAiICAkcHJlZml4LyRpIC0+ICRiYl9wYXRoIgorCQkJbG4gJGxpbmtvcHRzICIkYmJfcGF0aCIgIiRwcmVmaXgvJGkiIHx8IGV4aXQgMQorCQllbHNlCisJCQllY2hvICIgICRwcmVmaXgvJGkgYWxyZWFkeSBleGlzdHMiCisJCWZpCisJZmkKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9hcHBsZXRzL3VzYWdlLmMgYi9hcHBsZXRzL3VzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1MjBmZgotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldHMvdXNhZ2UuYwpAQCAtMCwwICsxLDU1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXV0b2NvbmYuaCIKKworLyogU2luY2Ugd2UgY2FuJ3QgdXNlIHBsYXRmb3JtLmgsIGhhdmUgdG8gZG8gdGhpcyBhZ2FpbiBieSBoYW5kOiAqLworI2lmIEVOQUJMRV9OT01NVQorIyBkZWZpbmUgQkJfTU1VIDAKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKQorI2Vsc2UKKyMgZGVmaW5lIEJCX01NVSAxCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikKKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaW5jbHVkZSAidXNhZ2UuaCIKKyNkZWZpbmUgTUFLRV9VU0FHRShhbmFtZSwgdXNhZ2UpIHsgYW5hbWUsIHVzYWdlIH0sCitzdGF0aWMgc3RydWN0IHVzYWdlX2RhdGEgeworCWNvbnN0IGNoYXIgKmFuYW1lOworCWNvbnN0IGNoYXIgKnVzYWdlOworfSB1c2FnZV9hcnJheVtdID0geworI2luY2x1ZGUgImFwcGxldHMuaCIKK307CisKK3N0YXRpYyBpbnQgY29tcGFyZV9mdW5jKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IHVzYWdlX2RhdGEgKnVhID0gYTsKKwljb25zdCBzdHJ1Y3QgdXNhZ2VfZGF0YSAqdWIgPSBiOworCXJldHVybiBzdHJjbXAodWEtPmFuYW1lLCB1Yi0+YW5hbWUpOworfQorCitpbnQgbWFpbih2b2lkKQoreworCWludCBpOworCWludCBudW1fbWVzc2FnZXMgPSBzaXplb2YodXNhZ2VfYXJyYXkpIC8gc2l6ZW9mKHVzYWdlX2FycmF5WzBdKTsKKworCWlmIChudW1fbWVzc2FnZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlxc29ydCh1c2FnZV9hcnJheSwKKwkJbnVtX21lc3NhZ2VzLCBzaXplb2YodXNhZ2VfYXJyYXlbMF0pLAorCQljb21wYXJlX2Z1bmMpOworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVzc2FnZXM7IGkrKykKKwkJd3JpdGUoU1RET1VUX0ZJTEVOTywgdXNhZ2VfYXJyYXlbaV0udXNhZ2UsIHN0cmxlbih1c2FnZV9hcnJheVtpXS51c2FnZSkgKyAxKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkIGIvYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmNjZiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL3VzYWdlX2NvbXByZXNzZWQKQEAgLTAsMCArMSw1MCBAQAorIyEvYmluL3NoCisKK3RhcmdldD0iJDEiCitsb2M9IiQyIgorCit0ZXN0ICIkdGFyZ2V0IiB8fCBleGl0IDEKK3Rlc3QgIiRsb2MiIHx8IGxvYz0uCit0ZXN0IC14ICIkbG9jL3VzYWdlIiB8fCBleGl0IDEKK3Rlc3QgIiRTRUQiIHx8IFNFRD1zZWQKK3Rlc3QgIiRERCIgfHwgREQ9ZGQKKworIyBTb21lIHBlb3BsZSB3ZXJlIGJpdHRlbiBieSB0aGVpciBzeXN0ZW0gbGFja2luZyBhIChwcm9wZXIpIG9kCitvZCAtdiAtdCB4MSA8L2Rldi9udWxsID4vZGV2L251bGwKK2lmIHRlc3QgJD8gIT0gMDsgdGhlbgorCWVjaG8gJ29kIHRvb2wgaXMgbm90IGluc3RhbGxlZCBvciBjYW5ub3QgYWNjZXB0ICItdiAtdCB4MSIgb3B0aW9ucycKKwlleGl0IDEKK2ZpCisKK2V4ZWMgPiIkdGFyZ2V0LiQkIgorCitlY2hvICcjZGVmaW5lIFVOUEFDS0VEX1VTQUdFICIiIFwnCisiJGxvYy91c2FnZSIgfCBvZCAtdiAtdCB4MSBcCit8ICRTRUQgLWUgJ3MvXlteIF0qLy8nIFwKKwktZSAncy8gLy9nJyBcCisJLWUgJy9eJC9kJyBcCisJLWUgJ3MvXCguLlwpL1xceFwxL2cnIFwKKwktZSAncy9eLyIvJyBcCisJLWUgJ3MvJC8iIFxcLycKK2VjaG8gJycKKworZWNobyAnI2RlZmluZSBQQUNLRURfVVNBR0UgXCcKKyMjIEJyZWFrcyBvbiBiaWctZW5kaWFuIHN5c3RlbXMhCisjIyAjIEV4dHJhIGVmZm9ydCB0byBhdm9pZCB1c2luZyAib2QgLXQgeDEiOiAtdCBpcyBub3QgYXZhaWxhYmxlCisjIyAjIGluIG5vbi1DT05GSUdfREVTS1RPUGVkIGJ1c3lib3ggb2QKKyMjCisjIyAiJGxvYy91c2FnZSIgfCBiemlwMiAtMSB8IG9kIC12IC14IFwKKyMjIHwgJFNFRCAtZSAncy9eW14gXSovLycgXAorIyMJLWUgJ3MvIC8vZycgXAorIyMJLWUgJy9eJC9kJyBcCisjIwktZSAncy9cKC4uXClcKC4uXCkvMHhcMiwweFwxLC9nJworIyMJLWUgJ3MvJC8gXFwvJworIiRsb2MvdXNhZ2UiIHwgYnppcDIgLTEgfCAkREQgYnM9MiBza2lwPTEgMj4vZGV2L251bGwgfCBvZCAtdiAtdCB4MSBcCit8ICRTRUQgLWUgJ3MvXlteIF0qLy8nIFwKKwktZSAncy8gLy9nJyBcCisJLWUgJy9eJC9kJyBcCisJLWUgJ3MvXCguLlwpLzB4XDEsL2cnIFwKKwktZSAncy8kLyBcXC8nCitlY2hvICcnCisKK212IC0tICIkdGFyZ2V0LiQkIiAiJHRhcmdldCIKZGlmZiAtLWdpdCBhL2FwcGxldHMvdXNhZ2VfcG9kLmMgYi9hcHBsZXRzL3VzYWdlX3BvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL3VzYWdlX3BvZC5jCkBAIC0wLDAgKzEsMTExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhdXRvY29uZi5oIgorCisjZGVmaW5lIFNLSVBfYXBwbGV0X21haW4KKyNkZWZpbmUgQUxJR04xIC8qIG5vdGhpbmcsIGp1c3QgdG8gcGxhY2F0ZSBhcHBsZXRfdGFibGVzLmggKi8KKyNkZWZpbmUgQUxJR04yIC8qIG5vdGhpbmcsIGp1c3QgdG8gcGxhY2F0ZSBhcHBsZXRfdGFibGVzLmggKi8KKyNpbmNsdWRlICJhcHBsZXRfdGFibGVzLmgiCisKKy8qIFNpbmNlIHdlIGNhbid0IHVzZSBwbGF0Zm9ybS5oLCBoYXZlIHRvIGRvIHRoaXMgYWdhaW4gYnkgaGFuZDogKi8KKyNpZiBFTkFCTEVfTk9NTVUKKyMgZGVmaW5lIEJCX01NVSAwCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikKKyNlbHNlCisjIGRlZmluZSBCQl9NTVUgMQorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworI2luY2x1ZGUgInVzYWdlLmgiCisjZGVmaW5lIE1BS0VfVVNBR0UoYW5hbWUsIHVzYWdlKSB7IGFuYW1lLCB1c2FnZSB9LAorc3RhdGljIHN0cnVjdCB1c2FnZV9kYXRhIHsKKwljb25zdCBjaGFyICphbmFtZTsKKwljb25zdCBjaGFyICp1c2FnZTsKK30gdXNhZ2VfYXJyYXlbXSA9IHsKKyNpbmNsdWRlICJhcHBsZXRzLmgiCit9OworCitzdGF0aWMgaW50IGNvbXBhcmVfZnVuYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCB1c2FnZV9kYXRhICp1YSA9IGE7CisJY29uc3Qgc3RydWN0IHVzYWdlX2RhdGEgKnViID0gYjsKKwlyZXR1cm4gc3RyY21wKHVhLT5hbmFtZSwgdWItPmFuYW1lKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgY29sLCBsZW4yOworCisJaW50IGk7CisJaW50IG51bV9tZXNzYWdlcyA9IHNpemVvZih1c2FnZV9hcnJheSkgLyBzaXplb2YodXNhZ2VfYXJyYXlbMF0pOworCisJaWYgKG51bV9tZXNzYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXFzb3J0KHVzYWdlX2FycmF5LAorCQludW1fbWVzc2FnZXMsIHNpemVvZih1c2FnZV9hcnJheVswXSksCisJCWNvbXBhcmVfZnVuYyk7CisKKwljb2wgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVzc2FnZXM7IGkrKykgeworCQlsZW4yID0gc3RybGVuKHVzYWdlX2FycmF5W2ldLmFuYW1lKSArIDI7CisJCWlmIChjb2wgPj0gNzYgLSBsZW4yKSB7CisJCQlwcmludGYoIixcbiIpOworCQkJY29sID0gMDsKKwkJfQorCQlpZiAoY29sID09IDApIHsKKwkJCWNvbCA9IDY7CisJCQlwcmludGYoIlx0Iik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiwgIik7CisJCX0KKwkJcHJpbnRmKHVzYWdlX2FycmF5W2ldLmFuYW1lKTsKKwkJY29sICs9IGxlbjI7CisJfQorCXByaW50ZigiXG5cbiIpOworCisJcHJpbnRmKCI9aGVhZDEgQ09NTUFORCBERVNDUklQVElPTlNcblxuIik7CisJcHJpbnRmKCI9b3ZlciA0XG5cbiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tZXNzYWdlczsgaSsrKSB7CisJCWlmICh1c2FnZV9hcnJheVtpXS5hbmFtZVswXSA+PSAnYScgJiYgdXNhZ2VfYXJyYXlbaV0uYW5hbWVbMF0gPD0gJ3onCisJCSAmJiB1c2FnZV9hcnJheVtpXS51c2FnZVswXSAhPSBOT1VTQUdFX1NUUlswXQorCQkpIHsKKwkJCXByaW50ZigiPWl0ZW0gQjwlcz5cblxuIiwgdXNhZ2VfYXJyYXlbaV0uYW5hbWUpOworCQkJaWYgKHVzYWdlX2FycmF5W2ldLnVzYWdlWzBdKQorCQkJCXByaW50ZigiJXMgJXNcblxuIiwgdXNhZ2VfYXJyYXlbaV0uYW5hbWUsIHVzYWdlX2FycmF5W2ldLnVzYWdlKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVzXG5cbiIsIHVzYWdlX2FycmF5W2ldLmFuYW1lKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogd2UgdXNlZCB0byBtYWtlIG9wdGlvbnMgYm9sZCB3aXRoIEI8PiBhbmQgb3V0cHV0IGFuIGV4YW1wbGUgdG9vOgorCis9aXRlbSBCPGNhdD4KKworY2F0IFtCPC11Pl0gW0ZJTEVdLi4uCisKK0NvbmNhdGVuYXRlIEZJTEUocykgYW5kIHByaW50IHRoZW0gdG8gc3Rkb3V0CisKK09wdGlvbnM6CisgICAgICAgIC11ICAgICAgVXNlIHVuYnVmZmVyZWQgaS9vIChpZ25vcmVkKQorCitFeGFtcGxlOgorICAgICAgICAkIGNhdCAvcHJvYy91cHRpbWUKKyAgICAgICAgMTEwNzE2LjcyIDE3LjY3CisKKyovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjOTljNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGQgc3lzdGVtCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiBpcyBlc3NlbnRpYWwgaW4gcHJldmVudGluZyBnY2MgNC4yLngKKyMgZnJvbSBhbGlnbmluZyBzdGFjayB0byAxNiBieXRlcy4gKFdoaWNoIGlzIGdjYydzIHdheSBvZiBzdXBwb3J0aW5nIFNTRSkuCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9aTM4NiAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yLCkKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL0NvbmZpZy5pbiBiL2FyY2hpdmFsL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFjMDIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvQ29uZmlnLmluCkBAIC0wLDAgKzEsMzgwIEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiQXJjaGl2YWwgVXRpbGl0aWVzIgorCisKKworY29uZmlnIEZFQVRVUkVfU0VBTUxFU1NfWFoKKwlib29sICJNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAueHogZGF0YSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAueHogZGF0YS4KKworY29uZmlnIEZFQVRVUkVfU0VBTUxFU1NfTFpNQQorCWJvb2wgIk1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5sem1hIGRhdGEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmx6bWEgZGF0YS4KKworY29uZmlnIEZFQVRVUkVfU0VBTUxFU1NfQloyCisJYm9vbCAiTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmJ6MiBkYXRhIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5iejIgZGF0YS4KKworY29uZmlnIEZFQVRVUkVfU0VBTUxFU1NfR1oKKwlib29sICJNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAuZ3ogZGF0YSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAuZ3ogZGF0YS4KKworY29uZmlnIEZFQVRVUkVfU0VBTUxFU1NfWgorCWJvb2wgIk1ha2UgdGFyIGFuZCBndW56aXAgdW5kZXJzdGFuZCAuWiBkYXRhIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIE1ha2UgdGFyIGFuZCBndW56aXAgdW5kZXJzdGFuZCAuWiBkYXRhLgorCitjb25maWcgQVIKKwlib29sICJhciIKKwlkZWZhdWx0IG4gICMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgdG8gYmUgYWJsZSB0byByZXBsYWNlIGJpbnV0aWxzIGFyCisJaGVscAorCSAgYXIgaXMgYW4gYXJjaGl2YWwgdXRpbGl0eSBwcm9ncmFtIHVzZWQgdG8gY3JlYXRlLCBtb2RpZnksIGFuZAorCSAgZXh0cmFjdCBjb250ZW50cyBmcm9tIGFyY2hpdmVzLiBBbiBhcmNoaXZlIGlzIGEgc2luZ2xlIGZpbGUgaG9sZGluZworCSAgYSBjb2xsZWN0aW9uIG9mIG90aGVyIGZpbGVzIGluIGEgc3RydWN0dXJlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8KKwkgIHJldHJpZXZlIHRoZSBvcmlnaW5hbCBpbmRpdmlkdWFsIGZpbGVzIChjYWxsZWQgYXJjaGl2ZSBtZW1iZXJzKS4KKwkgIFRoZSBvcmlnaW5hbCBmaWxlcycgY29udGVudHMsIG1vZGUgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwKKwkgIGFuZCBncm91cCBhcmUgcHJlc2VydmVkIGluIHRoZSBhcmNoaXZlLCBhbmQgY2FuIGJlIHJlc3RvcmVkIG9uCisJICBleHRyYWN0aW9uLgorCisJICBUaGUgc3RvcmVkIGZpbGVuYW1lIGlzIGxpbWl0ZWQgdG8gMTUgY2hhcmFjdGVycy4gKGZvciBtb3JlIGluZm9ybWF0aW9uCisJICBzZWUgbG9uZyBmaWxlbmFtZSBzdXBwb3J0KS4KKwkgIGFyIGhhcyA2MCBieXRlcyBvZiBvdmVyaGVhZHMgZm9yIGV2ZXJ5IHN0b3JlZCBmaWxlLgorCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGFyIGNhbiBleHRyYWN0IGFyY2hpdmVzLCBpdCBjYW5ub3QgY3JlYXRlIG9yCisJICBtb2RpZnkgdGhlbS4KKwkgIE9uIGFuIHg4NiBzeXN0ZW0sIHRoZSBhciBhcHBsZXQgYWRkcyBhYm91dCAxSy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgYXIsIHlvdSBzaG91bGQKKwkgIHByb2JhYmx5IHNheSBOIGhlcmUuCisKK2NvbmZpZyBGRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTCisJYm9vbCAiU3VwcG9ydCBmb3IgbG9uZyBmaWxlbmFtZXMgKG5vdCBuZWVkZWQgZm9yIGRlYnMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVIKKwloZWxwCisJICBCeSBkZWZhdWx0IHRoZSBhciBmb3JtYXQgY2FuIG9ubHkgc3RvcmUgdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMKKwkgIG9mIHRoZSBmaWxlbmFtZSwgdGhpcyBvcHRpb24gcmVtb3ZlcyB0aGF0IGxpbWl0YXRpb24uCisJICBJdCBzdXBwb3J0cyB0aGUgR05VIGFyIGxvbmcgZmlsZW5hbWUgbWV0aG9kIHdoaWNoIG1vdmVzIG11bHRpcGxlIGxvbmcKKwkgIGZpbGVuYW1lcyBpbnRvIGEgdGhlIGRhdGEgc2VjdGlvbiBvZiBhIG5ldyBhciBlbnRyeS4KKworY29uZmlnIEZFQVRVUkVfQVJfQ1JFQVRFCisJYm9vbCAiU3VwcG9ydCBhcmNoaXZlIGNyZWF0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYXJjaGl2ZSBjcmVhdGlvbiAoLWMgYW5kIC1yKSB3aXRoIGJ1c3lib3ggYXIuCisKK2NvbmZpZyBCVU5aSVAyCisJYm9vbCAiYnVuemlwMiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBidW56aXAyIGlzIGEgY29tcHJlc3Npb24gdXRpbGl0eSB1c2luZyB0aGUgQnVycm93cy1XaGVlbGVyIGJsb2NrCisJICBzb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCBhbmQgSHVmZm1hbiBjb2RpbmcuIENvbXByZXNzaW9uCisJICBpcyBnZW5lcmFsbHkgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoYXQgYWNoaWV2ZWQgYnkgbW9yZQorCSAgY29udmVudGlvbmFsIExaNzcvTFo3OC1iYXNlZCBjb21wcmVzc29ycywgYW5kIGFwcHJvYWNoZXMgdGhlCisJICBwZXJmb3JtYW5jZSBvZiB0aGUgUFBNIGZhbWlseSBvZiBzdGF0aXN0aWNhbCBjb21wcmVzc29ycy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgYnVuemlwMiwgeW91CisJICBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KKworY29uZmlnIEJaSVAyCisJYm9vbCAiYnppcDIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgYnppcDIgaXMgYSBjb21wcmVzc2lvbiB1dGlsaXR5IHVzaW5nIHRoZSBCdXJyb3dzLVdoZWVsZXIgYmxvY2sKKwkgIHNvcnRpbmcgdGV4dCBjb21wcmVzc2lvbiBhbGdvcml0aG0sIGFuZCBIdWZmbWFuIGNvZGluZy4gQ29tcHJlc3Npb24KKwkgIGlzIGdlbmVyYWxseSBjb25zaWRlcmFibHkgYmV0dGVyIHRoYW4gdGhhdCBhY2hpZXZlZCBieSBtb3JlCisJICBjb252ZW50aW9uYWwgTFo3Ny9MWjc4LWJhc2VkIGNvbXByZXNzb3JzLCBhbmQgYXBwcm9hY2hlcyB0aGUKKwkgIHBlcmZvcm1hbmNlIG9mIHRoZSBQUE0gZmFtaWx5IG9mIHN0YXRpc3RpY2FsIGNvbXByZXNzb3JzLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBiemlwMiwgeW91CisJICBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KKworY29uZmlnIENQSU8KKwlib29sICJjcGlvIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNwaW8gaXMgYW4gYXJjaGl2YWwgdXRpbGl0eSBwcm9ncmFtIHVzZWQgdG8gY3JlYXRlLCBtb2RpZnksIGFuZAorCSAgZXh0cmFjdCBjb250ZW50cyBmcm9tIGFyY2hpdmVzLgorCSAgY3BpbyBoYXMgMTEwIGJ5dGVzIG9mIG92ZXJoZWFkcyBmb3IgZXZlcnkgc3RvcmVkIGZpbGUuCisKKwkgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgY3BpbyBjYW4gZXh0cmFjdCBjcGlvIGFyY2hpdmVzIGNyZWF0ZWQgaW4gdGhlCisJICAibmV3YyIgb3IgImNyYyIgZm9ybWF0LCBpdCBjYW5ub3QgY3JlYXRlIG9yIG1vZGlmeSB0aGVtLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBjcGlvLCB5b3UKKwkgIHNob3VsZCBwcm9iYWJseSBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9DUElPX08KKwlib29sICJTdXBwb3J0IGZvciBhcmNoaXZlIGNyZWF0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ1BJTworCWhlbHAKKwkgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgY3BpbyBjYW4gY3JlYXRlIGNwaW8gYXJjaGl2ZXMgaW4gdGhlICJuZXdjIgorCSAgZm9ybWF0IG9ubHkuCisKK2NvbmZpZyBGRUFUVVJFX0NQSU9fUAorCWJvb2wgIlN1cHBvcnQgZm9yIHBhc3N0aHJvdWdoIG1vZGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0NQSU9fTworCWhlbHAKKwkgIFBhc3N0aHJvdWdoIG1vZGUuIFJhcmVseSB1c2VkLgorCitjb25maWcgRFBLRworCWJvb2wgImRwa2ciCisJZGVmYXVsdCBuCisJc2VsZWN0IEZFQVRVUkVfU0VBTUxFU1NfR1oKKwloZWxwCisJICBkcGtnIGlzIGEgbWVkaXVtLWxldmVsIHRvb2wgdG8gaW5zdGFsbCwgYnVpbGQsIHJlbW92ZSBhbmQgbWFuYWdlCisJICBEZWJpYW4gcGFja2FnZXMuCisKKwkgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgZHBrZyBoYXMgYSBudW1iZXIgb2YgbGltaXRhdGlvbnMsCisJICB5b3Ugc2hvdWxkIHVzZSB0aGUgb2ZmaWNpYWwgZHBrZyBpZiBwb3NzaWJsZS4KKworY29uZmlnIERQS0dfREVCCisJYm9vbCAiZHBrZ19kZWIiCisJZGVmYXVsdCBuCisJc2VsZWN0IEZFQVRVUkVfU0VBTUxFU1NfR1oKKwloZWxwCisJICBkcGtnLWRlYiB1bnBhY2tzIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBEZWJpYW4gYXJjaGl2ZXMuCisKKwkgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgZHBrZy1kZWIgY2Fubm90IHBhY2sgYXJjaGl2ZXMuCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoaWNoIHJlcXVpcmVzIGRwa2ctZGViLAorCSAgc2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZCisJYm9vbCAiRXh0cmFjdCBvbmx5ICgteCkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBEUEtHX0RFQgorCWhlbHAKKwkgIFRoaXMgcmVkdWNlcyBkcGtnLWRlYiB0byB0aGUgZXF1aXZhbGVudCBvZgorCSAgImFyIC1wIDxkZWI+IGRhdGEudGFyLmd6IHwgdGFyIC16eCIuIEhvd2V2ZXIgaXQgc2F2ZXMgc3BhY2UgYXMgbm9uZQorCSAgb2YgdGhlIGV4dHJhIGRwa2ctZGViLCBhciBvciB0YXIgb3B0aW9ucyBhcmUgbmVlZGVkLCB0aGV5IGFyZSBsaW5rZWQKKwkgIHRvIGludGVybmFsbHkuCisKK2NvbmZpZyBHVU5aSVAKKwlib29sICJndW56aXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZ3VuemlwIGlzIHVzZWQgdG8gZGVjb21wcmVzcyBhcmNoaXZlcyBjcmVhdGVkIGJ5IGd6aXAuCisJICBZb3UgY2FuIHVzZSB0aGUgYC10JyBvcHRpb24gdG8gdGVzdCB0aGUgaW50ZWdyaXR5IG9mCisJICBhbiBhcmNoaXZlLCB3aXRob3V0IGRlY29tcHJlc3NpbmcgaXQuCisKK2NvbmZpZyBHWklQCisJYm9vbCAiZ3ppcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBnemlwIGlzIHVzZWQgdG8gY29tcHJlc3MgZmlsZXMuCisJICBJdCdzIHByb2JhYmx5IHRoZSBtb3N0IHdpZGVseSB1c2VkIFVOSVggY29tcHJlc3Npb24gcHJvZ3JhbS4KKworY29uZmlnIEZFQVRVUkVfR1pJUF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gR1pJUCAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgdXNlIG9mIGxvbmcgb3B0aW9ucywgaW5jcmVhc2VzIHNpemUgYnkgYWJvdXQgMTA2IEJ5dGVzCisKK2NvbmZpZyBMWk9QCisJYm9vbCAibHpvcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBMem9wIGNvbXByZXNzaW9uL2RlY29tcHJlc2lvbi4KKworY29uZmlnIExaT1BfQ09NUFJfSElHSAorCWJvb2wgImx6b3AgY29tcHJlc3Npb24gbGV2ZWxzIDcsOCw5IChub3QgdmVyeSB1c2VmdWwpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTFpPUAorCWhlbHAKKwkgIEhpZ2ggbGV2ZWxzICg3LDgsOSkgb2YgbHpvcCBjb21wcmVzc2lvbi4gVGhlc2UgbGV2ZWxzCisJICBhcmUgYWN0dWFsbHkgc2xvd2VyIHRoYW4gZ3ppcCBhdCBlcXVpdmFsZW50IGNvbXByZXNzaW9uIHJhdGlvcworCSAgYW5kIHRha2UgdXAgMy4ySyBvZiBjb2RlLgorCitjb25maWcgUlBNMkNQSU8KKwlib29sICJycG0yY3BpbyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb252ZXJ0cyBhIFJQTSBmaWxlIGludG8gYSBDUElPIGFyY2hpdmUuCisKK2NvbmZpZyBSUE0KKwlib29sICJycG0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWluaSBSUE0gYXBwbGV0IC0gcXVlcmllcyBhbmQgZXh0cmFjdHMgUlBNIHBhY2thZ2VzLgorCitjb25maWcgVEFSCisJYm9vbCAidGFyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRhciBpcyBhbiBhcmNoaXZpbmcgcHJvZ3JhbS4gSXQncyBjb21tb25seSB1c2VkIHdpdGggZ3ppcCB0bworCSAgY3JlYXRlIGNvbXByZXNzZWQgYXJjaGl2ZXMuIEl0J3MgcHJvYmFibHkgdGhlIG1vc3Qgd2lkZWx5IHVzZWQKKwkgIFVOSVggYXJjaGl2ZSBwcm9ncmFtLgorCitjb25maWcgRkVBVFVSRV9UQVJfQ1JFQVRFCisJYm9vbCAiRW5hYmxlIGFyY2hpdmUgY3JlYXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIKKwloZWxwCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uIHlvdSdsbCBiZSBhYmxlIHRvIGNyZWF0ZQorCSAgdGFyIGFyY2hpdmVzIHVzaW5nIHRoZSBgLWMnIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QKKwlib29sICJBdXRvZGV0ZWN0IGNvbXByZXNzZWQgdGFyYmFsbHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIgJiYgKEZFQVRVUkVfU0VBTUxFU1NfWiB8fCBGRUFUVVJFX1NFQU1MRVNTX0daIHx8IEZFQVRVUkVfU0VBTUxFU1NfQloyIHx8IEZFQVRVUkVfU0VBTUxFU1NfTFpNQSB8fCBGRUFUVVJFX1NFQU1MRVNTX1haKQorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gdGFyIGNhbiBhdXRvbWF0aWNhbGx5IGRldGVjdCBjb21wcmVzc2VkCisJICB0YXJiYWxscy4gQ3VycmVudGx5IGl0IHdvcmtzIG9ubHkgb24gZmlsZXMgKG5vdCBwaXBlcyBldGMpLgorCitjb25maWcgRkVBVFVSRV9UQVJfRlJPTQorCWJvb2wgIkVuYWJsZSAtWCAoZXhjbHVkZSBmcm9tKSBhbmQgLVQgKGluY2x1ZGUgZnJvbSkgb3B0aW9ucykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIKKwloZWxwCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uIHlvdSdsbCBiZSBhYmxlIHRvIHNwZWNpZnkKKwkgIGEgbGlzdCBvZiBmaWxlcyB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgZnJvbSBhbiBhcmNoaXZlLgorCitjb25maWcgRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFkKKwlib29sICJTdXBwb3J0IGZvciBvbGQgdGFyIGhlYWRlciBmb3JtYXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIgfHwgRFBLRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVucGFjayBhcmNoaXZlcyBjcmVhdGVkIGluCisJICB0aGUgb2xkIEdOVSBmb3JtYXQ7IGhlbHAgdG8ga2lsbCB0aGlzIG9sZCBmb3JtYXQgYnkKKwkgIHJlcGFja2luZyB5b3VyIGFuY2llbnQgYXJjaGl2ZXMgd2l0aCB0aGUgbmV3IGZvcm1hdC4KKworY29uZmlnIEZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZCisJYm9vbCAiRW5hYmxlIHVudGFycmluZyBvZiB0YXJiYWxscyB3aXRoIGNoZWNrc3VtcyBwcm9kdWNlZCBieSBidWdneSBTdW4gdGFyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSIHx8IERQS0cKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCB0byB1bnBhY2sgYXJjaGl2ZXMgY3JlYXRlZCBieSBzb21lIG9sZAorCSAgdmVyc2lvbiBvZiBTdW4ncyB0YXIgKGl0IHdhcyBjYWxjdWxhdGluZyBjaGVja3N1bSB1c2luZyBzaWduZWQKKwkgIGFyaXRobWV0aWMpLiBJdCBpcyBzYWlkIHRvIGJlIGZpeGVkIGluIG5ld2VyIFN1biB0YXIsIGJ1dCAib2xkIgorCSAgdGFyYmFsbHMgc3RpbGwgZXhpc3QuCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCWJvb2wgIlN1cHBvcnQgZm9yIEdOVSB0YXIgZXh0ZW5zaW9ucyAobG9uZyBmaWxlbmFtZXMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSIHx8IERQS0cKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIGJ1c3lib3ggc3VwcG9ydHMgR05VIGxvbmcgZmlsZW5hbWVzIGFuZAorCSAgbGlua25hbWVzLgorCitjb25maWcgRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUiAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgdXNlIG9mIGxvbmcgb3B0aW9ucywgaW5jcmVhc2VzIHNpemUgYnkgYWJvdXQgNDAwIEJ5dGVzCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9UT19DT01NQU5ECisJYm9vbCAiU3VwcG9ydCBmb3Igd3JpdGluZyB0byBhbiBleHRlcm5hbCBwcm9ncmFtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSICYmIEZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUworCWhlbHAKKwkgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24geW91J2xsIGJlIGFibGUgdG8gaW5zdHJ1Y3QgdGFyIHRvIHNlbmQKKwkgIHRoZSBjb250ZW50cyBvZiBlYWNoIGV4dHJhY3RlZCBmaWxlIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhbgorCSAgZXh0ZXJuYWwgcHJvZ3JhbS4KKworY29uZmlnIEZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJYm9vbCAiRW5hYmxlIHVzZSBvZiB1c2VyIGFuZCBncm91cCBuYW1lcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUgorCWhlbHAKKwkgIEVuYWJsZXMgdXNlIG9mIHVzZXIgYW5kIGdyb3VwIG5hbWVzIGluIHRhci4gVGhpcyBhZmZlY3RzIGNvbnRlbnRzCisJICBsaXN0aW5ncyAoLXQpIGFuZCBwcmVzZXJ2aW5nIHBlcm1pc3Npb25zIHdoZW4gdW5wYWNraW5nICgtcCkuCisJICArMjAwIGJ5dGVzLgorCitjb25maWcgRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FCisJYm9vbCAiRW5hYmxlIC1tIChkbyBub3QgcHJlc2VydmUgdGltZSkgb3B0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBidXN5Ym94IHN1cHBvcnRzIEdOVSB0YXIgLW0KKwkgIChkbyBub3QgcHJlc2VydmUgdGltZSkgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9UQVJfU0VMSU5VWAorCWJvb2wgIlN1cHBvcnQgZm9yIGV4dHJhY3RpbmcgU0VMaW51eCBsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBUQVIgJiYgU0VMSU5VWAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gYnVzeWJveCBzdXBwb3J0cyByZXN0b3JpbmcgU0VMaW51eCBsYWJlbHMKKwkgIHdoZW4gZXh0cmFjdGluZyBmaWxlcyBmcm9tIHRhciBhcmNoaXZlcy4KKworY29uZmlnIFVOQ09NUFJFU1MKKwlib29sICJ1bmNvbXByZXNzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIHVuY29tcHJlc3MgaXMgdXNlZCB0byBkZWNvbXByZXNzIGFyY2hpdmVzIGNyZWF0ZWQgYnkgY29tcHJlc3MuCisJICBOb3QgbXVjaCB1c2VkIGFueW1vcmUsIHJlcGxhY2VkIGJ5IGd6aXAvZ3VuemlwLgorCitjb25maWcgVU5MWk1BCisJYm9vbCAidW5sem1hIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVubHptYSBpcyBhIGNvbXByZXNzaW9uIHV0aWxpdHkgdXNpbmcgdGhlIExlbXBlbC1aaXYtTWFya292IGNoYWluCisJICBjb21wcmVzc2lvbiBhbGdvcml0aG0sIGFuZCByYW5nZSBjb2RpbmcuIENvbXByZXNzaW9uCisJICBpcyBnZW5lcmFsbHkgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoYXQgYWNoaWV2ZWQgYnkgdGhlIGJ6aXAyCisJICBjb21wcmVzc29ycy4KKworCSAgVGhlIEJ1c3lCb3ggdW5sem1hIGFwcGxldCBpcyBsaW1pdGVkIHRvIGRlLWNvbXByZXNzaW9uIG9ubHkuCisJICBPbiBhbiB4ODYgc3lzdGVtLCB0aGlzIGFwcGxldCBhZGRzIGFib3V0IDRLLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyB1bmx6bWEsIHlvdQorCSAgc2hvdWxkIHByb2JhYmx5IHNheSBOIGhlcmUuCisKK2NvbmZpZyBGRUFUVVJFX0xaTUFfRkFTVAorCWJvb2wgIk9wdGltaXplIHVubHptYSBmb3Igc3BlZWQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVTkxaTUEKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIGRlY29tcHJlc3Npb24gdGltZSBieSBhYm91dCAyNSUgYXQgdGhlIGNvc3Qgb2YKKwkgIGEgMUsgYmlnZ2VyIGJpbmFyeS4KKworY29uZmlnIExaTUEKKwlib29sICJQcm92aWRlIGx6bWEgYWxpYXMgd2hpY2ggc3VwcG9ydHMgb25seSB1bnBhY2tpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVTkxaTUEKKwloZWxwCisJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgY29tbWFuZHMgbGlrZSAibHptYSAtZCIgdG8gd29yay4KKwkgIElPVzogeW91J2xsIGdldCBsem1hIGFwcGxldCwgYnV0IGl0IHdpbGwgYWx3YXlzIHJlcXVpcmUgLWQgb3B0aW9uLgorCitjb25maWcgVU5YWgorCWJvb2wgInVueHoiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW54eiBpcyBhIHVubHptYSBzdWNjZXNzb3IuCisKK2NvbmZpZyBYWgorCWJvb2wgIlByb3ZpZGUgeHogYWxpYXMgd2hpY2ggc3VwcG9ydHMgb25seSB1bnBhY2tpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVTlhaCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IGNvbW1hbmRzIGxpa2UgInh6IC1kIiB0byB3b3JrLgorCSAgSU9XOiB5b3UnbGwgZ2V0IHh6IGFwcGxldCwgYnV0IGl0IHdpbGwgYWx3YXlzIHJlcXVpcmUgLWQgb3B0aW9uLgorCitjb25maWcgVU5aSVAKKwlib29sICJ1bnppcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1bnppcCB3aWxsIGxpc3Qgb3IgZXh0cmFjdCBmaWxlcyBmcm9tIGEgWklQIGFyY2hpdmUsCisJICBjb21tb25seSBmb3VuZCBvbiBET1MvV0lOIHN5c3RlbXMuIFRoZSBkZWZhdWx0IGJlaGF2aW9yCisJICAod2l0aCBubyBvcHRpb25zKSBpcyB0byBleHRyYWN0IHRoZSBhcmNoaXZlIGludG8gdGhlCisJICBjdXJyZW50IGRpcmVjdG9yeS4gVXNlIHRoZSBgLWQnIG9wdGlvbiB0byBleHRyYWN0IHRvIGEKKwkgIGRpcmVjdG9yeSBvZiB5b3VyIGNob2ljZS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvQ29uZmlnLnNyYyBiL2FyY2hpdmFsL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3ODhlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwzNzkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkFyY2hpdmFsIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX1haCisJYm9vbCAiTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLnh6IGRhdGEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLnh6IGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwlib29sICJNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAubHptYSBkYXRhIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5sem1hIGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX0JaMgorCWJvb2wgIk1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5iejIgZGF0YSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAuYnoyIGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX0daCisJYm9vbCAiTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmd6IGRhdGEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmd6IGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX1oKKwlib29sICJNYWtlIHRhciBhbmQgZ3VuemlwIHVuZGVyc3RhbmQgLlogZGF0YSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBNYWtlIHRhciBhbmQgZ3VuemlwIHVuZGVyc3RhbmQgLlogZGF0YS4KKworY29uZmlnIEFSCisJYm9vbCAiYXIiCisJZGVmYXVsdCBuICAjIG5lZWRzIHRvIGJlIGltcHJvdmVkIHRvIGJlIGFibGUgdG8gcmVwbGFjZSBiaW51dGlscyBhcgorCWhlbHAKKwkgIGFyIGlzIGFuIGFyY2hpdmFsIHV0aWxpdHkgcHJvZ3JhbSB1c2VkIHRvIGNyZWF0ZSwgbW9kaWZ5LCBhbmQKKwkgIGV4dHJhY3QgY29udGVudHMgZnJvbSBhcmNoaXZlcy4gQW4gYXJjaGl2ZSBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcKKwkgIGEgY29sbGVjdGlvbiBvZiBvdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvCisJICByZXRyaWV2ZSB0aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIGFyY2hpdmUgbWVtYmVycykuCisJICBUaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsCisJICBhbmQgZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIGNhbiBiZSByZXN0b3JlZCBvbgorCSAgZXh0cmFjdGlvbi4KKworCSAgVGhlIHN0b3JlZCBmaWxlbmFtZSBpcyBsaW1pdGVkIHRvIDE1IGNoYXJhY3RlcnMuIChmb3IgbW9yZSBpbmZvcm1hdGlvbgorCSAgc2VlIGxvbmcgZmlsZW5hbWUgc3VwcG9ydCkuCisJICBhciBoYXMgNjAgYnl0ZXMgb2Ygb3ZlcmhlYWRzIGZvciBldmVyeSBzdG9yZWQgZmlsZS4KKworCSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBhciBjYW4gZXh0cmFjdCBhcmNoaXZlcywgaXQgY2Fubm90IGNyZWF0ZSBvcgorCSAgbW9kaWZ5IHRoZW0uCisJICBPbiBhbiB4ODYgc3lzdGVtLCB0aGUgYXIgYXBwbGV0IGFkZHMgYWJvdXQgMUsuCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoaWNoIHJlcXVpcmVzIGFyLCB5b3Ugc2hvdWxkCisJICBwcm9iYWJseSBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUworCWJvb2wgIlN1cHBvcnQgZm9yIGxvbmcgZmlsZW5hbWVzIChub3QgbmVlZGVkIGZvciBkZWJzKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFSCisJaGVscAorCSAgQnkgZGVmYXVsdCB0aGUgYXIgZm9ybWF0IGNhbiBvbmx5IHN0b3JlIHRoZSBmaXJzdCAxNSBjaGFyYWN0ZXJzCisJICBvZiB0aGUgZmlsZW5hbWUsIHRoaXMgb3B0aW9uIHJlbW92ZXMgdGhhdCBsaW1pdGF0aW9uLgorCSAgSXQgc3VwcG9ydHMgdGhlIEdOVSBhciBsb25nIGZpbGVuYW1lIG1ldGhvZCB3aGljaCBtb3ZlcyBtdWx0aXBsZSBsb25nCisJICBmaWxlbmFtZXMgaW50byBhIHRoZSBkYXRhIHNlY3Rpb24gb2YgYSBuZXcgYXIgZW50cnkuCisKK2NvbmZpZyBGRUFUVVJFX0FSX0NSRUFURQorCWJvb2wgIlN1cHBvcnQgYXJjaGl2ZSBjcmVhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFSCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGFyY2hpdmUgY3JlYXRpb24gKC1jIGFuZCAtcikgd2l0aCBidXN5Ym94IGFyLgorCitjb25maWcgQlVOWklQMgorCWJvb2wgImJ1bnppcDIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgYnVuemlwMiBpcyBhIGNvbXByZXNzaW9uIHV0aWxpdHkgdXNpbmcgdGhlIEJ1cnJvd3MtV2hlZWxlciBibG9jaworCSAgc29ydGluZyB0ZXh0IGNvbXByZXNzaW9uIGFsZ29yaXRobSwgYW5kIEh1ZmZtYW4gY29kaW5nLiBDb21wcmVzc2lvbgorCSAgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyYWJseSBiZXR0ZXIgdGhhbiB0aGF0IGFjaGlldmVkIGJ5IG1vcmUKKwkgIGNvbnZlbnRpb25hbCBMWjc3L0xaNzgtYmFzZWQgY29tcHJlc3NvcnMsIGFuZCBhcHByb2FjaGVzIHRoZQorCSAgcGVyZm9ybWFuY2Ugb2YgdGhlIFBQTSBmYW1pbHkgb2Ygc3RhdGlzdGljYWwgY29tcHJlc3NvcnMuCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIHdoaWNoIHJlcXVpcmVzIGJ1bnppcDIsIHlvdQorCSAgc2hvdWxkIHByb2JhYmx5IHNheSBOIGhlcmUuCisKK2NvbmZpZyBCWklQMgorCWJvb2wgImJ6aXAyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGJ6aXAyIGlzIGEgY29tcHJlc3Npb24gdXRpbGl0eSB1c2luZyB0aGUgQnVycm93cy1XaGVlbGVyIGJsb2NrCisJICBzb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCBhbmQgSHVmZm1hbiBjb2RpbmcuIENvbXByZXNzaW9uCisJICBpcyBnZW5lcmFsbHkgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoYXQgYWNoaWV2ZWQgYnkgbW9yZQorCSAgY29udmVudGlvbmFsIExaNzcvTFo3OC1iYXNlZCBjb21wcmVzc29ycywgYW5kIGFwcHJvYWNoZXMgdGhlCisJICBwZXJmb3JtYW5jZSBvZiB0aGUgUFBNIGZhbWlseSBvZiBzdGF0aXN0aWNhbCBjb21wcmVzc29ycy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgYnppcDIsIHlvdQorCSAgc2hvdWxkIHByb2JhYmx5IHNheSBOIGhlcmUuCisKK2NvbmZpZyBDUElPCisJYm9vbCAiY3BpbyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjcGlvIGlzIGFuIGFyY2hpdmFsIHV0aWxpdHkgcHJvZ3JhbSB1c2VkIHRvIGNyZWF0ZSwgbW9kaWZ5LCBhbmQKKwkgIGV4dHJhY3QgY29udGVudHMgZnJvbSBhcmNoaXZlcy4KKwkgIGNwaW8gaGFzIDExMCBieXRlcyBvZiBvdmVyaGVhZHMgZm9yIGV2ZXJ5IHN0b3JlZCBmaWxlLgorCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGNwaW8gY2FuIGV4dHJhY3QgY3BpbyBhcmNoaXZlcyBjcmVhdGVkIGluIHRoZQorCSAgIm5ld2MiIG9yICJjcmMiIGZvcm1hdCwgaXQgY2Fubm90IGNyZWF0ZSBvciBtb2RpZnkgdGhlbS4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgY3BpbywgeW91CisJICBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfQ1BJT19PCisJYm9vbCAiU3VwcG9ydCBmb3IgYXJjaGl2ZSBjcmVhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENQSU8KKwloZWxwCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGNwaW8gY2FuIGNyZWF0ZSBjcGlvIGFyY2hpdmVzIGluIHRoZSAibmV3YyIKKwkgIGZvcm1hdCBvbmx5LgorCitjb25maWcgRkVBVFVSRV9DUElPX1AKKwlib29sICJTdXBwb3J0IGZvciBwYXNzdGhyb3VnaCBtb2RlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9DUElPX08KKwloZWxwCisJICBQYXNzdGhyb3VnaCBtb2RlLiBSYXJlbHkgdXNlZC4KKworY29uZmlnIERQS0cKKwlib29sICJkcGtnIgorCWRlZmF1bHQgbgorCXNlbGVjdCBGRUFUVVJFX1NFQU1MRVNTX0daCisJaGVscAorCSAgZHBrZyBpcyBhIG1lZGl1bS1sZXZlbCB0b29sIHRvIGluc3RhbGwsIGJ1aWxkLCByZW1vdmUgYW5kIG1hbmFnZQorCSAgRGViaWFuIHBhY2thZ2VzLgorCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGRwa2cgaGFzIGEgbnVtYmVyIG9mIGxpbWl0YXRpb25zLAorCSAgeW91IHNob3VsZCB1c2UgdGhlIG9mZmljaWFsIGRwa2cgaWYgcG9zc2libGUuCisKK2NvbmZpZyBEUEtHX0RFQgorCWJvb2wgImRwa2dfZGViIgorCWRlZmF1bHQgbgorCXNlbGVjdCBGRUFUVVJFX1NFQU1MRVNTX0daCisJaGVscAorCSAgZHBrZy1kZWIgdW5wYWNrcyBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgRGViaWFuIGFyY2hpdmVzLgorCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGRwa2ctZGViIGNhbm5vdCBwYWNrIGFyY2hpdmVzLgorCisJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBkcGtnLWRlYiwKKwkgIHNheSBOIGhlcmUuCisKK2NvbmZpZyBGRUFUVVJFX0RQS0dfREVCX0VYVFJBQ1RfT05MWQorCWJvb2wgIkV4dHJhY3Qgb25seSAoLXgpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRFBLR19ERUIKKwloZWxwCisJICBUaGlzIHJlZHVjZXMgZHBrZy1kZWIgdG8gdGhlIGVxdWl2YWxlbnQgb2YKKwkgICJhciAtcCA8ZGViPiBkYXRhLnRhci5neiB8IHRhciAtengiLiBIb3dldmVyIGl0IHNhdmVzIHNwYWNlIGFzIG5vbmUKKwkgIG9mIHRoZSBleHRyYSBkcGtnLWRlYiwgYXIgb3IgdGFyIG9wdGlvbnMgYXJlIG5lZWRlZCwgdGhleSBhcmUgbGlua2VkCisJICB0byBpbnRlcm5hbGx5LgorCitjb25maWcgR1VOWklQCisJYm9vbCAiZ3VuemlwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGd1bnppcCBpcyB1c2VkIHRvIGRlY29tcHJlc3MgYXJjaGl2ZXMgY3JlYXRlZCBieSBnemlwLgorCSAgWW91IGNhbiB1c2UgdGhlIGAtdCcgb3B0aW9uIHRvIHRlc3QgdGhlIGludGVncml0eSBvZgorCSAgYW4gYXJjaGl2ZSwgd2l0aG91dCBkZWNvbXByZXNzaW5nIGl0LgorCitjb25maWcgR1pJUAorCWJvb2wgImd6aXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZ3ppcCBpcyB1c2VkIHRvIGNvbXByZXNzIGZpbGVzLgorCSAgSXQncyBwcm9iYWJseSB0aGUgbW9zdCB3aWRlbHkgdXNlZCBVTklYIGNvbXByZXNzaW9uIHByb2dyYW0uCisKK2NvbmZpZyBGRUFUVVJFX0daSVBfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEdaSVAgJiYgTE9OR19PUFRTCisJaGVscAorCSAgRW5hYmxlIHVzZSBvZiBsb25nIG9wdGlvbnMsIGluY3JlYXNlcyBzaXplIGJ5IGFib3V0IDEwNiBCeXRlcworCitjb25maWcgTFpPUAorCWJvb2wgImx6b3AiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTHpvcCBjb21wcmVzc2lvbi9kZWNvbXByZXNpb24uCisKK2NvbmZpZyBMWk9QX0NPTVBSX0hJR0gKKwlib29sICJsem9wIGNvbXByZXNzaW9uIGxldmVscyA3LDgsOSAobm90IHZlcnkgdXNlZnVsKSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIExaT1AKKwloZWxwCisJICBIaWdoIGxldmVscyAoNyw4LDkpIG9mIGx6b3AgY29tcHJlc3Npb24uIFRoZXNlIGxldmVscworCSAgYXJlIGFjdHVhbGx5IHNsb3dlciB0aGFuIGd6aXAgYXQgZXF1aXZhbGVudCBjb21wcmVzc2lvbiByYXRpb3MKKwkgIGFuZCB0YWtlIHVwIDMuMksgb2YgY29kZS4KKworY29uZmlnIFJQTTJDUElPCisJYm9vbCAicnBtMmNwaW8iCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29udmVydHMgYSBSUE0gZmlsZSBpbnRvIGEgQ1BJTyBhcmNoaXZlLgorCitjb25maWcgUlBNCisJYm9vbCAicnBtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1pbmkgUlBNIGFwcGxldCAtIHF1ZXJpZXMgYW5kIGV4dHJhY3RzIFJQTSBwYWNrYWdlcy4KKworY29uZmlnIFRBUgorCWJvb2wgInRhciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0YXIgaXMgYW4gYXJjaGl2aW5nIHByb2dyYW0uIEl0J3MgY29tbW9ubHkgdXNlZCB3aXRoIGd6aXAgdG8KKwkgIGNyZWF0ZSBjb21wcmVzc2VkIGFyY2hpdmVzLiBJdCdzIHByb2JhYmx5IHRoZSBtb3N0IHdpZGVseSB1c2VkCisJICBVTklYIGFyY2hpdmUgcHJvZ3JhbS4KKworY29uZmlnIEZFQVRVUkVfVEFSX0NSRUFURQorCWJvb2wgIkVuYWJsZSBhcmNoaXZlIGNyZWF0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSCisJaGVscAorCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiB5b3UnbGwgYmUgYWJsZSB0byBjcmVhdGUKKwkgIHRhciBhcmNoaXZlcyB1c2luZyB0aGUgYC1jJyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9BVVRPREVURUNUCisJYm9vbCAiQXV0b2RldGVjdCBjb21wcmVzc2VkIHRhcmJhbGxzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSICYmIChGRUFUVVJFX1NFQU1MRVNTX1ogfHwgRkVBVFVSRV9TRUFNTEVTU19HWiB8fCBGRUFUVVJFX1NFQU1MRVNTX0JaMiB8fCBGRUFUVVJFX1NFQU1MRVNTX0xaTUEgfHwgRkVBVFVSRV9TRUFNTEVTU19YWikKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIHRhciBjYW4gYXV0b21hdGljYWxseSBkZXRlY3QgY29tcHJlc3NlZAorCSAgdGFyYmFsbHMuIEN1cnJlbnRseSBpdCB3b3JrcyBvbmx5IG9uIGZpbGVzIChub3QgcGlwZXMgZXRjKS4KKworY29uZmlnIEZFQVRVUkVfVEFSX0ZST00KKwlib29sICJFbmFibGUgLVggKGV4Y2x1ZGUgZnJvbSkgYW5kIC1UIChpbmNsdWRlIGZyb20pIG9wdGlvbnMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSCisJaGVscAorCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiB5b3UnbGwgYmUgYWJsZSB0byBzcGVjaWZ5CisJICBhIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZSBvciBleGNsdWRlIGZyb20gYW4gYXJjaGl2ZS4KKworY29uZmlnIEZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZCisJYm9vbCAiU3VwcG9ydCBmb3Igb2xkIHRhciBoZWFkZXIgZm9ybWF0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFSIHx8IERQS0cKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCB0byB1bnBhY2sgYXJjaGl2ZXMgY3JlYXRlZCBpbgorCSAgdGhlIG9sZCBHTlUgZm9ybWF0OyBoZWxwIHRvIGtpbGwgdGhpcyBvbGQgZm9ybWF0IGJ5CisJICByZXBhY2tpbmcgeW91ciBhbmNpZW50IGFyY2hpdmVzIHdpdGggdGhlIG5ldyBmb3JtYXQuCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWQorCWJvb2wgIkVuYWJsZSB1bnRhcnJpbmcgb2YgdGFyYmFsbHMgd2l0aCBjaGVja3N1bXMgcHJvZHVjZWQgYnkgYnVnZ3kgU3VuIHRhciIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUiB8fCBEUEtHCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgdG8gdW5wYWNrIGFyY2hpdmVzIGNyZWF0ZWQgYnkgc29tZSBvbGQKKwkgIHZlcnNpb24gb2YgU3VuJ3MgdGFyIChpdCB3YXMgY2FsY3VsYXRpbmcgY2hlY2tzdW0gdXNpbmcgc2lnbmVkCisJICBhcml0aG1ldGljKS4gSXQgaXMgc2FpZCB0byBiZSBmaXhlZCBpbiBuZXdlciBTdW4gdGFyLCBidXQgIm9sZCIKKwkgIHRhcmJhbGxzIHN0aWxsIGV4aXN0LgorCitjb25maWcgRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwlib29sICJTdXBwb3J0IGZvciBHTlUgdGFyIGV4dGVuc2lvbnMgKGxvbmcgZmlsZW5hbWVzKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUiB8fCBEUEtHCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBidXN5Ym94IHN1cHBvcnRzIEdOVSBsb25nIGZpbGVuYW1lcyBhbmQKKwkgIGxpbmtuYW1lcy4KKworY29uZmlnIEZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIgJiYgTE9OR19PUFRTCisJaGVscAorCSAgRW5hYmxlIHVzZSBvZiBsb25nIG9wdGlvbnMsIGluY3JlYXNlcyBzaXplIGJ5IGFib3V0IDQwMCBCeXRlcworCitjb25maWcgRkVBVFVSRV9UQVJfVE9fQ09NTUFORAorCWJvb2wgIlN1cHBvcnQgZm9yIHdyaXRpbmcgdG8gYW4gZXh0ZXJuYWwgcHJvZ3JhbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUiAmJiBGRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKwloZWxwCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uIHlvdSdsbCBiZSBhYmxlIHRvIGluc3RydWN0IHRhciB0byBzZW5kCisJICB0aGUgY29udGVudHMgb2YgZWFjaCBleHRyYWN0ZWQgZmlsZSB0byB0aGUgc3RhbmRhcmQgaW5wdXQgb2YgYW4KKwkgIGV4dGVybmFsIHByb2dyYW0uCisKK2NvbmZpZyBGRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCWJvb2wgIkVuYWJsZSB1c2Ugb2YgdXNlciBhbmQgZ3JvdXAgbmFtZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQVIKKwloZWxwCisJICBFbmFibGVzIHVzZSBvZiB1c2VyIGFuZCBncm91cCBuYW1lcyBpbiB0YXIuIFRoaXMgYWZmZWN0cyBjb250ZW50cworCSAgbGlzdGluZ3MgKC10KSBhbmQgcHJlc2VydmluZyBwZXJtaXNzaW9ucyB3aGVuIHVucGFja2luZyAoLXApLgorCSAgKzIwMCBieXRlcy4KKworY29uZmlnIEZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRQorCWJvb2wgIkVuYWJsZSAtbSAoZG8gbm90IHByZXNlcnZlIHRpbWUpIG9wdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBUgorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gYnVzeWJveCBzdXBwb3J0cyBHTlUgdGFyIC1tCisJICAoZG8gbm90IHByZXNlcnZlIHRpbWUpIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfVEFSX1NFTElOVVgKKwlib29sICJTdXBwb3J0IGZvciBleHRyYWN0aW5nIFNFTGludXggbGFiZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVEFSICYmIFNFTElOVVgKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIGJ1c3lib3ggc3VwcG9ydHMgcmVzdG9yaW5nIFNFTGludXggbGFiZWxzCisJICB3aGVuIGV4dHJhY3RpbmcgZmlsZXMgZnJvbSB0YXIgYXJjaGl2ZXMuCisKK2NvbmZpZyBVTkNPTVBSRVNTCisJYm9vbCAidW5jb21wcmVzcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICB1bmNvbXByZXNzIGlzIHVzZWQgdG8gZGVjb21wcmVzcyBhcmNoaXZlcyBjcmVhdGVkIGJ5IGNvbXByZXNzLgorCSAgTm90IG11Y2ggdXNlZCBhbnltb3JlLCByZXBsYWNlZCBieSBnemlwL2d1bnppcC4KKworY29uZmlnIFVOTFpNQQorCWJvb2wgInVubHptYSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1bmx6bWEgaXMgYSBjb21wcmVzc2lvbiB1dGlsaXR5IHVzaW5nIHRoZSBMZW1wZWwtWml2LU1hcmtvdiBjaGFpbgorCSAgY29tcHJlc3Npb24gYWxnb3JpdGhtLCBhbmQgcmFuZ2UgY29kaW5nLiBDb21wcmVzc2lvbgorCSAgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyYWJseSBiZXR0ZXIgdGhhbiB0aGF0IGFjaGlldmVkIGJ5IHRoZSBiemlwMgorCSAgY29tcHJlc3NvcnMuCisKKwkgIFRoZSBCdXN5Qm94IHVubHptYSBhcHBsZXQgaXMgbGltaXRlZCB0byBkZS1jb21wcmVzc2lvbiBvbmx5LgorCSAgT24gYW4geDg2IHN5c3RlbSwgdGhpcyBhcHBsZXQgYWRkcyBhYm91dCA0Sy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgdW5sem1hLCB5b3UKKwkgIHNob3VsZCBwcm9iYWJseSBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9MWk1BX0ZBU1QKKwlib29sICJPcHRpbWl6ZSB1bmx6bWEgZm9yIHNwZWVkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVU5MWk1BCisJaGVscAorCSAgVGhpcyBvcHRpb24gcmVkdWNlcyBkZWNvbXByZXNzaW9uIHRpbWUgYnkgYWJvdXQgMjUlIGF0IHRoZSBjb3N0IG9mCisJICBhIDFLIGJpZ2dlciBiaW5hcnkuCisKK2NvbmZpZyBMWk1BCisJYm9vbCAiUHJvdmlkZSBsem1hIGFsaWFzIHdoaWNoIHN1cHBvcnRzIG9ubHkgdW5wYWNraW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVU5MWk1BCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IGNvbW1hbmRzIGxpa2UgImx6bWEgLWQiIHRvIHdvcmsuCisJICBJT1c6IHlvdSdsbCBnZXQgbHptYSBhcHBsZXQsIGJ1dCBpdCB3aWxsIGFsd2F5cyByZXF1aXJlIC1kIG9wdGlvbi4KKworY29uZmlnIFVOWFoKKwlib29sICJ1bnh6IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVueHogaXMgYSB1bmx6bWEgc3VjY2Vzc29yLgorCitjb25maWcgWFoKKwlib29sICJQcm92aWRlIHh6IGFsaWFzIHdoaWNoIHN1cHBvcnRzIG9ubHkgdW5wYWNraW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVU5YWgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBjb21tYW5kcyBsaWtlICJ4eiAtZCIgdG8gd29yay4KKwkgIElPVzogeW91J2xsIGdldCB4eiBhcHBsZXQsIGJ1dCBpdCB3aWxsIGFsd2F5cyByZXF1aXJlIC1kIG9wdGlvbi4KKworY29uZmlnIFVOWklQCisJYm9vbCAidW56aXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW56aXAgd2lsbCBsaXN0IG9yIGV4dHJhY3QgZmlsZXMgZnJvbSBhIFpJUCBhcmNoaXZlLAorCSAgY29tbW9ubHkgZm91bmQgb24gRE9TL1dJTiBzeXN0ZW1zLiBUaGUgZGVmYXVsdCBiZWhhdmlvcgorCSAgKHdpdGggbm8gb3B0aW9ucykgaXMgdG8gZXh0cmFjdCB0aGUgYXJjaGl2ZSBpbnRvIHRoZQorCSAgY3VycmVudCBkaXJlY3RvcnkuIFVzZSB0aGUgYC1kJyBvcHRpb24gdG8gZXh0cmFjdCB0byBhCisJICBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL0tidWlsZC5zcmMgYi9hcmNoaXZhbC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjY0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMzAgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWJzLXkJCQkJKz0gbGliYXJjaGl2ZS8KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX0FSKQkJKz0gYXIubworbGliLSQoQ09ORklHX0NQSU8pCQkrPSBjcGlvLm8KK2xpYi0kKENPTkZJR19EUEtHKQkJKz0gZHBrZy5vCitsaWItJChDT05GSUdfRFBLR19ERUIpCQkrPSBkcGtnX2RlYi5vCitsaWItJChDT05GSUdfUlBNMkNQSU8pCQkrPSBycG0yY3Bpby5vCitsaWItJChDT05GSUdfUlBNKQkJKz0gcnBtLm8KK2xpYi0kKENPTkZJR19UQVIpCQkrPSB0YXIubworbGliLSQoQ09ORklHX1VOWklQKQkJKz0gdW56aXAubworCitsaWItJChDT05GSUdfTFpPUCkJCSs9IGx6b3AubyBiYnVuemlwLm8KK2xpYi0kKENPTkZJR19HWklQKQkJKz0gZ3ppcC5vIGJidW56aXAubworbGliLSQoQ09ORklHX0JaSVAyKQkJKz0gYnppcDIubyBiYnVuemlwLm8KKworbGliLSQoQ09ORklHX1VOWFopCQkrPSBiYnVuemlwLm8KK2xpYi0kKENPTkZJR19VTkxaTUEpCQkrPSBiYnVuemlwLm8KK2xpYi0kKENPTkZJR19CVU5aSVAyKQkJKz0gYmJ1bnppcC5vCitsaWItJChDT05GSUdfR1VOWklQKQkJKz0gYmJ1bnppcC5vCitsaWItJChDT05GSUdfVU5DT01QUkVTUykJKz0gYmJ1bnppcC5vCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9hci5jIGIvYXJjaGl2YWwvYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FkMjBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYXIuYwpAQCAtMCwwICsxLDI2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBhciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBHbGVubiBNY0dyYXRoCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBCdXN5Qm94IHRhciwgRGViaWFuIGRwa2ctZGViIGFuZCBHTlUgYXIuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBcmNoaXZlIGNyZWF0aW9uIHN1cHBvcnQ6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IEFsZXhhbmRlciBTaGlzaGtpbi4KKyAqCisgKiBUaGVyZSBpcyBubyBzaW5nbGUgc3RhbmRhcmQgdG8gYWRoZXJlIHRvIHNvIGFyIG1heSBub3QgcG9ydGFibGUKKyAqIGJldHdlZW4gZGlmZmVyZW50IHN5c3RlbXMKKyAqIGh0dHA6Ly93d3cudW5peC1zeXN0ZW1zLm9yZy9zaW5nbGVfdW5peF9zcGVjaWZpY2F0aW9uX3YyL3hjdS9hci5odG1sCisgKi8KKworLy91c2FnZTojZGVmaW5lIGFyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW9dIFstdl0gWy1wXSBbLXRdIFsteF0gQVJDSElWRSBGSUxFUyIKKy8vdXNhZ2U6I2RlZmluZSBhcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkV4dHJhY3Qgb3IgbGlzdCBGSUxFUyBmcm9tIGFuIGFyIGFyY2hpdmVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JUHJlc2VydmUgb3JpZ2luYWwgZGF0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1wCUV4dHJhY3QgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktdAlMaXN0IgorLy91c2FnZTogICAgICJcbgkteAlFeHRyYWN0IgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisjaW5jbHVkZSAiYXIuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0NSRUFURQorLyogZmlsdGVyIG91dCBlbnRyaWVzIHdpdGggc2FtZSBuYW1lcyBhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAqLworc3RhdGljIGNoYXIgRkFTVF9GVU5DIGZpbHRlcl9yZXBsYWNlYWJsZShhcmNoaXZlX2hhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKGZpbmRfbGlzdF9lbnRyeShoYW5kbGUtPmFjY2VwdCwgaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSkpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfYXJfaGVhZGVyKGFyY2hpdmVfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwkvKiBHTlUgYXIgMi4xOS41MS4wLjE0IGNyZWF0ZXMgbWFsZm9ybWVkIGFyY2hpdmVzCisJICogaWYgaW5wdXQgZmlsZXMgYXJlID4xMEcuIEl0IGFsc28gdHJ1bmNhdGVzIGZpbGVzID40R0IKKwkgKiAodXNlcyAic2l6ZSBtb2QgNEciKS4gV2UgYWJvcnQgaW4gdGhpcyBjYXNlOgorCSAqIFdlIGNvdWxkIGFkZCBzdXBwb3J0IGZvciB1cCB0byAxMEcgZmlsZXMsIGJ1dCB0aGlzIGlzIHVubGlrZWx5IHRvIGJlIHVzZWZ1bC4KKwkgKiBOb3RlIHRoYXQgdW5wYWNraW5nIHNpZGUgbGltaXRzIGFsbCBmaWVsZHMgdG8gInVuc2lnbmVkIGludCIgZGF0YSB0eXBlLAorCSAqIGFuZCB0cmVhdHMgImFsbCBvbmVzIiBhcyBhbiBlcnJvciBpbmRpY2F0b3IuIFRodXMgbWF4IHdlIGFsbG93IGhlcmUgaXMgVUlOVF9NQVgtMS4KKwkgKi8KKwllbnVtIHsKKwkJLyogZm9yIDJuZCBmaWVsZDogbXRpbWUgKi8KKwkJTUFYMTFDSEFSUyA9IFVJTlRfTUFYID4gMHhmZmZmZmZmZiA/ICh1bnNpZ25lZCk5OTk5OTk5OTk5OSA6IFVJTlRfTUFYLTEsCisJCS8qIGZvciBsYXN0IGZpZWxkOiBmaWxlc2l6ZSAqLworCQlNQVgxMENIQVJTID0gVUlOVF9NQVggPiAweGZmZmZmZmZmID8gKHVuc2lnbmVkKTk5OTk5OTk5OTkgOiBVSU5UX01BWC0xLAorCX07CisKKwlzdHJ1Y3QgZmlsZV9oZWFkZXJfdCAqZmggPSBoYW5kbGUtPmZpbGVfaGVhZGVyOworCisJaWYgKGhhbmRsZS0+b2Zmc2V0ICYgMSkgeworCQl4d3JpdGUoaGFuZGxlLT5zcmNfZmQsICJcbiIsIDEpOworCQloYW5kbGUtPm9mZnNldCsrOworCX0KKworCS8qIENhcmVmdWwhIFRoZSB3aWR0aHMgc2hvdWxkIGJlIGV4YWN0LiBGaWVsZHMgbXVzdCBiZSBzZXBhcmF0ZWQgKi8KKwlpZiAoc2l6ZW9mKG9mZl90KSA+IDQgJiYgZmgtPnNpemUgPiAob2ZmX3QpTUFYMTBDSEFSUykgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBiaWdnZXIgdGhhbiBhciBjYW4gaGFuZGxlIiwgZmgtPm5hbWUpOworCX0KKwlmZHByaW50ZihoYW5kbGUtPnNyY19mZCwgIiUtMTYuMTZzJS0xMmx1JS02dSUtNnUlLThvJS0xMCJPRkZfRk1UInVgXG4iLAorCQkJZmgtPm5hbWUsCisJCQkoc2l6ZW9mKHRpbWVfdCkgPiA0ICYmIGZoLT5tdGltZSA+IE1BWDExQ0hBUlMpID8gKGxvbmcpMCA6IChsb25nKWZoLT5tdGltZSwKKwkJCWZoLT51aWQgPiA5OTk5OSA/IDAgOiAoaW50KWZoLT51aWQsCisJCQlmaC0+Z2lkID4gOTk5OTkgPyAwIDogKGludClmaC0+Z2lkLAorCQkJKGludClmaC0+bW9kZSAmIDA3Nzc3Nzc3LAorCQkJZmgtPnNpemUKKwkpOworCisJaGFuZGxlLT5vZmZzZXQgKz0gQVJfSEVBREVSX0xFTjsKK30KKworLyoKKyAqIHdoZW4gcmVwbGFjaW5nIGZpbGVzIGluIGFuIGV4aXN0aW5nIGFyY2hpdmUsIGNvcHkgZnJvbSB0aGUKKyAqIG9yaWdpbmFsIGFyY2hpdmUgdGhvc2UgZmlsZXMgdGhhdCBhcmUgdG8gYmUgbGVmdCBpbnRhY3QKKyAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvcHlfZGF0YShhcmNoaXZlX2hhbmRsZV90ICpoYW5kbGUpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqb3V0X2hhbmRsZSA9IGhhbmRsZS0+YXJfX291dDsKKwlzdHJ1Y3QgZmlsZV9oZWFkZXJfdCAqZmggPSBoYW5kbGUtPmZpbGVfaGVhZGVyOworCisJb3V0X2hhbmRsZS0+ZmlsZV9oZWFkZXIgPSBmaDsKKwlvdXRwdXRfYXJfaGVhZGVyKG91dF9oYW5kbGUpOworCisJYmJfY29weWZkX2V4YWN0X3NpemUoaGFuZGxlLT5zcmNfZmQsIG91dF9oYW5kbGUtPnNyY19mZCwgZmgtPnNpemUpOworCW91dF9oYW5kbGUtPm9mZnNldCArPSBmaC0+c2l6ZTsKK30KKworc3RhdGljIGludCB3cml0ZV9hcl9oZWFkZXIoYXJjaGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQoreworCWNoYXIgKmZuOworCWNoYXIgZm5faFsxN107IC8qIDE1ICsgIi8iICsgTlVMICovCisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCisJZm4gPSBsbGlzdF9wb3AoJmhhbmRsZS0+YWNjZXB0KTsKKwlpZiAoIWZuKQorCQlyZXR1cm4gLTE7CisKKwl4c3RhdChmbiwgJnN0KTsKKworCWhhbmRsZS0+ZmlsZV9oZWFkZXItPm10aW1lID0gc3Quc3RfbXRpbWU7CisJaGFuZGxlLT5maWxlX2hlYWRlci0+dWlkID0gc3Quc3RfdWlkOworCWhhbmRsZS0+ZmlsZV9oZWFkZXItPmdpZCA9IHN0LnN0X2dpZDsKKwloYW5kbGUtPmZpbGVfaGVhZGVyLT5tb2RlID0gc3Quc3RfbW9kZTsKKwloYW5kbGUtPmZpbGVfaGVhZGVyLT5zaXplID0gc3Quc3Rfc2l6ZTsKKwloYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lID0gZm5faDsKKy8vVE9ETzogaWYgRU5BQkxFX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMuLi4KKwlzcHJpbnRmKGZuX2gsICIlLjE1cy8iLCBiYl9iYXNlbmFtZShmbikpOworCisJb3V0cHV0X2FyX2hlYWRlcihoYW5kbGUpOworCisJZmQgPSB4b3BlbihmbiwgT19SRE9OTFkpOworCWJiX2NvcHlmZF9leGFjdF9zaXplKGZkLCBoYW5kbGUtPnNyY19mZCwgc3Quc3Rfc2l6ZSk7CisJY2xvc2UoZmQpOworCWhhbmRsZS0+b2Zmc2V0ICs9IHN0LnN0X3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlhcmNoaXZlX2hhbmRsZV90ICpvdXRfaGFuZGxlOworCisJeGZzdGF0KGhhbmRsZS0+c3JjX2ZkLCAmc3QsIGhhbmRsZS0+YXJfX25hbWUpOworCisJLyogaWYgYXJjaGl2ZSBleGlzdHMsIGNyZWF0ZSBhIG5ldyBoYW5kbGUgZm9yIG91dHB1dC4KKwkgKiB3ZSBjcmVhdGUgaXQgaW4gcGxhY2Ugb2YgdGhlIG9sZCBvbmUuCisJICovCisJaWYgKHN0LnN0X3NpemUgIT0gMCkgeworCQlvdXRfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKwkJeHVubGluayhoYW5kbGUtPmFyX19uYW1lKTsKKwkJb3V0X2hhbmRsZS0+c3JjX2ZkID0geG9wZW4oaGFuZGxlLT5hcl9fbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyk7CisJCW91dF9oYW5kbGUtPmFjY2VwdCA9IGhhbmRsZS0+YWNjZXB0OworCX0gZWxzZSB7CisJCW91dF9oYW5kbGUgPSBoYW5kbGU7CisJfQorCisJaGFuZGxlLT5hcl9fb3V0ID0gb3V0X2hhbmRsZTsKKworCXh3cml0ZShvdXRfaGFuZGxlLT5zcmNfZmQsIEFSX01BR0lDICJcbiIsIEFSX01BR0lDX0xFTiArIDEpOworCW91dF9oYW5kbGUtPm9mZnNldCArPSBBUl9NQUdJQ19MRU4gKyAxOworCisJLyogc2tpcCB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlIGlmIHdlIGhhdmUgdG8gYXBwZW5kIHN0dWZmICovCisJaWYgKHN0LnN0X3NpemUgIT0gMCkgeworCQloYW5kbGUtPmZpbHRlciA9IGZpbHRlcl9yZXBsYWNlYWJsZTsKKwkJaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGNvcHlfZGF0YTsKKwkJdW5wYWNrX2FyX2FyY2hpdmUoaGFuZGxlKTsKKwl9CisKKwl3aGlsZSAod3JpdGVfYXJfaGVhZGVyKG91dF9oYW5kbGUpID09IDApCisJCWNvbnRpbnVlOworCisJLyogb3B0aW9uYWwsIHNpbmNlIHdlIGV4aXQgcmlnaHQgYWZ0ZXIgd2UgcmV0dXJuICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWNsb3NlKGhhbmRsZS0+c3JjX2ZkKTsKKwkJaWYgKG91dF9oYW5kbGUtPnNyY19mZCAhPSBoYW5kbGUtPnNyY19mZCkKKwkJCWNsb3NlKG91dF9oYW5kbGUtPnNyY19mZCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0FSX0NSRUFURSAqLworCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgaGVhZGVyX3ZlcmJvc2VfbGlzdF9hcihjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikKK3sKKwljb25zdCBjaGFyICptb2RlID0gYmJfbW9kZV9zdHJpbmcoZmlsZV9oZWFkZXItPm1vZGUpOworCWNoYXIgKm10aW1lOworCisJbXRpbWUgPSBjdGltZSgmZmlsZV9oZWFkZXItPm10aW1lKTsKKwltdGltZVsxNl0gPSAnICc7CisJbWVtbW92ZSgmbXRpbWVbMTddLCAmbXRpbWVbMjBdLCA0KTsKKwltdGltZVsyMV0gPSAnXDAnOworCXByaW50ZigiJXMgJXUvJXUlNyJPRkZfRk1UInUgJXMgJXNcbiIsICZtb2RlWzFdLAorCQkJKGludClmaWxlX2hlYWRlci0+dWlkLCAoaW50KWZpbGVfaGVhZGVyLT5naWQsCisJCQlmaWxlX2hlYWRlci0+c2l6ZSwKKwkJCSZtdGltZVs0XSwgZmlsZV9oZWFkZXItPm5hbWUKKwkpOworfQorCisjZGVmaW5lIEFSX09QVF9WRVJCT1NFICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEFSX09QVF9QUkVTRVJWRV9EQVRFICAgICgxIDw8IDEpCisvKiAiYXIgciIgaW1wbGllcyBjcmVhdGUsIGJ1dCB3YXJucyBhYm91dCBpdC4gYyBzdXBwcmVzc2VzIHdhcm5pbmcuCisgKiBiYm94IGFjY2VwdHMgYnV0IGlnbm9yZXMgaXQ6ICovCisjZGVmaW5lIEFSX09QVF9DUkVBVEUgICAgICAgICAgICgxIDw8IDIpCisKKyNkZWZpbmUgQVJfQ01EX1BSSU5UICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgRklSU1RfQ01EICAgICAgICAgICAgICAgQVJfQ01EX1BSSU5UCisjZGVmaW5lIEFSX0NNRF9MSVNUICAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIEFSX0NNRF9FWFRSQUNUICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIEFSX0NNRF9JTlNFUlQgICAgICAgICAgICgxIDw8IDYpCisKK2ludCBhcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlOworCXVuc2lnbmVkIG9wdCwgdDsKKworCWFyY2hpdmVfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKworCS8qIC0tOiBwcmVwZW5kICctJyB0byB0aGUgZmlyc3QgYXJndW1lbnQgaWYgcmVxdWlyZWQgKi8KKwkvKiAtMTogYXQgbGVhc3Qgb25lIHBhcmFtIGlzIHJlcWQgKi8KKwkvKiBvbmUgb2YgcCx0LHhbLHJdIGlzIHJlcXVpcmVkICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLS06LTE6cDp0OngiSUZfRkVBVFVSRV9BUl9DUkVBVEUoIjpyIik7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInZvYyIicHR4IklGX0ZFQVRVUkVfQVJfQ1JFQVRFKCJyIikpOworCWFyZ3YgKz0gb3B0aW5kOworCisJdCA9IG9wdCAvIEZJUlNUX0NNRDsKKwlpZiAodCAmICh0LTEpKSAvKiBtb3JlIHRoYW4gb25lIG9mIHAsdCx4WyxyXSBhcmUgc3BlY2lmaWVkICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWlmIChvcHQgJiBBUl9DTURfUFJJTlQpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX3N0ZG91dDsKKwl9CisJaWYgKG9wdCAmIEFSX0NNRF9MSVNUKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJfQorCWlmIChvcHQgJiBBUl9DTURfRVhUUkFDVCkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfYWxsOworCX0KKwlpZiAob3B0ICYgQVJfT1BUX1BSRVNFUlZFX0RBVEUpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfUkVTVE9SRV9EQVRFOworCX0KKwlpZiAob3B0ICYgQVJfT1BUX1ZFUkJPU0UpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPSBoZWFkZXJfdmVyYm9zZV9saXN0X2FyOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9DUkVBVEUKKwlhcmNoaXZlX2hhbmRsZS0+YXJfX25hbWUgPSAqYXJndjsKKyNlbmRpZgorCWFyY2hpdmVfaGFuZGxlLT5zcmNfZmQgPSB4b3BlbigqYXJndisrLAorCQkJKG9wdCAmIEFSX0NNRF9JTlNFUlQpCisJCQkJPyBPX1JEV1IgfCBPX0NSRUFUCisJCQkJOiBPX1JET05MWQorCSk7CisKKwlpZiAoKmFyZ3YpCisJCWFyY2hpdmVfaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisJd2hpbGUgKCphcmd2KSB7CisJCWxsaXN0X2FkZF90b19lbmQoJmFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsICphcmd2KyspOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0NSRUFURQorCWlmIChvcHQgJiBBUl9DTURfSU5TRVJUKQorCQlyZXR1cm4gd3JpdGVfYXJfYXJjaGl2ZShhcmNoaXZlX2hhbmRsZSk7CisjZW5kaWYKKworCXVucGFja19hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iYnVuemlwLmMgYi9hcmNoaXZhbC9iYnVuemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZWMwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2JidW56aXAuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29tbW9uIGNvZGUgZm9yIGd1bnppcC1saWtlIGFwcGxldHMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK2VudW0geworCU9QVF9TVERPVVQgICAgID0gMSA8PCAwLAorCU9QVF9GT1JDRSAgICAgID0gMSA8PCAxLAorCS8qIG9ubHkgc29tZSBkZWNvbXByZXNzb3JzOiAqLworCU9QVF9WRVJCT1NFICAgID0gMSA8PCAyLAorCU9QVF9ERUNPTVBSRVNTID0gMSA8PCAzLAorCU9QVF9URVNUICAgICAgID0gMSA8PCA0LAorfTsKKworc3RhdGljCitpbnQgb3Blbl90b19vcl93YXJuKGludCB0b19mZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisJaW50IGZkID0gb3BlbjNfb3Jfd2FybihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOworCWlmIChmZCA8IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCXhtb3ZlX2ZkKGZkLCB0b19mZCk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBhcHBlbmRfZXh0KGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQpCit7CisJcmV0dXJuIHhhc3ByaW50ZigiJXMuJXMiLCBmaWxlbmFtZSwgZXhwZWN0ZWRfZXh0KTsKK30KKworaW50IEZBU1RfRlVOQyBiYnVucGFjayhjaGFyICoqYXJndiwKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnVucGFja2VyKSh1bnBhY2tfaW5mb190ICppbmZvKSwKKwljaGFyKiBGQVNUX0ZVTkMgKCptYWtlX25ld19uYW1lKShjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0KSwKKwljb25zdCBjaGFyICpleHBlY3RlZF9leHQKKykKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHN0YXR1czsKKwljaGFyICpmaWxlbmFtZSwgKm5ld19uYW1lOworCXNtYWxsaW50IGV4aXRjb2RlID0gMDsKKwl1bnBhY2tfaW5mb190IGluZm87CisKKwlkbyB7CisJCS8qIE5COiBuZXdfbmFtZSBpcyAqbWF5YmUqIG1hbGxvYydlZCEgKi8KKwkJbmV3X25hbWUgPSBOVUxMOworCQlmaWxlbmFtZSA9ICphcmd2OyAvKiBjYW4gYmUgTlVMTCAtICdzdHJlYW1pbmcnIGJ1bnppcDIgKi8KKworCQlpZiAoZmlsZW5hbWUgJiYgTE9ORV9EQVNIKGZpbGVuYW1lKSkKKwkJCWZpbGVuYW1lID0gTlVMTDsKKworCQkvKiBPcGVuIHNyYyAqLworCQlpZiAoZmlsZW5hbWUpIHsKKwkJCWlmIChzdGF0KGZpbGVuYW1lLCAmc3RhdF9idWYpICE9IDApIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlbmFtZSk7CisgZXJyOgorCQkJCWV4aXRjb2RlID0gMTsKKwkJCQlnb3RvIGZyZWVfbmFtZTsKKwkJCX0KKwkJCWlmIChvcGVuX3RvX29yX3dhcm4oU1RESU5fRklMRU5PLCBmaWxlbmFtZSwgT19SRE9OTFksIDApKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogU3BlY2lhbCBjYXNlczogdGVzdCwgc3Rkb3V0ICovCisJCWlmIChvcHRpb25fbWFzazMyICYgKE9QVF9TVERPVVR8T1BUX1RFU1QpKSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9URVNUKQorCQkJCWlmIChvcGVuX3RvX29yX3dhcm4oU1RET1VUX0ZJTEVOTywgYmJfZGV2X251bGwsIE9fV1JPTkxZLCAwKSkKKwkJCQkJZ290byBlcnI7CisJCQlmaWxlbmFtZSA9IE5VTEw7CisJCX0KKworCQkvKiBPcGVuIGRzdCBpZiB3ZSBhcmUgZ29pbmcgdG8gdW5wYWNrIHRvIGZpbGUgKi8KKwkJaWYgKGZpbGVuYW1lKSB7CisJCQluZXdfbmFtZSA9IG1ha2VfbmV3X25hbWUoZmlsZW5hbWUsIGV4cGVjdGVkX2V4dCk7CisJCQlpZiAoIW5ld19uYW1lKSB7CisJCQkJYmJfZXJyb3JfbXNnKCIlczogdW5rbm93biBzdWZmaXggLSBpZ25vcmVkIiwgZmlsZW5hbWUpOworCQkJCWdvdG8gZXJyOworCQkJfQorCisJCQkvKiAtZjogb3ZlcndyaXRlIGV4aXN0aW5nIG91dHB1dCBmaWxlcyAqLworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfRk9SQ0UpIHsKKwkJCQl1bmxpbmsobmV3X25hbWUpOworCQkJfQorCisJCQkvKiBPX0VYQ0w6ICJyZWFsIiBidW56aXAyIGRvZXNuJ3Qgb3ZlcndyaXRlIGZpbGVzICovCisJCQkvKiBHTlUgZ3VuemlwIGRvZXMgbm90IGJhaWwgb3V0LCBidXQgZ29lcyB0byBuZXh0IGZpbGUgKi8KKwkJCWlmIChvcGVuX3RvX29yX3dhcm4oU1RET1VUX0ZJTEVOTywgbmV3X25hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwKKwkJCQkJc3RhdF9idWYuc3RfbW9kZSkpCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBzYW5lICovCisJCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSAmJiAob3B0aW9uX21hc2szMiAmIE9QVF9GT1JDRSkgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvbXByZXNzZWQgZGF0YSBub3QgcmVhZCBmcm9tIHRlcm1pbmFsLCAiCisJCQkJCSJ1c2UgLWYgdG8gZm9yY2UgaXQiKTsKKwkJfQorCisJCS8qIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsgKi8KKwkJaW5mby5tdGltZSA9IDA7IC8qIHNvIGZhciBpdCBoYXMgb25lIG1lbWJlciBvbmx5ICovCisJCXN0YXR1cyA9IHVucGFja2VyKCZpbmZvKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlleGl0Y29kZSA9IDE7CisJCXhjbG9zZShTVERPVVRfRklMRU5PKTsgLyogd2l0aCBlcnJvciBjaGVjayEgKi8KKworCQlpZiAoZmlsZW5hbWUpIHsKKwkJCWNoYXIgKmRlbCA9IG5ld19uYW1lOworCQkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQkJLyogVE9ETzogcmVzdG9yZSBvdGhlciB0aGluZ3M/ICovCisJCQkJaWYgKGluZm8ubXRpbWUpIHsKKwkJCQkJc3RydWN0IHRpbWV2YWwgdGltZXNbMl07CisKKwkJCQkJdGltZXNbMV0udHZfc2VjID0gdGltZXNbMF0udHZfc2VjID0gaW5mby5tdGltZTsKKwkJCQkJdGltZXNbMV0udHZfdXNlYyA9IHRpbWVzWzBdLnR2X3VzZWMgPSAwOworCQkJCQkvKiBOb3RlOiB3ZSBjbG9zZWQgaXQgZmlyc3QuCisJCQkJCSAqIE9uIHNvbWUgc3lzdGVtcyBjYWxsaW5nIHV0aW1lcworCQkJCQkgKiB0aGVuIGNsb3NpbmcgcmVzZXRzIHRoZSBtdGltZQorCQkJCQkgKiBiYWNrIHRvIGN1cnJlbnQgdGltZS4gKi8KKwkJCQkJdXRpbWVzKG5ld19uYW1lLCB0aW1lcyk7IC8qIGlnbm9yaW5nIGVycm9ycyAqLworCQkJCX0KKworCQkJCS8qIERlbGV0ZSBfY29tcHJlc3NlZF8gZmlsZSAqLworCQkJCWRlbCA9IGZpbGVuYW1lOworCQkJCS8qIHJlc3RvcmUgZXh0ZW5zaW9uICh1bmxlc3MgdGd6IC0+IHRhciBjYXNlKSAqLworCQkJCWlmIChuZXdfbmFtZSA9PSBmaWxlbmFtZSkKKwkJCQkJZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKV0gPSAnLic7CisJCQl9CisJCQl4dW5saW5rKGRlbCk7CisKKyNpZiAwIC8qIEN1cnJlbnRseSBidWdneSAtIHdyb25nIG5hbWU6ICJhLmd6OiAyNjElIC0gcmVwbGFjZWQgd2l0aCBhLmd6IiAqLworCQkJLyogRXh0cmVtZSBibG9hdCBmb3IgZ3VuemlwIGNvbXBhdCAqLworCQkJaWYgKEVOQUJMRV9ERVNLVE9QICYmIChvcHRpb25fbWFzazMyICYgT1BUX1ZFUkJPU0UpICYmIHN0YXR1cyA+PSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogJXUlJSAtIHJlcGxhY2VkIHdpdGggJXNcbiIsCisJCQkJCWZpbGVuYW1lLCAodW5zaWduZWQpKHN0YXRfYnVmLnN0X3NpemUqMTAwIC8gKHN0YXR1cysxKSksIG5ld19uYW1lKTsKKwkJCX0KKyNlbmRpZgorCisgZnJlZV9uYW1lOgorCQkJaWYgKG5ld19uYW1lICE9IGZpbGVuYW1lKQorCQkJCWZyZWUobmV3X25hbWUpOworCQl9CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisKKwlyZXR1cm4gZXhpdGNvZGU7Cit9CisKKyNpZiBFTkFCTEVfVU5DT01QUkVTUyB8fCBFTkFCTEVfQlVOWklQMiB8fCBFTkFCTEVfVU5MWk1BIHx8IEVOQUJMRV9VTlhaCitzdGF0aWMKK2NoYXIqIEZBU1RfRlVOQyBtYWtlX25ld19uYW1lX2dlbmVyaWMoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCkKK3sKKwljaGFyICpleHRlbnNpb24gPSBzdHJyY2hyKGZpbGVuYW1lLCAnLicpOworCWlmICghZXh0ZW5zaW9uIHx8IHN0cmNtcChleHRlbnNpb24gKyAxLCBleHBlY3RlZF9leHQpICE9IDApIHsKKwkJLyogTWltaWMgR05VIGd1bnppcCAtICJyZWFsIiBidW56aXAyIHRyaWVzIHRvICovCisJCS8qIHVucGFjayBmaWxlIGFueXdheSwgdG8gZmlsZS5vdXQgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCSpleHRlbnNpb24gPSAnXDAnOworCXJldHVybiBmaWxlbmFtZTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBVbmNvbXByZXNzIGFwcGxldCBmb3IgYnVzeWJveCAoYykgMjAwMiBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdW5jb21wcmVzc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHVuY29tcHJlc3NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIC5aIGZpbGVbc11cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglPdmVyd3JpdGUiCisKKyNpZiBFTkFCTEVfVU5DT01QUkVTUworc3RhdGljCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyB1bnBhY2tfdW5jb21wcmVzcyh1bnBhY2tfaW5mb190ICppbmZvIFVOVVNFRF9QQVJBTSkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHN0YXR1cyA9IC0xOworCisJaWYgKCh4cmVhZF9jaGFyKFNURElOX0ZJTEVOTykgIT0gMHgxZikgfHwgKHhyZWFkX2NoYXIoU1RESU5fRklMRU5PKSAhPSAweDlkKSkgeworCQliYl9lcnJvcl9tc2coImludmFsaWQgbWFnaWMiKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSB1bnBhY2tfWl9zdHJlYW0oU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KK2ludCB1bmNvbXByZXNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bmNvbXByZXNzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAiY2YiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXJldHVybiBiYnVucGFjayhhcmd2LCB1bnBhY2tfdW5jb21wcmVzcywgbWFrZV9uZXdfbmFtZV9nZW5lcmljLCAiWiIpOworfQorI2VuZGlmCisKKworLyoKKyAqIEd6aXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBCYXNlZCBvbiBHTlUgZ3ppcCB2MS4yLjQgQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseS4KKyAqCisgKiBPcmlnaW5hbGx5IGFkanVzdGVkIGZvciBidXN5Ym94IGJ5IFN2ZW4gUnVkb2xwaCA8c3IxQGluZi50dS1kcmVzZGVuLmRlPgorICogYmFzZWQgb24gZ3ppcCBzb3VyY2VzCisgKgorICogQWRqdXN0ZWQgZnVydGhlciBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+IHRvIHN1cHBvcnQgZmlsZXMgYXMKKyAqIHdlbGwgYXMgc3RkaW4vc3Rkb3V0LCBhbmQgdG8gZ2VuZXJhbGx5IGJlaGF2ZSBpdHNlbGYgd3J0IGNvbW1hbmQgbGluZQorICogaGFuZGxpbmcuCisgKgorICogR2VuZXJhbCBjbGVhbnVwIHRvIGJldHRlciBhZGhlcmUgdG8gdGhlIHN0eWxlIGd1aWRlIGFuZCBtYWtlIHVzZSBvZiBzdGFuZGFyZAorICogYnVzeWJveCBmdW5jdGlvbnMgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogZ3ppcCAoR05VIHppcCkgLS0gY29tcHJlc3MgZmlsZXMgd2l0aCB6aXAgYWxnb3JpdGhtIGFuZCAnY29tcHJlc3MnIGludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhlIHVuemlwIGNvZGUgd2FzIHdyaXR0ZW4gYW5kIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBNYXJrIEFkbGVyLgorICogUG9ydGlvbnMgb2YgdGhlIGx6dyBjb2RlIGFyZSBkZXJpdmVkIGZyb20gdGhlIHB1YmxpYyBkb21haW4gJ2NvbXByZXNzJworICogd3JpdHRlbiBieSBTcGVuY2VyIFRob21hcywgSm9lIE9yb3N0LCBKYW1lcyBXb29kcywgSmltIE1jS2llLCBTdGV2ZSBEYXZpZXMsCisgKiBLZW4gVHVya293c2tpLCBEYXZlIE1hY2sgYW5kIFBldGVyIEphbm5lc2VuLgorICoKKyAqIFNlZSB0aGUgbGljZW5zZV9tc2cgYmVsb3cgYW5kIHRoZSBmaWxlIENPUFlJTkcgZm9yIHRoZSBzb2Z0d2FyZSBsaWNlbnNlLgorICogU2VlIHRoZSBmaWxlIGFsZ29yaXRobS5kb2MgZm9yIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGFuZCBmaWxlIGZvcm1hdHMuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGd1bnppcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZnRdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBndW56aXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIEZJTEVzIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVGVzdCBmaWxlIGludGVncml0eSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZ3VuemlwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sYSAvdG1wL0J1c3lCb3gqXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAgNTU3MDA5IEFwciAxMSAxMDo1NSAvdG1wL0J1c3lCb3gtMC40My50YXIuZ3pcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGd1bnppcCAvdG1wL0J1c3lCb3gtMC40My50YXIuZ3pcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sYSAvdG1wL0J1c3lCb3gqXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAxNzYxMjgwIEFwciAxNCAxNzo0NyAvdG1wL0J1c3lCb3gtMC40My50YXJcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgemNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRSIKKy8vdXNhZ2U6I2RlZmluZSB6Y2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyB0byBzdGRvdXQiCisKKyNpZiBFTkFCTEVfR1VOWklQCitzdGF0aWMKK2NoYXIqIEZBU1RfRlVOQyBtYWtlX25ld19uYW1lX2d1bnppcChjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0IFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyICpleHRlbnNpb24gPSBzdHJyY2hyKGZpbGVuYW1lLCAnLicpOworCisJaWYgKCFleHRlbnNpb24pCisJCXJldHVybiBOVUxMOworCisJZXh0ZW5zaW9uKys7CisJaWYgKHN0cmNtcChleHRlbnNpb24sICJ0Z3oiICsgMSkgPT0gMAorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1oKKwkgfHwgKGV4dGVuc2lvblswXSA9PSAnWicgJiYgZXh0ZW5zaW9uWzFdID09ICdcMCcpCisjZW5kaWYKKwkpIHsKKwkJZXh0ZW5zaW9uWy0xXSA9ICdcMCc7CisJfSBlbHNlIGlmIChzdHJjbXAoZXh0ZW5zaW9uLCAidGd6IikgPT0gMCkgeworCQlmaWxlbmFtZSA9IHhzdHJkdXAoZmlsZW5hbWUpOworCQlleHRlbnNpb24gPSBzdHJyY2hyKGZpbGVuYW1lLCAnLicpOworCQlleHRlbnNpb25bMl0gPSAnYSc7CisJCWV4dGVuc2lvblszXSA9ICdyJzsKKwl9IGVsc2UgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZpbGVuYW1lOworfQorc3RhdGljCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyB1bnBhY2tfZ3VuemlwKHVucGFja19pbmZvX3QgKmluZm8pCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBzdGF0dXMgPSAtMTsKKworCS8qIGRvIHRoZSBkZWNvbXByZXNzaW9uLCBhbmQgY2xlYW51cCAqLworCWlmICh4cmVhZF9jaGFyKFNURElOX0ZJTEVOTykgPT0gMHgxZikgeworCQl1bnNpZ25lZCBjaGFyIG1hZ2ljMjsKKworCQltYWdpYzIgPSB4cmVhZF9jaGFyKFNURElOX0ZJTEVOTyk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19aICYmIG1hZ2ljMiA9PSAweDlkKSB7CisJCQlzdGF0dXMgPSB1bnBhY2tfWl9zdHJlYW0oU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwkJfSBlbHNlIGlmIChtYWdpYzIgPT0gMHg4YikgeworCQkJc3RhdHVzID0gdW5wYWNrX2d6X3N0cmVhbV93aXRoX2luZm8oU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PLCBpbmZvKTsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gYmFkX21hZ2ljOworCQl9CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQliYl9lcnJvcl9tc2coImVycm9yIGluZmxhdGluZyIpOworCQl9CisJfSBlbHNlIHsKKyBiYWRfbWFnaWM6CisJCWJiX2Vycm9yX21zZygiaW52YWxpZCBtYWdpYyIpOworCQkvKiBzdGF0dXMgaXMgc3RpbGwgPT0gLTEgKi8KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKy8qCisgKiBMaW51eCBrZXJuZWwgYnVpbGQgdXNlcyBnemlwIC1kIC1uLiBXZSBhY2NlcHQgYW5kIGlnbm9yZSBpdC4KKyAqIE1hbiBwYWdlIHNheXM6CisgKiAtbiAtLW5vLW5hbWUKKyAqIGd6aXA6IGRvIG5vdCBzYXZlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRpbWUgc3RhbXAuCisgKiAoVGhlIG9yaWdpbmFsIG5hbWUgaXMgYWx3YXlzIHNhdmVkIGlmIHRoZSBuYW1lIGhhZCB0byBiZSB0cnVuY2F0ZWQuKQorICogZ3VuemlwOiBkbyBub3QgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lL3RpbWUgZXZlbiBpZiBwcmVzZW50CisgKiAocmVtb3ZlIG9ubHkgdGhlIGd6aXAgc3VmZml4IGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSBuYW1lKS4KKyAqIFRoaXMgb3B0aW9uIGlzIHRoZSBkZWZhdWx0IHdoZW4gZGVjb21wcmVzc2luZy4KKyAqIC1OIC0tbmFtZQorICogZ3ppcDogYWx3YXlzIHNhdmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBhbmQgdGltZSBzdGFtcCAodGhpcyBpcyB0aGUgZGVmYXVsdCkKKyAqIGd1bnppcDogcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGFuZCB0aW1lIHN0YW1wIGlmIHByZXNlbnQuCisgKi8KK2ludCBndW56aXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGd1bnppcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZ2V0b3B0MzIoYXJndiwgImNmdmR0biIpOworCWFyZ3YgKz0gb3B0aW5kOworCS8qIGlmIGNhbGxlZCBhcyB6Y2F0ICovCisJaWYgKGFwcGxldF9uYW1lWzFdID09ICdjJykKKwkJb3B0aW9uX21hc2szMiB8PSBPUFRfU1RET1VUOworCisJcmV0dXJuIGJidW5wYWNrKGFyZ3YsIHVucGFja19ndW56aXAsIG1ha2VfbmV3X25hbWVfZ3VuemlwLCAvKnVudXNlZDoqLyBOVUxMKTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBNb2RpZmllZCBmb3IgYnVzeWJveCBieSBHbGVubiBNY0dyYXRoCisgKiBBZGRlZCBzdXBwb3J0IG91dHB1dCB0byBzdGRvdXQgYnkgVGhvbWFzIEx1bmRxdWlzdCA8dGhvbWFzZXpAemVsb3cubm8+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLy91c2FnZTojZGVmaW5lIGJ1bnppcDJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBidW56aXAyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFcyAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiNkZWZpbmUgYnpjYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEUiCisvL3VzYWdlOiNkZWZpbmUgYnpjYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIHRvIHN0ZG91dCIKKy8vYXBwbGV0OklGX0JVTlpJUDIoQVBQTEVUKGJ1bnppcDIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfQlVOWklQMihBUFBMRVRfT0RETkFNRShiemNhdCwgYnVuemlwMiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgYnpjYXQpKQorI2lmIEVOQUJMRV9CVU5aSVAyCitzdGF0aWMKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DIHVucGFja19idW56aXAyKHVucGFja19pbmZvX3QgKmluZm8gVU5VU0VEX1BBUkFNKQoreworCXJldHVybiB1bnBhY2tfYnoyX3N0cmVhbV9wcmltZShTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworfQoraW50IGJ1bnppcDJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJ1bnppcDJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJjZnZkdCIpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcHBsZXRfbmFtZVsyXSA9PSAnYycpIC8qIGJ6Y2F0ICovCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX1NURE9VVDsKKworCXJldHVybiBiYnVucGFjayhhcmd2LCB1bnBhY2tfYnVuemlwMiwgbWFrZV9uZXdfbmFtZV9nZW5lcmljLCAiYnoyIik7Cit9CisjZW5kaWYKKworCisvKgorICogU21hbGwgbHptYSBkZWZsYXRlIGltcGxlbWVudGF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogQmFzZWQgb24gYnVuemlwLmMgZnJvbSBidXN5Ym94CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdW5sem1hX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW5sem1hX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbHptYV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWQgWy1jZl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGx6bWFfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIEZJTEUgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsemNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRSIKKy8vdXNhZ2U6I2RlZmluZSBsemNhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgdG8gc3Rkb3V0IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1bnh6X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW54el9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgRklMRSAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHh6X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItZCBbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgeHpfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIEZJTEUgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB4emNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRSIKKy8vdXNhZ2U6I2RlZmluZSB4emNhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgdG8gc3Rkb3V0IgorCisjaWYgRU5BQkxFX1VOTFpNQQorc3RhdGljCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyB1bnBhY2tfdW5sem1hKHVucGFja19pbmZvX3QgKmluZm8gVU5VU0VEX1BBUkFNKQoreworCXJldHVybiB1bnBhY2tfbHptYV9zdHJlYW0oU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKK30KK2ludCB1bmx6bWFfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVubHptYV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSUZfTFpNQShpbnQgb3B0cyA9KSBnZXRvcHQzMihhcmd2LCAiY2Z2ZHQiKTsKKyMgaWYgRU5BQkxFX0xaTUEKKwkvKiBsem1hIHdpdGhvdXQgLWQgb3IgLXQ/ICovCisJaWYgKGFwcGxldF9uYW1lWzJdID09ICdtJyAmJiAhKG9wdHMgJiAoT1BUX0RFQ09NUFJFU1N8T1BUX1RFU1QpKSkKKwkJYmJfc2hvd191c2FnZSgpOworIyBlbmRpZgorCS8qIGx6Y2F0PyAqLworCWlmIChhcHBsZXRfbmFtZVsyXSA9PSAnYycpCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX1NURE9VVDsKKworCWFyZ3YgKz0gb3B0aW5kOworCXJldHVybiBiYnVucGFjayhhcmd2LCB1bnBhY2tfdW5sem1hLCBtYWtlX25ld19uYW1lX2dlbmVyaWMsICJsem1hIik7Cit9CisjZW5kaWYKKworCisjaWYgRU5BQkxFX1VOWFoKK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgdW5wYWNrX3VueHoodW5wYWNrX2luZm9fdCAqaW5mbyBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHsKKwkJdWludDMyX3QgdjE7CisJCXVpbnQxNl90IHYyOworCX0gbWFnaWM7CisJeHJlYWQoU1RESU5fRklMRU5PLCAmbWFnaWMsIDYpOworCWlmIChtYWdpYy52MSAhPSBYWl9NQUdJQzFhIHx8IG1hZ2ljLnYyICE9IFhaX01BR0lDMmEpIHsKKwkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG1hZ2ljIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHVucGFja194el9zdHJlYW0oU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKK30KK2ludCB1bnh6X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bnh6X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJRl9YWihpbnQgb3B0cyA9KSBnZXRvcHQzMihhcmd2LCAiY2Z2ZHQiKTsKKyMgaWYgRU5BQkxFX1haCisJLyogeHogd2l0aG91dCAtZCBvciAtdD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ1wwJyAmJiAhKG9wdHMgJiAoT1BUX0RFQ09NUFJFU1N8T1BUX1RFU1QpKSkKKwkJYmJfc2hvd191c2FnZSgpOworIyBlbmRpZgorCS8qIHh6Y2F0PyAqLworCWlmIChhcHBsZXRfbmFtZVsyXSA9PSAnYycpCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX1NURE9VVDsKKworCWFyZ3YgKz0gb3B0aW5kOworCXJldHVybiBiYnVucGFjayhhcmd2LCB1bnBhY2tfdW54eiwgbWFrZV9uZXdfbmFtZV9nZW5lcmljLCAieHoiKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvYmJ1bnppcF90ZXN0LnNoIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTMxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9iYnVuemlwX3Rlc3Quc2gKQEAgLTAsMCArMSw2MSBAQAorIyEvYmluL3NoCisjIFRlc3QgdGhhdCBjb25jYXRlbmF0ZWQgZ3ogZmlsZXMgYXJlIHVucGFja2luZyBjb3JyZWN0bHkuCisjIEl0IGFsc28gdGVzdHMgdGhhdCB1bnBhY2tpbmcgaW4gZ2VuZXJhbCBpcyB3b3JraW5nIHJpZ2h0LgorIyBTaW5jZSB6aXAgY29kZSBoYXMgbWFueSBjb3JuZXIgY2FzZXMsIHJ1biBpdCBmb3IgYSBmZXcgaG91cnMKKyMgdG8gZ2V0IGEgZGVjZW50IGNvdmVyYWdlICgyMDAwMDAgdGVzdHMgb3IgbW9yZSkuCisKK2d6aXA9Imd6aXAiCitndW56aXA9Ii4uL2J1c3lib3ggZ3VuemlwIgorIyBPciB0aGUgb3RoZXIgd2F5IGFyb3VuZDoKKyNnemlwPSIuLi9idXN5Ym94IGd6aXAiCisjZ3VuemlwPSJndW56aXAiCisKK2M9MAoraT0kUElECit3aGlsZSB0cnVlOyBkbworICAgIGM9JCgoYysxKSkKKworICAgICMgUkFORE9NIGlzIG5vdCB2ZXJ5IHJhbmRvbSBvbiBzb21lIHNoZWxscy4gU3BpY2UgaXQgdXAuCisgICAgIyAxMDAwMDMgaXMgcHJpbWUKKyAgICBsZW4xPSQoKCAoKChSQU5ET00qUkFORE9NKV5pKSAmIDB4N2ZmZmZmZikgJSAxMDAwMDMgKSkKKyAgICBpPSQoKGkgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykpCisgICAgbGVuMj0kKCggKCgoUkFORE9NKlJBTkRPTSleaSkgJiAweDdmZmZmZmYpICUgMTAwMDAzICkpCisKKyAgICAjIEp1c3QgdXNpbmcgdXJhbmRvbSB3aWxsIG1ha2UgZ3ppcCB1c2UgbWV0aG9kIDAgKHN0b3JlKSAtCisgICAgIyBub3QgZ29vZCBmb3IgdGVzdCBjb3ZlcmFnZSEKKyAgICBjYXQgL2Rldi91cmFuZG9tIHwgd2hpbGUgdHJ1ZTsgZG8gcmVhZCBqdW5rOyBlY2hvICJqdW5rICRjICRpICRqdW5rIjsgZG9uZSBcCisgICAgfCBkZCBicz0kbGVuMSBjb3VudD0xID56MSAyPi9kZXYvbnVsbAorICAgIGNhdCAvZGV2L3VyYW5kb20gfCB3aGlsZSB0cnVlOyBkbyByZWFkIGp1bms7IGVjaG8gImp1bmsgJGMgJGkgJGp1bmsiOyBkb25lIFwKKyAgICB8IGRkIGJzPSRsZW4yIGNvdW50PTEgPnoyIDI+L2Rldi9udWxsCisKKyAgICAkZ3ppcCA8ejEgPnp6Lmd6CisgICAgJGd6aXAgPHoyID4+enouZ3oKKyAgICAkZ3VuemlwIC1jIHp6Lmd6ID56OSB8fCB7CisJZWNobyAiRXhpdGNvZGUgJD8iCisJZXhpdAorICAgIH0KKyAgICBzdW09YGNhdCB6MSB6MiB8IG1kNXN1bWAKKyAgICBzdW05PWBtZDVzdW0gPHo5YAorICAgIHRlc3QgIiRzdW0iID09ICIkc3VtOSIgfHwgeworCWVjaG8gIm1kNXN1bXMgZG9uJ3QgbWF0Y2giCisJZXhpdAorICAgIH0KKyAgICBlY2hvICJUZXN0ICRjIG9rOiBsZW4xPSRsZW4xIGxlbjI9JGxlbjIgc3VtPSRzdW0iCisKKyAgICBzdW09YGNhdCB6MSB6MiB6MSB6MiB8IG1kNXN1bWAKKyAgICBybSB6MS5neiB6Mi5neiAyPi9kZXYvbnVsbAorICAgICRnemlwIHoxCisgICAgJGd6aXAgejIKKyAgICBjYXQgejEuZ3ogejIuZ3ogejEuZ3ogejIuZ3ogPnp6Lmd6CisgICAgJGd1bnppcCAtYyB6ei5neiA+ejkgfHwgeworCWVjaG8gIkV4aXRjb2RlICQ/ICgyKSIKKwlleGl0CisgICAgfQorICAgIHN1bTk9YG1kNXN1bSA8ejlgCisgICAgdGVzdCAiJHN1bSIgPT0gIiRzdW05IiB8fCB7CisJZWNobyAibWQ1c3VtcyBkb24ndCBtYXRjaCAoMSkiCisJZXhpdAorICAgIH0KKworICAgIGVjaG8gIlRlc3QgJGMgb2s6IGxlbjE9JGxlbjEgbGVuMj0kbGVuMiBzdW09JHN1bSAoMikiCitkb25lCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iYnVuemlwX3Rlc3QyLnNoIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0Mi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdlODNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0Mi5zaApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKyMgTGVhayB0ZXN0IGZvciBndW56aXAuIFdhdGNoIHRvcCBmb3IgZ3Jvd2luZyBwcm9jZXNzIHNpemUuCisKKyMgSnVzdCB1c2luZyB1cmFuZG9tIHdpbGwgbWFrZSBnemlwIHVzZSBtZXRob2QgMCAoc3RvcmUpIC0KKyMgbm90IGdvb2QgZm9yIHRlc3QgY292ZXJhZ2UhCisKK2NhdCAvZGV2L3VyYW5kb20gXAorfCB3aGlsZSB0cnVlOyBkbyByZWFkIGp1bms7IGVjaG8gImp1bmsgJFJBTkRPTSAkanVuayI7IGRvbmUgXAorfCAuLi9idXN5Ym94IGd6aXAgXAorfCAuLi9idXN5Ym94IGd1bnppcCAtYyA+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iYnVuemlwX3Rlc3QzLnNoIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0My5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGM0YWZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0My5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKyMgTGVhayB0ZXN0IGZvciBndW56aXAuIFdhdGNoIHRvcCBmb3IgZ3Jvd2luZyBwcm9jZXNzIHNpemUuCisjIEluIHRoaXMgY2FzZSB3ZSBsb29rIGZvciBsZWFrcyBpbiAiY29uY2F0ZW5hdGVkIC5neiIgY29kZSAtCisjIHdlIGZlZWQgZ3VuemlwIHdpdGggYSBzdHJlYW0gb2YgLmd6IGZpbGVzLgorCitpPSRQSUQKK2M9MAord2hpbGUgdHJ1ZTsgZG8KKyAgICBjPSQoKGMgKyAxKSkKKyAgICBlY2hvICJCbG9jayMgJGMiID4mMgorICAgICMgUkFORE9NIGlzIG5vdCB2ZXJ5IHJhbmRvbSBvbiBzb21lIHNoZWxscy4gU3BpY2UgaXQgdXAuCisgICAgaT0kKChpICogMTY2NDUyNSArIDEwMTM5MDQyMjMpKQorICAgICMgMTAwMDAzIGlzIHByaW1lCisgICAgbGVuPSQoKCAoKChSQU5ET00qUkFORE9NKV5pKSAmIDB4N2ZmZmZmZikgJSAxMDAwMDMgKSkKKworICAgICMgSnVzdCB1c2luZyB1cmFuZG9tIHdpbGwgbWFrZSBnemlwIHVzZSBtZXRob2QgMCAoc3RvcmUpIC0KKyAgICAjIG5vdCBnb29kIGZvciB0ZXN0IGNvdmVyYWdlIQorICAgIGNhdCAvZGV2L3VyYW5kb20gXAorICAgIHwgd2hpbGUgdHJ1ZTsgZG8gcmVhZCBqdW5rOyBlY2hvICJqdW5rICRjICRpICRqdW5rIjsgZG9uZSBcCisgICAgfCBkZCBicz0kbGVuIGNvdW50PTEgMj4vZGV2L251bGwgXAorICAgIHwgZ3ppcCA+eHh4Lmd6CisgICAgY2F0IHh4eC5neiB4eHguZ3ogeHh4Lmd6IHh4eC5neiB4eHguZ3ogeHh4Lmd6IHh4eC5neiB4eHguZ3oKK2RvbmUgfCAuLi9idXN5Ym94IGd1bnppcCAtYyA+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iemlwMi5jIGIvYXJjaGl2YWwvYnppcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzlkN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYnppcDIuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSB1c2VzIGJ6aXAyIGxpYnJhcnkgY29kZSB3aGljaCBpcyB3cml0dGVuCisgKiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gYnovIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogYWJvdXQgYnppcDIgbGlicmFyeSBjb2RlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBiemlwMl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBiemlwMl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbXByZXNzIEZJTEVzIChvciBzdGRpbikgd2l0aCBiemlwMiBhbGdvcml0aG1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLTEuLjkJQ29tcHJlc3Npb24gbGV2ZWwiCisvL3VzYWdlOiAgICAgIlxuCS1kCURlY29tcHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworI2RlZmluZSBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCAxCisKKy8qIFNwZWVkIHRlc3Q6CisgKiBDb21waWxlZCB3aXRoIGdjYyA0LjIuMSwgcnVuIG9uIEF0aGxvbiA2NCAxODAwIE1IeiAoNTEySyBMMiBjYWNoZSkuCisgKiBTdG9jayBiemlwMiBpcyAyNi40JSBzbG93ZXIgdGhhbiBiYm94IGJ6aXAyIGF0IFNQRUVEIDEKKyAqICh0aW1lIHRvIGNvbXByZXNzIGdjYy00LjIuMS50YXIgaXMgMTI2LjQlIGNvbXBhcmVkIHRvIGJib3gpLgorICogQXQgU1BFRUQgNSBkaWZmZXJlbmNlIGlzIDMyLjclLgorICoKKyAqIFRlc3QgcnVuIG9mIGFsbCBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCB2YWx1ZXMgb24gYSAxMU1iIHRleHQgZmlsZToKKyAqICAgICBTaXplICAgVGltZSAoMyBydW5zKQorICogMDogIDEwODI4ICA0LjE0NSA0LjE0NiA0LjE0OAorICogMTogIDExMDk3ICAzLjg0NSAzLjg2MCAzLjg2MQorICogMjogIDExMzkyICAzLjc2MyAzLjc2NyAzLjc2OAorICogMzogIDExODkyICAzLjcyMiAzLjcyNCAzLjcyNworICogNDogIDEyNzQwICAzLjYzNyAzLjY0MCAzLjY0NAorICogNTogIDE3MjczICAzLjQ5NyAzLjUwOSAzLjUwOQorICovCisKKworI2RlZmluZSBCWl9ERUJVRyAwCisvKiBUYWtlcyB+MzAwIGJ5dGVzLCBkZXRlY3RzIGNvcnJ1cHRpb24gY2F1c2VkIGJ5IGJhZCBSQU0gZXRjICovCisjZGVmaW5lIEJaX0xJR0hUX0RFQlVHIDAKKworI2luY2x1ZGUgImxpYmFyY2hpdmUvYnovYnpsaWIuaCIKKworI2luY2x1ZGUgImxpYmFyY2hpdmUvYnovYnpsaWJfcHJpdmF0ZS5oIgorCisjaW5jbHVkZSAibGliYXJjaGl2ZS9iei9ibG9ja3NvcnQuYyIKKyNpbmNsdWRlICJsaWJhcmNoaXZlL2J6L2J6bGliLmMiCisjaW5jbHVkZSAibGliYXJjaGl2ZS9iei9jb21wcmVzcy5jIgorI2luY2x1ZGUgImxpYmFyY2hpdmUvYnovaHVmZm1hbi5jIgorCisvKiBObyBwb2ludCBpbiBiZWluZyBzaHkgYW5kIGhhdmluZyB2ZXJ5IHNtYWxsIGJ1ZmZlciBoZXJlLgorICogYnppcDIgaW50ZXJuYWwgYnVmZmVycyBhcmUgbXVjaCBiaWdnZXIgYW55d2F5LCBodW5kcmVkcyBvZiBrYnl0ZXMuCisgKiBJZiBpb2J1ZiBpcyBzZXZlcmFsIHBhZ2VzIGxvbmcsIG1hbGxvYygpIG1heSB1c2UgbW1hcCwKKyAqIG1ha2luZyBpb2J1ZiBpcyBwYWdlIGFsaWduZWQgYW5kIHRodXMgKG1heWJlKSBoYXZlIG9uZSBtZW1jcHkgbGVzcworICogaWYga2VybmVsIGlzIGNsZXZlciBlbm91Z2guCisgKi8KK2VudW0geworCUlPQlVGX1NJWkUgPSA4ICogMTAyNAorfTsKKworc3RhdGljIHVpbnQ4X3QgbGV2ZWw7CisKKy8qIE5COiBjb21wcmVzc1N0cmVhbSgpIGhhcyB0byByZXR1cm4gLTEgb24gZXJyb3JzLCBub3QgZGllLgorICogYmJ1bnBhY2soKSB3aWxsIGNvcnJlY3RseSBjbGVhbiB1cCBpbiB0aGlzIGNhc2UKKyAqIChkZWxldGUgaW5jb21wbGV0ZSAuYnoyIGZpbGUpCisgKi8KKworLyogUmV0dXJuczoKKyAqIC0xIG9uIGVycm9ycworICogdG90YWwgd3JpdHRlbiBieXRlcyBzbyBmYXIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBiel93cml0ZShiel9zdHJlYW0gKnN0cm0sIHZvaWQqIHJidWYsIHNzaXplX3Qgcmxlbiwgdm9pZCAqd2J1ZikKK3sKKwlpbnQgbiwgbjIsIHJldDsKKworCXN0cm0tPmF2YWlsX2luID0gcmxlbjsKKwlzdHJtLT5uZXh0X2luID0gcmJ1ZjsKKwl3aGlsZSAoMSkgeworCQlzdHJtLT5hdmFpbF9vdXQgPSBJT0JVRl9TSVpFOworCQlzdHJtLT5uZXh0X291dCA9IHdidWY7CisKKwkJcmV0ID0gQloyX2J6Q29tcHJlc3Moc3RybSwgcmxlbiA/IEJaX1JVTiA6IEJaX0ZJTklTSCk7CisJCWlmIChyZXQgIT0gQlpfUlVOX09LIC8qIEJaX1JVTm5pbmcgKi8KKwkJICYmIHJldCAhPSBCWl9GSU5JU0hfT0sgLyogQlpfRklOSVNIaW5nLCBidXQgbm90IGRvbmUgeWV0ICovCisJCSAmJiByZXQgIT0gQlpfU1RSRUFNX0VORCAvKiBCWl9GSU5JU0hlZCAqLworCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciAlZCIsIHJldCk7CisJCX0KKworCQluID0gSU9CVUZfU0laRSAtIHN0cm0tPmF2YWlsX291dDsKKwkJaWYgKG4pIHsKKwkJCW4yID0gZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCB3YnVmLCBuKTsKKwkJCWlmIChuMiAhPSBuKSB7CisJCQkJaWYgKG4yID49IDApCisJCQkJCWVycm5vID0gMDsgLyogcHJldmVudCBib2d1cyBlcnJvciBtZXNzYWdlICovCisJCQkJYmJfcGVycm9yX21zZyhuMiA+PSAwID8gInNob3J0IHdyaXRlIiA6IGJiX21zZ193cml0ZV9lcnJvcik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisKKwkJaWYgKHJldCA9PSBCWl9TVFJFQU1fRU5EKQorCQkJYnJlYWs7CisJCWlmIChybGVuICYmIHN0cm0tPmF2YWlsX2luID09IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDAgSUZfREVTS1RPUCggKyBzdHJtLT50b3RhbF9vdXQgKTsKK30KKworc3RhdGljCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyBjb21wcmVzc1N0cmVhbSh1bnBhY2tfaW5mb190ICppbmZvIFVOVVNFRF9QQVJBTSkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHRvdGFsOworCXNzaXplX3QgY291bnQ7CisJYnpfc3RyZWFtIGJ6czsgLyogaXQncyBzbWFsbCAqLworI2RlZmluZSBzdHJtICgmYnpzKQorCWNoYXIgKmlvYnVmOworI2RlZmluZSByYnVmIGlvYnVmCisjZGVmaW5lIHdidWYgKGlvYnVmICsgSU9CVUZfU0laRSkKKworCWlvYnVmID0geG1hbGxvYygyICogSU9CVUZfU0laRSk7CisJQloyX2J6Q29tcHJlc3NJbml0KHN0cm0sIGxldmVsKTsKKworCXdoaWxlICgxKSB7CisJCWNvdW50ID0gZnVsbF9yZWFkKFNURElOX0ZJTEVOTywgcmJ1ZiwgSU9CVUZfU0laRSk7CisJCWlmIChjb3VudCA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJdG90YWwgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGlmIGNvdW50ID09IDAsIGJ6X3dyaXRlIGZpbmFsaXplcyBjb21wcmVzc2lvbiAqLworCQl0b3RhbCA9IGJ6X3dyaXRlKHN0cm0sIHJidWYsIGNvdW50LCB3YnVmKTsKKwkJaWYgKGNvdW50ID09IDAgfHwgdG90YWwgPCAwKQorCQkJYnJlYWs7CisJfQorCisJLyogQ2FuJ3QgYmUgY29uZGl0aW9uYWwgb24gRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgLQorCSAqIHdlIGFyZSBjYWxsZWQgcmVwZWF0ZWRseQorCSAqLworCUJaMl9iekNvbXByZXNzRW5kKHN0cm0pOworCWZyZWUoaW9idWYpOworCisJcmV0dXJuIHRvdGFsOworfQorCitpbnQgYnppcDJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJ6aXAyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisKKwkvKiBzdGFuZGFyZCBiemlwMiBmbGFncworCSAqIC1kIC0tZGVjb21wcmVzcyBmb3JjZSBkZWNvbXByZXNzaW9uCisJICogLXogLS1jb21wcmVzcyBmb3JjZSBjb21wcmVzc2lvbgorCSAqIC1rIC0ta2VlcCAgICAga2VlcCAoZG9uJ3QgZGVsZXRlKSBpbnB1dCBmaWxlcworCSAqIC1mIC0tZm9yY2UgICAgb3ZlcndyaXRlIGV4aXN0aW5nIG91dHB1dCBmaWxlcworCSAqIC10IC0tdGVzdCAgICAgdGVzdCBjb21wcmVzc2VkIGZpbGUgaW50ZWdyaXR5CisJICogLWMgLS1zdGRvdXQgICBvdXRwdXQgdG8gc3RhbmRhcmQgb3V0CisJICogLXEgLS1xdWlldCAgICBzdXBwcmVzcyBub25jcml0aWNhbCBlcnJvciBtZXNzYWdlcworCSAqIC12IC0tdmVyYm9zZSAgYmUgdmVyYm9zZSAoYSAybmQgLXYgZ2l2ZXMgbW9yZSkKKwkgKiAtcyAtLXNtYWxsICAgIHVzZSBsZXNzIG1lbW9yeSAoYXQgbW9zdCAyNTAwaykKKwkgKiAtMSAuLiAtOSAgICAgIHNldCBibG9jayBzaXplIHRvIDEwMGsgLi4gOTAwaworCSAqIC0tZmFzdCAgICAgICAgYWxpYXMgZm9yIC0xCisJICogLS1iZXN0ICAgICAgICBhbGlhcyBmb3IgLTkKKwkgKi8KKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInMyIjsgLyogLXMgbWVhbnMgLTIgKGNvbXBhdGliaWxpdHkpICovCisJLyogTXVzdCBtYXRjaCBiYnVuemlwJ3MgY29uc3RhbnRzIE9QVF9TVERPVVQsIE9QVF9GT1JDRSEgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2Z2IiBJRl9CVU5aSVAyKCJkdCIpICIxMjM0NTY3ODlxenMiKTsKKyNpZiBFTkFCTEVfQlVOWklQMiAvKiBidW56aXAyX21haW4gbWF5IG5vdCBiZSB2aXNpYmxlLi4uICovCisJaWYgKG9wdCAmIDB4MTgpIC8vIC1kIGFuZC9vciAtdAorCQlyZXR1cm4gYnVuemlwMl9tYWluKGFyZ2MsIGFyZ3YpOworCW9wdCA+Pj0gNTsKKyNlbHNlCisJb3B0ID4+PSAzOworI2VuZGlmCisJb3B0ID0gKHVpbnQ4X3Qpb3B0OyAvKiBpc29sYXRlIGJpdHMgZm9yIC0xLi4tOCAqLworCW9wdCB8PSAweDEwMDsgLyogaWYgbm90aGluZyBlbHNlLCBhc3N1bWUgLTkgKi8KKwlsZXZlbCA9IDE7CisJd2hpbGUgKCEob3B0ICYgMSkpIHsKKwkJbGV2ZWwrKzsKKwkJb3B0ID4+PSAxOworCX0KKworCWFyZ3YgKz0gb3B0aW5kOworCW9wdGlvbl9tYXNrMzIgJj0gMHg3OyAvKiBpZ25vcmUgYWxsIGV4Y2VwdCAtY2Z2ICovCisJcmV0dXJuIGJidW5wYWNrKGFyZ3YsIGNvbXByZXNzU3RyZWFtLCBhcHBlbmRfZXh0LCAiYnoyIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9jcGlvLmMgYi9hcmNoaXZhbC9jcGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NGEwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2NwaW8uYwpAQCAtMCwwICsxLDQ1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjcGlvIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIExpbWl0YXRpb25zOgorICogRG9lc24ndCBjaGVjayBDUkMncworICogT25seSBzdXBwb3J0cyBuZXcgQVNDSUkgYW5kIENSQyBmb3JtYXRzCisgKgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8vdXNhZ2U6I2RlZmluZSBjcGlvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRtdnVdIFstRiBGSUxFXSIgSUZfRkVBVFVSRV9DUElPX08oIiBbLUggbmV3Y10iKQorLy91c2FnZTogICAgICAgIiBbLXRpIklGX0ZFQVRVUkVfQ1BJT19PKCJvIikiXSIgSUZfRkVBVFVSRV9DUElPX1AoIiBbLXAgRElSXSIpCisvL3VzYWdlOiAgICAgICAiIFtFWFRSX0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGNwaW9fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFeHRyYWN0IG9yIGxpc3QgZmlsZXMgZnJvbSBhIGNwaW8gYXJjaGl2ZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQ1BJT19PKCIsIG9yIgorLy91c2FnZTogICAgICJcbmNyZWF0ZSBhbiBhcmNoaXZlIiBJRl9GRUFUVVJFX0NQSU9fUCgiICgtbykgb3IgY29weSBmaWxlcyAoLXApIikKKy8vdXNhZ2U6CQkiIHVzaW5nIGZpbGUgbGlzdCBvbiBzdGRpbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuTWFpbiBvcGVyYXRpb24gbW9kZToiCisvL3VzYWdlOiAgICAgIlxuCS10CUxpc3QiCisvL3VzYWdlOiAgICAgIlxuCS1pCUV4dHJhY3QgRVhUUl9GSUxFcyAob3IgYWxsKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQ1BJT19PKAorLy91c2FnZTogICAgICJcbgktbwlDcmVhdGUgKHJlcXVpcmVzIC1IIG5ld2MpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9DUElPX1AoCisvL3VzYWdlOiAgICAgIlxuCS1wIERJUglDb3B5IGZpbGVzIHRvIERJUiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWQJTWFrZSBsZWFkaW5nIGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbgktbQlQcmVzZXJ2ZSBtdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJT3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktRiBGSUxFCUlucHV0ICgtdCwtaSwtcCkgb3Igb3V0cHV0ICgtbykgZmlsZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQ1BJT19PKAorLy91c2FnZTogICAgICJcbgktSCBuZXdjCUFyY2hpdmUgZm9ybWF0IgorLy91c2FnZToJKQorCisvKiBHTlUgY3BpbyAyLjkgLS1oZWxwIChhYnJpZGdlZCk6CisKKyBNb2RlczoKKyAgLXQsIC0tbGlzdCAgICAgICAgICAgICAgICAgTGlzdCB0aGUgYXJjaGl2ZQorICAtaSwgLS1leHRyYWN0ICAgICAgICAgICAgICBFeHRyYWN0IGZpbGVzIGZyb20gYW4gYXJjaGl2ZQorICAtbywgLS1jcmVhdGUgICAgICAgICAgICAgICBDcmVhdGUgdGhlIGFyY2hpdmUKKyAgLXAsIC0tcGFzcy10aHJvdWdoICAgICAgICAgQ29weS1wYXNzIG1vZGUKKworIE9wdGlvbnMgdmFsaWQgaW4gYW55IG1vZGU6CisgICAgICAtLWJsb2NrLXNpemU9U0laRSAgICAgIEkvTyBibG9jayBzaXplID0gU0laRSAqIDUxMiBieXRlcworICAtQiAgICAgICAgICAgICAgICAgICAgICAgICBJL08gYmxvY2sgc2l6ZSA9IDUxMjAgYnl0ZXMKKyAgLWMgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBvbGQgcG9ydGFibGUgKEFTQ0lJKSBhcmNoaXZlIGZvcm1hdAorICAtQywgLS1pby1zaXplPU5VTUJFUiAgICAgICBJL08gYmxvY2sgc2l6ZSBpbiBieXRlcworICAtZiwgLS1ub25tYXRjaGluZyAgICAgICAgICBPbmx5IGNvcHkgZmlsZXMgdGhhdCBkbyBub3QgbWF0Y2ggZ2l2ZW4gcGF0dGVybgorICAtRiwgLS1maWxlPUZJTEUgICAgICAgICAgICBVc2UgRklMRSBpbnN0ZWFkIG9mIHN0YW5kYXJkIGlucHV0IG9yIG91dHB1dAorICAtSCwgLS1mb3JtYXQ9Rk9STUFUICAgICAgICBVc2UgZ2l2ZW4gYXJjaGl2ZSBGT1JNQVQKKyAgLU0sIC0tbWVzc2FnZT1TVFJJTkcgICAgICAgUHJpbnQgU1RSSU5HIHdoZW4gdGhlIGVuZCBvZiBhIHZvbHVtZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwIG1lZGlhIGlzIHJlYWNoZWQKKyAgLW4sIC0tbnVtZXJpYy11aWQtZ2lkICAgICAgSWYgLXYsIHNob3cgbnVtZXJpYyBVSUQgYW5kIEdJRAorICAgICAgLS1xdWlldCAgICAgICAgICAgICAgICBEbyBub3QgcHJpbnQgdGhlIG51bWJlciBvZiBibG9ja3MgY29waWVkCisgICAgICAtLXJzaC1jb21tYW5kPUNPTU1BTkQgIFVzZSByZW1vdGUgQ09NTUFORCBpbnN0ZWFkIG9mIHJzaAorICAtdiwgLS12ZXJib3NlICAgICAgICAgICAgICBWZXJib3NlbHkgbGlzdCB0aGUgZmlsZXMgcHJvY2Vzc2VkCisgIC1WLCAtLWRvdCAgICAgICAgICAgICAgICAgIFByaW50IGEgIi4iIGZvciBlYWNoIGZpbGUgcHJvY2Vzc2VkCisgIC1XLCAtLXdhcm5pbmc9RkxBRyAgICAgICAgIENvbnRyb2wgd2FybmluZyBkaXNwbGF5OiAnbm9uZScsJ3RydW5jYXRlJywnYWxsJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb3B0aW9ucyBhY2N1bXVsYXRlCisKKyBPcHRpb25zIHZhbGlkIG9ubHkgaW4gLS1leHRyYWN0IG1vZGU6CisgIC1iLCAtLXN3YXAgICAgICAgICAgICAgICAgIFN3YXAgYm90aCBoYWxmd29yZHMgb2Ygd29yZHMgYW5kIGJ5dGVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZ3b3JkcyBpbiB0aGUgZGF0YSAoZXF1aXZhbGVudCB0byAtc1MpCisgIC1yLCAtLXJlbmFtZSAgICAgICAgICAgICAgIEludGVyYWN0aXZlbHkgcmVuYW1lIGZpbGVzCisgIC1zLCAtLXN3YXAtYnl0ZXMgICAgICAgICAgIFN3YXAgdGhlIGJ5dGVzIG9mIGVhY2ggaGFsZndvcmQgaW4gdGhlIGZpbGVzCisgIC1TLCAtLXN3YXAtaGFsZndvcmRzICAgICAgIFN3YXAgdGhlIGhhbGZ3b3JkcyBvZiBlYWNoIHdvcmQgKDQgYnl0ZXMpCisgICAgICAtLXRvLXN0ZG91dCAgICAgICAgICAgIEV4dHJhY3QgZmlsZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisgIC1FLCAtLXBhdHRlcm4tZmlsZT1GSUxFICAgIFJlYWQgYWRkaXRpb25hbCBwYXR0ZXJucyBzcGVjaWZ5aW5nIGZpbGVuYW1lcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0IG9yIGxpc3QgZnJvbSBGSUxFCisgICAgICAtLW9ubHktdmVyaWZ5LWNyYyAgICAgIFZlcmlmeSBDUkMncywgZG9uJ3QgYWN0dWFsbHkgZXh0cmFjdCB0aGUgZmlsZXMKKworIE9wdGlvbnMgdmFsaWQgb25seSBpbiAtLWNyZWF0ZSBtb2RlOgorICAtQSwgLS1hcHBlbmQgICAgICAgICAgICAgICBBcHBlbmQgdG8gYW4gZXhpc3RpbmcgYXJjaGl2ZQorICAtTyBGSUxFICAgICAgICAgICAgICAgICAgICBGaWxlIHRvIHVzZSBpbnN0ZWFkIG9mIHN0YW5kYXJkIG91dHB1dAorCisgT3B0aW9ucyB2YWxpZCBvbmx5IGluIC0tcGFzcy10aHJvdWdoIG1vZGU6CisgIC1sLCAtLWxpbmsgICAgICAgICAgICAgICAgIExpbmsgZmlsZXMgaW5zdGVhZCBvZiBjb3B5aW5nIHRoZW0sIHdoZW4gcG9zc2libGUKKworIE9wdGlvbnMgdmFsaWQgaW4gLS1leHRyYWN0IGFuZCAtLWNyZWF0ZSBtb2RlczoKKyAgICAgIC0tYWJzb2x1dGUtZmlsZW5hbWVzICAgRG8gbm90IHN0cmlwIGZpbGUgc3lzdGVtIHByZWZpeCBjb21wb25lbnRzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgbmFtZXMKKyAgICAgIC0tbm8tYWJzb2x1dGUtZmlsZW5hbWVzIENyZWF0ZSBhbGwgZmlsZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyCisKKyBPcHRpb25zIHZhbGlkIGluIC0tY3JlYXRlIGFuZCAtLXBhc3MtdGhyb3VnaCBtb2RlczoKKyAgLTAsIC0tbnVsbCAgICAgICAgICAgICAgICAgQSBsaXN0IG9mIGZpbGVuYW1lcyBpcyB0ZXJtaW5hdGVkIGJ5IGEgTlVMCisgIC1hLCAtLXJlc2V0LWFjY2Vzcy10aW1lICAgIFJlc2V0IHRoZSBhY2Nlc3MgdGltZXMgb2YgZmlsZXMgYWZ0ZXIgcmVhZGluZyB0aGVtCisgIC1JIEZJTEUgICAgICAgICAgICAgICAgICAgIEZpbGUgdG8gdXNlIGluc3RlYWQgb2Ygc3RhbmRhcmQgaW5wdXQKKyAgLUwsIC0tZGVyZWZlcmVuY2UgICAgICAgICAgRGVyZWZlcmVuY2Ugc3ltYm9saWMgbGlua3MgKGNvcHkgdGhlIGZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhleSBwb2ludCB0byBpbnN0ZWFkIG9mIGNvcHlpbmcgdGhlIGxpbmtzKQorICAtUiwgLS1vd25lcj1bVVNFUl1bOi5dW0dST1VQXSBTZXQgb3duZXIgb2YgY3JlYXRlZCBmaWxlcworCisgT3B0aW9ucyB2YWxpZCBpbiAtLWV4dHJhY3QgYW5kIC0tcGFzcy10aHJvdWdoIG1vZGVzOgorICAtZCwgLS1tYWtlLWRpcmVjdG9yaWVzICAgICBDcmVhdGUgbGVhZGluZyBkaXJlY3RvcmllcyB3aGVyZSBuZWVkZWQKKyAgLW0sIC0tcHJlc2VydmUtbW9kaWZpY2F0aW9uLXRpbWUgIFJldGFpbiBtdGltZSB3aGVuIGNyZWF0aW5nIGZpbGVzCisgICAgICAtLW5vLXByZXNlcnZlLW93bmVyICAgIERvIG5vdCBjaGFuZ2UgdGhlIG93bmVyc2hpcCBvZiB0aGUgZmlsZXMKKyAgICAgIC0tc3BhcnNlICAgICAgICAgICAgICAgV3JpdGUgZmlsZXMgd2l0aCBibG9ja3Mgb2YgemVyb3MgYXMgc3BhcnNlIGZpbGVzCisgIC11LCAtLXVuY29uZGl0aW9uYWwgICAgICAgIFJlcGxhY2UgYWxsIGZpbGVzIHVuY29uZGl0aW9uYWxseQorICovCisKK2VudW0geworCU9QVF9FWFRSQUNUICAgICAgICAgICAgPSAoMSA8PCAwKSwKKwlPUFRfVEVTVCAgICAgICAgICAgICAgID0gKDEgPDwgMSksCisJT1BUX05VTF9URVJNSU5BVEVEICAgICA9ICgxIDw8IDIpLAorCU9QVF9VTkNPTkRJVElPTkFMICAgICAgPSAoMSA8PCAzKSwKKwlPUFRfVkVSQk9TRSAgICAgICAgICAgID0gKDEgPDwgNCksCisJT1BUX0NSRUFURV9MRUFESU5HX0RJUiA9ICgxIDw8IDUpLAorCU9QVF9QUkVTRVJWRV9NVElNRSAgICAgPSAoMSA8PCA2KSwKKwlPUFRfREVSRUYgICAgICAgICAgICAgID0gKDEgPDwgNyksCisJT1BUX0ZJTEUgICAgICAgICAgICAgICA9ICgxIDw8IDgpLAorCU9QVEJJVF9GSUxFID0gOCwKKwlJRl9GRUFUVVJFX0NQSU9fTyhPUFRCSVRfQ1JFQVRFICAgICAsKQorCUlGX0ZFQVRVUkVfQ1BJT19PKE9QVEJJVF9GT1JNQVQgICAgICwpCisJSUZfRkVBVFVSRV9DUElPX1AoT1BUQklUX1BBU1NUSFJPVUdILCkKKwlJRl9MT05HX09QVFMoICAgICBPUFRCSVRfUVVJRVQgICAgICAsKQorCUlGX0xPTkdfT1BUUyggICAgIE9QVEJJVF8yU1RET1VUICAgICwpCisJT1BUX0NSRUFURSAgICAgICAgICAgICA9IElGX0ZFQVRVUkVfQ1BJT19PKCgxIDw8IE9QVEJJVF9DUkVBVEUgICAgICkpICsgMCwKKwlPUFRfRk9STUFUICAgICAgICAgICAgID0gSUZfRkVBVFVSRV9DUElPX08oKDEgPDwgT1BUQklUX0ZPUk1BVCAgICAgKSkgKyAwLAorCU9QVF9QQVNTVEhST1VHSCAgICAgICAgPSBJRl9GRUFUVVJFX0NQSU9fUCgoMSA8PCBPUFRCSVRfUEFTU1RIUk9VR0gpKSArIDAsCisJT1BUX1FVSUVUICAgICAgICAgICAgICA9IElGX0xPTkdfT1BUUyggICAgICgxIDw8IE9QVEJJVF9RVUlFVCAgICAgICkpICsgMCwKKwlPUFRfMlNURE9VVCAgICAgICAgICAgID0gSUZfTE9OR19PUFRTKCAgICAgKDEgPDwgT1BUQklUXzJTVERPVVQgICAgKSkgKyAwLAorfTsKKworI2RlZmluZSBPUFRJT05fU1RSICJpdDB1dmRtTEY6IgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1BJT19PCitzdGF0aWMgb2ZmX3QgY3Bpb19wYWQ0KG9mZl90IHNpemUpCit7CisJaW50IGk7CisKKwlpID0gKC0gc2l6ZSkgJiAzOworCXNpemUgKz0gaTsKKwl3aGlsZSAoLS1pID49IDApCisJCWJiX3B1dGNoYXIoJ1wwJyk7CisJcmV0dXJuIHNpemU7Cit9CisKKy8qIFJldHVybiB2YWx1ZSB3aWxsIGJlY29tZSBleGl0IGNvZGUuCisgKiBJdCdzIG9rIHRvIGV4aXQgaW5zdGVhZCBvZiByZXR1cm4uICovCitzdGF0aWMgTk9JTkxJTkUgaW50IGNwaW9fbyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHRyYWlsZXJbXSBBTElHTjEgPSAiVFJBSUxFUiEhISI7CisJc3RydWN0IG5hbWVfcyB7CisJCXN0cnVjdCBuYW1lX3MgKm5leHQ7CisJCWNoYXIgbmFtZVsxXTsKKwl9OworCXN0cnVjdCBpbm9kZXNfcyB7CisJCXN0cnVjdCBpbm9kZXNfcyAqbmV4dDsKKwkJc3RydWN0IG5hbWVfcyAqbmFtZXM7CisJCXN0cnVjdCBzdGF0IHN0OworCX07CisKKwlzdHJ1Y3QgaW5vZGVzX3MgKmxpbmtzID0gTlVMTDsKKwlvZmZfdCBieXRlcyA9IDA7IC8qIG91dHB1dCBieXRlcyBjb3VudCAqLworCisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJY2hhciAqbGluZTsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJbGluZSA9IChvcHRpb25fbWFzazMyICYgT1BUX05VTF9URVJNSU5BVEVEKQorCQkJCT8gYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShzdGRpbiwgTlVMTCkKKwkJCQk6IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pOworCisJCWlmIChsaW5lKSB7CisJCQkvKiBTdHJpcCBsZWFkaW5nICIuL1suL10uLi4iIGZyb20gdGhlIGZpbGVuYW1lICovCisJCQluYW1lID0gbGluZTsKKwkJCXdoaWxlIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcvJykgeworCQkJCXdoaWxlICgqKytuYW1lID09ICcvJykKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoISpuYW1lKSB7IC8qIGxpbmUgaXMgZW1wdHkgKi8KKwkJCQlmcmVlKGxpbmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX0RFUkVGKQorCQkJCQk/IHN0YXQobmFtZSwgJnN0KQorCQkJCQk6IGxzdGF0KG5hbWUsICZzdCkKKwkJCSkgeworIGFib3J0X2NwaW9fbzoKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKG5hbWUpOworCQkJfQorCisJCQlpZiAoIShTX0lTTE5LKHN0LnN0X21vZGUpIHx8IFNfSVNSRUcoc3Quc3RfbW9kZSkpKQorCQkJCXN0LnN0X3NpemUgPSAwOyAvKiBwYXJhbm9pYSAqLworCisJCQkvKiBTdG9yZSBoYXJkbGlua3MgZm9yIGxhdGVyIHByb2Nlc3NpbmcsIGRvbnQgb3V0cHV0IHRoZW0gKi8KKwkJCWlmICghU19JU0RJUihzdC5zdF9tb2RlKSAmJiBzdC5zdF9ubGluayA+IDEpIHsKKwkJCQlzdHJ1Y3QgbmFtZV9zICpuOworCQkJCXN0cnVjdCBpbm9kZXNfcyAqbDsKKworCQkJCS8qIERvIHdlIGhhdmUgdGhpcyBoYXJkbGluayByZW1lbWJlcmVkPyAqLworCQkJCWwgPSBsaW5rczsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlpZiAobCA9PSBOVUxMKSB7CisJCQkJCQkvKiBOb3QgZm91bmQ6IGFkZCBuZXcgaXRlbSB0byAibGlua3MiIGxpc3QgKi8KKwkJCQkJCWwgPSB4emFsbG9jKHNpemVvZigqbCkpOworCQkJCQkJbC0+c3QgPSBzdDsKKwkJCQkJCWwtPm5leHQgPSBsaW5rczsKKwkJCQkJCWxpbmtzID0gbDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChsLT5zdC5zdF9pbm8gPT0gc3Quc3RfaW5vKSB7CisJCQkJCQkvKiBmb3VuZCAqLworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbCA9IGwtPm5leHQ7CisJCQkJfQorCQkJCS8qIEFkZCBuZXcgbmFtZSB0byAibC0+bmFtZXMiIGxpc3QgKi8KKwkJCQluID0geG1hbGxvYyhzaXplb2YoKm4pICsgc3RybGVuKG5hbWUpKTsKKwkJCQlzdHJjcHkobi0+bmFtZSwgbmFtZSk7CisJCQkJbi0+bmV4dCA9IGwtPm5hbWVzOworCQkJCWwtPm5hbWVzID0gbjsKKworCQkJCWZyZWUobGluZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJfSBlbHNlIHsgLyogbGluZSA9PSBOVUxMOiBFT0YgKi8KKyBuZXh0X2xpbms6CisJCQlpZiAobGlua3MpIHsKKwkJCQkvKiBPdXRwdXQgaGFyZGxpbmsncyBkYXRhICovCisJCQkJc3QgPSBsaW5rcy0+c3Q7CisJCQkJbmFtZSA9IGxpbmtzLT5uYW1lcy0+bmFtZTsKKwkJCQlsaW5rcy0+bmFtZXMgPSBsaW5rcy0+bmFtZXMtPm5leHQ7CisJCQkJLyogR05VIGNwaW8gaXMgcmVwb3J0ZWQgdG8gZW1pdCBmaWxlIGRhdGEKKwkJCQkgKiBvbmx5IGZvciB0aGUgbGFzdCBpbnN0YW5jZS4gTWltaWMgdGhhdC4gKi8KKwkJCQlpZiAobGlua3MtPm5hbWVzID09IE5VTEwpCisJCQkJCWxpbmtzID0gbGlua3MtPm5leHQ7CisJCQkJZWxzZQorCQkJCQlzdC5zdF9zaXplID0gMDsKKwkJCQkvKiBOQjogd2UgbGVhayBsaW5rcy0+bmFtZXMgYW5kL29yIGxpbmtzLAorCQkJCSAqIHRoaXMgaXMgaW50ZW5kZWQgKHdlIGV4aXQgc29vbiBhbnl3YXkpICovCisJCQl9IGVsc2UgeworCQkJCS8qIElmIG5vIChtb3JlKSBoYXJkbGlua3MgdG8gb3V0cHV0LAorCQkJCSAqIG91dHB1dCAidHJhaWxlciIgZW50cnkgKi8KKwkJCQluYW1lID0gdHJhaWxlcjsKKwkJCQkvKiBzdC5zdF9zaXplID09IDAgaXMgYSBtdXN0LCBidXQgZm9yIHVuaWZvcm1pdHkKKwkJCQkgKiBpbiB0aGUgb3V0cHV0LCB3ZSB6ZXJvIG91dCBldmVyeXRoaW5nICovCisJCQkJbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CisJCQkJLyogc3Quc3RfbmxpbmsgPSAxOyAtIEdOVSBjcGlvIGRvZXMgdGhpcyAqLworCQkJfQorCQl9CisKKwkJYnl0ZXMgKz0gcHJpbnRmKCIwNzA3MDEiCisJCSAgICAgICAgICAgICAgICAiJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCIKKwkJICAgICAgICAgICAgICAgICIlMDhYJTA4WCUwOFglMDhYIiAvKiBHTlUgY3BpbyB1c2VzIHVwcGVyY2FzZSBoZXggKi8KKwkJCQkvKiBzdHJsZW4rMTogKi8gIiUwOFgiCisJCQkJLyogY2hrc3VtOiAqLyAgICIwMDAwMDAwMCIgLyogKG9ubHkgZm9yICIwNzA3MDIiIGZpbGVzKSAqLworCQkJCS8qIG5hbWUsTlVMOiAqLyAiJXMlYyIsCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHVpbnQzMl90KSBzdC5zdF9pbm8sCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHVpbnQzMl90KSBzdC5zdF9tb2RlLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfdWlkLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfZ2lkLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfbmxpbmssCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHVpbnQzMl90KSBzdC5zdF9tdGltZSwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X3NpemUsCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHVpbnQzMl90KSBtYWpvcihzdC5zdF9kZXYpLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgbWlub3Ioc3Quc3RfZGV2KSwKKwkJICAgICAgICAgICAgICAgICh1bnNpZ25lZCkodWludDMyX3QpIG1ham9yKHN0LnN0X3JkZXYpLAorCQkgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSh1aW50MzJfdCkgbWlub3Ioc3Quc3RfcmRldiksCisJCSAgICAgICAgICAgICAgICAodW5zaWduZWQpKHN0cmxlbihuYW1lKSArIDEpLAorCQkgICAgICAgICAgICAgICAgbmFtZSwgJ1wwJyk7CisJCWJ5dGVzID0gY3Bpb19wYWQ0KGJ5dGVzKTsKKworCQlpZiAoc3Quc3Rfc2l6ZSkgeworCQkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCQljaGFyICpscGF0aCA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2FybihuYW1lKTsKKwkJCQlpZiAoIWxwYXRoKQorCQkJCQlnb3RvIGFib3J0X2NwaW9fbzsKKwkJCQlieXRlcyArPSBwcmludGYoIiVzIiwgbHBhdGgpOworCQkJCWZyZWUobHBhdGgpOworCQkJfSBlbHNlIHsgLyogU19JU1JFRyAqLworCQkJCWludCBmZCA9IHhvcGVuKG5hbWUsIE9fUkRPTkxZKTsKKwkJCQlmZmx1c2hfYWxsKCk7CisJCQkJLyogV2UgbXVzdCBhYm9ydCBpZiBmaWxlIGdvdCBzaG9ydGVyIHRvbyEgKi8KKwkJCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShmZCwgU1RET1VUX0ZJTEVOTywgc3Quc3Rfc2l6ZSk7CisJCQkJYnl0ZXMgKz0gc3Quc3Rfc2l6ZTsKKwkJCQljbG9zZShmZCk7CisJCQl9CisJCQlieXRlcyA9IGNwaW9fcGFkNChieXRlcyk7CisJCX0KKworCQlpZiAoIWxpbmUpIHsKKwkJCWlmIChuYW1lICE9IHRyYWlsZXIpCisJCQkJZ290byBuZXh0X2xpbms7CisJCQkvKiBUT0RPOiBHTlUgY3BpbyBwYWRzIHRyYWlsZXIgdG8gNTEyIGJ5dGVzLCBkbyB3ZSB3YW50IHRoYXQ/ICovCisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisKKwkJZnJlZShsaW5lKTsKKwl9IC8qIGVuZCBvZiAid2hpbGUgKDEpIiAqLworfQorI2VuZGlmCisKK2ludCBjcGlvX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjcGlvX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZTsKKwljaGFyICpjcGlvX2ZpbGVuYW1lOworCUlGX0ZFQVRVUkVfQ1BJT19PKGNvbnN0IGNoYXIgKmNwaW9fZm10ID0gIiI7KQorCXVuc2lnbmVkIG9wdDsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0KKwkJImV4dHJhY3RcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiaSIKKwkJImxpc3RcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUElPX08KKwkJImNyZWF0ZVwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAibyIKKwkJImZvcm1hdFwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiSCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUElPX1AKKwkJInBhc3MtdGhyb3VnaFwwIiBOb19hcmd1bWVudCAgICAgICAicCIKKyNlbmRpZgorI2VuZGlmCisJCSJ2ZXJib3NlXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJCSJxdWlldFwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiCisJCSJ0by1zdGRvdXRcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmUiCisJCTsKKyNlbmRpZgorCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCS8qIGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQgPSBTVERJTl9GSUxFTk87IC0gZG9uZSBieSBpbml0X2hhbmRsZSAqLworCWFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyA9IEFSQ0hJVkVfRVhUUkFDVF9ORVdFUjsKKworCS8qIEFzIG9mIG5vdyB3ZSBkbyBub3QgZW5mb3JjZSB0aGlzOiAqLworCS8qIC1pLC10LC1vLC1wIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwkvKiAtdSwtZCwtbSBtYWtlIHNlbnNlIG9ubHkgd2l0aCAtaSBvciAtcCAqLworCS8qIC1MIG1ha2VzIHNlbnNlIG9ubHkgd2l0aCAtbyBvciAtcCAqLworCisjaWYgIUVOQUJMRV9GRUFUVVJFX0NQSU9fTworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsICZjcGlvX2ZpbGVuYW1lKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgT1BUX0ZJTEUpIHsgLyogLUYgKi8KKwkJeG1vdmVfZmQoeG9wZW4oY3Bpb19maWxlbmFtZSwgT19SRE9OTFkpLCBTVERJTl9GSUxFTk8pOworCX0KKyNlbHNlCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiAib0g6IiBJRl9GRUFUVVJFX0NQSU9fUCgicCIpLCAmY3Bpb19maWxlbmFtZSwgJmNwaW9fZm10KTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoKG9wdCAmIChPUFRfRklMRXxPUFRfQ1JFQVRFKSkgPT0gT1BUX0ZJTEUpIHsgLyogLUYgd2l0aG91dCAtbyAqLworCQl4bW92ZV9mZCh4b3BlbihjcGlvX2ZpbGVuYW1lLCBPX1JET05MWSksIFNURElOX0ZJTEVOTyk7CisJfQorCWlmIChvcHQgJiBPUFRfUEFTU1RIUk9VR0gpIHsKKwkJcGlkX3QgcGlkOworCQlzdHJ1Y3QgZmRfcGFpciBwcDsKKworCQlpZiAoYXJndlswXSA9PSBOVUxMKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAob3B0ICYgT1BUX0NSRUFURV9MRUFESU5HX0RJUikKKwkJCW1rZGlyKGFyZ3ZbMF0sIDA3NzcpOworCQkvKiBDcnVkZSBleGlzdGVuY2UgY2hlY2s6CisJCSAqIGNsb3NlKHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpKTsKKwkJICogV2UgY2FuIGFsc28geG9wZW4sIGZzdGF0LCBJU19ESVIsIGxhdGVyIGZjaGRpci4KKwkJICogVGhpcyB3b3VsZCBjaGVjayBmb3IgZXhpc3RlbmNlIGVhcmxpZXIgYW5kIGNsZWFuZXIuCisJCSAqIEFzIGl0IHN0YW5kcyBub3csIGlmIHdlIGZhaWwgeGNoZGlyIGxhdGVyLAorCQkgKiBjaGlsZCBkaWVzIG9uIEVQSVBFLCB1bmxlc3MgaXQgY2F1Z2h0CisJCSAqIGEgZGlmZnJlcmVudCBwcm9ibGVtIGVhcmxpZXIuCisJCSAqIFRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yIG5vdy4KKwkJICovCisjaWYgIUJCX01NVQorCQlwcC5yZCA9IDM7CisJCXBwLndyID0gNDsKKwkJaWYgKCFyZV9leGVjZWQpIHsKKwkJCWNsb3NlKDMpOworCQkJY2xvc2UoNCk7CisJCQl4cGlwZWRfcGFpcihwcCk7CisJCX0KKyNlbHNlCisJCXhwaXBlZF9wYWlyKHBwKTsKKyNlbmRpZgorCQlwaWQgPSBmb3JrX29yX3JleGVjKGFyZ3YgLSBvcHRpbmQpOworCQlpZiAocGlkID09IDApIHsgLyogY2hpbGQgKi8KKwkJCWNsb3NlKHBwLnJkKTsKKwkJCXhtb3ZlX2ZkKHBwLndyLCBTVERPVVRfRklMRU5PKTsKKwkJCWdvdG8gZHVtcDsKKwkJfQorCQkvKiBwYXJlbnQgKi8KKwkJeGNoZGlyKCphcmd2KyspOworCQljbG9zZShwcC53cik7CisJCXhtb3ZlX2ZkKHBwLnJkLCBTVERJTl9GSUxFTk8pOworCQkvL29wdCAmPSB+T1BUX1BBU1NUSFJPVUdIOworCQlvcHQgfD0gT1BUX0VYVFJBQ1Q7CisJCWdvdG8gc2tpcDsKKwl9CisJLyogLW8gKi8KKwlpZiAob3B0ICYgT1BUX0NSRUFURSkgeworCQlpZiAoY3Bpb19mbXRbMF0gIT0gJ24nKSAvKiB3ZSBfcmVxdWlyZV8gIi1IIG5ld2MiICovCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChvcHQgJiBPUFRfRklMRSkgeworCQkJeG1vdmVfZmQoeG9wZW4oY3Bpb19maWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyksIFNURE9VVF9GSUxFTk8pOworCQl9CisgZHVtcDoKKwkJcmV0dXJuIGNwaW9fbygpOworCX0KKyBza2lwOgorI2VuZGlmCisKKwkvKiBPbmUgb2YgZWl0aGVyIGV4dHJhY3Qgb3IgdGVzdCBvcHRpb25zIG11c3QgYmUgZ2l2ZW4gKi8KKwlpZiAoKG9wdCAmIChPUFRfVEVTVCB8IE9QVF9FWFRSQUNUKSkgPT0gMCkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9URVNUKSB7CisJCS8qIGlmIGJvdGggZXh0cmFjdCBhbmQgdGVzdCBvcHRpb25zIGFyZSBnaXZlbiwgaWdub3JlIGV4dHJhY3Qgb3B0aW9uICovCisJCW9wdCAmPSB+T1BUX0VYVFJBQ1Q7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJfQorCWlmIChvcHQgJiBPUFRfRVhUUkFDVCkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfYWxsOworCQlpZiAob3B0ICYgT1BUXzJTVERPVVQpCisJCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfdG9fc3Rkb3V0OworCX0KKwlpZiAob3B0ICYgT1BUX1VOQ09ORElUSU9OQUwpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfVU5MSU5LX09MRDsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX0VYVFJBQ1RfTkVXRVI7CisJfQorCWlmIChvcHQgJiBPUFRfVkVSQk9TRSkgeworCQlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPT0gaGVhZGVyX2xpc3QpIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX3ZlcmJvc2VfbGlzdDsKKwkJfSBlbHNlIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJCX0KKwl9CisJaWYgKG9wdCAmIE9QVF9DUkVBVEVfTEVBRElOR19ESVIpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUzsKKwl9CisJaWYgKG9wdCAmIE9QVF9QUkVTRVJWRV9NVElNRSkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9SRVNUT1JFX0RBVEU7CisJfQorCisJd2hpbGUgKCphcmd2KSB7CisJCWFyY2hpdmVfaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisJCWxsaXN0X2FkZF90bygmYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgKmFyZ3YpOworCQlhcmd2Kys7CisJfQorCisJLyogc2VlIGdldF9oZWFkZXJfY3BpbyAqLworCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19ibG9ja3MgPSAob2ZmX3QpLTE7CisJd2hpbGUgKGdldF9oZWFkZXJfY3BpbyhhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKKworCWlmIChhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fYmxvY2tzICE9IChvZmZfdCktMQorCSAmJiAhKG9wdCAmIE9QVF9RVUlFVCkKKwkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlIk9GRl9GTVQidSBibG9ja3NcbiIsIGFyY2hpdmVfaGFuZGxlLT5jcGlvX19ibG9ja3MpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9kcGtnLmMgYi9hcmNoaXZhbC9kcGtnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2YTdiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2Rwa2cuYwpAQCAtMCwwICsxLDE5MjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBtaW5pIGRwa2cgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3guCisgKiAgdGhpcyBpcyBub3QgbWVhbnQgYXMgYSByZXBsYWNlbWVudCBmb3IgZHBrZworICoKKyAqICB3cml0dGVuIGJ5IGdsZW5uIG1jZ3JhdGggd2l0aCB0aGUgaGVscCBvZiBvdGhlcnMKKyAqICBjb3B5cmlnaHQgKGMpIDIwMDEgYnkgZ2xlbm4gbWNncmF0aAorICoKKyAqICBwYXJ0cyBvZiB0aGUgdmVyc2lvbiBjb21wYXJpc29uIGNvZGUgaXMgcGx1Y2tlZCBmcm9tIHRoZSByZWFsIGRwa2cKKyAqICBhcHBsaWNhdGlvbiB3aGljaCBpcyBsaWNlbnNlZCBHUEx2MiBhbmQKKyAqICBjb3B5cmlnaHQgKGMpIDE5OTUgSWFuIEphY2tzb24gPGlhbkBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICoKKyAqICBzdGFydGVkIGxpZmUgYXMgYSBidXN5Ym94IGltcGxlbWVudGF0aW9uIG9mIHVkcGtnCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICoga25vd24gZGlmZmVyZW5jZSBiZXR3ZWVuIGJ1c3lib3ggZHBrZyBhbmQgdGhlIG9mZmljaWFsIGRwa2cgdGhhdCBpIGRvbid0CisgKiBjb25zaWRlciBpbXBvcnRhbnQsIGl0cyB3b3J0aCBrZWVwaW5nIGEgbm90ZSBvZiBkaWZmZXJlbmNlcyBhbnl3YXksIGp1c3QgdG8KKyAqIG1ha2UgaXQgZWFzaWVyIHRvIG1haW50YWluLgorICogIC0gdGhlIGZpcnN0IHZhbHVlIGZvciB0aGUgY29uZmZsaWxlOiBmaWVsZCBpc250IHBsYWNlZCBvbiBhIG5ldyBsaW5lLgorICogIC0gd2hlbiBpbnN0YWxsaW5nIGEgcGFja2FnZSB0aGUgc3RhdHVzOiBmaWVsZCBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAqICAgICAgc2VjdGlvbiwgcmF0aGVyIHRoYW4ganVzdCBhZnRlciB0aGUgcGFja2FnZTogZmllbGQuCisgKgorICogYnVncyB0aGF0IG5lZWQgdG8gYmUgZml4ZWQKKyAqICAtICh1bmtub3duLCBwbGVhc2UgbGV0IG1lIGtub3cgd2hlbiB5b3UgZmluZCBhbnkpCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkcGtnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWlsQ1BydV0gWy1GIE9QVF0gUEFDS0FHRSIKKy8vdXNhZ2U6I2RlZmluZSBkcGtnX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSW5zdGFsbCwgcmVtb3ZlIGFuZCBtYW5hZ2UgRGViaWFuIHBhY2thZ2VzXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1pLC0taW5zdGFsbAlJbnN0YWxsIHRoZSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktbCwtLWxpc3QJTGlzdCBvZiBpbnN0YWxsZWQgcGFja2FnZXMiCisvL3VzYWdlOiAgICAgIlxuCS0tY29uZmlndXJlCUNvbmZpZ3VyZSBhbiB1bnBhY2thZ2VkIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcHVyZ2UJUHVyZ2UgYWxsIGZpbGVzIG9mIGEgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yZW1vdmUJUmVtb3ZlIGFsbCBidXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGEgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLS11bnBhY2sJVW5wYWNrIGEgcGFja2FnZSwgYnV0IGRvbid0IGNvbmZpZ3VyZSBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLS1mb3JjZS1kZXBlbmRzCUlnbm9yZSBkZXBlbmRlbmN5IHByb2JsZW1zIgorLy91c2FnZTogICAgICJcbgktLWZvcmNlLWNvbmZuZXcJT3ZlcndyaXRlIGV4aXN0aW5nIGNvbmZpZyBmaWxlcyB3aGVuIGluc3RhbGxpbmciCisvL3VzYWdlOiAgICAgIlxuCS0tZm9yY2UtY29uZm9sZAlLZWVwIG9sZCBjb25maWcgZmlsZXMgd2hlbiBpbnN0YWxsaW5nIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCUluc3RhbGwgdGhlIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1sCQlMaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJCUNvbmZpZ3VyZSBhbiB1bnBhY2thZ2VkIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1QCQlQdXJnZSBhbGwgZmlsZXMgb2YgYSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktcgkJUmVtb3ZlIGFsbCBidXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGEgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJCVVucGFjayBhIHBhY2thZ2UsIGJ1dCBkb24ndCBjb25maWd1cmUgaXQiCisvL3VzYWdlOiAgICAgIlxuCS1GIGRlcGVuZHMJSWdub3JlIGRlcGVuZGVuY3kgcHJvYmxlbXMiCisvL3VzYWdlOiAgICAgIlxuCS1GIGNvbmZuZXcJT3ZlcndyaXRlIGV4aXN0aW5nIGNvbmZpZyBmaWxlcyB3aGVuIGluc3RhbGxpbmciCisvL3VzYWdlOiAgICAgIlxuCS1GIGNvbmZvbGQJS2VlcCBvbGQgY29uZmlnIGZpbGVzIHdoZW4gaW5zdGFsbGluZyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyogbm90ZTogaWYgeW91IHZhcnkgaGFzaF9wcmltZSBzaXplcyBiZSBhd2FyZSwKKyAqIDEpIHR3ZWFraW5nIHRoZXNlIHdpbGwgaGF2ZSBhIGJpZyBlZmZlY3Qgb24gaG93IG11Y2ggbWVtb3J5IHRoaXMgcHJvZ3JhbSB1c2VzLgorICogMikgZm9yIGNvbXB1dGF0aW9uYWwgZWZmaWNpZW5jeSB0aGVzZSBoYXNoIHRhYmxlcyBzaG91bGQgYmUgYXQgbGVhc3QgMjAlCisgKiAgICBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIGluIGl0LgorICogMykgYWxsIF9oYXNoX3ByaW1lJ3MgbXVzdCBiZSBhIHByaW1lIG51bWJlciBvciBjaGFvcyBpcyBhc3N1cmVkLCBpZiB5b3VyIGxvb2tpbmcKKyAqICAgIGZvciBhIHByaW1lLCB0cnkgaHR0cDovL3d3dy51dG0uZWR1L3Jlc2VhcmNoL3ByaW1lcy9saXN0cy9zbWFsbC8xMDAwMC50eHQKKyAqIDQpIGlmIHlvdSBnbyBiaWdnZXIgdGhhbiAxNSBiaXRzIHlvdSBtYXkgZ2V0IGludG8gdHJvdWJsZSAodW50ZXN0ZWQpIGFzIGl0cworICogICAgc29tZXRpbWVzIGNhc3QgdG8gYW4gdW5zaWduZWQsIGlmIHlvdSBnbyB0byAxNiBiaXQgeW91IHdpbGwgb3ZlcmxhcAorICogICAgaW50J3MgYW5kIGNoYW9zIGlzIGFzc3VyZWQsIDE2MzgxIGlzIHRoZSBtYXggcHJpbWUgZm9yIDE0IGJpdCBmaWVsZAorICovCisKKy8qIE5BTUVfSEFTSF9QUklNRSwgU3RvcmVzIHBhY2thZ2UgbmFtZXMgYW5kIHZlcnNpb25zLAorICogSSBlc3RpbWF0ZSBpdCBzaG91bGQgYmUgYXQgbGVhc3QgNTAlIGJpZ2dlciB0aGFuIFBBQ0tBR0VfSEFTSF9QUklNRSwKKyAqIGFzIHRoZXJlIGEgbG90IG9mIGR1cGxpY2F0ZSB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgTkFNRV9IQVNIX1BSSU1FIDE2MzgxCisKKy8qIFBBQ0tBR0VfSEFTSF9QUklNRSwgTWF4aW11bSBudW1iZXIgb2YgdW5pcXVlIHBhY2thZ2VzLAorICogSXQgbXVzdCBub3QgYmUgc21hbGxlciB0aGFuIFNUQVRVU19IQVNIX1BSSU1FLAorICogQ3VycmVudGx5IG9ubHkgcGFja2FnZXMgZnJvbSBzdGF0dXNfaGFzaHRhYmxlIGFyZSBzdG9yZWQgaW4gaGVyZSwgYnV0IGluCisgKiBmdXR1cmUgdGhpcyBtYXkgYmUgdXNlZCB0byBzdG9yZSBwYWNrYWdlcyBub3Qgb25seSBmcm9tIGEgc3RhdHVzIGZpbGUsCisgKiBidXQgYW4gYXZhaWxhYmxlX2hhc2h0YWJsZSwgYW5kIGV2ZW4gbXVsdGlwbGUgcGFja2FnZXMgZmlsZXMuCisgKiBQYWNrYWdlIGNhbiBiZSBzdG9yZWQgbW9yZSB0aGFuIG9uY2UgaWYgdGhleSBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucy4KKyAqIGUuZy4gVGhlIHNhbWUgcGFja2FnZSBtYXkgaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMgaW4gdGhlIHN0YXR1cyBmaWxlCisgKiAgICAgIGFuZCBhdmFpbGFibGUgZmlsZSAqLworI2RlZmluZSBQQUNLQUdFX0hBU0hfUFJJTUUgMTAwMDcKK3R5cGVkZWYgc3RydWN0IGVkZ2VfcyB7CisJdW5zaWduZWQgb3BlcmF0b3I6NDsgLyogd2FzOjMgKi8KKwl1bnNpZ25lZCB0eXBlOjQ7CisJdW5zaWduZWQgbmFtZToxNjsgLyogd2FzOjE0ICovCisJdW5zaWduZWQgdmVyc2lvbjoxNjsgLyogd2FzOjE0ICovCit9IGVkZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY29tbW9uX25vZGVfcyB7CisJdW5zaWduZWQgbmFtZToxNjsgLyogd2FzOjE0ICovCisJdW5zaWduZWQgdmVyc2lvbjoxNjsgLyogd2FzOjE0ICovCisJdW5zaWduZWQgbnVtX29mX2VkZ2VzOjE2OyAvKiB3YXM6MTQgKi8KKwllZGdlX3QgKiplZGdlOworfSBjb21tb25fbm9kZV90OworCisvKiBDdXJyZW50bHkgaXQgZG9lc250IHN0b3JlIHBhY2thZ2VzIHRoYXQgaGF2ZSBzdGF0ZS1zdGF0dXMgb2Ygbm90LWluc3RhbGxlZAorICogU28gaXQgb25seSByZWFsbHkgaGFzIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrYWdlcworICogbGlrZWx5IHRvIGJlIGluc3RhbGxlZCBhdCBhbnkgb25lIHRpbWUsIHNvIHRoZXJlIGlzIGEgYml0IG9mIGxlZXdheSBoZXJlICovCisjZGVmaW5lIFNUQVRVU19IQVNIX1BSSU1FIDgxOTEKK3R5cGVkZWYgc3RydWN0IHN0YXR1c19ub2RlX3MgeworCXVuc2lnbmVkIHBhY2thZ2U6MTY7IC8qIHdhczoxNCAqLyAgICAgICAvKiBoYXMgdG8gZml0IFBBQ0tBR0VfSEFTSF9QUklNRSAqLworCXVuc2lnbmVkIHN0YXR1czoxNjsgLyogd2FzOjE0ICovICAgICAgICAvKiBoYXMgdG8gZml0IFNUQVRVU19IQVNIX1BSSU1FICovCit9IHN0YXR1c19ub2RlX3Q7CisKKworLyogR2xvYmFscyAqLworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgICAgICAgICAgKm5hbWVfaGFzaHRhYmxlW05BTUVfSEFTSF9QUklNRSArIDFdOworCWNvbW1vbl9ub2RlX3QgKnBhY2thZ2VfaGFzaHRhYmxlW1BBQ0tBR0VfSEFTSF9QUklNRSArIDFdOworCXN0YXR1c19ub2RlX3QgKnN0YXR1c19oYXNodGFibGVbU1RBVFVTX0hBU0hfUFJJTUUgKyAxXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgbmFtZV9oYXNodGFibGUgICAgKEcubmFtZV9oYXNodGFibGUgICApCisjZGVmaW5lIHBhY2thZ2VfaGFzaHRhYmxlIChHLnBhY2thZ2VfaGFzaHRhYmxlKQorI2RlZmluZSBzdGF0dXNfaGFzaHRhYmxlICAoRy5zdGF0dXNfaGFzaHRhYmxlICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworLyogRXZlbiBudW1iZXJzIGFyZSBmb3IgJ2V4dHJhcycsIGxpa2Ugb3JlZCBkZXBlbmRlbmNpZXMgb3IgbnVsbCAqLworZW51bSBlZGdlX3R5cGVfZSB7CisJRURHRV9OVUxMID0gMCwKKwlFREdFX1BSRV9ERVBFTkRTID0gMSwKKwlFREdFX09SX1BSRV9ERVBFTkRTID0gMiwKKwlFREdFX0RFUEVORFMgPSAzLAorCUVER0VfT1JfREVQRU5EUyA9IDQsCisJRURHRV9SRVBMQUNFUyA9IDUsCisJRURHRV9QUk9WSURFUyA9IDcsCisJRURHRV9DT05GTElDVFMgPSA5LAorCUVER0VfU1VHR0VTVFMgPSAxMSwKKwlFREdFX1JFQ09NTUVORFMgPSAxMywKKwlFREdFX0VOSEFOQ0VTID0gMTUKK307CitlbnVtIG9wZXJhdG9yX2UgeworCVZFUl9OVUxMID0gMCwKKwlWRVJfRVFVQUwgPSAxLAorCVZFUl9MRVNTID0gMiwKKwlWRVJfTEVTU19FUVVBTCA9IDMsCisJVkVSX01PUkUgPSA0LAorCVZFUl9NT1JFX0VRVUFMID0gNSwKKwlWRVJfQU5ZID0gNgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgZGViX2ZpbGVfcyB7CisJY2hhciAqY29udHJvbF9maWxlOworCWNoYXIgKmZpbGVuYW1lOworCXVuc2lnbmVkIHBhY2thZ2U6MTY7IC8qIHdhczoxNCAqLworfSBkZWJfZmlsZV90OworCisKK3N0YXRpYyB2b2lkIG1ha2VfaGFzaChjb25zdCBjaGFyICprZXksIHVuc2lnbmVkICpzdGFydCwgdW5zaWduZWQgKmRlY3JlbWVudCwgY29uc3QgaW50IGhhc2hfcHJpbWUpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoX251bSA9IGtleVswXTsKKwlpbnQgbGVuID0gc3RybGVuKGtleSk7CisJaW50IGk7CisKKwkvKiBNYXliZSBpIHNob3VsZCBoYXZlIHVzZXMgYSAicHJvcGVyIiBoYXNoaW5nIGFsZ29yaXRobSBoZXJlIGluc3RlYWQKKwkgKiBvZiBtYWtpbmcgb25lIHVwIG15c2VsZiwgc2VlbXMgdG8gYmUgd29ya2luZyBvayB0aG91Z2guICovCisJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCS8qIHNoaWZ0cyB0aGUgYXNjaWkgYmFzZWQgdmFsdWUgYW5kIGFkZHMgaXQgdG8gcHJldmlvdXMgdmFsdWUKKwkJICogc2hpZnQgYW1vdW50IGlzIG1vZCAyNCBiZWNhdXNlIGxvbmcgaW50IGlzIDMyIGJpdCBhbmQgZGF0YQorCQkgKiB0byBiZSBzaGlmdGVkIGlzIDgsIGRvbid0IHdhbnQgdG8gc2hpZnQgZGF0YSB0byB3aGVyZSBpdCBoYXMKKwkJICogbm8gZWZmZWN0ICovCisJCWhhc2hfbnVtICs9IChrZXlbaV0gKyBrZXlbaS0xXSkgPDwgKChrZXlbaV0gKiBpKSAlIDI0KTsKKwl9CisJKnN0YXJ0ID0gKHVuc2lnbmVkKSBoYXNoX251bSAlIGhhc2hfcHJpbWU7CisJKmRlY3JlbWVudCA9ICh1bnNpZ25lZCkgMSArIChoYXNoX251bSAlIChoYXNoX3ByaW1lIC0gMSkpOworfQorCisvKiB0aGlzIGFkZHMgdGhlIGtleSB0byB0aGUgaGFzaCB0YWJsZSAqLworc3RhdGljIGludCBzZWFyY2hfbmFtZV9oYXNodGFibGUoY29uc3QgY2hhciAqa2V5KQoreworCXVuc2lnbmVkIHByb2JlX2FkZHJlc3M7CisJdW5zaWduZWQgcHJvYmVfZGVjcmVtZW50OworCisJbWFrZV9oYXNoKGtleSwgJnByb2JlX2FkZHJlc3MsICZwcm9iZV9kZWNyZW1lbnQsIE5BTUVfSEFTSF9QUklNRSk7CisJd2hpbGUgKG5hbWVfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChuYW1lX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXSwga2V5KSA9PSAwKSB7CisJCQlyZXR1cm4gcHJvYmVfYWRkcmVzczsKKwkJfQorCQlwcm9iZV9hZGRyZXNzIC09IHByb2JlX2RlY3JlbWVudDsKKwkJaWYgKChpbnQpcHJvYmVfYWRkcmVzcyA8IDApIHsKKwkJCXByb2JlX2FkZHJlc3MgKz0gTkFNRV9IQVNIX1BSSU1FOworCQl9CisJfQorCW5hbWVfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdID0geHN0cmR1cChrZXkpOworCXJldHVybiBwcm9iZV9hZGRyZXNzOworfQorCisvKiB0aGlzIERPRVNOVCBhZGQgdGhlIGtleSB0byB0aGUgaGFzaHRhYmxlCisgKiBUT0RPIG1ha2UgaXQgY29uc2lzdGVudCB3aXRoIHNlYXJjaF9uYW1lX2hhc2h0YWJsZQorICovCitzdGF0aWMgdW5zaWduZWQgc2VhcmNoX3N0YXR1c19oYXNodGFibGUoY29uc3QgY2hhciAqa2V5KQoreworCXVuc2lnbmVkIHByb2JlX2FkZHJlc3M7CisJdW5zaWduZWQgcHJvYmVfZGVjcmVtZW50OworCisJbWFrZV9oYXNoKGtleSwgJnByb2JlX2FkZHJlc3MsICZwcm9iZV9kZWNyZW1lbnQsIFNUQVRVU19IQVNIX1BSSU1FKTsKKwl3aGlsZSAoc3RhdHVzX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoa2V5LCBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdLT5wYWNrYWdlXS0+bmFtZV0pID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJCXByb2JlX2FkZHJlc3MgLT0gcHJvYmVfZGVjcmVtZW50OworCQlpZiAoKGludClwcm9iZV9hZGRyZXNzIDwgMCkgeworCQkJcHJvYmVfYWRkcmVzcyArPSBTVEFUVVNfSEFTSF9QUklNRTsKKwkJfQorCX0KKwlyZXR1cm4gcHJvYmVfYWRkcmVzczsKK30KKworc3RhdGljIGludCBvcmRlcihjaGFyIHgpCit7CisJcmV0dXJuICh4ID09ICd+JyA/IC0xCisJCTogeCA9PSAnXDAnID8gMAorCQk6IGlzZGlnaXQoeCkgPyAwCisJCTogaXNhbHBoYSh4KSA/IHgKKwkJOiAodW5zaWduZWQgY2hhcil4ICsgMjU2CisJKTsKK30KKworLyogVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gZHBrZyBhbmQgbW9kaWZpZWQgc2xpZ2h0bHkgdG8gd29yayB3aXRoIGJ1c3lib3ggKi8KK3N0YXRpYyBpbnQgdmVyc2lvbl9jb21wYXJlX3BhcnQoY29uc3QgY2hhciAqdmFsLCBjb25zdCBjaGFyICpyZWYpCit7CisJaWYgKCF2YWwpIHZhbCA9ICIiOworCWlmICghcmVmKSByZWYgPSAiIjsKKworCXdoaWxlICgqdmFsIHx8ICpyZWYpIHsKKwkJaW50IGZpcnN0X2RpZmY7CisKKwkJd2hpbGUgKCgqdmFsICYmICFpc2RpZ2l0KCp2YWwpKSB8fCAoKnJlZiAmJiAhaXNkaWdpdCgqcmVmKSkpIHsKKwkJCWludCB2YyA9IG9yZGVyKCp2YWwpOworCQkJaW50IHJjID0gb3JkZXIoKnJlZik7CisJCQlpZiAodmMgIT0gcmMpCisJCQkJcmV0dXJuIHZjIC0gcmM7CisJCQl2YWwrKzsKKwkJCXJlZisrOworCQl9CisKKwkJd2hpbGUgKCp2YWwgPT0gJzAnKQorCQkJdmFsKys7CisJCXdoaWxlICgqcmVmID09ICcwJykKKwkJCXJlZisrOworCisJCWZpcnN0X2RpZmYgPSAwOworCQl3aGlsZSAoaXNkaWdpdCgqdmFsKSAmJiBpc2RpZ2l0KCpyZWYpKSB7CisJCQlpZiAoZmlyc3RfZGlmZiA9PSAwKQorCQkJCWZpcnN0X2RpZmYgPSAqdmFsIC0gKnJlZjsKKwkJCXZhbCsrOworCQkJcmVmKys7CisJCX0KKwkJaWYgKGlzZGlnaXQoKnZhbCkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGlzZGlnaXQoKnJlZikpCisJCQlyZXR1cm4gLTE7CisJCWlmIChmaXJzdF9kaWZmKQorCQkJcmV0dXJuIGZpcnN0X2RpZmY7CisJfQorCXJldHVybiAwOworfQorCisvKiBpZiB2ZXIxIDwgdmVyMiByZXR1cm4gLTEsCisgKiBpZiB2ZXIxID0gdmVyMiByZXR1cm4gMCwKKyAqIGlmIHZlcjEgPiB2ZXIyIHJldHVybiAxLAorICovCitzdGF0aWMgaW50IHZlcnNpb25fY29tcGFyZShjb25zdCB1bnNpZ25lZCB2ZXIxLCBjb25zdCB1bnNpZ25lZCB2ZXIyKQoreworCWNoYXIgKmNoX3ZlcjEgPSBuYW1lX2hhc2h0YWJsZVt2ZXIxXTsKKwljaGFyICpjaF92ZXIyID0gbmFtZV9oYXNodGFibGVbdmVyMl07CisJdW5zaWduZWQgZXBvY2gxID0gMCwgZXBvY2gyID0gMDsKKwljaGFyICpjb2xvbjsKKwljaGFyICpkZWJfdmVyMSwgKmRlYl92ZXIyOworCWNoYXIgKnVwc3RyZWFtX3ZlcjE7CisJY2hhciAqdXBzdHJlYW1fdmVyMjsKKwlpbnQgcmVzdWx0OworCisJLyogQ29tcGFyZSBlcG9jaCAqLworCWNvbG9uID0gc3RyY2hyKGNoX3ZlcjEsICc6Jyk7CisJaWYgKGNvbG9uKSB7CisJCWVwb2NoMSA9IGF0b2koY2hfdmVyMSk7CisJCWNoX3ZlcjEgPSBjb2xvbiArIDE7CisJfQorCWNvbG9uID0gc3RyY2hyKGNoX3ZlcjIsICc6Jyk7CisJaWYgKGNvbG9uKSB7CisJCWVwb2NoMiA9IGF0b2koY2hfdmVyMik7CisJCWNoX3ZlcjIgPSBjb2xvbiArIDE7CisJfQorCWlmIChlcG9jaDEgPCBlcG9jaDIpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZXBvY2gxID4gZXBvY2gyKSB7CisJCXJldHVybiAxOworCX0KKworCS8qIENvbXBhcmUgdXBzdHJlYW0gdmVyc2lvbiAqLworCXVwc3RyZWFtX3ZlcjEgPSB4c3RyZHVwKGNoX3ZlcjEpOworCXVwc3RyZWFtX3ZlcjIgPSB4c3RyZHVwKGNoX3ZlcjIpOworCisJLyogQ2hvcCBvZmYgZGViaWFuIHZlcnNpb24sIGFuZCBzdG9yZSBmb3IgbGF0ZXIgdXNlICovCisJZGViX3ZlcjEgPSBzdHJyY2hyKHVwc3RyZWFtX3ZlcjEsICctJyk7CisJZGViX3ZlcjIgPSBzdHJyY2hyKHVwc3RyZWFtX3ZlcjIsICctJyk7CisJaWYgKGRlYl92ZXIxKSB7CisJCSpkZWJfdmVyMSsrID0gJ1wwJzsKKwl9CisJaWYgKGRlYl92ZXIyKSB7CisJCSpkZWJfdmVyMisrID0gJ1wwJzsKKwl9CisJcmVzdWx0ID0gdmVyc2lvbl9jb21wYXJlX3BhcnQodXBzdHJlYW1fdmVyMSwgdXBzdHJlYW1fdmVyMik7CisJaWYgKHJlc3VsdCA9PSAwKSB7CisJCS8qIENvbXBhcmUgZGViaWFuIHZlcnNpb25zICovCisJCXJlc3VsdCA9IHZlcnNpb25fY29tcGFyZV9wYXJ0KGRlYl92ZXIxLCBkZWJfdmVyMik7CisJfQorCisJZnJlZSh1cHN0cmVhbV92ZXIxKTsKKwlmcmVlKHVwc3RyZWFtX3ZlcjIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF92ZXJzaW9uKGNvbnN0IHVuc2lnbmVkIHZlcnNpb24xLCBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uMiwgY29uc3QgdW5zaWduZWQgb3BlcmF0b3IpCit7CisJY29uc3QgaW50IHZlcnNpb25fcmVzdWx0ID0gdmVyc2lvbl9jb21wYXJlKHZlcnNpb24xLCB2ZXJzaW9uMik7CisJc3dpdGNoIChvcGVyYXRvcikgeworCWNhc2UgVkVSX0FOWToKKwkJcmV0dXJuIFRSVUU7CisJY2FzZSBWRVJfRVFVQUw6CisJCXJldHVybiAodmVyc2lvbl9yZXN1bHQgPT0gMCk7CisJY2FzZSBWRVJfTEVTUzoKKwkJcmV0dXJuICh2ZXJzaW9uX3Jlc3VsdCA8IDApOworCWNhc2UgVkVSX0xFU1NfRVFVQUw6CisJCXJldHVybiAodmVyc2lvbl9yZXN1bHQgPD0gMCk7CisJY2FzZSBWRVJfTU9SRToKKwkJcmV0dXJuICh2ZXJzaW9uX3Jlc3VsdCA+IDApOworCWNhc2UgVkVSX01PUkVfRVFVQUw6CisJCXJldHVybiAodmVyc2lvbl9yZXN1bHQgPj0gMCk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUoY29uc3QgdW5zaWduZWQgbmFtZSwgY29uc3QgdW5zaWduZWQgdmVyc2lvbiwgY29uc3QgdW5zaWduZWQgb3BlcmF0b3IpCit7CisJdW5zaWduZWQgcHJvYmVfYWRkcmVzczsKKwl1bnNpZ25lZCBwcm9iZV9kZWNyZW1lbnQ7CisKKwltYWtlX2hhc2gobmFtZV9oYXNodGFibGVbbmFtZV0sICZwcm9iZV9hZGRyZXNzLCAmcHJvYmVfZGVjcmVtZW50LCBQQUNLQUdFX0hBU0hfUFJJTUUpOworCXdoaWxlIChwYWNrYWdlX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXSAhPSBOVUxMKSB7CisJCWlmIChwYWNrYWdlX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXS0+bmFtZSA9PSBuYW1lKSB7CisJCQlpZiAob3BlcmF0b3IgPT0gVkVSX0FOWSkgeworCQkJCXJldHVybiBwcm9iZV9hZGRyZXNzOworCQkJfQorCQkJaWYgKHRlc3RfdmVyc2lvbihwYWNrYWdlX2hhc2h0YWJsZVtwcm9iZV9hZGRyZXNzXS0+dmVyc2lvbiwgdmVyc2lvbiwgb3BlcmF0b3IpKSB7CisJCQkJcmV0dXJuIHByb2JlX2FkZHJlc3M7CisJCQl9CisJCX0KKwkJcHJvYmVfYWRkcmVzcyAtPSBwcm9iZV9kZWNyZW1lbnQ7CisJCWlmICgoaW50KXByb2JlX2FkZHJlc3MgPCAwKSB7CisJCQlwcm9iZV9hZGRyZXNzICs9IFBBQ0tBR0VfSEFTSF9QUklNRTsKKwkJfQorCX0KKwlyZXR1cm4gcHJvYmVfYWRkcmVzczsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhyb3VnaCB0aGUgZW50aXJlIHBhY2thZ2VfaGFzaHRhYmxlIGxvb2tpbmcKKyAqIGZvciBhIHBhY2thZ2Ugd2hpY2ggcHJvdmlkZXMgIm5lZWRsZSIuIEl0IHJldHVybnMgdGhlIGluZGV4IGludG8KKyAqIHRoZSBwYWNrYWdlX2hhc2h0YWJsZSBmb3IgdGhlIHByb3ZpZGluZyBwYWNrYWdlLgorICoKKyAqIG5lZWRsZSBpcyB0aGUgaW5kZXggaW50byBuYW1lX2hhc2h0YWJsZSBvZiB0aGUgcGFja2FnZSB3ZSBhcmUKKyAqIGxvb2tpbmcgZm9yLgorICoKKyAqIHN0YXJ0X2F0IGlzIHRoZSBpbmRleCBpbiB0aGUgcGFja2FnZV9oYXNodGFibGUgdG8gc3RhcnQgbG9va2luZworICogYXQuIElmIHN0YXJ0X2F0IGlzIC0xIHRoZW4gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4gVGhpcyBpcyB0byBhbGxvdworICogZm9yIHJlcGVhdGVkIHNlYXJjaGVzIHNpbmNlIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBtaWdodCBwcm92aWRlCisgKiBuZWVkbGUuCisgKgorICogRklYTUU6IEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyB2ZXJ5IGVmZmljaWVudCwgYnV0IEkgdGhvdWdodCBJJ2Qga2VlcAorICogaXQgc2ltcGxlIGZvciBub3cgdW50aWwgaXQgcHJvdmVzIHRvIGJlIGEgcHJvYmxlbS4KKyAqLworc3RhdGljIGludCBzZWFyY2hfZm9yX3Byb3ZpZGVzKGludCBuZWVkbGUsIGludCBzdGFydF9hdCkKK3sKKwlpbnQgaSwgajsKKwljb21tb25fbm9kZV90ICpwOworCWZvciAoaSA9IHN0YXJ0X2F0ICsgMTsgaSA8IFBBQ0tBR0VfSEFTSF9QUklNRTsgaSsrKSB7CisJCXAgPSBwYWNrYWdlX2hhc2h0YWJsZVtpXTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgcC0+bnVtX29mX2VkZ2VzOyBqKyspCisJCQlpZiAocC0+ZWRnZVtqXS0+dHlwZSA9PSBFREdFX1BST1ZJREVTICYmIHAtPmVkZ2Vbal0tPm5hbWUgPT0gbmVlZGxlKQorCQkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBBZGQgYW4gZWRnZSB0byBhIG5vZGUKKyAqLworc3RhdGljIHZvaWQgYWRkX2VkZ2VfdG9fbm9kZShjb21tb25fbm9kZV90ICpub2RlLCBlZGdlX3QgKmVkZ2UpCit7CisJbm9kZS0+ZWRnZSA9IHhyZWFsbG9jX3ZlY3Rvcihub2RlLT5lZGdlLCAyLCBub2RlLT5udW1fb2ZfZWRnZXMpOworCW5vZGUtPmVkZ2Vbbm9kZS0+bnVtX29mX2VkZ2VzKytdID0gZWRnZTsKK30KKworLyoKKyAqIENyZWF0ZSBvbmUgbmV3IG5vZGUgYW5kIG9uZSBuZXcgZWRnZSBmb3IgZXZlcnkgZGVwZW5kZW5jeS4KKyAqCisgKiBEZXBlbmRlbmNpZXMgd2hpY2ggY29udGFpbiBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgYXJlIHJlcHJlc2VudGVkIGFzCisgKiBhbiBFREdFX09SX1BSRV9ERVBFTkRTIG9yIEVER0VfT1JfREVQRU5EUyBub2RlLCBmb2xsb3dlZCBieSBhCisgKiBudW1iZXIgb2YgRURHRV9QUkVfREVQRU5EUyBvciBFREdFX0RFUEVORFMgbm9kZXMuIFRoZSBuYW1lIGZpZWxkIG9mCisgKiB0aGUgT1IgZWRnZSBjb250YWlucyB0aGUgZnVsbCBkZXBlbmRlbmN5IHN0cmluZyB3aGlsZSB0aGUgdmVyc2lvbgorICogZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiBFREdFIG5vZGVzIHdoaWNoIGZvbGxvdyBhcyBwYXJ0IG9mCisgKiB0aGlzIGFsdGVybmF0aXZlLgorICovCitzdGF0aWMgdm9pZCBhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKGNvbW1vbl9ub2RlX3QgKnBhcmVudF9ub2RlLCBjb25zdCBjaGFyICp3aG9sZV9saW5lLCB1bnNpZ25lZCBlZGdlX3R5cGUpCit7CisJY2hhciAqbGluZSA9IHhzdHJkdXAod2hvbGVfbGluZSk7CisJY2hhciAqbGluZTI7CisJY2hhciAqbGluZV9wdHIxID0gTlVMTDsKKwljaGFyICpsaW5lX3B0cjIgPSBOVUxMOworCWNoYXIgKmZpZWxkOworCWNoYXIgKmZpZWxkMjsKKwljaGFyICp2ZXJzaW9uOworCWVkZ2VfdCAqZWRnZTsKKwllZGdlX3QgKm9yX2VkZ2U7CisJaW50IG9mZnNldF9jaDsKKworCWZpZWxkID0gc3RydG9rX3IobGluZSwgIiwiLCAmbGluZV9wdHIxKTsKKwlkbyB7CisJCS8qIHNraXAgbGVhZGluZyBzcGFjZXMgKi8KKwkJZmllbGQgKz0gc3Ryc3BuKGZpZWxkLCAiICIpOworCQlsaW5lMiA9IHhzdHJkdXAoZmllbGQpOworCQlmaWVsZDIgPSBzdHJ0b2tfcihsaW5lMiwgInwiLCAmbGluZV9wdHIyKTsKKwkJb3JfZWRnZSA9IE5VTEw7CisJCWlmICgoZWRnZV90eXBlID09IEVER0VfREVQRU5EUyB8fCBlZGdlX3R5cGUgPT0gRURHRV9QUkVfREVQRU5EUykKKwkJICYmIChzdHJjbXAoZmllbGQsIGZpZWxkMikgIT0gMCkKKwkJKSB7CisJCQlvcl9lZGdlID0geHphbGxvYyhzaXplb2YoZWRnZV90KSk7CisJCQlvcl9lZGdlLT50eXBlID0gZWRnZV90eXBlICsgMTsKKwkJCW9yX2VkZ2UtPm5hbWUgPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoZmllbGQpOworCQkJLy9vcl9lZGdlLT52ZXJzaW9uID0gMDsgLy8gdHJhY2tzIHRoZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmVzCisJCQlhZGRfZWRnZV90b19ub2RlKHBhcmVudF9ub2RlLCBvcl9lZGdlKTsKKwkJfQorCisJCWRvIHsKKwkJCWVkZ2UgPSB4bWFsbG9jKHNpemVvZihlZGdlX3QpKTsKKwkJCWVkZ2UtPnR5cGUgPSBlZGdlX3R5cGU7CisKKwkJCS8qIFNraXAgYW55IGV4dHJhIGxlYWRpbmcgc3BhY2VzICovCisJCQlmaWVsZDIgKz0gc3Ryc3BuKGZpZWxkMiwgIiAiKTsKKworCQkJLyogR2V0IGRlcGVuZGVuY3kgdmVyc2lvbiBpbmZvICovCisJCQl2ZXJzaW9uID0gc3RyY2hyKGZpZWxkMiwgJygnKTsKKwkJCWlmICh2ZXJzaW9uID09IE5VTEwpIHsKKwkJCQllZGdlLT5vcGVyYXRvciA9IFZFUl9BTlk7CisJCQkJLyogR2V0IHRoZSB2ZXJzaW9ucyBoYXNoIG51bWJlciwgYWRkaW5nIGl0IGlmIHRoZSBudW1iZXIgaXNudCBhbHJlYWR5IGluIHRoZXJlICovCisJCQkJZWRnZS0+dmVyc2lvbiA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiQU5ZIik7CisJCQl9IGVsc2UgeworCQkJCS8qIFNraXAgbGVhZGluZyAnICcgb3IgJygnICovCisJCQkJdmVyc2lvbiArPSBzdHJzcG4odmVyc2lvbiwgIiAoIik7CisJCQkJLyogQ2FsY3VsYXRlIGxlbmd0aCBvZiBhbnkgb3BlcmF0b3IgY2hhcmFjdGVycyAqLworCQkJCW9mZnNldF9jaCA9IHN0cnNwbih2ZXJzaW9uLCAiPD0+Iik7CisJCQkJLyogRGV0ZXJtaW5lIG9wZXJhdG9yICovCisJCQkJaWYgKG9mZnNldF9jaCA+IDApIHsKKwkJCQkJaWYgKHN0cm5jbXAodmVyc2lvbiwgIj0iLCBvZmZzZXRfY2gpID09IDApIHsKKwkJCQkJCWVkZ2UtPm9wZXJhdG9yID0gVkVSX0VRVUFMOworCQkJCQl9IGVsc2UgaWYgKHN0cm5jbXAodmVyc2lvbiwgIjw8Iiwgb2Zmc2V0X2NoKSA9PSAwKSB7CisJCQkJCQllZGdlLT5vcGVyYXRvciA9IFZFUl9MRVNTOworCQkJCQl9IGVsc2UgaWYgKHN0cm5jbXAodmVyc2lvbiwgIjw9Iiwgb2Zmc2V0X2NoKSA9PSAwKSB7CisJCQkJCQllZGdlLT5vcGVyYXRvciA9IFZFUl9MRVNTX0VRVUFMOworCQkJCQl9IGVsc2UgaWYgKHN0cm5jbXAodmVyc2lvbiwgIj4+Iiwgb2Zmc2V0X2NoKSA9PSAwKSB7CisJCQkJCQllZGdlLT5vcGVyYXRvciA9IFZFUl9NT1JFOworCQkJCQl9IGVsc2UgaWYgKHN0cm5jbXAodmVyc2lvbiwgIj49Iiwgb2Zmc2V0X2NoKSA9PSAwKSB7CisJCQkJCQllZGdlLT5vcGVyYXRvciA9IFZFUl9NT1JFX0VRVUFMOworCQkJCQl9IGVsc2UgeworCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlsbGVnYWwgb3BlcmF0b3IiKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBza2lwIHRvIHN0YXJ0IG9mIHZlcnNpb24gbnVtYmVycyAqLworCQkJCXZlcnNpb24gKz0gb2Zmc2V0X2NoOworCQkJCXZlcnNpb24gKz0gc3Ryc3BuKHZlcnNpb24sICIgIik7CisKKwkJCQkvKiBUcnVuY2F0ZSB2ZXJzaW9uIGF0IHRyYWlsaW5nICcgJyBvciAnKScgKi8KKwkJCQl2ZXJzaW9uW3N0cmNzcG4odmVyc2lvbiwgIiApIildID0gJ1wwJzsKKwkJCQkvKiBHZXQgdGhlIHZlcnNpb25zIGhhc2ggbnVtYmVyLCBhZGRpbmcgaXQgaWYgdGhlIG51bWJlciBpc250IGFscmVhZHkgaW4gdGhlcmUgKi8KKwkJCQllZGdlLT52ZXJzaW9uID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKHZlcnNpb24pOworCQkJfQorCisJCQkvKiBHZXQgdGhlIGRlcGVuZGVuY3kgbmFtZSAqLworCQkJZmllbGQyW3N0cmNzcG4oZmllbGQyLCAiICgiKV0gPSAnXDAnOworCQkJZWRnZS0+bmFtZSA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShmaWVsZDIpOworCisJCQlpZiAob3JfZWRnZSkKKwkJCQlvcl9lZGdlLT52ZXJzaW9uKys7CisKKwkJCWFkZF9lZGdlX3RvX25vZGUocGFyZW50X25vZGUsIGVkZ2UpOworCQkJZmllbGQyID0gc3RydG9rX3IoTlVMTCwgInwiLCAmbGluZV9wdHIyKTsKKwkJfSB3aGlsZSAoZmllbGQyICE9IE5VTEwpOworCisJCWZyZWUobGluZTIpOworCQlmaWVsZCA9IHN0cnRva19yKE5VTEwsICIsIiwgJmxpbmVfcHRyMSk7CisJfSB3aGlsZSAoZmllbGQgIT0gTlVMTCk7CisKKwlmcmVlKGxpbmUpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhY2thZ2UoY29tbW9uX25vZGVfdCAqbm9kZSkKK3sKKwl1bnNpZ25lZCBpOworCWlmIChub2RlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fb2ZfZWRnZXM7IGkrKykgeworCQkJZnJlZShub2RlLT5lZGdlW2ldKTsKKwkJfQorCQlmcmVlKG5vZGUtPmVkZ2UpOworCQlmcmVlKG5vZGUpOworCX0KK30KKworLyoKKyAqIEdldHMgdGhlIG5leHQgcGFja2FnZSBmaWVsZCBmcm9tIHBhY2thZ2VfYnVmZmVyLCBzZXBhcmF0ZWQgaW50byB0aGUgZmllbGQgbmFtZQorICogYW5kIGZpZWxkIHZhbHVlLCBpdCByZXR1cm5zIHRoZSBpbnQgb2Zmc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgZmllbGQKKyAqLworc3RhdGljIGludCByZWFkX3BhY2thZ2VfZmllbGQoY29uc3QgY2hhciAqcGFja2FnZV9idWZmZXIsIGNoYXIgKipmaWVsZF9uYW1lLCBjaGFyICoqZmllbGRfdmFsdWUpCit7CisJaW50IG9mZnNldF9uYW1lX3N0YXJ0ID0gMDsKKwlpbnQgb2Zmc2V0X25hbWVfZW5kID0gMDsKKwlpbnQgb2Zmc2V0X3ZhbHVlX3N0YXJ0ID0gMDsKKwlpbnQgb2Zmc2V0X3ZhbHVlX2VuZCA9IDA7CisJaW50IG9mZnNldCA9IDA7CisJaW50IG5leHRfb2Zmc2V0OworCWludCBuYW1lX2xlbmd0aDsKKwlpbnQgdmFsdWVfbGVuZ3RoOworCWludCBleGl0X2ZsYWcgPSBGQUxTRTsKKworCWlmIChwYWNrYWdlX2J1ZmZlciA9PSBOVUxMKSB7CisJCSpmaWVsZF9uYW1lID0gTlVMTDsKKwkJKmZpZWxkX3ZhbHVlID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKwl3aGlsZSAoMSkgeworCQluZXh0X29mZnNldCA9IG9mZnNldCArIDE7CisJCXN3aXRjaCAocGFja2FnZV9idWZmZXJbb2Zmc2V0XSkgeworCQkJY2FzZSAnXDAnOgorCQkJCWV4aXRfZmxhZyA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQljYXNlICc6JzoKKwkJCQlpZiAob2Zmc2V0X25hbWVfZW5kID09IDApIHsKKwkJCQkJb2Zmc2V0X25hbWVfZW5kID0gb2Zmc2V0OworCQkJCQlvZmZzZXRfdmFsdWVfc3RhcnQgPSBuZXh0X29mZnNldDsKKwkJCQl9CisJCQkJLyogVE9ETzogTmFtZSBtaWdodCBzdGlsbCBoYXZlIHRyYWlsaW5nIHNwYWNlcyBpZiAnOicgaXNudAorCQkJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIG5hbWUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xuJzoKKwkJCQkvKiBUT0RPOiBUaGUgY2hhciBuZXh0X29mZnNldCBtYXkgYmUgb3V0IG9mIGJvdW5kcyAqLworCQkJCWlmIChwYWNrYWdlX2J1ZmZlcltuZXh0X29mZnNldF0gIT0gJyAnKSB7CisJCQkJCWV4aXRfZmxhZyA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWNhc2UgJ1x0JzoKKwkJCWNhc2UgJyAnOgorCQkJCS8qIGluY3JlbWVudCB0aGUgdmFsdWUgc3RhcnQgcG9pbnQgaWYgaXRzIGEganVzdCBmaWxsZXIgKi8KKwkJCQlpZiAob2Zmc2V0X25hbWVfc3RhcnQgPT0gb2Zmc2V0KSB7CisJCQkJCW9mZnNldF9uYW1lX3N0YXJ0Kys7CisJCQkJfQorCQkJCWlmIChvZmZzZXRfdmFsdWVfc3RhcnQgPT0gb2Zmc2V0KSB7CisJCQkJCW9mZnNldF92YWx1ZV9zdGFydCsrOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZXhpdF9mbGFnKSB7CisJCQkvKiBDaGVjayB0aGF0IHRoZSBuYW1lcyBhcmUgdmFsaWQgKi8KKwkJCW9mZnNldF92YWx1ZV9lbmQgPSBvZmZzZXQ7CisJCQluYW1lX2xlbmd0aCA9IG9mZnNldF9uYW1lX2VuZCAtIG9mZnNldF9uYW1lX3N0YXJ0OworCQkJdmFsdWVfbGVuZ3RoID0gb2Zmc2V0X3ZhbHVlX2VuZCAtIG9mZnNldF92YWx1ZV9zdGFydDsKKwkJCWlmIChuYW1lX2xlbmd0aCA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKG5hbWVfbGVuZ3RoID4gMCkgJiYgKHZhbHVlX2xlbmd0aCA+IDApKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIElmIG5vdCB2YWxpZCwgc3RhcnQgZnJlc2ggd2l0aCBuZXh0IGZpZWxkICovCisJCQlleGl0X2ZsYWcgPSBGQUxTRTsKKwkJCW9mZnNldF9uYW1lX3N0YXJ0ID0gb2Zmc2V0ICsgMTsKKwkJCW9mZnNldF9uYW1lX2VuZCA9IDA7CisJCQlvZmZzZXRfdmFsdWVfc3RhcnQgPSBvZmZzZXQgKyAxOworCQkJb2Zmc2V0X3ZhbHVlX2VuZCA9IG9mZnNldCArIDE7CisJCQlvZmZzZXQrKzsKKwkJfQorCQlvZmZzZXQrKzsKKwl9CisJKmZpZWxkX25hbWUgPSBOVUxMOworCWlmIChuYW1lX2xlbmd0aCkgeworCQkqZmllbGRfbmFtZSA9IHhzdHJuZHVwKCZwYWNrYWdlX2J1ZmZlcltvZmZzZXRfbmFtZV9zdGFydF0sIG5hbWVfbGVuZ3RoKTsKKwl9CisJKmZpZWxkX3ZhbHVlID0gTlVMTDsKKwlpZiAodmFsdWVfbGVuZ3RoID4gMCkgeworCQkqZmllbGRfdmFsdWUgPSB4c3RybmR1cCgmcGFja2FnZV9idWZmZXJbb2Zmc2V0X3ZhbHVlX3N0YXJ0XSwgdmFsdWVfbGVuZ3RoKTsKKwl9CisJcmV0dXJuIG5leHRfb2Zmc2V0OworfQorCitzdGF0aWMgdW5zaWduZWQgZmlsbF9wYWNrYWdlX3N0cnVjdChjaGFyICpjb250cm9sX2J1ZmZlcikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBmaWVsZF9uYW1lc1tdIEFMSUdOMSA9CisJCSJQYWNrYWdlXDAiIlZlcnNpb25cMCIKKwkJIlByZS1EZXBlbmRzXDAiIkRlcGVuZHNcMCIiUmVwbGFjZXNcMCIiUHJvdmlkZXNcMCIKKwkJIkNvbmZsaWN0c1wwIiJTdWdnZXN0c1wwIiJSZWNvbW1lbmRzXDAiIkVuaGFuY2VzXDAiOworCisJY29tbW9uX25vZGVfdCAqbmV3X25vZGUgPSB4emFsbG9jKHNpemVvZihjb21tb25fbm9kZV90KSk7CisJY2hhciAqZmllbGRfbmFtZTsKKwljaGFyICpmaWVsZF92YWx1ZTsKKwlpbnQgZmllbGRfc3RhcnQgPSAwOworCWludCBudW0gPSAtMTsKKwlpbnQgYnVmZmVyX2xlbmd0aCA9IHN0cmxlbihjb250cm9sX2J1ZmZlcik7CisKKwluZXdfbm9kZS0+dmVyc2lvbiA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgidW5rbm93biIpOworCXdoaWxlIChmaWVsZF9zdGFydCA8IGJ1ZmZlcl9sZW5ndGgpIHsKKwkJdW5zaWduZWQgZmllbGRfbnVtOworCisJCWZpZWxkX3N0YXJ0ICs9IHJlYWRfcGFja2FnZV9maWVsZCgmY29udHJvbF9idWZmZXJbZmllbGRfc3RhcnRdLAorCQkJCSZmaWVsZF9uYW1lLCAmZmllbGRfdmFsdWUpOworCisJCWlmIChmaWVsZF9uYW1lID09IE5VTEwpIHsKKwkJCWdvdG8gZmlsbF9wYWNrYWdlX3N0cnVjdF9jbGVhbnVwOworCQl9CisKKwkJZmllbGRfbnVtID0gaW5kZXhfaW5fc3RyaW5ncyhmaWVsZF9uYW1lcywgZmllbGRfbmFtZSk7CisJCXN3aXRjaCAoZmllbGRfbnVtKSB7CisJCWNhc2UgMDogLyogUGFja2FnZSAqLworCQkJbmV3X25vZGUtPm5hbWUgPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoZmllbGRfdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogVmVyc2lvbiAqLworCQkJbmV3X25vZGUtPnZlcnNpb24gPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoZmllbGRfdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogUHJlLURlcGVuZHMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX1BSRV9ERVBFTkRTKTsKKwkJCWJyZWFrOworCQljYXNlIDM6IC8qIERlcGVuZHMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX0RFUEVORFMpOworCQkJYnJlYWs7CisJCWNhc2UgNDogLyogUmVwbGFjZXMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX1JFUExBQ0VTKTsKKwkJCWJyZWFrOworCQljYXNlIDU6IC8qIFByb3ZpZGVzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9QUk9WSURFUyk7CisJCQlicmVhazsKKwkJY2FzZSA2OiAvKiBDb25mbGljdHMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX0NPTkZMSUNUUyk7CisJCQlicmVhazsKKwkJY2FzZSA3OiAvKiBTdWdnZXN0cyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfU1VHR0VTVFMpOworCQkJYnJlYWs7CisJCWNhc2UgODogLyogUmVjb21tZW5kcyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfUkVDT01NRU5EUyk7CisJCQlicmVhazsKKwkJY2FzZSA5OiAvKiBFbmhhbmNlcyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfRU5IQU5DRVMpOworCQkJYnJlYWs7CisJCX0KKyBmaWxsX3BhY2thZ2Vfc3RydWN0X2NsZWFudXA6CisJCWZyZWUoZmllbGRfbmFtZSk7CisJCWZyZWUoZmllbGRfdmFsdWUpOworCX0KKworCWlmIChuZXdfbm9kZS0+dmVyc2lvbiA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoInVua25vd24iKSkgeworCQlmcmVlX3BhY2thZ2UobmV3X25vZGUpOworCQlyZXR1cm4gLTE7CisJfQorCW51bSA9IHNlYXJjaF9wYWNrYWdlX2hhc2h0YWJsZShuZXdfbm9kZS0+bmFtZSwgbmV3X25vZGUtPnZlcnNpb24sIFZFUl9FUVVBTCk7CisJZnJlZV9wYWNrYWdlKHBhY2thZ2VfaGFzaHRhYmxlW251bV0pOworCXBhY2thZ2VfaGFzaHRhYmxlW251bV0gPSBuZXdfbm9kZTsKKwlyZXR1cm4gbnVtOworfQorCisvKiBpZiBudW0gPSAxLCBpdCByZXR1cm5zIHRoZSB3YW50IHN0YXR1cywgMiByZXR1cm5zIGZsYWcsIDMgcmV0dXJucyBzdGF0dXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBnZXRfc3RhdHVzKGNvbnN0IHVuc2lnbmVkIHN0YXR1c19ub2RlLCBjb25zdCBpbnQgbnVtKQoreworCWNoYXIgKnN0YXR1c19zdHJpbmcgPSBuYW1lX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19ub2RlXS0+c3RhdHVzXTsKKwljaGFyICpzdGF0ZV9zdWJfc3RyaW5nOworCXVuc2lnbmVkIHN0YXRlX3N1Yl9udW07CisJaW50IGxlbjsKKwlpbnQgaTsKKworCS8qIHNldCB0bXBfc3RyaW5nIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgd29yZCBudW1iZXIgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbnVtOyBpKyspIHsKKwkJLyogc2tpcCBwYXN0IGEgd29yZCAqLworCQlzdGF0dXNfc3RyaW5nICs9IHN0cmNzcG4oc3RhdHVzX3N0cmluZywgIiAiKTsKKwkJLyogc2tpcCBwYXN0IHRoZSBzZXBhcmF0aW5nIHNwYWNlcyAqLworCQlzdGF0dXNfc3RyaW5nICs9IHN0cnNwbihzdGF0dXNfc3RyaW5nLCAiICIpOworCX0KKwlsZW4gPSBzdHJjc3BuKHN0YXR1c19zdHJpbmcsICIgXG4iKTsKKwlzdGF0ZV9zdWJfc3RyaW5nID0geHN0cm5kdXAoc3RhdHVzX3N0cmluZywgbGVuKTsKKwlzdGF0ZV9zdWJfbnVtID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKHN0YXRlX3N1Yl9zdHJpbmcpOworCWZyZWUoc3RhdGVfc3ViX3N0cmluZyk7CisJcmV0dXJuIHN0YXRlX3N1Yl9udW07Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zdGF0dXMoY29uc3QgdW5zaWduZWQgc3RhdHVzX25vZGVfbnVtLCBjb25zdCBjaGFyICpuZXdfdmFsdWUsIGNvbnN0IGludCBwb3NpdGlvbikKK3sKKwljb25zdCB1bnNpZ25lZCBuZXdfdmFsdWVfbnVtID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKG5ld192YWx1ZSk7CisJdW5zaWduZWQgd2FudCA9IGdldF9zdGF0dXMoc3RhdHVzX25vZGVfbnVtLCAxKTsKKwl1bnNpZ25lZCBmbGFnID0gZ2V0X3N0YXR1cyhzdGF0dXNfbm9kZV9udW0sIDIpOworCXVuc2lnbmVkIHN0YXR1cyA9IGdldF9zdGF0dXMoc3RhdHVzX25vZGVfbnVtLCAzKTsKKwljaGFyICpuZXdfc3RhdHVzOworCisJc3dpdGNoIChwb3NpdGlvbikgeworCQljYXNlIDE6CisJCQl3YW50ID0gbmV3X3ZhbHVlX251bTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlmbGFnID0gbmV3X3ZhbHVlX251bTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzdGF0dXMgPSBuZXdfdmFsdWVfbnVtOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiREVCVUcgT05MWTogdGhpcyBzaG91bGRudCBoYXBwZW4iKTsKKwl9CisKKwluZXdfc3RhdHVzID0geGFzcHJpbnRmKCIlcyAlcyAlcyIsIG5hbWVfaGFzaHRhYmxlW3dhbnRdLCBuYW1lX2hhc2h0YWJsZVtmbGFnXSwgbmFtZV9oYXNodGFibGVbc3RhdHVzXSk7CisJc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbm9kZV9udW1dLT5zdGF0dXMgPSBzZWFyY2hfbmFtZV9oYXNodGFibGUobmV3X3N0YXR1cyk7CisJZnJlZShuZXdfc3RhdHVzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRlc2NyaWJlX3N0YXR1cyhpbnQgc3RhdHVzX251bSkKK3sKKwlpbnQgc3RhdHVzX3dhbnQsIHN0YXR1c19zdGF0ZTsKKwlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9PSBOVUxMIHx8IHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0tPnN0YXR1cyA9PSAwKQorCQlyZXR1cm4gImlzIG5vdCBpbnN0YWxsZWQgb3IgZmxhZ2dlZCB0byBiZSBpbnN0YWxsZWQiOworCisJc3RhdHVzX3dhbnQgPSBnZXRfc3RhdHVzKHN0YXR1c19udW0sIDEpOworCXN0YXR1c19zdGF0ZSA9IGdldF9zdGF0dXMoc3RhdHVzX251bSwgMyk7CisKKwlpZiAoc3RhdHVzX3N0YXRlID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbGVkIikpIHsKKwkJaWYgKHN0YXR1c193YW50ID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbCIpKQorCQkJcmV0dXJuICJpcyBpbnN0YWxsZWQiOworCQlpZiAoc3RhdHVzX3dhbnQgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJkZWluc3RhbGwiKSkKKwkJCXJldHVybiAiaXMgbWFya2VkIHRvIGJlIHJlbW92ZWQiOworCQlpZiAoc3RhdHVzX3dhbnQgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJwdXJnZSIpKQorCQkJcmV0dXJuICJpcyBtYXJrZWQgdG8gYmUgcHVyZ2VkIjsKKwl9CisJaWYgKHN0YXR1c193YW50ID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgidW5rbm93biIpKQorCQlyZXR1cm4gImlzIGluIGFuIGluZGV0ZXJtaW5hdGUgc3RhdGUiOworCWlmIChzdGF0dXNfd2FudCA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGwiKSkKKwkJcmV0dXJuICJpcyBtYXJrZWQgdG8gYmUgaW5zdGFsbGVkIjsKKworCXJldHVybiAiaXMgbm90IGluc3RhbGxlZCBvciBmbGFnZ2VkIHRvIGJlIGluc3RhbGxlZCI7Cit9CisKK3N0YXRpYyB2b2lkIGluZGV4X3N0YXR1c19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKnN0YXR1c19maWxlOworCWNoYXIgKmNvbnRyb2xfYnVmZmVyOworCWNoYXIgKnN0YXR1c19saW5lOworCXN0YXR1c19ub2RlX3QgKnN0YXR1c19ub2RlID0gTlVMTDsKKwl1bnNpZ25lZCBzdGF0dXNfbnVtOworCisJc3RhdHVzX2ZpbGUgPSB4Zm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCXdoaWxlICgoY29udHJvbF9idWZmZXIgPSB4bWFsbG9jX2ZnZXRsaW5lX3N0cihzdGF0dXNfZmlsZSwgIlxuXG4iKSkgIT0gTlVMTCkgeworCQljb25zdCB1bnNpZ25lZCBwYWNrYWdlX251bSA9IGZpbGxfcGFja2FnZV9zdHJ1Y3QoY29udHJvbF9idWZmZXIpOworCQlpZiAocGFja2FnZV9udW0gIT0gLTEpIHsKKwkJCXN0YXR1c19ub2RlID0geG1hbGxvYyhzaXplb2Yoc3RhdHVzX25vZGVfdCkpOworCQkJLyogZmlsbF9wYWNrYWdlX3N0cnVjdCBkb2VzbnQgaGFuZGxlIHRoZSBzdGF0dXMgZmllbGQgKi8KKwkJCXN0YXR1c19saW5lID0gc3Ryc3RyKGNvbnRyb2xfYnVmZmVyLCAiU3RhdHVzOiIpOworCQkJaWYgKHN0YXR1c19saW5lICE9IE5VTEwpIHsKKwkJCQlzdGF0dXNfbGluZSArPSA3OworCQkJCXN0YXR1c19saW5lICs9IHN0cnNwbihzdGF0dXNfbGluZSwgIiBcblx0Iik7CisJCQkJc3RhdHVzX2xpbmUgPSB4c3RybmR1cChzdGF0dXNfbGluZSwgc3RyY3NwbihzdGF0dXNfbGluZSwgIlxuIikpOworCQkJCXN0YXR1c19ub2RlLT5zdGF0dXMgPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoc3RhdHVzX2xpbmUpOworCQkJCWZyZWUoc3RhdHVzX2xpbmUpOworCQkJfQorCQkJc3RhdHVzX25vZGUtPnBhY2thZ2UgPSBwYWNrYWdlX251bTsKKwkJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtzdGF0dXNfbm9kZS0+cGFja2FnZV0tPm5hbWVdKTsKKwkJCXN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPSBzdGF0dXNfbm9kZTsKKwkJfQorCQlmcmVlKGNvbnRyb2xfYnVmZmVyKTsKKwl9CisJZmNsb3NlKHN0YXR1c19maWxlKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfYnVmZmVyX25vX3N0YXR1cyhGSUxFICpuZXdfc3RhdHVzX2ZpbGUsIGNvbnN0IGNoYXIgKmNvbnRyb2xfYnVmZmVyKQoreworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWU7CisJaW50IHN0YXJ0ID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdGFydCArPSByZWFkX3BhY2thZ2VfZmllbGQoJmNvbnRyb2xfYnVmZmVyW3N0YXJ0XSwgJm5hbWUsICZ2YWx1ZSk7CisJCWlmIChuYW1lID09IE5VTEwpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJjbXAobmFtZSwgIlN0YXR1cyIpICE9IDApIHsKKwkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiJXM6ICVzXG4iLCBuYW1lLCB2YWx1ZSk7CisJCX0KKwl9Cit9CisKKy8qIFRoaXMgY291bGQgZG8gd2l0aCBhIGNsZWFudXAgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXR1c19maWxlKGRlYl9maWxlX3QgKipkZWJfZmlsZSkKK3sKKwlGSUxFICpvbGRfc3RhdHVzX2ZpbGUgPSB4Zm9wZW5fZm9yX3JlYWQoIi92YXIvbGliL2Rwa2cvc3RhdHVzIik7CisJRklMRSAqbmV3X3N0YXR1c19maWxlID0geGZvcGVuX2Zvcl93cml0ZSgiL3Zhci9saWIvZHBrZy9zdGF0dXMudWRlYiIpOworCWNoYXIgKnBhY2thZ2VfbmFtZTsKKwljaGFyICpzdGF0dXNfZnJvbV9maWxlOworCWNoYXIgKmNvbnRyb2xfYnVmZmVyID0gTlVMTDsKKwljaGFyICp0bXBfc3RyaW5nOworCWludCBzdGF0dXNfbnVtOworCWludCBmaWVsZF9zdGFydCA9IDA7CisJaW50IHdyaXRlX2ZsYWc7CisJaW50IGkgPSAwOworCisJLyogVXBkYXRlIHByZXZpb3VzbHkga25vd24gcGFja2FnZXMgKi8KKwl3aGlsZSAoKGNvbnRyb2xfYnVmZmVyID0geG1hbGxvY19mZ2V0bGluZV9zdHIob2xkX3N0YXR1c19maWxlLCAiXG5cbiIpKSAhPSBOVUxMKSB7CisJCXRtcF9zdHJpbmcgPSBzdHJzdHIoY29udHJvbF9idWZmZXIsICJQYWNrYWdlOiIpOworCQlpZiAodG1wX3N0cmluZyA9PSBOVUxMKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXRtcF9zdHJpbmcgKz0gODsKKwkJdG1wX3N0cmluZyArPSBzdHJzcG4odG1wX3N0cmluZywgIiBcblx0Iik7CisJCXBhY2thZ2VfbmFtZSA9IHhzdHJuZHVwKHRtcF9zdHJpbmcsIHN0cmNzcG4odG1wX3N0cmluZywgIlxuIikpOworCQl3cml0ZV9mbGFnID0gRkFMU0U7CisJCXRtcF9zdHJpbmcgPSBzdHJzdHIoY29udHJvbF9idWZmZXIsICJTdGF0dXM6Iik7CisJCWlmICh0bXBfc3RyaW5nICE9IE5VTEwpIHsKKwkJCS8qIFNlcGFyYXRlIHRoZSBzdGF0dXMgdmFsdWUgZnJvbSB0aGUgY29udHJvbCBidWZmZXIgKi8KKwkJCXRtcF9zdHJpbmcgKz0gNzsKKwkJCXRtcF9zdHJpbmcgKz0gc3Ryc3BuKHRtcF9zdHJpbmcsICIgXG5cdCIpOworCQkJc3RhdHVzX2Zyb21fZmlsZSA9IHhzdHJuZHVwKHRtcF9zdHJpbmcsIHN0cmNzcG4odG1wX3N0cmluZywgIlxuIikpOworCQl9IGVsc2UgeworCQkJc3RhdHVzX2Zyb21fZmlsZSA9IE5VTEw7CisJCX0KKworCQkvKiBGaW5kIHRoaXMgcGFja2FnZSBpbiB0aGUgc3RhdHVzIGhhc2h0YWJsZSAqLworCQlzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUocGFja2FnZV9uYW1lKTsKKwkJaWYgKHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gIT0gTlVMTCkgeworCQkJY29uc3QgY2hhciAqc3RhdHVzX2Zyb21faGFzaHRhYmxlID0gbmFtZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXS0+c3RhdHVzXTsKKwkJCWlmIChzdHJjbXAoc3RhdHVzX2Zyb21fZmlsZSwgc3RhdHVzX2Zyb21faGFzaHRhYmxlKSAhPSAwKSB7CisJCQkJLyogTmV3IHN0YXR1cyBpc250IGV4YWN0bHkgdGhlIHNhbWUgYXMgb2xkIHN0YXR1cyAqLworCQkJCWNvbnN0IGludCBzdGF0ZV9zdGF0dXMgPSBnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpOworCQkJCWlmICgoc3RyY21wKCJpbnN0YWxsZWQiLCBuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdKSA9PSAwKQorCQkJCSB8fCAoc3RyY21wKCJ1bnBhY2tlZCIsIG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10pID09IDApCisJCQkJKSB7CisJCQkJCS8qIFdlIG5lZWQgdG8gYWRkIHRoZSBjb250cm9sIGZpbGUgZnJvbSB0aGUgcGFja2FnZSAqLworCQkJCQlpID0gMDsKKwkJCQkJd2hpbGUgKGRlYl9maWxlW2ldICE9IE5VTEwpIHsKKwkJCQkJCWlmIChzdHJjbXAocGFja2FnZV9uYW1lLCBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZVtpXS0+cGFja2FnZV0tPm5hbWVdKSA9PSAwKSB7CisJCQkJCQkJLyogV3JpdGUgYSBzdGF0dXMgZmlsZSBlbnRyeSB3aXRoIGEgbW9kaWZpZWQgc3RhdHVzICovCisJCQkJCQkJLyogcmVtb3ZlIHRyYWlsaW5nIFxuJ3MgKi8KKwkJCQkJCQl3cml0ZV9idWZmZXJfbm9fc3RhdHVzKG5ld19zdGF0dXNfZmlsZSwgZGViX2ZpbGVbaV0tPmNvbnRyb2xfZmlsZSk7CisJCQkJCQkJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAib2siLCAyKTsKKwkJCQkJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIlN0YXR1czogJXNcblxuIiwKKwkJCQkJCQkJCW5hbWVfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0tPnN0YXR1c10pOworCQkJCQkJCXdyaXRlX2ZsYWcgPSBUUlVFOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaSsrOworCQkJCQl9CisJCQkJCS8qIFRoaXMgaXMgdGVtcGVyYXJ5LCBkZWJ1Z2dpbmcgb25seSAqLworCQkJCQlpZiAoZGViX2ZpbGVbaV0gPT0gTlVMTCkgeworCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkFMRVJUOiBjYW5ub3QgZmluZCBhIGNvbnRyb2wgZmlsZSwgIgorCQkJCQkJCSJ5b3VyIHN0YXR1cyBmaWxlIG1heSBiZSBicm9rZW4sIHN0YXR1cyBtYXkgYmUgIgorCQkJCQkJCSJpbmNvcnJlY3QgZm9yICVzIiwgcGFja2FnZV9uYW1lKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChzdHJjbXAoIm5vdC1pbnN0YWxsZWQiLCBuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdKSA9PSAwKSB7CisJCQkJCS8qIE9ubHkgd3JpdGUgdGhlIFBhY2thZ2UsIFN0YXR1cywgUHJpb3JpdHkgYW5kIFNlY3Rpb24gbGluZXMgKi8KKwkJCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICJQYWNrYWdlOiAlc1xuIiwgcGFja2FnZV9uYW1lKTsKKwkJCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICJTdGF0dXM6ICVzXG4iLCBzdGF0dXNfZnJvbV9oYXNodGFibGUpOworCisJCQkJCXdoaWxlICgxKSB7CisJCQkJCQljaGFyICpmaWVsZF9uYW1lOworCQkJCQkJY2hhciAqZmllbGRfdmFsdWU7CisJCQkJCQlmaWVsZF9zdGFydCArPSByZWFkX3BhY2thZ2VfZmllbGQoJmNvbnRyb2xfYnVmZmVyW2ZpZWxkX3N0YXJ0XSwgJmZpZWxkX25hbWUsICZmaWVsZF92YWx1ZSk7CisJCQkJCQlpZiAoZmllbGRfbmFtZSA9PSBOVUxMKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoKHN0cmNtcChmaWVsZF9uYW1lLCAiUHJpb3JpdHkiKSA9PSAwKQorCQkJCQkJIHx8IChzdHJjbXAoZmllbGRfbmFtZSwgIlNlY3Rpb24iKSA9PSAwKQorCQkJCQkJKSB7CisJCQkJCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICIlczogJXNcbiIsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl3cml0ZV9mbGFnID0gVFJVRTsKKwkJCQkJZnB1dHMoIlxuIiwgbmV3X3N0YXR1c19maWxlKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoc3RyY21wKCJjb25maWctZmlsZXMiLCBuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdKSA9PSAwKSB7CisJCQkJCS8qIG9ubHkgY2hhbmdlIHRoZSBzdGF0dXMgbGluZSAqLworCQkJCQl3aGlsZSAoMSkgeworCQkJCQkJY2hhciAqZmllbGRfbmFtZTsKKwkJCQkJCWNoYXIgKmZpZWxkX3ZhbHVlOworCQkJCQkJZmllbGRfc3RhcnQgKz0gcmVhZF9wYWNrYWdlX2ZpZWxkKCZjb250cm9sX2J1ZmZlcltmaWVsZF9zdGFydF0sICZmaWVsZF9uYW1lLCAmZmllbGRfdmFsdWUpOworCQkJCQkJaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLyogU2V0dXAgc3RhcnQgcG9pbnQgZm9yIG5leHQgZmllbGQgKi8KKwkJCQkJCWlmIChzdHJjbXAoZmllbGRfbmFtZSwgIlN0YXR1cyIpID09IDApIHsKKwkJCQkJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIlN0YXR1czogJXNcbiIsIHN0YXR1c19mcm9tX2hhc2h0YWJsZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiJXM6ICVzXG4iLCBmaWVsZF9uYW1lLCBmaWVsZF92YWx1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJd3JpdGVfZmxhZyA9IFRSVUU7CisJCQkJCWZwdXRzKCJcbiIsIG5ld19zdGF0dXNfZmlsZSk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIElmIHRoZSBwYWNrYWdlIGZyb20gdGhlIHN0YXR1cyBmaWxlIHdhc250IGhhbmRsZSBhYm92ZSwgZG8gaXQgbm93Ki8KKwkJaWYgKCF3cml0ZV9mbGFnKSB7CisJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIiVzXG5cbiIsIGNvbnRyb2xfYnVmZmVyKTsKKwkJfQorCisJCWZyZWUoc3RhdHVzX2Zyb21fZmlsZSk7CisJCWZyZWUocGFja2FnZV9uYW1lKTsKKwkJZnJlZShjb250cm9sX2J1ZmZlcik7CisJfQorCisJLyogV3JpdGUgYW55IG5ldyBwYWNrYWdlcyAqLworCWZvciAoaSA9IDA7IGRlYl9maWxlW2ldICE9IE5VTEw7IGkrKykgeworCQlzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUobmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbaV0tPnBhY2thZ2VdLT5uYW1lXSk7CisJCWlmIChzdHJjbXAoInJlaW5zdHJlcSIsIG5hbWVfaGFzaHRhYmxlW2dldF9zdGF0dXMoc3RhdHVzX251bSwgMildKSA9PSAwKSB7CisJCQl3cml0ZV9idWZmZXJfbm9fc3RhdHVzKG5ld19zdGF0dXNfZmlsZSwgZGViX2ZpbGVbaV0tPmNvbnRyb2xfZmlsZSk7CisJCQlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJvayIsIDIpOworCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICJTdGF0dXM6ICVzXG5cbiIsIG5hbWVfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0tPnN0YXR1c10pOworCQl9CisJfQorCWZjbG9zZShvbGRfc3RhdHVzX2ZpbGUpOworCWZjbG9zZShuZXdfc3RhdHVzX2ZpbGUpOworCisJLyogQ3JlYXRlIGEgc2VwYXJhdGUgYmFja2ZpbGUgdG8gZHBrZyAqLworCWlmIChyZW5hbWUoIi92YXIvbGliL2Rwa2cvc3RhdHVzIiwgIi92YXIvbGliL2Rwa2cvc3RhdHVzLnVkZWIuYmFrIikgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjcmVhdGUgYmFja3VwIHN0YXR1cyBmaWxlIik7CisJCS8qIEl0cyBvayBpZiByZW5hbWluZyB0aGUgc3RhdHVzIGZpbGUgZmFpbHMgYmVjYXVzZSBzdGF0dXMKKwkJICogZmlsZSBkb2VzbnQgZXhpc3QsIG1heWJlIHdlIGFyZSBzdGFydGluZyBmcm9tIHNjcmF0Y2ggKi8KKwkJYmJfZXJyb3JfbXNnKCJubyBzdGF0dXMgZmlsZSBmb3VuZCwgY3JlYXRpbmcgbmV3IG9uZSIpOworCX0KKworCXhyZW5hbWUoIi92YXIvbGliL2Rwa2cvc3RhdHVzLnVkZWIiLCAiL3Zhci9saWIvZHBrZy9zdGF0dXMiKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIGdpdmVuIHBhY2thZ2UgY2FuIHNhdGlzZnkgYQorICogZGVwZW5kZW5jeSBvZiB0eXBlIGRlcGVuZF90eXBlLgorICoKKyAqIEEgcHJlLWRlcGVuZHMgaXMgc2F0aXNmaWVkIG9ubHkgaWYgYSBwYWNrYWdlIGlzIGFscmVhZHkgaW5zdGFsbGVkLAorICogd2hpY2ggYSByZWd1bGFyIGRlcGVuZHMgY2FuIGJlIHNhdGlzZmllZCBieSBhIHBhY2thZ2Ugd2hpY2ggd2Ugd2FudAorICogdG8gaW5zdGFsbC4KKyAqLworc3RhdGljIGludCBwYWNrYWdlX3NhdGlzZmllc19kZXBlbmRlbmN5KGludCBwYWNrYWdlLCBpbnQgZGVwZW5kX3R5cGUpCit7CisJaW50IHN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlXS0+bmFtZV0pOworCisJLyogc3RhdHVzIGNvdWxkIGJlIHVua25vd24gaWYgcGFja2FnZSBpcyBhIHB1cmUgdmlydHVhbAorCSAqIHByb3ZpZGVzIHdoaWNoIGNhbm5vdCBzYXRpc2Z5IGFueSBkZXBlbmRlbmN5IGJ5IGl0c2VsZi4KKwkgKi8KKwlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZGVwZW5kX3R5cGUpIHsKKwljYXNlIEVER0VfUFJFX0RFUEVORFM6IHJldHVybiBnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbGVkIik7CisJY2FzZSBFREdFX0RFUEVORFM6ICAgICByZXR1cm4gZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAxKSA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGwiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGVwcyhkZWJfZmlsZV90ICoqZGViX2ZpbGUsIGludCBkZWJfc3RhcnQgLyosIGludCBkZXBfbWF4X2NvdW50IC0gPz8gKi8pCit7CisJaW50ICpjb25mbGljdHMgPSBOVUxMOworCWludCBjb25mbGljdHNfbnVtID0gMDsKKwlpbnQgaSA9IGRlYl9zdGFydDsKKwlpbnQgajsKKworCS8qIENoZWNrIGZvciBjb25mbGljdHMKKwkgKiBUT0RPOiBURVNUIGlmIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZAorCSAqCisJICogQWRkIGluc3RhbGwgcGFja2FnZXMgYW5kIHRoZSBwYWNrYWdlcyB0aGV5IHByb3ZpZGUKKwkgKiB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBjaGVjayBjb25mbGljdHMgZm9yCisJICovCisKKwkvKiBDcmVhdGUgYXJyYXkgb2YgcGFja2FnZSBudW1iZXJzIHRvIGNoZWNrIGFnYWluc3QKKwkgKiBpbnN0YWxsZWQgcGFja2FnZSBmb3IgY29uZmxpY3RzKi8KKwl3aGlsZSAoZGViX2ZpbGVbaV0gIT0gTlVMTCkgeworCQljb25zdCB1bnNpZ25lZCBwYWNrYWdlX251bSA9IGRlYl9maWxlW2ldLT5wYWNrYWdlOworCQljb25mbGljdHMgPSB4cmVhbGxvY192ZWN0b3IoY29uZmxpY3RzLCAyLCBjb25mbGljdHNfbnVtKTsKKwkJY29uZmxpY3RzW2NvbmZsaWN0c19udW1dID0gcGFja2FnZV9udW07CisJCWNvbmZsaWN0c19udW0rKzsKKwkJLyogYWRkIHByb3ZpZGVzIHRvIGNvbmZsaWN0cyBsaXN0ICovCisJCWZvciAoaiA9IDA7IGogPCBwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm51bV9vZl9lZGdlczsgaisrKSB7CisJCQlpZiAocGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5lZGdlW2pdLT50eXBlID09IEVER0VfUFJPVklERVMpIHsKKwkJCQljb25zdCBpbnQgY29uZmxpY3RzX3BhY2thZ2VfbnVtID0gc2VhcmNoX3BhY2thZ2VfaGFzaHRhYmxlKAorCQkJCQlwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPmVkZ2Vbal0tPm5hbWUsCisJCQkJCXBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+ZWRnZVtqXS0+dmVyc2lvbiwKKwkJCQkJcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5lZGdlW2pdLT5vcGVyYXRvcik7CisJCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW2NvbmZsaWN0c19wYWNrYWdlX251bV0gPT0gTlVMTCkgeworCQkJCQkvKiBjcmVhdGUgYSBuZXcgcGFja2FnZSAqLworCQkJCQljb21tb25fbm9kZV90ICpuZXdfbm9kZSA9IHh6YWxsb2Moc2l6ZW9mKGNvbW1vbl9ub2RlX3QpKTsKKwkJCQkJbmV3X25vZGUtPm5hbWUgPSBwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPmVkZ2Vbal0tPm5hbWU7CisJCQkJCW5ld19ub2RlLT52ZXJzaW9uID0gcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5lZGdlW2pdLT52ZXJzaW9uOworCQkJCQlwYWNrYWdlX2hhc2h0YWJsZVtjb25mbGljdHNfcGFja2FnZV9udW1dID0gbmV3X25vZGU7CisJCQkJfQorCQkJCWNvbmZsaWN0cyA9IHhyZWFsbG9jX3ZlY3Rvcihjb25mbGljdHMsIDIsIGNvbmZsaWN0c19udW0pOworCQkJCWNvbmZsaWN0c1tjb25mbGljdHNfbnVtXSA9IGNvbmZsaWN0c19wYWNrYWdlX251bTsKKwkJCQljb25mbGljdHNfbnVtKys7CisJCQl9CisJCX0KKwkJaSsrOworCX0KKworCS8qIENoZWNrIGNvbmZsaWN0cyAqLworCWkgPSAwOworCXdoaWxlIChkZWJfZmlsZVtpXSAhPSBOVUxMKSB7CisJCWNvbnN0IGNvbW1vbl9ub2RlX3QgKnBhY2thZ2Vfbm9kZSA9IHBhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2ldLT5wYWNrYWdlXTsKKwkJaW50IHN0YXR1c19udW0gPSAwOworCQlzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUobmFtZV9oYXNodGFibGVbcGFja2FnZV9ub2RlLT5uYW1lXSk7CisKKwkJaWYgKGdldF9zdGF0dXMoc3RhdHVzX251bSwgMykgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsZWQiKSkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgcGFja2FnZV9ub2RlLT5udW1fb2ZfZWRnZXM7IGorKykgeworCQkJY29uc3QgZWRnZV90ICpwYWNrYWdlX2VkZ2UgPSBwYWNrYWdlX25vZGUtPmVkZ2Vbal07CisKKwkJCWlmIChwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9DT05GTElDVFMpIHsKKwkJCQljb25zdCB1bnNpZ25lZCBwYWNrYWdlX251bSA9CisJCQkJCXNlYXJjaF9wYWNrYWdlX2hhc2h0YWJsZShwYWNrYWdlX2VkZ2UtPm5hbWUsCisJCQkJCQkJCSBwYWNrYWdlX2VkZ2UtPnZlcnNpb24sCisJCQkJCQkJCSBwYWNrYWdlX2VkZ2UtPm9wZXJhdG9yKTsKKwkJCQlpbnQgcmVzdWx0ID0gMDsKKwkJCQlpZiAocGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dICE9IE5VTEwpIHsKKwkJCQkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+bmFtZV0pOworCisJCQkJCWlmIChnZXRfc3RhdHVzKHN0YXR1c19udW0sIDEpID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbCIpKSB7CisJCQkJCQlyZXN1bHQgPSB0ZXN0X3ZlcnNpb24ocGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbaV0tPnBhY2thZ2VdLT52ZXJzaW9uLAorCQkJCQkJCXBhY2thZ2VfZWRnZS0+dmVyc2lvbiwgcGFja2FnZV9lZGdlLT5vcGVyYXRvcik7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocmVzdWx0KSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYWNrYWdlICVzIGNvbmZsaWN0cyB3aXRoICVzIiwKKwkJCQkJCW5hbWVfaGFzaHRhYmxlW3BhY2thZ2Vfbm9kZS0+bmFtZV0sCisJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2VkZ2UtPm5hbWVdKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaSsrOworCX0KKworCisJLyogQ2hlY2sgZGVwZW5kZW5kY2llcyAqLworCWZvciAoaSA9IDA7IGkgPCBQQUNLQUdFX0hBU0hfUFJJTUU7IGkrKykgeworCQlpbnQgc3RhdHVzX251bSA9IDA7CisJCWludCBudW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID0gMDsKKwkJY29uc3QgZWRnZV90ICogcm9vdF9vZl9hbHRlcm5hdGl2ZXMgPSBOVUxMOworCQljb25zdCBjb21tb25fbm9kZV90ICpwYWNrYWdlX25vZGUgPSBwYWNrYWdlX2hhc2h0YWJsZVtpXTsKKworCQkvKiBJZiB0aGUgcGFja2FnZSBub2RlIGRvZXMgbm90IGV4aXN0IHRoZW4gdGhpcworCQkgKiBwYWNrYWdlIGlzIGEgdmlydHVhbCBvbmUuIEluIHdoaWNoIGNhc2UgdGhlcmUgYXJlCisJCSAqIG5vIGRlcGVuZGVuY2llcyB0byBjaGVjay4KKwkJICovCisJCWlmIChwYWNrYWdlX25vZGUgPT0gTlVMTCkgY29udGludWU7CisKKwkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2Vfbm9kZS0+bmFtZV0pOworCisJCS8qIElmIHRoZXJlIGlzIG5vIHN0YXR1cyB0aGVuIHRoaXMgcGFja2FnZSBpcyBhCisJCSAqIHZpcnR1YWwgb25lIHByb3ZpZGVkIGJ5IHNvbWV0aGluZyBlbHNlLiBJbiB3aGljaAorCQkgKiBjYXNlIHRoZXJlIGFyZSBubyBkZXBlbmRlbmNpZXMgdG8gY2hlY2suCisJCSAqLworCQlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9PSBOVUxMKSBjb250aW51ZTsKKworCQkvKiBJZiB3ZSBkb24ndCB3YW50IHRoaXMgcGFja2FnZSBpbnN0YWxsZWQgdGhlbiB3ZSBtYXkKKwkJICogYXMgd2VsbCBpZ25vcmUgaXQncyBkZXBlbmRlbmNpZXMuCisJCSAqLworCQlpZiAoZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAxKSAhPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGwiKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGlzIGNvZGUgaXMgdGVzdGVkIG9ubHkgZm9yIEVER0VfREVQRU5EUywgc2luY2UgSQorCQkgKiBoYXZlIG5vIHN1aXRhYmxlIHByZS1kZXBlbmRzIGF2YWlsYWJsZS4gVGhlcmUgaXMgbm8KKwkJICogcmVhc29uIHRoYXQgaXQgc2hvdWxkbid0IHdvcmsgdGhvdWdoIDotKQorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IHBhY2thZ2Vfbm9kZS0+bnVtX29mX2VkZ2VzOyBqKyspIHsKKwkJCWNvbnN0IGVkZ2VfdCAqcGFja2FnZV9lZGdlID0gcGFja2FnZV9ub2RlLT5lZGdlW2pdOworCQkJdW5zaWduZWQgcGFja2FnZV9udW07CisKKwkJCWlmIChwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9PUl9QUkVfREVQRU5EUworCQkJIHx8IHBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX09SX0RFUEVORFMKKwkJCSkgeworCQkJCS8qIHN0YXJ0IGFuIEVER0VfT1JfIGxpc3QgKi8KKwkJCQludW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID0gcGFja2FnZV9lZGdlLT52ZXJzaW9uOworCQkJCXJvb3Rfb2ZfYWx0ZXJuYXRpdmVzID0gcGFja2FnZV9lZGdlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPT0gMCkgeyAgLyogbm90IGluIHRoZSBtaWRkbGUgb2YgYW4gRURHRV9PUl8gbGlzdCAqLworCQkJCW51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPSAxOworCQkJCXJvb3Rfb2ZfYWx0ZXJuYXRpdmVzID0gTlVMTDsKKwkJCX0KKworCQkJcGFja2FnZV9udW0gPSBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUocGFja2FnZV9lZGdlLT5uYW1lLCBwYWNrYWdlX2VkZ2UtPnZlcnNpb24sIHBhY2thZ2VfZWRnZS0+b3BlcmF0b3IpOworCisJCQlpZiAocGFja2FnZV9lZGdlLT50eXBlID09IEVER0VfUFJFX0RFUEVORFMKKwkJCSB8fCBwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9ERVBFTkRTCisJCQkpIHsKKwkJCQlpbnQgcmVzdWx0PTE7CisJCQkJc3RhdHVzX251bSA9IDA7CisKKwkJCQkvKiBJZiB3ZSBhcmUgaW5zaWRlIGFuIGFsdGVybmF0aXZlIHRoZW4gY2hlY2sKKwkJCQkgKiB0aGlzIGVkZ2UgaXMgdGhlIHJpZ2h0IHR5cGUuCisJCQkJICoKKwkJCQkgKiBFREdFX0RFUEVORFMgPT0gT1JfREVQRU5EUyAtMQorCQkJCSAqIEVER0VfUFJFX0RFUEVORFMgPT0gT1JfUFJFX0RFUEVORFMgLTEKKwkJCQkgKi8KKwkJCQlpZiAocm9vdF9vZl9hbHRlcm5hdGl2ZXMgJiYgcGFja2FnZV9lZGdlLT50eXBlICE9IHJvb3Rfb2ZfYWx0ZXJuYXRpdmVzLT50eXBlIC0gMSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZhdGFsIGVycm9yLCBwYWNrYWdlIGRlcGVuZGVuY2llcyBjb3JydXB0OiAlZCAhPSAlZCAtIDEiLAorCQkJCQkJCSAgICAgcGFja2FnZV9lZGdlLT50eXBlLCByb290X29mX2FsdGVybmF0aXZlcy0+dHlwZSk7CisKKwkJCQlpZiAocGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dICE9IE5VTEwpCisJCQkJCXJlc3VsdCA9ICFwYWNrYWdlX3NhdGlzZmllc19kZXBlbmRlbmN5KHBhY2thZ2VfbnVtLCBwYWNrYWdlX2VkZ2UtPnR5cGUpOworCisJCQkJaWYgKHJlc3VsdCkgeyAvKiBjaGVjayBmb3Igb3RoZXIgcGFja2FnZSB3aGljaCBwcm92aWRlIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJCQkJCWludCBwcm92aWRlciA9IC0xOworCisJCQkJCXdoaWxlICgocHJvdmlkZXIgPSBzZWFyY2hfZm9yX3Byb3ZpZGVzKHBhY2thZ2VfZWRnZS0+bmFtZSwgcHJvdmlkZXIpKSA+IC0xKSB7CisJCQkJCQlpZiAocGFja2FnZV9oYXNodGFibGVbcHJvdmlkZXJdID09IE5VTEwpIHsKKwkJCQkJCQlwdXRzKCJIYXZlIGEgcHJvdmlkZXIgYnV0IG5vIHBhY2thZ2UgaW5mb3JtYXRpb24gZm9yIGl0Iik7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlyZXN1bHQgPSAhcGFja2FnZV9zYXRpc2ZpZXNfZGVwZW5kZW5jeShwcm92aWRlciwgcGFja2FnZV9lZGdlLT50eXBlKTsKKworCQkJCQkJaWYgKHJlc3VsdCA9PSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogSXQgbXVzdCBiZSBhbHJlYWR5IGluc3RhbGxlZCwgb3IgdG8gYmUgaW5zdGFsbGVkICovCisJCQkJbnVtYmVyX29mX2FsdGVybmF0aXZlcy0tOworCQkJCWlmIChyZXN1bHQgJiYgbnVtYmVyX29mX2FsdGVybmF0aXZlcyA9PSAwKSB7CisJCQkJCWlmIChyb290X29mX2FsdGVybmF0aXZlcykKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCQkJCSJwYWNrYWdlICVzICVzZGVwZW5kcyBvbiAlcywgIgorCQkJCQkJCSJ3aGljaCBjYW5ub3QgYmUgc2F0aXNmaWVkIiwKKwkJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX25vZGUtPm5hbWVdLAorCQkJCQkJCXBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX1BSRV9ERVBFTkRTID8gInByZS0iIDogIiIsCisJCQkJCQkJbmFtZV9oYXNodGFibGVbcm9vdF9vZl9hbHRlcm5hdGl2ZXMtPm5hbWVdKTsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJCQkicGFja2FnZSAlcyAlc2RlcGVuZHMgb24gJXMsIHdoaWNoICVzXG4iLAorCQkJCQkJbmFtZV9oYXNodGFibGVbcGFja2FnZV9ub2RlLT5uYW1lXSwKKwkJCQkJCXBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX1BSRV9ERVBFTkRTID8gInByZS0iIDogIiIsCisJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2VkZ2UtPm5hbWVdLAorCQkJCQkJZGVzY3JpYmVfc3RhdHVzKHN0YXR1c19udW0pKTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA9PSAwICYmIG51bWJlcl9vZl9hbHRlcm5hdGl2ZXMpIHsKKwkJCQkJLyogd2UndmUgZm91bmQgYSBwYWNrYWdlIHdoaWNoCisJCQkJCSAqIHNhdGlzZmllcyB0aGUgZGVwZW5kZW5jeSwKKwkJCQkJICogc28gc2tpcCBvdmVyIHRoZSByZXN0IG9mCisJCQkJCSAqIHRoZSBhbHRlcm5hdGl2ZXMuCisJCQkJCSAqLworCQkJCQlqICs9IG51bWJlcl9vZl9hbHRlcm5hdGl2ZXM7CisJCQkJCW51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlmcmVlKGNvbmZsaWN0cyk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjaGFyICoqY3JlYXRlX2xpc3QoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqbGlzdF9zdHJlYW07CisJY2hhciAqKmZpbGVfbGlzdDsKKwljaGFyICpsaW5lOworCWludCBjb3VudDsKKworCS8qIGRvbid0IHVzZSBbeHddZm9wZW4gaGVyZSwgaGFuZGxlIGVycm9yIG91cnNlbGYgKi8KKwlsaXN0X3N0cmVhbSA9IGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKwlpZiAobGlzdF9zdHJlYW0gPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmaWxlX2xpc3QgPSBOVUxMOworCWNvdW50ID0gMDsKKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGxpc3Rfc3RyZWFtKSkgIT0gTlVMTCkgeworCQlmaWxlX2xpc3QgPSB4cmVhbGxvY192ZWN0b3IoZmlsZV9saXN0LCAyLCBjb3VudCk7CisJCWZpbGVfbGlzdFtjb3VudCsrXSA9IGxpbmU7CisJCS8qZmlsZV9saXN0W2NvdW50XSA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCX0KKwlmY2xvc2UobGlzdF9zdHJlYW0pOworCisJcmV0dXJuIGZpbGVfbGlzdDsKK30KKworLyogbWF5YmUgaSBzaG91bGQgdHJ5IGFuZCBob29rIHRoaXMgaW50byByZW1vdmVfZmlsZS5jIHNvbWVob3cgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2ZpbGVfYXJyYXkoY2hhciAqKnJlbW92ZV9uYW1lcywgY2hhciAqKmV4Y2x1ZGVfbmFtZXMpCit7CisJc3RydWN0IHN0YXQgcGF0aF9zdGF0OworCWludCByZW1vdmVfZmxhZyA9IDE7IC8qIG5vdCByZW1vdmVkIGFueXRoaW5nIHlldCAqLworCWludCBpLCBqOworCisJaWYgKHJlbW92ZV9uYW1lcyA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSAwOyByZW1vdmVfbmFtZXNbaV0gIT0gTlVMTDsgaSsrKSB7CisJCWlmIChleGNsdWRlX25hbWVzICE9IE5VTEwpIHsKKwkJCWZvciAoaiA9IDA7IGV4Y2x1ZGVfbmFtZXNbal0gIT0gTlVMTDsgaisrKSB7CisJCQkJaWYgKHN0cmNtcChyZW1vdmVfbmFtZXNbaV0sIGV4Y2x1ZGVfbmFtZXNbal0pID09IDApIHsKKwkJCQkJZ290byBza2lwOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBUT0RPOiB3aHkgd2UgYXJlIGNoZWNraW5nIGxzdGF0PyB3ZSBjYW4ganVzdCB0cnkgcm0vcm1kaXIgKi8KKwkJaWYgKGxzdGF0KHJlbW92ZV9uYW1lc1tpXSwgJnBhdGhfc3RhdCkgPCAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoU19JU0RJUihwYXRoX3N0YXQuc3RfbW9kZSkpIHsKKwkJCXJlbW92ZV9mbGFnICY9IHJtZGlyKHJlbW92ZV9uYW1lc1tpXSk7IC8qIDAgaWYgbm8gZXJyb3IgKi8KKwkJfSBlbHNlIHsKKwkJCXJlbW92ZV9mbGFnICY9IHVubGluayhyZW1vdmVfbmFtZXNbaV0pOyAvKiAwIGlmIG5vIGVycm9yICovCisJCX0KKyBza2lwOgorCQljb250aW51ZTsKKwl9CisJcmV0dXJuIChyZW1vdmVfZmxhZyA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgcnVuX3BhY2thZ2Vfc2NyaXB0X29yX2RpZShjb25zdCBjaGFyICpwYWNrYWdlX25hbWUsIGNvbnN0IGNoYXIgKnNjcmlwdF90eXBlKQoreworCWNoYXIgKnNjcmlwdF9wYXRoOworCWludCByZXN1bHQ7CisKKwlzY3JpcHRfcGF0aCA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCBzY3JpcHRfdHlwZSk7CisKKwkvKiBJZiB0aGUgZmlsZSBkb2VzbnQgZXhpc3QgaXMgaXNudCBmYXRhbCAqLworCXJlc3VsdCA9IGFjY2VzcyhzY3JpcHRfcGF0aCwgRl9PSykgPyBFWElUX1NVQ0NFU1MgOiBzeXN0ZW0oc2NyaXB0X3BhdGgpOworCWZyZWUoc2NyaXB0X3BhdGgpOworCWlmIChyZXN1bHQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBmYWlsZWQsIGV4aXQgY29kZSAlZCIsIHNjcmlwdF90eXBlLCByZXN1bHQpOworfQorCisvKgorVGhlIHBvbGljeSBtYW51YWwgZGVmaW5lcyB3aGF0IHNjcmlwdHMgZ2V0IGNhbGxlZCB3aGVuIGFuZCB3aXRoCit3aGF0IGFyZ3VtZW50cy4gSSByZWFsaXplIHRoYXQgYnVzeWJveCBkb2VzIG5vdCBzdXBwb3J0IGFsbCBvZgordGhlc2Ugc2NlbmFyaW9zLCBidXQgaXQgZG9lcyBzdXBwb3J0IHNvbWUgb2YgdGhlbTsgaXQgZG9lcyBub3QsCitob3dldmVyLCBydW4gdGhlbSB3aXRoIGFueSBwYXJhbWV0ZXJzIGluIHJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUoKS4KK0hlcmUgYXJlIHRoZSBzY3JpcHRzOgorCitwcmVpbnN0IGluc3RhbGwKK3ByZWluc3QgaW5zdGFsbCA8b2xkX3ZlcnNpb24+CitwcmVpbnN0IHVwZ3JhZGUgPG9sZF92ZXJzaW9uPgorcHJlaW5zdCBhYm9ydF91cGdyYWRlIDxuZXdfdmVyc2lvbj4KK3Bvc3RpbnN0IGNvbmZpZ3VyZSA8bW9zdF9yZWNlbnRfdmVyc2lvbj4KK3Bvc3RpbnN0IGFib3J0LXVwZ2FkZSA8bmV3X3ZlcnNpb24+Citwb3N0aW5zdCBhYm9ydC1yZW1vdmUKK3Bvc3RpbnN0IGFib3J0LXJlbW92ZSBpbi1mYXZvdXIgPHBhY2thZ2U+IDx2ZXJzaW9uPgorcG9zdGluc3QgYWJvcnQtZGVjb25maWd1cmUgaW4tZmF2b3IgPGZhaWxlZF9pbnN0YWxsX3BhY2thZ2U+IHJlbW92aW5nIDxjb25mbGljdGluZ19wYWNrYWdlPiA8dmVyc2lvbj4KK3ByZXJtIHJlbW92ZQorcHJlcm0gdXBncmFkZSA8bmV3X3ZlcnNpb24+CitwcmVybSBmYWlsZWQtdXBncmFkZSA8b2xkX3ZlcnNpb24+CitwcmVybSByZW1vdmUgaW4tZmF2b3IgPHBhY2thZ2U+IDxuZXdfdmVyc2lvbj4KK3ByZXJtIGRlY29uZmlndXJlIGluLWZhdm91ciA8cGFja2FnZT4gPHZlcnNpb24+IHJlbW92aW5nIDxwYWNrYWdlPiA8dmVyc2lvbj4KK3Bvc3RybSByZW1vdmUKK3Bvc3RybSBwdXJnZQorcG9zdHJtIHVwZ3JhZGUgPG5ld192ZXJzaW9uPgorcG9zdHJtIGZhaWxlZC11cGdyYWRlIDxvbGRfdmVyc2lvbj4KK3Bvc3RybSBhYm9ydC1pbnN0YWxsCitwb3N0cm0gYWJvcnQtaW5zdGFsbCA8b2xkX3ZlcnNpb24+Citwb3N0cm0gYWJvcnQtdXBncmFkZSA8b2xkX3ZlcnNpb24+Citwb3N0cm0gZGlzYXBwZWFyIDxvdmVyd3JpdGVyPiA8dmVyc2lvbj4KKyovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWxsX2NvbnRyb2xfZmlsZXNbXSA9IHsKKwkicHJlaW5zdCIsICJwb3N0aW5zdCIsICJwcmVybSIsICJwb3N0cm0iLAorCSJsaXN0IiwgIm1kNXN1bXMiLCAic2hsaWJzIiwgImNvbmZmaWxlcyIsCisJImNvbmZpZyIsICJ0ZW1wbGF0ZXMiCit9OworCitzdGF0aWMgY2hhciAqKmFsbF9jb250cm9sX2xpc3QoY29uc3QgY2hhciAqcGFja2FnZV9uYW1lKQoreworCXVuc2lnbmVkIGkgPSAwOworCWNoYXIgKipyZW1vdmVfZmlsZXM7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGFsbCAvdmFyL2xpYi9kcGtnL2luZm8vPHBhY2thZ2U+IGZpbGVzICovCisJcmVtb3ZlX2ZpbGVzID0geHphbGxvYyhzaXplb2YoYWxsX2NvbnRyb2xfZmlsZXMpICsgc2l6ZW9mKGNoYXIqKSk7CisJd2hpbGUgKGkgPCBBUlJBWV9TSVpFKGFsbF9jb250cm9sX2ZpbGVzKSkgeworCQlyZW1vdmVfZmlsZXNbaV0gPSB4YXNwcmludGYoIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsCisJCQkJcGFja2FnZV9uYW1lLCBhbGxfY29udHJvbF9maWxlc1tpXSk7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gcmVtb3ZlX2ZpbGVzOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2FycmF5KGNoYXIgKiphcnJheSkKK3sKKwlpZiAoYXJyYXkpIHsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXdoaWxlIChhcnJheVtpXSkgeworCQkJZnJlZShhcnJheVtpXSk7CisJCQlpKys7CisJCX0KKwkJZnJlZShhcnJheSk7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGxpc3RzIGluZm9ybWF0aW9uIG9uIHRoZSBpbnN0YWxsZWQgcGFja2FnZXMuIEl0IGxvb3BzIHRocm91Z2gKKyAqIHRoZSBzdGF0dXNfaGFzaHRhYmxlIHRvIHJldHJpZXZlIHRoZSBpbmZvLiBUaGlzIHJlc3VsdHMgaW4gc21hbGxlciBjb2RlIHRoYW4KKyAqIHNjYW5uaW5nIHRoZSBzdGF0dXMgZmlsZS4gVGhlIHJlc3VsdGluZyBsaXN0LCBob3dldmVyLCBpcyB1bnNvcnRlZC4KKyAqLworc3RhdGljIHZvaWQgbGlzdF9wYWNrYWdlcyhjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWludCBpOworCisJcHV0cygiICAgIE5hbWUgICAgICAgICAgIFZlcnNpb24iKTsKKwlwdXRzKCIrKystPT09PT09PT09PT09PT0tPT09PT09PT09PT09PT0iKTsKKworCS8qIGdvIHRocm91Z2ggc3RhdHVzIGhhc2gsIGRlcmVmZXJlbmNlIHBhY2thZ2UgaGFzaCBhbmQgZmluYWxseSBzdHJpbmdzICovCisJZm9yIChpID0gMDsgaSA8IFNUQVRVU19IQVNIX1BSSU1FKzE7IGkrKykgeworCQlpZiAoc3RhdHVzX2hhc2h0YWJsZVtpXSkgeworCQkJY29uc3QgY2hhciAqc3RhdF9zdHI7ICAvKiBzdGF0dXMgc3RyaW5nICovCisJCQljb25zdCBjaGFyICpuYW1lX3N0cjsgIC8qIHBhY2thZ2UgbmFtZSAqLworCQkJY29uc3QgY2hhciAqdmVyc19zdHI7ICAvKiB2ZXJzaW9uICovCisJCQljaGFyICBzMSwgczI7ICAgICAgICAgIC8qIHN0YXR1cyBhYmJyZXZpYXRpb25zICovCisJCQlpbnQgICBzcGNjbnQ7ICAgICAgICAgIC8qIHNwYWNlIGNvdW50ICovCisJCQlpbnQgICBqOworCisJCQlzdGF0X3N0ciA9IG5hbWVfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbaV0tPnN0YXR1c107CisJCQluYW1lX3N0ciA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbaV0tPnBhY2thZ2VdLT5uYW1lXTsKKwkJCXZlcnNfc3RyID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtpXS0+cGFja2FnZV0tPnZlcnNpb25dOworCisJCQlpZiAocGF0dGVybiAmJiBmbm1hdGNoKHBhdHRlcm4sIG5hbWVfc3RyLCAwKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBnZXQgYWJicmV2aWF0aW9uIGZvciBzdGF0dXMgZmllbGQgMSAqLworCQkJczEgPSBzdGF0X3N0clswXSA9PSAnaScgPyAnaScgOiAncic7CisKKwkJCS8qIGdldCBhYmJyZXZpYXRpb24gZm9yIHN0YXR1cyBmaWVsZCAyICovCisJCQlmb3IgKGogPSAwLCBzcGNjbnQgPSAwOyBzdGF0X3N0cltqXSAmJiBzcGNjbnQgPCAyOyBqKyspIHsKKwkJCQlpZiAoc3RhdF9zdHJbal0gPT0gJyAnKSBzcGNjbnQrKzsKKwkJCX0KKwkJCXMyID0gc3RhdF9zdHJbal07CisKKwkJCS8qIHByaW50IG91dCB0aGUgbGluZSBmb3JtYXR0ZWQgbGlrZSBEZWJpYW4gZHBrZyAqLworCQkJcHJpbnRmKCIlYyVjICAlLTE0cyAlc1xuIiwgczEsIHMyLCBuYW1lX3N0ciwgdmVyc19zdHIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfcGFja2FnZShjb25zdCB1bnNpZ25lZCBwYWNrYWdlX251bSwgaW50IG5vaXN5KQoreworCWNvbnN0IGNoYXIgKnBhY2thZ2VfbmFtZSA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+bmFtZV07CisJY29uc3QgY2hhciAqcGFja2FnZV92ZXJzaW9uID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT52ZXJzaW9uXTsKKwljb25zdCB1bnNpZ25lZCBzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUocGFja2FnZV9uYW1lKTsKKwljb25zdCBpbnQgcGFja2FnZV9uYW1lX2xlbmd0aCA9IHN0cmxlbihwYWNrYWdlX25hbWUpOworCWNoYXIgKipyZW1vdmVfZmlsZXM7CisJY2hhciAqKmV4Y2x1ZGVfZmlsZXM7CisJY2hhciBsaXN0X25hbWVbcGFja2FnZV9uYW1lX2xlbmd0aCArIDI1XTsKKwljaGFyIGNvbmZmaWxlX25hbWVbcGFja2FnZV9uYW1lX2xlbmd0aCArIDMwXTsKKworCWlmIChub2lzeSkKKwkJcHJpbnRmKCJSZW1vdmluZyAlcyAoJXMpLi4uXG4iLCBwYWNrYWdlX25hbWUsIHBhY2thZ2VfdmVyc2lvbik7CisKKwkvKiBSdW4gcHJlcm0gc2NyaXB0ICovCisJcnVuX3BhY2thZ2Vfc2NyaXB0X29yX2RpZShwYWNrYWdlX25hbWUsICJwcmVybSIpOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUsIGFuZCBhIHNlcGFyYXRlIGxpc3Qgb2YgdGhvc2UgdG8ga2VlcCAqLworCXNwcmludGYobGlzdF9uYW1lLCAiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAibGlzdCIpOworCXJlbW92ZV9maWxlcyA9IGNyZWF0ZV9saXN0KGxpc3RfbmFtZSk7CisKKwlzcHJpbnRmKGNvbmZmaWxlX25hbWUsICIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsICJjb25mZmlsZXMiKTsKKwlleGNsdWRlX2ZpbGVzID0gY3JlYXRlX2xpc3QoY29uZmZpbGVfbmFtZSk7CisKKwkvKiBTb21lIGRpcmVjdG9yaWVzIGNhbid0IGJlIHJlbW92ZWQgc3RyYWlnaHQgYXdheSwgc28gZG8gbXVsdGlwbGUgcGFzc2VzICovCisJd2hpbGUgKHJlbW92ZV9maWxlX2FycmF5KHJlbW92ZV9maWxlcywgZXhjbHVkZV9maWxlcykpCisJCWNvbnRpbnVlOworCWZyZWVfYXJyYXkoZXhjbHVkZV9maWxlcyk7CisJZnJlZV9hcnJheShyZW1vdmVfZmlsZXMpOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBmaWxlcyBpbiAvdmFyL2xpYi9kcGtnL2luZm8vPHBhY2thZ2U+LiogdG8ga2VlcCAqLworCWV4Y2x1ZGVfZmlsZXMgPSB4emFsbG9jKHNpemVvZihleGNsdWRlX2ZpbGVzWzBdKSAqIDMpOworCWV4Y2x1ZGVfZmlsZXNbMF0gPSB4c3RyZHVwKGNvbmZmaWxlX25hbWUpOworCWV4Y2x1ZGVfZmlsZXNbMV0gPSB4YXNwcmludGYoIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgInBvc3RybSIpOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBhbGwgL3Zhci9saWIvZHBrZy9pbmZvLzxwYWNrYWdlPiBmaWxlcyAqLworCXJlbW92ZV9maWxlcyA9IGFsbF9jb250cm9sX2xpc3QocGFja2FnZV9uYW1lKTsKKworCXJlbW92ZV9maWxlX2FycmF5KHJlbW92ZV9maWxlcywgZXhjbHVkZV9maWxlcyk7CisJZnJlZV9hcnJheShyZW1vdmVfZmlsZXMpOworCWZyZWVfYXJyYXkoZXhjbHVkZV9maWxlcyk7CisKKwkvKiByZW5hbWUgPHBhY2thZ2U+LmNvbmZmaWxlcyB0byA8cGFja2FnZT4ubGlzdAorCSAqIFRoZSBjb25mZmlsZXMgY29udHJvbCBmaWxlIGlzbid0IHJlcXVpcmVkIGluIERlYmlhbiBwYWNrYWdlcywgc28gZG9uJ3QKKwkgKiBlcnJvciBvdXQgaWYgaXQncyBtaXNzaW5nLiAgKi8KKwlyZW5hbWUoY29uZmZpbGVfbmFtZSwgbGlzdF9uYW1lKTsKKworCS8qIENoYW5nZSBwYWNrYWdlIHN0YXR1cyAqLworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImNvbmZpZy1maWxlcyIsIDMpOworfQorCitzdGF0aWMgdm9pZCBwdXJnZV9wYWNrYWdlKGNvbnN0IHVuc2lnbmVkIHBhY2thZ2VfbnVtKQoreworCWNvbnN0IGNoYXIgKnBhY2thZ2VfbmFtZSA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+bmFtZV07CisJY29uc3QgY2hhciAqcGFja2FnZV92ZXJzaW9uID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT52ZXJzaW9uXTsKKwljb25zdCB1bnNpZ25lZCBzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUocGFja2FnZV9uYW1lKTsKKwljaGFyICoqcmVtb3ZlX2ZpbGVzOworCWNoYXIgKipleGNsdWRlX2ZpbGVzOworCWNoYXIgbGlzdF9uYW1lW3N0cmxlbihwYWNrYWdlX25hbWUpICsgMjVdOworCisJcHJpbnRmKCJQdXJnaW5nICVzICglcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwgcGFja2FnZV92ZXJzaW9uKTsKKworCS8qIFJ1biBwcmVybSBzY3JpcHQgKi8KKwlydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKHBhY2thZ2VfbmFtZSwgInByZXJtIik7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSAqLworCXNwcmludGYobGlzdF9uYW1lLCAiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAibGlzdCIpOworCXJlbW92ZV9maWxlcyA9IGNyZWF0ZV9saXN0KGxpc3RfbmFtZSk7CisKKwkvKiBTb21lIGRpcmVjdG9yaWVzIGNhbnQgYmUgcmVtb3ZlZCBzdHJhaWdodCBhd2F5LCBzbyBkbyBtdWx0aXBsZSBwYXNzZXMgKi8KKwl3aGlsZSAocmVtb3ZlX2ZpbGVfYXJyYXkocmVtb3ZlX2ZpbGVzLCBOVUxMKSkKKwkJY29udGludWU7CisJZnJlZV9hcnJheShyZW1vdmVfZmlsZXMpOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBhbGwgL3Zhci9saWIvZHBrZy9pbmZvLzxwYWNrYWdlPiBmaWxlcyAqLworCXJlbW92ZV9maWxlcyA9IGFsbF9jb250cm9sX2xpc3QocGFja2FnZV9uYW1lKTsKKworCS8qIERlbGV0ZSBhbGwgb2YgdGhlbSBleGNlcHQgdGhlIHBvc3RybSBzY3JpcHQgKi8KKwlleGNsdWRlX2ZpbGVzID0geHphbGxvYyhzaXplb2YoZXhjbHVkZV9maWxlc1swXSkgKiAyKTsKKwlleGNsdWRlX2ZpbGVzWzBdID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsICJwb3N0cm0iKTsKKwlyZW1vdmVfZmlsZV9hcnJheShyZW1vdmVfZmlsZXMsIGV4Y2x1ZGVfZmlsZXMpOworCWZyZWVfYXJyYXkoZXhjbHVkZV9maWxlcyk7CisKKwkvKiBSdW4gYW5kIHJlbW92ZSBwb3N0cm0gc2NyaXB0ICovCisJcnVuX3BhY2thZ2Vfc2NyaXB0X29yX2RpZShwYWNrYWdlX25hbWUsICJwb3N0cm0iKTsKKwlyZW1vdmVfZmlsZV9hcnJheShyZW1vdmVfZmlsZXMsIE5VTEwpOworCisJZnJlZV9hcnJheShyZW1vdmVfZmlsZXMpOworCisJLyogQ2hhbmdlIHBhY2thZ2Ugc3RhdHVzICovCisJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAibm90LWluc3RhbGxlZCIsIDMpOworfQorCitzdGF0aWMgYXJjaGl2ZV9oYW5kbGVfdCAqaW5pdF9hcmNoaXZlX2RlYl9hcihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICphcl9oYW5kbGU7CisKKwkvKiBTZXR1cCBhbiBhciBhcmNoaXZlIGhhbmRsZSB0aGF0IHJlZmVycyB0byB0aGUgZ3ppcCBzdWIgYXJjaGl2ZSAqLworCWFyX2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisJYXJfaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ247CisJYXJfaGFuZGxlLT5zcmNfZmQgPSB4b3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCisJcmV0dXJuIGFyX2hhbmRsZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9hcmNoaXZlX2RlYl9jb250cm9sKGFyY2hpdmVfaGFuZGxlX3QgKmFyX2hhbmRsZSkKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICp0YXJfaGFuZGxlOworCisJLyogU2V0dXAgdGhlIHRhciBhcmNoaXZlIGhhbmRsZSAqLworCXRhcl9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCXRhcl9oYW5kbGUtPnNyY19mZCA9IGFyX2hhbmRsZS0+c3JjX2ZkOworCisJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBkYXRhLnRhci4qIG9yIGRlYmlhbi1iaW5hcnksIGp1c3QgY29udHJvbC50YXIuKiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daCisJbGxpc3RfYWRkX3RvKCYoYXJfaGFuZGxlLT5hY2NlcHQpLCAoY2hhciopImNvbnRyb2wudGFyLmd6Iik7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiY29udHJvbC50YXIuYnoyIik7CisjZW5kaWYKKworCS8qIEFzc2lnbiB0aGUgdGFyIGhhbmRsZSBhcyBhIHN1YmFyY2hpdmUgb2YgdGhlIGFyIGhhbmRsZSAqLworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUgPSB0YXJfaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBpbml0X2FyY2hpdmVfZGViX2RhdGEoYXJjaGl2ZV9oYW5kbGVfdCAqYXJfaGFuZGxlKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKnRhcl9oYW5kbGU7CisKKwkvKiBTZXR1cCB0aGUgdGFyIGFyY2hpdmUgaGFuZGxlICovCisJdGFyX2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisJdGFyX2hhbmRsZS0+c3JjX2ZkID0gYXJfaGFuZGxlLT5zcmNfZmQ7CisKKwkvKiBXZSBkb24ndCBjYXJlIGFib3V0IGNvbnRyb2wudGFyLiogb3IgZGViaWFuLWJpbmFyeSwganVzdCBkYXRhLnRhci4qICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiZGF0YS50YXIuZ3oiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCWxsaXN0X2FkZF90bygmKGFyX2hhbmRsZS0+YWNjZXB0KSwgKGNoYXIqKSJkYXRhLnRhci5iejIiKTsKKyNlbmRpZgorCisJLyogQXNzaWduIHRoZSB0YXIgaGFuZGxlIGFzIGEgc3ViYXJjaGl2ZSBvZiB0aGUgYXIgaGFuZGxlICovCisJYXJfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZSA9IHRhcl9oYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfdG9fYnVmZmVyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCXVuc2lnbmVkIHNpemUgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemU7CisKKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYnVmZmVyID0geHphbGxvYyhzaXplICsgMSk7CisJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2J1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBjaGFyICpkZWJfZXh0cmFjdF9jb250cm9sX2ZpbGVfdG9fYnVmZmVyKGFyY2hpdmVfaGFuZGxlX3QgKmFyX2hhbmRsZSwgbGxpc3RfdCAqbXlhY2NlcHQpCit7CisJYXJfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfdG9fYnVmZmVyOworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjY2VwdCA9IG15YWNjZXB0OworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdDsKKworCXVucGFja19hcl9hcmNoaXZlKGFyX2hhbmRsZSk7CisJY2xvc2UoYXJfaGFuZGxlLT5zcmNfZmQpOworCisJcmV0dXJuIGFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmRwa2dfX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2NvbnRyb2xfZmlsZV90b19sbGlzdChjb25zdCBjaGFyICpwYWNrYWdlX25hbWUsIGNvbnN0IGNoYXIgKmNvbnRyb2xfbmFtZSwgbGxpc3RfdCAqKmxsKQoreworCUZJTEUgKmZwOworCWNoYXIgKmZpbGVuYW1lLCAqbGluZTsKKworCWZpbGVuYW1lID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsIGNvbnRyb2xfbmFtZSk7CisJZnAgPSBmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJZnJlZShmaWxlbmFtZSk7CisJaWYgKGZwICE9IE5VTEwpIHsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpCisJCQlsbGlzdF9hZGRfdG8obGwsIGxpbmUpOworCQlmY2xvc2UoZnApOworCX0KK30KKworc3RhdGljIGNoYXIgRkFTVF9GVU5DIGZpbHRlcl9yZW5hbWVfY29uZmlnKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWludCBmZDsKKwljaGFyICpuYW1lX3B0ciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSArIDE7CisKKwkvKiBJcyB0aGlzIGZpbGUgbWFya2VkIGFzIGNvbmZpZyBmaWxlPyAqLworCWlmICghZmluZF9saXN0X2VudHJ5KGFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsIG5hbWVfcHRyKSkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLyogbm8gKi8KKworCWZkID0gb3BlbihuYW1lX3B0ciwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCW1kNV9jdHhfdCBtZDU7CisJCWNoYXIgKm1kNWxpbmUsICpidWY7CisJCWludCBjb3VudDsKKworCQkvKiBDYWxjdWxhdGUgTUQ1IG9mIGV4aXN0aW5nIGZpbGUgKi8KKwkJYnVmID0geG1hbGxvYyg0MDk2KTsKKwkJbWQ1X2JlZ2luKCZtZDUpOworCQl3aGlsZSAoKGNvdW50ID0gc2FmZV9yZWFkKGZkLCBidWYsIDQwOTYpKSA+IDApCisJCQltZDVfaGFzaCgmbWQ1LCBidWYsIGNvdW50KTsKKwkJbWQ1X2VuZCgmbWQ1LCBidWYpOyAvKiB1c2luZyBidWYgYXMgcmVzdWx0IHN0b3JhZ2UgKi8KKwkJY2xvc2UoZmQpOworCisJCW1kNWxpbmUgPSB4bWFsbG9jKDE2ICogMiArIDIgKyBzdHJsZW4obmFtZV9wdHIpICsgMSk7CisJCXNwcmludGYoYmluMmhleChtZDVsaW5lLCBidWYsIDE2KSwgIiAgJXMiLCBuYW1lX3B0cik7CisJCWZyZWUoYnVmKTsKKworCQkvKiBJcyBpdCBjaGFuZ2VkIGFmdGVyIGluc3RhbGw/ICovCisJCWlmIChmaW5kX2xpc3RfZW50cnkoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgbWQ1bGluZSkgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJXYXJuaW5nOiBDcmVhdGluZyAlcyBhcyAlcy5kcGtnLW5ld1xuIiwgbmFtZV9wdHIsIG5hbWVfcHRyKTsKKwkJCWFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSA9IHhhc3ByaW50ZigiJXMuZHBrZy1uZXciLCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJCWZyZWUobWQ1bGluZSk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfYWxsX3ByZWZpeChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwljaGFyICpuYW1lX3B0ciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZTsKKworCS8qIFNraXAgYWxsIGxlYWRpbmcgIi8iICovCisJd2hpbGUgKCpuYW1lX3B0ciA9PSAnLycpCisJCW5hbWVfcHRyKys7CisJLyogU2tpcCBhbGwgbGVhZGluZyAiLi8iIGFuZCAiLi4vIiAqLworCXdoaWxlIChuYW1lX3B0clswXSA9PSAnLicpIHsKKwkJaWYgKG5hbWVfcHRyWzFdID09ICcuJykKKwkJCW5hbWVfcHRyKys7CisJCWlmIChuYW1lX3B0clsxXSAhPSAnLycpCisJCQlicmVhazsKKwkJbmFtZV9wdHIgKz0gMjsKKwl9CisKKwlpZiAobmFtZV9wdHJbMF0gIT0gJ1wwJykgeworCQlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUgPSB4YXNwcmludGYoIiVzJXMiLCBhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYnVmZmVyLCBuYW1lX3B0cik7CisJCWRhdGFfZXh0cmFjdF9hbGwoYXJjaGl2ZV9oYW5kbGUpOworCQlpZiAoZm5tYXRjaCgiKi5kcGtnLW5ldyIsIGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSwgMCkgPT0gMCkgeworCQkJLyogcmVtb3ZlIC5kcGtnLW5ldyBzdWZmaXggKi8KKwkJCWFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZVtzdHJsZW4oYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKSAtIDldID0gJ1wwJzsKKwkJfQorCX0KK30KKworZW51bSB7CisJLyogQ29tbWFuZHMgKi8KKwlPUFRfY29uZmlndXJlICAgICAgICAgICAgPSAoMSA8PCAwKSwKKwlPUFRfaW5zdGFsbCAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKKwlPUFRfbGlzdF9pbnN0YWxsZWQgICAgICAgPSAoMSA8PCAyKSwKKwlPUFRfcHVyZ2UgICAgICAgICAgICAgICAgPSAoMSA8PCAzKSwKKwlPUFRfcmVtb3ZlICAgICAgICAgICAgICAgPSAoMSA8PCA0KSwKKwlPUFRfdW5wYWNrICAgICAgICAgICAgICAgPSAoMSA8PCA1KSwKKwlPUFRNQVNLX2NtZCAgICAgICAgICAgICAgPSAoMSA8PCA2KSAtIDEsCisJLyogT3B0aW9ucyAqLworCU9QVF9mb3JjZSAgICAgICAgICAgICAgICA9ICgxIDw8IDYpLAorCU9QVF9mb3JjZV9pZ25vcmVfZGVwZW5kcyA9ICgxIDw8IDcpLAorCU9QVF9mb3JjZV9jb25mbmV3ICAgICAgICA9ICgxIDw8IDgpLAorCU9QVF9mb3JjZV9jb25mb2xkICAgICAgICA9ICgxIDw8IDkpLAorfTsKKworc3RhdGljIHZvaWQgdW5wYWNrX3BhY2thZ2UoZGViX2ZpbGVfdCAqZGViX2ZpbGUpCit7CisJY29uc3QgY2hhciAqcGFja2FnZV9uYW1lID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGUtPnBhY2thZ2VdLT5uYW1lXTsKKwljb25zdCB1bnNpZ25lZCBzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUocGFja2FnZV9uYW1lKTsKKwljb25zdCB1bnNpZ25lZCBzdGF0dXNfcGFja2FnZV9udW0gPSBzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5wYWNrYWdlOworCWNoYXIgKmluZm9fcHJlZml4OworCWNoYXIgKmxpc3RfZmlsZW5hbWU7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisJRklMRSAqb3V0X3N0cmVhbTsKKwlsbGlzdF90ICphY2NlcHRfbGlzdDsKKwlsbGlzdF90ICpjb25mZmlsZV9saXN0OworCWludCBpOworCisJLyogSWYgZXhpc3RpbmcgdmVyc2lvbiwgcmVtb3ZlIGl0IGZpcnN0ICovCisJY29uZmZpbGVfbGlzdCA9IE5VTEw7CisJaWYgKHN0cmNtcChuYW1lX2hhc2h0YWJsZVtnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpXSwgImluc3RhbGxlZCIpID09IDApIHsKKwkJLyogUGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCwgcmVtb3ZlIG9sZCB2ZXJzaW9uIGZpcnN0ICovCisJCXByaW50ZigiUHJlcGFyaW5nIHRvIHJlcGxhY2UgJXMgJXMgKHVzaW5nICVzKS4uLlxuIiwgcGFja2FnZV9uYW1lLAorCQkJbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbc3RhdHVzX3BhY2thZ2VfbnVtXS0+dmVyc2lvbl0sCisJCQlkZWJfZmlsZS0+ZmlsZW5hbWUpOworCisJCS8qIFJlYWQgbWQ1c3VtcyBmcm9tIG9sZCBwYWNrYWdlICovCisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfZm9yY2VfY29uZm9sZCkpCisJCQlhcHBlbmRfY29udHJvbF9maWxlX3RvX2xsaXN0KHBhY2thZ2VfbmFtZSwgIm1kNXN1bXMiLCAmY29uZmZpbGVfbGlzdCk7CisKKwkJcmVtb3ZlX3BhY2thZ2Uoc3RhdHVzX3BhY2thZ2VfbnVtLCAwKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlVucGFja2luZyAlcyAoZnJvbSAlcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwgZGViX2ZpbGUtPmZpbGVuYW1lKTsKKwl9CisKKwkvKiBFeHRyYWN0IGNvbnRyb2wudGFyLmd6IHRvIC92YXIvbGliL2Rwa2cvaW5mby88cGFja2FnZT4uZmlsZW5hbWUgKi8KKwlpbmZvX3ByZWZpeCA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAiIik7CisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2FyY2hpdmVfZGViX2FyKGRlYl9maWxlLT5maWxlbmFtZSk7CisJaW5pdF9hcmNoaXZlX2RlYl9jb250cm9sKGFyY2hpdmVfaGFuZGxlKTsKKworCWFjY2VwdF9saXN0ID0gTlVMTDsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IEFSUkFZX1NJWkUoYWxsX2NvbnRyb2xfZmlsZXMpKSB7CisJCWNoYXIgKmMgPSB4YXNwcmludGYoIi4vJXMiLCBhbGxfY29udHJvbF9maWxlc1tpXSk7CisJCWxsaXN0X2FkZF90bygmYWNjZXB0X2xpc3QsIGMpOworCQlpKys7CisJfQorCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWNjZXB0ID0gYWNjZXB0X2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGxfcHJlZml4OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZHBrZ19fYnVmZmVyID0gaW5mb19wcmVmaXg7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5haF9mbGFncyB8PSBBUkNISVZFX1VOTElOS19PTEQ7CisJdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGUpOworCisJLyogUnVuIHRoZSBwcmVpbnN0IHByaW9yIHRvIGV4dHJhY3RpbmcgKi8KKwlydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKHBhY2thZ2VfbmFtZSwgInByZWluc3QiKTsKKworCS8qIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBjb25maWcgZmlsZXMgKi8KKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2ZvcmNlX2NvbmZuZXcpKQorCQlhcHBlbmRfY29udHJvbF9maWxlX3RvX2xsaXN0KHBhY2thZ2VfbmFtZSwgImNvbmZmaWxlcyIsICZjb25mZmlsZV9saXN0KTsKKworCS8qIEV4dHJhY3QgZGF0YS50YXIuZ3ogdG8gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2FyY2hpdmVfZGViX2FyKGRlYl9maWxlLT5maWxlbmFtZSk7CisJaW5pdF9hcmNoaXZlX2RlYl9kYXRhKGFyY2hpdmVfaGFuZGxlKTsKKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjY2VwdCA9IGNvbmZmaWxlX2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5maWx0ZXIgPSBmaWx0ZXJfcmVuYW1lX2NvbmZpZzsKKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbF9wcmVmaXg7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5kcGtnX19idWZmZXIgPSAoY2hhciopIi8iOyAvKiBodWg/ICovCisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5haF9mbGFncyB8PSBBUkNISVZFX1VOTElOS19PTEQ7CisJdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGUpOworCisJLyogQ3JlYXRlIHRoZSBsaXN0IGZpbGUgKi8KKwlsaXN0X2ZpbGVuYW1lID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsICJsaXN0Iik7CisJb3V0X3N0cmVhbSA9IHhmb3Blbl9mb3Jfd3JpdGUobGlzdF9maWxlbmFtZSk7CisJd2hpbGUgKGFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+cGFzc2VkKSB7CisJCS8qIHRoZSBsZWFkaW5nIC4gaGFzIGJlZW4gc3RyaXBwZWQgYnkgZGF0YV9leHRyYWN0X2FsbF9wcmVmaXggYWxyZWFkeSAqLworCQlmcHV0cyhhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPnBhc3NlZC0+ZGF0YSwgb3V0X3N0cmVhbSk7CisJCWZwdXRjKCdcbicsIG91dF9zdHJlYW0pOworCQlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPnBhc3NlZCA9IGFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+cGFzc2VkLT5saW5rOworCX0KKwlmY2xvc2Uob3V0X3N0cmVhbSk7CisKKwkvKiBjaGFuZ2Ugc3RhdHVzICovCisJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAiaW5zdGFsbCIsIDEpOworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgInVucGFja2VkIiwgMyk7CisKKwlmcmVlKGluZm9fcHJlZml4KTsKKwlmcmVlKGxpc3RfZmlsZW5hbWUpOworfQorCitzdGF0aWMgdm9pZCBjb25maWd1cmVfcGFja2FnZShkZWJfZmlsZV90ICpkZWJfZmlsZSkKK3sKKwljb25zdCBjaGFyICpwYWNrYWdlX25hbWUgPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZS0+cGFja2FnZV0tPm5hbWVdOworCWNvbnN0IGNoYXIgKnBhY2thZ2VfdmVyc2lvbiA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlLT5wYWNrYWdlXS0+dmVyc2lvbl07CisJY29uc3QgaW50IHN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShwYWNrYWdlX25hbWUpOworCisJcHJpbnRmKCJTZXR0aW5nIHVwICVzICglcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwgcGFja2FnZV92ZXJzaW9uKTsKKworCS8qIFJ1biB0aGUgcG9zdGluc3Qgc2NyaXB0ICovCisJLyogVE9ETzogaGFuZGxlIGZhaWx1cmUgZ3JhY2VmdWxseSAqLworCXJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUocGFja2FnZV9uYW1lLCAicG9zdGluc3QiKTsKKworCS8qIENoYW5nZSBzdGF0dXMgdG8gcmVmbGVjdCBzdWNjZXNzICovCisJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAiaW5zdGFsbCIsIDEpOworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImluc3RhbGxlZCIsIDMpOworfQorCitpbnQgZHBrZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHBrZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZGViX2ZpbGVfdCAqKmRlYl9maWxlID0gTlVMTDsKKwlzdGF0dXNfbm9kZV90ICpzdGF0dXNfbm9kZTsKKwljaGFyICpzdHJfZjsKKwlpbnQgb3B0OworCWludCBwYWNrYWdlX251bTsKKwlpbnQgZGViX2NvdW50ID0gMDsKKwlpbnQgc3RhdGVfc3RhdHVzOworCWludCBzdGF0dXNfbnVtOworCWludCBpOworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBkcGtnX2xvbmdvcHRzW10gQUxJR04xID0KKy8vIEZJWE1FOiB3ZSB1c2UgLUMgbm9uLWNvbXBhdGlibHksIHNob3VsZCBiZToKKy8vICItQ3wtLWF1ZGl0IENoZWNrIGZvciBicm9rZW4gcGFja2FnZShzKSIKKwkJImNvbmZpZ3VyZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiQyIKKwkJImZvcmNlXDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICAiRiIKKwkJImluc3RhbGxcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiaSIKKwkJImxpc3RcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAibCIKKwkJInB1cmdlXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiUCIKKwkJInJlbW92ZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiciIKKwkJInVucGFja1wwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAidSIKKwkJImZvcmNlLWRlcGVuZHNcMCIgIE5vX2FyZ3VtZW50ICAgICAgICAiXHhmZiIKKwkJImZvcmNlLWNvbmZuZXdcMCIgIE5vX2FyZ3VtZW50ICAgICAgICAiXHhmZSIKKwkJImZvcmNlLWNvbmZvbGRcMCIgIE5vX2FyZ3VtZW50ICAgICAgICAiXHhmZCIKKwkJOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gZHBrZ19sb25nb3B0cyk7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkNpbFBydUY6IiwgJnN0cl9mKTsKKwlhcmd2ICs9IG9wdGluZDsKKwkvL2lmIChvcHQgJiBPUFRfY29uZmlndXJlKSAuLi4gLy8gLUMKKwlpZiAob3B0ICYgT1BUX2ZvcmNlKSB7IC8vIC1GICgtLWZvcmNlIGluIG9mZmljaWFsIGRwa2cpCisJCWlmIChzdHJjbXAoc3RyX2YsICJkZXBlbmRzIikgPT0gMCkKKwkJCW9wdCB8PSBPUFRfZm9yY2VfaWdub3JlX2RlcGVuZHM7CisJCWVsc2UgaWYgKHN0cmNtcChzdHJfZiwgImNvbmZuZXciKSA9PSAwKQorCQkJb3B0IHw9IE9QVF9mb3JjZV9jb25mbmV3OworCQllbHNlIGlmIChzdHJjbXAoc3RyX2YsICJjb25mb2xkIikgPT0gMCkKKwkJCW9wdCB8PSBPUFRfZm9yY2VfY29uZm9sZDsKKwkJZWxzZQorCQkJYmJfc2hvd191c2FnZSgpOworCQlvcHRpb25fbWFzazMyID0gb3B0OworCX0KKwkvL2lmIChvcHQgJiBPUFRfaW5zdGFsbCkgLi4uIC8vIC1pCisJLy9pZiAob3B0ICYgT1BUX2xpc3RfaW5zdGFsbGVkKSAuLi4gLy8gLWwKKwkvL2lmIChvcHQgJiBPUFRfcHVyZ2UpIC4uLiAvLyAtUAorCS8vaWYgKG9wdCAmIE9QVF9yZW1vdmUpIC4uLiAvLyAtcgorCS8vaWYgKG9wdCAmIE9QVF91bnBhY2spIC4uLiAvLyAtdSAoLS11bnBhY2sgaW4gb2ZmaWNpYWwgZHBrZykKKwlpZiAoIShvcHQgJiBPUFRNQVNLX2NtZCkgLyogbm8gY21kICovCisJIHx8ICgob3B0ICYgT1BUTUFTS19jbWQpICYgKChvcHQgJiBPUFRNQVNLX2NtZCktMSkpIC8qIG1vcmUgdGhhbiBvbmUgY21kICovCisJKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKy8qCXB1dHMoIihSZWFkaW5nIGRhdGFiYXNlIC4uLiB4eHh4eCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW5zdGFsbGVkLikiKTsgKi8KKwlpbmRleF9zdGF0dXNfZmlsZSgiL3Zhci9saWIvZHBrZy9zdGF0dXMiKTsKKworCS8qIGlmIHRoZSBsaXN0IGFjdGlvbiB3YXMgZ2l2ZW4gcHJpbnQgdGhlIGluc3RhbGxlZCBwYWNrYWdlcyBhbmQgZXhpdCAqLworCWlmIChvcHQgJiBPUFRfbGlzdF9pbnN0YWxsZWQpIHsKKwkJbGlzdF9wYWNrYWdlcyhhcmd2WzBdKTsgLyogcGFyYW0gY2FuIGJlIE5VTEwgKi8KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBSZWFkIGFyZ3VtZW50cyBhbmQgc3RvcmUgcmVsZXZhbnQgaW5mbyBpbiBzdHJ1Y3RzICovCisJd2hpbGUgKCphcmd2KSB7CisJCS8qIGRlYl9jb3VudCA9IG5iX2VsZW0gLSAxIGFuZCB3ZSBuZWVkIG5iX2VsZW0gKyAxIHRvIGFsbG9jYXRlIHRlcm1pbmFsIG5vZGUgW05VTEwgcG9pbnRlcl0gKi8KKwkJZGViX2ZpbGUgPSB4cmVhbGxvY192ZWN0b3IoZGViX2ZpbGUsIDIsIGRlYl9jb3VudCk7CisJCWRlYl9maWxlW2RlYl9jb3VudF0gPSB4emFsbG9jKHNpemVvZihkZWJfZmlsZVswXVswXSkpOworCQlpZiAob3B0ICYgKE9QVF9pbnN0YWxsIHwgT1BUX3VucGFjaykpIHsKKwkJCS8qIC1pLy11OiByZXF1aXJlIGZpbGVuYW1lICovCisJCQlhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZTsKKwkJCWxsaXN0X3QgKmNvbnRyb2xfbGlzdCA9IE5VTEw7CisKKwkJCS8qIEV4dHJhY3QgdGhlIGNvbnRyb2wgZmlsZSAqLworCQkJbGxpc3RfYWRkX3RvKCZjb250cm9sX2xpc3QsIChjaGFyKikiLi9jb250cm9sIik7CisJCQlhcmNoaXZlX2hhbmRsZSA9IGluaXRfYXJjaGl2ZV9kZWJfYXIoYXJndlswXSk7CisJCQlpbml0X2FyY2hpdmVfZGViX2NvbnRyb2woYXJjaGl2ZV9oYW5kbGUpOworCQkJZGViX2ZpbGVbZGViX2NvdW50XS0+Y29udHJvbF9maWxlID0gZGViX2V4dHJhY3RfY29udHJvbF9maWxlX3RvX2J1ZmZlcihhcmNoaXZlX2hhbmRsZSwgY29udHJvbF9saXN0KTsKKwkJCWlmIChkZWJfZmlsZVtkZWJfY291bnRdLT5jb250cm9sX2ZpbGUgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleHRyYWN0IGNvbnRyb2wgZmlsZSIpOworCQkJfQorCQkJZGViX2ZpbGVbZGViX2NvdW50XS0+ZmlsZW5hbWUgPSB4c3RyZHVwKGFyZ3ZbMF0pOworCQkJcGFja2FnZV9udW0gPSBmaWxsX3BhY2thZ2Vfc3RydWN0KGRlYl9maWxlW2RlYl9jb3VudF0tPmNvbnRyb2xfZmlsZSk7CisKKwkJCWlmIChwYWNrYWdlX251bSA9PSAtMSkgeworCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBjb250cm9sIGZpbGUgaW4gJXMiLCBhcmd2WzBdKTsKKwkJCQlhcmd2Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkZWJfZmlsZVtkZWJfY291bnRdLT5wYWNrYWdlID0gKHVuc2lnbmVkKSBwYWNrYWdlX251bTsKKworCQkJLyogQWRkIHRoZSBwYWNrYWdlIHRvIHRoZSBzdGF0dXMgaGFzaHRhYmxlICovCisJCQlpZiAob3B0ICYgKE9QVF91bnBhY2sgfCBPUFRfaW5zdGFsbCkpIHsKKwkJCQkvKiBUcnkgYW5kIGZpbmQgYSBjdXJyZW50bHkgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlICovCisJCQkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2VdLT5uYW1lXSk7CisJCQkJLyogSWYgbm8gcHJldmlvdXMgZW50cnkgd2FzIGZvdW5kIGluaXRpYWxpc2UgYSBuZXcgZW50cnkgKi8KKwkJCQlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9PSBOVUxMCisJCQkJIHx8IHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0tPnN0YXR1cyA9PSAwCisJCQkJKSB7CisJCQkJCXN0YXR1c19ub2RlID0geG1hbGxvYyhzaXplb2Yoc3RhdHVzX25vZGVfdCkpOworCQkJCQlzdGF0dXNfbm9kZS0+cGFja2FnZSA9IGRlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2U7CisJCQkJCS8qIHJlaW5zdHJlcSBpc250IGNoYW5nZWQgdG8gIm9rIiB1bnRpbCB0aGUgcGFja2FnZSBjb250cm9sIGluZm8KKwkJCQkJICogaXMgd3JpdHRlbiB0byB0aGUgc3RhdHVzIGZpbGUqLworCQkJCQlzdGF0dXNfbm9kZS0+c3RhdHVzID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsIHJlaW5zdHJlcSBub3QtaW5zdGFsbGVkIik7CisJCQkJCXN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPSBzdGF0dXNfbm9kZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJpbnN0YWxsIiwgMSk7CisJCQkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgInJlaW5zdHJlcSIsIDIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChvcHQgJiAoT1BUX2NvbmZpZ3VyZSB8IE9QVF9wdXJnZSB8IE9QVF9yZW1vdmUpKSB7CisJCQkvKiAtQy8tcC8tcjogcmVxdWlyZSBwYWNrYWdlIG5hbWUgKi8KKwkJCWRlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2UgPSBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUoCisJCQkJCXNlYXJjaF9uYW1lX2hhc2h0YWJsZShhcmd2WzBdKSwKKwkJCQkJc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJBTlkiKSwgVkVSX0FOWSk7CisJCQlpZiAocGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbZGViX2NvdW50XS0+cGFja2FnZV0gPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYWNrYWdlICVzIGlzIHVuaW5zdGFsbGVkIG9yIHVua25vd24iLCBhcmd2WzBdKTsKKwkJCX0KKwkJCXBhY2thZ2VfbnVtID0gZGViX2ZpbGVbZGViX2NvdW50XS0+cGFja2FnZTsKKwkJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdKTsKKwkJCXN0YXRlX3N0YXR1cyA9IGdldF9zdGF0dXMoc3RhdHVzX251bSwgMyk7CisKKwkJCS8qIGNoZWNrIHBhY2thZ2Ugc3RhdHVzIGlzICJpbnN0YWxsZWQiICovCisJCQlpZiAob3B0ICYgT1BUX3JlbW92ZSkgeworCQkJCWlmIChzdHJjbXAobmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSwgIm5vdC1pbnN0YWxsZWQiKSA9PSAwCisJCQkJIHx8IHN0cmNtcChuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdLCAiY29uZmlnLWZpbGVzIikgPT0gMAorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgYWxyZWFkeSByZW1vdmVkIiwgbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5uYW1lXSk7CisJCQkJfQorCQkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImRlaW5zdGFsbCIsIDEpOworCQkJfSBlbHNlIGlmIChvcHQgJiBPUFRfcHVyZ2UpIHsKKwkJCQkvKiBpZiBwYWNrYWdlIHN0YXR1cyBpcyAiY29uZi1maWxlcyIgdGhlbiBpdHMgb2sgKi8KKwkJCQlpZiAoc3RyY21wKG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10sICJub3QtaW5zdGFsbGVkIikgPT0gMCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgYWxyZWFkeSBwdXJnZWQiLCBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdKTsKKwkJCQl9CisJCQkJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAicHVyZ2UiLCAxKTsKKwkJCX0KKwkJfQorCQlkZWJfY291bnQrKzsKKwkJYXJndisrOworCX0KKwlpZiAoIWRlYl9jb3VudCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHBhY2thZ2UgZmlsZXMgc3BlY2lmaWVkIik7CisJZGViX2ZpbGVbZGViX2NvdW50XSA9IE5VTEw7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBkZWIgZmlsZSBhcmd1bWVudHMgYXJlIGluc3RhbGxhYmxlICovCisJaWYgKCEob3B0ICYgT1BUX2ZvcmNlX2lnbm9yZV9kZXBlbmRzKSkgeworCQlpZiAoIWNoZWNrX2RlcHMoZGViX2ZpbGUsIDAgLyosIGRlYl9jb3VudCovKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImRlcGVuZGVuY3kgY2hlY2sgZmFpbGVkIik7CisJCX0KKwl9CisKKwkvKiBUT0RPOiBpbnN0YWxsIG9yIHJlbW92ZSBwYWNrYWdlcyBpbiB0aGUgY29ycmVjdCBkZXBlbmRlbmN5IG9yZGVyICovCisJZm9yIChpID0gMDsgaSA8IGRlYl9jb3VudDsgaSsrKSB7CisJCS8qIFJlbW92ZSBvciBwdXJnZSBwYWNrYWdlcyAqLworCQlpZiAob3B0ICYgT1BUX3JlbW92ZSkgeworCQkJcmVtb3ZlX3BhY2thZ2UoZGViX2ZpbGVbaV0tPnBhY2thZ2UsIDEpOworCQl9CisJCWVsc2UgaWYgKG9wdCAmIE9QVF9wdXJnZSkgeworCQkJcHVyZ2VfcGFja2FnZShkZWJfZmlsZVtpXS0+cGFja2FnZSk7CisJCX0KKwkJZWxzZSBpZiAob3B0ICYgT1BUX3VucGFjaykgeworCQkJdW5wYWNrX3BhY2thZ2UoZGViX2ZpbGVbaV0pOworCQl9CisJCWVsc2UgaWYgKG9wdCAmIE9QVF9pbnN0YWxsKSB7CisJCQl1bnBhY2tfcGFja2FnZShkZWJfZmlsZVtpXSk7CisJCQkvKiBwYWNrYWdlIGlzIGNvbmZpZ3VyZWQgaW4gc2Vjb25kIHBhc3MgYmVsb3cgKi8KKwkJfQorCQllbHNlIGlmIChvcHQgJiBPUFRfY29uZmlndXJlKSB7CisJCQljb25maWd1cmVfcGFja2FnZShkZWJfZmlsZVtpXSk7CisJCX0KKwl9CisJLyogY29uZmlndXJlIGluc3RhbGxlZCBwYWNrYWdlcyAqLworCWlmIChvcHQgJiBPUFRfaW5zdGFsbCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGViX2NvdW50OyBpKyspCisJCQljb25maWd1cmVfcGFja2FnZShkZWJfZmlsZVtpXSk7CisJfQorCisJd3JpdGVfc3RhdHVzX2ZpbGUoZGViX2ZpbGUpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWJfY291bnQ7IGkrKykgeworCQkJZnJlZShkZWJfZmlsZVtpXS0+Y29udHJvbF9maWxlKTsKKwkJCWZyZWUoZGViX2ZpbGVbaV0tPmZpbGVuYW1lKTsKKwkJCWZyZWUoZGViX2ZpbGVbaV0pOworCQl9CisKKwkJZnJlZShkZWJfZmlsZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IE5BTUVfSEFTSF9QUklNRTsgaSsrKSB7CisJCQlmcmVlKG5hbWVfaGFzaHRhYmxlW2ldKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBQQUNLQUdFX0hBU0hfUFJJTUU7IGkrKykgeworCQkJZnJlZV9wYWNrYWdlKHBhY2thZ2VfaGFzaHRhYmxlW2ldKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBTVEFUVVNfSEFTSF9QUklNRTsgaSsrKSB7CisJCQlmcmVlKHN0YXR1c19oYXNodGFibGVbaV0pOworCQl9CisKKwkJZnJlZShzdGF0dXNfaGFzaHRhYmxlKTsKKwkJZnJlZShwYWNrYWdlX2hhc2h0YWJsZSk7CisJCWZyZWUobmFtZV9oYXNodGFibGUpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9kcGtnX2RlYi5jIGIvYXJjaGl2YWwvZHBrZ19kZWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDgxNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvZHBrZ19kZWIuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZHBrZy1kZWIgcGFja3MsIHVucGFja3MgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IERlYmlhbiBhcmNoaXZlcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkcGtnX2RlYl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZWZ4WF0gRklMRSBbYXJndW1lbnQiCisvL3VzYWdlOiNkZWZpbmUgZHBrZ19kZWJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQZXJmb3JtIGFjdGlvbnMgb24gRGViaWFuIHBhY2thZ2VzICguZGVicylcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJTGlzdCBjb250ZW50cyBvZiBmaWxlc3lzdGVtIHRyZWUiCisvL3VzYWdlOiAgICAgIlxuCS1lCUV4dHJhY3QgY29udHJvbCBmaWxlcyB0byBbYXJndW1lbnRdIGRpcmVjdG9yeSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRGlzcGxheSBjb250cm9sIGZpZWxkIG5hbWUgc3RhcnRpbmcgd2l0aCBbYXJndW1lbnRdIgorLy91c2FnZTogICAgICJcbgkteAlFeHRyYWN0IHBhY2thZ2VzIGZpbGVzeXN0ZW0gdHJlZSB0byBkaXJlY3RvcnkiCisvL3VzYWdlOiAgICAgIlxuCS1YCVZlcmJvc2UgZXh0cmFjdCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZHBrZ19kZWJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZHBrZy1kZWIgLVggLi9idXN5Ym94XzAuNDgtMV9pMzg2LmRlYiAvdG1wXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworI2RlZmluZSBEUEtHX0RFQl9PUFRfQ09OVEVOVFMgICAgICAgICAxCisjZGVmaW5lIERQS0dfREVCX09QVF9DT05UUk9MICAgICAgICAgIDIKKyNkZWZpbmUgRFBLR19ERUJfT1BUX0ZJRUxEICAgICAgICAgICAgNAorI2RlZmluZSBEUEtHX0RFQl9PUFRfRVhUUkFDVCAgICAgICAgICA4CisjZGVmaW5lIERQS0dfREVCX09QVF9FWFRSQUNUX1ZFUkJPU0UgMTYKKworaW50IGRwa2dfZGViX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkcGtnX2RlYl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICphcl9hcmNoaXZlOworCWFyY2hpdmVfaGFuZGxlX3QgKnRhcl9hcmNoaXZlOworCWxsaXN0X3QgKmNvbnRyb2xfdGFyX2xsaXN0ID0gTlVMTDsKKwl1bnNpZ25lZCBvcHQ7CisJY29uc3QgY2hhciAqZXh0cmFjdF9kaXI7CisJaW50IG5lZWRfYXJnczsKKworCS8qIFNldHVwIHRoZSB0YXIgYXJjaGl2ZSBoYW5kbGUgKi8KKwl0YXJfYXJjaGl2ZSA9IGluaXRfaGFuZGxlKCk7CisKKwkvKiBTZXR1cCBhbiBhciBhcmNoaXZlIGhhbmRsZSB0aGF0IHJlZmVycyB0byB0aGUgZ3ppcCBzdWIgYXJjaGl2ZSAqLworCWFyX2FyY2hpdmUgPSBpbml0X2hhbmRsZSgpOworCWFyX2FyY2hpdmUtPmRwa2dfX3N1Yl9hcmNoaXZlID0gdGFyX2FyY2hpdmU7CisJYXJfYXJjaGl2ZS0+ZmlsdGVyID0gZmlsdGVyX2FjY2VwdF9saXN0X3JlYXNzaWduOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwlsbGlzdF9hZGRfdG8oJmFyX2FyY2hpdmUtPmFjY2VwdCwgKGNoYXIqKSJkYXRhLnRhci5neiIpOworCWxsaXN0X2FkZF90bygmY29udHJvbF90YXJfbGxpc3QsIChjaGFyKikiY29udHJvbC50YXIuZ3oiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCWxsaXN0X2FkZF90bygmYXJfYXJjaGl2ZS0+YWNjZXB0LCAoY2hhciopImRhdGEudGFyLmJ6MiIpOworCWxsaXN0X2FkZF90bygmY29udHJvbF90YXJfbGxpc3QsIChjaGFyKikiY29udHJvbC50YXIuYnoyIik7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BCisJbGxpc3RfYWRkX3RvKCZhcl9hcmNoaXZlLT5hY2NlcHQsIChjaGFyKikiZGF0YS50YXIubHptYSIpOworCWxsaXN0X2FkZF90bygmY29udHJvbF90YXJfbGxpc3QsIChjaGFyKikiY29udHJvbC50YXIubHptYSIpOworI2VuZGlmCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJjLS1lZlh4OmUtLWNmWHg6Zi0tY2VYeDpYLS1jZWZ4OngtLWNlZlgiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJjZWZYeCIpOworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJaWYgKG9wdCAmIERQS0dfREVCX09QVF9DT05URU5UUykgeworCQl0YXJfYXJjaGl2ZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl92ZXJib3NlX2xpc3Q7CisJfQorCWV4dHJhY3RfZGlyID0gTlVMTDsKKwluZWVkX2FyZ3MgPSAxOworCWlmIChvcHQgJiBEUEtHX0RFQl9PUFRfQ09OVFJPTCkgeworCQlhcl9hcmNoaXZlLT5hY2NlcHQgPSBjb250cm9sX3Rhcl9sbGlzdDsKKwkJdGFyX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKwkJaWYgKDEgPT0gYXJnYykgeworCQkJZXh0cmFjdF9kaXIgPSAiLi9ERUJJQU4iOworCQl9IGVsc2UgeworCQkJbmVlZF9hcmdzKys7CisJCX0KKwl9CisJaWYgKG9wdCAmIERQS0dfREVCX09QVF9GSUVMRCkgeworCQkvKiBQcmludCB0aGUgZW50aXJlIGNvbnRyb2wgZmlsZQorCQkgKiBpdCBzaG91bGQgYWNjZXB0IGEgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIHNwZWNpZmllcyBhCisJCSAqIHNwZWNpZmljIGZpZWxkIHRvIHByaW50ICovCisJCWFyX2FyY2hpdmUtPmFjY2VwdCA9IGNvbnRyb2xfdGFyX2xsaXN0OworCQlsbGlzdF9hZGRfdG8oJih0YXJfYXJjaGl2ZS0+YWNjZXB0KSwgKGNoYXIqKSIuL2NvbnRyb2wiKTsKKwkJdGFyX2FyY2hpdmUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdDsKKwkJdGFyX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX3N0ZG91dDsKKwl9CisJaWYgKG9wdCAmIERQS0dfREVCX09QVF9FWFRSQUNUKSB7CisJCXRhcl9hcmNoaXZlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJfQorCWlmIChvcHQgJiAoRFBLR19ERUJfT1BUX0VYVFJBQ1RfVkVSQk9TRSB8IERQS0dfREVCX09QVF9FWFRSQUNUKSkgeworCQl0YXJfYXJjaGl2ZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfYWxsOworCQluZWVkX2FyZ3MgPSAyOworCX0KKworCWlmIChuZWVkX2FyZ3MgIT0gYXJnYykgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJdGFyX2FyY2hpdmUtPnNyY19mZCA9IGFyX2FyY2hpdmUtPnNyY19mZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKworCS8qIFdvcmsgb3V0IHdoZXJlIHRvIGV4dHJhY3QgdGhlIGZpbGVzICovCisJLyogMm5kIGFyZ3VtZW50IGlzIGEgZGlyIG5hbWUgKi8KKwlpZiAoYXJndlsxXSkgeworCQlleHRyYWN0X2RpciA9IGFyZ3ZbMV07CisJfQorCWlmIChleHRyYWN0X2RpcikgeworCQlta2RpcihleHRyYWN0X2RpciwgMDc3Nyk7IC8qIGJiX21ha2VfZGlyZWN0b3J5KGV4dHJhY3RfZGlyLCAwNzc3LCAwKSAqLworCQl4Y2hkaXIoZXh0cmFjdF9kaXIpOworCX0KKworCS8qIERvIGl0ICovCisJdW5wYWNrX2FyX2FyY2hpdmUoYXJfYXJjaGl2ZSk7CisKKwkvKiBDbGVhbnVwICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShhcl9hcmNoaXZlLT5zcmNfZmQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2d6aXAuYyBiL2FyY2hpdmFsL2d6aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNlYjRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvZ3ppcC5jCkBAIC0wLDAgKzEsMjEyMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogR3ppcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIEJhc2VkIG9uIEdOVSBnemlwIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkuCisgKgorICogT3JpZ2luYWxseSBhZGp1c3RlZCBmb3IgYnVzeWJveCBieSBDaGFybGVzIFAuIFdyaWdodCA8Y3B3QHVuaXguYXNiLmNvbT4KKyAqICJ0aGlzIGlzIGEgc3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIGd6aXAgSSBwdXQgaW50byBidXN5Ym94LCBpdCBkb2VzCisgKiBvbmx5IHN0YW5kYXJkIGluIHRvIHN0YW5kYXJkIG91dCB3aXRoIC05IGNvbXByZXNzaW9uLiAgSXQgYWxzbyByZXF1aXJlcworICogdGhlIHpjYXQgbW9kdWxlIGZvciBzb21lIGltcG9ydGFudCBmdW5jdGlvbnMuIgorICoKKyAqIEFkanVzdGVkIGZ1cnRoZXIgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiB0byBzdXBwb3J0CisgKiBmaWxlcyBhcyB3ZWxsIGFzIHN0ZGluL3N0ZG91dCwgYW5kIHRvIGdlbmVyYWxseSBiZWhhdmUgaXRzZWxmIHdydAorICogY29tbWFuZCBsaW5lIGhhbmRsaW5nLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogYmlnIG9iamVjdHMgaW4gYnNzOgorICogMDAwMDAwMjAgYiBibF9jb3VudAorICogMDAwMDAwNzQgYiBiYXNlX2xlbmd0aAorICogMDAwMDAwNzggYiBiYXNlX2Rpc3QKKyAqIDAwMDAwMDc4IGIgc3RhdGljX2R0cmVlCisgKiAwMDAwMDA5YyBiIGJsX3RyZWUKKyAqIDAwMDAwMGY0IGIgZHluX2R0cmVlCisgKiAwMDAwMDEwMCBiIGxlbmd0aF9jb2RlCisgKiAwMDAwMDIwMCBiIGRpc3RfY29kZQorICogMDAwMDAyM2QgYiBkZXB0aAorICogMDAwMDA0MDAgYiBmbGFnX2J1ZgorICogMDAwMDA0N2EgYiBoZWFwCisgKiAwMDAwMDQ4MCBiIHN0YXRpY19sdHJlZQorICogMDAwMDA4ZjQgYiBkeW5fbHRyZWUKKyAqLworCisvKiBUT0RPOiBmdWxsIHN1cHBvcnQgZm9yIC12IGZvciBERVNLVE9QCisgKiAiL3Vzci9iaW4vZ3ppcCAtdiBhIGJvZ3VzIGFhIiBzaG91bGQgc2F5OgorYTogICAgICAgODUuMSUgLS0gcmVwbGFjZWQgd2l0aCBhLmd6CitnemlwOiBib2d1czogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorYWE6ICAgICAgODUuMSUgLS0gcmVwbGFjZWQgd2l0aCBhYS5negorKi8KKworLy91c2FnZTojZGVmaW5lIGd6aXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2ZkXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZ3ppcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbXByZXNzIEZJTEVzIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVjb21wcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZ3ppcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC9idXN5Ym94KlxuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgMTc2MTI4MCBBcHIgMTQgMTc6NDcgL3RtcC9idXN5Ym94LnRhclxuIgorLy91c2FnZTogICAgICAgIiQgZ3ppcCAvdG1wL2J1c3lib3gudGFyXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC9idXN5Ym94KlxuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgIDU1NDA1OCBBcHIgMTQgMTc6NDkgL3RtcC9idXN5Ym94LnRhci5nelxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8vI2RlZmluZSBERUJVRyAxCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7IGlmICghKGNvbmQpKSBiYl9lcnJvcl9tc2cobXNnKTsgfQorIyAgZGVmaW5lIFRyYWNlKHgpIGZwcmludGYgeAorIyAgZGVmaW5lIFRyYWNldih4KSB7aWYgKHZlcmJvc2UpIGZwcmludGYgeDsgfQorIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh2ZXJib3NlID4gMSkgZnByaW50ZiB4OyB9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh2ZXJib3NlICYmIChjKSkgZnByaW50ZiB4OyB9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAodmVyYm9zZSA+IDEgJiYgKGMpKSBmcHJpbnRmIHg7IH0KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2RlZmluZSBTTUFMTF9NRU0KKworI2lmbmRlZiBJTkJVRlNJWgorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBJTkJVRlNJWiAgMHgyMDAwCS8qIGlucHV0IGJ1ZmZlciBzaXplICovCisjICBlbHNlCisjICAgIGRlZmluZSBJTkJVRlNJWiAgMHg4MDAwCS8qIGlucHV0IGJ1ZmZlciBzaXplICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1VUQlVGU0laCisjICBpZmRlZiBTTUFMTF9NRU0KKyMgICAgZGVmaW5lIE9VVEJVRlNJWiAgIDgxOTIJLyogb3V0cHV0IGJ1ZmZlciBzaXplICovCisjICBlbHNlCisjICAgIGRlZmluZSBPVVRCVUZTSVogIDE2Mzg0CS8qIG91dHB1dCBidWZmZXIgc2l6ZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERJU1RfQlVGU0laRQorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBESVNUX0JVRlNJWkUgMHgyMDAwCS8qIGJ1ZmZlciBmb3IgZGlzdGFuY2VzLCBzZWUgdHJlZXMuYyAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgRElTVF9CVUZTSVpFIDB4ODAwMAkvKiBidWZmZXIgZm9yIGRpc3RhbmNlcywgc2VlIHRyZWVzLmMgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEJLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIJLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQJLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4CS8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAJLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhDMAkvKiBiaXQgNiw3OiAgIHJlc2VydmVkICovCisKKy8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlICovCisjZGVmaW5lIFVOS05PV04gMHhmZmZmCisjZGVmaW5lIEJJTkFSWSAgMAorI2RlZmluZSBBU0NJSSAgIDEKKworI2lmbmRlZiBXU0laRQorIyAgZGVmaW5lIFdTSVpFIDB4ODAwMCAgLyogd2luZG93IHNpemUtLW11c3QgYmUgYSBwb3dlciBvZiB0d28sIGFuZCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgLyogIGF0IGxlYXN0IDMySyBmb3IgemlwJ3MgZGVmbGF0ZSBtZXRob2QgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKyNkZWZpbmUgTUFYX0RJU1QgIChXU0laRS1NSU5fTE9PS0FIRUFEKQorLyogSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGNvZGUsIHBhcnRpY3VsYXJseSBvbiAxNiBiaXQgbWFjaGluZXMsIG1hdGNoCisgKiBkaXN0YW5jZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0RJU1QgaW5zdGVhZCBvZiBXU0laRS4KKyAqLworCisjaWZuZGVmIE1BWF9QQVRIX0xFTgorIyAgZGVmaW5lIE1BWF9QQVRIX0xFTiAgIDEwMjQJLyogbWF4IHBhdGhuYW1lIGxlbmd0aCAqLworI2VuZGlmCisKKyNkZWZpbmUgc2Vla2FibGUoKSAgICAwCS8qIGZvcmNlIHNlcXVlbnRpYWwgb3V0cHV0ICovCisjZGVmaW5lIHRyYW5zbGF0ZV9lb2wgMAkvKiBubyBvcHRpb24gLWEgeWV0ICovCisKKyNpZm5kZWYgQklUUworIyAgZGVmaW5lIEJJVFMgMTYKKyNlbmRpZgorI2RlZmluZSBJTklUX0JJVFMgOQkJLyogSW5pdGlhbCBudW1iZXIgb2YgYml0cyBwZXIgY29kZSAqLworCisjZGVmaW5lIEJJVF9NQVNLICAgIDB4MWYJLyogTWFzayBmb3IgJ251bWJlciBvZiBjb21wcmVzc2lvbiBiaXRzJyAqLworLyogTWFzayAweDIwIGlzIHJlc2VydmVkIHRvIG1lYW4gYSBmb3VydGggaGVhZGVyIGJ5dGUsIGFuZCAweDQwIGlzIGZyZWUuCisgKiBJdCdzIGEgcGl0eSB0aGF0IG9sZCB1bmNvbXByZXNzIGRvZXMgbm90IGNoZWNrIGJpdCAweDIwLiBUaGF0IG1ha2VzCisgKiBleHRlbnNpb24gb2YgdGhlIGZvcm1hdCBhY3R1YWxseSB1bmRlc2lyYWJsZSBiZWNhdXNlIG9sZCBjb21wcmVzcworICogd291bGQganVzdCBjcmFzaCBvbiB0aGUgbmV3IGZvcm1hdCBpbnN0ZWFkIG9mIGdpdmluZyBhIG1lYW5pbmdmdWwKKyAqIGVycm9yIG1lc3NhZ2UuIEl0IGRvZXMgY2hlY2sgdGhlIG51bWJlciBvZiBiaXRzLCBidXQgaXQncyBtb3JlCisgKiBoZWxwZnVsIHRvIHNheSAidW5zdXBwb3J0ZWQgZm9ybWF0LCBnZXQgYSBuZXcgdmVyc2lvbiIgdGhhbgorICogImNhbiBvbmx5IGhhbmRsZSAxNiBiaXRzIi4KKyAqLworCisjaWZkZWYgTUFYX0VYVF9DSEFSUworIyAgZGVmaW5lIE1BWF9TVUZGSVggIE1BWF9FWFRfQ0hBUlMKKyNlbHNlCisjICBkZWZpbmUgTUFYX1NVRkZJWCAgMzAKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGlsZSB3aXRoIE1FRElVTV9NRU0gdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9yCisgKiB3aXRoIFNNQUxMX01FTSB0byB1c2UgYXMgbGl0dGxlIG1lbW9yeSBhcyBwb3NzaWJsZS4gVXNlIEJJR19NRU0gaWYgdGhlCisgKiBlbnRpcmUgaW5wdXQgZmlsZSBjYW4gYmUgaGVsZCBpbiBtZW1vcnkgKG5vdCBwb3NzaWJsZSBvbiAxNiBiaXQgc3lzdGVtcykuCisgKiBXYXJuaW5nOiBkZWZpbmluZyB0aGVzZSBzeW1ib2xzIGFmZmVjdHMgSEFTSF9CSVRTIChzZWUgYmVsb3cpIGFuZCB0aHVzCisgKiBhZmZlY3RzIHRoZSBjb21wcmVzc2lvbiByYXRpby4gVGhlIGNvbXByZXNzZWQgb3V0cHV0CisgKiBpcyBzdGlsbCBjb3JyZWN0LCBhbmQgbWlnaHQgZXZlbiBiZSBzbWFsbGVyIGluIHNvbWUgY2FzZXMuCisgKi8KKworI2lmZGVmIFNNQUxMX01FTQorIyAgIGRlZmluZSBIQVNIX0JJVFMgIDEzCS8qIE51bWJlciBvZiBiaXRzIHVzZWQgdG8gaGFzaCBzdHJpbmdzICovCisjZW5kaWYKKyNpZmRlZiBNRURJVU1fTUVNCisjICAgZGVmaW5lIEhBU0hfQklUUyAgMTQKKyNlbmRpZgorI2lmbmRlZiBIQVNIX0JJVFMKKyMgICBkZWZpbmUgSEFTSF9CSVRTICAxNQorICAgLyogRm9yIHBvcnRhYmlsaXR5IHRvIDE2IGJpdCBtYWNoaW5lcywgZG8gbm90IHVzZSB2YWx1ZXMgYWJvdmUgMTUuICovCisjZW5kaWYKKworI2RlZmluZSBIQVNIX1NJWkUgKHVuc2lnbmVkKSgxPDxIQVNIX0JJVFMpCisjZGVmaW5lIEhBU0hfTUFTSyAoSEFTSF9TSVpFLTEpCisjZGVmaW5lIFdNQVNLICAgICAoV1NJWkUtMSkKKy8qIEhBU0hfU0laRSBhbmQgV1NJWkUgbXVzdCBiZSBwb3dlcnMgb2YgdHdvICovCisjaWZuZGVmIFRPT19GQVIKKyMgIGRlZmluZSBUT09fRkFSIDQwOTYKKyNlbmRpZgorLyogTWF0Y2hlcyBvZiBsZW5ndGggMyBhcmUgZGlzY2FyZGVkIGlmIHRoZWlyIGRpc3RhbmNlIGV4Y2VlZHMgVE9PX0ZBUiAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhlc2UgdHlwZXMgYXJlIG5vdCByZWFsbHkgJ2NoYXInLCAnc2hvcnQnIGFuZCAnbG9uZycKKyAqLwordHlwZWRlZiB1aW50OF90IHVjaDsKK3R5cGVkZWYgdWludDE2X3QgdXNoOwordHlwZWRlZiB1aW50MzJfdCB1bGc7Cit0eXBlZGVmIGludDMyX3QgbG5nOworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIHVuc2lnbmVkIElQb3M7CisvKiBBIFBvcyBpcyBhbiBpbmRleCBpbiB0aGUgY2hhcmFjdGVyIHdpbmRvdy4gV2UgdXNlIHNob3J0IGluc3RlYWQgb2YgaW50IHRvCisgKiBzYXZlIHNwYWNlIGluIHRoZSB2YXJpb3VzIHRhYmxlcy4gSVBvcyBpcyB1c2VkIG9ubHkgZm9yIHBhcmFtZXRlciBwYXNzaW5nLgorICovCisKK2VudW0geworCVdJTkRPV19TSVpFID0gMiAqIFdTSVpFLAorLyogd2luZG93IHNpemUsIDIqV1NJWkUgZXhjZXB0IGZvciBNTUFQIG9yIEJJR19NRU0sIHdoZXJlIGl0IGlzIHRoZQorICogaW5wdXQgZmlsZSBsZW5ndGggcGx1cyBNSU5fTE9PS0FIRUFELgorICovCisKKwltYXhfY2hhaW5fbGVuZ3RoID0gNDA5NiwKKy8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzIGxlbmd0aC4KKyAqIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGUgc3BlZWQuCisgKi8KKworCW1heF9sYXp5X21hdGNoID0gMjU4LAorLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseQorICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24KKyAqIGxldmVscyA+PSA0LgorICovCisKKwltYXhfaW5zZXJ0X2xlbmd0aCA9IG1heF9sYXp5X21hdGNoLAorLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aAorICogaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuCisgKi8KKworCWdvb2RfbWF0Y2ggPSAzMiwKKy8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqLworCisvKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb24KKyAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0bworICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlCisgKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuCisgKi8KKworCW5pY2VfbWF0Y2ggPSAyNTgsCS8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi8KKy8qIE5vdGU6IHRoZSBkZWZsYXRlKCkgY29kZSByZXF1aXJlcyBtYXhfbGF6eSA+PSBNSU5fTUFUQ0ggYW5kIG1heF9jaGFpbiA+PSA0CisgKiBGb3IgZGVmbGF0ZV9mYXN0KCkgKGxldmVscyA8PSAzKSBnb29kIGlzIGlnbm9yZWQgYW5kIGxhenkgaGFzIGEgZGlmZmVyZW50CisgKiBtZWFuaW5nLgorICovCit9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKworCWxuZyBibG9ja19zdGFydDsKKworLyogd2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzCisgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgorICovCisJdW5zaWduZWQgaW5zX2g7CS8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovCisKKyNkZWZpbmUgSF9TSElGVCAgKChIQVNIX0JJVFMrTUlOX01BVENILTEpIC8gTUlOX01BVENIKQorLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggYW5kIGRlbF9oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoCisgKiBpbnB1dCBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKKyAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOgorICogSF9TSElGVCAqIE1JTl9NQVRDSCA+PSBIQVNIX0JJVFMKKyAqLworCisJdW5zaWduZWQgcHJldl9sZW5ndGg7CisKKy8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcworICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uCisgKi8KKworCXVuc2lnbmVkIHN0cnN0YXJ0OwkvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovCisJdW5zaWduZWQgbWF0Y2hfc3RhcnQ7CS8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqLworCXVuc2lnbmVkIGxvb2thaGVhZDsJLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2RlZmluZSBERUNMQVJFKHR5cGUsIGFycmF5LCBzaXplKSBcCisJdHlwZSAqIGFycmF5CisjZGVmaW5lIEFMTE9DKHR5cGUsIGFycmF5LCBzaXplKSBcCisJYXJyYXkgPSB4emFsbG9jKChzaXplX3QpKCgoc2l6ZSkrMUwpLzIpICogMipzaXplb2YodHlwZSkpCisjZGVmaW5lIEZSRUUoYXJyYXkpIFwKKwlkbyB7IGZyZWUoYXJyYXkpOyBhcnJheSA9IE5VTEw7IH0gd2hpbGUgKDApCisKKwkvKiBnbG9iYWwgYnVmZmVycyAqLworCisJLyogYnVmZmVyIGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovCisJLyogREVDTEFSRSh1Y2gsIGxfYnVmLCBMSVRfQlVGU0laRSk7ICovCisJREVDTEFSRSh1Y2gsIGxfYnVmLCBJTkJVRlNJWik7CisKKwlERUNMQVJFKHVzaCwgZF9idWYsIERJU1RfQlVGU0laRSk7CisJREVDTEFSRSh1Y2gsIG91dGJ1ZiwgT1VUQlVGU0laKTsKKworLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csCisgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCBXU0laRQorICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZgorICogV1NJWkUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzCisgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4gQWxzbywgaXQgbGltaXRzCisgKiB0aGUgd2luZG93IHNpemUgdG8gNjRLLCB3aGljaCBpcyBxdWl0ZSB1c2VmdWwgb24gTVNET1MuCisgKiBUbyBkbzogbGltaXQgdGhlIHdpbmRvdyBzaXplIHRvIFdTSVpFK0JTWiBpZiBTTUFMTF9NRU0gKHRoZSBjb2RlIHdvdWxkCisgKiBiZSBsZXNzIGVmZmljaWVudCkuCisgKi8KKwlERUNMQVJFKHVjaCwgd2luZG93LCAyTCAqIFdTSVpFKTsKKworLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuCisgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy4KKyAqLworCS8qIERFQ0xBUkUoUG9zLCBwcmV2LCBXU0laRSk7ICovCisJREVDTEFSRSh1c2gsIHByZXYsIDFMIDw8IEJJVFMpOworCisvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgMC4gKi8KKwkvKiBERUNMQVJFKFBvcywgaGVhZCwgMTw8SEFTSF9CSVRTKTsgKi8KKyNkZWZpbmUgaGVhZCAoRzEucHJldiArIFdTSVpFKSAvKiBoYXNoIGhlYWQgKHNlZSBkZWZsYXRlLmMpICovCisKKy8qIG51bWJlciBvZiBpbnB1dCBieXRlcyAqLworCXVsZyBpc2l6ZTsJCS8qIG9ubHkgMzIgYml0cyBzdG9yZWQgaW4gLmd6IGZpbGUgKi8KKworLyogYmJveCBhbHdheXMgdXNlIHN0ZGluL3N0ZG91dCAqLworI2RlZmluZSBpZmQgU1RESU5fRklMRU5PCS8qIGlucHV0IGZpbGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBvZmQgU1RET1VUX0ZJTEVOTwkvKiBvdXRwdXQgZmlsZSBkZXNjcmlwdG9yICovCisKKyNpZmRlZiBERUJVRworCXVuc2lnbmVkIGluc2l6ZTsJLyogdmFsaWQgYnl0ZXMgaW4gbF9idWYgKi8KKyNlbmRpZgorCXVuc2lnbmVkIG91dGNudDsJLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLworCisJc21hbGxpbnQgZW9maWxlOwkvKiBmbGFnIHNldCBhdCBlbmQgb2YgaW5wdXQgZmlsZSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEgdXNlZCBieSB0aGUgImJpdCBzdHJpbmciIHJvdXRpbmVzLgorICovCisKKwl1bnNpZ25lZCBzaG9ydCBiaV9idWY7CisKKy8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0IHNpZ25pZmljYW50CisgKiBiaXRzKS4KKyAqLworCisjdW5kZWYgQlVGX1NJWkUKKyNkZWZpbmUgQlVGX1NJWkUgKDggKiBzaXplb2YoRzEuYmlfYnVmKSkKKy8qIE51bWJlciBvZiBiaXRzIHVzZWQgd2l0aGluIGJpX2J1Zi4gKGJpX2J1ZiBtaWdodCBiZSBpbXBsZW1lbnRlZCBvbgorICogbW9yZSB0aGFuIDE2IGJpdHMgb24gc29tZSBzeXN0ZW1zLikKKyAqLworCisJaW50IGJpX3ZhbGlkOworCisvKiBDdXJyZW50IGlucHV0IGZ1bmN0aW9uLiBTZXQgdG8gbWVtX3JlYWQgZm9yIGluLW1lbW9yeSBjb21wcmVzc2lvbiAqLworCisjaWZkZWYgREVCVUcKKwl1bGcgYml0c19zZW50OwkJCS8qIGJpdCBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAqLworI2VuZGlmCisKKwkvKnVpbnQzMl90ICpjcmNfMzJfdGFiOyovCisJdWludDMyX3QgY3JjOwkvKiBzaGlmdCByZWdpc3RlciBjb250ZW50cyAqLworfTsKKworI2RlZmluZSBHMSAoKihwdHJfdG9fZ2xvYmFscyAtIDEpKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgdGhlIG91dHB1dCBidWZmZXIgb3V0YnVmWzAuLm91dGNudC0xXSBhbmQgdXBkYXRlIGJ5dGVzX291dC4KKyAqICh1c2VkIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIG9ubHkpCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX291dGJ1Zih2b2lkKQoreworCWlmIChHMS5vdXRjbnQgPT0gMCkKKwkJcmV0dXJuOworCisJeHdyaXRlKG9mZCwgKGNoYXIgKikgRzEub3V0YnVmLCBHMS5vdXRjbnQpOworCUcxLm91dGNudCA9IDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qIHB1dF84Yml0IGlzIHVzZWQgZm9yIHRoZSBjb21wcmVzc2VkIG91dHB1dCAqLworI2RlZmluZSBwdXRfOGJpdChjKSBcCitkbyB7IFwKKwlHMS5vdXRidWZbRzEub3V0Y250KytdID0gKGMpOyBcCisJaWYgKEcxLm91dGNudCA9PSBPVVRCVUZTSVopIGZsdXNoX291dGJ1ZigpOyBcCit9IHdoaWxlICgwKQorCisvKiBPdXRwdXQgYSAxNiBiaXQgdmFsdWUsIGxzYiBmaXJzdCAqLworc3RhdGljIHZvaWQgcHV0XzE2Yml0KHVzaCB3KQoreworCWlmIChHMS5vdXRjbnQgPCBPVVRCVUZTSVogLSAyKSB7CisJCUcxLm91dGJ1ZltHMS5vdXRjbnQrK10gPSB3OworCQlHMS5vdXRidWZbRzEub3V0Y250KytdID0gdyA+PiA4OworCX0gZWxzZSB7CisJCXB1dF84Yml0KHcpOworCQlwdXRfOGJpdCh3ID4+IDgpOworCX0KK30KKworc3RhdGljIHZvaWQgcHV0XzMyYml0KHVsZyBuKQoreworCXB1dF8xNmJpdChuKTsKKwlwdXRfMTZiaXQobiA+PiAxNik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUnVuIGEgc2V0IG9mIGJ5dGVzIHRocm91Z2ggdGhlIGNyYyBzaGlmdCByZWdpc3Rlci4gIElmIHMgaXMgYSBOVUxMCisgKiBwb2ludGVyLCB0aGVuIGluaXRpYWxpemUgdGhlIGNyYyBzaGlmdCByZWdpc3RlciBjb250ZW50cyBpbnN0ZWFkLgorICogUmV0dXJuIHRoZSBjdXJyZW50IGNyYyBpbiBlaXRoZXIgY2FzZS4KKyAqLworc3RhdGljIHZvaWQgdXBkY3JjKHVjaCAqIHMsIHVuc2lnbmVkIG4pCit7CisJRzEuY3JjID0gY3JjMzJfYmxvY2tfZW5kaWFuMChHMS5jcmMsIHMsIG4sIGdsb2JhbF9jcmMzMl90YWJsZSAvKkcxLmNyY18zMl90YWIqLyk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IGZpbGUsIHBlcmZvcm0gZW5kLW9mLWxpbmUKKyAqIHRyYW5zbGF0aW9uLCBhbmQgdXBkYXRlIHRoZSBjcmMgYW5kIGlucHV0IGZpbGUgc2l6ZS4KKyAqIElOIGFzc2VydGlvbjogc2l6ZSA+PSAyIChmb3IgZW5kLW9mLWxpbmUgdHJhbnNsYXRpb24pCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBmaWxlX3JlYWQodm9pZCAqYnVmLCB1bnNpZ25lZCBzaXplKQoreworCXVuc2lnbmVkIGxlbjsKKworCUFzc2VydChHMS5pbnNpemUgPT0gMCwgImxfYnVmIG5vdCBlbXB0eSIpOworCisJbGVuID0gc2FmZV9yZWFkKGlmZCwgYnVmLCBzaXplKTsKKwlpZiAobGVuID09ICh1bnNpZ25lZCkoLTEpIHx8IGxlbiA9PSAwKQorCQlyZXR1cm4gbGVuOworCisJdXBkY3JjKGJ1ZiwgbGVuKTsKKwlHMS5pc2l6ZSArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfYml0cyhpbnQgdmFsdWUsIGludCBsZW5ndGgpCit7CisjaWZkZWYgREVCVUcKKwlUcmFjZXYoKHN0ZGVyciwgIiBsICUyZCB2ICU0eCAiLCBsZW5ndGgsIHZhbHVlKSk7CisJQXNzZXJ0KGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDE1LCAiaW52YWxpZCBsZW5ndGgiKTsKKwlHMS5iaXRzX3NlbnQgKz0gbGVuZ3RoOworI2VuZGlmCisJLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKKwkgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCisJICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCisJICovCisJaWYgKEcxLmJpX3ZhbGlkID4gKGludCkgQlVGX1NJWkUgLSBsZW5ndGgpIHsKKwkJRzEuYmlfYnVmIHw9ICh2YWx1ZSA8PCBHMS5iaV92YWxpZCk7CisJCXB1dF8xNmJpdChHMS5iaV9idWYpOworCQlHMS5iaV9idWYgPSAodXNoKSB2YWx1ZSA+PiAoQlVGX1NJWkUgLSBHMS5iaV92YWxpZCk7CisJCUcxLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJVRl9TSVpFOworCX0gZWxzZSB7CisJCUcxLmJpX2J1ZiB8PSB2YWx1ZSA8PCBHMS5iaV92YWxpZDsKKwkJRzEuYmlfdmFsaWQgKz0gbGVuZ3RoOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCisgKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCisgKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBiaV9yZXZlcnNlKHVuc2lnbmVkIGNvZGUsIGludCBsZW4pCit7CisJdW5zaWduZWQgcmVzID0gMDsKKworCXdoaWxlICgxKSB7CisJCXJlcyB8PSBjb2RlICYgMTsKKwkJaWYgKC0tbGVuIDw9IDApIHJldHVybiByZXM7CisJCWNvZGUgPj49IDE7CisJCXJlcyA8PD0gMTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSBvdXQgYW55IHJlbWFpbmluZyBiaXRzIGluIGFuIGluY29tcGxldGUgYnl0ZS4KKyAqLworc3RhdGljIHZvaWQgYmlfd2luZHVwKHZvaWQpCit7CisJaWYgKEcxLmJpX3ZhbGlkID4gOCkgeworCQlwdXRfMTZiaXQoRzEuYmlfYnVmKTsKKwl9IGVsc2UgaWYgKEcxLmJpX3ZhbGlkID4gMCkgeworCQlwdXRfOGJpdChHMS5iaV9idWYpOworCX0KKwlHMS5iaV9idWYgPSAwOworCUcxLmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworCUcxLmJpdHNfc2VudCA9IChHMS5iaXRzX3NlbnQgKyA3KSAmIH43OworI2VuZGlmCit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IGEgc3RvcmVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZSwgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHMKKyAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLgorICovCitzdGF0aWMgdm9pZCBjb3B5X2Jsb2NrKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBpbnQgaGVhZGVyKQoreworCWJpX3dpbmR1cCgpOwkJLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworCisJaWYgKGhlYWRlcikgeworCQlwdXRfMTZiaXQobGVuKTsKKwkJcHV0XzE2Yml0KH5sZW4pOworI2lmZGVmIERFQlVHCisJCUcxLmJpdHNfc2VudCArPSAyICogMTY7CisjZW5kaWYKKwl9CisjaWZkZWYgREVCVUcKKwlHMS5iaXRzX3NlbnQgKz0gKHVsZykgbGVuIDw8IDM7CisjZW5kaWYKKwl3aGlsZSAobGVuLS0pIHsKKwkJcHV0XzhiaXQoKmJ1ZisrKTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgorICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLCBhbmQgc2V0cyBlb2ZpbGUgaWYgZW5kIG9mIGlucHV0IGZpbGUuCisgKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgc3Ryc3RhcnQgKyBsb29rYWhlYWQgPiAwCisgKiBPVVQgYXNzZXJ0aW9uczogYXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgZW9maWxlIGlzIHNldDsKKyAqICAgIGZpbGUgcmVhZHMgYXJlIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlCisgKiAgICB0cmFuc2xhdGVfZW9sIG9wdGlvbikuCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfd2luZG93KHZvaWQpCit7CisJdW5zaWduZWQgbiwgbTsKKwl1bnNpZ25lZCBtb3JlID0JV0lORE9XX1NJWkUgLSBHMS5sb29rYWhlYWQgLSBHMS5zdHJzdGFydDsKKwkvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCisKKwkvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLAorCSAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisJICovCisJaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSAtMSkgeworCQkvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYgc3Ryc3RhcnQgPT0gMAorCQkgKiBhbmQgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgb25lIGJ5dGUgYXQgdGltZSkKKwkJICovCisJCW1vcmUtLTsKKwl9IGVsc2UgaWYgKEcxLnN0cnN0YXJ0ID49IFdTSVpFICsgTUFYX0RJU1QpIHsKKwkJLyogQnkgdGhlIElOIGFzc2VydGlvbiwgdGhlIHdpbmRvdyBpcyBub3QgZW1wdHkgc28gd2UgY2FuJ3QgY29uZnVzZQorCQkgKiBtb3JlID09IDAgd2l0aCBtb3JlID09IDY0SyBvbiBhIDE2IGJpdCBtYWNoaW5lLgorCQkgKi8KKwkJQXNzZXJ0KFdJTkRPV19TSVpFID09IDIgKiBXU0laRSwgIm5vIHNsaWRpbmcgd2l0aCBCSUdfTUVNIik7CisKKwkJbWVtY3B5KEcxLndpbmRvdywgRzEud2luZG93ICsgV1NJWkUsIFdTSVpFKTsKKwkJRzEubWF0Y2hfc3RhcnQgLT0gV1NJWkU7CisJCUcxLnN0cnN0YXJ0IC09IFdTSVpFOwkvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVDogKi8KKworCQlHMS5ibG9ja19zdGFydCAtPSBXU0laRTsKKworCQlmb3IgKG4gPSAwOyBuIDwgSEFTSF9TSVpFOyBuKyspIHsKKwkJCW0gPSBoZWFkW25dOworCQkJaGVhZFtuXSA9IChQb3MpIChtID49IFdTSVpFID8gbSAtIFdTSVpFIDogMCk7CisJCX0KKwkJZm9yIChuID0gMDsgbiA8IFdTSVpFOyBuKyspIHsKKwkJCW0gPSBHMS5wcmV2W25dOworCQkJRzEucHJldltuXSA9IChQb3MpIChtID49IFdTSVpFID8gbSAtIFdTSVpFIDogMCk7CisJCQkvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAorCQkJICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKwkJCSAqLworCQl9CisJCW1vcmUgKz0gV1NJWkU7CisJfQorCS8qIEF0IHRoaXMgcG9pbnQsIG1vcmUgPj0gMiAqLworCWlmICghRzEuZW9maWxlKSB7CisJCW4gPSBmaWxlX3JlYWQoRzEud2luZG93ICsgRzEuc3Ryc3RhcnQgKyBHMS5sb29rYWhlYWQsIG1vcmUpOworCQlpZiAobiA9PSAwIHx8IG4gPT0gKHVuc2lnbmVkKSAtMSkgeworCQkJRzEuZW9maWxlID0gMTsKKwkJfSBlbHNlIHsKKwkJCUcxLmxvb2thaGVhZCArPSBuOworCQl9CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCisgKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCisgKiBnYXJiYWdlLgorICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAorICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQorICovCisKKy8qIEZvciBNU0RPUywgT1MvMiBhbmQgMzg2IFVuaXgsIGFuIG9wdGltaXplZCB2ZXJzaW9uIGlzIGluIG1hdGNoLmFzbSBvcgorICogbWF0Y2gucy4gVGhlIGNvZGUgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQsIHNvIHlvdSBjYW4gdXNlIHRoZSBDIHZlcnNpb24KKyAqIGlmIGRlc2lyZWQuCisgKi8KK3N0YXRpYyBpbnQgbG9uZ2VzdF9tYXRjaChJUG9zIGN1cl9tYXRjaCkKK3sKKwl1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBtYXhfY2hhaW5fbGVuZ3RoOwkvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KKwl1Y2ggKnNjYW4gPSBHMS53aW5kb3cgKyBHMS5zdHJzdGFydDsJLyogY3VycmVudCBzdHJpbmcgKi8KKwl1Y2ggKm1hdGNoOwkvKiBtYXRjaGVkIHN0cmluZyAqLworCWludCBsZW47CS8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisJaW50IGJlc3RfbGVuID0gRzEucHJldl9sZW5ndGg7CS8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworCUlQb3MgbGltaXQgPSBHMS5zdHJzdGFydCA+IChJUG9zKSBNQVhfRElTVCA/IEcxLnN0cnN0YXJ0IC0gKElQb3MpIE1BWF9ESVNUIDogMDsKKwkvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorCSAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisJICovCisKKy8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAqLworI2lmIEhBU0hfQklUUyA8IDggfHwgTUFYX01BVENIICE9IDI1OAorIyAgZXJyb3IgQ29kZSB0b28gY2xldmVyCisjZW5kaWYKKwl1Y2ggKnN0cmVuZCA9IEcxLndpbmRvdyArIEcxLnN0cnN0YXJ0ICsgTUFYX01BVENIOworCXVjaCBzY2FuX2VuZDEgPSBzY2FuW2Jlc3RfbGVuIC0gMV07CisJdWNoIHNjYW5fZW5kID0gc2NhbltiZXN0X2xlbl07CisKKwkvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworCWlmIChHMS5wcmV2X2xlbmd0aCA+PSBnb29kX21hdGNoKSB7CisJCWNoYWluX2xlbmd0aCA+Pj0gMjsKKwl9CisJQXNzZXJ0KEcxLnN0cnN0YXJ0IDw9IFdJTkRPV19TSVpFIC0gTUlOX0xPT0tBSEVBRCwgImluc3VmZmljaWVudCBsb29rYWhlYWQiKTsKKworCWRvIHsKKwkJQXNzZXJ0KGN1cl9tYXRjaCA8IEcxLnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisJCW1hdGNoID0gRzEud2luZG93ICsgY3VyX21hdGNoOworCisJCS8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZQorCQkgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOgorCQkgKi8KKwkJaWYgKG1hdGNoW2Jlc3RfbGVuXSAhPSBzY2FuX2VuZAorCQkgfHwgbWF0Y2hbYmVzdF9sZW4gLSAxXSAhPSBzY2FuX2VuZDEKKwkJIHx8ICptYXRjaCAhPSAqc2NhbiB8fCAqKyttYXRjaCAhPSBzY2FuWzFdCisJCSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorCQkgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorCQkgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorCQkgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisJCSAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorCQkgKi8KKwkJc2NhbiArPSAyLCBtYXRjaCsrOworCisJCS8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247CisJCSAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorCQkgKi8KKwkJZG8geworCQl9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKwkJCQkgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisJCQkJICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorCQkJCSAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgc2NhbiA8IHN0cmVuZCk7CisKKwkJbGVuID0gTUFYX01BVENIIC0gKGludCkgKHN0cmVuZCAtIHNjYW4pOworCQlzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisJCWlmIChsZW4gPiBiZXN0X2xlbikgeworCQkJRzEubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CisJCQliZXN0X2xlbiA9IGxlbjsKKwkJCWlmIChsZW4gPj0gbmljZV9tYXRjaCkKKwkJCQlicmVhazsKKwkJCXNjYW5fZW5kMSA9IHNjYW5bYmVzdF9sZW4gLSAxXTsKKwkJCXNjYW5fZW5kID0gc2NhbltiZXN0X2xlbl07CisJCX0KKwl9IHdoaWxlICgoY3VyX21hdGNoID0gRzEucHJldltjdXJfbWF0Y2ggJiBXTUFTS10pID4gbGltaXQKKwkJCSAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKworCXJldHVybiBiZXN0X2xlbjsKK30KKworCisjaWZkZWYgREVCVUcKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgdGhhdCB0aGUgbWF0Y2ggYXQgbWF0Y2hfc3RhcnQgaXMgaW5kZWVkIGEgbWF0Y2guCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX21hdGNoKElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsIGludCBsZW5ndGgpCit7CisJLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKwlpZiAobWVtY21wKEcxLndpbmRvdyArIG1hdGNoLCBHMS53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSAwKSB7CisJCWJiX2Vycm9yX21zZygiIHN0YXJ0ICVkLCBtYXRjaCAlZCwgbGVuZ3RoICVkIiwgc3RhcnQsIG1hdGNoLCBsZW5ndGgpOworCQliYl9lcnJvcl9tc2coImludmFsaWQgbWF0Y2giKTsKKwl9CisJaWYgKHZlcmJvc2UgPiAxKSB7CisJCWJiX2Vycm9yX21zZygiXFxbJWQsJWRdIiwgc3RhcnQgLSBtYXRjaCwgbGVuZ3RoKTsKKwkJZG8geworCQkJYmJfcHV0Y2hhcl9zdGRlcnIoRzEud2luZG93W3N0YXJ0KytdKTsKKwkJfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisJfQorfQorI2Vsc2UKKyMgIGRlZmluZSBjaGVja19tYXRjaChzdGFydCwgbWF0Y2gsIGxlbmd0aCkgKCh2b2lkKTApCisjZW5kaWYKKworCisvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKy8qICBQVVJQT1NFCisgKiAgICAgIEVuY29kZSB2YXJpb3VzIHNldHMgb2Ygc291cmNlIHZhbHVlcyB1c2luZyB2YXJpYWJsZS1sZW5ndGgKKyAqICAgICAgYmluYXJ5IGNvZGUgdHJlZXMuCisgKgorICogIERJU0NVU1NJT04KKyAqICAgICAgVGhlIFBLWklQICJkZWZsYXRpb24iIHByb2Nlc3MgdXNlcyBzZXZlcmFsIEh1ZmZtYW4gdHJlZXMuIFRoZSBtb3JlCisgKiAgICAgIGNvbW1vbiBzb3VyY2UgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBzaG9ydGVyIGJpdCBzZXF1ZW5jZXMuCisgKgorICogICAgICBFYWNoIGNvZGUgdHJlZSBpcyBzdG9yZWQgaW4gdGhlIFpJUCBmaWxlIGluIGEgY29tcHJlc3NlZCBmb3JtCisgKiAgICAgIHdoaWNoIGlzIGl0c2VsZiBhIEh1ZmZtYW4gZW5jb2Rpbmcgb2YgdGhlIGxlbmd0aHMgb2YKKyAqICAgICAgYWxsIHRoZSBjb2RlIHN0cmluZ3MgKGluIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4KKyAqICAgICAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgbGVuZ3RocyBpbgorICogICAgICB0aGUgVU5aSVAgcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIHRoZSAiYXBwbGljYXRpb24gbm90ZSIKKyAqICAgICAgKEFQUE5PVEUuVFhUKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIFBLV0FSRSdzIFBLWklQIHByb2dyYW0uCisgKgorICogIFJFRkVSRU5DRVMKKyAqICAgICAgTHluY2gsIFRob21hcyBKLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIFRlY2huaXF1ZXMgYW5kIEFwcGxpY2F0aW9ucywgcHAuIDUzLTU1LgorICogICAgICAgICAgTGlmZXRpbWUgTGVhcm5pbmcgUHVibGljYXRpb25zLCAxOTg1LiAgSVNCTiAwLTUzNC0wMzQxOC03LgorICoKKyAqICAgICAgU3RvcmVyLCBKYW1lcyBBLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIE1ldGhvZHMgYW5kIFRoZW9yeSwgcHAuIDQ5LTUwLgorICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4gIElTQk4gMC03MTY3LTgxNTYtNS4KKyAqCisgKiAgICAgIFNlZGdld2ljaywgUi4KKyAqICAgICAgICAgIEFsZ29yaXRobXMsIHAyOTAuCisgKiAgICAgICAgICBBZGRpc29uLVdlc2xleSwgMTk4My4gSVNCTiAwLTIwMS0wNjY3Mi02LgorICoKKyAqICBJTlRFUkZBQ0UKKyAqICAgICAgdm9pZCBjdF9pbml0KCkKKyAqICAgICAgICAgIEFsbG9jYXRlIHRoZSBtYXRjaCBidWZmZXIsIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgdGFibGVzIFthbmQgc2F2ZQorICogICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZSAoYXNjaWkvYmluYXJ5KSBhbmQKKyAqICAgICAgICAgIG1ldGhvZCAoREVGTEFURS9TVE9SRSkgLS0gZGVsZXRlZCBpbiBiYm94XQorICoKKyAqICAgICAgdm9pZCBjdF90YWxseShpbnQgZGlzdCwgaW50IGxjKTsKKyAqICAgICAgICAgIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLgorICoKKyAqICAgICAgdWxnIGZsdXNoX2Jsb2NrKGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sIGludCBlb2YpCisgKiAgICAgICAgICBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLAorICogICAgICAgICAgc3RhdGljIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAKKyAqICAgICAgICAgIGZpbGUuIFJldHVybnMgdGhlIHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBmYXIuCisgKi8KKworI2RlZmluZSBNQVhfQklUUyAxNQorLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgRU5EX0JMT0NLIDI1NgorLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqLworCisjZGVmaW5lIExfQ09ERVMgKExJVEVSQUxTKzErTEVOR1RIX0NPREVTKQorLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgRF9DT0RFUyAgIDMwCisvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworI2RlZmluZSBCTF9DT0RFUyAgMTkKKy8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqLworCisvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCitzdGF0aWMgY29uc3QgdWludDhfdCBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIEFMSUdOMSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LAorCTQsIDQsIDUsIDUsIDUsIDUsIDAKK307CisKKy8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXh0cmFfZGJpdHNbRF9DT0RFU10gQUxJR04xID0geworCTAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksCisJMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzCit9OworCisvKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXh0cmFfYmxiaXRzW0JMX0NPREVTXSBBTElHTjEgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNyB9OworCisvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGJsX29yZGVyW0JMX0NPREVTXSBBTElHTjEgPSB7CisJMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSB9OworCisjZGVmaW5lIFNUT1JFRF9CTE9DSyAwCisjZGVmaW5lIFNUQVRJQ19UUkVFUyAxCisjZGVmaW5lIERZTl9UUkVFUyAgICAyCisvKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLworCisjaWZuZGVmIExJVF9CVUZTSVpFCisjICBpZmRlZiBTTUFMTF9NRU0KKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDIwMDAKKyMgIGVsc2UKKyMgIGlmZGVmIE1FRElVTV9NRU0KKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDQwMDAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDgwMDAKKyMgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIERJU1RfQlVGU0laRQorIyAgZGVmaW5lIERJU1RfQlVGU0laRSAgTElUX0JVRlNJWkUKKyNlbmRpZgorLyogU2l6ZXMgb2YgbWF0Y2ggYnVmZmVycyBmb3IgbGl0ZXJhbHMvbGVuZ3RocyBhbmQgZGlzdGFuY2VzLiAgVGhlcmUgYXJlCisgKiA0IHJlYXNvbnMgZm9yIGxpbWl0aW5nIExJVF9CVUZTSVpFIHRvIDY0SzoKKyAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKKyAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQgZGF0YSBpcworICogICAgIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlbiB3aGVuIGlucHV0CisgKiAgICAgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yIGFsbCBibG9ja3MgaWYKKyAqICAgICBMSVRfQlVGU0laRSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4KKyAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCisgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0CisgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgorICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlCisgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nIHRyZWVzCisgKiAgICAgbW9yZSBmcmVxdWVudGx5LgorICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNAorICogVGhlIGN1cnJlbnQgY29kZSBpcyBnZW5lcmFsIGFuZCBhbGxvd3MgRElTVF9CVUZTSVpFIDwgTElUX0JVRlNJWkUgKHRvIHNhdmUKKyAqIG1lbW9yeSBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbikuIFNvbWUgb3B0aW1pemF0aW9ucyB3b3VsZCBiZSBwb3NzaWJsZQorICogaWYgd2UgcmVseSBvbiBESVNUX0JVRlNJWkUgPT0gTElUX0JVRlNJWkUuCisgKi8KKyNkZWZpbmUgUkVQXzNfNiAgICAgIDE2CisvKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCisjZGVmaW5lIFJFUFpfM18xMCAgICAxNworLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YSB7CisJdW5pb24geworCQl1c2ggZnJlcTsJCS8qIGZyZXF1ZW5jeSBjb3VudCAqLworCQl1c2ggY29kZTsJCS8qIGJpdCBzdHJpbmcgKi8KKwl9IGZjOworCXVuaW9uIHsKKwkJdXNoIGRhZDsJCS8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLworCQl1c2ggbGVuOwkJLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKwl9IGRsOworfSBjdF9kYXRhOworCisjZGVmaW5lIEZyZXEgZmMuZnJlcQorI2RlZmluZSBDb2RlIGZjLmNvZGUKKyNkZWZpbmUgRGFkICBkbC5kYWQKKyNkZWZpbmUgTGVuICBkbC5sZW4KKworI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9DT0RFUyArIDEpCisvKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLworCit0eXBlZGVmIHN0cnVjdCB0cmVlX2Rlc2MgeworCWN0X2RhdGEgKmR5bl90cmVlOwkvKiB0aGUgZHluYW1pYyB0cmVlICovCisJY3RfZGF0YSAqc3RhdGljX3RyZWU7CS8qIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgb3IgTlVMTCAqLworCWNvbnN0IHVpbnQ4X3QgKmV4dHJhX2JpdHM7CS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisJaW50IGV4dHJhX2Jhc2U7CQkvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisJaW50IGVsZW1zOwkJCS8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi8KKwlpbnQgbWF4X2xlbmd0aDsJCS8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KKwlpbnQgbWF4X2NvZGU7CQkvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KK30gdHJlZV9kZXNjOworCitzdHJ1Y3QgZ2xvYmFsczIgeworCisJdXNoIGhlYXBbSEVBUF9TSVpFXTsgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqLworCWludCBoZWFwX2xlbjsgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi8KKwlpbnQgaGVhcF9tYXg7ICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqLworCisvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy4KKyAqLworCisJY3RfZGF0YSBkeW5fbHRyZWVbSEVBUF9TSVpFXTsJLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKwljdF9kYXRhIGR5bl9kdHJlZVsyICogRF9DT0RFUyArIDFdOwkvKiBkaXN0YW5jZSB0cmVlICovCisKKwljdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTICsgMl07CisKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIGN0X2luaXQKKyAqIGJlbG93KS4KKyAqLworCisJY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKworCWN0X2RhdGEgYmxfdHJlZVsyICogQkxfQ09ERVMgKyAxXTsKKworLyogSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgKi8KKworCXRyZWVfZGVzYyBsX2Rlc2M7CisJdHJlZV9kZXNjIGRfZGVzYzsKKwl0cmVlX2Rlc2MgYmxfZGVzYzsKKworCXVzaCBibF9jb3VudFtNQVhfQklUUyArIDFdOworCisvKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCisgKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KKyAqLworCisJdWNoIGRlcHRoWzIgKiBMX0NPREVTICsgMV07CisKKy8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kgKi8KKworCXVjaCBsZW5ndGhfY29kZVtNQVhfTUFUQ0ggLSBNSU5fTUFUQ0ggKyAxXTsKKworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCisJdWNoIGRpc3RfY29kZVs1MTJdOworCisvKiBkaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzCisgKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCisgKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KKyAqLworCisJaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU107CisKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKKwlpbnQgYmFzZV9kaXN0W0RfQ09ERVNdOworCisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisJdWNoIGZsYWdfYnVmW0xJVF9CVUZTSVpFIC8gOF07CisKKy8qIGZsYWdfYnVmIGlzIGEgYml0IGFycmF5IGRpc3Rpbmd1aXNoaW5nIGxpdGVyYWxzIGZyb20gbGVuZ3RocyBpbgorICogbF9idWYsIHRodXMgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIGRpc3RhbmNlLgorICovCisKKwl1bnNpZ25lZCBsYXN0X2xpdDsgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCXVuc2lnbmVkIGxhc3RfZGlzdDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGRfYnVmICovCisJdW5zaWduZWQgbGFzdF9mbGFnczsgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZmxhZ19idWYgKi8KKwl1Y2ggZmxhZ3M7ICAgICAgICAgICAgICAgLyogY3VycmVudCBmbGFncyBub3QgeWV0IHNhdmVkIGluIGZsYWdfYnVmICovCisJdWNoIGZsYWdfYml0OyAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0IHVzZWQgaW4gZmxhZ3MgKi8KKworLyogYml0cyBhcmUgZmlsbGVkIGluIGZsYWdzIHN0YXJ0aW5nIGF0IGJpdCAwIChsZWFzdCBzaWduaWZpY2FudCkuCisgKiBOb3RlOiB0aGVzZSBmbGFncyBhcmUgb3ZlcmtpbGwgaW4gdGhlIGN1cnJlbnQgY29kZSBzaW5jZSB3ZSBkb24ndAorICogdGFrZSBhZHZhbnRhZ2Ugb2YgRElTVF9CVUZTSVpFID09IExJVF9CVUZTSVpFLgorICovCisKKwl1bGcgb3B0X2xlbjsgICAgICAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLworCXVsZyBzdGF0aWNfbGVuOyAgICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKworCXVsZyBjb21wcmVzc2VkX2xlbjsgICAgICAvKiB0b3RhbCBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZmlsZSAqLworfTsKKworI2RlZmluZSBHMnB0ciAoKHN0cnVjdCBnbG9iYWxzMiopKHB0cl90b19nbG9iYWxzKSkKKyNkZWZpbmUgRzIgKCpHMnB0cikKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgZ2VuX2NvZGVzKGN0X2RhdGEgKiB0cmVlLCBpbnQgbWF4X2NvZGUpOworc3RhdGljIHZvaWQgYnVpbGRfdHJlZSh0cmVlX2Rlc2MgKiBkZXNjKTsKK3N0YXRpYyB2b2lkIHNjYW5fdHJlZShjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKTsKK3N0YXRpYyB2b2lkIHNlbmRfdHJlZShjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKTsKK3N0YXRpYyBpbnQgYnVpbGRfYmxfdHJlZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHNlbmRfYWxsX3RyZWVzKGludCBsY29kZXMsIGludCBkY29kZXMsIGludCBibGNvZGVzKTsKK3N0YXRpYyB2b2lkIGNvbXByZXNzX2Jsb2NrKGN0X2RhdGEgKiBsdHJlZSwgY3RfZGF0YSAqIGR0cmVlKTsKKworCisjaWZuZGVmIERFQlVHCisvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQgdHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworIyAgZGVmaW5lIFNFTkRfQ09ERShjLCB0cmVlKSBzZW5kX2JpdHModHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbikKKyNlbHNlCisjICBkZWZpbmUgU0VORF9DT0RFKGMsIHRyZWUpIFwKK3sgXAorCWlmICh2ZXJib3NlID4gMSkgYmJfZXJyb3JfbXNnKCJcbmNkICUzZCAiLCAoYykpOyBcCisJc2VuZF9iaXRzKHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyBcCit9CisjZW5kaWYKKworI2RlZmluZSBEX0NPREUoZGlzdCkgXAorCSgoZGlzdCkgPCAyNTYgPyBHMi5kaXN0X2NvZGVbZGlzdF0gOiBHMi5kaXN0X2NvZGVbMjU2ICsgKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gZGlzdF9jb2RlWzI1Nl0gYW5kIGRpc3RfY29kZVsyNTddIGFyZSBuZXZlcgorICogdXNlZC4KKyAqIFRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuCisgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfYmxvY2sodm9pZCkKK3sKKwlpbnQgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisKKwkvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi8KKwlmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgbisrKQorCQlHMi5keW5fbHRyZWVbbl0uRnJlcSA9IDA7CisJZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykKKwkJRzIuZHluX2R0cmVlW25dLkZyZXEgPSAwOworCWZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKQorCQlHMi5ibF90cmVlW25dLkZyZXEgPSAwOworCisJRzIuZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisJRzIub3B0X2xlbiA9IEcyLnN0YXRpY19sZW4gPSAwOworCUcyLmxhc3RfbGl0ID0gRzIubGFzdF9kaXN0ID0gRzIubGFzdF9mbGFncyA9IDA7CisJRzIuZmxhZ3MgPSAwOworCUcyLmZsYWdfYml0ID0gMTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworCisvKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgorICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguICovCisjZGVmaW5lIFNNQUxMRVIodHJlZSwgbiwgbSkgXAorCSh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgXAorCXx8ICh0cmVlW25dLkZyZXEgPT0gdHJlZVttXS5GcmVxICYmIEcyLmRlcHRoW25dIDw9IEcyLmRlcHRoW21dKSkKKworc3RhdGljIHZvaWQgcHFkb3duaGVhcChjdF9kYXRhICogdHJlZSwgaW50IGspCit7CisJaW50IHYgPSBHMi5oZWFwW2tdOworCWludCBqID0gayA8PCAxOwkJLyogbGVmdCBzb24gb2YgayAqLworCisJd2hpbGUgKGogPD0gRzIuaGVhcF9sZW4pIHsKKwkJLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KKwkJaWYgKGogPCBHMi5oZWFwX2xlbiAmJiBTTUFMTEVSKHRyZWUsIEcyLmhlYXBbaiArIDFdLCBHMi5oZWFwW2pdKSkKKwkJCWorKzsKKworCQkvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworCQlpZiAoU01BTExFUih0cmVlLCB2LCBHMi5oZWFwW2pdKSkKKwkJCWJyZWFrOworCisJCS8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisJCUcyLmhlYXBba10gPSBHMi5oZWFwW2pdOworCQlrID0gajsKKworCQkvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCisJCWogPDw9IDE7CisJfQorCUcyLmhlYXBba10gPSB2OworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGgKKyAqIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kCisgKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgorICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZQorICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLgorICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcworICogICAgIG5vdCBudWxsLgorICovCitzdGF0aWMgdm9pZCBnZW5fYml0bGVuKHRyZWVfZGVzYyAqIGRlc2MpCit7CisJY3RfZGF0YSAqdHJlZSA9IGRlc2MtPmR5bl90cmVlOworCWNvbnN0IHVpbnQ4X3QgKmV4dHJhID0gZGVzYy0+ZXh0cmFfYml0czsKKwlpbnQgYmFzZSA9IGRlc2MtPmV4dHJhX2Jhc2U7CisJaW50IG1heF9jb2RlID0gZGVzYy0+bWF4X2NvZGU7CisJaW50IG1heF9sZW5ndGggPSBkZXNjLT5tYXhfbGVuZ3RoOworCWN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdGljX3RyZWU7CisJaW50IGg7CQkJCS8qIGhlYXAgaW5kZXggKi8KKwlpbnQgbiwgbTsJCQkvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KKwlpbnQgYml0czsJCQkvKiBiaXQgbGVuZ3RoICovCisJaW50IHhiaXRzOwkJCS8qIGV4dHJhIGJpdHMgKi8KKwl1c2ggZjsJCQkJLyogZnJlcXVlbmN5ICovCisJaW50IG92ZXJmbG93ID0gMDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KKworCWZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykKKwkJRzIuYmxfY291bnRbYml0c10gPSAwOworCisJLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXkKKwkgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KKwkgKi8KKwl0cmVlW0cyLmhlYXBbRzIuaGVhcF9tYXhdXS5MZW4gPSAwOwkvKiByb290IG9mIHRoZSBoZWFwICovCisKKwlmb3IgKGggPSBHMi5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykgeworCQluID0gRzIuaGVhcFtoXTsKKwkJYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7CisJCWlmIChiaXRzID4gbWF4X2xlbmd0aCkgeworCQkJYml0cyA9IG1heF9sZW5ndGg7CisJCQlvdmVyZmxvdysrOworCQl9CisJCXRyZWVbbl0uTGVuID0gKHVzaCkgYml0czsKKwkJLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKworCQlpZiAobiA+IG1heF9jb2RlKQorCQkJY29udGludWU7CS8qIG5vdCBhIGxlYWYgbm9kZSAqLworCisJCUcyLmJsX2NvdW50W2JpdHNdKys7CisJCXhiaXRzID0gMDsKKwkJaWYgKG4gPj0gYmFzZSkKKwkJCXhiaXRzID0gZXh0cmFbbiAtIGJhc2VdOworCQlmID0gdHJlZVtuXS5GcmVxOworCQlHMi5vcHRfbGVuICs9ICh1bGcpIGYgKihiaXRzICsgeGJpdHMpOworCisJCWlmIChzdHJlZSkKKwkJCUcyLnN0YXRpY19sZW4gKz0gKHVsZykgZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CisJfQorCWlmIChvdmVyZmxvdyA9PSAwKQorCQlyZXR1cm47CisKKwlUcmFjZSgoc3RkZXJyLCAiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7CisJLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KKworCS8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovCisJZG8geworCQliaXRzID0gbWF4X2xlbmd0aCAtIDE7CisJCXdoaWxlIChHMi5ibF9jb3VudFtiaXRzXSA9PSAwKQorCQkJYml0cy0tOworCQlHMi5ibF9jb3VudFtiaXRzXS0tOwkvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi8KKwkJRzIuYmxfY291bnRbYml0cyArIDFdICs9IDI7CS8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KKwkJRzIuYmxfY291bnRbbWF4X2xlbmd0aF0tLTsKKwkJLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKKwkJICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdCisJCSAqLworCQlvdmVyZmxvdyAtPSAyOworCX0gd2hpbGUgKG92ZXJmbG93ID4gMCk7CisKKwkvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCisJICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAorCSAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuCisJICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCisJICovCisJZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKKwkJbiA9IEcyLmJsX2NvdW50W2JpdHNdOworCQl3aGlsZSAobiAhPSAwKSB7CisJCQltID0gRzIuaGVhcFstLWhdOworCQkJaWYgKG0gPiBtYXhfY29kZSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh0cmVlW21dLkxlbiAhPSAodW5zaWduZWQpIGJpdHMpIHsKKwkJCQlUcmFjZSgoc3RkZXJyLCAiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKwkJCQlHMi5vcHRfbGVuICs9ICgoaW50MzJfdCkgYml0cyAtIHRyZWVbbV0uTGVuKSAqIHRyZWVbbV0uRnJlcTsKKwkJCQl0cmVlW21dLkxlbiA9IGJpdHM7CisJCQl9CisJCQluLS07CisJCX0KKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKKyAqIG9wdGltYWwpLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKKyAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgorICogICAgIHplcm8gY29kZSBsZW5ndGguCisgKi8KK3N0YXRpYyB2b2lkIGdlbl9jb2RlcyhjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKQoreworCXVzaCBuZXh0X2NvZGVbTUFYX0JJVFMgKyAxXTsJLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKwl1c2ggY29kZSA9IDA7CQkvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKwlpbnQgYml0czsJCQkvKiBiaXQgaW5kZXggKi8KKwlpbnQgbjsJCQkJLyogY29kZSBpbmRleCAqLworCisJLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzCisJICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuCisJICovCisJZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CisJCW5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIEcyLmJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTsKKwl9CisJLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorCSAqIG11c3QgYmUgYWxsIG9uZXMuCisJICovCisJQXNzZXJ0KGNvZGUgKyBHMi5ibF9jb3VudFtNQVhfQklUU10gLSAxID09ICgxIDw8IE1BWF9CSVRTKSAtIDEsCisJCSAgICJpbmNvbnNpc3RlbnQgYml0IGNvdW50cyIpOworCVRyYWNldigoc3RkZXJyLCAiXG5nZW5fY29kZXM6IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CisKKwlmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKwkJaW50IGxlbiA9IHRyZWVbbl0uTGVuOworCisJCWlmIChsZW4gPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqLworCQl0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7CisKKwkJVHJhY2VjKHRyZWUgIT0gRzIuc3RhdGljX2x0cmVlLAorCQkJICAgKHN0ZGVyciwgIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLCBuLAorCQkJCShuID4gJyAnID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLAorCQkJCW5leHRfY29kZVtsZW5dIC0gMSkpOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgorICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKKyAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcworICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAqLworCisvKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgZnJvbSB0aGUgaGVhcCBhbmQgcmVjcmVhdGUgdGhlIGhlYXAgd2l0aAorICogb25lIGxlc3MgZWxlbWVudC4gVXBkYXRlcyBoZWFwIGFuZCBoZWFwX2xlbi4gKi8KKworI2RlZmluZSBTTUFMTEVTVCAxCisvKiBJbmRleCB3aXRoaW4gdGhlIGhlYXAgYXJyYXkgb2YgbGVhc3QgZnJlcXVlbnQgbm9kZSBpbiB0aGUgSHVmZm1hbiB0cmVlICovCisKKyNkZWZpbmUgUFFSRU1PVkUodHJlZSwgdG9wKSBcCitkbyB7IFwKKwl0b3AgPSBHMi5oZWFwW1NNQUxMRVNUXTsgXAorCUcyLmhlYXBbU01BTExFU1RdID0gRzIuaGVhcFtHMi5oZWFwX2xlbi0tXTsgXAorCXBxZG93bmhlYXAodHJlZSwgU01BTExFU1QpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBidWlsZF90cmVlKHRyZWVfZGVzYyAqIGRlc2MpCit7CisJY3RfZGF0YSAqdHJlZSA9IGRlc2MtPmR5bl90cmVlOworCWN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdGljX3RyZWU7CisJaW50IGVsZW1zID0gZGVzYy0+ZWxlbXM7CisJaW50IG4sIG07CQkJLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi8KKwlpbnQgbWF4X2NvZGUgPSAtMTsJLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisJaW50IG5vZGUgPSBlbGVtczsJLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovCisKKwkvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluCisJICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uCisJICogaGVhcFswXSBpcyBub3QgdXNlZC4KKwkgKi8KKwlHMi5oZWFwX2xlbiA9IDA7CisJRzIuaGVhcF9tYXggPSBIRUFQX1NJWkU7CisKKwlmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykgeworCQlpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKKwkJCUcyLmhlYXBbKytHMi5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47CisJCQlHMi5kZXB0aFtuXSA9IDA7CisJCX0gZWxzZSB7CisJCQl0cmVlW25dLkxlbiA9IDA7CisJCX0KKwl9CisKKwkvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLAorCSAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorCSAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0CisJICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS4KKwkgKi8KKwl3aGlsZSAoRzIuaGVhcF9sZW4gPCAyKSB7CisJCWludCBuZXcgPSBHMi5oZWFwWysrRzIuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKKworCQl0cmVlW25ld10uRnJlcSA9IDE7CisJCUcyLmRlcHRoW25ld10gPSAwOworCQlHMi5vcHRfbGVuLS07CisJCWlmIChzdHJlZSkKKwkJCUcyLnN0YXRpY19sZW4gLT0gc3RyZWVbbmV3XS5MZW47CisJCS8qIG5ldyBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCisJfQorCWRlc2MtPm1heF9jb2RlID0gbWF4X2NvZGU7CisKKwkvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsCisJICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6CisJICovCisJZm9yIChuID0gRzIuaGVhcF9sZW4gLyAyOyBuID49IDE7IG4tLSkKKwkJcHFkb3duaGVhcCh0cmVlLCBuKTsKKworCS8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d28KKwkgKiBmcmVxdWVudCBub2Rlcy4KKwkgKi8KKwlkbyB7CisJCVBRUkVNT1ZFKHRyZWUsIG4pOwkvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KKwkJbSA9IEcyLmhlYXBbU01BTExFU1RdOwkvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLworCisJCUcyLmhlYXBbLS1HMi5oZWFwX21heF0gPSBuOwkvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovCisJCUcyLmhlYXBbLS1HMi5oZWFwX21heF0gPSBtOworCisJCS8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovCisJCXRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVbbV0uRnJlcTsKKwkJRzIuZGVwdGhbbm9kZV0gPSBNQVgoRzIuZGVwdGhbbl0sIEcyLmRlcHRoW21dKSArIDE7CisJCXRyZWVbbl0uRGFkID0gdHJlZVttXS5EYWQgPSAodXNoKSBub2RlOworI2lmZGVmIERVTVBfQkxfVFJFRQorCQlpZiAodHJlZSA9PSBHMi5ibF90cmVlKSB7CisJCQliYl9lcnJvcl9tc2coIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCisJCQkJCW5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOworCQl9CisjZW5kaWYKKwkJLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KKwkJRzIuaGVhcFtTTUFMTEVTVF0gPSBub2RlKys7CisJCXBxZG93bmhlYXAodHJlZSwgU01BTExFU1QpOworCisJfSB3aGlsZSAoRzIuaGVhcF9sZW4gPj0gMik7CisKKwlHMi5oZWFwWy0tRzIuaGVhcF9tYXhdID0gRzIuaGVhcFtTTUFMTEVTVF07CisKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93CisJICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLgorCSAqLworCWdlbl9iaXRsZW4oKHRyZWVfZGVzYyAqKSBkZXNjKTsKKworCS8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KKwlnZW5fY29kZXMoKGN0X2RhdGEgKikgdHJlZSwgbWF4X2NvZGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4gVXBkYXRlcyBvcHRfbGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSByZXBlYXQKKyAqIGNvdW50cy4gKFRoZSBjb250cmlidXRpb24gb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgd2lsbCBiZSBhZGRlZCBsYXRlcgorICogZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYmxfdHJlZS4pCisgKi8KK3N0YXRpYyB2b2lkIHNjYW5fdHJlZShjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKQoreworCWludCBuOwkJCQkvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisJaW50IHByZXZsZW4gPSAtMTsJLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworCWludCBjdXJsZW47CQkJLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworCWludCBuZXh0bGVuID0gdHJlZVswXS5MZW47CS8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKwlpbnQgY291bnQgPSAwOwkJLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKwlpbnQgbWF4X2NvdW50ID0gNzsJLyogbWF4IHJlcGVhdCBjb3VudCAqLworCWludCBtaW5fY291bnQgPSA0OwkvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKwlpZiAobmV4dGxlbiA9PSAwKSB7CisJCW1heF9jb3VudCA9IDEzODsKKwkJbWluX2NvdW50ID0gMzsKKwl9CisJdHJlZVttYXhfY29kZSArIDFdLkxlbiA9IDB4ZmZmZjsgLyogZ3VhcmQgKi8KKworCWZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworCQljdXJsZW4gPSBuZXh0bGVuOworCQluZXh0bGVuID0gdHJlZVtuICsgMV0uTGVuOworCQlpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb3VudCA8IG1pbl9jb3VudCkgeworCQkJRzIuYmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7CisJCX0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKwkJCWlmIChjdXJsZW4gIT0gcHJldmxlbikKKwkJCQlHMi5ibF90cmVlW2N1cmxlbl0uRnJlcSsrOworCQkJRzIuYmxfdHJlZVtSRVBfM182XS5GcmVxKys7CisJCX0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKwkJCUcyLmJsX3RyZWVbUkVQWl8zXzEwXS5GcmVxKys7CisJCX0gZWxzZSB7CisJCQlHMi5ibF90cmVlW1JFUFpfMTFfMTM4XS5GcmVxKys7CisJCX0KKwkJY291bnQgPSAwOworCQlwcmV2bGVuID0gY3VybGVuOworCisJCW1heF9jb3VudCA9IDc7CisJCW1pbl9jb3VudCA9IDQ7CisJCWlmIChuZXh0bGVuID09IDApIHsKKwkJCW1heF9jb3VudCA9IDEzODsKKwkJCW1pbl9jb3VudCA9IDM7CisJCX0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKwkJCW1heF9jb3VudCA9IDY7CisJCQltaW5fY291bnQgPSAzOworCQl9CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpbgorICogYmxfdHJlZS4KKyAqLworc3RhdGljIHZvaWQgc2VuZF90cmVlKGN0X2RhdGEgKiB0cmVlLCBpbnQgbWF4X2NvZGUpCit7CisJaW50IG47CQkJCS8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKwlpbnQgcHJldmxlbiA9IC0xOwkvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisJaW50IGN1cmxlbjsJCQkvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCisJaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsJLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLworCWludCBjb3VudCA9IDA7CQkvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworCWludCBtYXhfY291bnQgPSA3OwkvKiBtYXggcmVwZWF0IGNvdW50ICovCisJaW50IG1pbl9jb3VudCA9IDQ7CS8qIG1pbiByZXBlYXQgY291bnQgKi8KKworLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8vKiBndWFyZCBhbHJlYWR5IHNldCAqLworCWlmIChuZXh0bGVuID09IDApCisJCW1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKworCWZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworCQljdXJsZW4gPSBuZXh0bGVuOworCQluZXh0bGVuID0gdHJlZVtuICsgMV0uTGVuOworCQlpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKwkJCWRvIHsKKwkJCQlTRU5EX0NPREUoY3VybGVuLCBHMi5ibF90cmVlKTsKKwkJCX0gd2hpbGUgKC0tY291bnQpOworCQl9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisJCQlpZiAoY3VybGVuICE9IHByZXZsZW4pIHsKKwkJCQlTRU5EX0NPREUoY3VybGVuLCBHMi5ibF90cmVlKTsKKwkJCQljb3VudC0tOworCQkJfQorCQkJQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgIiAzXzY/Iik7CisJCQlTRU5EX0NPREUoUkVQXzNfNiwgRzIuYmxfdHJlZSk7CisJCQlzZW5kX2JpdHMoY291bnQgLSAzLCAyKTsKKwkJfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworCQkJU0VORF9DT0RFKFJFUFpfM18xMCwgRzIuYmxfdHJlZSk7CisJCQlzZW5kX2JpdHMoY291bnQgLSAzLCAzKTsKKwkJfSBlbHNlIHsKKwkJCVNFTkRfQ09ERShSRVBaXzExXzEzOCwgRzIuYmxfdHJlZSk7CisJCQlzZW5kX2JpdHMoY291bnQgLSAxMSwgNyk7CisJCX0KKwkJY291bnQgPSAwOworCQlwcmV2bGVuID0gY3VybGVuOworCQlpZiAobmV4dGxlbiA9PSAwKSB7CisJCQltYXhfY291bnQgPSAxMzg7CisJCQltaW5fY291bnQgPSAzOworCQl9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisJCQltYXhfY291bnQgPSA2OworCQkJbWluX2NvdW50ID0gMzsKKwkJfSBlbHNlIHsKKwkJCW1heF9jb3VudCA9IDc7CisJCQltaW5fY291bnQgPSA0OworCQl9CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpbgorICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfYmxfdHJlZSh2b2lkKQoreworCWludCBtYXhfYmxpbmRleDsJLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisJLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworCXNjYW5fdHJlZShHMi5keW5fbHRyZWUsIEcyLmxfZGVzYy5tYXhfY29kZSk7CisJc2Nhbl90cmVlKEcyLmR5bl9kdHJlZSwgRzIuZF9kZXNjLm1heF9jb2RlKTsKKworCS8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovCisJYnVpbGRfdHJlZSgmRzIuYmxfZGVzYyk7CisJLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorCSAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCisJICovCisKKwkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKKwkgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworCSAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKKwkgKi8KKwlmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CisJCWlmIChHMi5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XV0uTGVuICE9IDApCisJCQlicmVhazsKKwl9CisJLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KKwlHMi5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZCIsIEcyLm9wdF9sZW4sIEcyLnN0YXRpY19sZW4pKTsKKworCXJldHVybiBtYXhfYmxpbmRleDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQorICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCisgKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfYWxsX3RyZWVzKGludCBsY29kZXMsIGludCBkY29kZXMsIGludCBibGNvZGVzKQoreworCWludCByYW5rOwkJCS8qIGluZGV4IGluIGJsX29yZGVyICovCisKKwlBc3NlcnQobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsICJub3QgZW5vdWdoIGNvZGVzIik7CisJQXNzZXJ0KGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTCisJCSAgICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsICJ0b28gbWFueSBjb2RlcyIpOworCVRyYWNldigoc3RkZXJyLCAiXG5ibCBjb3VudHM6ICIpKTsKKwlzZW5kX2JpdHMobGNvZGVzIC0gMjU3LCA1KTsJLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisJc2VuZF9iaXRzKGRjb2RlcyAtIDEsIDUpOworCXNlbmRfYml0cyhibGNvZGVzIC0gNCwgNCk7CS8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKwlmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CisJCVRyYWNldigoc3RkZXJyLCAiXG5ibCBjb2RlICUyZCAiLCBibF9vcmRlcltyYW5rXSkpOworCQlzZW5kX2JpdHMoRzIuYmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKKwl9CisJVHJhY2V2KChzdGRlcnIsICJcbmJsIHRyZWU6IHNlbnQgJWxkIiwgRzEuYml0c19zZW50KSk7CisKKwlzZW5kX3RyZWUoKGN0X2RhdGEgKikgRzIuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsJLyogc2VuZCB0aGUgbGl0ZXJhbCB0cmVlICovCisJVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBzZW50ICVsZCIsIEcxLmJpdHNfc2VudCkpOworCisJc2VuZF90cmVlKChjdF9kYXRhICopIEcyLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7CS8qIHNlbmQgdGhlIGRpc3RhbmNlIHRyZWUgKi8KKwlUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCB0cmVlOiBzZW50ICVsZCIsIEcxLmJpdHNfc2VudCkpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmCisgKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuCisgKi8KK3N0YXRpYyBpbnQgY3RfdGFsbHkoaW50IGRpc3QsIGludCBsYykKK3sKKwlHMS5sX2J1ZltHMi5sYXN0X2xpdCsrXSA9IGxjOworCWlmIChkaXN0ID09IDApIHsKKwkJLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovCisJCUcyLmR5bl9sdHJlZVtsY10uRnJlcSsrOworCX0gZWxzZSB7CisJCS8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKwkJZGlzdC0tOwkJCS8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKwkJQXNzZXJ0KCh1c2gpIGRpc3QgPCAodXNoKSBNQVhfRElTVAorCQkgJiYgKHVzaCkgbGMgPD0gKHVzaCkgKE1BWF9NQVRDSCAtIE1JTl9NQVRDSCkKKwkJICYmICh1c2gpIERfQ09ERShkaXN0KSA8ICh1c2gpIERfQ09ERVMsICJjdF90YWxseTogYmFkIG1hdGNoIgorCQkpOworCisJCUcyLmR5bl9sdHJlZVtHMi5sZW5ndGhfY29kZVtsY10gKyBMSVRFUkFMUyArIDFdLkZyZXErKzsKKwkJRzIuZHluX2R0cmVlW0RfQ09ERShkaXN0KV0uRnJlcSsrOworCisJCUcxLmRfYnVmW0cyLmxhc3RfZGlzdCsrXSA9IGRpc3Q7CisJCUcyLmZsYWdzIHw9IEcyLmZsYWdfYml0OworCX0KKwlHMi5mbGFnX2JpdCA8PD0gMTsKKworCS8qIE91dHB1dCB0aGUgZmxhZ3MgaWYgdGhleSBmaWxsIGEgYnl0ZTogKi8KKwlpZiAoKEcyLmxhc3RfbGl0ICYgNykgPT0gMCkgeworCQlHMi5mbGFnX2J1ZltHMi5sYXN0X2ZsYWdzKytdID0gRzIuZmxhZ3M7CisJCUcyLmZsYWdzID0gMDsKKwkJRzIuZmxhZ19iaXQgPSAxOworCX0KKwkvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi8KKwlpZiAoKEcyLmxhc3RfbGl0ICYgMHhmZmYpID09IDApIHsKKwkJLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovCisJCXVsZyBvdXRfbGVuZ3RoID0gRzIubGFzdF9saXQgKiA4TDsKKwkJdWxnIGluX2xlbmd0aCA9ICh1bGcpIEcxLnN0cnN0YXJ0IC0gRzEuYmxvY2tfc3RhcnQ7CisJCWludCBkY29kZTsKKworCQlmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CisJCQlvdXRfbGVuZ3RoICs9IEcyLmR5bl9kdHJlZVtkY29kZV0uRnJlcSAqICg1TCArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7CisJCX0KKwkJb3V0X2xlbmd0aCA+Pj0gMzsKKwkJVHJhY2UoKHN0ZGVyciwKKwkJCSAgICJcbmxhc3RfbGl0ICV1LCBsYXN0X2Rpc3QgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpICIsCisJCQkgICBHMi5sYXN0X2xpdCwgRzIubGFzdF9kaXN0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCisJCQkgICAxMDBMIC0gb3V0X2xlbmd0aCAqIDEwMEwgLyBpbl9sZW5ndGgpKTsKKwkJaWYgKEcyLmxhc3RfZGlzdCA8IEcyLmxhc3RfbGl0IC8gMiAmJiBvdXRfbGVuZ3RoIDwgaW5fbGVuZ3RoIC8gMikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gKEcyLmxhc3RfbGl0ID09IExJVF9CVUZTSVpFIC0gMSB8fCBHMi5sYXN0X2Rpc3QgPT0gRElTVF9CVUZTSVpFKTsKKwkvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIExJVF9CVUZTSVpFIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKKwkgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0bworCSAqIDY0Sy0xIGJ5dGVzLgorCSAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlcworICovCitzdGF0aWMgdm9pZCBjb21wcmVzc19ibG9jayhjdF9kYXRhICogbHRyZWUsIGN0X2RhdGEgKiBkdHJlZSkKK3sKKwl1bnNpZ25lZCBkaXN0OyAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworCWludCBsYzsgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLworCXVuc2lnbmVkIGx4ID0gMDsgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKwl1bnNpZ25lZCBkeCA9IDA7ICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGRfYnVmICovCisJdW5zaWduZWQgZnggPSAwOyAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBmbGFnX2J1ZiAqLworCXVjaCBmbGFnID0gMDsgICAgICAgICAgIC8qIGN1cnJlbnQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBjb2RlOyAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovCisJaW50IGV4dHJhOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqLworCisJaWYgKEcyLmxhc3RfbGl0ICE9IDApIGRvIHsKKwkJaWYgKChseCAmIDcpID09IDApCisJCQlmbGFnID0gRzIuZmxhZ19idWZbZngrK107CisJCWxjID0gRzEubF9idWZbbHgrK107CisJCWlmICgoZmxhZyAmIDEpID09IDApIHsKKwkJCVNFTkRfQ09ERShsYywgbHRyZWUpOwkvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovCisJCQlUcmFjZWN2KGxjID4gJyAnLCAoc3RkZXJyLCAiICclYycgIiwgbGMpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKwkJCWNvZGUgPSBHMi5sZW5ndGhfY29kZVtsY107CisJCQlTRU5EX0NPREUoY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOwkvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLworCQkJZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKKwkJCWlmIChleHRyYSAhPSAwKSB7CisJCQkJbGMgLT0gRzIuYmFzZV9sZW5ndGhbY29kZV07CisJCQkJc2VuZF9iaXRzKGxjLCBleHRyYSk7CS8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCisJCQl9CisJCQlkaXN0ID0gRzEuZF9idWZbZHgrK107CisJCQkvKiBIZXJlLCBkaXN0IGlzIHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKwkJCWNvZGUgPSBEX0NPREUoZGlzdCk7CisJCQlBc3NlcnQoY29kZSA8IERfQ09ERVMsICJiYWQgZF9jb2RlIik7CisKKwkJCVNFTkRfQ09ERShjb2RlLCBkdHJlZSk7CS8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi8KKwkJCWV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07CisJCQlpZiAoZXh0cmEgIT0gMCkgeworCQkJCWRpc3QgLT0gRzIuYmFzZV9kaXN0W2NvZGVdOworCQkJCXNlbmRfYml0cyhkaXN0LCBleHRyYSk7CS8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KKwkJCX0KKwkJfQkJCS8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCisJCWZsYWcgPj49IDE7CisJfSB3aGlsZSAobHggPCBHMi5sYXN0X2xpdCk7CisKKwlTRU5EX0NPREUoRU5EX0JMT0NLLCBsdHJlZSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKKyAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS4gVGhpcyBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgdG90YWwgY29tcHJlc3NlZCBsZW5ndGggZm9yIHRoZSBmaWxlIHNvIGZhci4KKyAqLworc3RhdGljIHVsZyBmbHVzaF9ibG9jayhjaGFyICpidWYsIHVsZyBzdG9yZWRfbGVuLCBpbnQgZW9mKQoreworCXVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAgICAgLyogb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcyAqLworCWludCBtYXhfYmxpbmRleDsgICAgICAgICAgICAgICAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisJRzIuZmxhZ19idWZbRzIubGFzdF9mbGFnc10gPSBHMi5mbGFnczsgICAvKiBTYXZlIHRoZSBmbGFncyBmb3IgdGhlIGxhc3QgOCBpdGVtcyAqLworCisJLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworCWJ1aWxkX3RyZWUoJkcyLmxfZGVzYyk7CisJVHJhY2V2KChzdGRlcnIsICJcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIEcyLm9wdF9sZW4sIEcyLnN0YXRpY19sZW4pKTsKKworCWJ1aWxkX3RyZWUoJkcyLmRfZGVzYyk7CisJVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBHMi5vcHRfbGVuLCBHMi5zdGF0aWNfbGVuKSk7CisJLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCisJICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKwkgKi8KKworCS8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4CisJICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisJICovCisJbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKCk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgZmlyc3QgdGhlIGJsb2NrIGxlbmd0aCBpbiBieXRlcyAqLworCW9wdF9sZW5iID0gKEcyLm9wdF9sZW4gKyAzICsgNykgPj4gMzsKKwlzdGF0aWNfbGVuYiA9IChHMi5zdGF0aWNfbGVuICsgMyArIDcpID4+IDM7CisKKwlUcmFjZSgoc3RkZXJyLAorCQkgICAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBkaXN0ICV1ICIsCisJCSAgIG9wdF9sZW5iLCBHMi5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgRzIuc3RhdGljX2xlbiwgc3RvcmVkX2xlbiwKKwkJICAgRzIubGFzdF9saXQsIEcyLmxhc3RfZGlzdCkpOworCisJaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKQorCQlvcHRfbGVuYiA9IHN0YXRpY19sZW5iOworCisJLyogSWYgY29tcHJlc3Npb24gZmFpbGVkIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgbGFzdCBibG9jaywKKwkgKiBhbmQgaWYgdGhlIHppcCBmaWxlIGNhbiBiZSBzZWVrZWQgKHRvIHJld3JpdGUgdGhlIGxvY2FsIGhlYWRlciksCisJICogdGhlIHdob2xlIGZpbGUgaXMgdHJhbnNmb3JtZWQgaW50byBhIHN0b3JlZCBmaWxlOgorCSAqLworCWlmIChzdG9yZWRfbGVuIDw9IG9wdF9sZW5iICYmIGVvZiAmJiBHMi5jb21wcmVzc2VkX2xlbiA9PSAwTCAmJiBzZWVrYWJsZSgpKSB7CisJCS8qIFNpbmNlIExJVF9CVUZTSVpFIDw9IDIqV1NJWkUsIHRoZSBpbnB1dCBkYXRhIG11c3QgYmUgdGhlcmU6ICovCisJCWlmIChidWYgPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZygiYmxvY2sgdmFuaXNoZWQiKTsKKworCQljb3B5X2Jsb2NrKGJ1ZiwgKHVuc2lnbmVkKSBzdG9yZWRfbGVuLCAwKTsJLyogd2l0aG91dCBoZWFkZXIgKi8KKwkJRzIuY29tcHJlc3NlZF9sZW4gPSBzdG9yZWRfbGVuIDw8IDM7CisKKwl9IGVsc2UgaWYgKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iICYmIGJ1ZiAhPSBOVUxMKSB7CisJCS8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKwkJLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS4KKwkJICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZQorCQkgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW4KKwkJICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvCisJCSAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suCisJCSAqLworCQlzZW5kX2JpdHMoKFNUT1JFRF9CTE9DSyA8PCAxKSArIGVvZiwgMyk7CS8qIHNlbmQgYmxvY2sgdHlwZSAqLworCQlHMi5jb21wcmVzc2VkX2xlbiA9IChHMi5jb21wcmVzc2VkX2xlbiArIDMgKyA3KSAmIH43TDsKKwkJRzIuY29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOworCisJCWNvcHlfYmxvY2soYnVmLCAodW5zaWduZWQpIHN0b3JlZF9sZW4sIDEpOwkvKiB3aXRoIGhlYWRlciAqLworCisJfSBlbHNlIGlmIChzdGF0aWNfbGVuYiA9PSBvcHRfbGVuYikgeworCQlzZW5kX2JpdHMoKFNUQVRJQ19UUkVFUyA8PCAxKSArIGVvZiwgMyk7CisJCWNvbXByZXNzX2Jsb2NrKChjdF9kYXRhICopIEcyLnN0YXRpY19sdHJlZSwgKGN0X2RhdGEgKikgRzIuc3RhdGljX2R0cmVlKTsKKwkJRzIuY29tcHJlc3NlZF9sZW4gKz0gMyArIEcyLnN0YXRpY19sZW47CisJfSBlbHNlIHsKKwkJc2VuZF9iaXRzKChEWU5fVFJFRVMgPDwgMSkgKyBlb2YsIDMpOworCQlzZW5kX2FsbF90cmVlcyhHMi5sX2Rlc2MubWF4X2NvZGUgKyAxLCBHMi5kX2Rlc2MubWF4X2NvZGUgKyAxLAorCQkJCQkgICBtYXhfYmxpbmRleCArIDEpOworCQljb21wcmVzc19ibG9jaygoY3RfZGF0YSAqKSBHMi5keW5fbHRyZWUsIChjdF9kYXRhICopIEcyLmR5bl9kdHJlZSk7CisJCUcyLmNvbXByZXNzZWRfbGVuICs9IDMgKyBHMi5vcHRfbGVuOworCX0KKwlBc3NlcnQoRzIuY29tcHJlc3NlZF9sZW4gPT0gRzEuYml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOworCWluaXRfYmxvY2soKTsKKworCWlmIChlb2YpIHsKKwkJYmlfd2luZHVwKCk7CisJCUcyLmNvbXByZXNzZWRfbGVuICs9IDc7CS8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKwl9CisJVHJhY2V2KChzdGRlcnIsICJcbmNvbXBybGVuICVsdSglbHUpICIsIEcyLmNvbXByZXNzZWRfbGVuID4+IDMsCisJCQlHMi5jb21wcmVzc2VkX2xlbiAtIDcgKiBlb2YpKTsKKworCXJldHVybiBHMi5jb21wcmVzc2VkX2xlbiA+PiAzOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGEgaGFzaCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbnB1dCBieXRlCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycywgc28gdGhhdCBhIHJ1bm5pbmcgaGFzaCBrZXkgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlCisgKiAgICBwcmV2aW91cyBrZXkgaW5zdGVhZCBvZiBjb21wbGV0ZSByZWNhbGN1bGF0aW9uIGVhY2ggdGltZS4KKyAqLworI2RlZmluZSBVUERBVEVfSEFTSChoLCBjKSAoaCA9ICgoKGgpPDxIX1NISUZUKSBeIChjKSkgJiBIQVNIX01BU0spCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5CisgKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzCisgKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLgorICoKKyAqIFByb2Nlc3NlcyBhIG5ldyBpbnB1dCBmaWxlIGFuZCByZXR1cm4gaXRzIGNvbXByZXNzZWQgbGVuZ3RoLiBTZXRzCisgKiB0aGUgY29tcHJlc3NlZCBsZW5ndGgsIGNyYywgZGVmbGF0ZSBmbGFncyBhbmQgaW50ZXJuYWwgZmlsZQorICogYXR0cmlidXRlcy4KKyAqLworCisvKiBGbHVzaCB0aGUgY3VycmVudCBibG9jaywgd2l0aCBnaXZlbiBlbmQtb2YtZmlsZSBmbGFnLgorICogSU4gYXNzZXJ0aW9uOiBzdHJzdGFydCBpcyBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtYXRjaC4gKi8KKyNkZWZpbmUgRkxVU0hfQkxPQ0soZW9mKSBcCisJZmx1c2hfYmxvY2soIFwKKwkJRzEuYmxvY2tfc3RhcnQgPj0gMEwgXAorCQkJPyAoY2hhciopJkcxLndpbmRvd1sodW5zaWduZWQpRzEuYmxvY2tfc3RhcnRdIFwKKwkJCTogKGNoYXIqKU5VTEwsIFwKKwkJKHVsZylHMS5zdHJzdGFydCAtIEcxLmJsb2NrX3N0YXJ0LCBcCisJCShlb2YpIFwKKwkpCisKKy8qIEluc2VydCBzdHJpbmcgcyBpbiB0aGUgZGljdGlvbmFyeSBhbmQgc2V0IG1hdGNoX2hlYWQgdG8gdGhlIHByZXZpb3VzIGhlYWQKKyAqIG9mIHRoZSBoYXNoIGNoYWluICh0aGUgbW9zdCByZWNlbnQgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGtleSkuIFJldHVybgorICogdGhlIHByZXZpb3VzIGxlbmd0aCBvZiB0aGUgaGFzaCBjaGFpbi4KKyAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byBJTlNFUlRfU1RSSU5HIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMgYW5kIHRoZSBmaXJzdCBNSU5fTUFUQ0ggYnl0ZXMgb2YgcyBhcmUgdmFsaWQKKyAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4gKi8KKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBtYXRjaF9oZWFkKSBcCitkbyB7IFwKKwlVUERBVEVfSEFTSChHMS5pbnNfaCwgRzEud2luZG93WyhzKSArIE1JTl9NQVRDSC0xXSk7IFwKKwlHMS5wcmV2WyhzKSAmIFdNQVNLXSA9IG1hdGNoX2hlYWQgPSBoZWFkW0cxLmluc19oXTsgXAorCWhlYWRbRzEuaW5zX2hdID0gKHMpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdWxnIGRlZmxhdGUodm9pZCkKK3sKKwlJUG9zIGhhc2hfaGVhZDsJCS8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqLworCUlQb3MgcHJldl9tYXRjaDsJLyogcHJldmlvdXMgbWF0Y2ggKi8KKwlpbnQgZmx1c2g7CQkJLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisJaW50IG1hdGNoX2F2YWlsYWJsZSA9IDA7CS8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi8KKwl1bnNpZ25lZCBtYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOwkvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqLworCisJLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCisJd2hpbGUgKEcxLmxvb2thaGVhZCAhPSAwKSB7CisJCS8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGUKKwkJICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CisJCSAqLworCQlJTlNFUlRfU1RSSU5HKEcxLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworCisJCS8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCisJCSAqLworCQlHMS5wcmV2X2xlbmd0aCA9IG1hdGNoX2xlbmd0aDsKKwkJcHJldl9tYXRjaCA9IEcxLm1hdGNoX3N0YXJ0OworCQltYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOworCisJCWlmIChoYXNoX2hlYWQgIT0gMCAmJiBHMS5wcmV2X2xlbmd0aCA8IG1heF9sYXp5X21hdGNoCisJCSAmJiBHMS5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVAorCQkpIHsKKwkJCS8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisJCQkgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKwkJCSAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKwkJCSAqLworCQkJbWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChoYXNoX2hlYWQpOworCQkJLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKwkJCWlmIChtYXRjaF9sZW5ndGggPiBHMS5sb29rYWhlYWQpCisJCQkJbWF0Y2hfbGVuZ3RoID0gRzEubG9va2FoZWFkOworCisJCQkvKiBJZ25vcmUgYSBsZW5ndGggMyBtYXRjaCBpZiBpdCBpcyB0b28gZGlzdGFudDogKi8KKwkJCWlmIChtYXRjaF9sZW5ndGggPT0gTUlOX01BVENIICYmIEcxLnN0cnN0YXJ0IC0gRzEubWF0Y2hfc3RhcnQgPiBUT09fRkFSKSB7CisJCQkJLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgRzEubWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZQorCQkJCSAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuCisJCQkJICovCisJCQkJbWF0Y2hfbGVuZ3RoLS07CisJCQl9CisJCX0KKwkJLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50CisJCSAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6CisJCSAqLworCQlpZiAoRzEucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIG1hdGNoX2xlbmd0aCA8PSBHMS5wcmV2X2xlbmd0aCkgeworCQkJY2hlY2tfbWF0Y2goRzEuc3Ryc3RhcnQgLSAxLCBwcmV2X21hdGNoLCBHMS5wcmV2X2xlbmd0aCk7CisJCQlmbHVzaCA9IGN0X3RhbGx5KEcxLnN0cnN0YXJ0IC0gMSAtIHByZXZfbWF0Y2gsIEcxLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTsKKworCQkJLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guCisJCQkgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4KKwkJCSAqLworCQkJRzEubG9va2FoZWFkIC09IEcxLnByZXZfbGVuZ3RoIC0gMTsKKwkJCUcxLnByZXZfbGVuZ3RoIC09IDI7CisJCQlkbyB7CisJCQkJRzEuc3Ryc3RhcnQrKzsKKwkJCQlJTlNFUlRfU1RSSU5HKEcxLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworCQkJCS8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmUKKwkJCQkgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gKKwkJCQkgKiB0aGVzZSBieXRlcyBhcmUgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90IG1hdHRlciBzaW5jZSB0aGUKKwkJCQkgKiBuZXh0IGxvb2thaGVhZCBieXRlcyB3aWxsIGFsd2F5cyBiZSBlbWl0dGVkIGFzIGxpdGVyYWxzLgorCQkJCSAqLworCQkJfSB3aGlsZSAoLS1HMS5wcmV2X2xlbmd0aCAhPSAwKTsKKwkJCW1hdGNoX2F2YWlsYWJsZSA9IDA7CisJCQltYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOworCQkJRzEuc3Ryc3RhcnQrKzsKKwkJCWlmIChmbHVzaCkgeworCQkJCUZMVVNIX0JMT0NLKDApOworCQkJCUcxLmJsb2NrX3N0YXJ0ID0gRzEuc3Ryc3RhcnQ7CisJCQl9CisJCX0gZWxzZSBpZiAobWF0Y2hfYXZhaWxhYmxlKSB7CisJCQkvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQorCQkJICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAorCQkJICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKwkJCSAqLworCQkJVHJhY2V2digoc3RkZXJyLCAiJWMiLCBHMS53aW5kb3dbRzEuc3Ryc3RhcnQgLSAxXSkpOworCQkJaWYgKGN0X3RhbGx5KDAsIEcxLndpbmRvd1tHMS5zdHJzdGFydCAtIDFdKSkgeworCQkJCUZMVVNIX0JMT0NLKDApOworCQkJCUcxLmJsb2NrX3N0YXJ0ID0gRzEuc3Ryc3RhcnQ7CisJCQl9CisJCQlHMS5zdHJzdGFydCsrOworCQkJRzEubG9va2FoZWFkLS07CisJCX0gZWxzZSB7CisJCQkvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yCisJCQkgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS4KKwkJCSAqLworCQkJbWF0Y2hfYXZhaWxhYmxlID0gMTsKKwkJCUcxLnN0cnN0YXJ0Kys7CisJCQlHMS5sb29rYWhlYWQtLTsKKwkJfQorCQlBc3NlcnQoRzEuc3Ryc3RhcnQgPD0gRzEuaXNpemUgJiYgbG9va2FoZWFkIDw9IEcxLmlzaXplLCAiYSBiaXQgdG9vIGZhciIpOworCisJCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorCQkgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworCQkgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKwkJICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKwkJICovCisJCXdoaWxlIChHMS5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmICFHMS5lb2ZpbGUpCisJCQlmaWxsX3dpbmRvdygpOworCX0KKwlpZiAobWF0Y2hfYXZhaWxhYmxlKQorCQljdF90YWxseSgwLCBHMS53aW5kb3dbRzEuc3Ryc3RhcnQgLSAxXSk7CisKKwlyZXR1cm4gRkxVU0hfQkxPQ0soMSk7CS8qIGVvZiAqLworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgYml0IHN0cmluZyByb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgYmlfaW5pdCh2b2lkKQoreworCUcxLmJpX2J1ZiA9IDA7CisJRzEuYmlfdmFsaWQgPSAwOworI2lmZGVmIERFQlVHCisJRzEuYml0c19zZW50ID0gMEw7CisjZW5kaWYKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlICJsb25nZXN0IG1hdGNoIiByb3V0aW5lcyBmb3IgYSBuZXcgZmlsZQorICovCitzdGF0aWMgdm9pZCBsbV9pbml0KHVzaCAqIGZsYWdzcCkKK3sKKwl1bnNpZ25lZCBqOworCisJLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZS4gKi8KKwltZW1zZXQoaGVhZCwgMCwgSEFTSF9TSVpFICogc2l6ZW9mKCpoZWFkKSk7CisJLyogcHJldiB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkgKi8KKworCS8qIHNwZWVkIG9wdGlvbnMgZm9yIHRoZSBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgKi8KKwkqZmxhZ3NwIHw9IDI7CS8qIEZBU1QgNCwgU0xPVyAyICovCisJLyogPz8/IHJlZHVjZSBtYXhfY2hhaW5fbGVuZ3RoIGZvciBiaW5hcnkgZmlsZXMgKi8KKworCUcxLnN0cnN0YXJ0ID0gMDsKKwlHMS5ibG9ja19zdGFydCA9IDBMOworCisJRzEubG9va2FoZWFkID0gZmlsZV9yZWFkKEcxLndpbmRvdywKKwkJCXNpemVvZihpbnQpIDw9IDIgPyAodW5zaWduZWQpIFdTSVpFIDogMiAqIFdTSVpFKTsKKworCWlmIChHMS5sb29rYWhlYWQgPT0gMCB8fCBHMS5sb29rYWhlYWQgPT0gKHVuc2lnbmVkKSAtMSkgeworCQlHMS5lb2ZpbGUgPSAxOworCQlHMS5sb29rYWhlYWQgPSAwOworCQlyZXR1cm47CisJfQorCUcxLmVvZmlsZSA9IDA7CisJLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZC4gVGhpcyBpcyBpbXBvcnRhbnQKKwkgKiBpZiBpbnB1dCBjb21lcyBmcm9tIGEgZGV2aWNlIHN1Y2ggYXMgYSB0dHkuCisJICovCisJd2hpbGUgKEcxLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgIUcxLmVvZmlsZSkKKwkJZmlsbF93aW5kb3coKTsKKworCUcxLmluc19oID0gMDsKKwlmb3IgKGogPSAwOyBqIDwgTUlOX01BVENIIC0gMTsgaisrKQorCQlVUERBVEVfSEFTSChHMS5pbnNfaCwgRzEud2luZG93W2pdKTsKKwkvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCB0aGlzIGlzCisJICogbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgorCSAqLworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWxsb2NhdGUgdGhlIG1hdGNoIGJ1ZmZlciwgaW5pdGlhbGl6ZSB0aGUgdmFyaW91cyB0YWJsZXMgYW5kIHNhdmUgdGhlCisgKiBsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGUgKGFzY2lpL2JpbmFyeSkgYW5kIG1ldGhvZAorICogKERFRkxBVEUvU1RPUkUpLgorICogT25lIGNhbGxzaXRlIGluIHppcCgpCisgKi8KK3N0YXRpYyB2b2lkIGN0X2luaXQodm9pZCkKK3sKKwlpbnQgbjsJCQkJLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisJaW50IGxlbmd0aDsJCQkvKiBsZW5ndGggdmFsdWUgKi8KKwlpbnQgY29kZTsJCQkvKiBjb2RlIHZhbHVlICovCisJaW50IGRpc3Q7CQkJLyogZGlzdGFuY2UgaW5kZXggKi8KKworCUcyLmNvbXByZXNzZWRfbGVuID0gMEw7CisKKyNpZmRlZiBOT1RfTkVFREVECisJaWYgKEcyLnN0YXRpY19kdHJlZVswXS5MZW4gIT0gMCkKKwkJcmV0dXJuOwkJCS8qIGN0X2luaXQgYWxyZWFkeSBjYWxsZWQgKi8KKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqLworCWxlbmd0aCA9IDA7CisJZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykgeworCQlHMi5iYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKKwkJZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CisJCQlHMi5sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlOworCQl9CisJfQorCUFzc2VydChsZW5ndGggPT0gMjU2LCAiY3RfaW5pdDogbGVuZ3RoICE9IDI1NiIpOworCS8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkCisJICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2UKKwkgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6CisJICovCisJRzIubGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovCisJZGlzdCA9IDA7CisJZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHsKKwkJRzIuYmFzZV9kaXN0W2NvZGVdID0gZGlzdDsKKwkJZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7CisJCQlHMi5kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7CisJCX0KKwl9CisJQXNzZXJ0KGRpc3QgPT0gMjU2LCAiY3RfaW5pdDogZGlzdCAhPSAyNTYiKTsKKwlkaXN0ID4+PSA3OwkJCS8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqLworCWZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7CisJCUcyLmJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNzsKKwkJZm9yIChuID0gMDsgbiA8ICgxIDw8IChleHRyYV9kYml0c1tjb2RlXSAtIDcpKTsgbisrKSB7CisJCQlHMi5kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7CisJCX0KKwl9CisJQXNzZXJ0KGRpc3QgPT0gMjU2LCAiY3RfaW5pdDogMjU2K2Rpc3QgIT0gNTEyIik7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovCisJLyogYWxyZWFkeSB6ZXJvZWQgLSBpdCdzIGluIGJzcworCWZvciAobiA9IDA7IG4gPD0gTUFYX0JJVFM7IG4rKykKKwkJRzIuYmxfY291bnRbbl0gPSAwOyAqLworCisJbiA9IDA7CisJd2hpbGUgKG4gPD0gMTQzKSB7CisJCUcyLnN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDg7CisJCUcyLmJsX2NvdW50WzhdKys7CisJfQorCXdoaWxlIChuIDw9IDI1NSkgeworCQlHMi5zdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA5OworCQlHMi5ibF9jb3VudFs5XSsrOworCX0KKwl3aGlsZSAobiA8PSAyNzkpIHsKKwkJRzIuc3RhdGljX2x0cmVlW24rK10uTGVuID0gNzsKKwkJRzIuYmxfY291bnRbN10rKzsKKwl9CisJd2hpbGUgKG4gPD0gMjg3KSB7CisJCUcyLnN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDg7CisJCUcyLmJsX2NvdW50WzhdKys7CisJfQorCS8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZQorCSAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQorCSAqIGFsbCBvbmVzKQorCSAqLworCWdlbl9jb2RlcygoY3RfZGF0YSAqKSBHMi5zdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxKTsKKworCS8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqLworCWZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKKwkJRzIuc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CisJCUcyLnN0YXRpY19kdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuLCA1KTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KKwlpbml0X2Jsb2NrKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWZsYXRlIGluIHRvIG91dC4KKyAqIElOIGFzc2VydGlvbnM6IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGNsZWFyZWQuCisgKi8KKworc3RhdGljIHZvaWQgemlwKHVsZyB0aW1lX3N0YW1wKQoreworCXVzaCBkZWZsYXRlX2ZsYWdzID0gMDsgIC8qIHBremlwIC1lcywgLWVuIG9yIC1leCBlcXVpdmFsZW50ICovCisKKwlHMS5vdXRjbnQgPSAwOworCisJLyogV3JpdGUgdGhlIGhlYWRlciB0byB0aGUgZ3ppcCBmaWxlLiBTZWUgYWxnb3JpdGhtLmRvYyBmb3IgdGhlIGZvcm1hdCAqLworCS8qIG1hZ2ljIGhlYWRlciBmb3IgZ3ppcCBmaWxlczogMUYgOEIgKi8KKwkvKiBjb21wcmVzc2lvbiBtZXRob2Q6IDggKERFRkxBVEVEKSAqLworCS8qIGdlbmVyYWwgZmxhZ3M6IDAgKi8KKwlwdXRfMzJiaXQoMHgwMDA4OGIxZik7CisJcHV0XzMyYml0KHRpbWVfc3RhbXApOworCisJLyogV3JpdGUgZGVmbGF0ZWQgZmlsZSB0byB6aXAgZmlsZSAqLworCUcxLmNyYyA9IH4wOworCisJYmlfaW5pdCgpOworCWN0X2luaXQoKTsKKwlsbV9pbml0KCZkZWZsYXRlX2ZsYWdzKTsKKworCXB1dF84Yml0KGRlZmxhdGVfZmxhZ3MpOwkvKiBleHRyYSBmbGFncyAqLworCXB1dF84Yml0KDMpOwkvKiBPUyBpZGVudGlmaWVyID0gMyAoVW5peCkgKi8KKworCWRlZmxhdGUoKTsKKworCS8qIFdyaXRlIHRoZSBjcmMgYW5kIHVuY29tcHJlc3NlZCBzaXplICovCisJcHV0XzMyYml0KH5HMS5jcmMpOworCXB1dF8zMmJpdChHMS5pc2l6ZSk7CisKKwlmbHVzaF9vdXRidWYoKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgcGFja19nemlwKHVucGFja19pbmZvX3QgKmluZm8gVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBzdGF0IHM7CisKKwkvKiBDbGVhciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgKi8KKwlHMS5vdXRjbnQgPSAwOworI2lmZGVmIERFQlVHCisJRzEuaW5zaXplID0gMDsKKyNlbmRpZgorCUcxLmlzaXplID0gMDsKKworCS8qIFJlaW5pdCBHMi54eHggKi8KKwltZW1zZXQoJkcyLCAwLCBzaXplb2YoRzIpKTsKKwlHMi5sX2Rlc2MuZHluX3RyZWUgICAgID0gRzIuZHluX2x0cmVlOworCUcyLmxfZGVzYy5zdGF0aWNfdHJlZSAgPSBHMi5zdGF0aWNfbHRyZWU7CisJRzIubF9kZXNjLmV4dHJhX2JpdHMgICA9IGV4dHJhX2xiaXRzOworCUcyLmxfZGVzYy5leHRyYV9iYXNlICAgPSBMSVRFUkFMUyArIDE7CisJRzIubF9kZXNjLmVsZW1zICAgICAgICA9IExfQ09ERVM7CisJRzIubF9kZXNjLm1heF9sZW5ndGggICA9IE1BWF9CSVRTOworCS8vRzIubF9kZXNjLm1heF9jb2RlICAgICA9IDA7CisJRzIuZF9kZXNjLmR5bl90cmVlICAgICA9IEcyLmR5bl9kdHJlZTsKKwlHMi5kX2Rlc2Muc3RhdGljX3RyZWUgID0gRzIuc3RhdGljX2R0cmVlOworCUcyLmRfZGVzYy5leHRyYV9iaXRzICAgPSBleHRyYV9kYml0czsKKwkvL0cyLmRfZGVzYy5leHRyYV9iYXNlICAgPSAwOworCUcyLmRfZGVzYy5lbGVtcyAgICAgICAgPSBEX0NPREVTOworCUcyLmRfZGVzYy5tYXhfbGVuZ3RoICAgPSBNQVhfQklUUzsKKwkvL0cyLmRfZGVzYy5tYXhfY29kZSAgICAgPSAwOworCUcyLmJsX2Rlc2MuZHluX3RyZWUgICAgPSBHMi5ibF90cmVlOworCS8vRzIuYmxfZGVzYy5zdGF0aWNfdHJlZSA9IE5VTEw7CisJRzIuYmxfZGVzYy5leHRyYV9iaXRzICA9IGV4dHJhX2JsYml0cywKKwkvL0cyLmJsX2Rlc2MuZXh0cmFfYmFzZSAgPSAwOworCUcyLmJsX2Rlc2MuZWxlbXMgICAgICAgPSBCTF9DT0RFUzsKKwlHMi5ibF9kZXNjLm1heF9sZW5ndGggID0gTUFYX0JMX0JJVFM7CisJLy9HMi5ibF9kZXNjLm1heF9jb2RlICAgID0gMDsKKworCXMuc3RfY3RpbWUgPSAwOworCWZzdGF0KFNURElOX0ZJTEVOTywgJnMpOworCXppcChzLnN0X2N0aW1lKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBnemlwX2xvbmdvcHRzW10gQUxJR04xID0KKwkic3Rkb3V0XDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkidG8tc3Rkb3V0XDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkiZm9yY2VcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiZiIKKwkidmVyYm9zZVwwIiAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidiIKKyNpZiBFTkFCTEVfR1VOWklQCisJImRlY29tcHJlc3NcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJInVuY29tcHJlc3NcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJInRlc3RcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisjZW5kaWYKKwkicXVpZXRcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkiZmFzdFwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiMSIKKwkiYmVzdFwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiOSIKKwk7CisjZW5kaWYKKworLyoKKyAqIExpbnV4IGtlcm5lbCBidWlsZCB1c2VzIGd6aXAgLWQgLW4uIFdlIGFjY2VwdCBhbmQgaWdub3JlIC1uLgorICogTWFuIHBhZ2Ugc2F5czoKKyAqIC1uIC0tbm8tbmFtZQorICogZ3ppcDogZG8gbm90IHNhdmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBhbmQgdGltZSBzdGFtcC4KKyAqIChUaGUgb3JpZ2luYWwgbmFtZSBpcyBhbHdheXMgc2F2ZWQgaWYgdGhlIG5hbWUgaGFkIHRvIGJlIHRydW5jYXRlZC4pCisgKiBndW56aXA6IGRvIG5vdCByZXN0b3JlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUvdGltZSBldmVuIGlmIHByZXNlbnQKKyAqIChyZW1vdmUgb25seSB0aGUgZ3ppcCBzdWZmaXggZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIG5hbWUpLgorICogVGhpcyBvcHRpb24gaXMgdGhlIGRlZmF1bHQgd2hlbiBkZWNvbXByZXNzaW5nLgorICogLU4gLS1uYW1lCisgKiBnemlwOiBhbHdheXMgc2F2ZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGFuZCB0aW1lIHN0YW1wICh0aGlzIGlzIHRoZSBkZWZhdWx0KQorICogZ3VuemlwOiByZXN0b3JlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRpbWUgc3RhbXAgaWYgcHJlc2VudC4KKyAqLworCitpbnQgZ3ppcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisjaWYgRU5BQkxFX0dVTlpJUAoraW50IGd6aXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisjZWxzZQoraW50IGd6aXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJdW5zaWduZWQgb3B0OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZ3ppcF9sb25nb3B0czsKKyNlbmRpZgorCS8qIE11c3QgbWF0Y2ggYmJ1bnppcCdzIGNvbnN0YW50cyBPUFRfU1RET1VULCBPUFRfRk9SQ0UhICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNmdiIgSUZfR1VOWklQKCJkdCIpICJxMTIzNDU2Nzg5biIpOworI2lmIEVOQUJMRV9HVU5aSVAgLyogZ3VuemlwX21haW4gbWF5IG5vdCBiZSB2aXNpYmxlLi4uICovCisJaWYgKG9wdCAmIDB4MTgpIC8vIC1kIGFuZC9vciAtdAorCQlyZXR1cm4gZ3VuemlwX21haW4oYXJnYywgYXJndik7CisjZW5kaWYKKwlvcHRpb25fbWFzazMyICY9IDB4NzsgLyogaWdub3JlIC1xLCAtMC4uOSAqLworCS8vaWYgKG9wdCAmIDB4MSkgLy8gLWMKKwkvL2lmIChvcHQgJiAweDIpIC8vIC1mCisJLy9pZiAob3B0ICYgMHg0KSAvLyAtdgorCWFyZ3YgKz0gb3B0aW5kOworCisJU0VUX1BUUl9UT19HTE9CQUxTKChjaGFyICopeHphbGxvYyhzaXplb2Yoc3RydWN0IGdsb2JhbHMpK3NpemVvZihzdHJ1Y3QgZ2xvYmFsczIpKQorCQkJKyBzaXplb2Yoc3RydWN0IGdsb2JhbHMpKTsKKworCS8qIEFsbG9jYXRlIGFsbCBnbG9iYWwgYnVmZmVycyAoZm9yIERZTl9BTExPQyBvcHRpb24pICovCisJQUxMT0ModWNoLCBHMS5sX2J1ZiwgSU5CVUZTSVopOworCUFMTE9DKHVjaCwgRzEub3V0YnVmLCBPVVRCVUZTSVopOworCUFMTE9DKHVzaCwgRzEuZF9idWYsIERJU1RfQlVGU0laRSk7CisJQUxMT0ModWNoLCBHMS53aW5kb3csIDJMICogV1NJWkUpOworCUFMTE9DKHVzaCwgRzEucHJldiwgMUwgPDwgQklUUyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBDUkMzMiB0YWJsZSAqLworCWdsb2JhbF9jcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKworCXJldHVybiBiYnVucGFjayhhcmd2LCBwYWNrX2d6aXAsIGFwcGVuZF9leHQsICJneiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9LYnVpbGQuc3JjIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYmM0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL0tidWlsZC5zcmMKQEAgLTAsMCArMSw2NCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworQ09NTU9OX0ZJTEVTOj0gXAorXAorCWRhdGFfc2tpcC5vIFwKKwlkYXRhX2V4dHJhY3RfYWxsLm8gXAorCWRhdGFfZXh0cmFjdF90b19zdGRvdXQubyBcCitcCisJZmlsdGVyX2FjY2VwdF9hbGwubyBcCisJZmlsdGVyX2FjY2VwdF9saXN0Lm8gXAorCWZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3QubyBcCitcCisJaGVhZGVyX3NraXAubyBcCisJaGVhZGVyX2xpc3QubyBcCisJaGVhZGVyX3ZlcmJvc2VfbGlzdC5vIFwKK1wKKwlzZWVrX2J5X3JlYWQubyBcCisJc2Vla19ieV9qdW1wLm8gXAorXAorCWRhdGFfYWxpZ24ubyBcCisJZmluZF9saXN0X2VudHJ5Lm8gXAorCWluaXRfaGFuZGxlLm8KKworRFBLR19GSUxFUzo9IFwKKwlnZXRfaGVhZGVyX2FyLm8gXAorCXVucGFja19hcl9hcmNoaXZlLm8gXAorCWdldF9oZWFkZXJfdGFyLm8gXAorCWZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbi5vCisKK0lOU0VSVAorCitsaWItJChDT05GSUdfQVIpICAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2hlYWRlcl9hci5vIHVucGFja19hcl9hcmNoaXZlLm8KK2xpYi0kKENPTkZJR19CVU5aSVAyKSAgICAgICAgICAgICAgICAgICArPSBkZWNvbXByZXNzX2J1bnppcDIubworbGliLSQoQ09ORklHX1VOTFpNQSkgICAgICAgICAgICAgICAgICAgICs9IGRlY29tcHJlc3NfdW5sem1hLm8KK2xpYi0kKENPTkZJR19VTlhaKSAgICAgICAgICAgICAgICAgICAgICArPSBkZWNvbXByZXNzX3VueHoubworbGliLSQoQ09ORklHX0NQSU8pICAgICAgICAgICAgICAgICAgICAgICs9IGdldF9oZWFkZXJfY3Bpby5vCitsaWItJChDT05GSUdfRFBLRykgICAgICAgICAgICAgICAgICAgICAgKz0gJChEUEtHX0ZJTEVTKQorbGliLSQoQ09ORklHX0RQS0dfREVCKSAgICAgICAgICAgICAgICAgICs9ICQoRFBLR19GSUxFUykKK2xpYi0kKENPTkZJR19HVU5aSVApICAgICAgICAgICAgICAgICAgICArPSBkZWNvbXByZXNzX3VuemlwLm8KK2xpYi0kKENPTkZJR19SUE0yQ1BJTykgICAgICAgICAgICAgICAgICArPSBkZWNvbXByZXNzX3VuemlwLm8gZ2V0X2hlYWRlcl9jcGlvLm8KK2xpYi0kKENPTkZJR19SUE0pICAgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bnppcC5vIGdldF9oZWFkZXJfY3Bpby5vCitsaWItJChDT05GSUdfVEFSKSAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2hlYWRlcl90YXIubworbGliLSQoQ09ORklHX1VOQ09NUFJFU1MpICAgICAgICAgICAgICAgICs9IGRlY29tcHJlc3NfdW5jb21wcmVzcy5vCitsaWItJChDT05GSUdfVU5aSVApICAgICAgICAgICAgICAgICAgICAgKz0gZGVjb21wcmVzc191bnppcC5vCitsaWItJChDT05GSUdfTFpPUCkgICAgICAgICAgICAgICAgICAgICAgKz0gbHpvMXhfMS5vIGx6bzF4XzFvLm8gbHpvMXhfZC5vCitsaWItJChDT05GSUdfTFpPUF9DT01QUl9ISUdIKSAgICAgICAgICAgKz0gbHpvMXhfOXgubworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWikgICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX3VuY29tcHJlc3MubworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1opICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX3VuemlwLm8gZ2V0X2hlYWRlcl90YXJfZ3oubworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyKSAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX2J1bnppcDIubyBnZXRfaGVhZGVyX3Rhcl9iejIubworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQSkgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX3VubHptYS5vIGdldF9oZWFkZXJfdGFyX2x6bWEubworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFopICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX3VueHoubworbGliLSQoQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UpICAgICs9IGRlY29tcHJlc3NfYnVuemlwMi5vCitsaWItJChDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRykgKz0gZGVjb21wcmVzc19idW56aXAyLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EKSAgICArPSBkYXRhX2V4dHJhY3RfdG9fY29tbWFuZC5vCisKK2lmbmVxICgkKGxpYi15KSwpCitsaWIteSArPSAkKENPTU1PTl9GSUxFUykKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L0xJQ0VOU0UgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0MzQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovTElDRU5TRQpAQCAtMCwwICsxLDQ0IEBACitiemlwMiBhcHBsZXQgaW4gYnVzeWJveCBpcyBiYXNlZCBvbiBsaWdodGx5LW1vZGlmaWVkIHNvdXJjZQorb2YgYnppcDIgdmVyc2lvbiAxLjAuNC4gYnppcDIgc291cmNlIGlzIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgKGNvcGllZCB2ZXJiYXRpbSBmcm9tIExJQ0VOU0UgZmlsZSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworVGhpcyBwcm9ncmFtLCAiYnppcDIiLCB0aGUgYXNzb2NpYXRlZCBsaWJyYXJ5ICJsaWJiemlwMiIsIGFuZCBhbGwKK2RvY3VtZW50YXRpb24sIGFyZSBjb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gUiBTZXdhcmQuICBBbGwKK3JpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKzIuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QKKyAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuICBJZiB5b3UgdXNlIHRoaXMKKyAgIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QKKyAgIGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKworMy4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAorICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKworNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAgIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTCitPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCitBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKK0dPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKK0lOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitKdWxpYW4gU2V3YXJkLCBDYW1icmlkZ2UsIFVLLgoranNld2FyZEBiemlwLm9yZworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L1JFQURNRSBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmQ0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L1JFQURNRQpAQCAtMCwwICsxLDkwIEBACitUaGlzIGZpbGUgaXMgYW4gYWJyaWRnZWQgdmVyc2lvbiBvZiBSRUFETUUgZnJvbSBiemlwMiAxLjAuNAorQnVpbGQgaW5zdHJ1Y3Rpb25zICh3aGljaCBhcmUgbm90IHJlbGV2YW50IHRvIGJ1c3lib3hlZCBiemlwMikKK2FyZSByZW1vdmVkLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUaGlzIGlzIHRoZSBSRUFETUUgZm9yIGJ6aXAyL2xpYnppcDIuCitUaGlzIHZlcnNpb24gaXMgZnVsbHkgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cyBwdWJsaWMgcmVsZWFzZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhpcyBmaWxlLgorCitUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgTElDRU5TRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQbGVhc2UgcmVhZCBhbmQgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZzoKKworCitXQVJOSU5HOgorCisgICBUaGlzIHByb2dyYW0gYW5kIGxpYnJhcnkgKGF0dGVtcHRzIHRvKSBjb21wcmVzcyBkYXRhIGJ5CisgICBwZXJmb3JtaW5nIHNldmVyYWwgbm9uLXRyaXZpYWwgdHJhbnNmb3JtYXRpb25zIG9uIGl0LgorICAgVW5sZXNzIHlvdSBhcmUgMTAwJSBmYW1pbGlhciB3aXRoICphbGwqIHRoZSBhbGdvcml0aG1zCisgICBjb250YWluZWQgaGVyZWluLCBhbmQgd2l0aCB0aGUgY29uc2VxdWVuY2VzIG9mIG1vZGlmeWluZyB0aGVtLAorICAgeW91IHNob3VsZCBOT1QgbWVkZGxlIHdpdGggdGhlIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24KKyAgIG1hY2hpbmVyeS4gIEluY29ycmVjdCBjaGFuZ2VzIGNhbiBhbmQgdmVyeSBsaWtlbHkgKndpbGwqCisgICBsZWFkIHRvIGRpc2FzdHJvdXMgbG9zcyBvZiBkYXRhLgorCisKK0RJU0NMQUlNRVI6CisKKyAgIEkgVEFLRSBOTyBSRVNQT05TSUJJTElUWSBGT1IgQU5ZIExPU1MgT0YgREFUQSBBUklTSU5HIEZST00gVEhFCisgICBVU0UgT0YgVEhJUyBQUk9HUkFNL0xJQlJBUlksIEhPV1NPRVZFUiBDQVVTRUQuCisKKyAgIEV2ZXJ5IGNvbXByZXNzaW9uIG9mIGEgZmlsZSBpbXBsaWVzIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUKKyAgIGNvbXByZXNzZWQgZmlsZSBjYW4gYmUgZGVjb21wcmVzc2VkIHRvIHJlcHJvZHVjZSB0aGUgb3JpZ2luYWwuCisgICBHcmVhdCBlZmZvcnRzIGluIGRlc2lnbiwgY29kaW5nIGFuZCB0ZXN0aW5nIGhhdmUgYmVlbiBtYWRlIHRvCisgICBlbnN1cmUgdGhhdCB0aGlzIHByb2dyYW0gd29ya3MgY29ycmVjdGx5LiAgSG93ZXZlciwgdGhlIGNvbXBsZXhpdHkKKyAgIG9mIHRoZSBhbGdvcml0aG1zLCBhbmQsIGluIHBhcnRpY3VsYXIsIHRoZSBwcmVzZW5jZSBvZiB2YXJpb3VzCisgICBzcGVjaWFsIGNhc2VzIGluIHRoZSBjb2RlIHdoaWNoIG9jY3VyIHdpdGggdmVyeSBsb3cgYnV0IG5vbi16ZXJvCisgICBwcm9iYWJpbGl0eSBtYWtlIGl0IGltcG9zc2libGUgdG8gcnVsZSBvdXQgdGhlIHBvc3NpYmlsaXR5IG9mIGJ1Z3MKKyAgIHJlbWFpbmluZyBpbiB0aGUgcHJvZ3JhbS4gIERPIE5PVCBDT01QUkVTUyBBTlkgREFUQSBXSVRIIFRISVMKKyAgIFBST0dSQU0gVU5MRVNTIFlPVSBBUkUgUFJFUEFSRUQgVE8gQUNDRVBUIFRIRSBQT1NTSUJJTElUWSwgSE9XRVZFUgorICAgU01BTEwsIFRIQVQgVEhFIERBVEEgV0lMTCBOT1QgQkUgUkVDT1ZFUkFCTEUuCisKKyAgIFRoYXQgaXMgbm90IHRvIHNheSB0aGlzIHByb2dyYW0gaXMgaW5oZXJlbnRseSB1bnJlbGlhYmxlLgorICAgSW5kZWVkLCBJIHZlcnkgbXVjaCBob3BlIHRoZSBvcHBvc2l0ZSBpcyB0cnVlLiAgYnppcDIvbGliYnppcDIKKyAgIGhhcyBiZWVuIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCBhbmQgZXh0ZW5zaXZlbHkgdGVzdGVkLgorCisKK1BBVEVOVFM6CisKKyAgIFRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRnZSwgYnppcDIvbGliYnppcDIgZG9lcyBub3QgdXNlIGFueQorICAgcGF0ZW50ZWQgYWxnb3JpdGhtcy4gIEhvd2V2ZXIsIEkgZG8gbm90IGhhdmUgdGhlIHJlc291cmNlcworICAgdG8gY2Fycnkgb3V0IGEgcGF0ZW50IHNlYXJjaC4gIFRoZXJlZm9yZSBJIGNhbm5vdCBnaXZlIGFueQorICAgZ3VhcmFudGVlIG9mIHRoZSBhYm92ZSBzdGF0ZW1lbnQuCisKKworSSBob3BlIHlvdSBmaW5kIGJ6aXAyIHVzZWZ1bC4gIEZlZWwgZnJlZSB0byBjb250YWN0IG1lIGF0CisgICBqc2V3YXJkQGJ6aXAub3JnCitpZiB5b3UgaGF2ZSBhbnkgc3VnZ2VzdGlvbnMgb3IgcXVlcmllcy4gIE1hbnkgcGVvcGxlIG1haWxlZCBtZSB3aXRoCitjb21tZW50cywgc3VnZ2VzdGlvbnMgYW5kIHBhdGNoZXMgYWZ0ZXIgdGhlIHJlbGVhc2VzIG9mIGJ6aXAtMC4xNSwKK2J6aXAtMC4yMSwgYW5kIGJ6aXAyIHZlcnNpb25zIDAuMXBsMiwgMC45LjAsIDAuOS41LCAxLjAuMCwgMS4wLjEsCisxLjAuMiBhbmQgMS4wLjMsIGFuZCB0aGUgY2hhbmdlcyBpbiBiemlwMiBhcmUgbGFyZ2VseSBhIHJlc3VsdCBvZiB0aGlzCitmZWVkYmFjay4gIEkgdGhhbmsgeW91IGZvciB5b3VyIGNvbW1lbnRzLgorCitiemlwMidzICJob21lIiBpcyBodHRwOi8vd3d3LmJ6aXAub3JnLworCitKdWxpYW4gU2V3YXJkCitqc2V3YXJkQGJ6aXAub3JnCitDYW1icmlkZ2UsIFVLLgorCisxOCAgICAgSnVseSAxOTk2ICh2ZXJzaW9uIDAuMTUpCisyNSAgIEF1Z3VzdCAxOTk2ICh2ZXJzaW9uIDAuMjEpCisgNyAgIEF1Z3VzdCAxOTk3IChiemlwMiwgdmVyc2lvbiAwLjEpCisyOSAgIEF1Z3VzdCAxOTk3IChiemlwMiwgdmVyc2lvbiAwLjFwbDIpCisyMyAgIEF1Z3VzdCAxOTk4IChiemlwMiwgdmVyc2lvbiAwLjkuMCkKKyA4ICAgICBKdW5lIDE5OTkgKGJ6aXAyLCB2ZXJzaW9uIDAuOS41KQorIDQgICAgIFNlcHQgMTk5OSAoYnppcDIsIHZlcnNpb24gMC45LjVkKQorIDUgICAgICBNYXkgMjAwMCAoYnppcDIsIHZlcnNpb24gMS4wcHJlOCkKKzMwIERlY2VtYmVyIDIwMDEgKGJ6aXAyLCB2ZXJzaW9uIDEuMC4ycHJlMSkKKzE1IEZlYnJ1YXJ5IDIwMDUgKGJ6aXAyLCB2ZXJzaW9uIDEuMC4zKQorMjAgRGVjZW1iZXIgMjAwNiAoYnppcDIsIHZlcnNpb24gMS4wLjQpCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2Jsb2Nrc29ydC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9ibG9ja3NvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzBjMzcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9ibG9ja3NvcnQuYwpAQCAtMCwwICsxLDEwNzIgQEAKKy8qCisgKiBiemlwMiBpcyB3cml0dGVuIGJ5IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+LgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIEJsb2NrIHNvcnRpbmcgbWFjaGluZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NvcnQuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZpbGUgaXMgcGFydCBvZiBiemlwMi9saWJiemlwMiwgYSBwcm9ncmFtIGFuZCBsaWJyYXJ5IGZvcgorbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CitDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPgorCitQbGVhc2UgcmVhZCB0aGUgV0FSTklORywgRElTQ0xBSU1FUiBhbmQgUEFURU5UUyBzZWN0aW9ucyBpbiB0aGUKK1JFQURNRSBmaWxlLgorCitUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgTElDRU5TRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAjaW5jbHVkZSAiYnpsaWJfcHJpdmF0ZS5oIiAqLworCisjZGVmaW5lIG1zd2FwKHp6MSwgenoyKSBcCit7IFwKKwlpbnQzMl90IHp6dG1wID0genoxOyBcCisJenoxID0genoyOyBcCisJenoyID0genp0bXA7IFwKK30KKworc3RhdGljCisvKiBObyBtZWFzdXJhYmxlIHNwZWVkIGdhaW4gd2l0aCBpbmxpbmluZyAqLworLyogQUxXQVlTX0lOTElORSAqLwordm9pZCBtdnN3YXAodWludDMyX3QqIHB0ciwgaW50MzJfdCB6enAxLCBpbnQzMl90IHp6cDIsIGludDMyX3QgenpuKQoreworCXdoaWxlICh6em4gPiAwKSB7CisJCW1zd2FwKHB0clt6enAxXSwgcHRyW3p6cDJdKTsKKwkJenpwMSsrOworCQl6enAyKys7CisJCXp6bi0tOworCX0KK30KKworc3RhdGljCitBTFdBWVNfSU5MSU5FCitpbnQzMl90IG1taW4oaW50MzJfdCBhLCBpbnQzMl90IGIpCit7CisJcmV0dXJuIChhIDwgYikgPyBhIDogYjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBGYWxsYmFjayBPKE4gbG9nKE4pXjIpIHNvcnRpbmcgICAgICAgIC0tLSovCisvKi0tLSBhbGdvcml0aG0sIGZvciByZXBldGl0aXZlIGJsb2NrcyAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworaW5saW5lCit2b2lkIGZhbGxiYWNrU2ltcGxlU29ydCh1aW50MzJfdCogZm1hcCwKKwkJdWludDMyX3QqIGVjbGFzcywKKwkJaW50MzJfdCAgIGxvLAorCQlpbnQzMl90ICAgaGkpCit7CisJaW50MzJfdCBpLCBqLCB0bXA7CisJdWludDMyX3QgZWNfdG1wOworCisJaWYgKGxvID09IGhpKSByZXR1cm47CisKKwlpZiAoaGkgLSBsbyA+IDMpIHsKKwkJZm9yIChpID0gaGktNDsgaSA+PSBsbzsgaS0tKSB7CisJCQl0bXAgPSBmbWFwW2ldOworCQkJZWNfdG1wID0gZWNsYXNzW3RtcF07CisJCQlmb3IgKGogPSBpKzQ7IGogPD0gaGkgJiYgZWNfdG1wID4gZWNsYXNzW2ZtYXBbal1dOyBqICs9IDQpCisJCQkJZm1hcFtqLTRdID0gZm1hcFtqXTsKKwkJCWZtYXBbai00XSA9IHRtcDsKKwkJfQorCX0KKworCWZvciAoaSA9IGhpLTE7IGkgPj0gbG87IGktLSkgeworCQl0bXAgPSBmbWFwW2ldOworCQllY190bXAgPSBlY2xhc3NbdG1wXTsKKwkJZm9yIChqID0gaSsxOyBqIDw9IGhpICYmIGVjX3RtcCA+IGVjbGFzc1tmbWFwW2pdXTsgaisrKQorCQkJZm1hcFtqLTFdID0gZm1hcFtqXTsKKwkJZm1hcFtqLTFdID0gdG1wOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIGZwdXNoKGx6LGh6KSB7IFwKKwlzdGFja0xvW3NwXSA9IGx6OyBcCisJc3RhY2tIaVtzcF0gPSBoejsgXAorCXNwKys7IFwKK30KKworI2RlZmluZSBmcG9wKGx6LGh6KSB7IFwKKwlzcC0tOyBcCisJbHogPSBzdGFja0xvW3NwXTsgXAorCWh6ID0gc3RhY2tIaVtzcF07IFwKK30KKworI2RlZmluZSBGQUxMQkFDS19RU09SVF9TTUFMTF9USFJFU0ggMTAKKyNkZWZpbmUgRkFMTEJBQ0tfUVNPUlRfU1RBQ0tfU0laRSAgIDEwMAorCitzdGF0aWMKK3ZvaWQgZmFsbGJhY2tRU29ydDModWludDMyX3QqIGZtYXAsCisJCXVpbnQzMl90KiBlY2xhc3MsCisJCWludDMyX3QgICBsb1N0LAorCQlpbnQzMl90ICAgaGlTdCkKK3sKKwlpbnQzMl90IHVuTG8sIHVuSGksIGx0TG8sIGd0SGksIG4sIG07CisJaW50MzJfdCBzcCwgbG8sIGhpOworCXVpbnQzMl90IG1lZCwgciwgcjM7CisJaW50MzJfdCBzdGFja0xvW0ZBTExCQUNLX1FTT1JUX1NUQUNLX1NJWkVdOworCWludDMyX3Qgc3RhY2tIaVtGQUxMQkFDS19RU09SVF9TVEFDS19TSVpFXTsKKworCXIgPSAwOworCisJc3AgPSAwOworCWZwdXNoKGxvU3QsIGhpU3QpOworCisJd2hpbGUgKHNwID4gMCkgeworCQlBc3NlcnRIKHNwIDwgRkFMTEJBQ0tfUVNPUlRfU1RBQ0tfU0laRSAtIDEsIDEwMDQpOworCisJCWZwb3AobG8sIGhpKTsKKwkJaWYgKGhpIC0gbG8gPCBGQUxMQkFDS19RU09SVF9TTUFMTF9USFJFU0gpIHsKKwkJCWZhbGxiYWNrU2ltcGxlU29ydChmbWFwLCBlY2xhc3MsIGxvLCBoaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJhbmRvbSBwYXJ0aXRpb25pbmcuICBNZWRpYW4gb2YgMyBzb21ldGltZXMgZmFpbHMgdG8KKwkJICogYXZvaWQgYmFkIGNhc2VzLiAgTWVkaWFuIG9mIDkgc2VlbXMgdG8gaGVscCBidXQKKwkJICogbG9va3MgcmF0aGVyIGV4cGVuc2l2ZS4gIFRoaXMgdG9vIHNlZW1zIHRvIHdvcmsgYnV0CisJCSAqIGlzIGNoZWFwZXIuICBHdWlkYW5jZSBmb3IgdGhlIG1hZ2ljIGNvbnN0YW50cworCQkgKiA3NjIxIGFuZCAzMjc2OCBpcyB0YWtlbiBmcm9tIFNlZGdld2ljaydzIGFsZ29yaXRobXMKKwkJICogYm9vaywgY2hhcHRlciAzNS4KKwkJICovCisJCXIgPSAoKHIgKiA3NjIxKSArIDEpICUgMzI3Njg7CisJCXIzID0gciAlIDM7CisJCWlmIChyMyA9PSAwKQorCQkJbWVkID0gZWNsYXNzW2ZtYXBbbG9dXTsKKwkJZWxzZSBpZiAocjMgPT0gMSkKKwkJCW1lZCA9IGVjbGFzc1tmbWFwWyhsbytoaSk+PjFdXTsKKwkJZWxzZQorCQkJbWVkID0gZWNsYXNzW2ZtYXBbaGldXTsKKworCQl1bkxvID0gbHRMbyA9IGxvOworCQl1bkhpID0gZ3RIaSA9IGhpOworCisJCXdoaWxlICgxKSB7CisJCQl3aGlsZSAoMSkgeworCQkJCWlmICh1bkxvID4gdW5IaSkgYnJlYWs7CisJCQkJbiA9IChpbnQzMl90KWVjbGFzc1tmbWFwW3VuTG9dXSAtIChpbnQzMl90KW1lZDsKKwkJCQlpZiAobiA9PSAwKSB7CisJCQkJCW1zd2FwKGZtYXBbdW5Mb10sIGZtYXBbbHRMb10pOworCQkJCQlsdExvKys7CisJCQkJCXVuTG8rKzsKKwkJCQkJY29udGludWU7CisJCQkJfTsKKwkJCQlpZiAobiA+IDApIGJyZWFrOworCQkJCXVuTG8rKzsKKwkJCX0KKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKHVuTG8gPiB1bkhpKSBicmVhazsKKwkJCQluID0gKGludDMyX3QpZWNsYXNzW2ZtYXBbdW5IaV1dIC0gKGludDMyX3QpbWVkOworCQkJCWlmIChuID09IDApIHsKKwkJCQkJbXN3YXAoZm1hcFt1bkhpXSwgZm1hcFtndEhpXSk7CisJCQkJCWd0SGktLTsgdW5IaS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9OworCQkJCWlmIChuIDwgMCkgYnJlYWs7CisJCQkJdW5IaS0tOworCQkJfQorCQkJaWYgKHVuTG8gPiB1bkhpKSBicmVhazsKKwkJCW1zd2FwKGZtYXBbdW5Mb10sIGZtYXBbdW5IaV0pOyB1bkxvKys7IHVuSGktLTsKKwkJfQorCisJCUFzc2VydEQodW5IaSA9PSB1bkxvLTEsICJmYWxsYmFja1FTb3J0MygyKSIpOworCisJCWlmIChndEhpIDwgbHRMbykgY29udGludWU7CisKKwkJbiA9IG1taW4obHRMby1sbywgdW5Mby1sdExvKTsgbXZzd2FwKGZtYXAsIGxvLCB1bkxvLW4sIG4pOworCQltID0gbW1pbihoaS1ndEhpLCBndEhpLXVuSGkpOyBtdnN3YXAoZm1hcCwgdW5MbywgaGktbSsxLCBtKTsKKworCQluID0gbG8gKyB1bkxvIC0gbHRMbyAtIDE7CisJCW0gPSBoaSAtIChndEhpIC0gdW5IaSkgKyAxOworCisJCWlmIChuIC0gbG8gPiBoaSAtIG0pIHsKKwkJCWZwdXNoKGxvLCBuKTsKKwkJCWZwdXNoKG0sIGhpKTsKKwkJfSBlbHNlIHsKKwkJCWZwdXNoKG0sIGhpKTsKKwkJCWZwdXNoKGxvLCBuKTsKKwkJfQorCX0KK30KKworI3VuZGVmIGZwdXNoCisjdW5kZWYgZnBvcAorI3VuZGVmIEZBTExCQUNLX1FTT1JUX1NNQUxMX1RIUkVTSAorI3VuZGVmIEZBTExCQUNLX1FTT1JUX1NUQUNLX1NJWkUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcmU6CisgKgluYmxvY2sgPiAwCisgKgllY2xhc3MgZXhpc3RzIGZvciBbMCAuLiBuYmxvY2stMV0KKyAqCSgodWludDhfdCopZWNsYXNzKSBbMCAuLiBuYmxvY2stMV0gaG9sZHMgYmxvY2sKKyAqCXB0ciBleGlzdHMgZm9yIFswIC4uIG5ibG9jay0xXQorICoKKyAqIFBvc3Q6CisgKgkoKHVpbnQ4X3QqKWVjbGFzcykgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIGJsb2NrCisgKglBbGwgb3RoZXIgYXJlYXMgb2YgZWNsYXNzIGRlc3Ryb3llZAorICoJZm1hcCBbMCAuLiBuYmxvY2stMV0gaG9sZHMgc29ydGVkIG9yZGVyCisgKgliaHRhYlswIC4uIDIrKG5ibG9jay8zMildIGRlc3Ryb3llZAorKi8KKworI2RlZmluZSAgICAgICBTRVRfQkgoenopICBiaHRhYlsoenopID4+IDVdIHw9ICgxIDw8ICgoenopICYgMzEpKQorI2RlZmluZSAgICAgQ0xFQVJfQkgoenopICBiaHRhYlsoenopID4+IDVdICY9IH4oMSA8PCAoKHp6KSAmIDMxKSkKKyNkZWZpbmUgICAgIElTU0VUX0JIKHp6KSAgKGJodGFiWyh6eikgPj4gNV0gJiAoMSA8PCAoKHp6KSAmIDMxKSkpCisjZGVmaW5lICAgICAgV09SRF9CSCh6eikgIGJodGFiWyh6eikgPj4gNV0KKyNkZWZpbmUgVU5BTElHTkVEX0JIKHp6KSAgKCh6eikgJiAweDAxZikKKworc3RhdGljCit2b2lkIGZhbGxiYWNrU29ydCh1aW50MzJfdCogZm1hcCwKKwkJdWludDMyX3QqIGVjbGFzcywKKwkJdWludDMyX3QqIGJodGFiLAorCQlpbnQzMl90ICAgbmJsb2NrKQoreworCWludDMyX3QgZnRhYlsyNTddOworCWludDMyX3QgZnRhYkNvcHlbMjU2XTsKKwlpbnQzMl90IEgsIGksIGosIGssIGwsIHIsIGNjLCBjYzE7CisJaW50MzJfdCBuTm90RG9uZTsKKwlpbnQzMl90IG5CaHRhYjsKKwl1aW50OF90KiBlY2xhc3M4ID0gKHVpbnQ4X3QqKWVjbGFzczsKKworCS8qCisJICogSW5pdGlhbCAxLWNoYXIgcmFkaXggc29ydCB0byBnZW5lcmF0ZQorCSAqIGluaXRpYWwgZm1hcCBhbmQgaW5pdGlhbCBCSCBiaXRzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTc7ICAgIGkrKykgZnRhYltpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5ibG9jazsgaSsrKSBmdGFiW2VjbGFzczhbaV1dKys7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgICAgaSsrKSBmdGFiQ29weVtpXSA9IGZ0YWJbaV07CisKKwlqID0gZnRhYlswXTsgIC8qIGJib3g6IG9wdGltaXplZCAqLworCWZvciAoaSA9IDE7IGkgPCAyNTc7ICAgIGkrKykgeworCQlqICs9IGZ0YWJbaV07CisJCWZ0YWJbaV0gPSBqOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuYmxvY2s7IGkrKykgeworCQlqID0gZWNsYXNzOFtpXTsKKwkJayA9IGZ0YWJbal0gLSAxOworCQlmdGFiW2pdID0gazsKKwkJZm1hcFtrXSA9IGk7CisJfQorCisJbkJodGFiID0gMiArICgodWludDMyX3QpbmJsb2NrIC8gMzIpOyAvKiBiYm94OiB1bnNpZ25lZCBkaXYgaXMgZWFzaWVyICovCisJZm9yIChpID0gMDsgaSA8IG5CaHRhYjsgaSsrKSBiaHRhYltpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBTRVRfQkgoZnRhYltpXSk7CisKKwkvKgorCSAqIEluZHVjdGl2ZWx5IHJlZmluZSB0aGUgYnVja2V0cy4gIEtpbmQtb2YgYW4KKwkgKiAiZXhwb25lbnRpYWwgcmFkaXggc29ydCIgKCEpLCBpbnNwaXJlZCBieSB0aGUKKwkgKiBNYW5iZXItTXllcnMgc3VmZml4IGFycmF5IGNvbnN0cnVjdGlvbiBhbGdvcml0aG0uCisJICovCisKKwkvKi0tIHNldCBzZW50aW5lbCBiaXRzIGZvciBibG9jay1lbmQgZGV0ZWN0aW9uIC0tKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlTRVRfQkgobmJsb2NrICsgMippKTsKKwkJQ0xFQVJfQkgobmJsb2NrICsgMippICsgMSk7CisJfQorCisJLyotLSB0aGUgbG9nKE4pIGxvb3AgLS0qLworCUggPSAxOworCXdoaWxlICgxKSB7CisJCWogPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHsKKwkJCWlmIChJU1NFVF9CSChpKSkKKwkJCQlqID0gaTsKKwkJCWsgPSBmbWFwW2ldIC0gSDsKKwkJCWlmIChrIDwgMCkKKwkJCQlrICs9IG5ibG9jazsKKwkJCWVjbGFzc1trXSA9IGo7CisJCX0KKworCQluTm90RG9uZSA9IDA7CisJCXIgPSAtMTsKKwkJd2hpbGUgKDEpIHsKKworCQkvKi0tIGZpbmQgdGhlIG5leHQgbm9uLXNpbmdsZXRvbiBidWNrZXQgLS0qLworCQkJayA9IHIgKyAxOworCQkJd2hpbGUgKElTU0VUX0JIKGspICYmIFVOQUxJR05FRF9CSChrKSkKKwkJCQlrKys7CisJCQlpZiAoSVNTRVRfQkgoaykpIHsKKwkJCQl3aGlsZSAoV09SRF9CSChrKSA9PSAweGZmZmZmZmZmKSBrICs9IDMyOworCQkJCXdoaWxlIChJU1NFVF9CSChrKSkgaysrOworCQkJfQorCQkJbCA9IGsgLSAxOworCQkJaWYgKGwgPj0gbmJsb2NrKQorCQkJCWJyZWFrOworCQkJd2hpbGUgKCFJU1NFVF9CSChrKSAmJiBVTkFMSUdORURfQkgoaykpCisJCQkJaysrOworCQkJaWYgKCFJU1NFVF9CSChrKSkgeworCQkJCXdoaWxlIChXT1JEX0JIKGspID09IDB4MDAwMDAwMDApIGsgKz0gMzI7CisJCQkJd2hpbGUgKCFJU1NFVF9CSChrKSkgaysrOworCQkJfQorCQkJciA9IGsgLSAxOworCQkJaWYgKHIgPj0gbmJsb2NrKQorCQkJCWJyZWFrOworCisJCQkvKi0tIG5vdyBbbCwgcl0gYnJhY2tldCBjdXJyZW50IGJ1Y2tldCAtLSovCisJCQlpZiAociA+IGwpIHsKKwkJCQluTm90RG9uZSArPSAociAtIGwgKyAxKTsKKwkJCQlmYWxsYmFja1FTb3J0MyhmbWFwLCBlY2xhc3MsIGwsIHIpOworCisJCQkJLyotLSBzY2FuIGJ1Y2tldCBhbmQgZ2VuZXJhdGUgaGVhZGVyIGJpdHMtLSAqLworCQkJCWNjID0gLTE7CisJCQkJZm9yIChpID0gbDsgaSA8PSByOyBpKyspIHsKKwkJCQkJY2MxID0gZWNsYXNzW2ZtYXBbaV1dOworCQkJCQlpZiAoY2MgIT0gY2MxKSB7CisJCQkJCQlTRVRfQkgoaSk7CisJCQkJCQljYyA9IGNjMTsKKwkJCQkJfTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlIICo9IDI7CisJCWlmIChIID4gbmJsb2NrIHx8IG5Ob3REb25lID09IDApCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBibG9jayBpbgorCSAqIGVjbGFzczggWzAgLi4gbmJsb2NrLTFdLCBzaW5jZSB0aGUKKwkgKiBwcmV2aW91cyBwaGFzZSBkZXN0cm95ZWQgaXQuCisJICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5ibG9jazsgaSsrKSB7CisJCXdoaWxlIChmdGFiQ29weVtqXSA9PSAwKQorCQkJaisrOworCQlmdGFiQ29weVtqXS0tOworCQllY2xhc3M4W2ZtYXBbaV1dID0gKHVpbnQ4X3QpajsKKwl9CisJQXNzZXJ0SChqIDwgMjU2LCAxMDA1KTsKK30KKworI3VuZGVmICAgICAgIFNFVF9CSAorI3VuZGVmICAgICBDTEVBUl9CSAorI3VuZGVmICAgICBJU1NFVF9CSAorI3VuZGVmICAgICAgV09SRF9CSAorI3VuZGVmIFVOQUxJR05FRF9CSAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIFRoZSBtYWluLCBPKE5eMiBsb2coTikpIHNvcnRpbmcgICAgICAgLS0tKi8KKy8qLS0tIGFsZ29yaXRobS4gIEZhc3RlciBmb3IgIm5vcm1hbCIgICAgICAgLS0tKi8KKy8qLS0tIG5vbi1yZXBldGl0aXZlIGJsb2Nrcy4gICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitOT0lOTElORQoraW50IG1haW5HdFUoCisJCXVpbnQzMl90ICBpMSwKKwkJdWludDMyX3QgIGkyLAorCQl1aW50OF90KiAgYmxvY2ssCisJCXVpbnQxNl90KiBxdWFkcmFudCwKKwkJdWludDMyX3QgIG5ibG9jaywKKwkJaW50MzJfdCogIGJ1ZGdldCkKK3sKKwlpbnQzMl90ICBrOworCXVpbnQ4X3QgIGMxLCBjMjsKKwl1aW50MTZfdCBzMSwgczI7CisKKy8qIExvb3AgdW5yb2xsaW5nIGhlcmUgaXMgYWN0dWFsbHkgdmVyeSB1c2VmdWwKKyAqIChnZW5lcmF0ZWQgY29kZSBpcyBtdWNoIHNpbXBsZXIpLAorICogY29kZSBzaXplIGluY3JlYXNlIGlzIG9ubHkgMjcwIGJ5dGVzIChpMzg2KQorICogYnV0IHNwZWVkcyB1cCBjb21wcmVzc2lvbiAxMCUgb3ZlcmFsbAorICovCisKKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSAxCisKKyNkZWZpbmUgVElNRVNfOChjb2RlKSBcCisJY29kZTsgY29kZTsgY29kZTsgY29kZTsgXAorCWNvZGU7IGNvZGU7IGNvZGU7IGNvZGU7CisjZGVmaW5lIFRJTUVTXzEyKGNvZGUpIFwKKwljb2RlOyBjb2RlOyBjb2RlOyBjb2RlOyBcCisJY29kZTsgY29kZTsgY29kZTsgY29kZTsgXAorCWNvZGU7IGNvZGU7IGNvZGU7IGNvZGU7CisKKyNlbHNlCisKKyNkZWZpbmUgVElNRVNfOChjb2RlKSBcCit7IFwKKwlpbnQgbm4gPSA4OyBcCisJZG8geyBcCisJCWNvZGU7IFwKKwl9IHdoaWxlICgtLW5uKTsgXAorfQorI2RlZmluZSBUSU1FU18xMihjb2RlKSBcCit7IFwKKwlpbnQgbm4gPSAxMjsgXAorCWRvIHsgXAorCQljb2RlOyBcCisJfSB3aGlsZSAoLS1ubik7IFwKK30KKworI2VuZGlmCisKKwlBc3NlcnREKGkxICE9IGkyLCAibWFpbkd0VSIpOworCVRJTUVTXzEyKAorCQljMSA9IGJsb2NrW2kxXTsgYzIgPSBibG9ja1tpMl07CisJCWlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKKwkJaTErKzsgaTIrKzsKKwkpCisKKwlrID0gbmJsb2NrICsgODsKKworCWRvIHsKKwkJVElNRVNfOCgKKwkJCWMxID0gYmxvY2tbaTFdOyBjMiA9IGJsb2NrW2kyXTsKKwkJCWlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKKwkJCXMxID0gcXVhZHJhbnRbaTFdOyBzMiA9IHF1YWRyYW50W2kyXTsKKwkJCWlmIChzMSAhPSBzMikgcmV0dXJuIChzMSA+IHMyKTsKKwkJCWkxKys7IGkyKys7CisJCSkKKworCQlpZiAoaTEgPj0gbmJsb2NrKSBpMSAtPSBuYmxvY2s7CisJCWlmIChpMiA+PSBuYmxvY2spIGkyIC09IG5ibG9jazsKKworCQkoKmJ1ZGdldCktLTsKKwkJayAtPSA4OworCX0gd2hpbGUgKGsgPj0gMCk7CisKKwlyZXR1cm4gRmFsc2U7Cit9CisjdW5kZWYgVElNRVNfOAorI3VuZGVmIFRJTUVTXzEyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBLbnV0aCdzIGluY3JlbWVudHMgc2VlbSB0byB3b3JrIGJldHRlcgorICogdGhhbiBJbmNlcnBpLVNlZGdld2ljayBoZXJlLiAgUG9zc2libHkKKyAqIGJlY2F1c2UgdGhlIG51bWJlciBvZiBlbGVtcyB0byBzb3J0IGlzCisgKiB1c3VhbGx5IHNtYWxsLCB0eXBpY2FsbHkgPD0gMjAuCisgKi8KK3N0YXRpYworY29uc3QgaW50MzJfdCBpbmNzWzE0XSA9IHsKKwkxLCA0LCAxMywgNDAsIDEyMSwgMzY0LCAxMDkzLCAzMjgwLAorCTk4NDEsIDI5NTI0LCA4ODU3MywgMjY1NzIwLAorCTc5NzE2MSwgMjM5MTQ4NAorfTsKKworc3RhdGljCit2b2lkIG1haW5TaW1wbGVTb3J0KHVpbnQzMl90KiBwdHIsCisJCXVpbnQ4X3QqICBibG9jaywKKwkJdWludDE2X3QqIHF1YWRyYW50LAorCQlpbnQzMl90ICAgbmJsb2NrLAorCQlpbnQzMl90ICAgbG8sCisJCWludDMyX3QgICBoaSwKKwkJaW50MzJfdCAgIGQsCisJCWludDMyX3QqICBidWRnZXQpCit7CisJaW50MzJfdCBpLCBqLCBoLCBiaWdOLCBocDsKKwl1aW50MzJfdCB2OworCisJYmlnTiA9IGhpIC0gbG8gKyAxOworCWlmIChiaWdOIDwgMikgcmV0dXJuOworCisJaHAgPSAwOworCXdoaWxlIChpbmNzW2hwXSA8IGJpZ04pIGhwKys7CisJaHAtLTsKKworCWZvciAoOyBocCA+PSAwOyBocC0tKSB7CisJCWggPSBpbmNzW2hwXTsKKworCQlpID0gbG8gKyBoOworCQl3aGlsZSAoMSkgeworCQkJLyotLSBjb3B5IDEgLS0qLworCQkJaWYgKGkgPiBoaSkgYnJlYWs7CisJCQl2ID0gcHRyW2ldOworCQkJaiA9IGk7CisJCQl3aGlsZSAobWFpbkd0VShwdHJbai1oXStkLCB2K2QsIGJsb2NrLCBxdWFkcmFudCwgbmJsb2NrLCBidWRnZXQpKSB7CisJCQkJcHRyW2pdID0gcHRyW2otaF07CisJCQkJaiA9IGogLSBoOworCQkJCWlmIChqIDw9IChsbyArIGggLSAxKSkgYnJlYWs7CisJCQl9CisJCQlwdHJbal0gPSB2OworCQkJaSsrOworCisvKiAxLjUlIG92ZXJhbGwgc3BlZWR1cCwgKzI5MCBieXRlcyAqLworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDMKKwkJCS8qLS0gY29weSAyIC0tKi8KKwkJCWlmIChpID4gaGkpIGJyZWFrOworCQkJdiA9IHB0cltpXTsKKwkJCWogPSBpOworCQkJd2hpbGUgKG1haW5HdFUocHRyW2otaF0rZCwgditkLCBibG9jaywgcXVhZHJhbnQsIG5ibG9jaywgYnVkZ2V0KSkgeworCQkJCXB0cltqXSA9IHB0cltqLWhdOworCQkJCWogPSBqIC0gaDsKKwkJCQlpZiAoaiA8PSAobG8gKyBoIC0gMSkpIGJyZWFrOworCQkJfQorCQkJcHRyW2pdID0gdjsKKwkJCWkrKzsKKworCQkJLyotLSBjb3B5IDMgLS0qLworCQkJaWYgKGkgPiBoaSkgYnJlYWs7CisJCQl2ID0gcHRyW2ldOworCQkJaiA9IGk7CisJCQl3aGlsZSAobWFpbkd0VShwdHJbai1oXStkLCB2K2QsIGJsb2NrLCBxdWFkcmFudCwgbmJsb2NrLCBidWRnZXQpKSB7CisJCQkJcHRyW2pdID0gcHRyW2otaF07CisJCQkJaiA9IGogLSBoOworCQkJCWlmIChqIDw9IChsbyArIGggLSAxKSkgYnJlYWs7CisJCQl9CisJCQlwdHJbal0gPSB2OworCQkJaSsrOworI2VuZGlmCisJCQlpZiAoKmJ1ZGdldCA8IDApIHJldHVybjsKKwkJfQorCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogYW4gZWxlZ2FudCAzLXdheSBxdWlja3NvcnQgZm9yIHN0cmluZ3MsCisgKiBkZXNjcmliZWQgaW4gYSBwYXBlciAiRmFzdCBBbGdvcml0aG1zIGZvcgorICogU29ydGluZyBhbmQgU2VhcmNoaW5nIFN0cmluZ3MiLCBieSBSb2JlcnQKKyAqIFNlZGdld2ljayBhbmQgSm9uIEwuIEJlbnRsZXkuCisgKi8KKworc3RhdGljCitBTFdBWVNfSU5MSU5FCit1aW50OF90IG1tZWQzKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpCit7CisJdWludDhfdCB0OworCWlmIChhID4gYikgeworCQl0ID0gYTsKKwkJYSA9IGI7CisJCWIgPSB0OworCX07CisJLyogaGVyZSBiID49IGEgKi8KKwlpZiAoYiA+IGMpIHsKKwkJYiA9IGM7CisJCWlmIChhID4gYikKKwkJCWIgPSBhOworCX0KKwlyZXR1cm4gYjsKK30KKworI2RlZmluZSBtcHVzaChseixoeixkeikgXAoreyBcCisJc3RhY2tMb1tzcF0gPSBsejsgXAorCXN0YWNrSGlbc3BdID0gaHo7IFwKKwlzdGFja0QgW3NwXSA9IGR6OyBcCisJc3ArKzsgXAorfQorCisjZGVmaW5lIG1wb3AobHosaHosZHopIFwKK3sgXAorCXNwLS07IFwKKwlseiA9IHN0YWNrTG9bc3BdOyBcCisJaHogPSBzdGFja0hpW3NwXTsgXAorCWR6ID0gc3RhY2tEIFtzcF07IFwKK30KKworI2RlZmluZSBtbmV4dHNpemUoYXopIChuZXh0SGlbYXpdIC0gbmV4dExvW2F6XSkKKworI2RlZmluZSBtbmV4dHN3YXAoYXosYnopIFwKK3sgXAorCWludDMyX3QgdHo7IFwKKwl0eiA9IG5leHRMb1thel07IG5leHRMb1thel0gPSBuZXh0TG9bYnpdOyBuZXh0TG9bYnpdID0gdHo7IFwKKwl0eiA9IG5leHRIaVthel07IG5leHRIaVthel0gPSBuZXh0SGlbYnpdOyBuZXh0SGlbYnpdID0gdHo7IFwKKwl0eiA9IG5leHREIFthel07IG5leHREIFthel0gPSBuZXh0RCBbYnpdOyBuZXh0RCBbYnpdID0gdHo7IFwKK30KKworI2RlZmluZSBNQUlOX1FTT1JUX1NNQUxMX1RIUkVTSCAyMAorI2RlZmluZSBNQUlOX1FTT1JUX0RFUFRIX1RIUkVTSCAoQlpfTl9SQURJWCArIEJaX05fUVNPUlQpCisjZGVmaW5lIE1BSU5fUVNPUlRfU1RBQ0tfU0laRSAgIDEwMAorCitzdGF0aWMgTk9JTkxJTkUKK3ZvaWQgbWFpblFTb3J0Myh1aW50MzJfdCogcHRyLAorCQl1aW50OF90KiAgYmxvY2ssCisJCXVpbnQxNl90KiBxdWFkcmFudCwKKwkJaW50MzJfdCAgIG5ibG9jaywKKwkJaW50MzJfdCAgIGxvU3QsCisJCWludDMyX3QgICBoaVN0LAorCQlpbnQzMl90ICAgZFN0LAorCQlpbnQzMl90KiAgYnVkZ2V0KQoreworCWludDMyX3QgdW5MbywgdW5IaSwgbHRMbywgZ3RIaSwgbiwgbSwgbWVkOworCWludDMyX3Qgc3AsIGxvLCBoaSwgZDsKKworCWludDMyX3Qgc3RhY2tMb1tNQUlOX1FTT1JUX1NUQUNLX1NJWkVdOworCWludDMyX3Qgc3RhY2tIaVtNQUlOX1FTT1JUX1NUQUNLX1NJWkVdOworCWludDMyX3Qgc3RhY2tEIFtNQUlOX1FTT1JUX1NUQUNLX1NJWkVdOworCisJaW50MzJfdCBuZXh0TG9bM107CisJaW50MzJfdCBuZXh0SGlbM107CisJaW50MzJfdCBuZXh0RCBbM107CisKKwlzcCA9IDA7CisJbXB1c2gobG9TdCwgaGlTdCwgZFN0KTsKKworCXdoaWxlIChzcCA+IDApIHsKKwkJQXNzZXJ0SChzcCA8IE1BSU5fUVNPUlRfU1RBQ0tfU0laRSAtIDIsIDEwMDEpOworCisJCW1wb3AobG8sIGhpLCBkKTsKKwkJaWYgKGhpIC0gbG8gPCBNQUlOX1FTT1JUX1NNQUxMX1RIUkVTSAorCQkgfHwgZCA+IE1BSU5fUVNPUlRfREVQVEhfVEhSRVNICisJCSkgeworCQkJbWFpblNpbXBsZVNvcnQocHRyLCBibG9jaywgcXVhZHJhbnQsIG5ibG9jaywgbG8sIGhpLCBkLCBidWRnZXQpOworCQkJaWYgKCpidWRnZXQgPCAwKQorCQkJCXJldHVybjsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lZCA9IChpbnQzMl90KQltbWVkMyhibG9ja1twdHJbbG8gICAgICAgICAgXSArIGRdLAorCQkgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbcHRyW2hpICAgICAgICAgIF0gKyBkXSwKKwkJICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW3B0clsobG8raGkpID4+IDFdICsgZF0pOworCisJCXVuTG8gPSBsdExvID0gbG87CisJCXVuSGkgPSBndEhpID0gaGk7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKHVuTG8gPiB1bkhpKQorCQkJCQlicmVhazsKKwkJCQluID0gKChpbnQzMl90KWJsb2NrW3B0clt1bkxvXStkXSkgLSBtZWQ7CisJCQkJaWYgKG4gPT0gMCkgeworCQkJCQltc3dhcChwdHJbdW5Mb10sIHB0cltsdExvXSk7CisJCQkJCWx0TG8rKzsKKwkJCQkJdW5MbysrOworCQkJCQljb250aW51ZTsKKwkJCQl9OworCQkJCWlmIChuID4gIDApIGJyZWFrOworCQkJCXVuTG8rKzsKKwkJCX0KKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKHVuTG8gPiB1bkhpKQorCQkJCQlicmVhazsKKwkJCQluID0gKChpbnQzMl90KWJsb2NrW3B0clt1bkhpXStkXSkgLSBtZWQ7CisJCQkJaWYgKG4gPT0gMCkgeworCQkJCQltc3dhcChwdHJbdW5IaV0sIHB0cltndEhpXSk7CisJCQkJCWd0SGktLTsKKwkJCQkJdW5IaS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9OworCQkJCWlmIChuIDwgIDApIGJyZWFrOworCQkJCXVuSGktLTsKKwkJCX0KKwkJCWlmICh1bkxvID4gdW5IaSkKKwkJCQlicmVhazsKKwkJCW1zd2FwKHB0clt1bkxvXSwgcHRyW3VuSGldKTsKKwkJCXVuTG8rKzsKKwkJCXVuSGktLTsKKwkJfQorCisJCUFzc2VydEQodW5IaSA9PSB1bkxvLTEsICJtYWluUVNvcnQzKDIpIik7CisKKwkJaWYgKGd0SGkgPCBsdExvKSB7CisJCQltcHVzaChsbywgaGksIGQgKyAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbiA9IG1taW4obHRMby1sbywgdW5Mby1sdExvKTsgbXZzd2FwKHB0ciwgbG8sIHVuTG8tbiwgbik7CisJCW0gPSBtbWluKGhpLWd0SGksIGd0SGktdW5IaSk7IG12c3dhcChwdHIsIHVuTG8sIGhpLW0rMSwgbSk7CisKKwkJbiA9IGxvICsgdW5MbyAtIGx0TG8gLSAxOworCQltID0gaGkgLSAoZ3RIaSAtIHVuSGkpICsgMTsKKworCQluZXh0TG9bMF0gPSBsbzsgIG5leHRIaVswXSA9IG47ICAgbmV4dERbMF0gPSBkOworCQluZXh0TG9bMV0gPSBtOyAgIG5leHRIaVsxXSA9IGhpOyAgbmV4dERbMV0gPSBkOworCQluZXh0TG9bMl0gPSBuKzE7IG5leHRIaVsyXSA9IG0tMTsgbmV4dERbMl0gPSBkKzE7CisKKwkJaWYgKG1uZXh0c2l6ZSgwKSA8IG1uZXh0c2l6ZSgxKSkgbW5leHRzd2FwKDAsIDEpOworCQlpZiAobW5leHRzaXplKDEpIDwgbW5leHRzaXplKDIpKSBtbmV4dHN3YXAoMSwgMik7CisJCWlmIChtbmV4dHNpemUoMCkgPCBtbmV4dHNpemUoMSkpIG1uZXh0c3dhcCgwLCAxKTsKKworCQlBc3NlcnREIChtbmV4dHNpemUoMCkgPj0gbW5leHRzaXplKDEpLCAibWFpblFTb3J0Myg4KSIpOworCQlBc3NlcnREIChtbmV4dHNpemUoMSkgPj0gbW5leHRzaXplKDIpLCAibWFpblFTb3J0Myg5KSIpOworCisJCW1wdXNoKG5leHRMb1swXSwgbmV4dEhpWzBdLCBuZXh0RFswXSk7CisJCW1wdXNoKG5leHRMb1sxXSwgbmV4dEhpWzFdLCBuZXh0RFsxXSk7CisJCW1wdXNoKG5leHRMb1syXSwgbmV4dEhpWzJdLCBuZXh0RFsyXSk7CisJfQorfQorCisjdW5kZWYgbXB1c2gKKyN1bmRlZiBtcG9wCisjdW5kZWYgbW5leHRzaXplCisjdW5kZWYgbW5leHRzd2FwCisjdW5kZWYgTUFJTl9RU09SVF9TTUFMTF9USFJFU0gKKyN1bmRlZiBNQUlOX1FTT1JUX0RFUFRIX1RIUkVTSAorI3VuZGVmIE1BSU5fUVNPUlRfU1RBQ0tfU0laRQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByZToKKyAqCW5ibG9jayA+IE5fT1ZFUlNIT09UCisgKglibG9jazMyIGV4aXN0cyBmb3IgWzAgLi4gbmJsb2NrLTEgK05fT1ZFUlNIT09UXQorICoJKCh1aW50OF90KilibG9jazMyKSBbMCAuLiBuYmxvY2stMV0gaG9sZHMgYmxvY2sKKyAqCXB0ciBleGlzdHMgZm9yIFswIC4uIG5ibG9jay0xXQorICoKKyAqIFBvc3Q6CisgKgkoKHVpbnQ4X3QqKWJsb2NrMzIpIFswIC4uIG5ibG9jay0xXSBob2xkcyBibG9jaworICoJQWxsIG90aGVyIGFyZWFzIG9mIGJsb2NrMzIgZGVzdHJveWVkCisgKglmdGFiWzAgLi4gNjU1MzZdIGRlc3Ryb3llZAorICoJcHRyIFswIC4uIG5ibG9jay0xXSBob2xkcyBzb3J0ZWQgb3JkZXIKKyAqCWlmICgqYnVkZ2V0IDwgMCksIHNvcnRpbmcgd2FzIGFiYW5kb25lZAorICovCisKKyNkZWZpbmUgQklHRlJFUShiKSAoZnRhYlsoKGIpKzEpIDw8IDhdIC0gZnRhYlsoYikgPDwgOF0pCisjZGVmaW5lIFNFVE1BU0sgKDEgPDwgMjEpCisjZGVmaW5lIENMRUFSTUFTSyAofihTRVRNQVNLKSkKKworc3RhdGljIE5PSU5MSU5FCit2b2lkIG1haW5Tb3J0KEVTdGF0ZSogc3RhdGUsCisJCXVpbnQzMl90KiBwdHIsCisJCXVpbnQ4X3QqICBibG9jaywKKwkJdWludDE2X3QqIHF1YWRyYW50LAorCQl1aW50MzJfdCogZnRhYiwKKwkJaW50MzJfdCAgIG5ibG9jaywKKwkJaW50MzJfdCogIGJ1ZGdldCkKK3sKKwlpbnQzMl90ICBpLCBqLCBrLCBzcywgc2I7CisJdWludDhfdCAgYzE7CisJaW50MzJfdCAgbnVtUVNvcnRlZDsKKwl1aW50MTZfdCBzOworCUJvb2wgICAgIGJpZ0RvbmVbMjU2XTsKKwkvKiBiYm94OiBtb3ZlZCB0byBFU3RhdGUgdG8gc2F2ZSBzdGFjaworCWludDMyX3QgIHJ1bm5pbmdPcmRlclsyNTZdOworCWludDMyX3QgIGNvcHlTdGFydFsyNTZdOworCWludDMyX3QgIGNvcHlFbmQgIFsyNTZdOworCSovCisjZGVmaW5lIHJ1bm5pbmdPcmRlciAoc3RhdGUtPm1haW5Tb3J0X19ydW5uaW5nT3JkZXIpCisjZGVmaW5lIGNvcHlTdGFydCAgICAoc3RhdGUtPm1haW5Tb3J0X19jb3B5U3RhcnQpCisjZGVmaW5lIGNvcHlFbmQgICAgICAoc3RhdGUtPm1haW5Tb3J0X19jb3B5RW5kKQorCisJLyotLSBzZXQgdXAgdGhlIDItYnl0ZSBmcmVxdWVuY3kgdGFibGUgLS0qLworCS8qIHdhczogZm9yIChpID0gNjU1MzY7IGkgPj0gMDsgaS0tKSBmdGFiW2ldID0gMDsgKi8KKwltZW1zZXQoZnRhYiwgMCwgNjU1MzcgKiBzaXplb2YoZnRhYlswXSkpOworCisJaiA9IGJsb2NrWzBdIDw8IDg7CisJaSA9IG5ibG9jayAtIDE7CisvKiAzJSwgKzMwMCBieXRlcyAqLworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDIKKwlmb3IgKDsgaSA+PSAzOyBpIC09IDQpIHsKKwkJcXVhZHJhbnRbaV0gPSAwOworCQlqID0gKGogPj4gOCkgfCAoKCh1aW50MTZfdClibG9ja1tpXSkgPDwgOCk7CisJCWZ0YWJbal0rKzsKKwkJcXVhZHJhbnRbaS0xXSA9IDA7CisJCWogPSAoaiA+PiA4KSB8ICgoKHVpbnQxNl90KWJsb2NrW2ktMV0pIDw8IDgpOworCQlmdGFiW2pdKys7CisJCXF1YWRyYW50W2ktMl0gPSAwOworCQlqID0gKGogPj4gOCkgfCAoKCh1aW50MTZfdClibG9ja1tpLTJdKSA8PCA4KTsKKwkJZnRhYltqXSsrOworCQlxdWFkcmFudFtpLTNdID0gMDsKKwkJaiA9IChqID4+IDgpIHwgKCgodWludDE2X3QpYmxvY2tbaS0zXSkgPDwgOCk7CisJCWZ0YWJbal0rKzsKKwl9CisjZW5kaWYKKwlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKwkJcXVhZHJhbnRbaV0gPSAwOworCQlqID0gKGogPj4gOCkgfCAoKCh1aW50MTZfdClibG9ja1tpXSkgPDwgOCk7CisJCWZ0YWJbal0rKzsKKwl9CisKKwkvKi0tIChlbXBoYXNpc2VzIGNsb3NlIHJlbGF0aW9uc2hpcCBvZiBibG9jayAmIHF1YWRyYW50KSAtLSovCisJZm9yIChpID0gMDsgaSA8IEJaX05fT1ZFUlNIT09UOyBpKyspIHsKKwkJYmxvY2sgICBbbmJsb2NrK2ldID0gYmxvY2tbaV07CisJCXF1YWRyYW50W25ibG9jaytpXSA9IDA7CisJfQorCisJLyotLSBDb21wbGV0ZSB0aGUgaW5pdGlhbCByYWRpeCBzb3J0IC0tKi8KKwlqID0gZnRhYlswXTsgLyogYmJveDogb3B0aW1pemVkICovCisJZm9yIChpID0gMTsgaSA8PSA2NTUzNjsgaSsrKSB7CisJCWogKz0gZnRhYltpXTsKKwkJZnRhYltpXSA9IGo7CisJfQorCisJcyA9IGJsb2NrWzBdIDw8IDg7CisJaSA9IG5ibG9jayAtIDE7CisjaWYgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgPj0gMgorCWZvciAoOyBpID49IDM7IGkgLT0gNCkgeworCQlzID0gKHMgPj4gOCkgfCAoYmxvY2tbaV0gPDwgOCk7CisJCWogPSBmdGFiW3NdIC0gMTsKKwkJZnRhYltzXSA9IGo7CisJCXB0cltqXSA9IGk7CisJCXMgPSAocyA+PiA4KSB8IChibG9ja1tpLTFdIDw8IDgpOworCQlqID0gZnRhYltzXSAtIDE7CisJCWZ0YWJbc10gPSBqOworCQlwdHJbal0gPSBpLTE7CisJCXMgPSAocyA+PiA4KSB8IChibG9ja1tpLTJdIDw8IDgpOworCQlqID0gZnRhYltzXSAtIDE7CisJCWZ0YWJbc10gPSBqOworCQlwdHJbal0gPSBpLTI7CisJCXMgPSAocyA+PiA4KSB8IChibG9ja1tpLTNdIDw8IDgpOworCQlqID0gZnRhYltzXSAtIDE7CisJCWZ0YWJbc10gPSBqOworCQlwdHJbal0gPSBpLTM7CisJfQorI2VuZGlmCisJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCXMgPSAocyA+PiA4KSB8IChibG9ja1tpXSA8PCA4KTsKKwkJaiA9IGZ0YWJbc10gLSAxOworCQlmdGFiW3NdID0gajsKKwkJcHRyW2pdID0gaTsKKwl9CisKKwkvKgorCSAqIE5vdyBmdGFiIGNvbnRhaW5zIHRoZSBmaXJzdCBsb2Mgb2YgZXZlcnkgc21hbGwgYnVja2V0LgorCSAqIENhbGN1bGF0ZSB0aGUgcnVubmluZyBvcmRlciwgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0CisJICogYmlnIGJ1Y2tldC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7CisJCWJpZ0RvbmUgICAgIFtpXSA9IEZhbHNlOworCQlydW5uaW5nT3JkZXJbaV0gPSBpOworCX0KKworCXsKKwkJaW50MzJfdCB2djsKKwkJLyogYmJveDogd2FzOiBpbnQzMl90IGggPSAxOyAqLworCQkvKiBkbyBoID0gMyAqIGggKyAxOyB3aGlsZSAoaCA8PSAyNTYpOyAqLworCQl1aW50MzJfdCBoID0gMzY0OworCisJCWRvIHsKKwkJCS8qaCA9IGggLyAzOyovCisJCQloID0gKGggKiAxNzEpID4+IDk7IC8qIGJib3g6IGZhc3QgaC8zICovCisJCQlmb3IgKGkgPSBoOyBpIDw9IDI1NTsgaSsrKSB7CisJCQkJdnYgPSBydW5uaW5nT3JkZXJbaV07CisJCQkJaiA9IGk7CisJCQkJd2hpbGUgKEJJR0ZSRVEocnVubmluZ09yZGVyW2otaF0pID4gQklHRlJFUSh2dikpIHsKKwkJCQkJcnVubmluZ09yZGVyW2pdID0gcnVubmluZ09yZGVyW2otaF07CisJCQkJCWogPSBqIC0gaDsKKwkJCQkJaWYgKGogPD0gKGggLSAxKSkKKwkJCQkJCWdvdG8gemVybzsKKwkJCQl9CisgemVybzoKKwkJCQlydW5uaW5nT3JkZXJbal0gPSB2djsKKwkJCX0KKwkJfSB3aGlsZSAoaCAhPSAxKTsKKwl9CisKKwkvKgorCSAqIFRoZSBtYWluIHNvcnRpbmcgbG9vcC4KKwkgKi8KKworCW51bVFTb3J0ZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8PSAyNTU7IGkrKykgeworCisJCS8qCisJCSAqIFByb2Nlc3MgYmlnIGJ1Y2tldHMsIHN0YXJ0aW5nIHdpdGggdGhlIGxlYXN0IGZ1bGwuCisJCSAqIEJhc2ljYWxseSB0aGlzIGlzIGEgMy1zdGVwIHByb2Nlc3MgaW4gd2hpY2ggd2UgY2FsbAorCQkgKiBtYWluUVNvcnQzIHRvIHNvcnQgdGhlIHNtYWxsIGJ1Y2tldHMgW3NzLCBqXSwgYnV0CisJCSAqIGFsc28gbWFrZSBhIGJpZyBlZmZvcnQgdG8gYXZvaWQgdGhlIGNhbGxzIGlmIHdlIGNhbi4KKwkJICovCisJCXNzID0gcnVubmluZ09yZGVyW2ldOworCisJCS8qCisJCSAqIFN0ZXAgMToKKwkJICogQ29tcGxldGUgdGhlIGJpZyBidWNrZXQgW3NzXSBieSBxdWlja3NvcnRpbmcKKwkJICogYW55IHVuc29ydGVkIHNtYWxsIGJ1Y2tldHMgW3NzLCBqXSwgZm9yIGogIT0gc3MuCisJCSAqIEhvcGVmdWxseSBwcmV2aW91cyBwb2ludGVyLXNjYW5uaW5nIHBoYXNlcyBoYXZlIGFscmVhZHkKKwkJICogY29tcGxldGVkIG1hbnkgb2YgdGhlIHNtYWxsIGJ1Y2tldHMgW3NzLCBqXSwgc28KKwkJICogd2UgZG9uJ3QgaGF2ZSB0byBzb3J0IHRoZW0gYXQgYWxsLgorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgeworCQkJaWYgKGogIT0gc3MpIHsKKwkJCQlzYiA9IChzcyA8PCA4KSArIGo7CisJCQkJaWYgKCEoZnRhYltzYl0gJiBTRVRNQVNLKSkgeworCQkJCQlpbnQzMl90IGxvID0gIGZ0YWJbc2JdICAgJiBDTEVBUk1BU0s7CisJCQkJCWludDMyX3QgaGkgPSAoZnRhYltzYisxXSAmIENMRUFSTUFTSykgLSAxOworCQkJCQlpZiAoaGkgPiBsbykgeworCQkJCQkJbWFpblFTb3J0MygKKwkJCQkJCQlwdHIsIGJsb2NrLCBxdWFkcmFudCwgbmJsb2NrLAorCQkJCQkJCWxvLCBoaSwgQlpfTl9SQURJWCwgYnVkZ2V0CisJCQkJCQkpOworCQkJCQkJaWYgKCpidWRnZXQgPCAwKSByZXR1cm47CisJCQkJCQludW1RU29ydGVkICs9IChoaSAtIGxvICsgMSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZnRhYltzYl0gfD0gU0VUTUFTSzsKKwkJCX0KKwkJfQorCisJCUFzc2VydEgoIWJpZ0RvbmVbc3NdLCAxMDA2KTsKKworCQkvKgorCQkgKiBTdGVwIDI6CisJCSAqIE5vdyBzY2FuIHRoaXMgYmlnIGJ1Y2tldCBbc3NdIHNvIGFzIHRvIHN5bnRoZXNpc2UgdGhlCisJCSAqIHNvcnRlZCBvcmRlciBmb3Igc21hbGwgYnVja2V0cyBbdCwgc3NdIGZvciBhbGwgdCwKKwkJICogaW5jbHVkaW5nLCBtYWdpY2FsbHksIHRoZSBidWNrZXQgW3NzLHNzXSB0b28uCisJCSAqIFRoaXMgd2lsbCBhdm9pZCBkb2luZyBSZWFsIFdvcmsgaW4gc3Vic2VxdWVudCBTdGVwIDEncy4KKwkJICovCisJCXsKKwkJCWZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIHsKKwkJCQljb3B5U3RhcnRbal0gPSAgZnRhYlsoaiA8PCA4KSArIHNzXSAgICAgJiBDTEVBUk1BU0s7CisJCQkJY29weUVuZCAgW2pdID0gKGZ0YWJbKGogPDwgOCkgKyBzcyArIDFdICYgQ0xFQVJNQVNLKSAtIDE7CisJCQl9CisJCQlmb3IgKGogPSBmdGFiW3NzIDw8IDhdICYgQ0xFQVJNQVNLOyBqIDwgY29weVN0YXJ0W3NzXTsgaisrKSB7CisJCQkJayA9IHB0cltqXSAtIDE7CisJCQkJaWYgKGsgPCAwKQorCQkJCQlrICs9IG5ibG9jazsKKwkJCQljMSA9IGJsb2NrW2tdOworCQkJCWlmICghYmlnRG9uZVtjMV0pCisJCQkJCXB0cltjb3B5U3RhcnRbYzFdKytdID0gazsKKwkJCX0KKwkJCWZvciAoaiA9IChmdGFiWyhzcysxKSA8PCA4XSAmIENMRUFSTUFTSykgLSAxOyBqID4gY29weUVuZFtzc107IGotLSkgeworCQkJCWsgPSBwdHJbal0tMTsKKwkJCQlpZiAoayA8IDApCisJCQkJCWsgKz0gbmJsb2NrOworCQkJCWMxID0gYmxvY2tba107CisJCQkJaWYgKCFiaWdEb25lW2MxXSkKKwkJCQkJcHRyW2NvcHlFbmRbYzFdLS1dID0gazsKKwkJCX0KKwkJfQorCisJCS8qIEV4dHJlbWVseSByYXJlIGNhc2UgbWlzc2luZyBpbiBiemlwMi0xLjAuMCBhbmQgMS4wLjEuCisJCSAqIE5lY2Vzc2l0eSBmb3IgdGhpcyBjYXNlIGlzIGRlbW9uc3RyYXRlZCBieSBjb21wcmVzc2luZworCQkgKiBhIHNlcXVlbmNlIG9mIGFwcHJveGltYXRlbHkgNDguNSBtaWxsaW9uIG9mIGNoYXJhY3RlcgorCQkgKiAyNTE7IDEuMC4wLzEuMC4xIHdpbGwgdGhlbiBkaWUgaGVyZS4gKi8KKwkJQXNzZXJ0SCgoY29weVN0YXJ0W3NzXS0xID09IGNvcHlFbmRbc3NdKSBcCisJCSAgICAgfHwgKGNvcHlTdGFydFtzc10gPT0gMCAmJiBjb3B5RW5kW3NzXSA9PSBuYmxvY2stMSksIDEwMDcpOworCisJCWZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspCisJCQlmdGFiWyhqIDw8IDgpICsgc3NdIHw9IFNFVE1BU0s7CisKKwkJLyoKKwkJICogU3RlcCAzOgorCQkgKiBUaGUgW3NzXSBiaWcgYnVja2V0IGlzIG5vdyBkb25lLiAgUmVjb3JkIHRoaXMgZmFjdCwKKwkJICogYW5kIHVwZGF0ZSB0aGUgcXVhZHJhbnQgZGVzY3JpcHRvcnMuICBSZW1lbWJlciB0bworCQkgKiB1cGRhdGUgcXVhZHJhbnRzIGluIHRoZSBvdmVyc2hvb3QgYXJlYSB0b28sIGlmCisJCSAqIG5lY2Vzc2FyeS4gIFRoZSAiaWYgKGkgPCAyNTUpIiB0ZXN0IG1lcmVseSBza2lwcworCQkgKiB0aGlzIHVwZGF0aW5nIGZvciB0aGUgbGFzdCBidWNrZXQgcHJvY2Vzc2VkLCBzaW5jZQorCQkgKiB1cGRhdGluZyBmb3IgdGhlIGxhc3QgYnVja2V0IGlzIHBvaW50bGVzcy4KKwkJICoKKwkJICogVGhlIHF1YWRyYW50IGFycmF5IHByb3ZpZGVzIGEgd2F5IHRvIGluY3JlbWVudGFsbHkKKwkJICogY2FjaGUgc29ydCBvcmRlcmluZ3MsIGFzIHRoZXkgYXBwZWFyLCBzbyBhcyB0bworCQkgKiBtYWtlIHN1YnNlcXVlbnQgY29tcGFyaXNvbnMgaW4gZnVsbEd0VSgpIGNvbXBsZXRlCisJCSAqIGZhc3Rlci4gIEZvciByZXBldGl0aXZlIGJsb2NrcyB0aGlzIG1ha2VzIGEgYmlnCisJCSAqIGRpZmZlcmVuY2UgKGJ1dCBub3QgYmlnIGVub3VnaCB0byBiZSBhYmxlIHRvIGF2b2lkCisJCSAqIHRoZSBmYWxsYmFjayBzb3J0aW5nIG1lY2hhbmlzbSwgZXhwb25lbnRpYWwgcmFkaXggc29ydCkuCisJCSAqCisJCSAqIFRoZSBwcmVjaXNlIG1lYW5pbmcgaXM6IGF0IGFsbCB0aW1lczoKKwkJICoKKwkJICoJZm9yIDAgPD0gaSA8IG5ibG9jayBhbmQgMCA8PSBqIDw9IG5ibG9jaworCQkgKgorCQkgKglpZiBibG9ja1tpXSAhPSBibG9ja1tqXSwKKwkJICoKKwkJICoJCXRoZW4gdGhlIHJlbGF0aXZlIHZhbHVlcyBvZiBxdWFkcmFudFtpXSBhbmQKKwkJICoJCQkgIHF1YWRyYW50W2pdIGFyZSBtZWFuaW5nbGVzcy4KKwkJICoKKwkJICoJCWVsc2UgeworCQkgKgkJCWlmIHF1YWRyYW50W2ldIDwgcXVhZHJhbnRbal0KKwkJICoJCQkJdGhlbiB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IGkgbGV4aWNvZ3JhcGhpY2FsbHkKKwkJICoJCQkJcHJlY2VkZXMgdGhlIHN0cmluZyBzdGFydGluZyBhdCBqCisJCSAqCisJCSAqCQkJZWxzZSBpZiBxdWFkcmFudFtpXSA+IHF1YWRyYW50W2pdCisJCSAqCQkJCXRoZW4gdGhlIHN0cmluZyBzdGFydGluZyBhdCBqIGxleGljb2dyYXBoaWNhbGx5CisJCSAqCQkJCXByZWNlZGVzIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgaQorCQkgKgorCQkgKgkJCWVsc2UKKwkJICoJCQkJdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHRoZSBzdHJpbmdzIHN0YXJ0aW5nCisJCSAqCQkJCWF0IGkgYW5kIGogaGFzIG5vdCB5ZXQgYmVlbiBkZXRlcm1pbmVkLgorCQkgKgkJfQorCQkgKi8KKwkJYmlnRG9uZVtzc10gPSBUcnVlOworCisJCWlmIChpIDwgMjU1KSB7CisJCQlpbnQzMl90IGJiU3RhcnQgPSBmdGFiW3NzIDw8IDhdICYgQ0xFQVJNQVNLOworCQkJaW50MzJfdCBiYlNpemUgID0gKGZ0YWJbKHNzKzEpIDw8IDhdICYgQ0xFQVJNQVNLKSAtIGJiU3RhcnQ7CisJCQlpbnQzMl90IHNoaWZ0cyAgPSAwOworCisJCQl3aGlsZSAoKGJiU2l6ZSA+PiBzaGlmdHMpID4gNjU1MzQpIHNoaWZ0cysrOworCisJCQlmb3IgKGogPSBiYlNpemUtMTsgaiA+PSAwOyBqLS0pIHsKKwkJCQlpbnQzMl90IGEydXBkYXRlICAgPSBwdHJbYmJTdGFydCArIGpdOworCQkJCXVpbnQxNl90IHFWYWwgICAgICA9ICh1aW50MTZfdCkoaiA+PiBzaGlmdHMpOworCQkJCXF1YWRyYW50W2EydXBkYXRlXSA9IHFWYWw7CisJCQkJaWYgKGEydXBkYXRlIDwgQlpfTl9PVkVSU0hPT1QpCisJCQkJCXF1YWRyYW50W2EydXBkYXRlICsgbmJsb2NrXSA9IHFWYWw7CisJCQl9CisJCQlBc3NlcnRIKCgoYmJTaXplLTEpID4+IHNoaWZ0cykgPD0gNjU1MzUsIDEwMDIpOworCQl9CisJfQorI3VuZGVmIHJ1bm5pbmdPcmRlcgorI3VuZGVmIGNvcHlTdGFydAorI3VuZGVmIGNvcHlFbmQKK30KKworI3VuZGVmIEJJR0ZSRVEKKyN1bmRlZiBTRVRNQVNLCisjdW5kZWYgQ0xFQVJNQVNLCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJlOgorICoJbmJsb2NrID4gMAorICoJYXJyMiBleGlzdHMgZm9yIFswIC4uIG5ibG9jay0xICtOX09WRVJTSE9PVF0KKyAqCSAgKCh1aW50OF90KilhcnIyKVswIC4uIG5ibG9jay0xXSBob2xkcyBibG9jaworICoJYXJyMSBleGlzdHMgZm9yIFswIC4uIG5ibG9jay0xXQorICoKKyAqIFBvc3Q6CisgKgkoKHVpbnQ4X3QqKWFycjIpIFswIC4uIG5ibG9jay0xXSBob2xkcyBibG9jaworICoJQWxsIG90aGVyIGFyZWFzIG9mIGJsb2NrIGRlc3Ryb3llZAorICoJZnRhYlswIC4uIDY1NTM2XSBkZXN0cm95ZWQKKyAqCWFycjFbMCAuLiBuYmxvY2stMV0gaG9sZHMgc29ydGVkIG9yZGVyCisgKi8KK3N0YXRpYyBOT0lOTElORQordm9pZCBCWjJfYmxvY2tTb3J0KEVTdGF0ZSogcykKK3sKKwkvKiBJbiBvcmlnaW5hbCBiemlwMiAxLjAuNCwgaXQncyBhIHBhcmFtZXRlciwgYnV0IDMwCisJICogKHdoaWNoIHdhcyB0aGUgZGVmYXVsdCkgc2hvdWxkIHdvcmsgb2suICovCisJZW51bSB7IHdmYWN0ID0gMzAgfTsKKworCXVpbnQzMl90KiBwdHIgICAgPSBzLT5wdHI7CisJdWludDhfdCogIGJsb2NrICA9IHMtPmJsb2NrOworCXVpbnQzMl90KiBmdGFiICAgPSBzLT5mdGFiOworCWludDMyX3QgICBuYmxvY2sgPSBzLT5uYmxvY2s7CisJdWludDE2X3QqIHF1YWRyYW50OworCWludDMyX3QgICBidWRnZXQ7CisJaW50MzJfdCAgIGk7CisKKwlpZiAobmJsb2NrIDwgMTAwMDApIHsKKwkJZmFsbGJhY2tTb3J0KHMtPmFycjEsIHMtPmFycjIsIGZ0YWIsIG5ibG9jayk7CisJfSBlbHNlIHsKKwkJLyogQ2FsY3VsYXRlIHRoZSBsb2NhdGlvbiBmb3IgcXVhZHJhbnQsIHJlbWVtYmVyaW5nIHRvIGdldAorCQkgKiB0aGUgYWxpZ25tZW50IHJpZ2h0LiAgQXNzdW1lcyB0aGF0ICYoYmxvY2tbMF0pIGlzIGF0IGxlYXN0CisJCSAqIDItYnl0ZSBhbGlnbmVkIC0tIHRoaXMgc2hvdWxkIGJlIG9rIHNpbmNlIGJsb2NrIGlzIHJlYWxseQorCQkgKiB0aGUgZmlyc3Qgc2VjdGlvbiBvZiBhcnIyLgorCQkgKi8KKwkJaSA9IG5ibG9jayArIEJaX05fT1ZFUlNIT09UOworCQlpZiAoaSAmIDEpIGkrKzsKKwkJcXVhZHJhbnQgPSAodWludDE2X3QqKSgmKGJsb2NrW2ldKSk7CisKKwkJLyogKHdmYWN0LTEpIC8gMyBwdXRzIHRoZSBkZWZhdWx0LWZhY3Rvci0zMAorCQkgKiB0cmFuc2l0aW9uIHBvaW50IGF0IHZlcnkgcm91Z2hseSB0aGUgc2FtZSBwbGFjZSBhcworCQkgKiB3aXRoIHYwLjEgYW5kIHYwLjkuMC4KKwkJICogTm90IHRoYXQgaXQgcGFydGljdWxhcmx5IG1hdHRlcnMgYW55IG1vcmUsIHNpbmNlIHRoZQorCQkgKiByZXN1bHRpbmcgY29tcHJlc3NlZCBzdHJlYW0gaXMgbm93IHRoZSBzYW1lIHJlZ2FyZGxlc3MKKwkJICogb2Ygd2hldGhlciBvciBub3Qgd2UgdXNlIHRoZSBtYWluIHNvcnQgb3IgZmFsbGJhY2sgc29ydC4KKwkJICovCisJCWJ1ZGdldCA9IG5ibG9jayAqICgod2ZhY3QtMSkgLyAzKTsKKworCQltYWluU29ydChzLCBwdHIsIGJsb2NrLCBxdWFkcmFudCwgZnRhYiwgbmJsb2NrLCAmYnVkZ2V0KTsKKwkJaWYgKGJ1ZGdldCA8IDApIHsKKwkJCWZhbGxiYWNrU29ydChzLT5hcnIxLCBzLT5hcnIyLCBmdGFiLCBuYmxvY2spOworCQl9CisJfQorCisJcy0+b3JpZ1B0ciA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBzLT5uYmxvY2s7IGkrKykKKwkJaWYgKHB0cltpXSA9PSAwKSB7CisJCQlzLT5vcmlnUHRyID0gaTsKKwkJCWJyZWFrOworCQl9OworCisJQXNzZXJ0SChzLT5vcmlnUHRyICE9IC0xLCAxMDAzKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzb3J0LmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3ZGI3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWIuYwpAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gTGlicmFyeSB0b3AtbGV2ZWwgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYi5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENIQU5HRVMKKyAqIDAuOS4wICAgIC0tIG9yaWdpbmFsIHZlcnNpb24uCisgKiAwLjkuMGEvYiAtLSBubyBjaGFuZ2VzIGluIHRoaXMgZmlsZS4KKyAqIDAuOS4wYyAgIC0tIG1hZGUgemVyby1sZW5ndGggQlpfRkxVU0ggd29yayBjb3JyZWN0bHkgaW4gYnpDb21wcmVzcygpLgorICogICAgICAgICAgICAgZml4ZWQgYnpXcml0ZS9ielJlYWQgdG8gaWdub3JlIHplcm8tbGVuZ3RoIHJlcXVlc3RzLgorICogICAgICAgICAgICAgZml4ZWQgYnpyZWFkIHRvIGNvcnJlY3RseSBoYW5kbGUgcmVhZCByZXF1ZXN0cyBhZnRlciBFT0YuCisgKiAgICAgICAgICAgICB3cm9uZyBwYXJhbWV0ZXIgb3JkZXIgaW4gY2FsbCB0byBiekRlY29tcHJlc3NJbml0IGluCisgKiAgICAgICAgICAgICBiekJ1ZmZUb0J1ZmZEZWNvbXByZXNzLiAgRml4ZWQuCisgKi8KKworLyogI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gQ29tcHJlc3Npb24gc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgQlpfTElHSFRfREVCVUcKK3N0YXRpYwordm9pZCBiel9hc3NlcnRfZmFpbChpbnQgZXJyY29kZSkKK3sKKwkvKiBpZiAoZXJyY29kZSA9PSAxMDA3KSBiYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvYmFibHkgYmFkIFJBTSIpOyAqLworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciAlZCIsIGVycmNvZGUpOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBwcmVwYXJlX25ld19ibG9jayhFU3RhdGUqIHMpCit7CisJaW50IGk7CisJcy0+bmJsb2NrID0gMDsKKwlzLT5udW1aID0gMDsKKwlzLT5zdGF0ZV9vdXRfcG9zID0gMDsKKwlCWl9JTklUSUFMSVNFX0NSQyhzLT5ibG9ja0NSQyk7CisJLyogaW5saW5lZCBtZW1zZXQgd291bGQgYmUgbmljZSB0byBoYXZlIGhlcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXMtPmluVXNlW2ldID0gMDsKKwlzLT5ibG9ja05vKys7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitBTFdBWVNfSU5MSU5FCit2b2lkIGluaXRfUkwoRVN0YXRlKiBzKQoreworCXMtPnN0YXRlX2luX2NoID0gMjU2OworCXMtPnN0YXRlX2luX2xlbiA9IDA7Cit9CisKKworc3RhdGljCitpbnQgaXNlbXB0eV9STChFU3RhdGUqIHMpCit7CisJcmV0dXJuIChzLT5zdGF0ZV9pbl9jaCA+PSAyNTYgfHwgcy0+c3RhdGVfaW5fbGVuIDw9IDApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBCWjJfYnpDb21wcmVzc0luaXQoYnpfc3RyZWFtICpzdHJtLCBpbnQgYmxvY2tTaXplMTAwaykKK3sKKwlpbnQzMl90IG47CisJRVN0YXRlKiBzOworCisJcyA9IHh6YWxsb2Moc2l6ZW9mKEVTdGF0ZSkpOworCXMtPnN0cm0gPSBzdHJtOworCisJbiAgICAgICAgPSAxMDAwMDAgKiBibG9ja1NpemUxMDBrOworCXMtPmFycjEgID0geG1hbGxvYyhuICAgICAgICAgICAgICAgICAgICAqIHNpemVvZih1aW50MzJfdCkpOworCXMtPm10ZnYgID0gKHVpbnQxNl90KilzLT5hcnIxOworCXMtPnB0ciAgID0gKHVpbnQzMl90KilzLT5hcnIxOworCXMtPmFycjIgID0geG1hbGxvYygobiArIEJaX05fT1ZFUlNIT09UKSAqIHNpemVvZih1aW50MzJfdCkpOworCXMtPmJsb2NrID0gKHVpbnQ4X3QqKXMtPmFycjI7CisJcy0+ZnRhYiAgPSB4bWFsbG9jKDY1NTM3ICAgICAgICAgICAgICAgICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlzLT5jcmMzMnRhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIDEpOworCisJcy0+c3RhdGUgICAgICAgICAgICAgPSBCWl9TX0lOUFVUOworCXMtPm1vZGUgICAgICAgICAgICAgID0gQlpfTV9SVU5OSU5HOworCXMtPmJsb2NrU2l6ZTEwMGsgICAgID0gYmxvY2tTaXplMTAwazsKKwlzLT5uYmxvY2tNQVggICAgICAgICA9IG4gLSAxOTsKKworCXN0cm0tPnN0YXRlICAgICAgICAgID0gczsKKwkvKnN0cm0tPnRvdGFsX2luICAgICA9IDA7Ki8KKwlzdHJtLT50b3RhbF9vdXQgICAgICA9IDA7CisJaW5pdF9STChzKTsKKwlwcmVwYXJlX25ld19ibG9jayhzKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgYWRkX3BhaXJfdG9fYmxvY2soRVN0YXRlKiBzKQoreworCWludDMyX3QgaTsKKwl1aW50OF90IGNoID0gKHVpbnQ4X3QpKHMtPnN0YXRlX2luX2NoKTsKKwlmb3IgKGkgPSAwOyBpIDwgcy0+c3RhdGVfaW5fbGVuOyBpKyspIHsKKwkJQlpfVVBEQVRFX0NSQyhzLCBzLT5ibG9ja0NSQywgY2gpOworCX0KKwlzLT5pblVzZVtzLT5zdGF0ZV9pbl9jaF0gPSAxOworCXN3aXRjaCAocy0+c3RhdGVfaW5fbGVuKSB7CisJCWNhc2UgMzoKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAyOgorCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzLT5pblVzZVtzLT5zdGF0ZV9pbl9sZW4gLSA0XSA9IDE7CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KShzLT5zdGF0ZV9pbl9sZW4gLSA0KTsKKwkJCXMtPm5ibG9jaysrOworCQkJYnJlYWs7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBmbHVzaF9STChFU3RhdGUqIHMpCit7CisJaWYgKHMtPnN0YXRlX2luX2NoIDwgMjU2KSBhZGRfcGFpcl90b19ibG9jayhzKTsKKwlpbml0X1JMKHMpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQUREX0NIQVJfVE9fQkxPQ0soenMsIHpjaGgwKSBcCit7IFwKKwl1aW50MzJfdCB6Y2hoID0gKHVpbnQzMl90KSh6Y2hoMCk7IFwKKwkvKi0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tKi8gXAorCWlmICh6Y2hoICE9IHpzLT5zdGF0ZV9pbl9jaCAmJiB6cy0+c3RhdGVfaW5fbGVuID09IDEpIHsgXAorCQl1aW50OF90IGNoID0gKHVpbnQ4X3QpKHpzLT5zdGF0ZV9pbl9jaCk7IFwKKwkJQlpfVVBEQVRFX0NSQyh6cywgenMtPmJsb2NrQ1JDLCBjaCk7IFwKKwkJenMtPmluVXNlW3pzLT5zdGF0ZV9pbl9jaF0gPSAxOyBcCisJCXpzLT5ibG9ja1t6cy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBcCisJCXpzLT5uYmxvY2srKzsgXAorCQl6cy0+c3RhdGVfaW5fY2ggPSB6Y2hoOyBcCisJfSBcCisJZWxzZSBcCisJLyotLSBnZW5lcmFsLCB1bmNvbW1vbiBjYXNlcyAtLSovIFwKKwlpZiAoemNoaCAhPSB6cy0+c3RhdGVfaW5fY2ggfHwgenMtPnN0YXRlX2luX2xlbiA9PSAyNTUpIHsgXAorCQlpZiAoenMtPnN0YXRlX2luX2NoIDwgMjU2KSBcCisJCQlhZGRfcGFpcl90b19ibG9jayh6cyk7IFwKKwkJenMtPnN0YXRlX2luX2NoID0gemNoaDsgXAorCQl6cy0+c3RhdGVfaW5fbGVuID0gMTsgXAorCX0gZWxzZSB7IFwKKwkJenMtPnN0YXRlX2luX2xlbisrOyBcCisJfSBcCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIC8qQm9vbCovIGNvcHlfaW5wdXRfdW50aWxfc3RvcChFU3RhdGUqIHMpCit7CisJLypCb29sIHByb2dyZXNzX2luID0gRmFsc2U7Ki8KKworI2lmZGVmIFNBTUVfQ09ERV9BU19CRUxPVworCWlmIChzLT5tb2RlID09IEJaX01fUlVOTklORykgeworCQkvKi0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tKi8KKwkJd2hpbGUgKDEpIHsKKwkJCS8qLS0gbm8gaW5wdXQ/IC0tKi8KKwkJCWlmIChzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSBicmVhazsKKwkJCS8qLS0gYmxvY2sgZnVsbD8gLS0qLworCQkJaWYgKHMtPm5ibG9jayA+PSBzLT5uYmxvY2tNQVgpIGJyZWFrOworCQkJLypwcm9ncmVzc19pbiA9IFRydWU7Ki8KKwkJCUFERF9DSEFSX1RPX0JMT0NLKHMsICh1aW50MzJfdCkoKih1aW50OF90Kikocy0+c3RybS0+bmV4dF9pbikpKTsKKwkJCXMtPnN0cm0tPm5leHRfaW4rKzsKKwkJCXMtPnN0cm0tPmF2YWlsX2luLS07CisJCQkvKnMtPnN0cm0tPnRvdGFsX2luKys7Ki8KKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQkvKi0tIGdlbmVyYWwsIHVuY29tbW9uIGNhc2UgLS0qLworCQl3aGlsZSAoMSkgeworCQkJLyotLSBubyBpbnB1dD8gLS0qLworCQkJaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIGJyZWFrOworCQkJLyotLSBibG9jayBmdWxsPyAtLSovCisJCQlpZiAocy0+bmJsb2NrID49IHMtPm5ibG9ja01BWCkgYnJlYWs7CisJCS8vIwkvKi0tIGZsdXNoL2ZpbmlzaCBlbmQ/IC0tKi8KKwkJLy8jCWlmIChzLT5hdmFpbF9pbl9leHBlY3QgPT0gMCkgYnJlYWs7CisJCQkvKnByb2dyZXNzX2luID0gVHJ1ZTsqLworCQkJQUREX0NIQVJfVE9fQkxPQ0socywgKih1aW50OF90Kikocy0+c3RybS0+bmV4dF9pbikpOworCQkJcy0+c3RybS0+bmV4dF9pbisrOworCQkJcy0+c3RybS0+YXZhaWxfaW4tLTsKKwkJCS8qcy0+c3RybS0+dG90YWxfaW4rKzsqLworCQkvLyMJcy0+YXZhaWxfaW5fZXhwZWN0LS07CisJCX0KKwl9CisJLypyZXR1cm4gcHJvZ3Jlc3NfaW47Ki8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgLypCb29sKi8gY29weV9vdXRwdXRfdW50aWxfc3RvcChFU3RhdGUqIHMpCit7CisJLypCb29sIHByb2dyZXNzX291dCA9IEZhbHNlOyovCisKKwl3aGlsZSAoMSkgeworCQkvKi0tIG5vIG91dHB1dCBzcGFjZT8gLS0qLworCQlpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIGJyZWFrOworCisJCS8qLS0gYmxvY2sgZG9uZT8gLS0qLworCQlpZiAocy0+c3RhdGVfb3V0X3BvcyA+PSBzLT5udW1aKSBicmVhazsKKworCQkvKnByb2dyZXNzX291dCA9IFRydWU7Ki8KKwkJKihzLT5zdHJtLT5uZXh0X291dCkgPSBzLT56Yml0c1tzLT5zdGF0ZV9vdXRfcG9zXTsKKwkJcy0+c3RhdGVfb3V0X3BvcysrOworCQlzLT5zdHJtLT5hdmFpbF9vdXQtLTsKKwkJcy0+c3RybS0+bmV4dF9vdXQrKzsKKwkJcy0+c3RybS0+dG90YWxfb3V0Kys7CisJfQorCS8qcmV0dXJuIHByb2dyZXNzX291dDsqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCAvKkJvb2wqLyBoYW5kbGVfY29tcHJlc3MoYnpfc3RyZWFtICpzdHJtKQoreworCS8qQm9vbCBwcm9ncmVzc19pbiAgPSBGYWxzZTsqLworCS8qQm9vbCBwcm9ncmVzc19vdXQgPSBGYWxzZTsqLworCUVTdGF0ZSogcyA9IHN0cm0tPnN0YXRlOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHMtPnN0YXRlID09IEJaX1NfT1VUUFVUKSB7CisJCQkvKnByb2dyZXNzX291dCB8PSovIGNvcHlfb3V0cHV0X3VudGlsX3N0b3Aocyk7CisJCQlpZiAocy0+c3RhdGVfb3V0X3BvcyA8IHMtPm51bVopIGJyZWFrOworCQkJaWYgKHMtPm1vZGUgPT0gQlpfTV9GSU5JU0hJTkcKKwkJCS8vIyAmJiBzLT5hdmFpbF9pbl9leHBlY3QgPT0gMAorCQkJICYmIHMtPnN0cm0tPmF2YWlsX2luID09IDAKKwkJCSAmJiBpc2VtcHR5X1JMKHMpKQorCQkJCWJyZWFrOworCQkJcHJlcGFyZV9uZXdfYmxvY2socyk7CisJCQlzLT5zdGF0ZSA9IEJaX1NfSU5QVVQ7CisjaWZkZWYgRkxVU0hfSVNfVU5VU0VECisJCQlpZiAocy0+bW9kZSA9PSBCWl9NX0ZMVVNISU5HCisJCQkgJiYgcy0+YXZhaWxfaW5fZXhwZWN0ID09IDAKKwkJCSAmJiBpc2VtcHR5X1JMKHMpKQorCQkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQlpZiAocy0+c3RhdGUgPT0gQlpfU19JTlBVVCkgeworCQkJLypwcm9ncmVzc19pbiB8PSovIGNvcHlfaW5wdXRfdW50aWxfc3RvcChzKTsKKwkJCS8vI2lmIChzLT5tb2RlICE9IEJaX01fUlVOTklORyAmJiBzLT5hdmFpbF9pbl9leHBlY3QgPT0gMCkgeworCQkJaWYgKHMtPm1vZGUgIT0gQlpfTV9SVU5OSU5HICYmIHMtPnN0cm0tPmF2YWlsX2luID09IDApIHsKKwkJCQlmbHVzaF9STChzKTsKKwkJCQlCWjJfY29tcHJlc3NCbG9jayhzLCAocy0+bW9kZSA9PSBCWl9NX0ZJTklTSElORykpOworCQkJCXMtPnN0YXRlID0gQlpfU19PVVRQVVQ7CisJCQl9IGVsc2UKKwkJCWlmIChzLT5uYmxvY2sgPj0gcy0+bmJsb2NrTUFYKSB7CisJCQkJQloyX2NvbXByZXNzQmxvY2socywgMCk7CisJCQkJcy0+c3RhdGUgPSBCWl9TX09VVFBVVDsKKwkJCX0gZWxzZQorCQkJaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qcmV0dXJuIHByb2dyZXNzX2luIHx8IHByb2dyZXNzX291dDsqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworaW50IEJaMl9iekNvbXByZXNzKGJ6X3N0cmVhbSAqc3RybSwgaW50IGFjdGlvbikKK3sKKwkvKkJvb2wgcHJvZ3Jlc3M7Ki8KKwlFU3RhdGUqIHM7CisKKwlzID0gc3RybS0+c3RhdGU7CisKKwlzd2l0Y2ggKHMtPm1vZGUpIHsKKwkJY2FzZSBCWl9NX1JVTk5JTkc6CisJCQlpZiAoYWN0aW9uID09IEJaX1JVTikgeworCQkJCS8qcHJvZ3Jlc3MgPSovIGhhbmRsZV9jb21wcmVzcyhzdHJtKTsKKwkJCQkvKnJldHVybiBwcm9ncmVzcyA/IEJaX1JVTl9PSyA6IEJaX1BBUkFNX0VSUk9SOyovCisJCQkJcmV0dXJuIEJaX1JVTl9PSzsKKwkJCX0KKyNpZmRlZiBGTFVTSF9JU19VTlVTRUQKKwkJCWVsc2UKKwkJCWlmIChhY3Rpb24gPT0gQlpfRkxVU0gpIHsKKwkJCQkvLyNzLT5hdmFpbF9pbl9leHBlY3QgPSBzdHJtLT5hdmFpbF9pbjsKKwkJCQlzLT5tb2RlID0gQlpfTV9GTFVTSElORzsKKwkJCQlnb3RvIGNhc2VfQlpfTV9GTFVTSElORzsKKwkJCX0KKyNlbmRpZgorCQkJZWxzZQorCQkJLyppZiAoYWN0aW9uID09IEJaX0ZJTklTSCkqLyB7CisJCQkJLy8jcy0+YXZhaWxfaW5fZXhwZWN0ID0gc3RybS0+YXZhaWxfaW47CisJCQkJcy0+bW9kZSA9IEJaX01fRklOSVNISU5HOworCQkJCWdvdG8gY2FzZV9CWl9NX0ZJTklTSElORzsKKwkJCX0KKworI2lmZGVmIEZMVVNIX0lTX1VOVVNFRAorIGNhc2VfQlpfTV9GTFVTSElORzoKKwkJY2FzZSBCWl9NX0ZMVVNISU5HOgorCQkJLyppZiAocy0+YXZhaWxfaW5fZXhwZWN0ICE9IHMtPnN0cm0tPmF2YWlsX2luKQorCQkJCXJldHVybiBCWl9TRVFVRU5DRV9FUlJPUjsqLworCQkJLypwcm9ncmVzcyA9Ki8gaGFuZGxlX2NvbXByZXNzKHN0cm0pOworCQkJaWYgKHMtPmF2YWlsX2luX2V4cGVjdCA+IDAgfHwgIWlzZW1wdHlfUkwocykgfHwgcy0+c3RhdGVfb3V0X3BvcyA8IHMtPm51bVopCisJCQkJcmV0dXJuIEJaX0ZMVVNIX09LOworCQkJcy0+bW9kZSA9IEJaX01fUlVOTklORzsKKwkJCXJldHVybiBCWl9SVU5fT0s7CisjZW5kaWYKKworIGNhc2VfQlpfTV9GSU5JU0hJTkc6CisJCS8qY2FzZSBCWl9NX0ZJTklTSElORzoqLworCQlkZWZhdWx0OgorCQkJLyppZiAocy0+YXZhaWxfaW5fZXhwZWN0ICE9IHMtPnN0cm0tPmF2YWlsX2luKQorCQkJCXJldHVybiBCWl9TRVFVRU5DRV9FUlJPUjsqLworCQkJLypwcm9ncmVzcyA9Ki8gaGFuZGxlX2NvbXByZXNzKHN0cm0pOworCQkJLyppZiAoIXByb2dyZXNzKSByZXR1cm4gQlpfU0VRVUVOQ0VfRVJST1I7Ki8KKwkJCS8vI2lmIChzLT5hdmFpbF9pbl9leHBlY3QgPiAwIHx8ICFpc2VtcHR5X1JMKHMpIHx8IHMtPnN0YXRlX291dF9wb3MgPCBzLT5udW1aKQorCQkJLy8jCXJldHVybiBCWl9GSU5JU0hfT0s7CisJCQlpZiAocy0+c3RybS0+YXZhaWxfaW4gPiAwIHx8ICFpc2VtcHR5X1JMKHMpIHx8IHMtPnN0YXRlX291dF9wb3MgPCBzLT5udW1aKQorCQkJCXJldHVybiBCWl9GSU5JU0hfT0s7CisJCQkvKnMtPm1vZGUgPSBCWl9NX0lETEU7Ki8KKwkJCXJldHVybiBCWl9TVFJFQU1fRU5EOworCX0KKwkvKiByZXR1cm4gQlpfT0s7IC0tbm90IHJlYWNoZWQtLSovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIEJaMl9iekNvbXByZXNzRW5kKGJ6X3N0cmVhbSAqc3RybSkKK3sKKwlFU3RhdGUqIHM7CisKKwlzID0gc3RybS0+c3RhdGU7CisJZnJlZShzLT5hcnIxKTsKKwlmcmVlKHMtPmFycjIpOworCWZyZWUocy0+ZnRhYik7CisJZnJlZShzLT5jcmMzMnRhYmxlKTsKKwlmcmVlKHMpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIE1pc2MgY29udmVuaWVuY2Ugc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEVYQU1QTEVfQ09ERV9GT1JfTUVNX1RPX01FTV9DT01QUkVTU0lPTgorc3RhdGljCitpbnQgQloyX2J6QnVmZlRvQnVmZkNvbXByZXNzKGNoYXIqIGRlc3QsCisJCXVuc2lnbmVkIGludCogZGVzdExlbiwKKwkJY2hhciogICAgICAgICBzb3VyY2UsCisJCXVuc2lnbmVkIGludCAgc291cmNlTGVuLAorCQlpbnQgICAgICAgICAgIGJsb2NrU2l6ZTEwMGspCit7CisJYnpfc3RyZWFtIHN0cm07CisJaW50IHJldDsKKworCWlmIChkZXN0ID09IE5VTEwgfHwgZGVzdExlbiA9PSBOVUxMCisJIHx8IHNvdXJjZSA9PSBOVUxMCisJIHx8IGJsb2NrU2l6ZTEwMGsgPCAxIHx8IGJsb2NrU2l6ZTEwMGsgPiA5CisJKSB7CisJCXJldHVybiBCWl9QQVJBTV9FUlJPUjsKKwl9CisKKwlCWjJfYnpDb21wcmVzc0luaXQoJnN0cm0sIGJsb2NrU2l6ZTEwMGspOworCisJc3RybS5uZXh0X2luID0gc291cmNlOworCXN0cm0ubmV4dF9vdXQgPSBkZXN0OworCXN0cm0uYXZhaWxfaW4gPSBzb3VyY2VMZW47CisJc3RybS5hdmFpbF9vdXQgPSAqZGVzdExlbjsKKworCXJldCA9IEJaMl9iekNvbXByZXNzKCZzdHJtLCBCWl9GSU5JU0gpOworCWlmIChyZXQgPT0gQlpfRklOSVNIX09LKSBnb3RvIG91dHB1dF9vdmVyZmxvdzsKKwlpZiAocmV0ICE9IEJaX1NUUkVBTV9FTkQpIGdvdG8gZXJyaGFuZGxlcjsKKworCS8qIG5vcm1hbCB0ZXJtaW5hdGlvbiAqLworCSpkZXN0TGVuIC09IHN0cm0uYXZhaWxfb3V0OworCUJaMl9iekNvbXByZXNzRW5kKCZzdHJtKTsKKwlyZXR1cm4gQlpfT0s7CisKKyBvdXRwdXRfb3ZlcmZsb3c6CisJQloyX2J6Q29tcHJlc3NFbmQoJnN0cm0pOworCXJldHVybiBCWl9PVVRCVUZGX0ZVTEw7CisKKyBlcnJoYW5kbGVyOgorCUJaMl9iekNvbXByZXNzRW5kKCZzdHJtKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWIuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWIuaCBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI4MTFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBiemlwMiBpcyB3cml0dGVuIGJ5IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+LgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIFB1YmxpYyBoZWFkZXIgZmlsZSBmb3IgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWIuaCAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZpbGUgaXMgcGFydCBvZiBiemlwMi9saWJiemlwMiwgYSBwcm9ncmFtIGFuZCBsaWJyYXJ5IGZvcgorbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CitDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPgorCitQbGVhc2UgcmVhZCB0aGUgV0FSTklORywgRElTQ0xBSU1FUiBhbmQgUEFURU5UUyBzZWN0aW9ucyBpbiB0aGUKK1JFQURNRSBmaWxlLgorCitUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgTElDRU5TRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJaX1JVTiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlpfRkxVU0ggICAgICAgICAgICAgMQorI2RlZmluZSBCWl9GSU5JU0ggICAgICAgICAgICAyCisKKyNkZWZpbmUgQlpfT0sgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCWl9SVU5fT0sgICAgICAgICAgICAxCisjZGVmaW5lIEJaX0ZMVVNIX09LICAgICAgICAgIDIKKyNkZWZpbmUgQlpfRklOSVNIX09LICAgICAgICAgMworI2RlZmluZSBCWl9TVFJFQU1fRU5EICAgICAgICA0CisjZGVmaW5lIEJaX1NFUVVFTkNFX0VSUk9SICAgICgtMSkKKyNkZWZpbmUgQlpfUEFSQU1fRVJST1IgICAgICAgKC0yKQorI2RlZmluZSBCWl9NRU1fRVJST1IgICAgICAgICAoLTMpCisjZGVmaW5lIEJaX0RBVEFfRVJST1IgICAgICAgICgtNCkKKyNkZWZpbmUgQlpfREFUQV9FUlJPUl9NQUdJQyAgKC01KQorI2RlZmluZSBCWl9JT19FUlJPUiAgICAgICAgICAoLTYpCisjZGVmaW5lIEJaX1VORVhQRUNURURfRU9GICAgICgtNykKKyNkZWZpbmUgQlpfT1VUQlVGRl9GVUxMICAgICAgKC04KQorI2RlZmluZSBCWl9DT05GSUdfRVJST1IgICAgICAoLTkpCisKK3R5cGVkZWYgc3RydWN0IGJ6X3N0cmVhbSB7CisJdm9pZCAqc3RhdGU7CisJY2hhciAqbmV4dF9pbjsKKwljaGFyICpuZXh0X291dDsKKwl1bnNpZ25lZCBhdmFpbF9pbjsKKwl1bnNpZ25lZCBhdmFpbF9vdXQ7CisJLyp1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfaW47Ki8KKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfb3V0OworfSBiel9zdHJlYW07CisKKy8qLS0gQ29yZSAobG93LWxldmVsKSBsaWJyYXJ5IGZ1bmN0aW9ucyAtLSovCisKK3N0YXRpYyB2b2lkIEJaMl9iekNvbXByZXNzSW5pdChiel9zdHJlYW0gKnN0cm0sIGludCBibG9ja1NpemUxMDBrKTsKK3N0YXRpYyBpbnQgQloyX2J6Q29tcHJlc3MoYnpfc3RyZWFtICpzdHJtLCBpbnQgYWN0aW9uKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorc3RhdGljIHZvaWQgQloyX2J6Q29tcHJlc3NFbmQoYnpfc3RyZWFtICpzdHJtKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliLmggLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliX3ByaXZhdGUuaCBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWJfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzBjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliX3ByaXZhdGUuaApAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gUHJpdmF0ZSBoZWFkZXIgZmlsZSBmb3IgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWJfcHJpdmF0ZS5oIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICNpbmNsdWRlICJiemxpYi5oIiAqLworCisvKi0tIEdlbmVyYWwgc3R1ZmYuIC0tKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJvb2w7CisKKyNkZWZpbmUgVHJ1ZSAgKChCb29sKTEpCisjZGVmaW5lIEZhbHNlICgoQm9vbCkwKQorCisjaWYgQlpfTElHSFRfREVCVUcKK3N0YXRpYyB2b2lkIGJ6X2Fzc2VydF9mYWlsKGludCBlcnJjb2RlKSBOT1JFVFVSTjsKKyNkZWZpbmUgQXNzZXJ0SChjb25kLCBlcnJjb2RlKSBcCitkbyB7IFwKKwlpZiAoIShjb25kKSkgXAorCQliel9hc3NlcnRfZmFpbChlcnJjb2RlKTsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFzc2VydEgoY29uZCwgbXNnKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIEJaX0RFQlVHCisjZGVmaW5lIEFzc2VydEQoY29uZCwgbXNnKSBcCitkbyB7IFwKKwlpZiAoIShjb25kKSkgXAorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiKGRlYnVnIGJ1aWxkKTogaW50ZXJuYWwgZXJyb3IgJXMiLCBtc2cpOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQXNzZXJ0RChjb25kLCBtc2cpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qLS0gSGVhZGVyIGJ5dGVzLiAtLSovCisKKyNkZWZpbmUgQlpfSERSX0IgMHg0MiAgIC8qICdCJyAqLworI2RlZmluZSBCWl9IRFJfWiAweDVhICAgLyogJ1onICovCisjZGVmaW5lIEJaX0hEUl9oIDB4NjggICAvKiAnaCcgKi8KKyNkZWZpbmUgQlpfSERSXzAgMHgzMCAgIC8qICcwJyAqLworCisjZGVmaW5lIEJaX0hEUl9CWmgwIDB4NDI1YTY4MzAKKworLyotLSBDb25zdGFudHMgZm9yIHRoZSBiYWNrIGVuZC4gLS0qLworCisjZGVmaW5lIEJaX01BWF9BTFBIQV9TSVpFIDI1OAorI2RlZmluZSBCWl9NQVhfQ09ERV9MRU4gICAgMjMKKworI2RlZmluZSBCWl9SVU5BIDAKKyNkZWZpbmUgQlpfUlVOQiAxCisKKyNkZWZpbmUgQlpfTl9HUk9VUFMgNgorI2RlZmluZSBCWl9HX1NJWkUgICA1MAorI2RlZmluZSBCWl9OX0lURVJTICA0CisKKyNkZWZpbmUgQlpfTUFYX1NFTEVDVE9SUyAoMiArICg5MDAwMDAgLyBCWl9HX1NJWkUpKQorCisKKy8qLS0gU3R1ZmYgZm9yIGRvaW5nIENSQ3MuIC0tKi8KKworI2RlZmluZSBCWl9JTklUSUFMSVNFX0NSQyhjcmNWYXIpIFwKK3sgXAorCWNyY1ZhciA9IDB4ZmZmZmZmZmZMOyBcCit9CisKKyNkZWZpbmUgQlpfRklOQUxJU0VfQ1JDKGNyY1ZhcikgXAoreyBcCisJY3JjVmFyID0gfihjcmNWYXIpOyBcCit9CisKKyNkZWZpbmUgQlpfVVBEQVRFX0NSQyhzLCBjcmNWYXIsIGNoYSkgXAoreyBcCisJY3JjVmFyID0gKGNyY1ZhciA8PCA4KSBeIHMtPmNyYzMydGFibGVbKGNyY1ZhciA+PiAyNCkgXiAoKHVpbnQ4X3QpY2hhKV07IFwKK30KKworCisvKi0tIFN0YXRlcyBhbmQgbW9kZXMgZm9yIGNvbXByZXNzaW9uLiAtLSovCisKKyNkZWZpbmUgQlpfTV9JRExFICAgICAgMQorI2RlZmluZSBCWl9NX1JVTk5JTkcgICAyCisjZGVmaW5lIEJaX01fRkxVU0hJTkcgIDMKKyNkZWZpbmUgQlpfTV9GSU5JU0hJTkcgNAorCisjZGVmaW5lIEJaX1NfT1VUUFVUICAgIDEKKyNkZWZpbmUgQlpfU19JTlBVVCAgICAgMgorCisjZGVmaW5lIEJaX05fUkFESVggMgorI2RlZmluZSBCWl9OX1FTT1JUIDEyCisjZGVmaW5lIEJaX05fU0hFTEwgMTgKKyNkZWZpbmUgQlpfTl9PVkVSU0hPT1QgKEJaX05fUkFESVggKyBCWl9OX1FTT1JUICsgQlpfTl9TSEVMTCArIDIpCisKKworLyotLSBTdHJ1Y3R1cmUgaG9sZGluZyBhbGwgdGhlIGNvbXByZXNzaW9uLXNpZGUgc3R1ZmYuIC0tKi8KKwordHlwZWRlZiBzdHJ1Y3QgRVN0YXRlIHsKKwkvKiBwb2ludGVyIGJhY2sgdG8gdGhlIHN0cnVjdCBiel9zdHJlYW0gKi8KKwliel9zdHJlYW0gKnN0cm07CisKKwkvKiBtb2RlIHRoaXMgc3RyZWFtIGlzIGluLCBhbmQgd2hldGhlciBpbnB1dHRpbmcgKi8KKwkvKiBvciBvdXRwdXR0aW5nIGRhdGEgKi8KKwlpbnQzMl90ICBtb2RlOworCWludDMyX3QgIHN0YXRlOworCisJLyogcmVtZW1iZXJzIGF2YWlsX2luIHdoZW4gZmx1c2gvZmluaXNoIHJlcXVlc3RlZCAqLworLyogYmJveDogbm90IG5lZWRlZCwgc3RybS0+YXZhaWxfaW4gYWx3YXlzIGhhcyB0aGUgc2FtZSB2YWx1ZSAqLworLyogY29tbWVudGVkIG91dCB3aXRoICcvLyMnIHRocm91Z2hvdXQgdGhlIGNvZGUgKi8KKwkvKiB1aW50MzJfdCBhdmFpbF9pbl9leHBlY3Q7ICovCisKKwkvKiBmb3IgZG9pbmcgdGhlIGJsb2NrIHNvcnRpbmcgKi8KKwlpbnQzMl90ICBvcmlnUHRyOworCXVpbnQzMl90ICphcnIxOworCXVpbnQzMl90ICphcnIyOworCXVpbnQzMl90ICpmdGFiOworCisJLyogYWxpYXNlcyBmb3IgYXJyMSBhbmQgYXJyMiAqLworCXVpbnQzMl90ICpwdHI7CisJdWludDhfdCAgKmJsb2NrOworCXVpbnQxNl90ICptdGZ2OworCXVpbnQ4X3QgICp6Yml0czsKKworCS8qIGd1ZXNzIHdoYXQgKi8KKwl1aW50MzJfdCAqY3JjMzJ0YWJsZTsKKworCS8qIHJ1bi1sZW5ndGgtZW5jb2Rpbmcgb2YgdGhlIGlucHV0ICovCisJdWludDMyX3Qgc3RhdGVfaW5fY2g7CisJaW50MzJfdCAgc3RhdGVfaW5fbGVuOworCisJLyogaW5wdXQgYW5kIG91dHB1dCBsaW1pdHMgYW5kIGN1cnJlbnQgcG9zbnMgKi8KKwlpbnQzMl90ICBuYmxvY2s7CisJaW50MzJfdCAgbmJsb2NrTUFYOworCWludDMyX3QgIG51bVo7CisJaW50MzJfdCAgc3RhdGVfb3V0X3BvczsKKworCS8qIHRoZSBidWZmZXIgZm9yIGJpdCBzdHJlYW0gY3JlYXRpb24gKi8KKwl1aW50MzJfdCBic0J1ZmY7CisJaW50MzJfdCAgYnNMaXZlOworCisJLyogYmxvY2sgYW5kIGNvbWJpbmVkIENSQ3MgKi8KKwl1aW50MzJfdCBibG9ja0NSQzsKKwl1aW50MzJfdCBjb21iaW5lZENSQzsKKworCS8qIG1pc2MgYWRtaW5pc3RyYXRpdW0gKi8KKwlpbnQzMl90ICBibG9ja05vOworCWludDMyX3QgIGJsb2NrU2l6ZTEwMGs7CisKKwkvKiBzdHVmZiBmb3IgY29kaW5nIHRoZSBNVEYgdmFsdWVzICovCisJaW50MzJfdCAgbk1URjsKKworCS8qIG1hcCBvZiBieXRlcyB1c2VkIGluIGJsb2NrICovCisJaW50MzJfdCAgbkluVXNlOworCUJvb2wgICAgIGluVXNlWzI1Nl0gQUxJR05FRChzaXplb2YobG9uZykpOworCXVpbnQ4X3QgIHVuc2VxVG9TZXFbMjU2XTsKKworCS8qIHN0dWZmIGZvciBjb2RpbmcgdGhlIE1URiB2YWx1ZXMgKi8KKwlpbnQzMl90ICBtdGZGcmVxICAgIFtCWl9NQVhfQUxQSEFfU0laRV07CisJdWludDhfdCAgc2VsZWN0b3IgICBbQlpfTUFYX1NFTEVDVE9SU107CisJdWludDhfdCAgc2VsZWN0b3JNdGZbQlpfTUFYX1NFTEVDVE9SU107CisKKwl1aW50OF90ICBsZW5bQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKworCS8qIHN0YWNrLXNhdmluZyBtZWFzdXJlczogdGhlc2UgY2FuIGJlIGxvY2FsLCBidXQgdGhleSBhcmUgdG9vIGJpZyAqLworCWludDMyX3QgIHNlbmRNVEZWYWx1ZXNfX2NvZGUgW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisJaW50MzJfdCAgc2VuZE1URlZhbHVlc19fcmZyZXFbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSA1CisJLyogc2Vjb25kIGRpbWVuc2lvbjogb25seSAzIG5lZWRlZDsgNCBtYWtlcyBpbmRleCBjYWxjdWxhdGlvbnMgZmFzdGVyICovCisJdWludDMyX3Qgc2VuZE1URlZhbHVlc19fbGVuX3BhY2tbQlpfTUFYX0FMUEhBX1NJWkVdWzRdOworI2VuZGlmCisJaW50MzJfdCAgQloyX2hiTWFrZUNvZGVMZW5ndGhzX19oZWFwICBbQlpfTUFYX0FMUEhBX1NJWkUgKyAyXTsKKwlpbnQzMl90ICBCWjJfaGJNYWtlQ29kZUxlbmd0aHNfX3dlaWdodFtCWl9NQVhfQUxQSEFfU0laRSAqIDJdOworCWludDMyX3QgIEJaMl9oYk1ha2VDb2RlTGVuZ3Roc19fcGFyZW50W0JaX01BWF9BTFBIQV9TSVpFICogMl07CisKKwlpbnQzMl90ICBtYWluU29ydF9fcnVubmluZ09yZGVyWzI1Nl07CisJaW50MzJfdCAgbWFpblNvcnRfX2NvcHlTdGFydFsyNTZdOworCWludDMyX3QgIG1haW5Tb3J0X19jb3B5RW5kWzI1Nl07Cit9IEVTdGF0ZTsKKworCisvKi0tIGNvbXByZXNzaW9uLiAtLSovCisKK3N0YXRpYyB2b2lkCitCWjJfYmxvY2tTb3J0KEVTdGF0ZSopOworCitzdGF0aWMgdm9pZAorQloyX2NvbXByZXNzQmxvY2soRVN0YXRlKiwgaW50KTsKKworc3RhdGljIHZvaWQKK0JaMl9ic0luaXRXcml0ZShFU3RhdGUqKTsKKworc3RhdGljIHZvaWQKK0JaMl9oYkFzc2lnbkNvZGVzKGludDMyX3QqLCB1aW50OF90KiwgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCk7CisKK3N0YXRpYyB2b2lkCitCWjJfaGJNYWtlQ29kZUxlbmd0aHMoRVN0YXRlKiwgdWludDhfdCosIGludDMyX3QqLCBpbnQzMl90LCBpbnQzMl90KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWJfcHJpdmF0ZS5oIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9jb21wcmVzcy5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzY3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2NvbXByZXNzLmMKQEAgLTAsMCArMSw2ODAgQEAKKy8qCisgKiBiemlwMiBpcyB3cml0dGVuIGJ5IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+LgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIENvbXByZXNzaW9uIG1hY2hpbmVyeSAobm90IGluY2wgYmxvY2sgc29ydGluZykgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3MuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZpbGUgaXMgcGFydCBvZiBiemlwMi9saWJiemlwMiwgYSBwcm9ncmFtIGFuZCBsaWJyYXJ5IGZvcgorbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CitDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPgorCitQbGVhc2UgcmVhZCB0aGUgV0FSTklORywgRElTQ0xBSU1FUiBhbmQgUEFURU5UUyBzZWN0aW9ucyBpbiB0aGUKK1JFQURNRSBmaWxlLgorCitUaGlzIHByb2dyYW0gaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgTElDRU5TRS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDSEFOR0VTCisgKiAwLjkuMCAgICAtLSBvcmlnaW5hbCB2ZXJzaW9uLgorICogMC45LjBhL2IgLS0gbm8gY2hhbmdlcyBpbiB0aGlzIGZpbGUuCisgKiAwLjkuMGMgICAtLSBjaGFuZ2VkIHNldHRpbmcgb2Ygbkdyb3VwcyBpbiBzZW5kTVRGVmFsdWVzKCkKKyAqICAgICAgICAgICAgIHNvIGFzIHRvIGRvIGEgYml0IGJldHRlciBvbiBzbWFsbCBmaWxlcworKi8KKworLyogI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gQml0IHN0cmVhbSBJL08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgQloyX2JzSW5pdFdyaXRlKEVTdGF0ZSogcykKK3sKKwlzLT5ic0xpdmUgPSAwOworCXMtPmJzQnVmZiA9IDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIE5PSU5MSU5FCit2b2lkIGJzRmluaXNoV3JpdGUoRVN0YXRlKiBzKQoreworCXdoaWxlIChzLT5ic0xpdmUgPiAwKSB7CisJCXMtPnpiaXRzW3MtPm51bVpdID0gKHVpbnQ4X3QpKHMtPmJzQnVmZiA+PiAyNCk7CisJCXMtPm51bVorKzsKKwkJcy0+YnNCdWZmIDw8PSA4OworCQlzLT5ic0xpdmUgLT0gODsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCisvKiBIZWxwcyBvbmx5IG9uIGxldmVsIDUsIG9uIG90aGVyIGxldmVscyBodXJ0cy4gPyAqLworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDUKK0FMV0FZU19JTkxJTkUKKyNlbmRpZgordm9pZCBic1coRVN0YXRlKiBzLCBpbnQzMl90IG4sIHVpbnQzMl90IHYpCit7CisJd2hpbGUgKHMtPmJzTGl2ZSA+PSA4KSB7CisJCXMtPnpiaXRzW3MtPm51bVpdID0gKHVpbnQ4X3QpKHMtPmJzQnVmZiA+PiAyNCk7CisJCXMtPm51bVorKzsKKwkJcy0+YnNCdWZmIDw8PSA4OworCQlzLT5ic0xpdmUgLT0gODsKKwl9CisJcy0+YnNCdWZmIHw9ICh2IDw8ICgzMiAtIHMtPmJzTGl2ZSAtIG4pKTsKKwlzLT5ic0xpdmUgKz0gbjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgYnNQdXRVMzIoRVN0YXRlKiBzLCB1bnNpZ25lZCB1KQoreworCWJzVyhzLCA4LCAodSA+PiAyNCkgJiAweGZmKTsKKwlic1cocywgOCwgKHUgPj4gMTYpICYgMHhmZik7CisJYnNXKHMsIDgsICh1ID4+ICA4KSAmIDB4ZmYpOworCWJzVyhzLCA4LCAgdSAgICAgICAgJiAweGZmKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgYnNQdXRVMTYoRVN0YXRlKiBzLCB1bnNpZ25lZCB1KQoreworCWJzVyhzLCA4LCAodSA+PiAgOCkgJiAweGZmKTsKKwlic1cocywgOCwgIHUgICAgICAgICYgMHhmZik7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gVGhlIGJhY2sgZW5kIHByb3BlciAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgbWFrZU1hcHNfZShFU3RhdGUqIHMpCit7CisJaW50IGk7CisJcy0+bkluVXNlID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaWYgKHMtPmluVXNlW2ldKSB7CisJCQlzLT51bnNlcVRvU2VxW2ldID0gcy0+bkluVXNlOworCQkJcy0+bkluVXNlKys7CisJCX0KKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIE5PSU5MSU5FCit2b2lkIGdlbmVyYXRlTVRGVmFsdWVzKEVTdGF0ZSogcykKK3sKKwl1aW50OF90IHl5WzI1Nl07CisJaW50MzJfdCBpLCBqOworCWludDMyX3QgelBlbmQ7CisJaW50MzJfdCB3cjsKKwlpbnQzMl90IEVPQjsKKworCS8qCisJICogQWZ0ZXIgc29ydGluZyAoZWcsIGhlcmUpLAorCSAqIHMtPmFycjFbMCAuLiBzLT5uYmxvY2stMV0gaG9sZHMgc29ydGVkIG9yZGVyLAorCSAqIGFuZAorCSAqICgodWludDhfdCopcy0+YXJyMilbMCAuLiBzLT5uYmxvY2stMV0KKwkgKiBob2xkcyB0aGUgb3JpZ2luYWwgYmxvY2sgZGF0YS4KKwkgKgorCSAqIFRoZSBmaXJzdCB0aGluZyB0byBkbyBpcyBnZW5lcmF0ZSB0aGUgTVRGIHZhbHVlcywKKwkgKiBhbmQgcHV0IHRoZW0gaW4gKCh1aW50MTZfdCopcy0+YXJyMSlbMCAuLiBzLT5uYmxvY2stMV0uCisJICoKKwkgKiBCZWNhdXNlIHRoZXJlIGFyZSBzdHJpY3RseSBmZXdlciBvciBlcXVhbCBNVEYgdmFsdWVzCisJICogdGhhbiBibG9jayB2YWx1ZXMsIHB0ciB2YWx1ZXMgaW4gdGhpcyBhcmVhIGFyZSBvdmVyd3JpdHRlbgorCSAqIHdpdGggTVRGIHZhbHVlcyBvbmx5IHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKwkgKgorCSAqIFRoZSBmaW5hbCBjb21wcmVzc2VkIGJpdHN0cmVhbSBpcyBnZW5lcmF0ZWQgaW50byB0aGUKKwkgKiBhcmVhIHN0YXJ0aW5nIGF0ICYoKHVpbnQ4X3QqKXMtPmFycjIpW3MtPm5ibG9ja10KKwkgKgorCSAqIFRoZXNlIHN0b3JhZ2UgYWxpYXNlcyBhcmUgc2V0IHVwIGluIGJ6Q29tcHJlc3NJbml0KCksCisJICogZXhjZXB0IGZvciB0aGUgbGFzdCBvbmUsIHdoaWNoIGlzIGFycmFuZ2VkIGluCisJICogY29tcHJlc3NCbG9jaygpLgorCSAqLworCXVpbnQzMl90KiBwdHIgICA9IHMtPnB0cjsKKwl1aW50OF90KiAgYmxvY2sgPSBzLT5ibG9jazsKKwl1aW50MTZfdCogbXRmdiAgPSBzLT5tdGZ2OworCisJbWFrZU1hcHNfZShzKTsKKwlFT0IgPSBzLT5uSW5Vc2UrMTsKKworCWZvciAoaSA9IDA7IGkgPD0gRU9COyBpKyspCisJCXMtPm10ZkZyZXFbaV0gPSAwOworCisJd3IgPSAwOworCXpQZW5kID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcy0+bkluVXNlOyBpKyspCisJCXl5W2ldID0gKHVpbnQ4X3QpIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcy0+bmJsb2NrOyBpKyspIHsKKwkJdWludDhfdCBsbF9pOworCQlBc3NlcnREKHdyIDw9IGksICJnZW5lcmF0ZU1URlZhbHVlcygxKSIpOworCQlqID0gcHRyW2ldIC0gMTsKKwkJaWYgKGogPCAwKQorCQkJaiArPSBzLT5uYmxvY2s7CisJCWxsX2kgPSBzLT51bnNlcVRvU2VxW2Jsb2NrW2pdXTsKKwkJQXNzZXJ0RChsbF9pIDwgcy0+bkluVXNlLCAiZ2VuZXJhdGVNVEZWYWx1ZXMoMmEpIik7CisKKwkJaWYgKHl5WzBdID09IGxsX2kpIHsKKwkJCXpQZW5kKys7CisJCX0gZWxzZSB7CisJCQlpZiAoelBlbmQgPiAwKSB7CisJCQkJelBlbmQtLTsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlpZiAoelBlbmQgJiAxKSB7CisJCQkJCQltdGZ2W3dyXSA9IEJaX1JVTkI7IHdyKys7CisJCQkJCQlzLT5tdGZGcmVxW0JaX1JVTkJdKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltdGZ2W3dyXSA9IEJaX1JVTkE7IHdyKys7CisJCQkJCQlzLT5tdGZGcmVxW0JaX1JVTkFdKys7CisJCQkJCX0KKwkJCQkJaWYgKHpQZW5kIDwgMikgYnJlYWs7CisJCQkJCXpQZW5kID0gKHVpbnQzMl90KSh6UGVuZCAtIDIpIC8gMjsKKwkJCQkJLyogYmJveDogdW5zaWduZWQgZGl2IGlzIGVhc2llciAqLworCQkJCX07CisJCQkJelBlbmQgPSAwOworCQkJfQorCQkJeworCQkJCXJlZ2lzdGVyIHVpbnQ4X3QgIHJ0bXA7CisJCQkJcmVnaXN0ZXIgdWludDhfdCogcnl5X2o7CisJCQkJcmVnaXN0ZXIgdWludDhfdCAgcmxsX2k7CisJCQkJcnRtcCAgPSB5eVsxXTsKKwkJCQl5eVsxXSA9IHl5WzBdOworCQkJCXJ5eV9qID0gJih5eVsxXSk7CisJCQkJcmxsX2kgPSBsbF9pOworCQkJCXdoaWxlIChybGxfaSAhPSBydG1wKSB7CisJCQkJCXJlZ2lzdGVyIHVpbnQ4X3QgcnRtcDI7CisJCQkJCXJ5eV9qKys7CisJCQkJCXJ0bXAyICA9IHJ0bXA7CisJCQkJCXJ0bXAgICA9ICpyeXlfajsKKwkJCQkJKnJ5eV9qID0gcnRtcDI7CisJCQkJfTsKKwkJCQl5eVswXSA9IHJ0bXA7CisJCQkJaiA9IHJ5eV9qIC0gJih5eVswXSk7CisJCQkJbXRmdlt3cl0gPSBqKzE7CisJCQkJd3IrKzsKKwkJCQlzLT5tdGZGcmVxW2orMV0rKzsKKwkJCX0KKwkJfQorCX0KKworCWlmICh6UGVuZCA+IDApIHsKKwkJelBlbmQtLTsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmICh6UGVuZCAmIDEpIHsKKwkJCQltdGZ2W3dyXSA9IEJaX1JVTkI7CisJCQkJd3IrKzsKKwkJCQlzLT5tdGZGcmVxW0JaX1JVTkJdKys7CisJCQl9IGVsc2UgeworCQkJCW10ZnZbd3JdID0gQlpfUlVOQTsKKwkJCQl3cisrOworCQkJCXMtPm10ZkZyZXFbQlpfUlVOQV0rKzsKKwkJCX0KKwkJCWlmICh6UGVuZCA8IDIpCisJCQkJYnJlYWs7CisJCQl6UGVuZCA9ICh1aW50MzJfdCkoelBlbmQgLSAyKSAvIDI7CisJCQkvKiBiYm94OiB1bnNpZ25lZCBkaXYgaXMgZWFzaWVyICovCisJCX07CisJCXpQZW5kID0gMDsKKwl9CisKKwltdGZ2W3dyXSA9IEVPQjsKKwl3cisrOworCXMtPm10ZkZyZXFbRU9CXSsrOworCisJcy0+bk1URiA9IHdyOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQlpfTEVTU0VSX0lDT1NUICAwCisjZGVmaW5lIEJaX0dSRUFURVJfSUNPU1QgMTUKKworc3RhdGljIE5PSU5MSU5FCit2b2lkIHNlbmRNVEZWYWx1ZXMoRVN0YXRlKiBzKQoreworCWludDMyX3QgdiwgdCwgaSwgaiwgZ3MsIGdlLCB0b3RjLCBidCwgYmMsIGl0ZXI7CisJaW50MzJfdCBuU2VsZWN0b3JzLCBhbHBoYVNpemUsIG1pbkxlbiwgbWF4TGVuLCBzZWxDdHI7CisJaW50MzJfdCBuR3JvdXBzOworCisJLyoKKwkgKiB1aW50OF90IGxlbltCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworCSAqIGlzIGEgZ2xvYmFsIHNpbmNlIHRoZSBkZWNvZGVyIGFsc28gbmVlZHMgaXQuCisJICoKKwkgKiBpbnQzMl90ICBjb2RlW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisJICogaW50MzJfdCAgcmZyZXFbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKwkgKiBhcmUgYWxzbyBnbG9iYWxzIG9ubHkgdXNlZCBpbiB0aGlzIHByb2MuCisJICogTWFkZSBnbG9iYWwgdG8ga2VlcCBzdGFjayBmcmFtZSBzaXplIHNtYWxsLgorCSAqLworI2RlZmluZSBjb2RlICAgICBzZW5kTVRGVmFsdWVzX19jb2RlCisjZGVmaW5lIHJmcmVxICAgIHNlbmRNVEZWYWx1ZXNfX3JmcmVxCisjZGVmaW5lIGxlbl9wYWNrIHNlbmRNVEZWYWx1ZXNfX2xlbl9wYWNrCisKKwl1aW50MTZfdCBjb3N0W0JaX05fR1JPVVBTXTsKKwlpbnQzMl90ICBmYXZlW0JaX05fR1JPVVBTXTsKKworCXVpbnQxNl90KiBtdGZ2ID0gcy0+bXRmdjsKKworCWFscGhhU2l6ZSA9IHMtPm5JblVzZSArIDI7CisJZm9yICh0ID0gMDsgdCA8IEJaX05fR1JPVVBTOyB0KyspCisJCWZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykKKwkJCXMtPmxlblt0XVt2XSA9IEJaX0dSRUFURVJfSUNPU1Q7CisKKwkvKi0tLSBEZWNpZGUgaG93IG1hbnkgY29kaW5nIHRhYmxlcyB0byB1c2UgLS0tKi8KKwlBc3NlcnRIKHMtPm5NVEYgPiAwLCAzMDAxKTsKKwlpZiAocy0+bk1URiA8IDIwMCkgIG5Hcm91cHMgPSAyOyBlbHNlCisJaWYgKHMtPm5NVEYgPCA2MDApICBuR3JvdXBzID0gMzsgZWxzZQorCWlmIChzLT5uTVRGIDwgMTIwMCkgbkdyb3VwcyA9IDQ7IGVsc2UKKwlpZiAocy0+bk1URiA8IDI0MDApIG5Hcm91cHMgPSA1OyBlbHNlCisJbkdyb3VwcyA9IDY7CisKKwkvKi0tLSBHZW5lcmF0ZSBhbiBpbml0aWFsIHNldCBvZiBjb2RpbmcgdGFibGVzIC0tLSovCisJeworCQlpbnQzMl90IG5QYXJ0LCByZW1GLCB0RnJlcSwgYUZyZXE7CisKKwkJblBhcnQgPSBuR3JvdXBzOworCQlyZW1GICA9IHMtPm5NVEY7CisJCWdzID0gMDsKKwkJd2hpbGUgKG5QYXJ0ID4gMCkgeworCQkJdEZyZXEgPSByZW1GIC8gblBhcnQ7CisJCQlnZSA9IGdzIC0gMTsKKwkJCWFGcmVxID0gMDsKKwkJCXdoaWxlIChhRnJlcSA8IHRGcmVxICYmIGdlIDwgYWxwaGFTaXplLTEpIHsKKwkJCQlnZSsrOworCQkJCWFGcmVxICs9IHMtPm10ZkZyZXFbZ2VdOworCQkJfQorCisJCQlpZiAoZ2UgPiBncworCQkJICYmIG5QYXJ0ICE9IG5Hcm91cHMgJiYgblBhcnQgIT0gMQorCQkJICYmICgobkdyb3VwcyAtIG5QYXJ0KSAlIDIgPT0gMSkgLyogYmJveDogY2FuIHRoaXMgYmUgcmVwbGFjZWQgYnkgeCAmIDE/ICovCisJCQkpIHsKKwkJCQlhRnJlcSAtPSBzLT5tdGZGcmVxW2dlXTsKKwkJCQlnZS0tOworCQkJfQorCisJCQlmb3IgKHYgPSAwOyB2IDwgYWxwaGFTaXplOyB2KyspCisJCQkJaWYgKHYgPj0gZ3MgJiYgdiA8PSBnZSkKKwkJCQkJcy0+bGVuW25QYXJ0LTFdW3ZdID0gQlpfTEVTU0VSX0lDT1NUOworCQkJCWVsc2UKKwkJCQkJcy0+bGVuW25QYXJ0LTFdW3ZdID0gQlpfR1JFQVRFUl9JQ09TVDsKKworCQkJblBhcnQtLTsKKwkJCWdzID0gZ2UgKyAxOworCQkJcmVtRiAtPSBhRnJlcTsKKwkJfQorCX0KKworCS8qCisJICogSXRlcmF0ZSB1cCB0byBCWl9OX0lURVJTIHRpbWVzIHRvIGltcHJvdmUgdGhlIHRhYmxlcy4KKwkgKi8KKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgQlpfTl9JVEVSUzsgaXRlcisrKSB7CisJCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspCisJCQlmYXZlW3RdID0gMDsKKworCQlmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQorCQkJZm9yICh2ID0gMDsgdiA8IGFscGhhU2l6ZTsgdisrKQorCQkJCXMtPnJmcmVxW3RdW3ZdID0gMDsKKworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDUKKwkJLyoKKwkJICogU2V0IHVwIGFuIGF1eGlsaWFyeSBsZW5ndGggdGFibGUgd2hpY2ggaXMgdXNlZCB0byBmYXN0LXRyYWNrCisJCSAqIHRoZSBjb21tb24gY2FzZSAobkdyb3VwcyA9PSA2KS4KKwkJICovCisJCWlmIChuR3JvdXBzID09IDYpIHsKKwkJCWZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykgeworCQkJCXMtPmxlbl9wYWNrW3ZdWzBdID0gKHMtPmxlblsxXVt2XSA8PCAxNikgfCBzLT5sZW5bMF1bdl07CisJCQkJcy0+bGVuX3BhY2tbdl1bMV0gPSAocy0+bGVuWzNdW3ZdIDw8IDE2KSB8IHMtPmxlblsyXVt2XTsKKwkJCQlzLT5sZW5fcGFja1t2XVsyXSA9IChzLT5sZW5bNV1bdl0gPDwgMTYpIHwgcy0+bGVuWzRdW3ZdOworCQkJfQorCQl9CisjZW5kaWYKKwkJblNlbGVjdG9ycyA9IDA7CisJCXRvdGMgPSAwOworCQlncyA9IDA7CisJCXdoaWxlICgxKSB7CisJCQkvKi0tLSBTZXQgZ3JvdXAgc3RhcnQgJiBlbmQgbWFya3MuIC0tKi8KKwkJCWlmIChncyA+PSBzLT5uTVRGKQorCQkJCWJyZWFrOworCQkJZ2UgPSBncyArIEJaX0dfU0laRSAtIDE7CisJCQlpZiAoZ2UgPj0gcy0+bk1URikKKwkJCQlnZSA9IHMtPm5NVEYtMTsKKworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0aGUgY29zdCBvZiB0aGlzIGdyb3VwIGFzIGNvZGVkCisJCQkgKiBieSBlYWNoIG9mIHRoZSBjb2RpbmcgdGFibGVzLgorCQkJICovCisJCQlmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQorCQkJCWNvc3RbdF0gPSAwOworI2lmIENPTkZJR19CWklQMl9GRUFUVVJFX1NQRUVEID49IDUKKwkJCWlmIChuR3JvdXBzID09IDYgJiYgNTAgPT0gZ2UtZ3MrMSkgeworCQkJCS8qLS0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tLSovCisJCQkJcmVnaXN0ZXIgdWludDMyX3QgY29zdDAxLCBjb3N0MjMsIGNvc3Q0NTsKKwkJCQlyZWdpc3RlciB1aW50MTZfdCBpY3Y7CisJCQkJY29zdDAxID0gY29zdDIzID0gY29zdDQ1ID0gMDsKKyNkZWZpbmUgQlpfSVRFUihubikgXAorCWljdiA9IG10ZnZbZ3MrKG5uKV07IFwKKwljb3N0MDEgKz0gcy0+bGVuX3BhY2tbaWN2XVswXTsgXAorCWNvc3QyMyArPSBzLT5sZW5fcGFja1tpY3ZdWzFdOyBcCisJY29zdDQ1ICs9IHMtPmxlbl9wYWNrW2ljdl1bMl07CisJCQkJQlpfSVRFUigwKTsgIEJaX0lURVIoMSk7ICBCWl9JVEVSKDIpOyAgQlpfSVRFUigzKTsgIEJaX0lURVIoNCk7CisJCQkJQlpfSVRFUig1KTsgIEJaX0lURVIoNik7ICBCWl9JVEVSKDcpOyAgQlpfSVRFUig4KTsgIEJaX0lURVIoOSk7CisJCQkJQlpfSVRFUigxMCk7IEJaX0lURVIoMTEpOyBCWl9JVEVSKDEyKTsgQlpfSVRFUigxMyk7IEJaX0lURVIoMTQpOworCQkJCUJaX0lURVIoMTUpOyBCWl9JVEVSKDE2KTsgQlpfSVRFUigxNyk7IEJaX0lURVIoMTgpOyBCWl9JVEVSKDE5KTsKKwkJCQlCWl9JVEVSKDIwKTsgQlpfSVRFUigyMSk7IEJaX0lURVIoMjIpOyBCWl9JVEVSKDIzKTsgQlpfSVRFUigyNCk7CisJCQkJQlpfSVRFUigyNSk7IEJaX0lURVIoMjYpOyBCWl9JVEVSKDI3KTsgQlpfSVRFUigyOCk7IEJaX0lURVIoMjkpOworCQkJCUJaX0lURVIoMzApOyBCWl9JVEVSKDMxKTsgQlpfSVRFUigzMik7IEJaX0lURVIoMzMpOyBCWl9JVEVSKDM0KTsKKwkJCQlCWl9JVEVSKDM1KTsgQlpfSVRFUigzNik7IEJaX0lURVIoMzcpOyBCWl9JVEVSKDM4KTsgQlpfSVRFUigzOSk7CisJCQkJQlpfSVRFUig0MCk7IEJaX0lURVIoNDEpOyBCWl9JVEVSKDQyKTsgQlpfSVRFUig0Myk7IEJaX0lURVIoNDQpOworCQkJCUJaX0lURVIoNDUpOyBCWl9JVEVSKDQ2KTsgQlpfSVRFUig0Nyk7IEJaX0lURVIoNDgpOyBCWl9JVEVSKDQ5KTsKKyN1bmRlZiBCWl9JVEVSCisJCQkJY29zdFswXSA9IGNvc3QwMSAmIDB4ZmZmZjsgY29zdFsxXSA9IGNvc3QwMSA+PiAxNjsKKwkJCQljb3N0WzJdID0gY29zdDIzICYgMHhmZmZmOyBjb3N0WzNdID0gY29zdDIzID4+IDE2OworCQkJCWNvc3RbNF0gPSBjb3N0NDUgJiAweGZmZmY7IGNvc3RbNV0gPSBjb3N0NDUgPj4gMTY7CisKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJLyotLS0gc2xvdyB2ZXJzaW9uIHdoaWNoIGNvcnJlY3RseSBoYW5kbGVzIGFsbCBzaXR1YXRpb25zIC0tLSovCisJCQkJZm9yIChpID0gZ3M7IGkgPD0gZ2U7IGkrKykgeworCQkJCQl1aW50MTZfdCBpY3YgPSBtdGZ2W2ldOworCQkJCQlmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQorCQkJCQkJY29zdFt0XSArPSBzLT5sZW5bdF1baWN2XTsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogRmluZCB0aGUgY29kaW5nIHRhYmxlIHdoaWNoIGlzIGJlc3QgZm9yIHRoaXMgZ3JvdXAsCisJCQkgKiBhbmQgcmVjb3JkIGl0cyBpZGVudGl0eSBpbiB0aGUgc2VsZWN0b3IgdGFibGUuCisJCQkgKi8KKwkJCS8qYmMgPSA5OTk5OTk5OTk7Ki8KKwkJCS8qYnQgPSAtMTsqLworCQkJYmMgPSBjb3N0WzBdOworCQkJYnQgPSAwOworCQkJZm9yICh0ID0gMSAvKjAqLzsgdCA8IG5Hcm91cHM7IHQrKykgeworCQkJCWlmIChjb3N0W3RdIDwgYmMpIHsKKwkJCQkJYmMgPSBjb3N0W3RdOworCQkJCQlidCA9IHQ7CisJCQkJfQorCQkJfQorCQkJdG90YyArPSBiYzsKKwkJCWZhdmVbYnRdKys7CisJCQlzLT5zZWxlY3RvcltuU2VsZWN0b3JzXSA9IGJ0OworCQkJblNlbGVjdG9ycysrOworCisJCQkvKgorCQkJICogSW5jcmVtZW50IHRoZSBzeW1ib2wgZnJlcXVlbmNpZXMgZm9yIHRoZSBzZWxlY3RlZCB0YWJsZS4KKwkJCSAqLworLyogMSUgZmFzdGVyIGNvbXByZXNzLiArODAwIGJ5dGVzICovCisjaWYgQ09ORklHX0JaSVAyX0ZFQVRVUkVfU1BFRUQgPj0gNAorCQkJaWYgKG5Hcm91cHMgPT0gNiAmJiA1MCA9PSBnZS1ncysxKSB7CisJCQkJLyotLS0gZmFzdCB0cmFjayB0aGUgY29tbW9uIGNhc2UgLS0tKi8KKyNkZWZpbmUgQlpfSVRVUihubikgcy0+cmZyZXFbYnRdW210ZnZbZ3MgKyAobm4pXV0rKworCQkJCUJaX0lUVVIoMCk7ICBCWl9JVFVSKDEpOyAgQlpfSVRVUigyKTsgIEJaX0lUVVIoMyk7ICBCWl9JVFVSKDQpOworCQkJCUJaX0lUVVIoNSk7ICBCWl9JVFVSKDYpOyAgQlpfSVRVUig3KTsgIEJaX0lUVVIoOCk7ICBCWl9JVFVSKDkpOworCQkJCUJaX0lUVVIoMTApOyBCWl9JVFVSKDExKTsgQlpfSVRVUigxMik7IEJaX0lUVVIoMTMpOyBCWl9JVFVSKDE0KTsKKwkJCQlCWl9JVFVSKDE1KTsgQlpfSVRVUigxNik7IEJaX0lUVVIoMTcpOyBCWl9JVFVSKDE4KTsgQlpfSVRVUigxOSk7CisJCQkJQlpfSVRVUigyMCk7IEJaX0lUVVIoMjEpOyBCWl9JVFVSKDIyKTsgQlpfSVRVUigyMyk7IEJaX0lUVVIoMjQpOworCQkJCUJaX0lUVVIoMjUpOyBCWl9JVFVSKDI2KTsgQlpfSVRVUigyNyk7IEJaX0lUVVIoMjgpOyBCWl9JVFVSKDI5KTsKKwkJCQlCWl9JVFVSKDMwKTsgQlpfSVRVUigzMSk7IEJaX0lUVVIoMzIpOyBCWl9JVFVSKDMzKTsgQlpfSVRVUigzNCk7CisJCQkJQlpfSVRVUigzNSk7IEJaX0lUVVIoMzYpOyBCWl9JVFVSKDM3KTsgQlpfSVRVUigzOCk7IEJaX0lUVVIoMzkpOworCQkJCUJaX0lUVVIoNDApOyBCWl9JVFVSKDQxKTsgQlpfSVRVUig0Mik7IEJaX0lUVVIoNDMpOyBCWl9JVFVSKDQ0KTsKKwkJCQlCWl9JVFVSKDQ1KTsgQlpfSVRVUig0Nik7IEJaX0lUVVIoNDcpOyBCWl9JVFVSKDQ4KTsgQlpfSVRVUig0OSk7CisjdW5kZWYgQlpfSVRVUgorCQkJCWdzID0gZ2UgKyAxOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQkvKi0tLSBzbG93IHZlcnNpb24gd2hpY2ggY29ycmVjdGx5IGhhbmRsZXMgYWxsIHNpdHVhdGlvbnMgLS0tKi8KKwkJCQl3aGlsZSAoZ3MgPD0gZ2UpIHsKKwkJCQkJcy0+cmZyZXFbYnRdW210ZnZbZ3NdXSsrOworCQkJCQlncysrOworCQkJCX0KKwkJCQkvKiBhbHJlYWR5IGlzOiBncyA9IGdlICsgMTsgKi8KKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFJlY29tcHV0ZSB0aGUgdGFibGVzIGJhc2VkIG9uIHRoZSBhY2N1bXVsYXRlZCBmcmVxdWVuY2llcy4KKwkJICovCisJCS8qIG1heExlbiB3YXMgY2hhbmdlZCBmcm9tIDIwIHRvIDE3IGluIGJ6aXAyLTEuMC4zLiAgU2VlCisJCSAqIGNvbW1lbnQgaW4gaHVmZm1hbi5jIGZvciBkZXRhaWxzLiAqLworCQlmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQorCQkJQloyX2hiTWFrZUNvZGVMZW5ndGhzKHMsICYocy0+bGVuW3RdWzBdKSwgJihzLT5yZnJlcVt0XVswXSksIGFscGhhU2l6ZSwgMTcgLyoyMCovKTsKKwl9CisKKwlBc3NlcnRIKG5Hcm91cHMgPCA4LCAzMDAyKTsKKwlBc3NlcnRIKG5TZWxlY3RvcnMgPCAzMjc2OCAmJiBuU2VsZWN0b3JzIDw9ICgyICsgKDkwMDAwMCAvIEJaX0dfU0laRSkpLCAzMDAzKTsKKworCS8qLS0tIENvbXB1dGUgTVRGIHZhbHVlcyBmb3IgdGhlIHNlbGVjdG9ycy4gLS0tKi8KKwl7CisJCXVpbnQ4X3QgcG9zW0JaX05fR1JPVVBTXSwgbGxfaSwgdG1wMiwgdG1wOworCisJCWZvciAoaSA9IDA7IGkgPCBuR3JvdXBzOyBpKyspCisJCQlwb3NbaV0gPSBpOworCQlmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7CisJCQlsbF9pID0gcy0+c2VsZWN0b3JbaV07CisJCQlqID0gMDsKKwkJCXRtcCA9IHBvc1tqXTsKKwkJCXdoaWxlIChsbF9pICE9IHRtcCkgeworCQkJCWorKzsKKwkJCQl0bXAyID0gdG1wOworCQkJCXRtcCA9IHBvc1tqXTsKKwkJCQlwb3Nbal0gPSB0bXAyOworCQkJfTsKKwkJCXBvc1swXSA9IHRtcDsKKwkJCXMtPnNlbGVjdG9yTXRmW2ldID0gajsKKwkJfQorCX07CisKKwkvKi0tLSBBc3NpZ24gYWN0dWFsIGNvZGVzIGZvciB0aGUgdGFibGVzLiAtLSovCisJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgeworCQltaW5MZW4gPSAzMjsKKwkJbWF4TGVuID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisJCQlpZiAocy0+bGVuW3RdW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBzLT5sZW5bdF1baV07CisJCQlpZiAocy0+bGVuW3RdW2ldIDwgbWluTGVuKSBtaW5MZW4gPSBzLT5sZW5bdF1baV07CisJCX0KKwkJQXNzZXJ0SCghKG1heExlbiA+IDE3IC8qMjAqLyksIDMwMDQpOworCQlBc3NlcnRIKCEobWluTGVuIDwgMSksIDMwMDUpOworCQlCWjJfaGJBc3NpZ25Db2RlcygmKHMtPmNvZGVbdF1bMF0pLCAmKHMtPmxlblt0XVswXSksIG1pbkxlbiwgbWF4TGVuLCBhbHBoYVNpemUpOworCX0KKworCS8qLS0tIFRyYW5zbWl0IHRoZSBtYXBwaW5nIHRhYmxlLiAtLS0qLworCXsKKwkJLyogYmJveDogb3B0aW1pemVkIGEgYml0IG1vcmUgdGhhbiBpbiBiemlwMiAqLworCQlpbnQgaW5Vc2UxNiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoc2l6ZW9mKGxvbmcpIDw9IDQpIHsKKwkJCQlpblVzZTE2ID0gaW5Vc2UxNioyICsKKwkJCQkJKCgqKHVpbnQzMl90KikmKHMtPmluVXNlW2kgKiAxNiArIDBdKQorCQkJCQl8ICoodWludDMyX3QqKSYocy0+aW5Vc2VbaSAqIDE2ICsgNF0pCisJCQkJCXwgKih1aW50MzJfdCopJihzLT5pblVzZVtpICogMTYgKyA4XSkKKwkJCQkJfCAqKHVpbnQzMl90KikmKHMtPmluVXNlW2kgKiAxNiArIDEyXSkpICE9IDApOworCQkJfSBlbHNlIHsgLyogT3VyIENQVSBjYW4gZG8gYmV0dGVyICovCisJCQkJaW5Vc2UxNiA9IGluVXNlMTYqMiArCisJCQkJCSgoKih1aW50NjRfdCopJihzLT5pblVzZVtpICogMTYgKyAwXSkKKwkJCQkJfCAqKHVpbnQ2NF90KikmKHMtPmluVXNlW2kgKiAxNiArIDhdKSkgIT0gMCk7CisJCQl9CisJCX0KKworCQlic1cocywgMTYsIGluVXNlMTYpOworCisJCWluVXNlMTYgPDw9IChzaXplb2YoaW50KSo4IC0gMTYpOyAvKiBtb3ZlIDE1dGggYml0IGludG8gc2lnbiBiaXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWlmIChpblVzZTE2IDwgMCkgeworCQkJCXVuc2lnbmVkIHYxNiA9IDA7CisJCQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCQkJCXYxNiA9IHYxNioyICsgcy0+aW5Vc2VbaSAqIDE2ICsgal07CisJCQkJYnNXKHMsIDE2LCB2MTYpOworCQkJfQorCQkJaW5Vc2UxNiA8PD0gMTsKKwkJfQorCX0KKworCS8qLS0tIE5vdyB0aGUgc2VsZWN0b3JzLiAtLS0qLworCWJzVyhzLCAzLCBuR3JvdXBzKTsKKwlic1cocywgMTUsIG5TZWxlY3RvcnMpOworCWZvciAoaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHMtPnNlbGVjdG9yTXRmW2ldOyBqKyspCisJCQlic1cocywgMSwgMSk7CisJCWJzVyhzLCAxLCAwKTsKKwl9CisKKwkvKi0tLSBOb3cgdGhlIGNvZGluZyB0YWJsZXMuIC0tLSovCisJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgeworCQlpbnQzMl90IGN1cnIgPSBzLT5sZW5bdF1bMF07CisJCWJzVyhzLCA1LCBjdXJyKTsKKwkJZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisJCQl3aGlsZSAoY3VyciA8IHMtPmxlblt0XVtpXSkgeyBic1cocywgMiwgMik7IGN1cnIrKzsgLyogMTAgKi8gfTsKKwkJCXdoaWxlIChjdXJyID4gcy0+bGVuW3RdW2ldKSB7IGJzVyhzLCAyLCAzKTsgY3Vyci0tOyAvKiAxMSAqLyB9OworCQkJYnNXKHMsIDEsIDApOworCQl9CisJfQorCisJLyotLS0gQW5kIGZpbmFsbHksIHRoZSBibG9jayBkYXRhIHByb3BlciAtLS0qLworCXNlbEN0ciA9IDA7CisJZ3MgPSAwOworCXdoaWxlICgxKSB7CisJCWlmIChncyA+PSBzLT5uTVRGKQorCQkJYnJlYWs7CisJCWdlID0gZ3MgKyBCWl9HX1NJWkUgLSAxOworCQlpZiAoZ2UgPj0gcy0+bk1URikKKwkJCWdlID0gcy0+bk1URi0xOworCQlBc3NlcnRIKHMtPnNlbGVjdG9yW3NlbEN0cl0gPCBuR3JvdXBzLCAzMDA2KTsKKworLyogQ29zdHMgMTMwMCBieXRlcyBhbmQgaXMgX3Nsb3dlcl8gKG9uIEludGVsIENvcmUgMikgKi8KKyNpZiAwCisJCWlmIChuR3JvdXBzID09IDYgJiYgNTAgPT0gZ2UtZ3MrMSkgeworCQkJLyotLS0gZmFzdCB0cmFjayB0aGUgY29tbW9uIGNhc2UgLS0tKi8KKwkJCXVpbnQxNl90IG10ZnZfaTsKKwkJCXVpbnQ4X3QqIHNfbGVuX3NlbF9zZWxDdHIgID0gJihzLT5sZW5bcy0+c2VsZWN0b3Jbc2VsQ3RyXV1bMF0pOworCQkJaW50MzJfdCogc19jb2RlX3NlbF9zZWxDdHIgPSAmKHMtPmNvZGVbcy0+c2VsZWN0b3Jbc2VsQ3RyXV1bMF0pOworI2RlZmluZSBCWl9JVEFIKG5uKSBcCisJbXRmdl9pID0gbXRmdltncysobm4pXTsgXAorCWJzVyhzLCBzX2xlbl9zZWxfc2VsQ3RyW210ZnZfaV0sIHNfY29kZV9zZWxfc2VsQ3RyW210ZnZfaV0pCisJCQlCWl9JVEFIKDApOyAgQlpfSVRBSCgxKTsgIEJaX0lUQUgoMik7ICBCWl9JVEFIKDMpOyAgQlpfSVRBSCg0KTsKKwkJCUJaX0lUQUgoNSk7ICBCWl9JVEFIKDYpOyAgQlpfSVRBSCg3KTsgIEJaX0lUQUgoOCk7ICBCWl9JVEFIKDkpOworCQkJQlpfSVRBSCgxMCk7IEJaX0lUQUgoMTEpOyBCWl9JVEFIKDEyKTsgQlpfSVRBSCgxMyk7IEJaX0lUQUgoMTQpOworCQkJQlpfSVRBSCgxNSk7IEJaX0lUQUgoMTYpOyBCWl9JVEFIKDE3KTsgQlpfSVRBSCgxOCk7IEJaX0lUQUgoMTkpOworCQkJQlpfSVRBSCgyMCk7IEJaX0lUQUgoMjEpOyBCWl9JVEFIKDIyKTsgQlpfSVRBSCgyMyk7IEJaX0lUQUgoMjQpOworCQkJQlpfSVRBSCgyNSk7IEJaX0lUQUgoMjYpOyBCWl9JVEFIKDI3KTsgQlpfSVRBSCgyOCk7IEJaX0lUQUgoMjkpOworCQkJQlpfSVRBSCgzMCk7IEJaX0lUQUgoMzEpOyBCWl9JVEFIKDMyKTsgQlpfSVRBSCgzMyk7IEJaX0lUQUgoMzQpOworCQkJQlpfSVRBSCgzNSk7IEJaX0lUQUgoMzYpOyBCWl9JVEFIKDM3KTsgQlpfSVRBSCgzOCk7IEJaX0lUQUgoMzkpOworCQkJQlpfSVRBSCg0MCk7IEJaX0lUQUgoNDEpOyBCWl9JVEFIKDQyKTsgQlpfSVRBSCg0Myk7IEJaX0lUQUgoNDQpOworCQkJQlpfSVRBSCg0NSk7IEJaX0lUQUgoNDYpOyBCWl9JVEFIKDQ3KTsgQlpfSVRBSCg0OCk7IEJaX0lUQUgoNDkpOworI3VuZGVmIEJaX0lUQUgKKwkJCWdzID0gZ2UrMTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJLyotLS0gc2xvdyB2ZXJzaW9uIHdoaWNoIGNvcnJlY3RseSBoYW5kbGVzIGFsbCBzaXR1YXRpb25zIC0tLSovCisJCQkvKiBjb2RlIGlzIGJpdCBiaWdnZXIsIGJ1dCBtb3ZlcyBtdWx0aXBseSBvdXQgb2YgdGhlIGxvb3AgKi8KKwkJCXVpbnQ4X3QqIHNfbGVuX3NlbF9zZWxDdHIgID0gJihzLT5sZW4gW3MtPnNlbGVjdG9yW3NlbEN0cl1dWzBdKTsKKwkJCWludDMyX3QqIHNfY29kZV9zZWxfc2VsQ3RyID0gJihzLT5jb2RlW3MtPnNlbGVjdG9yW3NlbEN0cl1dWzBdKTsKKwkJCXdoaWxlIChncyA8PSBnZSkgeworCQkJCWJzVyhzLAorCQkJCQlzX2xlbl9zZWxfc2VsQ3RyW210ZnZbZ3NdXSwKKwkJCQkJc19jb2RlX3NlbF9zZWxDdHJbbXRmdltnc11dCisJCQkJKTsKKwkJCQlncysrOworCQkJfQorCQkJLyogYWxyZWFkeSBpczogZ3MgPSBnZSsxOyAqLworCQl9CisJCXNlbEN0cisrOworCX0KKwlBc3NlcnRIKHNlbEN0ciA9PSBuU2VsZWN0b3JzLCAzMDA3KTsKKyN1bmRlZiBjb2RlCisjdW5kZWYgcmZyZXEKKyN1bmRlZiBsZW5fcGFjaworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBCWjJfY29tcHJlc3NCbG9jayhFU3RhdGUqIHMsIGludCBpc19sYXN0X2Jsb2NrKQoreworCWlmIChzLT5uYmxvY2sgPiAwKSB7CisJCUJaX0ZJTkFMSVNFX0NSQyhzLT5ibG9ja0NSQyk7CisJCXMtPmNvbWJpbmVkQ1JDID0gKHMtPmNvbWJpbmVkQ1JDIDw8IDEpIHwgKHMtPmNvbWJpbmVkQ1JDID4+IDMxKTsKKwkJcy0+Y29tYmluZWRDUkMgXj0gcy0+YmxvY2tDUkM7CisJCWlmIChzLT5ibG9ja05vID4gMSkKKwkJCXMtPm51bVogPSAwOworCisJCUJaMl9ibG9ja1NvcnQocyk7CisJfQorCisJcy0+emJpdHMgPSAmKCh1aW50OF90KilzLT5hcnIyKVtzLT5uYmxvY2tdOworCisJLyotLSBJZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaywgY3JlYXRlIHRoZSBzdHJlYW0gaGVhZGVyLiAtLSovCisJaWYgKHMtPmJsb2NrTm8gPT0gMSkgeworCQlCWjJfYnNJbml0V3JpdGUocyk7CisJCS8qYnNQdXRVOChzLCBCWl9IRFJfQik7Ki8KKwkJLypic1B1dFU4KHMsIEJaX0hEUl9aKTsqLworCQkvKmJzUHV0VTgocywgQlpfSERSX2gpOyovCisJCS8qYnNQdXRVOChzLCBCWl9IRFJfMCArIHMtPmJsb2NrU2l6ZTEwMGspOyovCisJCWJzUHV0VTMyKHMsIEJaX0hEUl9CWmgwICsgcy0+YmxvY2tTaXplMTAwayk7CisJfQorCisJaWYgKHMtPm5ibG9jayA+IDApIHsKKwkJLypic1B1dFU4KHMsIDB4MzEpOyovCisJCS8qYnNQdXRVOChzLCAweDQxKTsqLworCQkvKmJzUHV0VTgocywgMHg1OSk7Ki8KKwkJLypic1B1dFU4KHMsIDB4MjYpOyovCisJCWJzUHV0VTMyKHMsIDB4MzE0MTU5MjYpOworCQkvKmJzUHV0VTgocywgMHg1Myk7Ki8KKwkJLypic1B1dFU4KHMsIDB4NTkpOyovCisJCWJzUHV0VTE2KHMsIDB4NTM1OSk7CisKKwkJLyotLSBOb3cgdGhlIGJsb2NrJ3MgQ1JDLCBzbyBpdCBpcyBpbiBhIGtub3duIHBsYWNlLiAtLSovCisJCWJzUHV0VTMyKHMsIHMtPmJsb2NrQ1JDKTsKKworCQkvKgorCQkgKiBOb3cgYSBzaW5nbGUgYml0IGluZGljYXRpbmcgKG5vbi0pcmFuZG9taXNhdGlvbi4KKwkJICogQXMgb2YgdmVyc2lvbiAwLjkuNSwgd2UgdXNlIGEgYmV0dGVyIHNvcnRpbmcgYWxnb3JpdGhtCisJCSAqIHdoaWNoIG1ha2VzIHJhbmRvbWlzYXRpb24gdW5uZWNlc3NhcnkuICBTbyBhbHdheXMgc2V0CisJCSAqIHRoZSByYW5kb21pc2VkIGJpdCB0byAnbm8nLiAgT2YgY291cnNlLCB0aGUgZGVjb2RlcgorCQkgKiBzdGlsbCBuZWVkcyB0byBiZSBhYmxlIHRvIGhhbmRsZSByYW5kb21pc2VkIGJsb2NrcworCQkgKiBzbyBhcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCisJCSAqIG9sZGVyIHZlcnNpb25zIG9mIGJ6aXAyLgorCQkgKi8KKwkJYnNXKHMsIDEsIDApOworCisJCWJzVyhzLCAyNCwgcy0+b3JpZ1B0cik7CisJCWdlbmVyYXRlTVRGVmFsdWVzKHMpOworCQlzZW5kTVRGVmFsdWVzKHMpOworCX0KKworCS8qLS0gSWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jaywgYWRkIHRoZSBzdHJlYW0gdHJhaWxlci4gLS0qLworCWlmIChpc19sYXN0X2Jsb2NrKSB7CisJCS8qYnNQdXRVOChzLCAweDE3KTsqLworCQkvKmJzUHV0VTgocywgMHg3Mik7Ki8KKwkJLypic1B1dFU4KHMsIDB4NDUpOyovCisJCS8qYnNQdXRVOChzLCAweDM4KTsqLworCQlic1B1dFUzMihzLCAweDE3NzI0NTM4KTsKKwkJLypic1B1dFU4KHMsIDB4NTApOyovCisJCS8qYnNQdXRVOChzLCAweDkwKTsqLworCQlic1B1dFUxNihzLCAweDUwOTApOworCQlic1B1dFUzMihzLCBzLT5jb21iaW5lZENSQyk7CisJCWJzRmluaXNoV3JpdGUocyk7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3MuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovaHVmZm1hbi5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9odWZmbWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2YjFhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovaHVmZm1hbi5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogYnppcDIgaXMgd3JpdHRlbiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBIdWZmbWFuIGNvZGluZyBsb3ctbGV2ZWwgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhlCitSRUFETUUgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRUlHSFRPRih6ejApICAoKHp6MCkgJiAweGZmZmZmZjAwKQorI2RlZmluZSBERVBUSE9GKHp6MSkgICAoKHp6MSkgJiAweDAwMDAwMGZmKQorI2RlZmluZSBNWU1BWCh6ejIsenozKSAoKHp6MikgPiAoenozKSA/ICh6ejIpIDogKHp6MykpCisKKyNkZWZpbmUgQUREV0VJR0hUUyh6dzEsencyKSBcCisJKFdFSUdIVE9GKHp3MSkrV0VJR0hUT0YoencyKSkgfCBcCisJKDEgKyBNWU1BWChERVBUSE9GKHp3MSksREVQVEhPRih6dzIpKSkKKworI2RlZmluZSBVUEhFQVAoeikgXAoreyBcCisJaW50MzJfdCB6eiwgdG1wOyBcCisJenogPSB6OyBcCisJdG1wID0gaGVhcFt6el07IFwKKwl3aGlsZSAod2VpZ2h0W3RtcF0gPCB3ZWlnaHRbaGVhcFt6eiA+PiAxXV0pIHsgXAorCQloZWFwW3p6XSA9IGhlYXBbenogPj4gMV07IFwKKwkJenogPj49IDE7IFwKKwl9IFwKKwloZWFwW3p6XSA9IHRtcDsgXAorfQorCisKKy8qIDkwIGJ5dGVzLCAwLjMlIG9mIG92ZXJhbGwgY29tcHJlc3Mgc3BlZWQgKi8KKyNpZiBDT05GSUdfQlpJUDJfRkVBVFVSRV9TUEVFRCA+PSAxCisKKy8qIG1hY3JvIHdvcmtzIGJldHRlciB0aGFuIGlubGluZSAoZ2NjIDQuMi4xKSAqLworI2RlZmluZSBET1dOSEVBUDEoaGVhcCwgd2VpZ2h0LCBIZWFwKSBcCit7IFwKKwlpbnQzMl90IHp6LCB5eSwgdG1wOyBcCisJenogPSAxOyBcCisJdG1wID0gaGVhcFt6el07IFwKKwl3aGlsZSAoMSkgeyBcCisJCXl5ID0genogPDwgMTsgXAorCQlpZiAoeXkgPiBuSGVhcCkgXAorCQkJYnJlYWs7IFwKKwkJaWYgKHl5IDwgbkhlYXAgXAorCQkgJiYgd2VpZ2h0W2hlYXBbeXkrMV1dIDwgd2VpZ2h0W2hlYXBbeXldXSkgXAorCQkJeXkrKzsgXAorCQlpZiAod2VpZ2h0W3RtcF0gPCB3ZWlnaHRbaGVhcFt5eV1dKSBcCisJCQlicmVhazsgXAorCQloZWFwW3p6XSA9IGhlYXBbeXldOyBcCisJCXp6ID0geXk7IFwKKwl9IFwKKwloZWFwW3p6XSA9IHRtcDsgXAorfQorCisjZWxzZQorCitzdGF0aWMKK3ZvaWQgRE9XTkhFQVAxKGludDMyX3QgKmhlYXAsIGludDMyX3QgKndlaWdodCwgaW50MzJfdCBuSGVhcCkKK3sKKwlpbnQzMl90IHp6LCB5eSwgdG1wOworCXp6ID0gMTsKKwl0bXAgPSBoZWFwW3p6XTsKKwl3aGlsZSAoMSkgeworCQl5eSA9IHp6IDw8IDE7CisJCWlmICh5eSA+IG5IZWFwKQorCQkJYnJlYWs7CisJCWlmICh5eSA8IG5IZWFwCisJCSAmJiB3ZWlnaHRbaGVhcFt5eSArIDFdXSA8IHdlaWdodFtoZWFwW3l5XV0pCisJCQl5eSsrOworCQlpZiAod2VpZ2h0W3RtcF0gPCB3ZWlnaHRbaGVhcFt5eV1dKQorCQkJYnJlYWs7CisJCWhlYXBbenpdID0gaGVhcFt5eV07CisJCXp6ID0geXk7CisJfQorCWhlYXBbenpdID0gdG1wOworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIEJaMl9oYk1ha2VDb2RlTGVuZ3RocyhFU3RhdGUgKnMsCisJCXVpbnQ4X3QgKmxlbiwKKwkJaW50MzJfdCAqZnJlcSwKKwkJaW50MzJfdCBhbHBoYVNpemUsCisJCWludDMyX3QgbWF4TGVuKQoreworCS8qCisJICogTm9kZXMgYW5kIGhlYXAgZW50cmllcyBydW4gZnJvbSAxLiAgRW50cnkgMAorCSAqIGZvciBib3RoIHRoZSBoZWFwIGFuZCBub2RlcyBpcyBhIHNlbnRpbmVsLgorCSAqLworCWludDMyX3Qgbk5vZGVzLCBuSGVhcCwgbjEsIG4yLCBpLCBqLCBrOworCUJvb2wgIHRvb0xvbmc7CisKKwkvKiBiYm94OiBtb3ZlZCB0byBFU3RhdGUgdG8gc2F2ZSBzdGFjaworCWludDMyX3QgaGVhcCAgW0JaX01BWF9BTFBIQV9TSVpFICsgMl07CisJaW50MzJfdCB3ZWlnaHRbQlpfTUFYX0FMUEhBX1NJWkUgKiAyXTsKKwlpbnQzMl90IHBhcmVudFtCWl9NQVhfQUxQSEFfU0laRSAqIDJdOworCSovCisjZGVmaW5lIGhlYXAgICAocy0+QloyX2hiTWFrZUNvZGVMZW5ndGhzX19oZWFwKQorI2RlZmluZSB3ZWlnaHQgKHMtPkJaMl9oYk1ha2VDb2RlTGVuZ3Roc19fd2VpZ2h0KQorI2RlZmluZSBwYXJlbnQgKHMtPkJaMl9oYk1ha2VDb2RlTGVuZ3Roc19fcGFyZW50KQorCisJZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKQorCQl3ZWlnaHRbaSsxXSA9IChmcmVxW2ldID09IDAgPyAxIDogZnJlcVtpXSkgPDwgODsKKworCXdoaWxlICgxKSB7CisJCW5Ob2RlcyA9IGFscGhhU2l6ZTsKKwkJbkhlYXAgPSAwOworCisJCWhlYXBbMF0gPSAwOworCQl3ZWlnaHRbMF0gPSAwOworCQlwYXJlbnRbMF0gPSAtMjsKKworCQlmb3IgKGkgPSAxOyBpIDw9IGFscGhhU2l6ZTsgaSsrKSB7CisJCQlwYXJlbnRbaV0gPSAtMTsKKwkJCW5IZWFwKys7CisJCQloZWFwW25IZWFwXSA9IGk7CisJCQlVUEhFQVAobkhlYXApOworCQl9CisKKwkJQXNzZXJ0SChuSGVhcCA8IChCWl9NQVhfQUxQSEFfU0laRSsyKSwgMjAwMSk7CisKKwkJd2hpbGUgKG5IZWFwID4gMSkgeworCQkJbjEgPSBoZWFwWzFdOyBoZWFwWzFdID0gaGVhcFtuSGVhcF07IG5IZWFwLS07IERPV05IRUFQMShoZWFwLCB3ZWlnaHQsIG5IZWFwKTsKKwkJCW4yID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUDEoaGVhcCwgd2VpZ2h0LCBuSGVhcCk7CisJCQluTm9kZXMrKzsKKwkJCXBhcmVudFtuMV0gPSBwYXJlbnRbbjJdID0gbk5vZGVzOworCQkJd2VpZ2h0W25Ob2Rlc10gPSBBRERXRUlHSFRTKHdlaWdodFtuMV0sIHdlaWdodFtuMl0pOworCQkJcGFyZW50W25Ob2Rlc10gPSAtMTsKKwkJCW5IZWFwKys7CisJCQloZWFwW25IZWFwXSA9IG5Ob2RlczsKKwkJCVVQSEVBUChuSGVhcCk7CisJCX0KKworCQlBc3NlcnRIKG5Ob2RlcyA8IChCWl9NQVhfQUxQSEFfU0laRSAqIDIpLCAyMDAyKTsKKworCQl0b29Mb25nID0gRmFsc2U7CisJCWZvciAoaSA9IDE7IGkgPD0gYWxwaGFTaXplOyBpKyspIHsKKwkJCWogPSAwOworCQkJayA9IGk7CisJCQl3aGlsZSAocGFyZW50W2tdID49IDApIHsKKwkJCQlrID0gcGFyZW50W2tdOworCQkJCWorKzsKKwkJCX0KKwkJCWxlbltpLTFdID0gajsKKwkJCWlmIChqID4gbWF4TGVuKQorCQkJCXRvb0xvbmcgPSBUcnVlOworCQl9CisKKwkJaWYgKCF0b29Mb25nKQorCQkJYnJlYWs7CisKKwkJLyogMTcgT2N0IDA0OiBrZWVwLWdvaW5nIGNvbmRpdGlvbiBmb3IgdGhlIGZvbGxvd2luZyBsb29wIHVzZWQKKwkJdG8gYmUgJ2kgPCBhbHBoYVNpemUnLCB3aGljaCBtaXNzZWQgdGhlIGxhc3QgZWxlbWVudCwKKwkJdGhlb3JldGljYWxseSBsZWFkaW5nIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiB0aGUgY29tcHJlc3NvcgorCQlsb29waW5nLiAgSG93ZXZlciwgdGhpcyBjb3VudC1zY2FsaW5nIHN0ZXAgaXMgb25seSBuZWVkZWQgaWYKKwkJb25lIG9mIHRoZSBnZW5lcmF0ZWQgSHVmZm1hbiBjb2RlIHdvcmRzIGlzIGxvbmdlciB0aGFuCisJCW1heExlbiwgd2hpY2ggdXAgdG8gYW5kIGluY2x1ZGluZyB2ZXJzaW9uIDEuMC4yIHdhcyAyMCBiaXRzLAorCQl3aGljaCBpcyBleHRyZW1lbHkgdW5saWtlbHkuICBJbiB2ZXJzaW9uIDEuMC4zIG1heExlbiB3YXMKKwkJY2hhbmdlZCB0byAxNyBiaXRzLCB3aGljaCBoYXMgbWluaW1hbCBlZmZlY3Qgb24gY29tcHJlc3Npb24KKwkJcmF0aW8sIGJ1dCBkb2VzIG1lYW4gdGhpcyBzY2FsaW5nIHN0ZXAgaXMgdXNlZCBmcm9tIHRpbWUgdG8KKwkJdGltZSwgZW5vdWdoIHRvIHZlcmlmeSB0aGF0IGl0IHdvcmtzLgorCisJCVRoaXMgbWVhbnMgdGhhdCBiemlwMi0xLjAuMyBhbmQgbGF0ZXIgd2lsbCBvbmx5IHByb2R1Y2UKKwkJSHVmZm1hbiBjb2RlcyB3aXRoIGEgbWF4aW11bSBsZW5ndGggb2YgMTcgYml0cy4gIEhvd2V2ZXIsIGluCisJCW9yZGVyIHRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggYml0c3RyZWFtcworCQlwcm9kdWNlZCBieSB2ZXJzaW9ucyBwcmUtMS4wLjMsIHRoZSBkZWNvbXByZXNzb3IgbXVzdCBzdGlsbAorCQloYW5kbGUgbGVuZ3RocyBvZiB1cCB0byAyMC4gKi8KKworCQlmb3IgKGkgPSAxOyBpIDw9IGFscGhhU2l6ZTsgaSsrKSB7CisJCQlqID0gd2VpZ2h0W2ldID4+IDg7CisJCQkvKiBiYm94OiB5ZXMsIGl0IGlzIGEgc2lnbmVkIGRpdmlzaW9uLgorCQkJICogZG9uJ3QgcmVwbGFjZSB3aXRoIHNoaWZ0ISAqLworCQkJaiA9IDEgKyAoaiAvIDIpOworCQkJd2VpZ2h0W2ldID0gaiA8PCA4OworCQl9CisJfQorI3VuZGVmIGhlYXAKKyN1bmRlZiB3ZWlnaHQKKyN1bmRlZiBwYXJlbnQKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgQloyX2hiQXNzaWduQ29kZXMoaW50MzJfdCAqY29kZSwKKwkJdWludDhfdCAqbGVuZ3RoLAorCQlpbnQzMl90IG1pbkxlbiwKKwkJaW50MzJfdCBtYXhMZW4sCisJCWludDMyX3QgYWxwaGFTaXplKQoreworCWludDMyX3QgbiwgdmVjLCBpOworCisJdmVjID0gMDsKKwlmb3IgKG4gPSBtaW5MZW47IG4gPD0gbWF4TGVuOyBuKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisJCQlpZiAobGVuZ3RoW2ldID09IG4pIHsKKwkJCQljb2RlW2ldID0gdmVjOworCQkJCXZlYysrOworCQkJfTsKKwkJfQorCQl2ZWMgPDw9IDE7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW4uYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9hbGlnbi5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2FsaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1NmZhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9hbGlnbi5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBkYXRhX2FsaWduKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlLCB1bnNpZ25lZCBib3VuZGFyeSkKK3sKKwl1bnNpZ25lZCBza2lwX2Ftb3VudCA9IChib3VuZGFyeSAtIChhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICUgYm91bmRhcnkpKSAlIGJvdW5kYXJ5OworCisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgc2tpcF9hbW91bnQpOworCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gc2tpcF9hbW91bnQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF9hbGwuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9leHRyYWN0X2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjVjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF9hbGwuYwpAQCAtMCwwICsxLDIwMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfZXh0cmFjdF9hbGwoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXI7CisJaW50IGRzdF9mZDsKKwlpbnQgcmVzOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1NFTElOVVgKKwljaGFyICpzY3R4ID0gYXJjaGl2ZV9oYW5kbGUtPnRhcl9fbmV4dF9maWxlX3NjdHg7CisJaWYgKCFzY3R4KQorCQlzY3R4ID0gYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZ2xvYmFsX3NjdHg7CisJaWYgKHNjdHgpIHsgLyogc2V0ZnNjcmVhdGVjb24gaXMgNCBzeXNjYWxscywgYXZvaWQgaWYgcG9zc2libGUgKi8KKwkJc2V0ZnNjcmVhdGVjb24oc2N0eCk7CisJCWZyZWUoYXJjaGl2ZV9oYW5kbGUtPnRhcl9fbmV4dF9maWxlX3NjdHgpOworCQlhcmNoaXZlX2hhbmRsZS0+dGFyX19uZXh0X2ZpbGVfc2N0eCA9IE5VTEw7CisJfQorI2VuZGlmCisKKwlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9DUkVBVEVfTEVBRElOR19ESVJTKSB7CisJCWNoYXIgKnNsYXNoID0gc3RycmNocihmaWxlX2hlYWRlci0+bmFtZSwgJy8nKTsKKwkJaWYgKHNsYXNoKSB7CisJCQkqc2xhc2ggPSAnXDAnOworCQkJYmJfbWFrZV9kaXJlY3RvcnkoZmlsZV9oZWFkZXItPm5hbWUsIC0xLCBGSUxFVVRJTFNfUkVDVVIpOworCQkJKnNsYXNoID0gJy8nOworCQl9CisJfQorCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfVU5MSU5LX09MRCkgeworCQkvKiBSZW1vdmUgdGhlIGVudHJ5IGlmIGl0IGV4aXN0cyAqLworCQlpZiAoIVNfSVNESVIoZmlsZV9oZWFkZXItPm1vZGUpKSB7CisJCQkvKiBJcyBpdCBoYXJkbGluaz8KKwkJCSAqIFdlIGVuY29kZSBoYXJkIGxpbmtzIGFzIHJlZ3VsYXIgZmlsZXMgb2Ygc2l6ZSAwIHdpdGggYSBzeW1saW5rICovCisJCQlpZiAoU19JU1JFRyhmaWxlX2hlYWRlci0+bW9kZSkKKwkJCSAmJiBmaWxlX2hlYWRlci0+bGlua190YXJnZXQKKwkJCSAmJiBmaWxlX2hlYWRlci0+c2l6ZSA9PSAwCisJCQkpIHsKKwkJCQkvKiBVZ2x5IHNwZWNpYWwgY2FzZToKKwkJCQkgKiB0YXIgY2YgdC50YXIgaGFyZGxpbmsxIGhhcmRsaW5rMiBoYXJkbGluazEKKwkJCQkgKiByZXN1bHRzIGluIHRoaXMgdGFyYmFsbCBzdHJ1Y3R1cmU6CisJCQkJICogaGFyZGxpbmsxCisJCQkJICogaGFyZGxpbmsyIC0+IGhhcmRsaW5rMQorCQkJCSAqIGhhcmRsaW5rMSAtPiBoYXJkbGluazEgPD09ICEhIQorCQkJCSAqLworCQkJCWlmIChzdHJjbXAoZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0LCBmaWxlX2hlYWRlci0+bmFtZSkgPT0gMCkKKwkJCQkJZ290byByZXQ7CisJCQl9CisJCQkvKiBQcm9jZWVkIHdpdGggZGVsZXRpbmcgKi8KKwkJCWlmICh1bmxpbmsoZmlsZV9oZWFkZXItPm5hbWUpID09IC0xCisJCQkgJiYgZXJybm8gIT0gRU5PRU5UCisJCQkpIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlbW92ZSBvbGQgZmlsZSAlcyIsCisJCQkJCQlmaWxlX2hlYWRlci0+bmFtZSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX05FV0VSKSB7CisJCS8qIFJlbW92ZSB0aGUgZXhpc3RpbmcgZW50cnkgaWYgaXRzIG9sZGVyIHRoYW4gdGhlIGV4dHJhY3RlZCBlbnRyeSAqLworCQlzdHJ1Y3Qgc3RhdCBleGlzdGluZ19zYjsKKwkJaWYgKGxzdGF0KGZpbGVfaGVhZGVyLT5uYW1lLCAmZXhpc3Rpbmdfc2IpID09IC0xKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdGF0IG9sZCBmaWxlIik7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoZXhpc3Rpbmdfc2Iuc3RfbXRpbWUgPj0gZmlsZV9oZWFkZXItPm10aW1lKSB7CisJCQlpZiAoIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0VYVFJBQ1RfUVVJRVQpCisJCQkgJiYgIVNfSVNESVIoZmlsZV9oZWFkZXItPm1vZGUpCisJCQkpIHsKKwkJCQliYl9lcnJvcl9tc2coIiVzIG5vdCBjcmVhdGVkOiBuZXdlciBvciAiCisJCQkJCSJzYW1lIGFnZSBmaWxlIGV4aXN0cyIsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJCX0KKwkJCWRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZSk7CisJCQlnb3RvIHJldDsKKwkJfQorCQllbHNlIGlmICgodW5saW5rKGZpbGVfaGVhZGVyLT5uYW1lKSA9PSAtMSkgJiYgKGVycm5vICE9IEVJU0RJUikpIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVtb3ZlIG9sZCBmaWxlICVzIiwKKwkJCQkJZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJfQorCisJLyogSGFuZGxlIGhhcmQgbGlua3Mgc2VwYXJhdGVseQorCSAqIFdlIGVuY29kZSBoYXJkIGxpbmtzIGFzIHJlZ3VsYXIgZmlsZXMgb2Ygc2l6ZSAwIHdpdGggYSBzeW1saW5rICovCisJaWYgKFNfSVNSRUcoZmlsZV9oZWFkZXItPm1vZGUpCisJICYmIGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldAorCSAmJiBmaWxlX2hlYWRlci0+c2l6ZSA9PSAwCisJKSB7CisJCS8qIGhhcmQgbGluayAqLworCQlyZXMgPSBsaW5rKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCwgZmlsZV9oZWFkZXItPm5hbWUpOworCQlpZiAoKHJlcyA9PSAtMSkgJiYgIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0VYVFJBQ1RfUVVJRVQpKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJXNsaW5rICIKKwkJCQkJImZyb20gJXMgdG8gJXMiLCAiaGFyZCIsCisJCQkJCWZpbGVfaGVhZGVyLT5uYW1lLAorCQkJCQlmaWxlX2hlYWRlci0+bGlua190YXJnZXQpOworCQl9CisJCS8qIEhhcmRsaW5rcyBoYXZlIG5vIHNlcGFyYXRlIG1vZGUvb3duZXJzaGlwLCBza2lwIGNob3duL2NobW9kICovCisJCWdvdG8gcmV0OworCX0KKworCS8qIENyZWF0ZSB0aGUgZmlsZXN5c3RlbSBlbnRyeSAqLworCXN3aXRjaCAoZmlsZV9oZWFkZXItPm1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6IHsKKwkJLyogUmVndWxhciBmaWxlICovCisJCWludCBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTDsKKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfT19UUlVOQykKKwkJCWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwkJZHN0X2ZkID0geG9wZW4zKGZpbGVfaGVhZGVyLT5uYW1lLAorCQkJZmxhZ3MsCisJCQlmaWxlX2hlYWRlci0+bW9kZQorCQkJKTsKKwkJYmJfY29weWZkX2V4YWN0X3NpemUoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgZHN0X2ZkLCBmaWxlX2hlYWRlci0+c2l6ZSk7CisJCWNsb3NlKGRzdF9mZCk7CisJCWJyZWFrOworCX0KKwljYXNlIFNfSUZESVI6CisJCXJlcyA9IG1rZGlyKGZpbGVfaGVhZGVyLT5uYW1lLCBmaWxlX2hlYWRlci0+bW9kZSk7CisJCWlmICgocmVzID09IC0xKQorCQkgJiYgKGVycm5vICE9IEVJU0RJUikgLyogYnR3LCBMaW51eCBkb2Vzbid0IHJldHVybiB0aGlzICovCisJCSAmJiAoZXJybm8gIT0gRUVYSVNUKQorCQkgJiYgIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0VYVFJBQ1RfUVVJRVQpCisJCSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgbWFrZSBkaXIgJXMiLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQkvKiBTeW1saW5rICovCisvL1RPRE86IHdoYXQgaWYgZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID09IE5VTEwgKHNheSwgY29ycnVwdGVkIHRhcmJhbGw/KQorCQlyZXMgPSBzeW1saW5rKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCwgZmlsZV9oZWFkZXItPm5hbWUpOworCQlpZiAoKHJlcyA9PSAtMSkKKwkJICYmICEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKQorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSAlc2xpbmsgIgorCQkJCSJmcm9tICVzIHRvICVzIiwgInN5bSIsCisJCQkJZmlsZV9oZWFkZXItPm5hbWUsCisJCQkJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNfSUZTT0NLOgorCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZDSFI6CisJY2FzZSBTX0lGSUZPOgorCQlyZXMgPSBta25vZChmaWxlX2hlYWRlci0+bmFtZSwgZmlsZV9oZWFkZXItPm1vZGUsIGZpbGVfaGVhZGVyLT5kZXZpY2UpOworCQlpZiAoKHJlcyA9PSAtMSkKKwkJICYmICEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKQorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBub2RlICVzIiwgZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnJlY29nbml6ZWQgZmlsZSB0eXBlIik7CisJfQorCisJaWYgKCFTX0lTTE5LKGZpbGVfaGVhZGVyLT5tb2RlKSkgeworCQlpZiAoIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0RPTlRfUkVTVE9SRV9PV05FUikpIHsKKwkJCXVpZF90IHVpZCA9IGZpbGVfaGVhZGVyLT51aWQ7CisJCQlnaWRfdCBnaWQgPSBmaWxlX2hlYWRlci0+Z2lkOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCQkJaWYgKCEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9OVU1FUklDX09XTkVSKSkgeworCQkJCWlmIChmaWxlX2hlYWRlci0+dGFyX191bmFtZSkgeworLy9UT0RPOiBjYWNoZSBsYXN0IG5hbWUvaWQgcGFpcj8KKwkJCQkJc3RydWN0IHBhc3N3ZCAqcHdkID0gZ2V0cHduYW0oZmlsZV9oZWFkZXItPnRhcl9fdW5hbWUpOworCQkJCQlpZiAocHdkKSB1aWQgPSBwd2QtPnB3X3VpZDsKKwkJCQl9CisJCQkJaWYgKGZpbGVfaGVhZGVyLT50YXJfX2duYW1lKSB7CisJCQkJCXN0cnVjdCBncm91cCAqZ3JwID0gZ2V0Z3JuYW0oZmlsZV9oZWFkZXItPnRhcl9fZ25hbWUpOworCQkJCQlpZiAoZ3JwKSBnaWQgPSBncnAtPmdyX2dpZDsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCS8qIEdOVSB0YXIgMS4xNS4xIHVzZXMgY2hvd24sIG5vdCBsY2hvd24gKi8KKwkJCWNob3duKGZpbGVfaGVhZGVyLT5uYW1lLCB1aWQsIGdpZCk7CisJCX0KKwkJLyogdWNsaWJjIGhhcyBubyBsY2htb2QsIGdsaWJjIGlzIGV2ZW4gc3RyYW5nZXIgLQorCQkgKiBpdCBoYXMgbGNobW9kIHdoaWNoIHNlZW1zIHRvIGRvIG5vdGhpbmchCisJCSAqIHNvIHdlIHVzZSBjaG1vZC4uLiAqLworCQlpZiAoIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0RPTlRfUkVTVE9SRV9QRVJNKSkgeworCQkJY2htb2QoZmlsZV9oZWFkZXItPm5hbWUsIGZpbGVfaGVhZGVyLT5tb2RlKTsKKwkJfQorCQlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9SRVNUT1JFX0RBVEUpIHsKKwkJCXN0cnVjdCB0aW1ldmFsIHRbMl07CisKKwkJCXRbMV0udHZfc2VjID0gdFswXS50dl9zZWMgPSBmaWxlX2hlYWRlci0+bXRpbWU7CisJCQl0WzFdLnR2X3VzZWMgPSB0WzBdLnR2X3VzZWMgPSAwOworCQkJdXRpbWVzKGZpbGVfaGVhZGVyLT5uYW1lLCB0KTsKKwkJfQorCX0KKworIHJldDogOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJaWYgKHNjdHgpIHsKKwkJLyogcmVzZXQgdGhlIGNvbnRleHQgYWZ0ZXIgY3JlYXRpbmcgYW4gZW50cnkgKi8KKwkJc2V0ZnNjcmVhdGVjb24oTlVMTCk7CisJfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19jb21tYW5kLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5NzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9leHRyYWN0X3RvX2NvbW1hbmQuYwpAQCAtMCwwICsxLDEzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK2VudW0geworCS8vVEFSX0ZJTEVUWVBFLAorCVRBUl9NT0RFLAorCVRBUl9GSUxFTkFNRSwKKwlUQVJfUkVBTE5BTUUsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJVEFSX1VOQU1FLAorCVRBUl9HTkFNRSwKKyNlbmRpZgorCVRBUl9TSVpFLAorCVRBUl9VSUQsCisJVEFSX0dJRCwKKwlUQVJfTUFYLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhcl92YXJbXSA9IHsKKwkvLyAiRklMRVRZUEUiLAorCSJNT0RFIiwKKwkiRklMRU5BTUUiLAorCSJSRUFMTkFNRSIsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJIlVOQU1FIiwKKwkiR05BTUUiLAorI2VuZGlmCisJIlNJWkUiLAorCSJVSUQiLAorCSJHSUQiLAorfTsKKworc3RhdGljIHZvaWQgeHB1dGVudihjaGFyICpzdHIpCit7CisJaWYgKHB1dGVudihzdHIpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cjJlbnYoY2hhciAqZW52W10sIGludCBpZHgsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwllbnZbaWR4XSA9IHhhc3ByaW50ZigiVEFSXyVzPSVzIiwgdGFyX3ZhcltpZHhdLCBzdHIpOworCXhwdXRlbnYoZW52W2lkeF0pOworfQorCitzdGF0aWMgdm9pZCBkZWMyZW52KGNoYXIgKmVudltdLCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsKQoreworCWVudltpZHhdID0geGFzcHJpbnRmKCJUQVJfJXM9JWxsdSIsIHRhcl92YXJbaWR4XSwgdmFsKTsKKwl4cHV0ZW52KGVudltpZHhdKTsKK30KKworc3RhdGljIHZvaWQgb2N0MmVudihjaGFyICplbnZbXSwgaW50IGlkeCwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJZW52W2lkeF0gPSB4YXNwcmludGYoIlRBUl8lcz0lbG8iLCB0YXJfdmFyW2lkeF0sIHZhbCk7CisJeHB1dGVudihlbnZbaWR4XSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfZXh0cmFjdF90b19jb21tYW5kKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyOworCisjaWYgMCAvKiBkbyB3ZSBuZWVkIHRoaXM/IEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYICovCisJY2hhciAqc2N0eCA9IGFyY2hpdmVfaGFuZGxlLT50YXJfX25leHRfZmlsZV9zY3R4OworCWlmICghc2N0eCkKKwkJc2N0eCA9IGFyY2hpdmVfaGFuZGxlLT50YXJfX2dsb2JhbF9zY3R4OworCWlmIChzY3R4KSB7IC8qIHNldGZzY3JlYXRlY29uIGlzIDQgc3lzY2FsbHMsIGF2b2lkIGlmIHBvc3NpYmxlICovCisJCXNldGZzY3JlYXRlY29uKHNjdHgpOworCQlmcmVlKGFyY2hpdmVfaGFuZGxlLT50YXJfX25leHRfZmlsZV9zY3R4KTsKKwkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fbmV4dF9maWxlX3NjdHggPSBOVUxMOworCX0KKyNlbmRpZgorCisJaWYgKChmaWxlX2hlYWRlci0+bW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgeworCQlwaWRfdCBwaWQ7CisJCWludCBwWzJdLCBzdGF0dXM7CisJCWNoYXIgKnRhcl9lbnZbVEFSX01BWF07CisKKwkJbWVtc2V0KHRhcl9lbnYsIDAsIHNpemVvZih0YXJfZW52KSk7CisKKwkJeHBpcGUocCk7CisJCXBpZCA9IEJCX01NVSA/IHhmb3JrKCkgOiB4dmZvcmsoKTsKKwkJaWYgKHBpZCA9PSAwKSB7CisJCQkvKiBDaGlsZCAqLworCQkJLyogc3RyMmVudih0YXJfZW52LCBUQVJfRklMRVRZUEUsICJmIik7IC0gcGFyZW50IHNob3VsZCBkbyBpdCBvbmNlICovCisJCQlvY3QyZW52KHRhcl9lbnYsIFRBUl9NT0RFLCBmaWxlX2hlYWRlci0+bW9kZSk7CisJCQlzdHIyZW52KHRhcl9lbnYsIFRBUl9GSUxFTkFNRSwgZmlsZV9oZWFkZXItPm5hbWUpOworCQkJc3RyMmVudih0YXJfZW52LCBUQVJfUkVBTE5BTUUsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwkJCXN0cjJlbnYodGFyX2VudiwgVEFSX1VOQU1FLCBmaWxlX2hlYWRlci0+dGFyX191bmFtZSk7CisJCQlzdHIyZW52KHRhcl9lbnYsIFRBUl9HTkFNRSwgZmlsZV9oZWFkZXItPnRhcl9fZ25hbWUpOworI2VuZGlmCisJCQlkZWMyZW52KHRhcl9lbnYsIFRBUl9TSVpFLCBmaWxlX2hlYWRlci0+c2l6ZSk7CisJCQlkZWMyZW52KHRhcl9lbnYsIFRBUl9VSUQsIGZpbGVfaGVhZGVyLT51aWQpOworCQkJZGVjMmVudih0YXJfZW52LCBUQVJfR0lELCBmaWxlX2hlYWRlci0+Z2lkKTsKKwkJCWNsb3NlKHBbMV0pOworCQkJeGR1cDIocFswXSwgU1RESU5fRklMRU5PKTsKKwkJCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKwkJCWV4ZWNsKGFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmRfc2hlbGwsCisJCQkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fdG9fY29tbWFuZF9zaGVsbCwKKwkJCQkiLWMiLAorCQkJCWFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmQsCisJCQkJTlVMTCk7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmRfc2hlbGwpOworCQl9CisJCWNsb3NlKHBbMF0pOworCQkvKiBPdXIgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGRvIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKQorCQkgKiBzbyB0aGF0IHdlIGRvbid0IGRpZSBpZiBjaGlsZCBkb24ndCByZWFkIGFsbCB0aGUgaW5wdXQ6ICovCisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHBbMV0sIC1maWxlX2hlYWRlci0+c2l6ZSk7CisJCWNsb3NlKHBbMV0pOworCisJCWlmIChzYWZlX3dhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgid2FpdHBpZCIpOworCQlpZiAoV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCInJXMnIHJldHVybmVkIHN0YXR1cyAlZCIsCisJCQkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fdG9fY29tbWFuZCwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgdGVybWluYXRlZCBvbiBzaWduYWwgJWQiLAorCQkJCWFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmQsIFdURVJNU0lHKHN0YXR1cykpOworCisJCWlmICghQkJfTU1VKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBUQVJfTUFYOyBpKyspIHsKKwkJCQlpZiAodGFyX2VudltpXSkKKwkJCQkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUodGFyX2VudltpXSk7CisJCQl9CisJCX0KKwl9CisKKyNpZiAwIC8qIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYICovCisJaWYgKHNjdHgpCisJCS8qIHJlc2V0IHRoZSBjb250ZXh0IGFmdGVyIGNyZWF0aW5nIGFuIGVudHJ5ICovCisJCXNldGZzY3JlYXRlY29uKE5VTEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19zdGRvdXQuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9leHRyYWN0X3RvX3N0ZG91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjNmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19zdGRvdXQuYwpAQCAtMCwwICsxLDE0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgZGF0YV9leHRyYWN0X3RvX3N0ZG91dChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLAorCQkJU1RET1VUX0ZJTEVOTywKKwkJCWFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+c2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfc2tpcC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX3NraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDU1NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX3NraXAuYwpAQCAtMCwwICsxLDEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWFyY2hpdmVfaGFuZGxlLT5zZWVrKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+c2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfYnVuemlwMi5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX2J1bnppcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQ2ZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX2J1bnppcDIuYwpAQCAtMCwwICsxLDgyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBTbWFsbCBiemlwMiBkZWZsYXRlIGltcGxlbWVudGF0aW9uLCBieSBSb2IgTGFuZGxleSAocm9iQGxhbmRsZXkubmV0KS4KKworICAgQmFzZWQgb24gYnppcDIgZGVjb21wcmVzc2lvbiBjb2RlIGJ5IEp1bGlhbiBSIFNld2FyZCAoanNld2FyZEBhY20ub3JnKSwKKyAgIHdoaWNoIGFsc28gYWNrbm93bGVkZ2VzIGNvbnRyaWJ1dGlvbnMgYnkgTWlrZSBCdXJyb3dzLCBEYXZpZCBXaGVlbGVyLAorICAgUGV0ZXIgRmVud2ljaywgQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwsIElhbiBILiBXaXR0ZW4sCisgICBSb2JlcnQgU2VkZ2V3aWNrLCBhbmQgSm9uIEwuIEJlbnRsZXkuCisKKyAgIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvKgorCVNpemUgYW5kIHNwZWVkIG9wdGltaXphdGlvbnMgYnkgTWFudWVsIE5vdm9hIElJSSAgKG1qbjNAY29kZXBvZXQub3JnKS4KKworCU1vcmUgZWZmaWNpZW50IHJlYWRpbmcgb2YgSHVmZm1hbiBjb2RlcywgYSBzdHJlYW1saW5lZCByZWFkX2J1bnppcCgpCisJZnVuY3Rpb24sIGFuZCB2YXJpb3VzIG90aGVyIHR3ZWFrcy4gIEluIChsaW1pdGVkKSB0ZXN0cywgYXBwcm94aW1hdGVseQorCTIwJSBmYXN0ZXIgdGhhbiBiemNhdCBvbiB4ODYgYW5kIGFib3V0IDEwJSBmYXN0ZXIgb24gYXJtLgorCisJTm90ZSB0aGF0IGFib3V0IDIvMyBvZiB0aGUgdGltZSBpcyBzcGVudCBpbiByZWFkX2J1bnppcCgpIHJldmVyc2luZworCXRoZSBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtYXRpb24uICBNdWNoIG9mIHRoYXQgdGltZSBpcyBkZWxheQorCXJlc3VsdGluZyBmcm9tIGNhY2hlIG1pc3Nlcy4KKworCSgyMDEwIHVwZGF0ZSBieSB2ZGE6IHByb2ZpbGVkICJiemNhdCA8ODRtYnl0ZS5iejIgPi9kZXYvbnVsbCIKKwlvbiB4ODYtNjQgQ1BVIHdpdGggTDIgPiAxTTogZ2V0X25leHRfYmxvY2sgaXMgaG90dGVyIHRoYW4gcmVhZF9idW56aXA6CisJJXRpbWUgc2Vjb25kcyAgIGNhbGxzIGZ1bmN0aW9uCisJNzEuMDEgICAxMi42OSAgICAgNDQ0IGdldF9uZXh0X2Jsb2NrCisJMjguNjUgICAgNS4xMiAgIDkzMDY1IHJlYWRfYnVuemlwCisJMDAuMjIgICAgMC4wNCA3NzM2NDkwIGdldF9iaXRzCisJMDAuMTEgICAgMC4wMiAgICAgIDQ3IGRlYWxsb2NfYnVuemlwCisJMDAuMDAgICAgMC4wMCAgIDkzMDE4IGZ1bGxfd3JpdGUKKwkuLi4pCisKKworCUkgd291bGQgYXNrIHRoYXQgYW55b25lIGJlbmVmaXRpbmcgZnJvbSB0aGlzIHdvcmssIGVzcGVjaWFsbHkgdGhvc2UKKwl1c2luZyBpdCBpbiBjb21tZXJjaWFsIHByb2R1Y3RzLCBjb25zaWRlciBtYWtpbmcgYSBkb25hdGlvbiB0byBteSBsb2NhbAorCW5vbi1wcm9maXQgaG9zcGljZSBvcmdhbml6YXRpb24gKHd3dy5ob3NwaWNlYWNhZGlhbmEuY29tKSBpbiB0aGUgbmFtZSBvZgorCXRoZSB3b21hbiBJIGxvdmVkLCBUb25pIFcuIEhhZ2FuLCB3aG8gcGFzc2VkIGF3YXkgRmViLiAxMiwgMjAwMy4KKworCU1hbnVlbAorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyogQ29uc3RhbnRzIGZvciBIdWZmbWFuIGNvZGluZyAqLworI2RlZmluZSBNQVhfR1JPVVBTICAgICAgICAgIDYKKyNkZWZpbmUgR1JPVVBfU0laRSAgICAgICAgICA1MCAgICAgIC8qIDY0IHdvdWxkIGhhdmUgYmVlbiBtb3JlIGVmZmljaWVudCAqLworI2RlZmluZSBNQVhfSFVGQ09ERV9CSVRTICAgIDIwICAgICAgLyogTG9uZ2VzdCBIdWZmbWFuIGNvZGUgYWxsb3dlZCAqLworI2RlZmluZSBNQVhfU1lNQk9MUyAgICAgICAgIDI1OCAgICAgLyogMjU2IGxpdGVyYWxzICsgUlVOQSArIFJVTkIgKi8KKyNkZWZpbmUgU1lNQk9MX1JVTkEgICAgICAgICAwCisjZGVmaW5lIFNZTUJPTF9SVU5CICAgICAgICAgMQorCisvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLworI2RlZmluZSBSRVRWQUxfT0sgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVUVkFMX0xBU1RfQkxPQ0sgICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFJFVFZBTF9OT1RfQlpJUF9EQVRBICAgICAgICAgICAgKC0yKQorI2RlZmluZSBSRVRWQUxfVU5FWFBFQ1RFRF9JTlBVVF9FT0YgICAgICgtMykKKyNkZWZpbmUgUkVUVkFMX1NIT1JUX1dSSVRFICAgICAgICAgICAgICAoLTQpCisjZGVmaW5lIFJFVFZBTF9EQVRBX0VSUk9SICAgICAgICAgICAgICAgKC01KQorI2RlZmluZSBSRVRWQUxfT1VUX09GX01FTU9SWSAgICAgICAgICAgICgtNikKKyNkZWZpbmUgUkVUVkFMX09CU09MRVRFX0lOUFVUICAgICAgICAgICAoLTcpCisKKy8qIE90aGVyIGhvdXNla2VlcGluZyBjb25zdGFudHMgKi8KKyNkZWZpbmUgSU9CVUZfU0laRSAgICAgICAgICA0MDk2CisKKy8qIFRoaXMgaXMgd2hhdCB3ZSBrbm93IGFib3V0IGVhY2ggSHVmZm1hbiBjb2RpbmcgZ3JvdXAgKi8KK3N0cnVjdCBncm91cF9kYXRhIHsKKwkvKiBXZSBoYXZlIGFuIGV4dHJhIHNsb3QgYXQgdGhlIGVuZCBvZiBsaW1pdFtdIGZvciBhIHNlbnRpbmVsIHZhbHVlLiAqLworCWludCBsaW1pdFtNQVhfSFVGQ09ERV9CSVRTKzFdLCBiYXNlW01BWF9IVUZDT0RFX0JJVFNdLCBwZXJtdXRlW01BWF9TWU1CT0xTXTsKKwlpbnQgbWluTGVuLCBtYXhMZW47Cit9OworCisvKiBTdHJ1Y3R1cmUgaG9sZGluZyBhbGwgdGhlIGhvdXNla2VlcGluZyBkYXRhLCBpbmNsdWRpbmcgSU8gYnVmZmVycyBhbmQKKyAqIG1lbW9yeSB0aGF0IHBlcnNpc3RzIGJldHdlZW4gY2FsbHMgdG8gYnVuemlwCisgKiBGb3VuZCB0aGUgbW9zdCB1c2VkIG1lbWJlcjoKKyAqICBjYXQgdGhpc19maWxlLmMgfCBzZWQgLWUgJ3MvIi8gL2cnIC1lICJzLycvIC9nIiB8IHhhcmdzIC1uMSBcCisgKiAgfCBncmVwICdiZC0+JyB8IHNlZCAncy9eLipiZC0+L2JkLT4vJyB8IHNvcnQgfCAkUEFHRVIKKyAqIGFuZCBtb3ZlZCBpdCAoaW5idWZCaXRDb3VudCkgdG8gb2Zmc2V0IDAuCisgKi8KK3N0cnVjdCBidW56aXBfZGF0YSB7CisJLyogSS9PIHRyYWNraW5nIGRhdGEgKGZpbGUgaGFuZGxlcywgYnVmZmVycywgcG9zaXRpb25zLCBldGMuKSAqLworCXVuc2lnbmVkIGluYnVmQml0Q291bnQsIGluYnVmQml0czsKKwlpbnQgaW5fZmQsIG91dF9mZCwgaW5idWZDb3VudCwgaW5idWZQb3MgLyosIG91dGJ1ZlBvcyovOworCXVpbnQ4X3QgKmluYnVmIC8qLCpvdXRidWYqLzsKKworCS8qIFN0YXRlIGZvciBpbnRlcnJ1cHRpbmcgb3V0cHV0IGxvb3AgKi8KKwlpbnQgd3JpdGVDb3BpZXMsIHdyaXRlUG9zLCB3cml0ZVJ1bkNvdW50ZG93biwgd3JpdGVDb3VudDsKKwlpbnQgd3JpdGVDdXJyZW50OyAvKiBhY3R1YWxseSBhIHVpbnQ4X3QgKi8KKworCS8qIFRoZSBDUkMgdmFsdWVzIHN0b3JlZCBpbiB0aGUgYmxvY2sgaGVhZGVyIGFuZCBjYWxjdWxhdGVkIGZyb20gdGhlIGRhdGEgKi8KKwl1aW50MzJfdCBoZWFkZXJDUkMsIHRvdGFsQ1JDLCB3cml0ZUNSQzsKKworCS8qIEludGVybWVkaWF0ZSBidWZmZXIgYW5kIGl0cyBzaXplIChpbiBieXRlcykgKi8KKwl1aW50MzJfdCAqZGJ1ZjsKKwl1bnNpZ25lZCBkYnVmU2l6ZTsKKworCS8qIEZvciBJL08gZXJyb3IgaGFuZGxpbmcgKi8KKwlqbXBfYnVmIGptcGJ1ZjsKKworCS8qIEJpZyB0aGluZ3MgZ28gbGFzdCAocmVnaXN0ZXItcmVsYXRpdmUgYWRkcmVzc2luZyBjYW4gYmUgbGFyZ2VyIGZvciBiaWcgb2Zmc2V0cykgKi8KKwl1aW50MzJfdCBjcmMzMlRhYmxlWzI1Nl07CisJdWludDhfdCBzZWxlY3RvcnNbMzI3NjhdOyAgLyogblNlbGVjdG9ycz0xNSBiaXRzICovCisJc3RydWN0IGdyb3VwX2RhdGEgZ3JvdXBzW01BWF9HUk9VUFNdOyAgLyogSHVmZm1hbiBjb2RpbmcgdGFibGVzICovCit9OworLyogdHlwZWRlZiBzdHJ1Y3QgYnVuemlwX2RhdGEgYnVuemlwX2RhdGE7IC0tIGRvbmUgaW4gLmggZmlsZSAqLworCisKKy8qIFJldHVybiB0aGUgbmV4dCBubm4gYml0cyBvZiBpbnB1dC4gIEFsbCByZWFkcyBmcm9tIHRoZSBjb21wcmVzc2VkIGlucHV0CisgICBhcmUgZG9uZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uICBBbGwgcmVhZHMgYXJlIGJpZyBlbmRpYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBnZXRfYml0cyhidW56aXBfZGF0YSAqYmQsIGludCBiaXRzX3dhbnRlZCkKK3sKKwl1bnNpZ25lZCBiaXRzID0gMDsKKwkvKiBDYWNoZSBiZC0+aW5idWZCaXRDb3VudCBpbiBhIENQVSByZWdpc3RlciAoaG9wZWZ1bGx5KTogKi8KKwlpbnQgYml0X2NvdW50ID0gYmQtPmluYnVmQml0Q291bnQ7CisKKwkvKiBJZiB3ZSBuZWVkIHRvIGdldCBtb3JlIGRhdGEgZnJvbSB0aGUgYnl0ZSBidWZmZXIsIGRvIHNvLiAgKExvb3AgZ2V0dGluZworCSAgIG9uZSBieXRlIGF0IGEgdGltZSB0byBlbmZvcmNlIGVuZGlhbm5lc3MgYW5kIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MuKSAqLworCXdoaWxlIChiaXRfY291bnQgPCBiaXRzX3dhbnRlZCkgeworCisJCS8qIElmIHdlIG5lZWQgdG8gcmVhZCBtb3JlIGRhdGEgZnJvbSBmaWxlIGludG8gYnl0ZSBidWZmZXIsIGRvIHNvICovCisJCWlmIChiZC0+aW5idWZQb3MgPT0gYmQtPmluYnVmQ291bnQpIHsKKwkJCS8qIGlmICJubyBpbnB1dCBmZCIgY2FzZTogaW5fZmQgPT0gLTEsIHJlYWQgZmFpbHMsIHdlIGp1bXAgKi8KKwkJCWJkLT5pbmJ1ZkNvdW50ID0gcmVhZChiZC0+aW5fZmQsIGJkLT5pbmJ1ZiwgSU9CVUZfU0laRSk7CisJCQlpZiAoYmQtPmluYnVmQ291bnQgPD0gMCkKKwkJCQlsb25nam1wKGJkLT5qbXBidWYsIFJFVFZBTF9VTkVYUEVDVEVEX0lOUFVUX0VPRik7CisJCQliZC0+aW5idWZQb3MgPSAwOworCQl9CisKKwkJLyogQXZvaWQgMzItYml0IG92ZXJmbG93IChkdW1wIGJpdCBidWZmZXIgdG8gdG9wIG9mIG91dHB1dCkgKi8KKwkJaWYgKGJpdF9jb3VudCA+PSAyNCkgeworCQkJYml0cyA9IGJkLT5pbmJ1ZkJpdHMgJiAoKDEgPDwgYml0X2NvdW50KSAtIDEpOworCQkJYml0c193YW50ZWQgLT0gYml0X2NvdW50OworCQkJYml0cyA8PD0gYml0c193YW50ZWQ7CisJCQliaXRfY291bnQgPSAwOworCQl9CisKKwkJLyogR3JhYiBuZXh0IDggYml0cyBvZiBpbnB1dCBmcm9tIGJ1ZmZlci4gKi8KKwkJYmQtPmluYnVmQml0cyA9IChiZC0+aW5idWZCaXRzIDw8IDgpIHwgYmQtPmluYnVmW2JkLT5pbmJ1ZlBvcysrXTsKKwkJYml0X2NvdW50ICs9IDg7CisJfQorCisJLyogQ2FsY3VsYXRlIHJlc3VsdCAqLworCWJpdF9jb3VudCAtPSBiaXRzX3dhbnRlZDsKKwliZC0+aW5idWZCaXRDb3VudCA9IGJpdF9jb3VudDsKKwliaXRzIHw9IChiZC0+aW5idWZCaXRzID4+IGJpdF9jb3VudCkgJiAoKDEgPDwgYml0c193YW50ZWQpIC0gMSk7CisKKwlyZXR1cm4gYml0czsKK30KKworLyogVW5wYWNrcyB0aGUgbmV4dCBibG9jayBhbmQgc2V0cyB1cCBmb3IgdGhlIGludmVyc2UgQnVycm93cy1XaGVlbGVyIHN0ZXAuICovCitzdGF0aWMgaW50IGdldF9uZXh0X2Jsb2NrKGJ1bnppcF9kYXRhICpiZCkKK3sKKwlzdHJ1Y3QgZ3JvdXBfZGF0YSAqaHVmR3JvdXA7CisJaW50IGRidWZDb3VudCwgZGJ1ZlNpemUsIGdyb3VwQ291bnQsICpiYXNlLCAqbGltaXQsIHNlbGVjdG9yLAorCQlpLCBqLCB0LCBydW5Qb3MsIHN5bUNvdW50LCBzeW1Ub3RhbCwgblNlbGVjdG9ycywgYnl0ZUNvdW50WzI1Nl07CisJaW50IHJ1bkNudCA9IHJ1bkNudDsgLyogZm9yIGNvbXBpbGVyICovCisJdWludDhfdCB1Yywgc3ltVG9CeXRlWzI1Nl0sIG10ZlN5bWJvbFsyNTZdLCAqc2VsZWN0b3JzOworCXVpbnQzMl90ICpkYnVmOworCXVuc2lnbmVkIG9yaWdQdHI7CisKKwlkYnVmID0gYmQtPmRidWY7CisJZGJ1ZlNpemUgPSBiZC0+ZGJ1ZlNpemU7CisJc2VsZWN0b3JzID0gYmQtPnNlbGVjdG9yczsKKworLyogSW4gYmJveCwgd2UgYXJlIG9rIHdpdGggYWJvcnRpbmcgdGhyb3VnaCBzZXRqbXAgd2hpY2ggaXMgc2V0IHVwIGluIHN0YXJ0X2J1bnppcCAqLworI2lmIDAKKwkvKiBSZXNldCBsb25nam1wIEkvTyBlcnJvciBoYW5kbGluZyAqLworCWkgPSBzZXRqbXAoYmQtPmptcGJ1Zik7CisJaWYgKGkpIHJldHVybiBpOworI2VuZGlmCisKKwkvKiBSZWFkIGluIGhlYWRlciBzaWduYXR1cmUgYW5kIENSQywgdGhlbiB2YWxpZGF0ZSBzaWduYXR1cmUuCisJICAgKGxhc3QgYmxvY2sgc2lnbmF0dXJlIG1lYW5zIENSQyBpcyBmb3Igd2hvbGUgZmlsZSwgcmV0dXJuIG5vdykgKi8KKwlpID0gZ2V0X2JpdHMoYmQsIDI0KTsKKwlqID0gZ2V0X2JpdHMoYmQsIDI0KTsKKwliZC0+aGVhZGVyQ1JDID0gZ2V0X2JpdHMoYmQsIDMyKTsKKwlpZiAoKGkgPT0gMHgxNzcyNDUpICYmIChqID09IDB4Mzg1MDkwKSkgcmV0dXJuIFJFVFZBTF9MQVNUX0JMT0NLOworCWlmICgoaSAhPSAweDMxNDE1OSkgfHwgKGogIT0gMHgyNjUzNTkpKSByZXR1cm4gUkVUVkFMX05PVF9CWklQX0RBVEE7CisKKwkvKiBXZSBjYW4gYWRkIHN1cHBvcnQgZm9yIGJsb2NrUmFuZG9taXNlZCBpZiBhbnlib2R5IGNvbXBsYWlucy4gIFRoZXJlIHdhcworCSAgIHNvbWUgY29kZSBmb3IgdGhpcyBpbiBidXN5Ym94IDEuMC4wLXByZTMsIGJ1dCBub2JvZHkgZXZlciBub3RpY2VkIHRoYXQKKwkgICBpdCBkaWRuJ3QgYWN0dWFsbHkgd29yay4gKi8KKwlpZiAoZ2V0X2JpdHMoYmQsIDEpKSByZXR1cm4gUkVUVkFMX09CU09MRVRFX0lOUFVUOworCW9yaWdQdHIgPSBnZXRfYml0cyhiZCwgMjQpOworCWlmICgoaW50KW9yaWdQdHIgPiBkYnVmU2l6ZSkgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisJLyogbWFwcGluZyB0YWJsZTogaWYgc29tZSBieXRlIHZhbHVlcyBhcmUgbmV2ZXIgdXNlZCAoZW5jb2RpbmcgdGhpbmdzCisJICAgbGlrZSBhc2NpaSB0ZXh0KSwgdGhlIGNvbXByZXNzaW9uIGNvZGUgcmVtb3ZlcyB0aGUgZ2FwcyB0byBoYXZlIGZld2VyCisJICAgc3ltYm9scyB0byBkZWFsIHdpdGgsIGFuZCB3cml0ZXMgYSBzcGFyc2UgYml0ZmllbGQgaW5kaWNhdGluZyB3aGljaAorCSAgIHZhbHVlcyB3ZXJlIHByZXNlbnQuICBXZSBtYWtlIGEgdHJhbnNsYXRpb24gdGFibGUgdG8gY29udmVydCB0aGUgc3ltYm9scworCSAgIGJhY2sgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZXMuICovCisJc3ltVG90YWwgPSAwOworCWkgPSAwOworCXQgPSBnZXRfYml0cyhiZCwgMTYpOworCWRvIHsKKwkJaWYgKHQgJiAoMSA8PCAxNSkpIHsKKwkJCXVuc2lnbmVkIGlubmVyX21hcCA9IGdldF9iaXRzKGJkLCAxNik7CisJCQlkbyB7CisJCQkJaWYgKGlubmVyX21hcCAmICgxIDw8IDE1KSkKKwkJCQkJc3ltVG9CeXRlW3N5bVRvdGFsKytdID0gaTsKKwkJCQlpbm5lcl9tYXAgPDw9IDE7CisJCQkJaSsrOworCQkJfSB3aGlsZSAoaSAmIDE1KTsKKwkJCWkgLT0gMTY7CisJCX0KKwkJdCA8PD0gMTsKKwkJaSArPSAxNjsKKwl9IHdoaWxlIChpIDwgMjU2KTsKKworCS8qIEhvdyBtYW55IGRpZmZlcmVudCBIdWZmbWFuIGNvZGluZyBncm91cHMgZG9lcyB0aGlzIGJsb2NrIHVzZT8gKi8KKwlncm91cENvdW50ID0gZ2V0X2JpdHMoYmQsIDMpOworCWlmIChncm91cENvdW50IDwgMiB8fCBncm91cENvdW50ID4gTUFYX0dST1VQUykKKwkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisJLyogblNlbGVjdG9yczogRXZlcnkgR1JPVVBfU0laRSBtYW55IHN5bWJvbHMgd2Ugc2VsZWN0IGEgbmV3IEh1ZmZtYW4gY29kaW5nCisJICAgZ3JvdXAuICBSZWFkIGluIHRoZSBncm91cCBzZWxlY3RvciBsaXN0LCB3aGljaCBpcyBzdG9yZWQgYXMgTVRGIGVuY29kZWQKKwkgICBiaXQgcnVucy4gIChNVEY9TW92ZSBUbyBGcm9udCwgYXMgZWFjaCB2YWx1ZSBpcyB1c2VkIGl0J3MgbW92ZWQgdG8gdGhlCisJICAgc3RhcnQgb2YgdGhlIGxpc3QuKSAqLworCWZvciAoaSA9IDA7IGkgPCBncm91cENvdW50OyBpKyspCisJCW10ZlN5bWJvbFtpXSA9IGk7CisJblNlbGVjdG9ycyA9IGdldF9iaXRzKGJkLCAxNSk7CisJaWYgKCFuU2VsZWN0b3JzKQorCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgeworCQl1aW50OF90IHRtcF9ieXRlOworCQkvKiBHZXQgbmV4dCB2YWx1ZSAqLworCQlpbnQgbiA9IDA7CisJCXdoaWxlIChnZXRfYml0cyhiZCwgMSkpIHsKKwkJCWlmIChuID49IGdyb3VwQ291bnQpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKwkJCW4rKzsKKwkJfQorCQkvKiBEZWNvZGUgTVRGIHRvIGdldCB0aGUgbmV4dCBzZWxlY3RvciAqLworCQl0bXBfYnl0ZSA9IG10ZlN5bWJvbFtuXTsKKwkJd2hpbGUgKC0tbiA+PSAwKQorCQkJbXRmU3ltYm9sW24gKyAxXSA9IG10ZlN5bWJvbFtuXTsKKwkJbXRmU3ltYm9sWzBdID0gc2VsZWN0b3JzW2ldID0gdG1wX2J5dGU7CisJfQorCisJLyogUmVhZCB0aGUgSHVmZm1hbiBjb2RpbmcgdGFibGVzIGZvciBlYWNoIGdyb3VwLCB3aGljaCBjb2RlIGZvciBzeW1Ub3RhbAorCSAgIGxpdGVyYWwgc3ltYm9scywgcGx1cyB0d28gcnVuIHN5bWJvbHMgKFJVTkEsIFJVTkIpICovCisJc3ltQ291bnQgPSBzeW1Ub3RhbCArIDI7CisJZm9yIChqID0gMDsgaiA8IGdyb3VwQ291bnQ7IGorKykgeworCQl1aW50OF90IGxlbmd0aFtNQVhfU1lNQk9MU107CisJCS8qIDggYml0cyBpcyBBTE1PU1QgZW5vdWdoIGZvciB0ZW1wW10sIHNlZSBiZWxvdyAqLworCQl1bnNpZ25lZCB0ZW1wW01BWF9IVUZDT0RFX0JJVFMrMV07CisJCWludCBtaW5MZW4sIG1heExlbiwgcHAsIGxlbl9tMTsKKworCQkvKiBSZWFkIEh1ZmZtYW4gY29kZSBsZW5ndGhzIGZvciBlYWNoIHN5bWJvbC4gIFRoZXkncmUgc3RvcmVkIGluCisJCSAgIGEgd2F5IHNpbWlsYXIgdG8gbXRmOyByZWNvcmQgYSBzdGFydGluZyB2YWx1ZSBmb3IgdGhlIGZpcnN0IHN5bWJvbCwKKwkJICAgYW5kIGFuIG9mZnNldCBmcm9tIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgZXZlcnkgc3ltYm9sIGFmdGVyIHRoYXQuCisJCSAgIChTdWJ0cmFjdGluZyAxIGJlZm9yZSB0aGUgbG9vcCBhbmQgdGhlbiBhZGRpbmcgaXQgYmFjayBhdCB0aGUgZW5kIGlzCisJCSAgIGFuIG9wdGltaXphdGlvbiB0aGF0IG1ha2VzIHRoZSB0ZXN0IGluc2lkZSB0aGUgbG9vcCBzaW1wbGVyOiBzeW1ib2wKKwkJICAgbGVuZ3RoIDAgYmVjb21lcyBuZWdhdGl2ZSwgc28gYW4gdW5zaWduZWQgaW5lcXVhbGl0eSBjYXRjaGVzIGl0LikgKi8KKwkJbGVuX20xID0gZ2V0X2JpdHMoYmQsIDUpIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHsKKwkJCWZvciAoOzspIHsKKwkJCQlpbnQgdHdvX2JpdHM7CisJCQkJaWYgKCh1bnNpZ25lZClsZW5fbTEgPiAoTUFYX0hVRkNPREVfQklUUy0xKSkKKwkJCQkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCisJCQkJLyogSWYgZmlyc3QgYml0IGlzIDAsIHN0b3AuICBFbHNlIHNlY29uZCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIKKwkJCQkgICB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IHRoZSB2YWx1ZS4gIE9wdGltaXphdGlvbjogZ3JhYiAyCisJCQkJICAgYml0cyBhbmQgdW5nZXQgdGhlIHNlY29uZCBpZiB0aGUgZmlyc3Qgd2FzIDAuICovCisJCQkJdHdvX2JpdHMgPSBnZXRfYml0cyhiZCwgMik7CisJCQkJaWYgKHR3b19iaXRzIDwgMikgeworCQkJCQliZC0+aW5idWZCaXRDb3VudCsrOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBBZGQgb25lIGlmIHNlY29uZCBiaXQgMSwgZWxzZSBzdWJ0cmFjdCAxLiAgQXZvaWRzIGlmL2Vsc2UgKi8KKwkJCQlsZW5fbTEgKz0gKCgodHdvX2JpdHMrMSkgJiAyKSAtIDEpOworCQkJfQorCisJCQkvKiBDb3JyZWN0IGZvciB0aGUgaW5pdGlhbCAtMSwgdG8gZ2V0IHRoZSBmaW5hbCBzeW1ib2wgbGVuZ3RoICovCisJCQlsZW5ndGhbaV0gPSBsZW5fbTEgKyAxOworCQl9CisKKwkJLyogRmluZCBsYXJnZXN0IGFuZCBzbWFsbGVzdCBsZW5ndGhzIGluIHRoaXMgZ3JvdXAgKi8KKwkJbWluTGVuID0gbWF4TGVuID0gbGVuZ3RoWzBdOworCQlmb3IgKGkgPSAxOyBpIDwgc3ltQ291bnQ7IGkrKykgeworCQkJaWYgKGxlbmd0aFtpXSA+IG1heExlbikgbWF4TGVuID0gbGVuZ3RoW2ldOworCQkJZWxzZSBpZiAobGVuZ3RoW2ldIDwgbWluTGVuKSBtaW5MZW4gPSBsZW5ndGhbaV07CisJCX0KKworCQkvKiBDYWxjdWxhdGUgcGVybXV0ZVtdLCBiYXNlW10sIGFuZCBsaW1pdFtdIHRhYmxlcyBmcm9tIGxlbmd0aFtdLgorCQkgKgorCQkgKiBwZXJtdXRlW10gaXMgdGhlIGxvb2t1cCB0YWJsZSBmb3IgY29udmVydGluZyBIdWZmbWFuIGNvZGVkIHN5bWJvbHMKKwkJICogaW50byBkZWNvZGVkIHN5bWJvbHMuICBiYXNlW10gaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHRoZQorCQkgKiB2YWx1ZSBvZiBhIEh1ZmZtYW4gc3ltYm9sIG9mIGEgZ2l2ZW4gbGVuZ3RoIHdoZW4gdXNpbmcgcGVybXV0ZVtdLgorCQkgKgorCQkgKiBsaW1pdFtdIGluZGljYXRlcyB0aGUgbGFyZ2VzdCBudW1lcmljYWwgdmFsdWUgYSBzeW1ib2wgd2l0aCBhIGdpdmVuCisJCSAqIG51bWJlciBvZiBiaXRzIGNhbiBoYXZlLiAgVGhpcyBpcyBob3cgdGhlIEh1ZmZtYW4gY29kZXMgY2FuIHZhcnkgaW4KKwkJICogbGVuZ3RoOiBlYWNoIGNvZGUgd2l0aCBhIHZhbHVlPmxpbWl0W2xlbmd0aF0gbmVlZHMgYW5vdGhlciBiaXQuCisJCSAqLworCQlodWZHcm91cCA9IGJkLT5ncm91cHMgKyBqOworCQlodWZHcm91cC0+bWluTGVuID0gbWluTGVuOworCQlodWZHcm91cC0+bWF4TGVuID0gbWF4TGVuOworCisJCS8qIE5vdGUgdGhhdCBtaW5MZW4gY2FuJ3QgYmUgc21hbGxlciB0aGFuIDEsIHNvIHdlIGFkanVzdCB0aGUgYmFzZQorCQkgICBhbmQgbGltaXQgYXJyYXkgcG9pbnRlcnMgc28gd2UncmUgbm90IGFsd2F5cyB3YXN0aW5nIHRoZSBmaXJzdAorCQkgICBlbnRyeS4gIFdlIGRvIHRoaXMgYWdhaW4gd2hlbiB1c2luZyB0aGVtIChkdXJpbmcgc3ltYm9sIGRlY29kaW5nKS4gKi8KKwkJYmFzZSA9IGh1Zkdyb3VwLT5iYXNlIC0gMTsKKwkJbGltaXQgPSBodWZHcm91cC0+bGltaXQgLSAxOworCisJCS8qIENhbGN1bGF0ZSBwZXJtdXRlW10uICBDb25jdXJlbnRseSwgaW5pdGlhbGl6ZSB0ZW1wW10gYW5kIGxpbWl0W10uICovCisJCXBwID0gMDsKKwkJZm9yIChpID0gbWluTGVuOyBpIDw9IG1heExlbjsgaSsrKSB7CisJCQlpbnQgazsKKwkJCXRlbXBbaV0gPSBsaW1pdFtpXSA9IDA7CisJCQlmb3IgKGsgPSAwOyBrIDwgc3ltQ291bnQ7IGsrKykKKwkJCQlpZiAobGVuZ3RoW2tdID09IGkpCisJCQkJCWh1Zkdyb3VwLT5wZXJtdXRlW3BwKytdID0gazsKKwkJfQorCisJCS8qIENvdW50IHN5bWJvbHMgY29kZWQgZm9yIGF0IGVhY2ggYml0IGxlbmd0aCAqLworCQkvKiBOQjogaW4gcGF0aG9sb2dpY2FsIGNhc2VzLCB0ZW1wWzhdIGNhbiBlbmQgaXAgYmVpbmcgMjU2LgorCQkgKiBUaGF0J3Mgd2h5IHVpbnQ4X3QgaXMgdG9vIHNtYWxsIGZvciB0ZW1wW10uICovCisJCWZvciAoaSA9IDA7IGkgPCBzeW1Db3VudDsgaSsrKSB0ZW1wW2xlbmd0aFtpXV0rKzsKKworCQkvKiBDYWxjdWxhdGUgbGltaXRbXSAodGhlIGxhcmdlc3Qgc3ltYm9sLWNvZGluZyB2YWx1ZSBhdCBlYWNoIGJpdAorCQkgKiBsZW5ndGgsIHdoaWNoIGlzIChwcmV2aW91cyBsaW1pdDw8MSkrc3ltYm9scyBhdCB0aGlzIGxldmVsKSwgYW5kCisJCSAqIGJhc2VbXSAobnVtYmVyIG9mIHN5bWJvbHMgdG8gaWdub3JlIGF0IGVhY2ggYml0IGxlbmd0aCwgd2hpY2ggaXMKKwkJICogbGltaXQgbWludXMgdGhlIGN1bXVsYXRpdmUgY291bnQgb2Ygc3ltYm9scyBjb2RlZCBmb3IgYWxyZWFkeSkuICovCisJCXBwID0gdCA9IDA7CisJCWZvciAoaSA9IG1pbkxlbjsgaSA8IG1heExlbjspIHsKKwkJCXVuc2lnbmVkIHRlbXBfaSA9IHRlbXBbaV07CisKKwkJCXBwICs9IHRlbXBfaTsKKworCQkJLyogV2UgcmVhZCB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzeW1ib2wgc2l6ZSBhbmQgdGhlbiB1bmdldCBiaXRzCisJCQkgICBhZnRlciBkZXRlcm1pbmluZyBob3cgbWFueSB3ZSBuZWVkLCBhbmQgdGhvc2UgZXh0cmEgYml0cyBjb3VsZAorCQkJICAgYmUgc2V0IHRvIGFueXRoaW5nLiAgKFRoZXkncmUgbm9pc2UgZnJvbSBmdXR1cmUgc3ltYm9scy4pICBBdAorCQkJICAgZWFjaCBsZXZlbCB3ZSdyZSByZWFsbHkgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCBmZXcgYml0cywKKwkJCSAgIHNvIGhlcmUgd2Ugc2V0IGFsbCB0aGUgdHJhaWxpbmcgdG8tYmUtaWdub3JlZCBiaXRzIHRvIDEgc28gdGhleQorCQkJICAgZG9uJ3QgYWZmZWN0IHRoZSB2YWx1ZT5saW1pdFtsZW5ndGhdIGNvbXBhcmlzb24uICovCisJCQlsaW1pdFtpXSA9IChwcCA8PCAobWF4TGVuIC0gaSkpIC0gMTsKKwkJCXBwIDw8PSAxOworCQkJdCArPSB0ZW1wX2k7CisJCQliYXNlWysraV0gPSBwcCAtIHQ7CisJCX0KKwkJbGltaXRbbWF4TGVuXSA9IHBwICsgdGVtcFttYXhMZW5dIC0gMTsKKwkJbGltaXRbbWF4TGVuKzFdID0gSU5UX01BWDsgLyogU2VudGluZWwgdmFsdWUgZm9yIHJlYWRpbmcgbmV4dCBzeW0uICovCisJCWJhc2VbbWluTGVuXSA9IDA7CisJfQorCisJLyogV2UndmUgZmluaXNoZWQgcmVhZGluZyBhbmQgZGlnZXN0aW5nIHRoZSBibG9jayBoZWFkZXIuICBOb3cgcmVhZCB0aGlzCisJICAgYmxvY2sncyBIdWZmbWFuIGNvZGVkIHN5bWJvbHMgZnJvbSB0aGUgZmlsZSBhbmQgdW5kbyB0aGUgSHVmZm1hbiBjb2RpbmcKKwkgICBhbmQgcnVuIGxlbmd0aCBlbmNvZGluZywgc2F2aW5nIHRoZSByZXN1bHQgaW50byBkYnVmW2RidWZDb3VudCsrXSA9IHVjICovCisKKwkvKiBJbml0aWFsaXplIHN5bWJvbCBvY2N1cnJlbmNlIGNvdW50ZXJzIGFuZCBzeW1ib2wgTW92ZSBUbyBGcm9udCB0YWJsZSAqLworCS8qbWVtc2V0KGJ5dGVDb3VudCwgMCwgc2l6ZW9mKGJ5dGVDb3VudCkpOyAtIHNtYWxsZXIsIGJ1dCBzbG93ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJYnl0ZUNvdW50W2ldID0gMDsKKwkJbXRmU3ltYm9sW2ldID0gKHVpbnQ4X3QpaTsKKwl9CisKKwkvKiBMb29wIHRocm91Z2ggY29tcHJlc3NlZCBzeW1ib2xzLiAqLworCisJcnVuUG9zID0gZGJ1ZkNvdW50ID0gc2VsZWN0b3IgPSAwOworCWZvciAoOzspIHsKKwkJaW50IG5leHRTeW07CisKKwkJLyogRmV0Y2ggbmV4dCBIdWZmbWFuIGNvZGluZyBncm91cCBmcm9tIGxpc3QuICovCisJCXN5bUNvdW50ID0gR1JPVVBfU0laRSAtIDE7CisJCWlmIChzZWxlY3RvciA+PSBuU2VsZWN0b3JzKSByZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCWh1Zkdyb3VwID0gYmQtPmdyb3VwcyArIHNlbGVjdG9yc1tzZWxlY3RvcisrXTsKKwkJYmFzZSA9IGh1Zkdyb3VwLT5iYXNlIC0gMTsKKwkJbGltaXQgPSBodWZHcm91cC0+bGltaXQgLSAxOworCisgY29udGludWVfdGhpc19ncm91cDoKKwkJLyogUmVhZCBuZXh0IEh1ZmZtYW4tY29kZWQgc3ltYm9sLiAqLworCisJCS8qIE5vdGU6IEl0IGlzIGZhciBjaGVhcGVyIHRvIHJlYWQgbWF4TGVuIGJpdHMgYW5kIGJhY2sgdXAgdGhhbiBpdCBpcworCQkgICB0byByZWFkIG1pbkxlbiBiaXRzIGFuZCB0aGVuIGFkZCBhZGRpdGlvbmFsIGJpdCBhdCBhIHRpbWUsIHRlc3RpbmcKKwkJICAgYXMgd2UgZ28uICBCZWNhdXNlIHRoZXJlIGlzIGEgdHJhaWxpbmcgbGFzdCBibG9jayAod2l0aCBmaWxlIENSQyksCisJCSAgIHRoZXJlIGlzIG5vIGRhbmdlciBvZiB0aGUgb3ZlcnJlYWQgY2F1c2luZyBhbiB1bmV4cGVjdGVkIEVPRiBmb3IgYQorCQkgICB2YWxpZCBjb21wcmVzc2VkIGZpbGUuCisJCSAqLworCQlpZiAoMSkgeworCQkJLyogQXMgYSBmdXJ0aGVyIG9wdGltaXphdGlvbiwgd2UgZG8gdGhlIHJlYWQgaW5saW5lCisJCQkgICAoZmFsbGluZyBiYWNrIHRvIGEgY2FsbCB0byBnZXRfYml0cyBpZiB0aGUgYnVmZmVyIHJ1bnMgZHJ5KS4KKwkJCSAqLworCQkJaW50IG5ld19jbnQ7CisJCQl3aGlsZSAoKG5ld19jbnQgPSBiZC0+aW5idWZCaXRDb3VudCAtIGh1Zkdyb3VwLT5tYXhMZW4pIDwgMCkgeworCQkJCS8qIGJkLT5pbmJ1ZkJpdENvdW50IDwgaHVmR3JvdXAtPm1heExlbiAqLworCQkJCWlmIChiZC0+aW5idWZQb3MgPT0gYmQtPmluYnVmQ291bnQpIHsKKwkJCQkJbmV4dFN5bSA9IGdldF9iaXRzKGJkLCBodWZHcm91cC0+bWF4TGVuKTsKKwkJCQkJZ290byBnb3RfaHVmZl9iaXRzOworCQkJCX0KKwkJCQliZC0+aW5idWZCaXRzID0gKGJkLT5pbmJ1ZkJpdHMgPDwgOCkgfCBiZC0+aW5idWZbYmQtPmluYnVmUG9zKytdOworCQkJCWJkLT5pbmJ1ZkJpdENvdW50ICs9IDg7CisJCQl9OworCQkJYmQtPmluYnVmQml0Q291bnQgPSBuZXdfY250OyAvKiAiYmQtPmluYnVmQml0Q291bnQgLT0gaHVmR3JvdXAtPm1heExlbjsiICovCisJCQluZXh0U3ltID0gKGJkLT5pbmJ1ZkJpdHMgPj4gbmV3X2NudCkgJiAoKDEgPDwgaHVmR3JvdXAtPm1heExlbikgLSAxKTsKKyBnb3RfaHVmZl9iaXRzOiA7CisJCX0gZWxzZSB7IC8qIHVub3B0aW1pemVkIGVxdWl2YWxlbnQgKi8KKwkJCW5leHRTeW0gPSBnZXRfYml0cyhiZCwgaHVmR3JvdXAtPm1heExlbik7CisJCX0KKwkJLyogRmlndXJlIGhvdyBtYW55IGJpdHMgYXJlIGluIG5leHQgc3ltYm9sIGFuZCB1bmdldCBleHRyYXMgKi8KKwkJaSA9IGh1Zkdyb3VwLT5taW5MZW47CisJCXdoaWxlIChuZXh0U3ltID4gbGltaXRbaV0pICsraTsKKwkJaiA9IGh1Zkdyb3VwLT5tYXhMZW4gLSBpOworCQlpZiAoaiA8IDApCisJCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCWJkLT5pbmJ1ZkJpdENvdW50ICs9IGo7CisKKwkJLyogSHVmZm1hbiBkZWNvZGUgdmFsdWUgdG8gZ2V0IG5leHRTeW0gKHdpdGggYm91bmRzIGNoZWNraW5nKSAqLworCQluZXh0U3ltID0gKG5leHRTeW0gPj4gaikgLSBiYXNlW2ldOworCQlpZiAoKHVuc2lnbmVkKW5leHRTeW0gPj0gTUFYX1NZTUJPTFMpCisJCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCW5leHRTeW0gPSBodWZHcm91cC0+cGVybXV0ZVtuZXh0U3ltXTsKKworCQkvKiBXZSBoYXZlIG5vdyBkZWNvZGVkIHRoZSBzeW1ib2wsIHdoaWNoIGluZGljYXRlcyBlaXRoZXIgYSBuZXcgbGl0ZXJhbAorCQkgICBieXRlLCBvciBhIHJlcGVhdGVkIHJ1biBvZiB0aGUgbW9zdCByZWNlbnQgbGl0ZXJhbCBieXRlLiAgRmlyc3QsCisJCSAgIGNoZWNrIGlmIG5leHRTeW0gaW5kaWNhdGVzIGEgcmVwZWF0ZWQgcnVuLCBhbmQgaWYgc28gbG9vcCBjb2xsZWN0aW5nCisJCSAgIGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgbGFzdCBsaXRlcmFsLiAqLworCQlpZiAoKHVuc2lnbmVkKW5leHRTeW0gPD0gU1lNQk9MX1JVTkIpIHsgLyogUlVOQSBvciBSVU5CICovCisKKwkJCS8qIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHJ1biwgemVybyBvdXQgY291bnRlciAqLworCQkJaWYgKHJ1blBvcyA9PSAwKSB7CisJCQkJcnVuUG9zID0gMTsKKwkJCQlydW5DbnQgPSAwOworCQkJfQorCisJCQkvKiBOZWF0IHRyaWNrIHRoYXQgc2F2ZXMgMSBzeW1ib2w6IGluc3RlYWQgb2Ygb3ItaW5nIDAgb3IgMSBhdAorCQkJICAgZWFjaCBiaXQgcG9zaXRpb24sIGFkZCAxIG9yIDIgaW5zdGVhZC4gIEZvciBleGFtcGxlLAorCQkJICAgMTAxMSBpcyAxPDwwICsgMTw8MSArIDI8PDIuICAxMDEwIGlzIDI8PDAgKyAyPDwxICsgMTw8Mi4KKwkJCSAgIFlvdSBjYW4gbWFrZSBhbnkgYml0IHBhdHRlcm4gdGhhdCB3YXkgdXNpbmcgMSBsZXNzIHN5bWJvbCB0aGFuCisJCQkgICB0aGUgYmFzaWMgb3IgMC8xIG1ldGhvZCAoZXhjZXB0IGFsbCBiaXRzIDAsIHdoaWNoIHdvdWxkIHVzZSBubworCQkJICAgc3ltYm9scywgYnV0IGEgcnVuIG9mIGxlbmd0aCAwIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyBpbiB0aGlzCisJCQkgICBjb250ZXh0KS4gIFRodXMgc3BhY2UgaXMgc2F2ZWQuICovCisJCQlydW5DbnQgKz0gKHJ1blBvcyA8PCBuZXh0U3ltKTsgLyogK3J1blBvcyBpZiBSVU5BOyArMipydW5Qb3MgaWYgUlVOQiAqLworCQkJaWYgKHJ1blBvcyA8IGRidWZTaXplKSBydW5Qb3MgPDw9IDE7CisJCQlnb3RvIGVuZF9vZl9odWZmbWFuX2xvb3A7CisJCX0KKworCQkvKiBXaGVuIHdlIGhpdCB0aGUgZmlyc3Qgbm9uLXJ1biBzeW1ib2wgYWZ0ZXIgYSBydW4sIHdlIG5vdyBrbm93CisJCSAgIGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgbGFzdCBsaXRlcmFsLCBzbyBhcHBlbmQgdGhhdCBtYW55CisJCSAgIGNvcGllcyB0byBvdXIgYnVmZmVyIG9mIGRlY29kZWQgc3ltYm9scyAoZGJ1Zikgbm93LiAgKFRoZSBsYXN0CisJCSAgIGxpdGVyYWwgdXNlZCBpcyB0aGUgb25lIGF0IHRoZSBoZWFkIG9mIHRoZSBtdGZTeW1ib2wgYXJyYXkuKSAqLworCQlpZiAocnVuUG9zICE9IDApIHsKKwkJCXVpbnQ4X3QgdG1wX2J5dGU7CisJCQlpZiAoZGJ1ZkNvdW50ICsgcnVuQ250ID49IGRidWZTaXplKSByZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCQl0bXBfYnl0ZSA9IHN5bVRvQnl0ZVttdGZTeW1ib2xbMF1dOworCQkJYnl0ZUNvdW50W3RtcF9ieXRlXSArPSBydW5DbnQ7CisJCQl3aGlsZSAoLS1ydW5DbnQgPj0gMCkgZGJ1ZltkYnVmQ291bnQrK10gPSAodWludDMyX3QpdG1wX2J5dGU7CisJCQlydW5Qb3MgPSAwOworCQl9CisKKwkJLyogSXMgdGhpcyB0aGUgdGVybWluYXRpbmcgc3ltYm9sPyAqLworCQlpZiAobmV4dFN5bSA+IHN5bVRvdGFsKSBicmVhazsKKworCQkvKiBBdCB0aGlzIHBvaW50LCBuZXh0U3ltIGluZGljYXRlcyBhIG5ldyBsaXRlcmFsIGNoYXJhY3Rlci4gIFN1YnRyYWN0CisJCSAgIG9uZSB0byBnZXQgdGhlIHBvc2l0aW9uIGluIHRoZSBNVEYgYXJyYXkgYXQgd2hpY2ggdGhpcyBsaXRlcmFsIGlzCisJCSAgIGN1cnJlbnRseSB0byBiZSBmb3VuZC4gIChOb3RlIHRoYXQgdGhlIHJlc3VsdCBjYW4ndCBiZSAtMSBvciAwLAorCQkgICBiZWNhdXNlIDAgYW5kIDEgYXJlIFJVTkEgYW5kIFJVTkIuICBCdXQgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUKKwkJICAgZmlyc3Qgc3ltYm9sIGluIHRoZSBtdGYgYXJyYXksIHBvc2l0aW9uIDAsIHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkCisJCSAgIGFzIHBhcnQgb2YgYSBydW4gYWJvdmUuICBUaGVyZWZvcmUgMSB1bnVzZWQgbXRmIHBvc2l0aW9uIG1pbnVzCisJCSAgIDIgbm9uLWxpdGVyYWwgbmV4dFN5bSB2YWx1ZXMgZXF1YWxzIC0xLikgKi8KKwkJaWYgKGRidWZDb3VudCA+PSBkYnVmU2l6ZSkgcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQlpID0gbmV4dFN5bSAtIDE7CisJCXVjID0gbXRmU3ltYm9sW2ldOworCisJCS8qIEFkanVzdCB0aGUgTVRGIGFycmF5LiAgU2luY2Ugd2UgdHlwaWNhbGx5IGV4cGVjdCB0byBtb3ZlIG9ubHkgYQorCQkgKiBzbWFsbCBudW1iZXIgb2Ygc3ltYm9scywgYW5kIGFyZSBib3VuZCBieSAyNTYgaW4gYW55IGNhc2UsIHVzaW5nCisJCSAqIG1lbW1vdmUgaGVyZSB3b3VsZCB0eXBpY2FsbHkgYmUgYmlnZ2VyIGFuZCBzbG93ZXIgZHVlIHRvIGZ1bmN0aW9uCisJCSAqIGNhbGwgb3ZlcmhlYWQgYW5kIG90aGVyIGFzc29ydGVkIHNldHVwIGNvc3RzLiAqLworCQlkbyB7CisJCQltdGZTeW1ib2xbaV0gPSBtdGZTeW1ib2xbaS0xXTsKKwkJfSB3aGlsZSAoLS1pKTsKKwkJbXRmU3ltYm9sWzBdID0gdWM7CisJCXVjID0gc3ltVG9CeXRlW3VjXTsKKworCQkvKiBXZSBoYXZlIG91ciBsaXRlcmFsIGJ5dGUuICBTYXZlIGl0IGludG8gZGJ1Zi4gKi8KKwkJYnl0ZUNvdW50W3VjXSsrOworCQlkYnVmW2RidWZDb3VudCsrXSA9ICh1aW50MzJfdCl1YzsKKworCQkvKiBTa2lwIGdyb3VwIGluaXRpYWxpemF0aW9uIGlmIHdlJ3JlIG5vdCBkb25lIHdpdGggdGhpcyBncm91cC4gIERvbmUKKwkJICogdGhpcyB3YXkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4gKi8KKyBlbmRfb2ZfaHVmZm1hbl9sb29wOgorCQlpZiAoLS1zeW1Db3VudCA+PSAwKSBnb3RvIGNvbnRpbnVlX3RoaXNfZ3JvdXA7CisJfQorCisJLyogQXQgdGhpcyBwb2ludCwgd2UndmUgcmVhZCBhbGwgdGhlIEh1ZmZtYW4tY29kZWQgc3ltYm9scyAoYW5kIHJlcGVhdGVkCisJICAgcnVucykgZm9yIHRoaXMgYmxvY2sgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBhbmQgZGVjb2RlZCB0aGVtIGludG8gdGhlCisJICAgaW50ZXJtZWRpYXRlIGJ1ZmZlci4gIFRoZXJlIGFyZSBkYnVmQ291bnQgbWFueSBkZWNvZGVkIGJ5dGVzIGluIGRidWZbXS4KKwkgICBOb3cgdW5kbyB0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSBvbiBkYnVmLgorCSAgIFNlZSBodHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL2J3dC9id3QuaHRtCisJICovCisKKwkvKiBUdXJuIGJ5dGVDb3VudCBpbnRvIGN1bXVsYXRpdmUgb2NjdXJyZW5jZSBjb3VudHMgb2YgMCB0byBuLTEuICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWludCB0bXBfY291bnQgPSBqICsgYnl0ZUNvdW50W2ldOworCQlieXRlQ291bnRbaV0gPSBqOworCQlqID0gdG1wX2NvdW50OworCX0KKworCS8qIEZpZ3VyZSBvdXQgd2hhdCBvcmRlciBkYnVmIHdvdWxkIGJlIGluIGlmIHdlIHNvcnRlZCBpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGJ1ZkNvdW50OyBpKyspIHsKKwkJdWludDhfdCB0bXBfYnl0ZSA9ICh1aW50OF90KWRidWZbaV07CisJCWludCB0bXBfY291bnQgPSBieXRlQ291bnRbdG1wX2J5dGVdOworCQlkYnVmW3RtcF9jb3VudF0gfD0gKGkgPDwgOCk7CisJCWJ5dGVDb3VudFt0bXBfYnl0ZV0gPSB0bXBfY291bnQgKyAxOworCX0KKworCS8qIERlY29kZSBmaXJzdCBieXRlIGJ5IGhhbmQgdG8gaW5pdGlhbGl6ZSAicHJldmlvdXMiIGJ5dGUuICBOb3RlIHRoYXQgaXQKKwkgICBkb2Vzbid0IGdldCBvdXRwdXQsIGFuZCBpZiB0aGUgZmlyc3QgdGhyZWUgY2hhcmFjdGVycyBhcmUgaWRlbnRpY2FsCisJICAgaXQgZG9lc24ndCBxdWFsaWZ5IGFzIGEgcnVuIChoZW5jZSB3cml0ZVJ1bkNvdW50ZG93bj01KS4gKi8KKwlpZiAoZGJ1ZkNvdW50KSB7CisJCXVpbnQzMl90IHRtcDsKKwkJaWYgKChpbnQpb3JpZ1B0ciA+PSBkYnVmQ291bnQpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKwkJdG1wID0gZGJ1ZltvcmlnUHRyXTsKKwkJYmQtPndyaXRlQ3VycmVudCA9ICh1aW50OF90KXRtcDsKKwkJYmQtPndyaXRlUG9zID0gKHRtcCA+PiA4KTsKKwkJYmQtPndyaXRlUnVuQ291bnRkb3duID0gNTsKKwl9CisJYmQtPndyaXRlQ291bnQgPSBkYnVmQ291bnQ7CisKKwlyZXR1cm4gUkVUVkFMX09LOworfQorCisvKiBVbmRvIEJ1cnJvd3MtV2hlZWxlciB0cmFuc2Zvcm0gb24gaW50ZXJtZWRpYXRlIGJ1ZmZlciB0byBwcm9kdWNlIG91dHB1dC4KKyAgIElmIHN0YXJ0X2J1bnppcCB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBvdXRfZmQ9LTEsIHRoZW4gdXAgdG8gbGVuIGJ5dGVzIG9mCisgICBkYXRhIGFyZSB3cml0dGVuIHRvIG91dGJ1Zi4gIFJldHVybiB2YWx1ZSBpcyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvcgorICAgZXJyb3IgKGFsbCBlcnJvcnMgYXJlIG5lZ2F0aXZlIG51bWJlcnMpLiAgSWYgb3V0X2ZkIT0tMSwgb3V0YnVmIGFuZCBsZW4KKyAgIGFyZSBpZ25vcmVkLCBkYXRhIGlzIHdyaXR0ZW4gdG8gb3V0X2ZkIGFuZCByZXR1cm4gaXMgUkVUVkFMX09LIG9yIGVycm9yLgorCisgICBOQjogcmVhZF9idW56aXAgcmV0dXJucyA8IDAgb24gZXJyb3IsIG9yIHRoZSBudW1iZXIgb2YgKnVuZmlsbGVkKiBieXRlcworICAgaW4gb3V0YnVmLiBJT1c6IG9uIEVPRiByZXR1cm5zIGxlbiAoImFsbCBieXRlcyBhcmUgbm90IGZpbGxlZCIpLCBub3QgMC4KKyAgIChXaHk/IFRoaXMgYWxsb3dzIHRvIGdldCByaWQgb2Ygb25lIGxvY2FsIHZhcmlhYmxlKQorKi8KK2ludCBGQVNUX0ZVTkMgcmVhZF9idW56aXAoYnVuemlwX2RhdGEgKmJkLCBjaGFyICpvdXRidWYsIGludCBsZW4pCit7CisJY29uc3QgdWludDMyX3QgKmRidWY7CisJaW50IHBvcywgY3VycmVudCwgcHJldmlvdXM7CisJdWludDMyX3QgQ1JDOworCisJLyogSWYgd2UgYWxyZWFkeSBoYXZlIGVycm9yL2VuZCBpbmRpY2F0b3IsIHJldHVybiBpdCAqLworCWlmIChiZC0+d3JpdGVDb3VudCA8IDApCisJCXJldHVybiBiZC0+d3JpdGVDb3VudDsKKworCWRidWYgPSBiZC0+ZGJ1ZjsKKworCS8qIFJlZ2lzdGVyLWNhY2hlZCBzdGF0ZSAoaG9wZWZ1bGx5KTogKi8KKwlwb3MgPSBiZC0+d3JpdGVQb3M7CisJY3VycmVudCA9IGJkLT53cml0ZUN1cnJlbnQ7CisJQ1JDID0gYmQtPndyaXRlQ1JDOyAvKiBzbWFsbCBsb3NzIG9uIHg4Ni0zMiAobm90IGVub3VnaCByZWdzKSwgd2luIG9uIHg4Ni02NCAqLworCisJLyogV2Ugd2lsbCBhbHdheXMgaGF2ZSBwZW5kaW5nIGRlY29kZWQgZGF0YSB0byB3cml0ZSBpbnRvIHRoZSBvdXRwdXQKKwkgICBidWZmZXIgdW5sZXNzIHRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2FsbCAoaW4gd2hpY2ggY2FzZSB3ZSBoYXZlbid0CisJICAgSHVmZm1hbi1kZWNvZGVkIGEgYmxvY2sgaW50byB0aGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciB5ZXQpLiAqLworCWlmIChiZC0+d3JpdGVDb3BpZXMpIHsKKworIGRlY193cml0ZUNvcGllczoKKwkJLyogSW5zaWRlIHRoZSBsb29wLCB3cml0ZUNvcGllcyBtZWFucyBleHRyYSBjb3BpZXMgKGJleW9uZCAxKSAqLworCQktLWJkLT53cml0ZUNvcGllczsKKworCQkvKiBMb29wIG91dHB1dHRpbmcgYnl0ZXMgKi8KKwkJZm9yICg7OykgeworCisJCQkvKiBJZiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLCBzYXZlIGNhY2hlZCBzdGF0ZSBhbmQgcmV0dXJuICovCisJCQlpZiAoLS1sZW4gPCAwKSB7CisJCQkJLyogVW5saWtlbHkgYnJhbmNoLgorCQkJCSAqIFVzZSBvZiAiZ290byIgaW5zdGVhZCBvZiBrZWVwaW5nIGNvZGUgaGVyZQorCQkJCSAqIGhlbHBzIGNvbXBpbGVyIHRvIHJlYWxpemUgdGhpcy4gKi8KKwkJCQlnb3RvIG91dGJ1Zl9mdWxsOworCQkJfQorCisJCQkvKiBXcml0ZSBuZXh0IGJ5dGUgaW50byBvdXRwdXQgYnVmZmVyLCB1cGRhdGluZyBDUkMgKi8KKwkJCSpvdXRidWYrKyA9IGN1cnJlbnQ7CisJCQlDUkMgPSAoQ1JDIDw8IDgpIF4gYmQtPmNyYzMyVGFibGVbKENSQyA+PiAyNCkgXiBjdXJyZW50XTsKKworCQkJLyogTG9vcCBub3cgaWYgd2UncmUgb3V0cHV0dGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhpcyBieXRlICovCisJCQlpZiAoYmQtPndyaXRlQ29waWVzKSB7CisJCQkJLyogVW5saWtlbHkgYnJhbmNoICovCisJCQkJLyotLWJkLT53cml0ZUNvcGllczsqLworCQkJCS8qY29udGludWU7Ki8KKwkJCQkvKiBTYW1lLCBidXQgKGFiKXVzaW5nIG90aGVyIGV4aXN0aW5nIC0td3JpdGVDb3BpZXMgb3BlcmF0aW9uCisJCQkJICogKGFuZCB0aGlzIGlmKCkgY29tcGlsZXMgaW50byBqdXN0IHRlc3QrYnJhbmNoIHBhaXIpOiAqLworCQkJCWdvdG8gZGVjX3dyaXRlQ29waWVzOworCQkJfQorIGRlY29kZV9uZXh0X2J5dGU6CisJCQlpZiAoLS1iZC0+d3JpdGVDb3VudCA8IDApCisJCQkJYnJlYWs7IC8qIGlucHV0IGJsb2NrIGlzIGZ1bGx5IGNvbnN1bWVkLCBuZWVkIG5leHQgb25lICovCisKKwkJCS8qIEZvbGxvdyBzZXF1ZW5jZSB2ZWN0b3IgdG8gdW5kbyBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtICovCisJCQlwcmV2aW91cyA9IGN1cnJlbnQ7CisJCQlwb3MgPSBkYnVmW3Bvc107CisJCQljdXJyZW50ID0gKHVpbnQ4X3QpcG9zOworCQkJcG9zID4+PSA4OworCisJCQkvKiBBZnRlciAzIGNvbnNlY3V0aXZlIGNvcGllcyBvZiB0aGUgc2FtZSBieXRlLCB0aGUgNHRoCisJCQkgKiBpcyBhIHJlcGVhdCBjb3VudC4gIFdlIGNvdW50IGRvd24gZnJvbSA0IGluc3RlYWQKKwkJCSAqIG9mIGNvdW50aW5nIHVwIGJlY2F1c2UgdGVzdGluZyBmb3Igbm9uLXplcm8gaXMgZmFzdGVyICovCisJCQlpZiAoLS1iZC0+d3JpdGVSdW5Db3VudGRvd24gIT0gMCkgeworCQkJCWlmIChjdXJyZW50ICE9IHByZXZpb3VzKQorCQkJCQliZC0+d3JpdGVSdW5Db3VudGRvd24gPSA0OworCQkJfSBlbHNlIHsKKwkJCQkvKiBVbmxpa2VseSBicmFuY2ggKi8KKwkJCQkvKiBXZSBoYXZlIGEgcmVwZWF0ZWQgcnVuLCB0aGlzIGJ5dGUgaW5kaWNhdGVzIHRoZSBjb3VudCAqLworCQkJCWJkLT53cml0ZUNvcGllcyA9IGN1cnJlbnQ7CisJCQkJY3VycmVudCA9IHByZXZpb3VzOworCQkJCWJkLT53cml0ZVJ1bkNvdW50ZG93biA9IDU7CisKKwkJCQkvKiBTb21ldGltZXMgdGhlcmUgYXJlIGp1c3QgMyBieXRlcyAocnVuIGxlbmd0aCAwKSAqLworCQkJCWlmICghYmQtPndyaXRlQ29waWVzKSBnb3RvIGRlY29kZV9uZXh0X2J5dGU7CisKKwkJCQkvKiBTdWJ0cmFjdCB0aGUgMSBjb3B5IHdlJ2Qgb3V0cHV0IGFueXdheSB0byBnZXQgZXh0cmFzICovCisJCQkJLS1iZC0+d3JpdGVDb3BpZXM7CisJCQl9CisJCX0gLyogZm9yKDs7KSAqLworCisJCS8qIERlY29tcHJlc3Npb24gb2YgdGhpcyBpbnB1dCBibG9jayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCWJkLT53cml0ZUNSQyA9IENSQyA9IH5DUkM7CisJCWJkLT50b3RhbENSQyA9ICgoYmQtPnRvdGFsQ1JDIDw8IDEpIHwgKGJkLT50b3RhbENSQyA+PiAzMSkpIF4gQ1JDOworCisJCS8qIElmIHRoaXMgYmxvY2sgaGFkIGEgQ1JDIGVycm9yLCBmb3JjZSBmaWxlIGxldmVsIENSQyBlcnJvciAqLworCQlpZiAoQ1JDICE9IGJkLT5oZWFkZXJDUkMpIHsKKwkJCWJkLT50b3RhbENSQyA9IGJkLT5oZWFkZXJDUkMgKyAxOworCQkJcmV0dXJuIFJFVFZBTF9MQVNUX0JMT0NLOworCQl9CisJfQorCisJLyogUmVmaWxsIHRoZSBpbnRlcm1lZGlhdGUgYnVmZmVyIGJ5IEh1ZmZtYW4tZGVjb2RpbmcgbmV4dCBibG9jayBvZiBpbnB1dCAqLworCXsKKwkJaW50IHIgPSBnZXRfbmV4dF9ibG9jayhiZCk7CisJCWlmIChyKSB7IC8qIGVycm9yL2VuZCAqLworCQkJYmQtPndyaXRlQ291bnQgPSByOworCQkJcmV0dXJuIChyICE9IFJFVFZBTF9MQVNUX0JMT0NLKSA/IHIgOiBsZW47CisJCX0KKwl9CisKKwlDUkMgPSB+MDsKKwlwb3MgPSBiZC0+d3JpdGVQb3M7CisJY3VycmVudCA9IGJkLT53cml0ZUN1cnJlbnQ7CisJZ290byBkZWNvZGVfbmV4dF9ieXRlOworCisgb3V0YnVmX2Z1bGw6CisJLyogT3V0cHV0IGJ1ZmZlciBpcyBmdWxsLCBzYXZlIGNhY2hlZCBzdGF0ZSBhbmQgcmV0dXJuICovCisJYmQtPndyaXRlUG9zID0gcG9zOworCWJkLT53cml0ZUN1cnJlbnQgPSBjdXJyZW50OworCWJkLT53cml0ZUNSQyA9IENSQzsKKworCWJkLT53cml0ZUNvcGllcysrOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUsIHJlYWQgZmlsZSBoZWFkZXIuICBJZiBpbl9mZD09LTEsIGluYnVmIG11c3QgY29udGFpbgorICAgYSBjb21wbGV0ZSBidW56aXAgZmlsZSAobGVuIGJ5dGVzIGxvbmcpLiAgSWYgaW5fZmQhPS0xLCBpbmJ1ZiBhbmQgbGVuIGFyZQorICAgaWdub3JlZCwgYW5kIGRhdGEgaXMgcmVhZCBmcm9tIGZpbGUgaGFuZGxlIGludG8gdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KKworLyogQmVjYXVzZSBidW56aXAyIGlzIHVzZWQgZm9yIGhlbHAgdGV4dCB1bnBhY2tpbmcsIGFuZCBiZWNhdXNlIGJiX3Nob3dfdXNhZ2UoKQorICAgc2hvdWxkIHdvcmsgZm9yIE5PRk9SSyBhcHBsZXRzIHRvbywgd2UgbXVzdCBiZSBleHRyZW1lbHkgY2FyZWZ1bCB0byBub3QgbGVhaworICAgYW55IGFsbG9jYXRpb25zISAqLworaW50IEZBU1RfRlVOQyBzdGFydF9idW56aXAoYnVuemlwX2RhdGEgKipiZHAsIGludCBpbl9mZCwKKwkJY29uc3Qgdm9pZCAqaW5idWYsIGludCBsZW4pCit7CisJYnVuemlwX2RhdGEgKmJkOworCXVuc2lnbmVkIGk7CisJZW51bSB7CisJCUJaaDAgPSAoJ0InIDw8IDI0KSArICgnWicgPDwgMTYpICsgKCdoJyA8PCA4KSArICcwJywKKwkJaDAgPSAoJ2gnIDw8IDgpICsgJzAnLAorCX07CisKKwkvKiBGaWd1cmUgb3V0IGhvdyBtdWNoIGRhdGEgdG8gYWxsb2NhdGUgKi8KKwlpID0gc2l6ZW9mKGJ1bnppcF9kYXRhKTsKKwlpZiAoaW5fZmQgIT0gLTEpIGkgKz0gSU9CVUZfU0laRTsKKworCS8qIEFsbG9jYXRlIGJ1bnppcF9kYXRhLiAgTW9zdCBmaWVsZHMgaW5pdGlhbGl6ZSB0byB6ZXJvLiAqLworCWJkID0gKmJkcCA9IHh6YWxsb2MoaSk7CisKKwkvKiBTZXR1cCBpbnB1dCBidWZmZXIgKi8KKwliZC0+aW5fZmQgPSBpbl9mZDsKKwlpZiAoLTEgPT0gaW5fZmQpIHsKKwkJLyogaW4gdGhpcyBjYXNlLCBiZC0+aW5idWYgaXMgcmVhZC1vbmx5ICovCisJCWJkLT5pbmJ1ZiA9ICh2b2lkKilpbmJ1ZjsgLyogY2FzdCBhd2F5IGNvbnN0LW5lc3MgKi8KKwl9IGVsc2UgeworCQliZC0+aW5idWYgPSAodWludDhfdCopKGJkICsgMSk7CisJCW1lbWNweShiZC0+aW5idWYsIGluYnVmLCBsZW4pOworCX0KKwliZC0+aW5idWZDb3VudCA9IGxlbjsKKworCS8qIEluaXQgdGhlIENSQzMyIHRhYmxlIChiaWcgZW5kaWFuKSAqLworCWNyYzMyX2ZpbGx0YWJsZShiZC0+Y3JjMzJUYWJsZSwgMSk7CisKKwkvKiBTZXR1cCBmb3IgSS9PIGVycm9yIGhhbmRsaW5nIHZpYSBsb25nam1wICovCisJaSA9IHNldGptcChiZC0+am1wYnVmKTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwkvKiBFbnN1cmUgdGhhdCBmaWxlIHN0YXJ0cyB3aXRoICJCWmhbJzEnLSc5J10uIiAqLworCS8qIFVwZGF0ZTogbm93IGNhbGxlciB2ZXJpZmllcyAxc3QgdHdvIGJ5dGVzLCBtYWtlcyAuZ3ovLmJ6MgorCSAqIGludGVncmF0aW9uIGVhc2llciAqLworCS8qIHdhczogKi8KKwkvKiBpID0gZ2V0X2JpdHMoYmQsIDMyKTsgKi8KKwkvKiBpZiAoKHVuc2lnbmVkKShpIC0gQlpoMCAtIDEpID49IDkpIHJldHVybiBSRVRWQUxfTk9UX0JaSVBfREFUQTsgKi8KKwlpID0gZ2V0X2JpdHMoYmQsIDE2KTsKKwlpZiAoKHVuc2lnbmVkKShpIC0gaDAgLSAxKSA+PSA5KSByZXR1cm4gUkVUVkFMX05PVF9CWklQX0RBVEE7CisKKwkvKiBGb3VydGggYnl0ZSAoYXNjaWkgJzEnLSc5JykgaW5kaWNhdGVzIGJsb2NrIHNpemUgaW4gdW5pdHMgb2YgMTAwayBvZgorCSAgIHVuY29tcHJlc3NlZCBkYXRhLiAgQWxsb2NhdGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgYmxvY2suICovCisJLyogYmQtPmRidWZTaXplID0gMTAwMDAwICogKGkgLSBCWmgwKTsgKi8KKwliZC0+ZGJ1ZlNpemUgPSAxMDAwMDAgKiAoaSAtIGgwKTsKKworCS8qIENhbm5vdCB1c2UgeG1hbGxvYyAtIG1heSBsZWFrIGJkIGluIE5PRk9SSyBjYXNlISAqLworCWJkLT5kYnVmID0gbWFsbG9jX29yX3dhcm4oYmQtPmRidWZTaXplICogc2l6ZW9mKGJkLT5kYnVmWzBdKSk7CisJaWYgKCFiZC0+ZGJ1ZikgeworCQlmcmVlKGJkKTsKKwkJeGZ1bmNfZGllKCk7CisJfQorCXJldHVybiBSRVRWQUxfT0s7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGRlYWxsb2NfYnVuemlwKGJ1bnppcF9kYXRhICpiZCkKK3sKKwlmcmVlKGJkLT5kYnVmKTsKKwlmcmVlKGJkKTsKK30KKworCisvKiBEZWNvbXByZXNzIHNyY19mZCB0byBkc3RfZmQuICBTdG9wcyBhdCBlbmQgb2YgYnppcCBkYXRhLCBub3QgZW5kIG9mIGZpbGUuICovCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQwordW5wYWNrX2J6Ml9zdHJlYW0oaW50IHNyY19mZCwgaW50IGRzdF9mZCkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZyB0b3RhbF93cml0dGVuID0gMDspCisJYnVuemlwX2RhdGEgKmJkOworCWNoYXIgKm91dGJ1ZjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsZW47CisKKwlvdXRidWYgPSB4bWFsbG9jKElPQlVGX1NJWkUpOworCWxlbiA9IDA7CisJd2hpbGUgKDEpIHsgLyogIlByb2Nlc3Mgb25lIEJaLi4uIHN0cmVhbSIgbG9vcCAqLworCisJCWkgPSBzdGFydF9idW56aXAoJmJkLCBzcmNfZmQsIG91dGJ1ZiArIDIsIGxlbik7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJd2hpbGUgKDEpIHsgLyogIlByb2R1Y2Ugc29tZSBvdXRwdXQgYnl0ZXMiIGxvb3AgKi8KKwkJCQlpID0gcmVhZF9idW56aXAoYmQsIG91dGJ1ZiwgSU9CVUZfU0laRSk7CisJCQkJaWYgKGkgPCAwKSAvKiBlcnJvcj8gKi8KKwkJCQkJYnJlYWs7CisJCQkJaSA9IElPQlVGX1NJWkUgLSBpOyAvKiBudW1iZXIgb2YgYnl0ZXMgcHJvZHVjZWQgKi8KKwkJCQlpZiAoaSA9PSAwKSAvKiBFT0Y/ICovCisJCQkJCWJyZWFrOworCQkJCWlmIChpICE9IGZ1bGxfd3JpdGUoZHN0X2ZkLCBvdXRidWYsIGkpKSB7CisJCQkJCWJiX2Vycm9yX21zZygic2hvcnQgd3JpdGUiKTsKKwkJCQkJaSA9IFJFVFZBTF9TSE9SVF9XUklURTsKKwkJCQkJZ290byByZWxlYXNlX21lbTsKKwkJCQl9CisJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IGk7KQorCQkJfQorCQl9CisKKwkJaWYgKGkgIT0gUkVUVkFMX0xBU1RfQkxPQ0spIHsKKwkJCWJiX2Vycm9yX21zZygiYnVuemlwIGVycm9yICVkIiwgaSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYmQtPmhlYWRlckNSQyAhPSBiZC0+dG90YWxDUkMpIHsKKwkJCWJiX2Vycm9yX21zZygiQ1JDIGVycm9yIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFN1Y2Nlc3NmdWxseSB1bnBhY2tlZCBvbmUgQlogc3RyZWFtICovCisJCWkgPSBSRVRWQUxfT0s7CisKKwkJLyogRG8gd2UgaGF2ZSAiQlouLi4iIGFmdGVyIGxhc3QgcHJvY2Vzc2VkIGJ5dGU/CisJCSAqIHBiemlwMiAocGFyYWxsZWxpemVkIGJ6aXAyKSBwcm9kdWNlcyBzdWNoIGZpbGVzLgorCQkgKi8KKwkJbGVuID0gYmQtPmluYnVmQ291bnQgLSBiZC0+aW5idWZQb3M7CisJCW1lbWNweShvdXRidWYsICZiZC0+aW5idWZbYmQtPmluYnVmUG9zXSwgbGVuKTsKKwkJaWYgKGxlbiA8IDIpIHsKKwkJCWlmIChzYWZlX3JlYWQoc3JjX2ZkLCBvdXRidWYgKyBsZW4sIDIgLSBsZW4pICE9IDIgLSBsZW4pCisJCQkJYnJlYWs7CisJCQlsZW4gPSAyOworCQl9CisJCWlmICgqKHVpbnQxNl90KilvdXRidWYgIT0gQlpJUDJfTUFHSUMpIC8qICJCWiI/ICovCisJCQlicmVhazsKKwkJZGVhbGxvY19idW56aXAoYmQpOworCQlsZW4gLT0gMjsKKwl9CisKKyByZWxlYXNlX21lbToKKwlkZWFsbG9jX2J1bnppcChiZCk7CisJZnJlZShvdXRidWYpOworCisJcmV0dXJuIGkgPyBpIDogSUZfREVTS1RPUCh0b3RhbF93cml0dGVuKSArIDA7Cit9CisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfYnoyX3N0cmVhbV9wcmltZShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKQoreworCXVpbnQxNl90IG1hZ2ljMjsKKwl4cmVhZChzcmNfZmQsICZtYWdpYzIsIDIpOworCWlmIChtYWdpYzIgIT0gQlpJUDJfTUFHSUMpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgbWFnaWMiKTsKKwl9CisJcmV0dXJuIHVucGFja19iejJfc3RyZWFtKHNyY19mZCwgZHN0X2ZkKTsKK30KKworI2lmZGVmIFRFU1RJTkcKKworc3RhdGljIGNoYXIgKmNvbnN0IGJ1bnppcF9lcnJvcnNbXSA9IHsKKwlOVUxMLCAiQmFkIGZpbGUgY2hlY2tzdW0iLCAiTm90IGJ6aXAgZGF0YSIsCisJIlVuZXhwZWN0ZWQgaW5wdXQgRU9GIiwgIlVuZXhwZWN0ZWQgb3V0cHV0IEVPRiIsICJEYXRhIGVycm9yIiwKKwkiT3V0IG9mIG1lbW9yeSIsICJPYnNvbGV0ZSAocHJlIDAuOS41KSBiemlwIGZvcm1hdCBub3Qgc3VwcG9ydGVkIgorfTsKKworLyogRHVtYiBsaXR0bGUgdGVzdCB0aGluZywgZGVjb21wcmVzcyBzdGRpbiB0byBzdGRvdXQgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwljaGFyIGM7CisKKwlpbnQgaSA9IHVucGFja19iejJfc3RyZWFtX3ByaW1lKDAsIDEpOworCWlmIChpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVuemlwX2Vycm9yc1staV0pOworCWVsc2UgaWYgKHJlYWQoU1RESU5fRklMRU5PLCAmYywgMSkpCisJCWZwcmludGYoc3RkZXJyLCAiVHJhaWxpbmcgZ2FyYmFnZSBpZ25vcmVkXG4iKTsKKwlyZXR1cm4gLWk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bmNvbXByZXNzLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDYxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5jb21wcmVzcy5jCkBAIC0wLDAgKzEsMzEwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHVuY29tcHJlc3MgZm9yIGJ1c3lib3ggLS0gKGMpIDIwMDIgUm9iZXJ0IEdyaWVibAorICoKKyAqIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBjb21wcmVzczQyLmMgc291cmNlCisgKiAoc2VlIGRpc2NsYWltZXIgYmVsb3cpCisgKi8KKworLyogKE4pY29tcHJlc3M0Mi5jIC0gRmlsZSBjb21wcmVzc2lvbiBhbGEgSUVFRSBDb21wdXRlciwgTWFyIDE5OTIuCisgKgorICogQXV0aG9yczoKKyAqICAgU3BlbmNlciBXLiBUaG9tYXMgICAoZGVjdmF4IWhhcnBvIXV0YWgtY3MhdXRhaC1nciF0aG9tYXMpCisgKiAgIEppbSBNY0tpZSAgICAgICAgICAgKGRlY3ZheCFtY3ZheCFqaW0pCisgKiAgIFN0ZXZlIERhdmllcyAgICAgICAgKGRlY3ZheCF2YXgxMzUhcGV0c2QhcGVvcmEhc3JkKQorICogICBLZW4gVHVya293c2tpICAgICAgIChkZWN2YXghZGVjd3JsIXR1cnRsZXZheCFrZW4pCisgKiAgIEphbWVzIEEuIFdvb2RzICAgICAgKGRlY3ZheCFpaG5wNCFhbWVzIWphdykKKyAqICAgSm9lIE9yb3N0ICAgICAgICAgICAoZGVjdmF4IXZheDEzNSFwZXRzZCFqb2UpCisgKiAgIERhdmUgTWFjayAgICAgICAgICAgKGNzdUBhbGVtYmljLmFjcy5jb20pCisgKiAgIFBldGVyIEphbm5lc2VuLCBOZXR3b3JrIENvbW11bmljYXRpb24gU3lzdGVtcworICogICAgICAgICAgICAgICAgICAgICAgIChwZXRlckBuY3MubmwpCisgKgorICogbWFyY0BzdXNlLmRlIDogYSBzbWFsbCBzZWN1cml0eSBmaXggZm9yIGEgYnVmZmVyIG92ZXJmbG93CisgKgorICogWy4uLiBIaXN0b3J5IHNuaXBwZWQgLi4uXQorICoKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKworLyogRGVmYXVsdCBpbnB1dCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBJQlVGU0laIDIwNDgKKworLyogRGVmYXVsdCBvdXRwdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgT0JVRlNJWiAyMDQ4CisKKy8qIERlZmluZXMgZm9yIHRoaXJkIGJ5dGUgb2YgaGVhZGVyICovCisjZGVmaW5lIEJJVF9NQVNLICAgICAgICAweDFmICAgIC8qIE1hc2sgZm9yICdudW1iZXIgb2YgY29tcHJlc3NzaW9uIGJpdHMnICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hc2tzIDB4MjAgYW5kIDB4NDAgYXJlIGZyZWUuICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEkgdGhpbmsgMHgyMCBzaG91bGQgbWVhbiB0aGF0IHRoZXJlIGlzICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEgZm91cnRoIGhlYWRlciBieXRlIChmb3IgZXhwYW5zaW9uKS4gICAgICAgICovCisjZGVmaW5lIEJMT0NLX01PREUgICAgICAweDgwICAgIC8qIEJsb2NrIGNvbXByZXNzaW9uIGlmIHRhYmxlIGlzIGZ1bGwgYW5kICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIHJhdGUgaXMgZHJvcHBpbmcgZmx1c2ggdGFibGVzICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBuZXh0IHR3byBjb2RlcyBzaG91bGQgbm90IGJlIGNoYW5nZWQgbGlnaHRseSwgYXMgdGhleSBtdXN0IG5vdCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpZSB3aXRoaW4gdGhlIGNvbnRpZ3VvdXMgZ2VuZXJhbCBjb2RlIHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZJUlNUICAgMjU3ICAgICAvKiBmaXJzdCBmcmVlIGVudHJ5ICovCisjZGVmaW5lIENMRUFSICAgMjU2ICAgICAvKiB0YWJsZSBjbGVhciBvdXRwdXQgY29kZSAqLworCisjZGVmaW5lIElOSVRfQklUUyA5ICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBiaXRzL2NvZGUgKi8KKworCisvKiBtYWNoaW5lIHZhcmlhbnRzIHdoaWNoIHJlcXVpcmUgY2MgLURtYWNoaW5lOiAgcGRwMTEsIHo4MDAwLCBET1MgKi8KKyNkZWZpbmUgSEJJVFMgICAgICAxNyAgIC8qIDUwJSBvY2N1cGFuY3kgKi8KKyNkZWZpbmUgSFNJWkUgICAgICAoMTw8SEJJVFMpCisjZGVmaW5lIEhNQVNLICAgICAgKEhTSVpFLTEpICAgIC8qIHVudXNlZCAqLworI2RlZmluZSBIUFJJTUUgICAgIDk5NDEgICAgICAgICAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgQklUUyAgICAgICAxNgorI2RlZmluZSBCSVRTX1NUUiAgICIxNiIKKyN1bmRlZiAgTUFYU0VHXzY0SyAgICAgICAgICAgICAgLyogdW51c2VkICovCisjZGVmaW5lIE1BWENPREUobikgKDFMIDw8IChuKSkKKworI2RlZmluZSBodGFib2YoaSkgICAgICAgICAgICAgICBodGFiW2ldCisjZGVmaW5lIGNvZGV0YWJvZihpKSAgICAgICAgICAgIGNvZGV0YWJbaV0KKyNkZWZpbmUgdGFiX3ByZWZpeG9mKGkpICAgICAgICAgY29kZXRhYm9mKGkpCisjZGVmaW5lIHRhYl9zdWZmaXhvZihpKSAgICAgICAgICgodW5zaWduZWQgY2hhciAqKShodGFiKSlbaV0KKyNkZWZpbmUgZGVfc3RhY2sgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJihodGFiW0hTSVpFLTFdKSkKKyNkZWZpbmUgY2xlYXJfdGFiX3ByZWZpeG9mKCkgICAgbWVtc2V0KGNvZGV0YWIsIDAsIDI1NikKKworLyoKKyAqIERlY29tcHJlc3Mgc3RkaW4gdG8gc3Rkb3V0LiAgVGhpcyByb3V0aW5lIGFkYXB0cyB0byB0aGUgY29kZXMgaW4gdGhlCisgKiBmaWxlIGJ1aWxkaW5nIHRoZSAic3RyaW5nIiB0YWJsZSBvbi10aGUtZmx5OyByZXF1aXJpbmcgbm8gdGFibGUgdG8KKyAqIGJlIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLgorICovCisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfWl9zdHJlYW0oaW50IGZkX2luLCBpbnQgZmRfb3V0KQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nIHRvdGFsX3dyaXR0ZW4gPSAwOykKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHJldHZhbCA9IC0xOworCXVuc2lnbmVkIGNoYXIgKnN0YWNrcDsKKwlsb25nIGNvZGU7CisJaW50IGZpbmNoYXI7CisJbG9uZyBvbGRjb2RlOworCWxvbmcgaW5jb2RlOworCWludCBpbmJpdHM7CisJaW50IHBvc2JpdHM7CisJaW50IG91dHBvczsKKwlpbnQgaW5zaXplOworCWludCBiaXRtYXNrOworCWxvbmcgZnJlZV9lbnQ7CisJbG9uZyBtYXhjb2RlOworCWxvbmcgbWF4bWF4Y29kZTsKKwlpbnQgbl9iaXRzOworCWludCByc2l6ZSA9IDA7CisJdW5zaWduZWQgY2hhciAqaW5idWY7IC8qIHdlcmUgZWF0aW5nIGluc2FuZSBhbW91bnRzIG9mIHN0YWNrIC0gKi8KKwl1bnNpZ25lZCBjaGFyICpvdXRidWY7IC8qIGJhZCBmb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzICovCisJdW5zaWduZWQgY2hhciAqaHRhYjsKKwl1bnNpZ25lZCBzaG9ydCAqY29kZXRhYjsKKworCS8qIEhtbSwgdGhlc2Ugd2VyZSBzdGF0aWNzIC0gd2h5PyEgKi8KKwkvKiB1c2VyIHNldHRhYmxlIG1heCAjIGJpdHMvY29kZSAqLworCWludCBtYXhiaXRzOyAvKiA9IEJJVFM7ICovCisJLyogYmxvY2sgY29tcHJlc3MgbW9kZSAtQyBjb21wYXRpYmxlIHdpdGggMi4wICovCisJaW50IGJsb2NrX21vZGU7IC8qID0gQkxPQ0tfTU9ERTsgKi8KKworCWluYnVmID0geHphbGxvYyhJQlVGU0laICsgNjQpOworCW91dGJ1ZiA9IHh6YWxsb2MoT0JVRlNJWiArIDIwNDgpOworCWh0YWIgPSB4emFsbG9jKEhTSVpFKTsgIC8qIHdzbid0IHplcm9lZCBvdXQgYmVmb3JlLCBtYXliZSBjYW4geG1hbGxvYz8gKi8KKwljb2RldGFiID0geHphbGxvYyhIU0laRSAqIHNpemVvZihjb2RldGFiWzBdKSk7CisKKwlpbnNpemUgPSAwOworCisJLyogeHJlYWQgaXNuJ3QgZ29vZCBoZXJlLCB3ZSBoYXZlIHRvIHJldHVybiAtIGNhbGxlciBtYXkgd2FudAorCSAqIHRvIGRvIHNvbWUgY2xlYW51cCAoZS5nLiBkZWxldGUgaW5jb21wbGV0ZSB1bnBhY2tlZCBmaWxlIGV0YykgKi8KKwlpZiAoZnVsbF9yZWFkKGZkX2luLCBpbmJ1ZiwgMSkgIT0gMSkgeworCQliYl9lcnJvcl9tc2coInNob3J0IHJlYWQiKTsKKwkJZ290byBlcnI7CisJfQorCisJbWF4Yml0cyA9IGluYnVmWzBdICYgQklUX01BU0s7CisJYmxvY2tfbW9kZSA9IGluYnVmWzBdICYgQkxPQ0tfTU9ERTsKKwltYXhtYXhjb2RlID0gTUFYQ09ERShtYXhiaXRzKTsKKworCWlmIChtYXhiaXRzID4gQklUUykgeworCQliYl9lcnJvcl9tc2coImNvbXByZXNzZWQgd2l0aCAlZCBiaXRzLCBjYW4gb25seSBoYW5kbGUgIgorCQkJCUJJVFNfU1RSIiBiaXRzIiwgbWF4Yml0cyk7CisJCWdvdG8gZXJyOworCX0KKworCW5fYml0cyA9IElOSVRfQklUUzsKKwltYXhjb2RlID0gTUFYQ09ERShJTklUX0JJVFMpIC0gMTsKKwliaXRtYXNrID0gKDEgPDwgSU5JVF9CSVRTKSAtIDE7CisJb2xkY29kZSA9IC0xOworCWZpbmNoYXIgPSAwOworCW91dHBvcyA9IDA7CisJcG9zYml0cyA9IDAgPDwgMzsKKworCWZyZWVfZW50ID0gKChibG9ja19tb2RlKSA/IEZJUlNUIDogMjU2KTsKKworCS8qIEFzIGFib3ZlLCBpbml0aWFsaXplIHRoZSBmaXJzdCAyNTYgZW50cmllcyBpbiB0aGUgdGFibGUuICovCisJLypjbGVhcl90YWJfcHJlZml4b2YoKTsgLSBkb25lIGJ5IHh6YWxsb2MgKi8KKworCWZvciAoY29kZSA9IDI1NTsgY29kZSA+PSAwOyAtLWNvZGUpIHsKKwkJdGFiX3N1ZmZpeG9mKGNvZGUpID0gKHVuc2lnbmVkIGNoYXIpIGNvZGU7CisJfQorCisJZG8geworIHJlc2V0YnVmOgorCQl7CisJCQlpbnQgaTsKKwkJCWludCBlOworCQkJaW50IG87CisKKwkJCW8gPSBwb3NiaXRzID4+IDM7CisJCQllID0gaW5zaXplIC0gbzsKKworCQkJZm9yIChpID0gMDsgaSA8IGU7ICsraSkKKwkJCQlpbmJ1ZltpXSA9IGluYnVmW2kgKyBvXTsKKworCQkJaW5zaXplID0gZTsKKwkJCXBvc2JpdHMgPSAwOworCQl9CisKKwkJaWYgKGluc2l6ZSA8IChpbnQpIChJQlVGU0laICsgNjQpIC0gSUJVRlNJWikgeworCQkJcnNpemUgPSBzYWZlX3JlYWQoZmRfaW4sIGluYnVmICsgaW5zaXplLCBJQlVGU0laKTsKKwkJCWlmIChyc2l6ZSA8IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJaW5zaXplICs9IHJzaXplOworCQl9CisKKwkJaW5iaXRzID0gKChyc2l6ZSA+IDApID8gKGluc2l6ZSAtIGluc2l6ZSAlIG5fYml0cykgPDwgMyA6CisJCQkJICAoaW5zaXplIDw8IDMpIC0gKG5fYml0cyAtIDEpKTsKKworCQl3aGlsZSAoaW5iaXRzID4gcG9zYml0cykgeworCQkJaWYgKGZyZWVfZW50ID4gbWF4Y29kZSkgeworCQkJCXBvc2JpdHMgPQorCQkJCQkoKHBvc2JpdHMgLSAxKSArCisJCQkJCSAoKG5fYml0cyA8PCAzKSAtCisJCQkJCSAgKHBvc2JpdHMgLSAxICsgKG5fYml0cyA8PCAzKSkgJSAobl9iaXRzIDw8IDMpKSk7CisJCQkJKytuX2JpdHM7CisJCQkJaWYgKG5fYml0cyA9PSBtYXhiaXRzKSB7CisJCQkJCW1heGNvZGUgPSBtYXhtYXhjb2RlOworCQkJCX0gZWxzZSB7CisJCQkJCW1heGNvZGUgPSBNQVhDT0RFKG5fYml0cykgLSAxOworCQkJCX0KKwkJCQliaXRtYXNrID0gKDEgPDwgbl9iaXRzKSAtIDE7CisJCQkJZ290byByZXNldGJ1ZjsKKwkJCX0KKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpwID0gJmluYnVmW3Bvc2JpdHMgPj4gM107CisKKwkJCQljb2RlID0gKCgoKGxvbmcpIChwWzBdKSkgfCAoKGxvbmcpIChwWzFdKSA8PCA4KSB8CisJCQkJICAgICAgICAgKChsb25nKSAocFsyXSkgPDwgMTYpKSA+PiAocG9zYml0cyAmIDB4NykpICYgYml0bWFzazsKKwkJCX0KKwkJCXBvc2JpdHMgKz0gbl9iaXRzOworCisKKwkJCWlmIChvbGRjb2RlID09IC0xKSB7CisJCQkJaWYgKGNvZGUgPj0gMjU2KQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIGRhdGEiKTsgLyogJWxkIiwgY29kZSk7ICovCisJCQkJb2xkY29kZSA9IGNvZGU7CisJCQkJZmluY2hhciA9IChpbnQpIG9sZGNvZGU7CisJCQkJb3V0YnVmW291dHBvcysrXSA9ICh1bnNpZ25lZCBjaGFyKSBmaW5jaGFyOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoY29kZSA9PSBDTEVBUiAmJiBibG9ja19tb2RlKSB7CisJCQkJY2xlYXJfdGFiX3ByZWZpeG9mKCk7CisJCQkJZnJlZV9lbnQgPSBGSVJTVCAtIDE7CisJCQkJcG9zYml0cyA9CisJCQkJCSgocG9zYml0cyAtIDEpICsKKwkJCQkJICgobl9iaXRzIDw8IDMpIC0KKwkJCQkJICAocG9zYml0cyAtIDEgKyAobl9iaXRzIDw8IDMpKSAlIChuX2JpdHMgPDwgMykpKTsKKwkJCQluX2JpdHMgPSBJTklUX0JJVFM7CisJCQkJbWF4Y29kZSA9IE1BWENPREUoSU5JVF9CSVRTKSAtIDE7CisJCQkJYml0bWFzayA9ICgxIDw8IElOSVRfQklUUykgLSAxOworCQkJCWdvdG8gcmVzZXRidWY7CisJCQl9CisKKwkJCWluY29kZSA9IGNvZGU7CisJCQlzdGFja3AgPSBkZV9zdGFjazsKKworCQkJLyogU3BlY2lhbCBjYXNlIGZvciBLd0t3SyBzdHJpbmcuICovCisJCQlpZiAoY29kZSA+PSBmcmVlX2VudCkgeworCQkJCWlmIChjb2RlID4gZnJlZV9lbnQpIHsKKwkJCQkJdW5zaWduZWQgY2hhciAqcDsKKworCQkJCQlwb3NiaXRzIC09IG5fYml0czsKKwkJCQkJcCA9ICZpbmJ1Zltwb3NiaXRzID4+IDNdOworCisJCQkJCWJiX2Vycm9yX21zZworCQkJCQkJKCJpbnNpemU6JWQgcG9zYml0czolZCBpbmJ1ZjolMDJYICUwMlggJTAyWCAlMDJYICUwMlggKCVkKSIsCisJCQkJCQkgaW5zaXplLCBwb3NiaXRzLCBwWy0xXSwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwKKwkJCQkJCSAocG9zYml0cyAmIDA3KSk7CisJCQkJCWJiX2Vycm9yX21zZygiY29ycnVwdGVkIGRhdGEiKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkJKi0tc3RhY2twID0gKHVuc2lnbmVkIGNoYXIpIGZpbmNoYXI7CisJCQkJY29kZSA9IG9sZGNvZGU7CisJCQl9CisKKwkJCS8qIEdlbmVyYXRlIG91dHB1dCBjaGFyYWN0ZXJzIGluIHJldmVyc2Ugb3JkZXIgKi8KKwkJCXdoaWxlICgobG9uZykgY29kZSA+PSAobG9uZykgMjU2KSB7CisJCQkJaWYgKHN0YWNrcCA8PSAmaHRhYm9mKDApKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIGRhdGEiKTsKKwkJCQkqLS1zdGFja3AgPSB0YWJfc3VmZml4b2YoY29kZSk7CisJCQkJY29kZSA9IHRhYl9wcmVmaXhvZihjb2RlKTsKKwkJCX0KKworCQkJZmluY2hhciA9IHRhYl9zdWZmaXhvZihjb2RlKTsKKwkJCSotLXN0YWNrcCA9ICh1bnNpZ25lZCBjaGFyKSBmaW5jaGFyOworCisJCQkvKiBBbmQgcHV0IHRoZW0gb3V0IGluIGZvcndhcmQgb3JkZXIgKi8KKwkJCXsKKwkJCQlpbnQgaTsKKworCQkJCWkgPSBkZV9zdGFjayAtIHN0YWNrcDsKKwkJCQlpZiAob3V0cG9zICsgaSA+PSBPQlVGU0laKSB7CisJCQkJCWRvIHsKKwkJCQkJCWlmIChpID4gT0JVRlNJWiAtIG91dHBvcykgeworCQkJCQkJCWkgPSBPQlVGU0laIC0gb3V0cG9zOworCQkJCQkJfQorCisJCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCQltZW1jcHkob3V0YnVmICsgb3V0cG9zLCBzdGFja3AsIGkpOworCQkJCQkJCW91dHBvcyArPSBpOworCQkJCQkJfQorCisJCQkJCQlpZiAob3V0cG9zID49IE9CVUZTSVopIHsKKwkJCQkJCQl4d3JpdGUoZmRfb3V0LCBvdXRidWYsIG91dHBvcyk7CisJCQkJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IG91dHBvczspCisJCQkJCQkJb3V0cG9zID0gMDsKKwkJCQkJCX0KKwkJCQkJCXN0YWNrcCArPSBpOworCQkJCQkJaSA9IGRlX3N0YWNrIC0gc3RhY2twOworCQkJCQl9IHdoaWxlIChpID4gMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVtY3B5KG91dGJ1ZiArIG91dHBvcywgc3RhY2twLCBpKTsKKwkJCQkJb3V0cG9zICs9IGk7CisJCQkJfQorCQkJfQorCisJCQkvKiBHZW5lcmF0ZSB0aGUgbmV3IGVudHJ5LiAqLworCQkJY29kZSA9IGZyZWVfZW50OworCQkJaWYgKGNvZGUgPCBtYXhtYXhjb2RlKSB7CisJCQkJdGFiX3ByZWZpeG9mKGNvZGUpID0gKHVuc2lnbmVkIHNob3J0KSBvbGRjb2RlOworCQkJCXRhYl9zdWZmaXhvZihjb2RlKSA9ICh1bnNpZ25lZCBjaGFyKSBmaW5jaGFyOworCQkJCWZyZWVfZW50ID0gY29kZSArIDE7CisJCQl9CisKKwkJCS8qIFJlbWVtYmVyIHByZXZpb3VzIGNvZGUuICAqLworCQkJb2xkY29kZSA9IGluY29kZTsKKwkJfQorCisJfSB3aGlsZSAocnNpemUgPiAwKTsKKworCWlmIChvdXRwb3MgPiAwKSB7CisJCXh3cml0ZShmZF9vdXQsIG91dGJ1Ziwgb3V0cG9zKTsKKwkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IG91dHBvczspCisJfQorCisJcmV0dmFsID0gSUZfREVTS1RPUCh0b3RhbF93cml0dGVuKSArIDA7CisgZXJyOgorCWZyZWUoaW5idWYpOworCWZyZWUob3V0YnVmKTsKKwlmcmVlKGh0YWIpOworCWZyZWUoY29kZXRhYik7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bmx6bWEuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bmx6bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ3MTQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VubHptYS5jCkBAIC0wLDAgKzEsNDY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTbWFsbCBsem1hIGRlZmxhdGUgaW1wbGVtZW50YXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBCYXNlZCBvbiBMem1hRGVjb2RlLmMgZnJvbSB0aGUgTFpNQSBTREsgNC4yMiAoaHR0cDovL3d3dy43LXppcC5vcmcvKQorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgIElnb3IgUGF2bG92CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFpNQV9GQVNUCisjICBkZWZpbmUgc3BlZWRfaW5saW5lIEFMV0FZU19JTkxJTkUKKyMgIGRlZmluZSBzaXplX2lubGluZQorI2Vsc2UKKyMgIGRlZmluZSBzcGVlZF9pbmxpbmUKKyMgIGRlZmluZSBzaXplX2lubGluZSBBTFdBWVNfSU5MSU5FCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZkOworCXVpbnQ4X3QgKnB0cjsKKworLyogV2FzIGtlZXBpbmcgcmMgb24gc3RhY2sgaW4gdW5sem1hIGFuZCBzZXBhcmF0ZWx5IGFsbG9jYXRpbmcgYnVmZmVyLAorICogYnV0IHdpdGggImJ1ZmZlciAnYXR0YWNoZWQgdG8nIGFsbG9jYXRlZCByYyIgY29kZSBpcyBzbWFsbGVyOiAqLworCS8qIHVpbnQ4X3QgKmJ1ZmZlcjsgKi8KKyNkZWZpbmUgUkNfQlVGRkVSICgodWludDhfdCopKHJjKzEpKQorCisJdWludDhfdCAqYnVmZmVyX2VuZDsKKworLyogSGFkIHByb3Zpc2lvbnMgZm9yIHZhcmlhYmxlIGJ1ZmZlciwgYnV0IHdlIGRvbid0IG5lZWQgaXQgaGVyZSAqLworCS8qIGludCBidWZmZXJfc2l6ZTsgKi8KKyNkZWZpbmUgUkNfQlVGRkVSX1NJWkUgMHgxMDAwMAorCisJdWludDMyX3QgY29kZTsKKwl1aW50MzJfdCByYW5nZTsKKwl1aW50MzJfdCBib3VuZDsKK30gcmNfdDsKKworI2RlZmluZSBSQ19UT1BfQklUUyAyNAorI2RlZmluZSBSQ19NT1ZFX0JJVFMgNQorI2RlZmluZSBSQ19NT0RFTF9UT1RBTF9CSVRTIDExCisKKworLyogQ2FsbGVkIHR3aWNlOiBvbmNlIGF0IHN0YXJ0dXAgKExaTUFfRkFTVCBvbmx5KSBhbmQgb25jZSBpbiByY19ub3JtYWxpemUoKSAqLworc3RhdGljIHNpemVfaW5saW5lIHZvaWQgcmNfcmVhZChyY190ICpyYykKK3sKKwlpbnQgYnVmZmVyX3NpemUgPSBzYWZlX3JlYWQocmMtPmZkLCBSQ19CVUZGRVIsIFJDX0JVRkZFUl9TSVpFKTsKKy8vVE9ETzogcmV0dXJuIC0xIGluc3RlYWQKKy8vVGhpcyB3aWxsIG1ha2UgdW5sem1hIGRlbGV0ZSBicm9rZW4gdW5wYWNrZWQgZmlsZSBvbiB1bnBhY2sgZXJyb3JzCisJaWYgKGJ1ZmZlcl9zaXplIDw9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmV4cGVjdGVkIEVPRiIpOworCXJjLT5wdHIgPSBSQ19CVUZGRVI7CisJcmMtPmJ1ZmZlcl9lbmQgPSBSQ19CVUZGRVIgKyBidWZmZXJfc2l6ZTsKK30KKworLyogQ2FsbGVkIHR3aWNlLCBidXQgb25lIGNhbGxzaXRlIGlzIGluIHNwZWVkX2lubGluZSdkIHJjX2lzX2JpdF8xKCkgKi8KK3N0YXRpYyB2b2lkIHJjX2RvX25vcm1hbGl6ZShyY190ICpyYykKK3sKKwlpZiAocmMtPnB0ciA+PSByYy0+YnVmZmVyX2VuZCkKKwkJcmNfcmVhZChyYyk7CisJcmMtPnJhbmdlIDw8PSA4OworCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IDgpIHwgKnJjLT5wdHIrKzsKK30KKworLyogQ2FsbGVkIG9uY2UgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHJjX3QqIHJjX2luaXQoaW50IGZkKSAvKiwgaW50IGJ1ZmZlcl9zaXplKSAqLworeworCWludCBpOworCXJjX3QgKnJjOworCisJcmMgPSB4emFsbG9jKHNpemVvZigqcmMpICsgUkNfQlVGRkVSX1NJWkUpOworCisJcmMtPmZkID0gZmQ7CisJLyogcmMtPnB0ciA9IHJjLT5idWZmZXJfZW5kOyAqLworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworI2lmIEVOQUJMRV9GRUFUVVJFX0xaTUFfRkFTVAorCQlpZiAocmMtPnB0ciA+PSByYy0+YnVmZmVyX2VuZCkKKwkJCXJjX3JlYWQocmMpOworCQlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSB8ICpyYy0+cHRyKys7CisjZWxzZQorCQlyY19kb19ub3JtYWxpemUocmMpOworI2VuZGlmCisJfQorCXJjLT5yYW5nZSA9IDB4RkZGRkZGRkY7CisJcmV0dXJuIHJjOworfQorCisvKiBDYWxsZWQgb25jZSAgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgcmNfZnJlZShyY190ICpyYykKK3sKKwlmcmVlKHJjKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCByY19ub3JtYWxpemUocmNfdCAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8ICgxIDw8IFJDX1RPUF9CSVRTKSkgeworCQlyY19kb19ub3JtYWxpemUocmMpOworCX0KK30KKworLyogcmNfaXNfYml0XzEgaXMgY2FsbGVkIDkgdGltZXMgKi8KK3N0YXRpYyBzcGVlZF9pbmxpbmUgaW50IHJjX2lzX2JpdF8xKHJjX3QgKnJjLCB1aW50MTZfdCAqcCkKK3sKKwlyY19ub3JtYWxpemUocmMpOworCXJjLT5ib3VuZCA9ICpwICogKHJjLT5yYW5nZSA+PiBSQ19NT0RFTF9UT1RBTF9CSVRTKTsKKwlpZiAocmMtPmNvZGUgPCByYy0+Ym91bmQpIHsKKwkJcmMtPnJhbmdlID0gcmMtPmJvdW5kOworCQkqcCArPSAoKDEgPDwgUkNfTU9ERUxfVE9UQUxfQklUUykgLSAqcCkgPj4gUkNfTU9WRV9CSVRTOworCQlyZXR1cm4gMDsKKwl9CisJcmMtPnJhbmdlIC09IHJjLT5ib3VuZDsKKwlyYy0+Y29kZSAtPSByYy0+Ym91bmQ7CisJKnAgLT0gKnAgPj4gUkNfTU9WRV9CSVRTOworCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgNCB0aW1lcyBpbiB1bmx6bWEgbG9vcCAqLworc3RhdGljIHNwZWVkX2lubGluZSBpbnQgcmNfZ2V0X2JpdChyY190ICpyYywgdWludDE2X3QgKnAsIGludCAqc3ltYm9sKQoreworCWludCByZXQgPSByY19pc19iaXRfMShyYywgcCk7CisJKnN5bWJvbCA9ICpzeW1ib2wgKiAyICsgcmV0OworCXJldHVybiByZXQ7Cit9CisKKy8qIENhbGxlZCBvbmNlICovCitzdGF0aWMgQUxXQVlTX0lOTElORSBpbnQgcmNfZGlyZWN0X2JpdChyY190ICpyYykKK3sKKwlyY19ub3JtYWxpemUocmMpOworCXJjLT5yYW5nZSA+Pj0gMTsKKwlpZiAocmMtPmNvZGUgPj0gcmMtPnJhbmdlKSB7CisJCXJjLT5jb2RlIC09IHJjLT5yYW5nZTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgdHdpY2UgKi8KK3N0YXRpYyBzcGVlZF9pbmxpbmUgdm9pZAorcmNfYml0X3RyZWVfZGVjb2RlKHJjX3QgKnJjLCB1aW50MTZfdCAqcCwgaW50IG51bV9sZXZlbHMsIGludCAqc3ltYm9sKQoreworCWludCBpID0gbnVtX2xldmVsczsKKworCSpzeW1ib2wgPSAxOworCXdoaWxlIChpLS0pCisJCXJjX2dldF9iaXQocmMsIHAgKyAqc3ltYm9sLCBzeW1ib2wpOworCSpzeW1ib2wgLT0gMSA8PCBudW1fbGV2ZWxzOworfQorCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IHBvczsKKwl1aW50MzJfdCBkaWN0X3NpemU7CisJdWludDY0X3QgZHN0X3NpemU7Cit9IFBBQ0tFRCBsem1hX2hlYWRlcl90OworCisKKy8qICNkZWZpbmVzIHdpbGwgZm9yY2UgY29tcGlsZXIgdG8gY29tcHV0ZS9vcHRpbWl6ZSBlYWNoIG9uZSB3aXRoIGVhY2ggdXNhZ2UuCisgKiBIYXZlIGhlYXJ0IGFuZCB1c2UgZW51bSBpbnN0ZWFkLiAqLworZW51bSB7CisJTFpNQV9CQVNFX1NJWkUgPSAxODQ2LAorCUxaTUFfTElUX1NJWkUgID0gNzY4LAorCisJTFpNQV9OVU1fUE9TX0JJVFNfTUFYID0gNCwKKworCUxaTUFfTEVOX05VTV9MT1dfQklUUyAgPSAzLAorCUxaTUFfTEVOX05VTV9NSURfQklUUyAgPSAzLAorCUxaTUFfTEVOX05VTV9ISUdIX0JJVFMgPSA4LAorCisJTFpNQV9MRU5fQ0hPSUNFICAgICA9IDAsCisJTFpNQV9MRU5fQ0hPSUNFXzIgICA9IChMWk1BX0xFTl9DSE9JQ0UgKyAxKSwKKwlMWk1BX0xFTl9MT1cgICAgICAgID0gKExaTUFfTEVOX0NIT0lDRV8yICsgMSksCisJTFpNQV9MRU5fTUlEICAgICAgICA9IChMWk1BX0xFTl9MT1cgXAorCSAgICAgICAgICAgICAgICAgICAgICArICgxIDw8IChMWk1BX05VTV9QT1NfQklUU19NQVggKyBMWk1BX0xFTl9OVU1fTE9XX0JJVFMpKSksCisJTFpNQV9MRU5fSElHSCAgICAgICA9IChMWk1BX0xFTl9NSUQgXAorCSAgICAgICAgICAgICAgICAgICAgICArICgxIDw8IChMWk1BX05VTV9QT1NfQklUU19NQVggKyBMWk1BX0xFTl9OVU1fTUlEX0JJVFMpKSksCisJTFpNQV9OVU1fTEVOX1BST0JTICA9IChMWk1BX0xFTl9ISUdIICsgKDEgPDwgTFpNQV9MRU5fTlVNX0hJR0hfQklUUykpLAorCisJTFpNQV9OVU1fU1RBVEVTICAgICA9IDEyLAorCUxaTUFfTlVNX0xJVF9TVEFURVMgPSA3LAorCisJTFpNQV9TVEFSVF9QT1NfTU9ERUxfSU5ERVggPSA0LAorCUxaTUFfRU5EX1BPU19NT0RFTF9JTkRFWCAgID0gMTQsCisJTFpNQV9OVU1fRlVMTF9ESVNUQU5DRVMgICAgPSAoMSA8PCAoTFpNQV9FTkRfUE9TX01PREVMX0lOREVYID4+IDEpKSwKKworCUxaTUFfTlVNX1BPU19TTE9UX0JJVFMgPSA2LAorCUxaTUFfTlVNX0xFTl9UT19QT1NfU1RBVEVTID0gNCwKKworCUxaTUFfTlVNX0FMSUdOX0JJVFMgPSA0LAorCisJTFpNQV9NQVRDSF9NSU5fTEVOICA9IDIsCisKKwlMWk1BX0lTX01BVENIICAgICAgID0gMCwKKwlMWk1BX0lTX1JFUCAgICAgICAgID0gKExaTUFfSVNfTUFUQ0ggKyAoTFpNQV9OVU1fU1RBVEVTIDw8IExaTUFfTlVNX1BPU19CSVRTX01BWCkpLAorCUxaTUFfSVNfUkVQX0cwICAgICAgPSAoTFpNQV9JU19SRVAgKyBMWk1BX05VTV9TVEFURVMpLAorCUxaTUFfSVNfUkVQX0cxICAgICAgPSAoTFpNQV9JU19SRVBfRzAgKyBMWk1BX05VTV9TVEFURVMpLAorCUxaTUFfSVNfUkVQX0cyICAgICAgPSAoTFpNQV9JU19SRVBfRzEgKyBMWk1BX05VTV9TVEFURVMpLAorCUxaTUFfSVNfUkVQXzBfTE9ORyAgPSAoTFpNQV9JU19SRVBfRzIgKyBMWk1BX05VTV9TVEFURVMpLAorCUxaTUFfUE9TX1NMT1QgICAgICAgPSAoTFpNQV9JU19SRVBfMF9MT05HIFwKKwkgICAgICAgICAgICAgICAgICAgICAgKyAoTFpNQV9OVU1fU1RBVEVTIDw8IExaTUFfTlVNX1BPU19CSVRTX01BWCkpLAorCUxaTUFfU1BFQ19QT1MgICAgICAgPSAoTFpNQV9QT1NfU0xPVCBcCisJICAgICAgICAgICAgICAgICAgICAgICsgKExaTUFfTlVNX0xFTl9UT19QT1NfU1RBVEVTIDw8IExaTUFfTlVNX1BPU19TTE9UX0JJVFMpKSwKKwlMWk1BX0FMSUdOICAgICAgICAgID0gKExaTUFfU1BFQ19QT1MgXAorCSAgICAgICAgICAgICAgICAgICAgICArIExaTUFfTlVNX0ZVTExfRElTVEFOQ0VTIC0gTFpNQV9FTkRfUE9TX01PREVMX0lOREVYKSwKKwlMWk1BX0xFTl9DT0RFUiAgICAgID0gKExaTUFfQUxJR04gKyAoMSA8PCBMWk1BX05VTV9BTElHTl9CSVRTKSksCisJTFpNQV9SRVBfTEVOX0NPREVSICA9IChMWk1BX0xFTl9DT0RFUiArIExaTUFfTlVNX0xFTl9QUk9CUyksCisJTFpNQV9MSVRFUkFMICAgICAgICA9IChMWk1BX1JFUF9MRU5fQ09ERVIgKyBMWk1BX05VTV9MRU5fUFJPQlMpLAorfTsKKworCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQwordW5wYWNrX2x6bWFfc3RyZWFtKGludCBzcmNfZmQsIGludCBkc3RfZmQpCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcgdG90YWxfd3JpdHRlbiA9IDA7KQorCWx6bWFfaGVhZGVyX3QgaGVhZGVyOworCWludCBsYywgcGIsIGxwOworCXVpbnQzMl90IHBvc19zdGF0ZV9tYXNrOworCXVpbnQzMl90IGxpdGVyYWxfcG9zX21hc2s7CisJdWludDE2X3QgKnA7CisJaW50IG51bV9iaXRzOworCWludCBudW1fcHJvYnM7CisJcmNfdCAqcmM7CisJaW50IGk7CisJdWludDhfdCAqYnVmZmVyOworCXVpbnQ4X3QgcHJldmlvdXNfYnl0ZSA9IDA7CisJc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwLCBnbG9iYWxfcG9zID0gMDsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc3RhdGUgPSAwOworCXVpbnQzMl90IHJlcDAgPSAxLCByZXAxID0gMSwgcmVwMiA9IDEsIHJlcDMgPSAxOworCisJaWYgKGZ1bGxfcmVhZChzcmNfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKQorCSB8fCBoZWFkZXIucG9zID49ICg5ICogNSAqIDUpCisJKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGx6bWEgaGVhZGVyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpID0gaGVhZGVyLnBvcyAvIDk7CisJbGMgPSBoZWFkZXIucG9zICUgOTsKKwlwYiA9IGkgLyA1OworCWxwID0gaSAlIDU7CisJcG9zX3N0YXRlX21hc2sgPSAoMSA8PCBwYikgLSAxOworCWxpdGVyYWxfcG9zX21hc2sgPSAoMSA8PCBscCkgLSAxOworCisJaGVhZGVyLmRpY3Rfc2l6ZSA9IFNXQVBfTEUzMihoZWFkZXIuZGljdF9zaXplKTsKKwloZWFkZXIuZHN0X3NpemUgPSBTV0FQX0xFNjQoaGVhZGVyLmRzdF9zaXplKTsKKworCWlmIChoZWFkZXIuZGljdF9zaXplID09IDApCisJCWhlYWRlci5kaWN0X3NpemUrKzsKKworCWJ1ZmZlciA9IHhtYWxsb2MoTUlOKGhlYWRlci5kc3Rfc2l6ZSwgaGVhZGVyLmRpY3Rfc2l6ZSkpOworCisJbnVtX3Byb2JzID0gTFpNQV9CQVNFX1NJWkUgKyAoTFpNQV9MSVRfU0laRSA8PCAobGMgKyBscCkpOworCXAgPSB4bWFsbG9jKG51bV9wcm9icyAqIHNpemVvZigqcCkpOworCW51bV9wcm9icyArPSBMWk1BX0xJVEVSQUwgLSBMWk1BX0JBU0VfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Byb2JzOyBpKyspCisJCXBbaV0gPSAoMSA8PCBSQ19NT0RFTF9UT1RBTF9CSVRTKSA+PiAxOworCisJcmMgPSByY19pbml0KHNyY19mZCk7IC8qLCBSQ19CVUZGRVJfU0laRSk7ICovCisKKwl3aGlsZSAoZ2xvYmFsX3BvcyArIGJ1ZmZlcl9wb3MgPCBoZWFkZXIuZHN0X3NpemUpIHsKKwkJaW50IHBvc19zdGF0ZSA9IChidWZmZXJfcG9zICsgZ2xvYmFsX3BvcykgJiBwb3Nfc3RhdGVfbWFzazsKKwkJdWludDE2X3QgKnByb2IgPSBwICsgTFpNQV9JU19NQVRDSCArIChzdGF0ZSA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpICsgcG9zX3N0YXRlOworCisJCWlmICghcmNfaXNfYml0XzEocmMsIHByb2IpKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBuZXh0X3N0YXRlW0xaTUFfTlVNX1NUQVRFU10gPQorCQkJCXsgMCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNCwgNSB9OworCQkJaW50IG1pID0gMTsKKworCQkJcHJvYiA9IChwICsgTFpNQV9MSVRFUkFMCisJCQkgICAgICAgICsgKExaTUFfTElUX1NJWkUgKiAoKCgoYnVmZmVyX3BvcyArIGdsb2JhbF9wb3MpICYgbGl0ZXJhbF9wb3NfbWFzaykgPDwgbGMpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocHJldmlvdXNfYnl0ZSA+PiAoOCAtIGxjKSkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKwkJCSAgICAgICAgICApCisJCQkpOworCisJCQlpZiAoc3RhdGUgPj0gTFpNQV9OVU1fTElUX1NUQVRFUykgeworCQkJCWludCBtYXRjaF9ieXRlOworCQkJCXVpbnQzMl90IHBvcyA9IGJ1ZmZlcl9wb3MgLSByZXAwOworCisJCQkJd2hpbGUgKHBvcyA+PSBoZWFkZXIuZGljdF9zaXplKQorCQkJCQlwb3MgKz0gaGVhZGVyLmRpY3Rfc2l6ZTsKKwkJCQltYXRjaF9ieXRlID0gYnVmZmVyW3Bvc107CisJCQkJZG8geworCQkJCQlpbnQgYml0OworCisJCQkJCW1hdGNoX2J5dGUgPDw9IDE7CisJCQkJCWJpdCA9IG1hdGNoX2J5dGUgJiAweDEwMDsKKwkJCQkJYml0IF49IChyY19nZXRfYml0KHJjLCBwcm9iICsgMHgxMDAgKyBiaXQgKyBtaSwgJm1pKSA8PCA4KTsgLyogMHgxMDAgb3IgMCAqLworCQkJCQlpZiAoYml0KQorCQkJCQkJYnJlYWs7CisJCQkJfSB3aGlsZSAobWkgPCAweDEwMCk7CisJCQl9CisJCQl3aGlsZSAobWkgPCAweDEwMCkgeworCQkJCXJjX2dldF9iaXQocmMsIHByb2IgKyBtaSwgJm1pKTsKKwkJCX0KKworCQkJc3RhdGUgPSBuZXh0X3N0YXRlW3N0YXRlXTsKKworCQkJcHJldmlvdXNfYnl0ZSA9ICh1aW50OF90KSBtaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MWk1BX0ZBU1QKKyBvbmVfYnl0ZTE6CisJCQlidWZmZXJbYnVmZmVyX3BvcysrXSA9IHByZXZpb3VzX2J5dGU7CisJCQlpZiAoYnVmZmVyX3BvcyA9PSBoZWFkZXIuZGljdF9zaXplKSB7CisJCQkJYnVmZmVyX3BvcyA9IDA7CisJCQkJZ2xvYmFsX3BvcyArPSBoZWFkZXIuZGljdF9zaXplOworCQkJCWlmIChmdWxsX3dyaXRlKGRzdF9mZCwgYnVmZmVyLCBoZWFkZXIuZGljdF9zaXplKSAhPSAoc3NpemVfdCloZWFkZXIuZGljdF9zaXplKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlJRl9ERVNLVE9QKHRvdGFsX3dyaXR0ZW4gKz0gaGVhZGVyLmRpY3Rfc2l6ZTspCisJCQl9CisjZWxzZQorCQkJbGVuID0gMTsKKwkJCWdvdG8gb25lX2J5dGUyOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpbnQgb2Zmc2V0OworCQkJdWludDE2X3QgKnByb2IyOworI2RlZmluZSBwcm9iX2xlbiBwcm9iMgorCisJCQlwcm9iMiA9IHAgKyBMWk1BX0lTX1JFUCArIHN0YXRlOworCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYjIpKSB7CisJCQkJcmVwMyA9IHJlcDI7CisJCQkJcmVwMiA9IHJlcDE7CisJCQkJcmVwMSA9IHJlcDA7CisJCQkJc3RhdGUgPSBzdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPyAwIDogMzsKKwkJCQlwcm9iMiA9IHAgKyBMWk1BX0xFTl9DT0RFUjsKKwkJCX0gZWxzZSB7CisJCQkJcHJvYjIgKz0gTFpNQV9JU19SRVBfRzAgLSBMWk1BX0lTX1JFUDsKKwkJCQlpZiAoIXJjX2lzX2JpdF8xKHJjLCBwcm9iMikpIHsKKwkJCQkJcHJvYjIgPSAocCArIExaTUFfSVNfUkVQXzBfTE9ORworCQkJCQkgICAgICAgICsgKHN0YXRlIDw8IExaTUFfTlVNX1BPU19CSVRTX01BWCkKKwkJCQkJICAgICAgICArIHBvc19zdGF0ZQorCQkJCQkpOworCQkJCQlpZiAoIXJjX2lzX2JpdF8xKHJjLCBwcm9iMikpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MWk1BX0ZBU1QKKwkJCQkJCXVpbnQzMl90IHBvcyA9IGJ1ZmZlcl9wb3MgLSByZXAwOworCQkJCQkJc3RhdGUgPSBzdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPyA5IDogMTE7CisJCQkJCQl3aGlsZSAocG9zID49IGhlYWRlci5kaWN0X3NpemUpCisJCQkJCQkJcG9zICs9IGhlYWRlci5kaWN0X3NpemU7CisJCQkJCQlwcmV2aW91c19ieXRlID0gYnVmZmVyW3Bvc107CisJCQkJCQlnb3RvIG9uZV9ieXRlMTsKKyNlbHNlCisJCQkJCQlzdGF0ZSA9IHN0YXRlIDwgTFpNQV9OVU1fTElUX1NUQVRFUyA/IDkgOiAxMTsKKwkJCQkJCWxlbiA9IDE7CisJCQkJCQlnb3RvIHN0cmluZzsKKyNlbmRpZgorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdWludDMyX3QgZGlzdGFuY2U7CisKKwkJCQkJcHJvYjIgKz0gTFpNQV9JU19SRVBfRzEgLSBMWk1BX0lTX1JFUF9HMDsKKwkJCQkJZGlzdGFuY2UgPSByZXAxOworCQkJCQlpZiAocmNfaXNfYml0XzEocmMsIHByb2IyKSkgeworCQkJCQkJcHJvYjIgKz0gTFpNQV9JU19SRVBfRzIgLSBMWk1BX0lTX1JFUF9HMTsKKwkJCQkJCWRpc3RhbmNlID0gcmVwMjsKKwkJCQkJCWlmIChyY19pc19iaXRfMShyYywgcHJvYjIpKSB7CisJCQkJCQkJZGlzdGFuY2UgPSByZXAzOworCQkJCQkJCXJlcDMgPSByZXAyOworCQkJCQkJfQorCQkJCQkJcmVwMiA9IHJlcDE7CisJCQkJCX0KKwkJCQkJcmVwMSA9IHJlcDA7CisJCQkJCXJlcDAgPSBkaXN0YW5jZTsKKwkJCQl9CisJCQkJc3RhdGUgPSBzdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPyA4IDogMTE7CisJCQkJcHJvYjIgPSBwICsgTFpNQV9SRVBfTEVOX0NPREVSOworCQkJfQorCisJCQlwcm9iX2xlbiA9IHByb2IyICsgTFpNQV9MRU5fQ0hPSUNFOworCQkJbnVtX2JpdHMgPSBMWk1BX0xFTl9OVU1fTE9XX0JJVFM7CisJCQlpZiAoIXJjX2lzX2JpdF8xKHJjLCBwcm9iX2xlbikpIHsKKwkJCQlwcm9iX2xlbiArPSBMWk1BX0xFTl9MT1cgLSBMWk1BX0xFTl9DSE9JQ0UKKwkJCQkgICAgICAgICAgICArIChwb3Nfc3RhdGUgPDwgTFpNQV9MRU5fTlVNX0xPV19CSVRTKTsKKwkJCQlvZmZzZXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlwcm9iX2xlbiArPSBMWk1BX0xFTl9DSE9JQ0VfMiAtIExaTUFfTEVOX0NIT0lDRTsKKwkJCQlpZiAoIXJjX2lzX2JpdF8xKHJjLCBwcm9iX2xlbikpIHsKKwkJCQkJcHJvYl9sZW4gKz0gTFpNQV9MRU5fTUlEIC0gTFpNQV9MRU5fQ0hPSUNFXzIKKwkJCQkJICAgICAgICAgICAgKyAocG9zX3N0YXRlIDw8IExaTUFfTEVOX05VTV9NSURfQklUUyk7CisJCQkJCW9mZnNldCA9IDEgPDwgTFpNQV9MRU5fTlVNX0xPV19CSVRTOworCQkJCQludW1fYml0cyArPSBMWk1BX0xFTl9OVU1fTUlEX0JJVFMgLSBMWk1BX0xFTl9OVU1fTE9XX0JJVFM7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJvYl9sZW4gKz0gTFpNQV9MRU5fSElHSCAtIExaTUFfTEVOX0NIT0lDRV8yOworCQkJCQlvZmZzZXQgPSAoKDEgPDwgTFpNQV9MRU5fTlVNX0xPV19CSVRTKQorCQkJCQkgICAgICAgICAgKyAoMSA8PCBMWk1BX0xFTl9OVU1fTUlEX0JJVFMpKTsKKwkJCQkJbnVtX2JpdHMgKz0gTFpNQV9MRU5fTlVNX0hJR0hfQklUUyAtIExaTUFfTEVOX05VTV9MT1dfQklUUzsKKwkJCQl9CisJCQl9CisJCQlyY19iaXRfdHJlZV9kZWNvZGUocmMsIHByb2JfbGVuLCBudW1fYml0cywgJmxlbik7CisJCQlsZW4gKz0gb2Zmc2V0OworCisJCQlpZiAoc3RhdGUgPCA0KSB7CisJCQkJaW50IHBvc19zbG90OworCQkJCXVpbnQxNl90ICpwcm9iMzsKKworCQkJCXN0YXRlICs9IExaTUFfTlVNX0xJVF9TVEFURVM7CisJCQkJcHJvYjMgPSBwICsgTFpNQV9QT1NfU0xPVCArCisJCQkJICAgICAgICgobGVuIDwgTFpNQV9OVU1fTEVOX1RPX1BPU19TVEFURVMgPyBsZW4gOgorCQkJCSAgICAgICAgIExaTUFfTlVNX0xFTl9UT19QT1NfU1RBVEVTIC0gMSkKKwkJCQkgICAgICAgICA8PCBMWk1BX05VTV9QT1NfU0xPVF9CSVRTKTsKKwkJCQlyY19iaXRfdHJlZV9kZWNvZGUocmMsIHByb2IzLAorCQkJCQlMWk1BX05VTV9QT1NfU0xPVF9CSVRTLCAmcG9zX3Nsb3QpOworCQkJCXJlcDAgPSBwb3Nfc2xvdDsKKwkJCQlpZiAocG9zX3Nsb3QgPj0gTFpNQV9TVEFSVF9QT1NfTU9ERUxfSU5ERVgpIHsKKwkJCQkJaW50IGkyLCBtaTIsIG51bV9iaXRzMiA9IChwb3Nfc2xvdCA+PiAxKSAtIDE7CisJCQkJCXJlcDAgPSAyIHwgKHBvc19zbG90ICYgMSk7CisJCQkJCWlmIChwb3Nfc2xvdCA8IExaTUFfRU5EX1BPU19NT0RFTF9JTkRFWCkgeworCQkJCQkJcmVwMCA8PD0gbnVtX2JpdHMyOworCQkJCQkJcHJvYjMgPSBwICsgTFpNQV9TUEVDX1BPUyArIHJlcDAgLSBwb3Nfc2xvdCAtIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmb3IgKDsgbnVtX2JpdHMyICE9IExaTUFfTlVNX0FMSUdOX0JJVFM7IG51bV9iaXRzMi0tKQorCQkJCQkJCXJlcDAgPSAocmVwMCA8PCAxKSB8IHJjX2RpcmVjdF9iaXQocmMpOworCQkJCQkJcmVwMCA8PD0gTFpNQV9OVU1fQUxJR05fQklUUzsKKwkJCQkJCXByb2IzID0gcCArIExaTUFfQUxJR047CisJCQkJCX0KKwkJCQkJaTIgPSAxOworCQkJCQltaTIgPSAxOworCQkJCQl3aGlsZSAobnVtX2JpdHMyLS0pIHsKKwkJCQkJCWlmIChyY19nZXRfYml0KHJjLCBwcm9iMyArIG1pMiwgJm1pMikpCisJCQkJCQkJcmVwMCB8PSBpMjsKKwkJCQkJCWkyIDw8PSAxOworCQkJCQl9CisJCQkJfQorCQkJCWlmICgrK3JlcDAgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxlbiArPSBMWk1BX01BVENIX01JTl9MRU47CisgSUZfTk9UX0ZFQVRVUkVfTFpNQV9GQVNUKHN0cmluZzopCisJCQlkbyB7CisJCQkJdWludDMyX3QgcG9zID0gYnVmZmVyX3BvcyAtIHJlcDA7CisJCQkJd2hpbGUgKHBvcyA+PSBoZWFkZXIuZGljdF9zaXplKQorCQkJCQlwb3MgKz0gaGVhZGVyLmRpY3Rfc2l6ZTsKKwkJCQlwcmV2aW91c19ieXRlID0gYnVmZmVyW3Bvc107CisgSUZfTk9UX0ZFQVRVUkVfTFpNQV9GQVNUKG9uZV9ieXRlMjopCisJCQkJYnVmZmVyW2J1ZmZlcl9wb3MrK10gPSBwcmV2aW91c19ieXRlOworCQkJCWlmIChidWZmZXJfcG9zID09IGhlYWRlci5kaWN0X3NpemUpIHsKKwkJCQkJYnVmZmVyX3BvcyA9IDA7CisJCQkJCWdsb2JhbF9wb3MgKz0gaGVhZGVyLmRpY3Rfc2l6ZTsKKwkJCQkJaWYgKGZ1bGxfd3JpdGUoZHN0X2ZkLCBidWZmZXIsIGhlYWRlci5kaWN0X3NpemUpICE9IChzc2l6ZV90KWhlYWRlci5kaWN0X3NpemUpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IGhlYWRlci5kaWN0X3NpemU7KQorCQkJCX0KKwkJCQlsZW4tLTsKKwkJCX0gd2hpbGUgKGxlbiAhPSAwICYmIGJ1ZmZlcl9wb3MgPCBoZWFkZXIuZHN0X3NpemUpOworCQl9CisJfQorCisJeworCQlJRl9OT1RfREVTS1RPUChpbnQgdG90YWxfd3JpdHRlbiA9IDA7IC8qIHN1Y2Nlc3MgKi8pCisJCUlGX0RFU0tUT1AodG90YWxfd3JpdHRlbiArPSBidWZmZXJfcG9zOykKKwkJaWYgKGZ1bGxfd3JpdGUoZHN0X2ZkLCBidWZmZXIsIGJ1ZmZlcl9wb3MpICE9IChzc2l6ZV90KWJ1ZmZlcl9wb3MpIHsKKyBiYWQ6CisJCQl0b3RhbF93cml0dGVuID0gLTE7IC8qIGZhaWx1cmUgKi8KKwkJfQorCQlyY19mcmVlKHJjKTsKKwkJZnJlZShwKTsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gdG90YWxfd3JpdHRlbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW54ei5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VueHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBkZmIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VueHouYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogVGhpcyBmaWxlIHVzZXMgWFogRW1iZWRkZWQgbGlicmFyeSBjb2RlIHdoaWNoIGlzIHdyaXR0ZW4KKyAqIGJ5IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogYW5kIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBTZWUgUkVBRE1FIGZpbGUgaW4gdW54ei8gZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpczoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisjZGVmaW5lIFhaX0ZVTkMgRkFTVF9GVU5DCisjZGVmaW5lIFhaX0VYVEVSTiBzdGF0aWMKKworI2RlZmluZSBYWl9ERUNfRFlOQUxMT0MKKworLyogU2tpcCBjaGVjayAocmF0aGVyIHRoYW4gZmFpbCkgb2YgdW5zdXBwb3J0ZWQgaGFzaCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgWFpfREVDX0FOWV9DSEVDSyAgMQorCisvKiBXZSB1c2Ugb3VyIG93biBjcmMzMiBmdW5jdGlvbiAqLworI2RlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAwCitzdGF0aWMgdWludDMyX3QgeHpfY3JjMzIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgY3JjKQoreworCXJldHVybiB+Y3JjMzJfYmxvY2tfZW5kaWFuMCh+Y3JjLCBidWYsIHNpemUsIGdsb2JhbF9jcmMzMl90YWJsZSk7Cit9CisKKy8qIFdlIHVzZSBhcmNoLW9wdGltaXplZCB1bmFsaWduZWQgYWNjZXNzb3JzICovCisjZGVmaW5lIGdldF91bmFsaWduZWRfbGUzMihidWYpICh7IHVpbnQzMl90IHY7IG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCBidWYpOyBTV0FQX0xFMzIodik7IH0pCisjZGVmaW5lIGdldF91bmFsaWduZWRfYmUzMihidWYpICh7IHVpbnQzMl90IHY7IG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCBidWYpOyBTV0FQX0JFMzIodik7IH0pCisjZGVmaW5lIHB1dF91bmFsaWduZWRfbGUzMih2YWwsIGJ1ZikgbW92ZV90b191bmFsaWduZWQxNihidWYsIFNXQVBfTEUzMih2YWwpKQorI2RlZmluZSBwdXRfdW5hbGlnbmVkX2JlMzIodmFsLCBidWYpIG1vdmVfdG9fdW5hbGlnbmVkMTYoYnVmLCBTV0FQX0JFMzIodmFsKSkKKworI2luY2x1ZGUgInVueHoveHpfZGVjX2Jjai5jIgorI2luY2x1ZGUgInVueHoveHpfZGVjX2x6bWEyLmMiCisjaW5jbHVkZSAidW54ei94el9kZWNfc3RyZWFtLmMiCisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfeHpfc3RyZWFtKGludCBzcmNfZmQsIGludCBkc3RfZmQpCit7CisJc3RydWN0IHh6X2J1ZiBpb2J1ZjsKKwlzdHJ1Y3QgeHpfZGVjICpzdGF0ZTsKKwl1bnNpZ25lZCBjaGFyICptZW1idWY7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB0b3RhbCA9IDA7CisKKwlpZiAoIWdsb2JhbF9jcmMzMl90YWJsZSkKKwkJZ2xvYmFsX2NyYzMyX3RhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIC8qZW5kaWFuOiovIDApOworCisJbWVtc2V0KCZpb2J1ZiwgMCwgc2l6ZW9mKGlvYnVmKSk7CisJLyogUHJlbG9hZCBYWiBmaWxlIHNpZ25hdHVyZSAqLworCW1lbWJ1ZiA9ICh2b2lkKikgc3RyY3B5KHhtYWxsb2MoMiAqIEJVRlNJWiksIEhFQURFUl9NQUdJQyk7CisJaW9idWYuaW4gPSBtZW1idWY7CisJaW9idWYuaW5fc2l6ZSA9IEhFQURFUl9NQUdJQ19TSVpFOworCWlvYnVmLm91dCA9IG1lbWJ1ZiArIEJVRlNJWjsKKwlpb2J1Zi5vdXRfc2l6ZSA9IEJVRlNJWjsKKworCS8qIExpbWl0IG1lbW9yeSB1c2FnZSB0byBhYm91dCA2NCBNaUIuICovCisJc3RhdGUgPSB4el9kZWNfaW5pdChYWl9EWU5BTExPQywgNjQqMTAyNCoxMDI0KTsKKworCXdoaWxlICgxKSB7CisJCWVudW0geHpfcmV0IHI7CisKKwkJaWYgKGlvYnVmLmluX3BvcyA9PSBpb2J1Zi5pbl9zaXplKSB7CisJCQlpbnQgcmQgPSBzYWZlX3JlYWQoc3JjX2ZkLCBtZW1idWYsIEJVRlNJWik7CisJCQlpZiAocmQgPCAwKSB7CisJCQkJYmJfZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCQl0b3RhbCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQkJaW9idWYuaW5fc2l6ZSA9IHJkOworCQkJaW9idWYuaW5fcG9zID0gMDsKKwkJfQorLy8JCWJiX2Vycm9yX21zZygiPmluIHBvczolZCBzaXplOiVkIG91dCBwb3M6JWQgc2l6ZTolZCIsCisvLwkJCQlpb2J1Zi5pbl9wb3MsIGlvYnVmLmluX3NpemUsIGlvYnVmLm91dF9wb3MsIGlvYnVmLm91dF9zaXplKTsKKwkJciA9IHh6X2RlY19ydW4oc3RhdGUsICZpb2J1Zik7CisvLwkJYmJfZXJyb3JfbXNnKCI8aW4gcG9zOiVkIHNpemU6JWQgb3V0IHBvczolZCBzaXplOiVkIHI6JWQiLAorLy8JCQkJaW9idWYuaW5fcG9zLCBpb2J1Zi5pbl9zaXplLCBpb2J1Zi5vdXRfcG9zLCBpb2J1Zi5vdXRfc2l6ZSwgcik7CisJCWlmIChpb2J1Zi5vdXRfcG9zKSB7CisJCQl4d3JpdGUoZHN0X2ZkLCBpb2J1Zi5vdXQsIGlvYnVmLm91dF9wb3MpOworCQkJSUZfREVTS1RPUCh0b3RhbCArPSBpb2J1Zi5vdXRfcG9zOykKKwkJCWlvYnVmLm91dF9wb3MgPSAwOworCQl9CisJCWlmIChyID09IFhaX1NUUkVBTV9FTkQpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyICE9IFhaX09LICYmIHIgIT0gWFpfVU5TVVBQT1JURURfQ0hFQ0spIHsKKwkJCWJiX2Vycm9yX21zZygiY29ycnVwdGVkIGRhdGEiKTsKKwkJCXRvdGFsID0gLTE7CisJCQlicmVhazsKKwkJfQorCX0KKwl4el9kZWNfZW5kKHN0YXRlKTsKKwlmcmVlKG1lbWJ1Zik7CisKKwlyZXR1cm4gdG90YWw7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW56aXAuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bnppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW56aXAuYwpAQCAtMCwwICsxLDEyNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGd1bnppcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIEJhc2VkIG9uIEdOVSBnemlwIHYxLjIuNCBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5LgorICoKKyAqIE9yaWdpbmFsbHkgYWRqdXN0ZWQgZm9yIGJ1c3lib3ggYnkgU3ZlbiBSdWRvbHBoIDxzcjFAaW5mLnR1LWRyZXNkZW4uZGU+CisgKiBiYXNlZCBvbiBnemlwIHNvdXJjZXMKKyAqCisgKiBBZGp1c3RlZCBmdXJ0aGVyIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gc3VwcG9ydAorICogZmlsZXMgYXMgd2VsbCBhcyBzdGRpbi9zdGRvdXQsIGFuZCB0byBnZW5lcmFsbHkgYmVoYXZlIGl0c2VsZiB3cnQKKyAqIGNvbW1hbmQgbGluZSBoYW5kbGluZy4KKyAqCisgKiBHZW5lcmFsIGNsZWFudXAgdG8gYmV0dGVyIGFkaGVyZSB0byB0aGUgc3R5bGUgZ3VpZGUgYW5kIG1ha2UgdXNlIG9mIHN0YW5kYXJkCisgKiBidXN5Ym94IGZ1bmN0aW9ucyBieSBHbGVubiBNY0dyYXRoCisgKgorICogcmVhZF9neiBpbnRlcmZhY2UgKyBhc3NvY2lhdGVkIGhhY2tpbmcgYnkgTGF1cmVuY2UgQW5kZXJzb24KKyAqCisgKiBGaXhlZCBodWZ0X2J1aWxkKCkgc28gZGVjb2RpbmcgZW5kLW9mLWJsb2NrIGNvZGUgZG9lcyBub3QgZ3JhYiBtb3JlIGJpdHMKKyAqIHRoYW4gbmVjZXNzYXJ5ICh0aGlzIGlzIHJlcXVpcmVkIGJ5IHVuemlwIGFwcGxldCksIGFkZGVkIGluZmxhdGVfY2xlYW51cCgpCisgKiB0byBmcmVlIGxlYWtlZCBieXRlYnVmZmVyIG1lbW9yeSAodXNlZCBpbiB1bnppcC5jKSwgYW5kIHNvbWUgbWlub3Igc3R5bGUKKyAqIGd1aWRlIGNsZWFudXBzIGJ5IEVkIENsYXJrCisgKgorICogZ3ppcCAoR05VIHppcCkgLS0gY29tcHJlc3MgZmlsZXMgd2l0aCB6aXAgYWxnb3JpdGhtIGFuZCAnY29tcHJlc3MnIGludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhlIHVuemlwIGNvZGUgd2FzIHdyaXR0ZW4gYW5kIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbiBieSBNYXJrIEFkbGVyLgorICogUG9ydGlvbnMgb2YgdGhlIGx6dyBjb2RlIGFyZSBkZXJpdmVkIGZyb20gdGhlIHB1YmxpYyBkb21haW4gJ2NvbXByZXNzJworICogd3JpdHRlbiBieSBTcGVuY2VyIFRob21hcywgSm9lIE9yb3N0LCBKYW1lcyBXb29kcywgSmltIE1jS2llLCBTdGV2ZSBEYXZpZXMsCisgKiBLZW4gVHVya293c2tpLCBEYXZlIE1hY2sgYW5kIFBldGVyIEphbm5lc2VuLgorICoKKyAqIFNlZSB0aGUgZmlsZSBhbGdvcml0aG0uZG9jIGZvciB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgZmlsZSBmb3JtYXRzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCit0eXBlZGVmIHN0cnVjdCBodWZ0X3QgeworCXVuc2lnbmVkIGNoYXIgZTsJLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCisJdW5zaWduZWQgY2hhciBiOwkvKiBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3Igc3ViY29kZSAqLworCXVuaW9uIHsKKwkJdW5zaWduZWQgc2hvcnQgbjsJLyogbGl0ZXJhbCwgbGVuZ3RoIGJhc2UsIG9yIGRpc3RhbmNlIGJhc2UgKi8KKwkJc3RydWN0IGh1ZnRfdCAqdDsJLyogcG9pbnRlciB0byBuZXh0IGxldmVsIG9mIHRhYmxlICovCisJfSB2OworfSBodWZ0X3Q7CisKK2VudW0geworCS8qIGd1bnppcF93aW5kb3cgc2l6ZS0tbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kCisJICogYXQgbGVhc3QgMzJLIGZvciB6aXAncyBkZWZsYXRlIG1ldGhvZCAqLworCUdVTlpJUF9XU0laRSA9IDB4ODAwMCwKKwkvKiBJZiBCTUFYIG5lZWRzIHRvIGJlIGxhcmdlciB0aGFuIDE2LCB0aGVuIGggYW5kIHhbXSBzaG91bGQgYmUgdWxnLiAqLworCUJNQVggPSAxNiwJLyogbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGFueSBjb2RlICgxNiBmb3IgZXhwbG9kZSkgKi8KKwlOX01BWCA9IDI4OCwJLyogbWF4aW11bSBudW1iZXIgb2YgY29kZXMgaW4gYW55IHNldCAqLworfTsKKworCisvKiBUaGlzIGlzIHNvbWV3aGF0IGNvbXBsZXgtbG9va2luZyBhcnJhbmdlbWVudCwgYnV0IGl0IGFsbG93cworICogdG8gcGxhY2UgZGVjb21wcmVzc29yIHN0YXRlIGVpdGhlciBpbiBic3Mgb3IgaW4KKyAqIG1hbGxvYydlZCBzcGFjZSBzaW1wbHkgYnkgY2hhbmdpbmcgI2RlZmluZXMgYmVsb3cuCisgKiBTaXplcyBvbiBpMzg2OgorICogdGV4dCAgICBkYXRhICAgICBic3MgICAgIGRlYyAgICAgaGV4CisgKiA1MjU2ICAgICAgIDAgICAgIDEwOCAgICA1MzY0ICAgIDE0ZjQgLSBic3MKKyAqIDQ5MTUgICAgICAgMCAgICAgICAwICAgIDQ5MTUgICAgMTMzMyAtIG1hbGxvYworICovCisjZGVmaW5lIFNUQVRFX0lOX0JTUyAwCisjZGVmaW5lIFNUQVRFX0lOX01BTExPQyAxCisKKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdGVfdCB7CisJb2ZmX3QgZ3VuemlwX2J5dGVzX291dDsgLyogbnVtYmVyIG9mIG91dHB1dCBieXRlcyAqLworCXVpbnQzMl90IGd1bnppcF9jcmM7CisKKwlpbnQgZ3VuemlwX3NyY19mZDsKKwl1bnNpZ25lZCBndW56aXBfb3V0YnVmX2NvdW50OyAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisKKwl1bnNpZ25lZCBjaGFyICpndW56aXBfd2luZG93OworCisJdWludDMyX3QgKmd1bnppcF9jcmNfdGFibGU7CisKKwkvKiBiaXRidWZmZXIgKi8KKwl1bnNpZ25lZCBndW56aXBfYmI7IC8qIGJpdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGd1bnppcF9iazsgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisKKwkvKiBpbnB1dCAoY29tcHJlc3NlZCkgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgKmJ5dGVidWZmZXI7ICAgICAgLyogYnVmZmVyIGl0c2VsZiAqLworCW9mZl90IHRvX3JlYWQ7CQkJLyogY29tcHJlc3NlZCBieXRlcyB0byByZWFkICh1bnppcCBvbmx5LCAtMSBmb3IgZ3VuemlwKSAqLworLy8JdW5zaWduZWQgYnl0ZWJ1ZmZlcl9tYXg7ICAgICAgICAvKiBidWZmZXIgc2l6ZSAqLworCXVuc2lnbmVkIGJ5dGVidWZmZXJfb2Zmc2V0OyAgICAgLyogYnVmZmVyIHBvc2l0aW9uICovCisJdW5zaWduZWQgYnl0ZWJ1ZmZlcl9zaXplOyAgICAgICAvKiBob3cgbXVjaCBkYXRhIGlzIHRoZXJlIChzaXplIDw9IG1heCkgKi8KKworCS8qIHByaXZhdGUgZGF0YSBvZiBpbmZsYXRlX2NvZGVzKCkgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX21sOyAvKiBtYXNrcyBmb3IgYmwgYW5kIGJkIGJpdHMgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX21kOyAvKiBtYXNrcyBmb3IgYmwgYW5kIGJkIGJpdHMgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX2JiOyAvKiBiaXQgYnVmZmVyICovCisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19rOyAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc193OyAvKiBjdXJyZW50IGd1bnppcF93aW5kb3cgcG9zaXRpb24gKi8KKwlodWZ0X3QgKmluZmxhdGVfY29kZXNfdGw7CisJaHVmdF90ICppbmZsYXRlX2NvZGVzX3RkOworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfYmw7CisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19iZDsKKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX25uOyAvKiBsZW5ndGggYW5kIGluZGV4IGZvciBjb3B5ICovCisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19kZDsKKworCXNtYWxsaW50IHJlc3VtZV9jb3B5OworCisJLyogcHJpdmF0ZSBkYXRhIG9mIGluZmxhdGVfZ2V0X25leHRfd2luZG93KCkgKi8KKwlzbWFsbGludCBtZXRob2Q7IC8qIG1ldGhvZCA9PSAtMSBmb3Igc3RvcmVkLCAtMiBmb3IgY29kZXMgKi8KKwlzbWFsbGludCBuZWVkX2Fub3RoZXJfYmxvY2s7CisJc21hbGxpbnQgZW5kX3JlYWNoZWQ7CisKKwkvKiBwcml2YXRlIGRhdGEgb2YgaW5mbGF0ZV9zdG9yZWQoKSAqLworCXVuc2lnbmVkIGluZmxhdGVfc3RvcmVkX247CisJdW5zaWduZWQgaW5mbGF0ZV9zdG9yZWRfYjsKKwl1bnNpZ25lZCBpbmZsYXRlX3N0b3JlZF9rOworCXVuc2lnbmVkIGluZmxhdGVfc3RvcmVkX3c7CisKKwljb25zdCBjaGFyICplcnJvcl9tc2c7CisJam1wX2J1ZiBlcnJvcl9qbXA7Cit9IHN0YXRlX3Q7CisjZGVmaW5lIGd1bnppcF9ieXRlc19vdXQgICAgKFMoKWd1bnppcF9ieXRlc19vdXQgICApCisjZGVmaW5lIGd1bnppcF9jcmMgICAgICAgICAgKFMoKWd1bnppcF9jcmMgICAgICAgICApCisjZGVmaW5lIGd1bnppcF9zcmNfZmQgICAgICAgKFMoKWd1bnppcF9zcmNfZmQgICAgICApCisjZGVmaW5lIGd1bnppcF9vdXRidWZfY291bnQgKFMoKWd1bnppcF9vdXRidWZfY291bnQpCisjZGVmaW5lIGd1bnppcF93aW5kb3cgICAgICAgKFMoKWd1bnppcF93aW5kb3cgICAgICApCisjZGVmaW5lIGd1bnppcF9jcmNfdGFibGUgICAgKFMoKWd1bnppcF9jcmNfdGFibGUgICApCisjZGVmaW5lIGd1bnppcF9iYiAgICAgICAgICAgKFMoKWd1bnppcF9iYiAgICAgICAgICApCisjZGVmaW5lIGd1bnppcF9iayAgICAgICAgICAgKFMoKWd1bnppcF9iayAgICAgICAgICApCisjZGVmaW5lIHRvX3JlYWQgICAgICAgICAgICAgKFMoKXRvX3JlYWQgICAgICAgICAgICApCisvLyAjZGVmaW5lIGJ5dGVidWZmZXJfbWF4ICAgKFMoKWJ5dGVidWZmZXJfbWF4ICAgICApCisvLyBCb3RoIGd1bnppcCBhbmQgdW56aXAgY2FuIHVzZSBjb25zdGFudCBidWZmZXIgc2l6ZSBub3cgKDE2ayk6CisjZGVmaW5lIGJ5dGVidWZmZXJfbWF4ICAgICAgMHg0MDAwCisjZGVmaW5lIGJ5dGVidWZmZXIgICAgICAgICAgKFMoKWJ5dGVidWZmZXIgICAgICAgICApCisjZGVmaW5lIGJ5dGVidWZmZXJfb2Zmc2V0ICAgKFMoKWJ5dGVidWZmZXJfb2Zmc2V0ICApCisjZGVmaW5lIGJ5dGVidWZmZXJfc2l6ZSAgICAgKFMoKWJ5dGVidWZmZXJfc2l6ZSAgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfbWwgICAgKFMoKWluZmxhdGVfY29kZXNfbWwgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfbWQgICAgKFMoKWluZmxhdGVfY29kZXNfbWQgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfYmIgICAgKFMoKWluZmxhdGVfY29kZXNfYmIgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfayAgICAgKFMoKWluZmxhdGVfY29kZXNfayAgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfdyAgICAgKFMoKWluZmxhdGVfY29kZXNfdyAgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfdGwgICAgKFMoKWluZmxhdGVfY29kZXNfdGwgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfdGQgICAgKFMoKWluZmxhdGVfY29kZXNfdGQgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfYmwgICAgKFMoKWluZmxhdGVfY29kZXNfYmwgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfYmQgICAgKFMoKWluZmxhdGVfY29kZXNfYmQgICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfbm4gICAgKFMoKWluZmxhdGVfY29kZXNfbm4gICApCisjZGVmaW5lIGluZmxhdGVfY29kZXNfZGQgICAgKFMoKWluZmxhdGVfY29kZXNfZGQgICApCisjZGVmaW5lIHJlc3VtZV9jb3B5ICAgICAgICAgKFMoKXJlc3VtZV9jb3B5ICAgICAgICApCisjZGVmaW5lIG1ldGhvZCAgICAgICAgICAgICAgKFMoKW1ldGhvZCAgICAgICAgICAgICApCisjZGVmaW5lIG5lZWRfYW5vdGhlcl9ibG9jayAgKFMoKW5lZWRfYW5vdGhlcl9ibG9jayApCisjZGVmaW5lIGVuZF9yZWFjaGVkICAgICAgICAgKFMoKWVuZF9yZWFjaGVkICAgICAgICApCisjZGVmaW5lIGluZmxhdGVfc3RvcmVkX24gICAgKFMoKWluZmxhdGVfc3RvcmVkX24gICApCisjZGVmaW5lIGluZmxhdGVfc3RvcmVkX2IgICAgKFMoKWluZmxhdGVfc3RvcmVkX2IgICApCisjZGVmaW5lIGluZmxhdGVfc3RvcmVkX2sgICAgKFMoKWluZmxhdGVfc3RvcmVkX2sgICApCisjZGVmaW5lIGluZmxhdGVfc3RvcmVkX3cgICAgKFMoKWluZmxhdGVfc3RvcmVkX3cgICApCisjZGVmaW5lIGVycm9yX21zZyAgICAgICAgICAgKFMoKWVycm9yX21zZyAgICAgICAgICApCisjZGVmaW5lIGVycm9yX2ptcCAgICAgICAgICAgKFMoKWVycm9yX2ptcCAgICAgICAgICApCisKKy8qIFRoaXMgaXMgYSBnZW5lcmljIHBhcnQgKi8KKyNpZiBTVEFURV9JTl9CU1MgLyogVXNlIGdsb2JhbCBkYXRhIHNlZ21lbnQgKi8KKyNkZWZpbmUgREVDTEFSRV9TVEFURSAvKm5vdGhpbmcqLworI2RlZmluZSBBTExPQ19TVEFURSAvKm5vdGhpbmcqLworI2RlZmluZSBERUFMTE9DX1NUQVRFICgodm9pZCkwKQorI2RlZmluZSBTKCkgc3RhdGUuCisjZGVmaW5lIFBBU1NfU1RBVEUgLypub3RoaW5nKi8KKyNkZWZpbmUgUEFTU19TVEFURV9PTkxZIC8qbm90aGluZyovCisjZGVmaW5lIFNUQVRFX1BBUkFNIC8qbm90aGluZyovCisjZGVmaW5lIFNUQVRFX1BBUkFNX09OTFkgdm9pZAorc3RhdGljIHN0YXRlX3Qgc3RhdGU7CisjZW5kaWYKKworI2lmIFNUQVRFX0lOX01BTExPQyAvKiBVc2UgbWFsbG9jIHNwYWNlICovCisjZGVmaW5lIERFQ0xBUkVfU1RBVEUgc3RhdGVfdCAqc3RhdGUKKyNkZWZpbmUgQUxMT0NfU1RBVEUgKHN0YXRlID0geHphbGxvYyhzaXplb2YoKnN0YXRlKSkpCisjZGVmaW5lIERFQUxMT0NfU1RBVEUgZnJlZShzdGF0ZSkKKyNkZWZpbmUgUygpIHN0YXRlLT4KKyNkZWZpbmUgUEFTU19TVEFURSBzdGF0ZSwKKyNkZWZpbmUgUEFTU19TVEFURV9PTkxZIHN0YXRlCisjZGVmaW5lIFNUQVRFX1BBUkFNIHN0YXRlX3QgKnN0YXRlLAorI2RlZmluZSBTVEFURV9QQVJBTV9PTkxZIHN0YXRlX3QgKnN0YXRlCisjZW5kaWYKKworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbWFza19iaXRzW10gQUxJR04yID0geworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDMsIDB4MDAwNywgMHgwMDBmLCAweDAwMWYsIDB4MDAzZiwgMHgwMDdmLCAweDAwZmYsCisJMHgwMWZmLCAweDAzZmYsIDB4MDdmZiwgMHgwZmZmLCAweDFmZmYsIDB4M2ZmZiwgMHg3ZmZmLCAweGZmZmYKK307CisKKy8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNwbGVuc1tdIEFMSUdOMiA9IHsKKwkzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLCAzNSwgNDMsIDUxLCA1OSwKKwk2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwCit9OworCisvKiBub3RlOiBzZWUgbm90ZSAjMTMgYWJvdmUgYWJvdXQgdGhlIDI1OCBpbiB0aGlzIGxpc3QuICovCisvKiBFeHRyYSBiaXRzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjcGxleHRbXSBBTElHTjEgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwKKwk1LCA1LCA1LCAwLCA5OSwgOTkKK307IC8qIDk5ID09IGludmFsaWQgKi8KKworLyogQ29weSBvZmZzZXRzIGZvciBkaXN0YW5jZSBjb2RlcyAwLi4yOSAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNwZGlzdFtdIEFMSUdOMiA9IHsKKwkxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsIDI1NywgMzg1LCA1MTMsCisJNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LCA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3Cit9OworCisvKiBFeHRyYSBiaXRzIGZvciBkaXN0YW5jZSBjb2RlcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY3BkZXh0W10gQUxJR04xID0geworCTAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwKKwkxMSwgMTEsIDEyLCAxMiwgMTMsIDEzCit9OworCisvKiBUYWJsZXMgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LiAqLworLyogT3JkZXIgb2YgdGhlIGJpdCBsZW5ndGggY29kZSBsZW5ndGhzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBib3JkZXJbXSBBTElHTjEgPSB7CisJMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNQorfTsKKworCisvKgorICogRnJlZSB0aGUgbWFsbG9jJ2VkIHRhYmxlcyBidWlsdCBieSBodWZ0X2J1aWxkKCksIHdoaWNoIG1ha2VzIGEgbGlua2VkCisgKiBsaXN0IG9mIHRoZSB0YWJsZXMgaXQgbWFkZSwgd2l0aCB0aGUgbGlua3MgaW4gYSBkdW1teSBmaXJzdCBlbnRyeSBvZgorICogZWFjaCB0YWJsZS4KKyAqIHQ6IHRhYmxlIHRvIGZyZWUKKyAqLworc3RhdGljIHZvaWQgaHVmdF9mcmVlKGh1ZnRfdCAqcCkKK3sKKwlodWZ0X3QgKnE7CisKKwkvKiBHbyB0aHJvdWdoIGxpbmtlZCBsaXN0LCBmcmVlaW5nIGZyb20gdGhlIG1hbGxvY2VkICh0Wy0xXSkgYWRkcmVzcy4gKi8KKwl3aGlsZSAocCkgeworCQlxID0gKC0tcCktPnYudDsKKwkJZnJlZShwKTsKKwkJcCA9IHE7CisJfQorfQorCitzdGF0aWMgdm9pZCBodWZ0X2ZyZWVfYWxsKFNUQVRFX1BBUkFNX09OTFkpCit7CisJaHVmdF9mcmVlKGluZmxhdGVfY29kZXNfdGwpOworCWh1ZnRfZnJlZShpbmZsYXRlX2NvZGVzX3RkKTsKKwlpbmZsYXRlX2NvZGVzX3RsID0gTlVMTDsKKwlpbmZsYXRlX2NvZGVzX3RkID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYWJvcnRfdW56aXAoU1RBVEVfUEFSQU1fT05MWSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBhYm9ydF91bnppcChTVEFURV9QQVJBTV9PTkxZKQoreworCWh1ZnRfZnJlZV9hbGwoUEFTU19TVEFURV9PTkxZKTsKKwlsb25nam1wKGVycm9yX2ptcCwgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBmaWxsX2JpdGJ1ZmZlcihTVEFURV9QQVJBTSB1bnNpZ25lZCBiaXRidWZmZXIsIHVuc2lnbmVkICpjdXJyZW50LCBjb25zdCB1bnNpZ25lZCByZXF1aXJlZCkKK3sKKwl3aGlsZSAoKmN1cnJlbnQgPCByZXF1aXJlZCkgeworCQlpZiAoYnl0ZWJ1ZmZlcl9vZmZzZXQgPj0gYnl0ZWJ1ZmZlcl9zaXplKSB7CisJCQl1bnNpZ25lZCBzeiA9IGJ5dGVidWZmZXJfbWF4IC0gNDsKKwkJCWlmICh0b19yZWFkID49IDAgJiYgdG9fcmVhZCA8IHN6KSAvKiB1bnppcCBvbmx5ICovCisJCQkJc3ogPSB0b19yZWFkOworCQkJLyogTGVhdmUgdGhlIGZpcnN0IDQgYnl0ZXMgZW1wdHkgc28gd2UgY2FuIGFsd2F5cyB1bndpbmQgdGhlIGJpdGJ1ZmZlcgorCQkJICogdG8gdGhlIGZyb250IG9mIHRoZSBieXRlYnVmZmVyICovCisJCQlieXRlYnVmZmVyX3NpemUgPSBzYWZlX3JlYWQoZ3VuemlwX3NyY19mZCwgJmJ5dGVidWZmZXJbNF0sIHN6KTsKKwkJCWlmICgoaW50KWJ5dGVidWZmZXJfc2l6ZSA8IDEpIHsKKwkJCQllcnJvcl9tc2cgPSAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSI7CisJCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsKKwkJCX0KKwkJCWlmICh0b19yZWFkID49IDApIC8qIHVuemlwIG9ubHkgKi8KKwkJCQl0b19yZWFkIC09IGJ5dGVidWZmZXJfc2l6ZTsKKwkJCWJ5dGVidWZmZXJfc2l6ZSArPSA0OworCQkJYnl0ZWJ1ZmZlcl9vZmZzZXQgPSA0OworCQl9CisJCWJpdGJ1ZmZlciB8PSAoKHVuc2lnbmVkKSBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSkgPDwgKmN1cnJlbnQ7CisJCWJ5dGVidWZmZXJfb2Zmc2V0Kys7CisJCSpjdXJyZW50ICs9IDg7CisJfQorCXJldHVybiBiaXRidWZmZXI7Cit9CisKKworLyogR2l2ZW4gYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBhbmQgYSBtYXhpbXVtIHRhYmxlIHNpemUsIG1ha2UgYSBzZXQgb2YKKyAqIHRhYmxlcyB0byBkZWNvZGUgdGhhdCBzZXQgb2YgY29kZXMuICBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvbmUgaWYKKyAqIHRoZSBnaXZlbiBjb2RlIHNldCBpcyBpbmNvbXBsZXRlICh0aGUgdGFibGVzIGFyZSBzdGlsbCBidWlsdCBpbiB0aGlzCisgKiBjYXNlKSwgdHdvIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkIChhbGwgemVybyBsZW5ndGggY29kZXMgb3IgYW4KKyAqIG92ZXJzdWJzY3JpYmVkIHNldCBvZiBsZW5ndGhzKSAtIGluIHRoaXMgY2FzZSBzdG9yZXMgTlVMTCBpbiAqdC4KKyAqCisgKiBiOgljb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkKKyAqIG46CW51bWJlciBvZiBjb2RlcyAoYXNzdW1lZCA8PSBOX01BWCkKKyAqIHM6CW51bWJlciBvZiBzaW1wbGUtdmFsdWVkIGNvZGVzICgwLi5zLTEpCisgKiBkOglsaXN0IG9mIGJhc2UgdmFsdWVzIGZvciBub24tc2ltcGxlIGNvZGVzCisgKiBlOglsaXN0IG9mIGV4dHJhIGJpdHMgZm9yIG5vbi1zaW1wbGUgY29kZXMKKyAqIHQ6CXJlc3VsdDogc3RhcnRpbmcgdGFibGUKKyAqIG06CW1heGltdW0gbG9va3VwIGJpdHMsIHJldHVybnMgYWN0dWFsCisgKi8KK3N0YXRpYyBpbnQgaHVmdF9idWlsZChjb25zdCB1bnNpZ25lZCAqYiwgY29uc3QgdW5zaWduZWQgbiwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIHMsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpkLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqZSwgaHVmdF90ICoqdCwgdW5zaWduZWQgKm0pCit7CisJdW5zaWduZWQgYTsgICAgICAgICAgICAgLyogY291bnRlciBmb3IgY29kZXMgb2YgbGVuZ3RoIGsgKi8KKwl1bnNpZ25lZCBjW0JNQVggKyAxXTsgICAvKiBiaXQgbGVuZ3RoIGNvdW50IHRhYmxlICovCisJdW5zaWduZWQgZW9iX2xlbjsgICAgICAgLyogbGVuZ3RoIG9mIGVuZC1vZi1ibG9jayBjb2RlICh2YWx1ZSAyNTYpICovCisJdW5zaWduZWQgZjsgICAgICAgICAgICAgLyogaSByZXBlYXRzIGluIHRhYmxlIGV2ZXJ5IGYgZW50cmllcyAqLworCWludCBnOyAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KKwlpbnQgaHRsOyAgICAgICAgICAgICAgICAvKiB0YWJsZSBsZXZlbCAqLworCXVuc2lnbmVkIGk7ICAgICAgICAgICAgIC8qIGNvdW50ZXIsIGN1cnJlbnQgY29kZSAqLworCXVuc2lnbmVkIGo7ICAgICAgICAgICAgIC8qIGNvdW50ZXIgKi8KKwlpbnQgazsgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBjdXJyZW50IGNvZGUgKi8KKwl1bnNpZ25lZCAqcDsgICAgICAgICAgICAvKiBwb2ludGVyIGludG8gY1tdLCBiW10sIG9yIHZbXSAqLworCWh1ZnRfdCAqcTsgICAgICAgICAgICAgIC8qIHBvaW50cyB0byBjdXJyZW50IHRhYmxlICovCisJaHVmdF90IHI7ICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIHN0cnVjdHVyZSBhc3NpZ25tZW50ICovCisJaHVmdF90ICp1W0JNQVhdOyAgICAgICAgLyogdGFibGUgc3RhY2sgKi8KKwl1bnNpZ25lZCB2W05fTUFYXTsgICAgICAvKiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aCAqLworCWludCB3c1tCTUFYICsgMV07ICAgICAgIC8qIGJpdHMgZGVjb2RlZCBzdGFjayAqLworCWludCB3OyAgICAgICAgICAgICAgICAgIC8qIGJpdHMgZGVjb2RlZCAqLworCXVuc2lnbmVkIHhbQk1BWCArIDFdOyAgIC8qIGJpdCBvZmZzZXRzLCB0aGVuIGNvZGUgc3RhY2sgKi8KKwl1bnNpZ25lZCAqeHA7ICAgICAgICAgICAvKiBwb2ludGVyIGludG8geCAqLworCWludCB5OyAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkdW1teSBjb2RlcyBhZGRlZCAqLworCXVuc2lnbmVkIHo7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGN1cnJlbnQgdGFibGUgKi8KKworCS8qIExlbmd0aCBvZiBFT0IgY29kZSwgaWYgYW55ICovCisJZW9iX2xlbiA9IG4gPiAyNTYgPyBiWzI1Nl0gOiBCTUFYOworCisJKnQgPSBOVUxMOworCisJLyogR2VuZXJhdGUgY291bnRzIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKwltZW1zZXQoYywgMCwgc2l6ZW9mKGMpKTsKKwlwID0gKHVuc2lnbmVkICopIGI7IC8qIGNhc3QgYWxsb3dzIHVzIHRvIHJldXNlIHAgZm9yIHBvaW50aW5nIHRvIGIgKi8KKwlpID0gbjsKKwlkbyB7CisJCWNbKnBdKys7IC8qIGFzc3VtZSBhbGwgZW50cmllcyA8PSBCTUFYICovCisJCXArKzsgICAgIC8qIGNhbid0IGNvbWJpbmUgd2l0aCBhYm92ZSBsaW5lIChTb2xhcmlzIGJ1ZykgKi8KKwl9IHdoaWxlICgtLWkpOworCWlmIChjWzBdID09IG4pIHsgIC8qIG51bGwgaW5wdXQgLSBhbGwgemVybyBsZW5ndGggY29kZXMgKi8KKwkJKm0gPSAwOworCQlyZXR1cm4gMjsKKwl9CisKKwkvKiBGaW5kIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoLCBib3VuZCAqbSBieSB0aG9zZSAqLworCWZvciAoaiA9IDE7IChjW2pdID09IDApICYmIChqIDw9IEJNQVgpOyBqKyspCisJCWNvbnRpbnVlOworCWsgPSBqOyAvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCisJZm9yIChpID0gQk1BWDsgKGNbaV0gPT0gMCkgJiYgaTsgaS0tKQorCQljb250aW51ZTsKKwlnID0gaTsgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworCSptID0gKCptIDwgaikgPyBqIDogKCgqbSA+IGkpID8gaSA6ICptKTsKKworCS8qIEFkanVzdCBsYXN0IGxlbmd0aCBjb3VudCB0byBmaWxsIG91dCBjb2RlcywgaWYgbmVlZGVkICovCisJZm9yICh5ID0gMSA8PCBqOyBqIDwgaTsgaisrLCB5IDw8PSAxKSB7CisJCXkgLT0gY1tqXTsKKwkJaWYgKHkgPCAwKQorCQkJcmV0dXJuIDI7IC8qIGJhZCBpbnB1dDogbW9yZSBjb2RlcyB0aGFuIGJpdHMgKi8KKwl9CisJeSAtPSBjW2ldOworCWlmICh5IDwgMCkKKwkJcmV0dXJuIDI7CisJY1tpXSArPSB5OworCisJLyogR2VuZXJhdGUgc3RhcnRpbmcgb2Zmc2V0cyBpbnRvIHRoZSB2YWx1ZSB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKwl4WzFdID0gaiA9IDA7CisJcCA9IGMgKyAxOworCXhwID0geCArIDI7CisJd2hpbGUgKC0taSkgeyAvKiBub3RlIHRoYXQgaSA9PSBnIGZyb20gYWJvdmUgKi8KKwkJaiArPSAqcCsrOworCQkqeHArKyA9IGo7CisJfQorCisJLyogTWFrZSBhIHRhYmxlIG9mIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RocyAqLworCXAgPSAodW5zaWduZWQgKikgYjsKKwlpID0gMDsKKwlkbyB7CisJCWogPSAqcCsrOworCQlpZiAoaiAhPSAwKSB7CisJCQl2W3hbal0rK10gPSBpOworCQl9CisJfSB3aGlsZSAoKytpIDwgbik7CisKKwkvKiBHZW5lcmF0ZSB0aGUgSHVmZm1hbiBjb2RlcyBhbmQgZm9yIGVhY2gsIG1ha2UgdGhlIHRhYmxlIGVudHJpZXMgKi8KKwl4WzBdID0gaSA9IDA7ICAgLyogZmlyc3QgSHVmZm1hbiBjb2RlIGlzIHplcm8gKi8KKwlwID0gdjsgICAgICAgICAgLyogZ3JhYiB2YWx1ZXMgaW4gYml0IG9yZGVyICovCisJaHRsID0gLTE7ICAgICAgIC8qIG5vIHRhYmxlcyB5ZXQtLWxldmVsIC0xICovCisJdyA9IHdzWzBdID0gMDsgIC8qIGJpdHMgZGVjb2RlZCAqLworCXVbMF0gPSBOVUxMOyAgICAvKiBqdXN0IHRvIGtlZXAgY29tcGlsZXJzIGhhcHB5ICovCisJcSA9IE5VTEw7ICAgICAgIC8qIGRpdHRvICovCisJeiA9IDA7ICAgICAgICAgIC8qIGRpdHRvICovCisKKwkvKiBnbyB0aHJvdWdoIHRoZSBiaXQgbGVuZ3RocyAoayBhbHJlYWR5IGlzIGJpdHMgaW4gc2hvcnRlc3QgY29kZSkgKi8KKwlmb3IgKDsgayA8PSBnOyBrKyspIHsKKwkJYSA9IGNba107CisJCXdoaWxlIChhLS0pIHsKKwkJCS8qIGhlcmUgaSBpcyB0aGUgSHVmZm1hbiBjb2RlIG9mIGxlbmd0aCBrIGJpdHMgZm9yIHZhbHVlICpwICovCisJCQkvKiBtYWtlIHRhYmxlcyB1cCB0byByZXF1aXJlZCBsZXZlbCAqLworCQkJd2hpbGUgKGsgPiB3c1todGwgKyAxXSkgeworCQkJCXcgPSB3c1srK2h0bF07CisKKwkJCQkvKiBjb21wdXRlIG1pbmltdW0gc2l6ZSB0YWJsZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gKm0gYml0cyAqLworCQkJCXogPSBnIC0gdzsKKwkJCQl6ID0geiA+ICptID8gKm0gOiB6OyAvKiB1cHBlciBsaW1pdCBvbiB0YWJsZSBzaXplICovCisJCQkJaiA9IGsgLSB3OworCQkJCWYgPSAxIDw8IGo7CisJCQkJaWYgKGYgPiBhICsgMSkgeyAvKiB0cnkgYSBrLXcgYml0IHRhYmxlICovCisJCQkJCS8qIHRvbyBmZXcgY29kZXMgZm9yIGstdyBiaXQgdGFibGUgKi8KKwkJCQkJZiAtPSBhICsgMTsgLyogZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgbGVmdCAqLworCQkJCQl4cCA9IGMgKyBrOworCQkJCQl3aGlsZSAoKytqIDwgeikgeyAvKiB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzICovCisJCQkJCQlmIDw8PSAxOworCQkJCQkJaWYgKGYgPD0gKisreHApIHsKKwkJCQkJCQlicmVhazsgLyogZW5vdWdoIGNvZGVzIHRvIHVzZSB1cCBqIGJpdHMgKi8KKwkJCQkJCX0KKwkJCQkJCWYgLT0gKnhwOyAvKiBlbHNlIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zICovCisJCQkJCX0KKwkJCQl9CisJCQkJaiA9ICh3ICsgaiA+IGVvYl9sZW4gJiYgdyA8IGVvYl9sZW4pID8gZW9iX2xlbiAtIHcgOiBqOwkvKiBtYWtlIEVPQiBjb2RlIGVuZCBhdCB0YWJsZSAqLworCQkJCXogPSAxIDw8IGo7CS8qIHRhYmxlIGVudHJpZXMgZm9yIGotYml0IHRhYmxlICovCisJCQkJd3NbaHRsKzFdID0gdyArIGo7CS8qIHNldCBiaXRzIGRlY29kZWQgaW4gc3RhY2sgKi8KKworCQkJCS8qIGFsbG9jYXRlIGFuZCBsaW5rIGluIG5ldyB0YWJsZSAqLworCQkJCXEgPSB4emFsbG9jKCh6ICsgMSkgKiBzaXplb2YoaHVmdF90KSk7CisJCQkJKnQgPSBxICsgMTsJLyogbGluayB0byBsaXN0IGZvciBodWZ0X2ZyZWUoKSAqLworCQkJCXQgPSAmKHEtPnYudCk7CisJCQkJdVtodGxdID0gKytxOwkvKiB0YWJsZSBzdGFydHMgYWZ0ZXIgbGluayAqLworCisJCQkJLyogY29ubmVjdCB0byBsYXN0IHRhYmxlLCBpZiB0aGVyZSBpcyBvbmUgKi8KKwkJCQlpZiAoaHRsKSB7CisJCQkJCXhbaHRsXSA9IGk7IC8qIHNhdmUgcGF0dGVybiBmb3IgYmFja2luZyB1cCAqLworCQkJCQlyLmIgPSAodW5zaWduZWQgY2hhcikgKHcgLSB3c1todGwgLSAxXSk7IC8qIGJpdHMgdG8gZHVtcCBiZWZvcmUgdGhpcyB0YWJsZSAqLworCQkJCQlyLmUgPSAodW5zaWduZWQgY2hhcikgKDE2ICsgaik7IC8qIGJpdHMgaW4gdGhpcyB0YWJsZSAqLworCQkJCQlyLnYudCA9IHE7IC8qIHBvaW50ZXIgdG8gdGhpcyB0YWJsZSAqLworCQkJCQlqID0gKGkgJiAoKDEgPDwgdykgLSAxKSkgPj4gd3NbaHRsIC0gMV07CisJCQkJCXVbaHRsIC0gMV1bal0gPSByOyAvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUgKi8KKwkJCQl9CisJCQl9CisKKwkJCS8qIHNldCB1cCB0YWJsZSBlbnRyeSBpbiByICovCisJCQlyLmIgPSAodW5zaWduZWQgY2hhcikgKGsgLSB3KTsKKwkJCWlmIChwID49IHYgKyBuKSB7CisJCQkJci5lID0gOTk7IC8qIG91dCBvZiB2YWx1ZXMtLWludmFsaWQgY29kZSAqLworCQkJfSBlbHNlIGlmICgqcCA8IHMpIHsKKwkJCQlyLmUgPSAodW5zaWduZWQgY2hhcikgKCpwIDwgMjU2ID8gMTYgOiAxNSk7CS8qIDI1NiBpcyBFT0IgY29kZSAqLworCQkJCXIudi5uID0gKHVuc2lnbmVkIHNob3J0KSAoKnArKyk7IC8qIHNpbXBsZSBjb2RlIGlzIGp1c3QgdGhlIHZhbHVlICovCisJCQl9IGVsc2UgeworCQkJCXIuZSA9ICh1bnNpZ25lZCBjaGFyKSBlWypwIC0gc107IC8qIG5vbi1zaW1wbGUtLWxvb2sgdXAgaW4gbGlzdHMgKi8KKwkJCQlyLnYubiA9IGRbKnArKyAtIHNdOworCQkJfQorCisJCQkvKiBmaWxsIGNvZGUtbGlrZSBlbnRyaWVzIHdpdGggciAqLworCQkJZiA9IDEgPDwgKGsgLSB3KTsKKwkJCWZvciAoaiA9IGkgPj4gdzsgaiA8IHo7IGogKz0gZikgeworCQkJCXFbal0gPSByOworCQkJfQorCisJCQkvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBrLWJpdCBjb2RlIGkgKi8KKwkJCWZvciAoaiA9IDEgPDwgKGsgLSAxKTsgaSAmIGo7IGogPj49IDEpIHsKKwkJCQlpIF49IGo7CisJCQl9CisJCQlpIF49IGo7CisKKwkJCS8qIGJhY2t1cCBvdmVyIGZpbmlzaGVkIHRhYmxlcyAqLworCQkJd2hpbGUgKChpICYgKCgxIDw8IHcpIC0gMSkpICE9IHhbaHRsXSkgeworCQkJCXcgPSB3c1stLWh0bF07CisJCQl9CisJCX0KKwl9CisKKwkvKiByZXR1cm4gYWN0dWFsIHNpemUgb2YgYmFzZSB0YWJsZSAqLworCSptID0gd3NbMV07CisKKwkvKiBSZXR1cm4gMSBpZiB3ZSB3ZXJlIGdpdmVuIGFuIGluY29tcGxldGUgdGFibGUgKi8KKwlyZXR1cm4geSAhPSAwICYmIGcgIT0gMTsKK30KKworCisvKgorICogaW5mbGF0ZSAoZGVjb21wcmVzcykgdGhlIGNvZGVzIGluIGEgZGVmbGF0ZWQgKGNvbXByZXNzZWQpIGJsb2NrLgorICogUmV0dXJuIGFuIGVycm9yIGNvZGUgb3IgemVybyBpZiBpdCBhbGwgZ29lcyBvay4KKyAqCisgKiB0bCwgdGQ6IGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGVyIHRhYmxlcworICogYmwsIGJkOiBudW1iZXIgb2YgYml0cyBkZWNvZGVkIGJ5IHRsW10gYW5kIHRkW10KKyAqLworLyogY2FsbGVkIG9uY2UgZnJvbSBpbmZsYXRlX2Jsb2NrICovCisKKy8qIG1hcCBmb3JtZXJseSBsb2NhbCBzdGF0aWMgdmFyaWFibGVzIHRvIGdsb2JhbHMgKi8KKyNkZWZpbmUgbWwgaW5mbGF0ZV9jb2Rlc19tbAorI2RlZmluZSBtZCBpbmZsYXRlX2NvZGVzX21kCisjZGVmaW5lIGJiIGluZmxhdGVfY29kZXNfYmIKKyNkZWZpbmUgayAgaW5mbGF0ZV9jb2Rlc19rCisjZGVmaW5lIHcgIGluZmxhdGVfY29kZXNfdworI2RlZmluZSB0bCBpbmZsYXRlX2NvZGVzX3RsCisjZGVmaW5lIHRkIGluZmxhdGVfY29kZXNfdGQKKyNkZWZpbmUgYmwgaW5mbGF0ZV9jb2Rlc19ibAorI2RlZmluZSBiZCBpbmZsYXRlX2NvZGVzX2JkCisjZGVmaW5lIG5uIGluZmxhdGVfY29kZXNfbm4KKyNkZWZpbmUgZGQgaW5mbGF0ZV9jb2Rlc19kZAorc3RhdGljIHZvaWQgaW5mbGF0ZV9jb2Rlc19zZXR1cChTVEFURV9QQVJBTSB1bnNpZ25lZCBteV9ibCwgdW5zaWduZWQgbXlfYmQpCit7CisJYmwgPSBteV9ibDsKKwliZCA9IG15X2JkOworCS8qIG1ha2UgbG9jYWwgY29waWVzIG9mIGdsb2JhbHMgKi8KKwliYiA9IGd1bnppcF9iYjsJCQkvKiBpbml0aWFsaXplIGJpdCBidWZmZXIgKi8KKwlrID0gZ3VuemlwX2JrOworCXcgPSBndW56aXBfb3V0YnVmX2NvdW50OwkvKiBpbml0aWFsaXplIGd1bnppcF93aW5kb3cgcG9zaXRpb24gKi8KKwkvKiBpbmZsYXRlIHRoZSBjb2RlZCBkYXRhICovCisJbWwgPSBtYXNrX2JpdHNbYmxdOwkJLyogcHJlY29tcHV0ZSBtYXNrcyBmb3Igc3BlZWQgKi8KKwltZCA9IG1hc2tfYml0c1tiZF07Cit9CisvKiBjYWxsZWQgb25jZSBmcm9tIGluZmxhdGVfZ2V0X25leHRfd2luZG93ICovCitzdGF0aWMgTk9JTkxJTkUgaW50IGluZmxhdGVfY29kZXMoU1RBVEVfUEFSQU1fT05MWSkKK3sKKwl1bnNpZ25lZCBlOwkvKiB0YWJsZSBlbnRyeSBmbGFnL251bWJlciBvZiBleHRyYSBiaXRzICovCisJaHVmdF90ICp0OwkvKiBwb2ludGVyIHRvIHRhYmxlIGVudHJ5ICovCisKKwlpZiAocmVzdW1lX2NvcHkpCisJCWdvdG8gZG9fY29weTsKKworCXdoaWxlICgxKSB7CQkJLyogZG8gdW50aWwgZW5kIG9mIGJsb2NrICovCisJCWJiID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiYiwgJmssIGJsKTsKKwkJdCA9IHRsICsgKCh1bnNpZ25lZCkgYmIgJiBtbCk7CisJCWUgPSB0LT5lOworCQlpZiAoZSA+IDE2KQorCQkJZG8geworCQkJCWlmIChlID09IDk5KQorCQkJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOzsKKwkJCQliYiA+Pj0gdC0+YjsKKwkJCQlrIC09IHQtPmI7CisJCQkJZSAtPSAxNjsKKwkJCQliYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYmIsICZrLCBlKTsKKwkJCQl0ID0gdC0+di50ICsgKCh1bnNpZ25lZCkgYmIgJiBtYXNrX2JpdHNbZV0pOworCQkJCWUgPSB0LT5lOworCQkJfSB3aGlsZSAoZSA+IDE2KTsKKwkJYmIgPj49IHQtPmI7CisJCWsgLT0gdC0+YjsKKwkJaWYgKGUgPT0gMTYpIHsJLyogdGhlbiBpdCdzIGEgbGl0ZXJhbCAqLworCQkJZ3VuemlwX3dpbmRvd1t3KytdID0gKHVuc2lnbmVkIGNoYXIpIHQtPnYubjsKKwkJCWlmICh3ID09IEdVTlpJUF9XU0laRSkgeworCQkJCWd1bnppcF9vdXRidWZfY291bnQgPSB3OworCQkJCS8vZmx1c2hfZ3VuemlwX3dpbmRvdygpOworCQkJCXcgPSAwOworCQkJCXJldHVybiAxOyAvLyBXZSBoYXZlIGEgYmxvY2sgdG8gcmVhZAorCQkJfQorCQl9IGVsc2UgewkJLyogaXQncyBhbiBFT0Igb3IgYSBsZW5ndGggKi8KKwkJCS8qIGV4aXQgaWYgZW5kIG9mIGJsb2NrICovCisJCQlpZiAoZSA9PSAxNSkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBnZXQgbGVuZ3RoIG9mIGJsb2NrIHRvIGNvcHkgKi8KKwkJCWJiID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiYiwgJmssIGUpOworCQkJbm4gPSB0LT52Lm4gKyAoKHVuc2lnbmVkKSBiYiAmIG1hc2tfYml0c1tlXSk7CisJCQliYiA+Pj0gZTsKKwkJCWsgLT0gZTsKKworCQkJLyogZGVjb2RlIGRpc3RhbmNlIG9mIGJsb2NrIHRvIGNvcHkgKi8KKwkJCWJiID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiYiwgJmssIGJkKTsKKwkJCXQgPSB0ZCArICgodW5zaWduZWQpIGJiICYgbWQpOworCQkJZSA9IHQtPmU7CisJCQlpZiAoZSA+IDE2KQorCQkJCWRvIHsKKwkJCQkJaWYgKGUgPT0gOTkpCisJCQkJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOworCQkJCQliYiA+Pj0gdC0+YjsKKwkJCQkJayAtPSB0LT5iOworCQkJCQllIC09IDE2OworCQkJCQliYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYmIsICZrLCBlKTsKKwkJCQkJdCA9IHQtPnYudCArICgodW5zaWduZWQpIGJiICYgbWFza19iaXRzW2VdKTsKKwkJCQkJZSA9IHQtPmU7CisJCQkJfSB3aGlsZSAoZSA+IDE2KTsKKwkJCWJiID4+PSB0LT5iOworCQkJayAtPSB0LT5iOworCQkJYmIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJiLCAmaywgZSk7CisJCQlkZCA9IHcgLSB0LT52Lm4gLSAoKHVuc2lnbmVkKSBiYiAmIG1hc2tfYml0c1tlXSk7CisJCQliYiA+Pj0gZTsKKwkJCWsgLT0gZTsKKworCQkJLyogZG8gdGhlIGNvcHkgKi8KKyBkb19jb3B5OgorCQkJZG8geworCQkJCS8qIFdhczogbm4gLT0gKGUgPSAoZSA9IEdVTlpJUF9XU0laRSAtICgoZGQgJj0gR1VOWklQX1dTSVpFIC0gMSkgPiB3ID8gZGQgOiB3KSkgPiBubiA/IG5uIDogZSk7ICovCisJCQkJLyogV2hvIHdyb3RlIFRIQVQ/PyByZXdyaXR0ZW4gYXM6ICovCisJCQkJdW5zaWduZWQgZGVsdGE7CisKKwkJCQlkZCAmPSBHVU5aSVBfV1NJWkUgLSAxOworCQkJCWUgPSBHVU5aSVBfV1NJWkUgLSAoZGQgPiB3ID8gZGQgOiB3KTsKKwkJCQlkZWx0YSA9IHcgPiBkZCA/IHcgLSBkZCA6IGRkIC0gdzsKKwkJCQlpZiAoZSA+IG5uKSBlID0gbm47CisJCQkJbm4gLT0gZTsKKworCQkJCS8qIGNvcHkgdG8gbmV3IGJ1ZmZlciB0byBwcmV2ZW50IHBvc3NpYmxlIG92ZXJ3cml0ZSAqLworCQkJCWlmIChkZWx0YSA+PSBlKSB7CisJCQkJCW1lbWNweShndW56aXBfd2luZG93ICsgdywgZ3VuemlwX3dpbmRvdyArIGRkLCBlKTsKKwkJCQkJdyArPSBlOworCQkJCQlkZCArPSBlOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGRvIGl0IHNsb3cgdG8gYXZvaWQgbWVtY3B5KCkgb3ZlcmxhcCAqLworCQkJCQkvKiAhTk9NRU1DUFkgKi8KKwkJCQkJZG8geworCQkJCQkJZ3VuemlwX3dpbmRvd1t3KytdID0gZ3VuemlwX3dpbmRvd1tkZCsrXTsKKwkJCQkJfSB3aGlsZSAoLS1lKTsKKwkJCQl9CisJCQkJaWYgKHcgPT0gR1VOWklQX1dTSVpFKSB7CisJCQkJCWd1bnppcF9vdXRidWZfY291bnQgPSB3OworCQkJCQlyZXN1bWVfY29weSA9IChubiAhPSAwKTsKKwkJCQkJLy9mbHVzaF9ndW56aXBfd2luZG93KCk7CisJCQkJCXcgPSAwOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9IHdoaWxlIChubik7CisJCQlyZXN1bWVfY29weSA9IDA7CisJCX0KKwl9CisKKwkvKiByZXN0b3JlIHRoZSBnbG9iYWxzIGZyb20gdGhlIGxvY2FscyAqLworCWd1bnppcF9vdXRidWZfY291bnQgPSB3OwkvKiByZXN0b3JlIGdsb2JhbCBndW56aXBfd2luZG93IHBvaW50ZXIgKi8KKwlndW56aXBfYmIgPSBiYjsJCQkvKiByZXN0b3JlIGdsb2JhbCBiaXQgYnVmZmVyICovCisJZ3VuemlwX2JrID0gazsKKworCS8qIG5vcm1hbGx5IGp1c3QgYWZ0ZXIgY2FsbCB0byBpbmZsYXRlX2NvZGVzLCBidXQgc2F2ZSBjb2RlIGJ5IHB1dHRpbmcgaXQgaGVyZSAqLworCS8qIGZyZWUgdGhlIGRlY29kaW5nIHRhYmxlcyAodGwgYW5kIHRkKSwgcmV0dXJuICovCisJaHVmdF9mcmVlX2FsbChQQVNTX1NUQVRFX09OTFkpOworCisJLyogZG9uZSAqLworCXJldHVybiAwOworfQorI3VuZGVmIG1sCisjdW5kZWYgbWQKKyN1bmRlZiBiYgorI3VuZGVmIGsKKyN1bmRlZiB3CisjdW5kZWYgdGwKKyN1bmRlZiB0ZAorI3VuZGVmIGJsCisjdW5kZWYgYmQKKyN1bmRlZiBubgorI3VuZGVmIGRkCisKKworLyogY2FsbGVkIG9uY2UgZnJvbSBpbmZsYXRlX2Jsb2NrICovCitzdGF0aWMgdm9pZCBpbmZsYXRlX3N0b3JlZF9zZXR1cChTVEFURV9QQVJBTSBpbnQgbXlfbiwgaW50IG15X2IsIGludCBteV9rKQoreworCWluZmxhdGVfc3RvcmVkX24gPSBteV9uOworCWluZmxhdGVfc3RvcmVkX2IgPSBteV9iOworCWluZmxhdGVfc3RvcmVkX2sgPSBteV9rOworCS8qIGluaXRpYWxpemUgZ3VuemlwX3dpbmRvdyBwb3NpdGlvbiAqLworCWluZmxhdGVfc3RvcmVkX3cgPSBndW56aXBfb3V0YnVmX2NvdW50OworfQorLyogY2FsbGVkIG9uY2UgZnJvbSBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdyAqLworc3RhdGljIGludCBpbmZsYXRlX3N0b3JlZChTVEFURV9QQVJBTV9PTkxZKQoreworCS8qIHJlYWQgYW5kIG91dHB1dCB0aGUgY29tcHJlc3NlZCBkYXRhICovCisJd2hpbGUgKGluZmxhdGVfc3RvcmVkX24tLSkgeworCQlpbmZsYXRlX3N0b3JlZF9iID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBpbmZsYXRlX3N0b3JlZF9iLCAmaW5mbGF0ZV9zdG9yZWRfaywgOCk7CisJCWd1bnppcF93aW5kb3dbaW5mbGF0ZV9zdG9yZWRfdysrXSA9ICh1bnNpZ25lZCBjaGFyKSBpbmZsYXRlX3N0b3JlZF9iOworCQlpZiAoaW5mbGF0ZV9zdG9yZWRfdyA9PSBHVU5aSVBfV1NJWkUpIHsKKwkJCWd1bnppcF9vdXRidWZfY291bnQgPSBpbmZsYXRlX3N0b3JlZF93OworCQkJLy9mbHVzaF9ndW56aXBfd2luZG93KCk7CisJCQlpbmZsYXRlX3N0b3JlZF93ID0gMDsKKwkJCWluZmxhdGVfc3RvcmVkX2IgPj49IDg7CisJCQlpbmZsYXRlX3N0b3JlZF9rIC09IDg7CisJCQlyZXR1cm4gMTsgLyogV2UgaGF2ZSBhIGJsb2NrICovCisJCX0KKwkJaW5mbGF0ZV9zdG9yZWRfYiA+Pj0gODsKKwkJaW5mbGF0ZV9zdG9yZWRfayAtPSA4OworCX0KKworCS8qIHJlc3RvcmUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgbG9jYWxzICovCisJZ3VuemlwX291dGJ1Zl9jb3VudCA9IGluZmxhdGVfc3RvcmVkX3c7CQkvKiByZXN0b3JlIGdsb2JhbCBndW56aXBfd2luZG93IHBvaW50ZXIgKi8KKwlndW56aXBfYmIgPSBpbmZsYXRlX3N0b3JlZF9iOwkvKiByZXN0b3JlIGdsb2JhbCBiaXQgYnVmZmVyICovCisJZ3VuemlwX2JrID0gaW5mbGF0ZV9zdG9yZWRfazsKKwlyZXR1cm4gMDsgLyogRmluaXNoZWQgKi8KK30KKworCisvKgorICogZGVjb21wcmVzcyBhbiBpbmZsYXRlZCBibG9jaworICogZTogbGFzdCBibG9jayBmbGFnCisgKgorICogR0xPQkFMIFZBUklBQkxFUzogYmIsIGtrLAorICovCisvKiBSZXR1cm4gdmFsdWVzOiAtMSA9IGluZmxhdGVfc3RvcmVkLCAtMiA9IGluZmxhdGVfY29kZXMgKi8KKy8qIE9uZSBjYWxsc2l0ZSBpbiBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdyAqLworc3RhdGljIGludCBpbmZsYXRlX2Jsb2NrKFNUQVRFX1BBUkFNIHNtYWxsaW50ICplKQoreworCXVuc2lnbmVkIGxsWzI4NiArIDMwXTsgIC8qIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKwl1bnNpZ25lZCB0OyAgICAgLyogYmxvY2sgdHlwZSAqLworCXVuc2lnbmVkIGI7ICAgICAvKiBiaXQgYnVmZmVyICovCisJdW5zaWduZWQgazsgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCS8qIG1ha2UgbG9jYWwgYml0IGJ1ZmZlciAqLworCisJYiA9IGd1bnppcF9iYjsKKwlrID0gZ3VuemlwX2JrOworCisJLyogcmVhZCBpbiBsYXN0IGJsb2NrIGJpdCAqLworCWIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGIsICZrLCAxKTsKKwkqZSA9IGIgJiAxOworCWIgPj49IDE7CisJayAtPSAxOworCisJLyogcmVhZCBpbiBibG9jayB0eXBlICovCisJYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYiwgJmssIDIpOworCXQgPSAodW5zaWduZWQpIGIgJiAzOworCWIgPj49IDI7CisJayAtPSAyOworCisJLyogcmVzdG9yZSB0aGUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKwlndW56aXBfYmIgPSBiOworCWd1bnppcF9iayA9IGs7CisKKwkvKiBEbyB3ZSBzZWUgYmxvY2sgdHlwZSAxIG9mdGVuPyBZZXMhCisJICogVE9ETzogZml4IHBlcmZvcm1hbmNlIHByb2JsZW0gKHNlZSBiZWxvdykgKi8KKwkvL2JiX2Vycm9yX21zZygiYmxrdHlwZSAlZCIsIHQpOworCisJLyogaW5mbGF0ZSB0aGF0IGJsb2NrIHR5cGUgKi8KKwlzd2l0Y2ggKHQpIHsKKwljYXNlIDA6IC8qIEluZmxhdGUgc3RvcmVkICovCisJeworCQl1bnNpZ25lZCBuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYmxvY2sgKi8KKwkJdW5zaWduZWQgYl9zdG9yZWQ7CS8qIGJpdCBidWZmZXIgKi8KKwkJdW5zaWduZWQga19zdG9yZWQ7CS8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCQkvKiBtYWtlIGxvY2FsIGNvcGllcyBvZiBnbG9iYWxzICovCisJCWJfc3RvcmVkID0gZ3VuemlwX2JiOwkvKiBpbml0aWFsaXplIGJpdCBidWZmZXIgKi8KKwkJa19zdG9yZWQgPSBndW56aXBfYms7CisKKwkJLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworCQluID0ga19zdG9yZWQgJiA3OworCQliX3N0b3JlZCA+Pj0gbjsKKwkJa19zdG9yZWQgLT0gbjsKKworCQkvKiBnZXQgdGhlIGxlbmd0aCBhbmQgaXRzIGNvbXBsZW1lbnQgKi8KKwkJYl9zdG9yZWQgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfc3RvcmVkLCAma19zdG9yZWQsIDE2KTsKKwkJbiA9ICgodW5zaWduZWQpIGJfc3RvcmVkICYgMHhmZmZmKTsKKwkJYl9zdG9yZWQgPj49IDE2OworCQlrX3N0b3JlZCAtPSAxNjsKKworCQliX3N0b3JlZCA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9zdG9yZWQsICZrX3N0b3JlZCwgMTYpOworCQlpZiAobiAhPSAodW5zaWduZWQpICgofmJfc3RvcmVkKSAmIDB4ZmZmZikpIHsKKwkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CS8qIGVycm9yIGluIGNvbXByZXNzZWQgZGF0YSAqLworCQl9CisJCWJfc3RvcmVkID4+PSAxNjsKKwkJa19zdG9yZWQgLT0gMTY7CisKKwkJaW5mbGF0ZV9zdG9yZWRfc2V0dXAoUEFTU19TVEFURSBuLCBiX3N0b3JlZCwga19zdG9yZWQpOworCisJCXJldHVybiAtMTsKKwl9CisJY2FzZSAxOgorCS8qIEluZmxhdGUgZml4ZWQKKwkgKiBkZWNvbXByZXNzIGFuIGluZmxhdGVkIHR5cGUgMSAoZml4ZWQgSHVmZm1hbiBjb2RlcykgYmxvY2suIFdlIHNob3VsZAorCSAqIGVpdGhlciByZXBsYWNlIHRoaXMgd2l0aCBhIGN1c3RvbSBkZWNvZGVyLCBvciBhdCBsZWFzdCBwcmVjb21wdXRlIHRoZQorCSAqIEh1ZmZtYW4gdGFibGVzLiBUT0RPICovCisJeworCQlpbnQgaTsgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKwkJdW5zaWduZWQgYmw7ICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRsICovCisJCXVuc2lnbmVkIGJkOyAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0ZCAqLworCQkvKiBnY2MgNC4yLjEgaXMgdG9vIGR1bWIgdG8gcmV1c2Ugc3RhY2tzcGFjZS4gTW92ZWQgdXAuLi4gKi8KKwkJLy91bnNpZ25lZCBsbFsyODhdOyAgICAgLyogbGVuZ3RoIGxpc3QgZm9yIGh1ZnRfYnVpbGQgKi8KKworCQkvKiBzZXQgdXAgbGl0ZXJhbCB0YWJsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTQ0OyBpKyspCisJCQlsbFtpXSA9IDg7CisJCWZvciAoOyBpIDwgMjU2OyBpKyspCisJCQlsbFtpXSA9IDk7CisJCWZvciAoOyBpIDwgMjgwOyBpKyspCisJCQlsbFtpXSA9IDc7CisJCWZvciAoOyBpIDwgMjg4OyBpKyspIC8qIG1ha2UgYSBjb21wbGV0ZSwgYnV0IHdyb25nIGNvZGUgc2V0ICovCisJCQlsbFtpXSA9IDg7CisJCWJsID0gNzsKKwkJaHVmdF9idWlsZChsbCwgMjg4LCAyNTcsIGNwbGVucywgY3BsZXh0LCAmaW5mbGF0ZV9jb2Rlc190bCwgJmJsKTsKKwkJLyogaHVmdF9idWlsZCgpIG5ldmVyIHJldHVybiBub256ZXJvIC0gd2UgdXNlIGtub3duIGRhdGEgKi8KKworCQkvKiBzZXQgdXAgZGlzdGFuY2UgdGFibGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIC8qIG1ha2UgYW4gaW5jb21wbGV0ZSBjb2RlIHNldCAqLworCQkJbGxbaV0gPSA1OworCQliZCA9IDU7CisJCWh1ZnRfYnVpbGQobGwsIDMwLCAwLCBjcGRpc3QsIGNwZGV4dCwgJmluZmxhdGVfY29kZXNfdGQsICZiZCk7CisKKwkJLyogc2V0IHVwIGRhdGEgZm9yIGluZmxhdGVfY29kZXMoKSAqLworCQlpbmZsYXRlX2NvZGVzX3NldHVwKFBBU1NfU1RBVEUgYmwsIGJkKTsKKworCQkvKiBodWZ0X2ZyZWUgY29kZSBtb3ZlZCBpbnRvIGluZmxhdGVfY29kZXMgKi8KKworCQlyZXR1cm4gLTI7CisJfQorCWNhc2UgMjogLyogSW5mbGF0ZSBkeW5hbWljICovCisJeworCQllbnVtIHsgZGJpdHMgPSA2IH07ICAgICAvKiBiaXRzIGluIGJhc2UgZGlzdGFuY2UgbG9va3VwIHRhYmxlICovCisJCWVudW0geyBsYml0cyA9IDkgfTsgICAgIC8qIGJpdHMgaW4gYmFzZSBsaXRlcmFsL2xlbmd0aCBsb29rdXAgdGFibGUgKi8KKworCQlodWZ0X3QgKnRkOyAgICAgICAgICAgICAvKiBkaXN0YW5jZSBjb2RlIHRhYmxlICovCisJCXVuc2lnbmVkIGk7ICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKwkJdW5zaWduZWQgajsKKwkJdW5zaWduZWQgbDsgICAgICAgICAgICAgLyogbGFzdCBsZW5ndGggKi8KKwkJdW5zaWduZWQgbTsgICAgICAgICAgICAgLyogbWFzayBmb3IgYml0IGxlbmd0aHMgdGFibGUgKi8KKwkJdW5zaWduZWQgbjsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aHMgdG8gZ2V0ICovCisJCXVuc2lnbmVkIGJsOyAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0bCAqLworCQl1bnNpZ25lZCBiZDsgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGQgKi8KKwkJdW5zaWduZWQgbmI7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgKi8KKwkJdW5zaWduZWQgbmw7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisJCXVuc2lnbmVkIG5kOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisJCS8vdW5zaWduZWQgbGxbMjg2ICsgMzBdOy8qIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKwkJdW5zaWduZWQgYl9keW5hbWljOyAgICAgLyogYml0IGJ1ZmZlciAqLworCQl1bnNpZ25lZCBrX2R5bmFtaWM7ICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKwkJLyogbWFrZSBsb2NhbCBiaXQgYnVmZmVyICovCisJCWJfZHluYW1pYyA9IGd1bnppcF9iYjsKKwkJa19keW5hbWljID0gZ3VuemlwX2JrOworCisJCS8qIHJlYWQgaW4gdGFibGUgbGVuZ3RocyAqLworCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgNSk7CisJCW5sID0gMjU3ICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgMHgxZik7CS8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworCisJCWJfZHluYW1pYyA+Pj0gNTsKKwkJa19keW5hbWljIC09IDU7CisJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCA1KTsKKwkJbmQgPSAxICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgMHgxZik7CS8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisJCWJfZHluYW1pYyA+Pj0gNTsKKwkJa19keW5hbWljIC09IDU7CisJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCA0KTsKKwkJbmIgPSA0ICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgMHhmKTsJLyogbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgKi8KKworCQliX2R5bmFtaWMgPj49IDQ7CisJCWtfZHluYW1pYyAtPSA0OworCQlpZiAobmwgPiAyODYgfHwgbmQgPiAzMCkKKwkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CS8qIGJhZCBsZW5ndGhzICovCisKKwkJLyogcmVhZCBpbiBiaXQtbGVuZ3RoLWNvZGUgbGVuZ3RocyAqLworCQlmb3IgKGogPSAwOyBqIDwgbmI7IGorKykgeworCQkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDMpOworCQkJbGxbYm9yZGVyW2pdXSA9ICh1bnNpZ25lZCkgYl9keW5hbWljICYgNzsKKwkJCWJfZHluYW1pYyA+Pj0gMzsKKwkJCWtfZHluYW1pYyAtPSAzOworCQl9CisJCWZvciAoOyBqIDwgMTk7IGorKykKKwkJCWxsW2JvcmRlcltqXV0gPSAwOworCisJCS8qIGJ1aWxkIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcyAtIHNpbmdsZSBsZXZlbCwgNyBiaXQgbG9va3VwICovCisJCWJsID0gNzsKKwkJaSA9IGh1ZnRfYnVpbGQobGwsIDE5LCAxOSwgTlVMTCwgTlVMTCwgJmluZmxhdGVfY29kZXNfdGwsICZibCk7CisJCWlmIChpICE9IDApIHsKKwkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7IC8vcmV0dXJuIGk7CS8qIGluY29tcGxldGUgY29kZSBzZXQgKi8KKwkJfQorCisJCS8qIHJlYWQgaW4gbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisJCW4gPSBubCArIG5kOworCQltID0gbWFza19iaXRzW2JsXTsKKwkJaSA9IGwgPSAwOworCQl3aGlsZSAoKHVuc2lnbmVkKSBpIDwgbikgeworCQkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsICh1bnNpZ25lZClibCk7CisJCQl0ZCA9IGluZmxhdGVfY29kZXNfdGwgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiBtKTsKKwkJCWogPSB0ZC0+YjsKKwkJCWJfZHluYW1pYyA+Pj0gajsKKwkJCWtfZHluYW1pYyAtPSBqOworCQkJaiA9IHRkLT52Lm47CisJCQlpZiAoaiA8IDE2KSB7CS8qIGxlbmd0aCBvZiBjb2RlIGluIGJpdHMgKDAuLjE1KSAqLworCQkJCWxsW2krK10gPSBsID0gajsJLyogc2F2ZSBsYXN0IGxlbmd0aCBpbiBsICovCisJCQl9IGVsc2UgaWYgKGogPT0gMTYpIHsJLyogcmVwZWF0IGxhc3QgbGVuZ3RoIDMgdG8gNiB0aW1lcyAqLworCQkJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCAyKTsKKwkJCQlqID0gMyArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIDMpOworCQkJCWJfZHluYW1pYyA+Pj0gMjsKKwkJCQlrX2R5bmFtaWMgLT0gMjsKKwkJCQlpZiAoKHVuc2lnbmVkKSBpICsgaiA+IG4pIHsKKwkJCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsgLy9yZXR1cm4gMTsKKwkJCQl9CisJCQkJd2hpbGUgKGotLSkgeworCQkJCQlsbFtpKytdID0gbDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGogPT0gMTcpIHsJLyogMyB0byAxMCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworCQkJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCAzKTsKKwkJCQlqID0gMyArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIDcpOworCQkJCWJfZHluYW1pYyA+Pj0gMzsKKwkJCQlrX2R5bmFtaWMgLT0gMzsKKwkJCQlpZiAoKHVuc2lnbmVkKSBpICsgaiA+IG4pIHsKKwkJCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsgLy9yZXR1cm4gMTsKKwkJCQl9CisJCQkJd2hpbGUgKGotLSkgeworCQkJCQlsbFtpKytdID0gMDsKKwkJCQl9CisJCQkJbCA9IDA7CisJCQl9IGVsc2UgewkvKiBqID09IDE4OiAxMSB0byAxMzggemVybyBsZW5ndGggY29kZXMgKi8KKwkJCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgNyk7CisJCQkJaiA9IDExICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgMHg3Zik7CisJCQkJYl9keW5hbWljID4+PSA3OworCQkJCWtfZHluYW1pYyAtPSA3OworCQkJCWlmICgodW5zaWduZWQpIGkgKyBqID4gbikgeworCQkJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOyAvL3JldHVybiAxOworCQkJCX0KKwkJCQl3aGlsZSAoai0tKSB7CisJCQkJCWxsW2krK10gPSAwOworCQkJCX0KKwkJCQlsID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIGZyZWUgZGVjb2RpbmcgdGFibGUgZm9yIHRyZWVzICovCisJCWh1ZnRfZnJlZShpbmZsYXRlX2NvZGVzX3RsKTsKKworCQkvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworCQlndW56aXBfYmIgPSBiX2R5bmFtaWM7CisJCWd1bnppcF9iayA9IGtfZHluYW1pYzsKKworCQkvKiBidWlsZCB0aGUgZGVjb2RpbmcgdGFibGVzIGZvciBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZXMgKi8KKwkJYmwgPSBsYml0czsKKworCQlpID0gaHVmdF9idWlsZChsbCwgbmwsIDI1NywgY3BsZW5zLCBjcGxleHQsICZpbmZsYXRlX2NvZGVzX3RsLCAmYmwpOworCQlpZiAoaSAhPSAwKQorCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsKKwkJYmQgPSBkYml0czsKKwkJaSA9IGh1ZnRfYnVpbGQobGwgKyBubCwgbmQsIDAsIGNwZGlzdCwgY3BkZXh0LCAmaW5mbGF0ZV9jb2Rlc190ZCwgJmJkKTsKKwkJaWYgKGkgIT0gMCkKKwkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CisKKwkJLyogc2V0IHVwIGRhdGEgZm9yIGluZmxhdGVfY29kZXMoKSAqLworCQlpbmZsYXRlX2NvZGVzX3NldHVwKFBBU1NfU1RBVEUgYmwsIGJkKTsKKworCQkvKiBodWZ0X2ZyZWUgY29kZSBtb3ZlZCBpbnRvIGluZmxhdGVfY29kZXMgKi8KKworCQlyZXR1cm4gLTI7CisJfQorCWRlZmF1bHQ6CisJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CisJfQorfQorCisvKiBUd28gY2FsbHNpdGVzLCBib3RoIGluIGluZmxhdGVfZ2V0X25leHRfd2luZG93ICovCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfZ3VuemlwX2NyYyhTVEFURV9QQVJBTV9PTkxZKQoreworCWd1bnppcF9jcmMgPSBjcmMzMl9ibG9ja19lbmRpYW4wKGd1bnppcF9jcmMsIGd1bnppcF93aW5kb3csIGd1bnppcF9vdXRidWZfY291bnQsIGd1bnppcF9jcmNfdGFibGUpOworCWd1bnppcF9ieXRlc19vdXQgKz0gZ3VuemlwX291dGJ1Zl9jb3VudDsKK30KKworLyogT25lIGNhbGxzaXRlIGluIGluZmxhdGVfdW56aXBfaW50ZXJuYWwgKi8KK3N0YXRpYyBpbnQgaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3coU1RBVEVfUEFSQU1fT05MWSkKK3sKKwlndW56aXBfb3V0YnVmX2NvdW50ID0gMDsKKworCXdoaWxlICgxKSB7CisJCWludCByZXQ7CisKKwkJaWYgKG5lZWRfYW5vdGhlcl9ibG9jaykgeworCQkJaWYgKGVuZF9yZWFjaGVkKSB7CisJCQkJY2FsY3VsYXRlX2d1bnppcF9jcmMoUEFTU19TVEFURV9PTkxZKTsKKwkJCQllbmRfcmVhY2hlZCA9IDA7CisJCQkJLyogTkI6IG5lZWRfYW5vdGhlcl9ibG9jayBpcyBzdGlsbCBzZXQgKi8KKwkJCQlyZXR1cm4gMDsgLyogTGFzdCBibG9jayAqLworCQkJfQorCQkJbWV0aG9kID0gaW5mbGF0ZV9ibG9jayhQQVNTX1NUQVRFICZlbmRfcmVhY2hlZCk7CisJCQluZWVkX2Fub3RoZXJfYmxvY2sgPSAwOworCQl9CisKKwkJc3dpdGNoIChtZXRob2QpIHsKKwkJY2FzZSAtMToKKwkJCXJldCA9IGluZmxhdGVfc3RvcmVkKFBBU1NfU1RBVEVfT05MWSk7CisJCQlicmVhazsKKwkJY2FzZSAtMjoKKwkJCXJldCA9IGluZmxhdGVfY29kZXMoUEFTU19TVEFURV9PTkxZKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYW5ub3QgaGFwcGVuICovCisJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOworCQl9CisKKwkJaWYgKHJldCA9PSAxKSB7CisJCQljYWxjdWxhdGVfZ3VuemlwX2NyYyhQQVNTX1NUQVRFX09OTFkpOworCQkJcmV0dXJuIDE7IC8qIG1vcmUgZGF0YSBsZWZ0ICovCisJCX0KKwkJbmVlZF9hbm90aGVyX2Jsb2NrID0gMTsgLyogZW5kIG9mIHRoYXQgYmxvY2sgKi8KKwl9CisJLyogRG9lc250IGdldCBoZXJlICovCit9CisKKworLyogQ2FsbGVkIGZyb20gdW5wYWNrX2d6X3N0cmVhbSgpIGFuZCBpbmZsYXRlX3VuemlwKCkgKi8KK3N0YXRpYyBJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50CitpbmZsYXRlX3VuemlwX2ludGVybmFsKFNUQVRFX1BBUkFNIGludCBpbiwgaW50IG91dCkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IG4gPSAwOworCXNzaXplX3Qgbndyb3RlOworCisJLyogQWxsb2NhdGUgYWxsIGdsb2JhbCBidWZmZXJzIChmb3IgRFlOX0FMTE9DIG9wdGlvbikgKi8KKwlndW56aXBfd2luZG93ID0geG1hbGxvYyhHVU5aSVBfV1NJWkUpOworCWd1bnppcF9vdXRidWZfY291bnQgPSAwOworCWd1bnppcF9ieXRlc19vdXQgPSAwOworCWd1bnppcF9zcmNfZmQgPSBpbjsKKworCS8qIChyZSkgaW5pdGlhbGl6ZSBzdGF0ZSAqLworCW1ldGhvZCA9IC0xOworCW5lZWRfYW5vdGhlcl9ibG9jayA9IDE7CisJcmVzdW1lX2NvcHkgPSAwOworCWd1bnppcF9iayA9IDA7CisJZ3VuemlwX2JiID0gMDsKKworCS8qIENyZWF0ZSB0aGUgY3JjIHRhYmxlICovCisJZ3VuemlwX2NyY190YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKwlndW56aXBfY3JjID0gfjA7CisKKwllcnJvcl9tc2cgPSAiY29ycnVwdGVkIGRhdGEiOworCWlmIChzZXRqbXAoZXJyb3Jfam1wKSkgeworCQkvKiBFcnJvciBmcm9tIGRlZXAgaW5zaWRlIHppcCBtYWNoaW5lcnkgKi8KKwkJbiA9IC0xOworCQlnb3RvIHJldDsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgciA9IGluZmxhdGVfZ2V0X25leHRfd2luZG93KFBBU1NfU1RBVEVfT05MWSk7CisJCW53cm90ZSA9IGZ1bGxfd3JpdGUob3V0LCBndW56aXBfd2luZG93LCBndW56aXBfb3V0YnVmX2NvdW50KTsKKwkJaWYgKG53cm90ZSAhPSAoc3NpemVfdClndW56aXBfb3V0YnVmX2NvdW50KSB7CisJCQliYl9wZXJyb3JfbXNnKCJ3cml0ZSIpOworCQkJbiA9IC0xOworCQkJZ290byByZXQ7CisJCX0KKwkJSUZfREVTS1RPUChuICs9IG53cm90ZTspCisJCWlmIChyID09IDApIGJyZWFrOworCX0KKworCS8qIFN0b3JlIHVudXNlZCBieXRlcyBpbiBhIGdsb2JhbCBidWZmZXIgc28gY2FsbGluZyBhcHBsZXRzIGNhbiBhY2Nlc3MgaXQgKi8KKwlpZiAoZ3VuemlwX2JrID49IDgpIHsKKwkJLyogVW5kbyB0b28gbXVjaCBsb29rYWhlYWQuIFRoZSBuZXh0IHJlYWQgd2lsbCBiZSBieXRlIGFsaWduZWQKKwkJICogc28gd2UgY2FuIGRpc2NhcmQgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgbWVhbmluZ2Z1bCBieXRlLiAqLworCQlieXRlYnVmZmVyX29mZnNldC0tOworCQlieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSA9IGd1bnppcF9iYiAmIDB4ZmY7CisJCWd1bnppcF9iYiA+Pj0gODsKKwkJZ3VuemlwX2JrIC09IDg7CisJfQorIHJldDoKKwkvKiBDbGVhbnVwICovCisJZnJlZShndW56aXBfd2luZG93KTsKKwlmcmVlKGd1bnppcF9jcmNfdGFibGUpOworCXJldHVybiBuOworfQorCisKKy8qIEV4dGVybmFsIGVudHJ5IHBvaW50cyAqLworCisvKiBGb3IgdW56aXAgKi8KKworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK2luZmxhdGVfdW56aXAoaW5mbGF0ZV91bnppcF9yZXN1bHQgKnJlcywgb2ZmX3QgY29tcHJfc2l6ZSwgaW50IGluLCBpbnQgb3V0KQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgbjsKKwlERUNMQVJFX1NUQVRFOworCisJQUxMT0NfU1RBVEU7CisKKwl0b19yZWFkID0gY29tcHJfc2l6ZTsKKy8vCWJ5dGVidWZmZXJfbWF4ID0gMHg4MDAwOworCWJ5dGVidWZmZXJfb2Zmc2V0ID0gNDsKKwlieXRlYnVmZmVyID0geG1hbGxvYyhieXRlYnVmZmVyX21heCk7CisJbiA9IGluZmxhdGVfdW56aXBfaW50ZXJuYWwoUEFTU19TVEFURSBpbiwgb3V0KTsKKwlmcmVlKGJ5dGVidWZmZXIpOworCisJcmVzLT5jcmMgPSBndW56aXBfY3JjOworCXJlcy0+Ynl0ZXNfb3V0ID0gZ3VuemlwX2J5dGVzX291dDsKKwlERUFMTE9DX1NUQVRFOworCXJldHVybiBuOworfQorCisKKy8qIEZvciBndW56aXAgKi8KKworLyogaGVscGVycyBmaXJzdCAqLworCisvKiBUb3AgdXAgdGhlIGlucHV0IGJ1ZmZlciB3aXRoIGF0IGxlYXN0IG4gYnl0ZXMuICovCitzdGF0aWMgaW50IHRvcF91cChTVEFURV9QQVJBTSB1bnNpZ25lZCBuKQoreworCWludCBjb3VudCA9IGJ5dGVidWZmZXJfc2l6ZSAtIGJ5dGVidWZmZXJfb2Zmc2V0OworCisJaWYgKGNvdW50IDwgKGludCluKSB7CisJCW1lbW1vdmUoYnl0ZWJ1ZmZlciwgJmJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXRdLCBjb3VudCk7CisJCWJ5dGVidWZmZXJfb2Zmc2V0ID0gMDsKKwkJYnl0ZWJ1ZmZlcl9zaXplID0gZnVsbF9yZWFkKGd1bnppcF9zcmNfZmQsICZieXRlYnVmZmVyW2NvdW50XSwgYnl0ZWJ1ZmZlcl9tYXggLSBjb3VudCk7CisJCWlmICgoaW50KWJ5dGVidWZmZXJfc2l6ZSA8IDApIHsKKwkJCWJiX2Vycm9yX21zZyhiYl9tc2dfcmVhZF9lcnJvcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlieXRlYnVmZmVyX3NpemUgKz0gY291bnQ7CisJCWlmIChieXRlYnVmZmVyX3NpemUgPCBuKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdWludDE2X3QgYnVmZmVyX3JlYWRfbGVfdTE2KFNUQVRFX1BBUkFNX09OTFkpCit7CisJdWludDE2X3QgcmVzOworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKwltb3ZlX2Zyb21fdW5hbGlnbmVkMTYocmVzLCAmYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0pOworI2Vsc2UKKwlyZXMgPSBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XTsKKwlyZXMgfD0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCArIDFdIDw8IDg7CisjZW5kaWYKKwlieXRlYnVmZmVyX29mZnNldCArPSAyOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBidWZmZXJfcmVhZF9sZV91MzIoU1RBVEVfUEFSQU1fT05MWSkKK3sKKwl1aW50MzJfdCByZXM7CisjaWYgQkJfTElUVExFX0VORElBTgorCW1vdmVfZnJvbV91bmFsaWduZWQzMihyZXMsICZieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSk7CisjZWxzZQorCXJlcyA9IGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXRdOworCXJlcyB8PSBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0ICsgMV0gPDwgODsKKwlyZXMgfD0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCArIDJdIDw8IDE2OworCXJlcyB8PSBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0ICsgM10gPDwgMjQ7CisjZW5kaWYKKwlieXRlYnVmZmVyX29mZnNldCArPSA0OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaGVhZGVyX2d6aXAoU1RBVEVfUEFSQU0gdW5wYWNrX2luZm9fdCAqaW5mbykKK3sKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgcmF3WzhdOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBnel9tZXRob2Q7CisJCQl1aW50OF90IGZsYWdzOworCQkJdWludDMyX3QgbXRpbWU7CisJCQl1aW50OF90IHh0cmFfZmxhZ3NfVU5VU0VEOworCQkJdWludDhfdCBvc19mbGFnc19VTlVTRUQ7CisJCX0gUEFDS0VEIGZvcm1hdHRlZDsKKwl9IGhlYWRlcjsKKwlzdHJ1Y3QgQlVHX2hlYWRlciB7CisJCWNoYXIgQlVHX2hlYWRlcltzaXplb2YoaGVhZGVyKSA9PSA4ID8gMSA6IC0xXTsKKwl9OworCisJLyoKKwkgKiBSZXdpbmQgYnl0ZWJ1ZmZlci4gV2UgdXNlIHRoZSBiZWdpbm5pbmcgYmVjYXVzZSB0aGUgaGVhZGVyIGhhcyA4CisJICogYnl0ZXMsIGxlYXZpbmcgZW5vdWdoIGZvciB1bndpbmRpbmcgYWZ0ZXJ3YXJkcy4KKwkgKi8KKwlieXRlYnVmZmVyX3NpemUgLT0gYnl0ZWJ1ZmZlcl9vZmZzZXQ7CisJbWVtbW92ZShieXRlYnVmZmVyLCAmYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0sIGJ5dGVidWZmZXJfc2l6ZSk7CisJYnl0ZWJ1ZmZlcl9vZmZzZXQgPSAwOworCisJaWYgKCF0b3BfdXAoUEFTU19TVEFURSA4KSkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGhlYWRlci5yYXcsICZieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSwgOCk7CisJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gODsKKworCS8qIENoZWNrIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgKi8KKwlpZiAoaGVhZGVyLmZvcm1hdHRlZC5nel9tZXRob2QgIT0gOCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaGVhZGVyLmZvcm1hdHRlZC5mbGFncyAmIDB4MDQpIHsKKwkJLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisJCXVuc2lnbmVkIGV4dHJhX3Nob3J0OworCisJCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMikpCisJCQlyZXR1cm4gMDsKKwkJZXh0cmFfc2hvcnQgPSBidWZmZXJfcmVhZF9sZV91MTYoUEFTU19TVEFURV9PTkxZKTsKKwkJaWYgKCF0b3BfdXAoUEFTU19TVEFURSBleHRyYV9zaG9ydCkpCisJCQlyZXR1cm4gMDsKKwkJLyogSWdub3JlIGV4dHJhIGZpZWxkICovCisJCWJ5dGVidWZmZXJfb2Zmc2V0ICs9IGV4dHJhX3Nob3J0OworCX0KKworCS8qIERpc2NhcmQgb3JpZ2luYWwgbmFtZSBhbmQgZmlsZSBjb21tZW50IGlmIGFueSAqLworCS8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKwkvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisJaWYgKGhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJiAweDE4KSB7CisJCXdoaWxlICgxKSB7CisJCQlkbyB7CisJCQkJaWYgKCF0b3BfdXAoUEFTU19TVEFURSAxKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9IHdoaWxlIChieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0KytdICE9IDApOworCQkJaWYgKChoZWFkZXIuZm9ybWF0dGVkLmZsYWdzICYgMHgxOCkgIT0gMHgxOCkKKwkJCQlicmVhazsKKwkJCWhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJj0gfjB4MTg7CisJCX0KKwl9CisKKwlpZiAoaW5mbykKKwkJaW5mby0+bXRpbWUgPSBTV0FQX0xFMzIoaGVhZGVyLmZvcm1hdHRlZC5tdGltZSk7CisKKwkvKiBSZWFkIHRoZSBoZWFkZXIgY2hlY2tzdW0gKi8KKwlpZiAoaGVhZGVyLmZvcm1hdHRlZC5mbGFncyAmIDB4MDIpIHsKKwkJaWYgKCF0b3BfdXAoUEFTU19TVEFURSAyKSkKKwkJCXJldHVybiAwOworCQlieXRlYnVmZmVyX29mZnNldCArPSAyOworCX0KKwlyZXR1cm4gMTsKK30KKworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK3VucGFja19nel9zdHJlYW1fd2l0aF9pbmZvKGludCBpbiwgaW50IG91dCwgdW5wYWNrX2luZm9fdCAqaW5mbykKK3sKKwl1aW50MzJfdCB2MzI7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBuOworCURFQ0xBUkVfU1RBVEU7CisKKwluID0gMDsKKworCUFMTE9DX1NUQVRFOworCXRvX3JlYWQgPSAtMTsKKy8vCWJ5dGVidWZmZXJfbWF4ID0gMHg4MDAwOworCWJ5dGVidWZmZXIgPSB4bWFsbG9jKGJ5dGVidWZmZXJfbWF4KTsKKwlndW56aXBfc3JjX2ZkID0gaW47CisKKyBhZ2FpbjoKKwlpZiAoIWNoZWNrX2hlYWRlcl9nemlwKFBBU1NfU1RBVEUgaW5mbykpIHsKKwkJYmJfZXJyb3JfbXNnKCJjb3JydXB0ZWQgZGF0YSIpOworCQluID0gLTE7CisJCWdvdG8gcmV0OworCX0KKwluICs9IGluZmxhdGVfdW56aXBfaW50ZXJuYWwoUEFTU19TVEFURSBpbiwgb3V0KTsKKwlpZiAobiA8IDApCisJCWdvdG8gcmV0OworCisJaWYgKCF0b3BfdXAoUEFTU19TVEFURSA4KSkgeworCQliYl9lcnJvcl9tc2coImNvcnJ1cHRlZCBkYXRhIik7CisJCW4gPSAtMTsKKwkJZ290byByZXQ7CisJfQorCisJLyogVmFsaWRhdGUgZGVjb21wcmVzc2lvbiAtIGNyYyAqLworCXYzMiA9IGJ1ZmZlcl9yZWFkX2xlX3UzMihQQVNTX1NUQVRFX09OTFkpOworCWlmICgofmd1bnppcF9jcmMpICE9IHYzMikgeworCQliYl9lcnJvcl9tc2coImNyYyBlcnJvciIpOworCQluID0gLTE7CisJCWdvdG8gcmV0OworCX0KKworCS8qIFZhbGlkYXRlIGRlY29tcHJlc3Npb24gLSBzaXplICovCisJdjMyID0gYnVmZmVyX3JlYWRfbGVfdTMyKFBBU1NfU1RBVEVfT05MWSk7CisJaWYgKCh1aW50MzJfdClndW56aXBfYnl0ZXNfb3V0ICE9IHYzMikgeworCQliYl9lcnJvcl9tc2coImluY29ycmVjdCBsZW5ndGgiKTsKKwkJbiA9IC0xOworCX0KKworCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMikpCisJCWdvdG8gcmV0OyAvKiBFT0YgKi8KKworCWlmIChieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSA9PSAweDFmCisJICYmIGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXQgKyAxXSA9PSAweDhiCisJKSB7CisJCWJ5dGVidWZmZXJfb2Zmc2V0ICs9IDI7CisJCWdvdG8gYWdhaW47CisJfQorCS8qIEdOVSBnemlwIHNheXM6ICovCisJLypiYl9lcnJvcl9tc2coImRlY29tcHJlc3Npb24gT0ssIHRyYWlsaW5nIGdhcmJhZ2UgaWdub3JlZCIpOyovCisKKyByZXQ6CisJZnJlZShieXRlYnVmZmVyKTsKKwlERUFMTE9DX1NUQVRFOworCXJldHVybiBuOworfQorCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQwordW5wYWNrX2d6X3N0cmVhbShpbnQgaW4sIGludCBvdXQpCit7CisJcmV0dXJuIHVucGFja19nel9zdHJlYW1fd2l0aF9pbmZvKGluLCBvdXQsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2FsbC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfYWxsLmMKQEAgLTAsMCArMSwxNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyogQWNjZXB0IGFueSBub24tbnVsbCBuYW1lLCBpdHMgbm90IHJlYWxseSBhIGZpbHRlciBhdCBhbGwgKi8KK2NoYXIgRkFTVF9GVU5DIGZpbHRlcl9hY2NlcHRfYWxsKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWlmIChhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9saXN0LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjQwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfbGlzdC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qCisgKiBBY2NlcHQgbmFtZXMgdGhhdCBhcmUgaW4gdGhlIGFjY2VwdCBsaXN0LCBpZ25vcmluZyByZWplY3QgbGlzdC4KKyAqLworY2hhciBGQVNUX0ZVTkMgZmlsdGVyX2FjY2VwdF9saXN0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWlmIChmaW5kX2xpc3RfZW50cnkoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKSkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24uYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9saXN0X3JlYXNzaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9saXN0X3JlYXNzaWduLmMKQEAgLTAsMCArMSw1MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKKy8qIEJ1aWx0IGFuZCB1c2VkIG9ubHkgaWYgRU5BQkxFX0RQS0cgfHwgRU5BQkxFX0RQS0dfREVCICovCisKKy8qCisgKiBSZWFzc2lnbiB0aGUgc3ViYXJjaGl2ZSBtZXRhZGF0YSBwYXJzZXIgYmFzZWQgb24gdGhlIGZpbGVuYW1lIGV4dGVuc2lvbgorICogZS5nLiBpZiBpdHMgYSAudGFyLmd6IG1vZGlmeSBhcmNoaXZlX2hhbmRsZS0+c3ViX2FyY2hpdmUgdG8gcHJvY2VzcyBhIC50YXIuZ3oKKyAqIG9yIGlmIGl0cyBhIC50YXIuYnoyIG1ha2UgYXJjaGl2ZV9oYW5kbGUtPnN1Yl9hcmNoaXZlIGhhbmRsZSB0aGF0CisgKi8KK2NoYXIgRkFTVF9GVU5DIGZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwkvKiBDaGVjayB0aGUgZmlsZSBlbnRyeSBpcyBpbiB0aGUgYWNjZXB0IGxpc3QgKi8KKwlpZiAoZmluZF9saXN0X2VudHJ5KGFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsIGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSkpIHsKKwkJY29uc3QgY2hhciAqbmFtZV9wdHI7CisKKwkJLyogRmluZCBleHRlbnNpb24gKi8KKwkJbmFtZV9wdHIgPSBzdHJyY2hyKGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSwgJy4nKTsKKwkJaWYgKCFuYW1lX3B0cikKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCW5hbWVfcHRyKys7CisKKwkJLyogTW9kaWZ5IHRoZSBzdWJhcmNoaXZlIGhhbmRsZXIgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiAqLworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgImd6IikgPT0gMAorCQkpIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19hY3Rpb25fZGF0YV9zdWJhcmNoaXZlID0gZ2V0X2hlYWRlcl90YXJfZ3o7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgImJ6MiIpID09IDAKKwkJKSB7CisJCQlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZSA9IGdldF9oZWFkZXJfdGFyX2J6MjsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgImx6bWEiKSA9PSAwCisJCSkgeworCQkJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2FjdGlvbl9kYXRhX3N1YmFyY2hpdmUgPSBnZXRfaGVhZGVyX3Rhcl9sem1hOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTg2Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0LmMKQEAgLTAsMCArMSwzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyoKKyAqIEFjY2VwdCBuYW1lcyB0aGF0IGFyZSBpbiB0aGUgYWNjZXB0IGxpc3QgYW5kIG5vdCBpbiB0aGUgcmVqZWN0IGxpc3QKKyAqLworY2hhciBGQVNUX0ZVTkMgZmlsdGVyX2FjY2VwdF9yZWplY3RfbGlzdChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwljb25zdCBjaGFyICprZXk7CisJY29uc3QgbGxpc3RfdCAqcmVqZWN0X2VudHJ5OworCWNvbnN0IGxsaXN0X3QgKmFjY2VwdF9lbnRyeTsKKworCWtleSA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZTsKKworCS8qIElmIHRoZSBrZXkgaXMgaW4gYSByZWplY3QgbGlzdCBmYWlsICovCisJcmVqZWN0X2VudHJ5ID0gZmluZF9saXN0X2VudHJ5MihhcmNoaXZlX2hhbmRsZS0+cmVqZWN0LCBrZXkpOworCWlmIChyZWplY3RfZW50cnkpIHsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJYWNjZXB0X2VudHJ5ID0gZmluZF9saXN0X2VudHJ5MihhcmNoaXZlX2hhbmRsZS0+YWNjZXB0LCBrZXkpOworCisJLyogRmFpbCBpZiBhbiBhY2NlcHQgbGlzdCB3YXMgc3BlY2lmaWVkIGFuZCB0aGUga2V5IHdhc250IGluIHRoZXJlICovCisJaWYgKChhY2NlcHRfZW50cnkgPT0gTlVMTCkgJiYgYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCkgeworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIEFjY2VwdGVkICovCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmluZF9saXN0X2VudHJ5LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbmRfbGlzdF9lbnRyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmQxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbmRfbGlzdF9lbnRyeS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisvKiBGaW5kIGEgc3RyaW5nIGluIGEgc2hlbGwgcGF0dGVybiBsaXN0ICovCitjb25zdCBsbGlzdF90KiBGQVNUX0ZVTkMgZmluZF9saXN0X2VudHJ5KGNvbnN0IGxsaXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXdoaWxlIChsaXN0KSB7CisJCWlmIChmbm1hdGNoKGxpc3QtPmRhdGEsIGZpbGVuYW1lLCAwKSA9PSAwKSB7CisJCQlyZXR1cm4gbGlzdDsKKwkJfQorCQlsaXN0ID0gbGlzdC0+bGluazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNhbWUsIGJ1dCBjb21wYXJlcyBvbmx5IHBhdGggY29tcG9uZW50cyBwcmVzZW50IGluIHBhdHRlcm4KKyAqIChleHRyYSB0cmFpbGluZyBwYXRoIGNvbXBvbmVudHMgaW4gZmlsZW5hbWUgYXJlIGFzc3VtZWQgdG8gbWF0Y2gpCisgKi8KK2NvbnN0IGxsaXN0X3QqIEZBU1RfRlVOQyBmaW5kX2xpc3RfZW50cnkyKGNvbnN0IGxsaXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgYnVmW1BBVEhfTUFYXTsKKwlpbnQgcGF0dGVybl9zbGFzaF9jbnQ7CisJY29uc3QgY2hhciAqYzsKKwljaGFyICpkOworCisJd2hpbGUgKGxpc3QpIHsKKwkJYyA9IGxpc3QtPmRhdGE7CisJCXBhdHRlcm5fc2xhc2hfY250ID0gMDsKKwkJd2hpbGUgKCpjKQorCQkJaWYgKCpjKysgPT0gJy8nKSBwYXR0ZXJuX3NsYXNoX2NudCsrOworCQljID0gZmlsZW5hbWU7CisJCWQgPSBidWY7CisJCS8qIHBhcmFub2lhIGlzIGJldHRlciB0aGFuIGJ1ZmZlciBvdmVyZmxvd3MgKi8KKwkJd2hpbGUgKCpjICYmIGQgIT0gYnVmICsgc2l6ZW9mKGJ1ZiktMSkgeworCQkJaWYgKCpjID09ICcvJyAmJiAtLXBhdHRlcm5fc2xhc2hfY250IDwgMCkKKwkJCQlicmVhazsKKwkJCSpkKysgPSAqYysrOworCQl9CisJCSpkID0gJ1wwJzsKKwkJaWYgKGZubWF0Y2gobGlzdC0+ZGF0YSwgYnVmLCAwKSA9PSAwKSB7CisJCQlyZXR1cm4gbGlzdDsKKwkJfQorCQlsaXN0ID0gbGlzdC0+bGluazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfYXIuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl9hci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjAzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfYXIuYwpAQCAtMCwwICsxLDEzMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgMjAwMSBHbGVubiBNY0dyYXRoLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2luY2x1ZGUgImFyLmgiCisKK3N0YXRpYyB1bnNpZ25lZCByZWFkX251bShjb25zdCBjaGFyICpzdHIsIGludCBiYXNlKQoreworCS8qIFRoaXMgY29kZSB3b3JrcyBiZWNhdXNlCisJICogb24gbWlzZm9ybWF0dGVkIG51bWJlcnMgYmJfc3RydG91IHJldHVybnMgYWxsLW9uZXMgKi8KKwlpbnQgZXJyID0gYmJfc3RydG91KHN0ciwgTlVMTCwgYmFzZSk7CisJaWYgKGVyciA9PSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgYXIgaGVhZGVyIik7CisJcmV0dXJuIGVycjsKK30KKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl9hcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlmaWxlX2hlYWRlcl90ICp0eXBlZCA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlcjsKKwl1bnNpZ25lZCBzaXplOworCXVuaW9uIHsKKwkJY2hhciByYXdbNjBdOworCQlzdHJ1Y3QgYXJfaGVhZGVyIGZvcm1hdHRlZDsKKwl9IGFyOworI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTCisJc3RhdGljIGNoYXIgKmFyX2xvbmdfbmFtZXM7CisJc3RhdGljIHVuc2lnbmVkIGFyX2xvbmdfbmFtZV9zaXplOworI2VuZGlmCisKKwkvKiBkb250IHVzZSB4cmVhZCBhcyB3ZSB3YW50IHRvIGhhbmRsZSB0aGUgZXJyb3Igb3Vyc2VsZiAqLworCWlmIChyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyLnJhdywgNjApICE9IDYwKSB7CisJCS8qIEVuZCBPZiBGaWxlICovCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJLyogYXIgaGVhZGVyIHN0YXJ0cyBvbiBhbiBldmVuIGJ5dGUgKDIgYnl0ZSBhbGlnbmVkKQorCSAqICdcbicgaXMgdXNlZCBmb3IgcGFkZGluZworCSAqLworCWlmIChhci5yYXdbMF0gPT0gJ1xuJykgeworCQkvKiBmaXggdXAgdGhlIGhlYWRlciwgd2Ugc3RhcnRlZCByZWFkaW5nIDEgYnl0ZSB0b28gZWFybHkgKi8KKwkJbWVtbW92ZShhci5yYXcsICZhci5yYXdbMV0sIDU5KTsKKwkJYXIucmF3WzU5XSA9IHhyZWFkX2NoYXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCk7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQrKzsKKwl9CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSA2MDsKKworCWlmIChhci5mb3JtYXR0ZWQubWFnaWNbMF0gIT0gJ2AnIHx8IGFyLmZvcm1hdHRlZC5tYWdpY1sxXSAhPSAnXG4nKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBhciBoZWFkZXIiKTsKKworCS8qIEZJWE1FOiBtb3JlIHRob3JvdWdoIHJvdXRpbmUgd291bGQgYmUgaW4gb3JkZXIgaGVyZQorCSAqICh3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIHRoYXQgaW4gdGFyKQorCSAqIGJ1dCBmb3Igbm93IHdlIGFyZSBsYXguICovCisJYXIuZm9ybWF0dGVkLm1hZ2ljWzBdID0gJ1wwJzsgLyogZWxzZSA0Ry0yIGZpbGUgd2lsbCBoYXZlIHNpemU9IjQyOTQ5NjcyOTRgXG4uLi4iICovCisJdHlwZWQtPnNpemUgPSBzaXplID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLnNpemUsIDEwKTsKKworCS8qIHNwZWNpYWwgZmlsZW5hbWVzIGhhdmUgJy8nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKi8KKwlpZiAoYXIuZm9ybWF0dGVkLm5hbWVbMF0gPT0gJy8nKSB7CisJCWlmIChhci5mb3JtYXR0ZWQubmFtZVsxXSA9PSAnICcpIHsKKwkJCS8qIFRoaXMgaXMgdGhlIGluZGV4IG9mIHN5bWJvbHMgaW4gdGhlIGZpbGUgZm9yIGNvbXBpbGVycyAqLworCQkJZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlKTsKKwkJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gc2l6ZTsKKwkJCXJldHVybiBnZXRfaGVhZGVyX2FyKGFyY2hpdmVfaGFuZGxlKTsgLyogUmV0dXJuIG5leHQgaGVhZGVyICovCisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUworCQlpZiAoYXIuZm9ybWF0dGVkLm5hbWVbMV0gPT0gJy8nKSB7CisJCQkvKiBJZiB0aGUgc2Vjb25kIGNoYXIgaXMgYSAnLycgdGhlbiB0aGlzIGVudHJpZXMgZGF0YSBzZWN0aW9uCisJCQkgKiBzdG9yZXMgbG9uZyBmaWxlbmFtZSBmb3IgbXVsdGlwbGUgZW50cmllcywgdGhleSBhcmUgc3RvcmVkCisJCQkgKiBpbiBzdGF0aWMgdmFyaWFibGUgbG9uZ19uYW1lcyBmb3IgdXNlIGluIGZ1dHVyZSBlbnRyaWVzCisJCQkgKi8KKwkJCWFyX2xvbmdfbmFtZV9zaXplID0gc2l6ZTsKKwkJCWZyZWUoYXJfbG9uZ19uYW1lcyk7CisJCQlhcl9sb25nX25hbWVzID0geG1hbGxvYyhzaXplKTsKKwkJCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyX2xvbmdfbmFtZXMsIHNpemUpOworCQkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBzaXplOworCQkJLyogUmV0dXJuIG5leHQgaGVhZGVyICovCisJCQlyZXR1cm4gZ2V0X2hlYWRlcl9hcihhcmNoaXZlX2hhbmRsZSk7CisJCX0KKyNlbHNlCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJsb25nIGZpbGVuYW1lcyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKwl9CisJLyogT25seSBzaXplIGlzIGFsd2F5cyBwcmVzZW50LCB0aGUgcmVzdCBtYXkgYmUgbWlzc2luZyBpbgorCSAqIGxvbmcgZmlsZW5hbWUgcHNldWRvIGZpbGUuIFRodXMgd2UgZGVjb2RlIHRoZSByZXN0CisJICogYWZ0ZXIgZGVhbGluZyB3aXRoIGxvbmcgZmlsZW5hbWUgcHNldWRvIGZpbGUuCisJICovCisJdHlwZWQtPm1vZGUgPSByZWFkX251bShhci5mb3JtYXR0ZWQubW9kZSwgOCk7CisJdHlwZWQtPm10aW1lID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLmRhdGUsIDEwKTsKKwl0eXBlZC0+dWlkID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLnVpZCwgMTApOworCXR5cGVkLT5naWQgPSByZWFkX251bShhci5mb3JtYXR0ZWQuZ2lkLCAxMCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUworCWlmIChhci5mb3JtYXR0ZWQubmFtZVswXSA9PSAnLycpIHsKKwkJdW5zaWduZWQgbG9uZ19vZmZzZXQ7CisKKwkJLyogVGhlIG51bWJlciBhZnRlciB0aGUgJy8nIGluZGljYXRlcyB0aGUgb2Zmc2V0IGluIHRoZSBhciBkYXRhIHNlY3Rpb24KKwkJICogKHNhdmVkIGluIGFyX2xvbmdfbmFtZXMpIHRoYXQgY29uYXRhaW5zIHRoZSByZWFsIGZpbGVuYW1lICovCisJCWxvbmdfb2Zmc2V0ID0gcmVhZF9udW0oJmFyLmZvcm1hdHRlZC5uYW1lWzFdLCAxMCk7CisJCWlmIChsb25nX29mZnNldCA+PSBhcl9sb25nX25hbWVfc2l6ZSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlc29sdmUgbG9uZyBmaWxlbmFtZSIpOworCQl9CisJCXR5cGVkLT5uYW1lID0geHN0cmR1cChhcl9sb25nX25hbWVzICsgbG9uZ19vZmZzZXQpOworCX0gZWxzZQorI2VuZGlmCisJeworCQkvKiBzaG9ydCBmaWxlbmFtZXMgKi8KKwkJdHlwZWQtPm5hbWUgPSB4c3RybmR1cChhci5mb3JtYXR0ZWQubmFtZSwgMTYpOworCX0KKworCXR5cGVkLT5uYW1lW3N0cmNzcG4odHlwZWQtPm5hbWUsICIgLyIpXSA9ICdcMCc7CisKKwlpZiAoYXJjaGl2ZV9oYW5kbGUtPmZpbHRlcihhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyKHR5cGVkKTsKKyNpZiBFTkFCTEVfRFBLRyB8fCBFTkFCTEVfRFBLR19ERUIKKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZSkgeworCQkJd2hpbGUgKGFyY2hpdmVfaGFuZGxlLT5kcGtnX19hY3Rpb25fZGF0YV9zdWJhcmNoaXZlKGFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZSkgPT0gRVhJVF9TVUNDRVNTKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UKKyNlbmRpZgorCQkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhKGFyY2hpdmVfaGFuZGxlKTsKKwl9IGVsc2UgeworCQlkYXRhX3NraXAoYXJjaGl2ZV9oYW5kbGUpOworCX0KKworCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gdHlwZWQtPnNpemU7CisJLyogU2V0IHRoZSBmaWxlIHBvaW50ZXIgdG8gdGhlIGNvcnJlY3Qgc3BvdCwgd2UgbWF5IGhhdmUgYmVlbiByZWFkaW5nIGEgY29tcHJlc3NlZCBmaWxlICovCisJbHNlZWsoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCwgU0VFS19TRVQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl9jcGlvLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfY3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTliNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfY3Bpby5jCkBAIC0wLDAgKzEsMTg2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIENvcHlyaWdodCAyMDAyIExhdXJlbmNlIEFuZGVyc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3R5cGVkZWYgc3RydWN0IGhhcmRsaW5rc190IHsKKwlzdHJ1Y3QgaGFyZGxpbmtzX3QgKm5leHQ7CisJaW50IGlub2RlOyAvKiBUT0RPOiBtdXN0IG1hdGNoIG1hai9taW4gdG9vISAqLworCWludCBtb2RlIDsKKwlpbnQgbXRpbWU7IC8qIFRoZXNlIHRocmVlIGFyZSB1c2VmdWwgb25seSBpbiBjb3JuZXIgY2FzZSAqLworCWludCB1aWQgIDsgLyogb2YgaGFyZGxpbmtzIHdpdGggemVybyBzaXplIGJvZHkgKi8KKwlpbnQgZ2lkICA7CisJY2hhciBuYW1lWzFdOworfSBoYXJkbGlua3NfdDsKKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl9jcGlvKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyOworCWNoYXIgY3Bpb19oZWFkZXJbMTEwXTsKKwlpbnQgbmFtZXNpemU7CisJaW50IG1ham9yLCBtaW5vciwgbmxpbmssIG1vZGUsIGlub2RlOworCXVuc2lnbmVkIHNpemUsIHVpZCwgZ2lkLCBtdGltZTsKKworCS8qIFRoZXJlIGNhbiBiZSBwYWRkaW5nIGJlZm9yZSBhcmNoaXZlIGhlYWRlciAqLworCWRhdGFfYWxpZ24oYXJjaGl2ZV9oYW5kbGUsIDQpOworCisJc2l6ZSA9IGZ1bGxfcmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBjcGlvX2hlYWRlciwgMTEwKTsKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCWdvdG8gY3JlYXRlX2hhcmRsaW5rczsKKwl9CisJaWYgKHNpemUgIT0gMTEwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzaG9ydCByZWFkIik7CisJfQorCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gMTEwOworCisJaWYgKHN0cm5jbXAoJmNwaW9faGVhZGVyWzBdLCAiMDcwNzAiLCA1KSAhPSAwCisJIHx8IChjcGlvX2hlYWRlcls1XSAhPSAnMScgJiYgY3Bpb19oZWFkZXJbNV0gIT0gJzInKQorCSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5zdXBwb3J0ZWQgY3BpbyBmb3JtYXQsIHVzZSBuZXdjIG9yIGNyYyIpOworCX0KKworCWlmIChzc2NhbmYoY3Bpb19oZWFkZXIgKyA2LAorCQkJIiU4eCIgIiU4eCIgIiU4eCIgIiU4eCIKKwkJCSIlOHgiICIlOHgiICIlOHgiIC8qbWFqLG1pbjoqLyAiJSoxNmMiCisJCQkvKnJtYWoscm1pbjoqLyIlOHgiICIlOHgiICIlOHgiIC8qY2hrc3VtOiAiJSo4YyIqLywKKwkJCSZpbm9kZSwgJm1vZGUsICZ1aWQsICZnaWQsCisJCQkmbmxpbmssICZtdGltZSwgJnNpemUsCisJCQkmbWFqb3IsICZtaW5vciwgJm5hbWVzaXplKSAhPSAxMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImRhbWFnZWQgY3BpbyBmaWxlIik7CisJZmlsZV9oZWFkZXItPm1vZGUgPSBtb2RlOworCWZpbGVfaGVhZGVyLT51aWQgPSB1aWQ7CisJZmlsZV9oZWFkZXItPmdpZCA9IGdpZDsKKwlmaWxlX2hlYWRlci0+bXRpbWUgPSBtdGltZTsKKwlmaWxlX2hlYWRlci0+c2l6ZSA9IHNpemU7CisKKwluYW1lc2l6ZSAmPSAweDFmZmY7IC8qIHBhcmFub2lhOiBsaW1pdCBuYW1lcyB0byA4ayBjaGFycyAqLworCWZpbGVfaGVhZGVyLT5uYW1lID0geHphbGxvYyhuYW1lc2l6ZSArIDEpOworCS8qIFJlYWQgaW4gZmlsZW5hbWUgKi8KKwl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBmaWxlX2hlYWRlci0+bmFtZSwgbmFtZXNpemUpOworCWlmIChmaWxlX2hlYWRlci0+bmFtZVswXSA9PSAnLycpIHsKKwkJLyogVGVzdGNhc2U6IGVjaG8gL2V0Yy9ob3N0cyB8IGNwaW8gLXB2ZCAvdG1wCisJCSAqIFdpdGhvdXQgdGhpcyBjb2RlLCBpdCB0cmllcyB0byB1bnBhY2sgL2V0Yy9ob3N0cworCQkgKiBpbnRvICIvZXRjL2hvc3RzIiwgbm90ICJldGMvaG9zdHMiLgorCQkgKi8KKwkJY2hhciAqcCA9IGZpbGVfaGVhZGVyLT5uYW1lOworCQlkbyBwKys7IHdoaWxlICgqcCA9PSAnLycpOworCQlvdmVybGFwcGluZ19zdHJjcHkoZmlsZV9oZWFkZXItPm5hbWUsIHApOworCX0KKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IG5hbWVzaXplOworCisJLyogVXBkYXRlIG9mZnNldCBhbW91bnQgYW5kIHNraXAgcGFkZGluZyBiZWZvcmUgZmlsZSBjb250ZW50cyAqLworCWRhdGFfYWxpZ24oYXJjaGl2ZV9oYW5kbGUsIDQpOworCisJaWYgKHN0cmNtcChmaWxlX2hlYWRlci0+bmFtZSwgIlRSQUlMRVIhISEiKSA9PSAwKSB7CisJCS8qIEFsd2F5cyByb3VuZCB1cC4gIj4+IDkiIGRpdmlkZXMgYnkgNTEyICovCisJCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19ibG9ja3MgPSAodW9mZl90KShhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICsgNTExKSA+PiA5OworCQlnb3RvIGNyZWF0ZV9oYXJkbGlua3M7CisJfQorCisJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID0gTlVMTDsKKwlpZiAoU19JU0xOSyhmaWxlX2hlYWRlci0+bW9kZSkpIHsKKwkJZmlsZV9oZWFkZXItPnNpemUgJj0gMHgxZmZmOyAvKiBwYXJhbm9pYTogbGltaXQgbmFtZXMgdG8gOGsgY2hhcnMgKi8KKwkJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID0geHphbGxvYyhmaWxlX2hlYWRlci0+c2l6ZSArIDEpOworCQl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBmaWxlX2hlYWRlci0+bGlua190YXJnZXQsIGZpbGVfaGVhZGVyLT5zaXplKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBmaWxlX2hlYWRlci0+c2l6ZTsKKwkJZmlsZV9oZWFkZXItPnNpemUgPSAwOyAvKiBTdG9wIHBvc3NpYmxlIHNlZWtzIGluIGZ1dHVyZSAqLworCX0KKworLy8gVE9ETzogZGF0YV9leHRyYWN0X2FsbCBjYW4ndCBkZWFsIHdpdGggaGFyZGxpbmtzIHRvIG5vbi1maWxlcy4uLgorLy8gd2hlbiBmaXhlZCwgY2hhbmdlIFNfSVNSRUcgdG8gIVNfSVNESVIgaGVyZQorCisJaWYgKG5saW5rID4gMSAmJiBTX0lTUkVHKGZpbGVfaGVhZGVyLT5tb2RlKSkgeworCQloYXJkbGlua3NfdCAqbmV3ID0geG1hbGxvYyhzaXplb2YoKm5ldykgKyBuYW1lc2l6ZSk7CisJCW5ldy0+aW5vZGUgPSBpbm9kZTsKKwkJbmV3LT5tb2RlICA9IG1vZGUgOworCQluZXctPm10aW1lID0gbXRpbWU7CisJCW5ldy0+dWlkICAgPSB1aWQgIDsKKwkJbmV3LT5naWQgICA9IGdpZCAgOworCQlzdHJjcHkobmV3LT5uYW1lLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCS8qIFB1dCBmaWxlIG9uIGEgbGlua2VkIGxpc3QgZm9yIGxhdGVyICovCisJCWlmIChzaXplID09IDApIHsKKwkJCW5ldy0+bmV4dCA9IGFyY2hpdmVfaGFuZGxlLT5jcGlvX19oYXJkbGlua3NfdG9fY3JlYXRlOworCQkJYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2hhcmRsaW5rc190b19jcmVhdGUgPSBuZXc7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOyAvKiBTa2lwIHRoaXMgb25lICovCisJCQkvKiBUT0RPOiB0aGlzIGJyZWFrcyBjcGlvIC10IChpdCBkb2VzIG5vdCBzaG93IGhhcmRsaW5rcykgKi8KKwkJfQorCQluZXctPm5leHQgPSBhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3M7CisJCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19jcmVhdGVkX2hhcmRsaW5rcyA9IG5ldzsKKwl9CisJZmlsZV9oZWFkZXItPmRldmljZSA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKKworCWlmIChhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhKGFyY2hpdmVfaGFuZGxlKTsKKy8vVE9ETzogcnVuICJlY2hvIC9ldGMvaG9zdHMgfCBjcGlvIC1wdiAvdG1wIiB0d2ljZS4gT24gMm5kIHJ1bjoKKy8vY3BpbzogZXRjL2hvc3RzIG5vdCBjcmVhdGVkOiBuZXdlciBvciBzYW1lIGFnZSBmaWxlIGV4aXN0cworLy9ldGMvaG9zdHMgIDwtLSBzaG91bGQgTk9UIHNob3cgaXQKKy8vMiBibG9ja3MgPC0tIHNob3VsZCBzYXkgIjAgYmxvY2tzIgorCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlcihmaWxlX2hlYWRlcik7CisJfSBlbHNlIHsKKwkJZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlKTsKKwl9CisKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IGZpbGVfaGVhZGVyLT5zaXplOworCisJZnJlZShmaWxlX2hlYWRlci0+bGlua190YXJnZXQpOworCWZyZWUoZmlsZV9oZWFkZXItPm5hbWUpOworCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IE5VTEw7CisJZmlsZV9oZWFkZXItPm5hbWUgPSBOVUxMOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKworIGNyZWF0ZV9oYXJkbGlua3M6CisJZnJlZShmaWxlX2hlYWRlci0+bGlua190YXJnZXQpOworCWZyZWUoZmlsZV9oZWFkZXItPm5hbWUpOworCisJd2hpbGUgKGFyY2hpdmVfaGFuZGxlLT5jcGlvX19oYXJkbGlua3NfdG9fY3JlYXRlKSB7CisJCWhhcmRsaW5rc190ICpjdXI7CisJCWhhcmRsaW5rc190ICptYWtlX21lID0gYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2hhcmRsaW5rc190b19jcmVhdGU7CisKKwkJYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2hhcmRsaW5rc190b19jcmVhdGUgPSBtYWtlX21lLT5uZXh0OworCisJCW1lbXNldChmaWxlX2hlYWRlciwgMCwgc2l6ZW9mKCpmaWxlX2hlYWRlcikpOworCQlmaWxlX2hlYWRlci0+bXRpbWUgPSBtYWtlX21lLT5tdGltZTsKKwkJZmlsZV9oZWFkZXItPm5hbWUgPSBtYWtlX21lLT5uYW1lOworCQlmaWxlX2hlYWRlci0+bW9kZSA9IG1ha2VfbWUtPm1vZGU7CisJCWZpbGVfaGVhZGVyLT51aWQgPSBtYWtlX21lLT51aWQ7CisJCWZpbGVfaGVhZGVyLT5naWQgPSBtYWtlX21lLT5naWQ7CisJCS8qZmlsZV9oZWFkZXItPnNpemUgPSAwOyovCisJCS8qZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID0gTlVMTDsqLworCisJCS8qIFRyeSB0byBmaW5kIGEgZmlsZSB3ZSBhcmUgaGFyZGxpbmtlZCB0byAqLworCQljdXIgPSBhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3M7CisJCXdoaWxlIChjdXIpIHsKKwkJCS8qIFRPRE86IG11c3QgbWF0Y2ggbWFqL21pbiB0b28hICovCisJCQlpZiAoY3VyLT5pbm9kZSA9PSBtYWtlX21lLT5pbm9kZSkgeworCQkJCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IGN1ci0+bmFtZTsKKwkJCQkgLyogbGlua190YXJnZXQgIT0gTlVMTCwgc2l6ZSA9IDA6ICJJIGFtIGEgaGFyZGxpbmsiICovCisJCQkJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWx0ZXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJCQkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhKGFyY2hpdmVfaGFuZGxlKTsKKwkJCQlmcmVlKG1ha2VfbWUpOworCQkJCWdvdG8gbmV4dF9saW5rOworCQkJfQorCQkJY3VyID0gY3VyLT5uZXh0OworCQl9CisJCS8qIE9vcHMuLi4gbm8gZmlsZSB3aXRoIHN1Y2ggaW5vZGUgd2FzIGNyZWF0ZWQuLi4gZG8gaXQgbm93CisJCSAqIChoYXBwZW5zIHdoZW4gaGFyZGxpbmtlZCBmaWxlcyBhcmUgZW1wdHkgKHplcm8gbGVuZ3RoKSkgKi8KKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWx0ZXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJCS8qIE1vdmUgdG8gdGhlIGxpc3Qgb2YgY3JlYXRlZCBoYXJkbGlua2VkIGZpbGVzICovCisJCW1ha2VfbWUtPm5leHQgPSBhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fY3JlYXRlZF9oYXJkbGlua3M7CisJCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19jcmVhdGVkX2hhcmRsaW5rcyA9IG1ha2VfbWU7CisgbmV4dF9saW5rOiA7CisJfQorCisJd2hpbGUgKGFyY2hpdmVfaGFuZGxlLT5jcGlvX19jcmVhdGVkX2hhcmRsaW5rcykgeworCQloYXJkbGlua3NfdCAqcCA9IGFyY2hpdmVfaGFuZGxlLT5jcGlvX19jcmVhdGVkX2hhcmRsaW5rczsKKwkJYXJjaGl2ZV9oYW5kbGUtPmNwaW9fX2NyZWF0ZWRfaGFyZGxpbmtzID0gcC0+bmV4dDsKKwkJZnJlZShwKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOyAvKiAiTm8gbW9yZSBmaWxlcyB0byBwcm9jZXNzIiAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhci5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2FmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBGSVhNRToKKyAqICAgIEluIHByaXZpbGVnZWQgbW9kZSBpZiB1bmFtZSBhbmQgZ25hbWUgbWFwIHRvIGEgdWlkIGFuZCBnaWQgdGhlbiB1c2UgdGhlCisgKiAgICBtYXBwZWQgdmFsdWUgaW5zdGVhZCBvZiB0aGUgdWlkL2dpZCB2YWx1ZXMgaW4gdGFyIGhlYWRlcgorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgICBHTlUgdGFyIGFuZCBzdGFyIG1hbiBwYWdlcywKKyAqICAgIE9wZW5ncm91cCdzIHVzdGFyIGludGVyY2hhbmdlIGZvcm1hdCwKKyAqICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvcGF4Lmh0bWwKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3R5cGVkZWYgdWludDMyX3QgYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIG9mZl90ICAgIGFsaWFzZWRfb2ZmX3QgICAgRklYX0FMSUFTSU5HOworCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBzdHJpcF91bnNhZmVfcHJlZml4KGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpjcCA9IHN0cjsKKwl3aGlsZSAoMSkgeworCQljaGFyICpjcDI7CisJCWlmICgqY3AgPT0gJy8nKSB7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0cm5jbXAoY3AsICIvLi4vIisxLCAzKSA9PSAwKSB7CisJCQljcCArPSAzOworCQkJY29udGludWU7CisJCX0KKwkJY3AyID0gc3Ryc3RyKGNwLCAiLy4uLyIpOworCQlpZiAoIWNwMikKKwkJCWJyZWFrOworCQljcCA9IGNwMiArIDQ7CisJfQorCWlmIChjcCAhPSBzdHIpIHsKKwkJc3RhdGljIHNtYWxsaW50IHdhcm5lZCA9IDA7CisJCWlmICghd2FybmVkKSB7CisJCQl3YXJuZWQgPSAxOworCQkJYmJfZXJyb3JfbXNnKCJyZW1vdmluZyBsZWFkaW5nICclLipzJyBmcm9tIG1lbWJlciBuYW1lcyIsCisJCQkJKGludCkoY3AgLSBzdHIpLCBzdHIpOworCQl9CisJfQorCXJldHVybiBjcDsKK30KKworLyogTkI6IF9ERVNUUk9ZU18gc3RyW2xlbl0gY2hhcmFjdGVyISAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRPY3RhbChjaGFyICpzdHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHY7CisJY2hhciAqZW5kOworCS8qIE5COiBsZWFkaW5nIHNwYWNlcyBhcmUgYWxsb3dlZC4gVXNpbmcgc3RydG91bGwgdG8gaGFuZGxlIHRoYXQuCisJICogVGhlIGRvd25zaWRlIGlzIHRoYXQgd2UgYWNjZXB0IGUuZy4gIi0xMjMiIHRvbyA6KAorCSAqLworCXN0cltsZW5dID0gJ1wwJzsKKwl2ID0gc3RydG91bGwoc3RyLCAmZW5kLCA4KTsKKwkvKiBzdGQ6ICJFYWNoIG51bWVyaWMgZmllbGQgaXMgdGVybWluYXRlZCBieSBvbmUgb3IgbW9yZQorCSAqIDxzcGFjZT4gb3IgTlVMIGNoYXJhY3RlcnMiLiBXZSBtdXN0IHN1cHBvcnQgJyAnISAqLworCWlmICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnICcpIHsKKwkJaW50OF90IGZpcnN0ID0gc3RyWzBdOworCQlpZiAoIShmaXJzdCAmIDB4ODApKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBvY3RhbCB2YWx1ZSBpbiB0YXIgaGVhZGVyIik7CisJCS8qCisJCSAqIEdOVSB0YXIgdXNlcyAiYmFzZS0yNTYgZW5jb2RpbmciIGZvciB2ZXJ5IGxhcmdlIG51bWJlcnMuCisJCSAqIEVuY29kaW5nIGlzIGJpbmFyeSwgd2l0aCBoaWdoZXN0IGJpdCBhbHdheXMgc2V0IGFzIGEgbWFya2VyCisJCSAqIGFuZCBzaWduIGluIG5leHQtaGlnaGVzdCBiaXQ6CisJCSAqIDgwIDAwIC4uIDAwIC0gemVybworCQkgKiBiZiBmZiAuLiBmZiAtIGxhcmdlc3QgcG9zaXRpdmUgbnVtYmVyCisJCSAqIGZmIGZmIC4uIGZmIC0gbWludXMgMQorCQkgKiBjMCAwMCAuLiAwMCAtIHNtYWxsZXN0IG5lZ2F0aXZlIG51bWJlcgorCQkgKgorCQkgKiBFeGFtcGxlIG9mIHRhciBmaWxlIHdpdGggODkxNDk5MzE1MyAoMHgyMTM2MDAwMDEpIGJ5dGUgZmlsZS4KKwkJICogRmllbGQgc3RhcnRzIGF0IG9mZnNldCA3YzoKKwkJICogMDAwNzAgIDMwIDMwIDMwIDAwIDMwIDMwIDMwIDMwICAzMCAzMCAzMCAwMCA4MCAwMCAwMCAwMCAgfDAwMC4wMDAwMDAwLi4uLi58CisJCSAqIDAwMDgwICAwMCAwMCAwMCAwMiAxMyA2MCAwMCAwMSAgMzEgMzEgMzEgMzIgMzAgMzMgMzMgMzYgIHwuLi4uLmAuLjExMTIwMzM2fAorCQkgKgorCQkgKiBOQjogdGFyYmFsbHMgd2l0aCBORUdBVElWRSB1bml4IHRpbWVzIGVuY29kZWQgdGhhdCB3YXkgd2VyZSBzZWVuIQorCQkgKi8KKwkJdiA9IGZpcnN0OworCQkvKiBTaWduLWV4dGVuZCB1c2luZyA2dGggYml0OiAqLworCQl2IDw8PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSo4IC0gNzsKKwkJdiA9IChsb25nIGxvbmcpdiA+PiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykqOCAtIDcpOworCQl3aGlsZSAoLS1sZW4gIT0gMCkKKwkJCXYgPSAodiA8PCA4KSArICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7CisJfQorCXJldHVybiB2OworfQorI2RlZmluZSBHRVRfT0NUQUwoYSkgZ2V0T2N0YWwoKGEpLCBzaXplb2YoYSkpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWAorLyogU2NhbiBhIFBBWCBoZWFkZXIgZm9yIFNFTGludXggY29udGV4dHMsIHZpYSAiUkhULnNlY3VyaXR5LnNlbGludXgiIGtleXdvcmQuCisgKiBUaGlzIGlzIHdoYXQgUmVkIEhhdCdzIHBhdGNoZWQgdmVyc2lvbiBvZiB0YXIgdXNlcy4KKyAqLworIyBkZWZpbmUgU0VMSU5VWF9DT05URVhUX0tFWVdPUkQgIlJIVC5zZWN1cml0eS5zZWxpbnV4Igorc3RhdGljIGNoYXIgKmdldF9zZWxpbnV4X3NjdHhfZnJvbV9wYXhfaGRyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlLCB1bnNpZ25lZCBzeikKK3sKKwljaGFyICpidWYsICpwOworCWNoYXIgKnJlc3VsdDsKKworCXAgPSBidWYgPSB4bWFsbG9jKHN6ICsgMSk7CisJLyogcHJldmVudCBiYl9zdHJ0b3UgZnJvbSBydW5uaW5nIG9mZiB0aGUgYnVmZmVyICovCisJYnVmW3N6XSA9ICdcMCc7CisJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgYnVmLCBzeik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBzejsKKworCXJlc3VsdCA9IE5VTEw7CisJd2hpbGUgKHN6ICE9IDApIHsKKwkJY2hhciAqZW5kLCAqdmFsdWU7CisJCXVuc2lnbmVkIGxlbjsKKworCQkvKiBFdmVyeSByZWNvcmQgaGFzIHRoaXMgZm9ybWF0OiAiTEVOIE5BTUU9VkFMVUVcbiIgKi8KKwkJbGVuID0gYmJfc3RydG91KHAsICZlbmQsIDEwKTsKKwkJLyogZXhwZWN0IGVycm5vIHRvIGJlIEVJTlZBTCwgYmVjYXVzZSB0aGUgY2hhcmFjdGVyCisJCSAqIGZvbGxvd2luZyB0aGUgZGlnaXRzIHNob3VsZCBiZSBhIHNwYWNlCisJCSAqLworCQlwICs9IGxlbjsKKwkJc3ogLT0gbGVuOworCQlpZiAoKGludClzeiA8IDAKKwkJIHx8IGxlbiA9PSAwCisJCSB8fCBlcnJubyAhPSBFSU5WQUwKKwkJIHx8ICplbmQgIT0gJyAnCisJCSkgeworCQkJYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgZXh0ZW5kZWQgaGVhZGVyLCBza2lwcGVkIik7CisJCQkvLyBNb3JlIHZlcmJvc2UgdmVyc2lvbjoKKwkJCS8vYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgZXh0ZW5kZWQgaGVhZGVyIGF0ICUiT0ZGX0ZNVCJkLCBza2lwcGVkIiwKKwkJCS8vCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0IC0gKHN6ICsgbGVuKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBvdmVyd3JpdGUgdGhlIHRlcm1pbmF0aW5nIG5ld2xpbmUgd2l0aCBOVUwKKwkJICogKHdlIGRvIG5vdCBib3RoZXIgdG8gY2hlY2sgdGhhdCBpdCAqd2FzKiBhIG5ld2xpbmUpCisJCSAqLworCQlwWy0xXSA9ICdcMCc7CisJCS8qIElzIGl0IHNlbGludXggc2VjdXJpdHkgY29udGV4dD8gKi8KKwkJdmFsdWUgPSBlbmQgKyAxOworCQlpZiAoc3RybmNtcCh2YWx1ZSwgU0VMSU5VWF9DT05URVhUX0tFWVdPUkQiPSIsIHNpemVvZihTRUxJTlVYX0NPTlRFWFRfS0VZV09SRCI9IikgLSAxKSA9PSAwKSB7CisJCQl2YWx1ZSArPSBzaXplb2YoU0VMSU5VWF9DT05URVhUX0tFWVdPUkQiPSIpIC0gMTsKKwkJCXJlc3VsdCA9IHhzdHJkdXAodmFsdWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitjaGFyIEZBU1RfRlVOQyBnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlcjsKKwlzdHJ1Y3QgdGFyX2hlYWRlcl90IHRhcjsKKwljaGFyICpjcDsKKwlpbnQgaSwgc3VtX3UsIHN1bTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkKKwlpbnQgc3VtX3M7CisjZW5kaWYKKwlpbnQgcGFyc2VfbmFtZXM7CisKKwkvKiBPdXIgInByaXZhdGUgZGF0YSIgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKyMgZGVmaW5lIHBfbG9uZ25hbWUgKGFyY2hpdmVfaGFuZGxlLT50YXJfX2xvbmduYW1lKQorIyBkZWZpbmUgcF9saW5rbmFtZSAoYXJjaGl2ZV9oYW5kbGUtPnRhcl9fbGlua25hbWUpCisjZWxzZQorIyBkZWZpbmUgcF9sb25nbmFtZSAwCisjIGRlZmluZSBwX2xpbmtuYW1lIDAKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TIHx8IEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisgYWdhaW46CisjZW5kaWYKKwkvKiBBbGlnbiBoZWFkZXIgKi8KKwlkYXRhX2FsaWduKGFyY2hpdmVfaGFuZGxlLCA1MTIpOworCisgYWdhaW5fYWZ0ZXJfYWxpZ246CisKKyNpZiBFTkFCTEVfREVTS1RPUCB8fCBFTkFCTEVfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVAorCS8qIHRvIHByZXZlbnQgbWlzZGV0ZWN0aW9uIG9mIGJ6MiBzaWcgKi8KKwkqKGFsaWFzZWRfdWludDMyX3QqKSZ0YXIgPSAwOworCWkgPSBmdWxsX3JlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgJnRhciwgNTEyKTsKKwkvKiBJZiBHTlUgdGFyIHNlZXMgRU9GIGluIGFib3ZlIHJlYWQsIGl0IHNheXM6CisJICogInRhcjogQSBsb25lIHplcm8gYmxvY2sgYXQgTiIsIHdoZXJlIE4gPSBraWxvYnl0ZQorCSAqIHdoZXJlIEVPRiB3YXMgbWV0IChub3QgRU9GIGJsb2NrLCBhY3R1YWwgRU9GISksCisJICogYW5kIGV4aXRzIHdpdGggRVhJVF9TVUNDRVNTLgorCSAqIFdlIHdpbGwgbWltaWMgZXhpdChFWElUX1NVQ0NFU1MpLCBhbHRob3VnaCB3ZSB3aWxsIG5vdCBtaW1pYworCSAqIHRoZSBtZXNzYWdlIGFuZCB3ZSBkb24ndCBjaGVjayB3aGV0aGVyIHdlIGluZGVlZAorCSAqIHNhdyB6ZXJvIGJsb2NrIGRpcmVjdGx5IGJlZm9yZSB0aGlzLiAqLworCWlmIChpID09IDApIHsKKwkJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMDsKKyBzaG9ydF9yZWFkOgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCIpOworCX0KKwlpZiAoaSAhPSA1MTIpIHsKKwkJSUZfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVChnb3RvIGF1dG9kZXRlY3Q7KQorCQlnb3RvIHNob3J0X3JlYWQ7CisJfQorCisjZWxzZQorCWkgPSA1MTI7CisJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgJnRhciwgaSk7CisjZW5kaWYKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IGk7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBmaWxlbmFtZSBpdHMgYW4gZW1wdHkgaGVhZGVyICovCisJaWYgKHRhci5uYW1lWzBdID09IDAgJiYgdGFyLnByZWZpeFswXSA9PSAwKSB7CisJCWlmIChhcmNoaXZlX2hhbmRsZS0+dGFyX19lbmQpIHsKKwkJCS8qIFNlY29uZCBjb25zZWN1dGl2ZSBlbXB0eSBoZWFkZXIgLSBlbmQgb2YgYXJjaGl2ZS4KKwkJCSAqIFJlYWQgdW50aWwgdGhlIGVuZCB0byBlbXB0eSB0aGUgcGlwZSBmcm9tIGd6IG9yIGJ6MgorCQkJICovCisJCQl3aGlsZSAoZnVsbF9yZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZ0YXIsIDUxMikgPT0gNTEyKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCQlhcmNoaXZlX2hhbmRsZS0+dGFyX19lbmQgPSAxOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwlhcmNoaXZlX2hhbmRsZS0+dGFyX19lbmQgPSAwOworCisJLyogQ2hlY2sgaGVhZGVyIGhhcyB2YWxpZCBtYWdpYywgInVzdGFyIiBpcyBmb3IgdGhlIHByb3BlciB0YXIsCisJICogZml2ZSBOVUxzIGFyZSBmb3IgdGhlIG9sZCB0YXIgZm9ybWF0ICAqLworCWlmIChzdHJuY21wKHRhci5tYWdpYywgInVzdGFyIiwgNSkgIT0gMAorCSAmJiAoIUVOQUJMRV9GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWQorCSAgICAgfHwgbWVtY21wKHRhci5tYWdpYywgIlwwXDBcMFwwIiwgNSkgIT0gMCkKKwkpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVAorCQljaGFyIEZBU1RfRlVOQyAoKmdldF9oZWFkZXJfcHRyKShhcmNoaXZlX2hhbmRsZV90ICopOworCQl1aW50MTZfdCBtYWdpYzI7CisKKyBhdXRvZGV0ZWN0OgorCQltYWdpYzIgPSAqKGJiX19hbGlhc2VkX3VpbnQxNl90Kil0YXIubmFtZTsKKwkJLyogdGFyIGd6L2J6IGF1dG9kZXRlY3Q6IGNoZWNrIGZvciBnei9iejIgbWFnaWMuCisJCSAqIElmIHdlIHNlZSB0aGUgbWFnaWMsIGFuZCBpdCBpcyB0aGUgdmVyeSBmaXJzdCBibG9jaywKKwkJICogd2UgY2FuIHN3aXRjaCB0byBnZXRfaGVhZGVyX3Rhcl9nei9iejIvbHptYSgpLgorCQkgKiBOZWVkcyBzZWVrYWJsZSBmZC4gSSB3aXNoIHJlY3YoTVNHX1BFRUspIHdvcmtzCisJCSAqIG9uIGFueSBmZC4uLiAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCQlpZiAobWFnaWMyID09IEdaSVBfTUFHSUMpIHsKKwkJCWdldF9oZWFkZXJfcHRyID0gZ2V0X2hlYWRlcl90YXJfZ3o7CisJCX0gZWxzZQorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwkJaWYgKG1hZ2ljMiA9PSBCWklQMl9NQUdJQworCQkgJiYgdGFyLm5hbWVbMl0gPT0gJ2gnICYmIGlzZGlnaXQodGFyLm5hbWVbM10pCisJCSkgeyAvKiBiemlwMiAqLworCQkJZ2V0X2hlYWRlcl9wdHIgPSBnZXRfaGVhZGVyX3Rhcl9iejI7CisJCX0gZWxzZQorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19YWgorCQkvL1RPRE86IGlmIChtYWdpYzIgPT0gWFpfTUFHSUMxKS4uLgorCQkvL2Vsc2UKKyMgZW5kaWYKKwkJCWdvdG8gZXJyOworCQkvKiBUd28gZGlmZmVyZW50IGNhdXNlcyBmb3IgbHNlZWsoKSAhPSAwOgorCQkgKiB1bnNlZWthYmxlIGZkICh3b3VsZCBsaWtlIHRvIHN1cHBvcnQgdGhhdCB0b28sIGJ1dC4uLiksCisJCSAqIG9yIG5vdCBmaXJzdCBibG9jayAoZmFsc2UgcG9zaXRpdmUsIGl0J3Mgbm90IC5nei8uYnoyISkgKi8KKwkJaWYgKGxzZWVrKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIC1pLCBTRUVLX0NVUikgIT0gMCkKKwkJCWdvdG8gZXJyOworCQl3aGlsZSAoZ2V0X2hlYWRlcl9wdHIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworIGVycjoKKyNlbmRpZiAvKiBGRUFUVVJFX1RBUl9BVVRPREVURUNUICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHRhciBtYWdpYyIpOworCX0KKworCS8qIERvIGNoZWNrc3VtIG9uIGhlYWRlcnMuCisJICogUE9TSVggc2F5cyB0aGF0IGNoZWNrc3VtIGlzIGRvbmUgb24gdW5zaWduZWQgYnl0ZXMsIGJ1dAorCSAqIFN1biBhbmQgSFAtVVggZ2V0cyBpdCB3cm9uZy4uLiBtb3JlIGRldGFpbHMgaW4KKwkgKiBHTlUgdGFyIHNvdXJjZS4gKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkKKwlzdW1fcyA9ICcgJyAqIHNpemVvZih0YXIuY2hrc3VtKTsKKyNlbmRpZgorCXN1bV91ID0gJyAnICogc2l6ZW9mKHRhci5jaGtzdW0pOworCWZvciAoaSA9IDA7IGkgPCAxNDg7IGkrKykgeworCQlzdW1fdSArPSAoKHVuc2lnbmVkIGNoYXIqKSZ0YXIpW2ldOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWQorCQlzdW1fcyArPSAoKHNpZ25lZCBjaGFyKikmdGFyKVtpXTsKKyNlbmRpZgorCX0KKwlmb3IgKGkgPSAxNTY7IGkgPCA1MTI7IGkrKykgeworCQlzdW1fdSArPSAoKHVuc2lnbmVkIGNoYXIqKSZ0YXIpW2ldOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWQorCQlzdW1fcyArPSAoKHNpZ25lZCBjaGFyKikmdGFyKVtpXTsKKyNlbmRpZgorCX0KKwkvKiBUaGlzIGZpZWxkIGRvZXMgbm90IG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgKGdldE9jdGFsKSAqLworCXsKKwkJY2hhciAqZW5kcDsgLyogZ2NjIGxpa2VzIHRlbXAgdmFyIGZvciAmZW5kcCAqLworCQlzdW0gPSBzdHJ0b3VsKHRhci5jaGtzdW0sICZlbmRwLCA4KTsKKwkJaWYgKCgqZW5kcCAhPSAnXDAnICYmICplbmRwICE9ICcgJykKKwkJIHx8IChzdW1fdSAhPSBzdW0gSUZfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkoJiYgc3VtX3MgIT0gc3VtKSkKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0YXIgaGVhZGVyIGNoZWNrc3VtIik7CisJCX0KKwl9CisJLyogZG9uJ3QgdXNlIHhzdHJ0b3VsLCB0YXIuY2hrc3VtIG1heSBoYXZlIGxlYWRpbmcgc3BhY2VzICovCisJc3VtID0gc3RydG91bCh0YXIuY2hrc3VtLCBOVUxMLCA4KTsKKwlpZiAoc3VtX3UgIT0gc3VtIElGX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZKCYmIHN1bV9zICE9IHN1bSkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgdGFyIGhlYWRlciBjaGVja3N1bSIpOworCX0KKworCS8qIDAgaXMgcmVzZXJ2ZWQgZm9yIGhpZ2ggcGVyZiBmaWxlLCB0cmVhdCBhcyBub3JtYWwgZmlsZSAqLworCWlmICghdGFyLnR5cGVmbGFnKSB0YXIudHlwZWZsYWcgPSAnMCc7CisJcGFyc2VfbmFtZXMgPSAodGFyLnR5cGVmbGFnID49ICcwJyAmJiB0YXIudHlwZWZsYWcgPD0gJzcnKTsKKworCS8qIGdldE9jdGFsIHRyYXNoZXMgc3Vic2VxdWVudCBmaWVsZCwgdGhlcmVmb3JlIHdlIGNhbGwgaXQKKwkgKiBvbiBmaWVsZHMgaW4gcmV2ZXJzZSBvcmRlciAqLworCWlmICh0YXIuZGV2bWFqb3JbMF0pIHsKKwkJY2hhciB0ID0gdGFyLnByZWZpeFswXTsKKwkJLyogd2UgdHJhc2ggcHJlZml4WzBdIGhlcmUsIGJ1dCB3ZSBETyBuZWVkIGl0IGxhdGVyISAqLworCQl1bnNpZ25lZCBtaW5vciA9IEdFVF9PQ1RBTCh0YXIuZGV2bWlub3IpOworCQl1bnNpZ25lZCBtYWpvciA9IEdFVF9PQ1RBTCh0YXIuZGV2bWFqb3IpOworCQlmaWxlX2hlYWRlci0+ZGV2aWNlID0gbWFrZWRldihtYWpvciwgbWlub3IpOworCQl0YXIucHJlZml4WzBdID0gdDsKKwl9CisJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID0gTlVMTDsKKwlpZiAoIXBfbGlua25hbWUgJiYgcGFyc2VfbmFtZXMgJiYgdGFyLmxpbmtuYW1lWzBdKSB7CisJCWZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCA9IHhzdHJuZHVwKHRhci5saW5rbmFtZSwgc2l6ZW9mKHRhci5saW5rbmFtZSkpOworCQkvKiBGSVhNRTogd2hhdCBpZiB3ZSBoYXZlIG5vbi1saW5rIG9iamVjdCB3aXRoIGxpbmtfdGFyZ2V0PyAqLworCQkvKiBXaWxsIGxpbmtfdGFyZ2V0IGJlIGZyZWUoKWVkPyAqLworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwlmaWxlX2hlYWRlci0+dGFyX191bmFtZSA9IHRhci51bmFtZVswXSA/IHhzdHJuZHVwKHRhci51bmFtZSwgc2l6ZW9mKHRhci51bmFtZSkpIDogTlVMTDsKKwlmaWxlX2hlYWRlci0+dGFyX19nbmFtZSA9IHRhci5nbmFtZVswXSA/IHhzdHJuZHVwKHRhci5nbmFtZSwgc2l6ZW9mKHRhci5nbmFtZSkpIDogTlVMTDsKKyNlbmRpZgorCWZpbGVfaGVhZGVyLT5tdGltZSA9IEdFVF9PQ1RBTCh0YXIubXRpbWUpOworCWZpbGVfaGVhZGVyLT5zaXplID0gR0VUX09DVEFMKHRhci5zaXplKTsKKwlmaWxlX2hlYWRlci0+Z2lkID0gR0VUX09DVEFMKHRhci5naWQpOworCWZpbGVfaGVhZGVyLT51aWQgPSBHRVRfT0NUQUwodGFyLnVpZCk7CisJLyogU2V0IGJpdHMgMC0xMSBvZiB0aGUgZmlsZXMgbW9kZSAqLworCWZpbGVfaGVhZGVyLT5tb2RlID0gMDc3NzcgJiBHRVRfT0NUQUwodGFyLm1vZGUpOworCisJZmlsZV9oZWFkZXItPm5hbWUgPSBOVUxMOworCWlmICghcF9sb25nbmFtZSAmJiBwYXJzZV9uYW1lcykgeworCQkvKiB3ZSB0cmFzaCBtb2RlWzBdIGhlcmUsIGl0J3Mgb2sgKi8KKwkJLy90YXIubmFtZVtzaXplb2YodGFyLm5hbWUpXSA9ICdcMCc7IC0gZ2NjIDQuMy4wIHdvdWxkIGNvbXBsYWluCisJCXRhci5tb2RlWzBdID0gJ1wwJzsKKwkJaWYgKHRhci5wcmVmaXhbMF0pIHsKKwkJCS8qIGFuZCBwYWRkaW5nWzBdICovCisJCQkvL3Rhci5wcmVmaXhbc2l6ZW9mKHRhci5wcmVmaXgpXSA9ICdcMCc7IC0gZ2NjIDQuMy4wIHdvdWxkIGNvbXBsYWluCisJCQl0YXIucGFkZGluZ1swXSA9ICdcMCc7CisJCQlmaWxlX2hlYWRlci0+bmFtZSA9IGNvbmNhdF9wYXRoX2ZpbGUodGFyLnByZWZpeCwgdGFyLm5hbWUpOworCQl9IGVsc2UKKwkJCWZpbGVfaGVhZGVyLT5uYW1lID0geHN0cmR1cCh0YXIubmFtZSk7CisJfQorCisJLyogU2V0IGJpdHMgMTItMTUgb2YgdGhlIGZpbGVzIG1vZGUgKi8KKwkvKiAodHlwZWZsYWcgd2FzIG5vdCB0cmFzaGVkIGJlY2F1c2UgY2hrc3VtIGRvZXMgbm90IHVzZSBnZXRPY3RhbCkgKi8KKwlzd2l0Y2ggKHRhci50eXBlZmxhZykgeworCWNhc2UgJzEnOiAvKiBoYXJkbGluayAqLworCQkvKiB3ZSBtYXJrIGhhcmRsaW5rcyBhcyByZWd1bGFyIGZpbGVzIHdpdGggemVybyBzaXplIGFuZCBhIGxpbmsgbmFtZSAqLworCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGUkVHOworCQkvKiBvbiBzaXplIG9mIGxpbmsgZmllbGRzIGZyb20gc3Rhcig0KQorCQkgKiAuLi4gRm9yIHRhciBhcmNoaXZlcyB3cml0dGVuIGJ5IHByZSBQT1NJWC4xLTE5ODgKKwkJICogaW1wbGVtZW50YXRpb25zLCB0aGUgc2l6ZSBmaWVsZCB1c3VhbGx5IGNvbnRhaW5zIHRoZSBzaXplIG9mCisJCSAqIHRoZSBmaWxlIGFuZCBuZWVkcyB0byBiZSBpZ25vcmVkIGFzIG5vIGRhdGEgbWF5IGZvbGxvdyB0aGlzCisJCSAqIGhlYWRlciB0eXBlLiAgRm9yIFBPU0lYLjEtIDE5ODggY29tcGxpYW50IGFyY2hpdmVzLCB0aGUgc2l6ZQorCQkgKiBmaWVsZCBuZWVkcyB0byBiZSAwLiAgRm9yIFBPU0lYLjEtMjAwMSBjb21wbGlhbnQgYXJjaGl2ZXMsCisJCSAqIHRoZSBzaXplIGZpZWxkIG1heSBiZSBub24gemVybywgaW5kaWNhdGluZyB0aGF0IGZpbGUgZGF0YSBpcworCQkgKiBpbmNsdWRlZCBpbiB0aGUgYXJjaGl2ZS4KKwkJICogaS5lOyBhbHdheXMgYXNzdW1lIHRoaXMgaXMgemVybyBmb3Igc2FmZXR5LgorCQkgKi8KKwkJZ290byBzaXplMDsKKwljYXNlICc3JzoKKwkvKiBjYXNlIDA6ICovCisJY2FzZSAnMCc6CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZCisJCWlmIChsYXN0X2NoYXJfaXMoZmlsZV9oZWFkZXItPm5hbWUsICcvJykpIHsKKwkJCWdvdG8gc2V0X2RpcjsKKwkJfQorI2VuZGlmCisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZSRUc7CisJCWJyZWFrOworCWNhc2UgJzInOgorCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGTE5LOworCQkvKiBoYXZlIHNlZW4gdGFyYmFsbHMgd2l0aCBzaXplIGZpZWxkIGNvbnRhaW5pbmcKKwkJICogdGhlIHNpemUgb2YgdGhlIGxpbmsgdGFyZ2V0J3MgbmFtZSAqLworIHNpemUwOgorCQlmaWxlX2hlYWRlci0+c2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgJzMnOgorCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGQ0hSOworCQlnb3RvIHNpemUwOyAvKiBwYXJhbm9pYSAqLworCWNhc2UgJzQnOgorCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGQkxLOworCQlnb3RvIHNpemUwOworCWNhc2UgJzUnOgorIElGX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZKHNldF9kaXI6KQorCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGRElSOworCQlnb3RvIHNpemUwOworCWNhc2UgJzYnOgorCQlmaWxlX2hlYWRlci0+bW9kZSB8PSBTX0lGSUZPOworCQlnb3RvIHNpemUwOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCWNhc2UgJ0wnOgorCQkvKiBmcmVlOiBwYXJhbm9pYTogdGFyIHdpdGggc2V2ZXJhbCBjb25zZWN1dGl2ZSBsb25nbmFtZXMgKi8KKwkJZnJlZShwX2xvbmduYW1lKTsKKwkJLyogRm9yIHBhcmFub2lhIHJlYXNvbnMgd2UgYWxsb2NhdGUgZXh0cmEgTlVMIGNoYXIgKi8KKwkJcF9sb25nbmFtZSA9IHh6YWxsb2MoZmlsZV9oZWFkZXItPnNpemUgKyAxKTsKKwkJLyogV2UgcmVhZCBBU0NJWiBzdHJpbmcsIGluY2x1ZGluZyBOVUwgKi8KKwkJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgcF9sb25nbmFtZSwgZmlsZV9oZWFkZXItPnNpemUpOworCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IGZpbGVfaGVhZGVyLT5zaXplOworCQkvKiByZXR1cm4gZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpOyAqLworCQkvKiBnY2MgNC4xLjEgZGlkbid0IG9wdGltaXplIGl0IGludG8ganVtcCAqLworCQkvKiBzbyB3ZSB3aWxsIGRvIGl0IG91cnNlbGYsIHRoaXMgYWxzbyBzYXZlcyBzdGFjayAqLworCQlnb3RvIGFnYWluOworCWNhc2UgJ0snOgorCQlmcmVlKHBfbGlua25hbWUpOworCQlwX2xpbmtuYW1lID0geHphbGxvYyhmaWxlX2hlYWRlci0+c2l6ZSArIDEpOworCQl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBwX2xpbmtuYW1lLCBmaWxlX2hlYWRlci0+c2l6ZSk7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gZmlsZV9oZWFkZXItPnNpemU7CisJCS8qIHJldHVybiBnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSk7ICovCisJCWdvdG8gYWdhaW47CisJY2FzZSAnRCc6CS8qIEdOVSBkdW1wIGRpciAqLworCWNhc2UgJ00nOgkvKiBDb250aW51YXRpb24gb2YgbXVsdGkgdm9sdW1lIGFyY2hpdmUgKi8KKwljYXNlICdOJzoJLyogT2xkIEdOVSBmb3IgbmFtZXMgPiAxMDAgY2hhcmFjdGVycyAqLworCWNhc2UgJ1MnOgkvKiBTcGFyc2UgZmlsZSAqLworCWNhc2UgJ1YnOgkvKiBWb2x1bWUgaGVhZGVyICovCisjZW5kaWYKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVEFSX1NFTElOVVgKKwljYXNlICdnJzoJLyogcGF4IGdsb2JhbCBoZWFkZXIgKi8KKwljYXNlICd4JzoJLyogcGF4IGV4dGVuZGVkIGhlYWRlciAqLworI2Vsc2UKKyBza2lwX2V4dF9oZHI6CisjZW5kaWYKKwl7CisJCW9mZl90IHN6OworCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IHNraXBwaW5nIGhlYWRlciAnJWMnIiwgdGFyLnR5cGVmbGFnKTsKKwkJc3ogPSAoZmlsZV9oZWFkZXItPnNpemUgKyA1MTEpICYgfihvZmZfdCk1MTE7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gc3o7CisJCXN6ID4+PSA5OyAvKiBzeiAvPSA1MTIgYnV0IHcvbyBjb250b3J0aW9ucyBmb3Igc2lnbmVkIGRpdiAqLworCQl3aGlsZSAoc3otLSkKKwkJCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZ0YXIsIDUxMik7CisJCS8qIHJldHVybiBnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSk7ICovCisJCWdvdG8gYWdhaW5fYWZ0ZXJfYWxpZ247CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJY2FzZSAnZyc6CS8qIHBheCBnbG9iYWwgaGVhZGVyICovCisJY2FzZSAneCc6IHsJLyogcGF4IGV4dGVuZGVkIGhlYWRlciAqLworCQljaGFyICoqcHA7CisJCWlmICgodW9mZl90KWZpbGVfaGVhZGVyLT5zaXplID4gMHhmZmZmZikgLyogcGFyYW5vaWEgKi8KKwkJCWdvdG8gc2tpcF9leHRfaGRyOworCQlwcCA9ICh0YXIudHlwZWZsYWcgPT0gJ2cnKSA/ICZhcmNoaXZlX2hhbmRsZS0+dGFyX19nbG9iYWxfc2N0eCA6ICZhcmNoaXZlX2hhbmRsZS0+dGFyX19uZXh0X2ZpbGVfc2N0eDsKKwkJZnJlZSgqcHApOworCQkqcHAgPSBnZXRfc2VsaW51eF9zY3R4X2Zyb21fcGF4X2hkcihhcmNoaXZlX2hhbmRsZSwgZmlsZV9oZWFkZXItPnNpemUpOworCQlnb3RvIGFnYWluOworCX0KKyNlbmRpZgorCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHR5cGVmbGFnOiAweCV4IiwgdGFyLnR5cGVmbGFnKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwlpZiAocF9sb25nbmFtZSkgeworCQlmaWxlX2hlYWRlci0+bmFtZSA9IHBfbG9uZ25hbWU7CisJCXBfbG9uZ25hbWUgPSBOVUxMOworCX0KKwlpZiAocF9saW5rbmFtZSkgeworCQlmaWxlX2hlYWRlci0+bGlua190YXJnZXQgPSBwX2xpbmtuYW1lOworCQlwX2xpbmtuYW1lID0gTlVMTDsKKwl9CisjZW5kaWYKKworCS8qIEV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyBsYXN0ICIuLiIgY29tcG9uZW50IGlzIHN0cmlwcGVkICovCisJb3ZlcmxhcHBpbmdfc3RyY3B5KGZpbGVfaGVhZGVyLT5uYW1lLCBzdHJpcF91bnNhZmVfcHJlZml4KGZpbGVfaGVhZGVyLT5uYW1lKSk7CisKKwkvKiBTdHJpcCB0cmFpbGluZyAnLycgaW4gZGlyZWN0b3JpZXMgKi8KKwkvKiBNdXN0IGJlIGRvbmUgYWZ0ZXIgbW9kZSBpcyBzZXQgYXMgJy8nIGlzIHVzZWQgdG8gY2hlY2sgaWYgaXQncyBhIGRpcmVjdG9yeSAqLworCWNwID0gbGFzdF9jaGFyX2lzKGZpbGVfaGVhZGVyLT5uYW1lLCAnLycpOworCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWx0ZXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlcigvKmFyY2hpdmVfaGFuZGxlLT4qLyBmaWxlX2hlYWRlcik7CisJCS8qIE5vdGUgdGhhdCB3ZSBraWxsIHRoZSAnLycgb25seSBhZnRlciBhY3Rpb25faGVhZGVyKCkgKi8KKwkJLyogKGxpa2UgR05VIHRhciAxLjE1LjE6IHZlcmJvc2UgbW9kZSBvdXRwdXRzICJkaXIvZGlyLyIpICovCisJCWlmIChjcCkKKwkJCSpjcCA9ICdcMCc7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJCWlmIChhcmNoaXZlX2hhbmRsZS0+YWNjZXB0IHx8IGFyY2hpdmVfaGFuZGxlLT5yZWplY3QpCisJCQlsbGlzdF9hZGRfdG8oJmFyY2hpdmVfaGFuZGxlLT5wYXNzZWQsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJZWxzZSAvKiBDYWxsZXIgaXNuJ3QgaW50ZXJlc3RlZCBpbiBsaXN0IG9mIHVucGFja2VkIGZpbGVzICovCisJCQlmcmVlKGZpbGVfaGVhZGVyLT5uYW1lKTsKKwl9IGVsc2UgeworCQlkYXRhX3NraXAoYXJjaGl2ZV9oYW5kbGUpOworCQlmcmVlKGZpbGVfaGVhZGVyLT5uYW1lKTsKKwl9CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBmaWxlX2hlYWRlci0+c2l6ZTsKKworCWZyZWUoZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwkvKiBEbyBub3QgZnJlZShmaWxlX2hlYWRlci0+bmFtZSkhCisJICogSXQgbWlnaHQgYmUgaW5zZXJ0ZWQgaW4gYXJjaGl2ZV9oYW5kbGUtPnBhc3NlZCAtIHNlZSBhYm92ZSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCWZyZWUoZmlsZV9oZWFkZXItPnRhcl9fdW5hbWUpOworCWZyZWUoZmlsZV9oZWFkZXItPnRhcl9fZ25hbWUpOworI2VuZGlmCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfYnoyLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2J6Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDMyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2J6Mi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitjaGFyIEZBU1RfRlVOQyBnZXRfaGVhZGVyX3Rhcl9iejIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJLyogQ2FuJ3QgbHNlZWsgb3ZlciBwaXBlcyAqLworCWFyY2hpdmVfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCisJb3Blbl90cmFuc2Zvcm1lcihhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCB1bnBhY2tfYnoyX3N0cmVhbV9wcmltZSwgImJ1bnppcDIiKTsKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ID0gMDsKKwl3aGlsZSAoZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7CisKKwkvKiBDYW4gb25seSBkbyBvbmUgZmlsZSBhdCBhIHRpbWUgKi8KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9nei5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9nei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWZlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2d6LmMKQEAgLTAsMCArMSwzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK2NoYXIgRkFTVF9GVU5DIGdldF9oZWFkZXJfdGFyX2d6KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworI2lmIEJCX01NVQorCXVpbnQxNl90IG1hZ2ljOworI2VuZGlmCisKKwkvKiBDYW4ndCBsc2VlayBvdmVyIHBpcGVzICovCisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X3JlYWQ7CisKKwkvKiBDaGVjayBnemlwIG1hZ2ljIG9ubHkgaWYgb3Blbl90cmFuc2Zvcm1lciB3aWxsIGludm9rZSB1bnBhY2tfZ3pfc3RyZWFtIChNTVUgY2FzZSkuCisJICogT3RoZXJ3aXNlLCBpdCB3aWxsIGludm9rZSBhbiBleHRlcm5hbCBoZWxwZXIgImd1bnppcCAtY2YiIChOT01NVSBjYXNlKSB3aGljaCB3aWxsCisJICogbmVlZCB0aGUgaGVhZGVyLiAqLworI2lmIEJCX01NVQorCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZtYWdpYywgMik7CisJLyogQ2FuIHNraXAgdGhpcyBjaGVjaywgYnV0IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsZXNzIGNsZWFyICovCisJaWYgKG1hZ2ljICE9IEdaSVBfTUFHSUMpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgZ3ppcCBtYWdpYyIpOworCX0KKyNlbmRpZgorCisJb3Blbl90cmFuc2Zvcm1lcihhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCB1bnBhY2tfZ3pfc3RyZWFtLCAiZ3VuemlwIik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7CisJd2hpbGUgKGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJLyogQ2FuIG9ubHkgZG8gb25lIGZpbGUgYXQgYSB0aW1lICovCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfbHptYS5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9sem1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwOGUwYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfbHptYS5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNtYWxsIGx6bWEgZGVmbGF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitjaGFyIEZBU1RfRlVOQyBnZXRfaGVhZGVyX3Rhcl9sem1hKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCS8qIENhbid0IGxzZWVrIG92ZXIgcGlwZXMgKi8KKwlhcmNoaXZlX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfcmVhZDsKKworCW9wZW5fdHJhbnNmb3JtZXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgdW5wYWNrX2x6bWFfc3RyZWFtLCAidW5sem1hIik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7CisJd2hpbGUgKGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJLyogQ2FuIG9ubHkgZG8gb25lIGZpbGUgYXQgYSB0aW1lICovCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX2xpc3QuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZjNzVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfbGlzdC5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgaGVhZGVyX2xpc3QoY29uc3QgZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIpCit7CisvL1RPRE86IGNwaW8gLXZwIERJUiBzaG91bGQgb3V0cHV0ICJESVIvTkFNRSIsIG5vdCBqdXN0ICJOQU1FIiAqLworCXB1dHMoZmlsZV9oZWFkZXItPm5hbWUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfc2tpcC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfc2tpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmM1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl9za2lwLmMKQEAgLTAsMCArMSwxMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBoZWFkZXJfc2tpcChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlciBVTlVTRURfUEFSQU0pCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl92ZXJib3NlX2xpc3QuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX3ZlcmJvc2VfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGU0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl92ZXJib3NlX2xpc3QuYwpAQCAtMCwwICsxLDY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgaGVhZGVyX3ZlcmJvc2VfbGlzdChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikKK3sKKwlzdHJ1Y3QgdG0gdG1fdGltZTsKKwlzdHJ1Y3QgdG0gKnB0bSA9ICZ0bV90aW1lOyAvL2xvY2FsdGltZSgmZmlsZV9oZWFkZXItPm10aW1lKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCWNoYXIgdWlkW3NpemVvZihpbnQpKjMgKyAyXTsKKwkvKmNoYXIgZ2lkW3NpemVvZihpbnQpKjMgKyAyXTsqLworCWNoYXIgKnVzZXI7CisJY2hhciAqZ3JvdXA7CisKKwlsb2NhbHRpbWVfcigmZmlsZV9oZWFkZXItPm10aW1lLCBwdG0pOworCisJdXNlciA9IGZpbGVfaGVhZGVyLT50YXJfX3VuYW1lOworCWlmICh1c2VyID09IE5VTEwpIHsKKwkJc3ByaW50Zih1aWQsICIldSIsICh1bnNpZ25lZClmaWxlX2hlYWRlci0+dWlkKTsKKwkJdXNlciA9IHVpZDsKKwl9CisJZ3JvdXAgPSBmaWxlX2hlYWRlci0+dGFyX19nbmFtZTsKKwlpZiAoZ3JvdXAgPT0gTlVMTCkgeworCQkvKnNwcmludGYoZ2lkLCAiJXUiLCAodW5zaWduZWQpZmlsZV9oZWFkZXItPmdpZCk7Ki8KKwkJZ3JvdXAgPSB1dG9hKGZpbGVfaGVhZGVyLT5naWQpOworCX0KKwlwcmludGYoIiVzICVzLyVzICU5Ik9GRl9GTVQidSAlNHUtJTAydS0lMDJ1ICUwMnU6JTAydTolMDJ1ICVzIiwKKwkJYmJfbW9kZV9zdHJpbmcoZmlsZV9oZWFkZXItPm1vZGUpLAorCQl1c2VyLAorCQlncm91cCwKKwkJZmlsZV9oZWFkZXItPnNpemUsCisJCTE5MDAgKyBwdG0tPnRtX3llYXIsCisJCTEgKyBwdG0tPnRtX21vbiwKKwkJcHRtLT50bV9tZGF5LAorCQlwdG0tPnRtX2hvdXIsCisJCXB0bS0+dG1fbWluLAorCQlwdG0tPnRtX3NlYywKKwkJZmlsZV9oZWFkZXItPm5hbWUpOworCisjZWxzZSAvKiAhRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUgKi8KKworCWxvY2FsdGltZV9yKCZmaWxlX2hlYWRlci0+bXRpbWUsIHB0bSk7CisKKwlwcmludGYoIiVzICV1LyV1ICU5Ik9GRl9GTVQidSAlNHUtJTAydS0lMDJ1ICUwMnU6JTAydTolMDJ1ICVzIiwKKwkJYmJfbW9kZV9zdHJpbmcoZmlsZV9oZWFkZXItPm1vZGUpLAorCQkodW5zaWduZWQpZmlsZV9oZWFkZXItPnVpZCwKKwkJKHVuc2lnbmVkKWZpbGVfaGVhZGVyLT5naWQsCisJCWZpbGVfaGVhZGVyLT5zaXplLAorCQkxOTAwICsgcHRtLT50bV95ZWFyLAorCQkxICsgcHRtLT50bV9tb24sCisJCXB0bS0+dG1fbWRheSwKKwkJcHRtLT50bV9ob3VyLAorCQlwdG0tPnRtX21pbiwKKwkJcHRtLT50bV9zZWMsCisJCWZpbGVfaGVhZGVyLT5uYW1lKTsKKworI2VuZGlmIC8qIEZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FICovCisKKwkvKiBOQjogR05VIHRhciBzaG93cyAiLT4iIGZvciBzeW1saW5rcyBhbmQgImxpbmsgdG8iIGZvciBoYXJkbGlua3MgKi8KKwlpZiAoZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KSB7CisJCXByaW50ZigiIC0+ICVzIiwgZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvaW5pdF9oYW5kbGUuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvaW5pdF9oYW5kbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQ0ZWExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9pbml0X2hhbmRsZS5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCithcmNoaXZlX2hhbmRsZV90KiBGQVNUX0ZVTkMgaW5pdF9oYW5kbGUodm9pZCkKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZTsKKworCS8qIEluaXRpYWxpemUgZGVmYXVsdCB2YWx1ZXMgKi8KKwlhcmNoaXZlX2hhbmRsZSA9IHh6YWxsb2Moc2l6ZW9mKGFyY2hpdmVfaGFuZGxlX3QpKTsKKwlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXIgPSB4emFsbG9jKHNpemVvZihmaWxlX2hlYWRlcl90KSk7CisJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPSBoZWFkZXJfc2tpcDsKKwlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX3NraXA7CisJYXJjaGl2ZV9oYW5kbGUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfYWxsOworCWFyY2hpdmVfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9qdW1wOworCisJcmV0dXJuIGFyY2hpdmVfaGFuZGxlOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9saWJsem8uaCBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbGlibHpvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzOTk3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbGlibHpvLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJsaWJsem9faW50ZXJmYWNlLmgiCisKKy8qIGx6by0yLjAzL3NyYy9jb25maWcxeC5oICovCisjZGVmaW5lIE0yX01JTl9MRU4gICAgICAzCisjZGVmaW5lIE0yX01BWF9MRU4gICAgICA4CisjZGVmaW5lIE0zX01BWF9MRU4gICAgICAzMworI2RlZmluZSBNNF9NQVhfTEVOICAgICAgOQorI2RlZmluZSBNMV9NQVhfT0ZGU0VUICAgMHgwNDAwCisjZGVmaW5lIE0yX01BWF9PRkZTRVQgICAweDA4MDAKKyNkZWZpbmUgTTNfTUFYX09GRlNFVCAgIDB4NDAwMAorI2RlZmluZSBNNF9NQVhfT0ZGU0VUICAgMHhiZmZmCisjZGVmaW5lIE0xX01BUktFUiAgICAgICAwCisjZGVmaW5lIE0zX01BUktFUiAgICAgICAzMgorI2RlZmluZSBNNF9NQVJLRVIgICAgICAgMTYKKworI2RlZmluZSBNWF9NQVhfT0ZGU0VUICAgKE0xX01BWF9PRkZTRVQgKyBNMl9NQVhfT0ZGU0VUKQorI2RlZmluZSBNSU5fTE9PS0FIRUFEICAgKE0yX01BWF9MRU4gKyAxKQorCisjZGVmaW5lIExaT19FT0ZfQ09ERQorCisvKiBsem8tMi4wMy9zcmMvbHpvX2RpY3QuaCAqLworI2RlZmluZSBHSU5ERVgobV9wb3MsbV9vZmYsZGljdCxkaW5kZXgsaW4pICAgIG1fcG9zID0gZGljdFtkaW5kZXhdCisjZGVmaW5lIERYMihwLHMxLHMyKSBcCisgICAgICAgICgoKCgodW5zaWduZWQpKChwKVsyXSkgPDwgKHMyKSkgXiAocClbMV0pIDw8IChzMSkpIF4gKHApWzBdKQorLy8jZGVmaW5lIERBMyhwLHMxLHMyLHMzKSAoKERBMigocCkrMSxzMixzMykgPDwgKHMxKSkgKyAocClbMF0pCisvLyNkZWZpbmUgRFMzKHAsczEsczIsczMpICgoRFMyKChwKSsxLHMyLHMzKSA8PCAoczEpKSAtIChwKVswXSkKKyNkZWZpbmUgRFgzKHAsczEsczIsczMpICgoRFgyKChwKSsxLHMyLHMzKSA8PCAoczEpKSBeIChwKVswXSkKKworI2RlZmluZSBEX1NJWkUgICAgICAgICgxVSA8PCBEX0JJVFMpCisjZGVmaW5lIERfTUFTSyAgICAgICAgKCgxVSA8PCBEX0JJVFMpIC0gMSkKKyNkZWZpbmUgRF9ISUdIICAgICAgICAoKERfTUFTSyA+PiAxKSArIDEpCisKKyNkZWZpbmUgTFpPX0NIRUNLX01QT1NfTk9OX0RFVChtX3BvcyxtX29mZixpbixpcCxtYXhfb2Zmc2V0KSBcCisgICAgKCBcCisgICAgICAgIG1fcG9zID0gaXAgLSAodW5zaWduZWQpKGlwIC0gbV9wb3MpLCBcCisgICAgICAgICgodWludHB0cl90KW1fcG9zIDwgKHVpbnRwdHJfdClpbiBcCisJfHwgKG1fb2ZmID0gKHVuc2lnbmVkKShpcCAtIG1fcG9zKSkgPD0gMCBcCisJfHwgbV9vZmYgPiBtYXhfb2Zmc2V0KSBcCisgICAgKQorCisjZGVmaW5lIERFTlRSWShwLGluKSAgICAgICAgICAgICAgICAgICAgICAocCkKKyNkZWZpbmUgVVBEQVRFX0koZGljdCxkcnVuLGluZGV4LHAsaW4pICAgIGRpY3RbaW5kZXhdID0gREVOVFJZKHAsaW4pCisKKyNkZWZpbmUgRE1TKHYscykgICgodW5zaWduZWQpICgoKHYpICYgKERfTUFTSyA+PiAocykpKSA8PCAocykpKQorI2RlZmluZSBETSh2KSAgICAgKCh1bnNpZ25lZCkgKCh2KSAmIERfTUFTSykpCisjZGVmaW5lIERNVUwoYSxiKSAoKHVuc2lnbmVkKSAoKGEpICogKGIpKSkKKworLyogbHpvLTIuMDMvc3JjL2x6b19wdHIuaCAqLworI2RlZmluZSBwZChhLGIpICAoKHVuc2lnbmVkKSgoYSktKGIpKSkKKworIyAgICBkZWZpbmUgVEVTVF9JUCAgICAgICAgICAgICAoaXAgPCBpcF9lbmQpCisjICAgIGRlZmluZSBORUVEX0lQKHgpIFwKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGlwX2VuZCAtIGlwKSA8ICh1bnNpZ25lZCkoeCkpICBnb3RvIGlucHV0X292ZXJydW4KKworIyAgICB1bmRlZiBURVNUX09QICAgICAgICAgICAgICAvKiBkb24ndCBuZWVkIGJvdGggb2YgdGhlIHRlc3RzIGhlcmUgKi8KKyMgICAgZGVmaW5lIFRFU1RfT1AgICAgICAgICAgICAgMQorIyAgICBkZWZpbmUgTkVFRF9PUCh4KSBcCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShvcF9lbmQgLSBvcCkgPCAodW5zaWduZWQpKHgpKSAgZ290byBvdXRwdXRfb3ZlcnJ1bgorCisjZGVmaW5lIEhBVkVfQU5ZX09QIDEKKworLy8jaWYgZGVmaW5lZChMWk9fVEVTVF9PVkVSUlVOX0xPT0tCRUhJTkQpCisjICBkZWZpbmUgVEVTVF9MQihtX3BvcykgICAgICAgIGlmIChtX3BvcyA8IG91dCB8fCBtX3BvcyA+PSBvcCkgZ290byBsb29rYmVoaW5kX292ZXJydW4KKy8vIyAgZGVmaW5lIFRFU1RfTEJPKG1fcG9zLG8pICAgICBpZiAobV9wb3MgPCBvdXQgfHwgbV9wb3MgPj0gb3AgLSAobykpIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCisvLyNlbHNlCisvLyMgIGRlZmluZSBURVNUX0xCKG1fcG9zKSAgICAgICAgKCh2b2lkKSAwKQorLy8jICBkZWZpbmUgVEVTVF9MQk8obV9wb3MsbykgICAgICgodm9pZCkgMCkKKy8vI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4XzEuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODgzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4XzEuYwpAQCAtMCwwICsxLDM1IEBACisvKiBMWk8xWC0xIGNvbXByZXNzaW9uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJsem8uaCIKKworI2RlZmluZSBEX0JJVFMgICAgICAgICAgMTQKKyNkZWZpbmUgRF9JTkRFWDEoZCxwKSAgIGQgPSBETShETVVMKDB4MjEsRFgzKHAsNSw1LDYpKSA+PiA1KQorI2RlZmluZSBEX0lOREVYMihkLHApICAgZCA9IChkICYgKERfTUFTSyAmIDB4N2ZmKSkgXiAoRF9ISUdIIHwgMHgxZikKKworI2RlZmluZSBET19DT01QUkVTUyAgICAgbHpvMXhfMV9jb21wcmVzcworCisjaW5jbHVkZSAibHpvMXhfYy5jIgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xby5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjEyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4XzFvLmMKQEAgLTAsMCArMSwzNSBAQAorLyogTFpPMVgtMSgxNSkgY29tcHJlc3Npb24KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYmx6by5oIgorCisjZGVmaW5lIERfQklUUyAgICAgICAgICAxNQorI2RlZmluZSBEX0lOREVYMShkLHApICAgZCA9IERNKERNVUwoMHgyMSxEWDMocCw1LDUsNikpID4+IDUpCisjZGVmaW5lIERfSU5ERVgyKGQscCkgICBkID0gKGQgJiAoRF9NQVNLICYgMHg3ZmYpKSBeIChEX0hJR0ggfCAweDFmKQorCisjZGVmaW5lIERPX0NPTVBSRVNTICAgICBsem8xeF8xXzE1X2NvbXByZXNzCisKKyNpbmNsdWRlICJsem8xeF9jLmMiCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4Xzl4LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4Xzl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzMjA1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfOXguYwpAQCAtMCwwICsxLDkyMSBAQAorLyogbHpvMXhfOXguYyAtLSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTFpPMVgtOTk5IGNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDcgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA2IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwNSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAzIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDEgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAwIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5OSBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyCisgICA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgcHJvYmFibHkgb25seSBzYWZlIG9uIEludGVsLWNvbXBhdGlibGUgcHJvY2Vzc29ycyAuLi4gKi8KKyNkZWZpbmUgTFpPX1VOQUxJR05FRF9PS18yCisjZGVmaW5lIExaT19VTkFMSUdORURfT0tfNAorCisjaW5jbHVkZSAibGlibHpvLmgiCisKKyNkZWZpbmUgTFpPX01BWChhLGIpICAgICAgICAoKGEpID49IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTFpPX01JTihhLGIpICAgICAgICAoKGEpIDw9IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTFpPX01BWDMoYSxiLGMpICAgICAoKGEpID49IChiKSA/IExaT19NQVgoYSxjKSA6IExaT19NQVgoYixjKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTV0RfTiAgICAgICAgICAgTTRfTUFYX09GRlNFVCAgIC8qIHNpemUgb2YgcmluZyBidWZmZXIgKi8KKyNkZWZpbmUgU1dEX0YgICAgICAgICAgIDIwNDggICAgICAgICAgIC8qIHVwcGVyIGxpbWl0IGZvciBtYXRjaCBsZW5ndGggKi8KKworI2RlZmluZSBTV0RfQkVTVF9PRkYgICAgKExaT19NQVgzKE0yX01BWF9MRU4sIE0zX01BWF9MRU4sIE00X01BWF9MRU4pICsgMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBpbml0OworCisJdW5zaWduZWQgbG9vazsgICAgICAgICAgLyogYnl0ZXMgaW4gbG9va2FoZWFkIGJ1ZmZlciAqLworCisJdW5zaWduZWQgbV9sZW47CisJdW5zaWduZWQgbV9vZmY7CisKKwljb25zdCB1aW50OF90ICpicDsKKwljb25zdCB1aW50OF90ICppcDsKKwljb25zdCB1aW50OF90ICppbjsKKwljb25zdCB1aW50OF90ICppbl9lbmQ7CisJdWludDhfdCAqb3V0OworCisJdW5zaWduZWQgcjFfbGl0OworCit9IGx6bzF4Xzk5OV90OworCisjZGVmaW5lIGdldGJ5dGUoYykgICgoYykuaXAgPCAoYykuaW5fZW5kID8gKigoYykuaXApKysgOiAoLTEpKQorCisvKiBsem9fc3dkLmMgLS0gc2xpZGluZyB3aW5kb3cgZGljdGlvbmFyeSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNXRF9VSU5UX01BWCAgICAgIFVTSFJUX01BWAorCisjaWZuZGVmIFNXRF9IU0laRQorIyAgZGVmaW5lIFNXRF9IU0laRSAgICAgICAgIDE2Mzg0CisjZW5kaWYKKyNpZm5kZWYgU1dEX01BWF9DSEFJTgorIyAgZGVmaW5lIFNXRF9NQVhfQ0hBSU4gICAgIDIwNDgKKyNlbmRpZgorCisjZGVmaW5lIEhFQUQzKGIsIHApIFwKKwkoICgoMHg5ZjVmICogKCgoKGJbcF08PDUpXmJbcCsxXSk8PDUpIF4gYltwKzJdKSkgPj4gNSkgJiAoU1dEX0hTSVpFLTEpICkKKworI2lmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKQorIyAgZGVmaW5lIEhFQUQyKGIscCkgICAgICAoKiAodWludDE2X3QgKikgJihiW3BdKSkKKyNlbHNlCisjICBkZWZpbmUgSEVBRDIoYixwKSAgICAgIChiW3BdIF4gKCh1bnNpZ25lZCliW3ArMV08PDgpKQorI2VuZGlmCisjZGVmaW5lIE5JTDIgICAgICAgICAgICAgIFNXRF9VSU5UX01BWAorCit0eXBlZGVmIHN0cnVjdCBsem9fc3dkIHsKKwkvKiBwdWJsaWMgLSAiYnVpbHQtaW4iICovCisKKwkvKiBwdWJsaWMgLSBjb25maWd1cmF0aW9uICovCisJdW5zaWduZWQgbWF4X2NoYWluOworCWludCB1c2VfYmVzdF9vZmY7CisKKwkvKiBwdWJsaWMgLSBvdXRwdXQgKi8KKwl1bnNpZ25lZCBtX2xlbjsKKwl1bnNpZ25lZCBtX29mZjsKKwl1bnNpZ25lZCBsb29rOworCWludCBiX2NoYXI7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJdW5zaWduZWQgYmVzdF9vZmZbU1dEX0JFU1RfT0ZGXTsKKyNlbmRpZgorCisJLyogc2VtaSBwdWJsaWMgKi8KKwlsem8xeF85OTlfdCAqYzsKKwl1bnNpZ25lZCBtX3BvczsKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwl1bnNpZ25lZCBiZXN0X3Bvc1tTV0RfQkVTVF9PRkZdOworI2VuZGlmCisKKwkvKiBwcml2YXRlICovCisJdW5zaWduZWQgaXA7ICAgICAgICAgICAgICAgIC8qIGlucHV0IHBvaW50ZXIgKGxvb2thaGVhZCkgKi8KKwl1bnNpZ25lZCBicDsgICAgICAgICAgICAgICAgLyogYnVmZmVyIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBycDsgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHBvaW50ZXIgKi8KKworCXVuc2lnbmVkIG5vZGVfY291bnQ7CisJdW5zaWduZWQgZmlyc3RfcnA7CisKKwl1aW50OF90IGJbU1dEX04gKyBTV0RfRl07CisJdWludDhfdCBiX3dyYXBbU1dEX0ZdOyAvKiBtdXN0IGZvbGxvdyBiICovCisJdWludDE2X3QgaGVhZDNbU1dEX0hTSVpFXTsKKwl1aW50MTZfdCBzdWNjM1tTV0RfTiArIFNXRF9GXTsKKwl1aW50MTZfdCBiZXN0M1tTV0RfTiArIFNXRF9GXTsKKwl1aW50MTZfdCBsbGVuM1tTV0RfSFNJWkVdOworI2lmZGVmIEhFQUQyCisJdWludDE2X3QgaGVhZDJbNjU1MzZMXTsKKyNlbmRpZgorfSBsem9fc3dkX3QsICpsem9fc3dkX3A7CisKKyNkZWZpbmUgU0laRU9GX0xaT19TV0RfVCAgICAoc2l6ZW9mKGx6b19zd2RfdCkpCisKKworLyogQWNjZXNzIG1hY3JvIGZvciBoZWFkMy4KKyAqIGhlYWQzW2tleV0gbWF5IGJlIHVuaW5pdGlhbGl6ZWQsIGJ1dCB0aGVuIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuCisgKi8KKyNkZWZpbmUgc19nZXRfaGVhZDMocyxrZXkpICAgIHMtPmhlYWQzW2tleV0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJfU0laRSAoU1dEX04gKyBTV0RfRikKKworc3RhdGljIGludCBzd2RfaW5pdChsem9fc3dkX3AgcykKK3sKKwkvKiBkZWZhdWx0cyAqLworCXMtPm5vZGVfY291bnQgPSBTV0RfTjsKKworCW1lbXNldChzLT5sbGVuMywgMCwgc2l6ZW9mKHMtPmxsZW4zWzBdKSAqICh1bnNpZ25lZClTV0RfSFNJWkUpOworI2lmZGVmIEhFQUQyCisJbWVtc2V0KHMtPmhlYWQyLCAweGZmLCBzaXplb2Yocy0+aGVhZDJbMF0pICogNjU1MzZMKTsKKwlhc3NlcnQocy0+aGVhZDJbMF0gPT0gTklMMik7CisjZW5kaWYKKworCXMtPmlwID0gMDsKKwlzLT5icCA9IHMtPmlwOworCXMtPmZpcnN0X3JwID0gcy0+aXA7CisKKwlhc3NlcnQocy0+aXAgKyBTV0RfRiA8PSBCX1NJWkUpOworCXMtPmxvb2sgPSAodW5zaWduZWQpIChzLT5jLT5pbl9lbmQgLSBzLT5jLT5pcCk7CisJaWYgKHMtPmxvb2sgPiAwKSB7CisJCWlmIChzLT5sb29rID4gU1dEX0YpCisJCQlzLT5sb29rID0gU1dEX0Y7CisJCW1lbWNweSgmcy0+YltzLT5pcF0sIHMtPmMtPmlwLCBzLT5sb29rKTsKKwkJcy0+Yy0+aXAgKz0gcy0+bG9vazsKKwkJcy0+aXAgKz0gcy0+bG9vazsKKwl9CisJaWYgKHMtPmlwID09IEJfU0laRSkKKwkJcy0+aXAgPSAwOworCisJcy0+cnAgPSBzLT5maXJzdF9ycDsKKwlpZiAocy0+cnAgPj0gcy0+bm9kZV9jb3VudCkKKwkJcy0+cnAgLT0gcy0+bm9kZV9jb3VudDsKKwllbHNlCisJCXMtPnJwICs9IEJfU0laRSAtIHMtPm5vZGVfY291bnQ7CisKKwlyZXR1cm4gTFpPX0VfT0s7Cit9CisKKyNkZWZpbmUgc3dkX3BvczJvZmYocyxwb3MpIFwKKwkocy0+YnAgPiAocG9zKSA/IHMtPmJwIC0gKHBvcykgOiBCX1NJWkUgLSAoKHBvcykgLSBzLT5icCkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3dkX2dldGJ5dGUobHpvX3N3ZF9wIHMpCit7CisJaW50IGM7CisKKwlpZiAoKGMgPSBnZXRieXRlKCoocy0+YykpKSA8IDApIHsKKwkJaWYgKHMtPmxvb2sgPiAwKQorCQkJLS1zLT5sb29rOworCX0gZWxzZSB7CisJCXMtPmJbcy0+aXBdID0gYzsKKwkJaWYgKHMtPmlwIDwgU1dEX0YpCisJCQlzLT5iX3dyYXBbcy0+aXBdID0gYzsKKwl9CisJaWYgKCsrcy0+aXAgPT0gQl9TSVpFKQorCQlzLT5pcCA9IDA7CisJaWYgKCsrcy0+YnAgPT0gQl9TSVpFKQorCQlzLT5icCA9IDA7CisJaWYgKCsrcy0+cnAgPT0gQl9TSVpFKQorCQlzLT5ycCA9IDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyByZW1vdmUgbm9kZSBmcm9tIGxpc3RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzd2RfcmVtb3ZlX25vZGUobHpvX3N3ZF9wIHMsIHVuc2lnbmVkIG5vZGUpCit7CisJaWYgKHMtPm5vZGVfY291bnQgPT0gMCkgeworCQl1bnNpZ25lZCBrZXk7CisKKwkJa2V5ID0gSEVBRDMocy0+Yixub2RlKTsKKwkJYXNzZXJ0KHMtPmxsZW4zW2tleV0gPiAwKTsKKwkJLS1zLT5sbGVuM1trZXldOworCisjaWZkZWYgSEVBRDIKKwkJa2V5ID0gSEVBRDIocy0+Yixub2RlKTsKKwkJYXNzZXJ0KHMtPmhlYWQyW2tleV0gIT0gTklMMik7CisJCWlmICgodW5zaWduZWQpIHMtPmhlYWQyW2tleV0gPT0gbm9kZSkKKwkJCXMtPmhlYWQyW2tleV0gPSBOSUwyOworI2VuZGlmCisJfSBlbHNlCisJCS0tcy0+bm9kZV9jb3VudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzd2RfYWNjZXB0KGx6b19zd2RfcCBzLCB1bnNpZ25lZCBuKQoreworCWFzc2VydChuIDw9IHMtPmxvb2spOworCisJd2hpbGUgKG4tLSkgeworCQl1bnNpZ25lZCBrZXk7CisKKwkJc3dkX3JlbW92ZV9ub2RlKHMscy0+cnApOworCisJCS8qIGFkZCBicCBpbnRvIEhFQUQzICovCisJCWtleSA9IEhFQUQzKHMtPmIsIHMtPmJwKTsKKwkJcy0+c3VjYzNbcy0+YnBdID0gc19nZXRfaGVhZDMocywga2V5KTsKKwkJcy0+aGVhZDNba2V5XSA9IHMtPmJwOworCQlzLT5iZXN0M1tzLT5icF0gPSBTV0RfRiArIDE7CisJCXMtPmxsZW4zW2tleV0rKzsKKwkJYXNzZXJ0KHMtPmxsZW4zW2tleV0gPD0gU1dEX04pOworCisjaWZkZWYgSEVBRDIKKwkJLyogYWRkIGJwIGludG8gSEVBRDIgKi8KKwkJa2V5ID0gSEVBRDIocy0+Yiwgcy0+YnApOworCQlzLT5oZWFkMltrZXldID0gcy0+YnA7CisjZW5kaWYKKworCQlzd2RfZ2V0Ynl0ZShzKTsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3dkX3NlYXJjaChsem9fc3dkX3AgcywgdW5zaWduZWQgbm9kZSwgdW5zaWduZWQgY250KQoreworCWNvbnN0IHVpbnQ4X3QgKnAxOworCWNvbnN0IHVpbnQ4X3QgKnAyOworCWNvbnN0IHVpbnQ4X3QgKnB4OworCXVuc2lnbmVkIG1fbGVuID0gcy0+bV9sZW47CisJY29uc3QgdWludDhfdCAqYiAgPSBzLT5iOworCWNvbnN0IHVpbnQ4X3QgKmJwID0gcy0+YiArIHMtPmJwOworCWNvbnN0IHVpbnQ4X3QgKmJ4ID0gcy0+YiArIHMtPmJwICsgcy0+bG9vazsKKwl1bnNpZ25lZCBjaGFyIHNjYW5fZW5kMTsKKworCWFzc2VydChzLT5tX2xlbiA+IDApOworCisJc2Nhbl9lbmQxID0gYnBbbV9sZW4gLSAxXTsKKwlmb3IgKCA7IGNudC0tID4gMDsgbm9kZSA9IHMtPnN1Y2MzW25vZGVdKSB7CisJCXAxID0gYnA7CisJCXAyID0gYiArIG5vZGU7CisJCXB4ID0gYng7CisKKwkJYXNzZXJ0KG1fbGVuIDwgcy0+bG9vayk7CisKKwkJaWYgKHAyW21fbGVuIC0gMV0gPT0gc2Nhbl9lbmQxCisJCSAmJiBwMlttX2xlbl0gPT0gcDFbbV9sZW5dCisJCSAmJiBwMlswXSA9PSBwMVswXQorCQkgJiYgcDJbMV0gPT0gcDFbMV0KKwkJKSB7CisJCQl1bnNpZ25lZCBpOworCQkJYXNzZXJ0KGx6b19tZW1jbXAoYnAsICZiW25vZGVdLCAzKSA9PSAwKTsKKworCQkJcDEgKz0gMjsgcDIgKz0gMjsKKwkJCWRvIHt9IHdoaWxlICgrK3AxIDwgcHggJiYgKnAxID09ICorK3AyKTsKKwkJCWkgPSBwMS1icDsKKworCQkJYXNzZXJ0KGx6b19tZW1jbXAoYnAsICZiW25vZGVdLCBpKSA9PSAwKTsKKworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCQkJaWYgKGkgPCBTV0RfQkVTVF9PRkYpIHsKKwkJCQlpZiAocy0+YmVzdF9wb3NbaV0gPT0gMCkKKwkJCQkJcy0+YmVzdF9wb3NbaV0gPSBub2RlICsgMTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGkgPiBtX2xlbikgeworCQkJCXMtPm1fbGVuID0gbV9sZW4gPSBpOworCQkJCXMtPm1fcG9zID0gbm9kZTsKKwkJCQlpZiAobV9sZW4gPT0gcy0+bG9vaykKKwkJCQkJcmV0dXJuOworCQkJCWlmIChtX2xlbiA+PSBTV0RfRikKKwkJCQkJcmV0dXJuOworCQkJCWlmIChtX2xlbiA+ICh1bnNpZ25lZCkgcy0+YmVzdDNbbm9kZV0pCisJCQkJCXJldHVybjsKKwkJCQlzY2FuX2VuZDEgPSBicFttX2xlbiAtIDFdOworCQkJfQorCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBIRUFEMgorCitzdGF0aWMgaW50IHN3ZF9zZWFyY2gyKGx6b19zd2RfcCBzKQoreworCXVuc2lnbmVkIGtleTsKKworCWFzc2VydChzLT5sb29rID49IDIpOworCWFzc2VydChzLT5tX2xlbiA+IDApOworCisJa2V5ID0gcy0+aGVhZDJbSEVBRDIocy0+Yiwgcy0+YnApXTsKKwlpZiAoa2V5ID09IE5JTDIpCisJCXJldHVybiAwOworCWFzc2VydChsem9fbWVtY21wKCZzLT5iW3MtPmJwXSwgJnMtPmJba2V5XSwgMikgPT0gMCk7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJaWYgKHMtPmJlc3RfcG9zWzJdID09IDApCisJCXMtPmJlc3RfcG9zWzJdID0ga2V5ICsgMTsKKyNlbmRpZgorCisJaWYgKHMtPm1fbGVuIDwgMikgeworCQlzLT5tX2xlbiA9IDI7CisJCXMtPm1fcG9zID0ga2V5OworCX0KKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3dkX2ZpbmRiZXN0KGx6b19zd2RfcCBzKQoreworCXVuc2lnbmVkIGtleTsKKwl1bnNpZ25lZCBjbnQsIG5vZGU7CisJdW5zaWduZWQgbGVuOworCisJYXNzZXJ0KHMtPm1fbGVuID4gMCk7CisKKwkvKiBnZXQgY3VycmVudCBoZWFkLCBhZGQgYnAgaW50byBIRUFEMyAqLworCWtleSA9IEhFQUQzKHMtPmIscy0+YnApOworCW5vZGUgPSBzLT5zdWNjM1tzLT5icF0gPSBzX2dldF9oZWFkMyhzLCBrZXkpOworCWNudCA9IHMtPmxsZW4zW2tleV0rKzsKKwlhc3NlcnQocy0+bGxlbjNba2V5XSA8PSBTV0RfTiArIFNXRF9GKTsKKwlpZiAoY250ID4gcy0+bWF4X2NoYWluKQorCQljbnQgPSBzLT5tYXhfY2hhaW47CisJcy0+aGVhZDNba2V5XSA9IHMtPmJwOworCisJcy0+Yl9jaGFyID0gcy0+YltzLT5icF07CisJbGVuID0gcy0+bV9sZW47CisJaWYgKHMtPm1fbGVuID49IHMtPmxvb2spIHsKKwkJaWYgKHMtPmxvb2sgPT0gMCkKKwkJCXMtPmJfY2hhciA9IC0xOworCQlzLT5tX29mZiA9IDA7CisJCXMtPmJlc3QzW3MtPmJwXSA9IFNXRF9GICsgMTsKKwl9IGVsc2UgeworI2lmZGVmIEhFQUQyCisJCWlmIChzd2Rfc2VhcmNoMihzKSkKKyNlbmRpZgorCQkJaWYgKHMtPmxvb2sgPj0gMykKKwkJCQlzd2Rfc2VhcmNoKHMsIG5vZGUsIGNudCk7CisJCWlmIChzLT5tX2xlbiA+IGxlbikKKwkJCXMtPm1fb2ZmID0gc3dkX3BvczJvZmYocyxzLT5tX3Bvcyk7CisJCXMtPmJlc3QzW3MtPmJwXSA9IHMtPm1fbGVuOworCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJCWlmIChzLT51c2VfYmVzdF9vZmYpIHsKKwkJCWludCBpOworCQkJZm9yIChpID0gMjsgaSA8IFNXRF9CRVNUX09GRjsgaSsrKSB7CisJCQkJaWYgKHMtPmJlc3RfcG9zW2ldID4gMCkKKwkJCQkJcy0+YmVzdF9vZmZbaV0gPSBzd2RfcG9zMm9mZihzLCBzLT5iZXN0X3Bvc1tpXS0xKTsKKwkJCQllbHNlCisJCQkJCXMtPmJlc3Rfb2ZmW2ldID0gMDsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCisJc3dkX3JlbW92ZV9ub2RlKHMscy0+cnApOworCisjaWZkZWYgSEVBRDIKKwkvKiBhZGQgYnAgaW50byBIRUFEMiAqLworCWtleSA9IEhFQUQyKHMtPmIsIHMtPmJwKTsKKwlzLT5oZWFkMltrZXldID0gcy0+YnA7CisjZW5kaWYKK30KKworI3VuZGVmIEhFQUQzCisjdW5kZWYgSEVBRDIKKyN1bmRlZiBzX2dldF9oZWFkMworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaW5pdF9tYXRjaChsem8xeF85OTlfdCAqYywgbHpvX3N3ZF9wIHMsIHVpbnQzMl90IHVzZV9iZXN0X29mZikKK3sKKwlpbnQgcjsKKworCWFzc2VydCghYy0+aW5pdCk7CisJYy0+aW5pdCA9IDE7CisKKwlzLT5jID0gYzsKKworCXIgPSBzd2RfaW5pdChzKTsKKwlpZiAociAhPSAwKQorCQlyZXR1cm4gcjsKKworCXMtPnVzZV9iZXN0X29mZiA9IHVzZV9iZXN0X29mZjsKKwlyZXR1cm4gcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZpbmRfbWF0Y2gobHpvMXhfOTk5X3QgKmMsIGx6b19zd2RfcCBzLAorCQl1bnNpZ25lZCB0aGlzX2xlbiwgdW5zaWduZWQgc2tpcCkKK3sKKwlhc3NlcnQoYy0+aW5pdCk7CisKKwlpZiAoc2tpcCA+IDApIHsKKwkJYXNzZXJ0KHRoaXNfbGVuID49IHNraXApOworCQlzd2RfYWNjZXB0KHMsIHRoaXNfbGVuIC0gc2tpcCk7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KHRoaXNfbGVuIDw9IDEpOworCX0KKworCXMtPm1fbGVuID0gMTsKKwlzLT5tX2xlbiA9IDE7CisjaWZkZWYgU1dEX0JFU1RfT0ZGCisJaWYgKHMtPnVzZV9iZXN0X29mZikKKwkJbWVtc2V0KHMtPmJlc3RfcG9zLCAwLCBzaXplb2Yocy0+YmVzdF9wb3MpKTsKKyNlbmRpZgorCXN3ZF9maW5kYmVzdChzKTsKKwljLT5tX2xlbiA9IHMtPm1fbGVuOworCWMtPm1fb2ZmID0gcy0+bV9vZmY7CisKKwlzd2RfZ2V0Ynl0ZShzKTsKKworCWlmIChzLT5iX2NoYXIgPCAwKSB7CisJCWMtPmxvb2sgPSAwOworCQljLT5tX2xlbiA9IDA7CisJfSBlbHNlIHsKKwkJYy0+bG9vayA9IHMtPmxvb2sgKyAxOworCX0KKwljLT5icCA9IGMtPmlwIC0gYy0+bG9vazsKKworCXJldHVybiBMWk9fRV9PSzsKK30KKworLyogdGhpcyBpcyBhIHB1YmxpYyBmdW5jdGlvbnMsIGJ1dCB0aGVyZSBpcyBubyBwcm90b3R5cGUgaW4gYSBoZWFkZXIgZmlsZSAqLworc3RhdGljIGludCBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwoY29uc3QgdWludDhfdCAqaW4gLCB1bnNpZ25lZCBpbl9sZW4sCisJCXVpbnQ4X3QgKm91dCwgdW5zaWduZWQgKm91dF9sZW4sCisJCXZvaWQgKndya21lbSwKKwkJdW5zaWduZWQgZ29vZF9sZW5ndGgsCisJCXVuc2lnbmVkIG1heF9sYXp5LAorCQl1bnNpZ25lZCBtYXhfY2hhaW4sCisJCXVpbnQzMl90IHVzZV9iZXN0X29mZik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQ4X3QgKmNvZGVfbWF0Y2gobHpvMXhfOTk5X3QgKmMsCisJCXVpbnQ4X3QgKm9wLCB1bnNpZ25lZCBtX2xlbiwgdW5zaWduZWQgbV9vZmYpCit7CisJYXNzZXJ0KG9wID4gYy0+b3V0KTsKKwlpZiAobV9sZW4gPT0gMikgeworCQlhc3NlcnQobV9vZmYgPD0gTTFfTUFYX09GRlNFVCk7CisJCWFzc2VydChjLT5yMV9saXQgPiAwKTsKKwkJYXNzZXJ0KGMtPnIxX2xpdCA8IDQpOworCQltX29mZiAtPSAxOworCQkqb3ArKyA9IE0xX01BUktFUiB8ICgobV9vZmYgJiAzKSA8PCAyKTsKKwkJKm9wKysgPSBtX29mZiA+PiAyOworCX0gZWxzZSBpZiAobV9sZW4gPD0gTTJfTUFYX0xFTiAmJiBtX29mZiA8PSBNMl9NQVhfT0ZGU0VUKSB7CisJCWFzc2VydChtX2xlbiA+PSAzKTsKKwkJbV9vZmYgLT0gMTsKKwkJKm9wKysgPSAoKG1fbGVuIC0gMSkgPDwgNSkgfCAoKG1fb2ZmICYgNykgPDwgMik7CisJCSpvcCsrID0gbV9vZmYgPj4gMzsKKwkJYXNzZXJ0KG9wWy0yXSA+PSBNMl9NQVJLRVIpOworCX0gZWxzZSBpZiAobV9sZW4gPT0gTTJfTUlOX0xFTiAmJiBtX29mZiA8PSBNWF9NQVhfT0ZGU0VUICYmIGMtPnIxX2xpdCA+PSA0KSB7CisJCWFzc2VydChtX2xlbiA9PSAzKTsKKwkJYXNzZXJ0KG1fb2ZmID4gTTJfTUFYX09GRlNFVCk7CisJCW1fb2ZmIC09IDEgKyBNMl9NQVhfT0ZGU0VUOworCQkqb3ArKyA9IE0xX01BUktFUiB8ICgobV9vZmYgJiAzKSA8PCAyKTsKKwkJKm9wKysgPSBtX29mZiA+PiAyOworCX0gZWxzZSBpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQlhc3NlcnQobV9sZW4gPj0gMyk7CisJCW1fb2ZmIC09IDE7CisJCWlmIChtX2xlbiA8PSBNM19NQVhfTEVOKQorCQkJKm9wKysgPSBNM19NQVJLRVIgfCAobV9sZW4gLSAyKTsKKwkJZWxzZSB7CisJCQltX2xlbiAtPSBNM19NQVhfTEVOOworCQkJKm9wKysgPSBNM19NQVJLRVIgfCAwOworCQkJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCQkJbV9sZW4gLT0gMjU1OworCQkJCSpvcCsrID0gMDsKKwkJCX0KKwkJCWFzc2VydChtX2xlbiA+IDApOworCQkJKm9wKysgPSBtX2xlbjsKKwkJfQorCQkqb3ArKyA9IG1fb2ZmIDw8IDI7CisJCSpvcCsrID0gbV9vZmYgPj4gNjsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBrOworCisJCWFzc2VydChtX2xlbiA+PSAzKTsKKwkJYXNzZXJ0KG1fb2ZmID4gMHg0MDAwKTsKKwkJYXNzZXJ0KG1fb2ZmIDw9IDB4YmZmZik7CisJCW1fb2ZmIC09IDB4NDAwMDsKKwkJayA9IChtX29mZiAmIDB4NDAwMCkgPj4gMTE7CisJCWlmIChtX2xlbiA8PSBNNF9NQVhfTEVOKQorCQkJKm9wKysgPSBNNF9NQVJLRVIgfCBrIHwgKG1fbGVuIC0gMik7CisJCWVsc2UgeworCQkJbV9sZW4gLT0gTTRfTUFYX0xFTjsKKwkJCSpvcCsrID0gTTRfTUFSS0VSIHwgayB8IDA7CisJCQl3aGlsZSAobV9sZW4gPiAyNTUpIHsKKwkJCQltX2xlbiAtPSAyNTU7CisJCQkJKm9wKysgPSAwOworCQkJfQorCQkJYXNzZXJ0KG1fbGVuID4gMCk7CisJCQkqb3ArKyA9IG1fbGVuOworCQl9CisJCSpvcCsrID0gbV9vZmYgPDwgMjsKKwkJKm9wKysgPSBtX29mZiA+PiA2OworCX0KKworCXJldHVybiBvcDsKK30KKworCitzdGF0aWMgdWludDhfdCAqU1RPUkVfUlVOKGx6bzF4Xzk5OV90ICpjLCB1aW50OF90ICpvcCwKKwkJY29uc3QgdWludDhfdCAqaWksIHVuc2lnbmVkIHQpCit7CisJaWYgKG9wID09IGMtPm91dCAmJiB0IDw9IDIzOCkgeworCQkqb3ArKyA9IDE3ICsgdDsKKwl9IGVsc2UgaWYgKHQgPD0gMykgeworCQlvcFstMl0gfD0gdDsKKwl9IGVsc2UgaWYgKHQgPD0gMTgpIHsKKwkJKm9wKysgPSB0IC0gMzsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCB0dCA9IHQgLSAxODsKKworCQkqb3ArKyA9IDA7CisJCXdoaWxlICh0dCA+IDI1NSkgeworCQkJdHQgLT0gMjU1OworCQkJKm9wKysgPSAwOworCQl9CisJCWFzc2VydCh0dCA+IDApOworCQkqb3ArKyA9IHR0OworCX0KKwlkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CisKKwlyZXR1cm4gb3A7Cit9CisKKworc3RhdGljIHVpbnQ4X3QgKmNvZGVfcnVuKGx6bzF4Xzk5OV90ICpjLCB1aW50OF90ICpvcCwgY29uc3QgdWludDhfdCAqaWksCisJCXVuc2lnbmVkIGxpdCkKK3sKKwlpZiAobGl0ID4gMCkgeworCQlhc3NlcnQobV9sZW4gPj0gMik7CisJCW9wID0gU1RPUkVfUlVOKGMsIG9wLCBpaSwgbGl0KTsKKwl9IGVsc2UgeworCQlhc3NlcnQobV9sZW4gPj0gMyk7CisJfQorCWMtPnIxX2xpdCA9IGxpdDsKKworCXJldHVybiBvcDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGxlbl9vZl9jb2RlZF9tYXRjaCh1bnNpZ25lZCBtX2xlbiwgdW5zaWduZWQgbV9vZmYsIHVuc2lnbmVkIGxpdCkKK3sKKwlpbnQgbiA9IDQ7CisKKwlpZiAobV9sZW4gPCAyKQorCQlyZXR1cm4gLTE7CisJaWYgKG1fbGVuID09IDIpCisJCXJldHVybiAobV9vZmYgPD0gTTFfTUFYX09GRlNFVCAmJiBsaXQgPiAwICYmIGxpdCA8IDQpID8gMiA6IC0xOworCWlmIChtX2xlbiA8PSBNMl9NQVhfTEVOICYmIG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisJCXJldHVybiAyOworCWlmIChtX2xlbiA9PSBNMl9NSU5fTEVOICYmIG1fb2ZmIDw9IE1YX01BWF9PRkZTRVQgJiYgbGl0ID49IDQpCisJCXJldHVybiAyOworCWlmIChtX29mZiA8PSBNM19NQVhfT0ZGU0VUKSB7CisJCWlmIChtX2xlbiA8PSBNM19NQVhfTEVOKQorCQkJcmV0dXJuIDM7CisJCW1fbGVuIC09IE0zX01BWF9MRU47CisJfSBlbHNlIGlmIChtX29mZiA8PSBNNF9NQVhfT0ZGU0VUKSB7CisJCWlmIChtX2xlbiA8PSBNNF9NQVhfTEVOKQorCQkJcmV0dXJuIDM7CisJCW1fbGVuIC09IE00X01BWF9MRU47CisJfSBlbHNlCisJCXJldHVybiAtMTsKKwl3aGlsZSAobV9sZW4gPiAyNTUpIHsKKwkJbV9sZW4gLT0gMjU1OworCQluKys7CisJfQorCXJldHVybiBuOworfQorCisKK3N0YXRpYyBpbnQgbWluX2dhaW4odW5zaWduZWQgYWhlYWQsIHVuc2lnbmVkIGxpdDEsCisJCSAgICB1bnNpZ25lZCBsaXQyLCBpbnQgbDEsIGludCBsMiwgaW50IGwzKQoreworCWludCBsYXp5X21hdGNoX21pbl9nYWluID0gMDsKKworCWFzc2VydCAoYWhlYWQgPj0gMSk7CisJbGF6eV9tYXRjaF9taW5fZ2FpbiArPSBhaGVhZDsKKworCWlmIChsaXQxIDw9IDMpCisJCWxhenlfbWF0Y2hfbWluX2dhaW4gKz0gKGxpdDIgPD0gMykgPyAwIDogMjsKKwllbHNlIGlmIChsaXQxIDw9IDE4KQorCQlsYXp5X21hdGNoX21pbl9nYWluICs9IChsaXQyIDw9IDE4KSA/IDAgOiAxOworCisJbGF6eV9tYXRjaF9taW5fZ2FpbiArPSAobDIgLSBsMSkgKiAyOworCWlmIChsMyA+IDApCisJCWxhenlfbWF0Y2hfbWluX2dhaW4gLT0gKGFoZWFkIC0gbDMpICogMjsKKworCWlmIChsYXp5X21hdGNoX21pbl9nYWluIDwgMCkKKwkJbGF6eV9tYXRjaF9taW5fZ2FpbiA9IDA7CisKKwlyZXR1cm4gbGF6eV9tYXRjaF9taW5fZ2FpbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisKK3N0YXRpYyB2b2lkIGJldHRlcl9tYXRjaChjb25zdCBsem9fc3dkX3Agc3dkLAorCQkJICAgdW5zaWduZWQgKm1fbGVuLCB1bnNpZ25lZCAqbV9vZmYpCit7CisJaWYgKCptX2xlbiA8PSBNMl9NSU5fTEVOKQorCQlyZXR1cm47CisKKwlpZiAoKm1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisJCXJldHVybjsKKworCS8qIE0zL000IC0+IE0yICovCisJaWYgKCptX29mZiA+IE0yX01BWF9PRkZTRVQKKwkgJiYgKm1fbGVuID49IE0yX01JTl9MRU4gKyAxICYmICptX2xlbiA8PSBNMl9NQVhfTEVOICsgMQorCSAmJiBzd2QtPmJlc3Rfb2ZmWyptX2xlbi0xXSAmJiBzd2QtPmJlc3Rfb2ZmWyptX2xlbi0xXSA8PSBNMl9NQVhfT0ZGU0VUCisJKSB7CisJCSptX2xlbiA9ICptX2xlbiAtIDE7CisJCSptX29mZiA9IHN3ZC0+YmVzdF9vZmZbKm1fbGVuXTsKKwkJcmV0dXJuOworCX0KKworCS8qIE00IC0+IE0yICovCisJaWYgKCptX29mZiA+IE0zX01BWF9PRkZTRVQKKwkgJiYgKm1fbGVuID49IE00X01BWF9MRU4gKyAxICYmICptX2xlbiA8PSBNMl9NQVhfTEVOICsgMgorCSAmJiBzd2QtPmJlc3Rfb2ZmWyptX2xlbi0yXSAmJiBzd2QtPmJlc3Rfb2ZmWyptX2xlbi0yXSA8PSBNMl9NQVhfT0ZGU0VUCisJKSB7CisJCSptX2xlbiA9ICptX2xlbiAtIDI7CisJCSptX29mZiA9IHN3ZC0+YmVzdF9vZmZbKm1fbGVuXTsKKwkJcmV0dXJuOworCX0KKwkvKiBNNCAtPiBNMyAqLworCWlmICgqbV9vZmYgPiBNM19NQVhfT0ZGU0VUCisJICYmICptX2xlbiA+PSBNNF9NQVhfTEVOICsgMSAmJiAqbV9sZW4gPD0gTTNfTUFYX0xFTiArIDEKKwkgJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gPD0gTTNfTUFYX09GRlNFVAorCSkgeworCQkqbV9sZW4gPSAqbV9sZW4gLSAxOworCQkqbV9vZmYgPSBzd2QtPmJlc3Rfb2ZmWyptX2xlbl07CisJfQorfQorCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGx6bzF4Xzk5OV9jb21wcmVzc19pbnRlcm5hbChjb25zdCB1aW50OF90ICppbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkICp3cmttZW0sCisJCXVuc2lnbmVkIGdvb2RfbGVuZ3RoLAorCQl1bnNpZ25lZCBtYXhfbGF6eSwKKwkJdW5zaWduZWQgbWF4X2NoYWluLAorCQl1aW50MzJfdCB1c2VfYmVzdF9vZmYpCit7CisJdWludDhfdCAqb3A7CisJY29uc3QgdWludDhfdCAqaWk7CisJdW5zaWduZWQgbGl0OworCXVuc2lnbmVkIG1fbGVuLCBtX29mZjsKKwlsem8xeF85OTlfdCBjYzsKKwlsem8xeF85OTlfdCAqY29uc3QgYyA9ICZjYzsKKwljb25zdCBsem9fc3dkX3Agc3dkID0gKGx6b19zd2RfcCkgd3JrbWVtOworCWludCByOworCisJYy0+aW5pdCA9IDA7CisJYy0+aXAgPSBjLT5pbiA9IGluOworCWMtPmluX2VuZCA9IGluICsgaW5fbGVuOworCWMtPm91dCA9IG91dDsKKworCW9wID0gb3V0OworCWlpID0gYy0+aXA7ICAgICAgICAgICAgIC8qIHBvaW50IHRvIHN0YXJ0IG9mIGxpdGVyYWwgcnVuICovCisJbGl0ID0gMDsKKwljLT5yMV9saXQgPSAwOworCisJciA9IGluaXRfbWF0Y2goYywgc3dkLCB1c2VfYmVzdF9vZmYpOworCWlmIChyICE9IDApCisJCXJldHVybiByOworCXN3ZC0+bWF4X2NoYWluID0gbWF4X2NoYWluOworCisJciA9IGZpbmRfbWF0Y2goYywgc3dkLCAwLCAwKTsKKwlpZiAociAhPSAwKQorCQlyZXR1cm4gcjsKKworCXdoaWxlIChjLT5sb29rID4gMCkgeworCQl1bnNpZ25lZCBhaGVhZDsKKwkJdW5zaWduZWQgbWF4X2FoZWFkOworCQlpbnQgbDEsIGwyLCBsMzsKKworCQltX2xlbiA9IGMtPm1fbGVuOworCQltX29mZiA9IGMtPm1fb2ZmOworCisJCWFzc2VydChjLT5icCA9PSBjLT5pcCAtIGMtPmxvb2spOworCQlhc3NlcnQoYy0+YnAgPj0gaW4pOworCQlpZiAobGl0ID09IDApCisJCQlpaSA9IGMtPmJwOworCQlhc3NlcnQoaWkgKyBsaXQgPT0gYy0+YnApOworCQlhc3NlcnQoc3dkLT5iX2NoYXIgPT0gKihjLT5icCkpOworCisJCWlmIChtX2xlbiA8IDIKKwkJIHx8IChtX2xlbiA9PSAyICYmIChtX29mZiA+IE0xX01BWF9PRkZTRVQgfHwgbGl0ID09IDAgfHwgbGl0ID49IDQpKQorCQkgICAgLyogRG8gbm90IGFjY2VwdCB0aGlzIG1hdGNoIGZvciBjb21wcmVzc2VkLWRhdGEgY29tcGF0aWJpbGl0eQorCQkgICAgICogd2l0aCBMWk8gdjEuMDEgYW5kIGJlZm9yZQorCQkgICAgICogWyBtaWdodCBiZSBhIHByb2JsZW0gZm9yIGRlY29tcHJlc3MoKSBhbmQgb3B0aW1pemUoKSBdCisJCSAgICAgKi8KKwkJIHx8IChtX2xlbiA9PSAyICYmIG9wID09IG91dCkKKwkJIHx8IChvcCA9PSBvdXQgJiYgbGl0ID09IDApCisJCSkgeworCQkJLyogYSBsaXRlcmFsICovCisJCQltX2xlbiA9IDA7CisJCX0KKwkJZWxzZSBpZiAobV9sZW4gPT0gTTJfTUlOX0xFTikgeworCQkJLyogY29tcHJlc3Npb24gcmF0aW8gaW1wcm92ZXMgaWYgd2UgY29kZSBhIGxpdGVyYWwgaW4gc29tZSBjYXNlcyAqLworCQkJaWYgKG1fb2ZmID4gTVhfTUFYX09GRlNFVCAmJiBsaXQgPj0gNCkKKwkJCQltX2xlbiA9IDA7CisJCX0KKworCQlpZiAobV9sZW4gPT0gMCkgeworCQkJLyogYSBsaXRlcmFsICovCisJCQlsaXQrKzsKKwkJCXN3ZC0+bWF4X2NoYWluID0gbWF4X2NoYWluOworCQkJciA9IGZpbmRfbWF0Y2goYywgc3dkLCAxLCAwKTsKKwkJCWFzc2VydChyID09IDApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBhIG1hdGNoICovCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJCWlmIChzd2QtPnVzZV9iZXN0X29mZikKKwkJCWJldHRlcl9tYXRjaChzd2QsICZtX2xlbiwgJm1fb2ZmKTsKKyNlbmRpZgorCisJCS8qIHNoYWxsIHdlIHRyeSBhIGxhenkgbWF0Y2ggPyAqLworCQlhaGVhZCA9IDA7CisJCWlmIChtX2xlbiA+PSBtYXhfbGF6eSkgeworCQkJLyogbm8gKi8KKwkJCWwxID0gMDsKKwkJCW1heF9haGVhZCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiB5ZXMsIHRyeSBhIGxhenkgbWF0Y2ggKi8KKwkJCWwxID0gbGVuX29mX2NvZGVkX21hdGNoKG1fbGVuLCBtX29mZiwgbGl0KTsKKwkJCWFzc2VydChsMSA+IDApOworCQkJbWF4X2FoZWFkID0gTFpPX01JTigyLCAodW5zaWduZWQpbDEgLSAxKTsKKwkJfQorCisKKwkJd2hpbGUgKGFoZWFkIDwgbWF4X2FoZWFkICYmIGMtPmxvb2sgPiBtX2xlbikgeworCQkJaW50IGxhenlfbWF0Y2hfbWluX2dhaW47CisKKwkJCWlmIChtX2xlbiA+PSBnb29kX2xlbmd0aCkKKwkJCQlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbiA+PiAyOworCQkJZWxzZQorCQkJCXN3ZC0+bWF4X2NoYWluID0gbWF4X2NoYWluOworCQkJciA9IGZpbmRfbWF0Y2goYywgc3dkLCAxLCAwKTsKKwkJCWFoZWFkKys7CisKKwkJCWFzc2VydChyID09IDApOworCQkJYXNzZXJ0KGMtPmxvb2sgPiAwKTsKKwkJCWFzc2VydChpaSArIGxpdCArIGFoZWFkID09IGMtPmJwKTsKKworCQkJaWYgKGMtPm1fbGVuIDwgbV9sZW4pCisJCQkJY29udGludWU7CisJCQlpZiAoYy0+bV9sZW4gPT0gbV9sZW4gJiYgYy0+bV9vZmYgPj0gbV9vZmYpCisJCQkJY29udGludWU7CisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJCQlpZiAoc3dkLT51c2VfYmVzdF9vZmYpCisJCQkJYmV0dGVyX21hdGNoKHN3ZCwgJmMtPm1fbGVuLCAmYy0+bV9vZmYpOworI2VuZGlmCisJCQlsMiA9IGxlbl9vZl9jb2RlZF9tYXRjaChjLT5tX2xlbiwgYy0+bV9vZmYsIGxpdCthaGVhZCk7CisJCQlpZiAobDIgPCAwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBjb21wcmVzc2VkLWRhdGEgY29tcGF0aWJpbGl0eSBbc2VlIGFib3ZlXSAqLworCQkJbDMgPSAob3AgPT0gb3V0KSA/IC0xIDogbGVuX29mX2NvZGVkX21hdGNoKGFoZWFkLCBtX29mZiwgbGl0KTsKKworCQkJbGF6eV9tYXRjaF9taW5fZ2FpbiA9IG1pbl9nYWluKGFoZWFkLCBsaXQsIGxpdCthaGVhZCwgbDEsIGwyLCBsMyk7CisJCQlpZiAoYy0+bV9sZW4gPj0gbV9sZW4gKyBsYXp5X21hdGNoX21pbl9nYWluKSB7CisJCQkJaWYgKGwzID4gMCkgeworCQkJCQkvKiBjb2RlIHByZXZpb3VzIHJ1biAqLworCQkJCQlvcCA9IGNvZGVfcnVuKGMsIG9wLCBpaSwgbGl0KTsKKwkJCQkJbGl0ID0gMDsKKwkJCQkJLyogY29kZSBzaG9ydGVuZWQgbWF0Y2ggKi8KKwkJCQkJb3AgPSBjb2RlX21hdGNoKGMsIG9wLCBhaGVhZCwgbV9vZmYpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpdCArPSBhaGVhZDsKKwkJCQkJYXNzZXJ0KGlpICsgbGl0ID09IGMtPmJwKTsKKwkJCQl9CisJCQkJZ290byBsYXp5X21hdGNoX2RvbmU7CisJCQl9CisJCX0KKworCQlhc3NlcnQoaWkgKyBsaXQgKyBhaGVhZCA9PSBjLT5icCk7CisKKwkJLyogMSAtIGNvZGUgcnVuICovCisJCW9wID0gY29kZV9ydW4oYywgb3AsIGlpLCBsaXQpOworCQlsaXQgPSAwOworCisJCS8qIDIgLSBjb2RlIG1hdGNoICovCisJCW9wID0gY29kZV9tYXRjaChjLCBvcCwgbV9sZW4sIG1fb2ZmKTsKKwkJc3dkLT5tYXhfY2hhaW4gPSBtYXhfY2hhaW47CisJCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgbV9sZW4sIDErYWhlYWQpOworCQlhc3NlcnQociA9PSAwKTsKKworIGxhenlfbWF0Y2hfZG9uZTogOworCX0KKworCS8qIHN0b3JlIGZpbmFsIHJ1biAqLworCWlmIChsaXQgPiAwKQorCQlvcCA9IFNUT1JFX1JVTihjLCBvcCwgaWksIGxpdCk7CisKKyNpZiBkZWZpbmVkKExaT19FT0ZfQ09ERSkKKwkqb3ArKyA9IE00X01BUktFUiB8IDE7CisJKm9wKysgPSAwOworCSpvcCsrID0gMDsKKyNlbmRpZgorCisJKm91dF9sZW4gPSBvcCAtIG91dDsKKworCXJldHVybiBMWk9fRV9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbHpvMXhfOTk5X2NvbXByZXNzX2xldmVsKGNvbnN0IHVpbnQ4X3QgKmluLCB1bnNpZ25lZCBpbl9sZW4sCisJCXVpbnQ4X3QgKm91dCwgdW5zaWduZWQgKm91dF9sZW4sCisJCXZvaWQgKndya21lbSwKKwkJaW50IGNvbXByZXNzaW9uX2xldmVsKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1aW50MTZfdCBnb29kX2xlbmd0aDsKKwkJdWludDE2X3QgbWF4X2xhenk7CisJCXVpbnQxNl90IG1heF9jaGFpbjsKKwkJdWludDE2X3QgdXNlX2Jlc3Rfb2ZmOworCX0gY1szXSA9IHsKKwkJeyAgICAgOCwgICAgMzIsICAyNTYsICAgMCB9LAorCQl7ICAgIDMyLCAgIDEyOCwgMjA0OCwgICAxIH0sCisJCXsgU1dEX0YsIFNXRF9GLCA0MDk2LCAgIDEgfSAgICAgICAvKiBtYXguIGNvbXByZXNzaW9uICovCisJfTsKKworCWlmIChjb21wcmVzc2lvbl9sZXZlbCA8IDcgfHwgY29tcHJlc3Npb25fbGV2ZWwgPiA5KQorCQlyZXR1cm4gTFpPX0VfRVJST1I7CisKKwljb21wcmVzc2lvbl9sZXZlbCAtPSA3OworCXJldHVybiBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwoaW4sIGluX2xlbiwgb3V0LCBvdXRfbGVuLCB3cmttZW0sCisJCQkJCSAgIGNbY29tcHJlc3Npb25fbGV2ZWxdLmdvb2RfbGVuZ3RoLAorCQkJCQkgICBjW2NvbXByZXNzaW9uX2xldmVsXS5tYXhfbGF6eSwKKwkJCQkJICAgY1tjb21wcmVzc2lvbl9sZXZlbF0ubWF4X2NoYWluLAorCQkJCQkgICBjW2NvbXByZXNzaW9uX2xldmVsXS51c2VfYmVzdF9vZmYpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF9jLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4X2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzg2Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF9jLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMWk8xW1hZXS0xIGNvbXByZXNzaW9uIGFsZ29yaXRobQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni4uMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGNvbXByZXNzIGEgYmxvY2sgb2YgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBOT0lOTElORSB1bnNpZ25lZAorZG9fY29tcHJlc3MoY29uc3QgdWludDhfdCogaW4sIHVuc2lnbmVkIGluX2xlbiwKKwkJdWludDhfdCogb3V0LCB1bnNpZ25lZCogb3V0X2xlbiwKKwkJdm9pZCogd3JrbWVtKQoreworCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIGlwOworCXVpbnQ4X3QqIG9wOworCWNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluX2VuZCA9IGluICsgaW5fbGVuOworCWNvbnN0IHVpbnQ4X3QqIGNvbnN0IGlwX2VuZCA9IGluICsgaW5fbGVuIC0gTTJfTUFYX0xFTiAtIDU7CisJY29uc3QgdWludDhfdCogaWk7CisJY29uc3Qgdm9pZCogKmNvbnN0IGRpY3QgPSAoY29uc3Qgdm9pZCoqKSB3cmttZW07CisKKwlvcCA9IG91dDsKKwlpcCA9IGluOworCWlpID0gaXA7CisKKwlpcCArPSA0OworCWZvciAoOzspIHsKKwkJcmVnaXN0ZXIgY29uc3QgdWludDhfdCogbV9wb3M7CisJCXVuc2lnbmVkIG1fb2ZmOworCQl1bnNpZ25lZCBtX2xlbjsKKwkJdW5zaWduZWQgZGluZGV4OworCisJCURfSU5ERVgxKGRpbmRleCxpcCk7CisJCUdJTkRFWChtX3BvcyxtX29mZixkaWN0LGRpbmRleCxpbik7CisJCWlmIChMWk9fQ0hFQ0tfTVBPU19OT05fREVUKG1fcG9zLG1fb2ZmLGluLGlwLE00X01BWF9PRkZTRVQpKQorCQkJZ290byBsaXRlcmFsOworI2lmIDEKKwkJaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQgfHwgbV9wb3NbM10gPT0gaXBbM10pCisJCQlnb3RvIHRyeV9tYXRjaDsKKwkJRF9JTkRFWDIoZGluZGV4LGlwKTsKKyNlbmRpZgorCQlHSU5ERVgobV9wb3MsbV9vZmYsZGljdCxkaW5kZXgsaW4pOworCQlpZiAoTFpPX0NIRUNLX01QT1NfTk9OX0RFVChtX3BvcyxtX29mZixpbixpcCxNNF9NQVhfT0ZGU0VUKSkKKwkJCWdvdG8gbGl0ZXJhbDsKKwkJaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQgfHwgbV9wb3NbM10gPT0gaXBbM10pCisJCQlnb3RvIHRyeV9tYXRjaDsKKwkJZ290byBsaXRlcmFsOworCisgdHJ5X21hdGNoOgorI2lmIDEgJiYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzIpCisJCWlmICgqIChjb25zdCBsem9fdXNob3J0cCkgbV9wb3MgIT0gKiAoY29uc3QgbHpvX3VzaG9ydHApIGlwKQorI2Vsc2UKKwkJaWYgKG1fcG9zWzBdICE9IGlwWzBdIHx8IG1fcG9zWzFdICE9IGlwWzFdKQorI2VuZGlmCisJCXsKKwkJfSBlbHNlIHsKKwkJCWlmIChtX3Bvc1syXSA9PSBpcFsyXSkgeworI2lmIDAKKwkJCQlpZiAobV9vZmYgPD0gTTJfTUFYX09GRlNFVCkKKwkJCQkJZ290byBtYXRjaDsKKwkJCQlpZiAobGl0IDw9IDMpCisJCQkJCWdvdG8gbWF0Y2g7CisJCQkJaWYgKGxpdCA9PSAzKSB7CQkJICAvKiBiZXR0ZXIgY29tcHJlc3Npb24sIGJ1dCBzbG93ZXIgKi8KKwkJCQkJYXNzZXJ0KG9wIC0gMiA+IG91dCk7IG9wWy0yXSB8PSAodWludDhfdCkoMyk7CisJCQkJCSpvcCsrID0gKmlpKys7ICpvcCsrID0gKmlpKys7ICpvcCsrID0gKmlpKys7CisJCQkJCWdvdG8gY29kZV9tYXRjaDsKKwkJCQl9CisJCQkJaWYgKG1fcG9zWzNdID09IGlwWzNdKQorI2VuZGlmCisJCQkJCWdvdG8gbWF0Y2g7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBzdGlsbCBuZWVkIGEgYmV0dGVyIHdheSBmb3IgZmluZGluZyBNMSBtYXRjaGVzICovCisjaWYgMAorCQkJCS8qIGEgTTEgbWF0Y2ggKi8KKyNpZiAwCisJCQkJaWYgKG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQgJiYgbGl0ID4gMCAmJiBsaXQgPD0gMykKKyNlbHNlCisJCQkJaWYgKG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQgJiYgbGl0ID09IDMpCisjZW5kaWYKKwkJCQl7CisJCQkJCXJlZ2lzdGVyIHVuc2lnbmVkIHQ7CisKKwkJCQkJdCA9IGxpdDsKKwkJCQkJYXNzZXJ0KG9wIC0gMiA+IG91dCk7IG9wWy0yXSB8PSAodWludDhfdCkodCk7CisJCQkJCWRvICpvcCsrID0gKmlpKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJCQkJYXNzZXJ0KGlpID09IGlwKTsKKwkJCQkJbV9vZmYgLT0gMTsKKwkJCQkJKm9wKysgPSAodWludDhfdCkoTTFfTUFSS0VSIHwgKChtX29mZiAmIDMpIDw8IDIpKTsKKwkJCQkJKm9wKysgPSAodWludDhfdCkobV9vZmYgPj4gMik7CisJCQkJCWlwICs9IDI7CisJCQkJCWdvdG8gbWF0Y2hfZG9uZTsKKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCS8qIGEgbGl0ZXJhbCAqLworIGxpdGVyYWw6CisJCVVQREFURV9JKGRpY3QsIDAsIGRpbmRleCwgaXAsIGluKTsKKwkJKytpcDsKKwkJaWYgKGlwID49IGlwX2VuZCkKKwkJCWJyZWFrOworCQljb250aW51ZTsKKworCQkvKiBhIG1hdGNoICovCittYXRjaDoKKwkJVVBEQVRFX0koZGljdCwgMCwgZGluZGV4LCBpcCwgaW4pOworCQkvKiBzdG9yZSBjdXJyZW50IGxpdGVyYWwgcnVuICovCisJCWlmIChwZChpcCwgaWkpID4gMCkgeworCQkJcmVnaXN0ZXIgdW5zaWduZWQgdCA9IHBkKGlwLCBpaSk7CisKKwkJCWlmICh0IDw9IDMpIHsKKwkJCQlhc3NlcnQob3AgLSAyID4gb3V0KTsKKwkJCQlvcFstMl0gfD0gKHVpbnQ4X3QpKHQpOworCQkJfQorCQkJZWxzZSBpZiAodCA8PSAxOCkKKwkJCQkqb3ArKyA9ICh1aW50OF90KSh0IC0gMyk7CisJCQllbHNlIHsKKwkJCQlyZWdpc3RlciB1bnNpZ25lZCB0dCA9IHQgLSAxODsKKworCQkJCSpvcCsrID0gMDsKKwkJCQl3aGlsZSAodHQgPiAyNTUpIHsKKwkJCQkJdHQgLT0gMjU1OworCQkJCQkqb3ArKyA9IDA7CisJCQkJfQorCQkJCWFzc2VydCh0dCA+IDApOworCQkJCSpvcCsrID0gKHVpbnQ4X3QpKHR0KTsKKwkJCX0KKwkJCWRvICpvcCsrID0gKmlpKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJfQorCisJCS8qIGNvZGUgdGhlIG1hdGNoICovCisJCWFzc2VydChpaSA9PSBpcCk7CisJCWlwICs9IDM7CisJCWlmIChtX3Bvc1szXSAhPSAqaXArKyB8fCBtX3Bvc1s0XSAhPSAqaXArKyB8fCBtX3Bvc1s1XSAhPSAqaXArKworCQkgfHwgbV9wb3NbNl0gIT0gKmlwKysgfHwgbV9wb3NbN10gIT0gKmlwKysgfHwgbV9wb3NbOF0gIT0gKmlwKysKKyNpZmRlZiBMWk8xWQorCQkgfHwgbV9wb3NbIDldICE9ICppcCsrIHx8IG1fcG9zWzEwXSAhPSAqaXArKyB8fCBtX3Bvc1sxMV0gIT0gKmlwKysKKwkJIHx8IG1fcG9zWzEyXSAhPSAqaXArKyB8fCBtX3Bvc1sxM10gIT0gKmlwKysgfHwgbV9wb3NbMTRdICE9ICppcCsrCisjZW5kaWYKKwkJKSB7CisJCQktLWlwOworCQkJbV9sZW4gPSBwZChpcCwgaWkpOworCQkJYXNzZXJ0KG1fbGVuID49IDMpOworCQkJYXNzZXJ0KG1fbGVuIDw9IE0yX01BWF9MRU4pOworCisJCQlpZiAobV9vZmYgPD0gTTJfTUFYX09GRlNFVCkgeworCQkJCW1fb2ZmIC09IDE7CisjaWYgZGVmaW5lZChMWk8xWCkKKwkJCQkqb3ArKyA9ICh1aW50OF90KSgoKG1fbGVuIC0gMSkgPDwgNSkgfCAoKG1fb2ZmICYgNykgPDwgMikpOworCQkJCSpvcCsrID0gKHVpbnQ4X3QpKG1fb2ZmID4+IDMpOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKwkJCQkqb3ArKyA9ICh1aW50OF90KSgoKG1fbGVuICsgMSkgPDwgNCkgfCAoKG1fb2ZmICYgMykgPDwgMikpOworCQkJCSpvcCsrID0gKHVpbnQ4X3QpKG1fb2ZmID4+IDIpOworI2VuZGlmCisJCQl9CisJCQllbHNlIGlmIChtX29mZiA8PSBNM19NQVhfT0ZGU0VUKSB7CisJCQkJbV9vZmYgLT0gMTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShNM19NQVJLRVIgfCAobV9sZW4gLSAyKSk7CisJCQkJZ290byBtM19tNF9vZmZzZXQ7CisJCQl9IGVsc2UgeworI2lmIGRlZmluZWQoTFpPMVgpCisJCQkJbV9vZmYgLT0gMHg0MDAwOworCQkJCWFzc2VydChtX29mZiA+IDApOworCQkJCWFzc2VydChtX29mZiA8PSAweDdmZmYpOworCQkJCSpvcCsrID0gKHVpbnQ4X3QpKE00X01BUktFUiB8ICgobV9vZmYgJiAweDQwMDApID4+IDExKSB8IChtX2xlbiAtIDIpKTsKKwkJCQlnb3RvIG0zX200X29mZnNldDsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCQkJZ290byBtNF9tYXRjaDsKKyNlbmRpZgorCQkJfQorCQl9CisJCWVsc2UgeworCQkJeworCQkJCWNvbnN0IHVpbnQ4X3QqIGVuZCA9IGluX2VuZDsKKwkJCQljb25zdCB1aW50OF90KiBtID0gbV9wb3MgKyBNMl9NQVhfTEVOICsgMTsKKwkJCQl3aGlsZSAoaXAgPCBlbmQgJiYgKm0gPT0gKmlwKQorCQkJCQltKyssIGlwKys7CisJCQkJbV9sZW4gPSBwZChpcCwgaWkpOworCQkJfQorCQkJYXNzZXJ0KG1fbGVuID4gTTJfTUFYX0xFTik7CisKKwkJCWlmIChtX29mZiA8PSBNM19NQVhfT0ZGU0VUKSB7CisJCQkJbV9vZmYgLT0gMTsKKwkJCQlpZiAobV9sZW4gPD0gMzMpCisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKE0zX01BUktFUiB8IChtX2xlbiAtIDIpKTsKKwkJCQllbHNlIHsKKwkJCQkJbV9sZW4gLT0gMzM7CisJCQkJCSpvcCsrID0gTTNfTUFSS0VSIHwgMDsKKwkJCQkJZ290byBtM19tNF9sZW47CisJCQkJfQorCQkJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKExaTzFZKQorIG00X21hdGNoOgorI2VuZGlmCisJCQkJbV9vZmYgLT0gMHg0MDAwOworCQkJCWFzc2VydChtX29mZiA+IDApOworCQkJCWFzc2VydChtX29mZiA8PSAweDdmZmYpOworCQkJCWlmIChtX2xlbiA8PSBNNF9NQVhfTEVOKQorCQkJCQkqb3ArKyA9ICh1aW50OF90KShNNF9NQVJLRVIgfCAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkgfCAobV9sZW4gLSAyKSk7CisJCQkJZWxzZSB7CisJCQkJCW1fbGVuIC09IE00X01BWF9MRU47CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKE00X01BUktFUiB8ICgobV9vZmYgJiAweDQwMDApID4+IDExKSk7CisgbTNfbTRfbGVuOgorCQkJCQl3aGlsZSAobV9sZW4gPiAyNTUpIHsKKwkJCQkJCW1fbGVuIC09IDI1NTsKKwkJCQkJCSpvcCsrID0gMDsKKwkJCQkJfQorCQkJCQlhc3NlcnQobV9sZW4gPiAwKTsKKwkJCQkJKm9wKysgPSAodWludDhfdCkobV9sZW4pOworCQkJCX0KKwkJCX0KKyBtM19tNF9vZmZzZXQ6CisJCQkqb3ArKyA9ICh1aW50OF90KSgobV9vZmYgJiA2MykgPDwgMik7CisJCQkqb3ArKyA9ICh1aW50OF90KShtX29mZiA+PiA2KTsKKwkJfQorI2lmIDAKKyBtYXRjaF9kb25lOgorI2VuZGlmCisJCWlpID0gaXA7CisJCWlmIChpcCA+PSBpcF9lbmQpCisJCQlicmVhazsKKwl9CisKKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiBwZChpbl9lbmQsIGlpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBwdWJsaWMgZW50cnkgcG9pbnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBET19DT01QUkVTUyhjb25zdCB1aW50OF90KiBpbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90KiBvdXQsIHVuc2lnbmVkKiBvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0pCit7CisJdWludDhfdCogb3AgPSBvdXQ7CisJdW5zaWduZWQgdDsKKworCWlmIChpbl9sZW4gPD0gTTJfTUFYX0xFTiArIDUpCisJCXQgPSBpbl9sZW47CisJZWxzZSB7CisJCXQgPSBkb19jb21wcmVzcyhpbixpbl9sZW4sb3Asb3V0X2xlbix3cmttZW0pOworCQlvcCArPSAqb3V0X2xlbjsKKwl9CisKKwlpZiAodCA+IDApIHsKKwkJY29uc3QgdWludDhfdCogaWkgPSBpbiArIGluX2xlbiAtIHQ7CisKKwkJaWYgKG9wID09IG91dCAmJiB0IDw9IDIzOCkKKwkJCSpvcCsrID0gKHVpbnQ4X3QpKDE3ICsgdCk7CisJCWVsc2UgaWYgKHQgPD0gMykKKwkJCW9wWy0yXSB8PSAodWludDhfdCkodCk7CisJCWVsc2UgaWYgKHQgPD0gMTgpCisJCQkqb3ArKyA9ICh1aW50OF90KSh0IC0gMyk7CisJCWVsc2UgeworCQkJdW5zaWduZWQgdHQgPSB0IC0gMTg7CisKKwkJCSpvcCsrID0gMDsKKwkJCXdoaWxlICh0dCA+IDI1NSkgeworCQkJCXR0IC09IDI1NTsKKwkJCQkqb3ArKyA9IDA7CisJCQl9CisJCQlhc3NlcnQodHQgPiAwKTsKKwkJCSpvcCsrID0gKHVpbnQ4X3QpKHR0KTsKKwkJfQorCQlkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CisJfQorCisJKm9wKysgPSBNNF9NQVJLRVIgfCAxOworCSpvcCsrID0gMDsKKwkqb3ArKyA9IDA7CisKKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiAwOyAvKkxaT19FX09LKi8KK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfZC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4YTg1NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfZC5jCkBAIC0wLDAgKzEsNDIwIEBACisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTFpPMVggZGVjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYmx6by5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGRlY29tcHJlc3MgYSBibG9jayBvZiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc2FmZSBkZWNvbXByZXNzaW9uIHdpdGggb3ZlcnJ1biB0ZXN0aW5nICovCitpbnQgbHpvMXhfZGVjb21wcmVzc19zYWZlKGNvbnN0IHVpbnQ4X3QqIGluLCB1bnNpZ25lZCBpbl9sZW4sCisJCXVpbnQ4X3QqIG91dCwgdW5zaWduZWQqIG91dF9sZW4sCisJCXZvaWQqIHdya21lbSBVTlVTRURfUEFSQU0pCit7CisJcmVnaXN0ZXIgdWludDhfdCogb3A7CisJcmVnaXN0ZXIgY29uc3QgdWludDhfdCogaXA7CisJcmVnaXN0ZXIgdW5zaWduZWQgdDsKKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKwl1bnNpZ25lZCBtX29mZjsKKwljb25zdCB1aW50OF90KiBkaWN0X2VuZDsKKyNlbHNlCisJcmVnaXN0ZXIgY29uc3QgdWludDhfdCogbV9wb3MgPSBOVUxMOyAvKiBwb3NzaWJseSBub3QgbmVlZGVkICovCisjZW5kaWYKKwljb25zdCB1aW50OF90KiBjb25zdCBpcF9lbmQgPSBpbiArIGluX2xlbjsKKyNpZiBkZWZpbmVkKEhBVkVfQU5ZX09QKQorCXVpbnQ4X3QqIGNvbnN0IG9wX2VuZCA9IG91dCArICpvdXRfbGVuOworI2VuZGlmCisjaWYgZGVmaW5lZChMWk8xWikKKwl1bnNpZ25lZCBsYXN0X21fb2ZmID0gMDsKKyNlbmRpZgorCisvLwlMWk9fVU5VU0VEKHdya21lbSk7CisKKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKwlpZiAoZGljdCkgeworCQlpZiAoZGljdF9sZW4gPiBNNF9NQVhfT0ZGU0VUKSB7CisJCQlkaWN0ICs9IGRpY3RfbGVuIC0gTTRfTUFYX09GRlNFVDsKKwkJCWRpY3RfbGVuID0gTTRfTUFYX09GRlNFVDsKKwkJfQorCQlkaWN0X2VuZCA9IGRpY3QgKyBkaWN0X2xlbjsKKwl9IGVsc2UgeworCQlkaWN0X2xlbiA9IDA7CisJCWRpY3RfZW5kID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisKKwkqb3V0X2xlbiA9IDA7CisKKwlvcCA9IG91dDsKKwlpcCA9IGluOworCisJaWYgKCppcCA+IDE3KSB7CisJCXQgPSAqaXArKyAtIDE3OworCQlpZiAodCA8IDQpCisJCQlnb3RvIG1hdGNoX25leHQ7CisJCWFzc2VydCh0ID4gMCk7IE5FRURfT1AodCk7IE5FRURfSVAodCsxKTsKKwkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCQlnb3RvIGZpcnN0X2xpdGVyYWxfcnVuOworCX0KKworCXdoaWxlIChURVNUX0lQICYmIFRFU1RfT1ApIHsKKwkJdCA9ICppcCsrOworCQlpZiAodCA+PSAxNikKKwkJCWdvdG8gbWF0Y2g7CisJCS8qIGEgbGl0ZXJhbCBydW4gKi8KKwkJaWYgKHQgPT0gMCkgeworCQkJTkVFRF9JUCgxKTsKKwkJCXdoaWxlICgqaXAgPT0gMCkgeworCQkJCXQgKz0gMjU1OworCQkJCWlwKys7CisJCQkJTkVFRF9JUCgxKTsKKwkJCX0KKwkJCXQgKz0gMTUgKyAqaXArKzsKKwkJfQorCQkvKiBjb3B5IGxpdGVyYWxzICovCisJCWFzc2VydCh0ID4gMCk7CisJCU5FRURfT1AodCszKTsKKwkJTkVFRF9JUCh0KzQpOworI2lmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KSB8fCBkZWZpbmVkKExaT19BTElHTkVEX09LXzQpCisjIGlmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKwkJaWYgKFBUUl9BTElHTkVEMl80KG9wLCBpcCkpCisjIGVuZGlmCisJCXsKKwkJCUNPUFk0KG9wLCBpcCk7CisJCQlvcCArPSA0OworCQkJaXAgKz0gNDsKKwkJCWlmICgtLXQgPiAwKSB7CisJCQkJaWYgKHQgPj0gNCkgeworCQkJCQlkbyB7CisJCQkJCQlDT1BZNChvcCwgaXApOworCQkJCQkJb3AgKz0gNDsKKwkJCQkJCWlwICs9IDQ7CisJCQkJCQl0IC09IDQ7CisJCQkJCX0gd2hpbGUgKHQgPj0gNCk7CisJCQkJCWlmICh0ID4gMCkKKwkJCQkJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisJCQkJfQorCQkJfQorCQl9CisjIGlmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKwkJZWxzZQorIyBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KQorCQl7CisJCQkqb3ArKyA9ICppcCsrOworCQkJKm9wKysgPSAqaXArKzsKKwkJCSpvcCsrID0gKmlwKys7CisJCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisJCX0KKyNlbmRpZgorCisgZmlyc3RfbGl0ZXJhbF9ydW46CisJCXQgPSAqaXArKzsKKwkJaWYgKHQgPj0gMTYpCisJCQlnb3RvIG1hdGNoOworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisJCW1fb2ZmID0gKDEgKyBNMl9NQVhfT0ZGU0VUKSArICh0IDw8IDYpICsgKCppcCsrID4+IDIpOworCQlsYXN0X21fb2ZmID0gbV9vZmY7CisjZWxzZQorCQltX29mZiA9ICgxICsgTTJfTUFYX09GRlNFVCkgKyAodCA+PiAyKSArICgqaXArKyA8PCAyKTsKKyNlbmRpZgorCQlORUVEX09QKDMpOworCQl0ID0gMzsgQ09QWV9ESUNUKHQsbV9vZmYpCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKwkJdCA9ICgxICsgTTJfTUFYX09GRlNFVCkgKyAodCA8PCA2KSArICgqaXArKyA+PiAyKTsKKwkJbV9wb3MgPSBvcCAtIHQ7CisJCWxhc3RfbV9vZmYgPSB0OworI2Vsc2UKKwkJbV9wb3MgPSBvcCAtICgxICsgTTJfTUFYX09GRlNFVCk7CisJCW1fcG9zIC09IHQgPj4gMjsKKwkJbV9wb3MgLT0gKmlwKysgPDwgMjsKKyNlbmRpZgorCQlURVNUX0xCKG1fcG9zKTsgTkVFRF9PUCgzKTsKKwkJKm9wKysgPSAqbV9wb3MrKzsKKwkJKm9wKysgPSAqbV9wb3MrKzsKKwkJKm9wKysgPSAqbV9wb3M7CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisJCWdvdG8gbWF0Y2hfZG9uZTsKKworCQkvKiBoYW5kbGUgbWF0Y2hlcyAqLworCQlkbyB7CisgbWF0Y2g6CisJCQlpZiAodCA+PSA2NCkgewkJLyogYSBNMiBtYXRjaCAqLworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVgpCisJCQkJbV9vZmYgPSAxICsgKCh0ID4+IDIpICYgNykgKyAoKmlwKysgPDwgMyk7CisJCQkJdCA9ICh0ID4+IDUpIC0gMTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCQkJbV9vZmYgPSAxICsgKCh0ID4+IDIpICYgMykgKyAoKmlwKysgPDwgMik7CisJCQkJdCA9ICh0ID4+IDQpIC0gMzsKKyNlbGlmIGRlZmluZWQoTFpPMVopCisJCQkJbV9vZmYgPSB0ICYgMHgxZjsKKwkJCQlpZiAobV9vZmYgPj0gMHgxYykKKwkJCQkJbV9vZmYgPSBsYXN0X21fb2ZmOworCQkJCWVsc2UgeworCQkJCQltX29mZiA9IDEgKyAobV9vZmYgPDwgNikgKyAoKmlwKysgPj4gMik7CisJCQkJCWxhc3RfbV9vZmYgPSBtX29mZjsKKwkJCQl9CisJCQkJdCA9ICh0ID4+IDUpIC0gMTsKKyNlbmRpZgorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVgpCisJCQkJbV9wb3MgPSBvcCAtIDE7CisJCQkJbV9wb3MgLT0gKHQgPj4gMikgJiA3OworCQkJCW1fcG9zIC09ICppcCsrIDw8IDM7CisJCQkJdCA9ICh0ID4+IDUpIC0gMTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCQkJbV9wb3MgPSBvcCAtIDE7CisJCQkJbV9wb3MgLT0gKHQgPj4gMikgJiAzOworCQkJCW1fcG9zIC09ICppcCsrIDw8IDI7CisJCQkJdCA9ICh0ID4+IDQpIC0gMzsKKyNlbGlmIGRlZmluZWQoTFpPMVopCisJCQkJeworCQkJCQl1bnNpZ25lZCBvZmYgPSB0ICYgMHgxZjsKKwkJCQkJbV9wb3MgPSBvcDsKKwkJCQkJaWYgKG9mZiA+PSAweDFjKSB7CisJCQkJCQlhc3NlcnQobGFzdF9tX29mZiA+IDApOworCQkJCQkJbV9wb3MgLT0gbGFzdF9tX29mZjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW9mZiA9IDEgKyAob2ZmIDw8IDYpICsgKCppcCsrID4+IDIpOworCQkJCQkJbV9wb3MgLT0gb2ZmOworCQkJCQkJbGFzdF9tX29mZiA9IG9mZjsKKwkJCQkJfQorCQkJCX0KKwkJCQl0ID0gKHQgPj4gNSkgLSAxOworI2VuZGlmCisJCQkJVEVTVF9MQihtX3Bvcyk7IGFzc2VydCh0ID4gMCk7IE5FRURfT1AodCszLTEpOworCQkJCWdvdG8gY29weV9tYXRjaDsKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKwkJCX0KKwkJCWVsc2UgaWYgKHQgPj0gMzIpIHsJCQkvKiBhIE0zIG1hdGNoICovCisJCQkJdCAmPSAzMTsKKwkJCQlpZiAodCA9PSAwKSB7CisJCQkJCU5FRURfSVAoMSk7CisJCQkJCXdoaWxlICgqaXAgPT0gMCkgeworCQkJCQkJdCArPSAyNTU7CisJCQkJCQlpcCsrOworCQkJCQkJTkVFRF9JUCgxKTsKKwkJCQkJfQorCQkJCQl0ICs9IDMxICsgKmlwKys7CisJCQkJfQorI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisJCQkJbV9vZmYgPSAxICsgKGlwWzBdIDw8IDYpICsgKGlwWzFdID4+IDIpOworCQkJCWxhc3RfbV9vZmYgPSBtX29mZjsKKyNlbHNlCisJCQkJbV9vZmYgPSAxICsgKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQl7CisJCQkJCXVuc2lnbmVkIG9mZiA9IDEgKyAoaXBbMF0gPDwgNikgKyAoaXBbMV0gPj4gMik7CisJCQkJCW1fcG9zID0gb3AgLSBvZmY7CisJCQkJCWxhc3RfbV9vZmYgPSBvZmY7CisJCQkJfQorI2VsaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzIpICYmIGRlZmluZWQoTFpPX0FCSV9MSVRUTEVfRU5ESUFOKQorCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCW1fcG9zIC09ICgqIChjb25zdCBsem9fdXNob3J0cCkgaXApID4+IDI7CisjZWxzZQorCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCW1fcG9zIC09IChpcFswXSA+PiAyKSArIChpcFsxXSA8PCA2KTsKKyNlbmRpZgorI2VuZGlmIC8qIENPUFlfRElDVCAqLworCQkJCWlwICs9IDI7CisJCQl9CisJCQllbHNlIGlmICh0ID49IDE2KSB7CQkJLyogYSBNNCBtYXRjaCAqLworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorCQkJCW1fb2ZmID0gKHQgJiA4KSA8PCAxMTsKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKwkJCQltX3BvcyA9IG9wOworCQkJCW1fcG9zIC09ICh0ICYgOCkgPDwgMTE7CisjZW5kaWYgLyogQ09QWV9ESUNUICovCisJCQkJdCAmPSA3OworCQkJCWlmICh0ID09IDApIHsKKwkJCQkJTkVFRF9JUCgxKTsKKwkJCQkJd2hpbGUgKCppcCA9PSAwKSB7CisJCQkJCQl0ICs9IDI1NTsKKwkJCQkJCWlwKys7CisJCQkJCQlORUVEX0lQKDEpOworCQkJCQl9CisJCQkJCXQgKz0gNyArICppcCsrOworCQkJCX0KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCW1fb2ZmICs9IChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKKyNlbHNlCisJCQkJbV9vZmYgKz0gKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisJCQkJaXAgKz0gMjsKKwkJCQlpZiAobV9vZmYgPT0gMCkKKwkJCQkJZ290byBlb2ZfZm91bmQ7CisJCQkJbV9vZmYgKz0gMHg0MDAwOworI2lmIGRlZmluZWQoTFpPMVopCisJCQkJbGFzdF9tX29mZiA9IG1fb2ZmOworI2VuZGlmCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQltX3BvcyAtPSAoaXBbMF0gPDwgNikgKyAoaXBbMV0gPj4gMik7CisjZWxpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfMikgJiYgZGVmaW5lZChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisJCQkJbV9wb3MgLT0gKCogKGNvbnN0IGx6b191c2hvcnRwKSBpcCkgPj4gMjsKKyNlbHNlCisJCQkJbV9wb3MgLT0gKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisJCQkJaXAgKz0gMjsKKwkJCQlpZiAobV9wb3MgPT0gb3ApCisJCQkJCWdvdG8gZW9mX2ZvdW5kOworCQkJCW1fcG9zIC09IDB4NDAwMDsKKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCWxhc3RfbV9vZmYgPSBwZCgoY29uc3QgdWludDhfdCopb3AsIG1fcG9zKTsKKyNlbmRpZgorI2VuZGlmIC8qIENPUFlfRElDVCAqLworCQkJfQorCQkJZWxzZSB7CQkJCS8qIGEgTTEgbWF0Y2ggKi8KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCW1fb2ZmID0gMSArICh0IDw8IDYpICsgKCppcCsrID4+IDIpOworCQkJCWxhc3RfbV9vZmYgPSBtX29mZjsKKyNlbHNlCisJCQkJbV9vZmYgPSAxICsgKHQgPj4gMikgKyAoKmlwKysgPDwgMik7CisjZW5kaWYKKwkJCQlORUVEX09QKDIpOworCQkJCXQgPSAyOyBDT1BZX0RJQ1QodCxtX29mZikKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCXQgPSAxICsgKHQgPDwgNikgKyAoKmlwKysgPj4gMik7CisJCQkJbV9wb3MgPSBvcCAtIHQ7CisJCQkJbGFzdF9tX29mZiA9IHQ7CisjZWxzZQorCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCW1fcG9zIC09IHQgPj4gMjsKKwkJCQltX3BvcyAtPSAqaXArKyA8PCAyOworI2VuZGlmCisJCQkJVEVTVF9MQihtX3Bvcyk7IE5FRURfT1AoMik7CisJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkqb3ArKyA9ICptX3BvczsKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKwkJCQlnb3RvIG1hdGNoX2RvbmU7CisJCQl9CisKKwkJCS8qIGNvcHkgbWF0Y2ggKi8KKyNpZiBkZWZpbmVkKENPUFlfRElDVCkKKworCQkJTkVFRF9PUCh0KzMtMSk7CisJCQl0ICs9IDMtMTsgQ09QWV9ESUNUKHQsbV9vZmYpCisKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKworCQkJVEVTVF9MQihtX3Bvcyk7IGFzc2VydCh0ID4gMCk7IE5FRURfT1AodCszLTEpOworI2lmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KSB8fCBkZWZpbmVkKExaT19BTElHTkVEX09LXzQpCisjIGlmICFkZWZpbmVkKExaT19VTkFMSUdORURfT0tfNCkKKwkJCWlmICh0ID49IDIgKiA0IC0gKDMgLSAxKSAmJiBQVFJfQUxJR05FRDJfNChvcCxtX3BvcykpIHsKKwkJCQlhc3NlcnQoKG9wIC0gbV9wb3MpID49IDQpOwkvKiBib3RoIHBvaW50ZXJzIGFyZSBhbGlnbmVkICovCisjIGVsc2UKKwkJCWlmICh0ID49IDIgKiA0IC0gKDMgLSAxKSAmJiAob3AgLSBtX3BvcykgPj0gNCkgeworIyBlbmRpZgorCQkJCUNPUFk0KG9wLG1fcG9zKTsKKwkJCQlvcCArPSA0OyBtX3BvcyArPSA0OyB0IC09IDQgLSAoMyAtIDEpOworCQkJCWRvIHsKKwkJCQkJQ09QWTQob3AsbV9wb3MpOworCQkJCQlvcCArPSA0OyBtX3BvcyArPSA0OyB0IC09IDQ7CisJCQkJfSB3aGlsZSAodCA+PSA0KTsKKwkJCQlpZiAodCA+IDApCisJCQkJCWRvICpvcCsrID0gKm1fcG9zKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZgorCQkJeworIGNvcHlfbWF0Y2g6CisJCQkJKm9wKysgPSAqbV9wb3MrKzsgKm9wKysgPSAqbV9wb3MrKzsKKwkJCQlkbyAqb3ArKyA9ICptX3BvcysrOyB3aGlsZSAoLS10ID4gMCk7CisJCQl9CisKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKworIG1hdGNoX2RvbmU6CisjaWYgZGVmaW5lZChMWk8xWikKKwkJCXQgPSBpcFstMV0gJiAzOworI2Vsc2UKKwkJCXQgPSBpcFstMl0gJiAzOworI2VuZGlmCisJCQlpZiAodCA9PSAwKQorCQkJCWJyZWFrOworCisJCQkvKiBjb3B5IGxpdGVyYWxzICovCisgbWF0Y2hfbmV4dDoKKwkJCWFzc2VydCh0ID4gMCk7CisJCQlhc3NlcnQodCA8IDQpOworCQkJTkVFRF9PUCh0KTsKKwkJCU5FRURfSVAodCsxKTsKKyNpZiAwCisJCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisjZWxzZQorCQkJKm9wKysgPSAqaXArKzsKKwkJCWlmICh0ID4gMSkgeworCQkJCSpvcCsrID0gKmlwKys7CisJCQkJaWYgKHQgPiAyKQorCQkJCQkqb3ArKyA9ICppcCsrOworCQkJfQorI2VuZGlmCisJCQl0ID0gKmlwKys7CisJCX0gd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCk7CisJfQorCisvLyNpZiBkZWZpbmVkKEhBVkVfVEVTVF9JUCkgfHwgZGVmaW5lZChIQVZFX1RFU1RfT1ApCisJLyogbm8gRU9GIGNvZGUgd2FzIGZvdW5kICovCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gTFpPX0VfRU9GX05PVF9GT1VORDsKKy8vI2VuZGlmCisKKyBlb2ZfZm91bmQ6CisJYXNzZXJ0KHQgPT0gMSk7CisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gKGlwID09IGlwX2VuZCA/IExaT19FX09LIDoKKwkJICAgKGlwIDwgaXBfZW5kCSA/IExaT19FX0lOUFVUX05PVF9DT05TVU1FRCA6IExaT19FX0lOUFVUX09WRVJSVU4pKTsKKworLy8jaWYgZGVmaW5lZChIQVZFX05FRURfSVApCisgaW5wdXRfb3ZlcnJ1bjoKKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiBMWk9fRV9JTlBVVF9PVkVSUlVOOworLy8jZW5kaWYKKworLy8jaWYgZGVmaW5lZChIQVZFX05FRURfT1ApCisgb3V0cHV0X292ZXJydW46CisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gTFpPX0VfT1VUUFVUX09WRVJSVU47CisvLyNlbmRpZgorCisvLyNpZiBkZWZpbmVkKExaT19URVNUX09WRVJSVU5fTE9PS0JFSElORCkKKyBsb29rYmVoaW5kX292ZXJydW46CisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gTFpPX0VfTE9PS0JFSElORF9PVkVSUlVOOworLy8jZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvb3Blbl90cmFuc2Zvcm1lci5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9vcGVuX3RyYW5zZm9ybWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZTU2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvb3Blbl90cmFuc2Zvcm1lci5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCisvKiB0cmFuc2Zvcm1lcigpLCBtb3JlIHRoYW4gbWVldHMgdGhlIGV5ZSAqLworLyoKKyAqIE9uIE1NVSBtYWNoaW5lLCB0aGUgdHJhbnNmb3JtX3Byb2cgaXMgcmVtb3ZlZCBieSBtYWNybyBtYWdpYworICogaW4gaW5jbHVkZS9hcmNoaXZlLmguIE9uIE5PTU1VLCB0cmFuc2Zvcm1lciBpcyByZW1vdmVkLgorICovCit2b2lkIEZBU1RfRlVOQyBvcGVuX3RyYW5zZm9ybWVyKGludCBmZCwKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnRyYW5zZm9ybWVyKShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSwKKwljb25zdCBjaGFyICp0cmFuc2Zvcm1fcHJvZykKK3sKKwlzdHJ1Y3QgZmRfcGFpciBmZF9waXBlOworCWludCBwaWQ7CisKKwl4cGlwZWRfcGFpcihmZF9waXBlKTsKKwlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIENoaWxkICovCisJCWNsb3NlKGZkX3BpcGUucmQpOyAvKiB3ZSBkb24ndCB3YW50IHRvIHJlYWQgZnJvbSB0aGUgcGFyZW50ICovCisJCS8vIEZJWE1FOiBlcnJvciBjaGVjaz8KKyNpZiBCQl9NTVUKKwkJdHJhbnNmb3JtZXIoZmQsIGZkX3BpcGUud3IpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJCWNsb3NlKGZkX3BpcGUud3IpOyAvKiBzZW5kIEVPRiAqLworCQkJY2xvc2UoZmQpOworCQl9CisJCS8qIG11c3QgYmUgX2V4aXQhIGJ1ZyB3YXMgYWN0dWFsbHkgc2VlbiBoZXJlICovCisJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisjZWxzZQorCQl7CisJCQljaGFyICphcmd2WzRdOworCQkJeG1vdmVfZmQoZmQsIDApOworCQkJeG1vdmVfZmQoZmRfcGlwZS53ciwgMSk7CisJCQlhcmd2WzBdID0gKGNoYXIqKXRyYW5zZm9ybV9wcm9nOworCQkJYXJndlsxXSA9IChjaGFyKikiLWNmIjsKKwkJCWFyZ3ZbMl0gPSAoY2hhciopIi0iOworCQkJYXJndlszXSA9IE5VTEw7CisJCQlCQl9FWEVDVlAodHJhbnNmb3JtX3Byb2csIGFyZ3YpOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCB0cmFuc2Zvcm1fcHJvZyk7CisJCX0KKyNlbmRpZgorCQkvKiBub3RyZWFjaGVkICovCisJfQorCisJLyogcGFyZW50IHByb2Nlc3MgKi8KKwljbG9zZShmZF9waXBlLndyKTsgLyogZG9uJ3Qgd2FudCB0byB3cml0ZSB0byB0aGUgY2hpbGQgKi8KKwl4bW92ZV9mZChmZF9waXBlLnJkLCBmZCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3NlZWtfYnlfanVtcC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9zZWVrX2J5X2p1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJjNTJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9zZWVrX2J5X2p1bXAuYwpAQCAtMCwwICsxLDE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgc2Vla19ieV9qdW1wKGludCBmZCwgb2ZmX3QgYW1vdW50KQoreworCWlmIChhbW91bnQKKwkgJiYgbHNlZWsoZmQsIGFtb3VudCwgU0VFS19DVVIpID09IChvZmZfdCkgLTEKKwkpIHsKKwkJaWYgKGVycm5vID09IEVTUElQRSkKKwkJCXNlZWtfYnlfcmVhZChmZCwgYW1vdW50KTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZWVrIGZhaWx1cmUiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3NlZWtfYnlfcmVhZC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9zZWVrX2J5X3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDkzMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9zZWVrX2J5X3JlYWQuYwpAQCAtMCwwICsxLDE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKworLyogIElmIHdlIGFyZSByZWFkaW5nIHRocm91Z2ggYSBwaXBlLCBvciBmcm9tIHN0ZGluIHRoZW4gd2UgY2FuJ3QgbHNlZWssCisgKiAgd2UgbXVzdCByZWFkIGFuZCBkaXNjYXJkIHRoZSBkYXRhIHRvIHNraXAgb3ZlciBpdC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgc2Vla19ieV9yZWFkKGludCBmZCwgb2ZmX3QgYW1vdW50KQoreworCWlmIChhbW91bnQpCisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGZkLCAtMSwgYW1vdW50KTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW5wYWNrX2FyX2FyY2hpdmUuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW5wYWNrX2FyX2FyY2hpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGRiZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnBhY2tfYXJfYXJjaGl2ZS5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2luY2x1ZGUgImFyLmgiCisKK3ZvaWQgRkFTVF9GVU5DIHVucGFja19hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlX3QgKmFyX2FyY2hpdmUpCit7CisJY2hhciBtYWdpY1s3XTsKKworCXhyZWFkKGFyX2FyY2hpdmUtPnNyY19mZCwgbWFnaWMsIEFSX01BR0lDX0xFTik7CisJaWYgKHN0cm5jbXAobWFnaWMsIEFSX01BR0lDLCBBUl9NQUdJQ19MRU4pICE9IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgYXIgbWFnaWMiKTsKKwl9CisJYXJfYXJjaGl2ZS0+b2Zmc2V0ICs9IEFSX01BR0lDX0xFTjsKKworCXdoaWxlIChnZXRfaGVhZGVyX2FyKGFyX2FyY2hpdmUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHovUkVBRE1FIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTk3MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L1JFQURNRQpAQCAtMCwwICsxLDEzNSBAQAorCitYWiBFbWJlZGRlZAorPT09PT09PT09PT0KKworICAgIFhaIEVtYmVkZGVkIGlzIGEgcmVsYXRpdmVseSBzbWFsbCwgbGltaXRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgLnh6CisgICAgZmlsZSBmb3JtYXQuIEN1cnJlbnRseSBvbmx5IGRlY29kaW5nIGlzIGltcGxlbWVudGVkLgorCisgICAgWFogRW1iZWRkZWQgd2FzIHdyaXR0ZW4gZm9yIHVzZSBpbiB0aGUgTGludXgga2VybmVsLCBidXQgdGhlIGNvZGUgY2FuCisgICAgYmUgZWFzaWx5IHVzZWQgaW4gb3RoZXIgZW52aXJvbm1lbnRzIHRvbywgaW5jbHVkaW5nIHJlZ3VsYXIgdXNlcnNwYWNlCisgICAgYXBwbGljYXRpb25zLgorCisgICAgVGhpcyBSRUFETUUgY29udGFpbnMgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VmdWwgb25seSB3aGVuIHRoZSBjb3B5CisgICAgb2YgWFogRW1iZWRkZWQgaXNuJ3QgcGFydCBvZiB0aGUgTGludXgga2VybmVsIHRyZWUuIFlvdSBzaG91bGQgYWxzbworICAgIHJlYWQgbGludXgvRG9jdW1lbnRhdGlvbi94ei50eHQgZXZlbiBpZiB5b3UgYXJlbid0IHVzaW5nIFhaIEVtYmVkZGVkCisgICAgYXMgcGFydCBvZiBMaW51eDsgaW5mb3JtYXRpb24gaW4gdGhhdCBmaWxlIGlzIG5vdCByZXBlYXRlZCBpbiB0aGlzCisgICAgUkVBRE1FLgorCitDb21waWxpbmcgdGhlIExpbnV4IGtlcm5lbCBtb2R1bGUKKworICAgIFRoZSB4el9kZWMgbW9kdWxlIGRlcGVuZHMgb24gY3JjMzIgbW9kdWxlLCBzbyBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZQorICAgIGl0IGVuYWJsZWQgKENPTkZJR19DUkMzMikuCisKKyAgICBCdWlsZGluZyB0aGUgeHpfZGVjIGFuZCB4el9kZWNfdGVzdCBtb2R1bGVzIHdpdGhvdXQgc3VwcG9ydCBmb3IgQkNKCisgICAgZmlsdGVyczoKKworICAgICAgICBjZCBsaW51eC9saWIveHoKKyAgICAgICAgbWFrZSAtQyAvcGF0aC90by9rZXJuZWwvc291cmNlIFwKKyAgICAgICAgICAgICAgICBLQ1BQRkxBR1M9LUkiJChwd2QpLy4uLy4uL2luY2x1ZGUiIE09IiQocHdkKSIgXAorICAgICAgICAgICAgICAgIENPTkZJR19YWl9ERUM9bSBDT05GSUdfWFpfREVDX1RFU1Q9bQorCisgICAgQnVpbGRpbmcgdGhlIHh6X2RlYyBhbmQgeHpfZGVjX3Rlc3QgbW9kdWxlcyB3aXRoIHN1cHBvcnQgZm9yIEJDSgorICAgIGZpbHRlcnM6CisKKyAgICAgICAgY2QgbGludXgvbGliL3h6CisgICAgICAgIG1ha2UgLUMgL3BhdGgvdG8va2VybmVsL3NvdXJjZSBcCisgICAgICAgICAgICAgICAgS0NQUEZMQUdTPS1JIiQocHdkKS8uLi8uLi9pbmNsdWRlIiBNPSIkKHB3ZCkiIFwKKyAgICAgICAgICAgICAgICBDT05GSUdfWFpfREVDPW0gQ09ORklHX1haX0RFQ19URVNUPW0gQ09ORklHX1haX0RFQ19CQ0o9eSBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQ19YODY9eSBDT05GSUdfWFpfREVDX1BPV0VSUEM9eSBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQ19JQTY0PXkgQ09ORklHX1haX0RFQ19BUk09eSBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQ19BUk1USFVNQj15IENPTkZJR19YWl9ERUNfU1BBUkM9eQorCisgICAgSWYgeW91IHdhbnQgb25seSBvbmUgb3IgYSBmZXcgb2YgdGhlIEJDSiBmaWx0ZXJzLCBvbWl0IHRoZSBhcHByb3ByaWF0ZQorICAgIHZhcmlhYmxlcy4gQ09ORklHX1haX0RFQ19CQ0o9eSBpcyBhbHdheXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIHN1cHBvcnQKKyAgICBjb2RlIHNoYXJlZCBiZXR3ZWVuIGFsbCBCQ0ogZmlsdGVycy4KKworICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdGhlIHh6X2RlY190ZXN0IG1vZHVsZS4gWW91IGNhbiBza2lwIGJ1aWxkaW5nCisgICAgaXQgYnkgb21pdHRpbmcgQ09ORklHX1haX0RFQ19URVNUPW0gZnJvbSB0aGUgbWFrZSBjb21tYW5kIGxpbmUuCisKK0NvbXBpbGVyIHJlcXVpcmVtZW50cworCisgICAgWFogRW1iZWRkZWQgc2hvdWxkIGNvbXBpbGUgYXMgZWl0aGVyIEdOVS1DODkgKHVzZWQgaW4gdGhlIExpbnV4CisgICAga2VybmVsKSBvciB3aXRoIGFueSBDOTkgY29tcGlsZXIuIEdldHRpbmcgdGhlIGNvZGUgdG8gY29tcGlsZSB3aXRoCisgICAgbm9uLUdOVSBDODkgY29tcGlsZXIgb3IgYSBDKysgY29tcGlsZXIgc2hvdWxkIGJlIHF1aXRlIGVhc3kgYXMKKyAgICBsb25nIGFzIHRoZXJlIGlzIGEgZGF0YSB0eXBlIGZvciB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciAob3IgdGhlCisgICAgY29kZSBpcyBtb2RpZmllZCBub3QgdG8gc3VwcG9ydCBsYXJnZSBmaWxlcywgd2hpY2ggbmVlZHMgc29tZSBtb3JlCisgICAgY2FyZSB0aGFuIGp1c3QgdXNpbmcgMzItYml0IGludGVnZXIgaW5zdGVhZCBvZiA2NC1iaXQpLgorCisgICAgSWYgeW91IHVzZSBHQ0MsIHRyeSB0byB1c2UgYSByZWNlbnQgdmVyc2lvbi4gRm9yIGV4YW1wbGUsIG9uIHg4NiwKKyAgICB4el9kZWNfbHptYTIuYyBjb21waWxlZCB3aXRoIEdDQyAzLjMuNiBpcyAxNS0yNSAlIHNsb3dlciB0aGFuIHdoZW4KKyAgICBjb21waWxlZCB3aXRoIEdDQyA0LjMuMy4KKworRW1iZWRkaW5nIGludG8gdXNlcnNwYWNlIGFwcGxpY2F0aW9ucworCisgICAgVG8gZW1iZWQgdGhlIFhaIGRlY29kZXIsIGNvcHkgdGhlIGZvbGxvd2luZyBmaWxlcyBpbnRvIGEgc2luZ2xlCisgICAgZGlyZWN0b3J5IGluIHlvdXIgc291cmNlIGNvZGUgdHJlZToKKworICAgICAgICBsaW51eC9pbmNsdWRlL2xpbnV4L3h6LmgKKyAgICAgICAgbGludXgvbGliL3h6L3h6X2NyYzMyLmMKKyAgICAgICAgbGludXgvbGliL3h6L3h6X2RlY19sem1hMi5jCisgICAgICAgIGxpbnV4L2xpYi94ei94el9kZWNfc3RyZWFtLmMKKyAgICAgICAgbGludXgvbGliL3h6L3h6X2x6bWEyLmgKKyAgICAgICAgbGludXgvbGliL3h6L3h6X3ByaXZhdGUuaAorICAgICAgICBsaW51eC9saWIveHoveHpfc3RyZWFtLmgKKyAgICAgICAgdXNlcnNwYWNlL3h6X2NvbmZpZy5oCisKKyAgICBBbHRlcm5hdGl2ZWx5LCB4ei5oIG1heSBiZSBwbGFjZWQgaW50byBhIGRpZmZlcmVudCBkaXJlY3RvcnkgYnV0IHRoZW4KKyAgICB0aGF0IGRpcmVjdG9yeSBtdXN0IGJlIGluIHRoZSBjb21waWxlciBpbmNsdWRlIHBhdGggd2hlbiBjb21waWxpbmcKKyAgICB0aGUgLmMgZmlsZXMuCisKKyAgICBZb3VyIGNvZGUgc2hvdWxkIHVzZSBvbmx5IHRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4geHouaC4gVGhlIHJlc3Qgb2YKKyAgICB0aGUgLmggZmlsZXMgYXJlIG1lYW50IG9ubHkgZm9yIGludGVybmFsIHVzZSBpbiBYWiBFbWJlZGRlZC4KKworICAgIFlvdSBtYXkgd2FudCB0byBtb2RpZnkgeHpfY29uZmlnLmggdG8gYmUgbW9yZSBzdWl0YWJsZSBmb3IgeW91ciBidWlsZAorICAgIGVudmlyb25tZW50LiBQcm9iYWJseSB5b3Ugc2hvdWxkIGF0IGxlYXN0IHNraW0gdGhyb3VnaCBpdCBldmVuIGlmIHRoZQorICAgIGRlZmF1bHQgZmlsZSB3b3JrcyBhcyBpcy4KKworQkNKIGZpbHRlciBzdXBwb3J0CisKKyAgICBJZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvbmUgb3IgbW9yZSBCQ0ogZmlsdGVycywgeW91IG5lZWQgdG8gY29weSBhbHNvCisgICAgbGludXgvbGliL3h6L3h6X2RlY19iY2ouYyBpbnRvIHlvdXIgYXBwbGljYXRpb24sIGFuZCB1c2UgYXBwcm9wcmlhdGUKKyAgICAjZGVmaW5lcyBpbiB4el9jb25maWcuaCBvciBpbiBjb21waWxlciBmbGFncy4gWW91IGRvbid0IG5lZWQgdGhlc2UKKyAgICAjZGVmaW5lcyBpbiB0aGUgY29kZSB0aGF0IGp1c3QgdXNlcyBYWiBFbWJlZGRlZCB2aWEgeHouaCwgYnV0IGhhdmluZworICAgIHRoZW0gYWx3YXlzICNkZWZpbmVkIGRvZXNuJ3QgaHVydCBlaXRoZXIuCisKKyAgICAgICAgI2RlZmluZSAgICAgICAgICAgICBJbnN0cnVjdGlvbiBzZXQgICAgIEJDSiBmaWx0ZXIgZW5kaWFubmVzcworICAgICAgICBYWl9ERUNfWDg2ICAgICAgICAgIHg4NiBvciB4ODYtNjQgICAgICAgTGl0dGxlIGVuZGlhbiBvbmx5CisgICAgICAgIFhaX0RFQ19QT1dFUlBDICAgICAgUG93ZXJQQyAgICAgICAgICAgICBCaWcgZW5kaWFuIG9ubHkKKyAgICAgICAgWFpfREVDX0lBNjQgICAgICAgICBJdGFuaXVtIChJQS02NCkgICAgIEJpZyBvciBsaXR0bGUgZW5kaWFuCisgICAgICAgIFhaX0RFQ19BUk0gICAgICAgICAgQVJNICAgICAgICAgICAgICAgICBMaXR0bGUgZW5kaWFuIG9ubHkKKyAgICAgICAgWFpfREVDX0FSTVRIVU1CICAgICBBUk0tVGh1bWIgICAgICAgICAgIExpdHRsZSBlbmRpYW4gb25seQorICAgICAgICBYWl9ERUNfU1BBUkMgICAgICAgIFNQQVJDICAgICAgICAgICAgICAgQmlnIG9yIGxpdHRsZSBlbmRpYW4KKworICAgIFdoaWxlIHNvbWUgYXJjaGl0ZWN0dXJlcyBhcmUgKHBhcnRpYWxseSkgYmktZW5kaWFuLCB0aGUgZW5kaWFubmVzcworICAgIHNldHRpbmcgZG9lc24ndCBjaGFuZ2UgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGluc3RydWN0aW9ucyBvbiBhbGwKKyAgICBhcmNoaXRlY3R1cmVzLiBUaGF0J3Mgd2h5IEl0YW5pdW0gYW5kIFNQQVJDIGZpbHRlcnMgd29yayBmb3IgYm90aCBiaWcKKyAgICBhbmQgbGl0dGxlIGVuZGlhbiBleGVjdXRhYmxlcyAoSXRhbml1bSBoYXMgbGl0dGxlIGVuZGlhbiBpbnN0cnVjdGlvbnMKKyAgICBhbmQgU1BBUkMgaGFzIGJpZyBlbmRpYW4gaW5zdHJ1Y3Rpb25zKS4KKworICAgIFRoZXJlIGN1cnJlbnRseSBpcyBubyBmaWx0ZXIgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBvciBiaWcgZW5kaWFuCisgICAgQVJNIG9yIEFSTS1UaHVtYi4gSW1wbGVtZW50aW5nIGZpbHRlcnMgZm9yIHRoZW0gY2FuIGJlIGNvbnNpZGVyZWQgaWYKKyAgICB0aGVyZSBpcyBhIG5lZWQgZm9yIHN1Y2ggZmlsdGVycyBpbiByZWFsLXdvcmxkIGFwcGxpY2F0aW9ucy4KKworTm90ZXMgYWJvdXQgc2hhcmVkIGxpYnJhcmllcworCisgICAgSWYgeW91IGFyZSBpbmNsdWRpbmcgWFogRW1iZWRkZWQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCB5b3UgdmVyeQorICAgIHByb2JhYmx5IHNob3VsZCByZW5hbWUgdGhlIHh6XyogZnVuY3Rpb25zIHRvIHByZXZlbnQgc3ltYm9sCisgICAgY29uZmxpY3RzIGluIGNhc2UgeW91ciBsaWJyYXJ5IGlzIGxpbmtlZCBhZ2FpbnN0IHNvbWUgb3RoZXIgbGlicmFyeQorICAgIG9yIGFwcGxpY2F0aW9uIHRoYXQgYWxzbyBoYXMgWFogRW1iZWRkZWQgaW4gaXQgKHdoaWNoIG1heSBldmVuIGJlCisgICAgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBYWiBFbWJlZGRlZCkuIFRPRE86IFByb3ZpZGUgYW4gZWFzeSB3YXkKKyAgICB0byBkbyB0aGlzLgorCisgICAgUGxlYXNlIGRvbid0IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IG9mIFhaIEVtYmVkZGVkIGl0c2VsZiB1bmxlc3MKKyAgICBpdCBpcyBmaW5lIHRvIHJlYnVpbGQgZXZlcnl0aGluZyBkZXBlbmRpbmcgb24gdGhhdCBzaGFyZWQgbGlicmFyeQorICAgIGV2ZXJ5dGltZSB5b3UgdXBncmFkZSB0byBhIG5ld2VyIHZlcnNpb24gb2YgWFogRW1iZWRkZWQuIFRoZXJlIGFyZQorICAgIG5vIEFQSSBvciBBQkkgc3RhYmlsaXR5IGd1YXJhbnRlZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKKyAgICBYWiBFbWJlZGRlZC4KKworU3BlY2lmeWluZyB0aGUgY2FsbGluZyBjb252ZW50aW9uCisKKyAgICBYWl9GVU5DIG1hY3JvIHdhcyBpbmNsdWRlZCB0byBzdXBwb3J0IGRlY2xhcmluZyBmdW5jdGlvbnMgd2l0aCBfX2luaXQKKyAgICBpbiBMaW51eC4gT3V0c2lkZSBMaW51eCwgaXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2FsbGluZworICAgIGNvbnZlbnRpb24gb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgY2FsbGluZyBjb252ZW50aW9ucy4KKyAgICBGb3IgZXhhbXBsZSwgb24gV2luZG93cywgeW91IG1heSBtYWtlIGFsbCBmdW5jdGlvbnMgdXNlIHRoZSBzdGRjYWxsCisgICAgY2FsbGluZyBjb252ZW50aW9uIGJ5IGRlZmluaW5nIFhaX0ZVTkM9X19zdGRjYWxsIHdoZW4gYnVpbGRpbmcgYW5kCisgICAgdXNpbmcgdGhlIGZ1bmN0aW9ucyBmcm9tIFhaIEVtYmVkZGVkLgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6LmggYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmMwNzFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6LmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBYWiBkZWNvbXByZXNzb3IKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfSAorI2RlZmluZSBYWl9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjCWluY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorIwlpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2Vsc2UKKyMJaW5jbHVkZSA8c3RkZGVmLmg+CisjCWluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qIEluIExpbnV4LCB0aGlzIGlzIHVzZWQgdG8gbWFrZSBleHRlcm4gZnVuY3Rpb25zIHN0YXRpYyB3aGVuIG5lZWRlZC4gKi8KKyNpZm5kZWYgWFpfRVhURVJOCisjCWRlZmluZSBYWl9FWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworLyogSW4gTGludXgsIHRoaXMgaXMgdXNlZCB0byBtYXJrIHRoZSBmdW5jdGlvbnMgd2l0aCBfX2luaXQgd2hlbiBuZWVkZWQuICovCisjaWZuZGVmIFhaX0ZVTkMKKyMJZGVmaW5lIFhaX0ZVTkMKKyNlbmRpZgorCisvKioKKyAqIGVudW0geHpfbW9kZSAtIE9wZXJhdGlvbiBtb2RlCisgKgorICogQFhaX1NJTkdMRTogICAgICAgICAgICAgIFNpbmdsZS1jYWxsIG1vZGUuIFRoaXMgdXNlcyBsZXNzIFJBTSB0aGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBtdWx0aS1jYWxsIG1vZGVzLCBiZWNhdXNlIHRoZSBMWk1BMgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgZG9lc24ndCBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgb2YgdGhlIGRlY29kZXIgc3RhdGUuIEFsbCByZXF1aXJlZCBkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGF0IGluaXRpYWxpemF0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHh6X2RlY19ydW4oKSBjYW5ub3QgcmV0dXJuIFhaX01FTV9FUlJPUi4KKyAqIEBYWl9QUkVBTExPQzogICAgICAgICAgICBNdWx0aS1jYWxsIG1vZGUgd2l0aCBwcmVhbGxvY2F0ZWQgTFpNQTIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5IGJ1ZmZlci4gQWxsIGRhdGEgc3RydWN0dXJlcyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYXQgaW5pdGlhbGl6YXRpb24sIHNvIHh6X2RlY19ydW4oKQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCByZXR1cm4gWFpfTUVNX0VSUk9SLgorICogQFhaX0RZTkFMTE9DOiAgICAgICAgICAgIE11bHRpLWNhbGwgbW9kZS4gVGhlIExaTUEyIGRpY3Rpb25hcnkgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgb25jZSB0aGUgcmVxdWlyZWQgc2l6ZSBoYXMgYmVlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCBmcm9tIHRoZSBzdHJlYW0gaGVhZGVycy4gSWYgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbiBmYWlscywgeHpfZGVjX3J1bigpIHdpbGwgcmV0dXJuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFpfTUVNX0VSUk9SLgorICoKKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGVuYWJsZSBzdXBwb3J0IG9ubHkgZm9yIGEgc3Vic2V0IG9mIHRoZSBhYm92ZQorICogbW9kZXMgYXQgY29tcGlsZSB0aW1lIGJ5IGRlZmluaW5nIFhaX0RFQ19TSU5HTEUsIFhaX0RFQ19QUkVBTExPQywKKyAqIG9yIFhaX0RFQ19EWU5BTExPQy4gVGhlIHh6X2RlYyBrZXJuZWwgbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZAorICogd2l0aCBzdXBwb3J0IGZvciBhbGwgb3BlcmF0aW9uIG1vZGVzLCBidXQgdGhlIHByZWJvb3QgY29kZSBtYXkKKyAqIGJlIGJ1aWx0IHdpdGggZmV3ZXIgZmVhdHVyZXMgdG8gbWluaW1pemUgY29kZSBzaXplLgorICovCitlbnVtIHh6X21vZGUgeworCVhaX1NJTkdMRSwKKwlYWl9QUkVBTExPQywKKwlYWl9EWU5BTExPQworfTsKKworLyoqCisgKiBlbnVtIHh6X3JldCAtIFJldHVybiBjb2RlcworICogQFhaX09LOiAgICAgICAgICAgICAgICAgIEV2ZXJ5dGhpbmcgaXMgT0sgc28gZmFyLiBNb3JlIGlucHV0IG9yIG1vcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3BhY2UgaXMgcmVxdWlyZWQgdG8gY29udGludWUuIFRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29kZSBpcyBwb3NzaWJsZSBvbmx5IGluIG11bHRpLWNhbGwgbW9kZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIChYWl9QUkVBTExPQyBvciBYWl9EWU5BTExPQykuCisgKiBAWFpfU1RSRUFNX0VORDogICAgICAgICAgT3BlcmF0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4KKyAqIEBYWl9VTlNVUFBPUlRFRF9DSEVDSzogICBJbnRlZ3JpdHkgY2hlY2sgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiBEZWNvZGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN0aWxsIHBvc3NpYmxlIGluIG11bHRpLWNhbGwgbW9kZSBieSBzaW1wbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIHh6X2RlY19ydW4oKSBhZ2Fpbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBUaGlzIHJldHVybiB2YWx1ZSBpcyB1c2VkIG9ubHkgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9ERUNfQU5ZX0NIRUNLIHdhcyBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbm90IHVzZWQgaW4gdGhlIGtlcm5lbC4gVW5zdXBwb3J0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayB0eXBlcyByZXR1cm4gWFpfT1BUSU9OU19FUlJPUiBpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX0RFQ19BTllfQ0hFQ0sgd2FzIG5vdCBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUuCisgKiBAWFpfTUVNX0VSUk9SOiAgICAgICAgICAgQWxsb2NhdGluZyBtZW1vcnkgZmFpbGVkLiBUaGlzIHJldHVybiBjb2RlIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgb25seSBpZiB0aGUgZGVjb2RlciB3YXMgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFhaX0RZTkFMTE9DLiBUaGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHdhcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWVkIHRvIGJlIGFsbG9jYXRlZCB3YXMgbm8gbW9yZSB0aGFuIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RfbWF4IGFyZ3VtZW50IGdpdmVuIHRvIHh6X2RlY19pbml0KCkuCisgKiBAWFpfTUVNTElNSVRfRVJST1I6ICAgICAgQSBiaWdnZXIgTFpNQTIgZGljdGlvbmFyeSB3b3VsZCBiZSBuZWVkZWQgdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgYnkgdGhlIGRpY3RfbWF4IGFyZ3VtZW50IGdpdmVuIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgeHpfZGVjX2luaXQoKS4gVGhpcyByZXR1cm4gdmFsdWUgaXMgcG9zc2libGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGluIG11bHRpLWNhbGwgbW9kZSAoWFpfUFJFQUxMT0Mgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9EWU5BTExPQyk7IHRoZSBzaW5nbGUtY2FsbCBtb2RlIChYWl9TSU5HTEUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlcyB0aGUgZGljdF9tYXggYXJndW1lbnQuCisgKiBAWFpfRk9STUFUX0VSUk9SOiAgICAgICAgRmlsZSBmb3JtYXQgd2FzIG5vdCByZWNvZ25pemVkICh3cm9uZyBtYWdpYworICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKS4KKyAqIEBYWl9PUFRJT05TX0VSUk9SOiAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gb3B0aW9ucy4gSW4gdGhlIGRlY29kZXIgdGhpcyBtZWFucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGhlYWRlciBDUkMzMiBtYXRjaGVzLCBidXQgdGhlIGhlYWRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiBzcGVjaWZpZXMgc29tZXRoaW5nIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydC4KKyAqIEBYWl9EQVRBX0VSUk9SOiAgICAgICAgICBDb21wcmVzc2VkIGRhdGEgaXMgY29ycnVwdC4KKyAqIEBYWl9CVUZfRVJST1I6ICAgICAgICAgICBDYW5ub3QgbWFrZSBhbnkgcHJvZ3Jlc3MuIERldGFpbHMgYXJlIHNsaWdodGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGJldHdlZW4gbXVsdGktY2FsbCBhbmQgc2luZ2xlLWNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOyBtb3JlIGluZm9ybWF0aW9uIGJlbG93LgorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgWFpfQlVGX0VSUk9SIGlzIHJldHVybmVkIHdoZW4gdHdvIGNvbnNlY3V0aXZlIGNhbGxzCisgKiB0byBYWiBjb2RlIGNhbm5vdCBjb25zdW1lIGFueSBpbnB1dCBhbmQgY2Fubm90IHByb2R1Y2UgYW55IG5ldyBvdXRwdXQuCisgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBubyBuZXcgaW5wdXQgYXZhaWxhYmxlLCBvciB0aGUgb3V0cHV0IGJ1ZmZlcgorICogaXMgZnVsbCB3aGlsZSBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ5dGUgaXMgc3RpbGwgcGVuZGluZy4gQXNzdW1pbmcgeW91cgorICogY29kZSBpcyBub3QgYnVnZ3ksIHlvdSBjYW4gZ2V0IHRoaXMgZXJyb3Igb25seSB3aGVuIGRlY29kaW5nIGEgY29tcHJlc3NlZAorICogc3RyZWFtIHRoYXQgaXMgdHJ1bmNhdGVkIG9yIG90aGVyd2lzZSBjb3JydXB0LgorICoKKyAqIEluIHNpbmdsZS1jYWxsIG1vZGUsIFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIG91dHB1dCBidWZmZXIKKyAqIGlzIHRvbyBzbWFsbCwgb3IgdGhlIGNvbXByZXNzZWQgaW5wdXQgaXMgY29ycnVwdCBpbiBhIHdheSB0aGF0IG1ha2VzIHRoZQorICogZGVjb2RlciBwcm9kdWNlIG1vcmUgb3V0cHV0IHRoYW4gdGhlIGNhbGxlciBleHBlY3RlZC4gV2hlbiBpdCBpcworICogKHJlbGF0aXZlbHkpIGNsZWFyIHRoYXQgdGhlIGNvbXByZXNzZWQgaW5wdXQgaXMgdHJ1bmNhdGVkLCBYWl9EQVRBX0VSUk9SCisgKiBpcyB1c2VkIGluc3RlYWQgb2YgWFpfQlVGX0VSUk9SLgorICovCitlbnVtIHh6X3JldCB7CisJWFpfT0ssCisJWFpfU1RSRUFNX0VORCwKKwlYWl9VTlNVUFBPUlRFRF9DSEVDSywKKwlYWl9NRU1fRVJST1IsCisJWFpfTUVNTElNSVRfRVJST1IsCisJWFpfRk9STUFUX0VSUk9SLAorCVhaX09QVElPTlNfRVJST1IsCisJWFpfREFUQV9FUlJPUiwKKwlYWl9CVUZfRVJST1IKK307CisKKy8qKgorICogc3RydWN0IHh6X2J1ZiAtIFBhc3NpbmcgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHRvIFhaIGNvZGUKKyAqIEBpbjogICAgICAgICBCZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBtYXkgYmUgTlVMTCBpZiBhbmQgb25seQorICogICAgICAgICAgICAgIGlmIGluX3BvcyBpcyBlcXVhbCB0byBpbl9zaXplLgorICogQGluX3BvczogICAgIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBtdXN0IG5vdCBleGNlZWQKKyAqICAgICAgICAgICAgICBpbl9zaXplLgorICogQGluX3NpemU6ICAgIFNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlcgorICogQG91dDogICAgICAgIEJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhpcyBtYXkgYmUgTlVMTCBpZiBhbmQgb25seQorICogICAgICAgICAgICAgIGlmIG91dF9wb3MgaXMgZXF1YWwgdG8gb3V0X3NpemUuCisgKiBAb3V0X3BvczogICAgQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhpcyBtdXN0IG5vdCBleGNlZWQKKyAqICAgICAgICAgICAgICBvdXRfc2l6ZS4KKyAqIEBvdXRfc2l6ZTogICBTaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyCisgKgorICogT25seSB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBidWZmZXIgZnJvbSBvdXRbb3V0X3Bvc10gb253YXJkLCBhbmQKKyAqIHRoZSB2YXJpYWJsZXMgaW5fcG9zIGFuZCBvdXRfcG9zIGFyZSBtb2RpZmllZCBieSB0aGUgWFogY29kZS4KKyAqLworc3RydWN0IHh6X2J1ZiB7CisJY29uc3QgdWludDhfdCAqaW47CisJc2l6ZV90IGluX3BvczsKKwlzaXplX3QgaW5fc2l6ZTsKKworCXVpbnQ4X3QgKm91dDsKKwlzaXplX3Qgb3V0X3BvczsKKwlzaXplX3Qgb3V0X3NpemU7Cit9OworCisvKioKKyAqIHN0cnVjdCB4el9kZWMgLSBPcGFxdWUgdHlwZSB0byBob2xkIHRoZSBYWiBkZWNvZGVyIHN0YXRlCisgKi8KK3N0cnVjdCB4el9kZWM7CisKKy8qKgorICogeHpfZGVjX2luaXQoKSAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgWFogZGVjb2RlciBzdGF0ZQorICogQG1vZGU6ICAgICAgIE9wZXJhdGlvbiBtb2RlCisgKiBAZGljdF9tYXg6ICAgTWF4aW11bSBzaXplIG9mIHRoZSBMWk1BMiBkaWN0aW9uYXJ5IChoaXN0b3J5IGJ1ZmZlcikgZm9yCisgKiAgICAgICAgICAgICAgbXVsdGktY2FsbCBkZWNvZGluZy4gVGhpcyBpcyBpZ25vcmVkIGluIHNpbmdsZS1jYWxsIG1vZGUKKyAqICAgICAgICAgICAgICAobW9kZSA9PSBYWl9TSU5HTEUpLiBMWk1BMiBkaWN0aW9uYXJ5IGlzIGFsd2F5cyAyXm4gYnl0ZXMKKyAqICAgICAgICAgICAgICBvciAyXm4gKyAyXihuLTEpIGJ5dGVzICh0aGUgbGF0dGVyIHNpemVzIGFyZSBsZXNzIGNvbW1vbgorICogICAgICAgICAgICAgIGluIHByYWN0aWNlKSwgc28gb3RoZXIgdmFsdWVzIGZvciBkaWN0X21heCBkb24ndCBtYWtlIHNlbnNlLgorICogICAgICAgICAgICAgIEluIHRoZSBrZXJuZWwsIGRpY3Rpb25hcnkgc2l6ZXMgb2YgNjQgS2lCLCAxMjggS2lCLCAyNTYgS2lCLAorICogICAgICAgICAgICAgIDUxMiBLaUIsIGFuZCAxIE1pQiBhcmUgcHJvYmFibHkgdGhlIG9ubHkgcmVhc29uYWJsZSB2YWx1ZXMsCisgKiAgICAgICAgICAgICAgZXhjZXB0IGZvciBrZXJuZWwgYW5kIGluaXRyYW1mcyBpbWFnZXMgd2hlcmUgYSBiaWdnZXIKKyAqICAgICAgICAgICAgICBkaWN0aW9uYXJ5IGNhbiBiZSBmaW5lIGFuZCB1c2VmdWwuCisgKgorICogU2luZ2xlLWNhbGwgbW9kZSAoWFpfU0lOR0xFKTogeHpfZGVjX3J1bigpIGRlY29kZXMgdGhlIHdob2xlIHN0cmVhbSBhdAorICogb25jZS4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgZW5vdWdoIG91dHB1dCBzcGFjZSBvciB0aGUgZGVjb2Rpbmcgd2lsbAorICogZmFpbC4gVGhlIG91dHB1dCBzcGFjZSBpcyB1c2VkIGFzIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlciwgd2hpY2ggaXMgd2h5CisgKiB0aGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIHRoZSBkaWN0aW9uYXJ5IGFzIHBhcnQgb2YgdGhlIGRlY29kZXIncworICogaW50ZXJuYWwgc3RhdGUuCisgKgorICogQmVjYXVzZSB0aGUgb3V0cHV0IGJ1ZmZlciBpcyB1c2VkIGFzIHRoZSB3b3Jrc3BhY2UsIHN0cmVhbXMgZW5jb2RlZCB1c2luZworICogYSBiaWcgZGljdGlvbmFyeSBhcmUgbm90IGEgcHJvYmxlbSBpbiBzaW5nbGUtY2FsbCBtb2RlLiBJdCBpcyBlbm91Z2ggdGhhdAorICogdGhlIG91dHB1dCBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBob2xkIHRoZSBhY3R1YWwgdW5jb21wcmVzc2VkIGRhdGE7IGl0CisgKiBjYW4gYmUgc21hbGxlciB0aGFuIHRoZSBkaWN0aW9uYXJ5IHNpemUgc3RvcmVkIGluIHRoZSBzdHJlYW0gaGVhZGVycy4KKyAqCisgKiBNdWx0aS1jYWxsIG1vZGUgd2l0aCBwcmVhbGxvY2F0ZWQgZGljdGlvbmFyeSAoWFpfUFJFQUxMT0MpOiBkaWN0X21heCBieXRlcworICogb2YgbWVtb3J5IGlzIHByZWFsbG9jYXRlZCBmb3IgdGhlIExaTUEyIGRpY3Rpb25hcnkuIFRoaXMgd2F5IHRoZXJlIGlzIG5vCisgKiByaXNrIHRoYXQgeHpfZGVjX3J1bigpIGNvdWxkIHJ1biBvdXQgb2YgbWVtb3J5LCBzaW5jZSB4el9kZWNfcnVuKCkgd2lsbAorICogbmV2ZXIgYWxsb2NhdGUgYW55IG1lbW9yeS4gSW5zdGVhZCwgaWYgdGhlIHByZWFsbG9jYXRlZCBkaWN0aW9uYXJ5IGlzIHRvbworICogc21hbGwgZm9yIGRlY29kaW5nIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0sIHh6X2RlY19ydW4oKSB3aWxsIHJldHVybgorICogWFpfTUVNTElNSVRfRVJST1IuIFRodXMsIGl0IGlzIGltcG9ydGFudCB0byBrbm93IHdoYXQga2luZCBvZiBkYXRhIHdpbGwgYmUKKyAqIGRlY29kZWQgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIGRpY3Rpb25hcnkuCisgKgorICogTXVsdGktY2FsbCBtb2RlIHdpdGggZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRpY3Rpb25hcnkgKFhaX0RZTkFMTE9DKToKKyAqIGRpY3RfbWF4IHNwZWNpZmllcyB0aGUgbWF4aW11bSBhbGxvd2VkIGRpY3Rpb25hcnkgc2l6ZSB0aGF0IHh6X2RlY19ydW4oKQorICogbWF5IGFsbG9jYXRlIG9uY2UgaXQgaGFzIHBhcnNlZCB0aGUgZGljdGlvbmFyeSBzaXplIGZyb20gdGhlIHN0cmVhbQorICogaGVhZGVycy4gVGhpcyB3YXkgZXhjZXNzaXZlIGFsbG9jYXRpb25zIGNhbiBiZSBhdm9pZGVkIHdoaWxlIHN0aWxsCisgKiBsaW1pdGluZyB0aGUgbWF4aW11bSBtZW1vcnkgdXNhZ2UgdG8gYSBzYW5lIHZhbHVlIHRvIHByZXZlbnQgcnVubmluZyB0aGUKKyAqIHN5c3RlbSBvdXQgb2YgbWVtb3J5IHdoZW4gZGVjb21wcmVzc2luZyBzdHJlYW1zIGZyb20gdW50cnVzdGVkIHNvdXJjZXMuCisgKgorICogT24gc3VjY2VzcywgeHpfZGVjX2luaXQoKSByZXR1cm5zIGEgcG9pbnRlciB0byBzdHJ1Y3QgeHpfZGVjLCB3aGljaCBpcworICogcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHh6X2RlY19ydW4oKS4gSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMsCisgKiB4el9kZWNfaW5pdCgpIHJldHVybnMgTlVMTC4KKyAqLworWFpfRVhURVJOIHN0cnVjdCB4el9kZWMgKiBYWl9GVU5DIHh6X2RlY19pbml0KAorCQllbnVtIHh6X21vZGUgbW9kZSwgdWludDMyX3QgZGljdF9tYXgpOworCisvKioKKyAqIHh6X2RlY19ydW4oKSAtIFJ1biB0aGUgWFogZGVjb2RlcgorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkKKyAqIEBiOiAgICAgICAgICBJbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAqCisgKiBUaGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBkZXBlbmQgb24gYnVpbGQgb3B0aW9ucyBhbmQgb3BlcmF0aW9uIG1vZGUuCisgKiBTZWUgZW51bSB4el9yZXQgZm9yIGRldGFpbHMuCisgKgorICogTk9URTogSWYgYW4gZXJyb3Igb2NjdXJzIGluIHNpbmdsZS1jYWxsIG1vZGUgKHJldHVybiB2YWx1ZSBpcyBub3QKKyAqIFhaX1NUUkVBTV9FTkQpLCBiLT5pbl9wb3MgYW5kIGItPm91dF9wb3MgYXJlIG5vdCBtb2RpZmllZCwgYW5kIHRoZQorICogY29udGVudHMgb2YgdGhlIG91dHB1dCBidWZmZXIgZnJvbSBiLT5vdXRbYi0+b3V0X3Bvc10gb253YXJkIGFyZQorICogdW5kZWZpbmVkLiBUaGlzIGlzIHRydWUgZXZlbiBhZnRlciBYWl9CVUZfRVJST1IsIGJlY2F1c2Ugd2l0aCBzb21lIGZpbHRlcgorICogY2hhaW5zLCB0aGVyZSBtYXkgYmUgYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgdGhpcyBwYXNzCisgKiBjYW5ub3QgYmUgcHJvcGVybHkgZG9uZSBpZiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyB0cnVuY2F0ZWQuIFRodXMsIHlvdQorICogY2Fubm90IGdpdmUgdGhlIHNpbmdsZS1jYWxsIGRlY29kZXIgYSB0b28gc21hbGwgYnVmZmVyIGFuZCB0aGVuIGV4cGVjdCB0bworICogZ2V0IHRoYXQgYW1vdW50IHZhbGlkIGRhdGEgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uIFlvdSBtdXN0IHVzZQorICogdGhlIG11bHRpLWNhbGwgZGVjb2RlciBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1bmNvbXByZXNzIHRoZSB3aG9sZSBzdHJlYW0uCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19ydW4oc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYik7CisKKy8qKgorICogeHpfZGVjX3Jlc2V0KCkgLSBSZXNldCBhbiBhbHJlYWR5IGFsbG9jYXRlZCBkZWNvZGVyIHN0YXRlCisgKiBAczogICAgICAgICAgRGVjb2RlciBzdGF0ZSBhbGxvY2F0ZWQgdXNpbmcgeHpfZGVjX2luaXQoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIG11bHRpLWNhbGwgZGVjb2RlciBzdGF0ZSB3aXRob3V0CisgKiBmcmVlaW5nIGFuZCByZWFsbG9jYXRpbmcgbWVtb3J5IHdpdGggeHpfZGVjX2VuZCgpIGFuZCB4el9kZWNfaW5pdCgpLgorICoKKyAqIEluIHNpbmdsZS1jYWxsIG1vZGUsIHh6X2RlY19yZXNldCgpIGlzIGFsd2F5cyBjYWxsZWQgaW4gdGhlIGJlZ2lubmluZyBvZgorICogeHpfZGVjX3J1bigpLiBUaHVzLCBleHBsaWNpdCBjYWxsIHRvIHh6X2RlY19yZXNldCgpIGlzIHVzZWZ1bCBvbmx5IGluCisgKiBtdWx0aS1jYWxsIG1vZGUuCisgKi8KK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX3Jlc2V0KHN0cnVjdCB4el9kZWMgKnMpOworCisvKioKKyAqIHh6X2RlY19lbmQoKSAtIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIHN0YXRlCisgKiBAczogICAgICAgICAgRGVjb2RlciBzdGF0ZSBhbGxvY2F0ZWQgdXNpbmcgeHpfZGVjX2luaXQoKS4gSWYgcyBpcyBOVUxMLAorICogICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgorICovCitYWl9FWFRFUk4gdm9pZCBYWl9GVU5DIHh6X2RlY19lbmQoc3RydWN0IHh6X2RlYyAqcyk7CisKKy8qCisgKiBTdGFuZGFsb25lIGJ1aWxkICh1c2Vyc3BhY2UgYnVpbGQgb3IgaW4ta2VybmVsIGJ1aWxkIGZvciBib290IHRpbWUgdXNlKQorICogbmVlZHMgYSBDUkMzMiBpbXBsZW1lbnRhdGlvbi4gRm9yIG5vcm1hbCBpbi1rZXJuZWwgdXNlLCBrZXJuZWwncyBvd24KKyAqIENSQzMyIG1vZHVsZSBpcyB1c2VkIGluc3RlYWQsIGFuZCB1c2VycyBvZiB0aGlzIG1vZHVsZSBkb24ndCBuZWVkIHRvCisgKiBjYXJlIGFib3V0IHRoZSBmdW5jdGlvbnMgYmVsb3cuCisgKi8KKyNpZm5kZWYgWFpfSU5URVJOQUxfQ1JDMzIKKyMJaWZkZWYgX19LRVJORUxfXworIwkJZGVmaW5lIFhaX0lOVEVSTkFMX0NSQzMyIDAKKyMJZWxzZQorIwkJZGVmaW5lIFhaX0lOVEVSTkFMX0NSQzMyIDEKKyMJZW5kaWYKKyNlbmRpZgorCisjaWYgWFpfSU5URVJOQUxfQ1JDMzIKKy8qCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgeHpfKiBmdW5jdGlvbiB0byBpbml0aWFsaXplCisgKiB0aGUgQ1JDMzIgbG9va3VwIHRhYmxlLgorICovCitYWl9FWFRFUk4gdm9pZCBYWl9GVU5DIHh6X2NyYzMyX2luaXQodm9pZCk7CisKKy8qCisgKiBVcGRhdGUgQ1JDMzIgdmFsdWUgdXNpbmcgdGhlIHBvbHlub21pYWwgZnJvbSBJRUVFLTgwMi4zLiBUbyBzdGFydCBhIG5ldworICogY2FsY3VsYXRpb24sIHRoZSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIHplcm8uIFRvIGNvbnRpbnVlIHRoZSBjYWxjdWxhdGlvbiwKKyAqIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHZhbHVlIGlzIHBhc3NlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuCisgKi8KK1haX0VYVEVSTiB1aW50MzJfdCBYWl9GVU5DIHh6X2NyYzMyKAorCQljb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplLCB1aW50MzJfdCBjcmMpOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9jb25maWcuaCBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdlMWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2NvbmZpZy5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogUHJpdmF0ZSBpbmNsdWRlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHVzZXJzcGFjZSB1c2Ugb2YgWFogRW1iZWRkZWQKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2lmbmRlZiBYWl9DT05GSUdfSAorI2RlZmluZSBYWl9DT05GSUdfSAorCisvKiBVbmNvbW1lbnQgYXMgbmVlZGVkIHRvIGVuYWJsZSBCQ0ogZmlsdGVyIGRlY29kZXJzLiAqLworLyogI2RlZmluZSBYWl9ERUNfWDg2ICovCisvKiAjZGVmaW5lIFhaX0RFQ19QT1dFUlBDICovCisvKiAjZGVmaW5lIFhaX0RFQ19JQTY0ICovCisvKiAjZGVmaW5lIFhaX0RFQ19BUk0gKi8KKy8qICNkZWZpbmUgWFpfREVDX0FSTVRIVU1CICovCisvKiAjZGVmaW5lIFhaX0RFQ19TUEFSQyAqLworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAieHouaCIKKworI2RlZmluZSBrbWFsbG9jKHNpemUsIGZsYWdzKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUga2ZyZWUocHRyKSBmcmVlKHB0cikKKyNkZWZpbmUgdm1hbGxvYyhzaXplKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUgdmZyZWUocHRyKSBmcmVlKHB0cikKKworI2RlZmluZSBtZW1lcShhLCBiLCBzaXplKSAobWVtY21wKGEsIGIsIHNpemUpID09IDApCisjZGVmaW5lIG1lbXplcm8oYnVmLCBzaXplKSBtZW1zZXQoYnVmLCAwLCBzaXplKQorCisjdW5kZWYgbWluCisjdW5kZWYgbWluX3QKKyNkZWZpbmUgbWluKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisjZGVmaW5lIG1pbl90KHR5cGUsIHgsIHkpIG1pbih4LCB5KQorCisvKgorICogU29tZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1hcmtlZCB3aXRoIF9fYWx3YXlzX2lubGluZSB0byBrZWVwIHRoZQorICogcGVyZm9ybWFuY2UgcmVhc29uYWJsZSBldmVuIHdoZW4gdGhlIGNvbXBpbGVyIGlzIG9wdGltaXppbmcgZm9yCisgKiBzbWFsbCBjb2RlIHNpemUuIFlvdSBtYXkgYmUgYWJsZSB0byBzYXZlIGEgZmV3IGJ5dGVzIGJ5ICNkZWZpbmluZworICogX19hbHdheXNfaW5saW5lIHRvIHBsYWluIGlubGluZSwgYnV0IGRvbid0IGNvbXBsYWluIGlmIHRoZSBjb2RlCisgKiBiZWNvbWVzIHNsb3cuCisgKgorICogTk9URTogU3lzdGVtIGhlYWRlcnMgb24gR05VL0xpbnV4IG1heSAjZGVmaW5lIHRoaXMgbWFjcm8gYWxyZWFkeSwKKyAqIHNvIGlmIHlvdSB3YW50IHRvIGNoYW5nZSBpdCwgeW91IG5lZWQgdG8gI3VuZGVmIGl0IGZpcnN0LgorICovCisjaWZuZGVmIF9fYWx3YXlzX2lubGluZQorIwlpZmRlZiBfX0dOVUNfXworIwkJZGVmaW5lIF9fYWx3YXlzX2lubGluZSBcCisJCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorIwllbHNlCisjCQlkZWZpbmUgX19hbHdheXNfaW5saW5lIGlubGluZQorIwllbmRpZgorI2VuZGlmCisKKy8qCisgKiBTb21lIGZ1bmN0aW9ucyBhcmUgbWFya2VkIHRvIG5ldmVyIGJlIGlubGluZWQgdG8gcmVkdWNlIHN0YWNrIHVzYWdlLgorICogSWYgeW91IGRvbid0IGNhcmUgYWJvdXQgc3RhY2sgdXNhZ2UsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgdGhpcyBzbworICogdGhhdCBub2lubGluZV9mb3Jfc3RhY2sgaXMgI2RlZmluZWQgdG8gYmUgZW1wdHkgZXZlbiB3aGVuIHVzaW5nIEdDQy4KKyAqIERvaW5nIHNvIG1heSBzYXZlIGEgZmV3IGJ5dGVzIGluIGJpbmFyeSBzaXplLgorICovCisjaWZuZGVmIG5vaW5saW5lX2Zvcl9zdGFjaworIwlpZmRlZiBfX0dOVUNfXworIwkJZGVmaW5lIG5vaW5saW5lX2Zvcl9zdGFjayBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQorIwllbHNlCisjCQlkZWZpbmUgbm9pbmxpbmVfZm9yX3N0YWNrCisjCWVuZGlmCisjZW5kaWYKKworLyogSW5saW5lIGZ1bmN0aW9ucyB0byBhY2Nlc3MgdW5hbGlnbmVkIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycyAqLworI2lmbmRlZiBnZXRfdW5hbGlnbmVkX2xlMzIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgWFpfRlVOQyBnZXRfdW5hbGlnbmVkX2xlMzIoY29uc3QgdWludDhfdCAqYnVmKQoreworCXJldHVybiAodWludDMyX3QpYnVmWzBdCisJCQl8ICgodWludDMyX3QpYnVmWzFdIDw8IDgpCisJCQl8ICgodWludDMyX3QpYnVmWzJdIDw8IDE2KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlszXSA8PCAyNCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBnZXRfdW5hbGlnbmVkX2JlMzIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgWFpfRlVOQyBnZXRfdW5hbGlnbmVkX2JlMzIoY29uc3QgdWludDhfdCAqYnVmKQoreworCXJldHVybiAodWludDMyX3QpKGJ1ZlswXSA8PCAyNCkKKwkJCXwgKCh1aW50MzJfdClidWZbMV0gPDwgMTYpCisJCQl8ICgodWludDMyX3QpYnVmWzJdIDw8IDgpCisJCQl8ICh1aW50MzJfdClidWZbM107Cit9CisjZW5kaWYKKworI2lmbmRlZiBwdXRfdW5hbGlnbmVkX2xlMzIKK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIHB1dF91bmFsaWduZWRfbGUzMih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ1ZikKK3sKKwlidWZbMF0gPSAodWludDhfdCl2YWw7CisJYnVmWzFdID0gKHVpbnQ4X3QpKHZhbCA+PiA4KTsKKwlidWZbMl0gPSAodWludDhfdCkodmFsID4+IDE2KTsKKwlidWZbM10gPSAodWludDhfdCkodmFsID4+IDI0KTsKK30KKyNlbmRpZgorCisjaWZuZGVmIHB1dF91bmFsaWduZWRfYmUzMgorc3RhdGljIGlubGluZSB2b2lkIFhaX0ZVTkMgcHV0X3VuYWxpZ25lZF9iZTMyKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnVmKQoreworCWJ1ZlswXSA9ICh1aW50OF90KSh2YWwgPj4gMjQpOworCWJ1ZlsxXSA9ICh1aW50OF90KSh2YWwgPj4gMTYpOworCWJ1ZlsyXSA9ICh1aW50OF90KSh2YWwgPj4gOCk7CisJYnVmWzNdID0gKHVpbnQ4X3QpdmFsOworfQorI2VuZGlmCisKKy8qCisgKiBVc2UgZ2V0X3VuYWxpZ25lZF9sZTMyKCkgYWxzbyBmb3IgYWxpZ25lZCBhY2Nlc3MgZm9yIHNpbXBsaWNpdHkuIE9uCisgKiBsaXR0bGUgZW5kaWFuIHN5c3RlbXMsICNkZWZpbmUgZ2V0X2xlMzIocHRyKSAoKihjb25zdCB1aW50MzJfdCAqKShwdHIpKQorICogY291bGQgc2F2ZSBhIGZldyBieXRlcyBpbiBjb2RlIHNpemUuCisgKi8KKyNpZm5kZWYgZ2V0X2xlMzIKKyMJZGVmaW5lIGdldF9sZTMyIGdldF91bmFsaWduZWRfbGUzMgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2RlY19iY2ouYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfYmNqLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxNjJiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfYmNqLmMKQEAgLTAsMCArMSw1NjQgQEAKKy8qCisgKiBCcmFuY2gvQ2FsbC9KdW1wIChCQ0opIGZpbHRlciBkZWNvZGVycworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInh6X3ByaXZhdGUuaCIKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoZSBmaWxlIGlzIGluc2lkZSB0aGlzIGlmZGVmLiBJdCBtYWtlcyB0aGluZ3MgYSBsaXR0bGUgbW9yZQorICogY29udmVuaWVudCB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgc3VwcG9ydCBmb3IgYW55IEJDSiBmaWx0ZXJzLgorICovCisjaWZkZWYgWFpfREVDX0JDSgorCitzdHJ1Y3QgeHpfZGVjX2JjaiB7CisJLyogVHlwZSBvZiB0aGUgQkNKIGZpbHRlciBiZWluZyB1c2VkICovCisJZW51bSB7CisJCUJDSl9YODYgPSA0LCAgICAgICAgLyogeDg2IG9yIHg4Ni02NCAqLworCQlCQ0pfUE9XRVJQQyA9IDUsICAgIC8qIEJpZyBlbmRpYW4gb25seSAqLworCQlCQ0pfSUE2NCA9IDYsICAgICAgIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuICovCisJCUJDSl9BUk0gPSA3LCAgICAgICAgLyogTGl0dGxlIGVuZGlhbiBvbmx5ICovCisJCUJDSl9BUk1USFVNQiA9IDgsICAgLyogTGl0dGxlIGVuZGlhbiBvbmx5ICovCisJCUJDSl9TUEFSQyA9IDkgICAgICAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gKi8KKwl9IHR5cGU7CisKKwkvKgorCSAqIFJldHVybiB2YWx1ZSBvZiB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLiBXZSBuZWVkIHRvIHByZXNlcnZlCisJICogdGhpcyBpbmZvcm1hdGlvbiBhY3Jvc3MgY2FsbHMsIGJlY2F1c2Ugd2UgbXVzdCBub3QgY2FsbCB0aGUgbmV4dAorCSAqIGZpbHRlciBhbnltb3JlIG9uY2UgaXQgaGFzIHJldHVybmVkIFhaX1NUUkVBTV9FTkQuCisJICovCisJZW51bSB4el9yZXQgcmV0OworCisJLyogVHJ1ZSBpZiB3ZSBhcmUgb3BlcmF0aW5nIGluIHNpbmdsZS1jYWxsIG1vZGUuICovCisJYm9vbCBzaW5nbGVfY2FsbDsKKworCS8qCisJICogQWJzb2x1dGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkCisJICogZGF0YSAoaW4gYSBzaW5nbGUgLnh6IEJsb2NrKS4gV2UgY2FyZSBvbmx5IGFib3V0IHRoZSBsb3dlc3QgMzIKKwkgKiBiaXRzIHNvIHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIHVpbnQ2NF90IGV2ZW4gd2l0aCBiaWcgZmlsZXMuCisJICovCisJdWludDMyX3QgcG9zOworCisJLyogeDg2IGZpbHRlciBzdGF0ZSAqLworCXVpbnQzMl90IHg4Nl9wcmV2X21hc2s7CisKKwkvKiBUZW1wb3Jhcnkgc3BhY2UgdG8gaG9sZCB0aGUgdmFyaWFibGVzIGZyb20gc3RydWN0IHh6X2J1ZiAqLworCXVpbnQ4X3QgKm91dDsKKwlzaXplX3Qgb3V0X3BvczsKKwlzaXplX3Qgb3V0X3NpemU7CisKKwlzdHJ1Y3QgeworCQkvKiBBbW91bnQgb2YgYWxyZWFkeSBmaWx0ZXJlZCBkYXRhIGluIHRoZSBiZWdpbm5pbmcgb2YgYnVmICovCisJCXNpemVfdCBmaWx0ZXJlZDsKKworCQkvKiBUb3RhbCBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgc3RvcmVkIGluIGJ1ZiAgKi8KKwkJc2l6ZV90IHNpemU7CisKKwkJLyoKKwkJICogQnVmZmVyIHRvIGhvbGQgYSBtaXggb2YgZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQgZGF0YS4gVGhpcworCQkgKiBuZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgQWxpZ25tZW50ICsgMiAqIExvb2stYWhlYWQ6CisJCSAqCisJCSAqIFR5cGUgICAgICAgICBBbGlnbm1lbnQgICBMb29rLWFoZWFkCisJCSAqIHg4NiAgICAgICAgICAgICAgMSAgICAgICAgICAgNAorCQkgKiBQb3dlclBDICAgICAgICAgIDQgICAgICAgICAgIDAKKwkJICogSUEtNjQgICAgICAgICAgIDE2ICAgICAgICAgICAwCisJCSAqIEFSTSAgICAgICAgICAgICAgNCAgICAgICAgICAgMAorCQkgKiBBUk0tVGh1bWIgICAgICAgIDIgICAgICAgICAgIDIKKwkJICogU1BBUkMgICAgICAgICAgICA0ICAgICAgICAgICAwCisJCSAqLworCQl1aW50OF90IGJ1ZlsxNl07CisJfSB0ZW1wOworfTsKKworI2lmZGVmIFhaX0RFQ19YODYKKy8qCisgKiBUaGlzIGlzIG1hY3JvIHVzZWQgdG8gdGVzdCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIG9mIGEgbWVtb3J5IGFkZHJlc3MKKyAqIGluIGFuIHg4NiBpbnN0cnVjdGlvbi4KKyAqLworI2RlZmluZSBiY2pfeDg2X3Rlc3RfbXNieXRlKGIpICgoYikgPT0gMHgwMCB8fCAoYikgPT0gMHhGRikKKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBzaXplX3QgWFpfRlVOQyBiY2pfeDg2KAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdGF0aWMgY29uc3QgYm9vbCBtYXNrX3RvX2FsbG93ZWRfc3RhdHVzWzhdCisJCT0geyB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OworCisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWFza190b19iaXRfbnVtWzhdID0geyAwLCAxLCAyLCAyLCAzLCAzLCAzLCAzIH07CisKKwlzaXplX3QgaTsKKwlzaXplX3QgcHJldl9wb3MgPSAoc2l6ZV90KS0xOworCXVpbnQzMl90IHByZXZfbWFzayA9IHMtPng4Nl9wcmV2X21hc2s7CisJdWludDMyX3Qgc3JjOworCXVpbnQzMl90IGRlc3Q7CisJdWludDMyX3QgajsKKwl1aW50OF90IGI7CisKKwlpZiAoc2l6ZSA8PSA0KQorCQlyZXR1cm4gMDsKKworCXNpemUgLT0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisJCWlmICgoYnVmW2ldICYgMHhGRSkgIT0gMHhFOCkKKwkJCWNvbnRpbnVlOworCisJCXByZXZfcG9zID0gaSAtIHByZXZfcG9zOworCQlpZiAocHJldl9wb3MgPiAzKSB7CisJCQlwcmV2X21hc2sgPSAwOworCQl9IGVsc2UgeworCQkJcHJldl9tYXNrID0gKHByZXZfbWFzayA8PCAocHJldl9wb3MgLSAxKSkgJiA3OworCQkJaWYgKHByZXZfbWFzayAhPSAwKSB7CisJCQkJYiA9IGJ1ZltpICsgNCAtIG1hc2tfdG9fYml0X251bVtwcmV2X21hc2tdXTsKKwkJCQlpZiAoIW1hc2tfdG9fYWxsb3dlZF9zdGF0dXNbcHJldl9tYXNrXQorCQkJCQkJfHwgYmNqX3g4Nl90ZXN0X21zYnl0ZShiKSkgeworCQkJCQlwcmV2X3BvcyA9IGk7CisJCQkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgMSkgfCAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwcmV2X3BvcyA9IGk7CisKKwkJaWYgKGJjal94ODZfdGVzdF9tc2J5dGUoYnVmW2kgKyA0XSkpIHsKKwkJCXNyYyA9IGdldF91bmFsaWduZWRfbGUzMihidWYgKyBpICsgMSk7CisJCQl3aGlsZSAodHJ1ZSkgeworCQkJCWRlc3QgPSBzcmMgLSAocy0+cG9zICsgKHVpbnQzMl90KWkgKyA1KTsKKwkJCQlpZiAocHJldl9tYXNrID09IDApCisJCQkJCWJyZWFrOworCisJCQkJaiA9IG1hc2tfdG9fYml0X251bVtwcmV2X21hc2tdICogODsKKwkJCQliID0gKHVpbnQ4X3QpKGRlc3QgPj4gKDI0IC0gaikpOworCQkJCWlmICghYmNqX3g4Nl90ZXN0X21zYnl0ZShiKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlzcmMgPSBkZXN0IF4gKCgodWludDMyX3QpMSA8PCAoMzIgLSBqKSkgLSAxKTsKKwkJCX0KKworCQkJZGVzdCAmPSAweDAxRkZGRkZGOworCQkJZGVzdCB8PSAodWludDMyX3QpMCAtIChkZXN0ICYgMHgwMTAwMDAwMCk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIoZGVzdCwgYnVmICsgaSArIDEpOworCQkJaSArPSA0OworCQl9IGVsc2UgeworCQkJcHJldl9tYXNrID0gKHByZXZfbWFzayA8PCAxKSB8IDE7CisJCX0KKwl9CisKKwlwcmV2X3BvcyA9IGkgLSBwcmV2X3BvczsKKwlzLT54ODZfcHJldl9tYXNrID0gcHJldl9wb3MgPiAzID8gMCA6IHByZXZfbWFzayA8PCAocHJldl9wb3MgLSAxKTsKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgc2l6ZV90IFhaX0ZVTkMgYmNqX3Bvd2VycGMoCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGluc3RyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSA0KSB7CisJCWluc3RyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGJ1ZiArIGkpOworCQlpZiAoKGluc3RyICYgMHhGQzAwMDAwMykgPT0gMHg0ODAwMDAwMSkgeworCQkJaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKwkJCWluc3RyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworCQkJaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKwkJCWluc3RyIHw9IDB4NDgwMDAwMDE7CisJCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19JQTY0CitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHNpemVfdCBYWl9GVU5DIGJjal9pYTY0KAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdGF0aWMgY29uc3QgdWludDhfdCBicmFuY2hfdGFibGVbMzJdID0geworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQk0LCA0LCA2LCA2LCAwLCAwLCA3LCA3LAorCQk0LCA0LCAwLCAwLCA0LCA0LCAwLCAwCisJfTsKKworCS8qCisJICogVGhlIGxvY2FsIHZhcmlhYmxlcyB0YWtlIGEgbGl0dGxlIGJpdCBzdGFjayBzcGFjZSwgYnV0IGl0J3MgbGVzcworCSAqIHRoYW4gd2hhdCBMWk1BMiBkZWNvZGVyIHRha2VzLCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVkdWNlCisJICogc3RhY2sgdXNhZ2UgaGVyZSB3aXRob3V0IGRvaW5nIHRoYXQgZm9yIHRoZSBMWk1BMiBkZWNvZGVyIHRvby4KKwkgKi8KKworCS8qIExvb3AgY291bnRlcnMgKi8KKwlzaXplX3QgaTsKKwlzaXplX3QgajsKKworCS8qIEluc3RydWN0aW9uIHNsb3QgKDAsIDEsIG9yIDIpIGluIHRoZSAxMjgtYml0IGluc3RydWN0aW9uIHdvcmQgKi8KKwl1aW50MzJfdCBzbG90OworCisJLyogQml0d2lzZSBvZmZzZXQgb2YgdGhlIGluc3RydWN0aW9uIGluZGljYXRlZCBieSBzbG90ICovCisJdWludDMyX3QgYml0X3BvczsKKworCS8qIGJpdF9wb3Mgc3BsaXQgaW50byBieXRlIGFuZCBiaXQgcGFydHMgKi8KKwl1aW50MzJfdCBieXRlX3BvczsKKwl1aW50MzJfdCBiaXRfcmVzOworCisJLyogQWRkcmVzcyBwYXJ0IG9mIGFuIGluc3RydWN0aW9uICovCisJdWludDMyX3QgYWRkcjsKKworCS8qIE1hc2sgdXNlZCB0byBkZXRlY3Qgd2hpY2ggaW5zdHJ1Y3Rpb25zIHRvIGNvbnZlcnQgKi8KKwl1aW50MzJfdCBtYXNrOworCisJLyogNDEtYml0IGluc3RydWN0aW9uIHN0b3JlZCBzb21ld2hlcmUgaW4gdGhlIGxvd2VzdCA0OCBiaXRzICovCisJdWludDY0X3QgaW5zdHI7CisKKwkvKiBJbnN0cnVjdGlvbiBub3JtYWxpemVkIHdpdGggYml0X3JlcyBmb3IgZWFzaWVyIG1hbmlwdWxhdGlvbiAqLworCXVpbnQ2NF90IG5vcm07CisKKwlmb3IgKGkgPSAwOyBpICsgMTYgPD0gc2l6ZTsgaSArPSAxNikgeworCQltYXNrID0gYnJhbmNoX3RhYmxlW2J1ZltpXSAmIDB4MUZdOworCQlmb3IgKHNsb3QgPSAwLCBiaXRfcG9zID0gNTsgc2xvdCA8IDM7ICsrc2xvdCwgYml0X3BvcyArPSA0MSkgeworCQkJaWYgKCgobWFzayA+PiBzbG90KSAmIDEpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWJ5dGVfcG9zID0gYml0X3BvcyA+PiAzOworCQkJYml0X3JlcyA9IGJpdF9wb3MgJiA3OworCQkJaW5zdHIgPSAwOworCQkJZm9yIChqID0gMDsgaiA8IDY7ICsraikKKwkJCQlpbnN0ciB8PSAodWludDY0X3QpKGJ1ZltpICsgaiArIGJ5dGVfcG9zXSkKKwkJCQkJCTw8ICg4ICogaik7CisKKwkJCW5vcm0gPSBpbnN0ciA+PiBiaXRfcmVzOworCisJCQlpZiAoKChub3JtID4+IDM3KSAmIDB4MEYpID09IDB4MDUKKwkJCQkJJiYgKChub3JtID4+IDkpICYgMHgwNykgPT0gMCkgeworCQkJCWFkZHIgPSAobm9ybSA+PiAxMykgJiAweDBGRkZGRjsKKwkJCQlhZGRyIHw9ICgodWludDMyX3QpKG5vcm0gPj4gMzYpICYgMSkgPDwgMjA7CisJCQkJYWRkciA8PD0gNDsKKwkJCQlhZGRyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworCQkJCWFkZHIgPj49IDQ7CisKKwkJCQlub3JtICY9IH4oKHVpbnQ2NF90KTB4OEZGRkZGIDw8IDEzKTsKKwkJCQlub3JtIHw9ICh1aW50NjRfdCkoYWRkciAmIDB4MEZGRkZGKSA8PCAxMzsKKwkJCQlub3JtIHw9ICh1aW50NjRfdCkoYWRkciAmIDB4MTAwMDAwKQorCQkJCQkJPDwgKDM2IC0gMjApOworCisJCQkJaW5zdHIgJj0gKDEgPDwgYml0X3JlcykgLSAxOworCQkJCWluc3RyIHw9IG5vcm0gPDwgYml0X3JlczsKKworCQkJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJCQkJCWJ1ZltpICsgaiArIGJ5dGVfcG9zXQorCQkJCQkJPSAodWludDhfdCkoaW5zdHIgPj4gKDggKiBqKSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0FSTQorc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBzaXplX3QgWFpfRlVOQyBiY2pfYXJtKAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBhZGRyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSA0KSB7CisJCWlmIChidWZbaSArIDNdID09IDB4RUIpIHsKKwkJCWFkZHIgPSAodWludDMyX3QpYnVmW2ldIHwgKCh1aW50MzJfdClidWZbaSArIDFdIDw8IDgpCisJCQkJCXwgKCh1aW50MzJfdClidWZbaSArIDJdIDw8IDE2KTsKKwkJCWFkZHIgPDw9IDI7CisJCQlhZGRyIC09IHMtPnBvcyArICh1aW50MzJfdClpICsgODsKKwkJCWFkZHIgPj49IDI7CisJCQlidWZbaV0gPSAodWludDhfdClhZGRyOworCQkJYnVmW2kgKyAxXSA9ICh1aW50OF90KShhZGRyID4+IDgpOworCQkJYnVmW2kgKyAyXSA9ICh1aW50OF90KShhZGRyID4+IDE2KTsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNVEhVTUIKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgc2l6ZV90IFhaX0ZVTkMgYmNqX2FybXRodW1iKAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBhZGRyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSAyKSB7CisJCWlmICgoYnVmW2kgKyAxXSAmIDB4RjgpID09IDB4RjAKKwkJCQkmJiAoYnVmW2kgKyAzXSAmIDB4RjgpID09IDB4RjgpIHsKKwkJCWFkZHIgPSAoKCh1aW50MzJfdClidWZbaSArIDFdICYgMHgwNykgPDwgMTkpCisJCQkJCXwgKCh1aW50MzJfdClidWZbaV0gPDwgMTEpCisJCQkJCXwgKCgodWludDMyX3QpYnVmW2kgKyAzXSAmIDB4MDcpIDw8IDgpCisJCQkJCXwgKHVpbnQzMl90KWJ1ZltpICsgMl07CisJCQlhZGRyIDw8PSAxOworCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaSArIDQ7CisJCQlhZGRyID4+PSAxOworCQkJYnVmW2kgKyAxXSA9ICh1aW50OF90KSgweEYwIHwgKChhZGRyID4+IDE5KSAmIDB4MDcpKTsKKwkJCWJ1ZltpXSA9ICh1aW50OF90KShhZGRyID4+IDExKTsKKwkJCWJ1ZltpICsgM10gPSAodWludDhfdCkoMHhGOCB8ICgoYWRkciA+PiA4KSAmIDB4MDcpKTsKKwkJCWJ1ZltpICsgMl0gPSAodWludDhfdClhZGRyOworCQkJaSArPSAyOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19TUEFSQworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBzaXplX3QgWFpfRlVOQyBiY2pfc3BhcmMoCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGluc3RyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSA0KSB7CisJCWluc3RyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGJ1ZiArIGkpOworCQlpZiAoKGluc3RyID4+IDIyKSA9PSAweDEwMCB8fCAoaW5zdHIgPj4gMjIpID09IDB4MUZGKSB7CisJCQlpbnN0ciA8PD0gMjsKKwkJCWluc3RyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworCQkJaW5zdHIgPj49IDI7CisJCQlpbnN0ciA9ICgodWludDMyX3QpMHg0MDAwMDAwMCAtIChpbnN0ciAmIDB4NDAwMDAwKSkKKwkJCQkJfCAweDQwMDAwMDAwIHwgKGluc3RyICYgMHgzRkZGRkYpOworCQkJcHV0X3VuYWxpZ25lZF9iZTMyKGluc3RyLCBidWYgKyBpKTsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKy8qCisgKiBBcHBseSB0aGUgc2VsZWN0ZWQgQkNKIGZpbHRlci4gVXBkYXRlICpwb3MgYW5kIHMtPnBvcyB0byBtYXRjaCB0aGUgYW1vdW50CisgKiBvZiBkYXRhIHRoYXQgZ290IGZpbHRlcmVkLgorICoKKyAqIE5PVEU6IFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBzd2l0Y2ggc3RhdGVtZW50IHRvIGF2b2lkIHVzaW5nIGZ1bmN0aW9uCisgKiBwb2ludGVycywgd2hpY2ggY291bGQgYmUgcHJvYmxlbWF0aWMgaW4gdGhlIGtlcm5lbCBib290IGNvZGUsIHdoaWNoIG11c3QKKyAqIGF2b2lkIHBvaW50ZXJzIHRvIHN0YXRpYyBkYXRhIChhdCBsZWFzdCBvbiB4ODYpLgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGJjal9hcHBseShzdHJ1Y3QgeHpfZGVjX2JjaiAqcywKKwkJdWludDhfdCAqYnVmLCBzaXplX3QgKnBvcywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGZpbHRlcmVkOworCisJYnVmICs9ICpwb3M7CisJc2l6ZSAtPSAqcG9zOworCisJc3dpdGNoIChzLT50eXBlKSB7CisjaWZkZWYgWFpfREVDX1g4NgorCWNhc2UgQkNKX1g4NjoKKwkJZmlsdGVyZWQgPSBiY2pfeDg2KHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKwljYXNlIEJDSl9QT1dFUlBDOgorCQlmaWx0ZXJlZCA9IGJjal9wb3dlcnBjKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0lBNjQKKwljYXNlIEJDSl9JQTY0OgorCQlmaWx0ZXJlZCA9IGJjal9pYTY0KHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTQorCWNhc2UgQkNKX0FSTToKKwkJZmlsdGVyZWQgPSBiY2pfYXJtKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCisJY2FzZSBCQ0pfQVJNVEhVTUI6CisJCWZpbHRlcmVkID0gYmNqX2FybXRodW1iKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1NQQVJDCisJY2FzZSBCQ0pfU1BBUkM6CisJCWZpbHRlcmVkID0gYmNqX3NwYXJjKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogTmV2ZXIgcmVhY2hlZCBidXQgc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4gKi8KKwkJZmlsdGVyZWQgPSAwOworCQlicmVhazsKKwl9CisKKwkqcG9zICs9IGZpbHRlcmVkOworCXMtPnBvcyArPSBmaWx0ZXJlZDsKK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBNb3ZlIHRoZSByZW1haW5pbmcgbWl4dHVyZSBvZiBwb3NzaWJseSBmaWx0ZXJlZCBhbmQgdW5maWx0ZXJlZAorICogZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRlbXAuCisgKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgYmNqX2ZsdXNoKHN0cnVjdCB4el9kZWNfYmNqICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBjb3B5X3NpemU7CisKKwljb3B5X3NpemUgPSBtaW5fdChzaXplX3QsIHMtPnRlbXAuZmlsdGVyZWQsIGItPm91dF9zaXplIC0gYi0+b3V0X3Bvcyk7CisJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuYnVmLCBjb3B5X3NpemUpOworCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCisJcy0+dGVtcC5maWx0ZXJlZCAtPSBjb3B5X3NpemU7CisJcy0+dGVtcC5zaXplIC09IGNvcHlfc2l6ZTsKKwltZW1tb3ZlKHMtPnRlbXAuYnVmLCBzLT50ZW1wLmJ1ZiArIGNvcHlfc2l6ZSwgcy0+dGVtcC5zaXplKTsKK30KKworLyoKKyAqIFRoZSBCQ0ogZmlsdGVyIGZ1bmN0aW9ucyBhcmUgcHJpbWl0aXZlIGluIHNlbnNlIHRoYXQgdGhleSBwcm9jZXNzIHRoZQorICogZGF0YSBpbiBjaHVua3Mgb2YgMS0xNiBieXRlcy4gVG8gaGlkZSB0aGlzIGlzc3VlLCB0aGlzIGZ1bmN0aW9uIGRvZXMKKyAqIHNvbWUgYnVmZmVyaW5nLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfYmNqX3J1bihzdHJ1Y3QgeHpfZGVjX2JjaiAqcywKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IG91dF9zdGFydDsKKworCS8qCisJICogRmx1c2ggcGVuZGluZyBhbHJlYWR5IGZpbHRlcmVkIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIuIFJldHVybgorCSAqIGltbWVkaWF0ZWxseSBpZiB3ZSBjb3VsZG4ndCBmbHVzaCBldmVyeXRoaW5nLCBvciBpZiB0aGUgbmV4dAorCSAqIGZpbHRlciBpbiB0aGUgY2hhaW4gaGFkIGFscmVhZHkgcmV0dXJuZWQgWFpfU1RSRUFNX0VORC4KKwkgKi8KKwlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApIHsKKwkJYmNqX2ZsdXNoKHMsIGIpOworCQlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApCisJCQlyZXR1cm4gWFpfT0s7CisKKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIG1vcmUgb3V0cHV0IHNwYWNlIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgcGVuZGluZyBpbgorCSAqIHRlbXAsIGNvcHkgdGhlIHVuZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAgdG8gdGhlIG91dHB1dCBidWZmZXIKKwkgKiBhbmQgdHJ5IHRvIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgYnkgZGVjb2RpbmcgbW9yZSBkYXRhIGZyb20gdGhlCisJICogbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLiBBcHBseSB0aGUgQkNKIGZpbHRlciBvbiB0aGUgbmV3IGRhdGEKKwkgKiBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gSWYgZXZlcnl0aGluZyBjYW5ub3QgYmUgZmlsdGVyZWQsIGNvcHkgaXQKKwkgKiB0byB0ZW1wIGFuZCByZXdpbmQgdGhlIG91dHB1dCBidWZmZXIgcG9zaXRpb24gYWNjb3JkaW5nbHkuCisJICovCisJaWYgKHMtPnRlbXAuc2l6ZSA8IGItPm91dF9zaXplIC0gYi0+b3V0X3BvcykgeworCQlvdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworCQltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSk7CisJCWItPm91dF9wb3MgKz0gcy0+dGVtcC5zaXplOworCisJCXMtPnJldCA9IHh6X2RlY19sem1hMl9ydW4obHptYTIsIGIpOworCQlpZiAocy0+cmV0ICE9IFhaX1NUUkVBTV9FTkQKKwkJCQkmJiAocy0+cmV0ICE9IFhaX09LIHx8IHMtPnNpbmdsZV9jYWxsKSkKKwkJCXJldHVybiBzLT5yZXQ7CisKKwkJYmNqX2FwcGx5KHMsIGItPm91dCwgJm91dF9zdGFydCwgYi0+b3V0X3Bvcyk7CisKKwkJLyoKKwkJICogQXMgYW4gZXhjZXB0aW9uLCBpZiB0aGUgbmV4dCBmaWx0ZXIgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwKKwkJICogd2UgY2FuIGRvIHRoYXQgdG9vLCBzaW5jZSB0aGUgbGFzdCBmZXcgYnl0ZXMgdGhhdCByZW1haW4KKwkJICogdW5maWx0ZXJlZCBhcmUgbWVhbnQgdG8gcmVtYWluIHVuZmlsdGVyZWQuCisJCSAqLworCQlpZiAocy0+cmV0ID09IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKworCQlzLT50ZW1wLnNpemUgPSBiLT5vdXRfcG9zIC0gb3V0X3N0YXJ0OworCQliLT5vdXRfcG9zIC09IHMtPnRlbXAuc2l6ZTsKKwkJbWVtY3B5KHMtPnRlbXAuYnVmLCBiLT5vdXQgKyBiLT5vdXRfcG9zLCBzLT50ZW1wLnNpemUpOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSB1bmZpbHRlcmVkIGRhdGEgaW4gdGVtcCwgdHJ5IHRvIGZpbGwgYnkgZGVjb2RpbmcgbW9yZQorCSAqIGRhdGEgZnJvbSB0aGUgbmV4dCBmaWx0ZXIuIEFwcGx5IHRoZSBCQ0ogZmlsdGVyIG9uIHRlbXAuIFRoZW4gd2UKKwkgKiBob3BlZnVsbHkgY2FuIGZpbGwgdGhlIGFjdHVhbCBvdXRwdXQgYnVmZmVyIGJ5IGNvcHlpbmcgZmlsdGVyZWQKKwkgKiBkYXRhIGZyb20gdGVtcC4gQSBtaXggb2YgZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQgZGF0YSBtYXkgYmUgbGVmdAorCSAqIGluIHRlbXA7IGl0IHdpbGwgYmUgdGFrZW4gY2FyZSBvbiB0aGUgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisJICovCisJaWYgKHMtPnRlbXAuc2l6ZSA+IDApIHsKKwkJLyogTWFrZSBiLT5vdXR7LF9wb3MsX3NpemV9IHRlbXBvcmFyaWx5IHBvaW50IHRvIHMtPnRlbXAuICovCisJCXMtPm91dCA9IGItPm91dDsKKwkJcy0+b3V0X3BvcyA9IGItPm91dF9wb3M7CisJCXMtPm91dF9zaXplID0gYi0+b3V0X3NpemU7CisJCWItPm91dCA9IHMtPnRlbXAuYnVmOworCQliLT5vdXRfcG9zID0gcy0+dGVtcC5zaXplOworCQliLT5vdXRfc2l6ZSA9IHNpemVvZihzLT50ZW1wLmJ1Zik7CisKKwkJcy0+cmV0ID0geHpfZGVjX2x6bWEyX3J1bihsem1hMiwgYik7CisKKwkJcy0+dGVtcC5zaXplID0gYi0+b3V0X3BvczsKKwkJYi0+b3V0ID0gcy0+b3V0OworCQliLT5vdXRfcG9zID0gcy0+b3V0X3BvczsKKwkJYi0+b3V0X3NpemUgPSBzLT5vdXRfc2l6ZTsKKworCQlpZiAocy0+cmV0ICE9IFhaX09LICYmIHMtPnJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIHMtPnJldDsKKworCQliY2pfYXBwbHkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLmZpbHRlcmVkLCBzLT50ZW1wLnNpemUpOworCisJCS8qCisJCSAqIElmIHRoZSBuZXh0IGZpbHRlciByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELCB3ZSBtYXJrIHRoYXQKKwkJICogZXZlcnl0aGluZyBpcyBmaWx0ZXJlZCwgc2luY2UgdGhlIGxhc3QgdW5maWx0ZXJlZCBieXRlcworCQkgKiBvZiB0aGUgc3RyZWFtIGFyZSBtZWFudCB0byBiZSBsZWZ0IGFzIGlzLgorCQkgKi8KKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcy0+dGVtcC5maWx0ZXJlZCA9IHMtPnRlbXAuc2l6ZTsKKworCQliY2pfZmx1c2gocywgYik7CisJCWlmIChzLT50ZW1wLmZpbHRlcmVkID4gMCkKKwkJCXJldHVybiBYWl9PSzsKKwl9CisKKwlyZXR1cm4gcy0+cmV0OworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19iY2ogKiBYWl9GVU5DIHh6X2RlY19iY2pfY3JlYXRlKGJvb2wgc2luZ2xlX2NhbGwpCit7CisJc3RydWN0IHh6X2RlY19iY2ogKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzICE9IE5VTEwpCisJCXMtPnNpbmdsZV9jYWxsID0gc2luZ2xlX2NhbGw7CisKKwlyZXR1cm4gczsKK30KKworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgaWQpCit7CisJc3dpdGNoIChpZCkgeworI2lmZGVmIFhaX0RFQ19YODYKKwljYXNlIEJDSl9YODY6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfUE9XRVJQQworCWNhc2UgQkNKX1BPV0VSUEM6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfSUE2NAorCWNhc2UgQkNKX0lBNjQ6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNCisJY2FzZSBCQ0pfQVJNOgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCisJY2FzZSBCQ0pfQVJNVEhVTUI6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfU1BBUkMKKwljYXNlIEJDSl9TUEFSQzoKKyNlbmRpZgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFVuc3VwcG9ydGVkIEZpbHRlciBJRCAqLworCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKwl9CisKKwlzLT50eXBlID0gaWQ7CisJcy0+cmV0ID0gWFpfT0s7CisJcy0+cG9zID0gMDsKKwlzLT54ODZfcHJldl9tYXNrID0gMDsKKwlzLT50ZW1wLmZpbHRlcmVkID0gMDsKKwlzLT50ZW1wLnNpemUgPSAwOworCisJcmV0dXJuIFhaX09LOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfbHptYTIuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfbHptYTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTcxY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2RlY19sem1hMi5jCkBAIC0wLDAgKzEsMTE3NSBAQAorLyoKKyAqIExaTUEyIGRlY29kZXIKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisjaW5jbHVkZSAieHpfbHptYTIuaCIKKworLyoKKyAqIFJhbmdlIGRlY29kZXIgaW5pdGlhbGl6YXRpb24gZWF0cyB0aGUgZmlyc3QgZml2ZSBieXRlcyBvZiBlYWNoIExaTUEgY2h1bmsuCisgKi8KKyNkZWZpbmUgUkNfSU5JVF9CWVRFUyA1CisKKy8qCisgKiBNaW5pbXVtIG51bWJlciBvZiB1c2FibGUgaW5wdXQgYnVmZmVyIHRvIHNhZmVseSBkZWNvZGUgb25lIExaTUEgc3ltYm9sLgorICogVGhlIHdvcnN0IGNhc2UgaXMgdGhhdCB3ZSBkZWNvZGUgMjIgYml0cyB1c2luZyBwcm9iYWJpbGl0aWVzIGFuZCAyNgorICogZGlyZWN0IGJpdHMuIFRoaXMgbWF5IGRlY29kZSBhdCBtYXhpbXVtIG9mIDIwIGJ5dGVzIG9mIGlucHV0LiBIb3dldmVyLAorICogbHptYV9tYWluKCkgZG9lcyBhbiBleHRyYSBub3JtYWxpemF0aW9uIGJlZm9yZSByZXR1cm5pbmcsIHRodXMgd2UKKyAqIG5lZWQgdG8gcHV0IDIxIGhlcmUuCisgKi8KKyNkZWZpbmUgTFpNQV9JTl9SRVFVSVJFRCAyMQorCisvKgorICogRGljdGlvbmFyeSAoaGlzdG9yeSBidWZmZXIpCisgKgorICogVGhlc2UgYXJlIGFsd2F5cyB0cnVlOgorICogICAgc3RhcnQgPD0gcG9zIDw9IGZ1bGwgPD0gZW5kCisgKiAgICBwb3MgPD0gbGltaXQgPD0gZW5kCisgKgorICogSW4gbXVsdGktY2FsbCBtb2RlLCBhbHNvIHRoZXNlIGFyZSB0cnVlOgorICogICAgZW5kID09IHNpemUKKyAqICAgIHNpemUgPD0gc2l6ZV9tYXgKKyAqICAgIGFsbG9jYXRlZCA8PSBzaXplCisgKgorICogTW9zdCBvZiB0aGVzZSB2YXJpYWJsZXMgYXJlIHNpemVfdCB0byBzdXBwb3J0IHNpbmdsZS1jYWxsIG1vZGUsCisgKiBpbiB3aGljaCB0aGUgZGljdGlvbmFyeSB2YXJpYWJsZXMgYWRkcmVzcyB0aGUgYWN0dWFsIG91dHB1dAorICogYnVmZmVyIGRpcmVjdGx5LgorICovCitzdHJ1Y3QgZGljdGlvbmFyeSB7CisJLyogQmVnaW5uaW5nIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlciAqLworCXVpbnQ4X3QgKmJ1ZjsKKworCS8qIE9sZCBwb3NpdGlvbiBpbiBidWYgKGJlZm9yZSBkZWNvZGluZyBtb3JlIGRhdGEpICovCisJc2l6ZV90IHN0YXJ0OworCisJLyogUG9zaXRpb24gaW4gYnVmICovCisJc2l6ZV90IHBvczsKKworCS8qCisJICogSG93IGZ1bGwgZGljdGlvbmFyeSBpcy4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQKKwkgKiB3b3VsZCByZWFkIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLgorCSAqLworCXNpemVfdCBmdWxsOworCisJLyogV3JpdGUgbGltaXQ7IHdlIGRvbid0IHdyaXRlIHRvIGJ1ZltsaW1pdF0gb3IgbGF0ZXIgYnl0ZXMuICovCisJc2l6ZV90IGxpbWl0OworCisJLyoKKwkgKiBFbmQgb2YgdGhlIGRpY3Rpb25hcnkgYnVmZmVyLiBJbiBtdWx0aS1jYWxsIG1vZGUsIHRoaXMgaXMKKwkgKiB0aGUgc2FtZSBhcyB0aGUgZGljdGlvbmFyeSBzaXplLiBJbiBzaW5nbGUtY2FsbCBtb2RlLCB0aGlzCisJICogaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAqLworCXNpemVfdCBlbmQ7CisKKwkvKgorCSAqIFNpemUgb2YgdGhlIGRpY3Rpb25hcnkgYXMgc3BlY2lmaWVkIGluIEJsb2NrIEhlYWRlci4gVGhpcyBpcyB1c2VkCisJICogdG9nZXRoZXIgd2l0aCAiZnVsbCIgdG8gZGV0ZWN0IGNvcnJ1cHQgaW5wdXQgdGhhdCB3b3VsZCBtYWtlIHVzCisJICogcmVhZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4KKwkgKi8KKwl1aW50MzJfdCBzaXplOworCisJLyoKKwkgKiBNYXhpbXVtIGFsbG93ZWQgZGljdGlvbmFyeSBzaXplIGluIG11bHRpLWNhbGwgbW9kZS4KKwkgKiBUaGlzIGlzIGlnbm9yZWQgaW4gc2luZ2xlLWNhbGwgbW9kZS4KKwkgKi8KKwl1aW50MzJfdCBzaXplX21heDsKKworCS8qCisJICogQW1vdW50IG9mIG1lbW9yeSBjdXJyZW50bHkgYWxsb2NhdGVkIGZvciB0aGUgZGljdGlvbmFyeS4KKwkgKiBUaGlzIGlzIHVzZWQgb25seSB3aXRoIFhaX0RZTkFMTE9DLiAoV2l0aCBYWl9QUkVBTExPQywKKwkgKiBzaXplX21heCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGFsbG9jYXRlZCBzaXplLikKKwkgKi8KKwl1aW50MzJfdCBhbGxvY2F0ZWQ7CisKKwkvKiBPcGVyYXRpb24gbW9kZSAqLworCWVudW0geHpfbW9kZSBtb2RlOworfTsKKworLyogUmFuZ2UgZGVjb2RlciAqLworc3RydWN0IHJjX2RlYyB7CisJdWludDMyX3QgcmFuZ2U7CisJdWludDMyX3QgY29kZTsKKworCS8qCisJICogTnVtYmVyIG9mIGluaXRpYWxpemluZyBieXRlcyByZW1haW5pbmcgdG8gYmUgcmVhZAorCSAqIGJ5IHJjX3JlYWRfaW5pdCgpLgorCSAqLworCXVpbnQzMl90IGluaXRfYnl0ZXNfbGVmdDsKKworCS8qCisJICogQnVmZmVyIGZyb20gd2hpY2ggd2UgcmVhZCBvdXIgaW5wdXQuIEl0IGNhbiBiZSBlaXRoZXIKKwkgKiB0ZW1wLmJ1ZiBvciB0aGUgY2FsbGVyLXByb3ZpZGVkIGlucHV0IGJ1ZmZlci4KKwkgKi8KKwljb25zdCB1aW50OF90ICppbjsKKwlzaXplX3QgaW5fcG9zOworCXNpemVfdCBpbl9saW1pdDsKK307CisKKy8qIFByb2JhYmlsaXRpZXMgZm9yIGEgbGVuZ3RoIGRlY29kZXIuICovCitzdHJ1Y3QgbHptYV9sZW5fZGVjIHsKKwkvKiBQcm9iYWJpbGl0eSBvZiBtYXRjaCBsZW5ndGggYmVpbmcgYXQgbGVhc3QgMTAgKi8KKwl1aW50MTZfdCBjaG9pY2U7CisKKwkvKiBQcm9iYWJpbGl0eSBvZiBtYXRjaCBsZW5ndGggYmVpbmcgYXQgbGVhc3QgMTggKi8KKwl1aW50MTZfdCBjaG9pY2UyOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAyLTkgKi8KKwl1aW50MTZfdCBsb3dbUE9TX1NUQVRFU19NQVhdW0xFTl9MT1dfU1lNQk9MU107CisKKwkvKiBQcm9iYWJpbGl0aWVzIGZvciBtYXRjaCBsZW5ndGhzIDEwLTE3ICovCisJdWludDE2X3QgbWlkW1BPU19TVEFURVNfTUFYXVtMRU5fTUlEX1NZTUJPTFNdOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxOC0yNzMgKi8KKwl1aW50MTZfdCBoaWdoW0xFTl9ISUdIX1NZTUJPTFNdOworfTsKKworc3RydWN0IGx6bWFfZGVjIHsKKwkvKiBEaXN0YW5jZXMgb2YgbGF0ZXN0IGZvdXIgbWF0Y2hlcyAqLworCXVpbnQzMl90IHJlcDA7CisJdWludDMyX3QgcmVwMTsKKwl1aW50MzJfdCByZXAyOworCXVpbnQzMl90IHJlcDM7CisKKwkvKiBUeXBlcyBvZiB0aGUgbW9zdCByZWNlbnRseSBzZWVuIExaTUEgc3ltYm9scyAqLworCWVudW0gbHptYV9zdGF0ZSBzdGF0ZTsKKworCS8qCisJICogTGVuZ3RoIG9mIGEgbWF0Y2guIFRoaXMgaXMgdXBkYXRlZCBzbyB0aGF0IGRpY3RfcmVwZWF0IGNhbgorCSAqIGJlIGNhbGxlZCBhZ2FpbiB0byBmaW5pc2ggcmVwZWF0aW5nIHRoZSB3aG9sZSBtYXRjaC4KKwkgKi8KKwl1aW50MzJfdCBsZW47CisKKwkvKgorCSAqIExaTUEgcHJvcGVydGllcyBvciByZWxhdGVkIGJpdCBtYXNrcyAobnVtYmVyIG9mIGxpdGVyYWwKKwkgKiBjb250ZXh0IGJpdHMsIGEgbWFzayBkZXJ2aWVkIGZyb20gdGhlIG51bWJlciBvZiBsaXRlcmFsCisJICogcG9zaXRpb24gYml0cywgYW5kIGEgbWFzayBkZXJ2aWVkIGZyb20gdGhlIG51bWJlcgorCSAqIHBvc2l0aW9uIGJpdHMpCisJICovCisJdWludDMyX3QgbGM7CisJdWludDMyX3QgbGl0ZXJhbF9wb3NfbWFzazsgLyogKDEgPDwgbHApIC0gMSAqLworCXVpbnQzMl90IHBvc19tYXNrOyAgICAgICAgIC8qICgxIDw8IHBiKSAtIDEgKi8KKworCS8qIElmIDEsIGl0J3MgYSBtYXRjaC4gT3RoZXJ3aXNlIGl0J3MgYSBzaW5nbGUgOC1iaXQgbGl0ZXJhbC4gKi8KKwl1aW50MTZfdCBpc19tYXRjaFtTVEFURVNdW1BPU19TVEFURVNfTUFYXTsKKworCS8qIElmIDEsIGl0J3MgYSByZXBlYXRlZCBtYXRjaC4gVGhlIGRpc3RhbmNlIGlzIG9uZSBvZiByZXAwIC4uIHJlcDMuICovCisJdWludDE2X3QgaXNfcmVwW1NUQVRFU107CisKKwkvKgorCSAqIElmIDAsIGRpc3RhbmNlIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggaXMgcmVwMC4KKwkgKiBPdGhlcndpc2UgY2hlY2sgaXNfcmVwMS4KKwkgKi8KKwl1aW50MTZfdCBpc19yZXAwW1NUQVRFU107CisKKwkvKgorCSAqIElmIDAsIGRpc3RhbmNlIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggaXMgcmVwMS4KKwkgKiBPdGhlcndpc2UgY2hlY2sgaXNfcmVwMi4KKwkgKi8KKwl1aW50MTZfdCBpc19yZXAxW1NUQVRFU107CisKKwkvKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDIuIE90aGVyd2lzZSBpdCBpcyByZXAzLiAqLworCXVpbnQxNl90IGlzX3JlcDJbU1RBVEVTXTsKKworCS8qCisJICogSWYgMSwgdGhlIHJlcGVhdGVkIG1hdGNoIGhhcyBsZW5ndGggb2Ygb25lIGJ5dGUuIE90aGVyd2lzZQorCSAqIHRoZSBsZW5ndGggaXMgZGVjb2RlZCBmcm9tIHJlcF9sZW5fZGVjb2Rlci4KKwkgKi8KKwl1aW50MTZfdCBpc19yZXAwX2xvbmdbU1RBVEVTXVtQT1NfU1RBVEVTX01BWF07CisKKwkvKgorCSAqIFByb2JhYmlsaXR5IHRyZWUgZm9yIHRoZSBoaWdoZXN0IHR3byBiaXRzIG9mIHRoZSBtYXRjaAorCSAqIGRpc3RhbmNlLiBUaGVyZSBpcyBhIHNlcGFyYXRlIHByb2JhYmlsaXR5IHRyZWUgZm9yIG1hdGNoCisJICogbGVuZ3RocyBvZiAyIChpLmUuIE1BVENIX0xFTl9NSU4pLCAzLCA0LCBhbmQgWzUsIDI3M10uCisJICovCisJdWludDE2X3QgZGlzdF9zbG90W0RJU1RfU1RBVEVTXVtESVNUX1NMT1RTXTsKKworCS8qCisJICogUHJvYmlsaXR5IHRyZWVzIGZvciBhZGRpdGlvbmFsIGJpdHMgZm9yIG1hdGNoIGRpc3RhbmNlCisJICogd2hlbiB0aGUgZGlzdGFuY2UgaXMgaW4gdGhlIHJhbmdlIFs0LCAxMjddLgorCSAqLworCXVpbnQxNl90IGRpc3Rfc3BlY2lhbFtGVUxMX0RJU1RBTkNFUyAtIERJU1RfTU9ERUxfRU5EXTsKKworCS8qCisJICogUHJvYmFiaWxpdHkgdHJlZSBmb3IgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgYSBtYXRjaAorCSAqIGRpc3RhbmNlIHRoYXQgaXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDEyOC4KKwkgKi8KKwl1aW50MTZfdCBkaXN0X2FsaWduW0FMSUdOX1NJWkVdOworCisJLyogTGVuZ3RoIG9mIGEgbm9ybWFsIG1hdGNoICovCisJc3RydWN0IGx6bWFfbGVuX2RlYyBtYXRjaF9sZW5fZGVjOworCisJLyogTGVuZ3RoIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggKi8KKwlzdHJ1Y3QgbHptYV9sZW5fZGVjIHJlcF9sZW5fZGVjOworCisJLyogUHJvYmFiaWxpdGllcyBvZiBsaXRlcmFscyAqLworCXVpbnQxNl90IGxpdGVyYWxbTElURVJBTF9DT0RFUlNfTUFYXVtMSVRFUkFMX0NPREVSX1NJWkVdOworfTsKKworc3RydWN0IGx6bWEyX2RlYyB7CisJLyogUG9zaXRpb24gaW4geHpfZGVjX2x6bWEyX3J1bigpLiAqLworCWVudW0gbHptYTJfc2VxIHsKKwkJU0VRX0NPTlRST0wsCisJCVNFUV9VTkNPTVBSRVNTRURfMSwKKwkJU0VRX1VOQ09NUFJFU1NFRF8yLAorCQlTRVFfQ09NUFJFU1NFRF8wLAorCQlTRVFfQ09NUFJFU1NFRF8xLAorCQlTRVFfUFJPUEVSVElFUywKKwkJU0VRX0xaTUFfUFJFUEFSRSwKKwkJU0VRX0xaTUFfUlVOLAorCQlTRVFfQ09QWQorCX0gc2VxdWVuY2U7CisKKwkvKiBOZXh0IHBvc2l0aW9uIGFmdGVyIGRlY29kaW5nIHRoZSBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGNodW5rLiAqLworCWVudW0gbHptYTJfc2VxIG5leHRfc2VxdWVuY2U7CisKKwkvKiBVbmNvbXByZXNzZWQgc2l6ZSBvZiBMWk1BIGNodW5rICgyIE1pQiBhdCBtYXhpbXVtKSAqLworCXVpbnQzMl90IHVuY29tcHJlc3NlZDsKKworCS8qCisJICogQ29tcHJlc3NlZCBzaXplIG9mIExaTUEgY2h1bmsgb3IgY29tcHJlc3NlZC91bmNvbXByZXNzZWQKKwkgKiBzaXplIG9mIHVuY29tcHJlc3NlZCBjaHVuayAoNjQgS2lCIGF0IG1heGltdW0pCisJICovCisJdWludDMyX3QgY29tcHJlc3NlZDsKKworCS8qCisJICogVHJ1ZSBpZiBkaWN0aW9uYXJ5IHJlc2V0IGlzIG5lZWRlZC4gVGhpcyBpcyBmYWxzZSBiZWZvcmUKKwkgKiB0aGUgZmlyc3QgY2h1bmsgKExaTUEgb3IgdW5jb21wcmVzc2VkKS4KKwkgKi8KKwlib29sIG5lZWRfZGljdF9yZXNldDsKKworCS8qCisJICogVHJ1ZSBpZiBuZXcgTFpNQSBwcm9wZXJ0aWVzIGFyZSBuZWVkZWQuIFRoaXMgaXMgZmFsc2UKKwkgKiBiZWZvcmUgdGhlIGZpcnN0IExaTUEgY2h1bmsuCisJICovCisJYm9vbCBuZWVkX3Byb3BzOworfTsKKworc3RydWN0IHh6X2RlY19sem1hMiB7CisJLyoKKwkgKiBUaGUgb3JkZXIgYmVsb3cgaXMgaW1wb3J0YW50IG9uIHg4NiB0byByZWR1Y2UgY29kZSBzaXplIGFuZAorCSAqIGl0IHNob3VsZG4ndCBodXJ0IG9uIG90aGVyIHBsYXRmb3Jtcy4gRXZlcnl0aGluZyB1cCB0byBhbmQKKwkgKiBpbmNsdWRpbmcgbHptYS5wb3NfbWFzayBhcmUgaW4gdGhlIGZpcnN0IDEyOCBieXRlcyBvbiB4ODYtMzIsCisJICogd2hpY2ggYWxsb3dzIHVzaW5nIHNtYWxsZXIgaW5zdHJ1Y3Rpb25zIHRvIGFjY2VzcyB0aG9zZQorCSAqIHZhcmlhYmxlcy4gT24geDg2LTY0LCBmZXdlciB2YXJpYWJsZXMgZml0IGludG8gdGhlIGZpcnN0IDEyOAorCSAqIGJ5dGVzLCBidXQgdGhpcyBpcyBzdGlsbCB0aGUgYmVzdCBvcmRlciB3aXRob3V0IHNhY3JpZmljaW5nCisJICogdGhlIHJlYWRhYmlsaXR5IGJ5IHNwbGl0dGluZyB0aGUgc3RydWN0dXJlcy4KKwkgKi8KKwlzdHJ1Y3QgcmNfZGVjIHJjOworCXN0cnVjdCBkaWN0aW9uYXJ5IGRpY3Q7CisJc3RydWN0IGx6bWEyX2RlYyBsem1hMjsKKwlzdHJ1Y3QgbHptYV9kZWMgbHptYTsKKworCS8qCisJICogVGVtcG9yYXJ5IGJ1ZmZlciB3aGljaCBob2xkcyBzbWFsbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgYmV0d2VlbgorCSAqIGRlY29kZXIgY2FsbHMuIFNlZSBsem1hMl9sem1hKCkgZm9yIGRldGFpbHMuCisJICovCisJc3RydWN0IHsKKwkJdWludDMyX3Qgc2l6ZTsKKwkJdWludDhfdCBidWZbMyAqIExaTUFfSU5fUkVRVUlSRURdOworCX0gdGVtcDsKK307CisKKy8qKioqKioqKioqKioqKgorICogRGljdGlvbmFyeSAqCisgKioqKioqKioqKioqKiovCisKKy8qCisgKiBSZXNldCB0aGUgZGljdGlvbmFyeSBzdGF0ZS4gV2hlbiBpbiBzaW5nbGUtY2FsbCBtb2RlLCBzZXQgdXAgdGhlIGJlZ2lubmluZworICogb2YgdGhlIGRpY3Rpb25hcnkgdG8gcG9pbnQgdG8gdGhlIGFjdHVhbCBvdXRwdXQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGRpY3RfcmVzZXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIpCit7CisJaWYgKERFQ19JU19TSU5HTEUoZGljdC0+bW9kZSkpIHsKKwkJZGljdC0+YnVmID0gYi0+b3V0ICsgYi0+b3V0X3BvczsKKwkJZGljdC0+ZW5kID0gYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zOworCX0KKworCWRpY3QtPnN0YXJ0ID0gMDsKKwlkaWN0LT5wb3MgPSAwOworCWRpY3QtPmxpbWl0ID0gMDsKKwlkaWN0LT5mdWxsID0gMDsKK30KKworLyogU2V0IGRpY3Rpb25hcnkgd3JpdGUgbGltaXQgKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgZGljdF9saW1pdChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc2l6ZV90IG91dF9tYXgpCit7CisJaWYgKGRpY3QtPmVuZCAtIGRpY3QtPnBvcyA8PSBvdXRfbWF4KQorCQlkaWN0LT5saW1pdCA9IGRpY3QtPmVuZDsKKwllbHNlCisJCWRpY3QtPmxpbWl0ID0gZGljdC0+cG9zICsgb3V0X21heDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGJ5dGUgY2FuIGJlIHdyaXR0ZW4gaW50byB0aGUgZGljdGlvbmFyeS4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBYWl9GVU5DIGRpY3RfaGFzX3NwYWNlKGNvbnN0IHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0KQoreworCXJldHVybiBkaWN0LT5wb3MgPCBkaWN0LT5saW1pdDsKK30KKworLyoKKyAqIEdldCBhIGJ5dGUgZnJvbSB0aGUgZGljdGlvbmFyeSBhdCB0aGUgZ2l2ZW4gZGlzdGFuY2UuIFRoZSBkaXN0YW5jZSBpcworICogYXNzdW1lZCB0byB2YWxpZCwgb3IgYXMgYSBzcGVjaWFsIGNhc2UsIHplcm8gd2hlbiB0aGUgZGljdGlvbmFyeSBpcworICogc3RpbGwgZW1wdHkuIFRoaXMgc3BlY2lhbCBjYXNlIGlzIG5lZWRlZCBmb3Igc2luZ2xlLWNhbGwgZGVjb2RpbmcgdG8KKyAqIGF2b2lkIHdyaXRpbmcgYSAnXDAnIHRvIHRoZSBlbmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1aW50MzJfdCBYWl9GVU5DIGRpY3RfZ2V0KAorCQljb25zdCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgdWludDMyX3QgZGlzdCkKK3sKKwlzaXplX3Qgb2Zmc2V0ID0gZGljdC0+cG9zIC0gZGlzdCAtIDE7CisKKwlpZiAoZGlzdCA+PSBkaWN0LT5wb3MpCisJCW9mZnNldCArPSBkaWN0LT5lbmQ7CisKKwlyZXR1cm4gZGljdC0+ZnVsbCA+IDAgPyBkaWN0LT5idWZbb2Zmc2V0XSA6IDA7Cit9CisKKy8qCisgKiBQdXQgb25lIGJ5dGUgaW50byB0aGUgZGljdGlvbmFyeS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIGlzIHNwYWNlIGZvciBpdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIFhaX0ZVTkMgZGljdF9wdXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQ4X3QgYnl0ZSkKK3sKKwlkaWN0LT5idWZbZGljdC0+cG9zKytdID0gYnl0ZTsKKworCWlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorCQlkaWN0LT5mdWxsID0gZGljdC0+cG9zOworfQorCisvKgorICogUmVwZWF0IGdpdmVuIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBnaXZlbiBkaXN0YW5jZS4gSWYgdGhlIGRpc3RhbmNlIGlzCisgKiBpbnZhbGlkLCBmYWxzZSBpcyByZXR1cm5lZC4gT24gc3VjY2VzcywgdHJ1ZSBpcyByZXR1cm5lZCBhbmQgKmxlbiBpcworICogdXBkYXRlZCB0byBpbmRpY2F0ZSBob3cgbWFueSBieXRlcyB3ZXJlIGxlZnQgdG8gYmUgcmVwZWF0ZWQuCisgKi8KK3N0YXRpYyBib29sIFhaX0ZVTkMgZGljdF9yZXBlYXQoCisJCXN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCB1aW50MzJfdCAqbGVuLCB1aW50MzJfdCBkaXN0KQoreworCXNpemVfdCBiYWNrOworCXVpbnQzMl90IGxlZnQ7CisKKwlpZiAoZGlzdCA+PSBkaWN0LT5mdWxsIHx8IGRpc3QgPj0gZGljdC0+c2l6ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJbGVmdCA9IG1pbl90KHNpemVfdCwgZGljdC0+bGltaXQgLSBkaWN0LT5wb3MsICpsZW4pOworCSpsZW4gLT0gbGVmdDsKKworCWJhY2sgPSBkaWN0LT5wb3MgLSBkaXN0IC0gMTsKKwlpZiAoZGlzdCA+PSBkaWN0LT5wb3MpCisJCWJhY2sgKz0gZGljdC0+ZW5kOworCisJZG8geworCQlkaWN0LT5idWZbZGljdC0+cG9zKytdID0gZGljdC0+YnVmW2JhY2srK107CisJCWlmIChiYWNrID09IGRpY3QtPmVuZCkKKwkJCWJhY2sgPSAwOworCX0gd2hpbGUgKC0tbGVmdCA+IDApOworCisJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCWRpY3QtPmZ1bGwgPSBkaWN0LT5wb3M7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogQ29weSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBmcm9tIGlucHV0IHRvIGRpY3Rpb25hcnkgYW5kIG91dHB1dCBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBkaWN0X3VuY29tcHJlc3NlZCgKKwkJc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIsIHVpbnQzMl90ICpsZWZ0KQoreworCXNpemVfdCBjb3B5X3NpemU7CisKKwl3aGlsZSAoKmxlZnQgPiAwICYmIGItPmluX3BvcyA8IGItPmluX3NpemUKKwkJCSYmIGItPm91dF9wb3MgPCBiLT5vdXRfc2l6ZSkgeworCQljb3B5X3NpemUgPSBtaW4oYi0+aW5fc2l6ZSAtIGItPmluX3BvcywKKwkJCQliLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpOworCQlpZiAoY29weV9zaXplID4gZGljdC0+ZW5kIC0gZGljdC0+cG9zKQorCQkJY29weV9zaXplID0gZGljdC0+ZW5kIC0gZGljdC0+cG9zOworCQlpZiAoY29weV9zaXplID4gKmxlZnQpCisJCQljb3B5X3NpemUgPSAqbGVmdDsKKworCQkqbGVmdCAtPSBjb3B5X3NpemU7CisKKwkJbWVtY3B5KGRpY3QtPmJ1ZiArIGRpY3QtPnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisJCWRpY3QtPnBvcyArPSBjb3B5X3NpemU7CisKKwkJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCQlkaWN0LT5mdWxsID0gZGljdC0+cG9zOworCisJCWlmIChERUNfSVNfTVVMVEkoZGljdC0+bW9kZSkpIHsKKwkJCWlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorCQkJCWRpY3QtPnBvcyA9IDA7CisKKwkJCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBiLT5pbiArIGItPmluX3BvcywKKwkJCQkJY29weV9zaXplKTsKKwkJfQorCisJCWRpY3QtPnN0YXJ0ID0gZGljdC0+cG9zOworCisJCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCQliLT5pbl9wb3MgKz0gY29weV9zaXplOworCisJfQorfQorCisvKgorICogRmx1c2ggcGVuZGluZyBkYXRhIGZyb20gZGljdGlvbmFyeSB0byBiLT5vdXQuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSBpcworICogZW5vdWdoIHNwYWNlIGluIGItPm91dC4gVGhpcyBpcyBndWFyYW50ZWVkIGJlY2F1c2UgY2FsbGVyIHVzZXMgZGljdF9saW1pdCgpCisgKiBiZWZvcmUgZGVjb2RpbmcgZGF0YSBpbnRvIHRoZSBkaWN0aW9uYXJ5LgorICovCitzdGF0aWMgdWludDMyX3QgWFpfRlVOQyBkaWN0X2ZsdXNoKHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBjb3B5X3NpemUgPSBkaWN0LT5wb3MgLSBkaWN0LT5zdGFydDsKKworCWlmIChERUNfSVNfTVVMVEkoZGljdC0+bW9kZSkpIHsKKwkJaWYgKGRpY3QtPnBvcyA9PSBkaWN0LT5lbmQpCisJCQlkaWN0LT5wb3MgPSAwOworCisJCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBkaWN0LT5idWYgKyBkaWN0LT5zdGFydCwKKwkJCQljb3B5X3NpemUpOworCX0KKworCWRpY3QtPnN0YXJ0ID0gZGljdC0+cG9zOworCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCXJldHVybiBjb3B5X3NpemU7Cit9CisKKy8qKioqKioqKioqKioqKioqKgorICogUmFuZ2UgZGVjb2RlciAqCisgKioqKioqKioqKioqKioqKiovCisKKy8qIFJlc2V0IHRoZSByYW5nZSBkZWNvZGVyLiAqLworc3RhdGljIHZvaWQgWFpfRlVOQyByY19yZXNldChzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyYy0+cmFuZ2UgPSAodWludDMyX3QpLTE7CisJcmMtPmNvZGUgPSAwOworCXJjLT5pbml0X2J5dGVzX2xlZnQgPSBSQ19JTklUX0JZVEVTOworfQorCisvKgorICogUmVhZCB0aGUgZmlyc3QgZml2ZSBpbml0aWFsIGJ5dGVzIGludG8gcmMtPmNvZGUgaWYgdGhleSBoYXZlbid0IGJlZW4KKyAqIHJlYWQgYWxyZWFkeS4gKFllcywgdGhlIGZpcnN0IGJ5dGUgZ2V0cyBjb21wbGV0ZWx5IGlnbm9yZWQuKQorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIHJjX3JlYWRfaW5pdChzdHJ1Y3QgcmNfZGVjICpyYywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwl3aGlsZSAocmMtPmluaXRfYnl0ZXNfbGVmdCA+IDApIHsKKwkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IDgpICsgYi0+aW5bYi0+aW5fcG9zKytdOworCQktLXJjLT5pbml0X2J5dGVzX2xlZnQ7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZXJlIG1heSBub3QgYmUgZW5vdWdoIGlucHV0IGZvciB0aGUgbmV4dCBkZWNvZGluZyBsb29wLiAqLworc3RhdGljIGlubGluZSBib29sIFhaX0ZVTkMgcmNfbGltaXRfZXhjZWVkZWQoY29uc3Qgc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmV0dXJuIHJjLT5pbl9wb3MgPiByYy0+aW5fbGltaXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSAoZnJvbSBwb2ludCBvZiB2aWV3IG9mIHJhbmdlIGRlY29kZXIpIHRoYXQKKyAqIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBMWk1BIGNodW5rLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgWFpfRlVOQyByY19pc19maW5pc2hlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyZXR1cm4gcmMtPmNvZGUgPT0gMDsKK30KKworLyogUmVhZCB0aGUgbmV4dCBpbnB1dCBieXRlIGlmIG5lZWRlZC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBYWl9GVU5DIHJjX25vcm1hbGl6ZShzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlpZiAocmMtPnJhbmdlIDwgUkNfVE9QX1ZBTFVFKSB7CisJCXJjLT5yYW5nZSA8PD0gUkNfU0hJRlRfQklUUzsKKwkJcmMtPmNvZGUgPSAocmMtPmNvZGUgPDwgUkNfU0hJRlRfQklUUykgKyByYy0+aW5bcmMtPmluX3BvcysrXTsKKwl9Cit9CisKKy8qCisgKiBEZWNvZGUgb25lIGJpdC4gSW4gc29tZSB2ZXJzaW9ucywgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBzcGxpdHRlZCBpbiB0aHJlZQorICogZnVuY3Rpb25zIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGlzIHN1cHBvc2VkIHRvIGJlIGFibGUgdG8gbW9yZSBlYXNpbHkgYXZvaWQKKyAqIGFuIGV4dHJhIGJyYW5jaC4gSW4gdGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIExaTUEgZGVjb2RlciwgdGhpcworICogZG9lc24ndCBzZWVtIHRvIGJlIGEgZ29vZCBpZGVhICh0ZXN0ZWQgd2l0aCBHQ0MgMy4zLjYsIDMuNC42LCBhbmQgNC4zLjMKKyAqIG9uIHg4NikuIFVzaW5nIGEgbm9uLXNwbGl0dGVkIHZlcnNpb24gcmVzdWx0cyBpbiBuaWNlciBsb29raW5nIGNvZGUgdG9vLgorICoKKyAqIE5PVEU6IFRoaXMgbXVzdCByZXR1cm4gYW4gaW50LiBEbyBub3QgbWFrZSBpdCByZXR1cm4gYSBib29sIG9yIHRoZSBzcGVlZAorICogb2YgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IEdDQyAzLnggZGVjcmVhc2VzIDEwLTE1ICUuIChHQ0MgNC4zIGRvZXNuJ3QgY2FyZSwKKyAqIGFuZCBpdCBnZW5lcmF0ZXMgMTAtMjAgJSBmYXN0ZXIgY29kZSB0aGFuIEdDQyAzLnggZnJvbSB0aGlzIGZpbGUgYW55d2F5LikKKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgWFpfRlVOQyByY19iaXQoc3RydWN0IHJjX2RlYyAqcmMsIHVpbnQxNl90ICpwcm9iKQoreworCXVpbnQzMl90IGJvdW5kOworCWludCBiaXQ7CisKKwlyY19ub3JtYWxpemUocmMpOworCWJvdW5kID0gKHJjLT5yYW5nZSA+PiBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUykgKiAqcHJvYjsKKwlpZiAocmMtPmNvZGUgPCBib3VuZCkgeworCQlyYy0+cmFuZ2UgPSBib3VuZDsKKwkJKnByb2IgKz0gKFJDX0JJVF9NT0RFTF9UT1RBTCAtICpwcm9iKSA+PiBSQ19NT1ZFX0JJVFM7CisJCWJpdCA9IDA7CisJfSBlbHNlIHsKKwkJcmMtPnJhbmdlIC09IGJvdW5kOworCQlyYy0+Y29kZSAtPSBib3VuZDsKKwkJKnByb2IgLT0gKnByb2IgPj4gUkNfTU9WRV9CSVRTOworCQliaXQgPSAxOworCX0KKworCXJldHVybiBiaXQ7Cit9CisKKy8qIERlY29kZSBhIGJpdHRyZWUgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgcmNfYml0dHJlZSgKKwkJc3RydWN0IHJjX2RlYyAqcmMsIHVpbnQxNl90ICpwcm9icywgdWludDMyX3QgbGltaXQpCit7CisJdWludDMyX3Qgc3ltYm9sID0gMTsKKworCWRvIHsKKwkJaWYgKHJjX2JpdChyYywgJnByb2JzW3N5bWJvbF0pKQorCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCWVsc2UKKwkJCXN5bWJvbCA8PD0gMTsKKwl9IHdoaWxlIChzeW1ib2wgPCBsaW1pdCk7CisKKwlyZXR1cm4gc3ltYm9sOworfQorCisvKiBEZWNvZGUgYSBiaXR0cmVlIHN0YXJ0aW5nIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBYWl9GVU5DIHJjX2JpdHRyZWVfcmV2ZXJzZShzdHJ1Y3QgcmNfZGVjICpyYywKKwkJdWludDE2X3QgKnByb2JzLCB1aW50MzJfdCAqZGVzdCwgdWludDMyX3QgbGltaXQpCit7CisJdWludDMyX3Qgc3ltYm9sID0gMTsKKwl1aW50MzJfdCBpID0gMDsKKworCWRvIHsKKwkJaWYgKHJjX2JpdChyYywgJnByb2JzW3N5bWJvbF0pKSB7CisJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJCSpkZXN0ICs9IDEgPDwgaTsKKwkJfSBlbHNlIHsKKwkJCXN5bWJvbCA8PD0gMTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IGxpbWl0KTsKK30KKworLyogRGVjb2RlIGRpcmVjdCBiaXRzIChmaXhlZCBmaWZ0eS1maWZ0eSBwcm9iYWJpbGl0eSkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIHJjX2RpcmVjdCgKKwkJc3RydWN0IHJjX2RlYyAqcmMsIHVpbnQzMl90ICpkZXN0LCB1aW50MzJfdCBsaW1pdCkKK3sKKwl1aW50MzJfdCBtYXNrOworCisJZG8geworCQlyY19ub3JtYWxpemUocmMpOworCQlyYy0+cmFuZ2UgPj49IDE7CisJCXJjLT5jb2RlIC09IHJjLT5yYW5nZTsKKwkJbWFzayA9ICh1aW50MzJfdCkwIC0gKHJjLT5jb2RlID4+IDMxKTsKKwkJcmMtPmNvZGUgKz0gcmMtPnJhbmdlICYgbWFzazsKKwkJKmRlc3QgPSAoKmRlc3QgPDwgMSkgKyAobWFzayArIDEpOworCX0gd2hpbGUgKC0tbGltaXQgPiAwKTsKK30KKworLyoqKioqKioqCisgKiBMWk1BICoKKyAqKioqKioqKi8KKworLyogR2V0IHBvaW50ZXIgdG8gbGl0ZXJhbCBjb2RlciBwcm9iYWJpbGl0eSBhcnJheS4gKi8KK3N0YXRpYyB1aW50MTZfdCAqIFhaX0ZVTkMgbHptYV9saXRlcmFsX3Byb2JzKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJdWludDMyX3QgcHJldl9ieXRlID0gZGljdF9nZXQoJnMtPmRpY3QsIDApOworCXVpbnQzMl90IGxvdyA9IHByZXZfYnl0ZSA+PiAoOCAtIHMtPmx6bWEubGMpOworCXVpbnQzMl90IGhpZ2ggPSAocy0+ZGljdC5wb3MgJiBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2spIDw8IHMtPmx6bWEubGM7CisJcmV0dXJuIHMtPmx6bWEubGl0ZXJhbFtsb3cgKyBoaWdoXTsKK30KKworLyogRGVjb2RlIGEgbGl0ZXJhbCAob25lIDgtYml0IGJ5dGUpICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfbGl0ZXJhbChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBzeW1ib2w7CisJdWludDMyX3QgbWF0Y2hfYnl0ZTsKKwl1aW50MzJfdCBtYXRjaF9iaXQ7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGk7CisKKwlwcm9icyA9IGx6bWFfbGl0ZXJhbF9wcm9icyhzKTsKKworCWlmIChsem1hX3N0YXRlX2lzX2xpdGVyYWwocy0+bHptYS5zdGF0ZSkpIHsKKwkJc3ltYm9sID0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCAweDEwMCk7CisJfSBlbHNlIHsKKwkJc3ltYm9sID0gMTsKKwkJbWF0Y2hfYnl0ZSA9IGRpY3RfZ2V0KCZzLT5kaWN0LCBzLT5sem1hLnJlcDApIDw8IDE7CisJCW9mZnNldCA9IDB4MTAwOworCisJCWRvIHsKKwkJCW1hdGNoX2JpdCA9IG1hdGNoX2J5dGUgJiBvZmZzZXQ7CisJCQltYXRjaF9ieXRlIDw8PSAxOworCQkJaSA9IG9mZnNldCArIG1hdGNoX2JpdCArIHN5bWJvbDsKKworCQkJaWYgKHJjX2JpdCgmcy0+cmMsICZwcm9ic1tpXSkpIHsKKwkJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJCQlvZmZzZXQgJj0gbWF0Y2hfYml0OworCQkJfSBlbHNlIHsKKwkJCQlzeW1ib2wgPDw9IDE7CisJCQkJb2Zmc2V0ICY9IH5tYXRjaF9iaXQ7CisJCQl9CisJCX0gd2hpbGUgKHN5bWJvbCA8IDB4MTAwKTsKKwl9CisKKwlkaWN0X3B1dCgmcy0+ZGljdCwgKHVpbnQ4X3Qpc3ltYm9sKTsKKwlsem1hX3N0YXRlX2xpdGVyYWwoJnMtPmx6bWEuc3RhdGUpOworfQorCisvKiBEZWNvZGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaW50byBzLT5sem1hLmxlbi4gKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgbHptYV9sZW4oc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IGx6bWFfbGVuX2RlYyAqbCwKKwkJdWludDMyX3QgcG9zX3N0YXRlKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBsaW1pdDsKKworCWlmICghcmNfYml0KCZzLT5yYywgJmwtPmNob2ljZSkpIHsKKwkJcHJvYnMgPSBsLT5sb3dbcG9zX3N0YXRlXTsKKwkJbGltaXQgPSBMRU5fTE9XX1NZTUJPTFM7CisJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTjsKKwl9IGVsc2UgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UyKSkgeworCQkJcHJvYnMgPSBsLT5taWRbcG9zX3N0YXRlXTsKKwkJCWxpbWl0ID0gTEVOX01JRF9TWU1CT0xTOworCQkJcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTOworCQl9IGVsc2UgeworCQkJcHJvYnMgPSBsLT5oaWdoOworCQkJbGltaXQgPSBMRU5fSElHSF9TWU1CT0xTOworCQkJcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTCisJCQkJCSsgTEVOX01JRF9TWU1CT0xTOworCQl9CisJfQorCisJcy0+bHptYS5sZW4gKz0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCBsaW1pdCkgLSBsaW1pdDsKK30KKworLyogRGVjb2RlIGEgbWF0Y2guIFRoZSBkaXN0YW5jZSB3aWxsIGJlIHN0b3JlZCBpbiBzLT5sem1hLnJlcDAuICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfbWF0Y2goc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDMyX3QgcG9zX3N0YXRlKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBkaXN0X3Nsb3Q7CisJdWludDMyX3QgbGltaXQ7CisKKwlsem1hX3N0YXRlX21hdGNoKCZzLT5sem1hLnN0YXRlKTsKKworCXMtPmx6bWEucmVwMyA9IHMtPmx6bWEucmVwMjsKKwlzLT5sem1hLnJlcDIgPSBzLT5sem1hLnJlcDE7CisJcy0+bHptYS5yZXAxID0gcy0+bHptYS5yZXAwOworCisJbHptYV9sZW4ocywgJnMtPmx6bWEubWF0Y2hfbGVuX2RlYywgcG9zX3N0YXRlKTsKKworCXByb2JzID0gcy0+bHptYS5kaXN0X3Nsb3RbbHptYV9nZXRfZGlzdF9zdGF0ZShzLT5sem1hLmxlbildOworCWRpc3Rfc2xvdCA9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgRElTVF9TTE9UUykgLSBESVNUX1NMT1RTOworCisJaWYgKGRpc3Rfc2xvdCA8IERJU1RfTU9ERUxfU1RBUlQpIHsKKwkJcy0+bHptYS5yZXAwID0gZGlzdF9zbG90OworCX0gZWxzZSB7CisJCWxpbWl0ID0gKGRpc3Rfc2xvdCA+PiAxKSAtIDE7CisJCXMtPmx6bWEucmVwMCA9IDIgKyAoZGlzdF9zbG90ICYgMSk7CisKKwkJaWYgKGRpc3Rfc2xvdCA8IERJU1RfTU9ERUxfRU5EKSB7CisJCQlzLT5sem1hLnJlcDAgPDw9IGxpbWl0OworCQkJcHJvYnMgPSBzLT5sem1hLmRpc3Rfc3BlY2lhbCArIHMtPmx6bWEucmVwMAorCQkJCQktIGRpc3Rfc2xvdCAtIDE7CisJCQlyY19iaXR0cmVlX3JldmVyc2UoJnMtPnJjLCBwcm9icywKKwkJCQkJJnMtPmx6bWEucmVwMCwgbGltaXQpOworCQl9IGVsc2UgeworCQkJcmNfZGlyZWN0KCZzLT5yYywgJnMtPmx6bWEucmVwMCwgbGltaXQgLSBBTElHTl9CSVRTKTsKKwkJCXMtPmx6bWEucmVwMCA8PD0gQUxJR05fQklUUzsKKwkJCXJjX2JpdHRyZWVfcmV2ZXJzZSgmcy0+cmMsIHMtPmx6bWEuZGlzdF9hbGlnbiwKKwkJCQkJJnMtPmx6bWEucmVwMCwgQUxJR05fQklUUyk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBEZWNvZGUgYSByZXBlYXRlZCBtYXRjaC4gVGhlIGRpc3RhbmNlIGlzIG9uZSBvZiB0aGUgZm91ciBtb3N0IHJlY2VudGx5CisgKiBzZWVuIG1hdGNoZXMuIFRoZSBkaXN0YW5jZSB3aWxsIGJlIHN0b3JlZCBpbiBzLT5sem1hLnJlcDAuCisgKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgbHptYV9yZXBfbWF0Y2goc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDMyX3QgcG9zX3N0YXRlKQoreworCXVpbnQzMl90IHRtcDsKKworCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMFtzLT5sem1hLnN0YXRlXSkpIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAwX2xvbmdbCisJCQkJcy0+bHptYS5zdGF0ZV1bcG9zX3N0YXRlXSkpIHsKKwkJCWx6bWFfc3RhdGVfc2hvcnRfcmVwKCZzLT5sem1hLnN0YXRlKTsKKwkJCXMtPmx6bWEubGVuID0gMTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMVtzLT5sem1hLnN0YXRlXSkpIHsKKwkJCXRtcCA9IHMtPmx6bWEucmVwMTsKKwkJfSBlbHNlIHsKKwkJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMltzLT5sem1hLnN0YXRlXSkpIHsKKwkJCQl0bXAgPSBzLT5sem1hLnJlcDI7CisJCQl9IGVsc2UgeworCQkJCXRtcCA9IHMtPmx6bWEucmVwMzsKKwkJCQlzLT5sem1hLnJlcDMgPSBzLT5sem1hLnJlcDI7CisJCQl9CisKKwkJCXMtPmx6bWEucmVwMiA9IHMtPmx6bWEucmVwMTsKKwkJfQorCisJCXMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKwkJcy0+bHptYS5yZXAwID0gdG1wOworCX0KKworCWx6bWFfc3RhdGVfbG9uZ19yZXAoJnMtPmx6bWEuc3RhdGUpOworCWx6bWFfbGVuKHMsICZzLT5sem1hLnJlcF9sZW5fZGVjLCBwb3Nfc3RhdGUpOworfQorCisvKiBMWk1BIGRlY29kZXIgY29yZSAqLworc3RhdGljIGJvb2wgWFpfRlVOQyBsem1hX21haW4oc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MzJfdCBwb3Nfc3RhdGU7CisKKwkvKgorCSAqIElmIHRoZSBkaWN0aW9uYXJ5IHdhcyByZWFjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgY2FsbCwgdHJ5IHRvCisJICogZmluaXNoIHRoZSBwb3NzaWJseSBwZW5kaW5nIHJlcGVhdCBpbiB0aGUgZGljdGlvbmFyeS4KKwkgKi8KKwlpZiAoZGljdF9oYXNfc3BhY2UoJnMtPmRpY3QpICYmIHMtPmx6bWEubGVuID4gMCkKKwkJZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKTsKKworCS8qCisJICogRGVjb2RlIG1vcmUgTFpNQSBzeW1ib2xzLiBPbmUgaXRlcmF0aW9uIG1heSBjb25zdW1lIHVwIHRvCisJICogTFpNQV9JTl9SRVFVSVJFRCAtIDEgYnl0ZXMuCisJICovCisJd2hpbGUgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiAhcmNfbGltaXRfZXhjZWVkZWQoJnMtPnJjKSkgeworCQlwb3Nfc3RhdGUgPSBzLT5kaWN0LnBvcyAmIHMtPmx6bWEucG9zX21hc2s7CisKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19tYXRjaFsKKwkJCQlzLT5sem1hLnN0YXRlXVtwb3Nfc3RhdGVdKSkgeworCQkJbHptYV9saXRlcmFsKHMpOworCQl9IGVsc2UgeworCQkJaWYgKHJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcFtzLT5sem1hLnN0YXRlXSkpCisJCQkJbHptYV9yZXBfbWF0Y2gocywgcG9zX3N0YXRlKTsKKwkJCWVsc2UKKwkJCQlsem1hX21hdGNoKHMsIHBvc19zdGF0ZSk7CisKKwkJCWlmICghZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKgorCSAqIEhhdmluZyB0aGUgcmFuZ2UgZGVjb2RlciBhbHdheXMgbm9ybWFsaXplZCB3aGVuIHdlIGFyZSBvdXRzaWRlCisJICogdGhpcyBmdW5jdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGhhbmRsZSBlbmQgb2YgdGhlIGNodW5rLgorCSAqLworCXJjX25vcm1hbGl6ZSgmcy0+cmMpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgTFpNQSBkZWNvZGVyIGFuZCByYW5nZSBkZWNvZGVyIHN0YXRlLiBEaWN0aW9uYXJ5IGlzIG5vcmUgcmVzZXQKKyAqIGhlcmUsIGJlY2F1c2UgTFpNQSBzdGF0ZSBtYXkgYmUgcmVzZXQgd2l0aG91dCByZXNldHRpbmcgdGhlIGRpY3Rpb25hcnkuCisgKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgbHptYV9yZXNldChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCXVpbnQxNl90ICpwcm9iczsKKwlzaXplX3QgaTsKKworCXMtPmx6bWEuc3RhdGUgPSBTVEFURV9MSVRfTElUOworCXMtPmx6bWEucmVwMCA9IDA7CisJcy0+bHptYS5yZXAxID0gMDsKKwlzLT5sem1hLnJlcDIgPSAwOworCXMtPmx6bWEucmVwMyA9IDA7CisKKwkvKgorCSAqIEFsbCBwcm9iYWJpbGl0aWVzIGFyZSBpbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZS4gVGhpcyBoYWNrCisJICogbWFrZXMgdGhlIGNvZGUgc21hbGxlciBieSBhdm9pZGluZyBhIHNlcGFyYXRlIGxvb3AgZm9yIGVhY2gKKwkgKiBwcm9iYWJpbGl0eSBhcnJheS4KKwkgKgorCSAqIFRoaXMgY291bGQgYmUgb3B0aW1pemVkIHNvIHRoYXQgb25seSB0aGF0IHBhcnQgb2YgbGl0ZXJhbAorCSAqIHByb2JhYmlsaXRpZXMgdGhhdCBhcmUgYWN0dWFsbHkgcmVxdWlyZWQuIEluIHRoZSBjb21tb24gY2FzZQorCSAqIHdlIHdvdWxkIHdyaXRlIDEyIEtpQiBsZXNzLgorCSAqLworCXByb2JzID0gcy0+bHptYS5pc19tYXRjaFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgUFJPQlNfVE9UQUw7ICsraSkKKwkJcHJvYnNbaV0gPSBSQ19CSVRfTU9ERUxfVE9UQUwgLyAyOworCisJcmNfcmVzZXQoJnMtPnJjKTsKK30KKworLyoKKyAqIERlY29kZSBhbmQgdmFsaWRhdGUgTFpNQSBwcm9wZXJ0aWVzIChsYy9scC9wYikgYW5kIGNhbGN1bGF0ZSB0aGUgYml0IG1hc2tzCisgKiBmcm9tIHRoZSBkZWNvZGVkIGxwIGFuZCBwYiB2YWx1ZXMuIE9uIHN1Y2Nlc3MsIHRoZSBMWk1BIGRlY29kZXIgc3RhdGUgaXMKKyAqIHJlc2V0IGFuZCB0cnVlIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIGx6bWFfcHJvcHMoc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDhfdCBwcm9wcykKK3sKKwlpZiAocHJvcHMgPiAoNCAqIDUgKyA0KSAqIDkgKyA4KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzLT5sem1hLnBvc19tYXNrID0gMDsKKwl3aGlsZSAocHJvcHMgPj0gOSAqIDUpIHsKKwkJcHJvcHMgLT0gOSAqIDU7CisJCSsrcy0+bHptYS5wb3NfbWFzazsKKwl9CisKKwlzLT5sem1hLnBvc19tYXNrID0gKDEgPDwgcy0+bHptYS5wb3NfbWFzaykgLSAxOworCisJcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID0gMDsKKwl3aGlsZSAocHJvcHMgPj0gOSkgeworCQlwcm9wcyAtPSA5OworCQkrK3MtPmx6bWEubGl0ZXJhbF9wb3NfbWFzazsKKwl9CisKKwlzLT5sem1hLmxjID0gcHJvcHM7CisKKwlpZiAocy0+bHptYS5sYyArIHMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzayA+IDQpCisJCXJldHVybiBmYWxzZTsKKworCXMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzayA9ICgxIDw8IHMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzaykgLSAxOworCisJbHptYV9yZXNldChzKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqCisgKiBMWk1BMiAqCisgKioqKioqKioqLworCisvKgorICogVGhlIExaTUEgZGVjb2RlciBhc3N1bWVzIHRoYXQgaWYgdGhlIGlucHV0IGxpbWl0IChzLT5yYy5pbl9saW1pdCkgaGFzbid0CisgKiBiZWVuIGV4Y2VlZGVkLCBpdCBpcyBzYWZlIHRvIHJlYWQgdXAgdG8gTFpNQV9JTl9SRVFVSVJFRCBieXRlcy4gVGhpcworICogd3JhcHBlciBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIG1ha2luZyB0aGUgTFpNQSBkZWNvZGVyJ3MgYXNzdW1wdGlvbiBzYWZlLgorICoKKyAqIEFzIGxvbmcgYXMgdGhlcmUgaXMgcGxlbnR5IG9mIGlucHV0IGxlZnQgdG8gYmUgZGVjb2RlZCBpbiB0aGUgY3VycmVudCBMWk1BCisgKiBjaHVuaywgd2UgZGVjb2RlIGRpcmVjdGx5IGZyb20gdGhlIGNhbGxlci1zdXBwbGllZCBpbnB1dCBidWZmZXIgdW50aWwKKyAqIHRoZXJlJ3MgTFpNQV9JTl9SRVFVSVJFRCBieXRlcyBsZWZ0LiBUaG9zZSByZW1haW5pbmcgYnl0ZXMgYXJlIGNvcGllZCBpbnRvCisgKiBzLT50ZW1wLmJ1Ziwgd2hpY2ggKGhvcGVmdWxseSkgZ2V0cyBmaWxsZWQgb24gdGhlIG5leHQgY2FsbCB0byB0aGlzCisgKiBmdW5jdGlvbi4gV2UgZGVjb2RlIGEgZmV3IGJ5dGVzIGZyb20gdGhlIHRlbXBvcmFyeSBidWZmZXIgc28gdGhhdCB3ZSBjYW4KKyAqIGNvbnRpbnVlIGRlY29kaW5nIGZyb20gdGhlIGNhbGxlci1zdXBwbGllZCBpbnB1dCBidWZmZXIgYWdhaW4uCisgKi8KK3N0YXRpYyBib29sIFhaX0ZVTkMgbHptYTJfbHptYShzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBpbl9hdmFpbDsKKwl1aW50MzJfdCB0bXA7CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKHMtPnRlbXAuc2l6ZSA+IDAgfHwgcy0+bHptYTIuY29tcHJlc3NlZCA9PSAwKSB7CisJCXRtcCA9IDIgKiBMWk1BX0lOX1JFUVVJUkVEIC0gcy0+dGVtcC5zaXplOworCQlpZiAodG1wID4gcy0+bHptYTIuY29tcHJlc3NlZCAtIHMtPnRlbXAuc2l6ZSkKKwkJCXRtcCA9IHMtPmx6bWEyLmNvbXByZXNzZWQgLSBzLT50ZW1wLnNpemU7CisJCWlmICh0bXAgPiBpbl9hdmFpbCkKKwkJCXRtcCA9IGluX2F2YWlsOworCisJCW1lbWNweShzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSwgYi0+aW4gKyBiLT5pbl9wb3MsIHRtcCk7CisKKwkJaWYgKHMtPnRlbXAuc2l6ZSArIHRtcCA9PSBzLT5sem1hMi5jb21wcmVzc2VkKSB7CisJCQltZW16ZXJvKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplICsgdG1wLAorCQkJCQlzaXplb2Yocy0+dGVtcC5idWYpCisJCQkJCQktIHMtPnRlbXAuc2l6ZSAtIHRtcCk7CisJCQlzLT5yYy5pbl9saW1pdCA9IHMtPnRlbXAuc2l6ZSArIHRtcDsKKwkJfSBlbHNlIGlmIChzLT50ZW1wLnNpemUgKyB0bXAgPCBMWk1BX0lOX1JFUVVJUkVEKSB7CisJCQlzLT50ZW1wLnNpemUgKz0gdG1wOworCQkJYi0+aW5fcG9zICs9IHRtcDsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcy0+cmMuaW5fbGltaXQgPSBzLT50ZW1wLnNpemUgKyB0bXAgLSBMWk1BX0lOX1JFUVVJUkVEOworCQl9CisKKwkJcy0+cmMuaW4gPSBzLT50ZW1wLmJ1ZjsKKwkJcy0+cmMuaW5fcG9zID0gMDsKKworCQlpZiAoIWx6bWFfbWFpbihzKSB8fCBzLT5yYy5pbl9wb3MgPiBzLT50ZW1wLnNpemUgKyB0bXApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcy0+bHptYTIuY29tcHJlc3NlZCAtPSBzLT5yYy5pbl9wb3M7CisKKwkJaWYgKHMtPnJjLmluX3BvcyA8IHMtPnRlbXAuc2l6ZSkgeworCQkJcy0+dGVtcC5zaXplIC09IHMtPnJjLmluX3BvczsKKwkJCW1lbW1vdmUocy0+dGVtcC5idWYsIHMtPnRlbXAuYnVmICsgcy0+cmMuaW5fcG9zLAorCQkJCQlzLT50ZW1wLnNpemUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQliLT5pbl9wb3MgKz0gcy0+cmMuaW5fcG9zIC0gcy0+dGVtcC5zaXplOworCQlzLT50ZW1wLnNpemUgPSAwOworCX0KKworCWluX2F2YWlsID0gYi0+aW5fc2l6ZSAtIGItPmluX3BvczsKKwlpZiAoaW5fYXZhaWwgPj0gTFpNQV9JTl9SRVFVSVJFRCkgeworCQlzLT5yYy5pbiA9IGItPmluOworCQlzLT5yYy5pbl9wb3MgPSBiLT5pbl9wb3M7CisKKwkJaWYgKGluX2F2YWlsID49IHMtPmx6bWEyLmNvbXByZXNzZWQgKyBMWk1BX0lOX1JFUVVJUkVEKQorCQkJcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9wb3MgKyBzLT5sem1hMi5jb21wcmVzc2VkOworCQllbHNlCisJCQlzLT5yYy5pbl9saW1pdCA9IGItPmluX3NpemUgLSBMWk1BX0lOX1JFUVVJUkVEOworCisJCWlmICghbHptYV9tYWluKHMpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWluX2F2YWlsID0gcy0+cmMuaW5fcG9zIC0gYi0+aW5fcG9zOworCQlpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gaW5fYXZhaWw7CisJCWItPmluX3BvcyA9IHMtPnJjLmluX3BvczsKKwl9CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKGluX2F2YWlsIDwgTFpNQV9JTl9SRVFVSVJFRCkgeworCQlpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKQorCQkJaW5fYXZhaWwgPSBzLT5sem1hMi5jb21wcmVzc2VkOworCisJCW1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+aW4gKyBiLT5pbl9wb3MsIGluX2F2YWlsKTsKKwkJcy0+dGVtcC5zaXplID0gaW5fYXZhaWw7CisJCWItPmluX3BvcyArPSBpbl9hdmFpbDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFRha2UgY2FyZSBvZiB0aGUgTFpNQTIgY29udHJvbCBsYXllciwgYW5kIGZvcndhcmQgdGhlIGpvYiBvZiBhY3R1YWwgTFpNQQorICogZGVjb2Rpbmcgb3IgY29weWluZyBvZiB1bmNvbXByZXNzZWQgY2h1bmtzIHRvIG90aGVyIGZ1bmN0aW9ucy4KKyAqLworWFpfRVhURVJOIE5PSU5MSU5FIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2x6bWEyX3J1bigKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwl1aW50MzJfdCB0bXA7CisKKwl3aGlsZSAoYi0+aW5fcG9zIDwgYi0+aW5fc2l6ZSB8fCBzLT5sem1hMi5zZXF1ZW5jZSA9PSBTRVFfTFpNQV9SVU4pIHsKKwkJc3dpdGNoIChzLT5sem1hMi5zZXF1ZW5jZSkgeworCQljYXNlIFNFUV9DT05UUk9MOgorCQkJLyoKKwkJCSAqIExaTUEyIGNvbnRyb2wgYnl0ZQorCQkJICoKKwkJCSAqIEV4YWN0IHZhbHVlczoKKwkJCSAqICAgMHgwMCAgIEVuZCBtYXJrZXIKKwkJCSAqICAgMHgwMSAgIERpY3Rpb25hcnkgcmVzZXQgZm9sbG93ZWQgYnkKKwkJCSAqICAgICAgICAgIGFuIHVuY29tcHJlc3NlZCBjaHVuaworCQkJICogICAweDAyICAgVW5jb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5IHJlc2V0KQorCQkJICoKKwkJCSAqIEhpZ2hlc3QgdGhyZWUgYml0cyAocy0+Y29udHJvbCAmIDB4RTApOgorCQkJICogICAweEUwICAgRGljdGlvbmFyeSByZXNldCwgbmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlCisJCQkgKiAgICAgICAgICByZXNldCwgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rCisJCQkgKiAgIDB4QzAgICBOZXcgcHJvcGVydGllcyBhbmQgc3RhdGUgcmVzZXQsIGZvbGxvd2VkCisJCQkgKiAgICAgICAgICBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vIGRpY3Rpb25hcnkKKwkJCSAqICAgICAgICAgIHJlc2V0KQorCQkJICogICAweEEwICAgU3RhdGUgcmVzZXQgdXNpbmcgb2xkIHByb3BlcnRpZXMsCisJCQkgKiAgICAgICAgICBmb2xsb3dlZCBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vCisJCQkgKiAgICAgICAgICBkaWN0aW9uYXJ5IHJlc2V0KQorCQkJICogICAweDgwICAgTFpNQSBjaHVuayAobm8gZGljdGlvbmFyeSBvciBzdGF0ZSByZXNldCkKKwkJCSAqCisJCQkgKiBGb3IgTFpNQSBjb21wcmVzc2VkIGNodW5rcywgdGhlIGxvd2VzdCBmaXZlIGJpdHMKKwkJCSAqIChzLT5jb250cm9sICYgMUYpIGFyZSB0aGUgaGlnaGVzdCBiaXRzIG9mIHRoZQorCQkJICogdW5jb21wcmVzc2VkIHNpemUgKGJpdHMgMTYtMjApLgorCQkJICoKKwkJCSAqIEEgbmV3IExaTUEyIHN0cmVhbSBtdXN0IGJlZ2luIHdpdGggYSBkaWN0aW9uYXJ5CisJCQkgKiByZXNldC4gVGhlIGZpcnN0IExaTUEgY2h1bmsgbXVzdCBzZXQgbmV3CisJCQkgKiBwcm9wZXJ0aWVzIGFuZCByZXNldCB0aGUgTFpNQSBzdGF0ZS4KKwkJCSAqCisJCQkgKiBWYWx1ZXMgdGhhdCBkb24ndCBtYXRjaCBhbnl0aGluZyBkZXNjcmliZWQgYWJvdmUKKwkJCSAqIGFyZSBpbnZhbGlkIGFuZCB3ZSByZXR1cm4gWFpfREFUQV9FUlJPUi4KKwkJCSAqLworCQkJdG1wID0gYi0+aW5bYi0+aW5fcG9zKytdOworCisJCQlpZiAodG1wID49IDB4RTAgfHwgdG1wID09IDB4MDEpIHsKKwkJCQlzLT5sem1hMi5uZWVkX3Byb3BzID0gdHJ1ZTsKKwkJCQlzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSBmYWxzZTsKKwkJCQlkaWN0X3Jlc2V0KCZzLT5kaWN0LCBiKTsKKwkJCX0gZWxzZSBpZiAocy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0KSB7CisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCWlmICh0bXAgPj0gMHg4MCkgeworCQkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCA9ICh0bXAgJiAweDFGKSA8PCAxNjsKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMTsKKworCQkJCWlmICh0bXAgPj0gMHhDMCkgeworCQkJCQkvKgorCQkJCQkgKiBXaGVuIHRoZXJlIGFyZSBuZXcgcHJvcGVydGllcywKKwkJCQkJICogc3RhdGUgcmVzZXQgaXMgZG9uZSBhdAorCQkJCQkgKiBTRVFfUFJPUEVSVElFUy4KKwkJCQkJICovCisJCQkJCXMtPmx6bWEyLm5lZWRfcHJvcHMgPSBmYWxzZTsKKwkJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZQorCQkJCQkJCT0gU0VRX1BST1BFUlRJRVM7CisKKwkJCQl9IGVsc2UgaWYgKHMtPmx6bWEyLm5lZWRfcHJvcHMpIHsKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQl9IGVsc2UgeworCQkJCQlzLT5sem1hMi5uZXh0X3NlcXVlbmNlCisJCQkJCQkJPSBTRVFfTFpNQV9QUkVQQVJFOworCQkJCQlpZiAodG1wID49IDB4QTApCisJCQkJCQlsem1hX3Jlc2V0KHMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRtcCA9PSAweDAwKQorCQkJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKworCQkJCWlmICh0bXAgPiAweDAyKQorCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMDsKKwkJCQlzLT5sem1hMi5uZXh0X3NlcXVlbmNlID0gU0VRX0NPUFk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1VOQ09NUFJFU1NFRF8xOgorCQkJcy0+bHptYTIudW5jb21wcmVzc2VkCisJCQkJCSs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gPDwgODsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX1VOQ09NUFJFU1NFRF8yOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfVU5DT01QUkVTU0VEXzI6CisJCQlzLT5sem1hMi51bmNvbXByZXNzZWQKKwkJCQkJKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSArIDE7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzA7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9DT01QUkVTU0VEXzA6CisJCQlzLT5sem1hMi5jb21wcmVzc2VkCisJCQkJCT0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSA8PCA4OworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09NUFJFU1NFRF8xOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09NUFJFU1NFRF8xOgorCQkJcy0+bHptYTIuY29tcHJlc3NlZAorCQkJCQkrPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdICsgMTsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gcy0+bHptYTIubmV4dF9zZXF1ZW5jZTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1BST1BFUlRJRVM6CisJCQlpZiAoIWx6bWFfcHJvcHMocywgYi0+aW5bYi0+aW5fcG9zKytdKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfTFpNQV9QUkVQQVJFOworCisJCWNhc2UgU0VRX0xaTUFfUFJFUEFSRToKKwkJCWlmIChzLT5sem1hMi5jb21wcmVzc2VkIDwgUkNfSU5JVF9CWVRFUykKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJaWYgKCFyY19yZWFkX2luaXQoJnMtPnJjLCBiKSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gUkNfSU5JVF9CWVRFUzsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0xaTUFfUlVOOworCisJCWNhc2UgU0VRX0xaTUFfUlVOOgorCQkJLyoKKwkJCSAqIFNldCBkaWN0aW9uYXJ5IGxpbWl0IHRvIGluZGljYXRlIGhvdyBtdWNoIHdlIHdhbnQKKwkJCSAqIHRvIGJlIGVuY29kZWQgYXQgbWF4aW11bS4gRGVjb2RlIG5ldyBkYXRhIGludG8gdGhlCisJCQkgKiBkaWN0aW9uYXJ5LiBGbHVzaCB0aGUgbmV3IGRhdGEgZnJvbSBkaWN0aW9uYXJ5IHRvCisJCQkgKiBiLT5vdXQuIENoZWNrIGlmIHdlIGZpbmlzaGVkIGRlY29kaW5nIHRoaXMgY2h1bmsuCisJCQkgKiBJbiBjYXNlIHRoZSBkaWN0aW9uYXJ5IGdvdCBmdWxsIGJ1dCB3ZSBkaWRuJ3QgZmlsbAorCQkJICogdGhlIG91dHB1dCBidWZmZXIgeWV0LCB3ZSBtYXkgcnVuIHRoaXMgbG9vcAorCQkJICogbXVsdGlwbGUgdGltZXMgd2l0aG91dCBjaGFuZ2luZyBzLT5sem1hMi5zZXF1ZW5jZS4KKwkJCSAqLworCQkJZGljdF9saW1pdCgmcy0+ZGljdCwgbWluX3Qoc2l6ZV90LAorCQkJCQliLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MsCisJCQkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCkpOworCQkJaWYgKCFsem1hMl9sem1hKHMsIGIpKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5sem1hMi51bmNvbXByZXNzZWQgLT0gZGljdF9mbHVzaCgmcy0+ZGljdCwgYik7CisKKwkJCWlmIChzLT5sem1hMi51bmNvbXByZXNzZWQgPT0gMCkgeworCQkJCWlmIChzLT5sem1hMi5jb21wcmVzc2VkID4gMCB8fCBzLT5sem1hLmxlbiA+IDAKKwkJCQkJCXx8ICFyY19pc19maW5pc2hlZCgmcy0+cmMpKQorCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJCXJjX3Jlc2V0KCZzLT5yYyk7CisJCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKworCQkJfSBlbHNlIGlmIChiLT5vdXRfcG9zID09IGItPm91dF9zaXplCisJCQkJCXx8IChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZQorCQkJCQkJJiYgcy0+dGVtcC5zaXplCisJCQkJCQk8IHMtPmx6bWEyLmNvbXByZXNzZWQpKSB7CisJCQkJcmV0dXJuIFhaX09LOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNFUV9DT1BZOgorCQkJZGljdF91bmNvbXByZXNzZWQoJnMtPmRpY3QsIGIsICZzLT5sem1hMi5jb21wcmVzc2VkKTsKKwkJCWlmIChzLT5sem1hMi5jb21wcmVzc2VkID4gMCkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBYWl9PSzsKK30KKworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfbHptYTIgKiBYWl9GVU5DIHh6X2RlY19sem1hMl9jcmVhdGUoCisJCWVudW0geHpfbW9kZSBtb2RlLCB1aW50MzJfdCBkaWN0X21heCkKK3sKKwlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXMtPmRpY3QubW9kZSA9IG1vZGU7CisJcy0+ZGljdC5zaXplX21heCA9IGRpY3RfbWF4OworCisJaWYgKERFQ19JU19QUkVBTExPQyhtb2RlKSkgeworCQlzLT5kaWN0LmJ1ZiA9IHZtYWxsb2MoZGljdF9tYXgpOworCQlpZiAocy0+ZGljdC5idWYgPT0gTlVMTCkgeworCQkJa2ZyZWUocyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAoREVDX0lTX0RZTkFMTE9DKG1vZGUpKSB7CisJCXMtPmRpY3QuYnVmID0gTlVMTDsKKwkJcy0+ZGljdC5hbGxvY2F0ZWQgPSAwOworCX0KKworCXJldHVybiBzOworfQorCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfbHptYTJfcmVzZXQoCisJCXN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQ4X3QgcHJvcHMpCit7CisJLyogVGhpcyBsaW1pdHMgZGljdGlvbmFyeSBzaXplIHRvIDMgR2lCIHRvIGtlZXAgcGFyc2luZyBzaW1wbGVyLiAqLworCWlmIChwcm9wcyA+IDM5KQorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCXMtPmRpY3Quc2l6ZSA9IDIgKyAocHJvcHMgJiAxKTsKKwlzLT5kaWN0LnNpemUgPDw9IChwcm9wcyA+PiAxKSArIDExOworCisJaWYgKERFQ19JU19NVUxUSShzLT5kaWN0Lm1vZGUpKSB7CisJCWlmIChzLT5kaWN0LnNpemUgPiBzLT5kaWN0LnNpemVfbWF4KQorCQkJcmV0dXJuIFhaX01FTUxJTUlUX0VSUk9SOworCisJCXMtPmRpY3QuZW5kID0gcy0+ZGljdC5zaXplOworCisJCWlmIChERUNfSVNfRFlOQUxMT0Mocy0+ZGljdC5tb2RlKSkgeworCQkJaWYgKHMtPmRpY3QuYWxsb2NhdGVkIDwgcy0+ZGljdC5zaXplKSB7CisJCQkJdmZyZWUocy0+ZGljdC5idWYpOworCQkJCXMtPmRpY3QuYnVmID0gdm1hbGxvYyhzLT5kaWN0LnNpemUpOworCQkJCWlmIChzLT5kaWN0LmJ1ZiA9PSBOVUxMKSB7CisJCQkJCXMtPmRpY3QuYWxsb2NhdGVkID0gMDsKKwkJCQkJcmV0dXJuIFhaX01FTV9FUlJPUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlzLT5sem1hLmxlbiA9IDA7CisKKwlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT05UUk9MOworCXMtPmx6bWEyLm5lZWRfZGljdF9yZXNldCA9IHRydWU7CisKKwlzLT50ZW1wLnNpemUgPSAwOworCisJcmV0dXJuIFhaX09LOworfQorCitYWl9FWFRFUk4gdm9pZCBYWl9GVU5DIHh6X2RlY19sem1hMl9lbmQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwlpZiAoREVDX0lTX01VTFRJKHMtPmRpY3QubW9kZSkpCisJCXZmcmVlKHMtPmRpY3QuYnVmKTsKKworCWtmcmVlKHMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2RlY19zdHJlYW0uYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjYmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfc3RyZWFtLmMKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiAueHogU3RyZWFtIGRlY29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInh6X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ4el9zdHJlYW0uaCIKKworLyogSGFzaCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBJbmRleCBmaWVsZCAqLworc3RydWN0IHh6X2RlY19oYXNoIHsKKwl2bGlfdHlwZSB1bnBhZGRlZDsKKwl2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisJdWludDMyX3QgY3JjMzI7Cit9OworCitzdHJ1Y3QgeHpfZGVjIHsKKwkvKiBQb3NpdGlvbiBpbiBkZWNfbWFpbigpICovCisJZW51bSB7CisJCVNFUV9TVFJFQU1fSEVBREVSLAorCQlTRVFfQkxPQ0tfU1RBUlQsCisJCVNFUV9CTE9DS19IRUFERVIsCisJCVNFUV9CTE9DS19VTkNPTVBSRVNTLAorCQlTRVFfQkxPQ0tfUEFERElORywKKwkJU0VRX0JMT0NLX0NIRUNLLAorCQlTRVFfSU5ERVgsCisJCVNFUV9JTkRFWF9QQURESU5HLAorCQlTRVFfSU5ERVhfQ1JDMzIsCisJCVNFUV9TVFJFQU1fRk9PVEVSCisJfSBzZXF1ZW5jZTsKKworCS8qIFBvc2l0aW9uIGluIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyBhbmQgQ2hlY2sgZmllbGRzICovCisJdWludDMyX3QgcG9zOworCisJLyogVmFyaWFibGUtbGVuZ3RoIGludGVnZXIgZGVjb2RlZCBieSBkZWNfdmxpKCkgKi8KKwl2bGlfdHlwZSB2bGk7CisKKwkvKiBTYXZlZCBpbl9wb3MgYW5kIG91dF9wb3MgKi8KKwlzaXplX3QgaW5fc3RhcnQ7CisJc2l6ZV90IG91dF9zdGFydDsKKworCS8qIENSQzMyIHZhbHVlIGluIEJsb2NrIG9yIEluZGV4ICovCisJdWludDMyX3QgY3JjMzI7CisKKwkvKiBUeXBlIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2sgY2FsY3VsYXRlZCBmcm9tIHVuY29tcHJlc3NlZCBkYXRhICovCisJZW51bSB4el9jaGVjayBjaGVja190eXBlOworCisJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwllbnVtIHh6X21vZGUgbW9kZTsKKworCS8qCisJICogVHJ1ZSBpZiB0aGUgbmV4dCBjYWxsIHRvIHh6X2RlY19ydW4oKSBpcyBhbGxvd2VkIHRvIHJldHVybgorCSAqIFhaX0JVRl9FUlJPUi4KKwkgKi8KKwlib29sIGFsbG93X2J1Zl9lcnJvcjsKKworCS8qIEluZm9ybWF0aW9uIHN0b3JlZCBpbiBCbG9jayBIZWFkZXIgKi8KKwlzdHJ1Y3QgeworCQkvKgorCQkgKiBWYWx1ZSBzdG9yZWQgaW4gdGhlIENvbXByZXNzZWQgU2l6ZSBmaWVsZCwgb3IKKwkJICogVkxJX1VOS05PV04gaWYgQ29tcHJlc3NlZCBTaXplIGlzIG5vdCBwcmVzZW50LgorCQkgKi8KKwkJdmxpX3R5cGUgY29tcHJlc3NlZDsKKworCQkvKgorCQkgKiBWYWx1ZSBzdG9yZWQgaW4gdGhlIFVuY29tcHJlc3NlZCBTaXplIGZpZWxkLCBvcgorCQkgKiBWTElfVU5LTk9XTiBpZiBVbmNvbXByZXNzZWQgU2l6ZSBpcyBub3QgcHJlc2VudC4KKwkJICovCisJCXZsaV90eXBlIHVuY29tcHJlc3NlZDsKKworCQkvKiBTaXplIG9mIHRoZSBCbG9jayBIZWFkZXIgZmllbGQgKi8KKwkJdWludDMyX3Qgc2l6ZTsKKwl9IGJsb2NrX2hlYWRlcjsKKworCS8qIEluZm9ybWF0aW9uIGNvbGxlY3RlZCB3aGVuIGRlY29kaW5nIEJsb2NrcyAqLworCXN0cnVjdCB7CisJCS8qIE9ic2VydmVkIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgY3VycmVudCBCbG9jayAqLworCQl2bGlfdHlwZSBjb21wcmVzc2VkOworCisJCS8qIE9ic2VydmVkIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjdXJyZW50IEJsb2NrICovCisJCXZsaV90eXBlIHVuY29tcHJlc3NlZDsKKworCQkvKiBOdW1iZXIgb2YgQmxvY2tzIGRlY29kZWQgc28gZmFyICovCisJCXZsaV90eXBlIGNvdW50OworCisJCS8qCisJCSAqIEhhc2ggY2FsY3VsYXRlZCBmcm9tIHRoZSBCbG9jayBzaXplcy4gVGhpcyBpcyB1c2VkIHRvCisJCSAqIHZhbGlkYXRlIHRoZSBJbmRleCBmaWVsZC4KKwkJICovCisJCXN0cnVjdCB4el9kZWNfaGFzaCBoYXNoOworCX0gYmxvY2s7CisKKwkvKiBWYXJpYWJsZXMgbmVlZGVkIHdoZW4gdmVyaWZ5aW5nIHRoZSBJbmRleCBmaWVsZCAqLworCXN0cnVjdCB7CisJCS8qIFBvc2l0aW9uIGluIGRlY19pbmRleCgpICovCisJCWVudW0geworCQkJU0VRX0lOREVYX0NPVU5ULAorCQkJU0VRX0lOREVYX1VOUEFEREVELAorCQkJU0VRX0lOREVYX1VOQ09NUFJFU1NFRAorCQl9IHNlcXVlbmNlOworCisJCS8qIFNpemUgb2YgdGhlIEluZGV4IGluIGJ5dGVzICovCisJCXZsaV90eXBlIHNpemU7CisKKwkJLyogTnVtYmVyIG9mIFJlY29yZHMgKG1hdGNoZXMgYmxvY2suY291bnQgaW4gdmFsaWQgZmlsZXMpICovCisJCXZsaV90eXBlIGNvdW50OworCisJCS8qCisJCSAqIEhhc2ggY2FsY3VsYXRlZCBmcm9tIHRoZSBSZWNvcmRzIChtYXRjaGVzIGJsb2NrLmhhc2ggaW4KKwkJICogdmFsaWQgZmlsZXMpLgorCQkgKi8KKwkJc3RydWN0IHh6X2RlY19oYXNoIGhhc2g7CisJfSBpbmRleDsKKworCS8qCisJICogVGVtcG9yYXJ5IGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCBTdHJlYW0gSGVhZGVyLCBCbG9jayBIZWFkZXIsCisJICogYW5kIFN0cmVhbSBGb290ZXIuIFRoZSBCbG9jayBIZWFkZXIgaXMgdGhlIGJpZ2dlc3QgKDEgS2lCKQorCSAqIHNvIHdlIHJlc2VydmUgc3BhY2UgYWNjb3JkaW5nIHRvIHRoYXQuIGJ1ZltdIGhhcyB0byBiZSBhbGlnbmVkCisJICogdG8gYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzOyB0aGUgc2l6ZV90IHZhcmlhYmxlcyBiZWZvcmUgaXQKKwkgKiBzaG91bGQgZ3VhcmFudGVlIHRoaXMuCisJICovCisJc3RydWN0IHsKKwkJc2l6ZV90IHBvczsKKwkJc2l6ZV90IHNpemU7CisJCXVpbnQ4X3QgYnVmWzEwMjRdOworCX0gdGVtcDsKKworCXN0cnVjdCB4el9kZWNfbHptYTIgKmx6bWEyOworCisjaWZkZWYgWFpfREVDX0JDSgorCXN0cnVjdCB4el9kZWNfYmNqICpiY2o7CisJYm9vbCBiY2pfYWN0aXZlOworI2VuZGlmCit9OworCisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworLyogU2l6ZXMgb2YgdGhlIENoZWNrIGZpZWxkIHdpdGggZGlmZmVyZW50IENoZWNrIElEcyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hlY2tfc2l6ZXNbMTZdID0geworCTAsCisJNCwgNCwgNCwKKwk4LCA4LCA4LAorCTE2LCAxNiwgMTYsCisJMzIsIDMyLCAzMiwKKwk2NCwgNjQsIDY0Cit9OworI2VuZGlmCisKKy8qCisgKiBGaWxsIHMtPnRlbXAgYnkgY29weWluZyBkYXRhIHN0YXJ0aW5nIGZyb20gYi0+aW5bYi0+aW5fcG9zXS4gQ2FsbGVyCisgKiBtdXN0IGhhdmUgc2V0IHMtPnRlbXAucG9zIHRvIGluZGljYXRlIGhvdyBtdWNoIGRhdGEgd2UgYXJlIHN1cHBvc2VkCisgKiB0byBjb3B5IGludG8gcy0+dGVtcC5idWYuIFJldHVybiB0cnVlIG9uY2Ugcy0+dGVtcC5wb3MgaGFzIHJlYWNoZWQKKyAqIHMtPnRlbXAuc2l6ZS4KKyAqLworc3RhdGljIGJvb2wgWFpfRlVOQyBmaWxsX3RlbXAoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplID0gbWluX3Qoc2l6ZV90LAorCQkJYi0+aW5fc2l6ZSAtIGItPmluX3Bvcywgcy0+dGVtcC5zaXplIC0gcy0+dGVtcC5wb3MpOworCisJbWVtY3B5KHMtPnRlbXAuYnVmICsgcy0+dGVtcC5wb3MsIGItPmluICsgYi0+aW5fcG9zLCBjb3B5X3NpemUpOworCWItPmluX3BvcyArPSBjb3B5X3NpemU7CisJcy0+dGVtcC5wb3MgKz0gY29weV9zaXplOworCisJaWYgKHMtPnRlbXAucG9zID09IHMtPnRlbXAuc2l6ZSkgeworCQlzLT50ZW1wLnBvcyA9IDA7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyogRGVjb2RlIGEgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgKGxpdHRsZS1lbmRpYW4gYmFzZS0xMjggZW5jb2RpbmcpICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBkZWNfdmxpKHN0cnVjdCB4el9kZWMgKnMsCisJCWNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgKmluX3Bvcywgc2l6ZV90IGluX3NpemUpCit7CisJdWludDhfdCBieXRlOworCisJaWYgKHMtPnBvcyA9PSAwKQorCQlzLT52bGkgPSAwOworCisJd2hpbGUgKCppbl9wb3MgPCBpbl9zaXplKSB7CisJCWJ5dGUgPSBpblsqaW5fcG9zXTsKKwkJKysqaW5fcG9zOworCisJCXMtPnZsaSB8PSAodmxpX3R5cGUpKGJ5dGUgJiAweDdGKSA8PCBzLT5wb3M7CisKKwkJaWYgKChieXRlICYgMHg4MCkgPT0gMCkgeworCQkJLyogRG9uJ3QgYWxsb3cgbm9uLW1pbmltYWwgZW5jb2RpbmdzLiAqLworCQkJaWYgKGJ5dGUgPT0gMCAmJiBzLT5wb3MgIT0gMCkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+cG9zID0gMDsKKwkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCQl9CisKKwkJcy0+cG9zICs9IDc7CisJCWlmIChzLT5wb3MgPT0gNyAqIFZMSV9CWVRFU19NQVgpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKwl9CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKKy8qCisgKiBEZWNvZGUgdGhlIENvbXByZXNzZWQgRGF0YSBmaWVsZCBmcm9tIGEgQmxvY2suIFVwZGF0ZSBhbmQgdmFsaWRhdGUKKyAqIHRoZSBvYnNlcnZlZCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZXMgb2YgdGhlIEJsb2NrIHNvIHRoYXQKKyAqIHRoZXkgZG9uJ3QgZXhjZWVkIHRoZSB2YWx1ZXMgcG9zc2libHkgc3RvcmVkIGluIHRoZSBCbG9jayBIZWFkZXIKKyAqICh2YWxpZGF0aW9uIGFzc3VtZXMgdGhhdCBubyBpbnRlZ2VyIG92ZXJmbG93IG9jY3Vycywgc2luY2UgdmxpX3R5cGUKKyAqIGlzIG5vcm1hbGx5IHVpbnQ2NF90KS4gVXBkYXRlIHRoZSBDUkMzMiBpZiBwcmVzZW5jZSBvZiB0aGUgQ1JDMzIKKyAqIGZpZWxkIHdhcyBpbmRpY2F0ZWQgaW4gU3RyZWFtIEhlYWRlci4KKyAqCisgKiBPbmNlIHRoZSBkZWNvZGluZyBpcyBmaW5pc2hlZCwgdmFsaWRhdGUgdGhhdCB0aGUgb2JzZXJ2ZWQgc2l6ZXMgbWF0Y2gKKyAqIHRoZSBzaXplcyBwb3NzaWJseSBzdG9yZWQgaW4gdGhlIEJsb2NrIEhlYWRlci4gVXBkYXRlIHRoZSBoYXNoIGFuZAorICogQmxvY2sgY291bnQsIHdoaWNoIGFyZSBsYXRlciB1c2VkIHRvIHZhbGlkYXRlIHRoZSBJbmRleCBmaWVsZC4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IFhaX0ZVTkMgZGVjX2Jsb2NrKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3M7CisJcy0+b3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKworI2lmZGVmIFhaX0RFQ19CQ0oKKwlpZiAocy0+YmNqX2FjdGl2ZSkKKwkJcmV0ID0geHpfZGVjX2Jjal9ydW4ocy0+YmNqLCBzLT5sem1hMiwgYik7CisJZWxzZQorI2VuZGlmCisJCXJldCA9IHh6X2RlY19sem1hMl9ydW4ocy0+bHptYTIsIGIpOworCisJcy0+YmxvY2suY29tcHJlc3NlZCArPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKwlzLT5ibG9jay51bmNvbXByZXNzZWQgKz0gYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydDsKKworCS8qCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBzZXBhcmF0ZWx5IGNoZWNrIGZvciBWTElfVU5LTk9XTiwgc2luY2UKKwkgKiB0aGUgb2JzZXJ2ZWQgc2l6ZXMgYXJlIGFsd2F5cyBzbWFsbGVyIHRoYW4gVkxJX1VOS05PV04uCisJICovCisJaWYgKHMtPmJsb2NrLmNvbXByZXNzZWQgPiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorCQkJfHwgcy0+YmxvY2sudW5jb21wcmVzc2VkCisJCQkJPiBzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKQorCQlzLT5jcmMzMiA9IHh6X2NyYzMyKGItPm91dCArIHMtPm91dF9zdGFydCwKKwkJCQliLT5vdXRfcG9zIC0gcy0+b3V0X3N0YXJ0LCBzLT5jcmMzMik7CisKKwlpZiAocmV0ID09IFhaX1NUUkVBTV9FTkQpIHsKKwkJaWYgKHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkICE9IFZMSV9VTktOT1dOCisJCQkJJiYgcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQKKwkJCQkJIT0gcy0+YmxvY2suY29tcHJlc3NlZCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCWlmIChzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkICE9IFZMSV9VTktOT1dOCisJCQkJJiYgcy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZAorCQkJCQkhPSBzLT5ibG9jay51bmNvbXByZXNzZWQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5ibG9jay5oYXNoLnVucGFkZGVkICs9IHMtPmJsb2NrX2hlYWRlci5zaXplCisJCQkJKyBzLT5ibG9jay5jb21wcmVzc2VkOworCisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworCQlzLT5ibG9jay5oYXNoLnVucGFkZGVkICs9IGNoZWNrX3NpemVzW3MtPmNoZWNrX3R5cGVdOworI2Vsc2UKKwkJaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDMzIpCisJCQlzLT5ibG9jay5oYXNoLnVucGFkZGVkICs9IDQ7CisjZW5kaWYKKworCQlzLT5ibG9jay5oYXNoLnVuY29tcHJlc3NlZCArPSBzLT5ibG9jay51bmNvbXByZXNzZWQ7CisJCXMtPmJsb2NrLmhhc2guY3JjMzIgPSB4el9jcmMzMigKKwkJCQkoY29uc3QgdWludDhfdCAqKSZzLT5ibG9jay5oYXNoLAorCQkJCXNpemVvZihzLT5ibG9jay5oYXNoKSwgcy0+YmxvY2suaGFzaC5jcmMzMik7CisKKwkJKytzLT5ibG9jay5jb3VudDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBVcGRhdGUgdGhlIEluZGV4IHNpemUgYW5kIHRoZSBDUkMzMiB2YWx1ZS4gKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgaW5kZXhfdXBkYXRlKHN0cnVjdCB4el9kZWMgKnMsIGNvbnN0IHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGluX3VzZWQgPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKwlzLT5pbmRleC5zaXplICs9IGluX3VzZWQ7CisJcy0+Y3JjMzIgPSB4el9jcmMzMihiLT5pbiArIHMtPmluX3N0YXJ0LCBpbl91c2VkLCBzLT5jcmMzMik7Cit9CisKKy8qCisgKiBEZWNvZGUgdGhlIE51bWJlciBvZiBSZWNvcmRzLCBVbnBhZGRlZCBTaXplLCBhbmQgVW5jb21wcmVzc2VkIFNpemUKKyAqIGZpZWxkcyBmcm9tIHRoZSBJbmRleCBmaWVsZC4gVGhhdCBpcywgSW5kZXggUGFkZGluZyBhbmQgQ1JDMzIgYXJlIG5vdAorICogZGVjb2RlZCBieSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgY2FuIHJldHVybiBYWl9PSyAobW9yZSBpbnB1dCBuZWVkZWQpLCBYWl9TVFJFQU1fRU5EIChldmVyeXRoaW5nCisgKiBzdWNjZXNzZnVsbHkgZGVjb2RlZCksIG9yIFhaX0RBVEFfRVJST1IgKGlucHV0IGlzIGNvcnJ1cHQpLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBkZWNfaW5kZXgoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwlkbyB7CisJCXJldCA9IGRlY192bGkocywgYi0+aW4sICZiLT5pbl9wb3MsIGItPmluX3NpemUpOworCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpIHsKKwkJCWluZGV4X3VwZGF0ZShzLCBiKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzd2l0Y2ggKHMtPmluZGV4LnNlcXVlbmNlKSB7CisJCWNhc2UgU0VRX0lOREVYX0NPVU5UOgorCQkJcy0+aW5kZXguY291bnQgPSBzLT52bGk7CisKKwkJCS8qCisJCQkgKiBWYWxpZGF0ZSB0aGF0IHRoZSBOdW1iZXIgb2YgUmVjb3JkcyBmaWVsZAorCQkJICogaW5kaWNhdGVzIHRoZSBzYW1lIG51bWJlciBvZiBSZWNvcmRzIGFzCisJCQkgKiB0aGVyZSB3ZXJlIEJsb2NrcyBpbiB0aGUgU3RyZWFtLgorCQkJICovCisJCQlpZiAocy0+aW5kZXguY291bnQgIT0gcy0+YmxvY2suY291bnQpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOUEFEREVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVhfVU5QQURERUQ6CisJCQlzLT5pbmRleC5oYXNoLnVucGFkZGVkICs9IHMtPnZsaTsKKwkJCXMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOQ09NUFJFU1NFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0lOREVYX1VOQ09NUFJFU1NFRDoKKwkJCXMtPmluZGV4Lmhhc2gudW5jb21wcmVzc2VkICs9IHMtPnZsaTsKKwkJCXMtPmluZGV4Lmhhc2guY3JjMzIgPSB4el9jcmMzMigKKwkJCQkJKGNvbnN0IHVpbnQ4X3QgKikmcy0+aW5kZXguaGFzaCwKKwkJCQkJc2l6ZW9mKHMtPmluZGV4Lmhhc2gpLAorCQkJCQlzLT5pbmRleC5oYXNoLmNyYzMyKTsKKwkJCS0tcy0+aW5kZXguY291bnQ7CisJCQlzLT5pbmRleC5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9VTlBBRERFRDsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocy0+aW5kZXguY291bnQgPiAwKTsKKworCXJldHVybiBYWl9TVFJFQU1fRU5EOworfQorCisvKgorICogVmFsaWRhdGUgdGhhdCB0aGUgbmV4dCBmb3VyIGlucHV0IGJ5dGVzIG1hdGNoIHRoZSB2YWx1ZSBvZiBzLT5jcmMzMi4KKyAqIHMtPnBvcyBtdXN0IGJlIHplcm8gd2hlbiBzdGFydGluZyB0byB2YWxpZGF0ZSB0aGUgZmlyc3QgYnl0ZS4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IFhaX0ZVTkMgY3JjMzJfdmFsaWRhdGUoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlkbyB7CisJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCXJldHVybiBYWl9PSzsKKworCQlpZiAoKChzLT5jcmMzMiA+PiBzLT5wb3MpICYgMHhGRikgIT0gYi0+aW5bYi0+aW5fcG9zKytdKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+cG9zICs9IDg7CisKKwl9IHdoaWxlIChzLT5wb3MgPCAzMik7CisKKwlzLT5jcmMzMiA9IDA7CisJcy0+cG9zID0gMDsKKworCXJldHVybiBYWl9TVFJFQU1fRU5EOworfQorCisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworLyoKKyAqIFNraXAgb3ZlciB0aGUgQ2hlY2sgZmllbGQgd2hlbiB0aGUgQ2hlY2sgSUQgaXMgbm90IHN1cHBvcnRlZC4KKyAqIFJldHVybnMgdHJ1ZSBvbmNlIHRoZSB3aG9sZSBDaGVjayBmaWVsZCBoYXMgYmVlbiBza2lwcGVkIG92ZXIuCisgKi8KK3N0YXRpYyBib29sIFhaX0ZVTkMgY2hlY2tfc2tpcChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXdoaWxlIChzLT5wb3MgPCBjaGVja19zaXplc1tzLT5jaGVja190eXBlXSkgeworCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJKytiLT5pbl9wb3M7CisJCSsrcy0+cG9zOworCX0KKworCXMtPnBvcyA9IDA7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisvKiBEZWNvZGUgdGhlIFN0cmVhbSBIZWFkZXIgZmllbGQgKHRoZSBmaXJzdCAxMiBieXRlcyBvZiB0aGUgLnh6IFN0cmVhbSkuICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBkZWNfc3RyZWFtX2hlYWRlcihzdHJ1Y3QgeHpfZGVjICpzKQoreworCWlmICghbWVtZXEocy0+dGVtcC5idWYsIEhFQURFUl9NQUdJQywgSEVBREVSX01BR0lDX1NJWkUpKQorCQlyZXR1cm4gWFpfRk9STUFUX0VSUk9SOworCisJaWYgKHh6X2NyYzMyKHMtPnRlbXAuYnVmICsgSEVBREVSX01BR0lDX1NJWkUsIDIsIDApCisJCQkhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZiArIEhFQURFUl9NQUdJQ19TSVpFICsgMikpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJaWYgKHMtPnRlbXAuYnVmW0hFQURFUl9NQUdJQ19TSVpFXSAhPSAwKQorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCS8qCisJICogT2YgaW50ZWdyaXR5IGNoZWNrcywgd2Ugc3VwcG9ydCBvbmx5IG5vbmUgKENoZWNrIElEID0gMCkgYW5kCisJICogQ1JDMzIgKENoZWNrIElEID0gMSkuIEhvd2V2ZXIsIGlmIFhaX0RFQ19BTllfQ0hFQ0sgaXMgZGVmaW5lZCwKKwkgKiB3ZSB3aWxsIGFjY2VwdCBvdGhlciBjaGVjayB0eXBlcyB0b28sIGJ1dCB0aGVuIHRoZSBjaGVjayB3b24ndAorCSAqIGJlIHZlcmlmaWVkIGFuZCBhIHdhcm5pbmcgKFhaX1VOU1VQUE9SVEVEX0NIRUNLKSB3aWxsIGJlIGdpdmVuLgorCSAqLworCXMtPmNoZWNrX3R5cGUgPSBzLT50ZW1wLmJ1ZltIRUFERVJfTUFHSUNfU0laRSArIDFdOworCisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworCWlmIChzLT5jaGVja190eXBlID4gWFpfQ0hFQ0tfTUFYKQorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCWlmIChzLT5jaGVja190eXBlID4gWFpfQ0hFQ0tfQ1JDMzIpCisJCXJldHVybiBYWl9VTlNVUFBPUlRFRF9DSEVDSzsKKyNlbHNlCisJaWYgKHMtPmNoZWNrX3R5cGUgPiBYWl9DSEVDS19DUkMzMikKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisjZW5kaWYKKworCXJldHVybiBYWl9PSzsKK30KKworLyogRGVjb2RlIHRoZSBTdHJlYW0gRm9vdGVyIGZpZWxkICh0aGUgbGFzdCAxMiBieXRlcyBvZiB0aGUgLnh6IFN0cmVhbSkgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGRlY19zdHJlYW1fZm9vdGVyKHN0cnVjdCB4el9kZWMgKnMpCit7CisJaWYgKCFtZW1lcShzLT50ZW1wLmJ1ZiArIDEwLCBGT09URVJfTUFHSUMsIEZPT1RFUl9NQUdJQ19TSVpFKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYgKyA0LCA2LCAwKSAhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZikpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyoKKwkgKiBWYWxpZGF0ZSBCYWNrd2FyZCBTaXplLiBOb3RlIHRoYXQgd2UgbmV2ZXIgYWRkZWQgdGhlIHNpemUgb2YgdGhlCisJICogSW5kZXggQ1JDMzIgZmllbGQgdG8gcy0+aW5kZXguc2l6ZSwgdGh1cyB3ZSB1c2Ugcy0+aW5kZXguc2l6ZSAvIDQKKwkgKiBpbnN0ZWFkIG9mIHMtPmluZGV4LnNpemUgLyA0IC0gMS4KKwkgKi8KKwlpZiAoKHMtPmluZGV4LnNpemUgPj4gMikgIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYgKyA0KSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlpZiAocy0+dGVtcC5idWZbOF0gIT0gMCB8fCBzLT50ZW1wLmJ1Zls5XSAhPSBzLT5jaGVja190eXBlKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCS8qCisJICogVXNlIFhaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBYWl9PSyB0byBiZSBtb3JlIGNvbnZlbmllbnQKKwkgKiBmb3IgdGhlIGNhbGxlci4KKwkgKi8KKwlyZXR1cm4gWFpfU1RSRUFNX0VORDsKK30KKworLyogRGVjb2RlIHRoZSBCbG9jayBIZWFkZXIgYW5kIGluaXRpYWxpemUgdGhlIGZpbHRlciBjaGFpbi4gKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGRlY19ibG9ja19oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBDUkMzMi4gV2Uga25vdyB0aGF0IHRoZSB0ZW1wIGJ1ZmZlciBpcyBhdCBsZWFzdAorCSAqIGVpZ2h0IGJ5dGVzIHNvIHRoaXMgaXMgc2FmZS4KKwkgKi8KKwlzLT50ZW1wLnNpemUgLT0gNDsKKwlpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSwgMCkKKwkJCSE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlzLT50ZW1wLnBvcyA9IDI7CisKKwkvKgorCSAqIENhdGNoIHVuc3VwcG9ydGVkIEJsb2NrIEZsYWdzLiBXZSBzdXBwb3J0IG9ubHkgb25lIG9yIHR3byBmaWx0ZXJzCisJICogaW4gdGhlIGNoYWluLCBzbyB3ZSBjYXRjaCB0aGF0IHdpdGggdGhlIHNhbWUgdGVzdC4KKwkgKi8KKyNpZmRlZiBYWl9ERUNfQkNKCisJaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRSkKKyNlbHNlCisJaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRikKKyNlbmRpZgorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCS8qIENvbXByZXNzZWQgU2l6ZSAqLworCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4NDApIHsKKwkJaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorCQkJCQkhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgPSBzLT52bGk7CisJfSBlbHNlIHsKKwkJcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKwl9CisKKwkvKiBVbmNvbXByZXNzZWQgU2l6ZSAqLworCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4ODApIHsKKwkJaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorCQkJCSE9IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkID0gcy0+dmxpOworCX0gZWxzZSB7CisJCXMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKwl9CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJLyogSWYgdGhlcmUgYXJlIHR3byBmaWx0ZXJzLCB0aGUgZmlyc3Qgb25lIG11c3QgYmUgYSBCQ0ogZmlsdGVyLiAqLworCXMtPmJjal9hY3RpdmUgPSBzLT50ZW1wLmJ1ZlsxXSAmIDB4MDE7CisJaWYgKHMtPmJjal9hY3RpdmUpIHsKKwkJaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMikKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJCXJldCA9IHh6X2RlY19iY2pfcmVzZXQocy0+YmNqLCBzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSk7CisJCWlmIChyZXQgIT0gWFpfT0spCisJCQlyZXR1cm4gcmV0OworCisJCS8qCisJCSAqIFdlIGRvbid0IHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldCwKKwkJICogc28gU2l6ZSBvZiBQcm9wZXJ0aWVzIG11c3QgYmUgemVyby4KKwkJICovCisJCWlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorCQkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisJfQorI2VuZGlmCisKKwkvKiBWYWxpZCBGaWx0ZXIgRmxhZ3MgYWx3YXlzIHRha2UgYXQgbGVhc3QgdHdvIGJ5dGVzLiAqLworCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDIpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyogRmlsdGVyIElEID0gTFpNQTIgKi8KKwlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgyMSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBTaXplIG9mIFByb3BlcnRpZXMgPSAxLWJ5dGUgRmlsdGVyIFByb3BlcnRpZXMgKi8KKwlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBGaWx0ZXIgUHJvcGVydGllcyBjb250YWlucyBMWk1BMiBkaWN0aW9uYXJ5IHNpemUuICovCisJaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlyZXQgPSB4el9kZWNfbHptYTJfcmVzZXQocy0+bHptYTIsIHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdKTsKKwlpZiAocmV0ICE9IFhaX09LKQorCQlyZXR1cm4gcmV0OworCisJLyogVGhlIHJlc3QgbXVzdCBiZSBIZWFkZXIgUGFkZGluZy4gKi8KKwl3aGlsZSAocy0+dGVtcC5wb3MgPCBzLT50ZW1wLnNpemUpCisJCWlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorCQkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlzLT50ZW1wLnBvcyA9IDA7CisJcy0+YmxvY2suY29tcHJlc3NlZCA9IDA7CisJcy0+YmxvY2sudW5jb21wcmVzc2VkID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworc3RhdGljIGVudW0geHpfcmV0IFhaX0ZVTkMgZGVjX21haW4oc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwkvKgorCSAqIFN0b3JlIHRoZSBzdGFydCBwb3NpdGlvbiBmb3IgdGhlIGNhc2Ugd2hlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZQorCSAqIG9mIHRoZSBJbmRleCBmaWVsZC4KKwkgKi8KKwlzLT5pbl9zdGFydCA9IGItPmluX3BvczsKKworCXdoaWxlICh0cnVlKSB7CisJCXN3aXRjaCAocy0+c2VxdWVuY2UpIHsKKwkJY2FzZSBTRVFfU1RSRUFNX0hFQURFUjoKKwkJCS8qCisJCQkgKiBTdHJlYW0gSGVhZGVyIGlzIGNvcGllZCB0byBzLT50ZW1wLCBhbmQgdGhlbgorCQkJICogZGVjb2RlZCBmcm9tIHRoZXJlLiBUaGlzIHdheSBpZiB0aGUgY2FsbGVyCisJCQkgKiBnaXZlcyB1cyBvbmx5IGxpdHRsZSBpbnB1dCBhdCBhIHRpbWUsIHdlIGNhbgorCQkJICogc3RpbGwga2VlcCB0aGUgU3RyZWFtIEhlYWRlciBkZWNvZGluZyBjb2RlCisJCQkgKiBzaW1wbGUuIFNpbWlsYXIgYXBwcm9hY2ggaXMgdXNlZCBpbiBtYW55IHBsYWNlcworCQkJICogaW4gdGhpcyBmaWxlLgorCQkJICovCisJCQlpZiAoIWZpbGxfdGVtcChzLCBiKSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCS8qCisJCQkgKiBJZiBkZWNfc3RyZWFtX2hlYWRlcigpIHJldHVybnMKKwkJCSAqIFhaX1VOU1VQUE9SVEVEX0NIRUNLLCBpdCBpcyBzdGlsbCBwb3NzaWJsZQorCQkJICogdG8gY29udGludWUgZGVjb2RpbmcgaWYgd29ya2luZyBpbiBtdWx0aS1jYWxsCisJCQkgKiBtb2RlLiBUaHVzLCB1cGRhdGUgcy0+c2VxdWVuY2UgYmVmb3JlIGNhbGxpbmcKKwkJCSAqIGRlY19zdHJlYW1faGVhZGVyKCkuCisJCQkgKi8KKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1NUQVJUOworCisJCQlyZXQgPSBkZWNfc3RyZWFtX2hlYWRlcihzKTsKKwkJCWlmIChyZXQgIT0gWFpfT0spCisJCQkJcmV0dXJuIHJldDsKKworCQljYXNlIFNFUV9CTE9DS19TVEFSVDoKKwkJCS8qIFdlIG5lZWQgb25lIGJ5dGUgb2YgaW5wdXQgdG8gY29udGludWUuICovCisJCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQkvKiBTZWUgaWYgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBJbmRleCBmaWVsZC4gKi8KKwkJCWlmIChiLT5pbltiLT5pbl9wb3NdID09IDApIHsKKwkJCQlzLT5pbl9zdGFydCA9IGItPmluX3BvcysrOworCQkJCXMtPnNlcXVlbmNlID0gU0VRX0lOREVYOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBCbG9jayBIZWFkZXIgYW5kCisJCQkgKiBwcmVwYXJlIHRvIGRlY29kZSBpdC4KKwkJCSAqLworCQkJcy0+YmxvY2tfaGVhZGVyLnNpemUKKwkJCQk9ICgodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zXSArIDEpICogNDsKKworCQkJcy0+dGVtcC5zaXplID0gcy0+YmxvY2tfaGVhZGVyLnNpemU7CisJCQlzLT50ZW1wLnBvcyA9IDA7CisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19IRUFERVI7CisKKwkJY2FzZSBTRVFfQkxPQ0tfSEVBREVSOgorCQkJaWYgKCFmaWxsX3RlbXAocywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlyZXQgPSBkZWNfYmxvY2tfaGVhZGVyKHMpOworCQkJaWYgKHJldCAhPSBYWl9PSykKKwkJCQlyZXR1cm4gcmV0OworCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19VTkNPTVBSRVNTOworCisJCWNhc2UgU0VRX0JMT0NLX1VOQ09NUFJFU1M6CisJCQlyZXQgPSBkZWNfYmxvY2socywgYik7CisJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfUEFERElORzsKKworCQljYXNlIFNFUV9CTE9DS19QQURESU5HOgorCQkJLyoKKwkJCSAqIFNpemUgb2YgQ29tcHJlc3NlZCBEYXRhICsgQmxvY2sgUGFkZGluZworCQkJICogbXVzdCBiZSBhIG11bHRpcGxlIG9mIGZvdXIuIFdlIGRvbid0IG5lZWQKKwkJCSAqIHMtPmJsb2NrLmNvbXByZXNzZWQgZm9yIGFueXRoaW5nIGVsc2UKKwkJCSAqIGFueW1vcmUsIHNvIHdlIHVzZSBpdCBoZXJlIHRvIHRlc3QgdGhlIHNpemUKKwkJCSAqIG9mIHRoZSBCbG9jayBQYWRkaW5nIGZpZWxkLgorCQkJICovCisJCQl3aGlsZSAocy0+YmxvY2suY29tcHJlc3NlZCAmIDMpIHsKKwkJCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQkJCXJldHVybiBYWl9PSzsKKworCQkJCWlmIChiLT5pbltiLT5pbl9wb3MrK10gIT0gMCkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQkrK3MtPmJsb2NrLmNvbXByZXNzZWQ7CisJCQl9CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX0NIRUNLOworCisJCWNhc2UgU0VRX0JMT0NLX0NIRUNLOgorCQkJaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDMzIpIHsKKwkJCQlyZXQgPSBjcmMzMl92YWxpZGF0ZShzLCBiKTsKKwkJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworCQkJZWxzZSBpZiAoIWNoZWNrX3NraXAocywgYikpIHsKKwkJCQlyZXR1cm4gWFpfT0s7CisJCQl9CisjZW5kaWYKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfU1RBUlQ7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9JTkRFWDoKKwkJCXJldCA9IGRlY19pbmRleChzLCBiKTsKKwkJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9QQURESU5HOworCisJCWNhc2UgU0VRX0lOREVYX1BBRERJTkc6CisJCQl3aGlsZSAoKHMtPmluZGV4LnNpemUgKyAoYi0+aW5fcG9zIC0gcy0+aW5fc3RhcnQpKQorCQkJCQkmIDMpIHsKKwkJCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpIHsKKwkJCQkJaW5kZXhfdXBkYXRlKHMsIGIpOworCQkJCQlyZXR1cm4gWFpfT0s7CisJCQkJfQorCisJCQkJaWYgKGItPmluW2ItPmluX3BvcysrXSAhPSAwKQorCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKwkJCX0KKworCQkJLyogRmluaXNoIHRoZSBDUkMzMiB2YWx1ZSBhbmQgSW5kZXggc2l6ZS4gKi8KKwkJCWluZGV4X3VwZGF0ZShzLCBiKTsKKworCQkJLyogQ29tcGFyZSB0aGUgaGFzaGVzIHRvIHZhbGlkYXRlIHRoZSBJbmRleCBmaWVsZC4gKi8KKwkJCWlmICghbWVtZXEoJnMtPmJsb2NrLmhhc2gsICZzLT5pbmRleC5oYXNoLAorCQkJCQlzaXplb2Yocy0+YmxvY2suaGFzaCkpKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9DUkMzMjsKKworCQljYXNlIFNFUV9JTkRFWF9DUkMzMjoKKwkJCXJldCA9IGNyYzMyX3ZhbGlkYXRlKHMsIGIpOworCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnRlbXAuc2l6ZSA9IFNUUkVBTV9IRUFERVJfU0laRTsKKwkJCXMtPnNlcXVlbmNlID0gU0VRX1NUUkVBTV9GT09URVI7CisKKwkJY2FzZSBTRVFfU1RSRUFNX0ZPT1RFUjoKKwkJCWlmICghZmlsbF90ZW1wKHMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcmV0dXJuIGRlY19zdHJlYW1fZm9vdGVyKHMpOworCQl9CisJfQorCisJLyogTmV2ZXIgcmVhY2hlZCAqLworfQorCisvKgorICogeHpfZGVjX3J1bigpIGlzIGEgd3JhcHBlciBmb3IgZGVjX21haW4oKSB0byBoYW5kbGUgc29tZSBzcGVjaWFsIGNhc2VzIGluCisgKiBtdWx0aS1jYWxsIGFuZCBzaW5nbGUtY2FsbCBkZWNvZGluZy4KKyAqCisgKiBJbiBtdWx0aS1jYWxsIG1vZGUsIHdlIG11c3QgcmV0dXJuIFhaX0JVRl9FUlJPUiB3aGVuIGl0IHNlZW1zIGNsZWFyIHRoYXQgd2UKKyAqIGFyZSBub3QgZ29pbmcgdG8gbWFrZSBhbnkgcHJvZ3Jlc3MgYW55bW9yZS4gVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBjYWxsZXIKKyAqIGZyb20gY2FsbGluZyB1cyBpbmZpbml0ZWx5IHdoZW4gdGhlIGlucHV0IGZpbGUgaXMgdHJ1bmNhdGVkIG9yIG90aGVyd2lzZQorICogY29ycnVwdC4gU2luY2UgemxpYi1zdHlsZSBBUEkgYWxsb3dzIHRoYXQgdGhlIGNhbGxlciBmaWxscyB0aGUgaW5wdXQgYnVmZmVyCisgKiBvbmx5IHdoZW4gdGhlIGRlY29kZXIgZG9lc24ndCBwcm9kdWNlIGFueSBuZXcgb3V0cHV0LCB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwKKyAqIHRvIGF2b2lkIHJldHVybmluZyBYWl9CVUZfRVJST1IgdG9vIGVhc2lseTogWFpfQlVGX0VSUk9SIGlzIHJldHVybmVkIG9ubHkKKyAqIGFmdGVyIHRoZSBzZWNvbmQgY29uc2VjdXRpdmUgY2FsbCB0byB4el9kZWNfcnVuKCkgdGhhdCBtYWtlcyBubyBwcm9ncmVzcy4KKyAqCisgKiBJbiBzaW5nbGUtY2FsbCBtb2RlLCBpZiB3ZSBjb3VsZG4ndCBkZWNvZGUgZXZlcnl0aGluZyBhbmQgbm8gZXJyb3IKKyAqIG9jY3VycmVkLCBlaXRoZXIgdGhlIGlucHV0IGlzIHRydW5jYXRlZCBvciB0aGUgb3V0cHV0IGJ1ZmZlciBpcyB0b28gc21hbGwuCisgKiBTaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgaW5wdXQgYnl0ZSBuZXZlciBwcm9kdWNlcyBhbnkgb3V0cHV0LCB3ZSBrbm93CisgKiB0aGF0IGlmIGFsbCB0aGUgaW5wdXQgd2FzIGNvbnN1bWVkIGFuZCBkZWNvZGluZyB3YXNuJ3QgZmluaXNoZWQsIHRoZSBmaWxlCisgKiBtdXN0IGJlIGNvcnJ1cHQuIE90aGVyd2lzZSB0aGUgb3V0cHV0IGJ1ZmZlciBoYXMgdG8gYmUgdG9vIHNtYWxsIG9yIHRoZQorICogZmlsZSBpcyBjb3JydXB0IGluIGEgd2F5IHRoYXQgZGVjb2RpbmcgaXQgcHJvZHVjZXMgdG9vIGJpZyBvdXRwdXQuCisgKgorICogSWYgc2luZ2xlLWNhbGwgZGVjb2RpbmcgZmFpbHMsIHdlIHJlc2V0IGItPmluX3BvcyBhbmQgYi0+b3V0X3BvcyBiYWNrIHRvCisgKiB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuIFRoaXMgaXMgYmVjYXVzZSB3aXRoIHNvbWUgZmlsdGVyIGNoYWlucyB0aGVyZSB3b24ndAorICogYmUgYW55IHZhbGlkIHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBvdXRwdXQgYnVmZmVyIHVubGVzcyB0aGUgZGVjb2RpbmcKKyAqIGFjdHVhbGx5IHN1Y2NlZWRzICh0aGF0J3MgdGhlIHByaWNlIHRvIHBheSBvZiB1c2luZyB0aGUgb3V0cHV0IGJ1ZmZlciBhcworICogdGhlIHdvcmtzcGFjZSkuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19ydW4oc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgaW5fc3RhcnQ7CisJc2l6ZV90IG91dF9zdGFydDsKKwllbnVtIHh6X3JldCByZXQ7CisKKwlpZiAoREVDX0lTX1NJTkdMRShzLT5tb2RlKSkKKwkJeHpfZGVjX3Jlc2V0KHMpOworCisJaW5fc3RhcnQgPSBiLT5pbl9wb3M7CisJb3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKwlyZXQgPSBkZWNfbWFpbihzLCBiKTsKKworCWlmIChERUNfSVNfU0lOR0xFKHMtPm1vZGUpKSB7CisJCWlmIChyZXQgPT0gWFpfT0spCisJCQlyZXQgPSBiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZQorCQkJCQk/IFhaX0RBVEFfRVJST1IgOiBYWl9CVUZfRVJST1I7CisKKwkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKSB7CisJCQliLT5pbl9wb3MgPSBpbl9zdGFydDsKKwkJCWItPm91dF9wb3MgPSBvdXRfc3RhcnQ7CisJCX0KKworCX0gZWxzZSBpZiAocmV0ID09IFhaX09LICYmIGluX3N0YXJ0ID09IGItPmluX3BvcworCQkJJiYgb3V0X3N0YXJ0ID09IGItPm91dF9wb3MpIHsKKwkJaWYgKHMtPmFsbG93X2J1Zl9lcnJvcikKKwkJCXJldCA9IFhaX0JVRl9FUlJPUjsKKworCQlzLT5hbGxvd19idWZfZXJyb3IgPSB0cnVlOworCX0gZWxzZSB7CisJCXMtPmFsbG93X2J1Zl9lcnJvciA9IGZhbHNlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjICogWFpfRlVOQyB4el9kZWNfaW5pdCgKKwkJZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KQoreworCXN0cnVjdCB4el9kZWMgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcy0+bW9kZSA9IG1vZGU7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJcy0+YmNqID0geHpfZGVjX2Jjal9jcmVhdGUoREVDX0lTX1NJTkdMRShtb2RlKSk7CisJaWYgKHMtPmJjaiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2JjajsKKyNlbmRpZgorCisJcy0+bHptYTIgPSB4el9kZWNfbHptYTJfY3JlYXRlKG1vZGUsIGRpY3RfbWF4KTsKKwlpZiAocy0+bHptYTIgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9sem1hMjsKKworCXh6X2RlY19yZXNldChzKTsKKwlyZXR1cm4gczsKKworZXJyb3JfbHptYTI6CisjaWZkZWYgWFpfREVDX0JDSgorCXh6X2RlY19iY2pfZW5kKHMtPmJjaik7CitlcnJvcl9iY2o6CisjZW5kaWYKKwlrZnJlZShzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfcmVzZXQoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlzLT5zZXF1ZW5jZSA9IFNFUV9TVFJFQU1fSEVBREVSOworCXMtPmFsbG93X2J1Zl9lcnJvciA9IGZhbHNlOworCXMtPnBvcyA9IDA7CisJcy0+Y3JjMzIgPSAwOworCW1lbXplcm8oJnMtPmJsb2NrLCBzaXplb2Yocy0+YmxvY2spKTsKKwltZW16ZXJvKCZzLT5pbmRleCwgc2l6ZW9mKHMtPmluZGV4KSk7CisJcy0+dGVtcC5wb3MgPSAwOworCXMtPnRlbXAuc2l6ZSA9IFNUUkVBTV9IRUFERVJfU0laRTsKK30KKworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfZW5kKHN0cnVjdCB4el9kZWMgKnMpCit7CisJaWYgKHMgIT0gTlVMTCkgeworCQl4el9kZWNfbHptYTJfZW5kKHMtPmx6bWEyKTsKKyNpZmRlZiBYWl9ERUNfQkNKCisJCXh6X2RlY19iY2pfZW5kKHMtPmJjaik7CisjZW5kaWYKKwkJa2ZyZWUocyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2x6bWEyLmggYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfbHptYTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2YyMWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2x6bWEyLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMWk1BMiBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2lmbmRlZiBYWl9MWk1BMl9ICisjZGVmaW5lIFhaX0xaTUEyX0gKKworLyogUmFuZ2UgY29kZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFJDX1NISUZUX0JJVFMgOAorI2RlZmluZSBSQ19UT1BfQklUUyAyNAorI2RlZmluZSBSQ19UT1BfVkFMVUUgKDEgPDwgUkNfVE9QX0JJVFMpCisjZGVmaW5lIFJDX0JJVF9NT0RFTF9UT1RBTF9CSVRTIDExCisjZGVmaW5lIFJDX0JJVF9NT0RFTF9UT1RBTCAoMSA8PCBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUykKKyNkZWZpbmUgUkNfTU9WRV9CSVRTIDUKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIHBvc2l0aW9uIHN0YXRlcy4gQSBwb3NpdGlvbiBzdGF0ZSBpcyB0aGUgbG93ZXN0IHBiCisgKiBudW1iZXIgb2YgYml0cyBvZiB0aGUgY3VycmVudCB1bmNvbXByZXNzZWQgb2Zmc2V0LiBJbiBzb21lIHBsYWNlcyB0aGVyZQorICogYXJlIGRpZmZlcmVudCBzZXRzIG9mIHByb2JhYmlsaXRpZXMgZm9yIGRpZmZlcmVudCBwb3NpdGlvbiBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgUE9TX1NUQVRFU19NQVggKDEgPDwgNCkKKworLyoKKyAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIHRyYWNrIHdoaWNoIExaTUEgc3ltYm9scyBoYXZlIG9jY3VycmVkIG1vc3QgcmVjZW50bHkKKyAqIGFuZCBpbiB3aGljaCBvcmRlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByZWRpY3QgdGhlIG5leHQgc3ltYm9sLgorICoKKyAqIFN5bWJvbHM6CisgKiAgLSBMaXRlcmFsOiBPbmUgOC1iaXQgYnl0ZQorICogIC0gTWF0Y2g6IFJlcGVhdCBhIGNodW5rIG9mIGRhdGEgYXQgc29tZSBkaXN0YW5jZQorICogIC0gTG9uZyByZXBlYXQ6IE11bHRpLWJ5dGUgbWF0Y2ggYXQgYSByZWNlbnRseSBzZWVuIGRpc3RhbmNlCisgKiAgLSBTaG9ydCByZXBlYXQ6IE9uZS1ieXRlIHJlcGVhdCBhdCBhIHJlY2VudGx5IHNlZW4gZGlzdGFuY2UKKyAqCisgKiBUaGUgc3ltYm9sIG5hbWVzIGFyZSBpbiBmcm9tIFNUQVRFX29sZGVzdF9vbGRlcl9wcmV2aW91cy4gUkVQIG1lYW5zCisgKiBlaXRoZXIgc2hvcnQgb3IgbG9uZyByZXBlYXRlZCBtYXRjaCwgYW5kIE5PTkxJVCBtZWFucyBhbnkgbm9uLWxpdGVyYWwuCisgKi8KK2VudW0gbHptYV9zdGF0ZSB7CisJU1RBVEVfTElUX0xJVCwKKwlTVEFURV9NQVRDSF9MSVRfTElULAorCVNUQVRFX1JFUF9MSVRfTElULAorCVNUQVRFX1NIT1JUUkVQX0xJVF9MSVQsCisJU1RBVEVfTUFUQ0hfTElULAorCVNUQVRFX1JFUF9MSVQsCisJU1RBVEVfU0hPUlRSRVBfTElULAorCVNUQVRFX0xJVF9NQVRDSCwKKwlTVEFURV9MSVRfTE9OR1JFUCwKKwlTVEFURV9MSVRfU0hPUlRSRVAsCisJU1RBVEVfTk9OTElUX01BVENILAorCVNUQVRFX05PTkxJVF9SRVAKK307CisKKy8qIFRvdGFsIG51bWJlciBvZiBzdGF0ZXMgKi8KKyNkZWZpbmUgU1RBVEVTIDEyCisKKy8qIFRoZSBsb3dlc3QgNyBzdGF0ZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJldmlvdXMgc3RhdGUgd2FzIGEgbGl0ZXJhbC4gKi8KKyNkZWZpbmUgTElUX1NUQVRFUyA3CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgbGl0ZXJhbC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIGx6bWFfc3RhdGVfbGl0ZXJhbChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCWlmICgqc3RhdGUgPD0gU1RBVEVfU0hPUlRSRVBfTElUX0xJVCkKKwkJKnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKwllbHNlIGlmICgqc3RhdGUgPD0gU1RBVEVfTElUX1NIT1JUUkVQKQorCQkqc3RhdGUgLT0gMzsKKwllbHNlCisJCSpzdGF0ZSAtPSA2OworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIFhaX0ZVTkMgbHptYV9zdGF0ZV9tYXRjaChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCSpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfTUFUQ0ggOiBTVEFURV9OT05MSVRfTUFUQ0g7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzdGF0ZSB3YXMgYSBsb25nIHJlcGVhdGVkIG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIFhaX0ZVTkMgbHptYV9zdGF0ZV9sb25nX3JlcChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCSpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfTE9OR1JFUCA6IFNUQVRFX05PTkxJVF9SRVA7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgc2hvcnQgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyBsem1hX3N0YXRlX3Nob3J0X3JlcChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCSpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfU0hPUlRSRVAgOiBTVEFURV9OT05MSVRfUkVQOworfQorCisvKiBUZXN0IGlmIHRoZSBwcmV2aW91cyBzeW1ib2wgd2FzIGEgbGl0ZXJhbC4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBYWl9GVU5DIGx6bWFfc3RhdGVfaXNfbGl0ZXJhbChlbnVtIGx6bWFfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlIDwgTElUX1NUQVRFUzsKK30KKworLyogRWFjaCBsaXRlcmFsIGNvZGVyIGlzIGRpdmlkZWQgaW4gdGhyZWUgc2VjdGlvbnM6CisgKiAgIC0gMHgwMDEtMHgwRkY6IFdpdGhvdXQgbWF0Y2ggYnl0ZQorICogICAtIDB4MTAxLTB4MUZGOiBXaXRoIG1hdGNoIGJ5dGU7IG1hdGNoIGJpdCBpcyAwCisgKiAgIC0gMHgyMDEtMHgyRkY6IFdpdGggbWF0Y2ggYnl0ZTsgbWF0Y2ggYml0IGlzIDEKKyAqCisgKiBNYXRjaCBieXRlIGlzIHVzZWQgd2hlbiB0aGUgcHJldmlvdXMgTFpNQSBzeW1ib2wgd2FzIHNvbWV0aGluZyBlbHNlIHRoYW4KKyAqIGEgbGl0ZXJhbCAodGhhdCBpcywgaXQgd2FzIHNvbWUga2luZCBvZiBtYXRjaCkuCisgKi8KKyNkZWZpbmUgTElURVJBTF9DT0RFUl9TSVpFIDB4MzAwCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGxpdGVyYWwgY29kZXJzICovCisjZGVmaW5lIExJVEVSQUxfQ09ERVJTX01BWCAoMSA8PCA0KQorCisvKiBNaW5pbXVtIGxlbmd0aCBvZiBhIG1hdGNoIGlzIHR3byBieXRlcy4gKi8KKyNkZWZpbmUgTUFUQ0hfTEVOX01JTiAyCisKKy8qIE1hdGNoIGxlbmd0aCBpcyBlbmNvZGVkIHdpdGggNCwgNSwgb3IgMTAgYml0cy4KKyAqCisgKiBMZW5ndGggICBCaXRzCisgKiAgMi05ICAgICAgNCA9IENob2ljZT0wICsgMyBiaXRzCisgKiAxMC0xNyAgICAgNSA9IENob2ljZT0xICsgQ2hvaWNlMj0wICsgMyBiaXRzCisgKiAxOC0yNzMgICAxMCA9IENob2ljZT0xICsgQ2hvaWNlMj0xICsgOCBiaXRzCisgKi8KKyNkZWZpbmUgTEVOX0xPV19CSVRTIDMKKyNkZWZpbmUgTEVOX0xPV19TWU1CT0xTICgxIDw8IExFTl9MT1dfQklUUykKKyNkZWZpbmUgTEVOX01JRF9CSVRTIDMKKyNkZWZpbmUgTEVOX01JRF9TWU1CT0xTICgxIDw8IExFTl9NSURfQklUUykKKyNkZWZpbmUgTEVOX0hJR0hfQklUUyA4CisjZGVmaW5lIExFTl9ISUdIX1NZTUJPTFMgKDEgPDwgTEVOX0hJR0hfQklUUykKKyNkZWZpbmUgTEVOX1NZTUJPTFMgKExFTl9MT1dfU1lNQk9MUyArIExFTl9NSURfU1lNQk9MUyArIExFTl9ISUdIX1NZTUJPTFMpCisKKy8qCisgKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG1hdGNoIGlzIDI3MyB3aGljaCBpcyBhIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcKKyAqIGRlc2NyaWJlZCBhYm92ZS4KKyAqLworI2RlZmluZSBNQVRDSF9MRU5fTUFYIChNQVRDSF9MRU5fTUlOICsgTEVOX1NZTUJPTFMgLSAxKQorCisvKgorICogRGlmZmVyZW50IHNldHMgb2YgcHJvYmFiaWxpdGllcyBhcmUgdXNlZCBmb3IgbWF0Y2ggZGlzdGFuY2VzIHRoYXQgaGF2ZQorICogdmVyeSBzaG9ydCBtYXRjaCBsZW5ndGg6IExlbmd0aHMgb2YgMiwgMywgYW5kIDQgYnl0ZXMgaGF2ZSBhIHNlcGFyYXRlCisgKiBzZXQgb2YgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBsZW5ndGguIFRoZSBtYXRjaGVzIHdpdGggbG9uZ2VyIGxlbmd0aAorICogdXNlIGEgc2hhcmVkIHNldCBvZiBwcm9iYWJpbGl0aWVzLgorICovCisjZGVmaW5lIERJU1RfU1RBVEVTIDQKKworLyoKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGFwcHJvcHJpYXRlIHByb2JhYmlsaXR5IGFycmF5IGZvciBkZWNvZGluZworICogdGhlIGRpc3RhbmNlIHNsb3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgWFpfRlVOQyBsem1hX2dldF9kaXN0X3N0YXRlKHVpbnQzMl90IGxlbikKK3sKKwlyZXR1cm4gbGVuIDwgRElTVF9TVEFURVMgKyBNQVRDSF9MRU5fTUlOCisJCQk/IGxlbiAtIE1BVENIX0xFTl9NSU4gOiBESVNUX1NUQVRFUyAtIDE7Cit9CisKKy8qCisgKiBUaGUgaGlnaGVzdCB0d28gYml0cyBvZiBhIDMyLWJpdCBtYXRjaCBkaXN0YW5jZSBhcmUgZW5jb2RlZCB1c2luZyBzaXggYml0cy4KKyAqIFRoaXMgc2l4LWJpdCB2YWx1ZSBpcyBjYWxsZWQgYSBkaXN0YW5jZSBzbG90LiBUaGlzIHdheSBlbmNvZGluZyBhIDMyLWJpdAorICogdmFsdWUgdGFrZXMgNi0zNiBiaXRzLCBsYXJnZXIgdmFsdWVzIHRha2luZyBtb3JlIGJpdHMuCisgKi8KKyNkZWZpbmUgRElTVF9TTE9UX0JJVFMgNgorI2RlZmluZSBESVNUX1NMT1RTICgxIDw8IERJU1RfU0xPVF9CSVRTKQorCisvKiBNYXRjaCBkaXN0YW5jZXMgdXAgdG8gMTI3IGFyZSBmdWxseSBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuIFNpbmNlCisgKiB0aGUgaGlnaGVzdCB0d28gYml0cyAoZGlzdGFuY2Ugc2xvdCkgYXJlIGFsd2F5cyBlbmNvZGVkIHVzaW5nIHNpeCBiaXRzLAorICogdGhlIGRpc3RhbmNlcyAwLTMgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBiaXRzIHRvIGVuY29kZSwgc2luY2UgdGhlCisgKiBkaXN0YW5jZSBzbG90IGl0c2VsZiBpcyB0aGUgc2FtZSBhcyB0aGUgYWN0dWFsIGRpc3RhbmNlLiBESVNUX01PREVMX1NUQVJUCisgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IGRpc3RhbmNlIHNsb3Qgd2hlcmUgYXQgbGVhc3Qgb25lIGFkZGl0aW9uYWwgYml0IGlzCisgKiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgRElTVF9NT0RFTF9TVEFSVCA0CisKKy8qCisgKiBNYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNyBhcmUgZW5jb2RlZCBpbiB0aHJlZSBwaWVjZXM6CisgKiAgIC0gZGlzdGFuY2Ugc2xvdDogdGhlIGhpZ2hlc3QgdHdvIGJpdHMKKyAqICAgLSBkaXJlY3QgYml0czogMi0yNiBiaXRzIGJlbG93IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gYWxpZ25tZW50IGJpdHM6IGZvdXIgbG93ZXN0IGJpdHMKKyAqCisgKiBEaXJlY3QgYml0cyBkb24ndCB1c2UgYW55IHByb2JhYmlsaXRpZXMuCisgKgorICogVGhlIGRpc3RhbmNlIHNsb3QgdmFsdWUgb2YgMTQgaXMgZm9yIGRpc3RhbmNlcyAxMjgtMTkxLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfRU5EIDE0CisKKy8qIERpc3RhbmNlIHNsb3RzIHRoYXQgaW5kaWNhdGUgYSBkaXN0YW5jZSA8PSAxMjcuICovCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTX0JJVFMgKERJU1RfTU9ERUxfRU5EIC8gMikKKyNkZWZpbmUgRlVMTF9ESVNUQU5DRVMgKDEgPDwgRlVMTF9ESVNUQU5DRVNfQklUUykKKworLyoKKyAqIEZvciBtYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNywgb25seSB0aGUgaGlnaGVzdCB0d28gYml0cyBhbmQgdGhlCisgKiBsb3dlc3QgZm91ciBiaXRzIChhbGlnbm1lbnQpIGlzIGVuY29kZWQgdXNpbmcgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBBTElHTl9CSVRTIDQKKyNkZWZpbmUgQUxJR05fU0laRSAoMSA8PCBBTElHTl9CSVRTKQorI2RlZmluZSBBTElHTl9NQVNLIChBTElHTl9TSVpFIC0gMSkKKworLyogVG90YWwgbnVtYmVyIG9mIGFsbCBwcm9iYWJpbGl0eSB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgUFJPQlNfVE9UQUwgKDE4NDYgKyBMSVRFUkFMX0NPREVSU19NQVggKiBMSVRFUkFMX0NPREVSX1NJWkUpCisKKy8qCisgKiBMWk1BIHJlbWVtYmVycyB0aGUgZm91ciBtb3N0IHJlY2VudCBtYXRjaCBkaXN0YW5jZXMuIFJldXNpbmcgdGhlc2UKKyAqIGRpc3RhbmNlcyB0ZW5kcyB0byB0YWtlIGxlc3Mgc3BhY2UgdGhhbiByZS1lbmNvZGluZyB0aGUgYWN0dWFsCisgKiBkaXN0YW5jZSB2YWx1ZS4KKyAqLworI2RlZmluZSBSRVBTIDQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfcHJpdmF0ZS5oIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDU2NDlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3ByaXZhdGUuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIFByaXZhdGUgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfUFJJVkFURV9ICisjZGVmaW5lIFhaX1BSSVZBVEVfSAorCisjaWZkZWYgX19LRVJORUxfXworCS8qIFhaX1BSRUJPT1QgbWF5IGJlIGRlZmluZWQgb25seSB2aWEgZGVjb21wcmVzc191bnh6LmMuICovCisjCWlmbmRlZiBYWl9QUkVCT09UCisjCQlpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjCQlpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjCQlpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyMJCWRlZmluZSBtZW1lcShhLCBiLCBzaXplKSAobWVtY21wKGEsIGIsIHNpemUpID09IDApCisjCQlkZWZpbmUgbWVtemVybyhidWYsIHNpemUpIG1lbXNldChidWYsIDAsIHNpemUpCisjCWVuZGlmCisjCWluY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyMJaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorIwlkZWZpbmUgZ2V0X2xlMzIocCkgbGUzMl90b19jcHVwKChjb25zdCB1aW50MzJfdCAqKShwKSkKKwkvKiBYWl9JR05PUkVfS0NPTkZJRyBtYXkgYmUgZGVmaW5lZCBvbmx5IHZpYSBkZWNvbXByZXNzX3VueHouYy4gKi8KKyMJaWZuZGVmIFhaX0lHTk9SRV9LQ09ORklHCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX1g4NgorIwkJCWRlZmluZSBYWl9ERUNfWDg2CisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19QT1dFUlBDCisjCQkJZGVmaW5lIFhaX0RFQ19QT1dFUlBDCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19JQTY0CisjCQkJZGVmaW5lIFhaX0RFQ19JQTY0CisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19BUk0KKyMJCQlkZWZpbmUgWFpfREVDX0FSTQorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfQVJNVEhVTUIKKyMJCQlkZWZpbmUgWFpfREVDX0FSTVRIVU1CCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19TUEFSQworIwkJCWRlZmluZSBYWl9ERUNfU1BBUkMKKyMJCWVuZGlmCisjCWVuZGlmCisjCWluY2x1ZGUgPGxpbnV4L3h6Lmg+CisjZWxzZQorCS8qCisJICogRm9yIHVzZXJzcGFjZSBidWlsZHMsIHVzZSBhIHNlcGFyYXRlIGhlYWRlciB0byBkZWZpbmUgdGhlIHJlcXVpcmVkCisJICogbWFjcm9zIGFuZCBmdW5jdGlvbnMuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGFkYXB0IHRoZSBjb2RlIGludG8KKwkgKiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIGFuZCBhdm9pZHMgY2x1dHRlciBpbiB0aGUgTGludXgga2VybmVsIHRyZWUuCisJICovCisjCWluY2x1ZGUgInh6X2NvbmZpZy5oIgorI2VuZGlmCisKKy8qIElmIG5vIHNwZWNpZmljIGRlY29kaW5nIG1vZGUgaXMgcmVxdWVzdGVkLCBlbmFibGUgc3VwcG9ydCBmb3IgYWxsIG1vZGVzLiAqLworI2lmICFkZWZpbmVkKFhaX0RFQ19TSU5HTEUpICYmICFkZWZpbmVkKFhaX0RFQ19QUkVBTExPQykgXAorCQkmJiAhZGVmaW5lZChYWl9ERUNfRFlOQUxMT0MpCisjCWRlZmluZSBYWl9ERUNfU0lOR0xFCisjCWRlZmluZSBYWl9ERUNfUFJFQUxMT0MKKyMJZGVmaW5lIFhaX0RFQ19EWU5BTExPQworI2VuZGlmCisKKy8qCisgKiBUaGUgREVDX0lTX2Zvbyhtb2RlKSBtYWNyb3MgYXJlIHVzZWQgaW4gImlmIiBzdGF0ZW1lbnRzLiBJZiBvbmx5IHNvbWUKKyAqIG9mIHRoZSBzdXBwb3J0ZWQgbW9kZXMgYXJlIGVuYWJsZWQsIHRoZXNlIG1hY3JvcyB3aWxsIGV2YWx1YXRlIHRvIHRydWUgb3IKKyAqIGZhbHNlIGF0IGNvbXBpbGUgdGltZSBhbmQgdGh1cyBhbGxvdyB0aGUgY29tcGlsZXIgdG8gb21pdCB1bm5lZWRlZCBjb2RlLgorICovCisjaWZkZWYgWFpfREVDX1NJTkdMRQorIwlkZWZpbmUgREVDX0lTX1NJTkdMRShtb2RlKSAoKG1vZGUpID09IFhaX1NJTkdMRSkKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfU0lOR0xFKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX1BSRUFMTE9DCisjCWRlZmluZSBERUNfSVNfUFJFQUxMT0MobW9kZSkgKChtb2RlKSA9PSBYWl9QUkVBTExPQykKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfUFJFQUxMT0MobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfRFlOQUxMT0MKKyMJZGVmaW5lIERFQ19JU19EWU5BTExPQyhtb2RlKSAoKG1vZGUpID09IFhaX0RZTkFMTE9DKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19EWU5BTExPQyhtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhaX0RFQ19TSU5HTEUpCisjCWRlZmluZSBERUNfSVNfTVVMVEkobW9kZSkgKHRydWUpCisjZWxpZiBkZWZpbmVkKFhaX0RFQ19QUkVBTExPQykgfHwgZGVmaW5lZChYWl9ERUNfRFlOQUxMT0MpCisjCWRlZmluZSBERUNfSVNfTVVMVEkobW9kZSkgKChtb2RlKSAhPSBYWl9TSU5HTEUpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisvKgorICogSWYgYW55IG9mIHRoZSBCQ0ogZmlsdGVyIGRlY29kZXJzIGFyZSB3YW50ZWQsIGRlZmluZSBYWl9ERUNfQkNKLgorICogWFpfREVDX0JDSiBpcyB1c2VkIHRvIGVuYWJsZSBnZW5lcmljIHN1cHBvcnQgZm9yIEJDSiBkZWNvZGVycy4KKyAqLworI2lmbmRlZiBYWl9ERUNfQkNKCisjCWlmIGRlZmluZWQoWFpfREVDX1g4NikgfHwgZGVmaW5lZChYWl9ERUNfUE9XRVJQQykgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfSUE2NCkgfHwgZGVmaW5lZChYWl9ERUNfQVJNKSBcCisJCQl8fCBkZWZpbmVkKFhaX0RFQ19BUk0pIHx8IGRlZmluZWQoWFpfREVDX0FSTVRIVU1CKSBcCisJCQl8fCBkZWZpbmVkKFhaX0RFQ19TUEFSQykKKyMJCWRlZmluZSBYWl9ERUNfQkNKCisjCWVuZGlmCisjZW5kaWYKKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgTFpNQTIgZGVjb2Rlci4geHpfZGVjX2x6bWEyX3Jlc2V0KCkgbXVzdCBiZSB1c2VkCisgKiBiZWZvcmUgY2FsbGluZyB4el9kZWNfbHptYTJfcnVuKCkuCisgKi8KK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjX2x6bWEyICogWFpfRlVOQyB4el9kZWNfbHptYTJfY3JlYXRlKAorCQllbnVtIHh6X21vZGUgbW9kZSwgdWludDMyX3QgZGljdF9tYXgpOworCisvKgorICogRGVjb2RlIHRoZSBMWk1BMiBwcm9wZXJ0aWVzIChvbmUgYnl0ZSkgYW5kIHJlc2V0IHRoZSBkZWNvZGVyLiBSZXR1cm4KKyAqIFhaX09LIG9uIHN1Y2Nlc3MsIFhaX01FTUxJTUlUX0VSUk9SIGlmIHRoZSBwcmVhbGxvY2F0ZWQgZGljdGlvbmFyeSBpcyBub3QKKyAqIGJpZyBlbm91Z2gsIGFuZCBYWl9PUFRJT05TX0VSUk9SIGlmIHByb3BzIGluZGljYXRlcyBzb21ldGhpbmcgdGhhdCB0aGlzCisgKiBkZWNvZGVyIGRvZXNuJ3Qgc3VwcG9ydC4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2x6bWEyX3Jlc2V0KAorCQlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50OF90IHByb3BzKTsKKworLyogRGVjb2RlIHJhdyBMWk1BMiBzdHJlYW0gZnJvbSBiLT5pbiB0byBiLT5vdXQuICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfbHptYTJfcnVuKAorCQlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIExaTUEyIGRlY29kZXIuICovCitYWl9FWFRFUk4gdm9pZCBYWl9GVU5DIHh6X2RlY19sem1hMl9lbmQoc3RydWN0IHh6X2RlY19sem1hMiAqcyk7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBCQ0ogZGVjb2RlcnMuIHh6X2RlY19iY2pfcmVzZXQoKSBtdXN0IGJlIHVzZWQgYmVmb3JlCisgKiBjYWxsaW5nIHh6X2RlY19iY2pfcnVuKCkuCisgKi8KK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjX2JjaiAqIFhaX0ZVTkMgeHpfZGVjX2Jjal9jcmVhdGUoYm9vbCBzaW5nbGVfY2FsbCk7CisKKy8qCisgKiBEZWNvZGUgdGhlIEZpbHRlciBJRCBvZiBhIEJDSiBmaWx0ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndAorICogc3VwcG9ydCBjdXN0b20gc3RhcnQgb2Zmc2V0cywgc28gbm8gZGVjb2Rpbmcgb2YgRmlsdGVyIFByb3BlcnRpZXMKKyAqIGlzIG5lZWRlZC4gUmV0dXJucyBYWl9PSyBpZiB0aGUgZ2l2ZW4gRmlsdGVyIElEIGlzIHN1cHBvcnRlZC4KKyAqIE90aGVyd2lzZSBYWl9PUFRJT05TX0VSUk9SIGlzIHJldHVybmVkLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfYmNqX3Jlc2V0KAorCQlzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCBpZCk7CisKKy8qCisgKiBEZWNvZGUgcmF3IEJDSiArIExaTUEyIHN0cmVhbS4gVGhpcyBtdXN0IGJlIHVzZWQgb25seSBpZiB0aGVyZSBhY3R1YWxseSBpcworICogYSBCQ0ogZmlsdGVyIGluIHRoZSBjaGFpbi4gSWYgdGhlIGNoYWluIGhhcyBvbmx5IExaTUEyLCB4el9kZWNfbHptYTJfcnVuKCkKKyAqIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5LgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgWFpfRlVOQyB4el9kZWNfYmNqX3J1bihzdHJ1Y3QgeHpfZGVjX2JjaiAqcywKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsIHN0cnVjdCB4el9idWYgKmIpOworCisvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgQkNKIGZpbHRlcnMuICovCisjZGVmaW5lIHh6X2RlY19iY2pfZW5kKHMpIGtmcmVlKHMpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfc3RyZWFtLmggYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmMmE3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9zdHJlYW0uaApAQCAtMCwwICsxLDU3IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIGhhbmRsaW5nIHRoZSAueHogZmlsZSBmb3JtYXQKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2lmbmRlZiBYWl9TVFJFQU1fSAorI2RlZmluZSBYWl9TVFJFQU1fSAorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhWFpfSU5URVJOQUxfQ1JDMzIKKyMJaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyMJdW5kZWYgY3JjMzIKKyMJZGVmaW5lIHh6X2NyYzMyKGJ1Ziwgc2l6ZSwgY3JjKSBcCisJCSh+Y3JjMzJfbGUofih1aW50MzJfdCkoY3JjKSwgYnVmLCBzaXplKSkKKyNlbmRpZgorCisvKgorICogU2VlIHRoZSAueHogZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBhdAorICogaHR0cDovL3R1a2Fhbmkub3JnL3h6L3h6LWZpbGUtZm9ybWF0LnR4dAorICogdG8gdW5kZXJzdGFuZCB0aGUgY29udGFpbmVyIGZvcm1hdC4KKyAqLworCisjZGVmaW5lIFNUUkVBTV9IRUFERVJfU0laRSAxMgorCisjZGVmaW5lIEhFQURFUl9NQUdJQyAiXDM3NTd6WFpcMCIKKyNkZWZpbmUgSEVBREVSX01BR0lDX1NJWkUgNgorCisjZGVmaW5lIEZPT1RFUl9NQUdJQyAiWVoiCisjZGVmaW5lIEZPT1RFUl9NQUdJQ19TSVpFIDIKKworLyoKKyAqIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGNhbiBob2xkIGEgNjMtYml0IHVuc2lnbmVkIGludGVnZXIsIG9yIGEgc3BlY2lhbAorICogdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgdW5rbm93bi4KKyAqLwordHlwZWRlZiB1aW50NjRfdCB2bGlfdHlwZTsKKworI2RlZmluZSBWTElfTUFYICgodmxpX3R5cGUpLTEgLyAyKQorI2RlZmluZSBWTElfVU5LTk9XTiAoKHZsaV90eXBlKS0xKQorCisvKiBNYXhpbXVtIGVuY29kZWQgc2l6ZSBvZiBhIFZMSSAqLworI2RlZmluZSBWTElfQllURVNfTUFYIChzaXplb2YodmxpX3R5cGUpICogOCAvIDcpCisKKy8qIEludGVncml0eSBDaGVjayB0eXBlcyAqLworZW51bSB4el9jaGVjayB7CisJWFpfQ0hFQ0tfTk9ORSA9IDAsCisJWFpfQ0hFQ0tfQ1JDMzIgPSAxLAorCVhaX0NIRUNLX0NSQzY0ID0gNCwKKwlYWl9DSEVDS19TSEEyNTYgPSAxMAorfTsKKworLyogTWF4aW11bSBwb3NzaWJsZSBDaGVjayBJRCAqLworI2RlZmluZSBYWl9DSEVDS19NQVggMTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9sem9wLmMgYi9hcmNoaXZhbC9sem9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyNmJkNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2x6b3AuYwpAQCAtMCwwICsxLDExMDAgQEAKKy8qCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbHpvcCBmaWxlIGNvbXByZXNzb3IuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni4uMjAwMyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem9wLworCisgICBsem9wIGFuZCB0aGUgTFpPIGxpYnJhcnkgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIHRoZW0KKyAgIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICAiTWluaW1hbGl6ZWQiIGZvciBidXN5Ym94IGJ5IEFsYWluIEtuYWZmCisqLworCisvL3VzYWdlOiNkZWZpbmUgbHpvcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZnZkMTIzNDU2Nzg5Q0ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsem9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS0xLi45CUNvbXByZXNzaW9uIGxldmVsIgorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktRglEb24ndCBzdG9yZSBvciB2ZXJpZnkgY2hlY2tzdW0iCisvL3VzYWdlOiAgICAgIlxuCS1DCUFsc28gd3JpdGUgY2hlY2tzdW0gb2YgY29tcHJlc3NlZCBibG9jayIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbHpvcGNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12Q0ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsem9wY2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1GCURvbid0IHN0b3JlIG9yIHZlcmlmeSBjaGVja3N1bSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5sem9wX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmdkNGXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW5sem9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1GCURvbid0IHN0b3JlIG9yIHZlcmlmeSBjaGVja3N1bSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2luY2x1ZGUgImxpYmx6b19pbnRlcmZhY2UuaCIKKworLyogbHpvLTIuMDMvc3JjL2x6b19wdHIuaCAqLworI2RlZmluZSBwZChhLGIpCSAoKHVuc2lnbmVkKSgoYSktKGIpKSkKKworI2RlZmluZSBsem9fdmVyc2lvbigpCQkJTFpPX1ZFUlNJT04KKyNkZWZpbmUgbHpvX3NpemVvZl9kaWN0X3QJCShzaXplb2YodWludDhfdCopKQorCisvKiBsem8tMi4wMy9pbmNsdWRlL2x6by9sem8xeC5oICovCisjZGVmaW5lIExaTzFYXzFfTUVNX0NPTVBSRVNTCSgxNjM4NCAqIGx6b19zaXplb2ZfZGljdF90KQorI2RlZmluZSBMWk8xWF8xXzE1X01FTV9DT01QUkVTUyAoMzI3NjggKiBsem9fc2l6ZW9mX2RpY3RfdCkKKyNkZWZpbmUgTFpPMVhfOTk5X01FTV9DT01QUkVTUwkoMTQgKiAxNjM4NCAqIHNpemVvZihzaG9ydCkpCisKKy8qIGx6by0yLjAzL3NyYy9sem8xeF9vby5jICovCisjZGVmaW5lIE5PX0xJVCBVSU5UX01BWAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvcHkyKHVpbnQ4X3QqIGlwLCBjb25zdCB1aW50OF90KiBtX3BvcywgdW5zaWduZWQgb2ZmKQoreworCWlwWzBdID0gbV9wb3NbMF07CisJaWYgKG9mZiA9PSAxKQorCQlpcFsxXSA9IG1fcG9zWzBdOworCWVsc2UKKwkJaXBbMV0gPSBtX3Bvc1sxXTsKK30KKworc3RhdGljIHZvaWQgY29weTModWludDhfdCogaXAsIGNvbnN0IHVpbnQ4X3QqIG1fcG9zLCB1bnNpZ25lZCBvZmYpCit7CisJaXBbMF0gPSBtX3Bvc1swXTsKKwlpZiAob2ZmID09IDEpIHsKKwkJaXBbMl0gPSBpcFsxXSA9IG1fcG9zWzBdOworCX0KKwllbHNlIGlmIChvZmYgPT0gMikgeworCQlpcFsxXSA9IG1fcG9zWzFdOworCQlpcFsyXSA9IG1fcG9zWzBdOworCX0KKwllbHNlIHsKKwkJaXBbMV0gPSBtX3Bvc1sxXTsKKwkJaXBbMl0gPSBtX3Bvc1syXTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gb3B0aW1pemUgYSBibG9jayBvZiBkYXRhLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRFU1RfSVAJCShpcCA8IGlwX2VuZCkKKyNkZWZpbmUgVEVTVF9PUAkJKG9wIDw9IG9wX2VuZCkKKworc3RhdGljIE5PSU5MSU5FIGludCBsem8xeF9vcHRpbWl6ZSh1aW50OF90ICppbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0gVU5VU0VEX1BBUkFNKQoreworCXVpbnQ4X3QqIG9wOworCXVpbnQ4X3QqIGlwOworCXVuc2lnbmVkIHQ7CisJdWludDhfdCogbV9wb3M7CisJdWludDhfdCogY29uc3QgaXBfZW5kID0gaW4gKyBpbl9sZW47CisJdWludDhfdCogY29uc3Qgb3BfZW5kID0gb3V0ICsgKm91dF9sZW47CisJdWludDhfdCogbGl0cCA9IE5VTEw7CisJdW5zaWduZWQgbGl0ID0gMDsKKwl1bnNpZ25lZCBuZXh0X2xpdCA9IE5PX0xJVDsKKwl1bnNpZ25lZCBubDsKKwl1bnNpZ25lZCBsb25nIG9fbTFfYSA9IDAsIG9fbTFfYiA9IDAsIG9fbTIgPSAwLCBvX20zX2EgPSAwLCBvX20zX2IgPSAwOworCisvLwkgIExaT19VTlVTRUQod3JrbWVtKTsKKworCSpvdXRfbGVuID0gMDsKKworCW9wID0gb3V0OworCWlwID0gaW47CisKKwlpZiAoKmlwID4gMTcpIHsKKwkJdCA9ICppcCsrIC0gMTc7CisJCWlmICh0IDwgNCkKKwkJCWdvdG8gbWF0Y2hfbmV4dDsKKwkJZ290byBmaXJzdF9saXRlcmFsX3J1bjsKKwl9CisKKwl3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKSB7CisJCXQgPSAqaXArKzsKKwkJaWYgKHQgPj0gMTYpCisJCQlnb3RvIG1hdGNoOworCQkvKiBhIGxpdGVyYWwgcnVuICovCisJCWxpdHAgPSBpcCAtIDE7CisJCWlmICh0ID09IDApIHsKKwkJCXQgPSAxNTsKKwkJCXdoaWxlICgqaXAgPT0gMCkKKwkJCQl0ICs9IDI1NSwgaXArKzsKKwkJCXQgKz0gKmlwKys7CisJCX0KKwkJbGl0ID0gdCArIDM7CisJCS8qIGNvcHkgbGl0ZXJhbHMgKi8KKyBjb3B5X2xpdGVyYWxfcnVuOgorCQkqb3ArKyA9ICppcCsrOworCQkqb3ArKyA9ICppcCsrOworCQkqb3ArKyA9ICppcCsrOworIGZpcnN0X2xpdGVyYWxfcnVuOgorCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisKKwkJdCA9ICppcCsrOworCisJCWlmICh0ID49IDE2KQorCQkJZ290byBtYXRjaDsKKyNpZiBkZWZpbmVkKExaTzFYKQorCQltX3BvcyA9IG9wIC0gMSAtIDB4ODAwOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKwkJbV9wb3MgPSBvcCAtIDEgLSAweDQwMDsKKyNlbmRpZgorCQltX3BvcyAtPSB0ID4+IDI7CisJCW1fcG9zIC09ICppcCsrIDw8IDI7CisJCSpvcCsrID0gKm1fcG9zKys7CisJCSpvcCsrID0gKm1fcG9zKys7CisJCSpvcCsrID0gKm1fcG9zKys7CisJCWxpdCA9IDA7CisJCWdvdG8gbWF0Y2hfZG9uZTsKKworCisJCS8qIGhhbmRsZSBtYXRjaGVzICovCisJCWRvIHsKKwkJCWlmICh0IDwgMTYpIHsgLyogYSBNMSBtYXRjaCAqLworCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCW1fcG9zIC09IHQgPj4gMjsKKwkJCQltX3BvcyAtPSAqaXArKyA8PCAyOworCisJCQkJaWYgKGxpdHAgPT0gTlVMTCkKKwkJCQkJZ290byBjb3B5X20xOworCisJCQkJbmwgPSBpcFstMl0gJiAzOworCQkJCS8qIHRlc3QgaWYgYSBtYXRjaCBmb2xsb3dzICovCisJCQkJaWYgKG5sID09IDAgJiYgbGl0ID09IDEgJiYgaXBbMF0gPj0gMTYpIHsKKwkJCQkJbmV4dF9saXQgPSBubDsKKwkJCQkJLyogYWRqdXN0IGxlbmd0aCBvZiBwcmV2aW91cyBzaG9ydCBydW4gKi8KKwkJCQkJbGl0ICs9IDI7CisJCQkJCSpsaXRwID0gKHVuc2lnbmVkIGNoYXIpKCgqbGl0cCAmIH4zKSB8IGxpdCk7CisJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMiBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCWNvcHkyKGlwLTIsIG1fcG9zLCBwZChvcCwgbV9wb3MpKTsKKwkJCQkJb19tMV9hKys7CisJCQkJfQorCQkJCS8qIHRlc3QgaWYgYSBsaXRlcmFsIHJ1biBmb2xsb3dzICovCisJCQkJZWxzZQorCQkJCWlmIChubCA9PSAwCisJCQkJICYmIGlwWzBdIDwgMTYKKwkJCQkgJiYgaXBbMF0gIT0gMAorCQkJCSAmJiAobGl0ICsgMiArIGlwWzBdIDwgMTYpCisJCQkJKSB7CisJCQkJCXQgPSAqaXArKzsKKwkJCQkJLyogcmVtb3ZlIHNob3J0IHJ1biAqLworCQkJCQkqbGl0cCAmPSB+MzsKKwkJCQkJLyogY29weSBvdmVyIHRoZSAyIGxpdGVyYWxzIHRoYXQgcmVwbGFjZSB0aGUgbWF0Y2ggKi8KKwkJCQkJY29weTIoaXAtMysxLG1fcG9zLHBkKG9wLG1fcG9zKSk7CisJCQkJCS8qIG1vdmUgbGl0ZXJhbHMgMSBieXRlIGFoZWFkICovCisJCQkJCWxpdHAgKz0gMjsKKwkJCQkJaWYgKGxpdCA+IDApCisJCQkJCQltZW1tb3ZlKGxpdHArMSwgbGl0cCwgbGl0KTsKKwkJCQkJLyogaW5zZXJ0IG5ldyBsZW5ndGggb2YgbG9uZyBsaXRlcmFsIHJ1biAqLworCQkJCQlsaXQgKz0gMiArIHQgKyAzOworCQkJCQkqbGl0cCA9ICh1bnNpZ25lZCBjaGFyKShsaXQgLSAzKTsKKworCQkJCQlvX20xX2IrKzsKKwkJCQkJKm9wKysgPSAqbV9wb3MrKzsgKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJZ290byBjb3B5X2xpdGVyYWxfcnVuOworCQkJCX0KKyBjb3B5X20xOgorCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCX0gZWxzZSB7CisgbWF0Y2g6CisJCQkJaWYgKHQgPj0gNjQpIHsJCQkJLyogYSBNMiBtYXRjaCAqLworCQkJCQltX3BvcyA9IG9wIC0gMTsKKyNpZiBkZWZpbmVkKExaTzFYKQorCQkJCQltX3BvcyAtPSAodCA+PiAyKSAmIDc7CisJCQkJCW1fcG9zIC09ICppcCsrIDw8IDM7CisJCQkJCXQgPSAodCA+PiA1KSAtIDE7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorCQkJCQltX3BvcyAtPSAodCA+PiAyKSAmIDM7CisJCQkJCW1fcG9zIC09ICppcCsrIDw8IDI7CisJCQkJCXQgPSAodCA+PiA0KSAtIDM7CisjZW5kaWYKKwkJCQkJaWYgKGxpdHAgPT0gTlVMTCkKKwkJCQkJCWdvdG8gY29weV9tOworCisJCQkJCW5sID0gaXBbLTJdICYgMzsKKwkJCQkJLyogdGVzdCBpZiBpbiBiZWV0d2VlbiB0d28gbG9uZyBsaXRlcmFsIHJ1bnMgKi8KKwkJCQkJaWYgKHQgPT0gMSAmJiBsaXQgPiAzICYmIG5sID09IDAKKwkJCQkJICYmIGlwWzBdIDwgMTYgJiYgaXBbMF0gIT0gMCAmJiAobGl0ICsgMyArIGlwWzBdIDwgMTYpCisJCQkJCSkgeworCQkJCQkJdCA9ICppcCsrOworCQkJCQkJLyogY29weSBvdmVyIHRoZSAzIGxpdGVyYWxzIHRoYXQgcmVwbGFjZSB0aGUgbWF0Y2ggKi8KKwkJCQkJCWNvcHkzKGlwLTEtMixtX3BvcyxwZChvcCxtX3BvcykpOworCQkJCQkJLyogc2V0IG5ldyBsZW5ndGggb2YgcHJldmlvdXMgbGl0ZXJhbCBydW4gKi8KKwkJCQkJCWxpdCArPSAzICsgdCArIDM7CisJCQkJCQkqbGl0cCA9ICh1bnNpZ25lZCBjaGFyKShsaXQgLSAzKTsKKwkJCQkJCW9fbTIrKzsKKwkJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJCWdvdG8gY29weV9saXRlcmFsX3J1bjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICh0ID49IDMyKSB7CQkJLyogYSBNMyBtYXRjaCAqLworCQkJCQkJdCAmPSAzMTsKKwkJCQkJCWlmICh0ID09IDApIHsKKwkJCQkJCQl0ID0gMzE7CisJCQkJCQkJd2hpbGUgKCppcCA9PSAwKQorCQkJCQkJCQl0ICs9IDI1NSwgaXArKzsKKwkJCQkJCQl0ICs9ICppcCsrOworCQkJCQkJfQorCQkJCQkJbV9wb3MgPSBvcCAtIDE7CisJCQkJCQltX3BvcyAtPSAqaXArKyA+PiAyOworCQkJCQkJbV9wb3MgLT0gKmlwKysgPDwgNjsKKwkJCQkJfSBlbHNlIHsJCQkJCS8qIGEgTTQgbWF0Y2ggKi8KKwkJCQkJCW1fcG9zID0gb3A7CisJCQkJCQltX3BvcyAtPSAodCAmIDgpIDw8IDExOworCQkJCQkJdCAmPSA3OworCQkJCQkJaWYgKHQgPT0gMCkgeworCQkJCQkJCXQgPSA3OworCQkJCQkJCXdoaWxlICgqaXAgPT0gMCkKKwkJCQkJCQkJdCArPSAyNTUsIGlwKys7CisJCQkJCQkJdCArPSAqaXArKzsKKwkJCQkJCX0KKwkJCQkJCW1fcG9zIC09ICppcCsrID4+IDI7CisJCQkJCQltX3BvcyAtPSAqaXArKyA8PCA2OworCQkJCQkJaWYgKG1fcG9zID09IG9wKQorCQkJCQkJCWdvdG8gZW9mX2ZvdW5kOworCQkJCQkJbV9wb3MgLT0gMHg0MDAwOworCQkJCQl9CisJCQkJCWlmIChsaXRwID09IE5VTEwpCisJCQkJCQlnb3RvIGNvcHlfbTsKKworCQkJCQlubCA9IGlwWy0yXSAmIDM7CisJCQkJCS8qIHRlc3QgaWYgaW4gYmVldHdlZW4gdHdvIG1hdGNoZXMgKi8KKwkJCQkJaWYgKHQgPT0gMSAmJiBsaXQgPT0gMCAmJiBubCA9PSAwICYmIGlwWzBdID49IDE2KSB7CisJCQkJCQluZXh0X2xpdCA9IG5sOworCQkJCQkJLyogbWFrZSBhIHByZXZpb3VzIHNob3J0IHJ1biAqLworCQkJCQkJbGl0ICs9IDM7CisJCQkJCQkqbGl0cCA9ICh1bnNpZ25lZCBjaGFyKSgoKmxpdHAgJiB+MykgfCBsaXQpOworCQkJCQkJLyogY29weSBvdmVyIHRoZSAzIGxpdGVyYWxzIHRoYXQgcmVwbGFjZSB0aGUgbWF0Y2ggKi8KKwkJCQkJCWNvcHkzKGlwLTMsbV9wb3MscGQob3AsbV9wb3MpKTsKKwkJCQkJCW9fbTNfYSsrOworCQkJCQl9CisJCQkJCS8qIHRlc3QgaWYgYSBsaXRlcmFsIHJ1biBmb2xsb3dzICovCisJCQkJCWVsc2UgaWYgKHQgPT0gMSAmJiBsaXQgPD0gMyAmJiBubCA9PSAwCisJCQkJCSAmJiBpcFswXSA8IDE2ICYmIGlwWzBdICE9IDAgJiYgKGxpdCArIDMgKyBpcFswXSA8IDE2KQorCQkJCQkpIHsKKwkJCQkJCXQgPSAqaXArKzsKKwkJCQkJCS8qIHJlbW92ZSBzaG9ydCBydW4gKi8KKwkJCQkJCSpsaXRwICY9IH4zOworCQkJCQkJLyogY29weSBvdmVyIHRoZSAzIGxpdGVyYWxzIHRoYXQgcmVwbGFjZSB0aGUgbWF0Y2ggKi8KKwkJCQkJCWNvcHkzKGlwLTQrMSxtX3BvcyxwZChvcCxtX3BvcykpOworCQkJCQkJLyogbW92ZSBsaXRlcmFscyAxIGJ5dGUgYWhlYWQgKi8KKwkJCQkJCWxpdHAgKz0gMjsKKwkJCQkJCWlmIChsaXQgPiAwKQorCQkJCQkJCW1lbW1vdmUobGl0cCsxLGxpdHAsbGl0KTsKKwkJCQkJCS8qIGluc2VydCBuZXcgbGVuZ3RoIG9mIGxvbmcgbGl0ZXJhbCBydW4gKi8KKwkJCQkJCWxpdCArPSAzICsgdCArIDM7CisJCQkJCQkqbGl0cCA9ICh1bnNpZ25lZCBjaGFyKShsaXQgLSAzKTsKKworCQkJCQkJb19tM19iKys7CisJCQkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCQlnb3RvIGNvcHlfbGl0ZXJhbF9ydW47CisJCQkJCX0KKwkJCQl9CisgY29weV9tOgorCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQlkbyAqb3ArKyA9ICptX3BvcysrOyB3aGlsZSAoLS10ID4gMCk7CisJCQl9CisKKyBtYXRjaF9kb25lOgorCQkJaWYgKG5leHRfbGl0ID09IE5PX0xJVCkgeworCQkJCXQgPSBpcFstMl0gJiAzOworCQkJCWxpdCA9IHQ7CisJCQkJbGl0cCA9IGlwIC0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCQl0ID0gbmV4dF9saXQ7CisJCQluZXh0X2xpdCA9IE5PX0xJVDsKKwkJCWlmICh0ID09IDApCisJCQkJYnJlYWs7CisJCQkvKiBjb3B5IGxpdGVyYWxzICovCisgbWF0Y2hfbmV4dDoKKwkJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJCXQgPSAqaXArKzsKKwkJfSB3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKTsKKwl9CisKKwkvKiBubyBFT0YgY29kZSB3YXMgZm91bmQgKi8KKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiBMWk9fRV9FT0ZfTk9UX0ZPVU5EOworCisgZW9mX2ZvdW5kOgorLy8JICBMWk9fVU5VU0VEKG9fbTFfYSk7IExaT19VTlVTRUQob19tMV9iKTsgTFpPX1VOVVNFRChvX20yKTsKKy8vCSAgTFpPX1VOVVNFRChvX20zX2EpOyBMWk9fVU5VU0VEKG9fbTNfYik7CisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gKGlwID09IGlwX2VuZCA/IExaT19FX09LIDoKKwkJICAgKGlwIDwgaXBfZW5kCSA/IExaT19FX0lOUFVUX05PVF9DT05TVU1FRCA6IExaT19FX0lOUFVUX09WRVJSVU4pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZfT1MgRl9PU19VTklYCisjZGVmaW5lIEZfQ1MgRl9DU19OQVRJVkUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFETEVSMzJfSU5JVF9WQUxVRSAxCisjZGVmaW5lIENSQzMyX0lOSVRfVkFMVUUgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZW51bSB7CisJTV9MWk8xWF8xICAgID0gMSwKKwlNX0xaTzFYXzFfMTUgPSAyLAorCU1fTFpPMVhfOTk5ICA9IDMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGhlYWRlciBmbGFncyAqLworI2RlZmluZSBGX0FETEVSMzJfRCAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgRl9BRExFUjMyX0MgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEZfSF9FWFRSQV9GSUVMRCAweDAwMDAwMDQwTAorI2RlZmluZSBGX0hfR01URElGRiAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgRl9DUkMzMl9EICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEZfQ1JDMzJfQyAgICAgICAweDAwMDAwMjAwTAorI2RlZmluZSBGX0hfRklMVEVSICAgICAgMHgwMDAwMDgwMEwKKyNkZWZpbmUgRl9IX0NSQzMyICAgICAgIDB4MDAwMDEwMDBMCisjZGVmaW5lIEZfTUFTSyAgICAgICAgICAweDAwMDAzRkZGTAorCisvKiBvcGVyYXRpbmcgc3lzdGVtICYgZmlsZSBzeXN0ZW0gdGhhdCBjcmVhdGVkIHRoZSBmaWxlIFttb3N0bHkgdW51c2VkXSAqLworI2RlZmluZSBGX09TX1VOSVggICAgICAgMHgwMzAwMDAwMEwKKyNkZWZpbmUgRl9PU19TSElGVCAgICAgIDI0CisjZGVmaW5lIEZfT1NfTUFTSyAgICAgICAweGZmMDAwMDAwTAorCisvKiBjaGFyYWN0ZXIgc2V0IGZvciBmaWxlIG5hbWUgZW5jb2RpbmcgW21vc3RseSB1bnVzZWRdICovCisjZGVmaW5lIEZfQ1NfTkFUSVZFICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBGX0NTX1NISUZUICAgICAgMjAKKyNkZWZpbmUgRl9DU19NQVNLICAgICAgIDB4MDBmMDAwMDBMCisKKy8qIHRoZXNlIGJpdHMgbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lIEZfUkVTRVJWRUQgICAgICAoKEZfTUFTSyB8IEZfT1NfTUFTSyB8IEZfQ1NfTUFTSykgXiAweGZmZmZmZmZmTCkKKwordHlwZWRlZiBzdHJ1Y3QgY2hrc3VtX3QgeworCXVpbnQzMl90IGZfYWRsZXIzMjsKKwl1aW50MzJfdCBmX2NyYzMyOworfSBjaGtzdW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgaGVhZGVyX3QgeworCXVuc2lnbmVkIHZlcnNpb247CisJdW5zaWduZWQgbGliX3ZlcnNpb247CisJdW5zaWduZWQgdmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdDsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IG10aW1lOworCXVpbnQzMl90IGdtdGRpZmY7CisJdWludDMyX3QgaGVhZGVyX2NoZWNrc3VtOworCisJdWludDMyX3QgZXh0cmFfZmllbGRfbGVuOworCXVpbnQzMl90IGV4dHJhX2ZpZWxkX2NoZWNrc3VtOworCisJdW5zaWduZWQgY2hhciBtZXRob2Q7CisJdW5zaWduZWQgY2hhciBsZXZlbDsKKworCS8qIGluZm8gKi8KKwljaGFyIG5hbWVbMjU1KzFdOworfSBoZWFkZXJfdDsKKworc3RydWN0IGdsb2JhbHMgeworCS8qY29uc3QgdWludDMyX3QgKmx6b19jcmMzMl90YWJsZTsqLworCWNoa3N1bV90IGNoa3N1bV9pbjsKKwljaGtzdW1fdCBjaGtzdW1fb3V0OworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorLy8jZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKy8vI2RlZmluZSBJTklUX0coKSBkbyB7CisvLwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsKKy8vfSB3aGlsZSAoMCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTFpPUF9WRVJTSU9OICAgICAgICAgICAgMHgxMDEwCisvLyNkZWZpbmUgTFpPUF9WRVJTSU9OX1NUUklORyAgICAgIjEuMDEiCisvLyNkZWZpbmUgTFpPUF9WRVJTSU9OX0RBVEUgICAgICAgIkFwciAyN3RoIDIwMDMiCisKKyNkZWZpbmUgT1BUSU9OX1NUUklORyAiY2Z2ZHQxMjM0NTY3ODlDRiIKKworZW51bSB7CisJT1BUX1NURE9VVCAgICAgID0gKDEgPDwgMCksCisJT1BUX0ZPUkNFICAgICAgID0gKDEgPDwgMSksCisJT1BUX1ZFUkJPU0UgICAgID0gKDEgPDwgMiksCisJT1BUX0RFQ09NUFJFU1MgID0gKDEgPDwgMyksCisJT1BUX1RFU1QgICAgICAgID0gKDEgPDwgNCksCisJT1BUXzEgICAgICAgICAgID0gKDEgPDwgNSksCisJT1BUXzIgICAgICAgICAgID0gKDEgPDwgNiksCisJT1BUXzMgICAgICAgICAgID0gKDEgPDwgNyksCisJT1BUXzQgICAgICAgICAgID0gKDEgPDwgOCksCisJT1BUXzUgICAgICAgICAgID0gKDEgPDwgOSksCisJT1BUXzYgICAgICAgICAgID0gKDEgPDwgMTApLAorCU9QVF83ODkgICAgICAgICA9ICg3IDw8IDExKSwKKwlPUFRfNyAgICAgICAgICAgPSAoMSA8PCAxMSksCisJT1BUXzggICAgICAgICAgID0gKDEgPDwgMTIpLAorCU9QVF9DICAgICAgICAgICA9ICgxIDw8IDE0KSwKKwlPUFRfRiAgICAgICAgICAgPSAoMSA8PCAxNSksCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGFkbGVyMzIgY2hlY2tzdW0KKy8vIGFkYXB0ZWQgZnJvbSBmcmVlIGNvZGUgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KKy8vIHNlZSBodHRwOi8vd3d3LnpsaWIub3JnLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRkFTVF9GVU5DIHVpbnQzMl90Citsem9fYWRsZXIzMih1aW50MzJfdCBhZGxlciwgY29uc3QgdWludDhfdCogYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJZW51bSB7CisJCUxaT19CQVNFID0gNjU1MjEsIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisJCS8qIE5NQVggaXMgdGhlIGxhcmdlc3QgbiBzdWNoIHRoYXQKKwkJICogMjU1bihuKzEpLzIgKyAobisxKShCQVNFLTEpIDw9IDJeMzItMSAqLworCQlMWk9fTk1BWCA9IDU1NTIsCisJfTsKKwl1aW50MzJfdCBzMSA9IGFkbGVyICYgMHhmZmZmOworCXVpbnQzMl90IHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKKwl1bnNpZ25lZCBrOworCisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCWsgPSBsZW4gPCBMWk9fTk1BWCA/ICh1bnNpZ25lZCkgbGVuIDogTFpPX05NQVg7CisJCWxlbiAtPSBrOworCQlpZiAoayAhPSAwKSBkbyB7CisJCQlzMSArPSAqYnVmKys7CisJCQlzMiArPSBzMTsKKwkJfSB3aGlsZSAoLS1rID4gMCk7CisJCXMxICU9IExaT19CQVNFOworCQlzMiAlPSBMWk9fQkFTRTsKKwl9CisJcmV0dXJuIChzMiA8PCAxNikgfCBzMTsKK30KKworc3RhdGljIEZBU1RfRlVOQyB1aW50MzJfdAorbHpvX2NyYzMyKHVpbnQzMl90IGMsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCS8vaWYgKGJ1ZiA9PSBOVUxMKSAtIGltcG9zc2libGUKKwkvLwlyZXR1cm4gMDsKKworCXJldHVybiB+Y3JjMzJfYmxvY2tfZW5kaWFuMCh+YywgYnVmLCBsZW4sIGdsb2JhbF9jcmMzMl90YWJsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdF9jaGtzdW0oY2hrc3VtX3QgKmN0KQoreworCWN0LT5mX2FkbGVyMzIgPSBBRExFUjMyX0lOSVRfVkFMVUU7CisJY3QtPmZfY3JjMzIgPSBDUkMzMl9JTklUX1ZBTFVFOworfQorCitzdGF0aWMgdm9pZCBhZGRfYnl0ZXNfdG9fY2hrc3VtKGNoa3N1bV90ICpjdCwgY29uc3Qgdm9pZCogYnVmLCBpbnQgY250KQoreworCS8qIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSB0d28gY2hlY2tzdW1zIGF0IG9uY2UsIGJlY2F1c2UgYXQgdGhlCisJICogYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIsIHdlIGRvbid0IGtub3cgeWV0IHdoaWNoIG9uZSB3ZSdsbAorCSAqIGV2ZW50dWFsbHkgbmVlZCAqLworCWN0LT5mX2FkbGVyMzIgPSBsem9fYWRsZXIzMihjdC0+Zl9hZGxlcjMyLCAoY29uc3QgdWludDhfdCopYnVmLCBjbnQpOworCWN0LT5mX2NyYzMyID0gbHpvX2NyYzMyKGN0LT5mX2NyYzMyLCAoY29uc3QgdWludDhfdCopYnVmLCBjbnQpOworfQorCitzdGF0aWMgdWludDMyX3QgY2hrc3VtX2dldHJlc3VsdChjaGtzdW1fdCAqY3QsIGNvbnN0IGhlYWRlcl90ICpoKQoreworCXJldHVybiAoaC0+ZmxhZ3MgJiBGX0hfQ1JDMzIpID8gY3QtPmZfY3JjMzIgOiBjdC0+Zl9hZGxlcjMyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MzJfdCByZWFkMzIodm9pZCkKK3sKKwl1aW50MzJfdCB2OworCXhyZWFkKDAsICZ2LCA0KTsKKwlyZXR1cm4gbnRvaGwodik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlMzIodWludDMyX3QgdikKK3sKKwl2ID0gaHRvbmwodik7CisJeHdyaXRlKDEsICZ2LCA0KTsKK30KKworc3RhdGljIHZvaWQgZl93cml0ZShjb25zdCB2b2lkKiBidWYsIGludCBjbnQpCit7CisJeHdyaXRlKDEsIGJ1ZiwgY250KTsKKwlhZGRfYnl0ZXNfdG9fY2hrc3VtKCZHLmNoa3N1bV9vdXQsIGJ1ZiwgY250KTsKK30KKworc3RhdGljIHZvaWQgZl9yZWFkKHZvaWQqIGJ1ZiwgaW50IGNudCkKK3sKKwl4cmVhZCgwLCBidWYsIGNudCk7CisJYWRkX2J5dGVzX3RvX2Noa3N1bSgmRy5jaGtzdW1faW4sIGJ1ZiwgY250KTsKK30KKworc3RhdGljIGludCBmX3JlYWQ4KHZvaWQpCit7CisJdWludDhfdCB2OworCWZfcmVhZCgmdiwgMSk7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkIGZfd3JpdGU4KHVpbnQ4X3QgdikKK3sKKwlmX3dyaXRlKCZ2LCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGZfcmVhZDE2KHZvaWQpCit7CisJdWludDE2X3QgdjsKKwlmX3JlYWQoJnYsIDIpOworCXJldHVybiBudG9ocyh2KTsKK30KKworc3RhdGljIHZvaWQgZl93cml0ZTE2KHVpbnQxNl90IHYpCit7CisJdiA9IGh0b25zKHYpOworCWZfd3JpdGUoJnYsIDIpOworfQorCitzdGF0aWMgdWludDMyX3QgZl9yZWFkMzIodm9pZCkKK3sKKwl1aW50MzJfdCB2OworCWZfcmVhZCgmdiwgNCk7CisJcmV0dXJuIG50b2hsKHYpOworfQorCitzdGF0aWMgdm9pZCBmX3dyaXRlMzIodWludDMyX3QgdikKK3sKKwl2ID0gaHRvbmwodik7CisJZl93cml0ZSgmdiwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBsem9fZ2V0X21ldGhvZChoZWFkZXJfdCAqaCkKK3sKKwkvKiBjaGVjayBtZXRob2QgKi8KKwlpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfMSkgeworCQlpZiAoaC0+bGV2ZWwgPT0gMCkKKwkJCWgtPmxldmVsID0gMzsKKwl9IGVsc2UgaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzFfMTUpIHsKKwkJaWYgKGgtPmxldmVsID09IDApCisJCQloLT5sZXZlbCA9IDE7CisJfSBlbHNlIGlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF85OTkpIHsKKwkJaWYgKGgtPmxldmVsID09IDApCisJCQloLT5sZXZlbCA9IDk7CisJfSBlbHNlCisJCXJldHVybiAtMTsJCS8qIG5vdCBhIExaTyBtZXRob2QgKi8KKworCS8qIGNoZWNrIGNvbXByZXNzaW9uIGxldmVsICovCisJaWYgKGgtPmxldmVsIDwgMSB8fCBoLT5sZXZlbCA+IDkpCisJCXJldHVybiAxNTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTFpPX0JMT0NLX1NJWkUJKDI1NiAqIDEwMjRsKQorI2RlZmluZSBNQVhfQkxPQ0tfU0laRQkoNjQgKiAxMDI0bCAqIDEwMjRsKQkvKiBETyBOT1QgQ0hBTkdFICovCisKKy8qIExaTyBtYXkgZXhwYW5kIHVuY29tcHJlc3NpYmxlIGRhdGEgYnkgYSBzbWFsbCBhbW91bnQgKi8KKyNkZWZpbmUgTUFYX0NPTVBSRVNTRURfU0laRSh4KQkoKHgpICsgKHgpIC8gMTYgKyA2NCArIDMpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gY29tcHJlc3MgYSBmaWxlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBOT0lOTElORSBzbWFsbGludCBsem9fY29tcHJlc3MoY29uc3QgaGVhZGVyX3QgKmgpCit7CisJdW5zaWduZWQgYmxvY2tfc2l6ZSA9IExaT19CTE9DS19TSVpFOworCWludCByID0gMDsgLyogTFpPX0VfT0sgKi8KKwl1aW50OF90ICpjb25zdCBiMSA9IHh6YWxsb2MoYmxvY2tfc2l6ZSk7CisJdWludDhfdCAqY29uc3QgYjIgPSB4emFsbG9jKE1BWF9DT01QUkVTU0VEX1NJWkUoYmxvY2tfc2l6ZSkpOworCXVuc2lnbmVkIHNyY19sZW4gPSAwLCBkc3RfbGVuID0gMDsKKwl1aW50MzJfdCBkX2FkbGVyMzIgPSBBRExFUjMyX0lOSVRfVkFMVUU7CisJdWludDMyX3QgZF9jcmMzMiA9IENSQzMyX0lOSVRfVkFMVUU7CisJaW50IGw7CisJc21hbGxpbnQgb2sgPSAxOworCXVpbnQ4X3QgKndya19tZW0gPSBOVUxMOworCisJaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzEpCisJCXdya19tZW0gPSB4emFsbG9jKExaTzFYXzFfTUVNX0NPTVBSRVNTKTsKKwllbHNlIGlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF8xXzE1KQorCQl3cmtfbWVtID0geHphbGxvYyhMWk8xWF8xXzE1X01FTV9DT01QUkVTUyk7CisJZWxzZSBpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfOTk5KQorCQl3cmtfbWVtID0geHphbGxvYyhMWk8xWF85OTlfTUVNX0NPTVBSRVNTKTsKKworCWZvciAoOzspIHsKKwkJLyogcmVhZCBhIGJsb2NrICovCisJCWwgPSBmdWxsX3JlYWQoMCwgYjEsIGJsb2NrX3NpemUpOworCQlzcmNfbGVuID0gKGwgPiAwID8gbCA6IDApOworCisJCS8qIHdyaXRlIHVuY29tcHJlc3NlZCBibG9jayBzaXplICovCisJCXdyaXRlMzIoc3JjX2xlbik7CisKKwkJLyogZXhpdCBpZiBsYXN0IGJsb2NrICovCisJCWlmIChzcmNfbGVuID09IDApCisJCQlicmVhazsKKworCQkvKiBjb21wdXRlIGNoZWNrc3VtIG9mIHVuY29tcHJlc3NlZCBibG9jayAqLworCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfRCkKKwkJCWRfYWRsZXIzMiA9IGx6b19hZGxlcjMyKEFETEVSMzJfSU5JVF9WQUxVRSwgYjEsIHNyY19sZW4pOworCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0QpCisJCQlkX2NyYzMyID0gbHpvX2NyYzMyKENSQzMyX0lOSVRfVkFMVUUsIGIxLCBzcmNfbGVuKTsKKworCQkvKiBjb21wcmVzcyAqLworCQlpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfMSkKKwkJCXIgPSBsem8xeF8xX2NvbXByZXNzKGIxLCBzcmNfbGVuLCBiMiwgJmRzdF9sZW4sIHdya19tZW0pOworCQllbHNlIGlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF8xXzE1KQorCQkJciA9IGx6bzF4XzFfMTVfY29tcHJlc3MoYjEsIHNyY19sZW4sIGIyLCAmZHN0X2xlbiwgd3JrX21lbSk7CisjaWYgRU5BQkxFX0xaT1BfQ09NUFJfSElHSAorCQllbHNlIGlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF85OTkpCisJCQlyID0gbHpvMXhfOTk5X2NvbXByZXNzX2xldmVsKGIxLCBzcmNfbGVuLCBiMiwgJmRzdF9sZW4sCisJCQkJCQl3cmtfbWVtLCBoLT5sZXZlbCk7CisjZW5kaWYKKwkJZWxzZQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yIik7CisKKwkJaWYgKHIgIT0gMCkgLyogbm90IExaT19FX09LICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IgLSBjb21wcmVzc2lvbiBmYWlsZWQiKTsKKworCQkvKiB3cml0ZSBjb21wcmVzc2VkIGJsb2NrIHNpemUgKi8KKwkJaWYgKGRzdF9sZW4gPCBzcmNfbGVuKSB7CisJCQkvKiBvcHRpbWl6ZSAqLworCQkJaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzk5OSkgeworCQkJCXVuc2lnbmVkIG5ld19sZW4gPSBzcmNfbGVuOworCQkJCXIgPSBsem8xeF9vcHRpbWl6ZShiMiwgZHN0X2xlbiwgYjEsICZuZXdfbGVuLCBOVUxMKTsKKwkJCQlpZiAociAhPSAwIC8qTFpPX0VfT0sqLyB8fCBuZXdfbGVuICE9IHNyY19sZW4pCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciAtIG9wdGltaXphdGlvbiBmYWlsZWQiKTsKKwkJCX0KKwkJCXdyaXRlMzIoZHN0X2xlbik7CisJCX0gZWxzZSB7CisJCQkvKiBkYXRhIGFjdHVhbGx5IGV4cGFuZGVkID0+IHN0b3JlIGRhdGEgdW5jb21wcmVzc2VkICovCisJCQl3cml0ZTMyKHNyY19sZW4pOworCQl9CisKKwkJLyogd3JpdGUgY2hlY2tzdW0gb2YgdW5jb21wcmVzc2VkIGJsb2NrICovCisJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9EKQorCQkJd3JpdGUzMihkX2FkbGVyMzIpOworCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0QpCisJCQl3cml0ZTMyKGRfY3JjMzIpOworCisJCWlmIChkc3RfbGVuIDwgc3JjX2xlbikgeworCQkJLyogd3JpdGUgY2hlY2tzdW0gb2YgY29tcHJlc3NlZCBibG9jayAqLworCQkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0MpCisJCQkJd3JpdGUzMihsem9fYWRsZXIzMihBRExFUjMyX0lOSVRfVkFMVUUsIGIyLCBkc3RfbGVuKSk7CisJCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0MpCisJCQkJd3JpdGUzMihsem9fY3JjMzIoQ1JDMzJfSU5JVF9WQUxVRSwgYjIsIGRzdF9sZW4pKTsKKwkJCS8qIHdyaXRlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSAqLworCQkJeHdyaXRlKDEsIGIyLCBkc3RfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHdyaXRlIHVuY29tcHJlc3NlZCBibG9jayBkYXRhICovCisJCQl4d3JpdGUoMSwgYjEsIHNyY19sZW4pOworCQl9CisJfQorCisJZnJlZSh3cmtfbWVtKTsKKwlmcmVlKGIxKTsKKwlmcmVlKGIyKTsKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBGQVNUX0ZVTkMgdm9pZCBsem9fY2hlY2soCisJCXVpbnQzMl90IGluaXQsCisJCXVpbnQ4X3QqIGJ1ZiwgdW5zaWduZWQgbGVuLAorCQl1aW50MzJfdCBGQVNUX0ZVTkMgKCpmbikodWludDMyX3QsIGNvbnN0IHVpbnQ4X3QqLCB1bnNpZ25lZCksCisJCXVpbnQzMl90IHJlZikKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uLCBieSBoYXZpbmcgdGhlIHNhbWUgb3JkZXIgb2YgcGFyYW1ldGVycworCSAqIGFzIGZuLCBhbmQgYnkgYmVpbmcgbWFya2VkIEZBU1RfRlVOQyAoc2FtZSBhcyBmbiksCisJICogc2F2ZXMgYSBkb3plbiBieXRlcyBvZiBjb2RlLgorCSAqLworCXVpbnQzMl90IGMgPSBmbihpbml0LCBidWYsIGxlbik7CisJaWYgKGMgIT0gcmVmKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2hlY2tzdW0gZXJyb3IiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBkZWNvbXByZXNzIGEgZmlsZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTk9JTkxJTkUgc21hbGxpbnQgbHpvX2RlY29tcHJlc3MoY29uc3QgaGVhZGVyX3QgKmgpCit7CisJdW5zaWduZWQgYmxvY2tfc2l6ZSA9IExaT19CTE9DS19TSVpFOworCWludCByOworCXVpbnQzMl90IHNyY19sZW4sIGRzdF9sZW47CisJdWludDMyX3QgY19hZGxlcjMyID0gQURMRVIzMl9JTklUX1ZBTFVFOworCXVpbnQzMl90IGRfYWRsZXIzMiA9IEFETEVSMzJfSU5JVF9WQUxVRTsKKwl1aW50MzJfdCBjX2NyYzMyID0gQ1JDMzJfSU5JVF9WQUxVRSwgZF9jcmMzMiA9IENSQzMyX0lOSVRfVkFMVUU7CisJc21hbGxpbnQgb2sgPSAxOworCXVpbnQ4X3QgKmIxOworCXVpbnQzMl90IG1jc19ibG9ja19zaXplID0gTUFYX0NPTVBSRVNTRURfU0laRShibG9ja19zaXplKTsKKwl1aW50OF90ICpiMiA9IE5VTEw7CisKKwlmb3IgKDs7KSB7CisJCXVpbnQ4X3QgKmRzdDsKKworCQkvKiByZWFkIHVuY29tcHJlc3NlZCBibG9jayBzaXplICovCisJCWRzdF9sZW4gPSByZWFkMzIoKTsKKworCQkvKiBleGl0IGlmIGxhc3QgYmxvY2sgKi8KKwkJaWYgKGRzdF9sZW4gPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIGVycm9yIGlmIHNwbGl0IGZpbGUgKi8KKwkJaWYgKGRzdF9sZW4gPT0gMHhmZmZmZmZmZkwpCisJCQkvKiBzaG91bGQgbm90IGhhcHBlbiAtIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0aGlzIGZpbGUgaXMgYSBzcGxpdCBsem9wIGZpbGUiKTsKKworCQlpZiAoZHN0X2xlbiA+IE1BWF9CTE9DS19TSVpFKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBkYXRhIik7CisKKwkJLyogcmVhZCBjb21wcmVzc2VkIGJsb2NrIHNpemUgKi8KKwkJc3JjX2xlbiA9IHJlYWQzMigpOworCQlpZiAoc3JjX2xlbiA8PSAwIHx8IHNyY19sZW4gPiBkc3RfbGVuKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBkYXRhIik7CisKKwkJaWYgKGRzdF9sZW4gPiBibG9ja19zaXplKSB7CisJCQlpZiAoYjIpIHsKKwkJCQlmcmVlKGIyKTsKKwkJCQliMiA9IE5VTEw7CisJCQl9CisJCQlibG9ja19zaXplID0gZHN0X2xlbjsKKwkJCW1jc19ibG9ja19zaXplID0gTUFYX0NPTVBSRVNTRURfU0laRShibG9ja19zaXplKTsKKwkJfQorCisJCS8qIHJlYWQgY2hlY2tzdW0gb2YgdW5jb21wcmVzc2VkIGJsb2NrICovCisJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9EKQorCQkJZF9hZGxlcjMyID0gcmVhZDMyKCk7CisJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfRCkKKwkJCWRfY3JjMzIgPSByZWFkMzIoKTsKKworCQkvKiByZWFkIGNoZWNrc3VtIG9mIGNvbXByZXNzZWQgYmxvY2sgKi8KKwkJaWYgKHNyY19sZW4gPCBkc3RfbGVuKSB7CisJCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfQykKKwkJCQljX2FkbGVyMzIgPSByZWFkMzIoKTsKKwkJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfQykKKwkJCQljX2NyYzMyID0gcmVhZDMyKCk7CisJCX0KKworCQlpZiAoYjIgPT0gTlVMTCkKKwkJCWIyID0geHphbGxvYyhtY3NfYmxvY2tfc2l6ZSk7CisJCS8qIHJlYWQgdGhlIGJsb2NrIGludG8gdGhlIGVuZCBvZiBvdXIgYnVmZmVyICovCisJCWIxID0gYjIgKyBtY3NfYmxvY2tfc2l6ZSAtIHNyY19sZW47CisJCXhyZWFkKDAsIGIxLCBzcmNfbGVuKTsKKworCQlpZiAoc3JjX2xlbiA8IGRzdF9sZW4pIHsKKwkJCXVuc2lnbmVkIGQgPSBkc3RfbGVuOworCisJCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX0YpKSB7CisJCQkJLyogdmVyaWZ5IGNoZWNrc3VtIG9mIGNvbXByZXNzZWQgYmxvY2sgKi8KKwkJCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfQykKKwkJCQkJbHpvX2NoZWNrKEFETEVSMzJfSU5JVF9WQUxVRSwKKwkJCQkJCQliMSwgc3JjX2xlbiwKKwkJCQkJCQlsem9fYWRsZXIzMiwgY19hZGxlcjMyKTsKKwkJCQlpZiAoaC0+ZmxhZ3MgJiBGX0NSQzMyX0MpCisJCQkJCWx6b19jaGVjayhDUkMzMl9JTklUX1ZBTFVFLAorCQkJCQkJCWIxLCBzcmNfbGVuLAorCQkJCQkJCWx6b19jcmMzMiwgY19jcmMzMik7CisJCQl9CisKKwkJCS8qIGRlY29tcHJlc3MgKi8KKy8vCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfRikKKy8vCQkJCXIgPSBsem8xeF9kZWNvbXByZXNzKGIxLCBzcmNfbGVuLCBiMiwgJmQsIE5VTEwpOworLy8JCQllbHNlCisJCQkJciA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShiMSwgc3JjX2xlbiwgYjIsICZkLCBOVUxMKTsKKworCQkJaWYgKHIgIT0gMCAvKkxaT19FX09LKi8gfHwgZHN0X2xlbiAhPSBkKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBkYXRhIik7CisJCQl9CisJCQlkc3QgPSBiMjsKKwkJfSBlbHNlIHsKKwkJCS8qICJzdG9yZWQiIGJsb2NrID0+IG5vIGRlY29tcHJlc3Npb24gKi8KKwkJCWRzdCA9IGIxOworCQl9CisKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9GKSkgeworCQkJLyogdmVyaWZ5IGNoZWNrc3VtIG9mIHVuY29tcHJlc3NlZCBibG9jayAqLworCQkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0QpCisJCQkJbHpvX2NoZWNrKEFETEVSMzJfSU5JVF9WQUxVRSwKKwkJCQkJZHN0LCBkc3RfbGVuLAorCQkJCQlsem9fYWRsZXIzMiwgZF9hZGxlcjMyKTsKKwkJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfRCkKKwkJCQlsem9fY2hlY2soQ1JDMzJfSU5JVF9WQUxVRSwKKwkJCQkJZHN0LCBkc3RfbGVuLAorCQkJCQlsem9fY3JjMzIsIGRfY3JjMzIpOworCQl9CisKKwkJLyogd3JpdGUgdW5jb21wcmVzc2VkIGJsb2NrIGRhdGEgKi8KKwkJeHdyaXRlKDEsIGRzdCwgZHN0X2xlbik7CisJfQorCisJZnJlZShiMik7CisJcmV0dXJuIG9rOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGx6b3AgZmlsZSBzaWduYXR1cmUgKHNoYW1lbGVzc2x5IGJvcnJvd2VkIGZyb20gUE5HKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhlIGZpcnN0IG5pbmUgYnl0ZXMgb2YgYSBsem9wIGZpbGUgYWx3YXlzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tCisgKiAoaGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgODkgIDRjICA1YSAgNGYgIDAwICAwZCAgMGEgIDFhICAwYQorICogKGRlY2ltYWwpICAgICAgICAgICAgICAgICAgICAgMTM3ICA3NiAgOTAgIDc5ICAgMCAgMTMgIDEwICAyNiAgMTAKKyAqIChDIG5vdGF0aW9uIC0gQVNDSUkpICAgICAgICAgXDIxMSAgIEwgICBaICAgTyAgXDAgIFxyICBcbiBcMDMyIFxuCisgKi8KKworLyogKHZkYSkgY29tcGFyaXNvbiB3aXRoIGx6b3AgdjEuMDJyYzEgKCJsem9wIC0xIDxGSUxFIiBjbWQpOgorICogT25seSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gaGVhZGVyOgorICogLTAwMDAwMDAwICA4OSA0YyA1YSA0ZiAwMCAwZCAwYSAxYSAwYSAxMCAyMCAyMCAyMCAwOSA0MCAwMgorICogKzAwMDAwMDAwICA4OSA0YyA1YSA0ZiAwMCAwZCAwYSAxYSAwYSAxMCAxMCAyMCAzMCAwOSA0MCAwMgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXiBeXl5eXgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBsaWJfdmVyc2lvbgorICogLTAwMDAwMDEwICAwMSAwMyAwMCAwMCAwZCAwMCAwMCA4MSBhNCA0OSBmNyBhNiAzZiAwMCAwMCAwMAorICogKzAwMDAwMDEwICAwMSAwMyAwMCAwMCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAorICogICAgICAgICAgICAgICBeXl5eXl5eXl5eXiBeXl5eXl5eXl5eXiBeXl5eXl5eXl5eXgorICogICAgICAgICAgICAgICBmbGFncyAgICAgICBtb2RlICAgICAgICBtdGltZQorICogLTAwMDAwMDIwICAwMCAwMCAyZCA2NyAwNCAxNyAwMCAwNCAwMCAwMCAwMCAwMyBlZCBlYyA5ZCA2ZAorICogKzAwMDAwMDIwICAwMCAwMCAxMCA1ZiAwMCBjMSAwMCAwNCAwMCAwMCAwMCAwMyBlZCBlYyA5ZCA2ZAorICogICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXgorICogICAgICAgICAgICAgICAgICBjaGtzdW1fb3V0CisgKiBUaGUgcmVzdCBpcyBpZGVudGljYWwuCisqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbHpvcF9tYWdpY1s5XSA9IHsKKwkweDg5LCAweDRjLCAweDVhLCAweDRmLCAweDAwLCAweDBkLCAweDBhLCAweDFhLCAweDBhCit9OworCisvKiBUaGlzIGNvZGluZyBpcyBkZXJpdmVkIGZyb20gQWxleGFuZGVyIExlaG1hbm4ncyBwbmdjaGVjayBjb2RlLiAqLworc3RhdGljIHZvaWQgY2hlY2tfbWFnaWModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1hZ2ljW3NpemVvZihsem9wX21hZ2ljKV07CisJeHJlYWQoMCwgbWFnaWMsIHNpemVvZihtYWdpYykpOworCWlmIChtZW1jbXAobWFnaWMsIGx6b3BfbWFnaWMsIHNpemVvZihsem9wX21hZ2ljKSkgIT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBtYWdpYyBudW1iZXIiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBsem9wIGZpbGUgaGVhZGVyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2hlYWRlcihjb25zdCBoZWFkZXJfdCAqaCkKK3sKKwlpbnQgbDsKKworCXh3cml0ZSgxLCBsem9wX21hZ2ljLCBzaXplb2YobHpvcF9tYWdpYykpOworCisJaW5pdF9jaGtzdW0oJkcuY2hrc3VtX291dCk7CisKKwlmX3dyaXRlMTYoaC0+dmVyc2lvbik7CisJZl93cml0ZTE2KGgtPmxpYl92ZXJzaW9uKTsKKwlmX3dyaXRlMTYoaC0+dmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdCk7CisJZl93cml0ZTgoaC0+bWV0aG9kKTsKKwlmX3dyaXRlOChoLT5sZXZlbCk7CisJZl93cml0ZTMyKGgtPmZsYWdzKTsKKwlmX3dyaXRlMzIoaC0+bW9kZSk7CisJZl93cml0ZTMyKGgtPm10aW1lKTsKKwlmX3dyaXRlMzIoaC0+Z210ZGlmZik7CisKKwlsID0gKGludCkgc3RybGVuKGgtPm5hbWUpOworCWZfd3JpdGU4KGwpOworCWlmIChsKQorCQlmX3dyaXRlKGgtPm5hbWUsIGwpOworCisJZl93cml0ZTMyKGNoa3N1bV9nZXRyZXN1bHQoJkcuY2hrc3VtX291dCwgaCkpOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKGhlYWRlcl90ICpoKQoreworCWludCByOworCWludCBsOworCXVpbnQzMl90IGNoZWNrc3VtOworCisJbWVtc2V0KGgsIDAsIHNpemVvZigqaCkpOworCWgtPnZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3QgPSAweDA5MDA7CS8qIGZpcnN0IGx6b3AgdmVyc2lvbiAqLworCWgtPmxldmVsID0gMDsKKworCWluaXRfY2hrc3VtKCZHLmNoa3N1bV9pbik7CisKKwloLT52ZXJzaW9uID0gZl9yZWFkMTYoKTsKKwlpZiAoaC0+dmVyc2lvbiA8IDB4MDkwMCkKKwkJcmV0dXJuIDM7CisJaC0+bGliX3ZlcnNpb24gPSBmX3JlYWQxNigpOworCWlmIChoLT52ZXJzaW9uID49IDB4MDk0MCkgeworCQloLT52ZXJzaW9uX25lZWRlZF90b19leHRyYWN0ID0gZl9yZWFkMTYoKTsKKwkJaWYgKGgtPnZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3QgPiBMWk9QX1ZFUlNJT04pCisJCQlyZXR1cm4gMTY7CisJCWlmIChoLT52ZXJzaW9uX25lZWRlZF90b19leHRyYWN0IDwgMHgwOTAwKQorCQkJcmV0dXJuIDM7CisJfQorCWgtPm1ldGhvZCA9IGZfcmVhZDgoKTsKKwlpZiAoaC0+dmVyc2lvbiA+PSAweDA5NDApCisJCWgtPmxldmVsID0gZl9yZWFkOCgpOworCWgtPmZsYWdzID0gZl9yZWFkMzIoKTsKKwlpZiAoaC0+ZmxhZ3MgJiBGX0hfRklMVEVSKQorCQlyZXR1cm4gMTY7IC8qIGZpbHRlciBub3Qgc3VwcG9ydGVkICovCisJaC0+bW9kZSA9IGZfcmVhZDMyKCk7CisJaC0+bXRpbWUgPSBmX3JlYWQzMigpOworCWlmIChoLT52ZXJzaW9uID49IDB4MDk0MCkKKwkJaC0+Z210ZGlmZiA9IGZfcmVhZDMyKCk7CisKKwlsID0gZl9yZWFkOCgpOworCWlmIChsID4gMCkKKwkJZl9yZWFkKGgtPm5hbWUsIGwpOworCWgtPm5hbWVbbF0gPSAwOworCisJY2hlY2tzdW0gPSBjaGtzdW1fZ2V0cmVzdWx0KCZHLmNoa3N1bV9pbiwgaCk7CisJaC0+aGVhZGVyX2NoZWNrc3VtID0gZl9yZWFkMzIoKTsKKwlpZiAoaC0+aGVhZGVyX2NoZWNrc3VtICE9IGNoZWNrc3VtKQorCQlyZXR1cm4gMjsKKworCWlmIChoLT5tZXRob2QgPD0gMCkKKwkJcmV0dXJuIDE0OworCXIgPSBsem9fZ2V0X21ldGhvZChoKTsKKwlpZiAociAhPSAwKQorCQlyZXR1cm4gcjsKKworCS8qIGNoZWNrIHJlc2VydmVkIGZsYWdzICovCisJaWYgKGgtPmZsYWdzICYgRl9SRVNFUlZFRCkKKwkJcmV0dXJuIC0xMzsKKworCS8qIHNraXAgZXh0cmEgZmllbGQgW25vdCB1c2VkIHlldF0gKi8KKwlpZiAoaC0+ZmxhZ3MgJiBGX0hfRVhUUkFfRklFTEQpIHsKKwkJdWludDMyX3QgazsKKworCQkvKiBub3RlOiB0aGUgY2hlY2tzdW0gYWxzbyBjb3ZlcnMgdGhlIGxlbmd0aCAqLworCQlpbml0X2Noa3N1bSgmRy5jaGtzdW1faW4pOworCQloLT5leHRyYV9maWVsZF9sZW4gPSBmX3JlYWQzMigpOworCQlmb3IgKGsgPSAwOyBrIDwgaC0+ZXh0cmFfZmllbGRfbGVuOyBrKyspCisJCQlmX3JlYWQ4KCk7CisJCWNoZWNrc3VtID0gY2hrc3VtX2dldHJlc3VsdCgmRy5jaGtzdW1faW4sIGgpOworCQloLT5leHRyYV9maWVsZF9jaGVja3N1bSA9IGZfcmVhZDMyKCk7CisJCWlmIChoLT5leHRyYV9maWVsZF9jaGVja3N1bSAhPSBjaGVja3N1bSkKKwkJCXJldHVybiAzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwX2hlYWRlcihoZWFkZXJfdCAqaCkKK3sKKwlpbnQgcjsKKworCXIgPSByZWFkX2hlYWRlcihoKTsKKwlpZiAociA9PSAwKQorCQlyZXR1cm47CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImhlYWRlcl9lcnJvciAlZCIsIHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGNvbXByZXNzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGx6b19zZXRfbWV0aG9kKGhlYWRlcl90ICpoKQoreworCWludCBsZXZlbCA9IDE7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF8xKSB7CisJCWgtPm1ldGhvZCA9IE1fTFpPMVhfMV8xNTsKKwl9IGVsc2UgaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfNzg5KSB7CisjaWYgRU5BQkxFX0xaT1BfQ09NUFJfSElHSAorCQloLT5tZXRob2QgPSBNX0xaTzFYXzk5OTsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfNykKKwkJCWxldmVsID0gNzsKKwkJZWxzZSBpZiAob3B0aW9uX21hc2szMiAmIE9QVF84KQorCQkJbGV2ZWwgPSA4OworCQllbHNlCisJCQlsZXZlbCA9IDk7CisjZWxzZQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaGlnaCBjb21wcmVzc2lvbiBub3QgY29tcGlsZWQgaW4iKTsKKyNlbmRpZgorCX0gZWxzZSB7IC8qIGxldmVscyAyLi42IG9yIG5vbmUgKGRlZmF1bHRzIHRvIGxldmVsIDMpICovCisJCWgtPm1ldGhvZCA9IE1fTFpPMVhfMTsKKwkJbGV2ZWwgPSA1OyAvKiBsZXZlbHMgMi02IGFyZSBhY3R1YWxseSB0aGUgc2FtZSAqLworCX0KKworCWgtPmxldmVsID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBzbWFsbGludCBkb19sem9fY29tcHJlc3Modm9pZCkKK3sKKwloZWFkZXJfdCBoZWFkZXI7CisKKyNkZWZpbmUgaCAoJmhlYWRlcikKKwltZW1zZXQoaCwgMCwgc2l6ZW9mKCpoKSk7CisKKwlsem9fc2V0X21ldGhvZChoKTsKKworCWgtPnZlcnNpb24gPSAoTFpPUF9WRVJTSU9OICYgMHhmZmZmKTsKKwloLT52ZXJzaW9uX25lZWRlZF90b19leHRyYWN0ID0gMHgwOTQwOworCWgtPmxpYl92ZXJzaW9uID0gbHpvX3ZlcnNpb24oKSAmIDB4ZmZmZjsKKworCWgtPmZsYWdzID0gKEZfT1MgJiBGX09TX01BU0spIHwgKEZfQ1MgJiBGX0NTX01BU0spOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9GKSB8fCBoLT5tZXRob2QgPT0gTV9MWk8xWF85OTkpIHsKKwkJaC0+ZmxhZ3MgfD0gRl9BRExFUjMyX0Q7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0MpCisJCQloLT5mbGFncyB8PSBGX0FETEVSMzJfQzsKKwl9CisJd3JpdGVfaGVhZGVyKGgpOworCXJldHVybiBsem9fY29tcHJlc3MoaCk7CisjdW5kZWYgaAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGRlY29tcHJlc3MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHNtYWxsaW50IGRvX2x6b19kZWNvbXByZXNzKHZvaWQpCit7CisJaGVhZGVyX3QgaGVhZGVyOworCisJY2hlY2tfbWFnaWMoKTsKKwlwX2hlYWRlcigmaGVhZGVyKTsKKwlyZXR1cm4gbHpvX2RlY29tcHJlc3MoJmhlYWRlcik7Cit9CisKK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgbWFrZV9uZXdfbmFtZV9sem9wKGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQgVU5VU0VEX1BBUkFNKQoreworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0RFQ09NUFJFU1MpIHsKKwkJY2hhciAqZXh0ZW5zaW9uID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKwkJaWYgKCFleHRlbnNpb24gfHwgc3RyY21wKGV4dGVuc2lvbiArIDEsICJsem8iKSAhPSAwKQorCQkJcmV0dXJuIHhhc3ByaW50ZigiJXMub3V0IiwgZmlsZW5hbWUpOworCQkqZXh0ZW5zaW9uID0gJ1wwJzsKKwkJcmV0dXJuIGZpbGVuYW1lOworCX0KKwlyZXR1cm4geGFzcHJpbnRmKCIlcy5sem8iLCBmaWxlbmFtZSk7Cit9CisKK3N0YXRpYyBJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyBwYWNrX2x6b3AodW5wYWNrX2luZm9fdCAqaW5mbyBVTlVTRURfUEFSQU0pCit7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVDT01QUkVTUykKKwkJcmV0dXJuIGRvX2x6b19kZWNvbXByZXNzKCk7CisJcmV0dXJuIGRvX2x6b19jb21wcmVzcygpOworfQorCitpbnQgbHpvcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHpvcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUklORyk7CisJYXJndiArPSBvcHRpbmQ7CisJLyogbHpvcGNhdD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbNF0gPT0gJ2MnKQorCQlvcHRpb25fbWFzazMyIHw9IChPUFRfU1RET1VUIHwgT1BUX0RFQ09NUFJFU1MpOworCS8qIHVubHpvcD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ3UnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9ERUNPTVBSRVNTOworCisJZ2xvYmFsX2NyYzMyX3RhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIDApOworCXJldHVybiBiYnVucGFjayhhcmd2LCBwYWNrX2x6b3AsIG1ha2VfbmV3X25hbWVfbHpvcCwgLyp1bnVzZWQ6Ki8gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9ycG0uYyBiL2FyY2hpdmFsL3JwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzRmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9ycG0uYwpAQCAtMCwwICsxLDM5NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBycG0gYXBwbGV0IGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgYnkgTGF1cmVuY2UgQW5kZXJzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBycG1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1pIFBBQ0tBR0UucnBtOyBycG0gLXFwW2lsZGNdIFBBQ0tBR0UucnBtIgorLy91c2FnZTojZGVmaW5lIHJwbV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1hbmlwdWxhdGUgUlBNIHBhY2thZ2VzXG4iCisvL3VzYWdlOiAgICAgIlxuQ29tbWFuZHM6IgorLy91c2FnZTogICAgICJcbgktaQlJbnN0YWxsIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1xcAlRdWVyeSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktaQlTaG93IGluZm9ybWF0aW9uIgorLy91c2FnZTogICAgICJcbgktbAlMaXN0IGNvbnRlbnRzIgorLy91c2FnZTogICAgICJcbgktZAlMaXN0IGRvY3VtZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJTGlzdCBjb25maWcgZmlsZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKyNpbmNsdWRlICJycG0uaCIKKworI2RlZmluZSBSUE1fQ0hBUl9UWVBFICAgICAgICAgICAxCisjZGVmaW5lIFJQTV9JTlQ4X1RZUEUgICAgICAgICAgIDIKKyNkZWZpbmUgUlBNX0lOVDE2X1RZUEUgICAgICAgICAgMworI2RlZmluZSBSUE1fSU5UMzJfVFlQRSAgICAgICAgICA0CisvKiAjZGVmaW5lIFJQTV9JTlQ2NF9UWVBFICAgICAgIDUgICAtLS0tIFRoZXNlIGFyZW4ndCBzdXBwb3J0ZWQgKHlldCkgKi8KKyNkZWZpbmUgUlBNX1NUUklOR19UWVBFICAgICAgICAgNgorI2RlZmluZSBSUE1fQklOX1RZUEUgICAgICAgICAgICA3CisjZGVmaW5lIFJQTV9TVFJJTkdfQVJSQVlfVFlQRSAgIDgKKyNkZWZpbmUgUlBNX0kxOE5TVFJJTkdfVFlQRSAgICAgOQorCisjZGVmaW5lIFRBR19OQU1FICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgVEFHX1ZFUlNJT04gICAgICAgICAgICAgMTAwMQorI2RlZmluZSBUQUdfUkVMRUFTRSAgICAgICAgICAgICAxMDAyCisjZGVmaW5lIFRBR19TVU1NQVJZICAgICAgICAgICAgIDEwMDQKKyNkZWZpbmUgVEFHX0RFU0NSSVBUSU9OICAgICAgICAgMTAwNQorI2RlZmluZSBUQUdfQlVJTERUSU1FICAgICAgICAgICAxMDA2CisjZGVmaW5lIFRBR19CVUlMREhPU1QgICAgICAgICAgIDEwMDcKKyNkZWZpbmUgVEFHX1NJWkUgICAgICAgICAgICAgICAgMTAwOQorI2RlZmluZSBUQUdfVkVORE9SICAgICAgICAgICAgICAxMDExCisjZGVmaW5lIFRBR19MSUNFTlNFICAgICAgICAgICAgIDEwMTQKKyNkZWZpbmUgVEFHX1BBQ0tBR0VSICAgICAgICAgICAgMTAxNQorI2RlZmluZSBUQUdfR1JPVVAgICAgICAgICAgICAgICAxMDE2CisjZGVmaW5lIFRBR19VUkwgICAgICAgICAgICAgICAgIDEwMjAKKyNkZWZpbmUgVEFHX1BSRUlOICAgICAgICAgICAgICAgMTAyMworI2RlZmluZSBUQUdfUE9TVElOICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIFRBR19GSUxFRkxBR1MgICAgICAgICAgIDEwMzcKKyNkZWZpbmUgVEFHX0ZJTEVVU0VSTkFNRSAgICAgICAgMTAzOQorI2RlZmluZSBUQUdfRklMRUdST1VQTkFNRSAgICAgICAxMDQwCisjZGVmaW5lIFRBR19TT1VSQ0VSUE0gICAgICAgICAgIDEwNDQKKyNkZWZpbmUgVEFHX1BSRUlOUFJPRyAgICAgICAgICAgMTA4NQorI2RlZmluZSBUQUdfUE9TVElOUFJPRyAgICAgICAgICAxMDg2CisjZGVmaW5lIFRBR19QUkVGSVhTICAgICAgICAgICAgIDEwOTgKKyNkZWZpbmUgVEFHX0RJUklOREVYRVMgICAgICAgICAgMTExNgorI2RlZmluZSBUQUdfQkFTRU5BTUVTICAgICAgICAgICAxMTE3CisjZGVmaW5lIFRBR19ESVJOQU1FUyAgICAgICAgICAgIDExMTgKKworI2RlZmluZSBSUE1GSUxFX0NPTkZJRyAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBSUE1GSUxFX0RPQyAgICAgICAgICAgICAoMSA8PCAxKQorCitlbnVtIHJwbV9mdW5jdGlvbnNfZSB7CisJcnBtX3F1ZXJ5ID0gMSwKKwlycG1faW5zdGFsbCA9IDIsCisJcnBtX3F1ZXJ5X2luZm8gPSA0LAorCXJwbV9xdWVyeV9wYWNrYWdlID0gOCwKKwlycG1fcXVlcnlfbGlzdCA9IDE2LAorCXJwbV9xdWVyeV9saXN0X2RvYyA9IDMyLAorCXJwbV9xdWVyeV9saXN0X2NvbmZpZyA9IDY0Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdGFnOyAvKiA0IGJ5dGUgdGFnICovCisJdWludDMyX3QgdHlwZTsgLyogNCBieXRlIHR5cGUgKi8KKwl1aW50MzJfdCBvZmZzZXQ7IC8qIDQgYnl0ZSBvZmZzZXQgKi8KKwl1aW50MzJfdCBjb3VudDsgLyogNCBieXRlIGNvdW50ICovCit9IHJwbV9pbmRleDsKKworc3RhdGljIHZvaWQgKm1hcDsKK3N0YXRpYyBycG1faW5kZXggKipteXRhZ3M7CitzdGF0aWMgaW50IHRhZ2NvdW50OworCitzdGF0aWMgdm9pZCBleHRyYWN0X2NwaW8oaW50IGZkLCBjb25zdCBjaGFyICpzb3VyY2VfcnBtKTsKK3N0YXRpYyBycG1faW5kZXggKipycG1fZ2V0dGFncyhpbnQgZmQsIGludCAqbnVtX3RhZ3MpOworc3RhdGljIGludCBic2VhcmNoX3JwbXRhZyhjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKml0ZW0pOworc3RhdGljIGNoYXIgKnJwbV9nZXRzdHIoaW50IHRhZywgaW50IGl0ZW1pbmRleCk7CitzdGF0aWMgaW50IHJwbV9nZXRpbnQoaW50IHRhZywgaW50IGl0ZW1pbmRleCk7CitzdGF0aWMgaW50IHJwbV9nZXRjb3VudChpbnQgdGFnKTsKK3N0YXRpYyB2b2lkIGZpbGVhY3Rpb25fZG9iYWNrdXAoY2hhciAqZmlsZW5hbWUsIGludCBmaWxlcmVmKTsKK3N0YXRpYyB2b2lkIGZpbGVhY3Rpb25fc2V0b3duZ3JwKGNoYXIgKmZpbGVuYW1lLCBpbnQgZmlsZXJlZik7CitzdGF0aWMgdm9pZCBsb29wX3Rocm91Z2hfZmlsZXMoaW50IGZpbGV0YWcsIHZvaWQgKCpmaWxlYWN0aW9uKShjaGFyICpmaWxlbmFtZSwgaW50IGZpbGVyZWYpKTsKKworaW50IHJwbV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnBtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHQgPSAwLCBmdW5jID0gMCwgcnBtX2ZkLCBvZmZzZXQ7CisJY29uc3QgaW50IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpcXBsZGMiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnaSc6IC8qIEZpcnN0IGFyZzogSW5zdGFsbCBtb2RlLCB3aXRoIHE6IEluZm9ybWF0aW9uICovCisJCQlpZiAoIWZ1bmMpIGZ1bmMgPSBycG1faW5zdGFsbDsKKwkJCWVsc2UgZnVuYyB8PSBycG1fcXVlcnlfaW5mbzsKKwkJCWJyZWFrOworCQljYXNlICdxJzogLyogRmlyc3QgYXJnOiBRdWVyeSBtb2RlICovCisJCQlpZiAoZnVuYykgYmJfc2hvd191c2FnZSgpOworCQkJZnVuYyA9IHJwbV9xdWVyeTsKKwkJCWJyZWFrOworCQljYXNlICdwJzogLyogUXVlcnkgYSBwYWNrYWdlICovCisJCQlmdW5jIHw9IHJwbV9xdWVyeV9wYWNrYWdlOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOiAvKiBMaXN0IGZpbGVzIGluIGEgcGFja2FnZSAqLworCQkJZnVuYyB8PSBycG1fcXVlcnlfbGlzdDsKKwkJCWJyZWFrOworCQljYXNlICdkJzogLyogTGlzdCBkb2MgZmlsZXMgaW4gYSBwYWNrYWdlIChpbXBsaWVzIGxpc3QpICovCisJCQlmdW5jIHw9IHJwbV9xdWVyeV9saXN0OworCQkJZnVuYyB8PSBycG1fcXVlcnlfbGlzdF9kb2M7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6IC8qIExpc3QgY29uZmlnIGZpbGVzIGluIGEgcGFja2FnZSAoaW1wbGllcyBsaXN0KSAqLworCQkJZnVuYyB8PSBycG1fcXVlcnlfbGlzdDsKKwkJCWZ1bmMgfD0gcnBtX3F1ZXJ5X2xpc3RfY29uZmlnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisJYXJndiArPSBvcHRpbmQ7CisJLy9hcmdjIC09IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXdoaWxlICgqYXJndikgeworCQljb25zdCBjaGFyICpzb3VyY2VfcnBtOworCisJCXJwbV9mZCA9IHhvcGVuKCphcmd2KyssIE9fUkRPTkxZKTsKKwkJbXl0YWdzID0gcnBtX2dldHRhZ3MocnBtX2ZkLCAmdGFnY291bnQpOworCQlpZiAoIW15dGFncykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvciByZWFkaW5nIHJwbSBoZWFkZXIiKTsKKwkJb2Zmc2V0ID0geGxzZWVrKHJwbV9mZCwgMCwgU0VFS19DVVIpOworCQkvKiBNaW1pbXVtIGlzIG9uZSBwYWdlICovCisJCW1hcCA9IG1tYXAoMCwgb2Zmc2V0ID4gcGFnZXNpemUgPyAob2Zmc2V0ICsgb2Zmc2V0ICUgcGFnZXNpemUpIDogcGFnZXNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIHJwbV9mZCwgMCk7CisKKwkJc291cmNlX3JwbSA9IHJwbV9nZXRzdHIoVEFHX1NPVVJDRVJQTSwgMCk7CisKKwkJaWYgKGZ1bmMgJiBycG1faW5zdGFsbCkgeworCQkJLyogQmFja3VwIGFueSBjb25maWcgZmlsZXMgKi8KKwkJCWxvb3BfdGhyb3VnaF9maWxlcyhUQUdfQkFTRU5BTUVTLCBmaWxlYWN0aW9uX2RvYmFja3VwKTsKKwkJCS8qIEV4dGFjdCB0aGUgYXJjaGl2ZSAqLworCQkJZXh0cmFjdF9jcGlvKHJwbV9mZCwgc291cmNlX3JwbSk7CisJCQkvKiBTZXQgdGhlIGNvcnJlY3QgZmlsZSB1aWQvZ2lkJ3MgKi8KKwkJCWxvb3BfdGhyb3VnaF9maWxlcyhUQUdfQkFTRU5BTUVTLCBmaWxlYWN0aW9uX3NldG93bmdycCk7CisJCX0KKwkJZWxzZSBpZiAoKGZ1bmMgJiAocnBtX3F1ZXJ5fHJwbV9xdWVyeV9wYWNrYWdlKSkgPT0gKHJwbV9xdWVyeXxycG1fcXVlcnlfcGFja2FnZSkpIHsKKwkJCWlmICghKGZ1bmMgJiAocnBtX3F1ZXJ5X2luZm98cnBtX3F1ZXJ5X2xpc3QpKSkgeworCQkJCS8qIElmIGp1c3QgYSBzdHJhaWdodCBxdWVyeSwganVzdCBnaXZlIHBhY2thZ2UgbmFtZSAqLworCQkJCXByaW50ZigiJXMtJXMtJXNcbiIsIHJwbV9nZXRzdHIoVEFHX05BTUUsIDApLCBycG1fZ2V0c3RyKFRBR19WRVJTSU9OLCAwKSwgcnBtX2dldHN0cihUQUdfUkVMRUFTRSwgMCkpOworCQkJfQorCQkJaWYgKGZ1bmMgJiBycG1fcXVlcnlfaW5mbykgeworCQkJCS8qIERvIHRoZSBuaWNlIHByaW50b3V0ICovCisJCQkJdGltZV90IGJkYXRlX3RpbWU7CisJCQkJc3RydWN0IHRtICpiZGF0ZV9wdG07CisJCQkJY2hhciBiZGF0ZXN0cmluZ1s1MF07CisJCQkJY29uc3QgY2hhciAqcDsKKworCQkJCXAgPSBycG1fZ2V0c3RyKFRBR19QUkVGSVhTLCAwKTsKKwkJCQlpZiAoIXApIHAgPSAiKG5vdCByZWxvY2F0ZWFibGUpIjsKKwkJCQlwcmludGYoIk5hbWUgICAgICAgIDogJS0yOXNSZWxvY2F0aW9uczogJXNcbiIsIHJwbV9nZXRzdHIoVEFHX05BTUUsIDApLCBwKTsKKwkJCQlwID0gcnBtX2dldHN0cihUQUdfVkVORE9SLCAwKTsKKwkJCQlpZiAoIXApIHAgPSAiKG5vbmUpIjsKKwkJCQlwcmludGYoIlZlcnNpb24gICAgIDogJS0zNHNWZW5kb3I6ICVzXG4iLCBycG1fZ2V0c3RyKFRBR19WRVJTSU9OLCAwKSwgcCk7CisJCQkJYmRhdGVfdGltZSA9IHJwbV9nZXRpbnQoVEFHX0JVSUxEVElNRSwgMCk7CisJCQkJYmRhdGVfcHRtID0gbG9jYWx0aW1lKCZiZGF0ZV90aW1lKTsKKwkJCQlzdHJmdGltZShiZGF0ZXN0cmluZywgNTAsICIlYSAlZCAlYiAlWSAlVCAlWiIsIGJkYXRlX3B0bSk7CisJCQkJcHJpbnRmKCJSZWxlYXNlICAgICA6ICUtMzBzQnVpbGQgRGF0ZTogJXNcbiIsIHJwbV9nZXRzdHIoVEFHX1JFTEVBU0UsIDApLCBiZGF0ZXN0cmluZyk7CisJCQkJcHJpbnRmKCJJbnN0YWxsIGRhdGU6ICUtMzBzQnVpbGQgSG9zdDogJXNcbiIsICIobm90IGluc3RhbGxlZCkiLCBycG1fZ2V0c3RyKFRBR19CVUlMREhPU1QsIDApKTsKKwkJCQlwcmludGYoIkdyb3VwICAgICAgIDogJS0zMHNTb3VyY2UgUlBNOiAlc1xuIiwgcnBtX2dldHN0cihUQUdfR1JPVVAsIDApLCBzb3VyY2VfcnBtKTsKKwkJCQlwcmludGYoIlNpemUgICAgICAgIDogJS0zM2RMaWNlbnNlOiAlc1xuIiwgcnBtX2dldGludChUQUdfU0laRSwgMCksIHJwbV9nZXRzdHIoVEFHX0xJQ0VOU0UsIDApKTsKKwkJCQlwcmludGYoIlVSTCAgICAgICAgIDogJXNcbiIsIHJwbV9nZXRzdHIoVEFHX1VSTCwgMCkpOworCQkJCXByaW50ZigiU3VtbWFyeSAgICAgOiAlc1xuIiwgcnBtX2dldHN0cihUQUdfU1VNTUFSWSwgMCkpOworCQkJCXByaW50ZigiRGVzY3JpcHRpb24gOlxuJXNcbiIsIHJwbV9nZXRzdHIoVEFHX0RFU0NSSVBUSU9OLCAwKSk7CisJCQl9CisJCQlpZiAoZnVuYyAmIHJwbV9xdWVyeV9saXN0KSB7CisJCQkJaW50IGNvdW50LCBpdCwgZmxhZ3M7CisJCQkJY291bnQgPSBycG1fZ2V0Y291bnQoVEFHX0JBU0VOQU1FUyk7CisJCQkJZm9yIChpdCA9IDA7IGl0IDwgY291bnQ7IGl0KyspIHsKKwkJCQkJZmxhZ3MgPSBycG1fZ2V0aW50KFRBR19GSUxFRkxBR1MsIGl0KTsKKwkJCQkJc3dpdGNoIChmdW5jICYgKHJwbV9xdWVyeV9saXN0X2RvY3xycG1fcXVlcnlfbGlzdF9jb25maWcpKSB7CisJCQkJCWNhc2UgcnBtX3F1ZXJ5X2xpc3RfZG9jOgorCQkJCQkJaWYgKCEoZmxhZ3MgJiBSUE1GSUxFX0RPQykpIGNvbnRpbnVlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcnBtX3F1ZXJ5X2xpc3RfY29uZmlnOgorCQkJCQkJaWYgKCEoZmxhZ3MgJiBSUE1GSUxFX0NPTkZJRykpIGNvbnRpbnVlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcnBtX3F1ZXJ5X2xpc3RfZG9jfHJwbV9xdWVyeV9saXN0X2NvbmZpZzoKKwkJCQkJCWlmICghKGZsYWdzICYgKFJQTUZJTEVfQ09ORklHfFJQTUZJTEVfRE9DKSkpIGNvbnRpbnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcHJpbnRmKCIlcyVzXG4iLAorCQkJCQkJcnBtX2dldHN0cihUQUdfRElSTkFNRVMsIHJwbV9nZXRpbnQoVEFHX0RJUklOREVYRVMsIGl0KSksCisJCQkJCQlycG1fZ2V0c3RyKFRBR19CQVNFTkFNRVMsIGl0KSk7CisJCQkJfQorCQkJfQorCQl9CisJCWZyZWUobXl0YWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RfY3BpbyhpbnQgZmQsIGNvbnN0IGNoYXIgKnNvdXJjZV9ycG0pCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisKKwlpZiAoc291cmNlX3JwbSAhPSBOVUxMKSB7CisJCS8qIEJpbmFyeSBycG0gKGl0IHdhcyBidWlsdCBmcm9tIHNvbWUgU1JQTSksIGluc3RhbGwgdG8gcm9vdCAqLworCQl4Y2hkaXIoIi8iKTsKKwl9IC8qIGVsc2U6IFNSUE0sIGluc3RhbGwgdG8gY3VycmVudCBkaXIgKi8KKworCS8qIEluaXRpYWxpemUgKi8KKwlhcmNoaXZlX2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X3JlYWQ7CisJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKyNpZiAwIC8qIEZvciB0ZXN0aW5nIChycG0gLWkgb25seSBsaXN0cyB0aGUgZmlsZXMgaW4gaW50ZXJuYWwgY3Bpbyk6ICovCisJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPSBoZWFkZXJfbGlzdDsKKwlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX3NraXA7CisjZW5kaWYKKwlhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgPSBBUkNISVZFX1JFU1RPUkVfREFURSB8IEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUworCQkvKiBjb21wYXQ6IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcy4KKwkJICogdHJ5ICJycG0gLWkgZm9vLnNyYy5ycG0iIGZldyB0aW1lcyBpbiBhIHJvdyAtCisJCSAqIHN0YW5kYXJkIHJwbSB3aWxsIG5vdCBjb21wbGFpbi4KKwkJICogKFRPRE8/IHJlYWwgcnBtIGNyZWF0ZXMgImZpbGU7MTIzNCIgYW5kIHRoZW4gcmVuYW1lcyBpdCkgKi8KKwkJfCBBUkNISVZFX1VOTElOS19PTEQ7CisJYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCA9IGZkOworCS8qYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7IC0gaW5pdF9oYW5kbGUoKSBkaWQgaXQgKi8KKworCXNldHVwX3VuemlwX29uX2ZkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQgLyosIGZhaWxfaWZfbm90X2RldGVjdGVkOiAxKi8pOworCXdoaWxlIChnZXRfaGVhZGVyX2NwaW8oYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7Cit9CisKK3N0YXRpYyBycG1faW5kZXggKipycG1fZ2V0dGFncyhpbnQgZmQsIGludCAqbnVtX3RhZ3MpCit7CisJLyogV2Ugc2hvdWxkIG5ldmVyIG5lZWQgbW9yZSB0aGFuIDIwMCAoc2hyaW5rIHZpYSByZWFsbG9jIGxhdGVyKSAqLworCXJwbV9pbmRleCAqKnRhZ3MgPSB4emFsbG9jKDIwMCAqIHNpemVvZih0YWdzWzBdKSk7CisJaW50IHBhc3MsIHRhZ2luZGV4ID0gMDsKKworCXhsc2VlayhmZCwgOTYsIFNFRUtfQ1VSKTsgLyogU2VlayBwYXN0IHRoZSB1bnVzZWQgbGVhZCAqLworCisJLyogMXN0IHBhc3MgaXMgdGhlIHNpZ25hdHVyZSBoZWFkZXJzLCAybmQgaXMgdGhlIG1haW4gc3R1ZmYgKi8KKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCXN0cnVjdCBycG1faGVhZGVyIGhlYWRlcjsKKwkJcnBtX2luZGV4ICp0bXBpbmRleDsKKwkJaW50IHN0b3JlcG9zOworCisJCXhyZWFkKGZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisJCWlmIChoZWFkZXIubWFnaWNfYW5kX3ZlciAhPSBodG9ubChSUE1fSEVBREVSX01BR0lDblZFUikpCisJCQlyZXR1cm4gTlVMTDsgLyogSW52YWxpZCBtYWdpYywgb3Igbm90IHZlcnNpb24gMSAqLworCQloZWFkZXIuc2l6ZSA9IG50b2hsKGhlYWRlci5zaXplKTsKKwkJaGVhZGVyLmVudHJpZXMgPSBudG9obChoZWFkZXIuZW50cmllcyk7CisJCXN0b3JlcG9zID0geGxzZWVrKGZkLCAwLCBTRUVLX0NVUikgKyBoZWFkZXIuZW50cmllcyAqIDE2OworCisJCXdoaWxlIChoZWFkZXIuZW50cmllcy0tKSB7CisJCQl0bXBpbmRleCA9IHRhZ3NbdGFnaW5kZXgrK10gPSB4bWFsbG9jKHNpemVvZigqdG1waW5kZXgpKTsKKwkJCXhyZWFkKGZkLCB0bXBpbmRleCwgc2l6ZW9mKCp0bXBpbmRleCkpOworCQkJdG1waW5kZXgtPnRhZyA9IG50b2hsKHRtcGluZGV4LT50YWcpOworCQkJdG1waW5kZXgtPnR5cGUgPSBudG9obCh0bXBpbmRleC0+dHlwZSk7CisJCQl0bXBpbmRleC0+Y291bnQgPSBudG9obCh0bXBpbmRleC0+Y291bnQpOworCQkJdG1waW5kZXgtPm9mZnNldCA9IHN0b3JlcG9zICsgbnRvaGwodG1waW5kZXgtPm9mZnNldCk7CisJCQlpZiAocGFzcyA9PSAwKQorCQkJCXRtcGluZGV4LT50YWcgLT0gNzQzOworCQl9CisJCXN0b3JlcG9zID0geGxzZWVrKGZkLCBoZWFkZXIuc2l6ZSwgU0VFS19DVVIpOyAvKiBTZWVrIHBhc3Qgc3RvcmUgKi8KKwkJLyogU2tpcCBwYWRkaW5nIHRvIDggYnl0ZSBib3VuZGFyeSBhZnRlciByZWFkaW5nIHNpZ25hdHVyZSBoZWFkZXJzICovCisJCWlmIChwYXNzID09IDApCisJCQl4bHNlZWsoZmQsICgtc3RvcmVwb3MpICYgMHg3LCBTRUVLX0NVUik7CisJfQorCS8qIHJlYWxsb2MgdGFncyB0byBzYXZlIHNwYWNlICovCisJdGFncyA9IHhyZWFsbG9jKHRhZ3MsIHRhZ2luZGV4ICogc2l6ZW9mKHRhZ3NbMF0pKTsKKwkqbnVtX3RhZ3MgPSB0YWdpbmRleDsKKwkvKiBBbGwgZG9uZSwgbGVhdmUgdGhlIGZpbGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBnemlwcGVkIGNwaW8gYXJjaGl2ZSAqLworCXJldHVybiB0YWdzOworfQorCitzdGF0aWMgaW50IGJzZWFyY2hfcnBtdGFnKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqaXRlbSkKK3sKKwlpbnQgKnRhZyA9IChpbnQgKilrZXk7CisJcnBtX2luZGV4ICoqdG1wID0gKHJwbV9pbmRleCAqKikgaXRlbTsKKwlyZXR1cm4gKCp0YWcgLSB0bXBbMF0tPnRhZyk7Cit9CisKK3N0YXRpYyBpbnQgcnBtX2dldGNvdW50KGludCB0YWcpCit7CisJcnBtX2luZGV4ICoqZm91bmQ7CisJZm91bmQgPSBic2VhcmNoKCZ0YWcsIG15dGFncywgdGFnY291bnQsIHNpemVvZihzdHJ1Y3QgcnBtdGFnICopLCBic2VhcmNoX3JwbXRhZyk7CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGZvdW5kWzBdLT5jb3VudDsKK30KKworc3RhdGljIGNoYXIgKnJwbV9nZXRzdHIoaW50IHRhZywgaW50IGl0ZW1pbmRleCkKK3sKKwlycG1faW5kZXggKipmb3VuZDsKKwlmb3VuZCA9IGJzZWFyY2goJnRhZywgbXl0YWdzLCB0YWdjb3VudCwgc2l6ZW9mKHN0cnVjdCBycG10YWcgKiksIGJzZWFyY2hfcnBtdGFnKTsKKwlpZiAoIWZvdW5kIHx8IGl0ZW1pbmRleCA+PSBmb3VuZFswXS0+Y291bnQpCisJCXJldHVybiBOVUxMOworCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fU1RSSU5HX1RZUEUKKwkgfHwgZm91bmRbMF0tPnR5cGUgPT0gUlBNX0kxOE5TVFJJTkdfVFlQRQorCSB8fCBmb3VuZFswXS0+dHlwZSA9PSBSUE1fU1RSSU5HX0FSUkFZX1RZUEUKKwkpIHsKKwkJaW50IG47CisJCWNoYXIgKnRtcHN0ciA9IChjaGFyICopIG1hcCArIGZvdW5kWzBdLT5vZmZzZXQ7CisJCWZvciAobiA9IDA7IG4gPCBpdGVtaW5kZXg7IG4rKykKKwkJCXRtcHN0ciA9IHRtcHN0ciArIHN0cmxlbih0bXBzdHIpICsgMTsKKwkJcmV0dXJuIHRtcHN0cjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcnBtX2dldGludChpbnQgdGFnLCBpbnQgaXRlbWluZGV4KQoreworCXJwbV9pbmRleCAqKmZvdW5kOworCWludCAqdG1waW50OyAvKiBOQjogdXNpbmcgaW50OF90KiB3b3VsZCBiZSBlYXNpZXIgdG8gY29kZSAqLworCisJLyogZ2NjIHRocm93cyB3YXJuaW5ncyBoZXJlIHdoZW4gc2l6ZW9mKHZvaWQqKSE9c2l6ZW9mKGludCkgLi4uCisJICogaXQncyBvayB0byBpZ25vcmUgaXQgYmVjYXVzZSB0YWcgd29uJ3QgYmUgdXNlZCBhcyBhIHBvaW50ZXIgKi8KKwlmb3VuZCA9IGJzZWFyY2goJnRhZywgbXl0YWdzLCB0YWdjb3VudCwgc2l6ZW9mKHN0cnVjdCBycG10YWcgKiksIGJzZWFyY2hfcnBtdGFnKTsKKwlpZiAoIWZvdW5kIHx8IGl0ZW1pbmRleCA+PSBmb3VuZFswXS0+Y291bnQpCisJCXJldHVybiAtMTsKKworCXRtcGludCA9IChpbnQgKikgKChjaGFyICopIG1hcCArIGZvdW5kWzBdLT5vZmZzZXQpOworCisJaWYgKGZvdW5kWzBdLT50eXBlID09IFJQTV9JTlQzMl9UWVBFKSB7CisJCXRtcGludCA9IChpbnQgKikgKChjaGFyICopIHRtcGludCArIGl0ZW1pbmRleCo0KTsKKwkJLypyZXR1cm4gbnRvaGwoKnRtcGludCk7Ki8KKwkJLyogaW50IGNhbiBiZSAhPSBpbnQzMl90ICovCisJCXJldHVybiBudG9obCgqKGludDMyX3QqKXRtcGludCk7CisJfQorCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fSU5UMTZfVFlQRSkgeworCQl0bXBpbnQgPSAoaW50ICopICgoY2hhciAqKSB0bXBpbnQgKyBpdGVtaW5kZXgqMik7CisJCS8qID8/PyByZWFkIGludCwgYW5kIFRIRU4gbnRvaHMoKSBpdD8/ICovCisJCS8qcmV0dXJuIG50b2hzKCp0bXBpbnQpOyovCisJCXJldHVybiBudG9ocygqKGludDE2X3QqKXRtcGludCk7CisJfQorCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fSU5UOF9UWVBFKSB7CisJCXRtcGludCA9IChpbnQgKikgKChjaGFyICopIHRtcGludCArIGl0ZW1pbmRleCk7CisJCS8qID8/PyB3aHkgd2UgZG9uJ3QgcmVhZCBieXRlIGhlcmU/Pz8gKi8KKwkJLypyZXR1cm4gbnRvaHMoKnRtcGludCk7Ki8KKwkJcmV0dXJuICooaW50OF90Kil0bXBpbnQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZmlsZWFjdGlvbl9kb2JhY2t1cChjaGFyICpmaWxlbmFtZSwgaW50IGZpbGVyZWYpCit7CisJc3RydWN0IHN0YXQgb2xkZmlsZTsKKwlpbnQgc3RhdF9yZXM7CisJY2hhciAqbmV3bmFtZTsKKwlpZiAocnBtX2dldGludChUQUdfRklMRUZMQUdTLCBmaWxlcmVmKSAmIFJQTUZJTEVfQ09ORklHKSB7CisJCS8qIE9ubHkgbmVlZCB0byBiYWNrdXAgY29uZmlnIGZpbGVzICovCisJCXN0YXRfcmVzID0gbHN0YXQoZmlsZW5hbWUsICZvbGRmaWxlKTsKKwkJaWYgKHN0YXRfcmVzID09IDAgJiYgU19JU1JFRyhvbGRmaWxlLnN0X21vZGUpKSB7CisJCQkvKiBGaWxlIGFscmVhZHkgZXhpc3RzICAtIHJlYWxseSBzaG91bGQgY2hlY2sgTUQ1J3MgZXRjIHRvIHNlZSBpZiBkaWZmZXJlbnQgKi8KKwkJCW5ld25hbWUgPSB4YXNwcmludGYoIiVzLnJwbW9yaWciLCBmaWxlbmFtZSk7CisJCQljb3B5X2ZpbGUoZmlsZW5hbWUsIG5ld25hbWUsIEZJTEVVVElMU19SRUNVUiB8IEZJTEVVVElMU19QUkVTRVJWRV9TVEFUVVMpOworCQkJcmVtb3ZlX2ZpbGUoZmlsZW5hbWUsIEZJTEVVVElMU19SRUNVUiB8IEZJTEVVVElMU19GT1JDRSk7CisJCQlmcmVlKG5ld25hbWUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxlYWN0aW9uX3NldG93bmdycChjaGFyICpmaWxlbmFtZSwgaW50IGZpbGVyZWYpCit7CisJLyogcmVhbCBycG0gd2FybnM6ICJ1c2VyIGZvbyBkb2VzIG5vdCBleGlzdCAtIHVzaW5nIDx5b3U+IiAqLworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHduYW0ocnBtX2dldHN0cihUQUdfRklMRVVTRVJOQU1FLCBmaWxlcmVmKSk7CisJaW50IHVpZCA9IHB3ID8gcHctPnB3X3VpZCA6IGdldHVpZCgpOyAvKiBvciBldWlkPyAqLworCXN0cnVjdCBncm91cCAqZ3IgPSBnZXRncm5hbShycG1fZ2V0c3RyKFRBR19GSUxFR1JPVVBOQU1FLCBmaWxlcmVmKSk7CisJaW50IGdpZCA9IGdyID8gZ3ItPmdyX2dpZCA6IGdldGdpZCgpOworCWNob3duKGZpbGVuYW1lLCB1aWQsIGdpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvb3BfdGhyb3VnaF9maWxlcyhpbnQgZmlsZXRhZywgdm9pZCAoKmZpbGVhY3Rpb24pKGNoYXIgKmZpbGVuYW1lLCBpbnQgZmlsZXJlZikpCit7CisJaW50IGNvdW50ID0gMDsKKwl3aGlsZSAocnBtX2dldHN0cihmaWxldGFnLCBjb3VudCkpIHsKKwkJY2hhciogZmlsZW5hbWUgPSB4YXNwcmludGYoIiVzJXMiLAorCQkJcnBtX2dldHN0cihUQUdfRElSTkFNRVMsIHJwbV9nZXRpbnQoVEFHX0RJUklOREVYRVMsIGNvdW50KSksCisJCQlycG1fZ2V0c3RyKFRBR19CQVNFTkFNRVMsIGNvdW50KSk7CisJCWZpbGVhY3Rpb24oZmlsZW5hbWUsIGNvdW50KyspOworCQlmcmVlKGZpbGVuYW1lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9ycG0uaCBiL2FyY2hpdmFsL3JwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTJiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9ycG0uaApAQCAtMCwwICsxLDM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSUE0gc3RydWN0cyBhbmQgY29uc3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IExhdXJlbmNlIEFuZGVyc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBSUE0gZmlsZSBzdGFydHMgd2l0aCB0aGlzIHN0cnVjdDogKi8KK3N0cnVjdCBycG1fbGVhZCB7CisJdWludDMyX3QgbWFnaWM7CisJdWludDhfdCAgbWFqb3IsIG1pbm9yOworCXVpbnQxNl90IHR5cGU7CisJdWludDE2X3QgYXJjaG51bTsKKwljaGFyICAgICBuYW1lWzY2XTsKKwl1aW50MTZfdCBvc251bTsKKwl1aW50MTZfdCBzaWduYXR1cmVfdHlwZTsKKwljaGFyICAgICByZXNlcnZlZFsxNl07Cit9Oworc3RydWN0IEJVR19ycG1fbGVhZCB7CisJY2hhciBidWdbc2l6ZW9mKHN0cnVjdCBycG1fbGVhZCkgPT0gOTYgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgUlBNX0xFQURfTUFHSUMgICAgICAweGVkYWJlZWRiCisjZGVmaW5lIFJQTV9MRUFEX01BR0lDX1NUUiAgIlwzNTVcMjUzXDM1NlwzMzMiCisKKy8qIFRoZW4gZm9sbG93cyB0aGUgaGVhZGVyOiAqLworc3RydWN0IHJwbV9oZWFkZXIgeworCXVpbnQzMl90IG1hZ2ljX2FuZF92ZXI7IC8qIDMgYnl0ZSBtYWdpYzogMHg4ZSAweGFkIDB4ZTg7IDEgYnl0ZSB2ZXJzaW9uOiAweDAxICovCisJdWludDMyX3QgcmVzZXJ2ZWQ7ICAgICAgLyogNCBieXRlcyByZXNlcnZlZCAqLworCXVpbnQzMl90IGVudHJpZXM7ICAgICAgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIGhlYWRlciAoNCBieXRlcykgKi8KKwl1aW50MzJfdCBzaXplOyAgICAgICAgICAvKiBTaXplIG9mIHN0b3JlICg0IGJ5dGVzKSAqLworfTsKK3N0cnVjdCBCVUdfcnBtX2hlYWRlciB7CisJY2hhciBidWdbc2l6ZW9mKHN0cnVjdCBycG1faGVhZGVyKSA9PSAxNiA/IDEgOiAtMV07Cit9OworI2RlZmluZSBSUE1fSEVBREVSX01BR0lDblZFUiAgMHg4ZWFkZTgwMQorI2RlZmluZSBSUE1fSEVBREVSX01BR0lDX1NUUiAgIlwyMTZcMjU1XDM1MCIKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL3JwbTJjcGlvLmMgYi9hcmNoaXZhbC9ycG0yY3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGEwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9ycG0yY3Bpby5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJwbTJjcGlvIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IExhdXJlbmNlIEFuZGVyc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnBtMmNwaW9fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInBhY2thZ2UucnBtIgorLy91c2FnZTojZGVmaW5lIHJwbTJjcGlvX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiT3V0cHV0IGEgY3BpbyBhcmNoaXZlIG9mIHRoZSBycG0gZmlsZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2luY2x1ZGUgInJwbS5oIgorCitlbnVtIHsgcnBtX2ZkID0gU1RESU5fRklMRU5PIH07CisKK3N0YXRpYyB1bnNpZ25lZCBza2lwX2hlYWRlcih2b2lkKQoreworCXN0cnVjdCBycG1faGVhZGVyIGhlYWRlcjsKKwl1bnNpZ25lZCBsZW47CisKKwl4cmVhZChycG1fZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKy8vCWlmIChzdHJuY21wKChjaGFyICopICZoZWFkZXIubWFnaWMsIFJQTV9IRUFERVJfTUFHSUNfU1RSLCAzKSAhPSAwKSB7CisvLwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgUlBNIGhlYWRlciBtYWdpYyIpOworLy8JfQorLy8JaWYgKGhlYWRlci52ZXJzaW9uICE9IDEpIHsKKy8vCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5zdXBwb3J0ZWQgUlBNIGhlYWRlciB2ZXJzaW9uIik7CisvLwl9CisJaWYgKGhlYWRlci5tYWdpY19hbmRfdmVyICE9IGh0b25sKFJQTV9IRUFERVJfTUFHSUNuVkVSKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBSUE0gaGVhZGVyIG1hZ2ljIG9yIHVuc3VwcG9ydGVkIHZlcnNpb24iKTsKKwkJLy8gIjogJXggIT0gJXgiLCBoZWFkZXIubWFnaWNfYW5kX3ZlciwgaHRvbmwoUlBNX0hFQURFUl9NQUdJQ25WRVIpKTsKKwl9CisKKwkvKiBTZWVrIHBhc3QgaW5kZXggZW50cmllcywgYW5kIHBhc3Qgc3RvcmUgKi8KKwlsZW4gPSAxNiAqIG50b2hsKGhlYWRlci5lbnRyaWVzKSArIG50b2hsKGhlYWRlci5zaXplKTsKKwlzZWVrX2J5X2p1bXAocnBtX2ZkLCBsZW4pOworCisJcmV0dXJuIHNpemVvZihoZWFkZXIpICsgbGVuOworfQorCisvKiBObyBnZXRvcHQgcmVxdWlyZWQgKi8KK2ludCBycG0yY3Bpb19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnBtMmNwaW9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBycG1fbGVhZCBsZWFkOworCXVuc2lnbmVkIHBvczsKKworCWlmIChhcmd2WzFdKSB7CisJCXhtb3ZlX2ZkKHhvcGVuKGFyZ3ZbMV0sIE9fUkRPTkxZKSwgcnBtX2ZkKTsKKwl9CisJeHJlYWQocnBtX2ZkLCAmbGVhZCwgc2l6ZW9mKGxlYWQpKTsKKworCS8qIEp1c3QgY2hlY2sgdGhlIG1hZ2ljLCB0aGUgcmVzdCBpcyBpcnJlbGV2YW50ICovCisJaWYgKGxlYWQubWFnaWMgIT0gaHRvbmwoUlBNX0xFQURfTUFHSUMpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIFJQTSBtYWdpYyIpOworCX0KKworCS8qIFNraXAgdGhlIHNpZ25hdHVyZSBoZWFkZXIsIGFsaWduIHRvIDggYnl0ZXMgKi8KKwlwb3MgPSBza2lwX2hlYWRlcigpOworCXNlZWtfYnlfanVtcChycG1fZmQsICgtKGludClwb3MpICYgNyk7CisKKwkvKiBTa2lwIHRoZSBtYWluIGhlYWRlciAqLworCXNraXBfaGVhZGVyKCk7CisKKyNpZiAwCisJLyogVGhpcyB3b3JrcywgYnV0IGRvZXNuJ3QgcmVwb3J0IHVuY29tcHJlc3MgZXJyb3JzICh0aGV5IGhhcHBlbiBpbiBjaGlsZCkgKi8KKwlzZXR1cF91bnppcF9vbl9mZChycG1fZmQgLypmYWlsX2lmX25vdF9kZXRlY3RlZDogMSovKTsKKwlpZiAoYmJfY29weWZkX2VvZihycG1fZmQsIFNURE9VVF9GSUxFTk8pIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIHVucGFja2luZyIpOworI2Vsc2UKKwkvKiBCTE9BVCAqLworCXsKKwkJdW5pb24geworCQkJdWludDhfdCBiWzRdOworCQkJdWludDE2X3QgYjE2WzJdOworCQkJdWludDMyX3QgYjMyWzFdOworCQl9IG1hZ2ljOworCQlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnVucGFjaykoaW50IHNyY19mZCwgaW50IGRzdF9mZCk7CisKKwkJeHJlYWQocnBtX2ZkLCBtYWdpYy5iMTYsIHNpemVvZihtYWdpYy5iMTZbMF0pKTsKKwkJaWYgKG1hZ2ljLmIxNlswXSA9PSBHWklQX01BR0lDKSB7CisJCQl1bnBhY2sgPSB1bnBhY2tfZ3pfc3RyZWFtOworCQl9IGVsc2UKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCQkgJiYgbWFnaWMuYjE2WzBdID09IEJaSVAyX01BR0lDCisJCSkgeworCQkJdW5wYWNrID0gdW5wYWNrX2J6Ml9zdHJlYW07CisJCX0gZWxzZQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwkJICYmIG1hZ2ljLmIxNlswXSA9PSBYWl9NQUdJQzEKKwkJKSB7CisJCQl4cmVhZChycG1fZmQsIG1hZ2ljLmIzMiwgc2l6ZW9mKG1hZ2ljLmIzMlswXSkpOworCQkJaWYgKG1hZ2ljLmIzMlswXSAhPSBYWl9NQUdJQzIpCisJCQkJZ290byBub19tYWdpYzsKKwkJCS8qIHVucGFja194el9zdHJlYW0gd2FudHMgZmQgYXQgcG9zaXRpb24gNiwgbm8gbmVlZCB0byBzZWVrICovCisJCQkvL3hsc2VlayhycG1fZmQsIC02LCBTRUVLX0NVUik7CisJCQl1bnBhY2sgPSB1bnBhY2tfeHpfc3RyZWFtOworCQl9IGVsc2UgeworIG5vX21hZ2ljOgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIGd6aXAiCisJCQkJCUlGX0ZFQVRVUkVfU0VBTUxFU1NfQloyKCIvYnppcDIiKQorCQkJCQlJRl9GRUFUVVJFX1NFQU1MRVNTX1haKCIveHoiKQorCQkJCQkiIG1hZ2ljIik7CisJCX0KKwkJaWYgKHVucGFjayhycG1fZmQsIFNURE9VVF9GSUxFTk8pIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvciB1bnBhY2tpbmciKTsKKwl9CisjZW5kaWYKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShycG1fZmQpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvdGFyLmMgYi9hcmNoaXZhbC90YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzVlODM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvdGFyLmMKQEAgLTAsMCArMSwxMTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRhciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIE1vZGlmaWVkIHRvIHVzZSBjb21tb24gZXh0cmFjdGlvbiBjb2RlIHVzZWQgYnkgYXIsIGNwaW8sIGRwa2ctZGViLCBkcGtnCisgKiAgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIE5vdGUsIHRoYXQgYXMgb2YgQnVzeUJveC0wLjQzLCB0YXIgaGFzIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSB0aGUKKyAqIGdyb3VuZCB1cC4gIEl0IHN0aWxsIGhhcyByZW1uYW50cyBvZiB0aGUgb2xkIGNvZGUgbHlpbmcgYWJvdXQsIGJ1dCBpdCBpcworICogdmVyeSBkaWZmZXJlbnQgbm93IChpLmUuLCBjbGVhbmVyLCBsZXNzIGdsb2JhbCB2YXJpYWJsZXMsIGV0Yy4pCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIEJhc2VkIGluIHBhcnQgaW4gdGhlIHRhciBpbXBsZW1lbnRhdGlvbiBpbiBzYXNoCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBkaXN0cmlidXRlLCBvciBtb2RpZnkgdGhpcyBzb3VyY2UsCisgKiAgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgcmVtYWlucyBpbnRhY3QuCisgKiAgUGVybWlzc2lvbiB0byBkaXN0cmlidXRlIHNhc2ggZGVyaXZlZCBjb2RlIHVuZGVyIEdQTCBoYXMgYmVlbiBncmFudGVkLgorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gdGhlIHRhciBpbXBsZW1lbnRhdGlvbiBmcm9tIGJ1c3lib3gtMC4yOAorICogIENvcHlyaWdodCAoQykgMTk5NSBCcnVjZSBQZXJlbnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFRPRE86IHNlY3VyaXR5IHdpdGggLUMgREVTVERJUiBvcHRpb24gY2FuIGJlIGVuaGFuY2VkLgorICogQ29uc2lkZXIgdGFyIGZpbGUgY3JlYXRlZCB2aWE6CisgKiAkIHRhciBjdmYgYnVnLnRhciBhbnl0aGluZy50eHQKKyAqICQgbG4gLXMgL3RtcCBzeW1saW5rCisgKiAkIHRhciAtLWFwcGVuZCAtZiBidWcudGFyIHN5bWxpbmsKKyAqICQgcm0gc3ltbGluaworICogJCBta2RpciBzeW1saW5rCisgKiAkIHRhciAtLWFwcGVuZCAtZiBidWcudGFyIHN5bWxpbmsvZXZpbC5weQorICoKKyAqIFRoaXMgd2lsbCByZXN1bHQgaW4gYW4gYXJjaGl2ZSB3aGljaCBjb250YWluczoKKyAqICQgdGFyIC0tbGlzdCAtZiBidWcudGFyCisgKiBhbnl0aGluZy50eHQKKyAqIHN5bWxpbmsKKyAqIHN5bWxpbmsvZXZpbC5weQorICoKKyAqIFVudGFycmluZyBpdCBwdXRzIGV2aWwucHkgaW4gJy90bXAnIGV2ZW4gaWYgdGhlIC1DIERFU1RESVIgaXMgZ2l2ZW4uCisgKiBUaGlzIGRvZXNuJ3QgZmVlbCByaWdodCwgYW5kIElJUkMgR05VIHRhciBkb2Vzbid0IGRvIHRoYXQuCisgKi8KKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImFyY2hpdmUuaCIKKy8qIEZJWE1FOiBTdG9wIHVzaW5nIHRoaXMgbm9uLXN0YW5kYXJkIGZlYXR1cmUgKi8KKyNpZm5kZWYgRk5NX0xFQURJTkdfRElSCisjIGRlZmluZSBGTk1fTEVBRElOR19ESVIgMAorI2VuZGlmCisKKworLy8jZGVmaW5lIERCRyhmbXQsIC4uLikgYmJfZXJyb3JfbXNnKCIlczogIiBmbXQsIF9fZnVuY19fLCAjIyBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgREJHKC4uLikgKCh2b2lkKTApCisKKworI2RlZmluZSBibG9ja19idWYgYmJfY29tbW9uX2J1ZnNpejEKKworCisjaWYgIUVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daICYmICFFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKy8qIERvIG5vdCBwYXNzIGd6aXAgZmxhZyB0byB3cml0ZVRhckZpbGUoKSAqLworI2RlZmluZSB3cml0ZVRhckZpbGUodGFyX2ZkLCB2ZXJib3NlRmxhZywgZGVyZWZlcmVuY2VGbGFnLCBpbmNsdWRlLCBleGNsdWRlLCBnemlwKSBcCisJd3JpdGVUYXJGaWxlKHRhcl9mZCwgdmVyYm9zZUZsYWcsIGRlcmVmZXJlbmNlRmxhZywgaW5jbHVkZSwgZXhjbHVkZSkKKyNlbmRpZgorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfQ1JFQVRFCisKKy8qCisqKiB3cml0ZVRhckZpbGUoKSwgd3JpdGVGaWxlVG9UYXJiYWxsKCksIGFuZCB3cml0ZVRhckhlYWRlcigpIGFyZQorKiogdGhlIG9ubHkgZnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoIHRoZSBIYXJkTGlua0luZm8gc3RydWN0dXJlLgorKiogRXZlbiB0aGVzZSBmdW5jdGlvbnMgdXNlIHRoZSB4eHhIYXJkTGlua0luZm8oKSBmdW5jdGlvbnMuCisqLwordHlwZWRlZiBzdHJ1Y3QgSGFyZExpbmtJbmZvIHsKKwlzdHJ1Y3QgSGFyZExpbmtJbmZvICpuZXh0OyAvKiBOZXh0IGVudHJ5IGluIGxpc3QgKi8KKwlkZXZfdCBkZXY7ICAgICAgICAgICAgICAgICAvKiBEZXZpY2UgbnVtYmVyICovCisJaW5vX3QgaW5vOyAgICAgICAgICAgICAgICAgLyogSW5vZGUgbnVtYmVyICovCisvLwlzaG9ydCBsaW5rQ291bnQ7ICAgICAgICAgICAvKiAoSGFyZCkgTGluayBDb3VudCAqLworCWNoYXIgbmFtZVsxXTsgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIGZpbGVuYW1lIChtdXN0IGJlIGxhc3QpICovCit9IEhhcmRMaW5rSW5mbzsKKworLyogU29tZSBpbmZvIHRvIGJlIGNhcnJpZWQgYWxvbmcgd2hlbiBjcmVhdGluZyBhIG5ldyB0YXJiYWxsICovCit0eXBlZGVmIHN0cnVjdCBUYXJCYWxsSW5mbyB7CisJaW50IHRhckZkOyAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuLWZvci13cml0ZSBmaWxlIGRlc2NyaXB0b3IKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciB0aGUgdGFyYmFsbCAqLworCWludCB2ZXJib3NlRmxhZzsgICAgICAgICAgICAgICAgLyogV2hldGhlciB0byBwcmludCBleHRyYSBzdHVmZiBvciBub3QgKi8KKwljb25zdCBsbGlzdF90ICpleGNsdWRlTGlzdDsgICAgIC8qIExpc3Qgb2YgZmlsZXMgdG8gbm90IGluY2x1ZGUgKi8KKwlIYXJkTGlua0luZm8gKmhsSW5mb0hlYWQ7ICAgICAgIC8qIEhhcmQgTGluayBUcmFja2luZyBJbmZvcm1hdGlvbiAqLworCUhhcmRMaW5rSW5mbyAqaGxJbmZvOyAgICAgICAgICAgLyogSGFyZCBMaW5rIEluZm8gZm9yIHRoZSBjdXJyZW50IGZpbGUgKi8KKy8vVE9ETzogc2F2ZSBvbmx5IHN0X2RldiArIHN0X2lubworCXN0cnVjdCBzdGF0IHRhckZpbGVTdGF0QnVmOyAgICAgLyogU3RhdCBpbmZvIGZvciB0aGUgdGFyYmFsbCwgbGV0dGluZworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXMga25vdyB0aGUgaW5vZGUgYW5kIGRldmljZSB0aGF0IHRoZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGFyYmFsbCBsaXZlcywgc28gd2UgY2FuIGF2b2lkIHRyeWluZworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gaW5jbHVkZSB0aGUgdGFyYmFsbCBpbnRvIGl0c2VsZiAqLworfSBUYXJCYWxsSW5mbzsKKworLyogQSBuaWNlIGVudW0gd2l0aCBhbGwgdGhlIHBvc3NpYmxlIHRhciBmaWxlIGNvbnRlbnQgdHlwZXMgKi8KK2VudW0geworCVJFR1RZUEUgPSAnMCcsCQkvKiByZWd1bGFyIGZpbGUgKi8KKwlSRUdUWVBFMCA9ICdcMCcsCS8qIHJlZ3VsYXIgZmlsZSAoYW5jaWVudCBidWcgY29tcGF0KSAqLworCUxOS1RZUEUgPSAnMScsCQkvKiBoYXJkIGxpbmsgKi8KKwlTWU1UWVBFID0gJzInLAkJLyogc3ltYm9saWMgbGluayAqLworCUNIUlRZUEUgPSAnMycsCQkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworCUJMS1RZUEUgPSAnNCcsCQkvKiBibG9jayBzcGVjaWFsICovCisJRElSVFlQRSA9ICc1JywJCS8qIGRpcmVjdG9yeSAqLworCUZJRk9UWVBFID0gJzYnLAkJLyogRklGTyBzcGVjaWFsICovCisJQ09OVFRZUEUgPSAnNycsCQkvKiByZXNlcnZlZCAqLworCUdOVUxPTkdMSU5LID0gJ0snLAkvKiBHTlUgbG9uZyAoPjEwMCBjaGFycykgbGluayBuYW1lICovCisJR05VTE9OR05BTUUgPSAnTCcsCS8qIEdOVSBsb25nICg+MTAwIGNoYXJzKSBmaWxlIG5hbWUgKi8KK307CisKKy8qIE1pZ2h0IGJlIGZhc3RlciAoYW5kIGJpZ2dlcikgaWYgdGhlIGRldi9pbm8gd2VyZSBzdG9yZWQgaW4gbnVtZXJpYyBvcmRlcjspICovCitzdGF0aWMgdm9pZCBhZGRIYXJkTGlua0luZm8oSGFyZExpbmtJbmZvICoqaGxJbmZvSGVhZFB0ciwKKwkJCQkJc3RydWN0IHN0YXQgKnN0YXRidWYsCisJCQkJCWNvbnN0IGNoYXIgKmZpbGVOYW1lKQoreworCS8qIE5vdGU6IGhsSW5mb0hlYWRQdHIgY2FuIG5ldmVyIGJlIE5VTEwhICovCisJSGFyZExpbmtJbmZvICpobEluZm87CisKKwlobEluZm8gPSB4bWFsbG9jKHNpemVvZihIYXJkTGlua0luZm8pICsgc3RybGVuKGZpbGVOYW1lKSk7CisJaGxJbmZvLT5uZXh0ID0gKmhsSW5mb0hlYWRQdHI7CisJKmhsSW5mb0hlYWRQdHIgPSBobEluZm87CisJaGxJbmZvLT5kZXYgPSBzdGF0YnVmLT5zdF9kZXY7CisJaGxJbmZvLT5pbm8gPSBzdGF0YnVmLT5zdF9pbm87CisvLwlobEluZm8tPmxpbmtDb3VudCA9IHN0YXRidWYtPnN0X25saW5rOworCXN0cmNweShobEluZm8tPm5hbWUsIGZpbGVOYW1lKTsKK30KKworc3RhdGljIHZvaWQgZnJlZUhhcmRMaW5rSW5mbyhIYXJkTGlua0luZm8gKipobEluZm9IZWFkUHRyKQoreworCUhhcmRMaW5rSW5mbyAqaGxJbmZvOworCUhhcmRMaW5rSW5mbyAqaGxJbmZvTmV4dDsKKworCWlmIChobEluZm9IZWFkUHRyKSB7CisJCWhsSW5mbyA9ICpobEluZm9IZWFkUHRyOworCQl3aGlsZSAoaGxJbmZvKSB7CisJCQlobEluZm9OZXh0ID0gaGxJbmZvLT5uZXh0OworCQkJZnJlZShobEluZm8pOworCQkJaGxJbmZvID0gaGxJbmZvTmV4dDsKKwkJfQorCQkqaGxJbmZvSGVhZFB0ciA9IE5VTEw7CisJfQorfQorCisvKiBNaWdodCBiZSBmYXN0ZXIgKGFuZCBiaWdnZXIpIGlmIHRoZSBkZXYvaW5vIHdlcmUgc3RvcmVkIGluIG51bWVyaWMgb3JkZXIgOykgKi8KK3N0YXRpYyBIYXJkTGlua0luZm8gKmZpbmRIYXJkTGlua0luZm8oSGFyZExpbmtJbmZvICpobEluZm8sIHN0cnVjdCBzdGF0ICpzdGF0YnVmKQoreworCXdoaWxlIChobEluZm8pIHsKKwkJaWYgKHN0YXRidWYtPnN0X2lubyA9PSBobEluZm8tPmlubworCQkgJiYgc3RhdGJ1Zi0+c3RfZGV2ID09IGhsSW5mby0+ZGV2CisJCSkgeworCQkJREJHKCJmb3VuZCBoYXJkbGluazonJXMnIiwgaGxJbmZvLT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCWhsSW5mbyA9IGhsSW5mby0+bmV4dDsKKwl9CisJcmV0dXJuIGhsSW5mbzsKK30KKworLyogUHV0IGFuIG9jdGFsIHN0cmluZyBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogVGhlIG51bWJlciBpcyB6ZXJvIHBhZGRlZCBhbmQgcG9zc2libHkgbnVsbCB0ZXJtaW5hdGVkLgorICogU3RvcmVzIGxvdy1vcmRlciBiaXRzIG9ubHkgaWYgd2hvbGUgdmFsdWUgZG9lcyBub3QgZml0LiAqLworc3RhdGljIHZvaWQgcHV0T2N0YWwoY2hhciAqY3AsIGludCBsZW4sIG9mZl90IHZhbHVlKQoreworCWNoYXIgdGVtcEJ1ZmZlcltzaXplb2Yob2ZmX3QpKjMgKyAxXTsKKwljaGFyICp0ZW1wU3RyaW5nID0gdGVtcEJ1ZmZlcjsKKwlpbnQgd2lkdGg7CisKKwl3aWR0aCA9IHNwcmludGYodGVtcEJ1ZmZlciwgIiUwKiJPRkZfRk1UIm8iLCBsZW4sIHZhbHVlKTsKKwl0ZW1wU3RyaW5nICs9ICh3aWR0aCAtIGxlbik7CisKKwkvKiBJZiBzdHJpbmcgaGFzIGxlYWRpbmcgemVyb2VzLCB3ZSBjYW4gZHJvcCBvbmUgKi8KKwkvKiBhbmQgZmllbGQgd2lsbCBoYXZlIHRyYWlsaW5nICdcMCcgKi8KKwkvKiAoaW5jcmVhc2VzIGNoYW5jZXMgb2YgY29tcGF0IHdpdGggb3RoZXIgdGFycykgKi8KKwlpZiAodGVtcFN0cmluZ1swXSA9PSAnMCcpCisJCXRlbXBTdHJpbmcrKzsKKworCS8qIENvcHkgdGhlIHN0cmluZyB0byB0aGUgZmllbGQgKi8KKwltZW1jcHkoY3AsIHRlbXBTdHJpbmcsIGxlbik7Cit9CisjZGVmaW5lIFBVVF9PQ1RBTChhLCBiKSBwdXRPY3RhbCgoYSksIHNpemVvZihhKSwgKGIpKQorCitzdGF0aWMgdm9pZCBjaGtzdW1fYW5kX3h3cml0ZShpbnQgZmQsIHN0cnVjdCB0YXJfaGVhZGVyX3QqIGhwKQoreworCS8qIFBPU0lYIHNheXMgdGhhdCBjaGVja3N1bSBpcyBkb25lIG9uIHVuc2lnbmVkIGJ5dGVzCisJICogKFN1biBhbmQgSFAtVVggZ2V0cyBpdCB3cm9uZy4uLiBtb3JlIGRldGFpbHMgaW4KKwkgKiBHTlUgdGFyIHNvdXJjZSkgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcDsKKwlpbnQgY2hrc3VtLCBzaXplOworCisJc3RyY3B5KGhwLT5tYWdpYywgInVzdGFyICAiKTsKKworCS8qIENhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlIGNoZWNrc3VtIChpLmUuLCB0aGUgc3VtIG9mIGFsbCBvZiB0aGUgYnl0ZXMgb2YKKwkgKiB0aGUgaGVhZGVyKS4gIFRoZSBjaGVja3N1bSBmaWVsZCBtdXN0IGJlIGZpbGxlZCB3aXRoIGJsYW5rcyBmb3IgdGhlCisJICogY2FsY3VsYXRpb24uICBUaGUgY2hlY2tzdW0gZmllbGQgaXMgZm9ybWF0dGVkIGRpZmZlcmVudGx5IGZyb20gdGhlCisJICogb3RoZXIgZmllbGRzOiBpdCBoYXMgNiBkaWdpdHMsIGEgbnVsbCwgdGhlbiBhIHNwYWNlIC0tIHJhdGhlciB0aGFuCisJICogZGlnaXRzLCBmb2xsb3dlZCBieSBhIG51bGwgbGlrZSB0aGUgb3RoZXIgZmllbGRzLi4uICovCisJbWVtc2V0KGhwLT5jaGtzdW0sICcgJywgc2l6ZW9mKGhwLT5jaGtzdW0pKTsKKwljcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGhwOworCWNoa3N1bSA9IDA7CisJc2l6ZSA9IHNpemVvZigqaHApOworCWRvIHsgY2hrc3VtICs9ICpjcCsrOyB9IHdoaWxlICgtLXNpemUpOworCXB1dE9jdGFsKGhwLT5jaGtzdW0sIHNpemVvZihocC0+Y2hrc3VtKS0xLCBjaGtzdW0pOworCisJLyogTm93IHdyaXRlIHRoZSBoZWFkZXIgb3V0IHRvIGRpc2sgKi8KKwl4d3JpdGUoZmQsIGhwLCBzaXplb2YoKmhwKSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKK3N0YXRpYyB2b2lkIHdyaXRlTG9uZ25hbWUoaW50IGZkLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGRpcikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJY2hhciBtb2RlWzhdOyAgICAgICAgICAgICAvKiAxMDAtMTA3ICovCisJCWNoYXIgdWlkWzhdOyAgICAgICAgICAgICAgLyogMTA4LTExNSAqLworCQljaGFyIGdpZFs4XTsgICAgICAgICAgICAgIC8qIDExNi0xMjMgKi8KKwkJY2hhciBzaXplWzEyXTsgICAgICAgICAgICAvKiAxMjQtMTM1ICovCisJCWNoYXIgbXRpbWVbMTJdOyAgICAgICAgICAgLyogMTM2LTE0NyAqLworCX0gcHJlZmlsbGVkID0geworCQkiMDAwMDAwMCIsCisJCSIwMDAwMDAwIiwKKwkJIjAwMDAwMDAiLAorCQkiMDAwMDAwMDAwMDAiLAorCQkiMDAwMDAwMDAwMDAiLAorCX07CisJc3RydWN0IHRhcl9oZWFkZXJfdCBoZWFkZXI7CisJaW50IHNpemU7CisKKwlkaXIgPSAhIWRpcjsgLyogbm9ybWFsaXplOiAwLzEgKi8KKwlzaXplID0gc3RybGVuKG5hbWUpICsgMSArIGRpcjsgLyogR05VIHRhciB1c2VzIHN0cmxlbisxICovCisJLyogKyBkaXI6IGFjY291bnQgZm9yIHBvc3NpYmxlICcvJyAqLworCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwlzdHJjcHkoaGVhZGVyLm5hbWUsICIuLy4vQExvbmdMaW5rIik7CisJbWVtY3B5KGhlYWRlci5tb2RlLCBwcmVmaWxsZWQubW9kZSwgc2l6ZW9mKHByZWZpbGxlZCkpOworCVBVVF9PQ1RBTChoZWFkZXIuc2l6ZSwgc2l6ZSk7CisJaGVhZGVyLnR5cGVmbGFnID0gdHlwZTsKKwljaGtzdW1fYW5kX3h3cml0ZShmZCwgJmhlYWRlcik7CisKKwkvKiBXcml0ZSBmaWxlbmFtZVsvXSBhbmQgcGFkIHRoZSBibG9jay4gKi8KKwkvKiBkaXI9MDogd3JpdGVzICduYW1lPE5VTD4nLCBwYWRzICovCisJLyogZGlyPTE6IHdyaXRlcyAnbmFtZScsIHdyaXRlcyAnLzxOVUw+JywgcGFkcyAqLworCWRpciAqPSAyOworCXh3cml0ZShmZCwgbmFtZSwgc2l6ZSAtIGRpcik7CisJeHdyaXRlKGZkLCAiLyIsIGRpcik7CisJc2l6ZSA9ICgtc2l6ZSkgJiAoVEFSX0JMT0NLX1NJWkUtMSk7CisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemUpOworCXh3cml0ZShmZCwgJmhlYWRlciwgc2l6ZSk7Cit9CisjZW5kaWYKKworLyogV3JpdGUgb3V0IGEgdGFyIGhlYWRlciBmb3IgdGhlIHNwZWNpZmllZCBmaWxlL2RpcmVjdG9yeS93aGF0ZXZlciAqLworc3RhdGljIGludCB3cml0ZVRhckhlYWRlcihzdHJ1Y3QgVGFyQmFsbEluZm8gKnRiSW5mbywKKwkJY29uc3QgY2hhciAqaGVhZGVyX25hbWUsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZikKK3sKKwlzdHJ1Y3QgdGFyX2hlYWRlcl90IGhlYWRlcjsKKworCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisKKwlzdHJuY3B5KGhlYWRlci5uYW1lLCBoZWFkZXJfbmFtZSwgc2l6ZW9mKGhlYWRlci5uYW1lKSk7CisKKwkvKiBQT1NJWCBzYXlzIHRvIG1hc2sgbW9kZSB3aXRoIDA3Nzc3LiAqLworCVBVVF9PQ1RBTChoZWFkZXIubW9kZSwgc3RhdGJ1Zi0+c3RfbW9kZSAmIDA3Nzc3KTsKKwlQVVRfT0NUQUwoaGVhZGVyLnVpZCwgc3RhdGJ1Zi0+c3RfdWlkKTsKKwlQVVRfT0NUQUwoaGVhZGVyLmdpZCwgc3RhdGJ1Zi0+c3RfZ2lkKTsKKwltZW1zZXQoaGVhZGVyLnNpemUsICcwJywgc2l6ZW9mKGhlYWRlci5zaXplKS0xKTsgLyogUmVndWxhciBmaWxlIHNpemUgaXMgaGFuZGxlZCBsYXRlciAqLworCS8qIHVzZXJzIHJlcG9ydCB0aGF0IGZpbGVzIHdpdGggbmVnYXRpdmUgc3RfbXRpbWUgY2F1c2UgdHJvdWJsZSwgc286ICovCisJUFVUX09DVEFMKGhlYWRlci5tdGltZSwgc3RhdGJ1Zi0+c3RfbXRpbWUgPj0gMCA/IHN0YXRidWYtPnN0X210aW1lIDogMCk7CisKKwkvKiBFbnRlciB0aGUgdXNlciBhbmQgZ3JvdXAgbmFtZXMgKi8KKwlzYWZlX3N0cm5jcHkoaGVhZGVyLnVuYW1lLCBnZXRfY2FjaGVkX3VzZXJuYW1lKHN0YXRidWYtPnN0X3VpZCksIHNpemVvZihoZWFkZXIudW5hbWUpKTsKKwlzYWZlX3N0cm5jcHkoaGVhZGVyLmduYW1lLCBnZXRfY2FjaGVkX2dyb3VwbmFtZShzdGF0YnVmLT5zdF9naWQpLCBzaXplb2YoaGVhZGVyLmduYW1lKSk7CisKKwlpZiAodGJJbmZvLT5obEluZm8pIHsKKwkJLyogVGhpcyBpcyBhIGhhcmQgbGluayAqLworCQloZWFkZXIudHlwZWZsYWcgPSBMTktUWVBFOworCQlzdHJuY3B5KGhlYWRlci5saW5rbmFtZSwgdGJJbmZvLT5obEluZm8tPm5hbWUsCisJCQkJc2l6ZW9mKGhlYWRlci5saW5rbmFtZSkpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCQkvKiBXcml0ZSBvdXQgbG9uZyBsaW5rbmFtZSBpZiBuZWVkZWQgKi8KKwkJaWYgKGhlYWRlci5saW5rbmFtZVtzaXplb2YoaGVhZGVyLmxpbmtuYW1lKS0xXSkKKwkJCXdyaXRlTG9uZ25hbWUodGJJbmZvLT50YXJGZCwgR05VTE9OR0xJTkssCisJCQkJCXRiSW5mby0+aGxJbmZvLT5uYW1lLCAwKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoU19JU0xOSyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQljaGFyICpscGF0aCA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2FybihmaWxlTmFtZSk7CisJCWlmICghbHBhdGgpCisJCQlyZXR1cm4gRkFMU0U7CisJCWhlYWRlci50eXBlZmxhZyA9IFNZTVRZUEU7CisJCXN0cm5jcHkoaGVhZGVyLmxpbmtuYW1lLCBscGF0aCwgc2l6ZW9mKGhlYWRlci5saW5rbmFtZSkpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCQkvKiBXcml0ZSBvdXQgbG9uZyBsaW5rbmFtZSBpZiBuZWVkZWQgKi8KKwkJaWYgKGhlYWRlci5saW5rbmFtZVtzaXplb2YoaGVhZGVyLmxpbmtuYW1lKS0xXSkKKwkJCXdyaXRlTG9uZ25hbWUodGJJbmZvLT50YXJGZCwgR05VTE9OR0xJTkssIGxwYXRoLCAwKTsKKyNlbHNlCisJCS8qIElmIGl0IGlzIGxhcmdlciB0aGFuIDEwMCBieXRlcywgYmFpbCBvdXQgKi8KKwkJaWYgKGhlYWRlci5saW5rbmFtZVtzaXplb2YoaGVhZGVyLmxpbmtuYW1lKS0xXSkgeworCQkJZnJlZShscGF0aCk7CisJCQliYl9lcnJvcl9tc2coIm5hbWVzIGxvbmdlciB0aGFuICJOQU1FX1NJWkVfU1RSIiBjaGFycyBub3Qgc3VwcG9ydGVkIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKyNlbmRpZgorCQlmcmVlKGxwYXRoKTsKKwl9IGVsc2UgaWYgKFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJaGVhZGVyLnR5cGVmbGFnID0gRElSVFlQRTsKKwkJLyogQXBwZW5kICcvJyBvbmx5IGlmIHRoZXJlIGlzIGEgc3BhY2UgZm9yIGl0ICovCisJCWlmICghaGVhZGVyLm5hbWVbc2l6ZW9mKGhlYWRlci5uYW1lKS0xXSkKKwkJCWhlYWRlci5uYW1lW3N0cmxlbihoZWFkZXIubmFtZSldID0gJy8nOworCX0gZWxzZSBpZiAoU19JU0NIUihzdGF0YnVmLT5zdF9tb2RlKSkgeworCQloZWFkZXIudHlwZWZsYWcgPSBDSFJUWVBFOworCQlQVVRfT0NUQUwoaGVhZGVyLmRldm1ham9yLCBtYWpvcihzdGF0YnVmLT5zdF9yZGV2KSk7CisJCVBVVF9PQ1RBTChoZWFkZXIuZGV2bWlub3IsIG1pbm9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwl9IGVsc2UgaWYgKFNfSVNCTEsoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJaGVhZGVyLnR5cGVmbGFnID0gQkxLVFlQRTsKKwkJUFVUX09DVEFMKGhlYWRlci5kZXZtYWpvciwgbWFqb3Ioc3RhdGJ1Zi0+c3RfcmRldikpOworCQlQVVRfT0NUQUwoaGVhZGVyLmRldm1pbm9yLCBtaW5vcihzdGF0YnVmLT5zdF9yZGV2KSk7CisJfSBlbHNlIGlmIChTX0lTRklGTyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQloZWFkZXIudHlwZWZsYWcgPSBGSUZPVFlQRTsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJLyogaGVhZGVyLnNpemUgZmllbGQgaXMgMTIgYnl0ZXMgbG9uZyAqLworCQkvKiBEb2VzIG9jdGFsLWVuY29kZWQgc2l6ZSBmaXQ/ICovCisJCXVvZmZfdCBmaWxlc2l6ZSA9IHN0YXRidWYtPnN0X3NpemU7CisJCWlmIChzaXplb2YoZmlsZXNpemUpIDw9IDQKKwkJIHx8IGZpbGVzaXplIDw9ICh1b2ZmX3QpMDc3Nzc3Nzc3Nzc3N0xMCisJCSkgeworCQkJUFVUX09DVEFMKGhlYWRlci5zaXplLCBmaWxlc2l6ZSk7CisJCX0KKwkJLyogRG9lcyBiYXNlMjU2LWVuY29kZWQgc2l6ZSBmaXQ/CisJCSAqIEl0IGFsd2F5cyBkb2VzIHVubGVzcyBvZmZfdCBpcyB3aWRlciB0aGFuIDY0IGJpdHMuCisJCSAqLworCQllbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKyNpZiBVTExPTkdfTUFYID4gMHhmZmZmZmZmZmZmZmZmZmZmTEwgLyogMl42NC0xICovCisJCSAmJiAoZmlsZXNpemUgPD0gMHgzZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMTCkKKyNlbmRpZgorCQkpIHsKKwkgICAgICAgICAgICAgICAgLyogR05VIHRhciB1c2VzICJiYXNlLTI1NiBlbmNvZGluZyIgZm9yIHZlcnkgbGFyZ2UgbnVtYmVycy4KKwkgICAgICAgICAgICAgICAgICogRW5jb2RpbmcgaXMgYmluYXJ5LCB3aXRoIGhpZ2hlc3QgYml0IGFsd2F5cyBzZXQgYXMgYSBtYXJrZXIKKwkgICAgICAgICAgICAgICAgICogYW5kIHNpZ24gaW4gbmV4dC1oaWdoZXN0IGJpdDoKKwkgICAgICAgICAgICAgICAgICogODAgMDAgLi4gMDAgLSB6ZXJvCisJICAgICAgICAgICAgICAgICAqIGJmIGZmIC4uIGZmIC0gbGFyZ2VzdCBwb3NpdGl2ZSBudW1iZXIKKwkgICAgICAgICAgICAgICAgICogZmYgZmYgLi4gZmYgLSBtaW51cyAxCisJICAgICAgICAgICAgICAgICAqIGMwIDAwIC4uIDAwIC0gc21hbGxlc3QgbmVnYXRpdmUgbnVtYmVyCisJCQkgKi8KKwkJCWNoYXIgKnA4ID0gaGVhZGVyLnNpemUgKyBzaXplb2YoaGVhZGVyLnNpemUpOworCQkJZG8geworCQkJCSotLXA4ID0gKHVpbnQ4X3QpZmlsZXNpemU7CisJCQkJZmlsZXNpemUgPj49IDg7CisJCQl9IHdoaWxlIChwOCAhPSBoZWFkZXIuc2l6ZSk7CisJCQkqcDggfD0gMHg4MDsKKwkJfSBlbHNlIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdG9yZSBmaWxlICclcycgIgorCQkJCSJvZiBzaXplICUiT0ZGX0ZNVCJ1LCBhYm9ydGluZyIsCisJCQkJZmlsZU5hbWUsIHN0YXRidWYtPnN0X3NpemUpOworCQl9CisJCWhlYWRlci50eXBlZmxhZyA9IFJFR1RZUEU7CisJfSBlbHNlIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogdW5rbm93biBmaWxlIHR5cGUiLCBmaWxlTmFtZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwkvKiBXcml0ZSBvdXQgbG9uZyBuYW1lIGlmIG5lZWRlZCAqLworCS8qICh3ZSwgbGlrZSBHTlUgdGFyLCBvdXRwdXQgbG9uZyBsaW5rbmFtZSAqYmVmb3JlKiBsb25nIG5hbWUpICovCisJaWYgKGhlYWRlci5uYW1lW3NpemVvZihoZWFkZXIubmFtZSktMV0pCisJCXdyaXRlTG9uZ25hbWUodGJJbmZvLT50YXJGZCwgR05VTE9OR05BTUUsCisJCQkJaGVhZGVyX25hbWUsIFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpOworI2VuZGlmCisKKwkvKiBOb3cgd3JpdGUgdGhlIGhlYWRlciBvdXQgdG8gZGlzayAqLworCWNoa3N1bV9hbmRfeHdyaXRlKHRiSW5mby0+dGFyRmQsICZoZWFkZXIpOworCisJLyogTm93IGRvIHRoZSB2ZXJib3NlIHRoaW5nIChvciBub3QpICovCisJaWYgKHRiSW5mby0+dmVyYm9zZUZsYWcpIHsKKwkJRklMRSAqdmJGZCA9IHN0ZG91dDsKKworCQkvKiBJZiBhcmNoaXZlIGdvZXMgdG8gc3Rkb3V0LCB2ZXJib3NlIGdvZXMgdG8gc3RkZXJyICovCisJCWlmICh0YkluZm8tPnRhckZkID09IFNURE9VVF9GSUxFTk8pCisJCQl2YkZkID0gc3RkZXJyOworCQkvKiBHTlUgInRhciBjdnZmIiBwcmludHMgImV4dGVuZGVkIiBsaXN0aW5nIGEtbGEgImxzIC1sIiAqLworCQkvKiBXZSBkb24ndCBoYXZlIHN1Y2ggZXhjZXNzZXMgaGVyZTogZm9yIHVzICJ2IiA9PSAidnYiICovCisJCS8qICcvJyBpcyBwcm9iYWJseSBhIEdOVWlzbSAqLworCQlmcHJpbnRmKHZiRmQsICIlcyVzXG4iLCBoZWFkZXJfbmFtZSwKKwkJCQlTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpID8gIi8iIDogIiIpOworCX0KKworCXJldHVybiBUUlVFOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KK3N0YXRpYyBpbnQgZXhjbHVkZV9maWxlKGNvbnN0IGxsaXN0X3QgKmV4Y2x1ZGVkX2ZpbGVzLCBjb25zdCBjaGFyICpmaWxlKQoreworCXdoaWxlIChleGNsdWRlZF9maWxlcykgeworCQlpZiAoZXhjbHVkZWRfZmlsZXMtPmRhdGFbMF0gPT0gJy8nKSB7CisJCQlpZiAoZm5tYXRjaChleGNsdWRlZF9maWxlcy0+ZGF0YSwgZmlsZSwKKwkJCQkJRk5NX1BBVEhOQU1FIHwgRk5NX0xFQURJTkdfRElSKSA9PSAwKQorCQkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJY29uc3QgY2hhciAqcDsKKworCQkJZm9yIChwID0gZmlsZTsgcFswXSAhPSAnXDAnOyBwKyspIHsKKwkJCQlpZiAoKHAgPT0gZmlsZSB8fCBwWy0xXSA9PSAnLycpCisJCQkJICYmIHBbMF0gIT0gJy8nCisJCQkJICYmIGZubWF0Y2goZXhjbHVkZWRfZmlsZXMtPmRhdGEsIHAsCisJCQkJCQlGTk1fUEFUSE5BTUUgfCBGTk1fTEVBRElOR19ESVIpID09IDAKKwkJCQkpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJCWV4Y2x1ZGVkX2ZpbGVzID0gZXhjbHVkZWRfZmlsZXMtPmxpbms7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorIyBkZWZpbmUgZXhjbHVkZV9maWxlKGV4Y2x1ZGVkX2ZpbGVzLCBmaWxlKSAwCisjZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgd3JpdGVGaWxlVG9UYXJiYWxsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwKKwkJCXZvaWQgKnVzZXJEYXRhLCBpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBUYXJCYWxsSW5mbyAqdGJJbmZvID0gKHN0cnVjdCBUYXJCYWxsSW5mbyAqKSB1c2VyRGF0YTsKKwljb25zdCBjaGFyICpoZWFkZXJfbmFtZTsKKwlpbnQgaW5wdXRGaWxlRmQgPSAtMTsKKworCURCRygid3JpdGVGaWxlVG9UYXJiYWxsKCclcycpIiwgZmlsZU5hbWUpOworCisJLyogU3RyaXAgbGVhZGluZyAnLycgYW5kIHN1Y2ggKG11c3QgYmUgYmVmb3JlIG1lbW9yaXppbmcgaGFyZGxpbmsncyBuYW1lKSAqLworCWhlYWRlcl9uYW1lID0gc3RyaXBfdW5zYWZlX3ByZWZpeChmaWxlTmFtZSk7CisKKwlpZiAoaGVhZGVyX25hbWVbMF0gPT0gJ1wwJykKKwkJcmV0dXJuIFRSVUU7CisKKwkvKiBJdCBpcyBhZ2FpbnN0IHRoZSBydWxlcyB0byBhcmNoaXZlIGEgc29ja2V0ICovCisJaWYgKFNfSVNTT0NLKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IHNvY2tldCBpZ25vcmVkIiwgZmlsZU5hbWUpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgaGFyZCBsaW5rLgorCSAqIElmIHNvIC0KKwkgKiBUcmVhdCB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGEgZ2l2ZW4gZGV2L2lub2RlIGFzIGEgZmlsZSB3aGlsZQorCSAqIHRyZWF0aW5nIGFueSBhZGRpdGlvbmFsIG9jY3VyYW5jZXMgYXMgaGFyZCBsaW5rcy4gIFRoaXMgaXMgZG9uZQorCSAqIGJ5IGFkZGluZyB0aGUgZmlsZSBpbmZvcm1hdGlvbiB0byB0aGUgSGFyZExpbmtJbmZvIGxpbmtlZCBsaXN0LgorCSAqLworCXRiSW5mby0+aGxJbmZvID0gTlVMTDsKKwlpZiAoIVNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkgJiYgc3RhdGJ1Zi0+c3RfbmxpbmsgPiAxKSB7CisJCURCRygiJyVzJzogc3RfbmxpbmsgPiAxIiwgaGVhZGVyX25hbWUpOworCQl0YkluZm8tPmhsSW5mbyA9IGZpbmRIYXJkTGlua0luZm8odGJJbmZvLT5obEluZm9IZWFkLCBzdGF0YnVmKTsKKwkJaWYgKHRiSW5mby0+aGxJbmZvID09IE5VTEwpIHsKKwkJCURCRygiJyVzJzogYWRkSGFyZExpbmtJbmZvIiwgaGVhZGVyX25hbWUpOworCQkJYWRkSGFyZExpbmtJbmZvKCZ0YkluZm8tPmhsSW5mb0hlYWQsIHN0YXRidWYsIGhlYWRlcl9uYW1lKTsKKwkJfQorCX0KKworCS8qIEl0IGlzIGEgYmFkIGlkZWEgdG8gc3RvcmUgdGhlIGFyY2hpdmUgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nLAorCSAqIHNvIGNoZWNrIHRoZSBkZXZpY2UgYW5kIGlub2RlIHRvIGJlIHN1cmUgdGhhdCB0aGlzIHBhcnRpY3VsYXIgZmlsZSBpc24ndAorCSAqIHRoZSBuZXcgdGFyYmFsbCAqLworCWlmICh0YkluZm8tPnRhckZpbGVTdGF0QnVmLnN0X2RldiA9PSBzdGF0YnVmLT5zdF9kZXYKKwkgJiYgdGJJbmZvLT50YXJGaWxlU3RhdEJ1Zi5zdF9pbm8gPT0gc3RhdGJ1Zi0+c3RfaW5vCisJKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IGZpbGUgaXMgdGhlIGFyY2hpdmU7IHNraXBwaW5nIiwgZmlsZU5hbWUpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlpZiAoZXhjbHVkZV9maWxlKHRiSW5mby0+ZXhjbHVkZUxpc3QsIGhlYWRlcl9uYW1lKSkKKwkJcmV0dXJuIFNLSVA7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJaWYgKHN0cmxlbihoZWFkZXJfbmFtZSkgPj0gTkFNRV9TSVpFKSB7CisJCWJiX2Vycm9yX21zZygibmFtZXMgbG9uZ2VyIHRoYW4gIk5BTUVfU0laRV9TVFIiIGNoYXJzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmCisKKwkvKiBJcyB0aGlzIGEgcmVndWxhciBmaWxlPyAqLworCWlmICh0YkluZm8tPmhsSW5mbyA9PSBOVUxMICYmIFNfSVNSRUcoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJLyogb3BlbiB0aGUgZmlsZSB3ZSB3YW50IHRvIGFyY2hpdmUsIGFuZCBtYWtlIHN1cmUgYWxsIGlzIHdlbGwgKi8KKwkJaW5wdXRGaWxlRmQgPSBvcGVuX29yX3dhcm4oZmlsZU5hbWUsIE9fUkRPTkxZKTsKKwkJaWYgKGlucHV0RmlsZUZkIDwgMCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJLyogQWRkIGFuIGVudHJ5IHRvIHRoZSB0YXJiYWxsICovCisJaWYgKHdyaXRlVGFySGVhZGVyKHRiSW5mbywgaGVhZGVyX25hbWUsIGZpbGVOYW1lLCBzdGF0YnVmKSA9PSBGQUxTRSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogSWYgaXQgd2FzIGEgcmVndWxhciBmaWxlLCB3cml0ZSBvdXQgdGhlIGJvZHkgKi8KKwlpZiAoaW5wdXRGaWxlRmQgPj0gMCkgeworCQlzaXplX3QgcmVhZFNpemU7CisJCS8qIFdyaXRlIHRoZSBmaWxlIHRvIHRoZSBhcmNoaXZlLiAqLworCQkvKiBXZSByZWNvcmQgc2l6ZSBpbnRvIGhlYWRlciBmaXJzdCwgKi8KKwkJLyogYW5kIHRoZW4gd3JpdGUgb3V0IGZpbGUuIElmIGZpbGUgc2hyaW5rcyBpbiBiZXR3ZWVuLCAqLworCQkvKiB0YXIgd2lsbCBiZSBjb3JydXB0ZWQuIFNvIHdlIGRvbid0IGFsbG93IGZvciB0aGF0LiAqLworCQkvKiBOQjogR05VIHRhciAxLjE2IHdhcm5zIGFuZCBwYWRzIHdpdGggemVyb2VzICovCisJCS8qIG9yIGV2ZW4gc2Vla3MgYmFjayBhbmQgdXBkYXRlcyBoZWFkZXIgKi8KKwkJYmJfY29weWZkX2V4YWN0X3NpemUoaW5wdXRGaWxlRmQsIHRiSW5mby0+dGFyRmQsIHN0YXRidWYtPnN0X3NpemUpOworCQkvLy8vb2ZmX3QgcmVhZFNpemU7CisJCS8vLy9yZWFkU2l6ZSA9IGJiX2NvcHlmZF9zaXplKGlucHV0RmlsZUZkLCB0YkluZm8tPnRhckZkLCBzdGF0YnVmLT5zdF9zaXplKTsKKwkJLy8vL2lmIChyZWFkU2l6ZSAhPSBzdGF0YnVmLT5zdF9zaXplICYmIHJlYWRTaXplID49IDApIHsKKwkJLy8vLwliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCBmcm9tICVzLCBhYm9ydGluZyIsIGZpbGVOYW1lKTsKKwkJLy8vL30KKworCQkvKiBDaGVjayB0aGF0IGZpbGUgZGlkIG5vdCBncm93IGluIGJldHdlZW4/ICovCisJCS8qIGlmIChzYWZlX3JlYWQoaW5wdXRGaWxlRmQsIDEpID09IDEpIHdhcm4gYnV0IGNvbnRpbnVlPyAqLworCisJCWNsb3NlKGlucHV0RmlsZUZkKTsKKworCQkvKiBQYWQgdGhlIGZpbGUgdXAgdG8gdGhlIHRhciBibG9jayBzaXplICovCisJCS8qIChhIGZldyB0cmlja3MgaGVyZSBpbiB0aGUgbmFtZSBvZiBjb2RlIHNpemUpICovCisJCXJlYWRTaXplID0gKC0oaW50KXN0YXRidWYtPnN0X3NpemUpICYgKFRBUl9CTE9DS19TSVpFLTEpOworCQltZW1zZXQoYmxvY2tfYnVmLCAwLCByZWFkU2l6ZSk7CisJCXh3cml0ZSh0YkluZm8tPnRhckZkLCBibG9ja19idWYsIHJlYWRTaXplKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorIyBpZiAhKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daICYmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMikKKyMgIGRlZmluZSB2Zm9ya19jb21wcmVzc29yKHRhcl9mZCwgZ3ppcCkgdmZvcmtfY29tcHJlc3Nvcih0YXJfZmQpCisjIGVuZGlmCisvKiBEb24ndCBpbmxpbmU6IHZmb3JrIHNjYXJlcyBnY2MgYW5kIHBlc3NpbWl6ZXMgY29kZSAqLworc3RhdGljIHZvaWQgTk9JTkxJTkUgdmZvcmtfY29tcHJlc3NvcihpbnQgdGFyX2ZkLCBpbnQgZ3ppcCkKK3sKKwlwaWRfdCBnemlwUGlkOworIyBpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiAmJiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwljb25zdCBjaGFyICp6aXBfZXhlYyA9IChnemlwID09IDEpID8gImd6aXAiIDogImJ6aXAyIjsKKyMgZWxpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCWNvbnN0IGNoYXIgKnppcF9leGVjID0gImd6aXAiOworIyBlbHNlIC8qIG9ubHkgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyICovCisJY29uc3QgY2hhciAqemlwX2V4ZWMgPSAiYnppcDIiOworIyBlbmRpZgorCS8vIE9uIExpbnV4LCB2Zm9yayBuZXZlciB1bnBhdXNlcyBwYXJlbnQgZWFybHksIGFsdGhvdWdoIHN0YW5kYXJkCisJLy8gYWxsb3dzIGZvciB0aGF0LiBEbyB3ZSB3YW50IHRvIHdhc3RlIGJ5dGVzIGNoZWNraW5nIGZvciBpdD8KKyMgZGVmaW5lIFdBSVRfRk9SX0NISUxEIDAKKwl2b2xhdGlsZSBpbnQgdmZvcmtfZXhlY19lcnJubyA9IDA7CisJc3RydWN0IGZkX3BhaXIgZ3ppcERhdGFQaXBlOworIyBpZiBXQUlUX0ZPUl9DSElMRAorCXN0cnVjdCBmZF9wYWlyIGd6aXBTdGF0dXNQaXBlOworCXhwaXBlZF9wYWlyKGd6aXBTdGF0dXNQaXBlKTsKKyMgZW5kaWYKKwl4cGlwZWRfcGFpcihnemlwRGF0YVBpcGUpOworCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAvKiB3ZSBvbmx5IHdhbnQgRVBJUEUgb24gZXJyb3JzICovCisKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18KKwkvKiBBdm9pZCB2Zm9yayBjbG9iYmVyaW5nICovCisJKHZvaWQpICZ6aXBfZXhlYzsKKyMgZW5kaWYKKworCWd6aXBQaWQgPSB4dmZvcmsoKTsKKworCWlmIChnemlwUGlkID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJLyogTkI6IGNsb3NlIF9maXJzdF8sIHRoZW4gbW92ZSBmZHMhICovCisJCWNsb3NlKGd6aXBEYXRhUGlwZS53cik7CisjIGlmIFdBSVRfRk9SX0NISUxECisJCWNsb3NlKGd6aXBTdGF0dXNQaXBlLnJkKTsKKwkJLyogZ3ppcFN0YXR1c1BpcGUud3Igd2lsbCBjbG9zZSBvbmx5IG9uIGV4ZWMgLQorCQkgKiBwYXJlbnQgd2FpdHMgZm9yIHRoaXMgY2xvc2UgdG8gaGFwcGVuICovCisJCWZjbnRsKGd6aXBTdGF0dXNQaXBlLndyLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyMgZW5kaWYKKwkJeG1vdmVfZmQoZ3ppcERhdGFQaXBlLnJkLCAwKTsKKwkJeG1vdmVfZmQodGFyX2ZkLCAxKTsKKwkJLyogZXhlYyBnemlwL2J6aXAyIHByb2dyYW0vYXBwbGV0ICovCisJCUJCX0VYRUNMUCh6aXBfZXhlYywgemlwX2V4ZWMsICItZiIsIE5VTEwpOworCQl2Zm9ya19leGVjX2Vycm5vID0gZXJybm87CisJCV9leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJLyogcGFyZW50ICovCisJeG1vdmVfZmQoZ3ppcERhdGFQaXBlLndyLCB0YXJfZmQpOworCWNsb3NlKGd6aXBEYXRhUGlwZS5yZCk7CisjIGlmIFdBSVRfRk9SX0NISUxECisJY2xvc2UoZ3ppcFN0YXR1c1BpcGUud3IpOworCXdoaWxlICgxKSB7CisJCWNoYXIgYnVmOworCQlpbnQgbjsKKworCQkvKiBXYWl0IHVudGlsIGNoaWxkIGV4ZWNzIChvciBmYWlscyB0bykgKi8KKwkJbiA9IGZ1bGxfcmVhZChnemlwU3RhdHVzUGlwZS5yZCwgJmJ1ZiwgMSk7CisJCWlmIChuIDwgMCAvKiAmJiBlcnJubyA9PSBFQUdBSU4gKi8pCisJCQljb250aW51ZTsJLyogdHJ5IGl0IGFnYWluICovCisJfQorCWNsb3NlKGd6aXBTdGF0dXNQaXBlLnJkKTsKKyMgZW5kaWYKKwlpZiAodmZvcmtfZXhlY19lcnJubykgeworCQllcnJubyA9IHZmb3JrX2V4ZWNfZXJybm87CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgemlwX2V4ZWMpOworCX0KK30KKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIgKi8KKworCisvKiBnY2MgNC4yLjEgaW5saW5lcyBpdCwgbWFraW5nIGNvZGUgYmlnZ2VyICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHdyaXRlVGFyRmlsZShpbnQgdGFyX2ZkLCBpbnQgdmVyYm9zZUZsYWcsCisJaW50IGRlcmVmZXJlbmNlRmxhZywgY29uc3QgbGxpc3RfdCAqaW5jbHVkZSwKKwljb25zdCBsbGlzdF90ICpleGNsdWRlLCBpbnQgZ3ppcCkKK3sKKwlpbnQgZXJyb3JGbGFnID0gRkFMU0U7CisJc3RydWN0IFRhckJhbGxJbmZvIHRiSW5mbzsKKworCXRiSW5mby5obEluZm9IZWFkID0gTlVMTDsKKwl0YkluZm8udGFyRmQgPSB0YXJfZmQ7CisJdGJJbmZvLnZlcmJvc2VGbGFnID0gdmVyYm9zZUZsYWc7CisKKwkvKiBTdG9yZSB0aGUgc3RhdCBpbmZvIGZvciB0aGUgdGFyYmFsbCdzIGZpbGUsIHNvCisJICogY2FuIGF2b2lkIGluY2x1ZGluZyB0aGUgdGFyYmFsbCBpbnRvIGl0c2VsZi4uLi4gICovCisJeGZzdGF0KHRiSW5mby50YXJGZCwgJnRiSW5mby50YXJGaWxlU3RhdEJ1ZiwgImNhbid0IHN0YXQgdGFyIGZpbGUiKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCWlmIChnemlwKQorCQl2Zm9ya19jb21wcmVzc29yKHRiSW5mby50YXJGZCwgZ3ppcCk7CisjZW5kaWYKKworCXRiSW5mby5leGNsdWRlTGlzdCA9IGV4Y2x1ZGU7CisKKwkvKiBSZWFkIHRoZSBkaXJlY3RvcnkvZmlsZXMgYW5kIGl0ZXJhdGUgb3ZlciB0aGVtIG9uZSBhdCBhIHRpbWUgKi8KKwl3aGlsZSAoaW5jbHVkZSkgeworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24oaW5jbHVkZS0+ZGF0YSwgQUNUSU9OX1JFQ1VSU0UgfAorCQkJCShkZXJlZmVyZW5jZUZsYWcgPyBBQ1RJT05fRk9MTE9XTElOS1MgOiAwKSwKKwkJCQl3cml0ZUZpbGVUb1RhcmJhbGwsIHdyaXRlRmlsZVRvVGFyYmFsbCwgJnRiSW5mbywgMCkKKwkJKSB7CisJCQllcnJvckZsYWcgPSBUUlVFOworCQl9CisJCWluY2x1ZGUgPSBpbmNsdWRlLT5saW5rOworCX0KKwkvKiBXcml0ZSB0d28gZW1wdHkgYmxvY2tzIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgKi8KKwltZW1zZXQoYmxvY2tfYnVmLCAwLCAyKlRBUl9CTE9DS19TSVpFKTsKKwl4d3JpdGUodGJJbmZvLnRhckZkLCBibG9ja19idWYsIDIqVEFSX0JMT0NLX1NJWkUpOworCisJLyogVG8gYmUgcGVkYW50aWNhbGx5IGNvcnJlY3QsIHdlIHdvdWxkIGNoZWNrIGlmIHRoZSB0YXJiYWxsCisJICogaXMgc21hbGxlciB0aGFuIDIwIHRhciBibG9ja3MsIGFuZCBwYWQgaXQgaWYgaXQgd2FzIHNtYWxsZXIsCisJICogYnV0IHRoYXQgaXNuJ3QgbmVjZXNzYXJ5IGZvciBHTlUgdGFyIGludGVyb3BlcmFiaWxpdHksIGFuZAorCSAqIHNvIGlzIGNvbnNpZGVyZWQgYSB3YXN0ZSBvZiBzcGFjZSAqLworCisJLyogQ2xvc2Ugc28gdGhlIGNoaWxkIHByb2Nlc3MgKGlmIGFueSkgd2lsbCBleGl0ICovCisJY2xvc2UodGJJbmZvLnRhckZkKTsKKworCS8qIEhhbmcgdXAgdGhlIHRvb2xzLCBjbG9zZSB1cCBzaG9wLCBoZWFkIGhvbWUgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWVIYXJkTGlua0luZm8oJnRiSW5mby5obEluZm9IZWFkKTsKKworCWlmIChlcnJvckZsYWcpCisJCWJiX2Vycm9yX21zZygiZXJyb3IgZXhpdCBkZWxheWVkIGZyb20gcHJldmlvdXMgZXJyb3JzIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlpZiAoZ3ppcCkgeworCQlpbnQgc3RhdHVzOworCQlpZiAoc2FmZV93YWl0cGlkKC0xLCAmc3RhdHVzLCAwKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2coIndhaXRwaWQiKTsKKwkJZWxzZSBpZiAoIVdJRkVYSVRFRChzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHN0YXR1cykpCisJCQkvKiBnemlwIHdhcyBraWxsZWQgb3IgaGFzIGV4aXRlZCB3aXRoIG5vbnplcm8hICovCisJCQllcnJvckZsYWcgPSBUUlVFOworCX0KKyNlbmRpZgorCXJldHVybiBlcnJvckZsYWc7Cit9CisjZWxzZQoraW50IHdyaXRlVGFyRmlsZShpbnQgdGFyX2ZkLCBpbnQgdmVyYm9zZUZsYWcsCisJaW50IGRlcmVmZXJlbmNlRmxhZywgY29uc3QgbGxpc3RfdCAqaW5jbHVkZSwKKwljb25zdCBsbGlzdF90ICpleGNsdWRlLCBpbnQgZ3ppcCk7CisjZW5kaWYgLyogRkVBVFVSRV9UQVJfQ1JFQVRFICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorc3RhdGljIGxsaXN0X3QgKmFwcGVuZF9maWxlX2xpc3RfdG9fbGlzdChsbGlzdF90ICpsaXN0KQoreworCUZJTEUgKnNyY19zdHJlYW07CisJY2hhciAqbGluZTsKKwlsbGlzdF90ICpuZXdsaXN0ID0gTlVMTDsKKworCXdoaWxlIChsaXN0KSB7CisJCXNyY19zdHJlYW0gPSB4Zm9wZW5fc3RkaW4obGxpc3RfcG9wKCZsaXN0KSk7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3JjX3N0cmVhbSkpICE9IE5VTEwpIHsKKwkJCS8qIGtpbGwgdHJhaWxpbmcgJy8nIHVubGVzcyB0aGUgc3RyaW5nIGlzIGp1c3QgIi8iICovCisJCQljaGFyICpjcCA9IGxhc3RfY2hhcl9pcyhsaW5lLCAnLycpOworCQkJaWYgKGNwID4gbGluZSkKKwkJCQkqY3AgPSAnXDAnOworCQkJbGxpc3RfYWRkX3RvKCZuZXdsaXN0LCBsaW5lKTsKKwkJfQorCQlmY2xvc2Uoc3JjX3N0cmVhbSk7CisJfQorCXJldHVybiBuZXdsaXN0OworfQorI2Vsc2UKKyMgZGVmaW5lIGFwcGVuZF9maWxlX2xpc3RfdG9fbGlzdCh4KSAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1oKK3N0YXRpYyBjaGFyIEZBU1RfRlVOQyBnZXRfaGVhZGVyX3Rhcl9aKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCS8qIENhbid0IGxzZWVrIG92ZXIgcGlwZXMgKi8KKwlhcmNoaXZlX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfcmVhZDsKKworCS8qIGRvIHRoZSBkZWNvbXByZXNzaW9uLCBhbmQgY2xlYW51cCAqLworCWlmICh4cmVhZF9jaGFyKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQpICE9IDB4MWYKKwkgfHwgeHJlYWRfY2hhcihhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkKSAhPSAweDlkCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIG1hZ2ljIik7CisJfQorCisJb3Blbl90cmFuc2Zvcm1lcihhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCB1bnBhY2tfWl9zdHJlYW0sICJ1bmNvbXByZXNzIik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7CisJd2hpbGUgKGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJLyogQ2FuIG9ubHkgZG8gb25lIGZpbGUgYXQgYSB0aW1lICovCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KKyNlbHNlCisjIGRlZmluZSBnZXRfaGVhZGVyX3Rhcl9aIE5VTEwKKyNlbmRpZgorCisjaWZkZWYgQ0hFQ0tfRk9SX0NISUxEX0VYSVRDT0RFCisvKiBMb29rcyBsaWtlIGl0IGlzbid0IG5lZWRlZCAtIHRhciBkZXRlY3RzIG1hbGZvcm1lZCAodHJ1bmNhdGVkKQorICogYXJjaGl2ZSBpZiBlLmcuIGJ1bnppcDIgZmFpbHMgKi8KK3N0YXRpYyBpbnQgY2hpbGRfZXJyb3I7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9TSUdDSExEKGludCBzdGF0dXMpCit7CisJLyogQWN0dWFsbHksICdzdGF0dXMnIGlzIGEgc2lnbm8uIFdlIHJldXNlIGl0IGZvciBvdGhlciBuZWVkcyAqLworCisJLyogV2FpdCBmb3IgYW55IGNoaWxkIHdpdGhvdXQgYmxvY2tpbmcgKi8KKwlpZiAod2FpdF9hbnlfbm9oYW5nKCZzdGF0dXMpIDwgMCkKKwkJLyogd2FpdCBmYWlsZWQ/ISBJJ20gY29uZnVzZWQuLi4gKi8KKwkJcmV0dXJuOworCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkKKwkJLyogY2hpbGQgZXhpdGVkIHdpdGggMCAqLworCQlyZXR1cm47CisJLyogQ2Fubm90IGhhcHBlbj8KKwlpZiAoIVdJRlNJR05BTEVEKHN0YXR1cykgJiYgIVdJRkVYSVRFRChzdGF0dXMpKSByZXR1cm47ICovCisJY2hpbGRfZXJyb3IgPSAxOworfQorI2VuZGlmCisKKy8vdXNhZ2U6I2RlZmluZSB0YXJfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIi1bIiBJRl9GRUFUVVJFX1RBUl9DUkVBVEUoImMiKSAieHQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX1ooIloiKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19HWigieiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMigiaiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoImEiKQorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJoIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRSgibSIpCisvL3VzYWdlOgkidk9dICIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0ZST00oIlstWCBGSUxFXSBbLVQgRklMRV0gIikKKy8vdXNhZ2U6CSJbLWYgVEFSRklMRV0gWy1DIERJUl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHRhcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJDcmVhdGUsIGV4dHJhY3QsICIpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9UQVJfQ1JFQVRFKCJFeHRyYWN0ICIpCisvL3VzYWdlOgkib3IgbGlzdCBmaWxlcyBmcm9tIGEgdGFyIGZpbGVcbiIKKy8vdXNhZ2U6ICAgICAiXG5PcGVyYXRpb246IgorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKAorLy91c2FnZTogICAgICJcbgljCUNyZWF0ZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JeAlFeHRyYWN0IgorLy91c2FnZTogICAgICJcbgl0CUxpc3QiCisvL3VzYWdlOiAgICAgIlxuCWYJTmFtZSBvZiBUQVJGSUxFICgnLScgZm9yIHN0ZGluL291dCkiCisvL3VzYWdlOiAgICAgIlxuCUMJQ2hhbmdlIHRvIERJUiBiZWZvcmUgb3BlcmF0aW9uIgorLy91c2FnZTogICAgICJcbgl2CVZlcmJvc2UiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX1ooCisvL3VzYWdlOiAgICAgIlxuCVoJKERlKWNvbXByZXNzIHVzaW5nIGNvbXByZXNzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19HWigKKy8vdXNhZ2U6ICAgICAiXG4JegkoRGUpY29tcHJlc3MgdXNpbmcgZ3ppcCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VBTUxFU1NfQloyKAorLy91c2FnZTogICAgICJcbglqCShEZSljb21wcmVzcyB1c2luZyBiemlwMiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQSgKKy8vdXNhZ2U6ICAgICAiXG4JYQkoRGUpY29tcHJlc3MgdXNpbmcgbHptYSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JTwlFeHRyYWN0IHRvIHN0ZG91dCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgKKy8vdXNhZ2U6ICAgICAiXG4JaAlGb2xsb3cgc3ltbGlua3MiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUoCisvL3VzYWdlOiAgICAgIlxuCW0JRG9uJ3QgcmVzdG9yZSBtdGltZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0ZST00oCisvL3VzYWdlOglJRl9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCWV4Y2x1ZGUJRmlsZSB0byBleGNsdWRlIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbglYCUZpbGUgd2l0aCBuYW1lcyB0byBleGNsdWRlIgorLy91c2FnZTogICAgICJcbglUCUZpbGUgd2l0aCBuYW1lcyB0byBpbmNsdWRlIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0YXJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgemNhdCAvdG1wL3RhcmJhbGwudGFyLmd6IHwgdGFyIC14ZiAtXG4iCisvL3VzYWdlOiAgICAgICAiJCB0YXIgLWNmIC90bXAvdGFyYmFsbC50YXIgL3Vzci9sb2NhbFxuIgorCisvLyBTdXBwb3J0ZWQgYnV0IGFyZW4ndCBpbiAtLWhlbHA6CisvLwlvCW5vLXNhbWUtb3duZXIKKy8vCXAJc2FtZS1wZXJtaXNzaW9ucworLy8JawlrZWVwLW9sZAorLy8JbnVtZXJpYy1vd25lcgorLy8Jbm8tc2FtZS1wZXJtaXNzaW9ucworLy8Jb3ZlcndyaXRlCisvL0lGX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQoCisvLwl0by1jb21tYW5kCisvLykKKworZW51bSB7CisJT1BUQklUX0tFRVBfT0xEID0gOCwKKwlJRl9GRUFUVVJFX1RBUl9DUkVBVEUoICAgT1BUQklUX0NSRUFURSAgICAgICwpCisJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgIE9QVEJJVF9ERVJFRkVSRU5DRSAsKQorCUlGX0ZFQVRVUkVfU0VBTUxFU1NfQloyKCBPUFRCSVRfQlpJUDIgICAgICAgLCkKKwlJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoT1BUQklUX0xaTUEgICAgICAgICwpCisJSUZfRkVBVFVSRV9UQVJfRlJPTSggICAgIE9QVEJJVF9JTkNMVURFX0ZST00sKQorCUlGX0ZFQVRVUkVfVEFSX0ZST00oICAgICBPUFRCSVRfRVhDTFVERV9GUk9NLCkKKwlJRl9GRUFUVVJFX1NFQU1MRVNTX0daKCAgT1BUQklUX0daSVAgICAgICAgICwpCisJSUZfRkVBVFVSRV9TRUFNTEVTU19aKCAgIE9QVEJJVF9DT01QUkVTUyAgICAsKSAvLyAxNnRoIGJpdAorCUlGX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRShPUFRCSVRfTk9QUkVTRVJWRV9USU1FLCkKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCisJSUZfRkVBVFVSRV9UQVJfVE9fQ09NTUFORChPUFRCSVRfMkNPTU1BTkQgICAsKQorCU9QVEJJVF9OVU1FUklDX09XTkVSLAorCU9QVEJJVF9OT1BSRVNFUlZFX1BFUk0sCisJT1BUQklUX09WRVJXUklURSwKKyNlbmRpZgorCU9QVF9URVNUICAgICAgICAgPSAxIDw8IDAsIC8vIHQKKwlPUFRfRVhUUkFDVCAgICAgID0gMSA8PCAxLCAvLyB4CisJT1BUX0JBU0VESVIgICAgICA9IDEgPDwgMiwgLy8gQworCU9QVF9UQVJOQU1FICAgICAgPSAxIDw8IDMsIC8vIGYKKwlPUFRfMlNURE9VVCAgICAgID0gMSA8PCA0LCAvLyBPCisJT1BUX05PUFJFU0VSVkVfT1dORVIgPSAxIDw8IDUsIC8vIG8gPT0gbm8tc2FtZS1vd25lcgorCU9QVF9QICAgICAgICAgICAgPSAxIDw8IDYsIC8vIHAKKwlPUFRfVkVSQk9TRSAgICAgID0gMSA8PCA3LCAvLyB2CisJT1BUX0tFRVBfT0xEICAgICA9IDEgPDwgOCwgLy8gaworCU9QVF9DUkVBVEUgICAgICAgPSBJRl9GRUFUVVJFX1RBUl9DUkVBVEUoICAgKDEgPDwgT1BUQklUX0NSRUFURSAgICAgICkpICsgMCwgLy8gYworCU9QVF9ERVJFRkVSRU5DRSAgPSBJRl9GRUFUVVJFX1RBUl9DUkVBVEUoICAgKDEgPDwgT1BUQklUX0RFUkVGRVJFTkNFICkpICsgMCwgLy8gaAorCU9QVF9CWklQMiAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMiggKDEgPDwgT1BUQklUX0JaSVAyICAgICAgICkpICsgMCwgLy8gagorCU9QVF9MWk1BICAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoKDEgPDwgT1BUQklUX0xaTUEgICAgICAgICkpICsgMCwgLy8gYQorCU9QVF9JTkNMVURFX0ZST00gPSBJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgKDEgPDwgT1BUQklUX0lOQ0xVREVfRlJPTSkpICsgMCwgLy8gVAorCU9QVF9FWENMVURFX0ZST00gPSBJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgKDEgPDwgT1BUQklUX0VYQ0xVREVfRlJPTSkpICsgMCwgLy8gWAorCU9QVF9HWklQICAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX0daKCAgKDEgPDwgT1BUQklUX0daSVAgICAgICAgICkpICsgMCwgLy8gegorCU9QVF9DT01QUkVTUyAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX1ooICAgKDEgPDwgT1BUQklUX0NPTVBSRVNTICAgICkpICsgMCwgLy8gWgorCU9QVF9OT1BSRVNFUlZFX1RJTUUgPSBJRl9GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUoKDEgPDwgT1BUQklUX05PUFJFU0VSVkVfVElNRSkpICsgMCwgLy8gbQorCU9QVF8yQ09NTUFORCAgICAgICAgPSBJRl9GRUFUVVJFX1RBUl9UT19DT01NQU5EKCAgKDEgPDwgT1BUQklUXzJDT01NQU5EICAgICAgICkpICsgMCwgLy8gdG8tY29tbWFuZAorCU9QVF9OVU1FUklDX09XTkVSICAgPSBJRl9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMoKDEgPDwgT1BUQklUX05VTUVSSUNfT1dORVIgICkpICsgMCwgLy8gbnVtZXJpYy1vd25lcgorCU9QVF9OT1BSRVNFUlZFX1BFUk0gPSBJRl9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMoKDEgPDwgT1BUQklUX05PUFJFU0VSVkVfUEVSTSkpICsgMCwgLy8gbm8tc2FtZS1wZXJtaXNzaW9ucworCU9QVF9PVkVSV1JJVEUgICAgICAgPSBJRl9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMoKDEgPDwgT1BUQklUX09WRVJXUklURSAgICAgICkpICsgMCwgLy8gb3ZlcndyaXRlCit9OworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIHRhcl9sb25nb3B0c1tdIEFMSUdOMSA9CisJImxpc3RcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisJImV4dHJhY3RcMCIgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIngiCisJImRpcmVjdG9yeVwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkMiCisJImZpbGVcMCIgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImYiCisJInRvLXN0ZG91dFwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIk8iCisJLyogZG8gbm90IHJlc3RvcmUgb3duZXIgKi8KKwkvKiBOb3RlOiBHTlUgdGFyIGhhbmRsZXMgJ28nIGFzIG5vLXNhbWUtb3duZXIgb25seSBvbiBleHRyYWN0LAorCSAqIG9uIGNyZWF0ZSwgJ28nIGlzIC0tb2xkLWFyY2hpdmUuIFdlIGRvIG5vdCBzdXBwb3J0IC0tb2xkLWFyY2hpdmUuICovCisJIm5vLXNhbWUtb3duZXJcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm8iCisJInNhbWUtcGVybWlzc2lvbnNcMCIgICAgTm9fYXJndW1lbnQgICAgICAgInAiCisJInZlcmJvc2VcMCIgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJImtlZXAtb2xkXDAiICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImsiCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9DUkVBVEUKKwkiY3JlYXRlXDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkiZGVyZWZlcmVuY2VcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiaCIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJImJ6aXAyXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImoiCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwkibHptYVwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYSIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwkiZmlsZXMtZnJvbVwwIiAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiVCIKKwkiZXhjbHVkZS1mcm9tXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWCIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwkiZ3ppcFwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAieiIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWgorCSJjb21wcmVzc1wwIiAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJaIgorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FCisJInRvdWNoXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm0iCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9UT19DT01NQU5ECisJInRvLWNvbW1hbmRcMCIJCVJlcXVpcmVkX2FyZ3VtZW50ICJceGZiIgorIyBlbmRpZgorCS8qIHVzZSBudW1lcmljIHVpZC9naWQgZnJvbSB0YXIgaGVhZGVyLCBub3QgdGV4dHVhbCAqLworCSJudW1lcmljLW93bmVyXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZjIgorCS8qIGRvIG5vdCByZXN0b3JlIG1vZGUgKi8KKwkibm8tc2FtZS1wZXJtaXNzaW9uc1wwIiBOb19hcmd1bWVudCAgICAgICAiXHhmZCIKKwkvKiBvbiB1bnBhY2ssIG9wZW4gd2l0aCBPX1RSVU5DIGFuZCAhT19FWENMICovCisJIm92ZXJ3cml0ZVwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmUiCisJLyogLS1leGNsdWRlIHRha2VzIG5leHQgYml0IHBvc2l0aW9uIGluIG9wdGlvbiBtYXNrLCAqLworCS8qIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHB1dCBpdCBfYWZ0ZXJfIC0tbm8tc2FtZS1wZXJtaXNzaW9ucyAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorCSJleGNsdWRlXDAiICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJceGZmIgorIyBlbmRpZgorCTsKKyNlbmRpZgorCitpbnQgdGFyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0YXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgRkFTVF9GVU5DICgqZ2V0X2hlYWRlcl9wdHIpKGFyY2hpdmVfaGFuZGxlX3QgKikgPSBnZXRfaGVhZGVyX3RhcjsKKwlhcmNoaXZlX2hhbmRsZV90ICp0YXJfaGFuZGxlOworCWNoYXIgKmJhc2VfZGlyID0gTlVMTDsKKwljb25zdCBjaGFyICp0YXJfZmlsZW5hbWUgPSAiLSI7CisJdW5zaWduZWQgb3B0OworCWludCB2ZXJib3NlRmxhZyA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyAmJiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorCWxsaXN0X3QgKmV4Y2x1ZGVzID0gTlVMTDsKKyNlbmRpZgorCisJLyogSW5pdGlhbGlzZSBkZWZhdWx0IHZhbHVlcyAqLworCXRhcl9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCXRhcl9oYW5kbGUtPmFoX2ZsYWdzID0gQVJDSElWRV9DUkVBVEVfTEVBRElOR19ESVJTCisJICAgICAgICAgICAgICAgICAgICAgfCBBUkNISVZFX1JFU1RPUkVfREFURQorCSAgICAgICAgICAgICAgICAgICAgIHwgQVJDSElWRV9VTkxJTktfT0xEOworCisJLyogQXBwYXJlbnRseSBvbmx5IHJvb3QncyB0YXIgcHJlc2VydmVzIHBlcm1zIChzZWUgYnVnIDM4NDQpICovCisJaWYgKGdldHVpZCgpICE9IDApCisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfRE9OVF9SRVNUT1JFX1BFUk07CisKKwkvKiBQcmVwZW5kICctJyB0byB0aGUgZmlyc3QgYXJndW1lbnQgaWYgcmVxdWlyZWQgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItLToiIC8vIGZpcnN0IGFyZyBpcyBvcHRpb25zCisJCSJ0dDp2djoiIC8vIGNvdW50IC10LC12CisJCUlGX0ZFQVRVUkVfVEFSX0ZST00oIlg6OlQ6OiIpIC8vIGN1bXVsYXRpdmUgbGlzdHMKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TICYmIEVOQUJMRV9GRUFUVVJFX1RBUl9GUk9NCisJCSJceGZmOjoiIC8vIGN1bXVsYXRpdmUgbGlzdHMgZm9yIC0tZXhjbHVkZQorI2VuZGlmCisJCUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgiYzoiKSAidDp4OiIgLy8gYXQgbGVhc3Qgb25lIG9mIHRoZXNlIGlzIHJlcWQKKwkJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJjLS10eDp0LS1jeDp4LS1jdCIpIC8vIG11dHVhbGx5IGV4Y2x1c2l2ZQorCQlJRl9OT1RfRkVBVFVSRV9UQVJfQ1JFQVRFKCJ0LS14OngtLXQiKTsgLy8gbXV0dWFsbHkgZXhjbHVzaXZlCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSB0YXJfbG9uZ29wdHM7CisjZW5kaWYKKyNpZiBFTkFCTEVfREVTS1RPUAorCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gIT0gJy0nKSB7CisJCS8qIENvbXBhdDoKKwkJICogMXN0IGFyZ3VtZW50IHdpdGhvdXQgZGFzaCBoYW5kbGVzIG9wdGlvbnMgd2l0aCBwYXJhbWV0ZXJzCisJCSAqIGRpZmZlcmVudGx5IGZyb20gZGFzaGVkIG9uZTogaXQgdGFrZXMgKm5leHQgYXJndltpXSoKKwkJICogYXMgcGFyYW1lbnRlciBldmVuIGlmIHRoZXJlIGFyZSBtb3JlIGNoYXJzIGluIDFzdCBhcmd1bWVudDoKKwkJICogICJ0YXIgZnggVEFSRklMRSIgLSAieCIgaXMgbm90IHRha2VuIGFzIGYncyBwYXJhbQorCQkgKiAgYnV0IGlzIGludGVycHJldGVkIGFzIC14IG9wdGlvbgorCQkgKiAgInRhciAteGYgVEFSRklMRSIgLSBkYXNoZWQgZXF1aXZhbGVudCBvZiB0aGUgYWJvdmUKKwkJICogICJ0YXIgLWZ4IC4uLiIgLSAieCIgaXMgdGFrZW4gYXMgZidzIHBhcmFtCisJCSAqIGdldG9wdDMyIHdvdWxkbid0IGhhbmRsZSAxc3QgY29tbWFuZCBjb3JyZWN0bHkuCisJCSAqIFVuZm9ydHVuYXRlbHksIHBlb3BsZSBkbyB1c2Ugc3VjaCBjb21tYW5kcy4KKwkJICogV2UgbWFzc2FnZSBhcmd2WzFdIHRvIHdvcmsgYXJvdW5kIGl0IGJ5IG1vdmluZyAnZicKKwkJICogdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCQkgKiBNb3JlIGNvbnRyaXZlZCAidGFyIGZDeCBUQVJGSUxFIERJUiIgc3RpbGwgZmFpbHMsCisJCSAqIGJ1dCBzdWNoIGNvbW1hbmRzIGFyZSBtdWNoIGxlc3MgbGlrZWx5IHRvIGJlIHVzZWQuCisJCSAqLworCQljaGFyICpmID0gc3RyY2hyKGFyZ3ZbMV0sICdmJyk7CisJCWlmIChmKSB7CisJCQl3aGlsZSAoZlsxXSAhPSAnXDAnKSB7CisJCQkJKmYgPSBmWzFdOworCQkJCWYrKzsKKwkJCX0KKwkJCSpmID0gJ2YnOworCQl9CisJfQorI2VuZGlmCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwKKwkJInR4QzpmOk9vcHZrIgorCQlJRl9GRUFUVVJFX1RBUl9DUkVBVEUoICAgImNoIiAgKQorCQlJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMiggImoiICAgKQorCQlJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoImEiICAgKQorCQlJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgIlQ6WDoiKQorCQlJRl9GRUFUVVJFX1NFQU1MRVNTX0daKCAgInoiICAgKQorCQlJRl9GRUFUVVJFX1NFQU1MRVNTX1ooICAgIloiICAgKQorCQlJRl9GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUoIm0iKQorCQksICZiYXNlX2RpciAvLyAtQyBkaXIKKwkJLCAmdGFyX2ZpbGVuYW1lIC8vIC1mIGZpbGVuYW1lCisJCUlGX0ZFQVRVUkVfVEFSX0ZST00oLCAmKHRhcl9oYW5kbGUtPmFjY2VwdCkpIC8vIFQKKwkJSUZfRkVBVFVSRV9UQVJfRlJPTSgsICYodGFyX2hhbmRsZS0+cmVqZWN0KSkgLy8gWAorCQlJRl9GRUFUVVJFX1RBUl9UT19DT01NQU5EKCwgJih0YXJfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmQpKSAvLyAtLXRvLWNvbW1hbmQKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TICYmIEVOQUJMRV9GRUFUVVJFX1RBUl9GUk9NCisJCSwgJmV4Y2x1ZGVzIC8vIC0tZXhjbHVkZQorI2VuZGlmCisJCSwgJnZlcmJvc2VGbGFnIC8vIGNvbWJpbmVkIGNvdW50IGZvciAtdCBhbmQgLXYKKwkJLCAmdmVyYm9zZUZsYWcgLy8gY29tYmluZWQgY291bnQgZm9yIC10IGFuZCAtdgorCQkpOworCS8vYmJfZXJyb3JfbXNnKCJvcHQ6JTA4eCIsIG9wdCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAodmVyYm9zZUZsYWcpIHRhcl9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPSBoZWFkZXJfdmVyYm9zZV9saXN0OworCWlmICh2ZXJib3NlRmxhZyA9PSAxKSB0YXJfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisKKwlpZiAob3B0ICYgT1BUX0VYVFJBQ1QpCisJCXRhcl9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKworCWlmIChvcHQgJiBPUFRfMlNURE9VVCkKKwkJdGFyX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfdG9fc3Rkb3V0OworCisJaWYgKG9wdCAmIE9QVF8yQ09NTUFORCkgeworCQlwdXRlbnYoKGNoYXIqKSJUQVJfRklMRVRZUEU9ZiIpOworCQlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisJCXRhcl9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX2NvbW1hbmQ7CisJCUlGX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQodGFyX2hhbmRsZS0+dGFyX190b19jb21tYW5kX3NoZWxsID0geHN0cmR1cChnZXRfc2hlbGxfbmFtZSgpKTspCisJfQorCisJaWYgKG9wdCAmIE9QVF9LRUVQX09MRCkKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgJj0gfkFSQ0hJVkVfVU5MSU5LX09MRDsKKworCWlmIChvcHQgJiBPUFRfTlVNRVJJQ19PV05FUikKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9OVU1FUklDX09XTkVSOworCisJaWYgKG9wdCAmIE9QVF9OT1BSRVNFUlZFX09XTkVSKQorCQl0YXJfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX0RPTlRfUkVTVE9SRV9PV05FUjsKKworCWlmIChvcHQgJiBPUFRfTk9QUkVTRVJWRV9QRVJNKQorCQl0YXJfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX0RPTlRfUkVTVE9SRV9QRVJNOworCisJaWYgKG9wdCAmIE9QVF9PVkVSV1JJVEUpIHsKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgJj0gfkFSQ0hJVkVfVU5MSU5LX09MRDsKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9PX1RSVU5DOworCX0KKworCWlmIChvcHQgJiBPUFRfR1pJUCkKKwkJZ2V0X2hlYWRlcl9wdHIgPSBnZXRfaGVhZGVyX3Rhcl9nejsKKworCWlmIChvcHQgJiBPUFRfQlpJUDIpCisJCWdldF9oZWFkZXJfcHRyID0gZ2V0X2hlYWRlcl90YXJfYnoyOworCisJaWYgKG9wdCAmIE9QVF9MWk1BKQorCQlnZXRfaGVhZGVyX3B0ciA9IGdldF9oZWFkZXJfdGFyX2x6bWE7CisKKwlpZiAob3B0ICYgT1BUX0NPTVBSRVNTKQorCQlnZXRfaGVhZGVyX3B0ciA9IGdldF9oZWFkZXJfdGFyX1o7CisKKwlpZiAob3B0ICYgT1BUX05PUFJFU0VSVkVfVElNRSkKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgJj0gfkFSQ0hJVkVfUkVTVE9SRV9EQVRFOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwl0YXJfaGFuZGxlLT5yZWplY3QgPSBhcHBlbmRfZmlsZV9saXN0X3RvX2xpc3QodGFyX2hhbmRsZS0+cmVqZWN0KTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUworCS8qIEFwcGVuZCBleGNsdWRlcyB0byByZWplY3QgKi8KKwl3aGlsZSAoZXhjbHVkZXMpIHsKKwkJbGxpc3RfdCAqbmV4dCA9IGV4Y2x1ZGVzLT5saW5rOworCQlleGNsdWRlcy0+bGluayA9IHRhcl9oYW5kbGUtPnJlamVjdDsKKwkJdGFyX2hhbmRsZS0+cmVqZWN0ID0gZXhjbHVkZXM7CisJCWV4Y2x1ZGVzID0gbmV4dDsKKwl9CisjIGVuZGlmCisJdGFyX2hhbmRsZS0+YWNjZXB0ID0gYXBwZW5kX2ZpbGVfbGlzdF90b19saXN0KHRhcl9oYW5kbGUtPmFjY2VwdCk7CisjZW5kaWYKKworCS8qIFNldHVwIGFuIGFycmF5IG9mIGZpbGVuYW1lcyB0byB3b3JrIHdpdGggKi8KKwkvKiBUT0RPOiBUaGlzIGlzIHRoZSBzYW1lIGFzIGluIGFyLCBtYWtlIGEgc2VwYXJhdGUgZnVuY3Rpb24/ICovCisJd2hpbGUgKCphcmd2KSB7CisJCS8qIGtpbGwgdHJhaWxpbmcgJy8nIHVubGVzcyB0aGUgc3RyaW5nIGlzIGp1c3QgIi8iICovCisJCWNoYXIgKmNwID0gbGFzdF9jaGFyX2lzKCphcmd2LCAnLycpOworCQlpZiAoY3AgPiAqYXJndikKKwkJCSpjcCA9ICdcMCc7CisJCWxsaXN0X2FkZF90b19lbmQoJnRhcl9oYW5kbGUtPmFjY2VwdCwgKmFyZ3YpOworCQlhcmd2Kys7CisJfQorCisJaWYgKHRhcl9oYW5kbGUtPmFjY2VwdCB8fCB0YXJfaGFuZGxlLT5yZWplY3QpCisJCXRhcl9oYW5kbGUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3Q7CisKKwkvKiBPcGVuIHRoZSB0YXIgZmlsZSAqLworCXsKKwkJaW50IHRhcl9mZCA9IFNURElOX0ZJTEVOTzsKKwkJaW50IGZsYWdzID0gT19SRE9OTFk7CisKKwkJaWYgKG9wdCAmIE9QVF9DUkVBVEUpIHsKKwkJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZmlsZSB0byB0YXIgdXAgKi8KKwkJCWlmICh0YXJfaGFuZGxlLT5hY2NlcHQgPT0gTlVMTCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZW1wdHkgYXJjaGl2ZSIpOworCisJCQl0YXJfZmQgPSBTVERPVVRfRklMRU5POworCQkJLyogTWltaWNraW5nIEdOVSB0YXIgMS4xNS4xOiAqLworCQkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DOworCQl9CisKKwkJaWYgKExPTkVfREFTSCh0YXJfZmlsZW5hbWUpKSB7CisJCQl0YXJfaGFuZGxlLT5zcmNfZmQgPSB0YXJfZmQ7CisJCQl0YXJfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCQl9IGVsc2UgeworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1RBUl9BVVRPREVURUNUCisJCQkgJiYgZmxhZ3MgPT0gT19SRE9OTFkKKwkJCSAmJiBnZXRfaGVhZGVyX3B0ciA9PSBnZXRfaGVhZGVyX3RhcgorCQkJKSB7CisJCQkJdGFyX2hhbmRsZS0+c3JjX2ZkID0gb3Blbl96aXBwZWQodGFyX2ZpbGVuYW1lKTsKKwkJCQlpZiAodGFyX2hhbmRsZS0+c3JjX2ZkIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCB0YXJfZmlsZW5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQl0YXJfaGFuZGxlLT5zcmNfZmQgPSB4b3Blbih0YXJfZmlsZW5hbWUsIGZsYWdzKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChiYXNlX2RpcikKKwkJeGNoZGlyKGJhc2VfZGlyKTsKKworI2lmZGVmIENIRUNLX0ZPUl9DSElMRF9FWElUQ09ERQorCS8qIFdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIGNoaWxkIChnemlwL2J6aXAvZXRjKSBleGl0cyBhYm5vcm1hbGx5ICovCisJc2lnbmFsKFNJR0NITEQsIGhhbmRsZV9TSUdDSExEKTsKKyNlbmRpZgorCisJLyogQ3JlYXRlIGFuIGFyY2hpdmUgKi8KKwlpZiAob3B0ICYgT1BUX0NSRUFURSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCQlpbnQgemlwTW9kZSA9IDA7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiAmJiAob3B0ICYgT1BUX0daSVApKQorCQkJemlwTW9kZSA9IDE7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIgJiYgKG9wdCAmIE9QVF9CWklQMikpCisJCQl6aXBNb2RlID0gMjsKKyNlbmRpZgorCQkvKiBOQjogd3JpdGVUYXJGaWxlKCkgY2xvc2VzIHRhcl9oYW5kbGUtPnNyY19mZCAqLworCQlyZXR1cm4gd3JpdGVUYXJGaWxlKHRhcl9oYW5kbGUtPnNyY19mZCwgdmVyYm9zZUZsYWcsIG9wdCAmIE9QVF9ERVJFRkVSRU5DRSwKKwkJCQl0YXJfaGFuZGxlLT5hY2NlcHQsCisJCQkJdGFyX2hhbmRsZS0+cmVqZWN0LCB6aXBNb2RlKTsKKwl9CisKKwl3aGlsZSAoZ2V0X2hlYWRlcl9wdHIodGFyX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKKworCS8qIENoZWNrIHRoYXQgZXZlcnkgZmlsZSB0aGF0IHNob3VsZCBoYXZlIGJlZW4gZXh0cmFjdGVkIHdhcyAqLworCXdoaWxlICh0YXJfaGFuZGxlLT5hY2NlcHQpIHsKKwkJaWYgKCFmaW5kX2xpc3RfZW50cnkodGFyX2hhbmRsZS0+cmVqZWN0LCB0YXJfaGFuZGxlLT5hY2NlcHQtPmRhdGEpCisJCSAmJiAhZmluZF9saXN0X2VudHJ5KHRhcl9oYW5kbGUtPnBhc3NlZCwgdGFyX2hhbmRsZS0+YWNjZXB0LT5kYXRhKQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGZvdW5kIGluIGFyY2hpdmUiLAorCQkJCXRhcl9oYW5kbGUtPmFjY2VwdC0+ZGF0YSk7CisJCX0KKwkJdGFyX2hhbmRsZS0+YWNjZXB0ID0gdGFyX2hhbmRsZS0+YWNjZXB0LT5saW5rOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgLyogJiYgdGFyX2hhbmRsZS0+c3JjX2ZkICE9IFNURElOX0ZJTEVOTyAqLykKKwkJY2xvc2UodGFyX2hhbmRsZS0+c3JjX2ZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC91bnppcC5jIGIvYXJjaGl2YWwvdW56aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE3MjkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvdW56aXAuYwpAQCAtMCwwICsxLDcwMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB1bnppcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBFZCBDbGFyaworICoKKyAqIExvb3NlbHkgYmFzZWQgb24gb3JpZ2luYWwgYnVzeWJveCB1bnppcCBhcHBsZXQgYnkgTGF1cmVuY2UgQW5kZXJzb24uCisgKiBBbGwgb3B0aW9ucyBhbmQgZmVhdHVyZXMgc2hvdWxkIHdvcmsgaW4gdGhpcyB2ZXJzaW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogRm9yIHJlZmVyZW5jZSBzZWUKKyAqIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9jb21wYW55L3N0YW5kYXJkcy9hcHBub3RlLworICogaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvZG9jL2FwcG5vdGUtaXotbGF0ZXN0LnppcAorICovCisKKy8qIFRPRE8KKyAqIFppcDY0ICsgb3RoZXIgbWV0aG9kcworICovCisKKy8vdXNhZ2U6I2RlZmluZSB1bnppcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vcHRzW21vZGlmaWVyc11dIEZJTEVbLnppcF0gW0xJU1RdIFsteCBYTElTVF0gWy1kIERJUl0iCisvL3VzYWdlOiNkZWZpbmUgdW56aXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFeHRyYWN0IGZpbGVzIGZyb20gWklQIGFyY2hpdmVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYXJjaGl2ZSBjb250ZW50cyAod2l0aCAtcSBmb3Igc2hvcnQgZm9ybSkiCisvL3VzYWdlOiAgICAgIlxuCS1uCU5ldmVyIG92ZXJ3cml0ZSBmaWxlcyAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1vCU92ZXJ3cml0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJU2VuZCBvdXRwdXQgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXggWExTVAlFeGNsdWRlIHRoZXNlIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktZCBESVIJRXh0cmFjdCBmaWxlcyBpbnRvIERJUiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYXJjaGl2ZS5oIgorCitlbnVtIHsKKyNpZiBCQl9CSUdfRU5ESUFOCisJWklQX0ZJTEVIRUFERVJfTUFHSUMgPSAweDUwNGIwMzA0LAorCVpJUF9DREZfTUFHSUMgICAgICAgID0gMHg1MDRiMDEwMiwgLyogY2VudHJhbCBkaXJlY3RvcnkncyBmaWxlIGhlYWRlciAqLworCVpJUF9DREVfTUFHSUMgICAgICAgID0gMHg1MDRiMDUwNiwgLyogImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIgcmVjb3JkICovCisJWklQX0REX01BR0lDICAgICAgICAgPSAweDUwNGIwNzA4LAorI2Vsc2UKKwlaSVBfRklMRUhFQURFUl9NQUdJQyA9IDB4MDQwMzRiNTAsCisJWklQX0NERl9NQUdJQyAgICAgICAgPSAweDAyMDE0YjUwLAorCVpJUF9DREVfTUFHSUMgICAgICAgID0gMHgwNjA1NGI1MCwKKwlaSVBfRERfTUFHSUMgICAgICAgICA9IDB4MDgwNzRiNTAsCisjZW5kaWYKK307CisKKyNkZWZpbmUgWklQX0hFQURFUl9MRU4gMjYKKwordHlwZWRlZiB1bmlvbiB7CisJdWludDhfdCByYXdbWklQX0hFQURFUl9MRU5dOworCXN0cnVjdCB7CisJCXVpbnQxNl90IHZlcnNpb247ICAgICAgICAgICAgICAgLyogMC0xICovCisJCXVpbnQxNl90IHppcF9mbGFnczsgICAgICAgICAgICAgLyogMi0zICovCisJCXVpbnQxNl90IG1ldGhvZDsgICAgICAgICAgICAgICAgLyogNC01ICovCisJCXVpbnQxNl90IG1vZHRpbWU7ICAgICAgICAgICAgICAgLyogNi03ICovCisJCXVpbnQxNl90IG1vZGRhdGU7ICAgICAgICAgICAgICAgLyogOC05ICovCisJCXVpbnQzMl90IGNyYzMyIFBBQ0tFRDsgICAgICAgICAgLyogMTAtMTMgKi8KKwkJdWludDMyX3QgY21wc2l6ZSBQQUNLRUQ7ICAgICAgICAvKiAxNC0xNyAqLworCQl1aW50MzJfdCB1Y21wc2l6ZSBQQUNLRUQ7ICAgICAgIC8qIDE4LTIxICovCisJCXVpbnQxNl90IGZpbGVuYW1lX2xlbjsgICAgICAgICAgLyogMjItMjMgKi8KKwkJdWludDE2X3QgZXh0cmFfbGVuOyAgICAgICAgICAgICAvKiAyNC0yNSAqLworCX0gZm9ybWF0dGVkIFBBQ0tFRDsKK30gemlwX2hlYWRlcl90OyAvKiBQQUNLRUQgLSBnY2MgNC4yLjEgZG9lc24ndCBsaWtlIGl0IChzcGV3cyB3YXJuaW5nKSAqLworCisvKiBDaGVjayB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IGVsZW1lbnQsIG5vdCB0aGUgbGVuZ3RoLiAgVGhpcyBsZW5pZW5jeQorICogYWxsb3dzIGZvciBwb29yIHBhY2tpbmcsIHdoZXJlYnkgdGhlIG92ZXJhbGwgc3RydWN0IG1heSBiZSB0b28gbG9uZywKKyAqIGV2ZW4gdGhvdWdoIHRoZSBlbGVtZW50cyBhcmUgYWxsIGluIHRoZSByaWdodCBwbGFjZS4KKyAqLworc3RydWN0IEJVR196aXBfaGVhZGVyX211c3RfYmVfMjZfYnl0ZXMgeworCWNoYXIgQlVHX3ppcF9oZWFkZXJfbXVzdF9iZV8yNl9ieXRlc1sKKwkJb2Zmc2V0b2YoemlwX2hlYWRlcl90LCBmb3JtYXR0ZWQuZXh0cmFfbGVuKSArIDIKKwkJCT09IFpJUF9IRUFERVJfTEVOID8gMSA6IC0xXTsKK307CisKKyNkZWZpbmUgRklYX0VORElBTk5FU1NfWklQKHppcF9oZWFkZXIpIGRvIHsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQudmVyc2lvbiAgICAgID0gU1dBUF9MRTE2KCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQudmVyc2lvbiAgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQubWV0aG9kICAgICAgID0gU1dBUF9MRTE2KCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQubWV0aG9kICAgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQubW9kdGltZSAgICAgID0gU1dBUF9MRTE2KCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQubW9kdGltZSAgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQubW9kZGF0ZSAgICAgID0gU1dBUF9MRTE2KCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQubW9kZGF0ZSAgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuY3JjMzIgICAgICAgID0gU1dBUF9MRTMyKCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuY3JjMzIgICAgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuY21wc2l6ZSAgICAgID0gU1dBUF9MRTMyKCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuY21wc2l6ZSAgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQudWNtcHNpemUgICAgID0gU1dBUF9MRTMyKCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQudWNtcHNpemUgICAgKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuZmlsZW5hbWVfbGVuID0gU1dBUF9MRTE2KCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuZmlsZW5hbWVfbGVuKTsgXAorCSh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuZXh0cmFfbGVuICAgID0gU1dBUF9MRTE2KCh6aXBfaGVhZGVyKS5mb3JtYXR0ZWQuZXh0cmFfbGVuICAgKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDREZfSEVBREVSX0xFTiA0MgorCit0eXBlZGVmIHVuaW9uIHsKKwl1aW50OF90IHJhd1tDREZfSEVBREVSX0xFTl07CisJc3RydWN0IHsKKwkJLyogdWludDMyX3Qgc2lnbmF0dXJlOyA1MCA0YiAwMSAwMiAqLworCQl1aW50MTZfdCB2ZXJzaW9uX21hZGVfYnk7ICAgICAgIC8qIDAtMSAqLworCQl1aW50MTZfdCB2ZXJzaW9uX25lZWRlZDsgICAgICAgIC8qIDItMyAqLworCQl1aW50MTZfdCBjZGZfZmxhZ3M7ICAgICAgICAgICAgIC8qIDQtNSAqLworCQl1aW50MTZfdCBtZXRob2Q7ICAgICAgICAgICAgICAgIC8qIDYtNyAqLworCQl1aW50MTZfdCBtdGltZTsgICAgICAgICAgICAgICAgIC8qIDgtOSAqLworCQl1aW50MTZfdCBtZGF0ZTsgICAgICAgICAgICAgICAgIC8qIDEwLTExICovCisJCXVpbnQzMl90IGNyYzMyOyAgICAgICAgICAgICAgICAgLyogMTItMTUgKi8KKwkJdWludDMyX3QgY21wc2l6ZTsgICAgICAgICAgICAgICAvKiAxNi0xOSAqLworCQl1aW50MzJfdCB1Y21wc2l6ZTsgICAgICAgICAgICAgIC8qIDIwLTIzICovCisJCXVpbnQxNl90IGZpbGVfbmFtZV9sZW5ndGg7ICAgICAgLyogMjQtMjUgKi8KKwkJdWludDE2X3QgZXh0cmFfZmllbGRfbGVuZ3RoOyAgICAvKiAyNi0yNyAqLworCQl1aW50MTZfdCBmaWxlX2NvbW1lbnRfbGVuZ3RoOyAgIC8qIDI4LTI5ICovCisJCXVpbnQxNl90IGRpc2tfbnVtYmVyX3N0YXJ0OyAgICAgLyogMzAtMzEgKi8KKwkJdWludDE2X3QgaW50ZXJuYWxfZmlsZV9hdHRyaWJ1dGVzOyAvKiAzMi0zMyAqLworCQl1aW50MzJfdCBleHRlcm5hbF9maWxlX2F0dHJpYnV0ZXMgUEFDS0VEOyAvKiAzNC0zNyAqLworCQl1aW50MzJfdCByZWxhdGl2ZV9vZmZzZXRfb2ZfbG9jYWxfaGVhZGVyIFBBQ0tFRDsgLyogMzgtNDEgKi8KKwl9IGZvcm1hdHRlZCBQQUNLRUQ7Cit9IGNkZl9oZWFkZXJfdDsKKworc3RydWN0IEJVR19jZGZfaGVhZGVyX211c3RfYmVfNDJfYnl0ZXMgeworCWNoYXIgQlVHX2NkZl9oZWFkZXJfbXVzdF9iZV80Ml9ieXRlc1sKKwkJb2Zmc2V0b2YoY2RmX2hlYWRlcl90LCBmb3JtYXR0ZWQucmVsYXRpdmVfb2Zmc2V0X29mX2xvY2FsX2hlYWRlcikgKyA0CisJCQk9PSBDREZfSEVBREVSX0xFTiA/IDEgOiAtMV07Cit9OworCisjZGVmaW5lIEZJWF9FTkRJQU5ORVNTX0NERihjZGZfaGVhZGVyKSBkbyB7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmNyYzMyICAgICAgICA9IFNXQVBfTEUzMigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmNyYzMyICAgICAgICk7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmNtcHNpemUgICAgICA9IFNXQVBfTEUzMigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmNtcHNpemUgICAgICk7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLnVjbXBzaXplICAgICA9IFNXQVBfTEUzMigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLnVjbXBzaXplICAgICk7IFwKKwkoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmZpbGVfbmFtZV9sZW5ndGggPSBTV0FQX0xFMTYoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5maWxlX25hbWVfbGVuZ3RoKTsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZXh0cmFfZmllbGRfbGVuZ3RoID0gU1dBUF9MRTE2KChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZXh0cmFfZmllbGRfbGVuZ3RoKTsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZmlsZV9jb21tZW50X2xlbmd0aCA9IFNXQVBfTEUxNigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmZpbGVfY29tbWVudF9sZW5ndGgpOyBcCisJSUZfREVTS1RPUCggXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQudmVyc2lvbl9tYWRlX2J5ID0gU1dBUF9MRTE2KChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQudmVyc2lvbl9tYWRlX2J5KTsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZXh0ZXJuYWxfZmlsZV9hdHRyaWJ1dGVzID0gU1dBUF9MRTMyKChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZXh0ZXJuYWxfZmlsZV9hdHRyaWJ1dGVzKTsgXAorCSkgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDREVfSEVBREVSX0xFTiAxNgorCit0eXBlZGVmIHVuaW9uIHsKKwl1aW50OF90IHJhd1tDREVfSEVBREVSX0xFTl07CisJc3RydWN0IHsKKwkJLyogdWludDMyX3Qgc2lnbmF0dXJlOyA1MCA0YiAwNSAwNiAqLworCQl1aW50MTZfdCB0aGlzX2Rpc2tfbm87CisJCXVpbnQxNl90IGRpc2tfd2l0aF9jZGZfbm87CisJCXVpbnQxNl90IGNkZl9lbnRyaWVzX29uX3RoaXNfZGlzazsKKwkJdWludDE2X3QgY2RmX2VudHJpZXNfdG90YWw7CisJCXVpbnQzMl90IGNkZl9zaXplOworCQl1aW50MzJfdCBjZGZfb2Zmc2V0OworCQkvKiB1aW50MTZfdCBmaWxlX2NvbW1lbnRfbGVuZ3RoOyAqLworCQkvKiAuWklQIGZpbGUgY29tbWVudCAodmFyaWFibGUgc2l6ZSkgKi8KKwl9IGZvcm1hdHRlZCBQQUNLRUQ7Cit9IGNkZV9oZWFkZXJfdDsKKworc3RydWN0IEJVR19jZGVfaGVhZGVyX211c3RfYmVfMTZfYnl0ZXMgeworCWNoYXIgQlVHX2NkZV9oZWFkZXJfbXVzdF9iZV8xNl9ieXRlc1sKKwkJc2l6ZW9mKGNkZV9oZWFkZXJfdCkgPT0gQ0RFX0hFQURFUl9MRU4gPyAxIDogLTFdOworfTsKKworI2RlZmluZSBGSVhfRU5ESUFOTkVTU19DREUoY2RlX2hlYWRlcikgZG8geyBcCisJKGNkZV9oZWFkZXIpLmZvcm1hdHRlZC5jZGZfb2Zmc2V0ID0gU1dBUF9MRTMyKChjZGVfaGVhZGVyKS5mb3JtYXR0ZWQuY2RmX29mZnNldCk7IFwKK30gd2hpbGUgKDApCisKK2VudW0geyB6aXBfZmQgPSAzIH07CisKKworI2lmIEVOQUJMRV9ERVNLVE9QCisKKyNkZWZpbmUgUEVFS19GUk9NX0VORCAxNjM4NAorCisvKiBOQjogZG9lcyBub3QgcHJlc2VydmUgZmlsZSBwb3NpdGlvbiEgKi8KK3N0YXRpYyB1aW50MzJfdCBmaW5kX2NkZl9vZmZzZXQodm9pZCkKK3sKKwljZGVfaGVhZGVyX3QgY2RlX2hlYWRlcjsKKwl1bnNpZ25lZCBjaGFyICpwOworCW9mZl90IGVuZDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSB4emFsbG9jKFBFRUtfRlJPTV9FTkQpOworCisJZW5kID0geGxzZWVrKHppcF9mZCwgMCwgU0VFS19FTkQpOworCWVuZCAtPSBQRUVLX0ZST01fRU5EOworCWlmIChlbmQgPCAwKQorCQllbmQgPSAwOworCXhsc2Vlayh6aXBfZmQsIGVuZCwgU0VFS19TRVQpOworCWZ1bGxfcmVhZCh6aXBfZmQsIGJ1ZiwgUEVFS19GUk9NX0VORCk7CisKKwlwID0gYnVmOworCXdoaWxlIChwIDw9IGJ1ZiArIFBFRUtfRlJPTV9FTkQgLSBDREVfSEVBREVSX0xFTiAtIDQpIHsKKwkJaWYgKCpwICE9ICdQJykgeworCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCorK3AgIT0gJ0snKQorCQkJY29udGludWU7CisJCWlmICgqKytwICE9IDUpCisJCQljb250aW51ZTsKKwkJaWYgKCorK3AgIT0gNikKKwkJCWNvbnRpbnVlOworCQkvKiB3ZSBmb3VuZCBDREUhICovCisJCW1lbWNweShjZGVfaGVhZGVyLnJhdywgcCArIDEsIENERV9IRUFERVJfTEVOKTsKKwkJRklYX0VORElBTk5FU1NfQ0RFKGNkZV9oZWFkZXIpOworCQlmcmVlKGJ1Zik7CisJCXJldHVybiBjZGVfaGVhZGVyLmZvcm1hdHRlZC5jZGZfb2Zmc2V0OworCX0KKwkvL2ZyZWUoYnVmKTsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBmaWxlIHRhYmxlIik7Cit9OworCitzdGF0aWMgdWludDMyX3QgcmVhZF9uZXh0X2NkZih1aW50MzJfdCBjZGZfb2Zmc2V0LCBjZGZfaGVhZGVyX3QgKmNkZl9wdHIpCit7CisJb2ZmX3Qgb3JnOworCisJb3JnID0geGxzZWVrKHppcF9mZCwgMCwgU0VFS19DVVIpOworCisJaWYgKCFjZGZfb2Zmc2V0KQorCQljZGZfb2Zmc2V0ID0gZmluZF9jZGZfb2Zmc2V0KCk7CisKKwl4bHNlZWsoemlwX2ZkLCBjZGZfb2Zmc2V0ICsgNCwgU0VFS19TRVQpOworCXhyZWFkKHppcF9mZCwgY2RmX3B0ci0+cmF3LCBDREZfSEVBREVSX0xFTik7CisJRklYX0VORElBTk5FU1NfQ0RGKCpjZGZfcHRyKTsKKwljZGZfb2Zmc2V0ICs9IDQgKyBDREZfSEVBREVSX0xFTgorCQkrIGNkZl9wdHItPmZvcm1hdHRlZC5maWxlX25hbWVfbGVuZ3RoCisJCSsgY2RmX3B0ci0+Zm9ybWF0dGVkLmV4dHJhX2ZpZWxkX2xlbmd0aAorCQkrIGNkZl9wdHItPmZvcm1hdHRlZC5maWxlX2NvbW1lbnRfbGVuZ3RoOworCisJeGxzZWVrKHppcF9mZCwgb3JnLCBTRUVLX1NFVCk7CisJcmV0dXJuIGNkZl9vZmZzZXQ7Cit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVuemlwX3NraXAob2ZmX3Qgc2tpcCkKK3sKKwlpZiAobHNlZWsoemlwX2ZkLCBza2lwLCBTRUVLX0NVUikgPT0gKG9mZl90KS0xKQorCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZSh6aXBfZmQsIC0xLCBza2lwKTsKK30KKworc3RhdGljIHZvaWQgdW56aXBfY3JlYXRlX2xlYWRpbmdfZGlycyhjb25zdCBjaGFyICpmbikKK3sKKwkvKiBDcmVhdGUgYWxsIGxlYWRpbmcgZGlyZWN0b3JpZXMgKi8KKwljaGFyICpuYW1lID0geHN0cmR1cChmbik7CisJaWYgKGJiX21ha2VfZGlyZWN0b3J5KGRpcm5hbWUobmFtZSksIDA3NzcsIEZJTEVVVElMU19SRUNVUikpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImV4aXRpbmciKTsgLyogYmJfbWFrZV9kaXJlY3RvcnkgaXMgbm9pc3kgKi8KKwl9CisJZnJlZShuYW1lKTsKK30KKworc3RhdGljIHZvaWQgdW56aXBfZXh0cmFjdCh6aXBfaGVhZGVyX3QgKnppcF9oZWFkZXIsIGludCBkc3RfZmQpCit7CisJaWYgKHppcF9oZWFkZXItPmZvcm1hdHRlZC5tZXRob2QgPT0gMCkgeworCQkvKiBNZXRob2QgMCAtIHN0b3JlZCAobm90IGNvbXByZXNzZWQpICovCisJCW9mZl90IHNpemUgPSB6aXBfaGVhZGVyLT5mb3JtYXR0ZWQudWNtcHNpemU7CisJCWlmIChzaXplKQorCQkJYmJfY29weWZkX2V4YWN0X3NpemUoemlwX2ZkLCBkc3RfZmQsIHNpemUpOworCX0gZWxzZSB7CisJCS8qIE1ldGhvZCA4IC0gaW5mbGF0ZSAqLworCQlpbmZsYXRlX3VuemlwX3Jlc3VsdCByZXM7CisJCWlmIChpbmZsYXRlX3VuemlwKCZyZXMsIHppcF9oZWFkZXItPmZvcm1hdHRlZC5jbXBzaXplLCB6aXBfZmQsIGRzdF9mZCkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImluZmxhdGUgZXJyb3IiKTsKKwkJLyogVmFsaWRhdGUgZGVjb21wcmVzc2lvbiAtIGNyYyAqLworCQlpZiAoemlwX2hlYWRlci0+Zm9ybWF0dGVkLmNyYzMyICE9IChyZXMuY3JjIF4gMHhmZmZmZmZmZkwpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY3JjIGVycm9yIik7CisJCX0KKwkJLyogVmFsaWRhdGUgZGVjb21wcmVzc2lvbiAtIHNpemUgKi8KKwkJaWYgKHppcF9oZWFkZXItPmZvcm1hdHRlZC51Y21wc2l6ZSAhPSByZXMuYnl0ZXNfb3V0KSB7CisJCQkvKiBEb24ndCBkaWUuIFdobyBrbm93cywgbWF5YmUgbGVuIGNhbGN1bGF0aW9uCisJCQkgKiB3YXMgYm90Y2hlZCBzb21ld2hlcmUuIEFmdGVyIGFsbCwgY3JjIG1hdGNoZWQhICovCisJCQliYl9lcnJvcl9tc2coImJhZCBsZW5ndGgiKTsKKwkJfQorCX0KK30KKworaW50IHVuemlwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bnppcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsgT19QUk9NUFQsIE9fTkVWRVIsIE9fQUxXQVlTIH07CisKKwl6aXBfaGVhZGVyX3QgemlwX2hlYWRlcjsKKwlzbWFsbGludCBxdWlldCA9IDA7CisJSUZfTk9UX0RFU0tUT1AoY29uc3QpIHNtYWxsaW50IHZlcmJvc2UgPSAwOworCXNtYWxsaW50IGxpc3RpbmcgPSAwOworCXNtYWxsaW50IG92ZXJ3cml0ZSA9IE9fUFJPTVBUOworI2lmIEVOQUJMRV9ERVNLVE9QCisJdWludDMyX3QgY2RmX29mZnNldDsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgdG90YWxfdXNpemU7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOworCXVuc2lnbmVkIHRvdGFsX2VudHJpZXM7CisJaW50IGRzdF9mZCA9IC0xOworCWNoYXIgKnNyY19mbiA9IE5VTEw7CisJY2hhciAqZHN0X2ZuID0gTlVMTDsKKwlsbGlzdF90ICp6YWNjZXB0ID0gTlVMTDsKKwlsbGlzdF90ICp6cmVqZWN0ID0gTlVMTDsKKwljaGFyICpiYXNlX2RpciA9IE5VTEw7CisJaW50IGksIG9wdDsKKwlpbnQgb3B0X3JhbmdlID0gMDsKKwljaGFyIGtleV9idWZbODBdOworCXN0cnVjdCBzdGF0IHN0YXRfYnVmOworCisvKiAtcSwgLWwgYW5kIC12OiBVblppcCA1LjUyIG9mIDI4IEZlYnJ1YXJ5IDIwMDUsIGJ5IEluZm8tWklQOgorICoKKyAqICMgL3Vzci9iaW4vdW56aXAgLXFxIC12IGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiAgIDIwNDM3MiAgRGVmbDpOICAgIDM1Mjc4ICA4MyUgIDA5LTA2LTA5IDE0OjIzICAwZDA1NjI1MiAgZGVjb21wcmVzc191bmx6bWEuaQorICogIyAvdXNyL2Jpbi91bnppcCAtcSAtdiBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogIExlbmd0aCAgIE1ldGhvZCAgICBTaXplICBSYXRpbyAgIERhdGUgICBUaW1lICAgQ1JDLTMyICAgIE5hbWUKKyAqIC0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tCisgKiAgIDIwNDM3MiAgRGVmbDpOICAgIDM1Mjc4ICA4MyUgIDA5LTA2LTA5IDE0OjIzICAwZDA1NjI1MiAgZGVjb21wcmVzc191bmx6bWEuaQorICogLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLSAgLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0KKyAqICAgMjA0MzcyICAgICAgICAgICAgMzUyNzggIDgzJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGZpbGUKKyAqICMgL3Vzci9iaW4vdW56aXAgLXYgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqIEFyY2hpdmU6ICBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogIExlbmd0aCAgIE1ldGhvZCAgICBTaXplICBSYXRpbyAgIERhdGUgICBUaW1lICAgQ1JDLTMyICAgIE5hbWUKKyAqIC0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tCisgKiAgIDIwNDM3MiAgRGVmbDpOICAgIDM1Mjc4ICA4MyUgIDA5LTA2LTA5IDE0OjIzICAwZDA1NjI1MiAgZGVjb21wcmVzc191bmx6bWEuaQorICogLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLSAgLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0KKyAqICAgMjA0MzcyICAgICAgICAgICAgMzUyNzggIDgzJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGZpbGUKKyAqICMgdW56aXAgLXYgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqIEFyY2hpdmU6ICBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogICBMZW5ndGggICAgIERhdGUgICBUaW1lICAgIE5hbWUKKyAqICAtLS0tLS0tLSAgICAtLS0tICAgLS0tLSAgICAtLS0tCisgKiAgICAyMDQzNzIgIDA5LTA2LTA5IDE0OjIzICAgZGVjb21wcmVzc191bmx6bWEuaQorICogIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgIC0tLS0tLS0KKyAqICAgIDIwNDM3MiAgICAgICAgICAgICAgICAgICAxIGZpbGVzCisgKiAjIC91c3IvYmluL3VuemlwIC1sIC1xcSBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogICAgMjA0MzcyICAwOS0wNi0wOSAxNDoyMyAgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICMgL3Vzci9iaW4vdW56aXAgLWwgLXEgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lCisgKiAgLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLQorICogICAgMjA0MzcyICAwOS0wNi0wOSAxNDoyMyAgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgICAyMDQzNzIgICAgICAgICAgICAgICAgICAgMSBmaWxlCisgKiAjIC91c3IvYmluL3VuemlwIC1sIGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiBBcmNoaXZlOiAgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lCisgKiAgLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLQorICogICAgMjA0MzcyICAwOS0wNi0wOSAxNDoyMyAgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgICAyMDQzNzIgICAgICAgICAgICAgICAgICAgMSBmaWxlCisgKi8KKworCS8qICctJyBtYWtlcyBnZXRvcHQgcmV0dXJuIDEgZm9yIG5vbi1vcHRpb25zICovCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIi1kOmxub3BxeHYiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHRfcmFuZ2UpIHsKKwkJY2FzZSAwOiAvKiBPcHRpb25zICovCisJCQlzd2l0Y2ggKG9wdCkgeworCQkJY2FzZSAnbCc6IC8qIExpc3QgKi8KKwkJCQlsaXN0aW5nID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnbic6IC8qIE5ldmVyIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyAqLworCQkJCW92ZXJ3cml0ZSA9IE9fTkVWRVI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ28nOiAvKiBBbHdheXMgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovCisJCQkJb3ZlcndyaXRlID0gT19BTFdBWVM7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ3AnOiAvKiBFeHRyYWN0IGZpbGVzIHRvIHN0ZG91dCBhbmQgZmFsbCB0aHJvdWdoIHRvIHNldCB2ZXJib3NpdHkgKi8KKwkJCQlkc3RfZmQgPSBTVERPVVRfRklMRU5POworCisJCQljYXNlICdxJzogLyogQmUgcXVpZXQgKi8KKwkJCQlxdWlldCsrOworCQkJCWJyZWFrOworCisJCQljYXNlICd2JzogLyogVmVyYm9zZSBsaXN0ICovCisJCQkJSUZfREVTS1RPUCh2ZXJib3NlKys7KQorCQkJCWxpc3RpbmcgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIDE6IC8qIFRoZSB6aXAgZmlsZSAqLworCQkJCS8qICs1OiBzcGFjZSBmb3IgIi56aXAiIGFuZCBOVUwgKi8KKwkJCQlzcmNfZm4gPSB4bWFsbG9jKHN0cmxlbihvcHRhcmcpICsgNSk7CisJCQkJc3RyY3B5KHNyY19mbiwgb3B0YXJnKTsKKwkJCQlvcHRfcmFuZ2UrKzsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDE6IC8qIEluY2x1ZGUgZmlsZXMgKi8KKwkJCWlmIChvcHQgPT0gMSkgeworCQkJCWxsaXN0X2FkZF90bygmemFjY2VwdCwgb3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvcHQgPT0gJ2QnKSB7CisJCQkJYmFzZV9kaXIgPSBvcHRhcmc7CisJCQkJb3B0X3JhbmdlICs9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3B0ID09ICd4JykgeworCQkJCW9wdF9yYW5nZSsrOworCQkJCWJyZWFrOworCQkJfQorCQkJYmJfc2hvd191c2FnZSgpOworCisJCWNhc2UgMiA6IC8qIEV4Y2x1ZGUgZmlsZXMgKi8KKwkJCWlmIChvcHQgPT0gMSkgeworCQkJCWxsaXN0X2FkZF90bygmenJlamVjdCwgb3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvcHQgPT0gJ2QnKSB7IC8qIEV4dHJhY3QgdG8gYmFzZSBkaXJlY3RvcnkgKi8KKwkJCQliYXNlX2RpciA9IG9wdGFyZzsKKwkJCQlvcHRfcmFuZ2UrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisKKwlpZiAoc3JjX2ZuID09IE5VTEwpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIE9wZW4gaW5wdXQgZmlsZSAqLworCWlmIChMT05FX0RBU0goc3JjX2ZuKSkgeworCQl4ZHVwMihTVERJTl9GSUxFTk8sIHppcF9mZCk7CisJCS8qIENhbm5vdCB1c2UgcHJvbXB0IG1vZGUgc2luY2UgemlwIGRhdGEgaXMgYXJyaXZpbmcgb24gU1RESU4gKi8KKwkJaWYgKG92ZXJ3cml0ZSA9PSBPX1BST01QVCkKKwkJCW92ZXJ3cml0ZSA9IE9fTkVWRVI7CisJfSBlbHNlIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgZXh0bltdWzVdID0geyIiLCAiLnppcCIsICIuWklQIn07CisJCWludCBvcmlnX3NyY19mbl9sZW4gPSBzdHJsZW4oc3JjX2ZuKTsKKwkJaW50IHNyY19mZCA9IC0xOworCisJCWZvciAoaSA9IDA7IChpIDwgMykgJiYgKHNyY19mZCA9PSAtMSk7IGkrKykgeworCQkJc3RyY3B5KHNyY19mbiArIG9yaWdfc3JjX2ZuX2xlbiwgZXh0bltpXSk7CisJCQlzcmNfZmQgPSBvcGVuKHNyY19mbiwgT19SRE9OTFkpOworCQl9CisJCWlmIChzcmNfZmQgPT0gLTEpIHsKKwkJCXNyY19mbltvcmlnX3NyY19mbl9sZW5dID0gJ1wwJzsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICVzLCAlcy56aXAsICVzLlpJUCIsIHNyY19mbiwgc3JjX2ZuLCBzcmNfZm4pOworCQl9CisJCXhtb3ZlX2ZkKHNyY19mZCwgemlwX2ZkKTsKKwl9CisKKwkvKiBDaGFuZ2UgZGlyIGlmIG5lY2Vzc2FyeSAqLworCWlmIChiYXNlX2RpcikKKwkJeGNoZGlyKGJhc2VfZGlyKTsKKworCWlmIChxdWlldCA8PSAxKSB7IC8qIG5vdCAtcXEgKi8KKwkJaWYgKHF1aWV0ID09IDApCisJCQlwcmludGYoIkFyY2hpdmU6ICAlc1xuIiwgc3JjX2ZuKTsKKwkJaWYgKGxpc3RpbmcpIHsKKwkJCXB1dHModmVyYm9zZSA/CisJCQkJIiBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lXG4iCisJCQkJIi0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tIgorCQkJCToKKwkJCQkiICBMZW5ndGggICAgIERhdGUgICBUaW1lICAgIE5hbWVcbiIKKwkJCQkiIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0iCisJCQkJKTsKKwkJfQorCX0KKworLyogRXhhbXBsZSBvZiBhbiBhcmNoaXZlIHdpdGggb25lIDAtYnl0ZSBsb25nIGZpbGUgbmFtZWQgJ3onCisgKiBjcmVhdGVkIGJ5IFppcCAyLjMxIG9uIFVuaXg6CisgKiAwMDAwIFs1MCA0Yl0wMyAwNCAwYSAwMCAwMCAwMCAwMCAwMCA0MiAxYSBiOCAzYyAwMCAwMCB8UEsuLi4uLi4uLkIuLjwuLnwKKyAqICAgICAgIHNpZy4uLi4uLi4uIHZuZWVkIGZsYWdzIGNvbXByIG10aW1lIG1kYXRlIGNyYzMyPgorICogMDAxMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDEgMDAgMTUgMDAgN2EgNTUgfC4uLi4uLi4uLi4uLi4uelV8CisgKiAgICAgID4uLi4uLiBjc2l6ZS4uLi4uLiB1c2l6ZS4uLi4uLiBmbmxlbiBleGxlbiBmbiBleD4KKyAqIDAwMjAgIDU0IDA5IDAwIDAzIGNjIGQzIGY5IDRiIGNjIGQzIGY5IDRiIDU1IDc4IDA0IDAwIHxULi4uLi4uSy4uLktVeC4ufAorICogICAgICA+dHJhX2ZpZWxkLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAqIDAwMzAgIDAwIDAwIDAwIDAwWzUwIDRiXTAxIDAyIDE3IDAzIDBhIDAwIDAwIDAwIDAwIDAwIHwuLi4uUEsuLi4uLi4uLi4ufAorICogICAgICAgLi4uLi4uLi4uLi4gc2lnLi4uLi4uLi4gdm1hZGUgdm5lZWQgZmxhZ3MgY29tcHIKKyAqIDAwNDAgIDQyIDFhIGI4IDNjIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHxCLi48Li4uLi4uLi4uLi4ufAorICogICAgICAgbXRpbWUgbWRhdGUgY3JjMzIuLi4uLi4gY3NpemUuLi4uLi4gdXNpemUuLi4uLi4KKyAqIDAwNTAgIDAxIDAwIDBkIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGE0IDgxIDAwIDAwIHwuLi4uLi4uLi4uLi4uLi4ufAorICogICAgICAgZm5sZW4gZXhsZW4gY2xlbi4gZG51bS4gaWF0dHIgZWF0dHIuLi4uLi4gcmVsb2ZzPiAoZWF0dHIgPSBydy1yLS1yLS0pCisgKiAwMDYwICAwMCAwMCA3YSA1NSA1NCAwNSAwMCAwMyBjYyBkMyBmOSA0YiA1NSA3OCAwMCAwMCB8Li56VVQuLi4uLi5LVXguLnwKKyAqICAgICAgPi4uLi4uIGZuIGV4dHJhX2ZpZWxkLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgKiAwMDcwIFs1MCA0Yl0wNSAwNiAwMCAwMCAwMCAwMCAwMSAwMCAwMSAwMCAzYyAwMCAwMCAwMCB8UEsuLi4uLi4uLi4uPC4uLnwKKyAqIDAwODAgIDM0IDAwIDAwIDAwIDAwIDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw0Li4uLi58CisgKi8KKwl0b3RhbF91c2l6ZSA9IDA7CisJdG90YWxfc2l6ZSA9IDA7CisJdG90YWxfZW50cmllcyA9IDA7CisjaWYgRU5BQkxFX0RFU0tUT1AKKwljZGZfb2Zmc2V0ID0gMDsKKyNlbmRpZgorCXdoaWxlICgxKSB7CisJCXVpbnQzMl90IG1hZ2ljOworCQltb2RlX3QgZGlyX21vZGUgPSAwNzc3OworI2lmIEVOQUJMRV9ERVNLVE9QCisJCW1vZGVfdCBmaWxlX21vZGUgPSAwNjY2OworI2VuZGlmCisKKwkJLyogQ2hlY2sgbWFnaWMgbnVtYmVyICovCisJCXhyZWFkKHppcF9mZCwgJm1hZ2ljLCA0KTsKKwkJLyogQ2VudHJhbCBkaXJlY3Rvcnk/IEl0J3MgYXQgdGhlIGVuZCwgc28gZXhpdCAqLworCQlpZiAobWFnaWMgPT0gWklQX0NERl9NQUdJQykKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9ERVNLVE9QCisJCS8qIERhdGEgZGVzY3JpcHRvcj8gSXQgd2FzIGEgc3RyZWFtaW5nIGZpbGUsIGdvIG9uICovCisJCWlmIChtYWdpYyA9PSBaSVBfRERfTUFHSUMpIHsKKwkJCS8qIHNraXAgb3ZlciBkdXBsaWNhdGUgY3JjMzIsIGNtcHNpemUgYW5kIHVjbXBzaXplICovCisJCQl1bnppcF9za2lwKDMgKiA0KTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJaWYgKG1hZ2ljICE9IFpJUF9GSUxFSEVBREVSX01BR0lDKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgemlwIG1hZ2ljICUwOFgiLCAoaW50KW1hZ2ljKTsKKworCQkvKiBSZWFkIHRoZSBmaWxlIGhlYWRlciAqLworCQl4cmVhZCh6aXBfZmQsIHppcF9oZWFkZXIucmF3LCBaSVBfSEVBREVSX0xFTik7CisJCUZJWF9FTkRJQU5ORVNTX1pJUCh6aXBfaGVhZGVyKTsKKwkJaWYgKCh6aXBfaGVhZGVyLmZvcm1hdHRlZC5tZXRob2QgIT0gMCkgJiYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLm1ldGhvZCAhPSA4KSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIG1ldGhvZCAlZCIsIHppcF9oZWFkZXIuZm9ybWF0dGVkLm1ldGhvZCk7CisJCX0KKyNpZiAhRU5BQkxFX0RFU0tUT1AKKwkJaWYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLnppcF9mbGFncyAmIFNXQVBfTEUxNigweDAwMDkpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiemlwIGZsYWdzIDEgYW5kIDggYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKwkJfQorI2Vsc2UKKwkJaWYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLnppcF9mbGFncyAmIFNXQVBfTEUxNigweDAwMDEpKSB7CisJCQkvKiAweDAwMDEgLSBlbmNyeXB0ZWQgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ6aXAgZmxhZyAxIChlbmNyeXB0aW9uKSBpcyBub3Qgc3VwcG9ydGVkIik7CisJCX0KKworCQl7CisJCQljZGZfaGVhZGVyX3QgY2RmX2hlYWRlcjsKKwkJCWNkZl9vZmZzZXQgPSByZWFkX25leHRfY2RmKGNkZl9vZmZzZXQsICZjZGZfaGVhZGVyKTsKKwkJCWlmICh6aXBfaGVhZGVyLmZvcm1hdHRlZC56aXBfZmxhZ3MgJiBTV0FQX0xFMTYoMHgwMDA4KSkgeworCQkJCS8qIDB4MDAwOCAtIHN0cmVhbWluZy4gW3VdY21wc2l6ZSBjYW4gYmUgcmVsaWFibHkgZ290dGVuCisJCQkJICogb25seSBmcm9tIENlbnRyYWwgRGlyZWN0b3J5LiBTZWUgdW56aXBfZG9jLnR4dCAqLworCQkJCXppcF9oZWFkZXIuZm9ybWF0dGVkLmNyYzMyICAgID0gY2RmX2hlYWRlci5mb3JtYXR0ZWQuY3JjMzI7CisJCQkJemlwX2hlYWRlci5mb3JtYXR0ZWQuY21wc2l6ZSAgPSBjZGZfaGVhZGVyLmZvcm1hdHRlZC5jbXBzaXplOworCQkJCXppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplID0gY2RmX2hlYWRlci5mb3JtYXR0ZWQudWNtcHNpemU7CisJCQl9CisJCQlpZiAoKGNkZl9oZWFkZXIuZm9ybWF0dGVkLnZlcnNpb25fbWFkZV9ieSA+PiA4KSA9PSAzKSB7CisJCQkJLyogdGhpcyBhcmNoaXZlIGlzIGNyZWF0ZWQgb24gVW5peCAqLworCQkJCWRpcl9tb2RlID0gZmlsZV9tb2RlID0gKGNkZl9oZWFkZXIuZm9ybWF0dGVkLmV4dGVybmFsX2ZpbGVfYXR0cmlidXRlcyA+PiAxNik7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8qIFJlYWQgZmlsZW5hbWUgKi8KKwkJZnJlZShkc3RfZm4pOworCQlkc3RfZm4gPSB4emFsbG9jKHppcF9oZWFkZXIuZm9ybWF0dGVkLmZpbGVuYW1lX2xlbiArIDEpOworCQl4cmVhZCh6aXBfZmQsIGRzdF9mbiwgemlwX2hlYWRlci5mb3JtYXR0ZWQuZmlsZW5hbWVfbGVuKTsKKworCQkvKiBTa2lwIGV4dHJhIGhlYWRlciBieXRlcyAqLworCQl1bnppcF9za2lwKHppcF9oZWFkZXIuZm9ybWF0dGVkLmV4dHJhX2xlbik7CisKKwkJLyogRmlsdGVyIHppcCBlbnRyaWVzICovCisJCWlmIChmaW5kX2xpc3RfZW50cnkoenJlamVjdCwgZHN0X2ZuKQorCQkgfHwgKHphY2NlcHQgJiYgIWZpbmRfbGlzdF9lbnRyeSh6YWNjZXB0LCBkc3RfZm4pKQorCQkpIHsgLyogU2tpcCBlbnRyeSAqLworCQkJaSA9ICduJzsKKworCQl9IGVsc2UgeyAvKiBFeHRyYWN0IGVudHJ5ICovCisJCQlpZiAobGlzdGluZykgeyAvKiBMaXN0IGVudHJ5ICovCisJCQkJdW5zaWduZWQgZG9zdGltZSA9IHppcF9oZWFkZXIuZm9ybWF0dGVkLm1vZHRpbWUgfCAoemlwX2hlYWRlci5mb3JtYXR0ZWQubW9kZGF0ZSA8PCAxNik7CisJCQkJaWYgKCF2ZXJib3NlKSB7CisJCQkJCS8vICAgICAgIiAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lXG4iCisJCQkJCS8vICAgICAgIiAtLS0tLS0tLSAgICAtLS0tICAgLS0tLSAgICAtLS0tIgorCQkJCQlwcmludGYoICAgICAgICIlOXUgICUwMnUtJTAydS0lMDJ1ICUwMnU6JTAydSAgICVzXG4iLAorCQkJCQkJKHVuc2lnbmVkKXppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplLAorCQkJCQkJKGRvc3RpbWUgJiAweDAxZTAwMDAwKSA+PiAyMSwKKwkJCQkJCShkb3N0aW1lICYgMHgwMDFmMDAwMCkgPj4gMTYsCisJCQkJCQkoKChkb3N0aW1lICYgMHhmZTAwMDAwMCkgPj4gMjUpICsgMTk4MCkgJSAxMDAsCisJCQkJCQkoZG9zdGltZSAmIDB4MDAwMGY4MDApID4+IDExLAorCQkJCQkJKGRvc3RpbWUgJiAweDAwMDAwN2UwKSA+PiA1LAorCQkJCQkJZHN0X2ZuKTsKKwkJCQkJdG90YWxfdXNpemUgKz0gemlwX2hlYWRlci5mb3JtYXR0ZWQudWNtcHNpemU7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBwZXJjZW50cyA9IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplIC0gemlwX2hlYWRlci5mb3JtYXR0ZWQuY21wc2l6ZTsKKwkJCQkJcGVyY2VudHMgPSBwZXJjZW50cyAqIDEwMDsKKwkJCQkJaWYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplKQorCQkJCQkJcGVyY2VudHMgLz0gemlwX2hlYWRlci5mb3JtYXR0ZWQudWNtcHNpemU7CisJCQkJCS8vICAgICAgIiBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lXG4iCisJCQkJCS8vICAgICAgIi0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tIgorCQkJCQlwcmludGYoICAgICAgIiU4dSAgRGVmbDpOIiAgICAiJTl1JTR1JSUgICUwMnUtJTAydS0lMDJ1ICUwMnU6JTAydSAgJTA4eCAgJXNcbiIsCisJCQkJCQkodW5zaWduZWQpemlwX2hlYWRlci5mb3JtYXR0ZWQudWNtcHNpemUsCisJCQkJCQkodW5zaWduZWQpemlwX2hlYWRlci5mb3JtYXR0ZWQuY21wc2l6ZSwKKwkJCQkJCSh1bnNpZ25lZClwZXJjZW50cywKKwkJCQkJCShkb3N0aW1lICYgMHgwMWUwMDAwMCkgPj4gMjEsCisJCQkJCQkoZG9zdGltZSAmIDB4MDAxZjAwMDApID4+IDE2LAorCQkJCQkJKCgoZG9zdGltZSAmIDB4ZmUwMDAwMDApID4+IDI1KSArIDE5ODApICUgMTAwLAorCQkJCQkJKGRvc3RpbWUgJiAweDAwMDBmODAwKSA+PiAxMSwKKwkJCQkJCShkb3N0aW1lICYgMHgwMDAwMDdlMCkgPj4gNSwKKwkJCQkJCXppcF9oZWFkZXIuZm9ybWF0dGVkLmNyYzMyLAorCQkJCQkJZHN0X2ZuKTsKKwkJCQkJdG90YWxfdXNpemUgKz0gemlwX2hlYWRlci5mb3JtYXR0ZWQudWNtcHNpemU7CisJCQkJCXRvdGFsX3NpemUgKz0gemlwX2hlYWRlci5mb3JtYXR0ZWQuY21wc2l6ZTsKKwkJCQl9CisJCQkJaSA9ICduJzsKKwkJCX0gZWxzZSBpZiAoZHN0X2ZkID09IFNURE9VVF9GSUxFTk8pIHsgLyogRXh0cmFjdGluZyB0byBTVERPVVQgKi8KKwkJCQlpID0gLTE7CisJCQl9IGVsc2UgaWYgKGxhc3RfY2hhcl9pcyhkc3RfZm4sICcvJykpIHsgLyogRXh0cmFjdCBkaXJlY3RvcnkgKi8KKwkJCQlpZiAoc3RhdChkc3RfZm4sICZzdGF0X2J1ZikgPT0gLTEpIHsKKwkJCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdGF0ICclcyciLCBkc3RfZm4pOworCQkJCQl9CisJCQkJCWlmICghcXVpZXQpIHsKKwkJCQkJCXByaW50ZigiICAgY3JlYXRpbmc6ICVzXG4iLCBkc3RfZm4pOworCQkJCQl9CisJCQkJCXVuemlwX2NyZWF0ZV9sZWFkaW5nX2RpcnMoZHN0X2ZuKTsKKwkJCQkJaWYgKGJiX21ha2VfZGlyZWN0b3J5KGRzdF9mbiwgZGlyX21vZGUsIDApKSB7CisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXhpdGluZyIpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFTX0lTRElSKHN0YXRfYnVmLnN0X21vZGUpKSB7CisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBleGlzdHMgYnV0IGlzIG5vdCBkaXJlY3RvcnkiLCBkc3RfZm4pOworCQkJCQl9CisJCQkJfQorCQkJCWkgPSAnbic7CisKKwkJCX0gZWxzZSB7ICAvKiBFeHRyYWN0IGZpbGUgKi8KKyBjaGVja19maWxlOgorCQkJCWlmIChzdGF0KGRzdF9mbiwgJnN0YXRfYnVmKSA9PSAtMSkgeyAvKiBGaWxlIGRvZXMgbm90IGV4aXN0ICovCisJCQkJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc3RhdCAnJXMnIiwgZHN0X2ZuKTsKKwkJCQkJfQorCQkJCQlpID0gJ3knOworCQkJCX0gZWxzZSB7IC8qIEZpbGUgYWxyZWFkeSBleGlzdHMgKi8KKwkJCQkJaWYgKG92ZXJ3cml0ZSA9PSBPX05FVkVSKSB7CisJCQkJCQlpID0gJ24nOworCQkJCQl9IGVsc2UgaWYgKFNfSVNSRUcoc3RhdF9idWYuc3RfbW9kZSkpIHsgLyogRmlsZSBpcyByZWd1bGFyIGZpbGUgKi8KKwkJCQkJCWlmIChvdmVyd3JpdGUgPT0gT19BTFdBWVMpIHsKKwkJCQkJCQlpID0gJ3knOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwcmludGYoInJlcGxhY2UgJXM/IFt5XWVzLCBbbl1vLCBbQV1sbCwgW05db25lLCBbcl1lbmFtZTogIiwgZHN0X2ZuKTsKKwkJCQkJCQlpZiAoIWZnZXRzKGtleV9idWYsIHNpemVvZihrZXlfYnVmKSwgc3RkaW4pKSB7CisJCQkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVhZCBpbnB1dCIpOworCQkJCQkJCX0KKwkJCQkJCQlpID0ga2V5X2J1ZlswXTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsgLyogRmlsZSBpcyBub3QgcmVndWxhciBmaWxlICovCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBleGlzdHMgYnV0IGlzIG5vdCByZWd1bGFyIGZpbGUiLCBkc3RfZm4pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgJ0EnOgorCQkJb3ZlcndyaXRlID0gT19BTFdBWVM7CisJCWNhc2UgJ3knOiAvKiBPcGVuIGZpbGUgYW5kIGZhbGwgaW50byB1bnppcCAqLworCQkJdW56aXBfY3JlYXRlX2xlYWRpbmdfZGlycyhkc3RfZm4pOworI2lmIEVOQUJMRV9ERVNLVE9QCisJCQlkc3RfZmQgPSB4b3BlbjMoZHN0X2ZuLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCBmaWxlX21vZGUpOworI2Vsc2UKKwkJCWRzdF9mZCA9IHhvcGVuKGRzdF9mbiwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyk7CisjZW5kaWYKKwkJY2FzZSAtMTogLyogVW56aXAgKi8KKwkJCWlmICghcXVpZXQpIHsKKwkJCQlwcmludGYoIiAgaW5mbGF0aW5nOiAlc1xuIiwgZHN0X2ZuKTsKKwkJCX0KKwkJCXVuemlwX2V4dHJhY3QoJnppcF9oZWFkZXIsIGRzdF9mZCk7CisJCQlpZiAoZHN0X2ZkICE9IFNURE9VVF9GSUxFTk8pIHsKKwkJCQkvKiBjbG9zaW5nIFNURE9VVCBpcyBwb3RlbnRpYWxseSBiYWQgZm9yIGZ1dHVyZSBidXNpbmVzcyAqLworCQkJCWNsb3NlKGRzdF9mZCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdOJzoKKwkJCW92ZXJ3cml0ZSA9IE9fTkVWRVI7CisJCWNhc2UgJ24nOgorCQkJLyogU2tpcCBlbnRyeSBkYXRhICovCisJCQl1bnppcF9za2lwKHppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemUpOworCQkJYnJlYWs7CisKKwkJY2FzZSAncic6CisJCQkvKiBQcm9tcHQgZm9yIG5ldyBuYW1lICovCisJCQlwcmludGYoIm5ldyBuYW1lOiAiKTsKKwkJCWlmICghZmdldHMoa2V5X2J1Ziwgc2l6ZW9mKGtleV9idWYpLCBzdGRpbikpIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgaW5wdXQiKTsKKwkJCX0KKwkJCWZyZWUoZHN0X2ZuKTsKKwkJCWRzdF9mbiA9IHhzdHJkdXAoa2V5X2J1Zik7CisJCQljaG9tcChkc3RfZm4pOworCQkJZ290byBjaGVja19maWxlOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoImVycm9yOiBpbnZhbGlkIHJlc3BvbnNlIFslY11cbiIsIChjaGFyKWkpOworCQkJZ290byBjaGVja19maWxlOworCQl9CisKKwkJdG90YWxfZW50cmllcysrOworCX0KKworCWlmIChsaXN0aW5nICYmIHF1aWV0IDw9IDEpIHsKKwkJaWYgKCF2ZXJib3NlKSB7CisJCQkvLyAgICAgICIgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZVxuIgorCQkJLy8gICAgICAiIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0iCisJCQlwcmludGYoICIgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0tLVxuIgorCQkJCSIlOWx1IiAgICIgICAgICAgICAgICAgICAgICAgJXUgZmlsZXNcbiIsCisJCQkJdG90YWxfdXNpemUsIHRvdGFsX2VudHJpZXMpOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbG9uZyBwZXJjZW50cyA9IHRvdGFsX3VzaXplIC0gdG90YWxfc2l6ZTsKKwkJCXBlcmNlbnRzID0gcGVyY2VudHMgKiAxMDA7CisJCQlpZiAodG90YWxfdXNpemUpCisJCQkJcGVyY2VudHMgLz0gdG90YWxfdXNpemU7CisJCQkvLyAgICAgICIgTGVuZ3RoICAgTWV0aG9kICAgIFNpemUgIFJhdGlvICAgRGF0ZSAgIFRpbWUgICBDUkMtMzIgICAgTmFtZVxuIgorCQkJLy8gICAgICAiLS0tLS0tLS0gIC0tLS0tLSAgLS0tLS0tLSAtLS0tLSAgIC0tLS0gICAtLS0tICAgLS0tLS0tICAgIC0tLS0iCisJCQlwcmludGYoICItLS0tLS0tLSAgICAgICAgICAtLS0tLS0tICAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLVxuIgorCQkJCSIlOGx1IiAgICAgICAgICAgICAgIiUxN2x1JTR1JSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXUgZmlsZXNcbiIsCisJCQkJdG90YWxfdXNpemUsIHRvdGFsX3NpemUsICh1bnNpZ25lZClwZXJjZW50cywKKwkJCQl0b3RhbF9lbnRyaWVzKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29uZmlncy9URVNUX25vbW11X2RlZmNvbmZpZyBiL2NvbmZpZ3MvVEVTVF9ub21tdV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1ZjY1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvVEVTVF9ub21tdV9kZWZjb25maWcKQEAgLTAsMCArMSw5MjYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjE2LjAKKyMgV2VkIEphbiAyNyAyMTowMToyNiAyMDEwCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCitDT05GSUdfREVTS1RPUD15CitDT05GSUdfRVhUUkFfQ09NUEFUPXkKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExFUj15CisjIENPTkZJR19MT0NBTEVfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOViBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BJREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfU1VJRD15CitDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRz15CitDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVD15CitDT05GSUdfU0VMSU5VWD15CitDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUz15CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorQ09ORklHX0ZFQVRVUkVfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0hBVkVfUlBDPXkKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKK0NPTkZJR19OT01NVT15CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zCisjCisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCitDT05GSUdfUEFTU1dPUkRfTUlOTEVOPTYKK0NPTkZJR19NRDVfU0laRV9WU19TUEVFRD0yCitDT05GSUdfRkVBVFVSRV9GQVNUX1RPUD15CitDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1M9eQorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19WST15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlk9MTUKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTj15CitDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMPXkKK0NPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUD15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0U9eQorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj00CitDT05GSUdfTU9OT1RPTklDX1NZU0NBTEw9eQorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorQ09ORklHX0ZFQVRVUkVfSFdJQj15CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CitDT05GSUdfQVI9eQorQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVM9eQorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fTz15CitDT05GSUdfRkVBVFVSRV9DUElPX1A9eQorQ09ORklHX0RQS0c9eQorQ09ORklHX0RQS0dfREVCPXkKK0NPTkZJR19GRUFUVVJFX0RQS0dfREVCX0VYVFJBQ1RfT05MWT15CitDT05GSUdfR1VOWklQPXkKK0NPTkZJR19HWklQPXkKK0NPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TPXkKK0NPTkZJR19MWk9QPXkKK0NPTkZJR19MWk9QX0NPTVBSX0hJR0g9eQorQ09ORklHX1JQTTJDUElPPXkKK0NPTkZJR19SUE09eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FMPXkKK0NPTkZJR19DQVQ9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CitDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlM9eQorQ09ORklHX0NVVD15CitDT05GSUdfREFURT15CitDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVD15CitDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorQ09ORklHX0RGPXkKK0NPTkZJR19GRUFUVVJFX0RGX0ZBTkNZPXkKK0NPTkZJR19ESVJOQU1FPXkKK0NPTkZJR19ET1MyVU5JWD15CitDT05GSUdfVU5JWDJET1M9eQorQ09ORklHX0RVPXkKK0NPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLPXkKK0NPTkZJR19FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE89eQorQ09ORklHX0VOVj15CitDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQUj15CitDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GT0xEPXkKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lEPXkKK0NPTkZJR19JTlNUQUxMPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TPXkKK0NPTkZJR19MTj15CitDT05GSUdfTE9HTkFNRT15CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUj15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUPXkKK0NPTkZJR19NRDVTVU09eQorQ09ORklHX01LRElSPXkKK0NPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19OSUNFPXkKK0NPTkZJR19OT0hVUD15CitDT05GSUdfT0Q9eQorQ09ORklHX1BSSU5URU5WPXkKK0NPTkZJR19QUklOVEY9eQorQ09ORklHX1BXRD15CitDT05GSUdfUkVBRExJTks9eQorQ09ORklHX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XPXkKK0NPTkZJR19SRUFMUEFUSD15CitDT05GSUdfUk09eQorQ09ORklHX1JNRElSPXkKK0NPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorQ09ORklHX1NIQTUxMlNVTT15CitDT05GSUdfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkxPQVRfU0xFRVA9eQorQ09ORklHX1NPUlQ9eQorQ09ORklHX0ZFQVRVUkVfU09SVF9CSUc9eQorQ09ORklHX1NQTElUPXkKK0NPTkZJR19GRUFUVVJFX1NQTElUX0ZBTkNZPXkKK0NPTkZJR19TVEFUPXkKK0NPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUPXkKK0NPTkZJR19TVFRZPXkKK0NPTkZJR19TVU09eQorQ09ORklHX1NZTkM9eQorQ09ORklHX1RBQz15CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVEVTVD15CitDT05GSUdfRkVBVFVSRV9URVNUXzY0PXkKK0NPTkZJR19UT1VDSD15CitDT05GSUdfVFI9eQorQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUz15CitDT05GSUdfRkVBVFVSRV9UUl9FUVVJVj15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19VTklRPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorQ09ORklHX1dITz15CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworQ09ORklHX0NIVlQ9eQorQ09ORklHX0NMRUFSPXkKK0NPTkZJR19ERUFMTE9DVlQ9eQorQ09ORklHX0RVTVBLTUFQPXkKK0NPTkZJR19LQkRfTU9ERT15CitDT05GSUdfTE9BREZPTlQ9eQorQ09ORklHX0xPQURLTUFQPXkKK0NPTkZJR19PUEVOVlQ9eQorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKK0NPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TPXkKK0NPTkZJR19TRVRGT05UPXkKK0NPTkZJR19GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVA9eQorQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVI9IiIKK0NPTkZJR19TRVRLRVlDT0RFUz15CitDT05GSUdfU0VUTE9HQ09OUz15CitDT05GSUdfU0hPV0tFWT15CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworQ09ORklHX01LVEVNUD15CitDT05GSUdfUElQRV9QUk9HUkVTUz15CitDT05GSUdfUlVOX1BBUlRTPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZPXkKK0NPTkZJR19TVEFSVF9TVE9QX0RBRU1PTj15CitDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlM9eQorQ09ORklHX1dISUNIPXkKKworIworIyBFZGl0b3JzCisjCitDT05GSUdfQVdLPXkKK0NPTkZJR19GRUFUVVJFX0FXS19MSUJNPXkKK0NPTkZJR19DTVA9eQorQ09ORklHX0RJRkY9eQorQ09ORklHX0ZFQVRVUkVfRElGRl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfRElGRl9ESVI9eQorQ09ORklHX0VEPXkKK0NPTkZJR19QQVRDSD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTQwOTYKK0NPTkZJR19GRUFUVVJFX1ZJXzhCSVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1I9eQorQ09ORklHX0ZFQVRVUkVfQUxMT1dfRVhFQz15CisKKyMKKyMgRmluZGluZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GSU5EPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJJTlQwPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTVRJTUU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NTUlOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEVSTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1RZUEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9YREVWPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTUFYREVQVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ORVdFUj15CitDT05GSUdfRkVBVFVSRV9GSU5EX0lOVU09eQorQ09ORklHX0ZFQVRVUkVfRklORF9FWEVDPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVVNFUj15CitDT05GSUdfRkVBVFVSRV9GSU5EX0dST1VQPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTk9UPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVQVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVJFTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUlVORT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUz15CitDT05GSUdfR1JFUD15CitDT05GSUdfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUPXkKK0NPTkZJR19YQVJHUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTj15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQ9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk09eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCitDT05GSUdfSU5JVD15CitDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQj15CitDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQ9eQorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0xCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSEFMVD15CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCitDT05GSUdfTUVTRz15CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFM9eQorQ09ORklHX1VTRV9CQl9QV0RfR1JQPXkKK0NPTkZJR19VU0VfQkJfU0hBRE9XPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFQ9eQorQ09ORklHX1VTRV9CQl9DUllQVF9TSEE9eQorQ09ORklHX0FEREdST1VQPXkKK0NPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQPXkKK0NPTkZJR19ERUxHUk9VUD15CitDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQPXkKK0NPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTPXkKK0NPTkZJR19BRERVU0VSPXkKK0NPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GSVJTVF9TWVNURU1fSUQ9MTAwCitDT05GSUdfTEFTVF9TWVNURU1fSUQ9OTk5CitDT05GSUdfREVMVVNFUj15CitDT05GSUdfR0VUVFk9eQorQ09ORklHX0ZFQVRVUkVfVVRNUD15CitDT05GSUdfRkVBVFVSRV9XVE1QPXkKK0NPTkZJR19MT0dJTj15CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorQ09ORklHX0xPR0lOX1NDUklQVFM9eQorQ09ORklHX0ZFQVRVUkVfTk9MT0dJTj15CitDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFk9eQorQ09ORklHX1BBU1NXRD15CitDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSz15CitDT05GSUdfQ1JZUFRQVz15CitDT05GSUdfQ0hQQVNTV0Q9eQorQ09ORklHX1NVPXkKK0NPTkZJR19GRUFUVVJFX1NVX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTPXkKK0NPTkZJR19TVUxPR0lOPXkKK0NPTkZJR19WTE9DSz15CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworQ09ORklHX0NIQVRUUj15CitDT05GSUdfRlNDSz15CitDT05GSUdfTFNBVFRSPXkKKworIworIyBMaW51eCBNb2R1bGUgVXRpbGl0aWVzCisjCitDT05GSUdfTU9EUFJPQkVfU01BTEw9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEPXkKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQPXkKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iL2xpYi9tb2R1bGVzIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9Im1vZHVsZXMuZGVwIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CitDT05GSUdfRE1FU0c9eQorQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZPXkKK0NPTkZJR19GQlNFVD15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERT15CitDT05GSUdfRkRGTFVTSD15CitDT05GSUdfRkRGT1JNQVQ9eQorQ09ORklHX0ZESVNLPXkKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKK0NPTkZJR19GRUFUVVJFX0ZESVNLX1dSSVRBQkxFPXkKK0NPTkZJR19GRUFUVVJFX0FJWF9MQUJFTD15CitDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUw9eQorQ09ORklHX0ZFQVRVUkVfU1VOX0xBQkVMPXkKK0NPTkZJR19GRUFUVVJFX09TRl9MQUJFTD15CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CitDT05GSUdfRklOREZTPXkKK0NPTkZJR19GUkVFUkFNRElTSz15CitDT05GSUdfRlNDS19NSU5JWD15CitDT05GSUdfTUtGU19FWFQyPXkKK0NPTkZJR19NS0ZTX01JTklYPXkKKworIworIyBNaW5peCBmaWxlc3lzdGVtIHN1cHBvcnQKKyMKK0NPTkZJR19GRUFUVVJFX01JTklYMj15CitDT05GSUdfTUtGU19SRUlTRVI9eQorQ09ORklHX01LRlNfVkZBVD15CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorQ09ORklHX0hXQ0xPQ0s9eQorQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUz15CitDT05GSUdfSVBDUk09eQorQ09ORklHX0lQQ1M9eQorQ09ORklHX0xPU0VUVVA9eQorQ09ORklHX0xTUENJPXkKK0NPTkZJR19MU1VTQj15CitDT05GSUdfTURFVj15CitDT05GSUdfRkVBVFVSRV9NREVWX0NPTkY9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUU9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfRVhFQz15CitDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkU9eQorQ09ORklHX01LU1dBUD15CitDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRD15CitDT05GSUdfTU9SRT15CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfVk9MVU1FSUQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1M9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRD15CitDT05GSUdfTU9VTlQ9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRT15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0hFTFBFUlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUw9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0NJRlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUI9eQorQ09ORklHX1BJVk9UX1JPT1Q9eQorQ09ORklHX1JEQVRFPXkKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CitDT05GSUdfUlRDV0FLRT15CitDT05GSUdfU0NSSVBUPXkKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorQ09ORklHX1NFVEFSQ0g9eQorQ09ORklHX1NXQVBPTk9GRj15CitDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJPXkKK0NPTkZJR19TV0lUQ0hfUk9PVD15CitDT05GSUdfVU1PVU5UPXkKK0NPTkZJR19GRUFUVVJFX1VNT1VOVF9BTEw9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtb3VudC91bW91bnQKKyMKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xPT1A9eQorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCitDT05GSUdfQURKVElNRVg9eQorQ09ORklHX0JCQ09ORklHPXkKK0NPTkZJR19CRUVQPXkKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT00MDAwCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0zMAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGST15CitDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTj15CitDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVD15CitDT05GSUdfQ0hSVD15CitDT05GSUdfQ1JPTkQ9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorQ09ORklHX0RDPXkKK0NPTkZJR19GRUFUVVJFX0RDX0xJQk09eQorIyBDT05GSUdfREVWRlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9NT0RMT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9GR19OUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVkZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZNRU09eQorQ09ORklHX0VKRUNUPXkKK0NPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0k9eQorQ09ORklHX0ZCU1BMQVNIPXkKK0NPTkZJR19GTEFTSENQPXkKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19JT05JQ0U9eQorQ09ORklHX0lOT1RJRllEPXkKK0NPTkZJR19MQVNUPXkKK0NPTkZJR19GRUFUVVJFX0xBU1RfU01BTEw9eQorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19MRVNTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9OTk5OTk5OQorQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFA9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19XSU5DSD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0RBU0hDTUQ9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUz15CitDT05GSUdfSERQQVJNPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFk9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVD15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUE9eQorQ09ORklHX01BS0VERVZTPXkKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfTEVBRiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRT15CitDT05GSUdfTUFOPXkKK0NPTkZJR19NSUNST0NPTT15CitDT05GSUdfTU9VTlRQT0lOVD15CitDT05GSUdfTVQ9eQorQ09ORklHX1JBSURBVVRPUlVOPXkKK0NPTkZJR19SRUFEQUhFQUQ9eQorQ09ORklHX1JVTkxFVkVMPXkKK0NPTkZJR19SWD15CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKK0NPTkZJR19UQVNLU0VUPXkKK0NPTkZJR19GRUFUVVJFX1RBU0tTRVRfRkFOQ1k9eQorQ09ORklHX1RJTUU9eQorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorQ09ORklHX1dBTEw9eQorQ09ORklHX1dBVENIRE9HPXkKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfSVBWNj15CitDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMPXkKK0NPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1M9eQorQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlM9eQorQ09ORklHX0FSUD15CitDT05GSUdfQVJQSU5HPXkKK0NPTkZJR19CUkNUTD15CitDT05GSUdfRkVBVFVSRV9CUkNUTF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XPXkKK0NPTkZJR19ETlNEPXkKK0NPTkZJR19FVEhFUl9XQUtFPXkKK0NPTkZJR19GQUtFSURFTlREPXkKK0NPTkZJR19GVFBEPXkKK0NPTkZJR19GRUFUVVJFX0ZUUF9XUklURT15CitDT05GSUdfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVD15CitDT05GSUdfRlRQR0VUPXkKK0NPTkZJR19GVFBQVVQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUz15CitDT05GSUdfSE9TVE5BTUU9eQorQ09ORklHX0hUVFBEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1JBTkdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0lGQ09ORklHPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlE9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVM9eQorQ09ORklHX0lGRU5TTEFWRT15CitDT05GSUdfSUZQTFVHRD15CitDT05GSUdfSUZVUERPV049eQorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iL3Zhci9ydW4vaWZzdGF0ZSIKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU49eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjQ9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNj15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1A9eQorQ09ORklHX0lORVREPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1JQQz15CitDT05GSUdfSVA9eQorQ09ORklHX0ZFQVRVUkVfSVBfQUREUkVTUz15CitDT05GSUdfRkVBVFVSRV9JUF9MSU5LPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JPVVRFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1RVTk5FTD15CitDT05GSUdfRkVBVFVSRV9JUF9SVUxFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTPXkKK0NPTkZJR19JUEFERFI9eQorQ09ORklHX0lQTElOSz15CitDT05GSUdfSVBST1VURT15CitDT05GSUdfSVBUVU5ORUw9eQorQ09ORklHX0lQUlVMRT15CitDT05GSUdfSVBDQUxDPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWT15CitDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TPXkKK0NPTkZJR19OQU1FSUY9eQorQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEPXkKK0NPTkZJR19OQz15CitDT05GSUdfTkNfU0VSVkVSPXkKK0NPTkZJR19OQ19FWFRSQT15CitDT05GSUdfTkVUU1RBVD15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1dJREU9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9QUkc9eQorQ09ORklHX05TTE9PS1VQPXkKK0NPTkZJR19OVFBEPXkKK0NPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSPXkKK0NPTkZJR19QSU5HPXkKK0NPTkZJR19QSU5HNj15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HPXkKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorQ09ORklHX1NMQVRUQUNIPXkKK0NPTkZJR19URUxORVQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU49eQorQ09ORklHX1RFTE5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVD15CitDT05GSUdfVEZUUD15CitDT05GSUdfVEZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorQ09ORklHX1RGVFBfREVCVUc9eQorQ09ORklHX1RSQUNFUk9VVEU9eQorQ09ORklHX1RSQUNFUk9VVEU2PXkKK0NPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRT15CitDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURT15CitDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QPXkKK0NPTkZJR19VREhDUEQ9eQorQ09ORklHX0RIQ1BSRUxBWT15CitDT05GSUdfRFVNUExFQVNFUz15CitDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZPXkKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzIgorQ09ORklHX1VESENQQz15CitDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HPXkKK0NPTkZJR19GRUFUVVJFX1VESENQX1BPUlQ9eQorQ09ORklHX1VESENQX0RFQlVHPTkKK0NPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTc9eQorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTgwCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSItUiAtbiIKK0NPTkZJR19WQ09ORklHPXkKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX1pDSVA9eQorQ09ORklHX1RDUFNWRD15CitDT05GSUdfVFVOQ1RMPXkKK0NPTkZJR19GRUFUVVJFX1RVTkNUTF9VRz15CitDT05GSUdfVURQU1ZEPXkKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKK0NPTkZJR19MUEQ9eQorQ09ORklHX0xQUj15CitDT05GSUdfTFBRPXkKKworIworIyBNYWlsIFV0aWxpdGllcworIworQ09ORklHX01BS0VNSU1FPXkKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0idXMtYXNjaWkiCitDT05GSUdfUE9QTUFJTERJUj15CitDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZPXkKK0NPTkZJR19SRUZPUk1JTUU9eQorQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVD15CitDT05GSUdfU0VORE1BSUw9eQorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKK0NPTkZJR19OTUVURVI9eQorQ09ORklHX1BHUkVQPXkKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorQ09ORklHX1BTPXkKK0NPTkZJR19GRUFUVVJFX1BTX1dJREU9eQorQ09ORklHX0ZFQVRVUkVfUFNfVElNRT15CitDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlM9eQorQ09ORklHX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TPXkKK0NPTkZJR19SRU5JQ0U9eQorQ09ORklHX0JCX1NZU0NUTD15CitDT05GSUdfVE9QPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRT15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVT15CitDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTPXkKK0NPTkZJR19GRUFUVVJFX1RPUE1FTT15CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorQ09ORklHX1VQVElNRT15CitDT05GSUdfV0FUQ0g9eQorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworQ09ORklHX1JVTlNWPXkKK0NPTkZJR19SVU5TVkRJUj15CitDT05GSUdfRkVBVFVSRV9SVU5TVkRJUl9MT0c9eQorQ09ORklHX1NWPXkKK0NPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSPSIvdmFyL3NlcnZpY2UiCitDT05GSUdfU1ZMT0dEPXkKK0NPTkZJR19DSFBTVD15CitDT05GSUdfU0VUVUlER0lEPXkKK0NPTkZJR19FTlZVSURHSUQ9eQorQ09ORklHX0VOVkRJUj15CitDT05GSUdfU09GVExJTUlUPXkKKworIworIyBTRUxpbnV4IFV0aWxpdGllcworIworQ09ORklHX0NIQ09OPXkKK0NPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfR0VURU5GT1JDRT15CitDT05GSUdfR0VUU0VCT09MPXkKK0NPTkZJR19MT0FEX1BPTElDWT15CitDT05GSUdfTUFUQ0hQQVRIQ09OPXkKK0NPTkZJR19SRVNUT1JFQ09OPXkKK0NPTkZJR19SVU5DT049eQorQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfU0VMSU5VWEVOQUJMRUQ9eQorQ09ORklHX1NFVEVORk9SQ0U9eQorQ09ORklHX1NFVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTj15CitDT05GSUdfU0VUU0VCT09MPXkKK0NPTkZJR19TRVNUQVRVUz15CisKKyMKKyMgU2hlbGxzCisjCisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0FTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9KT0JfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQ01EQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKK0NPTkZJR19IVVNIPXkKK0NPTkZJR19IVVNIX0JBU0hfQ09NUEFUPXkKK0NPTkZJR19IVVNIX0hFTFA9eQorQ09ORklHX0hVU0hfSU5URVJBQ1RJVkU9eQorQ09ORklHX0hVU0hfSk9CPXkKK0NPTkZJR19IVVNIX1RJQ0s9eQorQ09ORklHX0hVU0hfSUY9eQorQ09ORklHX0hVU0hfTE9PUFM9eQorQ09ORklHX0hVU0hfQ0FTRT15CitDT05GSUdfSFVTSF9GVU5DVElPTlM9eQorQ09ORklHX0hVU0hfTE9DQUw9eQorQ09ORklHX0hVU0hfRVhQT1JUX049eQorQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX01TSD15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUks9eQorQ09ORklHX0NUVFlIQUNLPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL1RFU1Rfbm9wcmludGZfZGVmY29uZmlnIGIvY29uZmlncy9URVNUX25vcHJpbnRmX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzJlMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9URVNUX25vcHJpbnRmX2RlZmNvbmZpZwpAQCAtMCwwICsxLDkyNyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTcuMC5naXQKKyMgTW9uIEp1biAgNyAxMzozNzo1NSAyMDEwCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCitDT05GSUdfREVTS1RPUD15CitDT05GSUdfRVhUUkFfQ09NUEFUPXkKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVIgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VOSUNPREVfU1VQUE9SVD15CisjIENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOVj15CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj02NTUzNQorQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUz15CitDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUz15CitDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19VTklDT0RFX1BSRVNFUlZFX0JST0tFTj15CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCisjIENPTkZJR19GRUFUVVJFX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCitDT05GSUdfU1RBVElDPXkKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iaTQ4Ni1saW51eC11Y2xpYmMtIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorQ09ORklHX1dFUlJPUj15CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucworIworIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19WST15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlk9MTUKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTj15CitDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMPXkKK0NPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUD15CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTY0CitDT05GSUdfTU9OT1RPTklDX1NZU0NBTEw9eQorIyBDT05GSUdfSU9DVExfSEVYMlNUUl9FUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9IV0lCPXkKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKKyMgQ09ORklHX0FSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQlVOWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorIyBDT05GSUdfR1VOWklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0daSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19MWk9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaT1BfQ09NUFJfSElHSCBpcyBub3Qgc2V0CisjIENPTkZJR19SUE0yQ1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19SUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0ZST00gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOQ09NUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVU5MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xaTUEgaXMgbm90IHNldAorIyBDT05GSUdfVU5YWiBpcyBub3Qgc2V0CisjIENPTkZJR19YWiBpcyBub3Qgc2V0CisjIENPTkZJR19VTlpJUCBpcyBub3Qgc2V0CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorIyBDT05GSUdfQ0FUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URVNUXzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSX0VRVUlWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVRWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIR1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NITU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIT1dOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19DS1NVTSBpcyBub3Qgc2V0CisjIENPTkZJR19DT01NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NVVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRERfSUJTX09CUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RGX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJUk5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRE9TMlVOSVggaXMgbm90IHNldAorIyBDT05GSUdfVU5JWDJET1MgaXMgbm90IHNldAorIyBDT05GSUdfRFUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSyBpcyBub3Qgc2V0CisjIENPTkZJR19FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19FTlYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhQUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82NCBpcyBub3Qgc2V0CitDT05GSUdfRkFMU0U9eQorIyBDT05GSUdfRk9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19GU1lOQyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUSUQgaXMgbm90IHNldAorIyBDT05GSUdfSUQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR05BTUUgaXMgbm90IHNldAorIyBDT05GSUdfTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19NRDVTVU0gaXMgbm90IHNldAorIyBDT05GSUdfTUtESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTUtGSUZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LTk9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTk9IVVAgaXMgbm90IHNldAorIyBDT05GSUdfT0QgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRFTlYgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BXRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFQURMSU5LX0ZPTExPVyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19STSBpcyBub3Qgc2V0CisjIENPTkZJR19STURJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU0hBMVNVTSBpcyBub3Qgc2V0CisjIENPTkZJR19TSEEyNTZTVU0gaXMgbm90IHNldAorIyBDT05GSUdfU0hBNTEyU1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU09SVF9CSUcgaXMgbm90IHNldAorIyBDT05GSUdfU1BMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQgaXMgbm90IHNldAorIyBDT05GSUdfU1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVU0gaXMgbm90IHNldAorIyBDT05GSUdfU1lOQyBpcyBub3Qgc2V0CisjIENPTkZJR19UQUMgaXMgbm90IHNldAorIyBDT05GSUdfVEFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUwgaXMgbm90IHNldAorIyBDT05GSUdfVEVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSCBpcyBub3Qgc2V0CitDT05GSUdfVFJVRT15CisjIENPTkZJR19UVFkgaXMgbm90IHNldAorIyBDT05GSUdfVU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfVU5FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JUSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfVVVERUNPREUgaXMgbm90IHNldAorIyBDT05GSUdfVVVFTkNPREUgaXMgbm90IHNldAorIyBDT05GSUdfV0MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XQ19MQVJHRSBpcyBub3Qgc2V0CisjIENPTkZJR19XSE8gaXMgbm90IHNldAorIyBDT05GSUdfV0hPQU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FVVE9XSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworIyBDT05GSUdfQ0hWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GR0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ0xFQVIgaXMgbm90IHNldAorIyBDT05GSUdfREVBTExPQ1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tCRF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX09QRU5WVCBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCisjIENPTkZJR19TRVRLRVlDT0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRMT0dDT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dLRVkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCisjIENPTkZJR19NS1RFTVAgaXMgbm90IHNldAorQ09ORklHX1BJUEVfUFJPR1JFU1M9eQorIyBDT05GSUdfUlVOX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFSVF9TVE9QX0RBRU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dISUNIIGlzIG5vdCBzZXQKKworIworIyBFZGl0b3JzCisjCisjIENPTkZJR19BV0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BV0tfTElCTSBpcyBub3Qgc2V0CisjIENPTkZJR19DTVAgaXMgbm90IHNldAorIyBDT05GSUdfRElGRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRElGRl9ESVIgaXMgbm90IHNldAorIyBDT05GSUdfRUQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49MAorIyBDT05GSUdfRkVBVFVSRV9WSV84QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfQ09MT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1JFQURPTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1dJTl9SRVNJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDIGlzIG5vdCBzZXQKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworIyBDT05GSUdfRklORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUFJJTlQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfWERFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTUFYREVQVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTk9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUkVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUkVQX0NPTlRFWFQgaXMgbm90IHNldAorIyBDT05GSUdfWEFSR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0gaXMgbm90IHNldAorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCisjIENPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUUkQgaXMgbm90IHNldAorIyBDT05GSUdfSEFMVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCisjIENPTkZJR19NRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RDSEFSVEQgaXMgbm90IHNldAorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1BXRF9HUlAgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1NIQURPVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUX1NIQSBpcyBub3Qgc2V0CisjIENPTkZJR19BRERHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVMR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfQUREVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19GSVJTVF9TWVNURU1fSUQ9MAorQ09ORklHX0xBU1RfU1lTVEVNX0lEPTAKKyMgQ09ORklHX0RFTFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfR0VUVFkgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOX1NDUklQVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBU1NXRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUUFcgaXMgbm90IHNldAorIyBDT05GSUdfQ0hQQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfU1UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfVkxPQ0sgaXMgbm90IHNldAorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKKyMgQ09ORklHX0NIQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5FMkZTIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBNb2R1bGUgVXRpbGl0aWVzCisjCisjIENPTkZJR19NT0RJTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JNTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNNT0RfUFJFVFRZXzJfNl9PVVRQVVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVQTU9EIGlzIG5vdCBzZXQKKworIworIyBPcHRpb25zIGNvbW1vbiB0byBtdWx0aXBsZSBtb2R1dGlscworIworIyBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9IiIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSIiCisKKyMKKyMgTGludXggU3lzdGVtIFV0aWxpdGllcworIworIyBDT05GSUdfQUNQSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BQ1BJRF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLSUQgaXMgbm90IHNldAorIyBDT05GSUdfRE1FU0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ETUVTR19QUkVUVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkJTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZCU0VUX1JFQURNT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERkxVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkRGT1JNQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkRJU0sgaXMgbm90IHNldAorQ09ORklHX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1M9eQorIyBDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJTkRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFUkFNRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19GU0NLX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUlOSVgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfUkVJU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfVkZBVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRPUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORyBpcyBub3Qgc2V0CisjIENPTkZJR19IRVhEVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0NPTkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRSBpcyBub3Qgc2V0CisjIENPTkZJR19NS1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1MgaXMgbm90IHNldAorQ09ORklHX1ZPTFVNRUlEPXkKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0hGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX05URlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JERVYgaXMgbm90IHNldAorIyBDT05GSUdfUkVBRFBST0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDV0FLRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1JJUFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NSSVBUUkVQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU1dBUE9OT0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1dBUE9OX1BSSSBpcyBub3Qgc2V0CisjIENPTkZJR19TV0lUQ0hfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFV0aWxpdGllcworIworIyBDT05GSUdfQURKVElNRVggaXMgbm90IHNldAorQ09ORklHX0JCQ09ORklHPXkKKyMgQ09ORklHX0JFRVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRPTAKK0NPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TPTAKKyMgQ09ORklHX0NIQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX05PRkFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVFRZX0hJRkkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JPTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9IiIKKyMgQ09ORklHX0NST05UQUIgaXMgbm90IHNldAorIyBDT05GSUdfREMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQ19MSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRUpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU1BMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9VTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfRVJBU0VBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9OSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19MRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9MAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0JSQUNLRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0RBU0hDTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0xJTkVOVU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEUEFSTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BS0VERVZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfTEVBRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX1RBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BTiBpcyBub3Qgc2V0CisjIENPTkZJR19NSUNST0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQURBSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorIyBDT05GSUdfUlggaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklOR1MgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBU0tTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RUWVNJWkUgaXMgbm90IHNldAorIyBDT05GSUdfVk9MTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19XQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworIyBDT05GSUdfRkVBVFVSRV9JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU5JWF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlAgaXMgbm90IHNldAorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROU0QgaXMgbm90IHNldAorIyBDT05GSUdfRVRIRVJfV0FLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQUtFSURFTlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRlRQUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVFRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1JBTkdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1VTRV9TRU5ERklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0NHSSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9QUk9YWSBpcyBub3Qgc2V0CisjIENPTkZJR19JRkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CitDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIPSIiCisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUEFERFIgaXMgbm90IHNldAorIyBDT05GSUdfSVBMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBUVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBSVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ0FMQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DX1NFUlZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19OQ19FWFRSQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9QUkcgaXMgbm90IHNldAorIyBDT05GSUdfTlNMT09LVVAgaXMgbm90IHNldAorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkcgaXMgbm90IHNldAorIyBDT05GSUdfUElORzYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BTQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMQVRUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTE5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5DVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UVU5DVExfVUcgaXMgbm90IHNldAorIyBDT05GSUdfVURIQ1BEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RIQ1BSRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QTEVBU0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWSBpcyBub3Qgc2V0CitDT05GSUdfREhDUERfTEVBU0VTX0ZJTEU9IiIKKyMgQ09ORklHX1VESENQQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUF9ERUJVRz0wCisjIENPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTcgaXMgbm90IHNldAorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iIgorQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUz0wCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSIiCisjIENPTkZJR19VRFBTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19XR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfWkNJUCBpcyBub3Qgc2V0CisKKyMKKyMgUHJpbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19MUEQgaXMgbm90IHNldAorIyBDT05GSUdfTFBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xQUSBpcyBub3Qgc2V0CisKKyMKKyMgTWFpbCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX01BS0VNSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0iIgorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0ZSRUUgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LSUxMQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTExBTEw1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05NRVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QR1JFUCBpcyBub3Qgc2V0CisjIENPTkZJR19QSURPRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEtJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRU5JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQkJfU1lTQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFMgaXMgbm90IHNldAorIyBDT05GSUdfVVBUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIIGlzIG5vdCBzZXQKKworIworIyBSdW5pdCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX1JVTlNWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTlNWRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NWIGlzIG5vdCBzZXQKK0NPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSPSIiCisjIENPTkZJR19TVkxPR0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hQU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0VUVUlER0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVlVJREdJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTlZESVIgaXMgbm90IHNldAorIyBDT05GSUdfU09GVExJTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfR0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVENIUEFUSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNUT1JFQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWEVOQUJMRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGSUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfU0VTVEFUVVMgaXMgbm90IHNldAorCisjCisjIFNoZWxscworIworIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSk9CX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9HRVRPUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0NNRENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9FWFBBTkRfUFJNVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9IRUxQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSU5URVJBQ1RJVkUgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9KT0IgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9USUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSUYgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT09QUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0NBU0UgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9GVU5DVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0VYUE9SVF9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX05PTkU9eQorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CQVNIX0lTX05PTkU9eQorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX01BVEhfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorIyBDT05GSUdfQ1RUWUhBQ0sgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcworIworIyBDT05GSUdfU1lTTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVNT1RFX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0wCisjIENPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0cgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0wCisjIENPTkZJR19MT0dSRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfS0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfTE9HR0VSIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvVEVTVF9yaDlfZGVmY29uZmlnIGIvY29uZmlncy9URVNUX3JoOV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwOTRlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvVEVTVF9yaDlfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTQxIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIEJ1c3lib3ggdmVyc2lvbjogMS4xNy4wLmdpdAorIyBGcmkgQXByIDE2IDIyOjI1OjIyIDIwMTAKKyMKK0NPTkZJR19IQVZFX0RPVF9DT05GSUc9eQorCisjCisjIEJ1c3lib3ggU2V0dGluZ3MKKyMKKworIworIyBHZW5lcmFsIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0RFU0tUT1AgaXMgbm90IHNldAorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExFUj15CitDT05GSUdfTE9DQUxFX1NVUFBPUlQ9eQorQ09ORklHX1VOSUNPREVfU1VQUE9SVD15CisjIENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WIGlzIG5vdCBzZXQKK0NPTkZJR19TVUJTVF9XQ0hBUj02MworQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSPTc2NworIyBDT05GSUdfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfV0lERV9XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19MT05HX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfREVWUFRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVRNUD15CitDT05GSUdfRkVBVFVSRV9XVE1QPXkKK0NPTkZJR19GRUFUVVJFX1BJREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfU1VJRD15CitDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRz15CitDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVD15CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9IQVZFX1JQQz15CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zCisjCisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCitDT05GSUdfUEFTU1dPUkRfTUlOTEVOPTYKK0NPTkZJR19NRDVfU0laRV9WU19TUEVFRD0yCitDT05GSUdfRkVBVFVSRV9GQVNUX1RPUD15CisjIENPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0xMDI0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE1CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZPXkKK0NPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfTU9OT1RPTklDX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorIyBDT05GSUdfRkVBVFVSRV9IV0lCIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKK0NPTkZJR19BUj15CitDT05GSUdfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUz15CitDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEU9eQorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fTz15CitDT05GSUdfRkVBVFVSRV9DUElPX1A9eQorIyBDT05GSUdfRFBLRyBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHX0RFQiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RQS0dfREVCX0VYVFJBQ1RfT05MWSBpcyBub3Qgc2V0CitDT05GSUdfR1VOWklQPXkKK0NPTkZJR19HWklQPXkKK0NPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TPXkKK0NPTkZJR19MWk9QPXkKKyMgQ09ORklHX0xaT1BfQ09NUFJfSElHSCBpcyBub3Qgc2V0CitDT05GSUdfUlBNMkNQSU89eQorQ09ORklHX1JQTT15CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1Q9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRT15CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKK0NPTkZJR19VTkNPTVBSRVNTPXkKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBTD15CitDT05GSUdfQ0FUPXkKK0NPTkZJR19DQVRWPXkKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKK0NPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ0hST09UPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ09NTT15CitDT05GSUdfQ1A9eQorQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TPXkKK0NPTkZJR19DVVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQ9eQorQ09ORklHX0ZFQVRVUkVfREFURV9DT01QQVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKK0NPTkZJR19ERj15CitDT05GSUdfRkVBVFVSRV9ERl9GQU5DWT15CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CitDT05GSUdfRk9MRD15CitDT05GSUdfRlNZTkM9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CitDT05GSUdfSE9TVElEPXkKK0NPTkZJR19JRD15CitDT05GSUdfSU5TVEFMTD15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTE49eQorQ09ORklHX0xPR05BTUU9eQorQ09ORklHX0xTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZJTEVUWVBFUz15CitDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUz15CitDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkU9eQorQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUU9eQorQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1I9eQorQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVD15CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CitDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlM9eQorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKK0NPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTklDRT15CitDT05GSUdfTk9IVVA9eQorQ09ORklHX09EPXkKK0NPTkZJR19QUklOVEVOVj15CitDT05GSUdfUFJJTlRGPXkKK0NPTkZJR19QV0Q9eQorQ09ORklHX1JFQURMSU5LPXkKK0NPTkZJR19GRUFUVVJFX1JFQURMSU5LX0ZPTExPVz15CitDT05GSUdfUkVBTFBBVEg9eQorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CitDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlM9eQorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CitDT05GSUdfU1RBVD15CitDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVD15CitDT05GSUdfU1RUWT15CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKK0NPTkZJR19UQUM9eQorQ09ORklHX1RBSUw9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfVEFJTD15CitDT05GSUdfVEVFPXkKK0NPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU89eQorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVU5BTUU9eQorQ09ORklHX1VORVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKK0NPTkZJR19VVURFQ09ERT15CitDT05GSUdfVVVFTkNPREU9eQorQ09ORklHX1dDPXkKK0NPTkZJR19GRUFUVVJFX1dDX0xBUkdFPXkKK0NPTkZJR19XSE89eQorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19DSFZUPXkKK0NPTkZJR19DTEVBUj15CitDT05GSUdfREVBTExPQ1ZUPXkKK0NPTkZJR19EVU1QS01BUD15CitDT05GSUdfS0JEX01PREU9eQorQ09ORklHX0xPQURGT05UPXkKK0NPTkZJR19MT0FES01BUD15CitDT05GSUdfT1BFTlZUPXkKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CitDT05GSUdfU0VUQ09OU09MRT15CitDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUz15CitDT05GSUdfU0VURk9OVD15CitDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQPXkKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCitDT05GSUdfU0VUS0VZQ09ERVM9eQorQ09ORklHX1NFVExPR0NPTlM9eQorQ09ORklHX1NIT1dLRVk9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBsb2FkZm9udCBhbmQgc2V0Zm9udAorIworIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1k9eQorQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19BV0s9eQorQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk09eQorQ09ORklHX0NNUD15CitDT05GSUdfRElGRj15CitDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1BBVENIPXkKK0NPTkZJR19TRUQ9eQorQ09ORklHX1ZJPXkKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49NDA5NgorIyBDT05GSUdfRkVBVFVSRV9WSV84QklUIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX0NPTE9OPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1lBTktNQVJLPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFQVJDSD15CitDT05GSUdfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUz15CitDT05GSUdfRkVBVFVSRV9WSV9ET1RfQ01EPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1JFQURPTkxZPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVE9QVFM9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1dJTl9SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUz15CitDT05GSUdfR1JFUD15CitDT05GSUdfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUPXkKK0NPTkZJR19YQVJHUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTj15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQ9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk09eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCitDT05GSUdfSU5JVD15CitDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQj15CisjIENPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKK0NPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFk9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFM9eQorQ09ORklHX0ZFQVRVUkVfSU5JVFJEPXkKK0NPTkZJR19IQUxUPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKK0NPTkZJR19NRVNHPXkKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUz15CitDT05GSUdfVVNFX0JCX1BXRF9HUlA9eQorQ09ORklHX1VTRV9CQl9TSEFET1c9eQorQ09ORklHX1VTRV9CQl9DUllQVD15CitDT05GSUdfVVNFX0JCX0NSWVBUX1NIQT15CitDT05GSUdfQURER1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVA9eQorQ09ORklHX0RFTEdST1VQPXkKK0NPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVA9eQorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUyBpcyBub3Qgc2V0CitDT05GSUdfQUREVVNFUj15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTEwMAorQ09ORklHX0xBU1RfU1lTVEVNX0lEPTk5OQorQ09ORklHX0RFTFVTRVI9eQorQ09ORklHX0dFVFRZPXkKK0NPTkZJR19MT0dJTj15CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorQ09ORklHX0xPR0lOX1NDUklQVFM9eQorQ09ORklHX0ZFQVRVUkVfTk9MT0dJTj15CitDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFk9eQorQ09ORklHX1BBU1NXRD15CitDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSz15CitDT05GSUdfQ1JZUFRQVz15CitDT05GSUdfQ0hQQVNTV0Q9eQorQ09ORklHX1NVPXkKK0NPTkZJR19GRUFUVVJFX1NVX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTPXkKK0NPTkZJR19TVUxPR0lOPXkKK0NPTkZJR19WTE9DSz15CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworQ09ORklHX0NIQVRUUj15CitDT05GSUdfRlNDSz15CitDT05GSUdfTFNBVFRSPXkKKworIworIyBMaW51eCBNb2R1bGUgVXRpbGl0aWVzCisjCitDT05GSUdfTU9EUFJPQkVfU01BTEw9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEPXkKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIvbGliL21vZHVsZXMiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0ibW9kdWxlcy5kZXAiCisKKyMKKyMgTGludXggU3lzdGVtIFV0aWxpdGllcworIworIyBDT05GSUdfQUNQSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BQ1BJRF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0JMS0lEPXkKK0NPTkZJR19ETUVTRz15CitDT05GSUdfRkVBVFVSRV9ETUVTR19QUkVUVFk9eQorQ09ORklHX0ZCU0VUPXkKK0NPTkZJR19GRUFUVVJFX0ZCU0VUX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0ZCU0VUX1JFQURNT0RFPXkKK0NPTkZJR19GREZMVVNIPXkKK0NPTkZJR19GREZPUk1BVD15CitDT05GSUdfRkRJU0s9eQorQ09ORklHX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1M9eQorQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEU9eQorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQ9eQorQ09ORklHX0ZJTkRGUz15CisjIENPTkZJR19GTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfRlJFRVJBTURJU0s9eQorQ09ORklHX0ZTQ0tfTUlOSVg9eQorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKK0NPTkZJR19NS0ZTX01JTklYPXkKKworIworIyBNaW5peCBmaWxlc3lzdGVtIHN1cHBvcnQKKyMKK0NPTkZJR19GRUFUVVJFX01JTklYMj15CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19WRkFUPXkKK0NPTkZJR19HRVRPUFQ9eQorQ09ORklHX0ZFQVRVUkVfR0VUT1BUX0xPTkc9eQorQ09ORklHX0hFWERVTVA9eQorQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFPXkKK0NPTkZJR19IRD15CitDT05GSUdfSFdDTE9DSz15CitDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTPXkKK0NPTkZJR19JUENSTT15CitDT05GSUdfSVBDUz15CitDT05GSUdfTE9TRVRVUD15CitDT05GSUdfTFNQQ0k9eQorQ09ORklHX0xTVVNCPXkKK0NPTkZJR19NREVWPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfQ09ORj15CitDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRT15CitDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFA9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9FWEVDPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRT15CitDT05GSUdfTUtTV0FQPXkKK0NPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEPXkKK0NPTkZJR19NT1JFPXkKK0NPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TPXkKK0NPTkZJR19WT0xVTUVJRD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWFQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRkFUPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0hGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfWEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX05URlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREY9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1Y9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzI9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhSQUlEPXkKK0NPTkZJR19NT1VOVD15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9GQUtFPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0U9eQorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX05GUz15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZTVEFCPXkKK0NPTkZJR19QSVZPVF9ST09UPXkKK0NPTkZJR19SREFURT15CitDT05GSUdfUkRFVj15CitDT05GSUdfUkVBRFBST0ZJTEU9eQorQ09ORklHX1JUQ1dBS0U9eQorQ09ORklHX1NDUklQVD15CitDT05GSUdfU0NSSVBUUkVQTEFZPXkKK0NPTkZJR19TRVRBUkNIPXkKK0NPTkZJR19TV0FQT05PRkY9eQorQ09ORklHX0ZFQVRVUkVfU1dBUE9OX1BSST15CitDT05GSUdfU1dJVENIX1JPT1Q9eQorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCitDT05GSUdfQURKVElNRVg9eQorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0JFRVA9eQorQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRPTQwMDAKK0NPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TPTMwCitDT05GSUdfQ0hBVD15CitDT05GSUdfRkVBVFVSRV9DSEFUX05PRkFJTD15CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVFRZX0hJRkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUj15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU49eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQ9eQorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9Ii92YXIvc3Bvb2wvY3JvbiIKK0NPTkZJR19DUk9OVEFCPXkKK0NPTkZJR19EQz15CitDT05GSUdfRkVBVFVSRV9EQ19MSUJNPXkKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKK0NPTkZJR19FSkVDVD15CitDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJPXkKK0NPTkZJR19GQlNQTEFTSD15CisjIENPTkZJR19GTEFTSENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTklDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZRCBpcyBub3Qgc2V0CitDT05GSUdfTEFTVD15CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWT15CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorQ09ORklHX0hEUEFSTT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQ9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorQ09ORklHX01BTj15CitDT05GSUdfTUlDUk9DT009eQorQ09ORklHX01PVU5UUE9JTlQ9eQorQ09ORklHX01UPXkKK0NPTkZJR19SQUlEQVVUT1JVTj15CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorQ09ORklHX1JVTkxFVkVMPXkKK0NPTkZJR19SWD15CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FPXkKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UVFlTSVpFPXkKK0NPTkZJR19WT0xOQU1FPXkKK0NPTkZJR19XQUxMPXkKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CitDT05GSUdfQlJDVEw9eQorQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVz15CitDT05GSUdfRE5TRD15CitDT05GSUdfRVRIRVJfV0FLRT15CitDT05GSUdfRkFLRUlERU5URD15CitDT05GSUdfRlRQRD15CitDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEU9eQorQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1Q9eQorQ09ORklHX0ZUUEdFVD15CitDT05GSUdfRlRQUFVUPXkKK0NPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlM9eQorQ09ORklHX0hPU1ROQU1FPXkKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1PXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NHST15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZPXkKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUD15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTPXkKKyMgQ09ORklHX0lGRU5TTEFWRSBpcyBub3Qgc2V0CitDT05GSUdfSUZQTFVHRD15CitDT05GSUdfSUZVUERPV049eQorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iL3Zhci9ydW4vaWZzdGF0ZSIKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU49eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjQ9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNj15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQ9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUU9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUU9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU49eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfUlBDPXkKK0NPTkZJR19JUD15CitDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTPXkKK0NPTkZJR19GRUFUVVJFX0lQX0xJTks9eQorQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JVTEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVM9eQorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CitDT05GSUdfSVBBRERSPXkKK0NPTkZJR19JUExJTks9eQorQ09ORklHX0lQUk9VVEU9eQorQ09ORklHX0lQVFVOTkVMPXkKK0NPTkZJR19JUFJVTEU9eQorQ09ORklHX0lQQ0FMQz15CitDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTkFNRUlGPXkKK0NPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRD15CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorQ09ORklHX05FVFNUQVQ9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHPXkKK0NPTkZJR19OU0xPT0tVUD15CitDT05GSUdfTlRQRD15CitDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUj15CitDT05GSUdfUElORz15CitDT05GSUdfUElORzY9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORz15CitDT05GSUdfUFNDQU49eQorQ09ORklHX1JPVVRFPXkKK0NPTkZJR19TTEFUVEFDSD15CitDT05GSUdfVENQU1ZEPXkKK0NPTkZJR19URUxORVQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU49eQorQ09ORklHX1RFTE5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVD15CitDT05GSUdfVEZUUD15CitDT05GSUdfVEZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfVFJBQ0VST1VURT15CitDT05GSUdfVFJBQ0VST1VURTY9eQorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKK0NPTkZJR19UVU5DVEw9eQorQ09ORklHX0ZFQVRVUkVfVFVOQ1RMX1VHPXkKK0NPTkZJR19VREhDUEQ9eQorQ09ORklHX0RIQ1BSRUxBWT15CitDT05GSUdfRFVNUExFQVNFUz15CitDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZPXkKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzIgorQ09ORklHX1VESENQQz15CitDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HPXkKK0NPTkZJR19GRUFUVVJFX1VESENQX1BPUlQ9eQorQ09ORklHX1VESENQX0RFQlVHPTkKK0NPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTc9eQorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTgwCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSItUiAtbiIKK0NPTkZJR19VRFBTVkQ9eQorQ09ORklHX1ZDT05GSUc9eQorQ09ORklHX1dHRVQ9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVI9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9XR0VUX1RJTUVPVVQ9eQorQ09ORklHX1pDSVA9eQorCisjCisjIFByaW50IFV0aWxpdGllcworIworQ09ORklHX0xQRD15CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCitDT05GSUdfTUFLRU1JTUU9eQorQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUPSJ1cy1hc2NpaSIKK0NPTkZJR19QT1BNQUlMRElSPXkKK0NPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlk9eQorQ09ORklHX1JFRk9STUlNRT15CitDT05GSUdfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUPXkKK0NPTkZJR19TRU5ETUFJTD15CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GUkVFPXkKK0NPTkZJR19GVVNFUj15CitDT05GSUdfS0lMTD15CitDT05GSUdfS0lMTEFMTD15CitDT05GSUdfS0lMTEFMTDU9eQorQ09ORklHX05NRVRFUj15CitDT05GSUdfUEdSRVA9eQorQ09ORklHX1BJRE9GPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRT15CitDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUPXkKK0NPTkZJR19QS0lMTD15CitDT05GSUdfUFM9eQorQ09ORklHX0ZFQVRVUkVfUFNfV0lERT15CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX1JFTklDRT15CitDT05GSUdfQkJfU1lTQ1RMPXkKK0NPTkZJR19UT1A9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfQ1BVPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1M9eQorQ09ORklHX0ZFQVRVUkVfVE9QTUVNPXkKK0NPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUz15CitDT05GSUdfVVBUSU1FPXkKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCitDT05GSUdfUlVOU1Y9eQorQ09ORklHX1JVTlNWRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKK0NPTkZJR19GRUFUVVJFX1NIX0lTX0FTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19BU0g9eQorQ09ORklHX0FTSF9CQVNIX0NPTVBBVD15CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKK0NPTkZJR19BU0hfQUxJQVM9eQorQ09ORklHX0FTSF9HRVRPUFRTPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9FQ0hPPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9QUklOVEY9eQorQ09ORklHX0FTSF9CVUlMVElOX1RFU1Q9eQorQ09ORklHX0FTSF9DTURDTUQ9eQorIyBDT05GSUdfQVNIX01BSUwgaXMgbm90IHNldAorQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUPXkKK0NPTkZJR19BU0hfRVhQQU5EX1BSTVQ9eQorQ09ORklHX0hVU0g9eQorQ09ORklHX0hVU0hfQkFTSF9DT01QQVQ9eQorQ09ORklHX0hVU0hfSEVMUD15CitDT05GSUdfSFVTSF9JTlRFUkFDVElWRT15CitDT05GSUdfSFVTSF9KT0I9eQorQ09ORklHX0hVU0hfVElDSz15CitDT05GSUdfSFVTSF9JRj15CitDT05GSUdfSFVTSF9MT09QUz15CitDT05GSUdfSFVTSF9DQVNFPXkKK0NPTkZJR19IVVNIX0ZVTkNUSU9OUz15CitDT05GSUdfSFVTSF9MT0NBTD15CitDT05GSUdfSFVTSF9FWFBPUlRfTj15CitDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVD15CitDT05GSUdfTVNIPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlQ9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVD15CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorQ09ORklHX0NUVFlIQUNLPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTI1NgorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL2FuZHJvaWRfZGVmY29uZmlnIGIvY29uZmlncy9hbmRyb2lkX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUyMzJhCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9hbmRyb2lkX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEwMTQgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjE5LjAuZ2l0CisjIFdlZCBKdW4gMjkgMTI6MDE6NTcgMjAxMQorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfREVTS1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFRSQV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5DTFVERV9TVVN2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfUExBVEZPUk1fTElOVVg9eQorQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DPXkKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19PTl9TVEFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTAKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj0wCisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorIyBDT05GSUdfTE9OR19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJREZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfTEZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9ImFybS1lYWJpLSIKKyMKKyMgUmVtb3ZlZDoKKyMgd2FybmluZyBmbGFnczoKKyMgLVduby1tdWx0aWNoYXIgLVcgLVdhbGwgLVduby11bnVzZWQgLVdpbml0LXNlbGYgLVdwb2ludGVyLWFyaXRoCisjIC1XZXJyb3I9cmV0dXJuLXR5cGUgLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yIC1XZXJyb3I9YWRkcmVzcworIyAtV2Vycm9yPXNlcXVlbmNlLXBvaW50IC1Xc3RyaWN0LWFsaWFzaW5nPTIgLVduby11bmRlZiAtV25vLXNoYWRvdworIyBiYm94IGFscmVhZHkgYWRkcyB0aGVzZToKKyMgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZm9taXQtZnJhbWUtcG9pbnRlcgorIyBzaG91bGQgYmUgbm90IG5lZWRlZCwgb3IgZXZlbiBpbmNyZWFzZXMgY29kZSBzaXplOgorIyAtZmlubGluZS1mdW5jdGlvbnMgLWZuby1pbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIC1maW5saW5lLWxpbWl0PTY0CisjIC1mc3RhY2stcHJvdGVjdG9yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tZXhjZXB0aW9ucyAtZnVud2luZC10YWJsZXMKKyMgLWZtZXNzYWdlLWxlbmd0aD0wIChvbmx5IGFmZmVjdHMgZXJyb3IgbWVzc2FnZSBmb3JtYXQpCisjIHRvZG86IGRvIHdlIG5lZWQgdGhlc2U/IC0KKyMgLWZuby1zaG9ydC1lbnVtcworIyAtZmdjc2UtYWZ0ZXItcmVsb2FkCisjIC1mcmVydW4tY3NlLWFmdGVyLWxvb3AKKyMgLWZyZW5hbWUtcmVnaXN0ZXJzCitDT05GSUdfRVhUUkFfQ0ZMQUdTPSItSSRBL3N5c3RlbS9jb3JlL2luY2x1ZGUgLUkkQS9iaW9uaWMvbGliYy9hcmNoLWFybS9pbmNsdWRlIC1JJEEvYmlvbmljL2xpYmMvaW5jbHVkZSAtSSRBL2Jpb25pYy9saWJjL2tlcm5lbC9jb21tb24gLUkkQS9iaW9uaWMvbGliYy9rZXJuZWwvYXJjaC1hcm0gLUkkQS9iaW9uaWMvbGlibS9pbmNsdWRlIC1JJEEvYmlvbmljL2xpYm0vaW5jbHVkZS9hcmNoL2FybSAtaW5jbHVkZSAkQS9zeXN0ZW0vY29yZS9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaCAtSSRBL3N5c3RlbS9jb3JlL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vIC1EQU5EUk9JRCAtRFNLX1JFTEVBU0UgLW5vc3RkbGliIC1tYXJjaD1hcm12Ny1hIC1tc29mdC1mbG9hdCAtbWZsb2F0LWFiaT1zb2Z0ZnAgLW1mcHU9bmVvbiAtbXRodW1iIC1tdGh1bWItaW50ZXJ3b3JrIC1mcGljIC1mbm8tc2hvcnQtZW51bXMgLWZnY3NlLWFmdGVyLXJlbG9hZCAtZnJlcnVuLWNzZS1hZnRlci1sb29wIC1mcmVuYW1lLXJlZ2lzdGVycyIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpCisjCitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCisjIENPTkZJR19GRUFUVVJFX1NZU1RFTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVE1JTk1BWCBpcyBub3Qgc2V0CitDT05GSUdfUEFTU1dPUkRfTUlOTEVOPTYKK0NPTkZJR19NRDVfU0laRV9WU19TUEVFRD0yCisjIENPTkZJR19GRUFUVVJFX0ZBU1RfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TPXkKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0wCisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQUJfQ09NUExFVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfRkVBVFVSRV9TS0lQX1JPT1RGUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT05PVE9OSUNfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdJQiBpcyBub3Qgc2V0CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CitDT05GSUdfQVI9eQorQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVM9eQorQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFPXkKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CitDT05GSUdfRkVBVFVSRV9DUElPX089eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19QPXkKK0NPTkZJR19EUEtHPXkKK0NPTkZJR19EUEtHX0RFQj15CisjIENPTkZJR19GRUFUVVJFX0RQS0dfREVCX0VYVFJBQ1RfT05MWSBpcyBub3Qgc2V0CitDT05GSUdfR1VOWklQPXkKK0NPTkZJR19HWklQPXkKKyMgQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0xaT1A9eQorQ09ORklHX0xaT1BfQ09NUFJfSElHSD15CitDT05GSUdfUlBNMkNQSU89eQorQ09ORklHX1JQTT15CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1Q9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfVU5DT01QUkVTUz15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfTFpNQT15CitDT05GSUdfVU5YWj15CitDT05GSUdfWFo9eQorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FUPXkKKyMgQ09ORklHX0RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfVEVTVD15CitDT05GSUdfRkVBVFVSRV9URVNUXzY0PXkKK0NPTkZJR19UT1VDSD15CitDT05GSUdfVFI9eQorQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUz15CitDT05GSUdfRkVBVFVSRV9UUl9FUVVJVj15CitDT05GSUdfQkFTRTY0PXkKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorIyBDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorQ09ORklHX0NPTU09eQorQ09ORklHX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DVVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKKyMgQ09ORklHX0RGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREZfRkFOQ1kgaXMgbm90IHNldAorQ09ORklHX0RJUk5BTUU9eQorQ09ORklHX0RPUzJVTklYPXkKK0NPTkZJR19VTklYMkRPUz15CitDT05GSUdfRFU9eQorQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUs9eQorQ09ORklHX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITz15CisjIENPTkZJR19FTlYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBBTkQ9eQorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQgaXMgbm90IHNldAorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GT0xEPXkKKyMgQ09ORklHX0ZTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19IRUFEPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQ9eQorIyBDT05GSUdfSE9TVElEIGlzIG5vdCBzZXQKK0NPTkZJR19JTlNUQUxMPXkKKyMgQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0xOPXkKKyMgQ09ORklHX0xPR05BTUUgaXMgbm90IHNldAorQ09ORklHX0xTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZJTEVUWVBFUz15CitDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUz15CitDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkU9eQorQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUU9eQorIyBDT05GSUdfRkVBVFVSRV9MU19DT0xPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorIyBDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19OSUNFPXkKK0NPTkZJR19OT0hVUD15CitDT05GSUdfT0Q9eQorQ09ORklHX1BSSU5URU5WPXkKK0NPTkZJR19QUklOVEY9eQorQ09ORklHX1BXRD15CitDT05GSUdfUkVBRExJTks9eQorQ09ORklHX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XPXkKK0NPTkZJR19SRUFMUEFUSD15CitDT05GSUdfUk09eQorQ09ORklHX1JNRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19TRVE9eQorQ09ORklHX1NIQTFTVU09eQorQ09ORklHX1NIQTI1NlNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUD15CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorIyBDT05GSUdfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TVFRZPXkKK0NPTkZJR19TVU09eQorQ09ORklHX1NZTkM9eQorQ09ORklHX1RBQz15CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CisjIENPTkZJR19UVFkgaXMgbm90IHNldAorQ09ORklHX1VOQU1FPXkKK0NPTkZJR19VTkVYUEFORD15CisjIENPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfVU5JUT15CisjIENPTkZJR19VU0xFRVAgaXMgbm90IHNldAorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdgorIworQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldAorIworQ09ORklHX0ZFQVRVUkVfQVVUT1dJRFRIPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscworIworQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEU9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtCisjCitDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0s9eQorCisjCisjIENvbnNvbGUgVXRpbGl0aWVzCisjCitDT05GSUdfQ0hWVD15CitDT05GSUdfRkdDT05TT0xFPXkKK0NPTkZJR19DTEVBUj15CitDT05GSUdfREVBTExPQ1ZUPXkKK0NPTkZJR19EVU1QS01BUD15CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CitDT05GSUdfTE9BREtNQVA9eQorQ09ORklHX09QRU5WVD15CitDT05GSUdfUkVTRVQ9eQorQ09ORklHX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQ9eQorQ09ORklHX1NFVENPTlNPTEU9eQorIyBDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorQ09ORklHX1NFVEtFWUNPREVTPXkKK0NPTkZJR19TRVRMT0dDT05TPXkKK0NPTkZJR19TSE9XS0VZPXkKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUFNGMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworQ09ORklHX01LVEVNUD15CitDT05GSUdfUElQRV9QUk9HUkVTUz15CitDT05GSUdfUlVOX1BBUlRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1k9eQorQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX1BBVENIPXkKKyMgQ09ORklHX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49MAorIyBDT05GSUdfRkVBVFVSRV9WSV84QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfQ09MT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1JFR0VYX1NFQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1JFQURPTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1dJTl9SRVNJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVdLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk0gaXMgbm90IHNldAorQ09ORklHX0NNUD15CitDT05GSUdfRElGRj15CisjIENPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKKyMgQ09ORklHX0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUMgaXMgbm90IHNldAorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19GSU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9NTUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9YREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0lOVU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9OT1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QQVJFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0xJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dSRVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVCBpcyBub3Qgc2V0CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfQk9PVENIQVJURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQUxUPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKK0NPTkZJR19JTklUPXkKK0NPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCPXkKKyMgQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MAorQ09ORklHX0ZFQVRVUkVfSU5JVF9TQ1RUWT15CitDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVD15CitDT05GSUdfRkVBVFVSRV9JTklUX0NPUkVEVU1QUz15CitDT05GSUdfRkVBVFVSRV9JTklUUkQ9eQorQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRT0ibGludXgiCitDT05GSUdfTUVTRz15CitDT05GSUdfRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQPXkKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfQUREX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTU9WRV9TSEVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1BXRF9HUlAgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1NIQURPVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUX1NIQSBpcyBub3Qgc2V0CisjIENPTkZJR19BRERVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUyBpcyBub3Qgc2V0CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD0wCisjIENPTkZJR19BRERHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVMVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUxHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfR0VUVFkgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOX1NDUklQVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBU1NXRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUUFcgaXMgbm90IHNldAorIyBDT05GSUdfQ0hQQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfU1UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfVkxPQ0sgaXMgbm90IHNldAorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorIyBDT05GSUdfRlNDSyBpcyBub3Qgc2V0CitDT05GSUdfTFNBVFRSPXkKK0NPTkZJR19UVU5FMkZTPXkKKworIworIyBMaW51eCBNb2R1bGUgVXRpbGl0aWVzCisjCitDT05GSUdfTU9ESU5GTz15CitDT05GSUdfTU9EUFJPQkVfU01BTEw9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEPXkKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIvbGliL21vZHVsZXMiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0ibW9kdWxlcy5kZXAiCisKKyMKKyMgTGludXggU3lzdGVtIFV0aWxpdGllcworIworQ09ORklHX0JMT0NLREVWPXkKK0NPTkZJR19SRVY9eQorIyBDT05GSUdfQUNQSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BQ1BJRF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0JMS0lEPXkKKyMgQ09ORklHX0ZFQVRVUkVfQkxLSURfVFlQRSBpcyBub3Qgc2V0CitDT05GSUdfRE1FU0c9eQorQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZPXkKK0NPTkZJR19GQlNFVD15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERT15CitDT05GSUdfRkRGTFVTSD15CitDT05GSUdfRkRGT1JNQVQ9eQorQ09ORklHX0ZESVNLPXkKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKK0NPTkZJR19GRUFUVVJFX0ZESVNLX1dSSVRBQkxFPXkKKyMgQ09ORklHX0ZFQVRVUkVfQUlYX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VOX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfT1NGX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1BUX0xBQkVMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEPXkKK0NPTkZJR19GSU5ERlM9eQorQ09ORklHX0ZMT0NLPXkKK0NPTkZJR19GUkVFUkFNRElTSz15CisjIENPTkZJR19GU0NLX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUlOSVgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfUkVJU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfVkZBVCBpcyBub3Qgc2V0CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorIyBDT05GSUdfSFdDTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENTIGlzIG5vdCBzZXQKK0NPTkZJR19MT1NFVFVQPXkKK0NPTkZJR19MU1BDST15CitDT05GSUdfTFNVU0I9eQorIyBDT05GSUdfTURFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfQ09ORiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFIGlzIG5vdCBzZXQKK0NPTkZJR19NS1NXQVA9eQorQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQ9eQorQ09ORklHX01PUkU9eQorIyBDT05GSUdfTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GQUtFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX05GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GTEFHUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZTVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJVk9UX1JPT1QgaXMgbm90IHNldAorIyBDT05GSUdfUkRBVEUgaXMgbm90IHNldAorQ09ORklHX1JERVY9eQorQ09ORklHX1JFQURQUk9GSUxFPXkKK0NPTkZJR19SVENXQUtFPXkKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorIyBDT05GSUdfVU1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01UQUJfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVk9MVU1FSUQ9eQorCisjCisjIEZpbGVzeXN0ZW0vVm9sdW1lIGlkZW50aWZpY2F0aW9uCisjCitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWFQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRkFUPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0hGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfWEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX05URlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREY9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1Y9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzI9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhSQUlEPXkKKworIworIyBNaXNjZWxsYW5lb3VzIFV0aWxpdGllcworIworIyBDT05GSUdfQ09OU1BZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkRXUklURSBpcyBub3Qgc2V0CitDT05GSUdfTkFORERVTVA9eQorQ09ORklHX1NFVFNFUklBTD15CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BREpUSU1FWCBpcyBub3Qgc2V0CisjIENPTkZJR19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19CRUVQPXkKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT00MDAwCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0zMAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1I9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUPXkKK0NPTkZJR19DSFJUPXkKKyMgQ09ORklHX0NST05EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIiCisjIENPTkZJR19DUk9OVEFCIGlzIG5vdCBzZXQKK0NPTkZJR19EQz15CitDT05GSUdfRkVBVFVSRV9EQ19MSUJNPXkKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfRkJTUExBU0g9eQorQ09ORklHX0ZMQVNIQ1A9eQorQ09ORklHX0ZMQVNIX0xPQ0s9eQorQ09ORklHX0ZMQVNIX1VOTE9DSz15CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRllEPXkKKyMgQ09ORklHX0xBU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19MRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9MAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0JSQUNLRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0RBU0hDTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0xJTkVOVU1TIGlzIG5vdCBzZXQKK0NPTkZJR19IRFBBUk09eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQT15CitDT05GSUdfTUFLRURFVlM9eQorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19MRUFGIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01BS0VERVZTX1RBQkxFPXkKK0NPTkZJR19NQU49eQorIyBDT05GSUdfTUlDUk9DT00gaXMgbm90IHNldAorIyBDT05GSUdfTU9VTlRQT0lOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVCBpcyBub3Qgc2V0CitDT05GSUdfUkFJREFVVE9SVU49eQorIyBDT05GSUdfUkVBREFIRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5MRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfUlg9eQorQ09ORklHX1NFVFNJRD15CitDT05GSUdfU1RSSU5HUz15CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CitDT05GSUdfVElNRU9VVD15CitDT05GSUdfVFRZU0laRT15CitDT05GSUdfVk9MTkFNRT15CisjIENPTkZJR19XQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKK0NPTkZJR19OQkRDTElFTlQ9eQorQ09ORklHX05DPXkKK0NPTkZJR19OQ19TRVJWRVI9eQorQ09ORklHX05DX0VYVFJBPXkKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkcgaXMgbm90IHNldAorQ09ORklHX1dIT0lTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0FSUD15CisjIENPTkZJR19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfQlJDVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX1NIT1cgaXMgbm90IHNldAorQ09ORklHX0ROU0Q9eQorIyBDT05GSUdfRVRIRVJfV0FLRSBpcyBub3Qgc2V0CitDT05GSUdfRkFLRUlERU5URD15CitDT05GSUdfRlRQRD15CitDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEU9eQorQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1Q9eQorQ09ORklHX0ZUUEdFVD15CitDT05GSUdfRlRQUFVUPXkKKyMgQ09ORklHX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfSFRUUEQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1VTRV9TRU5ERklMRT15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRVSUQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSD15CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1IGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NHST15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0daSVA9eQorQ09ORklHX0lGQ09ORklHPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUz15CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUT15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19IVz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUz15CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CitDT05GSUdfSUZVUERPV049eQorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iL3Zhci9ydW4vaWZzdGF0ZSIKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU49eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjQ9eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY2IGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkc9eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CitDT05GSUdfSVA9eQorQ09ORklHX0ZFQVRVUkVfSVBfQUREUkVTUz15CitDT05GSUdfRkVBVFVSRV9JUF9MSU5LPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JPVVRFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1RVTk5FTD15CitDT05GSUdfRkVBVFVSRV9JUF9SVUxFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TPXkKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorQ09ORklHX0lQQUREUj15CitDT05GSUdfSVBMSU5LPXkKK0NPTkZJR19JUFJPVVRFPXkKK0NPTkZJR19JUFRVTk5FTD15CitDT05GSUdfSVBSVUxFPXkKK0NPTkZJR19JUENBTEM9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZPXkKKyMgQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUU1RBVD15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1dJREU9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9QUkc9eQorIyBDT05GSUdfTlNMT09LVVAgaXMgbm90IHNldAorIyBDT05GSUdfTlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSIGlzIG5vdCBzZXQKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorIyBDT05GSUdfU0xBVFRBQ0ggaXMgbm90IHNldAorQ09ORklHX1RDUFNWRD15CisjIENPTkZJR19URUxORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfVFRZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTE5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CitDT05GSUdfVFVOQ1RMPXkKK0NPTkZJR19GRUFUVVJFX1RVTkNUTF9VRz15CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iIgorQ09ORklHX1VESENQQz15CitDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HPXkKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVURIQ1BfREVCVUc9OQorQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5Nz15CitDT05GSUdfRkVBVFVSRV9VREhDUF84MDIxUT15CitDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUPSIvdXNyL3NoYXJlL3VkaGNwYy9kZWZhdWx0LnNjcmlwdCIKK0NPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlM9ODAKK0NPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlM9Ii1SIC1uIgorIyBDT05GSUdfVURQU1ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZDT05GSUcgaXMgbm90IHNldAorQ09ORklHX1dHRVQ9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVI9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTj15CisjIENPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVD15CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKK0NPTkZJR19MUEQ9eQorQ09ORklHX0xQUj15CitDT05GSUdfTFBRPXkKKworIworIyBNYWlsIFV0aWxpdGllcworIworQ09ORklHX01BS0VNSU1FPXkKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0idXMtYXNjaWkiCitDT05GSUdfUE9QTUFJTERJUj15CitDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZPXkKK0NPTkZJR19SRUZPUk1JTUU9eQorQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVD15CitDT05GSUdfU0VORE1BSUw9eQorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfSU9TVEFUPXkKK0NPTkZJR19NUFNUQVQ9eQorQ09ORklHX05NRVRFUj15CitDT05GSUdfUE1BUD15CitDT05GSUdfUE9XRVJUT1A9eQorQ09ORklHX1BTVFJFRT15CitDT05GSUdfUFdEWD15CitDT05GSUdfU01FTUNBUD15CisjIENPTkZJR19GUkVFIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFUj15CisjIENPTkZJR19LSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTExBTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0lMTEFMTDUgaXMgbm90IHNldAorIyBDT05GSUdfUEdSRVAgaXMgbm90IHNldAorQ09ORklHX1BJRE9GPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRT15CitDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUPXkKKyMgQ09ORklHX1BLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX1JFTklDRT15CitDT05GSUdfQkJfU1lTQ1RMPXkKK0NPTkZJR19UT1A9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfQ1BVPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1M9eQorQ09ORklHX0ZFQVRVUkVfVE9QTUVNPXkKK0NPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUz15CisjIENPTkZJR19VUFRJTUUgaXMgbm90IHNldAorQ09ORklHX1dBVENIPXkKKworIworIyBSdW5pdCBVdGlsaXRpZXMKKyMKK0NPTkZJR19SVU5TVj15CitDT05GSUdfUlVOU1ZESVI9eQorIyBDT05GSUdfRkVBVFVSRV9SVU5TVkRJUl9MT0cgaXMgbm90IHNldAorQ09ORklHX1NWPXkKK0NPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSPSIvdmFyL3NlcnZpY2UiCitDT05GSUdfU1ZMT0dEPXkKK0NPTkZJR19DSFBTVD15CitDT05GSUdfU0VUVUlER0lEPXkKK0NPTkZJR19FTlZVSURHSUQ9eQorQ09ORklHX0VOVkRJUj15CitDT05GSUdfU09GVExJTUlUPXkKKyMgQ09ORklHX0NIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfR0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVENIUEFUSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNUT1JFQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWEVOQUJMRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGSUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfU0VTVEFUVVMgaXMgbm90IHNldAorCisjCisjIFNoZWxscworIworIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSURMRV9USU1FT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9KT0JfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQ01EQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKK0NPTkZJR19DVFRZSEFDSz15CisjIENPTkZJR19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CUkFDRV9FWFBBTlNJT04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9IRUxQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSU5URVJBQ1RJVkUgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9TQVZFSElTVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0pPQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JRiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQ0FTRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0ZVTkNUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9FWFBPUlRfTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX01PREVfWCBpcyBub3Qgc2V0CisjIENPTkZJR19NU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX05PTkU9eQorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CQVNIX0lTX05PTkU9eQorIyBDT05GSUdfU0hfTUFUSF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX01BVEhfU1VQUE9SVF82NCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0VYVFJBX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX05PRk9SSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0hJU1RGSUxFU0laRSBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19TWVNMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0NGRyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfTE9HUkVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19LTE9HRD15CitDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMPXkKKyMgQ09ORklHX0xPR0dFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9jb25maWdzL2N5Z3dpbl9kZWZjb25maWcgYi9jb25maWdzL2N5Z3dpbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyZDY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvY3lnd2luX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk5NyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTkuMC5naXQKKyMgU3VuIEp1bCAxMCAxMjo0ODo1MCAyMDExCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCitDT05GSUdfREVTS1RPUD15CisjIENPTkZJR19FWFRSQV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0lOQ0xVREVfU1VTdjI9eQorIyBDT05GSUdfVVNFX1BPUlRBQkxFX0NPREUgaXMgbm90IHNldAorQ09ORklHX1BMQVRGT1JNX0xJTlVYPXkKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExFUj15CisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NBTEVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JQ09ERV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTY1NTMzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9MAorIyBDT05GSUdfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfV0lERV9XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOIGlzIG5vdCBzZXQKK0NPTkZJR19MT05HX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfREVWUFRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBub3Qgc2V0CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorQ09ORklHX0ZFQVRVUkVfU1lTTE9HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEMgaXMgbm90IHNldAorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpCisjCitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCisjIENPTkZJR19GRUFUVVJFX1NZU1RFTUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUlRNSU5NQVg9eQorQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NJWkVfVlNfU1BFRUQ9MgorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0yNTUKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlk9eQorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUPXkKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorQ09ORklHX0ZFQVRVUkVfU0tJUF9ST09URlM9eQorIyBDT05GSUdfTU9OT1RPTklDX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorQ09ORklHX0ZFQVRVUkVfSFdJQj15CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorIyBDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEUgaXMgbm90IHNldAorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fTz15CitDT05GSUdfRkVBVFVSRV9DUElPX1A9eQorIyBDT05GSUdfRFBLRyBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHX0RFQiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RQS0dfREVCX0VYVFJBQ1RfT05MWSBpcyBub3Qgc2V0CitDT05GSUdfR1VOWklQPXkKK0NPTkZJR19HWklQPXkKK0NPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TPXkKK0NPTkZJR19MWk9QPXkKKyMgQ09ORklHX0xaT1BfQ09NUFJfSElHSCBpcyBub3Qgc2V0CitDT05GSUdfUlBNMkNQSU89eQorQ09ORklHX1JQTT15CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1Q9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfVE9fQ09NTUFORD15CitDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRT15CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOQ09NUFJFU1MgaXMgbm90IHNldAorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX0xaTUE9eQorQ09ORklHX1VOWFo9eQorQ09ORklHX1haPXkKK0NPTkZJR19VTlpJUD15CisKKyMKKyMgQ29yZXV0aWxzCisjCitDT05GSUdfQkFTRU5BTUU9eQorQ09ORklHX0NBVD15CitDT05GSUdfREFURT15CitDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVD15CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVD15CitDT05GSUdfSUQ9eQorQ09ORklHX0dST1VQUz15CitDT05GSUdfVEVTVD15CitDT05GSUdfRkVBVFVSRV9URVNUXzY0PXkKK0NPTkZJR19UT1VDSD15CitDT05GSUdfVFI9eQorQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUz15CitDT05GSUdfRkVBVFVSRV9UUl9FUVVJVj15CitDT05GSUdfQkFTRTY0PXkKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CitDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlM9eQorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorQ09ORklHX0RGPXkKK0NPTkZJR19GRUFUVVJFX0RGX0ZBTkNZPXkKK0NPTkZJR19ESVJOQU1FPXkKK0NPTkZJR19ET1MyVU5JWD15CitDT05GSUdfVU5JWDJET1M9eQorQ09ORklHX0RVPXkKKyMgQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsgaXMgbm90IHNldAorQ09ORklHX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITz15CitDT05GSUdfRU5WPXkKK0NPTkZJR19GRUFUVVJFX0VOVl9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUEFORD15CitDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorQ09ORklHX0ZPTEQ9eQorQ09ORklHX0ZTWU5DPXkKK0NPTkZJR19IRUFEPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQ9eQorQ09ORklHX0hPU1RJRD15CitDT05GSUdfSU5TVEFMTD15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTE49eQorQ09ORklHX0xPR05BTUU9eQorQ09ORklHX0xTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZJTEVUWVBFUz15CitDT05GSUdfRkVBVFVSRV9MU19GT0xMT1dMSU5LUz15CitDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkU9eQorQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUU9eQorQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1I9eQorQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVD15CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CitDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlM9eQorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKK0NPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTklDRT15CitDT05GSUdfTk9IVVA9eQorQ09ORklHX09EPXkKK0NPTkZJR19QUklOVEVOVj15CitDT05GSUdfUFJJTlRGPXkKK0NPTkZJR19QV0Q9eQorQ09ORklHX1JFQURMSU5LPXkKK0NPTkZJR19GRUFUVVJFX1JFQURMSU5LX0ZPTExPVz15CitDT05GSUdfUkVBTFBBVEg9eQorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CitDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlM9eQorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CisjIENPTkZJR19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQgaXMgbm90IHNldAorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CitDT05GSUdfVEFDPXkKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUw9eQorQ09ORklHX1RFRT15CitDT05GSUdfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPPXkKK0NPTkZJR19UUlVFPXkKK0NPTkZJR19UVFk9eQorQ09ORklHX1VOQU1FPXkKK0NPTkZJR19VTkVYUEFORD15CitDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX1VOSVE9eQorQ09ORklHX1VTTEVFUD15CitDT05GSUdfVVVERUNPREU9eQorQ09ORklHX1VVRU5DT0RFPXkKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CisjIENPTkZJR19XSE8gaXMgbm90IHNldAorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NIVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkdDT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19DTEVBUj15CisjIENPTkZJR19ERUFMTE9DVlQgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUEtNQVAgaXMgbm90IHNldAorIyBDT05GSUdfS0JEX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREtNQVAgaXMgbm90IHNldAorIyBDT05GSUdfT1BFTlZUIGlzIG5vdCBzZXQKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CisjIENPTkZJR19TRVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VURk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVAgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVI9IiIKKyMgQ09ORklHX1NFVEtFWUNPREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVExPR0NPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0hPV0tFWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorQ09ORklHX1BJUEVfUFJPR1JFU1M9eQorQ09ORklHX1JVTl9QQVJUUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWT15CitDT05GSUdfU1RBUlRfU1RPUF9EQUVNT049eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX1BBVENIPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTQwOTYKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1I9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUz15CitDT05GSUdfR1JFUD15CitDT05GSUdfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUPXkKK0NPTkZJR19YQVJHUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTj15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQ9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk09eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFMVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCisjIENPTkZJR19JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCisjIENPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRT0iIgorQ09ORklHX01FU0c9eQorQ09ORklHX0ZFQVRVUkVfTUVTR19FTkFCTEVfT05MWV9HUk9VUD15CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKK0NPTkZJR19BRERfU0hFTEw9eQorQ09ORklHX1JFTU9WRV9TSEVMTD15CitDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTPXkKK0NPTkZJR19VU0VfQkJfUFdEX0dSUD15CitDT05GSUdfVVNFX0JCX1NIQURPVz15CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKK0NPTkZJR19BRERVU0VSPXkKK0NPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0xMDAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD05OTkKK0NPTkZJR19BRERHUk9VUD15CitDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15CitDT05GSUdfREVMVVNFUj15CitDT05GSUdfREVMR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUD15CisjIENPTkZJR19HRVRUWSBpcyBub3Qgc2V0CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dJTl9TQ1JJUFRTPXkKK0NPTkZJR19GRUFUVVJFX05PTE9HSU49eQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZPXkKK0NPTkZJR19QQVNTV0Q9eQorQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0s9eQorQ09ORklHX0NSWVBUUFc9eQorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CitDT05GSUdfVkxPQ0s9eQorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorIyBDT05GSUdfRlNDSyBpcyBub3Qgc2V0CisjIENPTkZJR19MU0FUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVFVORTJGUyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworIyBDT05GSUdfTU9ESU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0iIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JMT0NLREVWIGlzIG5vdCBzZXQKK0NPTkZJR19SRVY9eQorIyBDT05GSUdfQUNQSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BQ1BJRF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CTEtJRF9UWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19GREZMVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJTkRGUyBpcyBub3Qgc2V0CitDT05GSUdfRkxPQ0s9eQorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorQ09ORklHX0ZTQ0tfTUlOSVg9eQorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfTUlOSVggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUlOSVgyPXkKKyMgQ09ORklHX01LRlNfUkVJU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfVkZBVCBpcyBub3Qgc2V0CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorIyBDT05GSUdfSFdDTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUyBpcyBub3Qgc2V0CitDT05GSUdfSVBDUk09eQorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0NPTkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRSBpcyBub3Qgc2V0CitDT05GSUdfTUtTV0FQPXkKK0NPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEPXkKK0NPTkZJR19NT1JFPXkKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CisjIENPTkZJR19SVENXQUtFIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorIyBDT05GSUdfVU1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01UQUJfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WT0xVTUVJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU5EV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkFORERVTVAgaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSUFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklERVRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJTUtWT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJUk1WT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJUlNWT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJVVBEQVRFVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JCQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQkVFUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVE9MAorQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVM9MAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1I9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUPXkKK0NPTkZJR19DSFJUPXkKK0NPTkZJR19DUk9ORD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUw9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIvdmFyL3Nwb29sL2Nyb24iCitDT05GSUdfQ1JPTlRBQj15CitDT05GSUdfREM9eQorQ09ORklHX0ZFQVRVUkVfRENfTElCTT15CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorQ09ORklHX0RFVk1FTT15CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfRkJTUExBU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19MRVNTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9OTk5OTk5OQorQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFA9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19XSU5DSD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0RBU0hDTUQ9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUz15CisjIENPTkZJR19IRFBBUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUtFREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfTUFOPXkKKyMgQ09ORklHX01JQ1JPQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVU5UUE9JTlQgaXMgbm90IHNldAorQ09ORklHX01UPXkKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQURBSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorIyBDT05GSUdfUlggaXMgbm90IHNldAorQ09ORklHX1NFVFNJRD15CitDT05GSUdfU1RSSU5HUz15CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CitDT05GSUdfVElNRU9VVD15CitDT05GSUdfVFRZU0laRT15CitDT05GSUdfVk9MTkFNRT15CisjIENPTkZJR19XQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05CRENMSUVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorIyBDT05GSUdfTkNfMTEwX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkc2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORyBpcyBub3Qgc2V0CitDT05GSUdfV0hPSVM9eQorQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfQlJDVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX1NIT1cgaXMgbm90IHNldAorQ09ORklHX0ROU0Q9eQorIyBDT05GSUdfRVRIRVJfV0FLRSBpcyBub3Qgc2V0CitDT05GSUdfRkFLRUlERU5URD15CitDT05GSUdfRlRQRD15CitDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEU9eQorQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1Q9eQorQ09ORklHX0ZUUEdFVD15CitDT05GSUdfRlRQUFVUPXkKK0NPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlM9eQorQ09ORklHX0hPU1ROQU1FPXkKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUD15CisjIENPTkZJR19JRkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CitDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIPSIiCisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVURD15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITz15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRD15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRT15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRT15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTj15CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUEFERFIgaXMgbm90IHNldAorIyBDT05GSUdfSVBMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBUVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBSVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19JUENBTEM9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlM9eQorIyBDT05GSUdfTkVUU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TTE9PS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05UUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUiBpcyBub3Qgc2V0CitDT05GSUdfUFNDQU49eQorIyBDT05GSUdfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfU0xBVFRBQ0ggaXMgbm90IHNldAorQ09ORklHX1RDUFNWRD15CitDT05GSUdfVEVMTkVUPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRT15CitDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOPXkKK0NPTkZJR19URUxORVREPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQ9eQorQ09ORklHX1RGVFA9eQorQ09ORklHX1RGVFBEPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgdGZ0cC90ZnRwZAorIworQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iIgorIyBDT05GSUdfVURIQ1BDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQX1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VESENQX0RFQlVHPTAKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRIGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9IiIKK0NPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlM9MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iIgorQ09ORklHX1VEUFNWRD15CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworQ09ORklHX0xQRD15CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCitDT05GSUdfTUFLRU1JTUU9eQorQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUPSJ1cy1hc2NpaSIKK0NPTkZJR19QT1BNQUlMRElSPXkKK0NPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlk9eQorQ09ORklHX1JFRk9STUlNRT15CitDT05GSUdfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUPXkKK0NPTkZJR19TRU5ETUFJTD15CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19JT1NUQVQ9eQorQ09ORklHX01QU1RBVD15CitDT05GSUdfTk1FVEVSPXkKKyMgQ09ORklHX1BNQVAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUT1AgaXMgbm90IHNldAorQ09ORklHX1BTVFJFRT15CitDT05GSUdfUFdEWD15CitDT05GSUdfU01FTUNBUD15CisjIENPTkZJR19GUkVFIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFUj15CitDT05GSUdfS0lMTD15CitDT05GSUdfS0lMTEFMTD15CitDT05GSUdfS0lMTEFMTDU9eQorQ09ORklHX1BHUkVQPXkKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorQ09ORklHX1BTPXkKK0NPTkZJR19GRUFUVVJFX1BTX1dJREU9eQorIyBDT05GSUdfRkVBVFVSRV9QU19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUz15CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorQ09ORklHX1RPUD15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0U9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFU9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUz15CitDT05GSUdfRkVBVFVSRV9UT1BNRU09eQorIyBDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFMgaXMgbm90IHNldAorIyBDT05GSUdfVVBUSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCitDT05GSUdfUlVOU1Y9eQorQ09ORklHX1JVTlNWRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKK0NPTkZJR19BU0g9eQorQ09ORklHX0FTSF9CQVNIX0NPTVBBVD15CisjIENPTkZJR19BU0hfSURMRV9USU1FT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19BU0hfSk9CX0NPTlRST0w9eQorQ09ORklHX0FTSF9BTElBUz15CitDT05GSUdfQVNIX0dFVE9QVFM9eQorQ09ORklHX0FTSF9CVUlMVElOX0VDSE89eQorQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URj15CitDT05GSUdfQVNIX0JVSUxUSU5fVEVTVD15CitDT05GSUdfQVNIX0NNRENNRD15CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX0FTSF9FWFBBTkRfUFJNVD15CisjIENPTkZJR19DVFRZSEFDSyBpcyBub3Qgc2V0CitDT05GSUdfSFVTSD15CitDT05GSUdfSFVTSF9CQVNIX0NPTVBBVD15CitDT05GSUdfSFVTSF9CUkFDRV9FWFBBTlNJT049eQorQ09ORklHX0hVU0hfSEVMUD15CitDT05GSUdfSFVTSF9JTlRFUkFDVElWRT15CitDT05GSUdfSFVTSF9TQVZFSElTVE9SWT15CitDT05GSUdfSFVTSF9KT0I9eQorQ09ORklHX0hVU0hfVElDSz15CitDT05GSUdfSFVTSF9JRj15CitDT05GSUdfSFVTSF9MT09QUz15CitDT05GSUdfSFVTSF9DQVNFPXkKK0NPTkZJR19IVVNIX0ZVTkNUSU9OUz15CitDT05GSUdfSFVTSF9MT0NBTD15CitDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVD15CitDT05GSUdfSFVTSF9FWFBPUlRfTj15CitDT05GSUdfSFVTSF9NT0RFX1g9eQorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX0FTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlQ9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVD15CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9DRkc9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTI1NgorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CisjIENPTkZJR19LTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0tMT0dEX0tMT0dDVEwgaXMgbm90IHNldAorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL2ZyZWVic2RfZGVmY29uZmlnIGIvY29uZmlncy9mcmVlYnNkX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI5ODViCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9mcmVlYnNkX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk3MCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTguMQorIyBUdWUgRGVjIDIxIDE5OjQ3OjQwIDIwMTAKKyMKK0NPTkZJR19IQVZFX0RPVF9DT05GSUc9eQorCisjCisjIEJ1c3lib3ggU2V0dGluZ3MKKyMKKworIworIyBHZW5lcmFsIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0RFU0tUT1AgaXMgbm90IHNldAorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKK0NPTkZJR19VU0VfUE9SVEFCTEVfQ09ERT15CisjIENPTkZJR19QTEFURk9STV9MSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0xPQ0FMRV9TVVBQT1JUPXkKK0NPTkZJR19VTklDT0RFX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOViBpcyBub3Qgc2V0CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj03NjcKKyMgQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1dJREVfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1BSRVNFUlZFX0JST0tFTiBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VUTVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CitDT05GSUdfRkVBVFVSRV9TVUlEPXkKK0NPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHPXkKK0NPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUPXkKKyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBub3Qgc2V0CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorQ09ORklHX0ZFQVRVUkVfU1lTTE9HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEMgaXMgbm90IHNldAorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpCisjCitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCitDT05GSUdfUEFTU1dPUkRfTUlOTEVOPTYKK0NPTkZJR19NRDVfU0laRV9WU19TUEVFRD0yCitDT05GSUdfRkVBVFVSRV9GQVNUX1RPUD15CisjIENPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0xMDI0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTMwCisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9OT05fUE9TSVhfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0UgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj00CisjIENPTkZJR19NT05PVE9OSUNfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfSU9DVExfSEVYMlNUUl9FUlJPUj15CitDT05GSUdfRkVBVFVSRV9IV0lCPXkKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKK0NPTkZJR19BUj15CitDT05GSUdfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUz15CitDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEU9eQorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1BJT19QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CitDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTFpPUD15CisjIENPTkZJR19MWk9QX0NPTVBSX0hJR0ggaXMgbm90IHNldAorQ09ORklHX1JQTTJDUElPPXkKK0NPTkZJR19SUE09eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQ9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRT15CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKK0NPTkZJR19VTkNPTVBSRVNTPXkKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19MWk1BPXkKK0NPTkZJR19VTlhaPXkKK0NPTkZJR19YWj15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQVQ9eQorIyBDT05GSUdfREFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfSVNPRk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9OQU5PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVFI9eQorQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUz15CitDT05GSUdfRkVBVFVSRV9UUl9FUVVJVj15CisjIENPTkZJR19CQVNFNjQgaXMgbm90IHNldAorQ09ORklHX0NBTD15CitDT05GSUdfQ0FUVj15CitDT05GSUdfQ0hHUlA9eQorQ09ORklHX0NITU9EPXkKK0NPTkZJR19DSE9XTj15CitDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlM9eQorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorQ09ORklHX0NPTU09eQorQ09ORklHX0NQPXkKK0NPTkZJR19GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ1VUPXkKK0NPTkZJR19ERD15CitDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkc9eQorQ09ORklHX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkU9eQorQ09ORklHX0ZFQVRVUkVfRERfSUJTX09CUz15CisjIENPTkZJR19ERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RGX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19ESVJOQU1FPXkKK0NPTkZJR19ET1MyVU5JWD15CitDT05GSUdfVU5JWDJET1M9eQorQ09ORklHX0RVPXkKK0NPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLPXkKK0NPTkZJR19FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE89eQorQ09ORklHX0VOVj15CitDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQUj15CitDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GT0xEPXkKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lEPXkKK0NPTkZJR19JTlNUQUxMPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TPXkKK0NPTkZJR19MRU5HVEg9eQorQ09ORklHX0xOPXkKK0NPTkZJR19MT0dOQU1FPXkKK0NPTkZJR19MUz15CitDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1M9eQorQ09ORklHX0ZFQVRVUkVfTFNfUkVDVVJTSVZFPXkKK0NPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1VTRVJOQU1FPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQ9eQorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19NS0ZJRk89eQorIyBDT05GSUdfTUtOT0QgaXMgbm90IHNldAorQ09ORklHX01WPXkKK0NPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTklDRT15CitDT05GSUdfTk9IVVA9eQorQ09ORklHX09EPXkKK0NPTkZJR19QUklOVEVOVj15CitDT05GSUdfUFJJTlRGPXkKK0NPTkZJR19QV0Q9eQorQ09ORklHX1JFQURMSU5LPXkKK0NPTkZJR19GRUFUVVJFX1JFQURMSU5LX0ZPTExPVz15CitDT05GSUdfUkVBTFBBVEg9eQorQ09ORklHX1JNPXkKK0NPTkZJR19STURJUj15CisjIENPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorQ09ORklHX1NIQTUxMlNVTT15CitDT05GSUdfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkxPQVRfU0xFRVA9eQorQ09ORklHX1NPUlQ9eQorQ09ORklHX0ZFQVRVUkVfU09SVF9CSUc9eQorQ09ORklHX1NQTElUPXkKK0NPTkZJR19GRUFUVVJFX1NQTElUX0ZBTkNZPXkKKyMgQ09ORklHX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFUX0ZPUk1BVCBpcyBub3Qgc2V0CisjIENPTkZJR19TVFRZIGlzIG5vdCBzZXQKK0NPTkZJR19TVU09eQorQ09ORklHX1NZTkM9eQorIyBDT05GSUdfVEFDIGlzIG5vdCBzZXQKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUw9eQorQ09ORklHX1RFRT15CitDT05GSUdfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPPXkKK0NPTkZJR19UT1VDSD15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19VTklRPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdgorIworQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldAorIworQ09ORklHX0ZFQVRVUkVfQVVUT1dJRFRIPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscworIworQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEU9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtCisjCitDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0s9eQorCisjCisjIENvbnNvbGUgVXRpbGl0aWVzCisjCisjIENPTkZJR19DSFZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZHQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfQ0xFQVI9eQorIyBDT05GSUdfREVBTExPQ1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tCRF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX09QRU5WVCBpcyBub3Qgc2V0CitDT05GSUdfUkVTRVQ9eQorQ09ORklHX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQ9eQorIyBDT05GSUdfU0VUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCisjIENPTkZJR19TRVRLRVlDT0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRMT0dDT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dLRVkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1k9eQorIyBDT05GSUdfU1RBUlRfU1RPUF9EQUVNT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19QQVRDSD15CitDT05GSUdfQVdLPXkKK0NPTkZJR19GRUFUVVJFX0FXS19MSUJNPXkKK0NPTkZJR19DTVA9eQorQ09ORklHX0RJRkY9eQorQ09ORklHX0ZFQVRVUkVfRElGRl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfRElGRl9ESVI9eQorQ09ORklHX0VEPXkKK0NPTkZJR19TRUQ9eQorQ09ORklHX1ZJPXkKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49MTAyNAorQ09ORklHX0ZFQVRVUkVfVklfOEJJVD15CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1I9eQorQ09ORklHX0ZFQVRVUkVfQUxMT1dfRVhFQz15CisKKyMKKyMgRmluZGluZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GSU5EPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJJTlQwPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTVRJTUU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NTUlOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEVSTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1RZUEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9YREVWPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTUFYREVQVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ORVdFUj15CitDT05GSUdfRkVBVFVSRV9GSU5EX0lOVU09eQorQ09ORklHX0ZFQVRVUkVfRklORF9FWEVDPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVVNFUj15CitDT05GSUdfRkVBVFVSRV9GSU5EX0dST1VQPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTk9UPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVQVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVJFTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUlVORT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWD15CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GSU5EX0xJTktTPXkKK0NPTkZJR19HUkVQPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0NPTlRFWFQ9eQorQ09ORklHX1hBUkdTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVD15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTT15CisKKyMKKyMgSW5pdCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JPT1RDSEFSVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19IQUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKKyMgQ09ORklHX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9TQ1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUX0NPUkVEVU1QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVF9URVJNSU5BTF9UWVBFPSIiCisjIENPTkZJR19NRVNHIGlzIG5vdCBzZXQKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfQUREX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTU9WRV9TSEVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFMgaXMgbm90IHNldAorQ09ORklHX1VTRV9CQl9QV0RfR1JQPXkKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVF9TSEEgaXMgbm90IHNldAorIyBDT05GSUdfQUREVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0xMDAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD05OTkKK0NPTkZJR19BRERHUk9VUD15CitDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15CisjIENPTkZJR19ERUxVU0VSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUxHUk9VUD15CitDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQPXkKKyMgQ09ORklHX0dFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTl9TQ1JJUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVUxPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMT0NLIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBFeHQyIEZTIFByb2dzCisjCitDT05GSUdfQ0hBVFRSPXkKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTFNBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkUyRlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9ESU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9IiIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19GREZMVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKKyMgQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUFRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorQ09ORklHX0ZMT0NLPXkKKyMgQ09ORklHX0ZSRUVSQU1ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0tfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU5JWDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19SRUlTRVIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19WRkFUIGlzIG5vdCBzZXQKK0NPTkZJR19HRVRPUFQ9eQorQ09ORklHX0ZFQVRVUkVfR0VUT1BUX0xPTkc9eQorQ09ORklHX0hFWERVTVA9eQorIyBDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UgaXMgbm90IHNldAorQ09ORklHX0hEPXkKKyMgQ09ORklHX0hXQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKK0NPTkZJR19MU1BDST15CitDT05GSUdfTFNVU0I9eQorIyBDT05GSUdfTURFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfQ09ORiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEIGlzIG5vdCBzZXQKK0NPTkZJR19NT1JFPXkKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JERVYgaXMgbm90IHNldAorQ09ORklHX1JFQURQUk9GSUxFPXkKKyMgQ09ORklHX1JUQ1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NSSVBUIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorIyBDT05GSUdfU0VUQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQT05PRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSVRDSF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VNT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VNT1VOVF9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVk9MVU1FSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfWEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCisjIENPTkZJR19DT05TUFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSUFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklERVRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfQURKVElNRVggaXMgbm90IHNldAorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT0wCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0wCisjIENPTkZJR19DSEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVCBpcyBub3Qgc2V0CitDT05GSUdfQ0hSVD15CisjIENPTkZJR19DUk9ORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NST05EX0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorQ09ORklHX0RDPXkKK0NPTkZJR19GRUFUVVJFX0RDX0xJQk09eQorIyBDT05GSUdfREVWRlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9NT0RMT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9GR19OUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVk1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfRkJTUExBU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19MRVNTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9OTk5OTk5OQorQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFA9eQorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRFBBUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUtFREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQU4gaXMgbm90IHNldAorQ09ORklHX01JQ1JPQ09NPXkKKyMgQ09ORklHX01PVU5UUE9JTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVQgaXMgbm90IHNldAorIyBDT05GSUdfUkFJREFVVE9SVU4gaXMgbm90IHNldAorIyBDT05GSUdfUkVBREFIRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5MRVZFTCBpcyBub3Qgc2V0CisjIENPTkZJR19SWCBpcyBub3Qgc2V0CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUUgaXMgbm90IHNldAorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05CRENMSUVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkM9eQorIyBDT05GSUdfTkNfU0VSVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DX0VYVFJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU5JWF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlAgaXMgbm90IHNldAorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ETlNEPXkKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GVFBHRVQ9eQorQ09ORklHX0ZUUFBVVD15CitDT05GSUdfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19IT1NUTkFNRT15CitDT05GSUdfSFRUUEQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUD15CisjIENPTkZJR19JRkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CitDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIPSIiCisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUEFERFIgaXMgbm90IHNldAorIyBDT05GSUdfSVBMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBUVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBSVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19JUENBTEM9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlM9eQorIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1dJREUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRyBpcyBub3Qgc2V0CisjIENPTkZJR19OU0xPT0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19OVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVIgaXMgbm90IHNldAorIyBDT05GSUdfUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkcgaXMgbm90IHNldAorQ09ORklHX1BTQ0FOPXkKKyMgQ09ORklHX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMQVRUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CitDT05GSUdfVEVMTkVUPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRT15CitDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOPXkKK0NPTkZJR19URUxORVREPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQ9eQorQ09ORklHX1RGVFA9eQorQ09ORklHX1RGVFBEPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgdGZ0cC90ZnRwZAorIworQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iIgorIyBDT05GSUdfVURIQ1BDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQX1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VESENQX0RFQlVHPTAKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CitDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUPSIiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTAKK0NPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlM9IiIKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworIyBDT05GSUdfTFBEIGlzIG5vdCBzZXQKK0NPTkZJR19MUFI9eQorQ09ORklHX0xQUT15CisKKyMKKyMgTWFpbCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX01BS0VNSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0iIgorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19JT1NUQVQ9eQorQ09ORklHX01QU1RBVD15CitDT05GSUdfUE1BUD15CitDT05GSUdfUE9XRVJUT1A9eQorQ09ORklHX1NNRU1DQVA9eQorIyBDT05GSUdfRlJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFUiBpcyBub3Qgc2V0CitDT05GSUdfS0lMTD15CitDT05GSUdfS0lMTEFMTD15CitDT05GSUdfS0lMTEFMTDU9eQorIyBDT05GSUdfTk1FVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QR1JFUD15CisjIENPTkZJR19QSURPRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQgaXMgbm90IHNldAorQ09ORklHX1BLSUxMPXkKK0NPTkZJR19QUz15CitDT05GSUdfRkVBVFVSRV9QU19XSURFPXkKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorIyBDT05GSUdfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUE1FTSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorIyBDT05GSUdfVVBUSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iIgorIyBDT05GSUdfU1ZMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUFNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFVJREdJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTlZVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRMSU1JVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKK0NPTkZJR19BU0g9eQorIyBDT05GSUdfQVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9KT0JfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQ01EQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JSQUNFX0VYUEFOU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JTlRFUkFDVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0VYUE9SVF9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTU9ERV9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19BU0g9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JBU0hfSVNfTk9ORT15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcworIworQ09ORklHX1NZU0xPR0Q9eQorQ09ORklHX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEU9eQorQ09ORklHX0ZFQVRVUkVfUkVNT1RFX0xPRz15CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0yNTYKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0xNgorQ09ORklHX0xPR1JFQUQ9eQorQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkc9eQorIyBDT05GSUdfS0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9Db25maWcuaW4gYi9jb25zb2xlLXRvb2xzL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQ4YjAyCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9Db25maWcuaW4KQEAgLTAsMCArMSwxNzcgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJDb25zb2xlIFV0aWxpdGllcyIKKworCisKK2NvbmZpZyBDSFZUCisJYm9vbCAiY2h2dCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byBjaGFuZ2UgdG8gYW5vdGhlciB0ZXJtaW5hbC4KKwkgIEV4YW1wbGU6IGNodnQgNCAoY2hhbmdlIHRvIHRlcm1pbmFsIC9kZXYvdHR5NCkKKworY29uZmlnIEZHQ09OU09MRQorCWJvb2wgImZnY29uc29sZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcHJpbnRzIGFjdGl2ZSAoZm9yZWdyb3VuZCkgY29uc29sZSBudW1iZXIuCisKK2NvbmZpZyBDTEVBUgorCWJvb2wgImNsZWFyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBjbGVhcnMgdGhlIHRlcm1pbmFsIHNjcmVlbi4KKworY29uZmlnIERFQUxMT0NWVAorCWJvb2wgImRlYWxsb2N2dCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gZGVhbGxvY2F0ZXMgdW51c2VkIHZpcnR1YWwgY29uc29sZXMuCisKK2NvbmZpZyBEVU1QS01BUAorCWJvb2wgImR1bXBrbWFwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBkdW1wcyB0aGUga2VybmVsJ3Mga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGUgdG8KKwkgIHN0ZG91dCwgaW4gYmluYXJ5IGZvcm1hdC4gWW91IGNhbiB0aGVuIHVzZSBsb2Fka21hcCB0byBsb2FkIGl0LgorCitjb25maWcgS0JEX01PREUKKwlib29sICJrYmRfbW9kZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcmVwb3J0cyBhbmQgc2V0cyBrZXlib2FyZCBtb2RlLgorCitjb25maWcgTE9BREZPTlQKKwlib29sICJsb2FkZm9udCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gbG9hZHMgYSBjb25zb2xlIGZvbnQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKworY29uZmlnIExPQURLTUFQCisJYm9vbCAibG9hZGttYXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGxvYWRzIGEga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGUgZnJvbQorCSAgc3RhbmRhcmQgaW5wdXQuCisKK2NvbmZpZyBPUEVOVlQKKwlib29sICJvcGVudnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gc3RhcnQgYSBjb21tYW5kIG9uIGFuIHVudXNlZAorCSAgdmlydHVhbCB0ZXJtaW5hbC4KKworY29uZmlnIFJFU0VUCisJYm9vbCAicmVzZXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gcmVzZXQgdGhlIHRlcm1pbmFsIHNjcmVlbiwgaWYgaXQKKwkgIGdldHMgbWVzc2VkIHVwLgorCitjb25maWcgUkVTSVpFCisJYm9vbCAicmVzaXplIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIChyZSlzZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgeW91ciBjdXJyZW50CisJICB0ZXJtaW5hbC4KKworY29uZmlnIEZFQVRVUkVfUkVTSVpFX1BSSU5UCisJYm9vbCAiUHJpbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUkVTSVpFCisJaGVscAorCSAgUHJpbnRzIHRoZSBuZXdseSBzZXQgc2l6ZSAobnVtYmVyIG9mIGNvbHVtbnMgYW5kIHJvd3MpIG9mCisJICB0aGUgdGVybWluYWwuCisJICBFLmcuOgorCSAgQ09MVU1OUz04MDtMSU5FUz00NDtleHBvcnQgQ09MVU1OUyBMSU5FUzsKKworY29uZmlnIFNFVENPTlNPTEUKKwlib29sICJzZXRjb25zb2xlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZWRpcmVjdHMgdGhlIHN5c3RlbSBjb25zb2xlIHRvIGFub3RoZXIgZGV2aWNlLAorCSAgbGlrZSB0aGUgY3VycmVudCB0dHkgd2hpbGUgbG9nZ2VkIGluIHZpYSB0ZWxuZXQuCisKK2NvbmZpZyBGRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNFVENPTlNPTEUgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBzZXRjb25zb2xlIGFwcGxldC4KKworY29uZmlnIFNFVEZPTlQKKwlib29sICJzZXRmb250IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFsbG93cyB0byBsb2FkIGNvbnNvbGUgc2NyZWVuIG1hcC4gVXNlZnVsIGZvciBpMThuLgorCitjb25maWcgRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQCisJYm9vbCAiU3VwcG9ydCByZWFkaW5nIHRleHR1YWwgc2NyZWVuIG1hcHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTRVRGT05UCisJaGVscAorCSAgU3VwcG9ydCByZWFkaW5nIHRleHR1YWwgc2NyZWVuIG1hcHMuCisKK2NvbmZpZyBERUZBVUxUX1NFVEZPTlRfRElSCisJc3RyaW5nICJEZWZhdWx0IGRpcmVjdG9yeSBmb3IgY29uc29sZS10b29scyBmaWxlcyIKKwlkZWZhdWx0ICIiCisJZGVwZW5kcyBvbiBTRVRGT05UCisJaGVscAorCSAgRGlyZWN0b3J5IHRvIHVzZSBpZiBzZXRmb250J3MgcGFyYW1zIGFyZSBzaW1wbGUgZmlsZW5hbWVzCisJICAobm90IC9wYXRoL3RvL2ZpbGUgb3IgLi9maWxlKS4gRGVmYXVsdCBpcyAiIiAobm8gZGVmYXVsdCBkaXJlY3RvcnkpLgorCitjb25maWcgU0VUS0VZQ09ERVMKKwlib29sICJzZXRrZXljb2RlcyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gbG9hZHMgZW50cmllcyBpbnRvIHRoZSBrZXJuZWwncyBzY2FuY29kZS10by1rZXljb2RlCisJICBtYXAsIGFsbG93aW5nIHVudXN1YWwga2V5Ym9hcmRzIHRvIGdlbmVyYXRlIHVzYWJsZSBrZXljb2Rlcy4KKworY29uZmlnIFNFVExPR0NPTlMKKwlib29sICJzZXRsb2djb25zIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZWRpcmVjdHMgdGhlIG91dHB1dCBjb25zb2xlIG9mIGtlcm5lbCBtZXNzYWdlcy4KKworY29uZmlnIFNIT1dLRVkKKwlib29sICJzaG93a2V5IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNob3dzIGtleXMgcHJlc3NlZC4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIGxvYWRmb250IGFuZCBzZXRmb250IgorCWRlcGVuZHMgb24gTE9BREZPTlQgfHwgU0VURk9OVAorCitjb25maWcgRkVBVFVSRV9MT0FERk9OVF9QU0YyCisJYm9vbCAiU3VwcG9ydCBmb3IgUFNGMiBjb25zb2xlIGZvbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9BREZPTlQgfHwgU0VURk9OVAorCWhlbHAKKwkgIFN1cHBvcnQgUFNGMiBjb25zb2xlIGZvbnRzLgorCitjb25maWcgRkVBVFVSRV9MT0FERk9OVF9SQVcKKwlib29sICJTdXBwb3J0IGZvciBvbGQgKHJhdykgY29uc29sZSBmb250cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPQURGT05UIHx8IFNFVEZPTlQKKwloZWxwCisJICBTdXBwb3J0IG9sZCAocmF3KSBjb25zb2xlIGZvbnRzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL0NvbmZpZy5zcmMgYi9jb25zb2xlLXRvb2xzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1NzA0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE3NiBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiQ29uc29sZSBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgQ0hWVAorCWJvb2wgImNodnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gY2hhbmdlIHRvIGFub3RoZXIgdGVybWluYWwuCisJICBFeGFtcGxlOiBjaHZ0IDQgKGNoYW5nZSB0byB0ZXJtaW5hbCAvZGV2L3R0eTQpCisKK2NvbmZpZyBGR0NPTlNPTEUKKwlib29sICJmZ2NvbnNvbGUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHByaW50cyBhY3RpdmUgKGZvcmVncm91bmQpIGNvbnNvbGUgbnVtYmVyLgorCitjb25maWcgQ0xFQVIKKwlib29sICJjbGVhciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIHByb2dyYW0gY2xlYXJzIHRoZSB0ZXJtaW5hbCBzY3JlZW4uCisKK2NvbmZpZyBERUFMTE9DVlQKKwlib29sICJkZWFsbG9jdnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGRlYWxsb2NhdGVzIHVudXNlZCB2aXJ0dWFsIGNvbnNvbGVzLgorCitjb25maWcgRFVNUEtNQVAKKwlib29sICJkdW1wa21hcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gZHVtcHMgdGhlIGtlcm5lbCdzIGtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlIHRvCisJICBzdGRvdXQsIGluIGJpbmFyeSBmb3JtYXQuIFlvdSBjYW4gdGhlbiB1c2UgbG9hZGttYXAgdG8gbG9hZCBpdC4KKworY29uZmlnIEtCRF9NT0RFCisJYm9vbCAia2JkX21vZGUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlcG9ydHMgYW5kIHNldHMga2V5Ym9hcmQgbW9kZS4KKworY29uZmlnIExPQURGT05UCisJYm9vbCAibG9hZGZvbnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGxvYWRzIGEgY29uc29sZSBmb250IGZyb20gc3RhbmRhcmQgaW5wdXQuCisKK2NvbmZpZyBMT0FES01BUAorCWJvb2wgImxvYWRrbWFwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBsb2FkcyBhIGtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20KKwkgIHN0YW5kYXJkIGlucHV0LgorCitjb25maWcgT1BFTlZUCisJYm9vbCAib3BlbnZ0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIHN0YXJ0IGEgY29tbWFuZCBvbiBhbiB1bnVzZWQKKwkgIHZpcnR1YWwgdGVybWluYWwuCisKK2NvbmZpZyBSRVNFVAorCWJvb2wgInJlc2V0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIHJlc2V0IHRoZSB0ZXJtaW5hbCBzY3JlZW4sIGlmIGl0CisJICBnZXRzIG1lc3NlZCB1cC4KKworY29uZmlnIFJFU0laRQorCWJvb2wgInJlc2l6ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byAocmUpc2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHlvdXIgY3VycmVudAorCSAgdGVybWluYWwuCisKK2NvbmZpZyBGRUFUVVJFX1JFU0laRV9QUklOVAorCWJvb2wgIlByaW50IGVudmlyb25tZW50IHZhcmlhYmxlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJFU0laRQorCWhlbHAKKwkgIFByaW50cyB0aGUgbmV3bHkgc2V0IHNpemUgKG51bWJlciBvZiBjb2x1bW5zIGFuZCByb3dzKSBvZgorCSAgdGhlIHRlcm1pbmFsLgorCSAgRS5nLjoKKwkgIENPTFVNTlM9ODA7TElORVM9NDQ7ZXhwb3J0IENPTFVNTlMgTElORVM7CisKK2NvbmZpZyBTRVRDT05TT0xFCisJYm9vbCAic2V0Y29uc29sZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcmVkaXJlY3RzIHRoZSBzeXN0ZW0gY29uc29sZSB0byBhbm90aGVyIGRldmljZSwKKwkgIGxpa2UgdGhlIGN1cnJlbnQgdHR5IHdoaWxlIGxvZ2dlZCBpbiB2aWEgdGVsbmV0LgorCitjb25maWcgRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTRVRDT05TT0xFICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgc2V0Y29uc29sZSBhcHBsZXQuCisKK2NvbmZpZyBTRVRGT05UCisJYm9vbCAic2V0Zm9udCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBBbGxvd3MgdG8gbG9hZCBjb25zb2xlIHNjcmVlbiBtYXAuIFVzZWZ1bCBmb3IgaTE4bi4KKworY29uZmlnIEZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUAorCWJvb2wgIlN1cHBvcnQgcmVhZGluZyB0ZXh0dWFsIHNjcmVlbiBtYXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0VURk9OVAorCWhlbHAKKwkgIFN1cHBvcnQgcmVhZGluZyB0ZXh0dWFsIHNjcmVlbiBtYXBzLgorCitjb25maWcgREVGQVVMVF9TRVRGT05UX0RJUgorCXN0cmluZyAiRGVmYXVsdCBkaXJlY3RvcnkgZm9yIGNvbnNvbGUtdG9vbHMgZmlsZXMiCisJZGVmYXVsdCAiIgorCWRlcGVuZHMgb24gU0VURk9OVAorCWhlbHAKKwkgIERpcmVjdG9yeSB0byB1c2UgaWYgc2V0Zm9udCdzIHBhcmFtcyBhcmUgc2ltcGxlIGZpbGVuYW1lcworCSAgKG5vdCAvcGF0aC90by9maWxlIG9yIC4vZmlsZSkuIERlZmF1bHQgaXMgIiIgKG5vIGRlZmF1bHQgZGlyZWN0b3J5KS4KKworY29uZmlnIFNFVEtFWUNPREVTCisJYm9vbCAic2V0a2V5Y29kZXMiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGxvYWRzIGVudHJpZXMgaW50byB0aGUga2VybmVsJ3Mgc2NhbmNvZGUtdG8ta2V5Y29kZQorCSAgbWFwLCBhbGxvd2luZyB1bnVzdWFsIGtleWJvYXJkcyB0byBnZW5lcmF0ZSB1c2FibGUga2V5Y29kZXMuCisKK2NvbmZpZyBTRVRMT0dDT05TCisJYm9vbCAic2V0bG9nY29ucyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcmVkaXJlY3RzIHRoZSBvdXRwdXQgY29uc29sZSBvZiBrZXJuZWwgbWVzc2FnZXMuCisKK2NvbmZpZyBTSE9XS0VZCisJYm9vbCAic2hvd2tleSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaG93cyBrZXlzIHByZXNzZWQuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBsb2FkZm9udCBhbmQgc2V0Zm9udCIKKwlkZXBlbmRzIG9uIExPQURGT05UIHx8IFNFVEZPTlQKKworY29uZmlnIEZFQVRVUkVfTE9BREZPTlRfUFNGMgorCWJvb2wgIlN1cHBvcnQgZm9yIFBTRjIgY29uc29sZSBmb250cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPQURGT05UIHx8IFNFVEZPTlQKKwloZWxwCisJICBTdXBwb3J0IFBTRjIgY29uc29sZSBmb250cy4KKworY29uZmlnIEZFQVRVUkVfTE9BREZPTlRfUkFXCisJYm9vbCAiU3VwcG9ydCBmb3Igb2xkIChyYXcpIGNvbnNvbGUgZm9udHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMT0FERk9OVCB8fCBTRVRGT05UCisJaGVscAorCSAgU3VwcG9ydCBvbGQgKHJhdykgY29uc29sZSBmb250cy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9LYnVpbGQuc3JjIGIvY29uc29sZS10b29scy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGU5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyNSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQ0hWVCkJCSs9IGNodnQubworbGliLSQoQ09ORklHX0ZHQ09OU09MRSkJCSs9IGZnY29uc29sZS5vCitsaWItJChDT05GSUdfQ0xFQVIpCQkrPSBjbGVhci5vCitsaWItJChDT05GSUdfREVBTExPQ1ZUKQkJKz0gZGVhbGxvY3Z0Lm8KK2xpYi0kKENPTkZJR19EVU1QS01BUCkJCSs9IGR1bXBrbWFwLm8KK2xpYi0kKENPTkZJR19TRVRDT05TT0xFKQkrPSBzZXRjb25zb2xlLm8KK2xpYi0kKENPTkZJR19LQkRfTU9ERSkJCSs9IGtiZF9tb2RlLm8KK2xpYi0kKENPTkZJR19MT0FERk9OVCkJCSs9IGxvYWRmb250Lm8KK2xpYi0kKENPTkZJR19MT0FES01BUCkJCSs9IGxvYWRrbWFwLm8KK2xpYi0kKENPTkZJR19PUEVOVlQpCQkrPSBvcGVudnQubworbGliLSQoQ09ORklHX1JFU0VUKQkJKz0gcmVzZXQubworbGliLSQoQ09ORklHX1JFU0laRSkJCSs9IHJlc2l6ZS5vCitsaWItJChDT05GSUdfU0VURk9OVCkJCSs9IGxvYWRmb250Lm8KK2xpYi0kKENPTkZJR19TRVRLRVlDT0RFUykJKz0gc2V0a2V5Y29kZXMubworbGliLSQoQ09ORklHX1NFVExPR0NPTlMpCSs9IHNldGxvZ2NvbnMubworbGliLSQoQ09ORklHX1NIT1dLRVkpCQkrPSBzaG93a2V5Lm8KZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvY2h2dC5jIGIvY29uc29sZS10b29scy9jaHZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljOTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvY2h2dC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY2h2dCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaHZ0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJOIgorLy91c2FnZTojZGVmaW5lIGNodnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgdGhlIGZvcmVncm91bmQgdmlydHVhbCB0ZXJtaW5hbCB0byAvZGV2L3R0eU4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgY2h2dF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2h2dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG51bSA9IHhhdG91X3JhbmdlKHNpbmdsZV9hcmd2KGFyZ3YpLCAxLCA2Myk7CisJY29uc29sZV9tYWtlX2FjdGl2ZShnZXRfY29uc29sZV9mZF9vcl9kaWUoKSwgbnVtKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9jbGVhci5jIGIvY29uc29sZS10b29scy9jbGVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjJiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL2NsZWFyLmMKQEAgLTAsMCArMSwyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjbGVhciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjbGVhcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGNsZWFyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2xlYXIgc2NyZWVuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IGNsZWFyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjbGVhcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCS8qIGhvbWU7IGNsZWFyIHRvIHRoZSBlbmQgb2Ygc2NyZWVuICovCisJcmV0dXJuIGZ1bGxfd3JpdGUxX3N0cigiXDAzM1tIIiJcMDMzW0oiKSAhPSA2OworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9kZWFsbG9jdnQuYyBiL2NvbnNvbGUtdG9vbHMvZGVhbGxvY3Z0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvZGVhbGxvY3Z0LmMKQEAgLTAsMCArMSwzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogRGlzYWxsb2NhdGUgdmlydHVhbCB0ZXJtaW5hbChzKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworLy91c2FnZTojZGVmaW5lIGRlYWxsb2N2dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW05dIgorLy91c2FnZTojZGVmaW5lIGRlYWxsb2N2dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlYWxsb2NhdGUgdW51c2VkIHZpcnR1YWwgdGVybWluYWwgL2Rldi90dHlOIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRnJvbSA8bGludXgvdnQuaD4gKi8KK2VudW0geyBWVF9ESVNBTExPQ0FURSA9IDB4NTYwOCB9OyAvKiBmcmVlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHZ0ICovCisKK2ludCBkZWFsbG9jdnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRlYWxsb2N2dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJLyogbnVtID0gMCBkZWFsbG9jYXRlIGFsbCB1bnVzZWQgY29uc29sZXMgKi8KKwlpbnQgbnVtID0gMDsKKworCWlmIChhcmd2WzFdKSB7CisJCWlmIChhcmd2WzJdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQludW0gPSB4YXRvdV9yYW5nZShhcmd2WzFdLCAxLCA2Myk7CisJfQorCisJLyogZG91YmxlIGNhc3Qgc3VwcHJlc3NlcyAiY2FzdCB0byBwdHIgZnJvbSBpbnQgb2YgZGlmZmVyZW50IHNpemUiICovCisJeGlvY3RsKGdldF9jb25zb2xlX2ZkX29yX2RpZSgpLCBWVF9ESVNBTExPQ0FURSwgKHZvaWQgKikocHRyZGlmZl90KW51bSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvZHVtcGttYXAuYyBiL2NvbnNvbGUtdG9vbHMvZHVtcGttYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjkyM2QyCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9kdW1wa21hcC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZHVtcGttYXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFybmUgQmVybmluIDxhcm5lQG1hdHJpeC5sb29wYmFjay5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKi8KKy8qIG5vIG9wdGlvbnMsIG5vIGdldG9wdCAqLworCisvL3VzYWdlOiNkZWZpbmUgZHVtcGttYXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIj4ga2V5bWFwIgorLy91c2FnZTojZGVmaW5lIGR1bXBrbWFwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgYSBiaW5hcnkga2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGUgdG8gc3Rkb3V0IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkdW1wa21hcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkdW1wa21hcCA+IGtleW1hcFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRnJvbSA8bGludXgva2QuaD4gKi8KK3N0cnVjdCBrYmVudHJ5IHsKKwl1bnNpZ25lZCBjaGFyIGtiX3RhYmxlOworCXVuc2lnbmVkIGNoYXIga2JfaW5kZXg7CisJdW5zaWduZWQgc2hvcnQga2JfdmFsdWU7Cit9OworI2RlZmluZSBLREdLQkVOVCAweDRCNDYgIC8qIGdldHMgb25lIGVudHJ5IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCisKKy8qIEZyb20gPGxpbnV4L2tleWJvYXJkLmg+ICovCisjZGVmaW5lIE5SX0tFWVMgMTI4CisjZGVmaW5lIE1BWF9OUl9LRVlNQVBTIDI1NgorCitpbnQgZHVtcGttYXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGR1bXBrbWFwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qga2JlbnRyeSBrZTsKKwlpbnQgaSwgaiwgZmQ7CisJUkVTRVJWRV9DT05GSUdfQlVGRkVSKGZsYWdzLCBNQVhfTlJfS0VZTUFQUyk7CisKKwkvKiBXaGVuIHVzZXIgYWNjaWRlbnRhbGx5IHJ1bnMgImR1bXBrbWFwIEZJTEUiCisJICogaW5zdGVhZCBvZiAiZHVtcGttYXAgPkZJTEUiLCB3ZSdkIGR1bXAgYmluYXJ5IHN0dWZmIHRvIHR0eS4KKwkgKiBMZXQncyBwcmV2ZW50IGl0OiAqLworCWlmIChhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisvKgliYl93YXJuX2lnbm9yaW5nX2FyZ3MoYXJndlsxXSk7Ki8KKworCWZkID0gZ2V0X2NvbnNvbGVfZmRfb3JfZGllKCk7CisKKwl3cml0ZShTVERPVVRfRklMRU5PLCAiYmtleW1hcCIsIDcpOworCisJLyogSGVyZSB3ZSB3YW50IHRvIHNldCBldmVyeXRoaW5nIHRvIDAgZXhjZXB0IGZvciBpbmRleGVzOgorCSAqIFswLTJdIFs0LTZdIFs4LTEwXSBbMTJdICovCisJbWVtc2V0KGZsYWdzLCAweDAwLCBNQVhfTlJfS0VZTUFQUyk7CisJbWVtc2V0KGZsYWdzLCAweDAxLCAxMyk7CisJZmxhZ3NbM10gPSBmbGFnc1s3XSA9IGZsYWdzWzExXSA9IDA7CisKKwkvKiBkdW1wIGZsYWdzICovCisJd3JpdGUoU1RET1VUX0ZJTEVOTywgZmxhZ3MsIE1BWF9OUl9LRVlNQVBTKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfS0VZTUFQUzsgaSsrKSB7CisJCWlmIChmbGFnc1tpXSA9PSAxKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgTlJfS0VZUzsgaisrKSB7CisJCQkJa2Uua2JfaW5kZXggPSBqOworCQkJCWtlLmtiX3RhYmxlID0gaTsKKwkJCQlpZiAoIWlvY3RsX29yX3BlcnJvcihmZCwgS0RHS0JFTlQsICZrZSwKKwkJCQkJCSJpb2N0bCBmYWlsZWQgd2l0aCAlcywgJXMsICVwIiwKKwkJCQkJCShjaGFyICopJmtlLmtiX2luZGV4LAorCQkJCQkJKGNoYXIgKikma2Uua2JfdGFibGUsCisJCQkJCQkma2Uua2JfdmFsdWUpCisJCQkJKSB7CisJCQkJCXdyaXRlKFNURE9VVF9GSUxFTk8sICh2b2lkKikma2Uua2JfdmFsdWUsIDIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoZmQpOworCQlSRUxFQVNFX0NPTkZJR19CVUZGRVIoZmxhZ3MpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9mZ2NvbnNvbGUuYyBiL2NvbnNvbGUtdG9vbHMvZmdjb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzNTViZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvZmdjb25zb2xlLmMKQEAgLTAsMCArMSwzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmZ2NvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgR3JpZ29yeSBCYXRhbG92IDxiZ2FAYWx0bGludXgub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZnY29uc29sZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiIgorLy91c2FnZTojZGVmaW5lIGZnY29uc29sZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIkdldCBhY3RpdmUgY29uc29sZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L3Z0Lmg+ICovCitzdHJ1Y3QgdnRfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgdl9hY3RpdmU7ICAgICAgICAvKiBhY3RpdmUgdnQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3NpZ25hbDsgICAgICAgIC8qIHNpZ25hbCB0byBzZW5kICovCisJdW5zaWduZWQgc2hvcnQgdl9zdGF0ZTsgICAgICAgICAvKiB2dCBiaXRtYXNrICovCit9OworZW51bSB7IFZUX0dFVFNUQVRFID0gMHg1NjAzIH07IC8qIGdldCBnbG9iYWwgdnQgc3RhdGUgaW5mbyAqLworCitpbnQgZmdjb25zb2xlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmZ2NvbnNvbGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgdnRfc3RhdCB2dHN0YXQ7CisKKwl2dHN0YXQudl9hY3RpdmUgPSAwOworCXhpb2N0bChnZXRfY29uc29sZV9mZF9vcl9kaWUoKSwgVlRfR0VUU1RBVEUsICZ2dHN0YXQpOworCXByaW50ZigiJWRcbiIsIHZ0c3RhdC52X2FjdGl2ZSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9rYmRfbW9kZS5jIGIvY29uc29sZS10b29scy9rYmRfbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODUzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL2tiZF9tb2RlLmMKQEAgLTAsMCArMSw2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBrYmRfbW9kZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBMb2ljIEdyZW5pZSA8bG9pYy5ncmVuaWVAZ21haWwuY29tPgorICogICB3cml0dGVuIHVzaW5nIEFuZHJpZXMgQnJvdXdlciA8YWViQGN3aS5ubD4ncyBrYmRfbW9kZSBmcm9tCisgKiAgIGNvbnNvbGUtdXRpbHMgdjAuMi4zLCBsaWNlbnNlZCB1bmRlciBHTlUgR1BMdjIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBrYmRfbW9kZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hfGt8c3x1XSBbLUMgVFRZXSIKKy8vdXNhZ2U6I2RlZmluZSBrYmRfbW9kZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlcG9ydCBvciBzZXQgdGhlIGtleWJvYXJkIG1vZGVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJRGVmYXVsdCAoQVNDSUkpIgorLy91c2FnZTogICAgICJcbgktawlNZWRpdW0tcmF3IChrZXlib2FyZCkiCisvL3VzYWdlOiAgICAgIlxuCS1zCVJhdyAoc2NhbmNvZGUpIgorLy91c2FnZTogICAgICJcbgktdQlVbmljb2RlICh1dGYtOCkiCisvL3VzYWdlOiAgICAgIlxuCS1DIFRUWQlBZmZlY3QgVFRZIGluc3RlYWQgb2YgL2Rldi90dHkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisKK2ludCBrYmRfbW9kZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQga2JkX21vZGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlTQ0FOQ09ERSAgPSAoMSA8PCAwKSwKKwkJQVNDSUkgICAgID0gKDEgPDwgMSksCisJCU1FRElVTVJBVyA9ICgxIDw8IDIpLAorCQlVTklDT0RFICAgPSAoMSA8PCAzKSwKKwl9OworCWludCBmZDsKKwl1bnNpZ25lZCBvcHQ7CisJY29uc3QgY2hhciAqdHR5X25hbWUgPSBDVVJSRU5UX1RUWTsKKworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJzYWt1QzoiLCAmdHR5X25hbWUpOworCWZkID0geG9wZW5fbm9uYmxvY2tpbmcodHR5X25hbWUpOworCW9wdCAmPSAweGY7IC8qIGNsZWFyIC1DIGJpdCwgc2VlICgqKSAqLworCisJaWYgKCFvcHQpIHsgLyogcHJpbnQgY3VycmVudCBzZXR0aW5nICovCisJCWNvbnN0IGNoYXIgKm1vZGUgPSAidW5rbm93biI7CisJCWludCBtOworCisJCXhpb2N0bChmZCwgS0RHS0JNT0RFLCAmbSk7CisJCWlmIChtID09IEtfUkFXKQorCQkJbW9kZSA9ICJyYXcgKHNjYW5jb2RlKSI7CisJCWVsc2UgaWYgKG0gPT0gS19YTEFURSkKKwkJCW1vZGUgPSAiZGVmYXVsdCAoQVNDSUkpIjsKKwkJZWxzZSBpZiAobSA9PSBLX01FRElVTVJBVykKKwkJCW1vZGUgPSAibWVkaXVtcmF3IChrZXljb2RlKSI7CisJCWVsc2UgaWYgKG0gPT0gS19VTklDT0RFKQorCQkJbW9kZSA9ICJVbmljb2RlIChVVEYtOCkiOworCQlwcmludGYoIlRoZSBrZXlib2FyZCBpcyBpbiAlcyBtb2RlXG4iLCBtb2RlKTsKKwl9IGVsc2UgeworCQkvKiBoZXJlIHdlIGRlcGVuZCBvbiBzcGVjaWZpYyBiaXRzIGFzc2lnbmVkIHRvIG9wdGlvbnMgKCopICovCisJCW9wdCA9IG9wdCAmIFVOSUNPREUgPyAzIDogb3B0ID4+IDE7CisJCS8qIGRvdWJsZSBjYXN0IHByZXZlbnRzIHdhcm5pbmdzIGFib3V0IHdpZGVuaW5nIGNvbnZlcnNpb24gKi8KKwkJeGlvY3RsKGZkLCBLRFNLQk1PREUsICh2b2lkKikocHRyZGlmZl90KW9wdCk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvbG9hZGZvbnQuYyBiL2NvbnNvbGUtdG9vbHMvbG9hZGZvbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTg4N2YyCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9sb2FkZm9udC5jCkBAIC0wLDAgKzEsNDkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsb2FkZm9udC5jIC0gRXVnZW5lIENyb3NzZXIgJiBBbmRyaWVzIEJyb3V3ZXIKKyAqCisgKiBWZXJzaW9uIDAuOTZiYgorICoKKyAqIExvYWRzIHRoZSBjb25zb2xlIGZvbnQsIGFuZCBwb3NzaWJseSB0aGUgY29ycmVzcG9uZGluZyBzY3JlZW4gbWFwKHMpLgorICogKEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgTWF0ZWogVmVsYS4pCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9hZGZvbnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIjwgZm9udCIKKy8vdXNhZ2U6I2RlZmluZSBsb2FkZm9udF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxvYWQgYSBjb25zb2xlIGZvbnQgZnJvbSBzdGRpbiIKKy8qIC8vdXNhZ2U6ICAgICAiXG4JLUMgVFRZCUFmZmVjdCBUVFkgaW5zdGVhZCBvZiAvZGV2L3R0eSIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbG9hZGZvbnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbG9hZGZvbnQgPCAvZXRjL2kxOG4vZm9udG5hbWVcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2V0Zm9udF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRk9OVCBbLW0gTUFQRklMRV0gWy1DIFRUWV0iCisvL3VzYWdlOiNkZWZpbmUgc2V0Zm9udF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxvYWQgYSBjb25zb2xlIGZvbnRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTUFQRklMRQlMb2FkIGNvbnNvbGUgc2NyZWVuIG1hcCIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgVFRZCQlBZmZlY3QgVFRZIGluc3RlYWQgb2YgL2Rldi90dHkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNldGZvbnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgc2V0Zm9udCAtbSBrb2k4LXIgL2V0Yy9pMThuL2ZvbnRuYW1lXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy9rZC5oPgorCisjaWZuZGVmIEtERk9OVE9QCisjIGRlZmluZSBLREZPTlRPUCAweDRCNzIKK3N0cnVjdCBjb25zb2xlX2ZvbnRfb3AgeworCXVuc2lnbmVkIG9wOyAgICAgICAgICAgIC8qIEtEX0ZPTlRfT1BfKiAqLworCXVuc2lnbmVkIGZsYWdzOyAgICAgICAgIC8qIEtEX0ZPTlRfRkxBR18qICovCisJdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKwl1bnNpZ25lZCBjaGFyY291bnQ7CisJdW5zaWduZWQgY2hhciAqZGF0YTsgICAgLyogZm9udCBkYXRhIHdpdGggaGVpZ2h0IGZpeGVkIHRvIDMyICovCit9OworIyBkZWZpbmUgS0RfRk9OVF9PUF9TRVQgICAgICAgICAgMCAgLyogU2V0IGZvbnQgKi8KKyMgZGVmaW5lIEtEX0ZPTlRfT1BfR0VUICAgICAgICAgIDEgIC8qIEdldCBmb250ICovCisjIGRlZmluZSBLRF9GT05UX09QX1NFVF9ERUZBVUxUICAyICAvKiBTZXQgZm9udCB0byBkZWZhdWx0LCBkYXRhIHBvaW50cyB0byBuYW1lIC8gTlVMTCAqLworIyBkZWZpbmUgS0RfRk9OVF9PUF9DT1BZICAgICAgICAgMyAgLyogQ29weSBmcm9tIGFub3RoZXIgY29uc29sZSAqLworIyBkZWZpbmUgS0RfRk9OVF9GTEFHX09MRCAgICAgICAgMHg4MDAwMDAwMCAvKiBJbnZva2VkIHZpYSBvbGQgaW50ZXJmYWNlICovCisjIGRlZmluZSBLRF9GT05UX0ZMQUdfRE9OVF9SRUNBTEMgMSAvKiBEb24ndCBjYWxsIGFkanVzdF9oZWlnaHQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoVXNlZCBpbnRlcm5hbGx5IGZvciBQSU9fRk9OVCBzdXBwb3J0KSAqLworI2VuZGlmIC8qIEtERk9OVE9QICovCisKKworZW51bSB7CisJUFNGMV9NQUdJQzAgPSAweDM2LAorCVBTRjFfTUFHSUMxID0gMHgwNCwKKwlQU0YxX01PREU1MTIgPSAweDAxLAorCVBTRjFfTU9ERUhBU1RBQiA9IDB4MDIsCisJUFNGMV9NT0RFSEFTU0VRID0gMHgwNCwKKwlQU0YxX01BWE1PREUgPSAweDA1LAorCVBTRjFfU1RBUlRTRVEgPSAweGZmZmUsCisJUFNGMV9TRVBBUkFUT1IgPSAweGZmZmYsCit9OworCitzdHJ1Y3QgcHNmMV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgbWFnaWNbMl07ICAgICAgICAgLyogTWFnaWMgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBtb2RlOyAgICAgICAgICAgICAvKiBQU0YgZm9udCBtb2RlICovCisJdW5zaWduZWQgY2hhciBjaGFyc2l6ZTsgICAgICAgICAvKiBDaGFyYWN0ZXIgc2l6ZSAqLworfTsKKworI2RlZmluZSBwc2YxaCh4KSAoKHN0cnVjdCBwc2YxX2hlYWRlciopKHgpKQorCisjZGVmaW5lIFBTRjFfTUFHSUNfT0soeCkgKCBcCisgICAgICh4KS0+bWFnaWNbMF0gPT0gUFNGMV9NQUdJQzAgXAorICAmJiAoeCktPm1hZ2ljWzFdID09IFBTRjFfTUFHSUMxIFwKKykKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIKK2VudW0geworCVBTRjJfTUFHSUMwID0gMHg3MiwKKwlQU0YyX01BR0lDMSA9IDB4YjUsCisJUFNGMl9NQUdJQzIgPSAweDRhLAorCVBTRjJfTUFHSUMzID0gMHg4NiwKKwlQU0YyX0hBU19VTklDT0RFX1RBQkxFID0gMHgwMSwKKwlQU0YyX01BWFZFUlNJT04gPSAwLAorCVBTRjJfU1RBUlRTRVEgPSAweGZlLAorCVBTRjJfU0VQQVJBVE9SID0gMHhmZgorfTsKKworc3RydWN0IHBzZjJfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIG1hZ2ljWzRdOworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCXVuc2lnbmVkIGludCBoZWFkZXJzaXplOyAgICAvKiBvZmZzZXQgb2YgYml0bWFwcyBpbiBmaWxlICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBsZW5ndGg7ICAgICAgICAvKiBudW1iZXIgb2YgZ2x5cGhzICovCisJdW5zaWduZWQgaW50IGNoYXJzaXplOyAgICAgIC8qIG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBjaGFyYWN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OyAgICAgICAgLyogbWF4IGRpbWVuc2lvbnMgb2YgZ2x5cGhzICovCisJdW5zaWduZWQgaW50IHdpZHRoOyAgICAgICAgIC8qIGNoYXJzaXplID0gaGVpZ2h0ICogKCh3aWR0aCArIDcpIC8gOCkgKi8KK307CisKKyNkZWZpbmUgcHNmMmgoeCkgKChzdHJ1Y3QgcHNmMl9oZWFkZXIqKSh4KSkKKworI2RlZmluZSBQU0YyX01BR0lDX09LKHgpICggXAorICAgICAoeCktPm1hZ2ljWzBdID09IFBTRjJfTUFHSUMwIFwKKyAgJiYgKHgpLT5tYWdpY1sxXSA9PSBQU0YyX01BR0lDMSBcCisgICYmICh4KS0+bWFnaWNbMl0gPT0gUFNGMl9NQUdJQzIgXAorICAmJiAoeCktPm1hZ2ljWzNdID09IFBTRjJfTUFHSUMzIFwKKykKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9MT0FERk9OVF9QU0YyICovCisKKworc3RhdGljIHZvaWQgZG9fbG9hZGZvbnQoaW50IGZkLCB1bnNpZ25lZCBjaGFyICppbmJ1ZiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgY2hhcnNpemUsIGludCBmb250c2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IGNoYXJ3aWR0aCA9IDMyICogKCh3aWR0aCs3KS84KTsKKwlpbnQgaTsKKworCWlmIChoZWlnaHQgPCAxIHx8IGhlaWdodCA+IDMyIHx8IHdpZHRoIDwgMSB8fCB3aWR0aCA+IDMyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGNoYXJhY3RlciBzaXplICVkeCVkIiwgaGVpZ2h0LCB3aWR0aCk7CisKKwlidWYgPSB4emFsbG9jKGNoYXJ3aWR0aCAqICgoZm9udHNpemUgPCAxMjgpID8gMTI4IDogZm9udHNpemUpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZm9udHNpemU7IGkrKykKKwkJbWVtY3B5KGJ1ZiArIChpKmNoYXJ3aWR0aCksIGluYnVmICsgKGkqY2hhcnNpemUpLCBjaGFyc2l6ZSk7CisKKwl7IC8qIEtERk9OVE9QICovCisJCXN0cnVjdCBjb25zb2xlX2ZvbnRfb3AgY2ZvOworCQljZm8ub3AgPSBLRF9GT05UX09QX1NFVDsKKwkJY2ZvLmZsYWdzID0gMDsKKwkJY2ZvLndpZHRoID0gd2lkdGg7CisJCWNmby5oZWlnaHQgPSBoZWlnaHQ7CisJCWNmby5jaGFyY291bnQgPSBmb250c2l6ZTsKKwkJY2ZvLmRhdGEgPSBidWY7CisJCXhpb2N0bChmZCwgS0RGT05UT1AsICZjZm8pOworCX0KKworCWZyZWUoYnVmKTsKK30KKworLyoKKyAqIEZvcm1hdCBvZiB0aGUgVW5pY29kZSBpbmZvcm1hdGlvbjoKKyAqCisgKiBGb3IgZWFjaCBmb250IHBvc2l0aW9uIDx1Yz4qPHNlcT4qPHRlcm0+CisgKiB3aGVyZSA8dWM+IGlzIGEgMi1ieXRlIGxpdHRsZSBlbmRpYW4gVW5pY29kZSB2YWx1ZSAoUFNGMSkKKyAqIG9yIGFuIFVURi04IGNvZGVkIHZhbHVlIChQU0YyKSwKKyAqIDxzZXE+ID0gPHNzPjx1Yz48dWM+KiwgPHNzPiA9IHBzZjEgPyAweEZGRkUgOiAweEZFLAorICogPHRlcm0+ID0gcHNmMSA/IDB4RkZGRiA6IDB4RkYuCisgKiBhbmQgKiBkZW5vdGVzIHplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiB0aGUgcHJlY2VkaW5nIGl0ZW0uCisgKgorICogU2VtYW50aWNzOgorICogVGhlIGxlYWRpbmcgPHVjPiogcGFydCBnaXZlcyBVbmljb2RlIHN5bWJvbHMgdGhhdCBhcmUgYWxsCisgKiByZXByZXNlbnRlZCBieSB0aGlzIGZvbnQgcG9zaXRpb24uIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzCisgKiBhcmUgc2VxdWVuY2VzIG9mIFVuaWNvZGUgc3ltYm9scyAtIHByb2JhYmx5IGEgc3ltYm9sCisgKiB0b2dldGhlciB3aXRoIGNvbWJpbmluZyBhY2NlbnRzIC0gYWxzbyByZXByZXNlbnRlZCBieQorICogdGhpcyBmb250IHBvc2l0aW9uLgorICoKKyAqIEV4YW1wbGU6CisgKiBBdCB0aGUgZm9udCBwb3NpdGlvbiBmb3IgYSBjYXBpdGFsIEEtcmluZyBnbHlwaCwgd2UKKyAqIG1heSBoYXZlOgorICogICAwMEM1LDIxMkIsRkZGRSwwMDQxLDAzMEEsRkZGRgorICogU29tZSBmb250IHBvc2l0aW9ucyBtYXkgYmUgZGVzY3JpYmVkIGJ5IHNlcXVlbmNlcyBvbmx5LAorICogbmFtZWx5IHdoZW4gdGhlcmUgaXMgbm8gcHJlY29tcG9zZWQgVW5pY29kZSB2YWx1ZSBmb3IgdGhlIGdseXBoLgorICovCisjaWYgIUVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIKKyNkZWZpbmUgZG9fbG9hZHRhYmxlKGZkLCBpbmJ1ZiwgdGFpbHN6LCBmb250c2l6ZSwgcHNmMikgXAorCWRvX2xvYWR0YWJsZShmZCwgaW5idWYsIHRhaWxzeiwgZm9udHNpemUpCisjZW5kaWYKK3N0YXRpYyB2b2lkIGRvX2xvYWR0YWJsZShpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmluYnVmLCBpbnQgdGFpbHN6LCBpbnQgZm9udHNpemUsIGludCBwc2YyKQoreworI2lmICFFTkFCTEVfRkVBVFVSRV9MT0FERk9OVF9QU0YyCisvKiBnY2MgNC4zLjEgY29kZSBzaXplOiAqLworIyBkZWZpbmUgcHNmMiAwIC8qICswIGJ5dGVzICovCisvLwljb25zdCBpbnQgcHNmMiA9IDA7IC8qICs4IGJ5dGVzICovCisvLwllbnVtIHsgcHNmMiA9IDAgfTsgLyogKzEzIGJ5dGVzICovCisjZW5kaWYKKwlzdHJ1Y3QgdW5pbWFwaW5pdCBhZHZpY2U7CisJc3RydWN0IHVuaW1hcGRlc2MgdWQ7CisJc3RydWN0IHVuaXBhaXIgKnVwOworCWludCBjdCA9IDAsIG1heGN0OworCWludCBnbHlwaDsKKwl1aW50MTZfdCB1bmljb2RlOworCisJbWF4Y3QgPSB0YWlsc3o7IC8qIG1vcmUgdGhhbiBlbm91Z2ggKi8KKwl1cCA9IHhtYWxsb2MobWF4Y3QgKiBzaXplb2YoKnVwKSk7CisKKwlmb3IgKGdseXBoID0gMDsgZ2x5cGggPCBmb250c2l6ZTsgZ2x5cGgrKykgeworCQl3aGlsZSAodGFpbHN6ID4gMCkgeworCQkJaWYgKCFwc2YyKSB7IC8qIFBTRjEgKi8KKwkJCQl1bmljb2RlID0gKCgodWludDE2X3QpIGluYnVmWzFdKSA8PCA4KSArIGluYnVmWzBdOworCQkJCXRhaWxzeiAtPSAyOworCQkJCWluYnVmICs9IDI7CisJCQkJaWYgKHVuaWNvZGUgPT0gUFNGMV9TRVBBUkFUT1IpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsgLyogUFNGMiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIKKwkJCQktLXRhaWxzejsKKwkJCQl1bmljb2RlID0gKmluYnVmKys7CisJCQkJaWYgKHVuaWNvZGUgPT0gUFNGMl9TRVBBUkFUT1IpIHsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmICh1bmljb2RlID09IFBTRjJfU1RBUlRTRVEpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuaWNvZGUgc2VxdWVuY2VzIG5vdCBpbXBsZW1lbnRlZCIpOworCQkJCX0gZWxzZSBpZiAodW5pY29kZSA+PSAweEMwKSB7CisJCQkJCWlmICh1bmljb2RlID49IDB4RkMpCisJCQkJCQl1bmljb2RlICY9IDB4MDEsIG1heGN0ID0gNTsKKwkJCQkJZWxzZSBpZiAodW5pY29kZSA+PSAweEY4KQorCQkJCQkJdW5pY29kZSAmPSAweDAzLCBtYXhjdCA9IDQ7CisJCQkJCWVsc2UgaWYgKHVuaWNvZGUgPj0gMHhGMCkKKwkJCQkJCXVuaWNvZGUgJj0gMHgwNywgbWF4Y3QgPSAzOworCQkJCQllbHNlIGlmICh1bmljb2RlID49IDB4RTApCisJCQkJCQl1bmljb2RlICY9IDB4MEYsIG1heGN0ID0gMjsKKwkJCQkJZWxzZQorCQkJCQkJdW5pY29kZSAmPSAweDFGLCBtYXhjdCA9IDE7CisJCQkJCWRvIHsKKwkJCQkJCWlmICh0YWlsc3ogPD0gMCB8fCAqaW5idWYgPCAweDgwIHx8ICppbmJ1ZiA+IDB4QkYpCisJCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlsbGVnYWwgVVRGLTggY2hhcmFjdGVyIik7CisJCQkJCQktLXRhaWxzejsKKwkJCQkJCXVuaWNvZGUgPSAodW5pY29kZSA8PCA2KSArICgqaW5idWYrKyAmIDB4M0YpOworCQkJCQl9IHdoaWxlICgtLW1heGN0ID4gMCk7CisJCQkJfSBlbHNlIGlmICh1bmljb2RlID49IDB4ODApIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlsbGVnYWwgVVRGLTggY2hhcmFjdGVyIik7CisJCQkJfQorI2Vsc2UKKwkJCQlyZXR1cm47CisjZW5kaWYKKwkJCX0KKwkJCXVwW2N0XS51bmljb2RlID0gdW5pY29kZTsKKwkJCXVwW2N0XS5mb250cG9zID0gZ2x5cGg7CisJCQljdCsrOworCQl9CisJfQorCisJLyogTm90ZTogYWZ0ZXIgUElPX1VOSU1BUENMUiBhbmQgYmVmb3JlIFBJT19VTklNQVAKKwkgICB0aGlzIHByaW50ZiBkaWQgbm90IHdvcmsgb24gbWFueSBrZXJuZWxzICovCisKKwlhZHZpY2UuYWR2aXNlZF9oYXNoc2l6ZSA9IDA7CisJYWR2aWNlLmFkdmlzZWRfaGFzaHN0ZXAgPSAwOworCWFkdmljZS5hZHZpc2VkX2hhc2hsZXZlbCA9IDA7CisJeGlvY3RsKGZkLCBQSU9fVU5JTUFQQ0xSLCAmYWR2aWNlKTsKKwl1ZC5lbnRyeV9jdCA9IGN0OworCXVkLmVudHJpZXMgPSB1cDsKKwl4aW9jdGwoZmQsIFBJT19VTklNQVAsICZ1ZCk7CisjdW5kZWYgcHNmMgorfQorCitzdGF0aWMgdm9pZCBkb19sb2FkKGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworCWludCBoZWlnaHQ7CisJaW50IHdpZHRoID0gODsKKwlpbnQgY2hhcnNpemU7CisJaW50IGZvbnRzaXplID0gMjU2OworCWludCBoYXNfdGFibGUgPSAwOworCXVuc2lnbmVkIGNoYXIgKmZvbnQgPSBidWZmZXI7CisJdW5zaWduZWQgY2hhciAqdGFibGU7CisKKwlpZiAobGVuID49IHNpemVvZihzdHJ1Y3QgcHNmMV9oZWFkZXIpICYmIFBTRjFfTUFHSUNfT0socHNmMWgoYnVmZmVyKSkpIHsKKwkJaWYgKHBzZjFoKGJ1ZmZlciktPm1vZGUgPiBQU0YxX01BWE1PREUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5zdXBwb3J0ZWQgcHNmIGZpbGUgbW9kZSIpOworCQlpZiAocHNmMWgoYnVmZmVyKS0+bW9kZSAmIFBTRjFfTU9ERTUxMikKKwkJCWZvbnRzaXplID0gNTEyOworCQlpZiAocHNmMWgoYnVmZmVyKS0+bW9kZSAmIFBTRjFfTU9ERUhBU1RBQikKKwkJCWhhc190YWJsZSA9IDE7CisJCWhlaWdodCA9IGNoYXJzaXplID0gcHNmMWgoYnVmZmVyKS0+Y2hhcnNpemU7CisJCWZvbnQgKz0gc2l6ZW9mKHN0cnVjdCBwc2YxX2hlYWRlcik7CisJfSBlbHNlCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorCWlmIChsZW4gPj0gc2l6ZW9mKHN0cnVjdCBwc2YyX2hlYWRlcikgJiYgUFNGMl9NQUdJQ19PSyhwc2YyaChidWZmZXIpKSkgeworCQlpZiAocHNmMmgoYnVmZmVyKS0+dmVyc2lvbiA+IFBTRjJfTUFYVkVSU0lPTikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnN1cHBvcnRlZCBwc2YgZmlsZSB2ZXJzaW9uIik7CisJCWZvbnRzaXplID0gcHNmMmgoYnVmZmVyKS0+bGVuZ3RoOworCQlpZiAocHNmMmgoYnVmZmVyKS0+ZmxhZ3MgJiBQU0YyX0hBU19VTklDT0RFX1RBQkxFKQorCQkJaGFzX3RhYmxlID0gMjsKKwkJY2hhcnNpemUgPSBwc2YyaChidWZmZXIpLT5jaGFyc2l6ZTsKKwkJaGVpZ2h0ID0gcHNmMmgoYnVmZmVyKS0+aGVpZ2h0OworCQl3aWR0aCA9IHBzZjJoKGJ1ZmZlciktPndpZHRoOworCQlmb250ICs9IHBzZjJoKGJ1ZmZlciktPmhlYWRlcnNpemU7CisJfSBlbHNlCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0FERk9OVF9SQVcKKwlpZiAobGVuID09IDk3ODApIHsgIC8qIGZpbGUgd2l0aCB0aHJlZSBjb2RlIHBhZ2VzPyAqLworCQljaGFyc2l6ZSA9IGhlaWdodCA9IDE2OworCQlmb250ICs9IDQwOworCX0gZWxzZSBpZiAoKGxlbiAmIDAzNzcpID09IDApIHsgIC8qIGJhcmUgZm9udCAqLworCQljaGFyc2l6ZSA9IGhlaWdodCA9IGxlbiAvIDI1NjsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlucHV0IGZpbGU6IGJhZCBsZW5ndGggb3IgdW5zdXBwb3J0ZWQgZm9udCB0eXBlIik7CisJfQorCisjaWYgIWRlZmluZWQoUElPX0ZPTlRYKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKKwlpZiAoZm9udHNpemUgIT0gMjU2KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib25seSBmb250c2l6ZSAyNTYgc3VwcG9ydGVkIik7CisjZW5kaWYKKworCXRhYmxlID0gZm9udCArIGZvbnRzaXplICogY2hhcnNpemU7CisJYnVmZmVyICs9IGxlbjsKKworCWlmICh0YWJsZSA+IGJ1ZmZlciB8fCAoIWhhc190YWJsZSAmJiB0YWJsZSAhPSBidWZmZXIpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW5wdXQgZmlsZTogYmFkIGxlbmd0aCIpOworCisJZG9fbG9hZGZvbnQoZmQsIGZvbnQsIGhlaWdodCwgd2lkdGgsIGNoYXJzaXplLCBmb250c2l6ZSk7CisKKwlpZiAoaGFzX3RhYmxlKQorCQlkb19sb2FkdGFibGUoZmQsIHRhYmxlLCBidWZmZXIgLSB0YWJsZSwgZm9udHNpemUsIGhhc190YWJsZSAtIDEpOworfQorCisKKyNpZiBFTkFCTEVfTE9BREZPTlQKK2ludCBsb2FkZm9udF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9hZGZvbnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXNpemVfdCBsZW47CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisJLy8gbm8gYXJndW1lbnRzIGFsbG93ZWQhCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTAiOworCWdldG9wdDMyKGFyZ3YsICIiKTsKKworCS8qCisJICogV2UgdXNlZCB0byBsb29rIGF0IHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGZpbGUKKwkgKiB3aXRoIHN0YXQoKTsgbm93IHRoYXQgd2UgYWNjZXB0IGNvbXByZXNzZWQgZmlsZXMsCisJICoganVzdCByZWFkIHRoZSBlbnRpcmUgZmlsZS4KKwkgKi8KKwlsZW4gPSAzMioxMDI0OyAvLyBjYW4ndCBiZSBsYXJnZXIKKwlidWZmZXIgPSB4bWFsbG9jX3JlYWQoU1RESU5fRklMRU5PLCAmbGVuKTsKKwkvLyB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoZmlsZW5hbWUsICZsZW4pOworCWlmICghYnVmZmVyKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIHJlYWRpbmcgaW5wdXQgZm9udCIpOworCWRvX2xvYWQoZ2V0X2NvbnNvbGVfZmRfb3JfZGllKCksIGJ1ZmZlciwgbGVuKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9TRVRGT05UCisKKy8qCitrYmQtMS4xMjoKKworc2V0Zm9udCBbLU8gZm9udCt1bWFwLm9yaWddIFstbyBmb250Lm9yaWddIFstb20gY21hcC5vcmlnXQorWy1vdSB1bWFwLm9yaWddIFstTl0gW2ZvbnQubmV3IC4uLl0gWy1tIGNtYXBdIFstdSB1bWFwXSBbLUMgY29uc29sZV0KK1staE5OXSBbLXZdIFstVl0KKworLWggTk4gIE92ZXJyaWRlIGZvbnQgaGVpZ2h0CistbyBmaWxlCisgICAgICAgU2F2ZSBwcmV2aW91cyBmb250IGluIGZpbGUKKy1PIGZpbGUKKyAgICAgICBTYXZlIHByZXZpb3VzIGZvbnQgYW5kIFVuaWNvZGUgbWFwIGluIGZpbGUKKy1vbSBmaWxlCisgICAgICAgU3RvcmUgY29uc29sZSBtYXAgaW4gZmlsZQorLW91IGZpbGUKKyAgICAgICBTYXZlIHByZXZpb3VzIFVuaWNvZGUgbWFwIGluIGZpbGUKKy1tIGZpbGUKKyAgICAgICBMb2FkIGNvbnNvbGUgbWFwIG9yIFVuaWNvZGUgY29uc29sZSBtYXAgZnJvbSBmaWxlCistdSBmaWxlCisgICAgICAgTG9hZCBVbmljb2RlIHRhYmxlIGRlc2NyaWJpbmcgdGhlIGZvbnQgZnJvbSBmaWxlCisgICAgICAgRXhhbXBsZToKKyAgICAgICAjIGNwODY2CisgICAgICAgMHgwMC0weDdmICAgICAgIGlkZW0KKyAgICAgICAjCisgICAgICAgMHg4MCAgICBVKzA0MTAgICMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgICAgIDB4ODEgICAgVSswNDExICAjIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgICAgMHg4MiAgICBVKzA0MTIgICMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKy1DIGNvbnNvbGUKKyAgICAgICBTZXQgdGhlIGZvbnQgZm9yIHRoZSBpbmRpY2F0ZWQgY29uc29sZQorLXYgICAgIFZlcmJvc2UKKy1WICAgICBWZXJzaW9uCisqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUAorc3RhdGljIGludCBjdG9pKGNoYXIgKnMpCit7CisJaWYgKHNbMF0gPT0gJ1wnJyAmJiBzWzFdICE9ICdcMCcgJiYgc1syXSA9PSAnXCcnICYmIHNbM10gPT0gJ1wwJykKKwkJcmV0dXJuIHNbMV07CisJLy8gVSsgbWVhbnMgMHgKKwlpZiAoc1swXSA9PSAnVScgJiYgc1sxXSA9PSAnKycpIHsKKwkJc1swXSA9ICcwJzsKKwkJc1sxXSA9ICd4JzsKKwl9CisJaWYgKCFpc2RpZ2l0KHNbMF0pKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHhzdHJ0b3VsKHMsIDApOworfQorI2VuZGlmCisKK2ludCBzZXRmb250X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRmb250X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIG9wdHM7CisJaW50IGZkOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwljaGFyICptYXBmaWxlbmFtZTsKKwljb25zdCBjaGFyICp0dHlfbmFtZSA9IENVUlJFTlRfVFRZOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAibTpDOiIsICZtYXBmaWxlbmFtZSwgJnR0eV9uYW1lKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWZkID0geG9wZW5fbm9uYmxvY2tpbmcodHR5X25hbWUpOworCisJaWYgKHNpemVvZihDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUikgPiAxKSB7IC8vIGlmIG5vdCAiIgorCQlpZiAoKmFyZ3ZbMF0gIT0gJy8nKSB7CisJCQkvLyBnb3RvIGRlZmF1bHQgZm9udHMgbG9jYXRpb24uIGRvbid0IGRpZSBpZiBkb2Vzbid0IGV4aXN0CisJCQljaGRpcihDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUiAiL2NvbnNvbGVmb250cyIpOworCQl9CisJfQorCS8vIGxvYWQgZm9udAorCWxlbiA9IDMyKjEwMjQ7IC8vIGNhbid0IGJlIGxhcmdlcgorCWJ1ZmZlciA9IHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZSgqYXJndiwgJmxlbik7CisJaWYgKCFidWZmZXIpCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoKmFyZ3YpOworCWRvX2xvYWQoZmQsIGJ1ZmZlciwgbGVuKTsKKworCS8vIGxvYWQgdGhlIHNjcmVlbiBtYXAsIGlmIGFueQorCWlmIChvcHRzICYgMSkgeyAvLyAtbQorCQl1bnNpZ25lZCBtb2RlID0gUElPX1NDUk5NQVA7CisJCXZvaWQgKm1hcDsKKworCQlpZiAoc2l6ZW9mKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSKSA+IDEpIHsgLy8gaWYgbm90ICIiCisJCQlpZiAobWFwZmlsZW5hbWVbMF0gIT0gJy8nKSB7CisJCQkJLy8gZ290byBkZWZhdWx0IGtleW1hcHMgbG9jYXRpb24KKwkJCQljaGRpcihDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUiAiL2NvbnNvbGV0cmFucyIpOworCQkJfQorCQl9CisJCS8vIGZldGNoIGtleW1hcAorCQltYXAgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UobWFwZmlsZW5hbWUsICZsZW4pOworCQlpZiAoIW1hcCkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUobWFwZmlsZW5hbWUpOworCQkvLyBmaWxlIHNpemUgaXMgMjU2IG9yIDUxMiBieXRlcz8gLT4gYXNzdW1lIGJpbmFyeSBtYXAKKwkJaWYgKGxlbiA9PSBFX1RBQlNaIHx8IGxlbiA9PSAyKkVfVEFCU1opIHsKKwkJCWlmIChsZW4gPT0gMipFX1RBQlNaKQorCQkJCW1vZGUgPSBQSU9fVU5JU0NSTk1BUDsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVAKKwkJLy8gYXNzdW1lIHRleHR1YWwgVW5pY29kZSBjb25zb2xlIG1hcHM6CisJCS8vIDB4MDAgVSswMDAwICAjICBOVUxMIChOVUwpCisJCS8vIDB4MDEgVSswMDAxICAjICBTVEFSVCBPRiBIRUFESU5HIChTT0gpCisJCS8vIDB4MDIgVSswMDAyICAjICBTVEFSVCBPRiBURVhUIChTVFgpCisJCS8vIDB4MDMgVSswMDAzICAjICBFTkQgT0YgVEVYVCAoRVRYKQorCQllbHNlIHsKKwkJCWludCBpOworCQkJY2hhciAqdG9rZW5bMl07CisJCQlwYXJzZXJfdCAqcGFyc2VyOworCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShtYXApOworCQkJbWFwID0geG1hbGxvYyhFX1RBQlNaICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisKKyNkZWZpbmUgdW5pY29kZXMgKCh1bnNpZ25lZCBzaG9ydCAqKW1hcCkKKwkJCS8vIGZpbGwgdmFuaWxsYSBtYXAKKwkJCWZvciAoaSA9IDA7IGkgPCBFX1RBQlNaOyBpKyspCisJCQkJdW5pY29kZXNbaV0gPSAweGYwMDAgKyBpOworCisJCQlwYXJzZXIgPSBjb25maWdfb3BlbihtYXBmaWxlbmFtZSk7CisJCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgfCBQQVJTRV9NSU5fRElFKSkgeworCQkJCS8vIHBhcnNlIGNvZGUvdmFsdWUgcGFpcgorCQkJCWludCBhID0gY3RvaSh0b2tlblswXSk7CisJCQkJaW50IGIgPSBjdG9pKHRva2VuWzFdKTsKKwkJCQlpZiAoYSA8IDAgfHwgYSA+PSBFX1RBQlNaCisJCQkJIHx8IGIgPCAwIHx8IGIgPiA2NTUzNQorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWFwIGZvcm1hdCIpOworCQkJCX0KKwkJCQkvLyBwYXRjaCBtYXAKKwkJCQl1bmljb2Rlc1thXSA9IGI7CisJCQkJLy8gdW5pY29kZSBjaGFyYWN0ZXIgaXMgbWV0PworCQkJCWlmIChiID4gMjU1KQorCQkJCQltb2RlID0gUElPX1VOSVNDUk5NQVA7CisJCQl9CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwkJCWlmIChtb2RlICE9IFBJT19VTklTQ1JOTUFQKSB7CisjZGVmaW5lIGFzY2lpcyAoKHVuc2lnbmVkIGNoYXIgKiltYXApCisJCQkJZm9yIChpID0gMDsgaSA8IEVfVEFCU1o7IGkrKykKKwkJCQkJYXNjaWlzW2ldID0gdW5pY29kZXNbaV07CisjdW5kZWYgYXNjaWlzCisJCQl9CisjdW5kZWYgdW5pY29kZXMKKwkJfQorI2VuZGlmIC8vIEVOQUJMRV9GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVAKKworCQkvLyBkbyBzZXQgc2NyZWVuIG1hcAorCQl4aW9jdGwoZmQsIG1vZGUsIG1hcCk7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShtYXApOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvbG9hZGttYXAuYyBiL2NvbnNvbGUtdG9vbHMvbG9hZGttYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZmZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9sb2Fka21hcC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbG9hZGttYXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRW5yaXF1ZSBaYW5hcmRpIDxlemFuYXJkaUB1bGwuZXM+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9hZGttYXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIjwga2V5bWFwIgorLy91c2FnZTojZGVmaW5lIGxvYWRrbWFwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCBhIGJpbmFyeSBrZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZSBmcm9tIHN0ZGluXG4iCisvKiAvL3VzYWdlOiAgICAgIlxuCS1DIFRUWQlBZmZlY3QgVFRZIGluc3RlYWQgb2YgL2Rldi90dHkiICovCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxvYWRrbWFwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxvYWRrbWFwIDwgL2V0Yy9pMThuL2xhbmcta2V5bWFwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIEJJTkFSWV9LRVlNQVBfTUFHSUMgImJrZXltYXAiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitzdHJ1Y3Qga2JlbnRyeSB7CisJdW5zaWduZWQgY2hhciBrYl90YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGtiX2luZGV4OworCXVuc2lnbmVkIHNob3J0IGtiX3ZhbHVlOworfTsKKy8qIHNldHMgb25lIGVudHJ5IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCisjZGVmaW5lIEtEU0tCRU5UICAgICAgICAweDRCNDcKKworLyogRnJvbSA8bGludXgva2V5Ym9hcmQuaD4gKi8KKyNkZWZpbmUgTlJfS0VZUyAgICAgICAgIDEyOAorI2RlZmluZSBNQVhfTlJfS0VZTUFQUyAgMjU2CisKK2ludCBsb2Fka21hcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9hZGttYXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBrYmVudHJ5IGtlOworCWludCBpLCBqLCBmZDsKKwl1aW50MTZfdCBpYnVmZltOUl9LRVlTXTsKKy8qCWNvbnN0IGNoYXIgKnR0eV9uYW1lID0gQ1VSUkVOVF9UVFk7ICovCisJUkVTRVJWRV9DT05GSUdfQlVGRkVSKGZsYWdzLCBNQVhfTlJfS0VZTUFQUyk7CisKKwkvKiBXaGVuIHVzZXIgYWNjaWRlbnRhbGx5IHJ1bnMgImxvYWRrbWFwIEZJTEUiCisJICogaW5zdGVhZCBvZiAibG9hZGttYXAgPEZJTEUiLCB3ZSBlbmQgdXAgd2FpdGluZyBmb3IgaW5wdXQgZnJvbSB0dHkuCisJICogTGV0J3MgcHJldmVudCBpdDogKi8KKwlpZiAoYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworLyogYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZ3ZbMV0pOyAqLworCWZkID0gZ2V0X2NvbnNvbGVfZmRfb3JfZGllKCk7CisvKiBvciBtYXliZToKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiQzoiLCAmdHR5X25hbWUpOworCWZkID0geG9wZW5fbm9uYmxvY2tpbmcodHR5X25hbWUpOworKi8KKworCXhyZWFkKFNURElOX0ZJTEVOTywgZmxhZ3MsIDcpOworCWlmIChzdHJuY21wKGZsYWdzLCBCSU5BUllfS0VZTUFQX01BR0lDLCA3KSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHZhbGlkIGJpbmFyeSBrZXltYXAiKTsKKworCXhyZWFkKFNURElOX0ZJTEVOTywgZmxhZ3MsIE1BWF9OUl9LRVlNQVBTKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfS0VZTUFQUzsgaSsrKSB7CisJCWlmIChmbGFnc1tpXSA9PSAxKSB7CisJCQl4cmVhZChTVERJTl9GSUxFTk8sIGlidWZmLCBOUl9LRVlTICogc2l6ZW9mKHVpbnQxNl90KSk7CisJCQlmb3IgKGogPSAwOyBqIDwgTlJfS0VZUzsgaisrKSB7CisJCQkJa2Uua2JfaW5kZXggPSBqOworCQkJCWtlLmtiX3RhYmxlID0gaTsKKwkJCQlrZS5rYl92YWx1ZSA9IGlidWZmW2pdOworCQkJCWlvY3RsKGZkLCBLRFNLQkVOVCwgJmtlKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJCVJFTEVBU0VfQ09ORklHX0JVRkZFUihmbGFncyk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL29wZW52dC5jIGIvY29uc29sZS10b29scy9vcGVudnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTIzNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9vcGVudnQuYwpAQCAtMCwwICsxLDE4OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIG9wZW52dC5jIC0gb3BlbiBhIHZ0IHRvIHJ1biBhIGNvbW1hbmQuCisgKgorICogIGJ1c3lib3hlZCBieSBRdXkgVG9udGhhdCA8cXV5QHNpZ25hbDMuY29tPgorICogIGhhY2tlZCBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBvcGVudnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyBOXSBbLXN3XSBbUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBvcGVudnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBQUk9HIG9uIGEgbmV3IHZpcnR1YWwgdGVybWluYWxcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgTglVc2Ugc3BlY2lmaWVkIFZUIgorLy91c2FnZTogICAgICJcbgktcwlTd2l0Y2ggdG8gdGhlIFZUIgorLyogLy91c2FnZTogICAgICJcbgktbAlSdW4gUFJPRyBhcyBsb2dpbiBzaGVsbCAoYnkgcHJlcGVuZGluZyAnLScpIiAqLworLy91c2FnZTogICAgICJcbgktdwlXYWl0IGZvciBQUk9HIHRvIGV4aXQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG9wZW52dF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAib3BlbnZ0IDIgL2Jpbi9hc2hcbiIKKworI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyogIlN0YW5kYXJkIiBvcGVudnQncyBtYW4gcGFnZSAod2UgZG8gbm90IHN1cHBvcnQgYWxsIG9mIHRoaXMpOgorCitvcGVudnQgWy1jIE5VTV0gWy1mc3Vsdl0gWy0tXSBbY29tbWFuZCBbYXJnc11dCisKK0ZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBWVCwgYW5kIHJ1biBjb21tYW5kIG9uIGl0LiBTdGRpbyBpcyBkaXJlY3RlZAordG8gdGhhdCBWVC4gSWYgbm8gY29tbWFuZCBpcyBzcGVjaWZpZWQgdGhlbiAkU0hFTEwgaXMgdXNlZC4KKworLWMgTlVNCisgICAgVXNlIHRoZSBnaXZlbiBWVCBudW1iZXIsIG5vdCB0aGUgZmlyc3QgZnJlZSBvbmUuCistZgorICAgIEZvcmNlIG9wZW5pbmcgYSBWVDogZG9uJ3QgdHJ5IHRvIGNoZWNrIGlmIFZUIGlzIGFscmVhZHkgaW4gdXNlLgorLXMKKyAgICBTd2l0Y2ggdG8gdGhlIG5ldyBWVCB3aGVuIHN0YXJ0aW5nIHRoZSBjb21tYW5kLgorICAgIFRoZSBWVCBvZiB0aGUgbmV3IGNvbW1hbmQgd2lsbCBiZSBtYWRlIHRoZSBuZXcgY3VycmVudCBWVC4KKy11CisgICAgRmlndXJlIG91dCB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgVlQsIGFuZCBydW4gbG9naW4gYXMgdGhhdCB1c2VyLgorICAgIFN1aXRhYmxlIHRvIGJlIGNhbGxlZCBieSBpbml0LiBTaG91bGRuJ3QgYmUgdXNlZCB3aXRoIC1jIG9yIC1sLgorLWwKKyAgICBNYWtlIHRoZSBjb21tYW5kIGEgbG9naW4gc2hlbGw6IGEgIi0iIGlzIHByZXBlbmRlZCB0byB0aGUgYXJndlswXQorICAgIHdoZW4gY29tbWFuZCBpcyBleGVjdXRlZC4KKy12CisgICAgVmVyYm9zZS4KKy13CisgICAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gSWYgLXcgYW5kIC1zIGFyZSB1c2VkIHRvZ2V0aGVyLAorICAgIHN3aXRjaCBiYWNrIHRvIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcy4KKworYmJveDoKKy11OiBub3QgaW1wbGVtZW50ZWQKKy1mOiBhbHdheXMgaW4gZWZmZWN0CistbDogbm90IGltcGxlbWVudGVkLCBpZ25vcmVkCistdjogaWdub3JlZAorLXdzOiBkb2VzIE5PVCBzd2l0Y2ggYmFjaworKi8KKworLyogSGVscGVyOiBkb2VzIHRoaXMgZmQgdW5kZXJzdGFuZCBWVF94eHg/ICovCitzdGF0aWMgaW50IG5vdF92dF9mZChpbnQgZmQpCit7CisJc3RydWN0IHZ0X3N0YXQgdnRzdGF0OworCXJldHVybiBpb2N0bChmZCwgVlRfR0VUU1RBVEUsICZ2dHN0YXQpOyAvKiAhMDogZXJyb3IsIGl0J3Mgbm90IFZUIGZkICovCit9CisKKy8qIEhlbHBlcjogZ2V0IGEgZmQgc3VpdGFibGUgZm9yIFZUX3h4eCAqLworc3RhdGljIGludCBnZXRfdnRfZmQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwkvKiBEbyB3ZSwgYnkgY2hhbmNlLCBhbHJlYWR5IGhhdmUgaXQ/ICovCisJZm9yIChmZCA9IDA7IGZkIDwgMzsgZmQrKykKKwkJaWYgKCFub3RfdnRfZmQoZmQpKQorCQkJcmV0dXJuIGZkOworCWZkID0gb3BlbihERVZfQ09OU09MRSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKwlpZiAoZmQgPj0gMCAmJiAhbm90X3Z0X2ZkKGZkKSkKKwkJcmV0dXJuIGZkOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIG9wZW4gVlQiKTsKK30KKworc3RhdGljIGludCBmaW5kX2ZyZWVfdnRubyh2b2lkKQoreworCWludCB2dG5vOworCWludCBmZCA9IGdldF92dF9mZCgpOworCisJZXJybm8gPSAwOworCS8qeGZ1bmNfZXJyb3JfcmV0dmFsID0gMzsgLSBkbyB3ZSBuZWVkIGNvbXBhdD8gKi8KKwlpZiAoaW9jdGwoZmQsIFZUX09QRU5RUlksICZ2dG5vKSAhPSAwIHx8IHZ0bm8gPD0gMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIG9wZW4gVlQiKTsKKy8vIE5vdCByZWFsbHkgbmVlZGVkLCBncmVwIGZvciBEQUVNT05fT05MWV9TQU5JVElaRQorLy8JaWYgKGZkID4gMikKKy8vCQljbG9zZShmZCk7CisJcmV0dXJuIHZ0bm87Cit9CisKKy8qIHZmb3JrIHNjYXJlcyBnY2MsIGl0IGdlbmVyYXRlcyBiaWdnZXIgY29kZS4KKyAqIEtlZXAgaXQgYXdheSBmcm9tIG1haW4gcHJvZ3JhbS4KKyAqIFRPRE86IG1vdmUgdG8gbGliYmI7IG9yIGFkYXB0IGV4aXN0aW5nIGxpYmJiJ3Mgc3Bhd24oKS4KKyAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgdmZvcmtfY2hpbGQoY2hhciAqKmFyZ3YpCit7CisJaWYgKHZmb3JrKCkgPT0gMCkgeworCQkvKiBDSElMRCAqLworCQkvKiBUcnkgdG8gbWFrZSB0aGlzIFZUIG91ciBjb250cm9sbGluZyB0dHkgKi8KKwkJc2V0c2lkKCk7IC8qIGxvc2Ugb2xkIGN0dHkgKi8KKwkJaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksIDAgLyogMDogZG9uJ3QgZm9yY2libHkgc3RlYWwgKi8pOworCQkvL2JiX2Vycm9yX21zZygib3VyIHNpZCAlZCIsIGdldHNpZCgwKSk7CisJCS8vYmJfZXJyb3JfbXNnKCJvdXIgcGdycCAlZCIsIGdldHBncnAoKSk7CisJCS8vYmJfZXJyb3JfbXNnKCJWVCdzIHNpZCAlZCIsIHRjZ2V0c2lkKDApKTsKKwkJLy9iYl9lcnJvcl9tc2coIlZUJ3MgcGdycCAlZCIsIHRjZ2V0cGdycCgwKSk7CisJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJfQorfQorCitpbnQgb3BlbnZ0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBvcGVudnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgdnRuYW1lW3NpemVvZihWQ19GT1JNQVQpICsgc2l6ZW9mKGludCkqM107CisJc3RydWN0IHZ0X3N0YXQgdnRzdGF0OworCWNoYXIgKnN0cl9jOworCWludCB2dG5vOworCWludCBmbGFnczsKKwllbnVtIHsKKwkJT1BUX2MgPSAoMSA8PCAwKSwKKwkJT1BUX3cgPSAoMSA8PCAxKSwKKwkJT1BUX3MgPSAoMSA8PCAyKSwKKwkJT1BUX2wgPSAoMSA8PCAzKSwKKwkJT1BUX2YgPSAoMSA8PCA0KSwKKwkJT1BUX3YgPSAoMSA8PCA1KSwKKwl9OworCisJLyogIisiIC0gc3RvcCBvbiBmaXJzdCBub24tb3B0aW9uICovCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiK2M6d3NsZnYiLCAmc3RyX2MpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGZsYWdzICYgT1BUX2MpIHsKKwkJLyogQ2hlY2sgZm9yIGlsbGVnYWwgdnQgbnVtYmVyOiA8IDEgb3IgPiA2MyAqLworCQl2dG5vID0geGF0b3VfcmFuZ2Uoc3RyX2MsIDEsIDYzKTsKKwl9IGVsc2UgeworCQl2dG5vID0gZmluZF9mcmVlX3Z0bm8oKTsKKwl9CisKKwkvKiBHcmFiIG5ldyBWVCAqLworCXNwcmludGYodnRuYW1lLCBWQ19GT1JNQVQsIHZ0bm8pOworCS8qIChUcnkgdG8pIGNsZWFuIHVwIHN0cmF5IG9wZW4gZmRzIGFib3ZlIGZkIDIgKi8KKwliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NMT1NFX0VYVFJBX0ZEUyB8IERBRU1PTl9PTkxZX1NBTklUSVpFLCBOVUxMKTsKKwljbG9zZShTVERJTl9GSUxFTk8pOworCS8qc2V0c2lkKCk7IC0gQkFEIElERUE6IGFmdGVyIHdlIGV4aXQsIGNoaWxkIGlzIFNJR0hVUGVkLi4uICovCisJeG9wZW4odnRuYW1lLCBPX1JEV1IpOworCXhpb2N0bChTVERJTl9GSUxFTk8sIFZUX0dFVFNUQVRFLCAmdnRzdGF0KTsKKworCWlmIChmbGFncyAmIE9QVF9zKSB7CisJCWNvbnNvbGVfbWFrZV9hY3RpdmUoU1RESU5fRklMRU5PLCB2dG5vKTsKKwl9CisKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJYXJndi0tOworCQlhcmd2WzBdID0gKGNoYXIgKikgZ2V0X3NoZWxsX25hbWUoKTsKKwkJLyphcmd2WzFdID0gTlVMTDsgLSBhbHJlYWR5IGlzICovCisJfQorCisJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwl4ZHVwMihTVERJTl9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCisjaWZkZWYgQkxPQVQKKwl7CisJLyogSGFuZGxlIC1sIChsb2dpbiBzaGVsbCkgb3B0aW9uICovCisJY29uc3QgY2hhciAqcHJvZyA9IGFyZ3ZbMF07CisJaWYgKGZsYWdzICYgT1BUX2wpCisJCWFyZ3ZbMF0gPSB4YXNwcmludGYoIi0lcyIsIGFyZ3ZbMF0pOworCX0KKyNlbmRpZgorCisJdmZvcmtfY2hpbGQoYXJndik7CisJaWYgKGZsYWdzICYgT1BUX3cpIHsKKwkJLyogV2UgaGF2ZSBvbmx5IG9uZSBjaGlsZCwgd2FpdCBmb3IgaXQgKi8KKwkJc2FmZV93YWl0cGlkKC0xLCBOVUxMLCAwKTsgLyogbG9vcHMgb24gRUlOVFIgKi8KKwkJaWYgKGZsYWdzICYgT1BUX3MpIHsKKwkJCWNvbnNvbGVfbWFrZV9hY3RpdmUoU1RESU5fRklMRU5PLCB2dHN0YXQudl9hY3RpdmUpOworCQkJLy8gQ29tcGF0OiBldmVuIHdpdGggLWMgTiAodHJ5IHRvKSBkaXNhbGxvY2F0ZToKKwkJCS8vICMgL3Vzci9hcHAva2JkLTEuMTIvYmluL29wZW52dCAtZiAtYyA5IC13cyBzbGVlcCA1CisJCQkvLyBvcGVudnQ6IGNvdWxkIG5vdCBkZWFsbG9jYXRlIGNvbnNvbGUgOQorCQkJeGlvY3RsKFNURElOX0ZJTEVOTywgVlRfRElTQUxMT0NBVEUsICh2b2lkKikocHRyZGlmZl90KXZ0bm8pOworCQl9CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3Jlc2V0LmMgYi9jb25zb2xlLXRvb2xzL3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5NDBiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvcmVzZXQuYwpAQCAtMCwwICsxLDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJlc2V0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogV3JpdHRlbiBieSBFcmlrIEFuZGVyc2VuIGFuZCBLZW50IFJvYm90dGkgPHJvYm90dGlAbWV0Y29ubmVjdC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCVFcsIHdoaWNoICJzdGFuZGFyZCIgcGFja2FnZSBoYXMgdGhpcyB1dGlsaXR5PyBJdCBkb2Vzbid0IHNlZW0KKyAqIHRvIGJlIG5jdXJzZXMsIGNvcmV1dGlscywgY29uc29sZS10b29scy4uLiB0aGVuIHdoYXQ/ICovCisKKy8vdXNhZ2U6I2RlZmluZSByZXNldF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHJlc2V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzZXQgdGhlIHNjcmVlbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgRVNDICJcMDMzIgorCisjaWYgRU5BQkxFX1NUVFkKK2ludCBzdHR5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyNlbmRpZgorCitpbnQgcmVzZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlc2V0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFyZ3NbXSA9IHsKKwkJInN0dHkiLCAic2FuZSIsIE5VTEwKKwl9OworCisJLyogbm8gb3B0aW9ucywgbm8gZ2V0b3B0ICovCisKKwlpZiAoLyppc2F0dHkoU1RESU5fRklMRU5PKSAmJiovIGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQkvKiBTZWUgJ21hbiA0IGNvbnNvbGVfY29kZXMnIGZvciBkZXRhaWxzOgorCQkgKiAiRVNDIGMiICAgICAgICAtLSBSZXNldAorCQkgKiAiRVNDICggQiIgICAgICAtLSBTZWxlY3QgRzAgQ2hhcmFjdGVyIFNldCAoQiA9IFVTKQorCQkgKiAiRVNDIFsgMCBtIiAgICAtLSBSZXNldCBhbGwgZGlzcGxheSBhdHRyaWJ1dGVzCisJCSAqICJFU0MgWyBKIiAgICAgIC0tIEVyYXNlIHRvIHRoZSBlbmQgb2Ygc2NyZWVuCisJCSAqICJFU0MgWyA/IDI1IGgiIC0tIE1ha2UgY3Vyc29yIHZpc2libGUKKwkJICovCisJCXByaW50ZihFU0MiYyIgRVNDIihCIiBFU0MiWzBtIiBFU0MiW0oiIEVTQyJbPzI1aCIpOworCQkvKiBodHRwOi8vYnVncy5idXN5Ym94Lm5ldC92aWV3LnBocD9pZD0xNDE0OgorCQkgKiBwZW9wbGUgd2FudCBpdCB0byByZXNldCBlY2hvIGV0YzogKi8KKyNpZiBFTkFCTEVfU1RUWQorCQlyZXR1cm4gc3R0eV9tYWluKDIsIChjaGFyKiopYXJncyk7CisjZWxzZQorCQlleGVjdnAoInN0dHkiLCAoY2hhcioqKWFyZ3MpOworI2VuZGlmCisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3Jlc2l6ZS5jIGIvY29uc29sZS10b29scy9yZXNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjBkNjNhCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9yZXNpemUuYwpAQCAtMCwwICsxLDc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZXNpemUgLSBzZXQgdGVybWluYWwgd2lkdGggYW5kIGhlaWdodC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworLy91c2FnZTojZGVmaW5lIHJlc2l6ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHJlc2l6ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlc2l6ZSB0aGUgc2NyZWVuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBFU0MgIlwwMzMiCisKKyNkZWZpbmUgb2xkX3Rlcm1pb3NfcCAoKHN0cnVjdCB0ZXJtaW9zKikmYmJfY29tbW9uX2J1ZnNpejEpCisKK3N0YXRpYyB2b2lkCitvbmludHIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJdGNzZXRhdHRyKFNUREVSUl9GSUxFTk8sIFRDU0FOT1csIG9sZF90ZXJtaW9zX3ApOworCV9leGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK2ludCByZXNpemVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlc2l6ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0ZXJtaW9zIG5ldzsKKwlzdHJ1Y3Qgd2luc2l6ZSB3ID0geyAwLCAwLCAwLCAwIH07CisJaW50IHJldDsKKworCS8qIFdlIHVzZSBfc3RkZXJyXyBpbiBvcmRlciB0byBtYWtlIHJlc2l6ZSB1c2FibGUKKwkgKiBpbiBzaGVsbCBiYWNrdGlja3MgKHRob3NlIHJlZGlyZWN0IHN0ZG91dCBhd2F5IGZyb20gdHR5KS4KKwkgKiBOQjogb3RoZXIgdmVyc2lvbnMgb2YgcmVzaXplIG9wZW4gIi9kZXYvdHR5IgorCSAqIGFuZCBvcGVyYXRlIG9uIGl0IC0gc2hvdWxkIHdlIGRvIHRoZSBzYW1lPworCSAqLworCisJdGNnZXRhdHRyKFNUREVSUl9GSUxFTk8sIG9sZF90ZXJtaW9zX3ApOyAvKiBmaWRkbGUgZWNobyAqLworCW1lbWNweSgmbmV3LCBvbGRfdGVybWlvc19wLCBzaXplb2YobmV3KSk7CisJbmV3LmNfY2ZsYWcgfD0gKENMT0NBTCB8IENSRUFEKTsKKwluZXcuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IElTSUcpOworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0lOVCkKKwkJKyAoMSA8PCBTSUdRVUlUKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHQUxSTSkKKwkJLCBvbmludHIpOworCXRjc2V0YXR0cihTVERFUlJfRklMRU5PLCBUQ1NBTk9XLCAmbmV3KTsKKworCS8qIHNhdmVfY3Vyc29yX3BvcyA3CisJICogc2Nyb2xsX3dob2xlX3NjcmVlbiBbcgorCSAqIHB1dF9jdXJzb3Jfd2FhYWF5X29mZiBbJHg7JHlICisJICogZ2V0X2N1cnNvcl9wb3MgWzZuCisJICogcmVzdG9yZV9jdXJzb3JfcG9zIDgKKwkgKi8KKwlmcHJpbnRmKHN0ZGVyciwgRVNDIjciIEVTQyJbciIgRVNDIls5OTk7OTk5SCIgRVNDIls2biIpOworCWFsYXJtKDMpOyAvKiBKdXN0IGluIGNhc2UgdGVybWluYWwgd29uJ3QgYW5zd2VyICovCisvL0JVRzogZGVhdGggYnkgc2lnbmFsIHdvbid0IHJlc3RvcmUgdGVybWlvcworCXNjYW5mKEVTQyJbJWh1OyVodVIiLCAmdy53c19yb3csICZ3LndzX2NvbCk7CisJZnByaW50ZihzdGRlcnIsIEVTQyI4Iik7CisKKwkvKiBCVFcsIG90aGVyIHZlcnNpb25zIG9mIHJlc2l6ZSByZWNhbGN1bGF0ZSB3LndzX3hwaXhlbCwgd3Mud3NfeXBpeGVsCisJICogYnkgY2FsY3VsYXRpbmcgY2hhcmFjdGVyIGNlbGwgSHhXIGZyb20gb2xkIHZhbHVlcworCSAqIChnb3R0ZW4gdmlhIFRJT0NHV0lOU1opIGFuZCByZWNvbXB1dGluZyAqcGl4ZWwgdmFsdWVzICovCisJcmV0ID0gaW9jdGwoU1RERVJSX0ZJTEVOTywgVElPQ1NXSU5TWiwgJncpOworCisJdGNzZXRhdHRyKFNUREVSUl9GSUxFTk8sIFRDU0FOT1csIG9sZF90ZXJtaW9zX3ApOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1JFU0laRV9QUklOVCkKKwkJcHJpbnRmKCJDT0xVTU5TPSVkO0xJTkVTPSVkO2V4cG9ydCBDT0xVTU5TIExJTkVTO1xuIiwKKwkJCXcud3NfY29sLCB3LndzX3Jvdyk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9zZXRjb25zb2xlLmMgYi9jb25zb2xlLXRvb2xzL3NldGNvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA1MWRjCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9zZXRjb25zb2xlLmMKQEAgLTAsMCArMSw0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIHNldGNvbnNvbGUuYyAtIHJlZGlyZWN0IHN5c3RlbSBjb25zb2xlIG91dHB1dAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgRW5yaWsgQmVya2hhbiA8RW5yaWsuQmVya2hhbkBpbmthLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRjb25zb2xlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXIiIElGX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlMoInwtLXJlc2V0IikgIl0gW0RFVklDRV0iCisvL3VzYWdlOiNkZWZpbmUgc2V0Y29uc29sZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlZGlyZWN0IHN5c3RlbSBjb25zb2xlIG91dHB1dCB0byBERVZJQ0UgKGRlZmF1bHQ6IC9kZXYvdHR5KVxuIgorLy91c2FnZTogICAgICJcbgktcglSZXNldCBvdXRwdXQgdG8gL2Rldi9jb25zb2xlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNldGNvbnNvbGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldGNvbnNvbGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmRldmljZSA9IENVUlJFTlRfVFRZOworCWJvb2wgcmVzZXQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIHNldGNvbnNvbGVfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkicmVzZXRcMCIgTm9fYXJndW1lbnQgInIiCisJCTsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gc2V0Y29uc29sZV9sb25nb3B0czsKKyNlbmRpZgorCS8qIGF0IG1vc3Qgb25lIG5vbi1vcHRpb24gYXJndW1lbnQgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7CisJcmVzZXQgPSBnZXRvcHQzMihhcmd2LCAiciIpOworCisJYXJndiArPSAxICsgcmVzZXQ7CisJaWYgKCphcmd2KSB7CisJCWRldmljZSA9ICphcmd2OworCX0gZWxzZSB7CisJCWlmIChyZXNldCkKKwkJCWRldmljZSA9IERFVl9DT05TT0xFOworCX0KKworCXhpb2N0bCh4b3BlbihkZXZpY2UsIE9fV1JPTkxZKSwgVElPQ0NPTlMsIE5VTEwpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3NldGtleWNvZGVzLmMgYi9jb25zb2xlLXRvb2xzL3NldGtleWNvZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhN2MyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvc2V0a2V5Y29kZXMuYwpAQCAtMCwwICsxLDU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXRrZXljb2RlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4IEFuZHJpZXMgRS4gQnJvdXdlciA8YWViQGN3aS5ubD4KKyAqCisgKiBBZGp1c3RlZCBmb3IgQnVzeUJveCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2V0a2V5Y29kZXNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNDQU5DT0RFIEtFWUNPREUuLi4iCisvL3VzYWdlOiNkZWZpbmUgc2V0a2V5Y29kZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZXQgZW50cmllcyBpbnRvIHRoZSBrZXJuZWwncyBzY2FuY29kZS10by1rZXljb2RlIG1hcCxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbGxvd2luZyB1bnVzdWFsIGtleWJvYXJkcyB0byBnZW5lcmF0ZSB1c2FibGUga2V5Y29kZXMuXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTQ0FOQ09ERSBtYXkgYmUgZWl0aGVyIHh4IG9yIGUweHggKGhleGFkZWNpbWFsKSxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgS0VZQ09ERSBpcyBnaXZlbiBpbiBkZWNpbWFsLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2V0a2V5Y29kZXNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgc2V0a2V5Y29kZXMgZTAzMCAxMjdcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitzdHJ1Y3Qga2JrZXljb2RlIHsKKwl1bnNpZ25lZCBzY2FuY29kZSwga2V5Y29kZTsKK307CitlbnVtIHsKKwlLRFNFVEtFWUNPREUgPSAweDRCNEQgIC8qIHdyaXRlIGtlcm5lbCBrZXljb2RlIHRhYmxlIGVudHJ5ICovCit9OworCitpbnQgc2V0a2V5Y29kZXNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldGtleWNvZGVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwlzdHJ1Y3Qga2JrZXljb2RlIGE7CisKKwlpZiAoIShhcmdjICYgMSkgLyogaWYgZXZlbiAqLyB8fCBhcmdjIDwgMikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZmQgPSBnZXRfY29uc29sZV9mZF9vcl9kaWUoKTsKKworCXdoaWxlIChhcmd2WzFdKSB7CisJCWludCBzYyA9IHhzdHJ0b3VsX3JhbmdlKGFyZ3ZbMV0sIDE2LCAwLCAweGUwN2YpOworCQlpZiAoc2MgPj0gMHhlMDAwKSB7CisJCQlzYyAtPSAweGUwMDA7CisJCQlzYyArPSAweDAwODA7CisJCX0KKwkJYS5zY2FuY29kZSA9IHNjOworCQlhLmtleWNvZGUgPSB4YXRvdV9yYW5nZShhcmd2WzJdLCAwLCAyNTUpOworCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwgS0RTRVRLRVlDT0RFLCAmYSwKKwkJCSJjYW4ndCBzZXQgU0NBTkNPREUgJXggdG8gS0VZQ09ERSAlZCIsCisJCQlzYywgYS5rZXljb2RlKTsKKwkJYXJndiArPSAyOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9zZXRsb2djb25zLmMgYi9jb25zb2xlLXRvb2xzL3NldGxvZ2NvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2E4OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9zZXRsb2djb25zLmMKQEAgLTAsMCArMSwzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2V0bG9nY29uczogU2VuZCBrZXJuZWwgbWVzc2FnZXMgdG8gdGhlIGN1cnJlbnQgY29uc29sZSBvciB0byBjb25zb2xlIE4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSmFuIEtpc3prYSA8amFuLmtpc3prYUB3ZWIuZGU+CisgKgorICogQmFzZWQgb24gc2V0bG9nY29ucyAoa2JkLTEuMTIpIGJ5IEFuZHJpZXMgRS4gQnJvdXdlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldGxvZ2NvbnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIk4iCisvL3VzYWdlOiNkZWZpbmUgc2V0bG9nY29uc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlZGlyZWN0IHRoZSBrZXJuZWwgb3V0cHV0IHRvIGNvbnNvbGUgTiAoMCBmb3IgY3VycmVudCkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2V0bG9nY29uc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0bG9nY29uc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJY2hhciBmbjsKKwkJY2hhciBzdWJhcmc7CisJfSBhcmcgPSB7IDExLCAvKiByZWRpcmVjdCBrZXJuZWwgbWVzc2FnZXMgKi8KKwkJCSAgMCAgIC8qIHRvIHNwZWNpZmllZCBjb25zb2xlIChjdXJyZW50IGFzIGRlZmF1bHQpICovCisJCQl9OworCisJaWYgKGFyZ3ZbMV0pCisJCWFyZy5zdWJhcmcgPSB4YXRvdV9yYW5nZShhcmd2WzFdLCAwLCA2Myk7CisKKwl4aW9jdGwoeG9wZW4oVkNfMSwgT19SRE9OTFkpLCBUSU9DTElOVVgsICZhcmcpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvc2hvd2tleS5jIGIvY29uc29sZS10b29scy9zaG93a2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliNzg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvc2hvd2tleS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzaG93cyBrZXlzIHByZXNzZWQuIGluc3BpcmVkIGJ5IGtiZCBwYWNrYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzaG93a2V5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWEgfCAtayB8IC1zXSIKKy8vdXNhZ2U6I2RlZmluZSBzaG93a2V5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdyBrZXlzIHByZXNzZWRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJRGlzcGxheSBkZWNpbWFsL29jdGFsL2hleCB2YWx1ZXMgb2YgdGhlIGtleXMiCisvL3VzYWdlOiAgICAgIlxuCS1rCURpc3BsYXkgaW50ZXJwcmV0ZWQga2V5Y29kZXMgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktcwlEaXNwbGF5IHJhdyBzY2FuLWNvZGVzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQga2Jtb2RlOworCXN0cnVjdCB0ZXJtaW9zIHRpbywgdGlvMDsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUga2Jtb2RlIChHLmtibW9kZSkKKyNkZWZpbmUgdGlvICAgIChHLnRpbykKKyNkZWZpbmUgdGlvMCAgIChHLnRpbzApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8vIHNldCByYXcgdHR5IG1vZGUKKy8vIGFsc28gdXNlZCBieSBtaWNyb2NvbQorLy8gbGliYmIgY2FuZGlkYXRlcz8KK3N0YXRpYyB2b2lkIHhnZXQxKHN0cnVjdCB0ZXJtaW9zICp0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkdCkKK3sKKwl0Y2dldGF0dHIoU1RESU5fRklMRU5PLCBvbGR0KTsKKwkqdCA9ICpvbGR0OworCWNmbWFrZXJhdyh0KTsKK30KKworc3RhdGljIHZvaWQgeHNldDEoc3RydWN0IHRlcm1pb3MgKnQpCit7CisJaW50IHJldCA9IHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FGTFVTSCwgdCk7CisJaWYgKHJldCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCB0Y3NldGF0dHIgZm9yIHN0ZGluIik7CisJfQorfQorCitpbnQgc2hvd2tleV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2hvd2tleV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9hID0gKDE8PDApLCAvLyBkaXNwbGF5IHRoZSBkZWNpbWFsL29jdGFsL2hleCB2YWx1ZXMgb2YgdGhlIGtleXMKKwkJT1BUX2sgPSAoMTw8MSksIC8vIGRpc3BsYXkgb25seSB0aGUgaW50ZXJwcmV0ZWQga2V5Y29kZXMgKGRlZmF1bHQpCisJCU9QVF9zID0gKDE8PDIpLCAvLyBkaXNwbGF5IG9ubHkgdGhlIHJhdyBzY2FuLWNvZGVzCisJfTsKKworCUlOSVRfRygpOworCisJLy8gRklYTUU6IGFrcyBhcmUgYWxsIG11dHVhbGx5IGV4Y2x1c2l2ZQorCWdldG9wdDMyKGFyZ3YsICJha3MiKTsKKworCS8vIHByZXBhcmUgZm9yIHJhdyBtb2RlCisJeGdldDEoJnRpbywgJnRpbzApOworCS8vIHB1dCBzdGRpbiBpbiByYXcgbW9kZQorCXhzZXQxKCZ0aW8pOworCisjZGVmaW5lIHByZXNzX2tleXMgIlByZXNzIGFueSBrZXlzLCBwcm9ncmFtIHRlcm1pbmF0ZXMgJXM6XHJcblxuIgorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYSkgeworCQkvLyBqdXN0IHJlYWQgc3RkaW4gY2hhciBieSBjaGFyCisJCXVuc2lnbmVkIGNoYXIgYzsKKworCQlwcmludGYocHJlc3Nfa2V5cywgIm9uIEVPRiAoY3RybC1EKSIpOworCisJCS8vIHJlYWQgYW5kIHNob3cgYnl0ZSB2YWx1ZXMKKwkJd2hpbGUgKDEgPT0gcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSkgeworCQkJcHJpbnRmKCIlM3UgMCUwM28gMHglMDJ4XHJcbiIsIGMsIGMsIGMpOworCQkJaWYgKDA0IC8qQ1RSTC1EKi8gPT0gYykKKwkJCQlicmVhazsKKwkJfQorCisJfSBlbHNlIHsKKwkJLy8gd2UgYXNzdW1lIGEgUEMga2V5Ym9hcmQKKwkJeGlvY3RsKFNURElOX0ZJTEVOTywgS0RHS0JNT0RFLCAma2Jtb2RlKTsKKwkJcHJpbnRmKCJLZXlib2FyZCBtb2RlIHdhcyAlcy5cclxuXG4iLAorCQkJa2Jtb2RlID09IEtfUkFXID8gIlJBVyIgOgorCQkJCShrYm1vZGUgPT0gS19YTEFURSA/ICJYTEFURSIgOgorCQkJCQkoa2Jtb2RlID09IEtfTUVESVVNUkFXID8gIk1FRElVTVJBVyIgOgorCQkJCQkJKGtibW9kZSA9PSBLX1VOSUNPREUgPyAiVU5JQ09ERSIgOiAiVU5LTk9XTiIpKSkKKwkJKTsKKworCQkvLyBzZXQgcmF3IGtleWJvYXJkIG1vZGUKKwkJeGlvY3RsKFNURElOX0ZJTEVOTywgS0RTS0JNT0RFLCAodm9pZCAqKShwdHJkaWZmX3QpKChvcHRpb25fbWFzazMyICYgT1BUX2spID8gS19NRURJVU1SQVcgOiBLX1JBVykpOworCisJCS8vIHdlIHNob3VsZCBleGl0IG9uIGFueSBzaWduYWw7IHNpZ25hbHMgc2hvdWxkIGludGVycnVwdCByZWFkCisJCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydChCQl9GQVRBTF9TSUdTLCByZWNvcmRfc2lnbm8pOworCisJCS8vIGluZm9ybSB1c2VyIHRoYXQgcHJvZ3JhbSBlbmRzIGFmdGVyIHRpbWUgb2YgaW5hY3Rpdml0eQorCQlwcmludGYocHJlc3Nfa2V5cywgIjEwcyBhZnRlciBsYXN0IGtleXByZXNzIik7CisKKwkJLy8gcmVhZCBhbmQgc2hvdyBzY2FuY29kZXMKKwkJd2hpbGUgKCFiYl9nb3Rfc2lnbmFsKSB7CisJCQljaGFyIGJ1ZlsxOF07CisJCQlpbnQgaSwgbjsKKworCQkJLy8gc2V0dXAgMTBzIHdhdGNoZG9nCisJCQlhbGFybSgxMCk7CisKKwkJCS8vIHJlYWQgc2NhbmNvZGVzCisJCQluID0gcmVhZChTVERJTl9GSUxFTk8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJaSA9IDA7CisJCQl3aGlsZSAoaSA8IG4pIHsKKwkJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9zKSB7CisJCQkJCS8vIHNob3cgcmF3IHNjYW5jb2RlcworCQkJCQlwcmludGYoIjB4JTAyeCAiLCBidWZbaSsrXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gc2hvdyBpbnRlcnByZXRlZCBzY2FuY29kZXMgKGRlZmF1bHQpCisJCQkJCWNoYXIgYyA9IGJ1ZltpXTsKKwkJCQkJaW50IGtjOworCQkJCQlpZiAoaSsyIDwgbgorCQkJCQkgJiYgKGMgJiAweDdmKSA9PSAwCisJCQkJCSAmJiAoYnVmW2krMV0gJiAweDgwKSAhPSAwCisJCQkJCSAmJiAoYnVmW2krMl0gJiAweDgwKSAhPSAwCisJCQkJCSkgeworCQkJCQkJa2MgPSAoKGJ1ZltpKzFdICYgMHg3ZikgPDwgNykgfCAoYnVmW2krMl0gJiAweDdmKTsKKwkJCQkJCWkgKz0gMzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWtjID0gKGMgJiAweDdmKTsKKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCQlwcmludGYoImtleWNvZGUgJTN1ICVzIiwga2MsIChjICYgMHg4MCkgPyAicmVsZWFzZSIgOiAicHJlc3MiKTsKKwkJCQl9CisJCQl9CisJCQlwdXRzKCJcciIpOworCQl9CisKKwkJLy8gcmVzdG9yZSBrZXlib2FyZCBtb2RlCisJCXhpb2N0bChTVERJTl9GSUxFTk8sIEtEU0tCTU9ERSwgKHZvaWQgKikocHRyZGlmZl90KWtibW9kZSk7CisJfQorCisJLy8gcmVzdG9yZSBjb25zb2xlIHNldHRpbmdzCisJeHNldDEoJnRpbzApOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9Db25maWcuaW4gYi9jb3JldXRpbHMvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDFjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvQ29uZmlnLmluCkBAIC0wLDAgKzEsOTEzIEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiQ29yZXV0aWxzIgorCitjb25maWcgQkFTRU5BTUUKKwlib29sICJiYXNlbmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBiYXNlbmFtZSBpcyB1c2VkIHRvIHN0cmlwIHRoZSBkaXJlY3RvcnkgYW5kIHN1ZmZpeCBmcm9tIGZpbGVuYW1lcywKKwkgIGxlYXZpbmcganVzdCB0aGUgZmlsZW5hbWUgaXRzZWxmLiBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdpc2gKKwkgIHRvIGVuYWJsZSB0aGUgJ2Jhc2VuYW1lJyB1dGlsaXR5LgorY29uZmlnIENBVAorCWJvb2wgImNhdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjYXQgaXMgdXNlZCB0byBjb25jYXRlbmF0ZSBmaWxlcyBhbmQgcHJpbnQgdGhlbSB0byB0aGUgc3RhbmRhcmQKKwkgIG91dHB1dC4gRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIGVuYWJsZSB0aGUgJ2NhdCcgdXRpbGl0eS4KK2NvbmZpZyBEQVRFCisJYm9vbCAiZGF0ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkYXRlIGlzIHVzZWQgdG8gc2V0IHRoZSBzeXN0ZW0gZGF0ZSBvciBkaXNwbGF5IHRoZQorCSAgY3VycmVudCB0aW1lIGluIHRoZSBnaXZlbiBmb3JtYXQuCisKK2NvbmZpZyBGRUFUVVJFX0RBVEVfSVNPRk1UCisJYm9vbCAiRW5hYmxlIElTTyBkYXRlIGZvcm1hdCBvdXRwdXQgKC1JKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERBVEUKKwloZWxwCisJICBFbmFibGUgb3B0aW9uICgtSSkgdG8gb3V0cHV0IGFuIElTTy04NjAxIGNvbXBsaWFudAorCSAgZGF0ZS90aW1lIHN0cmluZy4KKworIyBkZWZhdWx0cyB0byAibm8iOiBzdGF0J3MgbmFub3NlY29uZCBmaWVsZCBpcyBhIGJpdCBub24tcG9ydGFibGUKK2NvbmZpZyBGRUFUVVJFX0RBVEVfTkFOTworCWJvb2wgIlN1cHBvcnQgJVtudW1dTiBuYW5vc2Vjb25kIGZvcm1hdCBzcGVjaWZpZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBEQVRFICAjIHN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lKQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFN1cHBvcnQgJVtudW1dTiBmb3JtYXQgc3BlY2lmaWVyLiBBZGRzIH4yNTAgYnl0ZXMgb2YgY29kZS4KKworY29uZmlnIEZFQVRVUkVfREFURV9DT01QQVQKKwlib29sICJTdXBwb3J0IHdlaXJkICdkYXRlIE1NRERoaG1tW1tZWV1ZWV1bLnNzXScgZm9ybWF0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREFURQorCWhlbHAKKwkgIFN5c3RlbSB0aW1lIGNhbiBiZSBzZXQgYnkgJ2RhdGUgLXMgREFURScgYW5kIHNpbXBseSAnZGF0ZSBEQVRFJywKKwkgIGJ1dCBmb3JtYXRzIG9mIERBVEUgc3RyaW5nIGFyZSBkaWZmZXJlbnQuICdkYXRlIERBVEUnIGFjY2VwdHMKKwkgIGEgcmF0aGVyIHdlaXJkIE1NRERoaG1tW1tZWV1ZWV1bLnNzXSBmb3JtYXQgd2l0aCBjb21wbGV0ZWx5CisJICB1bm5hdHVyYWwgcGxhY2VtZW50IG9mIHllYXIgYmV0d2VlbiBtaW51dGVzIGFuZCBzZWNvbmRzLgorCSAgZGF0ZSAtcyAoYW5kIG90aGVyIGNvbW1hbmRzIGxpa2UgdG91Y2ggLWQpIHVzZSBtb3JlIHNlbnNpYmxlCisJICBmb3JtYXRzIChmb3Igb25lLCBJU08gZm9ybWF0IFlZWVktTU0tREQgaGg6bW06c3Muc3Nzc3NzKS4KKworCSAgV2l0aCB0aGlzIG9wdGlvbiBvZmYsICdkYXRlIERBVEUnIGlzICdkYXRlIC1zIERBVEUnIHN1cHBvcnQKKwkgIHRoZSBzYW1lIGZvcm1hdC4gV2l0aCBpdCBvbiwgJ2RhdGUgREFURScgYWRkaXRpb25hbGx5IHN1cHBvcnRzCisJICBNTUREaGhtbVtbWVldWVldWy5zc10gZm9ybWF0LgorY29uZmlnIElECisJYm9vbCAiaWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaWQgZGlzcGxheXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgZ3JvdXAgSUQgbmFtZXMuCitjb25maWcgR1JPVVBTCisJYm9vbCAiZ3JvdXBzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50IHRoZSBncm91cCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggY3VycmVudCB1c2VyIGlkLgorY29uZmlnIFRFU1QKKwlib29sICJ0ZXN0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRlc3QgaXMgdXNlZCB0byBjaGVjayBmaWxlIHR5cGVzIGFuZCBjb21wYXJlIHZhbHVlcywKKwkgIHJldHVybmluZyBhbiBhcHByb3ByaWF0ZSBleGl0IGNvZGUuIFRoZSBiYXNoIHNoZWxsCisJICBoYXMgdGVzdCBidWlsdCBpbiwgYXNoIGNhbiBidWlsZCBpdCBpbiBvcHRpb25hbGx5LgorCitjb25maWcgRkVBVFVSRV9URVNUXzY0CisJYm9vbCAiRXh0ZW5kIHRlc3QgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVTVCB8fCBBU0hfQlVJTFRJTl9URVNUIHx8IEhVU0gKKwloZWxwCisJICBFbmFibGUgNjQtYml0IHN1cHBvcnQgaW4gdGVzdC4KK2NvbmZpZyBUT1VDSAorCWJvb2wgInRvdWNoIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRvdWNoIGlzIHVzZWQgdG8gY3JlYXRlIG9yIGNoYW5nZSB0aGUgYWNjZXNzIGFuZC9vcgorCSAgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBvZiBzcGVjaWZpZWQgZmlsZXMuCitjb25maWcgVFIKKwlib29sICJ0ciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0ciBpcyB1c2VkIHRvIHNxdWVlemUsIGFuZC9vciBkZWxldGUgY2hhcmFjdGVycyBmcm9tIHN0YW5kYXJkCisJICBpbnB1dCwgd3JpdGluZyB0byBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBGRUFUVVJFX1RSX0NMQVNTRVMKKwlib29sICJFbmFibGUgY2hhcmFjdGVyIGNsYXNzZXMgKHN1Y2ggYXMgWzp1cHBlcjpdKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRSCisJaGVscAorCSAgRW5hYmxlIGNoYXJhY3RlciBjbGFzc2VzLCBlbmFibGluZyBjb21tYW5kcyBzdWNoIGFzOgorCSAgdHIgWzp1cHBlcjpdIFs6bG93ZXI6XSB0byBjb252ZXJ0IGlucHV0IGludG8gbG93ZXJjYXNlLgorCitjb25maWcgRkVBVFVSRV9UUl9FUVVJVgorCWJvb2wgIkVuYWJsZSBlcXVpdmFsZW5jZSBjbGFzc2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVFIKKwloZWxwCisJICBFbmFibGUgZXF1aXZhbGVuY2UgY2xhc3Nlcywgd2hpY2ggZXNzZW50aWFsbHkgYWRkIHRoZSBlbmNsb3NlZAorCSAgY2hhcmFjdGVyIHRvIHRoZSBjdXJyZW50IHNldC4gRm9yIGluc3RhbmNlLCB0ciBbPWE9XSB4eXogd291bGQKKwkgIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAnYScgd2l0aCAneHl6Jy4gVGhpcyBvcHRpb24gaXMgbWFpbmx5CisJICB1c2VmdWwgZm9yIGNhc2VzIHdoZW4gbm8gb3RoZXIgd2F5IG9mIGV4cHJlc3NpbmcgYSBjaGFyYWN0ZXIKKwkgIGlzIHBvc3NpYmxlLgorY29uZmlnIEJBU0U2NAorCWJvb2wgImJhc2U2NCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCYXNlNjQgZW5jb2RlIGFuZCBkZWNvZGUKK2NvbmZpZyBXSE8KKyAgICAgIGJvb2wgIndobyIKKyAgICAgIGRlZmF1bHQgeQorICAgICAgZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKyAgICAgIGhlbHAKKyAgICAgICAgd2hvIGlzIHVzZWQgdG8gc2hvdyB3aG8gaXMgbG9nZ2VkIG9uLgorY29uZmlnIFVTRVJTCisgICAgICBib29sICJ1c2VycyIKKyAgICAgIGRlZmF1bHQgeQorICAgICAgZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKyAgICAgIGhlbHAKKyAgICAgICAgUHJpbnQgdXNlcnMgY3VycmVudGx5IGxvZ2dlZCBvbi4KKworY29uZmlnIENBTAorCWJvb2wgImNhbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjYWwgaXMgdXNlZCB0byBkaXNwbGF5IGEgbW9udGhseSBjYWxlbmRlci4KKworY29uZmlnIENBVFYKKwlib29sICJjYXR2IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIERpc3BsYXkgbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzIChsaWtlIHNvbWUKKwkgIGltcGxlbWVudGF0aW9ucycgY2F0IC12IG9wdGlvbikuCisKK2NvbmZpZyBDSEdSUAorCWJvb2wgImNoZ3JwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNoZ3JwIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBncm91cCBvd25lcnNoaXAgb2YgZmlsZXMuCisKK2NvbmZpZyBDSE1PRAorCWJvb2wgImNobW9kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNobW9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBhY2Nlc3MgcGVybWlzc2lvbiBvZiBmaWxlcy4KKworY29uZmlnIENIT1dOCisJYm9vbCAiY2hvd24iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hvd24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHVzZXIgYW5kL29yIGdyb3VwIG93bmVyc2hpcAorCSAgb2YgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDSE9XTiAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgdXNlIG9mIGxvbmcgb3B0aW9ucworCitjb25maWcgQ0hST09UCisJYm9vbCAiY2hyb290IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNocm9vdCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgcm9vdCBkaXJlY3RvcnkgYW5kIHJ1biBhIGNvbW1hbmQuCisJICBUaGUgZGVmYXVsdCBjb21tYW5kIGlzIGAvYmluL3NoJy4KKworY29uZmlnIENLU1VNCisJYm9vbCAiY2tzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2tzdW0gaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGEgZmlsZS4KKworY29uZmlnIENPTU0KKwlib29sICJjb21tIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNvbW0gaXMgdXNlZCB0byBjb21wYXJlIHR3byBmaWxlcyBsaW5lIGJ5IGxpbmUgYW5kIHJldHVybgorCSAgYSB0aHJlZS1jb2x1bW4gb3V0cHV0LgorCitjb25maWcgQ1AKKwlib29sICJjcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjcCBpcyB1c2VkIHRvIGNvcHkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCitjb25maWcgRkVBVFVSRV9DUF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIGZvciBjcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENQICYmIExPTkdfT1BUUworCWhlbHAKKwkgIEVuYWJsZSBsb25nIG9wdGlvbnMgZm9yIGNwLgorCSAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgLS1wYXJlbnRzIG9wdGlvbi4KKworY29uZmlnIENVVAorCWJvb2wgImN1dCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjdXQgaXMgdXNlZCB0byBwcmludCBzZWxlY3RlZCBwYXJ0cyBvZiBsaW5lcyBmcm9tCisJICBlYWNoIGZpbGUgdG8gc3Rkb3V0LgorCitjb25maWcgREQKKwlib29sICJkZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkZCBjb3BpZXMgYSBmaWxlIChmcm9tIHN0YW5kYXJkIGlucHV0IHRvIHN0YW5kYXJkIG91dHB1dCwKKwkgIGJ5IGRlZmF1bHQpIHVzaW5nIHNwZWNpZmljIGlucHV0IGFuZCBvdXRwdXQgYmxvY2tzaXplcywKKwkgIHdoaWxlIG9wdGlvbmFsbHkgcGVyZm9ybWluZyBjb252ZXJzaW9ucyBvbiBpdC4KKworY29uZmlnIEZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HCisJYm9vbCAiRW5hYmxlIEREIHNpZ25hbCBoYW5kbGluZyBmb3Igc3RhdHVzIHJlcG9ydGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERECisJaGVscAorCSAgU2VuZGluZyBhIFNJR1VTUjEgc2lnbmFsIHRvIGEgcnVubmluZyBgZGQnIHByb2Nlc3MgbWFrZXMgaXQKKwkgIHByaW50IHRvIHN0YW5kYXJkIGVycm9yIHRoZSBudW1iZXIgb2YgcmVjb3JkcyByZWFkIGFuZCB3cml0dGVuCisJICBzbyBmYXIsIHRoZW4gdG8gcmVzdW1lIGNvcHlpbmcuCisKKwkgICQgZGQgaWY9L2Rldi96ZXJvIG9mPS9kZXYvbnVsbCYKKwkgICQgcGlkPSQhIGtpbGwgLVVTUjEgJHBpZDsgc2xlZXAgMTsga2lsbCAkcGlkCisJICAxMDg5OTIwNiswIHJlY29yZHMgaW4KKwkgIDEwODk5MjA2KzAgcmVjb3JkcyBvdXQKKworY29uZmlnIEZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwlib29sICJFbmFibGUgdGhlIHRoaXJkIHN0YXR1cyBsaW5lIHVwb24gc2lnbmFsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREQgJiYgRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkcKKwloZWxwCisJICBEaXNwbGF5cyBhIGNvcmV1dGlscy1saWtlIHRoaXJkIHN0YXR1cyBsaW5lIHdpdGggdHJhbnNmZXJyZWQgYnl0ZXMsCisJICBlbGFwc2VkIHRpbWUgYW5kIHNwZWVkLgorCitjb25maWcgRkVBVFVSRV9ERF9JQlNfT0JTCisJYm9vbCAiRW5hYmxlIGlicywgb2JzIGFuZCBjb252IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERAorCWhlbHAKKwkgIEVuYWJsZXMgc3VwcG9ydCBmb3Igd3JpdGluZyBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIGluIGFuZCBvdXQsCisJICBhdCBhIHRpbWUsIGFuZCBwZXJmb3JtaW5nIGNvbnZlcnNpb25zIG9uIHRoZSBkYXRhIHN0cmVhbS4KKworY29uZmlnIERGCisJYm9vbCAiZGYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGYgcmVwb3J0cyB0aGUgYW1vdW50IG9mIGRpc2sgc3BhY2UgdXNlZCBhbmQgYXZhaWxhYmxlCisJICBvbiBmaWxlc3lzdGVtcy4KKworY29uZmlnIEZFQVRVUkVfREZfRkFOQ1kKKwlib29sICJFbmFibGUgLWEsIC1pLCAtQiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERGCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyAtYSwgLWkgYW5kIC1CLgorCisJICAgIC1hIFNob3cgYWxsIGZpbGVzeXN0ZW1zCisJICAgIC1pIElub2RlcworCSAgICAtQiA8U0laRT4gQmxvY2tzaXplCisKK2NvbmZpZyBESVJOQU1FCisJYm9vbCAiZGlybmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkaXJuYW1lIGlzIHVzZWQgdG8gc3RyaXAgYSBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tCisJICBhIGZpbGUgbmFtZS4KKworY29uZmlnIERPUzJVTklYCisJYm9vbCAiZG9zMnVuaXgvdW5peDJkb3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZG9zMnVuaXggaXMgdXNlZCB0byBjb252ZXJ0IGEgdGV4dCBmaWxlIGZyb20gRE9TIGZvcm1hdCB0bworCSAgVU5JWCBmb3JtYXQsIGFuZCB2aWNlIHZlcnNhLgorCitjb25maWcgVU5JWDJET1MKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBET1MyVU5JWAorCWhlbHAKKwkgIHVuaXgyZG9zIGlzIHVzZWQgdG8gY29udmVydCBhIHRleHQgZmlsZSBmcm9tIFVOSVggZm9ybWF0IHRvCisJICBET1MgZm9ybWF0LCBhbmQgdmljZSB2ZXJzYS4KKworY29uZmlnIERVCisJYm9vbCAiZHUgKGRlZmF1bHQgYmxvY2tzaXplIG9mIDUxMiBieXRlcykiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZHUgaXMgdXNlZCB0byByZXBvcnQgdGhlIGFtb3VudCBvZiBkaXNrIHNwYWNlIHVzZWQKKwkgIGZvciBzcGVjaWZpZWQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisJYm9vbCAiVXNlIGEgZGVmYXVsdCBibG9ja3NpemUgb2YgMTAyNCBieXRlcyAoMUspIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRFUKKwloZWxwCisJICBVc2UgYSBibG9ja3NpemUgb2YgKDFLKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDUxMmIuCisKK2NvbmZpZyBFQ0hPCisJYm9vbCAiZWNobyAoYmFzaWMgU3VTdjMgdmVyc2lvbiB0YWtpbmcgbm8gb3B0aW9ucykiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZWNobyBpcyB1c2VkIHRvIHByaW50IGEgc3BlY2lmaWVkIHN0cmluZyB0byBzdGRvdXQuCisKKyMgdGhpcyBlbnRyeSBhbHNvIGFwcGVhcnMgaW4gc2hlbGwvQ29uZmlnLmluLCBuZXh0IHRvIHRoZSBlY2hvIGJ1aWx0aW4KK2NvbmZpZyBGRUFUVVJFX0ZBTkNZX0VDSE8KKwlib29sICJFbmFibGUgZWNobyBvcHRpb25zICgtbiBhbmQgLWUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRUNITyB8fCBBU0hfQlVJTFRJTl9FQ0hPIHx8IEhVU0gKKwloZWxwCisJICBUaGlzIGFkZHMgb3B0aW9ucyAoLW4gYW5kIC1lKSB0byBlY2hvLgorCitjb25maWcgRU5WCisJYm9vbCAiZW52IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGVudiBpcyB1c2VkIHRvIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgcnVuCisJICBhIGNvbW1hbmQ7IHdpdGhvdXQgb3B0aW9ucyBpdCBkaXNwbGF5cyB0aGUgY3VycmVudAorCSAgZW52aXJvbm1lbnQuCisKK2NvbmZpZyBGRUFUVVJFX0VOVl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRU5WICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgZW52IGFwcGxldC4KKworY29uZmlnIEVYUEFORAorCWJvb2wgImV4cGFuZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCeSBkZWZhdWx0LCBjb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlcy4KKworY29uZmlnIEZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBFWFBBTkQgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBleHBhbmQgYXBwbGV0LgorCitjb25maWcgRVhQUgorCWJvb2wgImV4cHIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZXhwciBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBudW1iZXJzIGFuZCBwcmludCB0aGUgcmVzdWx0CisJICB0byBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBFWFBSX01BVEhfU1VQUE9SVF82NAorCWJvb2wgIkV4dGVuZCBQb3NpeCBudW1iZXJzIHN1cHBvcnQgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRVhQUgorCWhlbHAKKwkgIEVuYWJsZSA2NC1iaXQgbWF0aCBzdXBwb3J0IGluIHRoZSBleHByIGFwcGxldC4gVGhpcyB3aWxsIG1ha2UKKwkgIHRoZSBhcHBsZXQgc2xpZ2h0bHkgbGFyZ2VyLCBidXQgd2lsbCBhbGxvdyBjb21wdXRhdGlvbiB3aXRoIHZlcnkKKwkgIGxhcmdlIG51bWJlcnMuCisKK2NvbmZpZyBGQUxTRQorCWJvb2wgImZhbHNlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZhbHNlIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIEZBTFNFICgxKS4KKworY29uZmlnIEZPTEQKKwlib29sICJmb2xkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdyYXAgdGV4dCB0byBmaXQgYSBzcGVjaWZpYyB3aWR0aC4KKworY29uZmlnIEZTWU5DCisJYm9vbCAiZnN5bmMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZnN5bmMgaXMgdXNlZCB0byBmbHVzaCBmaWxlLXJlbGF0ZWQgY2FjaGVkIGJsb2NrcyB0byBkaXNrLgorCitjb25maWcgSEVBRAorCWJvb2wgImhlYWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaGVhZCBpcyB1c2VkIHRvIHByaW50IHRoZSBmaXJzdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGxpbmVzCisJICBmcm9tIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9GQU5DWV9IRUFECisJYm9vbCAiRW5hYmxlIGhlYWQgb3B0aW9ucyAoLWMsIC1xLCBhbmQgLXYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSEVBRAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgaGVhZCBvcHRpb25zICgtYywgLXEsIGFuZCAtdikuCisKK2NvbmZpZyBIT1NUSUQKKwlib29sICJob3N0aWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaG9zdGlkIHByaW50cyB0aGUgbnVtZXJpYyBpZGVudGlmaWVyIChpbiBoZXhhZGVjaW1hbCkgZm9yCisJICB0aGUgY3VycmVudCBob3N0LgorCitjb25maWcgSU5TVEFMTAorCWJvb2wgImluc3RhbGwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29weSBmaWxlcyBhbmQgc2V0IGF0dHJpYnV0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElOU1RBTEwgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBpbnN0YWxsIGFwcGxldC4KKworIyMjI2NvbmZpZyBMRU5HVEgKKyMjIyMJYm9vbCAibGVuZ3RoIgorIyMjIwlkZWZhdWx0IHkKKyMjIyMJaGVscAorIyMjIwkgIGxlbmd0aCBpcyB1c2VkIHRvIHByaW50IG91dCB0aGUgbGVuZ3RoIG9mIGEgc3BlY2lmaWVkIHN0cmluZy4KKworY29uZmlnIExOCisJYm9vbCAibG4iCisJZGVmYXVsdCB5CisJaGVscAorCSAgbG4gaXMgdXNlZCB0byBjcmVhdGUgaGFyZCBvciBzb2Z0IGxpbmtzIGJldHdlZW4gZmlsZXMuCisKK2NvbmZpZyBMT0dOQU1FCisJYm9vbCAibG9nbmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBsb2duYW1lIGlzIHVzZWQgdG8gcHJpbnQgdGhlIGN1cnJlbnQgdXNlcidzIGxvZ2luIG5hbWUuCisKK2NvbmZpZyBMUworCWJvb2wgImxzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxzIGlzIHVzZWQgdG8gbGlzdCB0aGUgY29udGVudHMgb2YgZGlyZWN0b3JpZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xTX0ZJTEVUWVBFUworCWJvb2wgIkVuYWJsZSBmaWxldHlwaW5nIG9wdGlvbnMgKC1wIGFuZCAtRikiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEVuYWJsZSB0aGUgbHMgb3B0aW9ucyAoLXAgYW5kIC1GKS4KKworY29uZmlnIEZFQVRVUkVfTFNfRk9MTE9XTElOS1MKKwlib29sICJFbmFibGUgc3ltbGlua3MgZGVyZWZlcmVuY2luZyAoLUwpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBFbmFibGUgdGhlIGxzIG9wdGlvbiAoLUwpLgorCitjb25maWcgRkVBVFVSRV9MU19SRUNVUlNJVkUKKwlib29sICJFbmFibGUgcmVjdXJzaW9uICgtUikiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEVuYWJsZSB0aGUgbHMgb3B0aW9uICgtUikuCisKK2NvbmZpZyBGRUFUVVJFX0xTX1NPUlRGSUxFUworCWJvb2wgIlNvcnQgdGhlIGZpbGUgbmFtZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEFsbG93IGxzIHRvIHNvcnQgZmlsZSBuYW1lcyBhbHBoYWJldGljYWxseS4KKworY29uZmlnIEZFQVRVUkVfTFNfVElNRVNUQU1QUworCWJvb2wgIlNob3cgZmlsZSB0aW1lc3RhbXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBBbGxvdyBscyB0byBkaXNwbGF5IHRpbWVzdGFtcHMgZm9yIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9MU19VU0VSTkFNRQorCWJvb2wgIlNob3cgdXNlcm5hbWUvZ3JvdXBuYW1lcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgQWxsb3cgbHMgdG8gZGlzcGxheSB1c2VybmFtZS9ncm91cG5hbWUgZm9yIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9MU19DT0xPUgorCWJvb2wgIkFsbG93IHVzZSBvZiBjb2xvciB0byBpZGVudGlmeSBmaWxlIHR5cGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMgJiYgTE9OR19PUFRTCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSAtLWNvbG9yIG9wdGlvbiB0byBscy4KKworY29uZmlnIEZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVAorCWJvb2wgIlByb2R1Y2UgY29sb3JlZCBscyBvdXRwdXQgYnkgZGVmYXVsdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfTFNfQ09MT1IKKwloZWxwCisJICBTYXlpbmcgeWVzIGhlcmUgd2lsbCB0dXJuIGNvbG9yaW5nIG9uIGJ5IGRlZmF1bHQsCisJICBldmVuIGlmIG5vICItLWNvbG9yIiBvcHRpb24gaXMgZ2l2ZW4gdG8gdGhlIGxzIGNvbW1hbmQuCisJICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCwgc2luY2UgdGhlIGNvbG9ycyBhcmUgbm90CisJICBjb25maWd1cmFibGUsIGFuZCB0aGUgb3V0cHV0IG1heSBub3QgYmUgbGVnaWJsZSBvbgorCSAgbWFueSBvdXRwdXQgc2NyZWVucy4KKworY29uZmlnIE1ENVNVTQorCWJvb2wgIm1kNXN1bSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtZDVzdW0gaXMgdXNlZCB0byBwcmludCBvciBjaGVjayBNRDUgY2hlY2tzdW1zLgorCitjb25maWcgTUtESVIKKwlib29sICJta2RpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta2RpciBpcyB1c2VkIHRvIGNyZWF0ZSBkaXJlY3RvcmllcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXMuCisKK2NvbmZpZyBGRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNS0RJUiAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIG1rZGlyIGFwcGxldC4KKworY29uZmlnIE1LRklGTworCWJvb2wgIm1rZmlmbyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta2ZpZm8gaXMgdXNlZCB0byBjcmVhdGUgRklGT3MgKG5hbWVkIHBpcGVzKS4KKwkgIFRoZSBgbWtub2QnIHByb2dyYW0gY2FuIGFsc28gY3JlYXRlIEZJRk9zLgorCitjb25maWcgTUtOT0QKKwlib29sICJta25vZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta25vZCBpcyB1c2VkIHRvIGNyZWF0ZSBGSUZPcyBvciBibG9jay9jaGFyYWN0ZXIgc3BlY2lhbAorCSAgZmlsZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzLgorCitjb25maWcgTVYKKwlib29sICJtdiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtdiBpcyB1c2VkIHRvIG1vdmUgb3IgcmVuYW1lIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgorCitjb25maWcgRkVBVFVSRV9NVl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTVYgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBtdiBhcHBsZXQuCisKK2NvbmZpZyBOSUNFCisJYm9vbCAibmljZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBuaWNlIHJ1bnMgYSBwcm9ncmFtIHdpdGggbW9kaWZpZWQgc2NoZWR1bGluZyBwcmlvcml0eS4KKworY29uZmlnIE5PSFVQCisJYm9vbCAibm9odXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcnVuIGEgY29tbWFuZCBpbW11bmUgdG8gaGFuZ3Vwcywgd2l0aCBvdXRwdXQgdG8gYSBub24tdHR5LgorCitjb25maWcgT0QKKwlib29sICJvZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBvZCBpcyB1c2VkIHRvIGR1bXAgYmluYXJ5IGZpbGVzIGluIG9jdGFsIGFuZCBvdGhlciBmb3JtYXRzLgorCitjb25maWcgUFJJTlRFTlYKKwlib29sICJwcmludGVudiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBwcmludGVudiBpcyB1c2VkIHRvIHByaW50IGFsbCBvciBwYXJ0IG9mIGVudmlyb25tZW50LgorCitjb25maWcgUFJJTlRGCisJYm9vbCAicHJpbnRmIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHByaW50ZiBpcyB1c2VkIHRvIGZvcm1hdCBhbmQgcHJpbnQgc3BlY2lmaWVkIHN0cmluZ3MuCisJICBJdCdzIHNpbWlsYXIgdG8gYGVjaG8nIGV4Y2VwdCBpdCBoYXMgbW9yZSBvcHRpb25zLgorCitjb25maWcgUFdECisJYm9vbCAicHdkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHB3ZCBpcyB1c2VkIHRvIHByaW50IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworY29uZmlnIFJFQURMSU5LCisJYm9vbCAicmVhZGxpbmsiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlYWRzIGEgc3ltYm9saWMgbGluayBhbmQgcmV0dXJucyB0aGUgbmFtZQorCSAgb2YgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCisKK2NvbmZpZyBGRUFUVVJFX1JFQURMSU5LX0ZPTExPVworCWJvb2wgIkVuYWJsZSBjYW5vbmljYWxpemF0aW9uIGJ5IGZvbGxvd2luZyBhbGwgc3ltbGlua3MgKC1mKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJFQURMSU5LCisJaGVscAorCSAgRW5hYmxlIHRoZSByZWFkbGluayBvcHRpb24gKC1mKS4KKworY29uZmlnIFJFQUxQQVRICisJYm9vbCAicmVhbHBhdGgiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmV0dXJuIHRoZSBjYW5vbmljYWxpemVkIGFic29sdXRlIHBhdGhuYW1lLgorCSAgVGhpcyBpc24ndCBwcm92aWRlZCBieSBHTlUgc2hlbGx1dGlscywgYnV0IHdoZXJlIGVsc2UgZG9lcyBpdCBiZWxvbmcuCisKK2NvbmZpZyBSTQorCWJvb2wgInJtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJtIGlzIHVzZWQgdG8gcmVtb3ZlIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgorCitjb25maWcgUk1ESVIKKwlib29sICJybWRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBybWRpciBpcyB1c2VkIHRvIHJlbW92ZSBlbXB0eSBkaXJlY3Rvcmllcy4KKworY29uZmlnIEZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJNRElSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgcm1kaXIgYXBwbGV0LCBpbmNsdWRpbmcKKwkgIC0taWdub3JlLWZhaWwtb24tbm9uLWVtcHR5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggR05VIHJtZGlyLgorCitjb25maWcgU0VRCisJYm9vbCAic2VxIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHByaW50IGEgc2VxdWVuY2Ugb2YgbnVtYmVycworCitjb25maWcgU0hBMVNVTQorCWJvb2wgInNoYTFzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29tcHV0ZSBhbmQgY2hlY2sgU0hBMSBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0hBMjU2U1VNCisJYm9vbCAic2hhMjU2c3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbXB1dGUgYW5kIGNoZWNrIFNIQTI1NiBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0hBNTEyU1VNCisJYm9vbCAic2hhNTEyc3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbXB1dGUgYW5kIGNoZWNrIFNIQTUxMiBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0xFRVAKKwlib29sICJzbGVlcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzbGVlcCBpcyB1c2VkIHRvIHBhdXNlIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcy4KKwkgIEl0IGNvbWVzIGluIDMgdmVyc2lvbnM6CisJICAtIHNtYWxsOiB0YWtlcyBvbmUgaW50ZWdlciBwYXJhbWV0ZXIKKwkgIC0gZmFuY3k6IHRha2VzIG11bHRpcGxlIGludGVnZXIgYXJndW1lbnRzIHdpdGggc3VmZml4ZXM6CisJICAgIHNsZWVwIDFkIDJoIDNtIDE1cworCSAgLSBmYW5jeSB3aXRoIGZyYWN0aW9uYWwgbnVtYmVyczoKKwkgICAgc2xlZXAgMi4zcyA0LjVoIHNsZWVwcyBmb3IgMTYyMDIuMyBzZWNvbmRzCisJICBMYXN0IG9uZSBpcyAidGhlIG1vc3QgY29tcGF0aWJsZSIgd2l0aCBjb3JldXRpbHMgc2xlZXAsCisJICBidXQgaXQgYWRkcyBhcm91bmQgMWsgb2YgY29kZS4KKworY29uZmlnIEZFQVRVUkVfRkFOQ1lfU0xFRVAKKwlib29sICJFbmFibGUgbXVsdGlwbGUgYXJndW1lbnRzIGFuZCBzL20vaC9kIHN1ZmZpeGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0xFRVAKKwloZWxwCisJICBBbGxvdyBzbGVlcCB0byBwYXVzZSBmb3Igc3BlY2lmaWVkIG1pbnV0ZXMsIGhvdXJzLCBhbmQgZGF5cy4KKworY29uZmlnIEZFQVRVUkVfRkxPQVRfU0xFRVAKKwlib29sICJFbmFibGUgZnJhY3Rpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0ZBTkNZX1NMRUVQCisJaGVscAorCSAgQWxsb3cgZm9yIGZyYWN0aW9uYWwgbnVtZXJpYyBwYXJhbWV0ZXJzLgorCitjb25maWcgU09SVAorCWJvb2wgInNvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc29ydCBpcyB1c2VkIHRvIHNvcnQgbGluZXMgb2YgdGV4dCBpbiBzcGVjaWZpZWQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX1NPUlRfQklHCisJYm9vbCAiRnVsbCBTdVN2MyBjb21wbGlhbnQgc29ydCAoc3VwcG9ydCAta3Rjc2JkZmlvemdNKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNPUlQKKwloZWxwCisJICBXaXRob3V0IHRoaXMsIHNvcnQgb25seSBzdXBwb3J0cyAtciwgLXUsIGFuZCBhbiBpbnRlZ2VyIHZlcnNpb24KKwkgIG9mIC1uLiBTZWxlY3RpbmcgdGhpcyBhZGRzIHNvcnQga2V5cywgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCwgYW5kCisJICBtb3JlLiBUaGlzIGFkZHMgYSBsaXR0bGUgb3ZlciAzayB0byBhIG5vbnN0YXRpYyBidWlsZCBvbiB4ODYuCisKKwkgIFRoZSBTdVN2MyBzb3J0IHN0YW5kYXJkIGlzIGF2YWlsYWJsZSBhdDoKKwkgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvc29ydC5odG1sCisKK2NvbmZpZyBTUExJVAorCWJvb2wgInNwbGl0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNwbGl0IGEgZmlsZSBpbnRvIHBpZWNlcy4KKworY29uZmlnIEZFQVRVUkVfU1BMSVRfRkFOQ1kKKwlib29sICJGYW5jeSBleHRlbnNpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1BMSVQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgZmVhdHVyZXMgbm90IHJlcXVpcmVkIGJ5IFNVU3YzLgorCSAgU3VwcG9ydHMgYWRkaXRpb25hbCBzdWZmaXhlcyAnYicgZm9yIDUxMiBieXRlcywKKwkgICdnJyBmb3IgMUdpQiBmb3IgdGhlIC1iIG9wdGlvbi4KKworY29uZmlnIFNUQVQKKwlib29sICJzdGF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWCAjIHN0YXRmcygpCisJaGVscAorCSAgZGlzcGxheSBmaWxlIG9yIGZpbGVzeXN0ZW0gc3RhdHVzLgorCitjb25maWcgRkVBVFVSRV9TVEFUX0ZPUk1BVAorCWJvb2wgIkVuYWJsZSBjdXN0b20gZm9ybWF0cyAoLWMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1RBVAorCWhlbHAKKwkgIFdpdGhvdXQgdGhpcywgc3RhdCB3aWxsIG5vdCBzdXBwb3J0IHRoZSAnLWMgZm9ybWF0JyBvcHRpb24gd2hlcmUKKwkgIHVzZXJzIGNhbiBwYXNzIGEgY3VzdG9tIGZvcm1hdCBzdHJpbmcgZm9yIG91dHB1dC4gVGhpcyBhZGRzIGFib3V0CisJICA3ayB0byBhIG5vbnN0YXRpYyBidWlsZCBvbiBhbWQ2NC4KKworY29uZmlnIFNUVFkKKwlib29sICJzdHR5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0dHkgaXMgdXNlZCB0byBjaGFuZ2UgYW5kIHByaW50IHRlcm1pbmFsIGxpbmUgc2V0dGluZ3MuCisKK2NvbmZpZyBTVU0KKwlib29sICJzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hlY2tzdW0gYW5kIGNvdW50IHRoZSBibG9ja3MgaW4gYSBmaWxlCisKK2NvbmZpZyBTWU5DCisJYm9vbCAic3luYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzeW5jIGlzIHVzZWQgdG8gZmx1c2ggZmlsZXN5c3RlbSBidWZmZXJzLgorCitjb25maWcgVEFDCisJYm9vbCAidGFjIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRhYyBpcyB1c2VkIHRvIGNvbmNhdGVuYXRlIGFuZCBwcmludCBmaWxlcyBpbiByZXZlcnNlLgorCitjb25maWcgVEFJTAorCWJvb2wgInRhaWwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdGFpbCBpcyB1c2VkIHRvIHByaW50IHRoZSBsYXN0IHNwZWNpZmllZCBudW1iZXIgb2YgbGluZXMKKwkgIGZyb20gZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0ZBTkNZX1RBSUwKKwlib29sICJFbmFibGUgZXh0cmEgdGFpbCBvcHRpb25zICgtcSwgLXMsIC12LCBhbmQgLUYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFJTAorCWhlbHAKKwkgIFRoZSBvcHRpb25zICgtcSwgLXMsIGFuZCAtdikgYXJlIHByb3ZpZGVkIGJ5IEdOVSB0YWlsLCBidXQKKwkgIGFyZSBub3Qgc3BlY2lmaWMgaW4gdGhlIFNVU3YzIHN0YW5kYXJkLgorCisJICAgIC1xICAgICAgTmV2ZXIgb3V0cHV0IGhlYWRlcnMgZ2l2aW5nIGZpbGUgbmFtZXMKKwkgICAgLXMgU0VDICBXYWl0IFNFQyBzZWNvbmRzIGJldHdlZW4gcmVhZHMgd2l0aCAtZgorCSAgICAtdiAgICAgIEFsd2F5cyBvdXRwdXQgaGVhZGVycyBnaXZpbmcgZmlsZSBuYW1lcworCitjb25maWcgVEVFCisJYm9vbCAidGVlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRlZSBpcyB1c2VkIHRvIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGUKKwkgIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU8KKwlib29sICJFbmFibGUgYmxvY2sgSS9PIChsYXJnZXIvZmFzdGVyKSBpbnN0ZWFkIG9mIGJ5dGUgSS9PIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVFCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGZvciBhIGZhc3RlciB0ZWUsIGF0IGV4cGVuc2Ugb2Ygc2l6ZS4KKworY29uZmlnIFRSVUUKKwlib29sICJ0cnVlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRydWUgcmV0dXJucyBhbiBleGl0IGNvZGUgb2YgVFJVRSAoMCkuCisKK2NvbmZpZyBUVFkKKwlib29sICJ0dHkiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdHR5IGlzIHVzZWQgdG8gcHJpbnQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGVybWluYWwgdG8KKwkgIHN0YW5kYXJkIG91dHB1dC4KKworY29uZmlnIFVOQU1FCisJYm9vbCAidW5hbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW5hbWUgaXMgdXNlZCB0byBwcmludCBzeXN0ZW0gaW5mb3JtYXRpb24uCisKK2NvbmZpZyBVTkVYUEFORAorCWJvb2wgInVuZXhwYW5kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ5IGRlZmF1bHQsIGNvbnZlcnQgb25seSBsZWFkaW5nIHNlcXVlbmNlcyBvZiBibGFua3MgdG8gdGFicy4KKworY29uZmlnIEZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVORVhQQU5EICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgdW5leHBhbmQgYXBwbGV0LgorCitjb25maWcgVU5JUQorCWJvb2wgInVuaXEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW5pcSBpcyB1c2VkIHRvIHJlbW92ZSBkdXBsaWNhdGUgbGluZXMgZnJvbSBhIHNvcnRlZCBmaWxlLgorCitjb25maWcgVVNMRUVQCisJYm9vbCAidXNsZWVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVzbGVlcCBpcyB1c2VkIHRvIHBhdXNlIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzLgorCitjb25maWcgVVVERUNPREUKKwlib29sICJ1dWRlY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1dWRlY29kZSBpcyB1c2VkIHRvIGRlY29kZSBhIHV1ZW5jb2RlZCBmaWxlLgorCitjb25maWcgVVVFTkNPREUKKwlib29sICJ1dWVuY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1dWVuY29kZSBpcyB1c2VkIHRvIHV1ZW5jb2RlIGEgZmlsZS4KKworY29uZmlnIFdDCisJYm9vbCAid2MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgd2MgaXMgdXNlZCB0byBwcmludCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCB3b3JkcywgYW5kIGxpbmVzLAorCSAgaW4gc3BlY2lmaWVkIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9XQ19MQVJHRQorCWJvb2wgIlN1cHBvcnQgdmVyeSBsYXJnZSBmaWxlcyBpbiB3YyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdDCisJaGVscAorCSAgVXNlICJ1bnNpZ25lZCBsb25nIGxvbmciIGluIHdjIGZvciBjb3VudGVyIHZhcmlhYmxlcy4KKworY29uZmlnIFdIT0FNSQorCWJvb2wgIndob2FtaSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3aG9hbWkgaXMgdXNlZCB0byBwcmludCB0aGUgdXNlcm5hbWUgb2YgdGhlIGN1cnJlbnQKKwkgIHVzZXIgaWQgKHNhbWUgYXMgaWQgLXVuKS4KKworY29uZmlnIFlFUworCWJvb2wgInllcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB5ZXMgaXMgdXNlZCB0byByZXBlYXRlZGx5IG91dHB1dCBhIHNwZWNpZmljIHN0cmluZywgb3IKKwkgIHRoZSBkZWZhdWx0IHN0cmluZyBgeScuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYiCisJZGVwZW5kcyBvbiBDUCB8fCBNVgorCitjb25maWcgRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1MKKwlib29sICJQcmVzZXJ2ZSBoYXJkIGxpbmtzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ1AgfHwgTVYKKwloZWxwCisJICBBbGxvdyBjcCBhbmQgbXYgdG8gcHJlc2VydmUgaGFyZCBsaW5rcy4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQiCisJZGVwZW5kcyBvbiBMUyB8fCBNT1JFIHx8IFRFTE5FVAorCitjb25maWcgRkVBVFVSRV9BVVRPV0lEVEgKKwlib29sICJDYWxjdWxhdGUgdGVybWluYWwgJiBjb2x1bW4gd2lkdGhzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMgfHwgTU9SRSB8fCBURUxORVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgdXRpbGl0aWVzIHN1Y2ggYXMgJ2xzJywgJ21vcmUnIGFuZCAndGVsbmV0JworCSAgdG8gZGV0ZXJtaW5lIHRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuLCB3aGljaCBjYW4gYWxsb3cgdGhlbSB0bworCSAgZGlzcGxheSBhZGRpdGlvbmFsIHRleHQgb3IgYXZvaWQgd3JhcHBpbmcgdGV4dCBvbnRvIHRoZSBuZXh0IGxpbmUuCisJICBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgeW91ciB1dGlsaXRpZXMgd2lsbCBiZSBlc3BlY2lhbGx5CisJICBwcmltaXRpdmUgYW5kIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gd2lkdGguCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzIgorCWRlcGVuZHMgb24gREYgfHwgRFUgfHwgTFMKKworY29uZmlnIEZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwlib29sICJTdXBwb3J0IGZvciBodW1hbiByZWFkYWJsZSBvdXRwdXQgKGV4YW1wbGUgMTNrLCAyM00sIDIzNUcpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREYgfHwgRFUgfHwgTFMKKwloZWxwCisJICBBbGxvdyBkZiwgZHUsIGFuZCBscyB0byBoYXZlIGh1bWFuIHJlYWRhYmxlIG91dHB1dC4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0iCisJZGVwZW5kcyBvbiBNRDVTVU0gfHwgU0hBMVNVTSB8fCBTSEEyNTZTVU0gfHwgU0hBNTEyU1VNCisKK2NvbmZpZyBGRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSworCWJvb2wgIkVuYWJsZSAtYywgLXMgYW5kIC13IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNRDVTVU0gfHwgU0hBMVNVTSB8fCBTSEEyNTZTVU0gfHwgU0hBNTEyU1VNCisJaGVscAorCSAgRW5hYmxpbmcgdGhlIC1jIG9wdGlvbnMgYWxsb3dzIGZpbGVzIHRvIGJlIGNoZWNrZWQKKwkgIGFnYWluc3QgcHJlLWNhbGN1bGF0ZWQgaGFzaCB2YWx1ZXMuCisKKwkgIC1zIGFuZCAtdyBhcmUgdXNlZnVsIG9wdGlvbnMgd2hlbiB2ZXJpZnlpbmcgY2hlY2tzdW1zLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvQ29uZmlnLnNyYyBiL2NvcmV1dGlscy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTY1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDc4OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiQ29yZXV0aWxzIgorCitJTlNFUlQKKworY29uZmlnIENBTAorCWJvb2wgImNhbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjYWwgaXMgdXNlZCB0byBkaXNwbGF5IGEgbW9udGhseSBjYWxlbmRlci4KKworY29uZmlnIENBVFYKKwlib29sICJjYXR2IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIERpc3BsYXkgbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzIChsaWtlIHNvbWUKKwkgIGltcGxlbWVudGF0aW9ucycgY2F0IC12IG9wdGlvbikuCisKK2NvbmZpZyBDSEdSUAorCWJvb2wgImNoZ3JwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNoZ3JwIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBncm91cCBvd25lcnNoaXAgb2YgZmlsZXMuCisKK2NvbmZpZyBDSE1PRAorCWJvb2wgImNobW9kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNobW9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBhY2Nlc3MgcGVybWlzc2lvbiBvZiBmaWxlcy4KKworY29uZmlnIENIT1dOCisJYm9vbCAiY2hvd24iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hvd24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHVzZXIgYW5kL29yIGdyb3VwIG93bmVyc2hpcAorCSAgb2YgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDSE9XTiAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgdXNlIG9mIGxvbmcgb3B0aW9ucworCitjb25maWcgQ0hST09UCisJYm9vbCAiY2hyb290IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNocm9vdCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgcm9vdCBkaXJlY3RvcnkgYW5kIHJ1biBhIGNvbW1hbmQuCisJICBUaGUgZGVmYXVsdCBjb21tYW5kIGlzIGAvYmluL3NoJy4KKworY29uZmlnIENLU1VNCisJYm9vbCAiY2tzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2tzdW0gaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGEgZmlsZS4KKworY29uZmlnIENPTU0KKwlib29sICJjb21tIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNvbW0gaXMgdXNlZCB0byBjb21wYXJlIHR3byBmaWxlcyBsaW5lIGJ5IGxpbmUgYW5kIHJldHVybgorCSAgYSB0aHJlZS1jb2x1bW4gb3V0cHV0LgorCitjb25maWcgQ1AKKwlib29sICJjcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjcCBpcyB1c2VkIHRvIGNvcHkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCitjb25maWcgRkVBVFVSRV9DUF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIGZvciBjcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENQICYmIExPTkdfT1BUUworCWhlbHAKKwkgIEVuYWJsZSBsb25nIG9wdGlvbnMgZm9yIGNwLgorCSAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgLS1wYXJlbnRzIG9wdGlvbi4KKworY29uZmlnIENVVAorCWJvb2wgImN1dCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjdXQgaXMgdXNlZCB0byBwcmludCBzZWxlY3RlZCBwYXJ0cyBvZiBsaW5lcyBmcm9tCisJICBlYWNoIGZpbGUgdG8gc3Rkb3V0LgorCitjb25maWcgREQKKwlib29sICJkZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkZCBjb3BpZXMgYSBmaWxlIChmcm9tIHN0YW5kYXJkIGlucHV0IHRvIHN0YW5kYXJkIG91dHB1dCwKKwkgIGJ5IGRlZmF1bHQpIHVzaW5nIHNwZWNpZmljIGlucHV0IGFuZCBvdXRwdXQgYmxvY2tzaXplcywKKwkgIHdoaWxlIG9wdGlvbmFsbHkgcGVyZm9ybWluZyBjb252ZXJzaW9ucyBvbiBpdC4KKworY29uZmlnIEZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HCisJYm9vbCAiRW5hYmxlIEREIHNpZ25hbCBoYW5kbGluZyBmb3Igc3RhdHVzIHJlcG9ydGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERECisJaGVscAorCSAgU2VuZGluZyBhIFNJR1VTUjEgc2lnbmFsIHRvIGEgcnVubmluZyBgZGQnIHByb2Nlc3MgbWFrZXMgaXQKKwkgIHByaW50IHRvIHN0YW5kYXJkIGVycm9yIHRoZSBudW1iZXIgb2YgcmVjb3JkcyByZWFkIGFuZCB3cml0dGVuCisJICBzbyBmYXIsIHRoZW4gdG8gcmVzdW1lIGNvcHlpbmcuCisKKwkgICQgZGQgaWY9L2Rldi96ZXJvIG9mPS9kZXYvbnVsbCYKKwkgICQgcGlkPSQhIGtpbGwgLVVTUjEgJHBpZDsgc2xlZXAgMTsga2lsbCAkcGlkCisJICAxMDg5OTIwNiswIHJlY29yZHMgaW4KKwkgIDEwODk5MjA2KzAgcmVjb3JkcyBvdXQKKworY29uZmlnIEZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwlib29sICJFbmFibGUgdGhlIHRoaXJkIHN0YXR1cyBsaW5lIHVwb24gc2lnbmFsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREQgJiYgRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkcKKwloZWxwCisJICBEaXNwbGF5cyBhIGNvcmV1dGlscy1saWtlIHRoaXJkIHN0YXR1cyBsaW5lIHdpdGggdHJhbnNmZXJyZWQgYnl0ZXMsCisJICBlbGFwc2VkIHRpbWUgYW5kIHNwZWVkLgorCitjb25maWcgRkVBVFVSRV9ERF9JQlNfT0JTCisJYm9vbCAiRW5hYmxlIGlicywgb2JzIGFuZCBjb252IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERAorCWhlbHAKKwkgIEVuYWJsZXMgc3VwcG9ydCBmb3Igd3JpdGluZyBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIGluIGFuZCBvdXQsCisJICBhdCBhIHRpbWUsIGFuZCBwZXJmb3JtaW5nIGNvbnZlcnNpb25zIG9uIHRoZSBkYXRhIHN0cmVhbS4KKworY29uZmlnIERGCisJYm9vbCAiZGYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGYgcmVwb3J0cyB0aGUgYW1vdW50IG9mIGRpc2sgc3BhY2UgdXNlZCBhbmQgYXZhaWxhYmxlCisJICBvbiBmaWxlc3lzdGVtcy4KKworY29uZmlnIEZFQVRVUkVfREZfRkFOQ1kKKwlib29sICJFbmFibGUgLWEsIC1pLCAtQiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERGCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyAtYSwgLWkgYW5kIC1CLgorCisJICAgIC1hIFNob3cgYWxsIGZpbGVzeXN0ZW1zCisJICAgIC1pIElub2RlcworCSAgICAtQiA8U0laRT4gQmxvY2tzaXplCisKK2NvbmZpZyBESVJOQU1FCisJYm9vbCAiZGlybmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkaXJuYW1lIGlzIHVzZWQgdG8gc3RyaXAgYSBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tCisJICBhIGZpbGUgbmFtZS4KKworY29uZmlnIERPUzJVTklYCisJYm9vbCAiZG9zMnVuaXgvdW5peDJkb3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZG9zMnVuaXggaXMgdXNlZCB0byBjb252ZXJ0IGEgdGV4dCBmaWxlIGZyb20gRE9TIGZvcm1hdCB0bworCSAgVU5JWCBmb3JtYXQsIGFuZCB2aWNlIHZlcnNhLgorCitjb25maWcgVU5JWDJET1MKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBET1MyVU5JWAorCWhlbHAKKwkgIHVuaXgyZG9zIGlzIHVzZWQgdG8gY29udmVydCBhIHRleHQgZmlsZSBmcm9tIFVOSVggZm9ybWF0IHRvCisJICBET1MgZm9ybWF0LCBhbmQgdmljZSB2ZXJzYS4KKworY29uZmlnIERVCisJYm9vbCAiZHUgKGRlZmF1bHQgYmxvY2tzaXplIG9mIDUxMiBieXRlcykiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZHUgaXMgdXNlZCB0byByZXBvcnQgdGhlIGFtb3VudCBvZiBkaXNrIHNwYWNlIHVzZWQKKwkgIGZvciBzcGVjaWZpZWQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisJYm9vbCAiVXNlIGEgZGVmYXVsdCBibG9ja3NpemUgb2YgMTAyNCBieXRlcyAoMUspIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRFUKKwloZWxwCisJICBVc2UgYSBibG9ja3NpemUgb2YgKDFLKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDUxMmIuCisKK2NvbmZpZyBFQ0hPCisJYm9vbCAiZWNobyAoYmFzaWMgU3VTdjMgdmVyc2lvbiB0YWtpbmcgbm8gb3B0aW9ucykiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZWNobyBpcyB1c2VkIHRvIHByaW50IGEgc3BlY2lmaWVkIHN0cmluZyB0byBzdGRvdXQuCisKKyMgdGhpcyBlbnRyeSBhbHNvIGFwcGVhcnMgaW4gc2hlbGwvQ29uZmlnLmluLCBuZXh0IHRvIHRoZSBlY2hvIGJ1aWx0aW4KK2NvbmZpZyBGRUFUVVJFX0ZBTkNZX0VDSE8KKwlib29sICJFbmFibGUgZWNobyBvcHRpb25zICgtbiBhbmQgLWUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRUNITyB8fCBBU0hfQlVJTFRJTl9FQ0hPIHx8IEhVU0gKKwloZWxwCisJICBUaGlzIGFkZHMgb3B0aW9ucyAoLW4gYW5kIC1lKSB0byBlY2hvLgorCitjb25maWcgRU5WCisJYm9vbCAiZW52IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGVudiBpcyB1c2VkIHRvIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgcnVuCisJICBhIGNvbW1hbmQ7IHdpdGhvdXQgb3B0aW9ucyBpdCBkaXNwbGF5cyB0aGUgY3VycmVudAorCSAgZW52aXJvbm1lbnQuCisKK2NvbmZpZyBGRUFUVVJFX0VOVl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRU5WICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgZW52IGFwcGxldC4KKworY29uZmlnIEVYUEFORAorCWJvb2wgImV4cGFuZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCeSBkZWZhdWx0LCBjb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlcy4KKworY29uZmlnIEZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBFWFBBTkQgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBleHBhbmQgYXBwbGV0LgorCitjb25maWcgRVhQUgorCWJvb2wgImV4cHIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZXhwciBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBudW1iZXJzIGFuZCBwcmludCB0aGUgcmVzdWx0CisJICB0byBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBFWFBSX01BVEhfU1VQUE9SVF82NAorCWJvb2wgIkV4dGVuZCBQb3NpeCBudW1iZXJzIHN1cHBvcnQgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRVhQUgorCWhlbHAKKwkgIEVuYWJsZSA2NC1iaXQgbWF0aCBzdXBwb3J0IGluIHRoZSBleHByIGFwcGxldC4gVGhpcyB3aWxsIG1ha2UKKwkgIHRoZSBhcHBsZXQgc2xpZ2h0bHkgbGFyZ2VyLCBidXQgd2lsbCBhbGxvdyBjb21wdXRhdGlvbiB3aXRoIHZlcnkKKwkgIGxhcmdlIG51bWJlcnMuCisKK2NvbmZpZyBGQUxTRQorCWJvb2wgImZhbHNlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZhbHNlIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIEZBTFNFICgxKS4KKworY29uZmlnIEZPTEQKKwlib29sICJmb2xkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdyYXAgdGV4dCB0byBmaXQgYSBzcGVjaWZpYyB3aWR0aC4KKworY29uZmlnIEZTWU5DCisJYm9vbCAiZnN5bmMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZnN5bmMgaXMgdXNlZCB0byBmbHVzaCBmaWxlLXJlbGF0ZWQgY2FjaGVkIGJsb2NrcyB0byBkaXNrLgorCitjb25maWcgSEVBRAorCWJvb2wgImhlYWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaGVhZCBpcyB1c2VkIHRvIHByaW50IHRoZSBmaXJzdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGxpbmVzCisJICBmcm9tIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9GQU5DWV9IRUFECisJYm9vbCAiRW5hYmxlIGhlYWQgb3B0aW9ucyAoLWMsIC1xLCBhbmQgLXYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSEVBRAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgaGVhZCBvcHRpb25zICgtYywgLXEsIGFuZCAtdikuCisKK2NvbmZpZyBIT1NUSUQKKwlib29sICJob3N0aWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaG9zdGlkIHByaW50cyB0aGUgbnVtZXJpYyBpZGVudGlmaWVyIChpbiBoZXhhZGVjaW1hbCkgZm9yCisJICB0aGUgY3VycmVudCBob3N0LgorCitjb25maWcgSU5TVEFMTAorCWJvb2wgImluc3RhbGwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29weSBmaWxlcyBhbmQgc2V0IGF0dHJpYnV0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElOU1RBTEwgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBpbnN0YWxsIGFwcGxldC4KKworIyMjI2NvbmZpZyBMRU5HVEgKKyMjIyMJYm9vbCAibGVuZ3RoIgorIyMjIwlkZWZhdWx0IHkKKyMjIyMJaGVscAorIyMjIwkgIGxlbmd0aCBpcyB1c2VkIHRvIHByaW50IG91dCB0aGUgbGVuZ3RoIG9mIGEgc3BlY2lmaWVkIHN0cmluZy4KKworY29uZmlnIExOCisJYm9vbCAibG4iCisJZGVmYXVsdCB5CisJaGVscAorCSAgbG4gaXMgdXNlZCB0byBjcmVhdGUgaGFyZCBvciBzb2Z0IGxpbmtzIGJldHdlZW4gZmlsZXMuCisKK2NvbmZpZyBMT0dOQU1FCisJYm9vbCAibG9nbmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBsb2duYW1lIGlzIHVzZWQgdG8gcHJpbnQgdGhlIGN1cnJlbnQgdXNlcidzIGxvZ2luIG5hbWUuCisKK2NvbmZpZyBMUworCWJvb2wgImxzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxzIGlzIHVzZWQgdG8gbGlzdCB0aGUgY29udGVudHMgb2YgZGlyZWN0b3JpZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xTX0ZJTEVUWVBFUworCWJvb2wgIkVuYWJsZSBmaWxldHlwaW5nIG9wdGlvbnMgKC1wIGFuZCAtRikiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEVuYWJsZSB0aGUgbHMgb3B0aW9ucyAoLXAgYW5kIC1GKS4KKworY29uZmlnIEZFQVRVUkVfTFNfRk9MTE9XTElOS1MKKwlib29sICJFbmFibGUgc3ltbGlua3MgZGVyZWZlcmVuY2luZyAoLUwpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBFbmFibGUgdGhlIGxzIG9wdGlvbiAoLUwpLgorCitjb25maWcgRkVBVFVSRV9MU19SRUNVUlNJVkUKKwlib29sICJFbmFibGUgcmVjdXJzaW9uICgtUikiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEVuYWJsZSB0aGUgbHMgb3B0aW9uICgtUikuCisKK2NvbmZpZyBGRUFUVVJFX0xTX1NPUlRGSUxFUworCWJvb2wgIlNvcnQgdGhlIGZpbGUgbmFtZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEFsbG93IGxzIHRvIHNvcnQgZmlsZSBuYW1lcyBhbHBoYWJldGljYWxseS4KKworY29uZmlnIEZFQVRVUkVfTFNfVElNRVNUQU1QUworCWJvb2wgIlNob3cgZmlsZSB0aW1lc3RhbXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBBbGxvdyBscyB0byBkaXNwbGF5IHRpbWVzdGFtcHMgZm9yIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9MU19VU0VSTkFNRQorCWJvb2wgIlNob3cgdXNlcm5hbWUvZ3JvdXBuYW1lcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgQWxsb3cgbHMgdG8gZGlzcGxheSB1c2VybmFtZS9ncm91cG5hbWUgZm9yIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9MU19DT0xPUgorCWJvb2wgIkFsbG93IHVzZSBvZiBjb2xvciB0byBpZGVudGlmeSBmaWxlIHR5cGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMgJiYgTE9OR19PUFRTCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSAtLWNvbG9yIG9wdGlvbiB0byBscy4KKworY29uZmlnIEZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVAorCWJvb2wgIlByb2R1Y2UgY29sb3JlZCBscyBvdXRwdXQgYnkgZGVmYXVsdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfTFNfQ09MT1IKKwloZWxwCisJICBTYXlpbmcgeWVzIGhlcmUgd2lsbCB0dXJuIGNvbG9yaW5nIG9uIGJ5IGRlZmF1bHQsCisJICBldmVuIGlmIG5vICItLWNvbG9yIiBvcHRpb24gaXMgZ2l2ZW4gdG8gdGhlIGxzIGNvbW1hbmQuCisJICBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCwgc2luY2UgdGhlIGNvbG9ycyBhcmUgbm90CisJICBjb25maWd1cmFibGUsIGFuZCB0aGUgb3V0cHV0IG1heSBub3QgYmUgbGVnaWJsZSBvbgorCSAgbWFueSBvdXRwdXQgc2NyZWVucy4KKworY29uZmlnIE1ENVNVTQorCWJvb2wgIm1kNXN1bSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtZDVzdW0gaXMgdXNlZCB0byBwcmludCBvciBjaGVjayBNRDUgY2hlY2tzdW1zLgorCitjb25maWcgTUtESVIKKwlib29sICJta2RpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta2RpciBpcyB1c2VkIHRvIGNyZWF0ZSBkaXJlY3RvcmllcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXMuCisKK2NvbmZpZyBGRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNS0RJUiAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIG1rZGlyIGFwcGxldC4KKworY29uZmlnIE1LRklGTworCWJvb2wgIm1rZmlmbyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta2ZpZm8gaXMgdXNlZCB0byBjcmVhdGUgRklGT3MgKG5hbWVkIHBpcGVzKS4KKwkgIFRoZSBgbWtub2QnIHByb2dyYW0gY2FuIGFsc28gY3JlYXRlIEZJRk9zLgorCitjb25maWcgTUtOT0QKKwlib29sICJta25vZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta25vZCBpcyB1c2VkIHRvIGNyZWF0ZSBGSUZPcyBvciBibG9jay9jaGFyYWN0ZXIgc3BlY2lhbAorCSAgZmlsZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzLgorCitjb25maWcgTVYKKwlib29sICJtdiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtdiBpcyB1c2VkIHRvIG1vdmUgb3IgcmVuYW1lIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgorCitjb25maWcgRkVBVFVSRV9NVl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTVYgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBtdiBhcHBsZXQuCisKK2NvbmZpZyBOSUNFCisJYm9vbCAibmljZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBuaWNlIHJ1bnMgYSBwcm9ncmFtIHdpdGggbW9kaWZpZWQgc2NoZWR1bGluZyBwcmlvcml0eS4KKworY29uZmlnIE5PSFVQCisJYm9vbCAibm9odXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcnVuIGEgY29tbWFuZCBpbW11bmUgdG8gaGFuZ3Vwcywgd2l0aCBvdXRwdXQgdG8gYSBub24tdHR5LgorCitjb25maWcgT0QKKwlib29sICJvZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBvZCBpcyB1c2VkIHRvIGR1bXAgYmluYXJ5IGZpbGVzIGluIG9jdGFsIGFuZCBvdGhlciBmb3JtYXRzLgorCitjb25maWcgUFJJTlRFTlYKKwlib29sICJwcmludGVudiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBwcmludGVudiBpcyB1c2VkIHRvIHByaW50IGFsbCBvciBwYXJ0IG9mIGVudmlyb25tZW50LgorCitjb25maWcgUFJJTlRGCisJYm9vbCAicHJpbnRmIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHByaW50ZiBpcyB1c2VkIHRvIGZvcm1hdCBhbmQgcHJpbnQgc3BlY2lmaWVkIHN0cmluZ3MuCisJICBJdCdzIHNpbWlsYXIgdG8gYGVjaG8nIGV4Y2VwdCBpdCBoYXMgbW9yZSBvcHRpb25zLgorCitjb25maWcgUFdECisJYm9vbCAicHdkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHB3ZCBpcyB1c2VkIHRvIHByaW50IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworY29uZmlnIFJFQURMSU5LCisJYm9vbCAicmVhZGxpbmsiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlYWRzIGEgc3ltYm9saWMgbGluayBhbmQgcmV0dXJucyB0aGUgbmFtZQorCSAgb2YgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCisKK2NvbmZpZyBGRUFUVVJFX1JFQURMSU5LX0ZPTExPVworCWJvb2wgIkVuYWJsZSBjYW5vbmljYWxpemF0aW9uIGJ5IGZvbGxvd2luZyBhbGwgc3ltbGlua3MgKC1mKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJFQURMSU5LCisJaGVscAorCSAgRW5hYmxlIHRoZSByZWFkbGluayBvcHRpb24gKC1mKS4KKworY29uZmlnIFJFQUxQQVRICisJYm9vbCAicmVhbHBhdGgiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmV0dXJuIHRoZSBjYW5vbmljYWxpemVkIGFic29sdXRlIHBhdGhuYW1lLgorCSAgVGhpcyBpc24ndCBwcm92aWRlZCBieSBHTlUgc2hlbGx1dGlscywgYnV0IHdoZXJlIGVsc2UgZG9lcyBpdCBiZWxvbmcuCisKK2NvbmZpZyBSTQorCWJvb2wgInJtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJtIGlzIHVzZWQgdG8gcmVtb3ZlIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgorCitjb25maWcgUk1ESVIKKwlib29sICJybWRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBybWRpciBpcyB1c2VkIHRvIHJlbW92ZSBlbXB0eSBkaXJlY3Rvcmllcy4KKworY29uZmlnIEZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJNRElSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgcm1kaXIgYXBwbGV0LCBpbmNsdWRpbmcKKwkgIC0taWdub3JlLWZhaWwtb24tbm9uLWVtcHR5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggR05VIHJtZGlyLgorCitjb25maWcgU0VRCisJYm9vbCAic2VxIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHByaW50IGEgc2VxdWVuY2Ugb2YgbnVtYmVycworCitjb25maWcgU0hBMVNVTQorCWJvb2wgInNoYTFzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29tcHV0ZSBhbmQgY2hlY2sgU0hBMSBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0hBMjU2U1VNCisJYm9vbCAic2hhMjU2c3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbXB1dGUgYW5kIGNoZWNrIFNIQTI1NiBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0hBNTEyU1VNCisJYm9vbCAic2hhNTEyc3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbXB1dGUgYW5kIGNoZWNrIFNIQTUxMiBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0xFRVAKKwlib29sICJzbGVlcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzbGVlcCBpcyB1c2VkIHRvIHBhdXNlIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcy4KKwkgIEl0IGNvbWVzIGluIDMgdmVyc2lvbnM6CisJICAtIHNtYWxsOiB0YWtlcyBvbmUgaW50ZWdlciBwYXJhbWV0ZXIKKwkgIC0gZmFuY3k6IHRha2VzIG11bHRpcGxlIGludGVnZXIgYXJndW1lbnRzIHdpdGggc3VmZml4ZXM6CisJICAgIHNsZWVwIDFkIDJoIDNtIDE1cworCSAgLSBmYW5jeSB3aXRoIGZyYWN0aW9uYWwgbnVtYmVyczoKKwkgICAgc2xlZXAgMi4zcyA0LjVoIHNsZWVwcyBmb3IgMTYyMDIuMyBzZWNvbmRzCisJICBMYXN0IG9uZSBpcyAidGhlIG1vc3QgY29tcGF0aWJsZSIgd2l0aCBjb3JldXRpbHMgc2xlZXAsCisJICBidXQgaXQgYWRkcyBhcm91bmQgMWsgb2YgY29kZS4KKworY29uZmlnIEZFQVRVUkVfRkFOQ1lfU0xFRVAKKwlib29sICJFbmFibGUgbXVsdGlwbGUgYXJndW1lbnRzIGFuZCBzL20vaC9kIHN1ZmZpeGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0xFRVAKKwloZWxwCisJICBBbGxvdyBzbGVlcCB0byBwYXVzZSBmb3Igc3BlY2lmaWVkIG1pbnV0ZXMsIGhvdXJzLCBhbmQgZGF5cy4KKworY29uZmlnIEZFQVRVUkVfRkxPQVRfU0xFRVAKKwlib29sICJFbmFibGUgZnJhY3Rpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0ZBTkNZX1NMRUVQCisJaGVscAorCSAgQWxsb3cgZm9yIGZyYWN0aW9uYWwgbnVtZXJpYyBwYXJhbWV0ZXJzLgorCitjb25maWcgU09SVAorCWJvb2wgInNvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc29ydCBpcyB1c2VkIHRvIHNvcnQgbGluZXMgb2YgdGV4dCBpbiBzcGVjaWZpZWQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX1NPUlRfQklHCisJYm9vbCAiRnVsbCBTdVN2MyBjb21wbGlhbnQgc29ydCAoc3VwcG9ydCAta3Rjc2JkZmlvemdNKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNPUlQKKwloZWxwCisJICBXaXRob3V0IHRoaXMsIHNvcnQgb25seSBzdXBwb3J0cyAtciwgLXUsIGFuZCBhbiBpbnRlZ2VyIHZlcnNpb24KKwkgIG9mIC1uLiBTZWxlY3RpbmcgdGhpcyBhZGRzIHNvcnQga2V5cywgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCwgYW5kCisJICBtb3JlLiBUaGlzIGFkZHMgYSBsaXR0bGUgb3ZlciAzayB0byBhIG5vbnN0YXRpYyBidWlsZCBvbiB4ODYuCisKKwkgIFRoZSBTdVN2MyBzb3J0IHN0YW5kYXJkIGlzIGF2YWlsYWJsZSBhdDoKKwkgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvc29ydC5odG1sCisKK2NvbmZpZyBTUExJVAorCWJvb2wgInNwbGl0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNwbGl0IGEgZmlsZSBpbnRvIHBpZWNlcy4KKworY29uZmlnIEZFQVRVUkVfU1BMSVRfRkFOQ1kKKwlib29sICJGYW5jeSBleHRlbnNpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1BMSVQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgZmVhdHVyZXMgbm90IHJlcXVpcmVkIGJ5IFNVU3YzLgorCSAgU3VwcG9ydHMgYWRkaXRpb25hbCBzdWZmaXhlcyAnYicgZm9yIDUxMiBieXRlcywKKwkgICdnJyBmb3IgMUdpQiBmb3IgdGhlIC1iIG9wdGlvbi4KKworY29uZmlnIFNUQVQKKwlib29sICJzdGF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWCAjIHN0YXRmcygpCisJaGVscAorCSAgZGlzcGxheSBmaWxlIG9yIGZpbGVzeXN0ZW0gc3RhdHVzLgorCitjb25maWcgRkVBVFVSRV9TVEFUX0ZPUk1BVAorCWJvb2wgIkVuYWJsZSBjdXN0b20gZm9ybWF0cyAoLWMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1RBVAorCWhlbHAKKwkgIFdpdGhvdXQgdGhpcywgc3RhdCB3aWxsIG5vdCBzdXBwb3J0IHRoZSAnLWMgZm9ybWF0JyBvcHRpb24gd2hlcmUKKwkgIHVzZXJzIGNhbiBwYXNzIGEgY3VzdG9tIGZvcm1hdCBzdHJpbmcgZm9yIG91dHB1dC4gVGhpcyBhZGRzIGFib3V0CisJICA3ayB0byBhIG5vbnN0YXRpYyBidWlsZCBvbiBhbWQ2NC4KKworY29uZmlnIFNUVFkKKwlib29sICJzdHR5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0dHkgaXMgdXNlZCB0byBjaGFuZ2UgYW5kIHByaW50IHRlcm1pbmFsIGxpbmUgc2V0dGluZ3MuCisKK2NvbmZpZyBTVU0KKwlib29sICJzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hlY2tzdW0gYW5kIGNvdW50IHRoZSBibG9ja3MgaW4gYSBmaWxlCisKK2NvbmZpZyBTWU5DCisJYm9vbCAic3luYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzeW5jIGlzIHVzZWQgdG8gZmx1c2ggZmlsZXN5c3RlbSBidWZmZXJzLgorCitjb25maWcgVEFDCisJYm9vbCAidGFjIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRhYyBpcyB1c2VkIHRvIGNvbmNhdGVuYXRlIGFuZCBwcmludCBmaWxlcyBpbiByZXZlcnNlLgorCitjb25maWcgVEFJTAorCWJvb2wgInRhaWwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdGFpbCBpcyB1c2VkIHRvIHByaW50IHRoZSBsYXN0IHNwZWNpZmllZCBudW1iZXIgb2YgbGluZXMKKwkgIGZyb20gZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0ZBTkNZX1RBSUwKKwlib29sICJFbmFibGUgZXh0cmEgdGFpbCBvcHRpb25zICgtcSwgLXMsIC12LCBhbmQgLUYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEFJTAorCWhlbHAKKwkgIFRoZSBvcHRpb25zICgtcSwgLXMsIGFuZCAtdikgYXJlIHByb3ZpZGVkIGJ5IEdOVSB0YWlsLCBidXQKKwkgIGFyZSBub3Qgc3BlY2lmaWMgaW4gdGhlIFNVU3YzIHN0YW5kYXJkLgorCisJICAgIC1xICAgICAgTmV2ZXIgb3V0cHV0IGhlYWRlcnMgZ2l2aW5nIGZpbGUgbmFtZXMKKwkgICAgLXMgU0VDICBXYWl0IFNFQyBzZWNvbmRzIGJldHdlZW4gcmVhZHMgd2l0aCAtZgorCSAgICAtdiAgICAgIEFsd2F5cyBvdXRwdXQgaGVhZGVycyBnaXZpbmcgZmlsZSBuYW1lcworCitjb25maWcgVEVFCisJYm9vbCAidGVlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRlZSBpcyB1c2VkIHRvIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGUKKwkgIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU8KKwlib29sICJFbmFibGUgYmxvY2sgSS9PIChsYXJnZXIvZmFzdGVyKSBpbnN0ZWFkIG9mIGJ5dGUgSS9PIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVFCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGZvciBhIGZhc3RlciB0ZWUsIGF0IGV4cGVuc2Ugb2Ygc2l6ZS4KKworY29uZmlnIFRSVUUKKwlib29sICJ0cnVlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHRydWUgcmV0dXJucyBhbiBleGl0IGNvZGUgb2YgVFJVRSAoMCkuCisKK2NvbmZpZyBUVFkKKwlib29sICJ0dHkiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdHR5IGlzIHVzZWQgdG8gcHJpbnQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGVybWluYWwgdG8KKwkgIHN0YW5kYXJkIG91dHB1dC4KKworY29uZmlnIFVOQU1FCisJYm9vbCAidW5hbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW5hbWUgaXMgdXNlZCB0byBwcmludCBzeXN0ZW0gaW5mb3JtYXRpb24uCisKK2NvbmZpZyBVTkVYUEFORAorCWJvb2wgInVuZXhwYW5kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ5IGRlZmF1bHQsIGNvbnZlcnQgb25seSBsZWFkaW5nIHNlcXVlbmNlcyBvZiBibGFua3MgdG8gdGFicy4KKworY29uZmlnIEZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVORVhQQU5EICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgdW5leHBhbmQgYXBwbGV0LgorCitjb25maWcgVU5JUQorCWJvb2wgInVuaXEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW5pcSBpcyB1c2VkIHRvIHJlbW92ZSBkdXBsaWNhdGUgbGluZXMgZnJvbSBhIHNvcnRlZCBmaWxlLgorCitjb25maWcgVVNMRUVQCisJYm9vbCAidXNsZWVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVzbGVlcCBpcyB1c2VkIHRvIHBhdXNlIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzLgorCitjb25maWcgVVVERUNPREUKKwlib29sICJ1dWRlY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1dWRlY29kZSBpcyB1c2VkIHRvIGRlY29kZSBhIHV1ZW5jb2RlZCBmaWxlLgorCitjb25maWcgVVVFTkNPREUKKwlib29sICJ1dWVuY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1dWVuY29kZSBpcyB1c2VkIHRvIHV1ZW5jb2RlIGEgZmlsZS4KKworY29uZmlnIFdDCisJYm9vbCAid2MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgd2MgaXMgdXNlZCB0byBwcmludCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCB3b3JkcywgYW5kIGxpbmVzLAorCSAgaW4gc3BlY2lmaWVkIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9XQ19MQVJHRQorCWJvb2wgIlN1cHBvcnQgdmVyeSBsYXJnZSBmaWxlcyBpbiB3YyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdDCisJaGVscAorCSAgVXNlICJ1bnNpZ25lZCBsb25nIGxvbmciIGluIHdjIGZvciBjb3VudGVyIHZhcmlhYmxlcy4KKworY29uZmlnIFdIT0FNSQorCWJvb2wgIndob2FtaSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3aG9hbWkgaXMgdXNlZCB0byBwcmludCB0aGUgdXNlcm5hbWUgb2YgdGhlIGN1cnJlbnQKKwkgIHVzZXIgaWQgKHNhbWUgYXMgaWQgLXVuKS4KKworY29uZmlnIFlFUworCWJvb2wgInllcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB5ZXMgaXMgdXNlZCB0byByZXBlYXRlZGx5IG91dHB1dCBhIHNwZWNpZmljIHN0cmluZywgb3IKKwkgIHRoZSBkZWZhdWx0IHN0cmluZyBgeScuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYiCisJZGVwZW5kcyBvbiBDUCB8fCBNVgorCitjb25maWcgRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1MKKwlib29sICJQcmVzZXJ2ZSBoYXJkIGxpbmtzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ1AgfHwgTVYKKwloZWxwCisJICBBbGxvdyBjcCBhbmQgbXYgdG8gcHJlc2VydmUgaGFyZCBsaW5rcy4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQiCisJZGVwZW5kcyBvbiBMUyB8fCBNT1JFIHx8IFRFTE5FVAorCitjb25maWcgRkVBVFVSRV9BVVRPV0lEVEgKKwlib29sICJDYWxjdWxhdGUgdGVybWluYWwgJiBjb2x1bW4gd2lkdGhzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMgfHwgTU9SRSB8fCBURUxORVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgdXRpbGl0aWVzIHN1Y2ggYXMgJ2xzJywgJ21vcmUnIGFuZCAndGVsbmV0JworCSAgdG8gZGV0ZXJtaW5lIHRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuLCB3aGljaCBjYW4gYWxsb3cgdGhlbSB0bworCSAgZGlzcGxheSBhZGRpdGlvbmFsIHRleHQgb3IgYXZvaWQgd3JhcHBpbmcgdGV4dCBvbnRvIHRoZSBuZXh0IGxpbmUuCisJICBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgeW91ciB1dGlsaXRpZXMgd2lsbCBiZSBlc3BlY2lhbGx5CisJICBwcmltaXRpdmUgYW5kIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gd2lkdGguCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzIgorCWRlcGVuZHMgb24gREYgfHwgRFUgfHwgTFMKKworY29uZmlnIEZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwlib29sICJTdXBwb3J0IGZvciBodW1hbiByZWFkYWJsZSBvdXRwdXQgKGV4YW1wbGUgMTNrLCAyM00sIDIzNUcpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREYgfHwgRFUgfHwgTFMKKwloZWxwCisJICBBbGxvdyBkZiwgZHUsIGFuZCBscyB0byBoYXZlIGh1bWFuIHJlYWRhYmxlIG91dHB1dC4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0iCisJZGVwZW5kcyBvbiBNRDVTVU0gfHwgU0hBMVNVTSB8fCBTSEEyNTZTVU0gfHwgU0hBNTEyU1VNCisKK2NvbmZpZyBGRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSworCWJvb2wgIkVuYWJsZSAtYywgLXMgYW5kIC13IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNRDVTVU0gfHwgU0hBMVNVTSB8fCBTSEEyNTZTVU0gfHwgU0hBNTEyU1VNCisJaGVscAorCSAgRW5hYmxpbmcgdGhlIC1jIG9wdGlvbnMgYWxsb3dzIGZpbGVzIHRvIGJlIGNoZWNrZWQKKwkgIGFnYWluc3QgcHJlLWNhbGN1bGF0ZWQgaGFzaCB2YWx1ZXMuCisKKwkgIC1zIGFuZCAtdyBhcmUgdXNlZnVsIG9wdGlvbnMgd2hlbiB2ZXJpZnlpbmcgY2hlY2tzdW1zLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvS2J1aWxkLnNyYyBiL2NvcmV1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDg4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDg2IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGlicy15CQkJKz0gbGliY29yZXV0aWxzLworCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0NBTCkgICAgICAgKz0gY2FsLm8KK2xpYi0kKENPTkZJR19DQVRWKSAgICAgICs9IGNhdHYubworbGliLSQoQ09ORklHX0NIR1JQKSAgICAgKz0gY2hncnAubyBjaG93bi5vCitsaWItJChDT05GSUdfQ0hNT0QpICAgICArPSBjaG1vZC5vCitsaWItJChDT05GSUdfQ0hPV04pICAgICArPSBjaG93bi5vCitsaWItJChDT05GSUdfQUREVVNFUikgICArPSBjaG93bi5vICMgdXNlZCBieSBhZGR1c2VyCitsaWItJChDT05GSUdfQURER1JPVVApICArPSBjaG93bi5vICMgdXNlZCBieSBhZGR1c2VyCitsaWItJChDT05GSUdfQ0hST09UKSAgICArPSBjaHJvb3QubworbGliLSQoQ09ORklHX0NLU1VNKSAgICAgKz0gY2tzdW0ubworbGliLSQoQ09ORklHX0NPTU0pICAgICAgKz0gY29tbS5vCitsaWItJChDT05GSUdfQ1ApICAgICAgICArPSBjcC5vCitsaWItJChDT05GSUdfQ1VUKSAgICAgICArPSBjdXQubworbGliLSQoQ09ORklHX0REKSAgICAgICAgKz0gZGQubworbGliLSQoQ09ORklHX0RGKSAgICAgICAgKz0gZGYubworbGliLSQoQ09ORklHX0RJUk5BTUUpICAgKz0gZGlybmFtZS5vCitsaWItJChDT05GSUdfRE9TMlVOSVgpICArPSBkb3MydW5peC5vCitsaWItJChDT05GSUdfRFUpICAgICAgICArPSBkdS5vCitsaWItJChDT05GSUdfRUNITykgICAgICArPSBlY2hvLm8KK2xpYi0kKENPTkZJR19BU0gpICAgICAgICs9IGVjaG8ubyAjIHVzZWQgYnkgYXNoCitsaWItJChDT05GSUdfSFVTSCkgICAgICArPSBlY2hvLm8gIyB1c2VkIGJ5IGh1c2gKK2xpYi0kKENPTkZJR19FTlYpICAgICAgICs9IGVudi5vCitsaWItJChDT05GSUdfRVhQUikgICAgICArPSBleHByLm8KK2xpYi0kKENPTkZJR19FWFBBTkQpICAgICs9IGV4cGFuZC5vCitsaWItJChDT05GSUdfRkFMU0UpICAgICArPSBmYWxzZS5vCitsaWItJChDT05GSUdfRk9MRCkgICAgICArPSBmb2xkLm8KK2xpYi0kKENPTkZJR19GU1lOQykgICAgICs9IGZzeW5jLm8KK2xpYi0kKENPTkZJR19IRUFEKSAgICAgICs9IGhlYWQubworbGliLSQoQ09ORklHX0hPU1RJRCkgICAgKz0gaG9zdGlkLm8KK2xpYi0kKENPTkZJR19JTlNUQUxMKSAgICs9IGluc3RhbGwubworI2xpYi0kKENPTkZJR19MRU5HVEgpICAgICs9IGxlbmd0aC5vCitsaWItJChDT05GSUdfTE4pICAgICAgICArPSBsbi5vCitsaWItJChDT05GSUdfTE9HTkFNRSkgICArPSBsb2duYW1lLm8KK2xpYi0kKENPTkZJR19MUykgICAgICAgICs9IGxzLm8KK2xpYi0kKENPTkZJR19GVFBEKSAgICAgICs9IGxzLm8KK2xpYi0kKENPTkZJR19NRDVTVU0pICAgICs9IG1kNV9zaGExX3N1bS5vCitsaWItJChDT05GSUdfTUtESVIpICAgICArPSBta2Rpci5vCitsaWItJChDT05GSUdfTUtGSUZPKSAgICArPSBta2ZpZm8ubworbGliLSQoQ09ORklHX01LTk9EKSAgICAgKz0gbWtub2QubworbGliLSQoQ09ORklHX01WKSAgICAgICAgKz0gbXYubworbGliLSQoQ09ORklHX05JQ0UpICAgICAgKz0gbmljZS5vCitsaWItJChDT05GSUdfTk9IVVApICAgICArPSBub2h1cC5vCitsaWItJChDT05GSUdfT0QpICAgICAgICArPSBvZC5vCitsaWItJChDT05GSUdfUFJJTlRFTlYpICArPSBwcmludGVudi5vCitsaWItJChDT05GSUdfUFJJTlRGKSAgICArPSBwcmludGYubworbGliLSQoQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URikgKz0gcHJpbnRmLm8KK2xpYi0kKENPTkZJR19QV0QpICAgICAgICs9IHB3ZC5vCitsaWItJChDT05GSUdfUkVBRExJTkspICArPSByZWFkbGluay5vCitsaWItJChDT05GSUdfUkVBTFBBVEgpICArPSByZWFscGF0aC5vCitsaWItJChDT05GSUdfUk0pICAgICAgICArPSBybS5vCitsaWItJChDT05GSUdfUk1ESVIpICAgICArPSBybWRpci5vCitsaWItJChDT05GSUdfU0VRKSAgICAgICArPSBzZXEubworbGliLSQoQ09ORklHX1NIQTFTVU0pICAgKz0gbWQ1X3NoYTFfc3VtLm8KK2xpYi0kKENPTkZJR19TSEEyNTZTVU0pICs9IG1kNV9zaGExX3N1bS5vCitsaWItJChDT05GSUdfU0hBNTEyU1VNKSArPSBtZDVfc2hhMV9zdW0ubworbGliLSQoQ09ORklHX1NMRUVQKSAgICAgKz0gc2xlZXAubworbGliLSQoQ09ORklHX1NQTElUKSAgICAgKz0gc3BsaXQubworbGliLSQoQ09ORklHX1NPUlQpICAgICAgKz0gc29ydC5vCitsaWItJChDT05GSUdfU1RBVCkgICAgICArPSBzdGF0Lm8KK2xpYi0kKENPTkZJR19TVFRZKSAgICAgICs9IHN0dHkubworbGliLSQoQ09ORklHX1NVTSkgICAgICAgKz0gc3VtLm8KK2xpYi0kKENPTkZJR19TWU5DKSAgICAgICs9IHN5bmMubworbGliLSQoQ09ORklHX1RBQykgICAgICAgKz0gdGFjLm8KK2xpYi0kKENPTkZJR19UQUlMKSAgICAgICs9IHRhaWwubworbGliLSQoQ09ORklHX1RFRSkgICAgICAgKz0gdGVlLm8KK2xpYi0kKENPTkZJR19UUlVFKSAgICAgICs9IHRydWUubworbGliLSQoQ09ORklHX1RUWSkgICAgICAgKz0gdHR5Lm8KK2xpYi0kKENPTkZJR19VTkFNRSkgICAgICs9IHVuYW1lLm8KK2xpYi0kKENPTkZJR19VTkVYUEFORCkgICs9IGV4cGFuZC5vCitsaWItJChDT05GSUdfVU5JUSkgICAgICArPSB1bmlxLm8KK2xpYi0kKENPTkZJR19VU0xFRVApICAgICs9IHVzbGVlcC5vCitsaWItJChDT05GSUdfVVVERUNPREUpICArPSB1dWRlY29kZS5vCitsaWItJChDT05GSUdfVVVFTkNPREUpICArPSB1dWVuY29kZS5vCitsaWItJChDT05GSUdfV0MpICAgICAgICArPSB3Yy5vCitsaWItJChDT05GSUdfV0hPQU1JKSAgICArPSB3aG9hbWkubworbGliLSQoQ09ORklHX1lFUykgICAgICAgKz0geWVzLm8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9iYXNlbmFtZS5jIGIvY29yZXV0aWxzL2Jhc2VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YTEzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9iYXNlbmFtZS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgYmFzZW5hbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIENoYW5nZXM6CisgKiAxKSBOb3cgY2hlY2tzIGZvciB0b28gbWFueSBhcmdzLiAgTmVlZCBhdCBsZWFzdCBvbmUgYW5kIGF0IG1vc3QgdHdvLgorICogMikgRG9uJ3QgY2hlY2sgZm9yIG9wdGlvbnMsIGFzIHBlciBTVVN2My4KKyAqIDMpIFNhdmUgc29tZSBzcGFjZSBieSB1c2luZyBzdHJjbXAoKS4gIENhbGxpbmcgc3RybmNtcCgpIGhlcmUgd2FzIHNpbGx5LgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9iYXNlbmFtZS5odG1sICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19CQVNFTkFNRSkgKz0gYmFzZW5hbWUubworCisvL2NvbmZpZzpjb25maWcgQkFTRU5BTUUKKy8vY29uZmlnOglib29sICJiYXNlbmFtZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBiYXNlbmFtZSBpcyB1c2VkIHRvIHN0cmlwIHRoZSBkaXJlY3RvcnkgYW5kIHN1ZmZpeCBmcm9tIGZpbGVuYW1lcywKKy8vY29uZmlnOgkgIGxlYXZpbmcganVzdCB0aGUgZmlsZW5hbWUgaXRzZWxmLiBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdpc2gKKy8vY29uZmlnOgkgIHRvIGVuYWJsZSB0aGUgJ2Jhc2VuYW1lJyB1dGlsaXR5LgorCisvL3VzYWdlOiNkZWZpbmUgYmFzZW5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEUgW1NVRkZJWF0iCisvL3VzYWdlOiNkZWZpbmUgYmFzZW5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdHJpcCBkaXJlY3RvcnkgcGF0aCBhbmQgLlNVRkZJWCBmcm9tIEZJTEVcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgYmFzZW5hbWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgYmFzZW5hbWUgL3Vzci9sb2NhbC9iaW4vZm9vXG4iCisvL3VzYWdlOiAgICAgICAiZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBiYXNlbmFtZSAvdXNyL2xvY2FsL2Jpbi9cbiIKKy8vdXNhZ2U6ICAgICAgICJiaW5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGJhc2VuYW1lIC9mb28vYmFyLnR4dCAudHh0XG4iCisvL3VzYWdlOiAgICAgICAiYmFyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGJhc2VuYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBiYXNlbmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzaXplX3QgbSwgbjsKKwljaGFyICpzOworCisJaWYgKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sICItLSIpID09IDApIHsKKwkJYXJndisrOworCQlhcmdjLS07CisJfQorCisJaWYgKCh1bnNpZ25lZCkoYXJnYy0yKSA+PSAyKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBJdCBzaG91bGQgc3RyaXAgc2xhc2g6IC9hYmMvZGVmLyAtPiBkZWYgKi8KKwlzID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoKisrYXJndik7CisKKwltID0gc3RybGVuKHMpOworCWlmICgqKythcmd2KSB7CisJCW4gPSBzdHJsZW4oKmFyZ3YpOworCQlpZiAoKG0gPiBuKSAmJiAoc3RyY21wKHMrbS1uLCAqYXJndikgPT0gMCkpIHsKKwkJCW0gLT0gbjsKKwkJCS8qc1ttXSA9ICdcMCc7IC0gcmVkdW5kYW50ICovCisJCX0KKwl9CisKKwkvKiBwdXRzKHMpIHdpbGwgZG8sIGJ1dCB3ZSBjYW4gZG8gd2l0aG91dCBzdGRpbyB0aGlzIHdheTogKi8KKwlzW20rK10gPSAnXG4nOworCS8qIE5COiAhPSBpcyBjb3JyZWN0IGhlcmU6ICovCisJcmV0dXJuIGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgcywgbSkgIT0gKHNzaXplX3QpbTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jYWwuYyBiL2NvcmV1dGlscy9jYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDcwYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2NhbC5jCkBAIC0wLDAgKzEsMzgxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDYWxlbmRhciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIFNlZSBvcmlnaW5hbCBjb3B5cmlnaHQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCB3aXRoIC1qIGFuZCAteSBleHRlbnNpb25zIChmcm9tIHV0aWwtbGludXgpLiAqLworLyogQkJfQVVESVQgQlVHOiBUaGUgb3V0cHV0IG9mICdjYWwgLWogMTc1MicgaXMgaW5jb3JyZWN0LiAgVGhlIHVwc3RyZWFtCisgKiBCQl9BVURJVCBCVUc6IHZlcnNpb24gaW4gdXRpbC1saW51eCBzZWVtcyB0byBiZSBicm9rZW4gYXMgd2VsbC4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2FsLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBNYWpvciBzaXplIHJlZHVjdGlvbi4uLiBvdmVyIDUwJSAoPjEuNWspIG9uIGkzODYuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNhbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1qeV0gW1tNT05USF0gWUVBUl0iCisvL3VzYWdlOiNkZWZpbmUgY2FsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBhIGNhbGVuZGFyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1qCVVzZSBqdWxpYW4gZGF0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS15CURpc3BsYXkgdGhlIGVudGlyZSB5ZWFyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKy8qIFdlIG9mdGVuIHVzZSAidW5zaWduZWQiIGludGVhZCBvZiAiaW50IiwgaXQncyBlYXNpZXIgdG8gZGl2IG9uIG1vc3QgQ1BVcyAqLworCisjZGVmaW5lCVRIVVJTREFZCQk0CQkvKiBmb3IgcmVmb3JtYXRpb24gKi8KKyNkZWZpbmUJU0FUVVJEQVkJCTYJCS8qIDEgSmFuIDEgd2FzIGEgU2F0dXJkYXkgKi8KKworI2RlZmluZQlGSVJTVF9NSVNTSU5HX0RBWQk2Mzk3ODcJCS8qIDMgU2VwIDE3NTIgKi8KKyNkZWZpbmUJTlVNQkVSX01JU1NJTkdfREFZUwkxMQkJLyogMTEgZGF5IGNvcnJlY3Rpb24gKi8KKworI2RlZmluZQlNQVhEQVlTCQkJNDIJCS8qIG1heCBzbG90cyBpbiBhIG1vbnRoIGFycmF5ICovCisjZGVmaW5lCVNQQUNFCQkJLTEJCS8qIHVzZWQgaW4gZGF5IGFycmF5ICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9udGhbXSBBTElHTjEgPSB7CisJMCwgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2VwMTc1MltdIEFMSUdOMSA9IHsKKwkJIDEsCTIsCTE0LAkxNSwJMTYsCisJMTcsCTE4LAkxOSwJMjAsCTIxLAkyMiwJMjMsCisJMjQsCTI1LAkyNiwJMjcsCTI4LAkyOSwJMzAKK307CisKKy8qIFNldCB0byAwIG9yIDEgaW4gbWFpbiAqLworI2RlZmluZSBqdWxpYW4gKCh1bnNpZ25lZClvcHRpb25fbWFzazMyKQorCisvKiBsZWFwIHllYXIgLS0gYWNjb3VudCBmb3IgR3JlZ29yaWFuIHJlZm9ybWF0aW9uIGluIDE3NTIgKi8KK3N0YXRpYyBpbnQgbGVhcF95ZWFyKHVuc2lnbmVkIHlyKQoreworCWlmICh5ciA8PSAxNzUyKQorCQlyZXR1cm4gISh5ciAlIDQpOworCXJldHVybiAoISh5ciAlIDQpICYmICh5ciAlIDEwMCkpIHx8ICEoeXIgJSA0MDApOworfQorCisvKiBudW1iZXIgb2YgY2VudHVyaWVzIHNpbmNlIDE3MDAsIG5vdCBpbmNsdXNpdmUgKi8KKyNkZWZpbmUJY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpIFwKKwkoKHlyKSA+IDE3MDAgPyAoeXIpIC8gMTAwIC0gMTcgOiAwKQorCisvKiBudW1iZXIgb2YgY2VudHVyaWVzIHNpbmNlIDE3MDAgd2hvc2UgbW9kdWxvIG9mIDQwMCBpcyAwICovCisjZGVmaW5lCXF1YWRfY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpIFwKKwkoKHlyKSA+IDE2MDAgPyAoKHlyKSAtIDE2MDApIC8gNDAwIDogMCkKKworLyogbnVtYmVyIG9mIGxlYXAgeWVhcnMgYmV0d2VlbiB5ZWFyIDEgYW5kIHRoaXMgeWVhciwgbm90IGluY2x1c2l2ZSAqLworI2RlZmluZQlsZWFwX3llYXJzX3NpbmNlX3llYXJfMSh5cikgXAorCSgoeXIpIC8gNCAtIGNlbnR1cmllc19zaW5jZV8xNzAwKHlyKSArIHF1YWRfY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpKQorCitzdGF0aWMgdm9pZCBjZW50ZXIoY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZGF5X2FycmF5KHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQgKik7CitzdGF0aWMgdm9pZCB0cmltX3RyYWlsaW5nX3NwYWNlc19hbmRfcHJpbnQoY2hhciAqKTsKKworc3RhdGljIHZvaWQgYmxhbmtfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CitzdGF0aWMgY2hhciAqYnVpbGRfcm93KGNoYXIgKnAsIHVuc2lnbmVkICpkcCk7CisKKyNkZWZpbmUJREFZX0xFTgkJMwkJLyogMyBzcGFjZXMgcGVyIGRheSAqLworI2RlZmluZQlKX0RBWV9MRU4JKERBWV9MRU4gKyAxKQorI2RlZmluZQlXRUVLX0xFTgkyMAkJLyogNyAqIDMgLSBvbmUgc3BhY2UgYXQgdGhlIGVuZCAqLworI2RlZmluZQlKX1dFRUtfTEVOCShXRUVLX0xFTiArIDcpCisjZGVmaW5lCUhFQURfU0VQCTIJCS8qIHNwYWNlcyBiZXR3ZWVuIGRheSBoZWFkaW5ncyAqLworCitpbnQgY2FsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjYWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0bSB6ZXJvX3RtOworCXRpbWVfdCBub3c7CisJdW5zaWduZWQgbW9udGgsIHllYXIsIGZsYWdzLCBpOworCWNoYXIgKm1vbnRoX25hbWVzWzEyXTsKKwkvKiBub3JtYWwgaGVhZGluZzogKi8KKwkvKiAiU3UgTW8gVHUgV2UgVGggRnIgU2EiICovCisJLyogLWogaGVhZGluZzogKi8KKwkvKiAiIFN1ICBNbyAgVHUgIFdlICBUaCAgRnIgIFNhIiAqLworCWNoYXIgZGF5X2hlYWRpbmdzW0VOQUJMRV9VTklDT0RFX1NVUFBPUlQgPyAyOCAqIDYgOiAyOF07CisJSUZfVU5JQ09ERV9TVVBQT1JUKGNoYXIgKmhwID0gZGF5X2hlYWRpbmdzOykKKwljaGFyIGJ1Zls0MF07CisKKwlpbml0X3VuaWNvZGUoKTsKKworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImp5Iik7CisJLyogVGhpcyBzZXRzIGp1bGlhbiA9IGZsYWdzICYgMTogKi8KKwlvcHRpb25fbWFzazMyICY9IDE7CisJbW9udGggPSAwOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzBdKSB7CisJCXN0cnVjdCB0bSAqcHRtOworCisJCXRpbWUoJm5vdyk7CisJCXB0bSA9IGxvY2FsdGltZSgmbm93KTsKKwkJeWVhciA9IHB0bS0+dG1feWVhciArIDE5MDA7CisJCWlmICghKGZsYWdzICYgMikpIHsgLyogbm8gLXkgKi8KKwkJCW1vbnRoID0gcHRtLT50bV9tb24gKyAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFyZ3ZbMV0pIHsKKwkJCWlmIChhcmd2WzJdKSB7CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJfQorCQkJaWYgKCEoZmxhZ3MgJiAyKSkgeyAvKiBubyAteSAqLworCQkJCW1vbnRoID0geGF0b3VfcmFuZ2UoKmFyZ3YsIDEsIDEyKTsKKwkJCX0KKwkJCWFyZ3YrKzsKKwkJfQorCQl5ZWFyID0geGF0b3VfcmFuZ2UoKmFyZ3YsIDEsIDk5OTkpOworCX0KKworCWJsYW5rX3N0cmluZyhkYXlfaGVhZGluZ3MsIHNpemVvZihkYXlfaGVhZGluZ3MpIC0gNyArIDcqanVsaWFuKTsKKworCWkgPSAwOworCWRvIHsKKwkJemVyb190bS50bV9tb24gPSBpOworCQkvKiBmdWxsIG1vbnRoIG5hbWUgYWNjb3JkaW5nIHRvIGxvY2FsZSAqLworCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJUIiLCAmemVyb190bSk7CisJCW1vbnRoX25hbWVzW2ldID0geHN0cmR1cChidWYpOworCisJCWlmIChpIDwgNykgeworCQkJemVyb190bS50bV93ZGF5ID0gaTsKKwkJCS8qIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZSBhY2NvcmRpbmcgdG8gbG9jYWxlICovCisJCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJWEiLCAmemVyb190bSk7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJaWYgKGp1bGlhbikKKwkJCQkqaHArKyA9ICcgJzsKKwkJCXsKKwkJCQljaGFyICp0d29fd2NoYXJzID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qTlVMTCwqLyBidWYsIDIpOworCQkJCXN0cmNweShocCwgdHdvX3djaGFycyk7CisJCQkJZnJlZSh0d29fd2NoYXJzKTsKKwkJCX0KKwkJCWhwICs9IHN0cmxlbihocCk7CisJCQkqaHArKyA9ICcgJzsKKyNlbHNlCisJCQlzdHJuY3B5KGRheV9oZWFkaW5ncyArIGkgKiAoMytqdWxpYW4pICsganVsaWFuLCBidWYsIDIpOworI2VuZGlmCisJCX0KKwl9IHdoaWxlICgrK2kgPCAxMik7CisJSUZfVU5JQ09ERV9TVVBQT1JUKGhwWy0xXSA9ICdcMCc7KQorCisJaWYgKG1vbnRoKSB7CisJCXVuc2lnbmVkIHJvdywgbGVuLCBkYXlzW01BWERBWVNdOworCQl1bnNpZ25lZCAqZHAgPSBkYXlzOworCQljaGFyIGxpbmVvdXRbMzBdOworCisJCWRheV9hcnJheShtb250aCwgeWVhciwgZHApOworCQlsZW4gPSBzcHJpbnRmKGxpbmVvdXQsICIlcyAlZCIsIG1vbnRoX25hbWVzW21vbnRoIC0gMV0sIHllYXIpOworCQlwcmludGYoIiUqcyVzXG4lc1xuIiwKKwkJCSAgICgoNypqdWxpYW4gKyBXRUVLX0xFTikgLSBsZW4pIC8gMiwgIiIsCisJCQkgICBsaW5lb3V0LCBkYXlfaGVhZGluZ3MpOworCQlmb3IgKHJvdyA9IDA7IHJvdyA8IDY7IHJvdysrKSB7CisJCQlidWlsZF9yb3cobGluZW91dCwgZHApWzBdID0gJ1wwJzsKKwkJCWRwICs9IDc7CisJCQl0cmltX3RyYWlsaW5nX3NwYWNlc19hbmRfcHJpbnQobGluZW91dCk7CisJCX0KKwl9IGVsc2UgeworCQl1bnNpZ25lZCByb3csIHdoaWNoX2NhbCwgd2Vla19sZW4sIGRheXNbMTJdW01BWERBWVNdOworCQl1bnNpZ25lZCAqZHA7CisJCWNoYXIgbGluZW91dFs4MF07CisKKwkJc3ByaW50ZihsaW5lb3V0LCAiJXUiLCB5ZWFyKTsKKwkJY2VudGVyKGxpbmVvdXQsCisJCQkgICAoV0VFS19MRU4gKiAzICsgSEVBRF9TRVAgKiAyKQorCQkJICAgKyBqdWxpYW4gKiAoSl9XRUVLX0xFTiAqIDIgKyBIRUFEX1NFUAorCQkJCQkJICAgLSAoV0VFS19MRU4gKiAzICsgSEVBRF9TRVAgKiAyKSksCisJCQkgICAwKTsKKwkJcHV0cygiXG4iKTsJCS8qIHR3byBcbidzICovCisJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCQlkYXlfYXJyYXkoaSArIDEsIHllYXIsIGRheXNbaV0pOworCQl9CisJCWJsYW5rX3N0cmluZyhsaW5lb3V0LCBzaXplb2YobGluZW91dCkpOworCQl3ZWVrX2xlbiA9IFdFRUtfTEVOICsganVsaWFuICogKEpfV0VFS19MRU4gLSBXRUVLX0xFTik7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCArPSAzLWp1bGlhbikgeworCQkJY2VudGVyKG1vbnRoX25hbWVzW21vbnRoXSwgd2Vla19sZW4sIEhFQURfU0VQKTsKKwkJCWlmICghanVsaWFuKSB7CisJCQkJY2VudGVyKG1vbnRoX25hbWVzW21vbnRoICsgMV0sIHdlZWtfbGVuLCBIRUFEX1NFUCk7CisJCQl9CisJCQljZW50ZXIobW9udGhfbmFtZXNbbW9udGggKyAyIC0ganVsaWFuXSwgd2Vla19sZW4sIDApOworCQkJcHJpbnRmKCJcbiVzJSpzJXMiLCBkYXlfaGVhZGluZ3MsIEhFQURfU0VQLCAiIiwgZGF5X2hlYWRpbmdzKTsKKwkJCWlmICghanVsaWFuKSB7CisJCQkJcHJpbnRmKCIlKnMlcyIsIEhFQURfU0VQLCAiIiwgZGF5X2hlYWRpbmdzKTsKKwkJCX0KKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlmb3IgKHJvdyA9IDA7IHJvdyA8ICg2KjcpOyByb3cgKz0gNykgeworCQkJCWZvciAod2hpY2hfY2FsID0gMDsgd2hpY2hfY2FsIDwgMy1qdWxpYW47IHdoaWNoX2NhbCsrKSB7CisJCQkJCWRwID0gZGF5c1ttb250aCArIHdoaWNoX2NhbF0gKyByb3c7CisJCQkJCWJ1aWxkX3JvdyhsaW5lb3V0ICsgd2hpY2hfY2FsICogKHdlZWtfbGVuICsgMiksIGRwKTsKKwkJCQl9CisJCQkJLyogYmxhbmtfc3RyaW5nIHRvb2sgY2FyZSBvZiBudWwgdGVybWluYXRpb24uICovCisJCQkJdHJpbV90cmFpbGluZ19zcGFjZXNfYW5kX3ByaW50KGxpbmVvdXQpOworCQkJfQorCQl9CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCisvKgorICogZGF5X2FycmF5IC0tCisgKglGaWxsIGluIGFuIGFycmF5IG9mIDQyIGludGVnZXJzIHdpdGggYSBjYWxlbmRhci4gIEFzc3VtZSBmb3IgYSBtb21lbnQKKyAqCXRoYXQgeW91IHRvb2sgdGhlIChtYXhpbXVtKSA2IHJvd3MgaW4gYSBjYWxlbmRhciBhbmQgc3RyZXRjaGVkIHRoZW0KKyAqCW91dCBlbmQgdG8gZW5kLiAgWW91IHdvdWxkIGhhdmUgNDIgbnVtYmVycyBvciBzcGFjZXMuICBUaGlzIHJvdXRpbmUKKyAqCWJ1aWxkcyB0aGF0IGFycmF5IGZvciBhbnkgbW9udGggZnJvbSBKYW4uIDEgdGhyb3VnaCBEZWMuIDk5OTkuCisgKi8KK3N0YXRpYyB2b2lkIGRheV9hcnJheSh1bnNpZ25lZCBtb250aCwgdW5zaWduZWQgeWVhciwgdW5zaWduZWQgKmRheXMpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgZGF5LCBkdywgZG07CisKKwltZW1zZXQoZGF5cywgU1BBQ0UsIE1BWERBWVMgKiBzaXplb2YoaW50KSk7CisKKwlpZiAoKG1vbnRoID09IDkpICYmICh5ZWFyID09IDE3NTIpKSB7CisJCS8qIEFzc3VtZXMgdGhlIEdyZWdvcmlhbiByZWZvcm1hdGlvbiBlbGltaW5hdGVzCisJCSAqIDMgU2VwLiAxNzUyIHRocm91Z2ggMTMgU2VwLiAxNzUyLgorCQkgKi8KKwkJdW5zaWduZWQgal9vZmZzZXQgPSBqdWxpYW4gKiAyNDQ7CisJCXNpemVfdCBvZGF5ID0gMDsKKworCQlkbyB7CisJCQlkYXlzW29kYXkrMl0gPSBzZXAxNzUyW29kYXldICsgal9vZmZzZXQ7CisJCX0gd2hpbGUgKCsrb2RheSA8IHNpemVvZihzZXAxNzUyKSk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIGRheV9pbl95ZWFyCisJICogcmV0dXJuIHRoZSAxIGJhc2VkIGRheSBudW1iZXIgd2l0aGluIHRoZSB5ZWFyCisJICovCisJZGF5ID0gMTsKKwlpZiAoKG1vbnRoID4gMikgJiYgbGVhcF95ZWFyKHllYXIpKSB7CisJCSsrZGF5OworCX0KKworCWkgPSBtb250aDsKKwl3aGlsZSAoaSkgeworCQlkYXkgKz0gZGF5c19pbl9tb250aFstLWldOworCX0KKworCS8qIGRheV9pbl93ZWVrCisJICogcmV0dXJuIHRoZSAwIGJhc2VkIGRheSBudW1iZXIgZm9yIGFueSBkYXRlIGZyb20gMSBKYW4uIDEgdG8KKwkgKiAzMSBEZWMuIDk5OTkuICBBc3N1bWVzIHRoZSBHcmVnb3JpYW4gcmVmb3JtYXRpb24gZWxpbWluYXRlcworCSAqIDMgU2VwLiAxNzUyIHRocm91Z2ggMTMgU2VwLiAxNzUyLiAgUmV0dXJucyBUaHVyc2RheSBmb3IgYWxsCisJICogbWlzc2luZyBkYXlzLgorCSAqLworCXRlbXAgPSAobG9uZykoeWVhciAtIDEpICogMzY1ICsgbGVhcF95ZWFyc19zaW5jZV95ZWFyXzEoeWVhciAtIDEpICsgZGF5OworCWlmICh0ZW1wIDwgRklSU1RfTUlTU0lOR19EQVkpIHsKKwkJZHcgPSAoKHRlbXAgLSAxICsgU0FUVVJEQVkpICUgNyk7CisJfSBlbHNlIHsKKwkJZHcgPSAoKCh0ZW1wIC0gMSArIFNBVFVSREFZKSAtIE5VTUJFUl9NSVNTSU5HX0RBWVMpICUgNyk7CisJfQorCisJaWYgKCFqdWxpYW4pIHsKKwkJZGF5ID0gMTsKKwl9CisKKwlkbSA9IGRheXNfaW5fbW9udGhbbW9udGhdOworCWlmICgobW9udGggPT0gMikgJiYgbGVhcF95ZWFyKHllYXIpKSB7CisJCSsrZG07CisJfQorCisJZG8geworCQlkYXlzW2R3KytdID0gZGF5Kys7CisJfSB3aGlsZSAoLS1kbSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyaW1fdHJhaWxpbmdfc3BhY2VzX2FuZF9wcmludChjaGFyICpzKQoreworCWNoYXIgKnAgPSBzOworCisJd2hpbGUgKCpwKSB7CisJCSsrcDsKKwl9CisJd2hpbGUgKHAgIT0gcykgeworCQktLXA7CisJCWlmICghaXNzcGFjZSgqcCkpIHsKKwkJCXBbMV0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwdXRzKHMpOworfQorCitzdGF0aWMgdm9pZCBjZW50ZXIoY2hhciAqc3RyLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHNlcGFyYXRlKQoreworCXVuc2lnbmVkIG4gPSBzdHJsZW4oc3RyKTsKKwlsZW4gLT0gbjsKKwlwcmludGYoIiUqcyUqcyIsIChsZW4vMikgKyBuLCBzdHIsIChsZW4vMikgKyAobGVuICUgMikgKyBzZXBhcmF0ZSwgIiIpOworfQorCitzdGF0aWMgdm9pZCBibGFua19zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCW1lbXNldChidWYsICcgJywgYnVmbGVuKTsKKwlidWZbYnVmbGVuLTFdID0gJ1wwJzsKK30KKworc3RhdGljIGNoYXIgKmJ1aWxkX3JvdyhjaGFyICpwLCB1bnNpZ25lZCAqZHApCit7CisJdW5zaWduZWQgY29sLCB2YWwsIGRheTsKKworCW1lbXNldChwLCAnICcsIChqdWxpYW4gKyBEQVlfTEVOKSAqIDcpOworCisJY29sID0gMDsKKwlkbyB7CisJCWRheSA9ICpkcCsrOworCQlpZiAoZGF5ICE9IFNQQUNFKSB7CisJCQlpZiAoanVsaWFuKSB7CisJCQkJKytwOworCQkJCWlmIChkYXkgPj0gMTAwKSB7CisJCQkJCSpwID0gJzAnOworCQkJCQlwWy0xXSA9IChkYXkgLyAxMDApICsgJzAnOworCQkJCQlkYXkgJT0gMTAwOworCQkJCX0KKwkJCX0KKwkJCXZhbCA9IGRheSAvIDEwOworCQkJaWYgKHZhbCA+IDApIHsKKwkJCQkqcCA9IHZhbCArICcwJzsKKwkJCX0KKwkJCSorK3AgPSBkYXkgJSAxMCArICcwJzsKKwkJCXAgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCXAgKz0gREFZX0xFTiArIGp1bGlhbjsKKwkJfQorCX0gd2hpbGUgKCsrY29sIDwgNyk7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2ltIExldGtlbWFuLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2NhdC5jIGIvY29yZXV0aWxzL2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzM4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2F0LmMKQEAgLTAsMCArMSw2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2F0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2F0Lmh0bWwgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NBVCkgICAgICs9IGNhdC5vCisvL2tidWlsZDpsaWItJChDT05GSUdfTU9SRSkgICAgKz0gY2F0Lm8gIyBtb3JlIHVzZXMgaXQgaWYgc3Rkb3V0IGlzbid0IGEgdHR5CisvL2tidWlsZDpsaWItJChDT05GSUdfTEVTUykgICAgKz0gY2F0Lm8gIyBsZXNzIHRvbworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NST05UQUIpICs9IGNhdC5vICMgY3JvbnRhYiAtbAorCisvL2NvbmZpZzpjb25maWcgQ0FUCisvL2NvbmZpZzoJYm9vbCAiY2F0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGNhdCBpcyB1c2VkIHRvIGNvbmNhdGVuYXRlIGZpbGVzIGFuZCBwcmludCB0aGVtIHRvIHRoZSBzdGFuZGFyZAorLy9jb25maWc6CSAgb3V0cHV0LiBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZSAnY2F0JyB1dGlsaXR5LgorCisvL3VzYWdlOiNkZWZpbmUgY2F0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgY2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29uY2F0ZW5hdGUgRklMRXMgYW5kIHByaW50IHRoZW0gdG8gc3Rkb3V0IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjYXRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgY2F0IC9wcm9jL3VwdGltZVxuIgorLy91c2FnZTogICAgICAgIjExMDcxNi43MiAxNy42NyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworaW50IGJiX2NhdChjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworCWlmICghKmFyZ3YpCisJCWFyZ3YgPSAoY2hhcioqKSAmYmJfYXJndl9kYXNoOworCisJZG8geworCQlmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWlmIChmZCA+PSAwKSB7CisJCQkvKiBUaGlzIGlzIG5vdCBhIHhmdW5jIC0gbmV2ZXIgZXhpdHMgKi8KKwkJCW9mZl90IHIgPSBiYl9jb3B5ZmRfZW9mKGZkLCBTVERPVVRfRklMRU5PKTsKKwkJCWlmIChmZCAhPSBTVERJTl9GSUxFTk8pCisJCQkJY2xvc2UoZmQpOworCQkJaWYgKHIgPj0gMCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgY2F0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjYXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJ1Iik7CisJYXJndiArPSBvcHRpbmQ7CisJcmV0dXJuIGJiX2NhdChhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jYXR2LmMgYi9jb3JldXRpbHMvY2F0di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGI0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2F0di5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNhdCAtdiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogU2VlICJDYXQgLXYgY29uc2lkZXJlZCBoYXJtZnVsIiBhdAorICogaHR0cDovL2NtLmJlbGwtbGFicy5jb20vY20vY3MvZG9jLzg0L2twLnBzLmd6ICovCisKKy8vdXNhZ2U6I2RlZmluZSBjYXR2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWV0dl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGNhdHZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IG5vbnByaW50aW5nIGNoYXJhY3RlcnMgYXMgXnggb3IgTS14XG4iCisvL3VzYWdlOiAgICAgIlxuCS1lCUVuZCBlYWNoIGxpbmUgd2l0aCAkIgorLy91c2FnZTogICAgICJcbgktdAlTaG93IHRhYnMgYXMgXkkiCisvL3VzYWdlOiAgICAgIlxuCS12CURvbid0IHVzZSBeeCBvciBNLXggZXNjYXBlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBjYXR2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjYXR2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWludCBmZDsKKwl1bnNpZ25lZCBmbGFnczsKKworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImV0diIpOworI2RlZmluZSBDQVRWX09QVF9lICgxPDwwKQorI2RlZmluZSBDQVRWX09QVF90ICgxPDwxKQorI2RlZmluZSBDQVRWX09QVF92ICgxPDwyKQorCWZsYWdzIF49IENBVFZfT1BUX3Y7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBSZWFkIGZyb20gc3RkaW4gaWYgdGhlcmUncyBub3RoaW5nIGVsc2UgdG8gZG8uICovCisJaWYgKCFhcmd2WzBdKQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKwlkbyB7CisJCWZkID0gb3Blbl9vcl93YXJuX3N0ZGluKCphcmd2KTsKKwkJaWYgKGZkIDwgMCkgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKwkJZm9yICg7OykgeworCQkJaW50IGksIHJlczsKKworI2RlZmluZSByZWFkX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCQkJcmVzID0gcmVhZChmZCwgcmVhZF9idWYsIENPTU1PTl9CVUZTSVpFKTsKKwkJCWlmIChyZXMgPCAwKQorCQkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCWlmIChyZXMgPCAxKQorCQkJCWJyZWFrOworCQkJZm9yIChpID0gMDsgaSA8IHJlczsgaSsrKSB7CisJCQkJdW5zaWduZWQgY2hhciBjID0gcmVhZF9idWZbaV07CisKKwkJCQlpZiAoYyA+IDEyNiAmJiAoZmxhZ3MgJiBDQVRWX09QVF92KSkgeworCQkJCQlpZiAoYyA9PSAxMjcpIHsKKwkJCQkJCXByaW50ZigiXj8iKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXByaW50ZigiTS0iKTsKKwkJCQkJYyAtPSAxMjg7CisJCQkJfQorCQkJCWlmIChjIDwgMzIpIHsKKwkJCQkJaWYgKGMgPT0gMTApIHsKKwkJCQkJCWlmIChmbGFncyAmIENBVFZfT1BUX2UpCisJCQkJCQkJYmJfcHV0Y2hhcignJCcpOworCQkJCQl9IGVsc2UgaWYgKGZsYWdzICYgKGM9PTkgPyBDQVRWX09QVF90IDogQ0FUVl9PUFRfdikpIHsKKwkJCQkJCXByaW50ZigiXiVjIiwgYysnQCcpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJYmJfcHV0Y2hhcihjKTsKKwkJCX0KKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgZmQpCisJCQljbG9zZShmZCk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY2hncnAuYyBiL2NvcmV1dGlscy9jaGdycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzZkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2hncnAuYwpAQCAtMCwwICsxLDUzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNoZ3JwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgZGVmZWN0cyAtIG5vbmU/ICovCisvKiBCQl9BVURJVCBHTlUgZGVmZWN0cyAtIHVuc3VwcG9ydGVkIGxvbmcgb3B0aW9ucy4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2hncnAuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgY2hncnBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUmhMSFAiSUZfREVTS1RPUCgiY3ZmIikiXS4uLiBHUk9VUCBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIGNoZ3JwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHRoZSBncm91cCBtZW1iZXJzaGlwIG9mIGVhY2ggRklMRSB0byBHUk9VUFxuIgorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktaAlBZmZlY3Qgc3ltbGlua3MgaW5zdGVhZCBvZiBzeW1saW5rIHRhcmdldHMiCisvL3VzYWdlOiAgICAgIlxuCS1MCVRyYXZlcnNlIGFsbCBzeW1saW5rcyB0byBkaXJlY3RvcmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJVHJhdmVyc2Ugc3ltbGlua3Mgb24gY29tbWFuZCBsaW5lIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1QCURvbid0IHRyYXZlcnNlIHN5bWxpbmtzIChkZWZhdWx0KSIKKy8vdXNhZ2U6CUlGX0RFU0tUT1AoCisvL3VzYWdlOiAgICAgIlxuCS1jCUxpc3QgY2hhbmdlZCBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJSGlkZSBlcnJvcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGNoZ3JwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2hncnAgcm9vdCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICItci0tci0tci0tICAgIDEgYW5kZXJzZW4gcm9vdCAgICAgICAgICAgIDAgQXByIDEyIDE4OjI1IC90bXAvZm9vXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKK2ludCBjaGdycF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hncnBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyogImNoZ3JwIFtvcHRzXSBhYmMgZmlsZShzKSIgPT0gImNob3duIFtvcHRzXSA6YWJjIGZpbGUocykiICovCisJY2hhciAqKnAgPSBhcmd2OworCXdoaWxlICgqKytwKSB7CisJCWlmIChwWzBdWzBdICE9ICctJykgeworCQkJcFswXSA9IHhhc3ByaW50ZigiOiVzIiwgcFswXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY2hvd25fbWFpbihhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jaG1vZC5jIGIvY29yZXV0aWxzL2NobW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNDViOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jaG1vZC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNobW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIFJld29ya2VkIGJ5IChDKSAyMDAyIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqICB0byBjb3JyZWN0bHkgcGFyc2UgJy1yd3hnb2EnCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIEJCX0FVRElUIEdOVSBkZWZlY3RzIC0gdW5zdXBwb3J0ZWQgbG9uZyBvcHRpb25zLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9jaG1vZC5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaG1vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1SIklGX0RFU0tUT1AoImN2ZiIpIl0gTU9ERVssTU9ERV0uLi4gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjaG1vZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVhY2ggTU9ERSBpcyBvbmUgb3IgbW9yZSBvZiB0aGUgbGV0dGVycyB1Z29hLCBvbmUgb2YgdGhlXG4iCisvL3VzYWdlOiAgICAgICAic3ltYm9scyArLT0gYW5kIG9uZSBvciBtb3JlIG9mIHRoZSBsZXR0ZXJzIHJ3eHN0XG4iCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOglJRl9ERVNLVE9QKAorLy91c2FnZTogICAgICJcbgktYwlMaXN0IGNoYW5nZWQgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CUxpc3QgYWxsIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktZglIaWRlIGVycm9ycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgY2htb2RfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICItcnctcnctci0tICAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgICAgIDAgQXByIDEyIDE4OjI1IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBjaG1vZCB1K3ggL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3eHJ3LXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2ZvbypcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNobW9kIDQ0NCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICItci0tci0tci0tICAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgICAgIDAgQXByIDEyIDE4OjI1IC90bXAvZm9vXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKyNkZWZpbmUgT1BUX1JFQ1VSU0UgKG9wdGlvbl9tYXNrMzIgJiAxKQorI2RlZmluZSBPUFRfVkVSQk9TRSAoSUZfREVTS1RPUChvcHRpb25fbWFzazMyICYgMikgSUZfTk9UX0RFU0tUT1AoMCkpCisjZGVmaW5lIE9QVF9DSEFOR0VEIChJRl9ERVNLVE9QKG9wdGlvbl9tYXNrMzIgJiA0KSBJRl9OT1RfREVTS1RPUCgwKSkKKyNkZWZpbmUgT1BUX1FVSUVUICAgKElGX0RFU0tUT1Aob3B0aW9uX21hc2szMiAmIDgpIElGX05PVF9ERVNLVE9QKDApKQorI2RlZmluZSBPUFRfU1RSICAgICAiUiIgSUZfREVTS1RPUCgidmNmIikKKworLyogY29yZXV0aWxzOgorICogY2htb2QgbmV2ZXIgY2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2Ygc3ltYm9saWMgbGlua3M7IHRoZSBjaG1vZAorICogc3lzdGVtIGNhbGwgY2Fubm90IGNoYW5nZSB0aGVpciBwZXJtaXNzaW9ucy4gVGhpcyBpcyBub3QgYSBwcm9ibGVtCisgKiBzaW5jZSB0aGUgcGVybWlzc2lvbnMgb2Ygc3ltYm9saWMgbGlua3MgYXJlIG5ldmVyIHVzZWQuCisgKiBIb3dldmVyLCBmb3IgZWFjaCBzeW1ib2xpYyBsaW5rIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBjaG1vZCBjaGFuZ2VzCisgKiB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIHBvaW50ZWQtdG8gZmlsZS4gSW4gY29udHJhc3QsIGNobW9kIGlnbm9yZXMKKyAqIHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIGR1cmluZyByZWN1cnNpdmUgZGlyZWN0b3J5IHRyYXZlcnNhbHMuCisgKi8KKworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsIHZvaWQqIHBhcmFtLCBpbnQgZGVwdGgpCit7CisJbW9kZV90IG5ld21vZGU7CisKKwkvKiBtYXRjaCBjb3JldXRpbHMgYmVoYXZpb3IgKi8KKwlpZiAoZGVwdGggPT0gMCkgeworCQkvKiBzdGF0YnVmIGhvbGRzIGxzdGF0IHJlc3VsdCwgYnV0IHdlIG5lZWQgc3RhdCAoZm9sbG93IGxpbmspICovCisJCWlmIChzdGF0KGZpbGVOYW1lLCBzdGF0YnVmKSkKKwkJCWdvdG8gZXJyOworCX0gZWxzZSB7IC8qIGRlcHRoID4gMDogc2tpcCBsaW5rcyAqLworCQlpZiAoU19JU0xOSyhzdGF0YnVmLT5zdF9tb2RlKSkKKwkJCXJldHVybiBUUlVFOworCX0KKwluZXdtb2RlID0gc3RhdGJ1Zi0+c3RfbW9kZTsKKworCWlmICghYmJfcGFyc2VfbW9kZSgoY2hhciAqKXBhcmFtLCAmbmV3bW9kZSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIG1vZGUgJyVzJyIsIChjaGFyICopcGFyYW0pOworCisJaWYgKGNobW9kKGZpbGVOYW1lLCBuZXdtb2RlKSA9PSAwKSB7CisJCWlmIChPUFRfVkVSQk9TRQorCQkgfHwgKE9QVF9DSEFOR0VEICYmIHN0YXRidWYtPnN0X21vZGUgIT0gbmV3bW9kZSkKKwkJKSB7CisJCQlwcmludGYoIm1vZGUgb2YgJyVzJyBjaGFuZ2VkIHRvICUwNG8gKCVzKVxuIiwgZmlsZU5hbWUsCisJCQkJbmV3bW9kZSAmIDA3Nzc3LCBiYl9tb2RlX3N0cmluZyhuZXdtb2RlKSsxKTsKKwkJfQorCQlyZXR1cm4gVFJVRTsKKwl9CisgZXJyOgorCWlmICghT1BUX1FVSUVUKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlTmFtZSk7CisJcmV0dXJuIEZBTFNFOworfQorCitpbnQgY2htb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNobW9kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWNoYXIgKmFyZywgKiphcmdwOworCWNoYXIgKnNtb2RlOworCisJLyogQ29udmVydCBmaXJzdCBlbmNvdW50ZXJlZCAtciBpbnRvIGFyLCAtdyBpbnRvIGF3IGV0YworCSAqIHNvIHRoYXQgZ2V0b3B0IHdvdWxkIG5vdCBlYXQgaXQgKi8KKwlhcmdwID0gYXJndjsKKwl3aGlsZSAoKGFyZyA9ICorK2FyZ3ApKSB7CisJCS8qIE1vZGUgc3BlYyBtdXN0IGJlIHRoZSBmaXJzdCBhcmcgKHNhbnMgLVIgZXRjKSAqLworCQkvKiAocHJvdGVjdCBhZ2FpbnN0IG1pc2hhbmRsaW5nIGUuZy4gImNobW9kIDY0NCAtciIpICovCisJCWlmIChhcmdbMF0gIT0gJy0nKSB7CisJCQlhcmcgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJLyogQW4gb3B0aW9uLiBOb3QgYSAtLSBvciB2YWxpZCBvcHRpb24/ICovCisJCWlmIChhcmdbMV0gJiYgIXN0cmNocigiLSJPUFRfU1RSLCBhcmdbMV0pKSB7CisJCQlhcmdbMF0gPSAnYSc7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMiI7CisJZ2V0b3B0MzIoYXJndiwgKCItIk9QVF9TVFIpICsgMSk7IC8qIFJldXNlIHN0cmluZyAqLworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogUmVzdG9yZSBvcHRpb24tbGlrZSBtb2RlIGlmIG5lZWRlZCAqLworCWlmIChhcmcpIGFyZ1swXSA9ICctJzsKKworCS8qIE9rLCByZWFkeSB0byBkbyB0aGUgZGVlZCBub3cgKi8KKwlzbW9kZSA9ICphcmd2Kys7CisJZG8geworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24oKmFyZ3YsCisJCQlPUFRfUkVDVVJTRSwgICAgLy8gcmVjdXJzZQorCQkJZmlsZUFjdGlvbiwgICAgIC8vIGZpbGUgYWN0aW9uCisJCQlmaWxlQWN0aW9uLCAgICAgLy8gZGlyIGFjdGlvbgorCQkJc21vZGUsICAgICAgICAgIC8vIHVzZXIgZGF0YQorCQkJMCkgICAgICAgICAgICAgIC8vIGRlcHRoCisJCSkgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorU2VjdXJpdHk6IGNobW9kIGlzIHRvbyBpbXBvcnRhbnQgYW5kIHRvbyBzdWJ0bGUuCitUaGlzIGlzIGEgdGVzdCBzY3JpcHQgKGJ1c3lib3ggY2htb2QgdmVyc3VzIGNvcmV1dGlscykuCitSdW4gaXQgaW4gZW1wdHkgZGlyZWN0b3J5LgorCisjIS9iaW4vc2gKK3QxPSIvdG1wL2J1c3lib3ggY2htb2QiCit0Mj0iL3Vzci9iaW4vY2htb2QiCitjcmVhdGUoKSB7CisgICAgcm0gLXJmICQxOyBta2RpciAkMQorICAgICgKKyAgICBjZCAkMSB8fCBleGl0IDEKKyAgICBta2RpciBkaXIKKyAgICA+dXAKKyAgICA+ZmlsZQorICAgID5kaXIvZmlsZQorICAgIGxuIC1zIGRpciBsaW5rZGlyCisgICAgbG4gLXMgZmlsZSBsaW5rZmlsZQorICAgIGxuIC1zIC4uL3VwIGRpci91cAorICAgICkKK30KK3RzdCgpIHsKKyAgICAoY2QgdGVzdDE7ICR0MSAkMSkKKyAgICAoY2QgdGVzdDI7ICR0MiAkMSkKKyAgICAoY2QgdGVzdDE7IGxzIC1sUikgPm91dDEKKyAgICAoY2QgdGVzdDI7IGxzIC1sUikgPm91dDIKKyAgICBlY2hvICJjaG1vZCAkMSIgPm91dC5kaWZmCisgICAgaWYgISBkaWZmIC11IG91dDEgb3V0MiA+Pm91dC5kaWZmOyB0aGVuIGV4aXQgMTsgZmkKKyAgICBybSBvdXQuZGlmZgorfQorZWNobyAiSWYgc2NyaXB0IHByb2R1Y2VkICdvdXQuZGlmZicgZmlsZSwgdGhlbiBhdCBsZWFzdCBvbmUgdGVzdGNhc2UgZmFpbGVkIgorY3JlYXRlIHRlc3QxOyBjcmVhdGUgdGVzdDIKK3RzdCAiYSt3IGZpbGUiCit0c3QgImEtdyBkaXIiCit0c3QgImErdyBsaW5rZmlsZSIKK3RzdCAiYS13IGxpbmtkaXIiCit0c3QgIi1SIGErdyBmaWxlIgordHN0ICItUiBhLXcgZGlyIgordHN0ICItUiBhK3cgbGlua2ZpbGUiCit0c3QgIi1SIGEtdyBsaW5rZGlyIgordHN0ICJhLXIsYSt4IGxpbmtmaWxlIgorKi8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jaG93bi5jIGIvY29yZXV0aWxzL2Nob3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxNjZkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jaG93bi5jCkBAIC0wLDAgKzEsMjIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNob3duIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgZGVmZWN0cyAtIG5vbmU/ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2Nob3duLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGNob3duX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLVJoTEhQIklGX0RFU0tUT1AoImN2ZiIpIl0uLi4gT1dORVJbPC58Oj5bR1JPVVBdXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIGNob3duX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHRoZSBvd25lciBhbmQvb3IgZ3JvdXAgb2YgZWFjaCBGSUxFIHRvIE9XTkVSIGFuZC9vciBHUk9VUFxuIgorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktaAlBZmZlY3Qgc3ltbGlua3MgaW5zdGVhZCBvZiBzeW1saW5rIHRhcmdldHMiCisvL3VzYWdlOiAgICAgIlxuCS1MCVRyYXZlcnNlIGFsbCBzeW1saW5rcyB0byBkaXJlY3RvcmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJVHJhdmVyc2Ugc3ltbGlua3Mgb24gY29tbWFuZCBsaW5lIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1QCURvbid0IHRyYXZlcnNlIHN5bWxpbmtzIChkZWZhdWx0KSIKKy8vdXNhZ2U6CUlGX0RFU0tUT1AoCisvL3VzYWdlOiAgICAgIlxuCS1jCUxpc3QgY2hhbmdlZCBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJTGlzdCBhbGwgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS1mCUhpZGUgZXJyb3JzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjaG93bl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yLS1yLS1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNob3duIHJvb3QgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIHJvb3QgICAgIGFuZGVyc2VuICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2hvd24gcm9vdC5yb290IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAibHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICItci0tci0tci0tICAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgICAgIDAgQXByIDEyIDE4OjI1IC90bXAvZm9vXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKyNkZWZpbmUgT1BUX1NUUiAgICAgKCJSaCIgSUZfREVTS1RPUCgidmNmTEhQIikpCisjZGVmaW5lIEJJVF9SRUNVUlNFIDEKKyNkZWZpbmUgT1BUX1JFQ1VSU0UgKG9wdCAmIDEpCisjZGVmaW5lIE9QVF9OT0RFUkVGIChvcHQgJiAyKQorI2RlZmluZSBPUFRfVkVSQk9TRSAoSUZfREVTS1RPUChvcHQgJiAweDA0KSBJRl9OT1RfREVTS1RPUCgwKSkKKyNkZWZpbmUgT1BUX0NIQU5HRUQgKElGX0RFU0tUT1Aob3B0ICYgMHgwOCkgSUZfTk9UX0RFU0tUT1AoMCkpCisjZGVmaW5lIE9QVF9RVUlFVCAgIChJRl9ERVNLVE9QKG9wdCAmIDB4MTApIElGX05PVF9ERVNLVE9QKDApKQorLyogUE9TSVggb3B0aW9ucworICogLUwgdHJhdmVyc2UgZXZlcnkgc3ltYm9saWMgbGluayB0byBhIGRpcmVjdG9yeSBlbmNvdW50ZXJlZAorICogLUggaWYgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgaXMgYSBzeW1ib2xpYyBsaW5rIHRvIGEgZGlyZWN0b3J5LCB0cmF2ZXJzZSBpdAorICogLVAgZG8gbm90IHRyYXZlcnNlIGFueSBzeW1ib2xpYyBsaW5rcyAoZGVmYXVsdCkKKyAqIFdlIGRvIG5vdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmc6CisgKiAiU3BlY2lmeWluZyBtb3JlIHRoYW4gb25lIG9mIC1ILCAtTCwgYW5kIC1QIGlzIG5vdCBhbiBlcnJvci4KKyAqIFRoZSBsYXN0IG9wdGlvbiBzcGVjaWZpZWQgc2hhbGwgZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgdXRpbGl0eS4iICovCisvKiAtTCAqLworI2RlZmluZSBCSVRfVFJBVkVSU0UgMHgyMAorI2RlZmluZSBPUFRfVFJBVkVSU0UgKElGX0RFU0tUT1Aob3B0ICYgQklUX1RSQVZFUlNFKSBJRl9OT1RfREVTS1RPUCgwKSkKKy8qIC1IIG9yIC1MICovCisjZGVmaW5lIEJJVF9UUkFWRVJTRV9UT1AgKDB4MjB8MHg0MCkKKyNkZWZpbmUgT1BUX1RSQVZFUlNFX1RPUCAoSUZfREVTS1RPUChvcHQgJiBCSVRfVFJBVkVSU0VfVE9QKSBJRl9OT1RfREVTS1RPUCgwKSkKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgY2hvd25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJyZWN1cnNpdmVcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgIlIiCisJImRlcmVmZXJlbmNlXDAiICAgICAgTm9fYXJndW1lbnQgICAiXHhmZiIKKwkibm8tZGVyZWZlcmVuY2VcMCIgICBOb19hcmd1bWVudCAgICJoIgorIyBpZiBFTkFCTEVfREVTS1RPUAorCSJjaGFuZ2VzXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgImMiCisJInNpbGVudFwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAiZiIKKwkicXVpZXRcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICJmIgorCSJ2ZXJib3NlXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgInYiCisjIGVuZGlmCisJOworI2VuZGlmCisKK3R5cGVkZWYgaW50ICgqY2hvd25fZnB0cikoY29uc3QgY2hhciAqLCB1aWRfdCwgZ2lkX3QpOworCitzdHJ1Y3QgcGFyYW1fdCB7CisJc3RydWN0IGJiX3VpZGdpZF90IHVnaWQ7CisJY2hvd25fZnB0ciBjaG93bl9mdW5jOworfTsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsCisJCXZvaWQgKnZwYXJhbSwgaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKyNkZWZpbmUgcGFyYW0gICgqKHN0cnVjdCBwYXJhbV90Kil2cGFyYW0pCisjZGVmaW5lIG9wdCBvcHRpb25fbWFzazMyCisJdWlkX3QgdSA9IChwYXJhbS51Z2lkLnVpZCA9PSAodWlkX3QpLTFMKSA/IHN0YXRidWYtPnN0X3VpZCA6IHBhcmFtLnVnaWQudWlkOworCWdpZF90IGcgPSAocGFyYW0udWdpZC5naWQgPT0gKGdpZF90KS0xTCkgPyBzdGF0YnVmLT5zdF9naWQgOiBwYXJhbS51Z2lkLmdpZDsKKworCWlmIChwYXJhbS5jaG93bl9mdW5jKGZpbGVOYW1lLCB1LCBnKSA9PSAwKSB7CisJCWlmIChPUFRfVkVSQk9TRQorCQkgfHwgKE9QVF9DSEFOR0VEICYmIChzdGF0YnVmLT5zdF91aWQgIT0gdSB8fCBzdGF0YnVmLT5zdF9naWQgIT0gZykpCisJCSkgeworCQkJcHJpbnRmKCJjaGFuZ2VkIG93bmVyc2hpcCBvZiAnJXMnIHRvICV1OiV1XG4iLAorCQkJCQlmaWxlTmFtZSwgKHVuc2lnbmVkKXUsICh1bnNpZ25lZClnKTsKKwkJfQorCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKCFPUFRfUVVJRVQpCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVOYW1lKTsKKwlyZXR1cm4gRkFMU0U7CisjdW5kZWYgb3B0CisjdW5kZWYgcGFyYW0KK30KKworaW50IGNob3duX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWludCBvcHQsIGZsYWdzOworCXN0cnVjdCBwYXJhbV90IHBhcmFtOworCisJLyogSnVzdCAtMSBtaWdodCBub3Qgd29yazogdWlkX3QgbWF5IGJlIHVuc2lnbmVkIGxvbmcgKi8KKwlwYXJhbS51Z2lkLnVpZCA9IC0xTDsKKwlwYXJhbS51Z2lkLmdpZCA9IC0xTDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBjaG93bl9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0yIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBPUFRfU1RSKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIFRoaXMgbWF0Y2hlcyBjb3JldXRpbHMgYmVoYXZpb3IgKGFsbW9zdCAtIHNlZSBiZWxvdykgKi8KKwlwYXJhbS5jaG93bl9mdW5jID0gY2hvd247CisJaWYgKE9QVF9OT0RFUkVGCisJICAgIC8qIHx8IChPUFRfUkVDVVJTRSAmJiAhT1BUX1RSQVZFUlNFX1RPUCk6ICovCisJICAgIElGX0RFU0tUT1AoIHx8IChvcHQgJiAoQklUX1JFQ1VSU0V8QklUX1RSQVZFUlNFX1RPUCkpID09IEJJVF9SRUNVUlNFKQorCSkgeworCQlwYXJhbS5jaG93bl9mdW5jID0gbGNob3duOworCX0KKworCWZsYWdzID0gQUNUSU9OX0RFUFRIRklSU1Q7IC8qIG1hdGNoIGNvcmV1dGlscyBvcmRlciAqLworCWlmIChPUFRfUkVDVVJTRSkKKwkJZmxhZ3MgfD0gQUNUSU9OX1JFQ1VSU0U7CisJaWYgKE9QVF9UUkFWRVJTRV9UT1ApCisJCWZsYWdzIHw9IEFDVElPTl9GT0xMT1dMSU5LU19MMDsgLyogLUgvLUw6IGZvbGxvdyBsaW5rcyBvbiBkZXB0aCAwICovCisJaWYgKE9QVF9UUkFWRVJTRSkKKwkJZmxhZ3MgfD0gQUNUSU9OX0ZPTExPV0xJTktTOyAvKiBmb2xsb3cgbGlua3MgaWYgLUwgKi8KKworCXBhcnNlX2Nob3duX3VzZXJncm91cF9vcl9kaWUoJnBhcmFtLnVnaWQsIGFyZ3ZbMF0pOworCisJLyogT2ssIHJlYWR5IHRvIGRvIHRoZSBkZWVkIG5vdyAqLworCXdoaWxlICgqKythcmd2KSB7CisJCWlmICghcmVjdXJzaXZlX2FjdGlvbigqYXJndiwKKwkJCQlmbGFncywgICAgICAgICAgLyogZmxhZ3MgKi8KKwkJCQlmaWxlQWN0aW9uLCAgICAgLyogZmlsZSBhY3Rpb24gKi8KKwkJCQlmaWxlQWN0aW9uLCAgICAgLyogZGlyIGFjdGlvbiAqLworCQkJCSZwYXJhbSwgICAgICAgICAvKiB1c2VyIGRhdGEgKi8KKwkJCQkwKSAgICAgICAgICAgICAgLyogZGVwdGggKi8KKwkJKSB7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorVGVzdGNhc2UuIFJ1biBpbiBlbXB0eSBkaXJlY3RvcnkuCisKKyMhL2Jpbi9zaAordDE9Ii90bXAvYnVzeWJveCBjaG93biIKK3QyPSIvdXNyL2Jpbi9jaG93biIKK2NyZWF0ZSgpIHsKKyAgICBybSAtcmYgJDE7IG1rZGlyICQxCisgICAgKAorICAgIGNkICQxIHx8IGV4aXQgMQorICAgIG1rZGlyIGRpciBkaXIyCisgICAgPnVwCisgICAgPmZpbGUKKyAgICA+ZGlyL2ZpbGUKKyAgICA+ZGlyMi9maWxlCisgICAgbG4gLXMgZGlyIGxpbmtkaXIKKyAgICBsbiAtcyBmaWxlIGxpbmtmaWxlCisgICAgbG4gLXMgLi4vdXAgZGlyL2xpbmt1cAorICAgIGxuIC1zIC4uL2RpcjIgZGlyL2xpbmt1cGRpcjIKKyAgICApCisgICAgY2hvd24gLVIgMDowICQxCit9Cit0c3QoKSB7CisgICAgY3JlYXRlIHRlc3QxCisgICAgY3JlYXRlIHRlc3QyCisgICAgZWNobyAiWyQxXSIgPj50ZXN0MS5vdXQKKyAgICBlY2hvICJbJDFdIiA+PnRlc3QyLm91dAorICAgIChjZCB0ZXN0MTsgJHQxICQxKSA+PnRlc3QxLm91dCAyPiYxCisgICAgKGNkIHRlc3QyOyAkdDIgJDEpID4+dGVzdDIub3V0IDI+JjEKKyAgICAoY2QgdGVzdDE7IGxzIC1sblIpID5vdXQxCisgICAgKGNkIHRlc3QyOyBscyAtbG5SKSA+b3V0MgorICAgIGVjaG8gImNob3duICQxIiA+b3V0LmRpZmYKKyAgICBpZiAhIGRpZmYgLXUgb3V0MSBvdXQyID4+b3V0LmRpZmY7IHRoZW4gZXhpdCAxOyBmaQorICAgIHJtIG91dC5kaWZmCit9Cit0c3RfZm9yX2VhY2goKSB7CisgICAgdHN0ICIkMSAxOjEgZmlsZSIKKyAgICB0c3QgIiQxIDE6MSBkaXIiCisgICAgdHN0ICIkMSAxOjEgbGlua2RpciIKKyAgICB0c3QgIiQxIDE6MSBsaW5rZmlsZSIKK30KK2VjaG8gIklmIHNjcmlwdCBwcm9kdWNlZCAnb3V0LmRpZmYnIGZpbGUsIHRoZW4gYXQgbGVhc3Qgb25lIHRlc3RjYXNlIGZhaWxlZCIKKz50ZXN0MS5vdXQKKz50ZXN0Mi5vdXQKKyMgVGhlc2UgbWF0Y2ggY29yZXV0aWxzIDYuODoKK3RzdF9mb3JfZWFjaCAiLXYiCit0c3RfZm9yX2VhY2ggIi12UiIKK3RzdF9mb3JfZWFjaCAiLXZSUCIKK3RzdF9mb3JfZWFjaCAiLXZSTCIKK3RzdF9mb3JfZWFjaCAiLXZSSCIKK3RzdF9mb3JfZWFjaCAiLXZoIgordHN0X2Zvcl9lYWNoICItdmhSIgordHN0X2Zvcl9lYWNoICItdmhSUCIKK3RzdF9mb3JfZWFjaCAiLXZoUkwiCit0c3RfZm9yX2VhY2ggIi12aFJIIgorIyBGaXggYG5hbWUnIGluIGNvcmV1dGlscyBvdXRwdXQKK3NlZCAncy9gLyciJyInL2cnIC1pIHRlc3QyLm91dAorIyBDb21wYXJlIHVzIHdpdGggY29yZXV0aWxzIG91dHB1dAorZGlmZiAtdSB0ZXN0MS5vdXQgdGVzdDIub3V0CisKKyovCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY2hyb290LmMgYi9jb3JldXRpbHMvY2hyb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4YmViMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jaHJvb3QuYwpAQCAtMCwwICsxLDQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNocm9vdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBNYXRjaGVzIEdOVSBiZWhhdmlvci4gKi8KKworLy91c2FnZTojZGVmaW5lIGNocm9vdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTkVXUk9PVCBbUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBjaHJvb3RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyB3aXRoIHJvb3QgZGlyZWN0b3J5IHNldCB0byBORVdST09UIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjaHJvb3RfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL2Jpbi9sc1xuIgorLy91c2FnZTogICAgICAgImxyd3hyd3hyd3ggICAgMSByb290ICAgICByb290ICAgICAgICAgIDEyIEFwciAxMyAwMDo0NiAvYmluL2xzIC0+IC9CdXN5Qm94XG4iCisvL3VzYWdlOiAgICAgICAiIyBtb3VudCAvZGV2L2hkYzEgL21udCAtdCBtaW5peFxuIgorLy91c2FnZTogICAgICAgIiMgY2hyb290IC9tbnRcbiIKKy8vdXNhZ2U6ICAgICAgICIjIGxzIC1sIC9iaW4vbHNcbiIKKy8vdXNhZ2U6ICAgICAgICItcnd4ci14ci14ICAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgNDA4MTYgRmViICA1IDA3OjQ1IC9iaW4vbHMqXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgY2hyb290X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaHJvb3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCSsrYXJndjsKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisJeGNocm9vdCgqYXJndik7CisJeGNoZGlyKCIvIik7CisKKwkrK2FyZ3Y7CisJaWYgKCEqYXJndikgeyAvKiBubyAybmQgcGFyYW0gKFBST0cpLCB1c2Ugc2hlbGwgKi8KKwkJYXJndiAtPSAyOworCQlhcmd2WzBdID0gKGNoYXIgKikgZ2V0X3NoZWxsX25hbWUoKTsKKwkJYXJndlsxXSA9IChjaGFyICopICItaSI7IC8qIEdOVSBjb3JldXRpbHMgOC40IGNvbXBhdCAqLworCQkvKmFyZ3ZbMl0gPSBOVUxMOyAtIGFscmVhZHkgaXMgKi8KKwl9CisKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2Nrc3VtLmMgYi9jb3JldXRpbHMvY2tzdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBiMGMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2Nrc3VtLmMKQEAgLTAsMCArMSw3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2tzdW0gLSBjYWxjdWxhdGUgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGEgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBSb2IgU3VsbGl2YW4sIHdpdGggaWRlYXMgZnJvbSBjb2RlIGJ5IFdhbHRlciBIYXJtcworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNrc3VtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFUy4uLiIKKy8vdXNhZ2U6I2RlZmluZSBja3N1bV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNhbGN1bGF0ZSB0aGUgQ1JDMzIgY2hlY2tzdW1zIG9mIEZJTEVTIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGNrc3VtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBja3N1bV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdWludDMyX3QgKmNyYzMyX3RhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIDEpOworCXVpbnQzMl90IGNyYzsKKwlvZmZfdCBsZW5ndGgsIGZpbGVzaXplOworCWludCBieXRlc19yZWFkOworCWludCBleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7CisKKyNpZiBFTkFCTEVfREVTS1RPUAorCWdldG9wdDMyKGFyZ3YsICIiKTsgLyogY29yZXV0aWxzIDYuOSBjb21wYXQgKi8KKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJYXJndisrOworI2VuZGlmCisKKwlkbyB7CisJCWludCBmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndiA/ICphcmd2IDogYmJfbXNnX3N0YW5kYXJkX2lucHV0KTsKKworCQlpZiAoZmQgPCAwKSB7CisJCQlleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCQljcmMgPSAwOworCQlsZW5ndGggPSAwOworCisjZGVmaW5lIHJlYWRfYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCXdoaWxlICgoYnl0ZXNfcmVhZCA9IHNhZmVfcmVhZChmZCwgcmVhZF9idWYsIHNpemVvZihyZWFkX2J1ZikpKSA+IDApIHsKKwkJCWxlbmd0aCArPSBieXRlc19yZWFkOworCQkJY3JjID0gY3JjMzJfYmxvY2tfZW5kaWFuMShjcmMsIHJlYWRfYnVmLCBieXRlc19yZWFkLCBjcmMzMl90YWJsZSk7CisJCX0KKwkJY2xvc2UoZmQpOworCisJCWZpbGVzaXplID0gbGVuZ3RoOworCisJCXdoaWxlIChsZW5ndGgpIHsKKwkJCWNyYyA9IChjcmMgPDwgOCkgXiBjcmMzMl90YWJsZVsodWludDhfdCkoY3JjID4+IDI0KSBeICh1aW50OF90KWxlbmd0aF07CisJCQkvKiBtdXN0IGVuc3VyZSB0aGF0IHNoaWZ0IGlzIHVuc2lnbmVkISAqLworCQkJaWYgKHNpemVvZihsZW5ndGgpIDw9IHNpemVvZih1bnNpZ25lZCkpCisJCQkJbGVuZ3RoID0gKHVuc2lnbmVkKWxlbmd0aCA+PiA4OworCQkJZWxzZSBpZiAoc2l6ZW9mKGxlbmd0aCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQkJCWxlbmd0aCA9ICh1bnNpZ25lZCBsb25nKWxlbmd0aCA+PiA4OworCQkJZWxzZQorCQkJCWxlbmd0aCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuZ3RoID4+IDg7CisJCX0KKwkJY3JjID0gfmNyYzsKKworCQlwcmludGYoKCphcmd2ID8gIiUiUFJJdTMyIiAlIk9GRl9GTVQiaSAlc1xuIiA6ICIlIlBSSXUzMiIgJSJPRkZfRk1UImlcbiIpLAorCQkJCWNyYywgZmlsZXNpemUsICphcmd2KTsKKwl9IHdoaWxlICgqYXJndiAmJiAqKythcmd2KTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoZXhpdF9jb2RlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jb21tLmMgYi9jb3JldXRpbHMvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDUwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY29tbS5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNvbW0gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgUm9iZXJ0IFN1bGxpdmFuIDxjb2dpdG8uZXJnby5jb2dpdG9AZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNvbW1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstMTIzXSBGSUxFMSBGSUxFMiIKKy8vdXNhZ2U6I2RlZmluZSBjb21tX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29tcGFyZSBGSUxFMSB3aXRoIEZJTEUyXG4iCisvL3VzYWdlOiAgICAgIlxuCS0xCVN1cHByZXNzIGxpbmVzIHVuaXF1ZSB0byBGSUxFMSIKKy8vdXNhZ2U6ICAgICAiXG4JLTIJU3VwcHJlc3MgbGluZXMgdW5pcXVlIHRvIEZJTEUyIgorLy91c2FnZTogICAgICJcbgktMwlTdXBwcmVzcyBsaW5lcyBjb21tb24gdG8gYm90aCBmaWxlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgQ09NTV9PUFRfMSAoMSA8PCAwKQorI2RlZmluZSBDT01NX09QVF8yICgxIDw8IDEpCisjZGVmaW5lIENPTU1fT1BUXzMgKDEgPDwgMikKKworLyogd3JpdGVsaW5lIG91dHB1dHMgdGhlIGlucHV0IGdpdmVuLCBhcHByb3ByaWF0ZWx5IGFsaWduZWQgYWNjb3JkaW5nIHRvIGNsYXNzICovCitzdGF0aWMgdm9pZCB3cml0ZWxpbmUoY2hhciAqbGluZSwgaW50IGNsYXNzKQoreworCWludCBmbGFncyA9IG9wdGlvbl9tYXNrMzI7CisJaWYgKGNsYXNzID09IDApIHsKKwkJaWYgKGZsYWdzICYgQ09NTV9PUFRfMSkKKwkJCXJldHVybjsKKwl9IGVsc2UgaWYgKGNsYXNzID09IDEpIHsKKwkJaWYgKGZsYWdzICYgQ09NTV9PUFRfMikKKwkJCXJldHVybjsKKwkJaWYgKCEoZmxhZ3MgJiBDT01NX09QVF8xKSkKKwkJCXB1dGNoYXIoJ1x0Jyk7CisJfSBlbHNlIC8qaWYgKGNsYXNzID09IDIpKi8geworCQlpZiAoZmxhZ3MgJiBDT01NX09QVF8zKQorCQkJcmV0dXJuOworCQlpZiAoIShmbGFncyAmIENPTU1fT1BUXzEpKQorCQkJcHV0Y2hhcignXHQnKTsKKwkJaWYgKCEoZmxhZ3MgJiBDT01NX09QVF8yKSkKKwkJCXB1dGNoYXIoJ1x0Jyk7CisJfQorCXB1dHMobGluZSk7Cit9CisKK2ludCBjb21tX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjb21tX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICp0aGlzbGluZVsyXTsKKwlGSUxFICpzdHJlYW1bMl07CisJaW50IGk7CisJaW50IG9yZGVyOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTIiOworCWdldG9wdDMyKGFyZ3YsICIxMjMiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJc3RyZWFtW2ldID0geGZvcGVuX3N0ZGluKGFyZ3ZbaV0pOworCX0KKworCW9yZGVyID0gMDsKKwl0aGlzbGluZVsxXSA9IHRoaXNsaW5lWzBdID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQlpZiAob3JkZXIgPD0gMCkgeworCQkJZnJlZSh0aGlzbGluZVswXSk7CisJCQl0aGlzbGluZVswXSA9IHhtYWxsb2NfZmdldGxpbmUoc3RyZWFtWzBdKTsKKwkJfQorCQlpZiAob3JkZXIgPj0gMCkgeworCQkJZnJlZSh0aGlzbGluZVsxXSk7CisJCQl0aGlzbGluZVsxXSA9IHhtYWxsb2NfZmdldGxpbmUoc3RyZWFtWzFdKTsKKwkJfQorCisJCWkgPSAhdGhpc2xpbmVbMF0gKyAoIXRoaXNsaW5lWzFdIDw8IDEpOworCQlpZiAoaSkKKwkJCWJyZWFrOworCQlvcmRlciA9IHN0cmNtcCh0aGlzbGluZVswXSwgdGhpc2xpbmVbMV0pOworCisJCWlmIChvcmRlciA+PSAwKQorCQkJd3JpdGVsaW5lKHRoaXNsaW5lWzFdLCBvcmRlciA/IDEgOiAyKTsKKwkJZWxzZQorCQkJd3JpdGVsaW5lKHRoaXNsaW5lWzBdLCAwKTsKKwl9CisKKwkvKiBFT0YgYXQgbGVhc3Qgb24gb25lIG9mIHRoZSBzdHJlYW1zICovCisJaSAmPSAxOworCWlmICh0aGlzbGluZVtpXSkgeworCQkvKiBzdHJlYW1baV0gaXMgbm90IGF0IEVPRiB5ZXQgKi8KKwkJLyogd2UgZGlkIG5vdCBwcmludCB0aGlzbGluZVtpXSB5ZXQgKi8KKwkJY2hhciAqcCA9IHRoaXNsaW5lW2ldOworCQl3cml0ZWxpbmUocCwgaSk7CisJCXdoaWxlICgxKSB7CisJCQlmcmVlKHApOworCQkJcCA9IHhtYWxsb2NfZmdldGxpbmUoc3RyZWFtW2ldKTsKKwkJCWlmICghcCkKKwkJCQlicmVhazsKKwkJCXdyaXRlbGluZShwLCBpKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmY2xvc2Uoc3RyZWFtWzBdKTsKKwkJZmNsb3NlKHN0cmVhbVsxXSk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jcC5jIGIvY29yZXV0aWxzL2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZTIxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jcC5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+CisgKiBTRUxpbnV4IHN1cHBvcnQgYnkgWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NwLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTaXplIHJlZHVjdGlvbi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3BfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBTT1VSQ0UgREVTVCIKKy8vdXNhZ2U6I2RlZmluZSBjcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgU09VUkNFIHRvIERFU1QsIG9yIG11bHRpcGxlIFNPVVJDRShzKSB0byBESVJFQ1RPUllcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2FtZSBhcyAtZHBSIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLWMJUHJlc2VydmUgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLVIsLXIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQsLVAJUHJlc2VydmUgc3ltbGlua3MgKGRlZmF1bHQgaWYgLVIpIgorLy91c2FnZTogICAgICJcbgktTAlGb2xsb3cgYWxsIHN5bWxpbmtzIgorLy91c2FnZTogICAgICJcbgktSAlGb2xsb3cgc3ltbGlua3Mgb24gY29tbWFuZCBsaW5lIgorLy91c2FnZTogICAgICJcbgktcAlQcmVzZXJ2ZSBmaWxlIGF0dHJpYnV0ZXMgaWYgcG9zc2libGUiCisvL3VzYWdlOiAgICAgIlxuCS1mCU92ZXJ3cml0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJUHJvbXB0IGJlZm9yZSBvdmVyd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1sLC1zCUNyZWF0ZSAoc3ltKWxpbmtzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJjb3JldXRpbHMvY29yZXV0aWxzLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBjcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc291cmNlX3N0YXQ7CisJc3RydWN0IHN0YXQgZGVzdF9zdGF0OworCWNvbnN0IGNoYXIgKmxhc3Q7CisJY29uc3QgY2hhciAqZGVzdDsKKwlpbnQgc19mbGFnczsKKwlpbnQgZF9mbGFnczsKKwlpbnQgZmxhZ3M7CisJaW50IHN0YXR1czsKKwllbnVtIHsKKwkJT1BUX2EgPSAxIDw8IChzaXplb2YoRklMRVVUSUxTX0NQX09QVFNUUiktMSksCisJCU9QVF9yID0gMSA8PCAoc2l6ZW9mKEZJTEVVVElMU19DUF9PUFRTVFIpKSwKKwkJT1BUX1AgPSAxIDw8IChzaXplb2YoRklMRVVUSUxTX0NQX09QVFNUUikrMSksCisJCU9QVF92ID0gMSA8PCAoc2l6ZW9mKEZJTEVVVElMU19DUF9PUFRTVFIpKzIpLAorI2lmIEVOQUJMRV9GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUworCQlPUFRfcGFyZW50cyA9IDEgPDwgKHNpemVvZihGSUxFVVRJTFNfQ1BfT1BUU1RSKSszKSwKKyNlbmRpZgorCX07CisKKwkvLyBOZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMKKwkvLyBTb2Z0LSBhbmQgaGFyZGxpbmtpbmcgZG9lc24ndCBtaXgKKwkvLyAtUCBhbmQgLWQgYXJlIHRoZSBzYW1lICgtUCBpcyBQT1NJWCwgLWQgaXMgR05VKQorCS8vIC1yIGFuZCAtUiBhcmUgdGhlIHNhbWUKKwkvLyAtUiAoYW5kIHRoZXJlZm9yZSAtcikgdHVybnMgb24gLWQgKGNvcmV1dGlscyBkb2VzIHRoaXMpCisJLy8gLWEgPSAtcGRSCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6bC0tczpzLS1sOlBkOnJSZDpSZDphcGRSIjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0KKwkJImFyY2hpdmVcMCIgICAgICAgIE5vX2FyZ3VtZW50ICJhIgorCQkiZm9yY2VcMCIgICAgICAgICAgTm9fYXJndW1lbnQgImYiCisJCSJpbnRlcmFjdGl2ZVwwIiAgICBOb19hcmd1bWVudCAiaSIKKwkJImxpbmtcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICJsIgorCQkiZGVyZWZlcmVuY2VcMCIgICAgTm9fYXJndW1lbnQgIkwiCisJCSJuby1kZXJlZmVyZW5jZVwwIiBOb19hcmd1bWVudCAiUCIKKwkJInJlY3Vyc2l2ZVwwIiAgICAgIE5vX2FyZ3VtZW50ICJSIgorCQkic3ltYm9saWMtbGlua1wwIiAgTm9fYXJndW1lbnQgInMiCisJCSJ2ZXJib3NlXDAiICAgICAgICBOb19hcmd1bWVudCAidiIKKwkJInBhcmVudHNcMCIgICAgICAgIE5vX2FyZ3VtZW50ICJceGZmIgorCQk7CisjZW5kaWYKKwkvLyAtdiAoLS12ZXJib3NlKSBpcyBpZ25vcmVkCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCBGSUxFVVRJTFNfQ1BfT1BUU1RSICJhclB2Iik7CisJLyogT3B0aW9ucyBvZiBjcCBmcm9tIEdOVSBjb3JldXRpbHMgNi4xMDoKKwkgKiAtYSwgLS1hcmNoaXZlCisJICogLWYsIC0tZm9yY2UKKwkgKiAtaSwgLS1pbnRlcmFjdGl2ZQorCSAqIC1sLCAtLWxpbmsKKwkgKiAtTCwgLS1kZXJlZmVyZW5jZQorCSAqIC1QLCAtLW5vLWRlcmVmZXJlbmNlCisJICogLVIsIC1yLCAtLXJlY3Vyc2l2ZQorCSAqIC1zLCAtLXN5bWJvbGljLWxpbmsKKwkgKiAtdiwgLS12ZXJib3NlCisJICogLUgJZm9sbG93IGNvbW1hbmQtbGluZSBzeW1ib2xpYyBsaW5rcyBpbiBTT1VSQ0UKKwkgKiAtZAlzYW1lIGFzIC0tbm8tZGVyZWZlcmVuY2UgLS1wcmVzZXJ2ZT1saW5rcworCSAqIC1wCXNhbWUgYXMgLS1wcmVzZXJ2ZT1tb2RlLG93bmVyc2hpcCx0aW1lc3RhbXBzCisJICogLWMJc2FtZSBhcyAtLXByZXNlcnZlPWNvbnRleHQKKwkgKiAtLXBhcmVudHMKKwkgKgl1c2UgZnVsbCBzb3VyY2UgZmlsZSBuYW1lIHVuZGVyIERJUkVDVE9SWQorCSAqIE5PVCBTVVBQT1JURUQgSU4gQkJPWDoKKwkgKiAtLWJhY2t1cFs9Q09OVFJPTF0KKwkgKgltYWtlIGEgYmFja3VwIG9mIGVhY2ggZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZQorCSAqIC1iCWxpa2UgLS1iYWNrdXAgYnV0IGRvZXMgbm90IGFjY2VwdCBhbiBhcmd1bWVudAorCSAqIC0tY29weS1jb250ZW50cworCSAqCWNvcHkgY29udGVudHMgb2Ygc3BlY2lhbCBmaWxlcyB3aGVuIHJlY3Vyc2l2ZQorCSAqIC0tcHJlc2VydmVbPUFUVFJfTElTVF0KKwkgKglwcmVzZXJ2ZSBhdHRyaWJ1dGVzIChkZWZhdWx0OiBtb2RlLG93bmVyc2hpcCx0aW1lc3RhbXBzKSwKKwkgKglpZiBwb3NzaWJsZSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXM6IHNlY3VyaXR5IGNvbnRleHQsbGlua3MsYWxsCisJICogLS1uby1wcmVzZXJ2ZT1BVFRSX0xJU1QKKwkgKiAtLXJlbW92ZS1kZXN0aW5hdGlvbgorCSAqCXJlbW92ZSAgZWFjaCBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIG9wZW4KKwkgKiAtLXNwYXJzZT1XSEVOCisJICoJY29udHJvbCBjcmVhdGlvbiBvZiBzcGFyc2UgZmlsZXMKKwkgKiAtLXN0cmlwLXRyYWlsaW5nLXNsYXNoZXMKKwkgKglyZW1vdmUgYW55IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBlYWNoIFNPVVJDRSBhcmd1bWVudAorCSAqIC1TLCAtLXN1ZmZpeD1TVUZGSVgKKwkgKglvdmVycmlkZSB0aGUgdXN1YWwgYmFja3VwIHN1ZmZpeAorCSAqIC10LCAtLXRhcmdldC1kaXJlY3Rvcnk9RElSRUNUT1JZCisJICoJY29weSBhbGwgU09VUkNFIGFyZ3VtZW50cyBpbnRvIERJUkVDVE9SWQorCSAqIC1ULCAtLW5vLXRhcmdldC1kaXJlY3RvcnkKKwkgKgl0cmVhdCBERVNUIGFzIGEgbm9ybWFsIGZpbGUKKwkgKiAtdSwgLS11cGRhdGUKKwkgKgljb3B5IG9ubHkgd2hlbiB0aGUgU09VUkNFIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24KKwkgKglmaWxlIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgbWlzc2luZworCSAqIC14LCAtLW9uZS1maWxlLXN5c3RlbQorCSAqCXN0YXkgb24gdGhpcyBmaWxlIHN5c3RlbQorCSAqIC1aLCAtLWNvbnRleHQ9Q09OVEVYVAorCSAqCShTRUxpbnV4KSBzZXQgU0VMaW51eCBzZWN1cml0eSBjb250ZXh0IG9mIGNvcHkgdG8gQ09OVEVYVAorCSAqLworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCS8qIFJldmVyc2UgdGhpcyBiaXQuIElmIHRoZXJlIGlzIC1kLCBiaXQgaXMgbm90IHNldDogKi8KKwlmbGFncyBePSBGSUxFVVRJTFNfREVSRUZFUkVOQ0U7CisJLyogY29yZXV0aWxzIDYuOSBjb21wYXQ6CisJICogYnkgZGVmYXVsdCwgImNwIiBkZXJlZnMgc3ltbGlua3MgKGNyZWF0ZXMgcmVndWxhciBkZXN0IGZpbGVzKSwKKwkgKiBidXQgImNwIC1SIiBkb2VzIG5vdC4gV2Ugc3dpdGNoIG9mZiBkZXJlZiBpZiAtciBvciAtUiAoc2VlIGFib3ZlKS4KKwkgKiBIb3dldmVyLCAiY3AgLVJMIiBtdXN0IHN0aWxsIGRlcmVmIHN5bWxpbmtzOiAqLworCWlmIChmbGFncyAmIEZJTEVVVElMU19ERVJFRl9TT0ZUTElOSykgLyogLUwgKi8KKwkJZmxhZ3MgfD0gRklMRVVUSUxTX0RFUkVGRVJFTkNFOworCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCkgeworCQlzZWxpbnV4X29yX2RpZSgpOworCX0KKyNlbmRpZgorCisJc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWxhc3QgPSBhcmd2W2FyZ2MgLSAxXTsKKwkvKiBJZiB0aGVyZSBhcmUgb25seSB0d28gYXJndW1lbnRzIGFuZC4uLiAgKi8KKwlpZiAoYXJnYyA9PSAyKSB7CisJCXNfZmxhZ3MgPSBjcF9tdl9zdGF0MigqYXJndiwgJnNvdXJjZV9zdGF0LAorCQkJCShmbGFncyAmIEZJTEVVVElMU19ERVJFRkVSRU5DRSkgPyBzdGF0IDogbHN0YXQpOworCQlpZiAoc19mbGFncyA8IDApCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQlkX2ZsYWdzID0gY3BfbXZfc3RhdChsYXN0LCAmZGVzdF9zdGF0KTsKKwkJaWYgKGRfZmxhZ3MgPCAwKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUworCQlpZiAoZmxhZ3MgJiBPUFRfcGFyZW50cykgeworCQkJaWYgKCEoZF9mbGFncyAmIDIpKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndpdGggLS1wYXJlbnRzLCB0aGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIGRpcmVjdG9yeSIpOworCQkJfQorCQl9CisjZW5kaWYKKworCQkvKiAuLi5pZiBuZWl0aGVyIGlzIGEgZGlyZWN0b3J5Li4uICAqLworCQlpZiAoISgoc19mbGFncyB8IGRfZmxhZ3MpICYgMikKKwkJICAgIC8qIC4uLm9yOiByZWN1cnNpbmcsIHRoZSAxc3QgaXMgYSBkaXJlY3RvcnksIGFuZCB0aGUgMm5kIGRvZXNuJ3QgZXhpc3QuLi4gKi8KKwkJIHx8ICgoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpICYmIChzX2ZsYWdzICYgMikgJiYgIWRfZmxhZ3MpCisJCSkgeworCQkJLyogRG8gYSBzaW1wbGUgY29weSAqLworCQkJZGVzdCA9IGxhc3Q7CisJCQlnb3RvIERPX0NPUFk7IC8qIE5COiBhcmdjPT0yIC0+ICorK2FyZ3Y9PWxhc3QgKi8KKwkJfQorCX0KKworCXdoaWxlICgxKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TCisJCWlmIChmbGFncyAmIE9QVF9wYXJlbnRzKSB7CisJCQljaGFyICpkZXN0X2R1cDsKKwkJCWNoYXIgKmRlc3RfZGlyOworCQkJZGVzdCA9IGNvbmNhdF9wYXRoX2ZpbGUobGFzdCwgKmFyZ3YpOworCQkJZGVzdF9kdXAgPSB4c3RyZHVwKGRlc3QpOworCQkJZGVzdF9kaXIgPSBkaXJuYW1lKGRlc3RfZHVwKTsKKwkJCWlmIChiYl9tYWtlX2RpcmVjdG9yeShkZXN0X2RpciwgLTEsIEZJTEVVVElMU19SRUNVUikpIHsKKwkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJfQorCQkJZnJlZShkZXN0X2R1cCk7CisJCQlnb3RvIERPX0NPUFk7CisJCX0KKyNlbmRpZgorCQlkZXN0ID0gY29uY2F0X3BhdGhfZmlsZShsYXN0LCBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCgqYXJndikpOworIERPX0NPUFk6CisJCWlmIChjb3B5X2ZpbGUoKmFyZ3YsIGRlc3QsIGZsYWdzKSA8IDApIHsKKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCQlpZiAoKisrYXJndiA9PSBsYXN0KSB7CisJCQkvKiBwb3NzaWJseSBsZWFraW5nIGRlc3QuLi4gKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIGRvbid0IG1vdmUgdXA6IGRlc3QgbWF5IGJlID09IGxhc3QgYW5kIG5vdCBtYWxsb2NlZCEgKi8KKwkJZnJlZSgodm9pZCopZGVzdCk7CisJfQorCisJLyogRXhpdC4gV2UgYXJlIE5PRVhFQywgbm90IE5PRk9SSy4gV2UgZG8gZXhpdCBhdCB0aGUgZW5kIG9mIG1haW4oKSAqLworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY3V0LmMgYi9jb3JldXRpbHMvY3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyN2I3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jdXQuYwpAQCAtMCwwICsxLDMwNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY3V0LmMgLSBtaW5pbWFsaXN0IHZlcnNpb24gb2YgY3V0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBMaW5lbywgaW5jLgorICogV3JpdHRlbiBieSBNYXJrIFdoaXRsZXkgPG1hcmt3QGNvZGVwb2V0Lm9yZz4KKyAqIGRlYmxvYXRlZCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjdXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgY3V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgc2VsZWN0ZWQgZmllbGRzIGZyb20gZWFjaCBpbnB1dCBGSUxFIHRvIHN0ZG91dFxuIgorLy91c2FnZTogICAgICJcbgktYiBMSVNUCU91dHB1dCBvbmx5IGJ5dGVzIGZyb20gTElTVCIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgTElTVAlPdXRwdXQgb25seSBjaGFyYWN0ZXJzIGZyb20gTElTVCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgQ0hBUglVc2UgQ0hBUiBpbnN0ZWFkIG9mIHRhYiBhcyB0aGUgZmllbGQgZGVsaW1pdGVyIgorLy91c2FnZTogICAgICJcbgktcwlPdXRwdXQgb25seSB0aGUgbGluZXMgY29udGFpbmluZyBkZWxpbWl0ZXIiCisvL3VzYWdlOiAgICAgIlxuCS1mIE4JUHJpbnQgb25seSB0aGVzZSBmaWVsZHMiCisvL3VzYWdlOiAgICAgIlxuCS1uCUlnbm9yZWQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGN1dF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiSGVsbG8gd29ybGRcIiB8IGN1dCAtZiAxIC1kICcgJ1xuIgorLy91c2FnZTogICAgICAgIkhlbGxvXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiSGVsbG8gd29ybGRcIiB8IGN1dCAtZiAyIC1kICcgJ1xuIgorLy91c2FnZTogICAgICAgIndvcmxkXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKy8qIG9wdGlvbiB2YXJzICovCitzdGF0aWMgY29uc3QgY2hhciBvcHRzdHJpbmdbXSBBTElHTjEgPSAiYjpjOmY6ZDpzbiI7CisjZGVmaW5lIENVVF9PUFRfQllURV9GTEdTICAgICAoMSA8PCAwKQorI2RlZmluZSBDVVRfT1BUX0NIQVJfRkxHUyAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ1VUX09QVF9GSUVMRFNfRkxHUyAgICgxIDw8IDIpCisjZGVmaW5lIENVVF9PUFRfREVMSU1fRkxHUyAgICAoMSA8PCAzKQorI2RlZmluZSBDVVRfT1BUX1NVUFBSRVNTX0ZMR1MgKDEgPDwgNCkKKworc3RydWN0IGN1dF9saXN0IHsKKwlpbnQgc3RhcnRwb3M7CisJaW50IGVuZHBvczsKK307CisKK2VudW0geworCUJPTCA9IDAsCisJRU9MID0gSU5UX01BWCwKKwlOT05fUkFOR0UgPSAtMQorfTsKKworc3RhdGljIGludCBjbXBmdW5jKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuICgoKHN0cnVjdCBjdXRfbGlzdCAqKSBhKS0+c3RhcnRwb3MgLQorCQkJKChzdHJ1Y3QgY3V0X2xpc3QgKikgYiktPnN0YXJ0cG9zKTsKK30KKworc3RhdGljIHZvaWQgY3V0X2ZpbGUoRklMRSAqZmlsZSwgY2hhciBkZWxpbSwgY29uc3Qgc3RydWN0IGN1dF9saXN0ICpjdXRfbGlzdHMsIHVuc2lnbmVkIG5saXN0cykKK3sKKwljaGFyICpsaW5lOworCXVuc2lnbmVkIGxpbmVudW0gPSAwOwkvKiBrZWVwIHRoZXNlIHplcm8tYmFzZWQgdG8gYmUgY29uc2lzdGVudCAqLworCisJLyogZ28gdGhyb3VnaCBldmVyeSBsaW5lIGluIHRoZSBmaWxlICovCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmaWxlKSkgIT0gTlVMTCkgeworCisJCS8qIHNldCB1cCBhIGxpc3Qgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2Ygd2hhdCdzIGJlZW4gcHJpbnRlZCAqLworCQlpbnQgbGluZWxlbiA9IHN0cmxlbihsaW5lKTsKKwkJY2hhciAqcHJpbnRlZCA9IHh6YWxsb2MobGluZWxlbiArIDEpOworCQljaGFyICpvcmlnX2xpbmUgPSBsaW5lOworCQl1bnNpZ25lZCBjbF9wb3MgPSAwOworCQlpbnQgc3BvczsKKworCQkvKiBjdXQgYmFzZWQgb24gY2hhcnMvYnl0ZXMgWFhYOiBvbmx5IHdvcmtzIHdoZW4gc2l6ZW9mKGNoYXIpID09IGJ5dGUgKi8KKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiAoQ1VUX09QVF9DSEFSX0ZMR1MgfCBDVVRfT1BUX0JZVEVfRkxHUykpIHsKKwkJCS8qIHByaW50IHRoZSBjaGFycyBzcGVjaWZpZWQgaW4gZWFjaCBjdXQgbGlzdCAqLworCQkJZm9yICg7IGNsX3BvcyA8IG5saXN0czsgY2xfcG9zKyspIHsKKwkJCQlzcG9zID0gY3V0X2xpc3RzW2NsX3Bvc10uc3RhcnRwb3M7CisJCQkJd2hpbGUgKHNwb3MgPCBsaW5lbGVuKSB7CisJCQkJCWlmICghcHJpbnRlZFtzcG9zXSkgeworCQkJCQkJcHJpbnRlZFtzcG9zXSA9ICdYJzsKKwkJCQkJCXB1dGNoYXIobGluZVtzcG9zXSk7CisJCQkJCX0KKwkJCQkJc3BvcysrOworCQkJCQlpZiAoc3BvcyA+IGN1dF9saXN0c1tjbF9wb3NdLmVuZHBvcworCQkJCQkvKiBOT05fUkFOR0UgaXMgLTEsIHNvIGlmIGJlbG93IGlzIHRydWUsCisJCQkJCSAqIHRoZSBhYm92ZSB3YXMgdHJ1ZSB0b28gKHNwb3MgaXMgPj0gMCkgKi8KKwkJCQkJLyogfHwgY3V0X2xpc3RzW2NsX3Bvc10uZW5kcG9zID09IE5PTl9SQU5HRSAqLworCQkJCQkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGRlbGltID09ICdcbicpIHsJLyogY3V0IGJ5IGxpbmVzICovCisJCQlzcG9zID0gY3V0X2xpc3RzW2NsX3Bvc10uc3RhcnRwb3M7CisKKwkJCS8qIGdldCBvdXQgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RzIHRvIHByb2Nlc3Mgb3IgaWYgdGhlIGxpbmVzCisJCQkgKiBhcmUgbG93ZXIgdGhhbiB3aGF0IHdlJ3JlIGludGVyZXN0ZWQgaW4gKi8KKwkJCWlmICgoKGludClsaW5lbnVtIDwgc3BvcykgfHwgKGNsX3BvcyA+PSBubGlzdHMpKQorCQkJCWdvdG8gbmV4dF9saW5lOworCisJCQkvKiBpZiB0aGUgbGluZSB3ZSdyZSBsb29raW5nIGZvciBpcyBsb3dlciB0aGFuIHRoZSBvbmUgd2Ugd2VyZQorCQkJICogcGFzc2VkLCBpdCBtZWFucyB3ZSBkaXNwbGF5ZWQgaXQgYWxyZWFkeSwgc28gbW92ZSBvbiAqLworCQkJd2hpbGUgKHNwb3MgPCAoaW50KWxpbmVudW0pIHsKKwkJCQlzcG9zKys7CisJCQkJLyogZ28gdG8gdGhlIG5leHQgbGlzdCBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoaXMgb25lICovCisJCQkJaWYgKHNwb3MgPiBjdXRfbGlzdHNbY2xfcG9zXS5lbmRwb3MKKwkJCQkgfHwgY3V0X2xpc3RzW2NsX3Bvc10uZW5kcG9zID09IE5PTl9SQU5HRQorCQkJCSkgeworCQkJCQljbF9wb3MrKzsKKwkJCQkJLyogZ2V0IG91dCBpZiB0aGVyZSdzIG5vIG1vcmUgbGlzdHMgdG8gcHJvY2VzcyAqLworCQkJCQlpZiAoY2xfcG9zID49IG5saXN0cykKKwkJCQkJCWdvdG8gbmV4dF9saW5lOworCQkJCQlzcG9zID0gY3V0X2xpc3RzW2NsX3Bvc10uc3RhcnRwb3M7CisJCQkJCS8qIGdldCBvdXQgaWYgdGhlIGN1cnJlbnQgbGluZSBpcyBsb3dlciB0aGFuIHRoZSBvbmUKKwkJCQkJICogd2UganVzdCBiZWNhbWUgaW50ZXJlc3RlZCBpbiAqLworCQkJCQlpZiAoKGludClsaW5lbnVtIDwgc3BvcykKKwkJCQkJCWdvdG8gbmV4dF9saW5lOworCQkJCX0KKwkJCX0KKworCQkJLyogSWYgd2UgbWFkZSBpdCBoZXJlLCBpdCBtZWFucyB3ZSd2ZSBmb3VuZCB0aGUgbGluZSB3ZSdyZQorCQkJICogbG9va2luZyBmb3IsIHNvIHByaW50IGl0ICovCisJCQlwdXRzKGxpbmUpOworCQkJZ290byBuZXh0X2xpbmU7CisJCX0gZWxzZSB7CQkvKiBjdXQgYnkgZmllbGRzICovCisJCQlpbnQgbmRlbGltID0gLTE7CS8qIHplcm8tYmFzZWQgLyBvbmUtYmFzZWQgcHJvYmxlbSAqLworCQkJaW50IG5maWVsZHNfcHJpbnRlZCA9IDA7CisJCQljaGFyICpmaWVsZCA9IE5VTEw7CisJCQljaGFyIGRlbGltaXRlclsyXTsKKworCQkJZGVsaW1pdGVyWzBdID0gZGVsaW07CisJCQlkZWxpbWl0ZXJbMV0gPSAwOworCisJCQkvKiBkb2VzIHRoaXMgbGluZSBjb250YWluIGFueSBkZWxpbWl0ZXJzPyAqLworCQkJaWYgKHN0cmNocihsaW5lLCBkZWxpbSkgPT0gTlVMTCkgeworCQkJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBDVVRfT1BUX1NVUFBSRVNTX0ZMR1MpKQorCQkJCQlwdXRzKGxpbmUpOworCQkJCWdvdG8gbmV4dF9saW5lOworCQkJfQorCisJCQkvKiBwcm9jZXNzIGVhY2ggbGlzdCBvbiB0aGlzIGxpbmUsIGZvciBhcyBsb25nIGFzIHdlJ3ZlIGdvdAorCQkJICogYSBsaW5lIHRvIHByb2Nlc3MgKi8KKwkJCWZvciAoOyBjbF9wb3MgPCBubGlzdHMgJiYgbGluZTsgY2xfcG9zKyspIHsKKwkJCQlzcG9zID0gY3V0X2xpc3RzW2NsX3Bvc10uc3RhcnRwb3M7CisJCQkJZG8geworCQkJCQkvKiBmaW5kIHRoZSBmaWVsZCB3ZSdyZSBsb29raW5nIGZvciAqLworCQkJCQl3aGlsZSAobGluZSAmJiBuZGVsaW0gPCBzcG9zKSB7CisJCQkJCQlmaWVsZCA9IHN0cnNlcCgmbGluZSwgZGVsaW1pdGVyKTsKKwkJCQkJCW5kZWxpbSsrOworCQkJCQl9CisKKwkJCQkJLyogd2UgZm91bmQgaXQsIGFuZCBpdCBoYXNuJ3QgYmVlbiBwcmludGVkIHlldCAqLworCQkJCQlpZiAoZmllbGQgJiYgbmRlbGltID09IHNwb3MgJiYgIXByaW50ZWRbbmRlbGltXSkgeworCQkJCQkJLyogaWYgdGhpcyBpc24ndCBvdXIgZmlyc3QgdGltZSB0aHJvdWdoLCB3ZSBuZWVkIHRvCisJCQkJCQkgKiBwcmludCB0aGUgZGVsaW1pdGVyIGFmdGVyIHRoZSBsYXN0IGZpZWxkIHRoYXQgd2FzCisJCQkJCQkgKiBwcmludGVkICovCisJCQkJCQlpZiAobmZpZWxkc19wcmludGVkID4gMCkKKwkJCQkJCQlwdXRjaGFyKGRlbGltKTsKKwkJCQkJCWZwdXRzKGZpZWxkLCBzdGRvdXQpOworCQkJCQkJcHJpbnRlZFtuZGVsaW1dID0gJ1gnOworCQkJCQkJbmZpZWxkc19wcmludGVkKys7CS8qIHNob3VsZG4ndCBvdmVyZmxvdy4uICovCisJCQkJCX0KKworCQkJCQlzcG9zKys7CisKKwkJCQkJLyoga2VlcCBnb2luZyBhcyBsb25nIGFzIHdlIGhhdmUgYSBsaW5lIHRvIHdvcmsgd2l0aCwKKwkJCQkJICogdGhpcyBpcyBhIGxpc3QsIGFuZCB3ZSdyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGF0CisJCQkJCSAqIGxpc3QgKi8KKwkJCQl9IHdoaWxlIChzcG9zIDw9IGN1dF9saXN0c1tjbF9wb3NdLmVuZHBvcyAmJiBsaW5lCisJCQkJCQkmJiBjdXRfbGlzdHNbY2xfcG9zXS5lbmRwb3MgIT0gTk9OX1JBTkdFKTsKKwkJCX0KKwkJfQorCQkvKiBpZiB3ZSBwcmludGVkIGFueXRoaW5nIGF0IGFsbCwgd2UgbmVlZCB0byBmaW5pc2ggaXQgd2l0aCBhCisJCSAqIG5ld2xpbmUgY3V6IHdlIHdlcmUgaGFuZGVkIGEgY2hvbXBlZCBsaW5lICovCisJCXB1dGNoYXIoJ1xuJyk7CisgbmV4dF9saW5lOgorCQlsaW5lbnVtKys7CisJCWZyZWUocHJpbnRlZCk7CisJCWZyZWUob3JpZ19saW5lKTsKKwl9Cit9CisKK2ludCBjdXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGN1dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJLyogZ3Jvd2FibGUgYXJyYXkgaG9sZGluZyBhIHNlcmllcyBvZiBsaXN0cyAqLworCXN0cnVjdCBjdXRfbGlzdCAqY3V0X2xpc3RzID0gTlVMTDsKKwl1bnNpZ25lZCBubGlzdHMgPSAwOwkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYWJvdmUgbGlzdCAqLworCWNoYXIgZGVsaW0gPSAnXHQnOwkvKiBkZWxpbWl0ZXIsIGRlZmF1bHQgaXMgdGFiICovCisJY2hhciAqc29wdCwgKmx0b2s7CisJdW5zaWduZWQgb3B0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiYi0tYmNmOmMtLWJjZjpmLS1iY2YiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIG9wdHN0cmluZywgJnNvcHQsICZzb3B0LCAmc29wdCwgJmx0b2spOworLy8JYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEob3B0ICYgKENVVF9PUFRfQllURV9GTEdTIHwgQ1VUX09QVF9DSEFSX0ZMR1MgfCBDVVRfT1BUX0ZJRUxEU19GTEdTKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJleHBlY3RlZCBhIGxpc3Qgb2YgYnl0ZXMsIGNoYXJhY3RlcnMsIG9yIGZpZWxkcyIpOworCisJaWYgKG9wdCAmIENVVF9PUFRfREVMSU1fRkxHUykgeworCQlpZiAobHRva1swXSAmJiBsdG9rWzFdKSB7IC8qIG1vcmUgdGhhbiAxIGNoYXI/ICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGhlIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciIpOworCQl9CisJCWRlbGltID0gbHRva1swXTsKKwl9CisKKwkvKiAgbm9uLWZpZWxkIChjaGFyIG9yIGJ5dGUpIGN1dHRpbmcgaGFzIHNvbWUgc3BlY2lhbCBoYW5kbGluZyAqLworCWlmICghKG9wdCAmIENVVF9PUFRfRklFTERTX0ZMR1MpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIF9vcF9vbl9maWVsZFtdIEFMSUdOMSA9ICIgb25seSB3aGVuIG9wZXJhdGluZyBvbiBmaWVsZHMiOworCisJCWlmIChvcHQgJiBDVVRfT1BUX1NVUFBSRVNTX0ZMR1MpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllCisJCQkJKCJzdXBwcmVzc2luZyBub24tZGVsaW1pdGVkIGxpbmVzIG1ha2VzIHNlbnNlJXMiLAorCQkJCSBfb3Bfb25fZmllbGQpOworCQl9CisJCWlmIChkZWxpbSAhPSAnXHQnKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZQorCQkJCSgiYSBkZWxpbWl0ZXIgbWF5IGJlIHNwZWNpZmllZCVzIiwgX29wX29uX2ZpZWxkKTsKKwkJfQorCX0KKworCS8qCisJICogcGFyc2UgbGlzdCBhbmQgcHV0IHZhbHVlcyBpbnRvIHN0YXJ0cG9zIGFuZCBlbmRwb3MuCisJICogdmFsaWQgbGlzdCBmb3JtYXRzOiBOLCBOLSwgTi1NLCAtTQorCSAqIG1vcmUgdGhhbiBvbmUgbGlzdCBjYW4gYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcworCSAqLworCXsKKwkJY2hhciAqbnRvazsKKwkJaW50IHMgPSAwLCBlID0gMDsKKworCQkvKiB0YWtlIGFwYXJ0IHRoZSBsaXN0cywgb25lIGJ5IG9uZSAodGhleSBhcmUgc2VwYXJhdGVkIHdpdGggY29tbWFzKSAqLworCQl3aGlsZSAoKGx0b2sgPSBzdHJzZXAoJnNvcHQsICIsIikpICE9IE5VTEwpIHsKKworCQkJLyogaXQncyBhY3R1YWxseSBsZWdhbCB0byBwYXNzIGFuIGVtcHR5IGxpc3QgKi8KKwkJCWlmICghbHRva1swXSkKKwkJCQljb250aW51ZTsKKworCQkJLyogZ2V0IHRoZSBzdGFydCBwb3MgKi8KKwkJCW50b2sgPSBzdHJzZXAoJmx0b2ssICItIik7CisJCQlpZiAoIW50b2tbMF0pIHsKKwkJCQlzID0gQk9MOworCQkJfSBlbHNlIHsKKwkJCQlzID0geGF0b2lfcG9zaXRpdmUobnRvayk7CisJCQkJLyogYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBhcnJheXMgYXJlIHplcm8gYmFzZWQsIHdoaWxlCisJCQkJICogdGhlIHVzZXIgZXhwZWN0cyB0aGUgZmlyc3QgY2hhciBvbiB0aGUgbGluZSB0byBiZSBjaGFyICMxICovCisJCQkJaWYgKHMgIT0gMCkKKwkJCQkJcy0tOworCQkJfQorCisJCQkvKiBnZXQgdGhlIGVuZCBwb3MgKi8KKwkJCWlmIChsdG9rID09IE5VTEwpIHsKKwkJCQllID0gTk9OX1JBTkdFOworCQkJfSBlbHNlIGlmICghbHRva1swXSkgeworCQkJCWUgPSBFT0w7CisJCQl9IGVsc2UgeworCQkJCWUgPSB4YXRvaV9wb3NpdGl2ZShsdG9rKTsKKwkJCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgYW5kIGVuZCBwb3NpdGlvbiBvZiAwLAorCQkJCSAqIHRoYXQgbWVhbnMgInRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIiAqLworCQkJCWlmIChlID09IDApCisJCQkJCWUgPSBFT0w7CisJCQkJZS0tOwkvKiBhZ2FpbiwgYXJyYXlzIGFyZSB6ZXJvIGJhc2VkLCBsaW5lcyBhcmUgMSBiYXNlZCAqLworCQkJCWlmIChlID09IHMpCisJCQkJCWUgPSBOT05fUkFOR0U7CisJCQl9CisKKwkJCS8qIGFkZCB0aGUgbmV3IGxpc3QgKi8KKwkJCWN1dF9saXN0cyA9IHhyZWFsbG9jX3ZlY3RvcihjdXRfbGlzdHMsIDQsIG5saXN0cyk7CisJCQkvKiBOQjogc3RhcnRwb3MgaXMgYWx3YXlzID49IDAsCisJCQkgKiB3aGlsZSBlbmRwb3MgbWF5IGJlID0gTk9OX1JBTkdFICgtMSkgKi8KKwkJCWN1dF9saXN0c1tubGlzdHNdLnN0YXJ0cG9zID0gczsKKwkJCWN1dF9saXN0c1tubGlzdHNdLmVuZHBvcyA9IGU7CisJCQlubGlzdHMrKzsKKwkJfQorCisJCS8qIG1ha2Ugc3VyZSB3ZSBnb3Qgc29tZSBjdXQgcG9zaXRpb25zIG91dCBvZiBhbGwgdGhhdCAqLworCQlpZiAobmxpc3RzID09IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBsaXN0IG9mIHBvc2l0aW9ucyIpOworCisJCS8qIG5vdyB0aGF0IHRoZSBsaXN0cyBhcmUgcGFyc2VkLCB3ZSBuZWVkIHRvIHNvcnQgdGhlbSB0byBtYWtlIGxpZmUKKwkJICogZWFzaWVyIG9uIHVzIHdoZW4gaXQgY29tZXMgdGltZSB0byBwcmludCB0aGUgY2hhcnMgLyBmaWVsZHMgLyBsaW5lcworCQkgKi8KKwkJcXNvcnQoY3V0X2xpc3RzLCBubGlzdHMsIHNpemVvZihjdXRfbGlzdHNbMF0pLCBjbXBmdW5jKTsKKwl9CisKKwl7CisJCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwkJaWYgKCEqYXJndikKKwkJCSotLWFyZ3YgPSAoY2hhciAqKSItIjsKKworCQlkbyB7CisJCQlGSUxFICpmaWxlID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCQlpZiAoIWZpbGUpIHsKKwkJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCQljdXRfZmlsZShmaWxlLCBkZWxpbSwgY3V0X2xpc3RzLCBubGlzdHMpOworCQkJZmNsb3NlX2lmX25vdF9zdGRpbihmaWxlKTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShjdXRfbGlzdHMpOworCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2RhdGUuYyBiL2NvcmV1dGlscy9kYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3ZDVmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9kYXRlLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZGF0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIGJ5IE1hdHRoZXcgR3JhbnQgPGdyYW50bWFAYW5hdGhvdGguZ2VuLm56PgorICoKKyAqIGlzby1mb3JtYXQgaGFuZGxpbmcgYWRkZWQgYnkgUm9iZXJ0IEdyaWVibCA8Z3JpZWJsQGdteC5kZT4KKyAqIGJ1Z2ZpeGVzIGFuZCBjbGVhbnVwIGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvKiBUaGlzICdkYXRlJyBjb21tYW5kIHN1cHBvcnRzIG9ubHkgMiB0aW1lIHNldHRpbmcgZm9ybWF0cywKKyAgIGFsbCB0aGUgR05VIHN0cmZ0aW1lIHN0dWZmIChpdHMgaW4gbGliYywgbGV0cyB1c2UgaXQpLAorICAgc2V0dGluZyB0aW1lIHVzaW5nIFVUQyBhbmQgZGlzcGxheWluZyBpdCwgYXMgd2VsbCBhcworICAgYW4gUkZDIDI4MjIgY29tcGxpYW50IGRhdGUgb3V0cHV0IGZvciBzaGVsbCBzY3JpcHRpbmcKKyAgIG1haWwgY29tbWFuZHMgKi8KKworLyogSW5wdXQgcGFyc2luZyBjb2RlIGlzIGFsd2F5cyBidWxreSAtIHVzZWQgaGVhdnkgZHV0eSBsaWJjIHN0dWZmIGFzCisgICBtdWNoIGFzIHBvc3NpYmxlLCBtaXNzZWQgb3V0IGEgbG90IG9mIGJvdW5kcyBjaGVja2luZyAqLworCisvL2FwcGxldDpJRl9EQVRFKEFQUExFVChkYXRlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfREFURSkgKz0gZGF0ZS5vCisKKy8vY29uZmlnOmNvbmZpZyBEQVRFCisvL2NvbmZpZzoJYm9vbCAiZGF0ZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBkYXRlIGlzIHVzZWQgdG8gc2V0IHRoZSBzeXN0ZW0gZGF0ZSBvciBkaXNwbGF5IHRoZQorLy9jb25maWc6CSAgY3VycmVudCB0aW1lIGluIHRoZSBnaXZlbiBmb3JtYXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0RBVEVfSVNPRk1UCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIElTTyBkYXRlIGZvcm1hdCBvdXRwdXQgKC1JKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIERBVEUKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgb3B0aW9uICgtSSkgdG8gb3V0cHV0IGFuIElTTy04NjAxIGNvbXBsaWFudAorLy9jb25maWc6CSAgZGF0ZS90aW1lIHN0cmluZy4KKy8vY29uZmlnOgorLy9jb25maWc6IyBkZWZhdWx0cyB0byAibm8iOiBzdGF0J3MgbmFub3NlY29uZCBmaWVsZCBpcyBhIGJpdCBub24tcG9ydGFibGUKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0RBVEVfTkFOTworLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgJVtudW1dTiBuYW5vc2Vjb25kIGZvcm1hdCBzcGVjaWZpZXIiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBEQVRFICAjIHN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lKQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgJVtudW1dTiBmb3JtYXQgc3BlY2lmaWVyLiBBZGRzIH4yNTAgYnl0ZXMgb2YgY29kZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfREFURV9DT01QQVQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IHdlaXJkICdkYXRlIE1NRERoaG1tW1tZWV1ZWV1bLnNzXScgZm9ybWF0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gREFURQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN5c3RlbSB0aW1lIGNhbiBiZSBzZXQgYnkgJ2RhdGUgLXMgREFURScgYW5kIHNpbXBseSAnZGF0ZSBEQVRFJywKKy8vY29uZmlnOgkgIGJ1dCBmb3JtYXRzIG9mIERBVEUgc3RyaW5nIGFyZSBkaWZmZXJlbnQuICdkYXRlIERBVEUnIGFjY2VwdHMKKy8vY29uZmlnOgkgIGEgcmF0aGVyIHdlaXJkIE1NRERoaG1tW1tZWV1ZWV1bLnNzXSBmb3JtYXQgd2l0aCBjb21wbGV0ZWx5CisvL2NvbmZpZzoJICB1bm5hdHVyYWwgcGxhY2VtZW50IG9mIHllYXIgYmV0d2VlbiBtaW51dGVzIGFuZCBzZWNvbmRzLgorLy9jb25maWc6CSAgZGF0ZSAtcyAoYW5kIG90aGVyIGNvbW1hbmRzIGxpa2UgdG91Y2ggLWQpIHVzZSBtb3JlIHNlbnNpYmxlCisvL2NvbmZpZzoJICBmb3JtYXRzIChmb3Igb25lLCBJU08gZm9ybWF0IFlZWVktTU0tREQgaGg6bW06c3Muc3Nzc3NzKS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgV2l0aCB0aGlzIG9wdGlvbiBvZmYsICdkYXRlIERBVEUnIGlzICdkYXRlIC1zIERBVEUnIHN1cHBvcnQKKy8vY29uZmlnOgkgIHRoZSBzYW1lIGZvcm1hdC4gV2l0aCBpdCBvbiwgJ2RhdGUgREFURScgYWRkaXRpb25hbGx5IHN1cHBvcnRzCisvL2NvbmZpZzoJICBNTUREaGhtbVtbWVldWVldWy5zc10gZm9ybWF0LgorCisvKiBHTlUgY29yZXV0aWxzIDYuOSBtYW4gcGFnZToKKyAqIGRhdGUgW09QVElPTl0uLi4gWytGT1JNQVRdCisgKiBkYXRlIFstdXwtLXV0Y3wtLXVuaXZlcnNhbF0gW01NRERoaG1tW1tDQ11ZWV1bLnNzXV0KKyAqIC1kLCAtLWRhdGU9U1RSSU5HCisgKiAgICAgIGRpc3BsYXkgdGltZSBkZXNjcmliZWQgYnkgU1RSSU5HLCBub3QgYG5vdycKKyAqIC1mLCAtLWZpbGU9REFURUZJTEUKKyAqICAgICAgbGlrZSAtLWRhdGUgb25jZSBmb3IgZWFjaCBsaW5lIG9mIERBVEVGSUxFCisgKiAtciwgLS1yZWZlcmVuY2U9RklMRQorICogICAgICBkaXNwbGF5IHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUKKyAqIC1SLCAtLXJmYy0yODIyCisgKiAgICAgIG91dHB1dCBkYXRlIGFuZCB0aW1lIGluIFJGQyAyODIyIGZvcm1hdC4KKyAqICAgICAgRXhhbXBsZTogTW9uLCAwNyBBdWcgMjAwNiAxMjozNDo1NiAtMDYwMAorICogLS1yZmMtMzMzOT1USU1FU1BFQworICogICAgICBvdXRwdXQgZGF0ZSBhbmQgdGltZSBpbiBSRkMgMzMzOSBmb3JtYXQuCisgKiAgICAgIFRJTUVTUEVDPSdkYXRlJywgJ3NlY29uZHMnLCBvciAnbnMnCisgKiAgICAgIERhdGUgYW5kIHRpbWUgY29tcG9uZW50cyBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlOgorICogICAgICAyMDA2LTA4LTA3IDEyOjM0OjU2LTA2OjAwCisgKiAtcywgLS1zZXQ9U1RSSU5HCisgKiAgICAgIHNldCB0aW1lIGRlc2NyaWJlZCBieSBTVFJJTkcKKyAqIC11LCAtLXV0YywgLS11bml2ZXJzYWwKKyAqICAgICAgcHJpbnQgb3Igc2V0IENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lCisgKgorICogQnVzeWJveDoKKyAqIGxvbmcgb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZAorICogLWYgaXMgbm90IHN1cHBvcnRlZAorICogLUkgc2VlbXMgdG8gcm91Z2hseSBtYXRjaCAtLXJmYy0zMzM5LCBidXQgLUkgaGFzIF9vcHRpb25hbF8gcGFyYW0KKyAqICAgICh0aHVzICItSSBzZWNvbmRzIiBkb2Vzbid0IHdvcmssIG9ubHkgIi1Jc2Vjb25kcyIpLAorICogICAgYW5kIGRvZXMgbm90IHN1cHBvcnQgLUlucworICogLUQgRk1UIGlzIGEgYmJveCBleHRlbnNpb24gZm9yIF9pbnB1dF8gY29udmVyc2lvbiBvZiAtZCBEQVRFCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRhdGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbK0ZNVF0gW1RJTUVdIgorLy91c2FnZTojZGVmaW5lIGRhdGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHRpbWUgKHVzaW5nICtGTVQpLCBvciBzZXQgdGltZVxuIgorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JWy1zXSBUSU1FCVNldCB0aW1lIHRvIFRJTUUiCisvL3VzYWdlOiAgICAgIlxuCS11CQlXb3JrIGluIFVUQyAoZG9uJ3QgY29udmVydCB0byBsb2NhbCB0aW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJCU91dHB1dCBSRkMtMjgyMiBjb21wbGlhbnQgZGF0ZSBzdHJpbmciCisvL3VzYWdlOgkpIElGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JWy1zLC0tc2V0XSBUSU1FCVNldCB0aW1lIHRvIFRJTUUiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXRjCVdvcmsgaW4gVVRDIChkb24ndCBjb252ZXJ0IHRvIGxvY2FsIHRpbWUpIgorLy91c2FnZTogICAgICJcbgktUiwtLXJmYy0yODIyCU91dHB1dCBSRkMtMjgyMiBjb21wbGlhbnQgZGF0ZSBzdHJpbmciCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0RBVEVfSVNPRk1UKAorLy91c2FnZTogICAgICJcbgktSVtTUEVDXQlPdXRwdXQgSVNPLTg2MDEgY29tcGxpYW50IGRhdGUgc3RyaW5nIgorLy91c2FnZTogICAgICJcbgkJCVNQRUM9J2RhdGUnIChkZWZhdWx0KSBmb3IgZGF0ZSBvbmx5LCIKKy8vdXNhZ2U6ICAgICAiXG4JCQknaG91cnMnLCAnbWludXRlcycsIG9yICdzZWNvbmRzJyBmb3IgZGF0ZSBhbmQiCisvL3VzYWdlOiAgICAgIlxuCQkJdGltZSB0byB0aGUgaW5kaWNhdGVkIHByZWNpc2lvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1yIEZJTEUJCURpc3BsYXkgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFIgorLy91c2FnZTogICAgICJcbgktZCBUSU1FCQlEaXNwbGF5IFRJTUUsIG5vdCAnbm93JyIKKy8vdXNhZ2U6CSkgSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktciwtLXJlZmVyZW5jZSBGSUxFCURpc3BsYXkgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFIgorLy91c2FnZTogICAgICJcbgktZCwtLWRhdGUgVElNRQlEaXNwbGF5IFRJTUUsIG5vdCAnbm93JyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfREFURV9JU09GTVQoCisvL3VzYWdlOiAgICAgIlxuCS1EIEZNVAkJVXNlIEZNVCBmb3IgLWQgVElNRSBjb252ZXJzaW9uIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5SZWNvZ25pemVkIFRJTUUgZm9ybWF0czoiCisvL3VzYWdlOiAgICAgIlxuCWhoOm1tWzpzc10iCisvL3VzYWdlOiAgICAgIlxuCVtZWVlZLl1NTS5ERC1oaDptbVs6c3NdIgorLy91c2FnZTogICAgICJcbglZWVlZLU1NLUREIGhoOm1tWzpzc10iCisvL3VzYWdlOiAgICAgIlxuCVtbW1tbWVldWVldTU1dRERdaGhdbW1bLnNzXSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZGF0ZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkYXRlXG4iCisvL3VzYWdlOiAgICAgICAiV2VkIEFwciAxMiAxODo1Mjo0MSBNRFQgMjAwMFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9EQVRFX05BTk8KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorCitlbnVtIHsKKwlPUFRfUkZDMjgyMiAgID0gKDEgPDwgMCksIC8qIFIgKi8KKwlPUFRfU0VUICAgICAgID0gKDEgPDwgMSksIC8qIHMgKi8KKwlPUFRfVVRDICAgICAgID0gKDEgPDwgMiksIC8qIHUgKi8KKwlPUFRfREFURSAgICAgID0gKDEgPDwgMyksIC8qIGQgKi8KKwlPUFRfUkVGRVJFTkNFID0gKDEgPDwgNCksIC8qIHIgKi8KKwlPUFRfVElNRVNQRUMgID0gKDEgPDwgNSkgKiBFTkFCTEVfRkVBVFVSRV9EQVRFX0lTT0ZNVCwgLyogSSAqLworCU9QVF9ISU5UICAgICAgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX0RBVEVfSVNPRk1ULCAvKiBEICovCit9OworCitzdGF0aWMgdm9pZCBtYXliZV9zZXRfdXRjKGludCBvcHQpCit7CisJaWYgKG9wdCAmIE9QVF9VVEMpCisJCXB1dGVudigoY2hhciopIlRaPVVUQzAiKTsKK30KKworI2lmIEVOQUJMRV9MT05HX09QVFMKK3N0YXRpYyBjb25zdCBjaGFyIGRhdGVfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkicmZjLTgyMlwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCQkicmZjLTI4MjJcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCQkic2V0XDAiICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJzIgorCQkidXRjXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ1IgorCS8qCSJ1bml2ZXJzYWxcMCIgTm9fYXJndW1lbnQgICAgICAgInUiICovCisJCSJkYXRlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImQiCisJCSJyZWZlcmVuY2VcMCIgUmVxdWlyZWRfYXJndW1lbnQgInIiCisJCTsKKyNlbmRpZgorCitpbnQgZGF0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGF0ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCB0bSB0bV90aW1lOworCWNoYXIgYnVmX2ZtdF9kdDJzdHJbNjRdOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgaWZtdCA9IC0xOworCWNoYXIgKmRhdGVfc3RyOworCWNoYXIgKmZtdF9kdDJzdHI7CisJY2hhciAqZm10X3N0cjJkdDsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICppc29mbXRfYXJnID0gTlVMTDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImQtLXM6cy0tZCIKKwkJSUZfRkVBVFVSRV9EQVRFX0lTT0ZNVCgiOlItLUk6SS0tUiIpOworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gZGF0ZV9sb25nb3B0czspCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIlJzOnVkOnI6IgorCQkJSUZfRkVBVFVSRV9EQVRFX0lTT0ZNVCgiSTo6RDoiKSwKKwkJCSZkYXRlX3N0ciwgJmRhdGVfc3RyLCAmZmlsZW5hbWUKKwkJCUlGX0ZFQVRVUkVfREFURV9JU09GTVQoLCAmaXNvZm10X2FyZywgJmZtdF9zdHIyZHQpKTsKKwlhcmd2ICs9IG9wdGluZDsKKwltYXliZV9zZXRfdXRjKG9wdCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfREFURV9JU09GTVQgJiYgKG9wdCAmIE9QVF9USU1FU1BFQykpIHsKKwkJaWZtdCA9IDA7IC8qIGRlZmF1bHQgaXMgZGF0ZSAqLworCQlpZiAoaXNvZm10X2FyZykgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgaXNvZm9ybWF0c1tdIEFMSUdOMSA9CisJCQkJImRhdGVcMCIiaG91cnNcMCIibWludXRlc1wwIiJzZWNvbmRzXDAiOyAvKiBucz8gKi8KKwkJCWlmbXQgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGlzb2Zvcm1hdHMsIGlzb2ZtdF9hcmcpOworCQkJaWYgKGlmbXQgPCAwKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKworCWZtdF9kdDJzdHIgPSBOVUxMOworCWlmIChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0gPT0gJysnKSB7CisJCWZtdF9kdDJzdHIgPSAmYXJndlswXVsxXTsgLyogc2tpcCBvdmVyIHRoZSAnKycgKi8KKwkJYXJndisrOworCX0KKwlpZiAoIShvcHQgJiAoT1BUX1NFVCB8IE9QVF9EQVRFKSkpIHsKKwkJb3B0IHw9IE9QVF9TRVQ7CisJCWRhdGVfc3RyID0gYXJndlswXTsgLyogY2FuIGJlIE5VTEwgKi8KKwkJaWYgKGRhdGVfc3RyKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9DT01QQVQKKwkJCWludCBsZW4gPSBzdHJzcG4oZGF0ZV9zdHIsICIwMTIzNDU2Nzg5Iik7CisJCQlpZiAoZGF0ZV9zdHJbbGVuXSA9PSAnXDAnCisJCQkgfHwgKGRhdGVfc3RyW2xlbl0gPT0gJy4nCisJCQkgICAgJiYgaXNkaWdpdChkYXRlX3N0cltsZW4rMV0pCisJCQkgICAgJiYgaXNkaWdpdChkYXRlX3N0cltsZW4rMl0pCisJCQkgICAgJiYgZGF0ZV9zdHJbbGVuKzNdID09ICdcMCcKKwkJCSAgICApCisJCQkpIHsKKwkJCQkvKiBEcmVhZGVkIE1NRERoaG1tW1tDQ11ZWV1bLnNzXSBmb3JtYXQhCisJCQkJICogSXQgZG9lcyBub3QgbWF0Y2ggLWQgb3IgLXMgZm9ybWF0LgorCQkJCSAqIFNvbWUgdXNlcnMgYWN0dWFsbHkgZG8gdXNlIGl0LgorCQkJCSAqLworCQkJCWxlbiAtPSA4OworCQkJCWlmIChsZW4gPCAwIHx8IGxlbiA+IDQgfHwgKGxlbiAmIDEpKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9kYXRlLCBkYXRlX3N0cik7CisJCQkJaWYgKGxlbiAhPSAwKSB7IC8qIG1vdmUgWVkgb3IgQ0NZWSB0byBmcm9udCAqLworCQkJCQljaGFyIGJ1Zls0XTsKKwkJCQkJbWVtY3B5KGJ1ZiwgZGF0ZV9zdHIgKyA4LCBsZW4pOworCQkJCQltZW1tb3ZlKGRhdGVfc3RyICsgbGVuLCBkYXRlX3N0ciwgOCk7CisJCQkJCW1lbWNweShkYXRlX3N0ciwgYnVmLCBsZW4pOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJYXJndisrOworCQl9CisJfQorCWlmICgqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogTm93IHdlIGhhdmUgcGFyc2VkIGFsbCB0aGUgaW5mb3JtYXRpb24gZXhjZXB0IHRoZSBkYXRlIGZvcm1hdAorCSAqIHdoaWNoIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2xvY2sgaXMgYmVpbmcgc2V0IG9yIHJlYWQgKi8KKworCWlmIChvcHQgJiBPUFRfUkVGRVJFTkNFKSB7CisJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJCXhzdGF0KGZpbGVuYW1lLCAmc3RhdGJ1Zik7CisJCXRzLnR2X3NlYyA9IHN0YXRidWYuc3RfbXRpbWU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9OQU5PCisJCXRzLnR2X25zZWMgPSBzdGF0YnVmLnN0X210aW0udHZfbnNlYzsKKwkJLyogU29tZSB0b29sY2hhaW5zIHVzZSAuc3RfbXRpbWVuc2VjIGluc3RlYWQgb2Ygc3RfbXRpbS50dl9uc2VjLgorCQkgKiBJZiB5b3UgbmVlZCAjZGVmaW5lIF9TVklEX1NPVVJDRSAxIHRvIGVuYWJsZSBzdF9tdGltLnR2X25zZWMsCisJCSAqIGRyb3AgYSBtYWlsIHRvIHByb2plY3QgbWFpbGluZyBsaXN0IHBsZWFzZQorCQkgKi8KKyNlbmRpZgorCX0gZWxzZSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9OQU5PCisJCS8qIGxpYmMgaGFzIGluY3JlZGlibHkgbWVzc3kgd2F5IG9mIGRvaW5nIHRoaXMsCisJCSAqIHR5cGljYWxseSByZXF1aXJpbmcgLWxydC4gV2UganVzdCBza2lwIGFsbCB0aGlzIG1lc3MgKi8KKwkJc3lzY2FsbChfX05SX2Nsb2NrX2dldHRpbWUsIENMT0NLX1JFQUxUSU1FLCAmdHMpOworI2Vsc2UKKwkJdGltZSgmdHMudHZfc2VjKTsKKyNlbmRpZgorCX0KKwlsb2NhbHRpbWVfcigmdHMudHZfc2VjLCAmdG1fdGltZSk7CisKKwkvKiBJZiBkYXRlIHN0cmluZyBpcyBnaXZlbiwgdXBkYXRlIHRtX3RpbWUsIGFuZCBtYXliZSBzZXQgZGF0ZSAqLworCWlmIChkYXRlX3N0ciAhPSBOVUxMKSB7CisJCS8qIFplcm8gb3V0IGZpZWxkcyAtIHRha2UgaGVyIGJhY2sgdG8gbWlkbmlnaHQhICovCisJCXRtX3RpbWUudG1fc2VjID0gMDsKKwkJdG1fdGltZS50bV9taW4gPSAwOworCQl0bV90aW1lLnRtX2hvdXIgPSAwOworCisJCS8qIFByb2Nlc3MgYW55IGRhdGUgaW5wdXQgdG8gVU5JWCB0aW1lIHNpbmNlIDEgSmFuIDE5NzAgKi8KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0RBVEVfSVNPRk1UICYmIChvcHQgJiBPUFRfSElOVCkpIHsKKwkJCWlmIChzdHJwdGltZShkYXRlX3N0ciwgZm10X3N0cjJkdCwgJnRtX3RpbWUpID09IE5VTEwpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCQl9IGVsc2UgeworCQkJcGFyc2VfZGF0ZXN0cihkYXRlX3N0ciwgJnRtX3RpbWUpOworCQl9CisKKwkJLyogQ29ycmVjdCBhbnkgZGF5IG9mIHdlZWsgYW5kIGRheSBvZiB5ZWFyIGV0Yy4gZmllbGRzICovCisJCS8qIEJlIHN1cmUgdG8gcmVjaGVjayBkc3QgKGJ1dCBub3QgaWYgZGF0ZSBpcyB0aW1lX3QgZm9ybWF0KSAqLworCQlpZiAoZGF0ZV9zdHJbMF0gIT0gJ0AnKQorCQkJdG1fdGltZS50bV9pc2RzdCA9IC0xOworCQl0cy50dl9zZWMgPSB2YWxpZGF0ZV90bV90aW1lKGRhdGVfc3RyLCAmdG1fdGltZSk7CisKKwkJbWF5YmVfc2V0X3V0YyhvcHQpOworCisJCS8qIGlmIHNldHRpbmcgdGltZSwgc2V0IGl0ICovCisJCWlmICgob3B0ICYgT1BUX1NFVCkgJiYgc3RpbWUoJnRzLnR2X3NlYykgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZXQgZGF0ZSIpOworCQl9CisJfQorCisJLyogRGlzcGxheSBvdXRwdXQgKi8KKworCS8qIERlYWwgd2l0aCBmb3JtYXQgc3RyaW5nICovCisJaWYgKGZtdF9kdDJzdHIgPT0gTlVMTCkgeworCQlpbnQgaTsKKwkJZm10X2R0MnN0ciA9IGJ1Zl9mbXRfZHQyc3RyOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfREFURV9JU09GTVQgJiYgaWZtdCA+PSAwKSB7CisJCQkvKiAtSVtTUEVDXTogMDpkYXRlIDE6aG91cnMgMjptaW51dGVzIDM6c2Vjb25kcyAqLworCQkJc3RyY3B5KGZtdF9kdDJzdHIsICIlWS0lbS0lZFQlSDolTTolUyIpOworCQkJaSA9IDggKyAzICogaWZtdDsKKwkJCWlmIChpZm10ICE9IDApIHsKKwkJCQkvKiBUT0RPOiBpZiAoaWZtdD09NCkgaSArPSBzcHJpbnRmKCZmbXRfZHQyc3RyW2ldLCAiLCUwOXUiLCBuYW5vc2Vjb25kcyk7ICovCisgZm9ybWF0X3V0YzoKKwkJCQlmbXRfZHQyc3RyW2krK10gPSAnJSc7CisJCQkJZm10X2R0MnN0cltpKytdID0gKG9wdCAmIE9QVF9VVEMpID8gJ1onIDogJ3onOworCQkJfQorCQkJZm10X2R0MnN0cltpXSA9ICdcMCc7CisJCX0gZWxzZSBpZiAob3B0ICYgT1BUX1JGQzI4MjIpIHsKKwkJCS8qIC1SLiB1bmRvIGJ1c3lib3guYyBzZXRsb2NhbGUgKi8KKwkJCWlmIChFTkFCTEVfTE9DQUxFX1NVUFBPUlQpCisJCQkJc2V0bG9jYWxlKExDX1RJTUUsICJDIik7CisJCQlzdHJjcHkoZm10X2R0MnN0ciwgIiVhLCAlZCAlYiAlWSAlSDolTTolUyAiKTsKKwkJCWkgPSBzaXplb2YoIiVhLCAlZCAlYiAlWSAlSDolTTolUyAiKS0xOworCQkJZ290byBmb3JtYXRfdXRjOworCQl9IGVsc2UgeyAvKiBkZWZhdWx0IGNhc2UgKi8KKwkJCWZtdF9kdDJzdHIgPSAoY2hhciopIiVhICViICVlICVIOiVNOiVTICVaICVZIjsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9EQVRFX05BTk8KKwllbHNlIHsKKwkJLyogVXNlci1zcGVjaWZpZWQgZm10X2R0MnN0ciAqLworCQkvKiBTZWFyY2ggZm9yIGFuZCBwcm9jZXNzICIlTiIgKi8KKwkJY2hhciAqcCA9IGZtdF9kdDJzdHI7CisJCXdoaWxlICgocCA9IHN0cmNocihwLCAnJScpKSAhPSBOVUxMKSB7CisJCQlpbnQgbiwgbTsKKwkJCXVuc2lnbmVkIHByZXMsIHNjYWxlOworCisJCQlwKys7CisJCQlpZiAoKnAgPT0gJyUnKSB7CisJCQkJcCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbiA9IHN0cnNwbihwLCAiMDEyMzQ1Njc4OSIpOworCQkJaWYgKHBbbl0gIT0gJ04nKSB7CisJCQkJcCArPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogV2UgaGF2ZSAiJVtubm5dTiIgKi8KKwkJCXBbLTFdID0gJ1wwJzsKKwkJCXBbbl0gPSAnXDAnOworCQkJc2NhbGUgPSAxOworCQkJcHJlcyA9IDk7CisJCQlpZiAobikgeworCQkJCXByZXMgPSB4YXRvaV9wb3NpdGl2ZShwKTsKKwkJCQlpZiAocHJlcyA9PSAwKQorCQkJCQlwcmVzID0gOTsKKwkJCQltID0gOSAtIHByZXM7CisJCQkJd2hpbGUgKC0tbSA+PSAwKQorCQkJCQlzY2FsZSAqPSAxMDsKKwkJCX0KKworCQkJbSA9IHAgLSBmbXRfZHQyc3RyOworCQkJcCArPSBuICsgMTsKKwkJCWZtdF9kdDJzdHIgPSB4YXNwcmludGYoIiVzJTAqdSVzIiwgZm10X2R0MnN0ciwgcHJlcywgKHVuc2lnbmVkKXRzLnR2X25zZWMgLyBzY2FsZSwgcCk7CisJCQlwID0gZm10X2R0MnN0ciArIG07CisJCX0KKwl9CisjZW5kaWYKKworI2RlZmluZSBkYXRlX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCWlmICgqZm10X2R0MnN0ciA9PSAnXDAnKSB7CisJCS8qIFdpdGggbm8gZm9ybWF0IHN0cmluZywganVzdCBwcmludCBhIGJsYW5rIGxpbmUgKi8KKwkJZGF0ZV9idWZbMF0gPSAnXDAnOworCX0gZWxzZSB7CisJCS8qIEhhbmRsZSBzcGVjaWFsIGNvbnZlcnNpb25zICovCisJCWlmIChzdHJuY21wKGZtdF9kdDJzdHIsICIlZiIsIDIpID09IDApIHsKKwkJCWZtdF9kdDJzdHIgPSAoY2hhciopIiVZLiVtLiVkLSVIOiVNOiVTIjsKKwkJfQorCQkvKiBHZW5lcmF0ZSBvdXRwdXQgc3RyaW5nICovCisJCXN0cmZ0aW1lKGRhdGVfYnVmLCBzaXplb2YoZGF0ZV9idWYpLCBmbXRfZHQyc3RyLCAmdG1fdGltZSk7CisJfQorCXB1dHMoZGF0ZV9idWYpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9kZC5jIGIvY29yZXV0aWxzL2RkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MDJlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9kZC5jCkBAIC0wLDAgKzEsNDM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGRkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBNYXR0IEtyYWFpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltpZj1GSUxFXSBbb2Y9RklMRV0gIiBJRl9GRUFUVVJFX0REX0lCU19PQlMoIltpYnM9Tl0gW29icz1OXSAiKSAiW2JzPU5dIFtjb3VudD1OXSBbc2tpcD1OXVxuIgorLy91c2FnZTogICAgICAgIglbc2Vlaz1OXSIgSUZfRkVBVFVSRV9ERF9JQlNfT0JTKCIgW2NvbnY9bm90cnVuY3xub2Vycm9yfHN5bmN8ZnN5bmNdIikKKy8vdXNhZ2U6I2RlZmluZSBkZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgYSBmaWxlIHdpdGggY29udmVydGluZyBhbmQgZm9ybWF0dGluZ1xuIgorLy91c2FnZTogICAgICJcbglpZj1GSUxFCQlSZWFkIGZyb20gRklMRSBpbnN0ZWFkIG9mIHN0ZGluIgorLy91c2FnZTogICAgICJcbglvZj1GSUxFCQlXcml0ZSB0byBGSUxFIGluc3RlYWQgb2Ygc3Rkb3V0IgorLy91c2FnZTogICAgICJcbglicz1OCQlSZWFkIGFuZCB3cml0ZSBOIGJ5dGVzIGF0IGEgdGltZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRERfSUJTX09CUygKKy8vdXNhZ2U6ICAgICAiXG4JaWJzPU4JCVJlYWQgTiBieXRlcyBhdCBhIHRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0REX0lCU19PQlMoCisvL3VzYWdlOiAgICAgIlxuCW9icz1OCQlXcml0ZSBOIGJ5dGVzIGF0IGEgdGltZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JY291bnQ9TgkJQ29weSBvbmx5IE4gaW5wdXQgYmxvY2tzIgorLy91c2FnZTogICAgICJcbglza2lwPU4JCVNraXAgTiBpbnB1dCBibG9ja3MiCisvL3VzYWdlOiAgICAgIlxuCXNlZWs9TgkJU2tpcCBOIG91dHB1dCBibG9ja3MiCisvL3VzYWdlOglJRl9GRUFUVVJFX0REX0lCU19PQlMoCisvL3VzYWdlOiAgICAgIlxuCWNvbnY9bm90cnVuYwlEb24ndCB0cnVuY2F0ZSBvdXRwdXQgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JY29udj1ub2Vycm9yCUNvbnRpbnVlIGFmdGVyIHJlYWQgZXJyb3JzIgorLy91c2FnZTogICAgICJcbgljb252PXN5bmMJUGFkIGJsb2NrcyB3aXRoIHplcm9zIgorLy91c2FnZTogICAgICJcbgljb252PWZzeW5jCVBoeXNpY2FsbHkgd3JpdGUgZGF0YSBvdXQgYmVmb3JlIGZpbmlzaGluZyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuTnVtYmVycyBtYXkgYmUgc3VmZml4ZWQgYnkgYyAoeDEpLCB3ICh4MiksIGIgKHg1MTIpLCBrRCAoeDEwMDApLCBrICh4MTAyNCksIgorLy91c2FnZTogICAgICJcbk1EICh4MTAwMDAwMCksIE0gKHgxMDQ4NTc2KSwgR0QgKHgxMDAwMDAwMDAwKSBvciBHICh4MTA3Mzc0MTgyNCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRkIGlmPS9kZXYvemVybyBvZj0vZGV2L3JhbTEgYnM9MU0gY291bnQ9NFxuIgorLy91c2FnZTogICAgICAgIjQrMCByZWNvcmRzIGluXG4iCisvL3VzYWdlOiAgICAgICAiNCswIHJlY29yZHMgb3V0XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKK2VudW0geworCWlmZCA9IFNURElOX0ZJTEVOTywKKwlvZmQgPSBTVERPVVRfRklMRU5PLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBkZF9zdWZmaXhlc1tdID0geworCXsgImMiLCAxIH0sCisJeyAidyIsIDIgfSwKKwl7ICJiIiwgNTEyIH0sCisJeyAia0QiLCAxMDAwIH0sCisJeyAiayIsIDEwMjQgfSwKKwl7ICJLIiwgMTAyNCB9LCAgLyogY29tcGF0IHdpdGggY29yZXV0aWxzIGRkICovCisJeyAiTUQiLCAxMDAwMDAwIH0sCisJeyAiTSIsIDEwNDg1NzYgfSwKKwl7ICJHRCIsIDEwMDAwMDAwMDAgfSwKKwl7ICJHIiwgMTA3Mzc0MTgyNCB9LAorCXsgIiIsIDAgfQorfTsKKworc3RydWN0IGdsb2JhbHMgeworCW9mZl90IG91dF9mdWxsLCBvdXRfcGFydCwgaW5fZnVsbCwgaW5fcGFydDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORQorCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmVnaW5fdGltZV91czsKKyNlbmRpZgorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJLyogd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWNhdXNlIG9mIE5PRVhFQyAqLyBcCisJbWVtc2V0KCZHLCAwLCBzaXplb2YoRykpOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB2b2lkIGRkX291dHB1dF9zdGF0dXMoaW50IFVOVVNFRF9QQVJBTSBjdXJfc2lnbmFsKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FCisJZG91YmxlIHNlY29uZHM7CisJdW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzX3NlYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93X3VzID0gbW9ub3RvbmljX3VzKCk7IC8qIGJlZm9yZSBmcHJpbnRmICovCisjZW5kaWYKKworCS8qIERlbGliZXJhdGVseSB1c2luZyAldSwgbm90ICVkICovCisJZnByaW50ZihzdGRlcnIsICIlIk9GRl9GTVQidSslIk9GRl9GTVQidSByZWNvcmRzIGluXG4iCisJCQkiJSJPRkZfRk1UInUrJSJPRkZfRk1UInUgcmVjb3JkcyBvdXRcbiIsCisJCQlHLmluX2Z1bGwsIEcuaW5fcGFydCwKKwkJCUcub3V0X2Z1bGwsIEcub3V0X3BhcnQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwlmcHJpbnRmKHN0ZGVyciwgIiVsbHUgYnl0ZXMgKCVzQikgY29waWVkLCAiLAorCQkJRy50b3RhbF9ieXRlcywKKwkJCS8qIHNob3cgZnJhY3Rpb25hbCBkaWdpdCwgdXNlIHN1ZmZpeGVzICovCisJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihHLnRvdGFsX2J5dGVzLCAxLCAwKQorCSk7CisJLyogQ29ybmVyIGNhc2VzOgorCSAqIC4vYnVzeWJveCBkZCA8L2Rldi9udWxsID4vZGV2L251bGwKKwkgKiAuL2J1c3lib3ggZGQgYnM9MU0gY291bnQ9MjAwMCA8L2Rldi96ZXJvID4vZGV2L251bGwKKwkgKiAoZWNobyBET05FKSB8IC4vYnVzeWJveCBkZCA+L2Rldi9udWxsCisJICogKHNsZWVwIDE7IGVjaG8gRE9ORSkgfCAuL2J1c3lib3ggZGQgPi9kZXYvbnVsbAorCSAqLworCXNlY29uZHMgPSAobm93X3VzIC0gRy5iZWdpbl90aW1lX3VzKSAvIDEwMDAwMDAuMDsKKwlieXRlc19zZWMgPSBHLnRvdGFsX2J5dGVzIC8gc2Vjb25kczsKKwlmcHJpbnRmKHN0ZGVyciwgIiVmIHNlY29uZHMsICVzQi9zXG4iLAorCQkJc2Vjb25kcywKKwkJCS8qIHNob3cgZnJhY3Rpb25hbCBkaWdpdCwgdXNlIHN1ZmZpeGVzICovCisJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihieXRlc19zZWMsIDEsIDApCisJKTsKKyNlbmRpZgorfQorCitzdGF0aWMgc3NpemVfdCBmdWxsX3dyaXRlX29yX3dhcm4oY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAorCWNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lKQoreworCXNzaXplX3QgbiA9IGZ1bGxfd3JpdGUob2ZkLCBidWYsIGxlbik7CisJaWYgKG4gPCAwKQorCQliYl9wZXJyb3JfbXNnKCJ3cml0aW5nICclcyciLCBmaWxlbmFtZSk7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBib29sIHdyaXRlX2FuZF9zdGF0cyhjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIHNpemVfdCBvYnMsCisJY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3NpemVfdCBuID0gZnVsbF93cml0ZV9vcl93YXJuKGJ1ZiwgbGVuLCBmaWxlbmFtZSk7CisJaWYgKG4gPCAwKQorCQlyZXR1cm4gMTsKKwlpZiAoKHNpemVfdCluID09IG9icykKKwkJRy5vdXRfZnVsbCsrOworCWVsc2UgaWYgKG4pIC8qID4gMCAqLworCQlHLm91dF9wYXJ0Kys7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwlHLnRvdGFsX2J5dGVzICs9IG47CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9MRlMKKyMgZGVmaW5lIFhBVE9VX1NGWCB4YXRvdWxsX3NmeAorI2Vsc2UKKyMgZGVmaW5lIFhBVE9VX1NGWCB4YXRvdWxfc2Z4CisjZW5kaWYKKworaW50IGRkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCS8qIE11c3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgT1BfY29udl9YWFghICovCisJCS8qIChzZWUgImZsYWdzIHw9ICgxIDw8IHdoYXQpIiBiZWxvdykgKi8KKwkJRkxBR19OT1RSVU5DID0gMSA8PCAwLAorCQlGTEFHX1NZTkMgICAgPSAxIDw8IDEsCisJCUZMQUdfTk9FUlJPUiA9IDEgPDwgMiwKKwkJRkxBR19GU1lOQyAgID0gMSA8PCAzLAorCQkvKiBlbmQgb2YgY29udiBmbGFncyAqLworCQlGTEFHX1RXT0JVRlMgPSAxIDw8IDQsCisJCUZMQUdfQ09VTlQgICA9IDEgPDwgNSwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJImJzXDAiImNvdW50XDAiInNlZWtcMCIic2tpcFwwIiJpZlwwIiJvZlwwIgorI2lmIEVOQUJMRV9GRUFUVVJFX0REX0lCU19PQlMKKwkJImlic1wwIiJvYnNcMCIiY29udlwwIgorI2VuZGlmCisJCTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTCisJc3RhdGljIGNvbnN0IGNoYXIgY29udl93b3Jkc1tdIEFMSUdOMSA9CisJCSJub3RydW5jXDAiInN5bmNcMCIibm9lcnJvclwwIiJmc3luY1wwIjsKKyNlbmRpZgorCWVudW0geworCQlPUF9icyA9IDAsCisJCU9QX2NvdW50LAorCQlPUF9zZWVrLAorCQlPUF9za2lwLAorCQlPUF9pZiwKKwkJT1Bfb2YsCisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUworCQlPUF9pYnMsCisJCU9QX29icywKKwkJT1BfY29udiwKKwkJLyogTXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBGTEFHX1hYWCEgKi8KKwkJT1BfY29udl9ub3RydW5jID0gMCwKKwkJT1BfY29udl9zeW5jLAorCQlPUF9jb252X25vZXJyb3IsCisJCU9QX2NvbnZfZnN5bmMsCisJLyogVW5pbXBsZW1lbnRlZCBjb252PVhYWDogKi8KKwkvL25vY3JlYXQgICAgICAgZG8gbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUKKwkvL2V4Y2wgICAgICAgICAgZmFpbCBpZiB0aGUgb3V0cHV0IGZpbGUgYWxyZWFkeSBleGlzdHMKKwkvL2ZkYXRhc3luYyAgICAgcGh5c2ljYWxseSB3cml0ZSBvdXRwdXQgZmlsZSBkYXRhIGJlZm9yZSBmaW5pc2hpbmcKKwkvL3N3YWIgICAgICAgICAgc3dhcCBldmVyeSBwYWlyIG9mIGlucHV0IGJ5dGVzCisJLy9sY2FzZSAgICAgICAgIGNoYW5nZSB1cHBlciBjYXNlIHRvIGxvd2VyIGNhc2UKKwkvL3VjYXNlICAgICAgICAgY2hhbmdlIGxvd2VyIGNhc2UgdG8gdXBwZXIgY2FzZQorCS8vYmxvY2sgICAgICAgICBwYWQgbmV3bGluZS10ZXJtaW5hdGVkIHJlY29yZHMgd2l0aCBzcGFjZXMgdG8gY2JzLXNpemUKKwkvL3VuYmxvY2sgICAgICAgcmVwbGFjZSB0cmFpbGluZyBzcGFjZXMgaW4gY2JzLXNpemUgcmVjb3JkcyB3aXRoIG5ld2xpbmUKKwkvL2FzY2lpICAgICAgICAgZnJvbSBFQkNESUMgdG8gQVNDSUkKKwkvL2ViY2RpYyAgICAgICAgZnJvbSBBU0NJSSB0byBFQkNESUMKKwkvL2libSAgICAgICAgICAgZnJvbSBBU0NJSSB0byBhbHRlcm5hdGUgRUJDRElDCisjZW5kaWYKKwl9OworCWludCBleGl0Y29kZSA9IEVYSVRfRkFJTFVSRTsKKwlzaXplX3QgaWJzID0gNTEyLCBvYnMgPSA1MTI7CisJc3NpemVfdCBuLCB3OworCWNoYXIgKmlidWYsICpvYnVmOworCS8qIEFuZCB0aGVzZSBhcmUgYWxsIHplcm9lZCBhdCBvbmNlISAqLworCXN0cnVjdCB7CisJCWludCBmbGFnczsKKwkJc2l6ZV90IG9jOworCQlvZmZfdCBjb3VudDsKKwkJb2ZmX3Qgc2Vlaywgc2tpcDsKKwkJY29uc3QgY2hhciAqaW5maWxlLCAqb3V0ZmlsZTsKKwl9IFo7CisjZGVmaW5lIGZsYWdzICAgKFouZmxhZ3MgICkKKyNkZWZpbmUgb2MgICAgICAoWi5vYyAgICAgKQorI2RlZmluZSBjb3VudCAgIChaLmNvdW50ICApCisjZGVmaW5lIHNlZWsgICAgKFouc2VlayAgICkKKyNkZWZpbmUgc2tpcCAgICAoWi5za2lwICAgKQorI2RlZmluZSBpbmZpbGUgIChaLmluZmlsZSApCisjZGVmaW5lIG91dGZpbGUgKFoub3V0ZmlsZSkKKworCW1lbXNldCgmWiwgMCwgc2l6ZW9mKFopKTsKKwlJTklUX0coKTsKKwkvL2ZmbHVzaF9hbGwoKTsgLSBpcyB0aGlzIG5lZWRlZCBiZWNhdXNlIG9mIE5PRVhFQz8KKworCWZvciAobiA9IDE7IGFyZ3Zbbl07IG4rKykgeworCQlpbnQgd2hhdDsKKwkJY2hhciAqdmFsOworCQljaGFyICphcmcgPSBhcmd2W25dOworCisjaWYgRU5BQkxFX0RFU0tUT1AKKwkJLyogImRkIC0tIi4gTkI6IGNvcmV1dGlscyA2Ljkgd2lsbCBjb21wbGFpbiBpZiB0aGV5IHNlZQorCQkgKiBtb3JlIHRoYW4gb25lIG9mIHRoZW0uIFdlIHdvdWxkbid0LiAqLworCQlpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nICYmIGFyZ1syXSA9PSAnXDAnKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJdmFsID0gc3RyY2hyKGFyZywgJz0nKTsKKwkJaWYgKHZhbCA9PSBOVUxMKQorCQkJYmJfc2hvd191c2FnZSgpOworCQkqdmFsID0gJ1wwJzsKKwkJd2hhdCA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsIGFyZyk7CisJCWlmICh3aGF0IDwgMCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJLyogKnZhbCA9ICc9JzsgLSB0byBwcmVzZXJ2ZSBwcyBsaXN0aW5nPyAqLworCQl2YWwrKzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTCisJCWlmICh3aGF0ID09IE9QX2licykgeworCQkJLyogTXVzdCBmaXQgaW50byBwb3NpdGl2ZSBzc2l6ZV90ICovCisJCQlpYnMgPSB4YXRvdWxfcmFuZ2Vfc2Z4KHZhbCwgMSwgKChzaXplX3QpLTFMKS8yLCBkZF9zdWZmaXhlcyk7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJaWYgKHdoYXQgPT0gT1Bfb2JzKSB7CisJCQlvYnMgPSB4YXRvdWxfcmFuZ2Vfc2Z4KHZhbCwgMSwgKChzaXplX3QpLTFMKS8yLCBkZF9zdWZmaXhlcyk7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJaWYgKHdoYXQgPT0gT1BfY29udikgeworCQkJd2hpbGUgKDEpIHsKKwkJCQkvKiBmaW5kICcsJywgcmVwbGFjZSB0aGVtIHdpdGggTlVMIHNvIHdlIGNhbiB1c2UgdmFsIGZvcgorCQkJCSAqIGluZGV4X2luX3N0cmluZ3MoKSB3aXRob3V0IGNvcHlpbmcuCisJCQkJICogV2UgcmVseSBvbiB2YWwgYmVpbmcgbm9uLW51bGwsIGVsc2Ugc3RyY2hyIHdvdWxkIGZhdWx0LgorCQkJCSAqLworCQkJCWFyZyA9IHN0cmNocih2YWwsICcsJyk7CisJCQkJaWYgKGFyZykKKwkJCQkJKmFyZyA9ICdcMCc7CisJCQkJd2hhdCA9IGluZGV4X2luX3N0cmluZ3MoY29udl93b3JkcywgdmFsKTsKKwkJCQlpZiAod2hhdCA8IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgdmFsLCAiY29udiIpOworCQkJCWZsYWdzIHw9ICgxIDw8IHdoYXQpOworCQkJCWlmICghYXJnKSAvKiBubyAnLCcgbGVmdCwgc28gdGhpcyB3YXMgdGhlIGxhc3Qgc3BlY2lmaWVyICovCisJCQkJCWJyZWFrOworCQkJCS8qICphcmcgPSAnLCc7IC0gdG8gcHJlc2VydmUgcHMgbGlzdGluZz8gKi8KKwkJCQl2YWwgPSBhcmcgKyAxOyAvKiBza2lwIHRoaXMga2V5d29yZCBhbmQgJywnICovCisJCQl9CisJCQljb250aW51ZTsgLyogd2UgdHJhc2hlZCAnd2hhdCcsIGNhbid0IGZhbGwgdGhyb3VnaCAqLworCQl9CisjZW5kaWYKKwkJaWYgKHdoYXQgPT0gT1BfYnMpIHsKKwkJCWlicyA9IG9icyA9IHhhdG91bF9yYW5nZV9zZngodmFsLCAxLCAoKHNpemVfdCktMUwpLzIsIGRkX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQkvKiBUaGVzZSBjYW4gYmUgbGFyZ2U6ICovCisJCWlmICh3aGF0ID09IE9QX2NvdW50KSB7CisJCQlmbGFncyB8PSBGTEFHX0NPVU5UOworCQkJY291bnQgPSBYQVRPVV9TRlgodmFsLCBkZF9zdWZmaXhlcyk7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJaWYgKHdoYXQgPT0gT1Bfc2VlaykgeworCQkJc2VlayA9IFhBVE9VX1NGWCh2YWwsIGRkX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQlpZiAod2hhdCA9PSBPUF9za2lwKSB7CisJCQlza2lwID0gWEFUT1VfU0ZYKHZhbCwgZGRfc3VmZml4ZXMpOworCQkJLypjb250aW51ZTsqLworCQl9CisJCWlmICh3aGF0ID09IE9QX2lmKSB7CisJCQlpbmZpbGUgPSB2YWw7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJaWYgKHdoYXQgPT0gT1Bfb2YpIHsKKwkJCW91dGZpbGUgPSB2YWw7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwl9IC8qIGVuZCBvZiAiZm9yIChhcmd2W25dKSIgKi8KKworLy9YWFg6RklYTUUgZm9yIGh1Z2UgaWJzIG9yIG9icywgbWFsbG9jJ2luZyB0aGVtIGlzbid0IHRoZSBicmlnaHRlc3QgaWRlYSBldmVyCisJaWJ1ZiA9IG9idWYgPSB4bWFsbG9jKGlicyk7CisJaWYgKGlicyAhPSBvYnMpIHsKKwkJZmxhZ3MgfD0gRkxBR19UV09CVUZTOworCQlvYnVmID0geG1hbGxvYyhvYnMpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORworCXNpZ25hbF9TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHVVNSMSwgZGRfb3V0cHV0X3N0YXR1cyk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORQorCUcuYmVnaW5fdGltZV91cyA9IG1vbm90b25pY191cygpOworI2VuZGlmCisKKwlpZiAoaW5maWxlICE9IE5VTEwpCisJCXhtb3ZlX2ZkKHhvcGVuKGluZmlsZSwgT19SRE9OTFkpLCBpZmQpOworCWVsc2UgeworCQlpbmZpbGUgPSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCWlmIChvdXRmaWxlICE9IE5VTEwpIHsKKwkJaW50IG9mbGFnID0gT19XUk9OTFkgfCBPX0NSRUFUOworCisJCWlmICghc2VlayAmJiAhKGZsYWdzICYgRkxBR19OT1RSVU5DKSkKKwkJCW9mbGFnIHw9IE9fVFJVTkM7CisKKwkJeG1vdmVfZmQoeG9wZW4ob3V0ZmlsZSwgb2ZsYWcpLCBvZmQpOworCisJCWlmIChzZWVrICYmICEoZmxhZ3MgJiBGTEFHX05PVFJVTkMpKSB7CisJCQlpZiAoZnRydW5jYXRlKG9mZCwgc2VlayAqIG9icykgPCAwKSB7CisJCQkJc3RydWN0IHN0YXQgc3Q7CisKKwkJCQlpZiAoZnN0YXQob2ZkLCAmc3QpIDwgMAorCQkJCSB8fCBTX0lTUkVHKHN0LnN0X21vZGUpCisJCQkJIHx8IFNfSVNESVIoc3Quc3RfbW9kZSkKKwkJCQkpIHsKKwkJCQkJZ290byBkaWVfb3V0ZmlsZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlvdXRmaWxlID0gYmJfbXNnX3N0YW5kYXJkX291dHB1dDsKKwl9CisJaWYgKHNraXApIHsKKwkJaWYgKGxzZWVrKGlmZCwgc2tpcCAqIGlicywgU0VFS19DVVIpIDwgMCkgeworCQkJd2hpbGUgKHNraXAtLSA+IDApIHsKKwkJCQluID0gc2FmZV9yZWFkKGlmZCwgaWJ1ZiwgaWJzKTsKKwkJCQlpZiAobiA8IDApCisJCQkJCWdvdG8gZGllX2luZmlsZTsKKwkJCQlpZiAobiA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc2VlaykgeworCQlpZiAobHNlZWsob2ZkLCBzZWVrICogb2JzLCBTRUVLX0NVUikgPCAwKQorCQkJZ290byBkaWVfb3V0ZmlsZTsKKwl9CisKKwl3aGlsZSAoIShmbGFncyAmIEZMQUdfQ09VTlQpIHx8IChHLmluX2Z1bGwgKyBHLmluX3BhcnQgIT0gY291bnQpKSB7CisJCW4gPSBzYWZlX3JlYWQoaWZkLCBpYnVmLCBpYnMpOworCQlpZiAobiA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChuIDwgMCkgeworCQkJLyogIkJhZCBibG9jayIgKi8KKwkJCWlmICghKGZsYWdzICYgRkxBR19OT0VSUk9SKSkKKwkJCQlnb3RvIGRpZV9pbmZpbGU7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhpbmZpbGUpOworCQkJLyogR05VIGRkIHdpdGggY29udj1ub2Vycm9yIHNraXBzIG92ZXIgYmFkIGJsb2NrcyAqLworCQkJeGxzZWVrKGlmZCwgaWJzLCBTRUVLX0NVUik7CisJCQkvKiBjb252PW5vZXJyb3Isc3luYyB3cml0ZXMgTlVMcywKKwkJCSAqIGNvbnY9bm9lcnJvciBqdXN0IGlnbm9yZXMgaW5wdXQgYmFkIGJsb2NrcyAqLworCQkJbiA9IDA7CisJCX0KKwkJaWYgKChzaXplX3QpbiA9PSBpYnMpCisJCQlHLmluX2Z1bGwrKzsKKwkJZWxzZSB7CisJCQlHLmluX3BhcnQrKzsKKwkJCWlmIChmbGFncyAmIEZMQUdfU1lOQykgeworCQkJCW1lbXNldChpYnVmICsgbiwgMCwgaWJzIC0gbik7CisJCQkJbiA9IGliczsKKwkJCX0KKwkJfQorCQlpZiAoZmxhZ3MgJiBGTEFHX1RXT0JVRlMpIHsKKwkJCWNoYXIgKnRtcCA9IGlidWY7CisJCQl3aGlsZSAobikgeworCQkJCXNpemVfdCBkID0gb2JzIC0gb2M7CisKKwkJCQlpZiAoZCA+IChzaXplX3QpbikKKwkJCQkJZCA9IG47CisJCQkJbWVtY3B5KG9idWYgKyBvYywgdG1wLCBkKTsKKwkJCQluIC09IGQ7CisJCQkJdG1wICs9IGQ7CisJCQkJb2MgKz0gZDsKKwkJCQlpZiAob2MgPT0gb2JzKSB7CisJCQkJCWlmICh3cml0ZV9hbmRfc3RhdHMob2J1Ziwgb2JzLCBvYnMsIG91dGZpbGUpKQorCQkJCQkJZ290byBvdXRfc3RhdHVzOworCQkJCQlvYyA9IDA7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHdyaXRlX2FuZF9zdGF0cyhpYnVmLCBuLCBvYnMsIG91dGZpbGUpKQorCQkJZ290byBvdXRfc3RhdHVzOworCisJCWlmIChmbGFncyAmIEZMQUdfRlNZTkMpIHsKKwkJCWlmIChmc3luYyhvZmQpIDwgMCkKKwkJCQlnb3RvIGRpZV9vdXRmaWxlOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0REX0lCU19PQlMgJiYgb2MpIHsKKwkJdyA9IGZ1bGxfd3JpdGVfb3Jfd2FybihvYnVmLCBvYywgb3V0ZmlsZSk7CisJCWlmICh3IDwgMCkgZ290byBvdXRfc3RhdHVzOworCQlpZiAodyA+IDApIEcub3V0X3BhcnQrKzsKKwl9CisJaWYgKGNsb3NlKGlmZCkgPCAwKSB7CisgZGllX2luZmlsZToKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShpbmZpbGUpOworCX0KKworCWlmIChjbG9zZShvZmQpIDwgMCkgeworIGRpZV9vdXRmaWxlOgorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKG91dGZpbGUpOworCX0KKworCWV4aXRjb2RlID0gRVhJVF9TVUNDRVNTOworIG91dF9zdGF0dXM6CisJZGRfb3V0cHV0X3N0YXR1cygwKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKG9idWYpOworCQlpZiAoZmxhZ3MgJiBGTEFHX1RXT0JVRlMpCisJCQlmcmVlKGlidWYpOworCX0KKworCXJldHVybiBleGl0Y29kZTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9kZi5jIGIvY29yZXV0aWxzL2RmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkYmQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9kZi5jCkBAIC0wLDAgKzEsMjU1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGRmIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogYmFzZWQgb24gb3JpZ2luYWwgY29kZSBieSAoSSB0aGluaykgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgX05PVF8gY29tcGxpYW50IC0tIG9wdGlvbiAtdCBtaXNzaW5nLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9kZi5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU2l6ZSByZWR1Y3Rpb24uICBSZW1vdmVkIGZsb2F0aW5nIHBvaW50IGRlcGVuZGVuY3kuICBBZGRlZCBlcnJvciBjaGVja2luZworICogb24gb3V0cHV0LiAgT3V0cHV0IHN0YXRzIG9uIDAtc2l6ZWQgZmlsZXN5c3RlbXMgaWYgc3BlY2lmaWNhbGx5IGxpc3RlZCBvbgorICogdGhlIGNvbW1hbmQgbGluZS4gIFByb3Blcmx5IHJvdW5kICotYmxvY2tzLCBVc2VkLCBhbmQgQXZhaWxhYmxlIHF1YW50aXRpZXMuCisgKgorICogQXVnIDI4LCAyMDA4ICAgICAgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogSW1wbGVtZW50IC1QIGFuZCAtQjsgYmV0dGVyIGNvcmV1dGlscyBjb21wYXQ7IGNsZWFudXAKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGZfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstUGsiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hVTUFOX1JFQURBQkxFKCJtaCIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0RGX0ZBTkNZKCJhaV0gWy1CIFNJWkUiKQorLy91c2FnZToJIl0gW0ZJTEVTWVNURU1dLi4uIgorLy91c2FnZTojZGVmaW5lIGRmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZmlsZXN5c3RlbSB1c2FnZSBzdGF0aXN0aWNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1QCVBPU0lYIG91dHB1dCBmb3JtYXQiCisvL3VzYWdlOiAgICAgIlxuCS1rCTEwMjQtYnl0ZSBibG9ja3MgKGRlZmF1bHQpIgorLy91c2FnZToJSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgKKy8vdXNhZ2U6ICAgICAiXG4JLW0JMU0tYnl0ZSBibG9ja3MiCisvL3VzYWdlOiAgICAgIlxuCS1oCUh1bWFuIHJlYWRhYmxlIChlLmcuIDFLIDI0M00gMkcpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9ERl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2hvdyBhbGwgZmlsZXN5c3RlbXMiCisvL3VzYWdlOiAgICAgIlxuCS1pCUlub2RlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUIgU0laRQlCbG9ja3NpemUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRmX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRmXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgICAgMUstYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgVXNlJSBNb3VudGVkIG9uXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGEzICAgICAgICAgICAgICA4NjkwODY0ICAgODU1MzU0MCAgICAxMzczMjQgIDk4JSAvXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGExICAgICAgICAgICAgICAgIDY0MjE2ICAgICAzNjM2NCAgICAgMjc4NTIgIDU3JSAvYm9vdFxuIgorLy91c2FnZTogICAgICAgIiQgZGYgL2Rldi9zZGEzXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgICAgMUstYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgVXNlJSBNb3VudGVkIG9uXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGEzICAgICAgICAgICAgICA4NjkwODY0ICAgODU1MzU0MCAgICAxMzczMjQgIDk4JSAvXG4iCisvL3VzYWdlOiAgICAgICAiJCBQT1NJWExZX0NPUlJFQ1Q9c3VyZSBkZiAvZGV2L3NkYTNcbiIKKy8vdXNhZ2U6ICAgICAgICJGaWxlc3lzdGVtICAgICAgICAgNTEyQi1ibG9ja3MgICAgICBVc2VkIEF2YWlsYWJsZSBVc2UlIE1vdW50ZWQgb25cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3NkYTMgICAgICAgICAgICAgMTczODE3MjggIDE3MTA3MDgwICAgIDI3NDY0OCAgOTglIC9cbiIKKy8vdXNhZ2U6ICAgICAgICIkIFBPU0lYTFlfQ09SUkVDVD15ZXAgZGYgLVAgL2Rldi9zZGEzXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgICA1MTItYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgQ2FwYWNpdHkgTW91bnRlZCBvblxuIgorLy91c2FnZTogICAgICAgIi9kZXYvc2RhMyAgICAgICAgICAgICAxNzM4MTcyOCAgMTcxMDcwODAgICAgMjc0NjQ4ICAgICAgOTglIC9cbiIKKworI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworI2lmICFFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorc3RhdGljIHVuc2lnbmVkIGxvbmcga3NjYWxlKHVuc2lnbmVkIGxvbmcgYiwgdW5zaWduZWQgbG9uZyBicykKK3sKKwlyZXR1cm4gKGIgKiAodW5zaWduZWQgbG9uZyBsb25nKSBicyArIDEwMjQvMikgLyAxMDI0OworfQorI2VuZGlmCisKK2ludCBkZl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tzX3VzZWQ7CisJdW5zaWduZWQgYmxvY2tzX3BlcmNlbnRfdXNlZDsKKwl1bnNpZ25lZCBsb25nIGRmX2Rpc3BfaHIgPSAxMDI0OworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgb3B0OworCUZJTEUgKm1vdW50X3RhYmxlOworCXN0cnVjdCBtbnRlbnQgKm1vdW50X2VudHJ5OworCXN0cnVjdCBzdGF0ZnMgczsKKworCWVudW0geworCQlPUFRfS0lMTyAgPSAoMSA8PCAwKSwKKwkJT1BUX1BPU0lYID0gKDEgPDwgMSksCisJCU9QVF9BTEwgICA9ICgxIDw8IDIpICogRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1ksCisJCU9QVF9JTk9ERSA9ICgxIDw8IDMpICogRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1ksCisJCU9QVF9CU0laRSA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1ksCisJCU9QVF9IVU1BTiA9ICgxIDw8ICgyICsgMypFTkFCTEVfRkVBVFVSRV9ERl9GQU5DWSkpICogRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUsCisJCU9QVF9NRUdBICA9ICgxIDw8ICgzICsgMypFTkFCTEVfRkVBVFVSRV9ERl9GQU5DWSkpICogRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUsCisJfTsKKwljb25zdCBjaGFyICpkaXNwX3VuaXRzX2hkciA9IE5VTEw7CisJY2hhciAqY2hwOworCisJaW5pdF91bmljb2RlKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSAmJiBFTkFCTEVfRkVBVFVSRV9ERl9GQU5DWQorCW9wdF9jb21wbGVtZW50YXJ5ID0gImstbUI6bS1CazpCLWttIjsKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiay1tOm0tayI7CisjZW5kaWYKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAia1AiCisJCQlJRl9GRUFUVVJFX0RGX0ZBTkNZKCJhaUI6IikKKwkJCUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoImhtIikKKwkJCUlGX0ZFQVRVUkVfREZfRkFOQ1koLCAmY2hwKSk7CisJaWYgKG9wdCAmIE9QVF9NRUdBKQorCQlkZl9kaXNwX2hyID0gMTAyNCoxMDI0OworCisJaWYgKG9wdCAmIE9QVF9CU0laRSkKKwkJZGZfZGlzcF9ociA9IHhhdG91bF9yYW5nZShjaHAsIDEsIFVMT05HX01BWCk7IC8qIGRpc2FsbG93IDAgKi8KKworCS8qIEZyb20gdGhlIG1hbnBhZ2Ugb2YgZGYgZnJvbSBjb3JldXRpbHMtNi4xMDoKKwkgICBEaXNrIHNwYWNlIGlzIHNob3duIGluIDFLIGJsb2NrcyBieSBkZWZhdWx0LCB1bmxlc3MgdGhlIGVudmlyb25tZW50CisJICAgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNUIGlzIHNldCwgaW4gd2hpY2ggY2FzZSA1MTItYnl0ZSBibG9ja3MgYXJlIHVzZWQuCisJKi8KKwlpZiAoZ2V0ZW52KCJQT1NJWExZX0NPUlJFQ1QiKSkgLyogVE9ETyAtIGEgbmV3IGxpYmJiIGZ1bmN0aW9uPyAqLworCQlkZl9kaXNwX2hyID0gNTEyOworCisJaWYgKG9wdCAmIE9QVF9IVU1BTikgeworCQlkZl9kaXNwX2hyID0gMDsKKwkJZGlzcF91bml0c19oZHIgPSAiICAgICBTaXplIjsKKwl9CisJaWYgKG9wdCAmIE9QVF9JTk9ERSkKKwkJZGlzcF91bml0c19oZHIgPSAiICAgSW5vZGVzIjsKKworCWlmIChkaXNwX3VuaXRzX2hkciA9PSBOVUxMKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwkJZGlzcF91bml0c19oZHIgPSB4YXNwcmludGYoIiVzLWJsb2NrcyIsCisJCQkvKiBwcmludCBkZl9kaXNwX2hyLCBzaG93IG5vIGZyYWN0aW9uYWxzLAorCQkJICogdXNlIHN1ZmZpeGVzIGlmIE9QVF9QT1NJWCBpcyBzZXQgaW4gb3B0ICovCisJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihkZl9kaXNwX2hyLCAwLCAhIShvcHQgJiBPUFRfUE9TSVgpKQorCQkpOworI2Vsc2UKKwkJZGlzcF91bml0c19oZHIgPSB4YXNwcmludGYoIiVsdS1ibG9ja3MiLCBkZl9kaXNwX2hyKTsKKyNlbmRpZgorCX0KKwlwcmludGYoIkZpbGVzeXN0ZW0gICAgICAgICAgICUtMTVzVXNlZCBBdmFpbGFibGUgJXMgTW91bnRlZCBvblxuIiwKKwkJCWRpc3BfdW5pdHNfaGRyLCAob3B0ICYgT1BUX1BPU0lYKSA/ICJDYXBhY2l0eSIgOiAiVXNlJSIpOworCisJbW91bnRfdGFibGUgPSBOVUxMOworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghYXJndlswXSkgeworCQltb3VudF90YWJsZSA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKwkJaWYgKCFtb3VudF90YWJsZSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9wYXRoX210YWJfZmlsZSk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqZGV2aWNlOworCQljb25zdCBjaGFyICptb3VudF9wb2ludDsKKworCQlpZiAobW91bnRfdGFibGUpIHsKKwkJCW1vdW50X2VudHJ5ID0gZ2V0bW50ZW50KG1vdW50X3RhYmxlKTsKKwkJCWlmICghbW91bnRfZW50cnkpIHsKKwkJCQllbmRtbnRlbnQobW91bnRfdGFibGUpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJbW91bnRfcG9pbnQgPSAqYXJndisrOworCQkJaWYgKCFtb3VudF9wb2ludCkKKwkJCQlicmVhazsKKwkJCW1vdW50X2VudHJ5ID0gZmluZF9tb3VudF9wb2ludChtb3VudF9wb2ludCwgMSk7CisJCQlpZiAoIW1vdW50X2VudHJ5KSB7CisJCQkJYmJfZXJyb3JfbXNnKCIlczogY2FuJ3QgZmluZCBtb3VudCBwb2ludCIsIG1vdW50X3BvaW50KTsKKyBzZXRfZXJyb3I6CisJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJZGV2aWNlID0gbW91bnRfZW50cnktPm1udF9mc25hbWU7CisJCW1vdW50X3BvaW50ID0gbW91bnRfZW50cnktPm1udF9kaXI7CisKKwkJaWYgKHN0YXRmcyhtb3VudF9wb2ludCwgJnMpICE9IDApIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKG1vdW50X3BvaW50KTsKKwkJCWdvdG8gc2V0X2Vycm9yOworCQl9CisKKwkJaWYgKChzLmZfYmxvY2tzID4gMCkgfHwgIW1vdW50X3RhYmxlIHx8IChvcHQgJiBPUFRfQUxMKSkgeworCQkJaWYgKG9wdCAmIE9QVF9JTk9ERSkgeworCQkJCXMuZl9ibG9ja3MgPSBzLmZfZmlsZXM7CisJCQkJcy5mX2JhdmFpbCA9IHMuZl9iZnJlZSA9IHMuZl9mZnJlZTsKKwkJCQlzLmZfYnNpemUgPSAxOworCisJCQkJaWYgKGRmX2Rpc3BfaHIpCisJCQkJCWRmX2Rpc3BfaHIgPSAxOworCQkJfQorCQkJYmxvY2tzX3VzZWQgPSBzLmZfYmxvY2tzIC0gcy5mX2JmcmVlOworCQkJYmxvY2tzX3BlcmNlbnRfdXNlZCA9IDA7CisJCQlpZiAoYmxvY2tzX3VzZWQgKyBzLmZfYmF2YWlsKSB7CisJCQkJYmxvY2tzX3BlcmNlbnRfdXNlZCA9IChibG9ja3NfdXNlZCAqIDEwMFVMTAorCQkJCQkJKyAoYmxvY2tzX3VzZWQgKyBzLmZfYmF2YWlsKS8yCisJCQkJCQkpIC8gKGJsb2Nrc191c2VkICsgcy5mX2JhdmFpbCk7CisJCQl9CisKKwkJCS8qIEdOVSBjb3JldXRpbHMgNi4xMCBza2lwcyBjZXJ0YWluIG1vdW50cywgdHJ5IHRvIGJlIGNvbXBhdGlibGUuICAqLworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1NLSVBfUk9PVEZTICYmIHN0cmNtcChkZXZpY2UsICJyb290ZnMiKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgV0hZX1dFX0RPX0lUX0ZPUl9ERVZfUk9PVF9PTkxZCisJCQlpZiAoc3RyY21wKGRldmljZSwgIi9kZXYvcm9vdCIpID09IDApIHsKKwkJCQkvKiBBZGp1c3RzIGRldmljZSB0byBiZSB0aGUgcmVhbCByb290IGRldmljZSwKKwkJCQkgKiBvciBsZWF2ZXMgZGV2aWNlIGFsb25lIGlmIGl0IGNhbid0IGZpbmQgaXQgKi8KKwkJCQlkZXZpY2UgPSBmaW5kX2Jsb2NrX2RldmljZSgiLyIpOworCQkJCWlmICghZGV2aWNlKSB7CisJCQkJCWdvdG8gc2V0X2Vycm9yOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJeworCQkJCXVuaV9zdGF0X3QgdW5pX3N0YXQ7CisJCQkJY2hhciAqdW5pX2RldiA9IHVuaWNvZGVfY29udl90b19wcmludGFibGUoJnVuaV9zdGF0LCBkZXZpY2UpOworCQkJCWlmICh1bmlfc3RhdC51bmljb2RlX3dpZHRoID4gMjAgJiYgIShvcHQgJiBPUFRfUE9TSVgpKSB7CisJCQkJCXByaW50ZigiJXNcbiUyMHMiLCB1bmlfZGV2LCAiIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRmKCIlcyUqcyIsIHVuaV9kZXYsIDIwIC0gKGludCl1bmlfc3RhdC51bmljb2RlX3dpZHRoLCAiIik7CisJCQkJfQorCQkJCWZyZWUodW5pX2Rldik7CisJCQl9CisjZWxzZQorCQkJaWYgKHByaW50ZigiXG4lLTIwcyIgKyAxLCBkZXZpY2UpID4gMjAgJiYgIShvcHQgJiBPUFRfUE9TSVgpKQorCQkJCSAgICBwcmludGYoIlxuJS0yMHMiLCAiIik7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJCQlwcmludGYoIiAlOXMgIiwKKwkJCQkvKiBmX2Jsb2NrcyB4IGZfYnNpemUgLyBkZl9kaXNwX2hyLCBzaG93IG9uZSBmcmFjdGlvbmFsLAorCQkJCSAqIHVzZSBzdWZmaXhlcyBpZiBkZl9kaXNwX2hyID09IDAgKi8KKwkJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihzLmZfYmxvY2tzLCBzLmZfYnNpemUsIGRmX2Rpc3BfaHIpKTsKKworCQkJcHJpbnRmKCIgJTlzICIgKyAxLAorCQkJCS8qIEVYUFIgeCBmX2JzaXplIC8gZGZfZGlzcF9ociwgc2hvdyBvbmUgZnJhY3Rpb25hbCwKKwkJCQkgKiB1c2Ugc3VmZml4ZXMgaWYgZGZfZGlzcF9ociA9PSAwICovCisJCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIoKHMuZl9ibG9ja3MgLSBzLmZfYmZyZWUpLAorCQkJCQkJcy5mX2JzaXplLCBkZl9kaXNwX2hyKSk7CisKKwkJCXByaW50ZigiJTlzICUzdSUlICVzXG4iLAorCQkJCS8qIGZfYmF2YWlsIHggZl9ic2l6ZSAvIGRmX2Rpc3BfaHIsIHNob3cgb25lIGZyYWN0aW9uYWwsCisJCQkJICogdXNlIHN1ZmZpeGVzIGlmIGRmX2Rpc3BfaHIgPT0gMCAqLworCQkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKHMuZl9iYXZhaWwsIHMuZl9ic2l6ZSwgZGZfZGlzcF9ociksCisJCQkJYmxvY2tzX3BlcmNlbnRfdXNlZCwgbW91bnRfcG9pbnQpOworI2Vsc2UKKwkJCXByaW50ZigiICU5bHUgJTlsdSAlOWx1ICUzdSUlICVzXG4iLAorCQkJCWtzY2FsZShzLmZfYmxvY2tzLCBzLmZfYnNpemUpLAorCQkJCWtzY2FsZShzLmZfYmxvY2tzIC0gcy5mX2JmcmVlLCBzLmZfYnNpemUpLAorCQkJCWtzY2FsZShzLmZfYmF2YWlsLCBzLmZfYnNpemUpLAorCQkJCWJsb2Nrc19wZXJjZW50X3VzZWQsIG1vdW50X3BvaW50KTsKKyNlbmRpZgorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9kaXJuYW1lLmMgYi9jb3JldXRpbHMvZGlybmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTA2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZGlybmFtZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZGlybmFtZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9kaXJuYW1lLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGRpcm5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEVOQU1FIgorLy91c2FnZTojZGVmaW5lIGRpcm5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdHJpcCBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tIEZJTEVOQU1FIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkaXJuYW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRpcm5hbWUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIvdG1wXG4iCisvL3VzYWdlOiAgICAgICAiJCBkaXJuYW1lIC90bXAvZm9vL1xuIgorLy91c2FnZTogICAgICAgIi90bXBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBkaXJuYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkaXJuYW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwdXRzKGRpcm5hbWUoc2luZ2xlX2FyZ3YoYXJndikpKTsKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2RvczJ1bml4LmMgYi9jb3JldXRpbHMvZG9zMnVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzM5OGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2RvczJ1bml4LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRvczJ1bml4IGZvciBCdXN5Qm94CisgKgorICogZG9zMnVuaXggJ1xuJyBjb252ZXJ0b3IgMC41LjAKKyAqIGJhc2VkIG9uIFVuaXgyRG9zIDAuOS4wIGJ5IFBldGVyIEhhbmVjYWsgKG1hZGUgMTkuMi4xOTk3KQorICogQ29weXJpZ2h0IDE5OTcsLi4gYnkgUGV0ZXIgSGFuZWNhayA8aGFuZWNha0BtZWdhbG9tYW4uc2s+LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBkb3MydW5peCBmaWx0ZXJzIHJlYWRpbmcgaW5wdXQgZnJvbSBzdGRpbiBhbmQgd3JpdGluZyBvdXRwdXQgdG8gc3Rkb3V0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvL3VzYWdlOiNkZWZpbmUgZG9zMnVuaXhfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdWRdIFtGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBkb3MydW5peF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgRklMRSBpbi1wbGFjZSBmcm9tIERPUyB0byBVbml4IGZvcm1hdC5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaGVuIG5vIGZpbGUgaXMgZ2l2ZW4sIHVzZSBzdGRpbi9zdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS11CWRvczJ1bml4IgorLy91c2FnZTogICAgICJcbgktZAl1bml4MmRvcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5peDJkb3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdWRdIFtGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSB1bml4MmRvc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgRklMRSBpbi1wbGFjZSBmcm9tIFVuaXggdG8gRE9TIGZvcm1hdC5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaGVuIG5vIGZpbGUgaXMgZ2l2ZW4sIHVzZSBzdGRpbi9zdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS11CWRvczJ1bml4IgorLy91c2FnZTogICAgICJcbgktZAl1bml4MmRvcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2VudW0geworCUNUX1VOSVgyRE9TID0gMSwKKwlDVF9ET1MyVU5JWAorfTsKKworLyogaWYgZm4gaXMgTlVMTCB0aGVuIGlucHV0IGlzIHN0ZGluIGFuZCBvdXRwdXQgaXMgc3Rkb3V0ICovCitzdGF0aWMgdm9pZCBjb252ZXJ0KGNoYXIgKmZuLCBpbnQgY29udl90eXBlKQoreworCUZJTEUgKmluLCAqb3V0OworCWludCBpOworCWNoYXIgKnRlbXBfZm4gPSB0ZW1wX2ZuOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICpyZXNvbHZlZF9mbiA9IHJlc29sdmVkX2ZuOworCisJaW4gPSBzdGRpbjsKKwlvdXQgPSBzdGRvdXQ7CisJaWYgKGZuICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJcmVzb2x2ZWRfZm4gPSB4bWFsbG9jX2ZvbGxvd19zeW1saW5rcyhmbik7CisJCWlmIChyZXNvbHZlZF9mbiA9PSBOVUxMKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShmbik7CisJCWluID0geGZvcGVuX2Zvcl9yZWFkKHJlc29sdmVkX2ZuKTsKKwkJZnN0YXQoZmlsZW5vKGluKSwgJnN0KTsKKworCQl0ZW1wX2ZuID0geGFzcHJpbnRmKCIlc1hYWFhYWCIsIHJlc29sdmVkX2ZuKTsKKwkJaSA9IHhta3N0ZW1wKHRlbXBfZm4pOworCQlpZiAoZmNobW9kKGksIHN0LnN0X21vZGUpID09IC0xKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZSh0ZW1wX2ZuKTsKKworCQlvdXQgPSB4ZmRvcGVuX2Zvcl93cml0ZShpKTsKKwl9CisKKwl3aGlsZSAoKGkgPSBmZ2V0YyhpbikpICE9IEVPRikgeworCQlpZiAoaSA9PSAnXHInKQorCQkJY29udGludWU7CisJCWlmIChpID09ICdcbicpCisJCQlpZiAoY29udl90eXBlID09IENUX1VOSVgyRE9TKQorCQkJCWZwdXRjKCdccicsIG91dCk7CisJCWZwdXRjKGksIG91dCk7CisJfQorCisJaWYgKGZuICE9IE5VTEwpIHsKKwkJaWYgKGZjbG9zZShpbikgPCAwIHx8IGZjbG9zZShvdXQpIDwgMCkgeworCQkJdW5saW5rKHRlbXBfZm4pOworCQkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwkJfQorCQl4cmVuYW1lKHRlbXBfZm4sIHJlc29sdmVkX2ZuKTsKKwkJZnJlZSh0ZW1wX2ZuKTsKKwkJZnJlZShyZXNvbHZlZF9mbik7CisJfQorfQorCitpbnQgZG9zMnVuaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRvczJ1bml4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbywgY29udl90eXBlOworCisJLyogU2VlIGlmIHdlIGFyZSBzdXBwb3NlZCB0byBiZSBkb2luZyBkb3MydW5peCBvciB1bml4MmRvcyAqLworCWNvbnZfdHlwZSA9IENUX1VOSVgyRE9TOworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAnZCcpIHsKKwkJY29udl90eXBlID0gQ1RfRE9TMlVOSVg7CisJfQorCisJLyogLXUgY29udmVydCB0byB1bml4LCAtZCBjb252ZXJ0IHRvIGRvcyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gInUtLWQ6ZC0tdSI7IC8qIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCW8gPSBnZXRvcHQzMihhcmd2LCAiZHUiKTsKKworCS8qIERvIHRoZSBjb252ZXJzaW9uIHJlcXVlc3RlZCBieSBhbiBhcmd1bWVudCBlbHNlIGRvIHRoZSBkZWZhdWx0CisJICogY29udmVyc2lvbiBkZXBlbmRpbmcgb24gb3VyIG5hbWUuICAqLworCWlmIChvKQorCQljb252X3R5cGUgPSBvOworCisJYXJndiArPSBvcHRpbmQ7CisJZG8geworCQkvKiBtaWdodCBiZSBjb252ZXJ0KE5VTEwpIGlmIHRoZXJlIGlzIG5vIGZpbGVuYW1lIGdpdmVuICovCisJCWNvbnZlcnQoKmFyZ3YsIGNvbnZfdHlwZSk7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9kdS5jIGIvY29yZXV0aWxzL2R1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiYmUzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9kdS5jCkBAIC0wLDAgKzEsMjY3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGR1IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKHVubGVzcyBkZWZhdWx0IGJsb2Nrc2l6ZSBzZXQgdG8gMWspICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2R1Lmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBNb3N0bHkgcmV3cml0dGVuIGZvciBTVVN2MyBjb21wbGlhbmNlIGFuZCB0byBmaXggYnVncy9kZWZlY3RzLgorICogMSkgQWRkZWQgc3VwcG9ydCBmb3IgU1VTdjMgLWEsIC1ILCAtTCwgZ251IC1jLCBhbmQgKGJ1c3lib3gpIC1kIG9wdGlvbnMuCisgKiAgICBUaGUgLWQgb3B0aW9uIGFsbG93cyBzZXR0aW5nIG9mIG1heCBkZXB0aCAoc2ltaWxhciB0byBnbnUgLS1tYXgtZGVwdGgpLgorICogMikgRml4ZWQgaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb25zIGZvciBsaW5rcyBhbmQgZGlyZWN0b3JpZXMsIGVzcGVjaWFsbHkKKyAqICAgIHdoZW4gZXJyb3JzIG9jY3VycmVkLiAgQ2FsY3VsYXRlcyBzaXplcyBzaG91bGQgbm93IG1hdGNoIGdudSBkdSBvdXRwdXQuCisgKiAzKSBBZGRlZCBlcnJvciBjaGVja2luZyBvZiBvdXRwdXQuCisgKiA0KSBGaXhlZCBidXN5Ym94IGJ1ZyAjMTI4NCBpbnZvbHZpbmcgbG9uZyBvdmVyZmxvdyB3aXRoIGh1bWFuX3JlYWRhYmxlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkdV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hSExkY2xzeCIgSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgiaG0iKSAia10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGR1X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3VtbWFyaXplIGRpc2sgc3BhY2UgdXNlZCBmb3IgZWFjaCBGSUxFIGFuZC9vciBkaXJlY3RvcnkuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzayBzcGFjZSBpcyBwcmludGVkIGluIHVuaXRzIG9mICIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsoIjEwMjQiKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsoIjUxMiIpCisvL3VzYWdlOiAgICAgICAiIGJ5dGVzLlxuIgorLy91c2FnZTogICAgICJcbgktYQlTaG93IGZpbGUgc2l6ZXMgdG9vIgorLy91c2FnZTogICAgICJcbgktTAlGb2xsb3cgYWxsIHN5bWxpbmtzIgorLy91c2FnZTogICAgICJcbgktSAlGb2xsb3cgc3ltbGlua3Mgb24gY29tbWFuZCBsaW5lIgorLy91c2FnZTogICAgICJcbgktZCBOCUxpbWl0IG91dHB1dCB0byBkaXJlY3RvcmllcyAoYW5kIGZpbGVzIHdpdGggLWEpIG9mIGRlcHRoIDwgTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJU2hvdyBncmFuZCB0b3RhbCIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJQ291bnQgc2l6ZXMgbWFueSB0aW1lcyBpZiBoYXJkIGxpbmtlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRGlzcGxheSBvbmx5IGEgdG90YWwgZm9yIGVhY2ggYXJndW1lbnQiCisvL3VzYWdlOiAgICAgIlxuCS14CVNraXAgZGlyZWN0b3JpZXMgb24gZGlmZmVyZW50IGZpbGVzeXN0ZW1zIgorLy91c2FnZToJSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgKKy8vdXNhZ2U6ICAgICAiXG4JLWgJU2l6ZXMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0IChlLmcuLCAxSyAyNDNNIDJHICkiCisvL3VzYWdlOiAgICAgIlxuCS1tCVNpemVzIGluIG1lZ2FieXRlcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWsJU2l6ZXMgaW4ga2lsb2J5dGVzIgorLy91c2FnZToJCQlJRl9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKCIgKGRlZmF1bHQpIikKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZHVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZHVcbiIKKy8vdXNhZ2U6ICAgICAgICIxNiAgICAgIC4vQ1ZTXG4iCisvL3VzYWdlOiAgICAgICAiMTIgICAgICAuL2tlcm5lbC1wYXRjaGVzL0NWU1xuIgorLy91c2FnZTogICAgICAgIjgwICAgICAgLi9rZXJuZWwtcGF0Y2hlc1xuIgorLy91c2FnZTogICAgICAgIjEyICAgICAgLi90ZXN0cy9DVlNcbiIKKy8vdXNhZ2U6ICAgICAgICIzNiAgICAgIC4vdGVzdHNcbiIKKy8vdXNhZ2U6ICAgICAgICIxMiAgICAgIC4vc2NyaXB0cy9DVlNcbiIKKy8vdXNhZ2U6ICAgICAgICIxNiAgICAgIC4vc2NyaXB0c1xuIgorLy91c2FnZTogICAgICAgIjEyICAgICAgLi9kb2NzL0NWU1xuIgorLy91c2FnZTogICAgICAgIjEwNCAgICAgLi9kb2NzXG4iCisvL3VzYWdlOiAgICAgICAiMjQxNyAgICAuXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitlbnVtIHsKKwlPUFRfYV9maWxlc190b28gICAgPSAoMSA8PCAwKSwKKwlPUFRfSF9mb2xsb3dfbGlua3MgPSAoMSA8PCAxKSwKKwlPUFRfa19rYnl0ZXMgICAgICAgPSAoMSA8PCAyKSwKKwlPUFRfTF9mb2xsb3dfbGlua3MgPSAoMSA8PCAzKSwKKwlPUFRfc190b3RhbF9ub3JlY3Vyc2UgPSAoMSA8PCA0KSwKKwlPUFRfeF9vbmVfRlMgICAgICAgPSAoMSA8PCA1KSwKKwlPUFRfZF9tYXhkZXB0aCAgICAgPSAoMSA8PCA2KSwKKwlPUFRfbF9oYXJkbGlua3MgICAgPSAoMSA8PCA3KSwKKwlPUFRfY190b3RhbCAgICAgICAgPSAoMSA8PCA4KSwKKwlPUFRfaF9mb3JfaHVtYW5zICAgPSAoMSA8PCA5KSwKKwlPUFRfbV9tYnl0ZXMgICAgICAgPSAoMSA8PCAxMCksCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwl1bnNpZ25lZCBsb25nIGRpc3BfaHI7CisjZWxzZQorCXVuc2lnbmVkIGRpc3BfazsKKyNlbmRpZgorCWludCBtYXhfcHJpbnRfZGVwdGg7CisJYm9vbCBzdGF0dXM7CisJaW50IHNsaW5rX2RlcHRoOworCWludCBkdV9kZXB0aDsKKwlkZXZfdCBkaXJfZGV2OworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKworCitzdGF0aWMgdm9pZCBwcmludCh1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCS8qIFRPRE8gLSBNYXkgbm90IHdhbnQgdG8gZGVmZXIgZXJyb3IgY2hlY2tpbmcgaGVyZS4gKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCXByaW50ZigiJXNcdCVzXG4iLAorCQkJLyogc2l6ZSB4IDUxMiAvIEcuZGlzcF9ociwgc2hvdyBvbmUgZnJhY3Rpb25hbCwKKwkJCSAqIHVzZSBzdWZmaXhlcyBpZiBHLmRpc3BfaHIgPT0gMCAqLworCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIoc2l6ZSwgNTEyLCBHLmRpc3BfaHIpLAorCQkJZmlsZW5hbWUpOworI2Vsc2UKKwlpZiAoRy5kaXNwX2spIHsKKwkJc2l6ZSsrOworCQlzaXplID4+PSAxOworCX0KKwlwcmludGYoIiVsdVx0JXNcbiIsIHNpemUsIGZpbGVuYW1lKTsKKyNlbmRpZgorfQorCisvKiB0aW55IHJlY3Vyc2l2ZSBkdSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwl1bnNpZ25lZCBsb25nIHN1bTsKKworCWlmIChsc3RhdChmaWxlbmFtZSwgJnN0YXRidWYpICE9IDApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZW5hbWUpOworCQlHLnN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeF9vbmVfRlMpIHsKKwkJaWYgKEcuZHVfZGVwdGggPT0gMCkgeworCQkJRy5kaXJfZGV2ID0gc3RhdGJ1Zi5zdF9kZXY7CisJCX0gZWxzZSBpZiAoRy5kaXJfZGV2ICE9IHN0YXRidWYuc3RfZGV2KSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXN1bSA9IHN0YXRidWYuc3RfYmxvY2tzOworCisJaWYgKFNfSVNMTksoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQlpZiAoRy5zbGlua19kZXB0aCA+IEcuZHVfZGVwdGgpIHsgLyogLUggb3IgLUwgKi8KKwkJCWlmIChzdGF0KGZpbGVuYW1lLCAmc3RhdGJ1ZikgIT0gMCkgeworCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJCQlHLnN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXN1bSA9IHN0YXRidWYuc3RfYmxvY2tzOworCQkJaWYgKEcuc2xpbmtfZGVwdGggPT0gMSkgeworCQkJCS8qIENvbnZlcnQgLUggdG8gLUwgKi8KKwkJCQlHLnNsaW5rX2RlcHRoID0gSU5UX01BWDsKKwkJCX0KKwkJfQorCX0KKworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfbF9oYXJkbGlua3MpCisJICYmIHN0YXRidWYuc3RfbmxpbmsgPiAxCisJKSB7CisJCS8qIEFkZCBmaWxlcy9kaXJlY3RvcmllcyB3aXRoIGxpbmtzIG9ubHkgb25jZSAqLworCQlpZiAoaXNfaW5faW5vX2Rldl9oYXNodGFibGUoJnN0YXRidWYpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhZGRfdG9faW5vX2Rldl9oYXNodGFibGUoJnN0YXRidWYsIE5VTEwpOworCX0KKworCWlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJRElSICpkaXI7CisJCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCQljaGFyICpuZXdmaWxlOworCisJCWRpciA9IHdhcm5fb3BlbmRpcihmaWxlbmFtZSk7CisJCWlmICghZGlyKSB7CisJCQlHLnN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCXJldHVybiBzdW07CisJCX0KKworCQl3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworCQkJbmV3ZmlsZSA9IGNvbmNhdF9zdWJwYXRoX2ZpbGUoZmlsZW5hbWUsIGVudHJ5LT5kX25hbWUpOworCQkJaWYgKG5ld2ZpbGUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCSsrRy5kdV9kZXB0aDsKKwkJCXN1bSArPSBkdShuZXdmaWxlKTsKKwkJCS0tRy5kdV9kZXB0aDsKKwkJCWZyZWUobmV3ZmlsZSk7CisJCX0KKwkJY2xvc2VkaXIoZGlyKTsKKwl9IGVsc2UgeworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2FfZmlsZXNfdG9vKSAmJiBHLmR1X2RlcHRoICE9IDApCisJCQlyZXR1cm4gc3VtOworCX0KKwlpZiAoRy5kdV9kZXB0aCA8PSBHLm1heF9wcmludF9kZXB0aCkgeworCQlwcmludChzdW0sIGZpbGVuYW1lKTsKKwl9CisJcmV0dXJuIHN1bTsKK30KKworaW50IGR1X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkdV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbG9uZyB0b3RhbDsKKwlpbnQgc2xpbmtfZGVwdGhfc2F2ZTsKKwl1bnNpZ25lZCBvcHQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCUlGX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsoRy5kaXNwX2hyID0gMTAyNDspCisJSUZfTk9UX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsoRy5kaXNwX2hyID0gNTEyOykKKwlpZiAoZ2V0ZW52KCJQT1NJWExZX0NPUlJFQ1QiKSkgIC8qIFRPRE8gLSBhIG5ldyBsaWJiYiBmdW5jdGlvbj8gKi8KKwkJRy5kaXNwX2hyID0gNTEyOworI2Vsc2UKKwlJRl9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKEcuZGlzcF9rID0gMTspCisJLyogSUZfTk9UX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsoRy5kaXNwX2sgPSAwOykgLSBHIGlzIHByZS16ZXJvZWQgKi8KKyNlbmRpZgorCUcubWF4X3ByaW50X2RlcHRoID0gSU5UX01BWDsKKworCS8qIE5vdGU6IFNVU3YzIHNwZWNpZmllcyB0aGF0IC1hIGFuZCAtcyBvcHRpb25zIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyCisJICogaW4gc3RyaWN0bHkgY29uZm9ybWluZyBhcHBsaWNhdGlvbnMuICBIb3dldmVyLCBpdCBhbHNvIHNheXMgdGhhdCBzb21lCisJICogZHUgaW1wbGVtZW50YXRpb25zIG1heSBwcm9kdWNlIG91dHB1dCB3aGVuIC1hIGFuZCAtcyBhcmUgdXNlZCB0b2dldGhlci4KKwkgKiBnbnUgZHUgZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlIGluIHRoaXMgY2FzZS4gIFdlIGNob29zZSB0byBzaW1wbHkKKwkgKiBpZ25vcmUgLWEuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCAtcyBiZWluZyBlcXVpdmFsZW50IHRvIC1kIDAuCisJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJoLWttOmstaG06bS1oazpILUw6TC1IOnMtZDpkLXM6ZCsiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJhSGtMc3giICJkOiIgImxjIiAiaG0iLCAmRy5tYXhfcHJpbnRfZGVwdGgpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiBPUFRfaF9mb3JfaHVtYW5zKSB7CisJCUcuZGlzcF9ociA9IDA7CisJfQorCWlmIChvcHQgJiBPUFRfbV9tYnl0ZXMpIHsKKwkJRy5kaXNwX2hyID0gMTAyNCoxMDI0OworCX0KKwlpZiAob3B0ICYgT1BUX2tfa2J5dGVzKSB7CisJCUcuZGlzcF9ociA9IDEwMjQ7CisJfQorI2Vsc2UKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJILUw6TC1IOnMtZDpkLXM6ZCsiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJhSGtMc3giICJkOiIgImxjIiwgJkcubWF4X3ByaW50X2RlcHRoKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsKKwlpZiAob3B0ICYgT1BUX2tfa2J5dGVzKSB7CisJCUcuZGlzcF9rID0gMTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCWlmIChvcHQgJiBPUFRfSF9mb2xsb3dfbGlua3MpIHsKKwkJRy5zbGlua19kZXB0aCA9IDE7CisJfQorCWlmIChvcHQgJiBPUFRfTF9mb2xsb3dfbGlua3MpIHsKKwkJRy5zbGlua19kZXB0aCA9IElOVF9NQVg7CisJfQorCWlmIChvcHQgJiBPUFRfc190b3RhbF9ub3JlY3Vyc2UpIHsKKwkJRy5tYXhfcHJpbnRfZGVwdGggPSAwOworCX0KKworCS8qIGdvIHRocm91Z2ggcmVtYWluaW5nIGFyZ3MgKGlmIGFueSkgKi8KKwlpZiAoISphcmd2KSB7CisJCSotLWFyZ3YgPSAoY2hhciopIi4iOworCQlpZiAoRy5zbGlua19kZXB0aCA9PSAxKSB7CisJCQlHLnNsaW5rX2RlcHRoID0gMDsKKwkJfQorCX0KKworCXNsaW5rX2RlcHRoX3NhdmUgPSBHLnNsaW5rX2RlcHRoOworCXRvdGFsID0gMDsKKwlkbyB7CisJCXRvdGFsICs9IGR1KCphcmd2KTsKKwkJLyogb3RoZXJ3aXNlIGR1IC9kaXIgL2RpciB3b24ndCBzaG93IC9kaXIgdHdpY2U6ICovCisJCXJlc2V0X2lub19kZXZfaGFzaHRhYmxlKCk7CisJCUcuc2xpbmtfZGVwdGggPSBzbGlua19kZXB0aF9zYXZlOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJaWYgKG9wdCAmIE9QVF9jX3RvdGFsKQorCQlwcmludCh0b3RhbCwgInRvdGFsIik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEcuc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9lY2hvLmMgYi9jb3JldXRpbHMvZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjM4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZWNoby5jCkBAIC0wLDAgKzEsMzMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBlY2hvIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50IC0tIHVubGVzcyBjb25maWd1cmVkIGFzIGZhbmN5IGVjaG8uICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2VjaG8uaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIEJlY2F1c2Ugb2YgYmVoYXZpb3JhbCBkaWZmZXJlbmNlcywgaW1wbGVtZW50ZWQgY29uZmlndXJhYmxlIFNVU3YzCisgKiBvciAnZmFuY3knIGdudS1pc2ggYmVoYXZpb3JzLiAgQWxzbywgcmVkdWNlZCBzaXplIGFuZCBmaXhlZCBidWdzLgorICogMSkgSW4gaGFuZGxpbmcgJ1xjJyBlc2NhcGUsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9ubHkgc3VwcHJlc3NlZCB0aGUKKyAqICAgICB0cmFpbGluZyBuZXdsaW5lLiAgU1VTdjMgc3BlY2lmaWVzIF9ub18gb3V0cHV0IGFmdGVyICdcYycuCisgKiAyKSBTVVN2MyBzcGVjaWZpZXMgdGhhdCBvY3RhbCBlc2NhcGVzIGFyZSBvZiB0aGUgZm9ybSBcMHsjeyN7I319fS4KKyAqICAgIFRoZSBwcmV2aW91cyB2ZXJzaW9uIGRpZCBub3QgYWxsb3cgNC1kaWdpdCBvY3RhbHMuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGVjaG9fdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9FQ0hPKCJbLW5lRV0gIikgIltBUkddLi4uIgorLy91c2FnZTojZGVmaW5lIGVjaG9fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgc3BlY2lmaWVkIEFSR3MgdG8gc3Rkb3V0IgorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9FQ0hPKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCVN1cHByZXNzIHRyYWlsaW5nIG5ld2xpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1lCUludGVycHJldCBiYWNrc2xhc2ggZXNjYXBlcyAoaS5lLiwgXFx0PXRhYikiCisvL3VzYWdlOiAgICAgIlxuCS1FCURvbid0IGludGVycHJldCBiYWNrc2xhc2ggZXNjYXBlcyAoZGVmYXVsdCkiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGVjaG9fZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZWNobyBcIkVyaWsgaXMgY29vbFwiXG4iCisvL3VzYWdlOiAgICAgICAiRXJpayBpcyBjb29sXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX0VDSE8oIiQgZWNobyAtZSBcIkVyaWtcXG5pc1xcbmNvb2xcIlxuIgorLy91c2FnZTogICAgICAgIkVyaWtcbiIKKy8vdXNhZ2U6ICAgICAgICJpc1xuIgorLy91c2FnZTogICAgICAgImNvb2xcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gXCJFcmlrXFxuaXNcXG5jb29sXCJcbiIKKy8vdXNhZ2U6ICAgICAgICJFcmlrXFxuaXNcXG5jb29sXG4iKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLyogTkI6IGNhbiBiZSB1c2VkIGJ5IHNoZWxsIGV2ZW4gaWYgbm90IGVuYWJsZWQgYXMgYXBwbGV0ICovCisKKy8qCisgKiBOQjI6IHdlIGRvbid0IHVzZSBzdGRpbywgd2UgbmVlZCBiZXR0ZXIgZXJyb3IgaGFuZGluZy4KKyAqIEV4YW1wbGVzIGluY2x1ZGUgd3JpdGluZyBpbnRvIG5vbi1vcGVuZWQgc3Rkb3V0IGFuZCBlcnJvciBvbiB3cml0ZS4KKyAqCisgKiBXaXRoIHN0ZGlvLCBvdXRwdXQgZ2V0cyBzaG92ZWxlZCBpbnRvIHN0ZG91dCBidWZmZXIsIGFuZCBldmVuCisgKiBmZmx1c2ggY2Fubm90IGNsZWFyIGl0IG91dC4gSXQgc2VlbXMgdGhhdCBldmVuIGlmIGxpYmMgcmVjZWl2ZXMKKyAqIEVCQURGIG9uIHdyaXRlIGF0dGVtcHRzLCBpdCBmZWVscyBkZXRlcm1pbmVkIHRvIG91dHB1dCBkYXRhIG5vIG1hdHRlciB3aGF0LgorICogSWYgZWNobyBpcyBjYWxsZWQgYnkgc2hlbGwsIGl0IHdpbGwgdHJ5IHdyaXRpbmcgYWdhaW4gbGF0ZXIsIGFuZCBwb3NzaWJseQorICogd2lsbCBjbG9iYmVyIGZ1dHVyZSBvdXRwdXQuIE5vdCBnb29kLgorICoKKyAqIFNvbGFyaXMgaGFzIGZwdXJnZSB3aGljaCBkaXNjYXJkcyBidWZmZXJlZCBpbnB1dC4gZ2xpYmMgaGFzIF9fZnB1cmdlLgorICogQnV0IHRoaXMgZnVuY3Rpb24gaXMgbm90IHN0YW5kYXJkLgorICovCisKK2ludCBlY2hvX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqcHA7CisJY29uc3QgY2hhciAqYXJnOworCWNoYXIgKm91dDsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgYnVmbGVuOworI2lmICFFTkFCTEVfRkVBVFVSRV9GQU5DWV9FQ0hPCisJZW51bSB7CisJCWVmbGFnID0gJ1xcJywKKwkJbmZsYWcgPSAxLCAgLyogMSAtLSBwcmludCAnXG4nICovCisJfTsKKworCWFyZ3YrKzsKKyNlbHNlCisJY2hhciBuZmxhZyA9IDE7CisJY2hhciBlZmxhZyA9IDA7CisKKwl3aGlsZSAoKGFyZyA9ICorK2FyZ3YpICE9IE5VTEwpIHsKKwkJY2hhciBuLCBlOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7IC8qIG5vdCBhbiBvcHRpb24gYXJnLCBlY2hvIGl0ICovCisKKwkJLyogSWYgaXQgYXBwZWFycyB0aGF0IHdlIGFyZSBoYW5kbGluZyBvcHRpb25zLCB0aGVuIG1ha2Ugc3VyZQorCQkgKiB0aGF0IGFsbCBvZiB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYXJlIGFjdHVhbGx5IHZhbGlkLgorCQkgKiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgc2hvdWxkIGp1c3QgYmUgZWNob2VkLgorCQkgKi8KKwkJYXJnKys7CisJCW4gPSBuZmxhZzsKKwkJZSA9IGVmbGFnOworCQlkbyB7CisJCQlpZiAoKmFyZyA9PSAnbicpCisJCQkJbiA9IDA7CisJCQllbHNlIGlmICgqYXJnID09ICdlJykKKwkJCQllID0gJ1xcJzsKKwkJCWVsc2UgaWYgKCphcmcgIT0gJ0UnKSB7CisJCQkJLyogIi1jY2MiIGFyZyB3aXRoIG9uZSBvZiBjJ3MgaW52YWxpZCwgZWNobyBpdCAqLworCQkJCS8qIGFyZyBjb25zaXN0aW5nIGZyb20ganVzdCAiLSIgYWxzbyBoYW5kbGVkIGhlcmUgKi8KKwkJCQlnb3RvIGp1c3RfZWNobzsKKwkJCX0KKwkJfSB3aGlsZSAoKisrYXJnKTsKKwkJbmZsYWcgPSBuOworCQllZmxhZyA9IGU7CisJfQorIGp1c3RfZWNobzoKKyNlbmRpZgorCisJYnVmbGVuID0gMDsKKwlwcCA9IGFyZ3Y7CisJd2hpbGUgKChhcmcgPSAqcHApICE9IE5VTEwpIHsKKwkJYnVmbGVuICs9IHN0cmxlbihhcmcpICsgMTsKKwkJcHArKzsKKwl9CisJb3V0ID0gYnVmZmVyID0geG1hbGxvYyhidWZsZW4gKyAxKTsgLyogKzEgaXMgbmVlZGVkIGZvciAibm8gYXJncyIgY2FzZSAqLworCisJd2hpbGUgKChhcmcgPSAqYXJndikgIT0gTlVMTCkgeworCQlpbnQgYzsKKworCQlpZiAoIWVmbGFnKSB7CisJCQkvKiBvcHRpbWl6YXRpb24gZm9yIHZlcnkgY29tbW9uIGNhc2UgKi8KKwkJCW91dCA9IHN0cGNweShvdXQsIGFyZyk7CisJCX0gZWxzZQorCQl3aGlsZSAoKGMgPSAqYXJnKyspICE9ICdcMCcpIHsKKwkJCWlmIChjID09IGVmbGFnKSB7CisJCQkJLyogVGhpcyBpcyBhbiAiXHgiIHNlcXVlbmNlICovCisKKwkJCQlpZiAoKmFyZyA9PSAnYycpIHsKKwkJCQkJLyogIlxjIiBtZWFucyBjYW5jZWwgbmV3bGluZSBhbmQKKwkJCQkJICogaWdub3JlIGFsbCBzdWJzZXF1ZW50IGNoYXJzLiAqLworCQkJCQlnb3RvIGRvX3dyaXRlOworCQkJCX0KKwkJCQkvKiBTaW5jZSBTVVN2MyBtYW5kYXRlcyBhIGZpcnN0IGRpZ2l0IG9mIDAsIDQtZGlnaXQgb2N0YWxzCisJCQkJKiBvZiB0aGUgZm9ybSBcMCMjIyBhcmUgYWNjZXB0ZWQuICovCisJCQkJaWYgKCphcmcgPT0gJzAnKSB7CisJCQkJCWlmICgodW5zaWduZWQgY2hhcikoYXJnWzFdIC0gJzAnKSA8IDgpIHsKKwkJCQkJCS8qIDJuZCBjaGFyIGlzIDAuLjc6IHNraXAgbGVhZGluZyAnMCcgKi8KKwkJCQkJCWFyZysrOworCQkJCQl9CisJCQkJfQorCQkJCS8qIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlIGhhbmRsZXMgTlVMIGNvcnJlY3RseQorCQkJCSAqICgiLi4uXCIgY2FzZSkuICovCisJCQkJeworCQkJCQkvKiBvcHRpbWl6YXRpb246IGRvbid0IGZvcmNlIGFyZyB0byBiZSBvbi1zdGFjaywKKwkJCQkJICogdXNlIGFub3RoZXIgdmFyaWFibGUgZm9yIHRoYXQuIH4zMCBieXRlcyB3aW4gKi8KKwkJCQkJY29uc3QgY2hhciAqeiA9IGFyZzsKKwkJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZ6KTsKKwkJCQkJYXJnID0gejsKKwkJCQl9CisJCQl9CisJCQkqb3V0KysgPSBjOworCQl9CisKKwkJaWYgKCEqKythcmd2KQorCQkJYnJlYWs7CisJCSpvdXQrKyA9ICcgJzsKKwl9CisKKwlpZiAobmZsYWcpIHsKKwkJKm91dCsrID0gJ1xuJzsKKwl9CisKKyBkb193cml0ZToKKwkvKiBDYXJlZnVsIHRvIGVycm9yIG91dCBvbiBwYXJ0aWFsIHdyaXRlcyB0b28gKHRoaW5rIEVOT1NQQyEpICovCisJZXJybm8gPSAwOworCS8qciA9Ki8gZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWZmZXIsIG91dCAtIGJ1ZmZlcik7CisJZnJlZShidWZmZXIpOworCWlmICgvKldST05HOnIgPCAwKi8gZXJybm8pIHsKKwkJYmJfcGVycm9yX21zZyhiYl9tc2dfd3JpdGVfZXJyb3IpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gPEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICoJCWZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2U+CisgKgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyllY2hvLmMJOC4xIChCZXJrZWxleSkgNS8zMS85MworICovCisKKyNpZmRlZiBWRVJTSU9OX1dJVEhfV1JJVEVWCisvKiBXZSBjYW4ndCB1c2Ugc3RkaW8uCisgKiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGhpZ2hseSBub24tb2J2aW91cy4KKyAqIGVjaG9fbWFpbiBpcyB1c2VkIGZyb20gc2hlbGwuIFNoZWxsIG11c3QgY29ycmVjdGx5IGhhbmRsZSAiZWNobyBmb28iCisgKiBpZiBzdGRvdXQgaXMgY2xvc2VkLiBXaXRoIHN0ZGlvLCBvdXRwdXQgZ2V0cyBzaG92ZWxlZCBpbnRvCisgKiBzdGRvdXQgYnVmZmVyLCBhbmQgZXZlbiBmZmx1c2ggY2Fubm90IGNsZWFyIGl0IG91dC4gSXQgc2VlbXMgdGhhdAorICogZXZlbiBpZiBsaWJjIHJlY2VpdmVzIEVCQURGIG9uIHdyaXRlIGF0dGVtcHRzLCBpdCBmZWVscyBkZXRlcm1pbmVkCisgKiB0byBvdXRwdXQgZGF0YSBubyBtYXR0ZXIgd2hhdC4gU28gaXQgd2lsbCB0cnkgbGF0ZXIsCisgKiBhbmQgcG9zc2libHkgd2lsbCBjbG9iYmVyIGZ1dHVyZSBvdXRwdXQuIE5vdCBnb29kLgorICoKKyAqIFVzaW5nIHdyaXRldiBpbnN0ZWFkLCB3aXRoICdkaXJlY3QnIGNvbnZlcnNpb24gb2YgYXJndiB2ZWN0b3IuCisgKi8KKworaW50IGVjaG9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlvdmVjIGlvW2FyZ2NdOworCXN0cnVjdCBpb3ZlYyAqY3VyX2lvID0gaW87CisJY2hhciAqYXJnOworCWNoYXIgKnA7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX0VDSE8KKwllbnVtIHsKKwkJZWZsYWcgPSAnXFwnLAorCQluZmxhZyA9IDEsICAvKiAxIC0tIHByaW50ICdcbicgKi8KKwl9OworCWFyZyA9ICorK2FyZ3Y7CisJaWYgKCFhcmcpCisJCWdvdG8gbmV3bGluZV9yZXQ7CisjZWxzZQorCWNoYXIgbmZsYWcgPSAxOworCWNoYXIgZWZsYWcgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJYXJnID0gKisrYXJndjsKKwkJaWYgKCFhcmcpCisJCQlnb3RvIG5ld2xpbmVfcmV0OworCQlpZiAoKmFyZyAhPSAnLScpCisJCQlicmVhazsKKworCQkvKiBJZiBpdCBhcHBlYXJzIHRoYXQgd2UgYXJlIGhhbmRsaW5nIG9wdGlvbnMsIHRoZW4gbWFrZSBzdXJlCisJCSAqIHRoYXQgYWxsIG9mIHRoZSBvcHRpb25zIHNwZWNpZmllZCBhcmUgYWN0dWFsbHkgdmFsaWQuCisJCSAqIE90aGVyd2lzZSwgdGhlIHN0cmluZyBzaG91bGQganVzdCBiZSBlY2hvZWQuCisJCSAqLworCQlwID0gYXJnICsgMTsKKwkJaWYgKCEqcCkJLyogQSBzaW5nbGUgJy0nLCBzbyBlY2hvIGl0LiAqLworCQkJZ290byBqdXN0X2VjaG87CisKKwkJZG8geworCQkJaWYgKCFzdHJjaHIoIm5lRSIsICpwKSkKKwkJCQlnb3RvIGp1c3RfZWNobzsKKwkJfSB3aGlsZSAoKisrcCk7CisKKwkJLyogQWxsIG9mIHRoZSBvcHRpb25zIGluIHRoaXMgYXJnIGFyZSB2YWxpZCwgc28gaGFuZGxlIHRoZW0uICovCisJCXAgPSBhcmcgKyAxOworCQlkbyB7CisJCQlpZiAoKnAgPT0gJ24nKQorCQkJCW5mbGFnID0gMDsKKwkJCWlmICgqcCA9PSAnZScpCisJCQkJZWZsYWcgPSAnXFwnOworCQl9IHdoaWxlICgqKytwKTsKKwl9CisganVzdF9lY2hvOgorI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQkvKiBhcmcgaXMgYWxyZWFkeSA9PSAqYXJndiBhbmQgaXNuJ3QgTlVMTCAqLworCQlpbnQgYzsKKworCQljdXJfaW8tPmlvdl9iYXNlID0gcCA9IGFyZzsKKworCQlpZiAoIWVmbGFnKSB7CisJCQkvKiBvcHRpbWl6YXRpb24gZm9yIHZlcnkgY29tbW9uIGNhc2UgKi8KKwkJCXAgKz0gc3RybGVuKGFyZyk7CisJCX0gZWxzZSB3aGlsZSAoKGMgPSAqYXJnKyspKSB7CisJCQlpZiAoYyA9PSBlZmxhZykgeworCQkJCS8qIFRoaXMgaXMgYW4gIlx4IiBzZXF1ZW5jZSAqLworCisJCQkJaWYgKCphcmcgPT0gJ2MnKSB7CisJCQkJCS8qICJcYyIgbWVhbnMgY2FuY2VsIG5ld2xpbmUgYW5kCisJCQkJCSAqIGlnbm9yZSBhbGwgc3Vic2VxdWVudCBjaGFycy4gKi8KKwkJCQkJY3VyX2lvLT5pb3ZfbGVuID0gcCAtIChjaGFyKiljdXJfaW8tPmlvdl9iYXNlOworCQkJCQljdXJfaW8rKzsKKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJCS8qIFNpbmNlIFNVU3YzIG1hbmRhdGVzIGEgZmlyc3QgZGlnaXQgb2YgMCwgNC1kaWdpdCBvY3RhbHMKKwkJCQkqIG9mIHRoZSBmb3JtIFwwIyMjIGFyZSBhY2NlcHRlZC4gKi8KKwkJCQlpZiAoKmFyZyA9PSAnMCcgJiYgKHVuc2lnbmVkIGNoYXIpKGFyZ1sxXSAtICcwJykgPCA4KSB7CisJCQkJCWFyZysrOworCQkJCX0KKwkJCQkvKiBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSBjYW4gaGFuZGxlIG51bCBjb3JyZWN0bHkgKi8KKwkJCQljID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoICh2b2lkKikgJmFyZyk7CisJCQl9CisJCQkqcCsrID0gYzsKKwkJfQorCisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmIChhcmcpCisJCQkqcCsrID0gJyAnOworCQljdXJfaW8tPmlvdl9sZW4gPSBwIC0gKGNoYXIqKWN1cl9pby0+aW92X2Jhc2U7CisJCWN1cl9pbysrOworCQlpZiAoIWFyZykKKwkJCWJyZWFrOworCX0KKworIG5ld2xpbmVfcmV0OgorCWlmIChuZmxhZykgeworCQljdXJfaW8tPmlvdl9iYXNlID0gKGNoYXIqKSJcbiI7CisJCWN1cl9pby0+aW92X2xlbiA9IDE7CisJCWN1cl9pbysrOworCX0KKyByZXQ6CisJLyogVE9ETzogaW1wbGVtZW50IGFuZCB1c2UgZnVsbF93cml0ZXY/ICovCisJcmV0dXJuIHdyaXRldigxLCBpbywgKGN1cl9pbyAtIGlvKSkgPj0gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2Vudi5jIGIvY29yZXV0aWxzL2Vudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2VmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZW52LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGVudiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk5MywgMTk5NAorICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIE1vZGlmaWVkIGZvciBCdXN5Qm94IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvZW52Lmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBGaXhlZCBidWcgaW52b2x2aW5nIGV4aXQgcmV0dXJuIGNvZGVzIGlmIGV4ZWN2cCBmYWlscy4gIEFsc28gYWRkZWQKKyAqIG91dHB1dCBlcnJvciBjaGVja2luZy4KKyAqLworCisvKgorICogTW9kaWZpZWQgYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAoQykgMjAwMworICogLSBjb3JyZWN0ICItIiBvcHRpb24gdXNhZ2UKKyAqIC0gbXVsdGlwbGUgIi11IHVuc2V0ZW52IiBzdXBwb3J0CisgKiAtIEdOVSBsb25nIG9wdGlvbiBzdXBwb3J0CisgKiAtIHVzZSB4ZnVuY19lcnJvcl9yZXR2YWwKKyAqLworCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvL3VzYWdlOiNkZWZpbmUgZW52X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWl1XSBbLV0gW25hbWU9dmFsdWVdLi4uIFtQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIGVudl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBjdXJyZW50IGVudmlyb25tZW50IG9yIHJ1biBQUk9HIGFmdGVyIHNldHRpbmcgdXBcbiIKKy8vdXNhZ2U6ICAgICAgICJ0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50XG4iCisvL3VzYWdlOiAgICAgIlxuCS0sIC1pCVN0YXJ0IHdpdGggYW4gZW1wdHkgZW52aXJvbm1lbnQiCisvL3VzYWdlOiAgICAgIlxuCS11CVJlbW92ZSB2YXJpYWJsZSBmcm9tIHRoZSBlbnZpcm9ubWVudCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBlbnZfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJpZ25vcmUtZW52aXJvbm1lbnRcMCIgTm9fYXJndW1lbnQgICAgICAgImkiCisJInVuc2V0XDAiICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidSIKKwk7CisjZW5kaWYKKworaW50IGVudl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZW52X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWxsaXN0X3QgKnVuc2V0X2VudiA9IE5VTEw7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ1OjoiOworI2lmIEVOQUJMRV9GRUFUVVJFX0VOVl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZW52X2xvbmdvcHRzOworI2VuZGlmCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICIraXU6IiwgJnVuc2V0X2Vudik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0gJiYgTE9ORV9EQVNIKGFyZ3ZbMF0pKSB7CisJCW9wdHMgfD0gMTsKKwkJKythcmd2OworCX0KKwlpZiAob3B0cyAmIDEpIHsKKwkJY2xlYXJlbnYoKTsKKwl9CisJd2hpbGUgKHVuc2V0X2VudikgeworCQljaGFyICp2YXIgPSBsbGlzdF9wb3AoJnVuc2V0X2Vudik7CisJCS8qIFRoaXMgZG9lcyBub3QgaGFuZGxlIC11VkFSPVZBTAorCQkgKiAoY29yZXV0aWxzIF9zZXRzXyB0aGUgdmFyaWFibGUgaW4gdGhhdCBjYXNlKTogKi8KKwkJLyp1bnNldGVudih2YXIpOyovCisJCS8qIFRoaXMgZG9lcywgYnV0IHVzZXMgc29tZXdoYW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgdGhhdAorCQkgKiBwdXRlbnYoIm5hbWVfd2l0aG91dF9lcXVhbF9zaWduIikgdW5zZXRzIHRoZSB2YXJpYWJsZTogKi8KKwkJcHV0ZW52KHZhcik7CisJfQorCisJd2hpbGUgKCphcmd2ICYmIChzdHJjaHIoKmFyZ3YsICc9JykgIT0gTlVMTCkpIHsKKwkJaWYgKHB1dGVudigqYXJndikgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInB1dGVudiIpOworCQl9CisJCSsrYXJndjsKKwl9CisKKwlpZiAoYXJndlswXSkgeworCQlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworCX0KKworCWlmIChlbnZpcm9uKSB7IC8qIGNsZWFyZW52KCkgbWF5IHNldCBlbnZpcm9uID09IE5VTEwhICovCisJCWNoYXIgKiplcDsKKwkJZm9yIChlcCA9IGVudmlyb247ICplcDsgZXArKykgeworCQkJcHV0cygqZXApOworCQl9CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTkzLCAxOTk0CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICogICAgZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZQorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9leHBhbmQuYyBiL2NvcmV1dGlscy9leHBhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJiZmZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2V4cGFuZC5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiBleHBhbmQgLSBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzCisgKiB1bmV4cGFuZCAtIGNvbnZlcnQgc3BhY2VzIHRvIHRhYnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDg5LCA5MSwgMTk5NS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+CisgKgorICogT3B0aW9ucyBmb3IgZXhwYW5kOgorICogLXQgbnVtICAtLXRhYnM9TlVNICAgICAgQ29udmVydCB0YWJzIHRvIG51bSBzcGFjZXMgKGRlZmF1bHQgOCBzcGFjZXMpLgorICogLWkgICAgICAtLWluaXRpYWwgICAgICAgT25seSBjb252ZXJ0IGluaXRpYWwgdGFicyBvbiBlYWNoIGxpbmUgdG8gc3BhY2VzLgorICoKKyAqIE9wdGlvbnMgZm9yIHVuZXhwYW5kOgorICogLWEgICAgICAtLWFsbCAgICAgICAgICAgQ29udmVydCBhbGwgYmxhbmtzLCBpbnN0ZWFkIG9mIGp1c3QgaW5pdGlhbCBibGFua3MuCisgKiAtZiAgICAgIC0tZmlyc3Qtb25seSAgICBDb252ZXJ0IG9ubHkgbGVhZGluZyBzZXF1ZW5jZXMgb2YgYmxhbmtzIChkZWZhdWx0KS4KKyAqIC10IG51bSAgLS10YWJzPU5VTSAgICAgIEhhdmUgdGFicyBudW0gY2hhcmFjdGVycyBhcGFydCBpbnN0ZWFkIG9mIDguCisgKgorICogIEJ1c3lib3ggdmVyc2lvbiAoQykgMjAwNyBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogIENhdmVhdDogdGhpcyB2ZXJzaW9ucyBvZiBleHBhbmQgYW5kIHVuZXhwYW5kIGRvbid0IGFjY2VwdCB0YWIgbGlzdHMuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGV4cGFuZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1pXSBbLXQgTl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGV4cGFuZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgdGFicyB0byBzcGFjZXMsIHdyaXRpbmcgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1pLC0taW5pdGlhbAlEb24ndCBjb252ZXJ0IHRhYnMgYWZ0ZXIgbm9uIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10YWJzPU4JVGFic3RvcHMgZXZlcnkgTiBjaGFycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1pCURvbid0IGNvbnZlcnQgdGFicyBhZnRlciBub24gYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktdAlUYWJzdG9wcyBldmVyeSBOIGNoYXJzIgorLy91c2FnZToJKQorCisvL3VzYWdlOiNkZWZpbmUgdW5leHBhbmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmFdWy10IE5dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB1bmV4cGFuZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgc3BhY2VzIHRvIHRhYnMsIHdyaXRpbmcgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWEsLS1hbGwJQ29udmVydCBhbGwgYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktZiwtLWZpcnN0LW9ubHkJQ29udmVydCBvbmx5IGxlYWRpbmcgYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktdCwtLXRhYnM9TglUYWJzdG9wcyBldmVyeSBOIGNoYXJzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYQlDb252ZXJ0IGFsbCBibGFua3MiCisvL3VzYWdlOiAgICAgIlxuCS1mCUNvbnZlcnQgb25seSBsZWFkaW5nIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgTglUYWJzdG9wcyBldmVyeSBOIGNoYXJzIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKK2VudW0geworCU9QVF9JTklUSUFMICAgICA9IDEgPDwgMCwKKwlPUFRfVEFCUyAgICAgICAgPSAxIDw8IDEsCisJT1BUX0FMTCAgICAgICAgID0gMSA8PCAyLAorfTsKKworI2lmIEVOQUJMRV9FWFBBTkQKK3N0YXRpYyB2b2lkIGV4cGFuZChGSUxFICpmaWxlLCB1bnNpZ25lZCB0YWJfc2l6ZSwgdW5zaWduZWQgb3B0KQoreworCWNoYXIgKmxpbmU7CisKKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRzKGZpbGUpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgYzsKKwkJY2hhciAqcHRyOworCQljaGFyICpwdHJfc3RyYmVnOworCisJCXB0ciA9IHB0cl9zdHJiZWcgPSBsaW5lOworCQl3aGlsZSAoKGMgPSAqcHRyKSAhPSAnXDAnKSB7CisJCQlpZiAoKG9wdCAmIE9QVF9JTklUSUFMKSAmJiAhaXNibGFuayhjKSkgeworCQkJCS8qIG5vdCBzcGFjZSBvciB0YWIgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID09ICdcdCcpIHsKKwkJCQl1bnNpZ25lZCBsZW47CisJCQkJKnB0ciA9ICdcMCc7CisjIGlmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCQl7CisJCQkJCXVuaV9zdGF0X3QgdW5pX3N0YXQ7CisJCQkJCXByaW50YWJsZV9zdHJpbmcoJnVuaV9zdGF0LCBwdHJfc3RyYmVnKTsKKwkJCQkJbGVuID0gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwkJCQl9CisjIGVsc2UKKwkJCQlsZW4gPSBwdHIgLSBwdHJfc3RyYmVnOworIyBlbmRpZgorCQkJCWxlbiA9IHRhYl9zaXplIC0gKGxlbiAlIHRhYl9zaXplKTsKKwkJCQkvKndoaWxlIChwdHJbMV0gPT0gJ1x0JykgeyBwdHIrKzsgbGVuICs9IHRhYl9zaXplOyB9IC0gY2FuIGhhbmRsZSBtYW55IHRhYnMgYXQgb25jZSAqLworCQkJCXByaW50ZigiJXMlKnMiLCBwdHJfc3RyYmVnLCBsZW4sICIiKTsKKwkJCQlwdHJfc3RyYmVnID0gcHRyICsgMTsKKwkJCX0KKwkJCXB0cisrOworCQl9CisJCWZwdXRzKHB0cl9zdHJiZWcsIHN0ZG91dCk7CisJCWZyZWUobGluZSk7CisJfQorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfVU5FWFBBTkQKK3N0YXRpYyB2b2lkIHVuZXhwYW5kKEZJTEUgKmZpbGUsIHVuc2lnbmVkIHRhYl9zaXplLCB1bnNpZ25lZCBvcHQpCit7CisJY2hhciAqbGluZTsKKworCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldHMoZmlsZSkpICE9IE5VTEwpIHsKKwkJY2hhciAqcHRyID0gbGluZTsKKwkJdW5zaWduZWQgY29sdW1uID0gMDsKKworCQl3aGlsZSAoKnB0cikgeworCQkJdW5zaWduZWQgbjsKKwkJCXVuc2lnbmVkIGxlbiA9IDA7CisKKwkJCXdoaWxlICgqcHRyID09ICcgJykgeworCQkJCXB0cisrOworCQkJCWxlbisrOworCQkJfQorCQkJY29sdW1uICs9IGxlbjsKKwkJCWlmICgqcHRyID09ICdcdCcpIHsKKwkJCQljb2x1bW4gKz0gdGFiX3NpemUgLSAoY29sdW1uICUgdGFiX3NpemUpOworCQkJCXB0cisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQluID0gY29sdW1uIC8gdGFiX3NpemU7CisJCQlpZiAobikgeworCQkJCWxlbiA9IGNvbHVtbiA9IGNvbHVtbiAlIHRhYl9zaXplOworCQkJCXdoaWxlIChuLS0pCisJCQkJCXB1dGNoYXIoJ1x0Jyk7CisJCQl9CisKKwkJCWlmICgob3B0ICYgT1BUX0lOSVRJQUwpICYmIHB0ciAhPSBsaW5lKSB7CisJCQkJcHJpbnRmKCIlKnMlcyIsIGxlbiwgIiIsIHB0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQluID0gc3RyY3NwbihwdHIsICJcdCAiKTsKKwkJCXByaW50ZigiJSpzJS4qcyIsIGxlbiwgIiIsIG4sIHB0cik7CisjIGlmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCXsKKwkJCQljaGFyIGM7CisJCQkJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKwkJCQljID0gcHRyW25dOworCQkJCXB0cltuXSA9ICdcMCc7CisJCQkJcHJpbnRhYmxlX3N0cmluZygmdW5pX3N0YXQsIHB0cik7CisJCQkJbGVuID0gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwkJCQlwdHJbbl0gPSBjOworCQkJfQorIyBlbHNlCisJCQlsZW4gPSBuOworIyBlbmRpZgorCQkJcHRyICs9IG47CisJCQljb2x1bW4gPSAoY29sdW1uICsgbGVuKSAlIHRhYl9zaXplOworCQl9CisJCWZyZWUobGluZSk7CisJfQorfQorI2VuZGlmCisKK2ludCBleHBhbmRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGV4cGFuZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJLyogRGVmYXVsdCA4IHNwYWNlcyBmb3IgMSB0YWIgKi8KKwljb25zdCBjaGFyICpvcHRfdCA9ICI4IjsKKwlGSUxFICpmaWxlOworCXVuc2lnbmVkIHRhYl9zaXplOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgZXhpdF9zdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TCisJc3RhdGljIGNvbnN0IGNoYXIgZXhwYW5kX2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJpbml0aWFsXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJpIgorCQkidGFic1wwIiAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidCIKKwk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciB1bmV4cGFuZF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCS8qIG5hbWUsIGhhc19hcmcsIHZhbCAqLworCQkiZmlyc3Qtb25seVwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAiaSIKKwkJInRhYnNcMCIgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInQiCisJCSJhbGxcMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCTsKKyNlbmRpZgorCWluaXRfdW5pY29kZSgpOworCisJaWYgKEVOQUJMRV9FWFBBTkQgJiYgKCFFTkFCTEVfVU5FWFBBTkQgfHwgYXBwbGV0X25hbWVbMF0gPT0gJ2UnKSkgeworCQlJRl9GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGV4cGFuZF9sb25nb3B0cyk7CisJCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJpdDoiLCAmb3B0X3QpOworCX0gZWxzZSB7CisJCUlGX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TKGFwcGxldF9sb25nX29wdGlvbnMgPSB1bmV4cGFuZF9sb25nb3B0cyk7CisJCS8qIC10IE5VTSBzZXRzIGFsc28gLWEgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAidGEiOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZnQ6YSIsICZvcHRfdCk7CisJCS8qIC1mIC0tZmlyc3Qtb25seSBpcyB0aGUgZGVmYXVsdCAqLworCQlpZiAoIShvcHQgJiBPUFRfQUxMKSkgb3B0IHw9IE9QVF9JTklUSUFMOworCX0KKwl0YWJfc2l6ZSA9IHhhdG91X3JhbmdlKG9wdF90LCAxLCBVSU5UX01BWCk7CisKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghKmFyZ3YpIHsKKwkJKi0tYXJndiA9IChjaGFyKiliYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCWRvIHsKKwkJZmlsZSA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQlpZiAoIWZpbGUpIHsKKwkJCWV4aXRfc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoRU5BQkxFX0VYUEFORCAmJiAoIUVOQUJMRV9VTkVYUEFORCB8fCBhcHBsZXRfbmFtZVswXSA9PSAnZScpKQorCQkJSUZfRVhQQU5EKGV4cGFuZChmaWxlLCB0YWJfc2l6ZSwgb3B0KSk7CisJCWVsc2UKKwkJCUlGX1VORVhQQU5EKHVuZXhwYW5kKGZpbGUsIHRhYl9zaXplLCBvcHQpKTsKKworCQkvKiBDaGVjayBhbmQgY2xvc2UgdGhlIGZpbGUgKi8KKwkJaWYgKGZjbG9zZV9pZl9ub3Rfc3RkaW4oZmlsZSkpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJCWV4aXRfc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQl9CisJCS8qIElmIHN0ZGluIGFsc28gY2xlYXIgRU9GICovCisJCWlmIChmaWxlID09IHN0ZGluKQorCQkJY2xlYXJlcnIoZmlsZSk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwkvKiBOb3cgY2xvc2Ugc3RkaW4gYWxzbyAqLworCS8qIChpZiB3ZSBkaWRuJ3QgcmVhZCBmcm9tIGl0LCBpdCdzIGEgbm8tb3ApICovCisJaWYgKGZjbG9zZShzdGRpbikpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfc3RhbmRhcmRfaW5wdXQpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChleGl0X3N0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvZXhwci5jIGIvY29yZXV0aWxzL2V4cHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU3NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2V4cHIuYwpAQCAtMCwwICsxLDUzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBleHByIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogYmFzZWQgb24gR05VIGV4cHIgTWlrZSBQYXJrZXIuCisgKiBDb3B5cmlnaHQgKEMpIDg2LCAxOTkxLTE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogQnVzeWJveCBtb2RpZmljYXRpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+LgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqICAtIHJlZHVjZWQgNDY0IGJ5dGVzLgorICogIC0gNjQgbWF0aCBzdXBwb3J0CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBUaGlzIHByb2dyYW0gZXZhbHVhdGVzIGV4cHJlc3Npb25zLiAgRWFjaCB0b2tlbiAob3BlcmF0b3IsIG9wZXJhbmQsCisgKiBwYXJlbnRoZXNpcykgb2YgdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBhIHNlcGFyYXRlIGFyZ3VtZW50LiAgVGhlCisgKiBwYXJzZXIgdXNlZCBpcyBhIHJlYXNvbmFibHkgZ2VuZXJhbCBvbmUsIHRob3VnaCBhbnkgaW5jYXJuYXRpb24gb2YKKyAqIGl0IGlzIGxhbmd1YWdlLXNwZWNpZmljLiAgSXQgaXMgZXNwZWNpYWxseSBuaWNlIGZvciBleHByZXNzaW9ucy4KKyAqCisgKiBObyBwYXJzZSB0cmVlIGlzIG5lZWRlZDsgYSBuZXcgbm9kZSBpcyBldmFsdWF0ZWQgaW1tZWRpYXRlbHkuCisgKiBPbmUgZnVuY3Rpb24gY2FuIGhhbmRsZSBtdWx0aXBsZSBvcGVyYXRvcnMgYWxsIG9mIGVxdWFsIHByZWNlZGVuY2UsCisgKiBwcm92aWRlZCB0aGV5IGFsbCBhc3NvY2lhdGUgKCh4IG9wIHgpIG9wIHgpLiAqLworCisvKiBubyBnZXRvcHQgbmVlZGVkICovCisKKy8vdXNhZ2U6I2RlZmluZSBleHByX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJFWFBSRVNTSU9OIgorLy91c2FnZTojZGVmaW5lIGV4cHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgdmFsdWUgb2YgRVhQUkVTU0lPTiB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJFWFBSRVNTSU9OIG1heSBiZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSB8IEFSRzIJQVJHMSBpZiBpdCBpcyBuZWl0aGVyIG51bGwgbm9yIDAsIG90aGVyd2lzZSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgJiBBUkcyCUFSRzEgaWYgbmVpdGhlciBhcmd1bWVudCBpcyBudWxsIG9yIDAsIG90aGVyd2lzZSAwXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgPCBBUkcyCTEgaWYgQVJHMSBpcyBsZXNzIHRoYW4gQVJHMiwgZWxzZSAwLiBTaW1pbGFybHk6XG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgPD0gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxID0gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxICE9IEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSA+PSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgPiBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgKyBBUkcyCVN1bSBvZiBBUkcxIGFuZCBBUkcyLiBTaW1pbGFybHk6XG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgLSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgKiBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgLyBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgJSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCVNUUklORyA6IFJFR0VYUAkJQW5jaG9yZWQgcGF0dGVybiBtYXRjaCBvZiBSRUdFWFAgaW4gU1RSSU5HXG4iCisvL3VzYWdlOiAgICAgICAiCW1hdGNoIFNUUklORyBSRUdFWFAJU2FtZSBhcyBTVFJJTkcgOiBSRUdFWFBcbiIKKy8vdXNhZ2U6ICAgICAgICIJc3Vic3RyIFNUUklORyBQT1MgTEVOR1RIIFN1YnN0cmluZyBvZiBTVFJJTkcsIFBPUyBjb3VudGVkIGZyb20gMVxuIgorLy91c2FnZTogICAgICAgIglpbmRleCBTVFJJTkcgQ0hBUlMJSW5kZXggaW4gU1RSSU5HIHdoZXJlIGFueSBDSEFSUyBpcyBmb3VuZCwgb3IgMFxuIgorLy91c2FnZTogICAgICAgIglsZW5ndGggU1RSSU5HCQlMZW5ndGggb2YgU1RSSU5HXG4iCisvL3VzYWdlOiAgICAgICAiCXF1b3RlIFRPS0VOCQlJbnRlcnByZXQgVE9LRU4gYXMgYSBzdHJpbmcsIGV2ZW4gaWZcbiIKKy8vdXNhZ2U6ICAgICAgICIJCQkJaXQgaXMgYSBrZXl3b3JkIGxpa2UgJ21hdGNoJyBvciBhblxuIgorLy91c2FnZTogICAgICAgIgkJCQlvcGVyYXRvciBsaWtlICcvJ1xuIgorLy91c2FnZTogICAgICAgIgkoRVhQUkVTU0lPTikJCVZhbHVlIG9mIEVYUFJFU1NJT05cbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJCZXdhcmUgdGhhdCBtYW55IG9wZXJhdG9ycyBuZWVkIHRvIGJlIGVzY2FwZWQgb3IgcXVvdGVkIGZvciBzaGVsbHMuXG4iCisvL3VzYWdlOiAgICAgICAiQ29tcGFyaXNvbnMgYXJlIGFyaXRobWV0aWMgaWYgYm90aCBBUkdzIGFyZSBudW1iZXJzLCBlbHNlXG4iCisvL3VzYWdlOiAgICAgICAibGV4aWNvZ3JhcGhpY2FsLiBQYXR0ZXJuIG1hdGNoZXMgcmV0dXJuIHRoZSBzdHJpbmcgbWF0Y2hlZCBiZXR3ZWVuXG4iCisvL3VzYWdlOiAgICAgICAiXFwoIGFuZCBcXCkgb3IgbnVsbDsgaWYgXFwoIGFuZCBcXCkgYXJlIG5vdCB1c2VkLCB0aGV5IHJldHVybiB0aGUgbnVtYmVyXG4iCisvL3VzYWdlOiAgICAgICAib2YgY2hhcmFjdGVycyBtYXRjaGVkIG9yIDAuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworI2lmIEVOQUJMRV9FWFBSX01BVEhfU1VQUE9SVF82NAordHlwZWRlZiBpbnQ2NF90IGFyaXRoX3Q7CisKKyNkZWZpbmUgUEZfUkVaICAgICAgImxsIgorI2RlZmluZSBQRl9SRVpfVFlQRSAobG9uZyBsb25nKQorI2RlZmluZSBTVFJUT0wocywgZSwgYikgc3RydG9sbChzLCBlLCBiKQorI2Vsc2UKK3R5cGVkZWYgbG9uZyBhcml0aF90OworCisjZGVmaW5lIFBGX1JFWiAgICAgICJsIgorI2RlZmluZSBQRl9SRVpfVFlQRSAobG9uZykKKyNkZWZpbmUgU1RSVE9MKHMsIGUsIGIpIHN0cnRvbChzLCBlLCBiKQorI2VuZGlmCisKKy8qIFRPRE86IHVzZSBiYl9zdHJ0b2xbbF0/IEl0J3MgZWFzaWVyIHRvIGNoZWNrIGZvciBlcnJvcnMuLi4gKi8KKworLyogVGhlIGtpbmRzIG9mIHZhbHVlIHdlIGNhbiBoYXZlLiAgKi8KK2VudW0geworCUlOVEVHRVIsCisJU1RSSU5HCit9OworCisvKiBBIHZhbHVlIGlzLi4uLiAqLworc3RydWN0IHZhbGluZm8geworCXNtYWxsaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgLyogV2hpY2gga2luZC4gKi8KKwl1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB2YWx1ZSBpdHNlbGYuICovCisJCWFyaXRoX3QgaTsKKwkJY2hhciAqczsKKwl9IHU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdmFsaW5mbyBWQUxVRTsKKworLyogVGhlIGFyZ3VtZW50cyBnaXZlbiB0byB0aGUgcHJvZ3JhbSwgbWludXMgdGhlIHByb2dyYW0gbmFtZS4gICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciAqKmFyZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIFZBTFVFICpldmFsKHZvaWQpOworCisKKy8qIFJldHVybiBhIFZBTFVFIGZvciBJLiAgKi8KKworc3RhdGljIFZBTFVFICppbnRfdmFsdWUoYXJpdGhfdCBpKQoreworCVZBTFVFICp2OworCisJdiA9IHh6YWxsb2Moc2l6ZW9mKFZBTFVFKSk7CisJaWYgKElOVEVHRVIpIC8qIG90aGVyd2lzZSB4emFhbG9jIGRpZCBpdCBhbHJlYWR5ICovCisJCXYtPnR5cGUgPSBJTlRFR0VSOworCXYtPnUuaSA9IGk7CisJcmV0dXJuIHY7Cit9CisKKy8qIFJldHVybiBhIFZBTFVFIGZvciBTLiAgKi8KKworc3RhdGljIFZBTFVFICpzdHJfdmFsdWUoY29uc3QgY2hhciAqcykKK3sKKwlWQUxVRSAqdjsKKworCXYgPSB4emFsbG9jKHNpemVvZihWQUxVRSkpOworCWlmIChTVFJJTkcpIC8qIG90aGVyd2lzZSB4emFhbG9jIGRpZCBpdCBhbHJlYWR5ICovCisJCXYtPnR5cGUgPSBTVFJJTkc7CisJdi0+dS5zID0geHN0cmR1cChzKTsKKwlyZXR1cm4gdjsKK30KKworLyogRnJlZSBWQUxVRSBWLCBpbmNsdWRpbmcgc3RydWN0dXJlIGNvbXBvbmVudHMuICAqLworCitzdGF0aWMgdm9pZCBmcmVldihWQUxVRSAqdikKK3sKKwlpZiAodi0+dHlwZSA9PSBTVFJJTkcpCisJCWZyZWUodi0+dS5zKTsKKwlmcmVlKHYpOworfQorCisvKiBSZXR1cm4gbm9uemVybyBpZiBWIGlzIGEgbnVsbC1zdHJpbmcgb3IgemVyby1udW1iZXIuICAqLworCitzdGF0aWMgaW50IG51bGwoVkFMVUUgKnYpCit7CisJaWYgKHYtPnR5cGUgPT0gSU5URUdFUikKKwkJcmV0dXJuIHYtPnUuaSA9PSAwOworCS8qIFNUUklORzogKi8KKwlyZXR1cm4gdi0+dS5zWzBdID09ICdcMCcgfHwgTE9ORV9DSEFSKHYtPnUucywgJzAnKTsKK30KKworLyogQ29lcmNlIFYgdG8gYSBTVFJJTkcgdmFsdWUgKGNhbid0IGZhaWwpLiAgKi8KKworc3RhdGljIHZvaWQgdG9zdHJpbmcoVkFMVUUgKnYpCit7CisJaWYgKHYtPnR5cGUgPT0gSU5URUdFUikgeworCQl2LT51LnMgPSB4YXNwcmludGYoIiUiIFBGX1JFWiAiZCIsIFBGX1JFWl9UWVBFIHYtPnUuaSk7CisJCXYtPnR5cGUgPSBTVFJJTkc7CisJfQorfQorCisvKiBDb2VyY2UgViB0byBhbiBJTlRFR0VSIHZhbHVlLiAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLiAgKi8KKworc3RhdGljIGJvb2wgdG9hcml0aChWQUxVRSAqdikKK3sKKwlpZiAodi0+dHlwZSA9PSBTVFJJTkcpIHsKKwkJYXJpdGhfdCBpOworCQljaGFyICplOworCisJCS8qIERvbid0IGludGVycHJldCB0aGUgZW1wdHkgc3RyaW5nIGFzIGFuIGludGVnZXIuICAqLworCQkvKiBDdXJyZW50bHkgZG9lcyBub3Qgd29ycnkgYWJvdXQgb3ZlcmZsb3cgb3IgaW50L2xvbmcgZGlmZmVyZW5jZXMuICovCisJCWkgPSBTVFJUT0wodi0+dS5zLCAmZSwgMTApOworCQlpZiAoKHYtPnUucyA9PSBlKSB8fCAqZSkKKwkJCXJldHVybiAwOworCQlmcmVlKHYtPnUucyk7CisJCXYtPnUuaSA9IGk7CisJCXYtPnR5cGUgPSBJTlRFR0VSOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogUmV0dXJuIHN0clswXStzdHJbMV0gaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyBTVFIgZXhhY3RseS4KKyAgIFNUUiBtdXN0IG5vdCBiZSBOVUxMLiAgKi8KKworc3RhdGljIGludCBuZXh0YXJnKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoKkcuYXJncyA9PSBOVUxMIHx8IHN0cmNtcCgqRy5hcmdzLCBzdHIpICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAodW5zaWduZWQgY2hhcilzdHJbMF0gKyAodW5zaWduZWQgY2hhcilzdHJbMV07Cit9CisKKy8qIFRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGhhbmRsaW5nIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyBpbnQgY21wX2NvbW1vbihWQUxVRSAqbCwgVkFMVUUgKnIsIGludCBvcCkKK3sKKwlhcml0aF90IGxsLCBycjsKKworCWxsID0gbC0+dS5pOworCXJyID0gci0+dS5pOworCWlmIChsLT50eXBlID09IFNUUklORyB8fCByLT50eXBlID09IFNUUklORykgeworCQl0b3N0cmluZyhsKTsKKwkJdG9zdHJpbmcocik7CisJCWxsID0gc3RyY21wKGwtPnUucywgci0+dS5zKTsKKwkJcnIgPSAwOworCX0KKwkvKiBjYWxjdWxhdGluZyBsbCAtIHJyIGFuZCBjaGVja2luZyB0aGUgcmVzdWx0IGlzIHByb25lIHRvIG92ZXJmbG93cy4KKwkgKiBXZSdsbCBkbyBpdCBkaWZmZXJlbnRseTogKi8KKwlpZiAob3AgPT0gJzwnKQorCQlyZXR1cm4gbGwgPCBycjsKKwlpZiAob3AgPT0gKCc8JyArICc9JykpCisJCXJldHVybiBsbCA8PSBycjsKKwlpZiAob3AgPT0gJz0nIHx8IChvcCA9PSAnPScgKyAnPScpKQorCQlyZXR1cm4gbGwgPT0gcnI7CisJaWYgKG9wID09ICchJyArICc9JykKKwkJcmV0dXJuIGxsICE9IHJyOworCWlmIChvcCA9PSAnPicpCisJCXJldHVybiBsbCA+IHJyOworCS8qID49ICovCisJcmV0dXJuIGxsID49IHJyOworfQorCisvKiBUaGUgYXJpdGhtZXRpYyBvcGVyYXRvciBoYW5kbGluZyBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgYXJpdGhfdCBhcml0aG1ldGljX2NvbW1vbihWQUxVRSAqbCwgVkFMVUUgKnIsIGludCBvcCkKK3sKKwlhcml0aF90IGxpLCByaTsKKworCWlmICghdG9hcml0aChsKSB8fCAhdG9hcml0aChyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vbi1udW1lcmljIGFyZ3VtZW50Iik7CisJbGkgPSBsLT51Lmk7CisJcmkgPSByLT51Lmk7CisJaWYgKG9wID09ICcrJykKKwkJcmV0dXJuIGxpICsgcmk7CisJaWYgKG9wID09ICctJykKKwkJcmV0dXJuIGxpIC0gcmk7CisJaWYgKG9wID09ICcqJykKKwkJcmV0dXJuIGxpICogcmk7CisJaWYgKHJpID09IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkaXZpc2lvbiBieSB6ZXJvIik7CisJaWYgKG9wID09ICcvJykKKwkJcmV0dXJuIGxpIC8gcmk7CisJcmV0dXJuIGxpICUgcmk7Cit9CisKKy8qIERvIHRoZSA6IG9wZXJhdG9yLgorICAgU1YgaXMgdGhlIFZBTFVFIGZvciB0aGUgbGhzICh0aGUgc3RyaW5nKSwKKyAgIFBWIGlzIHRoZSBWQUxVRSBmb3IgdGhlIHJocyAodGhlIHBhdHRlcm4pLiAgKi8KKworc3RhdGljIFZBTFVFICpkb2NvbG9uKFZBTFVFICpzdiwgVkFMVUUgKnB2KQoreworCWVudW0geyBOTUFUQ0ggPSAyIH07CisJVkFMVUUgKnY7CisJcmVnZXhfdCByZV9idWZmZXI7CisJcmVnbWF0Y2hfdCByZV9yZWdzW05NQVRDSF07CisKKwl0b3N0cmluZyhzdik7CisJdG9zdHJpbmcocHYpOworCisJaWYgKHB2LT51LnNbMF0gPT0gJ14nKSB7CisJCWJiX2Vycm9yX21zZygKKyJ3YXJuaW5nOiAnJXMnOiB1c2luZyAnXicgYXMgdGhlIGZpcnN0IGNoYXJhY3RlclxuIgorIm9mIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGlzIG5vdCBwb3J0YWJsZTsgaXQgaXMgaWdub3JlZCIsIHB2LT51LnMpOworCX0KKworCW1lbXNldCgmcmVfYnVmZmVyLCAwLCBzaXplb2YocmVfYnVmZmVyKSk7CisJbWVtc2V0KHJlX3JlZ3MsIDAsIHNpemVvZihyZV9yZWdzKSk7CisJeHJlZ2NvbXAoJnJlX2J1ZmZlciwgcHYtPnUucywgMCk7CisKKwkvKiBleHByIHVzZXMgYW4gYW5jaG9yZWQgcGF0dGVybiBtYXRjaCwgc28gY2hlY2sgdGhhdCB0aGVyZSB3YXMgYQorCSAqIG1hdGNoIGFuZCB0aGF0IHRoZSBtYXRjaCBzdGFydHMgYXQgb2Zmc2V0IDAuICovCisJaWYgKHJlZ2V4ZWMoJnJlX2J1ZmZlciwgc3YtPnUucywgTk1BVENILCByZV9yZWdzLCAwKSAhPSBSRUdfTk9NQVRDSAorCSAmJiByZV9yZWdzWzBdLnJtX3NvID09IDAKKwkpIHsKKwkJLyogV2VyZSBcKC4uLlwpIHVzZWQ/ICovCisJCWlmIChyZV9idWZmZXIucmVfbnN1YiA+IDAgJiYgcmVfcmVnc1sxXS5ybV9zbyA+PSAwKSB7CisJCQlzdi0+dS5zW3JlX3JlZ3NbMV0ucm1fZW9dID0gJ1wwJzsKKwkJCXYgPSBzdHJfdmFsdWUoc3YtPnUucyArIHJlX3JlZ3NbMV0ucm1fc28pOworCQl9IGVsc2UgeworCQkJdiA9IGludF92YWx1ZShyZV9yZWdzWzBdLnJtX2VvKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE1hdGNoIGZhaWxlZCAtLSByZXR1cm4gdGhlIHJpZ2h0IGtpbmQgb2YgbnVsbC4gICovCisJCWlmIChyZV9idWZmZXIucmVfbnN1YiA+IDApCisJCQl2ID0gc3RyX3ZhbHVlKCIiKTsKKwkJZWxzZQorCQkJdiA9IGludF92YWx1ZSgwKTsKKwl9CisJcmVnZnJlZSgmcmVfYnVmZmVyKTsKKwlyZXR1cm4gdjsKK30KKworLyogSGFuZGxlIGJhcmUgb3BlcmFuZHMgYW5kICggZXhwciApIHN5bnRheC4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDcodm9pZCkKK3sKKwlWQUxVRSAqdjsKKworCWlmICghKkcuYXJncykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCisJaWYgKG5leHRhcmcoIigiKSkgeworCQlHLmFyZ3MrKzsKKwkJdiA9IGV2YWwoKTsKKwkJaWYgKCFuZXh0YXJnKCIpIikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3ludGF4IGVycm9yIik7CisJCUcuYXJncysrOworCQlyZXR1cm4gdjsKKwl9CisKKwlpZiAobmV4dGFyZygiKSIpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3ludGF4IGVycm9yIik7CisKKwlyZXR1cm4gc3RyX3ZhbHVlKCpHLmFyZ3MrKyk7Cit9CisKKy8qIEhhbmRsZSBtYXRjaCwgc3Vic3RyLCBpbmRleCwgbGVuZ3RoLCBhbmQgcXVvdGUga2V5d29yZHMuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWw2KHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkicXVvdGVcMCIibGVuZ3RoXDAiIm1hdGNoXDAiImluZGV4XDAiInN1YnN0clwwIjsKKworCVZBTFVFICpyLCAqaTEsICppMjsKKwlWQUxVRSAqbCA9IGw7IC8qIHNpbGVuY2UgZ2NjICovCisJVkFMVUUgKnYgPSB2OyAvKiBzaWxlbmNlIGdjYyAqLworCWludCBrZXkgPSAqRy5hcmdzID8gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKkcuYXJncykgKyAxIDogMDsKKworCWlmIChrZXkgPT0gMCkgLyogbm90IGEga2V5d29yZCAqLworCQlyZXR1cm4gZXZhbDcoKTsKKwlHLmFyZ3MrKzsgLyogV2UgaGF2ZSBhIHZhbGlkIHRva2VuLCBzbyBnZXQgdGhlIG5leHQgYXJndW1lbnQuICAqLworCWlmIChrZXkgPT0gMSkgeyAvKiBxdW90ZSAqLworCQlpZiAoISpHLmFyZ3MpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3ludGF4IGVycm9yIik7CisJCXJldHVybiBzdHJfdmFsdWUoKkcuYXJncysrKTsKKwl9CisJaWYgKGtleSA9PSAyKSB7IC8qIGxlbmd0aCAqLworCQlyID0gZXZhbDYoKTsKKwkJdG9zdHJpbmcocik7CisJCXYgPSBpbnRfdmFsdWUoc3RybGVuKHItPnUucykpOworCQlmcmVldihyKTsKKwl9IGVsc2UKKwkJbCA9IGV2YWw2KCk7CisKKwlpZiAoa2V5ID09IDMpIHsgLyogbWF0Y2ggKi8KKwkJciA9IGV2YWw2KCk7CisJCXYgPSBkb2NvbG9uKGwsIHIpOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJfQorCWlmIChrZXkgPT0gNCkgeyAvKiBpbmRleCAqLworCQlyID0gZXZhbDYoKTsKKwkJdG9zdHJpbmcobCk7CisJCXRvc3RyaW5nKHIpOworCQl2ID0gaW50X3ZhbHVlKHN0cmNzcG4obC0+dS5zLCByLT51LnMpICsgMSk7CisJCWlmICh2LT51LmkgPT0gKGFyaXRoX3QpIHN0cmxlbihsLT51LnMpICsgMSkKKwkJCXYtPnUuaSA9IDA7CisJCWZyZWV2KGwpOworCQlmcmVldihyKTsKKwl9CisJaWYgKGtleSA9PSA1KSB7IC8qIHN1YnN0ciAqLworCQlpMSA9IGV2YWw2KCk7CisJCWkyID0gZXZhbDYoKTsKKwkJdG9zdHJpbmcobCk7CisJCWlmICghdG9hcml0aChpMSkgfHwgIXRvYXJpdGgoaTIpCisJCSB8fCBpMS0+dS5pID4gKGFyaXRoX3QpIHN0cmxlbihsLT51LnMpCisJCSB8fCBpMS0+dS5pIDw9IDAgfHwgaTItPnUuaSA8PSAwKQorCQkJdiA9IHN0cl92YWx1ZSgiIik7CisJCWVsc2UgeworCQkJdiA9IHhtYWxsb2Moc2l6ZW9mKFZBTFVFKSk7CisJCQl2LT50eXBlID0gU1RSSU5HOworCQkJdi0+dS5zID0geHN0cm5kdXAobC0+dS5zICsgaTEtPnUuaSAtIDEsIGkyLT51LmkpOworCQl9CisJCWZyZWV2KGwpOworCQlmcmVldihpMSk7CisJCWZyZWV2KGkyKTsKKwl9CisJcmV0dXJuIHY7Cit9CisKKy8qIEhhbmRsZSA6IG9wZXJhdG9yIChwYXR0ZXJuIG1hdGNoaW5nKS4KKyAgIENhbGxzIGRvY29sb24gdG8gZG8gdGhlIHJlYWwgd29yay4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDUodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnIsICp2OworCisJbCA9IGV2YWw2KCk7CisJd2hpbGUgKG5leHRhcmcoIjoiKSkgeworCQlHLmFyZ3MrKzsKKwkJciA9IGV2YWw2KCk7CisJCXYgPSBkb2NvbG9uKGwsIHIpOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJCWwgPSB2OworCX0KKwlyZXR1cm4gbDsKK30KKworLyogSGFuZGxlICosIC8sICUgb3BlcmF0b3JzLiAgKi8KKworc3RhdGljIFZBTFVFICpldmFsNCh2b2lkKQoreworCVZBTFVFICpsLCAqcjsKKwlpbnQgb3A7CisJYXJpdGhfdCB2YWw7CisKKwlsID0gZXZhbDUoKTsKKwl3aGlsZSAoMSkgeworCQlvcCA9IG5leHRhcmcoIioiKTsKKwkJaWYgKCFvcCkgeyBvcCA9IG5leHRhcmcoIi8iKTsKKwkJIGlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCIlIik7CisJCSAgaWYgKCFvcCkgcmV0dXJuIGw7CisJCX19CisJCUcuYXJncysrOworCQlyID0gZXZhbDUoKTsKKwkJdmFsID0gYXJpdGhtZXRpY19jb21tb24obCwgciwgb3ApOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJCWwgPSBpbnRfdmFsdWUodmFsKTsKKwl9Cit9CisKKy8qIEhhbmRsZSArLCAtIG9wZXJhdG9ycy4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDModm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisJaW50IG9wOworCWFyaXRoX3QgdmFsOworCisJbCA9IGV2YWw0KCk7CisJd2hpbGUgKDEpIHsKKwkJb3AgPSBuZXh0YXJnKCIrIik7CisJCWlmICghb3ApIHsKKwkJCW9wID0gbmV4dGFyZygiLSIpOworCQkJaWYgKCFvcCkgcmV0dXJuIGw7CisJCX0KKwkJRy5hcmdzKys7CisJCXIgPSBldmFsNCgpOworCQl2YWwgPSBhcml0aG1ldGljX2NvbW1vbihsLCByLCBvcCk7CisJCWZyZWV2KGwpOworCQlmcmVldihyKTsKKwkJbCA9IGludF92YWx1ZSh2YWwpOworCX0KK30KKworLyogSGFuZGxlIGNvbXBhcmlzb25zLiAgKi8KKworc3RhdGljIFZBTFVFICpldmFsMih2b2lkKQoreworCVZBTFVFICpsLCAqcjsKKwlpbnQgb3A7CisJYXJpdGhfdCB2YWw7CisKKwlsID0gZXZhbDMoKTsKKwl3aGlsZSAoMSkgeworCQlvcCA9IG5leHRhcmcoIjwiKTsKKwkJaWYgKCFvcCkgeyBvcCA9IG5leHRhcmcoIjw9Iik7CisJCSBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPSIpOworCQkgIGlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCI9PSIpOworCQkgICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiIT0iKTsKKwkJICAgIGlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCI+PSIpOworCQkgICAgIGlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCI+Iik7CisJCSAgICAgIGlmICghb3ApIHJldHVybiBsOworCQl9fX19fX0KKwkJRy5hcmdzKys7CisJCXIgPSBldmFsMygpOworCQl0b2FyaXRoKGwpOworCQl0b2FyaXRoKHIpOworCQl2YWwgPSBjbXBfY29tbW9uKGwsIHIsIG9wKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCQlsID0gaW50X3ZhbHVlKHZhbCk7CisJfQorfQorCisvKiBIYW5kbGUgJi4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDEodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisKKwlsID0gZXZhbDIoKTsKKwl3aGlsZSAobmV4dGFyZygiJiIpKSB7CisJCUcuYXJncysrOworCQlyID0gZXZhbDIoKTsKKwkJaWYgKG51bGwobCkgfHwgbnVsbChyKSkgeworCQkJZnJlZXYobCk7CisJCQlmcmVldihyKTsKKwkJCWwgPSBpbnRfdmFsdWUoMCk7CisJCX0gZWxzZQorCQkJZnJlZXYocik7CisJfQorCXJldHVybiBsOworfQorCisvKiBIYW5kbGUgfC4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbCh2b2lkKQoreworCVZBTFVFICpsLCAqcjsKKworCWwgPSBldmFsMSgpOworCXdoaWxlIChuZXh0YXJnKCJ8IikpIHsKKwkJRy5hcmdzKys7CisJCXIgPSBldmFsMSgpOworCQlpZiAobnVsbChsKSkgeworCQkJZnJlZXYobCk7CisJCQlsID0gcjsKKwkJfSBlbHNlCisJCQlmcmVldihyKTsKKwl9CisJcmV0dXJuIGw7Cit9CisKK2ludCBleHByX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBleHByX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlWQUxVRSAqdjsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7IC8qIGNvcmV1dGlscyBjb21wYXQgKi8KKwlHLmFyZ3MgPSBhcmd2ICsgMTsKKwlpZiAoKkcuYXJncyA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gZmV3IGFyZ3VtZW50cyIpOworCX0KKwl2ID0gZXZhbCgpOworCWlmICgqRy5hcmdzKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3ludGF4IGVycm9yIik7CisJaWYgKHYtPnR5cGUgPT0gSU5URUdFUikKKwkJcHJpbnRmKCIlIiBQRl9SRVogImRcbiIsIFBGX1JFWl9UWVBFIHYtPnUuaSk7CisJZWxzZQorCQlwdXRzKHYtPnUucyk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChudWxsKHYpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9mYWxzZS5jIGIvY29yZXV0aWxzL2ZhbHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljMmYzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9mYWxzZS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZmFsc2UgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS91dGlsaXRpZXMvZmFsc2UuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgZmFsc2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBmYWxzZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJldHVybiBhbiBleGl0IGNvZGUgb2YgRkFMU0UgKDEpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmYWxzZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmYWxzZVxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyAkP1xuIgorLy91c2FnZTogICAgICAgIjFcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBmYWxzZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmFsc2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2ZvbGQuYyBiL2NvcmV1dGlscy9mb2xkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3MzA2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9mb2xkLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogZm9sZCAtLSB3cmFwIGVhY2ggaW5wdXQgbGluZSB0byBmaXQgaW4gc3BlY2lmaWVkIHdpZHRoLgorCisgICBXcml0dGVuIGJ5IERhdmlkIE1hY0tlbnppZSwgZGptQGdudS5haS5taXQuZWR1LgorICAgQ29weXJpZ2h0IChDKSA5MSwgMTk5NS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBNb2RpZmllZCBmb3IgYnVzeWJveCBiYXNlZCBvbiBjb3JldXRpbHMgdiA1LjAKKyAgIENvcHlyaWdodCAoQykgMjAwMyBHbGVubiBNY0dyYXRoCisKKyAgIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvL3VzYWdlOiNkZWZpbmUgZm9sZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1ic10gWy13IFdJRFRIXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZm9sZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIldyYXAgaW5wdXQgbGluZXMgaW4gZWFjaCBGSUxFIChvciBzdGRpbiksIHdyaXRpbmcgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOiAgICAgIlxuCS1iCUNvdW50IGJ5dGVzIHJhdGhlciB0aGFuIGNvbHVtbnMiCisvL3VzYWdlOiAgICAgIlxuCS1zCUJyZWFrIGF0IHNwYWNlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJVXNlIFdJRFRIIGNvbHVtbnMgaW5zdGVhZCBvZiA4MCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIGNhbGwgKi8KKyNkZWZpbmUgRkxBR19DT1VOVF9CWVRFUyAgICAgICAgMQorI2RlZmluZSBGTEFHX0JSRUFLX1NQQUNFUyAgICAgICAyCisjZGVmaW5lIEZMQUdfV0lEVEggICAgICAgICAgICAgIDQKKworLyogQXNzdW1pbmcgdGhlIGN1cnJlbnQgY29sdW1uIGlzIENPTFVNTiwgcmV0dXJuIHRoZSBjb2x1bW4gdGhhdAorICAgcHJpbnRpbmcgQyB3aWxsIG1vdmUgdGhlIGN1cnNvciB0by4KKyAgIFRoZSBmaXJzdCBjb2x1bW4gaXMgMC4gKi8KK3N0YXRpYyBpbnQgYWRqdXN0X2NvbHVtbih1bnNpZ25lZCBjb2x1bW4sIGNoYXIgYykKK3sKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfQ09VTlRfQllURVMpCisJCXJldHVybiArK2NvbHVtbjsKKworCWlmIChjID09ICdcdCcpCisJCXJldHVybiBjb2x1bW4gKyA4IC0gY29sdW1uICUgODsKKworCWlmIChjID09ICdcYicpIHsKKwkJaWYgKChpbnQpLS1jb2x1bW4gPCAwKQorCQkJY29sdW1uID0gMDsKKwl9CisJZWxzZSBpZiAoYyA9PSAnXHInKQorCQljb2x1bW4gPSAwOworCWVsc2UgeyAvKiBqdXN0IGEgcHJpbnRhYmxlIGNoYXIgKi8KKwkJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04gLyogZXZlcnkgYnl0ZSBpcyBhIG5ldyBjaGFyICovCisJCSB8fCAoYyAmIDB4YzApICE9IDB4ODAgLyogaXQgaXNuJ3QgYSAybmQrIGJ5dGUgb2YgYSBVbmljb2RlIGNoYXIgKi8KKwkJKSB7CisJCQljb2x1bW4rKzsKKwkJfQorCX0KKwlyZXR1cm4gY29sdW1uOworfQorCisvKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gd3JpdGUgTlVMcywgdW5saWtlIGZwdXRzIGV0Yy4gKi8KK3N0YXRpYyB2b2lkIHdyaXRlMnN0ZG91dChjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIHNpemUpCit7CisJZndyaXRlKGJ1ZiwgMSwgc2l6ZSwgc3Rkb3V0KTsKK30KKworaW50IGZvbGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZvbGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmxpbmVfb3V0ID0gTlVMTDsKKwljb25zdCBjaGFyICp3X29wdCA9ICI4MCI7CisJdW5zaWduZWQgd2lkdGg7CisJc21hbGxpbnQgZXhpdGNvZGUgPSBFWElUX1NVQ0NFU1M7CisKKwlpbml0X3VuaWNvZGUoKTsKKworCWlmIChFTkFCTEVfSU5DTFVERV9TVVN2MikgeworCQkvKiBUdXJuIGFueSBudW1lcmljIG9wdGlvbnMgaW50byAtdyBvcHRpb25zLiAgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IDE7IGFyZ3ZbaV07IGkrKykgeworCQkJY29uc3QgY2hhciAqYSA9IGFyZ3ZbaV07CisJCQlpZiAoKmEgPT0gJy0nKSB7CisJCQkJYSsrOworCQkJCWlmICgqYSA9PSAnLScgJiYgIWFbMV0pIC8qICItLSIgKi8KKwkJCQkJYnJlYWs7CisJCQkJaWYgKGlzZGlnaXQoKmEpKQorCQkJCQlhcmd2W2ldID0geGFzcHJpbnRmKCItdyVzIiwgYSk7CisJCQl9CisJCX0KKwl9CisKKwlnZXRvcHQzMihhcmd2LCAiYnN3OiIsICZ3X29wdCk7CisJd2lkdGggPSB4YXRvdV9yYW5nZSh3X29wdCwgMSwgMTAwMDApOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyKikiLSI7CisKKwlkbyB7CisJCUZJTEUgKmlzdHJlYW0gPSBmb3Blbl9vcl93YXJuX3N0ZGluKCphcmd2KTsKKwkJaW50IGM7CisJCXVuc2lnbmVkIGNvbHVtbiA9IDA7ICAgICAvKiBTY3JlZW4gY29sdW1uIHdoZXJlIG5leHQgY2hhciB3aWxsIGdvICovCisJCXVuc2lnbmVkIG9mZnNldF9vdXQgPSAwOyAvKiBJbmRleCBpbiAnbGluZV9vdXQnIGZvciBuZXh0IGNoYXIgKi8KKworCQlpZiAoaXN0cmVhbSA9PSBOVUxMKSB7CisJCQlleGl0Y29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJd2hpbGUgKChjID0gZ2V0Yyhpc3RyZWFtKSkgIT0gRU9GKSB7CisJCQkvKiBXZSBncm93IGxpbmVfb3V0IGluIGNodW5rcyBvZiAweDEwMDAgYnl0ZXMgKi8KKwkJCWlmICgob2Zmc2V0X291dCAmIDB4ZmZmKSA9PSAwKSB7CisJCQkJbGluZV9vdXQgPSB4cmVhbGxvYyhsaW5lX291dCwgb2Zmc2V0X291dCArIDB4MTAwMCk7CisJCQl9CisgcmVzY2FuOgorCQkJbGluZV9vdXRbb2Zmc2V0X291dF0gPSBjOworCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCXdyaXRlMnN0ZG91dChsaW5lX291dCwgb2Zmc2V0X291dCArIDEpOworCQkJCWNvbHVtbiA9IG9mZnNldF9vdXQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY29sdW1uID0gYWRqdXN0X2NvbHVtbihjb2x1bW4sIGMpOworCQkJaWYgKGNvbHVtbiA8PSB3aWR0aCB8fCBvZmZzZXRfb3V0ID09IDApIHsKKwkJCQkvKiBvZmZzZXRfb3V0ID09IDAgY2FzZSBoYXBwZW5zCisJCQkJICogd2l0aCBzbWFsbCB3aWR0aCAoc2F5LCAxKSBhbmQgdGFicy4KKwkJCQkgKiBUaGUgdmVyeSBmaXJzdCB0YWIgYWxyZWFkeSBnb2VzIHRvIGNvbHVtbiA4LAorCQkJCSAqIGJ1dCB3ZSBtdXN0IG5vdCB3cmFwIGl0ICovCisJCQkJb2Zmc2V0X291dCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBUaGlzIGNoYXJhY3RlciB3b3VsZCBtYWtlIHRoZSBsaW5lIHRvbyBsb25nLgorCQkJICogUHJpbnQgdGhlIGxpbmUgcGx1cyBhIG5ld2xpbmUsIGFuZCBtYWtlIHRoaXMgY2hhcmFjdGVyCisJCQkgKiBzdGFydCB0aGUgbmV4dCBsaW5lICovCisJCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfQlJFQUtfU1BBQ0VTKSB7CisJCQkJdW5zaWduZWQgaTsKKwkJCQl1bnNpZ25lZCBsb2dpY2FsX2VuZDsKKworCQkJCS8qIExvb2sgZm9yIHRoZSBsYXN0IGJsYW5rLiAqLworCQkJCWZvciAobG9naWNhbF9lbmQgPSBvZmZzZXRfb3V0IC0gMTsgKGludClsb2dpY2FsX2VuZCA+PSAwOyBsb2dpY2FsX2VuZC0tKSB7CisJCQkJCWlmICghaXNibGFuayhsaW5lX291dFtsb2dpY2FsX2VuZF0pKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogRm91bmQgYSBzcGFjZSBvciB0YWIuCisJCQkJCSAqIE91dHB1dCB1cCB0byBhbmQgaW5jbHVkaW5nIGl0LCBhbmQgc3RhcnQgYSBuZXcgbGluZSAqLworCQkJCQlsb2dpY2FsX2VuZCsrOworCQkJCQkvKmxpbmVfb3V0W2xvZ2ljYWxfZW5kXSA9ICdcbic7IC0gTk8hIHRoaXMgbnVrZXMgb25lIGJ1ZmZlcmVkIGNoYXJhY3RlciAqLworCQkJCQl3cml0ZTJzdGRvdXQobGluZV9vdXQsIGxvZ2ljYWxfZW5kKTsKKwkJCQkJcHV0Y2hhcignXG4nKTsKKwkJCQkJLyogTW92ZSB0aGUgcmVtYWluZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZS4KKwkJCQkJICogVGhlIGFyZWFzIGJlaW5nIGNvcGllZCBoZXJlIG1pZ2h0IG92ZXJsYXAuICovCisJCQkJCW1lbW1vdmUobGluZV9vdXQsIGxpbmVfb3V0ICsgbG9naWNhbF9lbmQsIG9mZnNldF9vdXQgLSBsb2dpY2FsX2VuZCk7CisJCQkJCW9mZnNldF9vdXQgLT0gbG9naWNhbF9lbmQ7CisJCQkJCWZvciAoY29sdW1uID0gaSA9IDA7IGkgPCBvZmZzZXRfb3V0OyBpKyspIHsKKwkJCQkJCWNvbHVtbiA9IGFkanVzdF9jb2x1bW4oY29sdW1uLCBsaW5lX291dFtpXSk7CisJCQkJCX0KKwkJCQkJZ290byByZXNjYW47CisJCQkJfQorCQkJCS8qIE5vIGJsYW5rIGZvdW5kLCB3cmFwIHdpbGwgc3BsaXQgdGhlIG92ZXJsb25nIHdvcmQgKi8KKwkJCX0KKwkJCS8qIE91dHB1dCB3aGF0IHdlIGFjY3VtdWxhdGVkIHVwIHRvIG5vdywgYW5kIHN0YXJ0IGEgbmV3IGxpbmUgKi8KKwkJCWxpbmVfb3V0W29mZnNldF9vdXRdID0gJ1xuJzsKKwkJCXdyaXRlMnN0ZG91dChsaW5lX291dCwgb2Zmc2V0X291dCArIDEpOworCQkJY29sdW1uID0gb2Zmc2V0X291dCA9IDA7CisJCQlnb3RvIHJlc2NhbjsKKwkJfSAvKiB3aGlsZSAobm90IEVPRikgKi8KKworCQlpZiAob2Zmc2V0X291dCkgeworCQkJd3JpdGUyc3Rkb3V0KGxpbmVfb3V0LCBvZmZzZXRfb3V0KTsKKwkJfQorCisJCWlmIChmY2xvc2VfaWZfbm90X3N0ZGluKGlzdHJlYW0pKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCQlleGl0Y29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChleGl0Y29kZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvZnN5bmMuYyBiL2NvcmV1dGlscy9mc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmE0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZnN5bmMuYwpAQCAtMCwwICsxLDUxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZzeW5jIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZzeW5jX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRdIEZJTEUuLi4iCisvL3VzYWdlOiNkZWZpbmUgZnN5bmNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXcml0ZSBmaWxlcycgYnVmZmVyZWQgYmxvY2tzIHRvIGRpc2tcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJQXZvaWQgc3luY2luZyBtZXRhZGF0YSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWZuZGVmIE9fTk9BVElNRQorIyBkZWZpbmUgT19OT0FUSU1FIDAKKyNlbmRpZgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgZnN5bmNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZzeW5jX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdHVzOworCWludCBvcHRzOworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJkIik7IC8qIGZkYXRhc3luYyAqLworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKmFyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlkbyB7CisJCWludCBmZCA9IG9wZW5fb3Jfd2FybigqYXJndiwgT19OT0FUSU1FIHwgT19OT0NUVFkgfCBPX1JET05MWSk7CisKKwkJaWYgKGZkID09IC0xKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKG9wdHMgPyBmZGF0YXN5bmMoZmQpIDogZnN5bmMoZmQpKSkgeworCQkJLy9zdGF0dXMgPSBFWElUX0ZBSUxVUkU7IC0gZG8gd2Ugd2FudCB0aGlzPworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOworCQl9CisJCWNsb3NlKGZkKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvaGVhZC5jIGIvY29yZXV0aWxzL2hlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQ1MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2hlYWQuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGVhZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBCQl9BVURJVCBHTlUgY29tcGF0aWJsZSAtYywgLXEsIGFuZCAtdiBvcHRpb25zIGluICdmYW5jeScgY29uZmlndXJhdGlvbi4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvaGVhZC5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBoZWFkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGhlYWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBmaXJzdCAxMCBsaW5lcyBvZiBlYWNoIEZJTEUgKG9yIHN0ZGluKSB0byBzdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgICAiV2l0aCBtb3JlIHRoYW4gb25lIEZJTEUsIHByZWNlZGUgZWFjaCB3aXRoIGEgZmlsZW5hbWUgaGVhZGVyLlxuIgorLy91c2FnZTogICAgICJcbgktbiBOW2tibV0JUHJpbnQgZmlyc3QgTiBsaW5lcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfSEVBRCgKKy8vdXNhZ2U6ICAgICAiXG4JLWMgTltrYm1dCVByaW50IGZpcnN0IE4gYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlOZXZlciBwcmludCBoZWFkZXJzIgorLy91c2FnZTogICAgICJcbgktdgkJQWx3YXlzIHByaW50IGhlYWRlcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk4gbWF5IGJlIHN1ZmZpeGVkIGJ5IGsgKHgxMDI0KSwgYiAoeDUxMiksIG9yIG0gKHgxMDI0XjIpLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaGVhZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBoZWFkIC1uIDIgL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6ICAgICAgICJyb290Ong6MDowOnJvb3Q6L3Jvb3Q6L2Jpbi9iYXNoXG4iCisvL3VzYWdlOiAgICAgICAiZGFlbW9uOng6MToxOmRhZW1vbjovdXNyL3NiaW46L2Jpbi9zaFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaGVhZF9vcHRzW10gQUxJR04xID0KKwkibjoiCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCSJjOnF2IgorI2VuZGlmCisJOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IGhlYWRfc3VmZml4ZXNbXSA9IHsKKwl7ICJiIiwgNTEyIH0sCisJeyAiayIsIDEwMjQgfSwKKwl7ICJtIiwgMTAyNCoxMDI0IH0sCisJeyAiIiwgMCB9Cit9OworCisjZGVmaW5lIGhlYWRlcl9mbXRfc3RyICJcbj09PiAlcyA8PT1cbiIKKworaW50IGhlYWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhlYWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDEwOworCXVuc2lnbmVkIGxvbmcgaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQU5DWV9IRUFECisJaW50IGNvdW50X2J5dGVzID0gMDsKKwlpbnQgaGVhZGVyX3RocmVzaGhvbGQgPSAxOworI2VuZGlmCisJRklMRSAqZnA7CisJY29uc3QgY2hhciAqZm10OworCWNoYXIgKnA7CisJaW50IG9wdDsKKwlpbnQgYzsKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisjaWYgRU5BQkxFX0lOQ0xVREVfU1VTdjIgfHwgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCS8qIEFsbG93IGxlZ2FjeSBzeW50YXggb2YgYW4gaW5pdGlhbCBudW1lcmljIG9wdGlvbiB3aXRob3V0IC1uLiAqLworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nCisJICYmIGlzZGlnaXQoYXJndlsxXVsxXSkKKwkpIHsKKwkJLS1hcmdjOworCQkrK2FyZ3Y7CisJCXAgPSAoKmFyZ3YpICsgMTsKKwkJZ290byBHRVRfQ09VTlQ7CisJfQorI2VuZGlmCisKKwkvKiBObyBzaXplIGJlbmVmaXQgaW4gY29udmVydGluZyB0aGlzIHRvIGdldG9wdDMyICovCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgaGVhZF9vcHRzKSkgPiAwKSB7CisJCXN3aXRjaCAob3B0KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCQljYXNlICdxJzoKKwkJCWhlYWRlcl90aHJlc2hob2xkID0gSU5UX01BWDsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCWhlYWRlcl90aHJlc2hob2xkID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb3VudF9ieXRlcyA9IDE7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKyNlbmRpZgorCQljYXNlICduJzoKKwkJCXAgPSBvcHRhcmc7CisjaWYgRU5BQkxFX0lOQ0xVREVfU1VTdjIgfHwgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorIEdFVF9DT1VOVDoKKyNlbmRpZgorCQkJY291bnQgPSB4YXRvdWxfc2Z4KHAsIGhlYWRfc3VmZml4ZXMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKworCWZtdCA9IGhlYWRlcl9mbXRfc3RyICsgMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQU5DWV9IRUFECisJaWYgKGFyZ2MgPD0gaGVhZGVyX3RocmVzaGhvbGQpIHsKKwkJaGVhZGVyX3RocmVzaGhvbGQgPSAwOworCX0KKyNlbHNlCisJaWYgKGFyZ2MgPD0gMSkgeworCQlmbXQgKz0gMTE7IC8qICIiICovCisJfQorCS8qIE5vdyBkZWZpbmUgc29tZSB0aGluZ3MgaGVyZSB0byBhdm9pZCAjaWZkZWZzIGluIHRoZSBjb2RlIGJlbG93LgorCSAqIFRoZXNlIHNob3VsZCBvcHRpbWl6ZSBvdXQgb2YgdGhlIGlmIGNvbmRpdGlvbnMgYmVsb3cuICovCisjZGVmaW5lIGhlYWRlcl90aHJlc2hob2xkICAgMQorI2RlZmluZSBjb3VudF9ieXRlcyAgICAgICAgIDAKKyNlbmRpZgorCisJZG8geworCQlmcCA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQlpZiAoZnApIHsKKwkJCWlmIChmcCA9PSBzdGRpbikgeworCQkJCSphcmd2ID0gKGNoYXIgKikgYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCQkJfQorCQkJaWYgKGhlYWRlcl90aHJlc2hob2xkKSB7CisJCQkJcHJpbnRmKGZtdCwgKmFyZ3YpOworCQkJfQorCQkJaSA9IGNvdW50OworCQkJd2hpbGUgKGkgJiYgKChjID0gZ2V0YyhmcCkpICE9IEVPRikpIHsKKwkJCQlpZiAoY291bnRfYnl0ZXMgfHwgKGMgPT0gJ1xuJykpIHsKKwkJCQkJLS1pOworCQkJCX0KKwkJCQlwdXRjaGFyKGMpOworCQkJfQorCQkJaWYgKGZjbG9zZV9pZl9ub3Rfc3RkaW4oZnApKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOworCQkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJCWRpZV9pZl9mZXJyb3Jfc3Rkb3V0KCk7CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwkJZm10ID0gaGVhZGVyX2ZtdF9zdHI7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvaG9zdGlkLmMgYi9jb3JldXRpbHMvaG9zdGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0MDliOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9ob3N0aWQuYwpAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGhvc3RpZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgRWR3YXJkIEJldHRzIDxlZHdhcmRAZGViaWFuLm9yZz4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gTWF0Y2hlcyBHTlUgYmVoYXZpb3IuICovCisKKy8vdXNhZ2U6I2RlZmluZSBob3N0aWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBob3N0aWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBvdXQgYSB1bmlxdWUgMzItYml0IGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGhvc3RpZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaG9zdGlkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaWYgKGFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXByaW50ZigiJWx4XG4iLCBnZXRob3N0aWQoKSk7CisKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2lkLmMgYi9jb3JldXRpbHMvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlkMjVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2lkLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaWQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50LiAqLworLyogSGFja2VkIGJ5IFRpdG8gUmFndXNhIChDKSAyMDA0IHRvIGhhbmRsZSB1c2VybmFtZXMgb2Ygd2hhdGV2ZXIKKyAqIGxlbmd0aCBhbmQgdG8gYmUgbW9yZSBzaW1pbGFyIHRvIEdOVSBpZC4KKyAqIC1aIG9wdGlvbiBzdXBwb3J0OiBieSBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqIEFkZGVkIC1HIG9wdGlvbiBUaXRvIFJhZ3VzYSAoQykgMjAwOCBmb3IgU1VTdjMuCisgKi8KKworLy9jb25maWc6Y29uZmlnIElECisvL2NvbmZpZzoJYm9vbCAiaWQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgaWQgZGlzcGxheXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgZ3JvdXAgSUQgbmFtZXMuCisKKy8vY29uZmlnOmNvbmZpZyBHUk9VUFMKKy8vY29uZmlnOglib29sICJncm91cHMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUHJpbnQgdGhlIGdyb3VwIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IHVzZXIgaWQuCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19HUk9VUFMpICs9IGlkLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19JRCkgICAgICs9IGlkLm8KKworLy9hcHBsZXQ6SUZfR1JPVVBTKEFQUExFVF9OT0VYRUMoZ3JvdXBzLCBpZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZ3JvdXBzKSkKKy8vYXBwbGV0OklGX0lEKCAgICBBUFBMRVRfTk9FWEVDKGlkLCAgICAgaWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGlkICAgICkpCisKKy8vdXNhZ2U6I2RlZmluZSBpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtVU0VSXSIKKy8vdXNhZ2U6I2RlZmluZSBpZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGluZm9ybWF0aW9uIGFib3V0IFVTRVIgb3IgdGhlIGN1cnJlbnQgdXNlclxuIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJU2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVXNlciBJRCIKKy8vdXNhZ2U6ICAgICAiXG4JLWcJR3JvdXAgSUQiCisvL3VzYWdlOiAgICAgIlxuCS1HCVN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzIgorLy91c2FnZTogICAgICJcbgktbglQcmludCBuYW1lcyBpbnN0ZWFkIG9mIG51bWJlcnMiCisvL3VzYWdlOiAgICAgIlxuCS1yCVByaW50IHJlYWwgSUQgaW5zdGVhZCBvZiBlZmZlY3RpdmUgSUQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGlkXG4iCisvL3VzYWdlOiAgICAgICAidWlkPTEwMDAoYW5kZXJzZW4pIGdpZD0xMDAwKGFuZGVyc2VuKVxuIgorCisvL3VzYWdlOiNkZWZpbmUgZ3JvdXBzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbVVNFUl0iCisvL3VzYWdlOiNkZWZpbmUgZ3JvdXBzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgdGhlIGdyb3VwIG1lbWJlcnNoaXBzIG9mIFVTRVIgb3IgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGdyb3Vwc19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBncm91cHNcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmRlcnNlbiBscCBkaWFsb3V0IGNkcm9tIGZsb3BweVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworI2lmICFFTkFCTEVfVVNFX0JCX1BXRF9HUlAKKyNpZiBkZWZpbmVkKF9fVUNMSUJDX01BSk9SX18pICYmIChfX1VDTElCQ19NQUpPUl9fID09IDApCisjaWYgKF9fVUNMSUJDX01JTk9SX18gPCA5KSB8fCAoX19VQ0xJQkNfTUlOT1JfXyA9PSA5ICYmICBfX1VDTElCQ19TVUJMRVZFTF9fIDwgMzApCisjZXJyb3IgIlNvcnJ5LCB5b3UgbmVlZCBhdCBsZWFzdCB1Q2xpYmMgdmVyc2lvbiAwLjkuMzAgZm9yIGlkIGFwcGxldCB0byBidWlsZCIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworZW51bSB7CisJUFJJTlRfUkVBTCAgICAgID0gKDEgPDwgMCksCisJTkFNRV9OT1RfTlVNQkVSID0gKDEgPDwgMSksCisJSlVTVF9VU0VSICAgICAgID0gKDEgPDwgMiksCisJSlVTVF9HUk9VUCAgICAgID0gKDEgPDwgMyksCisJSlVTVF9BTExfR1JPVVBTID0gKDEgPDwgNCksCisjaWYgRU5BQkxFX1NFTElOVVgKKwlKVVNUX0NPTlRFWFQgICAgPSAoMSA8PCA1KSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBwcmludF9jb21tb24odW5zaWduZWQgaWQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAocHJlZml4KSB7CisJCXByaW50ZigiJXMiLCBwcmVmaXgpOworCX0KKwlpZiAoIShvcHRpb25fbWFzazMyICYgTkFNRV9OT1RfTlVNQkVSKSB8fCAhbmFtZSkgeworCQlwcmludGYoIiV1IiwgaWQpOworCX0KKwlpZiAoIW9wdGlvbl9tYXNrMzIgfHwgKG9wdGlvbl9tYXNrMzIgJiBOQU1FX05PVF9OVU1CRVIpKSB7CisJCWlmIChuYW1lKSB7CisJCQlwcmludGYob3B0aW9uX21hc2szMiA/ICIlcyIgOiAiKCVzKSIsIG5hbWUpOworCQl9IGVsc2UgeworCQkJLyogRG9uJ3Qgc2V0IGVycm9yIHN0YXR1cyBmbGFnIGluIGRlZmF1bHQgbW9kZSAqLworCQkJaWYgKG9wdGlvbl9tYXNrMzIpIHsKKwkJCQlpZiAoRU5BQkxFX0RFU0tUT1ApCisJCQkJCWJiX2Vycm9yX21zZygidW5rbm93biBJRCAldSIsIGlkKTsKKwkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJfQorCQl9CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfZ3JvdXAoZ2lkX3QgaWQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gcHJpbnRfY29tbW9uKGlkLCBnaWQyZ3JvdXAoaWQpLCBwcmVmaXgpOworfQorCitzdGF0aWMgaW50IHByaW50X3VzZXIodWlkX3QgaWQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gcHJpbnRfY29tbW9uKGlkLCB1aWQydW5hbWUoaWQpLCBwcmVmaXgpOworfQorCisvKiBPbiBlcnJvciBzZXQgKm4gPCAwIGFuZCByZXR1cm4gPj0gMAorICogSWYgKm4gaXMgdG9vIHNtYWxsLCB1cGRhdGUgaXQgYW5kIHJldHVybiA8IDAKKyAqIChvayB0byB0cmFzaCBncm91cHNbXSBpbiBib3RoIGNhc2VzKQorICogT3RoZXJ3aXNlIGZpbGwgaW4gZ3JvdXBzW10gYW5kIHJldHVybiA+PSAwCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2dyb3Vwcyhjb25zdCBjaGFyICp1c2VybmFtZSwgZ2lkX3QgcmdpZCwgZ2lkX3QgKmdyb3VwcywgaW50ICpuKQoreworCWludCBtOworCisJaWYgKHVzZXJuYW1lKSB7CisJCS8qIElmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIG9mIG1vcmUgdGhhbgorCQkgKiAqbiBncm91cHMsIHRoZW4gLTEgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSA+PSAwLgorCQkgKiAoYW5kIG5vIGRlZmluZWQgd2F5IG9mIGRldGVjdGluZyBlcnJvcnM/ISkgKi8KKwkJbSA9IGdldGdyb3VwbGlzdCh1c2VybmFtZSwgcmdpZCwgZ3JvdXBzLCBuKTsKKwkJLyogSSBndWVzcyAqbiA8IDAgbWlnaHQgaW5kaWNhdGUgZXJyb3IuIEFueXdheSwKKwkJICogbWFsbG9jJ2luZyAtMSBieXRlcyB3b24ndCBiZSBnb29kLCBzbzogKi8KKwkJaWYgKCpuIDwgMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gbTsKKwl9CisKKwkqbiA9IGdldGdyb3VwcygqbiwgZ3JvdXBzKTsKKwlpZiAoKm4gPj0gMCkKKwkJcmV0dXJuICpuOworCS8qIEVycm9yICovCisJaWYgKGVycm5vID09IEVJTlZBTCkgLyogKm4gaXMgdG9vIHNtYWxsPyAqLworCQkqbiA9IGdldGdyb3VwcygwLCBncm91cHMpOyAvKiBnZXQgbmVlZGVkICpuICovCisJLyogaWYgKm4gPj0gMCwgcmV0dXJuIC0xIChnb3QgbmV3ICpuKSwgZWxzZSByZXR1cm4gMCAoZXJyb3IpOiAqLworCXJldHVybiAtKCpuID49IDApOworfQorCitpbnQgaWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1aWRfdCBydWlkOworCWdpZF90IHJnaWQ7CisJdWlkX3QgZXVpZDsKKwlnaWRfdCBlZ2lkOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgaTsKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwljb25zdCBjaGFyICp1c2VybmFtZTsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisjZW5kaWYKKworCWlmIChFTkFCTEVfR1JPVVBTICYmICghRU5BQkxFX0lEIHx8IGFwcGxldF9uYW1lWzBdID09ICdnJykpIHsKKwkJLyogVE9ETzogY29yZXV0aWxzIGdyb3VwcyBwcmVwZW5kICJVU0VSIDogIiBwcmVmaXgsCisJCSAqIGFuZCBhY2NlcHQgbWFueSB1c2VybmFtZXMuIEV4YW1wbGU6CisJCSAqICMgZ3JvdXBzIHJvb3Qgcm9vdAorCQkgKiByb290IDogcm9vdAorCQkgKiByb290IDogcm9vdAorCQkgKi8KKwkJb3B0ID0gb3B0aW9uX21hc2szMiA9IGdldG9wdDMyKGFyZ3YsICIiKSB8IEpVU1RfQUxMX0dST1VQUyB8IE5BTUVfTk9UX05VTUJFUjsKKwl9IGVsc2UgeworCQkvKiBEb24ndCBhbGxvdyAtbiAtciAtbnIgLXVnIC1ydWcgLW51ZyAtcm51ZyAtdVogLWdaIC1HWiovCisJCS8qIERvbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgdXNlcm5hbWUgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzE6dS0tZzpnLS11OkctLXU6dS0tRzpnLS1HOkctLWc6cj91Z0c6bj91Z0ciCisJCQkgSUZfU0VMSU5VWCgiOnUtLVo6Wi0tdTpnLS1aOlotLWc6Ry0tWjpaLS1HIik7CisJCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJybnVnRyIgSUZfU0VMSU5VWCgiWiIpKTsKKwl9CisKKwl1c2VybmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKwlpZiAodXNlcm5hbWUpIHsKKwkJc3RydWN0IHBhc3N3ZCAqcCA9IHhnZXRwd25hbSh1c2VybmFtZSk7CisJCWV1aWQgPSBydWlkID0gcC0+cHdfdWlkOworCQllZ2lkID0gcmdpZCA9IHAtPnB3X2dpZDsKKwl9IGVsc2UgeworCQllZ2lkID0gZ2V0ZWdpZCgpOworCQlyZ2lkID0gZ2V0Z2lkKCk7CisJCWV1aWQgPSBnZXRldWlkKCk7CisJCXJ1aWQgPSBnZXR1aWQoKTsKKwl9CisJLyogSlVTVF9BTExfR1JPVVBTIGlnbm9yZXMgLXIgUFJJTlRfUkVBTCBmbGFnIGV2ZW4gaWYgbWFuIHBhZ2UgZm9yICovCisJLyogaWQgc2F5czogcHJpbnQgdGhlIHJlYWwgSUQgaW5zdGVhZCBvZiB0aGUgZWZmZWN0aXZlIElELCB3aXRoIC11Z0cgKi8KKwkvKiBpbiBmYWN0IGluIHRoaXMgY2FzZSBlZ2lkIGlzIGFsd2F5cyBwcmludGVkIGlmIGVnaWQgIT0gcmdpZCAqLworCWlmICghb3B0IHx8IChvcHQgJiBKVVNUX0FMTF9HUk9VUFMpKSB7CisJCWdpZF90ICpncm91cHM7CisJCWludCBuOworCisJCWlmICghb3B0KSB7CisJCQkvKiBEZWZhdWx0IE1vZGUgKi8KKwkJCXN0YXR1cyB8PSBwcmludF91c2VyKHJ1aWQsICJ1aWQ9Iik7CisJCQlzdGF0dXMgfD0gcHJpbnRfZ3JvdXAocmdpZCwgIiBnaWQ9Iik7CisJCQlpZiAoZXVpZCAhPSBydWlkKQorCQkJCXN0YXR1cyB8PSBwcmludF91c2VyKGV1aWQsICIgZXVpZD0iKTsKKwkJCWlmIChlZ2lkICE9IHJnaWQpCisJCQkJc3RhdHVzIHw9IHByaW50X2dyb3VwKGVnaWQsICIgZWdpZD0iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEpVU1RfQUxMX0dST1VQUyAqLworCQkJc3RhdHVzIHw9IHByaW50X2dyb3VwKHJnaWQsIE5VTEwpOworCQkJaWYgKGVnaWQgIT0gcmdpZCkKKwkJCQlzdGF0dXMgfD0gcHJpbnRfZ3JvdXAoZWdpZCwgIiAiKTsKKwkJfQorCQkvKiBXZSBhcmUgc3VwcGx5aW5nIGxhcmdpc2ggYnVmZmVyLCB0cnlpbmcKKwkJICogdG8gbm90IHJ1biBnZXRfZ3JvdXBzKCkgdHdpY2UuIFRoYXQgbWlnaHQgYmUgc2xvdworCQkgKiAoInVzZXIgZGF0YWJhc2UgaW4gcmVtb3RlIFNRTCBzZXJ2ZXIiIGNhc2UpICovCisJCWdyb3VwcyA9IHhtYWxsb2MoNjQgKiBzaXplb2YoZ3JvdXBzWzBdKSk7CisJCW4gPSA2NDsKKwkJaWYgKGdldF9ncm91cHModXNlcm5hbWUsIHJnaWQsIGdyb3VwcywgJm4pIDwgMCkgeworCQkJLyogTmVlZCBiaWdnZXIgYnVmZmVyIGFmdGVyIGFsbCAqLworCQkJZ3JvdXBzID0geHJlYWxsb2MoZ3JvdXBzLCBuICogc2l6ZW9mKGdyb3Vwc1swXSkpOworCQkJZ2V0X2dyb3Vwcyh1c2VybmFtZSwgcmdpZCwgZ3JvdXBzLCAmbik7CisJCX0KKwkJaWYgKG4gPiAwKSB7CisJCQkvKiBQcmludCB0aGUgbGlzdCAqLworCQkJcHJlZml4ID0gIiBncm91cHM9IjsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQlpZiAob3B0ICYmIChncm91cHNbaV0gPT0gcmdpZCB8fCBncm91cHNbaV0gPT0gZWdpZCkpCisJCQkJCWNvbnRpbnVlOworCQkJCXN0YXR1cyB8PSBwcmludF9ncm91cChncm91cHNbaV0sIG9wdCA/ICIgIiA6IHByZWZpeCk7CisJCQkJcHJlZml4ID0gIiwiOworCQkJfQorCQl9IGVsc2UgaWYgKG4gPCAwKSB7IC8qIGVycm9yIGluIGdldF9ncm91cHMoKSAqLworCQkJaWYgKEVOQUJMRV9ERVNLVE9QKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgZ3JvdXBzIik7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoZ3JvdXBzKTsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAoaXNfc2VsaW51eF9lbmFibGVkKCkpIHsKKwkJCWlmIChnZXRjb24oJnNjb250ZXh0KSA9PSAwKQorCQkJCXByaW50ZigiIGNvbnRleHQ9JXMiLCBzY29udGV4dCk7CisJCX0KKyNlbmRpZgorCX0gZWxzZSBpZiAob3B0ICYgUFJJTlRfUkVBTCkgeworCQlldWlkID0gcnVpZDsKKwkJZWdpZCA9IHJnaWQ7CisJfQorCisJaWYgKG9wdCAmIEpVU1RfVVNFUikKKwkJc3RhdHVzIHw9IHByaW50X3VzZXIoZXVpZCwgTlVMTCk7CisJZWxzZSBpZiAob3B0ICYgSlVTVF9HUk9VUCkKKwkJc3RhdHVzIHw9IHByaW50X2dyb3VwKGVnaWQsIE5VTEwpOworI2lmIEVOQUJMRV9TRUxJTlVYCisJZWxzZSBpZiAob3B0ICYgSlVTVF9DT05URVhUKSB7CisJCXNlbGludXhfb3JfZGllKCk7CisJCWlmICh1c2VybmFtZSB8fCBnZXRjb24oJnNjb250ZXh0KSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCBwcm9jZXNzIGNvbnRleHQlcyIsCisJCQkJdXNlcm5hbWUgPyAiIGZvciBhIGRpZmZlcmVudCB1c2VyIiA6ICIiKTsKKwkJfQorCQlmcHV0cyhzY29udGV4dCwgc3Rkb3V0KTsKKwl9CisJLyogZnJlZWNvbihOVUxMKSBzZWVtcyB0byBiZSBoYXJtbGVzcyAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZWNvbihzY29udGV4dCk7CisjZW5kaWYKKwliYl9wdXRjaGFyKCdcbicpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9pZF90ZXN0LnNoIGIvY29yZXV0aWxzL2lkX3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQ2NWYyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9pZF90ZXN0LnNoCkBAIC0wLDAgKzEsMjQ0IEBACisjIS9iaW4vYmFzaAorIyBUZXN0IHNjcmlwdCBmb3IgYnVzeWJveCBpZCB2cy4gY29yZXV0aWxzIGlkLgorIyBOZWVkcyByb290IHByaXZpbGVnZXMgZm9yIHNvbWUgdGVzdHMuCisKK2NwIC91c3IvYmluL2lkIC4KK0JVU1lCT1g9Li9idXN5Ym94CitJRD0uL2lkCitMSVNUPWBhd2sgLUY6ICd7IHByaW50ZiAiJXNcbiIsICQxIH0nIC9ldGMvcGFzc3dkYAorRkxBR19VU0VSX0VYSVNUUz0ibm8iCitURVNUX1VTRVI9ImY1ODNjYTg4NGMxZDkzNDU4ZmI2MWVkMTM3ZmY0NGY2IgorCitlY2hvICJ0ZXN0IDE6IGlkIFtvcHRpb25zXSBub3VzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCSRCVVNZQk9YIGlkICRPUFRJT05TID5mb28gMj4vZGV2L251bGwKKwlSRVQxPSQ/CisJJElEICRPUFRJT05TID5iYXIgMj4vZGV2L251bGwKKwlSRVQyPSQ/CisJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwlmaQorCWRpZmYgZm9vIGJhcgorZG9uZQorCitlY2hvICJ0ZXN0IDI6IGlkIFtvcHRpb25zXSB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwlmb3IgaSBpbiAkTElTVCA7IGRvCisJCWlmIHRlc3QgIiRpIiA9ICIkVEVTVF9VU0VSIjsgdGhlbgorCQkJRkxBR19VU0VSX0VYSVNUUz0ieWVzIgorCQlmaQorCQkkQlVTWUJPWCBpZCAkT1BUSU9OUyAkaSA+Zm9vIDI+L2Rldi9udWxsCisJCVJFVDE9JD8KKwkJJElEICRPUFRJT05TICRpID5iYXIgMj4vZGV2L251bGwKKwkJUkVUMj0kPworCQlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwkJZmkKKwkJZGlmZiBmb28gYmFyCisJZG9uZQorZG9uZQorCitpZiB0ZXN0ICRGTEFHX1VTRVJfRVhJU1RTID0gInllcyI7IHRoZW4KKwllY2hvICJ0ZXN0IDMsNCw1LDYsNyw4LDksMTAsMTEsMTIgc2tpcHBlZCBiZWNhdXNlIHRlc3QgdXNlciAkVEVTVF9VU0VSIGFscmVhZHkgZXhpc3RzIgorCXJtIC1mIGZvbyBiYXIKKwlleGl0IDEKK2ZpCisKK2FkZHVzZXIgLXMgL2Jpbi90cnVlIC1nICIiIC1IIC1EICIkVEVTVF9VU0VSIiB8fCBleGl0IDEKKworY2hvd24gJFRFU1RfVVNFUi4kVEVTVF9VU0VSICRCVVNZQk9YCitjaG1vZCB1K3MgJEJVU1lCT1ggMj4mMSAvZGV2L251bGwKK2Nob3duICRURVNUX1VTRVIuJFRFU1RfVVNFUiAkSUQKK2NobW9kIHUrcyAkSUQgMj4mMSAvZGV2L251bGwKKworZWNobyAidGVzdCAzIHNldHVpZCwgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIG5vIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCSRCVVNZQk9YIGlkICRPUFRJT05TID5mb28gMj4vZGV2L251bGwKKwlSRVQxPSQ/CisJJElEICRPUFRJT05TID5iYXIgMj4vZGV2L251bGwKKwlSRVQyPSQ/CisJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwlmaQorCWRpZmYgZm9vIGJhcgorCSNkb25lCitkb25lCisKK2VjaG8gInRlc3QgNCBzZXR1aWQsIGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwlmb3IgaSBpbiAkTElTVCA7IGRvCisJCSRCVVNZQk9YIGlkICRPUFRJT05TICRpID5mb28gMj4vZGV2L251bGwKKwkJUkVUMT0kPworCQkkSUQgJE9QVElPTlMgJGkgPmJhciAyPi9kZXYvbnVsbAorCQlSRVQyPSQ/CisJCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCQlmaQorCQlkaWZmIGZvbyBiYXIKKwlkb25lCitkb25lCisKK2Nob3duICRURVNUX1VTRVIuJFRFU1RfVVNFUiAkQlVTWUJPWAorY2htb2QgZytzICRCVVNZQk9YIDI+JjEgL2Rldi9udWxsCitjaG93biAkVEVTVF9VU0VSLiRURVNUX1VTRVIgJElECitjaG1vZCBnK3MgJElEIDI+JjEgL2Rldi9udWxsCisKK2VjaG8gInRlc3QgNSBzZXRnaWQsIGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSBubyB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwkkQlVTWUJPWCBpZCAkT1BUSU9OUyA+Zm9vIDI+L2Rldi9udWxsCisJUkVUMT0kPworCSRJRCAkT1BUSU9OUyA+YmFyIDI+L2Rldi9udWxsCisJUkVUMj0kPworCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJZmkKKwlkaWZmIGZvbyBiYXIKKwkjZG9uZQorZG9uZQorCitlY2hvICJ0ZXN0IDYgc2V0Z2lkLCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJZm9yIGkgaW4gJExJU1QgOyBkbworCQkkQlVTWUJPWCBpZCAkT1BUSU9OUyAkaSA+Zm9vIDI+L2Rldi9udWxsCisJCVJFVDE9JD8KKwkJJElEICRPUFRJT05TICRpID5iYXIgMj4vZGV2L251bGwKKwkJUkVUMj0kPworCQlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwkJZmkKKwkJZGlmZiBmb28gYmFyCisJZG9uZQorZG9uZQorCitjaG93biAkVEVTVF9VU0VSLiRURVNUX1VTRVIgJEJVU1lCT1gKK2NobW9kIHUrcyxnK3MgJEJVU1lCT1ggMj4mMSAvZGV2L251bGwKK2Nob3duICRURVNUX1VTRVIuJFRFU1RfVVNFUiAkSUQKK2NobW9kIHUrcyxnK3MgJElEIDI+JjEgL2Rldi9udWxsCisKK2VjaG8gInRlc3QgNyBzZXR1aWQsIHNldGdpZCwgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIG5vIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCSRCVVNZQk9YIGlkICRPUFRJT05TID5mb28gMj4vZGV2L251bGwKKwlSRVQxPSQ/CisJJElEICRPUFRJT05TID5iYXIgMj4vZGV2L251bGwKKwlSRVQyPSQ/CisJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwlmaQorCWRpZmYgZm9vIGJhcgorCSNkb25lCitkb25lCisKK2VjaG8gInRlc3QgOCBzZXR1aWQsIHNldGdpZCwgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCWZvciBpIGluICRMSVNUIDsgZG8KKwkJJEJVU1lCT1ggaWQgJE9QVElPTlMgJGkgPmZvbyAyPi9kZXYvbnVsbAorCQlSRVQxPSQ/CisJCSRJRCAkT1BUSU9OUyAkaSA+YmFyIDI+L2Rldi9udWxsCisJCVJFVDI9JD8KKwkJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJCWZpCisJCWRpZmYgZm9vIGJhcgorCWRvbmUKK2RvbmUKKworZGVsdXNlciAkVEVTVF9VU0VSIHx8IGV4aXQgMQorCitlY2hvICJ0ZXN0IDkgc2V0dWlkLCBzZXRnaWQsIG5vdCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gbm8gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJJEJVU1lCT1ggaWQgJE9QVElPTlMgPmZvbyAyPi9kZXYvbnVsbAorCVJFVDE9JD8KKwkkSUQgJE9QVElPTlMgPmJhciAyPi9kZXYvbnVsbAorCVJFVDI9JD8KKwlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCWZpCisJZGlmZiBmb28gYmFyCitkb25lCisKK2VjaG8gInRlc3QgMTAgc2V0dWlkLCBzZXRnaWQsIG5vdCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJZm9yIGkgaW4gJExJU1QgOyBkbworCQkkQlVTWUJPWCBpZCAkT1BUSU9OUyAkaSA+Zm9vIDI+L2Rldi9udWxsCisJCVJFVDE9JD8KKwkJJElEICRPUFRJT05TICRpID5iYXIgMj4vZGV2L251bGwKKwkJUkVUMj0kPworCQlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwkJZmkKKwkJZGlmZiBmb28gYmFyCisJZG9uZQorZG9uZQorCitjaG93biAucm9vdCAkQlVTWUJPWCAyPiYxIC9kZXYvbnVsbAorY2hvd24gLnJvb3QgJElEIDI+JjEgL2Rldi9udWxsCitjaG1vZCBnK3MgJEJVU1lCT1ggMj4mMSAvZGV2L251bGwKK2NobW9kIGcrcyAkSUQgMj4mMSAvZGV2L251bGwKKworZWNobyAidGVzdCAxMSBzZXRnaWQsIG5vdCBleGlzdGluZyBncm91cDogaWQgW29wdGlvbnNdIG5vIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCSRCVVNZQk9YIGlkICRPUFRJT05TID5mb28gMj4vZGV2L251bGwKKwlSRVQxPSQ/CisJJElEICRPUFRJT05TID5iYXIgMj4vZGV2L251bGwKKwlSRVQyPSQ/CisJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwlmaQorCWRpZmYgZm9vIGJhcgorCSNkb25lCitkb25lCisKK2VjaG8gInRlc3QgMTIgc2V0Z2lkLCBub3QgZXhpc3RpbmcgZ3JvdXA6IGlkIFtvcHRpb25zXSB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwlmb3IgaSBpbiAkTElTVCA7IGRvCisJCSRCVVNZQk9YIGlkICRPUFRJT05TICRpID5mb28gMj4vZGV2L251bGwKKwkJUkVUMT0kPworCQkkSUQgJE9QVElPTlMgJGkgPmJhciAyPi9kZXYvbnVsbAorCQlSRVQyPSQ/CisJCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCQlmaQorCQlkaWZmIGZvbyBiYXIKKwlkb25lCitkb25lCisKK2Nob3duIHJvb3Qucm9vdCAkQlVTWUJPWCAyPiYxIC9kZXYvbnVsbAorY2hvd24gcm9vdC5yb290ICRJRCAyPiYxIC9kZXYvbnVsbAorcm0gLWYgJElECitybSAtZiBmb28gYmFyCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvaW5zdGFsbC5jIGIvY29yZXV0aWxzL2luc3RhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDU0OTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2luc3RhbGwuYwpAQCAtMCwwICsxLDIyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEdsZW5uIE1jR3JhdGgKKyAqIFNFTGludXggc3VwcG9ydDogYnkgWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiAtdiwgLWIsIC1jIGFyZSBpZ25vcmVkICovCisvL3VzYWdlOiNkZWZpbmUgaW5zdGFsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1jZERzcF0gWy1vIFVTRVJdIFstZyBHUlBdIFstbSBNT0RFXSBbU09VUkNFXS4uLiBERVNUIgorLy91c2FnZTojZGVmaW5lIGluc3RhbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3B5IGZpbGVzIGFuZCBzZXQgYXR0cmlidXRlc1xuIgorLy91c2FnZTogICAgICJcbgktYwlKdXN0IGNvcHkgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktZAlDcmVhdGUgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1ECUNyZWF0ZSBsZWFkaW5nIHRhcmdldCBkaXJlY3RvcmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU3RyaXAgc3ltYm9sIHRhYmxlIgorLy91c2FnZTogICAgICJcbgktcAlQcmVzZXJ2ZSBkYXRlIgorLy91c2FnZTogICAgICJcbgktbyBVU0VSCVNldCBvd25lcnNoaXAiCisvL3VzYWdlOiAgICAgIlxuCS1nIEdSUAlTZXQgZ3JvdXAgb3duZXJzaGlwIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCVNldCBwZXJtaXNzaW9ucyIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1aCVNldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJjb3JldXRpbHMvY29yZXV0aWxzLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgaW5zdGFsbF9sb25nb3B0c1tdIEFMSUdOMSA9CisJImRpcmVjdG9yeVwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJInByZXNlcnZlLXRpbWVzdGFtcHNcMCIgTm9fYXJndW1lbnQgICAgICAgInAiCisJInN0cmlwXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInMiCisJImdyb3VwXDAiICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImciCisJIm1vZGVcMCIgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIm0iCisJIm93bmVyXDAiICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIm8iCisvKiBhdXRvZnMgYnVpbGQgaW5zaXN0cyBvZiB1c2luZyAtYiAtLXN1ZmZpeD0ub3JpZyAqLworLyogVE9ETz8gKHNob3J0IG9wdGlvbiBmb3IgLS1zdWZmaXggaXMgLVMpICovCisjaWYgRU5BQkxFX1NFTElOVVgKKwkiY29udGV4dFwwIiAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWiIKKwkicHJlc2VydmVfY29udGV4dFwwIiAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKwkicHJlc2VydmUtY29udGV4dFwwIiAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKyNlbmRpZgorCTsKKyNlbmRpZgorCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgc2V0ZGVmYXVsdGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisKKwlpZiAoIWlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGxzdGF0KHBhdGgsICZzKSAhPSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWF0Y2hwYXRoY29uKHBhdGgsIHMuc3RfbW9kZSwgJnNjb250ZXh0KSA8IDApIHsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzdHJjbXAoc2NvbnRleHQsICI8PG5vbmU+PiIpID09IDApIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxzZXRmaWxlY29uKHBhdGgsIHNjb250ZXh0KSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT1RTVVApIHsKKwkJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6IGNhbid0IGNoYW5nZSBjb250ZXh0IgorCQkJCQkiIG9mICVzIHRvICVzIiwgcGF0aCwgc2NvbnRleHQpOworCQl9CisJfQorCisgb3V0OgorCWZyZWVjb24oc2NvbnRleHQpOworfQorCisjZW5kaWYKKworaW50IGluc3RhbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGluc3RhbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwltb2RlX3QgbW9kZTsKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCWNoYXIgKmFyZywgKmxhc3Q7CisJY29uc3QgY2hhciAqZ2lkX3N0cjsKKwljb25zdCBjaGFyICp1aWRfc3RyOworCWNvbnN0IGNoYXIgKm1vZGVfc3RyOworCWludCBjb3B5X2ZsYWdzID0gRklMRVVUSUxTX0RFUkVGRVJFTkNFIHwgRklMRVVUSUxTX0ZPUkNFOworCWludCBvcHRzOworCWludCBtaW5fYXJncyA9IDE7CisJaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgaXNkaXIgPSAwOworI2lmIEVOQUJMRV9TRUxJTlVYCisJc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0OworCWJvb2wgdXNlX2RlZmF1bHRfc2VsaW51eF9jb250ZXh0ID0gMTsKKyNlbmRpZgorCWVudW0geworCQlPUFRfYyAgICAgICAgICAgICA9IDEgPDwgMCwKKwkJT1BUX3YgICAgICAgICAgICAgPSAxIDw8IDEsCisJCU9QVF9iICAgICAgICAgICAgID0gMSA8PCAyLAorCQlPUFRfTUtESVJfTEVBRElORyA9IDEgPDwgMywKKwkJT1BUX0RJUkVDVE9SWSAgICAgPSAxIDw8IDQsCisJCU9QVF9QUkVTRVJWRV9USU1FID0gMSA8PCA1LAorCQlPUFRfU1RSSVAgICAgICAgICA9IDEgPDwgNiwKKwkJT1BUX0dST1VQICAgICAgICAgPSAxIDw8IDcsCisJCU9QVF9NT0RFICAgICAgICAgID0gMSA8PCA4LAorCQlPUFRfT1dORVIgICAgICAgICA9IDEgPDwgOSwKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlPUFRfU0VUX1NFQ1VSSVRZX0NPTlRFWFQgPSAxIDw8IDEwLAorCQlPUFRfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCA9IDEgPDwgMTEsCisjZW5kaWYKKwl9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gaW5zdGFsbF9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gInMtLWQ6ZC0tcyIgSUZfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyhJRl9TRUxJTlVYKCI6Wi0tXHhmZjpceGZmLS1aIikpOworCS8qIC1jIGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGl0J3MgbmVlZGVkICovCisJLyogLXYgaXMgaWdub3JlZCAoInByaW50IG5hbWUgb2YgZWFjaCBjcmVhdGVkIGRpcmVjdG9yeSIpICovCisJLyogLWIgaXMgaWdub3JlZCAoIm1ha2UgYSBiYWNrdXAgb2YgZWFjaCBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlIikgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImN2YiIgIkRkcHNnOm06bzoiIElGX1NFTElOVVgoIlo6IiksCisJCQkmZ2lkX3N0ciwgJm1vZGVfc3RyLCAmdWlkX3N0ciBJRl9TRUxJTlVYKCwgJnNjb250ZXh0KSk7CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChvcHRzICYgKE9QVF9QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUfE9QVF9TRVRfU0VDVVJJVFlfQ09OVEVYVCkpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwkJdXNlX2RlZmF1bHRfc2VsaW51eF9jb250ZXh0ID0gMDsKKwkJaWYgKG9wdHMgJiBPUFRfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCkgeworCQkJY29weV9mbGFncyB8PSBGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVDsKKwkJfQorCQlpZiAob3B0cyAmIE9QVF9TRVRfU0VDVVJJVFlfQ09OVEVYVCkgeworCQkJc2V0ZnNjcmVhdGVjb25fb3JfZGllKHNjb250ZXh0KTsKKwkJCWNvcHlfZmxhZ3MgfD0gRklMRVVUSUxTX1NFVF9TRUNVUklUWV9DT05URVhUOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBwcmVzZXJ2ZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lLCB0aGlzIGlzIEdOVSBiZWhhdmlvdXIsCisJICogQlNEIG9ubHkgcHJlc2VydmVzIG1vZGlmaWNhdGlvbiB0aW1lICovCisJaWYgKG9wdHMgJiBPUFRfUFJFU0VSVkVfVElNRSkgeworCQljb3B5X2ZsYWdzIHw9IEZJTEVVVElMU19QUkVTRVJWRV9TVEFUVVM7CisJfQorCW1vZGUgPSAwNzU1OyAvKiBHTlUgY29yZXV0aWxzIDYuMTAgY29tcGF0ICovCisJaWYgKG9wdHMgJiBPUFRfTU9ERSkKKwkJYmJfcGFyc2VfbW9kZShtb2RlX3N0ciwgJm1vZGUpOworCXVpZCA9IChvcHRzICYgT1BUX09XTkVSKSA/IGdldF91Z19pZCh1aWRfc3RyLCB4dW5hbWUydWlkKSA6IGdldHVpZCgpOworCWdpZCA9IChvcHRzICYgT1BUX0dST1VQKSA/IGdldF91Z19pZChnaWRfc3RyLCB4Z3JvdXAyZ2lkKSA6IGdldGdpZCgpOworCisJbGFzdCA9IGFyZ3ZbYXJnYyAtIDFdOworCWlmICghKG9wdHMgJiBPUFRfRElSRUNUT1JZKSkgeworCQlhcmd2W2FyZ2MgLSAxXSA9IE5VTEw7CisJCW1pbl9hcmdzKys7CisKKwkJLyogY29yZXV0aWxzIGluc3RhbGwgcmVzb2x2ZXMgbGluayBpbiB0aGlzIGNhc2UsIGRvbid0IHVzZSBsc3RhdCAqLworCQlpc2RpciA9IHN0YXQobGFzdCwgJnN0YXRidWYpIDwgMCA/IDAgOiBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSk7CisJfQorCisJaWYgKGFyZ2MgPCBtaW5fYXJncykKKwkJYmJfc2hvd191c2FnZSgpOworCisJd2hpbGUgKChhcmcgPSAqYXJndisrKSAhPSBOVUxMKSB7CisJCWNoYXIgKmRlc3QgPSBsYXN0OworCQlpZiAob3B0cyAmIE9QVF9ESVJFQ1RPUlkpIHsKKwkJCWRlc3QgPSBhcmc7CisJCQkvKiBHTlUgY29yZXV0aWxzIDYuOSBkb2VzIG5vdCBzZXQgdWlkOmdpZAorCQkJICogb24gaW50ZXJtZWRpYXRlIGNyZWF0ZWQgZGlyZWN0b3JpZXMKKwkJCSAqIChvbmx5IG9uIGxhc3Qgb25lKSAqLworCQkJaWYgKGJiX21ha2VfZGlyZWN0b3J5KGRlc3QsIDA3NTUsIEZJTEVVVElMU19SRUNVUikpIHsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG9wdHMgJiBPUFRfTUtESVJfTEVBRElORykgeworCQkJCWNoYXIgKmRkaXIgPSB4c3RyZHVwKGRlc3QpOworCQkJCWJiX21ha2VfZGlyZWN0b3J5KGRpcm5hbWUoZGRpciksIDA3NTUsIEZJTEVVVElMU19SRUNVUik7CisJCQkJLyogZXJyb3JzIGFyZSBub3QgY2hlY2tlZC4gY29weV9maWxlCisJCQkJICogd2lsbCBmYWlsIGlmIGRpciBpcyBub3QgY3JlYXRlZC4gKi8KKwkJCQlmcmVlKGRkaXIpOworCQkJfQorCQkJaWYgKGlzZGlyKQorCQkJCWRlc3QgPSBjb25jYXRfcGF0aF9maWxlKGxhc3QsIGJiX2Jhc2VuYW1lKGFyZykpOworCQkJaWYgKGNvcHlfZmlsZShhcmcsIGRlc3QsIGNvcHlfZmxhZ3MpICE9IDApIHsKKwkJCQkvKiBjb3B5IGlzIG5vdCBtYWRlICovCisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChvcHRzICYgT1BUX1NUUklQKSB7CisJCQkJY2hhciAqYXJnc1s0XTsKKwkJCQlhcmdzWzBdID0gKGNoYXIqKSJzdHJpcCI7CisJCQkJYXJnc1sxXSA9IChjaGFyKikiLXAiOyAvKiAtcCAtLXByZXNlcnZlLWRhdGVzICovCisJCQkJYXJnc1syXSA9IGRlc3Q7CisJCQkJYXJnc1szXSA9IE5VTEw7CisJCQkJaWYgKHNwYXduX2FuZF93YWl0KGFyZ3MpKSB7CisJCQkJCWJiX3BlcnJvcl9tc2coInN0cmlwIik7CisJCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBTZXQgdGhlIGZpbGUgbW9kZSAoYWx3YXlzLCBub3Qgb25seSB3aXRoIC1tKS4KKwkJICogR05VIGNvcmV1dGlscyA2LjEwIGlzIG5vdCBhZmZlY3RlZCBieSB1bWFzay4gKi8KKwkJaWYgKGNobW9kKGRlc3QsIG1vZGUpID09IC0xKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjaGFuZ2UgJXMgb2YgJXMiLCAicGVybWlzc2lvbnMiLCBkZXN0KTsKKwkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmICh1c2VfZGVmYXVsdF9zZWxpbnV4X2NvbnRleHQpCisJCQlzZXRkZWZhdWx0ZmlsZWNvbihkZXN0KTsKKyNlbmRpZgorCQkvKiBTZXQgdGhlIHVzZXIgYW5kIGdyb3VwIGlkICovCisJCWlmICgob3B0cyAmIChPUFRfT1dORVJ8T1BUX0dST1VQKSkKKwkJICYmIGxjaG93bihkZXN0LCB1aWQsIGdpZCkgPT0gLTEKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjaGFuZ2UgJXMgb2YgJXMiLCAib3duZXJzaGlwIiwgZGVzdCk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCX0KKyBuZXh0OgorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgaXNkaXIpCisJCQlmcmVlKGRlc3QpOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGVuZ3RoLmMuZGlzYWJsZWQgYi9jb3JldXRpbHMvbGVuZ3RoLmMuZGlzYWJsZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlODk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9sZW5ndGguYy5kaXNhYmxlZApAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBBcHBhcmVudGx5IGEgYnVzeWJveCAob2Jzb2xldGU/KSBleHRlbnNpb24uICovCisKKy8vdXNhZ2U6I2RlZmluZSBsZW5ndGhfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNUUklORyIKKy8vdXNhZ2U6I2RlZmluZSBsZW5ndGhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBTVFJJTkcncyBsZW5ndGgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxlbmd0aF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBsZW5ndGggSGVsbG9cbiIKKy8vdXNhZ2U6ICAgICAgICI1XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgbGVuZ3RoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsZW5ndGhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKChhcmdjICE9IDIpIHx8ICgqKigrK2FyZ3YpID09ICctJykpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXByaW50ZigiJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oKmFyZ3YpKTsKKworCXJldHVybiBmZmx1c2hfYWxsKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGliY29yZXV0aWxzL0tidWlsZC5zcmMgYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0MmQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9saWJjb3JldXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE0IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19NS0ZJRk8pCSs9IGdldG9wdF9ta19maWZvX25vZC5vCitsaWItJChDT05GSUdfTUtOT0QpCSs9IGdldG9wdF9ta19maWZvX25vZC5vCitsaWItJChDT05GSUdfSU5TVEFMTCkJKz0gY3BfbXZfc3RhdC5vCitsaWItJChDT05GSUdfQ1ApCSs9IGNwX212X3N0YXQubworbGliLSQoQ09ORklHX01WKQkrPSBjcF9tdl9zdGF0Lm8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9saWJjb3JldXRpbHMvY29yZXV0aWxzLmggYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NvcmV1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2QwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NvcmV1dGlscy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBDT1JFVVRJTFNfSAorI2RlZmluZSBDT1JFVVRJTFNfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCit0eXBlZGVmIGludCAoKnN0YXRfZnVuYykoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpwcyk7CisKK2ludCBjcF9tdl9zdGF0Mihjb25zdCBjaGFyICpmbiwgc3RydWN0IHN0YXQgKmZuX3N0YXQsIHN0YXRfZnVuYyBzZikgRkFTVF9GVU5DOworaW50IGNwX212X3N0YXQoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpmbl9zdGF0KSBGQVNUX0ZVTkM7CisKK21vZGVfdCBnZXRvcHRfbWtfZmlmb19ub2QoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NwX212X3N0YXQuYyBiL2NvcmV1dGlscy9saWJjb3JldXRpbHMvY3BfbXZfc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTA3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NwX212X3N0YXQuYwpAQCAtMCwwICsxLDUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjb3JldXRpbHMgdXRpbGl0eSByb3V0aW5lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJjb3JldXRpbHMuaCIKKworaW50IEZBU1RfRlVOQyBjcF9tdl9zdGF0Mihjb25zdCBjaGFyICpmbiwgc3RydWN0IHN0YXQgKmZuX3N0YXQsIHN0YXRfZnVuYyBzZikKK3sKKwlpZiAoc2YoZm4sIGZuX3N0YXQpIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJCQlpZiAoZXJybm8gPT0gRU5PVERJUikgeworCQkJCWJiX2Vycm9yX21zZygiY2FuJ3Qgc3RhdCAnJXMnOiBQYXRoIGhhcyBub24tZGlyZWN0b3J5IGNvbXBvbmVudCIsIGZuKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisjZW5kaWYKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGZuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKFNfSVNESVIoZm5fc3RhdC0+c3RfbW9kZSkpIHsKKwkJcmV0dXJuIDM7CisJfQorCXJldHVybiAxOworfQorCitpbnQgRkFTVF9GVU5DIGNwX212X3N0YXQoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpmbl9zdGF0KQoreworCXJldHVybiBjcF9tdl9zdGF0MihmbiwgZm5fc3RhdCwgc3RhdCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGliY29yZXV0aWxzL2dldG9wdF9ta19maWZvX25vZC5jIGIvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9nZXRvcHRfbWtfZmlmb19ub2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI3MTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9nZXRvcHRfbWtfZmlmb19ub2QuYwpAQCAtMCwwICsxLDQ4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjb3JldXRpbHMgdXRpbGl0eSByb3V0aW5lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJjb3JldXRpbHMuaCIKKworbW9kZV90IEZBU1RfRlVOQyBnZXRvcHRfbWtfZmlmb19ub2QoY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGUgPSAwNjY2OworCWNoYXIgKnNtb2RlID0gTlVMTDsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dDsKKyNlbmRpZgorCWludCBvcHQ7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIm06IiBJRl9TRUxJTlVYKCJaOiIpLCAmc21vZGUgSUZfU0VMSU5VWCgsJnNjb250ZXh0KSk7CisJaWYgKG9wdCAmIDEpIHsKKwkJaWYgKGJiX3BhcnNlX21vZGUoc21vZGUsICZtb2RlKSkKKwkJCXVtYXNrKDApOworCX0KKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKG9wdCAmIDIpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwkJc2V0ZnNjcmVhdGVjb25fb3JfZGllKHNjb250ZXh0KTsKKwl9CisjZW5kaWYKKworCXJldHVybiBtb2RlOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2xuLmMgYi9jb3JldXRpbHMvbG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE5YThmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2xuLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbG4gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIEJCX0FVRElUIEdOVSBvcHRpb25zIG1pc3Npbmc6IC1kLCAtRiwgLWksIGFuZCAtdi4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvbG4uaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgbG5fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBUQVJHRVQuLi4gTElOS3xESVIiCisvL3VzYWdlOiNkZWZpbmUgbG5fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgYSBsaW5rIExJTksgb3IgRElSL1RBUkdFVCB0byB0aGUgc3BlY2lmaWVkIFRBUkdFVChzKVxuIgorLy91c2FnZTogICAgICJcbgktcwlNYWtlIHN5bWxpbmtzIGluc3RlYWQgb2YgaGFyZGxpbmtzIgorLy91c2FnZTogICAgICJcbgktZglSZW1vdmUgZXhpc3RpbmcgZGVzdGluYXRpb25zIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBkZXJlZmVyZW5jZSBzeW1saW5rcyAtIHRyZWF0IGxpa2Ugbm9ybWFsIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1iCU1ha2UgYSBiYWNrdXAgb2YgdGhlIHRhcmdldCAoaWYgZXhpc3RzKSBiZWZvcmUgbGluayBvcGVyYXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1TIHN1ZglVc2Ugc3VmZml4IGluc3RlYWQgb2YgfiB3aGVuIG1ha2luZyBiYWNrdXAgZmlsZXMiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxuX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxuIC1zIEJ1c3lCb3ggL3RtcC9sc1xuIgorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9sc1xuIgorLy91c2FnZTogICAgICAgImxyd3hyd3hyd3ggICAgMSByb290ICAgICByb290ICAgICAgICAgICAgNyBBcHIgMTIgMTg6MzkgbHMgLT4gQnVzeUJveCpcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworI2RlZmluZSBMTl9TWU1MSU5LICAgICAgICAgIDEKKyNkZWZpbmUgTE5fRk9SQ0UgICAgICAgICAgICAyCisjZGVmaW5lIExOX05PREVSRUZFUkVOQ0UgICAgNAorI2RlZmluZSBMTl9CQUNLVVAgICAgICAgICAgIDgKKyNkZWZpbmUgTE5fU1VGRklYICAgICAgICAgICAxNgorCitpbnQgbG5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxuX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJaW50IG9wdHM7CisJY2hhciAqbGFzdDsKKwljaGFyICpzcmNfbmFtZTsKKwljaGFyICpzcmM7CisJY2hhciAqc3VmZml4ID0gKGNoYXIqKSJ+IjsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCAoKmxpbmtfZnVuYykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBtaW4gb25lIGFyZyAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAic2ZuYlM6IiwgJnN1ZmZpeCk7CisKKwlsYXN0ID0gYXJndlthcmdjIC0gMV07CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJLyogImxuIFBBVEgvVE8vRklMRSIgLT4gImxuIFBBVEgvVE8vRklMRSBGSUxFIiAqLworCQkqLS1hcmd2ID0gbGFzdDsKKwkJLyogeHN0cmR1cCBpcyBuZWVkZWQ6ICJsbiAtcyBQQVRIL1RPL0ZJTEUvIiBpcyBlcXVpdmFsZW50IHRvCisJCSAqICJsbiAtcyBQQVRIL1RPL0ZJTEUvIEZJTEUiLCBub3QgImxuIC1zIFBBVEgvVE8vRklMRSBGSUxFIgorCQkgKi8KKwkJbGFzdCA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKHhzdHJkdXAobGFzdCkpOworCX0KKworCWRvIHsKKwkJc3JjX25hbWUgPSBOVUxMOworCQlzcmMgPSBsYXN0OworCisJCWlmIChpc19kaXJlY3Rvcnkoc3JjLAorCQkgICAgICAgICAgICAgICAgKG9wdHMgJiBMTl9OT0RFUkVGRVJFTkNFKSBeIExOX05PREVSRUZFUkVOQ0UsCisJCSAgICAgICAgICAgICAgICBOVUxMKQorCQkpIHsKKwkJCXNyY19uYW1lID0geHN0cmR1cCgqYXJndik7CisJCQlzcmMgPSBjb25jYXRfcGF0aF9maWxlKHNyYywgYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoc3JjX25hbWUpKTsKKwkJCWZyZWUoc3JjX25hbWUpOworCQkJc3JjX25hbWUgPSBzcmM7CisJCX0KKwkJaWYgKCEob3B0cyAmIExOX1NZTUxJTkspICYmIHN0YXQoKmFyZ3YsICZzdGF0YnVmKSkgeworCQkJLy8gY29yZXV0aWxzOiAibG4gZGFuZ2xpbmdfc3ltbGluayBuZXdfaGFyZGxpbmsiIHdvcmtzCisJCQlpZiAobHN0YXQoKmFyZ3YsICZzdGF0YnVmKSB8fCAhU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOworCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQlmcmVlKHNyY19uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmIChvcHRzICYgTE5fQkFDS1VQKSB7CisJCQljaGFyICpiYWNrdXA7CisJCQliYWNrdXAgPSB4YXNwcmludGYoIiVzJXMiLCBzcmMsIHN1ZmZpeCk7CisJCQlpZiAocmVuYW1lKHNyYywgYmFja3VwKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coc3JjKTsKKwkJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJZnJlZShiYWNrdXApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJlZShiYWNrdXApOworCQkJLyoKKwkJCSAqIFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdCBhcmUgYm90aCBoYXJkIGxpbmtzIHRvIHRoZSBzYW1lCisJCQkgKiBpbm9kZSwgYSByZW5hbWUgbWF5IHN1Y2NlZWQgZXZlbiB0aG91Z2ggbm90aGluZyBoYXBwZW5lZC4KKwkJCSAqIFRoZXJlZm9yZSwgYWx3YXlzIHVubGluaygpLgorCQkJICovCisJCQl1bmxpbmsoc3JjKTsKKwkJfSBlbHNlIGlmIChvcHRzICYgTE5fRk9SQ0UpIHsKKwkJCXVubGluayhzcmMpOworCQl9CisKKwkJbGlua19mdW5jID0gbGluazsKKwkJaWYgKG9wdHMgJiBMTl9TWU1MSU5LKSB7CisJCQlsaW5rX2Z1bmMgPSBzeW1saW5rOworCQl9CisKKwkJaWYgKGxpbmtfZnVuYygqYXJndiwgc3JjKSAhPSAwKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhzcmMpOworCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQl9CisKKwkJZnJlZShzcmNfbmFtZSk7CisKKwl9IHdoaWxlICgoKythcmd2KVsxXSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2xvZ25hbWUuYyBiL2NvcmV1dGlscy9sb2duYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiOTYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9sb2duYW1lLmMKQEAgLTAsMCArMSw1MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsb2duYW1lIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9sb2duYW1lLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTVVN2MyBzcGVjaWZpZXMgdGhlIHN0cmluZyB1c2VkIGlzIHRoYXQgcmV0dXJuZWQgZnJvbSBnZXRsb2dpbigpLgorICogVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHVzZWQgZ2V0cHd1aWQoKSBmb3IgZ2V0ZXVpZCgpLCB3aGljaAorICogaXMgX25vdF8gdGhlIHNhbWUuICBFcmlrIGFwcGFyZW50bHkgbWFkZSB0aGlzIGNoYW5nZSBhbG1vc3QgMyB5ZWFycworICogYWdvIHRvIGF2b2lkIGZhaWxpbmcgd2hlbiBubyB1dG1wIHdhcyBhdmFpbGFibGUuICBIb3dldmVyLCB0aGUKKyAqIGNvcnJlY3QgY291cnNlIG9mIGFjdGlvbiB3cnQgU1VTdjMgZm9yIGEgZmFpbGluZyBnZXRsb2dpbigpIGlzCisgKiBhIGRpYWdub3N0aWMgbWVzc2FnZSBhbmQgYW4gZXJyb3IgcmV0dXJuLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb2duYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgbG9nbmFtZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHVzZXIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxvZ25hbWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbG9nbmFtZVxuIgorLy91c2FnZTogICAgICAgInJvb3RcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBsb2duYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsb2duYW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciBidWZbNjRdOworCisJaWYgKGFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIFVzaW5nIF9yIGZ1bmN0aW9uIC0gYXZvaWQgcHVsbGluZyBpbiBzdGF0aWMgYnVmZmVyIGZyb20gbGliYyAqLworCWlmIChnZXRsb2dpbl9yKGJ1Ziwgc2l6ZW9mKGJ1ZikpID09IDApIHsKKwkJcHV0cyhidWYpOworCQlyZXR1cm4gZmZsdXNoX2FsbCgpOworCX0KKworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0bG9naW4iKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9scy5jIGIvY29yZXV0aWxzL2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViMjVlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9scy5jCkBAIC0wLDAgKzEsMTI1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2IEJyaWFuIENhbmRsZXIgPEIuQ2FuZGxlckBwb2JveC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBbZGF0ZSB1bmtub3duLiBQZXJoYXBzIGJlZm9yZSB5ZWFyIDIwMDBdCisgKiBUbyBhY2hpZXZlIGEgc21hbGwgbWVtb3J5IGZvb3RwcmludCwgdGhpcyB2ZXJzaW9uIG9mICdscycgZG9lc24ndCBkbyBhbnkKKyAqIGZpbGUgc29ydGluZywgYW5kIG9ubHkgaGFzIHRoZSBtb3N0IGVzc2VudGlhbCBjb21tYW5kIGxpbmUgc3dpdGNoZXMKKyAqIChpLmUuLCB0aGUgb25lcyBJIGNvdWxkbid0IGxpdmUgd2l0aG91dCA6LSkgQWxsIGZlYXR1cmVzIHdoaWNoIGludm9sdmUKKyAqIGxpbmtpbmcgaW4gc3Vic3RhbnRpYWwgY2h1bmtzIG9mIGxpYmMgY2FuIGJlIGRpc2FibGVkLgorICoKKyAqIEFsdGhvdWdoIEkgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gYWRkIG5ldyBmZWF0dXJlcyB0byB0aGlzIHByb2dyYW0gdG8KKyAqIGtlZXAgaXQgc21hbGwsIEkgKmFtKiBpbnRlcmVzdGVkIHRvIHJlY2VpdmUgYnVnIGZpeGVzIGFuZCB3YXlzIHRvIG1ha2UKKyAqIGl0IG1vcmUgcG9ydGFibGUuCisgKgorICogS05PV04gQlVHUzoKKyAqIDEuIGhpZGRlbiBmaWxlcyBjYW4gbWFrZSBjb2x1bW4gd2lkdGggdG9vIGxhcmdlCisgKgorICogTk9OLU9QVElNQUwgQkVIQVZJT1VSOgorICogMS4gYXV0b3dpZHRoIHJlYWRzIGRpcmVjdG9yaWVzIHR3aWNlCisgKiAyLiBpZiB5b3UgZG8gYSBzaG9ydCBkaXJlY3RvcnkgbGlzdGluZyB3aXRob3V0IGZpbGV0eXBlIGNoYXJhY3RlcnMKKyAqICAgIGFwcGVuZGVkLCB0aGVyZSdzIG5vIG5lZWQgdG8gc3RhdCBlYWNoIG9uZQorICogUE9SVEFCSUxJVFk6CisgKiAxLiByZXF1aXJlcyBsc3RhdCAoQlNEKSAtIGhvdyBkbyB5b3UgZG8gaXQgd2l0aG91dD8KKyAqCisgKiBbMjAwOS0wM10KKyAqIGxzIHNvcnRzIGxpc3Rpbmcgbm93LCBhbmQgc3VwcG9ydHMgYWxtb3N0IGFsbCBvcHRpb25zLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsc190cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy0xQWFDeGQiCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX0ZPTExPV0xJTktTKCJMSCIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1JFQ1VSU0lWRSgiUiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX0ZJTEVUWVBFUygiRnAiKSAibGlucyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygiZSIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0hVTUFOX1JFQURBQkxFKCJoIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfU09SVEZJTEVTKCJyU1h2IikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygiY3R1IikKKy8vdXNhZ2U6CUlGX1NFTElOVVgoImtLWiIpICJdIgorLy91c2FnZToJSUZfRkVBVFVSRV9BVVRPV0lEVEgoIiBbLXcgV0lEVEhdIikgIiBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbHNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IGRpcmVjdG9yeSBjb250ZW50c1xuIgorLy91c2FnZTogICAgICJcbgktMQlPbmUgY29sdW1uIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJSW5jbHVkZSBlbnRyaWVzIHdoaWNoIHN0YXJ0IHdpdGggLiIKKy8vdXNhZ2U6ICAgICAiXG4JLUEJTGlrZSAtYSwgYnV0IGV4Y2x1ZGUgLiBhbmQgLi4iCisvL3VzYWdlOiAgICAgIlxuCS1DCUxpc3QgYnkgY29sdW1ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJTGlzdCBieSBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJTGlzdCBkaXJlY3RvcnkgZW50cmllcyBpbnN0ZWFkIG9mIGNvbnRlbnRzIgorLy91c2FnZToJSUZfRkVBVFVSRV9MU19GT0xMT1dMSU5LUygKKy8vdXNhZ2U6ICAgICAiXG4JLUwJRm9sbG93IHN5bWxpbmtzIgorLy91c2FnZTogICAgICJcbgktSAlGb2xsb3cgc3ltbGlua3Mgb24gY29tbWFuZCBsaW5lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19SRUNVUlNJVkUoCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX0ZJTEVUWVBFUygKKy8vdXNhZ2U6ICAgICAiXG4JLXAJQXBwZW5kIC8gdG8gZGlyIGVudHJpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1GCUFwcGVuZCBpbmRpY2F0b3IgKG9uZSBvZiAqLz1AfCkgdG8gZW50cmllcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9uZyBsaXN0aW5nIGZvcm1hdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJTGlzdCBpbm9kZSBudW1iZXJzIgorLy91c2FnZTogICAgICJcbgktbglMaXN0IG51bWVyaWMgVUlEcyBhbmQgR0lEcyBpbnN0ZWFkIG9mIG5hbWVzIgorLy91c2FnZTogICAgICJcbgktcwlMaXN0IGFsbG9jYXRlZCBibG9ja3MiCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoCisvL3VzYWdlOiAgICAgIlxuCS1lCUxpc3QgZnVsbCBkYXRlIGFuZCB0aW1lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgKKy8vdXNhZ2U6ICAgICAiXG4JLWgJTGlzdCBzaXplcyBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQgKDFLIDI0M00gMkcpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19TT1JURklMRVMoCisvL3VzYWdlOiAgICAgIlxuCS1yCVNvcnQgaW4gcmV2ZXJzZSBvcmRlciIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJU29ydCBieSBzaXplIgorLy91c2FnZTogICAgICJcbgktWAlTb3J0IGJ5IGV4dGVuc2lvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJU29ydCBieSB2ZXJzaW9uIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKAorLy91c2FnZTogICAgICJcbgktYwlXaXRoIC1sOiBzb3J0IGJ5IGN0aW1lIgorLy91c2FnZTogICAgICJcbgktdAlXaXRoIC1sOiBzb3J0IGJ5IG10aW1lIgorLy91c2FnZTogICAgICJcbgktdQlXaXRoIC1sOiBzb3J0IGJ5IGF0aW1lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLWsJTGlzdCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktSwlMaXN0IHNlY3VyaXR5IGNvbnRleHQgaW4gbG9uZyBmb3JtYXQiCisvL3VzYWdlOiAgICAgIlxuCS1aCUxpc3Qgc2VjdXJpdHkgY29udGV4dCBhbmQgcGVybWlzc2lvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQVVUT1dJRFRIKAorLy91c2FnZTogICAgICJcbgktdyBOCUFzc3VtZSB0aGUgdGVybWluYWwgaXMgTiBjb2x1bW5zIHdpZGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX0NPTE9SKAorLy91c2FnZTogICAgICJcbgktLWNvbG9yWz17YWx3YXlzLG5ldmVyLGF1dG99XQlDb250cm9sIGNvbG9yaW5nIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisjaWYgRU5BQkxFX0ZUUEQKKy8qIGZ0cGQgdXNlcyBscywgYW5kIHdpdGhvdXQgdGltZXN0YW1wcyBNb3ppbGxhIHdvbid0IHVuZGVyc3RhbmQKKyAqIGZ0cGQncyBMSVNUIG91dHB1dC4KKyAqLworIyB1bmRlZiBDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTCisjIHVuZGVmIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMKKyMgdW5kZWYgSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTCisjIHVuZGVmIElGX05PVF9GRUFUVVJFX0xTX1RJTUVTVEFNUFMKKyMgZGVmaW5lIENPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFMgMQorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyAxCisjIGRlZmluZSBJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgSUZfTk9UX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyguLi4pCisjZW5kaWYKKworCitlbnVtIHsKK1RFUk1JTkFMX1dJRFRIICA9IDgwLCAgICAgICAgICAgLyogdXNlIDc5IGlmIHRlcm1pbmFsIGhhcyBsaW5lZm9sZCBidWcgKi8KKworU1BMSVRfRklMRSAgICAgID0gMCwKK1NQTElUX0RJUiAgICAgICA9IDEsCitTUExJVF9TVUJESVIgICAgPSAyLAorCisvKiBCaXRzIGluIEcuYWxsX2ZtdDogKi8KKworLyogNTEzMDYgbHJ3eHJ3eHJ3eCAgMSByb290ICAgICByb290ICAgICAgICAgMiBNYXkgMTEgMDE6NDMgL2Jpbi92aWV3IC0+IHZpKiAqLworLyogd2hhdCBmaWxlIGluZm9ybWF0aW9uIHdpbGwgYmUgbGlzdGVkICovCitMSVNUX0lOTyAgICAgICAgPSAxIDw8IDAsCitMSVNUX0JMT0NLUyAgICAgPSAxIDw8IDEsCitMSVNUX01PREVCSVRTICAgPSAxIDw8IDIsCitMSVNUX05MSU5LUyAgICAgPSAxIDw8IDMsCitMSVNUX0lEX05BTUUgICAgPSAxIDw8IDQsCitMSVNUX0lEX05VTUVSSUMgPSAxIDw8IDUsCitMSVNUX0NPTlRFWFQgICAgPSAxIDw8IDYsCitMSVNUX1NJWkUgICAgICAgPSAxIDw8IDcsCitMSVNUX0RBVEVfVElNRSAgPSAxIDw8IDgsCitMSVNUX0ZVTExUSU1FICAgPSAxIDw8IDksCitMSVNUX1NZTUxJTksgICAgPSAxIDw8IDEwLAorTElTVF9GSUxFVFlQRSAgID0gMSA8PCAxMSwgLyogc2hvdyAvIHN1ZmZpeCBmb3IgZGlycyAqLworTElTVF9DTEFTU0lGWSAgID0gMSA8PCAxMiwgLyogcmVxdWlyZXMgTElTVF9GSUxFVFlQRSwgYWxzbyBzaG93ICosfCxALD0gc3VmZml4ZXMgKi8KK0xJU1RfTUFTSyAgICAgICA9IChMSVNUX0NMQVNTSUZZIDw8IDEpIC0gMSwKKworLyogd2hhdCBmaWxlcyB3aWxsIGJlIGRpc3BsYXllZCAqLworRElTUF9ESVJOQU1FICAgID0gMSA8PCAxMywgICAgICAvKiAyIG9yIG1vcmUgaXRlbXM/IGxhYmVsIGRpcmVjdG9yaWVzICovCitESVNQX0hJRERFTiAgICAgPSAxIDw8IDE0LCAgICAgIC8qIHNob3cgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggLiAqLworRElTUF9ET1QgICAgICAgID0gMSA8PCAxNSwgICAgICAvKiBzaG93IC4gYW5kIC4uICovCitESVNQX05PTElTVCAgICAgPSAxIDw8IDE2LCAgICAgIC8qIHNob3cgZGlyZWN0b3J5IGFzIGl0c2VsZiwgbm90IGNvbnRlbnRzICovCitESVNQX1JFQ1VSU0lWRSAgPSAxIDw8IDE3LCAgICAgIC8qIHNob3cgZGlyZWN0b3J5IGFuZCBldmVyeXRoaW5nIGJlbG93IGl0ICovCitESVNQX1JPV1MgICAgICAgPSAxIDw8IDE4LCAgICAgIC8qIHByaW50IGFjcm9zcyByb3dzICovCitESVNQX01BU0sgICAgICAgPSAoKERJU1BfUk9XUyA8PCAxKSAtIDEpICYgfihESVNQX0RJUk5BTUUgLSAxKSwKKworLyogd2hhdCBpcyB0aGUgb3ZlcmFsbCBzdHlsZSBvZiB0aGUgbGlzdGluZyAqLworU1RZTEVfQ09MVU1OQVIgID0gMSA8PCAxOSwgICAgICAvKiBtYW55IHJlY29yZHMgcGVyIGxpbmUgKi8KK1NUWUxFX0xPTkcgICAgICA9IDIgPDwgMTksICAgICAgLyogb25lIHJlY29yZCBwZXIgbGluZSwgZXh0ZW5kZWQgaW5mbyAqLworU1RZTEVfU0lOR0xFICAgID0gMyA8PCAxOSwgICAgICAvKiBvbmUgcmVjb3JkIHBlciBsaW5lICovCitTVFlMRV9NQVNLICAgICAgPSBTVFlMRV9TSU5HTEUsCisKKy8qIHdoaWNoIG9mIHRoZSB0aHJlZSB0aW1lcyB3aWxsIGJlIHVzZWQgKi8KK1RJTUVfQ0hBTkdFICAgICA9ICgxIDw8IDIxKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCitUSU1FX0FDQ0VTUyAgICAgPSAoMiA8PCAyMSkgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorVElNRV9NQVNLICAgICAgID0gKDMgPDwgMjEpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKKworLyogaG93IHdpbGwgdGhlIGZpbGVzIGJlIHNvcnRlZCAoQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTKSAqLworU09SVF9SRVZFUlNFICAgID0gMSA8PCAyMywKKworU09SVF9OQU1FICAgICAgID0gMCwgICAgICAgICAgICAvKiBzb3J0IGJ5IGZpbGUgbmFtZSAqLworU09SVF9TSVpFICAgICAgID0gMSA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IGZpbGUgc2l6ZSAqLworU09SVF9BVElNRSAgICAgID0gMiA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IGxhc3QgYWNjZXNzIHRpbWUgKi8KK1NPUlRfQ1RJTUUgICAgICA9IDMgPDwgMjQsICAgICAgLyogc29ydCBieSBsYXN0IGNoYW5nZSB0aW1lICovCitTT1JUX01USU1FICAgICAgPSA0IDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgbGFzdCBtb2RpZmljYXRpb24gdGltZSAqLworU09SVF9WRVJTSU9OICAgID0gNSA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IHZlcnNpb24gKi8KK1NPUlRfRVhUICAgICAgICA9IDYgPDwgMjQsICAgICAgLyogc29ydCBieSBmaWxlIG5hbWUgZXh0ZW5zaW9uICovCitTT1JUX0RJUiAgICAgICAgPSA3IDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgZmlsZSBvciBkaXJlY3RvcnkgKi8KK1NPUlRfTUFTSyAgICAgICA9ICg3IDw8IDI0KSAqIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUywKKworTElTVF9MT05HICAgICAgID0gTElTVF9NT0RFQklUUyB8IExJU1RfTkxJTktTIHwgTElTVF9JRF9OQU1FIHwgTElTVF9TSVpFIHwgXAorICAgICAgICAgICAgICAgICAgTElTVF9EQVRFX1RJTUUgfCBMSVNUX1NZTUxJTkssCit9OworCisvKiAtQ2FkaWwxICBTdGQgb3B0aW9ucywgYnVzeWJveCBhbHdheXMgc3VwcG9ydHMgKi8KKy8qIC1nbnN4QSAgIFN0ZCBvcHRpb25zLCBidXN5Ym94IGFsd2F5cyBzdXBwb3J0cyAqLworLyogLVEgICAgICAgR05VIG9wdGlvbiwgYnVzeWJveCBhbHdheXMgc3VwcG9ydHMgKi8KKy8qIC1rICAgICAgIFNFTGludXggb3B0aW9uLCBidXN5Ym94IGFsd2F5cyBzdXBwb3J0cyAoaWdub3JlcyBpZiAhU0VMaW51eCkgKi8KKy8qICAgICAgICAgIFN0ZCBoYXMgLWsgd2hpY2ggbWVhbnMgInNob3cgc2l6ZXMgaW4ga2J5dGVzIiAqLworLyogLUxIUmN0dXIgU3RkIG9wdGlvbnMsIGJ1c3lib3ggb3B0aW9uYWxseSBzdXBwb3J0cyAqLworLyogLUZwICAgICAgU3RkIG9wdGlvbnMsIGJ1c3lib3ggb3B0aW9uYWxseSBzdXBwb3J0cyAqLworLyogLVNYdmhUdyAgR05VIG9wdGlvbnMsIGJ1c3lib3ggb3B0aW9uYWxseSBzdXBwb3J0cyAqLworLyogLVQgV0lEVEggSWdub3JlZCAod2UgZG9uJ3QgdXNlIHRhYnMgb24gb3V0cHV0KSAqLworLyogLUtaICAgICAgU0VMaW51eCBtYW5kYXRlZCBvcHRpb25zLCBidXN5Ym94IG9wdGlvbmFsbHkgc3VwcG9ydHMgKi8KKy8qICAgICAgICAgIChjb3JldXRpbHMgOC40IGhhcyBubyAtSywgcmVtb3ZlIGl0PykgKi8KKy8qIC1lICAgICAgIEkgdGhpbmsgd2UgbWFkZSB0aGlzIG9uZSB1cCAobG9va3Mgc2ltaWxhciB0byBHTlUgLS1mdWxsLXRpbWUpICovCisvKiBXZSBhbHJlYWR5IHVzZWQgdXAgYWxsIDMyIGJpdHMsIGlmIHdlIG5lZWQgdG8gYWRkIG1vcmUsIGNhbmRpZGF0ZXMgZm9yIHJlbW92YWw6ICovCisvKiAtSywgLVQsIC1lIChhZGQgLS1mdWxsLXRpbWUgaW5zdGVhZCkgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGxzX29wdGlvbnNbXSBBTElHTjEgPQorCSJDYWRpbDFnbnN4UUFrIiAgICAgIC8qIDEzIG9wdHMsIHRvdGFsIDEzICovCisJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKCJjZXR1IikgLyogNCwgMTcgKi8KKwlJRl9GRUFUVVJFX0xTX1NPUlRGSUxFUygiU1hydiIpICAvKiA0LCAyMSAqLworCUlGX0ZFQVRVUkVfTFNfRklMRVRZUEVTKCJGcCIpICAgIC8qIDIsIDIzICovCisJSUZfRkVBVFVSRV9MU19SRUNVUlNJVkUoIlIiKSAgICAgLyogMSwgMjQgKi8KKwlJRl9TRUxJTlVYKCJLWiIpICAgICAgICAgICAgICAgICAvKiAyLCAyNiAqLworCUlGX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MoIkxIIikgIC8qIDIsIDI4ICovCisJSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgiaCIpICAgLyogMSwgMjkgKi8KKwlJRl9GRUFUVVJFX0FVVE9XSURUSCgiVDp3OiIpICAgICAvKiAyLCAzMSAqLworCS8qIHdpdGggLS1jb2xvciwgd2UgdXNlIGFsbCAzMiBiaXRzICovOworZW51bSB7CisJLy9PUFRfQyA9ICgxIDw8IDApLAorCS8vT1BUX2EgPSAoMSA8PCAxKSwKKwkvL09QVF9kID0gKDEgPDwgMiksCisJLy9PUFRfaSA9ICgxIDw8IDMpLAorCS8vT1BUX2wgPSAoMSA8PCA0KSwKKwkvL09QVF8xID0gKDEgPDwgNSksCisJT1BUX2cgPSAoMSA8PCA2KSwKKwkvL09QVF9uID0gKDEgPDwgNyksCisJLy9PUFRfcyA9ICgxIDw8IDgpLAorCS8vT1BUX3ggPSAoMSA8PCA5KSwKKwlPUFRfUSA9ICgxIDw8IDEwKSwKKwkvL09QVF9BID0gKDEgPDwgMTEpLAorCS8vT1BUX2sgPSAoMSA8PCAxMiksCisKKwlPUFRCSVRfYyA9IDEzLAorCU9QVEJJVF9lLAorCU9QVEJJVF90LAorCU9QVEJJVF91LAorCU9QVEJJVF9TID0gT1BUQklUX2MgKyA0ICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKKwlPUFRCSVRfWCwgLyogMTggKi8KKwlPUFRCSVRfciwKKwlPUFRCSVRfdiwKKwlPUFRCSVRfRiA9IE9QVEJJVF9TICsgNCAqIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUywKKwlPUFRCSVRfcCwgLyogMjIgKi8KKwlPUFRCSVRfUiA9IE9QVEJJVF9GICsgMiAqIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUywKKwlPUFRCSVRfSyA9IE9QVEJJVF9SICsgMSAqIEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRSwKKwlPUFRCSVRfWiwgLyogMjUgKi8KKwlPUFRCSVRfTCA9IE9QVEJJVF9LICsgMiAqIEVOQUJMRV9TRUxJTlVYLAorCU9QVEJJVF9ILCAvKiAyNyAqLworCU9QVEJJVF9oID0gT1BUQklUX0wgKyAyICogRU5BQkxFX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MsCisJT1BUQklUX1QgPSBPUFRCSVRfaCArIDEgKiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSwKKwlPUFRCSVRfdywgLyogMzAgKi8KKwlPUFRCSVRfY29sb3IgPSBPUFRCSVRfVCArIDIgKiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgsCisKKwlPUFRfYyA9ICgxIDw8IE9QVEJJVF9jKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCisJT1BUX2UgPSAoMSA8PCBPUFRCSVRfZSkgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorCU9QVF90ID0gKDEgPDwgT1BUQklUX3QpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKKwlPUFRfdSA9ICgxIDw8IE9QVEJJVF91KSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCisJT1BUX1MgPSAoMSA8PCBPUFRCSVRfUykgKiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMsCisJT1BUX1ggPSAoMSA8PCBPUFRCSVRfWCkgKiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMsCisJT1BUX3IgPSAoMSA8PCBPUFRCSVRfcikgKiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMsCisJT1BUX3YgPSAoMSA8PCBPUFRCSVRfdikgKiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMsCisJT1BUX0YgPSAoMSA8PCBPUFRCSVRfRikgKiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMsCisJT1BUX3AgPSAoMSA8PCBPUFRCSVRfcCkgKiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMsCisJT1BUX1IgPSAoMSA8PCBPUFRCSVRfUikgKiBFTkFCTEVfRkVBVFVSRV9MU19SRUNVUlNJVkUsCisJT1BUX0sgPSAoMSA8PCBPUFRCSVRfSykgKiBFTkFCTEVfU0VMSU5VWCwKKwlPUFRfWiA9ICgxIDw8IE9QVEJJVF9aKSAqIEVOQUJMRV9TRUxJTlVYLAorCU9QVF9MID0gKDEgPDwgT1BUQklUX0wpICogRU5BQkxFX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MsCisJT1BUX0ggPSAoMSA8PCBPUFRCSVRfSCkgKiBFTkFCTEVfRkVBVFVSRV9MU19GT0xMT1dMSU5LUywKKwlPUFRfaCA9ICgxIDw8IE9QVEJJVF9oKSAqIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFLAorCU9QVF9UID0gKDEgPDwgT1BUQklUX1QpICogRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRILAorCU9QVF93ID0gKDEgPDwgT1BUQklUX3cpICogRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRILAorCU9QVF9jb2xvciA9ICgxIDw8IE9QVEJJVF9jb2xvcikgKiBFTkFCTEVfRkVBVFVSRV9MU19DT0xPUiwKK307CisKKy8qIFRPRE86IHNpbXBsZSB0b2dnbGVzIG1heSBiZSBzdG9yZWQgYXMgT1BUX3h4eCBiaXRzIGluc3RlYWQgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBvcHRfZmxhZ3NbXSA9IHsKKwlTVFlMRV9DT0xVTU5BUiwJCSAgICAgLyogQyAqLworCURJU1BfSElEREVOIHwgRElTUF9ET1QsICAgICAgLyogYSAqLworCURJU1BfTk9MSVNULCAgICAgICAgICAgICAgICAgLyogZCAqLworCUxJU1RfSU5PLCAgICAgICAgICAgICAgICAgICAgLyogaSAqLworCUxJU1RfTE9ORyB8IFNUWUxFX0xPTkcsICAgICAgLyogbCAqLworCVNUWUxFX1NJTkdMRSwgICAgICAgICAgICAgICAgLyogMSAqLworCUxJU1RfTE9ORyB8IFNUWUxFX0xPTkcsICAgICAgLyogZyAoZG9uJ3Qgc2hvdyBvd25lcikgLSBoYW5kbGVkIHZpYSBPUFRfZy4gYXNzdW1lcyBsICovCisJTElTVF9JRF9OVU1FUklDIHwgTElTVF9MT05HIHwgU1RZTEVfTE9ORywgLyogbiAoYXNzdW1lcyBsKSAqLworCUxJU1RfQkxPQ0tTLCAgICAgICAgICAgICAgICAgLyogcyAqLworCURJU1BfUk9XUyB8IFNUWUxFX0NPTFVNTkFSLCAgLyogeCAqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUSAocXVvdGUgZmlsZW5hbWUpIC0gaGFuZGxlZCB2aWEgT1BUX1EgKi8KKwlESVNQX0hJRERFTiwgICAgICAgICAgICAgICAgIC8qIEEgKi8KKwlFTkFCTEVfU0VMSU5VWCAqIChMSVNUX0NPTlRFWFR8U1RZTEVfU0lOR0xFKSwgLyogayAoaWdub3JlZCBpZiAhU0VMSU5VWCkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTCisJVElNRV9DSEFOR0UgfCAoRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTICogU09SVF9DVElNRSksIC8qIGMgKi8KKwlMSVNUX0ZVTExUSU1FLCAgICAgICAgICAgICAgIC8qIGUgKi8KKwlFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMgKiBTT1JUX01USU1FLCAvKiB0ICovCisJVElNRV9BQ0NFU1MgfCAoRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTICogU09SVF9BVElNRSksIC8qIHUgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUworCVNPUlRfU0laRSwgICAgICAgICAgICAgICAgICAgLyogUyAqLworCVNPUlRfRVhULCAgICAgICAgICAgICAgICAgICAgLyogWCAqLworCVNPUlRfUkVWRVJTRSwgICAgICAgICAgICAgICAgLyogciAqLworCVNPUlRfVkVSU0lPTiwgICAgICAgICAgICAgICAgLyogdiAqLworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTCisJTElTVF9GSUxFVFlQRSB8IExJU1RfQ0xBU1NJRlksIC8qIEYgKi8KKwlMSVNUX0ZJTEVUWVBFLCAgICAgICAgICAgICAgIC8qIHAgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRQorCURJU1BfUkVDVVJTSVZFLCAgICAgICAgICAgICAgLyogUiAqLworI2VuZGlmCisjaWYgRU5BQkxFX1NFTElOVVgKKwlMSVNUX01PREVCSVRTfExJU1RfTkxJTktTfExJU1RfQ09OVEVYVHxMSVNUX1NJWkV8TElTVF9EQVRFX1RJTUV8U1RZTEVfU0lOR0xFLCAvKiBLICovCisJTElTVF9NT0RFQklUU3xMSVNUX0lEX05BTUV8TElTVF9DT05URVhUfFNUWUxFX1NJTkdMRSwgLyogWiAqLworI2VuZGlmCisJKDFVIDw8IDMxKQorCS8qIG9wdGlvbnMgYWZ0ZXIgWiBhcmUgbm90IHByb2Nlc3NlZCB0aHJvdWdoIG9wdF9mbGFncyAqLworfTsKKworCisvKgorICogYSBkaXJlY3RvcnkgZW50cnkgYW5kIGl0cyBzdGF0IGluZm8KKyAqLworc3RydWN0IGRub2RlIHsKKwljb25zdCBjaGFyICpuYW1lOyAgICAgICAvKiB1c3VhbGx5IGJhc2VuYW1lLCBidXQgdGhpbmsgImxzIC1sIGRpci9maWxlIiAqLworCWNvbnN0IGNoYXIgKmZ1bGxuYW1lOyAgIC8qIGZ1bGwgbmFtZSAodXNhYmxlIGZvciBzdGF0IGV0YykgKi8KKwlzdHJ1Y3QgZG5vZGUgKmRuX25leHQ7ICAvKiBmb3IgbGlua2VkIGxpc3QgKi8KKwlJRl9TRUxJTlVYKHNlY3VyaXR5X2NvbnRleHRfdCBzaWQ7KQorCXNtYWxsaW50IGZuYW1lX2FsbG9jYXRlZDsKKworCS8qIFVzZWQgdG8gYXZvaWQgcmUtZG9pbmcgW2xdc3RhdCBhdCBwcmludG91dCBzdGFnZQorCSAqIGlmIHdlIGFscmVhZHkgY29sbGVjdGVkIG5lZWRlZCBkYXRhIGluIHNjYW4gc3RhZ2U6CisJICovCisJbW9kZV90ICAgIGRuX21vZGVfbHN0YXQ7ICAgLyogb2J0YWluZWQgd2l0aCBsc3RhdCwgb3IgMCAqLworCW1vZGVfdCAgICBkbl9tb2RlX3N0YXQ7ICAgIC8qIG9idGFpbmVkIHdpdGggc3RhdCwgb3IgMCAqLworCisvLwlzdHJ1Y3Qgc3RhdCBkc3RhdDsKKy8vIHN0cnVjdCBzdGF0IGlzIGh1Z2UuIFdlIGRvbid0IG5lZWQgaXQgaW4gZnVsbC4KKy8vIEF0IGxlYXN0IHdlIGRvbid0IG5lZWQgc3RfZGV2IGFuZCBzdF9ibGtzaXplLAorLy8gYnV0IHRoZXJlIGFyZSBpbnZpc2libGUgZmllbGRzIGFzIHdlbGwKKy8vIChzdWNoIGFzIG5hbm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lc3BhbXBzKQorLy8gYW5kIHBhZGRpbmcsIHdoaWNoIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBzdG9yZS4KKy8vIFdlIGFsc28gY2FuIHByZS1wYXJzZSBkZXZfdCBkbl9yZGV2IChpbiBnbGliYywgaXQncyBodWdlKS4KKy8vIE9uIDMyLWJpdCB1Y2xpYmM6IGRub2RlIHNpemUgd2VudCBmcm9tIDExMiB0byA4NCBieXRlcy4KKy8vCisJLyogU2FtZSBuYW1lcyBhcyBpbiBzdHJ1Y3Qgc3RhdCwgYnV0IHdpdGggZG5fIGluc3RlYWQgb2Ygc3RfIHBmeDogKi8KKwltb2RlX3QgICAgZG5fbW9kZTsgLyogb2J0YWluZWQgd2l0aCBsc3RhdCBPUiBzdGF0LCBkZXBlbmRpbmcgb24gLUwgZXRjICovCisJb2ZmX3QgICAgIGRuX3NpemU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyB8fCBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMKKwl0aW1lX3QgICAgZG5fYXRpbWU7CisJdGltZV90ICAgIGRuX210aW1lOworCXRpbWVfdCAgICBkbl9jdGltZTsKKyNlbmRpZgorCWlub190ICAgICBkbl9pbm87CisJYmxrY250X3QgIGRuX2Jsb2NrczsKKwlubGlua190ICAgZG5fbmxpbms7CisJdWlkX3QgICAgIGRuX3VpZDsKKwlnaWRfdCAgICAgZG5fZ2lkOworCWludCAgICAgICBkbl9yZGV2X21hajsKKwlpbnQgICAgICAgZG5fcmRldl9taW47CisvLwlkZXZfdCAgICAgZG5fZGV2OworLy8JYmxrc2l6ZV90IGRuX2Jsa3NpemU7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwlzbWFsbGludCBzaG93X2NvbG9yOworIyBkZWZpbmUgR19zaG93X2NvbG9yIChHLnNob3dfY29sb3IpCisjZWxzZQorIyBkZWZpbmUgR19zaG93X2NvbG9yIDAKKyNlbmRpZgorCXNtYWxsaW50IGV4aXRfY29kZTsKKwl1bnNpZ25lZCBhbGxfZm10OworI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorCXVuc2lnbmVkIHRlcm1pbmFsX3dpZHRoOworIyBkZWZpbmUgR190ZXJtaW5hbF93aWR0aCAoRy50ZXJtaW5hbF93aWR0aCkKKyNlbHNlCisjIGRlZmluZSBHX3Rlcm1pbmFsX3dpZHRoIFRFUk1JTkFMX1dJRFRICisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTCisJLyogRG8gdGltZSgpIGp1c3Qgb25jZS4gU2F2ZXMgb25lIHN5c2NhbGwgcGVyIGZpbGUgZm9yICJscyAtbCIgKi8KKwl0aW1lX3QgY3VycmVudF90aW1lX3Q7CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCS8qIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVjYXVzZSBvZiBOT0VYRUMgKi8gXAorCW1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgXAorCUlGX0ZFQVRVUkVfQVVUT1dJRFRIKEdfdGVybWluYWxfd2lkdGggPSBURVJNSU5BTF9XSURUSDspIFwKKwlJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFModGltZSgmRy5jdXJyZW50X3RpbWVfdCk7KSBcCit9IHdoaWxlICgwKQorCisKKy8qKiogT3V0cHV0IGNvZGUgKioqLworCisKKy8qIEZZSSB0eXBlIHZhbHVlczogMTpmaWZvIDI6Y2hhciA0OmRpciA2OmJsayA4OmZpbGUgMTA6bGluayAxMjpzb2NrZXQKKyAqICh2YXJpb3VzIHdhY2t5IE9TZXM6IDEzOlN1biBkb29yIDE0OkJTRCB3aGl0ZW91dCA1OlhFTklYIG5hbWVkIGZpbGUKKyAqICAzLzc6bXVsdGlwbGV4ZWQgY2hhci9ibG9jayBkZXZpY2UpCisgKiBhbmQgd2UgdXNlIDAgZm9yIHVua25vd24gYW5kIDE1IGZvciBleGVjdXRhYmxlcyAoc2VlIGJlbG93KSAqLworI2RlZmluZSBUWVBFSU5ERVgobW9kZSkgKCgobW9kZSkgPj4gMTIpICYgMHgwZikKKy8qICAgICAgICAgICAgICAgICAgICAgICB1biAgZmkgY2hyIC0gICBkaXIgLSAgYmxrICAtICBmaWxlIC0gIGxpbmsgLSBzb2NrIC0gICAtIGV4ZSAqLworI2RlZmluZSBBUFBDSEFSKG1vZGUpICAgKCJcMCIifCIiXDAiIlwwIiIvIiJcMCIiXDAiIlwwIiJcMCIiXDAiIkAiIlwwIiI9IiJcMCIiXDAiIlwwIiBbVFlQRUlOREVYKG1vZGUpXSkKKy8qIDAzNiBibGFjayBmb3JlZ3JvdW5kICAgICAgICAgICAgICAwNTAgYmxhY2sgYmFja2dyb3VuZAorICAgMDM3IHJlZCBmb3JlZ3JvdW5kICAgICAgICAgICAgICAgIDA1MSByZWQgYmFja2dyb3VuZAorICAgMDQwIGdyZWVuIGZvcmVncm91bmQgICAgICAgICAgICAgIDA1MiBncmVlbiBiYWNrZ3JvdW5kCisgICAwNDEgYnJvd24gZm9yZWdyb3VuZCAgICAgICAgICAgICAgMDUzIGJyb3duIGJhY2tncm91bmQKKyAgIDA0MiBibHVlIGZvcmVncm91bmQgICAgICAgICAgICAgICAwNTQgYmx1ZSBiYWNrZ3JvdW5kCisgICAwNDMgbWFnZW50YSAocHVycGxlKSBmb3JlZ3JvdW5kICAgMDU1IG1hZ2VudGEgYmFja2dyb3VuZAorICAgMDQ0IGN5YW4gKGxpZ2h0IGJsdWUpIGZvcmVncm91bmQgIDA1NiBjeWFuIGJhY2tncm91bmQKKyAgIDA0NSBncmF5IGZvcmVncm91bmQgICAgICAgICAgICAgICAwNTcgd2hpdGUgYmFja2dyb3VuZAorKi8KKyNkZWZpbmUgQ09MT1IobW9kZSkgKCBcCisJLyp1biAgZmkgIGNociAgLSAgZGlyICAtICBibGsgIC0gIGZpbGUgLSAgbGluayAtICBzb2NrIC0gICAtICBleGUgKi8gXAorCSJcMDM3XDA0M1wwNDNcMDQ1XDA0MlwwNDVcMDQzXDA0M1wwMDBcMDQ1XDA0NFwwNDVcMDQzXDA0NVwwNDVcMDQwIiBcCisJW1RZUEVJTkRFWChtb2RlKV0pCisvKiBTZWxlY3Qgbm9ybWFsICgwKSBbYWN0dWFsbHkgInJlc2V0IGFsbCJdIG9yIGJvbGQgKDEpCisgKiAob3RoZXIgYXR0cmlidXRlcyBhcmUgMjpkaW0gNDp1bmRlcmxpbmUgNTpibGluayA3OnJldmVyc2UsCisgKiAgbGV0J3MgdXNlIDcgZm9yICJpbXBvc3NpYmxlIiB0eXBlcywganVzdCBmb3IgZnVuKQorICogTm90ZTogY29yZXV0aWxzIDYuOSB1c2VzIGludmVydGVkIHJlZCBmb3Igc2V0dWlkIGJpbmFyaWVzLgorICovCisjZGVmaW5lIEFUVFIobW9kZSkgKCBcCisJLyp1biBmaSBjaHIgLSBkaXIgLSBibGsgLSBmaWxlLSBsaW5rLSBzb2NrLSAtICBleGUgKi8gXAorCSJcMDFcMDBcMDFcMDdcMDFcMDdcMDFcMDdcMDBcMDdcMDFcMDdcMDFcMDdcMDdcMDEiIFwKKwlbVFlQRUlOREVYKG1vZGUpXSkKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisvKiBtb2RlIG9mIHplcm8gaXMgaW50ZXJwcmV0ZWQgYXMgInVua25vd24iIChzdGF0IGZhaWxlZCkgKi8KK3N0YXRpYyBjaGFyIGZnY29sb3IobW9kZV90IG1vZGUpCit7CisJaWYgKFNfSVNSRUcobW9kZSkgJiYgKG1vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkpCisJCXJldHVybiBDT0xPUigweEYwMDApOwkvKiBGaWxlIGlzIGV4ZWN1dGFibGUgLi4uICovCisJcmV0dXJuIENPTE9SKG1vZGUpOworfQorc3RhdGljIGNoYXIgYm9sZChtb2RlX3QgbW9kZSkKK3sKKwlpZiAoU19JU1JFRyhtb2RlKSAmJiAobW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKKwkJcmV0dXJuIEFUVFIoMHhGMDAwKTsJLyogRmlsZSBpcyBleGVjdXRhYmxlIC4uLiAqLworCXJldHVybiBBVFRSKG1vZGUpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMKK3N0YXRpYyBjaGFyIGFwcGVuZF9jaGFyKG1vZGVfdCBtb2RlKQoreworCWlmICghKEcuYWxsX2ZtdCAmIExJU1RfRklMRVRZUEUpKQorCQlyZXR1cm4gJ1wwJzsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuICcvJzsKKwlpZiAoIShHLmFsbF9mbXQgJiBMSVNUX0NMQVNTSUZZKSkKKwkJcmV0dXJuICdcMCc7CisJaWYgKFNfSVNSRUcobW9kZSkgJiYgKG1vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkpCisJCXJldHVybiAnKic7CisJcmV0dXJuIEFQUENIQVIobW9kZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNhbGNfbmFtZV9sZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsZW47CisJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKworCS8vIFRPRE86IHF1b3RlIHRhYiBhcyBcdCwgZXRjLCBpZiAtUQorCW5hbWUgPSBwcmludGFibGVfc3RyaW5nKCZ1bmlfc3RhdCwgbmFtZSk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1EpKSB7CisJCXJldHVybiB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCX0KKworCWxlbiA9IDIgKyB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCXdoaWxlICgqbmFtZSkgeworCQlpZiAoKm5hbWUgPT0gJyInIHx8ICpuYW1lID09ICdcXCcpIHsKKwkJCWxlbisrOworCQl9CisJCW5hbWUrKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZCBjb2x1bW5zLgorICogTm90ZSB0aGF0IG9ubHkgU1RZTEVfQ09MVU1OQVIgdXNlcyByZXR1cm4gdmFsdWUuCisgKiBTVFlMRV9TSU5HTEUgYW5kIFNUWUxFX0xPTkcgZG9uJ3QgY2FyZS4KKyAqIGNvcmV1dGlscyA3LjIgYWxzbyBzdXBwb3J0czoKKyAqIGxzIC1iICgtLWVzY2FwZSkgPSBvY3RhbCBlc2NhcGVzIChhbHRob3VnaCBpdCBkb2Vzbid0IGxvb2sgbGlrZSB3b3JraW5nKQorICogbHMgLU4gKC0tbGl0ZXJhbCkgPSBub3QgZXNjYXBlIGF0IGFsbAorICovCitzdGF0aWMgdW5zaWduZWQgcHJpbnRfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxlbjsKKwl1bmlfc3RhdF90IHVuaV9zdGF0OworCisJLy8gVE9ETzogcXVvdGUgdGFiIGFzIFx0LCBldGMsIGlmIC1RCisJbmFtZSA9IHByaW50YWJsZV9zdHJpbmcoJnVuaV9zdGF0LCBuYW1lKTsKKworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfUSkpIHsKKwkJZnB1dHMobmFtZSwgc3Rkb3V0KTsKKwkJcmV0dXJuIHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7CisJfQorCisJbGVuID0gMiArIHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7CisJcHV0Y2hhcignIicpOworCXdoaWxlICgqbmFtZSkgeworCQlpZiAoKm5hbWUgPT0gJyInIHx8ICpuYW1lID09ICdcXCcpIHsKKwkJCXB1dGNoYXIoJ1xcJyk7CisJCQlsZW4rKzsKKwkJfQorCQlwdXRjaGFyKCpuYW1lKTsKKwkJbmFtZSsrOworCX0KKwlwdXRjaGFyKCciJyk7CisJcmV0dXJuIGxlbjsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZCBjb2x1bW5zLgorICogTm90ZSB0aGF0IG9ubHkgU1RZTEVfQ09MVU1OQVIgdXNlcyByZXR1cm4gdmFsdWUsCisgKiBTVFlMRV9TSU5HTEUgYW5kIFNUWUxFX0xPTkcgZG9uJ3QgY2FyZS4KKyAqLworc3RhdGljIE5PSU5MSU5FIHVuc2lnbmVkIGRpc3BsYXlfc2luZ2xlKGNvbnN0IHN0cnVjdCBkbm9kZSAqZG4pCit7CisJdW5zaWduZWQgY29sdW1uID0gMDsKKwljaGFyICpscGF0aDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMgfHwgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNoYXIgYXBwZW5kOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMKKwlhcHBlbmQgPSBhcHBlbmRfY2hhcihkbi0+ZG5fbW9kZSk7CisjZW5kaWYKKworCS8qIERvIHJlYWRsaW5rIGVhcmx5LCBzbyB0aGF0IGlmIGl0IGZhaWxzLCBlcnJvciBtZXNzYWdlCisJICogZG9lcyBub3QgYXBwZWFyICppbnNpZGUqIHRoZSAibHMgLWwiIGxpbmUgKi8KKwlscGF0aCA9IE5VTEw7CisJaWYgKEcuYWxsX2ZtdCAmIExJU1RfU1lNTElOSykKKwkJaWYgKFNfSVNMTksoZG4tPmRuX21vZGUpKQorCQkJbHBhdGggPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZG4tPmZ1bGxuYW1lKTsKKworCWlmIChHLmFsbF9mbXQgJiBMSVNUX0lOTykKKwkJY29sdW1uICs9IHByaW50ZigiJTdsbHUgIiwgKGxvbmcgbG9uZykgZG4tPmRuX2lubyk7CisvL1RPRE86IC1oIHNob3VsZCBhZmZlY3QgLXMgdG9vOgorCWlmIChHLmFsbF9mbXQgJiBMSVNUX0JMT0NLUykKKwkJY29sdW1uICs9IHByaW50ZigiJTYiT0ZGX0ZNVCJ1ICIsIChvZmZfdCkgKGRuLT5kbl9ibG9ja3MgPj4gMSkpOworCWlmIChHLmFsbF9mbXQgJiBMSVNUX01PREVCSVRTKQorCQljb2x1bW4gKz0gcHJpbnRmKCIlLTEwcyAiLCAoY2hhciAqKSBiYl9tb2RlX3N0cmluZyhkbi0+ZG5fbW9kZSkpOworCWlmIChHLmFsbF9mbXQgJiBMSVNUX05MSU5LUykKKwkJY29sdW1uICs9IHByaW50ZigiJTRsdSAiLCAobG9uZykgZG4tPmRuX25saW5rKTsKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9JRF9OVU1FUklDKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2cpCisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLTh1ICIsIChpbnQpIGRuLT5kbl9naWQpOworCQllbHNlCisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLTh1ICUtOHUgIiwKKwkJCQkJKGludCkgZG4tPmRuX3VpZCwKKwkJCQkJKGludCkgZG4tPmRuX2dpZCk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1VTRVJOQU1FCisJZWxzZSBpZiAoRy5hbGxfZm10ICYgTElTVF9JRF9OQU1FKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2cpIHsKKwkJCWNvbHVtbiArPSBwcmludGYoIiUtOC44cyAiLAorCQkJCWdldF9jYWNoZWRfZ3JvdXBuYW1lKGRuLT5kbl9naWQpKTsKKwkJfSBlbHNlIHsKKwkJCWNvbHVtbiArPSBwcmludGYoIiUtOC44cyAlLTguOHMgIiwKKwkJCQlnZXRfY2FjaGVkX3VzZXJuYW1lKGRuLT5kbl91aWQpLAorCQkJCWdldF9jYWNoZWRfZ3JvdXBuYW1lKGRuLT5kbl9naWQpKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChHLmFsbF9mbXQgJiBMSVNUX1NJWkUpIHsKKwkJaWYgKFNfSVNCTEsoZG4tPmRuX21vZGUpIHx8IFNfSVNDSFIoZG4tPmRuX21vZGUpKSB7CisJCQljb2x1bW4gKz0gcHJpbnRmKCIlNHUsICUzdSAiLAorCQkJCQlkbi0+ZG5fcmRldl9tYWosCisJCQkJCWRuLT5kbl9yZGV2X21pbik7CisJCX0gZWxzZSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9oKSB7CisJCQkJY29sdW1uICs9IHByaW50ZigiJSJIVU1BTl9SRUFEQUJMRV9NQVhfV0lEVEhfU1RSInMgIiwKKwkJCQkJLyogcHJpbnQgc2l6ZSwgc2hvdyBvbmUgZnJhY3Rpb25hbCwgdXNlIHN1ZmZpeGVzICovCisJCQkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKGRuLT5kbl9zaXplLCAxLCAwKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCWNvbHVtbiArPSBwcmludGYoIiU5Ik9GRl9GTVQidSAiLCBkbi0+ZG5fc2l6ZSk7CisJCQl9CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworCWlmIChHLmFsbF9mbXQgJiAoTElTVF9GVUxMVElNRXxMSVNUX0RBVEVfVElNRSkpIHsKKwkJY2hhciAqZmlsZXRpbWU7CisJCXRpbWVfdCB0dGltZSA9IGRuLT5kbl9tdGltZTsKKwkJaWYgKEcuYWxsX2ZtdCAmIFRJTUVfQUNDRVNTKQorCQkJdHRpbWUgPSBkbi0+ZG5fYXRpbWU7CisJCWlmIChHLmFsbF9mbXQgJiBUSU1FX0NIQU5HRSkKKwkJCXR0aW1lID0gZG4tPmRuX2N0aW1lOworCQlmaWxldGltZSA9IGN0aW1lKCZ0dGltZSk7CisJCS8qIGZpbGV0aW1lJ3MgZm9ybWF0OiAiV2VkIEp1biAzMCAyMTo0OTowOCAxOTkzXG4iICovCisJCWlmIChHLmFsbF9mbXQgJiBMSVNUX0ZVTExUSU1FKSB7IC8qIC1lICovCisJCQkvKiBOb3RlOiBjb3JldXRpbHMgOC40IGxzIC0tZnVsbC10aW1lIHByaW50czoKKwkJCSAqIDIwMDktMDctMTMgMTc6NDk6MjcuMDAwMDAwMDAwICswMjAwCisJCQkgKi8KKwkJCWNvbHVtbiArPSBwcmludGYoIiUuMjRzICIsIGZpbGV0aW1lKTsKKwkJfSBlbHNlIHsgLyogTElTVF9EQVRFX1RJTUUgKi8KKwkJCS8qIEcuY3VycmVudF90aW1lX3Qgfj09IHRpbWUoTlVMTCkgKi8KKwkJCXRpbWVfdCBhZ2UgPSBHLmN1cnJlbnRfdGltZV90IC0gdHRpbWU7CisJCQlwcmludGYoIiUuNnMgIiwgZmlsZXRpbWUgKyA0KTsgLyogIkp1biAzMCIgKi8KKwkJCWlmIChhZ2UgPCAzNjAwTCAqIDI0ICogMzY1IC8gMiAmJiBhZ2UgPiAtMTUgKiA2MCkgeworCQkJCS8qIGhoOm1tIGlmIGxlc3MgdGhhbiA2IG1vbnRocyBvbGQgKi8KKwkJCQlwcmludGYoIiUuNXMgIiwgZmlsZXRpbWUgKyAxMSk7CisJCQl9IGVsc2UgeyAvKiB5ZWFyLiBidWdneSBpZiB5ZWFyID4gOTk5OSA7KSAqLworCQkJCXByaW50ZigiICUuNHMgIiwgZmlsZXRpbWUgKyAyMCk7CisJCQl9CisJCQljb2x1bW4gKz0gMTM7CisJCX0KKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChHLmFsbF9mbXQgJiBMSVNUX0NPTlRFWFQpIHsKKwkJY29sdW1uICs9IHByaW50ZigiJS0zMnMgIiwgZG4tPnNpZCA/IGRuLT5zaWQgOiAidW5rbm93biIpOworCQlmcmVlY29uKGRuLT5zaWQpOworCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwlpZiAoR19zaG93X2NvbG9yKSB7CisJCW1vZGVfdCBtb2RlID0gZG4tPmRuX21vZGVfbHN0YXQ7CisJCWlmICghbW9kZSkKKwkJCWlmIChsc3RhdChkbi0+ZnVsbG5hbWUsICZzdGF0YnVmKSA9PSAwKQorCQkJCW1vZGUgPSBzdGF0YnVmLnN0X21vZGU7CisJCXByaW50ZigiXDAzM1sldTsldW0iLCBib2xkKG1vZGUpLCBmZ2NvbG9yKG1vZGUpKTsKKwl9CisjZW5kaWYKKwljb2x1bW4gKz0gcHJpbnRfbmFtZShkbi0+bmFtZSk7CisJaWYgKEdfc2hvd19jb2xvcikgeworCQlwcmludGYoIlwwMzNbMG0iKTsKKwl9CisKKwlpZiAobHBhdGgpIHsKKwkJcHJpbnRmKCIgLT4gIik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTIHx8IEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJCWlmICgoRy5hbGxfZm10ICYgTElTVF9GSUxFVFlQRSkgfHwgR19zaG93X2NvbG9yKSB7CisJCQltb2RlX3QgbW9kZSA9IGRuLT5kbl9tb2RlX3N0YXQ7CisJCQlpZiAoIW1vZGUpCisJCQkJaWYgKHN0YXQoZG4tPmZ1bGxuYW1lLCAmc3RhdGJ1ZikgPT0gMCkKKwkJCQkJbW9kZSA9IHN0YXRidWYuc3RfbW9kZTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTCisJCQlhcHBlbmQgPSBhcHBlbmRfY2hhcihtb2RlKTsKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwkJCWlmIChHX3Nob3dfY29sb3IpIHsKKwkJCQlwcmludGYoIlwwMzNbJXU7JXVtIiwgYm9sZChtb2RlKSwgZmdjb2xvcihtb2RlKSk7CisJCQl9CisjIGVuZGlmCisJCX0KKyNlbmRpZgorCQljb2x1bW4gKz0gcHJpbnRfbmFtZShscGF0aCkgKyA0OworCQlmcmVlKGxwYXRoKTsKKwkJaWYgKEdfc2hvd19jb2xvcikgeworCQkJcHJpbnRmKCJcMDMzWzBtIik7CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTCisJaWYgKEcuYWxsX2ZtdCAmIExJU1RfRklMRVRZUEUpIHsKKwkJaWYgKGFwcGVuZCkgeworCQkJcHV0Y2hhcihhcHBlbmQpOworCQkJY29sdW1uKys7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiBjb2x1bW47Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfZmlsZXMoc3RydWN0IGRub2RlICoqZG4sIHVuc2lnbmVkIG5maWxlcykKK3sKKwl1bnNpZ25lZCBpLCBuY29scywgbnJvd3MsIHJvdywgbmM7CisJdW5zaWduZWQgY29sdW1uOworCXVuc2lnbmVkIG5leHR0YWI7CisJdW5zaWduZWQgY29sdW1uX3dpZHRoID0gMDsgLyogdXNlZCBvbmx5IGJ5IFNUWUxFX0NPTFVNTkFSICovCisKKwlpZiAoRy5hbGxfZm10ICYgU1RZTEVfTE9ORykgeyAvKiBTVFlMRV9MT05HIG9yIFNUWUxFX1NJTkdMRSAqLworCQluY29scyA9IDE7CisJfSBlbHNlIHsKKwkJLyogZmluZCB0aGUgbG9uZ2VzdCBmaWxlIG5hbWUsIHVzZSB0aGF0IGFzIHRoZSBjb2x1bW4gd2lkdGggKi8KKwkJZm9yIChpID0gMDsgZG5baV07IGkrKykgeworCQkJaW50IGxlbiA9IGNhbGNfbmFtZV9sZW4oZG5baV0tPm5hbWUpOworCQkJaWYgKGNvbHVtbl93aWR0aCA8IGxlbikKKwkJCQljb2x1bW5fd2lkdGggPSBsZW47CisJCX0KKwkJY29sdW1uX3dpZHRoICs9IDEgKworCQkJSUZfU0VMSU5VWCggKChHLmFsbF9mbXQgJiBMSVNUX0NPTlRFWFQpID8gMzMgOiAwKSArICkKKwkJCQkoKEcuYWxsX2ZtdCAmIExJU1RfSU5PKSA/IDggOiAwKSArCisJCQkJKChHLmFsbF9mbXQgJiBMSVNUX0JMT0NLUykgPyA1IDogMCk7CisJCW5jb2xzID0gKHVuc2lnbmVkKUdfdGVybWluYWxfd2lkdGggLyBjb2x1bW5fd2lkdGg7CisJfQorCisJaWYgKG5jb2xzID4gMSkgeworCQlucm93cyA9IG5maWxlcyAvIG5jb2xzOworCQlpZiAobnJvd3MgKiBuY29scyA8IG5maWxlcykKKwkJCW5yb3dzKys7ICAgICAgICAgICAgICAgIC8qIHJvdW5kIHVwIGZyYWN0aW9uYWxzICovCisJfSBlbHNlIHsKKwkJbnJvd3MgPSBuZmlsZXM7CisJCW5jb2xzID0gMTsKKwl9CisKKwljb2x1bW4gPSAwOworCW5leHR0YWIgPSAwOworCWZvciAocm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdysrKSB7CisJCWZvciAobmMgPSAwOyBuYyA8IG5jb2xzOyBuYysrKSB7CisJCQkvKiByZWFjaCBpbnRvIHRoZSBhcnJheSBiYXNlZCBvbiB0aGUgY29sdW1uIGFuZCByb3cgKi8KKwkJCWlmIChHLmFsbF9mbXQgJiBESVNQX1JPV1MpCisJCQkJaSA9IChyb3cgKiBuY29scykgKyBuYzsJLyogZGlzcGxheSBhY3Jvc3Mgcm93ICovCisJCQllbHNlCisJCQkJaSA9IChuYyAqIG5yb3dzKSArIHJvdzsJLyogZGlzcGxheSBieSBjb2x1bW4gKi8KKwkJCWlmIChpIDwgbmZpbGVzKSB7CisJCQkJaWYgKGNvbHVtbiA+IDApIHsKKwkJCQkJbmV4dHRhYiAtPSBjb2x1bW47CisJCQkJCXByaW50ZigiJSpzICIsIG5leHR0YWIsICIiKTsKKwkJCQkJY29sdW1uICs9IG5leHR0YWIgKyAxOworCQkJCX0KKwkJCQluZXh0dGFiID0gY29sdW1uICsgY29sdW1uX3dpZHRoOworCQkJCWNvbHVtbiArPSBkaXNwbGF5X3NpbmdsZShkbltpXSk7CisJCQl9CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwkJY29sdW1uID0gMDsKKwl9Cit9CisKKworLyoqKiBEaXIgc2Nhbm5pbmcgY29kZSAqKiovCisKK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKm15X3N0YXQoY29uc3QgY2hhciAqZnVsbG5hbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmb3JjZV9mb2xsb3cpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlzdHJ1Y3QgZG5vZGUgKmN1cjsKKworCWN1ciA9IHh6YWxsb2Moc2l6ZW9mKCpjdXIpKTsKKwljdXItPmZ1bGxuYW1lID0gZnVsbG5hbWU7CisJY3VyLT5uYW1lID0gbmFtZTsKKworCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9MKSB8fCBmb3JjZV9mb2xsb3cpIHsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAoaXNfc2VsaW51eF9lbmFibGVkKCkpICB7CisJCQkgZ2V0ZmlsZWNvbihmdWxsbmFtZSwgJmN1ci0+c2lkKTsKKwkJfQorI2VuZGlmCisJCWlmIChzdGF0KGZ1bGxuYW1lLCAmc3RhdGJ1ZikpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZ1bGxuYW1lKTsKKwkJCUcuZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFOworCQkJZnJlZShjdXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY3VyLT5kbl9tb2RlX3N0YXQgPSBzdGF0YnVmLnN0X21vZGU7CisJfSBlbHNlIHsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAoaXNfc2VsaW51eF9lbmFibGVkKCkpIHsKKwkJCWxnZXRmaWxlY29uKGZ1bGxuYW1lLCAmY3VyLT5zaWQpOworCQl9CisjZW5kaWYKKwkJaWYgKGxzdGF0KGZ1bGxuYW1lLCAmc3RhdGJ1ZikpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZ1bGxuYW1lKTsKKwkJCUcuZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFOworCQkJZnJlZShjdXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY3VyLT5kbl9tb2RlX2xzdGF0ID0gc3RhdGJ1Zi5zdF9tb2RlOworCX0KKworCS8qIGN1ci0+ZHN0YXQgPSBzdGF0YnVmOiAqLworCWN1ci0+ZG5fbW9kZSAgID0gc3RhdGJ1Zi5zdF9tb2RlICA7CisJY3VyLT5kbl9zaXplICAgPSBzdGF0YnVmLnN0X3NpemUgIDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTIHx8IEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUworCWN1ci0+ZG5fYXRpbWUgID0gc3RhdGJ1Zi5zdF9hdGltZSA7CisJY3VyLT5kbl9tdGltZSAgPSBzdGF0YnVmLnN0X210aW1lIDsKKwljdXItPmRuX2N0aW1lICA9IHN0YXRidWYuc3RfY3RpbWUgOworI2VuZGlmCisJY3VyLT5kbl9pbm8gICAgPSBzdGF0YnVmLnN0X2lubyAgIDsKKwljdXItPmRuX2Jsb2NrcyA9IHN0YXRidWYuc3RfYmxvY2tzOworCWN1ci0+ZG5fbmxpbmsgID0gc3RhdGJ1Zi5zdF9ubGluayA7CisJY3VyLT5kbl91aWQgICAgPSBzdGF0YnVmLnN0X3VpZCAgIDsKKwljdXItPmRuX2dpZCAgICA9IHN0YXRidWYuc3RfZ2lkICAgOworCWN1ci0+ZG5fcmRldl9tYWogPSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpOworCWN1ci0+ZG5fcmRldl9taW4gPSBtaW5vcihzdGF0YnVmLnN0X3JkZXYpOworCisJcmV0dXJuIGN1cjsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvdW50X2RpcnMoc3RydWN0IGRub2RlICoqZG4sIGludCB3aGljaCkKK3sKKwl1bnNpZ25lZCBkaXJzLCBhbGw7CisKKwlpZiAoIWRuKQorCQlyZXR1cm4gMDsKKworCWRpcnMgPSBhbGwgPSAwOworCWZvciAoOyAqZG47IGRuKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlhbGwrKzsKKwkJaWYgKCFTX0lTRElSKCgqZG4pLT5kbl9tb2RlKSkKKwkJCWNvbnRpbnVlOworCisJCW5hbWUgPSAoKmRuKS0+bmFtZTsKKwkJaWYgKHdoaWNoICE9IFNQTElUX1NVQkRJUiAvKiBpZiBub3QgcmVxdWVzdGVkIHRvIHNraXAgLiAvIC4uICovCisJCSAvKiBvciBpZiBpdCdzIG5vdCAuIG9yIC4uICovCisJCSB8fCBuYW1lWzBdICE9ICcuJworCQkgfHwgKG5hbWVbMV0gJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVbMl0pKQorCQkpIHsKKwkJCWRpcnMrKzsKKwkJfQorCX0KKwlyZXR1cm4gd2hpY2ggIT0gU1BMSVRfRklMRSA/IGRpcnMgOiBhbGwgLSBkaXJzOworfQorCisvKiBnZXQgbWVtb3J5IHRvIGhvbGQgYW4gYXJyYXkgb2YgcG9pbnRlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKipkbmFsbG9jKHVuc2lnbmVkIG51bSkKK3sKKwlpZiAobnVtIDwgMSkKKwkJcmV0dXJuIE5VTEw7CisKKwludW0rKzsgLyogc28gdGhhdCB3ZSBoYXZlIHRlcm1pbmF0aW5nIE5VTEwgKi8KKwlyZXR1cm4geHphbGxvYyhudW0gKiBzaXplb2Yoc3RydWN0IGRub2RlICopKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRQorc3RhdGljIHZvaWQgZGZyZWUoc3RydWN0IGRub2RlICoqZG5wKQoreworCXVuc2lnbmVkIGk7CisKKwlpZiAoZG5wID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGRucFtpXTsgaSsrKSB7CisJCXN0cnVjdCBkbm9kZSAqY3VyID0gZG5wW2ldOworCQlpZiAoY3VyLT5mbmFtZV9hbGxvY2F0ZWQpCisJCQlmcmVlKChjaGFyKiljdXItPmZ1bGxuYW1lKTsKKwkJZnJlZShjdXIpOworCX0KKwlmcmVlKGRucCk7Cit9CisjZWxzZQorI2RlZmluZSBkZnJlZSguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8qIFJldHVybnMgTlVMTC10ZXJtaW5hdGVkIG1hbGxvY2VkIHZlY3RvciBvZiBwb2ludGVycyAob3IgTlVMTCkgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKipzcGxpdGRuYXJyYXkoc3RydWN0IGRub2RlICoqZG4sIGludCB3aGljaCkKK3sKKwl1bnNpZ25lZCBkbmNudCwgZDsKKwlzdHJ1Y3QgZG5vZGUgKipkbnA7CisKKwlpZiAoZG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb3VudCBob3cgbWFueSBkaXJzIG9yIGZpbGVzIHRoZXJlIGFyZSAqLworCWRuY250ID0gY291bnRfZGlycyhkbiwgd2hpY2gpOworCisJLyogYWxsb2NhdGUgYSBmaWxlIGFycmF5IGFuZCBhIGRpciBhcnJheSAqLworCWRucCA9IGRuYWxsb2MoZG5jbnQpOworCisJLyogY29weSB0aGUgZW50cnlzIGludG8gdGhlIGZpbGUgb3IgZGlyIGFycmF5ICovCisJZm9yIChkID0gMDsgKmRuOyBkbisrKSB7CisJCWlmIChTX0lTRElSKCgqZG4pLT5kbl9tb2RlKSkgeworCQkJY29uc3QgY2hhciAqbmFtZTsKKworCQkJaWYgKHdoaWNoID09IFNQTElUX0ZJTEUpCisJCQkJY29udGludWU7CisKKwkJCW5hbWUgPSAoKmRuKS0+bmFtZTsKKwkJCWlmICgod2hpY2ggJiBTUExJVF9ESVIpIC8qIGFueSBkaXIuLi4gKi8KKwkJCS8qIC4uLiBvciBub3QgLiBvciAuLiAqLworCQkJIHx8IG5hbWVbMF0gIT0gJy4nCisJCQkgfHwgKG5hbWVbMV0gJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVbMl0pKQorCQkJKSB7CisJCQkJZG5wW2QrK10gPSAqZG47CisJCQl9CisJCX0gZWxzZQorCQlpZiAod2hpY2ggPT0gU1BMSVRfRklMRSkgeworCQkJZG5wW2QrK10gPSAqZG47CisJCX0KKwl9CisJcmV0dXJuIGRucDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUworc3RhdGljIGludCBzb3J0Y21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJc3RydWN0IGRub2RlICpkMSA9ICooc3RydWN0IGRub2RlICoqKWE7CisJc3RydWN0IGRub2RlICpkMiA9ICooc3RydWN0IGRub2RlICoqKWI7CisJdW5zaWduZWQgc29ydF9vcHRzID0gRy5hbGxfZm10ICYgU09SVF9NQVNLOworCW9mZl90IGRpZjsKKworCWRpZiA9IDA7IC8qIGFzc3VtZSBTT1JUX05BTUUgKi8KKwkvLyBUT0RPOiB1c2UgcHJlLWluaXRpYWxpemVkIGZ1bmN0aW9uIHBvaW50ZXIKKwkvLyBpbnN0ZWFkIG9mIGJyYW5jaCBmb3Jlc3QKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfU0laRSkgeworCQlkaWYgPSAoZDItPmRuX3NpemUgLSBkMS0+ZG5fc2l6ZSk7CisJfSBlbHNlCisJaWYgKHNvcnRfb3B0cyA9PSBTT1JUX0FUSU1FKSB7CisJCWRpZiA9IChkMi0+ZG5fYXRpbWUgLSBkMS0+ZG5fYXRpbWUpOworCX0gZWxzZQorCWlmIChzb3J0X29wdHMgPT0gU09SVF9DVElNRSkgeworCQlkaWYgPSAoZDItPmRuX2N0aW1lIC0gZDEtPmRuX2N0aW1lKTsKKwl9IGVsc2UKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfTVRJTUUpIHsKKwkJZGlmID0gKGQyLT5kbl9tdGltZSAtIGQxLT5kbl9tdGltZSk7CisJfSBlbHNlCisJaWYgKHNvcnRfb3B0cyA9PSBTT1JUX0RJUikgeworCQlkaWYgPSBTX0lTRElSKGQyLT5kbl9tb2RlKSAtIFNfSVNESVIoZDEtPmRuX21vZGUpOworCX0gZWxzZQorI2lmIGRlZmluZWQoSEFWRV9TVFJWRVJTQ01QKSAmJiBIQVZFX1NUUlZFUlNDTVAgPT0gMQorCWlmIChzb3J0X29wdHMgPT0gU09SVF9WRVJTSU9OKSB7CisJCWRpZiA9IHN0cnZlcnNjbXAoZDEtPm5hbWUsIGQyLT5uYW1lKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChzb3J0X29wdHMgPT0gU09SVF9FWFQpIHsKKwkJZGlmID0gc3RyY21wKHN0cmNocm51bChkMS0+bmFtZSwgJy4nKSwgc3RyY2hybnVsKGQyLT5uYW1lLCAnLicpKTsKKwl9CisJaWYgKGRpZiA9PSAwKSB7CisJCS8qIHNvcnQgYnkgbmFtZSwgdXNlIGFzIHRpZSBicmVha2VyIGZvciBvdGhlciBzb3J0cyAqLworCQlpZiAoRU5BQkxFX0xPQ0FMRV9TVVBQT1JUKQorCQkJZGlmID0gc3RyY29sbChkMS0+bmFtZSwgZDItPm5hbWUpOworCQllbHNlCisJCQlkaWYgPSBzdHJjbXAoZDEtPm5hbWUsIGQyLT5uYW1lKTsKKwl9CisKKwkvKiBNYWtlIGRpZiBmaXQgaW50byBhbiBpbnQgKi8KKwlpZiAoc2l6ZW9mKGRpZikgPiBzaXplb2YoaW50KSkgeworCQllbnVtIHsgQklUU19UT19TSElGVCA9IDggKiAoc2l6ZW9mKGRpZikgLSBzaXplb2YoaW50KSkgfTsKKwkJLyogc2hpZnQgbGVhdmluZyBvbmx5ICJpbnQiIHdvcnRoIG9mIGJpdHMgKi8KKwkJaWYgKGRpZiAhPSAwKSB7CisJCQlkaWYgPSAxIHwgKGludCkoKHVvZmZfdClkaWYgPj4gQklUU19UT19TSElGVCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKEcuYWxsX2ZtdCAmIFNPUlRfUkVWRVJTRSkgPyAtKGludClkaWYgOiAoaW50KWRpZjsKK30KKworc3RhdGljIHZvaWQgZG5zb3J0KHN0cnVjdCBkbm9kZSAqKmRuLCBpbnQgc2l6ZSkKK3sKKwlxc29ydChkbiwgc2l6ZSwgc2l6ZW9mKCpkbiksIHNvcnRjbXApOworfQorCitzdGF0aWMgdm9pZCBzb3J0X2FuZF9kaXNwbGF5X2ZpbGVzKHN0cnVjdCBkbm9kZSAqKmRuLCB1bnNpZ25lZCBuZmlsZXMpCit7CisJZG5zb3J0KGRuLCBuZmlsZXMpOworCWRpc3BsYXlfZmlsZXMoZG4sIG5maWxlcyk7Cit9CisjZWxzZQorIyBkZWZpbmUgZG5zb3J0KGRuLCBzaXplKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHNvcnRfYW5kX2Rpc3BsYXlfZmlsZXMoZG4sIG5maWxlcykgZGlzcGxheV9maWxlcyhkbiwgbmZpbGVzKQorI2VuZGlmCisKKy8qIFJldHVybnMgTlVMTC10ZXJtaW5hdGVkIG1hbGxvY2VkIHZlY3RvciBvZiBwb2ludGVycyAob3IgTlVMTCkgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKipzY2FuX29uZV9kaXIoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgKm5maWxlc19wKQoreworCXN0cnVjdCBkbm9kZSAqZG4sICpjdXIsICoqZG5wOworCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCURJUiAqZGlyOworCXVuc2lnbmVkIGksIG5maWxlczsKKworCSpuZmlsZXNfcCA9IDA7CisJZGlyID0gd2Fybl9vcGVuZGlyKHBhdGgpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlHLmV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJcmV0dXJuIE5VTEw7CS8qIGNvdWxkIG5vdCBvcGVuIHRoZSBkaXIgKi8KKwl9CisJZG4gPSBOVUxMOworCW5maWxlcyA9IDA7CisJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyICpmdWxsbmFtZTsKKworCQkvKiBhcmUgd2UgZ29pbmcgdG8gbGlzdCB0aGUgZmlsZS0gaXQgbWF5IGJlIC4gb3IgLi4gb3IgYSBoaWRkZW4gZmlsZSAqLworCQlpZiAoZW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKwkJCWlmICgoIWVudHJ5LT5kX25hbWVbMV0gfHwgKGVudHJ5LT5kX25hbWVbMV0gPT0gJy4nICYmICFlbnRyeS0+ZF9uYW1lWzJdKSkKKwkJCSAmJiAhKEcuYWxsX2ZtdCAmIERJU1BfRE9UKQorCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIShHLmFsbF9mbXQgJiBESVNQX0hJRERFTikpCisJCQkJY29udGludWU7CisJCX0KKwkJZnVsbG5hbWUgPSBjb25jYXRfcGF0aF9maWxlKHBhdGgsIGVudHJ5LT5kX25hbWUpOworCQljdXIgPSBteV9zdGF0KGZ1bGxuYW1lLCBiYl9iYXNlbmFtZShmdWxsbmFtZSksIDApOworCQlpZiAoIWN1cikgeworCQkJZnJlZShmdWxsbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQljdXItPmZuYW1lX2FsbG9jYXRlZCA9IDE7CisJCWN1ci0+ZG5fbmV4dCA9IGRuOworCQlkbiA9IGN1cjsKKwkJbmZpbGVzKys7CisJfQorCWNsb3NlZGlyKGRpcik7CisKKwlpZiAoZG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBub3cgdGhhdCB3ZSBrbm93IGhvdyBtYW55IGZpbGVzIHRoZXJlIGFyZQorCSAqIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkgdG8gaG9sZCBkbm9kZSBwb2ludGVycworCSAqLworCSpuZmlsZXNfcCA9IG5maWxlczsKKwlkbnAgPSBkbmFsbG9jKG5maWxlcyk7CisJZm9yIChpID0gMDsgLyogaSA8IG5maWxlcyAtIGRldGVjdGVkIHZpYSAhZG4gYmVsb3cgKi87IGkrKykgeworCQlkbnBbaV0gPSBkbjsJLyogc2F2ZSBwb2ludGVyIHRvIG5vZGUgaW4gYXJyYXkgKi8KKwkJZG4gPSBkbi0+ZG5fbmV4dDsKKwkJaWYgKCFkbikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBkbnA7Cit9CisKKyNpZiBFTkFCTEVfREVTS1RPUAorLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbHMuaHRtbAorICogSWYgYW55IG9mIHRoZSAtbCwgLW4sIC1zIG9wdGlvbnMgaXMgc3BlY2lmaWVkLCBlYWNoIGxpc3QKKyAqIG9mIGZpbGVzIHdpdGhpbiB0aGUgZGlyZWN0b3J5IHNoYWxsIGJlIHByZWNlZGVkIGJ5IGEKKyAqIHN0YXR1cyBsaW5lIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBmaWxlIHN5c3RlbSBibG9ja3MKKyAqIG9jY3VwaWVkIGJ5IGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgaW4gNTEyLWJ5dGUgdW5pdHMgaWYKKyAqIHRoZSAtayBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgb3IgMTAyNC1ieXRlIHVuaXRzIGlmIHRoZQorICogLWsgb3B0aW9uIGlzIHNwZWNpZmllZCwgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBpbnRlZ3JhbAorICogbnVtYmVyIG9mIHVuaXRzLgorICovCisvKiBieSBKb3JnZW4gT3ZlcmdhYXJkIChqb3JnZW4gQVQgYW50aXN0YXRlbi5zZSkgKi8KK3N0YXRpYyBvZmZfdCBjYWxjdWxhdGVfYmxvY2tzKHN0cnVjdCBkbm9kZSAqKmRuKQoreworCXVvZmZfdCBibG9ja3MgPSAxOworCWlmIChkbikgeworCQl3aGlsZSAoKmRuKSB7CisJCQkvKiBzdF9ibG9ja3MgaXMgaW4gNTEyIGJ5dGUgYmxvY2tzICovCisJCQlibG9ja3MgKz0gKCpkbiktPmRuX2Jsb2NrczsKKwkJCWRuKys7CisJCX0KKwl9CisKKwkvKiBFdmVuIHRob3VnaCBzdGFuZGFyZCBzYXlzIHVzZSA1MTIgYnl0ZSBibG9ja3MsIGNvcmV1dGlscyB1c2UgMWsgKi8KKwkvKiBBY3R1YWxseSwgd2Ugcm91bmQgdXAgYnkgY2FsY3VsYXRpbmcgKGJsb2NrcyArIDEpIC8gMiwKKwkgKiAiKyAxIiB3YXMgZG9uZSB3aGVuIHdlIGluaXRpYWxpemVkIGJsb2NrcyB0byAxICovCisJcmV0dXJuIGJsb2NrcyA+PiAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNjYW5fYW5kX2Rpc3BsYXlfZGlyc19yZWN1cihzdHJ1Y3QgZG5vZGUgKipkbiwgaW50IGZpcnN0KQoreworCXVuc2lnbmVkIG5maWxlczsKKwlzdHJ1Y3QgZG5vZGUgKipzdWJkbnA7CisKKwlmb3IgKDsgKmRuOyBkbisrKSB7CisJCWlmIChHLmFsbF9mbXQgJiAoRElTUF9ESVJOQU1FIHwgRElTUF9SRUNVUlNJVkUpKSB7CisJCQlpZiAoIWZpcnN0KQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlmaXJzdCA9IDA7CisJCQlwcmludGYoIiVzOlxuIiwgKCpkbiktPmZ1bGxuYW1lKTsKKwkJfQorCQlzdWJkbnAgPSBzY2FuX29uZV9kaXIoKCpkbiktPmZ1bGxuYW1lLCAmbmZpbGVzKTsKKyNpZiBFTkFCTEVfREVTS1RPUAorCQlpZiAoKEcuYWxsX2ZtdCAmIFNUWUxFX01BU0spID09IFNUWUxFX0xPTkcpCisJCQlwcmludGYoInRvdGFsICUiT0ZGX0ZNVCJ1XG4iLCBjYWxjdWxhdGVfYmxvY2tzKHN1YmRucCkpOworI2VuZGlmCisJCWlmIChuZmlsZXMgPiAwKSB7CisJCQkvKiBsaXN0IGFsbCBmaWxlcyBhdCB0aGlzIGxldmVsICovCisJCQlzb3J0X2FuZF9kaXNwbGF5X2ZpbGVzKHN1YmRucCwgbmZpbGVzKTsKKworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRQorCQkJICYmIChHLmFsbF9mbXQgJiBESVNQX1JFQ1VSU0lWRSkKKwkJCSkgeworCQkJCXN0cnVjdCBkbm9kZSAqKmRuZDsKKwkJCQl1bnNpZ25lZCBkbmRpcnM7CisJCQkJLyogcmVjdXJzaXZlIC0gbGlzdCB0aGUgc3ViLWRpcnMgKi8KKwkJCQlkbmQgPSBzcGxpdGRuYXJyYXkoc3ViZG5wLCBTUExJVF9TVUJESVIpOworCQkJCWRuZGlycyA9IGNvdW50X2RpcnMoc3ViZG5wLCBTUExJVF9TVUJESVIpOworCQkJCWlmIChkbmRpcnMgPiAwKSB7CisJCQkJCWRuc29ydChkbmQsIGRuZGlycyk7CisJCQkJCXNjYW5fYW5kX2Rpc3BsYXlfZGlyc19yZWN1cihkbmQsIDApOworCQkJCQkvKiBmcmVlIHRoZSBhcnJheSBvZiBkbm9kZSBwb2ludGVycyB0byB0aGUgZGlycyAqLworCQkJCQlmcmVlKGRuZCk7CisJCQkJfQorCQkJfQorCQkJLyogZnJlZSB0aGUgZG5vZGVzIGFuZCB0aGUgZnVsbG5hbWUgbWVtICovCisJCQlkZnJlZShzdWJkbnApOworCQl9CisJfQorfQorCisKK2ludCBsc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGRub2RlICoqZG5kOworCXN0cnVjdCBkbm9kZSAqKmRuZjsKKwlzdHJ1Y3QgZG5vZGUgKipkbnA7CisJc3RydWN0IGRub2RlICpkbjsKKwlzdHJ1Y3QgZG5vZGUgKmN1cjsKKwl1bnNpZ25lZCBvcHQ7CisJdW5zaWduZWQgbmZpbGVzOworCXVuc2lnbmVkIGRuZmlsZXM7CisJdW5zaWduZWQgZG5kaXJzOworCXVuc2lnbmVkIGk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwkvKiBjb2xvcmVkIExTIHN1cHBvcnQgYnkgSmFXaSwgamFud2lsbGVtLmphbnNzZW5AbHh0cmVtZS5ubCAqLworCS8qIGNvcmV1dGlscyA2LjEwOgorCSAqICMgbHMgLS1jb2xvcj1CT0dVUworCSAqIGxzOiBpbnZhbGlkIGFyZ3VtZW50ICdCT0dVUycgZm9yICctLWNvbG9yJworCSAqIFZhbGlkIGFyZ3VtZW50cyBhcmU6CisJICogJ2Fsd2F5cycsICd5ZXMnLCAnZm9yY2UnCisJICogJ25ldmVyJywgJ25vJywgJ25vbmUnCisJICogJ2F1dG8nLCAndHR5JywgJ2lmLXR0eScKKwkgKiAoYW5kIHN1YnN0cmluZ3M6ICItLWNvbG9yPWFsd2EiIHdvcmsgdG9vKQorCSAqLworCXN0YXRpYyBjb25zdCBjaGFyIGxzX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImNvbG9yXDAiIE9wdGlvbmFsX2FyZ3VtZW50ICJceGZmIjsgLyogbm8gc2hvcnQgZXF1aXZhbGVudCAqLworCXN0YXRpYyBjb25zdCBjaGFyIGNvbG9yX3N0cltdIEFMSUdOMSA9CisJCSJhbHdheXNcMCIieWVzXDAiImZvcmNlXDAiCisJCSJhdXRvXDAiInR0eVwwIiJpZi10dHlcMCI7CisJLyogbmVlZCB0byBpbml0aWFsaXplIHNpbmNlIC0tY29sb3IgaGFzIF9hbiBvcHRpb25hbF8gYXJndW1lbnQgKi8KKwljb25zdCBjaGFyICpjb2xvcl9vcHQgPSBjb2xvcl9zdHI7IC8qICJhbHdheXMiICovCisjZW5kaWYKKworCUlOSVRfRygpOworCisJaW5pdF91bmljb2RlKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTKQorCQlHLmFsbF9mbXQgPSBTT1JUX05BTUU7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKKwkvKiBvYnRhaW4gdGhlIHRlcm1pbmFsIHdpZHRoICovCisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERJTl9GSUxFTk8sICZHX3Rlcm1pbmFsX3dpZHRoLCBOVUxMKTsKKwkvKiBnbyBvbmUgbGVzcy4uLiAqLworCUdfdGVybWluYWxfd2lkdGgtLTsKKyNlbmRpZgorCisJLyogcHJvY2VzcyBvcHRpb25zICovCisJSUZfRkVBVFVSRV9MU19DT0xPUihhcHBsZXRfbG9uZ19vcHRpb25zID0gbHNfbG9uZ29wdHM7KQorCW9wdF9jb21wbGVtZW50YXJ5ID0KKwkJLyogLWUgaW1wbGllcyAtbCAqLworCQlJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoImVsIikKKwkJLyogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2xzLmh0bWw6CisJCSAqIGluIHNvbWUgcGFpcnMgb2Ygb3B0cywgb25seSBsYXN0IG9uZSB0YWtlcyBlZmZlY3Q6CisJCSAqLworCQlJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoSUZfRkVBVFVSRV9MU19TT1JURklMRVMoIjp0LVM6Uy10IikpIC8qIHRpbWUvc2l6ZSAqLworCQkvLyAiOm0tbDpsLW0iIC0gd2UgZG9uJ3QgaGF2ZSAtbQorCQlJRl9GRUFUVVJFX0xTX0ZPTExPV0xJTktTKCI6SC1MOkwtSCIpCisJCSI6Qy14bDp4LUNsOmwteEMiIC8qIGJ5Y29scy9ieWxpbmVzL2xvbmcgKi8KKwkJIjpDLTE6MS1DIiAvKiBieWNvbHMvb25lbGluZSAqLworCQkiOngtMToxLXgiIC8qIGJ5bGluZXMvb25lbGluZSAobm90IGluIFN1UywgYnV0IGluIEdOVSBjb3JldXRpbHMgOC40KSAqLworCQlJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoIjpjLXU6dS1jIikgLyogbXRpbWUvYXRpbWUgKi8KKwkJLyogLXcgTlVNOiAqLworCQlJRl9GRUFUVVJFX0FVVE9XSURUSCgiOncrIik7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgbHNfb3B0aW9ucworCQlJRl9GRUFUVVJFX0FVVE9XSURUSCgsIE5VTEwsICZHX3Rlcm1pbmFsX3dpZHRoKQorCQlJRl9GRUFUVVJFX0xTX0NPTE9SKCwgJmNvbG9yX29wdCkKKwkpOworCWZvciAoaSA9IDA7IG9wdF9mbGFnc1tpXSAhPSAoMVUgPDwgMzEpOyBpKyspIHsKKwkJaWYgKG9wdCAmICgxIDw8IGkpKSB7CisJCQl1aW50MzJfdCBmbGFncyA9IG9wdF9mbGFnc1tpXTsKKworCQkJaWYgKGZsYWdzICYgU1RZTEVfTUFTSykKKwkJCQlHLmFsbF9mbXQgJj0gflNUWUxFX01BU0s7CisJCQlpZiAoZmxhZ3MgJiBTT1JUX01BU0spCisJCQkJRy5hbGxfZm10ICY9IH5TT1JUX01BU0s7CisJCQlpZiAoZmxhZ3MgJiBUSU1FX01BU0spCisJCQkJRy5hbGxfZm10ICY9IH5USU1FX01BU0s7CisKKwkJCUcuYWxsX2ZtdCB8PSBmbGFnczsKKwkJfQorCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJLyogc2V0IEdfc2hvd19jb2xvciA9IDEvMCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUICYmIGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQljaGFyICpwID0gZ2V0ZW52KCJMU19DT0xPUlMiKTsKKwkJLyogTFNfQ09MT1JTIGlzIHVuc2V0LCBvciAobm90IGVtcHR5ICYmIG5vdCAibm9uZSIpID8gKi8KKwkJaWYgKCFwIHx8IChwWzBdICYmIHN0cmNtcChwLCAibm9uZSIpICE9IDApKQorCQkJR19zaG93X2NvbG9yID0gMTsKKwl9CisJaWYgKG9wdCAmIE9QVF9jb2xvcikgeworCQlpZiAoY29sb3Jfb3B0WzBdID09ICduJykKKwkJCUdfc2hvd19jb2xvciA9IDA7CisJCWVsc2Ugc3dpdGNoIChpbmRleF9pbl9zdWJzdHJpbmdzKGNvbG9yX3N0ciwgY29sb3Jfb3B0KSkgeworCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQkJaWYgKGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJCUdfc2hvd19jb2xvciA9IDE7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8qIHNvcnQgb3V0IHdoaWNoIGNvbW1hbmQgbGluZSBvcHRpb25zIHRha2UgcHJlY2VkZW5jZSAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9MU19SRUNVUlNJVkUgJiYgKEcuYWxsX2ZtdCAmIERJU1BfTk9MSVNUKSkKKwkJRy5hbGxfZm10ICY9IH5ESVNQX1JFQ1VSU0lWRTsJLyogbm8gcmVjdXJzZSBpZiBsaXN0aW5nIG9ubHkgZGlyICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMgJiYgRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTKSB7CisJCWlmIChHLmFsbF9mbXQgJiBUSU1FX0NIQU5HRSkKKwkJCUcuYWxsX2ZtdCA9IChHLmFsbF9mbXQgJiB+U09SVF9NQVNLKSB8IFNPUlRfQ1RJTUU7CisJCWlmIChHLmFsbF9mbXQgJiBUSU1FX0FDQ0VTUykKKwkJCUcuYWxsX2ZtdCA9IChHLmFsbF9mbXQgJiB+U09SVF9NQVNLKSB8IFNPUlRfQVRJTUU7CisJfQorCWlmICgoRy5hbGxfZm10ICYgU1RZTEVfTUFTSykgIT0gU1RZTEVfTE9ORykgLyogbm90IC1sPyAqLworCQlHLmFsbF9mbXQgJj0gfihMSVNUX0lEX05VTUVSSUN8TElTVF9JRF9OQU1FfExJU1RfRlVMTFRJTUUpOworCisJLyogY2hvb3NlIGEgZGlzcGxheSBmb3JtYXQgaWYgb25lIHdhcyBub3QgYWxyZWFkeSBzcGVjaWZpZWQgYnkgYW4gb3B0aW9uICovCisJaWYgKCEoRy5hbGxfZm10ICYgU1RZTEVfTUFTSykpCisJCUcuYWxsX2ZtdCB8PSAoaXNhdHR5KFNURE9VVF9GSUxFTk8pID8gU1RZTEVfQ09MVU1OQVIgOiBTVFlMRV9TSU5HTEUpOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKQorCQkqLS1hcmd2ID0gKGNoYXIqKSIuIjsKKworCWlmIChhcmd2WzFdKQorCQlHLmFsbF9mbXQgfD0gRElTUF9ESVJOQU1FOyAvKiAyIG9yIG1vcmUgaXRlbXM/IGxhYmVsIGRpcmVjdG9yaWVzICovCisKKwkvKiBzdHVmZiB0aGUgY29tbWFuZCBsaW5lIGZpbGUgbmFtZXMgaW50byBhIGRub2RlIGFycmF5ICovCisJZG4gPSBOVUxMOworCW5maWxlcyA9IDA7CisJZG8geworCQljdXIgPSBteV9zdGF0KCphcmd2LCAqYXJndiwKKwkJCS8qIGZvbGxvdyBsaW5rcyBvbiBjb21tYW5kIGxpbmUgdW5sZXNzIC1sLCAtcyBvciAtRjogKi8KKwkJCSEoKEcuYWxsX2ZtdCAmIFNUWUxFX01BU0spID09IFNUWUxFX0xPTkcKKwkJCSAgfHwgKEcuYWxsX2ZtdCAmIExJU1RfQkxPQ0tTKQorCQkJICB8fCAob3B0aW9uX21hc2szMiAmIE9QVF9GKQorCQkJKQorCQkJLyogLi4uIG9yIGlmIC1IOiAqLworCQkJfHwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfSCkKKwkJCS8qIC4uLiBvciBpZiAtTCwgYnV0IG15X3N0YXQgYWx3YXlzIGZvbGxvd3MgbGlua3MgaWYgLUwgKi8KKwkJKTsKKwkJYXJndisrOworCQlpZiAoIWN1cikKKwkJCWNvbnRpbnVlOworCQkvKmN1ci0+Zm5hbWVfYWxsb2NhdGVkID0gMDsgLSBhbHJlYWR5IGlzICovCisJCWN1ci0+ZG5fbmV4dCA9IGRuOworCQlkbiA9IGN1cjsKKwkJbmZpbGVzKys7CisJfSB3aGlsZSAoKmFyZ3YpOworCisJLyogbmZpbGVzIF9tYXlfIGJlIDAgaGVyZSAtIHRyeSAibHMgZG9lc250X2V4aXN0IiAqLworCWlmIChuZmlsZXMgPT0gMCkKKwkJcmV0dXJuIEcuZXhpdF9jb2RlOworCisJLyogbm93IHRoYXQgd2Uga25vdyBob3cgbWFueSBmaWxlcyB0aGVyZSBhcmUKKwkgKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5IHRvIGhvbGQgZG5vZGUgcG9pbnRlcnMKKwkgKi8KKwlkbnAgPSBkbmFsbG9jKG5maWxlcyk7CisJZm9yIChpID0gMDsgLyogaSA8IG5maWxlcyAtIGRldGVjdGVkIHZpYSAhZG4gYmVsb3cgKi87IGkrKykgeworCQlkbnBbaV0gPSBkbjsJLyogc2F2ZSBwb2ludGVyIHRvIG5vZGUgaW4gYXJyYXkgKi8KKwkJZG4gPSBkbi0+ZG5fbmV4dDsKKwkJaWYgKCFkbikKKwkJCWJyZWFrOworCX0KKworCWlmIChHLmFsbF9mbXQgJiBESVNQX05PTElTVCkgeworCQlzb3J0X2FuZF9kaXNwbGF5X2ZpbGVzKGRucCwgbmZpbGVzKTsKKwl9IGVsc2UgeworCQlkbmQgPSBzcGxpdGRuYXJyYXkoZG5wLCBTUExJVF9ESVIpOworCQlkbmYgPSBzcGxpdGRuYXJyYXkoZG5wLCBTUExJVF9GSUxFKTsKKwkJZG5kaXJzID0gY291bnRfZGlycyhkbnAsIFNQTElUX0RJUik7CisJCWRuZmlsZXMgPSBuZmlsZXMgLSBkbmRpcnM7CisJCWlmIChkbmZpbGVzID4gMCkgeworCQkJc29ydF9hbmRfZGlzcGxheV9maWxlcyhkbmYsIGRuZmlsZXMpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWZyZWUoZG5mKTsKKwkJfQorCQlpZiAoZG5kaXJzID4gMCkgeworCQkJZG5zb3J0KGRuZCwgZG5kaXJzKTsKKwkJCXNjYW5fYW5kX2Rpc3BsYXlfZGlyc19yZWN1cihkbmQsIGRuZmlsZXMgPT0gMCk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShkbmQpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlkZnJlZShkbnApOworCXJldHVybiBHLmV4aXRfY29kZTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9tZDVfc2hhMV9zdW0uYyBiL2NvcmV1dGlscy9tZDVfc2hhMV9zdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I2ZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL21kNV9zaGExX3N1bS5jCkBAIC0wLDAgKzEsMjQxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEdsZW5uIEwuIE1jR3JhdGgKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBFcmlrIEFuZGVyc2VuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWQ1c3VtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCJbLWNbc3ddXSAiKSJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbWQ1c3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQiIElGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCIgb3IgY2hlY2siKSAiIE1ENSBjaGVja3N1bXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyggIlxuIgorLy91c2FnZTogICAgICJcbgktYwlDaGVjayBzdW1zIGFnYWluc3QgbGlzdCBpbiBGSUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRG9uJ3Qgb3V0cHV0IGFueXRoaW5nLCBzdGF0dXMgY29kZSBzaG93cyBzdWNjZXNzIgorLy91c2FnZTogICAgICJcbgktdwlXYXJuIGFib3V0IGltcHJvcGVybHkgZm9ybWF0dGVkIGNoZWNrc3VtIGxpbmVzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtZDVzdW1fZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbWQ1c3VtIDwgYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgIjZmZDExZTk4Yjk4YTU4ZjY0ZmYzMzk4ZDdiMzI0MDAzXG4iCisvL3VzYWdlOiAgICAgICAiJCBtZDVzdW0gYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgIjZmZDExZTk4Yjk4YTU4ZjY0ZmYzMzk4ZDdiMzI0MDAzICBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiJCBtZDVzdW0gLWMgLVxuIgorLy91c2FnZTogICAgICAgIjZmZDExZTk4Yjk4YTU4ZjY0ZmYzMzk4ZDdiMzI0MDAzICBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiYnVzeWJveDogT0tcbiIKKy8vdXNhZ2U6ICAgICAgICJeRFxuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzaGExc3VtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCJbLWNbc3ddXSAiKSJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2hhMXN1bV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IiBJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiIG9yIGNoZWNrIikgIiBTSEExIGNoZWNrc3VtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUNoZWNrIHN1bXMgYWdhaW5zdCBsaXN0IGluIEZJTEVzIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBvdXRwdXQgYW55dGhpbmcsIHN0YXR1cyBjb2RlIHNob3dzIHN1Y2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS13CVdhcm4gYWJvdXQgaW1wcm9wZXJseSBmb3JtYXR0ZWQgY2hlY2tzdW0gbGluZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNoYTI1NnN1bV90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiWy1jW3N3XV0gIikiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHNoYTI1NnN1bV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IiBJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSygiIG9yIGNoZWNrIikgIiBTSEEyNTYgY2hlY2tzdW1zIgorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ2hlY2sgc3VtcyBhZ2FpbnN0IGxpc3QgaW4gRklMRXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCURvbid0IG91dHB1dCBhbnl0aGluZywgc3RhdHVzIGNvZGUgc2hvd3Mgc3VjY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJV2FybiBhYm91dCBpbXByb3Blcmx5IGZvcm1hdHRlZCBjaGVja3N1bSBsaW5lcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2hhNTEyc3VtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCJbLWNbc3ddXSAiKSJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2hhNTEyc3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQiIElGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCIgb3IgY2hlY2siKSAiIFNIQTUxMiBjaGVja3N1bXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyggIlxuIgorLy91c2FnZTogICAgICJcbgktYwlDaGVjayBzdW1zIGFnYWluc3QgbGlzdCBpbiBGSUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRG9uJ3Qgb3V0cHV0IGFueXRoaW5nLCBzdGF0dXMgY29kZSBzaG93cyBzdWNjZXNzIgorLy91c2FnZTogICAgICJcbgktdwlXYXJuIGFib3V0IGltcHJvcGVybHkgZm9ybWF0dGVkIGNoZWNrc3VtIGxpbmVzIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworZW51bSB7CisJLyogNHRoIGxldHRlciBvZiBhcHBsZXRfbmFtZSBpcy4uLiAqLworCUhBU0hfTUQ1ID0gJ3MnLCAvKiAibWQ1PnM8dW0iICovCisJSEFTSF9TSEExID0gJzEnLAorCUhBU0hfU0hBMjU2ID0gJzInLAorCUhBU0hfU0hBNTEyID0gJzUnLAorfTsKKworI2RlZmluZSBGTEFHX1NJTEVOVCAgMQorI2RlZmluZSBGTEFHX0NIRUNLICAgMgorI2RlZmluZSBGTEFHX1dBUk4gICAgNAorCisvKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBlbHNld2hlcmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpoYXNoX2Jpbl90b19oZXgodW5zaWduZWQgY2hhciAqaGFzaF92YWx1ZSwKKwkJCQl1bnNpZ25lZCBoYXNoX2xlbmd0aCkKK3sKKwkvKiB4emFsbG9jIHplcm8tdGVybWluYXRlcyAqLworCWNoYXIgKmhleF92YWx1ZSA9IHh6YWxsb2MoKGhhc2hfbGVuZ3RoICogMikgKyAxKTsKKwliaW4yaGV4KGhleF92YWx1ZSwgKGNoYXIqKWhhc2hfdmFsdWUsIGhhc2hfbGVuZ3RoKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKiloZXhfdmFsdWU7Cit9CisKK3N0YXRpYyB1aW50OF90ICpoYXNoX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHNyY19mZCwgaGFzaF9sZW4sIGNvdW50OworCXVuaW9uIF9jdHhfIHsKKwkJc2hhNTEyX2N0eF90IHNoYTUxMjsKKwkJc2hhMjU2X2N0eF90IHNoYTI1NjsKKwkJc2hhMV9jdHhfdCBzaGExOworCQltZDVfY3R4X3QgbWQ1OworCX0gY29udGV4dDsKKwl1aW50OF90ICpoYXNoX3ZhbHVlOworCXZvaWQgRkFTVF9GVU5DICgqdXBkYXRlKSh2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisJdm9pZCBGQVNUX0ZVTkMgKCpmaW5hbCkodm9pZCosIHZvaWQqKTsKKwljaGFyIGhhc2hfYWxnbzsKKworCXNyY19mZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlbmFtZSk7CisJaWYgKHNyY19mZCA8IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaGFzaF9hbGdvID0gYXBwbGV0X25hbWVbM107CisKKwkvKiBmaWd1cmUgc3BlY2lmaWMgaGFzaCBhbGdvcml0aG1zICovCisJaWYgKEVOQUJMRV9NRDVTVU0gJiYgaGFzaF9hbGdvID09IEhBU0hfTUQ1KSB7CisJCW1kNV9iZWdpbigmY29udGV4dC5tZDUpOworCQl1cGRhdGUgPSAodm9pZCopbWQ1X2hhc2g7CisJCWZpbmFsID0gKHZvaWQqKW1kNV9lbmQ7CisJCWhhc2hfbGVuID0gMTY7CisJfSBlbHNlIGlmIChFTkFCTEVfU0hBMVNVTSAmJiBoYXNoX2FsZ28gPT0gSEFTSF9TSEExKSB7CisJCXNoYTFfYmVnaW4oJmNvbnRleHQuc2hhMSk7CisJCXVwZGF0ZSA9ICh2b2lkKilzaGExX2hhc2g7CisJCWZpbmFsID0gKHZvaWQqKXNoYTFfZW5kOworCQloYXNoX2xlbiA9IDIwOworCX0gZWxzZSBpZiAoRU5BQkxFX1NIQTI1NlNVTSAmJiBoYXNoX2FsZ28gPT0gSEFTSF9TSEEyNTYpIHsKKwkJc2hhMjU2X2JlZ2luKCZjb250ZXh0LnNoYTI1Nik7CisJCXVwZGF0ZSA9ICh2b2lkKilzaGEyNTZfaGFzaDsKKwkJZmluYWwgPSAodm9pZCopc2hhMjU2X2VuZDsKKwkJaGFzaF9sZW4gPSAzMjsKKwl9IGVsc2UgaWYgKEVOQUJMRV9TSEE1MTJTVU0gJiYgaGFzaF9hbGdvID09IEhBU0hfU0hBNTEyKSB7CisJCXNoYTUxMl9iZWdpbigmY29udGV4dC5zaGE1MTIpOworCQl1cGRhdGUgPSAodm9pZCopc2hhNTEyX2hhc2g7CisJCWZpbmFsID0gKHZvaWQqKXNoYTUxMl9lbmQ7CisJCWhhc2hfbGVuID0gNjQ7CisJfSBlbHNlIHsKKwkJeGZ1bmNfZGllKCk7IC8qIGNhbid0IHJlYWNoIHRoaXMgKi8KKwl9CisKKwl7CisJCVJFU0VSVkVfQ09ORklHX1VCVUZGRVIoaW5fYnVmLCA0MDk2KTsKKwkJd2hpbGUgKChjb3VudCA9IHNhZmVfcmVhZChzcmNfZmQsIGluX2J1ZiwgNDA5NikpID4gMCkgeworCQkJdXBkYXRlKCZjb250ZXh0LCBpbl9idWYsIGNvdW50KTsKKwkJfQorCQloYXNoX3ZhbHVlID0gTlVMTDsKKwkJaWYgKGNvdW50ID09IDApIHsKKwkJCWZpbmFsKCZjb250ZXh0LCBpbl9idWYpOworCQkJaGFzaF92YWx1ZSA9IGhhc2hfYmluX3RvX2hleChpbl9idWYsIGhhc2hfbGVuKTsKKwkJfQorCQlSRUxFQVNFX0NPTkZJR19CVUZGRVIoaW5fYnVmKTsKKwl9CisKKwlpZiAoc3JjX2ZkICE9IFNURElOX0ZJTEVOTykgeworCQljbG9zZShzcmNfZmQpOworCX0KKworCXJldHVybiBoYXNoX3ZhbHVlOworfQorCitpbnQgbWQ1X3NoYTFfc3VtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtZDVfc2hhMV9zdW1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCByZXR1cm5fdmFsdWUgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKSB7CisJCS8qIC1iICJiaW5hcnkiLCAtdCAidGV4dCIgYXJlIGlnbm9yZWQgKHNoYU5OTnN1bSBjb21wYXQpICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInNjd2J0Iik7CisJCWFyZ3YgKz0gb3B0aW5kOworCQkvL2FyZ2MgLT0gb3B0aW5kOworCX0gZWxzZSB7CisJCWFyZ3YgKz0gMTsKKwkJLy9hcmdjIC09IDE7CisJfQorCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyAmJiAhKGZsYWdzICYgRkxBR19DSEVDSykpIHsKKwkJaWYgKGZsYWdzICYgRkxBR19TSUxFTlQpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCItJWMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdpdGggLWMiLCAncycpOworCQl9CisJCWlmIChmbGFncyAmIEZMQUdfV0FSTikgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi0lYyBpcyBtZWFuaW5nZnVsIG9ubHkgd2l0aCAtYyIsICd3Jyk7CisJCX0KKwl9CisKKwlkbyB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sgJiYgKGZsYWdzICYgRkxBR19DSEVDSykpIHsKKwkJCUZJTEUgKnByZV9jb21wdXRlZF9zdHJlYW07CisJCQljaGFyICpsaW5lOworCQkJaW50IGNvdW50X3RvdGFsID0gMDsKKwkJCWludCBjb3VudF9mYWlsZWQgPSAwOworCisJCQlwcmVfY29tcHV0ZWRfc3RyZWFtID0geGZvcGVuX3N0ZGluKCphcmd2KTsKKworCQkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShwcmVfY29tcHV0ZWRfc3RyZWFtKSkgIT0gTlVMTCkgeworCQkJCXVpbnQ4X3QgKmhhc2hfdmFsdWU7CisJCQkJY2hhciAqZmlsZW5hbWVfcHRyOworCisJCQkJY291bnRfdG90YWwrKzsKKwkJCQlmaWxlbmFtZV9wdHIgPSBzdHJzdHIobGluZSwgIiAgIik7CisJCQkJLyogaGFuZGxlIGZvcm1hdCBmb3IgYmluYXJ5IGNoZWNrc3VtcyAqLworCQkJCWlmIChmaWxlbmFtZV9wdHIgPT0gTlVMTCkgeworCQkJCQlmaWxlbmFtZV9wdHIgPSBzdHJzdHIobGluZSwgIiAqIik7CisJCQkJfQorCQkJCWlmIChmaWxlbmFtZV9wdHIgPT0gTlVMTCkgeworCQkJCQlpZiAoZmxhZ3MgJiBGTEFHX1dBUk4pIHsKKwkJCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBmb3JtYXQiKTsKKwkJCQkJfQorCQkJCQljb3VudF9mYWlsZWQrKzsKKwkJCQkJcmV0dXJuX3ZhbHVlID0gRVhJVF9GQUlMVVJFOworCQkJCQlmcmVlKGxpbmUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJKmZpbGVuYW1lX3B0ciA9ICdcMCc7CisJCQkJZmlsZW5hbWVfcHRyICs9IDI7CisKKwkJCQloYXNoX3ZhbHVlID0gaGFzaF9maWxlKGZpbGVuYW1lX3B0cik7CisKKwkJCQlpZiAoaGFzaF92YWx1ZSAmJiAoc3RyY21wKChjaGFyKiloYXNoX3ZhbHVlLCBsaW5lKSA9PSAwKSkgeworCQkJCQlpZiAoIShmbGFncyAmIEZMQUdfU0lMRU5UKSkKKwkJCQkJCXByaW50ZigiJXM6IE9LXG4iLCBmaWxlbmFtZV9wdHIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghKGZsYWdzICYgRkxBR19TSUxFTlQpKQorCQkJCQkJcHJpbnRmKCIlczogRkFJTEVEXG4iLCBmaWxlbmFtZV9wdHIpOworCQkJCQljb3VudF9mYWlsZWQrKzsKKwkJCQkJcmV0dXJuX3ZhbHVlID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQkvKiBwb3NzaWJsZSBmcmVlKE5VTEwpICovCisJCQkJZnJlZShoYXNoX3ZhbHVlKTsKKwkJCQlmcmVlKGxpbmUpOworCQkJfQorCQkJaWYgKGNvdW50X2ZhaWxlZCAmJiAhKGZsYWdzICYgRkxBR19TSUxFTlQpKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJXQVJOSU5HOiAlZCBvZiAlZCBjb21wdXRlZCBjaGVja3N1bXMgZGlkIE5PVCBtYXRjaCIsCisJCQkJCQkJIGNvdW50X2ZhaWxlZCwgY291bnRfdG90YWwpOworCQkJfQorCQkJZmNsb3NlX2lmX25vdF9zdGRpbihwcmVfY29tcHV0ZWRfc3RyZWFtKTsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ4X3QgKmhhc2hfdmFsdWUgPSBoYXNoX2ZpbGUoKmFyZ3YpOworCQkJaWYgKGhhc2hfdmFsdWUgPT0gTlVMTCkgeworCQkJCXJldHVybl92YWx1ZSA9IEVYSVRfRkFJTFVSRTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCIlcyAgJXNcbiIsIGhhc2hfdmFsdWUsICphcmd2KTsKKwkJCQlmcmVlKGhhc2hfdmFsdWUpOworCQkJfQorCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gcmV0dXJuX3ZhbHVlOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL21rZGlyLmMgYi9jb3JldXRpbHMvbWtkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQyOWIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL21rZGlyLmMKQEAgLTAsMCArMSw5NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBta2RpciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL21rZGlyLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBGaXhlZCBicm9rZW4gcGVybWlzc2lvbiBzZXR0aW5nIHdoZW4gLXAgd2FzIHVzZWQ7IGVzcGVjaWFsbHkgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggLW0uCisgKi8KKworLyogTm92IDI4LCAyMDA2ICAgICAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvcmdlLmpwPjogQWRkIFNFTGludXggU3VwcG9ydC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtkaXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBESVJFQ1RPUlkuLi4iCisvL3VzYWdlOiNkZWZpbmUgbWtkaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgRElSRUNUT1JZXG4iCisvL3VzYWdlOiAgICAgIlxuCS1tIE1PREUJTW9kZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJTm8gZXJyb3IgaWYgZXhpc3RzOyBtYWtlIHBhcmVudCBkaXJlY3RvcmllcyBhcyBuZWVkZWQiCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTZXQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbWtkaXJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbWtkaXIgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1rZGlyIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiL3RtcC9mb286IEZpbGUgZXhpc3RzXG4iCisvL3VzYWdlOiAgICAgICAiJCBta2RpciAvdG1wL2Zvby9iYXIvYmF6XG4iCisvL3VzYWdlOiAgICAgICAiL3RtcC9mb28vYmFyL2JhejogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVxuIgorLy91c2FnZTogICAgICAgIiQgbWtkaXIgLXAgL3RtcC9mb28vYmFyL2JhelxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgbWtkaXJfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJtb2RlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJtIgorCSJwYXJlbnRzXDAiIE5vX2FyZ3VtZW50ICAgICAgICJwIgorI2lmIEVOQUJMRV9TRUxJTlVYCisJImNvbnRleHRcMCIgUmVxdWlyZWRfYXJndW1lbnQgIloiCisjZW5kaWYKKwk7CisjZW5kaWYKKworaW50IG1rZGlyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta2Rpcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGUgPSAobW9kZV90KSgtMSk7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgZmxhZ3MgPSAwOworCXVuc2lnbmVkIG9wdDsKKwljaGFyICpzbW9kZTsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dDsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IG1rZGlyX2xvbmdvcHRzOworI2VuZGlmCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIm06cCIgSUZfU0VMSU5VWCgiWjoiKSwgJnNtb2RlIElGX1NFTElOVVgoLCZzY29udGV4dCkpOworCWlmIChvcHQgJiAxKSB7CisJCW1vZGUgPSAwNzc3OworCQlpZiAoIWJiX3BhcnNlX21vZGUoc21vZGUsICZtb2RlKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgbW9kZSAnJXMnIiwgc21vZGUpOworCQl9CisJfQorCWlmIChvcHQgJiAyKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfUkVDVVI7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAob3B0ICYgNCkgeworCQlzZWxpbnV4X29yX2RpZSgpOworCQlzZXRmc2NyZWF0ZWNvbl9vcl9kaWUoc2NvbnRleHQpOworCX0KKyNlbmRpZgorCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlkbyB7CisJCWlmIChiYl9tYWtlX2RpcmVjdG9yeSgqYXJndiwgbW9kZSwgZmxhZ3MpKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbWtmaWZvLmMgYi9jb3JldXRpbHMvbWtmaWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1ODMyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9ta2ZpZm8uYwpAQCAtMCwwICsxLDQ4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2ZpZm8gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ta2ZpZm8uaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtmaWZvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW0gTU9ERV0gIiBJRl9TRUxJTlVYKCJbLVpdICIpICJOQU1FIgorLy91c2FnZTojZGVmaW5lIG1rZmlmb19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBuYW1lZCBwaXBlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1tIE1PREUJTW9kZSAoZGVmYXVsdCBhPXJ3KSIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1aCVNldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJjb3JldXRpbHMvY29yZXV0aWxzLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBta2ZpZm9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZmlmb19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGU7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworCW1vZGUgPSBnZXRvcHRfbWtfZmlmb19ub2QoYXJndik7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlkbyB7CisJCWlmIChta2ZpZm8oKmFyZ3YsIG1vZGUpIDwgMCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOyAgLyogQXZvaWQgbXVsdGlieXRlIHByb2JsZW1zLiAqLworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL21rbm9kLmMgYi9jb3JldXRpbHMvbWtub2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQzNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL21rbm9kLmMKQEAgLTAsMCArMSw3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtub2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBNYXRjaGVzIEdOVSBiZWhhdmlvci4gKi8KKworLy91c2FnZTojZGVmaW5lIG1rbm9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW0gTU9ERV0gIiBJRl9TRUxJTlVYKCJbLVpdICIpICJOQU1FIFRZUEUgTUFKT1IgTUlOT1IiCisvL3VzYWdlOiNkZWZpbmUgbWtub2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgYSBzcGVjaWFsIGZpbGUgKGJsb2NrLCBjaGFyYWN0ZXIsIG9yIHBpcGUpXG4iCisvL3VzYWdlOiAgICAgIlxuCS1tIE1PREUJQ3JlYXRpb24gbW9kZSAoZGVmYXVsdCBhPXJ3KSIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1aCVNldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcblRZUEU6IgorLy91c2FnZTogICAgICJcbgliCUJsb2NrIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JYyBvciB1CUNoYXJhY3RlciBkZXZpY2UiCisvL3VzYWdlOiAgICAgIlxuCXAJTmFtZWQgcGlwZSAoTUFKT1IgYW5kIE1JTk9SIGFyZSBpZ25vcmVkKSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbWtub2RfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbWtub2QgL2Rldi9mZDAgYiAyIDBcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1rbm9kIC1tIDY0NCAvdG1wL3BpcGUgcFxuIgorCisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPiAgLy8gRm9yIG1ha2VkZXYKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliY29yZXV0aWxzL2NvcmV1dGlscy5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitzdGF0aWMgY29uc3QgY2hhciBtb2Rlc19jaGFyc1tdIEFMSUdOMSA9IHsgJ3AnLCAnYycsICd1JywgJ2InLCAwLCAxLCAxLCAyIH07CitzdGF0aWMgY29uc3QgbW9kZV90IG1vZGVzX2N1YnBbXSA9IHsgU19JRklGTywgU19JRkNIUiwgU19JRkJMSyB9OworCitpbnQgbWtub2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rbm9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCW1vZGVfdCBtb2RlOworCWRldl90IGRldjsKKwljb25zdCBjaGFyICpuYW1lOworCisJbW9kZSA9IGdldG9wdF9ta19maWZvX25vZChhcmd2KTsKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKworCWlmIChhcmdjID49IDIpIHsKKwkJbmFtZSA9IHN0cmNocihtb2Rlc19jaGFycywgYXJndlsxXVswXSk7CisJCWlmIChuYW1lICE9IE5VTEwpIHsKKwkJCW1vZGUgfD0gbW9kZXNfY3VicFsoaW50KShuYW1lWzRdKV07CisKKwkJCWRldiA9IDA7CisJCQlpZiAoKm5hbWUgIT0gJ3AnKSB7CisJCQkJYXJnYyAtPSAyOworCQkJCWlmIChhcmdjID09IDIpIHsKKwkJCQkJLyogQXV0b2RldGVjdCB3aGF0IHRoZSBzeXN0ZW0gc3VwcG9ydHM7IHRoZXNlIG1hY3JvcyBzaG91bGQKKwkJCQkJICogb3B0aW1pemUgb3V0IHRvIHR3byBjb25zdGFudHMuICovCisJCQkJCWRldiA9IG1ha2VkZXYoeGF0b3VsX3JhbmdlKGFyZ3ZbMl0sIDAsIG1ham9yKFVJTlRfTUFYKSksCisJCQkJCSAgICAgICAgICAgICAgeGF0b3VsX3JhbmdlKGFyZ3ZbM10sIDAsIG1pbm9yKFVJTlRfTUFYKSkpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGFyZ2MgPT0gMikgeworCQkJCW5hbWUgPSAqYXJndjsKKwkJCQlpZiAobWtub2QobmFtZSwgbW9kZSwgZGV2KSA9PSAwKSB7CisJCQkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCQkJfQorCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUobmFtZSk7CisJCQl9CisJCX0KKwl9CisJYmJfc2hvd191c2FnZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL212LmMgYi9jb3JldXRpbHMvbXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y0Y2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL212LmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbXYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqIFNFTGludXggc3VwcG9ydCBieSBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU2l6ZSByZWR1Y3Rpb24gYW5kIGltcHJvdmVkIGVycm9yIGNoZWNraW5nLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYmNvcmV1dGlscy9jb3JldXRpbHMuaCIKKworLy91c2FnZTojZGVmaW5lIG12X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWZpbl0gU09VUkNFIERFU1RcbiIKKy8vdXNhZ2U6ICAgICAgICJvcjogbXYgWy1maW5dIFNPVVJDRS4uLiBESVJFQ1RPUlkiCisvL3VzYWdlOiNkZWZpbmUgbXZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZW5hbWUgU09VUkNFIHRvIERFU1QsIG9yIG1vdmUgU09VUkNFKHMpIHRvIERJUkVDVE9SWVxuIgorLy91c2FnZTogICAgICJcbgktZglEb24ndCBwcm9tcHQgYmVmb3JlIG92ZXJ3cml0aW5nIgorLy91c2FnZTogICAgICJcbgktaQlJbnRlcmFjdGl2ZSwgcHJvbXB0IGJlZm9yZSBvdmVyd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtdl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBtdiAvdG1wL2ZvbyAvYmluL2JhclxuIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBtdl9sb25nb3B0c1tdIEFMSUdOMSA9CisJImludGVyYWN0aXZlXDAiIE5vX2FyZ3VtZW50ICJpIgorCSJmb3JjZVwwIiAgICAgICBOb19hcmd1bWVudCAiZiIKKwkibm8tY2xvYmJlclwwIiAgTm9fYXJndW1lbnQgIm4iCisJOworI2VuZGlmCisKKyNkZWZpbmUgT1BUX0ZJTEVVVElMU19GT1JDRSAgICAgICAxCisjZGVmaW5lIE9QVF9GSUxFVVRJTFNfSU5URVJBQ1RJVkUgMgorI2RlZmluZSBPUFRfRklMRVVUSUxTX05PQ0xPQkJFUiAgIDQKKworaW50IG12X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtdl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBkZXN0X3N0YXQ7CisJY29uc3QgY2hhciAqbGFzdDsKKwljb25zdCBjaGFyICpkZXN0OworCXVuc2lnbmVkIGZsYWdzOworCWludCBkZXN0X2V4aXN0czsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgY29weV9mbGFnID0gMDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX01WX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBtdl9sb25nb3B0czsKKyNlbmRpZgorCS8qIE5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cy4KKwkgKiBJZiBtb3JlIHRoYW4gb25lIG9mIC1mLCAtaSwgLW4gaXMgc3BlY2lmaWVkICwgb25seSB0aGUgZmluYWwgb25lCisJICogdGFrZXMgZWZmZWN0IChpdCB1bnNldHMgcHJldmlvdXMgb3B0aW9ucykuICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6Zi1pbjppLWZuOm4tZmkiOworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImZpbiIpOworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCWxhc3QgPSBhcmd2W2FyZ2MgLSAxXTsKKworCWlmIChhcmdjID09IDIpIHsKKwkJZGVzdF9leGlzdHMgPSBjcF9tdl9zdGF0KGxhc3QsICZkZXN0X3N0YXQpOworCQlpZiAoZGVzdF9leGlzdHMgPCAwKSB7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisKKwkJaWYgKCEoZGVzdF9leGlzdHMgJiAyKSkgeyAvKiBsYXN0IGlzIG5vdCBhIGRpcmVjdG9yeSAqLworCQkJZGVzdCA9IGxhc3Q7CisJCQlnb3RvIERPX01PVkU7CisJCX0KKwl9CisKKwlkbyB7CisJCWRlc3QgPSBjb25jYXRfcGF0aF9maWxlKGxhc3QsIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKCphcmd2KSk7CisJCWRlc3RfZXhpc3RzID0gY3BfbXZfc3RhdChkZXN0LCAmZGVzdF9zdGF0KTsKKwkJaWYgKGRlc3RfZXhpc3RzIDwgMCkgeworCQkJZ290byBSRVRfMTsKKwkJfQorCisgRE9fTU9WRToKKwkJaWYgKGRlc3RfZXhpc3RzKSB7CisJCQlpZiAoZmxhZ3MgJiBPUFRfRklMRVVUSUxTX05PQ0xPQkJFUikKKwkJCQlnb3RvIFJFVF8wOworCQkJaWYgKCEoZmxhZ3MgJiBPUFRfRklMRVVUSUxTX0ZPUkNFKQorCQkJICYmICgoYWNjZXNzKGRlc3QsIFdfT0spIDwgMCAmJiBpc2F0dHkoMCkpCisJCQkgICAgfHwgKGZsYWdzICYgT1BUX0ZJTEVVVElMU19JTlRFUkFDVElWRSkpCisJCQkpIHsKKwkJCQlpZiAoZnByaW50ZihzdGRlcnIsICJtdjogb3ZlcndyaXRlICclcyc/ICIsIGRlc3QpIDwgMCkgeworCQkJCQlnb3RvIFJFVF8xOyAgLyogT3VjaCEgZnByaW50ZiBmYWlsZWQhICovCisJCQkJfQorCQkJCWlmICghYmJfYXNrX2NvbmZpcm1hdGlvbigpKSB7CisJCQkJCWdvdG8gUkVUXzA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJlbmFtZSgqYXJndiwgZGVzdCkgPCAwKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdDsKKwkJCWludCBzb3VyY2VfZXhpc3RzOworCisJCQlpZiAoZXJybm8gIT0gRVhERVYKKwkJCSB8fCAoc291cmNlX2V4aXN0cyA9IGNwX212X3N0YXQyKCphcmd2LCAmc291cmNlX3N0YXQsIGxzdGF0KSkgPCAxCisJCQkpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZW5hbWUgJyVzJyIsICphcmd2KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gQUxJR04xID0KKwkJCQkJImNhbid0IG92ZXJ3cml0ZSAlc2RpcmVjdG9yeSB3aXRoICVzZGlyZWN0b3J5IjsKKworCQkJCWlmIChkZXN0X2V4aXN0cykgeworCQkJCQlpZiAoZGVzdF9leGlzdHMgPT0gMykgeworCQkJCQkJaWYgKHNvdXJjZV9leGlzdHMgIT0gMykgeworCQkJCQkJCWJiX2Vycm9yX21zZyhmbXQsICIiLCAibm9uLSIpOworCQkJCQkJCWdvdG8gUkVUXzE7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoc291cmNlX2V4aXN0cyA9PSAzKSB7CisJCQkJCQkJYmJfZXJyb3JfbXNnKGZtdCwgIm5vbi0iLCAiIik7CisJCQkJCQkJZ290byBSRVRfMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAodW5saW5rKGRlc3QpIDwgMCkgeworCQkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlICclcyciLCBkZXN0KTsKKwkJCQkJCWdvdG8gUkVUXzE7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogRklMRVVUSUxTX1JFQ1VSIGFsc28gcHJldmVudHMgbmFzdGllcyBsaWtlCisJCQkJICogInJlYWQgZnJvbSBkZXZpY2UgYW5kIHdyaXRlIGNvbnRlbnRzIHRvIGRzdCIKKwkJCQkgKiBpbnN0ZWFkIG9mICJjcmVhdGUgc2FtZSBkZXZpY2Ugbm9kZSIgKi8KKwkJCQljb3B5X2ZsYWcgPSBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTOworI2lmIEVOQUJMRV9TRUxJTlVYCisJCQkJY29weV9mbGFnIHw9IEZJTEVVVElMU19QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUOworI2VuZGlmCisJCQkJaWYgKChjb3B5X2ZpbGUoKmFyZ3YsIGRlc3QsIGNvcHlfZmxhZykgPj0gMCkKKwkJCQkgJiYgKHJlbW92ZV9maWxlKCphcmd2LCBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfRk9SQ0UpID49IDApCisJCQkJKSB7CisJCQkJCWdvdG8gUkVUXzA7CisJCQkJfQorCQkJfQorIFJFVF8xOgorCQkJc3RhdHVzID0gMTsKKwkJfQorIFJFVF8wOgorCQlpZiAoZGVzdCAhPSBsYXN0KSB7CisJCQlmcmVlKCh2b2lkICopIGRlc3QpOworCQl9CisJfSB3aGlsZSAoKisrYXJndiAhPSBsYXN0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbmljZS5jIGIvY29yZXV0aWxzL25pY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc1OTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL25pY2UuYwpAQCAtMCwwICsxLDU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBuaWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbmljZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1uIEFESlVTVF0gW1BST0cgQVJHU10iCisvL3VzYWdlOiNkZWZpbmUgbmljZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBzY2hlZHVsaW5nIHByaW9yaXR5LCBydW4gUFJPR1xuIgorLy91c2FnZTogICAgICJcbgktbiBBREpVU1QJQWRqdXN0IHByaW9yaXR5IGJ5IEFESlVTVCIKKworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBuaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvbGRfcHJpb3JpdHksIGFkanVzdG1lbnQ7CisKKwlvbGRfcHJpb3JpdHkgPSBnZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDApOworCisJaWYgKCEqKythcmd2KSB7IC8qIE5vIGFyZ3MsIHNvIChHTlUpIG91dHB1dCBjdXJyZW50IG5pY2UgdmFsdWUuICovCisJCXByaW50ZigiJWRcbiIsIG9sZF9wcmlvcml0eSk7CisJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwlhZGp1c3RtZW50ID0gMTA7ICAvKiBTZXQgZGVmYXVsdCBhZGp1c3RtZW50LiAqLworCisJaWYgKGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2WzBdWzFdID09ICduJykgeyAvKiAtbiAqLworCQkJaWYgKGFyZ3ZbMF1bMl0pIHsgLyogLW5OTk5OICh3L28gc3BhY2UpICovCisJCQkJYXJndlswXSArPSAyOyBhcmd2LS07IGFyZ2MrKzsKKwkJCX0KKwkJfSBlbHNlIHsgLyogLU5OTiAoTk5OIG1heSBiZSBuZWdhdGl2ZSkgPT0gLW4gTk5OICovCisJCQlhcmd2WzBdICs9IDE7IGFyZ3YtLTsgYXJnYysrOworCQl9CisJCWlmIChhcmdjIDwgNCkgeyAgLyogTWlzc2luZyBwcmlvcml0eSBhbmQvb3IgdXRpbGl0eSEgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCQlhZGp1c3RtZW50ID0geGF0b2lfcmFuZ2UoYXJndlsxXSwgSU5UX01JTi8yLCBJTlRfTUFYLzIpOworCQlhcmd2ICs9IDI7CisJfQorCisJeyAgLyogU2V0IG91ciBwcmlvcml0eS4gKi8KKwkJaW50IHByaW8gPSBvbGRfcHJpb3JpdHkgKyBhZGp1c3RtZW50OworCisJCWlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIHByaW8pIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRwcmlvcml0eSglZCkiLCBwcmlvKTsKKwkJfQorCX0KKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbm9odXAuYyBiL2NvcmV1dGlscy9ub2h1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbm9odXAuYwpAQCAtMCwwICsxLDg4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIG5vaHVwIC0gaW52b2tlIGEgdXRpbGl0eSBpbW11bmUgdG8gaGFuZ3Vwcy4KKyAqCisgKiBCdXN5Ym94IHZlcnNpb24gYmFzZWQgb24gbm9odXAgc3BlY2lmaWNhdGlvbiBhdAorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ub2h1cC5odG1sCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG5vaHVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgbm9odXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBpbW11bmUgdG8gaGFuZ3Vwcywgd2l0aCBvdXRwdXQgdG8gYSBub24tdHR5IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBub2h1cF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBub2h1cCBtYWtlICYiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBDb21wYXQgaW5mbzogbm9odXAgKEdOVSBjb3JldXRpbHMgNi44KSBkb2VzIHRoaXM6CisjIG5vaHVwIHRydWUKK25vaHVwOiBpZ25vcmluZyBpbnB1dCBhbmQgYXBwZW5kaW5nIG91dHB1dCB0byBgbm9odXAub3V0JworIyBub2h1cCB0cnVlIDE+L2Rldi9udWxsCitub2h1cDogaWdub3JpbmcgaW5wdXQgYW5kIHJlZGlyZWN0aW5nIHN0ZGVyciB0byBzdGRvdXQKKyMgbm9odXAgdHJ1ZSAyPnp6CisjIGNhdCB6egorbm9odXA6IGlnbm9yaW5nIGlucHV0IGFuZCBhcHBlbmRpbmcgb3V0cHV0IHRvIGBub2h1cC5vdXQnCisjIG5vaHVwIHRydWUgMj56eiAxPi9kZXYvbnVsbAorIyBjYXQgenoKK25vaHVwOiBpZ25vcmluZyBpbnB1dAorIyBub2h1cCB0cnVlIDwvZGV2L251bGwgMT4vZGV2L251bGwKK25vaHVwOiByZWRpcmVjdGluZyBzdGRlcnIgdG8gc3Rkb3V0CisjIG5vaHVwIHRydWUgPC9kZXYvbnVsbCAyPnp6IDE+L2Rldi9udWxsCisjIGNhdCB6egorICAobm90aGluZykKKyMKKyovCisKK2ludCBub2h1cF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbm9odXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm5vaHVwb3V0OworCWNoYXIgKmhvbWU7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAxMjc7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIElmIHN0ZGluIGlzIGEgdHR5LCBkZXRhY2ggZnJvbSBpdC4gKi8KKwlpZiAoaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCJpZ25vcmluZyBpbnB1dCIpOyAqLworCQljbG9zZShTVERJTl9GSUxFTk8pOworCQl4b3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpOyAvKiB3aWxsIGJlIGZkIDAgKFNURElOX0ZJTEVOTykgKi8KKwl9CisKKwlub2h1cG91dCA9ICJub2h1cC5vdXQiOworCS8qIFJlZGlyZWN0IHN0ZG91dCB0byBub2h1cC5vdXQsIGVpdGhlciBpbiAiLiIgb3IgaW4gIiRIT01FIi4gKi8KKwlpZiAoaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCWNsb3NlKFNURE9VVF9GSUxFTk8pOworCQlpZiAob3Blbihub2h1cG91dCwgT19DUkVBVHxPX1dST05MWXxPX0FQUEVORCwgU19JUlVTUnxTX0lXVVNSKSA8IDApIHsKKwkJCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKKwkJCWlmIChob21lKSB7CisJCQkJbm9odXBvdXQgPSBjb25jYXRfcGF0aF9maWxlKGhvbWUsIG5vaHVwb3V0KTsKKwkJCQl4b3BlbjMobm9odXBvdXQsIE9fQ1JFQVR8T19XUk9OTFl8T19BUFBFTkQsIFNfSVJVU1J8U19JV1VTUik7CisJCQl9IGVsc2UgeworCQkJCXhvcGVuKGJiX2Rldl9udWxsLCBPX1JET05MWSk7IC8qIHdpbGwgYmUgZmQgMSAqLworCQkJfQorCQl9CisJCWJiX2Vycm9yX21zZygiYXBwZW5kaW5nIG91dHB1dCB0byAlcyIsIG5vaHVwb3V0KTsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGEgdHR5IG9uIHN0ZGVyciwgcmVkaXJlY3QgdG8gc3Rkb3V0LiAqLworCWlmIChpc2F0dHkoU1RERVJSX0ZJTEVOTykpIHsKKwkJLyogaWYgKHN0ZG91dF93YXNudF9hX3R0eSkKKwkJCWJiX2Vycm9yX21zZygicmVkaXJlY3Rpbmcgc3RkZXJyIHRvIHN0ZG91dCIpOyAqLworCQlkdXAyKFNURE9VVF9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCX0KKworCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworCisJYXJndisrOworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvb2QuYyBiL2NvcmV1dGlscy9vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTFmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvb2QuYwpAQCAtMCwwICsxLDIyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogb2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSB1dGlsLWxpbnV4IHYgMi4xMWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworCisvL3VzYWdlOiNpZiAhRU5BQkxFX0RFU0tUT1AKKy8vdXNhZ2U6I2RlZmluZSBvZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hQmJjRGRlRmZIaElpTGxPb3ZYeF0gW0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIG9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgRklMRSAob3Igc3RkaW4pIHVuYW1iaWd1b3VzbHksIGFzIG9jdGFsIGJ5dGVzIGJ5IGRlZmF1bHQiCisvL3VzYWdlOiNlbmRpZgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfREVTS1RPUAorLyogVGhpcyBvbmUgcHJvdmlkZXMgLXQgKGJ1c3lib3gncyBvd24gYnVpbGQgc2NyaXB0IG5lZWRzIGl0KSAqLworI2luY2x1ZGUgIm9kX2Jsb2F0eS5jIgorI2Vsc2UKKworI2luY2x1ZGUgImR1bXAuaCIKKworc3RhdGljIHZvaWQKK29kb2Zmc2V0KGR1bXBlcl90ICpkdW1wZXIsIGludCBhcmdjLCBjaGFyICoqKmFyZ3ZwKQoreworCWNoYXIgKm51bSwgKnA7CisJaW50IGJhc2U7CisJY2hhciAqZW5kOworCisJLyoKKwkgKiBUaGUgb2Zmc2V0IHN5bnRheCBvZiBvZCgxKSB3YXMgZ2VudWluZWx5IGJpemFycmUuICBGaXJzdCwgaWYKKwkgKiBpdCBzdGFydGVkIHdpdGggYSBwbHVzIGl0IGhhZCB0byBiZSBhbiBvZmZzZXQuICBPdGhlcndpc2UsIGlmCisJICogdGhlcmUgd2VyZSBhdCBsZWFzdCB0d28gYXJndW1lbnRzLCBhIG51bWJlciBvciBsb3dlci1jYXNlICd4JworCSAqIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIG1ha2VzIGl0IGFuIG9mZnNldC4gIEJ5IGRlZmF1bHQgaXQgd2FzCisJICogb2N0YWw7IGlmIGl0IHN0YXJ0ZWQgd2l0aCAneCcgb3IgJzB4JyBpdCB3YXMgaGV4LiAgSWYgaXQgZW5kZWQKKwkgKiBpbiBhICcuJywgaXQgd2FzIGRlY2ltYWwuICBJZiBhICdiJyBvciAnQicgd2FzIGFwcGVuZGVkLCBpdAorCSAqIG11bHRpcGxpZWQgdGhlIG51bWJlciBieSA1MTIgb3IgMTAyNCBieXRlIHVuaXRzLiAgVGhlcmUgd2FzCisJICogbm8gd2F5IHRvIGFzc2lnbiBhIGJsb2NrIGNvdW50IHRvIGEgaGV4IG9mZnNldC4KKwkgKgorCSAqIFdlIGFzc3VtZXMgaXQncyBhIGZpbGUgaWYgdGhlIG9mZnNldCBpcyBiYWQuCisJICovCisJcCA9ICoqYXJndnA7CisKKwlpZiAoIXApIHsKKwkJLyogaGV5IHNvbWVvbmUgaXMgcHJvYmFibHkgcGlwaW5nIHRvIHVzIC4uLiAqLworCQlyZXR1cm47CisJfQorCisJaWYgKCgqcCAhPSAnKycpCisJCSYmIChhcmdjIDwgMgorCQkJfHwgKCFpc2RpZ2l0KHBbMF0pCisJCQkJJiYgKChwWzBdICE9ICd4JykgfHwgIWlzeGRpZ2l0KHBbMV0pKSkpKQorCQlyZXR1cm47CisKKwliYXNlID0gMDsKKwkvKgorCSAqIHNraXAgb3ZlciBsZWFkaW5nICcrJywgJ3hbMC05YS1mQS1mXScgb3IgJzB4JywgYW5kCisJICogc2V0IGJhc2UuCisJICovCisJaWYgKHBbMF0gPT0gJysnKQorCQkrK3A7CisJaWYgKHBbMF0gPT0gJ3gnICYmIGlzeGRpZ2l0KHBbMV0pKSB7CisJCSsrcDsKKwkJYmFzZSA9IDE2OworCX0gZWxzZSBpZiAocFswXSA9PSAnMCcgJiYgcFsxXSA9PSAneCcpIHsKKwkJcCArPSAyOworCQliYXNlID0gMTY7CisJfQorCisJLyogc2tpcCBvdmVyIHRoZSBudW1iZXIgKi8KKwlpZiAoYmFzZSA9PSAxNikKKwkJZm9yIChudW0gPSBwOyBpc3hkaWdpdCgqcCk7ICsrcCkKKwkJCWNvbnRpbnVlOworCWVsc2UKKwkJZm9yIChudW0gPSBwOyBpc2RpZ2l0KCpwKTsgKytwKQorCQkJY29udGludWU7CisKKwkvKiBjaGVjayBmb3Igbm8gbnVtYmVyICovCisJaWYgKG51bSA9PSBwKQorCQlyZXR1cm47CisKKwkvKiBpZiB0ZXJtaW5hdGVzIHdpdGggYSAnLicsIGJhc2UgaXMgZGVjaW1hbCAqLworCWlmICgqcCA9PSAnLicpIHsKKwkJaWYgKGJhc2UpCisJCQlyZXR1cm47CisJCWJhc2UgPSAxMDsKKwl9CisKKwlkdW1wZXItPmR1bXBfc2tpcCA9IHN0cnRvbChudW0sICZlbmQsIGJhc2UgPyBiYXNlIDogOCk7CisKKwkvKiBpZiBlbmQgaXNuJ3QgdGhlIHNhbWUgYXMgcCwgd2UgZ290IGEgbm9uLW9jdGFsIGRpZ2l0ICovCisJaWYgKGVuZCAhPSBwKQorCQlkdW1wZXItPmR1bXBfc2tpcCA9IDA7CisJZWxzZSB7CisJCWlmICgqcCkgeworCQkJaWYgKCpwID09ICdiJykgeworCQkJCWR1bXBlci0+ZHVtcF9za2lwICo9IDUxMjsKKwkJCQkrK3A7CisJCQl9IGVsc2UgaWYgKCpwID09ICdCJykgeworCQkJCWR1bXBlci0+ZHVtcF9za2lwICo9IDEwMjQ7CisJCQkJKytwOworCQkJfQorCQl9CisJCWlmICgqcCkKKwkJCWR1bXBlci0+ZHVtcF9za2lwID0gMDsKKwkJZWxzZSB7CisJCQkrKyphcmd2cDsKKwkJCS8qCisJCQkgKiBJZiB0aGUgb2Zmc2V0IHVzZXMgYSBub24tb2N0YWwgYmFzZSwgdGhlIGJhc2Ugb2YKKwkJCSAqIHRoZSBvZmZzZXQgaXMgY2hhbmdlZCBhcyB3ZWxsLiAgVGhpcyBpc24ndCBwcmV0dHksCisJCQkgKiBidXQgaXQncyBlYXN5LgorCQkJICovCisjZGVmaW5lIFRZUEVfT0ZGU0VUIDcKKwkJCXsKKwkJCQljaGFyIHhfb3JfZDsKKwkJCQlpZiAoYmFzZSA9PSAxNikgeworCQkJCQl4X29yX2QgPSAneCc7CisJCQkJCWdvdG8gRE9fWF9PUl9EOworCQkJCX0KKwkJCQlpZiAoYmFzZSA9PSAxMCkgeworCQkJCQl4X29yX2QgPSAnZCc7CisgRE9fWF9PUl9EOgorCQkJCQlkdW1wZXItPmZzaGVhZC0+bmV4dGZ1LT5mbXRbVFlQRV9PRkZTRVRdCisJCQkJCQk9IGR1bXBlci0+ZnNoZWFkLT5uZXh0ZnMtPm5leHRmdS0+Zm10W1RZUEVfT0ZGU0VUXQorCQkJCQkJPSB4X29yX2Q7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWRkX3N0cmluZ3NbXSA9IHsKKwkiMTYvMSBcIiUzX3UgXCIgXCJcXG5cIiIsICAgICAgICAgICAgICAvKiBhICovCisJIjgvMiBcIiAlMDZvIFwiIFwiXFxuXCIiLCAgICAgICAgICAgICAgLyogQiwgbyAqLworCSIxNi8xIFwiJTAzbyBcIiBcIlxcblwiIiwgICAgICAgICAgICAgIC8qIGIgKi8KKwkiMTYvMSBcIiUzX2MgXCIgXCJcXG5cIiIsICAgICAgICAgICAgICAvKiBjICovCisJIjgvMiBcIiAgJTA1dSBcIiBcIlxcblwiIiwgICAgICAgICAgICAgLyogZCAqLworCSI0LzQgXCIgICAgICUwMTB1IFwiIFwiXFxuXCIiLCAgICAgICAgIC8qIEQgKi8KKwkiMi84IFwiICAgICAgICAgICUyMS4xNGUgXCIgXCJcXG5cIiIsICAvKiBlICh1bmRvY3VtZW50ZWQgaW4gb2QpLCBGICovCisJIjQvNCBcIiAlMTQuN2UgXCIgXCJcXG5cIiIsICAgICAgICAgICAgLyogZiAqLworCSI0LzQgXCIgICAgICAgJTA4eCBcIiBcIlxcblwiIiwgICAgICAgIC8qIEgsIFggKi8KKwkiOC8yIFwiICAgJTA0eCBcIiBcIlxcblwiIiwgICAgICAgICAgICAvKiBoLCB4ICovCisJIjQvNCBcIiAgICAlMTFkIFwiIFwiXFxuXCIiLCAgICAgICAgICAgLyogSSwgTCwgbCAqLworCSI4LzIgXCIgJTZkIFwiIFwiXFxuXCIiLCAgICAgICAgICAgICAgIC8qIGkgKi8KKwkiNC80IFwiICAgICUwMTFvIFwiIFwiXFxuXCIiLCAgICAgICAgICAvKiBPICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBvZF9vcHRzW10gQUxJR04xID0gImFCYmNEZGVGZkhoSWlMbE9vWHh2IjsKKworc3RhdGljIGNvbnN0IGNoYXIgb2RfbzJzaVtdIEFMSUdOMSA9IHsKKwkwLCAxLCAyLCAzLCA1LAorCTQsIDYsIDYsIDcsIDgsCisJOSwgMHhhLCAweGIsIDB4YSwgMHhhLAorCTB4YiwgMSwgOCwgOSwKK307CisKK2ludCBvZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGNoOworCWludCBmaXJzdCA9IDE7CisJY2hhciAqcDsKKwlkdW1wZXJfdCAqZHVtcGVyID0gYWxsb2NfZHVtcGVyKCk7CisKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9kX29wdHMpKSA+IDApIHsKKwkJaWYgKGNoID09ICd2JykgeworCQkJZHVtcGVyLT5kdW1wX3ZmbGFnID0gQUxMOworCQl9IGVsc2UgaWYgKCgocCA9IHN0cmNocihvZF9vcHRzLCBjaCkpICE9IE5VTEwpICYmICgqcCAhPSAnXDAnKSkgeworCQkJaWYgKGZpcnN0KSB7CisJCQkJZmlyc3QgPSAwOworCQkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfQW9cblwiIik7CisJCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19hbyAgXCIiKTsKKwkJCX0gZWxzZSB7CisJCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIgICAgICAgICBcIiIpOworCQkJfQorCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCBhZGRfc3RyaW5nc1soaW50KW9kX28yc2lbKHAgLSBvZF9vcHRzKV1dKTsKKwkJfSBlbHNlIHsgIC8qIFAsIHAsIHMsIHcsIG9yIG90aGVyIHVuaGFuZGxlZCAqLworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWlmICghZHVtcGVyLT5mc2hlYWQpIHsKKwkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19Bb1xuXCIiKTsKKwkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19hbyAgXCIgOC8yIFwiJTA2byBcIiBcIlxcblwiIik7CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlvZG9mZnNldChkdW1wZXIsIGFyZ2MsICZhcmd2KTsKKworCXJldHVybiBiYl9kdW1wX2R1bXAoZHVtcGVyLCBhcmd2KTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfREVTS1RPUCAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9vZF9ibG9hdHkuYyBiL2NvcmV1dGlscy9vZF9ibG9hdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDdmODc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL29kX2Jsb2F0eS5jCkBAIC0wLDAgKzEsMTM4NCBAQAorLyogb2QgLS0gZHVtcCBmaWxlcyBpbiBvY3RhbCBhbmQgb3RoZXIgZm9ybWF0cworICAgQ29weXJpZ2h0IChDKSA5MiwgMTk5NS0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKy8qIFdyaXR0ZW4gYnkgSmltIE1leWVyaW5nLiAgKi8KKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbywgYmFzZWQgb24gb2QuYyBmcm9tIGNvcmV1dGlscy01LjIuMSAqLworCisKKy8qICNpbmNsdWRlICJsaWJiYi5oIiAtIGRvbmUgaW4gb2QuYyAqLworI2RlZmluZSBhc3NlcnQoYSkgKCh2b2lkKTApCisKKworLy91c2FnZTojaWYgRU5BQkxFX0RFU0tUT1AKKy8vdXNhZ2U6I2RlZmluZSBvZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hYmNkZmhpbG92eHNdIFstdCBUWVBFXSBbLUEgUkFESVhdIFstTiBTSVpFXSBbLWogU0tJUF0gWy1TIE1JTlNUUl0gWy13IFdJRFRIXSBbRklMRS4uLl0iCisvLyBXZSBkb24ndCBzdXBwb3J0OgorLy8gLi4uIFtGSUxFXSBbWytdT0ZGU0VUWy5dW2JdXQorLy8gU3VwcG9ydCBpcyBidWdneSBmb3I6CisvLyBvZCAtLXRyYWRpdGlvbmFsIFtPUFRJT05dLi4uIFtGSUxFXSBbWytdT0ZGU0VUWy5dW2JdIFsrXVtMQUJFTF1bLl1bYl1dCisKKy8vdXNhZ2U6I2RlZmluZSBvZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IEZJTEVzIChvciBzdGRpbikgdW5hbWJpZ3VvdXNseSwgYXMgb2N0YWwgYnl0ZXMgYnkgZGVmYXVsdCIKKy8vdXNhZ2U6I2VuZGlmCisKK2VudW0geworCU9QVF9BID0gMSA8PCAwLAorCU9QVF9OID0gMSA8PCAxLAorCU9QVF9hID0gMSA8PCAyLAorCU9QVF9iID0gMSA8PCAzLAorCU9QVF9jID0gMSA8PCA0LAorCU9QVF9kID0gMSA8PCA1LAorCU9QVF9mID0gMSA8PCA2LAorCU9QVF9oID0gMSA8PCA3LAorCU9QVF9pID0gMSA8PCA4LAorCU9QVF9qID0gMSA8PCA5LAorCU9QVF9sID0gMSA8PCAxMCwKKwlPUFRfbyA9IDEgPDwgMTEsCisJT1BUX3QgPSAxIDw8IDEyLAorCS8qIFdoZW4gemVybyBhbmQgdHdvIG9yIG1vcmUgY29uc2VjdXRpdmUgYmxvY2tzIGFyZSBlcXVhbCwgZm9ybWF0CisJICAgb25seSB0aGUgZmlyc3QgYmxvY2sgYW5kIG91dHB1dCBhbiBhc3RlcmlzayBhbG9uZSBvbiB0aGUgZm9sbG93aW5nCisJICAgbGluZSB0byBpbmRpY2F0ZSB0aGF0IGlkZW50aWNhbCBibG9ja3MgaGF2ZSBiZWVuIGVsaWRlZDogKi8KKwlPUFRfdiA9IDEgPDwgMTMsCisJT1BUX3ggPSAxIDw8IDE0LAorCU9QVF9zID0gMSA8PCAxNSwKKwlPUFRfUyA9IDEgPDwgMTYsCisJT1BUX3cgPSAxIDw8IDE3LAorCU9QVF90cmFkaXRpb25hbCA9ICgxIDw8IDE4KSAqIEVOQUJMRV9MT05HX09QVFMsCit9OworCisjZGVmaW5lIE9EX0dFVE9QVDMyKCkgZ2V0b3B0MzIoYXJndiwgXAorCSJBOk46YWJjZGZoaWo6bG90OnZ4c1M6dzo6IiwgXAorCS8qIC13IHdpdGggb3B0aW9uYWwgcGFyYW0gKi8gXAorCS8qIC1TIHdhcyAtcyBhbmQgYWxzbyBoYWQgb3B0aW9uYWwgcGFyYW1ldGVyICovIFwKKwkvKiBidXQgaW4gY29yZXV0aWxzIDYuMyBpdCB3YXMgcmVuYW1lZCBhbmQgbm93IGhhcyAqLyBcCisJLyogX21hbmRhdG9yeV8gcGFyYW1ldGVyICovIFwKKwkmc3RyX0EsICZzdHJfTiwgJnN0cl9qLCAmbHN0X3QsICZzdHJfUywgJmJ5dGVzX3Blcl9ibG9jaykKKworCisvKiBDaGVjayBmb3IgMHg3ZiBpcyBhIGNvcmV1dGlscyA2LjMgYWRkaXRpb24gKi8KKyNkZWZpbmUgSVNQUklOVChjKSAoKChjKSA+PSAnICcpICYmIChjKSA8IDB4N2YpCisKK3R5cGVkZWYgbG9uZyBkb3VibGUgbG9uZ2RvdWJsZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxvbmdsb25nX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBsbG9uZzsKKworI2lmIEVOQUJMRV9MRlMKKyMgZGVmaW5lIHhzdHJ0b29mZl9zZnggeHN0cnRvdWxsX3NmeAorI2Vsc2UKKyMgZGVmaW5lIHhzdHJ0b29mZl9zZnggeHN0cnRvdWxfc2Z4CisjZW5kaWYKKworLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHBlciBvdXRwdXQgbGluZS4gICovCisjZGVmaW5lIERFRkFVTFRfQllURVNfUEVSX0JMT0NLIDE2CisKKy8qIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uIGluIGEgZmxvYXQuICAqLworI2lmbmRlZiBGTFRfRElHCisjIGRlZmluZSBGTFRfRElHIDcKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbiBpbiBhIGRvdWJsZS4gICovCisjaWZuZGVmIERCTF9ESUcKKyMgZGVmaW5lIERCTF9ESUcgMTUKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbiBpbiBhIGxvbmcgZG91YmxlLiAgKi8KKyNpZm5kZWYgTERCTF9ESUcKKyMgZGVmaW5lIExEQkxfRElHIERCTF9ESUcKKyNlbmRpZgorCitlbnVtIHNpemVfc3BlYyB7CisJTk9fU0laRSwKKwlDSEFSLAorCVNIT1JULAorCUlOVCwKKwlMT05HLAorCUxPTkdfTE9ORywKKwlGTE9BVF9TSU5HTEUsCisJRkxPQVRfRE9VQkxFLAorCUZMT0FUX0xPTkdfRE9VQkxFLAorCU5fU0laRV9TUEVDUworfTsKKworZW51bSBvdXRwdXRfZm9ybWF0IHsKKwlTSUdORURfREVDSU1BTCwKKwlVTlNJR05FRF9ERUNJTUFMLAorCU9DVEFMLAorCUhFWEFERUNJTUFMLAorCUZMT0FUSU5HX1BPSU5ULAorCU5BTUVEX0NIQVJBQ1RFUiwKKwlDSEFSQUNURVIKK307CisKKy8qIEVhY2ggb3V0cHV0IGZvcm1hdCBzcGVjaWZpY2F0aW9uIChmcm9tICctdCBzcGVjJyBvciBmcm9tCisgICBvbGQtc3R5bGUgb3B0aW9ucykgaXMgcmVwcmVzZW50ZWQgYnkgb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMuICAqLworc3RydWN0IHRzcGVjIHsKKwllbnVtIG91dHB1dF9mb3JtYXQgZm10OworCWVudW0gc2l6ZV9zcGVjIHNpemU7CisJdm9pZCAoKnByaW50X2Z1bmN0aW9uKSAoc2l6ZV90LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisJY2hhciAqZm10X3N0cmluZzsKKwlpbnQgaGV4bF9tb2RlX3RyYWlsZXI7CisJaW50IGZpZWxkX3dpZHRoOworfTsKKworLyogQ29udmVydCB0aGUgbnVtYmVyIG9mIDgtYml0IGJ5dGVzIG9mIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIHRvCisgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKGRpZ2l0cyArIHNpZ24gaWYgdGhlIHR5cGUgaXMgc2lnbmVkKQorICAgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBzYW1lIHF1YW50aXR5IGluIHRoZSBzcGVjaWZpZWQgYmFzZS90eXBlLgorICAgRm9yIGV4YW1wbGUsIGEgMzItYml0ICg0LWJ5dGUpIHF1YW50aXR5IG1heSByZXF1aXJlIGEgZmllbGQgd2lkdGgKKyAgIGFzIHdpZGUgYXMgdGhlIGZvbGxvd2luZyBmb3IgdGhlc2UgdHlwZXM6CisgICAxMQl1bnNpZ25lZCBvY3RhbAorICAgMTEJc2lnbmVkIGRlY2ltYWwKKyAgIDEwCXVuc2lnbmVkIGRlY2ltYWwKKyAgIDgJdW5zaWduZWQgaGV4YWRlY2ltYWwgICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJ5dGVzX3RvX29jdF9kaWdpdHNbXSBBTElHTjEgPQorezAsIDMsIDYsIDgsIDExLCAxNCwgMTYsIDE5LCAyMiwgMjUsIDI3LCAzMCwgMzIsIDM1LCAzOCwgNDEsIDQzfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnl0ZXNfdG9fc2lnbmVkX2RlY19kaWdpdHNbXSBBTElHTjEgPQorezEsIDQsIDYsIDgsIDExLCAxMywgMTYsIDE4LCAyMCwgMjMsIDI1LCAyOCwgMzAsIDMzLCAzNSwgMzcsIDQwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnl0ZXNfdG9fdW5zaWduZWRfZGVjX2RpZ2l0c1tdIEFMSUdOMSA9Cit7MCwgMywgNSwgOCwgMTAsIDEzLCAxNSwgMTcsIDIwLCAyMiwgMjUsIDI3LCAyOSwgMzIsIDM0LCAzNywgMzl9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBieXRlc190b19oZXhfZGlnaXRzW10gQUxJR04xID0KK3swLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOCwgMzAsIDMyfTsKKworLyogQ29udmVydCBlbnVtIHNpemVfc3BlYyB0byB0aGUgc2l6ZSBvZiB0aGUgbmFtZWQgdHlwZS4gICovCitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgd2lkdGhfYnl0ZXNbXSBBTElHTjEgPSB7CisJLTEsCisJc2l6ZW9mKGNoYXIpLAorCXNpemVvZihzaG9ydCksCisJc2l6ZW9mKGludCksCisJc2l6ZW9mKGxvbmcpLAorCXNpemVvZih1bG9uZ2xvbmdfdCksCisJc2l6ZW9mKGZsb2F0KSwKKwlzaXplb2YoZG91YmxlKSwKKwlzaXplb2YobG9uZ2RvdWJsZV90KQorfTsKKy8qIEVuc3VyZSB0aGF0IGZvciBlYWNoIG1lbWJlciBvZiAnZW51bSBzaXplX3NwZWMnIHRoZXJlIGlzIGFuCisgICBpbml0aWFsaXplciBpbiB0aGUgd2lkdGhfYnl0ZXMgYXJyYXkuICAqLworc3RydWN0IEVSUl93aWR0aF9ieXRlc19oYXNfYmFkX3NpemUgeworCWNoYXIgRVJSX3dpZHRoX2J5dGVzX2hhc19iYWRfc2l6ZVtBUlJBWV9TSVpFKHdpZHRoX2J5dGVzKSA9PSBOX1NJWkVfU1BFQ1MgPyAxIDogLTFdOworfTsKKworc3RhdGljIHNtYWxsaW50IGV4aXRfY29kZTsKKworc3RhdGljIHVuc2lnbmVkIHN0cmluZ19taW47CisKKy8qIEFuIGFycmF5IG9mIHNwZWNzIGRlc2NyaWJpbmcgaG93IHRvIGZvcm1hdCBlYWNoIGlucHV0IGJsb2NrLiAgKi8KK3N0YXRpYyBzaXplX3Qgbl9zcGVjczsKK3N0YXRpYyBzdHJ1Y3QgdHNwZWMgKnNwZWM7CisKKy8qIEZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBhZGRyZXNzIGFuZCBhbiBvcHRpb25hbCBmb2xsb3dpbmcgY2hhciwKKyAgIGFuZCBwcmludHMgdGhlIGFkZHJlc3MgYW5kIGNoYXIgdG8gc3Rkb3V0LiAgKi8KK3N0YXRpYyB2b2lkICgqZm9ybWF0X2FkZHJlc3MpKG9mZl90LCBjaGFyKTsKKy8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9sZC1zdHlsZSBwc2V1ZG8gc3RhcnRpbmcgYWRkcmVzcyBhbmQKKyAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4gICovCisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIG9mZl90IHBzZXVkb19vZmZzZXQ7CisjZWxzZQorZW51bSB7IHBzZXVkb19vZmZzZXQgPSAwIH07CisjZW5kaWYKKy8qIFdoZW4gemVybywgTUFYX0JZVEVTX1RPX0ZPUk1BVCBhbmQgRU5EX09GRlNFVCBhcmUgaWdub3JlZCwgYW5kIGFsbAorICAgaW5wdXQgaXMgZm9ybWF0dGVkLiAgKi8KKworLyogVGhlIG51bWJlciBvZiBpbnB1dCBieXRlcyBmb3JtYXR0ZWQgcGVyIG91dHB1dCBsaW5lLiAgSXQgbXVzdCBiZQorICAgYSBtdWx0aXBsZSBvZiB0aGUgbGVhc3QgY29tbW9uIG11bHRpcGxlIG9mIHRoZSBzaXplcyBhc3NvY2lhdGVkIHdpdGgKKyAgIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHR5cGVzLiAgSXQgc2hvdWxkIGJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBidXQKKyAgIG5vIGxhcmdlciB0aGFuIDE2IC0tIHVubGVzcyBzcGVjaWZpZWQgd2l0aCB0aGUgLXcgb3B0aW9uLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBieXRlc19wZXJfYmxvY2sgPSAzMjsgLyogaGF2ZSB0byB1c2UgdW5zaWduZWQsIG5vdCBzaXplX3QgKi8KKworLyogQSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiB0aGUgZmlsZS1hcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCAqZmlsZV9saXN0OworCisvKiBUaGUgaW5wdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBmaWxlLiAgKi8KK3N0YXRpYyBGSUxFICppbl9zdHJlYW07CisKKyNkZWZpbmUgTUFYX0lOVEVHUkFMX1RZUEVfU0laRSBzaXplb2YodWxvbmdsb25nX3QpCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnRlZ3JhbF90eXBlX3NpemVbTUFYX0lOVEVHUkFMX1RZUEVfU0laRSArIDFdIEFMSUdOMSA9IHsKKwlbc2l6ZW9mKGNoYXIpXSA9IENIQVIsCisjaWYgVVNIUlRfTUFYICE9IFVDSEFSX01BWAorCVtzaXplb2Yoc2hvcnQpXSA9IFNIT1JULAorI2VuZGlmCisjaWYgVUlOVF9NQVggIT0gVVNIUlRfTUFYCisJW3NpemVvZihpbnQpXSA9IElOVCwKKyNlbmRpZgorI2lmIFVMT05HX01BWCAhPSBVSU5UX01BWAorCVtzaXplb2YobG9uZyldID0gTE9ORywKKyNlbmRpZgorI2lmIFVMTE9OR19NQVggIT0gVUxPTkdfTUFYCisJW3NpemVvZih1bG9uZ2xvbmdfdCldID0gTE9OR19MT05HLAorI2VuZGlmCit9OworCisjZGVmaW5lIE1BWF9GUF9UWVBFX1NJWkUgc2l6ZW9mKGxvbmdkb3VibGVfdCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZwX3R5cGVfc2l6ZVtNQVhfRlBfVFlQRV9TSVpFICsgMV0gQUxJR04xID0geworCS8qIGdjYyBzZWVtcyB0byBhbGxvdyByZXBlYXRlZCBpbmRleGVzLiBMYXN0IG9uZSB3aW5zICovCisJW3NpemVvZihsb25nZG91YmxlX3QpXSA9IEZMT0FUX0xPTkdfRE9VQkxFLAorCVtzaXplb2YoZG91YmxlKV0gPSBGTE9BVF9ET1VCTEUsCisJW3NpemVvZihmbG9hdCldID0gRkxPQVRfU0lOR0xFCit9OworCisKK3N0YXRpYyB1bnNpZ25lZAorZ2NkKHVuc2lnbmVkIHUsIHVuc2lnbmVkIHYpCit7CisJdW5zaWduZWQgdDsKKwl3aGlsZSAodiAhPSAwKSB7CisJCXQgPSB1ICUgdjsKKwkJdSA9IHY7CisJCXYgPSB0OworCX0KKwlyZXR1cm4gdTsKK30KKworLyogQ29tcHV0ZSB0aGUgbGVhc3QgY29tbW9uIG11bHRpcGxlIG9mIFUgYW5kIFYuICAqLworc3RhdGljIHVuc2lnbmVkCitsY20odW5zaWduZWQgdSwgdW5zaWduZWQgdikgeworCXVuc2lnbmVkIHQgPSBnY2QodSwgdik7CisJaWYgKHQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHUgKiB2IC8gdDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3NfY2hhcihzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlpbnQgdG1wID0gKihzaWduZWQgY2hhciAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9jaGFyKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIHRtcCA9ICoodW5zaWduZWQgY2hhciAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zX3Nob3J0KHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZihzaWduZWQgc2hvcnQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJaW50IHRtcCA9ICooc2lnbmVkIHNob3J0ICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zaG9ydChzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgdG1wID0gKih1bnNpZ25lZCBzaG9ydCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaW50KHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZih1bnNpZ25lZCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQl1bnNpZ25lZCB0bXAgPSAqKHVuc2lnbmVkICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVuc2lnbmVkKTsKKwl9Cit9CisKKyNpZiBVSU5UX01BWCA9PSBVTE9OR19NQVgKKyMgZGVmaW5lIHByaW50X2xvbmcgcHJpbnRfaW50CisjZWxzZQorc3RhdGljIHZvaWQKK3ByaW50X2xvbmcoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCW5fYnl0ZXMgLz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgbG9uZyB0bXAgPSAqKHVuc2lnbmVkIGxvbmcgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJfQorfQorI2VuZGlmCisKKyNpZiBVTE9OR19NQVggPT0gVUxMT05HX01BWAorIyBkZWZpbmUgcHJpbnRfbG9uZ19sb25nIHByaW50X2xvbmcKKyNlbHNlCitzdGF0aWMgdm9pZAorcHJpbnRfbG9uZ19sb25nKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZih1bG9uZ2xvbmdfdCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQl1bG9uZ2xvbmdfdCB0bXAgPSAqKHVsb25nbG9uZ190ICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVsb25nbG9uZ190KTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3ByaW50X2Zsb2F0KHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZihmbG9hdCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlmbG9hdCB0bXAgPSAqKGZsb2F0ICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKGZsb2F0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9kb3VibGUoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCW5fYnl0ZXMgLz0gc2l6ZW9mKGRvdWJsZSk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlkb3VibGUgdG1wID0gKihkb3VibGUgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YoZG91YmxlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9sb25nX2RvdWJsZShzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YobG9uZ2RvdWJsZV90KTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCWxvbmdkb3VibGVfdCB0bXAgPSAqKGxvbmdkb3VibGVfdCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZihsb25nZG91YmxlX3QpOworCX0KK30KKworLyogcHJpbnRfW25hbWVkXV9hc2NpaSBhcmUgb3B0aW1pemVkIGZvciBzcGVlZC4KKyAqIFJlbWVtYmVyLCBzb21lZGF5IHlvdSBtYXkgd2FudCB0byBwdW1wIGdpZ2FieXRlcyB0aHJvdWdoIHRoaXMgdGhpbmcuCisgKiBTYXZpbmcgYSBkb3plbiBvZiAudGV4dCBieXRlcyBoZXJlIGlzIGNvdW50ZXItcHJvZHVjdGl2ZSAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfbmFtZWRfYXNjaWkoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLAorCQljb25zdCBjaGFyICp1bnVzZWRfZm10X3N0cmluZyBVTlVTRURfUEFSQU0pCit7CisJLyogTmFtZXMgZm9yIHNvbWUgbm9uLXByaW50aW5nIGNoYXJhY3RlcnMuICAqLworCXN0YXRpYyBjb25zdCBjaGFyIGNoYXJuYW1lWzMzXVszXSBBTElHTjEgPSB7CisJCSJudWwiLCAic29oIiwgInN0eCIsICJldHgiLCAiZW90IiwgImVucSIsICJhY2siLCAiYmVsIiwKKwkJIiBicyIsICIgaHQiLCAiIG5sIiwgIiB2dCIsICIgZmYiLCAiIGNyIiwgIiBzbyIsICIgc2kiLAorCQkiZGxlIiwgImRjMSIsICJkYzIiLCAiZGMzIiwgImRjNCIsICJuYWsiLCAic3luIiwgImV0YiIsCisJCSJjYW4iLCAiIGVtIiwgInN1YiIsICJlc2MiLCAiIGZzIiwgIiBncyIsICIgcnMiLCAiIHVzIiwKKwkJIiBzcCIKKwl9OworCS8vIGJ1ZltOXSBwb3M6ICAwMTIzNCA1Njc4OQorCWNoYXIgYnVmWzEyXSA9ICIgICB4XDAgMHh4XDAiOworCS8vIGFjdHVhbGx5ICIgICB4XDAgeHh4XDAiLCBidXQgd2FudCB0byBzaGFyZSBzdHJpbmcgd2l0aCBwcmludF9hc2NpaS4KKwkvLyBbMTJdIGJlY2F1c2Ugd2UgdGFrZSB0aHJlZSAzMmJpdCBzdGFjayBzbG90cyBhbnl3YXksIGFuZAorCS8vIGdjYyBpcyB0b28gZHVtYiB0byBpbml0aWFsaXplIHdpdGggY29uc3RhbnQgc3RvcmVzLAorCS8vIGl0IGNvcGllcyBpbml0aWFsaXplciBmcm9tIHJvZGF0YS4gT2ggd2VsbC4KKworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgbWFza2VkX2MgPSAqKHVuc2lnbmVkIGNoYXIgKikgYmxvY2srKzsKKworCQltYXNrZWRfYyAmPSAweDdmOworCQlpZiAobWFza2VkX2MgPT0gMHg3ZikgeworCQkJZnB1dHMoIiBkZWwiLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1hc2tlZF9jID4gJyAnKSB7CisJCQlidWZbM10gPSBtYXNrZWRfYzsKKwkJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdoeT8gQmVjYXVzZSBwcmludGYoIiAlMy4zcyIpIGlzIG11Y2ggc2xvd2VyLi4uICovCisJCWJ1Zls2XSA9IGNoYXJuYW1lW21hc2tlZF9jXVswXTsKKwkJYnVmWzddID0gY2hhcm5hbWVbbWFza2VkX2NdWzFdOworCQlidWZbOF0gPSBjaGFybmFtZVttYXNrZWRfY11bMl07CisJCWZwdXRzKGJ1Zis1LCBzdGRvdXQpOworCX0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X2FzY2lpKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywKKwkJY29uc3QgY2hhciAqdW51c2VkX2ZtdF9zdHJpbmcgVU5VU0VEX1BBUkFNKQoreworCS8vIGJ1ZltOXSBwb3M6ICAwMTIzNCA1Njc4OQorCWNoYXIgYnVmWzEyXSA9ICIgICB4XDAgMHh4XDAiOworCisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQljb25zdCBjaGFyICpzOworCQl1bnNpZ25lZCBjID0gKih1bnNpZ25lZCBjaGFyICopIGJsb2NrKys7CisKKwkJaWYgKElTUFJJTlQoYykpIHsKKwkJCWJ1ZlszXSA9IGM7CisJCQlmcHV0cyhidWYsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXDAnOgorCQkJcyA9ICIgIFxcMCI7CisJCQlicmVhazsKKwkJY2FzZSAnXDAwNyc6CisJCQlzID0gIiAgXFxhIjsKKwkJCWJyZWFrOworCQljYXNlICdcYic6CisJCQlzID0gIiAgXFxiIjsKKwkJCWJyZWFrOworCQljYXNlICdcZic6CisJCQlzID0gIiAgXFxmIjsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlzID0gIiAgXFxuIjsKKwkJCWJyZWFrOworCQljYXNlICdccic6CisJCQlzID0gIiAgXFxyIjsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlzID0gIiAgXFx0IjsKKwkJCWJyZWFrOworCQljYXNlICdcdic6CisJCQlzID0gIiAgXFx2IjsKKwkJCWJyZWFrOworCQljYXNlICdceDdmJzoKKwkJCXMgPSAiIDE3NyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogYyBpcyBuZXZlciBsYXJnZXIgdGhhbiAwNDAgKi8KKwkJCWJ1Zls3XSA9IChjID4+IDMpICsgJzAnOworCQkJYnVmWzhdID0gKGMgJiA3KSArICcwJzsKKwkJCXMgPSBidWYgKyA1OworCQl9CisJCWZwdXRzKHMsIHN0ZG91dCk7CisJfQorfQorCisvKiBHaXZlbiBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgaW5wdXQgZmlsZW5hbWVzIEZJTEVfTElTVCwgc2V0IHRoZSBnbG9iYWwKKyAgIGZpbGUgcG9pbnRlciBJTl9TVFJFQU0gYW5kIHRoZSBnbG9iYWwgc3RyaW5nIElOUFVUX0ZJTEVOQU1FIHRvIHRoZQorICAgZmlyc3Qgb25lIHRoYXQgY2FuIGJlIHN1Y2Nlc3NmdWxseSBvcGVuZWQuIE1vZGlmeSBGSUxFX0xJU1QgdG8KKyAgIHJlZmVyZW5jZSB0aGUgbmV4dCBmaWxlbmFtZSBpbiB0aGUgbGlzdC4gIEEgZmlsZSBuYW1lIG9mICItIiBpcworICAgaW50ZXJwcmV0ZWQgYXMgc3RhbmRhcmQgaW5wdXQuICBJZiBhbnkgZmlsZSBvcGVuIGZhaWxzLCBnaXZlIGFuIGVycm9yCisgICBtZXNzYWdlIGFuZCByZXR1cm4gbm9uemVyby4gICovCisKK3N0YXRpYyB2b2lkCitvcGVuX25leHRfZmlsZSh2b2lkKQoreworCXdoaWxlICgxKSB7CisJCWlmICghKmZpbGVfbGlzdCkKKwkJCXJldHVybjsKKwkJaW5fc3RyZWFtID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqZmlsZV9saXN0KyspOworCQlpZiAoaW5fc3RyZWFtKSB7CisJCQlicmVhazsKKwkJfQorCQlleGl0X2NvZGUgPSAxOworCX0KKworCWlmICgob3B0aW9uX21hc2szMiAmIChPUFRfTnxPUFRfUykpID09IE9QVF9OKQorCQlzZXRidWYoaW5fc3RyZWFtLCBOVUxMKTsKK30KKworLyogVGVzdCB3aGV0aGVyIHRoZXJlIGhhdmUgYmVlbiBlcnJvcnMgb24gaW5fc3RyZWFtLCBhbmQgY2xvc2UgaXQgaWYKKyAgIGl0IGlzIG5vdCBzdGFuZGFyZCBpbnB1dC4gIFJldHVybiBub256ZXJvIGlmIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yCisgICBvbiBpbl9zdHJlYW0gb3Igc3Rkb3V0OyByZXR1cm4gemVybyBvdGhlcndpc2UuICBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAgIHJlcG9ydCBtb3JlIHRoYW4gb25lIGVycm9yIG9ubHkgaWYgYm90aCBhIHJlYWQgYW5kIGEgd3JpdGUgZXJyb3IKKyAgIGhhdmUgb2NjdXJyZWQuICBJTl9FUlJOTywgaWYgbm9uemVybywgaXMgdGhlIGVycm9yIG51bWJlcgorICAgY29ycmVzcG9uZGluZyB0byB0aGUgbW9zdCByZWNlbnQgYWN0aW9uIGZvciBJTl9TVFJFQU0uICAqLworCitzdGF0aWMgdm9pZAorY2hlY2tfYW5kX2Nsb3NlKHZvaWQpCit7CisJaWYgKGluX3N0cmVhbSkgeworCQlpZiAoZmVycm9yKGluX3N0cmVhbSkpCXsKKwkJCWJiX2Vycm9yX21zZygiJXM6IHJlYWQgZXJyb3IiLCAoaW5fc3RyZWFtID09IHN0ZGluKQorCQkJCQk/IGJiX21zZ19zdGFuZGFyZF9pbnB1dAorCQkJCQk6IGZpbGVfbGlzdFstMV0KKwkJCSk7CisJCQlleGl0X2NvZGUgPSAxOworCQl9CisJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oaW5fc3RyZWFtKTsKKwkJaW5fc3RyZWFtID0gTlVMTDsKKwl9CisKKwlpZiAoZmVycm9yKHN0ZG91dCkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwl9Cit9CisKKy8qIElmIFMgcG9pbnRzIHRvIGEgc2luZ2xlIHZhbGlkIG1vZGVybiBvZCBmb3JtYXQgc3RyaW5nLCBwdXQKKyAgIGEgZGVzY3JpcHRpb24gb2YgdGhhdCBmb3JtYXQgaW4gKlRTUEVDLCByZXR1cm4gcG9pbnRlciB0bworICAgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUganVzdC1kZWNvZGVkIGZvcm1hdC4KKyAgIEZvciBleGFtcGxlLCBpZiBTIHdlcmUgImQ0YWZMIiwgd2Ugd2lsbCByZXR1cm4gYSBydHAgdG8gImFmTCIKKyAgIGFuZCAqVFNQRUMgd291bGQgYmUKKwl7CisJCWZtdCA9IFNJR05FRF9ERUNJTUFMOworCQlzaXplID0gSU5UIG9yIExPTkc7ICh3aGljaGV2ZXIgaW50ZWdyYWxfdHlwZV9zaXplWzRdIHJlc29sdmVzIHRvKQorCQlwcmludF9mdW5jdGlvbiA9IHByaW50X2ludDsgKGFzc3VtaW5nIHNpemUgPT0gSU5UKQorCQlmbXRfc3RyaW5nID0gIiUwMTFkJWMiOworCX0KKyAgIFNfT1JJRyBpcyBzb2xlbHkgZm9yIHJlcG9ydGluZyBlcnJvcnMuICBJdCBzaG91bGQgYmUgdGhlIGZ1bGwgZm9ybWF0CisgICBzdHJpbmcgYXJndW1lbnQuICovCisKK3N0YXRpYyBOT0lOTElORSBjb25zdCBjaGFyICoKK2RlY29kZV9vbmVfZm9ybWF0KGNvbnN0IGNoYXIgKnNfb3JpZywgY29uc3QgY2hhciAqcywgc3RydWN0IHRzcGVjICp0c3BlYykKK3sKKwllbnVtIHNpemVfc3BlYyBzaXplX3NwZWM7CisJdW5zaWduZWQgc2l6ZTsKKwllbnVtIG91dHB1dF9mb3JtYXQgZm10OworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqZW5kOworCWNoYXIgKmZtdF9zdHJpbmcgPSBOVUxMOworCXZvaWQgKCpwcmludF9mdW5jdGlvbikgKHNpemVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCXVuc2lnbmVkIGM7CisJdW5zaWduZWQgZmllbGRfd2lkdGggPSAwOworCWludCBwb3M7CisKKwlzd2l0Y2ggKCpzKSB7CisJY2FzZSAnZCc6CisJY2FzZSAnbyc6CisJY2FzZSAndSc6CisJY2FzZSAneCc6IHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgQ1NJTFtdIEFMSUdOMSA9ICJDU0lMIjsKKworCQljID0gKnMrKzsKKwkJcCA9IHN0cmNocihDU0lMLCAqcyk7CisJCS8qIGlmICpzID09IE5VTCwgcCAhPSBOVUxMISBUZXN0Y2FzZTogIm9kIC10eCIgKi8KKwkJaWYgKCFwIHx8ICpwID09ICdcMCcpIHsKKwkJCXNpemUgPSBzaXplb2YoaW50KTsKKwkJCWlmIChpc2RpZ2l0KHNbMF0pKSB7CisJCQkJc2l6ZSA9IGJiX3N0cnRvdShzLCAmZW5kLCAwKTsKKwkJCQlpZiAoZXJybm8gPT0gRVJBTkdFCisJCQkJIHx8IE1BWF9JTlRFR1JBTF9UWVBFX1NJWkUgPCBzaXplCisJCQkJIHx8IGludGVncmFsX3R5cGVfc2l6ZVtzaXplXSA9PSBOT19TSVpFCisJCQkJKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHR5cGUgc3RyaW5nICclcyc7ICIKKwkJCQkJCSIldS1ieXRlICVzIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIsCisJCQkJCQlzX29yaWcsIHNpemUsICJpbnRlZ3JhbCIpOworCQkJCX0KKwkJCQlzID0gZW5kOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ1NJTF9zaXplb2ZbNF0gPSB7CisJCQkJc2l6ZW9mKGNoYXIpLAorCQkJCXNpemVvZihzaG9ydCksCisJCQkJc2l6ZW9mKGludCksCisJCQkJc2l6ZW9mKGxvbmcpLAorCQkJfTsKKwkJCXNpemUgPSBDU0lMX3NpemVvZltwIC0gQ1NJTF07CisJCQlzKys7IC8qIHNraXAgQy9TL0kvTCAqLworCQl9CisKKyNkZWZpbmUgSVNQRUNfVE9fRk9STUFUKFNwZWMsIE1pbl9mb3JtYXQsIExvbmdfZm9ybWF0LCBNYXhfZm9ybWF0KSBcCisJKChTcGVjKSA9PSBMT05HX0xPTkcgPyAoTWF4X2Zvcm1hdCkgXAorCTogKChTcGVjKSA9PSBMT05HID8gKExvbmdfZm9ybWF0KSA6IChNaW5fZm9ybWF0KSkpCisKKyNkZWZpbmUgRk1UX0JZVEVTX0FMTE9DQVRFRCA5CisJCXNpemVfc3BlYyA9IGludGVncmFsX3R5cGVfc2l6ZVtzaXplXTsKKworCQl7CisJCQlzdGF0aWMgY29uc3QgY2hhciBkb3V4W10gQUxJR04xID0gImRvdXgiOworCQkJc3RhdGljIGNvbnN0IGNoYXIgZG91eF9mbXRfbGV0dGVyW11bNF0gPSB7CisJCQkJImxsZCIsICJsbG8iLCAibGx1IiwgImxseCIKKwkJCX07CisJCQlzdGF0aWMgY29uc3QgZW51bSBvdXRwdXRfZm9ybWF0IGRvdXhfZm10W10gPSB7CisJCQkJU0lHTkVEX0RFQ0lNQUwsCisJCQkJT0NUQUwsCisJCQkJVU5TSUdORURfREVDSU1BTCwKKwkJCQlIRVhBREVDSU1BTCwKKwkJCX07CisJCQlzdGF0aWMgY29uc3QgdWludDhfdCAqY29uc3QgZG91eF9ieXRlc190b19YWFhbXSA9IHsKKwkJCQlieXRlc190b19zaWduZWRfZGVjX2RpZ2l0cywKKwkJCQlieXRlc190b19vY3RfZGlnaXRzLAorCQkJCWJ5dGVzX3RvX3Vuc2lnbmVkX2RlY19kaWdpdHMsCisJCQkJYnl0ZXNfdG9faGV4X2RpZ2l0cywKKwkJCX07CisJCQlzdGF0aWMgY29uc3QgY2hhciBkb3V4X2ZtdHN0cmluZ1tdW3NpemVvZigiICUlMCV1JXMiKV0gPSB7CisJCQkJIiAlJSV1JXMiLAorCQkJCSIgJSUwJXUlcyIsCisJCQkJIiAlJSV1JXMiLAorCQkJCSIgJSUwJXUlcyIsCisJCQl9OworCisJCQlwb3MgPSBzdHJjaHIoZG91eCwgYykgLSBkb3V4OworCQkJZm10ID0gZG91eF9mbXRbcG9zXTsKKwkJCWZpZWxkX3dpZHRoID0gZG91eF9ieXRlc190b19YWFhbcG9zXVtzaXplXTsKKwkJCXAgPSBkb3V4X2ZtdF9sZXR0ZXJbcG9zXSArIDI7CisJCQlpZiAoc2l6ZV9zcGVjID09IExPTkcpIHAtLTsKKwkJCWlmIChzaXplX3NwZWMgPT0gTE9OR19MT05HKSBwIC09IDI7CisJCQlmbXRfc3RyaW5nID0geGFzcHJpbnRmKGRvdXhfZm10c3RyaW5nW3Bvc10sIGZpZWxkX3dpZHRoLCBwKTsKKwkJfQorCisJCXN3aXRjaCAoc2l6ZV9zcGVjKSB7CisJCWNhc2UgQ0hBUjoKKwkJCXByaW50X2Z1bmN0aW9uID0gKGZtdCA9PSBTSUdORURfREVDSU1BTAorCQkJCSAgICA/IHByaW50X3NfY2hhcgorCQkJCSAgICA6IHByaW50X2NoYXIpOworCQkJYnJlYWs7CisJCWNhc2UgU0hPUlQ6CisJCQlwcmludF9mdW5jdGlvbiA9IChmbXQgPT0gU0lHTkVEX0RFQ0lNQUwKKwkJCQkgICAgPyBwcmludF9zX3Nob3J0CisJCQkJICAgIDogcHJpbnRfc2hvcnQpOworCQkJYnJlYWs7CisJCWNhc2UgSU5UOgorCQkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9pbnQ7CisJCQlicmVhazsKKwkJY2FzZSBMT05HOgorCQkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9sb25nOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGNhc2UgTE9OR19MT05HOiAqLworCQkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9sb25nX2xvbmc7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlICdmJzogeworCQlzdGF0aWMgY29uc3QgY2hhciBGRExbXSBBTElHTjEgPSAiRkRMIjsKKworCQlmbXQgPSBGTE9BVElOR19QT0lOVDsKKwkJKytzOworCQlwID0gc3RyY2hyKEZETCwgKnMpOworCQlpZiAoIXApIHsKKwkJCXNpemUgPSBzaXplb2YoZG91YmxlKTsKKwkJCWlmIChpc2RpZ2l0KHNbMF0pKSB7CisJCQkJc2l6ZSA9IGJiX3N0cnRvdShzLCAmZW5kLCAwKTsKKwkJCQlpZiAoZXJybm8gPT0gRVJBTkdFIHx8IHNpemUgPiBNQVhfRlBfVFlQRV9TSVpFCisJCQkJIHx8IGZwX3R5cGVfc2l6ZVtzaXplXSA9PSBOT19TSVpFCisJCQkJKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHR5cGUgc3RyaW5nICclcyc7ICIKKwkJCQkJCSIldS1ieXRlICVzIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIsCisJCQkJCQlzX29yaWcsIHNpemUsICJmbG9hdGluZyBwb2ludCIpOworCQkJCX0KKwkJCQlzID0gZW5kOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3QgRkRMX3NpemVvZltdID0geworCQkJCXNpemVvZihmbG9hdCksCisJCQkJc2l6ZW9mKGRvdWJsZSksCisJCQkJc2l6ZW9mKGxvbmdkb3VibGVfdCksCisJCQl9OworCisJCQlzaXplID0gRkRMX3NpemVvZltwIC0gRkRMXTsKKwkJfQorCisJCXNpemVfc3BlYyA9IGZwX3R5cGVfc2l6ZVtzaXplXTsKKworCQlzd2l0Y2ggKHNpemVfc3BlYykgeworCQljYXNlIEZMT0FUX1NJTkdMRToKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfZmxvYXQ7CisJCQlmaWVsZF93aWR0aCA9IEZMVF9ESUcgKyA4OworCQkJLyogRG9uJ3QgdXNlICUjZTsgbm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgaXQuICAqLworCQkJZm10X3N0cmluZyA9IHhhc3ByaW50ZigiICUlJWQuJWRlIiwgZmllbGRfd2lkdGgsIEZMVF9ESUcpOworCQkJYnJlYWs7CisJCWNhc2UgRkxPQVRfRE9VQkxFOgorCQkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9kb3VibGU7CisJCQlmaWVsZF93aWR0aCA9IERCTF9ESUcgKyA4OworCQkJZm10X3N0cmluZyA9IHhhc3ByaW50ZigiICUlJWQuJWRlIiwgZmllbGRfd2lkdGgsIERCTF9ESUcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGNhc2UgRkxPQVRfTE9OR19ET1VCTEU6ICovCisJCQlwcmludF9mdW5jdGlvbiA9IHByaW50X2xvbmdfZG91YmxlOworCQkJZmllbGRfd2lkdGggPSBMREJMX0RJRyArIDg7CisJCQlmbXRfc3RyaW5nID0geGFzcHJpbnRmKCIgJSUlZC4lZExlIiwgZmllbGRfd2lkdGgsIExEQkxfRElHKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgJ2EnOgorCQkrK3M7CisJCWZtdCA9IE5BTUVEX0NIQVJBQ1RFUjsKKwkJc2l6ZV9zcGVjID0gQ0hBUjsKKwkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9uYW1lZF9hc2NpaTsKKwkJZmllbGRfd2lkdGggPSAzOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJKytzOworCQlmbXQgPSBDSEFSQUNURVI7CisJCXNpemVfc3BlYyA9IENIQVI7CisJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfYXNjaWk7CisJCWZpZWxkX3dpZHRoID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgY2hhcmFjdGVyICclYycgIgorCQkJCSJpbiB0eXBlIHN0cmluZyAnJXMnIiwgKnMsIHNfb3JpZyk7CisJfQorCisJdHNwZWMtPnNpemUgPSBzaXplX3NwZWM7CisJdHNwZWMtPmZtdCA9IGZtdDsKKwl0c3BlYy0+cHJpbnRfZnVuY3Rpb24gPSBwcmludF9mdW5jdGlvbjsKKwl0c3BlYy0+Zm10X3N0cmluZyA9IGZtdF9zdHJpbmc7CisKKwl0c3BlYy0+ZmllbGRfd2lkdGggPSBmaWVsZF93aWR0aDsKKwl0c3BlYy0+aGV4bF9tb2RlX3RyYWlsZXIgPSAoKnMgPT0gJ3onKTsKKwlpZiAodHNwZWMtPmhleGxfbW9kZV90cmFpbGVyKQorCQlzKys7CisKKwlyZXR1cm4gczsKK30KKworLyogRGVjb2RlIHRoZSBtb2Rlcm4gb2QgZm9ybWF0IHN0cmluZyBTLiAgQXBwZW5kIHRoZSBkZWNvZGVkCisgICByZXByZXNlbnRhdGlvbiB0byB0aGUgZ2xvYmFsIGFycmF5IFNQRUMsIHJlYWxsb2NhdGluZyBTUEVDIGlmCisgICBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgdm9pZAorZGVjb2RlX2Zvcm1hdF9zdHJpbmcoY29uc3QgY2hhciAqcykKK3sKKwljb25zdCBjaGFyICpzX29yaWcgPSBzOworCisJd2hpbGUgKCpzICE9ICdcMCcpIHsKKwkJc3RydWN0IHRzcGVjIHRzcGVjOworCQljb25zdCBjaGFyICpuZXh0OworCisJCW5leHQgPSBkZWNvZGVfb25lX2Zvcm1hdChzX29yaWcsIHMsICZ0c3BlYyk7CisKKwkJYXNzZXJ0KHMgIT0gbmV4dCk7CisJCXMgPSBuZXh0OworCQlzcGVjID0geHJlYWxsb2NfdmVjdG9yKHNwZWMsIDQsIG5fc3BlY3MpOworCQltZW1jcHkoJnNwZWNbbl9zcGVjc10sICZ0c3BlYywgc2l6ZW9mKHNwZWNbMF0pKTsKKwkJbl9zcGVjcysrOworCX0KK30KKworLyogR2l2ZW4gYSBsaXN0IG9mIG9uZSBvciBtb3JlIGlucHV0IGZpbGVuYW1lcyBGSUxFX0xJU1QsIHNldCB0aGUgZ2xvYmFsCisgICBmaWxlIHBvaW50ZXIgSU5fU1RSRUFNIHRvIHBvc2l0aW9uIE5fU0tJUCBpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZgorICAgdGhvc2UgZmlsZXMuICBJZiBhbnkgZmlsZSBvcGVyYXRpb24gZmFpbHMgb3IgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4KKyAgIE5fU0tJUCBieXRlcyBpbiB0aGUgY29tYmluZWQgaW5wdXQsIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuCisgICBub256ZXJvLiAgV2hlbiBwb3NzaWJsZSwgdXNlIHNlZWsgcmF0aGVyIHRoYW4gcmVhZCBvcGVyYXRpb25zIHRvCisgICBhZHZhbmNlIElOX1NUUkVBTS4gICovCisKK3N0YXRpYyB2b2lkCitza2lwKG9mZl90IG5fc2tpcCkKK3sKKwlpZiAobl9za2lwID09IDApCisJCXJldHVybjsKKworCXdoaWxlIChpbl9zdHJlYW0pIHsgLyogIUVPRiAqLworCQlzdHJ1Y3Qgc3RhdCBmaWxlX3N0YXRzOworCisJCS8qIEZpcnN0IHRyeSBzZWVraW5nLiAgRm9yIGxhcmdlIG9mZnNldHMsIHRoaXMgZXh0cmEgd29yayBpcworCQkgICB3b3J0aHdoaWxlLiAgSWYgdGhlIG9mZnNldCBpcyBiZWxvdyBzb21lIHRocmVzaG9sZCBpdCBtYXkgYmUKKwkJICAgbW9yZSBlZmZpY2llbnQgdG8gbW92ZSB0aGUgcG9pbnRlciBieSByZWFkaW5nLiAgVGhlcmUgYXJlIHR3bworCQkgICBpc3N1ZXMgd2hlbiB0cnlpbmcgdG8gc2VlazoKKwkJCS0gdGhlIGZpbGUgbXVzdCBiZSBzZWVrYWJsZS4KKwkJCS0gYmVmb3JlIHNlZWtpbmcgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbiwgbWFrZSBzdXJlCisJCQkgIHRoYXQgdGhlIG5ldyBwb3NpdGlvbiBpcyBpbiB0aGUgY3VycmVudCBmaWxlLgorCQkJICBUcnkgdG8gZG8gdGhhdCBieSBnZXR0aW5nIGZpbGUncyBzaXplIHVzaW5nIGZzdGF0LgorCQkJICBCdXQgdGhhdCB3aWxsIHdvcmsgb25seSBmb3IgcmVndWxhciBmaWxlcy4gICovCisKKwkJCS8qIFRoZSBzdF9zaXplIGZpZWxkIGlzIHZhbGlkIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMKKwkJCSAgIChhbmQgZm9yIHN5bWJvbGljIGxpbmtzLCB3aGljaCBjYW5ub3Qgb2NjdXIgaGVyZSkuCisJCQkgICBJZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gc2tpcCBpcyBhdCBsZWFzdAorCQkJICAgYXMgbGFyZ2UgYXMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZmlsZSwgd2UgY2FuCisJCQkgICBkZWNyZW1lbnQgbl9za2lwIGFuZCBnbyBvbiB0byB0aGUgbmV4dCBmaWxlLiAgKi8KKwkJaWYgKGZzdGF0KGZpbGVubyhpbl9zdHJlYW0pLCAmZmlsZV9zdGF0cykgPT0gMAorCQkgJiYgU19JU1JFRyhmaWxlX3N0YXRzLnN0X21vZGUpICYmIGZpbGVfc3RhdHMuc3Rfc2l6ZSA+IDAKKwkJKSB7CisJCQlpZiAoZmlsZV9zdGF0cy5zdF9zaXplIDwgbl9za2lwKSB7CisJCQkJbl9za2lwIC09IGZpbGVfc3RhdHMuc3Rfc2l6ZTsKKwkJCQkvKiB0YWtlICJjaGVjayAmIGNsb3NlIC8gb3Blbl9uZXh0IiByb3V0ZSAqLworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZnNlZWtvKGluX3N0cmVhbSwgbl9za2lwLCBTRUVLX0NVUikgIT0gMCkKKwkJCQkJZXhpdF9jb2RlID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBJZiBpdCdzIG5vdCBhIHJlZ3VsYXIgZmlsZSB3aXRoIHBvc2l0aXZlIHNpemUsCisJCQkgICBwb3NpdGlvbiB0aGUgZmlsZSBwb2ludGVyIGJ5IHJlYWRpbmcuICAqLworCQkJY2hhciBidWZbMTAyNF07CisJCQlzaXplX3Qgbl9ieXRlc190b19yZWFkID0gMTAyNDsKKwkJCXNpemVfdCBuX2J5dGVzX3JlYWQ7CisKKwkJCXdoaWxlIChuX3NraXAgPiAwKSB7CisJCQkJaWYgKG5fc2tpcCA8IG5fYnl0ZXNfdG9fcmVhZCkKKwkJCQkJbl9ieXRlc190b19yZWFkID0gbl9za2lwOworCQkJCW5fYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgbl9ieXRlc190b19yZWFkLCBpbl9zdHJlYW0pOworCQkJCW5fc2tpcCAtPSBuX2J5dGVzX3JlYWQ7CisJCQkJaWYgKG5fYnl0ZXNfcmVhZCAhPSBuX2J5dGVzX3RvX3JlYWQpCisJCQkJCWJyZWFrOyAvKiBFT0Ygb24gdGhpcyBmaWxlIG9yIGVycm9yICovCisJCQl9CisJCX0KKwkJaWYgKG5fc2tpcCA9PSAwKQorCQkJcmV0dXJuOworCisJCWNoZWNrX2FuZF9jbG9zZSgpOworCQlvcGVuX25leHRfZmlsZSgpOworCX0KKworCWlmIChuX3NraXApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBza2lwIHBhc3QgZW5kIG9mIGNvbWJpbmVkIGlucHV0Iik7Cit9CisKKwordHlwZWRlZiB2b2lkIEZOX2Zvcm1hdF9hZGRyZXNzKG9mZl90IGFkZHJlc3MsIGNoYXIgYyk7CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfYWRkcmVzc19ub25lKG9mZl90IGFkZHJlc3MgVU5VU0VEX1BBUkFNLCBjaGFyIGMgVU5VU0VEX1BBUkFNKQoreworfQorCitzdGF0aWMgY2hhciBhZGRyZXNzX2ZtdFtdIEFMSUdOMSA9ICIlMG4iT0ZGX0ZNVCJ4YyI7CisvKiBDb3JyZXNwb25kcyB0byAneCcgYWJvdmUgKi8KKyNkZWZpbmUgYWRkcmVzc19iYXNlX2NoYXIgYWRkcmVzc19mbXRbc2l6ZW9mKGFkZHJlc3NfZm10KS0zXQorLyogQ29ycmVzcG9uZHMgdG8gJ24nIGFib3ZlICovCisjZGVmaW5lIGFkZHJlc3NfcGFkX2xlbl9jaGFyIGFkZHJlc3NfZm10WzJdCisKK3N0YXRpYyB2b2lkCitmb3JtYXRfYWRkcmVzc19zdGQob2ZmX3QgYWRkcmVzcywgY2hhciBjKQoreworCS8qIENvcnJlc3BvbmRzIHRvICdjJyAqLworCWFkZHJlc3NfZm10W3NpemVvZihhZGRyZXNzX2ZtdCktMl0gPSBjOworCXByaW50ZihhZGRyZXNzX2ZtdCwgYWRkcmVzcyk7Cit9CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisvKiBvbmx5IHVzZWQgd2l0aCAtLXRyYWRpdGlvbmFsICovCitzdGF0aWMgdm9pZAorZm9ybWF0X2FkZHJlc3NfcGFyZW4ob2ZmX3QgYWRkcmVzcywgY2hhciBjKQoreworCXB1dGNoYXIoJygnKTsKKwlmb3JtYXRfYWRkcmVzc19zdGQoYWRkcmVzcywgJyknKTsKKwlpZiAoYykgcHV0Y2hhcihjKTsKK30KKworc3RhdGljIHZvaWQKK2Zvcm1hdF9hZGRyZXNzX2xhYmVsKG9mZl90IGFkZHJlc3MsIGNoYXIgYykKK3sKKwlmb3JtYXRfYWRkcmVzc19zdGQoYWRkcmVzcywgJyAnKTsKKwlmb3JtYXRfYWRkcmVzc19wYXJlbihhZGRyZXNzICsgcHNldWRvX29mZnNldCwgYyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2R1bXBfaGV4bF9tb2RlX3RyYWlsZXIoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrKQoreworCWZwdXRzKCIgID4iLCBzdGRvdXQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgYyA9ICoodW5zaWduZWQgY2hhciAqKSBibG9jaysrOworCQljID0gKElTUFJJTlQoYykgPyBjIDogJy4nKTsKKwkJcHV0Y2hhcihjKTsKKwl9CisJcHV0Y2hhcignPCcpOworfQorCisvKiBXcml0ZSBOX0JZVEVTIGJ5dGVzIGZyb20gQ1VSUl9CTE9DSyB0byBzdGFuZGFyZCBvdXRwdXQgb25jZSBmb3IgZWFjaAorICAgb2YgdGhlIE5fU1BFQyBmb3JtYXQgc3BlY3MuICBDVVJSRU5UX09GRlNFVCBpcyB0aGUgYnl0ZSBhZGRyZXNzIG9mCisgICBDVVJSX0JMT0NLIGluIHRoZSBjb25jYXRlbmF0aW9uIG9mIGlucHV0IGZpbGVzLCBhbmQgaXQgaXMgcHJpbnRlZAorICAgKG9wdGlvbmFsbHkpIG9ubHkgYmVmb3JlIHRoZSBvdXRwdXQgbGluZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0CisgICBmb3JtYXQgc3BlYy4gIFdoZW4gZHVwbGljYXRlIGJsb2NrcyBhcmUgYmVpbmcgYWJicmV2aWF0ZWQsIHRoZSBvdXRwdXQKKyAgIGZvciBhIHNlcXVlbmNlIG9mIGlkZW50aWNhbCBpbnB1dCBibG9ja3MgaXMgdGhlIG91dHB1dCBmb3IgdGhlIGZpcnN0CisgICBibG9jayBmb2xsb3dlZCBieSBhbiBhc3RlcmlzayBhbG9uZSBvbiBhIGxpbmUuICBJdCBpcyB2YWxpZCB0byBjb21wYXJlCisgICB0aGUgYmxvY2tzIFBSRVZfQkxPQ0sgYW5kIENVUlJfQkxPQ0sgb25seSB3aGVuIE5fQllURVMgPT0gQllURVNfUEVSX0JMT0NLLgorICAgVGhhdCBjb25kaXRpb24gbWF5IGJlIGZhbHNlIG9ubHkgZm9yIHRoZSBsYXN0IGlucHV0IGJsb2NrIC0tIGFuZCB0aGVuCisgICBvbmx5IHdoZW4gaXQgaGFzIG5vdCBiZWVuIHBhZGRlZCB0byBsZW5ndGggQllURVNfUEVSX0JMT0NLLiAgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX2Jsb2NrKG9mZl90IGN1cnJlbnRfb2Zmc2V0LCBzaXplX3Qgbl9ieXRlcywKKwkJY29uc3QgY2hhciAqcHJldl9ibG9jaywgY29uc3QgY2hhciAqY3Vycl9ibG9jaykKK3sKKwlzdGF0aWMgY2hhciBmaXJzdCA9IDE7CisJc3RhdGljIGNoYXIgcHJldl9wYWlyX2VxdWFsID0gMDsKKwlzaXplX3QgaTsKKworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikKKwkgJiYgIWZpcnN0CisJICYmIG5fYnl0ZXMgPT0gYnl0ZXNfcGVyX2Jsb2NrCisJICYmIG1lbWNtcChwcmV2X2Jsb2NrLCBjdXJyX2Jsb2NrLCBieXRlc19wZXJfYmxvY2spID09IDAKKwkpIHsKKwkJaWYgKHByZXZfcGFpcl9lcXVhbCkgeworCQkJLyogVGhlIHR3byBwcmVjZWRpbmcgYmxvY2tzIHdlcmUgZXF1YWwsIGFuZCB0aGUgY3VycmVudAorCQkJICAgYmxvY2sgaXMgdGhlIHNhbWUgYXMgdGhlIGxhc3Qgb25lLCBzbyBwcmludCBub3RoaW5nLiAgKi8KKwkJfSBlbHNlIHsKKwkJCXB1dHMoIioiKTsKKwkJCXByZXZfcGFpcl9lcXVhbCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlmaXJzdCA9IDA7CisJCXByZXZfcGFpcl9lcXVhbCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuX3NwZWNzOyBpKyspIHsKKwkJCWlmIChpID09IDApCisJCQkJZm9ybWF0X2FkZHJlc3MoY3VycmVudF9vZmZzZXQsICdcMCcpOworCQkJZWxzZQorCQkJCXByaW50ZigiJSpzIiwgYWRkcmVzc19wYWRfbGVuX2NoYXIgLSAnMCcsICIiKTsKKwkJCSgqc3BlY1tpXS5wcmludF9mdW5jdGlvbikgKG5fYnl0ZXMsIGN1cnJfYmxvY2ssIHNwZWNbaV0uZm10X3N0cmluZyk7CisJCQlpZiAoc3BlY1tpXS5oZXhsX21vZGVfdHJhaWxlcikgeworCQkJCS8qIHNwYWNlLXBhZCBvdXQgdG8gZnVsbCBsaW5lIHdpZHRoLCB0aGVuIGR1bXAgdGhlIHRyYWlsZXIgKi8KKwkJCQl1bnNpZ25lZCBkYXR1bV93aWR0aCA9IHdpZHRoX2J5dGVzW3NwZWNbaV0uc2l6ZV07CisJCQkJdW5zaWduZWQgYmxhbmtfZmllbGRzID0gKGJ5dGVzX3Blcl9ibG9jayAtIG5fYnl0ZXMpIC8gZGF0dW1fd2lkdGg7CisJCQkJdW5zaWduZWQgZmllbGRfd2lkdGggPSBzcGVjW2ldLmZpZWxkX3dpZHRoICsgMTsKKwkJCQlwcmludGYoIiUqcyIsIGJsYW5rX2ZpZWxkcyAqIGZpZWxkX3dpZHRoLCAiIik7CisJCQkJZHVtcF9oZXhsX21vZGVfdHJhaWxlcihuX2J5dGVzLCBjdXJyX2Jsb2NrKTsKKwkJCX0KKwkJCXB1dGNoYXIoJ1xuJyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2Jsb2NrKHNpemVfdCBuLCBjaGFyICpibG9jaywgc2l6ZV90ICpuX2J5dGVzX2luX2J1ZmZlcikKK3sKKwlhc3NlcnQoMCA8IG4gJiYgbiA8PSBieXRlc19wZXJfYmxvY2spOworCisJKm5fYnl0ZXNfaW5fYnVmZmVyID0gMDsKKworCWlmIChuID09IDApCisJCXJldHVybjsKKworCXdoaWxlIChpbl9zdHJlYW0gIT0gTlVMTCkgeyAvKiBFT0YuICAqLworCQlzaXplX3Qgbl9uZWVkZWQ7CisJCXNpemVfdCBuX3JlYWQ7CisKKwkJbl9uZWVkZWQgPSBuIC0gKm5fYnl0ZXNfaW5fYnVmZmVyOworCQluX3JlYWQgPSBmcmVhZChibG9jayArICpuX2J5dGVzX2luX2J1ZmZlciwgMSwgbl9uZWVkZWQsIGluX3N0cmVhbSk7CisJCSpuX2J5dGVzX2luX2J1ZmZlciArPSBuX3JlYWQ7CisJCWlmIChuX3JlYWQgPT0gbl9uZWVkZWQpCisJCQlicmVhazsKKwkJLyogZXJyb3IgY2hlY2sgaXMgZG9uZSBpbiBjaGVja19hbmRfY2xvc2UgKi8KKwkJY2hlY2tfYW5kX2Nsb3NlKCk7CisJCW9wZW5fbmV4dF9maWxlKCk7CisJfQorfQorCisvKiBSZXR1cm4gdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiB0aGUgc2l6ZXMgYXNzb2NpYXRlZAorICAgd2l0aCB0aGUgZm9ybWF0IHNwZWNzLiAgKi8KKworc3RhdGljIGludAorZ2V0X2xjbSh2b2lkKQoreworCXNpemVfdCBpOworCWludCBsX2NfbSA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9zcGVjczsgaSsrKQorCQlsX2NfbSA9IGxjbShsX2NfbSwgd2lkdGhfYnl0ZXNbKGludCkgc3BlY1tpXS5zaXplXSk7CisJcmV0dXJuIGxfY19tOworfQorCisvKiBSZWFkIGEgY2h1bmsgb2Ygc2l6ZSBCWVRFU19QRVJfQkxPQ0sgZnJvbSB0aGUgaW5wdXQgZmlsZXMsIHdyaXRlIHRoZQorICAgZm9ybWF0dGVkIGJsb2NrIHRvIHN0YW5kYXJkIG91dHB1dCwgYW5kIHJlcGVhdCB1bnRpbCB0aGUgc3BlY2lmaWVkCisgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBoYXMgYmVlbiByZWFkIG9yIHVudGlsIGFsbCBpbnB1dCBoYXMgYmVlbgorICAgcHJvY2Vzc2VkLiAgSWYgdGhlIGxhc3QgYmxvY2sgcmVhZCBpcyBzbWFsbGVyIHRoYW4gQllURVNfUEVSX0JMT0NLCisgICBhbmQgaXRzIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHNpemUgYXNzb2NpYXRlZCB3aXRoIGEgZm9ybWF0CisgICBzcGVjLCBleHRlbmQgdGhlIGlucHV0IGJsb2NrIHdpdGggemVybyBieXRlcyB1bnRpbCBpdHMgbGVuZ3RoIGlzIGEKKyAgIG11bHRpcGxlIG9mIGFsbCBmb3JtYXQgc3BlYyBzaXplcy4gIFdyaXRlIHRoZSBmaW5hbCBibG9jay4gIEZpbmFsbHksCisgICB3cml0ZSBvbiBhIGxpbmUgYnkgaXRzZWxmIHRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgYWZ0ZXIgdGhlIGxhc3QgYnl0ZQorICAgcmVhZC4gICovCisKK3N0YXRpYyB2b2lkCitkdW1wKG9mZl90IGN1cnJlbnRfb2Zmc2V0LCBvZmZfdCBlbmRfb2Zmc2V0KQoreworCWNoYXIgKmJsb2NrWzJdOworCWludCBpZHg7CisJc2l6ZV90IG5fYnl0ZXNfcmVhZDsKKworCWJsb2NrWzBdID0geG1hbGxvYygyICogYnl0ZXNfcGVyX2Jsb2NrKTsKKwlibG9ja1sxXSA9IGJsb2NrWzBdICsgYnl0ZXNfcGVyX2Jsb2NrOworCisJaWR4ID0gMDsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9OKSB7CisJCXdoaWxlICgxKSB7CisJCQlzaXplX3Qgbl9uZWVkZWQ7CisJCQlpZiAoY3VycmVudF9vZmZzZXQgPj0gZW5kX29mZnNldCkgeworCQkJCW5fYnl0ZXNfcmVhZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQluX25lZWRlZCA9IE1JTihlbmRfb2Zmc2V0IC0gY3VycmVudF9vZmZzZXQsIChvZmZfdCkgYnl0ZXNfcGVyX2Jsb2NrKTsKKwkJCXJlYWRfYmxvY2sobl9uZWVkZWQsIGJsb2NrW2lkeF0sICZuX2J5dGVzX3JlYWQpOworCQkJaWYgKG5fYnl0ZXNfcmVhZCA8IGJ5dGVzX3Blcl9ibG9jaykKKwkJCQlicmVhazsKKwkJCWFzc2VydChuX2J5dGVzX3JlYWQgPT0gYnl0ZXNfcGVyX2Jsb2NrKTsKKwkJCXdyaXRlX2Jsb2NrKGN1cnJlbnRfb2Zmc2V0LCBuX2J5dGVzX3JlYWQsIGJsb2NrW2lkeCBeIDFdLCBibG9ja1tpZHhdKTsKKwkJCWN1cnJlbnRfb2Zmc2V0ICs9IG5fYnl0ZXNfcmVhZDsKKwkJCWlkeCBePSAxOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKDEpIHsKKwkJCXJlYWRfYmxvY2soYnl0ZXNfcGVyX2Jsb2NrLCBibG9ja1tpZHhdLCAmbl9ieXRlc19yZWFkKTsKKwkJCWlmIChuX2J5dGVzX3JlYWQgPCBieXRlc19wZXJfYmxvY2spCisJCQkJYnJlYWs7CisJCQlhc3NlcnQobl9ieXRlc19yZWFkID09IGJ5dGVzX3Blcl9ibG9jayk7CisJCQl3cml0ZV9ibG9jayhjdXJyZW50X29mZnNldCwgbl9ieXRlc19yZWFkLCBibG9ja1tpZHggXiAxXSwgYmxvY2tbaWR4XSk7CisJCQljdXJyZW50X29mZnNldCArPSBuX2J5dGVzX3JlYWQ7CisJCQlpZHggXj0gMTsKKwkJfQorCX0KKworCWlmIChuX2J5dGVzX3JlYWQgPiAwKSB7CisJCWludCBsX2NfbTsKKwkJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOworCisJCWxfY19tID0gZ2V0X2xjbSgpOworCisJCS8qIE1ha2UgYnl0ZXNfdG9fd3JpdGUgdGhlIHNtYWxsZXN0IG11bHRpcGxlIG9mIGxfY19tIHRoYXQKKwkJCSBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyBuX2J5dGVzX3JlYWQuICAqLworCQlieXRlc190b193cml0ZSA9IGxfY19tICogKChuX2J5dGVzX3JlYWQgKyBsX2NfbSAtIDEpIC8gbF9jX20pOworCisJCW1lbXNldChibG9ja1tpZHhdICsgbl9ieXRlc19yZWFkLCAwLCBieXRlc190b193cml0ZSAtIG5fYnl0ZXNfcmVhZCk7CisJCXdyaXRlX2Jsb2NrKGN1cnJlbnRfb2Zmc2V0LCBieXRlc190b193cml0ZSwKKwkJCQkgICBibG9ja1tpZHggXiAxXSwgYmxvY2tbaWR4XSk7CisJCWN1cnJlbnRfb2Zmc2V0ICs9IG5fYnl0ZXNfcmVhZDsKKwl9CisKKwlmb3JtYXRfYWRkcmVzcyhjdXJyZW50X29mZnNldCwgJ1xuJyk7CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfTikgJiYgY3VycmVudF9vZmZzZXQgPj0gZW5kX29mZnNldCkKKwkJY2hlY2tfYW5kX2Nsb3NlKCk7CisKKwlmcmVlKGJsb2NrWzBdKTsKK30KKworLyogUmVhZCBOIGJ5dGVzIGludG8gQkxPQ0sgZnJvbSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5wdXQgZmlsZXMKKyAgIG5hbWVkIGluIHRoZSBnbG9iYWwgYXJyYXkgRklMRV9MSVNULiAgT24gdGhlIGZpcnN0IGNhbGwgdG8gdGhpcworICAgZnVuY3Rpb24sIHRoZSBnbG9iYWwgdmFyaWFibGUgSU5fU1RSRUFNIGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9wZW4KKyAgIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IGZpbGUgSU5QVVRfRklMRU5BTUUuICBJZiBhbGwgTgorICAgYnl0ZXMgY2Fubm90IGJlIHJlYWQgZnJvbSBJTl9TVFJFQU0sIGNsb3NlIElOX1NUUkVBTSBhbmQgdXBkYXRlCisgICB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBJTl9TVFJFQU0gYW5kIElOUFVUX0ZJTEVOQU1FLiAgVGhlbiB0cnkgdG8KKyAgIHJlYWQgdGhlIHJlbWFpbmluZyBieXRlcyBmcm9tIHRoZSBuZXdseSBvcGVuZWQgZmlsZS4gIFJlcGVhdCBpZgorICAgbmVjZXNzYXJ5IHVudGlsIEVPRiBpcyByZWFjaGVkIGZvciB0aGUgbGFzdCBmaWxlIGluIEZJTEVfTElTVC4KKyAgIE9uIHN1YnNlcXVlbnQgY2FsbHMsIGRvbid0IG1vZGlmeSBCTE9DSyBhbmQgcmV0dXJuIHplcm8uICBTZXQKKyAgICpOX0JZVEVTX0lOX0JVRkZFUiB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBJZiBhbiBlcnJvciBvY2N1cnMsCisgICBpdCB3aWxsIGJlIGRldGVjdGVkIHRocm91Z2ggZmVycm9yIHdoZW4gdGhlIHN0cmVhbSBpcyBhYm91dCB0byBiZQorICAgY2xvc2VkLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIGdpdmUgYSBtZXNzYWdlIGJ1dCBjb250aW51ZSByZWFkaW5nCisgICBhcyB1c3VhbCBhbmQgcmV0dXJuIG5vbnplcm8uICBPdGhlcndpc2UgcmV0dXJuIHplcm8uICAqLworCisvKiBTVFJJTkdTIG1vZGUuICBGaW5kIGVhY2ggInN0cmluZyBjb25zdGFudCIgaW4gdGhlIGlucHV0LgorICAgQSBzdHJpbmcgY29uc3RhbnQgaXMgYSBydW4gb2YgYXQgbGVhc3QgJ3N0cmluZ19taW4nIEFTQ0lJCisgICBncmFwaGljIChvciBmb3JtYXR0aW5nKSBjaGFyYWN0ZXJzIHRlcm1pbmF0ZWQgYnkgYSBudWxsLgorICAgQmFzZWQgb24gYSBmdW5jdGlvbiB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gZm9yIGEKKyAgIHRyYWRpdGlvbmFsIHZlcnNpb24gb2Ygb2QuICAqLworCitzdGF0aWMgdm9pZAorZHVtcF9zdHJpbmdzKG9mZl90IGFkZHJlc3MsIG9mZl90IGVuZF9vZmZzZXQpCit7CisJdW5zaWduZWQgYnVmc2l6ZSA9IE1BWCgxMDAsIHN0cmluZ19taW4pOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHhtYWxsb2MoYnVmc2l6ZSk7CisKKwl3aGlsZSAoMSkgeworCQlzaXplX3QgaTsKKwkJaW50IGM7CisKKwkJLyogU2VlIGlmIHRoZSBuZXh0ICdzdHJpbmdfbWluJyBjaGFycyBhcmUgYWxsIHByaW50aW5nIGNoYXJzLiAgKi8KKyB0cnlsaW5lOgorCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfTikgJiYgKGVuZF9vZmZzZXQgLSBzdHJpbmdfbWluIDw9IGFkZHJlc3MpKQorCQkJYnJlYWs7CisJCWkgPSAwOworCQl3aGlsZSAoIShvcHRpb25fbWFzazMyICYgT1BUX04pIHx8IGFkZHJlc3MgPCBlbmRfb2Zmc2V0KSB7CisJCQlpZiAoaSA9PSBidWZzaXplKSB7CisJCQkJYnVmc2l6ZSArPSBidWZzaXplLzg7CisJCQkJYnVmID0geHJlYWxsb2MoYnVmLCBidWZzaXplKTsKKwkJCX0KKworCQkJd2hpbGUgKGluX3N0cmVhbSkgeyAvKiAhRU9GICovCisJCQkJYyA9IGZnZXRjKGluX3N0cmVhbSk7CisJCQkJaWYgKGMgIT0gRU9GKQorCQkJCQlnb3RvIGdvdF9jaGFyOworCQkJCWNoZWNrX2FuZF9jbG9zZSgpOworCQkJCW9wZW5fbmV4dF9maWxlKCk7CisJCQl9CisJCQkvKiBFT0YgKi8KKwkJCWdvdG8gcmV0OworIGdvdF9jaGFyOgorCQkJYWRkcmVzcysrOworCQkJaWYgKCFjKQorCQkJCWJyZWFrOworCQkJaWYgKCFJU1BSSU5UKGMpKQorCQkJCWdvdG8gdHJ5bGluZTsJLyogSXQgaXNuJ3Q7IGdpdmUgdXAgb24gdGhpcyBzdHJpbmcuICAqLworCQkJYnVmW2krK10gPSBjOwkJLyogU3RyaW5nIGNvbnRpbnVlczsgc3RvcmUgaXQgYWxsLiAgKi8KKwkJfQorCisJCWlmIChpIDwgc3RyaW5nX21pbikJCS8qIFRvbyBzaG9ydCEgKi8KKwkJCWdvdG8gdHJ5bGluZTsKKworCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIHN0cmluZyBpcyBhbGwgcHJpbnRhYmxlIGFuZCBOVUwtdGVybWluYXRlZCAqLworCQlidWZbaV0gPSAwOworCQlmb3JtYXRfYWRkcmVzcyhhZGRyZXNzIC0gaSAtIDEsICcgJyk7CisKKwkJZm9yIChpID0gMDsgKGMgPSBidWZbaV0pOyBpKyspIHsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXDAwNyc6IGZwdXRzKCJcXGEiLCBzdGRvdXQpOyBicmVhazsKKwkJCWNhc2UgJ1xiJzogZnB1dHMoIlxcYiIsIHN0ZG91dCk7IGJyZWFrOworCQkJY2FzZSAnXGYnOiBmcHV0cygiXFxmIiwgc3Rkb3V0KTsgYnJlYWs7CisJCQljYXNlICdcbic6IGZwdXRzKCJcXG4iLCBzdGRvdXQpOyBicmVhazsKKwkJCWNhc2UgJ1xyJzogZnB1dHMoIlxcciIsIHN0ZG91dCk7IGJyZWFrOworCQkJY2FzZSAnXHQnOiBmcHV0cygiXFx0Iiwgc3Rkb3V0KTsgYnJlYWs7CisJCQljYXNlICdcdic6IGZwdXRzKCJcXHYiLCBzdGRvdXQpOyBicmVhazsKKwkJCWRlZmF1bHQ6IHB1dGNoYXIoYyk7CisJCQl9CisJCX0KKwkJcHV0Y2hhcignXG4nKTsKKwl9CisKKwkvKiBXZSByZWFjaCB0aGlzIHBvaW50IG9ubHkgaWYgd2Ugc2VhcmNoIHRocm91Z2gKKwkgICAobWF4X2J5dGVzX3RvX2Zvcm1hdCAtIHN0cmluZ19taW4pIGJ5dGVzIGJlZm9yZSByZWFjaGluZyBFT0YuICAqLworCWNoZWNrX2FuZF9jbG9zZSgpOworIHJldDoKKwlmcmVlKGJ1Zik7Cit9CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisvKiBJZiBTIGlzIGEgdmFsaWQgdHJhZGl0aW9uYWwgb2Zmc2V0IHNwZWNpZmljYXRpb24gd2l0aCBhbiBvcHRpb25hbAorICAgbGVhZGluZyAnKycgcmV0dXJuIG5vbnplcm8gYW5kIHNldCAqT0ZGU0VUIHRvIHRoZSBvZmZzZXQgaXQgZGVub3Rlcy4gICovCisKK3N0YXRpYyBpbnQKK3BhcnNlX29sZF9vZmZzZXQoY29uc3QgY2hhciAqcywgb2ZmX3QgKm9mZnNldCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IEJiW10gPSB7CisJCXsgIkIiLCAxMDI0IH0sCisJCXsgImIiLCA1MTIgfSwKKwkJeyAiIiwgMCB9CisJfTsKKwljaGFyICpwOworCWludCByYWRpeDsKKworCS8qIFNraXAgb3ZlciBhbnkgbGVhZGluZyAnKycuICovCisJaWYgKHNbMF0gPT0gJysnKSArK3M7CisJaWYgKCFpc2RpZ2l0KHNbMF0pKSByZXR1cm4gMDsgLyogbm90IGEgbnVtYmVyICovCisKKwkvKiBEZXRlcm1pbmUgdGhlIHJhZGl4IHdlJ2xsIHVzZSB0byBpbnRlcnByZXQgUy4gIElmIHRoZXJlIGlzIGEgJy4nLAorCSAqIGl0J3MgZGVjaW1hbCwgb3RoZXJ3aXNlLCBpZiB0aGUgc3RyaW5nIGJlZ2lucyB3aXRoICcwWCdvciAnMHgnLAorCSAqIGl0J3MgaGV4YWRlY2ltYWwsIGVsc2Ugb2N0YWwuICAqLworCXAgPSBzdHJjaHIocywgJy4nKTsKKwlyYWRpeCA9IDg7CisJaWYgKHApIHsKKwkJcFswXSA9ICdcMCc7IC8qIGNoZWF0aW5nICovCisJCXJhZGl4ID0gMTA7CisJfSBlbHNlIGlmIChzWzBdID09ICcwJyAmJiAoc1sxXSA9PSAneCcgfHwgc1sxXSA9PSAnWCcpKQorCQlyYWRpeCA9IDE2OworCisJKm9mZnNldCA9IHhzdHJ0b29mZl9zZngocywgcmFkaXgsIEJiKTsKKwlpZiAocCkgcFswXSA9ICcuJzsKKworCXJldHVybiAoKm9mZnNldCA+PSAwKTsKK30KKyNlbmRpZgorCitpbnQgb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG9kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IGJrbVtdID0geworCQl7ICJiIiwgNTEyIH0sCisJCXsgImsiLCAxMDI0IH0sCisJCXsgIm0iLCAxMDI0KjEwMjQgfSwKKwkJeyAiIiwgMCB9CisJfTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgb2RfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkic2tpcC1ieXRlc1wwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImoiCisJCSJhZGRyZXNzLXJhZGl4XDAiICAgICBSZXF1aXJlZF9hcmd1bWVudCAiQSIKKwkJInJlYWQtYnl0ZXNcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJOIgorCQkiZm9ybWF0XDAiICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInQiCisJCSJvdXRwdXQtZHVwbGljYXRlc1wwIiBOb19hcmd1bWVudCAgICAgICAidiIKKwkJLyogWWVzLCBpdCdzIHRydWU6IC1TIE5VTSwgYnV0IC0tc3RyaW5nc1s9TlVNXSEKKwkJICogdGhhdCBpcywgTlVNIGlzIG1hbmRhdG9yeSBmb3IgLVMgYnV0IG9wdGlvbmFsIGZvciAtLXN0cmluZ3MhCisJCSAqLworCQkic3RyaW5nc1wwIiAgICAgICAgICAgT3B0aW9uYWxfYXJndW1lbnQgIlMiCisJCSJ3aWR0aFwwIiAgICAgICAgICAgICBPcHRpb25hbF9hcmd1bWVudCAidyIKKwkJInRyYWRpdGlvbmFsXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZmIgorCQk7CisjZW5kaWYKKwljb25zdCBjaGFyICpzdHJfQSwgKnN0cl9OLCAqc3RyX2osICpzdHJfUyA9ICIzIjsKKwlsbGlzdF90ICpsc3RfdCA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWludCBsX2NfbTsKKwkvKiBUaGUgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHRvIHNraXAgYmVmb3JlIGZvcm1hdHRpbmcgYW5kIHdyaXRpbmcuICAqLworCW9mZl90IG5fYnl0ZXNfdG9fc2tpcCA9IDA7CisJLyogVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgbGFzdCBieXRlIHRvIGJlIGZvcm1hdHRlZC4gICovCisJb2ZmX3QgZW5kX29mZnNldCA9IDA7CisJLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZSBmb3JtYXR0ZWQuICAqLworCW9mZl90IG1heF9ieXRlc190b19mb3JtYXQgPSAwOworCisJc3BlYyA9IE5VTEw7CisJZm9ybWF0X2FkZHJlc3MgPSBmb3JtYXRfYWRkcmVzc19zdGQ7CisJYWRkcmVzc19iYXNlX2NoYXIgPSAnbyc7CisJYWRkcmVzc19wYWRfbGVuX2NoYXIgPSAnNyc7CisKKwkvKiBQYXJzZSBjb21tYW5kIGxpbmUgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ3Kzp0OjoiOyAvKiAtdyBOLCAtdCBpcyBhIGxpc3QgKi8KKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IG9kX2xvbmdvcHRzOworI2VuZGlmCisJb3B0ID0gT0RfR0VUT1BUMzIoKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgT1BUX0EpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgZG94bltdIEFMSUdOMSA9ICJkb3huIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgZG94bl9hZGRyZXNzX2Jhc2VfY2hhcltdIEFMSUdOMSA9IHsKKwkJCSd1JywgJ28nLCAneCcsIC8qICc/JyBmb3VydGggb25lIGlzIG5vdCBpbXBvcnRhbnQgKi8KKwkJfTsKKwkJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZG94bl9hZGRyZXNzX3BhZF9sZW5fY2hhcltdIEFMSUdOMSA9IHsKKwkJCSc3JywgJzcnLCAnNicsIC8qICc/JyAqLworCQl9OworCQljaGFyICpwOworCQlpbnQgcG9zOworCQlwID0gc3RyY2hyKGRveG4sIHN0cl9BWzBdKTsKKwkJaWYgKCFwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBvdXRwdXQgYWRkcmVzcyByYWRpeCAiCisJCQkJIiclYycgKG11c3QgYmUgW2RveG5dKSIsIHN0cl9BWzBdKTsKKwkJcG9zID0gcCAtIGRveG47CisJCWlmIChwb3MgPT0gMykgZm9ybWF0X2FkZHJlc3MgPSBmb3JtYXRfYWRkcmVzc19ub25lOworCQlhZGRyZXNzX2Jhc2VfY2hhciA9IGRveG5fYWRkcmVzc19iYXNlX2NoYXJbcG9zXTsKKwkJYWRkcmVzc19wYWRfbGVuX2NoYXIgPSBkb3huX2FkZHJlc3NfcGFkX2xlbl9jaGFyW3Bvc107CisJfQorCWlmIChvcHQgJiBPUFRfTikgeworCQltYXhfYnl0ZXNfdG9fZm9ybWF0ID0geHN0cnRvb2ZmX3NmeChzdHJfTiwgMCwgYmttKTsKKwl9CisJaWYgKG9wdCAmIE9QVF9hKSBkZWNvZGVfZm9ybWF0X3N0cmluZygiYSIpOworCWlmIChvcHQgJiBPUFRfYikgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoIm9DIik7CisJaWYgKG9wdCAmIE9QVF9jKSBkZWNvZGVfZm9ybWF0X3N0cmluZygiYyIpOworCWlmIChvcHQgJiBPUFRfZCkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoInUyIik7CisJaWYgKG9wdCAmIE9QVF9mKSBkZWNvZGVfZm9ybWF0X3N0cmluZygiZkYiKTsKKwlpZiAob3B0ICYgT1BUX2gpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJ4MiIpOworCWlmIChvcHQgJiBPUFRfaSkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoImQyIik7CisJaWYgKG9wdCAmIE9QVF9qKSBuX2J5dGVzX3RvX3NraXAgPSB4c3RydG9vZmZfc2Z4KHN0cl9qLCAwLCBia20pOworCWlmIChvcHQgJiBPUFRfbCkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoImQ0Iik7CisJaWYgKG9wdCAmIE9QVF9vKSBkZWNvZGVfZm9ybWF0X3N0cmluZygibzIiKTsKKwl3aGlsZSAobHN0X3QpIHsKKwkJZGVjb2RlX2Zvcm1hdF9zdHJpbmcobGxpc3RfcG9wKCZsc3RfdCkpOworCX0KKwlpZiAob3B0ICYgT1BUX3gpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJ4MiIpOworCWlmIChvcHQgJiBPUFRfcykgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoImQyIik7CisJaWYgKG9wdCAmIE9QVF9TKSB7CisJCXN0cmluZ19taW4gPSB4c3RydG91X3NmeChzdHJfUywgMCwgYmttKTsKKwl9CisKKwkvLyBCbG9hdDoKKwkvL2lmICgob3B0aW9uX21hc2szMiAmIE9QVF9TKSAmJiBuX3NwZWNzID4gMCkKKwkvLwliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gdHlwZSBtYXkgYmUgc3BlY2lmaWVkIHdoZW4gZHVtcGluZyBzdHJpbmdzIik7CisKKwkvKiBJZiB0aGUgLS10cmFkaXRpb25hbCBvcHRpb24gaXMgdXNlZCwgdGhlcmUgbWF5IGJlIGZyb20KKwkgKiAwIHRvIDMgcmVtYWluaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHM7ICBoYW5kbGUgZWFjaCBjYXNlCisJICogc2VwYXJhdGVseS4KKwkgKiBvZCBbRklMRV0gW1srXU9GRlNFVFsuXVtiXSBbWytdTEFCRUxbLl1bYl1dXQorCSAqIFRoZSBvZmZzZXQgYW5kIHBzZXVkb19zdGFydCBoYXZlIHRoZSBzYW1lIHN5bnRheC4KKwkgKgorCSAqIEZJWE1FOiBQT1NJWCAxMDAzLjEtMjAwMSB3aXRoIFhTSSByZXF1aXJlcyBzdXBwb3J0IGZvciB0aGUKKwkgKiB0cmFkaXRpb25hbCBzeW50YXggZXZlbiBpZiAtLXRyYWRpdGlvbmFsIGlzIG5vdCBnaXZlbi4gICovCisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJaWYgKG9wdCAmIE9QVF90cmFkaXRpb25hbCkgeworCQlpZiAoYXJndlswXSkgeworCQkJb2ZmX3QgcHNldWRvX3N0YXJ0ID0gLTE7CisJCQlvZmZfdCBvMSwgbzI7CisKKwkJCWlmICghYXJndlsxXSkgeyAvKiBvbmUgYXJnICovCisJCQkJaWYgKHBhcnNlX29sZF9vZmZzZXQoYXJndlswXSwgJm8xKSkgeworCQkJCQkvKiBvZCAtLXRyYWRpdGlvbmFsIE9GRlNFVCAqLworCQkJCQluX2J5dGVzX3RvX3NraXAgPSBvMTsKKwkJCQkJYXJndisrOworCQkJCX0KKwkJCQkvKiBvZCAtLXRyYWRpdGlvbmFsIEZJTEUgKi8KKwkJCX0gZWxzZSBpZiAoIWFyZ3ZbMl0pIHsgLyogdHdvIGFyZ3MgKi8KKwkJCQlpZiAocGFyc2Vfb2xkX29mZnNldChhcmd2WzBdLCAmbzEpCisJCQkJICYmIHBhcnNlX29sZF9vZmZzZXQoYXJndlsxXSwgJm8yKQorCQkJCSkgeworCQkJCQkvKiBvZCAtLXRyYWRpdGlvbmFsIE9GRlNFVCBMQUJFTCAqLworCQkJCQluX2J5dGVzX3RvX3NraXAgPSBvMTsKKwkJCQkJcHNldWRvX3N0YXJ0ID0gbzI7CisJCQkJCWFyZ3YgKz0gMjsKKwkJCQl9IGVsc2UgaWYgKHBhcnNlX29sZF9vZmZzZXQoYXJndlsxXSwgJm8yKSkgeworCQkJCQkvKiBvZCAtLXRyYWRpdGlvbmFsIEZJTEUgT0ZGU0VUICovCisJCQkJCW5fYnl0ZXNfdG9fc2tpcCA9IG8yOworCQkJCQlhcmd2WzFdID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgJyVzJyIsIGFyZ3ZbMV0pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIWFyZ3ZbM10pIHsgLyogdGhyZWUgYXJncyAqLworCQkJCWlmIChwYXJzZV9vbGRfb2Zmc2V0KGFyZ3ZbMV0sICZvMSkKKwkJCQkgJiYgcGFyc2Vfb2xkX29mZnNldChhcmd2WzJdLCAmbzIpCisJCQkJKSB7CisJCQkJCS8qIG9kIC0tdHJhZGl0aW9uYWwgRklMRSBPRkZTRVQgTEFCRUwgKi8KKwkJCQkJbl9ieXRlc190b19za2lwID0gbzE7CisJCQkJCXBzZXVkb19zdGFydCA9IG8yOworCQkJCQlhcmd2WzFdID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBtdXN0IGJlIG9mZnNldHMiKTsKKwkJCQl9CisJCQl9IGVsc2UgeyAvKiA+MyBhcmdzICovCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQkJfQorCisJCQlpZiAocHNldWRvX3N0YXJ0ID49IDApIHsKKwkJCQlpZiAoZm9ybWF0X2FkZHJlc3MgPT0gZm9ybWF0X2FkZHJlc3Nfbm9uZSkgeworCQkJCQlhZGRyZXNzX2Jhc2VfY2hhciA9ICdvJzsKKwkJCQkJYWRkcmVzc19wYWRfbGVuX2NoYXIgPSAnNyc7CisJCQkJCWZvcm1hdF9hZGRyZXNzID0gZm9ybWF0X2FkZHJlc3NfcGFyZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9ybWF0X2FkZHJlc3MgPSBmb3JtYXRfYWRkcmVzc19sYWJlbDsKKwkJCQl9CisJCQkJcHNldWRvX29mZnNldCA9IHBzZXVkb19zdGFydCAtIG5fYnl0ZXNfdG9fc2tpcDsKKwkJCX0KKwkJfQorCQkvKiBlbHNlOiBvZCAtLXRyYWRpdGlvbmFsICh3aXRob3V0IGFyZ3MpICovCisJfQorI2VuZGlmCisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9OKSB7CisJCWVuZF9vZmZzZXQgPSBuX2J5dGVzX3RvX3NraXAgKyBtYXhfYnl0ZXNfdG9fZm9ybWF0OworCQlpZiAoZW5kX29mZnNldCA8IG5fYnl0ZXNfdG9fc2tpcCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTS0lQICsgU0laRSBpcyB0b28gbGFyZ2UiKTsKKwl9CisKKwlpZiAobl9zcGVjcyA9PSAwKSB7CisJCWRlY29kZV9mb3JtYXRfc3RyaW5nKCJvMiIpOworCQkvKm5fc3BlY3MgPSAxOyAtIGRvbmUgYnkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcgKi8KKwl9CisKKwkvKiBJZiBubyBmaWxlcyB3ZXJlIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLAorCSAgIHNldCB0aGUgZ2xvYmFsIHBvaW50ZXIgRklMRV9MSVNUIHNvIHRoYXQgaXQKKwkgICByZWZlcmVuY2VzIHRoZSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBvbmUgbmFtZTogIi0iLiAgKi8KKwlmaWxlX2xpc3QgPSBiYl9hcmd2X2Rhc2g7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJLyogU2V0IHRoZSBnbG9iYWwgcG9pbnRlciBGSUxFX0xJU1Qgc28gdGhhdCBpdAorCQkgICByZWZlcmVuY2VzIHRoZSBmaXJzdCBmaWxlLWFyZ3VtZW50IG9uIHRoZSBjb21tYW5kLWxpbmUuICAqLworCQlmaWxlX2xpc3QgPSAoY2hhciBjb25zdCAqY29uc3QgKikgYXJndjsKKwl9CisKKwkvKiBPcGVuIHRoZSBmaXJzdCBpbnB1dCBmaWxlICovCisJb3Blbl9uZXh0X2ZpbGUoKTsKKwkvKiBTa2lwIG92ZXIgYW55IHVud2FudGVkIGhlYWRlciBieXRlcyAqLworCXNraXAobl9ieXRlc190b19za2lwKTsKKwlpZiAoIWluX3N0cmVhbSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworCS8qIENvbXB1dGUgb3V0cHV0IGJsb2NrIGxlbmd0aCAqLworCWxfY19tID0gZ2V0X2xjbSgpOworCisJaWYgKG9wdCAmIE9QVF93KSB7IC8qIC13OiB3aWR0aCAqLworCQlpZiAoIWJ5dGVzX3Blcl9ibG9jayB8fCBieXRlc19wZXJfYmxvY2sgJSBsX2NfbSAhPSAwKSB7CisJCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IGludmFsaWQgd2lkdGggJXU7IHVzaW5nICVkIGluc3RlYWQiLAorCQkJCQkodW5zaWduZWQpYnl0ZXNfcGVyX2Jsb2NrLCBsX2NfbSk7CisJCQlieXRlc19wZXJfYmxvY2sgPSBsX2NfbTsKKwkJfQorCX0gZWxzZSB7CisJCWJ5dGVzX3Blcl9ibG9jayA9IGxfY19tOworCQlpZiAobF9jX20gPCBERUZBVUxUX0JZVEVTX1BFUl9CTE9DSykKKwkJCWJ5dGVzX3Blcl9ibG9jayAqPSBERUZBVUxUX0JZVEVTX1BFUl9CTE9DSyAvIGxfY19tOworCX0KKworI2lmZGVmIERFQlVHCisJZm9yIChpID0gMDsgaSA8IG5fc3BlY3M7IGkrKykgeworCQlwcmludGYoIiVkOiBmbXQ9XCIlc1wiIHdpZHRoPSVkXG4iLAorCQkJaSwgc3BlY1tpXS5mbXRfc3RyaW5nLCB3aWR0aF9ieXRlc1tzcGVjW2ldLnNpemVdKTsKKwl9CisjZW5kaWYKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1MpCisJCWR1bXBfc3RyaW5ncyhuX2J5dGVzX3RvX3NraXAsIGVuZF9vZmZzZXQpOworCWVsc2UKKwkJZHVtcChuX2J5dGVzX3RvX3NraXAsIGVuZF9vZmZzZXQpOworCisJaWYgKGZjbG9zZShzdGRpbikpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfc3RhbmRhcmRfaW5wdXQpOworCisJcmV0dXJuIGV4aXRfY29kZTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9wcmludGVudi5jIGIvY29yZXV0aWxzL3ByaW50ZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1ZGI3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9wcmludGVudi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHByaW50ZW52IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcHJpbnRlbnZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltWQVJJQUJMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcHJpbnRlbnZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBlbnZpcm9ubWVudCBWQVJJQUJMRXMuXG4iCisvL3VzYWdlOiAgICAgICAiSWYgbm8gVkFSSUFCTEUgc3BlY2lmaWVkLCBwcmludCBhbGwuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHByaW50ZW52X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwcmludGVudl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUzsKKworCS8qIG5vIHZhcmlhYmxlcyBzcGVjaWZpZWQsIHNob3cgd2hvbGUgZW52ICovCisJaWYgKCFhcmd2WzFdKSB7CisJCWNoYXIgKiplID0gZW52aXJvbjsKKworCQkvKiBlbnZpcm9uIGNhbiBiZSBOVUxMISAoZm9yIGV4YW1wbGUsIGFmdGVyIGNsZWFyZW52KCkpCisJCSAqIENoZWNrIGZvciB0aGF0OgorCQkgKi8KKwkJaWYgKGUpCisJCQl3aGlsZSAoKmUpCisJCQkJcHV0cygqZSsrKTsKKwl9IGVsc2UgeworCQkvKiBzZWFyY2ggZm9yIHNwZWNpZmllZCB2YXJpYWJsZXMgYW5kIHByaW50IHRoZW0gb3V0IGlmIGZvdW5kICovCisJCWNoYXIgKmFyZywgKmVudjsKKworCQl3aGlsZSAoKGFyZyA9ICorK2FyZ3YpICE9IE5VTEwpIHsKKwkJCWVudiA9IGdldGVudihhcmcpOworCQkJaWYgKGVudikKKwkJCQlwdXRzKGVudik7CisJCQllbHNlCisJCQkJZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFOworCQl9CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChleGl0X2NvZGUpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3ByaW50Zi5jIGIvY29yZXV0aWxzL3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1M2FhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvcHJpbnRmLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogcHJpbnRmIC0gZm9ybWF0IGFuZCBwcmludCBkYXRhCisKKyAgIENvcHlyaWdodCAxOTk5IERhdmUgQ2luZWdlCisgICBQb3J0aW9ucyBjb3B5cmlnaHQgKEMpIDE5OTAtMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisKKy8qIFVzYWdlOiBwcmludGYgZm9ybWF0IFthcmd1bWVudC4uLl0KKworICAgQSBmcm9udCBlbmQgdG8gdGhlIHByaW50ZiBmdW5jdGlvbiB0aGF0IGxldHMgaXQgYmUgdXNlZCBmcm9tIHRoZSBzaGVsbC4KKworICAgQmFja3NsYXNoIGVzY2FwZXM6CisKKyAgIFwiID0gZG91YmxlIHF1b3RlCisgICBcXCA9IGJhY2tzbGFzaAorICAgXGEgPSBhbGVydCAoYmVsbCkKKyAgIFxiID0gYmFja3NwYWNlCisgICBcYyA9IHByb2R1Y2Ugbm8gZnVydGhlciBvdXRwdXQKKyAgIFxmID0gZm9ybSBmZWVkCisgICBcbiA9IG5ldyBsaW5lCisgICBcciA9IGNhcnJpYWdlIHJldHVybgorICAgXHQgPSBob3Jpem9udGFsIHRhYgorICAgXHYgPSB2ZXJ0aWNhbCB0YWIKKyAgIFwwb29vID0gb2N0YWwgbnVtYmVyIChvb28gaXMgMCB0byAzIGRpZ2l0cykKKyAgIFx4aGhoID0gaGV4YWRlY2ltYWwgbnVtYmVyIChoaGggaXMgMSB0byAzIGRpZ2l0cykKKworICAgQWRkaXRpb25hbCBkaXJlY3RpdmU6CisKKyAgICViID0gcHJpbnQgYW4gYXJndW1lbnQgc3RyaW5nLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoIGVzY2FwZXMKKworICAgVGhlICdmb3JtYXQnIGFyZ3VtZW50IGlzIHJlLXVzZWQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkKKyAgIHRvIGNvbnZlcnQgYWxsIG9mIHRoZSBnaXZlbiBhcmd1bWVudHMuCisKKyAgIERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1PgorKi8KKworLy8gICAxOTk5MDUwOCBCdXN5IEJveGVkISBEYXZlIENpbmVnZQorCisvL3VzYWdlOiNkZWZpbmUgcHJpbnRmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGT1JNQVQgW0FSR1VNRU5UXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBwcmludGZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGb3JtYXQgYW5kIHByaW50IEFSR1VNRU5UKHMpIGFjY29yZGluZyB0byBGT1JNQVQsXG4iCisvL3VzYWdlOiAgICAgICAid2hlcmUgRk9STUFUIGNvbnRyb2xzIHRoZSBvdXRwdXQgZXhhY3RseSBhcyBpbiBDIHByaW50ZiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcHJpbnRmX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHByaW50ZiBcIlZhbD0lZFxcblwiIDVcbiIKKy8vdXNhZ2U6ICAgICAgICJWYWw9NVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQSBub3RlIG9uIGJhZCBpbnB1dDogbmVpdGhlciBiYXNoIDMuMiBub3IgY29yZXV0aWxzIDYuMTAgc3RvcCBvbiBpdC4KKyAqIFRoZXkgcmVwb3J0IGl0OgorICogIGJhc2g6IHByaW50ZjogWFhYOiBpbnZhbGlkIG51bWJlcgorICogIHByaW50ZjogWFhYOiBleHBlY3RlZCBhIG51bWVyaWMgdmFsdWUKKyAqICBiYXNoOiBwcmludGY6IDEyM1hYWDogaW52YWxpZCBudW1iZXIKKyAqICBwcmludGY6IDEyM1hYWDogdmFsdWUgbm90IGNvbXBsZXRlbHkgY29udmVydGVkCisgKiBidXQgdGhlbiB0aGV5IHVzZSAwIChvciBwYXJ0aWFsbHkgY29udmVydGVkIG51bWVyaWMgcHJlZml4KSBhcyBhIHZhbHVlCisgKiBhbmQgY29udGludWUuIFRoZXkgZXhpdCB3aXRoIDEgaW4gdGhpcyBjYXNlLgorICogQm90aCBhY2NlcHQgaW5zYW5lIGZpZWxkIHdpZHRoL3ByZWNpc2lvbiAoZS5nLiAlOTk5OTk5OTk5OS45OTk5OTk5OTk5ZCkuCisgKiBCb3RoIHByaW50IGVycm9yIG1lc3NhZ2UgYW5kIGFzc3VtZSAwIGlmICUqLipmIHdpZHRoL3ByZWNpc2lvbiBpcyAiYmFkIgorICogIChidXQgbmVnYXRpdmUgbnVtYmVycyBhcmUgbm90ICJiYWQiKS4KKyAqIEJvdGggYWNjZXB0IG5lZ2F0aXZlIG51bWJlcnMgZm9yICV1IHNwZWNpZmllci4KKyAqCisgKiBXZSB0cnkgdG8gYmUgY29tcGF0aWJsZS4KKyAqLworCit0eXBlZGVmIHZvaWQgRkFTVF9GVU5DICgqY29udmVydGVyKShjb25zdCBjaGFyICphcmcsIHZvaWQgKnJlc3VsdCk7CisKK3N0YXRpYyBpbnQgbXVsdGljb252ZXJ0KGNvbnN0IGNoYXIgKmFyZywgdm9pZCAqcmVzdWx0LCBjb252ZXJ0ZXIgY29udmVydCkKK3sKKwlpZiAoKmFyZyA9PSAnIicgfHwgKmFyZyA9PSAnXCcnKSB7CisJCWFyZyA9IHV0b2EoKHVuc2lnbmVkIGNoYXIpYXJnWzFdKTsKKwl9CisJZXJybm8gPSAwOworCWNvbnZlcnQoYXJnLCByZXN1bHQpOworCWlmIChlcnJubykgeworCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBhcmcpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb252X3N0cnRvdWxsKGNvbnN0IGNoYXIgKmFyZywgdm9pZCAqcmVzdWx0KQoreworCSoodW5zaWduZWQgbG9uZyBsb25nKilyZXN1bHQgPSBiYl9zdHJ0b3VsbChhcmcsIE5VTEwsIDApOworCS8qIGJvdGggY29yZXV0aWxzIDYuMTAgYW5kIGJhc2ggMy4yOgorCSAqICQgcHJpbnRmICcleFxuJyAtMgorCSAqIGZmZmZmZmZmZmZmZmZmZmUKKwkgKiBNaW1pYyB0aGF0OgorCSAqLworCWlmIChlcnJubykgeworCQkqKHVuc2lnbmVkIGxvbmcgbG9uZyopcmVzdWx0ID0gYmJfc3RydG9sbChhcmcsIE5VTEwsIDApOworCX0KK30KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb252X3N0cnRvbGwoY29uc3QgY2hhciAqYXJnLCB2b2lkICpyZXN1bHQpCit7CisJKihsb25nIGxvbmcqKXJlc3VsdCA9IGJiX3N0cnRvbGwoYXJnLCBOVUxMLCAwKTsKK30KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb252X3N0cnRvZChjb25zdCBjaGFyICphcmcsIHZvaWQgKnJlc3VsdCkKK3sKKwljaGFyICplbmQ7CisJLyogV2VsbCwgdGhpcyBvbmUgYWxsb3dzIGxlYWRpbmcgd2hpdGVzcGFjZS4uLiBzbyB3aGF0PyAqLworCS8qIFdoYXQgSSBsaWtlIG11Y2ggbGVzcyBpcyB0aGF0ICItIiBhY2NlcHRlZCB0b28hIDooICovCisJKihkb3VibGUqKXJlc3VsdCA9IHN0cnRvZChhcmcsICZlbmQpOworCWlmIChlbmRbMF0pIHsKKwkJZXJybm8gPSBFUkFOR0U7CisJCSooZG91YmxlKilyZXN1bHQgPSAwOworCX0KK30KKworLyogQ2FsbGVycyBzaG91bGQgY2hlY2sgZXJybm8gdG8gZGV0ZWN0IGVycm9ycyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBteV94c3RydG91bGwoY29uc3QgY2hhciAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQ7CisJaWYgKG11bHRpY29udmVydChhcmcsICZyZXN1bHQsIGNvbnZfc3RydG91bGwpKQorCQlyZXN1bHQgPSAwOworCXJldHVybiByZXN1bHQ7Cit9CitzdGF0aWMgbG9uZyBsb25nIG15X3hzdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlsb25nIGxvbmcgcmVzdWx0OworCWlmIChtdWx0aWNvbnZlcnQoYXJnLCAmcmVzdWx0LCBjb252X3N0cnRvbGwpKQorCQlyZXN1bHQgPSAwOworCXJldHVybiByZXN1bHQ7Cit9CitzdGF0aWMgZG91YmxlIG15X3hzdHJ0b2QoY29uc3QgY2hhciAqYXJnKQoreworCWRvdWJsZSByZXN1bHQ7CisJbXVsdGljb252ZXJ0KGFyZywgJnJlc3VsdCwgY29udl9zdHJ0b2QpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2VzY19zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgYzsKKwl3aGlsZSAoKGMgPSAqc3RyKSAhPSAnXDAnKSB7CisJCXN0cisrOworCQlpZiAoYyA9PSAnXFwnKQorCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZzdHIpOworCQlwdXRjaGFyKGMpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfZGlyZWMoY2hhciAqZm9ybWF0LCB1bnNpZ25lZCBmbXRfbGVuZ3RoLAorCQlpbnQgZmllbGRfd2lkdGgsIGludCBwcmVjaXNpb24sCisJCWNvbnN0IGNoYXIgKmFyZ3VtZW50KQoreworCWxvbmcgbG9uZyBsbHY7CisJZG91YmxlIGR2OworCWNoYXIgc2F2ZWQ7CisJY2hhciAqaGF2ZV9wcmVjLCAqaGF2ZV93aWR0aDsKKworCXNhdmVkID0gZm9ybWF0W2ZtdF9sZW5ndGhdOworCWZvcm1hdFtmbXRfbGVuZ3RoXSA9ICdcMCc7CisKKwloYXZlX3ByZWMgPSBzdHJzdHIoZm9ybWF0LCAiLioiKTsKKwloYXZlX3dpZHRoID0gc3RyY2hyKGZvcm1hdCwgJyonKTsKKwlpZiAoaGF2ZV93aWR0aCAtIDEgPT0gaGF2ZV9wcmVjKQorCQloYXZlX3dpZHRoID0gTlVMTDsKKworCWVycm5vID0gMDsKKworCXN3aXRjaCAoZm9ybWF0W2ZtdF9sZW5ndGggLSAxXSkgeworCWNhc2UgJ2MnOgorCQlwcmludGYoZm9ybWF0LCAqYXJndW1lbnQpOworCQlicmVhazsKKwljYXNlICdkJzoKKwljYXNlICdpJzoKKwkJbGx2ID0gbXlfeHN0cnRvbGwoYXJndW1lbnQpOworIHByaW50X2xvbmc6CisJCWlmICghaGF2ZV93aWR0aCkgeworCQkJaWYgKCFoYXZlX3ByZWMpCisJCQkJcHJpbnRmKGZvcm1hdCwgbGx2KTsKKwkJCWVsc2UKKwkJCQlwcmludGYoZm9ybWF0LCBwcmVjaXNpb24sIGxsdik7CisJCX0gZWxzZSB7CisJCQlpZiAoIWhhdmVfcHJlYykKKwkJCQlwcmludGYoZm9ybWF0LCBmaWVsZF93aWR0aCwgbGx2KTsKKwkJCWVsc2UKKwkJCQlwcmludGYoZm9ybWF0LCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBsbHYpOworCQl9CisJCWJyZWFrOworCWNhc2UgJ28nOgorCWNhc2UgJ3UnOgorCWNhc2UgJ3gnOgorCWNhc2UgJ1gnOgorCQlsbHYgPSBteV94c3RydG91bGwoYXJndW1lbnQpOworCQkvKiBjaGVhdDogdW5zaWduZWQgbG9uZyBhbmQgbG9uZyBoYXZlIHNhbWUgd2lkdGgsIHNvLi4uICovCisJCWdvdG8gcHJpbnRfbG9uZzsKKwljYXNlICdzJzoKKwkJLyogQXJlIGNoYXIqIGFuZCBsb25nIGxvbmcgdGhlIHNhbWU/ICovCisJCWlmIChzaXplb2YoYXJndW1lbnQpID09IHNpemVvZihsbHYpKSB7CisJCQlsbHYgPSAobG9uZyBsb25nKShwdHJkaWZmX3QpYXJndW1lbnQ7CisJCQlnb3RvIHByaW50X2xvbmc7CisJCX0gZWxzZSB7CisJCQkvKiBIb3BlIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgaXQgb3V0IGJ5IG1vdmluZyBjYWxsCisJCQkgKiBpbnN0cnVjdGlvbiBhZnRlciB0aGUgaWZzLi4uICovCisJCQlpZiAoIWhhdmVfd2lkdGgpIHsKKwkJCQlpZiAoIWhhdmVfcHJlYykKKwkJCQkJcHJpbnRmKGZvcm1hdCwgYXJndW1lbnQsIC8qdW51c2VkOiovIGFyZ3VtZW50LCBhcmd1bWVudCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoZm9ybWF0LCBwcmVjaXNpb24sIGFyZ3VtZW50LCAvKnVudXNlZDoqLyBhcmd1bWVudCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghaGF2ZV9wcmVjKQorCQkJCQlwcmludGYoZm9ybWF0LCBmaWVsZF93aWR0aCwgYXJndW1lbnQsIC8qdW51c2VkOiovIGFyZ3VtZW50KTsKKwkJCQllbHNlCisJCQkJCXByaW50Zihmb3JtYXQsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGFyZ3VtZW50KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSAnZic6CisJY2FzZSAnZSc6CisJY2FzZSAnRSc6CisJY2FzZSAnZyc6CisJY2FzZSAnRyc6CisJCWR2ID0gbXlfeHN0cnRvZChhcmd1bWVudCk7CisJCWlmICghaGF2ZV93aWR0aCkgeworCQkJaWYgKCFoYXZlX3ByZWMpCisJCQkJcHJpbnRmKGZvcm1hdCwgZHYpOworCQkJZWxzZQorCQkJCXByaW50Zihmb3JtYXQsIHByZWNpc2lvbiwgZHYpOworCQl9IGVsc2UgeworCQkJaWYgKCFoYXZlX3ByZWMpCisJCQkJcHJpbnRmKGZvcm1hdCwgZmllbGRfd2lkdGgsIGR2KTsKKwkJCWVsc2UKKwkJCQlwcmludGYoZm9ybWF0LCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBkdik7CisJCX0KKwkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKi8KKworCWZvcm1hdFtmbXRfbGVuZ3RoXSA9IHNhdmVkOworfQorCisvKiBIYW5kbGUgcGFyYW1zIGZvciAiJSouKmYiLiBOZWdhdGl2ZSBudW1iZXJzIGFyZSBvayAoY29tcGF0KS4gKi8KK3N0YXRpYyBpbnQgZ2V0X3dpZHRoX3ByZWMoY29uc3QgY2hhciAqc3RyKQoreworCWludCB2ID0gYmJfc3RydG9pKHN0ciwgTlVMTCwgMTApOworCWlmIChlcnJubykgeworCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBzdHIpOworCQl2ID0gMDsKKwl9CisJcmV0dXJuIHY7Cit9CisKKy8qIFByaW50IHRoZSB0ZXh0IGluIEZPUk1BVCwgdXNpbmcgQVJHViBmb3IgYXJndW1lbnRzIHRvIGFueSAnJScgZGlyZWN0aXZlcy4KKyAgIFJldHVybiBhZHZhbmNlZCBBUkdWLiAgKi8KK3N0YXRpYyBjaGFyICoqcHJpbnRfZm9ybWF0dGVkKGNoYXIgKmYsIGNoYXIgKiphcmd2LCBpbnQgKmNvbnZfZXJyKQoreworCWNoYXIgKmRpcmVjX3N0YXJ0OyAgICAgIC8qIFN0YXJ0IG9mICUgZGlyZWN0aXZlLiAgKi8KKwl1bnNpZ25lZCBkaXJlY19sZW5ndGg7ICAvKiBMZW5ndGggb2YgJSBkaXJlY3RpdmUuICAqLworCWludCBmaWVsZF93aWR0aDsgICAgICAgIC8qIEFyZyB0byBmaXJzdCAnKicgKi8KKwlpbnQgcHJlY2lzaW9uOyAgICAgICAgICAvKiBBcmcgdG8gc2Vjb25kICcqJyAqLworCWNoYXIgKipzYXZlZF9hcmd2ID0gYXJndjsKKworCWZvciAoOyAqZjsgKytmKSB7CisJCXN3aXRjaCAoKmYpIHsKKwkJY2FzZSAnJSc6CisJCQlkaXJlY19zdGFydCA9IGYrKzsKKwkJCWRpcmVjX2xlbmd0aCA9IDE7CisJCQlmaWVsZF93aWR0aCA9IHByZWNpc2lvbiA9IDA7CisJCQlpZiAoKmYgPT0gJyUnKSB7CisJCQkJYmJfcHV0Y2hhcignJScpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCpmID09ICdiJykgeworCQkJCWlmICgqYXJndikgeworCQkJCQlwcmludF9lc2Nfc3RyaW5nKCphcmd2KTsKKwkJCQkJKythcmd2OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjaHIoIi0rICMiLCAqZikpIHsKKwkJCQkrK2Y7CisJCQkJKytkaXJlY19sZW5ndGg7CisJCQl9CisJCQlpZiAoKmYgPT0gJyonKSB7CisJCQkJKytmOworCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJCWlmICgqYXJndikKKwkJCQkJZmllbGRfd2lkdGggPSBnZXRfd2lkdGhfcHJlYygqYXJndisrKTsKKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUgKGlzZGlnaXQoKmYpKSB7CisJCQkJCSsrZjsKKwkJCQkJKytkaXJlY19sZW5ndGg7CisJCQkJfQorCQkJfQorCQkJaWYgKCpmID09ICcuJykgeworCQkJCSsrZjsKKwkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCQlpZiAoKmYgPT0gJyonKSB7CisJCQkJCSsrZjsKKwkJCQkJKytkaXJlY19sZW5ndGg7CisJCQkJCWlmICgqYXJndikKKwkJCQkJCXByZWNpc2lvbiA9IGdldF93aWR0aF9wcmVjKCphcmd2KyspOworCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlIChpc2RpZ2l0KCpmKSkgeworCQkJCQkJKytmOworCQkJCQkJKytkaXJlY19sZW5ndGg7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qIFJlbW92ZSAibExoeiIgc2l6ZSBtb2RpZmllcnMsIHJlcGVhdGVkbHkuCisJCQkgKiBiYXNoIGRvZXMgbm90IGxpa2UgIiVsbGQiLCBidXQgY29yZXV0aWxzCisJCQkgKiBoYXBwaWx5IHRha2VzIGV2ZW4gIiVMbGxsaGh6aGh6ZCIhCisJCQkgKiBXZSBhcmUgcGVybWlzc2l2ZSBsaWtlIGNvcmV1dGlscyAqLworCQkJd2hpbGUgKCgqZiB8IDB4MjApID09ICdsJyB8fCAqZiA9PSAnaCcgfHwgKmYgPT0gJ3onKSB7CisJCQkJb3ZlcmxhcHBpbmdfc3RyY3B5KGYsIGYgKyAxKTsKKwkJCX0KKwkJCS8qIEFkZCAibGwiIGlmIGludGVnZXIgbW9kaWZpZXIsIHRoZW4gcHJpbnQgKi8KKwkJCXsKKwkJCQlzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRfY2hhcnNbXSBBTElHTjEgPSAiZGlvdXhYZmVFZ0djcyI7CisJCQkJY2hhciAqcCA9IHN0cmNocihmb3JtYXRfY2hhcnMsICpmKTsKKwkJCQkvKiBuZWVkZWQgLSB0cnkgInByaW50ZiAlIiB3aXRob3V0IGl0ICovCisJCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCQliYl9lcnJvcl9tc2coIiVzOiBpbnZhbGlkIGZvcm1hdCIsIGRpcmVjX3N0YXJ0KTsKKwkJCQkJLyogY2F1c2VzIG1haW4oKSB0byBleGl0IHdpdGggZXJyb3IgKi8KKwkJCQkJcmV0dXJuIHNhdmVkX2FyZ3YgLSAxOworCQkJCX0KKwkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCQlpZiAocCAtIGZvcm1hdF9jaGFycyA8PSA1KSB7CisJCQkJCS8qIGl0IGlzIG9uZSBvZiAiZGlvdXhYIiAqLworCQkJCQlwID0geG1hbGxvYyhkaXJlY19sZW5ndGggKyAzKTsKKwkJCQkJbWVtY3B5KHAsIGRpcmVjX3N0YXJ0LCBkaXJlY19sZW5ndGgpOworCQkJCQlwW2RpcmVjX2xlbmd0aCArIDFdID0gcFtkaXJlY19sZW5ndGggLSAxXTsKKwkJCQkJcFtkaXJlY19sZW5ndGggLSAxXSA9ICdsJzsKKwkJCQkJcFtkaXJlY19sZW5ndGhdID0gJ2wnOworCQkJCQkvL2JiX2Vycm9yX21zZygiPCVzPiIsIHApOworCQkJCQlkaXJlY19sZW5ndGggKz0gMjsKKwkJCQkJZGlyZWNfc3RhcnQgPSBwOworCQkJCX0gZWxzZSB7CisJCQkJCXAgPSBOVUxMOworCQkJCX0KKwkJCQlpZiAoKmFyZ3YpIHsKKwkJCQkJcHJpbnRfZGlyZWMoZGlyZWNfc3RhcnQsIGRpcmVjX2xlbmd0aCwgZmllbGRfd2lkdGgsCisJCQkJCQkJCXByZWNpc2lvbiwgKmFyZ3YrKyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRfZGlyZWMoZGlyZWNfc3RhcnQsIGRpcmVjX2xlbmd0aCwgZmllbGRfd2lkdGgsCisJCQkJCQkJCXByZWNpc2lvbiwgIiIpOworCQkJCX0KKwkJCQkqY29udl9lcnIgfD0gZXJybm87CisJCQkJZnJlZShwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcXCc6CisJCQlpZiAoKisrZiA9PSAnYycpIHsKKwkJCQlyZXR1cm4gc2F2ZWRfYXJndjsgLyogY2F1c2VzIG1haW4oKSB0byBleGl0ICovCisJCQl9CisJCQliYl9wdXRjaGFyKGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKChjb25zdCBjaGFyICoqKSZmKSk7CisJCQlmLS07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXB1dGNoYXIoKmYpOworCQl9CisJfQorCisJcmV0dXJuIGFyZ3Y7Cit9CisKK2ludCBwcmludGZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBjb252X2VycjsKKwljaGFyICpmb3JtYXQ7CisJY2hhciAqKmFyZ3YyOworCisJLyogV2UgbXVzdCBjaGVjayB0aGF0IHN0ZG91dCBpcyBub3QgY2xvc2VkLgorCSAqIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgaGlnaGx5IG5vbi1vYnZpb3VzLgorCSAqIHByaW50Zl9tYWluIGlzIHVzZWQgZnJvbSBzaGVsbC4KKwkgKiBTaGVsbCBtdXN0IGNvcnJlY3RseSBoYW5kbGUgJ3ByaW50ZiAiJXMiIGZvbycKKwkgKiBpZiBzdGRvdXQgaXMgY2xvc2VkLiBXaXRoIHN0ZGlvLCBvdXRwdXQgZ2V0cyBzaG92ZWxlZCBpbnRvCisJICogc3Rkb3V0IGJ1ZmZlciwgYW5kIGV2ZW4gZmZsdXNoIGNhbm5vdCBjbGVhciBpdCBvdXQuIEl0IHNlZW1zIHRoYXQKKwkgKiBldmVuIGlmIGxpYmMgcmVjZWl2ZXMgRUJBREYgb24gd3JpdGUgYXR0ZW1wdHMsIGl0IGZlZWxzIGRldGVybWluZWQKKwkgKiB0byBvdXRwdXQgZGF0YSBubyBtYXR0ZXIgd2hhdC4gU28gaXQgd2lsbCB0cnkgbGF0ZXIsCisJICogYW5kIHBvc3NpYmx5IHdpbGwgY2xvYmJlciBmdXR1cmUgb3V0cHV0LiBOb3QgZ29vZC4gKi8KKy8vIFRPRE86IGNoZWNrIGZjbnRsKCkgJiBPX0FDQ01PREUgPT0gT19XUk9OTFkgb3IgT19SRFdSPworCWlmIChmY250bCgxLCBGX0dFVEZMKSA9PSAtMSkKKwkJcmV0dXJuIDE7IC8qIG1hdGNoIGNvcmV1dGlscyA2LjEwIChzYW5zIGVycm9yIG1zZyB0byBzdGRlcnIpICovCisJLy9pZiAoZHVwMigxLCAxKSAhPSAxKSAtIG9sZCB3YXkKKwkvLwlyZXR1cm4gMTsKKworCS8qIGJhc2ggYnVpbHRpbiBlcnJvcnMgb3V0IG9uICJwcmludGYgJy0lcy1cbicgZm9vIiwKKwkgKiBjb3JldXRpbHMtNi45IHdvcmtzLiBCb3RoIHdvcmsgd2l0aCAicHJpbnRmIC0tICctJXMtXG4nIGZvbyIuCisJICogV2Ugd2lsbCBtaW1pYyBjb3JldXRpbHMuICovCisJaWYgKGFyZ3ZbMV0gJiYgYXJndlsxXVswXSA9PSAnLScgJiYgYXJndlsxXVsxXSA9PSAnLScgJiYgIWFyZ3ZbMV1bMl0pCisJCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJaWYgKEVOQUJMRV9BU0hfQlVJTFRJTl9QUklOVEYKKwkJICYmIGFwcGxldF9uYW1lWzBdICE9ICdwJworCQkpIHsKKwkJCWJiX2Vycm9yX21zZygidXNhZ2U6IHByaW50ZiBGT1JNQVQgW0FSR1VNRU5ULi4uXSIpOworCQkJcmV0dXJuIDI7IC8qIGJhc2ggY29tcGF0ICovCisJCX0KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWZvcm1hdCA9IGFyZ3ZbMV07CisJYXJndjIgPSBhcmd2ICsgMjsKKworCWNvbnZfZXJyID0gMDsKKwlkbyB7CisJCWFyZ3YgPSBhcmd2MjsKKwkJYXJndjIgPSBwcmludF9mb3JtYXR0ZWQoZm9ybWF0LCBhcmd2LCAmY29udl9lcnIpOworCX0gd2hpbGUgKGFyZ3YyID4gYXJndiAmJiAqYXJndjIpOworCisJLyogY29yZXV0aWxzIGNvbXBhdCAoYmFzaCBkb2Vzbid0IGRvIHRoaXMpOgorCWlmICgqYXJndikKKwkJZnByaW50ZihzdGRlcnIsICJleGNlc3MgYXJncyBpZ25vcmVkIik7CisJKi8KKworCXJldHVybiAoYXJndjIgPCBhcmd2KSAvKiBpZiB0cnVlLCBwcmludF9mb3JtYXR0ZWQgZXJyb3JlZCBvdXQgKi8KKwkJfHwgY29udl9lcnI7IC8qIHByaW50X2Zvcm1hdHRlZCBzYXcgaW52YWxpZCBudW1iZXIgKi8KK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9wd2QuYyBiL2NvcmV1dGlscy9wd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzliODM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3B3ZC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcHdkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IEJydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBwd2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBwd2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgZnVsbCBmaWxlbmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcHdkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHB3ZFxuIgorLy91c2FnZTogICAgICAgIi9yb290XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgcHdkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwd2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyICpidWY7CisKKwlidWYgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKwlpZiAoYnVmICE9IE5VTEwpIHsKKwkJcHV0cyhidWYpOworCQlmcmVlKGJ1Zik7CisJCXJldHVybiBmZmx1c2hfYWxsKCk7CisJfQorCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9yZWFkbGluay5jIGIvY29yZXV0aWxzL3JlYWRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhZDc5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9yZWFkbGluay5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcmVhZGxpbmsgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlYWRsaW5rX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XKCJbLWZudl0gIikgIkZJTEUiCisvL3VzYWdlOiNkZWZpbmUgcmVhZGxpbmtfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHRoZSB2YWx1ZSBvZiBhIHN5bWxpbmsiCisvL3VzYWdlOglJRl9GRUFUVVJFX1JFQURMSU5LX0ZPTExPVyggIlxuIgorLy91c2FnZTogICAgICJcbgktZglDYW5vbmljYWxpemUgYnkgZm9sbG93aW5nIGFsbCBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgYWRkIG5ld2xpbmUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorICogIyByZWFkbGluayAtLXZlcnNpb24KKyAqIHJlYWRsaW5rIChHTlUgY29yZXV0aWxzKSA2LjEwCisgKiAjIHJlYWRsaW5rIC0taGVscAorICogICAtZiwgLS1jYW5vbmljYWxpemUKKyAqICAgICAgY2Fub25pY2FsaXplIGJ5IGZvbGxvd2luZyBldmVyeSBzeW1saW5rIGluCisgKiAgICAgIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSByZWN1cnNpdmVseTsKKyAqICAgICAgYWxsIGJ1dCB0aGUgbGFzdCBjb21wb25lbnQgbXVzdCBleGlzdAorICogICAtZSwgLS1jYW5vbmljYWxpemUtZXhpc3RpbmcKKyAqICAgICAgY2Fub25pY2FsaXplIGJ5IGZvbGxvd2luZyBldmVyeSBzeW1saW5rIGluCisgKiAgICAgIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSByZWN1cnNpdmVseSwKKyAqICAgICAgYWxsIGNvbXBvbmVudHMgbXVzdCBleGlzdAorICogICAtbSwgLS1jYW5vbmljYWxpemUtbWlzc2luZworICogICAgICBjYW5vbmljYWxpemUgYnkgZm9sbG93aW5nIGV2ZXJ5IHN5bWxpbmsgaW4KKyAqICAgICAgZXZlcnkgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBuYW1lIHJlY3Vyc2l2ZWx5LAorICogICAgICB3aXRob3V0IHJlcXVpcmVtZW50cyBvbiBjb21wb25lbnRzIGV4aXN0ZW5jZQorICogICAtbiwgLS1uby1uZXdsaW5lICAgICAgICAgICAgICBkbyBub3Qgb3V0cHV0IHRoZSB0cmFpbGluZyBuZXdsaW5lCisgKiAgIC1xLCAtLXF1aWV0LCAtcywgLS1zaWxlbnQgICAgIHN1cHByZXNzIG1vc3QgZXJyb3IgbWVzc2FnZXMKKyAqICAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgcmVwb3J0IGVycm9yIG1lc3NhZ2VzCisgKgorICogYmJveCBzdXBwb3J0czogLWYgLW4gLXYgKGZ1bGx5KSwgLXEgLXMgKGFjY2VwdHMgYnV0IGlnbm9yZXMpCisgKi8KKworaW50IHJlYWRsaW5rX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZWFkbGlua19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYnVmOworCWNoYXIgKmZuYW1lOworCisJSUZfRkVBVFVSRV9SRUFETElOS19GT0xMT1coCisJCXVuc2lnbmVkIG9wdDsKKwkJLyogV2UgbmVlZCBleGFjdGx5IG9uZSBub24tb3B0aW9uIGFyZ3VtZW50LiAgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZm52c3EiKTsKKwkJZm5hbWUgPSBhcmd2W29wdGluZF07CisJKQorCUlGX05PVF9GRUFUVVJFX1JFQURMSU5LX0ZPTExPVygKKwkJY29uc3QgdW5zaWduZWQgb3B0ID0gMDsKKwkJaWYgKGFyZ2MgIT0gMikgYmJfc2hvd191c2FnZSgpOworCQlmbmFtZSA9IGFyZ3ZbMV07CisJKQorCisJLyogY29tcGF0OiBjb3JldXRpbHMgcmVhZGxpbmsgcmVwb3J0cyBlcnJvcnMgc2lsZW50bHkgdmlhIGV4aXQgY29kZSAqLworCWlmICghKG9wdCAmIDQpKSAvKiBub3QgLXYgKi8KKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKworCWlmIChvcHQgJiAxKSB7IC8qIC1mICovCisJCWJ1ZiA9IHhtYWxsb2NfcmVhbHBhdGgoZm5hbWUpOworCX0gZWxzZSB7CisJCWJ1ZiA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2FybihmbmFtZSk7CisJfQorCisJaWYgKCFidWYpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJcHJpbnRmKChvcHQgJiAyKSA/ICIlcyIgOiAiJXNcbiIsIGJ1Zik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoYnVmKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9yZWFscGF0aC5jIGIvY29yZXV0aWxzL3JlYWxwYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxM2I1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9yZWFscGF0aC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gQXBwYXJlbnRseSBhIGJ1c3lib3ggZXh0ZW5zaW9uLiAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIE5vdyBkb2VzIHByb3BlciBlcnJvciBjaGVja2luZyBvbiBvdXRwdXQgYW5kIHJldHVybnMgYSBmYWlsdXJlIGV4aXQgY29kZQorICogaWYgb25lIG9yIG1vcmUgcGF0aHMgY2Fubm90IGJlIHJlc29sdmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlYWxwYXRoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIHJlYWxwYXRoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRobmFtZXMgb2YgZ2l2ZW4gRklMRSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCByZWFscGF0aF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVhbHBhdGhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwlpZiAoISorK2FyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWRvIHsKKwkJY2hhciAqcmVzb2x2ZWRfcGF0aCA9IHhtYWxsb2NfcmVhbHBhdGgoKmFyZ3YpOworCQlpZiAocmVzb2x2ZWRfcGF0aCAhPSBOVUxMKSB7CisJCQlwdXRzKHJlc29sdmVkX3BhdGgpOworCQkJZnJlZShyZXNvbHZlZF9wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3JtLmMgYi9jb3JldXRpbHMvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJmYmExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3JtLmMKQEAgLTAsMCArMSw2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBybSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3JtLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTaXplIHJlZHVjdGlvbi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcm1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaXJmXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIHJtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlICh1bmxpbmspIEZJTEVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1pCUFsd2F5cyBwcm9tcHQgYmVmb3JlIHJlbW92aW5nIgorLy91c2FnZTogICAgICJcbgktZglOZXZlciBwcm9tcHQiCisvL3VzYWdlOiAgICAgIlxuCS1SLC1yCVJlY3Vyc2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJtX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJtIC1yZiAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHJtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBybV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGZsYWdzID0gMDsKKwl1bnNpZ25lZCBvcHQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJmLWk6aS1mIjsKKwkvKiAtdiAodmVyYm9zZSkgaXMgaWdub3JlZCAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmaVJydiIpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiAxKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfRk9SQ0U7CisJaWYgKG9wdCAmIDIpCisJCWZsYWdzIHw9IEZJTEVVVElMU19JTlRFUkFDVElWRTsKKwlpZiAob3B0ICYgKDh8NCkpCisJCWZsYWdzIHw9IEZJTEVVVElMU19SRUNVUjsKKworCWlmICgqYXJndiAhPSBOVUxMKSB7CisJCWRvIHsKKwkJCWNvbnN0IGNoYXIgKmJhc2UgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCgqYXJndik7CisKKwkJCWlmIChET1RfT1JfRE9URE9UKGJhc2UpKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCByZW1vdmUgJy4nIG9yICcuLiciKTsKKwkJCX0gZWxzZSBpZiAocmVtb3ZlX2ZpbGUoKmFyZ3YsIGZsYWdzKSA+PSAwKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzdGF0dXMgPSAxOworCQl9IHdoaWxlICgqKythcmd2KTsKKwl9IGVsc2UgaWYgKCEoZmxhZ3MgJiBGSUxFVVRJTFNfRk9SQ0UpKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3JtZGlyLmMgYi9jb3JldXRpbHMvcm1kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQwZDFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3JtZGlyLmMKQEAgLTAsMCArMSw4NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcm1kaXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ybWRpci5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBybWRpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIERJUkVDVE9SWS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBybWRpcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlbW92ZSBESVJFQ1RPUlkgaWYgaXQgaXMgZW1wdHlcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktcHwtLXBhcmVudHMJSW5jbHVkZSBwYXJlbnRzIgorLy91c2FnZTogICAgICJcbgktLWlnbm9yZS1mYWlsLW9uLW5vbi1lbXB0eSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLXAJSW5jbHVkZSBwYXJlbnRzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBybWRpcl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIyBybWRpciAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisjZGVmaW5lIFBBUkVOVFMgMHgwMQorI2RlZmluZSBJR05PUkVfTk9OX0VNUFRZIDB4MDIKKworaW50IHJtZGlyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBybWRpcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgZmxhZ3M7CisJY2hhciAqcGF0aDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIHJtZGlyX2xvbmdvcHRzW10gQUxJR04xID0KKwkJInBhcmVudHNcMCIgICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAicCIKKwkJLyogRGViaWFuIGV0Y2g6IG1hbnkgcGFja2FnZXMgZmFpbCB0byBiZSBwdXJnZWQgb3IgaW5zdGFsbGVkCisJCSAqIGJlY2F1c2UgdGhleSBkZXNwZXJhdGVseSB3YW50IHRoaXMgb3B0aW9uOiAqLworCQkiaWdub3JlLWZhaWwtb24tbm9uLWVtcHR5XDAiIE5vX2FyZ3VtZW50ICJceGZmIgorCQk7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHJtZGlyX2xvbmdvcHRzOworI2VuZGlmCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAicCIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZG8geworCQlwYXRoID0gKmFyZ3Y7CisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChybWRpcihwYXRoKSA8IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMKKwkJCQlpZiAoKGZsYWdzICYgSUdOT1JFX05PTl9FTVBUWSkgJiYgZXJybm8gPT0gRU5PVEVNUFRZKQorCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWJiX3BlcnJvcl9tc2coIiclcyciLCBwYXRoKTsgIC8qIE1hdGNoIGdudSBybWRpciBtc2cuICovCisJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJfSBlbHNlIGlmIChmbGFncyAmIFBBUkVOVFMpIHsKKwkJCQkvKiBOb3RlOiBwYXRoIHdhcyBub3QgIiIgc2luY2Ugcm1kaXIgc3VjY2VlZGVkLiAqLworCQkJCXBhdGggPSBkaXJuYW1lKHBhdGgpOworCQkJCS8qIFBhdGggaXMgbm93IGp1c3QgdGhlIHBhcmVudCBjb21wb25lbnQuICBEaXJuYW1lCisJCQkJICogcmV0dXJucyAiLiIgaWYgdGhlcmUgYXJlIG5vIHBhcmVudHMuCisJCQkJICovCisJCQkJaWYgKE5PVF9MT05FX0NIQVIocGF0aCwgJy4nKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9zZXEuYyBiL2NvcmV1dGlscy9zZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg2MTkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3NlcS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXEgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXFfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstd10gWy1zIFNFUF0gW0ZJUlNUIFtJTkNdXSBMQVNUIgorLy91c2FnZTojZGVmaW5lIHNlcV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IG51bWJlcnMgZnJvbSBGSVJTVCB0byBMQVNULCBpbiBzdGVwcyBvZiBJTkMuXG4iCisvL3VzYWdlOiAgICAgICAiRklSU1QsIElOQyBkZWZhdWx0IHRvIDEuXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CVBhZCB0byBsYXN0IHdpdGggbGVhZGluZyB6ZXJvcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0VQCVN0cmluZyBzZXBhcmF0b3IiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgc2VxX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXFfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF93ID0gKDEgPDwgMCksCisJCU9QVF9zID0gKDEgPDwgMSksCisJfTsKKwlkb3VibGUgZmlyc3QsIGxhc3QsIGluY3JlbWVudCwgdjsKKwl1bnNpZ25lZCBuOworCXVuc2lnbmVkIHdpZHRoOworCXVuc2lnbmVkIGZyYWNfcGFydDsKKwljb25zdCBjaGFyICpzZXAsICpvcHRfcyA9ICJcbiI7CisJdW5zaWduZWQgb3B0OworCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJLyogVW5kbyBidXN5Ym94LmM6IG9uIGlucHV0LCB3ZSB3YW50IHRvIHVzZSBkb3QKKwkgKiBhcyBmcmFjdGlvbmFsIHNlcGFyYXRvciwgcmVnYXJkbGVzcyBvZiBjdXJyZW50IGxvY2FsZSAqLworCXNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworI2VuZGlmCisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK3dzOiIsICZvcHRfcyk7CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJZmlyc3QgPSBpbmNyZW1lbnQgPSAxOworCWVycm5vID0gMDsKKwlzd2l0Y2ggKGFyZ2MpIHsKKwkJCWNoYXIgKnBwOworCQljYXNlIDM6CisJCQlpbmNyZW1lbnQgPSBzdHJ0b2QoYXJndlsxXSwgJnBwKTsKKwkJCWVycm5vIHw9ICpwcDsKKwkJY2FzZSAyOgorCQkJZmlyc3QgPSBzdHJ0b2QoYXJndlswXSwgJnBwKTsKKwkJCWVycm5vIHw9ICpwcDsKKwkJY2FzZSAxOgorCQkJbGFzdCA9IHN0cnRvZChhcmd2W2FyZ2MtMV0sICZwcCk7CisJCQlpZiAoIWVycm5vICYmICpwcCA9PSAnXDAnKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCXNldGxvY2FsZShMQ19OVU1FUklDLCAiIik7CisjZW5kaWYKKworCS8qIExhc3QgY2hlY2tlZCB0byBiZSBjb21wYXRpYmxlIHdpdGg6IGNvcmV1dGlscy02LjEwICovCisJd2lkdGggPSAwOworCWZyYWNfcGFydCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqZG90ID0gc3RyY2hybnVsKCphcmd2LCAnLicpOworCQlpbnQgdyA9IChkb3QgLSAqYXJndik7CisJCWludCBmID0gc3RybGVuKGRvdCk7CisJCWlmICh3aWR0aCA8IHcpCisJCQl3aWR0aCA9IHc7CisJCWFyZ3YrKzsKKwkJaWYgKCEqYXJndikKKwkJCWJyZWFrOworCQkvKiBXaHkgZG8gdGhlIGFib3ZlIF9iZWZvcmVfIGZyYWMgY2hlY2sgYmVsb3c/CisJCSAqIFRyeSAic2VxIDEgMi4wIiBhbmQgInNlcSAxLjAgMi4wIjoKKwkJICogY29yZXV0aWxzIG5ldmVyIHBheSBhdHRlbnRpb24gdG8gdGhlIG51bWJlcgorCQkgKiBvZiBmcmFjdGlvbmFsIGRpZ2l0cyBpbiBsYXN0IGFyZy4gKi8KKwkJaWYgKGZyYWNfcGFydCA8IGYpCisJCQlmcmFjX3BhcnQgPSBmOworCX0KKwlpZiAoZnJhY19wYXJ0KSB7CisJCWZyYWNfcGFydC0tOworCQlpZiAoZnJhY19wYXJ0KQorCQkJd2lkdGggKz0gZnJhY19wYXJ0ICsgMTsKKwl9CisJaWYgKCEob3B0ICYgT1BUX3cpKQorCQl3aWR0aCA9IDA7CisKKwlzZXAgPSAiIjsKKwl2ID0gZmlyc3Q7CisJbiA9IDA7CisJd2hpbGUgKGluY3JlbWVudCA+PSAwID8gdiA8PSBsYXN0IDogdiA+PSBsYXN0KSB7CisJCWlmIChwcmludGYoIiVzJTAqLipmIiwgc2VwLCB3aWR0aCwgZnJhY19wYXJ0LCB2KSA8IDApCisJCQlicmVhazsgLyogSS9PIGVycm9yLCBiYWlsIG91dCAoeWVzLCB0aGlzIHJlYWxseSBoYXBwZW5zKSAqLworCQlzZXAgPSBvcHRfczsKKwkJLyogdiArPSBpbmNyZW1lbnQ7IC0gd291bGQgYWNjdW11bGF0ZSBmbG9hdGluZyBwb2ludCBlcnJvcnMgKi8KKwkJbisrOworCQl2ID0gZmlyc3QgKyBuICogaW5jcmVtZW50OworCX0KKwlpZiAobikgLyogaWYgd2hpbGUgbG9vcCBleGVjdXRlZCBhdCBsZWFzdCBvbmNlICovCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3NsZWVwLmMgYi9jb3JldXRpbHMvc2xlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZiZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3NsZWVwLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNsZWVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIEJCX0FVRElUIEdOVSBpc3N1ZXMgLS0gZmFuY3kgdmVyc2lvbiBtYXRjaGVzIGV4Y2VwdCBhcmdzIG11c3QgYmUgaW50cy4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvc2xlZXAuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFJld3JpdHRlbiB0byBkbyBwcm9wZXIgYXJnIGFuZCBlcnJvciBjaGVja2luZy4KKyAqIEFsc28sIGFkZGVkIGEgJ2ZhbmN5JyBjb25maWd1cmF0aW9uIHRvIGFjY2VwdCBtdWx0aXBsZSBhcmdzIHdpdGgKKyAqIHRpbWUgc3VmZml4ZXMgZm9yIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBhbmQgZGF5cy4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2xlZXBfdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9TTEVFUCgiWyIpICJOIiBJRl9GRUFUVVJFX0ZBTkNZX1NMRUVQKCJdLi4uIikKKy8vdXNhZ2U6I2RlZmluZSBzbGVlcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfRkFOQ1lfU0xFRVAoIlBhdXNlIGZvciBOIHNlY29uZHMiKQorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9TTEVFUCgKKy8vdXNhZ2U6ICAgICAgICJQYXVzZSBmb3IgYSB0aW1lIGVxdWFsIHRvIHRoZSB0b3RhbCBvZiB0aGUgYXJncyBnaXZlbiwgd2hlcmUgZWFjaCBhcmcgY2FuXG4iCisvL3VzYWdlOiAgICAgICAiaGF2ZSBhbiBvcHRpb25hbCBzdWZmaXggb2YgKHMpZWNvbmRzLCAobSlpbnV0ZXMsIChoKW91cnMsIG9yIChkKWF5cyIpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNsZWVwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHNsZWVwIDJcbiIKKy8vdXNhZ2U6ICAgICAgICJbMiBzZWNvbmQgZGVsYXkgcmVzdWx0c11cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfU0xFRVAoCisvL3VzYWdlOiAgICAgICAiJCBzbGVlcCAxZCAzaCAyMm0gOHNcbiIKKy8vdXNhZ2U6ICAgICAgICJbOTg1Mjggc2Vjb25kIGRlbGF5IHJlc3VsdHNdXG4iKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRG8gbm90IG1ha2UgdGhpcyBhcHBsZXQgTk9GT1JLLiBJdCBicmVha3MgXkMtaW5nIG9mIHBhdXNlcyBpbiBzaGVsbHMgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfU0xFRVAgfHwgRU5BQkxFX0ZFQVRVUkVfRkxPQVRfU0xFRVAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgc2Z4W10gPSB7CisJeyAicyIsIDEgfSwKKwl7ICJtIiwgNjAgfSwKKwl7ICJoIiwgNjAqNjAgfSwKKwl7ICJkIiwgMjQqNjAqNjAgfSwKKwl7ICIiLCAwIH0KK307CisjZW5kaWYKKworaW50IHNsZWVwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzbGVlcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkxPQVRfU0xFRVAKKwlkb3VibGUgZHVyYXRpb247CisJc3RydWN0IHRpbWVzcGVjIHRzOworI2Vsc2UKKwl1bnNpZ25lZCBkdXJhdGlvbjsKKyNlbmRpZgorCisJKythcmd2OworCWlmICghKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZMT0FUX1NMRUVQCisKKyMgaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJLyogdW5kbyBidXN5Ym94LmMgc2V0bG9jYWxlICovCisJc2V0bG9jYWxlKExDX05VTUVSSUMsICJDIik7CisjIGVuZGlmCisJZHVyYXRpb24gPSAwOworCWRvIHsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisJCWlmIChzdHJjaHIoYXJnLCAnLicpKSB7CisJCQlkb3VibGUgZDsKKwkJCWNoYXIgKnBwOworCQkJaW50IGxlbiA9IHN0cnNwbihhcmcsICIwMTIzNDU2Nzg5LiIpOworCQkJY2hhciBzdiA9IGFyZ1tsZW5dOworCQkJYXJnW2xlbl0gPSAnXDAnOworCQkJZXJybm8gPSAwOworCQkJZCA9IHN0cnRvZChhcmcsICZwcCk7CisJCQlpZiAoZXJybm8gfHwgKnBwKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWFyZyArPSBsZW47CisJCQkqYXJnLS0gPSBzdjsKKwkJCXN2ID0gKmFyZzsKKwkJCSphcmcgPSAnMSc7CisJCQlkdXJhdGlvbiArPSBkICogeGF0b3VsX3NmeChhcmcsIHNmeCk7CisJCQkqYXJnID0gc3Y7CisJCX0gZWxzZSB7CisJCQlkdXJhdGlvbiArPSB4YXRvdWxfc2Z4KGFyZywgc2Z4KTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJdHMudHZfc2VjID0gTUFYSU5UKHR5cGVvZih0cy50dl9zZWMpKTsKKwl0cy50dl9uc2VjID0gMDsKKwlpZiAoZHVyYXRpb24gPj0gMCAmJiBkdXJhdGlvbiA8IHRzLnR2X3NlYykgeworCQl0cy50dl9zZWMgPSBkdXJhdGlvbjsKKwkJdHMudHZfbnNlYyA9IChkdXJhdGlvbiAtIHRzLnR2X3NlYykgKiAxMDAwMDAwMDAwOworCX0KKwlkbyB7CisJCWVycm5vID0gMDsKKwkJbmFub3NsZWVwKCZ0cywgJnRzKTsKKwl9IHdoaWxlIChlcnJubyA9PSBFSU5UUik7CisKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX0ZBTkNZX1NMRUVQCisKKwlkdXJhdGlvbiA9IDA7CisJZG8geworCQlkdXJhdGlvbiArPSB4YXRvdV9yYW5nZV9zZngoKmFyZ3YsIDAsIFVJTlRfTUFYIC0gZHVyYXRpb24sIHNmeCk7CisJfSB3aGlsZSAoKisrYXJndik7CisJc2xlZXAoZHVyYXRpb24pOworCisjZWxzZSAvKiBzaW1wbGUgKi8KKworCWR1cmF0aW9uID0geGF0b3UoKmFyZ3YpOworCXNsZWVwKGR1cmF0aW9uKTsKKwkvLyBPZmYuIElmIGl0J3MgcmVhbGx5IG5lZWRlZCwgcHJvdmlkZSBleGFtcGxlIHdoeQorCS8vaWYgKHNsZWVwKGR1cmF0aW9uKSkgeworCS8vCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJLy99CisKKyNlbmRpZgorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9zb3J0LmMgYi9jb3JldXRpbHMvc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjA3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvc29ydC5jCkBAIC0wLDAgKzEsNDY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTdVMzIGNvbXBsaWFudCBzb3J0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTUFJTlRBSU5FUjogUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFNlZSBTdVMzIHNvcnQgc3RhbmRhcmQgYXQ6CisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3NvcnQuaHRtbAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzb3J0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW5ydSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU09SVF9CSUcoImdNY3N6YmRmaW1TVG9rdF0gWy1vIEZJTEVdIFstayBzdGFydFsub2Zmc2V0XVtvcHRzXVssZW5kWy5vZmZzZXRdW29wdHNdXSBbLXQgQ0hBUiIpCisvL3VzYWdlOiAgICAgICAiXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc29ydF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNvcnQgbGluZXMgb2YgdGV4dFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9TT1JUX0JJRygKKy8vdXNhZ2U6ICAgICAiXG4JLWIJSWdub3JlIGxlYWRpbmcgYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktYwlDaGVjayB3aGV0aGVyIGlucHV0IGlzIHNvcnRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGljdGlvbmFyeSBvcmRlciAoYmxhbmsgb3IgYWxwaGFudW1lcmljIG9ubHkpIgorLy91c2FnZTogICAgICJcbgktZglJZ25vcmUgY2FzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWcJR2VuZXJhbCBudW1lcmljYWwgc29ydCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSWdub3JlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMiCisvL3VzYWdlOiAgICAgIlxuCS1rCVNvcnQga2V5IgorLy91c2FnZTogICAgICJcbgktTQlTb3J0IG1vbnRoIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbglTb3J0IG51bWJlcnMiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKAorLy91c2FnZTogICAgICJcbgktbwlPdXRwdXQgdG8gZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJU29ydCBieSBrZXkiCisvL3VzYWdlOiAgICAgIlxuCS10IENIQVIJS2V5IHNlcGFyYXRvciIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUmV2ZXJzZSBzb3J0IG9yZGVyIgorLy91c2FnZToJSUZfRkVBVFVSRV9TT1JUX0JJRygKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU3RhYmxlIChkb24ndCBzb3J0IHRpZXMgYWxwaGFiZXRpY2FsbHkpIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktdQlTdXBwcmVzcyBkdXBsaWNhdGUgbGluZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKAorLy91c2FnZTogICAgICJcbgkteglMaW5lcyBhcmUgdGVybWluYXRlZCBieSBOVUwsIG5vdCBuZXdsaW5lIgorLy91c2FnZTogICAgICJcbgktbVNUCUlnbm9yZWQgZm9yIEdOVSBjb21wYXRpYmlsaXR5IikKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc29ydF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIC1lIFwiZVxcbmZcXG5iXFxuZFxcbmNcXG5hXCIgfCBzb3J0XG4iCisvL3VzYWdlOiAgICAgICAiYVxuIgorLy91c2FnZTogICAgICAgImJcbiIKKy8vdXNhZ2U6ICAgICAgICJjXG4iCisvL3VzYWdlOiAgICAgICAiZFxuIgorLy91c2FnZTogICAgICAgImVcbiIKKy8vdXNhZ2U6ICAgICAgICJmXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKAorLy91c2FnZToJCSIkIGVjaG8gLWUgXCJjIDNcXG5iIDJcXG5kIDJcIiB8ICRTT1JUIC1rIDIsMm4gLWsgMSwxclxuIgorLy91c2FnZToJCSJkIDJcbiIKKy8vdXNhZ2U6CQkiYiAyXG4iCisvL3VzYWdlOgkJImMgM1xuIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICAgIiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworLyoKKwlzb3J0IFstbV1bLW8gb3V0cHV0XVstYmRmaW5ydV1bLXQgY2hhcl1bLWsga2V5ZGVmXS4uLiBbZmlsZS4uLl0KKwlzb3J0IC1jIFstYmRmaW5ydV1bLXQgY2hhcl1bLWsga2V5ZGVmXVtmaWxlXQorKi8KKworLyogVGhlc2UgYXJlIHNvcnQgdHlwZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIE9QVF9TVFJbXSBBTElHTjEgPSAibmdNdWNzemJyZGZpbVM6VDpvOms6dDoiOworZW51bSB7CisJRkxBR19uICA9IDEsICAgICAgICAgICAgLyogTnVtZXJpYyBzb3J0ICovCisJRkxBR19nICA9IDIsICAgICAgICAgICAgLyogU29ydCB1c2luZyBzdHJ0b2QoKSAqLworCUZMQUdfTSAgPSA0LCAgICAgICAgICAgIC8qIFNvcnQgZGF0ZSAqLworLyogdWNzeiBhcHBseSB0byByb290IGxldmVsIG9ubHksIG5vdCBrZXlzLiAgYiBhdCByb290IGxldmVsIGltcGxpZXMgYmIgKi8KKwlGTEFHX3UgID0gOCwgICAgICAgICAgICAvKiBVbmlxdWUgKi8KKwlGTEFHX2MgID0gMHgxMCwgICAgICAgICAvKiBDaGVjazogbm8gb3V0cHV0LCBleGl0KCFvcmRlcmVkKSAqLworCUZMQUdfcyAgPSAweDIwLCAgICAgICAgIC8qIFN0YWJsZSBzb3J0LCBubyBhc2NpaSBmYWxsYmFjayBhdCBlbmQgKi8KKwlGTEFHX3ogID0gMHg0MCwgICAgICAgICAvKiBJbnB1dCBhbmQgb3V0cHV0IGlzIE5VTCB0ZXJtaW5hdGVkLCBub3QgXG4gKi8KKy8qIFRoZXNlIGNhbiBiZSBhcHBsaWVkIHRvIHNlYXJjaCBrZXlzLCB0aGUgcHJldmlvdXMgZm91ciBjYW4ndCAqLworCUZMQUdfYiAgPSAweDgwLCAgICAgICAgIC8qIElnbm9yZSBsZWFkaW5nIGJsYW5rcyAqLworCUZMQUdfciAgPSAweDEwMCwgICAgICAgIC8qIFJldmVyc2UgKi8KKwlGTEFHX2QgID0gMHgyMDAsICAgICAgICAvKiBJZ25vcmUgIShpc2FsbnVtKCl8aXNzcGFjZSgpKSAqLworCUZMQUdfZiAgPSAweDQwMCwgICAgICAgIC8qIEZvcmNlIHVwcGVyY2FzZSAqLworCUZMQUdfaSAgPSAweDgwMCwgICAgICAgIC8qIElnbm9yZSAhaXNwcmludCgpICovCisJRkxBR19tICA9IDB4MTAwMCwgICAgICAgLyogaWdub3JlZDogbWVyZ2UgYWxyZWFkeSBzb3J0ZWQgZmlsZXM7IGRvIG5vdCBzb3J0ICovCisJRkxBR19TICA9IDB4MjAwMCwgICAgICAgLyogaWdub3JlZDogLVMsIC0tYnVmZmVyLXNpemU9U0laRSAqLworCUZMQUdfVCAgPSAweDQwMDAsICAgICAgIC8qIGlnbm9yZWQ6IC1ULCAtLXRlbXBvcmFyeS1kaXJlY3Rvcnk9RElSICovCisJRkxBR19vICA9IDB4ODAwMCwKKwlGTEFHX2sgID0gMHgxMDAwMCwKKwlGTEFHX3QgID0gMHgyMDAwMCwKKwlGTEFHX2JiID0gMHg4MDAwMDAwMCwgICAvKiBJZ25vcmUgdHJhaWxpbmcgYmxhbmtzICAqLworfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCitzdGF0aWMgY2hhciBrZXlfc2VwYXJhdG9yOworCitzdGF0aWMgc3RydWN0IHNvcnRfa2V5IHsKKwlzdHJ1Y3Qgc29ydF9rZXkgKm5leHRfa2V5OyAgLyogbGlua2VkIGxpc3QgKi8KKwl1bnNpZ25lZCByYW5nZVs0XTsgICAgICAgICAgLyogc3RhcnQgd29yZCwgc3RhcnQgY2hhciwgZW5kIHdvcmQsIGVuZCBjaGFyICovCisJdW5zaWduZWQgZmxhZ3M7Cit9ICprZXlfbGlzdDsKKworc3RhdGljIGNoYXIgKmdldF9rZXkoY2hhciAqc3RyLCBzdHJ1Y3Qgc29ydF9rZXkgKmtleSwgaW50IGZsYWdzKQoreworCWludCBzdGFydCA9IDAsIGVuZCA9IDAsIGxlbiwgajsKKwl1bnNpZ25lZCBpOworCisJLyogU3BlY2lhbCBjYXNlIHdob2xlIHN0cmluZywgc28gd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIGEgY29weSAqLworCWlmIChrZXktPnJhbmdlWzBdID09IDEgJiYgIWtleS0+cmFuZ2VbMV0gJiYgIWtleS0+cmFuZ2VbMl0gJiYgIWtleS0+cmFuZ2VbM10KKwkgJiYgIShmbGFncyAmIChGTEFHX2IgfCBGTEFHX2QgfCBGTEFHX2YgfCBGTEFHX2kgfCBGTEFHX2JiKSkKKwkpIHsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwkvKiBGaW5kIHN0YXJ0IG9mIGtleSBvbiBmaXJzdCBwYXNzLCBlbmQgb24gc2Vjb25kIHBhc3MgKi8KKwlsZW4gPSBzdHJsZW4oc3RyKTsKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWlmICgha2V5LT5yYW5nZVsyKmpdKQorCQkJZW5kID0gbGVuOworCQkvKiBMb29wIHRocm91Z2ggZmllbGRzICovCisJCWVsc2UgeworCQkJZW5kID0gMDsKKwkJCWZvciAoaSA9IDE7IGkgPCBrZXktPnJhbmdlWzIqal0gKyBqOyBpKyspIHsKKwkJCQlpZiAoa2V5X3NlcGFyYXRvcikgeworCQkJCQkvKiBTa2lwIGJvZHkgb2Yga2V5IGFuZCBzZXBhcmF0b3IgKi8KKwkJCQkJd2hpbGUgKHN0cltlbmRdKSB7CisJCQkJCQlpZiAoc3RyW2VuZCsrXSA9PSBrZXlfc2VwYXJhdG9yKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogU2tpcCBsZWFkaW5nIGJsYW5rcyAqLworCQkJCQl3aGlsZSAoaXNzcGFjZShzdHJbZW5kXSkpCisJCQkJCQllbmQrKzsKKwkJCQkJLyogU2tpcCBib2R5IG9mIGtleSAqLworCQkJCQl3aGlsZSAoc3RyW2VuZF0pIHsKKwkJCQkJCWlmIChpc3NwYWNlKHN0cltlbmRdKSkKKwkJCQkJCQlicmVhazsKKwkJCQkJCWVuZCsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghaikgc3RhcnQgPSBlbmQ7CisJfQorCS8qIFN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBpZiBuZWNlc3NhcnkgKi8KKy8vWFhYOiBza2lwX3doaXRlc3BhY2UoKQorCWlmIChmbGFncyAmIEZMQUdfYikKKwkJd2hpbGUgKGlzc3BhY2Uoc3RyW3N0YXJ0XSkpIHN0YXJ0Kys7CisJLyogU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZ3MgJiBGTEFHX2JiKQorCQl3aGlsZSAoZW5kID4gc3RhcnQgJiYgaXNzcGFjZShzdHJbZW5kLTFdKSkgZW5kLS07CisJLyogSGFuZGxlIG9mZnNldHMgb24gc3RhcnQgYW5kIGVuZCAqLworCWlmIChrZXktPnJhbmdlWzNdKSB7CisJCWVuZCArPSBrZXktPnJhbmdlWzNdIC0gMTsKKwkJaWYgKGVuZCA+IGxlbikgZW5kID0gbGVuOworCX0KKwlpZiAoa2V5LT5yYW5nZVsxXSkgeworCQlzdGFydCArPSBrZXktPnJhbmdlWzFdIC0gMTsKKwkJaWYgKHN0YXJ0ID4gbGVuKSBzdGFydCA9IGxlbjsKKwl9CisJLyogTWFrZSB0aGUgY29weSAqLworCWlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7CisJc3RyID0geHN0cm5kdXAoc3RyK3N0YXJ0LCBlbmQtc3RhcnQpOworCS8qIEhhbmRsZSAtZCAqLworCWlmIChmbGFncyAmIEZMQUdfZCkgeworCQlmb3IgKHN0YXJ0ID0gZW5kID0gMDsgc3RyW2VuZF07IGVuZCsrKQorCQkJaWYgKGlzc3BhY2Uoc3RyW2VuZF0pIHx8IGlzYWxudW0oc3RyW2VuZF0pKQorCQkJCXN0cltzdGFydCsrXSA9IHN0cltlbmRdOworCQlzdHJbc3RhcnRdID0gJ1wwJzsKKwl9CisJLyogSGFuZGxlIC1pICovCisJaWYgKGZsYWdzICYgRkxBR19pKSB7CisJCWZvciAoc3RhcnQgPSBlbmQgPSAwOyBzdHJbZW5kXTsgZW5kKyspCisJCQlpZiAoaXNwcmludF9hc2NpaW9ubHkoc3RyW2VuZF0pKQorCQkJCXN0cltzdGFydCsrXSA9IHN0cltlbmRdOworCQlzdHJbc3RhcnRdID0gJ1wwJzsKKwl9CisJLyogSGFuZGxlIC1mICovCisJaWYgKGZsYWdzICYgRkxBR19mKQorCQlmb3IgKGkgPSAwOyBzdHJbaV07IGkrKykKKwkJCXN0cltpXSA9IHRvdXBwZXIoc3RyW2ldKTsKKworCXJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9rZXkgKmFkZF9rZXkodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ydF9rZXkgKipwa2V5ID0gJmtleV9saXN0OworCXdoaWxlICgqcGtleSkKKwkJcGtleSA9ICYoKCpwa2V5KS0+bmV4dF9rZXkpOworCXJldHVybiAqcGtleSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzb3J0X2tleSkpOworfQorCisjZGVmaW5lIEdFVF9MSU5FKGZwKSBcCisJKChvcHRpb25fbWFzazMyICYgRkxBR196KSBcCisJPyBiYl9nZXRfY2h1bmtfZnJvbV9maWxlKGZwLCBOVUxMKSBcCisJOiB4bWFsbG9jX2ZnZXRsaW5lKGZwKSkKKyNlbHNlCisjZGVmaW5lIEdFVF9MSU5FKGZwKSB4bWFsbG9jX2ZnZXRsaW5lKGZwKQorI2VuZGlmCisKKy8qIEl0ZXJhdGUgdGhyb3VnaCBrZXlzIGxpc3QgYW5kIHBlcmZvcm0gY29tcGFyaXNvbnMgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9rZXlzKGNvbnN0IHZvaWQgKnhhcmcsIGNvbnN0IHZvaWQgKnlhcmcpCit7CisJaW50IGZsYWdzID0gb3B0aW9uX21hc2szMiwgcmV0dmFsID0gMDsKKwljaGFyICp4LCAqeTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCisJc3RydWN0IHNvcnRfa2V5ICprZXk7CisKKwlmb3IgKGtleSA9IGtleV9saXN0OyAhcmV0dmFsICYmIGtleTsga2V5ID0ga2V5LT5uZXh0X2tleSkgeworCQlmbGFncyA9IGtleS0+ZmxhZ3MgPyBrZXktPmZsYWdzIDogb3B0aW9uX21hc2szMjsKKwkJLyogQ2hvcCBvdXQgYW5kIG1vZGlmeSBrZXkgY2h1bmtzLCBoYW5kbGluZyAtZGZpYiAqLworCQl4ID0gZ2V0X2tleSgqKGNoYXIgKiopeGFyZywga2V5LCBmbGFncyk7CisJCXkgPSBnZXRfa2V5KCooY2hhciAqKil5YXJnLCBrZXksIGZsYWdzKTsKKyNlbHNlCisJLyogVGhpcyBjdXJseSBicmFja2V0IHNlcnZlcyBubyBwdXJwb3NlIGJ1dCB0byBtYXRjaCB0aGUgbmVzdGluZworCSAgIGxldmVsIG9mIHRoZSBmb3IgKCkgbG9vcCB3ZSdyZSBub3QgdXNpbmcgKi8KKwl7CisJCXggPSAqKGNoYXIgKiopeGFyZzsKKwkJeSA9ICooY2hhciAqKil5YXJnOworI2VuZGlmCisJCS8qIFBlcmZvcm0gYWN0dWFsIGNvbXBhcmlzb24gKi8KKwkJc3dpdGNoIChmbGFncyAmIDcpIHsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHNvcnQgdHlwZSIpOworCQkJYnJlYWs7CisJCS8qIEFzY2lpIHNvcnQgKi8KKwkJY2FzZSAwOgorI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCQkJcmV0dmFsID0gc3RyY29sbCh4LCB5KTsKKyNlbHNlCisJCQlyZXR2YWwgPSBzdHJjbXAoeCwgeSk7CisjZW5kaWYKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCisJCWNhc2UgRkxBR19nOiB7CisJCQljaGFyICp4eCwgKnl5OworCQkJZG91YmxlIGR4ID0gc3RydG9kKHgsICZ4eCk7CisJCQlkb3VibGUgZHkgPSBzdHJ0b2QoeSwgJnl5KTsKKwkJCS8qIG5vdCBudW1iZXJzIDwgTmFOIDwgLWluZmluaXR5IDwgbnVtYmVycyA8ICtpbmZpbml0eSkgKi8KKwkJCWlmICh4ID09IHh4KQorCQkJCXJldHZhbCA9ICh5ID09IHl5ID8gMCA6IC0xKTsKKwkJCWVsc2UgaWYgKHkgPT0geXkpCisJCQkJcmV0dmFsID0gMTsKKwkJCS8qIENoZWNrIGZvciBpc25hbiAqLworCQkJZWxzZSBpZiAoZHggIT0gZHgpCisJCQkJcmV0dmFsID0gKGR5ICE9IGR5KSA/IDAgOiAtMTsKKwkJCWVsc2UgaWYgKGR5ICE9IGR5KQorCQkJCXJldHZhbCA9IDE7CisJCQkvKiBDaGVjayBmb3IgaW5maW5pdHkuICBDb3VsZCB1bmRlcmZsb3csIGJ1dCBpdCBhdm9pZHMgbGlibS4gKi8KKwkJCWVsc2UgaWYgKDEuMCAvIGR4ID09IDAuMCkgeworCQkJCWlmIChkeCA8IDApCisJCQkJCXJldHZhbCA9ICgxLjAgLyBkeSA9PSAwLjAgJiYgZHkgPCAwKSA/IDAgOiAtMTsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9ICgxLjAgLyBkeSA9PSAwLjAgJiYgZHkgPiAwKSA/IDAgOiAxOworCQkJfSBlbHNlIGlmICgxLjAgLyBkeSA9PSAwLjApCisJCQkJcmV0dmFsID0gKGR5IDwgMCkgPyAxIDogLTE7CisJCQllbHNlCisJCQkJcmV0dmFsID0gKGR4ID4gZHkpID8gMSA6ICgoZHggPCBkeSkgPyAtMSA6IDApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGTEFHX006IHsKKwkJCXN0cnVjdCB0bSB0aHltZTsKKwkJCWludCBkeDsKKwkJCWNoYXIgKnh4LCAqeXk7CisKKwkJCXh4ID0gc3RycHRpbWUoeCwgIiViIiwgJnRoeW1lKTsKKwkJCWR4ID0gdGh5bWUudG1fbW9uOworCQkJeXkgPSBzdHJwdGltZSh5LCAiJWIiLCAmdGh5bWUpOworCQkJaWYgKCF4eCkKKwkJCQlyZXR2YWwgPSAoIXl5KSA/IDAgOiAtMTsKKwkJCWVsc2UgaWYgKCF5eSkKKwkJCQlyZXR2YWwgPSAxOworCQkJZWxzZQorCQkJCXJldHZhbCA9IChkeCA9PSB0aHltZS50bV9tb24pID8gMCA6IGR4IC0gdGh5bWUudG1fbW9uOworCQkJYnJlYWs7CisJCX0KKwkJLyogRnVsbCBmbG9hdGluZyBwb2ludCB2ZXJzaW9uIG9mIC1uICovCisJCWNhc2UgRkxBR19uOiB7CisJCQlkb3VibGUgZHggPSBhdG9mKHgpOworCQkJZG91YmxlIGR5ID0gYXRvZih5KTsKKwkJCXJldHZhbCA9IChkeCA+IGR5KSA/IDEgOiAoKGR4IDwgZHkpID8gLTEgOiAwKTsKKwkJCWJyZWFrOworCQl9CisJCX0gLyogc3dpdGNoICovCisJCS8qIEZyZWUga2V5IGNvcGllcy4gKi8KKwkJaWYgKHggIT0gKihjaGFyICoqKXhhcmcpIGZyZWUoeCk7CisJCWlmICh5ICE9ICooY2hhciAqKil5YXJnKSBmcmVlKHkpOworCQkvKiBpZiAocmV0dmFsKSBicmVhazsgLSBkb25lIGJ5IGZvciAoKSBhbnl3YXkgKi8KKyNlbHNlCisJCS8qIEludGVnZXIgdmVyc2lvbiBvZiAtbiBmb3IgdGlueSBzeXN0ZW1zICovCisJCWNhc2UgRkxBR19uOgorCQkJcmV0dmFsID0gYXRvaSh4KSAtIGF0b2koeSk7CisJCQlicmVhazsKKwkJfSAvKiBzd2l0Y2ggKi8KKyNlbmRpZgorCX0gLyogZm9yICovCisKKwkvKiBQZXJmb3JtIGZhbGxiYWNrIHNvcnQgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCFyZXR2YWwgJiYgIShvcHRpb25fbWFzazMyICYgRkxBR19zKSkKKwkJcmV0dmFsID0gc3RyY21wKCooY2hhciAqKil4YXJnLCAqKGNoYXIgKiopeWFyZyk7CisKKwlpZiAoZmxhZ3MgJiBGTEFHX3IpIHJldHVybiAtcmV0dmFsOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworc3RhdGljIHVuc2lnbmVkIHN0cjJ1KGNoYXIgKipzdHIpCit7CisJdW5zaWduZWQgbG9uZyBsdTsKKwlpZiAoIWlzZGlnaXQoKCpzdHIpWzBdKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBmaWVsZCBzcGVjaWZpY2F0aW9uIik7CisJbHUgPSBzdHJ0b3VsKCpzdHIsIHN0ciwgMTApOworCWlmICgoc2l6ZW9mKGxvbmcpID4gc2l6ZW9mKGludCkgJiYgbHUgPiBJTlRfTUFYKSB8fCAhbHUpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZmllbGQgc3BlY2lmaWNhdGlvbiIpOworCXJldHVybiBsdTsKK30KKyNlbmRpZgorCitpbnQgc29ydF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc29ydF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbGluZSwgKipsaW5lczsKKwljaGFyICpzdHJfaWdub3JlZCwgKnN0cl9vLCAqc3RyX3Q7CisJbGxpc3RfdCAqbHN0X2sgPSBOVUxMOworCWludCBpLCBmbGFnOworCWludCBsaW5lY291bnQ7CisJdW5zaWduZWQgb3B0czsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7CisKKwkvKiBQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLworCS8qIC1vIGFuZCAtdCBjYW4gYmUgZ2l2ZW4gYXQgbW9zdCBvbmNlICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiby0tbzp0LS10OiIgLyogLXQsIC1vOiBhdCBtb3N0IG9uZSBvZiBlYWNoICovCisJCQkiazo6IjsgLyogLWsgdGFrZXMgbGlzdCAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCBPUFRfU1RSLCAmc3RyX2lnbm9yZWQsICZzdHJfaWdub3JlZCwgJnN0cl9vLCAmbHN0X2ssICZzdHJfdCk7CisJLyogZ2xvYmFsIGIgc3RyaXBzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyAqLworCWlmIChvcHRzICYgRkxBR19iKQorCQlvcHRpb25fbWFzazMyIHw9IEZMQUdfYmI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKKwlpZiAob3B0cyAmIEZMQUdfdCkgeworCQlpZiAoIXN0cl90WzBdIHx8IHN0cl90WzFdKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCAtdCBwYXJhbWV0ZXIiKTsKKwkJa2V5X3NlcGFyYXRvciA9IHN0cl90WzBdOworCX0KKwkvKiBub3RlOiBiZWxvdyB0aGlzIHBvaW50IHdlIHVzZSBvcHRpb25fbWFzazMyLCBub3Qgb3B0cywKKwkgKiBzaW5jZSB0aGF0IHJlZHVjZXMgcmVnaXN0ZXIgcHJlc3N1cmUgYW5kIG1ha2VzIGNvZGUgc21hbGxlciAqLworCisJLyogcGFyc2Ugc29ydCBrZXkgKi8KKwl3aGlsZSAobHN0X2spIHsKKwkJZW51bSB7CisJCQlGTEFHX2FsbG93ZWRfZm9yX2sgPQorCQkJCUZMQUdfbiB8IC8qIE51bWVyaWMgc29ydCAqLworCQkJCUZMQUdfZyB8IC8qIFNvcnQgdXNpbmcgc3RydG9kKCkgKi8KKwkJCQlGTEFHX00gfCAvKiBTb3J0IGRhdGUgKi8KKwkJCQlGTEFHX2IgfCAvKiBJZ25vcmUgbGVhZGluZyBibGFua3MgKi8KKwkJCQlGTEFHX3IgfCAvKiBSZXZlcnNlICovCisJCQkJRkxBR19kIHwgLyogSWdub3JlICEoaXNhbG51bSgpfGlzc3BhY2UoKSkgKi8KKwkJCQlGTEFHX2YgfCAvKiBGb3JjZSB1cHBlcmNhc2UgKi8KKwkJCQlGTEFHX2kgfCAvKiBJZ25vcmUgIWlzcHJpbnQoKSAqLworCQkJMAorCQl9OworCQlzdHJ1Y3Qgc29ydF9rZXkgKmtleSA9IGFkZF9rZXkoKTsKKwkJY2hhciAqc3RyX2sgPSBsbGlzdF9wb3AoJmxzdF9rKTsKKworCQlpID0gMDsgLyogaT09MCBiZWZvcmUgY29tbWEsIDEgYWZ0ZXIgKC1rMyw2KSAqLworCQl3aGlsZSAoKnN0cl9rKSB7CisJCQkvKiBTdGFydCBvZiByYW5nZSAqLworCQkJLyogQ2Fubm90IHVzZSBiYl9zdHJ0b3UgLSBzdWZmaXggY2FuIGJlIGEgbGV0dGVyICovCisJCQlrZXktPnJhbmdlWzIqaV0gPSBzdHIydSgmc3RyX2spOworCQkJaWYgKCpzdHJfayA9PSAnLicpIHsKKwkJCQlzdHJfaysrOworCQkJCWtleS0+cmFuZ2VbMippKzFdID0gc3RyMnUoJnN0cl9rKTsKKwkJCX0KKwkJCXdoaWxlICgqc3RyX2spIHsKKwkJCQljb25zdCBjaGFyICp0ZW1wMjsKKworCQkJCWlmICgqc3RyX2sgPT0gJywnICYmICFpKyspIHsKKwkJCQkJc3RyX2srKzsKKwkJCQkJYnJlYWs7CisJCQkJfSAvKiBubyBlbHNlIG5lZWRlZDogZmFsbCB0aHJvdWdoIHRvIHN5bnRheCBlcnJvcgorCQkJCQliZWNhdXNlIGNvbW1hIGlzbid0IGluIE9QVF9TVFIgKi8KKwkJCQl0ZW1wMiA9IHN0cmNocihPUFRfU1RSLCAqc3RyX2spOworCQkJCWlmICghdGVtcDIpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIGtleSBvcHRpb24iKTsKKwkJCQlmbGFnID0gMSA8PCAodGVtcDIgLSBPUFRfU1RSKTsKKwkJCQlpZiAoZmxhZyAmIH5GTEFHX2FsbG93ZWRfZm9yX2spCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHNvcnQgdHlwZSIpOworCQkJCS8qIGIgYWZ0ZXIgJywnIG1lYW5zIHN0cmlwIF90cmFpbGluZ18gc3BhY2UgKi8KKwkJCQlpZiAoaSAmJiBmbGFnID09IEZMQUdfYikKKwkJCQkJZmxhZyA9IEZMQUdfYmI7CisJCQkJa2V5LT5mbGFncyB8PSBmbGFnOworCQkJCXN0cl9rKys7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8qIE9wZW4gaW5wdXQgZmlsZXMgYW5kIHJlYWQgZGF0YSAqLworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCWxpbmVjb3VudCA9IDA7CisJbGluZXMgPSBOVUxMOworCWRvIHsKKwkJLyogY29yZXV0aWxzIDYuOSBjb21wYXQ6IGFib3J0IG9uIGZpcnN0IG9wZW4gZXJyb3IsCisJCSAqIGRvIG5vdCBjb250aW51ZSB0byBuZXh0IGZpbGU6ICovCisJCUZJTEUgKmZwID0geGZvcGVuX3N0ZGluKCphcmd2KTsKKwkJZm9yICg7OykgeworCQkJbGluZSA9IEdFVF9MSU5FKGZwKTsKKwkJCWlmICghbGluZSkKKwkJCQlicmVhazsKKwkJCWxpbmVzID0geHJlYWxsb2NfdmVjdG9yKGxpbmVzLCA2LCBsaW5lY291bnQpOworCQkJbGluZXNbbGluZWNvdW50KytdID0gbGluZTsKKwkJfQorCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZwKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCisJLyogaWYgbm8ga2V5LCBwZXJmb3JtIGFscGhhYmV0aWMgc29ydCAqLworCWlmICgha2V5X2xpc3QpCisJCWFkZF9rZXkoKS0+cmFuZ2VbMF0gPSAxOworCS8qIGhhbmRsZSAtYyAqLworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19jKSB7CisJCWludCBqID0gKG9wdGlvbl9tYXNrMzIgJiBGTEFHX3UpID8gLTEgOiAwOworCQlmb3IgKGkgPSAxOyBpIDwgbGluZWNvdW50OyBpKyspIHsKKwkJCWlmIChjb21wYXJlX2tleXMoJmxpbmVzW2ktMV0sICZsaW5lc1tpXSkgPiBqKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDaGVjayBsaW5lICV1XG4iLCBpKTsKKwkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJfQorCQl9CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorI2VuZGlmCisJLyogUGVyZm9ybSB0aGUgYWN0dWFsIHNvcnQgKi8KKwlxc29ydChsaW5lcywgbGluZWNvdW50LCBzaXplb2YobGluZXNbMF0pLCBjb21wYXJlX2tleXMpOworCS8qIGhhbmRsZSAtdSAqLworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR191KSB7CisJCWZsYWcgPSAwOworCQkvKiBjb3JldXRpbHMgNi4zIGRyb3AgbGluZXMgZm9yIHdoaWNoIG9ubHkga2V5IGlzIHRoZSBzYW1lICovCisJCS8qIC0tIGRpc2FibGluZyBsYXN0LXJlc29ydCBjb21wYXJlLi4uICovCisJCW9wdGlvbl9tYXNrMzIgfD0gRkxBR19zOworCQlmb3IgKGkgPSAxOyBpIDwgbGluZWNvdW50OyBpKyspIHsKKwkJCWlmIChjb21wYXJlX2tleXMoJmxpbmVzW2ZsYWddLCAmbGluZXNbaV0pID09IDApCisJCQkJZnJlZShsaW5lc1tpXSk7CisJCQllbHNlCisJCQkJbGluZXNbKytmbGFnXSA9IGxpbmVzW2ldOworCQl9CisJCWlmIChsaW5lY291bnQpCisJCQlsaW5lY291bnQgPSBmbGFnKzE7CisJfQorCisJLyogUHJpbnQgaXQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworCS8qIE9wZW4gb3V0cHV0IGZpbGUgX2FmdGVyXyB3ZSByZWFkIGFsbCBpbnB1dCBvbmVzICovCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX28pCisJCXhtb3ZlX2ZkKHhvcGVuKHN0cl9vLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKyNlbmRpZgorCWZsYWcgPSAob3B0aW9uX21hc2szMiAmIEZMQUdfeikgPyAnXDAnIDogJ1xuJzsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZWNvdW50OyBpKyspCisJCXByaW50ZigiJXMlYyIsIGxpbmVzW2ldLCBmbGFnKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9zcGxpdC5jIGIvY29yZXV0aWxzL3NwbGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlNjQwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zcGxpdC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzcGxpdCAtIHNwbGl0IGEgZmlsZSBpbnRvIHBpZWNlcworICogQ29weXJpZ2h0IChjKSAyMDA3IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIEJCX0FVRElUOiBTVVN2MyBjb21wbGlhbnQKKyAqIFNVU3YzIHJlcXVpcmVtZW50czoKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvc3BsaXQuaHRtbAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzcGxpdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtJTlBVVCBbUFJFRklYXV0iCisvL3VzYWdlOiNkZWZpbmUgc3BsaXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWIgTltrfG1dCVNwbGl0IGJ5IE4gKGtpbG98bWVnYSlieXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTgkJU3BsaXQgYnkgTiBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWEgTgkJVXNlIE4gbGV0dGVycyBhcyBzdWZmaXgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNwbGl0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHNwbGl0IFRPRE8gZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBjYXQgVE9ETyB8IHNwbGl0IC1hIDIgLWwgMiBUT0RPX1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBzcGxpdF9zdWZmaWNlc1tdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX1NQTElUX0ZBTkNZCisJeyAiYiIsIDUxMiB9LAorI2VuZGlmCisJeyAiayIsIDEwMjQgfSwKKwl7ICJtIiwgMTAyNCoxMDI0IH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1BMSVRfRkFOQ1kKKwl7ICJnIiwgMTAyNCoxMDI0KjEwMjQgfSwKKyNlbmRpZgorCXsgIiIsIDAgfQorfTsKKworLyogSW5jcmVtZW50IHRoZSBzdWZmaXggcGFydCBvZiB0aGUgZmlsZW5hbWUuCisgKiBSZXR1cm5zIE5VTEwgaWYgd2UgYXJlIG91dCBvZiBmaWxlbmFtZXMuCisgKi8KK3N0YXRpYyBjaGFyICpuZXh0X2ZpbGUoY2hhciAqb2xkLCB1bnNpZ25lZCBzdWZmaXhfbGVuKQoreworCXNpemVfdCBlbmQgPSBzdHJsZW4ob2xkKTsKKwl1bnNpZ25lZCBpID0gMTsKKwljaGFyICpjdXJyOworCisJd2hpbGUgKDEpIHsKKwkJY3VyciA9IG9sZCArIGVuZCAtIGk7CisJCWlmICgqY3VyciA8ICd6JykgeworCQkJKmN1cnIgKz0gMTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwkJaWYgKGkgPiBzdWZmaXhfbGVuKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkqY3VyciA9ICdhJzsKKwl9CisKKwlyZXR1cm4gb2xkOworfQorCisjZGVmaW5lIHJlYWRfYnVmZmVyIGJiX2NvbW1vbl9idWZzaXoxCitlbnVtIHsgUkVBRF9CVUZGRVJfU0laRSA9IENPTU1PTl9CVUZTSVpFIC0gMSB9OworCisjZGVmaW5lIFNQTElUX09QVF9sICgxPDwwKQorI2RlZmluZSBTUExJVF9PUFRfYiAoMTw8MSkKKyNkZWZpbmUgU1BMSVRfT1BUX2EgKDE8PDIpCisKK2ludCBzcGxpdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3BsaXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIHN1ZmZpeF9sZW4gPSAyOworCWNoYXIgKnBmeDsKKwljaGFyICpjb3VudF9wOworCWNvbnN0IGNoYXIgKnNmeDsKKwlvZmZfdCBjbnQgPSAxMDAwOworCW9mZl90IHJlbWFpbmluZyA9IDA7CisJdW5zaWduZWQgb3B0OworCXNzaXplX3QgYnl0ZXNfcmVhZCwgdG9fd3JpdGU7CisJY2hhciAqc3JjOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzI6YSsiOyAvKiBtYXggMiBhcmdzOyAtYSBOICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImw6YjphOiIsICZjb3VudF9wLCAmY291bnRfcCwgJnN1ZmZpeF9sZW4pOworCisJaWYgKG9wdCAmIFNQTElUX09QVF9sKQorCQljbnQgPSBYQVRPT0ZGKGNvdW50X3ApOworCWlmIChvcHQgJiBTUExJVF9PUFRfYikgLy8gRklYTUU6IGFsc28gbmVlZHMgWEFUT09GRgorCQljbnQgPSB4YXRvdWxsX3NmeChjb3VudF9wLCBzcGxpdF9zdWZmaWNlcyk7CisJc2Z4ID0gIngiOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJaW50IGZkOworCQlpZiAoYXJndlsxXSkKKwkJCXNmeCA9IGFyZ3ZbMV07CisJCWZkID0geG9wZW5fc3RkaW4oYXJndlswXSk7CisJCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCX0gZWxzZSB7CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCisJaWYgKE5BTUVfTUFYIDwgc3RybGVuKHNmeCkgKyBzdWZmaXhfbGVuKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3VmZml4IHRvbyBsb25nIik7CisKKwl7CisJCWNoYXIgKmNoYXJfcCA9IHh6YWxsb2Moc3VmZml4X2xlbiArIDEpOworCQltZW1zZXQoY2hhcl9wLCAnYScsIHN1ZmZpeF9sZW4pOworCQlwZnggPSB4YXNwcmludGYoIiVzJXMiLCBzZngsIGNoYXJfcCk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoY2hhcl9wKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlieXRlc19yZWFkID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgcmVhZF9idWZmZXIsIFJFQURfQlVGRkVSX1NJWkUpOworCQlpZiAoIWJ5dGVzX3JlYWQpCisJCQlicmVhazsKKwkJaWYgKGJ5dGVzX3JlYWQgPCAwKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJc3JjID0gcmVhZF9idWZmZXI7CisJCWRvIHsKKwkJCWlmICghcmVtYWluaW5nKSB7CisJCQkJaWYgKCFwZngpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdWZmaXhlcyBleGhhdXN0ZWQiKTsKKwkJCQl4bW92ZV9mZCh4b3BlbihwZngsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCAxKTsKKwkJCQlwZnggPSBuZXh0X2ZpbGUocGZ4LCBzdWZmaXhfbGVuKTsKKwkJCQlyZW1haW5pbmcgPSBjbnQ7CisJCQl9CisKKwkJCWlmIChvcHQgJiBTUExJVF9PUFRfYikgeworCQkJCS8qIHNwbGl0IGJ5IGJ5dGVzICovCisJCQkJdG9fd3JpdGUgPSAoYnl0ZXNfcmVhZCA8IHJlbWFpbmluZykgPyBieXRlc19yZWFkIDogcmVtYWluaW5nOworCQkJCXJlbWFpbmluZyAtPSB0b193cml0ZTsKKwkJCX0gZWxzZSB7CisJCQkJLyogc3BsaXQgYnkgbGluZXMgKi8KKwkJCQkvKiBjYW4gYmUgc3BlZCB1cCBieSB1c2luZyBfbWVtcmNocl8KKwkJCQkgKiBhbmQgd3JpdGluZyBtYW55IGxpbmVzIGF0IG9uY2UuLi4gKi8KKwkJCQljaGFyICplbmQgPSBtZW1jaHIoc3JjLCAnXG4nLCBieXRlc19yZWFkKTsKKwkJCQlpZiAoZW5kKSB7CisJCQkJCS0tcmVtYWluaW5nOworCQkJCQl0b193cml0ZSA9IGVuZCAtIHNyYyArIDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJdG9fd3JpdGUgPSBieXRlc19yZWFkOworCQkJCX0KKwkJCX0KKworCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHNyYywgdG9fd3JpdGUpOworCQkJYnl0ZXNfcmVhZCAtPSB0b193cml0ZTsKKwkJCXNyYyArPSB0b193cml0ZTsKKwkJfSB3aGlsZSAoYnl0ZXNfcmVhZCk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvc3RhdC5jIGIvY29yZXV0aWxzL3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk3NzE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3N0YXQuYwpAQCAtMCwwICsxLDcyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3RhdCAtLSBkaXNwbGF5IGZpbGUgb3IgZmlsZSBzeXN0ZW0gc3RhdHVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyAqCisgKiBXcml0dGVuIGJ5IE1pY2hhZWwgTWVza2VzCisgKiBUYWtlbiBmcm9tIGNvcmV1dGlscyBhbmQgdHVybmVkIGludG8gYSBidXN5Ym94IGFwcGxldCBieSBNaWtlIEZyeXNpbmdlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN0YXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIHN0YXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IGZpbGUgKGRlZmF1bHQpIG9yIGZpbGVzeXN0ZW0gc3RhdHVzXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVRfRk9STUFUKAorLy91c2FnZTogICAgICJcbgktYyBmbXQJVXNlIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktZglEaXNwbGF5IGZpbGVzeXN0ZW0gc3RhdHVzIgorLy91c2FnZTogICAgICJcbgktTAlGb2xsb3cgbGlua3MiCisvL3VzYWdlOiAgICAgIlxuCS10CURpc3BsYXkgaW5mbyBpbiB0ZXJzZSBmb3JtIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJUHJpbnQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1RBVF9GT1JNQVQoCisvL3VzYWdlOiAgICAgICAiXG5cblZhbGlkIGZvcm1hdCBzZXF1ZW5jZXMgZm9yIGZpbGVzOlxuIgorLy91c2FnZTogICAgICAgIiAlYQlBY2Nlc3MgcmlnaHRzIGluIG9jdGFsXG4iCisvL3VzYWdlOiAgICAgICAiICVBCUFjY2VzcyByaWdodHMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybVxuIgorLy91c2FnZTogICAgICAgIiAlYglOdW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCAoc2VlICVCKVxuIgorLy91c2FnZTogICAgICAgIiAlQglUaGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGJsb2NrIHJlcG9ydGVkIGJ5ICViXG4iCisvL3VzYWdlOiAgICAgICAiICVkCURldmljZSBudW1iZXIgaW4gZGVjaW1hbFxuIgorLy91c2FnZTogICAgICAgIiAlRAlEZXZpY2UgbnVtYmVyIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAlZglSYXcgbW9kZSBpbiBoZXhcbiIKKy8vdXNhZ2U6ICAgICAgICIgJUYJRmlsZSB0eXBlXG4iCisvL3VzYWdlOiAgICAgICAiICVnCUdyb3VwIElEIG9mIG93bmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVHCUdyb3VwIG5hbWUgb2Ygb3duZXJcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWgJTnVtYmVyIG9mIGhhcmQgbGlua3NcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWkJSW5vZGUgbnVtYmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVuCUZpbGUgbmFtZVxuIgorLy91c2FnZTogICAgICAgIiAlTglGaWxlIG5hbWUsIHdpdGggLT4gVEFSR0VUIGlmIHN5bWxpbmtcbiIKKy8vdXNhZ2U6ICAgICAgICIgJW8JSS9PIGJsb2NrIHNpemVcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXMJVG90YWwgc2l6ZSwgaW4gYnl0ZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXQJTWFqb3IgZGV2aWNlIHR5cGUgaW4gaGV4XG4iCisvL3VzYWdlOiAgICAgICAiICVUCU1pbm9yIGRldmljZSB0eXBlIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAldQlVc2VyIElEIG9mIG93bmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVVCVVzZXIgbmFtZSBvZiBvd25lclxuIgorLy91c2FnZTogICAgICAgIiAleAlUaW1lIG9mIGxhc3QgYWNjZXNzXG4iCisvL3VzYWdlOiAgICAgICAiICVYCVRpbWUgb2YgbGFzdCBhY2Nlc3MgYXMgc2Vjb25kcyBzaW5jZSBFcG9jaFxuIgorLy91c2FnZTogICAgICAgIiAleQlUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uXG4iCisvL3VzYWdlOiAgICAgICAiICVZCVRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gYXMgc2Vjb25kcyBzaW5jZSBFcG9jaFxuIgorLy91c2FnZTogICAgICAgIiAleglUaW1lIG9mIGxhc3QgY2hhbmdlXG4iCisvL3VzYWdlOiAgICAgICAiICVaCVRpbWUgb2YgbGFzdCBjaGFuZ2UgYXMgc2Vjb25kcyBzaW5jZSBFcG9jaFxuIgorLy91c2FnZTogICAgICAgIlxuVmFsaWQgZm9ybWF0IHNlcXVlbmNlcyBmb3IgZmlsZSBzeXN0ZW1zOlxuIgorLy91c2FnZTogICAgICAgIiAlYQlGcmVlIGJsb2NrcyBhdmFpbGFibGUgdG8gbm9uLXN1cGVydXNlclxuIgorLy91c2FnZTogICAgICAgIiAlYglUb3RhbCBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICAgIiAlYwlUb3RhbCBmaWxlIG5vZGVzIGluIGZpbGUgc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgICAiICVkCUZyZWUgZmlsZSBub2RlcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICAgIiAlZglGcmVlIGJsb2NrcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAgICIgJUMJU2VjdXJpdHkgY29udGV4dCBpbiBzZWxpbnV4XG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgICAiICVpCUZpbGUgU3lzdGVtIElEIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAlbAlNYXhpbXVtIGxlbmd0aCBvZiBmaWxlbmFtZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIgJW4JRmlsZSBuYW1lXG4iCisvL3VzYWdlOiAgICAgICAiICVzCUJsb2NrIHNpemUgKGZvciBmYXN0ZXIgdHJhbnNmZXIpXG4iCisvL3VzYWdlOiAgICAgICAiICVTCUZ1bmRhbWVudGFsIGJsb2NrIHNpemUgKGZvciBibG9jayBjb3VudHMpXG4iCisvL3VzYWdlOiAgICAgICAiICV0CVR5cGUgaW4gaGV4XG4iCisvL3VzYWdlOiAgICAgICAiICVUCVR5cGUgaW4gaHVtYW4gcmVhZGFibGUgZm9ybSIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgT1BUX0ZJTEVTWVMgICAgICgxIDw8IDApCisjZGVmaW5lIE9QVF9URVJTRSAgICAgICAoMSA8PCAxKQorI2RlZmluZSBPUFRfREVSRUZFUkVOQ0UgKDEgPDwgMikKKyNkZWZpbmUgT1BUX1NFTElOVVggICAgICgxIDw8IDMpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAordHlwZWRlZiBib29sICgqc3RhdGZ1bmNfcHRyKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZWxzZQordHlwZWRlZiBib29sICgqc3RhdGZ1bmNfcHRyKShjb25zdCBjaGFyICopOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpmaWxlX3R5cGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0KQoreworCS8qIFNlZSBQT1NJWCAxMDAzLjEtMjAwMSBYQ1UgVGFibGUgNC04IGxpbmVzIDE3MDkzLTE3MTA3CisJICogZm9yIHNvbWUgb2YgdGhlc2UgZm9ybWF0cy4KKwkgKiBUbyBrZWVwIGRpYWdub3N0aWNzIGdyYW1tYXRpY2FsIGluIEVuZ2xpc2gsIHRoZQorCSAqIHJldHVybmVkIHN0cmluZyBtdXN0IHN0YXJ0IHdpdGggYSBjb25zb25hbnQuCisJICovCisJaWYgKFNfSVNSRUcoc3QtPnN0X21vZGUpKSAgcmV0dXJuIHN0LT5zdF9zaXplID09IDAgPyAicmVndWxhciBlbXB0eSBmaWxlIiA6ICJyZWd1bGFyIGZpbGUiOworCWlmIChTX0lTRElSKHN0LT5zdF9tb2RlKSkgIHJldHVybiAiZGlyZWN0b3J5IjsKKwlpZiAoU19JU0JMSyhzdC0+c3RfbW9kZSkpICByZXR1cm4gImJsb2NrIHNwZWNpYWwgZmlsZSI7CisJaWYgKFNfSVNDSFIoc3QtPnN0X21vZGUpKSAgcmV0dXJuICJjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIjsKKwlpZiAoU19JU0ZJRk8oc3QtPnN0X21vZGUpKSByZXR1cm4gImZpZm8iOworCWlmIChTX0lTTE5LKHN0LT5zdF9tb2RlKSkgIHJldHVybiAic3ltYm9saWMgbGluayI7CisJaWYgKFNfSVNTT0NLKHN0LT5zdF9tb2RlKSkgcmV0dXJuICJzb2NrZXQiOworCWlmIChTX1RZUEVJU01RKHN0KSkgICAgICAgIHJldHVybiAibWVzc2FnZSBxdWV1ZSI7CisJaWYgKFNfVFlQRUlTU0VNKHN0KSkgICAgICAgcmV0dXJuICJzZW1hcGhvcmUiOworCWlmIChTX1RZUEVJU1NITShzdCkpICAgICAgIHJldHVybiAic2hhcmVkIG1lbW9yeSBvYmplY3QiOworI2lmZGVmIFNfVFlQRUlTVE1PCisJaWYgKFNfVFlQRUlTVE1PKHN0KSkgICAgICAgcmV0dXJuICJ0eXBlZCBtZW1vcnkgb2JqZWN0IjsKKyNlbmRpZgorCXJldHVybiAid2VpcmQgZmlsZSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpodW1hbl90aW1lKHRpbWVfdCB0KQoreworCS8qIE9sZAorCXN0YXRpYyBjaGFyICpzdHI7CisJc3RyID0gY3RpbWUoJnQpOworCXN0cltzdHJsZW4oc3RyKS0xXSA9ICdcMCc7CisJcmV0dXJuIHN0cjsKKwkqLworCS8qIGNvcmV1dGlscyA2LjMgY29tcGF0OiAqLworCisJLypzdGF0aWMgY2hhciBidWZbc2l6ZW9mKCJZWVlZLU1NLUREIEhIOk1NOlNTLjAwMDAwMDAwMCIpXSBBTElHTjE7Ki8KKyNkZWZpbmUgYnVmIGJiX2NvbW1vbl9idWZzaXoxCisKKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJVktJW0tJWQgJUg6JU06JVMuMDAwMDAwMDAwIiwgbG9jYWx0aW1lKCZ0KSk7CisJcmV0dXJuIGJ1ZjsKKyN1bmRlZiBidWYKK30KKworLyogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0uCisgKiBTb21lIHN5c3RlbXMgaGF2ZSBzdGF0ZnZzLmZfYmFzZXR5cGVbRlNUWVBTWl0uIChBSVgsIEhQLVVYLCBhbmQgU29sYXJpcykKKyAqIE90aGVycyBoYXZlIHN0YXRmcy5mX2ZzdHlwZW5hbWVbTUZTTkFNRUxFTl0uIChOZXRCU0QgMS41LjIpCisgKiBTdGlsbCBvdGhlcnMgaGF2ZSBuZWl0aGVyIGFuZCBoYXZlIHRvIGdldCBieSB3aXRoIGZfdHlwZSAoTGludXgpLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqaHVtYW5fZnN0eXBlKHVpbnQzMl90IGZfdHlwZSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGVzIHsKKwkJdWludDMyX3QgdHlwZTsKKwkJY29uc3QgY2hhciAqY29uc3QgZnM7CisJfSBodW1hbnR5cGVzW10gPSB7CisJCXsgMHhBREZGLCAgICAgImFmZnMiIH0sCisJCXsgMHgxQ2QxLCAgICAgImRldnB0cyIgfSwKKwkJeyAweDEzN0QsICAgICAiZXh0IiB9LAorCQl7IDB4RUY1MSwgICAgICJleHQyIiB9LAorCQl7IDB4RUY1MywgICAgICJleHQyL2V4dDMiIH0sCisJCXsgMHgzMTUzNDY0YSwgImpmcyIgfSwKKwkJeyAweDU4NDY1MzQyLCAieGZzIiB9LAorCQl7IDB4Rjk5NUU4NDksICJocGZzIiB9LAorCQl7IDB4OTY2MCwgICAgICJpc29mcyIgfSwKKwkJeyAweDQwMDAsICAgICAiaXNvZnMiIH0sCisJCXsgMHg0MDA0LCAgICAgImlzb2ZzIiB9LAorCQl7IDB4MTM3RiwgICAgICJtaW5peCIgfSwKKwkJeyAweDEzOEYsICAgICAibWluaXggKDMwIGNoYXIuKSIgfSwKKwkJeyAweDI0NjgsICAgICAibWluaXggdjIiIH0sCisJCXsgMHgyNDc4LCAgICAgIm1pbml4IHYyICgzMCBjaGFyLikiIH0sCisJCXsgMHg0ZDQ0LCAgICAgIm1zZG9zIiB9LAorCQl7IDB4NDAwNiwgICAgICJmYXQiIH0sCisJCXsgMHg1NjRjLCAgICAgIm5vdmVsbCIgfSwKKwkJeyAweDY5NjksICAgICAibmZzIiB9LAorCQl7IDB4OWZhMCwgICAgICJwcm9jIiB9LAorCQl7IDB4NTE3QiwgICAgICJzbWIiIH0sCisJCXsgMHgwMTJGRjdCNCwgInhlbml4IiB9LAorCQl7IDB4MDEyRkY3QjUsICJzeXN2NCIgfSwKKwkJeyAweDAxMkZGN0I2LCAic3lzdjIiIH0sCisJCXsgMHgwMTJGRjdCNywgImNvaCIgfSwKKwkJeyAweDAwMDExOTU0LCAidWZzIiB9LAorCQl7IDB4MDEyRkQxNkQsICJ4aWEiIH0sCisJCXsgMHg1MzQ2NTQ0ZSwgIm50ZnMiIH0sCisJCXsgMHgxMDIxOTk0LCAgInRtcGZzIiB9LAorCQl7IDB4NTI2NTQ5NzMsICJyZWlzZXJmcyIgfSwKKwkJeyAweDI4Y2QzZDQ1LCAiY3JhbWZzIiB9LAorCQl7IDB4NzI3NSwgICAgICJyb21mcyIgfSwKKwkJeyAweDg1ODQ1OGY2LCAicm9tZnMiIH0sCisJCXsgMHg3MzcxNzM2OCwgInNxdWFzaGZzIiB9LAorCQl7IDB4NjI2NTY1NzIsICJzeXNmcyIgfSwKKwkJeyAwLCAiVU5LTk9XTiIgfQorCX07CisKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGh1bWFudHlwZXNbaV0udHlwZTsgKytpKQorCQlpZiAoaHVtYW50eXBlc1tpXS50eXBlID09IGZfdHlwZSkKKwkJCWJyZWFrOworCXJldHVybiBodW1hbnR5cGVzW2ldLmZzOworfQorCisvKiAibWFuIHN0YXRmcyIgc2F5cyB0aGF0IHN0YXRmc2J1Zi0+Zl9mc2lkIGlzIGEgbWVzcyAqLworLyogY29yZXV0aWxzIHRyZWF0cyBpdCBhcyBhbiBhcnJheSBvZiBpbnRzLCBtb3N0IHNpZ25pZmljYW50IGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGdldF9mX2ZzaWQoY29uc3Qgc3RydWN0IHN0YXRmcyAqc3RhdGZzYnVmKQoreworCWNvbnN0IHVuc2lnbmVkICpwID0gKGNvbnN0IHZvaWQqKSAmc3RhdGZzYnVmLT5mX2ZzaWQ7CisJdW5zaWduZWQgc3ogPSBzaXplb2Yoc3RhdGZzYnVmLT5mX2ZzaWQpIC8gc2l6ZW9mKHVuc2lnbmVkKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgciA9IDA7CisKKwlkbworCQlyID0gKHIgPDwgKHNpemVvZih1bnNpZ25lZCkqOCkpIHwgKnArKzsKKwl3aGlsZSAoLS1zeiA+IDApOworCXJldHVybiByOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKK3N0YXRpYyB2b2lkIHN0cmNhdGMoY2hhciAqc3RyLCBjaGFyIGMpCit7CisJaW50IGxlbiA9IHN0cmxlbihzdHIpOworCXN0cltsZW4rK10gPSBjOworCXN0cltsZW5dID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRmcyhjaGFyICpwZm9ybWF0LCBjb25zdCBjaGFyICptc2cpCit7CisJc3RyY2F0YyhwZm9ybWF0LCAncycpOworCXByaW50ZihwZm9ybWF0LCBtc2cpOworfQorCisvKiBwcmludCBzdGF0ZnMgaW5mbyAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHByaW50X3N0YXRmcyhjaGFyICpwZm9ybWF0LCBjb25zdCBjaGFyIG0sCisJCWNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lLCBjb25zdCB2b2lkICpkYXRhCisJCUlGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKQoreworCWNvbnN0IHN0cnVjdCBzdGF0ZnMgKnN0YXRmc2J1ZiA9IGRhdGE7CisJaWYgKG0gPT0gJ24nKSB7CisJCXByaW50ZnMocGZvcm1hdCwgZmlsZW5hbWUpOworCX0gZWxzZSBpZiAobSA9PSAnaScpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHgiKTsKKwkJcHJpbnRmKHBmb3JtYXQsIGdldF9mX2ZzaWQoc3RhdGZzYnVmKSk7CisJfSBlbHNlIGlmIChtID09ICdsJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGZzYnVmLT5mX25hbWVsZW4pOworCX0gZWxzZSBpZiAobSA9PSAndCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJseCIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRmc2J1Zi0+Zl90eXBlKTsgLyogbm8gZXF1aXYgKi8KKwl9IGVsc2UgaWYgKG0gPT0gJ1QnKSB7CisJCXByaW50ZnMocGZvcm1hdCwgaHVtYW5fZnN0eXBlKHN0YXRmc2J1Zi0+Zl90eXBlKSk7CisJfSBlbHNlIGlmIChtID09ICdiJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2Jsb2Nrcyk7CisJfSBlbHNlIGlmIChtID09ICdmJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2JmcmVlKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2EnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYtPmZfYmF2YWlsKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3MnIHx8IG0gPT0gJ1MnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0ZnNidWYtPmZfYnNpemUpOworCX0gZWxzZSBpZiAobSA9PSAnYycpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi0+Zl9maWxlcyk7CisJfSBlbHNlIGlmIChtID09ICdkJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2ZmcmVlKTsKKyMgaWYgRU5BQkxFX1NFTElOVVgKKwl9IGVsc2UgaWYgKG0gPT0gJ0MnICYmIChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgpKSB7CisJCXByaW50ZnMocGZvcm1hdCwgc2NvbnRleHQpOworIyBlbmRpZgorCX0gZWxzZSB7CisJCXN0cmNhdGMocGZvcm1hdCwgJ2MnKTsKKwkJcHJpbnRmKHBmb3JtYXQsIG0pOworCX0KK30KKworLyogcHJpbnQgc3RhdCBpbmZvICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgcHJpbnRfc3RhdChjaGFyICpwZm9ybWF0LCBjb25zdCBjaGFyIG0sCisJCWNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lLCBjb25zdCB2b2lkICpkYXRhCisJCUlGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKQoreworI2RlZmluZSBUWVBFX1NJR05FRCh0KSAoISAoKHQpIDAgPCAodCkgLTEpKQorCXN0cnVjdCBzdGF0ICpzdGF0YnVmID0gKHN0cnVjdCBzdGF0ICopIGRhdGE7CisJc3RydWN0IHBhc3N3ZCAqcHdfZW50OworCXN0cnVjdCBncm91cCAqZ3dfZW50OworCisJaWYgKG0gPT0gJ24nKSB7CisJCXByaW50ZnMocGZvcm1hdCwgZmlsZW5hbWUpOworCX0gZWxzZSBpZiAobSA9PSAnTicpIHsKKwkJc3RyY2F0YyhwZm9ybWF0LCAncycpOworCQlpZiAoU19JU0xOSyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQkJY2hhciAqbGlua25hbWUgPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZmlsZW5hbWUpOworCQkJaWYgKGxpbmtuYW1lID09IE5VTEwpCisJCQkJcmV0dXJuOworCQkJcHJpbnRmKCInJXMnIC0+ICclcyciLCBmaWxlbmFtZSwgbGlua25hbWUpOworCQkJZnJlZShsaW5rbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYocGZvcm1hdCwgZmlsZW5hbWUpOworCQl9CisJfSBlbHNlIGlmIChtID09ICdkJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi0+c3RfZGV2KTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0QnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx4Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9kZXYpOworCX0gZWxzZSBpZiAobSA9PSAnaScpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYtPnN0X2lubyk7CisJfSBlbHNlIGlmIChtID09ICdhJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxvIik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgKHN0YXRidWYtPnN0X21vZGUgJiAoU19JU1VJRHxTX0lTR0lEfFNfSVNWVFh8U19JUldYVXxTX0lSV1hHfFNfSVJXWE8pKSk7CisJfSBlbHNlIGlmIChtID09ICdBJykgeworCQlwcmludGZzKHBmb3JtYXQsIGJiX21vZGVfc3RyaW5nKHN0YXRidWYtPnN0X21vZGUpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2YnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHgiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLT5zdF9tb2RlKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0YnKSB7CisJCXByaW50ZnMocGZvcm1hdCwgZmlsZV90eXBlKHN0YXRidWYpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2gnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLT5zdF9ubGluayk7CisJfSBlbHNlIGlmIChtID09ICd1JykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi0+c3RfdWlkKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ1UnKSB7CisJCXB3X2VudCA9IGdldHB3dWlkKHN0YXRidWYtPnN0X3VpZCk7CisJCXByaW50ZnMocGZvcm1hdCwgKHB3X2VudCAhPSBOVUxMKSA/IHB3X2VudC0+cHdfbmFtZSA6ICJVTktOT1dOIik7CisJfSBlbHNlIGlmIChtID09ICdnJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi0+c3RfZ2lkKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0cnKSB7CisJCWd3X2VudCA9IGdldGdyZ2lkKHN0YXRidWYtPnN0X2dpZCk7CisJCXByaW50ZnMocGZvcm1hdCwgKGd3X2VudCAhPSBOVUxMKSA/IGd3X2VudC0+Z3JfbmFtZSA6ICJVTktOT1dOIik7CisJfSBlbHNlIGlmIChtID09ICd0JykgeworCQlzdHJjYXQocGZvcm1hdCwgImx4Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgbWFqb3Ioc3RhdGJ1Zi0+c3RfcmRldikpOworCX0gZWxzZSBpZiAobSA9PSAnVCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJseCIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIG1pbm9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3MnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9zaXplKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0InKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSA1MTIpOyAvL1NUX05CTE9DS1NJWkUKKwl9IGVsc2UgaWYgKG0gPT0gJ2InKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9ibG9ja3MpOworCX0gZWxzZSBpZiAobSA9PSAnbycpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYtPnN0X2Jsa3NpemUpOworCX0gZWxzZSBpZiAobSA9PSAneCcpIHsKKwkJcHJpbnRmcyhwZm9ybWF0LCBodW1hbl90aW1lKHN0YXRidWYtPnN0X2F0aW1lKSk7CisJfSBlbHNlIGlmIChtID09ICdYJykgeworCQlzdHJjYXQocGZvcm1hdCwgVFlQRV9TSUdORUQodGltZV90KSA/ICJsZCIgOiAibHUiKTsKKwkJLyogbm90ZTogKHVuc2lnbmVkIGxvbmcpIHdvdWxkIGJlIHdyb25nOgorCQkgKiBpbWFnaW5lICh1bnNpZ25lZCBsb25nNjQpaW50MzIgKi8KKwkJcHJpbnRmKHBmb3JtYXQsIChsb25nKSBzdGF0YnVmLT5zdF9hdGltZSk7CisJfSBlbHNlIGlmIChtID09ICd5JykgeworCQlwcmludGZzKHBmb3JtYXQsIGh1bWFuX3RpbWUoc3RhdGJ1Zi0+c3RfbXRpbWUpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ1knKSB7CisJCXN0cmNhdChwZm9ybWF0LCBUWVBFX1NJR05FRCh0aW1lX3QpID8gImxkIiA6ICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKGxvbmcpIHN0YXRidWYtPnN0X210aW1lKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3onKSB7CisJCXByaW50ZnMocGZvcm1hdCwgaHVtYW5fdGltZShzdGF0YnVmLT5zdF9jdGltZSkpOworCX0gZWxzZSBpZiAobSA9PSAnWicpIHsKKwkJc3RyY2F0KHBmb3JtYXQsIFRZUEVfU0lHTkVEKHRpbWVfdCkgPyAibGQiIDogImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAobG9uZykgc3RhdGJ1Zi0+c3RfY3RpbWUpOworIyBpZiBFTkFCTEVfU0VMSU5VWAorCX0gZWxzZSBpZiAobSA9PSAnQycgJiYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCkpIHsKKwkJcHJpbnRmcyhwZm9ybWF0LCBzY29udGV4dCk7CisjIGVuZGlmCisJfSBlbHNlIHsKKwkJc3RyY2F0YyhwZm9ybWF0LCAnYycpOworCQlwcmludGYocGZvcm1hdCwgbSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9pdChjb25zdCBjaGFyICptYXN0ZXJmb3JtYXQsCisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQl2b2lkIEZBU1RfRlVOQyAoKnByaW50X2Z1bmMpKGNoYXIqLCBjaGFyLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCogSUZfU0VMSU5VWCgsIHNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCkpLAorCQljb25zdCB2b2lkICpkYXRhCisJCUlGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKQoreworCS8qIENyZWF0ZSBhIHdvcmtpbmcgY29weSBvZiB0aGUgZm9ybWF0IHN0cmluZyAqLworCWNoYXIgKmZvcm1hdCA9IHhzdHJkdXAobWFzdGVyZm9ybWF0KTsKKwkvKiBBZGQgMiB0byBhY2NvbW9kYXRlIG91ciBjb252ZXJzaW9uIG9mIHRoZSBzdGF0ICclcycgZm9ybWF0IHN0cmluZworCSAqIHRvIHRoZSBwcmludGYgJyVsbHUnIG9uZS4gICovCisJY2hhciAqZGVzdCA9IHhtYWxsb2Moc3RybGVuKGZvcm1hdCkgKyAyICsgMSk7CisJY2hhciAqYjsKKworCWIgPSBmb3JtYXQ7CisJd2hpbGUgKGIpIHsKKwkJLyogRWFjaCBpdGVyYXRpb24gZmluZHMgbmV4dCAlc3BlYywKKwkJICogcHJpbnRzIHByZWNlZGluZyBzdHJpbmcgYW5kIGhhbmRsZXMgZm91bmQgJXNwZWMKKwkJICovCisJCXNpemVfdCBsZW47CisJCWNoYXIgKnAgPSBzdHJjaHIoYiwgJyUnKTsKKwkJaWYgKCFwKSB7CisJCQkvKiBjb3JldXRpbHMgNi4zIGFsd2F5cyBwcmludHMgbmV3bGluZSBhdCB0aGUgZW5kICovCisJCQkvKmZwdXRzKGIsIHN0ZG91dCk7Ki8KKwkJCXB1dHMoYik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGRlc3QgPSAiJTxtb2RpZmllcnM+IiAqLworCQlsZW4gPSAxICsgc3Ryc3BuKHAgKyAxLCAiIy0rLkkgMDEyMzQ1Njc4OSIpOworCQltZW1jcHkoZGVzdCwgcCwgbGVuKTsKKwkJZGVzdFtsZW5dID0gJ1wwJzsKKworCQkvKiBwcmludCBwcmVjZWRpbmcgc3RyaW5nICovCisJCSpwID0gJ1wwJzsKKwkJZnB1dHMoYiwgc3Rkb3V0KTsKKworCQlwICs9IGxlbjsKKwkJYiA9IHAgKyAxOworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgJ1wwJzoKKwkJCWIgPSBOVUxMOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJyUnOgorCQkJYmJfcHV0Y2hhcignJScpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBDb21wbGV0ZXMgIiU8bW9kaWZpZXJzPiIgd2l0aCBzcGVjaWZpZXIgYW5kIHByaW50ZnMgKi8KKwkJCXByaW50X2Z1bmMoZGVzdCwgKnAsIGZpbGVuYW1lLCBkYXRhIElGX1NFTElOVVgoLHNjb250ZXh0KSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWZyZWUoZm9ybWF0KTsKKwlmcmVlKGRlc3QpOworfQorI2VuZGlmICAvKiBGRUFUVVJFX1NUQVRfRk9STUFUICovCisKKy8qIFN0YXQgdGhlIGZpbGUgc3lzdGVtIGFuZCBwcmludCB3aGF0IHdlIGZpbmQuICAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAorI2RlZmluZSBkb19zdGF0ZnMoZmlsZW5hbWUsIGZvcm1hdCkgZG9fc3RhdGZzKGZpbGVuYW1lKQorI2VuZGlmCitzdGF0aWMgYm9vbCBkb19zdGF0ZnMoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKwlzdHJ1Y3Qgc3RhdGZzIHN0YXRmc2J1ZjsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKKwljb25zdCBjaGFyICpmb3JtYXQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYKSB7CisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9ERVJFRkVSRU5DRQorCQkgICAgID8gbGdldGZpbGVjb24oZmlsZW5hbWUsICZzY29udGV4dCkKKwkJICAgICA6IGdldGZpbGVjb24oZmlsZW5hbWUsICZzY29udGV4dCkKKwkJICAgICkgPCAwCisJCSkgeworCQkJYmJfcGVycm9yX21zZyhmaWxlbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChzdGF0ZnMoZmlsZW5hbWUsICZzdGF0ZnNidWYpICE9IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVhZCBmaWxlIHN5c3RlbSBpbmZvcm1hdGlvbiBmb3IgJyVzJyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKKwlpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyMgaWYgIUVOQUJMRV9TRUxJTlVYCisJCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFCisJCQk/ICIlbiAlaSAlbCAldCAlcyAlYiAlZiAlYSAlYyAlZFxuIgorCQkJOiAiICBGaWxlOiBcIiVuXCJcbiIKKwkJCSAgIiAgICBJRDogJS04aSBOYW1lbGVuOiAlLTdsIFR5cGU6ICVUXG4iCisJCQkgICJCbG9jayBzaXplOiAlLTEwc1xuIgorCQkJICAiQmxvY2tzOiBUb3RhbDogJS0xMGIgRnJlZTogJS0xMGYgQXZhaWxhYmxlOiAlYVxuIgorCQkJICAiSW5vZGVzOiBUb3RhbDogJS0xMGMgRnJlZTogJWQiKTsKKyMgZWxzZQorCQlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRQorCQkJPyAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8gIiVuICVpICVsICV0ICVzICViICVmICVhICVjICVkICVDXG4iOgorCQkJIiVuICVpICVsICV0ICVzICViICVmICVhICVjICVkXG4iKQorCQkJOiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8KKwkJCSIgIEZpbGU6IFwiJW5cIlxuIgorCQkJIiAgICBJRDogJS04aSBOYW1lbGVuOiAlLTdsIFR5cGU6ICVUXG4iCisJCQkiQmxvY2sgc2l6ZTogJS0xMHNcbiIKKwkJCSJCbG9ja3M6IFRvdGFsOiAlLTEwYiBGcmVlOiAlLTEwZiBBdmFpbGFibGU6ICVhXG4iCisJCQkiSW5vZGVzOiBUb3RhbDogJS0xMGMgRnJlZTogJWQiCisJCQkiICBTX2NvbnRleHQ6ICVDXG4iOgorCQkJIiAgRmlsZTogXCIlblwiXG4iCisJCQkiICAgIElEOiAlLThpIE5hbWVsZW46ICUtN2wgVHlwZTogJVRcbiIKKwkJCSJCbG9jayBzaXplOiAlLTEwc1xuIgorCQkJIkJsb2NrczogVG90YWw6ICUtMTBiIEZyZWU6ICUtMTBmIEF2YWlsYWJsZTogJWFcbiIKKwkJCSJJbm9kZXM6IFRvdGFsOiAlLTEwYyBGcmVlOiAlZFxuIikKKwkJCSk7CisjIGVuZGlmIC8qIFNFTElOVVggKi8KKwl9CisJcHJpbnRfaXQoZm9ybWF0LCBmaWxlbmFtZSwgcHJpbnRfc3RhdGZzLCAmc3RhdGZzYnVmIElGX1NFTElOVVgoLCBzY29udGV4dCkpOworI2Vsc2UgLyogRkVBVFVSRV9TVEFUX0ZPUk1BVCAqLworCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFCisJCT8gIiVzICVsbHggJWx1ICIKKwkJOiAiICBGaWxlOiBcIiVzXCJcbiIKKwkJICAiICAgIElEOiAlLThsbHggTmFtZWxlbjogJS03bHUgIik7CisJcHJpbnRmKGZvcm1hdCwKKwkgICAgICAgZmlsZW5hbWUsCisJICAgICAgIGdldF9mX2ZzaWQoJnN0YXRmc2J1ZiksCisJICAgICAgIHN0YXRmc2J1Zi5mX25hbWVsZW4pOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UpCisJCXByaW50ZigiJWx4ICIsICh1bnNpZ25lZCBsb25nKSBzdGF0ZnNidWYuZl90eXBlKTsKKwllbHNlCisJCXByaW50ZigiVHlwZTogJXNcbiIsIGh1bWFuX2ZzdHlwZShzdGF0ZnNidWYuZl90eXBlKSk7CisKKyMgaWYgIUVOQUJMRV9TRUxJTlVYCisJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UKKwkJPyAiJWx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIgorCQk6ICJCbG9jayBzaXplOiAlLTEwbHVcbiIKKwkJICAiQmxvY2tzOiBUb3RhbDogJS0xMGxsdSBGcmVlOiAlLTEwbGx1IEF2YWlsYWJsZTogJWxsdVxuIgorCQkgICJJbm9kZXM6IFRvdGFsOiAlLTEwbGx1IEZyZWU6ICVsbHVcbiIpOworCXByaW50Zihmb3JtYXQsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0ZnNidWYuZl9ic2l6ZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfYmxvY2tzLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9iZnJlZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfYmF2YWlsLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9maWxlcywKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfZmZyZWUpOworIyBlbHNlCisJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UKKwkJPyAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8gIiVsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJUNcbiIgOiAiJWx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIikKKwkJOiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYCisJCQk/CSJCbG9jayBzaXplOiAlLTEwbHVcbiIKKwkJCQkiQmxvY2tzOiBUb3RhbDogJS0xMGxsdSBGcmVlOiAlLTEwbGx1IEF2YWlsYWJsZTogJWxsdVxuIgorCQkJCSJJbm9kZXM6IFRvdGFsOiAlLTEwbGx1IEZyZWU6ICVsbHUiCisJCQkJIlNfY29udGV4dDogJUNcbiIKKwkJCToJIkJsb2NrIHNpemU6ICUtMTBsdVxuIgorCQkJCSJCbG9ja3M6IFRvdGFsOiAlLTEwbGx1IEZyZWU6ICUtMTBsbHUgQXZhaWxhYmxlOiAlbGx1XG4iCisJCQkJIklub2RlczogVG90YWw6ICUtMTBsbHUgRnJlZTogJWxsdVxuIgorCQkJKQorCQkpOworCXByaW50Zihmb3JtYXQsCisJCSh1bnNpZ25lZCBsb25nKSBzdGF0ZnNidWYuZl9ic2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfYmxvY2tzLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9iZnJlZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfYmF2YWlsLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9maWxlcywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLmZfZmZyZWUsCisJCXNjb250ZXh0KTsKKworCWlmIChzY29udGV4dCkKKwkJZnJlZWNvbihzY29udGV4dCk7CisjIGVuZGlmCisjZW5kaWYgIC8qIEZFQVRVUkVfU1RBVF9GT1JNQVQgKi8KKwlyZXR1cm4gMTsKK30KKworLyogc3RhdCB0aGUgZmlsZSBhbmQgcHJpbnQgd2hhdCB3ZSBmaW5kICovCisjaWYgIUVOQUJMRV9GRUFUVVJFX1NUQVRfRk9STUFUCisjZGVmaW5lIGRvX3N0YXQoZmlsZW5hbWUsIGZvcm1hdCkgZG9fc3RhdChmaWxlbmFtZSkKKyNlbmRpZgorc3RhdGljIGJvb2wgZG9fc3RhdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZm9ybWF0KQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQgPSBOVUxMOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCkgeworCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVSRUZFUkVOQ0UKKwkJICAgICA/IGxnZXRmaWxlY29uKGZpbGVuYW1lLCAmc2NvbnRleHQpCisJCSAgICAgOiBnZXRmaWxlY29uKGZpbGVuYW1lLCAmc2NvbnRleHQpCisJCSAgICApIDwgMAorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coZmlsZW5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVSRUZFUkVOQ0UgPyBzdGF0IDogbHN0YXQpIChmaWxlbmFtZSwgJnN0YXRidWYpICE9IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc3RhdCAnJXMnIiwgZmlsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAorCWlmIChmb3JtYXQgPT0gTlVMTCkgeworIyBpZiAhRU5BQkxFX1NFTElOVVgKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UpIHsKKwkJCWZvcm1hdCA9ICIlbiAlcyAlYiAlZiAldSAlZyAlRCAlaSAlaCAldCAlVCAlWCAlWSAlWiAlbyI7CisJCX0gZWxzZSB7CisJCQlpZiAoU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpIHx8IFNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkJCWZvcm1hdCA9CisJCQkJCSIgIEZpbGU6ICVOXG4iCisJCQkJCSIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSJEZXZpY2U6ICVEaC8lZGRcdElub2RlOiAlLTEwaSAgTGlua3M6ICUtNWgiCisJCQkJCSIgRGV2aWNlIHR5cGU6ICV0LCVUXG4iCisJCQkJCSJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSJBY2Nlc3M6ICV4XG4iICJNb2RpZnk6ICV5XG4iICJDaGFuZ2U6ICV6XG4iOworCQkJfSBlbHNlIHsKKwkJCQlmb3JtYXQgPQorCQkJCQkiICBGaWxlOiAlTlxuIgorCQkJCQkiICBTaXplOiAlLTEwc1x0QmxvY2tzOiAlLTEwYiBJTyBCbG9jazogJS02byAlRlxuIgorCQkJCQkiRGV2aWNlOiAlRGgvJWRkXHRJbm9kZTogJS0xMGkgIExpbmtzOiAlaFxuIgorCQkJCQkiQWNjZXNzOiAoJTA0YS8lMTAuMTBBKSAgVWlkOiAoJTV1LyU4VSkgICBHaWQ6ICglNWcvJThHKVxuIgorCQkJCQkiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIjsKKwkJCX0KKwkJfQorIyBlbHNlCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFKSB7CisJCQlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8KKwkJCQkgICIlbiAlcyAlYiAlZiAldSAlZyAlRCAlaSAlaCAldCAlVCAlWCAlWSAlWiAlbyAlQ1xuIjoKKwkJCQkgICIlbiAlcyAlYiAlZiAldSAlZyAlRCAlaSAlaCAldCAlVCAlWCAlWSAlWiAlb1xuIik7CisJCX0gZWxzZSB7CisJCQlpZiAoU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpIHx8IFNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkJCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVggPworCQkJCQkgICIgIEZpbGU6ICVOXG4iCisJCQkJCSAgIiAgU2l6ZTogJS0xMHNcdEJsb2NrczogJS0xMGIgSU8gQmxvY2s6ICUtNm8gJUZcbiIKKwkJCQkJICAiRGV2aWNlOiAlRGgvJWRkXHRJbm9kZTogJS0xMGkgIExpbmtzOiAlLTVoIgorCQkJCQkgICIgRGV2aWNlIHR5cGU6ICV0LCVUXG4iCisJCQkJCSAgIkFjY2VzczogKCUwNGEvJTEwLjEwQSkgIFVpZDogKCU1dS8lOFUpICAgR2lkOiAoJTVnLyU4RylcbiIKKwkJCQkJICAiICAgU19Db250ZXh0OiAlQ1xuIgorCQkJCQkgICJBY2Nlc3M6ICV4XG4iICJNb2RpZnk6ICV5XG4iICJDaGFuZ2U6ICV6XG4iOgorCQkJCQkgICIgIEZpbGU6ICVOXG4iCisJCQkJCSAgIiAgU2l6ZTogJS0xMHNcdEJsb2NrczogJS0xMGIgSU8gQmxvY2s6ICUtNm8gJUZcbiIKKwkJCQkJICAiRGV2aWNlOiAlRGgvJWRkXHRJbm9kZTogJS0xMGkgIExpbmtzOiAlLTVoIgorCQkJCQkgICIgRGV2aWNlIHR5cGU6ICV0LCVUXG4iCisJCQkJCSAgIkFjY2VzczogKCUwNGEvJTEwLjEwQSkgIFVpZDogKCU1dS8lOFUpICAgR2lkOiAoJTVnLyU4RylcbiIKKwkJCQkJICAiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIik7CisJCQl9IGVsc2UgeworCQkJCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVggPworCQkJCQkgICIgIEZpbGU6ICVOXG4iCisJCQkJCSAgIiAgU2l6ZTogJS0xMHNcdEJsb2NrczogJS0xMGIgSU8gQmxvY2s6ICUtNm8gJUZcbiIKKwkJCQkJICAiRGV2aWNlOiAlRGgvJWRkXHRJbm9kZTogJS0xMGkgIExpbmtzOiAlaFxuIgorCQkJCQkgICJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSAgIlNfQ29udGV4dDogJUNcbiIKKwkJCQkJICAiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIjoKKwkJCQkJICAiICBGaWxlOiAlTlxuIgorCQkJCQkgICIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSAgIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJWhcbiIKKwkJCQkJICAiQWNjZXNzOiAoJTA0YS8lMTAuMTBBKSAgVWlkOiAoJTV1LyU4VSkgICBHaWQ6ICglNWcvJThHKVxuIgorCQkJCQkgICJBY2Nlc3M6ICV4XG4iICJNb2RpZnk6ICV5XG4iICJDaGFuZ2U6ICV6XG4iKTsKKwkJCX0KKwkJfQorIyBlbmRpZgorCX0KKwlwcmludF9pdChmb3JtYXQsIGZpbGVuYW1lLCBwcmludF9zdGF0LCAmc3RhdGJ1ZiBJRl9TRUxJTlVYKCwgc2NvbnRleHQpKTsKKyNlbHNlCS8qIEZFQVRVUkVfU1RBVF9GT1JNQVQgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRSkgeworCQlwcmludGYoIiVzICVsbHUgJWxsdSAlbHggJWx1ICVsdSAlbGx4ICVsbHUgJWx1ICVseCAlbHggJWx1ICVsdSAlbHUgJWx1IgorCQkgICAgICAgSUZfTk9UX1NFTElOVVgoIlxuIiksCisJCSAgICAgICBmaWxlbmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3Rfc2l6ZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfYmxvY2tzLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfbW9kZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X3VpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X2dpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfZGV2LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9pbm8sCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9ubGluaywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1pbm9yKHN0YXRidWYuc3RfcmRldiksCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9hdGltZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X210aW1lLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfY3RpbWUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9ibGtzaXplCisJCSk7CisjIGlmIEVOQUJMRV9TRUxJTlVYCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgpCisJCQlwcmludGYoIiAlbGNcbiIsICpzY29udGV4dCk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisjIGVuZGlmCisJfSBlbHNlIHsKKwkJY2hhciAqbGlua25hbWUgPSBOVUxMOworCQlzdHJ1Y3QgcGFzc3dkICpwd19lbnQ7CisJCXN0cnVjdCBncm91cCAqZ3dfZW50OworCisJCWd3X2VudCA9IGdldGdyZ2lkKHN0YXRidWYuc3RfZ2lkKTsKKwkJcHdfZW50ID0gZ2V0cHd1aWQoc3RhdGJ1Zi5zdF91aWQpOworCisJCWlmIChTX0lTTE5LKHN0YXRidWYuc3RfbW9kZSkpCisJCQlsaW5rbmFtZSA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2FybihmaWxlbmFtZSk7CisJCWlmIChsaW5rbmFtZSkgeworCQkJcHJpbnRmKCIgIEZpbGU6ICclcycgLT4gJyVzJ1xuIiwgZmlsZW5hbWUsIGxpbmtuYW1lKTsKKwkJCWZyZWUobGlua25hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIgIEZpbGU6ICclcydcbiIsIGZpbGVuYW1lKTsKKwkJfQorCisJCXByaW50ZigiICBTaXplOiAlLTEwbGx1XHRCbG9ja3M6ICUtMTBsbHUgSU8gQmxvY2s6ICUtNmx1ICVzXG4iCisJCSAgICAgICAiRGV2aWNlOiAlbGx4aC8lbGx1ZFx0SW5vZGU6ICUtMTBsbHUgIExpbmtzOiAlLTVsdSIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X3NpemUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X2Jsb2NrcywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X2Jsa3NpemUsCisJCSAgICAgICBmaWxlX3R5cGUoJnN0YXRidWYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9kZXYsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X2RldiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfaW5vLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfbmxpbmspOworCQlpZiAoU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpIHx8IFNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkKKwkJCXByaW50ZigiIERldmljZSB0eXBlOiAlbHgsJWx4XG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtaW5vcihzdGF0YnVmLnN0X3JkZXYpKTsKKwkJZWxzZQorCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJcHJpbnRmKCJBY2Nlc3M6ICglMDRsby8lMTAuMTBzKSAgVWlkOiAoJTVsdS8lOHMpICAgR2lkOiAoJTVsdS8lOHMpXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChzdGF0YnVmLnN0X21vZGUgJiAoU19JU1VJRHxTX0lTR0lEfFNfSVNWVFh8U19JUldYVXxTX0lSV1hHfFNfSVJXWE8pKSwKKwkJICAgICAgIGJiX21vZGVfc3RyaW5nKHN0YXRidWYuc3RfbW9kZSksCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF91aWQsCisJCSAgICAgICAocHdfZW50ICE9IE5VTEwpID8gcHdfZW50LT5wd19uYW1lIDogIlVOS05PV04iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfZ2lkLAorCQkgICAgICAgKGd3X2VudCAhPSBOVUxMKSA/IGd3X2VudC0+Z3JfbmFtZSA6ICJVTktOT1dOIik7CisjIGlmIEVOQUJMRV9TRUxJTlVYCisJCXByaW50ZigiICAgU19Db250ZXh0OiAlbGNcbiIsICpzY29udGV4dCk7CisjIGVuZGlmCisJCXByaW50ZigiQWNjZXNzOiAlc1xuIiwgaHVtYW5fdGltZShzdGF0YnVmLnN0X2F0aW1lKSk7CisJCXByaW50ZigiTW9kaWZ5OiAlc1xuIiwgaHVtYW5fdGltZShzdGF0YnVmLnN0X210aW1lKSk7CisJCXByaW50ZigiQ2hhbmdlOiAlc1xuIiwgaHVtYW5fdGltZShzdGF0YnVmLnN0X2N0aW1lKSk7CisJfQorI2VuZGlmICAvKiBGRUFUVVJFX1NUQVRfRk9STUFUICovCisJcmV0dXJuIDE7Cit9CisKK2ludCBzdGF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdGF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJRl9GRUFUVVJFX1NUQVRfRk9STUFUKGNoYXIgKmZvcm1hdCA9IE5VTEw7KQorCWludCBpOworCWludCBvazsKKwl1bnNpZ25lZCBvcHRzOworCXN0YXRmdW5jX3B0ciBzdGF0ZnVuYyA9IGRvX3N0YXQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIG1pbiBvbmUgYXJnICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmdEwiCisJCUlGX1NFTElOVVgoIloiKQorCQlJRl9GRUFUVVJFX1NUQVRfRk9STUFUKCJjOiIsICZmb3JtYXQpCisJKTsKKwlpZiAob3B0cyAmIE9QVF9GSUxFU1lTKSAvKiAtZiAqLworCQlzdGF0ZnVuYyA9IGRvX3N0YXRmczsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChvcHRzICYgT1BUX1NFTElOVVgpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwl9CisjZW5kaWYKKwlvayA9IDE7CisJYXJndiArPSBvcHRpbmQ7CisJZm9yIChpID0gMDsgYXJndltpXTsgKytpKQorCQlvayAmPSBzdGF0ZnVuYyhhcmd2W2ldIElGX0ZFQVRVUkVfU1RBVF9GT1JNQVQoLCBmb3JtYXQpKTsKKworCXJldHVybiAob2sgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkUpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3N0dHkuYyBiL2NvcmV1dGlscy9zdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwNTdlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zdHR5LmMKQEAgLTAsMCArMSwxNTU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHN0dHkgLS0gY2hhbmdlIGFuZCBwcmludCB0ZXJtaW5hbCBsaW5lIHNldHRpbmdzCisgICBDb3B5cmlnaHQgKEMpIDE5OTAtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisvKiBVc2FnZTogc3R0eSBbLWFnXSBbLUYgZGV2aWNlXSBbc2V0dGluZy4uLl0KKworICAgT3B0aW9uczoKKyAgIC1hIFdyaXRlIGFsbCBjdXJyZW50IHNldHRpbmdzIHRvIHN0ZG91dCBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICAgLWcgV3JpdGUgYWxsIGN1cnJlbnQgc2V0dGluZ3MgdG8gc3Rkb3V0IGluIHN0dHktcmVhZGFibGUgZm9ybS4KKyAgIC1GIE9wZW4gYW5kIHVzZSB0aGUgc3BlY2lmaWVkIGRldmljZSBpbnN0ZWFkIG9mIHN0ZGluCisKKyAgIElmIG5vIGFyZ3MgYXJlIGdpdmVuLCB3cml0ZSB0byBzdGRvdXQgdGhlIGJhdWQgcmF0ZSBhbmQgc2V0dGluZ3MgdGhhdAorICAgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSB0aGVpciBkZWZhdWx0cy4gIE1vZGUgcmVhZGluZyBhbmQgY2hhbmdlcworICAgYXJlIGRvbmUgb24gdGhlIHNwZWNpZmllZCBkZXZpY2UsIG9yIHN0ZGluIGlmIG5vbmUgd2FzIHNwZWNpZmllZC4KKworICAgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+CisKKyAgIFNwZWNpYWwgZm9yIGJ1c3lib3ggcG9ydGVkIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gMjAwMQorCisgICAqLworCisvL3VzYWdlOiNkZWZpbmUgc3R0eV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hfGddIFstRiBERVZJQ0VdIFtTRVRUSU5HXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzdHR5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiV2l0aG91dCBhcmd1bWVudHMsIHByaW50cyBiYXVkIHJhdGUsIGxpbmUgZGlzY2lwbGluZSxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgZGV2aWF0aW9ucyBmcm9tIHN0dHkgc2FuZVxuIgorLy91c2FnZTogICAgICJcbgktRiBERVZJQ0UJT3BlbiBkZXZpY2UgaW5zdGVhZCBvZiBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJCVByaW50IGFsbCBjdXJyZW50IHNldHRpbmdzIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0iCisvL3VzYWdlOiAgICAgIlxuCS1nCQlQcmludCBpbiBzdHR5LXJlYWRhYmxlIGZvcm0iCisvL3VzYWdlOiAgICAgIlxuCVtTRVRUSU5HXQlTZWUgbWFucGFnZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgKCh1bnNpZ25lZCBjaGFyKSAwKQorI2VuZGlmCisKKyNkZWZpbmUgQ29udHJvbChjKSAoKGMpICYgMHgxZikKKy8qIENhbm9uaWNhbCB2YWx1ZXMgZm9yIGNvbnRyb2wgY2hhcmFjdGVycyAqLworI2lmbmRlZiBDSU5UUgorIyBkZWZpbmUgQ0lOVFIgQ29udHJvbCgnYycpCisjZW5kaWYKKyNpZm5kZWYgQ1FVSVQKKyMgZGVmaW5lIENRVUlUIDI4CisjZW5kaWYKKyNpZm5kZWYgQ0VSQVNFCisjIGRlZmluZSBDRVJBU0UgMTI3CisjZW5kaWYKKyNpZm5kZWYgQ0tJTEwKKyMgZGVmaW5lIENLSUxMIENvbnRyb2woJ3UnKQorI2VuZGlmCisjaWZuZGVmIENFT0YKKyMgZGVmaW5lIENFT0YgQ29udHJvbCgnZCcpCisjZW5kaWYKKyNpZm5kZWYgQ0VPTAorIyBkZWZpbmUgQ0VPTCBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorI2lmbmRlZiBDU1RBUlQKKyMgZGVmaW5lIENTVEFSVCBDb250cm9sKCdxJykKKyNlbmRpZgorI2lmbmRlZiBDU1RPUAorIyBkZWZpbmUgQ1NUT1AgQ29udHJvbCgncycpCisjZW5kaWYKKyNpZm5kZWYgQ1NVU1AKKyMgZGVmaW5lIENTVVNQIENvbnRyb2woJ3onKQorI2VuZGlmCisjaWYgZGVmaW5lZChWRU9MMikgJiYgIWRlZmluZWQoQ0VPTDIpCisjIGRlZmluZSBDRU9MMiBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorLyogZ2xpYmMtMi4xMi4xIHVzZXMgb25seSBWU1dUQyBuYW1lICovCisjaWYgZGVmaW5lZChWU1dUQykgJiYgIWRlZmluZWQoVlNXVENIKQorIyBkZWZpbmUgVlNXVENIIFZTV1RDCisjZW5kaWYKKy8qIElTQyByZW5hbWVkIHN3dGNoIHRvIHN1c3AgZm9yIHRlcm1pb3MsIGJ1dCB3ZSdsbCBhY2NlcHQgZWl0aGVyIG5hbWUgKi8KKyNpZiBkZWZpbmVkKFZTVVNQKSAmJiAhZGVmaW5lZChWU1dUQ0gpCisjIGRlZmluZSBWU1dUQ0ggVlNVU1AKKyMgZGVmaW5lIENTV1RDSCBDU1VTUAorI2VuZGlmCisjaWYgZGVmaW5lZChWU1dUQ0gpICYmICFkZWZpbmVkKENTV1RDSCkKKyMgZGVmaW5lIENTV1RDSCBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorCisvKiBTdW5PUyA1LjMgbG9zZXMgKF5aIGRvZXNuJ3Qgd29yaykgaWYgJ3N3dGNoJyBpcyB0aGUgc2FtZSBhcyAnc3VzcCcuCisgICBTbyB0aGUgZGVmYXVsdCBpcyB0byBkaXNhYmxlICdzd3RjaC4nICAqLworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fc3ZyNF9fKQorIyB1bmRlZiBDU1dUQ0gKKyMgZGVmaW5lIENTV1RDSCBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWV0VSU0UpICYmICFkZWZpbmVkKFZXRVJBU0UpICAgICAgIC8qIEFJWC0zLjIuNSAqLworIyBkZWZpbmUgVldFUkFTRSBWV0VSU0UKKyNlbmRpZgorI2lmIGRlZmluZWQoVkRTVVNQKSAmJiAhZGVmaW5lZChDRFNVU1ApCisjIGRlZmluZSBDRFNVU1AgQ29udHJvbCgneScpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChWUkVQUklOVCkgJiYgZGVmaW5lZChWUlBSTlQpICAgICAgIC8qIElyaXggNC4wLjUgKi8KKyMgZGVmaW5lIFZSRVBSSU5UIFZSUFJOVAorI2VuZGlmCisjaWYgZGVmaW5lZChWUkVQUklOVCkgJiYgIWRlZmluZWQoQ1JQUk5UKQorIyBkZWZpbmUgQ1JQUk5UIENvbnRyb2woJ3InKQorI2VuZGlmCisjaWYgZGVmaW5lZChWV0VSQVNFKSAmJiAhZGVmaW5lZChDV0VSQVNFKQorIyBkZWZpbmUgQ1dFUkFTRSBDb250cm9sKCd3JykKKyNlbmRpZgorI2lmIGRlZmluZWQoVkxORVhUKSAmJiAhZGVmaW5lZChDTE5FWFQpCisjIGRlZmluZSBDTE5FWFQgQ29udHJvbCgndicpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZESVNDQVJEKSAmJiAhZGVmaW5lZChWRkxVU0hPKQorIyBkZWZpbmUgVkZMVVNITyBWRElTQ0FSRAorI2VuZGlmCisjaWYgZGVmaW5lZChWRkxVU0gpICYmICFkZWZpbmVkKFZGTFVTSE8pICAgICAgICAvKiBVbHRyaXggNC4yICovCisjIGRlZmluZSBWRkxVU0hPIFZGTFVTSAorI2VuZGlmCisjaWYgZGVmaW5lZChDVExFQ0gpICYmICFkZWZpbmVkKEVDSE9DVEwpICAgICAgICAvKiBVbHRyaXggNC4zICovCisjIGRlZmluZSBFQ0hPQ1RMIENUTEVDSAorI2VuZGlmCisjaWYgZGVmaW5lZChUQ1RMRUNIKSAmJiAhZGVmaW5lZChFQ0hPQ1RMKSAgICAgICAvKiBVbHRyaXggNC4yICovCisjIGRlZmluZSBFQ0hPQ1RMIFRDVExFQ0gKKyNlbmRpZgorI2lmIGRlZmluZWQoQ1JUS0lMKSAmJiAhZGVmaW5lZChFQ0hPS0UpICAgICAgICAgLyogVWx0cml4IDQuMiBhbmQgNC4zICovCisjIGRlZmluZSBFQ0hPS0UgQ1JUS0lMCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZGTFVTSE8pICYmICFkZWZpbmVkKENGTFVTSE8pCisjIGRlZmluZSBDRkxVU0hPIENvbnRyb2woJ28nKQorI2VuZGlmCisjaWYgZGVmaW5lZChWU1RBVFVTKSAmJiAhZGVmaW5lZChDU1RBVFVTKQorIyBkZWZpbmUgQ1NUQVRVUyBDb250cm9sKCd0JykKKyNlbmRpZgorCisvKiBTYXZlIHVzIGZyb20gI2lmZGVmIGZvcmVzdCBwbGFndWUgKi8KKyNpZm5kZWYgQlNETFkKKyMgZGVmaW5lIEJTRExZIDAKKyNlbmRpZgorI2lmbmRlZiBDSUJBVUQKKyMgZGVmaW5lIENJQkFVRCAwCisjZW5kaWYKKyNpZm5kZWYgQ1JETFkKKyMgZGVmaW5lIENSRExZIDAKKyNlbmRpZgorI2lmbmRlZiBDUlRTQ1RTCisjIGRlZmluZSBDUlRTQ1RTIDAKKyNlbmRpZgorI2lmbmRlZiBFQ0hPQ1RMCisjIGRlZmluZSBFQ0hPQ1RMIDAKKyNlbmRpZgorI2lmbmRlZiBFQ0hPS0UKKyMgZGVmaW5lIEVDSE9LRSAwCisjZW5kaWYKKyNpZm5kZWYgRUNIT1BSVAorIyBkZWZpbmUgRUNIT1BSVCAwCisjZW5kaWYKKyNpZm5kZWYgRkZETFkKKyMgZGVmaW5lIEZGRExZIDAKKyNlbmRpZgorI2lmbmRlZiBJRVhURU4KKyMgZGVmaW5lIElFWFRFTiAwCisjZW5kaWYKKyNpZm5kZWYgSU1BWEJFTAorIyBkZWZpbmUgSU1BWEJFTCAwCisjZW5kaWYKKyNpZm5kZWYgSVVDTEMKKyMgZGVmaW5lIElVQ0xDIDAKKyNlbmRpZgorI2lmbmRlZiBJWEFOWQorIyBkZWZpbmUgSVhBTlkgMAorI2VuZGlmCisjaWZuZGVmIE5MRExZCisjIGRlZmluZSBOTERMWSAwCisjZW5kaWYKKyNpZm5kZWYgT0NSTkwKKyMgZGVmaW5lIE9DUk5MIDAKKyNlbmRpZgorI2lmbmRlZiBPRkRFTAorIyBkZWZpbmUgT0ZERUwgMAorI2VuZGlmCisjaWZuZGVmIE9GSUxMCisjIGRlZmluZSBPRklMTCAwCisjZW5kaWYKKyNpZm5kZWYgT0xDVUMKKyMgZGVmaW5lIE9MQ1VDIDAKKyNlbmRpZgorI2lmbmRlZiBPTkxDUgorIyBkZWZpbmUgT05MQ1IgMAorI2VuZGlmCisjaWZuZGVmIE9OTFJFVAorIyBkZWZpbmUgT05MUkVUIDAKKyNlbmRpZgorI2lmbmRlZiBPTk9DUgorIyBkZWZpbmUgT05PQ1IgMAorI2VuZGlmCisjaWZuZGVmIE9YVEFCUworIyBkZWZpbmUgT1hUQUJTIDAKKyNlbmRpZgorI2lmbmRlZiBUQUJETFkKKyMgZGVmaW5lIFRBQkRMWSAwCisjZW5kaWYKKyNpZm5kZWYgVEFCMQorIyBkZWZpbmUgVEFCMSAwCisjZW5kaWYKKyNpZm5kZWYgVEFCMgorIyBkZWZpbmUgVEFCMiAwCisjZW5kaWYKKyNpZm5kZWYgVE9TVE9QCisjIGRlZmluZSBUT1NUT1AgMAorI2VuZGlmCisjaWZuZGVmIFZEU1VTUAorIyBkZWZpbmUgVkRTVVNQIDAKKyNlbmRpZgorI2lmbmRlZiBWRU9MMgorIyBkZWZpbmUgVkVPTDIgMAorI2VuZGlmCisjaWZuZGVmIFZGTFVTSE8KKyMgZGVmaW5lIFZGTFVTSE8gMAorI2VuZGlmCisjaWZuZGVmIFZMTkVYVAorIyBkZWZpbmUgVkxORVhUIDAKKyNlbmRpZgorI2lmbmRlZiBWUkVQUklOVAorIyBkZWZpbmUgVlJFUFJJTlQgMAorI2VuZGlmCisjaWZuZGVmIFZTVEFUVVMKKyMgZGVmaW5lIFZTVEFUVVMgMAorI2VuZGlmCisjaWZuZGVmIFZTV1RDSAorIyBkZWZpbmUgVlNXVENIIDAKKyNlbmRpZgorI2lmbmRlZiBWVERMWQorIyBkZWZpbmUgVlRETFkgMAorI2VuZGlmCisjaWZuZGVmIFZXRVJBU0UKKyMgZGVmaW5lIFZXRVJBU0UgMAorI2VuZGlmCisjaWZuZGVmIFhDQVNFCisjIGRlZmluZSBYQ0FTRSAwCisjZW5kaWYKKyNpZm5kZWYgSVVURjgKKyMgZGVmaW5lIElVVEY4IDAKKyNlbmRpZgorCisvKiBXaGljaCBzcGVlZHMgdG8gc2V0ICovCitlbnVtIHNwZWVkX3NldHRpbmcgeworCWlucHV0X3NwZWVkLCBvdXRwdXRfc3BlZWQsIGJvdGhfc3BlZWRzCit9OworCisvKiBXaGljaCBtZW1iZXIocykgb2YgJ3N0cnVjdCB0ZXJtaW9zJyBhIG1vZGUgdXNlcyAqLworZW51bSB7CisJLyogRG8gTk9UIGNoYW5nZSB0aGUgb3JkZXIgb3IgdmFsdWVzLCBhcyBtb2RlX3R5cGVfZmxhZygpCisJICogZGVwZW5kcyBvbiB0aGVtICovCisJY29udHJvbCwgaW5wdXQsIG91dHB1dCwgbG9jYWwsIGNvbWJpbmF0aW9uCit9OworCisvKiBGbGFncyBmb3IgJ3N0cnVjdCBtb2RlX2luZm8nICovCisjZGVmaW5lIFNBTkVfU0VUIDEgICAgICAgICAgICAgIC8qIFNldCBpbiAnc2FuZScgbW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNBTkVfVU5TRVQgMiAgICAgICAgICAgIC8qIFVuc2V0IGluICdzYW5lJyBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJFViA0ICAgICAgICAgICAgICAgICAgIC8qIENhbiBiZSB0dXJuZWQgb2ZmIGJ5IHByZXBlbmRpbmcgJy0nICovCisjZGVmaW5lIE9NSVQgOCAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc3BsYXkgdmFsdWUgICAgICAgICAgICAgICAgICovCisKKworLyogRWFjaCBtb2RlLgorICogVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGtlcHQgYXMgc21hbGwgYXMgaHVtYW5seSBwb3NzaWJsZS4KKyAqLworc3RydWN0IG1vZGVfaW5mbyB7CisJY29uc3QgdWludDhfdCB0eXBlOyAgICAgICAgICAgLyogV2hpY2ggc3RydWN0dXJlIGVsZW1lbnQgdG8gY2hhbmdlICAgICovCisJY29uc3QgdWludDhfdCBmbGFnczsgICAgICAgICAgLyogU2V0dGluZyBhbmQgZGlzcGxheSBvcHRpb25zICAgICAgICAgICovCisJLyogb25seSB0aGVzZSB2YWx1ZXMgYXJlIGV2ZXIgdXNlZCwgc28uLi4gKi8KKyNpZiAgIChDU0laRSB8IE5MRExZIHwgQ1JETFkgfCBUQUJETFkgfCBCU0RMWSB8IFZURExZIHwgRkZETFkpIDwgMHgxMDAKKwljb25zdCB1aW50OF90IG1hc2s7CisjZWxpZiAoQ1NJWkUgfCBOTERMWSB8IENSRExZIHwgVEFCRExZIHwgQlNETFkgfCBWVERMWSB8IEZGRExZKSA8IDB4MTAwMDAKKwljb25zdCB1aW50MTZfdCBtYXNrOworI2Vsc2UKKwljb25zdCB0Y2ZsYWdfdCBtYXNrOyAgICAgICAgICAvKiBPdGhlciBiaXRzIHRvIHR1cm4gb2ZmIGZvciB0aGlzIG1vZGUgKi8KKyNlbmRpZgorCS8qIHdhcyB1c2luZyBzaG9ydCBoZXJlLCBidXQgcHBjMzIgd2FzIHVuaGFwcHkgKi8KKwljb25zdCB0Y2ZsYWdfdCBiaXRzOyAgICAgICAgICAvKiBCaXRzIHRvIHNldCBmb3IgdGhpcyBtb2RlICAgICAgICAgICAgKi8KK307CisKK2VudW0geworCS8qIE11c3QgbWF0Y2ggbW9kZV9uYW1lW10gYW5kIG1vZGVfaW5mb1tdIG9yZGVyISAqLworCUlEWF9ldmVucCA9IDAsCisJSURYX3Bhcml0eSwKKwlJRFhfb2RkcCwKKwlJRFhfbmwsCisJSURYX2VrLAorCUlEWF9zYW5lLAorCUlEWF9jb29rZWQsCisJSURYX3JhdywKKwlJRFhfcGFzczgsCisJSURYX2xpdG91dCwKKwlJRFhfY2JyZWFrLAorCUlEWF9jcnQsCisJSURYX2RlYywKKyNpZiBJWEFOWQorCUlEWF9kZWNjdGxxLAorI2VuZGlmCisjaWYgVEFCRExZIHx8IE9YVEFCUworCUlEWF90YWJzLAorI2VuZGlmCisjaWYgWENBU0UgJiYgSVVDTEMgJiYgT0xDVUMKKwlJRFhfbGNhc2UsCisJSURYX0xDQVNFLAorI2VuZGlmCit9OworCisjZGVmaW5lIE1JX0VOVFJZKE4sVCxGLEIsTSkgTiAiXDAiCisKKy8qIE1vZGUgbmFtZXMgZ2l2ZW4gb24gY29tbWFuZCBsaW5lICovCitzdGF0aWMgY29uc3QgY2hhciBtb2RlX25hbWVbXSA9CisJTUlfRU5UUlkoImV2ZW5wIiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgicGFyaXR5IiwgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJvZGRwIiwgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoIm5sIiwgICAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiZWsiLCAgICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJzYW5lIiwgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImNvb2tlZCIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgicmF3IiwgICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJwYXNzOCIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImxpdG91dCIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiY2JyZWFrIiwgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJjcnQiLCAgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImRlYyIsICAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKyNpZiBJWEFOWQorCU1JX0VOVFJZKCJkZWNjdGxxIiwgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisjZW5kaWYKKyNpZiBUQUJETFkgfHwgT1hUQUJTCisJTUlfRU5UUlkoInRhYnMiLCAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKyNlbmRpZgorI2lmIFhDQVNFICYmIElVQ0xDICYmIE9MQ1VDCisJTUlfRU5UUlkoImxjYXNlIiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiTENBU0UiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoInBhcmVuYiIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBQQVJFTkIsICAgICAwICkKKwlNSV9FTlRSWSgicGFyb2RkIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIFBBUk9ERCwgICAgIDAgKQorCU1JX0VOVFJZKCJjczUiLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M1LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImNzNiIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzYsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiY3M3IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTNywgICAgIENTSVpFKQorCU1JX0VOVFJZKCJjczgiLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M4LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImh1cGNsIiwgICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBIVVBDTCwgICAgICAwICkKKwlNSV9FTlRSWSgiaHVwIiwgICAgICBjb250cm9sLCAgICAgUkVWICAgICAgICB8IE9NSVQsIEhVUENMLCAgICAgIDAgKQorCU1JX0VOVFJZKCJjc3RvcGIiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgQ1NUT1BCLCAgICAgMCApCisJTUlfRU5UUlkoImNyZWFkIiwgICAgY29udHJvbCwgICAgIFNBTkVfU0VUICAgfCBSRVYsICBDUkVBRCwgICAgICAwICkKKwlNSV9FTlRSWSgiY2xvY2FsIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIENMT0NBTCwgICAgIDAgKQorI2lmIENSVFNDVFMKKwlNSV9FTlRSWSgiY3J0c2N0cyIsICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIENSVFNDVFMsICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoImlnbmJyayIsICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJR05CUkssICAgICAwICkKKwlNSV9FTlRSWSgiYnJraW50IiwgICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEJSS0lOVCwgICAgIDAgKQorCU1JX0VOVFJZKCJpZ25wYXIiLCAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSUdOUEFSLCAgICAgMCApCisJTUlfRU5UUlkoInBhcm1yayIsICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBQQVJNUkssICAgICAwICkKKwlNSV9FTlRSWSgiaW5wY2siLCAgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElOUENLLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpc3RyaXAiLCAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSVNUUklQLCAgICAgMCApCisJTUlfRU5UUlkoImlubGNyIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJTkxDUiwgICAgICAwICkKKwlNSV9FTlRSWSgiaWduY3IiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElHTkNSLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpY3JubCIsICAgIGlucHV0LCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSUNSTkwsICAgICAgMCApCisJTUlfRU5UUlkoIml4b24iLCAgICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJWE9OLCAgICAgICAwICkKKwlNSV9FTlRSWSgiaXhvZmYiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElYT0ZGLCAgICAgIDAgKQorCU1JX0VOVFJZKCJ0YW5kZW0iLCAgIGlucHV0LCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgSVhPRkYsICAgICAgMCApCisjaWYgSVVDTEMKKwlNSV9FTlRSWSgiaXVjbGMiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElVQ0xDLCAgICAgIDAgKQorI2VuZGlmCisjaWYgSVhBTlkKKwlNSV9FTlRSWSgiaXhhbnkiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElYQU5ZLCAgICAgIDAgKQorI2VuZGlmCisjaWYgSU1BWEJFTAorCU1JX0VOVFJZKCJpbWF4YmVsIiwgIGlucHV0LCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSU1BWEJFTCwgICAgMCApCisjZW5kaWYKKyNpZiBJVVRGOAorCU1JX0VOVFJZKCJpdXRmOCIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVVURjgsICAgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgib3Bvc3QiLCAgICBvdXRwdXQsICAgICAgU0FORV9TRVQgICB8IFJFViwgIE9QT1NULCAgICAgIDAgKQorI2lmIE9MQ1VDCisJTUlfRU5UUlkoIm9sY3VjIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPTENVQywgICAgICAwICkKKyNlbmRpZgorI2lmIE9DUk5MCisJTUlfRU5UUlkoIm9jcm5sIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPQ1JOTCwgICAgICAwICkKKyNlbmRpZgorI2lmIE9OTENSCisJTUlfRU5UUlkoIm9ubGNyIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBPTkxDUiwgICAgICAwICkKKyNlbmRpZgorI2lmIE9OT0NSCisJTUlfRU5UUlkoIm9ub2NyIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPTk9DUiwgICAgICAwICkKKyNlbmRpZgorI2lmIE9OTFJFVAorCU1JX0VOVFJZKCJvbmxyZXQiLCAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT05MUkVULCAgICAgMCApCisjZW5kaWYKKyNpZiBPRklMTAorCU1JX0VOVFJZKCJvZmlsbCIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0ZJTEwsICAgICAgMCApCisjZW5kaWYKKyNpZiBPRkRFTAorCU1JX0VOVFJZKCJvZmRlbCIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0ZERUwsICAgICAgMCApCisjZW5kaWYKKyNpZiBOTERMWQorCU1JX0VOVFJZKCJubDEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgTkwxLCAgICAgTkxETFkpCisJTUlfRU5UUlkoIm5sMCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBOTDAsICAgICBOTERMWSkKKyNlbmRpZgorI2lmIENSRExZCisJTUlfRU5UUlkoImNyMyIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBDUjMsICAgICBDUkRMWSkKKwlNSV9FTlRSWSgiY3IyIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIENSMiwgICAgIENSRExZKQorCU1JX0VOVFJZKCJjcjEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQ1IxLCAgICAgQ1JETFkpCisJTUlfRU5UUlkoImNyMCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBDUjAsICAgICBDUkRMWSkKKyNlbmRpZgorCisjaWYgVEFCRExZCisJTUlfRU5UUlkoInRhYjMiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBUQUIzLCAgIFRBQkRMWSkKKyMgaWYgVEFCMgorCU1JX0VOVFJZKCJ0YWIyIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVEFCMiwgICBUQUJETFkpCisjIGVuZGlmCisjIGlmIFRBQjEKKwlNSV9FTlRSWSgidGFiMSIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFRBQjEsICAgVEFCRExZKQorIyBlbmRpZgorCU1JX0VOVFJZKCJ0YWIwIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgVEFCMCwgICBUQUJETFkpCisjZWxzZQorIyBpZiBPWFRBQlMKKwlNSV9FTlRSWSgidGFiMyIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIE9YVEFCUywgICAgIDAgKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBCU0RMWQorCU1JX0VOVFJZKCJiczEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQlMxLCAgICAgQlNETFkpCisJTUlfRU5UUlkoImJzMCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBCUzAsICAgICBCU0RMWSkKKyNlbmRpZgorI2lmIFZURExZCisJTUlfRU5UUlkoInZ0MSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBWVDEsICAgICBWVERMWSkKKwlNSV9FTlRSWSgidnQwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIFZUMCwgICAgIFZURExZKQorI2VuZGlmCisjaWYgRkZETFkKKwlNSV9FTlRSWSgiZmYxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIEZGMSwgICAgIEZGRExZKQorCU1JX0VOVFJZKCJmZjAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgRkYwLCAgICAgRkZETFkpCisjZW5kaWYKKwlNSV9FTlRSWSgiaXNpZyIsICAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElTSUcsICAgICAgIDAgKQorCU1JX0VOVFJZKCJpY2Fub24iLCAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSUNBTk9OLCAgICAgMCApCisjaWYgSUVYVEVOCisJTUlfRU5UUlkoImlleHRlbiIsICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJRVhURU4sICAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJlY2hvIiwgICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNITywgICAgICAgMCApCisJTUlfRU5UUlkoImVjaG9lIiwgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPRSwgICAgICAwICkKKwlNSV9FTlRSWSgiY3J0ZXJhc2UiLCBsb2NhbCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIEVDSE9FLCAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvayIsICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNIT0ssICAgICAgMCApCisJTUlfRU5UUlkoImVjaG9ubCIsICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBFQ0hPTkwsICAgICAwICkKKwlNSV9FTlRSWSgibm9mbHNoIiwgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE5PRkxTSCwgICAgIDAgKQorI2lmIFhDQVNFCisJTUlfRU5UUlkoInhjYXNlIiwgICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBYQ0FTRSwgICAgICAwICkKKyNlbmRpZgorI2lmIFRPU1RPUAorCU1JX0VOVFJZKCJ0b3N0b3AiLCAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgVE9TVE9QLCAgICAgMCApCisjZW5kaWYKKyNpZiBFQ0hPUFJUCisJTUlfRU5UUlkoImVjaG9wcnQiLCAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBFQ0hPUFJULCAgICAwICkKKwlNSV9FTlRSWSgicHJ0ZXJhc2UiLCBsb2NhbCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIEVDSE9QUlQsICAgIDAgKQorI2VuZGlmCisjaWYgRUNIT0NUTAorCU1JX0VOVFJZKCJlY2hvY3RsIiwgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNIT0NUTCwgICAgMCApCisJTUlfRU5UUlkoImN0bGVjaG8iLCAgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPQ1RMLCAgICAwICkKKyNlbmRpZgorI2lmIEVDSE9LRQorCU1JX0VOVFJZKCJlY2hva2UiLCAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNIT0tFLCAgICAgMCApCisJTUlfRU5UUlkoImNydGtpbGwiLCAgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPS0UsICAgICAwICkKKyNlbmRpZgorCTsKKworI3VuZGVmIE1JX0VOVFJZCisjZGVmaW5lIE1JX0VOVFJZKE4sVCxGLEIsTSkgeyBULCBGLCBNLCBCIH0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW9kZV9pbmZvIG1vZGVfaW5mb1tdID0geworCS8qIFRoaXMgc2hvdWxkIGJlIHZlcmJhdGltIGN1dC1uLXBhc3RlIGNvcHkgb2YgdGhlIGFib3ZlIE1JX0VOVFJZcyAqLworCU1JX0VOVFJZKCJldmVucCIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInBhcml0eSIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgib2RkcCIsICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJubCIsICAgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImVrIiwgICAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgic2FuZSIsICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJjb29rZWQiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInJhdyIsICAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgicGFzczgiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJsaXRvdXQiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImNicmVhayIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiY3J0IiwgICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJkZWMiLCAgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisjaWYgSVhBTlkKKwlNSV9FTlRSWSgiZGVjY3RscSIsICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorI2VuZGlmCisjaWYgVEFCRExZIHx8IE9YVEFCUworCU1JX0VOVFJZKCJ0YWJzIiwgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisjZW5kaWYKKyNpZiBYQ0FTRSAmJiBJVUNMQyAmJiBPTENVQworCU1JX0VOVFJZKCJsY2FzZSIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoIkxDQVNFIiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJwYXJlbmIiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgUEFSRU5CLCAgICAgMCApCisJTUlfRU5UUlkoInBhcm9kZCIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBQQVJPREQsICAgICAwICkKKwlNSV9FTlRSWSgiY3M1IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTNSwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJjczYiLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M2LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImNzNyIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzcsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiY3M4IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTOCwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJodXBjbCIsICAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgSFVQQ0wsICAgICAgMCApCisJTUlfRU5UUlkoImh1cCIsICAgICAgY29udHJvbCwgICAgIFJFViAgICAgICAgfCBPTUlULCBIVVBDTCwgICAgICAwICkKKwlNSV9FTlRSWSgiY3N0b3BiIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIENTVE9QQiwgICAgIDAgKQorCU1JX0VOVFJZKCJjcmVhZCIsICAgIGNvbnRyb2wsICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgQ1JFQUQsICAgICAgMCApCisJTUlfRU5UUlkoImNsb2NhbCIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDTE9DQUwsICAgICAwICkKKyNpZiBDUlRTQ1RTCisJTUlfRU5UUlkoImNydHNjdHMiLCAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDUlRTQ1RTLCAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJpZ25icmsiLCAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSUdOQlJLLCAgICAgMCApCisJTUlfRU5UUlkoImJya2ludCIsICAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBCUktJTlQsICAgICAwICkKKwlNSV9FTlRSWSgiaWducGFyIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElHTlBBUiwgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJtcmsiLCAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgUEFSTVJLLCAgICAgMCApCisJTUlfRU5UUlkoImlucGNrIiwgICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJTlBDSywgICAgICAwICkKKwlNSV9FTlRSWSgiaXN0cmlwIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElTVFJJUCwgICAgIDAgKQorCU1JX0VOVFJZKCJpbmxjciIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSU5MQ1IsICAgICAgMCApCisJTUlfRU5UUlkoImlnbmNyIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJR05DUiwgICAgICAwICkKKwlNSV9FTlRSWSgiaWNybmwiLCAgICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElDUk5MLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpeG9uIiwgICAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSVhPTiwgICAgICAgMCApCisJTUlfRU5UUlkoIml4b2ZmIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJWE9GRiwgICAgICAwICkKKwlNSV9FTlRSWSgidGFuZGVtIiwgICBpbnB1dCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIElYT0ZGLCAgICAgIDAgKQorI2lmIElVQ0xDCisJTUlfRU5UUlkoIml1Y2xjIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJVUNMQywgICAgICAwICkKKyNlbmRpZgorI2lmIElYQU5ZCisJTUlfRU5UUlkoIml4YW55IiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJWEFOWSwgICAgICAwICkKKyNlbmRpZgorI2lmIElNQVhCRUwKKwlNSV9FTlRSWSgiaW1heGJlbCIsICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElNQVhCRUwsICAgIDAgKQorI2VuZGlmCisjaWYgSVVURjgKKwlNSV9FTlRSWSgiaXV0ZjgiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElVVEY4LCAgICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoIm9wb3N0IiwgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBPUE9TVCwgICAgICAwICkKKyNpZiBPTENVQworCU1JX0VOVFJZKCJvbGN1YyIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0xDVUMsICAgICAgMCApCisjZW5kaWYKKyNpZiBPQ1JOTAorCU1JX0VOVFJZKCJvY3JubCIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0NSTkwsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTkxDUgorCU1JX0VOVFJZKCJvbmxjciIsICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgT05MQ1IsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTk9DUgorCU1JX0VOVFJZKCJvbm9jciIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT05PQ1IsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTkxSRVQKKwlNSV9FTlRSWSgib25scmV0IiwgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9OTFJFVCwgICAgIDAgKQorI2VuZGlmCisjaWYgT0ZJTEwKKwlNSV9FTlRSWSgib2ZpbGwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9GSUxMLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT0ZERUwKKwlNSV9FTlRSWSgib2ZkZWwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9GREVMLCAgICAgIDAgKQorI2VuZGlmCisjaWYgTkxETFkKKwlNSV9FTlRSWSgibmwxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIE5MMSwgICAgIE5MRExZKQorCU1JX0VOVFJZKCJubDAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgTkwwLCAgICAgTkxETFkpCisjZW5kaWYKKyNpZiBDUkRMWQorCU1JX0VOVFJZKCJjcjMiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQ1IzLCAgICAgQ1JETFkpCisJTUlfRU5UUlkoImNyMiIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBDUjIsICAgICBDUkRMWSkKKwlNSV9FTlRSWSgiY3IxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIENSMSwgICAgIENSRExZKQorCU1JX0VOVFJZKCJjcjAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgQ1IwLCAgICAgQ1JETFkpCisjZW5kaWYKKworI2lmIFRBQkRMWQorCU1JX0VOVFJZKCJ0YWIzIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVEFCMywgICBUQUJETFkpCisjIGlmIFRBQjIKKwlNSV9FTlRSWSgidGFiMiIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFRBQjIsICAgVEFCRExZKQorIyBlbmRpZgorIyBpZiBUQUIxCisJTUlfRU5UUlkoInRhYjEiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBUQUIxLCAgIFRBQkRMWSkKKyMgZW5kaWYKKwlNSV9FTlRSWSgidGFiMCIsICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIFRBQjAsICAgVEFCRExZKQorI2Vsc2UKKyMgaWYgT1hUQUJTCisJTUlfRU5UUlkoInRhYjMiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBPWFRBQlMsICAgICAwICkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgQlNETFkKKwlNSV9FTlRSWSgiYnMxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIEJTMSwgICAgIEJTRExZKQorCU1JX0VOVFJZKCJiczAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgQlMwLCAgICAgQlNETFkpCisjZW5kaWYKKyNpZiBWVERMWQorCU1JX0VOVFJZKCJ2dDEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVlQxLCAgICAgVlRETFkpCisJTUlfRU5UUlkoInZ0MCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBWVDAsICAgICBWVERMWSkKKyNlbmRpZgorI2lmIEZGRExZCisJTUlfRU5UUlkoImZmMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBGRjEsICAgICBGRkRMWSkKKwlNSV9FTlRSWSgiZmYwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIEZGMCwgICAgIEZGRExZKQorI2VuZGlmCisJTUlfRU5UUlkoImlzaWciLCAgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJU0lHLCAgICAgICAwICkKKwlNSV9FTlRSWSgiaWNhbm9uIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElDQU5PTiwgICAgIDAgKQorI2lmIElFWFRFTgorCU1JX0VOVFJZKCJpZXh0ZW4iLCAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSUVYVEVOLCAgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgiZWNobyIsICAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE8sICAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvZSIsICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNIT0UsICAgICAgMCApCisJTUlfRU5UUlkoImNydGVyYXNlIiwgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPRSwgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob2siLCAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9LLCAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvbmwiLCAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgRUNIT05MLCAgICAgMCApCisJTUlfRU5UUlkoIm5vZmxzaCIsICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBOT0ZMU0gsICAgICAwICkKKyNpZiBYQ0FTRQorCU1JX0VOVFJZKCJ4Y2FzZSIsICAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgWENBU0UsICAgICAgMCApCisjZW5kaWYKKyNpZiBUT1NUT1AKKwlNSV9FTlRSWSgidG9zdG9wIiwgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIFRPU1RPUCwgICAgIDAgKQorI2VuZGlmCisjaWYgRUNIT1BSVAorCU1JX0VOVFJZKCJlY2hvcHJ0IiwgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgRUNIT1BSVCwgICAgMCApCisJTUlfRU5UUlkoInBydGVyYXNlIiwgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPUFJULCAgICAwICkKKyNlbmRpZgorI2lmIEVDSE9DVEwKKwlNSV9FTlRSWSgiZWNob2N0bCIsICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9DVEwsICAgIDAgKQorCU1JX0VOVFJZKCJjdGxlY2hvIiwgIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0NUTCwgICAgMCApCisjZW5kaWYKKyNpZiBFQ0hPS0UKKwlNSV9FTlRSWSgiZWNob2tlIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9LRSwgICAgIDAgKQorCU1JX0VOVFJZKCJjcnRraWxsIiwgIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0tFLCAgICAgMCApCisjZW5kaWYKK307CisKK2VudW0geworCU5VTV9tb2RlX2luZm8gPSBBUlJBWV9TSVpFKG1vZGVfaW5mbykKK307CisKKworLyogQ29udHJvbCBjaGFyYWN0ZXJzICovCitzdHJ1Y3QgY29udHJvbF9pbmZvIHsKKwljb25zdCB1aW50OF90IHNhbmV2YWw7ICAvKiBWYWx1ZSB0byBzZXQgZm9yICdzdHR5IHNhbmUnICovCisJY29uc3QgdWludDhfdCBvZmZzZXQ7ICAgLyogT2Zmc2V0IGluIGNfY2MgKi8KK307CisKK2VudW0geworCS8qIE11c3QgbWF0Y2ggY29udHJvbF9uYW1lW10gYW5kIGNvbnRyb2xfaW5mb1tdIG9yZGVyISAqLworCUNJRFhfaW50ciA9IDAsCisJQ0lEWF9xdWl0LAorCUNJRFhfZXJhc2UsCisJQ0lEWF9raWxsLAorCUNJRFhfZW9mLAorCUNJRFhfZW9sLAorI2lmIFZFT0wyCisJQ0lEWF9lb2wyLAorI2VuZGlmCisjaWYgVlNXVENICisJQ0lEWF9zd3RjaCwKKyNlbmRpZgorCUNJRFhfc3RhcnQsCisJQ0lEWF9zdG9wLAorCUNJRFhfc3VzcCwKKyNpZiBWRFNVU1AKKwlDSURYX2RzdXNwLAorI2VuZGlmCisjaWYgVlJFUFJJTlQKKwlDSURYX3Jwcm50LAorI2VuZGlmCisjaWYgVldFUkFTRQorCUNJRFhfd2VyYXNlLAorI2VuZGlmCisjaWYgVkxORVhUCisJQ0lEWF9sbmV4dCwKKyNlbmRpZgorI2lmIFZGTFVTSE8KKwlDSURYX2ZsdXNoLAorI2VuZGlmCisjaWYgVlNUQVRVUworCUNJRFhfc3RhdHVzLAorI2VuZGlmCisJQ0lEWF9taW4sCisJQ0lEWF90aW1lLAorfTsKKworI2RlZmluZSBDSV9FTlRSWShuLHMsbykgbiAiXDAiCisKKy8qIE5hbWUgZ2l2ZW4gb24gY29tbWFuZCBsaW5lICovCitzdGF0aWMgY29uc3QgY2hhciBjb250cm9sX25hbWVbXSA9CisJQ0lfRU5UUlkoImludHIiLCAgICAgQ0lOVFIsICAgVklOVFIgICApCisJQ0lfRU5UUlkoInF1aXQiLCAgICAgQ1FVSVQsICAgVlFVSVQgICApCisJQ0lfRU5UUlkoImVyYXNlIiwgICAgQ0VSQVNFLCAgVkVSQVNFICApCisJQ0lfRU5UUlkoImtpbGwiLCAgICAgQ0tJTEwsICAgVktJTEwgICApCisJQ0lfRU5UUlkoImVvZiIsICAgICAgQ0VPRiwgICAgVkVPRiAgICApCisJQ0lfRU5UUlkoImVvbCIsICAgICAgQ0VPTCwgICAgVkVPTCAgICApCisjaWYgVkVPTDIKKwlDSV9FTlRSWSgiZW9sMiIsICAgICBDRU9MMiwgICBWRU9MMiAgICkKKyNlbmRpZgorI2lmIFZTV1RDSAorCUNJX0VOVFJZKCJzd3RjaCIsICAgIENTV1RDSCwgIFZTV1RDSCAgKQorI2VuZGlmCisJQ0lfRU5UUlkoInN0YXJ0IiwgICAgQ1NUQVJULCAgVlNUQVJUICApCisJQ0lfRU5UUlkoInN0b3AiLCAgICAgQ1NUT1AsICAgVlNUT1AgICApCisJQ0lfRU5UUlkoInN1c3AiLCAgICAgQ1NVU1AsICAgVlNVU1AgICApCisjaWYgVkRTVVNQCisJQ0lfRU5UUlkoImRzdXNwIiwgICAgQ0RTVVNQLCAgVkRTVVNQICApCisjZW5kaWYKKyNpZiBWUkVQUklOVAorCUNJX0VOVFJZKCJycHJudCIsICAgIENSUFJOVCwgIFZSRVBSSU5UKQorI2VuZGlmCisjaWYgVldFUkFTRQorCUNJX0VOVFJZKCJ3ZXJhc2UiLCAgIENXRVJBU0UsIFZXRVJBU0UgKQorI2VuZGlmCisjaWYgVkxORVhUCisJQ0lfRU5UUlkoImxuZXh0IiwgICAgQ0xORVhULCAgVkxORVhUICApCisjZW5kaWYKKyNpZiBWRkxVU0hPCisJQ0lfRU5UUlkoImZsdXNoIiwgICAgQ0ZMVVNITywgVkZMVVNITyApCisjZW5kaWYKKyNpZiBWU1RBVFVTCisJQ0lfRU5UUlkoInN0YXR1cyIsICAgQ1NUQVRVUywgVlNUQVRVUyApCisjZW5kaWYKKwkvKiBUaGVzZSBtdXN0IGJlIGxhc3QgYmVjYXVzZSBvZiB0aGUgZGlzcGxheSByb3V0aW5lcyAqLworCUNJX0VOVFJZKCJtaW4iLCAgICAgIDEsICAgICAgIFZNSU4gICAgKQorCUNJX0VOVFJZKCJ0aW1lIiwgICAgIDAsICAgICAgIFZUSU1FICAgKQorCTsKKworI3VuZGVmIENJX0VOVFJZCisjZGVmaW5lIENJX0VOVFJZKG4scyxvKSB7IHMsIG8gfSwKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gY29udHJvbF9pbmZvW10gPSB7CisJLyogVGhpcyBzaG91bGQgYmUgdmVyYmF0aW0gY3V0LW4tcGFzdGUgY29weSBvZiB0aGUgYWJvdmUgQ0lfRU5UUllzICovCisJQ0lfRU5UUlkoImludHIiLCAgICAgQ0lOVFIsICAgVklOVFIgICApCisJQ0lfRU5UUlkoInF1aXQiLCAgICAgQ1FVSVQsICAgVlFVSVQgICApCisJQ0lfRU5UUlkoImVyYXNlIiwgICAgQ0VSQVNFLCAgVkVSQVNFICApCisJQ0lfRU5UUlkoImtpbGwiLCAgICAgQ0tJTEwsICAgVktJTEwgICApCisJQ0lfRU5UUlkoImVvZiIsICAgICAgQ0VPRiwgICAgVkVPRiAgICApCisJQ0lfRU5UUlkoImVvbCIsICAgICAgQ0VPTCwgICAgVkVPTCAgICApCisjaWYgVkVPTDIKKwlDSV9FTlRSWSgiZW9sMiIsICAgICBDRU9MMiwgICBWRU9MMiAgICkKKyNlbmRpZgorI2lmIFZTV1RDSAorCUNJX0VOVFJZKCJzd3RjaCIsICAgIENTV1RDSCwgIFZTV1RDSCAgKQorI2VuZGlmCisJQ0lfRU5UUlkoInN0YXJ0IiwgICAgQ1NUQVJULCAgVlNUQVJUICApCisJQ0lfRU5UUlkoInN0b3AiLCAgICAgQ1NUT1AsICAgVlNUT1AgICApCisJQ0lfRU5UUlkoInN1c3AiLCAgICAgQ1NVU1AsICAgVlNVU1AgICApCisjaWYgVkRTVVNQCisJQ0lfRU5UUlkoImRzdXNwIiwgICAgQ0RTVVNQLCAgVkRTVVNQICApCisjZW5kaWYKKyNpZiBWUkVQUklOVAorCUNJX0VOVFJZKCJycHJudCIsICAgIENSUFJOVCwgIFZSRVBSSU5UKQorI2VuZGlmCisjaWYgVldFUkFTRQorCUNJX0VOVFJZKCJ3ZXJhc2UiLCAgIENXRVJBU0UsIFZXRVJBU0UgKQorI2VuZGlmCisjaWYgVkxORVhUCisJQ0lfRU5UUlkoImxuZXh0IiwgICAgQ0xORVhULCAgVkxORVhUICApCisjZW5kaWYKKyNpZiBWRkxVU0hPCisJQ0lfRU5UUlkoImZsdXNoIiwgICAgQ0ZMVVNITywgVkZMVVNITyApCisjZW5kaWYKKyNpZiBWU1RBVFVTCisJQ0lfRU5UUlkoInN0YXR1cyIsICAgQ1NUQVRVUywgVlNUQVRVUyApCisjZW5kaWYKKwkvKiBUaGVzZSBtdXN0IGJlIGxhc3QgYmVjYXVzZSBvZiB0aGUgZGlzcGxheSByb3V0aW5lcyAqLworCUNJX0VOVFJZKCJtaW4iLCAgICAgIDEsICAgICAgIFZNSU4gICAgKQorCUNJX0VOVFJZKCJ0aW1lIiwgICAgIDAsICAgICAgIFZUSU1FICAgKQorfTsKKworZW51bSB7CisJTlVNX2NvbnRyb2xfaW5mbyA9IEFSUkFZX1NJWkUoY29udHJvbF9pbmZvKQorfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJY29uc3QgY2hhciAqZGV2aWNlX25hbWU7CisJLyogVGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4sIGZvciBvdXRwdXQgd3JhcHBpbmcgKi8KKwl1bnNpZ25lZCBtYXhfY29sOworCS8qIEN1cnJlbnQgcG9zaXRpb24sIHRvIGtub3cgd2hlbiB0byB3cmFwICovCisJdW5zaWduZWQgY3VycmVudF9jb2w7CisJY2hhciBidWZbMTBdOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJRy5kZXZpY2VfbmFtZSA9IGJiX21zZ19zdGFuZGFyZF9pbnB1dDsgXAorCUcubWF4X2NvbCA9IDgwOyBcCit9IHdoaWxlICgwKQorCisKKy8qIFJldHVybiBhIHN0cmluZyB0aGF0IGlzIHRoZSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgY2hhcmFjdGVyIENIICovCisvKiBBZGFwdGVkIGZyb20gJ2NhdCcgYnkgVG9yYmpvcm4gR3Jhbmx1bmQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp2aXNpYmxlKHVuc2lnbmVkIGNoKQoreworCWNoYXIgKmJwb3V0ID0gRy5idWY7CisKKwlpZiAoY2ggPT0gX1BPU0lYX1ZESVNBQkxFKQorCQlyZXR1cm4gIjx1bmRlZj4iOworCisJaWYgKGNoID49IDEyOCkgeworCQljaCAtPSAxMjg7CisJCSpicG91dCsrID0gJ00nOworCQkqYnBvdXQrKyA9ICctJzsKKwl9CisKKwlpZiAoY2ggPCAzMikgeworCQkqYnBvdXQrKyA9ICdeJzsKKwkJKmJwb3V0KysgPSBjaCArIDY0OworCX0gZWxzZSBpZiAoY2ggPCAxMjcpIHsKKwkJKmJwb3V0KysgPSBjaDsKKwl9IGVsc2UgeworCQkqYnBvdXQrKyA9ICdeJzsKKwkJKmJwb3V0KysgPSAnPyc7CisJfQorCisJKmJwb3V0ID0gJ1wwJzsKKwlyZXR1cm4gRy5idWY7Cit9CisKK3N0YXRpYyB0Y2ZsYWdfdCAqbW9kZV90eXBlX2ZsYWcodW5zaWduZWQgdHlwZSwgY29uc3Qgc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGNmbGFnX29mZnNldHNbXSBBTElHTjEgPSB7CisJCW9mZnNldG9mKHN0cnVjdCB0ZXJtaW9zLCBjX2NmbGFnKSwgLyogY29udHJvbCAqLworCQlvZmZzZXRvZihzdHJ1Y3QgdGVybWlvcywgY19pZmxhZyksIC8qIGlucHV0ICovCisJCW9mZnNldG9mKHN0cnVjdCB0ZXJtaW9zLCBjX29mbGFnKSwgLyogb3V0cHV0ICovCisJCW9mZnNldG9mKHN0cnVjdCB0ZXJtaW9zLCBjX2xmbGFnKSAgLyogbG9jYWwgKi8KKwl9OworCisJaWYgKHR5cGUgPD0gbG9jYWwpIHsKKwkJcmV0dXJuICh0Y2ZsYWdfdCopICgoKGNoYXIqKW1vZGUpICsgdGNmbGFnX29mZnNldHNbdHlwZV0pOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZWVkX29yX2RpZShlbnVtIHNwZWVkX3NldHRpbmcgdHlwZSwgY29uc3QgY2hhciAqYXJnLAorCQkJCQlzdHJ1Y3QgdGVybWlvcyAqbW9kZSkKK3sKKwlzcGVlZF90IGJhdWQ7CisKKwliYXVkID0gdHR5X3ZhbHVlX3RvX2JhdWQoeGF0b3UoYXJnKSk7CisKKwlpZiAodHlwZSAhPSBvdXRwdXRfc3BlZWQpIHsgICAgIC8qIGVpdGhlciBpbnB1dCBvciBib3RoICovCisJCWNmc2V0aXNwZWVkKG1vZGUsIGJhdWQpOworCX0KKwlpZiAodHlwZSAhPSBpbnB1dF9zcGVlZCkgeyAgICAgIC8qIGVpdGhlciBvdXRwdXQgb3IgYm90aCAqLworCQljZnNldG9zcGVlZChtb2RlLCBiYXVkKTsKKwl9Cit9CisKK3N0YXRpYyBOT1JFVFVSTiB2b2lkIHBlcnJvcl9vbl9kZXZpY2VfYW5kX2RpZShjb25zdCBjaGFyICpmbXQpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKGZtdCwgRy5kZXZpY2VfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcnJvcl9vbl9kZXZpY2UoY29uc3QgY2hhciAqZm10KQoreworCWJiX3BlcnJvcl9tc2coZm10LCBHLmRldmljZV9uYW1lKTsKK30KKworLyogUHJpbnQgZm9ybWF0IHN0cmluZyBNRVNTQUdFIGFuZCBvcHRpb25hbCBhcmdzLgorICAgV3JhcCB0byBuZXh0IGxpbmUgZmlyc3QgaWYgaXQgd29uJ3QgZml0LgorICAgUHJpbnQgYSBzcGFjZSBmaXJzdCB1bmxlc3MgTUVTU0FHRSB3aWxsIHN0YXJ0IGEgbmV3IGxpbmUgKi8KK3N0YXRpYyB2b2lkIHdyYXBmKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBidWZsZW47CisKKwl2YV9zdGFydChhcmdzLCBtZXNzYWdlKTsKKwlidWZsZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbWVzc2FnZSwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCS8qIFdlIHNlZW0gdG8gYmUgY2FsbGVkIG9ubHkgd2l0aCBzdWl0YWJsZSBsZW5ndGhzLCBidXQgY2hlY2sgaWYKKwkgICBzb21lYm9keSBmYWlsZWQgdG8gYWRoZXJlIHRvIHRoaXMgYXNzdW1wdGlvbiBqdXN0IHRvIGJlIHN1cmUuICAqLworCWlmICghYnVmbGVuIHx8IGJ1ZmxlbiA+PSBzaXplb2YoYnVmKSkgcmV0dXJuOworCisJaWYgKEcuY3VycmVudF9jb2wgPiAwKSB7CisJCUcuY3VycmVudF9jb2wrKzsKKwkJaWYgKGJ1ZlswXSAhPSAnXG4nKSB7CisJCQlpZiAoRy5jdXJyZW50X2NvbCArIGJ1ZmxlbiA+PSBHLm1heF9jb2wpIHsKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCUcuY3VycmVudF9jb2wgPSAwOworCQkJfSBlbHNlCisJCQkJYmJfcHV0Y2hhcignICcpOworCQl9CisJfQorCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwlHLmN1cnJlbnRfY29sICs9IGJ1ZmxlbjsKKwlpZiAoYnVmW2J1Zmxlbi0xXSA9PSAnXG4nKQorCQlHLmN1cnJlbnRfY29sID0gMDsKK30KKworc3RhdGljIHZvaWQgbmV3bGluZSh2b2lkKQoreworCWlmIChHLmN1cnJlbnRfY29sICE9IDApCisJCXdyYXBmKCJcbiIpOworfQorCisjaWZkZWYgVElPQ0dXSU5TWgorc3RhdGljIHZvaWQgc2V0X3dpbmRvd19zaXplKGludCByb3dzLCBpbnQgY29scykKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3aW4gPSB7IDAsIDAsIDAsIDAgfTsKKworCWlmIChpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3aW4pKSB7CisJCWlmIChlcnJubyAhPSBFSU5WQUwpIHsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQltZW1zZXQoJndpbiwgMCwgc2l6ZW9mKHdpbikpOworCX0KKworCWlmIChyb3dzID49IDApCisJCXdpbi53c19yb3cgPSByb3dzOworCWlmIChjb2xzID49IDApCisJCXdpbi53c19jb2wgPSBjb2xzOworCisJaWYgKGlvY3RsKFNURElOX0ZJTEVOTywgVElPQ1NXSU5TWiwgKGNoYXIgKikgJndpbikpCitiYWlsOgorCQlwZXJyb3Jfb25fZGV2aWNlKCIlcyIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfd2luZG93X3NpemUoaW50IGZhbmN5KQoreworCWNvbnN0IGNoYXIgKmZtdF9zdHIgPSAiJXNcMCVzOiBubyBzaXplIGluZm9ybWF0aW9uIGZvciB0aGlzIGRldmljZSI7CisJdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKworCWlmIChnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURElOX0ZJTEVOTywgJndpZHRoLCAmaGVpZ2h0KSkgeworCQlpZiAoKGVycm5vICE9IEVJTlZBTCkgfHwgKChmbXRfc3RyICs9IDIpLCAhZmFuY3kpKSB7CisJCQlwZXJyb3Jfb25fZGV2aWNlKGZtdF9zdHIpOworCQl9CisJfSBlbHNlIHsKKwkJd3JhcGYoZmFuY3kgPyAicm93cyAldTsgY29sdW1ucyAldTsiIDogIiV1ICV1XG4iLAorCQkJCWhlaWdodCwgd2lkdGgpOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBzdHR5X3N1ZmZpeGVzW10gPSB7CisJeyAiYiIsICA1MTIgfSwKKwl7ICJrIiwgMTAyNCB9LAorCXsgIkIiLCAxMDI0IH0sCisJeyAiIiwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1vZGVfaW5mbyAqZmluZF9tb2RlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKG1vZGVfbmFtZSwgbmFtZSk7CisJcmV0dXJuIGkgPj0gMCA/ICZtb2RlX2luZm9baV0gOiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqZmluZF9jb250cm9sKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKGNvbnRyb2xfbmFtZSwgbmFtZSk7CisJcmV0dXJuIGkgPj0gMCA/ICZjb250cm9sX2luZm9baV0gOiBOVUxMOworfQorCitlbnVtIHsKKwlwYXJhbV9uZWVkX2FyZyA9IDB4ODAsCisJcGFyYW1fbGluZSAgICA9IDEgfCAweDgwLAorCXBhcmFtX3Jvd3MgICAgPSAyIHwgMHg4MCwKKwlwYXJhbV9jb2xzICAgID0gMyB8IDB4ODAsCisJcGFyYW1fY29sdW1ucyA9IDQgfCAweDgwLAorCXBhcmFtX3NpemUgICAgPSA1LAorCXBhcmFtX3NwZWVkICAgPSA2LAorCXBhcmFtX2lzcGVlZCAgPSA3IHwgMHg4MCwKKwlwYXJhbV9vc3BlZWQgID0gOCB8IDB4ODAsCit9OworCitzdGF0aWMgaW50IGZpbmRfcGFyYW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwYXJhbXNbXSBBTElHTjEgPQorCQkibGluZVwwIiAgICAvKiAxICovCisJCSJyb3dzXDAiICAgIC8qIDIgKi8KKwkJImNvbHNcMCIgICAgLyogMyAqLworCQkiY29sdW1uc1wwIiAvKiA0ICovCisJCSJzaXplXDAiICAgIC8qIDUgKi8KKwkJInNwZWVkXDAiICAgLyogNiAqLworCQkiaXNwZWVkXDAiCisJCSJvc3BlZWRcMCI7CisJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKHBhcmFtcywgbmFtZSkgKyAxOworCWlmIChpID09IDApCisJCXJldHVybiAwOworCWlmIChpICE9IDUgJiYgaSAhPSA2KQorCQlpIHw9IDB4ODA7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgcmVjb3Zlcl9tb2RlKGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJaW50IGksIG47CisJdW5zaWduZWQgY2hyOworCXVuc2lnbmVkIGxvbmcgaWZsYWcsIG9mbGFnLCBjZmxhZywgbGZsYWc7CisKKwkvKiBTY2FuIGludG8gdGVtcG9yYXJpZXMgc2luY2UgaXQgaXMgdG9vIG11Y2ggdHJvdWJsZSB0byBmaWd1cmUgb3V0CisJICAgdGhlIHJpZ2h0IGZvcm1hdCBmb3IgJ3RjZmxhZ190JyAqLworCWlmIChzc2NhbmYoYXJnLCAiJWx4OiVseDolbHg6JWx4JW4iLAorCQkJICAgJmlmbGFnLCAmb2ZsYWcsICZjZmxhZywgJmxmbGFnLCAmbikgIT0gNCkKKwkJcmV0dXJuIDA7CisJbW9kZS0+Y19pZmxhZyA9IGlmbGFnOworCW1vZGUtPmNfb2ZsYWcgPSBvZmxhZzsKKwltb2RlLT5jX2NmbGFnID0gY2ZsYWc7CisJbW9kZS0+Y19sZmxhZyA9IGxmbGFnOworCWFyZyArPSBuOworCWZvciAoaSA9IDA7IGkgPCBOQ0NTOyArK2kpIHsKKwkJaWYgKHNzY2FuZihhcmcsICI6JXglbiIsICZjaHIsICZuKSAhPSAxKQorCQkJcmV0dXJuIDA7CisJCW1vZGUtPmNfY2NbaV0gPSBjaHI7CisJCWFyZyArPSBuOworCX0KKworCS8qIEZhaWwgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGZpZWxkcyAqLworCWlmICgqYXJnICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfcmVjb3ZlcmFibGUoY29uc3Qgc3RydWN0IHRlcm1pb3MgKm1vZGUsCisJCQkJaW50IFVOVVNFRF9QQVJBTSBkdW1teSkKK3sKKwlpbnQgaTsKKwlwcmludGYoIiVseDolbHg6JWx4OiVseCIsCisJCSAgICh1bnNpZ25lZCBsb25nKSBtb2RlLT5jX2lmbGFnLCAodW5zaWduZWQgbG9uZykgbW9kZS0+Y19vZmxhZywKKwkJICAgKHVuc2lnbmVkIGxvbmcpIG1vZGUtPmNfY2ZsYWcsICh1bnNpZ25lZCBsb25nKSBtb2RlLT5jX2xmbGFnKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgKytpKQorCQlwcmludGYoIjoleCIsICh1bnNpZ25lZCBpbnQpIG1vZGUtPmNfY2NbaV0pOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKm1vZGUsIGludCBmYW5jeSkKK3sKKwkvL19fX19fX19fX19fX19fX19fX19fIDAxMjM0NTY3IDggOQorCWNvbnN0IGNoYXIgKmZtdF9zdHIgPSAiJWx1ICVsdVxuXDBpc3BlZWQgJWx1IGJhdWQ7IG9zcGVlZCAlbHUgYmF1ZDsiOworCXVuc2lnbmVkIGxvbmcgaXNwZWVkLCBvc3BlZWQ7CisKKwlpc3BlZWQgPSBjZmdldGlzcGVlZChtb2RlKTsKKwlvc3BlZWQgPSBjZmdldG9zcGVlZChtb2RlKTsKKwlpZiAoaXNwZWVkID09IDAgfHwgaXNwZWVkID09IG9zcGVlZCkgeworCQlpc3BlZWQgPSBvc3BlZWQ7ICAgICAgICAgICAgICAgIC8qIGluIGNhc2UgaXNwZWVkIHdhcyAwICovCisJCS8vX19fX19fX18gMDEyMyA0IDUgNiA3IDggOQorCQlmbXRfc3RyID0gIiVsdVxuXDBcMFwwXDBcMHNwZWVkICVsdSBiYXVkOyI7CisJfQorCWlmIChmYW5jeSkgZm10X3N0ciArPSA5OworCXdyYXBmKGZtdF9zdHIsIHR0eV9iYXVkX3RvX3ZhbHVlKGlzcGVlZCksIHR0eV9iYXVkX3RvX3ZhbHVlKG9zcGVlZCkpOworfQorCitzdGF0aWMgdm9pZCBkb19kaXNwbGF5KGNvbnN0IHN0cnVjdCB0ZXJtaW9zICptb2RlLCBpbnQgYWxsKQoreworCWludCBpOworCXRjZmxhZ190ICpiaXRzcDsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJaW50IHByZXZfdHlwZSA9IGNvbnRyb2w7CisKKwlkaXNwbGF5X3NwZWVkKG1vZGUsIDEpOworCWlmIChhbGwpCisJCWRpc3BsYXlfd2luZG93X3NpemUoMSk7CisjaWZkZWYgX19saW51eF9fCisJd3JhcGYoImxpbmUgPSAldTtcbiIsIG1vZGUtPmNfbGluZSk7CisjZWxzZQorCW5ld2xpbmUoKTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSAhPSBDSURYX21pbjsgKytpKSB7CisJCS8qIElmIHN3dGNoIGlzIHRoZSBzYW1lIGFzIHN1c3AsIGRvbid0IHByaW50IGJvdGggKi8KKyNpZiBWU1dUQ0ggPT0gVlNVU1AKKwkJaWYgKGkgPT0gQ0lEWF9zd3RjaCkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCS8qIElmIGVvZiB1c2VzIHRoZSBzYW1lIHNsb3QgYXMgbWluLCBvbmx5IHByaW50IHdoaWNoZXZlciBhcHBsaWVzICovCisjaWYgVkVPRiA9PSBWTUlOCisJCWlmICghKG1vZGUtPmNfbGZsYWcgJiBJQ0FOT04pCisJCSAmJiAoaSA9PSBDSURYX2VvZiB8fCBpID09IENJRFhfZW9sKQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJd3JhcGYoIiVzID0gJXM7IiwgbnRoX3N0cmluZyhjb250cm9sX25hbWUsIGkpLAorCQkJICB2aXNpYmxlKG1vZGUtPmNfY2NbY29udHJvbF9pbmZvW2ldLm9mZnNldF0pKTsKKwl9CisjaWYgVkVPRiA9PSBWTUlOCisJaWYgKChtb2RlLT5jX2xmbGFnICYgSUNBTk9OKSA9PSAwKQorI2VuZGlmCisJCXdyYXBmKCJtaW4gPSAldTsgdGltZSA9ICV1OyIsIG1vZGUtPmNfY2NbVk1JTl0sIG1vZGUtPmNfY2NbVlRJTUVdKTsKKwluZXdsaW5lKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX21vZGVfaW5mbzsgKytpKSB7CisJCWlmIChtb2RlX2luZm9baV0uZmxhZ3MgJiBPTUlUKQorCQkJY29udGludWU7CisJCWlmIChtb2RlX2luZm9baV0udHlwZSAhPSBwcmV2X3R5cGUpIHsKKwkJCW5ld2xpbmUoKTsKKwkJCXByZXZfdHlwZSA9IG1vZGVfaW5mb1tpXS50eXBlOworCQl9CisKKwkJYml0c3AgPSBtb2RlX3R5cGVfZmxhZyhtb2RlX2luZm9baV0udHlwZSwgbW9kZSk7CisJCW1hc2sgPSBtb2RlX2luZm9baV0ubWFzayA/IG1vZGVfaW5mb1tpXS5tYXNrIDogbW9kZV9pbmZvW2ldLmJpdHM7CisJCWlmICgoKmJpdHNwICYgbWFzaykgPT0gbW9kZV9pbmZvW2ldLmJpdHMpIHsKKwkJCWlmIChhbGwgfHwgKG1vZGVfaW5mb1tpXS5mbGFncyAmIFNBTkVfVU5TRVQpKQorCQkJCXdyYXBmKCItJXMiKzEsIG50aF9zdHJpbmcobW9kZV9uYW1lLCBpKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGFsbCAmJiBtb2RlX2luZm9baV0uZmxhZ3MgJiBSRVYpCisJCQkgfHwgKCFhbGwgJiYgKG1vZGVfaW5mb1tpXS5mbGFncyAmIChTQU5FX1NFVCB8IFJFVikpID09IChTQU5FX1NFVCB8IFJFVikpCisJCQkpIHsKKwkJCQl3cmFwZigiLSVzIiwgbnRoX3N0cmluZyhtb2RlX25hbWUsIGkpKTsKKwkJCX0KKwkJfQorCX0KKwluZXdsaW5lKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhbmVfbW9kZShzdHJ1Y3QgdGVybWlvcyAqbW9kZSkKK3sKKwlpbnQgaTsKKwl0Y2ZsYWdfdCAqYml0c3A7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX2NvbnRyb2xfaW5mbzsgKytpKSB7CisjaWYgVk1JTiA9PSBWRU9GCisJCWlmIChpID09IENJRFhfbWluKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJbW9kZS0+Y19jY1tjb250cm9sX2luZm9baV0ub2Zmc2V0XSA9IGNvbnRyb2xfaW5mb1tpXS5zYW5ldmFsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fbW9kZV9pbmZvOyArK2kpIHsKKwkJaWYgKG1vZGVfaW5mb1tpXS5mbGFncyAmIFNBTkVfU0VUKSB7CisJCQliaXRzcCA9IG1vZGVfdHlwZV9mbGFnKG1vZGVfaW5mb1tpXS50eXBlLCBtb2RlKTsKKwkJCSpiaXRzcCA9ICgqYml0c3AgJiB+KCh1bnNpZ25lZCBsb25nKW1vZGVfaW5mb1tpXS5tYXNrKSkKKwkJCQl8IG1vZGVfaW5mb1tpXS5iaXRzOworCQl9IGVsc2UgaWYgKG1vZGVfaW5mb1tpXS5mbGFncyAmIFNBTkVfVU5TRVQpIHsKKwkJCWJpdHNwID0gbW9kZV90eXBlX2ZsYWcobW9kZV9pbmZvW2ldLnR5cGUsIG1vZGUpOworCQkJKmJpdHNwID0gKmJpdHNwICYgfigodW5zaWduZWQgbG9uZyltb2RlX2luZm9baV0ubWFzaykKKwkJCQkmIH5tb2RlX2luZm9baV0uYml0czsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2V0X21vZGUoY29uc3Qgc3RydWN0IG1vZGVfaW5mbyAqaW5mbywgaW50IHJldmVyc2VkLAorCQkJCQlzdHJ1Y3QgdGVybWlvcyAqbW9kZSkKK3sKKwl0Y2ZsYWdfdCAqYml0c3A7CisKKwliaXRzcCA9IG1vZGVfdHlwZV9mbGFnKGluZm8tPnR5cGUsIG1vZGUpOworCisJaWYgKGJpdHNwKSB7CisJCWlmIChyZXZlcnNlZCkKKwkJCSpiaXRzcCA9ICpiaXRzcCAmIH5pbmZvLT5tYXNrICYgfmluZm8tPmJpdHM7CisJCWVsc2UKKwkJCSpiaXRzcCA9ICgqYml0c3AgJiB+aW5mby0+bWFzaykgfCBpbmZvLT5iaXRzOworCQlyZXR1cm47CisJfQorCisJLyogQ29tYmluYXRpb24gbW9kZSAqLworCWlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX2V2ZW5wXSB8fCBpbmZvID09ICZtb2RlX2luZm9bSURYX3Bhcml0eV0pIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJbW9kZS0+Y19jZmxhZyA9IChtb2RlLT5jX2NmbGFnICYgflBBUkVOQiAmIH5DU0laRSkgfCBDUzg7CisJCWVsc2UKKwkJCW1vZGUtPmNfY2ZsYWcgPSAobW9kZS0+Y19jZmxhZyAmIH5QQVJPREQgJiB+Q1NJWkUpIHwgUEFSRU5CIHwgQ1M3OworCX0gZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9vZGRwXSkgeworCQlpZiAocmV2ZXJzZWQpCisJCQltb2RlLT5jX2NmbGFnID0gKG1vZGUtPmNfY2ZsYWcgJiB+UEFSRU5CICYgfkNTSVpFKSB8IENTODsKKwkJZWxzZQorCQkJbW9kZS0+Y19jZmxhZyA9IChtb2RlLT5jX2NmbGFnICYgfkNTSVpFKSB8IENTNyB8IFBBUk9ERCB8IFBBUkVOQjsKKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfbmxdKSB7CisJCWlmIChyZXZlcnNlZCkgeworCQkJbW9kZS0+Y19pZmxhZyA9IChtb2RlLT5jX2lmbGFnIHwgSUNSTkwpICYgfklOTENSICYgfklHTkNSOworCQkJbW9kZS0+Y19vZmxhZyA9IChtb2RlLT5jX29mbGFnIHwgT05MQ1IpICYgfk9DUk5MICYgfk9OTFJFVDsKKwkJfSBlbHNlIHsKKwkJCW1vZGUtPmNfaWZsYWcgPSBtb2RlLT5jX2lmbGFnICYgfklDUk5MOworCQkJaWYgKE9OTENSKSBtb2RlLT5jX29mbGFnID0gbW9kZS0+Y19vZmxhZyAmIH5PTkxDUjsKKwkJfQorCX0gZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9la10pIHsKKwkJbW9kZS0+Y19jY1tWRVJBU0VdID0gQ0VSQVNFOworCQltb2RlLT5jX2NjW1ZLSUxMXSA9IENLSUxMOworCX0gZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9zYW5lXSkgeworCQlzYW5lX21vZGUobW9kZSk7CisJfSBlbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX2NicmVha10pIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJbW9kZS0+Y19sZmxhZyB8PSBJQ0FOT047CisJCWVsc2UKKwkJCW1vZGUtPmNfbGZsYWcgJj0gfklDQU5PTjsKKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfcGFzczhdKSB7CisJCWlmIChyZXZlcnNlZCkgeworCQkJbW9kZS0+Y19jZmxhZyA9IChtb2RlLT5jX2NmbGFnICYgfkNTSVpFKSB8IENTNyB8IFBBUkVOQjsKKwkJCW1vZGUtPmNfaWZsYWcgfD0gSVNUUklQOworCQl9IGVsc2UgeworCQkJbW9kZS0+Y19jZmxhZyA9IChtb2RlLT5jX2NmbGFnICYgflBBUkVOQiAmIH5DU0laRSkgfCBDUzg7CisJCQltb2RlLT5jX2lmbGFnICY9IH5JU1RSSVA7CisJCX0KKwl9IGVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfbGl0b3V0XSkgeworCQlpZiAocmV2ZXJzZWQpIHsKKwkJCW1vZGUtPmNfY2ZsYWcgPSAobW9kZS0+Y19jZmxhZyAmIH5DU0laRSkgfCBDUzcgfCBQQVJFTkI7CisJCQltb2RlLT5jX2lmbGFnIHw9IElTVFJJUDsKKwkJCW1vZGUtPmNfb2ZsYWcgfD0gT1BPU1Q7CisJCX0gZWxzZSB7CisJCQltb2RlLT5jX2NmbGFnID0gKG1vZGUtPmNfY2ZsYWcgJiB+UEFSRU5CICYgfkNTSVpFKSB8IENTODsKKwkJCW1vZGUtPmNfaWZsYWcgJj0gfklTVFJJUDsKKwkJCW1vZGUtPmNfb2ZsYWcgJj0gfk9QT1NUOworCQl9CisJfSBlbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX3Jhd10gfHwgaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9jb29rZWRdKSB7CisJCWlmICgoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9yYXddICYmIHJldmVyc2VkKQorCQkgfHwgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfY29va2VkXSAmJiAhcmV2ZXJzZWQpCisJCSkgeworCQkJLyogQ29va2VkIG1vZGUgKi8KKwkJCW1vZGUtPmNfaWZsYWcgfD0gQlJLSU5UIHwgSUdOUEFSIHwgSVNUUklQIHwgSUNSTkwgfCBJWE9OOworCQkJbW9kZS0+Y19vZmxhZyB8PSBPUE9TVDsKKwkJCW1vZGUtPmNfbGZsYWcgfD0gSVNJRyB8IElDQU5PTjsKKyNpZiBWTUlOID09IFZFT0YKKwkJCW1vZGUtPmNfY2NbVkVPRl0gPSBDRU9GOworI2VuZGlmCisjaWYgVlRJTUUgPT0gVkVPTAorCQkJbW9kZS0+Y19jY1tWRU9MXSA9IENFT0w7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIFJhdyBtb2RlICovCisJCQltb2RlLT5jX2lmbGFnID0gMDsKKwkJCW1vZGUtPmNfb2ZsYWcgJj0gfk9QT1NUOworCQkJbW9kZS0+Y19sZmxhZyAmPSB+KElTSUcgfCBJQ0FOT04gfCBYQ0FTRSk7CisJCQltb2RlLT5jX2NjW1ZNSU5dID0gMTsKKwkJCW1vZGUtPmNfY2NbVlRJTUVdID0gMDsKKwkJfQorCX0KKyNpZiBJWEFOWQorCWVsc2UgaWYgKGluZm8gPT0gJm1vZGVfaW5mb1tJRFhfZGVjY3RscV0pIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJbW9kZS0+Y19pZmxhZyB8PSBJWEFOWTsKKwkJZWxzZQorCQkJbW9kZS0+Y19pZmxhZyAmPSB+SVhBTlk7CisJfQorI2VuZGlmCisjaWYgVEFCRExZCisJZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF90YWJzXSkgeworCQlpZiAocmV2ZXJzZWQpCisJCQltb2RlLT5jX29mbGFnID0gKG1vZGUtPmNfb2ZsYWcgJiB+VEFCRExZKSB8IFRBQjM7CisJCWVsc2UKKwkJCW1vZGUtPmNfb2ZsYWcgPSAobW9kZS0+Y19vZmxhZyAmIH5UQUJETFkpIHwgVEFCMDsKKwl9CisjZW5kaWYKKyNpZiBPWFRBQlMKKwllbHNlIGlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX3RhYnNdKSB7CisJCWlmIChyZXZlcnNlZCkKKwkJCW1vZGUtPmNfb2ZsYWcgfD0gT1hUQUJTOworCQllbHNlCisJCQltb2RlLT5jX29mbGFnICY9IH5PWFRBQlM7CisJfQorI2VuZGlmCisjaWYgWENBU0UgJiYgSVVDTEMgJiYgT0xDVUMKKwllbHNlIGlmIChpbmZvPT0mbW9kZV9pbmZvW0lEWF9sY2FzZV0gfHwgaW5mbz09Jm1vZGVfaW5mb1tJRFhfTENBU0VdKSB7CisJCWlmIChyZXZlcnNlZCkgeworCQkJbW9kZS0+Y19sZmxhZyAmPSB+WENBU0U7CisJCQltb2RlLT5jX2lmbGFnICY9IH5JVUNMQzsKKwkJCW1vZGUtPmNfb2ZsYWcgJj0gfk9MQ1VDOworCQl9IGVsc2UgeworCQkJbW9kZS0+Y19sZmxhZyB8PSBYQ0FTRTsKKwkJCW1vZGUtPmNfaWZsYWcgfD0gSVVDTEM7CisJCQltb2RlLT5jX29mbGFnIHw9IE9MQ1VDOworCQl9CisJfQorI2VuZGlmCisJZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9jcnRdKSB7CisJCW1vZGUtPmNfbGZsYWcgfD0gRUNIT0UgfCBFQ0hPQ1RMIHwgRUNIT0tFOworCX0gZWxzZSBpZiAoaW5mbyA9PSAmbW9kZV9pbmZvW0lEWF9kZWNdKSB7CisJCW1vZGUtPmNfY2NbVklOVFJdID0gMzsgLyogXkMgKi8KKwkJbW9kZS0+Y19jY1tWRVJBU0VdID0gMTI3OyAvKiBERUwgKi8KKwkJbW9kZS0+Y19jY1tWS0lMTF0gPSAyMTsgLyogXlUgKi8KKwkJbW9kZS0+Y19sZmxhZyB8PSBFQ0hPRSB8IEVDSE9DVEwgfCBFQ0hPS0U7CisJCWlmIChJWEFOWSkgbW9kZS0+Y19pZmxhZyAmPSB+SVhBTlk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfY29udHJvbF9jaGFyX29yX2RpZShjb25zdCBzdHJ1Y3QgY29udHJvbF9pbmZvICppbmZvLAorCQkJY29uc3QgY2hhciAqYXJnLCBzdHJ1Y3QgdGVybWlvcyAqbW9kZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworCisJaWYgKGluZm8gPT0gJmNvbnRyb2xfaW5mb1tDSURYX21pbl0gfHwgaW5mbyA9PSAmY29udHJvbF9pbmZvW0NJRFhfdGltZV0pCisJCXZhbHVlID0geGF0b3VsX3JhbmdlX3NmeChhcmcsIDAsIDB4ZmYsIHN0dHlfc3VmZml4ZXMpOworCWVsc2UgaWYgKGFyZ1swXSA9PSAnXDAnIHx8IGFyZ1sxXSA9PSAnXDAnKQorCQl2YWx1ZSA9IGFyZ1swXTsKKwllbHNlIGlmIChzdHJjbXAoYXJnLCAiXi0iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJ1bmRlZiIpID09IDApCisJCXZhbHVlID0gX1BPU0lYX1ZESVNBQkxFOworCWVsc2UgaWYgKGFyZ1swXSA9PSAnXicpIHsgLyogSWdub3JlIGFueSB0cmFpbGluZyBqdW5rICheQ2p1bmspICovCisJCXZhbHVlID0gYXJnWzFdICYgMHgxZjsgLyogTm9uLWxldHRlcnMgZ2V0IHdlaXJkIHJlc3VsdHMgKi8KKwkJaWYgKGFyZ1sxXSA9PSAnPycpCisJCQl2YWx1ZSA9IDEyNzsKKwl9IGVsc2UKKwkJdmFsdWUgPSB4YXRvdWxfcmFuZ2Vfc2Z4KGFyZywgMCwgMHhmZiwgc3R0eV9zdWZmaXhlcyk7CisJbW9kZS0+Y19jY1tpbmZvLT5vZmZzZXRdID0gdmFsdWU7Cit9CisKKyNkZWZpbmUgU1RUWV9yZXF1aXJlX3NldF9hdHRyICAgKDEgPDwgMCkKKyNkZWZpbmUgU1RUWV9zcGVlZF93YXNfc2V0ICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgU1RUWV92ZXJib3NlX291dHB1dCAgICAgKDEgPDwgMikKKyNkZWZpbmUgU1RUWV9yZWNvdmVyYWJsZV9vdXRwdXQgKDEgPDwgMykKKyNkZWZpbmUgU1RUWV9ub2FyZ3MgICAgICAgICAgICAgKDEgPDwgNCkKKworaW50IHN0dHlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN0dHlfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0ZXJtaW9zIG1vZGU7CisJdm9pZCAoKm91dHB1dF9mdW5jKShjb25zdCBzdHJ1Y3QgdGVybWlvcyAqLCBpbnQpOworCWNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IE5VTEw7CisJaW50IGRpc3BsYXlfYWxsID0gMDsKKwlpbnQgc3R0eV9zdGF0ZTsKKwlpbnQgazsKKworCUlOSVRfRygpOworCisJc3R0eV9zdGF0ZSA9IFNUVFlfbm9hcmdzOworCW91dHB1dF9mdW5jID0gZG9fZGlzcGxheTsKKworCS8qIEZpcnN0IHBhc3M6IG9ubHkgcGFyc2UvdmVyaWZ5IGNvbW1hbmQgbGluZSBwYXJhbXMgKi8KKwlrID0gMDsKKwl3aGlsZSAoYXJndlsrK2tdKSB7CisJCWNvbnN0IHN0cnVjdCBtb2RlX2luZm8gKm1wOworCQljb25zdCBzdHJ1Y3QgY29udHJvbF9pbmZvICpjcDsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltrXTsKKwkJY29uc3QgY2hhciAqYXJnbmV4dCA9IGFyZ3ZbaysxXTsKKwkJaW50IHBhcmFtOworCisJCWlmIChhcmdbMF0gPT0gJy0nKSB7CisJCQlpbnQgaTsKKwkJCW1wID0gZmluZF9tb2RlKGFyZysxKTsKKwkJCWlmIChtcCkgeworCQkJCWlmICghKG1wLT5mbGFncyAmIFJFVikpCisJCQkJCWdvdG8gaW52YWxpZF9hcmd1bWVudDsKKwkJCQlzdHR5X3N0YXRlICY9IH5TVFRZX25vYXJnczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIEl0IGlzIGFuIG9wdGlvbiAtIHBhcnNlIGl0ICovCisJCQlpID0gMDsKKwkJCXdoaWxlIChhcmdbKytpXSkgeworCQkJCXN3aXRjaCAoYXJnW2ldKSB7CisJCQkJY2FzZSAnYSc6CisJCQkJCXN0dHlfc3RhdGUgfD0gU1RUWV92ZXJib3NlX291dHB1dDsKKwkJCQkJb3V0cHV0X2Z1bmMgPSBkb19kaXNwbGF5OworCQkJCQlkaXNwbGF5X2FsbCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2cnOgorCQkJCQlzdHR5X3N0YXRlIHw9IFNUVFlfcmVjb3ZlcmFibGVfb3V0cHV0OworCQkJCQlvdXRwdXRfZnVuYyA9IGRpc3BsYXlfcmVjb3ZlcmFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0YnOgorCQkJCQlpZiAoZmlsZV9uYW1lKQorCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9ubHkgb25lIGRldmljZSBtYXkgYmUgc3BlY2lmaWVkIik7CisJCQkJCWZpbGVfbmFtZSA9ICZhcmdbaSsxXTsgLyogIi1GZGV2aWNlIiA/ICovCisJCQkJCWlmICghZmlsZV9uYW1lWzBdKSB7IC8qIG5vcGUsICItRiBkZXZpY2UiICovCisJCQkJCQlpbnQgcCA9IGsrMTsgLyogYXJndltwXSBpcyBhcmduZXh0ICovCisJCQkJCQlmaWxlX25hbWUgPSBhcmduZXh0OworCQkJCQkJaWYgKCFmaWxlX25hbWUpCisJCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgIi1GIik7CisJCQkJCQkvKiByZW1vdmUgLUYgcGFyYW0gZnJvbSBhcmdbdmNdICovCisJCQkJCQl3aGlsZSAoYXJndltwXSkgeworCQkJCQkJCWFyZ3ZbcF0gPSBhcmd2W3ArMV07CisJCQkJCQkJKytwOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWdvdG8gZW5kX29wdGlvbjsKKwkJCQlkZWZhdWx0OgorCQkJCQlnb3RvIGludmFsaWRfYXJndW1lbnQ7CisJCQkJfQorCQkJfQorIGVuZF9vcHRpb246CisJCQljb250aW51ZTsKKwkJfQorCisJCW1wID0gZmluZF9tb2RlKGFyZyk7CisJCWlmIChtcCkgeworCQkJc3R0eV9zdGF0ZSAmPSB+U1RUWV9ub2FyZ3M7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNwID0gZmluZF9jb250cm9sKGFyZyk7CisJCWlmIChjcCkgeworCQkJaWYgKCFhcmduZXh0KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsIGFyZyk7CisJCQkvKiBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvZiB4ZnVuYyBkZWF0aCBvbmx5ICovCisJCQlzZXRfY29udHJvbF9jaGFyX29yX2RpZShjcCwgYXJnbmV4dCwgJm1vZGUpOworCQkJc3R0eV9zdGF0ZSAmPSB+U1RUWV9ub2FyZ3M7CisJCQkrK2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBhcmFtID0gZmluZF9wYXJhbShhcmcpOworCQlpZiAocGFyYW0gJiBwYXJhbV9uZWVkX2FyZykgeworCQkJaWYgKCFhcmduZXh0KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsIGFyZyk7CisJCQkrK2s7CisJCX0KKworCQlzd2l0Y2ggKHBhcmFtKSB7CisjaWZkZWYgX19saW51eF9fCisJCWNhc2UgcGFyYW1fbGluZToKKyMgaWZuZGVmIFRJT0NHV0lOU1oKKwkJCXhhdG91bF9yYW5nZV9zZngoYXJnbmV4dCwgMSwgSU5UX01BWCwgc3R0eV9zdWZmaXhlcyk7CisJCQlicmVhazsKKyMgZW5kaWYgLyogZWxzZSBmYWxsLXRocm91Z2ggKi8KKyNlbmRpZgorI2lmZGVmIFRJT0NHV0lOU1oKKwkJY2FzZSBwYXJhbV9yb3dzOgorCQljYXNlIHBhcmFtX2NvbHM6CisJCWNhc2UgcGFyYW1fY29sdW1uczoKKwkJCXhhdG91bF9yYW5nZV9zZngoYXJnbmV4dCwgMSwgSU5UX01BWCwgc3R0eV9zdWZmaXhlcyk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9zaXplOgorI2VuZGlmCisJCWNhc2UgcGFyYW1fc3BlZWQ6CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9pc3BlZWQ6CisJCQkvKiBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvZiB4ZnVuYyBkZWF0aCBvbmx5ICovCisJCQlzZXRfc3BlZWRfb3JfZGllKGlucHV0X3NwZWVkLCBhcmduZXh0LCAmbW9kZSk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9vc3BlZWQ6CisJCQkvKiBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvZiB4ZnVuYyBkZWF0aCBvbmx5ICovCisJCQlzZXRfc3BlZWRfb3JfZGllKG91dHB1dF9zcGVlZCwgYXJnbmV4dCwgJm1vZGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAocmVjb3Zlcl9tb2RlKGFyZywgJm1vZGUpID09IDEpIGJyZWFrOworCQkJaWYgKHR0eV92YWx1ZV90b19iYXVkKHhhdG91KGFyZykpICE9IChzcGVlZF90KSAtMSkgYnJlYWs7CisgaW52YWxpZF9hcmd1bWVudDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyZ3VtZW50ICclcyciLCBhcmcpOworCQl9CisJCXN0dHlfc3RhdGUgJj0gflNUVFlfbm9hcmdzOworCX0KKworCS8qIFNwZWNpZnlpbmcgYm90aCAtYSBhbmQgLWcgaXMgYW4gZXJyb3IgKi8KKwlpZiAoKHN0dHlfc3RhdGUgJiAoU1RUWV92ZXJib3NlX291dHB1dCB8IFNUVFlfcmVjb3ZlcmFibGVfb3V0cHV0KSkgPT0KKwkJKFNUVFlfdmVyYm9zZV9vdXRwdXQgfCBTVFRZX3JlY292ZXJhYmxlX291dHB1dCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ2ZXJib3NlIGFuZCBzdHR5LXJlYWRhYmxlIG91dHB1dCBzdHlsZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIpOworCS8qIFNwZWNpZnlpbmcgLWEgb3IgLWcgd2l0aCBub24tb3B0aW9ucyBpcyBhbiBlcnJvciAqLworCWlmICghKHN0dHlfc3RhdGUgJiBTVFRZX25vYXJncykKKwkgJiYgKHN0dHlfc3RhdGUgJiAoU1RUWV92ZXJib3NlX291dHB1dCB8IFNUVFlfcmVjb3ZlcmFibGVfb3V0cHV0KSkKKwkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1vZGVzIG1heSBub3QgYmUgc2V0IHdoZW4gc3BlY2lmeWluZyBhbiBvdXRwdXQgc3R5bGUiKTsKKwl9CisKKwkvKiBOb3cgaXQgaXMgc2FmZSB0byBzdGFydCBkb2luZyB0aGluZ3MgKi8KKwlpZiAoZmlsZV9uYW1lKSB7CisJCUcuZGV2aWNlX25hbWUgPSBmaWxlX25hbWU7CisJCXhtb3ZlX2ZkKHhvcGVuX25vbmJsb2NraW5nKEcuZGV2aWNlX25hbWUpLCBTVERJTl9GSUxFTk8pOworCQluZGVsYXlfb2ZmKFNURElOX0ZJTEVOTyk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0byBhbGwgemVyb2VzIHNvIHRoZXJlIGlzIG5vIHJpc2sgbWVtY21wIHdpbGwgcmVwb3J0IGEKKwkgICBzcHVyaW91cyBkaWZmZXJlbmNlIGluIGFuIHVuaW5pdGlhbGl6ZWQgcG9ydGlvbiBvZiB0aGUgc3RydWN0dXJlICovCisJbWVtc2V0KCZtb2RlLCAwLCBzaXplb2YobW9kZSkpOworCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmbW9kZSkpCisJCXBlcnJvcl9vbl9kZXZpY2VfYW5kX2RpZSgiJXMiKTsKKworCWlmIChzdHR5X3N0YXRlICYgKFNUVFlfdmVyYm9zZV9vdXRwdXQgfCBTVFRZX3JlY292ZXJhYmxlX291dHB1dCB8IFNUVFlfbm9hcmdzKSkgeworCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURE9VVF9GSUxFTk8sICZHLm1heF9jb2wsIE5VTEwpOworCQlvdXRwdXRfZnVuYygmbW9kZSwgZGlzcGxheV9hbGwpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFNlY29uZCBwYXNzOiBwZXJmb3JtIGFjdGlvbnMgKi8KKwlrID0gMDsKKwl3aGlsZSAoYXJndlsrK2tdKSB7CisJCWNvbnN0IHN0cnVjdCBtb2RlX2luZm8gKm1wOworCQljb25zdCBzdHJ1Y3QgY29udHJvbF9pbmZvICpjcDsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltrXTsKKwkJY29uc3QgY2hhciAqYXJnbmV4dCA9IGFyZ3ZbaysxXTsKKwkJaW50IHBhcmFtOworCisJCWlmIChhcmdbMF0gPT0gJy0nKSB7CisJCQltcCA9IGZpbmRfbW9kZShhcmcrMSk7CisJCQlpZiAobXApIHsKKwkJCQlzZXRfbW9kZShtcCwgMSAvKiByZXZlcnNlZCAqLywgJm1vZGUpOworCQkJCXN0dHlfc3RhdGUgfD0gU1RUWV9yZXF1aXJlX3NldF9hdHRyOworCQkJfQorCQkJLyogSXQgaXMgYW4gb3B0aW9uIC0gYWxyZWFkeSBwYXJzZWQuIFNraXAgaXQgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbXAgPSBmaW5kX21vZGUoYXJnKTsKKwkJaWYgKG1wKSB7CisJCQlzZXRfbW9kZShtcCwgMCAvKiBub24tcmV2ZXJzZWQgKi8sICZtb2RlKTsKKwkJCXN0dHlfc3RhdGUgfD0gU1RUWV9yZXF1aXJlX3NldF9hdHRyOworCQkJY29udGludWU7CisJCX0KKworCQljcCA9IGZpbmRfY29udHJvbChhcmcpOworCQlpZiAoY3ApIHsKKwkJCSsrazsKKwkJCXNldF9jb250cm9sX2NoYXJfb3JfZGllKGNwLCBhcmduZXh0LCAmbW9kZSk7CisJCQlzdHR5X3N0YXRlIHw9IFNUVFlfcmVxdWlyZV9zZXRfYXR0cjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGFyYW0gPSBmaW5kX3BhcmFtKGFyZyk7CisJCWlmIChwYXJhbSAmIHBhcmFtX25lZWRfYXJnKSB7CisJCQkrK2s7CisJCX0KKworCQlzd2l0Y2ggKHBhcmFtKSB7CisjaWZkZWYgX19saW51eF9fCisJCWNhc2UgcGFyYW1fbGluZToKKwkJCW1vZGUuY19saW5lID0geGF0b3VsX3NmeChhcmduZXh0LCBzdHR5X3N1ZmZpeGVzKTsKKwkJCXN0dHlfc3RhdGUgfD0gU1RUWV9yZXF1aXJlX3NldF9hdHRyOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBUSU9DR1dJTlNaCisJCWNhc2UgcGFyYW1fY29sczoKKwkJY2FzZSBwYXJhbV9jb2x1bW5zOgorCQkJc2V0X3dpbmRvd19zaXplKC0xLCB4YXRvdWxfc2Z4KGFyZ25leHQsIHN0dHlfc3VmZml4ZXMpKTsKKwkJCWJyZWFrOworCQljYXNlIHBhcmFtX3NpemU6CisJCQlkaXNwbGF5X3dpbmRvd19zaXplKDApOworCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1fcm93czoKKwkJCXNldF93aW5kb3dfc2l6ZSh4YXRvdWxfc2Z4KGFyZ25leHQsIHN0dHlfc3VmZml4ZXMpLCAtMSk7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIHBhcmFtX3NwZWVkOgorCQkJZGlzcGxheV9zcGVlZCgmbW9kZSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9pc3BlZWQ6CisJCQlzZXRfc3BlZWRfb3JfZGllKGlucHV0X3NwZWVkLCBhcmduZXh0LCAmbW9kZSk7CisJCQlzdHR5X3N0YXRlIHw9IChTVFRZX3JlcXVpcmVfc2V0X2F0dHIgfCBTVFRZX3NwZWVkX3dhc19zZXQpOworCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1fb3NwZWVkOgorCQkJc2V0X3NwZWVkX29yX2RpZShvdXRwdXRfc3BlZWQsIGFyZ25leHQsICZtb2RlKTsKKwkJCXN0dHlfc3RhdGUgfD0gKFNUVFlfcmVxdWlyZV9zZXRfYXR0ciB8IFNUVFlfc3BlZWRfd2FzX3NldCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChyZWNvdmVyX21vZGUoYXJnLCAmbW9kZSkgPT0gMSkKKwkJCQlzdHR5X3N0YXRlIHw9IFNUVFlfcmVxdWlyZV9zZXRfYXR0cjsKKwkJCWVsc2UgLyogdHJ1ZTogaWYgKHR0eV92YWx1ZV90b19iYXVkKHhhdG91KGFyZykpICE9IChzcGVlZF90KSAtMSkgKi97CisJCQkJc2V0X3NwZWVkX29yX2RpZShib3RoX3NwZWVkcywgYXJnLCAmbW9kZSk7CisJCQkJc3R0eV9zdGF0ZSB8PSAoU1RUWV9yZXF1aXJlX3NldF9hdHRyIHwgU1RUWV9zcGVlZF93YXNfc2V0KTsKKwkJCX0gLyogZWxzZSAtIGltcG9zc2libGUgKGNhdWdodCBpbiB0aGUgZmlyc3QgcGFzcyk6CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgYXJndW1lbnQgJyVzJyIsIGFyZyk7ICovCisJCX0KKwl9CisKKwlpZiAoc3R0eV9zdGF0ZSAmIFNUVFlfcmVxdWlyZV9zZXRfYXR0cikgeworCQlzdHJ1Y3QgdGVybWlvcyBuZXdfbW9kZTsKKworCQlpZiAodGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQURSQUlOLCAmbW9kZSkpCisJCQlwZXJyb3Jfb25fZGV2aWNlX2FuZF9kaWUoIiVzIik7CisKKwkJLyogUE9TSVggKGFjY29yZGluZyB0byBabG90bmljaydzIGJvb2spIHRjc2V0YXR0ciByZXR1cm5zIHplcm8gaWYKKwkJICAgaXQgcGVyZm9ybXMgKmFueSogb2YgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb25zLiAgVGhpcyBtZWFucyBpdAorCQkgICBjYW4gcmVwb3J0ICdzdWNjZXNzJyB3aGVuIGl0IGhhcyBhY3R1YWxseSBmYWlsZWQgdG8gcGVyZm9ybQorCQkgICBzb21lIHByb3BlciBzdWJzZXQgb2YgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb25zLiAgVG8gZGV0ZWN0CisJCSAgIHRoaXMgcGFydGlhbCBmYWlsdXJlLCBnZXQgdGhlIGN1cnJlbnQgdGVybWluYWwgYXR0cmlidXRlcyBhbmQKKwkJICAgY29tcGFyZSB0aGVtIHRvIHRoZSByZXF1ZXN0ZWQgb25lcyAqLworCisJCS8qIEluaXRpYWxpemUgdG8gYWxsIHplcm9lcyBzbyB0aGVyZSBpcyBubyByaXNrIG1lbWNtcCB3aWxsIHJlcG9ydCBhCisJCSAgIHNwdXJpb3VzIGRpZmZlcmVuY2UgaW4gYW4gdW5pbml0aWFsaXplZCBwb3J0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwkJbWVtc2V0KCZuZXdfbW9kZSwgMCwgc2l6ZW9mKG5ld19tb2RlKSk7CisJCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmbmV3X21vZGUpKQorCQkJcGVycm9yX29uX2RldmljZV9hbmRfZGllKCIlcyIpOworCisJCWlmIChtZW1jbXAoJm1vZGUsICZuZXdfbW9kZSwgc2l6ZW9mKG1vZGUpKSAhPSAwKSB7CisjaWYgQ0lCQVVECisJCQkvKiBTdW5PUyA0LjEuMyAoYXQgbGVhc3QpIGhhcyB0aGUgcHJvYmxlbSB0aGF0IGFmdGVyIHRoaXMgc2VxdWVuY2UsCisJCQkgICB0Y2dldGF0dHIgKCZtMSk7IHRjc2V0YXR0ciAoJm0xKTsgdGNnZXRhdHRyICgmbTIpOworCQkJICAgc29tZXRpbWVzIChtMSAhPSBtMikuICBUaGUgb25seSBkaWZmZXJlbmNlIGlzIGluIHRoZSBmb3VyIGJpdHMKKwkJCSAgIG9mIHRoZSBjX2NmbGFnIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJhdWQgcmF0ZS4gIFRvIHNhdmUKKwkJCSAgIFN1biB1c2VycyBhIGxpdHRsZSBjb25mdXNpb24sIGRvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB0aGlzCisJCQkgICBoYXBwZW5zLiAgQnV0IHN1cHByZXNzIHRoZSBlcnJvciBvbmx5IGlmIHdlIGhhdmVuJ3QgdHJpZWQgdG8KKwkJCSAgIHNldCB0aGUgYmF1ZCByYXRlIGV4cGxpY2l0bHkgLS0gb3RoZXJ3aXNlIHdlJ2QgbmV2ZXIgZ2l2ZSBhbgorCQkJICAgZXJyb3IgZm9yIGEgdHJ1ZSBmYWlsdXJlIHRvIHNldCB0aGUgYmF1ZCByYXRlICovCisKKwkJCW5ld19tb2RlLmNfY2ZsYWcgJj0gKH5DSUJBVUQpOworCQkJaWYgKChzdHR5X3N0YXRlICYgU1RUWV9zcGVlZF93YXNfc2V0KQorCQkJIHx8IG1lbWNtcCgmbW9kZSwgJm5ld19tb2RlLCBzaXplb2YobW9kZSkpICE9IDApCisjZW5kaWYKKwkJCQlwZXJyb3Jfb25fZGV2aWNlX2FuZF9kaWUoIiVzOiBjYW5ub3QgcGVyZm9ybSBhbGwgcmVxdWVzdGVkIG9wZXJhdGlvbnMiKTsKKwkJfQorCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvc3VtLmMgYi9jb3JldXRpbHMvc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxMTBhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zdW0uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3VtIC0tIGNoZWNrc3VtIGFuZCBjb3VudCB0aGUgYmxvY2tzIGluIGEgZmlsZQorICogICAgIExpa2UgQlNEIHN1bSBvciBTeXNWIHN1bSAtciwgZXhjZXB0IGxpa2UgU3lzViBzdW0gaWYgLXMgb3B0aW9uIGlzIGdpdmVuLgorICoKKyAqIENvcHlyaWdodCAoQykgODYsIDg5LCA5MSwgMTk5NS0yMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisgKgorICogV3JpdHRlbiBieSBLYXl2YW4gQWdoYWllcG91ciBhbmQgRGF2aWQgTWFjS2VuemllCisgKiBUYWtlbiBmcm9tIGNvcmV1dGlscyBhbmQgdHVybmVkIGludG8gYSBidXN5Ym94IGFwcGxldCBieSBNaWtlIEZyeXNpbmdlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN1bV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1yc10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHN1bV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoZWNrc3VtIGFuZCBjb3VudCB0aGUgYmxvY2tzIGluIGEgZmlsZVxuIgorLy91c2FnZTogICAgICJcbgktcglVc2UgQlNEIHN1bSBhbGdvcml0aG0gKDFLIGJsb2NrcykiCisvL3VzYWdlOiAgICAgIlxuCS1zCVVzZSBTeXN0ZW0gViBzdW0gYWxnb3JpdGhtICg1MTJieXRlIGJsb2NrcykiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitlbnVtIHsgU1VNX0JTRCwgUFJJTlRfTkFNRSwgU1VNX1NZU1YgfTsKKworLyogQlNEOiBjYWxjdWxhdGUgYW5kIHByaW50IHRoZSByb3RhdGVkIGNoZWNrc3VtIGFuZCB0aGUgc2l6ZSBpbiAxSyBibG9ja3MKKyAgIFRoZSBjaGVja3N1bSB2YXJpZXMgZGVwZW5kaW5nIG9uIHNpemVvZiAoaW50KS4gKi8KKy8qIFNZU1Y6IGNhbGN1bGF0ZSBhbmQgcHJpbnQgdGhlIGNoZWNrc3VtIGFuZCB0aGUgc2l6ZSBpbiA1MTItYnl0ZSBibG9ja3MgKi8KKy8qIFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwuICAqLworc3RhdGljIHVuc2lnbmVkIHN1bV9maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIHR5cGUpCit7CisjZGVmaW5lIGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9ieXRlcyA9IDA7CisJaW50IGZkLCByOworCS8qIFRoZSBzdW0gb2YgYWxsIHRoZSBpbnB1dCBieXRlcywgbW9kdWxvIChVSU5UX01BWCArIDEpLiAgKi8KKwl1bnNpZ25lZCBzID0gMDsKKworCWZkID0gb3Blbl9vcl93YXJuX3N0ZGluKGZpbGUpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoMSkgeworCQlzaXplX3QgYnl0ZXNfcmVhZCA9IHNhZmVfcmVhZChmZCwgYnVmLCBCVUZTSVopOworCisJCWlmICgoc3NpemVfdClieXRlc19yZWFkIDw9IDApIHsKKwkJCXIgPSAoZmQgJiYgY2xvc2UoZmQpICE9IDApOworCQkJaWYgKCFieXRlc19yZWFkICYmICFyKQorCQkJCS8qIG5vIGVycm9yICovCisJCQkJYnJlYWs7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdG90YWxfYnl0ZXMgKz0gYnl0ZXNfcmVhZDsKKwkJaWYgKHR5cGUgPj0gU1VNX1NZU1YpIHsKKwkJCWRvIHMgKz0gYnVmWy0tYnl0ZXNfcmVhZF07IHdoaWxlIChieXRlc19yZWFkKTsKKwkJfSBlbHNlIHsKKwkJCXIgPSAwOworCQkJZG8geworCQkJCXMgPSAocyA+PiAxKSArICgocyAmIDEpIDw8IDE1KTsKKwkJCQlzICs9IGJ1ZltyKytdOworCQkJCXMgJj0gMHhmZmZmOyAvKiBLZWVwIGl0IHdpdGhpbiBib3VuZHMuICovCisJCQl9IHdoaWxlICgtLWJ5dGVzX3JlYWQpOworCQl9CisJfQorCisJaWYgKHR5cGUgPCBQUklOVF9OQU1FKQorCQlmaWxlID0gIiI7CisJaWYgKHR5cGUgPj0gU1VNX1NZU1YpIHsKKwkJciA9IChzICYgMHhmZmZmKSArICgocyAmIDB4ZmZmZmZmZmYpID4+IDE2KTsKKwkJcyA9IChyICYgMHhmZmZmKSArIChyID4+IDE2KTsKKwkJcHJpbnRmKCIlZCAlbGx1ICVzXG4iLCBzLCAodG90YWxfYnl0ZXMgKyA1MTEpIC8gNTEyLCBmaWxlKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCIlMDVkICU1bGx1ICVzXG4iLCBzLCAodG90YWxfYnl0ZXMgKyAxMDIzKSAvIDEwMjQsIGZpbGUpOworCXJldHVybiAxOworI3VuZGVmIGJ1ZgorfQorCitpbnQgc3VtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdW1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG47CisJdW5zaWduZWQgdHlwZSA9IFNVTV9CU0Q7CisKKwluID0gZ2V0b3B0MzIoYXJndiwgInNyIik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG4gJiAxKSB0eXBlID0gU1VNX1NZU1Y7CisJLyogZ2l2ZSB0aGUgYnNkIHByaW9yaXR5IG92ZXIgc3lzdiBmdW5jICovCisJaWYgKG4gJiAyKSB0eXBlID0gU1VNX0JTRDsKKworCWlmICghYXJndlswXSkgeworCQkvKiBEbyBub3QgcHJpbnQgdGhlIG5hbWUgKi8KKwkJbiA9IHN1bV9maWxlKCItIiwgdHlwZSk7CisJfSBlbHNlIHsKKwkJLyogTmVlZCB0byBwcmludCB0aGUgbmFtZSBpZiBlaXRoZXIKKwkJICAgLSBtb3JlIHRoYW4gb25lIGZpbGUgZ2l2ZW4KKwkJICAgLSBkb2luZyBzeXN2ICovCisJCXR5cGUgKz0gKGFyZ3ZbMV0gfHwgdHlwZSA9PSBTVU1fU1lTVik7CisJCW4gPSAxOworCQlkbyB7CisJCQluICY9IHN1bV9maWxlKCphcmd2LCB0eXBlKTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJfQorCXJldHVybiAhbjsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9zeW5jLmMgYi9jb3JldXRpbHMvc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOThhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvc3luYy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgc3luYyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gTWF0Y2hlcyBHTlUgYmVoYXZpb3IuICovCisKKy8vdXNhZ2U6I2RlZmluZSBzeW5jX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgc3luY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIldyaXRlIGFsbCBidWZmZXJlZCBibG9ja3MgdG8gZGlzayIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBzeW5jX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzeW5jX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBJRl9OT1RfREVTS1RPUChVTlVTRURfUEFSQU0pKQoreworCS8qIGNvcmV1dGlscy02LjkgY29tcGF0ICovCisJYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZ3ZbMV0pOworCisJc3luYygpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90YWMuYyBiL2NvcmV1dGlscy90YWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQ2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3RhYy5jCkBAIC0wLDAgKzEsMTExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0YWMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFlhbmcgWGlhb3BlbmcgIDx5eHAgYXQgaGFud2FuZy5jb20uY24+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIE5hdGFuYWVsIENvcGEgIDxuYXRhbmFlbC5jb3BhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgVGl0byBSYWd1c2EgICAgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8qIHRhYyAtIGNvbmNhdGVuYXRlIGFuZCBwcmludCBmaWxlcyBpbiByZXZlcnNlICovCisKKy8qIEJhc2VkIG9uIFlhbmcgWGlhb3BlbmcncyAoeXhwIGF0IGhhbndhbmcuY29tLmNuKSBwYXRjaAorICogaHR0cDovL3d3dy51Y2xpYmMub3JnL2xpc3RzL2J1c3lib3gvMjAwMy1KdWx5LzAwODgxMy5odG1sCisgKi8KKworLy91c2FnZTojZGVmaW5lIHRhY190cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHRhY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIkNvbmNhdGVuYXRlIEZJTEVzIGFuZCBwcmludCB0aGVtIGluIHJldmVyc2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitzdHJ1Y3QgbHN0cmluZyB7CisJaW50IHNpemU7CisJY2hhciBidWZbMV07Cit9OworCitpbnQgdGFjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0YWNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipuYW1lOworCUZJTEUgKmY7CisJc3RydWN0IGxzdHJpbmcgKmxpbmUgPSBOVUxMOworCWxsaXN0X3QgKmxpc3QgPSBOVUxMOworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKyNpZiBFTkFCTEVfREVTS1RPUAorLyogdGFjIGZyb20gY29yZXV0aWxzIDYuOSBzdXBwb3J0czoKKyAgICAgICAtYiwgLS1iZWZvcmUKKyAgICAgICAgICAgICAgYXR0YWNoIHRoZSBzZXBhcmF0b3IgYmVmb3JlIGluc3RlYWQgb2YgYWZ0ZXIKKyAgICAgICAtciwgLS1yZWdleAorICAgICAgICAgICAgICBpbnRlcnByZXQgdGhlIHNlcGFyYXRvciBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgIC1zLCAtLXNlcGFyYXRvcj1TVFJJTkcKKyAgICAgICAgICAgICAgdXNlIFNUUklORyBhcyB0aGUgc2VwYXJhdG9yIGluc3RlYWQgb2YgbmV3bGluZQorV2Ugc3VwcG9ydCBub25lLCBidXQgYXQgbGVhc3Qgd2Ugd2lsbCBjb21wbGFpbiBvciBoYW5kbGUgIi0tIjoKKyovCisJZ2V0b3B0MzIoYXJndiwgIiIpOworCWFyZ3YgKz0gb3B0aW5kOworI2Vsc2UKKwlhcmd2Kys7CisjZW5kaWYKKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIgKikiLSI7CisJLyogV2Ugd2lsbCByZWFkIGZyb20gbGFzdCBmaWxlIHRvIGZpcnN0ICovCisJbmFtZSA9IGFyZ3Y7CisJd2hpbGUgKCpuYW1lKQorCQluYW1lKys7CisKKwlkbyB7CisJCWludCBjaCwgaTsKKworCQluYW1lLS07CisJCWYgPSBmb3Blbl9vcl93YXJuX3N0ZGluKCpuYW1lKTsKKwkJaWYgKGYgPT0gTlVMTCkgeworCQkJLyogZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkIGJ5IGZvcGVuX29yX3dhcm5fc3RkaW4gKi8KKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJybm8gPSBpID0gMDsKKwkJZG8geworCQkJY2ggPSBmZ2V0YyhmKTsKKwkJCWlmIChjaCAhPSBFT0YpIHsKKwkJCQlpZiAoIShpICYgMHg3ZikpCisJCQkJCS8qIEdyb3cgb24gZXZlcnkgMTI4dGggY2hhciAqLworCQkJCQlsaW5lID0geHJlYWxsb2MobGluZSwgaSArIDB4N2YgKyBzaXplb2YoaW50KSArIDEpOworCQkJCWxpbmUtPmJ1ZltpKytdID0gY2g7CisJCQl9CisJCQlpZiAoY2ggPT0gJ1xuJyB8fCAoY2ggPT0gRU9GICYmIGkgIT0gMCkpIHsKKwkJCQlsaW5lID0geHJlYWxsb2MobGluZSwgaSArIHNpemVvZihpbnQpKTsKKwkJCQlsaW5lLT5zaXplID0gaTsKKwkJCQlsbGlzdF9hZGRfdG8oJmxpc3QsIGxpbmUpOworCQkJCWxpbmUgPSBOVUxMOworCQkJCWkgPSAwOworCQkJfQorCQl9IHdoaWxlIChjaCAhPSBFT0YpOworCQkvKiBmZ2V0YyBzZXRzIGVycm5vIHRvIEVOT0VOVCBvbiBFT0YsIHdlIGRvbid0IHdhbnQKKwkJICogdG8gd2FybiBvbiB0aGlzIG5vbi1lcnJvciEgKi8KKwkJaWYgKGVycm5vICYmIGVycm5vICE9IEVOT0VOVCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKm5hbWUpOworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAobmFtZSAhPSBhcmd2KTsKKworCXdoaWxlIChsaXN0KSB7CisJCWxpbmUgPSAoc3RydWN0IGxzdHJpbmcgKilsaXN0LT5kYXRhOworCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgbGluZS0+YnVmLCBsaW5lLT5zaXplKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCQlmcmVlKGxsaXN0X3BvcCgmbGlzdCkpOworCQl9IGVsc2UgeworCQkJbGlzdCA9IGxpc3QtPmxpbms7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3RhaWwuYyBiL2NvcmV1dGlscy90YWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjZWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy90YWlsLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgdGFpbCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50IChuZWVkIGZhbmN5IGZvciAtYykgKi8KKy8qIEJCX0FVRElUIEdOVSBjb21wYXRpYmxlIC1jLCAtcSwgYW5kIC12IG9wdGlvbnMgaW4gJ2ZhbmN5JyBjb25maWd1cmF0aW9uLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy90YWlsLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBQcmV0dHkgbXVjaCByZXdyaXR0ZW4gdG8gZml4IG51bWVyb3VzIGJ1Z3MgYW5kIHJlZHVjZSByZWFsbG9jKCkgY2FsbHMuCisgKiBCdWdzIGZpeGVkIChhbHRob3VnaCBJIG1heSBoYXZlIGZvcmdvdHRlbiBvbmUgb3IgdHdvLi4uIGl0IHdhcyBwcmV0dHkgYmFkKQorICogMSkgbWl4aW5nIHByaW50Zi93cml0ZSB3aXRob3V0IGZmbHVzaCgpaW5nIHN0ZG91dAorICogMikgbm8gY2hlY2sgdGhhdCBhbnkgb3BlbiBmaWxlcyBhcmUgcHJlc2VudAorICogMykgb3B0c3RyaW5nIGhhZCAtcSB0YWtpbmcgYW4gYXJnCisgKiA0KSBubyBlcnJvciBjaGVja2luZyBvbiB3cml0ZSBpbiBzb21lIGNhc2VzLCBhbmQgYSB3YXJuaW5nIGV2ZW4gdGhlbgorICogNSkgcSBhbmQgcyBpbnRlcmFjdGlvbiBidWcKKyAqIDYpIG5vIGNoZWNrIGZvciBsc2VlayBlcnJvcgorICogNykgbHNlZWsgYXR0ZW1wdGVkIHdoZW4gY291bnQ9PTAgZXZlbiBpZiBhcmcgd2FzICswIChmcm9tIHRvcCkKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdGFpbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0YWlsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgbGFzdCAxMCBsaW5lcyBvZiBlYWNoIEZJTEUgKG9yIHN0ZGluKSB0byBzdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgICAiV2l0aCBtb3JlIHRoYW4gb25lIEZJTEUsIHByZWNlZGUgZWFjaCB3aXRoIGEgZmlsZW5hbWUgaGVhZGVyLlxuIgorLy91c2FnZTogICAgICJcbgktZgkJUHJpbnQgZGF0YSBhcyBmaWxlIGdyb3dzIgorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9UQUlMKAorLy91c2FnZTogICAgICJcbgktcyBTRUNPTkRTCVdhaXQgU0VDT05EUyBiZXR3ZWVuIHJlYWRzIHdpdGggLWYiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1uIE5ba2JtXQlQcmludCBsYXN0IE4gbGluZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX1RBSUwoCisvL3VzYWdlOiAgICAgIlxuCS1jIE5ba2JtXQlQcmludCBsYXN0IE4gYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlOZXZlciBwcmludCBoZWFkZXJzIgorLy91c2FnZTogICAgICJcbgktdgkJQWx3YXlzIHByaW50IGhlYWRlcnMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk4gbWF5IGJlIHN1ZmZpeGVkIGJ5IGsgKHgxMDI0KSwgYiAoeDUxMiksIG9yIG0gKHgxMDI0XjIpLiIKKy8vdXNhZ2U6ICAgICAiXG5JZiBOIHN0YXJ0cyB3aXRoIGEgJysnLCBvdXRwdXQgYmVnaW5zIHdpdGggdGhlIE50aCBpdGVtIGZyb20gdGhlIHN0YXJ0IgorLy91c2FnZTogICAgICJcbm9mIGVhY2ggZmlsZSwgbm90IGZyb20gdGhlIGVuZC4iCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRhaWxfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdGFpbCAtbiAxIC9ldGMvcmVzb2x2LmNvbmZcbiIKKy8vdXNhZ2U6ICAgICAgICJuYW1lc2VydmVyIDEwLjAuMC4xXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IHRhaWxfc3VmZml4ZXNbXSA9IHsKKwl7ICJiIiwgNTEyIH0sCisJeyAiayIsIDEwMjQgfSwKKwl7ICJtIiwgMTAyNCoxMDI0IH0sCisJeyAiIiwgMCB9Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJYm9vbCBmcm9tX3RvcDsKKwlib29sIGV4aXRjb2RlOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKworc3RhdGljIHZvaWQgdGFpbF94cHJpbnRfaGVhZGVyKGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaWYgKGZkcHJpbnRmKFNURE9VVF9GSUxFTk8sIGZtdCwgZmlsZW5hbWUpIDwgMCkKKwkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKK30KKworc3RhdGljIHNzaXplX3QgdGFpbF9yZWFkKGludCBmZCwgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByOworCW9mZl90IGN1cnJlbnQ7CisJc3RydWN0IHN0YXQgc2J1ZjsKKworCS8qIC9wcm9jIGZpbGVzIHJlcG9ydCB6ZXJvIHN0X3NpemUsIGRvbid0IGxzZWVrIHRoZW0uICovCisJaWYgKGZzdGF0KGZkLCAmc2J1ZikgPT0gMCAmJiBzYnVmLnN0X3NpemUgPiAwKSB7CisJCWN1cnJlbnQgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpOworCQlpZiAoc2J1Zi5zdF9zaXplIDwgY3VycmVudCkKKwkJCXhsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCX0KKworCXIgPSBmdWxsX3JlYWQoZmQsIGJ1ZiwgY291bnQpOworCWlmIChyIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJRy5leGl0Y29kZSA9IEVYSVRfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworI2RlZmluZSBoZWFkZXJfZm10X3N0ciAiXG49PT4gJXMgPD09XG4iCisKK3N0YXRpYyB1bnNpZ25lZCBlYXRfbnVtKGNvbnN0IGNoYXIgKnApCit7CisJaWYgKCpwID09ICctJykKKwkJcCsrOworCWVsc2UgaWYgKCpwID09ICcrJykgeworCQlwKys7CisJCUcuZnJvbV90b3AgPSAxOworCX0KKwlyZXR1cm4geGF0b3Vfc2Z4KHAsIHRhaWxfc3VmZml4ZXMpOworfQorCitpbnQgdGFpbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGFpbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBjb3VudCA9IDEwOworCXVuc2lnbmVkIHNsZWVwX3BlcmlvZCA9IDE7CisJY29uc3QgY2hhciAqc3RyX2MsICpzdHJfbjsKKworCWNoYXIgKnRhaWxidWY7CisJc2l6ZV90IHRhaWxidWZzaXplOworCXVuc2lnbmVkIGhlYWRlcl90aHJlc2hob2xkID0gMTsKKwl1bnNpZ25lZCBuZmlsZXM7CisJaW50IGksIG9wdDsKKworCWludCAqZmRzOworCWNvbnN0IGNoYXIgKmZtdDsKKworI2lmIEVOQUJMRV9JTkNMVURFX1NVU3YyIHx8IEVOQUJMRV9GRUFUVVJFX0ZBTkNZX1RBSUwKKwkvKiBBbGxvdyBsZWdhY3kgc3ludGF4IG9mIGFuIGluaXRpYWwgbnVtZXJpYyBvcHRpb24gd2l0aG91dCAtbi4gKi8KKwlpZiAoYXJndlsxXSAmJiAoYXJndlsxXVswXSA9PSAnKycgfHwgYXJndlsxXVswXSA9PSAnLScpCisJICYmIGlzZGlnaXQoYXJndlsxXVsxXSkKKwkpIHsKKwkJY291bnQgPSBlYXRfbnVtKGFyZ3ZbMV0pOworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwl9CisjZW5kaWYKKworCS8qIC1zIE5VTSwgLUYgaW1saWVzIC1mICovCisJSUZfRkVBVFVSRV9GQU5DWV9UQUlMKG9wdF9jb21wbGVtZW50YXJ5ID0gInMrOkZmIjspCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImZjOm46IiBJRl9GRUFUVVJFX0ZBTkNZX1RBSUwoInFzOnZGIiksCisJCQkmc3RyX2MsICZzdHJfbiBJRl9GRUFUVVJFX0ZBTkNZX1RBSUwoLCZzbGVlcF9wZXJpb2QpKTsKKyNkZWZpbmUgRk9MTE9XIChvcHQgJiAweDEpCisjZGVmaW5lIENPVU5UX0JZVEVTIChvcHQgJiAweDIpCisJLy9pZiAob3B0ICYgMHgxKSAvLyAtZgorCWlmIChvcHQgJiAweDIpIGNvdW50ID0gZWF0X251bShzdHJfYyk7IC8vIC1jCisJaWYgKG9wdCAmIDB4NCkgY291bnQgPSBlYXRfbnVtKHN0cl9uKTsgLy8gLW4KKyNpZiBFTkFCTEVfRkVBVFVSRV9GQU5DWV9UQUlMCisJLyogcTogbWFrZSBpdCBpbXBvc3NpYmxlIGZvciBuZmlsZXMgdG8gYmUgPiBoZWFkZXJfdGhyZXNoaG9sZCAqLworCWlmIChvcHQgJiAweDgpIGhlYWRlcl90aHJlc2hob2xkID0gVUlOVF9NQVg7IC8vIC1xCisJLy9pZiAob3B0ICYgMHgxMCkgLy8gLXMKKwlpZiAob3B0ICYgMHgyMCkgaGVhZGVyX3RocmVzaGhvbGQgPSAwOyAvLyAtdgorIyBkZWZpbmUgRk9MTE9XX1JFVFJZIChvcHQgJiAweDQwKQorI2Vsc2UKKyMgZGVmaW5lIEZPTExPV19SRVRSWSAwCisjZW5kaWYKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIG9wZW4gYWxsIHRoZSBmaWxlcyAqLworCWZkcyA9IHhtYWxsb2Moc2l6ZW9mKGZkc1swXSkgKiAoYXJnYyArIDEpKTsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCQlpZiAoZnN0YXQoU1RESU5fRklMRU5PLCAmc3RhdGJ1ZikgPT0gMAorCQkgJiYgU19JU0ZJRk8oc3RhdGJ1Zi5zdF9tb2RlKQorCQkpIHsKKwkJCW9wdCAmPSB+MTsgLyogY2xlYXIgRk9MTE9XICovCisJCX0KKwkJYXJndlswXSA9IChjaGFyICopIGJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwl9CisJbmZpbGVzID0gaSA9IDA7CisJZG8geworCQlpbnQgZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oYXJndltpXSk7CisJCWlmIChmZCA8IDAgJiYgIUZPTExPV19SRVRSWSkgeworCQkJRy5leGl0Y29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZkc1tuZmlsZXNdID0gZmQ7CisJCWFyZ3ZbbmZpbGVzKytdID0gYXJndltpXTsKKwl9IHdoaWxlICgrK2kgPCBhcmdjKTsKKworCWlmICghbmZpbGVzKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gZmlsZXMiKTsKKworCS8qIHByZXBhcmUgdGhlIGJ1ZmZlciAqLworCXRhaWxidWZzaXplID0gQlVGU0laOworCWlmICghRy5mcm9tX3RvcCAmJiBDT1VOVF9CWVRFUykgeworCQlpZiAodGFpbGJ1ZnNpemUgPCBjb3VudCArIEJVRlNJWikgeworCQkJdGFpbGJ1ZnNpemUgPSBjb3VudCArIEJVRlNJWjsKKwkJfQorCX0KKwkvKiB0YWlsIC1jMTAyNG0gUkVHVUxBUl9GSUxFIGRvZXNuJ3QgcmVhbGx5IG5lZWQgMUcgbWVtIGJsb2NrLgorCSAqIChJbiBmYWN0LCBpdCBkb2Vzbid0IG5lZWQgQU5ZIG1lbW9yeSkuIFNvIGRlbGF5IGFsbG9jYXRpb24uCisJICovCisJdGFpbGJ1ZiA9IE5VTEw7CisKKwkvKiB0YWlsIHRoZSBmaWxlcyAqLworCisJZm10ID0gaGVhZGVyX2ZtdF9zdHIgKyAxOyAvKiBza2lwIGxlYWRpbmcgbmV3bGluZSBpbiB0aGUgaGVhZGVyIG9uIHRoZSBmaXJzdCBvdXRwdXQgKi8KKwlpID0gMDsKKwlkbyB7CisJCWNoYXIgKmJ1ZjsKKwkJaW50IHRhaWxsZW47CisJCWludCBuZXdsaW5lc19zZWVuOworCQl1bnNpZ25lZCBzZWVuOworCQlpbnQgbnJlYWQ7CisJCWludCBmZCA9IGZkc1tpXTsKKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfVEFJTCAmJiBmZCA8IDApCisJCQljb250aW51ZTsgLyogbWF5IGhhcHBlbiB3aXRoIC1GICovCisKKwkJaWYgKG5maWxlcyA+IGhlYWRlcl90aHJlc2hob2xkKSB7CisJCQl0YWlsX3hwcmludF9oZWFkZXIoZm10LCBhcmd2W2ldKTsKKwkJCWZtdCA9IGhlYWRlcl9mbXRfc3RyOworCQl9CisKKwkJaWYgKCFHLmZyb21fdG9wKSB7CisJCQlvZmZfdCBjdXJyZW50ID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKwkJCWlmIChjdXJyZW50ID4gMCkgeworCQkJCXVuc2lnbmVkIG9mZjsKKwkJCQlpZiAoQ09VTlRfQllURVMpIHsKKwkJCQkvKiBPcHRpbWl6aW5nIGNvdW50LWJ5dGVzIGNhc2UgaWYgdGhlIGZpbGUgaXMgc2Vla2FibGUuCisJCQkJICogQmV3YXJlIG9mIGJhY2tpbmcgdXAgdG9vIGZhci4KKwkJCQkgKiBBbHNvIHdlIGV4Y2x1ZGUgZmlsZXMgd2l0aCBzaXplIDAgKGJlY2F1c2Ugb2YgL3Byb2MveHh4KSAqLworCQkJCQlpZiAoY291bnQgPT0gMCkKKwkJCQkJCWNvbnRpbnVlOyAvKiBzaG93aW5nIHplcm8gYnl0ZXMgaXMgZWFzeSA6KSAqLworCQkJCQljdXJyZW50IC09IGNvdW50OworCQkJCQlpZiAoY3VycmVudCA8IDApCisJCQkJCQljdXJyZW50ID0gMDsKKwkJCQkJeGxzZWVrKGZkLCBjdXJyZW50LCBTRUVLX1NFVCk7CisJCQkJCWJiX2NvcHlmZF9zaXplKGZkLCBTVERPVVRfRklMRU5PLCBjb3VudCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNpZiAxIC8qIFRoaXMgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0IGZvciAqTE9ORyogc3RyaW5ncywgYnV0IHZlcnkgdXNlZnVsICovCisJCQkJLyogT3B0aW1pemluZyBjb3VudC1saW5lcyBjYXNlIGlmIHRoZSBmaWxlIGlzIHNlZWthYmxlLgorCQkJCSAqIFdlIGFzc3VtZSB0aGUgbGluZXMgYXJlIDw2NGsuCisJCQkJICogKFVzZXJzIGNvbXBsYWluIHRoYXQgdGFpbCB0YWtlcyB0b28gbG9uZworCQkJCSAqIG9uIG11bHRpLWdpZ2FieXRlIGZpbGVzKSAqLworCQkJCW9mZiA9IChjb3VudCB8IDB4Zik7IC8qIGZvciBzbWFsbCBjb3VudHMsIGJlIG1vcmUgcGFyYW5vaWQgKi8KKwkJCQlpZiAob2ZmID4gKElOVF9NQVggLyAoNjQqMTAyNCkpKQorCQkJCQlvZmYgPSAoSU5UX01BWCAvICg2NCoxMDI0KSk7CisJCQkJY3VycmVudCAtPSBvZmYgKiAoNjQqMTAyNCk7CisJCQkJaWYgKGN1cnJlbnQgPCAwKQorCQkJCQljdXJyZW50ID0gMDsKKwkJCQl4bHNlZWsoZmQsIGN1cnJlbnQsIFNFRUtfU0VUKTsKKyNlbmRpZgorCQkJfQorCQl9CisKKwkJaWYgKCF0YWlsYnVmKQorCQkJdGFpbGJ1ZiA9IHhtYWxsb2ModGFpbGJ1ZnNpemUpOworCisJCWJ1ZiA9IHRhaWxidWY7CisJCXRhaWxsZW4gPSAwOworCQkvKiAiV2Ugc2F3IDFzdCBsaW5lL2J5dGUiLgorCQkgKiBVc2VkIG9ubHkgYnkgK04gY29kZSAoInN0YXJ0IGZyb20gTnRoIiwgMS1iYXNlZCk6ICovCisJCXNlZW4gPSAxOworCQluZXdsaW5lc19zZWVuID0gMDsKKwkJd2hpbGUgKChucmVhZCA9IHRhaWxfcmVhZChmZCwgYnVmLCB0YWlsYnVmc2l6ZSAtIHRhaWxsZW4pKSA+IDApIHsKKwkJCWlmIChHLmZyb21fdG9wKSB7CisJCQkJaW50IG53cml0ZSA9IG5yZWFkOworCQkJCWlmIChzZWVuIDwgY291bnQpIHsKKwkJCQkJLyogV2UgbmVlZCB0byBza2lwIGEgZmV3IG1vcmUgYnl0ZXMvbGluZXMgKi8KKwkJCQkJaWYgKENPVU5UX0JZVEVTKSB7CisJCQkJCQlud3JpdGUgLT0gKGNvdW50IC0gc2Vlbik7CisJCQkJCQlzZWVuICs9IG5yZWFkOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhciAqcyA9IGJ1ZjsKKwkJCQkJCWRvIHsKKwkJCQkJCQktLW53cml0ZTsKKwkJCQkJCQlpZiAoKnMrKyA9PSAnXG4nICYmICsrc2VlbiA9PSBjb3VudCkgeworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9IHdoaWxlIChud3JpdGUpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChud3JpdGUgPiAwKQorCQkJCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmICsgbnJlYWQgLSBud3JpdGUsIG53cml0ZSk7CisJCQl9IGVsc2UgaWYgKGNvdW50KSB7CisJCQkJaWYgKENPVU5UX0JZVEVTKSB7CisJCQkJCXRhaWxsZW4gKz0gbnJlYWQ7CisJCQkJCWlmICh0YWlsbGVuID4gKGludCljb3VudCkgeworCQkJCQkJbWVtbW92ZSh0YWlsYnVmLCB0YWlsYnVmICsgdGFpbGxlbiAtIGNvdW50LCBjb3VudCk7CisJCQkJCQl0YWlsbGVuID0gY291bnQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgayA9IG5yZWFkOworCQkJCQlpbnQgbmV3bGluZXNfaW5fYnVmID0gMDsKKworCQkJCQlkbyB7IC8qIGNvdW50ICdcbicgaW4gbGFzdCByZWFkICovCisJCQkJCQlrLS07CisJCQkJCQlpZiAoYnVmW2tdID09ICdcbicpIHsKKwkJCQkJCQluZXdsaW5lc19pbl9idWYrKzsKKwkJCQkJCX0KKwkJCQkJfSB3aGlsZSAoayk7CisKKwkJCQkJaWYgKG5ld2xpbmVzX3NlZW4gKyBuZXdsaW5lc19pbl9idWYgPCAoaW50KWNvdW50KSB7CisJCQkJCQluZXdsaW5lc19zZWVuICs9IG5ld2xpbmVzX2luX2J1ZjsKKwkJCQkJCXRhaWxsZW4gKz0gbnJlYWQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnQgZXh0cmEgPSAoYnVmW25yZWFkLTFdICE9ICdcbicpOworCQkJCQkJY2hhciAqczsKKworCQkJCQkJayA9IG5ld2xpbmVzX3NlZW4gKyBuZXdsaW5lc19pbl9idWYgKyBleHRyYSAtIGNvdW50OworCQkJCQkJcyA9IHRhaWxidWY7CisJCQkJCQl3aGlsZSAoaykgeworCQkJCQkJCWlmICgqcyA9PSAnXG4nKSB7CisJCQkJCQkJCWstLTsKKwkJCQkJCQl9CisJCQkJCQkJcysrOworCQkJCQkJfQorCQkJCQkJdGFpbGxlbiArPSBucmVhZCAtIChzIC0gdGFpbGJ1Zik7CisJCQkJCQltZW1tb3ZlKHRhaWxidWYsIHMsIHRhaWxsZW4pOworCQkJCQkJbmV3bGluZXNfc2VlbiA9IGNvdW50IC0gZXh0cmE7CisJCQkJCX0KKwkJCQkJaWYgKHRhaWxidWZzaXplIDwgKHNpemVfdCl0YWlsbGVuICsgQlVGU0laKSB7CisJCQkJCQl0YWlsYnVmc2l6ZSA9IHRhaWxsZW4gKyBCVUZTSVo7CisJCQkJCQl0YWlsYnVmID0geHJlYWxsb2ModGFpbGJ1ZiwgdGFpbGJ1ZnNpemUpOworCQkJCQl9CisJCQkJfQorCQkJCWJ1ZiA9IHRhaWxidWYgKyB0YWlsbGVuOworCQkJfQorCQl9IC8qIHdoaWxlICh0YWlsX3JlYWQoKSA+IDApICovCisJCWlmICghRy5mcm9tX3RvcCkgeworCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHRhaWxidWYsIHRhaWxsZW4pOworCQl9CisJfSB3aGlsZSAoKytpIDwgbmZpbGVzKTsKKworCXRhaWxidWYgPSB4cmVhbGxvYyh0YWlsYnVmLCBCVUZTSVopOworCisJZm10ID0gTlVMTDsKKworCWlmIChGT0xMT1cpIHdoaWxlICgxKSB7CisJCXNsZWVwKHNsZWVwX3BlcmlvZCk7CisKKwkJaSA9IDA7CisJCWRvIHsKKwkJCWludCBucmVhZDsKKwkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltpXTsKKwkJCWludCBmZCA9IGZkc1tpXTsKKworCQkJaWYgKEZPTExPV19SRVRSWSkgeworCQkJCXN0cnVjdCBzdGF0IHNidWYsIGZzYnVmOworCisJCQkJaWYgKGZkIDwgMAorCQkJCSB8fCBmc3RhdChmZCwgJmZzYnVmKSA8IDAKKwkJCQkgfHwgc3RhdChmaWxlbmFtZSwgJnNidWYpIDwgMAorCQkJCSB8fCBmc2J1Zi5zdF9kZXYgIT0gc2J1Zi5zdF9kZXYKKwkJCQkgfHwgZnNidWYuc3RfaW5vICE9IHNidWYuc3RfaW5vCisJCQkJKSB7CisJCQkJCWludCBuZXdfZmQ7CisKKwkJCQkJaWYgKGZkID49IDApCisJCQkJCQljbG9zZShmZCk7CisJCQkJCW5ld19mZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwkJCQkJaWYgKG5ld19mZCA+PSAwKSB7CisJCQkJCQliYl9lcnJvcl9tc2coIiVzIGhhcyAlczsgZm9sbG93aW5nIGVuZCBvZiBuZXcgZmlsZSIsCisJCQkJCQkJZmlsZW5hbWUsIChmZCA8IDApID8gImFwcGVhcmVkIiA6ICJiZWVuIHJlcGxhY2VkIgorCQkJCQkJKTsKKwkJCQkJfSBlbHNlIGlmIChmZCA+PSAwKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnKCIlcyBoYXMgYmVjb21lIGluYWNjZXNzaWJsZSIsIGZpbGVuYW1lKTsKKwkJCQkJfQorCQkJCQlmZHNbaV0gPSBmZCA9IG5ld19mZDsKKwkJCQl9CisJCQl9CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfVEFJTCAmJiBmZCA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAobmZpbGVzID4gaGVhZGVyX3RocmVzaGhvbGQpIHsKKwkJCQlmbXQgPSBoZWFkZXJfZm10X3N0cjsKKwkJCX0KKwkJCXdoaWxlICgobnJlYWQgPSB0YWlsX3JlYWQoZmQsIHRhaWxidWYsIEJVRlNJWikpID4gMCkgeworCQkJCWlmIChmbXQpIHsKKwkJCQkJdGFpbF94cHJpbnRfaGVhZGVyKGZtdCwgZmlsZW5hbWUpOworCQkJCQlmbXQgPSBOVUxMOworCQkJCX0KKwkJCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgdGFpbGJ1ZiwgbnJlYWQpOworCQkJfQorCQl9IHdoaWxlICgrK2kgPCBuZmlsZXMpOworCX0gLyogd2hpbGUgKDEpICovCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShmZHMpOworCQlmcmVlKHRhaWxidWYpOworCX0KKwlyZXR1cm4gRy5leGl0Y29kZTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90ZWUuYyBiL2NvcmV1dGlscy90ZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNjMDUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3RlZS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0ZWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy90ZWUuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgdGVlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFpXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdGVlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29weSBzdGRpbiB0byBlYWNoIEZJTEUsIGFuZCBhbHNvIHRvIHN0ZG91dFxuIgorLy91c2FnZTogICAgICJcbgktYQlBcHBlbmQgdG8gdGhlIGdpdmVuIEZJTEVzLCBkb24ndCBvdmVyd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1pCUlnbm9yZSBpbnRlcnJ1cHQgc2lnbmFscyAoU0lHSU5UKSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdGVlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gXCJIZWxsb1wiIHwgdGVlIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBjYXQgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICJIZWxsb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHRlZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGVlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm1vZGUgPSAid1wwYSI7CisJRklMRSAqKmZpbGVzOworCUZJTEUgKipmcDsKKwljaGFyICoqbmFtZXM7CisJY2hhciAqKm5wOworCWNoYXIgcmV0dmFsOworLy9UT0RPOiBtYWtlIHVuY29uZGl0aW9uYWwKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPCisJc3NpemVfdCBjOworIyBkZWZpbmUgYnVmIGJiX2NvbW1vbl9idWZzaXoxCisjZWxzZQorCWludCBjOworI2VuZGlmCisJcmV0dmFsID0gZ2V0b3B0MzIoYXJndiwgImlhIik7CS8qICdhJyBtdXN0IGJlIDJuZCAqLworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJbW9kZSArPSAocmV0dmFsICYgMik7CS8qIFNpbmNlICdhJyBpcyB0aGUgMm5kIG9wdGlvbi4uLiAqLworCisJaWYgKHJldHZhbCAmIDEpIHsKKwkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7IC8qIFRPRE8gLSBzd2l0Y2ggdG8gc2lnYWN0aW9uLiAod2h5PykgKi8KKwl9CisJcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCS8qIGdudSB0ZWUgaWdub3JlcyBTSUdQSVBFIGluIGNhc2Ugb25lIG9mIHRoZSBvdXRwdXQgZmlsZXMgaXMgYSBwaXBlCisJICogdGhhdCBkb2Vzbid0IGNvbnN1bWUgYWxsIGl0cyBpbnB1dC4gIEdvb2QgaWRlYS4uLiAqLworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCS8qIEFsbG9jYXRlIGFuIGFycmF5IG9mIEZJTEUgKidzLCB3aXRoIG9uZSBleHRyYSBmb3IgYSBzZW50aW5lbC4gKi8KKwlmcCA9IGZpbGVzID0geHphbGxvYyhzaXplb2YoRklMRSAqKSAqIChhcmdjICsgMikpOworCW5wID0gbmFtZXMgPSBhcmd2IC0gMTsKKworCWZpbGVzWzBdID0gc3Rkb3V0OworCWdvdG8gR09UX05FV19GSUxFOworCWRvIHsKKwkJKmZwID0gc3Rkb3V0OworCQlpZiAoTk9UX0xPTkVfREFTSCgqYXJndikpIHsKKwkJCSpmcCA9IGZvcGVuX29yX3dhcm4oKmFyZ3YsIG1vZGUpOworCQkJaWYgKCpmcCA9PSBOVUxMKSB7CisJCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJCWFyZ3YrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkqbnAgPSAqYXJndisrOworIEdPVF9ORVdfRklMRToKKwkJc2V0YnVmKCpmcCwgTlVMTCk7CS8qIHRlZSBtdXN0IG5vdCBidWZmZXIgb3V0cHV0LiAqLworCQlmcCsrOworCQlucCsrOworCX0gd2hpbGUgKCphcmd2KTsKKwkvKiBuYW1lc1swXSB3aWxsIGJlIGZpbGxlZCBsYXRlciAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTworCXdoaWxlICgoYyA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDApIHsKKwkJZnAgPSBmaWxlczsKKwkJZG8KKwkJCWZ3cml0ZShidWYsIDEsIGMsICpmcCk7CisJCXdoaWxlICgqKytmcCk7CisJfQorCWlmIChjIDwgMCkgewkJLyogTWFrZSBzdXJlIHJlYWQgZXJyb3JzIGFyZSBzaWduYWxlZC4gKi8KKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCX0KKyNlbHNlCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CisJd2hpbGUgKChjID0gZ2V0Y2hhcigpKSAhPSBFT0YpIHsKKwkJZnAgPSBmaWxlczsKKwkJZG8KKwkJCXB1dGMoYywgKmZwKTsKKwkJd2hpbGUgKCorK2ZwKTsKKwl9CisjZW5kaWYKKworCS8qIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBpL28gZXJyb3JzIG9uIHN0ZGluIGFuZCB0aGUgdmFyaW91cworCSAqIG91dHB1dCBmaWxlcy4gIFNpbmNlIHdlIGtub3cgdGhhdCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIG91dHB1dAorCSAqIGZpbGUgdGFibGUgaXMgc3Rkb3V0LCB3ZSBjYW4gc2F2ZSBvbmUgImlmIGZlcnJvciIgdGVzdCBieQorCSAqIHNldHRpbmcgdGhlIGZpcnN0IGVudHJ5IHRvIHN0ZGluIGFuZCBjaGVja2luZyBzdGRvdXQgZXJyb3IKKwkgKiBzdGF0dXMgd2l0aCBmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KCkuLi4gYWx0aG91Z2ggZmZsdXNoKClpbmcKKwkgKiBpcyB1bm5lY2Vzc2FyeSBoZXJlLiAqLworCW5wID0gbmFtZXM7CisJZnAgPSBmaWxlczsKKwluYW1lc1swXSA9IChjaGFyICopIGJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwlmaWxlc1swXSA9IHN0ZGluOworCWRvIHsJLyogTm93IGNoZWNrIGZvciBpbnB1dCBhbmQgb3V0cHV0IGVycm9ycy4gKi8KKwkJLyogQ2hlY2tpbmcgZmVycm9yIHNob3VsZCBiZSBzdWZmaWNpZW50LCBidXQgd2UgbWF5IHdhbnQgdG8gZmNsb3NlLgorCQkgKiBJZiB3ZSBkbywgcmVtZW1iZXIgbm90IHRvIGNsb3NlIHN0ZGluISAqLworCQlkaWVfaWZfZmVycm9yKCpmcCsrLCAqbnArKyk7CisJfSB3aGlsZSAoKmZwKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90ZXN0LmMgYi9jb3JldXRpbHMvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTM5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdGVzdC5jCkBAIC0wLDAgKzEsOTE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0ZXN0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChjKSBieSBhIHdob2xlIHBpbGUgb2YgZm9sa3M6CisgKgorICogICAgIHRlc3QoMSk7IHZlcnNpb24gNy1saWtlICAtLSAgYXV0aG9yIEVyaWsgQmFhbGJlcmdlbgorICogICAgIG1vZGlmaWVkIGJ5IEVyaWMgR2lzaW4gdG8gYmUgdXNlZCBhcyBidWlsdC1pbi4KKyAqICAgICBtb2RpZmllZCBieSBBcm5vbGQgUm9iYmlucyB0byBhZGQgU1ZSMyBjb21wYXRpYmlsaXR5CisgKiAgICAgKC14IC1jIC1iIC1wIC11IC1nIC1rKSBwbHVzIEtvcm4ncyAtTCAtbnQgLW90IC1lZiBhbmQgbmV3IC1TIChzb2NrZXQpLgorICogICAgIG1vZGlmaWVkIGJ5IEouVC4gQ29ua2xpbiBmb3IgTmV0QlNELgorICogICAgIG1vZGlmaWVkIGJ5IEhlcmJlcnQgWHUgdG8gYmUgdXNlZCBhcyBidWlsdC1pbiBpbiBhc2guCisgKiAgICAgbW9kaWZpZWQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiB0byBiZSB1c2VkCisgKiAgICAgaW4gYnVzeWJveC4KKyAqICAgICBtb2RpZmllZCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgdG8gYmUgdXNlYWJsZSAoaS5lLiBhIGJpdCBsZXNzIGJsb2F0eSkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIHN0YXRlczoKKyAqICAgICAiVGhpcyBwcm9ncmFtIGlzIGluIHRoZSBQdWJsaWMgRG9tYWluLiIKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfVEVTVCkgICAgICArPSB0ZXN0Lm8gdGVzdF9wdHJfaGFjay5vCisvL2tidWlsZDpsaWItJChDT05GSUdfQVNIKSAgICAgICArPSB0ZXN0Lm8gdGVzdF9wdHJfaGFjay5vCisvL2tidWlsZDpsaWItJChDT05GSUdfSFVTSCkgICAgICArPSB0ZXN0Lm8gdGVzdF9wdHJfaGFjay5vCisKKy8vY29uZmlnOmNvbmZpZyBURVNUCisvL2NvbmZpZzoJYm9vbCAidGVzdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB0ZXN0IGlzIHVzZWQgdG8gY2hlY2sgZmlsZSB0eXBlcyBhbmQgY29tcGFyZSB2YWx1ZXMsCisvL2NvbmZpZzoJICByZXR1cm5pbmcgYW4gYXBwcm9wcmlhdGUgZXhpdCBjb2RlLiBUaGUgYmFzaCBzaGVsbAorLy9jb25maWc6CSAgaGFzIHRlc3QgYnVpbHQgaW4sIGFzaCBjYW4gYnVpbGQgaXQgaW4gb3B0aW9uYWxseS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVEVTVF82NAorLy9jb25maWc6CWJvb2wgIkV4dGVuZCB0ZXN0IHRvIDY0IGJpdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRFU1QgfHwgQVNIX0JVSUxUSU5fVEVTVCB8fCBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIDY0LWJpdCBzdXBwb3J0IGluIHRlc3QuCisKKy8qICJ0ZXN0IC0taGVscCIgZG9lcyBub3QgcHJpbnQgaGVscCAoUE9TSVggY29tcGF0KSwgb25seSAiWyAtLWhlbHAiIGRvZXMuCisgKiBXZSBkaXNwbGF5ICI8YXBwbGV0PiBFWFBSRVNTSU9OIF0iIGhlcmUgKG5vdCAiPGFwcGxldD4gRVhQUkVTU0lPTiIpCisgKiBVbmZvcnR1bmF0ZWx5LCBpdCBzY3Jld3MgdXAgZ2VuZXJhdGVkIEJ1c3lCb3guaHRtbC4gVE9ETy4gKi8KKy8vdXNhZ2U6I2RlZmluZSB0ZXN0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJFWFBSRVNTSU9OIF0iCisvL3VzYWdlOiNkZWZpbmUgdGVzdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoZWNrIGZpbGUgdHlwZXMsIGNvbXBhcmUgdmFsdWVzIGV0Yy4gUmV0dXJuIGEgMC8xIGV4aXQgY29kZVxuIgorLy91c2FnZTogICAgICAgImRlcGVuZGluZyBvbiBsb2dpY2FsIHZhbHVlIG9mIEVYUFJFU1NJT04iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRlc3RfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdGVzdCAxIC1lcSAyXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMVxuIgorLy91c2FnZTogICAgICAgIiQgdGVzdCAxIC1lcSAxXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMFxuIgorLy91c2FnZTogICAgICAgIiQgWyAtZCAvZXRjIF1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gJD9cbiIKKy8vdXNhZ2U6ICAgICAgICIwXG4iCisvL3VzYWdlOiAgICAgICAiJCBbIC1kIC9qdW5rIF1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gJD9cbiIKKy8vdXNhZ2U6ICAgICAgICIxXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHNldGptcC5oPgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvKiB0ZXN0X21haW4oKSBpcyBjYWxsZWQgZnJvbSBzaGVsbHMsIGFuZCB3ZSBuZWVkIHRvIGJlIGV4dHJhIGNhcmVmdWwgaGVyZS4KKyAqIFRoaXMgaXMgdHJ1ZSByZWdhcmRsZXNzIG9mIFBSRUZFUl9BUFBMRVRTIGFuZCBTSF9TVEFOREFMT05FCisgKiBzdGF0ZS4gKi8KKworLyogdGVzdCgxKSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKKwlvZXhwciAgIDo6PSBhZXhwciB8IGFleHByICItbyIgb2V4cHIgOworCWFleHByICAgOjo9IG5leHByIHwgbmV4cHIgIi1hIiBhZXhwciA7CisJbmV4cHIgICA6Oj0gcHJpbWFyeSB8ICIhIiBwcmltYXJ5CisJcHJpbWFyeSA6Oj0gdW5hcnktb3BlcmF0b3Igb3BlcmFuZAorCQl8IG9wZXJhbmQgYmluYXJ5LW9wZXJhdG9yIG9wZXJhbmQKKwkJfCBvcGVyYW5kCisJCXwgIigiIG9leHByICIpIgorCQk7CisJdW5hcnktb3BlcmF0b3IgOjo9ICItciJ8Ii13InwiLXgifCItZiJ8Ii1kInwiLWMifCItYiJ8Ii1wInwKKwkJIi11InwiLWcifCItayJ8Ii1zInwiLXQifCIteiJ8Ii1uInwiLW8ifCItTyJ8Ii1HInwiLUwifCItUyI7CisKKwliaW5hcnktb3BlcmF0b3IgOjo9ICI9InwiPT0ifCIhPSJ8Ii1lcSJ8Ii1uZSJ8Ii1nZSJ8Ii1ndCJ8Ii1sZSJ8Ii1sdCJ8CisJCQkiLW50InwiLW90InwiLWVmIjsKKwlvcGVyYW5kIDo6PSA8YW55IGxlZ2FsIFVOSVggZmlsZSBuYW1lPgorKi8KKworLyogVE9ETzogaGFuZGxlIFtbIGV4cHIgXV0gYmFzaGlzbSBiYXNoLWNvbXBhdGlibHkuCisgKiBbWyBdXSBpcyBtZWFudCB0byBiZSBhICJiZXR0ZXIgWyBdIiwgd2l0aCBsZXNzIHdlaXJkIHN5bnRheAorICogYW5kIHdpdGhvdXQgdGhlIHJpc2sgb2YgdmFyaWFibGVzIGFuZCBxdW90ZWQgc3RyaW5ncyBtaXNpbnRlcnByZXRlZAorICogYXMgb3BlcmF0b3JzLgorICogVGhpcyB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmcm9tIHNoZWxscyAtIHdlIG5lZWQgdG8ga25vdyBxdW90ZSBzdGF0dXMKKyAqIG9mIGVhY2ggcGFyYW1ldGVyIChzZWUgYmVsb3cpLgorICoKKyAqIFdvcmQgc3BsaXR0aW5nIGFuZCBwYXRobmFtZSBleHBhbnNpb24gc2hvdWxkIE5PVCBiZSBwZXJmb3JtZWQ6CisgKiAgICAgICMgYT0iYSBiIjsgW1sgJGEgPSAiYSBiIiBdXSAmJiBlY2hvIFlFUworICogICAgICBZRVMKKyAqICAgICAgIyBbWyAvYmluL20qIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIFlFUworICoKKyAqID1+IHNob3VsZCBkbyByZWdleHAgbWF0Y2gKKyAqID0gYW5kID09IHNob3VsZCBkbyBwYXR0ZXJuIG1hdGNoIGFnYWluc3QgcmlnaHQgc2lkZToKKyAqICAgICAgIyBbWyAqYSogPT0gYmFiIF1dICYmIGVjaG8gWUVTCisgKiAgICAgICMgW1sgYmFiID09ICphKiBdXSAmJiBlY2hvIFlFUworICogICAgICBZRVMKKyAqICE9IGRvZXMgdGhlIG5lZ2F0ZWQgPT0gKGkuZS4sIGFsc28gd2l0aCBwYXR0ZXJuIG1hdGNoaW5nKS4KKyAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgcXVvdGF0aW9uLXNlbnNpdGl2ZToKKyAqICAgICAgIyBbWyBiYWIgPT0gImIiYSogXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAgICAgICMgW1sgYmFiID09IGIiYSoiIF1dICYmIGVjaG8gWUVTCisgKgorICogQ29uZGl0aW9uYWwgb3BlcmF0b3JzIHN1Y2ggYXMgLWYgbXVzdCBiZSB1bnF1b3RlZCBsaXRlcmFscyB0byBiZSByZWNvZ25pemVkOgorICogICAgICAjIFtbIC1lIC9iaW4gXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAgICAgICMgW1sgJy1lJyAvYmluIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIGJhc2g6IGNvbmRpdGlvbmFsIGJpbmFyeSBvcGVyYXRvciBleHBlY3RlZC4uLgorICogICAgICAjIEE9Jy1lJzsgW1sgJEEgL2JpbiBdXSAmJiBlY2hvIFlFUworICogICAgICBiYXNoOiBjb25kaXRpb25hbCBiaW5hcnkgb3BlcmF0b3IgZXhwZWN0ZWQuLi4KKyAqCisgKiB8fCBhbmQgJiYgc2hvdWxkIHdvcmsgYXMgLW8gYW5kIC1hIHdvcmsgaW4gWyBdCisgKiAtYSBhbmQgLW8gYXJlbid0IHJlY29nbml6ZWQgKCYmIGFuZCB8fCBhcmUgdG8gYmUgdXNlZCBpbnN0ZWFkKQorICogKCBhbmQgKSBkbyBub3QgbmVlZCB0byBiZSBxdW90ZWQgdW5saWtlIGluIFsgXToKKyAqICAgICAgIyBbWyAoIGFiYyApICYmICcnIF1dICYmIGVjaG8gWUVTCisgKiAgICAgICMgW1sgKCBhYmMgKSB8fCAnJyBdXSAmJiBlY2hvIFlFUworICogICAgICBZRVMKKyAqICAgICAgIyBbWyAoIGFiYyApIC1vICcnIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIGJhc2g6IHN5bnRheCBlcnJvciBpbiBjb25kaXRpb25hbCBleHByZXNzaW9uLi4uCisgKgorICogQXBhcnQgZnJvbSB0aGUgYWJvdmUsIFtbIGV4cHIgXV0gc2hvdWxkIHdvcmsgYXMgWyBleHByIF0KKyAqLworCisjZGVmaW5lIFRFU1RfREVCVUcgMAorCitlbnVtIHRva2VuIHsKKwlFT0ksCisKKwlGSUxSRCwgLyogZmlsZSBhY2Nlc3MgKi8KKwlGSUxXUiwKKwlGSUxFWCwKKworCUZJTEVYSVNULAorCisJRklMUkVHLCAvKiBmaWxlIHR5cGUgKi8KKwlGSUxESVIsCisJRklMQ0RFViwKKwlGSUxCREVWLAorCUZJTEZJRk8sCisJRklMU09DSywKKworCUZJTFNZTSwKKwlGSUxHWiwKKwlGSUxUVCwKKworCUZJTFNVSUQsIC8qIGZpbGUgYml0ICovCisJRklMU0dJRCwKKwlGSUxTVENLLAorCisJRklMTlQsIC8qIGZpbGUgb3BzICovCisJRklMT1QsCisJRklMRVEsCisKKwlGSUxVSUQsCisJRklMR0lELAorCisJU1RSRVosIC8qIHN0ciBvcHMgKi8KKwlTVFJOWiwKKwlTVFJFUSwKKwlTVFJORSwKKwlTVFJMVCwKKwlTVFJHVCwKKworCUlOVEVRLCAvKiBpbnQgb3BzICovCisJSU5UTkUsCisJSU5UR0UsCisJSU5UR1QsCisJSU5UTEUsCisJSU5UTFQsCisKKwlVTk9ULAorCUJBTkQsCisJQk9SLAorCUxQQVJFTiwKKwlSUEFSRU4sCisJT1BFUkFORAorfTsKKyNkZWZpbmUgaXNfaW50X29wKGEpICAgICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gSU5URVEpKSA8PSA1KQorI2RlZmluZSBpc19zdHJfb3AoYSkgICAgICAoKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSBTVFJFWikpIDw9IDUpCisjZGVmaW5lIGlzX2ZpbGVfb3AoYSkgICAgICgoKHVuc2lnbmVkIGNoYXIpKChhKSAtIEZJTE5UKSkgPD0gMikKKyNkZWZpbmUgaXNfZmlsZV9hY2Nlc3MoYSkgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gRklMUkQpKSA8PSAyKQorI2RlZmluZSBpc19maWxlX3R5cGUoYSkgICAoKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSBGSUxSRUcpKSA8PSA1KQorI2RlZmluZSBpc19maWxlX2JpdChhKSAgICAoKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSBGSUxTVUlEKSkgPD0gMikKKworI2lmIFRFU1RfREVCVUcKK2ludCBkZXB0aDsKKyNkZWZpbmUgbmVzdF9tc2coLi4uKSBkbyB7IFwKKwlkZXB0aCsrOyBcCisJZnByaW50ZihzdGRlcnIsICIlKnMiLCBkZXB0aCoyLCAiIik7IFwKKwlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSB1bm5lc3RfbXNnKC4uLikgZG8geyBcCisJZnByaW50ZihzdGRlcnIsICIlKnMiLCBkZXB0aCoyLCAiIik7IFwKKwlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOyBcCisJZGVwdGgtLTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGJnX21zZyguLi4pIGRvIHsgXAorCWZwcmludGYoc3RkZXJyLCAiJSpzIiwgZGVwdGgqMiwgIiIpOyBcCisJZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgdW5uZXN0X21zZ19hbmRfcmV0dXJuKGV4cHIsIC4uLikgZG8geyBcCisJbnVtYmVyX3QgX19yZXMgPSAoZXhwcik7IFwKKwlmcHJpbnRmKHN0ZGVyciwgIiUqcyIsIGRlcHRoKjIsICIiKTsgXAorCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXywgcmVzKTsgXAorCWRlcHRoLS07IFwKKwlyZXR1cm4gX19yZXM7IFwKK30gd2hpbGUgKDApCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgVE9LU1RSW10gPSB7CisJIkVPSSIsCisJIkZJTFJEIiwKKwkiRklMV1IiLAorCSJGSUxFWCIsCisJIkZJTEVYSVNUIiwKKwkiRklMUkVHIiwKKwkiRklMRElSIiwKKwkiRklMQ0RFViIsCisJIkZJTEJERVYiLAorCSJGSUxGSUZPIiwKKwkiRklMU09DSyIsCisJIkZJTFNZTSIsCisJIkZJTEdaIiwKKwkiRklMVFQiLAorCSJGSUxTVUlEIiwKKwkiRklMU0dJRCIsCisJIkZJTFNUQ0siLAorCSJGSUxOVCIsCisJIkZJTE9UIiwKKwkiRklMRVEiLAorCSJGSUxVSUQiLAorCSJGSUxHSUQiLAorCSJTVFJFWiIsCisJIlNUUk5aIiwKKwkiU1RSRVEiLAorCSJTVFJORSIsCisJIlNUUkxUIiwKKwkiU1RSR1QiLAorCSJJTlRFUSIsCisJIklOVE5FIiwKKwkiSU5UR0UiLAorCSJJTlRHVCIsCisJIklOVExFIiwKKwkiSU5UTFQiLAorCSJVTk9UIiwKKwkiQkFORCIsCisJIkJPUiIsCisJIkxQQVJFTiIsCisJIlJQQVJFTiIsCisJIk9QRVJBTkQiCit9OworI2Vsc2UKKyNkZWZpbmUgbmVzdF9tc2coLi4uKSAgICgodm9pZCkwKQorI2RlZmluZSB1bm5lc3RfbXNnKC4uLikgKCh2b2lkKTApCisjZGVmaW5lIGRiZ19tc2coLi4uKSAgICAoKHZvaWQpMCkKKyNkZWZpbmUgdW5uZXN0X21zZ19hbmRfcmV0dXJuKGV4cHIsIC4uLikgcmV0dXJuIGV4cHIKKyNlbmRpZgorCitlbnVtIHsKKwlVTk9QLAorCUJJTk9QLAorCUJVTk9QLAorCUJCSU5PUCwKKwlQQVJFTgorfTsKKworc3RydWN0IG9wZXJhdG9yX3QgeworCXVuc2lnbmVkIGNoYXIgb3BfbnVtLCBvcF90eXBlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcGVyYXRvcl90IG9wc190YWJsZVtdID0geworCXsgLyogIi1yIiAqLyBGSUxSRCAgICwgVU5PUCAgIH0sCisJeyAvKiAiLXciICovIEZJTFdSICAgLCBVTk9QICAgfSwKKwl7IC8qICIteCIgKi8gRklMRVggICAsIFVOT1AgICB9LAorCXsgLyogIi1lIiAqLyBGSUxFWElTVCwgVU5PUCAgIH0sCisJeyAvKiAiLWYiICovIEZJTFJFRyAgLCBVTk9QICAgfSwKKwl7IC8qICItZCIgKi8gRklMRElSICAsIFVOT1AgICB9LAorCXsgLyogIi1jIiAqLyBGSUxDREVWICwgVU5PUCAgIH0sCisJeyAvKiAiLWIiICovIEZJTEJERVYgLCBVTk9QICAgfSwKKwl7IC8qICItcCIgKi8gRklMRklGTyAsIFVOT1AgICB9LAorCXsgLyogIi11IiAqLyBGSUxTVUlEICwgVU5PUCAgIH0sCisJeyAvKiAiLWciICovIEZJTFNHSUQgLCBVTk9QICAgfSwKKwl7IC8qICItayIgKi8gRklMU1RDSyAsIFVOT1AgICB9LAorCXsgLyogIi1zIiAqLyBGSUxHWiAgICwgVU5PUCAgIH0sCisJeyAvKiAiLXQiICovIEZJTFRUICAgLCBVTk9QICAgfSwKKwl7IC8qICIteiIgKi8gU1RSRVogICAsIFVOT1AgICB9LAorCXsgLyogIi1uIiAqLyBTVFJOWiAgICwgVU5PUCAgIH0sCisJeyAvKiAiLWgiICovIEZJTFNZTSAgLCBVTk9QICAgfSwgICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXQgKi8KKworCXsgLyogIi1PIiAqLyBGSUxVSUQgICwgVU5PUCAgIH0sCisJeyAvKiAiLUciICovIEZJTEdJRCAgLCBVTk9QICAgfSwKKwl7IC8qICItTCIgKi8gRklMU1lNICAsIFVOT1AgICB9LAorCXsgLyogIi1TIiAqLyBGSUxTT0NLICwgVU5PUCAgIH0sCisJeyAvKiAiPSIgICovIFNUUkVRICAgLCBCSU5PUCAgfSwKKwl7IC8qICI9PSIgKi8gU1RSRVEgICAsIEJJTk9QICB9LAorCXsgLyogIiE9IiAqLyBTVFJORSAgICwgQklOT1AgIH0sCisJeyAvKiAiPCIgICovIFNUUkxUICAgLCBCSU5PUCAgfSwKKwl7IC8qICI+IiAgKi8gU1RSR1QgICAsIEJJTk9QICB9LAorCXsgLyogIi1lcSIqLyBJTlRFUSAgICwgQklOT1AgIH0sCisJeyAvKiAiLW5lIiovIElOVE5FICAgLCBCSU5PUCAgfSwKKwl7IC8qICItZ2UiKi8gSU5UR0UgICAsIEJJTk9QICB9LAorCXsgLyogIi1ndCIqLyBJTlRHVCAgICwgQklOT1AgIH0sCisJeyAvKiAiLWxlIiovIElOVExFICAgLCBCSU5PUCAgfSwKKwl7IC8qICItbHQiKi8gSU5UTFQgICAsIEJJTk9QICB9LAorCXsgLyogIi1udCIqLyBGSUxOVCAgICwgQklOT1AgIH0sCisJeyAvKiAiLW90IiovIEZJTE9UICAgLCBCSU5PUCAgfSwKKwl7IC8qICItZWYiKi8gRklMRVEgICAsIEJJTk9QICB9LAorCXsgLyogIiEiICAqLyBVTk9UICAgICwgQlVOT1AgIH0sCisJeyAvKiAiLWEiICovIEJBTkQgICAgLCBCQklOT1AgfSwKKwl7IC8qICItbyIgKi8gQk9SICAgICAsIEJCSU5PUCB9LAorCXsgLyogIigiICAqLyBMUEFSRU4gICwgUEFSRU4gIH0sCisJeyAvKiAiKSIgICovIFJQQVJFTiAgLCBQQVJFTiAgfSwKK307CisvKiBQbGVhc2Uga2VlcCB0aGVzZSB0d28gdGFibGVzIGluIHN5bmMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG9wc190ZXh0c1tdIEFMSUdOMSA9CisJIi1yIiAgIlwwIgorCSItdyIgICJcMCIKKwkiLXgiICAiXDAiCisJIi1lIiAgIlwwIgorCSItZiIgICJcMCIKKwkiLWQiICAiXDAiCisJIi1jIiAgIlwwIgorCSItYiIgICJcMCIKKwkiLXAiICAiXDAiCisJIi11IiAgIlwwIgorCSItZyIgICJcMCIKKwkiLWsiICAiXDAiCisJIi1zIiAgIlwwIgorCSItdCIgICJcMCIKKwkiLXoiICAiXDAiCisJIi1uIiAgIlwwIgorCSItaCIgICJcMCIKKworCSItTyIgICJcMCIKKwkiLUciICAiXDAiCisJIi1MIiAgIlwwIgorCSItUyIgICJcMCIKKwkiPSIgICAiXDAiCisJIj09IiAgIlwwIgorCSIhPSIgICJcMCIKKwkiPCIgICAiXDAiCisJIj4iICAgIlwwIgorCSItZXEiICJcMCIKKwkiLW5lIiAiXDAiCisJIi1nZSIgIlwwIgorCSItZ3QiICJcMCIKKwkiLWxlIiAiXDAiCisJIi1sdCIgIlwwIgorCSItbnQiICJcMCIKKwkiLW90IiAiXDAiCisJIi1lZiIgIlwwIgorCSIhIiAgICJcMCIKKwkiLWEiICAiXDAiCisJIi1vIiAgIlwwIgorCSIoIiAgICJcMCIKKwkiKSIgICAiXDAiCis7CisKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFU1RfNjQKK3R5cGVkZWYgaW50NjRfdCBudW1iZXJfdDsKKyNlbHNlCit0eXBlZGVmIGludCBudW1iZXJfdDsKKyNlbmRpZgorCisKKy8qIFdlIHRyeSB0byBtaW5pbWl6ZSBib3RoIHN0YXRpYyBhbmQgc3RhY2sgdXNhZ2UuICovCitzdHJ1Y3QgdGVzdF9zdGF0aWNzIHsKKwljaGFyICoqYXJnczsKKwkvKiBzZXQgb25seSBieSBjaGVja19vcGVyYXRvcigpLCBlaXRoZXIgdG8gYm9ndXMgc3RydWN0CisJICogb3IgcG9pbnRzIHRvIG1hdGNoaW5nIG9wZXJhdG9yX3Qgc3RydWN0LiBOZXZlciBOVUxMLiAqLworCWNvbnN0IHN0cnVjdCBvcGVyYXRvcl90ICpsYXN0X29wZXJhdG9yOworCWdpZF90ICpncm91cF9hcnJheTsKKwlpbnQgbmdyb3VwczsKKwlqbXBfYnVmIGxlYXZpbmc7Cit9OworCisvKiBTZWUgdGVzdF9wdHJfaGFjay5jICovCitleHRlcm4gc3RydWN0IHRlc3Rfc3RhdGljcyAqY29uc3QgdGVzdF9wdHJfdG9fc3RhdGljczsKKworI2RlZmluZSBTICgqdGVzdF9wdHJfdG9fc3RhdGljcykKKyNkZWZpbmUgYXJncyAgICAgICAgICAgIChTLmFyZ3MgICAgICAgICApCisjZGVmaW5lIGxhc3Rfb3BlcmF0b3IgICAoUy5sYXN0X29wZXJhdG9yKQorI2RlZmluZSBncm91cF9hcnJheSAgICAgKFMuZ3JvdXBfYXJyYXkgICkKKyNkZWZpbmUgbmdyb3VwcyAgICAgICAgIChTLm5ncm91cHMgICAgICApCisjZGVmaW5lIGxlYXZpbmcgICAgICAgICAoUy5sZWF2aW5nICAgICAgKQorCisjZGVmaW5lIElOSVRfUygpIGRvIHsgXAorCSgqKHN0cnVjdCB0ZXN0X3N0YXRpY3MqKikmdGVzdF9wdHJfdG9fc3RhdGljcykgPSB4emFsbG9jKHNpemVvZihTKSk7IFwKKwliYXJyaWVyKCk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIERFSU5JVF9TKCkgZG8geyBcCisJZnJlZSh0ZXN0X3B0cl90b19zdGF0aWNzKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIG51bWJlcl90IHByaW1hcnkoZW51bSB0b2tlbiBuKTsKKworc3RhdGljIHZvaWQgc3ludGF4KGNvbnN0IGNoYXIgKm9wLCBjb25zdCBjaGFyICptc2cpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgc3ludGF4KGNvbnN0IGNoYXIgKm9wLCBjb25zdCBjaGFyICptc2cpCit7CisJaWYgKG9wICYmICpvcCkgeworCQliYl9lcnJvcl9tc2coIiVzOiAlcyIsIG9wLCBtc2cpOworCX0gZWxzZSB7CisJCWJiX2Vycm9yX21zZygiJXM6ICVzIis0LCBtc2cpOworCX0KKwlsb25nam1wKGxlYXZpbmcsIDIpOworfQorCisvKiBhdG9pIHdpdGggZXJyb3IgZGV0ZWN0aW9uICovCisvL1hYWDogRklYTUU6IGR1cGxpY2F0ZSBvZiBleGlzdGluZyBsaWJiYiBmdW5jdGlvbj8KK3N0YXRpYyBudW1iZXJfdCBnZXRuKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqcDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URVNUXzY0CisJbG9uZyBsb25nIHI7CisjZWxzZQorCWxvbmcgcjsKKyNlbmRpZgorCisJZXJybm8gPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX1RFU1RfNjQKKwlyID0gc3RydG9sbChzLCAmcCwgMTApOworI2Vsc2UKKwlyID0gc3RydG9sKHMsICZwLCAxMCk7CisjZW5kaWYKKworCWlmIChlcnJubyAhPSAwKQorCQlzeW50YXgocywgIm91dCBvZiByYW5nZSIpOworCisJaWYgKHAgPT0gcyB8fCAqKHNraXBfd2hpdGVzcGFjZShwKSkgIT0gJ1wwJykKKwkJc3ludGF4KHMsICJiYWQgbnVtYmVyIik7CisKKwlyZXR1cm4gcjsKK30KKworLyogVU5VU0VECitzdGF0aWMgaW50IG5ld2VyZihjb25zdCBjaGFyICpmMSwgY29uc3QgY2hhciAqZjIpCit7CisJc3RydWN0IHN0YXQgYjEsIGIyOworCisJcmV0dXJuIChzdGF0KGYxLCAmYjEpID09IDAgJiYKKwkJCXN0YXQoZjIsICZiMikgPT0gMCAmJiBiMS5zdF9tdGltZSA+IGIyLnN0X210aW1lKTsKK30KKworc3RhdGljIGludCBvbGRlcmYoY29uc3QgY2hhciAqZjEsIGNvbnN0IGNoYXIgKmYyKQoreworCXN0cnVjdCBzdGF0IGIxLCBiMjsKKworCXJldHVybiAoc3RhdChmMSwgJmIxKSA9PSAwICYmCisJCQlzdGF0KGYyLCAmYjIpID09IDAgJiYgYjEuc3RfbXRpbWUgPCBiMi5zdF9tdGltZSk7Cit9CisKK3N0YXRpYyBpbnQgZXF1YWxmKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpmMikKK3sKKwlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisKKwlyZXR1cm4gKHN0YXQoZjEsICZiMSkgPT0gMCAmJgorCQkJc3RhdChmMiwgJmIyKSA9PSAwICYmCisJCQliMS5zdF9kZXYgPT0gYjIuc3RfZGV2ICYmIGIxLnN0X2lubyA9PSBiMi5zdF9pbm8pOworfQorKi8KKworCitzdGF0aWMgZW51bSB0b2tlbiBjaGVja19vcGVyYXRvcihjb25zdCBjaGFyICpzKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BlcmF0b3JfdCBub19vcCA9IHsKKwkJLm9wX251bSA9IC0xLAorCQkub3BfdHlwZSA9IC0xCisJfTsKKwlpbnQgbjsKKworCWxhc3Rfb3BlcmF0b3IgPSAmbm9fb3A7CisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuIEVPSTsKKwluID0gaW5kZXhfaW5fc3RyaW5ncyhvcHNfdGV4dHMsIHMpOworCWlmIChuIDwgMCkKKwkJcmV0dXJuIE9QRVJBTkQ7CisJbGFzdF9vcGVyYXRvciA9ICZvcHNfdGFibGVbbl07CisJcmV0dXJuIG9wc190YWJsZVtuXS5vcF9udW07Cit9CisKKworc3RhdGljIGludCBiaW5vcCh2b2lkKQoreworCWNvbnN0IGNoYXIgKm9wbmQxLCAqb3BuZDI7CisJY29uc3Qgc3RydWN0IG9wZXJhdG9yX3QgKm9wOworCW51bWJlcl90IHZhbDEsIHZhbDI7CisKKwlvcG5kMSA9ICphcmdzOworCWNoZWNrX29wZXJhdG9yKCorK2FyZ3MpOworCW9wID0gbGFzdF9vcGVyYXRvcjsKKworCW9wbmQyID0gKisrYXJnczsKKwlpZiAob3BuZDIgPT0gTlVMTCkKKwkJc3ludGF4KGFyZ3NbLTFdLCAiYXJndW1lbnQgZXhwZWN0ZWQiKTsKKworCWlmIChpc19pbnRfb3Aob3AtPm9wX251bSkpIHsKKwkJdmFsMSA9IGdldG4ob3BuZDEpOworCQl2YWwyID0gZ2V0bihvcG5kMik7CisJCWlmIChvcC0+b3BfbnVtID09IElOVEVRKQorCQkJcmV0dXJuIHZhbDEgPT0gdmFsMjsKKwkJaWYgKG9wLT5vcF9udW0gPT0gSU5UTkUpCisJCQlyZXR1cm4gdmFsMSAhPSB2YWwyOworCQlpZiAob3AtPm9wX251bSA9PSBJTlRHRSkKKwkJCXJldHVybiB2YWwxID49IHZhbDI7CisJCWlmIChvcC0+b3BfbnVtID09IElOVEdUKQorCQkJcmV0dXJuIHZhbDEgPiAgdmFsMjsKKwkJaWYgKG9wLT5vcF9udW0gPT0gSU5UTEUpCisJCQlyZXR1cm4gdmFsMSA8PSB2YWwyOworCQkvKmlmIChvcC0+b3BfbnVtID09IElOVExUKSovCisJCXJldHVybiB2YWwxIDwgIHZhbDI7CisJfQorCWlmIChpc19zdHJfb3Aob3AtPm9wX251bSkpIHsKKwkJdmFsMSA9IHN0cmNtcChvcG5kMSwgb3BuZDIpOworCQlpZiAob3AtPm9wX251bSA9PSBTVFJFUSkKKwkJCXJldHVybiB2YWwxID09IDA7CisJCWlmIChvcC0+b3BfbnVtID09IFNUUk5FKQorCQkJcmV0dXJuIHZhbDEgIT0gMDsKKwkJaWYgKG9wLT5vcF9udW0gPT0gU1RSTFQpCisJCQlyZXR1cm4gdmFsMSA8IDA7CisJCS8qaWYgKG9wLT5vcF9udW0gPT0gU1RSR1QpKi8KKwkJcmV0dXJuIHZhbDEgPiAwOworCX0KKwkvKiBXZSBhcmUgc3VyZSB0aGF0IHRoZXNlIHRocmVlIGFyZSBieSBub3cgdGhlIG9ubHkgYmlub3BzIHdlIGRpZG4ndCBjaGVjaworCSAqIHlldCwgc28gd2UgZG8gbm90IGNoZWNrIGlmIHRoZSBjbGFzcyBpcyBjb3JyZWN0OgorCSAqLworLyoJaWYgKGlzX2ZpbGVfb3Aob3AtPm9wX251bSkpICovCisJeworCQlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisKKwkJaWYgKHN0YXQob3BuZDEsICZiMSkgfHwgc3RhdChvcG5kMiwgJmIyKSkKKwkJCXJldHVybiAwOyAvKiBmYWxzZSwgc2luY2UgYXQgbGVhc3Qgb25lIHN0YXQgZmFpbGVkICovCisJCWlmIChvcC0+b3BfbnVtID09IEZJTE5UKQorCQkJcmV0dXJuIGIxLnN0X210aW1lID4gYjIuc3RfbXRpbWU7CisJCWlmIChvcC0+b3BfbnVtID09IEZJTE9UKQorCQkJcmV0dXJuIGIxLnN0X210aW1lIDwgYjIuc3RfbXRpbWU7CisJCS8qaWYgKG9wLT5vcF9udW0gPT0gRklMRVEpKi8KKwkJcmV0dXJuIGIxLnN0X2RldiA9PSBiMi5zdF9kZXYgJiYgYjEuc3RfaW5vID09IGIyLnN0X2lubzsKKwl9CisJLypyZXR1cm4gMTsgLSBOT1RSRUFDSEVEICovCit9CisKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9ncm91cF9hcnJheSh2b2lkKQoreworCWludCBuOworCisJLyogZ2V0Z3JvdXBzIG1heSBiZSBleHBlbnNpdmUsIHRyeSB0byB1c2UgaXQgb25seSBvbmNlICovCisJbmdyb3VwcyA9IDMyOworCWRvIHsKKwkJLyogRklYTUU6IGFzaCB0cmllcyBzbyBoYXJkIHRvIG5vdCBkaWUgb24gT09NLAorCQkgKiBhbmQgd2Ugc3BvaWwgaXQgd2l0aCBqdXN0IG9uZSB4cmVhbGxvYyBoZXJlICovCisJCS8qIFdlIHJlYWxsb2MsIGJlY2F1c2UgdGVzdF9tYWluIGNhbiBiZSBlbnRlcmVkIHJlcGVhdGVkbHkgYnkgc2hlbGwuCisJCSAqIFRlc3RjYXNlIChhc2gpOiAnd2hpbGUgdHJ1ZTsgZG8gdGVzdCAteCBzb21lX2ZpbGU7IGRvbmUnCisJCSAqIGFuZCB3YXRjaCB0b3AuIChzb21lX2ZpbGUgbXVzdCBoYXZlIG93bmVyICE9IHlvdSkgKi8KKwkJbiA9IG5ncm91cHM7CisJCWdyb3VwX2FycmF5ID0geHJlYWxsb2MoZ3JvdXBfYXJyYXksIG4gKiBzaXplb2YoZ2lkX3QpKTsKKwkJbmdyb3VwcyA9IGdldGdyb3VwcyhuLCBncm91cF9hcnJheSk7CisJfSB3aGlsZSAobmdyb3VwcyA+IG4pOworfQorCisKKy8qIFJldHVybiBub24temVybyBpZiBHSUQgaXMgb25lIHRoYXQgd2UgaGF2ZSBpbiBvdXIgZ3JvdXBzIGxpc3QuICovCisvL1hYWDogRklYTUU6IGR1cGxpY2F0ZSBvZiBleGlzdGluZyBsaWJiYiBmdW5jdGlvbj8KKy8vIHNlZSB0b3BsZXZlbCBUT0RPIGZpbGU6CisvLyBwb3NzaWJsZSBjb2RlIGR1cGxpY2F0aW9uIGluZ3JvdXAoKSBhbmQgaXNfYV9ncm91cF9tZW1iZXIoKQorc3RhdGljIGludCBpc19hX2dyb3VwX21lbWJlcihnaWRfdCBnaWQpCit7CisJaW50IGk7CisKKwkvKiBTaG9ydC1jaXJjdWl0IGlmIHBvc3NpYmxlLCBtYXliZSBzYXZpbmcgYSBjYWxsIHRvIGdldGdyb3VwcygpLiAqLworCWlmIChnaWQgPT0gZ2V0Z2lkKCkgfHwgZ2lkID09IGdldGVnaWQoKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAobmdyb3VwcyA9PSAwKQorCQlpbml0aWFsaXplX2dyb3VwX2FycmF5KCk7CisKKwkvKiBTZWFyY2ggdGhyb3VnaCB0aGUgbGlzdCBsb29raW5nIGZvciBHSUQuICovCisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykKKwkJaWYgKGdpZCA9PSBncm91cF9hcnJheVtpXSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKworLyogRG8gdGhlIHNhbWUgdGhpbmcgYWNjZXNzKDIpIGRvZXMsIGJ1dCB1c2UgdGhlIGVmZmVjdGl2ZSB1aWQgYW5kIGdpZCwKKyAgIGFuZCBkb24ndCBtYWtlIHRoZSBtaXN0YWtlIG9mIHRlbGxpbmcgcm9vdCB0aGF0IGFueSBmaWxlIGlzCisgICBleGVjdXRhYmxlLiAqLworc3RhdGljIGludCB0ZXN0X2VhY2Nlc3MoY2hhciAqcGF0aCwgaW50IG1vZGUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgaW50IGV1aWQgPSBnZXRldWlkKCk7CisKKwlpZiAoc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGV1aWQgPT0gMCkgeworCQkvKiBSb290IGNhbiByZWFkIG9yIHdyaXRlIGFueSBmaWxlLiAqLworCQlpZiAobW9kZSAhPSBYX09LKQorCQkJcmV0dXJuIDA7CisKKwkJLyogUm9vdCBjYW4gZXhlY3V0ZSBhbnkgZmlsZSB0aGF0IGhhcyBhbnkgb25lIG9mIHRoZSBleGVjdXRlCisJCSAgIGJpdHMgc2V0LiAqLworCQlpZiAoc3Quc3RfbW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0LnN0X3VpZCA9PSBldWlkKSAgLyogb3duZXIgKi8KKwkJbW9kZSA8PD0gNjsKKwllbHNlIGlmIChpc19hX2dyb3VwX21lbWJlcihzdC5zdF9naWQpKQorCQltb2RlIDw8PSAzOworCisJaWYgKHN0LnN0X21vZGUgJiBtb2RlKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IGZpbHN0YXQoY2hhciAqbm0sIGVudW0gdG9rZW4gbW9kZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXVuc2lnbmVkIGkgPSBpOyAvKiBnY2MgMy54IHRoaW5rcyBpdCBjYW4gYmUgdXNlZCB1bmluaXRpYWxpemVkICovCisKKwlpZiAobW9kZSA9PSBGSUxTWU0pIHsKKyNpZmRlZiBTX0lGTE5LCisJCWlmIChsc3RhdChubSwgJnMpID09IDApIHsKKwkJCWkgPSBTX0lGTE5LOworCQkJZ290byBmaWxldHlwZTsKKwkJfQorI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCWlmIChzdGF0KG5tLCAmcykgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG1vZGUgPT0gRklMRVhJU1QpCisJCXJldHVybiAxOworCWlmIChpc19maWxlX2FjY2Vzcyhtb2RlKSkgeworCQlpZiAobW9kZSA9PSBGSUxSRCkKKwkJCWkgPSBSX09LOworCQlpZiAobW9kZSA9PSBGSUxXUikKKwkJCWkgPSBXX09LOworCQlpZiAobW9kZSA9PSBGSUxFWCkKKwkJCWkgPSBYX09LOworCQlyZXR1cm4gdGVzdF9lYWNjZXNzKG5tLCBpKSA9PSAwOworCX0KKwlpZiAoaXNfZmlsZV90eXBlKG1vZGUpKSB7CisJCWlmIChtb2RlID09IEZJTFJFRykKKwkJCWkgPSBTX0lGUkVHOworCQlpZiAobW9kZSA9PSBGSUxESVIpCisJCQlpID0gU19JRkRJUjsKKwkJaWYgKG1vZGUgPT0gRklMQ0RFVikKKwkJCWkgPSBTX0lGQ0hSOworCQlpZiAobW9kZSA9PSBGSUxCREVWKQorCQkJaSA9IFNfSUZCTEs7CisJCWlmIChtb2RlID09IEZJTEZJRk8pIHsKKyNpZmRlZiBTX0lGSUZPCisJCQlpID0gU19JRklGTzsKKyNlbHNlCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQl9CisJCWlmIChtb2RlID09IEZJTFNPQ0spIHsKKyNpZmRlZiBTX0lGU09DSworCQkJaSA9IFNfSUZTT0NLOworI2Vsc2UKKwkJCXJldHVybiAwOworI2VuZGlmCisJCX0KKyBmaWxldHlwZToKKwkJcmV0dXJuICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBpKTsKKwl9CisJaWYgKGlzX2ZpbGVfYml0KG1vZGUpKSB7CisJCWlmIChtb2RlID09IEZJTFNVSUQpCisJCQlpID0gU19JU1VJRDsKKwkJaWYgKG1vZGUgPT0gRklMU0dJRCkKKwkJCWkgPSBTX0lTR0lEOworCQlpZiAobW9kZSA9PSBGSUxTVENLKQorCQkJaSA9IFNfSVNWVFg7CisJCXJldHVybiAoKHMuc3RfbW9kZSAmIGkpICE9IDApOworCX0KKwlpZiAobW9kZSA9PSBGSUxHWikKKwkJcmV0dXJuIHMuc3Rfc2l6ZSA+IDBMOworCWlmIChtb2RlID09IEZJTFVJRCkKKwkJcmV0dXJuIHMuc3RfdWlkID09IGdldGV1aWQoKTsKKwlpZiAobW9kZSA9PSBGSUxHSUQpCisJCXJldHVybiBzLnN0X2dpZCA9PSBnZXRlZ2lkKCk7CisJcmV0dXJuIDE7IC8qIE5PVFJFQUNIRUQgKi8KK30KKworCitzdGF0aWMgbnVtYmVyX3QgbmV4cHIoZW51bSB0b2tlbiBuKQoreworCW51bWJlcl90IHJlczsKKworCW5lc3RfbXNnKCI+bmV4cHIoJXMpXG4iLCBUT0tTVFJbbl0pOworCWlmIChuID09IFVOT1QpIHsKKwkJbiA9IGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpOworCQlpZiAobiA9PSBFT0kpIHsKKwkJCS8qIHNwZWNpYWwgY2FzZTogWyAhIF0sIFsgYSAtYSAhIF0gYXJlIHZhbGlkICovCisJCQkvKiBJT1csICIhIEFSRyIgbWF5IG1pc3MgQVJHICovCisJCQl1bm5lc3RfbXNnKCI8bmV4cHI6MSAoIUVPSSlcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmVzID0gIW5leHByKG4pOworCQl1bm5lc3RfbXNnKCI8bmV4cHI6JWxsZFxuIiwgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJcmVzID0gcHJpbWFyeShuKTsKKwl1bm5lc3RfbXNnKCI8bmV4cHI6JWxsZFxuIiwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBudW1iZXJfdCBhZXhwcihlbnVtIHRva2VuIG4pCit7CisJbnVtYmVyX3QgcmVzOworCisJbmVzdF9tc2coIj5hZXhwciglcylcbiIsIFRPS1NUUltuXSk7CisJcmVzID0gbmV4cHIobik7CisJZGJnX21zZygiYWV4cHI6IG5leHByOiVsbGQsIG5leHQgYXJnczolc1xuIiwgcmVzLCBhcmdzWzFdKTsKKwlpZiAoY2hlY2tfb3BlcmF0b3IoKisrYXJncykgPT0gQkFORCkgeworCQlkYmdfbXNnKCJhZXhwcjogYXJnIGlzIEFORCwgbmV4dCBhcmdzOiVzXG4iLCBhcmdzWzFdKTsKKwkJcmVzID0gYWV4cHIoY2hlY2tfb3BlcmF0b3IoKisrYXJncykpICYmIHJlczsKKwkJdW5uZXN0X21zZygiPGFleHByOiVsbGRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCWFyZ3MtLTsKKwl1bm5lc3RfbXNnKCI8YWV4cHI6JWxsZCwgYXJnczolc1xuIiwgcmVzLCBhcmdzWzBdKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBudW1iZXJfdCBvZXhwcihlbnVtIHRva2VuIG4pCit7CisJbnVtYmVyX3QgcmVzOworCisJbmVzdF9tc2coIj5vZXhwciglcylcbiIsIFRPS1NUUltuXSk7CisJcmVzID0gYWV4cHIobik7CisJZGJnX21zZygib2V4cHI6IGFleHByOiVsbGQsIG5leHQgYXJnczolc1xuIiwgcmVzLCBhcmdzWzFdKTsKKwlpZiAoY2hlY2tfb3BlcmF0b3IoKisrYXJncykgPT0gQk9SKSB7CisJCWRiZ19tc2coIm9leHByOiBuZXh0IGFyZyBpcyBPUiwgbmV4dCBhcmdzOiVzXG4iLCBhcmdzWzFdKTsKKwkJcmVzID0gb2V4cHIoY2hlY2tfb3BlcmF0b3IoKisrYXJncykpIHx8IHJlczsKKwkJdW5uZXN0X21zZygiPG9leHByOiVsbGRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCWFyZ3MtLTsKKwl1bm5lc3RfbXNnKCI8b2V4cHI6JWxsZCwgYXJnczolc1xuIiwgcmVzLCBhcmdzWzBdKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBudW1iZXJfdCBwcmltYXJ5KGVudW0gdG9rZW4gbikKK3sKKyNpZiBURVNUX0RFQlVHCisJbnVtYmVyX3QgcmVzID0gcmVzOyAvKiBmb3IgY29tcGlsZXIgKi8KKyNlbHNlCisJbnVtYmVyX3QgcmVzOworI2VuZGlmCisJY29uc3Qgc3RydWN0IG9wZXJhdG9yX3QgKmFyZ3MwX29wOworCisJbmVzdF9tc2coIj5wcmltYXJ5KCVzKVxuIiwgVE9LU1RSW25dKTsKKwlpZiAobiA9PSBFT0kpIHsKKwkJc3ludGF4KE5VTEwsICJhcmd1bWVudCBleHBlY3RlZCIpOworCX0KKwlpZiAobiA9PSBMUEFSRU4pIHsKKwkJcmVzID0gb2V4cHIoY2hlY2tfb3BlcmF0b3IoKisrYXJncykpOworCQlpZiAoY2hlY2tfb3BlcmF0b3IoKisrYXJncykgIT0gUlBBUkVOKQorCQkJc3ludGF4KE5VTEwsICJjbG9zaW5nIHBhcmVuIGV4cGVjdGVkIik7CisJCXVubmVzdF9tc2coIjxwcmltYXJ5OiVsbGRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCisJLyogY29yZXV0aWxzIDYuOSBjaGVja3MgImlzIGFyZ3NbMV0gYmlub3AgYW5kIGFyZ3NbMl0gZXhpc3Q/IiBmaXJzdCwKKwkgKiBkbyB0aGUgc2FtZSAqLworCWFyZ3MwX29wID0gbGFzdF9vcGVyYXRvcjsKKwkvKiBsYXN0X29wZXJhdG9yID0gb3BlcmF0b3IgYXQgYXJnc1sxXSAqLworCWlmIChjaGVja19vcGVyYXRvcihhcmdzWzFdKSAhPSBFT0kpIHsgLyogaWYgYXJnc1sxXSAhPSBOVUxMICovCisJCWlmIChhcmdzWzJdKSB7CisJCQkvLyBjb3JldXRpbHMgYWxzbyBkb2VzIHRoaXM6CisJCQkvLyBpZiAoYXJnc1szXSAmJiBhcmdzWzBdPSItbCIgJiYgYXJnc1syXSBpcyBCSU5PUCkKKwkJCS8vCXJldHVybiBiaW5vcCgxIC8qIHByZXBlbmRlZCBieSAtbCAqLyk7CisJCQlpZiAobGFzdF9vcGVyYXRvci0+b3BfdHlwZSA9PSBCSU5PUCkKKwkJCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYmlub3AoKSwgIjxwcmltYXJ5OiBiaW5vcDolbGxkXG4iKTsKKwkJfQorCX0KKwkvKiBjaGVjayAiaXMgYXJnc1swXSB1bm9wPyIgc2Vjb25kICovCisJaWYgKGFyZ3MwX29wLT5vcF90eXBlID09IFVOT1ApIHsKKwkJLyogdW5hcnkgZXhwcmVzc2lvbiAqLworCQlpZiAoYXJnc1sxXSA9PSBOVUxMKQorLy8JCQlzeW50YXgoYXJnczBfb3AtPm9wX3RleHQsICJhcmd1bWVudCBleHBlY3RlZCIpOworCQkJZ290byBjaGVja19lbXB0aW5lc3M7CisJCWFyZ3MrKzsKKwkJaWYgKG4gPT0gU1RSRVopCisJCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYXJnc1swXVswXSA9PSAnXDAnLCAiPHByaW1hcnk6JWxsZFxuIik7CisJCWlmIChuID09IFNUUk5aKQorCQkJdW5uZXN0X21zZ19hbmRfcmV0dXJuKGFyZ3NbMF1bMF0gIT0gJ1wwJywgIjxwcmltYXJ5OiVsbGRcbiIpOworCQlpZiAobiA9PSBGSUxUVCkKKwkJCXVubmVzdF9tc2dfYW5kX3JldHVybihpc2F0dHkoZ2V0bigqYXJncykpLCAiPHByaW1hcnk6IGlzYXR0eSglcyklbGxkXG4iLCAqYXJncyk7CisJCXVubmVzdF9tc2dfYW5kX3JldHVybihmaWxzdGF0KCphcmdzLCBuKSwgIjxwcmltYXJ5OiBmaWxzdGF0KCVzKTolbGxkXG4iLCAqYXJncyk7CisJfQorCisJLypjaGVja19vcGVyYXRvcihhcmdzWzFdKTsgLSBhbHJlYWR5IGRvbmUgKi8KKwlpZiAobGFzdF9vcGVyYXRvci0+b3BfdHlwZSA9PSBCSU5PUCkgeworCQkvKiBhcmdzWzJdIGlzIGtub3duIHRvIGJlIE5VTEwsIGlzbid0IGl0IGJvdW5kIHRvIGZhaWw/ICovCisJCXVubmVzdF9tc2dfYW5kX3JldHVybihiaW5vcCgpLCAiPHByaW1hcnk6JWxsZFxuIik7CisJfQorIGNoZWNrX2VtcHRpbmVzczoKKwl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYXJnc1swXVswXSAhPSAnXDAnLCAiPHByaW1hcnk6JWxsZFxuIik7Cit9CisKKworaW50IHRlc3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJlczsKKwljb25zdCBjaGFyICphcmcwOworLy8JYm9vbCBuZWdhdGUgPSAwOworCisJYXJnMCA9IGJiX2Jhc2VuYW1lKGFyZ3ZbMF0pOworCWlmIChhcmcwWzBdID09ICdbJykgeworCQktLWFyZ2M7CisJCWlmICghYXJnMFsxXSkgeyAvKiAiWyIgPyAqLworCQkJaWYgKE5PVF9MT05FX0NIQVIoYXJndlthcmdjXSwgJ10nKSkgeworCQkJCWJiX2Vycm9yX21zZygibWlzc2luZyBdIik7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCX0gZWxzZSB7IC8qIGFzc3VtaW5nICJbWyIgKi8KKwkJCWlmIChzdHJjbXAoYXJndlthcmdjXSwgIl1dIikgIT0gMCkgeworCQkJCWJiX2Vycm9yX21zZygibWlzc2luZyBdXSIpOworCQkJCXJldHVybiAyOworCQkJfQorCQl9CisJCWFyZ3ZbYXJnY10gPSBOVUxMOworCX0KKworCS8qIFdlIG11c3QgZG8gREVJTklUX1MoKSBwcmlvciB0byByZXR1cm5pbmcgKi8KKwlJTklUX1MoKTsKKworCXJlcyA9IHNldGptcChsZWF2aW5nKTsKKwlpZiAocmVzKQorCQlnb3RvIHJldDsKKworCS8qIHJlc2V0dGluZyBuZ3JvdXBzIGlzIHByb2JhYmx5IHVubmVjZXNzYXJ5LiAgaXQgd2lsbAorCSAqIGZvcmNlIGEgbmV3IGNhbGwgdG8gZ2V0Z3JvdXBzKCksIHdoaWNoIHByZXZlbnRzIHVzaW5nCisJICogZ3JvdXAgZGF0YSBmZXRjaGVkIGR1cmluZyBhIHByZXZpb3VzIGNhbGwuICBidXQgdGhlCisJICogb25seSB3YXkgdGhlIGdyb3VwIGRhdGEgY291bGQgYmUgc3RhbGUgaXMgaWYgdGhlcmUncworCSAqIGJlZW4gYW4gaW50ZXJ2ZW5pbmcgY2FsbCB0byBzZXRncm91cHMoKSwgYW5kIHRoaXMKKwkgKiBpc24ndCBsaWtlbHkgaW4gdGhlIGNhc2Ugb2YgYSBzaGVsbC4gIHBhcmFub2lhCisJICogcHJldmFpbHMuLi4KKwkgKi8KKwkvKm5ncm91cHMgPSAwOyAtIGRvbmUgYnkgSU5JVF9TKCkgKi8KKworCS8vYXJnYy0tOworCWFyZ3YrKzsKKworCS8qIEltcGxlbWVudCBzcGVjaWFsIGNhc2VzIGZyb20gUE9TSVguMiwgc2VjdGlvbiA0LjYyLjQgKi8KKwlpZiAoIWFyZ3ZbMF0pIHsgLyogInRlc3QiICovCisJCXJlcyA9IDE7CisJCWdvdG8gcmV0OworCX0KKyNpZiAwCisvLyBOb3cgaXQncyBmaXhlZCBpbiB0aGUgcGFyc2VyIGFuZCBzaG91bGQgbm90IGJlIG5lZWRlZAorCWlmIChMT05FX0NIQVIoYXJndlswXSwgJyEnKSAmJiBhcmd2WzFdKSB7CisJCW5lZ2F0ZSA9IDE7CisJCS8vYXJnYy0tOworCQlhcmd2Kys7CisJfQorCWlmICghYXJndlsxXSkgeyAvKiAidGVzdCBbIV0gYXJnIiAqLworCQlyZXMgPSAoKmFyZ3ZbMF0gPT0gJ1wwJyk7CisJCWdvdG8gcmV0OworCX0KKwlpZiAoYXJndlsyXSAmJiAhYXJndlszXSkgeworCQljaGVja19vcGVyYXRvcihhcmd2WzFdKTsKKwkJaWYgKGxhc3Rfb3BlcmF0b3ItPm9wX3R5cGUgPT0gQklOT1ApIHsKKwkJCS8qICJ0ZXN0IFshXSBhcmcxIDxiaW5hcnlfb3A+IGFyZzIiICovCisJCQlhcmdzID0gYXJndjsKKwkJCXJlcyA9IChiaW5vcCgpID09IDApOworCQkJZ290byByZXQ7CisJCX0KKwl9CisKKwkvKiBTb21lIGNvbXBsZXggZXhwcmVzc2lvbi4gVW5kbyAnIScgcmVtb3ZhbCAqLworCWlmIChuZWdhdGUpIHsKKwkJbmVnYXRlID0gMDsKKwkJLy9hcmdjKys7CisJCWFyZ3YtLTsKKwl9CisjZW5kaWYKKwlhcmdzID0gYXJndjsKKwlyZXMgPSAhb2V4cHIoY2hlY2tfb3BlcmF0b3IoKmFyZ3MpKTsKKworCWlmICgqYXJncyAhPSBOVUxMICYmICorK2FyZ3MgIT0gTlVMTCkgeworCQkvKiBFeGFtcGxlczoKKwkJICogdGVzdCAzIC1sdCA1IDYKKwkJICogdGVzdCAtdCAxIDIKKwkJICovCisJCWJiX2Vycm9yX21zZygiJXM6IHVua25vd24gb3BlcmFuZCIsICphcmdzKTsKKwkJcmVzID0gMjsKKwl9CisgcmV0OgorCURFSU5JVF9TKCk7CisvLwlyZXR1cm4gbmVnYXRlID8gIXJlcyA6IHJlczsKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3Rlc3RfcHRyX2hhY2suYyBiL2NvcmV1dGlscy90ZXN0X3B0cl9oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhOWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy90ZXN0X3B0cl9oYWNrLmMKQEAgLTAsMCArMSwyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitzdHJ1Y3QgdGVzdF9zdGF0aWNzOworCisjaWZuZGVmIEdDQ19DT01CSU5FCisKKy8qIFdlIGNoZWF0IGhlcmUuIEl0IGlzIGRlY2xhcmVkIGFzIGNvbnN0IHB0ciBpbiBsaWJiYi5oLAorICogYnV0IGhlcmUgd2UgbWFrZSBpdCBsaXZlIGluIFIvVyBtZW1vcnkgKi8KK3N0cnVjdCB0ZXN0X3N0YXRpY3MgKnRlc3RfcHRyX3RvX3N0YXRpY3M7CisKKyNlbHNlCisKKy8qIGdjYyAtY29tYmluZSB3aWxsIHNlZSB0aHJvdWdoIGFuZCBjb21wbGFpbiAqLworLyogVXNpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kIHdoaWNoIGlzIG1vcmUgbGlrZWx5IHRvIGJyZWFrCisgKiBvbiB3ZWlyZCBhcmNoaXRlY3R1cmVzLCBjb21waWxlcnMsIGxpbmtlcnMgYW5kIHNvIG9uICovCitzdHJ1Y3QgdGVzdF9zdGF0aWNzICpjb25zdCB0ZXN0X3B0cl90b19zdGF0aWNzIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90b3VjaC5jIGIvY29yZXV0aWxzL3RvdWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5ODBmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy90b3VjaC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRvdWNoIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgX05PVF8gY29tcGxpYW50IC0tIG9wdGlvbnMgLWEsIC1tLCAtciwgLXQgbm90IHN1cHBvcnRlZC4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdG91Y2guaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFByZXZpb3VzIHZlcnNpb24gY2FsbGVkIG9wZW4oKSBhbmQgdGhlbiB1dGltZSgpLiAgV2hpbGUgdGhpcyB3aWxsIGJlCisgKiBiZSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IC1yIGFuZCAtdCwgaXQgY3VycmVudGx5IG9ubHkgbWFrZXMgdGhpbmdzIGJpZ2dlci4KKyAqIEFsc28sIGV4aXRpbmcgb24gYSBmYWlsdXJlIHdhcyBhIGJ1Zy4gIEFsbCBhcmdzIHNob3VsZCBiZSBwcm9jZXNzZWQuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vY29uZmlnOmNvbmZpZyBUT1VDSAorLy9jb25maWc6CWJvb2wgInRvdWNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHRvdWNoIGlzIHVzZWQgdG8gY3JlYXRlIG9yIGNoYW5nZSB0aGUgYWNjZXNzIGFuZC9vcgorLy9jb25maWc6CSAgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBvZiBzcGVjaWZpZWQgZmlsZXMuCisKKy8vYXBwbGV0OklGX1RPVUNIKEFQUExFVF9OT0ZPUksodG91Y2gsIHRvdWNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHRvdWNoKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1RPVUNIKSArPSB0b3VjaC5vCisKKy8vdXNhZ2U6I2RlZmluZSB0b3VjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jXSIgSUZfREVTS1RPUCgiIFstZCBEQVRFXSBbLXIgRklMRV0iKSAiIEZJTEUgW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHRvdWNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVXBkYXRlIHRoZSBsYXN0LW1vZGlmaWVkIGRhdGUgb24gdGhlIGdpdmVuIEZJTEVbc11cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJRG9uJ3QgY3JlYXRlIGZpbGVzIgorLy91c2FnZToJSUZfREVTS1RPUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWQgRFQJRGF0ZS90aW1lIHRvIHVzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgRklMRQlVc2UgRklMRSdzIGRhdGUvdGltZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdG91Y2hfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIvYmluL2xzOiAvdG1wL2ZvbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVxuIgorLy91c2FnZTogICAgICAgIiQgdG91Y2ggL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAgICAgICAwIEFwciAxNSAwMToxMSAvdG1wL2Zvb1xuIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvKiBjb3JldXRpbHMgaW1wbGVtZW50czoKKyAqIC1hICAgY2hhbmdlIG9ubHkgdGhlIGFjY2VzcyB0aW1lCisgKiAtYywgLS1uby1jcmVhdGUKKyAqICAgICAgZG8gbm90IGNyZWF0ZSBhbnkgZmlsZXMKKyAqIC1kLCAtLWRhdGU9U1RSSU5HCisgKiAgICAgIHBhcnNlIFNUUklORyBhbmQgdXNlIGl0IGluc3RlYWQgb2YgY3VycmVudCB0aW1lCisgKiAtZiAgIChpZ25vcmVkLCBCU0QgY29tcGF0KQorICogLW0gICBjaGFuZ2Ugb25seSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKKyAqIC1yLCAtLXJlZmVyZW5jZT1GSUxFCisgKiAgICAgIHVzZSB0aGlzIGZpbGUncyB0aW1lcyBpbnN0ZWFkIG9mIGN1cnJlbnQgdGltZQorICogLXQgU1RBTVAKKyAqICAgICAgdXNlIFtbQ0NdWVldTU1ERGhobW1bLnNzXSBpbnN0ZWFkIG9mIGN1cnJlbnQgdGltZQorICogLS10aW1lPVdPUkQKKyAqICAgICAgY2hhbmdlIHRoZSBzcGVjaWZpZWQgdGltZTogV09SRCBpcyBhY2Nlc3MsIGF0aW1lLCBvciB1c2UKKyAqLworCitpbnQgdG91Y2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRvdWNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgb3B0czsKKyNpZiBFTkFCTEVfREVTS1RPUAorIyBpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgdG91Y2hfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkvKiBuYW1lLCBoYXNfYXJnLCB2YWwgKi8KKwkJIm5vLWNyZWF0ZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJjIgorCQkicmVmZXJlbmNlXDAiICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInIiCisJCSJkYXRlXDAiICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZCIKKwk7CisjIGVuZGlmCisJY2hhciAqcmVmZXJlbmNlX2ZpbGUgPSBOVUxMOworCWNoYXIgKmRhdGVfc3RyID0gTlVMTDsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lYnVmWzJdOworCXRpbWVidWZbMV0udHZfdXNlYyA9IHRpbWVidWZbMF0udHZfdXNlYyA9IDA7CisjZWxzZQorIyBkZWZpbmUgcmVmZXJlbmNlX2ZpbGUgTlVMTAorIyBkZWZpbmUgZGF0ZV9zdHIgICAgICAgTlVMTAorIyBkZWZpbmUgdGltZWJ1ZiAgICAgICAgKChzdHJ1Y3QgdGltZXZhbCopTlVMTCkKKyNlbmRpZgorCisjaWYgRU5BQkxFX0RFU0tUT1AgJiYgRU5BQkxFX0xPTkdfT1BUUworCWFwcGxldF9sb25nX29wdGlvbnMgPSB0b3VjaF9sb25nb3B0czsKKyNlbmRpZgorCS8qIC1kIGFuZCAtdCBib3RoIHNldCB0aW1lLiBJbiBjb3JldXRpbHMsCisJICogYWNjZXB0ZWQgZGF0YSBmb3JtYXQgZGlmZmVycyBhIGJpdCBiZXR3ZWVuIC1kIGFuZCAtdC4KKwkgKiBXZSBhY2NlcHQgdGhlIHNhbWUgZm9ybWF0cyBmb3IgYm90aCAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiYyIgSUZfREVTS1RPUCgicjpkOnQ6IikKKwkJCQkvKmlnbm9yZWQ6Ki8gImZtYSIKKwkJCQlJRl9ERVNLVE9QKCwgJnJlZmVyZW5jZV9maWxlKQorCQkJCUlGX0RFU0tUT1AoLCAmZGF0ZV9zdHIpCisJCQkJSUZfREVTS1RPUCgsICZkYXRlX3N0cikKKwkpOworCisJb3B0cyAmPSAxOyAvKiBvbmx5IC1jIGJpdCBpcyBsZWZ0ICovCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEqYXJndikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKHJlZmVyZW5jZV9maWxlKSB7CisJCXN0cnVjdCBzdGF0IHN0YnVmOworCQl4c3RhdChyZWZlcmVuY2VfZmlsZSwgJnN0YnVmKTsKKwkJdGltZWJ1ZlsxXS50dl9zZWMgPSB0aW1lYnVmWzBdLnR2X3NlYyA9IHN0YnVmLnN0X210aW1lOworCX0KKworCWlmIChkYXRlX3N0cikgeworCQlzdHJ1Y3QgdG0gdG1fdGltZTsKKwkJdGltZV90IHQ7CisKKwkJLy9tZW1zZXQoJnRtX3RpbWUsIDAsIHNpemVvZih0bV90aW1lKSk7CisJCS8qIEJldHRlciB0aGFuIG1lbXNldDogbWFrZXMgIkhIOk1NIiBkYXRlcyBtZWFuaW5nZnVsICovCisJCXRpbWUoJnQpOworCQlsb2NhbHRpbWVfcigmdCwgJnRtX3RpbWUpOworCQlwYXJzZV9kYXRlc3RyKGRhdGVfc3RyLCAmdG1fdGltZSk7CisKKwkJLyogQ29ycmVjdCBhbnkgZGF5IG9mIHdlZWsgYW5kIGRheSBvZiB5ZWFyIGV0Yy4gZmllbGRzICovCisJCXRtX3RpbWUudG1faXNkc3QgPSAtMTsgIC8qIEJlIHN1cmUgdG8gcmVjaGVjayBkc3QgKi8KKwkJdCA9IHZhbGlkYXRlX3RtX3RpbWUoZGF0ZV9zdHIsICZ0bV90aW1lKTsKKworCQl0aW1lYnVmWzFdLnR2X3NlYyA9IHRpbWVidWZbMF0udHZfc2VjID0gdDsKKwl9CisKKwlkbyB7CisJCWlmICh1dGltZXMoKmFyZ3YsIChyZWZlcmVuY2VfZmlsZSB8fCBkYXRlX3N0cikgPyB0aW1lYnVmIDogTlVMTCkgIT0gMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkgeyAvKiBubyBzdWNoIGZpbGUgKi8KKwkJCQlpZiAob3B0cykgeyAvKiBjcmVhdGlvbiBpcyBkaXNhYmxlZCwgc28gaWdub3JlICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBUcnkgdG8gY3JlYXRlIHRoZSBmaWxlICovCisJCQkJZmQgPSBvcGVuKCphcmd2LCBPX1JEV1IgfCBPX0NSRUFULCAwNjY2KTsKKwkJCQlpZiAoZmQgPj0gMCkgeworCQkJCQl4Y2xvc2UoZmQpOworCQkJCQlpZiAocmVmZXJlbmNlX2ZpbGUgfHwgZGF0ZV9zdHIpCisJCQkJCQl1dGltZXMoKmFyZ3YsIHRpbWVidWYpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdHIuYyBiL2NvcmV1dGlscy90ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Nzk0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdHIuYwpAQCAtMCwwICsxLDM0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB0ciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqKiBDb3B5cmlnaHQgKGMpIDE5ODcsMTk5NywgUHJlbnRpY2UgSGFsbCAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIG5hbWUgb2YgUHJlbnRpY2UgSGFsbCBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQ29weXJpZ2h0IChjKSBNaWNoaWVsIEh1aXNqZXMKKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgdHIgaXMgYWRhcHRlZCBmcm9tIE1pbml4IHRyIGFuZCB3YXMgbW9kaWZpZWQKKyAqIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gYmUgdXNlZCBpbiBidXN5Ym94LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvdHIuaHRtbAorICogVE9ETzogZ3JhcGgsIHByaW50CisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1RSKSArPSB0ci5vCisKKy8vY29uZmlnOmNvbmZpZyBUUgorLy9jb25maWc6CWJvb2wgInRyIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHRyIGlzIHVzZWQgdG8gc3F1ZWV6ZSwgYW5kL29yIGRlbGV0ZSBjaGFyYWN0ZXJzIGZyb20gc3RhbmRhcmQKKy8vY29uZmlnOgkgIGlucHV0LCB3cml0aW5nIHRvIHN0YW5kYXJkIG91dHB1dC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVFJfQ0xBU1NFUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBjaGFyYWN0ZXIgY2xhc3NlcyAoc3VjaCBhcyBbOnVwcGVyOl0pIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVFIKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgY2hhcmFjdGVyIGNsYXNzZXMsIGVuYWJsaW5nIGNvbW1hbmRzIHN1Y2ggYXM6CisvL2NvbmZpZzoJICB0ciBbOnVwcGVyOl0gWzpsb3dlcjpdIHRvIGNvbnZlcnQgaW5wdXQgaW50byBsb3dlcmNhc2UuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RSX0VRVUlWCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGVxdWl2YWxlbmNlIGNsYXNzZXMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUUgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBlcXVpdmFsZW5jZSBjbGFzc2VzLCB3aGljaCBlc3NlbnRpYWxseSBhZGQgdGhlIGVuY2xvc2VkCisvL2NvbmZpZzoJICBjaGFyYWN0ZXIgdG8gdGhlIGN1cnJlbnQgc2V0LiBGb3IgaW5zdGFuY2UsIHRyIFs9YT1dIHh5eiB3b3VsZAorLy9jb25maWc6CSAgcmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mICdhJyB3aXRoICd4eXonLiBUaGlzIG9wdGlvbiBpcyBtYWlubHkKKy8vY29uZmlnOgkgIHVzZWZ1bCBmb3IgY2FzZXMgd2hlbiBubyBvdGhlciB3YXkgb2YgZXhwcmVzc2luZyBhIGNoYXJhY3RlcgorLy9jb25maWc6CSAgaXMgcG9zc2libGUuCisKKy8vdXNhZ2U6I2RlZmluZSB0cl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZHNdIFNUUklORzEgW1NUUklORzJdIgorLy91c2FnZTojZGVmaW5lIHRyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhbnNsYXRlLCBzcXVlZXplLCBvciBkZWxldGUgY2hhcmFjdGVycyBmcm9tIHN0ZGluLCB3cml0aW5nIHRvIHN0ZG91dFxuIgorLy91c2FnZTogICAgICJcbgktYwlUYWtlIGNvbXBsZW1lbnQgb2YgU1RSSU5HMSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVsZXRlIGlucHV0IGNoYXJhY3RlcnMgY29kZWQgU1RSSU5HMSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU3F1ZWV6ZSBtdWx0aXBsZSBvdXRwdXQgY2hhcmFjdGVycyBvZiBTVFJJTkcyIGludG8gb25lIGNoYXJhY3RlciIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdHJfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZWNobyBcImdka2tuIHZucWtjXCIgfCB0ciBbYS15XSBbYi16XVxuIgorLy91c2FnZTogICAgICAgImhlbGxvIHdvcmxkXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitlbnVtIHsKKwlBU0NJSSA9IDI1NiwKKwkvKiBzdHJpbmcgYnVmZmVyIG5lZWRzIHRvIGJlIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgd2hvbGUgImFscGhhYmV0Ii4KKwkgKiBCVUZTSVogPT0gQVNDSUkgaXMgb2ssIGJ1dCB3ZSB3aWxsIHJlYWxsb2MgaW4gZXhwYW5kCisJICogZXZlbiBmb3Igc21hbGxlc3QgcGF0dGVybnMsIGxldCdzIGF2b2lkIHRoYXQgYnkgdXNpbmcgKjI6CisJICovCisJVFJfQlVGU0laID0gKEJVRlNJWiA+IEFTQ0lJKjIpID8gQlVGU0laIDogQVNDSUkqMiwKK307CisKK3N0YXRpYyB2b2lkIG1hcChjaGFyICpwdmVjdG9yLAorCQljaGFyICpzdHJpbmcxLCB1bnNpZ25lZCBzdHJpbmcxX2xlbiwKKwkJY2hhciAqc3RyaW5nMiwgdW5zaWduZWQgc3RyaW5nMl9sZW4pCit7CisJY2hhciBsYXN0ID0gJzAnOworCXVuc2lnbmVkIGksIGo7CisKKwlmb3IgKGogPSAwLCBpID0gMDsgaSA8IHN0cmluZzFfbGVuOyBpKyspIHsKKwkJaWYgKHN0cmluZzJfbGVuIDw9IGopCisJCQlwdmVjdG9yWyh1bnNpZ25lZCBjaGFyKShzdHJpbmcxW2ldKV0gPSBsYXN0OworCQllbHNlCisJCQlwdmVjdG9yWyh1bnNpZ25lZCBjaGFyKShzdHJpbmcxW2ldKV0gPSBsYXN0ID0gc3RyaW5nMltqKytdOworCX0KK30KKworLyogc3VwcG9ydGVkIGNvbnN0cnVjdHM6CisgKiAgIFJhbmdlcywgIGUuZy4sICAwLTkgICA9PT4gIDAxMjM0NTY3ODkKKyAqICAgRXNjYXBlcywgZS5nLiwgIFxhICAgID09PiAgQ29udHJvbC1HCisgKiAgIENoYXJhY3RlciBjbGFzc2VzLCBlLmcuIFs6dXBwZXI6XSA9PT4gQS4uLloKKyAqICAgRXF1aXYgY2xhc3Nlc3MsIGUuZy4gWz1BPV0gPT0+IEEgICAoaG1tbW1tbW0/KQorICogbm90IHN1cHBvcnRlZDoKKyAqICAgXG9vby1cb29vIC0gb2N0YWwgcmFuZ2VzCisgKiAgIFt4Kk5dIC0gcmVwZWF0IGNoYXIgeCBOIHRpbWVzCisgKiAgIFt4Kl0gLSByZXBlYXQgY2hhciB4IHVudGlsIGl0IGZpbGxzIFNUUklORzI6CisgKiAjIGVjaG8gcXdlMTIzIHwgL3Vzci9iaW4vdHIgMTIzNDU2Nzg5ICdbZF0nCisgKiBxd2VbZF0KKyAqICMgZWNobyBxd2UxMjMgfCAvdXNyL2Jpbi90ciAxMjM0NTY3ODkgJ1tkKl0nCisgKiBxd2VkZGQKKyAqLworc3RhdGljIHVuc2lnbmVkIGV4cGFuZChjb25zdCBjaGFyICphcmcsIGNoYXIgKipidWZmZXJfcCkKK3sKKwljaGFyICpidWZmZXIgPSAqYnVmZmVyX3A7CisJdW5zaWduZWQgcG9zID0gMDsKKwl1bnNpZ25lZCBzaXplID0gVFJfQlVGU0laOworCXVuc2lnbmVkIGk7IC8qIGNhbid0IGJlIHVuc2lnbmVkIGNoYXI6IG11c3QgYmUgYWJsZSB0byBob2xkIDI1NiAqLworCXVuc2lnbmVkIGNoYXIgYWM7CisKKwl3aGlsZSAoKmFyZykgeworCQlpZiAocG9zICsgQVNDSUkgPiBzaXplKSB7CisJCQlzaXplICs9IEFTQ0lJOworCQkJKmJ1ZmZlcl9wID0gYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCBzaXplKTsKKwkJfQorCQlpZiAoKmFyZyA9PSAnXFwnKSB7CisJCQlhcmcrKzsKKwkJCWJ1ZmZlcltwb3MrK10gPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgmYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChhcmdbMV0gPT0gJy0nKSB7IC8qICIwLTkuLi4iICovCisJCQlhYyA9IGFyZ1syXTsKKwkJCWlmIChhYyA9PSAnXDAnKSB7IC8qICIwLSI6IGNvcHkgdmVyYmF0aW0gKi8KKwkJCQlidWZmZXJbcG9zKytdID0gKmFyZysrOyAvKiBjb3B5ICcwJyAqLworCQkJCWNvbnRpbnVlOyAvKiBuZXh0IGl0ZXIgd2lsbCBjb3B5ICctJyBhbmQgc3RvcCAqLworCQkJfQorCQkJaSA9ICh1bnNpZ25lZCBjaGFyKSAqYXJnOworCQkJd2hpbGUgKGkgPD0gYWMpIC8qIG9rOiBpIGlzIHVuc2lnbmVkIF9pbnRfICovCisJCQkJYnVmZmVyW3BvcysrXSA9IGkrKzsKKwkJCWFyZyArPSAzOyAvKiBza2lwIDAtOSAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChFTkFCTEVfRkVBVFVSRV9UUl9DTEFTU0VTIHx8IEVOQUJMRV9GRUFUVVJFX1RSX0VRVUlWKQorCQkgJiYgKmFyZyA9PSAnWycKKwkJKSB7CisJCQlhcmcrKzsKKwkJCWkgPSAodW5zaWduZWQgY2hhcikgKmFyZysrOworCQkJLyogIlt4eXouLi4iLiBpPXgsIGFyZyBwb2ludHMgdG8geSAqLworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1RSX0NMQVNTRVMgJiYgaSA9PSAnOicpIHsgLyogWzpjbGFzczpdICovCisjZGVmaW5lIENMTyAiOl1cMCIKKwkJCQlzdGF0aWMgY29uc3QgY2hhciBjbGFzc2VzW10gQUxJR04xID0KKwkJCQkJImFscGhhIkNMTyAiYWxudW0iQ0xPICJkaWdpdCJDTE8KKwkJCQkJImxvd2VyIkNMTyAidXBwZXIiQ0xPICJzcGFjZSJDTE8KKwkJCQkJImJsYW5rIkNMTyAicHVuY3QiQ0xPICJjbnRybCJDTE8KKwkJCQkJInhkaWdpdCJDTE87CisJCQkJZW51bSB7CisJCQkJCUNMQVNTX2ludmFsaWQgPSAwLCAvKiB3ZSBpbmNyZW1lbnQgdGhlIHJldHZhbCAqLworCQkJCQlDTEFTU19hbHBoYSA9IDEsCisJCQkJCUNMQVNTX2FsbnVtID0gMiwKKwkJCQkJQ0xBU1NfZGlnaXQgPSAzLAorCQkJCQlDTEFTU19sb3dlciA9IDQsCisJCQkJCUNMQVNTX3VwcGVyID0gNSwKKwkJCQkJQ0xBU1Nfc3BhY2UgPSA2LAorCQkJCQlDTEFTU19ibGFuayA9IDcsCisJCQkJCUNMQVNTX3B1bmN0ID0gOCwKKwkJCQkJQ0xBU1NfY250cmwgPSA5LAorCQkJCQlDTEFTU194ZGlnaXQgPSAxMCwKKwkJCQkJLy9DTEFTU19ncmFwaCA9IDExLAorCQkJCQkvL0NMQVNTX3ByaW50ID0gMTIsCisJCQkJfTsKKwkJCQlzbWFsbHVpbnQgajsKKwkJCQljaGFyICp0bXA7CisKKwkJCQkvKiB4ZGlnaXQgbmVlZHMgOCwgbm90IDcgKi8KKwkJCQlpID0gNyArIChhcmdbMF0gPT0gJ3gnKTsKKwkJCQl0bXAgPSB4c3RybmR1cChhcmcsIGkpOworCQkJCWogPSBpbmRleF9pbl9zdHJpbmdzKGNsYXNzZXMsIHRtcCkgKyAxOworCQkJCWZyZWUodG1wKTsKKworCQkJCWlmIChqID09IENMQVNTX2ludmFsaWQpCisJCQkJCWdvdG8gc2tpcF9icmFja2V0OworCisJCQkJYXJnICs9IGk7CisJCQkJaWYgKGogPT0gQ0xBU1NfYWxudW0gfHwgaiA9PSBDTEFTU19kaWdpdCB8fCBqID09IENMQVNTX3hkaWdpdCkgeworCQkJCQlmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyBpKyspCisJCQkJCQlidWZmZXJbcG9zKytdID0gaTsKKwkJCQl9CisJCQkJaWYgKGogPT0gQ0xBU1NfYWxwaGEgfHwgaiA9PSBDTEFTU19hbG51bSB8fCBqID09IENMQVNTX3VwcGVyKSB7CisJCQkJCWZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSBpOworCQkJCX0KKwkJCQlpZiAoaiA9PSBDTEFTU19hbHBoYSB8fCBqID09IENMQVNTX2FsbnVtIHx8IGogPT0gQ0xBU1NfbG93ZXIpIHsKKwkJCQkJZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQorCQkJCQkJYnVmZmVyW3BvcysrXSA9IGk7CisJCQkJfQorCQkJCWlmIChqID09IENMQVNTX3NwYWNlIHx8IGogPT0gQ0xBU1NfYmxhbmspIHsKKwkJCQkJYnVmZmVyW3BvcysrXSA9ICdcdCc7CisJCQkJCWlmIChqID09IENMQVNTX3NwYWNlKSB7CisJCQkJCQlidWZmZXJbcG9zKytdID0gJ1xuJzsKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSAnXHYnOworCQkJCQkJYnVmZmVyW3BvcysrXSA9ICdcZic7CisJCQkJCQlidWZmZXJbcG9zKytdID0gJ1xyJzsKKwkJCQkJfQorCQkJCQlidWZmZXJbcG9zKytdID0gJyAnOworCQkJCX0KKwkJCQlpZiAoaiA9PSBDTEFTU19wdW5jdCB8fCBqID09IENMQVNTX2NudHJsKSB7CisJCQkJCWZvciAoaSA9ICdcMCc7IGkgPCBBU0NJSTsgaSsrKSB7CisJCQkJCQlpZiAoKGogPT0gQ0xBU1NfcHVuY3QgJiYgaXNwcmludF9hc2NpaW9ubHkoaSkgJiYgIWlzYWxudW0oaSkgJiYgIWlzc3BhY2UoaSkpCisJCQkJCQkgfHwgKGogPT0gQ0xBU1NfY250cmwgJiYgaXNjbnRybChpKSkKKwkJCQkJCSkgeworCQkJCQkJCWJ1ZmZlcltwb3MrK10gPSBpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChqID09IENMQVNTX3hkaWdpdCkgeworCQkJCQlmb3IgKGkgPSAnQSc7IGkgPD0gJ0YnOyBpKyspIHsKKwkJCQkJCWJ1ZmZlcltwb3MgKyA2XSA9IGkgfCAweDIwOworCQkJCQkJYnVmZmVyW3BvcysrXSA9IGk7CisJCQkJCX0KKwkJCQkJcG9zICs9IDY7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogIlt4eXouLi4iLCBpPXgsIGFyZyBwb2ludHMgdG8geSAqLworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1RSX0VRVUlWICYmIGkgPT0gJz0nKSB7IC8qIFs9Q0hBUj1dICovCisJCQkJYnVmZmVyW3BvcysrXSA9ICphcmc7IC8qIGNvcHkgQ0hBUiAqLworCQkJCWlmICghYXJnWzBdIHx8IGFyZ1sxXSAhPSAnPScgfHwgYXJnWzJdICE9ICddJykKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCWFyZyArPSAzOyAgLyogc2tpcCBDSEFSPV0gKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIFRoZSByZXN0IG9mICJbeHl6Li4uIiBjYXNlcyBpcyB0cmVhdGVkIGFzIG5vcm1hbAorCQkJICogc3RyaW5nLCAiWyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBoZXJlOgorCQkJICogdHIgIlthLXpdIiAiW0EtWl0iIGNhbiBiZSB3cml0dGVuIGFzIHRyICJhLXoiICJBLVoiLAorCQkJICogYWxzbyB0cnkgdHIgIlthLXpdIiAiX0EtWisiIGFuZCB5b3UnbGwgc2VlIHRoYXQKKwkJCSAqIFtdIGlzIG5vdCBzcGVjaWFsIGhlcmUuCisJCQkgKi8KKyBza2lwX2JyYWNrZXQ6CisJCQlhcmcgLT0gMjsgLyogcG9pbnRzIHRvICJbIiBpbiAiW3h5ei4uLiIgKi8KKwkJfQorCQlidWZmZXJbcG9zKytdID0gKmFyZysrOworCX0KKwlyZXR1cm4gcG9zOworfQorCisvKiBOQjogYnVmZmVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgYXQgbGVhc3QgVFJfQlVGU0laRQorICogKHdoaWNoIGlzID49IEFTQ0lJKSBiaWcuCisgKi8KK3N0YXRpYyBpbnQgY29tcGxlbWVudChjaGFyICpidWZmZXIsIGludCBidWZmZXJfbGVuKQoreworCWludCBsZW47CisJY2hhciBjb252W0FTQ0lJXTsKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJbGVuID0gMDsKKwljaCA9ICdcMCc7CisJd2hpbGUgKDEpIHsKKwkJaWYgKG1lbWNocihidWZmZXIsIGNoLCBidWZmZXJfbGVuKSA9PSBOVUxMKQorCQkJY29udltsZW4rK10gPSBjaDsKKwkJaWYgKCsrY2ggPT0gJ1wwJykKKwkJCWJyZWFrOworCX0KKwltZW1jcHkoYnVmZmVyLCBjb252LCBsZW4pOworCXJldHVybiBsZW47Cit9CisKK2ludCB0cl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpOworCXNtYWxsdWludCBvcHRzOworCXNzaXplX3QgcmVhZF9jaGFyczsKKwlzaXplX3QgaW5faW5kZXgsIG91dF9pbmRleDsKKwl1bnNpZ25lZCBsYXN0ID0gVUNIQVJfTUFYICsgMTsgLyogbm90IGVxdWFsIHRvIGFueSBjaGFyICovCisJdW5zaWduZWQgY2hhciBjb2RlZCwgYzsKKwljaGFyICpzdHIxID0geG1hbGxvYyhUUl9CVUZTSVopOworCWNoYXIgKnN0cjIgPSB4bWFsbG9jKFRSX0JVRlNJWik7CisJaW50IHN0cjJfbGVuZ3RoOworCWludCBzdHIxX2xlbmd0aDsKKwljaGFyICp2ZWN0b3IgPSB4emFsbG9jKEFTQ0lJICogMyk7CisJY2hhciAqaW52ZWMgID0gdmVjdG9yICsgQVNDSUk7CisJY2hhciAqb3V0dmVjID0gdmVjdG9yICsgQVNDSUkgKiAyOworCisjZGVmaW5lIFRSX09QVF9jb21wbGVtZW50ICAgKDMgPDwgMCkKKyNkZWZpbmUgVFJfT1BUX2RlbGV0ZSAgICAgICAoMSA8PCAyKQorI2RlZmluZSBUUl9PUFRfc3F1ZWV6ZV9yZXBzICgxIDw8IDMpCisKKwlmb3IgKGkgPSAwOyBpIDwgQVNDSUk7IGkrKykgeworCQl2ZWN0b3JbaV0gPSBpOworCQkvKmludmVjW2ldID0gb3V0dmVjW2ldID0gRkFMU0U7IC0gZG9uZSBieSB4emFsbG9jICovCisJfQorCisJLyogLUMvLWMgZGlmZmVyZW5jZSBpcyB0aGF0IC1DIGNvbXBsZW1lbnRzICJjaGFyYWN0ZXJzIiwKKwkgKiBhbmQgLWMgY29tcGxlbWVudHMgInZhbHVlcyIgKGJpbmFyeSBieXRlcyBJIGd1ZXNzKS4KKwkgKiBJbiBQT1NJWCBsb2NhbGUsIHRoZXNlIGFyZSB0aGUgc2FtZS4KKwkgKi8KKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIitDY2RzIik7IC8qICcrJzogc3RvcCBhdCBmaXJzdCBub24tb3B0aW9uICovCisJYXJndiArPSBvcHRpbmQ7CisKKwlzdHIxX2xlbmd0aCA9IGV4cGFuZCgqYXJndisrLCAmc3RyMSk7CisJc3RyMl9sZW5ndGggPSAwOworCWlmIChvcHRzICYgVFJfT1BUX2NvbXBsZW1lbnQpCisJCXN0cjFfbGVuZ3RoID0gY29tcGxlbWVudChzdHIxLCBzdHIxX2xlbmd0aCk7CisJaWYgKCphcmd2KSB7CisJCWlmIChhcmd2WzBdWzBdID09ICdcMCcpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiU1RSSU5HMiBjYW5ub3QgYmUgZW1wdHkiKTsKKwkJc3RyMl9sZW5ndGggPSBleHBhbmQoKmFyZ3YsICZzdHIyKTsKKwkJbWFwKHZlY3Rvciwgc3RyMSwgc3RyMV9sZW5ndGgsCisJCQkJc3RyMiwgc3RyMl9sZW5ndGgpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgc3RyMV9sZW5ndGg7IGkrKykKKwkJaW52ZWNbKHVuc2lnbmVkIGNoYXIpKHN0cjFbaV0pXSA9IFRSVUU7CisJZm9yIChpID0gMDsgaSA8IHN0cjJfbGVuZ3RoOyBpKyspCisJCW91dHZlY1sodW5zaWduZWQgY2hhcikoc3RyMltpXSldID0gVFJVRTsKKworCWdvdG8gc3RhcnRfZnJvbTsKKworCS8qIEluIHRoaXMgbG9vcCwgc3RyMSBzcGFjZSBpcyByZXVzZWQgYXMgaW5wdXQgYnVmZmVyLAorCSAqIHN0cjIgLSBhcyBvdXRwdXQgb25lLiAqLworCWZvciAoOzspIHsKKwkJLyogSWYgd2UncmUgb3V0IG9mIGlucHV0LCBmbHVzaCBvdXRwdXQgYW5kIHJlYWQgbW9yZSBpbnB1dC4gKi8KKwkJaWYgKChzc2l6ZV90KWluX2luZGV4ID09IHJlYWRfY2hhcnMpIHsKKwkJCWlmIChvdXRfaW5kZXgpIHsKKwkJCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgc3RyMiwgb3V0X2luZGV4KTsKKyBzdGFydF9mcm9tOgorCQkJCW91dF9pbmRleCA9IDA7CisJCQl9CisJCQlyZWFkX2NoYXJzID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgc3RyMSwgVFJfQlVGU0laKTsKKwkJCWlmIChyZWFkX2NoYXJzIDw9IDApIHsKKwkJCQlpZiAocmVhZF9jaGFycyA8IDApCisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpbl9pbmRleCA9IDA7CisJCX0KKwkJYyA9IHN0cjFbaW5faW5kZXgrK107CisJCWlmICgob3B0cyAmIFRSX09QVF9kZWxldGUpICYmIGludmVjW2NdKQorCQkJY29udGludWU7CisJCWNvZGVkID0gdmVjdG9yW2NdOworCQlpZiAoKG9wdHMgJiBUUl9PUFRfc3F1ZWV6ZV9yZXBzKSAmJiBsYXN0ID09IGNvZGVkCisJCSAmJiAoaW52ZWNbY10gfHwgb3V0dmVjW2NvZGVkXSkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzdHIyW291dF9pbmRleCsrXSA9IGxhc3QgPSBjb2RlZDsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZSh2ZWN0b3IpOworCQlmcmVlKHN0cjIpOworCQlmcmVlKHN0cjEpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdHJ1ZS5jIGIvY29yZXV0aWxzL3RydWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJlNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3RydWUuYwpAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRydWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdHJ1ZS5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSB0cnVlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgdHJ1ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJldHVybiBhbiBleGl0IGNvZGUgb2YgVFJVRSAoMCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRydWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdHJ1ZVxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyAkP1xuIgorLy91c2FnZTogICAgICAgIjBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCB0cnVlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0cnVlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90dHkuYyBiL2NvcmV1dGlscy90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTE3NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3R0eS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHR0eSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjQgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy90dHkuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgdHR5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgdHR5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZmlsZSBuYW1lIG9mIHN0ZGluJ3MgdGVybWluYWwiCisvL3VzYWdlOglJRl9JTkNMVURFX1NVU3YyKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVByaW50IG5vdGhpbmcsIG9ubHkgcmV0dXJuIGV4aXQgc3RhdHVzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0dHlfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdHR5XG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi90dHkyXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgdHR5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dHlfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnM7CisJSUZfSU5DTFVERV9TVVN2MihpbnQgc2lsZW50OykgIC8qIE5vdGU6IE5vIGxvbmdlciByZWxldmFudCBpbiBTVVN2My4gKi8KKwlpbnQgcmV0dmFsOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMjsgIC8qIFNVU3YzIHJlcXVpcmVzID4gMSBmb3IgZXJyb3IuICovCisKKwlJRl9JTkNMVURFX1NVU3YyKHNpbGVudCA9IGdldG9wdDMyKGFyZ3YsICJzIik7KQorCUlGX0lOQ0xVREVfU1VTdjIoYXJndiArPSBvcHRpbmQ7KQorCUlGX05PVF9JTkNMVURFX1NVU3YyKGFyZ3YgKz0gMTspCisKKwkvKiBnbnUgdHR5IG91dHB1dHMgYSB3YXJuaW5nIHRoYXQgaXQgaXMgaWdub3JpbmcgYWxsIGFyZ3MuICovCisJYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZ3ZbMF0pOworCisJcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisJcyA9IHhtYWxsb2NfdHR5bmFtZShTVERJTl9GSUxFTk8pOworCWlmIChzID09IE5VTEwpIHsKKwkvKiBBY2NvcmRpbmcgdG8gU1VTdjMsIHR0eW5hbWUgY2FuIGZhaWwgd2l0aCBFQkFERiBvciBFTk9UVFkuCisJICogV2Uga25vdyB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGdvb2QsIHNvIGZhaWx1cmUgbWVhbnMgbm90IGEgdHR5LiAqLworCQlzID0gIm5vdCBhIHR0eSI7CisJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwl9CisJSUZfSU5DTFVERV9TVVN2MihpZiAoIXNpbGVudCkgcHV0cyhzKTspCisJSUZfTk9UX0lOQ0xVREVfU1VTdjIocHV0cyhzKTspCisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdW5hbWUuYyBiL2NvcmV1dGlscy91bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmQ3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdW5hbWUuYwpAQCAtMCwwICsxLDE3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiB1bmFtZSAtLSBwcmludCBzeXN0ZW0gaW5mb3JtYXRpb24KKyAqIENvcHlyaWdodCAoQykgMTk4OS0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3VuYW1lLmh0bWwgKi8KKworLyogT3B0aW9uCQlFeGFtcGxlCisgKiAtcywgLS1zeXNuYW1lCVN1bk9TCisgKiAtbiwgLS1ub2RlbmFtZQlyb2NreTgKKyAqIC1yLCAtLXJlbGVhc2UJNC4wCisgKiAtdiwgLS12ZXJzaW9uCisgKiAtbSwgLS1tYWNoaW5lCXN1bgorICogLWEsIC0tYWxsCQlTdW5PUyByb2NreTggNC4wICBzdW4KKyAqCisgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvICctcycuCisgKgorICogRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+CisgKgorICogR05VIGNvcmV1dGlscyA2LjEwOgorICogT3B0aW9uOiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgICBFeGFtcGxlKHMpOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dHNuYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOgorICogLXMsIC0ta2VybmVsLW5hbWUgICAgICAgICAgICBzeXNuYW1lICBMaW51eAorICogLW4sIC0tbm9kZW5hbWUgICAgICAgICAgICAgICBub2RlbmFtZSBsb2NhbGhvc3QubG9jYWxkb21haW4KKyAqIC1yLCAtLWtlcm5lbC1yZWxlYXNlICAgICAgICAgcmVsZWFzZSAgMi42LjI5CisgKiAtdiwgLS1rZXJuZWwtdmVyc2lvbiAgICAgICAgIHZlcnNpb24gICMxIFNNUCBTdW4gSmFuIDExIDIwOjUyOjM3IEVTVCAyMDA5CisgKiAtbSwgLS1tYWNoaW5lICAgICAgICAgICAgICAgIG1hY2hpbmUgIHg4Nl82NCAgIGk2ODYKKyAqIC1wLCAtLXByb2Nlc3NvciAgICAgICAgICAgICAgKG5vbmUpICAgeDg2XzY0ICAgaTY4NgorICogLWksIC0taGFyZHdhcmUtcGxhdGZvcm0gICAgICAobm9uZSkgICB4ODZfNjQgICBpMzg2CisgKiAgICAgIE5COiB2YW5pbGxhIGNvcmV1dGlscyByZXBvcnRzICJ1bmtub3duIiAtcCBhbmQgLWksCisgKiAgICAgIHg4Nl82NCBhbmQgaTY4Ni9pMzg2IHNob3duIGFib3ZlIGFyZSBGZWRvcmEncyBpbnZlbnRpb25zLgorICogLW8sIC0tb3BlcmF0aW5nLXN5c3RlbSAgICAgICAobm9uZSkgICBHTlUvTGludXgKKyAqIC1hLCAtLWFsbDogYWxsIG9mIHRoZSBhYm92ZSwgaW4gdGhlIG9yZGVyIHNob3duLgorICogICAgICBJZiAtcCBvciAtaSBpcyBub3Qga25vd24sIGRvbid0IHNob3cgdGhlbQorICovCisKKy8qIEJ1c3lib3hlZCBieSBFcmlrIEFuZGVyc2VuCisgKgorICogQmVmb3JlIDIwMDM6IEdsZW5uIE1jR3JhdGggYW5kIE1hbnVlbCBOb3ZvYSBJSUkKKyAqICBGdXJ0aGVyIHNpemUgcmVkdWN0aW9ucy4KKyAqIE1hciAxNiwgMjAwMzogTWFudWVsIE5vdm9hIElJSSAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKiAgTm93IGRvZXMgcHJvcGVyIGVycm9yIGNoZWNraW5nIG9uIGkvby4gIFBsdXMgc29tZSBmdXJ0aGVyIHNwYWNlIHNhdmluZ3MuCisgKiBKYW4gMjAwOToKKyAqICBGaXggaGFuZGxpbmcgb2YgLWEgdG8gbm90IHByaW50ICJ1bmtub3duIiwgYWRkIC1vIGFuZCAtaSBzdXBwb3J0LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1bmFtZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hbW5yc3B2XSIKKy8vdXNhZ2U6I2RlZmluZSB1bmFtZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHN5c3RlbSBpbmZvcm1hdGlvblxuIgorLy91c2FnZTogICAgICJcbgktYQlQcmludCBhbGwiCisvL3VzYWdlOiAgICAgIlxuCS1tCVRoZSBtYWNoaW5lIChoYXJkd2FyZSkgdHlwZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JSG9zdG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1yCU9TIHJlbGVhc2UiCisvL3VzYWdlOiAgICAgIlxuCS1zCU9TIG5hbWUgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktcAlQcm9jZXNzb3IgdHlwZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJT1MgdmVyc2lvbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5hbWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdW5hbWUgLWFcbiIKKy8vdXNhZ2U6ICAgICAgICJMaW51eCBkZWJpYW4gMi40LjIzICMyIFR1ZSBEZWMgMjMgMTc6MDk6MTAgTVNUIDIwMDMgaTY4NiBHTlUvTGludXhcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBBZnRlciBsaWJiYi5oLCBzaW5jZSBpdCBuZWVkcyBzeXMvdHlwZXMuaCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHV0c25hbWUgbmFtZTsKKwljaGFyIHByb2Nlc3NvcltzaXplb2YoKChzdHJ1Y3QgdXRzbmFtZSopTlVMTCktPm1hY2hpbmUpXTsKKwljaGFyIHBsYXRmb3JtW3NpemVvZigoKHN0cnVjdCB1dHNuYW1lKilOVUxMKS0+bWFjaGluZSldOworCWNoYXIgb3Nbc2l6ZW9mKCJHTlUvTGludXgiKV07Cit9IHVuYW1lX2luZm9fdDsKKworc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uc1tdIEFMSUdOMSA9ICJzbnJ2bXBpb2EiOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHV0c25hbWVfb2Zmc2V0W10gPSB7CisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBuYW1lLnN5c25hbWUpLCAvKiAtcyAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgbmFtZS5ub2RlbmFtZSksIC8qIC1uICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBuYW1lLnJlbGVhc2UpLCAvKiAtciAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgbmFtZS52ZXJzaW9uKSwgLyogLXYgKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIG5hbWUubWFjaGluZSksIC8qIC1tICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBwcm9jZXNzb3IpLCAvKiAtcCAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgcGxhdGZvcm0pLCAvKiAtaSAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgb3MpLCAvKiAtbyAqLworfTsKKworaW50IHVuYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bmFtZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIHVuYW1lX2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJhbGxcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYSIKKwkJImtlcm5lbC1uYW1lXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkibm9kZW5hbWVcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm4iCisJCSJrZXJuZWwtcmVsZWFzZVwwIiAgICBOb19hcmd1bWVudCAgICAgICAiciIKKwkJInJlbGVhc2VcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJyIgorCQkia2VybmVsLXZlcnNpb25cMCIgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJCSJtYWNoaW5lXDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAibSIKKwkJInByb2Nlc3NvclwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJwIgorCQkiaGFyZHdhcmUtcGxhdGZvcm1cMCIgTm9fYXJndW1lbnQgICAgICAgImkiCisJCSJvcGVyYXRpbmctc3lzdGVtXDAiICBOb19hcmd1bWVudCAgICAgICAibyIKKwk7CisjZW5kaWYKKwl1bmFtZV9pbmZvX3QgdW5hbWVfaW5mbzsKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCisJY2hhciAqZmFrZV9zcGFyYyA9IGdldGVudigiRkFLRV9TUEFSQyIpOworI2VuZGlmCisJY29uc3QgY2hhciAqdW5rbm93bl9zdHIgPSAidW5rbm93biI7CisJY29uc3QgY2hhciAqZm10OworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpkZWx0YTsKKwl1bnNpZ25lZCB0b3ByaW50OworCisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSB1bmFtZV9sb25nb3B0cyk7CisJdG9wcmludCA9IGdldG9wdDMyKGFyZ3YsIG9wdGlvbnMpOworCisJaWYgKGFyZ3Zbb3B0aW5kXSkgeyAvKiBjb3JldXRpbHMtNi45IGNvbXBhdCAqLworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKHRvcHJpbnQgJiAoMSA8PCA4KSkgeyAvKiAtYSA9PiBhbGwgb3B0cyBvbiAqLworCQl0b3ByaW50ID0gKDEgPDwgOCkgLSAxOworCQl1bmtub3duX3N0ciA9ICIiOyAvKiAtYSBkb2VzIG5vdCBwcmludCB1bmtub3duIGZpZWxkcyAqLworCX0KKworCWlmICh0b3ByaW50ID09IDApIHsgLyogbm8gb3B0cyA9PiAtcyAoc3lzbmFtZSkgKi8KKwkJdG9wcmludCA9IDE7CisJfQorCisJdW5hbWUoJnVuYW1lX2luZm8ubmFtZSk7IC8qIG5ldmVyIGZhaWxzICovCisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCisJaWYgKGZha2Vfc3BhcmMgJiYgKGZha2Vfc3BhcmNbMF0gfCAweDIwKSA9PSAneScpIHsKKwkJc3RyY3B5KHVuYW1lX2luZm8ubmFtZS5tYWNoaW5lLCAic3BhcmMiKTsKKwl9CisjZW5kaWYKKwlzdHJjcHkodW5hbWVfaW5mby5wcm9jZXNzb3IsIHVua25vd25fc3RyKTsKKwlzdHJjcHkodW5hbWVfaW5mby5wbGF0Zm9ybSwgdW5rbm93bl9zdHIpOworCXN0cmNweSh1bmFtZV9pbmZvLm9zLCAiR05VL0xpbnV4Iik7CisjaWYgMAorCS8qIEZlZG9yYSBkb2VzIHNvbWV0aGluZyBsaWtlIHRoaXMgKi8KKwlzdHJjcHkodW5hbWVfaW5mby5wcm9jZXNzb3IsIHVuYW1lX2luZm8ubmFtZS5tYWNoaW5lKTsKKwlzdHJjcHkodW5hbWVfaW5mby5wbGF0Zm9ybSwgdW5hbWVfaW5mby5uYW1lLm1hY2hpbmUpOworCWlmICh1bmFtZV9pbmZvLnBsYXRmb3JtWzBdID09ICdpJworCSAmJiB1bmFtZV9pbmZvLnBsYXRmb3JtWzFdCisJICYmIHVuYW1lX2luZm8ucGxhdGZvcm1bMl0gPT0gJzgnCisJICYmIHVuYW1lX2luZm8ucGxhdGZvcm1bM10gPT0gJzYnCisJKSB7CisJCXVuYW1lX2luZm8ucGxhdGZvcm1bMV0gPSAnMyc7CisJfQorI2VuZGlmCisKKwlkZWx0YSA9IHV0c25hbWVfb2Zmc2V0OworCWZtdCA9ICIgJXMiICsgMTsKKwlkbyB7CisJCWlmICh0b3ByaW50ICYgMSkgeworCQkJY29uc3QgY2hhciAqcCA9IChjaGFyICopKCZ1bmFtZV9pbmZvKSArICpkZWx0YTsKKwkJCWlmIChwWzBdKSB7CisJCQkJcHJpbnRmKGZtdCwgcCk7CisJCQkJZm10ID0gIiAlcyI7CisJCQl9CisJCX0KKwkJKytkZWx0YTsKKwl9IHdoaWxlICh0b3ByaW50ID4+PSAxKTsKKwliYl9wdXRjaGFyKCdcbicpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOyAvKiBjb3JldXRpbHMtNi45IGNvbXBhdCAqLworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3VuaXEuYyBiL2NvcmV1dGlscy91bmlxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwOGQzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy91bmlxLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHVuaXEgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy91bmlxLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIHVuaXFfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2R1XVstZixzLHcgTl0gW0lOUFVUIFtPVVRQVVRdXSIKKy8vdXNhZ2U6I2RlZmluZSB1bmlxX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzY2FyZCBkdXBsaWNhdGUgbGluZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJUHJlZml4IGxpbmVzIGJ5IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMiCisvL3VzYWdlOiAgICAgIlxuCS1kCU9ubHkgcHJpbnQgZHVwbGljYXRlIGxpbmVzIgorLy91c2FnZTogICAgICJcbgktdQlPbmx5IHByaW50IHVuaXF1ZSBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgTglTa2lwIGZpcnN0IE4gZmllbGRzIgorLy91c2FnZTogICAgICJcbgktcyBOCVNraXAgZmlyc3QgTiBjaGFycyAoYWZ0ZXIgYW55IHNraXBwZWQgZmllbGRzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXcgTglDb21wYXJlIE4gY2hhcmFjdGVycyBpbiBsaW5lIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1bmlxX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gLWUgXCJhXFxuYVxcbmJcXG5jXFxuY1xcbmFcIiB8IHNvcnQgfCB1bmlxXG4iCisvL3VzYWdlOiAgICAgICAiYVxuIgorLy91c2FnZTogICAgICAgImJcbiIKKy8vdXNhZ2U6ICAgICAgICJjXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgdW5pcV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW5pcV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqaW5wdXRfZmlsZW5hbWU7CisJdW5zaWduZWQgc2tpcF9maWVsZHMsIHNraXBfY2hhcnMsIG1heF9jaGFyczsKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqY3VyX2xpbmU7CisJY29uc3QgY2hhciAqY3VyX2NvbXBhcmU7CisKKwllbnVtIHsKKwkJT1BUX2MgPSAweDEsCisJCU9QVF9kID0gMHgyLCAvKiBwcmludCBvbmx5IGR1cHMgKi8KKwkJT1BUX3UgPSAweDQsIC8qIHByaW50IG9ubHkgdW5pcSAqLworCQlPUFRfZiA9IDB4OCwKKwkJT1BUX3MgPSAweDEwLAorCQlPUFRfdyA9IDB4MjAsCisJfTsKKworCXNraXBfZmllbGRzID0gc2tpcF9jaGFycyA9IDA7CisJbWF4X2NoYXJzID0gSU5UX01BWDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImYrOnMrOncrIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2R1ZjpzOnc6IiwgJnNraXBfZmllbGRzLCAmc2tpcF9jaGFycywgJm1heF9jaGFycyk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGlucHV0X2ZpbGVuYW1lKSB7CisJCWNvbnN0IGNoYXIgKm91dHB1dDsKKworCQlpZiAoaW5wdXRfZmlsZW5hbWVbMF0gIT0gJy0nIHx8IGlucHV0X2ZpbGVuYW1lWzFdKSB7CisJCQljbG9zZShTVERJTl9GSUxFTk8pOyAvKiA9PSAwICovCisJCQl4b3BlbihpbnB1dF9maWxlbmFtZSwgT19SRE9OTFkpOyAvKiBmZCB3aWxsIGJlIDAgKi8KKwkJfQorCQlvdXRwdXQgPSBhcmd2WzFdOworCQlpZiAob3V0cHV0KSB7CisJCQlpZiAoYXJndlsyXSkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlpZiAob3V0cHV0WzBdICE9ICctJyB8fCBvdXRwdXRbMV0pIHsKKwkJCQkvLyBXb24ndCB3b3JrIHdpdGggInVuaXEgLSBGSUxFIiBhbmQgY2xvc2VkIHN0ZGluOgorCQkJCS8vY2xvc2UoU1RET1VUX0ZJTEVOTyk7CisJCQkJLy94b3BlbihvdXRwdXQsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpOworCQkJCXhtb3ZlX2ZkKHhvcGVuKG91dHB1dCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyksIFNURE9VVF9GSUxFTk8pOworCQkJfQorCQl9CisJfQorCisJY3VyX2NvbXBhcmUgPSBjdXJfbGluZSA9IE5VTEw7IC8qIHByaW1lIHRoZSBwdW1wICovCisKKwlkbyB7CisJCXVuc2lnbmVkIGk7CisJCXVuc2lnbmVkIGxvbmcgZHVwczsKKwkJY2hhciAqb2xkX2xpbmU7CisJCWNvbnN0IGNoYXIgKm9sZF9jb21wYXJlOworCisJCW9sZF9saW5lID0gY3VyX2xpbmU7CisJCW9sZF9jb21wYXJlID0gY3VyX2NvbXBhcmU7CisJCWR1cHMgPSAwOworCisJCS8qIGdudSB1bmlxIGlnbm9yZXMgbmV3bGluZXMgKi8KKwkJd2hpbGUgKChjdXJfbGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCQljdXJfY29tcGFyZSA9IGN1cl9saW5lOworCQkJZm9yIChpID0gc2tpcF9maWVsZHM7IGk7IGktLSkgeworCQkJCWN1cl9jb21wYXJlID0gc2tpcF93aGl0ZXNwYWNlKGN1cl9jb21wYXJlKTsKKwkJCQljdXJfY29tcGFyZSA9IHNraXBfbm9uX3doaXRlc3BhY2UoY3VyX2NvbXBhcmUpOworCQkJfQorCQkJZm9yIChpID0gc2tpcF9jaGFyczsgKmN1cl9jb21wYXJlICYmIGk7IGktLSkgeworCQkJCSsrY3VyX2NvbXBhcmU7CisJCQl9CisKKwkJCWlmICghb2xkX2xpbmUgfHwgc3RybmNtcChvbGRfY29tcGFyZSwgY3VyX2NvbXBhcmUsIG1heF9jaGFycykpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZnJlZShjdXJfbGluZSk7CisJCQkrK2R1cHM7ICAvKiB0ZXN0aW5nIGZvciBvdmVyZmxvdyBzZWVtcyBleGNlc3NpdmUgKi8KKwkJfQorCisJCWlmIChvbGRfbGluZSkgeworCQkJaWYgKCEob3B0ICYgKE9QVF9kIDw8ICEhZHVwcykpKSB7IC8qIChpZiBkdXBzLCBvcHQgJiBPUFRfdSkgKi8KKwkJCQlpZiAob3B0ICYgT1BUX2MpIHsKKwkJCQkJLyogJTdsdSBtYXRjaGVzIEdOVSBjb3JldXRpbHMgNi45ICovCisJCQkJCXByaW50ZigiJTdsdSAiLCBkdXBzICsgMSk7CisJCQkJfQorCQkJCXByaW50ZigiJXNcbiIsIG9sZF9saW5lKTsKKwkJCX0KKwkJCWZyZWUob2xkX2xpbmUpOworCQl9CisJfSB3aGlsZSAoY3VyX2xpbmUpOworCisJZGllX2lmX2ZlcnJvcihzdGRpbiwgaW5wdXRfZmlsZW5hbWUpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3VzbGVlcC5jIGIvY29yZXV0aWxzL3VzbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNGViNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdXNsZWVwLmMKQEAgLTAsMCArMSwzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdXNsZWVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gQXBwYXJlbnRseSBhIGJ1c3lib3ggZXh0ZW5zaW9uLiAqLworCisvL3VzYWdlOiNkZWZpbmUgdXNsZWVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJOIgorLy91c2FnZTojZGVmaW5lIHVzbGVlcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBhdXNlIGZvciBOIG1pY3Jvc2Vjb25kcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdXNsZWVwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHVzbGVlcCAxMDAwMDAwXG4iCisvL3VzYWdlOiAgICAgICAiW3BhdXNlcyBmb3IgMSBzZWNvbmRdXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgdXNsZWVwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1c2xlZXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWlmICghYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJdXNsZWVwKHhhdG91KGFyZ3ZbMV0pKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdXVkZWNvZGUuYyBiL2NvcmV1dGlscy91dWRlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlY2ZlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdXVkZWNvZGUuYwpAQCAtMCwwICsxLDIzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDIwMDMsIEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEJhc2VkIG9uIHNwZWNpZmljYXRpb24gZnJvbQorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy91dWVuY29kZS5odG1sCisgKgorICogQnVnczogdGhlIHNwZWMgZG9lc24ndCBtZW50aW9uIGFueXRoaW5nIGFib3V0ICJgXG5gXG4iIHByaW9yIHRvIHRoZQorICogImVuZCIgbGluZQorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1dWRlY29kZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vIE9VVEZJTEVdIFtJTkZJTEVdIgorLy91c2FnZTojZGVmaW5lIHV1ZGVjb2RlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVXVkZWNvZGUgYSBmaWxlXG4iCisvL3VzYWdlOiAgICAgICAiRmluZHMgb3V0ZmlsZSBuYW1lIGluIHV1ZW5jb2RlZCBzb3VyY2UgdW5sZXNzIC1vIGlzIGdpdmVuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1dWRlY29kZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB1dWRlY29kZSAtbyBidXN5Ym94IGJ1c3lib3gudXVcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIGJ1c3lib3hcbiIKKy8vdXNhZ2U6ICAgICAgICItcnd4ci14ci14ICAgMSBhbXMgICAgICBhbXMgICAgICAgIDI0NTI2NCBKdW4gIDcgMjE6MzUgYnVzeWJveFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9VVURFQ09ERQorc3RhdGljIHZvaWQgRkFTVF9GVU5DIHJlYWRfc3RkdXUoRklMRSAqc3JjX3N0cmVhbSwgRklMRSAqZHN0X3N0cmVhbSwgaW50IGZsYWdzIFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyICpsaW5lOworCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShzcmNfc3RyZWFtKSkgIT0gTlVMTCkgeworCQlpbnQgZW5jb2RlZF9sZW4sIHN0cl9sZW47CisJCWNoYXIgKmxpbmVfcHRyLCAqZHN0OworCisJCWlmIChzdHJjbXAobGluZSwgImVuZCIpID09IDApIHsKKwkJCXJldHVybjsgLyogdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQgKi8KKwkJfQorCisJCWxpbmVfcHRyID0gbGluZTsKKwkJd2hpbGUgKCpsaW5lX3B0cikgeworCQkJKmxpbmVfcHRyID0gKCpsaW5lX3B0ciAtIDB4MjApICYgMHgzZjsKKwkJCWxpbmVfcHRyKys7CisJCX0KKwkJc3RyX2xlbiA9IGxpbmVfcHRyIC0gbGluZTsKKworCQllbmNvZGVkX2xlbiA9IGxpbmVbMF0gKiA0IC8gMzsKKwkJLyogQ2hlY2sgdGhhdCBsaW5lIGlzIG5vdCB0b28gc2hvcnQuICh3ZSB0b2xlcmF0ZQorCQkgKiBvdmVybHkgX2xvbmdfIGxpbmUgdG8gYWNjb21vZGF0ZSBwb3NzaWJsZSBleHRyYSAnYCcpLgorCQkgKiBFbXB0eSBsaW5lIGNhc2UgaXMgYWxzbyBjYXVnaHQgaGVyZS4gKi8KKwkJaWYgKHN0cl9sZW4gPD0gZW5jb2RlZF9sZW4pIHsKKwkJCWJyZWFrOyAvKiBnbyB0byBiYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgZmlsZSIpOyAqLworCQl9CisJCWlmIChlbmNvZGVkX2xlbiA8PSAwKSB7CisJCQkvKiBJZ25vcmUgdGhlICJgXG4iIGxpbmUsIHdoeSBpcyBpdCBldmVuIGluIHRoZSBlbmNvZGUgZmlsZSA/ICovCisJCQlmcmVlKGxpbmUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGVuY29kZWRfbGVuID4gNjApIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJsaW5lIHRvbyBsb25nIik7CisJCX0KKworCQlkc3QgPSBsaW5lOworCQlsaW5lX3B0ciA9IGxpbmUgKyAxOworCQlkbyB7CisJCQkvKiBNZXJnZSBmb3VyIDYgYml0IGNoYXJzIHRvIHRocmVlIDggYml0IGNoYXJzICovCisJCQkqZHN0KysgPSBsaW5lX3B0clswXSA8PCAyIHwgbGluZV9wdHJbMV0gPj4gNDsKKwkJCWVuY29kZWRfbGVuLS07CisJCQlpZiAoZW5jb2RlZF9sZW4gPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkqZHN0KysgPSBsaW5lX3B0clsxXSA8PCA0IHwgbGluZV9wdHJbMl0gPj4gMjsKKwkJCWVuY29kZWRfbGVuLS07CisJCQlpZiAoZW5jb2RlZF9sZW4gPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkqZHN0KysgPSBsaW5lX3B0clsyXSA8PCA2IHwgbGluZV9wdHJbM107CisJCQlsaW5lX3B0ciArPSA0OworCQkJZW5jb2RlZF9sZW4gLT0gMjsKKwkJfSB3aGlsZSAoZW5jb2RlZF9sZW4gPiAwKTsKKwkJZndyaXRlKGxpbmUsIDEsIGRzdCAtIGxpbmUsIGRzdF9zdHJlYW0pOworCQlmcmVlKGxpbmUpOworCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgZmlsZSIpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfVVVERUNPREUKK2ludCB1dWRlY29kZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdXVkZWNvZGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKnNyY19zdHJlYW07CisJY2hhciAqb3V0bmFtZSA9IE5VTEw7CisJY2hhciAqbGluZTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsgLyogMSBhcmd1bWVudCBtYXggKi8KKwlnZXRvcHQzMihhcmd2LCAibzoiLCAmb3V0bmFtZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIWFyZ3ZbMF0pCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCXNyY19zdHJlYW0gPSB4Zm9wZW5fc3RkaW4oYXJndlswXSk7CisKKwkvKiBTZWFyY2ggZm9yIHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcgKi8KKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHNyY19zdHJlYW0pKSAhPSBOVUxMKSB7CisJCXZvaWQgRkFTVF9GVU5DICgqZGVjb2RlX2ZuX3B0cikoRklMRSAqc3JjLCBGSUxFICpkc3QsIGludCBmbGFncyk7CisJCWNoYXIgKmxpbmVfcHRyOworCQlGSUxFICpkc3Rfc3RyZWFtOworCQlpbnQgbW9kZTsKKworCQlpZiAoc3RybmNtcChsaW5lLCAiYmVnaW4tYmFzZTY0ICIsIDEzKSA9PSAwKSB7CisJCQlsaW5lX3B0ciA9IGxpbmUgKyAxMzsKKwkJCWRlY29kZV9mbl9wdHIgPSByZWFkX2Jhc2U2NDsKKwkJfSBlbHNlIGlmIChzdHJuY21wKGxpbmUsICJiZWdpbiAiLCA2KSA9PSAwKSB7CisJCQlsaW5lX3B0ciA9IGxpbmUgKyA2OworCQkJZGVjb2RlX2ZuX3B0ciA9IHJlYWRfc3RkdXU7CisJCX0gZWxzZSB7CisJCQlmcmVlKGxpbmUpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBiZWdpbiBsaW5lIGZvdW5kLiBkZWNvZGUgYW5kIGV4aXQgKi8KKwkJbW9kZSA9IGJiX3N0cnRvdShsaW5lX3B0ciwgTlVMTCwgOCk7CisJCWlmIChvdXRuYW1lID09IE5VTEwpIHsKKwkJCW91dG5hbWUgPSBzdHJjaHIobGluZV9wdHIsICcgJyk7CisJCQlpZiAoKG91dG5hbWUgPT0gTlVMTCkgfHwgKCpvdXRuYW1lID09ICdcMCcpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvdXRuYW1lKys7CisJCX0KKwkJZHN0X3N0cmVhbSA9IHN0ZG91dDsKKwkJaWYgKE5PVF9MT05FX0RBU0gob3V0bmFtZSkpIHsKKwkJCWRzdF9zdHJlYW0gPSB4Zm9wZW5fZm9yX3dyaXRlKG91dG5hbWUpOworCQkJZmNobW9kKGZpbGVubyhkc3Rfc3RyZWFtKSwgbW9kZSAmIChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pKTsKKwkJfQorCQlmcmVlKGxpbmUpOworCQlkZWNvZGVfZm5fcHRyKHNyY19zdHJlYW0sIGRzdF9zdHJlYW0sIC8qZmxhZ3M6Ki8gQkFTRTY0X0ZMQUdfVVVfU1RPUCArIEJBU0U2NF9GTEFHX05PX1NUT1BfQ0hBUik7CisJCS8qIGZjbG9zZV9pZl9ub3Rfc3RkaW4oc3JjX3N0cmVhbSk7IC0gcmVkdW5kYW50ICovCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyAnYmVnaW4nIGxpbmUiKTsKK30KKyNlbmRpZgorCisvL2FwcGxldDpJRl9CQVNFNjQoQVBQTEVUKGJhc2U2NCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0JBU0U2NCkgKz0gdXVkZWNvZGUubworCisvL2NvbmZpZzpjb25maWcgQkFTRTY0CisvL2NvbmZpZzoJYm9vbCAiYmFzZTY0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEJhc2U2NCBlbmNvZGUgYW5kIGRlY29kZQorCisvL3VzYWdlOiNkZWZpbmUgYmFzZTY0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLWRdIFtGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBiYXNlNjRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJCYXNlNjQgZW5jb2RlIG9yIGRlY29kZSBGSUxFIHRvIHN0YW5kYXJkIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVjb2RlIGRhdGEiCisvLy8vdXNhZ2U6ICAgICAiXG4JLXcgQ09MCVdyYXAgbGluZXMgYXQgQ09MIChkZWZhdWx0IDc2LCAwIGRpc2FibGVzKSIKKy8vLy91c2FnZTogICAgICJcbgktaQlXaGVuIGRlY29kaW5nLCBpZ25vcmUgbm9uLWFscGhhYmV0IGNoYXJhY3RlcnMiCisKKyNpZiBFTkFCTEVfQkFTRTY0CitpbnQgYmFzZTY0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBiYXNlNjRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKnNyY19zdHJlYW07CisJdW5zaWduZWQgb3B0czsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsgLyogMSBhcmd1bWVudCBtYXggKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImQiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghYXJndlswXSkKKwkJKi0tYXJndiA9IChjaGFyKikiLSI7CisJc3JjX3N0cmVhbSA9IHhmb3Blbl9zdGRpbihhcmd2WzBdKTsKKwlpZiAob3B0cykgeworCQlyZWFkX2Jhc2U2NChzcmNfc3RyZWFtLCBzdGRvdXQsIC8qZmxhZ3M6Ki8gKGNoYXIpRU9GKTsKKwl9IGVsc2UgeworCQllbnVtIHsKKwkJCVNSQ19CVUZfU0laRSA9IDc2LzQqMywgIC8qIFRoaXMgKk1VU1QqIGJlIGEgbXVsdGlwbGUgb2YgMyAqLworCQkJRFNUX0JVRl9TSVpFID0gNCAqICgoU1JDX0JVRl9TSVpFICsgMikgLyAzKSwKKwkJfTsKKwkJY2hhciBzcmNfYnVmW1NSQ19CVUZfU0laRV07CisJCWNoYXIgZHN0X2J1ZltEU1RfQlVGX1NJWkUgKyAxXTsKKwkJaW50IHNyY19mZCA9IGZpbGVubyhzcmNfc3RyZWFtKTsKKwkJd2hpbGUgKDEpIHsKKwkJCXNpemVfdCBzaXplID0gZnVsbF9yZWFkKHNyY19mZCwgc3JjX2J1ZiwgU1JDX0JVRl9TSVpFKTsKKwkJCWlmICghc2l6ZSkKKwkJCQlicmVhazsKKwkJCWlmICgoc3NpemVfdClzaXplIDwgMCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJLyogRW5jb2RlIHRoZSBidWZmZXIgd2UganVzdCByZWFkIGluICovCisJCQliYl91dWVuY29kZShkc3RfYnVmLCBzcmNfYnVmLCBzaXplLCBiYl91dWVuY190YmxfYmFzZTY0KTsKKwkJCXh3cml0ZShTVERPVVRfRklMRU5PLCBkc3RfYnVmLCA0ICogKChzaXplICsgMikgLyAzKSk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJZmZsdXNoKHN0ZG91dCk7CisJCX0KKwl9CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisjZW5kaWYKKworLyogVGVzdCBzY3JpcHQuCitQdXQgdGhpcyBpbnRvIGFuIGVtcHR5IGRpciB3aXRoIGJ1c3lib3ggYmluYXJ5LCBhbiBydW4uCisKKyMhL2Jpbi9zaAordGVzdCAteCBidXN5Ym94IHx8IHsgZWNobyAiTm8gLi9idXN5Ym94PyI7IGV4aXQ7IH0KK2xuIC1zZiBidXN5Ym94IHV1ZGVjb2RlCitsbiAtc2YgYnVzeWJveCB1dWVuY29kZQorPkFfbnVsbAorZWNobyAtbiBBID5BCitlY2hvIC1uIEFCID5BQgorZWNobyAtbiBBQkMgPkFCQworZWNobyAtbiBBQkNEID5BQkNECitlY2hvIC1uIEFCQ0RFID5BQkNERQorZWNobyAtbiBBQkNERUYgPkFCQ0RFRgorY2F0IGJ1c3lib3ggPkFfYmJveAorZm9yIGYgaW4gQSo7IGRvCisgICAgZWNobyB1dWVuY29kZSAkZgorICAgIC4vdXVlbmNvZGUgICAgJGYgPCRmID51XyRmCisgICAgLi91dWVuY29kZSAtbSAkZiA8JGYgPm1fJGYKK2RvbmUKK21rZGlyIHVucGtfdSB1bnBrX20gMj4vZGV2L251bGwKK2ZvciBmIGluIHVfKjsgZG8KKyAgICAuL3V1ZGVjb2RlIDwkZiAtbyB1bnBrX3UvJHtmOjJ9CisgICAgZGlmZiAtYSAke2Y6Mn0gdW5wa191LyR7ZjoyfSA+L2Rldi9udWxsIDI+JjEKKyAgICBlY2hvIHV1ZGVjb2RlICRmOiAkPworZG9uZQorZm9yIGYgaW4gbV8qOyBkbworICAgIC4vdXVkZWNvZGUgPCRmIC1vIHVucGtfbS8ke2Y6Mn0KKyAgICBkaWZmIC1hICR7ZjoyfSB1bnBrX20vJHtmOjJ9ID4vZGV2L251bGwgMj4mMQorICAgIGVjaG8gdXVkZWNvZGUgJGY6ICQ/Citkb25lCisqLwpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3V1ZW5jb2RlLmMgYi9jb3JldXRpbHMvdXVlbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGE0ODlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3V1ZW5jb2RlLmMKQEAgLTAsMCArMSw3NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIENvcHlyaWdodCAoQykgMjAwMCBieSBHbGVubiBNY0dyYXRoCisgKgorICogIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBiYXNlNjRfZW5jb2RlIGZyb20gaHR0cC5jIGluIHdnZXQgdjEuNgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1dWVuY29kZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1tXSBbSU5GSUxFXSBTVE9SRURfRklMRU5BTUUiCisvL3VzYWdlOiNkZWZpbmUgdXVlbmNvZGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVdWVuY29kZSBhIGZpbGUgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOiAgICAgIlxuCS1tCVVzZSBiYXNlNjQgZW5jb2RpbmcgcGVyIFJGQzE1MjEiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHV1ZW5jb2RlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHV1ZW5jb2RlIGJ1c3lib3ggYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgImJlZ2luIDc1NSBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiPGVuY29kZWQgZmlsZSBzbmlwcGVkPlxuIgorLy91c2FnZTogICAgICAgIiQgdXVkZWNvZGUgYnVzeWJveCBidXN5Ym94ID4gYnVzeWJveC51dVxuIgorLy91c2FnZTogICAgICAgIiRcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCVNSQ19CVUZfU0laRSA9IDE1KjMsICAvKiBUaGlzICpNVVNUKiBiZSBhIG11bHRpcGxlIG9mIDMgKi8KKwlEU1RfQlVGX1NJWkUgPSA0ICogKChTUkNfQlVGX1NJWkUgKyAyKSAvIDMpLAorfTsKKworaW50IHV1ZW5jb2RlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1dWVuY29kZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3RhdF9idWY7CisJaW50IHNyY19mZCA9IFNURElOX0ZJTEVOTzsKKwljb25zdCBjaGFyICp0Ymw7CisJbW9kZV90IG1vZGU7CisJY2hhciBzcmNfYnVmW1NSQ19CVUZfU0laRV07CisJY2hhciBkc3RfYnVmW0RTVF9CVUZfU0laRSArIDFdOworCisJdGJsID0gYmJfdXVlbmNfdGJsX3N0ZDsKKwltb2RlID0gMDY2NiAmIH51bWFzaygwNjY2KTsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTo/MiI7IC8qIG11c3QgaGF2ZSAxIG9yIDIgYXJncyAqLworCWlmIChnZXRvcHQzMihhcmd2LCAibSIpKSB7CisJCXRibCA9IGJiX3V1ZW5jX3RibF9iYXNlNjQ7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzFdKSB7CisJCXNyY19mZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKwkJZnN0YXQoc3JjX2ZkLCAmc3RhdF9idWYpOworCQltb2RlID0gc3RhdF9idWYuc3RfbW9kZSAmIChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworCQlhcmd2Kys7CisJfQorCisJcHJpbnRmKCJiZWdpbiVzICVvICVzIiwgdGJsID09IGJiX3V1ZW5jX3RibF9zdGQgPyAiIiA6ICItYmFzZTY0IiwgbW9kZSwgKmFyZ3YpOworCXdoaWxlICgxKSB7CisJCXNpemVfdCBzaXplID0gZnVsbF9yZWFkKHNyY19mZCwgc3JjX2J1ZiwgU1JDX0JVRl9TSVpFKTsKKwkJaWYgKCFzaXplKQorCQkJYnJlYWs7CisJCWlmICgoc3NpemVfdClzaXplIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCS8qIEVuY29kZSB0aGUgYnVmZmVyIHdlIGp1c3QgcmVhZCBpbiAqLworCQliYl91dWVuY29kZShkc3RfYnVmLCBzcmNfYnVmLCBzaXplLCB0YmwpOworCQliYl9wdXRjaGFyKCdcbicpOworCQlpZiAodGJsID09IGJiX3V1ZW5jX3RibF9zdGQpIHsKKwkJCWJiX3B1dGNoYXIodGJsW3NpemVdKTsKKwkJfQorCQlmZmx1c2goc3Rkb3V0KTsKKwkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGRzdF9idWYsIDQgKiAoKHNpemUgKyAyKSAvIDMpKTsKKwl9CisJcHJpbnRmKHRibCA9PSBiYl91dWVuY190Ymxfc3RkID8gIlxuYFxuZW5kXG4iIDogIlxuPT09PVxuIik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvd2MuYyBiL2NvcmV1dGlscy93Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTBlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvd2MuYwpAQCAtMCwwICsxLDI0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogd2MgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudC4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvd2MuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFJld3JpdHRlbiB0byBmaXggYSBudW1iZXIgb2YgcHJvYmxlbXMgYW5kIGRvIHNvbWUgc2l6ZSBvcHRpbWl6YXRpb25zLgorICogUHJvYmxlbXMgaW4gdGhlIHByZXZpb3VzIGJ1c3lib3ggaW1wbGVtZW50YXRpb24gKGJlc2lkZXMgYmxvYXQpIGluY2x1ZGVkOgorICogIDEpIGJyb2tlbiAnd2MgLWMnIG9wdGltaXphdGlvbiAocmVhZCBub3RlIGJlbG93KQorICogIDIpIGJyb2tlbiBoYW5kbGluZyBvZiAnLScgYXJncworICogIDMpIG5vIGNoZWNraW5nIG9mIGZlcnJvciBvbiBFT0YgcmV0dXJucworICogIDQpIGlzcHJpbnQoKSB3YXNuJ3QgY29uc2lkZXJlZCB3aGVuIHdvcmQgY291bnRpbmcuCisgKgorICogTk9URVM6CisgKgorICogVGhlIHByZXZpb3VzIGJ1c3lib3ggd2MgYXR0ZW1wdGVkIGFuIG9wdGltaXphdGlvbiB1c2luZyBzdGF0IGZvciB0aGUKKyAqIGNhc2Ugb2YgY291bnRpbmcgY2hhcnMgb25seS4gIEkgb21pdHRlZCB0aGF0IGJlY2F1c2UgaXQgd2FzIGJyb2tlbi4KKyAqIEl0IGRpZG4ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2liaWxpdHkgb2YgaW5wdXQgY29taW5nIGZyb20gYQorICogcGlwZSwgb3IgaW5wdXQgZnJvbSBhIGZpbGUgd2l0aCBmaWxlIHBvaW50ZXIgbm90IGF0IHRoZSBiZWdpbm5pbmcuCisgKgorICogVG8gaW1wbGVtZW50IHN1Y2ggYSBzcGVlZCBvcHRpbWl6YXRpb24gY29ycmVjdGx5LCBub3Qgb25seSBkbyB5b3UKKyAqIG5lZWQgdGhlIHNpemUsIGJ1dCBhbHNvIHRoZSBmaWxlIHBvc2l0aW9uLiAgTm90ZSBhbHNvIHRoYXQgdGhlCisgKiBmaWxlIHBvc2l0aW9uIG1heSBiZSBwYXN0IHRoZSBlbmQgb2YgZmlsZS4gIENvbnNpZGVyIHRoZSBleGFtcGxlCisgKiAoYWRhcHRlZCBmcm9tIGV4YW1wbGUgaW4gZ251IHdjLmMpCisgKgorICogICAgICBlY2hvIGhlbGxvID4gL3RtcC90ZXN0ZmlsZSAmJgorICogICAgICAoZGQgaWJzPTFrIHNraXA9MSBjb3VudD0wICY+IC9kZXYvbnVsbDsgd2MgLWMpIDwgL3RtcC90ZXN0ZmlsZQorICoKKyAqIGZvciB3aGljaCAnd2MgLWMnIHNob3VsZCBvdXRwdXQgJzAnLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKyNpZiAhRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisjIHVuZGVmIGlzcHJpbnQKKyMgdW5kZWYgaXNzcGFjZQorIyBkZWZpbmUgaXNwcmludChjKSAoKHVuc2lnbmVkKSgoYykgLSAweDIwKSA8PSAoMHg3ZSAtIDB4MjApKQorIyBkZWZpbmUgaXNzcGFjZShjKSAoKGMpID09ICcgJykKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0NfTEFSR0UKKyMgZGVmaW5lIENPVU5UX1QgdW5zaWduZWQgbG9uZyBsb25nCisjIGRlZmluZSBDT1VOVF9GTVQgImxsdSIKKyNlbHNlCisjIGRlZmluZSBDT1VOVF9UIHVuc2lnbmVkCisjIGRlZmluZSBDT1VOVF9GTVQgInUiCisjZW5kaWYKKworLyogV2Ugc3VwcG9ydCAtbSBldmVuIHdoZW4gVU5JQ09ERV9TVVBQT1JUIGlzIG9mZiwKKyAqIHdlIGp1c3QgZG9uJ3QgYWR2ZXJ0aXNlIGl0IGluIGhlbHAgdGV4dCwKKyAqIHNpbmNlIGl0IGlzIHRoZSBzYW1lIGFzIC1jIGluIHRoaXMgY2FzZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgd2NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyJJRl9VTklDT0RFX1NVUFBPUlQoIm0iKSJsd0xdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgd2NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3VudCBsaW5lcywgd29yZHMsIGFuZCBieXRlcyBmb3IgZWFjaCBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ291bnQgYnl0ZXMiCisvL3VzYWdlOglJRl9VTklDT0RFX1NVUFBPUlQoCisvL3VzYWdlOiAgICAgIlxuCS1tCUNvdW50IGNoYXJhY3RlcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1sCUNvdW50IG5ld2xpbmVzIgorLy91c2FnZTogICAgICJcbgktdwlDb3VudCB3b3JkcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJUHJpbnQgbG9uZ2VzdCBsaW5lIGxlbmd0aCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgd2NfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgd2MgL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgIDMxICAgICAgNDYgICAgMTM2NSAvZXRjL3Bhc3N3ZFxuIgorCisvKiBPcmRlciBpcyBpbXBvcnRhbnQgaWYgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAqIGNvbHVtbiBvcmRlciBpbiAid2MgLWNtbHdMIiBvdXRwdXQ6CisgKi8KK2VudW0geworCVdDX0xJTkVTICAgID0gMCwgLyogLWwgKi8KKwlXQ19XT1JEUyAgICA9IDEsIC8qIC13ICovCisJV0NfVU5JQ0hBUlMgPSAyLCAvKiAtbSAqLworCVdDX0JZVEVTICAgID0gMywgLyogLWMgKi8KKwlXQ19MRU5HVEggICA9IDQsIC8qIC1MICovCisJTlVNX1dDUyAgICAgPSA1LAorfTsKKworaW50IHdjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3Y19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqYXJnOworCWNvbnN0IGNoYXIgKnN0YXJ0X2ZtdCA9ICIgJTkiQ09VTlRfRk1UICsgMTsKKwljb25zdCBjaGFyICpmbmFtZV9mbXQgPSAiICVzXG4iOworCUNPVU5UX1QgKnBjb3VudHM7CisJQ09VTlRfVCBjb3VudHNbTlVNX1dDU107CisJQ09VTlRfVCB0b3RhbHNbTlVNX1dDU107CisJaW50IG51bV9maWxlczsKKwlzbWFsbGludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgcHJpbnRfdHlwZTsKKworCWluaXRfdW5pY29kZSgpOworCisJcHJpbnRfdHlwZSA9IGdldG9wdDMyKGFyZ3YsICJsd21jTCIpOworCisJaWYgKHByaW50X3R5cGUgPT0gMCkgeworCQlwcmludF90eXBlID0gKDEgPDwgV0NfTElORVMpIHwgKDEgPDwgV0NfV09SRFMpIHwgKDEgPDwgV0NfQllURVMpOworCX0KKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghYXJndlswXSkgeworCQkqLS1hcmd2ID0gKGNoYXIgKikgYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCQlmbmFtZV9mbXQgPSAiXG4iOworCX0KKwlpZiAoIWFyZ3ZbMV0pIHsgLyogemVybyBvciBvbmUgZmlsZW5hbWU/ICovCisJCWlmICghKChwcmludF90eXBlLTEpICYgcHJpbnRfdHlwZSkpIC8qIGV4YWN0bHkgb25lIG9wdGlvbj8gKi8KKwkJCXN0YXJ0X2ZtdCA9ICIlIkNPVU5UX0ZNVDsKKwl9CisKKwltZW1zZXQodG90YWxzLCAwLCBzaXplb2YodG90YWxzKSk7CisKKwlwY291bnRzID0gY291bnRzOworCisJbnVtX2ZpbGVzID0gMDsKKwl3aGlsZSAoKGFyZyA9ICphcmd2KyspICE9IE5VTEwpIHsKKwkJRklMRSAqZnA7CisJCWNvbnN0IGNoYXIgKnM7CisJCXVuc2lnbmVkIHU7CisJCXVuc2lnbmVkIGxpbmVwb3M7CisJCXNtYWxsaW50IGluX3dvcmQ7CisKKwkJKytudW1fZmlsZXM7CisJCWZwID0gZm9wZW5fb3Jfd2Fybl9zdGRpbihhcmcpOworCQlpZiAoIWZwKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lbXNldChjb3VudHMsIDAsIHNpemVvZihjb3VudHMpKTsKKwkJbGluZXBvcyA9IDA7CisJCWluX3dvcmQgPSAwOworCisJCXdoaWxlICgxKSB7CisJCQlpbnQgYzsKKwkJCS8qIE91ciAtdyBkb2Vzbid0IG1hdGNoIEdOVSB3YyBleGFjdGx5Li4uIG9oIHdlbGwgKi8KKworCQkJYyA9IGdldGMoZnApOworCQkJaWYgKGMgPT0gRU9GKSB7CisJCQkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coYXJnKTsKKwkJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQlnb3RvIERPX0VPRjsgIC8qIFRyZWF0IGFuIEVPRiBhcyAnXHInLiAqLworCQkJfQorCisJCQkvKiBDYXRlciBmb3IgLWMgYW5kIC1tICovCisJCQkrK2NvdW50c1tXQ19CWVRFU107CisJCQlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTiAvKiBldmVyeSBieXRlIGlzIGEgbmV3IGNoYXIgKi8KKwkJCSB8fCAoYyAmIDB4YzApICE9IDB4ODAgLyogaXQgaXNuJ3QgYSAybmQrIGJ5dGUgb2YgYSBVbmljb2RlIGNoYXIgKi8KKwkJCSkgeworCQkJCSsrY291bnRzW1dDX1VOSUNIQVJTXTsKKwkJCX0KKworCQkJaWYgKGlzcHJpbnRfYXNjaWlvbmx5KGMpKSB7IC8qIEZJWE1FOiBub3QgdW5pY29kZS1hd2FyZSAqLworCQkJCSsrbGluZXBvczsKKwkJCQlpZiAoIWlzc3BhY2UoYykpIHsKKwkJCQkJaW5fd29yZCA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKHVuc2lnbmVkKShjIC0gOSkgPD0gNCkgeworCQkJCS8qIFx0ICA5CisJCQkJICogXG4gMTAKKwkJCQkgKiBcdiAxMQorCQkJCSAqIFxmIDEyCisJCQkJICogXHIgMTMKKwkJCQkgKi8KKwkJCQlpZiAoYyA9PSAnXHQnKSB7CisJCQkJCWxpbmVwb3MgPSAobGluZXBvcyB8IDcpICsgMTsKKwkJCQl9IGVsc2UgeyAgLyogJ1xuJywgJ1xyJywgJ1xmJywgb3IgJ1x2JyAqLworIERPX0VPRjoKKwkJCQkJaWYgKGxpbmVwb3MgPiBjb3VudHNbV0NfTEVOR1RIXSkgeworCQkJCQkJY291bnRzW1dDX0xFTkdUSF0gPSBsaW5lcG9zOworCQkJCQl9CisJCQkJCWlmIChjID09ICdcbicpIHsKKwkJCQkJCSsrY291bnRzW1dDX0xJTkVTXTsKKwkJCQkJfQorCQkJCQlpZiAoYyAhPSAnXHYnKSB7CisJCQkJCQlsaW5lcG9zID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWNvdW50c1tXQ19XT1JEU10gKz0gaW5fd29yZDsKKwkJCWluX3dvcmQgPSAwOworCQkJaWYgKGMgPT0gRU9GKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZwKTsKKworCQlpZiAodG90YWxzW1dDX0xFTkdUSF0gPCBjb3VudHNbV0NfTEVOR1RIXSkgeworCQkJdG90YWxzW1dDX0xFTkdUSF0gPSBjb3VudHNbV0NfTEVOR1RIXTsKKwkJfQorCQl0b3RhbHNbV0NfTEVOR1RIXSAtPSBjb3VudHNbV0NfTEVOR1RIXTsKKworIE9VVFBVVDoKKwkJLyogY29yZXV0aWxzIHdjIHRyaWVzIGhhcmQgdG8gcHJpbnQgcHJldHR5IGNvbHVtbnMKKwkJICogKHNhdmVzIHJlc3VsdHMgZm9yIGFsbCBmaWxlcywgZmluZHMgbWF4IGNvbCBsZW4gZXRjLi4uKQorCQkgKiB3ZSB3b24ndCB0cnkgdGhhdCBoYXJkLCBpdCB3aWxsIGJsb2F0IHVzIHRvbyBtdWNoICovCisJCXMgPSBzdGFydF9mbXQ7CisJCXUgPSAwOworCQlkbyB7CisJCQlpZiAocHJpbnRfdHlwZSAmICgxIDw8IHUpKSB7CisJCQkJcHJpbnRmKHMsIHBjb3VudHNbdV0pOworCQkJCXMgPSAiICU5IkNPVU5UX0ZNVDsgLyogT2suLi4gcmVzdG9yZSB0aGUgbGVhZGluZyBzcGFjZS4gKi8KKwkJCX0KKwkJCXRvdGFsc1t1XSArPSBwY291bnRzW3VdOworCQl9IHdoaWxlICgrK3UgPCBOVU1fV0NTKTsKKwkJcHJpbnRmKGZuYW1lX2ZtdCwgYXJnKTsKKwl9CisKKwkvKiBJZiBtb3JlIHRoYW4gb25lIGZpbGUgd2FzIHByb2Nlc3NlZCwgd2Ugd2FudCB0aGUgdG90YWxzLiAgVG8gc2F2ZSBzb21lCisJICogc3BhY2UsIHdlIHNldCB0aGUgcGNvdW50cyBwdHIgdG8gdGhlIHRvdGFscyBhcnJheS4gIFRoaXMgaGFzIHRoZSBzaWRlCisJICogZWZmZWN0IG9mIHRyYXNoaW5nIHRoZSB0b3RhbHMgYXJyYXkgYWZ0ZXIgb3V0cHV0dGluZyBpdCwgYnV0IHRoYXQncworCSAqIGlycmVsYXZlbnQgc2luY2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgaXQuICovCisJaWYgKG51bV9maWxlcyA+IDEpIHsKKwkJbnVtX2ZpbGVzID0gMDsgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaGVyZSBhZ2Fpbi4gKi8KKwkJYXJnID0gInRvdGFsIjsKKwkJcGNvdW50cyA9IHRvdGFsczsKKwkJLS1hcmd2OworCQlnb3RvIE9VVFBVVDsKKwl9CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvd2hvLmMgYi9jb3JldXRpbHMvd2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjOTI1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy93aG8uYwpAQCAtMCwwICsxLDEzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1pbmkgd2hvIGlzIHVzZWQgdG8gZGlzcGxheSB1c2VyIG5hbWUsIGxvZ2luIHRpbWUsCisgKiBpZGxlIHRpbWUgYW5kIGhvc3QgbmFtZS4KKyAqCisgKiBBdXRob3I6IERhIENoZW4gIDxkY2hlbkBheXJuZXR3b3Jrcy5jb20+CisgKgorICogVGhpcyBpcyBhIGZyZWUgZG9jdW1lbnQ7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOgorICogICAgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEFZUiBOZXR3b3JrcywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIEJCX0FVRElUIFNVU3YzIF9OT1RfIGNvbXBsaWFudCAtLSBtaXNzaW5nIG9wdGlvbnMgLWIsIC1kLCAtbCwgLW0sIC1wLCAtcSwgLXIsIC1zLCAtdCwgLVQsIC11OyBNaXNzaW5nIGFyZ3VtZW50ICdmaWxlJy4gICovCisKKy8vY29uZmlnOmNvbmZpZyBXSE8KKy8vY29uZmlnOiAgICAgIGJvb2wgIndobyIKKy8vY29uZmlnOiAgICAgIGRlZmF1bHQgeQorLy9jb25maWc6ICAgICAgZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKy8vY29uZmlnOiAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgd2hvIGlzIHVzZWQgdG8gc2hvdyB3aG8gaXMgbG9nZ2VkIG9uLgorCisvL2NvbmZpZzpjb25maWcgVVNFUlMKKy8vY29uZmlnOiAgICAgIGJvb2wgInVzZXJzIgorLy9jb25maWc6ICAgICAgZGVmYXVsdCB5CisvL2NvbmZpZzogICAgICBkZXBlbmRzIG9uIEZFQVRVUkVfVVRNUAorLy9jb25maWc6ICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICBQcmludCB1c2VycyBjdXJyZW50bHkgbG9nZ2VkIG9uLgorCisvL2FwcGxldDpJRl9VU0VSUyhBUFBMRVRfT0RETkFNRSh1c2Vycywgd2hvLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB1c2VycykpCisvL2FwcGxldDpJRl9XSE8oICBBUFBMRVQoICB3aG8sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfVVNFUlMpICs9IHdoby5vCisvL2tidWlsZDpsaWItJChDT05GSUdfV0hPKSArPSB3aG8ubworCisvL3VzYWdlOiNkZWZpbmUgdXNlcnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSB1c2Vyc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSB1c2VycyBjdXJyZW50bHkgbG9nZ2VkIG9uIgorCisvL3VzYWdlOiNkZWZpbmUgd2hvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFdIgorLy91c2FnZTojZGVmaW5lIHdob19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgd2hvIGlzIGxvZ2dlZCBvblxuIgorLy91c2FnZTogICAgICJcbgktYQlTaG93IGFsbCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyB2b2lkIGlkbGVfc3RyaW5nKGNoYXIgKnN0cjYsIHRpbWVfdCB0KQoreworCXQgPSB0aW1lKE5VTEwpIC0gdDsKKworCS8qaWYgKHQgPCA2MCkgeworCQlzdHI2WzBdID0gJy4nOworCQlzdHI2WzFdID0gJ1wwJzsKKwkJcmV0dXJuOworCX0qLworCWlmICh0ID49IDAgJiYgdCA8ICgyNCAqIDYwICogNjApKSB7CisJCXNwcmludGYoc3RyNiwgIiUwMmQ6JTAyZCIsCisJCQkJKGludCkgKHQgLyAoNjAgKiA2MCkpLAorCQkJCShpbnQpICgodCAlICg2MCAqIDYwKSkgLyA2MCkpOworCQlyZXR1cm47CisJfQorCXN0cmNweShzdHI2LCAib2xkIik7Cit9CisKK2ludCB3aG9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHdob19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXAgKnV0OworCXVuc2lnbmVkIG9wdDsKKwlpbnQgZG9fdXNlcnMgPSAoRU5BQkxFX1VTRVJTICYmICghRU5BQkxFX1dITyB8fCBhcHBsZXRfbmFtZVswXSA9PSAndScpKTsKKwljb25zdCBjaGFyICpmbXQgPSAiJXMiOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTAiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIGRvX3VzZXJzID8gIiIgOiAiYUgiKTsKKwlpZiAob3B0ICYgMikgLy8gLUgKKwkJcHJpbnRmKCJVU0VSXHRcdFRUWVx0XHRJRExFXHRUSU1FXHRcdCBIT1NUXG4iKTsKKworCXNldHV0ZW50KCk7CisJd2hpbGUgKCh1dCA9IGdldHV0ZW50KCkpICE9IE5VTEwpIHsKKwkJaWYgKHV0LT51dF91c2VyWzBdCisJCSAmJiAoKG9wdCAmIDEpIHx8IHV0LT51dF90eXBlID09IFVTRVJfUFJPQ0VTUykKKwkJKSB7CisJCQlpZiAoIWRvX3VzZXJzKSB7CisJCQkJY2hhciBzdHI2WzZdOworCQkJCWNoYXIgbmFtZVtzaXplb2YoIi9kZXYvIikgKyBzaXplb2YodXQtPnV0X2xpbmUpICsgMV07CisJCQkJc3RydWN0IHN0YXQgc3Q7CisJCQkJdGltZV90IHNlY29uZHM7CisKKwkJCQlzdHI2WzBdID0gJz8nOworCQkJCXN0cjZbMV0gPSAnXDAnOworCQkJCXN0cmNweShuYW1lLCAiL2Rldi8iKTsKKwkJCQlzYWZlX3N0cm5jcHkodXQtPnV0X2xpbmVbMF0gPT0gJy8nID8gbmFtZSA6IG5hbWUgKyBzaXplb2YoIi9kZXYvIiktMSwKKwkJCQkJdXQtPnV0X2xpbmUsCisJCQkJCXNpemVvZih1dC0+dXRfbGluZSkrMQorCQkJCSk7CisJCQkJaWYgKHN0YXQobmFtZSwgJnN0KSA9PSAwKQorCQkJCQlpZGxlX3N0cmluZyhzdHI2LCBzdC5zdF9hdGltZSk7CisJCQkJLyogbWFucGFnZXMgc2F5IHV0X3R2LnR2X3NlYyAqaXMqIHRpbWVfdCwKKwkJCQkgKiBidXQgc29tZSBzeXN0ZW1zIGhhdmUgaXQgd3JvbmcgKi8KKwkJCQlzZWNvbmRzID0gdXQtPnV0X3R2LnR2X3NlYzsKKwkJCQkvKiBIb3cgd2lkZSB0aW1lIGZpZWxkIGNhbiBiZT8KKwkJCQkgKiAiTm92IDEwIDE5OjMzOjIwIjogMTUgY2hhcnMKKwkJCQkgKiAiMjAxMC0xMS0xMCAxOTozMyI6IDE2IGNoYXJzCisJCQkJICovCisJCQkJcHJpbnRmKCIlLTE1LipzICUtMTUuKnMgJS03cyAlLTE2LjE2cyAlLipzXG4iLAorCQkJCQkJKGludClzaXplb2YodXQtPnV0X3VzZXIpLCB1dC0+dXRfdXNlciwKKwkJCQkJCShpbnQpc2l6ZW9mKHV0LT51dF9saW5lKSwgdXQtPnV0X2xpbmUsCisJCQkJCQlzdHI2LAorCQkJCQkJY3RpbWUoJnNlY29uZHMpICsgNCwKKwkJCQkJCShpbnQpc2l6ZW9mKHV0LT51dF9ob3N0KSwgdXQtPnV0X2hvc3QKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoZm10LCB1dC0+dXRfdXNlcik7CisJCQkJZm10ID0gIiAlcyI7CisJCQl9CisJCX0KKwl9CisJaWYgKGRvX3VzZXJzKQorCQliYl9wdXRjaGFyKCdcbicpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZW5kdXRlbnQoKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3dob2FtaS5jIGIvY29yZXV0aWxzL3dob2FtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjE3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvd2hvYW1pLmMKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB3aG9hbWkgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIE1hdGNoZXMgR05VIGJlaGF2aW9yLiAqLworCisvL3VzYWdlOiNkZWZpbmUgd2hvYW1pX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgd2hvYW1pX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgdGhlIHVzZXIgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgZWZmZWN0aXZlIHVzZXIgaWQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgd2hvYW1pX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3aG9hbWlfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAoYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogV2lsbCBjb21wbGFpbiBhbmQgZGllIGlmIHVzZXJuYW1lIG5vdCBmb3VuZCAqLworCXB1dHMoeHVpZDJ1bmFtZShnZXRldWlkKCkpKTsKKworCXJldHVybiBmZmx1c2hfYWxsKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMveWVzLmMgYi9jb3JldXRpbHMveWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3OTlmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy95ZXMuYwpAQCAtMCwwICsxLDQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB5ZXMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBNYXRjaGVzIEdOVSBiZWhhdmlvci4gKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTaXplIHJlZHVjdGlvbnMgYW5kIHJlbW92ZWQgcmVkdW5kYW50IGFwcGxldCBuYW1lIHByZWZpeCBmcm9tIGVycm9yIG1lc3NhZ2VzLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvL3VzYWdlOiNkZWZpbmUgeWVzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbU1RSSU5HXSIKKy8vdXNhZ2U6I2RlZmluZSB5ZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXBlYXRlZGx5IG91dHB1dCBhIGxpbmUgd2l0aCBTVFJJTkcsIG9yICd5JyIKKworaW50IHllc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgeWVzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqcHA7CisKKwlhcmd2WzBdID0gKGNoYXIqKSJ5IjsKKwlpZiAoYXJndlsxXSkKKwkJKythcmd2OworCisJZG8geworCQlwcCA9IGFyZ3Y7CisJCXdoaWxlICgxKSB7CisJCQlmcHV0cygqcHAsIHN0ZG91dCk7CisJCQlpZiAoISorK3BwKQorCQkJCWJyZWFrOworCQkJcHV0Y2hhcignICcpOworCQl9CisJfSB3aGlsZSAocHV0Y2hhcignXG4nKSAhPSBFT0YpOworCisJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKK30KZGlmZiAtLWdpdCBhL2RlYmlhbnV0aWxzL0NvbmZpZy5pbiBiL2RlYmlhbnV0aWxzL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGEwZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFudXRpbHMvQ29uZmlnLmluCkBAIC0wLDAgKzEsODYgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJEZWJpYW4gVXRpbGl0aWVzIgorCisKKworY29uZmlnIE1LVEVNUAorCWJvb2wgIm1rdGVtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta3RlbXAgaXMgdXNlZCB0byBjcmVhdGUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlcworCitjb25maWcgUElQRV9QUk9HUkVTUworCWJvb2wgInBpcGVfcHJvZ3Jlc3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRGlzcGxheSBhIGRvdCB0byBpbmRpY2F0ZSBwaXBlIGFjdGl2aXR5LgorCitjb25maWcgUlVOX1BBUlRTCisJYm9vbCAicnVuLXBhcnRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJ1bi1wYXJ0cyBpcyBhIHV0aWxpdHkgZGVzaWduZWQgdG8gcnVuIGFsbCB0aGUgc2NyaXB0cyBpbiBhIGRpcmVjdG9yeS4KKworCSAgSXQgaXMgdXNlZnVsIHRvIHNldCB1cCBhIGRpcmVjdG9yeSBsaWtlIGNyb24uZGFpbHksIHdoZXJlIHlvdSBuZWVkIHRvCisJICBleGVjdXRlIGFsbCB0aGUgc2NyaXB0cyBpbiB0aGF0IGRpcmVjdG9yeS4KKworCSAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBydW4tcGFydHMgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyByZXBvcnQKKwkgIG1vZGUpIGFyZSBub3QgaW1wbGVtZW50ZWQuCisKKwkgIFVubGVzcyB5b3Uga25vdyB0aGF0IHJ1bi1wYXJ0cyBpcyB1c2VkIGluIHNvbWUgb2YgeW91ciBzY3JpcHRzCisJICB5b3UgY2FuIHNhZmVseSBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJVTl9QQVJUUyAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHJ1bi1wYXJ0cyBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX1JVTl9QQVJUU19GQU5DWQorCWJvb2wgIlN1cHBvcnQgYWRkaXRpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5fUEFSVFMKKwloZWxwCisJICBTdXBwb3J0IGFkZGl0aW9uYWwgb3B0aW9uczoKKwkgIC1sIC0tbGlzdCBwcmludCB0aGUgbmFtZXMgb2YgdGhlIGFsbCBtYXRjaGluZyBmaWxlcyAobm90CisJICAgICAgICAgICAgbGltaXRlZCB0byBleGVjdXRhYmxlcyksIGJ1dCBkb24ndCBhY3R1YWxseSBydW4gdGhlbS4KKworY29uZmlnIFNUQVJUX1NUT1BfREFFTU9OCisJYm9vbCAic3RhcnQtc3RvcC1kYWVtb24iCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3RhcnQtc3RvcC1kYWVtb24gaXMgdXNlZCB0byBjb250cm9sIHRoZSBjcmVhdGlvbiBhbmQKKwkgIHRlcm1pbmF0aW9uIG9mIHN5c3RlbS1sZXZlbCBwcm9jZXNzZXMsIHVzdWFsbHkgdGhlIG9uZXMKKwkgIHN0YXJ0ZWQgZHVyaW5nIHRoZSBzdGFydHVwIG9mIHRoZSBzeXN0ZW0uCisKK2NvbmZpZyBGRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisJYm9vbCAiU3VwcG9ydCBhZGRpdGlvbmFsIGFyZ3VtZW50cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVJUX1NUT1BfREFFTU9OCisJaGVscAorCSAgU3VwcG9ydCBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKwkgIC1vfC0tb2tub2RvIGlnbm9yZWQgc2luY2Ugd2UgZXhpdCB3aXRoIDAgYW55d2F5CisJICAtdnwtLXZlcmJvc2UKKwkgIC1OfC0tbmljZWxldmVsIE4KKworY29uZmlnIEZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVJUX1NUT1BfREFFTU9OICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgc3RhcnQtc3RvcC1kYWVtb24gYXBwbGV0LgorCitjb25maWcgV0hJQ0gKKwlib29sICJ3aGljaCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3aGljaCBpcyB1c2VkIHRvIGZpbmQgcHJvZ3JhbXMgaW4geW91ciBQQVRIIGFuZAorCSAgcHJpbnQgb3V0IHRoZWlyIHBhdGhuYW1lcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvQ29uZmlnLnNyYyBiL2RlYmlhbnV0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjMDliNQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw4NSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiRGViaWFuIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBNS1RFTVAKKwlib29sICJta3RlbXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWt0ZW1wIGlzIHVzZWQgdG8gY3JlYXRlIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZXMKKworY29uZmlnIFBJUEVfUFJPR1JFU1MKKwlib29sICJwaXBlX3Byb2dyZXNzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIERpc3BsYXkgYSBkb3QgdG8gaW5kaWNhdGUgcGlwZSBhY3Rpdml0eS4KKworY29uZmlnIFJVTl9QQVJUUworCWJvb2wgInJ1bi1wYXJ0cyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW4tcGFydHMgaXMgYSB1dGlsaXR5IGRlc2lnbmVkIHRvIHJ1biBhbGwgdGhlIHNjcmlwdHMgaW4gYSBkaXJlY3RvcnkuCisKKwkgIEl0IGlzIHVzZWZ1bCB0byBzZXQgdXAgYSBkaXJlY3RvcnkgbGlrZSBjcm9uLmRhaWx5LCB3aGVyZSB5b3UgbmVlZCB0bworCSAgZXhlY3V0ZSBhbGwgdGhlIHNjcmlwdHMgaW4gdGhhdCBkaXJlY3RvcnkuCisKKwkgIEluIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgcnVuLXBhcnRzIHNvbWUgZmVhdHVyZXMgKHN1Y2ggYXMgcmVwb3J0CisJICBtb2RlKSBhcmUgbm90IGltcGxlbWVudGVkLgorCisJICBVbmxlc3MgeW91IGtub3cgdGhhdCBydW4tcGFydHMgaXMgdXNlZCBpbiBzb21lIG9mIHlvdXIgc2NyaXB0cworCSAgeW91IGNhbiBzYWZlbHkgc2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5fUEFSVFMgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBydW4tcGFydHMgYXBwbGV0LgorCitjb25maWcgRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1kKKwlib29sICJTdXBwb3J0IGFkZGl0aW9uYWwgYXJndW1lbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUlVOX1BBUlRTCisJaGVscAorCSAgU3VwcG9ydCBhZGRpdGlvbmFsIG9wdGlvbnM6CisJICAtbCAtLWxpc3QgcHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBhbGwgbWF0Y2hpbmcgZmlsZXMgKG5vdAorCSAgICAgICAgICAgIGxpbWl0ZWQgdG8gZXhlY3V0YWJsZXMpLCBidXQgZG9uJ3QgYWN0dWFsbHkgcnVuIHRoZW0uCisKK2NvbmZpZyBTVEFSVF9TVE9QX0RBRU1PTgorCWJvb2wgInN0YXJ0LXN0b3AtZGFlbW9uIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0YXJ0LXN0b3AtZGFlbW9uIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgY3JlYXRpb24gYW5kCisJICB0ZXJtaW5hdGlvbiBvZiBzeXN0ZW0tbGV2ZWwgcHJvY2Vzc2VzLCB1c3VhbGx5IHRoZSBvbmVzCisJICBzdGFydGVkIGR1cmluZyB0aGUgc3RhcnR1cCBvZiB0aGUgc3lzdGVtLgorCitjb25maWcgRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWQorCWJvb2wgIlN1cHBvcnQgYWRkaXRpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTVEFSVF9TVE9QX0RBRU1PTgorCWhlbHAKKwkgIFN1cHBvcnQgYWRkaXRpb25hbCBhcmd1bWVudHMuCisJICAtb3wtLW9rbm9kbyBpZ25vcmVkIHNpbmNlIHdlIGV4aXQgd2l0aCAwIGFueXdheQorCSAgLXZ8LS12ZXJib3NlCisJICAtTnwtLW5pY2VsZXZlbCBOCisKK2NvbmZpZyBGRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTVEFSVF9TVE9QX0RBRU1PTiAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHN0YXJ0LXN0b3AtZGFlbW9uIGFwcGxldC4KKworY29uZmlnIFdISUNICisJYm9vbCAid2hpY2giCisJZGVmYXVsdCB5CisJaGVscAorCSAgd2hpY2ggaXMgdXNlZCB0byBmaW5kIHByb2dyYW1zIGluIHlvdXIgUEFUSCBhbmQKKwkgIHByaW50IG91dCB0aGVpciBwYXRobmFtZXMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RlYmlhbnV0aWxzL0tidWlsZC5zcmMgYi9kZWJpYW51dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWI1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW51dGlscy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTQgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX01LVEVNUCkgICAgICAgICAgICArPSBta3RlbXAubworbGliLSQoQ09ORklHX1BJUEVfUFJPR1JFU1MpICAgICArPSBwaXBlX3Byb2dyZXNzLm8KK2xpYi0kKENPTkZJR19SVU5fUEFSVFMpICAgICAgICAgKz0gcnVuX3BhcnRzLm8KK2xpYi0kKENPTkZJR19TVEFSVF9TVE9QX0RBRU1PTikgKz0gc3RhcnRfc3RvcF9kYWVtb24ubworbGliLSQoQ09ORklHX1dISUNIKSAgICAgICAgICAgICArPSB3aGljaC5vCmRpZmYgLS1naXQgYS9kZWJpYW51dGlscy9ta3RlbXAuYyBiL2RlYmlhbnV0aWxzL21rdGVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2NiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW51dGlscy9ta3RlbXAuYwpAQCAtMCwwICsxLDk4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG1rdGVtcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgRGFuaWVsIEphY29ib3dpdHoKKyAqIFdyaXR0ZW4gYnkgRGFuaWVsIEphY29ib3dpdHogPGRhbkBkZWJpYW4ub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQ29yZXV0aWxzIDYuMTIgbWFuIHBhZ2Ugc2F5czoKKyAqICAgICAgICBta3RlbXAgW09QVElPTl0uLi4gW1RFTVBMQVRFXQorICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgb3IgZGlyZWN0b3J5LCBzYWZlbHksIGFuZCBwcmludCBpdHMgbmFtZS4gSWYKKyAqIFRFTVBMQVRFIGlzIG5vdCBzcGVjaWZpZWQsIHVzZSB0bXAuWFhYWFhYWFhYWC4KKyAqIC1kLCAtLWRpcmVjdG9yeQorICogICAgICAgIGNyZWF0ZSBhIGRpcmVjdG9yeSwgbm90IGEgZmlsZQorICogLXEsIC0tcXVpZXQKKyAqICAgICAgICBzdXBwcmVzcyBkaWFnbm9zdGljcyBhYm91dCBmaWxlL2Rpci1jcmVhdGlvbiBmYWlsdXJlCisgKiAtdSwgLS1kcnktcnVuCisgKiAgICAgICAgZG8gbm90IGNyZWF0ZSBhbnl0aGluZzsgbWVyZWx5IHByaW50IGEgbmFtZSAodW5zYWZlKQorICogLS10bXBkaXJbPURJUl0KKyAqICAgICAgICBpbnRlcnByZXQgVEVNUExBVEUgcmVsYXRpdmUgdG8gRElSLiBJZiBESVIgaXMgbm90IHNwZWNpZmllZCwKKyAqICAgICAgICB1c2UgICRUTVBESVIgaWYgc2V0LCBlbHNlIC90bXAuICBXaXRoIHRoaXMgb3B0aW9uLCBURU1QTEFURSBtdXN0CisgKiAgICAgICAgbm90IGJlIGFuIGFic29sdXRlIG5hbWUuIFVubGlrZSB3aXRoIC10LCBURU1QTEFURSBtYXkgY29udGFpbgorICogICAgICAgIHNsYXNoZXMsIGJ1dCBldmVuIGhlcmUsIG1rdGVtcCBzdGlsbCBjcmVhdGVzIG9ubHkgdGhlIGZpbmFsIGNvbS0KKyAqICAgICAgICBwb25lbnQuCisgKiAtcCBESVIgdXNlIERJUiBhcyBhIHByZWZpeDsgaW1wbGllcyAtdCBbZGVwcmVjYXRlZF0KKyAqIC10ICAgICBpbnRlcnByZXQgVEVNUExBVEUgYXMgYSBzaW5nbGUgZmlsZSBuYW1lIGNvbXBvbmVudCwgcmVsYXRpdmUgIHRvCisgKiAgICAgICAgYSAgZGlyZWN0b3J5OiAgJFRNUERJUiwgaWYgc2V0OyBlbHNlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHZpYQorICogICAgICAgIC1wOyBlbHNlIC90bXAgW2RlcHJlY2F0ZWRdCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rdGVtcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kdF0gWy1wIERJUl0gW1RFTVBMQVRFXSIKKy8vdXNhZ2U6I2RlZmluZSBta3RlbXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIG5hbWUgYmFzZWQgb24gVEVNUExBVEUgYW5kIHByaW50IGl0cyBuYW1lLlxuIgorLy91c2FnZTogICAgICAgIlRFTVBMQVRFIG11c3QgZW5kIHdpdGggWFhYWFhYIChlLmcuIFsvZGlyL11uYW1lWFhYWFhYKS5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaXRob3V0IFRFTVBMQVRFLCAtdCB0bXAuWFhYWFhYIGlzIGFzc3VtZWQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCU1ha2UgZGlyZWN0b3J5LCBub3QgZmlsZSIKKy8vLy91c2FnZTogICAiXG4JLXEJRmFpbCBzaWxlbnRseSBvbiBlcnJvcnMiIC0gd2UgaWdub3JlIHRoaXMgb3B0CisvL3VzYWdlOiAgICAgIlxuCS10CVByZXBlbmQgYmFzZSBkaXJlY3RvcnkgbmFtZSB0byBURU1QTEFURSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRElSCVVzZSBESVIgYXMgYSBiYXNlIGRpcmVjdG9yeSAoaW1wbGllcyAtdCkiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkJhc2UgZGlyZWN0b3J5IGlzOiAtcCBESVIsIGVsc2UgJFRNUERJUiwgZWxzZSAvdG1wIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBta3RlbXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbWt0ZW1wIC90bXAvdGVtcC5YWFhYWFhcbiIKKy8vdXNhZ2U6ICAgICAgICIvdG1wL3RlbXAubVdpTGpNXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC90ZW1wLm1XaUxqTVxuIgorLy91c2FnZTogICAgICAgIi1ydy0tLS0tLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgICAgICAgMCBBcHIgMjUgMTc6MTAgL3RtcC90ZW1wLm1XaUxqTVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IG1rdGVtcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWt0ZW1wX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpwYXRoOworCWNoYXIgKmNocDsKKwl1bnNpZ25lZCBvcHRzOworCWVudW0geworCQlPUFRfZCA9IDEgPDwgMCwKKwkJT1BUX3EgPSAxIDw8IDEsCisJCU9QVF90ID0gMSA8PCAyLAorCQlPUFRfcCA9IDEgPDwgMywKKwl9OworCisJcGF0aCA9IGdldGVudigiVE1QRElSIik7CisJaWYgKCFwYXRoIHx8IHBhdGhbMF0gPT0gJ1wwJykKKwkJcGF0aCA9ICIvdG1wIjsKKworCS8qIC1xIGlzIGlnbm9yZWQgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7IC8qIDEgYXJndW1lbnQgbWF4ICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJkcXRwOiIsICZwYXRoKTsKKworCWNocCA9IGFyZ3Zbb3B0aW5kXTsKKwlpZiAoIWNocCkgeworCQkvKiBHTlUgY29yZXV0aWxzIDguNDoKKwkJICogYmFyZSAibWt0ZW1wIiAtPiAibWt0ZW1wIC10IHRtcC5YWFhYWFgiCisJCSAqLworCQljaHAgPSB4c3RyZHVwKCJ0bXAuWFhYWFhYIik7CisJCW9wdHMgfD0gT1BUX3Q7CisJfQorCWlmIChvcHRzICYgKE9QVF90fE9QVF9wKSkKKwkJY2hwID0gY29uY2F0X3BhdGhfZmlsZShwYXRoLCBjaHApOworCisJaWYgKG9wdHMgJiBPUFRfZCkgeworCQlpZiAobWtkdGVtcChjaHApID09IE5VTEwpCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0gZWxzZSB7CisJCWlmIChta3N0ZW1wKGNocCkgPCAwKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwlwdXRzKGNocCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvcGlwZV9wcm9ncmVzcy5jIGIvZGViaWFudXRpbHMvcGlwZV9wcm9ncmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzQ0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW51dGlscy9waXBlX3Byb2dyZXNzLmMKQEAgLTAsMCArMSwzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTW9uaXRvciBhIHBpcGUgd2l0aCBhIHNpbXBsZSBwcm9ncmVzcyBkaXNwbGF5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PiwgSm9leSBIZXNzCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcGlwZV9wcm9ncmVzc190cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgcGlwZV9wcm9ncmVzc19mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFBJUEVfUFJPR1JFU1NfU0laRSA0MDk2CisKKy8qIFJlYWQgYSBibG9jayBvZiBkYXRhIGZyb20gc3RkaW4sIHdyaXRlIGl0IHRvIHN0ZG91dC4KKyAqIEFjdGl2aXR5IGlzIGluZGljYXRlZCBieSBhICcuJyB0byBzdGRlcnIKKyAqLworaW50IHBpcGVfcHJvZ3Jlc3NfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBpcGVfcHJvZ3Jlc3NfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyIGJ1ZltQSVBFX1BST0dSRVNTX1NJWkVdOworCXRpbWVfdCB0ID0gdGltZShOVUxMKTsKKwlpbnQgbGVuOworCisJd2hpbGUgKChsZW4gPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBidWYsIFBJUEVfUFJPR1JFU1NfU0laRSkpID4gMCkgeworCQl0aW1lX3QgbmV3X3RpbWUgPSB0aW1lKE5VTEwpOworCQlpZiAobmV3X3RpbWUgIT0gdCkgeworCQkJdCA9IG5ld190aW1lOworCQkJYmJfcHV0Y2hhcl9zdGRlcnIoJy4nKTsKKwkJfQorCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgbGVuKTsKKwl9CisKKwliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvcnVuX3BhcnRzLmMgYi9kZWJpYW51dGlscy9ydW5fcGFydHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNiZmMzCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFudXRpbHMvcnVuX3BhcnRzLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcnVuLXBhcnRzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIEJhc2VkIG9uIGEgb2xkZXIgdmVyc2lvbiB0aGF0IHdhcyBpbiBidXN5Ym94IHdoaWNoIHdhcyAxayBiaWcuLgorICogICBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgRW1hbnVlbGUgQWluYSA8ZW1hbnVlbGUuYWluYUB0aXNjYWxpLml0PgorICoKKyAqIEJhc2VkIG9uIHRoZSBEZWJpYW4gcnVuLXBhcnRzIHByb2dyYW0sIHZlcnNpb24gMS4xNQorICogICBDb3B5cmlnaHQgKEMpIDE5OTYgSmVmZiBOb3hvbiA8amVmZkByb3V0ZXIucGF0Y2gubmV0PiwKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgR3V5IE1hb3IgPG1hb3JAZGViaWFuLm9yZz4KKyAqCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBUaGlzIGlzIG15IGZpcnN0IGF0dGVtcHQgdG8gd3JpdGUgYSBwcm9ncmFtIGluIEMgKHdlbGwsIHRoaXMgaXMgbXkgZmlyc3QKKyAqIGF0dGVtcHQgdG8gd3JpdGUgYSBwcm9ncmFtISA6LSkgLiAqLworCisvKiBUaGlzIHBpZWNlIG9mIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBydW4tcGFydHMsCisgKiB0YWtlbiBmcm9tIGRlYmlhbi11dGlscy4gSSd2ZSBvbmx5IHJlbW92ZWQgdGhlIGxvbmcgb3B0aW9ucyBhbmQgYSB0aGUKKyAqIHJlcG9ydCBtb2RlLiBBcyB0aGUgb3JpZ2luYWwgcnVuLXBhcnRzIHN1cHBvcnQgb25seSBsb25nIG9wdGlvbnMsIEkndmUKKyAqIGJyb2tlbiBjb21wYXRpYmlsaXR5IGJlY2F1c2UgdGhlIEJ1c3lCb3ggcG9saWN5IGRvZXNuJ3QgYWxsb3cgdGhlbS4KKyAqIFRoZSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6CisgKiAtdCAgICAgICAgICAgdGVzdC4gUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGVzIHRvIGJlIGV4ZWN1dGVkLCB3aXRob3V0CisgKiAgICAgICAgICAgICAgZXhlY3V0ZSB0aGVtLgorICogLWEgQVJHICAgICAgIGFyZ3VtZW50LiBQYXNzIEFSRyBhcyBhbiBhcmd1bWVudCB0aGUgcHJvZ3JhbSBleGVjdXRlZC4gSXQgY2FuCisgKiAgICAgICAgICAgICAgYmUgcmVwZWF0ZWQgdG8gcGFzcyBtdWx0aXBsZSBhcmd1bWVudHMuCisgKiAtdSBNQVNLICAgICAgdW1hc2suIFNldCB0aGUgdW1hc2sgb2YgdGhlIHByb2dyYW0gZXhlY3V0ZWQgdG8gTUFTSy4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnVuX3BhcnRzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXRdICJJRl9GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSgiWy1sXSAiKSJbLWEgQVJHXSBbLXUgTUFTS10gRElSRUNUT1JZIgorLy91c2FnZTojZGVmaW5lIHJ1bl9wYXJ0c19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBhIGJ1bmNoIG9mIHNjcmlwdHMgaW4gRElSRUNUT1JZXG4iCisvL3VzYWdlOiAgICAgIlxuCS10CVByaW50IHdoYXQgd291bGQgYmUgcnVuLCBidXQgZG9uJ3QgYWN0dWFsbHkgcnVuIGFueXRoaW5nIgorLy91c2FnZTogICAgICJcbgktYSBBUkcJUGFzcyBBUkcgYXMgYXJndW1lbnQgZm9yIGV2ZXJ5IHByb2dyYW0iCisvL3VzYWdlOiAgICAgIlxuCS11IE1BU0sJU2V0IHRoZSB1bWFzayB0byBNQVNLIGJlZm9yZSBydW5uaW5nIGV2ZXJ5IHByb2dyYW0iCisvL3VzYWdlOglJRl9GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLWwJUHJpbnQgbmFtZXMgb2YgYWxsIG1hdGNoaW5nIGZpbGVzIGV2ZW4gaWYgdGhleSBhcmUgbm90IGV4ZWN1dGFibGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJ1bl9wYXJ0c19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBydW4tcGFydHMgLWEgc3RhcnQgL2V0Yy9pbml0LmRcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHJ1bi1wYXJ0cyAtYSBzdG9wPW5vdyAvZXRjL2luaXQuZFxuXG4iCisvL3VzYWdlOiAgICAgICAiTGV0J3MgYXNzdW1lIHlvdSBoYXZlIGEgc2NyaXB0IGZvby9kb3NvbWV0aGluZzpcbiIKKy8vdXNhZ2U6ICAgICAgICIjIS9iaW4vc2hcbiIKKy8vdXNhZ2U6ICAgICAgICJmb3IgaSBpbiAkKjsgZG8gZXZhbCAkaTsgZG9uZTsgdW5zZXQgaVxuIgorLy91c2FnZTogICAgICAgImNhc2UgXCIkMVwiIGluXG4iCisvL3VzYWdlOiAgICAgICAic3RhcnQqKSBlY2hvIHN0YXJ0aW5nIHNvbWV0aGluZzs7XG4iCisvL3VzYWdlOiAgICAgICAic3RvcCopIHNldCAteDsgc2h1dGRvd24gLWggJHN0b3A7O1xuIgorLy91c2FnZTogICAgICAgImVzYWNcblxuIgorLy91c2FnZTogICAgICAgIlJ1bm5pbmcgdGhpcyB5aWVsZHM6XG4iCisvL3VzYWdlOiAgICAgICAiJHJ1bi1wYXJ0cyAtYSBzdG9wPSs0bSBmb28vXG4iCisvL3VzYWdlOiAgICAgICAiKyBzaHV0ZG93biAtaCArNG0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciAqKm5hbWVzOworCWludCAgICBjdXI7CisJY2hhciAgKmNtZFsxXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIG5hbWVzIChHLm5hbWVzKQorI2RlZmluZSBjdXIgICAoRy5jdXIgICkKKyNkZWZpbmUgY21kICAgKEcuY21kICApCisKK2VudW0geyBOVU1fQ01EID0gKENPTU1PTl9CVUZTSVpFIC0gc2l6ZW9mKEcpKSAvIHNpemVvZihjbWRbMF0pIC0gMSB9OworCitlbnVtIHsKKwlPUFRfciA9ICgxIDw8IDApLAorCU9QVF9hID0gKDEgPDwgMSksCisJT1BUX3UgPSAoMSA8PCAyKSwKKwlPUFRfdCA9ICgxIDw8IDMpLAorCU9QVF9sID0gKDEgPDwgNCkgKiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1ksCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZCisjZGVmaW5lIGxpc3RfbW9kZSAob3B0aW9uX21hc2szMiAmIE9QVF9sKQorI2Vsc2UKKyNkZWZpbmUgbGlzdF9tb2RlIDAKKyNlbmRpZgorCisvKiBJcyB0aGlzIGEgdmFsaWQgZmlsZW5hbWUgKHVwcGVyL2xvd2VyIGFscGhhLCBkaWdpdHMsCisgKiB1bmRlcnNjb3JlcywgYW5kIGh5cGhlbnMgb25seT8pCisgKi8KK3N0YXRpYyBib29sIGludmFsaWRfbmFtZShjb25zdCBjaGFyICpjKQoreworCWMgPSBiYl9iYXNlbmFtZShjKTsKKworCXdoaWxlICgqYyAmJiAoaXNhbG51bSgqYykgfHwgKmMgPT0gJ18nIHx8ICpjID09ICctJykpCisJCWMrKzsKKworCXJldHVybiAqYzsgLyogVFJVRSAoITApIGlmIHRlcm1pbmF0aW5nIE5VTCBpcyBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgaW50IGJiX2FscGhhc29ydChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJaW50IHIgPSBzdHJjbXAoKihjaGFyICoqKSBwMSwgKihjaGFyICoqKSBwMik7CisJcmV0dXJuIChvcHRpb25fbWFzazMyICYgT1BUX3IpID8gLXIgOiByOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBhY3QoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsIHZvaWQgKmFyZ3MgVU5VU0VEX1BBUkFNLCBpbnQgZGVwdGgpCit7CisJaWYgKGRlcHRoID09IDEpCisJCXJldHVybiBUUlVFOworCisJaWYgKGRlcHRoID09IDIKKwkgJiYgKCAgIShzdGF0YnVmLT5zdF9tb2RlICYgKFNfSUZSRUcgfCBTX0lGTE5LKSkKKwkgICAgfHwgaW52YWxpZF9uYW1lKGZpbGUpCisJICAgIHx8ICghbGlzdF9tb2RlICYmIGFjY2VzcyhmaWxlLCBYX09LKSAhPSAwKSkKKwkpIHsKKwkJcmV0dXJuIFNLSVA7CisJfQorCisJbmFtZXMgPSB4cmVhbGxvY192ZWN0b3IobmFtZXMsIDQsIGN1cik7CisJbmFtZXNbY3VyKytdID0geHN0cmR1cChmaWxlKTsKKwkvKm5hbWVzW2N1cl0gPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKworCXJldHVybiBUUlVFOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgcnVucGFydHNfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJhcmdcMCIgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJhIgorCSJ1bWFza1wwIiAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJ0ZXN0XDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJ0IgorI2lmIEVOQUJMRV9GRUFUVVJFX1JVTl9QQVJUU19GQU5DWQorCSJsaXN0XDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJsIgorCSJyZXZlcnNlXDAiIE5vX2FyZ3VtZW50ICAgICAgICJyIgorLy9UT0RPOiAidmVyYm9zZVwwIiBOb19hcmd1bWVudCAgICAgICAidiIKKyNlbmRpZgorCTsKKyNlbmRpZgorCitpbnQgcnVuX3BhcnRzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBydW5fcGFydHNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnVtYXNrX3AgPSAiMjIiOworCWxsaXN0X3QgKmFyZ19saXN0ID0gTlVMTDsKKwl1bnNpZ25lZCBuOworCWludCByZXQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHJ1bnBhcnRzX2xvbmdvcHRzOworI2VuZGlmCisJLyogV2UgcmVxdWlyZSBleGFjdGx5IG9uZSBhcmd1bWVudDogdGhlIGRpcmVjdG9yeSBuYW1lICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6YTo6IjsKKwlnZXRvcHQzMihhcmd2LCAicmE6dTp0IklGX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZKCJsIiksICZhcmdfbGlzdCwgJnVtYXNrX3ApOworCisJdW1hc2soeHN0cnRvdV9yYW5nZSh1bWFza19wLCA4LCAwLCAwNzc3NykpOworCisJbiA9IDE7CisJd2hpbGUgKGFyZ19saXN0ICYmIG4gPCBOVU1fQ01EKSB7CisJCWNtZFtuKytdID0gbGxpc3RfcG9wKCZhcmdfbGlzdCk7CisJfQorCS8qIGNtZFtuXSA9IE5VTEw7IC0gaXMgYWxyZWFkeSB6ZXJvZWQgb3V0ICovCisKKwkvKiBydW4tcGFydHMgaGFzIHRvIHNvcnQgZXhlY3V0YWJsZXMgYnkgbmFtZSBiZWZvcmUgcnVubmluZyB0aGVtICovCisKKwlyZWN1cnNpdmVfYWN0aW9uKGFyZ3Zbb3B0aW5kXSwKKwkJCUFDVElPTl9SRUNVUlNFfEFDVElPTl9GT0xMT1dMSU5LUywKKwkJCWFjdCwgICAgICAgICAgICAvKiBmaWxlIGFjdGlvbiAqLworCQkJYWN0LCAgICAgICAgICAgIC8qIGRpciBhY3Rpb24gKi8KKwkJCU5VTEwsICAgICAgICAgICAvKiB1c2VyIGRhdGEgKi8KKwkJCTEgICAgICAgICAgICAgICAvKiBkZXB0aCAqLworCQkpOworCisJaWYgKCFuYW1lcykKKwkJcmV0dXJuIDA7CisKKwlxc29ydChuYW1lcywgY3VyLCBzaXplb2YoY2hhciAqKSwgYmJfYWxwaGFzb3J0KTsKKworCW4gPSAwOworCXdoaWxlICgxKSB7CisJCWNoYXIgKm5hbWUgPSAqbmFtZXMrKzsKKwkJaWYgKCFuYW1lKQorCQkJYnJlYWs7CisJCWlmIChvcHRpb25fbWFzazMyICYgKE9QVF90IHwgT1BUX2wpKSB7CisJCQlwdXRzKG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJY21kWzBdID0gbmFtZTsKKwkJcmV0ID0gc3Bhd25fYW5kX3dhaXQoY21kKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJY29udGludWU7CisJCW4gPSAxOworCQlpZiAocmV0IDwgMCkKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGV4ZWN1dGUgJyVzJyIsIG5hbWUpOworCQllbHNlIC8qIHJldCA+IDAgKi8KKwkJCWJiX2Vycm9yX21zZygiJXMgZXhpdGVkIHdpdGggY29kZSAlZCIsIG5hbWUsIHJldCAmIDB4ZmYpOworCX0KKworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvc3RhcnRfc3RvcF9kYWVtb24uYyBiL2RlYmlhbnV0aWxzL3N0YXJ0X3N0b3BfZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2MTk1OQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL3N0YXJ0X3N0b3BfZGFlbW9uLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgc3RhcnQtc3RvcC1kYWVtb24gaW1wbGVtZW50YXRpb24ocykgZm9yIGJ1c3lib3gKKyAqCisgKiBXcml0dGVuIGJ5IE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBpMTdsaW51eGIuaXN0cy5wd3Iud3JvYy5wbD4sCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IERhdmlkIEtpbWRvbiA8ZHdoZWRvbkBnb3JkaWFuLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCitUaGlzIGlzIGhvdyBpdCBpcyBzdXBwb3NlZCB0byB3b3JrOgorCitzdGFydC1zdG9wLWRhZW1vbiBbT1BUSU9OU10gWy0tc3RhcnR8LS1zdG9wXSBbWy0tXSBhcmd1bWVudHMuLi5dCisKK09uZSAob25seSkgb2YgdGhlc2UgbXVzdCBiZSBnaXZlbjoKKyAgICAgICAgLVMsLS1zdGFydCAgICAgICAgICAgICAgU3RhcnQKKyAgICAgICAgLUssLS1zdG9wICAgICAgICAgICAgICAgU3RvcAorCitTZWFyY2ggZm9yIG1hdGNoaW5nIHByb2Nlc3Nlcy4KK0lmIC0tc3RvcCBpcyBnaXZlbiwgc3RvcCBhbGwgbWF0Y2hpbmcgcHJvY2Vzc2VzIChieSBzZW5kaW5nIGEgc2lnbmFsKS4KK0lmIC0tc3RhcnQgaXMgZ2l2ZW4sIHN0YXJ0IGEgbmV3IHByb2Nlc3MgdW5sZXNzIGEgbWF0Y2hpbmcgcHJvY2VzcyB3YXMgZm91bmQuCisKK09wdGlvbnMgY29udHJvbGxpbmcgcHJvY2VzcyBtYXRjaGluZworKGlmIG11bHRpcGxlIGNvbmRpdGlvbnMgYXJlIHNwZWNpZmllZCwgYWxsIG11c3QgbWF0Y2gpOgorICAgICAgICAtdSwtLXVzZXIgVVNFUk5BTUV8VUlEICBPbmx5IGNvbnNpZGVyIHRoaXMgdXNlcidzIHByb2Nlc3NlcworICAgICAgICAtbiwtLW5hbWUgUFJPQ0VTU19OQU1FICBMb29rIGZvciBwcm9jZXNzZXMgYnkgbWF0Y2hpbmcgUFJPQ0VTU19OQU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggY29tbSBmaWVsZCBpbiAvcHJvYy8kUElEL3N0YXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYmFzZW5hbWUgaXMgY29tcGFyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudHBkIiA9PSAiLi9udHBkIiA9PSAiL3BhdGgvdG8vbnRwZCIuCitbVE9ETzogY2FuIFBST0NFU1NfTkFNRSBiZSBhIGZ1bGwgcGF0aG5hbWU/IFNob3VsZCB3ZSByZXF1aXJlIGZ1bGwgbWF0Y2ggdGhlbgord2l0aCAvcHJvYy8kUElEL2V4ZSBvciBhcmd2WzBdIChjb21tIGNhbid0IGJlIG1hdGNoZWQsIGl0IG5ldmVyIGNvbnRhaW5zIHBhdGgpXQorICAgICAgICAteCwtLWV4ZWMgRVhFQ1VUQUJMRSAgICBMb29rIGZvciBwcm9jZXNzZXMgdGhhdCB3ZXJlIHN0YXJ0ZWQgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgaW4gL3Byb2MvJFBJRC9jbWRsaW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmxpa2UgLW4sIHdlIG1hdGNoIGFnYWluc3QgdGhlIGZ1bGwgcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm50cGQiICE9ICIuL250cGQiICE9ICIvcGF0aC90by9udHBkIgorICAgICAgICAtcCwtLXBpZGZpbGUgUElEX0ZJTEUgICBMb29rIGZvciBwcm9jZXNzZXMgd2l0aCBQSUQgZnJvbSB0aGlzIGZpbGUKKworT3B0aW9ucyB3aGljaCBhcmUgdmFsaWQgZm9yIC0tc3RhcnQgb25seToKKyAgICAgICAgLXgsLS1leGVjIEVYRUNVVEFCTEUgICAgUHJvZ3JhbSB0byBydW4gKDFzdCBhcmcgb2YgZXhlY3ZwKS4gTWFuZGF0b3J5LgorICAgICAgICAtYSwtLXN0YXJ0YXMgTkFNRSAgICAgICBhcmd2WzBdIChkZWZhdWx0cyB0byBFWEVDVVRBQkxFKQorICAgICAgICAtYiwtLWJhY2tncm91bmQgICAgICAgICBQdXQgcHJvY2VzcyBpbnRvIGJhY2tncm91bmQKKyAgICAgICAgLU4sLS1uaWNlbGV2ZWwgTiAgICAgICAgQWRkIE4gdG8gcHJvY2VzcycgbmljZSBsZXZlbAorICAgICAgICAtYywtLWNodWlkIFVTRVJbOltHUlBdXSBDaGFuZ2UgdG8gc3BlY2lmaWVkIHVzZXIgW2FuZCBncm91cF0KKyAgICAgICAgLW0sLS1tYWtlLXBpZGZpbGUgICAgICAgV3JpdGUgUElEIHRvIHRoZSBwaWRmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib3RoIC1tIGFuZCAtcCBtdXN0IGJlIGdpdmVuISkKKworT3B0aW9ucyB3aGljaCBhcmUgdmFsaWQgZm9yIC0tc3RvcCBvbmx5OgorICAgICAgICAtcywtLXNpZ25hbCBTSUcgICAgICAgICBTaWduYWwgdG8gc2VuZCAoZGVmYXVsdDpURVJNKQorICAgICAgICAtdCwtLXRlc3QgICAgICAgICAgICAgICBFeGl0IHdpdGggc3RhdHVzIDAgaWYgcHJvY2VzcyBpcyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2UgZG9uJ3QgYWN0dWFsbHkgc3RhcnQgb3Igc3RvcCBkYWVtb25zKQorCitNaXNjIG9wdGlvbnM6CisgICAgICAgIC1vLC0tb2tub2RvICAgICAgICAgICAgIEV4aXQgd2l0aCBzdGF0dXMgMCBpZiBub3RoaW5nIGlzIGRvbmUKKyAgICAgICAgLXEsLS1xdWlldCAgICAgICAgICAgICAgUXVpZXQKKyAgICAgICAgLXYsLS12ZXJib3NlICAgICAgICAgICAgVmVyYm9zZQorKi8KKworLy91c2FnZTojZGVmaW5lIHN0YXJ0X3N0b3BfZGFlbW9uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gWy1TfC1LXSAuLi4gWy0tIEFSR1MuLi5dIgorLy91c2FnZTojZGVmaW5lIHN0YXJ0X3N0b3BfZGFlbW9uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VhcmNoIGZvciBtYXRjaGluZyBwcm9jZXNzZXMsIGFuZCB0aGVuXG4iCisvL3VzYWdlOiAgICAgICAiLUs6IHN0b3AgYWxsIG1hdGNoaW5nIHByb2Nlc3Nlcy5cbiIKKy8vdXNhZ2U6ICAgICAgICItUzogc3RhcnQgYSBwcm9jZXNzIHVubGVzcyBhIG1hdGNoaW5nIHByb2Nlc3MgaXMgZm91bmQuXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG5Qcm9jZXNzIG1hdGNoaW5nOiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11c2VyIFVTRVJOQU1FfFVJRAlNYXRjaCBvbmx5IHRoaXMgdXNlcidzIHByb2Nlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4sLS1uYW1lIE5BTUUJCU1hdGNoIHByb2Nlc3NlcyB3aXRoIE5BTUUiCisvL3VzYWdlOiAgICAgIlxuCQkJCWluIGNvbW0gZmllbGQgaW4gL3Byb2MvUElEL3N0YXQiCisvL3VzYWdlOiAgICAgIlxuCS14LC0tZXhlYyBFWEVDVVRBQkxFCU1hdGNoIHByb2Nlc3NlcyB3aXRoIHRoaXMgY29tbWFuZCIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJaW4gL3Byb2MvUElEL2NtZGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1wLC0tcGlkZmlsZSBGSUxFCU1hdGNoIGEgcHJvY2VzcyB3aXRoIFBJRCBmcm9tIHRoZSBmaWxlIgorLy91c2FnZTogICAgICJcbglBbGwgc3BlY2lmaWVkIGNvbmRpdGlvbnMgbXVzdCBtYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4tUyBvbmx5OiIKKy8vdXNhZ2U6ICAgICAiXG4JLXgsLS1leGVjIEVYRUNVVEFCTEUJUHJvZ3JhbSB0byBydW4iCisvL3VzYWdlOiAgICAgIlxuCS1hLC0tc3RhcnRhcyBOQU1FCVplcm90aCBhcmd1bWVudCIKKy8vdXNhZ2U6ICAgICAiXG4JLWIsLS1iYWNrZ3JvdW5kCQlCYWNrZ3JvdW5kIgorLy91c2FnZToJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLU4sLS1uaWNlbGV2ZWwgTglDaGFuZ2UgbmljZSBsZXZlbCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jaHVpZCBVU0VSWzpbR1JQXV0JQ2hhbmdlIHRvIHVzZXIvZ3JvdXAiCisvL3VzYWdlOiAgICAgIlxuCS1tLC0tbWFrZS1waWRmaWxlCVdyaXRlIFBJRCB0byB0aGUgcGlkZmlsZSBzcGVjaWZpZWQgYnkgLXAiCisvL3VzYWdlOiAgICAgIlxuLUsgb25seToiCisvL3VzYWdlOiAgICAgIlxuCS1zLC0tc2lnbmFsIFNJRwkJU2lnbmFsIHRvIHNlbmQiCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdGVzdAkJTWF0Y2ggb25seSwgZXhpdCB3aXRoIDAgaWYgYSBwcm9jZXNzIGlzIGZvdW5kIgorLy91c2FnZTogICAgICJcbk90aGVyOiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1koCisvL3VzYWdlOiAgICAgIlxuCS1vLC0tb2tub2RvCQlFeGl0IHdpdGggc3RhdHVzIDAgaWYgbm90aGluZyBpcyBkb25lIgorLy91c2FnZTogICAgICJcbgktdiwtLXZlcmJvc2UJCVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1xLC0tcXVpZXQJCVF1aWV0IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcblByb2Nlc3MgbWF0Y2hpbmc6IgorLy91c2FnZTogICAgICJcbgktdSBVU0VSTkFNRXxVSUQJTWF0Y2ggb25seSB0aGlzIHVzZXIncyBwcm9jZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuCS1uIE5BTUUJCU1hdGNoIHByb2Nlc3NlcyB3aXRoIE5BTUUiCisvL3VzYWdlOiAgICAgIlxuCQkJaW4gY29tbSBmaWVsZCBpbiAvcHJvYy9QSUQvc3RhdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXggRVhFQ1VUQUJMRQlNYXRjaCBwcm9jZXNzZXMgd2l0aCB0aGlzIGNvbW1hbmQiCisvL3VzYWdlOiAgICAgIlxuCQkJY29tbWFuZCBpbiAvcHJvYy9QSUQvY21kbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRklMRQkJTWF0Y2ggYSBwcm9jZXNzIHdpdGggUElEIGZyb20gdGhlIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCUFsbCBzcGVjaWZpZWQgY29uZGl0aW9ucyBtdXN0IG1hdGNoIgorLy91c2FnZTogICAgICJcbi1TIG9ubHk6IgorLy91c2FnZTogICAgICJcbgkteCBFWEVDVVRBQkxFCVByb2dyYW0gdG8gcnVuIgorLy91c2FnZTogICAgICJcbgktYSBOQU1FCQlaZXJvdGggYXJndW1lbnQiCisvL3VzYWdlOiAgICAgIlxuCS1iCQlCYWNrZ3JvdW5kIgorLy91c2FnZToJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLU4gTgkJQ2hhbmdlIG5pY2UgbGV2ZWwiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1jIFVTRVJbOltHUlBdXQlDaGFuZ2UgdG8gdXNlci9ncm91cCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JCVdyaXRlIFBJRCB0byB0aGUgcGlkZmlsZSBzcGVjaWZpZWQgYnkgLXAiCisvL3VzYWdlOiAgICAgIlxuLUsgb25seToiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNJRwkJU2lnbmFsIHRvIHNlbmQiCisvL3VzYWdlOiAgICAgIlxuCS10CQlNYXRjaCBvbmx5LCBleGl0IHdpdGggMCBpZiBhIHByb2Nlc3MgaXMgZm91bmQiCisvL3VzYWdlOiAgICAgIlxuT3RoZXI6IgorLy91c2FnZToJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLW8JCUV4aXQgd2l0aCBzdGF0dXMgMCBpZiBub3RoaW5nIGlzIGRvbmUiCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcQkJUXVpZXQiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworLyogT3ZlcnJpZGUgRU5BQkxFX0ZFQVRVUkVfUElERklMRSAqLworI2RlZmluZSBXQU5UX1BJREZJTEUgMQorI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0cnVjdCBwaWRfbGlzdCB7CisJc3RydWN0IHBpZF9saXN0ICpuZXh0OworCXBpZF90IHBpZDsKK307CisKK2VudW0geworCUNUWF9TVE9QICAgICAgID0gKDEgPDwgIDApLAorCUNUWF9TVEFSVCAgICAgID0gKDEgPDwgIDEpLAorCU9QVF9CQUNLR1JPVU5EID0gKDEgPDwgIDIpLCAvLyAtYgorCU9QVF9RVUlFVCAgICAgID0gKDEgPDwgIDMpLCAvLyAtcQorCU9QVF9URVNUICAgICAgID0gKDEgPDwgIDQpLCAvLyAtdAorCU9QVF9NQUtFUElEICAgID0gKDEgPDwgIDUpLCAvLyAtbQorCU9QVF9hICAgICAgICAgID0gKDEgPDwgIDYpLCAvLyAtYQorCU9QVF9uICAgICAgICAgID0gKDEgPDwgIDcpLCAvLyAtbgorCU9QVF9zICAgICAgICAgID0gKDEgPDwgIDgpLCAvLyAtcworCU9QVF91ICAgICAgICAgID0gKDEgPDwgIDkpLCAvLyAtdQorCU9QVF9jICAgICAgICAgID0gKDEgPDwgMTApLCAvLyAtYworCU9QVF94ICAgICAgICAgID0gKDEgPDwgMTEpLCAvLyAteAorCU9QVF9wICAgICAgICAgID0gKDEgPDwgMTIpLCAvLyAtcAorCU9QVF9PS05PRE8gICAgID0gKDEgPDwgMTMpICogRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1ksIC8vIC1vCisJT1BUX1ZFUkJPU0UgICAgPSAoMSA8PCAxNCkgKiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSwgLy8gLXYKKwlPUFRfTklDRUxFVkVMICA9ICgxIDw8IDE1KSAqIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZLCAvLyAtTgorfTsKKyNkZWZpbmUgUVVJRVQgKG9wdGlvbl9tYXNrMzIgJiBPUFRfUVVJRVQpCisjZGVmaW5lIFRFU1QgIChvcHRpb25fbWFzazMyICYgT1BUX1RFU1QpCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgcGlkX2xpc3QgKmZvdW5kX3Byb2NzOworCWNoYXIgKnVzZXJzcGVjOworCWNoYXIgKmNtZG5hbWU7CisJY2hhciAqZXhlY25hbWU7CisJY2hhciAqcGlkZmlsZTsKKwljaGFyICpleGVjbmFtZV9jbXBidWY7CisJdW5zaWduZWQgZXhlY25hbWVfc2l6ZW9mOworCWludCB1c2VyX2lkOworCXNtYWxsaW50IHNpZ25hbF9ucjsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIHVzZXJzcGVjICAgICAgICAgIChHLnVzZXJzcGVjICAgICAgICAgICAgKQorI2RlZmluZSBjbWRuYW1lICAgICAgICAgICAoRy5jbWRuYW1lICAgICAgICAgICAgICkKKyNkZWZpbmUgZXhlY25hbWUgICAgICAgICAgKEcuZXhlY25hbWUgICAgICAgICAgICApCisjZGVmaW5lIHBpZGZpbGUgICAgICAgICAgIChHLnBpZGZpbGUgICAgICAgICAgICAgKQorI2RlZmluZSB1c2VyX2lkICAgICAgICAgICAoRy51c2VyX2lkICAgICAgICAgICAgICkKKyNkZWZpbmUgc2lnbmFsX25yICAgICAgICAgKEcuc2lnbmFsX25yICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCXVzZXJfaWQgPSAtMTsgXAorCXNpZ25hbF9uciA9IDE1OyBcCit9IHdoaWxlICgwKQorCisjaWZkZWYgT0xERVJfVkVSU0lPTl9PRl9YCisvKiAteCwtLWV4ZWMgRVhFQ1VUQUJMRQorICogTG9vayBmb3IgcHJvY2Vzc2VzIHdpdGggbWF0Y2hpbmcgL3Byb2MvJFBJRC9leGUuCisgKiBNYXRjaCBpcyBwZXJmb3JtZWQgdXNpbmcgZGV2aWNlK2lub2RlLgorICovCitzdGF0aWMgaW50IHBpZF9pc19leGVjKHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyIGJ1ZltzaXplb2YoIi9wcm9jLyV1L2V4ZSIpICsgc2l6ZW9mKGludCkqM107CisKKwlzcHJpbnRmKGJ1ZiwgIi9wcm9jLyV1L2V4ZSIsICh1bnNpZ25lZClwaWQpOworCWlmIChzdGF0KGJ1ZiwgJnN0KSA8IDApCisJCXJldHVybiAwOworCWlmIChzdC5zdF9kZXYgPT0gZXhlY3N0YXQuc3RfZGV2CisJICYmIHN0LnN0X2lubyA9PSBleGVjc3RhdC5zdF9pbm8pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGlkX2lzX2V4ZWMocGlkX3QgcGlkKQoreworCXNzaXplX3QgYnl0ZXM7CisJY2hhciBidWZbc2l6ZW9mKCIvcHJvYy8ldS9jbWRsaW5lIikgKyBzaXplb2YoaW50KSozXTsKKworCXNwcmludGYoYnVmLCAiL3Byb2MvJXUvY21kbGluZSIsICh1bnNpZ25lZClwaWQpOworCWJ5dGVzID0gb3Blbl9yZWFkX2Nsb3NlKGJ1ZiwgRy5leGVjbmFtZV9jbXBidWYsIEcuZXhlY25hbWVfc2l6ZW9mKTsKKwlpZiAoYnl0ZXMgPiAwKSB7CisJCUcuZXhlY25hbWVfY21wYnVmW2J5dGVzXSA9ICdcMCc7CisJCXJldHVybiBzdHJjbXAoZXhlY25hbWUsIEcuZXhlY25hbWVfY21wYnVmKSA9PSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWRfaXNfbmFtZShwaWRfdCBwaWQpCit7CisJLyogL3Byb2MvUElEL3N0YXQgaXMgIlBJRCAoY29tbV8xNV9ieXRlc19tYXgpIC4uLiIgKi8KKwljaGFyIGJ1ZlszMl07IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKwljaGFyICpwLCAqcGU7CisKKwlzcHJpbnRmKGJ1ZiwgIi9wcm9jLyV1L3N0YXQiLCAodW5zaWduZWQpcGlkKTsKKwlpZiAob3Blbl9yZWFkX2Nsb3NlKGJ1ZiwgYnVmLCBzaXplb2YoYnVmKSAtIDEpIDwgMCkKKwkJcmV0dXJuIDA7CisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOyAvKiBwYXJhbm9pYSAqLworCXAgPSBzdHJjaHIoYnVmLCAnKCcpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJcGUgPSBzdHJyY2hyKCsrcCwgJyknKTsKKwlpZiAoIXBlKQorCQlyZXR1cm4gMDsKKwkqcGUgPSAnXDAnOworCS8qIHdlIHJlcXVpcmUgY29tbSB0byBtYXRjaCBhbmQgdG8gbm90IGJlIHRydW5jYXRlZCAqLworCS8qIGluIExpbnV4LCBpZiBjb21tIGlzIDE1IGNoYXJzLCBpdCBtYXkgYmUgYSB0cnVuY2F0ZWQKKwkgKiBuYW1lLCBzbyB3ZSBkb24ndCBhbGxvdyB0aGF0IHRvIG1hdGNoICovCisJaWYgKHN0cmxlbihwKSA+PSBDT01NX0xFTiAtIDEpIC8qIENPTU1fTEVOIGlzIDE2ICovCisJCXJldHVybiAwOworCXJldHVybiBzdHJjbXAocCwgY21kbmFtZSkgPT0gMDsKK30KKworc3RhdGljIGludCBwaWRfaXNfdXNlcihpbnQgcGlkKQoreworCXN0cnVjdCBzdGF0IHNiOworCWNoYXIgYnVmW3NpemVvZigiL3Byb2MvIikgKyBzaXplb2YoaW50KSozXTsKKworCXNwcmludGYoYnVmLCAiL3Byb2MvJXUiLCAodW5zaWduZWQpcGlkKTsKKwlpZiAoc3RhdChidWYsICZzYikgIT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChzYi5zdF91aWQgPT0gKHVpZF90KXVzZXJfaWQpOworfQorCitzdGF0aWMgdm9pZCBjaGVjayhpbnQgcGlkKQoreworCXN0cnVjdCBwaWRfbGlzdCAqcDsKKworCWlmIChleGVjbmFtZSAmJiAhcGlkX2lzX2V4ZWMocGlkKSkgeworCQlyZXR1cm47CisJfQorCWlmIChjbWRuYW1lICYmICFwaWRfaXNfbmFtZShwaWQpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHVzZXJzcGVjICYmICFwaWRfaXNfdXNlcihwaWQpKSB7CisJCXJldHVybjsKKwl9CisJcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSk7CisJcC0+bmV4dCA9IEcuZm91bmRfcHJvY3M7CisJcC0+cGlkID0gcGlkOworCUcuZm91bmRfcHJvY3MgPSBwOworfQorCitzdGF0aWMgdm9pZCBkb19waWRmaWxlKHZvaWQpCit7CisJRklMRSAqZjsKKwl1bnNpZ25lZCBwaWQ7CisKKwlmID0gZm9wZW5fZm9yX3JlYWQocGlkZmlsZSk7CisJaWYgKGYpIHsKKwkJaWYgKGZzY2FuZihmLCAiJXUiLCAmcGlkKSA9PSAxKQorCQkJY2hlY2socGlkKTsKKwkJZmNsb3NlKGYpOworCX0gZWxzZSBpZiAoZXJybm8gIT0gRU5PRU5UKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm9wZW4gcGlkZmlsZSAlcyIsIHBpZGZpbGUpOworfQorCitzdGF0aWMgdm9pZCBkb19wcm9jaW5pdCh2b2lkKQoreworCURJUiAqcHJvY2RpcjsKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwlpbnQgcGlkOworCisJaWYgKHBpZGZpbGUpIHsKKwkJZG9fcGlkZmlsZSgpOworCQlyZXR1cm47CisJfQorCisJcHJvY2RpciA9IHhvcGVuZGlyKCIvcHJvYyIpOworCisJcGlkID0gMDsKKwl3aGlsZSAoMSkgeworCQllcnJubyA9IDA7IC8qIGNsZWFyIGFueSBwcmV2aW91cyBlcnJvciAqLworCQllbnRyeSA9IHJlYWRkaXIocHJvY2Rpcik7CisvLyBUT0RPOiB0aGlzIGNoZWNrIGlzIHRvbyBnZW5lcmljLCBpdCdzIGJldHRlcgorLy8gdG8gY2hlY2sgZm9yIGV4YWN0IGVycm5vKHMpIHdoaWNoIG1lYW4gdGhhdCB3ZSBnb3Qgc3RhbGUgZW50cnkKKwkJaWYgKGVycm5vKSAvKiBTdGFsZSBlbnRyeSwgcHJvY2VzcyBoYXMgZGllZCBhZnRlciBvcGVuZGlyICovCisJCQljb250aW51ZTsKKwkJaWYgKCFlbnRyeSkgLyogRU9GLCBubyBtb3JlIGVudHJpZXMgKi8KKwkJCWJyZWFrOworCQlwaWQgPSBiYl9zdHJ0b3UoZW50cnktPmRfbmFtZSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8pIC8qIE5hTiAqLworCQkJY29udGludWU7CisJCWNoZWNrKHBpZCk7CisJfQorCWNsb3NlZGlyKHByb2NkaXIpOworCWlmICghcGlkKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90aGluZyBpbiAvcHJvYyAtIG5vdCBtb3VudGVkPyIpOworfQorCitzdGF0aWMgaW50IGRvX3N0b3Aodm9pZCkKK3sKKwljaGFyICp3aGF0OworCXN0cnVjdCBwaWRfbGlzdCAqcDsKKwlpbnQga2lsbGVkID0gMDsKKworCWlmIChjbWRuYW1lKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgd2hhdCA9IHhzdHJkdXAoY21kbmFtZSk7CisJCWlmICghRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHdoYXQgPSBjbWRuYW1lOworCX0gZWxzZSBpZiAoZXhlY25hbWUpIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB3aGF0ID0geHN0cmR1cChleGVjbmFtZSk7CisJCWlmICghRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHdoYXQgPSBleGVjbmFtZTsKKwl9IGVsc2UgaWYgKHBpZGZpbGUpIHsKKwkJd2hhdCA9IHhhc3ByaW50ZigicHJvY2VzcyBpbiBwaWRmaWxlICclcyciLCBwaWRmaWxlKTsKKwl9IGVsc2UgaWYgKHVzZXJzcGVjKSB7CisJCXdoYXQgPSB4YXNwcmludGYoInByb2Nlc3MoZXMpIG93bmVkIGJ5ICclcyciLCB1c2Vyc3BlYyk7CisJfSBlbHNlIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yLCBwbGVhc2UgcmVwb3J0Iik7CisJfQorCisJaWYgKCFHLmZvdW5kX3Byb2NzKSB7CisJCWlmICghUVVJRVQpCisJCQlwcmludGYoIm5vICVzIGZvdW5kOyBub25lIGtpbGxlZFxuIiwgd2hhdCk7CisJCWtpbGxlZCA9IC0xOworCQlnb3RvIHJldDsKKwl9CisJZm9yIChwID0gRy5mb3VuZF9wcm9jczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKGtpbGwocC0+cGlkLCBURVNUID8gMCA6IHNpZ25hbF9ucikgPT0gMCkgeworCQkJa2lsbGVkKys7CisJCX0gZWxzZSB7CisJCQliYl9wZXJyb3JfbXNnKCJ3YXJuaW5nOiBraWxsaW5nIHByb2Nlc3MgJXUiLCAodW5zaWduZWQpcC0+cGlkKTsKKwkJCXAtPnBpZCA9IDA7CisJCQlpZiAoVEVTVCkgeworCQkJCS8qIEV4YW1wbGU6IC1LIC0tdGVzdCAtLXBpZGZpbGUgUElERklMRSBkZXRlY3RlZAorCQkJCSAqIHRoYXQgUElERklMRSdzIHBpZCBkb2Vzbid0IGV4aXN0ICovCisJCQkJa2lsbGVkID0gLTE7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKwl9CisJaWYgKCFRVUlFVCAmJiBraWxsZWQpIHsKKwkJcHJpbnRmKCJzdG9wcGVkICVzIChwaWQiLCB3aGF0KTsKKwkJZm9yIChwID0gRy5mb3VuZF9wcm9jczsgcDsgcCA9IHAtPm5leHQpCisJCQlpZiAocC0+cGlkKQorCQkJCXByaW50ZigiICV1IiwgKHVuc2lnbmVkKXAtPnBpZCk7CisJCXB1dHMoIikiKTsKKwl9CisgcmV0OgorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZSh3aGF0KTsKKwlyZXR1cm4ga2lsbGVkOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBzdGFydF9zdG9wX2RhZW1vbl9sb25nb3B0c1tdIEFMSUdOMSA9CisJInN0b3BcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiSyIKKwkic3RhcnRcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJTIgorCSJiYWNrZ3JvdW5kXDAiICAgTm9fYXJndW1lbnQgICAgICAgImIiCisJInF1aWV0XDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkidGVzdFwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ0IgorCSJtYWtlLXBpZGZpbGVcMCIgTm9fYXJndW1lbnQgICAgICAgIm0iCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1kKKwkib2tub2RvXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJvIgorCSJ2ZXJib3NlXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJIm5pY2VsZXZlbFwwIiAgICBSZXF1aXJlZF9hcmd1bWVudCAiTiIKKyNlbmRpZgorCSJzdGFydGFzXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImEiCisJIm5hbWVcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAibiIKKwkic2lnbmFsXDAiICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJzIgorCSJ1c2VyXDAiICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInUiCisJImNodWlkXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiYyIKKwkiZXhlY1wwIiAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ4IgorCSJwaWRmaWxlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInAiCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1kKKwkicmV0cnlcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJSIgorI2VuZGlmCisJOworI2VuZGlmCisKK2ludCBzdGFydF9zdG9wX2RhZW1vbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3RhcnRfc3RvcF9kYWVtb25fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwljaGFyICpzaWduYW1lOworCWNoYXIgKnN0YXJ0YXM7CisJY2hhciAqY2h1aWQ7CisjaWZkZWYgT0xERVJfVkVSU0lPTl9PRl9YCisJc3RydWN0IHN0YXQgZXhlY3N0YXQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWQorLy8JY2hhciAqcmV0cnlfYXJnID0gTlVMTDsKKy8vCWludCByZXRyaWVzID0gLTE7CisJY2hhciAqb3B0X047CisjZW5kaWYKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHN0YXJ0X3N0b3BfZGFlbW9uX2xvbmdvcHRzOworI2VuZGlmCisKKwkvKiAtSyBvciAtUyBpcyByZXF1aXJlZDsgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJLyogLXAgaXMgcmVxdWlyZWQgaWYgLW0gaXMgZ2l2ZW4gKi8KKwkvKiAteHB1biAoYXQgbGVhc3Qgb25lKSBpcyByZXF1aXJlZCBpZiAtSyBpcyBnaXZlbiAqLworCS8qIC14YSAoYXQgbGVhc3Qgb25lKSBpcyByZXF1aXJlZCBpZiAtUyBpcyBnaXZlbiAqLworCS8qIC1xIHR1cm5zIG9mZiAtdiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIks6UzpLLS1TOlMtLUs6bT9wOks/eHB1bjpTP3hhIgorCQlJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKCJxLXYiKTsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiS1NicXRtYTpuOnM6dTpjOng6cDoiCisJCUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1koIm92TjpSOiIpLAorCQkmc3RhcnRhcywgJmNtZG5hbWUsICZzaWduYW1lLCAmdXNlcnNwZWMsICZjaHVpZCwgJmV4ZWNuYW1lLCAmcGlkZmlsZQorCQlJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKCwmb3B0X04pCisJCS8qIFdlIGFjY2VwdCBhbmQgaWdub3JlIC1SIDxwYXJhbT4gLyAtLXJldHJ5IDxwYXJhbT4gKi8KKwkJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgsTlVMTCkKKwkpOworCisJaWYgKG9wdCAmIE9QVF9zKSB7CisJCXNpZ25hbF9uciA9IGdldF9zaWdudW0oc2lnbmFtZSk7CisJCWlmIChzaWduYWxfbnIgPCAwKSBiYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKCEob3B0ICYgT1BUX2EpKQorCQlzdGFydGFzID0gZXhlY25hbWU7CisJaWYgKCFleGVjbmFtZSkgLyogaW4gY2FzZSAtYSBpcyBnaXZlbiBhbmQgLXggaXMgbm90ICovCisJCWV4ZWNuYW1lID0gc3RhcnRhczsKKwlpZiAoZXhlY25hbWUpIHsKKwkJRy5leGVjbmFtZV9zaXplb2YgPSBzdHJsZW4oZXhlY25hbWUpICsgMTsKKwkJRy5leGVjbmFtZV9jbXBidWYgPSB4bWFsbG9jKEcuZXhlY25hbWVfc2l6ZW9mICsgMSk7CisJfQorCisvLwlJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy8JCWlmIChyZXRyeV9hcmcpCisvLwkJCXJldHJpZXMgPSB4YXRvaV9wb3NpdGl2ZShyZXRyeV9hcmcpOworLy8JKQorCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAodXNlcnNwZWMpIHsKKwkJdXNlcl9pZCA9IGJiX3N0cnRvdSh1c2Vyc3BlYywgTlVMTCwgMTApOworCQlpZiAoZXJybm8pCisJCQl1c2VyX2lkID0geHVuYW1lMnVpZCh1c2Vyc3BlYyk7CisJfQorCS8qIEJvdGggc3RhcnQgYW5kIHN0b3AgbmVlZCB0byBrbm93IGN1cnJlbnQgcHJvY2Vzc2VzICovCisJZG9fcHJvY2luaXQoKTsKKworCWlmIChvcHQgJiBDVFhfU1RPUCkgeworCQlpbnQgaSA9IGRvX3N0b3AoKTsKKwkJcmV0dXJuIChvcHQgJiBPUFRfT0tOT0RPKSA/IDAgOiAoaSA8PSAwKTsKKwl9CisKKwlpZiAoRy5mb3VuZF9wcm9jcykgeworCQlpZiAoIVFVSUVUKQorCQkJcHJpbnRmKCIlcyBpcyBhbHJlYWR5IHJ1bm5pbmdcbiV1XG4iLCBleGVjbmFtZSwgKHVuc2lnbmVkKUcuZm91bmRfcHJvY3MtPnBpZCk7CisJCXJldHVybiAhKG9wdCAmIE9QVF9PS05PRE8pOworCX0KKworI2lmZGVmIE9MREVSX1ZFUlNJT05fT0ZfWAorCWlmIChleGVjbmFtZSkKKwkJeHN0YXQoZXhlY25hbWUsICZleGVjc3RhdCk7CisjZW5kaWYKKworCSotLWFyZ3YgPSBzdGFydGFzOworCWlmIChvcHQgJiBPUFRfQkFDS0dST1VORCkgeworI2lmIEJCX01NVQorCQliYl9kYWVtb25pemUoREFFTU9OX0RFVk5VTExfU1RESU8gKyBEQUVNT05fQ0xPU0VfRVhUUkFfRkRTKTsKKwkJLyogREFFTU9OX0RFVk5VTExfU1RESU8gaXMgc3VwZXJmbHVvdXMgLQorCQkgKiBpdCdzIGFsd2F5cyBkb25lIGJ5IGJiX2RhZW1vbml6ZSgpICovCisjZWxzZQorCQlwaWRfdCBwaWQgPSB4dmZvcmsoKTsKKwkJaWYgKHBpZCAhPSAwKSB7CisJCQkvKiBwYXJlbnQgKi8KKwkJCS8qIHdoeSBfZXhpdD8gdGhlIGNoaWxkIG1heSBoYXZlIGNoYW5nZWQgdGhlIHN0YWNrLAorCQkJICogc28gInJldHVybiAwIiBtYXkgZG8gYmFkIHRoaW5ncyAqLworCQkJX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCQkvKiBDaGlsZCAqLworCQlzZXRzaWQoKTsgLyogZGV0YWNoIGZyb20gY29udHJvbGxpbmcgdHR5ICovCisJCS8qIFJlZGlyZWN0IHN0ZGlvIHRvIC9kZXYvbnVsbCwgY2xvc2UgZXh0cmEgRkRzLgorCQkgKiBXZSBkbyBub3QgYWN0dWFsbHkgZGFlbW9uaXplIGJlY2F1c2Ugb2YgREFFTU9OX09OTFlfU0FOSVRJWkUgKi8KKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9ERVZOVUxMX1NURElPCisJCQkrIERBRU1PTl9DTE9TRV9FWFRSQV9GRFMKKwkJCSsgREFFTU9OX09OTFlfU0FOSVRJWkUsCisJCQlOVUxMIC8qIGFyZ3YsIHVudXNlZCAqLyApOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfTUFLRVBJRCkgeworCQkvKiBVc2VyIHdhbnRzIF91c18gdG8gbWFrZSB0aGUgcGlkZmlsZSAqLworCQl3cml0ZV9waWRmaWxlKHBpZGZpbGUpOworCX0KKwlpZiAob3B0ICYgT1BUX2MpIHsKKwkJc3RydWN0IGJiX3VpZGdpZF90IHVnaWQgPSB7IC0xLCAtMSB9OworCQlwYXJzZV9jaG93bl91c2VyZ3JvdXBfb3JfZGllKCZ1Z2lkLCBjaHVpZCk7CisJCWlmICh1Z2lkLmdpZCAhPSAoZ2lkX3QpIC0xKSB4c2V0Z2lkKHVnaWQuZ2lkKTsKKwkJaWYgKHVnaWQudWlkICE9ICh1aWRfdCkgLTEpIHhzZXR1aWQodWdpZC51aWQpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWQorCWlmIChvcHQgJiBPUFRfTklDRUxFVkVMKSB7CisJCS8qIFNldCBwcm9jZXNzIHByaW9yaXR5ICovCisJCWludCBwcmlvID0gZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwKSArIHhhdG9pX3JhbmdlKG9wdF9OLCBJTlRfTUlOLzIsIElOVF9NQVgvMik7CisJCWlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIHByaW8pIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRwcmlvcml0eSglZCkiLCBwcmlvKTsKKwkJfQorCX0KKyNlbmRpZgorCWV4ZWN2cChzdGFydGFzLCBhcmd2KTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIHN0YXJ0YXMpOworfQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvd2hpY2guYyBiL2RlYmlhbnV0aWxzL3doaWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZDU5OAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL3doaWNoLmMKQEAgLTAsMCArMSw5OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogV2hpY2ggaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgR2FicmllbCBTb21sbyA8c29tbG8gYXQgY211LmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEJhc2VkIG9uIHdoaWNoIGZyb20gZGViaWFudXRpbHMKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgd2hpY2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltDT01NQU5EXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB3aGljaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxvY2F0ZSBhIENPTU1BTkQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHdoaWNoX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHdoaWNoIGxvZ2luXG4iCisvL3VzYWdlOiAgICAgICAiL2Jpbi9sb2dpblxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHdoaWNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3aGljaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSUZfREVTS1RPUChpbnQgb3B0OykKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWNoYXIgKnBhdGg7CisJY2hhciAqcDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3Qgb25lIGFyZ3VtZW50ICovCisJSUZfREVTS1RPUChvcHQgPSkgZ2V0b3B0MzIoYXJndiwgImEiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIFRoaXMgbWF0Y2hlcyB3aGF0IGlzIHNlZW4gb24gZS5nLiB1YnVudHUuCisJICogIndoaWNoIiB0aGVyZSBpcyBhIHNoZWxsIHNjcmlwdC4gKi8KKwlwYXRoID0gZ2V0ZW52KCJQQVRIIik7CisJaWYgKCFwYXRoKSB7CisJCXBhdGggPSAoY2hhciopYmJfUEFUSF9yb290X3BhdGg7CisJCXB1dGVudihwYXRoKTsKKwkJcGF0aCArPSA1OyAvKiBza2lwICJQQVRIPSIgKi8KKwl9CisKKwlkbyB7CisjaWYgRU5BQkxFX0RFU0tUT1AKKy8qIE11Y2ggYmxvYXQganVzdCB0byBzdXBwb3J0IC1hICovCisJCWlmIChzdHJjaHIoKmFyZ3YsICcvJykpIHsKKwkJCWlmIChleGVjYWJsZV9maWxlKCphcmd2KSkgeworCQkJCXB1dHMoKmFyZ3YpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQl9IGVsc2UgeworCQkJY2hhciAqcGF0aDIgPSB4c3RyZHVwKHBhdGgpOworCQkJY2hhciAqdG1wID0gcGF0aDI7CisKKwkJCXAgPSBmaW5kX2V4ZWNhYmxlKCphcmd2LCAmdG1wKTsKKwkJCWlmICghcCkKKwkJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQllbHNlIHsKKyBwcmludDoKKwkJCQlwdXRzKHApOworCQkJCWZyZWUocCk7CisJCQkJaWYgKG9wdCkgeworCQkJCQkvKiAtYTogc2hvdyBtYXRjaGVzIGluIGFsbCBQQVRIIGNvbXBvbmVudHMgKi8KKwkJCQkJaWYgKHRtcCkgeworCQkJCQkJcCA9IGZpbmRfZXhlY2FibGUoKmFyZ3YsICZ0bXApOworCQkJCQkJaWYgKHApCisJCQkJCQkJZ290byBwcmludDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZyZWUocGF0aDIpOworCQl9CisjZWxzZQorLyogSnVzdCBpZ25vcmluZyAtYSAqLworCQlpZiAoc3RyY2hyKCphcmd2LCAnLycpKSB7CisJCQlpZiAoZXhlY2FibGVfZmlsZSgqYXJndikpIHsKKwkJCQlwdXRzKCphcmd2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNoYXIgKnBhdGgyID0geHN0cmR1cChwYXRoKTsKKwkJCWNoYXIgKnRtcCA9IHBhdGgyOworCQkJcCA9IGZpbmRfZXhlY2FibGUoKmFyZ3YsICZ0bXApOworCQkJZnJlZShwYXRoMik7CisJCQlpZiAocCkgeworCQkJCXB1dHMocCk7CisJCQkJZnJlZShwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisjZW5kaWYKKwl9IHdoaWxlICgqKCsrYXJndikgIT0gTlVMTCk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kb2NzL1NlcmlhbC1Qcm9ncmFtbWluZy1IT1dUTy50eHQgYi9kb2NzL1NlcmlhbC1Qcm9ncmFtbWluZy1IT1dUTy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzOTU0YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPLnR4dApAQCAtMCwwICsxLDQyNCBAQAorRG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cubGFmbi5vcmcvfmRhdmUvbGludXgvU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPLnR4dAorU2VlbXMgdG8gYmUgc29tZXdoYXQgb2xkLCBidXQgY29udGFpbnMgdXNlZnVsIGJpdHMgZm9yIGdldHR5LmMgaGFja2luZworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFRoZSBMaW51eCBTZXJpYWwgUHJvZ3JhbW1pbmcgSE9XVE8sIFBhcnQgMSBvZiAyCisgIEJ5IFZlcm5vbiBDLiBIb3hpZQorICB2Mi4wIDEwIFNlcHRlbWJlciAxOTk5CisKKyAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHByb2dyYW0gY29tbXVuaWNhdGlvbnMgd2l0aCBkZXZpY2VzCisgIG92ZXIgYSBzZXJpYWwgcG9ydCBvbiBhIExpbnV4IGJveC4KKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIFRhYmxlIG9mIENvbnRlbnRzCisKKyAgMS4gQ29weXJpZ2h0CisKKyAgMi4gSW50cm9kdWN0aW9uCisKKyAgMy4gT3BlbmluZworCisgIDQuIENvbW1hbmRzCisKKyAgNS4gQ2hhbmdpbmcgQmF1ZCBSYXRlcworCisgIDYuIEFkZGl0aW9uYWwgQ29udHJvbCBDYWxscworCisgICAgIDYuMSBTZW5kaW5nIGEgImJyZWFrIi4KKyAgICAgNi4yIEhhcmR3YXJlIGZsb3cgY29udHJvbC4KKyAgICAgNi4zIEZsdXNoaW5nIEkvTyBidWZmZXJzLgorCisgIDcuIE1vZGVtIGNvbnRyb2wKKworICA4LiBQcm9jZXNzIEdyb3VwcworCisgICAgIDguMSBTZXNzaW9ucworICAgICA4LjIgUHJvY2VzcyBHcm91cHMKKyAgICAgOC4zIENvbnRyb2xsaW5nIFRlcm1pbmFsCisgICAgICAgIDguMy4xIEdldCB0aGUgZm9yZWdyb3VuZCBncm91cCBwcm9jZXNzIGlkLgorICAgICAgICA4LjMuMiBTZXQgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBpZCBvZiBhIHRlcm1pbmFsLgorICAgICAgICA4LjMuMyBHZXQgcHJvY2VzcyBncm91cCBpZC4KKworICA5LiBMb2NrZmlsZXMKKworICAxMC4gQWRkaXRpb25hbCBJbmZvcm1hdGlvbgorCisgIDExLiBGZWVkYmFjaworCisgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAxLiAgQ29weXJpZ2h0CisKKyAgVGhlIExpbnV4IFNlcmlhbC1Qcm9ncmFtbWluZy1IT1dUTyBpcyBjb3B5cmlnaHQgKEMpIDE5OTcgYnkgVmVybm9uCisgIEhveGllLiAgTGludXggSE9XVE8gZG9jdW1lbnRzIG1heSBiZSByZXByb2R1Y2VkIGFuZCBkaXN0cmlidXRlZCBpbgorICB3aG9sZSBvciBpbiBwYXJ0LCBpbiBhbnkgbWVkaXVtIHBoeXNpY2FsIG9yIGVsZWN0cm9uaWMsIGFzIGxvbmcgYXMKKyAgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIG9uIGFsbCBjb3BpZXMuIENvbW1lcmNpYWwKKyAgcmVkaXN0cmlidXRpb24gaXMgYWxsb3dlZCBhbmQgZW5jb3VyYWdlZDsgaG93ZXZlciwgdGhlIGF1dGhvciB3b3VsZAorICBsaWtlIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBzdWNoIGRpc3RyaWJ1dGlvbnMuCisKKyAgQWxsIHRyYW5zbGF0aW9ucywgZGVyaXZhdGl2ZSB3b3Jrcywgb3IgYWdncmVnYXRlIHdvcmtzIGluY29ycG9yYXRpbmcKKyAgdGhpcyBMaW51eCBIT1dUTyBkb2N1bWVudCBtdXN0IGJlIGNvdmVyZWQgdW5kZXIgdGhpcyBjb3B5cmlnaHQgbm90aWNlLgorICBUaGF0IGlzLCB5b3UgbWF5IG5vdCBwcm9kdWNlIGEgZGVyaXZhdGl2ZSB3b3JrIGZyb20gdGhpcyBIT1dUTyBhbmQKKyAgaW1wb3NlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIG9uIGl0cyBkaXN0cmlidXRpb24uCisKKyAgVGhpcyB2ZXJzaW9uIGlzIGEgY29tcGxldGUgcmV3cml0ZSBvZiB0aGUgcHJldmlvdXMgU2VyaWFsLVByb2dyYW1taW5nLQorICBIT1dUTyAgYnkgUGV0ZXIgSC4gQmF1bWFubiwgIDxtYWlsdG86UGV0ZXIuQmF1bWFubkBkbHIuZGU+CisKKyAgMi4gIEludHJvZHVjdGlvbgorCisgIFRoaXMgSE9XVE8gd2lsbCBhdHRlbXB0IHRvIGdpdmUgaGludHMgYWJvdXQgaG93IHRvIHdyaXRlIGEgcHJvZ3JhbQorICB3aGljaCBuZWVkcyB0byBhY2Nlc3MgYSBzZXJpYWwgcG9ydC4gIEl0cyBwcmluY2lwYWwgZm9jdXMgd2lsbCBiZSBvbgorICB0aGUgTGludXggaW1wbGVtZW50YXRpb24gYW5kIHdoYXQgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgbGlicmFyeQorICBmdW5jdGlvbnMgYXZhaWxhYmxlLgorCisgIFNvbWVvbmUgYXNrZWQgYWJvdXQgd2hpY2ggb2Ygc2V2ZXJhbCBzZXF1ZW5jZXMgb2Ygb3BlcmF0aW9ucyB3YXMKKyAgcmlnaHQuICBUaGVyZSBpcyBubyBhYnNvbHV0ZSByaWdodCB3YXkgdG8gYWNjb21wbGlzaCBhbiBvdXRjb21lLiAgVGhlCisgIG9wdGlvbnMgYXZhaWxhYmxlIGFyZSB0b28gbnVtZXJvdXMuICBJZiB5b3VyIHNlcXVlbmNlcyBwcm9kdWNlcyB0aGUKKyAgZGVzaXJlZCByZXN1bHRzLCB0aGVuIHRoYXQgaXMgdGhlIHJpZ2h0IHdheSBmb3IgeW91LiAgQW5vdGhlcgorICBwcm9ncmFtbWVyIG1heSBzZWxlY3QgYW5vdGhlciBzZXQgb2Ygb3B0aW9ucyBhbmQgZ2V0IHRoZSBzYW1lIHJlc3VsdHMuCisgIEhpcyBtZXRob2QgaXMgcmlnaHQgZm9yIGhpbS4KKworICBOZWl0aGVyIG9mIHRoZXNlIG1ldGhvZHMgbWF5IG9wZXJhdGUgcHJvcGVybHkgd2l0aCBzb21lIG90aGVyCisgIGltcGxlbWVudGF0aW9uIG9mIFVOSVguICBJdCBpcyBzdHJhbmdlIHRoYXQgbWFueSBvZiB0aGUgY29uY2VwdHMgd2hpY2gKKyAgd2VyZSBpbXBsZW1lbnRlZCBpbiB0aGUgU1lTViB2ZXJzaW9uIGhhdmUgYmVlbiBkdW1wZWQuICBCZWNhdXNlIFVOSVgKKyAgd2FzIGRldmVsb3BlZCBieSBBVCZUIGFuZCBtdWNoIGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkIG9uIHRob3NlCisgIGNvbmNlcHRzLCB0aGUgQVQmVCB2ZXJzaW9uIHNob3VsZCBiZSB0aGUgc3RhbmRhcmQgdG8gd2hpY2ggb3RoZXJzCisgIHNob3VsZCBlbXVsYXRlLgorCisgIE5vdyB0aGUgc3RhbmRhcmQgaXMgUE9TSVguCisKKyAgSXQgd2FzIG9uY2Ugc3RhdGVkIHRoYXQgdGhlIHBvcHVsYXJpdHkgb2YgVU5JWCBhbmQgQyB3YXMgdGhhdCB0aGV5CisgIHdlcmUgY3JlYXRlZCBieSBwcm9ncmFtbWVycyBmb3IgcHJvZ3JhbW1lcnMuICBOb3QgYnkgc2Nob2xhcnMgd2hvCisgIGluc2lzdCBvbiBwdXJpdHkgb2Ygc3R5bGUgaW4gZGVmZXJlbmNlIHRvIHJlc3VsdHMgYW5kIHNpbXBsaWNpdHkgb2YKKyAgdXNlLiAgTm90IGJ5IGNvbW1pdHRlZXMgd2l0aCBwZW9wbGUgd2hvIGhhdmUgZGl2ZXJzZSBwZXJzb25hbCBvcgorICBwcm9wcmlldGFyeSBhZ2VuZGEuICBOb3cgQU5TSSBhbmQgUE9TSVggaGF2ZSBzdHJheWVkIGZyb20gdGhvc2UKKyAgb3JpZ2luYWwgY2xlYXIgYW5kIHNpbXBseSBjb25jZXB0cy4KKworICAzLiAgT3BlbmluZworCisgIFRoZSB2YXJpb3VzIHNlcmlhbCBkZXZpY2VzIGFyZSBvcGVuZWQganVzdCBhcyBhbnkgb3RoZXIgZmlsZS4KKyAgQWx0aG91Z2gsIHRoZSBmb3BlbigzKSBjb21tYW5kIG1heSBiZSB1c2VkLCB0aGUgcGxhaW4gb3BlbigyKSBpcworICBwcmVmZXJyZWQuICBUaGlzIGNhbGwgcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIHdoaWNoIGlzIHJlcXVpcmVkCisgIGZvciB0aGUgdmFyaW91cyBjb21tYW5kcyB0aGF0IGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlLgorCisgIE9wZW4oMikgaGFzIHRoZSBmb3JtYXQ6CisKKyAgICAgICAjaW5jbHVkZSA8ZmNudGwuaD4KKyAgICAgICBpbnQgb3BlbihjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIFtpbnQgbW9kZV0pOworCisgIEluIGFkZGl0aW9uIHRvIHRoZSBvYnZpb3VzIE9fUkRXUiwgT19XUk9OTFkgYW5kIE9fUkRPTkxZLCB0d28KKyAgYWRkaXRpb25hbCBmbGFncyBhcmUgYXZhaWxhYmxlLiAgVGhlc2UgYXJlIE9fTk9OQkxPQ0sgYW5kIE9fTk9DVFRZLgorICBPdGhlciBmbGFncyBsaXN0ZWQgaW4gdGhlIG9wZW4oMikgbWFudWFsIHBhZ2UgYXJlIG5vdCBhcHBsaWNhYmxlIHRvCisgIHNlcmlhbCBkZXZpY2VzLgorCisgIE5vcm1hbGx5LCBhIHNlcmlhbCBkZXZpY2Ugb3BlbnMgaW4gImJsb2NraW5nIiBtb2RlLiAgVGhpcyBtZWFucyB0aGF0CisgIHRoZSBvcGVuKCkgd2lsbCBub3QgcmV0dXJuIHVudGlsIHRoZSBDYXJyaWVyIERldGVjdCBsaW5lIGZyb20gdGhlIHBvcnQKKyAgaXMgYWN0aXZlLCBlLmcuIG1vZGVtLCBpcyBhY3RpdmUuICBXaGVuIG9wZW5lZCB3aXRoIHRoZSBPX05PTkJMT0NLCisgIGZsYWcgc2V0LCB0aGUgb3BlbigpIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cworICBvZiB0aGUgRENEIGxpbmUuICBUaGUgImJsb2NraW5nIiBtb2RlIGFsc28gYWZmZWN0cyB0aGUgcmVhZCgpIGNhbGwuCisKKyAgVGhlIGZjbnRsKDIpIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBPX05PTkJMT0NLIGZsYWcgYW55dGltZQorICBhZnRlciB0aGUgZGV2aWNlIGhhcyBiZWVuIG9wZW5lZC4KKworICBUaGUgZGV2aWNlIGRyaXZlciBhbmQgdGhlIGRhdGEgcGFzc2luZyB0aHJvdWdoIGl0IGFyZSBjb250cm9sbGVkCisgIGFjY29yZGluZyB0byBzZXR0aW5ncyBpbiB0aGUgc3RydWN0IHRlcm1pb3MuICBUaGlzIHN0cnVjdHVyZSBpcworICBkZWZpbmVkIGluICIvdXNyL2luY2x1ZGUvdGVybWlvcy5oIi4gIEluIHRoZSBMaW51eCB0cmVlLCBmdXJ0aGVyCisgIHJlZmVyZW5jZSBpcyBtYWRlIHRvICIvdXNyL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgiLgorICBJbiBibG9ja2luZyBtb2RlLCBhIHJlYWQoMikgd2lsbCBibG9jayB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSBvciBhCisgIHNpZ25hbCBpcyByZWNlaXZlZC4gIEl0IGlzIHN0aWxsIHN1YmplY3QgdG8gc3RhdGUgb2YgdGhlIElDQU5PTiBmbGFnLgorCisgIFdoZW4gdGhlIHRlcm1pb3MuY19sZmxhZyBJQ0FOT04gYml0IGlzIHNldCwgaW5wdXQgZGF0YSBpcyBjb2xsZWN0ZWQKKyAgaW50byBzdHJpbmdzIHVudGlsIGEgTkwsIEVPRiBvciBFT0wgY2hhcmFjdGVyIGlzIHJlY2VpdmVkLiAgWW91IGNhbgorICBkZWZpbmUgdGhlc2UgaW4gdGhlIHRlcm1pb3MuY19jY1tdIGFycmF5LiAgQWxzbywgRVJBU0UgYW5kIEtJTEwKKyAgY2hhcmFjdGVycyB3aWxsIG9wZXJhdGUgb24gdGhlIGluY29taW5nIGRhdGEgYmVmb3JlIGl0IGlzIGRlbGl2ZXJlZCB0bworICB0aGUgdXNlci4KKworICBJbiBub24tY2Fub25pY2FsIG1vZGUsIGluY29taW5nIGRhdGEgaXMgcXVhbnRpZmllZCBieSB1c2Ugb2YgdGhlCisgIGNfY2NbVk1JTiBhbmQgY19jY1tWVElNRV0gdmFsdWVzIGluIHRlcm1pb3MuY19jY1tdLgorCisgIFNvbWUgcHJvZ3JhbW1lcnMgdXNlIHRoZSBzZWxlY3QoKSBjYWxsIHRvIGRldGVjdCB0aGUgY29tcGxldGlvbiBvZiBhCisgIHJlYWQoKS4gIFRoaXMgaXMgbm90IHRoZSBiZXN0IHdheSBvZiBjaGVja2luZyBmb3IgaW5jb21pbmcgZGF0YS4KKyAgU2VsZWN0KCkgaXMgcGFydCBvZiB0aGUgU09DS0VUUyBzY2hlbWUgYW5kIHRvbyBjb21wbGV4IGZvciBtb3N0CisgIGFwcGxpY2F0aW9ucy4KKworICBBIGZ1bGwgZXhwbGFuYXRpb24gb2YgdGhlIGZpZWxkcyBvZiB0aGUgdGVybWlvcyBzdHJ1Y3R1cmUgaXMgY29udGFpbmVkCisgIGluIHRlcm1pb3MoNykgb2YgdGhlIFVzZXJzIE1hbnVhbC4gIEEgdmVyc2lvbiBpcyBpbmNsdWRlZCBpbiBQYXJ0IDIgb2YKKyAgdGhpcyBIT1dUTyBkb2N1bWVudC4KKworICA0LiAgQ29tbWFuZHMKKworICBDaGFuZ2VzIHRvIHRoZSBzdHJ1Y3QgdGVybWlvcyBhcmUgbWFkZSBieSByZXRyaWV2aW5nIHRoZSBjdXJyZW50CisgIHNldHRpbmdzLCBtYWtpbmcgdGhlIGRlc2lyZWQgY2hhbmdlcyBhbmQgdHJhbnNtaXR0aW5nIHRoZSBtb2RpZmllZAorICBzdHJ1Y3R1cmUgYmFjayB0byB0aGUga2VybmVsLgorCisgIFRoZSBoaXN0b3JpYyBtZWFucyBvZiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGtlcm5lbCB3YXMgYnkgdXNlIG9mIHRoZQorICBpb2N0bChmZCwgQ09NTUFORCwgYXJnKSBzeXN0ZW0gY2FsbC4gIFRoZW4gdGhlIHB1cmlzdHMgaW4gdGhlCisgIGNvbXB1dGVyIGluZHVzdHJ5IGRlY2lkZWQgdGhhdCB0aGlzIHdhcyBub3QgZ2VuZXRpY2FsbHkgY29uc2lzdGVudC4KKyAgVGhlaXIgYXJndW1lbnQgd2FzIHRoYXQgdGhlIGFyZ3VtZW50IGNoYW5nZWQgaXRzIHN0cmlwZXMuICBTb21ldGltZXMKKyAgaXQgd2FzIGFuIGludCwgc29tZXRpbWVzIGl0IHdhcyBhIHBvaW50ZXIgdG8gaW50IGFuZCBvdGhlciB0aW1lcyBpdAorICB3YXMgYSBwb2ludGVyIHRvIHN0cnVjdCB0ZXJtaW9zLiAgVGhlbiB0aGVyZSB3ZXJlIHRob3NlIHRpbWVzIGl0IHdhcworICBlbXB0eSBvciBOVUxMLiAgVGhlc2UgdmFyaWF0aW9ucyBhcmUgZGVwZW5kZW50IHVwb24gdGhlIENPTU1BTkQuCisKKyAgQXMgYSBhbHRlcm5hdGl2ZSwgdGhlIHRjKiBzZXJpZXMgb2YgZnVuY3Rpb25zIHdlcmUgY29uY29jdGVkLgorCisgIFRoZXNlIGFyZToKKworICAgICAgIGludCB0Y2dldGF0dHIoaW50IGZpbGVkZXMsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zX3ApOworICAgICAgIGludCB0Y3NldGF0dHIoaW50IGZpbGVkZXMsIGludCBvcHRpb25hbF9hY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCk7CisKKyAgaW5zdGVhZCBvZjoKKworICAgICAgIGludCBpb2N0bChpbnQgZmlsZWRlcywgaW50IGNvbW1hbmQsCisgICAgICAgICAgICAgICAgIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zX3ApOworCisgIHdoZXJlIGNvbW1hbmQgaXMgVENHRVRTIG9yIG9uZSBvZiBUQ1NFVFMsIFRDU0VUU1cgb3IgVENTRVRTRi4KKworICBUaGUgVENTRVRTIGNvbW1hbmQgaXMgY29tcGFyYWJsZSB0byB0aGUgVENTQU5PVyBvcHRpb25hbF9hY3Rpb24gZm9yCisgIHRoZSB0YyogdmVyc2lvbi4gIFRoZXNlIGRpcmVjdCB0aGUga2VybmVsIHRvIGFkb3B0IHRoZSBjaGFuZ2VzCisgIGltbWVkaWF0ZWx5LiAgT3RoZXIgcGFpcnMgYXJlOgorCisgICAgY29tbWFuZCAgIG9wdGlvbmFsX2FjdGlvbiAgIE1lYW5pbmcKKyAgICBUQ1NFVFNXICAgVENTQURSQUlOICAgICAgICAgQ2hhbmdlIGFmdGVyIGFsbCBvdXRwdXQgaGFzIGRyYWluZWQuCisgICAgVENTRVRTRiAgIFRDU0FGTFVTSCAgICAgICAgIENoYW5nZSBhZnRlciBhbGwgb3V0cHV0IGhhcyBkcmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGlzY2FyZCBhbnkgaW5wdXQgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmVhZC4KKworICBTaW5jZSB0aGUgcmV0dXJuIGNvZGUgZnJvbSBlaXRoZXIgdGhlIGlvY3RsKDIpIG9yIHRoZSB0Y3NldGF0dHIoMikKKyAgY29tbWFuZHMgb25seSBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdhcyBwcm9jZXNzZWQgYnkgdGhlIGtlcm5lbC4KKyAgVGhlc2UgZG8gbm90IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSBjaGFuZ2VzIHdlcmUgYWN0dWFsbHkKKyAgYWNjb21wbGlzaGVkLiAgRWl0aGVyIG9mIHRoZXNlIGNvbW1hbmRzIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGNhbGwKKyAgdG86CisKKyAgICAgICBpb2N0bChmZCwgVENHRVRTLCAmbmV3X3Rlcm1pb3MpOworCisgIG9yOgorCisgICAgICAgdGNnZXRhdHRyKGZkLCAmbmV3X3Rlcm1pb3MpOworCisgIEEgdXNlciBmdW5jdGlvbiB3aGljaCBtYWtlcyBjaGFuZ2VzIHRvIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZSBzaG91bGQKKyAgZGVmaW5lIHR3byBzdHJ1Y3QgdGVybWlvcyB2YXJpYWJsZXMuICBPbmUgb2YgdGhlc2UgdmFyaWFibGVzIHNob3VsZAorICBjb250YWluIHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24uICBUaGUgb3RoZXIgc2hvdWxkIGNvbnRhaW4gYSBjb3B5IG9mCisgIHRoZSBrZXJuZWxzIHZlcnNpb24uICBUaGVuIGFmdGVyIHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4KKyAgc2VudCB0byB0aGUga2VybmVsLCBhbm90aGVyIGNhbGwgc2hvdWxkIGJlIG1hZGUgdG8gcmV0cmlldmUgdGhlCisgIGtlcm5lbHMgdmVyc2lvbi4gIFRoZW4gdGhlIHR3byBjb21wYXJlZC4KKworICBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZCBSVFMvQ1RTIGZsb3cgY29udHJvbDoKKworICAgICAgIHN0cnVjdCB0ZXJtaW9zIG15X3Rlcm1pb3M7CisgICAgICAgc3RydWN0IHRlcm1pb3MgbmV3X3Rlcm1pb3M7CisKKyAgICAgICB0Y2dldGF0dHIoZmQsICZteV90ZXJtaW9zKTsKKyAgICAgICBteV90ZXJtaW9zLmNfZmxhZyB8PSBDUlRTQ1RTOworICAgICAgIHRjc2V0YXR0cihmZCwgVENTQU5PVywgJm15X3Rlcm1pb3MpOworICAgICAgIHRjZ2V0YXR0cihmZCwgJm5ld190ZXJtaW9zKTsKKyAgICAgICBpZiAobWVtY21wKG15X3Rlcm1pb3MsIG5ld190ZXJtaW9zLAorICAgICAgICAgICAgc2l6ZW9mKG15X3Rlcm1pb3MpKSAhPSAwKSB7CisgICAgICAgICAgIC8qIGRvIHNvbWUgZXJyb3IgaGFuZGxpbmcgKi8KKyAgICAgICB9CisKKyAgNS4gIENoYW5naW5nIEJhdWQgUmF0ZXMKKworICBXaXRoIExpbnV4LCB0aGUgYmF1ZCByYXRlIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIGEgdGVjaG5pcXVlIHNpbWlsYXIgdG8KKyAgYWRkL2RlbGV0ZSBSVFMvQ1RTLgorCisgIHN0cnVjdCB0ZXJtaW9zIG15X3Rlcm1pb3M7CisgIHN0cnVjdCB0ZXJtaW9zIG5ld190ZXJtaW9zOworCisgIHRjZ2V0YXR0cihmZCwgJm15X3Rlcm1pb3MpOworICBteV90ZXJtaW9zLmNfZmxhZyAmPSB+Q0JBVUQ7CisgIG15X3Rlcm1pb3MuY19mbGFnIHw9IEIxOTIwMDsKKyAgdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmbXlfdGVybWlvcyk7CisgIHRjZ2V0YXR0cihmZCwgJm5ld190ZXJtaW9zKTsKKyAgaWYgKG1lbWNtcChteV90ZXJtaW9zLCBuZXdfdGVybWlvcywKKyAgICAgICBzaXplb2YobXlfdGVybWlvcykpICE9IDApIHsKKyAgICAgIC8qIGRvIHNvbWUgZXJyb3IgaGFuZGxpbmcgKi8KKyAgfQorCisgIFBPU0lYIGFkZHMgYW5vdGhlciBtZXRob2QuICBUaGV5IGRlZmluZToKKworICAgICAgIHNwZWVkX3QgY2ZnZXRpc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCk7CisgICAgICAgc3BlZWRfdCBjZmdldG9zcGVlZChjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wKTsKKworICBsaWJyYXJ5IGNhbGxzIHRvIGV4dHJhY3QgdGhlIGN1cnJlbnQgaW5wdXQgb3Igb3V0cHV0IHNwZWVkIGZyb20gdGhlCisgIHN0cnVjdCB0ZXJtaW9zIHBvaW50ZWQgdG8gd2l0aCAqdGVybWlvX3AuICBUaGlzIGlzIGEgdmFyaWFibGUgZGVmaW5lZAorICBpbiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgSW4gcHJhY3RpY2UsIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzCisgIHRlcm1pb3MsIHNob3VsZCBiZSBvYnRhaW5lZCBieSB0aGUgdGNnZXRhdHRyKCkgY2FsbCBvciBhbiBpb2N0bCgpIGNhbGwKKyAgdXNpbmcgdGhlIFRDR0VUUyBjb21tYW5kLgorCisgIFRoZSBjb21wYW5pb24gbGlicmFyeSBjYWxscyBhcmU6CisKKyAgICAgICBpbnQgY2ZzZXRpc3BlZWQoc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCwgc3BlZWRfdCBzcGVlZCk7CisgICAgICAgaW50IGNmc2V0b3NwZWVkKHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zX3AsIHNwZWVkX3Qgc3BlZWQpOworCisgIHdoaWNoIGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGJhdWQgcmF0ZSBpbiB0aGUgbG9jYWxseQorICBkZWZpbmVkICp0ZXJtaW9zX3AuICBGb2xsb3dpbmcgZWl0aGVyIG9mIHRoZXNlIGNhbGxzLCBlaXRoZXIgYSBjYWxsIHRvCisgIHRjc2V0YXR0cigpIG9yIGlvY3RsKCkgd2l0aCBvbmUgb2YgVENTRVRTLCBUQ1NFVFNXIG9yIFRDU0VUU0YgYXMgdGhlCisgIGNvbW1hbmQgdG8gdHJhbnNtaXQgdGhlIGNoYW5nZSB0byB0aGUga2VybmVsLgorCisgIFRoZSBjZiogY29tbWFuZHMgYXJlIHByZWZlcnJlZCBmb3IgcG9ydGFiaWxpdHkuICBTb21lIHdlaXJkIFVuaWNlcyB1c2UKKyAgYSBjb25zaWRlcmFibHkgZGlmZmVyZW50IGZvcm1hdCBvZiB0ZXJtaW9zLgorCisgIE1vc3QgaW1wbGVtZW50YXRpb25zIG9mIExpbnV4IHVzZSBvbmx5IHRoZSBpbnB1dCBzcGVlZCBmb3IgYm90aCBpbnB1dAorICBhbmQgb3V0cHV0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIGJ5CisgIHJlZmVyZW5jZSB0byA8dGVybWlvcy5oPi4gIEluIHJlYWxpdHksIHRoZXkgYXJlIGluCisgIC91c3IvaW5jbHVkZS9hc20vdGVybWJpdHMuaC4KKworICA2LiAgQWRkaXRpb25hbCBDb250cm9sIENhbGxzCisKKyAgNi4xLiAgU2VuZGluZyBhICJicmVhayIuCisKKyAgICAgICBpbnQgaW9jdGwoZmQsIFRDU0JSSywgaW50IGFyZyk7CisgICAgICAgaW50IHRjc2VuZGJyZWFrKGZkLCBpbnQgYXJnKTsKKworICBTZW5kIGEgYnJlYWs6ICBIZXJlIHRoZSBhY3Rpb24gZGlmZmVycyBiZXR3ZWVuIHRoZSBjb252ZW50aW9uYWwKKyAgaW9jdGwoKSBjYWxsIGFuZCB0aGUgUE9TSVggY2FsbC4gIEZvciB0aGUgY29udmVudGlvbmFsIGNhbGwsIGFuIGFyZyBvZgorICAnMCcgc2V0cyB0aGUgYnJlYWsgY29udHJvbCBsaW5lIG9mIHRoZSBVQVJUIGZvciAwLjI1IHNlY29uZHMuICBGb3IgdGhlCisgIFBPU0lYIGNvbW1hbmQsIHRoZSBicmVhayBsaW5lIGlzIHNldCBmb3IgYXJnIHRpbWVzIDAuMSBzZWNvbmRzLgorCisgIDYuMi4gIEhhcmR3YXJlIGZsb3cgY29udHJvbC4KKworICAgICAgIGludCBpb2N0bChmZCwgVENYT05DLCBpbnQgYWN0aW9uKTsKKyAgICAgICBpbnQgdGNmbG93KGZkLCBpbnQgYWN0aW9uKTsKKworICBUaGUgYWN0aW9uIGZsYWdzIGFyZToKKworICBvICBUQ09PRkYgIDAgIHN1c3BlbmQgb3V0cHV0CisKKyAgbyAgVENPT04gICAxICByZXN0YXJ0IG91dHB1dAorCisgIG8gIFRDSU9GRiAgMiAgdHJhbnNtaXQgU1RPUCBjaGFyYWN0ZXIgdG8gc3VzcGVuZCBpbnB1dAorCisgIG8gIFRDSU9OICAgMyAgdHJhbnNtaXQgU1RBUlQgY2hhcmFjdGVyIHRvIHJlc3RhcnQgaW5wdXQKKworICA2LjMuICBGbHVzaGluZyBJL08gYnVmZmVycy4KKworICAgICAgIGludCBpb2N0bChmZCwgVENGTFNILCBxdWV1ZV9zZWxlY3Rvcik7CisgICAgICAgaW50IHRjZmx1c2goZmQsIHF1ZXVlX3NlbGVjdG9yKTsKKworICBUaGUgcXVldWVfc2VsZWN0b3IgZmxhZ3MgYXJlOgorCisgIG8gIFRDSUZMVVNIICAwICBmbHVzaCBhbnkgZGF0YSBub3QgeWV0IHJlYWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCisKKyAgbyAgVENPRkxVU0ggIDEgIGZsdXNoIGFueSBkYXRhIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBidWZmZXIgYnV0IG5vdAorICAgICB5ZXQgdHJhbnNtaXR0ZWQKKworICBvICBUQ0lPRkxVU0ggMiAgZmx1c2ggYm90aCBidWZmZXJzCisKKyAgNy4gIE1vZGVtIGNvbnRyb2wKKworICBUaGUgaGFyZHdhcmUgbW9kZW0gY29udHJvbCBsaW5lcyBjYW4gYmUgbW9uaXRvcmVkIG9yIG1vZGlmaWVkIGJ5IHRoZQorICBpb2N0bCgyKSBzeXN0ZW0gY2FsbC4gIEEgc2V0IG9mIGNvbXBhcmFibGUgdGMqIGNhbGxzIGFwcGFyZW50bHkgZG8gbm90CisgIGV4aXN0LiAgVGhlIGZvcm0gb2YgdGhpcyBjYWxsIGlzOgorCisgICAgICAgaW50IGlvY3RsKGZkLCBDT01NQU5ELCAoaW50ICopZmxhZ3MpOworCisgIFRoZSBDT01NQU5EUyBhbmQgdGhlaXIgYWN0aW9uIGFyZToKKworICBvICBUSU9DTUJJUyAgdHVybiBvbiBjb250cm9sIGxpbmVzIGRlcGVuZGluZyB1cG9uIHdoaWNoIGJpdHMgYXJlIHNldAorICAgICBpbiBmbGFncy4KKworICBvICBUSU9DTUJJQyAgdHVybiBvZmYgY29udHJvbCBsaW5lcyBkZXBlbmRpbmcgdXBvbiB3aGljaCBiaXRzIGFyZQorICAgICB1bnNldCBpbiBmbGFncy4KKyAgbyAgVElPQ01HRVQgIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQgaW4gZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQorICAgICBjdXJyZW50IHN0YXR1cworCisgIG8gIFRJT0NNU0VUICB0aGUgc3RhdGUgb2YgdGhlIFVBUlQgaXMgY2hhbmdlZCBhY2NvcmRpbmcgdG8gd2hpY2ggYml0cworICAgICBhcmUgc2V0L3Vuc2V0IGluICdmbGFncycKKworICAgICBUaGUgYml0IHBhdHRlcm4gb2YgZmxhZ3MgcmVmZXIgdG8gdGhlIGZvbGxvd2luZyBjb250cm9sIGxpbmVzOgorCisgIG8gIFRJT0NNX0xFICAgICAgTGluZSBlbmFibGUKKworICBvICBUSU9DTV9EVFIgICAgIERhdGEgVGVybWluYWwgUmVhZHkKKworICBvICBUSU9DTV9SVFMgICAgIFJlcXVlc3QgdG8gc2VuZAorCisgIG8gIFRJT0NNX1NUICAgICAgU2Vjb25kYXJ5IHRyYW5zbWl0CisKKyAgbyAgVElPQ01fU1IgICAgICBTZWNvbmRhcnkgcmVjZWl2ZQorCisgIG8gIFRJT0NNX0NUUyAgICAgQ2xlYXIgdG8gc2VuZAorCisgIG8gIFRJT0NNX0NBUiAgICAgQ2FycmllciBkZXRlY3QKKworICBvICBUSU9DTV9STkcgICAgIFJpbmcKKworICBvICBUSU9DTV9EU1IgICAgIERhdGEgc2V0IHJlYWR5CisKKyAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgc29tZSBvZiB0aGVzZSBiaXRzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBtb2RlbQorICBhbmQgdGhlIFVBUlQgY2Fubm90IGNoYW5nZSB0aGVtIGJ1dCB0aGVpciBzdGF0dXMgY2FuIGJlIHNlbnNlZCBieQorICBUSU9DTUdFVC4gIEFsc28sIG1vc3QgUGVyc29uYWwgQ29tcHV0ZXJzIGRvIG5vdCBwcm92aWRlIGhhcmR3YXJlIGZvcgorICBzZWNvbmRhcnkgdHJhbnNtaXQgYW5kIHJlY2VpdmUuCisKKyAgVGhlcmUgYXJlIGFsc28gYSBwYWlyIG9mIGlvY3RsKCkgdG8gbW9uaXRvciB0aGVzZSBsaW5lcy4gIFRoZXkgYXJlCisgIHVuZG9jdW1lbnRlZCBhcyBmYXIgYXMgSSBoYXZlIGxlYXJuZWQuICBUaGUgY29tbWFuZHMgYXJlIFRJT0NNSVdBSVQKKyAgYW5kIFRDSU9HSUNPVU5ULiAgVGhleSBhbHNvIGRpZmZlciBiZXR3ZWVuIHZlcnNpb25zIG9mIHRoZSBMaW51eAorICBrZXJuZWwuCisKKyAgU2VlIHRoZSBsaW5lcy5jIGZpbGUgaW4gbXkgInNlcmlhbF9zdWl0ZSIgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoZXNlCisgIGNhbiBiZSB1c2VkIHNlZSAgPGZ0cDovL3NjaWNvbS5hbHBoYWNkLmNvbS9wdWIvbGludXgvc2VyaWFsX3N1aXRlPgorCisgIDguICBQcm9jZXNzIEdyb3VwcworCisgIDguMS4gIFNlc3Npb25zCisKKyAgOC4yLiAgUHJvY2VzcyBHcm91cHMKKworICBBbnkgbmV3bHkgY3JlYXRlZCBwcm9jZXNzIGluaGVyaXRzIHRoZSBQcm9jZXNzIEdyb3VwIG9mIGl0cyBjcmVhdG9yLgorICBUaGUgUHJvY2VzcyBHcm91cCBsZWFkZXIgaGFzIHRoZSBzYW1lIFBJRCBhcyBQR0lELgorCisgIDguMy4gIENvbnRyb2xsaW5nIFRlcm1pbmFsCisKKyAgVGhlcmUgYXJlIGEgc2VyaWVzIG9mIGlvY3RsKDIpIGFuZCB0YyooMikgY2FsbHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgbW9uaXRvciBvciB0byBjaGFuZ2UgdGhlIHByb2Nlc3MgZ3JvdXAgdG8gd2hpY2ggdGhlIGRldmljZSBpcworICBhdHRhY2hlZC4KKworICA4LjMuMS4gIEdldCB0aGUgZm9yZWdyb3VuZCBncm91cCBwcm9jZXNzIGlkLgorCisgIElmIHRoZXJlIGlzIG5vIGZvcmVncm91bmQgZ3JvdXAsIGEgbnVtYmVyIG5vdCByZXByZXNlbnRpbmcgYW4gZXhpc3RpbmcKKyAgcHJvY2VzcyBncm91cCBpcyByZXR1cm5lZC4gIE9uIGVycm9yLCBhIC0xIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcworICBzZXQuCisKKyAgICAgICBpbnQgaW9jdGwoZmQsIFRJT0NHUEdSUCwgKHBpZF90ICopcGlkKTsKKyAgICAgICBpbnQgdGNnZXRwZ3JwKGZkLCAocGlkX3QgKilwaWQpOworCisgIDguMy4yLiAgU2V0IHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgaWQgb2YgYSB0ZXJtaW5hbC4KKworICBUaGUgZmQgbXVzdCBiZSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgYW5kIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgc2Vzc2lvbiBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorCisgICAgICAgaW50IGlvY3RsKGZkLCBUSU9DU1BHUlAsIChwaWRfdCAqKXBpZCk7CisgICAgICAgaW50IHRjc2V0cGdycChmZCwgKHBpZF90ICopcGlkKTsKKworICA4LjMuMy4gIEdldCBwcm9jZXNzIGdyb3VwIGlkLgorCisgICAgICAgaW50IGlvY3RsKGZkLCBUSU9DR1BHUlAsICYocGlkX3QpcGlkKTsKKyAgICAgICBpbnQgdGNnZXRwZ3JwKGZkLCAmKHBpZF90KXBpZCk7CisKKyAgOS4gIExvY2tmaWxlcworCisgIEFueSBwcm9jZXNzIHdoaWNoIGFjY2Vzc2VzIGEgc2VyaWFsIGRldmljZSBzaG91bGQgZmlyc3QgY2hlY2sgZm9yIHRoZQorICBleGlzdGVuY2Ugb2YgbG9jayBmaWxlIGZvciB0aGUgZGVzaXJlZCBkZXZpY2UuICBJZiBzdWNoIGEgbG9jayBsb2NrCisgIGZpbGUgZXhpc3RzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGRldmljZSBtYXkgYmUgaW4gdXNlIGJ5IGFub3RoZXIKKyAgcHJvY2Vzcy4KKworICBDaGVjayBteSAibGliZGV2bG9ja3MteC54LnRneiIgYXQKKyAgPGZ0cDovL3NjaWNvbS5hbHBoYWNkYy5jb20vcHViL2xpbnV4PiBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdGhlc2UgbG9jaworICBmaWxlcyBzaG91bGQgYmUgdXRpbGl6ZWQuCisKKyAgMTAuICBBZGRpdGlvbmFsIEluZm9ybWF0aW9uCisKKyAgQ2hlY2sgb3V0IG15ICJzZXJpYWxfc3VpdGUudGd6IiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwcm9ncmFtbWluZworICB0aGUgc2VyaWFsIHBvcnRzIGF0ICAgPG1haWx0bzp2ZXJuQHplYnJhLmFscGhhY2RjLmNvbT4uICBUaGVyZSBzb21lCisgIGV4YW1wbGVzIGFuZCBzb21lIGJsdXJicyBhYm91dCBzZXR0aW5nIHVwIG1vZGVtcyBhbmQgY29tbWVudHMgYWJvdXQKKyAgc29tZSBnZW5lcmFsIGNvbnNpZGVyYXRpb25zLgorCisgIDExLiAgRmVlZGJhY2sKKworICBQbGVhc2Ugc2VuZCBtZSBhbnkgY29ycmVjdGlvbnMsIHF1ZXN0aW9ucywgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBvcgorICBhZGRpdGlvbmFsIG1hdGVyaWFsLiBJIHdvdWxkIGxpa2UgdG8gaW1wcm92ZSB0aGlzIEhPV1RPISAgVGVsbCBtZQorICBleGFjdGx5IHdoYXQgeW91IGRvbid0IHVuZGVyc3RhbmQsIG9yIHdoYXQgY291bGQgYmUgY2xlYXJlci4gIFlvdSBjYW4KKyAgcmVhY2ggbWUgYXQgIDxtYWlsdG86dmVybkB6ZWJyYS5hbHBoYWNkYy5jb20+IHZpYSBlbWFpbC4gIFBsZWFzZQorICBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPIHdoZW4KKyAgd3JpdGluZy4KZGlmZiAtLWdpdCBhL2RvY3MvYnVzeWJveF9mb290ZXIucG9kIGIvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NmM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvYnVzeWJveF9mb290ZXIucG9kCkBAIC0wLDAgKzEsMjg1IEBACis9YmFjaworCis9aGVhZDEgTElCQyBOU1MKKworR05VIExpYmMgKGdsaWJjKSB1c2VzIHRoZSBOYW1lIFNlcnZpY2UgU3dpdGNoIChOU1MpIHRvIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3IKK29mIHRoZSBDIGxpYnJhcnkgZm9yIHRoZSBsb2NhbCBlbnZpcm9ubWVudCwgYW5kIHRvIGNvbmZpZ3VyZSBob3cgaXQgcmVhZHMKK3N5c3RlbSBkYXRhLCBzdWNoIGFzIHBhc3N3b3JkcyBhbmQgZ3JvdXAgaW5mb3JtYXRpb24uICBUaGlzIGlzIGltcGxlbWVudGVkCit1c2luZyBhbiAvZXRjL25zc3dpdGNoLmNvbmYgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgdXNpbmcgb25lIG9yIG1vcmUgb2YgdGhlCisvbGliL2xpYm5zc18qIGxpYnJhcmllcy4gIEJ1c3lCb3ggdHJpZXMgdG8gYXZvaWQgdXNpbmcgYW55IGxpYmMgY2FsbHMgdGhhdCBtYWtlCit1c2Ugb2YgTlNTLiAgU29tZSBhcHBsZXRzIGhvd2V2ZXIsIHN1Y2ggYXMgbG9naW4gYW5kIHN1LCB3aWxsIHVzZSBsaWJjIGZ1bmN0aW9ucwordGhhdCByZXF1aXJlIE5TUy4KKworSWYgeW91IGVuYWJsZSBDT05GSUdfVVNFX0JCX1BXRF9HUlAsIEJ1c3lCb3ggd2lsbCB1c2UgaW50ZXJuYWwgZnVuY3Rpb25zIHRvCitkaXJlY3RseSBhY2Nlc3MgdGhlIC9ldGMvcGFzc3dkLCAvZXRjL2dyb3VwLCBhbmQgL2V0Yy9zaGFkb3cgZmlsZXMgd2l0aG91dAordXNpbmcgTlNTLiAgVGhpcyBtYXkgYWxsb3cgeW91IHRvIHJ1biB5b3VyIHN5c3RlbSB3aXRob3V0IHRoZSBuZWVkIGZvcgoraW5zdGFsbGluZyBhbnkgb2YgdGhlIE5TUyBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCBsaWJyYXJpZXMuCisKK1doZW4gdXNlZCB3aXRoIGdsaWJjLCB0aGUgQnVzeUJveCAnbmV0d29ya2luZycgYXBwbGV0cyB3aWxsIHNpbWlsYXJseSByZXF1aXJlCit0aGF0IHlvdSBpbnN0YWxsIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGdsaWJjIE5TUyBzdHVmZiAoaW4gcGFydGljdWxhciwKKy9ldGMvbnNzd2l0Y2guY29uZiwgL2xpYi9saWJuc3NfZG5zKiwgL2xpYi9saWJuc3NfZmlsZXMqLCBhbmQgL2xpYi9saWJyZXNvbHYqKS4KKworU2hhbWVsZXNzIFBsdWc6IEFzIGFuIGFsdGVybmF0aXZlLCBvbmUgY291bGQgdXNlIGEgQyBsaWJyYXJ5IHN1Y2ggYXMgdUNsaWJjLiAgSW4KK2FkZGl0aW9uIHRvIG1ha2luZyB5b3VyIHN5c3RlbSBzaWduaWZpY2FudGx5IHNtYWxsZXIsIHVDbGliYyBkb2VzIG5vdCByZXF1aXJlIHRoZQordXNlIG9mIGFueSBOU1Mgc3VwcG9ydCBmaWxlcyBvciBsaWJyYXJpZXMuCisKKz1oZWFkMSBNQUlOVEFJTkVSCisKK0RlbmlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisKKz1oZWFkMSBBVVRIT1JTCisKK1RoZSBmb2xsb3dpbmcgcGVvcGxlIGhhdmUgY29udHJpYnV0ZWQgY29kZSB0byBCdXN5Qm94IHdoZXRoZXIgdGhleSBrbm93IGl0IG9yCitub3QuICBJZiB5b3UgaGF2ZSB3cml0dGVuIGNvZGUgaW5jbHVkZWQgaW4gQnVzeUJveCwgeW91IHNob3VsZCBwcm9iYWJseSBiZQorbGlzdGVkIGhlcmUgc28geW91IGNhbiBvYnRhaW4geW91ciBiaXQgb2YgZXRlcm5hbCBnbG9yeS4gIElmIHlvdSBzaG91bGQgYmUKK2xpc3RlZCBoZXJlLCBvciB0aGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB5b3UgaGF2ZSBkb25lIG5lZWRzIG1vcmUgZGV0YWlsLCBvciBpcworaW5jb3JyZWN0LCBwbGVhc2Ugc2VuZCBpbiBhbiB1cGRhdGUuCisKKworPWZvciBodG1sIDxicj4KKworRW1hbnVlbGUgQWluYSA8ZW1hbnVlbGUuYWluYUB0aXNjYWxpLml0PgorICAgIHJ1bi1wYXJ0cworCis9Zm9yIGh0bWwgPGJyPgorCitFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisKKyAgICBUb25zIG9mIG5ldyBzdHVmZiwgbWFqb3IgcmV3cml0ZSBvZiBtb3N0IG9mIHRoZQorICAgIGNvcmUgYXBwcywgdG9ucyBvZiBuZXcgYXBwcyBhcyBub3RlZCBpbiBoZWFkZXIgZmlsZXMuCisgICAgTG90cyBvZiB0ZWRpb3VzIGVmZm9ydCB3cml0aW5nIHRoZXNlIGJvcmluZyBkb2NzIHRoYXQKKyAgICBub2JvZHkgaXMgZ29pbmcgdG8gYWN0dWFsbHkgcmVhZC4KKworPWZvciBodG1sIDxicj4KKworTGF1cmVuY2UgQW5kZXJzb24gPGwuZC5hbmRlcnNvbkB3YXJ3aWNrLmFjLnVrPgorCisgICAgcnBtMmNwaW8sIHVuemlwLCBnZXRfaGVhZGVyX2NwaW8sIHJlYWRfZ3ogaW50ZXJmYWNlLCBycG0KKworPWZvciBodG1sIDxicj4KKworSmVmZiBBbmdpZWxza2kgPGplZmZAdGhlcHRyZ3JvdXAuY29tPgorCisgICAgZnRwcHV0LCBmdHBnZXQKKworPWZvciBodG1sIDxicj4KKworRWR3YXJkIEJldHRzIDxlZHdhcmRAZGViaWFuLm9yZz4KKworICAgIGV4cHIsIGhvc3RpZCwgbG9nbmFtZSwgd2hvYW1pCisKKz1mb3IgaHRtbCA8YnI+CisKK0pvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKworICAgIGR1LCBuc2xvb2t1cCwgc29ydAorCis9Zm9yIGh0bWwgPGJyPgorCitCcmlhbiBDYW5kbGVyIDxCLkNhbmRsZXJAcG9ib3guY29tPgorCisgICAgdGlueS1scyhscykKKworPWZvciBodG1sIDxicj4KKworUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisKKyAgICBmYnNldCwgcGluZywgaG9zdG5hbWUKKworPWZvciBodG1sIDxicj4KKworRGF2ZSBDaW5lZ2UgPGRjaW5lZ2VAcHN5Y2hvc2lzLmNvbT4KKworICAgIG1vcmUodjIpLCBtYWtlZGV2cywgZHV0bXAsIG1vZHVsYXJpemF0aW9uLCBhdXRvIGxpbmtzIGZpbGUsCisgICAgdmFyaW91cyBmaXhlcywgTGludXggUm91dGVyIFByb2plY3QgbWFpbnRlbmFuY2UKKworPWZvciBodG1sIDxicj4KKworSm9yZGFuIENyb3VzZSA8am9yZGFuQGNvc21pY3Blbmd1aW4ubmV0PgorCisgICAgaXBjYWxjCisKKz1mb3IgaHRtbCA8YnI+CisKK01hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+CisKKyAgICB0ZnRwIGNsaWVudCBpbnNtb2QgcG93ZXJwYyBzdXBwb3J0CisKKz1mb3IgaHRtbCA8YnI+CisKK0xhcnJ5IERvb2xpdHRsZSA8bGRvb2xpdHRAcmVjeWNsZS5sYmwuZ292PgorCisgICAgcHJpc3RpbmUgc291cmNlIGRpcmVjdG9yeSBjb21waWxhdGlvbiwgbG90cyBvZiBwYXRjaGVzIGFuZCBmaXhlcy4KKworPWZvciBodG1sIDxicj4KKworR2xlbm4gRW5nZWwgPGdsZW5uZUBlbmdlbC5vcmc+CisKKyAgICBodHRwZAorCis9Zm9yIGh0bWwgPGJyPgorCitHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+CisKKyAgICBTeXNrbG9nZCAoc2luZ2xlIHRocmVhZGVkIHN5c2xvZ2QsIElQQyBDaXJjdWxhciBidWZmZXIgc3VwcG9ydCwKKyAgICBsb2dyZWFkKSwgdmFyaW91cyBmaXhlcy4KKworPWZvciBodG1sIDxicj4KKworS2FybCBNLiBIZWdibG9vbSA8a2FybGhlZ0BkZWJpYW4ub3JnPgorCisgICAgY3BfbXYuYywgdGhlIHRlc3Qgc3VpdGUsIHZhcmlvdXMgZml4ZXMgdG8gdXRpbGl0eS5jLCAmYy4KKworPWZvciBodG1sIDxicj4KKworRGFuaWVsIEphY29ib3dpdHogPGRhbkBkZWJpYW4ub3JnPgorCisgICAgbWt0ZW1wLmMKKworPWZvciBodG1sIDxicj4KKworTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNtdS5lZHU+CisKKyAgICBkb2N1bWVudGF0aW9uLCBidWdmaXhlcywgdGVzdCBzdWl0ZQorCis9Zm9yIGh0bWwgPGJyPgorCitTdGVwaGFuIExpbnogPGxpbnpAbGktcHJvLm5ldD4KKworICAgIGlwY2FsYywgUmVkIEhhdCBlcXVpdmFsZW5jZQorCis9Zm9yIGh0bWwgPGJyPgorCitKb2huIExvbWJhcmRvIDxqb2huQGRlbHRhbmV0LmNvbT4KKworICAgIHRyCisKKz1mb3IgaHRtbCA8YnI+CisKK0dsZW5uIE1jR3JhdGggPGJ1ZzFAaWluZXQubmV0LmF1PgorCisgICAgQ29tbW9uIHVuYXJjaGl2aW5nIGNvZGUgYW5kIHVuYXJjaGl2aW5nIGFwcGxldHMsIGlmdXBkb3duLCBmdHBnZXRwdXQsCisgICAgbmFtZWlmLCBzZWQsIHBhdGNoLCBmb2xkLCBpbnN0YWxsLCB1dWRlY29kZS4KKyAgICBWYXJpb3VzIGJ1Z2ZpeGVzLCByZXZpZXcgYW5kIGFwcGx5IG51bWVyb3VzIHBhdGNoZXMuCisKKz1mb3IgaHRtbCA8YnI+CisKK01hbnVlbCBOb3ZvYSBJSUkgPG1qbjNAY29kZXBvZXQub3JnPgorCisgICAgY2F0LCBoZWFkLCBta2ZpZm8sIG1rbm9kLCBybWRpciwgc2xlZXAsIHRlZSwgdHR5LCB1bmlxLCB1c2xlZXAsIHdjLCB5ZXMsCisgICAgbWVzZywgdmNvbmZpZywgbWFrZV9kaXJlY3RvcnksIHBhcnNlX21vZGUsIGRpcm5hbWUsIG1vZGVfc3RyaW5nLAorICAgIGdldF9sYXN0X3BhdGhfY29tcG9uZW50LCBzaW1wbGlmeV9wYXRoLCBhbmQgYSBudW1iZXIgdHJpdmlhbCBsaWJiYiByb3V0aW5lcworCisgICAgYWxzbyBidWcgZml4ZXMsIHBhcnRpYWwgcmV3cml0ZXMsIGFuZCBzaXplIG9wdGltaXphdGlvbnMgaW4KKyAgICBhc2gsIGJhc2VuYW1lLCBjYWwsIGNtcCwgY3AsIGRmLCBkdSwgZWNobywgZW52LCBsbiwgbG9nbmFtZSwgbWQ1c3VtLCBta2RpciwKKyAgICBtdiwgcmVhbHBhdGgsIHJtLCBzb3J0LCB0YWlsLCB0b3VjaCwgdW5hbWUsIHdhdGNoLCBhcml0aCwgaHVtYW5fcmVhZGFibGUsCisgICAgaW50ZXJmYWNlLCBkdXRtcCwgaWZjb25maWcsIHJvdXRlCisKKz1mb3IgaHRtbCA8YnI+CisKK1ZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKworICAgIGNtZGVkaXQ7IHhhcmdzKGN1cnJlbnQpLCBodHRwZChjdXJyZW50KTsKKyAgICBwb3J0czogYXNoLCBjcm9uZCwgZmRpc2ssIGluZXRkLCBzdHR5LCB0cmFjZXJvdXRlLCB0b3A7CisgICAgbG9jYWxlLCB2YXJpb3VzIGZpeGVzCisgICAgYW5kIGlycmVjb25jaWxhYmxlIGNyaXRpYyBvZiBldmVyeXRoaW5nIG5vdCBwZXJmZWN0LgorCis9Zm9yIGh0bWwgPGJyPgorCitCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4KKworICAgIE9yaWdpbmFsIGF1dGhvciBvZiBCdXN5Qm94IGluIDE5OTUsIDE5OTYuIFNvbWUgb2YgaGlzIGNvZGUgY2FuCisgICAgc3RpbGwgYmUgZm91bmQgaGlkaW5nIGhlcmUgYW5kIHRoZXJlLi4uCisKKz1mb3IgaHRtbCA8YnI+CisKK1RpbSBSaWtlciA8VGltQFJpa2Vycy5vcmc+CisKKyAgICBidWcgZml4ZXMsIG1lbWJlciBvZiBmYW4gY2x1YgorCis9Zm9yIGh0bWwgPGJyPgorCitLZW50IFJvYm90dGkgPHJvYm90dGlAbWV0Y29ubmVjdC5jb20+CisKKyAgICByZXNldCwgdG9ucyBhbmQgdG9ucyBvZiBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcy4KKworPWZvciBodG1sIDxicj4KKworQ2hpcCBSb3NlbnRoYWwgPGNoaXBAdW5pY29tLmNvbT4sIDxjcm9zZW50aEBjb3ZhZC5jb20+CisKKyAgICB3Z2V0IC0gQ29udHJpYnV0ZWQgYnkgcGVybWlzc2lvbiBvZiBDb3ZhZCBDb21tdW5pY2F0aW9ucworCis9Zm9yIGh0bWwgPGJyPgorCitQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPgorCisgICAgTG90cyBvZiBidWdzIGZpeGVzIGFuZCBwYXRjaGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitHeWVwaSBTYW0gPGd5ZXBpQHByYXhpcy1zdy5jb20+CisKKyAgICBSZW1vdGUgbG9nZ2luZyBmZWF0dXJlIGZvciBzeXNsb2dkCisKKz1mb3IgaHRtbCA8YnI+CisKK0xpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0B0cmFuc21ldGEuY29tPgorCisgICAgbWtzd2FwLCBmc2NrLm1pbml4LCBta2ZzLm1pbml4CisKKz1mb3IgaHRtbCA8YnI+CisKK01hcmsgV2hpdGxleSA8bWFya3dAY29kZXBvZXQub3JnPgorCisgICAgZ3JlcCwgc2VkLCBjdXQsIHhhcmdzKHByZXZpb3VzKSwKKyAgICBzdHlsZS1ndWlkZSwgbmV3LWFwcGxldC1IT1dUTywgYnVnIGZpeGVzLCBldGMuCisKKz1mb3IgaHRtbCA8YnI+CisKK0NoYXJsZXMgUC4gV3JpZ2h0IDxjcHdyaWdodEB2aWxsYWdlbmV0LmNvbT4KKworICAgIGd6aXAsIG1pbmktbmV0Y2F0KG5jKQorCis9Zm9yIGh0bWwgPGJyPgorCitFbnJpcXVlIFphbmFyZGkgPGV6YW5hcmRpQHVsbC5lcz4KKworICAgIHRhcmNhdCAoc2luY2UgcmVtb3ZlZCksIGxvYWRrbWFwLCB2YXJpb3VzIGZpeGVzLCBEZWJpYW4gbWFpbnRlbmFuY2UKKworPWZvciBodG1sIDxicj4KKworVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorCisgICAgZGV2ZnNkIGFuZCBzaXplIG9wdGltaXphdGlvbnMgaW4gc3RyaW5ncywgb3BlbnZ0IGFuZCBkZWFsbG9jdnQuCisKKz1mb3IgaHRtbCA8YnI+CisKK1BhdWwgRm94IDxwZ2ZAZm94aGFycC5ib3N0b24ubWEudXM+CisKKyAgICB2aSBlZGl0aW5nIG1vZGUgZm9yIGFzaCwgdmFyaW91cyBvdGhlciBwYXRjaGVzL2ZpeGVzCisKKz1mb3IgaHRtbCA8YnI+CisKK1JvYmVydG8gQS4gRm9nbGlldHRhIDxtZUByb2JlcnRvLmZvZ2xpZXR0YS5uYW1lPgorCisgICAgcG9ydDogZG5zZAorCis9Zm9yIGh0bWwgPGJyPgorCitCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgPHJlcC5kb3Qubm9wQGdtYWlsLmNvbT4KKworICAgIG1pc2MKKworPWZvciBodG1sIDxicj4KKworTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorCisgICAgaW5pdGlhbCBlMmZzcHJvZ3MsIHByaW50ZW52LCBzZXRhcmNoLCBzdW0sIG1pc2MKKworPWZvciBodG1sIDxicj4KKworSmllIFpoYW5nIDxqaWUuemhhbmdAYW5hbG9nLmNvbT4KKworICAgIGZpeGVkIHR3byBidWdzIGluIG1zaCBhbmQgaHVzaCAoZXhpdGNvZGUgb2Yga2lsbGVkIHByb2Nlc3NlcykKKworPWN1dApkaWZmIC0tZ2l0IGEvZG9jcy9idXN5Ym94X2hlYWRlci5wb2QgYi9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWExNzNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9idXN5Ym94X2hlYWRlci5wb2QKQEAgLTAsMCArMSw4MiBAQAorIyB2aTogc2V0IHN3PTQgdHM9NDoKKworPWhlYWQxIE5BTUUKKworQnVzeUJveCAtIFRoZSBTd2lzcyBBcm15IEtuaWZlIG9mIEVtYmVkZGVkIExpbnV4CisKKz1oZWFkMSBTWU5UQVgKKworIGJ1c3lib3ggPGFwcGxldD4gW2FyZ3VtZW50cy4uLl0gICMgb3IKKworIDxhcHBsZXQ+IFthcmd1bWVudHMuLi5dCSAgIyBpZiBzeW1saW5rZWQKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0J1c3lCb3ggY29tYmluZXMgdGlueSB2ZXJzaW9ucyBvZiBtYW55IGNvbW1vbiBVTklYIHV0aWxpdGllcyBpbnRvIGEgc2luZ2xlCitzbWFsbCBleGVjdXRhYmxlLiBJdCBwcm92aWRlcyBtaW5pbWFsaXN0IHJlcGxhY2VtZW50cyBmb3IgbW9zdCBvZiB0aGUgdXRpbGl0aWVzCit5b3UgdXN1YWxseSBmaW5kIGluIEdOVSBjb3JldXRpbHMsIHV0aWwtbGludXgsIGV0Yy4gVGhlIHV0aWxpdGllcyBpbiBCdXN5Qm94CitnZW5lcmFsbHkgaGF2ZSBmZXdlciBvcHRpb25zIHRoYW4gdGhlaXIgZnVsbC1mZWF0dXJlZCBHTlUgY291c2luczsgaG93ZXZlciwgdGhlCitvcHRpb25zIHRoYXQgYXJlIGluY2x1ZGVkIHByb3ZpZGUgdGhlIGV4cGVjdGVkIGZ1bmN0aW9uYWxpdHkgYW5kIGJlaGF2ZSB2ZXJ5CittdWNoIGxpa2UgdGhlaXIgR05VIGNvdW50ZXJwYXJ0cy4KKworQnVzeUJveCBoYXMgYmVlbiB3cml0dGVuIHdpdGggc2l6ZS1vcHRpbWl6YXRpb24gYW5kIGxpbWl0ZWQgcmVzb3VyY2VzIGluIG1pbmQuCitJdCBpcyBhbHNvIGV4dHJlbWVseSBtb2R1bGFyIHNvIHlvdSBjYW4gZWFzaWx5IGluY2x1ZGUgb3IgZXhjbHVkZSBjb21tYW5kcyAob3IKK2ZlYXR1cmVzKSBhdCBjb21waWxlIHRpbWUuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjdXN0b21pemUgeW91ciBlbWJlZGRlZAorc3lzdGVtcy4gVG8gY3JlYXRlIGEgd29ya2luZyBzeXN0ZW0sIGp1c3QgYWRkIC9kZXYsIC9ldGMsIGFuZCBhIExpbnV4IGtlcm5lbC4KK0J1c3lCb3ggcHJvdmlkZXMgYSBmYWlybHkgY29tcGxldGUgUE9TSVggZW52aXJvbm1lbnQgZm9yIGFueSBzbWFsbCBvciBlbWJlZGRlZAorc3lzdGVtLgorCitCdXN5Qm94IGlzIGV4dHJlbWVseSBjb25maWd1cmFibGUuICBUaGlzIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBvbmx5IHRoZQorY29tcG9uZW50cyB5b3UgbmVlZCwgdGhlcmVieSByZWR1Y2luZyBiaW5hcnkgc2l6ZS4gUnVuICdtYWtlIGNvbmZpZycgb3IgJ21ha2UKK21lbnVjb25maWcnIHRvIHNlbGVjdCB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHlvdSB3aXNoIHRvIGVuYWJsZS4gIFRoZW4gcnVuCisnbWFrZScgdG8gY29tcGlsZSBCdXN5Qm94IHVzaW5nIHlvdXIgY29uZmlndXJhdGlvbi4KKworQWZ0ZXIgdGhlIGNvbXBpbGUgaGFzIGZpbmlzaGVkLCB5b3Ugc2hvdWxkIHVzZSAnbWFrZSBpbnN0YWxsJyB0byBpbnN0YWxsCitCdXN5Qm94LiBUaGlzIHdpbGwgaW5zdGFsbCB0aGUgJ2Jpbi9idXN5Ym94JyBiaW5hcnksIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5CitzcGVjaWZpZWQgYnkgQ09ORklHX1BSRUZJWC4gQ09ORklHX1BSRUZJWCBjYW4gYmUgc2V0IHdoZW4gY29uZmlndXJpbmcgQnVzeUJveCwKK29yIHlvdSBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbiBhdCBpbnN0YWxsIHRpbWUgKGkuZS4sIHdpdGggYQorY29tbWFuZCBsaW5lIGxpa2UgJ21ha2UgQ09ORklHX1BSRUZJWD0vdG1wL2ZvbyBpbnN0YWxsJykuIElmIHlvdSBlbmFibGVkCithbnkgYXBwbGV0IGluc3RhbGxhdGlvbiBzY2hlbWUgKGVpdGhlciBhcyBzeW1saW5rcyBvciBoYXJkbGlua3MpLCB0aGVzZSB3aWxsCithbHNvIGJlIGluc3RhbGxlZCBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBDT05GSUdfUFJFRklYLgorCis9aGVhZDEgVVNBR0UKKworQnVzeUJveCBpcyBhIG11bHRpLWNhbGwgYmluYXJ5LiAgQSBtdWx0aS1jYWxsIGJpbmFyeSBpcyBhbiBleGVjdXRhYmxlIHByb2dyYW0KK3RoYXQgcGVyZm9ybXMgdGhlIHNhbWUgam9iIGFzIG1vcmUgdGhhbiBvbmUgdXRpbGl0eSBwcm9ncmFtLiAgVGhhdCBtZWFucyB0aGVyZQoraXMganVzdCBhIHNpbmdsZSBCdXN5Qm94IGJpbmFyeSwgYnV0IHRoYXQgc2luZ2xlIGJpbmFyeSBhY3RzIGxpa2UgYSBsYXJnZQorbnVtYmVyIG9mIHV0aWxpdGllcy4gIFRoaXMgYWxsb3dzIEJ1c3lCb3ggdG8gYmUgc21hbGxlciBzaW5jZSBhbGwgdGhlIGJ1aWx0LWluCit1dGlsaXR5IHByb2dyYW1zICh3ZSBjYWxsIHRoZW0gYXBwbGV0cykgY2FuIHNoYXJlIGNvZGUgZm9yIG1hbnkgY29tbW9uCitvcGVyYXRpb25zLgorCitZb3UgY2FuIGFsc28gaW52b2tlIEJ1c3lCb3ggYnkgaXNzdWluZyBhIGNvbW1hbmQgYXMgYW4gYXJndW1lbnQgb24gdGhlCitjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgZW50ZXJpbmcKKworCS9iaW4vYnVzeWJveCBscworCit3aWxsIGFsc28gY2F1c2UgQnVzeUJveCB0byBiZWhhdmUgYXMgJ2xzJy4KKworT2YgY291cnNlLCBhZGRpbmcgJy9iaW4vYnVzeWJveCcgaW50byBldmVyeSBjb21tYW5kIHdvdWxkIGJlIHBhaW5mdWwuICBTbyBtb3N0CitwZW9wbGUgd2lsbCBpbnZva2UgQnVzeUJveCB1c2luZyBsaW5rcyB0byB0aGUgQnVzeUJveCBiaW5hcnkuCisKK0ZvciBleGFtcGxlLCBlbnRlcmluZworCisJbG4gLXMgL2Jpbi9idXN5Ym94IGxzCisJLi9scworCit3aWxsIGNhdXNlIEJ1c3lCb3ggdG8gYmVoYXZlIGFzICdscycgKGlmIHRoZSAnbHMnIGNvbW1hbmQgaGFzIGJlZW4gY29tcGlsZWQKK2ludG8gQnVzeUJveCkuICBHZW5lcmFsbHkgc3BlYWtpbmcsIHlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBtYWtlIGFsbCB0aGVzZQorbGlua3MgeW91cnNlbGYsIGFzIHRoZSBCdXN5Qm94IGJ1aWxkIHN5c3RlbSB3aWxsIGRvIHRoaXMgZm9yIHlvdSB3aGVuIHlvdSBydW4KK3RoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kLgorCitJZiB5b3UgaW52b2tlIEJ1c3lCb3ggd2l0aCBubyBhcmd1bWVudHMsIGl0IHdpbGwgcHJvdmlkZSB5b3Ugd2l0aCBhIGxpc3Qgb2YgdGhlCithcHBsZXRzIHRoYXQgaGF2ZSBiZWVuIGNvbXBpbGVkIGludG8geW91ciBCdXN5Qm94IGJpbmFyeS4KKworPWhlYWQxIENPTU1PTiBPUFRJT05TCisKK01vc3QgQnVzeUJveCBhcHBsZXRzIHN1cHBvcnQgdGhlIEI8LS1oZWxwPiBhcmd1bWVudCB0byBwcm92aWRlIGEgdGVyc2UgcnVudGltZQorZGVzY3JpcHRpb24gb2YgdGhlaXIgYmVoYXZpb3IuICBJZiB0aGUgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRSBvcHRpb24gaGFzCitiZWVuIGVuYWJsZWQsIG1vcmUgZGV0YWlsZWQgdXNhZ2UgaW5mb3JtYXRpb24gd2lsbCBhbHNvIGJlIGF2YWlsYWJsZS4KKworPWhlYWQxIENPTU1BTkRTCisKK0N1cnJlbnRseSBhdmFpbGFibGUgYXBwbGV0cyBpbmNsdWRlOgpkaWZmIC0tZ2l0IGEvZG9jcy9jZ2kvY2wuaHRtbCBiL2RvY3MvY2dpL2NsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZmFhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvY2dpL2NsLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPkNHSSBDb21tYW5kIGxpbmUgb3B0aW9uczwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT48aW1nIGFsdD0iIiBzcmM9ImNsX2ZpbGVzL0NHSWxvZ28uZ2lmIj4gQ0dJIENvbW1hbmQgbGluZSBvcHRpb25zPC9oMT4KKzxocj4gPHA+CisKKzwvcD48aDI+U3BlY2lmaWNhdGlvbjwvaDI+CisKK1RoZSBjb21tYW5kIGxpbmUgaXMgb25seSB1c2VkIGluIHRoZSBjYXNlIG9mIGFuIElTSU5ERVggcXVlcnkuIEl0IGlzCitub3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBhbiBIVE1MIGZvcm0gb3IgYW55IGFzIHlldCB1bmRlZmluZWQgcXVlcnkKK3R5cGUuIFRoZSBzZXJ2ZXIgc2hvdWxkIHNlYXJjaCB0aGUgcXVlcnkgaW5mb3JtYXRpb24gKHRoZSA8Y29kZT5RVUVSWV9TVFJJTkc8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlKSBmb3IgYSBub24tZW5jb2RlZAorPSBjaGFyYWN0ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb21tYW5kIGxpbmUgaXMgdG8gYmUgdXNlZCwgaWYgaXQKK2ZpbmRzIG9uZSwgdGhlIGNvbW1hbmQgbGluZSBpcyBub3QgdG8gYmUgdXNlZC4gVGhpcyB0cnVzdHMgdGhlIGNsaWVudHMKK3RvIGVuY29kZSB0aGUgPSBzaWduIGluIElTSU5ERVggcXVlcmllcywgYSBwcmFjdGljZSB3aGljaCB3YXMKK2NvbnNpZGVyZWQgc2FmZSBhdCB0aGUgdGltZSBvZiB0aGUgZGVzaWduIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gPHA+CisKK0ZvciBleGFtcGxlLCB1c2UgdGhlIDxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2ktYmluL2ZpbmdlciI+ZmluZ2VyIHNjcmlwdDwvYT4gYW5kIHRoZSBJU0lOREVYIGludGVyZmFjZSB0byBsb29rIHVwICJodHRwZCIuICBZb3Ugd2lsbCBzZWUgdGhhdCB0aGUgc2NyaXB0IHdpbGwgY2FsbCBpdHNlbGYgd2l0aCA8Y29kZT4vY2dpLWJpbi9maW5nZXI/aHR0cGQ8L2NvZGU+IGFuZCB3aWxsIGFjdHVhbGx5IGV4ZWN1dGUgImZpbmdlciBodHRwZCIgb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgb3V0cHV0IHRoZSByZXN1bHRzIHRvIHlvdS4KKzwvcD48cD4KK0lmIHRoZSBzZXJ2ZXIgZG9lcyBmaW5kIGEgIj0iIGluIHRoZSA8Y29kZT5RVUVSWV9TVFJJTkc8L2NvZGU+LAordGhlbiB0aGUgY29tbWFuZCBsaW5lIHdpbGwgbm90IGJlIHVzZWQsIGFuZCBubyBkZWNvZGluZyB3aWxsIGJlCitwZXJmb3JtZWQuIFRoZSBxdWVyeSB0aGVuIHJlbWFpbnMgaW50YWN0IGZvciBwcm9jZXNzaW5nIGJ5IGFuCithcHByb3ByaWF0ZSBGT1JNIHN1Ym1pc3Npb24gZGVjb2Rlci4KK0FnYWluLCBhcyBhbiBleGFtcGxlLCB1c2UgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS1iaW4vZmluZ2VyP2h0dHBkPW5hbWUiPnRoaXMgaHlwZXJsaW5rPC9hPiB0byBzdWJtaXQgPGNvZGU+Imh0dHBkPW5hbWUiPC9jb2RlPiB0byB0aGUgZmluZ2VyIHNjcmlwdC4gIFNpbmNlIHRoaXMgPGNvZGU+UVVFUllfU1RSSU5HPC9jb2RlPgorY29udGFpbmVkIGFuIHVuZW5jb2RlZCAiPSIsIG5vdGhpbmcgd2FzIGRlY29kZWQsIHRoZSBzY3JpcHQgZGlkbid0IGtub3cKK2l0IHdhcyBiZWluZyBzdWJtaXR0ZWQgYSB2YWxpZCBxdWVyeSwgYW5kIGp1c3QgZ2F2ZSB5b3UgdGhlIGRlZmF1bHQKK2ZpbmdlciBmb3JtLgorPC9wPjxwPgorSWYgdGhlIHNlcnZlciBmaW5kcyB0aGF0IGl0IGNhbm5vdCBzZW5kIHRoZSBzdHJpbmcgZHVlIHRvIGludGVybmFsCitsaW1pdGF0aW9ucyAoc3VjaCBhcyBleGVjKCkgb3IgL2Jpbi9zaCBjb21tYW5kIGxpbmUgcmVzdHJpY3Rpb25zKSB0aGUKK3NlcnZlciBzaG91bGQgaW5jbHVkZSBOTyBjb21tYW5kIGxpbmUgaW5mb3JtYXRpb24gYW5kIHByb3ZpZGUgdGhlCitub24tZGVjb2RlZCBxdWVyeSBpbmZvcm1hdGlvbiBpbiB0aGUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIDxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWwjcXVlcnkiPjxjb2RlPlFVRVJZX1NUUklORzwvY29kZT48L2E+LiA8L3A+PHA+Cis8L3A+PGhyPgorPGgyPkV4YW1wbGVzPC9oMj4KKworRXhhbXBsZXMgb2YgdGhlIGNvbW1hbmQgbGluZSB1c2FnZSBhcmUgbXVjaCBiZXR0ZXIgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9leGFtcGxlcy5odG1sIj5kZW1vbnN0cmF0ZWQ8L2E+IHRoYW4gZXhwbGFpbmVkLiBGb3IgdGhlc2UKK2V4YW1wbGVzLCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBzY3JpcHQgb3V0cHV0IHdoaWNoIHNheXMgd2hhdAorYXJnYyBhbmQgYXJndiBhcmUuIDxwPgorCis8L3A+PGhyPgorCis8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj48aW1nIGFsdD0iW0JhY2tdIiBzcmM9ImNsX2ZpbGVzL2JhY2suZ2lmIj5SZXR1cm4gdG8gdGhlCitpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbjwvYT4gPHA+CisKK0NHSSAtIENvbW1vbiBHYXRld2F5IEludGVyZmFjZQorPC9wPjxhZGRyZXNzPjxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvbWFpbHRvY2dpLmh0bWwiPmNnaUBuY3NhLnVpdWMuZWR1PC9hPjwvYWRkcmVzcz4KKworCis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9jZ2kvZW52Lmh0bWwgYi9kb2NzL2NnaS9lbnYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNjNzUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jZ2kvZW52Lmh0bWwKQEAgLTAsMCArMSwxNDkgQEAKKzxodG1sPjxoZWFkPjx0aXRsZT5DR0kgRW52aXJvbm1lbnQgVmFyaWFibGVzPC90aXRsZT48L2hlYWQ+PGJvZHk+PGgxPjxpbWcgYWx0PSIiIHNyYz0iZW52X2ZpbGVzL0NHSWxvZ28uZ2lmIj4gQ0dJIEVudmlyb25tZW50IFZhcmlhYmxlczwvaDE+Cis8aHI+CisKKzxwPgorCitJbiBvcmRlciB0byBwYXNzIGRhdGEgYWJvdXQgdGhlIGluZm9ybWF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgc2VydmVyIHRvCit0aGUgc2NyaXB0LCB0aGUgc2VydmVyIHVzZXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcyB3ZWxsIGFzCitlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IHdoZW4gdGhlCitzZXJ2ZXIgZXhlY3V0ZXMgdGhlIGdhdGV3YXkgcHJvZ3JhbS4gPC9wPjxwPgorCis8L3A+PGhyPgorPGgyPlNwZWNpZmljYXRpb248L2gyPgorCisgPHA+CitUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHJlcXVlc3Qtc3BlY2lmaWMgYW5kIGFyZQorc2V0IGZvciBhbGwgcmVxdWVzdHM6IDwvcD48cD4KKworPC9wPjx1bD4KKzxsaT4gPGNvZGU+U0VSVkVSX1NPRlRXQVJFPC9jb2RlPiA8cD4KKworICAgIFRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBzZXJ2ZXIgc29mdHdhcmUgYW5zd2VyaW5nCisgICAgdGhlIHJlcXVlc3QgKGFuZCBydW5uaW5nIHRoZSBnYXRld2F5KS4gRm9ybWF0OiBuYW1lL3ZlcnNpb24gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPlNFUlZFUl9OQU1FPC9jb2RlPiA8cD4KKyAgICBUaGUgc2VydmVyJ3MgaG9zdG5hbWUsIEROUyBhbGlhcywgb3IgSVAgYWRkcmVzcyBhcyBpdCB3b3VsZCBhcHBlYXIKKyAgICBpbiBzZWxmLXJlZmVyZW5jaW5nIFVSTHMuIDwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5HQVRFV0FZX0lOVEVSRkFDRTwvY29kZT4gPHA+CisgICAgVGhlIHJldmlzaW9uIG9mIHRoZSBDR0kgc3BlY2lmaWNhdGlvbiB0byB3aGljaCB0aGlzIHNlcnZlcgorICAgIGNvbXBsaWVzLiBGb3JtYXQ6IENHSS9yZXZpc2lvbjwvcD48cD4KKworPC9wPjwvbGk+PC91bD4KKworPGhyPgorCitUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHJlcXVlc3QgYmVpbmcKK2Z1bGZpbGxlZCBieSB0aGUgZ2F0ZXdheSBwcm9ncmFtOiA8cD4KKworPC9wPjx1bD4KKzxsaT4gPGEgbmFtZT0icHJvdG9jb2wiPjxjb2RlPlNFUlZFUl9QUk9UT0NPTDwvY29kZT48L2E+IDxwPgorICAgIFRoZSBuYW1lIGFuZCByZXZpc2lvbiBvZiB0aGUgaW5mb3JtYXRpb24gcHJvdGNvbCB0aGlzIHJlcXVlc3QgY2FtZQorICAgIGluIHdpdGguIEZvcm1hdDogcHJvdG9jb2wvcmV2aXNpb24gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPlNFUlZFUl9QT1JUPC9jb2RlPiAgPHA+CisgICAgVGhlIHBvcnQgbnVtYmVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBzZW50LiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+UkVRVUVTVF9NRVRIT0Q8L2NvZGU+IDxwPgorICAgIFRoZSBtZXRob2Qgd2l0aCB3aGljaCB0aGUgcmVxdWVzdCB3YXMgbWFkZS4gRm9yIEhUVFAsIHRoaXMgaXMKKyAgICAiR0VUIiwgIkhFQUQiLCAiUE9TVCIsIGV0Yy4gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPlBBVEhfSU5GTzwvY29kZT4gPHA+CisgICAgVGhlIGV4dHJhIHBhdGggaW5mb3JtYXRpb24sIGFzIGdpdmVuIGJ5IHRoZSBjbGllbnQuIEluIG90aGVyCisgICAgd29yZHMsIHNjcmlwdHMgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZWlyIHZpcnR1YWwgcGF0aG5hbWUsIGZvbGxvd2VkCisgICAgYnkgZXh0cmEgaW5mb3JtYXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIHBhdGguIFRoZSBleHRyYQorICAgIGluZm9ybWF0aW9uIGlzIHNlbnQgYXMgUEFUSF9JTkZPLiBUaGlzIGluZm9ybWF0aW9uIHNob3VsZCBiZQorICAgIGRlY29kZWQgYnkgdGhlIHNlcnZlciBpZiBpdCBjb21lcyBmcm9tIGEgVVJMIGJlZm9yZSBpdCBpcyBwYXNzZWQKKyAgICB0byB0aGUgQ0dJIHNjcmlwdC48L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+UEFUSF9UUkFOU0xBVEVEPC9jb2RlPiA8cD4KKyAgICBUaGUgc2VydmVyIHByb3ZpZGVzIGEgdHJhbnNsYXRlZCB2ZXJzaW9uIG9mIFBBVEhfSU5GTywgd2hpY2ggdGFrZXMKKyAgICB0aGUgcGF0aCBhbmQgZG9lcyBhbnkgdmlydHVhbC10by1waHlzaWNhbCBtYXBwaW5nIHRvIGl0LiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+U0NSSVBUX05BTUU8L2NvZGU+IDxwPgorICAgIEEgdmlydHVhbCBwYXRoIHRvIHRoZSBzY3JpcHQgYmVpbmcgZXhlY3V0ZWQsIHVzZWQgZm9yCisgICAgc2VsZi1yZWZlcmVuY2luZyBVUkxzLiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGEgbmFtZT0icXVlcnkiPjxjb2RlPlFVRVJZX1NUUklORzwvY29kZT48L2E+IDxwPgorICAgIFRoZSBpbmZvcm1hdGlvbiB3aGljaCBmb2xsb3dzIHRoZSA/IGluIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUvZGVtb3dlYi91cmwtcHJpbWVyLmh0bWwiPlVSTDwvYT4KKyAgICB3aGljaCByZWZlcmVuY2VkIHRoaXMgc2NyaXB0LiBUaGlzIGlzIHRoZSBxdWVyeSBpbmZvcm1hdGlvbi4gSXQKKyAgICBzaG91bGQgbm90IGJlIGRlY29kZWQgaW4gYW55IGZhc2hpb24uIFRoaXMgdmFyaWFibGUgc2hvdWxkIGFsd2F5cworICAgIGJlIHNldCB3aGVuIHRoZXJlIGlzIHF1ZXJ5IGluZm9ybWF0aW9uLCByZWdhcmRsZXNzIG9mIDxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvY2wuaHRtbCI+Y29tbWFuZCBsaW5lIGRlY29kaW5nPC9hPi4gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPlJFTU9URV9IT1NUPC9jb2RlPiA8cD4KKyAgICBUaGUgaG9zdG5hbWUgbWFraW5nIHRoZSByZXF1ZXN0LiBJZiB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgdGhpcworICAgIGluZm9ybWF0aW9uLCBpdCBzaG91bGQgc2V0IFJFTU9URV9BRERSIGFuZCBsZWF2ZSB0aGlzIHVuc2V0LjwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5SRU1PVEVfQUREUjwvY29kZT4gPHA+CisgICAgVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBob3N0IG1ha2luZyB0aGUgcmVxdWVzdC4gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPkFVVEhfVFlQRTwvY29kZT4gPHA+CisgICAgSWYgdGhlIHNlcnZlciBzdXBwb3J0cyB1c2VyIGF1dGhlbnRpY2F0aW9uLCBhbmQgdGhlIHNjcmlwdCBpcworICAgIHByb3RlY3RzLCB0aGlzIGlzIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBhdXRoZW50aWNhdGlvbiBtZXRob2QgdXNlZAorICAgIHRvIHZhbGlkYXRlIHRoZSB1c2VyLiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+UkVNT1RFX1VTRVI8L2NvZGU+IDxwPgorICAgIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdXNlciBhdXRoZW50aWNhdGlvbiwgYW5kIHRoZSBzY3JpcHQgaXMKKyAgICBwcm90ZWN0ZWQsIHRoaXMgaXMgdGhlIHVzZXJuYW1lIHRoZXkgaGF2ZSBhdXRoZW50aWNhdGVkIGFzLiA8L3A+PHA+Cis8L3A+PC9saT48bGk+IDxjb2RlPlJFTU9URV9JREVOVDwvY29kZT4gPHA+CisgICAgSWYgdGhlIEhUVFAgc2VydmVyIHN1cHBvcnRzIFJGQyA5MzEgaWRlbnRpZmljYXRpb24sIHRoZW4gdGhpcworICAgIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIHRoZSByZW1vdGUgdXNlciBuYW1lIHJldHJpZXZlZCBmcm9tIHRoZQorICAgIHNlcnZlci4gVXNhZ2Ugb2YgdGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgbGltaXRlZCB0byBsb2dnaW5nIG9ubHkuCisgICAgPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxhIG5hbWU9ImN0Ij48Y29kZT5DT05URU5UX1RZUEU8L2NvZGU+PC9hPiA8cD4KKyAgICBGb3IgcXVlcmllcyB3aGljaCBoYXZlIGF0dGFjaGVkIGluZm9ybWF0aW9uLCBzdWNoIGFzIEhUVFAgUE9TVCBhbmQKKyAgICBQVVQsIHRoaXMgaXMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZGF0YS4gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxhIG5hbWU9ImNsIj48Y29kZT5DT05URU5UX0xFTkdUSDwvY29kZT48L2E+IDxwPgorICAgIFRoZSBsZW5ndGggb2YgdGhlIHNhaWQgY29udGVudCBhcyBnaXZlbiBieSB0aGUgY2xpZW50LiA8L3A+PHA+CisKKzwvcD48L2xpPjwvdWw+CisKKworPGEgbmFtZT0iaGVhZGVycyI+PGhyPjwvYT4KKworSW4gYWRkaXRpb24gdG8gdGhlc2UsIHRoZSBoZWFkZXIgbGluZXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50LCBpZgorYW55LCBhcmUgcGxhY2VkIGludG8gdGhlIGVudmlyb25tZW50IHdpdGggdGhlIHByZWZpeCBIVFRQXyBmb2xsb3dlZCBieQordGhlIGhlYWRlciBuYW1lLiBBbnkgLSBjaGFyYWN0ZXJzIGluIHRoZSBoZWFkZXIgbmFtZSBhcmUgY2hhbmdlZCB0byBfCitjaGFyYWN0ZXJzLiBUaGUgc2VydmVyIG1heSBleGNsdWRlIGFueSBoZWFkZXJzIHdoaWNoIGl0IGhhcyBhbHJlYWR5Citwcm9jZXNzZWQsIHN1Y2ggYXMgQXV0aG9yaXphdGlvbiwgQ29udGVudC10eXBlLCBhbmQgQ29udGVudC1sZW5ndGguIElmCituZWNlc3NhcnksIHRoZSBzZXJ2ZXIgbWF5IGNob29zZSB0byBleGNsdWRlIGFueSBvciBhbGwgb2YgdGhlc2UKK2hlYWRlcnMgaWYgaW5jbHVkaW5nIHRoZW0gd291bGQgZXhjZWVkIGFueSBzeXN0ZW0gZW52aXJvbm1lbnQKK2xpbWl0cy4gPHA+CisKK0FuIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUgSFRUUF9BQ0NFUFQgdmFyaWFibGUgd2hpY2ggd2FzIGRlZmluZWQgaW4KK0NHSS8xLjAuIEFub3RoZXIgZXhhbXBsZSBpcyB0aGUgaGVhZGVyIFVzZXItQWdlbnQuPC9wPjxwPgorCis8L3A+PHVsPgorPGxpPiA8Y29kZT5IVFRQX0FDQ0VQVDwvY29kZT4gPHA+CisgICAgVGhlIE1JTUUgdHlwZXMgd2hpY2ggdGhlIGNsaWVudCB3aWxsIGFjY2VwdCwgYXMgZ2l2ZW4gYnkgSFRUUAorICAgIGhlYWRlcnMuIE90aGVyIHByb3RvY29scyBtYXkgbmVlZCB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tCisgICAgZWxzZXdoZXJlLiBFYWNoIGl0ZW0gaW4gdGhpcyBsaXN0IHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzIGFzCisgICAgcGVyIHRoZSBIVFRQIHNwZWMuIDwvcD48cD4KKworICAgIEZvcm1hdDogdHlwZS9zdWJ0eXBlLCB0eXBlL3N1YnR5cGUgPC9wPjxwPgorCisKKzwvcD48L2xpPjxsaT4gPGNvZGU+SFRUUF9VU0VSX0FHRU5UPC9jb2RlPjxwPgorCisgICAgVGhlIGJyb3dzZXIgdGhlIGNsaWVudCBpcyB1c2luZyB0byBzZW5kIHRoZSByZXF1ZXN0LiBHZW5lcmFsCitmb3JtYXQ6IDxjb2RlPnNvZnR3YXJlL3ZlcnNpb24gbGlicmFyeS92ZXJzaW9uPC9jb2RlPi48L3A+PHA+CisKKzwvcD48L2xpPjwvdWw+CisKKzxocj4KKzxoMj5FeGFtcGxlczwvaDI+CisKK0V4YW1wbGVzIG9mIHRoZSBzZXR0aW5nIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcmVhbGx5IG11Y2ggYmV0dGVyCis8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2V4YW1wbGVzLmh0bWwiPmRlbW9uc3RyYXRlZDwvYT4gdGhhbiBleHBsYWluZWQuIDxwPgorCis8L3A+PGhyPgorCis8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj48aW1nIGFsdD0iW0JhY2tdIiBzcmM9ImVudl9maWxlcy9iYWNrLmdpZiI+UmV0dXJuIHRvIHRoZQoraW50ZXJmYWNlIHNwZWNpZmljYXRpb248L2E+IDxwPgorCitDR0kgLSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UKKzwvcD48YWRkcmVzcz48YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL21haWx0b2NnaS5odG1sIj5jZ2lAbmNzYS51aXVjLmVkdTwvYT48L2FkZHJlc3M+CisKKzwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2NnaS9pbi5odG1sIGIvZG9jcy9jZ2kvaW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU1ZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jZ2kvaW4uaHRtbApAQCAtMCwwICsxLDMzIEBACis8aHRtbD48aGVhZD48dGl0bGU+Q0dJIFNjcmlwdCBpbnB1dDwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT48aW1nIGFsdD0iIiBzcmM9ImluX2ZpbGVzL0NHSWxvZ28uZ2lmIj4gQ0dJIFNjcmlwdCBJbnB1dDwvaDE+Cis8aHI+CisKKzxoMj5TcGVjaWZpY2F0aW9uPC9oMj4KKworRm9yIHJlcXVlc3RzIHdoaWNoIGhhdmUgaW5mb3JtYXRpb24gYXR0YWNoZWQgYWZ0ZXIgdGhlIGhlYWRlciwgc3VjaCBhcworSFRUUCBQT1NUIG9yIFBVVCwgdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgc2VudCB0byB0aGUgc2NyaXB0IG9uIHN0ZGluLgorPHA+CisKK1RoZSBzZXJ2ZXIgd2lsbCBzZW5kIDxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWwjY2wiPkNPTlRFTlRfTEVOR1RIPC9hPiBieXRlcyBvbgordGhpcyBmaWxlIGRlc2NyaXB0b3IuIFJlbWVtYmVyIHRoYXQgaXQgd2lsbCBnaXZlIHRoZSA8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2Vudi5odG1sI2N0Ij5DT05URU5UX1RZUEU8L2E+IG9mIHRoZSBkYXRhIGFzIHdlbGwuIFRoZSBzZXJ2ZXIgaXMKK2luIG5vIHdheSBvYmxpZ2F0ZWQgdG8gc2VuZCBlbmQtb2YtZmlsZSBhZnRlciB0aGUgc2NyaXB0IHJlYWRzCis8Y29kZT5DT05URU5UX0xFTkdUSDwvY29kZT4gYnl0ZXMuIDwvcD48cD4KKzwvcD48aHI+Cis8aDI+RXhhbXBsZTwvaDI+CisKK0xldCdzIHRha2UgYSBmb3JtIHdpdGggTUVUSE9EPSJQT1NUIiBhcyBhbiBleGFtcGxlLiBMZXQncyBzYXkgdGhlIGZvcm0KK3Jlc3VsdHMgYXJlIDcgYnl0ZXMgZW5jb2RlZCwgYW5kIGxvb2sgbGlrZSA8Y29kZT5hPWImYW1wO2I9YzwvY29kZT4uCis8cD4KKworSW4gdGhpcyBjYXNlLCB0aGUgc2VydmVyIHdpbGwgc2V0IENPTlRFTlRfTEVOR1RIIHRvIDcgYW5kIENPTlRFTlRfVFlQRQordG8gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkLiBUaGUgZmlyc3QgYnl0ZSBvbiB0aGUgc2NyaXB0J3MKK3N0YW5kYXJkIGlucHV0IHdpbGwgYmUgImEiLCBmb2xsb3dlZCBieSB0aGUgcmVzdCBvZiB0aGUgZW5jb2RlZCBzdHJpbmcuPC9wPjxwPgorCis8L3A+PGhyPgorCis8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj48aW1nIGFsdD0iW0JhY2tdIiBzcmM9ImluX2ZpbGVzL2JhY2suZ2lmIj5SZXR1cm4gdG8gdGhlCitpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbjwvYT4gPHA+CisKK0NHSSAtIENvbW1vbiBHYXRld2F5IEludGVyZmFjZQorPC9wPjxhZGRyZXNzPjxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvbWFpbHRvY2dpLmh0bWwiPmNnaUBuY3NhLnVpdWMuZWR1PC9hPjwvYWRkcmVzcz4KKworPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvY2dpL2ludGVyZmFjZS5odG1sIGIvZG9jcy9jZ2kvaW50ZXJmYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlMDE2YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvY2dpL2ludGVyZmFjZS5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxodG1sPjxoZWFkPjx0aXRsZT5UaGUgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24KK1todHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sXQorPC90aXRsZT48L2hlYWQ+PGJvZHk+PGgxPjxpbWcgYWx0PSIiIHNyYz0iaW50ZXJmYWNlX2ZpbGVzL0NHSWxvZ28uZ2lmIj4gVGhlIENHSSBTcGVjaWZpY2F0aW9uPC9oMT4KKworPGhyPgorCitUaGlzIGlzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBDR0kgdmVyc2lvbiAxLjEsIG9yIENHSS8xLjEuIEZ1cnRoZXIKK3JldmlzaW9ucyBvZiB0aGlzIHByb3RvY29sIGFyZSBndWFyYW50ZWVkIHRvIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUuCis8cD4KKworVGhlIHNlcnZlciBhbmQgdGhlIENHSSBzY3JpcHQgY29tbXVuaWNhdGUgaW4gZm91ciBtYWpvciB3YXlzLiBFYWNoIG9mCit0aGUgZm9sbG93aW5nIGlzIGEgaG90bGluayB0byBncmFwaGljIGRldGFpbC48L3A+PHA+CisKKzwvcD48dWw+Cis8bGk+IDxhIGhyZWY9ImVudi5odG1sIj5FbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+Cis8L2xpPjxsaT4gPGEgaHJlZj0iY2wuaHRtbCI+VGhlIGNvbW1hbmQgbGluZTwvYT4KKzwvbGk+PGxpPiA8YSBocmVmPSJpbi5odG1sIj5TdGFuZGFyZCBpbnB1dDwvYT4KKzwvbGk+PGxpPiA8YSBocmVmPSJvdXQuaHRtbCI+U3RhbmRhcmQgb3V0cHV0PC9hPgorPC9saT48L3VsPgorPGhyPgorCisKKzxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvb3ZlcnZpZXcuaHRtbCI+PGltZyBhbHQ9IltCYWNrXSIgc3JjPSJpbnRlcmZhY2VfZmlsZXMvYmFjay5naWYiPlJldHVybiB0byB0aGUgb3ZlcnZpZXc8L2E+IDxwPgorCisKKworQ0dJIC0gQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlCis8L3A+PGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9tYWlsdG9jZ2kuaHRtbCI+Y2dpQG5jc2EudWl1Yy5lZHU8L2E+PC9hZGRyZXNzPgorPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvY2dpL291dC5odG1sIGIvZG9jcy9jZ2kvb3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2Njk4NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvY2dpL291dC5odG1sCkBAIC0wLDAgKzEsMTI2IEBACis8aHRtbD48aGVhZD48dGl0bGU+Q0dJIFNjcmlwdCBvdXRwdXQ8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+PGltZyBhbHQ9IiIgc3JjPSJvdXRfZmlsZXMvQ0dJbG9nby5naWYiPiBDR0kgU2NyaXB0IE91dHB1dDwvaDE+Cis8aHI+CisKKzxoMj5TY3JpcHQgb3V0cHV0PC9oMj4KKworVGhlIHNjcmlwdCBzZW5kcyBpdHMgb3V0cHV0IHRvIHN0ZG91dC4gVGhpcyBvdXRwdXQgY2FuIGVpdGhlciBiZSBhCitkb2N1bWVudCBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCwgb3IgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBzZXJ2ZXIgZm9yCityZXRyaWV2aW5nIHRoZSBkZXNpcmVkIG91dHB1dC4gPHA+Cis8L3A+PGhyPgorCis8aDI+U2NyaXB0IG5hbWluZyBjb252ZW50aW9uczwvaDI+CisKK05vcm1hbGx5LCBzY3JpcHRzIHByb2R1Y2Ugb3V0cHV0IHdoaWNoIGlzIGludGVycHJldGVkIGFuZCBzZW50IGJhY2sgdG8KK3RoZSBjbGllbnQuIEFuIGFkdmFudGFnZSBvZiB0aGlzIGlzIHRoYXQgdGhlIHNjcmlwdHMgZG8gbm90IG5lZWQgdG8KK3NlbmQgYSBmdWxsIEhUVFAvMS4wIGhlYWRlciBmb3IgZXZlcnkgcmVxdWVzdC4gIDxwPgorPGEgbmFtZT0ibnBoIj4KK1NvbWUgc2NyaXB0cyBtYXkgd2FudCB0byBhdm9pZCB0aGUgZXh0cmEgb3ZlcmhlYWQgb2YgdGhlIHNlcnZlcgorcGFyc2luZyB0aGVpciBvdXRwdXQsIGFuZCB0YWxrIGRpcmVjdGx5IHRvIHRoZSBjbGllbnQuIEluIG9yZGVyIHRvCitkaXN0aW5ndWlzaCB0aGVzZSBzY3JpcHRzIGZyb20gdGhlIG90aGVyIHNjcmlwdHMsIENHSSByZXF1aXJlcyB0aGF0Cit0aGUgc2NyaXB0IG5hbWUgYmVnaW5zIHdpdGggbnBoLSBpZiBhIHNjcmlwdCBkb2VzIG5vdCB3YW50IHRoZSBzZXJ2ZXIKK3RvIHBhcnNlIGl0cyBoZWFkZXIuIEluIHRoaXMgY2FzZSwgaXQgaXMgdGhlIHNjcmlwdCdzIHJlc3BvbnNpYmlsaXR5Cit0byByZXR1cm4gYSB2YWxpZCBIVFRQLzEuMCAob3IgSFRUUC8wLjkpIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuICA8L2E+PC9wPjxwPgorCis8L3A+PGhyPgorPGgyPjxhIG5hbWU9Im5waCI+UGFyc2VkIGhlYWRlcnM8L2E+PC9oMj4KKworPGEgbmFtZT0ibnBoIj5UaGUgb3V0cHV0IG9mIHNjcmlwdHMgYmVnaW5zIHdpdGggYSBzbWFsbCBoZWFkZXIuIFRoaXMgaGVhZGVyIGNvbnNpc3RzCitvZiB0ZXh0IGxpbmVzLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgYW4gPC9hPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL2h5cGVydGV4dC9XV1cvUHJvdG9jb2xzL0hUVFAvT2JqZWN0X0hlYWRlcnMuaHRtbCI+CitIVFRQIGhlYWRlcjwvYT4sIHRlcm1pbmF0ZWQgYnkgYSBibGFuayBsaW5lIChhIGxpbmUgd2l0aCBvbmx5IGEKK2xpbmVmZWVkIG9yIENSL0xGKS4gPHA+CisKK0FueSBoZWFkZXJzIHdoaWNoIGFyZSBub3Qgc2VydmVyIGRpcmVjdGl2ZXMgYXJlIHNlbnQgZGlyZWN0bHkgYmFjayB0bwordGhlIGNsaWVudC4gQ3VycmVudGx5LCB0aGlzIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aHJlZSBzZXJ2ZXIKK2RpcmVjdGl2ZXM6PC9wPjxwPgorCis8L3A+PHVsPgorPGxpPiA8Y29kZT5Db250ZW50LXR5cGU8L2NvZGU+IDxwPgorCisgICAgVGhpcyBpcyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBkb2N1bWVudCB5b3UgYXJlIHJldHVybmluZy4gIDwvcD48cD4KKworPC9wPjwvbGk+PGxpPiA8Y29kZT5Mb2NhdGlvbjwvY29kZT4gPHA+CisKKyAgICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSB0byB0aGUgc2VydmVyIHRoYXQgeW91IGFyZSByZXR1cm5pbmcgYQorICAgIHJlZmVyZW5jZSB0byBhIGRvY3VtZW50IHJhdGhlciB0aGFuIGFuIGFjdHVhbCBkb2N1bWVudC4gPC9wPjxwPgorCisgICAgSWYgdGhlIGFyZ3VtZW50IHRvIHRoaXMgaXMgYSBVUkwsIHRoZSBzZXJ2ZXIgd2lsbCBpc3N1ZSBhIHJlZGlyZWN0CisgICAgdG8gdGhlIGNsaWVudC4gPC9wPjxwPgorCisgICAgSWYgdGhlIGFyZ3VtZW50IHRvIHRoaXMgaXMgYSB2aXJ0dWFsIHBhdGgsIHRoZSBzZXJ2ZXIgd2lsbAorICAgIHJldHJpZXZlIHRoZSBkb2N1bWVudCBzcGVjaWZpZWQgYXMgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkCisgICAgdGhhdCBkb2N1bWVudCBvcmlnaW5hbGx5LiA/IGRpcmVjdGl2ZXMgd2lsbCB3b3JrIGluIGhlcmUsIGJ1dCAjCisgICAgZGlyZWN0aXZlcyBtdXN0IGJlIHJlZGlyZWN0ZWQgYmFjayB0byB0aGUgY2xpZW50LjwvcD48cD4KKworCis8L3A+PC9saT48bGk+IDxhIG5hbWU9InN0YXR1cyI+PGNvZGU+U3RhdHVzPC9jb2RlPjwvYT48cD4KKworICAgIFRoaXMgaXMgdXNlZCB0byBnaXZlIHRoZSBzZXJ2ZXIgYW4gSFRUUC8xLjAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvaHlwZXJ0ZXh0L1dXVy9Qcm90b2NvbHMvSFRUUC9IVFJFU1AuaHRtbCI+c3RhdHVzCitsaW5lPC9hPiB0byBzZW5kIHRvIHRoZSBjbGllbnQuIFRoZSBmb3JtYXQgaXMgPGNvZGU+bm5uIHh4eHh4PC9jb2RlPiwKK3doZXJlIDxjb2RlPm5ubjwvY29kZT4gaXMgdGhlIDMtZGlnaXQgc3RhdHVzIGNvZGUsIGFuZAorPGNvZGU+eHh4eHg8L2NvZGU+IGlzIHRoZSByZWFzb24gc3RyaW5nLCBzdWNoIGFzICJGb3JiaWRkZW4iLjwvcD48cD4KKworPC9wPjwvbGk+PC91bD4KKworPGhyPgorPGgyPkV4YW1wbGVzPC9oMj4KKworTGV0J3Mgc2F5IEkgaGF2ZSBhIGZyb21ncmF0eiB0byBIVE1MIGNvbnZlcnRlci4gV2hlbiBteSBjb252ZXJ0ZXIgaXMKK2ZpbmlzaGVkIHdpdGggaXRzIHdvcmssIGl0IHdpbGwgb3V0cHV0IHRoZSBmb2xsb3dpbmcgb24gc3Rkb3V0IChub3RlCit0aGF0IHRoZSBsaW5lcyBiZWdpbm5pbmcgYW5kIGVuZGluZyB3aXRoIC0tLSBhcmUganVzdCBmb3IgaWxsdXN0cmF0aW9uCithbmQgd291bGQgbm90IGJlIG91dHB1dCk6IDxwPgorCis8L3A+PHByZT4tLS0gc3RhcnQgb2Ygb3V0cHV0IC0tLQorQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKKworLS0tIGVuZCBvZiBvdXRwdXQgLS0tCis8L3ByZT4KKworTm90ZSB0aGUgYmxhbmsgbGluZSBhZnRlciBDb250ZW50LXR5cGUuIDxwPgorCitOb3csIGxldCdzIHNheSBJIGhhdmUgYSBzY3JpcHQgd2hpY2gsIGluIGNlcnRhaW4gaW5zdGFuY2VzLCB3YW50cyB0bworcmV0dXJuIHRoZSBkb2N1bWVudCA8Y29kZT4vcGF0aC9kb2MudHh0PC9jb2RlPiBmcm9tIHRoaXMgc2VydmVyIGp1c3QKK2FzIGlmIHRoZSB1c2VyIGhhZCBhY3R1YWxseSByZXF1ZXN0ZWQKKzxjb2RlPmh0dHA6Ly9zZXJ2ZXI6cG9ydC9wYXRoL2RvYy50eHQ8L2NvZGU+IHRvIGJlZ2luIHdpdGguIEluIHRoaXMKK2Nhc2UsIHRoZSBzY3JpcHQgd291bGQgb3V0cHV0OiA8L3A+PHA+Cis8L3A+PHByZT4tLS0gc3RhcnQgb2Ygb3V0cHV0IC0tLQorTG9jYXRpb246IC9wYXRoL2RvYy50eHQKKworLS0tIGVuZCBvZiBvdXRwdXQgLS0tCis8L3ByZT4KKworVGhlIHNlcnZlciB3b3VsZCB0aGVuIHBlcmZvcm0gdGhlIHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gdGhlIGNsaWVudC4KKzxwPgorCitMZXQncyBzYXkgdGhhdCBJIGhhdmUgYSBzY3JpcHQgd2hpY2ggd2FudHMgdG8gcmVmZXJlbmNlIG91ciBnb3BoZXIKK3NlcnZlci4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2NyaXB0IHdhbnRlZCB0byByZWZlciB0aGUgdXNlciB0bworPGNvZGU+Z29waGVyOi8vZ29waGVyLm5jc2EudWl1Yy5lZHUvPC9jb2RlPiwgaXQgd291bGQgb3V0cHV0OiA8L3A+PHA+CisKKzwvcD48cHJlPi0tLSBzdGFydCBvZiBvdXRwdXQgLS0tCitMb2NhdGlvbjogZ29waGVyOi8vZ29waGVyLm5jc2EudWl1Yy5lZHUvCisKKy0tLSBlbmQgb2Ygb3V0cHV0IC0tLQorPC9wcmU+CisKK0ZpbmFsbHksIEkgaGF2ZSBhIHNjcmlwdCB3aGljaCB3YW50cyB0byB0YWxrIHRvIHRoZSBjbGllbnQgZGlyZWN0bHkuCitJbiB0aGlzIGNhc2UsIGlmIHRoZSBzY3JpcHQgaXMgcmVmZXJlbmNlZCB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWwjcHJvdG9jb2wiPjxjb2RlPlNFUlZFUl9QUk9UT0NPTDwvY29kZT48L2E+IG9mIEhUVFAvMS4wLAordGhlIHNjcmlwdCB3b3VsZCBvdXRwdXQgdGhlIGZvbGxvd2luZyBIVFRQLzEuMCByZXNwb25zZTogPHA+CisKKzwvcD48cHJlPi0tLSBzdGFydCBvZiBvdXRwdXQgLS0tCitIVFRQLzEuMCAyMDAgT0sKK1NlcnZlcjogTkNTQS8xLjBhNgorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluCisKK1RoaXMgaXMgYSBwbGFpbnRleHQgZG9jdW1lbnQgZ2VuZXJhdGVkIG9uIHRoZSBmbHkganVzdCBmb3IgeW91LgorCistLS0gZW5kIG9mIG91dHB1dCAtLS0KKzwvcHJlPgorCisKKzxocj4KKworPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9pbnRlcmZhY2UuaHRtbCI+PGltZyBhbHQ9IltCYWNrXSIgc3JjPSJvdXRfZmlsZXMvYmFjay5naWYiPlJldHVybiB0byB0aGUKK2ludGVyZmFjZSBzcGVjaWZpY2F0aW9uPC9hPiA8cD4KKworQ0dJIC0gQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlCis8L3A+PGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9tYWlsdG9jZ2kuaHRtbCI+Y2dpQG5jc2EudWl1Yy5lZHU8L2E+PC9hZGRyZXNzPgorPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvY29udHJpYnV0aW5nLnR4dCBiL2RvY3MvY29udHJpYnV0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI4OWZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jb250cmlidXRpbmcudHh0CkBAIC0wLDAgKzEsNDM5IEBACitDb250cmlidXRpbmcgVG8gQnVzeWJveAorPT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgd2hhdCB5b3UgbmVlZCB0byBkbyB0byBjb250cmlidXRlIHRvIEJ1c3lib3gsIHdoZXJlCit5b3UgY2FuIGhlbHAsIGd1aWRlbGluZXMgb24gdGVzdGluZywgYW5kIGhvdyB0byBzdWJtaXQgYSB3ZWxsLWZvcm1lZCBwYXRjaAordGhhdCBpcyBtb3JlIGxpa2VseSB0byBiZSBhY2NlcHRlZC4KKworVGhlIEJ1c3lib3ggaG9tZSBwYWdlIGlzIGF0OiBodHRwOi8vYnVzeWJveC5uZXQvCisKKworCitQcmUtQ29udHJpYnV0aW9uIENoZWNrbGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU28geW91IHdhbnQgdG8gY29udHJpYnV0ZSB0byBCdXN5Ym94LCBlaD8gR3JlYXQsIHdvbmRlcmZ1bCwgZ2xhZCB5b3Ugd2FudCB0bworaGVscC4gSG93ZXZlciwgYmVmb3JlIHlvdSBkaXZlIGluLCBoZWFkbG9uZyBhbmQgaG90Zm9vdCwgdGhlcmUgYXJlIHNvbWUgdGhpbmdzCit5b3UgbmVlZCB0byBkbzoKKworCitDaGVja291dCB0aGUgTGF0ZXN0IENvZGUKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGlzIGlzIGEgbmVjZXNzYXJ5IGZpcnN0IHN0ZXAuIFBsZWFzZSBkbyBub3QgdHJ5IHRvIHdvcmsgd2l0aCB0aGUgbGFzdAorcmVsZWFzZWQgdmVyc2lvbiwgYXMgdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHNvbWVib2R5IGhhcyBhbHJlYWR5IGZpeGVkCit0aGUgYnVnIHlvdSBmb3VuZC4gU29tZWJvZHkgbWlnaHQgaGF2ZSBldmVuIGFkZGVkIHRoZSBmZWF0dXJlIHlvdSBoYWQgaW4gbWluZC4KK0Rvbid0IG1ha2UgeW91ciB3b3JrIG9ic29sZXRlIGJlZm9yZSB5b3Ugc3RhcnQhCisKK0ZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY2hlY2sgb3V0IEJ1c3lib3ggZGV2ZWxvcG1lbnQgdHJlZSwgcGxlYXNlIGxvb2sgYXQgdGhlCitmb2xsb3dpbmcgbGlua3M6CisKKwlodHRwOi8vYnVzeWJveC5uZXQvc291cmNlLmh0bWwKKworCitSZWFkIHRoZSBNYWlsaW5nIExpc3QKK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitObyBvbmUgaXMgcmVxdWlyZWQgdG8gcmVhZCB0aGUgZW50aXJlIGFyY2hpdmVzIG9mIHRoZSBtYWlsaW5nIGxpc3QsIGJ1dCB5b3UKK3Nob3VsZCBhdCBsZWFzdCByZWFkIHVwIG9uIHdoYXQgcGVvcGxlIGhhdmUgYmVlbiB0YWxraW5nIGFib3V0IGxhdGVseS4gSWYKK3lvdSd2ZSByZWNlbnRseSBkaXNjb3ZlcmVkIGEgcHJvYmxlbSwgY2hhbmNlcyBhcmUgc29tZWJvZHkgZWxzZSBoYXMgdG9vLiBJZgoreW91J3JlIHRoZSBmaXJzdCB0byBkaXNjb3ZlciBhIHByb2JsZW0sIHBvc3QgYSBtZXNzYWdlIGFuZCBsZXQgdGhlIHJlc3Qgb2YgdXMKK2tub3cuCisKK0FyY2hpdmVzIGNhbiBiZSBmb3VuZCBoZXJlOgorCisJaHR0cDovL2J1c3lib3gubmV0L2xpc3RzL2J1c3lib3gvCisKK0lmIHlvdSBoYXZlIGEgc2VyaW91cyBpbnRlcmVzdCBpbiBCdXN5Ym94LCBpLmUuLCB5b3UgYXJlIHVzaW5nIGl0IGRheS10by1kYXkgb3IKK2FzIHBhcnQgb2YgYW4gZW1iZWRkZWQgcHJvamVjdCwgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gam9pbiB0aGUgbWFpbGluZworbGlzdC4KKworQSB3ZWItYmFzZWQgc2lnbi11cCBmb3JtIGNhbiBiZSBmb3VuZCBoZXJlOgorCisJaHR0cDovL2J1c3lib3gubmV0L21haWxtYW4vbGlzdGluZm8vYnVzeWJveAorCisKK0Nvb3JkaW5hdGUgd2l0aCB0aGUgQXBwbGV0IE1haW50YWluZXIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworU29tZSAobm90IGFsbCkgb2YgdGhlIGFwcGxldHMgaW4gQnVzeWJveCBhcmUgIm93bmVkIiBieSBhIG1haW50YWluZXIgd2hvIGhhcworcHV0IHNpZ25pZmljYW50IGVmZm9ydCBpbnRvIGl0IGFuZCBpcyBwcm9iYWJseSBtb3JlIGZhbWlsaWFyIHdpdGggaXQgdGhhbgorb3RoZXJzLiBUbyBmaW5kIHRoZSBtYWludGFpbmVyIG9mIGFuIGFwcGxldCwgbG9vayBhdCB0aGUgdG9wIG9mIHRoZSAuYyBmaWxlCitmb3IgYSBuYW1lIGZvbGxvd2luZyB0aGUgd29yZCAnQ29weXJpZ2h0JyBvciAnV3JpdHRlbiBieScgb3IgJ01haW50YWluZXInLgorCitCZWZvcmUgcGx1bmdpbmcgYWhlYWQsIGl0J3MgYSBnb29kIGlkZWEgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1haWxpbmcgbGlzdAordGhhdCBzYXlzOiAiSGV5LCBJIHdhcyB0aGlua2luZyBhYm91dCBhZGRpbmcgdGhlICd0cmFuc21vZ3JpZnknIGZlYXR1cmUgdG8gdGhlCisnZm9vJyBhcHBsZXQuICBXb3VsZCB0aGlzIGJlIHVzZWZ1bD8gSXMgYW55b25lIGVsc2Ugd29ya2luZyBvbiBpdD8iIFlvdSBtaWdodAord2FudCB0byBDQyB0aGUgbWFpbnRhaW5lciAoaWYgYW55KSB3aXRoIHlvdXIgcXVlc3Rpb24uCisKKworCitBcmVhcyBXaGVyZSBZb3UgQ2FuIEhlbHAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCdXN5Ym94IGNhbiBhbHdheXMgdXNlIGltcHJvdmVtZW50ISBJZiB5b3UncmUgbG9va2luZyBmb3Igd2F5cyB0byBoZWxwLCB0aGVyZQorYXJlIGEgdmFyaWV0eSBvZiBhcmVhcyB3aGVyZSB5b3UgY291bGQgaGVscC4KKworCitXaGF0IEJ1c3lib3ggRG9lc24ndCBOZWVkCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0JlZm9yZSBsaXN0aW5nIHRoZSBhcmVhcyB3aGVyZSB5b3UgX2Nhbl8gaGVscCwgaXQncyB3b3J0aHdoaWxlIHRvIG1lbnRpb24gdGhlCithcmVhcyB3aGVyZSB5b3Ugc2hvdWxkbid0IGJvdGhlci4gV2hpbGUgQnVzeWJveCBzdHJpdmVzIHRvIGJlIHRoZSAiU3dpc3MgQXJteQorS25pZmUiIG9mIGVtYmVkZGVkIExpbnV4LCB0aGVyZSBhcmUgc29tZSBhcHBsZXRzIHRoYXQgd2lsbCBub3QgYmUgYWNjZXB0ZWQ6CisKKyAtIEFueSBmaWxlc3lzdGVtIG1hbmlwdWxhdGlvbiB0b29sczogQnVzeWJveCBpcyBmaWxlc3lzdGVtIGluZGVwZW5kZW50IGFuZAorICAgd2UgZG8gbm90IHdhbnQgdG8gc3RhcnQgYWRkaW5nIG1rZnMvZnNjayB0b29scyBmb3IgZXZlcnkgKG9yIGFueSkKKyAgIGZpbGVzeXN0ZW0gdW5kZXIgdGhlIHN1bi4gKGZzY2tfbWluaXguYyBhbmQgbWtmc19taW5peC5jIGFyZSBsaXZpbmcgb24KKyAgIGJvcnJvd2VkIHRpbWUuKSBUaGVyZSBhcmUgZmFyIHRvbyBtYW55IG9mIHRoZXNlIHRvb2xzIG91dCB0aGVyZS4gIFVzZQorICAgdGhlIHVwc3RyZWFtIHZlcnNpb24uICBSYXRpb25hbGU6IGJ1Z3MgaW4gdGhlc2UgdG9vbHMgY2FuIGRlc3Ryb3kKKyAgIHZhc3QgYW1vdW50cyBvZiBkYXRhLiAgS2VlcGluZyB1cCB3aXRoIGZpbGVzeXN0ZW0gZm9ybWF0IGRldmVsb3BtZW50CisgICBpcyBpbXByYWN0aWNhbCAoZXNwZWNpYWxseSBpbiB0aGUgYXJlYSBvZiBrZWVwaW5nIGZzY2sgdG9vbCBzYWZlCisgICBhbmQgdXAtdG8tZGF0ZSkuCisKKyAtIEFueSBkaXNrLCBkZXZpY2UsIG9yIG1lZGlhLXNwZWNpZmljIHRvb2xzOiBVc2UgdGhlIC11dGlscyBvciAtdG9vbHMgcGFja2FnZQorICAgdGhhdCB3YXMgZGVzaWduZWQgZm9yIHlvdXIgZGV2aWNlOyBkb24ndCB0cnkgdG8gc2hvZWhvcm4gdGhlbSBpbnRvIEJ1c3lib3guCisKKyAtIEFueSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdG9vbHM6IEJ1c3lib3ggaXMgKG9yIHNob3VsZCBiZSkgYXJjaGl0ZWN0dXJlCisgICBpbmRlcGVuZGVudC4gRG8gbm90IHNlbmQgdXMgdG9vbHMgdGhhdCBjYW5ub3QgYmUgdXNlZCBhY3Jvc3MgbXVsdGlwbGUKKyAgIHBsYXRmb3JtcyAvIGFyY2hlcy4KKworCitCdWcgUmVwb3J0aW5nCit+fn5+fn5+fn5+fn5+CisKK0lmIHlvdSBmaW5kIGJ1Z3MsIHBsZWFzZSBzdWJtaXQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IHRvIHRoZSBidXN5Ym94IG1haWxpbmcKK2xpc3QgYXQgYnVzeWJveEBidXN5Ym94Lm5ldC4gIEEgd2VsbC13cml0dGVuIGJ1ZyByZXBvcnQgc2hvdWxkIGluY2x1ZGUgYQordHJhbnNjcmlwdCBvZiBhIHNoZWxsIHNlc3Npb24gdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIGJhZCBiZWhhdmlvciBhbmQgZW5hYmxlcworYW55b25lIGVsc2UgdG8gZHVwbGljYXRlIHRoZSBidWcgb24gdGhlaXIgb3duIG1hY2hpbmUuIFRoZSBmb2xsb3dpbmcgaXMgc3VjaAorYW4gZXhhbXBsZToKKworICAgIFRvOiBidXN5Ym94QGJ1c3lib3gubmV0CisgICAgRnJvbTogZGlsaWdlbnRAdGVzdGluZy5saW51eC5vcmcKKyAgICBTdWJqZWN0OiAvYmluL2RhdGUgZG9lc24ndCB3b3JrCisKKyAgICBQYWNrYWdlOiBidXN5Ym94CisgICAgVmVyc2lvbjogMS4wMAorCisgICAgV2hlbiBJIGV4ZWN1dGUgQnVzeWJveCAnZGF0ZScgaXQgcHJvZHVjZXMgdW5leHBlY3RlZCByZXN1bHRzLgorICAgIFdpdGggR05VIGRhdGUgSSBnZXQgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisKKwkkIGRhdGUKKwlXZWQgTWFyIDIxIDE0OjE5OjQxIE1TVCAyMDAxCisKKyAgICBCdXQgd2hlbiBJIHVzZSBCdXN5Qm94IGRhdGUgSSBnZXQgdGhpcyBpbnN0ZWFkOgorCisJJCBkYXRlCisJSWxsZWdhbCBpbnN0cnVjdGlvbgorCisgICAgSSBhbSB1c2luZyBEZWJpYW4gdW5zdGFibGUsIGtlcm5lbCB2ZXJzaW9uIDIuNC4xOS1ybWsxIG9uIGFuIE5ldHdpbmRlciwKKyAgICBhbmQgdGhlIGxhdGVzdCB1Q2xpYmMgZnJvbSBDVlMuCisKKwktRGlsaWdlbnQKKworTm90ZSB0aGUgY2FyZWZ1bCBkZXNjcmlwdGlvbiBhbmQgdXNlIG9mIGV4YW1wbGVzIHNob3dpbmcgbm90IG9ubHkgd2hhdCBCdXN5Qm94Citkb2VzLCBidXQgYWxzbyBhIGNvdW50ZXIgZXhhbXBsZSBzaG93aW5nIHdoYXQgYW4gZXF1aXZhbGVudCBHTlUgYXBwIGRvZXMuICBCdWcKK3JlcG9ydHMgbGFja2luZyBzdWNoIGRldGFpbCBtYXkgbmV2ZXIgYmUgZml4ZWQuLi4gIFRoYW5rcyBmb3IgdW5kZXJzdGFuZGluZy4KKworCisKK1dyaXRlIERvY3VtZW50YXRpb24KK35+fn5+fn5+fn5+fn5+fn5+fn4KKworQ2hhbmNlcyBhcmUsIGRvY3VtZW50YXRpb24gaW4gQnVzeWJveCBpcyBlaXRoZXIgbWlzc2luZyBvciBuZWVkcyBpbXByb3ZlbWVudC4KK0VpdGhlciB3YXksIGhlbHAgaXMgd2VsY29tZS4KKworV29yayBpcyBiZWluZyBkb25lIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmcm9tIHNvdXJjZXMsCitlc3BlY2lhbGx5IGZyb20gdGhlIHVzYWdlLmggZmlsZS4gSWYgeW91IHdhbnQgdG8gY29ycmVjdCB0aGUgZG9jdW1lbnRhdGlvbiwKK3BsZWFzZSBtYWtlIGNoYW5nZXMgdG8gdGhlIHByZS1nZW5lcmF0aW9uIHBhcnRzLCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhdGVkCitkb2N1bWVudGF0aW9uLiBbTW9yZSB0byBjb21lIG9uIHRoaXMgbGF0ZXIuLi5dCisKK0l0IGlzIHByZWZlcnJlZCB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gZG9jdW1lbnRhdGlvbiBiZSBzdWJtaXR0ZWQgaW4gcGF0Y2gKK2Zvcm1hdCAobW9yZSBvbiB0aGlzIGJlbG93KSwgYnV0IHdlJ3JlIGEgbGl0dGxlIG1vcmUgbGVuaWVudCB3aGVuIGl0IGNvbWVzIHRvCitkb2NzLiBZb3UgY291bGQsIGZvciBleGFtcGxlLCBqdXN0IHNheSAiYWZ0ZXIgdGhlIGxpc3Rpbmcgb2YgdGhlIG1vdW50CitvcHRpb25zLCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd291bGQgYmUgaGVscGZ1bC4uLiIKKworCitDb25zdWx0IEV4aXN0aW5nIFNvdXJjZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitGb3IgYSBxdWljayBsaXN0aW5nIG9mICJuZWVkcyB3b3JrIiBzcG90cyBpbiB0aGUgc291cmNlcywgY2QgaW50byB0aGUgQnVzeWJveAorZGlyZWN0b3J5IGFuZCBydW4gdGhlIGZvbGxvd2luZzoKKworCWZvciBpIGluIFRPRE8gRklYTUUgWFhYOyBkbyBmaW5kIC1uYW1lICcqLltjaF0nfHhhcmdzIGdyZXAgJGk7IGRvbmUKKworVGhpcyB3aWxsIHNob3cgYWxsIG9mIHRoZSB0cm91YmxlIHNwb3RzIG9yICdxdWVzdGlvbmFibGUnIGNvZGUuIFBpY2sgYSBzcG90LAorYW55IHNwb3QsIHRoZXNlIGFyZSBhbGwgaW52aXRhdGlvbnMgZm9yIHlvdSB0byBjb250cmlidXRlLgorCisKK0FkZCBhIE5ldyBBcHBsZXQKK35+fn5+fn5+fn5+fn5+fn4KKworSWYgeW91IHdhbnQgdG8gYWRkIGEgbmV3IGFwcGxldCB0byBCdXN5Ym94LCB3ZSdkIGxvdmUgdG8gc2VlIGl0LiBIb3dldmVyLAorYmVmb3JlIHlvdSB3cml0ZSBhbnkgY29kZSwgcGxlYXNlIGFzayBiZWZvcmVoYW5kIG9uIHRoZSBtYWlsaW5nIGxpc3Qgc29tZXRoaW5nCitsaWtlICJEbyB5b3UgdGhpbmsgYXBwbGV0ICdmb28nIHdvdWxkIGJlIHVzZWZ1bCBpbiBCdXN5Ym94PyIgb3IgIldvdWxkIHlvdQorZ3V5cyBhY2NlcHQgYXBwbGV0ICdmb28nIGludG8gQnVzeWJveCBpZiBJIHdlcmUgdG8gd3JpdGUgaXQ/IiBJZiB0aGUgYW5zd2VyIGlzCisibm8iIGJ5IHRoZSBmb2xrcyBvbiB0aGUgbWFpbGluZyBsaXN0LCB0aGVuIHlvdSd2ZSBzYXZlZCB5b3Vyc2VsZiBzb21lIHRpbWUuCitDb252ZXJzZWx5LCB5b3UgY291bGQgZ2V0IHNvbWUgcG9zaXRpdmUgcmVzcG9uc2VzIGZyb20gZm9sa3Mgd2hvIG1pZ2h0IGJlCitpbnRlcmVzdGVkIGluIGhlbHBpbmcgeW91IGltcGxlbWVudCBpdCwgb3IgY2FuIHJlY29tbWVuZCB0aGUgYmVzdCBhcHByb2FjaC4KK1BlcmhhcHMgbW9zdCBpbXBvcnRhbnRseSwgdGhpcyBpcyB5b3VyIHdheSBvZiBjYWxsaW5nICJkaWJzIiBvbiBzb21ldGhpbmcgYW5kCithdm9pZGluZyBkdXBsaWNhdGlvbiBvZiBlZmZvcnQuCisKK0Fsc28sIGJlZm9yZSB5b3Ugd3JpdGUgYSBsaW5lIG9mIGNvZGUsIHBsZWFzZSByZWFkIHRoZSAnbmV3LWFwcGxldC1IT1dUTy50eHQnCitmaWxlIGluIHRoZSBkb2NzLyBkaXJlY3RvcnkuCisKKworSmFuaXRvcmlhbCBXb3JrCit+fn5+fn5+fn5+fn5+fn4KKworVGhlc2UgYXJlIGRpcnR5IGpvYnMsIGJ1dCBzb21lYm9keSdzIGdvdHRhIGRvICdlbS4KKworIC0gU2VjdXJpdHkgYXVkaXRzOgorICAgaHR0cDovL3d3dy5zZWN1cml0eWZvY3VzLmNvbS9wb3B1cHMvZm9ydW1zL3NlY3Byb2cvaW50cm8uc2h0bWwKKworIC0gU3ludGhldGljIGNvZGUgcmVtb3ZhbDogaHR0cDovL3d3dy5wZXJsLmNvbS9wdWIvMjAwMC8wNi9jb21taWZ5Lmh0bWwgLSBUaGlzCisgICBpcyB2ZXJ5IFBlcmwtc3BlY2lmaWMsIGJ1dCB0aGUgYWR2aWNlIGdpdmVuIGluIGhlcmUgYXBwbGllcyBlcXVhbGx5IHdlbGwgdG8KKyAgIEMuCisKKyAtIEMgbGlicmFyeSBmdW5jdGlvbiB1c2UgYXVkaXRzOiBWZXJpZnlpbmcgdGhhdCBmdW5jdGlvbnMgYXJlIGJlaW5nIHVzZWQKKyAgIHByb3Blcmx5IChjYWxsZWQgd2l0aCB0aGUgcmlnaHQgYXJncyksIHJlcGxhY2luZyB1bnNhZmUgbGlicmFyeSBmdW5jdGlvbnMKKyAgIHdpdGggc2FmZXIgdmVyc2lvbnMsIG1ha2luZyBzdXJlIHJldHVybiBjb2RlcyBhcmUgYmVpbmcgY2hlY2tlZCwgZXRjLgorCisgLSBXaGVyZSBhcHByb3ByaWF0ZSwgcmVwbGFjZSBwcmVwcm9jZXNzb3IgZGVmaW5lZCBtYWNyb3MgYW5kIHZhbHVlcyB3aXRoCisgICBjb21waWxlLXRpbWUgZXF1aXZhbGVudHMuCisKKyAtIFN0eWxlIGd1aWRlIGNvbXBsaWFuY2UuIFNlZTogZG9jcy9zdHlsZS1ndWlkZS50eHQKKworIC0gQWRkIHRlc3RjYXNlcyB0byB0ZXN0cy90ZXN0Y2FzZXMuCisKKyAtIE1ha2VmaWxlIGltcHJvdmVtZW50czoKKyAgIGh0dHA6Ly93d3cuY2FuYi5hdXVnLm9yZy5hdS9+bWlsbGVycC9ybWNoL3JlY3UtbWFrZS1jb25zLWhhcm0uaHRtbAorICAgKEkgdGhpbmsgdGhlIHJlY3Vyc2l2ZSBwcm9ibGVtcyBhcmUgcHJldHR5IG11Y2ggdGFrZW4gY2FyZSBvZiBhdCB0aGlzIHBvaW50LCBub24/KQorCisgLSAiVGVuIENvbW1hbmRtZW50cyIgY29tcGxpYW5jZTogKHRoaXMgaXMgYSAibWF5YmUiLCBjZXJ0YWlubHkgbm90IGFzCisgICBpbXBvcnRhbnQgYXMgYW55IG9mIHRoZSBwcmV2aW91cyBpdGVtcy4pCisgICAgaHR0cDovL3d3dy5seXNhdG9yLmxpdS5zZS9jL3Rlbi1jb21tYW5kbWVudHMuaHRtbAorCitPdGhlciB1c2VmdWwgbGlua3M6CisKKyAtIHRoZSBjb21wLmxhbmcuYyBGQVE6IGh0dHA6Ly9ob21lLmRhdGFjb21tLmNoL3Rfd29sZi90dy9jL2luZGV4Lmh0bWwjU291cmNlcworCisKKworU3VibWl0dGluZyBQYXRjaGVzIFRvIEJ1c3lib3gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lcyBvbiBob3cgdG8gc3VibWl0IGEgcGF0Y2ggdG8gQnVzeWJveC4KKworCitNYWtpbmcgQSBQYXRjaAorfn5+fn5+fn5+fn5+fn4KKworSWYgeW91J3ZlIGdvdCBhbm9ueW1vdXMgR2l0IGFjY2VzcyBzZXQgdXAsIG1ha2luZyBhIHBhdGNoIGlzIHNpbXBsZS4gSnVzdCBtYWtlCitzdXJlIHlvdSdyZSBpbiB0aGUgYnVzeWJveC8gZGlyZWN0b3J5IGFuZCB0eXBlOgorCisJZ2l0IGRpZmYgLWIgLXcgPiBteWNoYW5nZXMucGF0Y2gKKworWW91IGNhbiBzZW5kIHRoZSByZXN1bHRpbmcgLnBhdGNoIGZpbGUgdG8gdGhlIG1haWxpbmcgbGlzdCB3aXRoIGEgZGVzY3JpcHRpb24KK29mIHdoYXQgaXQgZG9lcy4gKEJ1dCBub3QgYmVmb3JlIHlvdSB0ZXN0IGl0ISBTZWUgdGhlIG5leHQgc2VjdGlvbiBmb3Igc29tZQorZ3VpZGVsaW5lcy4pIEl0IGlzIHByZWZlcnJlZCB0aGF0IHBhdGNoZXMgYmUgc2VudCBhcyBhdHRhY2htZW50cywgYnV0IGl0IGlzCitub3QgcmVxdWlyZWQuCisKK0Fsc28sIGZlZWwgZnJlZSB0byBoZWxwIHRlc3Qgb3RoZXIgcGVvcGxlJ3MgcGF0Y2hlcyBhbmQgcmVwbHkgdG8gdGhlbSB3aXRoCitjb21tZW50cy4gWW91IGNhbiBhcHBseSBhIHBhdGNoIGJ5IHNhdmluZyBpdCBpbnRvIHlvdXIgYnVzeWJveC8gZGlyZWN0b3J5IGFuZAordHlwaW5nOgorCisJcGF0Y2ggLXAxIDwgbXljaGFuZ2VzLnBhdGNoCisKK1RoZW4geW91IGNhbiByZWNvbXBpbGUsIHNlZSBpZiBpdCBydW5zLCB0ZXN0IGlmIGl0IHdvcmtzIGFzIGFkdmVydGlzZWQsIGFuZAorcG9zdCB5b3VyIGZpbmRpbmdzIHRvIHRoZSBtYWlsaW5nIGxpc3QuCisKK05PVEU6IFBsZWFzZSBkbyBub3QgaW5jbHVkZSBleHRyYW5lb3VzIG9yIGlycmVsZXZhbnQgY2hhbmdlcyBpbiB5b3VyIHBhdGNoZXMuCitQbGVhc2UgZG8gbm90IHRyeSB0byAiYnVuZGxlIiB0d28gcGF0Y2hlcyB0b2dldGhlciBpbnRvIG9uZS4gTWFrZSBzaW5nbGUsCitkaXNjcmVldCBjaGFuZ2VzIG9uIGEgcGVyLXBhdGNoIGJhc2lzLiBTb21ldGltZXMgeW91IG5lZWQgdG8gbWFrZSBhIHBhdGNoIHRoYXQKK3RvdWNoZXMgY29kZSBpbiBtYW55IHBsYWNlcywgYnV0IHRoZXNlIGtpbmQgb2YgcGF0Y2hlcyBhcmUgcmFyZSBhbmQgc2hvdWxkIGJlCitjb29yZGluYXRlZCB3aXRoIGEgbWFpbnRhaW5lci4KKworCitUZXN0aW5nIEd1aWRlbGluZXMKK35+fn5+fn5+fn5+fn5+fn5+fgorCitJdCdzIGNvbnNpZGVyZWQgZ29vZCBmb3JtIHRvIHRlc3QgeW91ciBuZXcgZmVhdHVyZSBiZWZvcmUgeW91IHN1Ym1pdCBhIHBhdGNoCit0byB0aGUgbWFpbGluZyBsaXN0LCBhbmQgZXNwZWNpYWxseSBiZWZvcmUgeW91IHB1c2ggYSBjaGFuZ2UgdG8gR2l0LiBIZXJlCithcmUgc29tZSBndWlkZWxpbmVzIG9uIGhvdyB0byB0ZXN0IHlvdXIgY2hhbmdlcy4KKworIC0gQWx3YXlzIHRlc3QgQnVzeWJveCBhcHBsZXRzIGFnYWluc3QgR05VIGNvdW50ZXJwYXJ0cyBhbmQgbWFrZSBzdXJlIHRoZQorICAgYmVoYXZpb3IgLyBvdXRwdXQgaXMgaWRlbnRpY2FsIGJldHdlZW4gdGhlIHR3by4KKworIC0gVHJ5IHNldmVyYWwgZGlmZmVyZW50IHBlcm11dGF0aW9ucyBhbmQgY29tYmluYXRpb25zIG9mIHRoZSBmZWF0dXJlcyB5b3UncmUKKyAgIGFkZGluZyAoaS5lLiwgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBjb21tYW5kLWxpbmUgc3dpdGNoZXMpIGFuZCBtYWtlIHN1cmUKKyAgIHRoZXkgYWxsIHdvcms7IG1ha2Ugc3VyZSBvbmUgZmVhdHVyZSBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBhbm90aGVyLgorCisgLSBNYWtlIHN1cmUgeW91IHRlc3QgY29tcGlsaW5nIGFnYWluc3QgdGhlIHNvdXJjZSBib3RoIHdpdGggdGhlIGZlYXR1cmUKKyAgIHR1cm5lZCBvbiBhbmQgdHVybmVkIG9mZiBpbiBDb25maWcuaCBhbmQgbWFrZSBzdXJlIEJ1c3lib3ggY29tcGlsZXMgY2xlYW5seQorICAgYm90aCB3YXlzLgorCisgLSBSdW4gdGhlIG11bHRpYnVpbGQucGwgc2NyaXB0IGluIHRoZSB0ZXN0cyBkaXJlY3RvcnkgYW5kIG1ha2Ugc3VyZQorICAgZXZlcnl0aGluZyBjaGVja3Mgb3V0IE9LLiAoRG8gdGhpcyBmcm9tIHdpdGhpbiB0aGUgYnVzeWJveC8gZGlyZWN0b3J5IGJ5CisgICB0eXBpbmc6ICd0ZXN0cy9tdWx0aWJ1aWxkLnBsJy4pCisKKworTWFraW5nIFN1cmUgWW91ciBQYXRjaCBEb2Vzbid0IEdldCBMb3N0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgeW91IGRvbid0IHdhbnQgeW91ciBwYXRjaCB0byBiZSBsb3N0IG9yIGZvcmdvdHRlbiwgc2VuZCBpdCB0byB0aGUgYnVzeWJveAorbWFpbGluZyBsaXN0IHdpdGggYSBzdWJqZWN0IGxpbmUgc29tZXRoaW5nIGxpa2UgdGhpczoKKworCVtQQVRDSF0gLSBBZGRzICJ0cmFuc21vZ3JpZnkiIGZlYXR1cmUgdG8gImZvbyIKKworSW4gdGhlIGJvZHksIHlvdSBzaG91bGQgaGF2ZSBhIHBzZXVkby1oZWFkZXIgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICBQYWNrYWdlOiBidXN5Ym94CisgICAgVmVyc2lvbjogdjEuMDFwcmUgKG9yIHdoYXRldmVyIHRoZSBjdXJyZW50IHZlcnNpb24gaXMpCisgICAgU2V2ZXJpdHk6IHdpc2hsaXN0CisKK1RoZSByZW1haW5kZXIgb2YgdGhlIGJvZHkgc2hvdWxkIHJlYWQgYWxvbmcgdGhlc2UgbGluZXM6CisKKwlUaGlzIHBhdGNoIGFkZHMgdGhlICJ0cmFuc21vZ3JpZnkiIGZlYXR1cmUgdG8gdGhlICJmb28iIGFwcGxldC4gSSBoYXZlCisJdGVzdGVkIHRoaXMgb24gW2FyY2hdIHN5c3RlbShzKSBhbmQgaXQgd29ya3MuIEkgaGF2ZSB0ZXN0ZWQgaXQgYWdhaW5zdCB0aGUKKwlHTlUgY291bnRlcnBhcnRzIGFuZCB0aGUgb3V0cHV0cyBhcmUgaWRlbnRpY2FsLiBJIGhhdmUgcnVuIHRoZSBzY3JpcHRzIGluCisJdGhlICd0ZXN0cycgZGlyZWN0b3J5IGFuZCBub3RoaW5nIGJyZWFrcy4KKworCisKK0ltcHJvdmluZyBZb3VyIENoYW5jZXMgb2YgUGF0Y2ggQWNjZXB0YW5jZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZW4gYWZ0ZXIgeW91IHNlbmQgYSBicmlsbGlhbnQgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdCwgc29tZXRpbWVzIGl0IGNhbiBnbwordW5ub3RpY2VkLCB1bi1yZXBsaWVkLXRvLCBhbmQgc29tZXRpbWVzIChzaWdoKSBldmVuIGxvc3QuIFRoaXMgaXMgYW4KK3VuZm9ydHVuYXRlIGZhY3Qgb2YgbGlmZSwgYnV0IHRoZXJlIGFyZSBzdGVwcyB5b3UgY2FuIHRha2UgdG8gaGVscCB5b3VyIHBhdGNoCitnZXQgbm90aWNlZCBhbmQgY29udmluY2UgYSBtYWludGFpbmVyIHRoYXQgaXQgc2hvdWxkIGJlIGFkZGVkOgorCisKK0JlIFN1Y2NpbmN0Cit+fn5+fn5+fn5+fgorCitBIHBhdGNoIHRoYXQgaW5jbHVkZXMgc21hbGwsIGlzb2xhdGVkLCBvYnZpb3VzIGNoYW5nZXMgaXMgbW9yZSBsaWtlbHkgdG8gYmUKK2FjY2VwdGVkIHRoYW4gYSBwYXRjaCB0aGF0IHRvdWNoZXMgY29kZSBpbiBsb3RzIG9mIGRpZmZlcmVudCBwbGFjZXMgb3IgbWFrZXMKK3N3ZWVwaW5nLCBkdWJpb3VzIGNoYW5nZXMuCisKKworQmFjayBJdCBVcAorfn5+fn5+fn5+fgorCitIYXJkIGZhY3RzIG9uIHdoeSB5b3VyIHBhdGNoIGlzIGJldHRlciB0aGFuIHRoZSBleGlzdGluZyBjb2RlIHdpbGwgZ28gYSBsb25nCit3YXkgdG93YXJkIGNvbnZpbmNpbmcgbWFpbnRhaW5lcnMgdGhhdCB5b3VyIHBhdGNoIHNob3VsZCBiZSBpbmNsdWRlZC4KK1NwZWNpZmljYWxseSwgcGF0Y2hlcyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgYWNjZXB0ZWQgaWYgdGhleSBhcmUgcHJvdmFibHkgbW9yZQorY29ycmVjdCwgc21hbGxlciwgZmFzdGVyLCBzaW1wbGVyLCBvciBtb3JlIG1haW50YWluYWJsZSB0aGFuIHRoZSBleGlzdGluZworY29kZS4KKworQ29udmVyc2VseSwgYW55IHBhdGNoIHRoYXQgaXMgc3VwcG9ydGVkIHdpdGggbm90aGluZyBtb3JlIHRoYW4gIkkgdGhpbmsgdGhpcword291bGQgYmUgY29vbCIgb3IgInRoaXMgcGF0Y2ggaXMgZ29vZCBiZWNhdXNlIEkgc2F5IGl0IGlzIGFuZCBJJ3ZlIGdvdCBhIFBoZAoraW4gQ29tcHV0ZXIgU2NpZW5jZSIgd2lsbCBsaWtlbHkgYmUgaWdub3JlZC4KKworCitGb2xsb3cgVGhlIFN0eWxlIEd1aWRlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0l0J3MgY29uc2lkZXJlZCBnb29kIGZvcm0gdG8gYWJpZGUgYnkgdGhlIGVzdGFibGlzaGVkIGNvZGluZyBzdHlsZSB1c2VkIGluIGEKK3Byb2plY3Q7IEJ1c3lib3ggaXMgbm8gZXhjZXB0aW9uLiBXZSBoYXZlIGdvbmUgc28gZmFyIGFzIHRvIGRlbGluZWF0ZSB0aGUKKyJlbGVtZW50cyBvZiBCdXN5Ym94IHN0eWxlIiBpbiB0aGUgZmlsZSBkb2NzL3N0eWxlLWd1aWRlLnR4dC4gUGxlYXNlIGZvbGxvdwordGhlbS4KKworCitXb3JrIFdpdGggU29tZW9uZSBFbHNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1dvcmtpbmcgb24gYSBwYXRjaCBpbiBpc29sYXRpb24gaXMgbGVzcyBlZmZlY3RpdmUgdGhhbiB3b3JraW5nIHdpdGggc29tZW9uZQorZWxzZSBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMuIElmIGFub3RoZXIgQnVzeWJveCB1c2VyIGlzIGludGVyZXN0ZWQgaW4gd2hhdAoreW91J3JlIGRvaW5nLCB0aGVuIGl0J3MgdHdvIChvciBtb3JlKSB2b2ljZXMgaW5zdGVhZCBvZiBvbmUgdGhhdCBjYW4gcGV0aXRpb24KK2ZvciBpbmNsdXNpb24gb2YgdGhlIHBhdGNoLiBZb3UnbGwgYWxzbyBoYXZlIG1vcmUgcGVvcGxlIHRoYXQgY2FuIHRlc3QgeW91cgorY2hhbmdlcywgb3IgZXZlbiBvZmZlciBzdWdnZXN0aW9ucyBvbiBiZXR0ZXIgYXBwcm9hY2hlcyB5b3UgY291bGQgdGFrZS4KKworR2V0dGluZyBvdGhlciBmb2xrcyBpbnRlcmVzdGVkIGZvbGxvd3MgYXMgYSBuYXR1cmFsIGNvdXJzZSBpZiB5b3UndmUgcmVjZWl2ZWQKK3Jlc3BvbnNlcyBmcm9tIHF1ZXJpZXMgdG8gYXBwbGV0IG1haW50YWluZXIgb3IgcG9zaXRpdmUgcmVzcG9uc2VzIGZyb20gZm9sa3MKK29uIHRoZSBtYWlsaW5nIGxpc3QuCisKK1dlJ3ZlIG1hZGUgc3RyaWRlbnQgZWZmb3J0cyB0byBwdXQgYSB1c2VmdWwgImNvbGxhYm9yYXRpb24iIGluZnJhc3RydWN0dXJlIGluCitwbGFjZSBpbiB0aGUgZm9ybSBvZiBtYWlsaW5nIGxpc3RzLCB0aGUgYnVnIHRyYWNraW5nIHN5c3RlbSwgYW5kIEdpdC4gUGxlYXNlCit1c2UgdGhlc2UgcmVzb3VyY2VzLgorCisKK1NlbmQgUGF0Y2hlcyB0byB0aGUgQnVnIFRyYWNraW5nIFN5c3RlbQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoaXMgd2FzIG1lbnRpb25lZCBhYm92ZSBpbiB0aGUgIk1ha2luZyBTdXJlIFlvdXIgUGF0Y2ggRG9lc24ndCBHZXQgTG9zdCIKK3NlY3Rpb24sIGJ1dCBpdCBpcyB3b3J0aCBtZW50aW9uaW5nIGFnYWluLiBBIHBhdGNoIHNlbnQgdG8gdGhlIG1haWxpbmcgbGlzdAorbWlnaHQgYmUgdW5ub3RpY2VkIGFuZCBmb3Jnb3R0ZW4uIEEgcGF0Y2ggc2VudCB0byB0aGUgYnVnIHRyYWNraW5nIHN5c3RlbSB3aWxsCitiZSBzdG9yZWQgYW5kIGNsb3NlbHkgY29ubmVjdGVkIHRvIHRoZSBidWcgaXQgZml4ZXMuCisKKworQmUgUG9saXRlCit+fn5+fn5+fn4KKworVGhlIG9sZCBzYXlpbmcgIllvdSdsbCBjYXRjaCBtb3JlIGZsaWVzIHdpdGggaG9uZXkgdGhhbiB5b3Ugd2lsbCB3aXRoIHZpbmVnYXIiCithcHBsaWVzIHdoZW4gc3VibWl0dGluZyBwYXRjaGVzIHRvIHRoZSBtYWlsaW5nIGxpc3QgZm9yIGFwcHJvdmFsLiBUaGUgd2F5IHlvdQorcHJlc2VudCB5b3VyIHBhdGNoIGlzIHNvbWV0aW1lcyBqdXN0IGFzIGltcG9ydGFudCBhcyB0aGUgYWN0dWFsIHBhdGNoIGl0c2VsZgorKGlmIG5vdCBtb3JlIHNvKS4gQmVpbmcgcnVkZSB0byB0aGUgbWFpbnRhaW5lcnMgaXMgbm90IGFuIGVmZmVjdGl2ZSB3YXkgdG8KK2NvbnZpbmNlIHRoZW0gdGhhdCB5b3VyIHBhdGNoIHNob3VsZCBiZSBpbmNsdWRlZDsgaXQgd2lsbCBsaWtlbHkgaGF2ZSB0aGUKK29wcG9zaXRlIGVmZmVjdC4KKworCisKK1B1c2hpbmcgQ2hhbmdlcyB0byBHaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IHN1Ym1pdCBzZXZlcmFsIHBhdGNoZXMgdGhhdCBkZW1vbnN0cmF0ZSB0aGF0IHlvdSBhcmUgYSBza2lsbGVkIGFuZCB3aXNlCitjb2RlciwgeW91IG1heSBiZSBpbnZpdGVkIHRvIGJlY29tZSBhIGNvbW1pdHRlciwgdGh1cyBlbmFibGluZyB5b3UgdG8gcHVzaAorY2hhbmdlcyBkaXJlY3RseSB0byBHaXQuIFRoaXMgaXMgbmljZSBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yCitzb21lb25lIGVsc2UgdG8gcHVzaCB5b3VyIGNoYW5nZSBmb3IgeW91LCB5b3UgY2FuIGp1c3QgZG8gaXQgeW91cnNlbGYuCisKK0J1dCBub3RlIHRoYXQgdGhpcyBpcyBhIHByaXZpbGVnZSB0aGF0IGNvbWVzIHdpdGggc29tZSByZXNwb25zaWJpbGl0aWVzLiBZb3UKK3Nob3VsZCB0ZXN0IHlvdXIgY2hhbmdlcyBiZWZvcmUgeW91IHB1c2ggdGhlbS4gWW91IHNob3VsZCBhbHNvIHRhbGsgdG8gYW4KK2FwcGxldCBtYWludGFpbmVyIGJlZm9yZSB5b3UgbWFrZSBhbnkga2luZCBvZiBzd2VlcGluZyBjaGFuZ2VzIHRvIHNvbWVib2R5CitlbHNlJ3MgY29kZS4gQmlnIGNoYW5nZXMgc2hvdWxkIHN0aWxsIGdvIHRvIHRoZSBtYWlsaW5nIGxpc3QgZmlyc3QuIFJlbWVtYmVyLAorYmVpbmcgd2lzZSwgcG9saXRlLCBhbmQgZGlzY3JlZXQgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBiZWluZyBjbGV2ZXIuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEdpdCBwdXNoIGFjY2Vzcywgc2VlOgorCisJaHR0cDovL2J1c3lib3gubmV0L2RldmVsb3Blci5odG1sCisKKworV2hlbiBUbyBQdXNoCit+fn5+fn5+fn5+fn4KKworR2VuZXJhbGx5LCB5b3Ugc2hvdWxkIGZlZWwgZnJlZSB0byBwdXNoIGEgY2hhbmdlIGlmOgorCisgLSBZb3VyIGNoYW5nZXMgYXJlIHNtYWxsIGFuZCBkb24ndCB0b3VjaCBtYW55IGZpbGVzCisgLSBZb3UgYXJlIGZpeGluZyBhIGJ1ZworIC0gU29tZWJvZHkgaGFzIHRvbGQgeW91IHRoYXQgaXQncyBva2F5CisgLSBJdCdzIG9idmlvdXNseSB0aGUgUmlnaHQgVGhpbmcKKworVGhlIG1vcmUgb2YgdGhlIGFib3ZlIGFyZSB0cnVlLCB0aGUgYmV0dGVyIGl0IGlzIHRvIGp1c3QgcHVzaCBhIGNoYW5nZQorZGlyZWN0bHkgdG8gR2l0LgorCisKK1doZW4gTm90IFRvIFB1c2gKK35+fn5+fn5+fn5+fn5+fn4KKworRXZlbiBpZiB5b3UgaGF2ZSBwdXNoIGFjY2VzcywgeW91IHNob3VsZCBwcm9iYWJseSBzdGlsbCBwb3N0IGEgcGF0Y2ggdG8gdGhlCittYWlsaW5nIGxpc3QgaWY6CisKKyAtIFlvdXIgY2hhbmdlcyBhcmUgYnJvYWQgYW5kIHRvdWNoIG1hbnkgZGlmZmVyZW50IGZpbGVzCisgLSBZb3UgYXJlIGFkZGluZyBhIGZlYXR1cmUKKyAtIFlvdXIgY2hhbmdlcyBhcmUgc3BlY3VsYXRpdmUgb3IgZXhwZXJpbWVudGFsIChpLmUuLCB0cnlpbmcgYSBuZXcgYWxnb3JpdGhtKQorIC0gWW91IGFyZSBub3QgdGhlIG1haW50YWluZXIgYW5kIHlvdXIgY2hhbmdlcyBtYWtlIHRoZSBtYWludGFpbmVyIGNyaW5nZQorCitUaGUgbW9yZSBvZiB0aGUgYWJvdmUgYXJlIHRydWUsIHRoZSBiZXR0ZXIgaXQgaXMgdG8gcG9zdCBhIHBhdGNoIHRvIHRoZQorbWFpbGluZyBsaXN0IGluc3RlYWQgb2YgcHVzaGluZy4KKworCisKK0ZpbmFsIFdvcmRzCistLS0tLS0tLS0tLQorCitJZiBhbGwgb2YgdGhpcyBzZWVtcyBjb21wbGljYXRlZCwgZG9uJ3QgcGFuaWMsIGl0J3MgcmVhbGx5IG5vdCB0aGF0IHRvdWdoLiBJZgoreW91J3JlIGhhdmluZyBkaWZmaWN1bHR5IGZvbGxvd2luZyBzb21lIG9mIHRoZSBzdGVwcyBvdXRsaW5lZCBpbiB0aGlzCitkb2N1bWVudCBkb24ndCB3b3JyeSwgdGhlIGZvbGtzIG9uIHRoZSBCdXN5Ym94IG1haWxpbmcgbGlzdCBhcmUgYSBmYWlybHkKK2dvb2QtbmF0dXJlZCBidW5jaCBhbmQgd2lsbCB3b3JrIHdpdGggeW91IHRvIGhlbHAgZ2V0IHlvdXIgcGF0Y2hlcyBpbnRvIHNoYXBlCitvciBoZWxwIHlvdSBtYWtlIGNvbnRyaWJ1dGlvbnMuCmRpZmYgLS1naXQgYS9kb2NzL2N0dHkuaHRtIGIvZG9jcy9jdHR5Lmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ2NmNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jdHR5Lmh0bQpAQCAtMCwwICsxLDQ3NiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgorPGh0bWw+PGhlYWQ+CisgPCEtLSBzYXZlZCBmcm9tIGh0dHA6Ly93d3cud2luLnR1ZS5ubC9+YWViL2xpbnV4L2xrL2xrLTEwLmh0bWwgLS0+CisgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJTR01MLVRvb2xzIDEuMC45Ij48dGl0bGU+VGhlIExpbnV4IGtlcm5lbDogUHJvY2Vzc2VzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGhyPgorPGgyPjxhIG5hbWU9InMxMCI+MTAuIFByb2Nlc3NlczwvYT48L2gyPgorCis8cD5CZWZvcmUgbG9va2luZyBhdCB0aGUgTGludXggaW1wbGVtZW50YXRpb24sIGZpcnN0IGEgZ2VuZXJhbCBVbml4CitkZXNjcmlwdGlvbiBvZiB0aHJlYWRzLCBwcm9jZXNzZXMsIHByb2Nlc3MgZ3JvdXBzIGFuZCBzZXNzaW9ucy4KKzwvcD48cD5BIHNlc3Npb24gY29udGFpbnMgYSBudW1iZXIgb2YgcHJvY2VzcyBncm91cHMsIGFuZCBhIHByb2Nlc3MgZ3JvdXAKK2NvbnRhaW5zIGEgbnVtYmVyIG9mIHByb2Nlc3NlcywgYW5kIGEgcHJvY2VzcyBjb250YWlucyBhIG51bWJlcgorb2YgdGhyZWFkcy4KKzwvcD48cD5BIHNlc3Npb24gY2FuIGhhdmUgYSBjb250cm9sbGluZyB0dHkuCitBdCBtb3N0IG9uZSBwcm9jZXNzIGdyb3VwIGluIGEgc2Vzc2lvbiBjYW4gYmUgYSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAuCitBbiBpbnRlcnJ1cHQgY2hhcmFjdGVyIHR5cGVkIG9uIGEgdHR5ICgiVGVsZXR5cGUiLCBpLmUuLCB0ZXJtaW5hbCkKK2NhdXNlcyBhIHNpZ25hbCB0byBiZSBzZW50IHRvIGFsbCBtZW1iZXJzIG9mIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAKK2luIHRoZSBzZXNzaW9uIChpZiBhbnkpIHRoYXQgaGFzIHRoYXQgdHR5IGFzIGNvbnRyb2xsaW5nIHR0eS4KKzwvcD48cD5BbGwgdGhlc2Ugb2JqZWN0cyBoYXZlIG51bWJlcnMsIGFuZCB3ZSBoYXZlIHRocmVhZCBJRHMsIHByb2Nlc3MgSURzLAorcHJvY2VzcyBncm91cCBJRHMgYW5kIHNlc3Npb24gSURzLgorPC9wPjxwPgorPC9wPjxoMj48YSBuYW1lPSJzczEwLjEiPjEwLjEgUHJvY2Vzc2VzPC9hPgorPC9oMj4KKworPHA+Cis8L3A+PGgzPkNyZWF0aW9uPC9oMz4KKworPHA+QSBuZXcgcHJvY2VzcyBpcyB0cmFkaXRpb25hbGx5IHN0YXJ0ZWQgdXNpbmcgdGhlIDxjb2RlPmZvcmsoKTwvY29kZT4KK3N5c3RlbSBjYWxsOgorPC9wPjxibG9ja3F1b3RlPgorPHByZT5waWRfdCBwOworCitwID0gZm9yaygpOworaWYgKHAgPT0gKHBpZF90KSAtMSkKKyAgICAgICAgLyogRVJST1IgKi8KK2Vsc2UgaWYgKHAgPT0gMCkKKyAgICAgICAgLyogQ0hJTEQgKi8KK2Vsc2UKKyAgICAgICAgLyogUEFSRU5UICovCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPlRoaXMgY3JlYXRlcyBhIGNoaWxkIGFzIGEgZHVwbGljYXRlIG9mIGl0cyBwYXJlbnQuCitQYXJlbnQgYW5kIGNoaWxkIGFyZSBpZGVudGljYWwgaW4gYWxtb3N0IGFsbCByZXNwZWN0cy4KK0luIHRoZSBjb2RlIHRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcGFyZW50CitsZWFybnMgdGhlIHByb2Nlc3MgSUQgb2YgaXRzIGNoaWxkLCB3aGlsZSA8Y29kZT5mb3JrKCk8L2NvZGU+CityZXR1cm5zIDAgaW4gdGhlIGNoaWxkLiAoSXQgY2FuIGZpbmQgdGhlIHByb2Nlc3MgSUQgb2YgaXRzCitwYXJlbnQgdXNpbmcgdGhlIDxjb2RlPmdldHBwaWQoKTwvY29kZT4gc3lzdGVtIGNhbGwuKQorPC9wPjxwPgorPC9wPjxoMz5UZXJtaW5hdGlvbjwvaDM+CisKKzxwPk5vcm1hbCB0ZXJtaW5hdGlvbiBpcyB3aGVuIHRoZSBwcm9jZXNzIGRvZXMKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+ZXhpdChuKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitvcgorPGJsb2NrcXVvdGU+Cis8cHJlPnJldHVybiBuOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK2Zyb20gaXRzIDxjb2RlPm1haW4oKTwvY29kZT4gcHJvY2VkdXJlLiBJdCByZXR1cm5zIHRoZSBzaW5nbGUgYnl0ZSA8Y29kZT5uPC9jb2RlPgordG8gaXRzIHBhcmVudC4KKzxwPkFibm9ybWFsIHRlcm1pbmF0aW9uIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IGEgc2lnbmFsLgorPC9wPjxwPgorPC9wPjxoMz5Db2xsZWN0aW5nIHRoZSBleGl0IGNvZGUuIFpvbWJpZXM8L2gzPgorCis8cD5UaGUgcGFyZW50IGRvZXMKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+cGlkX3QgcDsKK2ludCBzdGF0dXM7CisKK3AgPSB3YWl0KCZhbXA7c3RhdHVzKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCithbmQgY29sbGVjdHMgdHdvIGJ5dGVzOgorPHA+Cis8ZmlndXJlPgorPGVwcyBmaWxlPSJhYnNlbnQiPgorPGltZyBzcmM9ImN0dHlfZmlsZXMvZXhpdF9zdGF0dXMucG5nIj4KKzwvZXBzPgorPC9maWd1cmU+PC9wPjxwPkEgcHJvY2VzcyB0aGF0IGhhcyB0ZXJtaW5hdGVkIGJ1dCBoYXMgbm90IHlldCBiZWVuIHdhaXRlZCBmb3IKK2lzIGEgPGk+em9tYmllPC9pPi4gSXQgbmVlZCBvbmx5IHN0b3JlIHRoZXNlIHR3byBieXRlczoKK2V4aXQgY29kZSBhbmQgcmVhc29uIGZvciB0ZXJtaW5hdGlvbi4KKzwvcD48cD5PbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIHBhcmVudCBkaWVzIGZpcnN0LCA8Y29kZT5pbml0PC9jb2RlPiAocHJvY2VzcyAxKQoraW5oZXJpdHMgdGhlIGNoaWxkIGFuZCBiZWNvbWVzIGl0cyBwYXJlbnQuCis8L3A+PHA+Cis8L3A+PGgzPlNpZ25hbHM8L2gzPgorCis8cD4KKzwvcD48aDM+U3RvcHBpbmc8L2gzPgorCis8cD5Tb21lIHNpZ25hbHMgY2F1c2UgYSBwcm9jZXNzIHRvIHN0b3A6Cis8Y29kZT5TSUdTVE9QPC9jb2RlPiAoc3RvcCEpLAorPGNvZGU+U0lHVFNUUDwvY29kZT4gKHN0b3AgZnJvbSB0dHk6IHByb2JhYmx5IF5aIHdhcyB0eXBlZCksCis8Y29kZT5TSUdUVElOPC9jb2RlPiAodHR5IGlucHV0IGFza2VkIGJ5IGJhY2tncm91bmQgcHJvY2VzcyksCis8Y29kZT5TSUdUVE9VPC9jb2RlPiAodHR5IG91dHB1dCBzZW50IGJ5IGJhY2tncm91bmQgcHJvY2VzcywgYW5kIHRoaXMgd2FzCitkaXNhbGxvd2VkIGJ5IDxjb2RlPnN0dHkgdG9zdG9wPC9jb2RlPikuCis8L3A+PHA+QXBhcnQgZnJvbSBeWiB0aGVyZSBhbHNvIGlzIF5ZLiBUaGUgZm9ybWVyIHN0b3BzIHRoZSBwcm9jZXNzCit3aGVuIGl0IGlzIHR5cGVkLCB0aGUgbGF0dGVyIHN0b3BzIGl0IHdoZW4gaXQgaXMgcmVhZC4KKzwvcD48cD5TaWduYWxzIGdlbmVyYXRlZCBieSB0eXBpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIG9uIHNvbWUgdHR5CithcmUgc2VudCB0byBhbGwgcHJvY2Vzc2VzIHRoYXQgYXJlIGluIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAKK29mIHRoZSBzZXNzaW9uIHRoYXQgaGFzIHRoYXQgdHR5IGFzIGNvbnRyb2xsaW5nIHR0eS4gKERldGFpbHMgYmVsb3cuKQorPC9wPjxwPklmIGEgcHJvY2VzcyBpcyBiZWluZyB0cmFjZWQsIGV2ZXJ5IHNpZ25hbCB3aWxsIHN0b3AgaXQuCis8L3A+PHA+Cis8L3A+PGgzPkNvbnRpbnVpbmc8L2gzPgorCis8cD48Y29kZT5TSUdDT05UPC9jb2RlPjogY29udGludWUgYSBzdG9wcGVkIHByb2Nlc3MuCis8L3A+PHA+Cis8L3A+PGgzPlRlcm1pbmF0aW5nPC9oMz4KKworPHA+PGNvZGU+U0lHS0lMTDwvY29kZT4gKGRpZSEgbm93ISksCis8Y29kZT5TSUdURVJNPC9jb2RlPiAocGxlYXNlLCBnbyBhd2F5KSwKKzxjb2RlPlNJR0hVUDwvY29kZT4gKG1vZGVtIGhhbmd1cCksCis8Y29kZT5TSUdJTlQ8L2NvZGU+ICheQyksCis8Y29kZT5TSUdRVUlUPC9jb2RlPiAoXlwpLCBldGMuCitNYW55IHNpZ25hbHMgaGF2ZSBhcyBkZWZhdWx0IGFjdGlvbiB0byBraWxsIHRoZSB0YXJnZXQuCisoU29tZXRpbWVzIHdpdGggYW4gYWRkaXRpb25hbCBjb3JlIGR1bXAsIHdoZW4gc3VjaCBpcworYWxsb3dlZCBieSBybGltaXQuKQorVGhlIHNpZ25hbHMgPGNvZGU+U0lHQ0hMRDwvY29kZT4gYW5kIDxjb2RlPlNJR1dJTkNIPC9jb2RlPgorYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC4KK0FsbCBleGNlcHQgPGNvZGU+U0lHS0lMTDwvY29kZT4gYW5kIDxjb2RlPlNJR1NUT1A8L2NvZGU+IGNhbiBiZQorY2F1Z2h0IG9yIGlnbm9yZWQgb3IgYmxvY2tlZC4KK0ZvciBkZXRhaWxzLCBzZWUgPGNvZGU+c2lnbmFsKDcpPC9jb2RlPi4KKzwvcD48cD4KKzwvcD48aDI+PGEgbmFtZT0ic3MxMC4yIj4xMC4yIFByb2Nlc3MgZ3JvdXBzPC9hPgorPC9oMj4KKworPHA+RXZlcnkgcHJvY2VzcyBpcyBtZW1iZXIgb2YgYSB1bmlxdWUgPGk+cHJvY2VzcyBncm91cDwvaT4sCitpZGVudGlmaWVkIGJ5IGl0cyA8aT5wcm9jZXNzIGdyb3VwIElEPC9pPi4KKyhXaGVuIHRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQsIGl0IGJlY29tZXMgYSBtZW1iZXIgb2YgdGhlIHByb2Nlc3MgZ3JvdXAKK29mIGl0cyBwYXJlbnQuKQorQnkgY29udmVudGlvbiwgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgYSBwcm9jZXNzIGdyb3VwCitlcXVhbHMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgcHJvY2VzcyBncm91cCwKK2NhbGxlZCB0aGUgPGk+cHJvY2VzcyBncm91cCBsZWFkZXI8L2k+LgorQSBwcm9jZXNzIGZpbmRzIHRoZSBJRCBvZiBpdHMgcHJvY2VzcyBncm91cCB1c2luZyB0aGUgc3lzdGVtIGNhbGwKKzxjb2RlPmdldHBncnAoKTwvY29kZT4sIG9yLCBlcXVpdmFsZW50bHksIDxjb2RlPmdldHBnaWQoMCk8L2NvZGU+LgorT25lIGZpbmRzIHRoZSBwcm9jZXNzIGdyb3VwIElEIG9mIHByb2Nlc3MgPGNvZGU+cDwvY29kZT4gdXNpbmcKKzxjb2RlPmdldHBnaWQocCk8L2NvZGU+LgorPC9wPjxwPk9uZSBtYXkgdXNlIHRoZSBjb21tYW5kIDxjb2RlPnBzIGo8L2NvZGU+IHRvIHNlZSBQUElEIChwYXJlbnQgcHJvY2VzcyBJRCksCitQSUQgKHByb2Nlc3MgSUQpLCBQR0lEIChwcm9jZXNzIGdyb3VwIElEKSBhbmQgU0lEIChzZXNzaW9uIElEKQorb2YgcHJvY2Vzc2VzLiBXaXRoIGEgc2hlbGwgdGhhdCBkb2VzIG5vdCBrbm93IGFib3V0IGpvYiBjb250cm9sLAorbGlrZSA8Y29kZT5hc2g8L2NvZGU+LCBlYWNoIG9mIGl0cyBjaGlsZHJlbiB3aWxsIGJlIGluIHRoZSBzYW1lIHNlc3Npb24KK2FuZCBoYXZlIHRoZSBzYW1lIHByb2Nlc3MgZ3JvdXAgYXMgdGhlIHNoZWxsLiBXaXRoIGEgc2hlbGwgdGhhdCBrbm93cworYWJvdXQgam9iIGNvbnRyb2wsIGxpa2UgPGNvZGU+YmFzaDwvY29kZT4sIHRoZSBwcm9jZXNzZXMgb2Ygb25lIHBpcGVsaW5lLCBsaWtlCis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPiUgY2F0IHBhcGVyIHwgaWRlYWwgfCBwaWMgfCB0YmwgfCBlcW4gfCBkaXRyb2ZmICZndDsgb3V0Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworZm9ybSBhIHNpbmdsZSBwcm9jZXNzIGdyb3VwLgorPHA+Cis8L3A+PGgzPkNyZWF0aW9uPC9oMz4KKworPHA+QSBwcm9jZXNzIDxjb2RlPnBpZDwvY29kZT4gaXMgcHV0IGludG8gdGhlIHByb2Nlc3MgZ3JvdXAgPGNvZGU+cGdpZDwvY29kZT4gYnkKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+c2V0cGdpZChwaWQsIHBnaWQpOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0lmIDxjb2RlPnBnaWQgPT0gcGlkPC9jb2RlPiBvciA8Y29kZT5wZ2lkID09IDA8L2NvZGU+IHRoZW4gdGhpcyBjcmVhdGVzCithIG5ldyBwcm9jZXNzIGdyb3VwIHdpdGggcHJvY2VzcyBncm91cCBsZWFkZXIgPGNvZGU+cGlkPC9jb2RlPi4KK090aGVyd2lzZSwgdGhpcyBwdXRzIDxjb2RlPnBpZDwvY29kZT4gaW50byB0aGUgYWxyZWFkeSBleGlzdGluZworcHJvY2VzcyBncm91cCA8Y29kZT5wZ2lkPC9jb2RlPi4KK0EgemVybyA8Y29kZT5waWQ8L2NvZGU+IHJlZmVycyB0byB0aGUgY3VycmVudCBwcm9jZXNzLgorVGhlIGNhbGwgPGNvZGU+c2V0cGdycCgpPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPnNldHBnaWQoMCwwKTwvY29kZT4uCis8cD4KKzwvcD48aDM+UmVzdHJpY3Rpb25zIG9uIHNldHBnaWQoKTwvaDM+CisKKzxwPlRoZSBjYWxsaW5nIHByb2Nlc3MgbXVzdCBiZSA8Y29kZT5waWQ8L2NvZGU+IGl0c2VsZiwgb3IgaXRzIHBhcmVudCwKK2FuZCB0aGUgcGFyZW50IGNhbiBvbmx5IGRvIHRoaXMgYmVmb3JlIDxjb2RlPnBpZDwvY29kZT4gaGFzIGRvbmUKKzxjb2RlPmV4ZWMoKTwvY29kZT4sIGFuZCBvbmx5IHdoZW4gYm90aCBiZWxvbmcgdG8gdGhlIHNhbWUgc2Vzc2lvbi4KK0l0IGlzIGFuIGVycm9yIGlmIHByb2Nlc3MgPGNvZGU+cGlkPC9jb2RlPiBpcyBhIHNlc3Npb24gbGVhZGVyCisoYW5kIHRoaXMgY2FsbCB3b3VsZCBjaGFuZ2UgaXRzIDxjb2RlPnBnaWQ8L2NvZGU+KS4KKzwvcD48cD4KKzwvcD48aDM+VHlwaWNhbCBzZXF1ZW5jZTwvaDM+CisKKzxwPgorPC9wPjxibG9ja3F1b3RlPgorPHByZT5wID0gZm9yaygpOworaWYgKHAgPT0gKHBpZF90KSAtMSkgeworICAgICAgICAvKiBFUlJPUiAqLworfSBlbHNlIGlmIChwID09IDApIHsgICAgLyogQ0hJTEQgKi8KKyAgICAgICAgc2V0cGdpZCgwLCBwZ2lkKTsKKyAgICAgICAgLi4uCit9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBQQVJFTlQgKi8KKyAgICAgICAgc2V0cGdpZChwLCBwZ2lkKTsKKyAgICAgICAgLi4uCit9Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworVGhpcyBlbnN1cmVzIHRoYXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHBhcmVudCBvciBjaGlsZCBpcyBzY2hlZHVsZWQKK2ZpcnN0LCB0aGUgcHJvY2VzcyBncm91cCBzZXR0aW5nIGlzIGFzIGV4cGVjdGVkIGJ5IGJvdGguCis8cD4KKzwvcD48aDM+U2lnbmFsbGluZyBhbmQgd2FpdGluZzwvaDM+CisKKzxwPk9uZSBjYW4gc2lnbmFsIGFsbCBtZW1iZXJzIG9mIGEgcHJvY2VzcyBncm91cDoKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+a2lsbHBnKHBncnAsIHNpZyk7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPk9uZSBjYW4gd2FpdCBmb3IgY2hpbGRyZW4gaW4gb25lcyBvd24gcHJvY2VzcyBncm91cDoKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+d2FpdHBpZCgwLCAmYW1wO3N0YXR1cywgLi4uKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitvciBpbiBhIHNwZWNpZmllZCBwcm9jZXNzIGdyb3VwOgorPGJsb2NrcXVvdGU+Cis8cHJlPndhaXRwaWQoLXBncnAsICZhbXA7c3RhdHVzLCAuLi4pOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD4KKzwvcD48aDM+Rm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwPC9oMz4KKworPHA+QW1vbmcgdGhlIHByb2Nlc3MgZ3JvdXBzIGluIGEgc2Vzc2lvbiBhdCBtb3N0IG9uZSBjYW4gYmUKK3RoZSA8aT5mb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXA8L2k+IG9mIHRoYXQgc2Vzc2lvbi4KK1RoZSB0dHkgaW5wdXQgYW5kIHR0eSBzaWduYWxzIChzaWduYWxzIGdlbmVyYXRlZCBieSBeQywgXlosIGV0Yy4pCitnbyB0byBwcm9jZXNzZXMgaW4gdGhpcyBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAuCis8L3A+PHA+QSBwcm9jZXNzIGNhbiBkZXRlcm1pbmUgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBpbiBpdHMgc2Vzc2lvbgordXNpbmcgPGNvZGU+dGNnZXRwZ3JwKGZkKTwvY29kZT4sIHdoZXJlIDxjb2RlPmZkPC9jb2RlPiByZWZlcnMgdG8gaXRzCitjb250cm9sbGluZyB0dHkuIElmIHRoZXJlIGlzIG5vbmUsIHRoaXMgcmV0dXJucyBhIHJhbmRvbSB2YWx1ZQorbGFyZ2VyIHRoYW4gMSB0aGF0IGlzIG5vdCBhIHByb2Nlc3MgZ3JvdXAgSUQuCis8L3A+PHA+QSBwcm9jZXNzIGNhbiBzZXQgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBpbiBpdHMgc2Vzc2lvbgordXNpbmcgPGNvZGU+dGNzZXRwZ3JwKGZkLHBncnApPC9jb2RlPiwgd2hlcmUgPGNvZGU+ZmQ8L2NvZGU+IHJlZmVycyB0byBpdHMKK2NvbnRyb2xsaW5nIHR0eSwgYW5kIDxjb2RlPnBncnA8L2NvZGU+IGlzIGEgcHJvY2VzcyBncm91cCBpbgoraXRzIHNlc3Npb24sIGFuZCB0aGlzIHNlc3Npb24gc3RpbGwgaXMgYXNzb2NpYXRlZCB0byB0aGUgY29udHJvbGxpbmcKK3R0eSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorPC9wPjxwPkhvdyBkb2VzIG9uZSBnZXQgPGNvZGU+ZmQ8L2NvZGU+PyBCeSBkZWZpbml0aW9uLCA8Y29kZT4vZGV2L3R0eTwvY29kZT4KK3JlZmVycyB0byB0aGUgY29udHJvbGxpbmcgdHR5LCBlbnRpcmVseSBpbmRlcGVuZGVudCBvZiByZWRpcmVjdHMKK29mIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQuIChUaGVyZSBpcyBhbHNvIHRoZSBmdW5jdGlvbgorPGNvZGU+Y3Rlcm1pZCgpPC9jb2RlPiB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorT24gYSBQT1NJWCBzdGFuZGFyZCBzeXN0ZW0gaXQgd2lsbCByZXR1cm4gPGNvZGU+L2Rldi90dHk8L2NvZGU+LikKK09wZW5pbmcgdGhlIG5hbWUgb2YgdGhlCitjb250cm9sbGluZyB0dHkgZ2l2ZXMgYSBmaWxlIGRlc2NyaXB0b3IgPGNvZGU+ZmQ8L2NvZGU+LgorPC9wPjxwPgorPC9wPjxoMz5CYWNrZ3JvdW5kIHByb2Nlc3MgZ3JvdXBzPC9oMz4KKworPHA+QWxsIHByb2Nlc3MgZ3JvdXBzIGluIGEgc2Vzc2lvbiB0aGF0IGFyZSBub3QgZm9yZWdyb3VuZAorcHJvY2VzcyBncm91cCBhcmUgPGk+YmFja2dyb3VuZCBwcm9jZXNzIGdyb3VwczwvaT4uCitTaW5jZSB0aGUgdXNlciBhdCB0aGUga2V5Ym9hcmQgaXMgaW50ZXJhY3Rpbmcgd2l0aCBmb3JlZ3JvdW5kCitwcm9jZXNzZXMsIGJhY2tncm91bmQgcHJvY2Vzc2VzIHNob3VsZCBzdGF5IGF3YXkgZnJvbSBpdC4KK1doZW4gYSBiYWNrZ3JvdW5kIHByb2Nlc3MgcmVhZHMgZnJvbSB0aGUgdGVybWluYWwgaXQgZ2V0cworYSBTSUdUVElOIHNpZ25hbC4gTm9ybWFsbHksIHRoYXQgd2lsbCBzdG9wIGl0LCB0aGUgam9iIGNvbnRyb2wgc2hlbGwKK25vdGljZXMgYW5kIHRlbGxzIHRoZSB1c2VyLCB3aG8gY2FuIHNheSA8Y29kZT5mZzwvY29kZT4gdG8gY29udGludWUKK3RoaXMgYmFja2dyb3VuZCBwcm9jZXNzIGFzIGEgZm9yZWdyb3VuZCBwcm9jZXNzLCBhbmQgdGhlbiB0aGlzCitwcm9jZXNzIGNhbiByZWFkIGZyb20gdGhlIHRlcm1pbmFsLiBCdXQgaWYgdGhlIGJhY2tncm91bmQgcHJvY2VzcworaWdub3JlcyBvciBibG9ja3MgdGhlIFNJR1RUSU4gc2lnbmFsLCBvciBpZiBpdHMgcHJvY2VzcyBncm91cAoraXMgb3JwaGFuZWQgKHNlZSBiZWxvdyksIHRoZW4gdGhlIHJlYWQoKSByZXR1cm5zIGFuIEVJTyBlcnJvciwKK2FuZCBubyBzaWduYWwgaXMgc2VudC4gKEluZGVlZCwgdGhlIGlkZWEgaXMgdG8gdGVsbCB0aGUgcHJvY2VzcwordGhhdCByZWFkaW5nIGZyb20gdGhlIHRlcm1pbmFsIGlzIG5vdCBhbGxvd2VkIHJpZ2h0IG5vdy4KK0lmIGl0IHdvdWxkbid0IHNlZSB0aGUgc2lnbmFsLCB0aGVuIGl0IHdpbGwgc2VlIHRoZSBlcnJvciByZXR1cm4uKQorPC9wPjxwPldoZW4gYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgd3JpdGVzIHRvIHRoZSB0ZXJtaW5hbCwgaXQgbWF5IGdldAorYSBTSUdUVE9VIHNpZ25hbC4gTWF5OiBuYW1lbHksIHdoZW4gdGhlIGZsYWcgdGhhdCB0aGlzIG11c3QgaGFwcGVuCitpcyBzZXQgKGl0IGlzIG9mZiBieSBkZWZhdWx0KS4gT25lIGNhbiBzZXQgdGhlIGZsYWcgYnkKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+JSBzdHR5IHRvc3RvcAorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK2FuZCBjbGVhciBpdCBhZ2FpbiBieQorPGJsb2NrcXVvdGU+Cis8cHJlPiUgc3R0eSAtdG9zdG9wCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworYW5kIGluc3BlY3QgaXQgYnkKKzxibG9ja3F1b3RlPgorPHByZT4lIHN0dHkgLWEKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitBZ2FpbiwgaWYgVE9TVE9QIGlzIHNldCBidXQgdGhlIGJhY2tncm91bmQgcHJvY2VzcyBpZ25vcmVzIG9yIGJsb2NrcwordGhlIFNJR1RUT1Ugc2lnbmFsLCBvciBpZiBpdHMgcHJvY2VzcyBncm91cCBpcyBvcnBoYW5lZCAoc2VlIGJlbG93KSwKK3RoZW4gdGhlIHdyaXRlKCkgcmV0dXJucyBhbiBFSU8gZXJyb3IsIGFuZCBubyBzaWduYWwgaXMgc2VudC4KKzxwPgorPC9wPjxoMz5PcnBoYW5lZCBwcm9jZXNzIGdyb3VwczwvaDM+CisKKzxwPlRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlciBpcyB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBwcm9jZXNzIGdyb3VwLgorSXQgbWF5IHRlcm1pbmF0ZSBiZWZvcmUgdGhlIG90aGVycywgYW5kIHRoZW4gdGhlIHByb2Nlc3MgZ3JvdXAgaXMKK3dpdGhvdXQgbGVhZGVyLgorPC9wPjxwPkEgcHJvY2VzcyBncm91cCBpcyBjYWxsZWQgPGk+b3JwaGFuZWQ8L2k+IHdoZW4gPGk+dGhlCitwYXJlbnQgb2YgZXZlcnkgbWVtYmVyIGlzIGVpdGhlciBpbiB0aGUgcHJvY2VzcyBncm91cAorb3Igb3V0c2lkZSB0aGUgc2Vzc2lvbjwvaT4uCitJbiBwYXJ0aWN1bGFyLCB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUgc2Vzc2lvbiBsZWFkZXIKK2lzIGFsd2F5cyBvcnBoYW5lZC4KKzwvcD48cD5JZiB0ZXJtaW5hdGlvbiBvZiBhIHByb2Nlc3MgY2F1c2VzIGEgcHJvY2VzcyBncm91cCB0byBiZWNvbWUKK29ycGhhbmVkLCBhbmQgc29tZSBtZW1iZXIgaXMgc3RvcHBlZCwgdGhlbiBhbGwgYXJlIHNlbnQgZmlyc3QgU0lHSFVQCithbmQgdGhlbiBTSUdDT05ULgorPC9wPjxwPlRoZSBpZGVhIGlzIHRoYXQgcGVyaGFwcyB0aGUgcGFyZW50IG9mIHRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlcgoraXMgYSBqb2IgY29udHJvbCBzaGVsbC4gKEluIHRoZSBzYW1lIHNlc3Npb24gYnV0IGEgZGlmZmVyZW50Citwcm9jZXNzIGdyb3VwLikgQXMgbG9uZyBhcyB0aGlzIHBhcmVudCBpcyBhbGl2ZSwgaXQgY2FuCitoYW5kbGUgdGhlIHN0b3BwaW5nIGFuZCBzdGFydGluZyBvZiBtZW1iZXJzIGluIHRoZSBwcm9jZXNzIGdyb3VwLgorV2hlbiBpdCBkaWVzLCB0aGVyZSBtYXkgYmUgbm9ib2R5IHRvIGNvbnRpbnVlIHN0b3BwZWQgcHJvY2Vzc2VzLgorVGhlcmVmb3JlLCB0aGVzZSBzdG9wcGVkIHByb2Nlc3NlcyBhcmUgc2VudCBTSUdIVVAsIHNvIHRoYXQgdGhleQorZGllIHVubGVzcyB0aGV5IGNhdGNoIG9yIGlnbm9yZSBpdCwgYW5kIHRoZW4gU0lHQ09OVCB0byBjb250aW51ZSB0aGVtLgorPC9wPjxwPk5vdGUgdGhhdCB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUgc2Vzc2lvbiBsZWFkZXIgaXMgYWxyZWFkeQorb3JwaGFuZWQsIHNvIG5vIHNpZ25hbHMgYXJlIHNlbnQgd2hlbiB0aGUgc2Vzc2lvbiBsZWFkZXIgZGllcy4KKzwvcD48cD5Ob3RlIGFsc28gdGhhdCBhIHByb2Nlc3MgZ3JvdXAgY2FuIGJlY29tZSBvcnBoYW5lZCBpbiB0d28gd2F5cworYnkgdGVybWluYXRpb24gb2YgYSBwcm9jZXNzOiBlaXRoZXIgaXQgd2FzIGEgcGFyZW50IGFuZCBub3QgaXRzZWxmCitpbiB0aGUgcHJvY2VzcyBncm91cCwgb3IgaXQgd2FzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHByb2Nlc3MgZ3JvdXAKK3dpdGggYSBwYXJlbnQgb3V0c2lkZSBidXQgaW4gdGhlIHNhbWUgc2Vzc2lvbi4KK0Z1cnRoZXJtb3JlLCB0aGF0IGEgcHJvY2VzcyBncm91cCBjYW4gYmVjb21lIG9ycGhhbmVkCitvdGhlciB0aGFuIGJ5IHRlcm1pbmF0aW9uIG9mIGEgcHJvY2VzcywgbmFtZWx5IHdoZW4gc29tZQorbWVtYmVyIGlzIG1vdmVkIHRvIGEgZGlmZmVyZW50IHByb2Nlc3MgZ3JvdXAuCis8L3A+PHA+Cis8L3A+PGgyPjxhIG5hbWU9InNzMTAuMyI+MTAuMyBTZXNzaW9uczwvYT4KKzwvaDI+CisKKzxwPkV2ZXJ5IHByb2Nlc3MgZ3JvdXAgaXMgaW4gYSB1bmlxdWUgPGk+c2Vzc2lvbjwvaT4uCisoV2hlbiB0aGUgcHJvY2VzcyBpcyBjcmVhdGVkLCBpdCBiZWNvbWVzIGEgbWVtYmVyIG9mIHRoZSBzZXNzaW9uCitvZiBpdHMgcGFyZW50LikKK0J5IGNvbnZlbnRpb24sIHRoZSBzZXNzaW9uIElEIG9mIGEgc2Vzc2lvbgorZXF1YWxzIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIHNlc3Npb24sCitjYWxsZWQgdGhlIDxpPnNlc3Npb24gbGVhZGVyPC9pPi4KK0EgcHJvY2VzcyBmaW5kcyB0aGUgSUQgb2YgaXRzIHNlc3Npb24gdXNpbmcgdGhlIHN5c3RlbSBjYWxsCis8Y29kZT5nZXRzaWQoKTwvY29kZT4uCis8L3A+PHA+RXZlcnkgc2Vzc2lvbiBtYXkgaGF2ZSBhIDxpPmNvbnRyb2xsaW5nIHR0eTwvaT4sCit0aGF0IHRoZW4gYWxzbyBpcyBjYWxsZWQgdGhlIGNvbnRyb2xsaW5nIHR0eSBvZiBlYWNoIG9mCitpdHMgbWVtYmVyIHByb2Nlc3Nlcy4KK0EgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udHJvbGxpbmcgdHR5IGlzIG9idGFpbmVkIGJ5CitvcGVuaW5nIDxjb2RlPi9kZXYvdHR5PC9jb2RlPi4gKEFuZCB3aGVuIHRoYXQgZmFpbHMsIHRoZXJlIHdhcyBubworY29udHJvbGxpbmcgdHR5LikgR2l2ZW4gYSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb250cm9sbGluZyB0dHksCitvbmUgbWF5IG9idGFpbiB0aGUgU0lEIHVzaW5nIDxjb2RlPnRjZ2V0c2lkKGZkKTwvY29kZT4uCis8L3A+PHA+QSBzZXNzaW9uIGlzIG9mdGVuIHNldCB1cCBieSBhIGxvZ2luIHByb2Nlc3MuIFRoZSB0ZXJtaW5hbAorb24gd2hpY2ggb25lIGlzIGxvZ2dlZCBpbiB0aGVuIGJlY29tZXMgdGhlIGNvbnRyb2xsaW5nIHR0eQorb2YgdGhlIHNlc3Npb24uIEFsbCBwcm9jZXNzZXMgdGhhdCBhcmUgZGVzY2VuZGFudHMgb2YgdGhlCitsb2dpbiBwcm9jZXNzIHdpbGwgaW4gZ2VuZXJhbCBiZSBtZW1iZXJzIG9mIHRoZSBzZXNzaW9uLgorPC9wPjxwPgorPC9wPjxoMz5DcmVhdGlvbjwvaDM+CisKKzxwPkEgbmV3IHNlc3Npb24gaXMgY3JlYXRlZCBieQorPC9wPjxibG9ja3F1b3RlPgorPHByZT5waWQgPSBzZXRzaWQoKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGlzIGFsbG93ZWQgb25seSB3aGVuIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgbm90IGEgcHJvY2VzcyBncm91cCBsZWFkZXIuCitJbiBvcmRlciB0byBiZSBzdXJlIG9mIHRoYXQgd2UgZm9yayBmaXJzdDoKKzxibG9ja3F1b3RlPgorPHByZT5wID0gZm9yaygpOworaWYgKHApIGV4aXQoMCk7CitwaWQgPSBzZXRzaWQoKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyAod2l0aCBwcm9jZXNzIElEIDxjb2RlPnBpZDwvY29kZT4pCitiZWNvbWVzIHNlc3Npb24gbGVhZGVyIG9mIGEgbmV3IHNlc3Npb24gd2l0aCBzZXNzaW9uIElEIDxjb2RlPnBpZDwvY29kZT4uCitNb3Jlb3ZlciwgaXQgYmVjb21lcyBwcm9jZXNzIGdyb3VwIGxlYWRlciBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLgorQm90aCBzZXNzaW9uIGFuZCBwcm9jZXNzIGdyb3VwIGNvbnRhaW4gb25seSB0aGUgc2luZ2xlIHByb2Nlc3MgPGNvZGU+cGlkPC9jb2RlPi4KK0Z1cnRoZXJtb3JlLCB0aGlzIHByb2Nlc3MgaGFzIG5vIGNvbnRyb2xsaW5nIHR0eS4KKzxwPlRoZSByZXN0cmljdGlvbiB0aGF0IHRoZSBjdXJyZW50IHByb2Nlc3MgbXVzdCBub3QgYmUgYSBwcm9jZXNzIGdyb3VwIGxlYWRlcgoraXMgbmVlZGVkOiBvdGhlcndpc2UgaXRzIFBJRCBzZXJ2ZXMgYXMgUEdJRCBvZiBzb21lIGV4aXN0aW5nIHByb2Nlc3MgZ3JvdXAKK2FuZCBjYW5ub3QgYmUgdXNlZCBhcyB0aGUgUEdJRCBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLgorPC9wPjxwPgorPC9wPjxoMz5HZXR0aW5nIGEgY29udHJvbGxpbmcgdHR5PC9oMz4KKworPHA+SG93IGRvZXMgb25lIGdldCBhIGNvbnRyb2xsaW5nIHRlcm1pbmFsPyBOb2JvZHkga25vd3MsCit0aGlzIGlzIGEgZ3JlYXQgbXlzdGVyeS4KKzwvcD48cD5UaGUgU3lzdGVtIFYgYXBwcm9hY2ggaXMgdGhhdCB0aGUgZmlyc3QgdHR5IG9wZW5lZCBieSB0aGUgcHJvY2VzcworYmVjb21lcyBpdHMgY29udHJvbGxpbmcgdHR5LgorPC9wPjxwPlRoZSBCU0QgYXBwcm9hY2ggaXMgdGhhdCBvbmUgaGFzIHRvIGV4cGxpY2l0bHkgY2FsbAorPC9wPjxibG9ja3F1b3RlPgorPHByZT5pb2N0bChmZCwgVElPQ1NDVFRZLCAwLzEpOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK3RvIGdldCBhIGNvbnRyb2xsaW5nIHR0eS4KKzxwPkxpbnV4IHRyaWVzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoLCBhcyBhbHdheXMsIGFuZCB0aGlzCityZXN1bHRzIGluIGEgdmVyeSBvYnNjdXJlIGNvbXBsZXggb2YgY29uZGl0aW9ucy4gUm91Z2hseToKKzwvcD48cD5UaGUgPGNvZGU+VElPQ1NDVFRZPC9jb2RlPiBpb2N0bCB3aWxsIGdpdmUgdXMgYSBjb250cm9sbGluZyB0dHksCitwcm92aWRlZCB0aGF0IChpKSB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGEgc2Vzc2lvbiBsZWFkZXIsCithbmQgKGlpKSBpdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGNvbnRyb2xsaW5nIHR0eSwgYW5kCisoaWlpKSBtYXliZSB0aGUgdHR5IHNob3VsZCBub3QgYWxyZWFkeSBjb250cm9sIHNvbWUgb3RoZXIgc2Vzc2lvbjsKK2lmIGl0IGRvZXMgaXQgaXMgYW4gZXJyb3IgaWYgd2UgYXJlbid0IHJvb3QsIG9yIHdlIHN0ZWFsIHRoZSB0dHkKK2lmIHdlIGFyZSBhbGwtcG93ZXJmdWwuCitbdmRhOiBjb3JyZWN0aW9uOiB0aGlyZCBwYXJhbWV0ZXIgY29udHJvbHMgdGhpczogaWYgMSwgd2Ugc3RlYWwgdHR5IGZyb20KK2FueSBzdWNoIHNlc3Npb24sIGlmIDAsIHdlIGRvbid0IHN0ZWFsXQorPC9wPjxwPk9wZW5pbmcgc29tZSB0ZXJtaW5hbCB3aWxsIGdpdmUgdXMgYSBjb250cm9sbGluZyB0dHksCitwcm92aWRlZCB0aGF0IChpKSB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGEgc2Vzc2lvbiBsZWFkZXIsIGFuZAorKGlpKSBpdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGNvbnRyb2xsaW5nIHR0eSwgYW5kCisoaWlpKSB0aGUgdHR5IGRvZXMgbm90IGFscmVhZHkgY29udHJvbCBzb21lIG90aGVyIHNlc3Npb24sIGFuZAorKGl2KSB0aGUgb3BlbiBkaWQgbm90IGhhdmUgdGhlIDxjb2RlPk9fTk9DVFRZPC9jb2RlPiBmbGFnLCBhbmQKKyh2KSB0aGUgdHR5IGlzIG5vdCB0aGUgZm9yZWdyb3VuZCBWVCwgYW5kCisodmkpIHRoZSB0dHkgaXMgbm90IHRoZSBjb25zb2xlLCBhbmQKKyh2aWkpIG1heWJlIHRoZSB0dHkgc2hvdWxkIG5vdCBiZSBtYXN0ZXIgb3Igc2xhdmUgcHR5LgorPC9wPjxwPgorPC9wPjxoMz5HZXR0aW5nIHJpZCBvZiBhIGNvbnRyb2xsaW5nIHR0eTwvaDM+CisKKzxwPklmIGEgcHJvY2VzcyB3YW50cyB0byBjb250aW51ZSBhcyBhIGRhZW1vbiwgaXQgbXVzdCBkZXRhY2ggaXRzZWxmCitmcm9tIGl0cyBjb250cm9sbGluZyB0dHkuIEFib3ZlIHdlIHNhdyB0aGF0IDxjb2RlPnNldHNpZCgpPC9jb2RlPgord2lsbCByZW1vdmUgdGhlIGNvbnRyb2xsaW5nIHR0eS4gQWxzbyB0aGUgaW9jdGwgVElPQ05PVFRZIGRvZXMgdGhpcy4KK01vcmVvdmVyLCBpbiBvcmRlciBub3QgdG8gZ2V0IGEgY29udHJvbGxpbmcgdHR5IGFnYWluIGFzIHNvb24gYXMgaXQKK29wZW5zIGEgdHR5LCB0aGUgcHJvY2VzcyBoYXMgdG8gZm9yayBvbmNlIG1vcmUsIHRvIGFzc3VyZSB0aGF0IGl0CitpcyBub3QgYSBzZXNzaW9uIGxlYWRlci4gVHlwaWNhbCBjb2RlIGZyYWdtZW50OgorPC9wPjxwPgorPC9wPjxwcmU+ICAgICAgICBpZiAoKGZvcmsoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICBzZXRzaWQoKTsKKyAgICAgICAgaWYgKChmb3JrKCkpICE9IDApCisgICAgICAgICAgICAgICAgZXhpdCgwKTsKKzwvcHJlPgorPHA+U2VlIGFsc28gPGNvZGU+ZGFlbW9uKDMpPC9jb2RlPi4KKzwvcD48cD4KKzwvcD48aDM+RGlzY29ubmVjdDwvaDM+CisKKzxwPklmIHRoZSB0ZXJtaW5hbCBnb2VzIGF3YXkgYnkgbW9kZW0gaGFuZ3VwLCBhbmQgdGhlIGxpbmUgd2FzIG5vdCBsb2NhbCwKK3RoZW4gYSBTSUdIVVAgaXMgc2VudCB0byB0aGUgc2Vzc2lvbiBsZWFkZXIuCitBbnkgZnVydGhlciByZWFkcyBmcm9tIHRoZSBnb25lIHRlcm1pbmFsIHJldHVybiBFT0YuCisoT3IgcG9zc2libHkgLTEgd2l0aCA8Y29kZT5lcnJubzwvY29kZT4gc2V0IHRvIEVJTy4pCis8L3A+PHA+SWYgdGhlIHRlcm1pbmFsIGlzIHRoZSBzbGF2ZSBzaWRlIG9mIGEgcHNldWRvdHR5LCBhbmQgdGhlIG1hc3RlciBzaWRlCitpcyBjbG9zZWQgKGZvciB0aGUgbGFzdCB0aW1lKSwgdGhlbiBhIFNJR0hVUCBpcyBzZW50IHRvIHRoZSBmb3JlZ3JvdW5kCitwcm9jZXNzIGdyb3VwIG9mIHRoZSBzbGF2ZSBzaWRlLgorPC9wPjxwPldoZW4gdGhlIHNlc3Npb24gbGVhZGVyIGRpZXMsIGEgU0lHSFVQIGlzIHNlbnQgdG8gYWxsIHByb2Nlc3NlcworaW4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cC4gTW9yZW92ZXIsIHRoZSB0ZXJtaW5hbCBzdG9wcyBiZWluZwordGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIG9mIHRoaXMgc2Vzc2lvbiAoc28gdGhhdCBpdCBjYW4gYmVjb21lCit0aGUgY29udHJvbGxpbmcgdGVybWluYWwgb2YgYW5vdGhlciBzZXNzaW9uKS4KKzwvcD48cD5UaHVzLCBpZiB0aGUgdGVybWluYWwgZ29lcyBhd2F5IGFuZCB0aGUgc2Vzc2lvbiBsZWFkZXIgaXMKK2Egam9iIGNvbnRyb2wgc2hlbGwsIHRoZW4gaXQgY2FuIGhhbmRsZSB0aGluZ3MgZm9yIGl0cyBkZXNjZW5kYW50cywKK2UuZy4gYnkgc2VuZGluZyB0aGVtIGFnYWluIGEgU0lHSFVQLgorSWYgb24gdGhlIG90aGVyIGhhbmQgdGhlIHNlc3Npb24gbGVhZGVyIGlzIGFuIGlubm9jZW50IHByb2Nlc3MKK3RoYXQgZG9lcyBub3QgY2F0Y2ggU0lHSFVQLCBpdCB3aWxsIGRpZSwgYW5kIGFsbCBmb3JlZ3JvdW5kIHByb2Nlc3NlcworZ2V0IGEgU0lHSFVQLgorPC9wPjxwPgorPC9wPjxoMj48YSBuYW1lPSJzczEwLjQiPjEwLjQgVGhyZWFkczwvYT4KKzwvaDI+CisKKzxwPkEgcHJvY2VzcyBjYW4gaGF2ZSBzZXZlcmFsIHRocmVhZHMuIE5ldyB0aHJlYWRzICh3aXRoIHRoZSBzYW1lIFBJRAorYXMgdGhlIHBhcmVudCB0aHJlYWQpIGFyZSBzdGFydGVkIHVzaW5nIHRoZSA8Y29kZT5jbG9uZTwvY29kZT4gc3lzdGVtCitjYWxsIHVzaW5nIHRoZSA8Y29kZT5DTE9ORV9USFJFQUQ8L2NvZGU+IGZsYWcuIFRocmVhZHMgYXJlIGRpc3Rpbmd1aXNoZWQKK2J5IGEgPGk+dGhyZWFkIElEPC9pPiAoVElEKS4gQW4gb3JkaW5hcnkgcHJvY2VzcyBoYXMgYSBzaW5nbGUgdGhyZWFkCit3aXRoIFRJRCBlcXVhbCB0byBQSUQuIFRoZSBzeXN0ZW0gY2FsbCA8Y29kZT5nZXR0aWQoKTwvY29kZT4gcmV0dXJucyB0aGUKK1RJRC4gVGhlIHN5c3RlbSBjYWxsIDxjb2RlPnRraWxsKCk8L2NvZGU+IHNlbmRzIGEgc2lnbmFsIHRvIGEgc2luZ2xlIHRocmVhZC4KKzwvcD48cD5FeGFtcGxlOiBhIHByb2Nlc3Mgd2l0aCB0d28gdGhyZWFkcy4gQm90aCBvbmx5IHByaW50IFBJRCBhbmQgVElEIGFuZCBleGl0LgorKExpbnV4IDIuNC4xOSBvciBsYXRlci4pCis8L3A+PHByZT4lIGNhdCAmbHQ7Jmx0OyBFT0YgJmd0OyBnZXR0aWQtZGVtby5jCisjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7c3lzL3R5cGVzLmgmZ3Q7CisjZGVmaW5lIENMT05FX1NJR0hBTkQgICAweDAwMDAwODAwCisjZGVmaW5lIENMT05FX1RIUkVBRCAgICAweDAwMDEwMDAwCisjaW5jbHVkZSAmbHQ7bGludXgvdW5pc3RkLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKK19zeXNjYWxsMChwaWRfdCxnZXR0aWQpCisKK2ludCB0aHJlYWQodm9pZCAqcCkgeworICAgICAgICBwcmludGYoInRocmVhZDogJWQgJWRcbiIsIGdldHRpZCgpLCBnZXRwaWQoKSk7Cit9CisKK21haW4oKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc3RhY2tbNDA5Nl07CisgICAgICAgIGludCBpOworCisgICAgICAgIGkgPSBjbG9uZSh0aHJlYWQsIHN0YWNrKzIwNDgsIENMT05FX1RIUkVBRCB8IENMT05FX1NJR0hBTkQsIE5VTEwpOworICAgICAgICBpZiAoaSA9PSAtMSkKKyAgICAgICAgICAgICAgICBwZXJyb3IoImNsb25lIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoImNsb25lIHJldHVybnMgJWRcbiIsIGkpOworICAgICAgICBwcmludGYoInBhcmVudDogJWQgJWRcbiIsIGdldHRpZCgpLCBnZXRwaWQoKSk7Cit9CitFT0YKKyUgY2MgLW8gZ2V0dGlkLWRlbW8gZ2V0dGlkLWRlbW8uYworJSAuL2dldHRpZC1kZW1vCitjbG9uZSByZXR1cm5zIDIxODI2CitwYXJlbnQ6IDIxODI1IDIxODI1Cit0aHJlYWQ6IDIxODI2IDIxODI1CislCis8L3ByZT4KKzxwPgorPC9wPjxwPgorPC9wPjxocj4KKworPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvZHJhZnQtY29hci1jZ2ktdjExLTAzLWNsZWFuLmh0bWwgYi9kb2NzL2RyYWZ0LWNvYXItY2dpLXYxMS0wMy1jbGVhbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmM5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RyYWZ0LWNvYXItY2dpLXYxMS0wMy1jbGVhbi5odG1sCkBAIC0wLDAgKzEsMjY3NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIgorICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2xvb3NlLmR0ZCI+Cis8SFRNTD4KKyA8SEVBRD4KKyAgPFRJVExFPkNvbW1vbiBHYXRld2F5IEludGVyZmFjZSAtIDEuMSAqRHJhZnQgMDMqIFtodHRwOi8vY2dpLXNwZWMuZ29sdXguY29tL2RyYWZ0LWNvYXItY2dpLXYxMS0wMy1jbGVhbi5odG1sXQorICA8L1RJVExFPgorPCEtLSNpZiBleHByPSIkSFRUUF9VU0VSX0FHRU5UICE9IC9MeW54LyIgLS0+CisgPCEtLSNzZXQgdmFyPSJHVUkiIHZhbHVlPSIxIiAtLT4KKzwhLS0jZW5kaWYgLS0+CisgIDxMSU5LIEhSRUY9Im1haWx0bzpLZW4uQ29hckBHb2x1eC5Db20iIHJldj0icmV2aXNlZCI+CisgIDxMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0iY2dpcC1zdHlsZS1yZmMuY3NzIiBUWVBFPSJ0ZXh0L2NzcyI+CisgIDxNRVRBIG5hbWU9ImxhdGV4c3R5bGUiIGNvbnRlbnQ9InJmYyI+CisgIDxNRVRBIG5hbWU9ImF1dGhvciIgY29udGVudD0iS2VuIEEgTCBDb2FyIj4KKyAgPE1FVEEgbmFtZT0iaW5zdGl0dXRlIiBjb250ZW50PSJJQk0gQ29ycG9yYXRpb24iPgorICA8TUVUQSBuYW1lPSJkYXRlIiBjb250ZW50PSIyNSBKdW5lIDE5OTkiPgorICA8TUVUQSBuYW1lPSJleHBpcmVzIiBjb250ZW50PSJFeHBpcmVzIDMxIERlY2VtYmVyIDE5OTkiPgorICA8TUVUQSBuYW1lPSJkb2N1bWVudCIgY29udGVudD0iSU5URVJORVQtRFJBRlQiPgorICA8TUVUQSBuYW1lPSJmaWxlIiBjb250ZW50PSImbHQ7ZHJhZnQtY29hci1jZ2ktdjExLTAzLnR4dCZndDsiPgorICA8TUVUQSBuYW1lPSJncm91cCIgY29udGVudD0iSU5URVJORVQtRFJBRlQiPgorPCEtLQorICAgIFRoZXJlIGFyZSBhIGxvdCBvZiBCTkYgZnJhZ21lbnRzIGluIHRoaXMgZG9jdW1lbnQuICBUbyBtYWtlIGl0IHdvcmsKKyAgICBpbiBhbGwgcG9zc2libGUgYnJvd3NlcnMgKGluY2x1ZGluZyBMeW54LCB3aGljaCBpcyB1c2VkIHRvIHR1cm4gaXQKKyAgICBpbnRvIHRleHQvcGxhaW4pLCB3ZSBoYW5kbGUgdGhlc2UgYnkgdXNpbmcgUFJFZm9ybWF0dGVkIGJsb2NrcyB3aXRoCisgICAgYSB1bml2ZXJzYWwgaW50ZXJuYWwgbWFyZ2luIG9mIDIsIGluc2lkZSBvbmUtbGV2ZWwgREwgYmxvY2tzLgorIC0tPgorIDwvSEVBRD4KKyA8Qk9EWT4KKyAgPCEtLQorICAgIEhUTUwgZG9lc24ndCBkbyBwYXBlciBwYWdpbmF0aW9uLCBzbyB3ZSBuZWVkIHRvIGZha2UgaXQgb3V0LiAgQmFzaW5nCisgICAgb3VyIGZvcm1hdHRpbmcgdXBvbiBSRkMyMDY4LCB0aGVyZSBhcmUgZm91ciAoNCkgbGluZXMgb2YgaGVhZGVyIGFuZAorICAgIGZvdXIgKDQpIGxpbmVzIG9mIGZvb3RlciBmb3IgZWFjaCBwYWdlLgorCis8RElWIEFMSUdOPSJDRU5URVIiPgorIDxQUkU+CisKKworCisKK0NvYXIsIGV0IGFsLiAgICAgICAgICAgICAgIENHSS8xLjEgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgIE1heSwgMTk5OAorSU5URVJORVQtRFJBRlQgICAgICAgICAgICAgRXhwaXJlcyAxIERlY2VtYmVyIDE5OTggICAgICAgICAgICAgICAgICAgIFtQYWdlIDJdCisKKworIDwvUFJFPgorPC9ESVY+CisgIC0tPgorICA8IS0tCisgICAgVGhlIGZvbGxvd2luZyB3ZWlyZG5lc3Mgd3J0IG5vbi1icmVha2luZyBzcGFjZXMgaXMgdG8gZ2V0IEx5bngKKyAgICAod2hpY2ggaXMgYmFyZWx5IFRBQkxFLWF3YXJlKSB0byBsaW5lIHRoZSBsZWZ0L3JpZ2h0IGp1c3RpZmllZAorICAgIHRleHQgdXAgcHJvcGVybHkuCisgIC0tPgorICA8RElWIEFMSUdOPSJDRU5URVIiPgorICAgPFRBQkxFIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0wIENFTExTUEFDSU5HPTA+CisgICAgPFRSIFZBTElHTj0iVE9QIj4KKyAgICAgPFREIEFMSUdOPSJMRUZUIj4KKyAgICAgIElOVEVSTkVULURSQUZUJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisgICAgIDwvVEQ+CisgICAgIDxURCBBTElHTj0iUklHSFQiPgorICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7S2VuIEEgTCBDb2FyCisgICAgIDwvVEQ+CisgICAgPC9UUj4KKyAgICA8VFIgVkFMSUdOPSJUT1AiPgorICAgICA8VEQgQUxJR049IkxFRlQiPgorICAgICAgZHJhZnQtY29hci1jZ2ktdjExLTAzLntodG1sLHR4dH0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyAgICAgPC9URD4KKyAgICAgPFREIEFMSUdOPSJSSUdIVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJQk0gQ29ycG9yYXRpb24KKyAgICAgPC9URD4KKyAgICA8L1RSPgorICAgIDxUUiBWQUxJR049IlRPUCI+CisgICAgIDxURCBBTElHTj0iTEVGVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyAgICAgPC9URD4KKyAgICAgPFREIEFMSUdOPSJSSUdIVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtELlIuVC4gUm9iaW5zb24KKyAgICAgPC9URD4KKyAgICA8L1RSPgorICAgIDxUUiBWQUxJR049IlRPUCI+CisgICAgIDxURCBBTElHTj0iTEVGVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyAgICAgPC9URD4KKyAgICAgPFREIEFMSUdOPSJSSUdIVCI+CisgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFKlRSQURFJm5ic3A7VUsmbmJzcDtMdGQuCisgICAgIDwvVEQ+CisgICAgPC9UUj4KKyAgICA8VFIgVkFMSUdOPSJUT1AiPgorICAgICA8VEQgQUxJR049IkxFRlQiPgorICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisgICAgIDwvVEQ+CisgICAgIDxURCBBTElHTj0iUklHSFQiPgorICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7MjUgSnVuZSAxOTk5CisgICAgIDwvVEQ+CisgICAgPC9UUj4KKyAgIDwvVEFCTEU+CisgIDwvRElWPgorCisgIDxIMSBBTElHTj0iQ0VOVEVSIj4KKyAgIFRoZSBXV1cgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlCisgICA8QlI+CisgICBWZXJzaW9uIDEuMQorICA8L0gxPgorCis8IS0tI2luY2x1ZGUgdmlydHVhbD0iSS1ELXN0YXRlbWVudCIgLS0+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iQWJzdHJhY3QiPgorICAgIEFic3RyYWN0CisgICA8L0E+CisgIDwvSDI+CisgIDxQPgorICBUaGUgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIGlzIGEgc2ltcGxlIGludGVyZmFjZSBmb3IgcnVubmluZworICBleHRlcm5hbCBwcm9ncmFtcywgc29mdHdhcmUgb3IgZ2F0ZXdheXMgdW5kZXIgYW4gaW5mb3JtYXRpb24gc2VydmVyCisgIGluIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgbWFubmVyLiBDdXJyZW50bHksIHRoZSBzdXBwb3J0ZWQgaW5mb3JtYXRpb24KKyAgc2VydmVycyBhcmUgSFRUUCBzZXJ2ZXJzLgorICA8L1A+CisgIDxQPgorICBUaGUgaW50ZXJmYWNlIGhhcyBiZWVuIGluIHVzZSBieSB0aGUgV29ybGQtV2lkZSBXZWIgc2luY2UgMTk5My4gVGhpcworICBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlCisgICJjdXJyZW50IHByYWN0aWNlIiBwYXJhbWV0ZXJzIG9mIHRoZQorICAnQ0dJLzEuMScgaW50ZXJmYWNlIGRldmVsb3BlZCBhbmQgZG9jdW1lbnRlZCBhdCB0aGUgVS5TLiBOYXRpb25hbAorICBDZW50cmUgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyBbTkNTQS1DR0ldLgorICBUaGlzIGRvY3VtZW50IGFsc28gZGVmaW5lcyB0aGUgdXNlIG9mIHRoZSBDR0kvMS4xIGludGVyZmFjZQorICBvbiB0aGUgVW5peCBhbmQgQW1pZ2FET1ModG0pIHN5c3RlbXMuCisgIDwvUD4KKyAgPFA+CisgIERpc2N1c3Npb24gb2YgdGhpcyBkcmFmdCBvY2N1cnMgb24gdGhlIENHSS1XRyBtYWlsaW5nIGxpc3Q7IHNlZSB0aGUKKyAgcHJvamVjdCBXZWIgcGFnZSBhdAorICA8U0FNUD4mbHQ7VVJMOjxBIEhSRUY9Imh0dHA6Ly9DR0ktU3BlYy5Hb2x1eC5Db20vIgorICAgICAgICAgICAgICAgID5odHRwOi8vQ0dJLVNwZWMuR29sdXguQ29tLzwvQT4mZ3Q7PC9TQU1QPgorICBmb3IgZGV0YWlscyBvbiB0aGUgbWFpbGluZyBsaXN0IGFuZCB0aGUgc3RhdHVzIG9mIHRoZSBwcm9qZWN0LgorICA8L1A+CisKKzwhLS0jaWYgZXhwcj0iJEdVSSIgLS0+CisgIDxIMj4KKyAgIFJldmlzaW9uIEhpc3RvcnkKKyAgPC9IMj4KKyAgPFA+CisgIFRoZSByZXZpc2lvbiBoaXN0b3J5IG9mIHRoaXMgZHJhZnQgaXMgYmVpbmcgbWFpbnRhaW5lZCB1c2luZyBXZWItYmFzZWQKKyAgR1VJIG5vdGF0aW9uLCBzdWNoIGFzIHN0cnVjay10aHJvdWdoIGNoYXJhY3RlcnMgYW5kIGNvbG91ci1jb2RlZAorICBzZWN0aW9ucy4gIFRoZSBmb2xsb3dpbmcgbGVnZW5kIGRlc2NyaWJlcyBob3cgdG8gZGV0ZXJtaW5lIHRoZSBvcmlnaW4KKyAgb2YgYSBwYXJ0aWN1bGFyIHJldmlzaW9uIGFjY29yZGluZyB0byB0aGUgY29sb3VyIG9mIHRoZSB0ZXh0OgorICA8L1A+CisgIDxETCBDT01QQUNUPgorICAgPERUPkJsYWNrCisgICA8L0RUPgorICAgPEREPlJldmlzaW9uIDAwLCByZWxlYXNlZCAyOCBNYXkgMTk5OAorICAgPC9ERD4KKyAgIDxEVD5HcmVlbgorICAgPC9EVD4KKyAgIDxERD5SZXZpc2lvbiAwMSwgcmVsZWFzZWQgMjggRGVjZW1iZXIgMTk5OAorICAgIDxCUj4KKyAgICBNYWpvciBzdHJ1Y3R1cmUgY2hhbmdlOiBTZWN0aW9uIDQsICJSZXF1ZXN0IE1ldGFkYXRhIChNZXRhLVZhcmlhYmxlcykiCisgICAgd2FzIG1vdmVkIGVudGlyZWx5IHVuZGVyIDxBIEhSRUY9IiM3LjAiPlNlY3Rpb24gNzwvQT4sICJEYXRhIElucHV0IHRvIHRoZQorICAgIENHSSBTY3JpcHQuIgorICAgIER1ZSB0byB0aGUgc2l6ZSBvZiB0aGlzIGNoYW5nZSwgaXQgaXMgbm90ZWQgaGVyZSBhbmQgdGhlIHRleHQgaW4gaXRzCisgICAgZm9ybWVyIGxvY2F0aW9uIGRvZXMgPEVNPm5vdDwvRU0+IGFwcGVhciBhcyBzdHJ1Y2t0aHJvdWdoLiAgVGhpcyBoYXMKKyAgICBjYXVzZWQgbWFqb3IgPEEgSFJFRj0iIzYuMCI+c2VjdGlvbnMgNTwvQT4gYW5kIGZvbGxvd2luZyB0byBkZWNyZW1lbnQKKyAgICBieSBvbmUuICBPdGhlcgorICAgIGxhcmdlIHRleHQgbW92ZW1lbnRzIGFyZSBsaWtld2lzZSBub3QgbWFya2VkIHVwLiAgUmVmZXJlbmNlcyB0byBSRkMKKyAgICAxNzM4IHdlcmUgY2hhbmdlZCB0byAyMzk2ICgxNzM4J3MgcmVwbGFjZW1lbnQpLgorICAgPC9ERD4KKyAgIDxEVD5SZWQKKyAgIDwvRFQ+CisgICA8REQ+UmV2aXNpb24gMDIsIHJlbGVhc2VkIDIgQXByaWwsIDE5OTkKKyAgICA8QlI+CisgICAgQWRkZWQgdGV4dCB0byA8QSBIUkVGPSIjOC4zIj5zZWN0aW9uIDguMzwvQT4gZGVmaW5pbmcgY29ycmVjdCBoYW5kbGluZworICAgIG9mIEhUVFAvMS4xCisgICAgcmVxdWVzdHMgdXNpbmcgImNodW5rZWQiIFRyYW5zZmVyLUVuY29kaW5nLiAgTGFiZWxsZWQgbWV0YXZhcmlhYmxlCisgICAgbmFtZXMgaW4gPEEgSFJFRj0iIzguMCI+c2VjdGlvbiA4PC9BPiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkZXRhaWwgc2VjdGlvbgorICAgIG51bWJlcnMuCisgICAgQ2xhcmlmaWVkIGFsbG93ZWQgdXNhZ2Ugb2YgPFNBTVA+U3RhdHVzPC9TQU1QPiBhbmQKKyAgICA8U0FNUD5Mb2NhdGlvbjwvU0FNUD4gcmVzcG9uc2UgaGVhZGVyIGZpZWxkcy4gIEluY2x1ZGVkIG5ldworICAgIEludGVybmV0LURyYWZ0IGxhbmd1YWdlLgorICAgPC9ERD4KKyAgIDxEVD5GdWNoc2lhCisgICA8L0RUPgorICAgPEREPlJldmlzaW9uIDAzLCByZWxlYXNlZCAyNSBKdW5lIDE5OTkKKyAgICA8QlI+CisgICAgQ2hhbmdlZCByZWZlcmVuY2VzIGZyb20gIkhUVFAiIHRvICJQcm90b2NvbC1TcGVjaWZpYyIgZm9yIHRoZSBsaXN0aW5nIG9mCisgICAgdGhpbmdzIGxpa2UgSFRUUF9BQ0NFUFQuICBDaGFuZ2VkICdlbnRpdHktYm9keScgYW5kICdjb250ZW50LWJvZHknIHRvCisgICAgJ21lc3NhZ2UtYm9keS4nICBBZGRlZCBhIG5vdGUgdGhhdCByZXNwb25zZSBoZWFkZXJzIG11c3QgY29tcGx5IHdpdGgKKyAgICByZXF1aXJlbWVudHMgb2YgdGhlIHByb3RvY29sIGxldmVsIGluIHVzZS4gIEFkZGVkIGEgbG90IG9mIHN0dWZmIGFib3V0CisgICAgc2VjdXJpdHkgKHNlY3Rpb24gMTEpLiAgQ2xhcmlmaWVkIGEgYnVuY2ggb2YgcHJvZHVjdGlvbnMuICBQb2ludGVkIG91dAorICAgIHRoYXQgemVyby1sZW5ndGggYW5kIG9taXR0ZWQgdmFsdWVzIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBpbiB0aGlzCisgICAgc3BlY2lmaWNhdGlvbi4gIENsYXJpZmllZCBwcm9kdWN0aW9uIGRlc2NyaWJpbmcgb3JkZXIgb2YgZmllbGRzIGluCisgICAgc2NyaXB0IHJlc3BvbnNlIGhlYWRlci4gIENsYXJpZmllZCBpc3N1ZXMgc3Vycm91bmRpbmcgZW5jb2Rpbmcgb2YKKyAgICBkYXRhLiAgQWNrbm93bGVkZ2VkIGFkZGl0aW9uYWwgY29udHJpYnV0b3JzLCBhbmQgY2hhbmdlZCBvbmUgb2YKKyAgICB0aGUgYXV0aG9ycycgYWRkcmVzc2VzLgorICAgPC9ERD4KKyAgPC9ETD4KKzwhLS0jZW5kaWYgLS0+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iQ29udGVudHMiPgorICAgIFRhYmxlIG9mIENvbnRlbnRzCisgICA8L0E+CisgIDwvSDI+CisgIDxESVYgQUxJR049IkNFTlRFUiI+CisgICA8UFJFPgorICAxIEludHJvZHVjdGlvbi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDEuMSBQdXJwb3NlLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxLjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAxLjIgUmVxdWlyZW1lbnRzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMS4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMS4zIFNwZWNpZmljYXRpb25zLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEuMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDEuNCBUZXJtaW5vbG9neS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxLjQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDIgTm90YXRpb25hbCBDb252ZW50aW9ucyBhbmQgR2VuZXJpYyBHcmFtbWFyLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMi4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMi4xIEF1Z21lbnRlZCBCTkYuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzIuMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDIuMiBCYXNpYyBSdWxlcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMyLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDMgUHJvdG9jb2wgUGFyYW1ldGVycy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMy4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMy4xIFVSTCBFbmNvZGluZy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzMuMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDMuMiBUaGUgU2NyaXB0LVVSSS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMzLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDQgSW52b2tpbmcgdGhlIFNjcmlwdC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNC4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICA1IFRoZSBDR0kgU2NyaXB0IENvbW1hbmQgTGluZS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzUuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgNiBEYXRhIElucHV0IHRvIHRoZSBDR0kgU2NyaXB0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICA2LjEgUmVxdWVzdCBNZXRhZGF0YSAoTWV0YXZhcmlhYmxlcykuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xIEFVVEhfVFlQRS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4yIENPTlRFTlRfTEVOR1RILi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4zIENPTlRFTlRfVFlQRS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS40IEdBVEVXQVlfSU5URVJGQUNFLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS40IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS41IFByb3RvY29sLVNwZWNpZmljIE1ldGF2YXJpYWJsZXMuLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS41IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS42IFBBVEhfSU5GTy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS42IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS43IFBBVEhfVFJBTlNMQVRFRC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS43IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS44IFFVRVJZX1NUUklORy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS44IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS45IFJFTU9URV9BRERSLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS45IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xMCBSRU1PVEVfSE9TVC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA2LjEuMTEgUkVNT1RFX0lERU5ULi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEuMTEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjEyIFJFTU9URV9VU0VSLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjEyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xMyBSRVFVRVNUX01FVEhPRC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA2LjEuMTQgU0NSSVBUX05BTUUuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEuMTQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjE1IFNFUlZFUl9OQU1FLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjE1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMS4xNiBTRVJWRVJfUE9SVC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMS4xNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA2LjEuMTcgU0VSVkVSX1BST1RPQ09MLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM2LjEuMTciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgNi4xLjE4IFNFUlZFUl9TT0ZUV0FSRS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNi4xLjE4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDYuMiBSZXF1ZXN0IE1lc3NhZ2UtQm9kaWVzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzYuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgNyBEYXRhIE91dHB1dCBmcm9tIHRoZSBDR0kgU2NyaXB0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM3LjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICA3LjEgTm9uLVBhcnNlZCBIZWFkZXIgT3V0cHV0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNy4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgNy4yIFBhcnNlZCBIZWFkZXIgT3V0cHV0Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICA3LjIuMSBDR0kgaGVhZGVyIGZpZWxkcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM3LjIuMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICAgNy4yLjEuMSBDb250ZW50LVR5cGUuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM3LjIuMS4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgICA3LjIuMS4yIExvY2F0aW9uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMi4xLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgIDcuMi4xLjMgU3RhdHVzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjNy4yLjEuMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgICAgNy4yLjEuNCBFeHRlbnNpb24gaGVhZGVyIGZpZWxkcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM3LjIuMS4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDcuMi4yIEhUVFAgaGVhZGVyIGZpZWxkcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzcuMi4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICA4IFNlcnZlciBJbXBsZW1lbnRhdGlvbi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDguMSBSZXF1aXJlbWVudHMgZm9yIFNlcnZlcnMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM4LjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgOC4xLjEgU2NyaXB0LVVSSS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOC4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDguMS4yIFJlcXVlc3QgTWVzc2FnZS1ib2R5IEhhbmRsaW5nLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMS4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDguMS4zIFJlcXVpcmVkIE1ldGF2YXJpYWJsZXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMS4zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgIDguMS40IFJlc3BvbnNlIENvbXBsaWFuY2UuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMS40IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgOC4yIFJlY29tbWVuZGF0aW9ucyBmb3IgU2VydmVycy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzguMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDguMyBTdW1tYXJ5IG9mIE1ldGF2YXJpYWJsZXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM4LjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDkgU2NyaXB0IEltcGxlbWVudGF0aW9uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjOS4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgOS4xIFJlcXVpcmVtZW50cyBmb3IgU2NyaXB0cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzkuMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDkuMiBSZWNvbW1lbmRhdGlvbnMgZm9yIFNjcmlwdHMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiM5LjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDEwIFN5c3RlbSBTcGVjaWZpY2F0aW9ucy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTAuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDEwLjEgQW1pZ2FET1MuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMC4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMTAuMiBVbml4Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzEwLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDExIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTEuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDExLjEgU2FmZSBNZXRob2RzLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMS4xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMTEuMiBIVFRQIEhlYWRlciBGaWVsZHMgQ29udGFpbmluZyBTZW5zaXRpdmUgSW5mb3JtYXRpb24uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzExLjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAxMS4zIFNjcmlwdCBJbnRlcmZlcmVuY2Ugd2l0aCB0aGUgU2VydmVyLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTEuMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgIDExLjQgRGF0YSBMZW5ndGggYW5kIEJ1ZmZlcmluZyBDb25zaWRlcmF0aW9ucy4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMS40IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAgMTEuNSBTdGF0ZWxlc3MgUHJvY2Vzc2luZy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzExLjUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgIDEyIEFja25vd2xlZGdtZW50cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLjxBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVGPSIjMTIuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlRCRDwvQT4KKyAgMTMgUmVmZXJlbmNlcy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uPEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUY9IiMxMy4wIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+VEJEPC9BPgorICAxNCBBdXRob3JzJyBBZGRyZXNzZXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi48QQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFRj0iIzE0LjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5UQkQ8L0E+CisgICAgIDwvUFJFPgorICA8L0RJVj4KKworICA8SDI+CisgICA8QSBOQU1FPSIxLjAiPgorICAgIDEuIEludHJvZHVjdGlvbgorICAgPC9BPgorICA8L0gyPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjEuMSI+CisgICAgMS4xLiBQdXJwb3NlCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUb2dldGhlciB0aGUgSFRUUCBbPEEgSFJFRj0iI1szXSI+MzwvQT4sPEEgSFJFRj0iI1s4XSI+ODwvQT5dIHNlcnZlcgorICBhbmQgdGhlIENHSSBzY3JpcHQgYXJlIHJlc3BvbnNpYmxlCisgIGZvciBzZXJ2aWNpbmcgYSBjbGllbnQKKyAgcmVxdWVzdCBieSBzZW5kaW5nIGJhY2sgcmVzcG9uc2VzLiBUaGUgY2xpZW50CisgIHJlcXVlc3QgY29tcHJpc2VzIGEgVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkKKyAgWzxBIEhSRUY9IiNbMV0iPjE8L0E+XSwgYQorICByZXF1ZXN0IG1ldGhvZCwgYW5kIHZhcmlvdXMgYW5jaWxsYXJ5CisgIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0CisgIHByb3ZpZGVkIGJ5IHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtLgorICA8L1A+CisgIDxQPgorICBUaGUgQ0dJIGRlZmluZXMgdGhlIGFic3RyYWN0IHBhcmFtZXRlcnMsIGtub3duIGFzCisgIG1ldGF2YXJpYWJsZXMsCisgIHdoaWNoIGRlc2NyaWJlIHRoZSBjbGllbnQncworICByZXF1ZXN0LiBUb2dldGhlciB3aXRoIGEKKyAgY29uY3JldGUgcHJvZ3JhbW1lciBpbnRlcmZhY2UgdGhpcyBzcGVjaWZpZXMgYSBwbGF0Zm9ybS1pbmRlcGVuZGVudAorICBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc2NyaXB0IGFuZCB0aGUgSFRUUCBzZXJ2ZXIuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSIxLjIiPgorICAgIDEuMi4gUmVxdWlyZW1lbnRzCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGlzIHNwZWNpZmljYXRpb24gdXNlcyB0aGUgc2FtZSB3b3JkcyBhcyBSRkMgMTEyMworICBbPEEgSFJFRj0iI1s1XSI+NTwvQT5dIHRvIGRlZmluZSB0aGUKKyAgc2lnbmlmaWNhbmNlIG9mIGVhY2ggcGFydGljdWxhciByZXF1aXJlbWVudC4gVGhlc2UgYXJlOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPERMPgorICAgPERUPjxFTT5NVVNUPC9FTT4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhpcyB3b3JkIG9yIHRoZSBhZGplY3RpdmUgJ3JlcXVpcmVkJyBtZWFucyB0aGF0IHRoZSBpdGVtIGlzIGFuCisgICAgYWJzb2x1dGUgcmVxdWlyZW1lbnQgb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48RU0+U0hPVUxEPC9FTT4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhpcyB3b3JkIG9yIHRoZSBhZGplY3RpdmUgJ3JlY29tbWVuZGVkJyBtZWFucyB0aGF0IHRoZXJlIG1heQorICAgIGV4aXN0IHZhbGlkIHJlYXNvbnMgaW4gcGFydGljdWxhciBjaXJjdW1zdGFuY2VzIHRvIGlnbm9yZSB0aGlzCisgICAgaXRlbSwgYnV0IHRoZSBmdWxsIGltcGxpY2F0aW9ucyBzaG91bGQgYmUgdW5kZXJzdG9vZCBhbmQgdGhlIGNhc2UKKyAgICBjYXJlZnVsbHkgd2VpZ2hlZCBiZWZvcmUgY2hvb3NpbmcgYSBkaWZmZXJlbnQgY291cnNlLgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEVNPk1BWTwvRU0+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoaXMgd29yZCBvciB0aGUgYWRqZWN0aXZlICdvcHRpb25hbCcgbWVhbnMgdGhhdCB0aGlzIGl0ZW0gaXMKKyAgICB0cnVseSBvcHRpb25hbC4gT25lIHZlbmRvciBtYXkgY2hvb3NlIHRvIGluY2x1ZGUgdGhlIGl0ZW0gYmVjYXVzZQorICAgIGEgcGFydGljdWxhciBtYXJrZXRwbGFjZSByZXF1aXJlcyBpdCBvciBiZWNhdXNlIGl0IGVuaGFuY2VzIHRoZQorICAgIHByb2R1Y3QsIGZvciBleGFtcGxlOyBhbm90aGVyIHZlbmRvciBtYXkgb21pdCB0aGUgc2FtZSBpdGVtLgorICAgIDwvUD4KKyAgIDwvREQ+CisgIDwvREw+CisgIDxQPgorICBBbiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgY29tcGxpYW50IGlmIGl0IGZhaWxzIHRvIHNhdGlzZnkgb25lIG9yIG1vcmUKKyAgb2YgdGhlICdtdXN0JyByZXF1aXJlbWVudHMgZm9yIHRoZSBwcm90b2NvbHMgaXQgaW1wbGVtZW50cy4gQW4KKyAgaW1wbGVtZW50YXRpb24gdGhhdCBzYXRpc2ZpZXMgYWxsIG9mIHRoZSAnbXVzdCcgYW5kIGFsbCBvZiB0aGUKKyAgJ3Nob3VsZCcgcmVxdWlyZW1lbnRzIGZvciBpdHMgZmVhdHVyZXMgaXMgc2FpZCB0byBiZSAndW5jb25kaXRpb25hbGx5CisgIGNvbXBsaWFudCc7IG9uZSB0aGF0IHNhdGlzZmllcyBhbGwgb2YgdGhlICdtdXN0JyByZXF1aXJlbWVudHMgYnV0IG5vdAorICBhbGwgb2YgdGhlICdzaG91bGQnIHJlcXVpcmVtZW50cyBmb3IgaXRzIGZlYXR1cmVzIGlzIHNhaWQgdG8gYmUKKyAgJ2NvbmRpdGlvbmFsbHkgY29tcGxpYW50LicKKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjEuMyI+CisgICAgMS4zLiBTcGVjaWZpY2F0aW9ucworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgTm90IGFsbCBvZiB0aGUgZnVuY3Rpb25zIGFuZCBmZWF0dXJlcyBvZiB0aGUgQ0dJIGFyZSBkZWZpbmVkIGluIHRoZQorICBtYWluIHBhcnQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiBUaGUgZm9sbG93aW5nIHBocmFzZXMgYXJlIHVzZWQgdG8KKyAgZGVzY3JpYmUgdGhlIGZlYXR1cmVzIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWVkOgorICA8L1A+CisgIDxETD4KKyAgIDxEVD48RU0+c3lzdGVtIGRlZmluZWQ8L0VNPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGUgZmVhdHVyZSBtYXkgZGlmZmVyIGJldHdlZW4gc3lzdGVtcywgYnV0IG11c3QgYmUgdGhlIHNhbWUgZm9yCisgICAgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyB1c2luZyB0aGUgc2FtZSBzeXN0ZW0uIEEgc3lzdGVtIHdpbGwKKyAgICB1c3VhbGx5IGlkZW50aWZ5IGEgY2xhc3Mgb2Ygb3BlcmF0aW5nLXN5c3RlbXMuIFNvbWUgc3lzdGVtcyBhcmUKKyAgICBkZWZpbmVkIGluCisgICAgPEEgSFJFRj0iIzEwLjAiCisgICAgPnNlY3Rpb24gMTA8L0E+IG9mIHRoaXMgZG9jdW1lbnQuCisgICAgTmV3IHN5c3RlbXMgbWF5IGJlIGRlZmluZWQKKyAgICBieSBuZXcgc3BlY2lmaWNhdGlvbnMgd2l0aG91dCByZXZpc2lvbiBvZiB0aGlzIGRvY3VtZW50LgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEVNPmltcGxlbWVudGF0aW9uIGRlZmluZWQ8L0VNPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGUgYmVoYXZpb3VyIG9mIHRoZSBmZWF0dXJlIG1heSB2YXJ5IGZyb20gaW1wbGVtZW50YXRpb24gdG8KKyAgICBpbXBsZW1lbnRhdGlvbiwgYnV0IGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBtdXN0IGRvY3VtZW50IGl0cworICAgIGJlaGF2aW91ci4KKyAgICA8L1A+CisgICA8L0REPgorICA8L0RMPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjEuNCI+CisgICAgMS40LiBUZXJtaW5vbG9neQorICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgVGhpcyBzcGVjaWZpY2F0aW9uIHVzZXMgbWFueSB0ZXJtcyBkZWZpbmVkIGluIHRoZSBIVFRQLzEuMQorICBzcGVjaWZpY2F0aW9uIFs8QSBIUkVGPSIjWzhdIj44PC9BPl07IGhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgdGVybXMgYXJlCisgIHVzZWQgaGVyZSBpbiBhCisgIHNlbnNlIHdoaWNoIG1heSBub3QgYWNjb3JkIHdpdGggdGhlaXIgZGVmaW5pdGlvbnMgaW4gdGhhdCBkb2N1bWVudCwKKyAgb3Igd2l0aCB0aGVpciBjb21tb24gbWVhbmluZy4KKyAgPC9QPgorCisgIDxETD4KKyAgIDxEVD48RU0+bWV0YXZhcmlhYmxlPC9FTT4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgQSBuYW1lZCBwYXJhbWV0ZXIgdGhhdCBjYXJyaWVzIGluZm9ybWF0aW9uIGZyb20gdGhlIHNlcnZlciB0byB0aGUKKyAgICBzY3JpcHQuIEl0IGlzIG5vdCBuZWNlc3NhcmlseSBhIHZhcmlhYmxlIGluIHRoZSBvcGVyYXRpbmctc3lzdGVtJ3MKKyAgICBlbnZpcm9ubWVudCwgYWx0aG91Z2ggdGhhdCBpcyB0aGUgbW9zdCBjb21tb24gaW1wbGVtZW50YXRpb24uCisgICAgPC9QPgorICAgPC9ERD4KKworICAgPERUPjxFTT5zY3JpcHQ8L0VNPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGUgc29mdHdhcmUgd2hpY2ggaXMgaW52b2tlZCBieSB0aGUgc2VydmVyIDxFTT52aWE8L0VNPiB0aGlzCisgICAgaW50ZXJmYWNlLiBJdAorICAgIG5lZWQgbm90IGJlIGEgc3RhbmRhbG9uZSBwcm9ncmFtLCBidXQgY291bGQgYmUgYQorICAgIGR5bmFtaWNhbGx5LWxvYWRlZCBvciBzaGFyZWQgbGlicmFyeSwgb3IgZXZlbiBhIHN1YnJvdXRpbmUgaW4gdGhlCisgICAgc2VydmVyLiAgSXQgPEVNPm1heTwvRU0+IGJlIGEgc2V0IG9mIHN0YXRlbWVudHMKKyAgICBpbnRlcnByZXRlZCBhdCBydW4tdGltZSwgYXMgdGhlIHRlcm0gJ3NjcmlwdCcgaXMgZnJlcXVlbnRseQorICAgIHVuZGVyc3Rvb2QsIGJ1dCB0aGF0IGlzIG5vdCBhIHJlcXVpcmVtZW50IGFuZCB3aXRoaW4gdGhlIGNvbnRleHQKKyAgICBvZiB0aGlzIHNwZWNpZmljYXRpb24gdGhlIHRlcm0gaGFzIHRoZSBicm9hZGVyIGRlZmluaXRpb24gc3RhdGVkLgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEVNPnNlcnZlcjwvRU0+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHdoaWNoIGludm9rZXMgdGhlIHNjcmlwdCBpbiBvcmRlciB0byBzZXJ2aWNlCisgICAgcmVxdWVzdHMuCisgICAgPC9QPgorICAgPC9ERD4KKyAgPC9ETD4KKworICA8SDI+CisgICA8QSBOQU1FPSIyLjAiPgorICAgIDIuIE5vdGF0aW9uYWwgQ29udmVudGlvbnMgYW5kIEdlbmVyaWMgR3JhbW1hcgorICAgPC9BPgorICA8L0gyPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjIuMSI+CisgICAgMi4xLiBBdWdtZW50ZWQgQk5GCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBBbGwgb2YgdGhlIG1lY2hhbmlzbXMgc3BlY2lmaWVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIGRlc2NyaWJlZCBpbgorICBib3RoIHByb3NlIGFuZCBhbiBhdWdtZW50ZWQgQmFja3VzLU5hdXIgRm9ybSAoQk5GKSBzaW1pbGFyIHRvIHRoYXQKKyAgdXNlZCBieSBSRkMgODIyIFs8QSBIUkVGPSIjWzZdIj42PC9BPl0uIFRoaXMgYXVnbWVudGVkIEJORiBjb250YWlucworICB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdHM6CisgIDwvUD4KKyAgPERMPgorICAgPERUPm5hbWUgPSBkZWZpbml0aW9uCisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZQorICAgIGRlZmluaXRpb24gYnkgdGhlIGVxdWFsIGNoYXJhY3RlciAoIj0iKS4gV2hpdGVzcGFjZSBpcyBvbmx5CisgICAgc2lnbmlmaWNhbnQgaW4gdGhhdCBjb250aW51YXRpb24gbGluZXMgb2YgYSBkZWZpbml0aW9uIGFyZQorICAgIGluZGVudGVkLgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+ImxpdGVyYWwiCisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFF1b3RhdGlvbiBtYXJrcyAoIikgc3Vycm91bmQgbGl0ZXJhbCB0ZXh0LCBleGNlcHQgZm9yIGEgbGl0ZXJhbAorICAgIHF1b3RhdGlvbiBtYXJrLCB3aGljaCBpcyBzdXJyb3VuZGVkIGJ5IGFuZ2xlLWJyYWNrZXRzICgiJmx0OyIgYW5kICImZ3Q7IikuCisgICAgVW5sZXNzIHN0YXRlZCBvdGhlcndpc2UsIHRoZSB0ZXh0IGlzIGNhc2Utc2Vuc2l0aXZlLgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+cnVsZTEgfCBydWxlMgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBBbHRlcm5hdGl2ZSBydWxlcyBhcmUgc2VwYXJhdGVkIGJ5IGEgdmVydGljYWwgYmFyICgifCIpLgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+KHJ1bGUxIHJ1bGUyIHJ1bGUzKQorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBFbGVtZW50cyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBhcmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBlbGVtZW50LgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+KnJ1bGUKKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgQSBydWxlIHByZWNlZGVkIGJ5IGFuIGFzdGVyaXNrICgiKiIpIG1heSBoYXZlIHplcm8gb3IgbW9yZQorICAgIG9jY3VycmVuY2VzLiBBIHJ1bGUgcHJlY2VkZWQgYnkgYW4gaW50ZWdlciBmb2xsb3dlZCBieSBhbiBhc3RlcmlzaworICAgIG11c3Qgb2NjdXIgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD5bcnVsZV0KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgQW4gZWxlbWVudCBlbmNsb3NlZCBpbiBzcXVhcmUKKyAgICBicmFja2V0cyAoIlsiIGFuZCAiXSIpIGlzIG9wdGlvbmFsLgorICAgIDwvUD4KKyAgIDwvREQ+CisgIDwvREw+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMi4yIj4KKyAgICAyLjIuIEJhc2ljIFJ1bGVzCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhpcyBzcGVjaWZpY2F0aW9uIHRvCisgIGRlc2NyaWJlIGJhc2ljIHBhcnNpbmcgY29uc3RydWN0cy4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgYWxwaGEgICAgICAgICA9IGxvd2FscGhhIHwgaGlhbHBoYQorICAgIGFscGhhbnVtICAgICAgPSBhbHBoYSB8IGRpZ2l0CisgICAgbG93YWxwaGEgICAgICA9ICJhIiB8ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJmIiB8ICJnIiB8ICJoIgorICAgICAgICAgICAgICAgICAgICB8ICJpIiB8ICJqIiB8ICJrIiB8ICJsIiB8ICJtIiB8ICJuIiB8ICJvIiB8ICJwIgorICAgICAgICAgICAgICAgICAgICB8ICJxIiB8ICJyIiB8ICJzIiB8ICJ0IiB8ICJ1IiB8ICJ2IiB8ICJ3IiB8ICJ4IgorICAgICAgICAgICAgICAgICAgICB8ICJ5IiB8ICJ6IgorICAgIGhpYWxwaGEgICAgICAgPSAiQSIgfCAiQiIgfCAiQyIgfCAiRCIgfCAiRSIgfCAiRiIgfCAiRyIgfCAiSCIKKyAgICAgICAgICAgICAgICAgICAgfCAiSSIgfCAiSiIgfCAiSyIgfCAiTCIgfCAiTSIgfCAiTiIgfCAiTyIgfCAiUCIKKyAgICAgICAgICAgICAgICAgICAgfCAiUSIgfCAiUiIgfCAiUyIgfCAiVCIgfCAiVSIgfCAiViIgfCAiVyIgfCAiWCIKKyAgICAgICAgICAgICAgICAgICAgfCAiWSIgfCAiWiIKKyAgICBkaWdpdCAgICAgICAgID0gIjAiIHwgIjEiIHwgIjIiIHwgIjMiIHwgIjQiIHwgIjUiIHwgIjYiIHwgIjciCisgICAgICAgICAgICAgICAgICAgIHwgIjgiIHwgIjkiCisgICAgaGV4ICAgICAgICAgICA9IGRpZ2l0IHwgIkEiIHwgIkIiIHwgIkMiIHwgIkQiIHwgIkUiIHwgIkYiIHwgImEiCisgICAgICAgICAgICAgICAgICAgIHwgImIiIHwgImMiIHwgImQiIHwgImUiIHwgImYiCisgICAgZXNjYXBlZCAgICAgICA9ICIlIiBoZXggaGV4CisgICAgT0NURVQgICAgICAgICA9ICZsdDthbnkgOC1iaXQgc2VxdWVuY2Ugb2YgZGF0YSZndDsKKyAgICBDSEFSICAgICAgICAgID0gJmx0O2FueSBVUy1BU0NJSSBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMTI3KSZndDsKKyAgICBDVEwgICAgICAgICAgID0gJmx0O2FueSBVUy1BU0NJSSBjb250cm9sIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAob2N0ZXRzIDAgLSAzMSkgYW5kIERFTCAoMTI3KSZndDsKKyAgICBDUiAgICAgICAgICAgID0gJmx0O1VTLUFTQ0lJIENSLCBjYXJyaWFnZSByZXR1cm4gKDEzKSZndDsKKyAgICBMRiAgICAgICAgICAgID0gJmx0O1VTLUFTQ0lJIExGLCBsaW5lZmVlZCAoMTApJmd0OworICAgIFNQICAgICAgICAgICAgPSAmbHQ7VVMtQVNDSUkgU1AsIHNwYWNlICgzMikmZ3Q7CisgICAgSFQgICAgICAgICAgICA9ICZsdDtVUy1BU0NJSSBIVCwgaG9yaXpvbnRhbCB0YWIgKDkpJmd0OworICAgIE5MICAgICAgICAgICAgPSBDUiB8IExGCisgICAgTFdTUCAgICAgICAgICA9IFNQIHwgSFQgfCBOTAorICAgIHRzcGVjaWFsICAgICAgPSAiKCIgfCAiKSIgfCAiQCIgfCAiLCIgfCAiOyIgfCAiOiIgfCAiXCIgfCAmbHQ7IiZndDsKKyAgICAgICAgICAgICAgICAgICAgfCAiLyIgfCAiWyIgfCAiXSIgfCAiPyIgfCAiJmx0OyIgfCAiJmd0OyIgfCAieyIgfCAifSIKKyAgICAgICAgICAgICAgICAgICAgfCBTUCB8IEhUIHwgTkwKKyAgICB0b2tlbiAgICAgICAgID0gMSombHQ7YW55IENIQVIgZXhjZXB0IENUTHMgb3IgdHNwZWNpYWxzJmd0OworICAgIHF1b3RlZC1zdHJpbmcgPSAoICZsdDsiJmd0OyAqcWR0ZXh0ICZsdDsiJmd0OyApIHwgKCAiJmx0OyIgKnFhdGV4dCAiJmd0OyIpCisgICAgcWR0ZXh0ICAgICAgICA9ICZsdDthbnkgQ0hBUiBleGNlcHQgJmx0OyImZ3Q7IGFuZCBDVExzIGJ1dCBpbmNsdWRpbmcgTFdTUCZndDsKKyAgICBxYXRleHQgICAgICAgID0gJmx0O2FueSBDSEFSIGV4Y2VwdCAiJmx0OyIsICImZ3Q7IiBhbmQgQ1RMcyBidXQKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIExXU1AmZ3Q7CisgICAgbWFyayAgICAgICAgICA9ICItIiB8ICJfIiB8ICIuIiB8ICIhIiB8ICJ+IiB8ICIqIiB8ICInIiB8ICIoIiB8ICIpIgorICAgIHVucmVzZXJ2ZWQgICAgPSBhbHBoYW51bSB8IG1hcmsKKyAgICByZXNlcnZlZCAgICAgID0gIjsiIHwgIi8iIHwgIj8iIHwgIjoiIHwgIkAiIHwgIiZhbXA7IiB8ICI9IiB8CisgICAgICAgICAgICAgICAgICAgICIkIiB8ICIsIgorICAgIHVyaWMgICAgICAgICAgPSByZXNlcnZlZCB8IHVucmVzZXJ2ZWQgfCBlc2NhcGVkCisgIDwvUFJFPgorICA8UD4KKyAgTm90ZSB0aGF0IG5ld2xpbmUgKE5MKSBuZWVkIG5vdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIsIGJ1dCBjYW4gYmUgYQorICBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgIDwvUD4KKworICA8SDI+CisgICA8QSBOQU1FPSIzLjAiPgorICAgIDMuIFByb3RvY29sIFBhcmFtZXRlcnMKKyAgIDwvQT4KKyAgPC9IMj4KKworICA8SDM+CisgICA8QSBOQU1FPSIzLjEiPgorICAgIDMuMS4gVVJMIEVuY29kaW5nCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTb21lIHZhcmlhYmxlcyBhbmQgY29uc3RydWN0cyB1c2VkIGhlcmUgYXJlIGRlc2NyaWJlZCBhcyBiZWluZworICAnVVJMLWVuY29kZWQnLiBUaGlzIGVuY29kaW5nIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uCisgIDIgb2YgUkZDCisgIDIzOTYKKyAgWzxBIEhSRUY9IiNbNF0iPjQ8L0E+XS4KKyAgPC9QPgorICA8UD4KKyAgQW4gYWx0ZXJuYXRlICJzaG9ydGN1dCIgZW5jb2RpbmcgZm9yIHJlcHJlc2VudGluZyB0aGUgc3BhY2UKKyAgY2hhcmFjdGVyIGV4aXN0cyBhbmQgaXMgaW4gY29tbW9uIHVzZS4gIFNjcmlwdHMgTVVTVCBiZSBwcmVwYXJlZCB0bworICByZWNvZ25pc2UgYm90aCAnKycgYW5kICclMjAnIGFzIGFuIGVuY29kZWQgc3BhY2UgaW4gYQorICBVUkwtZW5jb2RlZCB2YWx1ZS4KKyAgPC9QPgorICA8UD4KKyAgTm90ZSB0aGF0IHNvbWUgdW5zYWZlIGNoYXJhY3RlcnMgbWF5IGhhdmUgZGlmZmVyZW50IHNlbWFudGljcyBpZgorICB0aGV5IGFyZSBlbmNvZGVkLiBUaGUgZGVmaW5pdGlvbiBvZiB3aGljaCBjaGFyYWN0ZXJzIGFyZSB1bnNhZmUKKyAgZGVwZW5kcyBvbiB0aGUgY29udGV4dC4KKyAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHdvIFVSTHMgZG8gbm90CisgIG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZSBzYW1lIHJlc291cmNlOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBodHRwOi8vc29tZWhvc3QuY29tL3NvbWVkaXIlMkZ2YWx1ZQorICAgIGh0dHA6Ly9zb21laG9zdC5jb20vc29tZWRpci92YWx1ZQorICA8L1BSRT4KKyAgPFA+CisgIFNlZSBzZWN0aW9uCisgIDIgb2YgUkZDCisgIDIzOTYgWzxBIEhSRUY9IiNbNF0iPjQ8L0E+XQorICBmb3IgYXV0aG9yaXRhdGl2ZSB0cmVhdG1lbnQgb2YgdGhpcyBpc3N1ZS4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjMuMiI+CisgICAgMy4yLiBUaGUgU2NyaXB0LVVSSQorICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgVGhlICdTY3JpcHQtVVJJJyBpcyBkZWZpbmVkIGFzIHRoZSBVUkkgb2YgdGhlIHJlc291cmNlIGlkZW50aWZpZWQKKyAgYnkgdGhlIG1ldGF2YXJpYWJsZXMuICAgT2Z0ZW4sCisgIHRoaXMgVVJJIHdpbGwgYmUgdGhlIHNhbWUgYXMKKyAgdGhlIFVSSSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCAodGhlICdDbGllbnQtVVJJJyk7IGhvd2V2ZXIsIGl0IG5lZWQKKyAgbm90IGJlLiBJbnN0ZWFkLCBpdCBjb3VsZCBiZSBhIFVSSSBpbnZlbnRlZCBieSB0aGUgc2VydmVyLCBhbmQgc28gaXQKKyAgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgc2VydmVyIGFuZCBpdHMgQ0dJIGludGVyZmFjZS4KKyAgPC9QPgorICA8UD4KKyAgVGhlIFNjcmlwdC1VUkkgaGFzIHRoZSBzeW50YXggb2YgZ2VuZXJpYy1STCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gMi4xCisgIG9mIFJGQyAxODA4IFs8QSBIUkVGPSIjWzddIj43PC9BPl0sIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IG9iamVjdAorICBwYXJhbWV0ZXJzIGFuZAorICBmcmFnbWVudCBpZGVudGlmaWVycyBhcmUgbm90IHBlcm1pdHRlZDoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgJmx0O3NjaGVtZSZndDs6Ly8mbHQ7aG9zdCZndDsmbHQ7cG9ydCZndDsvJmx0O3BhdGgmZ3Q7PyZsdDtxdWVyeSZndDsKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgdmFyaW91cyBjb21wb25lbnRzIG9mIHRoZQorICBTY3JpcHQtVVJJCisgIGFyZSBkZWZpbmVkIGJ5IHNvbWUgb2YgdGhlCisgIG1ldGF2YXJpYWJsZXMgKHNlZQorICA8QSBIUkVGPSIjNC4wIj5zZWN0aW9uIDQ8L0E+CisgIGJlbG93KTsKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgc2NyaXB0LXVyaSA9IHByb3RvY29sICI6Ly8iIFNFUlZFUl9OQU1FICI6IiBTRVJWRVJfUE9SVCBlbmMtc2NyaXB0CisgICAgICAgICAgICAgICAgIGVuYy1wYXRoLWluZm8gIj8iIFFVRVJZX1NUUklORworICA8L1BSRT4KKyAgPFA+CisgIHdoZXJlICdwcm90b2NvbCcgaXMgb2J0YWluZWQKKyAgZnJvbSBTRVJWRVJfUFJPVE9DT0wsICdlbmMtc2NyaXB0JyBpcyBhCisgIFVSTC1lbmNvZGVkIHZlcnNpb24gb2YgU0NSSVBUX05BTUUgYW5kICdlbmMtcGF0aC1pbmZvJyBpcyBhCisgIFVSTC1lbmNvZGVkIHZlcnNpb24gb2YgUEFUSF9JTkZPLiAgU2VlCisgIDxBIEhSRUY9IiM0LjYiPnNlY3Rpb24gNC42PC9BPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUEFUSF9JTkZPCisgIG1ldGF2YXJpYWJsZS4KKyAgPC9QPgorICA8UD4KKyAgTm90ZSB0aGF0IHRoZSBzY2hlbWUgYW5kIHRoZSBwcm90b2NvbCBhcmUgPEVNPm5vdDwvRU0+IGlkZW50aWNhbDsKKyAgZm9yIGluc3RhbmNlLCBhIHJlc291cmNlIGFjY2Vzc2VkIDxFTT52aWE8L0VNPiBhbiBTU0wgbWVjaGFuaXNtCisgIG1heSBoYXZlIGEgQ2xpZW50LVVSSSB3aXRoIGEgc2NoZW1lIG9mICI8U0FNUD5odHRwczwvU0FNUD4iCisgIHJhdGhlciB0aGFuICI8U0FNUD5odHRwPC9TQU1QPiIuICAgQ0dJLzEuMSBwcm92aWRlcyBubyBtZWFucworICBmb3IgdGhlIHNjcmlwdCB0byByZWNvbnN0cnVjdCB0aGlzLCBhbmQgdGhlcmVmb3JlCisgIHRoZSBTY3JpcHQtVVJJIGluY2x1ZGVzIHRoZSBiYXNlIHByb3RvY29sIHVzZWQuCisgIDwvUD4KKworICA8SDI+CisgICA8QSBOQU1FPSI0LjAiPgorICAgIDQuIEludm9raW5nIHRoZSBTY3JpcHQKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPFA+CisgIFRoZQorICBzY3JpcHQgaXMgaW52b2tlZCBpbiBhIHN5c3RlbSBkZWZpbmVkIG1hbm5lci4gVW5sZXNzIHNwZWNpZmllZAorICBvdGhlcndpc2UsIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCB3aWxsIGJlIGludm9rZWQgYXMgYW4KKyAgZXhlY3V0YWJsZSBwcm9ncmFtLgorICA8L1A+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iNS4wIj4KKyAgICA1LiBUaGUgQ0dJIFNjcmlwdCBDb21tYW5kIExpbmUKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPFA+CisgIFNvbWUgc3lzdGVtcyBzdXBwb3J0IGEgbWV0aG9kIGZvciBzdXBwbHlpbmcgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0bworICB0aGUgQ0dJIHNjcmlwdC4gVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4gJ2luZGV4ZWQnIHF1ZXJ5LgorICBUaGlzIGlzIGlkZW50aWZpZWQgYnkgYSAiR0VUIiBvciAiSEVBRCIgSFRUUCByZXF1ZXN0IHdpdGggYSBVUkwKKyAgcXVlcnkKKyAgc3RyaW5nIG5vdCBjb250YWluaW5nIGFueSB1bmVuY29kZWQgIj0iIGNoYXJhY3RlcnMuIEZvciBzdWNoIGEKKyAgcmVxdWVzdCwKKyAgc2VydmVycyBTSE9VTEQgcGFyc2UgdGhlIHNlYXJjaCBzdHJpbmcKKyAgaW50byB3b3JkcywgdXNpbmcgdGhlIGZvbGxvd2luZyBydWxlczoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgc2VhcmNoLXN0cmluZyA9IHNlYXJjaC13b3JkICooICIrIiBzZWFyY2gtd29yZCApCisgICAgc2VhcmNoLXdvcmQgICA9IDEqc2NoYXIKKyAgICBzY2hhciAgICAgICAgID0geHVucmVzZXJ2ZWQgfCBlc2NhcGVkIHwgeHJlc2VydmVkCisgICAgeHVucmVzZXJ2ZWQgICA9IGFscGhhIHwgZGlnaXQgfCB4c2FmZSB8IGV4dHJhCisgICAgeHNhZmUgICAgICAgICA9ICIkIiB8ICItIiB8ICJfIiB8ICIuIgorICAgIHhyZXNlcnZlZCAgICAgPSAiOyIgfCAiLyIgfCAiPyIgfCAiOiIgfCAiQCIgfCAiJiIKKyAgPC9QUkU+CisgIDxQPgorICBBZnRlciBwYXJzaW5nLCBlYWNoIHdvcmQgaXMgVVJMLWRlY29kZWQsIG9wdGlvbmFsbHkgZW5jb2RlZCBpbiBhCisgIHN5c3RlbSBkZWZpbmVkIG1hbm5lciwKKyAgYW5kIHRoZW4gdGhlIGFyZ3VtZW50IGxpc3QgaXMgc2V0IHRvIHRoZSBsaXN0CisgIG9mIHdvcmRzLgorICA8L1A+CisgIDxQPgorICBJZiB0aGUgc2VydmVyIGNhbm5vdCBjcmVhdGUgYW55IHBhcnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QsIHRoZW4gdGhlCisgIHNlcnZlciBTSE9VTEQgTk9UIGdlbmVyYXRlIGFueSBjb21tYW5kIGxpbmUgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB0aGUKKyAgbnVtYmVyIG9mIGFyZ3VtZW50cyBtYXkgYmUgZ3JlYXRlciB0aGFuIG9wZXJhdGluZyBzeXN0ZW0gb3Igc2VydmVyCisgIGxpbWl0YXRpb25zIHBlcm1pdCwgb3Igb25lIG9mIHRoZSB3b3JkcyBtYXkgbm90IGJlIHJlcHJlc2VudGFibGUgYXMgYW4KKyAgYXJndW1lbnQuCisgIDwvUD4KKyAgPFA+CisgIFNjcmlwdHMgU0hPVUxEIGNoZWNrIHRvIHNlZSBpZiB0aGUgUVVFUllfU1RSSU5HIHZhbHVlIGNvbnRhaW5zIGFuCisgIHVuZW5jb2RlZCAiPSIgY2hhcmFjdGVyLCBhbmQgU0hPVUxEIE5PVCB1c2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgaWYgaXQgZG9lcy4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjYuMCI+CisgICAgNi4gRGF0YSBJbnB1dCB0byB0aGUgQ0dJIFNjcmlwdAorICAgPC9BPgorICA8L0gyPgorICA8UD4KKyAgSW5mb3JtYXRpb24gYWJvdXQgYSByZXF1ZXN0IGNvbWVzIGZyb20gdHdvIGRpZmZlcmVudCBzb3VyY2VzOiB0aGUKKyAgcmVxdWVzdCBoZWFkZXIsIGFuZCBhbnkgYXNzb2NpYXRlZAorICBtZXNzYWdlLWJvZHkuCisgIFNlcnZlcnMgTVVTVAorICBtYWtlIHBvcnRpb25zIG9mIHRoaXMgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvCisgICBzY3JpcHRzLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iNi4xIj4KKyAgICA2LjEuIFJlcXVlc3QgTWV0YWRhdGEKKyAgICAoTWV0YXZhcmlhYmxlcykKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIEVhY2ggQ0dJIHNlcnZlcgorICBpbXBsZW1lbnRhdGlvbiBNVVNUIGRlZmluZSBhIG1lY2hhbmlzbQorICB0byBwYXNzIGRhdGEgYWJvdXQgdGhlIHJlcXVlc3QgZnJvbQorICB0aGUgc2VydmVyIHRvIHRoZSBzY3JpcHQuCisgIFRoZSBtZXRhdmFyaWFibGVzIGNvbnRhaW5pbmcgdGhlc2UKKyAgZGF0YQorICBhcmUgYWNjZXNzZWQgYnkgdGhlIHNjcmlwdCBpbiBhIHN5c3RlbQorICBkZWZpbmVkIG1hbm5lci4KKyAgVGhlCisgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQorICBtZXRhdmFyaWFibGVzIGlzCisgIHN5c3RlbSBkZWZpbmVkLgorICA8L1A+CisgIDxQPgorICBUaGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgcmVwcmVzZW50YXRpb24gb2YKKyAgbnVsbCB2YWx1ZXMgYW5kIG1pc3Npbmcgb25lcy4gIFdoZXRoZXIgbnVsbCBvciBtaXNzaW5nIHZhbHVlcworICAoc3VjaCBhcyBhIHF1ZXJ5IGNvbXBvbmVudCBvZiAiPyIgb3IgIiIsIHJlc3BlY3RpdmVseSkgYXJlIHJlcHJlc2VudGVkCisgIGJ5IHVuZGVmaW5lZCBtZXRhdmFyaWFibGVzIG9yIGJ5IG1ldGF2YXJpYWJsZXMgd2l0aCB2YWx1ZXMgb2YgIiIgaXMKKyAgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgPC9QPgorICA8UD4KKyAgQ2FzZSBpcyBub3Qgc2lnbmlmaWNhbnQgaW4gdGhlCisgIG1ldGF2YXJpYWJsZQorICBuYW1lcywgaW4gdGhhdCB0aGVyZSBjYW5ub3QgYmUgdHdvCisgIGRpZmZlcmVudCB2YXJpYWJsZXMKKyAgd2hvc2UgbmFtZXMgZGlmZmVyIGluIGNhc2Ugb25seS4gSGVyZSB0aGV5IGFyZQorICBzaG93biB1c2luZyBhIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiBjYXBpdGFscyBwbHVzIHVuZGVyc2NvcmUKKyAgKCJfIikuIFRoZSBhY3R1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hbWVzIGlzIHN5c3RlbSBkZWZpbmVkOyBmb3IKKyAgYSBwYXJ0aWN1bGFyIHN5c3RlbSB0aGUgcmVwcmVzZW50YXRpb24gTUFZIGJlIGRlZmluZWQgZGlmZmVyZW50bHkKKyAgdGhhbiB0aGlzLgorICA8L1A+CisgIDxQPgorICBNZXRhdmFyaWFibGUKKyAgdmFsdWVzIE1VU1QgYmUKKyAgY29uc2lkZXJlZCBjYXNlLXNlbnNpdGl2ZSBleGNlcHQgYXMgbm90ZWQKKyAgb3RoZXJ3aXNlLgorICA8L1A+CisgIDxQPgorICBUaGUgY2Fub25pY2FsCisgIG1ldGF2YXJpYWJsZXMKKyAgZGVmaW5lZCBieSB0aGlzIHNwZWNpZmljYXRpb24gYXJlOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBBVVRIX1RZUEUKKyAgICBDT05URU5UX0xFTkdUSAorICAgIENPTlRFTlRfVFlQRQorICAgIEdBVEVXQVlfSU5URVJGQUNFCisgICAgUEFUSF9JTkZPCisgICAgUEFUSF9UUkFOU0xBVEVECisgICAgUVVFUllfU1RSSU5HCisgICAgUkVNT1RFX0FERFIKKyAgICBSRU1PVEVfSE9TVAorICAgIFJFTU9URV9JREVOVAorICAgIFJFTU9URV9VU0VSCisgICAgUkVRVUVTVF9NRVRIT0QKKyAgICBTQ1JJUFRfTkFNRQorICAgIFNFUlZFUl9OQU1FCisgICAgU0VSVkVSX1BPUlQKKyAgICBTRVJWRVJfUFJPVE9DT0wKKyAgICBTRVJWRVJfU09GVFdBUkUKKyAgPC9QUkU+CisgIDxQPgorICBNZXRhdmFyaWFibGVzIHdpdGggbmFtZXMgYmVnaW5uaW5nIHdpdGggdGhlIHByb3RvY29sIG5hbWUgKDxFTT5lLmcuPC9FTT4sCisgICJIVFRQX0FDQ0VQVCIpIGFyZSBhbHNvIGNhbm9uaWNhbCBpbiB0aGVpciBkZXNjcmlwdGlvbiBvZiByZXF1ZXN0IGhlYWRlcgorICBmaWVsZHMuICBUaGUgbnVtYmVyIGFuZCBtZWFuaW5nIG9mIHRoZXNlIGZpZWxkcyBtYXkgY2hhbmdlIGluZGVwZW5kZW50bHkKKyAgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiAgKFNlZSBhbHNvIDxBIEhSRUY9IiM2LjEuNSI+c2VjdGlvbiA2LjEuNTwvQT4uKQorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjEiPgorICAgIDYuMS4xLiBBVVRIX1RZUEUKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoaXMgdmFyaWFibGUgaXMgc3BlY2lmaWMgdG8gcmVxdWVzdHMgbWFkZQorICA8RU0+dmlhPC9FTT4gdGhlCisgICI8Q09ERT5odHRwPC9DT0RFPiIKKyAgc2NoZW1lLgorICA8L1A+CisgIDxQPgorICBJZiB0aGUgU2NyaXB0LVVSSQorICByZXF1aXJlZCBhY2Nlc3MgYXV0aGVudGljYXRpb24gZm9yIGV4dGVybmFsCisgIGFjY2VzcywgdGhlbiB0aGUgc2VydmVyCisgIE1VU1Qgc2V0CisgIHRoZSB2YWx1ZSBvZgorICB0aGlzIHZhcmlhYmxlCisgIGZyb20gdGhlICc8U0FNUD5hdXRoLXNjaGVtZTwvU0FNUD4nIHRva2VuIGluCisgIHRoZSByZXF1ZXN0J3MgIjxTQU1QPkF1dGhvcml6YXRpb248L1NBTVA+IiBoZWFkZXIKKyAgZmllbGQuCisgIE90aGVyd2lzZQorICBpdCBpcworICBzZXQgdG8gTlVMTC4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgQVVUSF9UWVBFICAgPSAiIiB8IGF1dGgtc2NoZW1lCisgICAgYXV0aC1zY2hlbWUgPSAiQmFzaWMiIHwgIkRpZ2VzdCIgfCB0b2tlbgorICA8L1BSRT4KKyAgPFA+CisgIEhUVFAgYWNjZXNzIGF1dGhlbnRpY2F0aW9uIHNjaGVtZXMgYXJlIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDExIG9mIHRoZQorICBIVFRQLzEuMSBzcGVjaWZpY2F0aW9uIFs8QSBIUkVGPSIjWzhdIj44PC9BPl0uIFRoZSBhdXRoLXNjaGVtZSBpcworICBub3QgY2FzZS1zZW5zaXRpdmUuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMKKyAgTVVTVAorICBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMgaWYgdGhlIHJlcXVlc3QKKyAgaGVhZGVyIGluY2x1ZGVkIGFuICI8U0FNUD5BdXRob3JpemF0aW9uPC9TQU1QPiIgZmllbGQKKyAgdGhhdCB3YXMgYXV0aGVudGljYXRlZC4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4yIj4KKyAgICA2LjEuMi4gQ09OVEVOVF9MRU5HVEgKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoaXMKKyAgbWV0YXZhcmlhYmxlCisgIGlzIHNldCB0byB0aGUKKyAgc2l6ZSBvZiB0aGUgbWVzc2FnZS1ib2R5CisgIGVudGl0eSBhdHRhY2hlZCB0byB0aGUgcmVxdWVzdCwgaWYgYW55LCBpbiBkZWNpbWFsCisgIG51bWJlciBvZiBvY3RldHMuIElmIG5vIGRhdGEgYXJlIGF0dGFjaGVkLCB0aGVuIHRoaXMKKyAgbWV0YXZhcmlhYmxlCisgIGlzIGVpdGhlciBOVUxMIG9yIG5vdAorICBkZWZpbmVkLiBUaGUgc3ludGF4IGlzCisgIHRoZSBzYW1lIGFzIGZvcgorICB0aGUgSFRUUCAiPFNBTVA+Q29udGVudC1MZW5ndGg8L1NBTVA+IiBoZWFkZXIgZmllbGQgKHNlY3Rpb24gMTQuMTQsIEhUVFAvMS4xCisgIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbOF0iPjg8L0E+XSkuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIENPTlRFTlRfTEVOR1RIID0gIiIgfCAxKmRpZ2l0CisgIDwvUFJFPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cyBpZiB0aGUgcmVxdWVzdAorICB3YXMgYWNjb21wYW5pZWQgYnkgYQorICBtZXNzYWdlLWJvZHkgZW50aXR5LgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjMiPgorICAgIDYuMS4zLiBDT05URU5UX1RZUEUKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIElmIHRoZSByZXF1ZXN0IGluY2x1ZGVzIGEKKyAgbWVzc2FnZS1ib2R5LAorICBDT05URU5UX1RZUEUgaXMgc2V0CisgIHRvCisgIHRoZSBJbnRlcm5ldCBNZWRpYSBUeXBlCisgIFs8QSBIUkVGPSIjWzldIj45PC9BPl0gb2YgdGhlIGF0dGFjaGVkCisgIGVudGl0eSBpZiB0aGUgdHlwZSB3YXMgcHJvdmlkZWQgPEVNPnZpYTwvRU0+CisgIGEgIjxTQU1QPkNvbnRlbnQtdHlwZTwvU0FNUD4iIGZpZWxkIGluIHRoZQorICByZXF1ZXN0IGhlYWRlciwgb3IgaWYgdGhlIHNlcnZlciBjYW4gZGV0ZXJtaW5lIGl0IGluIHRoZSBhYnNlbmNlCisgIG9mIGEgc3VwcGxpZWQgIjxTQU1QPkNvbnRlbnQtdHlwZTwvU0FNUD4iIGZpZWxkLiBUaGUgc3ludGF4IGlzIHRoZQorICBzYW1lIGFzIGZvciB0aGUgSFRUUAorICAiPFNBTVA+Q29udGVudC1UeXBlPC9TQU1QPiIgaGVhZGVyIGZpZWxkLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBDT05URU5UX1RZUEUgPSAiIiB8IG1lZGlhLXR5cGUKKyAgICBtZWRpYS10eXBlICAgPSB0eXBlICIvIiBzdWJ0eXBlICooICI7IiBwYXJhbWV0ZXIpCisgICAgdHlwZSAgICAgICAgID0gdG9rZW4KKyAgICBzdWJ0eXBlICAgICAgPSB0b2tlbgorICAgIHBhcmFtZXRlciAgICA9IGF0dHJpYnV0ZSAiPSIgdmFsdWUKKyAgICBhdHRyaWJ1dGUgICAgPSB0b2tlbgorICAgIHZhbHVlICAgICAgICA9IHRva2VuIHwgcXVvdGVkLXN0cmluZworICA8L1BSRT4KKyAgPFA+CisgIFRoZSB0eXBlLCBzdWJ0eXBlLAorICBhbmQgcGFyYW1ldGVyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbm90CisgIGNhc2Utc2Vuc2l0aXZlLiBQYXJhbWV0ZXIgdmFsdWVzIE1BWSBiZSBjYXNlIHNlbnNpdGl2ZS4KKyAgTWVkaWEgdHlwZXMgYW5kIHRoZWlyIHVzZSBpbiBIVFRQIGFyZSBkZXNjcmliZWQKKyAgaW4gc2VjdGlvbiAzLjcgb2YgdGhlCisgIEhUVFAvMS4xIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbOF0iPjg8L0E+XS4KKyAgPC9QPgorICA8UD4KKyAgRXhhbXBsZToKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkCisgIDwvUFJFPgorICA8UD4KKyAgVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyB2YXJpYWJsZS4gSWYgYW5kIG9ubHkgaWYgaXQgaXMKKyAgdW5zZXQsIHRoZW4gdGhlIHNjcmlwdCBNQVkgYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIG1lZGlhIHR5cGUgZnJvbQorICB0aGUgZGF0YSByZWNlaXZlZC4gSWYgdGhlIHR5cGUgcmVtYWlucyB1bmtub3duLCB0aGVuCisgIHRoZSBzY3JpcHQgTUFZIGNob29zZSB0byBlaXRoZXIgYXNzdW1lIGEKKyAgY29udGVudC10eXBlIG9mCisgIDxTQU1QPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvU0FNUD4KKyAgb3IgcmVqZWN0IHRoZSByZXF1ZXN0IHdpdGggIGEgNDE1ICgiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIpCisgIGVycm9yLiAgU2VlIDxBIEhSRUY9IiM3LjIuMS4zIj5zZWN0aW9uIDcuMi4xLjM8L0E+CisgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHJldHVybmluZyBlcnJvciBzdGF0dXMgdmFsdWVzLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzIGlmCisgIGEgIjxTQU1QPkNvbnRlbnQtVHlwZTwvU0FNUD4iIGZpZWxkIHdhcyBwcmVzZW50CisgIGluIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGhlYWRlci4gIElmIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSByZXF1ZXN0CisgIHdpdGggYW4gYXR0YWNoZWQgZW50aXR5IGJ1dCBubyAiPFNBTVA+Q29udGVudC1UeXBlPC9TQU1QPiIKKyAgaGVhZGVyIGZpZWxkLCBpdCBNQVkgYXR0ZW1wdCB0bworICBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZGF0YXR5cGUsIG9yIGl0IE1BWSBvbWl0IHRoaXMKKyAgbWV0YXZhcmlhYmxlIHdoZW4KKyAgY29tbXVuaWNhdGluZyB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byB0aGUgc2NyaXB0LgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjQiPgorICAgIDYuMS40LiBHQVRFV0FZX0lOVEVSRkFDRQorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhpcworICBtZXRhdmFyaWFibGUKKyAgaXMgc2V0IHRvCisgIHRoZSBkaWFsZWN0IG9mIENHSSBiZWluZyB1c2VkCisgIGJ5IHRoZSBzZXJ2ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2NyaXB0LgorICBTeW50YXg6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIEdBVEVXQVlfSU5URVJGQUNFID0gIkNHSSIgIi8iIG1ham9yICIuIiBtaW5vcgorICAgIG1ham9yICAgICAgICAgICAgID0gMSpkaWdpdAorICAgIG1pbm9yICAgICAgICAgICAgID0gMSpkaWdpdAorICA8L1BSRT4KKyAgPFA+CisgIE5vdGUgdGhhdCB0aGUgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgYXJlIHRyZWF0ZWQgYXMgc2VwYXJhdGUKKyAgaW50ZWdlcnMgYW5kIGhlbmNlIGVhY2ggbWF5IGJlCisgIG1vcmUgdGhhbiBhIHNpbmdsZQorICBkaWdpdC4gVGh1cyBDR0kvMi40IGlzIGEgbG93ZXIgdmVyc2lvbiB0aGFuIENHSS8yLjEzIHdoaWNoIGluIHR1cm4KKyAgaXMgbG93ZXIgdGhhbiBDR0kvMTIuMy4gTGVhZGluZyB6ZXJvcyBpbiBlaXRoZXIKKyAgdGhlIG1ham9yIG9yIHRoZSBtaW5vciBudW1iZXIgTVVTVCBiZSBpZ25vcmVkIGJ5IHNjcmlwdHMgYW5kCisgIFNIT1VMRCBOT1QgYmUgZ2VuZXJhdGVkIGJ5IHNlcnZlcnMuCisgIDwvUD4KKyAgPFA+CisgIFRoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgMS4xIHZlcnNpb24gb2YgdGhlIENHSSBpbnRlcmZhY2UKKyAgKCJDR0kvMS4xIikuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuNSI+CisgICAgNi4xLjUuIFByb3RvY29sLVNwZWNpZmljIE1ldGF2YXJpYWJsZXMKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZXNlIG1ldGF2YXJpYWJsZXMgYXJlIHNwZWNpZmljIHRvCisgIHRoZSBwcm90b2NvbAorICA8RU0+dmlhPC9FTT4gd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZS4KKyAgSW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgdmFyaWFibGVzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisgIHRoZQorICBTRVJWRVJfUFJPVE9DT0wKKyAgbWV0YXZhcmlhYmxlCisgIChzZWUKKyAgPEEgSFJFRj0iIzYuMS4xNyI+c2VjdGlvbiA2LjEuMTc8L0E+KS4KKyAgPC9QPgorICA8UD4KKyAgTWV0YXZhcmlhYmxlcworICB3aXRoIG5hbWVzIGJlZ2lubmluZyB3aXRoICJIVFRQXyIgY29udGFpbgorICB2YWx1ZXMgZnJvbSB0aGUgcmVxdWVzdCBoZWFkZXIsIGlmIHRoZQorICBzY2hlbWUgdXNlZCB3YXMgSFRUUC4KKyAgRWFjaAorICBIVFRQIGhlYWRlciBmaWVsZCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlLCBoYXMgYWxsIG9jY3VycmVuY2VzIG9mCisgICItIiByZXBsYWNlZCB3aXRoICJfIiwKKyAgYW5kIGhhcyAiSFRUUF8iIHByZXBlbmRlZCB0byAgZm9ybQorICB0aGUgbWV0YXZhcmlhYmxlIG5hbWUuCisgIFNpbWlsYXIgdHJhbnNmb3JtYXRpb25zIGFyZSBhcHBsaWVkIGZvciBvdGhlcgorICBwcm90b2NvbHMuCisgIFRoZSBoZWFkZXIgZGF0YSBNQVkgYmUgcHJlc2VudGVkIGFzIHNlbnQKKyAgYnkgdGhlIGNsaWVudCwgb3IgTUFZIGJlIHJld3JpdHRlbiBpbiB3YXlzIHdoaWNoIGRvIG5vdCBjaGFuZ2UgaXRzCisgIHNlbWFudGljcy4gSWYgbXVsdGlwbGUgaGVhZGVyIGZpZWxkcyB3aXRoIHRoZSBzYW1lIGZpZWxkLW5hbWUgYXJlIHJlY2VpdmVkCisgIHRoZW4gIHRoZSBzZXJ2ZXIKKyAgTVVTVCAgcmV3cml0ZSB0aGVtIGFzIHRob3VnaCB0aGV5CisgIGhhZCBiZWVuIHJlY2VpdmVkIGFzIGEgc2luZ2xlIGhlYWRlciBmaWVsZCBoYXZpbmcgdGhlIHNhbWUKKyAgc2VtYW50aWNzIGJlZm9yZSBiZWluZyByZXByZXNlbnRlZCBpbiBhCisgIG1ldGF2YXJpYWJsZS4KKyAgU2ltaWxhcmx5LCBhIGhlYWRlciBmaWVsZCB0aGF0IGlzIHJlY2VpdmVkIG9uIG1vcmUgdGhhbiBvbmUgbGluZQorICBNVVNUIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGxpbmUuIFRoZSBzZXJ2ZXIgTVVTVCwgaWYgbmVjZXNzYXJ5LAorICBjaGFuZ2UgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIChmb3IgZXhhbXBsZSwgdGhlIGNoYXJhY3RlcgorICBzZXQpIHRvIGJlIGFwcHJvcHJpYXRlIGZvciBhIENHSQorICBtZXRhdmFyaWFibGUuCisgIDwhLS0gIyMjTk9URTogU2VlIGlmIDIwNjggZGVzY3JpYmVzIHRoaXMgdGhvcm91Z2hseSwgYW5kCisgIHBvaW50IHRoZXJlIGlmIHNvLiAtLT4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBhcmUKKyAgbm90IHJlcXVpcmVkIHRvIGNyZWF0ZQorICBtZXRhdmFyaWFibGVzIGZvciBhbGwKKyAgdGhlIHJlcXVlc3QKKyAgaGVhZGVyIGZpZWxkcyB0aGF0IHRoZXkKKyAgcmVjZWl2ZS4gSW4gcGFydGljdWxhciwKKyAgdGhleSBNQVkKKyAgZGVjbGluZSB0byBtYWtlIGF2YWlsYWJsZSBhbnkKKyAgaGVhZGVyIGZpZWxkcyBjYXJyeWluZyBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiwgc3VjaCBhcworICAiPFNBTVA+QXV0aG9yaXphdGlvbjwvU0FNUD4iLCBvcgorICB3aGljaCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHQKKyAgPEVNPnZpYTwvRU0+IG90aGVyIG1ldGF2YXJpYWJsZXMsCisgIHN1Y2ggYXMgIjxTQU1QPkNvbnRlbnQtTGVuZ3RoPC9TQU1QPiIgYW5kICI8U0FNUD5Db250ZW50LVR5cGU8L1NBTVA+Ii4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS42Ij4KKyAgICA2LjEuNi4gUEFUSF9JTkZPCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgUEFUSF9JTkZPCisgIG1ldGF2YXJpYWJsZQorICBzcGVjaWZpZXMKKyAgYSBwYXRoIHRvIGJlIGludGVycHJldGVkIGJ5IHRoZSBDR0kgc2NyaXB0LiBJdCBpZGVudGlmaWVzIHRoZQorICByZXNvdXJjZSBvciBzdWItcmVzb3VyY2UgdG8gYmUgcmV0dXJuZWQKKyAgYnkgdGhlIENHSQorICBzY3JpcHQsIGFuZCBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIHBvcnRpb24KKyAgb2YgdGhlIFVSSSBwYXRoIGZvbGxvd2luZyB0aGUgc2NyaXB0IG5hbWUgYnV0IHByZWNlZGluZworICBhbnkgcXVlcnkgZGF0YS4KKyAgVGhlIHN5bnRheAorICBhbmQgc2VtYW50aWNzIGFyZSBzaW1pbGFyIHRvIGEgZGVjb2RlZCBIVFRQIFVSTAorICAncGF0aCcgdG9rZW4KKyAgKGRlZmluZWQgaW4KKyAgUkZDIDIzOTYKKyAgWzxBIEhSRUY9IiNbNF0iPjQ8L0E+XSksIHdpdGggdGhlIGV4Y2VwdGlvbgorICB0aGF0IGEgUEFUSF9JTkZPIG9mICIvIgorICByZXByZXNlbnRzIGEgc2luZ2xlIHZvaWQgcGF0aCBzZWdtZW50LgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBQQVRIX0lORk8gPSAiIiB8ICggIi8iIHBhdGggKQorICAgIHBhdGggICAgICA9IHNlZ21lbnQgKiggIi8iIHNlZ21lbnQgKQorICAgIHNlZ21lbnQgICA9ICpwY2hhcgorICAgIHBjaGFyICAgICA9ICZsdDthbnkgQ0hBUiBleGNlcHQgIi8iJmd0OworICA8L1BSRT4KKyAgPFA+CisgIFRoZSBQQVRIX0lORk8gc3RyaW5nIGlzIHRoZSB0cmFpbGluZyBwYXJ0IG9mIHRoZSAmbHQ7cGF0aCZndDsgY29tcG9uZW50IG9mCisgIHRoZSBTY3JpcHQtVVJJCisgIChzZWUgPEEgSFJFRj0iIzMuMiI+c2VjdGlvbiAzLjI8L0E+KQorICB0aGF0IGZvbGxvd3MgdGhlIFNDUklQVF9OQU1FCisgIHBvcnRpb24gb2YgdGhlIHBhdGguCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTUFZIGltcG9zZSB0aGVpciBvd24gcmVzdHJpY3Rpb25zIGFuZAorICBsaW1pdGF0aW9ucyBvbiB3aGF0IHZhbHVlcyB0aGV5IHdpbGwgYWNjZXB0IGZvciBQQVRIX0lORk8sIGFuZCBNQVkKKyAgcmVqZWN0IG9yIGVkaXQgYW55IHZhbHVlcyB0aGV5CisgIGNvbnNpZGVyIG9iamVjdGlvbmFibGUgYmVmb3JlIHBhc3NpbmcKKyAgdGhlbSB0byB0aGUgc2NyaXB0LgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgbWFrZSB0aGlzIFVSSSBjb21wb25lbnQgYXZhaWxhYmxlCisgIHRvIENHSSBzY3JpcHRzLiAgVGhlIFBBVEhfSU5GTworICB2YWx1ZSBpcyBjYXNlLXNlbnNpdGl2ZSwgYW5kIHRoZQorICBzZXJ2ZXIgTVVTVCBwcmVzZXJ2ZSB0aGUgY2FzZSBvZiB0aGUgUEFUSF9JTkZPIGVsZW1lbnQgb2YgdGhlIFVSSQorICB3aGVuIG1ha2luZyBpdCBhdmFpbGFibGUgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS43Ij4KKyAgICA2LjEuNy4gUEFUSF9UUkFOU0xBVEVECisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBQQVRIX1RSQU5TTEFURUQgaXMgZGVyaXZlZCBieSB0YWtpbmcgYW55IHBhdGgtaW5mbyBjb21wb25lbnQgb2YgdGhlCisgIHJlcXVlc3QgVVJJIChzZWUKKyAgPEEgSFJFRj0iIzYuMS42Ij5zZWN0aW9uIDYuMS42PC9BPiksIGRlY29kaW5nIGl0CisgIChzZWUgPEEgSFJFRj0iIzMuMSI+c2VjdGlvbiAzLjE8L0E+KSwgcGFyc2luZyBpdCBhcyBhIFVSSSBpbiBpdHMgb3duCisgIHJpZ2h0LCBhbmQgcGVyZm9ybWluZyBhbnkgdmlydHVhbC10by1waHlzaWNhbAorICB0cmFuc2xhdGlvbiBhcHByb3ByaWF0ZSB0byBtYXAgaXQgb250byB0aGUKKyAgc2VydmVyJ3MgZG9jdW1lbnQgcmVwb3NpdG9yeSBzdHJ1Y3R1cmUuCisgIElmIHRoZSByZXF1ZXN0IFVSSSBpbmNsdWRlcyBubyBwYXRoLWluZm8KKyAgY29tcG9uZW50LCB0aGUgUEFUSF9UUkFOU0xBVEVEIG1ldGF2YXJpYWJsZSBTSE9VTEQgTk9UIGJlIGRlZmluZWQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFBBVEhfVFJBTlNMQVRFRCA9ICpDSEFSCisgIDwvUFJFPgorICA8UD4KKyAgRm9yIGEgcmVxdWVzdCBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIGh0dHA6Ly9zb21laG9zdC5jb20vY2dpLWJpbi9zb21lc2NyaXB0L3RoaXMlMmVpcyUyZXBhdGglMmVpbmZvCisgIDwvUFJFPgorICA8UD4KKyAgdGhlIFBBVEhfSU5GTyBjb21wb25lbnQgd291bGQgYmUgZGVjb2RlZCwgYW5kIHRoZSByZXN1bHQKKyAgcGFyc2VkIGFzIHRob3VnaCBpdCB3ZXJlIGEgcmVxdWVzdCBmb3IgdGhlIGZvbGxvd2luZzoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgaHR0cDovL3NvbWVob3N0LmNvbS90aGlzLmlzLnRoZS5wYXRoLmluZm8KKyAgPC9QUkU+CisgIDxQPgorICBUaGlzIHdvdWxkIHRoZW4gYmUgdHJhbnNsYXRlZCB0byBhCisgIGxvY2F0aW9uIGluIHRoZSBzZXJ2ZXIncyBkb2N1bWVudCByZXBvc2l0b3J5LAorICBwZXJoYXBzIGEgZmlsZXN5c3RlbSBwYXRoIHNvbWV0aGluZworICBsaWtlIHRoaXM6CisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIC91c3IvbG9jYWwvd3d3L2h0ZG9jcy90aGlzLmlzLnRoZS5wYXRoLmluZm8KKyAgPC9QUkU+CisgIDxQPgorICBUaGUgcmVzdWx0IG9mIHRoZSB0cmFuc2xhdGlvbiBpcyB0aGUgdmFsdWUgb2YgUEFUSF9UUkFOU0xBVEVELgorICA8L1A+CisgIDxQPgorICBUaGUgdmFsdWUgb2YgUEFUSF9UUkFOU0xBVEVEIG1heSBvciBtYXkgbm90IG1hcCB0byBhIHZhbGlkCisgIHJlcG9zaXRvcnkKKyAgbG9jYXRpb24uCisgIFNlcnZlcnMgTVVTVCBwcmVzZXJ2ZSB0aGUgY2FzZSBvZiB0aGUgcGF0aC1pbmZvCisgIHNlZ21lbnQgaWYgYW5kIG9ubHkgaWYgdGhlIHVuZGVybHlpbmcKKyAgcmVwb3NpdG9yeQorICBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZQorICBuYW1lcy4gIElmIHRoZQorICByZXBvc2l0b3J5CisgIGlzIG9ubHkgY2FzZS1hd2FyZSwgY2FzZS1wcmVzZXJ2aW5nLCBvciBjYXNlLWJsaW5kCisgIHdpdGggcmVnYXJkIHRvCisgIGRvY3VtZW50IG5hbWVzLAorICBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gcHJlc2VydmUgdGhlCisgIGNhc2Ugb2YgdGhlIG9yaWdpbmFsIHNlZ21lbnQgdGhyb3VnaCB0aGUgdHJhbnNsYXRpb24uCisgIDwvUD4KKyAgPFA+CisgIFRoZQorICB0cmFuc2xhdGlvbgorICBhbGdvcml0aG0gdGhlIHNlcnZlciB1c2VzIHRvIGRlcml2ZSBQQVRIX1RSQU5TTEFURUQgaXMKKyAgaW1wbGVtZW50YXRpb24gZGVmaW5lZDsgQ0dJIHNjcmlwdHMgd2hpY2ggdXNlIHRoaXMgdmFyaWFibGUgbWF5CisgIHN1ZmZlciBsaW1pdGVkIHBvcnRhYmlsaXR5LgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIFNIT1VMRCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMgaWYgYW5kIG9ubHkgaWYgdGhlIHJlcXVlc3QgVVJJIGluY2x1ZGVzIGEKKyAgcGF0aC1pbmZvIGNvbXBvbmVudC4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS44Ij4KKyAgICA2LjEuOC4gUVVFUllfU1RSSU5HCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBBIFVSTC1lbmNvZGVkCisgIHN0cmluZzsgdGhlICZsdDtxdWVyeSZndDsgcGFydCBvZiB0aGUKKyAgU2NyaXB0LVVSSS4KKyAgKFNlZQorICA8QSBIUkVGPSIjMy4yIj5zZWN0aW9uIDMuMjwvQT4uKQorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBRVUVSWV9TVFJJTkcgPSBxdWVyeS1zdHJpbmcKKyAgICBxdWVyeS1zdHJpbmcgPSAqdXJpYworICA8L1BSRT4KKyAgPFA+CisgIFRoZSBVUkwgc3ludGF4IGZvciBhICBxdWVyeQorICBzdHJpbmcgaXMgZGVzY3JpYmVkIGluCisgIHNlY3Rpb24gMyBvZgorICBSRkMgMjM5NgorICBbPEEgSFJFRj0iI1s0XSI+NDwvQT5dLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1Qgc3VwcGx5IHRoaXMgdmFsdWUgdG8gc2NyaXB0cy4KKyAgVGhlIFFVRVJZX1NUUklORyB2YWx1ZSBpcyBjYXNlLXNlbnNpdGl2ZS4KKyAgSWYgdGhlIFNjcmlwdC1VUkkgZG9lcyBub3QgaW5jbHVkZSBhIHF1ZXJ5IGNvbXBvbmVudCwKKyAgdGhlIFFVRVJZX1NUUklORyBtZXRhdmFyaWFibGUgTVVTVCBiZSBkZWZpbmVkIGFzIGFuIGVtcHR5IHN0cmluZyAoIiIpLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjkiPgorICAgIDYuMS45LiBSRU1PVEVfQUREUgorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudAorICBzZW5kaW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuIFRoaXMKKyAgaXMgbm90IG5lY2Vzc2FyaWx5IHRoYXQgb2YgdGhlIHVzZXIKKyAgYWdlbnQKKyAgKHN1Y2ggYXMgaWYgdGhlIHJlcXVlc3QgY2FtZSB0aHJvdWdoIGEgcHJveHkpLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBSRU1PVEVfQUREUiAgPSBob3N0bnVtYmVyCisgICAgaG9zdG51bWJlciAgID0gaXB2NC1hZGRyZXNzIHwgaXB2Ni1hZGRyZXNzCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIGRlZmluaXRpb25zIG9mIDxTQU1QPmlwdjQtYWRkcmVzczwvU0FNUD4gYW5kIDxTQU1QPmlwdjYtYWRkcmVzczwvU0FNUD4KKyAgYXJlIHByb3ZpZGVkIGluIEFwcGVuZGl4IEIgb2YgUkZDIDIzNzMgWzxBIEhSRUY9IiNbMTNdIj4xMzwvQT5dLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1Qgc3VwcGx5IHRoaXMgdmFsdWUgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xMCI+CisgICAgNi4xLjEwLiBSRU1PVEVfSE9TVAorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBvZiB0aGUKKyAgY2xpZW50IHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8KKyAgdGhlIHNlcnZlciwgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgTlVMTC4KKyAgKFNlZSA8QSBIUkVGPSIjNi4xLjkiPnNlY3Rpb24gNi4xLjk8L0E+LikKKyAgRnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lcyB0YWtlIHRoZSBmb3JtIGFzIGRlc2NyaWJlZCBpbgorICBzZWN0aW9uIDMuNSBvZiBSRkMgMTAzNCBbPEEgSFJFRj0iI1sxMF0iPjEwPC9BPl0gYW5kIHNlY3Rpb24gMi4xIG9mCisgIFJGQyAxMTIzIFs8QSBIUkVGPSIjWzVdIj41PC9BPl0uICBEb21haW4gbmFtZXMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBTSE9VTEQgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uIHRvCisgIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMTEiPgorICAgIDYuMS4xMS4gUkVNT1RFX0lERU5UCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gcmVwb3J0ZWQgYWJvdXQgdGhlIGNvbm5lY3Rpb24gYnkgYQorICBSRkMgMTQxMyBbPEEgSFJFRj0iI1sxMV0iPjExPC9BPl0gcmVxdWVzdCB0byB0aGUgcmVtb3RlIGFnZW50LCBpZgorICBhdmFpbGFibGUuIFNlcnZlcnMKKyAgTUFZIGNob29zZSBub3QKKyAgdG8gc3VwcG9ydCB0aGlzIGZlYXR1cmUsIG9yIG5vdCB0byByZXF1ZXN0IHRoZSBkYXRhCisgIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFJFTU9URV9JREVOVCA9ICpDSEFSCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIGRhdGEgcmV0dXJuZWQKKyAgbWF5IGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzLCBidXQgdGhlIGxldmVsCisgIG9mIHRydXN0IHJlcG9zZWQgaW4gdGhlbSBzaG91bGQgYmUgbWluaW1hbC4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNQVkgc3VwcGx5IHRoaXMgaW5mb3JtYXRpb24gdG8gc2NyaXB0cyBpZiB0aGUKKyAgUkZDMTQxMyBbPEEgSFJFRj0iI1sxMV0iPjExPC9BPl0gbG9va3VwIGlzIHBlcmZvcm1lZC4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xMiI+CisgICAgNi4xLjEyLiBSRU1PVEVfVVNFUgorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgSWYgdGhlIHJlcXVlc3QgcmVxdWlyZWQgYXV0aGVudGljYXRpb24gdXNpbmcgdGhlICJCYXNpYyIKKyAgbWVjaGFuaXNtICg8RU0+aS5lLjwvRU0+LCB0aGUgQVVUSF9UWVBFCisgIG1ldGF2YXJpYWJsZSBpcyBzZXQKKyAgdG8gIkJhc2ljIiksIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSBSRU1PVEVfVVNFUgorICBtZXRhdmFyaWFibGUgaXMgc2V0IHRvIHRoZQorICB1c2VyLUlEIHN1cHBsaWVkLiAgSW4gYWxsIG90aGVyIGNhc2VzCisgIHRoZSB2YWx1ZSBvZiB0aGlzIG1ldGF2YXJpYWJsZQorICBpcyB1bmRlZmluZWQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFJFTU9URV9VU0VSID0gKk9DVEVUCisgIDwvUFJFPgorICA8UD4KKyAgVGhpcyB2YXJpYWJsZSBpcyBzcGVjaWZpYyB0byByZXF1ZXN0cyBtYWRlIDxFTT52aWE8L0VNPiB0aGUKKyAgSFRUUCBwcm90b2NvbC4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBTSE9VTEQgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjEzIj4KKyAgICA2LjEuMTMuIFJFUVVFU1RfTUVUSE9ECisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgUkVRVUVTVF9NRVRIT0QKKyAgbWV0YXZhcmlhYmxlCisgIGlzIHNldCB0byB0aGUKKyAgbWV0aG9kIHdpdGggd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIG1hZGUsIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uCisgIDUuMS4xIG9mIHRoZSBIVFRQLzEuMCBzcGVjaWZpY2F0aW9uIFs8QSBIUkVGPSIjWzNdIj4zPC9BPl0gYW5kCisgIHNlY3Rpb24gNS4xLjEgb2YgdGhlCisgIEhUVFAvMS4xIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbOF0iPjg8L0E+XS4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgUkVRVUVTVF9NRVRIT0QgICA9IGh0dHAtbWV0aG9kCisgICAgaHR0cC1tZXRob2QgICAgICA9ICJHRVQiIHwgIkhFQUQiIHwgIlBPU1QiIHwgIlBVVCIgfCAiREVMRVRFIgorICAgICAgICAgICAgICAgICAgICAgICB8ICJPUFRJT05TIiB8ICJUUkFDRSIgfCBleHRlbnNpb24tbWV0aG9kCisgICAgZXh0ZW5zaW9uLW1ldGhvZCA9IHRva2VuCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIG1ldGhvZCBpcyBjYXNlIHNlbnNpdGl2ZS4KKyAgQ0dJLzEuMSBzZXJ2ZXJzIE1BWSBjaG9vc2UgdG8gcHJvY2VzcyBzb21lIG1ldGhvZHMKKyAgZGlyZWN0bHkgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGVtIHRvIHNjcmlwdHMuCisgIDwvUD4KKyAgPFA+CisgIFRoaXMgdmFyaWFibGUgaXMgc3BlY2lmaWMgdG8gcmVxdWVzdHMgbWFkZSB3aXRoIEhUVFAuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMTQiPgorICAgIDYuMS4xNC4gU0NSSVBUX05BTUUKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBTQ1JJUFRfTkFNRQorICBtZXRhdmFyaWFibGUKKyAgaXMKKyAgc2V0IHRvIGEgVVJMIHBhdGggdGhhdCBjb3VsZCBpZGVudGlmeSB0aGUgQ0dJIHNjcmlwdCAocmF0aGVyIHRoYW4gdGhlCisgIHNjcmlwdCdzCisgIG91dHB1dCkuIFRoZSBzeW50YXggYW5kIHNlbWFudGljcyBhcmUgaWRlbnRpY2FsIHRvIGEKKyAgZGVjb2RlZCBIVFRQIFVSTCAncGF0aCcgdG9rZW4KKyAgKHNlZSBSRkMgMjM5NgorICBbPEEgSFJFRj0iI1s0XSI+NDwvQT5dKS4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgU0NSSVBUX05BTUUgPSAiIiB8ICggIi8iIFsgcGF0aCBdICkKKyAgPC9QUkU+CisgIDxQPgorICBUaGUgU0NSSVBUX05BTUUgc3RyaW5nIGlzIHNvbWUgbGVhZGluZyBwYXJ0IG9mIHRoZSAmbHQ7cGF0aCZndDsgY29tcG9uZW50CisgIG9mIHRoZSBTY3JpcHQtVVJJIGRlcml2ZWQgaW4gc29tZQorICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1hbm5lci4KKyAgTm8gUEFUSF9JTkZPIG9yIFFVRVJZX1NUUklORyBzZWdtZW50cworICAoc2VlIHNlY3Rpb25zIDxBIEhSRUY9IiM2LjEuNiI+Ni4xLjY8L0E+IGFuZAorICA8QSBIUkVGPSIjNi4xLjgiPjYuMS44PC9BPikgYXJlIGluY2x1ZGVkCisgIGluIHRoZSBTQ1JJUFRfTkFNRSB2YWx1ZS4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xNSI+CisgICAgNi4xLjE1LiBTRVJWRVJfTkFNRQorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIFNFUlZFUl9OQU1FCisgIG1ldGF2YXJpYWJsZQorICBpcyBzZXQgdG8gdGhlCisgIG5hbWUgIG9mIHRoZQorICBzZXJ2ZXIsIGFzCisgIGRlcml2ZWQgZnJvbSB0aGUgJmx0O2hvc3QmZ3Q7IHBhcnQgb2YgdGhlCisgIFNjcmlwdC1VUkkKKyAgKHNlZSA8QSBIUkVGPSIjMy4yIj5zZWN0aW9uIDMuMjwvQT4pLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBTRVJWRVJfTkFNRSA9IGhvc3RuYW1lIHwgaG9zdG51bWJlcgorICA8L1BSRT4KKyAgPFA+CisgIFNlcnZlcnMgTVVTVCBwcm92aWRlIHRoaXMgbWV0YXZhcmlhYmxlCisgIHRvIHNjcmlwdHMuCisgIDwvUD4KKworICA8SDQ+CisgICA8QSBOQU1FPSI2LjEuMTYiPgorICAgIDYuMS4xNi4gU0VSVkVSX1BPUlQKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBTRVJWRVJfUE9SVAorICBtZXRhdmFyaWFibGUKKyAgaXMgc2V0IHRvIHRoZQorICBwb3J0IG9uIHdoaWNoIHRoZQorICByZXF1ZXN0IHdhcyByZWNlaXZlZCwgYXMgdXNlZCBpbiB0aGUgJmx0O3BvcnQmZ3Q7CisgIHBhcnQgb2YgdGhlIFNjcmlwdC1VUkkuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIFNFUlZFUl9QT1JUID0gMSpkaWdpdAorICA8L1BSRT4KKyAgPFA+CisgIElmIHRoZSAmbHQ7cG9ydCZndDsgcG9ydGlvbiBvZiB0aGUgc2NyaXB0LVVSSSBpcyBibGFuaywgdGhlIGFjdHVhbAorICBwb3J0IG51bWJlciB1cG9uIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyByZWNlaXZlZCBNVVNUIGJlIHN1cHBsaWVkLgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1QgcHJvdmlkZSB0aGlzIG1ldGF2YXJpYWJsZQorICB0byBzY3JpcHRzLgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNi4xLjE3Ij4KKyAgICA2LjEuMTcuIFNFUlZFUl9QUk9UT0NPTAorICAgPC9BPgorICA8L0g0PgorICA8UD4KKyAgVGhlIFNFUlZFUl9QUk9UT0NPTAorICBtZXRhdmFyaWFibGUKKyAgaXMgc2V0IHRvCisgIHRoZQorICBuYW1lIGFuZCByZXZpc2lvbiBvZiB0aGUgaW5mb3JtYXRpb24gcHJvdG9jb2wgd2l0aCB3aGljaAorICB0aGUKKyAgcmVxdWVzdAorICBhcnJpdmVkLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIHByb3RvY29sIHZlcnNpb24gdXNlZCBieQorICB0aGUgc2VydmVyIGluIGl0cyByZXNwb25zZSB0byB0aGUgY2xpZW50LgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBTRVJWRVJfUFJPVE9DT0wgICA9IEhUVFAtVmVyc2lvbiB8IGV4dGVuc2lvbi12ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVuc2lvbi10b2tlbgorICAgIEhUVFAtVmVyc2lvbiAgICAgID0gIkhUVFAiICIvIiAxKmRpZ2l0ICIuIiAxKmRpZ2l0CisgICAgZXh0ZW5zaW9uLXZlcnNpb24gPSBwcm90b2NvbCAiLyIgMSpkaWdpdCAiLiIgMSpkaWdpdAorICAgIHByb3RvY29sICAgICAgICAgID0gMSooIGFscGhhIHwgZGlnaXQgfCAiKyIgfCAiLSIgfCAiLiIgKQorICAgIGV4dGVuc2lvbi10b2tlbiAgID0gdG9rZW4KKyAgPC9QUkU+CisgIDxQPgorICAncHJvdG9jb2wnIGlzIGEgdmVyc2lvbiBvZiB0aGUgJmx0O3NjaGVtZSZndDsgcGFydCBvZiB0aGUKKyAgU2NyaXB0LVVSSSwgYnV0IGlzCisgIG5vdCBpZGVudGljYWwgdG8gaXQuICBGb3IgZXhhbXBsZSwgdGhlIHNjaGVtZSBvZiBhIHJlcXVlc3QgbWF5IGJlCisgICI8U0FNUD5odHRwczwvU0FNUD4iIHdoaWxlIHRoZSBwcm90b2NvbCByZW1haW5zICI8U0FNUD5odHRwPC9TQU1QPiIuCisgIFRoZSBwcm90b2NvbCBpcyBub3QgY2FzZSBzZW5zaXRpdmUsIGJ1dAorICBieSBjb252ZW50aW9uLCAncHJvdG9jb2wnIGlzIGluCisgIHVwcGVyIGNhc2UuCisgIDwvUD4KKyAgPFA+CisgIEEgd2VsbC1rbm93biBleHRlbnNpb24gdG9rZW4gdmFsdWUgaXMgIklOQ0xVREVEIiwKKyAgd2hpY2ggc2lnbmFscyB0aGF0IHRoZSBjdXJyZW50IGRvY3VtZW50IGlzIGJlaW5nIGluY2x1ZGVkIGFzIHBhcnQgb2YKKyAgYSBjb21wb3NpdGUgZG9jdW1lbnQsIHJhdGhlciB0aGFuIGJlaW5nIHRoZSBkaXJlY3QgdGFyZ2V0IG9mIHRoZQorICBjbGllbnQgcmVxdWVzdC4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjYuMS4xOCI+CisgICAgNi4xLjE4LiBTRVJWRVJfU09GVFdBUkUKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBTRVJWRVJfU09GVFdBUkUKKyAgbWV0YXZhcmlhYmxlCisgIGlzIHNldCB0byB0aGUKKyAgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGUgaW5mb3JtYXRpb24gc2VydmVyIHNvZnR3YXJlIGFuc3dlcmluZyB0aGUKKyAgcmVxdWVzdCAoYW5kIHJ1bm5pbmcgdGhlIGdhdGV3YXkpLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBTRVJWRVJfU09GVFdBUkUgPSAxKnByb2R1Y3QKKyAgICBwcm9kdWN0ICAgICAgICAgPSB0b2tlbiBbICIvIiBwcm9kdWN0LXZlcnNpb24gXQorICAgIHByb2R1Y3QtdmVyc2lvbiA9IHRva2VuCisgIDwvUFJFPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhpcyBtZXRhdmFyaWFibGUKKyAgdG8gc2NyaXB0cy4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjYuMiI+CisgICAgNi4yLiBSZXF1ZXN0IE1lc3NhZ2UtQm9kaWVzCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBBcyB0aGVyZSBtYXkgYmUgYSBkYXRhIGVudGl0eSBhdHRhY2hlZCB0byB0aGUgcmVxdWVzdCwgdGhlcmUgTVVTVCBiZQorICBhIHN5c3RlbSBkZWZpbmVkIG1ldGhvZCBmb3IgdGhlIHNjcmlwdCB0byByZWFkCisgIHRoZXNlIGRhdGEuIFVubGVzcworICBkZWZpbmVkIG90aGVyd2lzZSwgdGhpcyB3aWxsIGJlIDxFTT52aWE8L0VNPiB0aGUgJ3N0YW5kYXJkIGlucHV0JyBmaWxlCisgIGRlc2NyaXB0b3IuCisgIDwvUD4KKyAgPFA+CisgIElmIHRoZSBDT05URU5UX0xFTkdUSCB2YWx1ZSAoc2VlIDxBIEhSRUY9IiM2LjEuMiI+c2VjdGlvbiA2LjEuMjwvQT4pCisgIGlzIG5vbi1OVUxMLCB0aGUgc2VydmVyIE1VU1Qgc3VwcGx5IGF0IGxlYXN0IHRoYXQgbWFueSBieXRlcyB0bworICBzY3JpcHRzIG9uIHRoZSBzdGFuZGFyZCBpbnB1dCBzdHJlYW0uCisgIFNjcmlwdHMgYXJlCisgIG5vdCBvYmxpZ2VkIHRvIHJlYWQgdGhlIGRhdGEuCisgIFNlcnZlcnMgTUFZIHNpZ25hbCBhbiBFT0YgY29uZGl0aW9uIGFmdGVyIENPTlRFTlRfTEVOR1RIIGJ5dGVzIGhhdmUgYmVlbgorICByZWFkLCBidXQgYXJlCisgIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBUaGVyZWZvcmUsIHNjcmlwdHMKKyAgTVVTVCBOT1QKKyAgYXR0ZW1wdCB0byByZWFkIG1vcmUgdGhhbiBDT05URU5UX0xFTkdUSCBieXRlcywgZXZlbiBpZiBtb3JlIGRhdGEKKyAgYXJlIGF2YWlsYWJsZS4KKyAgPC9QPgorICA8UD4KKyAgRm9yIG5vbi1wYXJzZWQgaGVhZGVyIChOUEgpIHNjcmlwdHMgKHNlZQorICA8QSBIUkVGPSIjNy4xIj5zZWN0aW9uIDcuMTwvQT4KKyAgYmVsb3cpLAorICBzZXJ2ZXJzIFNIT1VMRAorICBhdHRlbXB0IHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhCisgIHN1cHBsaWVkIHRvIHRoZSBzY3JpcHQgYXJlIHByZWNpc2VseQorICBhcyBzdXBwbGllZCBieSB0aGUgY2xpZW50IGFuZCB1bmFsdGVyZWQgYnkKKyAgdGhlIHNlcnZlci4KKyAgPC9QPgorICA8UD4KKyAgPEEgSFJFRj0iIzguMS4yIj5TZWN0aW9uIDguMS4yPC9BPiBkZXNjcmliZXMgdGhlIHJlcXVpcmVtZW50cyBvZgorICBzZXJ2ZXJzIHdpdGggcmVnYXJkIHRvIHJlcXVlc3RzIHRoYXQgaW5jbHVkZQorICBtZXNzYWdlLWJvZGllcy4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjcuMCI+CisgICAgNy4gRGF0YSBPdXRwdXQgZnJvbSB0aGUgQ0dJIFNjcmlwdAorICAgPC9BPgorICA8L0gyPgorICA8UD4KKyAgVGhlcmUgTVVTVCBiZSBhIHN5c3RlbSBkZWZpbmVkIG1ldGhvZCBmb3IgdGhlIHNjcmlwdCB0byBzZW5kIGRhdGEKKyAgYmFjayB0byB0aGUgc2VydmVyIG9yIGNsaWVudDsgYSBzY3JpcHQgTVVTVCBhbHdheXMgcmV0dXJuIHNvbWUgZGF0YS4KKyAgVW5sZXNzIGRlZmluZWQgb3RoZXJ3aXNlLCB0aGlzIHdpbGwgYmUgPEVNPnZpYTwvRU0+IHRoZSAnc3RhbmRhcmQKKyAgb3V0cHV0JyBmaWxlIGRlc2NyaXB0b3IuCisgIDwvUD4KKyAgPFA+CisgIFRoZXJlIGFyZSB0d28gZm9ybXMgb2Ygb3V0cHV0IHRoYXQgIHNjcmlwdHMgY2FuIHN1cHBseSB0byBzZXJ2ZXJzOiBub24tcGFyc2VkCisgIGhlYWRlciAoTlBIKSBvdXRwdXQsIGFuZCBwYXJzZWQgaGVhZGVyIG91dHB1dC4KKyAgU2VydmVycyBNVVNUIHN1cHBvcnQgcGFyc2VkIGhlYWRlcgorICBvdXRwdXQgYW5kIE1BWSBzdXBwb3J0IE5QSCBvdXRwdXQuICBUaGUgbWV0aG9kIG9mCisgIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gdGhlIHR3bworICB0eXBlcyBvZiBvdXRwdXQgKG9yIHNjcmlwdHMpIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQuCisgIDwvUD4KKyAgPFA+CisgIFNlcnZlcnMgTUFZIGltcGxlbWVudCBhIHRpbWVvdXQgcGVyaW9kIHdpdGhpbiB3aGljaCBkYXRhIG11c3QgYmUKKyAgcmVjZWl2ZWQgZnJvbSBzY3JpcHRzLiAgSWYgYSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5lcyBzdWNoCisgIGEgdGltZW91dCBhbmQgcmVjZWl2ZXMgbm8gZGF0YSBmcm9tIGEgc2NyaXB0IHdpdGhpbiB0aGUgdGltZW91dAorICBwZXJpb2QsIHRoZSBzZXJ2ZXIgTUFZIHRlcm1pbmF0ZSB0aGUgc2NyaXB0IHByb2Nlc3MgYW5kIFNIT1VMRAorICBhYm9ydCB0aGUgY2xpZW50IHJlcXVlc3Qgd2l0aAorICBlaXRoZXIgYQorICAnNTA0IEdhdGV3YXkgVGltZWQgT3V0JyBvciBhCisgICc1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyByZXNwb25zZS4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjcuMSI+CisgICAgNy4xLiBOb24tUGFyc2VkIEhlYWRlciBPdXRwdXQKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNjcmlwdHMgdXNpbmcgdGhlIE5QSCBvdXRwdXQgZm9ybQorICBNVVNUIHJldHVybiBhIGNvbXBsZXRlIEhUVFAgcmVzcG9uc2UgbWVzc2FnZSwgYXMgZGVzY3JpYmVkCisgIGluIFNlY3Rpb24gNiBvZiB0aGUgSFRUUCBzcGVjaWZpY2F0aW9ucworICBbPEEgSFJFRj0iI1szXSI+MzwvQT4sPEEgSFJFRj0iI1s4XSI+ODwvQT5dLgorICAgTlBIIHNjcmlwdHMKKyAgTVVTVCB1c2UgdGhlIFNFUlZFUl9QUk9UT0NPTCB2YXJpYWJsZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdAorICBmb3IgYSByZXNwb25zZS4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycworICBTSE9VTEQgYXR0ZW1wdCB0byBlbnN1cmUgdGhhdCB0aGUgc2NyaXB0IG91dHB1dCBpcyBzZW50CisgIGRpcmVjdGx5IHRvIHRoZSBjbGllbnQsIHdpdGggbWluaW1hbAorICBpbnRlcm5hbCBhbmQgbm8gdHJhbnNwb3J0LXZpc2libGUKKyAgYnVmZmVyaW5nLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iNy4yIj4KKyAgICA3LjIuIFBhcnNlZCBIZWFkZXIgT3V0cHV0CisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTY3JpcHRzIHVzaW5nIHRoZSBwYXJzZWQgaGVhZGVyIG91dHB1dCBmb3JtIE1VU1Qgc3VwcGx5CisgIGEgQ0dJIHJlc3BvbnNlIG1lc3NhZ2UgdG8gdGhlIHNlcnZlcgorICBhcyBmb2xsb3dzOgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBDR0ktUmVzcG9uc2UgICA9ICpvcHRpb25hbC1maWVsZCBDR0ktRmllbGQgKm9wdGlvbmFsLWZpZWxkIE5MIFsgTWVzc2FnZS1Cb2R5IF0KKyAgICBvcHRpb25hbC1maWVsZCA9ICggQ0dJLUZpZWxkIHwgSFRUUC1GaWVsZCApCisgICAgQ0dJLUZpZWxkICAgICAgPSBDb250ZW50LXR5cGUKKyAgICAgICAgICAgICAgICAgICB8IExvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMKKyAgICAgICAgICAgICAgICAgICB8IGV4dGVuc2lvbi1oZWFkZXIKKyAgPC9QUkU+CisgIDxQPjwhLS0gIyMjIyMgSWYgSFRUUCBkZWZpbmVzIHgtaGVhZGVycywgcmVtb3ZlIG91cnMgZXhjZXB0IHgtY2dpLSAtLT4KKyAgVGhlIHJlc3BvbnNlIGNvbXByaXNlcyBhIGhlYWRlciBhbmQgYSBib2R5LCBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLgorICBUaGUgYm9keSBtYXkgYmUgTlVMTC4KKyAgVGhlIGhlYWRlciBmaWVsZHMgYXJlIGVpdGhlciBDR0kgaGVhZGVyIGZpZWxkcyB0byBiZSBpbnRlcnByZXRlZCBieQorICB0aGUgc2VydmVyLCBvciBIVFRQIGhlYWRlciBmaWVsZHMKKyAgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIHJldHVybmVkCisgIHRvIHRoZSBjbGllbnQKKyAgaWYgdGhlIHJlcXVlc3QgbWV0aG9kIGlzIEhUVFAuIEF0IGxlYXN0IG9uZQorICBDR0ktRmllbGQgTVVTVCBiZQorICBzdXBwbGllZCwgYnV0IG5vIENHSSAgZmllbGQgbmFtZSBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZQorICBpbiBhIHJlc3BvbnNlLgorICBJZiBhIGJvZHkgaXMgc3VwcGxpZWQsIHRoZW4gYSAiPFNBTVA+Q29udGVudC10eXBlPC9TQU1QPiIKKyAgaGVhZGVyIGZpZWxkIE1VU1QgYmUKKyAgc3VwcGxpZWQgYnkgdGhlIHNjcmlwdCwKKyAgb3RoZXJ3aXNlIHRoZSBzY3JpcHQgTVVTVCBzZW5kIGEgIjxTQU1QPkxvY2F0aW9uPC9TQU1QPiIKKyAgb3IgIjxTQU1QPlN0YXR1czwvU0FNUD4iIGhlYWRlciBmaWVsZC4gSWYgYQorICA8U0FNUD5Mb2NhdGlvbjwvU0FNUD4gQ0dJLUZpZWxkCisgIGlzIHJldHVybmVkLCB0aGVuIHRoZSBzY3JpcHQgTVVTVCBOT1Qgc3VwcGx5CisgIGFueSBIVFRQLUZpZWxkcy4KKyAgPC9QPgorICA8UD4KKyAgRWFjaCBoZWFkZXIgZmllbGQgaW4gYSBDR0ktUmVzcG9uc2UgTVVTVCBiZSBzcGVjaWZpZWQgb24gYSBzaW5nbGUgbGluZTsKKyAgQ0dJLzEuMSBkb2VzIG5vdCBzdXBwb3J0IGNvbnRpbnVhdGlvbiBsaW5lcy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjcuMi4xIj4KKyAgICA3LjIuMS4gQ0dJIGhlYWRlciBmaWVsZHMKKyAgIDwvQT4KKyAgPC9IND4KKyAgPFA+CisgIFRoZSBDR0kgaGVhZGVyIGZpZWxkcyBoYXZlIHRoZSBnZW5lcmljIHN5bnRheDoKKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgZ2VuZXJpYy1maWVsZCAgPSBmaWVsZC1uYW1lICI6IiBbIGZpZWxkLXZhbHVlIF0gTkwKKyAgICBmaWVsZC1uYW1lICAgICA9IHRva2VuCisgICAgZmllbGQtdmFsdWUgICAgPSAqKCBmaWVsZC1jb250ZW50IHwgTFdTUCApCisgICAgZmllbGQtY29udGVudCAgPSAqKCB0b2tlbiB8IHRzcGVjaWFsIHwgcXVvdGVkLXN0cmluZyApCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIGZpZWxkLW5hbWUgaXMgbm90IGNhc2Ugc2Vuc2l0aXZlOyBhIE5VTEwgZmllbGQgdmFsdWUgaXMKKyAgZXF1aXZhbGVudCB0byB0aGUgaGVhZGVyIGZpZWxkIG5vdCBiZWluZyBzZW50LgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNy4yLjEuMSI+CisgICAgNy4yLjEuMS4gQ29udGVudC1UeXBlCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgSW50ZXJuZXQgTWVkaWEgVHlwZSBbPEEgSFJFRj0iI1s5XSI+OTwvQT5dIG9mIHRoZSBlbnRpdHkKKyAgYm9keSwgd2hpY2ggaXMgdG8gYmUgc2VudCB1bm1vZGlmaWVkIHRvIHRoZSBjbGllbnQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIENvbnRlbnQtVHlwZSA9ICJDb250ZW50LVR5cGUiICI6IiBtZWRpYS10eXBlIE5MCisgIDwvUFJFPgorICA8UD4KKyAgVGhpcyBpcyBhY3R1YWxseSBhbiBIVFRQLUZpZWxkCisgIHJhdGhlciB0aGFuIGEgQ0dJLUZpZWxkLCBidXQKKyAgaXQgaXMgbGlzdGVkIGhlcmUgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW5jZSBpbiB0aGUgQ0dJIGRpYWxvZ3VlIGFzCisgIGEgbWVtYmVyIG9mIHRoZSAib25lIG9mIHRoZXNlIGlzIHJlcXVpcmVkIiBzZXQgb2YgaGVhZGVyCisgIGZpZWxkcy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjcuMi4xLjIiPgorICAgIDcuMi4xLjIuIExvY2F0aW9uCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSB0byB0aGUgc2VydmVyIHRoYXQgdGhlIHNjcmlwdCBpcyByZXR1cm5pbmcgYQorICByZWZlcmVuY2UgdG8gYSBkb2N1bWVudCByYXRoZXIgdGhhbiBhbiBhY3R1YWwgZG9jdW1lbnQuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIExvY2F0aW9uICAgICAgICAgPSAiTG9jYXRpb24iICI6IgorICAgICAgICAgICAgICAgICAgICAgICAoIGZyYWdtZW50LVVSSSB8IHJlbC1VUkwtYWJzLXBhdGggKSBOTAorICAgIGZyYWdtZW50LVVSSSAgICAgPSBVUkkgWyAjIGZyYWdtZW50aWQgXQorICAgIFVSSSAgICAgICAgICAgICAgPSBzY2hlbWUgIjoiICpxY2hhcgorICAgIGZyYWdtZW50aWQgICAgICAgPSAqcWNoYXIKKyAgICByZWwtVVJMLWFicy1wYXRoID0gIi8iIFsgaHBhdGggXSBbICI/IiBxdWVyeS1zdHJpbmcgXQorICAgIGhwYXRoICAgICAgICAgICAgPSBmcHNlZ21lbnQgKiggIi8iIHBzZWdtZW50ICkKKyAgICBmcHNlZ21lbnQgICAgICAgID0gMSpoY2hhcgorICAgIHBzZWdtZW50ICAgICAgICAgPSAqaGNoYXIKKyAgICBoY2hhciAgICAgICAgICAgID0gYWxwaGEgfCBkaWdpdCB8IHNhZmUgfCBleHRyYQorICAgICAgICAgICAgICAgICAgICAgICB8ICI6IiB8ICJAIiB8ICImIHwgIj0iCisgIDwvUFJFPgorICA8UD4KKyAgVGhlIExvY2F0aW9uCisgIHZhbHVlIGlzIGVpdGhlciBhbiBhYnNvbHV0ZSBVUkkgd2l0aCBvcHRpb25hbCBmcmFnbWVudCwKKyAgYXMgZGVmaW5lZCBpbiBSRkMgMTYzMCBbPEEgSFJFRj0iI1sxXSI+MTwvQT5dLCBvciBhbiBhYnNvbHV0ZSBwYXRoCisgIHdpdGhpbiB0aGUgc2VydmVyJ3MgVVJJIHNwYWNlICg8RU0+aS5lLjwvRU0+LAorICBvbWl0dGluZyB0aGUgc2NoZW1lIGFuZCBuZXR3b3JrLXJlbGF0ZWQgZmllbGRzKSBhbmQgb3B0aW9uYWwKKyAgcXVlcnktc3RyaW5nLiBJZiBhbiBhYnNvbHV0ZSBVUkkgaXMgcmV0dXJuZWQgYnkgdGhlIHNjcmlwdCwKKyAgdGhlbiB0aGUKKyAgc2VydmVyIE1VU1QgZ2VuZXJhdGUgYQorICAnMzAyIHJlZGlyZWN0JyBIVFRQIHJlc3BvbnNlCisgIG1lc3NhZ2UgdW5sZXNzIHRoZSBzY3JpcHQgaGFzIHN1cHBsaWVkIGFuCisgIGV4cGxpY2l0IFN0YXR1cyByZXNwb25zZSBoZWFkZXIgZmllbGQuCisgIFNjcmlwdHMgcmV0dXJuaW5nIGFuIGFic29sdXRlIFVSSSBNQVkgY2hvb3NlIHRvCisgIHByb3ZpZGUgYSBtZXNzYWdlLWJvZHkuICBTZXJ2ZXJzIE1VU1QgbWFrZSBhbnkgYXBwcm9wcmlhdGUgbW9kaWZpY2F0aW9ucworICB0byB0aGUgc2NyaXB0J3Mgb3V0cHV0IHRvIGVuc3VyZSB0aGUgcmVzcG9uc2UgdG8gdGhlIHVzZXItYWdlbnQgY29tcGxpZXMKKyAgd2l0aCB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgdmVyc2lvbi4KKyAgSWYgdGhlIExvY2F0aW9uIHZhbHVlIGlzIGEgcGF0aCwgdGhlbiB0aGUgc2VydmVyCisgIE1VU1QgZ2VuZXJhdGUKKyAgdGhlIHJlc3BvbnNlIHRoYXQgaXQgd291bGQgaGF2ZSBwcm9kdWNlZCBpbiByZXNwb25zZSB0byBhIHJlcXVlc3QKKyAgY29udGFpbmluZyB0aGUgVVJMCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIHNjaGVtZSAiOi8vIiBTRVJWRVJfTkFNRSAiOiIgU0VSVkVSX1BPUlQgcmVsLVVSTC1hYnMtcGF0aAorICA8L1BSRT4KKyAgPFA+CisgIE5vdGU6IElmIHRoZSByZXF1ZXN0IHdhcyBhY2NvbXBhbmllZCBieSBhCisgIG1lc3NhZ2UtYm9keQorICAoc3VjaCBhcyBmb3IgYSBQT1NUIHJlcXVlc3QpLCBhbmQgdGhlIHNjcmlwdAorICByZWRpcmVjdHMgdGhlIHJlcXVlc3Qgd2l0aCBhIExvY2F0aW9uIGZpZWxkLCB0aGUKKyAgbWVzc2FnZS1ib2R5CisgIG1heSBub3QgYmUKKyAgYXZhaWxhYmxlIHRvIHRoZSByZXNvdXJjZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIHJlZGlyZWN0LgorICA8L1A+CisKKyAgPEg0PgorICAgPEEgTkFNRT0iNy4yLjEuMyI+CisgICAgNy4yLjEuMy4gU3RhdHVzCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgIjxTQU1QPlN0YXR1czwvU0FNUD4iIGhlYWRlciBmaWVsZCBpcyB1c2VkIHRvIGluZGljYXRlIHRvIHRoZSBzZXJ2ZXIgd2hhdAorICBzdGF0dXMgY29kZSB0aGUgc2VydmVyIE1VU1QgdXNlIGluIHRoZSByZXNwb25zZSBtZXNzYWdlLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBTdGF0dXMgICAgICAgID0gIlN0YXR1cyIgIjoiIGRpZ2l0IGRpZ2l0IGRpZ2l0IFNQIHJlYXNvbi1waHJhc2UgTkwKKyAgICByZWFzb24tcGhyYXNlID0gKiZsdDtDSEFSLCBleGNsdWRpbmcgQ1RMcywgTkwmZ3Q7CisgIDwvUFJFPgorICA8UD4KKyAgVGhlIHZhbGlkIHN0YXR1cyBjb2RlcyBhcmUgbGlzdGVkIGluIHNlY3Rpb24gNi4xLjEgb2YgdGhlIEhUVFAvMS4wCisgIHNwZWNpZmljYXRpb25zIFs8QSBIUkVGPSIjWzNdIj4zPC9BPl0uIElmIHRoZSBTRVJWRVJfUFJPVE9DT0wgaXMKKyAgIkhUVFAvMS4xIiwgdGhlbiB0aGUgc3RhdHVzIGNvZGVzIGRlZmluZWQgaW4gdGhlIEhUVFAvMS4xCisgIHNwZWNpZmljYXRpb24gWzxBIEhSRUY9IiNbOF0iPjg8L0E+XSBtYXkKKyAgYmUgdXNlZC4gSWYgdGhlIHNjcmlwdCBkb2VzIG5vdCByZXR1cm4gYSAiPFNBTVA+U3RhdHVzPC9TQU1QPiIgaGVhZGVyCisgIGZpZWxkLCB0aGVuICIyMDAgT0siIFNIT1VMRCBiZSBhc3N1bWVkIGJ5IHRoZSBzZXJ2ZXIuCisgIDwvUD4KKyAgPFA+CisgIElmIGEgc2NyaXB0IGlzIGJlaW5nIHVzZWQgdG8gaGFuZGxlIGEgcGFydGljdWxhciBlcnJvciBvciBjb25kaXRpb24KKyAgZW5jb3VudGVyZWQgYnkgdGhlIHNlcnZlciwgc3VjaCBhcyBhICc0MDQgTm90IEZvdW5kJyBlcnJvciwgdGhlIHNjcmlwdAorICBTSE9VTEQgdXNlIHRoZSAiPFNBTVA+U3RhdHVzPC9TQU1QPiIgQ0dJIGhlYWRlciBmaWVsZCB0byBwcm9wYWdhdGUgdGhlIGVycm9yCisgIGNvbmRpdGlvbiBiYWNrIHRvIHRoZSBjbGllbnQuICA8RU0+RS5nLjwvRU0+LCBpbiB0aGUgZXhhbXBsZSBtZW50aW9uZWQgaXQKKyAgU0hPVUxEIGluY2x1ZGUgYSAiU3RhdHVzOiZuYnNwOzQwNCZuYnNwO05vdCZuYnNwO0ZvdW5kIiBpbiB0aGUKKyAgaGVhZGVyIGRhdGEgcmV0dXJuZWQgdG8gdGhlIHNlcnZlci4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjcuMi4xLjQiPgorICAgIDcuMi4xLjQuIEV4dGVuc2lvbiBoZWFkZXIgZmllbGRzCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBTY3JpcHRzIE1BWSBpbmNsdWRlIGluIHRoZWlyIENHSSByZXNwb25zZSBoZWFkZXIgYWRkaXRpb25hbCBmaWVsZHMKKyAgbm90IGRlZmluZWQgaW4gdGhpcyBvciB0aGUgSFRUUCBzcGVjaWZpY2F0aW9uLgorICBUaGVzZSBhcmUgY2FsbGVkICJleHRlbnNpb24iIGZpZWxkcywKKyAgYW5kIGhhdmUgdGhlIHN5bnRheCBvZiBhIDxTQU1QPmdlbmVyaWMtZmllbGQ8L1NBTVA+IGFzIGRlZmluZWQgaW4KKyAgPEEgSFJFRj0iIzcuMi4xIj5zZWN0aW9uIDcuMi4xPC9BPi4gIFRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvbiBmaWVsZAorICBNVVNUIE5PVCBjb25mbGljdCB3aXRoIGEgZmllbGQgbmFtZSBkZWZpbmVkIGluIHRoaXMgb3IgYW55IG90aGVyCisgIHNwZWNpZmljYXRpb247IGV4dGVuc2lvbiBmaWVsZCBuYW1lcyBTSE9VTEQgYmVnaW4gd2l0aCAiWC1DR0ktIgorICB0byBlbnN1cmUgdW5pcXVlbmVzcy4KKyAgPC9QPgorCisgIDxIND4KKyAgIDxBIE5BTUU9IjcuMi4yIj4KKyAgICA3LjIuMi4gSFRUUCBoZWFkZXIgZmllbGRzCisgICA8L0E+CisgIDwvSDQ+CisgIDxQPgorICBUaGUgc2NyaXB0IE1BWSByZXR1cm4gYW55IG90aGVyIGhlYWRlciBmaWVsZHMgZGVmaW5lZCBieSB0aGUKKyAgc3BlY2lmaWNhdGlvbgorICBmb3IgdGhlIFNFUlZFUl9QUk9UT0NPTCAoSFRUUC8xLjAgWzxBIEhSRUY9IiNbM10iPjM8L0E+XSBvciBIVFRQLzEuMQorICBbPEEgSFJFRj0iI1s4XSI+ODwvQT5dKS4KKyAgU2VydmVycyBNVVNUIHJlc29sdmUgY29uZmxpY3RzIGJldGVlbiBDR0kgaGVhZGVyCisgIGFuZCBIVFRQIGhlYWRlciBmb3JtYXRzIG9yIG5hbWVzIChzZWUgPEEgSFJFRj0iIzguMCI+c2VjdGlvbiA4PC9BPikuCisgIDwvUD4KKworICA8SDI+CisgICA8QSBOQU1FPSI4LjAiPgorICAgIDguIFNlcnZlciBJbXBsZW1lbnRhdGlvbgorICAgPC9BPgorICA8L0gyPgorICA8UD4KKyAgVGhpcyBzZWN0aW9uIGRlZmluZXMgdGhlIHJlcXVpcmVtZW50cyB0aGF0IG11c3QgYmUgbWV0IGJ5IEhUVFAKKyAgc2VydmVycyBpbiBvcmRlciB0byBwcm92aWRlIGEgY29oZXJlbnQgYW5kIGNvcnJlY3QgQ0dJLzEuMQorICBlbnZpcm9ubWVudCBpbiB3aGljaCBzY3JpcHRzIG1heSBmdW5jdGlvbi4gIEl0IGlzIGludGVuZGVkCisgIHByaW1hcmlseSBmb3Igc2VydmVyIGltcGxlbWVudG9ycywgYnV0IGl0IGlzIHVzZWZ1bCBmb3IKKyAgc2NyaXB0IGF1dGhvcnMgdG8gYmUgZmFtaWxpYXIgd2l0aCB0aGUgaW5mb3JtYXRpb24gYXMgd2VsbC4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjguMSI+CisgICAgOC4xLiBSZXF1aXJlbWVudHMgZm9yIFNlcnZlcnMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIEluIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQgQ0dJLzEuMS1jb21wbGlhbnQsIGEgc2VydmVyIG11c3QgbWVldAorICBjZXJ0YWluIGJhc2ljIGNyaXRlcmlhIGFuZCBwcm92aWRlIGNlcnRhaW4gbWluaW1hbCBmdW5jdGlvbmFsaXR5LgorICBUaGUgZGV0YWlscyBvZiB0aGVzZSByZXF1aXJlbWVudHMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4xLjEiPgorICAgIDguMS4xLiBTY3JpcHQtVVJJCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTZXJ2ZXJzIE1VU1Qgc3VwcG9ydCB0aGUgc3RhbmRhcmQgbWVjaGFuaXNtIChkZXNjcmliZWQgYmVsb3cpIHdoaWNoCisgIGFsbG93cworICBzY3JpcHQgYXV0aG9ycyB0byBkZXRlcm1pbmUKKyAgd2hhdCBVUkwgdG8gdXNlIGluIGRvY3VtZW50cworICB3aGljaCByZWZlcmVuY2UgdGhlIHNjcmlwdDsKKyAgc3BlY2lmaWNhbGx5LCB3aGF0IFVSTCB0byB1c2UgaW4gb3JkZXIgdG8KKyAgYWNoaWV2ZSBwYXJ0aWN1bGFyIHNldHRpbmdzIG9mIHRoZQorICBtZXRhdmFyaWFibGVzLiBUaGlzCisgIG1lY2hhbmlzbSBpcyBhcyBmb2xsb3dzOgorICA8L1A+CisgIDxQPgorICBUaGUgc2VydmVyCisgIE1VU1QgdHJhbnNsYXRlIHRoZSBoZWFkZXIgZGF0YSBmcm9tIHRoZSBDR0kgaGVhZGVyIGZpZWxkIHN5bnRheCB0bworICB0aGUgSFRUUAorICBoZWFkZXIgZmllbGQgc3ludGF4IGlmIHRoZXNlIGRpZmZlci4gRm9yIGV4YW1wbGUsIHRoZSBjaGFyYWN0ZXIKKyAgc2VxdWVuY2UgZm9yCisgIG5ld2xpbmUgKHN1Y2ggYXMgVW5peCdzIEFTQ0lJIE5MKSB1c2VkIGJ5IENHSSBzY3JpcHRzIG1heSBub3QgYmUgdGhlCisgIHNhbWUgYXMgdGhhdCB1c2VkIGJ5IEhUVFAgKEFTQ0lJIENSIGZvbGxvd2VkIGJ5IExGKS4gVGhlIHNlcnZlciBNVVNUCisgIGFsc28gcmVzb2x2ZSBhbnkgY29uZmxpY3RzIGJldHdlZW4gaGVhZGVyIGZpZWxkcyByZXR1cm5lZCBieSB0aGUgc2NyaXB0CisgIGFuZCBoZWFkZXIgZmllbGRzIHRoYXQgaXQgd291bGQgb3RoZXJ3aXNlIHNlbmQgaXRzZWxmLgorICA8L1A+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iOC4xLjIiPgorICAgIDguMS4yLiBSZXF1ZXN0IE1lc3NhZ2UtYm9keSBIYW5kbGluZworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgVGhlc2UgYXJlIHRoZSByZXF1aXJlbWVudHMgZm9yIHNlcnZlciBoYW5kbGluZyBvZiBtZXNzYWdlLWJvZGllcyBkaXJlY3RlZAorICB0byBDR0kvMS4xIHJlc291cmNlczoKKyAgPC9QPgorICA8T0w+CisgICA8TEk+VGhlIG1lc3NhZ2UtYm9keSB0aGUgc2VydmVyIHByb3ZpZGVzIHRvIHRoZSBDR0kgc2NyaXB0IE1VU1QKKyAgICBoYXZlIGFueSB0cmFuc2ZlciBlbmNvZGluZ3MgcmVtb3ZlZC4KKyAgIDwvTEk+CisgICA8TEk+VGhlIHNlcnZlciBNVVNUIGRlcml2ZSBhbmQgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgQ09OVEVOVF9MRU5HVEgKKyAgICBtZXRhdmFyaWFibGUgdGhhdCByZWZsZWN0cyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLWJvZHkgYWZ0ZXIgYW55CisgICAgdHJhbnNmZXIgZGVjb2RpbmcuCisgICA8L0xJPgorICAgPExJPlRoZSBzZXJ2ZXIgTVVTVCBsZWF2ZSBpbnRhY3QgYW55IGNvbnRlbnQtZW5jb2RpbmdzIG9mIHRoZSBtZXNzYWdlLWJvZHkuCisgICA8L0xJPgorICA8L09MPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjguMS4zIj4KKyAgICA4LjEuMy4gUmVxdWlyZWQgTWV0YXZhcmlhYmxlcworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgc2NyaXB0cyB3aXRoIGNlcnRhaW4gaW5mb3JtYXRpb24gYW5kCisgIG1ldGF2YXJpYWJsZXMKKyAgYXMgZGVzY3JpYmVkIGluIDxBIEhSRUY9IiM4LjMiPnNlY3Rpb24gOC4zPC9BPi4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjguMS40Ij4KKyAgICA4LjEuNC4gUmVzcG9uc2UgQ29tcGxpYW5jZQorICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgU2VydmVycyBNVVNUIGVuc3VyZSB0aGF0IHJlc3BvbnNlcyBzZW50IHRvIHRoZSB1c2VyLWFnZW50IG1lZXQgYWxsCisgIHJlcXVpcmVtZW50cyBvZiB0aGUgcHJvdG9jb2wgbGV2ZWwgaW4gZWZmZWN0LiAgVGhpcyBtYXkgaW52b2x2ZQorICBtb2RpZnlpbmcsIGRlbGV0aW5nLCBvciBhdWdtZW50aW5nIGFueSBoZWFkZXIKKyAgZmllbGRzIGFuZC9vciBtZXNzYWdlLWJvZHkgc3VwcGxpZWQgYnkgdGhlIHNjcmlwdC4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjguMiI+CisgICAgOC4yLiBSZWNvbW1lbmRhdGlvbnMgZm9yIFNlcnZlcnMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNlcnZlcnMgU0hPVUxEIHByb3ZpZGUgdGhlICI8U0FNUD5xdWVyeTwvU0FNUD4iIGNvbXBvbmVudCBvZiB0aGUgc2NyaXB0LVVSSQorICBhcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHNjcmlwdHMgaWYgaXQgZG9lcyBub3QKKyAgY29udGFpbiBhbnkgdW5lbmNvZGVkICc9JyBjaGFyYWN0ZXJzIGFuZCB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBjYW4KKyAgYmUgZ2VuZXJhdGVkIGluIGFuIHVuYW1iaWd1b3VzIG1hbm5lci4KKyAgKFNlZSA8QSBIUkVGPSIjNS4wIj5zZWN0aW9uIDU8L0E+LikKKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBTSE9VTEQgc2V0IHRoZSBBVVRIX1RZUEUKKyAgbWV0YXZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBvZiB0aGUKKyAgJzxTQU1QPmF1dGgtc2NoZW1lPC9TQU1QPicgdG9rZW4gb2YgdGhlICI8U0FNUD5BdXRob3JpemF0aW9uPC9TQU1QPiIKKyAgZmllbGQgaWYgaXQgd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QgaGVhZGVyLgorICAoU2VlIDxBIEhSRUY9IiM2LjEuMSI+c2VjdGlvbiA2LjEuMTwvQT4uKQorICA8L1A+CisgIDxQPgorICBXaGVyZSBhcHBsaWNhYmxlLCBzZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKKyAgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgc2NyaXB0IGlzIGxvY2F0ZWQgYmVmb3JlIGludm9raW5nCisgIGl0LgorICA8L1A+CisgIDxQPgorICBTZXJ2ZXJzIE1BWSByZWplY3Qgd2l0aCBlcnJvciAnNDA0IE5vdCBGb3VuZCcKKyAgYW55IHJlcXVlc3RzIHRoYXQgd291bGQgcmVzdWx0IGluCisgIGFuIGVuY29kZWQgIi8iIGJlaW5nIGRlY29kZWQgaW50byBQQVRIX0lORk8gb3IgU0NSSVBUX05BTUUsIGFzIHRoaXMKKyAgbWlnaHQgcmVwcmVzZW50IGEgbG9zcyBvZiBpbmZvcm1hdGlvbiB0byB0aGUgc2NyaXB0LgorICA8L1A+CisgIDxQPgorICBBbHRob3VnaCB0aGUgc2VydmVyIGFuZCB0aGUgQ0dJIHNjcmlwdCBuZWVkIG5vdCBiZSBjb25zaXN0ZW50IGluCisgIHRoZWlyIGhhbmRsaW5nIG9mIFVSTCBwYXRocyAoY2xpZW50IFVSTHMgYW5kIHRoZSBQQVRIX0lORk8gZGF0YSwKKyAgcmVzcGVjdGl2ZWx5KSwgc2VydmVyIGF1dGhvcnMgbWF5IHdpc2ggdG8gaW1wb3NlIGNvbnNpc3RlbmN5LgorICBTbyB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uIFNIT1VMRCBkZWZpbmUgaXRzIGJlaGF2aW91ciBmb3IgdGhlCisgIGZvbGxvd2luZyBjYXNlczoKKyAgPC9QPgorICA8T0w+CisgICA8TEk+ZGVmaW5lIGFueSByZXN0cmljdGlvbnMgb24gYWxsb3dlZCBjaGFyYWN0ZXJzLCBpbiBwYXJ0aWN1bGFyCisgICAgd2hldGhlciBBU0NJSSBOVUwgaXMgcGVybWl0dGVkOworICAgPC9MST4KKyAgIDxMST5kZWZpbmUgYW55IHJlc3RyaWN0aW9ucyBvbiBhbGxvd2VkIHBhdGggc2VnbWVudHMsIGluIHBhcnRpY3VsYXIKKyAgICB3aGV0aGVyIG5vbi10ZXJtaW5hbCBOVUxMIHNlZ21lbnRzIGFyZSBwZXJtaXR0ZWQ7CisgICA8L0xJPgorICAgPExJPmRlZmluZSB0aGUgYmVoYXZpb3VyIGZvciA8U0FNUD4iLiI8L1NBTVA+IG9yIDxTQU1QPiIuLiI8L1NBTVA+IHBhdGgKKyAgICBzZWdtZW50czsgPEVNPmkuZS48L0VNPiwgd2hldGhlciB0aGV5IGFyZSBwcm9oaWJpdGVkLCB0cmVhdGVkIGFzCisgICAgb3JkaW5hcnkgcGF0aAorICAgIHNlZ21lbnRzIG9yIGludGVycHJldGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcmVsYXRpdmUgVVJMCisgICAgc3BlY2lmaWNhdGlvbiBbPEEgSFJFRj0iI1s3XSI+NzwvQT5dOworICAgPC9MST4KKyAgIDxMST5kZWZpbmUgYW55IGxpbWl0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24sIGluY2x1ZGluZyBsaW1pdHMgb24gcGF0aCBvcgorICAgIHNlYXJjaCBzdHJpbmcgbGVuZ3RocywgYW5kIGxpbWl0cyBvbiB0aGUgdm9sdW1lIG9mIGhlYWRlciBkYXRhIHRoZSBzZXJ2ZXIKKyAgICB3aWxsIHBhcnNlLgorICAgPC9MST48IS0tICMjIyMjIE1vdmUgdGhlIGZpZWxkIHJlc29sdXRpb24vdHJhbnNsYXRpb24gcGFyYSBiZWxvdyBoZXJlIC0tPgorICA8L09MPgorICA8UD4KKyAgU2VydmVycyBNQVkgZ2VuZXJhdGUgdGhlCisgIFNjcmlwdC1VUkkgaW4KKyAgYW55IHdheSBmcm9tIHRoZSBjbGllbnQgVVJJLAorICBvciBmcm9tIGFueSBvdGhlciBkYXRhIChidXQgdGhlIGJlaGF2aW91ciBTSE9VTEQgYmUgZG9jdW1lbnRlZCkuCisgIDwvUD4KKyAgPFA+CisgIEZvciBub24tcGFyc2VkIGhlYWRlciAoTlBIKSBzY3JpcHRzIChzZWUKKyAgPEEgSFJFRj0iIzcuMSI+c2VjdGlvbiA3LjE8L0E+KSwgc2VydmVycyBTSE9VTEQKKyAgYXR0ZW1wdCB0byBlbnN1cmUgdGhhdCB0aGUgc2NyaXB0IGlucHV0IGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlCisgIGNsaWVudCwgd2l0aCBtaW5pbWFsIGJ1ZmZlcmluZy4gRm9yIGFsbCBzY3JpcHRzIHRoZSBkYXRhIHdpbGwgYmUKKyAgYXMgc3VwcGxpZWQgYnkgdGhlIGNsaWVudC4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjguMyI+CisgICAgOC4zLiBTdW1tYXJ5IG9mCisgICAgTWV0YVZhcmlhYmxlcworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgU2VydmVycyBNVVNUIHByb3ZpZGUgdGhlIGZvbGxvd2luZworICBtZXRhdmFyaWFibGVzIHRvCisgIHNjcmlwdHMuICBTZWUgdGhlIGluZGl2aWR1YWwgZGVzY3JpcHRpb25zIGZvciBleGNlcHRpb25zIGFuZCBzZW1hbnRpY3MuCisgIDwvUD48IS0tI2lmIGV4cHI9IiEgJEdVSSIgLS0+CisgIDxQPjwvUD48IS0tI2VuZGlmIC0tPgorICA8UFJFPgorICAgIENPTlRFTlRfTEVOR1RIIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMiI+Ni4xLjI8L0E+KQorICAgIENPTlRFTlRfVFlQRSAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjMiPjYuMS4zPC9BPikKKyAgICBHQVRFV0FZX0lOVEVSRkFDRSAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjQiPjYuMS40PC9BPikKKyAgICBQQVRIX0lORk8gKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS42Ij42LjEuNjwvQT4pCisgICAgUVVFUllfU1RSSU5HIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuOCI+Ni4xLjg8L0E+KQorICAgIFJFTU9URV9BRERSIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuOSI+Ni4xLjk8L0E+KQorICAgIFJFUVVFU1RfTUVUSE9EIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTMiPjYuMS4xMzwvQT4pCisgICAgU0NSSVBUX05BTUUgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xNCI+Ni4xLjE0PC9BPikKKyAgICBTRVJWRVJfTkFNRSAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjE1Ij42LjEuMTU8L0E+KQorICAgIFNFUlZFUl9QT1JUIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTYiPjYuMS4xNjwvQT4pCisgICAgU0VSVkVSX1BST1RPQ09MIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTciPjYuMS4xNzwvQT4pCisgICAgU0VSVkVSX1NPRlRXQVJFIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTgiPjYuMS4xODwvQT4pCisgIDwvUFJFPgorICA8UD4KKyAgU2VydmVycyBTSE9VTEQgZGVmaW5lIHRoZSBmb2xsb3dpbmcKKyAgbWV0YXZhcmlhYmxlcyBmb3Igc2NyaXB0cy4KKyAgU2VlIHRoZSBpbmRpdmlkdWFsIGRlc2NyaXB0aW9ucyBmb3IgZXhjZXB0aW9ucyBhbmQgc2VtYW50aWNzLgorICA8L1A+PCEtLSNpZiBleHByPSIhICRHVUkiIC0tPgorICA8UD48L1A+PCEtLSNlbmRpZiAtLT4KKyAgPFBSRT4KKyAgICBBVVRIX1RZUEUgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xIj42LjEuMTwvQT4pCisgICAgUkVNT1RFX0hPU1QgKHNlY3Rpb24gPEEgSFJFRj0iIzYuMS4xMCI+Ni4xLjEwPC9BPikKKyAgPC9QUkU+CisgIDxQPgorICBJbiBhZGRpdGlvbiwgc2VydmVycyBTSE9VTEQgcHJvdmlkZQorICBtZXRhdmFyaWFibGVzIGZvciBhbGwgZmllbGRzIHByZXNlbnQKKyAgaW4gdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXIsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aG9zZSBpbnZvbHZlZCB3aXRoCisgIGFjY2VzcyBjb250cm9sLiAgU2VydmVycyBNQVkgYXQgdGhlaXIgZGlzY3JldGlvbiBwcm92aWRlCisgIG1ldGF2YXJpYWJsZXMKKyAgZm9yIGFjY2VzcyBjb250cm9sIGZpZWxkcy4KKyAgPC9QPgorICA8UD4KKyAgU2VydmVycyBNQVkgZGVmaW5lIHRoZSBmb2xsb3dpbmcKKyAgbWV0YXZhcmlhYmxlcy4gIFNlZSB0aGUgaW5kaXZpZHVhbAorICBkZXNjcmlwdGlvbnMgZm9yIGV4Y2VwdGlvbnMgYW5kIHNlbWFudGljcy4KKyAgPC9QPjwhLS0jaWYgZXhwcj0iISAkR1VJIiAtLT4KKyAgPFA+PC9QPjwhLS0jZW5kaWYgLS0+CisgIDxQUkU+CisgICAgUEFUSF9UUkFOU0xBVEVEIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuNyI+Ni4xLjc8L0E+KQorICAgIFJFTU9URV9JREVOVCAoc2VjdGlvbiA8QSBIUkVGPSIjNi4xLjExIj42LjEuMTE8L0E+KQorICAgIFJFTU9URV9VU0VSIChzZWN0aW9uIDxBIEhSRUY9IiM2LjEuMTIiPjYuMS4xMjwvQT4pCisgIDwvUFJFPgorICA8UD4KKyAgU2VydmVycyBNQVkKKyAgYXQgdGhlaXIgZGlzY3JldGlvbiBkZWZpbmUgYWRkaXRpb25hbCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYworICBleHRlbnNpb24gbWV0YXZhcmlhYmxlcworICBwcm92aWRlZCB0aGVpciBuYW1lcyBkbyBub3QKKyAgY29uZmxpY3Qgd2l0aCBkZWZpbmVkIGhlYWRlciBmaWVsZCBuYW1lcy4gIEltcGxlbWVudGF0aW9uLXNwZWNpZmljCisgIG1ldGF2YXJpYWJsZSBuYW1lcyBTSE9VTEQKKyAgYmUgcHJlZml4ZWQgd2l0aCAiWF8iICg8RU0+ZS5nLjwvRU0+LAorICAiWF9EQkEiKSB0byBhdm9pZCB0aGUgcG90ZW50aWFsIGZvciBzdWNoIGNvbmZsaWN0cy4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjkuMCI+CisgICAgOS4KKyAgICBTY3JpcHQgSW1wbGVtZW50YXRpb24KKyAgIDwvQT4KKyAgPC9IMj4KKyAgPFA+CisgIFRoaXMgc2VjdGlvbiBkZWZpbmVzIHRoZSByZXF1aXJlbWVudHMgYW5kIHJlY29tbWVuZGF0aW9ucyBmb3Igc2NyaXB0cworICB0aGF0IGFyZSBpbnRlbmRlZCB0byBmdW5jdGlvbiBpbiBhIENHSS8xLjEgZW52aXJvbm1lbnQuICBJdCBpcyBpbnRlbmRlZAorICBwcmltYXJpbHkgYXMgYSByZWZlcmVuY2UgZm9yIHNjcmlwdCBhdXRob3JzLCBidXQgc2VydmVyIGltcGxlbWVudG9ycworICBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCB0aGVzZSBpc3N1ZXMgYXMgd2VsbC4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjkuMSI+CisgICAgOS4xLiBSZXF1aXJlbWVudHMgZm9yIFNjcmlwdHMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFNjcmlwdHMgdXNpbmcgdGhlIHBhcnNlZC1oZWFkZXIgbWV0aG9kIHRvIGNvbW11bmljYXRlIHdpdGggc2VydmVycworICBNVVNUIHN1cHBseSBhIHJlc3BvbnNlIGhlYWRlciB0byB0aGUgc2VydmVyLgorICAoU2VlIDxBIEhSRUY9IiM3LjAiPnNlY3Rpb24gNzwvQT4uKQorICA8L1A+CisgIDxQPgorICBTY3JpcHRzIHVzaW5nIHRoZSBOUEggbWV0aG9kIHRvIGNvbW11bmljYXRlIHdpdGggc2VydmVycyBNVVNUCisgIHByb3ZpZGUgY29tcGxldGUgSFRUUCByZXNwb25zZXMsIGFuZCBNVVNUIHVzZSB0aGUgdmFsdWUgb2YgdGhlCisgIFNFUlZFUl9QUk9UT0NPTCBtZXRhdmFyaWFibGUKKyAgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQuCisgIChTZWUgPEEgSFJFRj0iIzcuMSI+c2VjdGlvbiA3LjE8L0E+LikKKyAgPC9QPgorICA8UD4KKyAgU2NyaXB0cyBNVVNUIGNoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgUkVRVUVTVF9NRVRIT0QKKyAgbWV0YXZhcmlhYmxlIGluIG9yZGVyCisgIHRvIHByb3ZpZGUgYW4gYXBwcm9wcmlhdGUgcmVzcG9uc2UuCisgIChTZWUgPEEgSFJFRj0iIzYuMS4xMyI+c2VjdGlvbiA2LjEuMTM8L0E+LikKKyAgPC9QPgorICA8UD4KKyAgU2NyaXB0cyBNVVNUIGJlIHByZXBhcmVkIHRvIGhhbmRsZWQgVVJMLWVuY29kZWQgdmFsdWVzIGluCisgIG1ldGF2YXJpYWJsZXMuCisgIEluIGFkZGl0aW9uLCB0aGV5IE1VU1QgcmVjb2duaXNlIGJvdGggIisiIGFuZCAiJTIwIiBpbiBVUkwtZW5jb2RlZAorICBxdWFudGl0aWVzIGFzIHJlcHJlc2VudGluZyB0aGUgc3BhY2UgY2hhcmFjdGVyLgorICAoU2VlIDxBIEhSRUY9IiMzLjEiPnNlY3Rpb24gMy4xPC9BPi4pCisgIDwvUD4KKyAgPFA+CisgIFNjcmlwdHMgTVVTVCBpZ25vcmUgbGVhZGluZyB6ZXJvcyBpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycworICBpbiB0aGUgR0FURVdBWV9JTlRFUkZBQ0UKKyAgbWV0YXZhcmlhYmxlIHZhbHVlLiAoU2VlCisgIDxBIEhSRUY9IiM2LjEuNCI+c2VjdGlvbiA2LjEuNDwvQT4uKQorICA8L1A+CisgIDxQPgorICBXaGVuIHByb2Nlc3NpbmcgcmVxdWVzdHMgdGhhdCBpbmNsdWRlIGEKKyAgbWVzc2FnZS1ib2R5LCBzY3JpcHRzCisgIE1VU1QgTk9UIHJlYWQgbW9yZSB0aGFuIENPTlRFTlRfTEVOR1RIIGJ5dGVzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgKFNlZSBzZWN0aW9ucyA8QSBIUkVGPSIjNi4xLjIiPjYuMS4yPC9BPiBhbmQgPEEgSFJFRj0iIzYuMiI+Ni4yPC9BPi4pCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSI5LjIiPgorICAgIDkuMi4gUmVjb21tZW5kYXRpb25zIGZvciBTY3JpcHRzCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTZXJ2ZXJzIG1heSBpbnRlcnJ1cHQgb3IgdGVybWluYXRlIHNjcmlwdCBleGVjdXRpb24gYXQgYW55IHRpbWUKKyAgYW5kIHdpdGhvdXQgd2FybmluZywgc28gc2NyaXB0cyBTSE9VTEQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoCisgIGFibm9ybWFsIHRlcm1pbmF0aW9uLgorICA8L1A+CisgIDxQPgorICBTY3JpcHRzIE1VU1QKKyAgcmVqZWN0IHdpdGgKKyAgZXJyb3IgJzQwNSBNZXRob2QgTm90CisgIEFsbG93ZWQnIHJlcXVlc3RzCisgIG1hZGUgdXNpbmcgbWV0aG9kcyB0aGF0IHRoZXkgZG8gbm90IHN1cHBvcnQuIElmIHRoZSBzY3JpcHQgZG9lcworICBub3QgaW50ZW5kCisgIHByb2Nlc3NpbmcgdGhlIFBBVEhfSU5GTyBkYXRhLCB0aGVuIGl0IFNIT1VMRCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aAorICAnNDA0IE5vdAorICBGb3VuZCcgaWYgUEFUSF9JTkZPIGlzIG5vdCBOVUxMLgorICA8L1A+CisgIDxQPgorICBJZiBhIHNjcmlwdCBpcyBwcm9jZXNzaW5nIHRoZSBvdXRwdXQgb2YgYSBmb3JtLCBpdCBTSE9VTEQKKyAgdmVyaWZ5IHRoYXQgdGhlIENPTlRFTlRfVFlQRQorICBpcyAiPFNBTVA+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9TQU1QPiIgWzxBIEhSRUY9IiNbMl0iPjI8L0E+XQorICBvciB3aGF0ZXZlciBvdGhlciBtZWRpYSB0eXBlIGlzIGV4cGVjdGVkLgorICA8L1A+CisgIDxQPgorICBTY3JpcHRzIHBhcnNpbmcgUEFUSF9JTkZPLAorICBQQVRIX1RSQU5TTEFURUQsIG9yIFNDUklQVF9OQU1FCisgIFNIT1VMRCBiZSBjYXJlZnVsCisgIG9mIHZvaWQgcGF0aCBzZWdtZW50cyAoIjxTQU1QPi8vPC9TQU1QPiIpIGFuZCBzcGVjaWFsIHBhdGggc2VnbWVudHMKKyAgKDxTQU1QPiIuIjwvU0FNUD4gYW5kCisgIDxTQU1QPiIuLiI8L1NBTVA+KS4gVGhleSBTSE9VTEQgZWl0aGVyIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGF0aCBiZWZvcmUKKyAgdXNlIGluIE9TCisgIHN5c3RlbSBjYWxscywgb3IgdGhlIHJlcXVlc3QgU0hPVUxEIGJlIHJlamVjdGVkIHdpdGgKKyAgJzQwNCBOb3QgRm91bmQnLgorICA8L1A+CisgIDxQPgorICBBcyBpdCBpcyBpbXBvc3NpYmxlIGZvcgorICBzY3JpcHRzIHRvIGRldGVybWluZSB0aGUgY2xpZW50IFVSSSB0aGF0CisgIGluaXRpYXRlZCAgYQorICByZXF1ZXN0IHdpdGhvdXQga25vd2xlZGdlIG9mIHRoZSBzcGVjaWZpYyBzZXJ2ZXIgaW4KKyAgdXNlLCB0aGUgc2NyaXB0IFNIT1VMRCBOT1QgcmV0dXJuICI8U0FNUD50ZXh0L2h0bWw8L1NBTVA+IgorICBkb2N1bWVudHMgY29udGFpbmluZworICByZWxhdGl2ZSBVUkwgbGlua3Mgd2l0aG91dCBpbmNsdWRpbmcgYSAiPFNBTVA+Jmx0O0JBU0UmZ3Q7PC9TQU1QPiIKKyAgdGFnIGluIHRoZSBkb2N1bWVudC4KKyAgPC9QPgorICA8UD4KKyAgV2hlbiByZXR1cm5pbmcgaGVhZGVyIGZpZWxkcywKKyAgc2NyaXB0cyBTSE9VTEQgdHJ5IHRvIHNlbmQgdGhlIENHSQorICBoZWFkZXIgZmllbGRzIChzZWUgc2VjdGlvbgorICA8QSBIUkVGPSIjNy4yIj43LjI8L0E+KSBhcyBzb29uIGFzIHBvc3NpYmxlLCBhbmQKKyAgU0hPVUxEIHNlbmQgdGhlbQorICBiZWZvcmUgYW55IEhUVFAgaGVhZGVyIGZpZWxkcy4gVGhpcyBtYXkKKyAgaGVscCByZWR1Y2UgdGhlIHNlcnZlcidzIG1lbW9yeSByZXF1aXJlbWVudHMuCisgIDwvUD4KKworICA8SDI+CisgICA8QSBOQU1FPSIxMC4wIj4KKyAgICAxMC4gU3lzdGVtIFNwZWNpZmljYXRpb25zCisgICA8L0E+CisgIDwvSDI+CisKKyAgPEgzPgorICAgPEEgTkFNRT0iMTAuMSI+CisgICAgMTAuMS4gQW1pZ2FET1MKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0dJIG9uIGFuIEFtaWdhRE9TIG9wZXJhdGluZyBzeXN0ZW0gcGxhdGZvcm0KKyAgU0hPVUxEIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgdGhlIG1lY2hhbmlzbSBvZiBwcm92aWRpbmcKKyAgcmVxdWVzdCBtZXRhZGF0YSB0byBDR0kgc2NyaXB0cy4KKyAgPC9QPgorICA8REw+CisgICA8RFQ+PFNUUk9ORz5FbnZpcm9ubWVudCB2YXJpYWJsZXM8L1NUUk9ORz4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhlc2UgYXJlIGFjY2Vzc2VkIGJ5IHRoZSBET1MgbGlicmFyeSByb3V0aW5lIDxTQU1QPkdldFZhcjwvU0FNUD4uIFRoZQorICAgIGZsYWdzIGFyZ3VtZW50IFNIT1VMRCBiZSAwLiBDYXNlIGlzIGlnbm9yZWQsIGJ1dCB1cHBlciBjYXNlIGlzCisgICAgcmVjb21tZW5kZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjYXNlLXNlbnNpdGl2ZSBzeXN0ZW1zLgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PFNUUk9ORz5UaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTwvU1RST05HPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNjcmlwdCBpcyBzZXQgdG8gdGhlIGRpcmVjdG9yeQorICAgIGNvbnRhaW5pbmcgdGhlIHNjcmlwdC4KKyAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxTVFJPTkc+Q2hhcmFjdGVyIHNldDwvU1RST05HPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGUgVVMtQVNDSUkgY2hhcmFjdGVyIHNldCBpcyB1c2VkIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudAorICAgIHZhcmlhYmxlIG5hbWVzIGFuZCBoZWFkZXIKKyAgICBmaWVsZCBuYW1lczsgdGhlIG5ld2xpbmUgKE5MKSBzZXF1ZW5jZSBpcyBMRjsKKyAgICBzZXJ2ZXJzIFNIT1VMRCBhbHNvIGFjY2VwdCBDUiBMRiBhcyBhIG5ld2xpbmUuCisgICAgPC9QPgorICAgPC9ERD4KKyAgPC9ETD4KKworICA8SDM+CisgICA8QSBOQU1FPSIxMC4yIj4KKyAgICAxMC4yLiBVbml4CisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIENHSSBvbiBhIFVOSVggb3BlcmF0aW5nIHN5c3RlbSBwbGF0Zm9ybQorICBTSE9VTEQgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyB0aGUgbWVjaGFuaXNtIG9mIHByb3ZpZGluZworICByZXF1ZXN0IG1ldGFkYXRhIHRvIENHSSBzY3JpcHRzLgorICA8L1A+CisgIDxQPgorICBGb3IgVW5peCBjb21wYXRpYmxlIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkOgorICA8L1A+CisgIDxETD4KKyAgIDxEVD48U1RST05HPkVudmlyb25tZW50IHZhcmlhYmxlczwvU1RST05HPgorICAgPC9EVD4KKyAgIDxERD4KKyAgICA8UD4KKyAgICBUaGVzZSBhcmUgYWNjZXNzZWQgYnkgdGhlIEMgbGlicmFyeSByb3V0aW5lIDxTQU1QPmdldGVudjwvU0FNUD4uCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48U1RST05HPlRoZSBjb21tYW5kIGxpbmU8L1NUUk9ORz4KKyAgIDwvRFQ+CisgICA8REQ+CisgICAgPFA+CisgICAgVGhpcyBpcyBhY2Nlc3NlZCB1c2luZyB0aGUKKyAgICA8U0FNUD5hcmdjPC9TQU1QPiBhbmQgPFNBTVA+YXJndjwvU0FNUD4KKyAgICBhcmd1bWVudHMgdG8gPFNBTVA+bWFpbigpPC9TQU1QPi4gVGhlIHdvcmRzIGhhdmUgYW55IGNoYXJhY3RlcnMKKyAgICB0aGF0CisgICAgYXJlICdhY3RpdmUnIGluIHRoZSBCb3VybmUgc2hlbGwgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLgorICAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgUVVFUllfU1RSSU5HCisgICAgbWV0YXZhcmlhYmxlCisgICAgY29udGFpbnMgYW4gdW5lbmNvZGVkIGVxdWFscy1zaWduICc9JywgdGhlbiB0aGUgY29tbWFuZCBsaW5lCisgICAgU0hPVUxEIE5PVCBiZSB1c2VkIGJ5IHRoZSBzY3JpcHQuCisgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48U1RST05HPlRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5PC9TVFJPTkc+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc2NyaXB0CisgICAgU0hPVUxEIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5CisgICAgY29udGFpbmluZyB0aGUgc2NyaXB0LgorICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PFNUUk9ORz5DaGFyYWN0ZXIgc2V0PC9TVFJPTkc+CisgICA8L0RUPgorICAgPEREPgorICAgIDxQPgorICAgIFRoZSBVUy1BU0NJSSBjaGFyYWN0ZXIgc2V0IGlzIHVzZWQgZm9yIHRoZSBkZWZpbml0aW9uIG9mIGVudmlyb25tZW50CisgICAgdmFyaWFibGUgbmFtZXMgYW5kIGhlYWRlciBmaWVsZCBuYW1lczsgdGhlIG5ld2xpbmUgKE5MKSBzZXF1ZW5jZSBpcyBMRjsKKyAgICBzZXJ2ZXJzIFNIT1VMRCBhbHNvIGFjY2VwdCBDUiBMRiBhcyBhIG5ld2xpbmUuCisgICAgPC9QPgorICAgPC9ERD4KKyAgPC9ETD4KKworICA8SDI+CisgICA8QSBOQU1FPSIxMS4wIj4KKyAgICAxMS4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKKyAgIDwvQT4KKyAgPC9IMj4KKworICA8SDM+CisgICA8QSBOQU1FPSIxMS4xIj4KKyAgICAxMS4xLiBTYWZlIE1ldGhvZHMKKyAgIDwvQT4KKyAgPC9IMz4KKyAgPFA+CisgIEFzIGRpc2N1c3NlZCBpbiB0aGUgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnMgb2YgdGhlIEhUVFAKKyAgc3BlY2lmaWNhdGlvbnMgWzxBIEhSRUY9IiNbM10iPjM8L0E+LDxBIEhSRUY9IiNbOF0iPjg8L0E+XSwgdGhlCisgIGNvbnZlbnRpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgdGhhdCB0aGUKKyAgR0VUIGFuZCBIRUFEIG1ldGhvZHMgc2hvdWxkIGJlICdzYWZlJzsgdGhleSBzaG91bGQgY2F1c2Ugbm8KKyAgc2lkZS1lZmZlY3RzIGFuZCBvbmx5IGhhdmUgdGhlIHNpZ25pZmljYW5jZSBvZiByZXNvdXJjZSByZXRyaWV2YWwuCisgIDwvUD4KKyAgPFA+CisgIENHSSBzY3JpcHRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGFueSBIVFRQIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zCisgIFs8QSBIUkVGPSIjWzNdIj4zPC9BPiw8QSBIUkVGPSIjWzhdIj44PC9BPl0KKyAgd2l0aCByZXNwZWN0IHRvIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGxldmVsIG9mIHRoZSByZXF1ZXN0IGFuZAorICBhbnkgc2lkZSBlZmZlY3RzIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0cyBvbiBiZWhhbGYgb2YKKyAgdGhlIHNlcnZlci4gIFByaW1hcnkKKyAgYW1vbmcgdGhlc2UKKyAgYXJlIHRoZSBjb25zaWRlcmF0aW9ucyBvZiBzYWZlIGFuZCBpZGVtcG90ZW50IG1ldGhvZHMuICBJZGVtcG90ZW50CisgIHJlcXVlc3RzIGFyZSB0aG9zZSB0aGF0IG1heSBiZSByZXBlYXRlZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRpbWVzCisgIGFuZCBwcm9kdWNlIHNpZGUgZWZmZWN0cyBpZGVudGljYWwgdG8gYSBzaW5nbGUgcmVxdWVzdC4KKyAgPC9QPgorCisgIDxIMz4KKyAgIDxBIE5BTUU9IjExLjIiPgorICAgIDExLjIuIEhUVFAgSGVhZGVyCisgICAgRmllbGRzIENvbnRhaW5pbmcgU2Vuc2l0aXZlIEluZm9ybWF0aW9uCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBTb21lIEhUVFAgaGVhZGVyIGZpZWxkcyBtYXkgY2Fycnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdoaWNoIHRoZSBzZXJ2ZXIKKyAgU0hPVUxEIE5PVCBwYXNzIG9uIHRvIHRoZSBzY3JpcHQgdW5sZXNzIGV4cGxpY2l0bHkgY29uZmlndXJlZCB0byBkbworICBzby4gRm9yIGV4YW1wbGUsIGlmIHRoZSBzZXJ2ZXIgcHJvdGVjdHMgdGhlIHNjcmlwdCB1c2luZyB0aGUKKyAgIjxTQU1QPkJhc2ljPC9TQU1QPiIKKyAgYXV0aGVudGljYXRpb24gc2NoZW1lLCB0aGVuIHRoZSBjbGllbnQgd2lsbCBzZW5kIGFuCisgICI8U0FNUD5BdXRob3JpemF0aW9uPC9TQU1QPiIKKyAgaGVhZGVyIGZpZWxkIGNvbnRhaW5pbmcgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuIElmIHRoZSBzZXJ2ZXIsIHJhdGhlcgorICB0aGFuIHRoZSBzY3JpcHQsIHZhbGlkYXRlcyB0aGlzIGluZm9ybWF0aW9uIHRoZW4gdGhlIHBhc3N3b3JkIFNIT1VMRAorICBOT1QgYmUgcGFzc2VkIG9uIHRvIHRoZSBzY3JpcHQgPEVNPnZpYTwvRU0+IHRoZSBIVFRQX0FVVEhPUklaQVRJT04KKyAgbWV0YXZhcmlhYmxlCisgIHdpdGhvdXQgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLgorICBUaGlzIGFsc28gYXBwbGllcyB0byB0aGUKKyAgUHJveHktQXV0aG9yaXphdGlvbiBoZWFkZXIgZmllbGQgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgIEhUVFBfUFJPWFlfQVVUSE9SSVpBVElPTgorICBtZXRhdmFyaWFibGUuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSIxMS4zIj4KKyAgICAxMS4zLiBTY3JpcHQKKyAgICBJbnRlcmZlcmVuY2Ugd2l0aCB0aGUgU2VydmVyCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGUgbW9zdCBjb21tb24gaW1wbGVtZW50YXRpb24gb2YgQ0dJIGludm9rZXMgdGhlIHNjcmlwdCBhcyBhIGNoaWxkCisgIHByb2Nlc3MgdXNpbmcgdGhlIHNhbWUgdXNlciBhbmQgZ3JvdXAgYXMgdGhlIHNlcnZlciBwcm9jZXNzLiBJdAorICBTSE9VTEQgdGhlcmVmb3JlIGJlIGVuc3VyZWQgdGhhdCB0aGUgc2NyaXB0IGNhbm5vdCBpbnRlcmZlcmUgd2l0aCB0aGUKKyAgc2VydmVyIHByb2Nlc3MsIGl0cyBjb25maWd1cmF0aW9uLCBvciBkb2N1bWVudHMuCisgIDwvUD4KKyAgPFA+CisgIElmIHRoZSBzY3JpcHQgaXMgZXhlY3V0ZWQgYnkgY2FsbGluZyBhIGZ1bmN0aW9uIGxpbmtlZCBpbiB0byB0aGUKKyAgc2VydmVyIHNvZnR3YXJlIChlaXRoZXIgYXQgY29tcGlsZS10aW1lIG9yIHJ1bi10aW1lKSB0aGVuIHByZWNhdXRpb25zCisgIFNIT1VMRCBiZSB0YWtlbiB0byBwcm90ZWN0IHRoZSBjb3JlIG1lbW9yeSBvZiB0aGUgc2VydmVyLCBvciB0bworICBlbnN1cmUgdGhhdCB1bnRydXN0ZWQgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSIxMS40Ij4KKyAgICAxMS40LiBEYXRhIExlbmd0aCBhbmQgQnVmZmVyaW5nIENvbnNpZGVyYXRpb25zCisgICA8L0E+CisgIDwvSDM+CisgIDxQPgorICBUaGlzIHNwZWNpZmljYXRpb24gcGxhY2VzIG5vIGxpbWl0cyBvbiB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UtYm9kaWVzCisgIHByZXNlbnRlZCB0byB0aGUgc2NyaXB0LiAgU2NyaXB0cyBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHN0YXRpY2FsbHkKKyAgYWxsb2NhdGVkIGJ1ZmZlcnMgb2YgYW55IHNpemUgYXJlIHN1ZmZpY2llbnQgdG8gY29udGFpbiB0aGUgZW50aXJlCisgIHN1Ym1pc3Npb24gYXQgb25lIHRpbWUuICBVc2Ugb2YgYSBmaXhlZCBsZW5ndGggYnVmZmVyIHdpdGhvdXQgY2FyZWZ1bAorICBvdmVyZmxvdyBjaGVja2luZyBtYXkgcmVzdWx0IGluIGFuIGF0dGFja2VyIGV4cGxvaXRpbmcgJ3N0YWNrLXNtYXNoaW5nJworICBvciAnc3RhY2stb3ZlcmZsb3cnIHZ1bG5lcmFiaWxpdGllcyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KKyAgU2NyaXB0cyBtYXkgc3Bvb2wgbGFyZ2Ugc3VibWlzc2lvbnMgdG8gZGlzayBvciBvdGhlciBidWZmZXJpbmcgbWVkaWEsCisgIGJ1dCBhIHJhcGlkIHN1Y2Nlc3Npb24gb2YgbGFyZ2Ugc3VibWlzc2lvbnMgbWF5IHJlc3VsdCBpbiBkZW5pYWwgb2YKKyAgc2VydmljZSBjb25kaXRpb25zLiAgSWYgdGhlIENPTlRFTlRfTEVOR1RIIG9mIGEgbWVzc2FnZS1ib2R5IGlzIGxhcmdlcgorICB0aGFuIHJlc291cmNlIGNvbnNpZGVyYXRpb25zIGFsbG93LCBzY3JpcHRzIHNob3VsZCByZXNwb25kIHdpdGggYW4KKyAgZXJyb3Igc3RhdHVzIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvdG9jb2wgdmVyc2lvbjsgcG90ZW50aWFsbHkgYXBwbGljYWJsZQorICBzdGF0dXMgY29kZXMgaW5jbHVkZSAnNTAzIFNlcnZpY2UgVW5hdmFpbGFibGUnIChIVFRQLzEuMCBhbmQgSFRUUC8xLjEpLAorICAnNDEzIFJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZScgKEhUVFAvMS4xKSwgYW5kCisgICc0MTQgUmVxdWVzdC1VUkkgVG9vIExvbmcnIChIVFRQLzEuMSkuCisgIDwvUD4KKworICA8SDM+CisgICA8QSBOQU1FPSIxMS41Ij4KKyAgICAxMS41LiBTdGF0ZWxlc3MgUHJvY2Vzc2luZworICAgPC9BPgorICA8L0gzPgorICA8UD4KKyAgVGhlIHN0YXRlbGVzcyBuYXR1cmUgb2YgdGhlIFdlYiBtYWtlcyBlYWNoIHNjcmlwdCBleGVjdXRpb24gYW5kIHJlc291cmNlCisgIHJldHJpZXZhbCBpbmRlcGVuZGVudCBvZiBhbGwgb3RoZXJzIGV2ZW4gd2hlbiBtdWx0aXBsZSByZXF1ZXN0cyBjb25zdGl0dXRlIGEKKyAgc2luZ2xlIGNvbmNlcHR1YWwgV2ViIHRyYW5zYWN0aW9uLiAgQmVjYXVzZSBvZiB0aGlzLCBhIHNjcmlwdCBzaG91bGQgbm90CisgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSBjb250ZXh0IG9mIHRoZSB1c2VyLWFnZW50IHN1Ym1pdHRpbmcgYQorICByZXF1ZXN0LiAgSW4gcGFydGljdWxhciwgc2NyaXB0cyBzaG91bGQgZXhhbWluZSBkYXRhIG9idGFpbmVkIGZyb20gdGhlIGNsaWVudAorICBhbmQgdmVyaWZ5IHRoYXQgdGhleSBhcmUgdmFsaWQsIGJvdGggaW4gZm9ybSBhbmQgY29udGVudCwgYmVmb3JlIGFsbG93aW5nCisgIHRoZW0gdG8gYmUgdXNlZCBmb3Igc2Vuc2l0aXZlIHB1cnBvc2VzIHN1Y2ggYXMgaW5wdXQgdG8gb3RoZXIKKyAgYXBwbGljYXRpb25zLCBjb21tYW5kcywgb3Igb3BlcmF0aW5nIHN5c3RlbSBzZXJ2aWNlcy4gIFRoZXNlIHVzZXMKKyAgaW5jbHVkZSwgYnV0IGFyZSBub3QKKyAgbGltaXRlZCB0bzogc3lzdGVtIGNhbGwgYXJndW1lbnRzLCBkYXRhYmFzZSB3cml0ZXMsIGR5bmFtaWNhbGx5IGV2YWx1YXRlZAorICBzb3VyY2UgY29kZSwgYW5kIGlucHV0IHRvIGJpbGxpbmcgb3Igb3RoZXIgc2VjdXJlIHByb2Nlc3Nlcy4gIEl0IGlzIGltcG9ydGFudAorICB0aGF0IGFwcGxpY2F0aW9ucyBiZSBwcm90ZWN0ZWQgZnJvbSBpbnZhbGlkIGlucHV0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICB0aGUgaW52YWxpZGl0eSBpcyB0aGUgcmVzdWx0IG9mIHVzZXIgZXJyb3IsIGxvZ2ljIGVycm9yLCBvciBtYWxpY2lvdXMgYWN0aW9uLgorICA8L1A+CisgIDxQPgorICBBdXRob3JzIG9mIHNjcmlwdHMgaW52b2x2ZWQgaW4gbXVsdGktcmVxdWVzdCB0cmFuc2FjdGlvbnMgc2hvdWxkIGJlCisgIHBhcnRpY3VsYXJseSBjYXV0aW9zIGFib3V0IHZhbGlkYXRpbmcgdGhlIHN0YXRlIGluZm9ybWF0aW9uOworICB1bmRlc2lyYWJsZSBlZmZlY3RzIG1heSByZXN1bHQgZnJvbSB0aGUgc3Vic3RpdHV0aW9uIG9mIGRhbmdlcm91cworICB2YWx1ZXMgZm9yIHBvcnRpb25zIG9mIHRoZSBzdWJtaXNzaW9uIHdoaWNoIG1pZ2h0IG90aGVyd2lzZSBiZQorICBwcmVzdW1lZCBzYWZlLiAgU3VidmVyc2lvbiBvZiB0aGlzIHR5cGUgb2NjdXJzIHdoZW4gYWx0ZXJhdGlvbnMKKyAgYXJlIG1hZGUgdG8gZGF0YSBmcm9tIGEgcHJpb3Igc3RhZ2Ugb2YgdGhlIHRyYW5zYWN0aW9uIHRoYXQgd2VyZQorICBub3QgbWVhbnQgdG8gYmUgY29udHJvbGxlZCBieSB0aGUgY2xpZW50ICg8RU0+ZS5nLjwvRU0+LCBoaWRkZW4KKyAgSFRNTCBmb3JtIGVsZW1lbnRzLCBjb29raWVzLCBlbWJlZGRlZCBVUkxzLCA8RU0+ZXRjLjwvRU0+KS4KKyAgPC9QPgorCisgIDxIMj4KKyAgIDxBIE5BTUU9IjEyLjAiPgorICAgIDEyLiBBY2tub3dsZWRnZW1lbnRzCisgICA8L0E+CisgIDwvSDI+CisgIDxQPgorICBUaGlzIHdvcmsgaXMgYmFzZWQgb24gYSBkcmFmdCBwdWJsaXNoZWQgaW4gMTk5NyBieSBEYXZpZCBSLiBSb2JpbnNvbiwKKyAgd2hpY2ggaW4gdHVybiB3YXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIENHSSBpbnRlcmZhY2UgdGhhdCBhcm9zZSBvdXQgb2YKKyAgZGlzY3Vzc2lvbnMgb24gdGhlIDxFTT53d3ctdGFsazwvRU0+IG1haWxpbmcgbGlzdC4gSW4gcGFydGljdWxhciwKKyAgUm9iIE1jQ29vbCwgSm9obiBGcmFua3MsIEFyaSBMdW90b25lbiwKKyAgR2VvcmdlIFBoaWxsaXBzIGFuZAorICBUb255IFNhbmRlcnMgZGVzZXJ2ZSBzcGVjaWFsIHJlY29nbml0aW9uIGZvciB0aGVpciBlZmZvcnRzIGluCisgIGRlZmluaW5nIGFuZCBpbXBsZW1lbnRpbmcgdGhlIGVhcmx5IHZlcnNpb25zIG9mIHRoaXMgaW50ZXJmYWNlLgorICA8L1A+CisgIDxQPgorICBUaGlzIGRvY3VtZW50IGhhcyBhbHNvIGdyZWF0bHkgYmVuZWZpdGVkIGZyb20gdGhlIGNvbW1lbnRzIGFuZAorICBzdWdnZXN0aW9ucyBtYWRlIGJ5ICBDaHJpcyBBZGllLCBEYXZlIEtyaXN0b2wsCisgIE1pa2UgTWV5ZXIsIERhdmlkIE1vcnJpcywgSmVyZW15IE1hZGVhLAorICBQYXRyaWNrIE08U1VQPmM8L1NVUD5NYW51cywgQWRhbSBEb25haHVlLAorICBSb3NzIFBhdHRlcnNvbiwgYW5kIEhhcmFsZCBBbHZlc3RyYW5kLgorICA8L1A+CisKKyAgPEgyPgorICAgPEEgTkFNRT0iMTMuMCI+CisgICAgMTMuIFJlZmVyZW5jZXMKKyAgIDwvQT4KKyAgPC9IMj4KKyAgPERMIENPTVBBQ1Q+CisgICA8RFQ+PEEgTkFNRT0iWzFdIj5bMV08L0E+CisgICA8L0RUPgorICAgPEREPkJlcm5lcnMtTGVlLCBULiwgJ1VuaXZlcnNhbCBSZXNvdXJjZSBJZGVudGlmaWVycyBpbiBXV1c6IEEKKyAgICAgICBVbmlmeWluZyBTeW50YXggZm9yIHRoZSBFeHByZXNzaW9uIG9mIE5hbWVzIGFuZCBBZGRyZXNzZXMgb2YKKyAgICAgICBPYmplY3RzIG9uIHRoZSBOZXR3b3JrIGFzIHVzZWQgaW4gdGhlIFdvcmxkLVdpZGUgV2ViJywgUkZDIDE2MzAsCisgICAgICAgQ0VSTiwgSnVuZSAxOTk0LgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEEgTkFNRT0iWzJdIj5bMl08L0E+CisgICA8L0RUPgorICAgPEREPkJlcm5lcnMtTGVlLCBULiBhbmQgQ29ubm9sbHksIEQuLCAnSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSAtCisgICAgICAgIDIuMCcsIFJGQyAxODY2LCBNSVQvVzNDLCBOb3ZlbWJlciAxOTk1LgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisgICA8RFQ+PEEgTkFNRT0iWzNdIj5bM108L0E+CisgICA8L0RUPgorICAgPEREPkJlcm5lcnMtTGVlLCBULiwgRmllbGRpbmcsIFIuIFQuIGFuZCBGcnlzdHlrLCBILiwKKyAgICAgICAgICAnSHlwZXJ0ZXh0IFRyYW5zZmVyIFByb3RvY29sIC0tIEhUVFAvMS4wJywgUkZDIDE5NDUsIE1JVC9MQ1MsCisgICAgICAgICAgVUMgSXJ2aW5lLCBNYXkgMTk5Ni4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorCisgIDxEVD48QSBOQU1FPSJbNF0iPls0XTwvQT4KKyAgPC9EVD4KKyAgPEREPkJlcm5lcnMtTGVlLCBULiwgRmllbGRpbmcsIFIuLCBhbmQgTWFzaW50ZXIsIEwuLCBFZGl0b3JzLAorICAgJ1VuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgKFVSSSk6IEdlbmVyaWMgU3ludGF4JywgUkZDIDIzOTYsCisgICBNSVQsIFUuQy4gSXJ2aW5lLCBYZXJveCBDb3Jwb3JhdGlvbiwgQXVndXN0IDE5OTYuCisgICA8UD4KKyAgIDwvUD4KKyAgPC9ERD4KKworICA8RFQ+PEEgTkFNRT0iWzVdIj5bNV08L0E+CisgIDwvRFQ+CisgIDxERD5CcmFkZW4sIFIuLCBFZGl0b3IsICdSZXF1aXJlbWVudHMgZm9yIEludGVybmV0IEhvc3RzIC0tCisgICAgICAgICAgQXBwbGljYXRpb24gYW5kIFN1cHBvcnQnLCBTVEQgMywgUkZDIDExMjMsIElFVEYsIE9jdG9iZXIgMTk4OS4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9Ils2XSI+WzZdPC9BPgorICAgPC9EVD4KKyAgIDxERD5Dcm9ja2VyLCBELkguLCAnU3RhbmRhcmQgZm9yIHRoZSBGb3JtYXQgb2YgQVJQQSBJbnRlcm5ldCBUZXh0CisgICAgICAgICAgTWVzc2FnZXMnLCBTVEQgMTEsIFJGQyA4MjIsIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUsIEF1Z3VzdCAxOTgyLgorICAgICAgIDxQPgorICAgICAgIDwvUD4KKyAgIDwvREQ+CisgIDxEVD48QSBOQU1FPSJbN10iPls3XTwvQT4KKyAgPC9EVD4KKyAgPEREPkZpZWxkaW5nLCBSLiwgJ1JlbGF0aXZlIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcnMnLCBSRkMgMTgwOCwKKyAgICAgICAgICBVQyBJcnZpbmUsIEp1bmUgMTk5NS4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9Ils4XSI+WzhdPC9BPgorICAgPC9EVD4KKyAgIDxERD5GaWVsZGluZywgUi4sIEdldHR5cywgSi4sIE1vZ3VsLCBKLiwgRnJ5c3R5aywgSC4gYW5kCisgICAgICAgICAgQmVybmVycy1MZWUsIFQuLCAnSHlwZXJ0ZXh0IFRyYW5zZmVyIFByb3RvY29sIC0tIEhUVFAvMS4xJywKKyAgICAgICAgICBSRkMgMjA2OCwgVUMgSXJ2aW5lLCBERUMsCisJICBNSVQvTENTLCBKYW51YXJ5IDE5OTcuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48QSBOQU1FPSJbOV0iPls5XTwvQT4KKyAgIDwvRFQ+CisgICA8REQ+RnJlZWQsIE4uIGFuZCBCb3JlbnN0ZWluIE4uLCAnTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwKKyAgICAgICAgICBFeHRlbnNpb25zIChNSU1FKSBQYXJ0IFR3bzogTWVkaWEgVHlwZXMnLCBSRkMgMjA0NiwgSW5ub3NvZnQsCisgICAgICAgICAgRmlyc3QgVmlydHVhbCwgTm92ZW1iZXIgMTk5Ni4KKyAgICAgICA8UD4KKyAgICAgICA8L1A+CisgICA8L0REPgorICAgPERUPjxBIE5BTUU9IlsxMF0iPlsxMF08L0E+CisgICA8L0RUPgorICAgPEREPk1vY2thcGV0cmlzLCBQLiwgJ0RvbWFpbiBOYW1lcyAtIENvbmNlcHRzIGFuZCBGYWNpbGl0aWVzJywKKyAgICAgICAgICBTVEQgMTMsIFJGQyAxMDM0LCBJU0ksIE5vdmVtYmVyIDE5ODcuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48QSBOQU1FPSJbMTFdIj5bMTFdPC9BPgorICAgPC9EVD4KKyAgIDxERD5TdC4gSm9obnMsIE0uLCAnSWRlbnRpZmljYXRpb24gUHJvdG9jb2wnLCBSRkMgMTQzMSwgVVMKKyAgICAgICAgICBEZXBhcnRtZW50IG9mIERlZmVuc2UsIEZlYnJ1YXJ5IDE5OTMuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48QSBOQU1FPSJbMTJdIj5bMTJdPC9BPgorICAgPC9EVD4KKyAgIDxERD4nQ29kZWQgQ2hhcmFjdGVyIFNldCAtLSA3LWJpdCBBbWVyaWNhbiBTdGFuZGFyZCBDb2RlIGZvcgorICAgICAgICAgIEluZm9ybWF0aW9uIEludGVyY2hhbmdlJywgQU5TSSBYMy40LTE5ODYuCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgIDxEVD48QSBOQU1FPSJbMTNdIj5bMTNdPC9BPgorICAgPC9EVD4KKyAgIDxERD5IaW5kZW4sIFIuIGFuZCBEZWVyaW5nLCBTLiwKKyAgICAgICAgICAnSVAgVmVyc2lvbiA2IEFkZHJlc3NpbmcgQXJjaGl0ZWN0dXJlJywgUkZDIDIzNzMsCisJICBOb2tpYSwgQ2lzY28gU3lzdGVtcywKKyAgICAgICAgICBKdWx5IDE5OTguCisgICAgICAgPFA+CisgICAgICAgPC9QPgorICAgPC9ERD4KKyAgPC9ETD4KKworICA8SDI+CisgICA8QSBOQU1FPSIxNC4wIj4KKyAgICAxNC4gQXV0aG9ycycgQWRkcmVzc2VzCisgICA8L0E+CisgIDwvSDI+CisgIDxBRERSRVNTPgorICAgPFA+CisgICBLZW4gQSBMIENvYXIKKyAgIDxCUj4KKyAgIE1lZXBab3IgQ29uc3VsdGluZworICAgPEJSPgorICAgNzgyNCBNYXlmYWlyZSBDcmVzdCBMYW5lLCBTdWl0ZSAyMDIKKyAgIDxCUj4KKyAgIFJhbGVpZ2gsIE5DICAgMjc2MTUtNDg3NQorICAgPEJSPgorICAgVS5TLkEuCisgICA8L1A+CisgICA8UD4KKyAgIFRlbDogKzEgKDkxOSkgMjU0LjQyMzcKKyAgIDxCUj4KKyAgIEZheDogKzEgKDkxOSkgMjU0LjUyNTAKKyAgIDxCUj4KKyAgIEVtYWlsOgorICAgPEEKKyAgICBIUkVGPSJtYWlsdG86S2VuLkNvYXJAR29sdXguQ29tIgorICAgPjxTQU1QPktlbi5Db2FyQEdvbHV4LkNvbTwvU0FNUD48L0E+CisgICA8L1A+CisgIDwvQUREUkVTUz4KKyAgPEFERFJFU1M+CisgICA8UD4KKyAgIERhdmlkIFJvYmluc29uCisgICA8QlI+CisgICBFKlRSQURFIFVLIEx0ZAorICAgPEJSPgorICAgTW91bnQgUGxlYXNhbnQgSG91c2UKKyAgIDxCUj4KKyAgIDIgTW91bnQgUGxlYXNhbnQKKyAgIDxCUj4KKyAgIEh1bnRpbmdkb24gUm9hZAorICAgPEJSPgorICAgQ2FtYnJpZGdlIENCMyAwUk4KKyAgIDxCUj4KKyAgIFVLCisgICA8L1A+CisgICA8UD4KKyAgIFRlbDogKzQ0ICgxMjIzKSA1NjY5MjYKKyAgIDxCUj4KKyAgIEZheDogKzQ0ICgxMjIzKSA1MDYyODgKKyAgIDxCUj4KKyAgIEVtYWlsOgorICAgPEEKKyAgICBIUkVGPSJtYWlsdG86ZHJ0ckBldHJhZGUuY28udWsiCisgICA+PFNBTVA+ZHJ0ckBldHJhZGUuY28udWs8L1NBTVA+PC9BPgorICA8L0FERFJFU1M+CisKKyA8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL2lmdXBkb3duX2Rlc2lnbi50eHQgYi9kb2NzL2lmdXBkb3duX2Rlc2lnbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiNGU1MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaWZ1cGRvd25fZGVzaWduLnR4dApAQCAtMCwwICsxLDQ0IEBACitUaGlzIGRvY3VtZW50IGlzIG1lYW50IHRvIGNvbnZpbmNlIHlvdSB0byBub3QgdXNlIGlmdXAvaWZkb3duLgorCisKK1RoZSBnZW5lcmFsIHByb2JsZW0gd2l0aCBpZnVwZG93biBpcyB0aGF0IGl0IGlzICJjb3B1bGF0ZWQgaW4gdmVydGljYWwKK2Zhc2hpb24iIGJ5IGRlc2lnbi4gSXQgdHJpZXMgdG8gZG8gdGhlIGpvYiBvZiBzaGVsbCBzY3JpcHQgaW4gQywKK2FuZCB0aGlzIGlzIGludmFyaWFibHkgZG9vbWVkIHRvIGZhaWwuIFlvdSBuZWVkIGlmdXAvaWZkb3duCit0byBiZSBhZGFwdGFibGUgYnkgbG9jYWwgYWRtaW5zLCBhbmQgQyBpcyBhbiBleHRyZW1lbHkgcG9vciBjaG9pY2UKK2ZvciB0aGF0LgorCitXZSBhcmUgZG9vbWVkIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBpZnVwL2lmZG93bi4gSnVzdCBsb29rIGFzIHRoaXMgY29kZToKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaGNwX2NsaWVudF90IGV4dF9kaGNwX2NsaWVudHNbXSA9IHsKKwl7ICJkaGNwY2QiLCAiPHVwIGNtZD4iLCAiPGRvd24gY21kPiIgfSwKKwl7ICJkaGNsaWVudCIsIC4uLi4uLi4uIH0sCisJeyAicHVtcCIsIC4uLi4uLi4uIH0sCisJeyAidWRoY3BjIiwgLi4uLi4uLi4gfSwKK307CisKK3N0YXRpYyBpbnQgZGhjcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQCisJaW50IGkgOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dF9kaGNwX2NsaWVudHMpOyBpKyspIHsKKwkJaWYgKGV4aXN0c19leGVjYWJsZShleHRfZGhjcF9jbGllbnRzW2ldLm5hbWUpKQorCQkJcmV0dXJuIGV4ZWN1dGUoZXh0X2RoY3BfY2xpZW50c1tpXS5zdG9wY21kLCBpZmQsIGV4ZWMpOworCX0KKwliYl9lcnJvcl9tc2coIm5vIGRoY3AgY2xpZW50cyBmb3VuZCwgdXNpbmcgc3RhdGljIGludGVyZmFjZSBzaHV0ZG93biIpOworCXJldHVybiBzdGF0aWNfZG93bihpZmQsIGV4ZWMpOworI2VsaWYgRU5BQkxFX1VESENQQworCXJldHVybiBleGVjdXRlKCJraWxsICIKKwkJCSJgY2F0IC92YXIvcnVuL3VkaGNwYy4laWZhY2UlLnBpZGAgMj4vZGV2L251bGwiLCBpZmQsIGV4ZWMpOworI2Vsc2UKKwlyZXR1cm4gMDsgLyogbm8gZGhjcCBzdXBwb3J0ICovCisjZW5kaWYKK30KKworSG93IHRoZSBoZWxsIGl0IGlzIHN1cHBvc2VkIHRvIHdvcmsgcmVsaWFibHkgdGhpcyB3YXk/IEp1c3QgaW1hZ2luZSB0aGF0CithZG1pbiBpcyB1c2luZyBwdW1wIGFuZCBpZnVwL2lmZG93bi4gSXQgd29ya3MuIFRoZW4sIGZvciB3aGF0ZXZlciByZWFzb24sCithZG1pbiBpbnN0YWxscyBkaGNsaWVudCwgYnV0IGRvZXMgTk9UIHVzZSBpdC4gaWZkb3duIHdpbGwgU1RPUCBXT1JLSU5HLAoranVzdCBiZWNhdXNlIGl0IHdpbGwgc2VlIGluc3RhbGxlZCBkaGNsaWVudCBiaW5hcnkgaW4gZS5nLiAvdXNyL2Jpbi9kaGNsaWVudCEKK1RoaXMgaXMgc3R1cGlkLgorCitJIHNlcmlvdXNseSB1cmdlIHBlb3BsZSB0byBub3QgdXNlIGlmdXAvaWZkb3duLgorVXNlIHNvbWV0aGluZyBsZXNzIGJyYWluIGRhbWFnZWQuCmRpZmYgLS1naXQgYS9kb2NzL2tlZXBfZGF0YV9zbWFsbC50eHQgYi9kb2NzL2tlZXBfZGF0YV9zbWFsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNzMyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mva2VlcF9kYXRhX3NtYWxsLnR4dApAQCAtMCwwICsxLDI1NiBAQAorCQlLZWVwaW5nIGRhdGEgc21hbGwKKworV2hlbiBtYW55IGFwcGxldHMgYXJlIGNvbXBpbGVkIGludG8gYnVzeWJveCwgYWxsIHJ3IGRhdGEgYW5kCitic3MgZm9yIGVhY2ggYXBwbGV0IGFyZSBjb25jYXRlbmF0ZWQuIEluY2x1ZGluZyB0aG9zZSBmcm9tIGxpYmMsCitpZiBzdGF0aWMgYnVzeWJveCBpcyBidWlsdC4gV2hlbiBidXN5Ym94IGlzIHN0YXJ0ZWQsIF9hbGxfIHRoaXMgZGF0YQoraXMgYWxsb2NhdGVkLCBub3QganVzdCB0aGF0IG9uZSBwYXJ0IGZvciBzZWxlY3RlZCBhcHBsZXQuCisKK1doYXQgImFsbG9jYXRlZCIgZXhhY3RseSBtZWFucywgZGVwZW5kcyBvbiBhcmNoLgorT24gTk9NTVUgaXQncyBwcm9iYWJseSBiaXRlcyB0aGUgbW9zdCwgYWN0dWFsbHkgdXNpbmcgcmVhbAorUkFNIGZvciByd2RhdGEgYW5kIGJzcy4gT24gaTM4NiwgYnNzIGlzIGxhemlseSBhbGxvY2F0ZWQKK2J5IENPV2VkIHplcm8gcGFnZXMuIE5vdCBzdXJlIGFib3V0IHJ3ZGF0YSAtIGFsc28gQ09XPworCitJbiBvcmRlciB0byBrZWVwIGJ1c3lib3ggTk9NTVUgYW5kIHNtYWxsLW1lbSBzeXN0ZW1zIGZyaWVuZGx5Cit3ZSBzaG91bGQgYXZvaWQgbGFyZ2UgZ2xvYmFsIGRhdGEgaW4gb3VyIGFwcGxldHMsIGFuZCBzaG91bGQKK21pbmltaXplIHVzYWdlIG9mIGxpYmMgZnVuY3Rpb25zIHdoaWNoIGltcGxpY2l0bHkgdXNlCitzdWNoIHN0cnVjdHVyZXMuCisKK1NtYWxsIGV4cGVyaW1lbnQgdG8gbWVhc3VyZSAicGFyYXNpdGljIiBiYm94IG1lbW9yeSBjb25zdW1wdGlvbjoKK2hlcmUgd2Ugc3RhcnQgMTAwMCAiYnVzeWJveCBzbGVlcCAxMCIgaW4gcGFyYWxsZWwuCitidXN5Ym94IGJpbmFyeSBpcyBwcmFjdGljYWxseSBhbGx5ZXNjb25maWcgc3RhdGljIG9uZSwKK2J1aWx0IGFnYWluc3QgdWNsaWJjLiBSdW4gb24geDg2LTY0IG1hY2hpbmUgd2l0aCA2NC1iaXQga2VybmVsOgorCitiYXNoLTMuMiMgbm1ldGVyICcldCAlYyAlbSAlcCAlW3BuXScKKzIzOjE3OjI4IC4uLi4uLi4uLi4gMTY4TSAgICAwICAxNDcKKzIzOjE3OjI5IC4uLi4uLi4uLi4gMTY4TSAgICAwICAxNDcKKzIzOjE3OjMwIFUuLi4uLi4uLi4gMTY4TSAgICAxICAxNDcKKzIzOjE3OjMxIFNVLi4uLi4uLi4gMTgxTSAgMjQ0ICAzOTEKKzIzOjE3OjMyIFNTU1NVVVUuLi4gMjIzTSAgNzU3IDExNDcKKzIzOjE3OjMzIFVVVS4uLi4uLi4gMjIzTSAgICAwIDExNDcKKzIzOjE3OjM0IFUuLi4uLi4uLi4gMjIzTSAgICAxIDExNDcKKzIzOjE3OjM1IC4uLi4uLi4uLi4gMjIzTSAgICAwIDExNDcKKzIzOjE3OjM2IC4uLi4uLi4uLi4gMjIzTSAgICAwIDExNDcKKzIzOjE3OjM3IFMuLi4uLi4uLi4gMjIzTSAgICAwIDExNDcKKzIzOjE3OjM4IC4uLi4uLi4uLi4gMjIzTSAgICAxIDExNDcKKzIzOjE3OjM5IC4uLi4uLi4uLi4gMjIzTSAgICAwIDExNDcKKzIzOjE3OjQwIC4uLi4uLi4uLi4gMjIzTSAgICAwIDExNDcKKzIzOjE3OjQxIC4uLi4uLi4uLi4gMjEwTSAgICAwICA5MDYKKzIzOjE3OjQyIC4uLi4uLi4uLi4gMTY4TSAgICAxICAxNDcKKzIzOjE3OjQzIC4uLi4uLi4uLi4gMTY4TSAgICAwICAxNDcKKworVGhpcyByZXF1aXJlcyA1NU0gb2YgbWVtb3J5LiBUaHVzIDEgdHJpdmlhbCBidXN5Ym94IGFwcGxldAordGFrZXMgNTVrIG9mIG1lbW9yeSBvbiA2NC1iaXQgeDg2IGtlcm5lbC4KKworT24gMzItYml0IGtlcm5lbCB3ZSBuZWVkIH4yNmsgcGVyIGFwcGxldC4KKworU2NyaXB0OgorCitpPTEwMDA7IHdoaWxlIHRlc3QgJGkgIT0gMDsgZG8KKyAgICAgICAgZWNobyAtbiAuCisgICAgICAgIGJ1c3lib3ggc2xlZXAgMzAgJgorICAgICAgICBpPSQoKGkgLSAxKSkKK2RvbmUKK2VjaG8KK3dhaXQKKworKERhdGEgZnJvbSBOT01NVSBhcmNoZXMgYXJlIHNvdWdodC4gUHJvdmlkZSAnc2l6ZSBidXN5Ym94JyBvdXRwdXQgdG9vKQorCisKKwkJRXhhbXBsZSAxCisKK09uZSBleGFtcGxlIGhvdyB0byByZWR1Y2UgZ2xvYmFsIGRhdGEgdXNhZ2UgaXMgaW4KK2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bnppcC5jOgorCisvKiBUaGlzIGlzIHNvbWV3aGF0IGNvbXBsZXgtbG9va2luZyBhcnJhbmdlbWVudCwgYnV0IGl0IGFsbG93cworICogdG8gcGxhY2UgZGVjb21wcmVzc29yIHN0YXRlIGVpdGhlciBpbiBic3Mgb3IgaW4KKyAqIG1hbGxvYydlZCBzcGFjZSBzaW1wbHkgYnkgY2hhbmdpbmcgI2RlZmluZXMgYmVsb3cuCisgKiBTaXplcyBvbiBpMzg2OgorICogdGV4dCAgICBkYXRhICAgICBic3MgICAgIGRlYyAgICAgaGV4CisgKiA1MjU2ICAgICAgIDAgICAgIDEwOCAgICA1MzY0ICAgIDE0ZjQgLSBic3MKKyAqIDQ5MTUgICAgICAgMCAgICAgICAwICAgIDQ5MTUgICAgMTMzMyAtIG1hbGxvYworICovCisjZGVmaW5lIFNUQVRFX0lOX0JTUyAwCisjZGVmaW5lIFNUQVRFX0lOX01BTExPQyAxCisKKyhzZWUgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgdG8gZ2V0IHRoZSBpZGVhKQorCitUaGlzIGV4YW1wbGUgY29tcGxldGVseSBlbGltaW5hdGVzIGdsb2JhbHMgaW4gdGhhdCBtb2R1bGUuCitSZXF1aXJlZCBtZW1vcnkgaXMgYWxsb2NhdGVkIGluIHVucGFja19nel9zdHJlYW0oKSBbaXRzIG1haW4gbW9kdWxlXQorYW5kIHRoZW4gcGFzc2VkIGRvd24gdG8gYWxsIHN1YnJvdXRpbmVzIHdoaWNoIG5lZWQgdG8gYWNjZXNzICdnbG9iYWxzJworYXMgYSBwYXJhbWV0ZXIuCisKKworCQlFeGFtcGxlIDIKKworSW4gY2FzZSB5b3UgZG9uJ3Qgd2FudCB0byBwYXNzIHRoaXMgYWRkaXRpb25hbCBwYXJhbWV0ZXIgZXZlcnl3aGVyZSwKK3Rha2UgYSBsb29rIGF0IGFyY2hpdmFsL2d6aXAuYy4gSGVyZSBhbGwgZ2xvYmFsIGRhdGEgaXMgcmVwbGFjZWQgYnkKK3NpbmdsZSBnbG9iYWwgcG9pbnRlciAocHRyX3RvX2dsb2JhbHMpIHRvIGFsbG9jYXRlZCBzdG9yYWdlLgorCitJbiBvcmRlciB0byBub3QgZHVwbGljYXRlIHB0cl90b19nbG9iYWxzIGluIGV2ZXJ5IGFwcGxldCwgeW91IGNhbgorcmV1c2Ugc2luZ2xlIGNvbW1vbiBvbmUuIEl0IGlzIGRlZmluZWQgaW4gbGliYmIvbWVzc2FnZXMuYworYXMgc3RydWN0IGdsb2JhbHMgKmNvbnN0IHB0cl90b19nbG9iYWxzLCBidXQgdGhlIHN0cnVjdCBnbG9iYWxzIGlzCitOT1QgZGVmaW5lZCBpbiBsaWJiYi5oLiBZb3UgZmlyc3QgZGVmaW5lIHlvdXIgb3duIHN0cnVjdDoKKworc3RydWN0IGdsb2JhbHMgeyBpbnQgYTsgY2hhciBidWZbMTAwMF07IH07CisKK2FuZCB0aGVuIGRlY2xhcmUgdGhhdCBwdHJfdG9fZ2xvYmFscyBpcyBhIHBvaW50ZXIgdG8gaXQ6CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorCitwdHJfdG9fZ2xvYmFscyBpcyBkZWNsYXJlZCBhcyBjb25zdGFudCBwb2ludGVyLgorVGhpcyBoZWxwcyBnY2MgdW5kZXJzdGFuZCB0aGF0IGl0IHdvbid0IGNoYW5nZSwgcmVzdWx0aW5nIGluIG5vdGljZWFibHkKK3NtYWxsZXIgY29kZS4gSW4gb3JkZXIgdG8gYXNzaWduIGl0LCB1c2UgU0VUX1BUUl9UT19HTE9CQUxTIG1hY3JvOgorCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7CisKK1R5cGljYWxseSBpdCBpcyBkb25lIGluIDxhcHBsZXQ+X21haW4oKS4KKworTm93IHlvdSBjYW4gcmVmZXJlbmNlICJnbG9iYWxzIiBieSBHLmEsIEcuYnVmIGFuZCBzbyBvbiwgaW4gYW55IGZ1bmN0aW9uLgorCisKKwkJYmJfY29tbW9uX2J1ZnNpejEKKworVGhlcmUgaXMgb25lIGJpZyBjb21tb24gYnVmZmVyIGluIGJzcyAtIGJiX2NvbW1vbl9idWZzaXoxLiBJdCBpcyBhIG11Y2gKK2VhcmxpZXIgbWVjaGFuaXNtIHRvIHJlZHVjZSBic3MgdXNhZ2UuIEVhY2ggYXBwbGV0IGNhbiB1c2UgaXQgZm9yCitpdHMgbmVlZHMuIExpYnJhcnkgZnVuY3Rpb25zIGFyZSBwcm9oaWJpdGVkIGZyb20gdXNpbmcgaXQuCisKKydHLicgdHJpY2sgY2FuIGJlIGRvbmUgdXNpbmcgYmJfY29tbW9uX2J1ZnNpejEgaW5zdGVhZCBvZiBtYWxsb2NlZCBidWZmZXI6CisKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorCitCZSBjYXJlZnVsLCB0aG91Z2gsIGFuZCB1c2UgaXQgb25seSBpZiBnbG9iYWxzIGZpdCBpbnRvIGJiX2NvbW1vbl9idWZzaXoxLgorU2luY2UgYmJfY29tbW9uX2J1ZnNpejEgaXMgQlVGU0laICsgMSBieXRlcyBsb25nIGFuZCBCVUZTSVogY2FuIGNoYW5nZQorZnJvbSBvbmUgbGliYyB0byBhbm90aGVyLCB5b3UgaGF2ZSB0byBhZGQgY29tcGlsZS10aW1lIGNoZWNrIGZvciBpdDoKKworaWYgKHNpemVvZihzdHJ1Y3QgZ2xvYmFscykgPiBzaXplb2YoYmJfY29tbW9uX2J1ZnNpejEpKQorCUJVR188YXBwbGV0Pl9nbG9iYWxzX3Rvb19iaWcoKTsKKworCisJCURyYXdiYWNrcworCitZb3UgaGF2ZSB0byBpbml0aWFsaXplIGl0IGJ5IGhhbmQuIHh6YWxsb2MoKSBjYW4gYmUgaGVscGZ1bCBpbiBjbGVhcmluZworYWxsb2NhdGVkIHN0b3JhZ2UgdG8gMCwgYnV0IGFueXRoaW5nIG1vcmUgbXVzdCBiZSBkb25lIGJ5IGhhbmQuCisKK0FsbCBnbG9iYWwgdmFyaWFibGVzIGFyZSBwcmVmaXhlZCBieSAnRy4nIG5vdy4gSWYgdGhpcyBtYWtlcyBjb2RlCitsZXNzIHJlYWRhYmxlLCB1c2UgI2RlZmluZXM6CisKKyNkZWZpbmUgZGV2X2ZkIChHLmRldl9mZCkKKyNkZWZpbmUgc2VjdG9yIChHLnNlY3RvcikKKworCisJCVdvcmQgb2YgY2F1dGlvbgorCitJZiBhcHBsZXQgZG9lc24ndCB1c2UgbXVjaCBvZiBnbG9iYWwgZGF0YSwgY29udmVydGluZyBpdCB0byB1c2UKK29uZSBvZiBhYm92ZSBtZXRob2RzIGlzIG5vdCB3b3J0aCB0aGUgcmVzdWx0aW5nIGNvZGUgb2JmdXNjYXRpb24uCitJZiB5b3UgaGF2ZSBsZXNzIHRoYW4gfjMwMCBieXRlcyBvZiBnbG9iYWwgZGF0YSAtIGRvbid0IGJvdGhlci4KKworCisJCUZpbmRpbmcgbm9uLXNoYXJlZCBkdXBsaWNhdGVkIHN0cmluZ3MKKworc3RyaW5ncyBidXN5Ym94IHwgc29ydCB8IHVuaXEgLWMgfCBzb3J0IC1ucgorCisKKwkJZ2NjJ3MgZGF0YSBhbGlnbm1lbnQgcHJvYmxlbQorCitUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBhZGRlZCBpbiB2aS5jOgorCitzdGF0aWMgaW50IHRhYnN0b3A7CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgdGVybV9vcmlnIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRlcm1fdmkgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisKK3JlZHVjZXMgYnNzIHNpemUgYnkgMzIgYnl0ZXMsIGJlY2F1c2UgZ2NjIHNvbWV0aW1lcyBhbGlnbnMgc3RydWN0dXJlcyB0bworcmlkaWN1bG91c2x5IGxhcmdlIHZhbHVlcy4gYXNtIG91dHB1dCBkaWZmIGZvciBhYm92ZSBleGFtcGxlOgorCisgdGFic3RvcDoKKyAgICAgICAgLnplcm8gICA0CisgICAgICAgIC5zZWN0aW9uICAgICAgICAuYnNzLnRlcm1fb3JpZywiYXciLEBub2JpdHMKKy0gICAgICAgLmFsaWduIDMyCisrICAgICAgIC5hbGlnbiA0CisgICAgICAgIC50eXBlICAgdGVybV9vcmlnLCBAb2JqZWN0CisgICAgICAgIC5zaXplICAgdGVybV9vcmlnLCA2MAorIHRlcm1fb3JpZzoKKyAgICAgICAgLnplcm8gICA2MAorICAgICAgICAuc2VjdGlvbiAgICAgICAgLmJzcy50ZXJtX3ZpLCJhdyIsQG5vYml0cworLSAgICAgICAuYWxpZ24gMzIKKysgICAgICAgLmFsaWduIDQKKyAgICAgICAgLnR5cGUgICB0ZXJtX3ZpLCBAb2JqZWN0CisgICAgICAgIC5zaXplICAgdGVybV92aSwgNjAKKworZ2NjIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIG9wdGlvbnMgZm9yIGFsdGVyaW5nIHRoaXMgYmVoYXZpb3VyLgorCitnY2MgMy40LjMgYW5kIDQuMS4xIHRlc3RlZDoKK2NoYXIgYyA9IDE7CisvLyBnY2MgYWxpZ25zIHRvIDMyIGJ5dGVzIGlmIHNpemVvZihzdHJ1Y3QpID49IDMyCitzdHJ1Y3QgeworICAgIGludCBhLGIsYyxkOworICAgIGludCBpMSxpMixpMzsKK30gczI4ID0geyAxIH07ICAgIC8vIHN0cnVjdCB3aWxsIGJlIGFsaWduZWQgdG8gNCBieXRlcworc3RydWN0IHsKKyAgICBpbnQgYSxiLGMsZDsKKyAgICBpbnQgaTEsaTIsaTMsaTQ7Cit9IHMzMiA9IHsgMSB9OyAgICAvLyBzdHJ1Y3Qgd2lsbCBiZSBhbGlnbmVkIHRvIDMyIGJ5dGVzCisvLyBzYW1lIGZvciBhcnJheXMKK2NoYXIgdmMzMVszMV0gPSB7IDEgfTsgLy8gdW5hbGlnbmVkCitjaGFyIHZjMzJbMzJdID0geyAxIH07IC8vIGFsaWduZWQgdG8gMzIgYnl0ZXMKKworLWZwYWNrLXN0cnVjdD0xIHJlZHVjZXMgYWxpZ25tZW50IG9mIHMyOCB0byAxIChidXQgcHJvYmFibHkKK3dpbGwgYnJlYWsgbGF5b3V0IG9mIG1hbnkgbGliYyBzdHJ1Y3RzKSBidXQgczMyIGFuZCB2YzMyCithcmUgc3RpbGwgYWxpZ25lZCB0byAzMiBieXRlcy4KKworSSB3aWxsIHRyeSB0byBjb29rIHVwIGEgcGF0Y2ggdG8gYWRkIGEgZ2NjIG9wdGlvbiBmb3IgZGlzYWJsaW5nIGl0LgorTWVhbndoaWxlLCB0aGlzIGlzIHdoZXJlIGl0IGNhbiBiZSBkaXNhYmxlZCBpbiBnY2Mgc291cmNlOgorCitnY2MvY29uZmlnL2kzODYvaTM4Ni5jCitpbnQKK2l4ODZfZGF0YV9hbGlnbm1lbnQgKHRyZWUgdHlwZSwgaW50IGFsaWduKQoreworI2lmIDAKKyAgaWYgKEFHR1JFR0FURV9UWVBFX1AgKHR5cGUpCisgICAgICAgJiYgVFlQRV9TSVpFICh0eXBlKQorICAgICAgICYmIFRSRUVfQ09ERSAoVFlQRV9TSVpFICh0eXBlKSkgPT0gSU5URUdFUl9DU1QKKyAgICAgICAmJiAoVFJFRV9JTlRfQ1NUX0xPVyAoVFlQRV9TSVpFICh0eXBlKSkgPj0gMjU2CisgICAgICAgICAgIHx8IFRSRUVfSU5UX0NTVF9ISUdIIChUWVBFX1NJWkUgKHR5cGUpKSkgJiYgYWxpZ24gPCAyNTYpCisgICAgcmV0dXJuIDI1NjsKKyNlbmRpZgorCitSZXN1bHQgKG5vbi1zdGF0aWMgYnVzeWJveCBidWlsdCBhZ2FpbnN0IGdsaWJjKToKKworIyBzaXplIC91c3Ivc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50MC9idXN5Ym94IGJ1c3lib3gKKyAgIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleCBmaWxlbmFtZQorIDYzNDQxNiAgICAyNzM2ICAgMjM4NTYgIDY2MTAwOCAgIGExNjEwIGJ1c3lib3gKKyA2MzI1ODAgICAgMjY3MiAgIDIyOTQ0ICA2NTgxOTYgICBhMGIxNCBidXN5Ym94X25vYWxpZ24KKworCisKKwkJS2VlcGluZyBjb2RlIHNtYWxsCisKK1NldCBDT05GSUdfRVhUUkFfQ0ZMQUdTPSItZm5vLWlubGluZS1mdW5jdGlvbnMtY2FsbGVkLW9uY2UiLAorcHJvZHVjZSAibWFrZSBibG9hdGNoZWNrIiwgc2VlIHRoZSBiaWdnZXN0IGF1dG8taW5saW5lZCBmdW5jdGlvbnMuCitOb3csIHNldCBDT05GSUdfRVhUUkFfQ0ZMQUdTIGJhY2sgdG8gIiIsIGJ1dCBhZGQgTk9JTkxJTkUKK3RvIHNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zLiBJbiAxLjE2LnggdGltZWZyYW1lLCB0aGUgcmVzdWx0cyB3ZXJlCisoYW5ub3RhdGVkICJtYWtlIGJsb2F0Y2hlY2siIG91dHB1dCk6CisKK2Z1bmN0aW9uICAgICAgICAgICAgIG9sZCAgICAgbmV3ICAgZGVsdGEKK2V4cGFuZF92YXJzX3RvX2xpc3QgICAgLSAgICAxNzEyICAgKzE3MTIgd2luCitsem8xeF9vcHRpbWl6ZSAgICAgICAgIC0gICAgMTQyOSAgICsxNDI5IHdpbgorYXJpdGhfYXBwbHkgICAgICAgICAgICAtICAgIDEzMjYgICArMTMyNiB3aW4KK3JlYWRfaW50ZXJmYWNlcyAgICAgICAgLSAgICAxMTYzICAgKzExNjMgbG9zcywgbGVhdmUgdy9vIE5PSU5MSU5FCitsb2dkaXJfb3BlbiAgICAgICAgICAgIC0gICAgMTE0OCAgICsxMTQ4IHdpbgorY2hlY2tfZGVwcyAgICAgICAgICAgICAtICAgIDExNDggICArMTE0OCBsb3NzCityZXdyaXRlICAgICAgICAgICAgICAgIC0gICAgMTAzOSAgICsxMDM5IHdpbgorcnVuX3BpcGUgICAgICAgICAgICAgMzU4ICAgIDEzOTYgICArMTAzOCB3aW4KK3dyaXRlX3N0YXR1c19maWxlICAgICAgLSAgICAxMDI5ICAgKzEwMjkgYWxtb3N0IHRoZSBzYW1lLCBsZWF2ZSB3L28gTk9JTkxJTkUKK2R1bXBfaWRlbnRpdHkgICAgICAgICAgLSAgICAgOTg3ICAgICs5ODcgd2luCittYWluUVNvcnQzICAgICAgICAgICAgIC0gICAgIDkyMSAgICArOTIxIHdpbgorcGFyc2Vfb25lX2xpbmUgICAgICAgICAtICAgICA5MTYgICAgKzkxNiBsb3NzCitzdW1tYXJpemUgICAgICAgICAgICAgIC0gICAgIDg5NyAgICArODk3IGFsbW9zdCB0aGUgc2FtZQorZG9fc2htICAgICAgICAgICAgICAgICAtICAgICA4ODQgICAgKzg4NCB3aW4KK2NwaW9fbyAgICAgICAgICAgICAgICAgLSAgICAgODYzICAgICs4NjMgd2luCitzdWJDb21tYW5kICAgICAgICAgICAgIC0gICAgIDg0MSAgICArODQxIGxvc3MKK3JlY2VpdmUgICAgICAgICAgICAgICAgLSAgICAgODM0ICAgICs4MzQgbG9zcworCis4NTUgYnl0ZXMgc2F2ZWQgaW4gdG90YWwuCisKK3NjcmlwdHMvbWtkaWZmX29ial9ibG9hdCBtYXkgYmUgdXNlZnVsIHRvIGF1dG9tYXRlIHRoaXMgcHJvY2VzczogcnVuCisic2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0IE5PUk1BTExZX0JVSUxUX1RSRUUgRk9SQ0VEX05PSU5MSU5FX1RSRUUiCithbmQgc2VsZWN0IG1vZHVsZXMgd2hpY2ggc2hyYW5rLgpkaWZmIC0tZ2l0IGEvZG9jcy9sb2dnaW5nX2FuZF9iYWNrZ3JvdW5kaW5nLnR4dCBiL2RvY3MvbG9nZ2luZ19hbmRfYmFja2dyb3VuZGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2ODg1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbG9nZ2luZ19hbmRfYmFja2dyb3VuZGluZy50eHQKQEAgLTAsMCArMSw5NiBAQAorCUxvZ2dpbmcgYW5kIGJhY2tncm91bmRpbmcKKworQnkgZGVmYXVsdCwgYmJfW3BdZXJyb3JfbXNnW19hbmRfZGllXSBtZXNzYWdlcyBnbyB0byBzdGRlcnIsCithbmQgb2YgY291cnNlLCB1c3VhbGx5IGFwcGxldHMgZG8gbm90IGF1dG8tYmFja2dyb3VuZC4gOikKKworSGlzdG9yaWNhbGx5LCBkYWVtb25zIGFuZCBpbmV0ZCBzZXJ2aWNlcyBhcmUgZGlmZmVyZW50LgorCitCdXN5Ym94IGlzIHRyeWluZyB0byBwcm92aWRlIGNvbXBhdGlibGUgYmVoYXZpb3IsIHRodXMgaWYgYW4gYXBwbGV0CitpcyBlbXVsYXRpbmcgYW4gZXhpc3RpbmcgdXRpbGl0eSwgaXQgc2hvdWxkIG1pbWljIGl0LiBJZiB1dGlsaXR5CithdXRvLWJhY2tncm91bmRzIGl0c2VsZiwgYnVzeWJveCBhcHBsZXQgc2hvdWxkIGRvIHRoZSBzYW1lLgorSWYgdXRpbGl0eSBub3JtYWxseSBsb2dzIHRvIHN5c2xvZywgYnVzeWJveCBhcHBsZXQgc2hvdWxkIGRvCit0aGUgc2FtZSB0b28uCisKK0hvd2V2ZXIsIGJ1c3lib3ggc2hvdWxkIG5vdCBuZWVkbGVzc2x5IHJlc3RyaWN0IHRoZSBmcmVlZG9tCitvZiB0aGUgdXNlcnMuIEFuZCB1c2VycyBoYXZlIGRpZmZlcmVudCBuZWVkcyBhbmQgZGlmZmVyZW50IHByZWZlcmVuY2VzLgorU29tZSBtaWdodCBsaWtlIGxvZ2dpbmcgZXZlcnl0aGluZyBmcm9tIGRhZW1vbnMgdG8gc3lzbG9nLgorT3RoZXJzIHByZWZlciBydW5uaW5nIHN0dWZmIHVuZGVyIHJ1bnN2L3N2bG9nZCBhbmQgdGh1cyB3b3VsZCBsaWtlCitsb2dnaW5nIHRvIHN0ZGVyciBhbmQgbm8gZGFlbW9uaXphdGlvbi4KKworVG8gaGVscCB3aXRoIHRoYXQsIGJ1c3lib3ggYXBwbGV0cyBzaG91bGQgaGF2ZSBvcHRpb25zIHRvIG92ZXJyaWRlCitkZWZhdWx0IGJlaGF2aW9yLCB3aGF0ZXZlciB0aGF0IGlzIGZvciBhIGdpdmVuIGFwcGxldC4KKworCitDdXJyZW50IHNpdHVhdGlvbiBpcyBhIGJpdCBvZiBhIG1lc3M6CisKK2FjcGlkIC0gYXV0by1iYWNrZ3JvdW5kcyB1bmxlc3MgLWQKK2Nyb25kIC0gYXV0by1iYWNrZ3JvdW5kcyB1bmxlc3MgLWYsIGxvZ3MgdG8gc3lzbG9nIHVubGVzcyAtZCBvciAtTC4KKyAgICBvcHRpb24gLWQgbG9ncyB0byBzdGRlcnIsIC1MIEZJTEUgbG9ncyB0byBGSUxFCitkZXZmc2QgLSAob2Jzb2xldGUpCitkbnNkIC0gb3B0aW9uIC1kIG1ha2VzIGl0IGJhY2tncm91bmQgYW5kIGxvZyB0byBzeXNsb2cKK2Zha2VpZGVudGQgLSBpbmV0ZCBzZXJ2aWNlLiBBdXRvLWJhY2tncm91bmRzIGFuZCBsb2dzIHRvIHN5c2xvZworICAgIGlmIG5vIC1mIGFuZCBubyAtaSBhbmQgbm8gLXcgKC1pIGlzICJpbmV0ZCBzZXJ2aWNlIiBmbGFnLAorICAgIC13IGlzICJpbmV0ZC13YWl0IHNlcnZpY2UiIGZsYWcpCitmdHBkIC0gaW5ldGQgc2VydmljZS4gTG9ncyB0byBzeXNsb2cgd2l0aCAtUywgd2l0aCAtdiBsb2dzIHRvIHN0cmVyciB0b28KK2h0dHBkIC0gYXV0by1iYWNrZ3JvdW5kcyB1bmxlc3MgLWYgb3IgLWkgKC1pIGlzICJpbmV0ZCBzZXJ2aWNlIiBmbGFnKQoraW5ldGQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiwgbG9ncyB0byBzeXNsb2cgdW5sZXNzIC1lCitrbG9nZCAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1uCitzeXNsb2dkIC0gYXV0by1iYWNrZ3JvdW5kcyB1bmxlc3MgLW4KK3RlbG5ldGQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiBvciAtaSAoLWkgaXMgImluZXRkIHNlcnZpY2UiIGZsYWcpCit1ZGhjcGMgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiBhZnRlciBsZWFzZSBpcyBvYnRhaW5lZCwKKyAgICBvcHRpb24gLWIgbWFrZXMgaXQgYmFja2dyb3VuZCBzb29uZXIgKHdoZW4gbGVhc2UgYXR0ZW1wdAorICAgIGZhaWxzIGFuZCByZXRyaWVzIHN0YXJ0KSwKKyAgICBhZnRlciBiYWNrZ3JvdW5kaW5nIGl0IHN0b3BzIGxvZ2dpbmcgdG8gc3RkZXJyOworICAgIGxvZ3MgdG8gc3RkZXJyLCBidXQgb3B0aW9uIC1TIG1ha2VzIGl0IGxvZyAqYWxzbyogdG8gc3lzbG9nCit1ZGhjcGQgLSBhdXRvLWJhY2tncm91bmRzIGFuZCBkbyBub3QgbG9nIHRvIHN0ZGVyciB1bmxlc3MgLWYsCisgICAgb3RoZXJ3aXNlIGxvZ3MgdG8gc3RkZXJyLCBidXQgb3B0aW9uIC1TIG1ha2VzIGl0IGxvZyAqYWxzbyogdG8gc3lzbG9nCit6Y2lwIC0gYXV0by1iYWNrZ3JvdW5kcyBhbmQgbG9ncyAqYWxzbyogdG8gc3lzbG9nIHVubGVzcyAtZgorCitUb3RhbDogMTMgYXBwbGV0cyAoKzEgb2Jzb2xldGUpLAorIDQgbG9nIHRvIHN5c2xvZyBieSBkZWZhdWx0IChjcm9uZCBmYWtlaWRlbnRkIGluZXRkIHpjaXApLAorIDUgbmV2ZXIgbG9nIHRvIHN5c2xvZyAoYWNwaWQgaHR0cGQgdGVsbmV0ZCBrbG9nZCBzeXNsb2dkLCBsYXN0IHR3bworIC0gZm9yIG9idmlvdXNseSBjb3JyZWN0IHJlYXNvbnMpLAorIHRoZXJlIGFyZSBubyBkYWVtb25zIHdoaWNoIGFsd2F5cyBsb2cgdG8gc3lzbG9nLAorIDEyIGF1dG8tYmFja2dyb3VuZCBpZiBub3QgcnVuIGFzIGluZXRkIHNlcnZpY2VzIChhbGwgZXhjZXB0IGRuc2QuCisgTm90ZSB0aGF0IHRoZXJlIGlzIG5vICJzdGFuZGFyZCIgZG5zZCBBRkFJS1MpLiBCdXQgc2VlIGJlbG93CisgZm9yIGRhZW1vbnMgKHRjcHN2ZCBldGMpIHdoaWNoIGRvbid0IGF1dG8tYmFja2dyb3VuZC4KKworbWlzY3V0aWxzL2Nyb25kLmM6ICAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworbmV0d29ya2luZy9kbnNkLmM6ICAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworbmV0d29ya2luZy9mdHBkLmM6ICAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfTk9ORTsKK25ldHdvcmtpbmcvZnRwZC5jOiAgICAgICAgICAgIGxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL2luZXRkLmM6ICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL2lzcnZfaWRlbnRkLmM6ICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL3RlbG5ldGQuYzogICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL3VkaGNwL2RoY3BjLmM6ICAgICBsb2dtb2RlID0gTE9HTU9ERV9OT05FOworbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jOiAgICAgbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuYzogICAgIGxvZ21vZGUgJj0gfkxPR01PREVfU1RESU87CituZXR3b3JraW5nL3VkaGNwL2RoY3BkLmM6ICAgICBsb2dtb2RlID0gTE9HTU9ERV9OT05FOworbmV0d29ya2luZy91ZGhjcC9kaGNwZC5jOiAgICAgbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvemNpcC5jOiAgICAgICAgICAgIGxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisKKworVGhlc2UgZGFlbW9ucyBuZXZlciBhdXRvLWJhY2tncm91bmQgYW5kIG5ldmVyIGxvZyB0byBzeXNsb2c6CisKK2xwZCAtIGluZXRkIHNlcnZpY2UuIEhhcyBub3RoaW5nIHRvIGxvZyBzbyBmYXIsIHRob3VnaAorZGhjcHJlbGF5IC0gc3RhbmRhcmQgYmVoYXZpb3IKK2lub3RpZnlkIC0gc3RhbmRhcmQgYmVoYXZpb3IKK3J1bnN2IC0gc3RhbmRhcmQgYmVoYXZpb3IKK3J1bnN2ZGlyIC0gc3RhbmRhcmQgYmVoYXZpb3IKK3N2bG9nZCAtIHN0YW5kYXJkIGJlaGF2aW9yCit0Y3BzdmQsIHVkcHN2ZCAtIHN0YW5kYXJkIGJlaGF2aW9yCit0ZnRwZCAtIHN0YW5kYXJkIGJlaGF2aW9yCisKKworTm9uLWRhZW1vbnMgKHNlZW1zIHRvIGJlIHVzZSBzeXNsb2cgZm9yIGEgZ29vZCByZWFzb24pOgorCituZXR3b3JraW5nL25hbWVpZi5jOiAgICAgICAgICBsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworbG9naW51dGlscy9jaHBhc3N3ZC5jOiAgICAgICAgbG9nbW9kZSA9IExPR01PREVfQk9USDsKK2xvZ2ludXRpbHMvY2hwYXNzd2QuYzogICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworbG9naW51dGlscy9nZXR0eS5jOiAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfQk9USDsKK2xvZ2ludXRpbHMvZ2V0dHkuYzogICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX05PTkU7Citsb2dpbnV0aWxzL3Bhc3N3ZC5jOiAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TVERJTzsKK2xvZ2ludXRpbHMvcGFzc3dkLmM6ICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7Citsb2dpbnV0aWxzL3N1bG9naW4uYzogICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7ICh1c2VkIGlmIHN0ZGlvIGlzbid0IGEgdHR5KQorbG9naW51dGlscy9zdWxvZ2luLmM6ICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfQk9USDsKK3V0aWwtbGludXgvbW91bnQuYzogICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsgKHVzZWQgaW4gYSBiYWNrZ3JvdW5kZWQgTkZTIG1vdW50IGhlbHBlcikKZGlmZiAtLWdpdCBhL2RvY3MvbWRldi50eHQgYi9kb2NzL21kZXYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDNiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL21kZXYudHh0CkBAIC0wLDAgKzEsMTQ1IEBACistLS0tLS0tLS0tLS0tCisgTURFViBQcmltZXIKKy0tLS0tLS0tLS0tLS0KKworRm9yIHRob3NlIG9mIHVzIHdobyBrbm93IGhvdyB0byB1c2UgbWRldiwgYSBwcmltZXIgbWlnaHQgc2VlbSBsYW1lLiAgRm9yCitldmVyeW9uZSBlbHNlLCBtZGV2IGlzIGEgd2VpcmQgYmxhY2sgYm94IHRoYXQgdGhleSBoZWFyIGlzIGF3ZXNvbWUsIGJ1dCBjYW4ndAorc2VlbSB0byBnZXQgdGhlaXIgaGVhZCBhcm91bmQgaG93IGl0IHdvcmtzLiAgVGh1cywgYSBwcmltZXIuCisKKy0tLS0tLS0tLS0tCisgQmFzaWMgVXNlCistLS0tLS0tLS0tLQorCitNZGV2IGhhcyB0d28gcHJpbWFyeSB1c2VzOiBpbml0aWFsIHBvcHVsYXRpb24gYW5kIGR5bmFtaWMgdXBkYXRlcy4gIEJvdGgKK3JlcXVpcmUgc3lzZnMgc3VwcG9ydCBpbiB0aGUga2VybmVsIGFuZCBoYXZlIGl0IG1vdW50ZWQgYXQgL3N5cy4gIEZvciBkeW5hbWljCit1cGRhdGVzLCB5b3UgYWxzbyBuZWVkIHRvIGhhdmUgaG90cGx1Z2dpbmcgZW5hYmxlZCBpbiB5b3VyIGtlcm5lbC4KKworSGVyZSdzIGEgdHlwaWNhbCBjb2RlIHNuaXBwZXQgZnJvbSB0aGUgaW5pdCBzY3JpcHQ6CitbMF0gbW91bnQgLXQgcHJvYyBwcm9jIC9wcm9jCitbMV0gbW91bnQgLXQgc3lzZnMgc3lzZnMgL3N5cworWzJdIGVjaG8gL3NiaW4vbWRldiA+IC9wcm9jL3N5cy9rZXJuZWwvaG90cGx1ZworWzNdIG1kZXYgLXMKKworQWx0ZXJuYXRpdmVseSwgd2l0aG91dCBwcm9jZnMgdGhlIGFib3ZlIGJlY29tZXM6CitbMV0gbW91bnQgLXQgc3lzZnMgc3lzZnMgL3N5cworWzJdIHN5c2N0bCAtdyBrZXJuZWwuaG90cGx1Zz0vc2Jpbi9tZGV2CitbM10gbWRldiAtcworCisKK09mIGNvdXJzZSwgYSBtb3JlICJmdWxsIiBzZXR1cCB3b3VsZCBlbnRhaWwgZXhlY3V0aW5nIHRoaXMgYmVmb3JlIHRoZSBwcmV2aW91cworY29kZSBzbmlwcGV0OgorWzRdIG1vdW50IC10IHRtcGZzIC1vIHNpemU9NjRrLG1vZGU9MDc1NSB0bXBmcyAvZGV2CitbNV0gbWtkaXIgL2Rldi9wdHMKK1s2XSBtb3VudCAtdCBkZXZwdHMgZGV2cHRzIC9kZXYvcHRzCisKK1RoZSBzaW1wbGUgZXhwbGFuYXRpb24gaGVyZSBpcyB0aGF0IFsxXSB5b3UgbmVlZCB0byBoYXZlIC9zeXMgbW91bnRlZCBiZWZvcmUKK2V4ZWN1dGluZyBtZGV2LiAgVGhlbiB5b3UgWzJdIGluc3RydWN0IHRoZSBrZXJuZWwgdG8gZXhlY3V0ZSAvc2Jpbi9tZGV2IHdoZW5ldmVyCithIGRldmljZSBpcyBhZGRlZCBvciByZW1vdmVkIHNvIHRoYXQgdGhlIGRldmljZSBub2RlIGNhbiBiZSBjcmVhdGVkIG9yCitkZXN0cm95ZWQuICBUaGVuIHlvdSBbM10gc2VlZCAvZGV2IHdpdGggYWxsIHRoZSBkZXZpY2Ugbm9kZXMgdGhhdCB3ZXJlIGNyZWF0ZWQKK3doaWxlIHRoZSBzeXN0ZW0gd2FzIGJvb3RpbmcuCisKK0ZvciB0aGUgImZ1bGwiIHNldHVwLCB5b3Ugd2FudCB0byBbNF0gbWFrZSBzdXJlIC9kZXYgaXMgYSB0bXBmcyBmaWxlc3lzdGVtCisoYXNzdW1pbmcgeW91J3JlIHJ1bm5pbmcgb3V0IG9mIGZsYXNoKS4gIFRoZW4geW91IHdhbnQgdG8gWzVdIGNyZWF0ZSB0aGUKKy9kZXYvcHRzIG1vdW50IHBvaW50IGFuZCBmaW5hbGx5IFs2XSBtb3VudCB0aGUgZGV2cHRzIGZpbGVzeXN0ZW0gb24gaXQuCisKKy0tLS0tLS0tLS0tLS0KKyBNREVWIENvbmZpZyAgICgvZXRjL21kZXYuY29uZikKKy0tLS0tLS0tLS0tLS0KKworTWRldiBoYXMgYW4gb3B0aW9uYWwgY29uZmlnIGZpbGUgZm9yIGNvbnRyb2xsaW5nIG93bmVyc2hpcC9wZXJtaXNzaW9ucyBvZgorZGV2aWNlIG5vZGVzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIHNvbWV0aGluZyBtb3JlIHRoYW4gdGhlIGRlZmF1bHQgcm9vdC9yb290Cis2NjAgcGVybWlzc2lvbnMuCisKK1RoZSBmaWxlIGhhcyB0aGUgZm9ybWF0OgorICAgIDxkZXZpY2UgcmVnZXg+ICAgICAgIDx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4KKyBvciBAPG1halssbWluMVstbWluMl1dPiA8dWlkPjo8Z2lkPiA8cGVybWlzc2lvbnM+CisKK0ZvciBleGFtcGxlOgorICAgIGhkW2Etel1bMC05XSogMDozIDY2MAorCitUaGUgY29uZmlnIGZpbGUgcGFyc2luZyBzdG9wcyBhdCB0aGUgZmlyc3QgbWF0Y2hpbmcgbGluZS4gIElmIG5vIGxpbmUgaXMKK21hdGNoZWQsIHRoZW4gdGhlIGRlZmF1bHQgb2YgMDowIDY2MCBpcyB1c2VkLiAgVG8gc2V0IHlvdXIgb3duIGRlZmF1bHQsIHNpbXBseQorY3JlYXRlIHlvdXIgb3duIHRvdGFsIG1hdGNoIGxpa2Ugc286CisJLiogMToxIDc3NworCitZb3UgY2FuIHJlbmFtZS9tb3ZlIGRldmljZSBub2RlcyBieSB1c2luZyB0aGUgbmV4dCBvcHRpb25hbCBmaWVsZC4KKwk8ZGV2aWNlIHJlZ2V4PiA8dWlkPjo8Z2lkPiA8cGVybWlzc2lvbnM+IFs9cGF0aF0KK1NvIGlmIHlvdSB3YW50IHRvIHBsYWNlIHRoZSBkZXZpY2Ugbm9kZSBpbnRvIGEgc3ViZGlyZWN0b3J5LCBtYWtlIHN1cmUgdGhlIHBhdGgKK2hhcyBhIHRyYWlsaW5nIC8uICBJZiB5b3Ugd2FudCB0byByZW5hbWUgdGhlIGRldmljZSBub2RlLCBqdXN0IHBsYWNlIHRoZSBuYW1lLgorCWhkYSAwOjMgNjYwID1kcml2ZXMvCitUaGlzIHdpbGwgbW92ZSAiaGRhIiBpbnRvIHRoZSBkcml2ZXMvIHN1YmRpcmVjdG9yeS4KKwloZGIgMDozIDY2MCA9Y2Ryb20KK1RoaXMgd2lsbCByZW5hbWUgImhkYiIgdG8gImNkcm9tIi4KKworU2ltaWxhcmx5LCAiPnBhdGgiIHJlbmFtZXMvbW92ZXMgdGhlIGRldmljZSBidXQgaXQgYWxzbyBjcmVhdGVzCithIGRpcmVjdCBzeW1saW5rIC9kZXYvREVWTkFNRSB0byB0aGUgcmVuYW1lZC9tb3ZlZCBkZXZpY2UuCisKK1lvdSBjYW4gYWxzbyBwcmV2ZW50IGNyZWF0aW9uIG9mIGRldmljZSBub2RlcyB3aXRoIHRoZSA0dGggZmllbGQgYXMgIiEiOgorCXR0eVthLXpdLiAwOjAgNjYwICEKKwlwdHlbYS16XS4gMDowIDY2MCAhCisKK0lmIHlvdSBhbHNvIGVuYWJsZSBzdXBwb3J0IGZvciBleGVjdXRpbmcgeW91ciBvd24gY29tbWFuZHMsIHRoZW4gdGhlIGZpbGUgaGFzCit0aGUgZm9ybWF0OgorCTxkZXZpY2UgcmVnZXg+IDx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4gWz1wYXRoXSBbQHwkfCo8Y29tbWFuZD5dCisgICAgb3IKKwk8ZGV2aWNlIHJlZ2V4PiA8dWlkPjo8Z2lkPiA8cGVybWlzc2lvbnM+IFs+cGF0aF0gW0B8JHwqPGNvbW1hbmQ+XQorICAgIG9yCisJPGRldmljZSByZWdleD4gPHVpZD46PGdpZD4gPHBlcm1pc3Npb25zPiBbIV0gW0B8JHwqPGNvbW1hbmQ+XQorCitGb3IgZXhhbXBsZToKKy0tLTg8LS0tCisjIGJsb2NrIGRldmljZXMKKyhbaHNdZFthLXpdKQkJcm9vdDpkaXNrCTY2MAk+ZGlzay8lMS8wCisoW2hzXWRbYS16XSkoWzAtOV0rKQlyb290OmRpc2sJNjYwCT5kaXNrLyUxLyUyCittbWNibGsoWzAtOV0rKQkJcm9vdDpkaXNrCTY2MAk+ZGlzay9tbWMvJTEvMAorbW1jYmxrKFswLTldKylwKFswLTldKykJcm9vdDpkaXNrCTY2MAk+ZGlzay9tbWMvJTEvJTIKKyMgbmV0d29yayBkZXZpY2VzCisodHVufHRhcCkJCXJvb3Q6bmV0d29yawk2NjAJPm5ldC8lMQorLS0tODwtLS0KKworVGhlIHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIHRoZSBtZWFuaW5nOgorCUAgUnVuIGFmdGVyIGNyZWF0aW5nIHRoZSBkZXZpY2UuCisJJCBSdW4gYmVmb3JlIHJlbW92aW5nIHRoZSBkZXZpY2UuCisJKiBSdW4gYm90aCBhZnRlciBjcmVhdGluZyBhbmQgYmVmb3JlIHJlbW92aW5nIHRoZSBkZXZpY2UuCisKK1RoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHZpYSB0aGUgc3lzdGVtKCkgZnVuY3Rpb24gKHdoaWNoIG1lYW5zIHlvdSdyZSBnaXZpbmcgYQorY29tbWFuZCB0byB0aGUgc2hlbGwpLCBzbyBtYWtlIHN1cmUgeW91IGhhdmUgYSBzaGVsbCBpbnN0YWxsZWQgYXQgL2Jpbi9zaC4gIFlvdQorc2hvdWxkIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGtlcm5lbCBleGVjdXRlcyBob3RwbHVnIGhlbHBlcnMgd2l0aCBzdGRpbiwKK3N0ZG91dCwgYW5kIHN0ZGVyciBjb25uZWN0ZWQgdG8gL2Rldi9udWxsLgorCitGb3IgeW91ciBjb252ZW5pZW5jZSwgdGhlIHNoZWxsIGVudiB2YXIgJE1ERVYgaXMgc2V0IHRvIHRoZSBkZXZpY2UgbmFtZS4gIFNvIGlmCit0aGUgZGV2aWNlICJoZGMiIHdhcyBtYXRjaGVkLCBNREVWIHdvdWxkIGJlIHNldCB0byAiaGRjIi4KKworLS0tLS0tLS0tLQorIEZJUk1XQVJFCistLS0tLS0tLS0tCisKK1NvbWUga2VybmVsIGRldmljZSBkcml2ZXJzIG5lZWQgdG8gcmVxdWVzdCBmaXJtd2FyZSBhdCBydW50aW1lIGluIG9yZGVyIHRvCitwcm9wZXJseSBpbml0aWFsaXplIGEgZGV2aWNlLiAgUGxhY2UgYWxsIHN1Y2ggZmlybXdhcmUgZmlsZXMgaW50byB0aGUKKy9saWIvZmlybXdhcmUvIGRpcmVjdG9yeS4gIEF0IHJ1bnRpbWUsIHRoZSBrZXJuZWwgd2lsbCBpbnZva2UgbWRldiB3aXRoIHRoZQorZmlsZW5hbWUgb2YgdGhlIGZpcm13YXJlIHdoaWNoIG1kZXYgd2lsbCBsb2FkIG91dCBvZiAvbGliL2Zpcm13YXJlLyBhbmQgaW50bwordGhlIGtlcm5lbCB2aWEgdGhlIHN5c2ZzIGludGVyZmFjZS4gIFRoZSBleGFjdCBmaWxlbmFtZSBpcyBoYXJkY29kZWQgaW4gdGhlCitrZXJuZWwsIHNvIGxvb2sgdGhlcmUgaWYgeW91IG5lZWQgdG8ga25vdyBob3cgdG8gbmFtZSB0aGUgZmlsZSBpbiB1c2Vyc3BhY2UuCisKKy0tLS0tLS0tLS0tLQorIFNFUVVFTkNJTkcKKy0tLS0tLS0tLS0tLQorCitLZXJuZWwgZG9lcyBub3Qgc2VyaWFsaXplIGhvdHBsdWcgZXZlbnRzLiBJdCBpbmNyZW1lbnRzIFNFUU5VTSBlbnZpcm9ubWVudGFsCit2YXJpYWJsZSBmb3IgZWFjaCBzdWNjZXNzaXZlIGhvdHBsdWcgaW52b2NhdGlvbi4gTm9ybWFsbHksIG1kZXYgZG9lc24ndCBjYXJlLgorVGhpcyBtYXkgcmVvcmRlciBob3RwbHVnIGFuZCBob3QtdW5wbHVnIGV2ZW50cywgd2l0aCB0eXBpY2FsIHN5bXB0b21zIG9mCitkZXZpY2Ugbm9kZXMgc29tZXRpbWVzIG5vdCBjcmVhdGVkIGFzIGV4cGVjdGVkLgorCitIb3dldmVyLCBpZiAvZGV2L21kZXYuc2VxIGZpbGUgaXMgZm91bmQsIG1kZXYgd2lsbCBjb21wYXJlIGl0cworY29udGVudHMgd2l0aCBTRVFOVU0uIEl0IHdpbGwgcmV0cnkgdXAgdG8gdHdvIHNlY29uZHMsIHdhaXRpbmcgZm9yIHRoZW0KK3RvIG1hdGNoLiBJZiB0aGV5IG1hdGNoIGV4YWN0bHkgKG5vdCBldmVuIHRyYWlsaW5nICdcbicgaXMgYWxsb3dlZCksCitvciBpZiB0d28gc2Vjb25kcyBwYXNzLCBtZGV2IHJ1bnMgYXMgdXN1YWwsIHRoZW4gaXQgcmV3cml0ZXMgL2Rldi9tZGV2LnNlcQord2l0aCBTRVFOVU0rMS4KKworSU9XOiB0aGlzIHdpbGwgc2VyaWFsaXplIGNvbmN1cnJlbnQgbWRldiBpbnZvY2F0aW9ucy4KKworSWYgeW91IHdhbnQgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLCBleGVjdXRlICJlY2hvID4vZGV2L21kZXYuc2VxIiBwcmlvciB0bworc2V0dGluZyBtZGV2IHRvIGJlIHRoZSBob3RwbHVnIGhhbmRsZXIuIFRoaXMgd3JpdGVzIHNpbmdsZSAnXG4nIHRvIHRoZSBmaWxlLgorTkI6IG1kZXYgcmVjb2duaXplcyAvZGV2L21kZXYuc2VxIGNvbnNpc3Rpbmcgb2Ygc2luZ2xlICdcbicgY2hhcmFjdGVyCithcyBhIHNwZWNpYWwgY2FzZS4gSU9XOiB0aGlzIHdpbGwgbm90IG1ha2UgeW91ciBmaXJzdCBob3RwbHVnIGV2ZW50Cit0byBzdGFsbCBmb3IgdHdvIHNlY29uZHMuCmRpZmYgLS1naXQgYS9kb2NzL25ldy1hcHBsZXQtSE9XVE8udHh0IGIvZG9jcy9uZXctYXBwbGV0LUhPV1RPLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTgwNTRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uZXctYXBwbGV0LUhPV1RPLnR4dApAQCAtMCwwICsxLDE4MiBAQAorSG93IHRvIEFkZCBhIE5ldyBBcHBsZXQgdG8gQnVzeUJveAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRldGFpbHMgdGhlIHN0ZXBzIHlvdSBtdXN0IHRha2UgdG8gYWRkIGEgbmV3IGFwcGxldCB0byBCdXN5Qm94LgorCitDcmVkaXRzOgorTWF0dCBLcmFhaSAtIGluaXRpYWwgd3JpdGV1cAorTWFyayBXaGl0bGV5IC0gdGhlIHJlbWl4CitUaG9tYXMgTHVuZHF1aXN0IC0gVHJ5aW5nIHRvIGtlZXAgaXQgdXBkYXRlZC4KKworV2hlbiBkb2luZyB0aGlzIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIGxhdGVzdCBnaXQgSEVBRC4KK1RoaXMgaXMgYSBnb29kIHRoaW5nIGlmIHlvdSBwbGFuIHRvIGdldHRpbmcgaXQgY29tbWl0dGVkIGludG8gbWFpbmxpbmUuCisKK0luaXRpYWwgV3JpdGUKKy0tLS0tLS0tLS0tLS0KKworRmlyc3QsIHdyaXRlIHlvdXIgYXBwbGV0LiAgQmUgc3VyZSB0byBpbmNsdWRlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBhdCB0aGUgdG9wLAorc3VjaCBhcyB3aG8geW91IHN0b2xlIHRoZSBjb2RlIGZyb20gYW5kIHNvIGZvcnRoLiBBbHNvIGluY2x1ZGUgdGhlIG1pbmktR1BMCitib2lsZXJwbGF0ZS4gQmUgc3VyZSB0byBuYW1lIHRoZSBtYWluIGZ1bmN0aW9uIDxhcHBsZXQ+X21haW4gaW5zdGVhZCBvZiBtYWluLgorQW5kIGJlIHN1cmUgdG8gcHV0IGl0IGluIDxhcHBsZXQ+LmMuIFVzYWdlIGRvZXMgbm90IGhhdmUgdG8gYmUgdGFrZW4gY2FyZSBvZiBieQoreW91ciBhcHBsZXQuCitNYWtlIHN1cmUgdG8gI2luY2x1ZGUgImxpYmJiLmgiIGFzIHRoZSBmaXJzdCBpbmNsdWRlIGZpbGUgaW4geW91ciBhcHBsZXQuCisKK0ZvciBhIG5ldyBhcHBsZXQgbXUsIGhlcmUgaXMgdGhlIGNvZGUgdGhhdCB3b3VsZCBnbyBpbiBtdS5jOgorCisoYnVzeWJveC5oIGFscmVhZHkgaW5jbHVkZXMgbW9zdCB1c3VhbCBoZWFkZXIgZmlsZXMuIFlvdSBkbyBub3QgbmVlZAorI2luY2x1ZGUgPHN0ZGlvLmg+IGV0Yy4uLikKKworCistLS0tYmVnaW4gZXhhbXBsZSBjb2RlLS0tLS0tCisKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbXUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFtZRUFSXSBieSBbWU9VUiBOQU1FXSA8WU9VUiBFTUFJTD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm90aGVyLmgiCisKK2ludCBtdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCXNzaXplX3QgbjsKKwljaGFyIG11OworCisJZmQgPSB4b3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSk7CisKKwlpZiAoKG4gPSBzYWZlX3JlYWQoZmQsICZtdSwgMSkpIDwgMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCIvZGV2L3JhbmRvbSIpOworCisJcmV0dXJuIG11OworfQorCistLS0tZW5kIGV4YW1wbGUgY29kZS0tLS0tLQorCisKK0NvZGluZyBTdHlsZQorLS0tLS0tLS0tLS0tCisKK0JlZm9yZSB5b3Ugc3VibWl0IHlvdXIgYXBwbGV0IGZvciBpbmNsdXNpb24gaW4gQnVzeUJveCwgKG9yIGJldHRlciB5ZXQsIGJlZm9yZQoreW91IF93cml0ZV8geW91ciBhcHBsZXQpIHBsZWFzZSByZWFkIHRocm91Z2ggdGhlIHN0eWxlIGd1aWRlIGluIHRoZSBkb2NzCitkaXJlY3RvcnkgYW5kIG1ha2UgeW91ciBwcm9ncmFtIGNvbXBsaWFudC4KKworCitTb21lIFdvcmRzIG9uIGxpYmJiCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIHlvdSBhcmUgd3JpdGluZyB5b3VyIGFwcGxldCwgcGxlYXNlIGJlIGF3YXJlIG9mIHRoZSBib2R5IG9mIHByZS1leGlzdGluZwordXNlZnVsIGZ1bmN0aW9ucyBpbiBsaWJiYi4gVXNlIHRoZXNlIGluc3RlYWQgb2YgcmVpbnZlbnRpbmcgdGhlIHdoZWVsLgorCitBZGRpdGlvbmFsbHksIGlmIHlvdSBoYXZlIGFueSB1c2VmdWwsIGdlbmVyYWwtcHVycG9zZSBmdW5jdGlvbnMgaW4geW91cgorYXBwbGV0IHRoYXQgY291bGQgYmUgdXNlZnVsIGluIG90aGVyIGFwcGxldHMsIGNvbnNpZGVyIHB1dHRpbmcgdGhlbSBpbiBsaWJiYi4KKworQW5kIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IHNvbWUgb2YgdGhlIG90aGVyIGFwcGxldHMgdXNlcyBmdW5jdGlvbnMgeW91Citjb3VsZCB1c2UuIElmIHNvLCB5b3UgaGF2ZSB0byByaXAgdGhlIGZ1bmN0aW9uIG91dCBvZiB0aGUgYXBwbGV0IGFuZCBtYWtlCithIGxpYmJiIGZ1bmN0aW9uIG91dCBvZiBpdC4KKworQWRkaW5nIGEgbGliYmIgZnVuY3Rpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFrZSBhIG5ldyBmaWxlIG5hbWVkIDxmdW5jdGlvbl9uYW1lPi5jCisKKy0tLS1zdGFydCBleGFtcGxlIGNvZGUtLS0tLS0KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAib3RoZXIuaCIKKworaW50IGZ1bmN0aW9uKGNoYXIgKmEpCit7CisJcmV0dXJuICphOworfQorCistLS0tZW5kIGV4YW1wbGUgY29kZS0tLS0tLQorCitBZGQgPGZ1bmN0aW9uX25hbWU+Lm8gaW4gdGhlIHJpZ2h0IGFscGhhYmV0aWNhbGx5IHNvcnRlZCBwbGFjZQoraW4gbGliYmIvS2J1aWxkLnNyYy4gWW91IHNob3VsZCBsb29rIGF0IHRoZSBjb25kaXRpb25hbCBwYXJ0IG9mCitsaWJiYi9LYnVpbGQuc3JjIGFzIHdlbGwuCisKK1lvdSBzaG91bGQgYWxzbyB0cnkgdG8gZmluZCBhIHN1aXRhYmxlIHBsYWNlIGluIGluY2x1ZGUvbGliYmIuaCBmb3IKK3RoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gSWYgbm90LCBhZGQgaXQgc29tZXdoZXJlIGFueXdheSwgd2l0aCBvciB3aXRob3V0CitpZmRlZnMgdG8gaW5jbHVkZSBvciBub3QuCisKK1lvdSBjYW4gbG9vayBhdCBsaWJiYi9Db25maWcuc3JjIGFuZCB0cnkgdG8gZmluZCBvdXQgaWYgdGhlIGZ1bmN0aW9uIGlzCit0dW5hYmxlIGFuZCBhZGQgaXQgdGhlcmUgaWYgaXQgaXMuCisKKworUGxhY2VtZW50IC8gRGlyZWN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmluZCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZvciB5b3VyIG5ldyBhcHBsZXQuCisKK01ha2Ugc3VyZSB5b3UgZmluZCB0aGUgYXBwcm9wcmlhdGUgcGxhY2VzIGluIHRoZSBmaWxlcywgdGhlIGFwcGxldHMgYXJlCitzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCisKK0FkZCB0aGUgYXBwbGV0IHRvIEtidWlsZC5zcmMgaW4gdGhlIGNob3NlbiBkaXJlY3Rvcnk6CisKK2xpYi0kKENPTkZJR19NVSkgICAgICAgICAgICAgICArPSBtdS5vCisKK0FkZCB0aGUgYXBwbGV0IHRvIENvbmZpZy5zcmMgaW4gdGhlIGNob3NlbiBkaXJlY3Rvcnk6CisKK2NvbmZpZyBNVQorCWJvb2wgIk1VIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFJldHVybnMgYW4gaW5kZXRlcm1pbmF0ZSB2YWx1ZS4KKworCitVc2FnZSBTdHJpbmcocykKKy0tLS0tLS0tLS0tLS0tLQorCitOZXh0LCBhZGQgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHlvdSBhcHBsZXQgdG8gaW5jbHVkZS91c2FnZS5zcmMuaC4KK1RoaXMgc2hvdWxkIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCisJI2RlZmluZSBtdV90cml2aWFsX3VzYWdlIFwKKwkJIi1bYWJjZGVdIEZJTEVTIgorCSNkZWZpbmUgbXVfZnVsbF91c2FnZSBcCisJCSJSZXR1cm5zIGFuIGluZGV0ZXJtaW5hdGUgdmFsdWUuXG5cbiIgXAorCQkiT3B0aW9uczpcbiIgXAorCQkiXHQtYVx0XHRmaXJzdCBmdW5jdGlvblxuIiBcCisJCSJcdC1iXHRcdHNlY29uZCBmdW5jdGlvblxuIiBcCisJCS4uLgorCitJZiB5b3VyIHByb2dyYW0gc3VwcG9ydHMgZmxhZ3MsIHRoZSBmbGFncyBzaG91bGQgYmUgbWVudGlvbmVkIG9uIHRoZSBmaXJzdAorbGluZSAoLVthYmNkZV0pIGFuZCBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGVhY2ggZmxhZyBzaG91bGQgZ28gaW4gdGhlCittdV9mdWxsX3VzYWdlIHNlY3Rpb24sIG9uZSBmbGFnIHBlciBsaW5lLiAoTnVtZXJvdXMgZXhhbXBsZXMgb2YgdGhpcworY3VycmVudGx5IGV4aXN0IGluIHVzYWdlLnNyYy5oLikKKworCitIZWFkZXIgRmlsZXMKKy0tLS0tLS0tLS0tLQorCitOZXh0LCBhZGQgYW4gZW50cnkgdG8gaW5jbHVkZS9hcHBsZXRzLnNyYy5oLiAgQmUgKnN1cmUqIHRvIGtlZXAgdGhlIGxpc3QKK2luIGFscGhhYmV0aWNhbCBvcmRlciwgb3IgZWxzZSBpdCB3aWxsIGJyZWFrIHRoZSBiaW5hcnktc2VhcmNoIGxvb2t1cAorYWxnb3JpdGhtIGluIGJ1c3lib3guYyBhbmQgdGhlIEdvZHMgb2YgQnVzeUJveCBzbWl0ZSB5b3UuIFllYSwgdmVyaWx5OgorCitCZSBzdXJlIHRvIHJlYWQgdGhlIHRvcCBvZiBhcHBsZXRzLnNyYy5oIGJlZm9yZSBhZGRpbmcgeW91ciBhcHBsZXQuCisKKwkvKiBhbGwgcHJvZ3JhbXMgYWJvdmUgaGVyZSBhcmUgYWxwaGFiZXRpY2FsbHkgImxlc3MgdGhhbiIgJ211JyAqLworCUlGX01VKEFQUExFVChtdSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisJLyogYWxsIHByb2dyYW1zIGJlbG93IGhlcmUgYXJlIGFscGhhYmV0aWNhbGx5ICJncmVhdGVyIHRoYW4iICdtdScgKi8KKworCitUaGUgR3JhbmQgQW5ub3VuY2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZW4gY3JlYXRlIGEgZGlmZiBieSBhZGRpbmcgdGhlIG5ldyBmaWxlcyB0byBnaXQgKHJlbWVtYmVyIHlvdXIgbGliYmIgZmlsZXMpCisJZ2l0IGFkZCA8d2hlcmUgeW91IHB1dCBpdD4vbXUuYworZXZlbnR1YWxseSBhbHNvOgorCWdpdCBhZGQgbGliYmIvZnVuY3Rpb24uYwordGhlbgorCWdpdCBjb21taXQKKwlnaXQgZm9ybWF0LXBhdGNoIEhFQUReCithbmQgc2VuZCBpdCB0byB0aGUgbWFpbGluZyBsaXN0OgorCWJ1c3lib3hAYnVzeWJveC5uZXQKKwlodHRwOi8vYnVzeWJveC5uZXQvbWFpbG1hbi9saXN0aW5mby9idXN5Ym94CisKK1NlbmRpbmcgcGF0Y2hlcyBhcyBhdHRhY2htZW50cyBpcyBwcmVmZXJyZWQsIGJ1dCBub3QgcmVxdWlyZWQuCmRpZmYgLS1naXQgYS9kb2NzL25vZm9ya19ub2V4ZWMudHh0IGIvZG9jcy9ub2Zvcmtfbm9leGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNThmNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9ub2Zvcmtfbm9leGVjLnR4dApAQCAtMCwwICsxLDk4IEBACisJTk9FWEVDIGFuZCBOT0ZPUksgYXBwbGV0cy4KKworVW5peCBzaGVsbHMgdHJhZGl0aW9uYWxseSBleGVjdXRlIHNvbWUgY29tbWFuZHMgaW50ZXJuYWxseSBpbiB0aGUgYXR0ZW1wdAordG8gZHJhbWF0aWNhbGx5IHNwZWVkIHVwIGV4ZWN1dGlvbi4gSXQgd2lsbCBiZSBzbG93IGFzIGhlbGwgaWYgZm9yIGV2ZXJ5CisiZWNobyBibGFoIiBzaGVsbCB3aWxsIGZvcmsgYW5kIGV4ZWMgL2Jpbi9lY2hvLiBUbyB0aGlzIGVuZCwgc2hlbGxzCitoYXZlIHRvIF9yZWltcGxlbWVudF8gdGhlc2UgY29tbWFuZHMgaW50ZXJuYWxseS4KKworQnVzeWJveCBpcyB1bmlxdWUgaW4gdGhpcyByZWdhcmQgYmVjYXVzZSBpdCBhbHJlYWR5IGlzIGEgY29sbGVjdGlvbgorb2YgcmVpbXBsZW1lbnRlZCBVbml4IGNvbW1hbmRzLCBhbmQgd2UgY2FuIGRvIHRoZSBzYW1lIHRyaWNrCitmb3Igc3BlZWRpbmcgdXAgYnVzeWJveCBzaGVsbHMsIGFuZCBtb3JlLiBOT0VYRUMgYW5kIE5PRk9SSyBhcHBsZXRzCithcmUgZXhhY3RseSB0aG9zZSBhcHBsZXRzIHdoaWNoIGFyZSBlbGlnaWJsZSBmb3IgdGhlc2UgdHJpY2tzLgorCitBcHBsZXQgd2lsbCBiZSBzdWJqZWN0IHRvIE5PRk9SSy9OT0VYRUMgdHJpY2tzIGlmIGl0IGlzIG1hcmtlZCBhcyBzdWNoCitpbiBhcHBsZXRzLmguIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgYSBjb25maWcgb3B0aW9uIHdoaWNoCitnbG9iYWxseSBlbmFibGVzIHVzYWdlIG9mIE5PRk9SSy9OT0VYRUMgdHJpY2tzLgorSWYgaXQgaXMgZW5hYmxlZCwgRkVBVFVSRV9TSF9TVEFOREFMT05FIGNhbiBiZSBlbmFibGVkIHRvbywKK2FuZCB0aGVuIHNoZWxscyB3aWxsIHVzZSBOT0ZPUksvTk9FWEVDIHRyaWNrcyBmb3Igb3JkaW5hcnkgY29tbWFuZHMuCitOQjogc2hlbGwgYnVpbHRpbnMgdXNlIHRoZXNlIHRyaWNrcyByZWdhcmRsZXNzIG9mIEZFQVRVUkVfU0hfU1RBTkRBTE9ORQorb3IgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUy4KKworSW4gQywgaWYgeW91IHdhbnQgdG8gY2FsbCBhIHByb2dyYW0gYW5kIHdhaXQgZm9yIGl0LCB1c2UKK3NwYXduX2FuZF93YWl0KGFyZ3YpLCBCQl9FWEVDVlAocHJvZyxhcmd2KSBvciBCQl9FWEVDTFAocHJvZyxhcmd2MCwuLi4pLgorVGhleSBjaGVjayB3aGV0aGVyIHByb2dyYW0gbmFtZSBpcyBhbiBhcHBsZXQgbmFtZSBhbmQgb3B0aW9uYWxseQorZG8gTk9GT1JLL05PRVhFQyB0aGluZyBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbi4KKworCisJTk9FWEVDCisKK05PRVhFQyBhcHBsZXQgc2hvdWxkIHdvcmsgY29ycmVjdGx5IGlmIGFub3RoZXIgYXBwbGV0IGZvcmtzIGFuZCB0aGVuCitleGVjdXRlcyBleGl0KDxhcHBsZXQ+X21haW4oYXJnYyxhcmd2KSkgaW4gdGhlIGNoaWxkLiBUaGUgcnVsZXMKK3JvdWdobHkgYXJlOgorCisqIGRvIG5vdCBleHBlY3Qgc2hhcmVkIGdsb2JhbCB2YXJpYWJsZXMvYnVmZmVycyB0byBiZSBpbiB0aGVpcgorICAiaW5pdGlhbGl6ZWQiIHN0YXRlLiBFeGFtcGxlczogeGZ1bmNfZXJyb3JfcmV0dmFsIGNhbiBiZSAhPSAxLAorICBiYl9jb21tb25fYnVmc2l6MSBjYW4gYmUgc2NyaWJibGVkIG92ZXIsIC4uLgorKiBkbyBub3QgZXhwZWN0IHRoYXQgc3RkaW8gd2Fzbid0IHVzZWQgYmVmb3JlLiBDYWxsaW5nIHNldFt2XWJ1ZigpCisgIGNhbiBiZSBkaXNhc3Ryb3VzLgorKiAuLi4KKworTk9FWEVDIGFwcGxldHMgc2F2ZSBvbmx5IG9uZSBoYWxmIG9mIGZvcmsrZXhlYyBvdmVyaGVhZC4KK05PRVhFQyB0cmljayBpcyBkaXNhYmxlZCBmb3IgTk9NTVUgYnVpbGQuCisKKworCU5PRk9SSworCitOT0ZPUksgYXBwbGV0IHNob3VsZCB3b3JrIGNvcnJlY3RseSBpZiBhbm90aGVyIGFwcGxldCBzaW1wbHkgcnVucworPGFwcGxldD5fbWFpbihhcmdjLGFyZ3YpIGFuZCB0aGVuIGNvbnRpbnVlcyB3aXRoIGl0cyBidXNpbmVzcy4KK3hhcmdzLCBmaW5kLCBzaGVsbHMgZG8gaXQgKGdyZXAgZm9yICJzcGF3bl9hbmRfd2FpdCIgYW5kCisicnVuX25vZm9ya19hcHBsZXQiIHRvIGZpbmQgbW9yZSB1c2VycykuCisKK1RoaXMgcG9zZXMgbXVjaCBtb3JlIHNlcmlvdXMgbGltaXRhdGlvbnMgb24gd2hhdCBhcHBsZXQgY2FuIGRvOgorCisqIGFsbCBOT0VYRUMgbGltaXRhdGlvbnMgYXBwbHkuCisqIGRvIG5vdCBldmVyIGV4aXQoKSBvciBleGVjKCkuCisgIC0geGZ1bmNzIGFyZSBva2F5LiBUaGV5IGFyZSB1c2luZyBzcGVjaWFsIHRyaWNrIHRvIHJldHVybgorICAgIHRvIHRoZSBjYWxsZXIgYXBwbGV0IGluc3RlYWQgb2YgZHlpbmcgd2hlbiB0aGV5IGRldGVjdCAieCIgY29uZGl0aW9uLgorICAtIHlvdSBtYXkgImV4aXQiIHRvIGNhbGxlciBhcHBsZXQgYnkgY2FsbGluZyB4ZnVuY19kaWUoKS4gUmV0dXJuIHZhbHVlCisgICAgaXMgdGFrZW4gZnJvbSB4ZnVuY19lcnJvcl9yZXR2YWwuCisgIC0gZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChuKSBpcyBvayB0byB1c2UuCisqIGRvIG5vdCB1c2Ugc2hhcmVkIGdsb2JhbCBkYXRhLCBvciBzYXZlL3Jlc3RvcmUgc2hhcmVkIGdsb2JhbCBkYXRhCisgIChlLmcuIGJiX2NvbW1vbl9idWZzaXoxKSBwcmlvciB0byByZXR1cm5pbmcuCisgIC0gZ2V0b3B0MzIoKSBpcyBvayB0byB1c2UuIFlvdSBkbyBub3QgbmVlZCB0byBzYXZlL3Jlc3RvcmUgb3B0aW9uX21hc2szMiwKKyAgICBpdCBpcyBhbHJlYWR5IGRvbmUgYnkgY29yZSBjb2RlLgorKiBpZiB5b3UgYWxsb2NhdGUgbWVtb3J5LCB5b3UgY2FuIHVzZSB4bWFsbG9jKCkgb25seSBvbiB0aGUgdmVyeSBmaXJzdAorICBhbGxvY2F0aW9uLiBBbGwgb3RoZXIgYWxsb2NhdGlvbnMgc2hvdWxkIHVzZSBtYWxsb2NbX29yX3dhcm5dKCkuCisgIEFmdGVyIGZpcnN0IGFsbG9jYXRpb24sIHlvdSBjYW5ub3QgdXNlIGFueSB4ZnVuY3MuCisgIE90aGVyd2lzZSwgZmFpbGluZyB4ZnVuYyB3aWxsIHJldHVybiB0byBjYWxsZXIgYXBwbGV0CisgIHdpdGhvdXQgZnJlZWluZyBtYWxsb2NlZCBkYXRhIQorKiBBbGwgYWxsb2NhdGVkIGRhdGEsIG9wZW5lZCBmaWxlcywgc2lnbmFsIGhhbmRsZXJzLCB0ZXJtaW9zIHNldHRpbmdzLAorICBPX05PTkJMT0NLIGZsYWdzIGV0YyBzaG91bGQgYmUgZnJlZWQvY2xvc2VkL3Jlc3RvcmVkIHByaW9yIHRvIHJldHVybi4KKyogLi4uCisKK05PRk9SSyBhcHBsZXRzIGdpdmUgdGhlIG1vc3Qgb2Ygc3BlZWQgYWR2YW50YWdlLCBidXQgYXJlIHRyaWNraWVzdAordG8gaW1wbGVtZW50LiBJbiBvcmRlciB0byBtaW5pbWl6ZSBhbW91bnQgb2YgYnVncyBhbmQgbWFpbnRlbmFuY2UsCitwcmltZSBjYW5kaWRhdGVzIGZvciBOT0ZPUkstaWZpY2F0aW9uIGFyZSB0aG9zZSBhcHBsZXRzIHdoaWNoCithcmUgc21hbGwgYW5kIGVhc3kgdG8gYXVkaXQsIGFuZCB0aG9zZSB3aGljaCBhcmUgbW9yZSBsaWtlbHkgdG8gYmUKK2ZyZXF1ZW50bHkgZXhlY3V0ZWQgZnJvbSBzaGVsbC9maW5kL3hhcmdzLCBwYXJ0aWN1bGFybHkgaW4gc2hlbGwKK3NjcmlwdCBsb29wcy4gQXBwbGV0cyB3aGljaCBtZXNzIHdpdGggc2lnbmFsIGhhbmRsZXJzLCB0ZXJtaW9zIGV0YworYXJlIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUgZWZmb3J0LgorCitBbnkgTk9GT1JLIGFwcGxldCBpcyBhbHNvIGEgTk9FWEVDIGFwcGxldC4KKworCisJUmVsZXZhbnQgQ09ORklHIG9wdGlvbnMKKworRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworICBCQl9FWEVDVlAoY21kLCBhcmd2KSB3aWxsIHRyeSB0byBleGVjIC9wcm9jL3NlbGYvZXhlCisgICAgaWYgY29tbWFuZCdzIG5hbWUgbWF0Y2hlcyBzb21lIGFwcGxldCBuYW1lCisgIGFwcGxldCB0YWJsZXMgd2lsbCBjb250YWluIE5PRk9SSy9OT0VYRUMgYml0cworICBzcGF3bl9hbmRfd2FpdChhcmd2KSB3aWxsIGRvIE5PRk9SSy9OT0VYRUMgdHJpY2tzCisKK0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSAobmVlZHMgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUz15KQorICBzaGVsbHMgd2lsbCB0cnkgdG8gZXhlYyAvcHJvYy9zZWxmL2V4ZSBpZiBjb21tYW5kJ3MgbmFtZSBtYXRjaGVzCisgICAgc29tZSBhcHBsZXQgbmFtZQorICBzaGVsbHMgd2lsbCBkbyBOT0VYRUMgdHJpY2sgb24gTk9FWEVDIGFwcGxldHMKKworRkVBVFVSRV9TSF9OT0ZPUksgKG5lZWRzIEZFQVRVUkVfUFJFRkVSX0FQUExFVFM9eSkKKyAgc2hlbGxzIHdpbGwgZG8gTk9GT1JLIHRyaWNrIG9uIE5PRk9SSyBhcHBsZXRzCmRpZmYgLS1naXQgYS9kb2NzL3Bvc2l4X2NvbmZvcm1hbmNlLnR4dCBiL2RvY3MvcG9zaXhfY29uZm9ybWFuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjE2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3Bvc2l4X2NvbmZvcm1hbmNlLnR4dApAQCAtMCwwICsxLDc0MSBAQAorCitCdXN5Ym94IFBPU0lYIGNvbmZvcm1hbmNlIHRhYmxlCisKK1NlZSBQT1NJWCBkb2N1bWVudGF0aW9uICgxMDAzLjEtMjAwOCkgaGVyZToKK2h0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvCitBbmQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYWxsIHV0aWxpdGllcyB0aGF0IFBPU0lYIGNvdmVyczoKK2h0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvaWR4L3V0aWxpdGllcy5odG1sCisKK1RoaXMgbGlzdGluZyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGFuZCBjdXJyZW50bHkgb25seSBjb3ZlcnMKK3Rvb2wgb3B0aW9ucyAobm90IG9wZXJhbmRzLCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHJldHVybiBjb2RlcywgZXRjLi4pLgorRm9yIGVhY2ggb3B0aW9uIGl0IGlzIHNldCBpZiBpdCAoYSkgZXhpc3RzIGFuZCAoYikgY29tcGxpYW50IHRvIFBPU0lYIDIwMDguCitTb21lIG9wdGlvbnMgZXhpc3QgYnV0IHRoZXJlIGlzIG5vIHZhbHVlIGluIHRoZSAnY29tcGxpYW50JyBjb2x1bW46IHRoYXQKK21lYW5zIG5vIG9uZSBoYXMgeWV0IGJvdGhlcmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb24gZG9lcyB3aGF0IGl0IGlzCityZXF1aXJlZCB0byBkby4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUE9TSVggVG9vbHMgc3VwcG9ydGVkIG9ubHkgYXMgc2hlbGwgYnVpbHQtaW5zIChhc2ggc2hlbGwpOgorICBhbGlhcywgYmcsIGNkLCBmZywgZ2V0b3B0cywgaGFzaCwgam9icywgcmVhZCwgdHlwZSwgdW1hc2ssIHVsaW1pdCwKKyAgdW5hbGlhcywgd2FpdCwgd3JpdGUKKworUE9TSVggVG9vbHMgbm90IHN1cHBvcnRlZDoKKyAgYXNhLCBhdCwgYmF0Y2gsIGJjLCBjOTksIGNvbW1hbmQsIGNvbXByZXNzLCBjc3BsaXQsIGV4LCBmYywgZmlsZSwKKyAgZ2VuY2F0LCBnZXRjb25mLCBpY29udiwgam9pbiwgbGluaywgbG9jYWxlLCBsb2NhbGVkZWYsIGxwLCBtNCwKKyAgbWFpbHgsIG5ld2dycCwgbmwsIHBhc3RlLCBwYXRoY2hrLCBwYXgsIHByLCBxYWx0ZXIsIHFkZWwsIHFob2xkLCBxbW92ZSwKKyAgcW1zZywgcXJlcnVuLCBxcmxzLCBxc2VsZWN0LCBxc2lnLCBxc3RhdCwgcXN1YiwgdGFicywgdGFsaywgdHB1dCwKKyAgdHNvcnQsIHVubGluaywgdXVjcCwgdXVzdGF0LCB1dXgKKworUE9TSVggVG9vbHMgbm90IHN1cHBvcnRlZCAoREVWRUxPUE1FTlQpOgorICBhZG1pbiwgY2Zsb3csIGN0YWdzLCBjeHJlZiwgZGVsdGEsIGZvcnQ3NywgZ2V0LCBsZXgsIG1ha2UsIG5tLCBwcnMsIHJtZGVsLAorICBzYWN0LCBzY2NzLCBzdHJpcCwgdW5nZXQsIHZhbCwgd2hhdCwgeWFjYworCisKK1BPU0lYIFRvb2xzIHN1cHBvcnRlZDoKKworTm90ZTogZWNobywgcHJpbnRmLCBraWxsLCBwd2QgZG9jdW1lbnRlZCBoZXJlIGFzIHN0YW5kLWFsb25lIGFwcGxldHMsCisgICAgICBub3QgYXMgYXNoIGJ1aWx0LWlucy4KKworCithciBQT1NJWCBvcHRpb25zICoqKioqKioqKioqKioqKioqKioqKiBGYWlsZWQgdG8gcmVjb2duaXplIHppcCAmIHRhciAoZGlkIG5vdCBjb21wYXJlIHRvIHJlZ3VsYXIgYXIpCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLVQgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWEgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWIgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWQgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLW0gICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXEgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXQgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXYgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXggICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKK2FyIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLW8KKworYXdrIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtRiBFUkUgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtZiBwcm9nZmlsZSAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtdiBhc3NpZ25tZW50ICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorYXdrIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitiYXNlbmFtZSBQT1NJWCBvcHRpb25zOiBOb25lCitiYXNlbmFtZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworY2FsIFBPU0lYIG9wdGlvbnM6IE5vbmUKK2NhbCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC15LCAtagorCitjYXQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC11ICAgICAgICAgICAgICB8ICB5ZXMgICB8IG5vICAgICAgICB8IG9wdGlvbiBpcyBpZ25vcmVkCitjYXQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK2NoZ3JwIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtSCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtTCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtUCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtUiAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtaCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorY2hncnAgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZiwgLWMsIC12CisKK2NobW9kIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtUiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorY2htb2QgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZiwgLXYsIC1jCisKK2Nob3duIFBPU0lYIG9wdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUggICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwgSXQgc2VlbXMgbGlrZSBhbGwgZmxhZ3MgYXJlIHN1cHBvcnRlZCAoYWNjb3JkaW5nIHRvIHByaW50b3V0KSwgYnV0CisgIC1MICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8ICBpdCBmYWlscyB0byB3b3JrIG9uIG15IG1hY2hpbmUKKyAgLVAgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLVIgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWggICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKK2Nob3duIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWYsIC1jLCAtdgorCitja3N1bSBQT1NJWCBvcHRpb25zOiBOb25lCitja3N1bSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworY21wIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorY21wIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKworCitjb21tIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtMSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtMiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtMyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorY29tbSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworY3AgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1IICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1MICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1QICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1mICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1wICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitjcCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1kLCAtYSwgLXMsIC1jLCAtciwgLWwKKworY3JvbnRhYiBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWUgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLWwgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKK2Nyb250YWIgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtdSwgLWMKKworY3V0IFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYiBsaXN0ICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtYyBsaXN0ICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZCBkZWxpbSAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZiBsaXN0ICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorY3V0IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitkYXRlIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtdSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorZGF0ZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1JW1NQRUNdLCAtZCBUSU1FLCAtciBGSUxFLCAtUiwgLUQgRk1UCisKK2RkIFBPU0lYIG9wdGlvbnM6Cisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgaWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgb2YgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgaWJzICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgb2JzICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgYnMgICAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgY2JzICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgc2tpcCAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgc2VlayAgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgY291bnQgICAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgY29udj1hc2NpaSAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj1lYmNkaWMgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj1pYm0gICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj1ibG9jayAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj11bmJsb2NrICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj1sY2FzZSAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj11Y2FzZSAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj1zd2FwICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgY29udj1ub2Vycm9yICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgY29udj1ub3RydW5jICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgY29udj1zeW5jICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKK2RkIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyBjb252PWZzeW5jCisKK2RmIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtUCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtayAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorZGYgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtYSwgLW0sIC1CIFNJWkUsIC1pLCAtaAorUmVtYXJrOgorLSBJdCBzZWVtcyB0aGF0IEdOVSBkZiBkb2VzIG5vdCByb3VuZCBwZXJjZW50cyB1cCBpbiBpdHMgb3V0cHV0ICh0aHVzIGl0cyByZXN1bHRzIGFyZSBhIGJpdCBkaWZmZXJlbnQpCisKK2RpZmYgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1DIG4gICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1VIG4gICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1iICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1lICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1mICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1yICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC11ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitkaWZmIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWQsIC1hLCAtcywgLXQsIC1MLCAtTiwgLWksIC1ULCAtdywgLXEsIC1TCisKK2Rpcm5hbWUgUE9TSVggb3B0aW9uczogTm9uZQorZGlybmFtZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworZHUgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1IICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1MICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1hICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1rICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC14ICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CitkdSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1jLCAtbSwgLWgsIC1kIE4sIC1sCisKKworZWNobyBQT1NJWCBvcHRpb25zOiBOb25lCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLW4gICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwgVGhlIHJlc3VsdCBvZiAtbiBpcyAiaW1wbGVtZW50YXRpb24tZGVmaW5lZCIKK2VjaG8gQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZSwgLUUKKworZWQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1wIHN0cmluZyAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitlZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworZW52IFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtaSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorZW52IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLXUsIC0sICAtaQorCitleHBhbmQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC10IHRhYmxpc3QgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitleHBhbmQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtLXRhYnM9TiwgLWksIC0taW5pdGlhbAorCitleHByIFBPU0lYIG9wZXJhdGlvbnM6Cisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgfCAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgJiAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgPSAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgPiAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgPj0gICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgPD0gICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgPCAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgIT0gICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgKyAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgLSAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgKiAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgLyAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgJSAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgOiAgICAgICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgKGV4cHIpICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgaW50ZWdlciAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKKyAgc3RyaW5nICAgICAgICAgIHwgIHllcyAgIHwgIHllcyAgICAgIHwKK2V4cHIgQnVzeWJveCBzcGVjaWZpYyBvcGVyYXRpb25zOgorICBtYXRjaCwgc3Vic3RyLCBpbmRleCwgbGVuZ3RoLCBxdW90ZQorCitmYWxzZSBQT1NJWCBvcHRpb25zOiBOb25lCitmYWxzZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworZmluZCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUggICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLUwgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK2ZpbmQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtZ3JvdXAgTkFNRSwgLW10aW1lIERBWVMsIC1wcmludCwgLW1heGRlcHRoIE4sIC1leGVjIENNRCBBUkcgOywgLW5ld2VyIEZJTEUsIC1jb250ZXh0LCAtaW5hbWUgUEFUVEVSTiwgLWZvbGxvdywgLWRlcHRoLCAteGRldiwgLWludW0gTiwgLXR5cGUgWCwgLXByaW50MCwgLW1pbmRlcHRoIE4sIC1tbWluIE1JTlMsIC1yZWdleCBQQVRURVJOLCAtcHJ1bmUsIC1wYXRoIFBBVFRFUk4sIC11c2VyIE5BTUUsIC1kZWxldGUsIC1wZXJtIE5OTiwgLW5hbWUgUEFUVEVSTiwgLXNpemUgTltiY2tdCisKK2ZvbGQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1iICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC13IHdpZHRoICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8Citmb2xkIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCitmdXNlciBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK2Z1c2VyIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLW0sIC1rLCAtNCwgLVNJR05BTCwgLTYsIC1zCisKK2dyZXAgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1FICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1GICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1lIHBhdHRlcm5fbGlzdCB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1mIHBhdHRlcm5fZmlsZSB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1sICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1uICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1xICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC12ICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC14ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitncmVwIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLUEsIC1DLCAtQiwgLUwsIC1ILCAtbywgLWgsIC13LCAtciwgLXosIC1tIE1BWAorCitoZWFkIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbiBudW1iZXIgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAoraGVhZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC12LCAtYyBOVU0sIC1xCisKK2lkIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtRyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtZyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAoraWQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtWgorCitpcGNybSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLU0gc2hta2V5ICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLVEgbXNna2V5ICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLVMgc2Vta2V5ICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLW0gc2htaWQgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXEgbXNnaWQgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXMgc2VtaWQgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK2lwY3JtIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLW1NLCAtcVEsIC1zUworCitpcGNzIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtYiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYyAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtbyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtcSAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtdCAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAoraXBjcyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1sLCAtaSwgLXUKKwora2lsbCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWwgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgc2lnbmFsX25hbWUgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXNpZ25hbF9uYW1lICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXNpZ25hbF9udW1iZXIgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK2tpbGwgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAgLXEsIC1vCisKK2xuIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtTCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtUCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorbG4gQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtUyBzdWYsIC1uLCAtYgorCitsb2dnZXIgUE9TSVggb3B0aW9uczogTm9uZQorbG9nZ2VyIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLXAgUFJJTywgLXQgVEFHLCAtcworCitsb2duYW1lIFBPU0lYIG9wdGlvbnM6IE5vbmUKK2xvZ25hbWUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK2xzIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtMSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtQSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtQyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtRiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfCBBbmQgbW9yZTogJz0nIGZvciBzb2NrZXRzIChub3QgZGVmaW5lZCBieSBQT1NJWCkKKyAgLUggICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLUwgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwgQnV0IGNvbG9yaW5nIG1heSBiZSB3cm9uZyAoYXQgbGVhc3QgUE9TSVggZG9lcyBub3QgcmVxdWlyZSBjb3JyZWN0IGNvbG9ycyA6KSApCisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1TICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1hICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICB5ZXMgICB8IG5vICAgICAgICB8IFNvcnRzIG91dHB1dCB3aXRoICctbCcgKHNob3VsZCBvbmx5IHNob3cgY3RpbWUgd2l0aCAnLWwnLCBhbmQgc29ydCBvbmx5IHdpdGggJy10JykKKyAgLWQgICAgICAgICAgICAgIHwgIHllcyAgIHwgbm8gICAgICAgIHwgV2hlbiBpbnZva2VkIHRvZ2V0aGVyIHdpdGggJy1MJyBzaG91bGQgcmVhZCBzeW1ib2xpYyBsaW5rcywgYW5kIGRvZXNuJ3QKKyAgLWYgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWcgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWsgICAgICAgICAgICAgIHwgIHllcyAgIHwgbm8gICAgICAgIHwgRG9lcyBzb21ldGhpbmcgY29tcGxldGVseSB1bnJlbGF0ZWQhIChMaXN0cyBzZWN1cml0eSBjb250ZXh0IGluc3RlYWQgb2Ygc3BlY2lmeWluZyBibG9jayBzaXplKQorICAtbCAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbiAgICAgICAgICAgICAgfCAgeWVzICAgfCBubyAgICAgICAgfCBXb3JrcyBjb3JyZWN0bHkgb25seSB0b2dldGhlciB3aXRoICctbCcgKGJ1dCBQT1NJWCByZXF1aXJlcyAnLWwnIHRvIGJlIGltcGxpY2l0bHkgYXNzdW1lZCkKKyAgLW8gICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXEgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXQgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXggICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK2xzIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLS1jb2xvciwgLVQgTlVNLCAtSywgLVgsIC1aLCAtZSwgLWgsIC12LCAtdyBOVU0KKworbWFuIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtayAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorbWFuIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWEgICAgICBEaXNwbGF5IGFsbCBwYWdlcworCisKK21lc2cgUE9TSVggb3B0aW9uczogTm9uZQorbWVzZyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworbWtkaXIgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1tIG1vZGUgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1wICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8Citta2RpciBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1aCisKK21rZmlmbyBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLW0gbW9kZSAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK21rZmlmbyBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC1aCisKK21vcmUgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1jICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1lICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1uIG51bWJlciAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1wIGNvbW1hbmQgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC10IHRhZ3N0cmluZyAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC11ICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8Cittb3JlIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCittdiBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWkgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK212IEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCituaWNlIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbiBpbmNyZW1lbnQgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorbmljZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworbm9odXAgUE9TSVggb3B0aW9uczogTm9uZQorbm9odXAgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK29kIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtQSBhZGRyZXNzX2Jhc2UgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtTiBjb3VudCAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtaiBza2lwICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdCB0eXBlX3N0cmluZyAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAteCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorb2QgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3BhdGNoIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtRCBkZWZpbmUgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtTiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtUiAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtYiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZCBkaXIgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtaSBwYXRjaGZpbGUgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbyBvdXRmaWxlICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcCBudW0gICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtciByZWplY3RmaWxlICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorcGF0Y2ggQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3ByaW50ZiBQT1NJWCBvcHRpb25zOiBOb25lCitwcmludGYgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3BzIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtQSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtRyBncm91cGxpc3QgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtVSB1c2VybGlzdCAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZyBncm91cGxpc3QgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbiBuYW1lbGlzdCAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbyBmb3JtYXQgICAgICAgfCAgeWVzICAgfCBubyAgICAgICAgfCBub3Qgc3VwcG9ydGVkOiBydXNlciwgZ3JvdXAsIHJncm91cCwgcGNwdQorICAtcCBwcm9jbGlzdCAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdCB0ZXJtbGlzdCAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdSB1c2VybGlzdCAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorcHMgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3B3ZCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUwgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLVAgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK3B3ZCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcmVuaWNlIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtZyAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAorICAtbiBpbmNyZW1lbnQgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfCBOb3RlIFBPU0lYIGFsbG93cyBvbmx5IHRvIHJ1biB3aXRoIHRoaXMgb3B0aW9uIChidXN5Ym94IGFsc28gYWxsb3dzIHRvIHJ1biB3aXRob3V0ICctbicgYW5kIHNldCBuaWNlbmVzcyBkaXJlY3RseSkKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3JlbmljZSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcm0gUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1SICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1mICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1yICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitybSBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworcm1kaXIgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1wICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitybWRpciBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6CisgIC0tcGFyZW50cworCitzZWQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1lIHNjcmlwdCAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1mIHNjcmlwdF9maWxlICB8ICB5ZXMgICB8ICAgICAgICAgICB8CisgIC1uICAgICAgICAgICAgICB8ICB5ZXMgICB8ICAgICAgICAgICB8CitzZWQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtaSwgLXIKKworc2ggUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1jICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1zICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CitzaCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworc2xlZXAgUE9TSVggb3B0aW9uczogTm9uZQorc2xlZXAgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3NvcnQgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1DICAgICAgICAgICAgICB8ICBubyAgICB8IG5vICAgICAgICB8CisgIC1iICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1jICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1kICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1mICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8IEJ1dCBpcyBub3QgbGlrZSBHTlUgc29ydCwgd2hpY2ggaXNuJ3QhICh0cnkgdG8gc29ydCAnYVxuQVxuQlxuYicgd2l0aCBhbmQgd2l0aG91dCAtZikKKyAgLWsga2V5ZGVmICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLW0gICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLW4gICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLW8gb3V0cHV0ICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXQgY2hhciAgICAgICAgIHwgIHllcyAgIHwgICAgICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3NvcnQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtbVNULCAtZywgLU0sIC1zLCAtegorCitzcGxpdCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWEgc3VmZml4X2xlbmd0aCB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1iIG4gICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1iIG5rICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1iIG5tICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1sIGxpbmVfY291bnQgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CitzcGxpdCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKworc3RyaW5ncyBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWEgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLW4gbnVtYmVyICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXQgZm9ybWF0ICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK3N0cmluZ3MgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtbywgLWYKKworc3R0eSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWEgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWcgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3N0dHkgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtRiBERVZJQ0UKKwordGFpbCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgbnVtYmVyICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLW4gbnVtYmVyICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3RhaWwgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtdiwgLXEsIC1zIFNFQworCit0ZWUgUE9TSVggb3B0aW9ucworIG9wdGlvbiAgICAgICAgICAgfCBleGlzdHMgfCBjb21wbGlhbnQgfCByZW1hcmtzCisgIC1hICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8CisgIC1pICAgICAgICAgICAgICB8ICB5ZXMgICB8IHllcyAgICAgICB8Cit0ZWUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3Rlc3QgUE9TSVggb3B0aW9uczogTm9uZQordGVzdCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKKwordGltZSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLXAgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK3RpbWUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtdgorCit0b3VjaCBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWEgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWQgZGF0ZV90aW1lICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLW0gICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXIgcmVmX2ZpbGUgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXQgdGltZSAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK3RvdWNoIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCit0ciBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUMgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWQgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3RyIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCit0cnVlIFBPU0lYIG9wdGlvbnM6IE5vbmUKK3RydWUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3R0eSBQT1NJWCBvcHRpb25zOiBOb25lCit0dHkgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtcworCit1bmFtZSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWEgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLW0gICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLW4gICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXIgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3VuYW1lIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLXAKKwordW5jb21wcmVzcyBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWYgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXYgICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKK3VuY29tcHJlc3MgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3VuZXhwYW5kIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtYSAgICAgICAgICAgICAgfCAgeWVzICAgfCBubyAgICAgICAgfCBQT1NJWCByZXF1aXJlcyBjb252ZXJ0aW5nIHR3byBvciBtb3JlIHNwYWNlcyB0byB0YWJzLCBidXN5Ym94IGNvbnZlcnRzIG9uZSBvciBtb3JlIHNwYWNlcworICAtdCB0YWJsaXN0ICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAordW5leHBhbmQgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtLXRhYnM9TiwgLWYsIC0tZmlyc3Qtb25seSwgLS1hbGwKKwordW5pcSBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWQgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWYgZmllbGRzICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgY2hhcnMgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXUgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3VuaXEgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtdyBOCisKK3V1ZGVjb2RlIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbyBvdXRmaWxlICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAordXVkZWNvZGUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3V1ZW5jb2RlIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtbSAgICAgICAgICAgICAgfCAgeWVzICAgfCB5ZXMgICAgICAgfAordXVlbmNvZGUgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiBOb25lCisKK3ZpIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtUiAgICAgICAgICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtYyBjb21tYW5kICAgICAgfCAgeWVzICAgfCAgICAgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdCB0YWdzdHJpbmcgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdyBzaXplICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAordmkgQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOgorICAtSAorCit3YyBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLWMgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLWwgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLW0gICAgICAgICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLXcgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3djIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLUwKKword2hvIFBPU0lYIG9wdGlvbnMKKyBvcHRpb24gICAgICAgICAgIHwgZXhpc3RzIHwgY29tcGxpYW50IHwgcmVtYXJrcworICAtSCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtVCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtYSAgICAgICAgICAgICAgfCAgeWVzICAgfCBubyAgICAgICAgfCBqdXN0IHNob3dzIGFsbAorICAtYiAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtZCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtbSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtciAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtcyAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdCAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAorICAtdSAgICAgICAgICAgICAgfCAgbm8gICAgfCBubyAgICAgICAgfAord2hvIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczogTm9uZQorCit4YXJncyBQT1NJWCBvcHRpb25zCisgb3B0aW9uICAgICAgICAgICB8IGV4aXN0cyB8IGNvbXBsaWFudCB8IHJlbWFya3MKKyAgLUUgZW9mc3RyICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLUkgcmVwbHN0ciAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLUwgbnVtYmVyICAgICAgIHwgIG5vICAgIHwgbm8gICAgICAgIHwKKyAgLW4gbnVtYmVyICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXAgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXMgc2l6ZSAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXQgICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKKyAgLXggICAgICAgICAgICAgIHwgIHllcyAgIHwgeWVzICAgICAgIHwKK3hhcmdzIEJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoKKyAgLWVbU1RSXSwgLTAsIC1yCisKK3pjYXQgUE9TSVggb3B0aW9uczogTm9uZQoremNhdCBCdXN5Ym94IHNwZWNpZmljIG9wdGlvbnM6IE5vbmUKZGlmZiAtLWdpdCBhL2RvY3Mvc2lnaW50Lmh0bSBiL2RvY3Mvc2lnaW50Lmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMwZjRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zaWdpbnQuaHRtCkBAIC0wLDAgKzEsNjI3IEBACis8SFRNTD4KKzxIRUFEPgorPGxpbmsgcmVsPSJTSE9SVENVVCBJQ09OIiBocmVmPSJodHRwOi8vd3d3LmNvbnMub3JnL2Zhdmljb24uaWNvIj4KKzxUSVRMRT5Qcm9wZXIgaGFuZGxpbmcgb2YgU0lHSU5UL1NJR1FVSVQgW2h0dHA6Ly93d3cuY29ucy5vcmcvY3JhY2F1ZXIvc2lnaW50Lmh0bWxdPC9USVRMRT4KKzwhLS0gQ3JlYXRlZCBieTogR05VIG00IHVzaW5nICRSZXZpc2lvbjogMS4yMCAkIG9mIGNyYXd3dy5tNGxpYiBvbiAxMS1GZWItMjAwNSAtLT4KKzxCT0RZIEJHQ09MT1I9IiNmZmY4ZTEiPgorPENFTlRFUj48SDI+UHJvcGVyIGhhbmRsaW5nIG9mIFNJR0lOVC9TSUdRVUlUPC9IMj48L0NFTlRFUj4KKzxpbWcgc3JjPWxpbmllLnBuZyB3aWR0aD0iMTAwJSIgYWx0PSIgIj4KKzxQPgorCis8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9ND4KKzx0cj48dGggdmFsaWduPXRvcCBhbGlnbj1sZWZ0PkFic3RyYWN0OiA8L3RoPgorPHRkIHZhbGlnbj10b3AgYWxpZ249bGVmdD4KK0luIFVOSVggdGVybWluYWwgc2Vzc2lvbnMsIHlvdSB1c3VhbGx5IGhhdmUgYSBrZXkgbGlrZQorPGNvZGU+Qy1jPC9jb2RlPiAoQ29udHJvbC1DKSB0byBpbW1lZGlhdGVseSBlbmQgd2hhdGV2ZXIgcHJvZ3JhbSB5b3UKK2hhdmUgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZC4gVGhpcyBzaG91bGQgd29yayBldmVuIHdoZW4gdGhlIHByb2dyYW0KK3lvdSBjYWxsZWQgaGFzIGNhbGxlZCBvdGhlciBwcm9ncmFtcyBpbiB0dXJuLiBFdmVyeXRoaW5nIHNob3VsZCBiZQorYWJvcnRlZCwgZ2l2aW5nIHlvdSB5b3VyIGNvbW1hbmQgcHJvbXB0IGJhY2ssIG5vIG1hdHRlciBob3cgZGVlcCB0aGUKK2NhbGwgc3RhY2sgaXMuCisKKzxwPkJhc2ljYWxseSwgaXQncyB0cml2aWFsLiBCdXQgdGhlIGV4aXN0ZW5jZSBvZiBpbnRlcmFjdGl2ZQorYXBwbGljYXRpb25zIHRoYXQgdXNlIFNJR0lOVCBhbmQvb3IgU0lHUVVJVCBmb3Igb3RoZXIgcHVycG9zZXMgdGhhbiBhCitjb21wbGV0ZSBpbW1lZGlhdGUgYWJvcnQgbWFrZSBtYXR0ZXJzIGNvbXBsaWNhdGVkLCBhbmQgLSBhcyB3YXMgdG8KK2V4cGVjdCAtIGxlZnQgdXMgd2l0aCBzZXZlcmFsIHdheXMgdG8gc29sdmUgdGhlIHByb2JsZW1zLiBPZiBjb3Vyc2UsCitleGlzdGluZyBzaGVsbHMgYW5kIGFwcGxpY2F0aW9ucyBmb2xsb3cgZGlmZmVyZW50IHdheXMuCisKKzxQPlRoaXMgV2ViIHBhZ2VzIG91dGxpbmVzIGRpZmZlcmVudCB3YXlzIHRvIHNvbHZlIHRoZSBwcm9ibGVtIGFuZAorYXJndWVzIHRoYXQgb25seSBvbmUgb2YgdGhlbSBjYW4gZG8gZXZlcnl0aGluZyByaWdodCwgYWx0aG91Z2ggaXQKK21lYW5zIHRoYXQgd2UgaGF2ZSB0byBmaXggc29tZSBleGlzdGluZyBzb2Z0d2FyZS4KKworCisKKzwvdGQ+PC90cj48dHI+PHRoIHZhbGlnbj10b3AgYWxpZ249bGVmdD5JbnRlbmRlZCBhdWRpZW5jZTogPC90aD4KKzx0ZCB2YWxpZ249dG9wIGFsaWduPWxlZnQ+UHJvZ3JhbW1lcnMgd2hvIGltcGxlbWVudCBwcm9ncmFtcyB0aGF0IGNhdGNoIFNJR0lOVC9TSUdRVUlULgorPEJSPlByb2dyYW1tZXJzIHdobyBpbXBsZW1lbnRzIHNoZWxscyBvciBzaGVsbC1saWtlIHByb2dyYW1zIHRoYXQKK2V4ZWN1dGUgYmF0Y2hlcyBvZiBwcm9ncmFtcy4KKworPHA+VXNlcnMgd2hvIGhhdmUgcHJvYmxlbXMgcHJvYmxlbXMgZ2V0dGluZyByaWQgb2YgcnVuYXdheSBzaGVsbAorc2NyaXB0cyB1c2luZyA8Y29kZT5Db250cm9sLUM8L2NvZGU+LiBPciBoYXZlIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucwordGhhdCBkb24ndCBiZWhhdmUgcmlnaHQgd2hlbiBzZW5kaW5nIFNJR0lOVC4gRXhhbXBsZXMgYXJlIGVtYWNzJ2VzCit0aGF0IGRpZSBvbiBDb250cm9sLWcgb3Igc2hlbGxzY3JpcHQgc3RhdGVtZW50cyB0aGF0IHNvbWV0aW1lcyBhcmUKK2V4ZWN1dGVkIGFuZCBzb21ldGltZXMgbm90LCBhcHBhcmVudGx5IG5vdCBkZXRlcm1pbmVkIGJ5IHRoZSB1c2VyJ3MKK2ludGVudGlvbi4KKworCis8L3RkPjwvdHI+PHRyPjx0aCB2YWxpZ249dG9wIGFsaWduPWxlZnQ+UmVxdWlyZWQga25vd2xlZGdlOiA8L3RoPgorPHRkIHZhbGlnbj10b3AgYWxpZ249bGVmdD5Zb3UgaGF2ZSB0byBrbm93IHdoYXQgaXQgbWVhbnMgdG8gY2F0Y2ggU0lHSU5UIG9yIFNJR1FVSVQgYW5kIGhvdworcHJvY2Vzc2VzIGFyZSB3YWl0aW5nIGZvciBvdGhlciBwcm9jZXNzZXMgKGNoaWxkcykgdGhleSBzcGF3bmVkLgorCisKKzwvdGQ+PC90cj48L3RhYmxlPgorPGltZyBzcmM9bGluaWUucG5nIHdpZHRoPSIxMDAlIiBhbHQ9IiAiPgorCisKKzxIMz5CYXNpYyBjb25jZXB0czwvSDM+CisKK1doYXQgdGVjaG5pY2FsbHkgaGFwcGVucyB3aGVuIHlvdSBwcmVzcyBDb250cm9sLUMgaXMgdGhhdCBhbGwgcHJvZ3JhbXMKK3J1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQgaW4geW91ciBjdXJyZW50IHRlcm1pbmFsIChvciB2aXJ0dWFsCit0ZXJtaW5hbCkgZ2V0IHRoZSBzaWduYWwgU0lHSU5UIHNlbnQuCisKKzxwPllvdSBtYXkgY2hhbmdlIHRoZSBrZXkgdGhhdCB0cmlnZ2VycyB0aGUgc2lnbmFsIHVzaW5nCis8Y29kZT5zdHR5PC9jb2RlPiBhbmQgcnVubmluZyBwcm9ncmFtcyBtYXkgcmVtYXAgdGhlIFNJR0lOVC1zZW5kaW5nCitrZXkgYXQgYW55IHRpbWUgdGhleSBsaWtlLCB3aXRob3V0IHlvdXIgaW50ZXJ2ZW50aW9uIGFuZCB3aXRob3V0Cithc2tpbmcgeW91IGZpcnN0LgorCis8cD5UaGUgdXN1YWwgcmVhY3Rpb24gb2YgYSBydW5uaW5nIHByb2dyYW0gdG8gU0lHSU5UIGlzIHRvIGV4aXQuCitIb3dldmVyLCBub3QgYWxsIHByb2dyYW0gZG8gYW4gZXhpdCBvbiBTSUdJTlQsIHByb2dyYW1zIGFyZSBmcmVlIHRvCit1c2UgdGhlIHNpZ25hbCBmb3Igb3RoZXIgYWN0aW9ucyBvciB0byBpZ25vcmUgaXQgYXQgYWxsLgorCis8cD5BbGwgcHJvZ3JhbXMgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZCByZWNlaXZlIHRoZSBzaWduYWwuIFRoaXMgbWF5CitiZSBhIG5lc3RlZCAic3RhY2siIG9mIHByb2dyYW1zOiBZb3Ugc3RhcnRlZCBhIHByb2dyYW0gdGhhdCBzdGFydGVkCithbm90aGVyIGFuZCB0aGUgb3V0ZXIgaXMgd2FpdGluZyBmb3IgdGhlIGlubmVyIHRvIGV4aXQuIFRoaXMgbmVzdGluZworbWF5IGJlIGFyYml0cmFyaWx5IGRlZXAuCisKKzxwPlRoZSBpbm5lcm1vc3QgcHJvZ3JhbSBpcyB0aGUgb25lIHRoYXQgZGVjaWRlcyB3aGF0IHRvIGRvIG9uIFNJR0lOVC4KK0l0IG1heSBleGl0LCBkbyBzb21ldGhpbmcgZWxzZSBvciBkbyBub3RoaW5nLiBTdGlsbCwgd2hlbiB0aGUgdXNlciBoaXQKK1NJR0lOVCwgYWxsIHRoZSBvdXRlciBwcm9ncmFtcyBhcmUgYXdha2VuLCBnZXQgdGhlIHNpZ25hbCBhbmQgbWF5CityZWFjdCBvbiBpdC4KKworPEgzPldoYXQgd2UgdHJ5IHRvIGFjaGlldmU8L0gzPgorCitUaGUgcHJvYmxlbSBpcyB3aXRoIHNoZWxsIHNjcmlwdHMgKG9yIHNpbWlsYXIgcHJvZ3JhbXMgdGhhdCBjYWxsCitzZXZlcmFsIHN1YnByb2dyYW1zIG9uZSBhZnRlciBhbm90aGVyKS4KKworPHA+TGV0IHVzIGNvbnNpZGVyIHRoZSBtb3N0IGJhc2ljIHNjcmlwdDoKKzxQUkU+CisjISAvYmluL3NoCitwcm9ncmFtMQorcHJvZ3JhbTIKKzwvUFJFPgorYW5kIHRoZSB1c3VhbCBydW4gbG9va3MgbGlrZSB0aGlzOgorPFBSRT4KKyQgc2ggbXlzY3JpcHQKK1tvdXRwdXQgb2YgcHJvZ3JhbTFdCitbb3V0cHV0IG9mIHByb2dyYW0yXQorJAorPC9QUkU+CisKKzxwPkxldCB1cyBhc3N1bWUgdGhhdCBib3RoIHByb2dyYW1zIGRvIG5vdGhpbmcgc3BlY2lhbCBvbiBTSUdJTlQsIHRoZXkKK2p1c3QgZXhpdC4KKworPHA+Tm93IGltYWdpbmUgdGhlIHVzZXIgaGl0cyBDLWMgd2hpbGUgYSBzaGVsbHNjcmlwdCBpcyBleGVjdXRpbmcgaXRzCitmaXJzdCBwcm9ncmFtLiBUaGUgZm9sbG93aW5nIHByb2dyYW1zIHJlY2VpdmUgU0lHSU5UOiBwcm9ncmFtMSBhbmQKK2Fsc28gdGhlIHNoZWxsIGV4ZWN1dGluZyB0aGUgc2NyaXB0LiBwcm9ncmFtMSBleGl0cy4KKworPHA+QnV0IHdoYXQgc2hvdWxkIHRoZSBzaGVsbCBkbz8gSWYgd2Ugc2F5IHRoYXQgaXQgaXMgb25seSB0aGUKK2lubmVybW9zdCdzIHByb2dyYW1zIGJ1c2luZXNzIHRvIHJlYWN0IG9uIFNJR0lOVCwgdGhlIHNoZWxsIHdpbGwgZG8KK25vdGhpbmcgc3BlY2lhbCAobm90IGV4aXQpIGFuZCBpdCB3aWxsIGNvbnRpbnVlIHRoZSBleGVjdXRpb24gb2YgdGhlCitzY3JpcHQgYW5kIHJ1biBwcm9ncmFtMi4gQnV0IHRoaXMgaXMgd3Jvbmc6IFRoZSB1c2VyJ3MgaW50ZW50aW9uIGluCitoaXR0aW5nIEMtYyBpcyB0byBhYm9ydCB0aGUgd2hvbGUgc2NyaXB0LCB0byBnZXQgaGlzIHByb21wdCBiYWNrLiBJZgoraGUgaGl0cyBDLWMgd2hpbGUgdGhlIGZpcnN0IHByb2dyYW0gaXMgcnVubmluZywgaGUgZG9lcyBub3Qgd2FudAorcHJvZ3JhbTIgdG8gYmUgZXZlbiBzdGFydGVkLgorCis8cD5oZXJlIGlzIHdoYXQgd291bGQgaGFwcGVuIGlmIHRoZSBzaGVsbCBkb2Vzbid0IGRvIGFueXRoaW5nOgorPFBSRT4KKyQgc2ggbXlzY3JpcHQKK1tmaXJzdCBoYWxmIG9mIHByb2dyYW0xJ3Mgb3V0cHV0XQorQy1jICAgW3VzZXJzIHByZXNzZXMgQy1jXQorW3NlY29uZCBoYWxmIG9mIHByb2dyYW0xJ3Mgb3V0cHV0IHdpbGwgbm90IGJlIGRpc3BsYXllZF0KK1tvdXRwdXQgb2YgcHJvZ3JhbTIgd2lsbCBhcHBlYXJdCis8L1BSRT4KKworCis8cD5Db25zaWRlciBhIG1vcmUgYW5ub3lpbmcgZXhhbXBsZToKKzxwcmU+CisjISAvYmluL3NoCisjIGxldCdzIGFzc3VtZSB0aGVyZSBhcmUgMzAwICouZGF0IGZpbGVzCitmb3IgZmlsZSBpbiAqLmRhdCA7IGRvCisJZGF0MmFzY2lpICRkYXQKK2RvbmUKKzwvcHJlPgorCitJZiB5b3VyIHNoZWxsIHdvdWxkbid0IGVuZCBpZiB0aGUgdXNlciBoaXRzIDxjb2RlPkMtYzwvY29kZT4sCis8Y29kZT5DLWM8L2NvZGU+IHdvdWxkIGp1c3QgZW5kIDxzdHJvbmc+b25lPC9zdHJvbmc+IGRhdDJhc2NpaSBydW4gYW5kCit0aGUgc2NyaXB0IHdvdWxkIGNvbnRpbnVlLiBUaHVzLCB5b3UgaGFkIHRvIGhpdCA8Y29kZT5DLWM8L2NvZGU+IHVwIHRvCiszMDAgdGltZXMgdG8gZW5kIHRoaXMgc2NyaXB0LgorCis8SDM+QWx0ZXJuYXRpdmVzIHRvIGRvIHNvPC9IMz4KKworPHA+VGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBoYW5kbGUgYWJvcnRpb24gb2Ygc2hlbGwgc2NyaXB0cyB3aGVuCitTSUdJTlQgaXMgcmVjZWl2ZWQgd2hpbGUgYSBmb3JlZ3JvdW5kIGNoaWxkIHJ1bnM6CisKKzxtZW51PgorCis8bGk+QXMganVzdCBvdXRsaW5lZCwgdGhlIHNoZWxsc2NyaXB0IG1heSBqdXN0IGNvbnRpbnVlLCBpZ25vcmluZyB0aGUKK2ZhY3QgdGhhdCB0aGUgdXNlciBoaXQgPGNvZGU+Qy1jPC9jb2RlPi4gVGhhdCB3YXksIHlvdXIgc2hlbGxzY3JpcHQgLQoraW5jbHVkaW5nIGFueSBsb29wcyAtIHdvdWxkIGNvbnRpbnVlIGFuZCB5b3UgaGFkIG5vIGNoYW5jZSBvZiBhYm9ydGluZworaXQgZXhjZXB0IHVzaW5nIHRoZSBraWxsIGNvbW1hbmQgYWZ0ZXIgZmluZGluZyBvdXQgdGhlIG91dGVybW9zdAorc2hlbGwncyBQSUQuIFRoaXMgInNvbHV0aW9uIiB3aWxsIG5vdCBiZSBkaXNjdXNzZWQgZnVydGhlciwgYXMgaXQgaXMKK29idmlvdXNseSBub3QgZGVzaXJhYmxlLgorCis8cD48bGk+VGhlIHNoZWxsIGl0c2VsZiBleGl0cyBpbW1lZGlhdGVseSB3aGVuIGl0IHJlY2VpdmVzIFNJR0lOVC4gTm90Citvbmx5IHRoZSBwcm9ncmFtIGNhbGxlZCB3aWxsIGV4aXQsIGJ1dCB0aGUgY2FsbGluZyAodGhlCitzY3JpcHQtZXhlY3V0aW5nKSBzaGVsbC4gVGhlIGZpcnN0IHZhcmlhbnQgaXMgdG8gZXhpdCB0aGUgc2hlbGwgKGFuZAordGhlcmVmb3JlIGRpc2NvbnRpbnVpbmcgZXhlY3V0aW9uIG9mIHRoZSBzY3JpcHQpIGltbWVkaWF0ZWx5LCB3aGlsZQordGhlIGJhY2tncm91bmQgcHJvZ3JhbSBtYXkgc3RpbGwgYmUgZXhlY3V0aW5nIChyZW1lbWJlciB0aGF0IGFsdGhvdWdoCit0aGUgc2hlbGwgaXMganVzdCB3YWl0aW5nIGZvciB0aGUgY2FsbGVkIHByb2dyYW0gdG8gZXhpdCwgaXQgaXMgd29rZW4KK3VwIGFuZCBtYXkgYWN0KS4gSSB3aWxsIGNhbGwgdGhlIHdheSBvZiBkb2luZyB0aGluZ3MgdGhlICJJVUUiIChmb3IKKyJpbW1lZGlhdGUgdW5jb25kaXRpb25hbCBleGl0IikgZm9yIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQuCisKKzxwPjxsaT5BcyBhIHZhcmlhbnQgb2YgdGhlIGZvcm1lciwgd2hlbiB0aGUgc2hlbGwgcmVjZWl2ZXMgU0lHSU5UCit3aGlsZSBpdCBpcyB3YWl0aW5nIGZvciBhIGNoaWxkIHRvIGV4aXQsIHRoZSBzaGVsbCBkb2VzIG5vdCBleGl0CitpbW1lZGlhdGVseS4gYnV0IGl0IHJlbWVtYmVycyB0aGUgZmFjdCB0aGF0IGEgU0lHSU5UIGhhcHBlbmVkLiBBZnRlcgordGhlIGNhbGxlZCBwcm9ncmFtIGV4aXRzIGFuZCB0aGUgc2hlbGwncyB3YWl0IGVuZHMsIHRoZSBzaGVsbCB3aWxsCitleGl0IGl0c2VsZiBhbmQgaGVuY2UgZGlzY29udGludWUgdGhlIHNjcmlwdC4gSSB3aWxsIGNhbGwgdGhlIHdheSBvZgorZG9pbmcgdGhpbmdzIHRoZSAiV1VFIiAoZm9yICJ3YWl0IGFuZCB1bmNvbmRpdGlvbmFsIGV4aXQiKSBmb3IgdGhlCityZXN0IG9mIHRoaXMgZG9jdW1lbnQuCisKKzxwPjxsaT5UaGVyZSBpcyBhbHNvIGEgd2F5IHRoYXQgdGhlIGNhbGxpbmcgc2hlbGwgY2FuIHRlbGwgd2hldGhlciB0aGUKK2NhbGxlZCBwcm9ncmFtIGV4aXRlZCBvbiBTSUdJTlQgYW5kIGlmIGl0IGlnbm9yZWQgU0lHSU5UIChvciB1c2VkIGl0Citmb3Igb3RoZXIgcHVycG9zZXMpLiBBcyBpbiB0aGUgPHNsPldVRTwvc2w+IHdheSwgdGhlIHNoZWxsIHdhaXRzIGZvcgordGhlIGNoaWxkIHRvIGNvbXBsZXRlLiBJdCBmaWd1cmVzIHdoZXRoZXIgdGhlIHByb2dyYW0gd2FzIGVuZGVkIG9uCitTSUdJTlQgYW5kIGlmIHNvLCBpdCBkaXNjb250aW51ZSB0aGUgc2NyaXB0LiBJZiB0aGUgcHJvZ3JhbSBkaWQgYW55CitvdGhlciBleGl0LCB0aGUgc2NyaXB0IHdpbGwgYmUgY29udGludWVkLiBJIHdpbGwgY2FsbCB0aGUgd2F5IG9mIGRvaW5nCit0aGluZ3MgdGhlICJXQ0UiIChmb3IgIndhaXQgYW5kIGNvb3BlcmF0aXZlIGV4aXQiKSBmb3IgdGhlIHJlc3Qgb2YKK3RoaXMgZG9jdW1lbnQuCisKKzwvbWVudT4KKworPEgzPlRoZSBwcm9ibGVtPC9IMz4KKworT24gZmlyc3Qgc2lnaHQsIGFsbCB0aHJlZSBzb2x1dGlvbnMgKElVRSwgV1VFIGFuZCBXQ0UpIGFsbCBzZWVtIHRvIGRvCit3aGF0IHdlIHdhbnQ6IElmIEMtYyBpcyBoaXQgd2hpbGUgdGhlIGZpcnN0IHByb2dyYW0gb2YgdGhlIHNoZWxsCitzY3JpcHQgcnVucywgdGhlIHNjcmlwdCBpcyBkaXNjb250aW51ZWQuIFRoZSB1c2VyIGdldHMgaGlzIHByb21wdCBiYWNrCitpbW1lZGlhdGVseS4gU28gd2hhdCBhcmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB3YXkgb2YgaGFuZGxpbmcKK1NJR0lOVD8KKworPHA+VGhlcmUgYXJlIHByb2dyYW1zIHRoYXQgdXNlIHRoZSBzaWduYWwgU0lHSU5UIGZvciBvdGhlciBwdXJwb3NlcwordGhhbiBleGl0aW5nLiBUaGV5IHVzZSBpdCBhcyBhIG5vcm1hbCBrZXlzdHJva2UuIFRoZSB1c2VyIGlzIGV4cGVjdGVkCit0byB1c2UgdGhlIGtleSB0aGF0IHNlbmRzIFNJR0lOVCBkdXJpbmcgYSBwZXJmZWN0bHkgbm9ybWFsIHByb2dyYW0KK3J1bi4gQXMgYSByZXN1bHQsIHRoZSB1c2VyIHNlbmRzIFNJR0lOVCBpbiBzaXR1YXRpb25zIHdoZXJlIGhlL3NoZQorZG9lcyBub3Qgd2FudCB0aGUgcHJvZ3JhbSBvciB0aGUgc2NyaXB0IHRvIGVuZC4KKworPHA+VGhlIHByaW1hcnkgZXhhbXBsZSBpcyB0aGUgZW1hY3MgZWRpdG9yOiBDLWcgZG9lcyB3aGF0IEVTQyBkb2VzIGluCitvdGhlciBhcHBsaWNhdGlvbnM6IEl0IGNhbmNlbHMgYSBwYXJ0aWFsbHkgZXhlY3V0ZWQgb3IgcHJlcGFyZWQKK29wZXJhdGlvbi4gVGVjaG5pY2FsbHksIGVtYWNzIHJlbWFwcyB0aGUga2V5IHRoYXQgc2VuZHMgU0lHSU5UIGZyb20KK0MtYyB0byBDLWcgYW5kIGNhdGNoZXMgU0lHSU5ULgorCis8cD5SZW1lbWJlciB0aGF0IHRoZSBTSUdJTlQgaXMgc2VudCB0byBhbGwgcHJvZ3JhbXMgcnVubmluZyBpbiB0aGUKK2ZvcmVncm91bmQuIElmIGVtYWNzIGlzIGV4ZWN1dGluZyBmcm9tIGEgc2hlbGwgc2NyaXB0LCBib3RoIGVtYWNzIGFuZAordGhlIHNoZWxsIGdldCBTSUdJTlQuIGVtYWNzIGlzIHRoZSBwcm9ncmFtIHRoYXQgZGVjaWRlcyB3aGF0IHRvIGRvOgorRXhpdCBvbiBTSUdJTlQgb3Igbm90LiBlbWFjcyBkZWNpZGVzIG5vdCB0byBleGl0LiBUaGUgcHJvYmxlbSBhcmlzZXMKK3doZW4gdGhlIHNoZWxsIGRyYXdzIGl0cyBvd24gY29uY2x1c2lvbnMgZnJvbSByZWNlaXZpbmcgU0lHSU5UIHdpdGhvdXQKK2NvbnN1bHRpbmcgZW1hY3MgZm9yIGl0cyBvcGluaW9uLgorCis8cD5Db25zaWRlciB0aGlzIHNjcmlwdDoKKzxQUkU+CisjISAvYmluL3NoCitlbWFjcyAvdG1wL2ZvbworY3AgL3RtcC9mb28gL2hvbWUvdXNlci9tYWlsL3NlbnQKKzwvUFJFPgorCis8cD5JZiBDLWcgaXMgdXNlZCBpbiBlbWFjcywgYm90aCB0aGUgc2hlbGwgYW5kIGVtYWNzIHdpbGwgcmVjZWl2ZWQKK1NJR0lOVC4gRW1hY3Mgd2lsbCBub3QgZXhpdCwgdGhlIHVzZXIgdXNlZCBDLWcgYXMgYSBub3JtYWwgZWRpdGluZwora2V5c3Ryb2tlLCBoZS9zaGUgZG9lcyBub3Qgd2FudCB0aGUgc2NyaXB0IHRvIGJlIGFib3J0ZWQgb24gQy1nLgorCis8cD5UaGUgY2VudHJhbCBwcm9ibGVtIGlzIHRoYXQgdGhlIHNlY29uZCBjb21tYW5kIChjcCkgbWF5Cit1bmludGVudGlvbmFsbHkgYmUga2lsbGVkIHdoZW4gdGhlIHNoZWxsIGRyYXdzIGl0cyBvd24gY29uY2x1c2lvbgorYWJvdXQgdGhlIHVzZXIncyBpbnRlbnRpb24uIFRoZSBpbm5lcm1vc3QgcHJvZ3JhbSBpcyB0aGUgb25seSBvbmUgdG8KK2p1ZGdlLgorCis8SDM+T25lIG1vcmUgZXhhbXBsZTwvSDM+CisKKzxwPkltYWdpbmUgYSBtYWlsIHNlc3Npb24gdXNpbmcgYSBjdXJzZXMgbWFpbGVyIGluIGEgdHR5LiBZb3UgY2FsbGVkCit5b3VyIG1haWxlciBhbmQgc3RhcnRlZCB0byBjb21wb3NlIGEgbWVzc2FnZS4gWW91ciBtYWlsZXIgY2FsbHMgZW1hY3MuCis8Y29kZT5DLWc8L2NvZGU+IGlzIGEgbm9ybWFsIGVkaXRpbmcga2V5IGluIGVtYWNzLiBUZWNobmljYWxseSBpdAorc2VuZHMgU0lHSU5UIChpdCB3YXMgPGNvZGU+Qy1jPC9jb2RlPiwgYnV0IGVtYWNzIHJlbWFwcGVkIHRoZSBrZXkpIHRvCis8bWVudT4KKzxsaT5lbWFjcworPGxpPnRoZSBzaGVsbCBiZXR3ZWVuIHlvdXIgbWFpbGVyIGFuZCBlbWFjcywgdGhlIG9uZSBmcm9tIHlvdXIgbWFpbGVycworICAgIHN5c3RlbSgiZW1hY3MgL3RtcC9ibGEuNDQiKSBjb21tYW5kCis8bGk+dGhlIG1haWxlciBpdHNlbGYKKzxsaT5wb3NzaWJseSBhbm90aGVyIHNoZWxsIGlmIHlvdXIgbWFpbGVyIHdhcyBjYWxsZWQgYnkgYSBzaGVsbCBzY3JpcHQKK29yIGZyb20gYW5vdGhlciBhcHBsaWNhdGlvbiB1c2luZyBzeXN0ZW0oMykKKzxsaT55b3VyIGludGVyYWN0aXZlIHNoZWxsICh3aGljaCBpZ25vcmVzIGl0IHNpbmNlIGl0IGlzIGludGVyYWN0aXZlCithbmQgaGVuY2UgaXMgbm90IHJlbGV2YW50IHRvIHRoaXMgZGlzY3Vzc2lvbikKKzwvbWVudT4KKworPHA+SWYgZXZlcnlvbmUganVzdCBleGl0cyBvbiBTSUdJTlQsIHlvdSB3aWxsIGJlIGxlZnQgd2l0aCBub3RoaW5nIGJ1dAoreW91ciBsb2dpbiBzaGVsbCwgd2l0aG91dCBhc2tpbmcuCisKKzxwPkJ1dCBmb3Igc3VyZSB5b3UgZG9uJ3Qgd2FudCB0byBiZSBkcm9wcGVkIG91dCBvZiB5b3VyIGVkaXRvciBhbmQKK291dCBvZiB5b3VyIG1haWxlciBiYWNrIHRvIHRoZSBjb21tYW5kbGluZSwgaGF2aW5nIHlvdXIgZWRpdGVkIGRhdGEKK2FuZCBtYWlsZXIgc3RhdHVzIGRlbGV0ZWQuCisKKzxwPlVuZGVyc3RhbmQgdGhlIGRpZmZlcmVuY2U6IFdoaWxlIDxjb2RlPkMtZzwvY29kZT4gaXMgdXNlZCBhbiBhIGtpbmQKK29mIGFib3J0IGtleSBpbiBlbWFjcywgaXQgaXNuJ3QgdGhlIG1ham9yICJhYm9ydCBldmVyeXRoaW5nIiBrZXkuIFdoZW4KK3lvdSB1c2UgPGNvZGU+Qy1nPC9jb2RlPiBpbiBlbWFjcywgeW91IHdhbnQgdG8gZW5kIHNvbWUgaW50ZXJuYWwgZW1hY3MKK2NvbW1hbmQuIFlvdSBkb24ndCB3YW50IHlvdXIgd2hvbGUgZW1hY3MgYW5kIG1haWxlciBzZXNzaW9uIHRvIGVuZC4KKworPHA+U28sIGlmIHRoZSBzaGVsbCBleGl0cyBpbW1lZGlhdGVseSBpZiB0aGUgdXNlciBzZW5kcyBTSUdJTlQgKHRoZQorc2Vjb25kIG9mIHRoZSBmb3VyIHdheXMgc2hvd24gYWJvdmUpLCB0aGUgcGFyZW50IG9mIGVtYWNzIHdvdWxkIGRpZSwKK2xlYXZpbmcgZW1hY3Mgd2l0aG91dCB0aGUgY29udHJvbGxpbmcgdHR5LiBUaGUgdXNlciB3aWxsIGxvc2UgaXQncworZWRpdGluZyBzZXNzaW9uIGltbWVkaWF0ZWx5IGFuZCB1bnJlY292ZXJhYmxlLiBJZiB0aGUgIm1haW4iIHNoZWxsIG9mCit0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZWZhdWx0cyB0byB0aGlzIGJlaGF2aW9yLCBldmVyeSBlZGl0b3Igc2Vzc2lvbgordGhhdCBpcyBzcGF3bmVkIGZyb20gYSBtYWlsZXIgb3Igc3VjaCB3aWxsIGJyZWFrIChiZWNhdXNlIGl0IGlzCit1c3VhbGx5IGV4ZWN1dGVkIGJ5IHN5c3RlbSgzKSwgd2hpY2ggY2FsbHMgL2Jpbi9zaCkuIFRoaXMgd2FzIHRoZSBjYXNlCitpbiBGcmVlQlNEIGJlZm9yZSBJIGFuZCBCcnVjZSBFdmFucyBjaGFuZ2VkIGl0IGluIDE5OTguCisKKzxwPklmIHRoZSBzaGVsbCByZWNvZ25pemVkIHRoYXQgU0lHSU5UIHdhcyBzZW50IGFuZCBleGl0cyBhZnRlciB0aGUKK2N1cnJlbnQgZm9yZWdyb3VuZCBwcm9jZXNzIGV4aXRlZCAodGhlIHRoaXJkIHdheSBvZiB0aGUgZm91ciksIHRoZQorZWRpdG9yIHNlc3Npb24gd2lsbCBub3QgYmUgZGlzdHVyYmVkLCBidXQgdGhpbmdzIHdpbGwgc3RpbGwgbm90IHdvcmsKK3JpZ2h0LgorCis8SDM+QSBmdXJ0aGVyIGxvb2sgYXQgdGhlIGFsdGVybmF0aXZlczwvSDM+CisKKzxwPlN0aWxsIGNvbnNpZGVyaW5nIHRoaXMgc2NyaXB0IHRvIGV4YW1pbmUgdGhlIHNoZWxsJ3MgYWN0aW9ucyBpbiB0aGUKK0lVRSwgV1VFIGFuZCBJQ0Ugd2F5IG9mIGhhbmRsaW5nIFNJR0lOVDoKKzxQUkU+CisjISAvYmluL3NoCitlbWFjcyAvdG1wL2ZvbworY3AgL3RtcC9mb28gL2hvbWUvdXNlci9tYWlsL3NlbnQKKzwvUFJFPgorCis8cD5UaGUgSVVFICgiaW1tZWRpYXRlIHVuY29uZGl0aW9uYWwgZXhpdCIpIHdheSBkb2VzIG5vdCB3b3JrIGF0IGFsbDoKK2VtYWNzIHdhbnRzIHRvIHN1cnZpdmUgdGhlIFNJR0lOVCAoaXQncyBhIG5vcm1hbCBlZGl0aW5nIGtleSBmb3IKK2VtYWNzKSwgYnV0IGl0cyBwYXJlbnQgc2hlbGwgdW5jb25kaXRpb25hbGx5IHRoaW5rcyAiV2UgcmVjZWl2ZWQKK1NJR0lOVC4gQWJvcnQgZXZlcnl0aGluZy4gTm93LiIuIFRoZSBzaGVsbCB3aWxsIGV4aXQgZXZlbiBiZWZvcmUgZW1hY3MKK2V4aXRzLiBCdXQgdGhpcyB3aWxsIGxlYXZlIGVtYWNzIGluIGFuIHVudXNhYmxlIHN0YXRlLCBzaW5jZSB0aGUgZGVhdGgKK29mIGl0cyBjYWxsaW5nIHNoZWxsIHdpbGwgbGVhdmUgaXQgd2l0aG91dCByZXF1aXJlZCByZXNvdXJjZXMgKGZpbGUKK2Rlc2NyaXB0b3JzKS4gVGhpcyB3YXkgZG9lcyBub3Qgd29yayBhdCBhbGwgZm9yIHNoZWxsc2NyaXB0cyB0aGF0IGNhbGwKK3Byb2dyYW1zIHRoYXQgdXNlIFNJR0lOVCBmb3Igb3RoZXIgcHVycG9zZXMgdGhhbiBpbW1lZGlhdGUgZXhpdC4gRXZlbgorZm9yIHByb2dyYW1zIHRoYXQgZXhpdCBvbiBTSUdJTlQsIGJ1dCB3YW50IHRvIGRvIHNvbWUgY2xlYW51cCBiZXR3ZWVuCit0aGUgc2lnbmFsIGFuZCB0aGUgZXhpdCwgbWF5IGZhaWwgYmVmb3JlIHRoZXkgY29tcGxldGUgdGhlaXIgY2xlYW51cC4KKworPHA+SXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyB3YXkgaGFzIG9uZSBhZHZhbnRhZ2U6IElmIGEgY2hpbGQKK2Jsb2NrcyBTSUdJTlQgYW5kIGRvZXMgbm90IGV4aXQgYXQgYWxsLCB0aGlzIHdheSB3aWxsIGdldCBjb250cm9sIGJhY2sKK3RvIHRoZSB1c2VyJ3MgdGVybWluYWwuIFNpbmNlIHN1Y2ggcHJvZ3JhbXMgc2hvdWxkIGJlIGJhbm5lZCBmcm9tIHlvdXIKK3N5c3RlbSBhbnl3YXksIEkgZG9uJ3QgdGhpbmsgdGhhdCB3ZWlnaHMgYWdhaW5zdCB0aGUgZGlzYWR2YW50YWdlcy4KKworPHA+V1VFICgid2FpdCBhbmQgdW5jb25kaXRpb25hbCBleGl0IikgaXMgYSBsaXR0bGUgbW9yZSBjbGV2ZXI6IElmIEMtZword2FzIHVzZWQgaW4gZW1hY3MsIHRoZSBzaGVsbCB3aWxsIGdldCBTSUdJTlQuIEl0IHdpbGwgbm90IGltbWVkaWF0ZWx5CitleGl0LCBidXQgcmVtZW1iZXIgdGhlIGZhY3QgdGhhdCBhIFNJR0lOVCBoYXBwZW5lZC4gV2hlbiBlbWFjcyBlbmRzCisobWF5YmUgYSBsb25nIHRpbWUgYWZ0ZXIgdGhlIFNJR0lOVCksIGl0IHdpbGwgc2F5ICJPaywgYSBTSUdJTlQKK2hhcHBlbmVkIHNvbWV0aW1lIHdoaWxlIHRoZSBjaGlsZCB3YXMgZXhlY3V0aW5nLCB0aGUgdXNlciB3YW50cyB0aGUKK3NjcmlwdCB0byBiZSBkaXNjb250aW51ZWQiLiBJdCB3aWxsIHRoZW4gZXhpdC4gVGhlIGNwIHdpbGwgbm90IGJlCitleGVjdXRlZC4gQnV0IHRoYXQncyBiYWQuIFRoZSAiY3AiIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgZW1hY3MKK3Nlc3Npb24gZW5kZWQgd2l0aG91dCB0aGUgQy1nIGtleSBldmVyIHVzZWQsIGJ1dCBpdCB3aWxsIG5vdCBiZQorZXhlY3V0ZWQgd2hlbiB0aGUgdXNlciB1c2VkIEMtZyBhdCBsZWFzdCBvbmUgdGltZS4gVGhhdCBpcyBjbGVhcmx5IG5vdAorZGVzaXJlZC4gU2luY2UgQy1nIGlzIGEgbm9ybWFsIGVkaXRpbmcga2V5IGluIGVtYWNzLCB0aGUgdXNlciBleHBlY3RzCit0aGUgcmVzdCBvZiB0aGUgc2NyaXB0IHRvIGJlaGF2ZSBpZGVudGljYWxseSBubyBtYXR0ZXIgd2hhdCBrZXlzIGhlCit1c2VkLgorCis8cD5BcyBhIHJlc3VsdCwgdGhlICJXVUUiIHdheSBpcyBiZXR0ZXIgdGhhbiB0aGUgIklVRSIgd2F5IGluIHRoYXQgaXQKK2RvZXMgbm90IGJyZWFrIFNJR0lOVC11c2luZyBwcm9ncmFtcyBjb21wbGV0ZWx5LiBUaGUgZW1hY3Mgc2Vzc2lvbgord2lsbCBlbmQgdW5kaXN0dXJiZWQuIEJ1dCBpdCBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IHNjcmlwdHMgd2hlcmUKK290aGVyIGFjdGlvbnMgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBhIHByb2dyYW0gdGhhdCB1c2UgU0lHSU5UIGZvcgorbm9uLWV4aXQgcHVycG9zZXMuIFNpbmNlIHRoZSBiZWhhdmlvciBpcyBiYXNpY2FsbHkgdW5kZXRlcm1pbmFibGUgZm9yCit0aGUgdXNlciwgdGhpcyBjYW4gbGVhZCB0byBuYXN0eSBzdXJwcmlzZXMuCisKKzxwPlRoZSAiV0NFIiB3YXkgZml4ZXMgdGhpcyBieSAiYXNraW5nIiB0aGUgY2FsbGVkIHByb2dyYW0gd2hldGhlciBpdAorZXhpdGVkIG9uIFNJR0lOVCBvciBub3QuIFdoaWxlIGVtYWNzIHJlY2VpdmVzIFNJR0lOVCwgaXQgZG9lcyBub3QgZXhpdAorb24gaXQgYW5kIGEgY2FsbGluZyBzaGVsbCB3YWl0aW5nIGZvciBpdHMgZXhpdCB3aWxsIG5vdCBiZSB0b2xkIHRoYXQKK2l0IGV4aXRlZCBvbiBTSUdJTlQuIChBbHRob3VnaCBpdCByZWNlaXZlcyBTSUdJTlQgYXQgc29tZSBwb2ludCBpbgordGltZSwgdGhlIHN5c3RlbSBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgZW1hY3Mgd2lsbCBleGl0IHdpdGgKKyJJLWV4aXRlZC1vbi1TSUdJTlQiIHN0YXR1cy4gVGhpcyBpcyB1bmRlciBlbWFjcycgY29udHJvbCwgc2VlIGJlbG93KS4KKworPHA+dGhpcyBzdGlsbCB3b3JrIGZvciB0aGUgbm9ybWFsIHNjcmlwdCB3aXRob3V0IFNJR0lOVC11c2luZworcHJvZ3JhbXM6PC9wPgorPFBSRT4KKyMhIC9iaW4vc2gKK3Byb2dyYW0xCitwcm9ncmFtMgorPC9QUkU+CisKK1VubGVzcyBwcm9ncmFtMSBhbmQgcHJvZ3JhbTIgbWVzcyBhcm91bmQgd2l0aCBzaWduYWwgaGFuZGxpbmcsIHRoZQorc3lzdGVtIHdpbGwgdGVsbCB0aGUgY2FsbGluZyBzaGVsbCB3aGV0aGVyIHRoZSBwcm9ncmFtcyBleGl0ZWQKK25vcm1hbGx5IG9yIGFzIGEgcmVzdWx0IG9mIFNJR0lOVC4KKworPHA+VGhlICJXQ0UiIHdheSB0aGVuIGhhcyBhbiBlYXN5IHdheSB0byB0aGluZ3MgcmlnaHQ6IFdoZW4gb25lIGNhbGxlZAorcHJvZ3JhbSBleGl0ZWQgd2l0aCAiSS1leGl0ZWQtb24tU0lHSU5UIiBzdGF0dXMsIGl0IHdpbGwgZGlzY29udGludWUKK3RoZSBzY3JpcHQgYWZ0ZXIgdGhpcyBwcm9ncmFtLiBJZiB0aGUgcHJvZ3JhbSBlbmRzIHdpdGhvdXQgdGhpcworc3RhdHVzLCB0aGUgbmV4dCBjb21tYW5kIGluIHRoZSBzY3JpcHQgaXMgc3RhcnRlZC4KKworPHA+SXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCBhIHNoZWxsIGluICJXQ0UiIG1vZHVzIGRvZXMgbm90CituZWVkIHRvIGxpc3RlbiB0byB0aGUgU0lHSU5UIHNpZ25hbCBhdCBhbGwuIEJvdGggaW4gdGhlCisiZW1hY3MtdGhlbi1jcCIgc2NyaXB0IGFuZCBpbiB0aGUgInNldmVyYWwtbm9ybWFsLXByb2dyYW1zIiBzY3JpcHQsIGl0Cit3aWxsIGJlIHdva2VuIHVwIGFuZCByZWNlaXZlIFNJR0lOVCB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlCitjb3JyZXNwb25kaW5nIGtleS4gQnV0IHRoZSBzaGVsbCBkb2VzIG5vdCBuZWVkIHRvIHJlYWN0IG9uIHRoaXMgZXZlbnQKK2FuZCBpdCBkb2Vzbid0IG5lZWQgdG8gcmVtZW1iZXIgdGhlIGV2ZW50IG9mIGFueSBTSUdJTlQsIGVpdGhlci4KK1RlbGxpbmcgd2hldGhlciB0aGUgdXNlciB3YW50cyB0byBlbmQgYSBzY3JpcHQgaXMgZG9uZSBieSBhc2tpbmcgdGhhdAorcHJvZ3JhbSB0aGF0IGhhcyB0byBkZWNpZGUsIHRoYXQgcHJvZ3JhbSB0aGF0IGludGVycHJldHMga2V5c3Ryb2tlcworZnJvbSB0aGUgdXNlciwgdGhlIGlubmVybW9zdCBwcm9ncmFtLgorCis8SDM+U28gZXZlcnl0aGluZyBpcyB3ZWxsIHdpdGggV0NFPzwvSDM+CisKK1dlbGwsIGFsbW9zdC4KKworPHA+VGhlIHByb2JsZW0gd2l0aCB0aGUgIldDRSIgbW9kdXMgaXMgdGhhdCB0aGVyZSBhcmUgYnJva2VuIHByb2dyYW1zCit0aGF0IGRvIG5vdCBwcm9wZXJseSBjb21tdW5pY2F0ZSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gdXAgdG8gdGhlCitjYWxsaW5nIHByb2dyYW0uCisKKzxwPlVubGVzcyBhIHByb2dyYW0gbWVzc2VzIHdpdGggc2lnbmFsIGhhbmRsaW5nLCB0aGUgc3lzdGVtIGRvZXMgdGhpcworYXV0b21hdGljYWxseS4KKworPHA+VGhlcmUgYXJlIHByb2dyYW1zIHRoYXQgd2FudCB0byBleGl0IG9uIFNJR0lOVCwgYnV0IHRoZXkgZG9uJ3QgbGV0Cit0aGUgc3lzdGVtIGRvIHRoZSBhdXRvbWF0aWMgZXhpdCwgYmVjYXVzZSB0aGV5IHdhbnQgdG8gZG8gc29tZQorY2xlYW51cC4gVG8gZG8gc28sIHRoZXkgY2F0Y2ggU0lHSU5ULCBkbyB0aGUgY2xlYW51cCBhbmQgdGhlbiBleGl0IGJ5Cit0aGVtc2VsdmVzLgorCis8cD5BbmQgaGVyZSBpcyB3aGVyZSB0aGUgcHJvYmxlbSBhcmlzZXM6IE9uY2UgdGhleSBjYXRjaCB0aGUgc2lnbmFsLAordGhlIHN5c3RlbSB3aWxsIG5vIGxvbmdlciBjb21tdW5pY2F0ZSB0aGUgIkktZXhpdGVkLW9uLVNJR0lOVCIgc3RhdHVzCit0byB0aGUgY2FsbGluZyBwcm9ncmFtIGF1dG9tYXRpY2FsbHkuIEV2ZW4gaWYgdGhlIHByb2dyYW0gZXhpdAoraW1tZWRpYXRlbHkgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIG9mIFNJR0lOVC4gT25jZSBpdCBjYXRjaGVzIHRoZQorc2lnbmFsLCBpdCBoYXMgdG8gdGFrZSBjYXJlIG9mIGNvbW11bmljYXRpbmcgdGhlIHNpZ25hbCBzdGF0dXMKK2l0c2VsZi4KKworPHA+U29tZSBwcm9ncmFtcyBkb24ndCBkbyB0aGlzLiBPbiBTSUdJTlQsIHRoZXkgZG8gY2xlYW51cCBhbmQgZXhpdAoraW1tZWRpYXRseSwgYnV0IHRoZSBjYWxsaW5nIHNoZWxsIGlzbid0IHRvbGQgYWJvdXQgdGhlIG5vbi1ub3JtYWwgZXhpdAorYW5kIGl0IHdpbGwgY2FsbCB0aGUgbmV4dCBwcm9ncmFtIGluIHRoZSBzY3JpcHQuCisKKzxwPkFzIGEgcmVzdWx0LCB0aGUgdXNlciBoaXRzIFNJR0lOVCBhbmQgd2hpbGUgb25lIHByb2dyYW0gZXhpdHMsIHRoZQorc2hlbGxzY3JpcHQgY29udGludWVzLiBUbyBoaW0vaGVyIGl0IGxvb2tzIGxpa2UgdGhlIHNoZWxsIGZhaWxzIHRvCitvYmV5IHRvIGhpcyBhYm9ydGlvbiBjb21tYW5kLgorCis8cD5Cb3RoIElVRSBvciBXVUUgc2hlbGwgd291bGQgbm90IGhhdmUgdGhpcyBwcm9ibGVtLCBzaW5jZSB0aGV5CitkaXNjb250aW51ZSB0aGUgc2NyaXB0IG9uIHRoZWlyIG93bi4gQnV0IGFzIEkgc2FpZCwgdGhleSBkb24ndCBzdXBwb3J0Citwcm9ncmFtcyB1c2luZyBTSUdJTlQgZm9yIG5vbi1leGl0aW5nIHB1cnBvc2VzLCBubyBtYXR0ZXIgd2hldGhlcgordGhlc2UgcHJvZ3JhbXMgcHJvcGVybHkgY29tbXVuaWNhdGUgdGhlaXIgc2lnbmFsIHN0YXR1cyB0byB0aGUgY2FsbGluZworc2hlbGwgb3Igbm90LgorCis8cD5TaW5jZSBzb21lIHNoZWxsIGluIHdpZGUgdXNlIGltcGxlbWVudCB0aGUgV1VFIHdheSAoYW5kIHNvbWUgZXZlbgorSVVFKSwgdGhlcmUgaXMgYSBjb25zaWRlcmFibGUgbnVtYmVyIG9mIGJyb2tlbiBwcm9ncmFtcyBvdXQgdGhlcmUgdGhhdAorYnJlYWsgV0NFIHNoZWxscy4gVGhlIHByb2dyYW1tZXJzIGp1c3QgZG9uJ3QgcmVjb2duaXplIGl0IGlmIHRoZWlyCitzaGVsbCBpc24ndCBXQ0UuCisKKzxIMz5Ib3cgdG8gYmUgYSBwcm9wZXIgcHJvZ3JhbTwvSDM+CisKKzxwPihTaG9ydCBub3RlIGluIGFkdmFuY2U6IFdoYXQgeW91IG5lZWQgdG8gYWNoaWV2ZSBpcyB0aGF0CitXSUZTSUdOQUxFRChzdGF0dXMpIGlzIHRydWUgaW4gdGhlIGNhbGxpbmcgcHJvZ3JhbSBhbmQgdGhhdAorV1RFUk1TSUcoc3RhdHVzKSByZXR1cm5zIFNJR0lOVC4pCisKKzxwPklmIHlvdSBkb24ndCBjYXRjaCBTSUdJTlQsIHRoZSBzeXN0ZW0gYXV0b21hdGljYWxseSBkb2VzIHRoZSByaWdodAordGhpbmcgZm9yIHlvdTogWW91ciBwcm9ncmFtIGV4aXRzIGFuZCB0aGUgY2FsbGluZyBwcm9ncmFtIGdldHMgdGhlCityaWdodCAiSS1leGl0ZWQtb24tU0lHSU5UIiBzdGF0dXMgYWZ0ZXIgd2FpdGluZyBmb3IgeW91ciBleGl0LgorCis8cD5CdXQgb25jZSB5b3UgY2F0Y2ggU0lHSU5ULCB5b3UgaGF2ZSB0byBhY3QuCisKKzxwPkRlY2lkZSB3aGV0aGVyIHRoZSBTSUdJTlQgaXMgdXNlZCBmb3IgZXhpdC9hYm9ydCBwdXJwb3NlcyBhbmQgaGVuY2UKK2Egc2hlbGxzY3JpcHQgY2FsbGluZyB0aGlzIHByb2dyYW0gc2hvdWxkIGRpc2NvbnRpbnVlLiBUaGlzIGlzCitob3BlZnVsbHkgb2J2aW91cy4gSWYgeW91IGp1c3QgbmVlZCB0byBkbyBzb21lIGNsZWFudXAgb24gU0lHSU5ULCBidXQKK3RoZW4gZXhpdCBpbW1lZGlhdGVseSwgdGhlIGFuc3dlciBpcyAieWVzIi4KKworPHA+SWYgc28sIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBhYm91dCBpdCBieSBleGl0aW5nCit3aXRoIHRoZSAiSS1leGl0ZWQtb24tU0lHSU5UIiBzdGF0dXMuCisKKzxwPlRoZXJlIGlzIG5vIG90aGVyIHdheSBvZiBkb2luZyB0aGlzIHRoYW4gdG8ga2lsbCB5b3Vyc2VsZiB3aXRoIGEKK1NJR0lOVCBzaWduYWwuIERvIGl0IGJ5IHJlc2V0dGluZyB0aGUgU0lHSU5UIGhhbmRsZXIgdG8gU0lHX0RGTCwgdGhlbgorc2VuZCB5b3Vyc2VsZiB0aGUgc2lnbmFsLgorCis8UFJFPgordm9pZCBzaWdpbnRfaGFuZGxlcihpbnQgc2lnKQoreworCTxkbyBzb21lIGNsZWFudXA+CisJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisJa2lsbChnZXRwaWQoKSwgU0lHSU5UKTsKK30KKzwvUFJFPgorCitOb3RlczoKKworPE1FTlU+CisKKzxMST5Zb3UgY2Fubm90ICJmYWtlIiB0aGUgcHJvcGVyIGV4aXQgc3RhdHVzIGJ5IGFuIGV4aXQoMykgd2l0aCBhCitzcGVjaWFsIG51bWVyaWMgdmFsdWUuIFBlb3BsZSBvZnRlbiBhc3N1bWUgdGhpcyBzaW5jZSB0aGUgbWFudWFscyBmb3IKK3NoZWxscyBvZnRlbiBsaXN0IHNvbWUgcmV0dXJuIHZhbHVlIGZvciBleGFjdGx5IHRoaXMuIEJ1dCB0aGlzIGlzIGp1c3QKK2EgY29udmVudGlvbiBmb3IgeW91ciBzaGVsbCBzY3JpcHQuIEl0IGRvZXMgbm90IHdvcmsgZnJvbSBvbmUgVU5JWCBBUEkKK3Byb2dyYW0gdG8gYW5vdGhlci4KKworPFA+QWxsIHRoYXQgaGFwcGVucyBpcyB0aGF0IHRoZSBzaGVsbCBzZXRzIHRoZSAiJD8iIHZhcmlhYmxlIHRvIGEKK3NwZWNpYWwgbnVtZXJpYyB2YWx1ZSBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHlvdXIgc2NyaXB0LCBiZWNhdXNlIHlvdXIKK3NjcmlwdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgbG93ZXItbGV2ZXIgVU5JWCBzdGF0dXMgZXZhbHVhdGlvbgorZnVuY3Rpb25zLiBUaGlzIGlzIGp1c3QgYW4gYWdyZWVtZW50IGJldHdlZW4geW91ciBzY3JpcHQgYW5kIHRoZQorZXhlY3V0aW5nIHNoZWxsLCBpdCBkb2VzIG5vdCBoYXZlIGFueSBtZWFuaW5nIGluIG90aGVyIGNvbnRleHRzLgorCis8UD48TEk+RG8gbm90IHVzZSBraWxsKDAsIFNJR0lOVCkgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBtYW51bCBmb3IKK3lvdXIgT1MgaW1wbGVtZW50YXRpb24uIEkuZS4gb24gQlNELCB0aGlzIHdvdWxkIG5vdCBzZW5kIHRoZSBzaWduYWwgdG8KK3RoZSBjdXJyZW50IHByb2Nlc3MsIGJ1dCB0byBhbGwgcHJvY2Vzc2VzIGluIHRoZSBncm91cC4KKworPFA+PExJPlBPU0lYIDEwMDMuMSBhbGxvd3MgYWxsIHRoZXNlIGNhbGxzIHRvIGFwcGVhciBpbiBzaWduYWwKK2hhbmRsZXJzLCBzbyBpdCBpcyBwb3J0YWJsZS4KKworPC9NRU5VPgorCis8cD5JbiBhIGJvdXJuZSBzaGVsbCBzY3JpcHQsIHlvdSBjYW4gY2F0Y2ggc2lnbmFscyB1c2luZyB0aGUKKzxjb2RlPnRyYXA8L2NvZGU+IGNvbW1hbmQuIEhlcmUsIHRoZSBzYW1lIGFzIGZvciBDIHByb2dyYW1zIGFwcGx5LiAgSWYKK3RoZSBpbnRlbnRpb24gb2YgU0lHSU5UIGlzIHRvIGVuZCB5b3VyIHByb2dyYW0sIHlvdSBoYXZlIHRvIGV4aXQgaW4gYQord2F5IHRoYXQgdGhlIGNhbGxpbmcgcHJvZ3JhbXMgInNlZXMiIHRoYXQgeW91IGhhdmUgYmVlbiBraWxsZWQuICBJZgoreW91IGRvbid0IGNhdGNoIFNJR0lOVCwgdGhpcyBoYXBwZW5kIGF1dG9tYXRpY2FsbHksIGJ1dCBvZiB5b3UgY2F0Y2gKK1NJR0lOVCwgaS5lLiB0byBkbyBjbGVhbnVwIHdvcmssIHlvdSBoYXZlIHRvIGVuZCB0aGUgcHJvZ3JhbSBieQora2lsbGluZyB5b3Vyc2VsZiwgbm90IGJ5IGNhbGxpbmcgZXhpdC4KKworPHA+Q29uc2lkZXIgdGhpcyBleGFtcGxlIGZyb20gRnJlZUJTRCdzIDxjb2RlPm1rZGVwPC9jb2RlPiwgd2hpY2ggaXMgYQorYm91cm5lIHNoZWxsIHNjcmlwdC4KKworPHByZT4KK1RNUD1fbWtkZXAkJAordHJhcCAncm0gLWYgJFRNUCA7IHRyYXAgMiA7IGtpbGwgLTIgJCQnIDEgMiAzIDEzIDE1Cis8L3ByZT4KKworWWVzLCB5b3UgaGF2ZSB0byBkbyBpdCB0aGUgaGFyZCB3YXkuIEl0J3MgZXZlbiBtb3JlIGFubm95aW5nIGluIHNoZWxsCitzY3JpcHRzIHRoYW4gaW4gQyBwcm9ncmFtcyBzaW5jZSB5b3UgY2FuJ3QgInByZS1kZWxldGUiIHRlbXBvcmFyeQorZmlsZXMgKHdoaWNoIGlzbid0IHJlYWxseSBwb3J0YWJsZSBpbiBDLCB0aG91Z2gpLgorCis8UD5BbGwgdGhpcyBhcHBsaWVzIHRvIHByb2dyYW1zIGluIGFsbCBsYW5ndWFnZXMsIG5vdCBvbmx5IEMgYW5kCitib3VybmUgc2hlbGwuIEV2ZXJ5IGxhbmd1YWdlIGltcGxlbWVudGF0aW9uIHRoYXQgbGV0cyB5b3UgY2F0Y2ggU0lHSU5UCitzaG91bGQgYWxzbyBnaXZlIHlvdSB0aGUgb3B0aW9uIHRvIHJlc2V0IHRoZSBzaWduYWwgYW5kIGtpbGwgeW91cnNlbGYuCisKKzxQPkl0IGlzIGFsd2F5cyBkZXNpcmVhYmxlIHRvIGV4aXQgdGhlIHJpZ2h0IHdheSwgZXZlbiBpZiB5b3UgZG9uJ3QKK2V4cGVjdCB5b3VyIHVzdWFsIGNhbGxlcnMgdG8gZGVwZW5kIG9uIGl0LCBzb21lIHVudXN1YWwgb25lIHdpbGwgY29tZQorYWxvbmcuIFRoaXMgcHJvcGVyIGV4aXQgc3RhdHVzIHdpbGwgYmUgbmVlZGVkIGZvciBXQ0UgYW5kIHdpbGwgbm90CitodXJ0IHdoZW4gdGhlIGNhbGxpbmcgc2hlbGwgdXNlcyBJVUUgb3IgV1VFLgorCis8SDM+SG93IHRvIGJlIGEgcHJvcGVyIHNoZWxsPC9IMz4KKworQWxsIHRoaXMgYXBwbGllcyBvbmx5IGZvciB0aGUgc2NyaXB0LWV4ZWN1dGluZyBjYXNlLiBNb3N0IHNoZWxscyB3aWxsCithbHNvIGhhdmUgaW50ZXJhY3RpdmUgbW9kZXMgd2hlcmUgdGhpbmdzIGFyZSBkaWZmZXJlbnQuCisKKzxNRU5VPgorCis8TEk+RG8gbm90aGluZyBzcGVjaWFsIHdoZW4gU0lHSU5UIGFwcGVhcnMgd2hpbGUgeW91IHdhaXQgZm9yIGEgY2hpbGQuCitZb3UgZG9uJ3QgZXZlbiBoYXZlIHRvIHJlbWVtYmVyIHRoYXQgb25lIGhhcHBlbmVkLgorCis8UD48TEk+V2FpdCBmb3IgY2hpbGQgdG8gZXhpdCwgZ2V0IHRoZSBleGl0IHN0YXR1cy4gRG8gbm90IHRydW5jYXRlIGl0Cit0byB0eXBlIGNoYXIuCisKKzxQPjxMST5Mb29rIGF0IFdJRlNJR05BTEVEKHN0YXR1cykgYW5kIFdURVJNU0lHKHN0YXR1cykgdG8gdGVsbAord2hldGhlciB0aGUgY2hpbGQgc2F5cyAiSSBleGl0ZWQgb24gU0lHSU5UOiBpbiBteSBvcGluaW9uIHRoZSB1c2VyCit3YW50cyB0aGUgc2hlbGxzY3JpcHQgdG8gYmUgZGlzY29udGludWVkIi4KKworPFA+PExJPklmIHRoZSBsYXR0ZXIgYXBwbGllcywgZGlzY29udGludWUgdGhlIHNjcmlwdC4KKworPFA+PExJPkV4aXQuIEJ1dCBzaW5jZSBhIHNoZWxsc2NyaXB0IG1heSBpbiB0dXJuIGJlIGNhbGxlZCBieSBhCitzaGVsbHNjcmlwdCwgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IHByb3Blcmx5IGNvbW11bmljYXRlIHRoZQorZGlzY29udGludWUgaW50ZW50aW9uIHRvIHRoZSBjYWxsaW5nIHByb2dyYW0uIEFzIGluIGFueSBvdGhlciBwcm9ncmFtCisoc2VlIGFib3ZlKSwgZG8KKworPFBSRT4KKwlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKwlraWxsKGdldHBpZCgpLCBTSUdJTlQpOworPC9QUkU+CisKKzwvTUVOVT4KKworPEgzPk90aGVyIHJlbWFya3M8L0gzPgorCitBbHRob3VnaCB0aGlzIHdlYiBwYWdlIHRhbGtzIGFib3V0IFNJR0lOVCBvbmx5LCBhbG1vc3QgdGhlIHNhbWUgaXNzdWVzCithcHBseSB0byBTSUdRVUlULCBpbmNsdWRpbmcgcHJvcGVyIGV4aXRpbmcgYnkga2lsbGluZyB5b3Vyc2VsZiBhZnRlcgorY2F0Y2hpbmcgdGhlIHNpZ25hbCBhbmQgcHJvcGVyIHJlYWN0aW9uIG9uIHRoZSBXSUZTSUdOQUxFRChzdGF0dXMpCit2YWx1ZS4gT25lIG5vdGFibGUgZGlmZmVyZW5jZSBmb3IgU0lHUVVJVCBpcyB0aGF0IHlvdSBoYXZlIHRvIG1ha2UKK3N1cmUgdGhhdCBub3QgdGhlIHdob2xlIGNhbGwgdHJlZSBkdW1wcyBjb3JlLgorCis8SDM+V2hhdCB0byBmaWdodDwvSDM+CisKK01ha2Ugc3VyZSBhbGwgcHJvZ3JhbXMgPGVtPnJlYWxseTwvZW0+IGtpbGwgdGhlbXNlbHZlcyBpZiB0aGV5IHJlYWN0Cit0byBTSUdJTlQgb3IgU0lHUVVJVCBhbmQgaW50ZW5kIHRvIGFib3J0IHRoZWlyIG9wZXJhdGlvbiBhcyBhIHJlc3VsdAorb2YgdGhpcyBzaWduYWwuIFByb2dyYW1zIHRoYXQgZG9uJ3QgdXNlIFNJR0lOVC9TSUdRVUlUIGFzIGEKK3Rlcm1pbmF0aW9uIHRyaWdnZXIgLSBidXQgYXMgcGFydCBvZiBub3JtYWwgb3BlcmF0aW9uIC0gZG9uJ3Qga2lsbAordGhlbXNlbHZlcywgYnV0IGRvIGEgbm9ybWFsIGV4aXQgaW5zdGVhZC4KKworPHA+TWFrZSBzdXJlIHBlb3BsZSB1bmRlcnN0YW5kIHdoeSB5b3UgY2FuJ3QgZmFrZSBhbiBleGl0LW9uLXNpZ25hbCBieQorZG9pbmcgZXhpdCguLi4pIHVzaW5nIGFueSBudW1lcmljYWwgc3RhdHVzLgorCis8cD5NYWtlIHN1cmUgeW91IHVzZSBhIHNoZWxsIHRoYXQgYmVoYXZlcyByaWdodC4gRXNwZWNpYWxseSBpZiB5b3UKK2RldmVsb3AgcHJvZ3JhbXMsIHNpbmNlIGl0IHdpbGwgaGVscCBzZWVpbmcgcHJvYmxlbXMuCisKKzxIMz5Db25jcmV0ZSBleGFtcGxlcyBob3cgdG8gZml4IHByb2dyYW1zOjwvSDM+Cis8dWw+CisKKzxsaT5UaGUgZml4IGZvciBGcmVlQlNEJ3MKKzxBIEhSRUY9Imh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL2N2c3dlYi5jZ2kvc3JjL3Vzci5iaW4vdGltZS90aW1lLmMuZGlmZj9yMT0xLjEwJnIyPTEuMTEiPnRpbWUoMSk8L0E+LiBUaGlzIGZpeCBpcyB0aGUgYmVzdCBleGFtcGxlLCBpdCdzIHF1aXRlIHNob3J0IGFuZCBjbGVhciBhbmQKK2l0IGZpeGVzIGEgY2FzZSB3aGVyZSBzb21lb25lIHRyaWVkIHRvIGZha2Ugc2lnbmFsIGV4aXQgc3RhdHVzIGJ5IGEKK251bWVyaWNhbCB2YWx1ZS4gQW5kIHRoZSBjb21wbGV0ZSBwcm9ncmFtIGlzIHNtYWxsLgorCis8cD48bGk+Rml4IGZvciBGcmVlQlNEJ3MKKzxBIEhSRUY9Imh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL2N2c3dlYi5jZ2kvc3JjL3Vzci5iaW4vdHJ1c3MvbWFpbi5jLmRpZmY/cjE9MS45JnIyPTEuMTAiPnRydXNzKDEpPC9BPi4KKworPHA+PGxpPlRoZSBmaXggZm9yIEZyZWVCU0QncworPEEgSFJFRj0iaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvY3Zzd2ViLmNnaS9zcmMvdXNyLmJpbi9ta2RlcC9ta2RlcC5nY2Muc2guZGlmZj9yMT0xLjguMi4xJnIyPTEuOC4yLjIiPm1rZGVwKDEpPC9BPiwgYSBzaGVsbCBzY3JpcHQuCisKKworPHA+PGxpPkZpeCBmb3IgRnJlZUJTRCdzIG1ha2UoMSksIDxBIEhSRUY9Imh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL2N2c3dlYi5jZ2kvc3JjL3Vzci5iaW4vbWFrZS9qb2IuYy5kaWZmP3IxPTEuOSZyMj0xLjEwIj5wYXJ0IDE8L0E+LAorPEEgSFJFRj0iaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvY3Zzd2ViLmNnaS9zcmMvdXNyLmJpbi9tYWtlL2NvbXBhdC5jLmRpZmY/cjE9MS4xMCZyMj0xLjExIj5wYXJ0IDI8L0E+LgorCis8L3VsPgorCis8SDM+VGVzdHN1aXRlIGZvciBzaGVsbHM8L0gzPgorCitJIGhhdmUgYSBjb2xsZWN0aW9uIG9mIHNoZWxsc2NyaXB0cyB0aGF0IHRlc3Qgc2hlbGxzIGZvciB0aGUKK2JlaGF2aW9yLiBTZWUgbXkgPEEgSFJFRj0iZG93bmxvYWQvIj5kb3dubG9hZCBkaXI8L0E+IHRvIGdldCB0aGUgbmV3ZXN0Cisic2gtaW50ZXJydXB0IiBmaWxlcywgZWl0aGVyIGFzIGEgdGFyZmlsZSBvciBhcyBpbmRpdmlkdWFsIGZpbGUgZm9yCitvbmxpbmUgYnJvd3NpbmcuIFRoaXMgaXNuJ3QgcmVhbGx5IGRvY3VtZW50ZWQsIGJlc2lkZXMgZnJvbSB0aGUKK2NvbW1lbnRzIHRoZSBzY3JpcHRzIGVjaG8uCisKKzxIMz5BcHBlbmRpeCAxIC0gdGFibGUgb2YgaW1wbGVtZW50YXRpb24gY2hvaWNlczwvSDM+CisKKzx0YWJsZSBib3JkZXIgY2VsbHBhZGRpbmc9Mj4KKworPHRyIHZhbGlnbj10b3A+Cis8dGg+TWV0aG9kIHNpZ248L3RoPgorPHRoPkRvZXMgd2hhdD88L3RoPgorPHRoPkV4YW1wbGUgc2hlbGxzIHRoYXQgaW1wbGVtZW50IGl0OjwvdGg+Cis8dGg+V2hhdCBoYXBwZW5zIHdoZW4gYSBzaGVsbHNjcmlwdCBjYWxsZWQgZW1hY3MsIHRoZSB1c2VyIHVzZWQKKzxjb2RlPkMtZzwvY29kZT4gYW5kIHRoZSBzY3JpcHQgaGFzIGFkZGl0aW9uYWwgY29tbWFuZHMgaW4gaXQ/PC90aD4KKzx0aD5XaGF0IGhhcHBlbnMgd2hlbiBhIHNoZWxsc2NyaXB0IGNhbGxlZCBlbWFjcywgdGhlIHVzZXIgZGlkIG5vdCB1c2UKKzxjb2RlPkMtYzwvY29kZT4gYW5kIHRoZSBzY3JpcHQgaGFzIGFkZGl0aW9uYWwgY29tbWFuZHMgaW4gaXQ/PC90aD4KKzx0aD5XaGF0IGhhcHBlbnMgaWYgYSBub24taW50ZXJhY3RpdmUgY2hpbGQgY2F0Y2hlcyBTSUdJTlQ/PC90aD4KKzx0aD5UbyBiZWhhdmUgcHJvcGVybHksIGNoaWxkcyBtdXN0IGRvIHdoYXQ/PC90aD4KKzwvdHI+CisKKzx0ciB2YWxpZ249dG9wIGFsaWduPWxlZnQ+Cis8dGQ+SVVFPC90ZD4KKzx0ZD5UaGUgc2hlbGwgZXhlY3V0aW5nIGEgc2NyaXB0IGV4aXRzIGltbWVkaWF0ZWx5IGlmIGl0IHJlY2VpdmVzCitTSUdJTlQuPC90ZD4KKzx0ZD40LjRCU0QgYXNoIChhc2gpLCBOZXRCU0QsIEZyZWVCU0QgcHJpb3IgdG8gMy4wLzIyLjg8L3RkPgorPHRkPlRoZSBlZGl0b3Igc2Vzc2lvbiBpcyBsb3N0IGFuZCBzdWJzZXF1ZW50IGNvbW1hbmRzIGFyZSBub3QKK2V4ZWN1dGVkLjwvdGQ+Cis8dGQ+VGhlIGVkaXRvciBjb250aW51ZXMgYXMgbm9ybWFsIGFuZCB0aGUgc3Vic2VxdWVudCBjb21tYW5kcyBhcmUKK2V4ZWN1dGVkLiA8L3RkPgorPHRkPlRoZSBzY3JpcHRzIGVuZHMgaW1tZWRpYXRlbHksIHJldHVybmluZyB0byB0aGUgY2FsbGVyIGV2ZW4gYmVmb3JlCit0aGUgY3VycmVudCBmb3JlZ3JvdW5kIGNoaWxkIG9mIHRoZSBzaGVsbCBleGl0cy4gPC90ZD4KKzx0ZD5JdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBjaGlsZCBkb2VzIG9yIGhvdyBpdCBleGl0cywgZXZlbiBpZiB0aGUKK2NoaWxkIGNvbnRpbnVlcyB0byBvcGVyYXRlLCB0aGUgc2hlbGwgcmV0dXJucy4gPC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249dG9wIGFsaWduPWxlZnQ+Cis8dGQ+V1VFPC90ZD4KKzx0ZD5JZiB0aGUgc2hlbGwgZXhlY3V0aW5nIGEgc2NyaXB0IHJlY2VpdmVkIFNJR0lOVCB3aGlsZSBhIGZvcmVncm91bmQKK3Byb2Nlc3Mgd2FzIHJ1bm5pbmcsIGl0IHdpbGwgZXhpdCBhZnRlciB0aGF0IGNoaWxkJ3MgZXhpdC48L3RkPgorPHRkPnBka3NoIChPcGVuQlNEIC9iaW4vc2gpPC90ZD4KKzx0ZD5UaGUgZWRpdG9yIGNvbnRpbnVlcyBhcyBub3JtYWwsIGJ1dCBzdWJzZXF1ZW50IGNvbW1hbmRzIGZyb20gdGhlCitzY3JpcHQgYXJlIG5vdCBleGVjdXRlZC48L3RkPgorPHRkPlRoZSBlZGl0b3IgY29udGludWVzIGFzIG5vcm1hbCBhbmQgc3Vic2VxdWVudCBjb21tYW5kcyBhcmUKK2V4ZWN1dGVkLiA8L3RkPgorPHRkPlRoZSBzY3JpcHRzIHJldHVybnMgdG8gaXRzIGNhbGxlciBhZnRlciB0aGUgY3VycmVudCBmb3JlZ3JvdW5kCitjaGlsZCBleGl0cywgbm8gbWF0dGVyIGhvdyB0aGUgY2hpbGQgZXhpdGVkLiA8L3RkPgorPHRkPkl0IGRvZXNuJ3QgbWF0dGVyIGhvdyB0aGUgY2hpbGQgZXhpdHMgKHNpZ25hbCBzdGF0dXMgb3Igbm90KSwgYnV0CitpZiBpdCBkb2Vzbid0IHJldHVybiBhdCBhbGwsIHRoZSBzaGVsbCB3aWxsIG5vdCByZXR1cm4uIEluIG5vIGNhc2UKK3dpbGwgZnVydGhlciBjb21tYW5kcyBmcm9tIHRoZSBzY3JpcHQgYmUgZXhlY3V0ZWQuIDwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPXRvcCBhbGlnbj1sZWZ0PgorPHRkPldDRTwvdGQ+Cis8dGQ+VGhlIHNoZWxsIGV4aXRzIGlmIGEgY2hpbGQgc2lnbmFsZWQgdGhhdCBpdCB3YXMga2lsbGVkIG9uIGEKK3NpZ25hbCAoZWl0aGVyIGl0IGhhZCB0aGUgZGVmYXVsdCBoYW5kbGVyIGZvciBTSUdJTlQgb3IgaXQga2lsbGVkCitpdHNlbGYpLiAgPC90ZD4KKzx0ZD5iYXNoIChMaW51eCAvYmluL3NoKSwgbW9zdCBjb21tZXJjaWFsIC9iaW4vc2gsIEZyZWVCU0QgL2Jpbi9zaAorZnJvbSAzLjAvMi4yLjguPC90ZD4KKzx0ZD5UaGUgZWRpdG9yIGNvbnRpbnVlcyBhcyBub3JtYWwgYW5kIHN1YnNlcXVlbnQgY29tbWFuZHMgYXJlCitleGVjdXRlZC4gPC90ZD4KKzx0ZD5UaGUgZWRpdG9yIGNvbnRpbnVlcyBhcyBub3JtYWwgYW5kIHN1YnNlcXVlbnQgY29tbWFuZHMgYXJlCitleGVjdXRlZC4gPC90ZD4KKzx0ZD5UaGUgc2NyaXB0cyByZXR1cm5zIHRvIGl0cyBjYWxsZXIgYWZ0ZXIgdGhlIGN1cnJlbnQgZm9yZWdyb3VuZAorY2hpbGQgZXhpdHMsIGJ1dCBvbmx5IGlmIHRoZSBjaGlsZCBleGl0ZWQgd2l0aCBzaWduYWwgc3RhdHVzLiBJZgordGhlIGNoaWxkIGRpZCBhIG5vcm1hbCBleGl0IChldmVuIGlmIGl0IHJlY2VpdmVkIFNJR0lOVCwgYnV0IGNhdGNoZXMKK2l0KSwgdGhlIHNjcmlwdCB3aWxsIGNvbnRpbnVlLiA8L3RkPgorPHRkPlRoZSBjaGlsZCBtdXN0IGJlIGltcGxlbWVudGVkIHJpZ2h0LCBvciB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlCit0byBicmVhayBzaGVsbCBzY3JpcHRzIHJlbGlhYmx5LjwvdGQ+Cis8L3RyPgorCis8L3RhYmxlPgorCis8UD48aW1nIHNyYz1saW5pZS5wbmcgd2lkdGg9IjEwMCUiIGFsdD0iICI+Cis8QlI+JmNvcHk7MjAwNSBNYXJ0aW4gQ3JhY2F1ZXIgJmx0O2NyYWNhdWVyIEAgY29ucy5vcmcmZ3Q7Cis8QSBIUkVGPSJodHRwOi8vd3d3LmNvbnMub3JnL2NyYWNhdWVyLyI+aHR0cDovL3d3dy5jb25zLm9yZy9jcmFjYXVlci88L0E+Cis8QlI+TGFzdCBjaGFuZ2VkOiAkRGF0ZTogMjAwNS8wMi8xMSAyMTo0NDo0MyAkCis8L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9zbWFsbGludC50eHQgYi9kb2NzL3NtYWxsaW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdkZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zbWFsbGludC50eHQKQEAgLTAsMCArMSwzOSBAQAorICAgICAgICBzbWFsbHVpbnQgaSA9IGluZGV4X2luX3N0cl9hcnJheShwYXJhbXMsIG5hbWUpICsgMTsKKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCEoaSA9PSA0IHx8IGkgPT0gNSkpCisgICAgICAgICAgICAgICAgaSB8PSAweDgwOworCisgICAgICAgIHJldHVybiBpOworCitJIHRoaW5rIHRoYXQgdGhpcyBvcHRpbWl6YXRpb24gaXMgd3JvbmcuCitpbmRleF9pbl9zdHJfYXJyYXkgcmV0dXJucyBpbnQuIEF0IGJlc3QsIGNvbXBpbGVyIHdpbGwgdXNlIGl0IGFzLWlzLgorQXQgd29yc3QsIGNvbXBpbGVyIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHByb3Blcmx5IGNhc3QKK2ludG8gYSBieXRlLCB3aGljaCBwcm9iYWJseSByZXN1bHRzIGluICJuID0gbiAmIDB4ZmYiIG9uIG1hbnkgYXJjaGl0ZWN0dXJlcy4KKworWW91IHNhdmUgbm90aGluZyBvbiBzcGFjZSBoZXJlIGJlY2F1c2UgaSBpcyBub3Qgc3RvcmVkIG9uLXN0YWNrLAorZ2NjIHdpbGwga2VlcCBpdCBpbiByZWdpc3Rlci4gQW5kIGV2ZW4gaWYgaXQgKmlzKiBzdG9yZWQsCitpdCBpcyAqc3RhY2sqIHN0b3JhZ2UsIHdoaWNoIGlzIGNoZWFwICh1bmxpa2UgZGF0YS9ic3MpLgorCitzbWFsbFt1XWludHMgYXJlIHVzZWZ1bCBfbW9zdGx5XyBmb3I6CisKKyhhKSBmbGFnIHZhcmlhYmxlcworICAgIChhMSkgZ2xvYmFsIGZsYWcgdmFyaWFibGVzIC0gbWFrZSBkYXRhL2JzcyBzbWFsbGVyCisgICAgKGEyKSBsb2NhbCBmbGFnIHZhcmlhYmxlcyAtICJhID0gNSIsICJhIHw9IDB4NDAiIGFyZSBzbWFsbGVyCisgICAgICAgICBmb3IgYnl0ZXMgdGhhbiBmb3IgZnVsbCBpbnRlZ2Vycy4KKyAgICAgICAgICAgIEV4YW1wbGU6CisgICAgICAgICAgICBvbiBpMzg2LCB0aGVyZSBpcyBubyB3aWRlbmluZyBjb25zdGFudCBzdG9yZSBpbnN0cnVjdGlvbgorICAgICAgICAgICAgZm9yIHNvbWUgdHlwZXMgb2YgYWRkcmVzcyBtb2RlcywgdGh1cworICAgICAgICAgICAgbW92bCAkMHgwLCglZWF4KSBpcyAiYzcgMDAgMDAgMDAgMDAgMDAiCisgICAgICAgICAgICBtb3ZiICQweDAsKCVlYXgpIGlzICJjNiAwMCAwMCIKKyhiKSBzbWFsbCBpbnRlZ2VyIHN0cnVjdHVyZSBtZW1iZXJzLCB3aGVuIHlvdSBoYXZlIG1hbnkgc3VjaAorICAgIHN0cnVjdHVyZXMgYWxsb2NhdGVkLAorICAgIG9yIHdoZW4gdGhlc2UgYXJlIGdsb2JhbCBvYmplY3RzIG9mIHRoaXMgc3RydWN0dXJlIHR5cGUKKworc21hbGxbdV1pbnRzIGFyZSAqTk9UKiB1c2VmdWwgZm9yOgorCisoYSkgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcyAtCisgICAgdGhleSBhcmUgcHVzaGVkIG9uLXN0YWNrIG9yIHN0b3JlZCBpbiByZWdpc3RlcnMsIGJ5dGVzIGhlcmUgYXJlICpoYXJkZXIqCisgICAgdG8gZGVhbCB3aXRoIHRoYW4gaW50cworKGIpICJjb21wdXRhdGlvbmFsIiB2YXJpYWJsZXMgLSAiYSsrIiwgImEgPSBiKjMgKyA3IiBtYXkgdGFrZSBtb3JlIGNvZGUgdG8gZG8KKyAgICBvbiBieXRlcyB0aGFuIG9uIGludHMgb24gc29tZSBhcmNoaXRlY3RpcmVzLgpkaWZmIC0tZ2l0IGEvZG9jcy9zdHlsZS1ndWlkZS50eHQgYi9kb2NzL3N0eWxlLWd1aWRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGVkODkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zdHlsZS1ndWlkZS50eHQKQEAgLTAsMCArMSw3MTMgQEAKK0J1c3lib3ggU3R5bGUgR3VpZGUKKz09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNvZGluZyBzdHlsZSBjb252ZW50aW9ucyB1c2VkIGluIEJ1c3lib3guIElmIHlvdQorYWRkIGEgbmV3IGZpbGUgdG8gQnVzeWJveCBvciBhcmUgZWRpdGluZyBhbiBleGlzdGluZyBmaWxlLCBwbGVhc2UgZm9ybWF0IHlvdXIKK2NvZGUgYWNjb3JkaW5nIHRvIHRoaXMgc3R5bGUuIElmIHlvdSBhcmUgdGhlIG1haW50YWluZXIgb2YgYSBmaWxlIHRoYXQgZG9lcworbm90IGZvbGxvdyB0aGVzZSBndWlkZWxpbmVzLCBwbGVhc2UgLS0gYXQgeW91ciBvd24gY29udmVuaWVuY2UgLS0gbW9kaWZ5IHRoZQorZmlsZShzKSB5b3UgbWFpbnRhaW4gdG8gYnJpbmcgdGhlbSBpbnRvIGNvbmZvcm1hbmNlIHdpdGggdGhpcyBzdHlsZSBndWlkZS4KK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhIGxvdyBwcmlvcml0eSB0YXNrLgorCitUbyBoZWxwIHlvdSBmb3JtYXQgdGhlIHdoaXRlc3BhY2Ugb2YgeW91ciBwcm9ncmFtcywgYW4gIi5pbmRlbnQucHJvIiBmaWxlIGlzCitpbmNsdWRlZCBpbiB0aGUgbWFpbiBCdXN5Ym94IHNvdXJjZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBvcHRpb24gZmxhZ3MgdG8KK2Zvcm1hdCBjb2RlIGFzIHBlciB0aGlzIHN0eWxlIGd1aWRlLiBUaGlzIHdheSB5b3UgY2FuIHJ1biBHTlUgaW5kZW50IG9uIHlvdXIKK2ZpbGVzIGJ5IHR5cGluZyAnaW5kZW50IG15ZmlsZS5jIG15ZmlsZS5oJyBhbmQgaXQgd2lsbCBtYWdpY2FsbHkgYXBwbHkgYWxsIHRoZQorcmlnaHQgZm9ybWF0dGluZyBydWxlcyB0byB5b3VyIGZpbGUuIFBsZWFzZSBfZG9fbm90XyBydW4gdGhpcyBvbiBhbGwgdGhlIGZpbGVzCitpbiB0aGUgZGlyZWN0b3J5LCBqdXN0IHlvdXIgb3duLgorCisKKworRGVjbGFyYXRpb24gT3JkZXIKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgaXMgdGhlIHByZWZlcnJlZCBvcmRlciBpbiB3aGljaCBjb2RlIHNob3VsZCBiZSBsYWlkIG91dCBpbiBhIGZpbGU6CisKKyAtIGNvbW1lbnRlZCBwcm9ncmFtIG5hbWUgYW5kIG9uZS1saW5lIGRlc2NyaXB0aW9uCisgLSBjb21tZW50ZWQgYXV0aG9yIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3MoZXMpCisgLSBjb21tZW50ZWQgR1BMIGJvaWxlcnBsYXRlCisgLSBjb21tZW50ZWQgbG9uZ2VyIGRlc2NyaXB0aW9uIC8gbm90ZXMgZm9yIHRoZSBwcm9ncmFtIChpZiBuZWVkZWQpCisgLSAjaW5jbHVkZXMgb2YgLmggZmlsZXMgd2l0aCBhbmdsZSBicmFja2V0cyAoPD4pIGFyb3VuZCB0aGVtCisgLSAjaW5jbHVkZXMgb2YgLmggZmlsZXMgd2l0aCBxdW90ZXMgKCIiKSBhcm91bmQgdGhlbQorIC0gI2RlZmluZXMgKGlmIGFueSwgbm90ZSB0aGUgc2VjdGlvbiBiZWxvdyB0aXRsZWQgIkF2b2lkIHRoZSBQcmVwcm9jZXNzb3IiKQorIC0gY29uc3QgYW5kIGdsb2JhbCB2YXJpYWJsZXMKKyAtIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAoaWYgbmVjZXNzYXJ5KQorIC0gZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zCisKKworCitXaGl0ZXNwYWNlIGFuZCBGb3JtYXR0aW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgZXZlcnlib2R5J3MgZmF2b3JpdGUgZmxhbWUgdG9waWMgc28gbGV0J3MgZ2V0IGl0IG91dCBvZiB0aGUgd2F5IHJpZ2h0Cit1cCBmcm9udC4KKworCitUYWJzIHZzLiBTcGFjZXMgaW4gTGluZSBJbmRlbnRhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHByZWZlcmVuY2UgaW4gQnVzeWJveCBpcyB0byBpbmRlbnQgbGluZXMgd2l0aCB0YWJzLiBEbyBub3QgaW5kZW50IGxpbmVzCit3aXRoIHNwYWNlcyBhbmQgZG8gbm90IGluZGVudHMgbGluZXMgdXNpbmcgYSBtaXh0dXJlIG9mIHRhYnMgYW5kIHNwYWNlcy4gKFRoZQoraW5kZW50YXRpb24gc3R5bGUgaW4gdGhlIEFwYWNoZSBhbmQgUG9zdGZpeCBzb3VyY2UgZG9lcyB0aGlzIHNvcnQgb2YgdGhpbmc6Citcc1xzXHNcc2lmIChleHByKSB7XG5cdHN0bXQ7IC0taWNrLikgVGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcworbXVsdGktbGluZSBjb21tZW50cyB0aGF0IHVzZSBhbiBhc3RlcmlzayBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSwgaS5lLjoKKworCVx0LyoKKwlcdCAqIFRoaXMgaXMgYSBibG9jayBjb21tZW50LgorCVx0ICogTm90ZSB0aGF0IGl0IGhhcyBtdWx0aXBsZSBsaW5lcworCVx0ICogYW5kIHRoYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgaGFzIGEgdGFiIHBsdXMgYSBzcGFjZQorCVx0ICogZXhjZXB0IGZvciB0aGUgb3BlbmluZyAnLyonIGxpbmUgd2hlcmUgdGhlIHNsYXNoCisJXHQgKiBpcyB1c2VkIGluc3RlYWQgb2YgYSBzcGFjZS4KKwlcdCAqLworCitGdXJ0aGVybW9yZSwgVGhlIHByZWZlcmVuY2UgaXMgdGhhdCB0YWJzIGJlIHNldCB0byBkaXNwbGF5IGF0IGZvdXIgc3BhY2VzCit3aWRlLCBidXQgdGhlIGJlYXV0eSBvZiB1c2luZyBvbmx5IHRhYnMgKGFuZCBub3Qgc3BhY2VzKSBhdCB0aGUgYmVnaW5uaW5nIG9mCitsaW5lcyBpcyB0aGF0IHlvdSBjYW4gc2V0IHlvdXIgZWRpdG9yIHRvIGRpc3BsYXkgdGFicyBhdCAqd2hhdGV2ZXIqIG51bWJlciBvZgorc3BhY2VzIGlzIGRlc2lyZWQgYW5kIHRoZSBjb2RlIHdpbGwgc3RpbGwgbG9vayBmaW5lLgorCisKK09wZXJhdG9yIFNwYWNpbmcKK35+fn5+fn5+fn5+fn5+fn4KKworUHV0IHNwYWNlcyBiZXR3ZWVuIHRlcm1zIGFuZCBvcGVyYXRvcnMuIEV4YW1wbGU6CisKKwlEb24ndCBkbyB0aGlzOgorCisJCWZvcihpPTA7aTxudW1faXRlbXM7aSsrKXsKKworCURvIHRoaXMgaW5zdGVhZDoKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2l0ZW1zOyBpKyspIHsKKworCVdoaWxlIGl0IGV4dGVuZHMgdGhlIGxpbmUgYSBiaXQgbG9uZ2VyLCB0aGUgc3BhY2VkIHZlcnNpb24gaXMgbW9yZQorCXJlYWRhYmxlLiBBbiBhbGxvd2FibGUgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB0aGUgc2l0dWF0aW9uIHdoZXJlCisJZXhjbHVkaW5nIHRoZSBzcGFjaW5nIG1ha2VzIGl0IG1vcmUgb2J2aW91cyB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYQorCXNpbmdsZSB0ZXJtIChldmVuIGlmIGl0IGlzIGEgY29tcG91bmQgdGVybSkgc3VjaCBhczoKKworCQlpZiAoc3RyW2lkeF0gPT0gJy8nICYmIHN0cltpZHgtMV0gIT0gJ1xcJykKKworCW9yCisKKwkJaWYgKChhcmdjLTEpIC0gKG9wdGluZCsxKSA+IDApCisKKworQnJhY2tldCBTcGFjaW5nCit+fn5+fn5+fn5+fn5+fn4KKworSWYgYW4gb3BlbmluZyBicmFja2V0IHN0YXJ0cyBhIGZ1bmN0aW9uLCBpdCBzaG91bGQgYmUgb24gdGhlCituZXh0IGxpbmUgd2l0aCBubyBzcGFjaW5nIGJlZm9yZSBpdC4gSG93ZXZlciwgaWYgYSBicmFja2V0IGZvbGxvd3MgYW4gb3BlbmluZworY29udHJvbCBibG9jaywgaXQgc2hvdWxkIGJlIG9uIHRoZSBzYW1lIGxpbmUgd2l0aCBhIHNpbmdsZSBzcGFjZSAobm90IGEgdGFiKQorYmV0d2VlbiBpdCBhbmQgdGhlIG9wZW5pbmcgY29udHJvbCBibG9jayBzdGF0ZW1lbnQuIEV4YW1wbGVzOgorCisJRG9uJ3QgZG8gdGhpczoKKworCQl3aGlsZSAoIWRvbmUpCisJCXsKKworCQlkbworCQl7CisKKwlEb24ndCBkbyB0aGlzIGVpdGhlcjoKKworCQl3aGlsZSAoIWRvbmUpeworCisJCWRveworCisJQW5kIGZvciBoZWF2ZW4ncyBzYWtlLCBkb24ndCBkbyB0aGlzOgorCisJCXdoaWxlICghZG9uZSkKKwkJICB7CisKKwkJZG8KKwkJICB7CisKKwlEbyB0aGlzIGluc3RlYWQ6CisKKwkJd2hpbGUgKCFkb25lKSB7CisKKwkJZG8geworCitJZiB5b3UgaGF2ZSBsb25nIGxvZ2ljIHN0YXRlbWVudHMgdGhhdCBuZWVkIHRvIGJlIHdyYXBwZWQsIHRoZW4gdW5jdWRkbGluZwordGhlIGJyYWNrZXQgdG8gaW1wcm92ZSByZWFkYWJpbGl0eSBpcyBhbGxvd2VkLiBHZW5lcmFsbHksIHRoaXMgc3R5bGUgbWFrZXMKK2l0IGVhc2llciBmb3IgcmVhZGVyIHRvIG5vdGljZSB0aGF0IDJuZCBhbmQgZm9sbG93aW5nIGxpbmVzIGFyZSBzdGlsbAoraW5zaWRlICdpZic6CisKKwkJaWYgKHNvbWVfcmVhbGx5X2xvbmdfY2hlY2tzICYmIHNvbWVfb3RoZXJfcmVhbGx5X2xvbmdfY2hlY2tzCisJCSAmJiBzb21lX21vcmVfcmVhbGx5X2xvbmdfY2hlY2tzCisJCSAmJiBldmVuX21vcmVfb2ZfbG9uZ19jaGVja3MKKwkJKSB7CisJCQlkb19mb29fbm93OworCitTcGFjaW5nIGFyb3VuZCBQYXJlbnRoZXNlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworUHV0IGEgc3BhY2UgYmV0d2VlbiBDIGtleXdvcmRzIGFuZCBsZWZ0IHBhcmVucywgYnV0IG5vdCBiZXR3ZWVuIGZ1bmN0aW9uIG5hbWVzCithbmQgdGhlIGxlZnQgcGFyZW4gdGhhdCBzdGFydHMgaXQncyBwYXJhbWV0ZXIgbGlzdCAod2hldGhlciBpdCBpcyBiZWluZworZGVjbGFyZWQgb3IgY2FsbGVkKS4gRXhhbXBsZXM6CisKKwlEb24ndCBkbyB0aGlzOgorCisJCXdoaWxlKGZvbykgeworCQlmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKworCURvIHRoaXMgaW5zdGVhZDoKKworCQl3aGlsZSAoZm9vKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKworCUJ1dCBkbyBmdW5jdGlvbnMgbGlrZSB0aGlzOgorCisJCXN0YXRpYyBpbnQgbXlfZnVuYyhpbnQgZm9vLCBjaGFyIGJhcikKKwkJLi4uCisJCWJheiA9IG15X2Z1bmMoMSwgMik7CisKK0Fsc28sIGRvbid0IHB1dCBhIHNwYWNlIGJldHdlZW4gdGhlIGxlZnQgcGFyZW4gYW5kIHRoZSBmaXJzdCB0ZXJtLCBub3IgYmV0d2VlbgordGhlIGxhc3QgYXJnIGFuZCB0aGUgcmlnaHQgcGFyZW4uCisKKwlEb24ndCBkbyB0aGlzOgorCisJCWlmICggeCA8IDEgKQorCQlzdHJjbXAoIHRoaXNzdHIsIHRoYXRzdHIgKQorCisJRG8gdGhpcyBpbnN0ZWFkOgorCisJCWlmICh4IDwgMSkKKwkJc3RyY21wKHRoaXNzdHIsIHRoYXRzdHIpCisKKworQ3VkZGxlZCBFbHNlcworfn5+fn5+fn5+fn5+fgorCitBbHNvLCBwbGVhc2UgImN1ZGRsZSIgeW91ciBlbHNlIHN0YXRlbWVudHMgYnkgcHV0dGluZyB0aGUgZWxzZSBrZXl3b3JkIG9uIHRoZQorc2FtZSBsaW5lIGFmdGVyIHRoZSByaWdodCBicmFja2V0IHRoYXQgY2xvc2VzIGFuICdpZicgc3RhdGVtZW50LgorCisJRG9uJ3QgZG8gdGhpczoKKworCWlmIChmb28pIHsKKwkJc3RtdDsKKwl9CisJZWxzZSB7CisJCXN0bXQ7CisJfQorCisJRG8gdGhpcyBpbnN0ZWFkOgorCisJaWYgKGZvbykgeworCQlzdG10OworCX0gZWxzZSB7CisJCXN0bXQ7CisJfQorCitUaGUgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgY29tbWVudCBiZWZvcmUgdGhlIGVsc2UKK2Jsb2NrLiBFeGFtcGxlOgorCisJaWYgKGZvbykgeworCQlzdG10cy4uLgorCX0KKwkvKiBvdGhlcndpc2UsIHdlJ3JlIGp1c3Qga2lkZGluZyBvdXJzZWx2ZXMsIHNvIHJlLWZyb2IgdGhlIGlucHV0ICovCisJZWxzZSB7CisJCW90aGVyX3N0bXRzLi4uCisJfQorCisKK0xhYmVscworfn5+fn5+CisKK0xhYmVscyBzaG91bGQgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSwgbm90IGluZGVudGVkIHRvIHRoZSBibG9jaworbGV2ZWwgKGJlY2F1c2UgdGhleSBkbyBub3QgImJlbG9uZyIgdG8gYmxvY2sgc2NvcGUsIG9ubHkgdG8gd2hvbGUgZnVuY3Rpb24pLgorCisJaWYgKGZvbykgeworCQlzdG10OworIGxhYmVsOgorCQlzdG10MjsKKwkJc3RtdDsKKwl9CisKKyhQdXR0aW5nIGxhYmVsIGF0IHBvc2l0aW9uIDEgcHJldmVudHMgZGlmZiAtcCBmcm9tIGNvbmZ1c2luZyBsYWJlbCBmb3IgZnVuY3Rpb24KK25hbWUsIGJ1dCBpdCdzIG5vdCBhIHBvbGljeSBvZiBidXN5Ym94IHByb2plY3QgdG8gZW5mb3JjZSBzdWNoIGEgbWlub3IgZGV0YWlsKS4KKworCisKK1ZhcmlhYmxlIGFuZCBGdW5jdGlvbiBOYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VzZSB0aGUgSyZSIHN0eWxlIHdpdGggbmFtZXMgaW4gYWxsIGxvd2VyLWNhc2UgYW5kIHVuZGVyc2NvcmVzIG9jY2FzaW9uYWxseQordXNlZCB0byBzZXBhcmF0ZSB3b3JkcyAoZS5nLiwgInZhcmlhYmxlX25hbWUiIGFuZCAibnVtY2hhcnMiIGFyZSBib3RoCithY2NlcHRhYmxlKS4gVXNpbmcgdW5kZXJzY29yZXMgbWFrZXMgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIG5hbWVzIG1vcmUgcmVhZGFibGUKK2JlY2F1c2UgaXQgbG9va3MgbGlrZSB3aGl0ZXNwYWNlOyB1c2luZyBsb3dlci1jYXNlIGlzIGVhc3kgb24gdGhlIGV5ZXMuCisKKwlGcm93bmVkIHVwb246CisKKwkJaGl0TGlzdAorCQlUb3RhbENoYXJzCisJCXN6RmlsZU5hbWUKKwkJcGZfTmZvbF9UcmlTdGF0ZQorCisJUHJlZmVycmVkOgorCisJCWhpdF9saXN0CisJCXRvdGFsX2NoYXJzCisJCWZpbGVfbmFtZQorCQlzZW5zaWJsZV9uYW1lCisKK0V4Y2VwdGlvbnM6CisKKyAtIEVudW1zLCBtYWNyb3MsIGFuZCBjb25zdGFudCB2YXJpYWJsZXMgYXJlIG9jY2FzaW9uYWxseSB3cml0dGVuIGluIGFsbAorICAgdXBwZXItY2FzZSB3aXRoIHdvcmRzIG9wdGlvbmFsbHkgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzIChpLmUuIEZJRk9fVFlQRSwKKyAgIElTQkxLREVWKCkpLgorCisgLSBOb2JvZHkgaXMgZ29pbmcgdG8gZ2V0IG1hZCBhdCB5b3UgZm9yIHVzaW5nICdwdmFyJyBhcyB0aGUgbmFtZSBvZiBhCisgICB2YXJpYWJsZSB0aGF0IGlzIGEgcG9pbnRlciB0byAndmFyJy4KKworCitDb252ZXJ0aW5nIHRvIEsmUgorfn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIEJ1c3lib3ggY29kZWJhc2UgaXMgdmVyeSBtdWNoIGEgbWl4dHVyZSBvZiBjb2RlIGdhdGhlcmVkIGZyb20gYSB2YXJpZXR5IG9mCitzb3VyY2VzLiBUaGlzIGV4cGxhaW5zIHdoeSB0aGUgY3VycmVudCBjb2RlYmFzZSBjb250YWlucyBzdWNoIGEgaG9kZ2UtcG9kZ2Ugb2YKK2RpZmZlcmVudCBuYW1pbmcgc3R5bGVzIChKYXZhLCBQYXNjYWwsIEsmUiwganVzdC1wbGFpbi13ZWlyZCwgZXRjLikuIFRoZSBLJlIKK2d1aWRlbGluZSBleHBsYWluZWQgYWJvdmUgc2hvdWxkIHRoZXJlZm9yZSBiZSB1c2VkIG9uIG5ldyBmaWxlcyB0aGF0IGFyZSBhZGRlZAordG8gdGhlIHJlcG9zaXRvcnkuIEZ1cnRoZXJtb3JlLCB0aGUgbWFpbnRhaW5lciBvZiBhbiBleGlzdGluZyBmaWxlIHRoYXQgdXNlcworYWx0ZXJuYXRlIG5hbWluZyBjb252ZW50aW9ucyBzaG91bGQsIGF0IGhpcyBvd24gY29udmVuaWVuY2UsIGNvbnZlcnQgdGhvc2UKK25hbWVzIG92ZXIgdG8gSyZSIHN0eWxlLiBDb252ZXJ0aW5nIHZhcmlhYmxlIG5hbWVzIGlzIGEgdmVyeSBsb3cgcHJpb3JpdHkKK3Rhc2suCisKK0lmIHlvdSB3YW50IHRvIGRvIGEgc2VhcmNoLWFuZC1yZXBsYWNlIG9mIGEgc2luZ2xlIHZhcmlhYmxlIG5hbWUgaW4gZGlmZmVyZW50CitmaWxlcywgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nIGluIHRoZSBidXN5Ym94IGRpcmVjdG9yeToKKworCSQgcGVybCAtcGkgLWUgJ3MvXGJPbGRWYXJcYi9uZXdfdmFyL2cnICouW2NoXQorCitJZiB5b3Ugd2FudCB0byBjb252ZXJ0IGFsbCB0aGUgbm9uLUsmUiB2YXJzIGluIHlvdXIgZmlsZSBhbGwgYXQgb25jZSwgZm9sbG93Cit0aGVzZSBzdGVwczoKKworIC0gSW4gdGhlIGJ1c3lib3ggZGlyZWN0b3J5IHR5cGUgJ2V4YW1wbGVzL21rMmtuci5wbCBmaWxlcy10by1jb252ZXJ0Jy4gVGhpcworICAgZG9lcyBub3QgZG8gdGhlIGFjdHVhbCBjb252ZXJzaW9uLCByYXRoZXIsIGl0IGdlbmVyYXRlcyBhIHNjcmlwdCBjYWxsZWQKKyAgICdjb252ZXJ0bWUucGwnIHRoYXQgc2hvd3Mgd2hhdCB3aWxsIGJlIGNvbnZlcnRlZCwgZ2l2aW5nIHlvdSBhIGNoYW5jZSB0bworICAgcmV2aWV3IHRoZSBjaGFuZ2VzIGJlZm9yZWhhbmQuCisKKyAtIFJldmlldyB0aGUgJ2NvbnZlcnRtZS5wbCcgc2NyaXB0IHRoYXQgZ2V0cyBnZW5lcmF0ZWQgaW4gdGhlIGJ1c3lib3gKKyAgIGRpcmVjdG9yeSBhbmQgcmVtb3ZlIC8gZWRpdCBhbnkgb2YgdGhlIHN1YnN0aXR1dGlvbnMgaW4gdGhlcmUuIFBsZWFzZQorICAgZXNwZWNpYWxseSBjaGVjayBmb3IgZmFsc2UgcG9zaXRpdmVzIChzdHJpbmdzIHRoYXQgc2hvdWxkIG5vdCBiZQorICAgY29udmVydGVkKS4KKworIC0gVHlwZSAnLi9jb252ZXJ0bWUucGwgc2FtZS1maWxlcy1hcy1iZWZvcmUnIHRvIHBlcmZvcm0gdGhlIGFjdHVhbAorICAgY29udmVyc2lvbi4KKworIC0gQ29tcGlsZSBhbmQgc2VlIGlmIGV2ZXJ5dGhpbmcgc3RpbGwgd29ya3MuCisKK1BsZWFzZSBiZSBhd2FyZSBvZiBjaGFuZ2VzIHRoYXQgaGF2ZSBjYXNjYWRpbmcgZWZmZWN0cyBpbnRvIG90aGVyIGZpbGVzLiBGb3IKK2V4YW1wbGUsIGlmIHlvdSdyZSBjaGFuZ2luZyB0aGUgbmFtZSBvZiBzb21ldGhpbmcgaW4sIHNheSB1dGlsaXR5LmMsIHlvdQorc2hvdWxkIHByb2JhYmx5IHJ1biAnZXhhbXBsZXMvbWsya25yLnBsIHV0aWxpdHkuYycgYXQgZmlyc3QsIGJ1dCB3aGVuIHlvdSBydW4KK3RoZSAnY29udmVydG1lLnBsJyBzY3JpcHQgeW91IHNob3VsZCBydW4gaXQgb24gX2FsbF8gZmlsZXMgbGlrZSBzbzoKKycuL2NvbnZlcnRtZS5wbCAqLltjaF0nLgorCisKKworQXZvaWQgVGhlIFByZXByb2Nlc3NvcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBiZXN0LCB0aGUgcHJlcHJvY2Vzc29yIGlzIGEgbmVjZXNzYXJ5IGV2aWwsIGhlbHBpbmcgdXMgYWNjb3VudCBmb3IgcGxhdGZvcm0KK2FuZCBhcmNoaXRlY3R1cmUgZGlmZmVyZW5jZXMuIFVzaW5nIHRoZSBwcmVwcm9jZXNzb3IgdW5uZWNlc3NhcmlseSBpcyBqdXN0CitwbGFpbiBldmlsLgorCisKK1RoZSBGb2xseSBvZiAjZGVmaW5lCit+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitVc2UgJ2NvbnN0IDx0eXBlPiB2YXInIGZvciBkZWNsYXJpbmcgY29uc3RhbnRzLgorCisJRG9uJ3QgZG8gdGhpczoKKworCQkjZGVmaW5lIENPTlNUIDgwCisKKwlEbyB0aGlzIGluc3RlYWQsIHdoZW4gdGhlIHZhcmlhYmxlIGlzIGluIGEgaGVhZGVyIGZpbGUgYW5kIHdpbGwgYmUgdXNlZCBpbgorCXNldmVyYWwgc291cmNlIGZpbGVzOgorCisJCWVudW0geyBDT05TVCA9IDgwIH07CisKK0FsdGhvdWdoIGVudW0gbWF5IGxvb2sgdWdseSB0byBzb21lIHBlb3BsZSwgaXQgaXMgYmV0dGVyIGZvciBjb2RlIHNpemUuCitXaXRoICJjb25zdCBpbnQiIGNvbXBpbGVyIG1heSBmYWlsIHRvIG9wdGltaXplIGl0IG91dCBhbmQgd2lsbCByZXNlcnZlCithIHJlYWwgc3RvcmFnZSBpbiByb2RhdGEgZm9yIGl0ISAoSG9wZWZ1bGx5LCBuZXdlciBnY2Mgd2lsbCBnZXQgYmV0dGVyCithdCBpdC4uLikuICBXaXRoICJkZWZpbmUiLCB5b3UgaGF2ZSBzbGlnaHQgcmlzayBvZiBwb2xsdXRpbmcgbmFtZXNwYWNlCisoI2RlZmluZSBkb2Vzbid0IGFsbG93IHlvdSB0byByZWRlZmluZSB0aGUgbmFtZSBpbiB0aGUgaW5uZXIgc2NvcGVzKSwKK2FuZCBjb21wbGV4ICJkZWZpbmUiIGFyZSBldmFsdWF0ZWQgZWFjaCB0aW1lIHRoZXkgdWVzZCwgbm90IG9uY2UKK2F0IGRlY2xhcmF0aW9ucyBsaWtlIGVudW1zLiBBbHNvLCB0aGUgcHJlcHJvY2Vzc29yIGRvZXMgX25vXyB0eXBlIGNoZWNraW5nCit3aGF0c29ldmVyLCBtYWtpbmcgaXQgbXVjaCBtb3JlIGVycm9yIHByb25lLgorCisKK1RoZSBGb2xseSBvZiBNYWNyb3MKK35+fn5+fn5+fn5+fn5+fn5+fn4KKworVXNlICdzdGF0aWMgaW5saW5lJyBpbnN0ZWFkIG9mIGEgbWFjcm8uCisKKwlEb24ndCBkbyB0aGlzOgorCisJCSNkZWZpbmUgbWluaV9mdW5jKHBhcmFtMSwgcGFyYW0yKSAocGFyYW0xIDw8IHBhcmFtMikKKworCURvIHRoaXMgaW5zdGVhZDoKKworCQlzdGF0aWMgaW5saW5lIGludCBtaW5pX2Z1bmMoaW50IHBhcmFtMSwgcGFyYW0yKQorCQl7CisJCQlyZXR1cm4gKHBhcmFtMSA8PCBwYXJhbTIpOworCQl9CisKK1N0YXRpYyBpbmxpbmUgZnVuY3Rpb25zIGFyZSBncmVhdGx5IHByZWZlcnJlZCBvdmVyIG1hY3Jvcy4gVGhleSBwcm92aWRlIHR5cGUKK3NhZmV0eSwgaGF2ZSBubyBsZW5ndGggbGltaXRhdGlvbnMsIG5vIGZvcm1hdHRpbmcgbGltaXRhdGlvbnMsIGhhdmUgYW4gYWN0dWFsCityZXR1cm4gdmFsdWUsIGFuZCB1bmRlciBnY2MgdGhleSBhcmUgYXMgY2hlYXAgYXMgbWFjcm9zLiBCZXNpZGVzLCByZWFsbHkgbG9uZworbWFjcm9zIHdpdGggYmFja3NsYXNoZXMgYXQgdGhlIGVuZCBvZiBlYWNoIGxpbmUgYXJlIHVnbHkgYXMgc2luLgorCisKK1RoZSBGb2xseSBvZiAjaWZkZWYKK35+fn5+fn5+fn5+fn5+fn5+fn4KKworQ29kZSBjbHV0dGVyZWQgd2l0aCBpZmRlZnMgaXMgZGlmZmljdWx0IHRvIHJlYWQgYW5kIG1haW50YWluLiBEb24ndCBkbyBpdC4KK0luc3RlYWQsIHB1dCB5b3VyIGlmZGVmcyBhdCB0aGUgdG9wIG9mIHlvdXIgLmMgZmlsZSAob3IgaW4gYSBoZWFkZXIpLCBhbmQKK2NvbmRpdGlvbmFsbHkgZGVmaW5lICdzdGF0aWMgaW5saW5lJyBmdW5jdGlvbnMsIChvciAqbWF5YmUqIG1hY3JvcyksIHdoaWNoIGFyZQordXNlZCBpbiB0aGUgY29kZS4KKworCURvbid0IGRvIHRoaXM6CisKKwkJcmV0ID0gbXlfZnVuYyhiYXIsIGJheik7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIC0xOworCQkjaWZkZWYgQ09ORklHX0ZFQVRVUkVfRlVOS1kKKwkJCW1heWJlX2RvX2Z1bmt5X3N0dWZmKGJhciwgYmF6KTsKKwkJI2VuZGlmCisKKwlEbyB0aGlzIGluc3RlYWQ6CisKKwkoaW4gLmggaGVhZGVyIGZpbGUpCisKKwkJI2lmIEVOQUJMRV9GRUFUVVJFX0ZVTktZCisJCXN0YXRpYyBpbmxpbmUgdm9pZCBtYXliZV9kb19mdW5reV9zdHVmZihpbnQgYmFyLCBpbnQgYmF6KQorCQl7CisJCQkvKiBsb3RzYSBjb2RlIGluIGhlcmUgKi8KKwkJfQorCQkjZWxzZQorCQlzdGF0aWMgaW5saW5lIHZvaWQgbWF5YmVfZG9fZnVua3lfc3R1ZmYoaW50IGJhciwgaW50IGJheikge30KKwkJI2VuZGlmCisKKwkoaW4gdGhlIC5jIHNvdXJjZSBmaWxlKQorCisJCXJldCA9IG15X2Z1bmMoYmFyLCBiYXopOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAtMTsKKwkJbWF5YmVfZG9fZnVua3lfc3R1ZmYoYmFyLCBiYXopOworCitUaGUgZ3JlYXQgdGhpbmcgYWJvdXQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHRoZSBjb21waWxlciB3aWxsIG9wdGltaXplIGF3YXkKK3RoZSAibm8tb3AiIGNhc2UgKHRoZSBlbXB0eSBmdW5jdGlvbikgd2hlbiB0aGUgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmLgorCitOb3RlIGFsc28gdGhlIHVzZSBvZiB0aGUgd29yZCAnbWF5YmUnIGluIHRoZSBmdW5jdGlvbiBuYW1lIHRvIGluZGljYXRlCitjb25kaXRpb25hbCBleGVjdXRpb24uCisKKworCitOb3RlcyBvbiBTdHJpbmdzCistLS0tLS0tLS0tLS0tLS0tCisKK1N0cmluZ3MgaW4gQyBjYW4gZ2V0IGEgbGl0dGxlIHRob3JueS4gSGVyZSdzIHNvbWUgZ3VpZGVsaW5lcyBmb3IgZGVhbGluZyB3aXRoCitzdHJpbmdzIGluIEJ1c3lib3guIChUaGVyZSBpcyBzdXJlbHkgbW9yZSB0aGF0IGNvdWxkIGJlIGFkZGVkIHRvIHRoaXMKK3NlY3Rpb24uKQorCisKK1N0cmluZyBGaWxlcworfn5+fn5+fn5+fn5+CisKK1B1dCBhbGwgaGVscC91c2FnZSBtZXNzYWdlcyBpbiB1c2FnZS5jLiBQdXQgb3RoZXIgc3RyaW5ncyBpbiBtZXNzYWdlcy5jLgorUHV0dGluZyB0aGVzZSBzdHJpbmdzIGludG8gdGhlaXIgb3duIGZpbGUgaXMgYSBjYWxjdWxhdGVkIGRlY2lzaW9uIGRlc2lnbmVkIHRvCitjb25maW5lIHNwZWxsaW5nIGVycm9ycyB0byBhIHNpbmdsZSBwbGFjZSBhbmQgYWlkIGludGVybmF0aW9uYWxpemF0aW9uCitlZmZvcnRzLCBpZiBuZWVkZWQuIChTaWRlIE5vdGU6IHdlIG1pZ2h0IHdhbnQgdG8gdXNlIGEgc2luZ2xlIGZpbGUgLSBtYXliZQorY2FsbGVkICdzdHJpbmdzLmMnIC0gaW5zdGVhZCBvZiB0d28sIGZvb2QgZm9yIHRob3VnaHQpLgorCisKK1Rlc3RpbmcgU3RyaW5nIEVxdWl2YWxlbmNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVyZSdzIGEgcmlnaHQgd2F5IGFuZCBhIHdyb25nIHdheSB0byB0ZXN0IGZvciBzdHJpbmcgZXF1aXZhbGVuY2Ugd2l0aAorc3RyY21wKCk6CisKKwlUaGUgd3Jvbmcgd2F5OgorCisJCWlmICghc3RyY21wKHN0cmluZywgImZvbyIpKSB7CisJCQkuLi4KKworCVRoZSByaWdodCB3YXk6CisKKwkJaWYgKHN0cmNtcChzdHJpbmcsICJmb28iKSA9PSAwKXsKKwkJCS4uLgorCitUaGUgdXNlIG9mIHRoZSAiZXF1YWxzIiAoPT0pIG9wZXJhdG9yIGluIHRoZSBsYXR0ZXIgZXhhbXBsZSBtYWtlcyBpdCBtdWNoIG1vcmUKK29idmlvdXMgdGhhdCB5b3UgYXJlIHRlc3RpbmcgZm9yIGVxdWl2YWxlbmNlLiBUaGUgZm9ybWVyIGV4YW1wbGUgd2l0aCB0aGUKKyJub3QiICghKSBvcGVyYXRvciBtYWtlcyBpdCBsb29rIGxpa2UgeW91IGFyZSB0ZXN0aW5nIGZvciBhbiBlcnJvci4gSW4gYSBtb3JlCitwZXJmZWN0IHdvcmxkLCB3ZSB3b3VsZCBoYXZlIGEgc3RyZXEoKSBmdW5jdGlvbiBpbiB0aGUgc3RyaW5nIGxpYnJhcnksIGJ1dAordGhhdCBhaW4ndCB0aGUgd29ybGQgd2UncmUgbGl2aW5nIGluLgorCisKK0F2b2lkIERhbmdlcm91cyBTdHJpbmcgRnVuY3Rpb25zCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitVbmZvcnR1bmF0ZWx5LCB0aGUgd2F5IEMgaGFuZGxlcyBzdHJpbmdzIG1ha2VzIHRoZW0gcHJvbmUgdG8gb3ZlcnJ1bnMgd2hlbgorY2VydGFpbiBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgKG1pcyl1c2VkLiBUaGUgZm9sbG93aW5nIHRhYmxlICBvZmZlcnMgYSBzdW1tYXJ5CitvZiBzb21lIG9mIHRoZSBtb3JlIG5vdG9yaW91cyB0cm91YmxlbWFrZXJzOgorCitmdW5jdGlvbiAgICAgb3ZlcmZsb3dzICAgICAgICAgICAgICAgICAgcHJlZmVycmVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJjcHkgICAgICAgZGVzdCBzdHJpbmcgICAgICAgICAgICAgICAgc2FmZV9zdHJuY3B5CitzdHJuY3B5ICAgICAgbWF5IGZhaWwgdG8gMC10ZXJtaW5hdGUgZHN0IHNhZmVfc3RybmNweQorc3RyY2F0ICAgICAgIGRlc3Qgc3RyaW5nICAgICAgICAgICAgICAgIHN0cm5jYXQKK2dldHMgICAgICAgICBzdHJpbmcgaXQgZ2V0cyAgICAgICAgICAgICBmZ2V0cworZ2V0d2QgICAgICAgIGJ1ZiBzdHJpbmcgICAgICAgICAgICAgICAgIGdldGN3ZAorW3Zdc3ByaW50ZiAgIHN0ciBidWZmZXIgICAgICAgICAgICAgICAgIFt2XXNucHJpbnRmCityZWFscGF0aCAgICAgcGF0aCBidWZmZXIgICAgICAgICAgICAgICAgdXNlIHdpdGggcGF0aGNvbmYKK1t2Zl1zY2FuZiAgICBpdHMgYXJndW1lbnRzICAgICAgICAgICAgICBqdXN0IGF2b2lkIGl0CisKKworVGhlIGFib3ZlIGlzIGJ5IG5vIG1lYW5zIGEgY29tcGxldGUgbGlzdC4gQmUgY2FyZWZ1bCBvdXQgdGhlcmUuCisKKworCitBdm9pZCBCaWcgU3RhdGljIEJ1ZmZlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGaXJzdCwgc29tZSBiYWNrZ3JvdW5kIHRvIHB1dCB0aGlzIGRpc2N1c3Npb24gaW4gY29udGV4dDogc3RhdGljIGJ1ZmZlcnMgbG9vaworbGlrZSB0aGlzIGluIGNvZGU6CisKKwkvKiBpbiBhIC5jIGZpbGUgb3V0c2lkZSBhbnkgZnVuY3Rpb25zICovCisJc3RhdGljIGNoYXIgYnVmZmVyW0JVRlNJWl07IC8qIGhhcHBpbHkgdXNlZCBieSBhbnkgZnVuY3Rpb24gaW4gdGhpcyBmaWxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGljayEgYmlnISAqLworCitUaGUgcHJvYmxlbSB3aXRoIHRoZXNlIGlzIHRoYXQgYW55IHRpbWUgYW55IGJ1c3lib3ggYXBwIGlzIHJ1biwgeW91IHBheSBhCittZW1vcnkgcGVuYWx0eSBmb3IgdGhpcyBidWZmZXIsIGV2ZW4gaWYgdGhlIGFwcGxldCB0aGF0IHVzZXMgc2FpZCBidWZmZXIgaXMKK25vdCBydW4uIFRoaXMgY2FuIGJlIGZpeGVkLCB0aHVzbHk6CisKKwlzdGF0aWMgY2hhciAqYnVmZmVyOworCS4uLgorCW90aGVyX2Z1bmMoKQorCXsKKwkJc3RyY3B5KGJ1ZmZlciwgbG90c2FfY2hhcnMpOyAvKiBoYXBwaWx5IHVzZXMgZ2xvYmFsICpidWZmZXIgKi8KKwkuLi4KKwlmb29fbWFpbigpCisJeworCQlidWZmZXIgPSB4bWFsbG9jKHNpemVvZihjaGFyKSpCVUZTSVopOworCS4uLgorCitIb3dldmVyLCB0aGlzIGFwcHJvYWNoIHRyYWRlcyBic3Mgc2VnbWVudCBmb3IgdGV4dCBzZWdtZW50LiBSYXRoZXIgdGhhbgorbWFsbG9jaW5nIHRoZSBidWZmZXJzIChhbmQgdGh1cyBncm93aW5nIHRoZSB0ZXh0IHNpemUpLCBidWZmZXJzIGNhbiBiZQorZGVjbGFyZWQgb24gdGhlIHN0YWNrIGluIHRoZSAqX21haW4oKSBmdW5jdGlvbiBhbmQgbWFkZSBhdmFpbGFibGUgZ2xvYmFsbHkgYnkKK2Fzc2lnbmluZyB0aGVtIHRvIGEgZ2xvYmFsIHBvaW50ZXIgdGh1c2x5OgorCisJc3RhdGljIGNoYXIgKnBidWZmZXI7CisJLi4uCisJb3RoZXJfZnVuYygpCisJeworCQlzdHJjcHkocGJ1ZmZlciwgbG90c2FfY2hhcnMpOyAvKiBoYXBwaWx5IHVzZXMgZ2xvYmFsICpwYnVmZmVyICovCisJLi4uCisJZm9vX21haW4oKQorCXsKKwkJY2hhciAqYnVmZmVyW0JVRlNJWl07IC8qIGRlY2xhcmVkIGxvY2FsbHksIG9uIHN0YWNrICovCisJCXBidWZmZXIgPSBidWZmZXI7ICAgICAvKiBidXQgYXZhaWxhYmxlIGdsb2JhbGx5ICovCisJLi4uCisKK1RoaXMgbGFzdCBhcHByb2FjaCBoYXMgc29tZSBhZHZhbnRhZ2VzIChsb3cgY29kZSBzaXplLCBzcGFjZSBub3QgdXNlZCB1bnRpbAoraXQncyBuZWVkZWQpLCBidXQgY2FuIGJlIGEgcHJvYmxlbSBpbiBzb21lIGxvdyByZXNvdXJjZSBtYWNoaW5lcyB0aGF0IGhhdmUKK3ZlcnkgbGltaXRlZCBzdGFjayBzcGFjZSAoZS5nLiwgdUNMaW51eCkuCisKK0EgbWFjcm8gaXMgZGVjbGFyZWQgaW4gYnVzeWJveC5oIHRoYXQgaW1wbGVtZW50cyBjb21waWxlLXRpbWUgc2VsZWN0aW9uCitiZXR3ZWVuIHhtYWxsb2MoKSBhbmQgc3RhY2sgY3JlYXRpb24sIHNvIHlvdSBjYW4gY29kZSB0aGUgbGluZSBpbiBxdWVzdGlvbiBhcworCisJCVJFU0VSVkVfQ09ORklHX0JVRkZFUihidWZmZXIsIEJVRlNJWik7CisKK2FuZCB0aGUgcmlnaHQgdGhpbmcgd2lsbCBoYXBwZW4sIGJhc2VkIG9uIHlvdXIgY29uZmlndXJhdGlvbi4KKworQW5vdGhlciByZWxhdGl2ZWx5IG5ldyB0cmljayBvZiBzaW1pbGFyIG5hdHVyZSBpcyBleHBsYWluZWQKK2luIGtlZXBfZGF0YV9zbWFsbC50eHQuCisKKworCitNaXNjZWxsYW5lb3VzIENvZGluZyBHdWlkZWxpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgYXJlIGltcG9ydGFudCBpdGVtcyB0aGF0IGRvbid0IGZpdCBpbnRvIGFueSBvZiB0aGUgYWJvdmUKK3NlY3Rpb25zLgorCisKK01vZGVsIEJ1c3lib3ggQXBwbGV0cyBBZnRlciBHTlUgQ291bnRlcnBhcnRzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXaGVuIGluIGRvdWJ0IGFib3V0IHRoZSBwcm9wZXIgYmVoYXZpb3Igb2YgYSBCdXN5Ym94IHByb2dyYW0gKG91dHB1dCwKK2Zvcm1hdHRpbmcsIG9wdGlvbnMsIGV0Yy4pLCBtb2RlbCBpdCBhZnRlciB0aGUgZXF1aXZhbGVudCBHTlUgcHJvZ3JhbS4KK0RvZXNuJ3QgbWF0dGVyIGhvdyB0aGF0IHByb2dyYW0gYmVoYXZlcyBvbiBzb21lIG90aGVyIGZsYXZvciBvZiAqTklYOyBkb2Vzbid0CittYXR0ZXIgd2hhdCB0aGUgUE9TSVggc3RhbmRhcmQgc2F5cyBvciBkb2Vzbid0IHNheSwganVzdCBtb2RlbCBCdXN5Ym94Citwcm9ncmFtcyBhZnRlciB0aGVpciBHTlUgY291bnRlcnBhcnRzIGFuZCBpdCB3aWxsIG1ha2UgbGlmZSBlYXNpZXIgb24gKG5lYXJseSkKK2V2ZXJ5b25lLgorCitUaGUgb25seSB0aW1lIHdlIGRldmlhdGUgZnJvbSBlbXVsYXRpbmcgdGhlIEdOVSBiZWhhdmlvciBpcyB3aGVuOgorCisJLSBXZSBhcmUgZGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0aW5nIGEgZmVhdHVyZSAoc3VjaCBhcyBhIGNvbW1hbmQgbGluZQorCSAgc3dpdGNoKQorCS0gRW11bGF0aW5nIHRoZSBHTlUgYmVoYXZpb3IgaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgKGxvdHMgbW9yZSBjb2RlCisJICB3b3VsZCBiZSByZXF1aXJlZCwgbG90cyBtb3JlIG1lbW9yeSB3b3VsZCBiZSB1c2VkLCBldGMuKQorCS0gVGhlIGRpZmZlcmVuY2UgaXMgbWlub3Igb3IgY29zbWV0aWMKKworQSBub3RlIG9uIHRoZSAnY29zbWV0aWMnIGNhc2U6IG91dHB1dCBkaWZmZXJlbmNlcyBtaWdodCBiZSBjb25zaWRlcmVkCitjb3NtZXRpYywgYnV0IGlmIHRoZSBvdXRwdXQgaXMgc2lnbmlmaWNhbnQgZW5vdWdoIHRvIGJyZWFrIG90aGVyIHNjcmlwdHMgdGhhdAordXNlIHRoZSBvdXRwdXQsIGl0IHNob3VsZCByZWFsbHkgYmUgZml4ZWQuCisKKworU2NvcGUKK35+fn5+CisKK0lmIGEgY29uc3QgdmFyaWFibGUgaXMgdXNlZCBvbmx5IGluIGEgc2luZ2xlIHNvdXJjZSBmaWxlLCBwdXQgaXQgaW4gdGhlIHNvdXJjZQorZmlsZSBhbmQgbm90IGluIGEgaGVhZGVyIGZpbGUuIExpa2V3aXNlLCBpZiBhIGNvbnN0IHZhcmlhYmxlIGlzIHVzZWQgaW4gb25seQorb25lIGZ1bmN0aW9uLCBkbyBub3QgbWFrZSBpdCBnbG9iYWwgdG8gdGhlIGZpbGUuIEluc3RlYWQsIGRlY2xhcmUgaXQgaW5zaWRlCit0aGUgZnVuY3Rpb24gYm9keS4gQm90dG9tIGxpbmU6IE1ha2UgYSBjb25zY2lvdXMgZWZmb3J0IHRvIGxpbWl0IGRlY2xhcmF0aW9ucwordG8gdGhlIHNtYWxsZXN0IHNjb3BlIHBvc3NpYmxlLgorCitJbnNpZGUgYXBwbGV0IGZpbGVzLCBhbGwgZnVuY3Rpb25zIHNob3VsZCBiZSBkZWNsYXJlZCBzdGF0aWMgc28gYXMgdG8ga2VlcCB0aGUKK2dsb2JhbCBuYW1lIHNwYWNlIGNsZWFuLiBUaGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzIHRoZSAiYXBwbGV0X21haW4iCitmdW5jdGlvbiB3aGljaCBtdXN0IGJlIGRlY2xhcmVkIGV4dGVybi4KKworSWYgeW91IHdyaXRlIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHRhc2sgdGhhdCBjb3VsZCBiZSB1c2VmdWwgb3V0c2lkZSB0aGUKK2ltbWVkaWF0ZSBmaWxlLCB0dXJuIGl0IGludG8gYSBnZW5lcmFsLXB1cnBvc2UgZnVuY3Rpb24gd2l0aCBubyB0aWVzIHRvIGFueQorYXBwbGV0IGFuZCBwdXQgaXQgaW4gdGhlIHV0aWxpdHkuYyBmaWxlIGluc3RlYWQuCisKKworQnJhY2tldHMgQXJlIFlvdXIgRnJpZW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitQbGVhc2UgdXNlIGJyYWNrZXRzIG9uIGFsbCBpZiBhbmQgZWxzZSBzdGF0ZW1lbnRzLCBldmVuIGlmIGl0IGlzIG9ubHkgb25lCitsaW5lLiBFeGFtcGxlOgorCisJRG9uJ3QgZG8gdGhpczoKKworCQlpZiAoZm9vKQorCQkJc3RtdDE7CisJCXN0bXQyCisJCXN0bXQzOworCisJRG8gdGhpcyBpbnN0ZWFkOgorCisJCWlmIChmb28pIHsKKwkJCXN0bXQxOworCQl9CisJCXN0bXQyCisJCXN0bXQzOworCitUaGUgImJyYWNrZXRsZXNzIiBhcHByb2FjaCBpcyBlcnJvciBwcm9uZSBiZWNhdXNlIHNvbWVkYXkgeW91IG1pZ2h0IGFkZCBhIGxpbmUKK2xpa2UgdGhpczoKKworCQlpZiAoZm9vKQorCQkJc3RtdDE7CisJCQluZXdfbGluZSgpOworCQlzdG10MjsKKwkJc3RtdDM7CisKK0FuZCB0aGUgcmVzdWx0aW5nIGJlaGF2aW9yIG9mIHlvdXIgcHJvZ3JhbSB3b3VsZCB0b3RhbGx5IGJld2lsZGVyIHlvdS4gKERvbid0CitsYXVnaCwgaXQgaGFwcGVucyB0byB1cyBhbGwuKSBSZW1lbWJlciBmb2xrcywgdGhpcyBpcyBDLCBub3QgUHl0aG9uLgorCisKK0Z1bmN0aW9uIERlY2xhcmF0aW9ucworfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0RvIG5vdCB1c2Ugb2xkLXN0eWxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB0aGF0IGRlY2xhcmUgdmFyaWFibGUgdHlwZXMgYmV0d2VlbgordGhlIHBhcmFtZXRlciBsaXN0IGFuZCBvcGVuaW5nIGJyYWNrZXQuIEV4YW1wbGU6CisKKwlEb24ndCBkbyB0aGlzOgorCisJCWludCBmb28ocGFybTEsIHBhcm0yKQorCQkJY2hhciBwYXJtMTsKKwkJCWZsb2F0IHBhcm0yOworCQl7CisJCQkuLi4uCisKKwlEbyB0aGlzIGluc3RlYWQ6CisKKwkJaW50IGZvbyhjaGFyIHBhcm0xLCBmbG9hdCBwYXJtMikKKwkJeworCQkJLi4uLgorCitUaGUgb25seSB0aW1lIHlvdSB3b3VsZCBldmVyIG5lZWQgdG8gdXNlIHRoZSBvbGQgZGVjbGFyYXRpb24gc3ludGF4IGlzIHRvCitzdXBwb3J0IGFuY2llbnQsIGFudGVkaWx1dmlhbiBjb21waWxlcnMuIFRvIG91ciBnb29kIGZvcnR1bmUsIHdlIGhhdmUgYWNjZXNzCit0byBtb3JlIG1vZGVybiBjb21waWxlcnMgYW5kIHRoZSBvbGQgZGVjbGFyYXRpb24gc3ludGF4IGlzIG5laXRoZXIgbmVjZXNzYXJ5Citub3IgZGVzaXJlZC4KKworCitFbXBoYXNpemluZyBMb2dpY2FsIEJsb2Nrcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworT3JnYW5pemF0aW9uIGFuZCByZWFkYWJpbGl0eSBhcmUgaW1wcm92ZWQgYnkgcHV0dGluZyBleHRyYSBuZXdsaW5lcyBhcm91bmQKK2Jsb2NrcyBvZiBjb2RlIHRoYXQgcGVyZm9ybSBhIHNpbmdsZSB0YXNrLiBUaGVzZSBhcmUgdHlwaWNhbGx5IGJsb2NrcyB0aGF0CitiZWdpbiB3aXRoIGEgQyBrZXl3b3JkLCBidXQgbm90IGFsd2F5cy4KKworRnVydGhlcm1vcmUsIHlvdSBzaG91bGQgcHV0IGEgc2luZ2xlIGNvbW1lbnQgKG5vdCBuZWNlc3NhcmlseSBvbmUgbGluZSwganVzdAorb25lIGNvbW1lbnQpIGJlZm9yZSB0aGUgYmxvY2ssIHJhdGhlciB0aGFuIGNvbW1lbnRpbmcgZWFjaCBhbmQgZXZlcnkgbGluZS4KK1RoZXJlIGlzIGFuIG9wdGltYWwgYW1vdW50IG9mIGNvbW1lbnRpbmcgdGhhdCBhIHByb2dyYW0gY2FuIGhhdmU7IHlvdSBjYW4KK2NvbW1lbnQgdG9vIG11Y2ggYXMgd2VsbCBhcyB0b28gbGl0dGxlLgorCitBIHBpY3R1cmUgaXMgcmVhbGx5IHdvcnRoIGEgdGhvdXNhbmQgd29yZHMgaGVyZSwgdGhlIGZvbGxvd2luZyBleGFtcGxlCitpbGx1c3RyYXRlcyBob3cgdG8gZW1waGFzaXplIGxvZ2ljYWwgYmxvY2tzOgorCisJd2hpbGUgKGxpbmUgPSB4bWFsbG9jX2ZnZXRzKGZwKSkgeworCisJCS8qIGVhdCB0aGUgbmV3bGluZSwgaWYgYW55ICovCisJCWNob21wKGxpbmUpOworCisJCS8qIGlnbm9yZSBibGFuayBsaW5lcyAqLworCQlpZiAoc3RybGVuKGZpbGVfdG9fYWN0X29uKSA9PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGlmIHRoZSBzZWFyY2ggc3RyaW5nIGlzIGluIHRoaXMgbGluZSwgcHJpbnQgaXQsCisJCSAqIHVubGVzcyB3ZSB3ZXJlIHRvbGQgdG8gYmUgcXVpZXQgKi8KKwkJaWYgKHN0cnN0cihsaW5lLCBzZWFyY2gpICYmICFiZV9xdWlldCkgeworCQkJcHV0cyhsaW5lKTsKKwkJfQorCisJCS8qIGNsZWFuIHVwICovCisJCWZyZWUobGluZSk7CisJfQorCisKK1Byb2Nlc3NpbmcgT3B0aW9ucyB3aXRoIGdldG9wdAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIHlvdXIgYXBwbGV0IG5lZWRzIHRvIHByb2Nlc3MgY29tbWFuZC1saW5lIHN3aXRjaGVzLCBwbGVhc2UgdXNlIGdldG9wdDMyKCkgdG8KK2RvIHNvLiBOdW1lcm91cyBleGFtcGxlcyBjYW4gYmUgc2VlbiBpbiBtYW55IG9mIHRoZSBleGlzdGluZyBhcHBsZXRzLCBidXQKK2Jhc2ljYWxseSBpdCBib2lscyBkb3duIHRvIHR3byB0aGluZ3M6IGF0IHRoZSB0b3Agb2YgdGhlIC5jIGZpbGUsIGhhdmUgdGhpcworbGluZSBpbiB0aGUgbWlkc3Qgb2YgeW91ciAjaW5jbHVkZXMsIGlmIHlvdSBuZWVkIHRvIHBhcnNlIGxvbmcgb3B0aW9uczoKKworCSNpbmNsdWRlIDxnZXRvcHQuaD4KKworVGhlbiBoYXZlIGxvbmcgb3B0aW9ucyBkZWZpbmVkOgorCisJc3RhdGljIGNvbnN0IGNoYXIgPGFwcGxldD5fbG9uZ29wdHNbXSBBTElHTjEgPQorCQkibGlzdFwwIiAgICBOb19hcmd1bWVudCAidCIKKwkJImV4dHJhY3RcMCIgTm9fYXJndW1lbnQgIngiCisJOworCitBbmQgYSBjb2RlIGJsb2NrIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBuZWFyIHRoZSB0b3Agb2YgeW91ciBhcHBsZXRfbWFpbigpCityb3V0aW5lOgorCisJY2hhciAqc3RyX2I7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJjcnlwdGljX3N0cmluZyI7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IDxhcHBsZXQ+X2xvbmdvcHRzOyAvKiBpZiB5b3UgaGF2ZSB0aGVtICovCisJb3B0ID0gZ2V0b3B0MzIoYXJnYywgYXJndiwgImFiOmMiLCAmc3RyX2IpOworCWlmIChvcHQgJiAxKSB7CisJCWhhbmRsZV9vcHRpb25fYSgpOworCX0KKwlpZiAob3B0ICYgMikgeworCQloYW5kbGVfb3B0aW9uX2Ioc3RyX2IpOworCX0KKwlpZiAob3B0ICYgNCkgeworCQloYW5kbGVfb3B0aW9uX2MoKTsKKwl9CisKK0lmIHlvdXIgYXBwbGV0IHRha2VzIG5vIG9wdGlvbnMgKHN1Y2ggYXMgJ2luaXQnKSwgdGhlcmUgc2hvdWxkIGJlIGEgbGluZQorc29tZXdoZXJlIGluIHRoZSBmaWxlIHJlYWRzOgorCisJLyogbm8gb3B0aW9ucywgbm8gZ2V0b3B0ICovCisKK1RoYXQgd2F5LCB3aGVuIHBlb3BsZSBnbyBncmVwcGluZyB0byBzZWUgd2hpY2ggYXBwbGV0cyBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0bwordXNlIGdldG9wdCwgdGhleSB3b24ndCBnZXQgZmFsc2UgcG9zaXRpdmVzLgorCitGb3IgbW9yZSBpbmZvIGFuZCBleGFtcGxlcywgZXhhbWluZSBnZXRvcHQzMi5jLCB0YXIuYywgd2dldC5jIGV0Yy4KZGlmZiAtLWdpdCBhL2RvY3Mvc3lzbG9nLmNvbmYudHh0IGIvZG9jcy9zeXNsb2cuY29uZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5YzRhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3lzbG9nLmNvbmYudHh0CkBAIC0wLDAgKzEsMjggQEAKK0lmIHN5c2xvZ2QgYXBwbGV0IGNvbXBpbGVkIHdpdGggRkVBVFVSRV9TWVNMT0dEX0NGRz15LCB0aGVuIGl0IHN1cHBvcnRzIHJlc3RyaWN0ZWQgc3lzbG9nLmNvbmYuCitUaGUgY29uZmlnIHJlc2VtYmxlcyByc3lzbG9nLmNvbmYgaW4gUlVMRVMgcGFydDoKKworTElORSA9IERFTElNIFtSVUxFIHwgQ09NTUVOVF0KK0NPTU1FTlQgPSAjLioKK0RFTElNID0gU1BBQ0UgVEFCCitSVUxFID0gU0VMRUNUT1IgWztTRUxFQ1RPUl0qIERFTElNKiBBQ1RJT04gREVMSU0qCitTRUxFQ1RPUiA9IEZBQ0lMSVRZIFssRkFDSUxJVFldKiAuW1shXT1dIFBSSU9SSVRZCitGQUNJTElUWSA9ICogfCBrZXJuIHwgdXNlciAuLi4gKHNlZSBzeXNsb2cuaCkKK1BSSU9SSVRZID0gKiB8IGVtZXJnIHwgYWxlcnQgLi4uIChzZWUgc3lzbG9nLmgpCitBQ1RJT04gPSBGSUxFCisKKyJtYXJrIiBmYWNpbGl0eSBpcyBOT1Qgc3VwcG9ydGVkLgorIm5vbmUiIHByaW9yaXR5IGlzIHN1cHBvcnRlZC4KK0luIEZBQ0lMSVRZIGFuZCBQUklPUklUWSAiKiIgc3RhbmRzIGZvciAiYW55Ii4KK0ZJTEUgaXMgYSByZWd1bGFyIGZpbGUgb3IgdHR5IGRldmljZS4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorCisjc3lzbG9nLmNvbmYKK2tlcm4sdXNlci4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3Zhci9sb2cvbWVzc2FnZXMJI2FsbCBtZXNzYWdlcyBvZiBrZXJuIGFuZCB1c2VyIGZhY2lsaXRpZXMKK2tlcm4uIWVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3Zhci9sb2cvY3JpdGljYWwJI2FsbCBtZXNzYWdlcyBvZiBrZXJuIGZhY2lsaXR5IHdpdGggcHJpb3JpdGllcyBsb3dlciB0aGFuIGVyciAod2Fybiwgbm90aWNlIC4uLikKKyouKjthdXRoLGF1dGhwcml2Lm5vbmUgICAgICAgICAgICAgICAgICAgICAgL3Zhci9sb2cvbm9hdXRoCSNhbGwgbWVzc2FnZXMgZXhjZXB0IG9uZXMgd2l0aCBhdXRoIGFuZCBhdXRocHJpdiBmYWNpbGl0aWVzCitrZXJuLHVzZXIuKjtrZXJuLiE9bm90aWNlOyouZXJyO3N5c2xvZy5ub25lIC92YXIvbG9nL09NRwkjc29tZSB3aGlja2VkIHJ1bGUganVzdCBhcyBhbiBleGFtcGxlID0pCisqLiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9kZXYvbnVsbAkJI3RoaXMgcHJldmVudHMgZnJvbSBsb2dnaW5nIHRvIGRlZmF1bHQgbG9nIGZpbGUgKC1PIEZJTEUgb3IgL3Zhci9sb2cvbWVzc2FnZXMpCisKK0V2ZW4gaW4gdGhlIGNhc2Ugb2YgbWF0Y2ggd2l0aCBzb21lIHJ1bGUgYW5vdGhlciBydWxlcyB3aWxsIGJlIHRyaWVkIHRvby4KK0lmIHRoZXJlIHdhcyBubyBtYXRjaCB3aXRoIGFueSBvZiB0aGUgcnVsZXMsIGxvZ2dpbmcgdG8gZGVmYXVsdCBsb2cgZmlsZSBvciBzaGFyZWQgbWVtb3J5IHdpbGwgYmUgcGVyZm9ybWVkLgpkaWZmIC0tZ2l0IGEvZG9jcy90YXJfcGF4LnR4dCBiL2RvY3MvdGFyX3BheC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2YzI3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdGFyX3BheC50eHQKQEAgLTAsMCArMSwyMzkgQEAKKydwYXggaGVhZGVycycgaXMgUE9TSVggMjAwMyAoaWlyYykgYWRkaXRpb24gZGVzaWduZWQgdG8gZml4Cit0YXIgZm9ybWF0IGxpbWl0YXRpb25zIC0gb2xkZXIgdGFyIGZvcm1hdCBoYXMgZml4ZWQgZmllbGRzCitmb3IgZXZlcnl0aGluZyAoZmlsZW5hbWUsIHVpZCwgZmlsZXNpemUgZXRjKSB3aGljaCBjYW4gb3ZlcmZsb3cuCisKK3BheCBIZWFkZXIgQmxvY2sKKworVGhlIHBheCBoZWFkZXIgYmxvY2sgc2hhbGwgYmUgaWRlbnRpY2FsIHRvIHRoZSB1c3RhciBoZWFkZXIgYmxvY2sKK2Rlc2NyaWJlZCBpbiB1c3RhciBJbnRlcmNoYW5nZSBGb3JtYXQsIGV4Y2VwdCB0aGF0IHR3byBhZGRpdGlvbmFsCit0eXBlZmxhZyB2YWx1ZXMgYXJlIGRlZmluZWQ6CisKK3gKKyAgICBSZXByZXNlbnRzIGV4dGVuZGVkIGhlYWRlciByZWNvcmRzIGZvciB0aGUgZm9sbG93aW5nIGZpbGUgaW4KK3RoZSBhcmNoaXZlICh3aGljaCBzaGFsbCBoYXZlIGl0cyBvd24gdXN0YXIgaGVhZGVyIGJsb2NrKS4KKworZworICAgIFJlcHJlc2VudHMgZ2xvYmFsIGV4dGVuZGVkIGhlYWRlciByZWNvcmRzIGZvciB0aGUgZm9sbG93aW5nCitmaWxlcyBpbiB0aGUgYXJjaGl2ZS4gRWFjaCB2YWx1ZSBzaGFsbCBhZmZlY3QgYWxsIHN1YnNlcXVlbnQgZmlsZXMKK3RoYXQgZG8gbm90IG92ZXJyaWRlIHRoYXQgdmFsdWUgaW4gdGhlaXIgb3duIGV4dGVuZGVkIGhlYWRlcgorcmVjb3JkIGFuZCB1bnRpbCBhbm90aGVyIGdsb2JhbCBleHRlbmRlZCBoZWFkZXIgcmVjb3JkIGlzIHJlYWNoZWQKK3RoYXQgcHJvdmlkZXMgYW5vdGhlciB2YWx1ZSBmb3IgdGhlIHNhbWUgZmllbGQuIFRoZSB0eXBlZmxhZyBnCitnbG9iYWwgaGVhZGVycyBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBpbnRlcmNoYW5nZSBtZWRpYSB0aGF0Citjb3VsZCBzdWZmZXIgcGFydGlhbCBkYXRhIGxvc3MgaW4gdHJhbnNwb3J0aW5nIHRoZSBhcmNoaXZlLgorCitGb3IgYm90aCBvZiB0aGVzZSB0eXBlcywgdGhlIHNpemUgZmllbGQgc2hhbGwgYmUgdGhlIHNpemUgb2YgdGhlCitleHRlbmRlZCBoZWFkZXIgcmVjb3JkcyBpbiBvY3RldHMuIFRoZSBvdGhlciBmaWVsZHMgaW4gdGhlIGhlYWRlcgorYmxvY2sgYXJlIG5vdCBtZWFuaW5nZnVsIHRvIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGF4IHV0aWxpdHkuCitIb3dldmVyLCBpZiB0aGlzIGFyY2hpdmUgaXMgcmVhZCBieSBhIHBheCB1dGlsaXR5IGNvbmZvcm1pbmcgdG8KK3RoZSBJU08gUE9TSVgtMjoxOTkzIHN0YW5kYXJkLCB0aGUgaGVhZGVyIGJsb2NrIGZpZWxkcyBhcmUgdXNlZCB0bworY3JlYXRlIGEgcmVndWxhciBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuZGVkIGhlYWRlciByZWNvcmRzIGFzCitkYXRhLiBUaGVyZWZvcmUsIGhlYWRlciBibG9jayBmaWVsZCB2YWx1ZXMgc2hvdWxkIGJlIHNlbGVjdGVkIHRvCitwcm92aWRlIHJlYXNvbmFibGUgZmlsZSBhY2Nlc3MgdG8gdGhpcyByZWd1bGFyIGZpbGUuCisKK0EgZnVydGhlciBkaWZmZXJlbmNlIGZyb20gdGhlIHVzdGFyIGhlYWRlciBibG9jayBpcyB0aGF0IGRhdGEKK2Jsb2NrcyBmb3IgZmlsZXMgb2YgdHlwZWZsYWcgMSAodGhlIGRpZ2l0IG9uZSkgKGhhcmQgbGluaykgbWF5IGJlCitpbmNsdWRlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc2l6ZSBmaWVsZCBtYXkgYmUgZ3JlYXRlciB0aGFuCit6ZXJvLgorCitwYXggRXh0ZW5kZWQgSGVhZGVyCisKK0FuIGV4dGVuZGVkIGhlYWRlciBzaGFsbCBjb25zaXN0IG9mIG9uZSBvciBtb3JlIHJlY29yZHMsIGVhY2gKK2NvbnN0cnVjdGVkIGFzIGZvbGxvd3M6CisKKyIlZCAlcz0lc1xuIiwgPGxlbmd0aD4sIDxrZXl3b3JkPiwgPHZhbHVlPgorCitUaGUgPGxlbmd0aD4gZmllbGQgc2hhbGwgYmUgdGhlIGRlY2ltYWwgbGVuZ3RoIG9mIHRoZSBleHRlbmRlZAoraGVhZGVyIHJlY29yZCBpbiBvY3RldHMsIGluY2x1ZGluZyBsZW5ndGggc3RyaW5nIGl0c2VsZiBhbmQgdGhlCit0cmFpbGluZyA8bmV3bGluZT4uCisKK1tza2lwXQorCithdGltZQorICAgIFRoZSBmaWxlIGFjY2VzcyB0aW1lIGZvciB0aGUgZm9sbG93aW5nIGZpbGUocyksIGVxdWl2YWxlbnQgdG8KK3RoZSB2YWx1ZSBvZiB0aGUgc3RfYXRpbWUgbWVtYmVyIG9mIHRoZSBzdGF0IHN0cnVjdHVyZSBmb3IgYSBmaWxlLAorYXMgZGVzY3JpYmVkIGJ5IHRoZSBzdGF0KCkgZnVuY3Rpb24uIFRoZSBhY2Nlc3MgdGltZSBzaGFsbCBiZQorcmVzdG9yZWQgaWYgdGhlIHByb2Nlc3MgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UgcmVxdWlyZWQgdG8KK2RvIHNvLiBUaGUgZm9ybWF0IG9mIHRoZSA8dmFsdWU+IHNoYWxsIGJlIGFzIGRlc2NyaWJlZCBpbiBwYXgKK0V4dGVuZGVkIEhlYWRlciBGaWxlIFRpbWVzLgorCitjaGFyc2V0CisgICAgVGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBlbmNvZGUgdGhlIGRhdGEgaW4gdGhlCitmb2xsb3dpbmcgZmlsZShzKS4KKworICAgIFRoZSBlbmNvZGluZyBpcyBpbmNsdWRlZCBpbiBhbiBleHRlbmRlZCBoZWFkZXIgZm9yIGluZm9ybWF0aW9uCitvbmx5OyB3aGVuIHBheCBpcyB1c2VkIGFzIGRlc2NyaWJlZCBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSwgaXQKK3NoYWxsIG5vdCB0cmFuc2xhdGUgdGhlIGZpbGUgZGF0YSBpbnRvIGFueSBvdGhlciBlbmNvZGluZy4gVGhlCitCSU5BUlkgZW50cnkgaW5kaWNhdGVzIHVuZW5jb2RlZCBiaW5hcnkgZGF0YS4KKworICAgIFdoZW4gdXNlZCBpbiB3cml0ZSBvciBjb3B5IG1vZGUsIGl0IGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQKK3doZXRoZXIgcGF4IGluY2x1ZGVzIGEgY2hhcnNldCBleHRlbmRlZCBoZWFkZXIgcmVjb3JkIGZvciBhIGZpbGUuCisKK2NvbW1lbnQKKyAgICBBIHNlcmllcyBvZiBjaGFyYWN0ZXJzIHVzZWQgYXMgYSBjb21tZW50LiBBbGwgY2hhcmFjdGVycyBpbgordGhlIDx2YWx1ZT4gZmllbGQgc2hhbGwgYmUgaWdub3JlZCBieSBwYXguCisKK2dpZAorICAgIFRoZSBncm91cCBJRCBvZiB0aGUgZ3JvdXAgdGhhdCBvd25zIHRoZSBmaWxlLCBleHByZXNzZWQgYXMgYQorZGVjaW1hbCBudW1iZXIgdXNpbmcgZGlnaXRzIGZyb20gdGhlIElTTy9JRUMgNjQ2OjE5OTEgc3RhbmRhcmQuCitUaGlzIHJlY29yZCBzaGFsbCBvdmVycmlkZSB0aGUgZ2lkIGZpZWxkIGluIHRoZSBmb2xsb3dpbmcgaGVhZGVyCitibG9jayhzKS4gV2hlbiB1c2VkIGluIHdyaXRlIG9yIGNvcHkgbW9kZSwgcGF4IHNoYWxsIGluY2x1ZGUgYSBnaWQKK2V4dGVuZGVkIGhlYWRlciByZWNvcmQgZm9yIGVhY2ggZmlsZSB3aG9zZSBncm91cCBJRCBpcyBncmVhdGVyCit0aGFuIDIwOTcxNTEgKG9jdGFsIDc3Nzc3NzcpLgorCitnbmFtZQorICAgIFRoZSBncm91cCBvZiB0aGUgZmlsZShzKSwgZm9ybWF0dGVkIGFzIGEgZ3JvdXAgbmFtZSBpbiB0aGUKK2dyb3VwIGRhdGFiYXNlLiBUaGlzIHJlY29yZCBzaGFsbCBvdmVycmlkZSB0aGUgZ2lkIGFuZCBnbmFtZQorZmllbGRzIGluIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGJsb2NrKHMpLCBhbmQgYW55IGdpZCBleHRlbmRlZAoraGVhZGVyIHJlY29yZC4gV2hlbiB1c2VkIGluIHJlYWQsIGNvcHksIG9yIGxpc3QgbW9kZSwgcGF4IHNoYWxsCit0cmFuc2xhdGUgdGhlIG5hbWUgZnJvbSB0aGUgVVRGLTggZW5jb2RpbmcgaW4gdGhlIGhlYWRlciByZWNvcmQgdG8KK3RoZSBjaGFyYWN0ZXIgc2V0IGFwcHJvcHJpYXRlIGZvciB0aGUgZ3JvdXAgZGF0YWJhc2Ugb24gdGhlCityZWNlaXZpbmcgc3lzdGVtLiBJZiBhbnkgb2YgdGhlIFVURi04IGNoYXJhY3RlcnMgY2Fubm90IGJlCit0cmFuc2xhdGVkLCBhbmQgaWYgdGhlIC1vIGludmFsaWQ9IFVURi04IG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLAordGhlIHJlc3VsdHMgYXJlIGltcGxlbWVudGF0aW9uLWRlZmluZWQuIFdoZW4gdXNlZCBpbiB3cml0ZSBvciBjb3B5Cittb2RlLCBwYXggc2hhbGwgaW5jbHVkZSBhIGduYW1lIGV4dGVuZGVkIGhlYWRlciByZWNvcmQgZm9yIGVhY2gKK2ZpbGUgd2hvc2UgZ3JvdXAgbmFtZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZW50aXJlbHkgd2l0aCB0aGUKK2xldHRlcnMgYW5kIGRpZ2l0cyBvZiB0aGUgcG9ydGFibGUgY2hhcmFjdGVyIHNldC4KKworbGlua3BhdGgKKyAgICBUaGUgcGF0aG5hbWUgb2YgYSBsaW5rIGJlaW5nIGNyZWF0ZWQgdG8gYW5vdGhlciBmaWxlLCBvZiBhbnkKK3R5cGUsIHByZXZpb3VzbHkgYXJjaGl2ZWQuIFRoaXMgcmVjb3JkIHNoYWxsIG92ZXJyaWRlIHRoZSBsaW5rbmFtZQorZmllbGQgaW4gdGhlIGZvbGxvd2luZyB1c3RhciBoZWFkZXIgYmxvY2socykuIFRoZSBmb2xsb3dpbmcgdXN0YXIKK2hlYWRlciBibG9jayBzaGFsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbGluayBjcmVhdGVkLiBJZiB0eXBlZmxhZworb2YgdGhlIGZvbGxvd2luZyBoZWFkZXIgYmxvY2sgaXMgMSwgaXQgc2hhbGwgYmUgYSBoYXJkIGxpbmsuIElmCit0eXBlZmxhZyBpcyAyLCBpdCBzaGFsbCBiZSBhIHN5bWJvbGljIGxpbmsgYW5kIHRoZSBsaW5rcGF0aCB2YWx1ZQorc2hhbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2xpYyBsaW5rLiBUaGUgcGF4IHV0aWxpdHkgc2hhbGwKK3RyYW5zbGF0ZSB0aGUgbmFtZSBvZiB0aGUgbGluayAoY29udGVudHMgb2YgdGhlIHN5bWJvbGljIGxpbmspCitmcm9tIHRoZSBVVEYtOCBlbmNvZGluZyB0byB0aGUgY2hhcmFjdGVyIHNldCBhcHByb3ByaWF0ZSBmb3IgdGhlCitsb2NhbCBmaWxlIHN5c3RlbS4gV2hlbiB1c2VkIGluIHdyaXRlIG9yIGNvcHkgbW9kZSwgcGF4IHNoYWxsCitpbmNsdWRlIGEgbGlua3BhdGggZXh0ZW5kZWQgaGVhZGVyIHJlY29yZCBmb3IgZWFjaCBsaW5rIHdob3NlCitwYXRobmFtZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZW50aXJlbHkgd2l0aCB0aGUgbWVtYmVycyBvZiB0aGUKK3BvcnRhYmxlIGNoYXJhY3RlciBzZXQgb3RoZXIgdGhhbiBOVUwuCisKK210aW1lCisgICAgVGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZvbGxvd2luZyBmaWxlKHMpLAorZXF1aXZhbGVudCB0byB0aGUgdmFsdWUgb2YgdGhlIHN0X210aW1lIG1lbWJlciBvZiB0aGUgc3RhdAorc3RydWN0dXJlIGZvciBhIGZpbGUsIGFzIGRlc2NyaWJlZCBpbiB0aGUgc3RhdCgpIGZ1bmN0aW9uLiBUaGlzCityZWNvcmQgc2hhbGwgb3ZlcnJpZGUgdGhlIG10aW1lIGZpZWxkIGluIHRoZSBmb2xsb3dpbmcgaGVhZGVyCitibG9jayhzKS4gVGhlIG1vZGlmaWNhdGlvbiB0aW1lIHNoYWxsIGJlIHJlc3RvcmVkIGlmIHRoZSBwcm9jZXNzCitoYXMgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZSByZXF1aXJlZCB0byBkbyBzby4gVGhlIGZvcm1hdCBvZiB0aGUKKzx2YWx1ZT4gc2hhbGwgYmUgYXMgZGVzY3JpYmVkIGluIHBheCBFeHRlbmRlZCBIZWFkZXIgRmlsZSBUaW1lcy4KKworcGF0aAorICAgIFRoZSBwYXRobmFtZSBvZiB0aGUgZm9sbG93aW5nIGZpbGUocykuIFRoaXMgcmVjb3JkIHNoYWxsCitvdmVycmlkZSB0aGUgbmFtZSBhbmQgcHJlZml4IGZpZWxkcyBpbiB0aGUgZm9sbG93aW5nIGhlYWRlcgorYmxvY2socykuIFRoZSBwYXggdXRpbGl0eSBzaGFsbCB0cmFuc2xhdGUgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlCitmcm9tIHRoZSBVVEYtOCBlbmNvZGluZyB0byB0aGUgY2hhcmFjdGVyIHNldCBhcHByb3ByaWF0ZSBmb3IgdGhlCitsb2NhbCBmaWxlIHN5c3RlbS4KKworICAgIFdoZW4gdXNlZCBpbiB3cml0ZSBvciBjb3B5IG1vZGUsIHBheCBzaGFsbCBpbmNsdWRlIGEgcGF0aAorZXh0ZW5kZWQgaGVhZGVyIHJlY29yZCBmb3IgZWFjaCBmaWxlIHdob3NlIHBhdGhuYW1lIGNhbm5vdCBiZQorcmVwcmVzZW50ZWQgZW50aXJlbHkgd2l0aCB0aGUgbWVtYmVycyBvZiB0aGUgcG9ydGFibGUgY2hhcmFjdGVyCitzZXQgb3RoZXIgdGhhbiBOVUwuCisKK3JlYWx0aW1lLmFueQorICAgIFRoZSBrZXl3b3JkcyBwcmVmaXhlZCBieSAicmVhbHRpbWUuIiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZQorc3RhbmRhcmRpemF0aW9uLgorCitzZWN1cml0eS5hbnkKKyAgICBUaGUga2V5d29yZHMgcHJlZml4ZWQgYnkgInNlY3VyaXR5LiIgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUKK3N0YW5kYXJkaXphdGlvbi4KKworc2l6ZQorICAgIFRoZSBzaXplIG9mIHRoZSBmaWxlIGluIG9jdGV0cywgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbCBudW1iZXIKK3VzaW5nIGRpZ2l0cyBmcm9tIHRoZSBJU08vSUVDIDY0NjoxOTkxIHN0YW5kYXJkLiBUaGlzIHJlY29yZCBzaGFsbAorb3ZlcnJpZGUgdGhlIHNpemUgZmllbGQgaW4gdGhlIGZvbGxvd2luZyBoZWFkZXIgYmxvY2socykuIFdoZW4KK3VzZWQgaW4gd3JpdGUgb3IgY29weSBtb2RlLCBwYXggc2hhbGwgaW5jbHVkZSBhIHNpemUgZXh0ZW5kZWQKK2hlYWRlciByZWNvcmQgZm9yIGVhY2ggZmlsZSB3aXRoIGEgc2l6ZSB2YWx1ZSBncmVhdGVyIHRoYW4KKzg1ODk5MzQ1OTEgKG9jdGFsIDc3Nzc3Nzc3Nzc3KS4KKwordWlkCisgICAgVGhlIHVzZXIgSUQgb2YgdGhlIGZpbGUgb3duZXIsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwgbnVtYmVyCit1c2luZyBkaWdpdHMgZnJvbSB0aGUgSVNPL0lFQyA2NDY6MTk5MSBzdGFuZGFyZC4gVGhpcyByZWNvcmQgc2hhbGwKK292ZXJyaWRlIHRoZSB1aWQgZmllbGQgaW4gdGhlIGZvbGxvd2luZyBoZWFkZXIgYmxvY2socykuIFdoZW4gdXNlZAoraW4gd3JpdGUgb3IgY29weSBtb2RlLCBwYXggc2hhbGwgaW5jbHVkZSBhIHVpZCBleHRlbmRlZCBoZWFkZXIKK3JlY29yZCBmb3IgZWFjaCBmaWxlIHdob3NlIG93bmVyIElEIGlzIGdyZWF0ZXIgdGhhbiAyMDk3MTUxIChvY3RhbAorNzc3Nzc3NykuCisKK3VuYW1lCisgICAgVGhlIG93bmVyIG9mIHRoZSBmb2xsb3dpbmcgZmlsZShzKSwgZm9ybWF0dGVkIGFzIGEgdXNlciBuYW1lCitpbiB0aGUgdXNlciBkYXRhYmFzZS4gVGhpcyByZWNvcmQgc2hhbGwgb3ZlcnJpZGUgdGhlIHVpZCBhbmQgdW5hbWUKK2ZpZWxkcyBpbiB0aGUgZm9sbG93aW5nIGhlYWRlciBibG9jayhzKSwgYW5kIGFueSB1aWQgZXh0ZW5kZWQKK2hlYWRlciByZWNvcmQuIFdoZW4gdXNlZCBpbiByZWFkLCBjb3B5LCBvciBsaXN0IG1vZGUsIHBheCBzaGFsbAordHJhbnNsYXRlIHRoZSBuYW1lIGZyb20gdGhlIFVURi04IGVuY29kaW5nIGluIHRoZSBoZWFkZXIgcmVjb3JkIHRvCit0aGUgY2hhcmFjdGVyIHNldCBhcHByb3ByaWF0ZSBmb3IgdGhlIHVzZXIgZGF0YWJhc2Ugb24gdGhlCityZWNlaXZpbmcgc3lzdGVtLiBJZiBhbnkgb2YgdGhlIFVURi04IGNoYXJhY3RlcnMgY2Fubm90IGJlCit0cmFuc2xhdGVkLCBhbmQgaWYgdGhlIC1vIGludmFsaWQ9IFVURi04IG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLAordGhlIHJlc3VsdHMgYXJlIGltcGxlbWVudGF0aW9uLWRlZmluZWQuIFdoZW4gdXNlZCBpbiB3cml0ZSBvciBjb3B5Cittb2RlLCBwYXggc2hhbGwgaW5jbHVkZSBhIHVuYW1lIGV4dGVuZGVkIGhlYWRlciByZWNvcmQgZm9yIGVhY2gKK2ZpbGUgd2hvc2UgdXNlciBuYW1lIGNhbm5vdCBiZSByZXByZXNlbnRlZCBlbnRpcmVseSB3aXRoIHRoZQorbGV0dGVycyBhbmQgZGlnaXRzIG9mIHRoZSBwb3J0YWJsZSBjaGFyYWN0ZXIgc2V0LgorCitJZiB0aGUgPHZhbHVlPiBmaWVsZCBpcyB6ZXJvIGxlbmd0aCwgaXQgc2hhbGwgZGVsZXRlIGFueSBoZWFkZXIKK2Jsb2NrIGZpZWxkLCBwcmV2aW91c2x5IGVudGVyZWQgZXh0ZW5kZWQgaGVhZGVyIHZhbHVlLCBvciBnbG9iYWwKK2V4dGVuZGVkIGhlYWRlciB2YWx1ZSBvZiB0aGUgc2FtZSBuYW1lLgorCitJZiBhIGtleXdvcmQgaW4gYW4gZXh0ZW5kZWQgaGVhZGVyIHJlY29yZCAob3IgaW4gYSAtbworb3B0aW9uLWFyZ3VtZW50KSBvdmVycmlkZXMgb3IgZGVsZXRlcyBhIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCit1c3RhciBoZWFkZXIgYmxvY2ssIHBheCBzaGFsbCBpZ25vcmUgdGhlIGNvbnRlbnRzIG9mIHRoYXQgaGVhZGVyCitibG9jayBmaWVsZC4KKworVW5saWtlIHRoZSB1c3RhciBoZWFkZXIgYmxvY2sgZmllbGRzLCBOVUxzIHNoYWxsIG5vdCBkZWxpbWl0Cis8dmFsdWU+czsgYWxsIGNoYXJhY3RlcnMgd2l0aGluIHRoZSA8dmFsdWU+IGZpZWxkIHNoYWxsIGJlCitjb25zaWRlcmVkIGRhdGEgZm9yIHRoZSBmaWVsZC4gTm9uZSBvZiB0aGUgbGVuZ3RoIGxpbWl0YXRpb25zIG9mCit0aGUgdXN0YXIgaGVhZGVyIGJsb2NrIGZpZWxkcyBpbiB1c3RhciBIZWFkZXIgQmxvY2sgc2hhbGwgYXBwbHkgdG8KK3RoZSBleHRlbmRlZCBoZWFkZXIgcmVjb3Jkcy4KKworcGF4IEV4dGVuZGVkIEhlYWRlciBGaWxlIFRpbWVzCisKK1RpbWUgcmVjb3JkcyBzaGFsbCBiZSBmb3JtYXR0ZWQgYXMgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQordGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4gSWYgYSBwZXJpb2QgKCAnLicgKSBkZWNpbWFsIHBvaW50CitjaGFyYWN0ZXIgaXMgcHJlc2VudCwgdGhlIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlIHBvaW50IHNoYWxsCityZXByZXNlbnQgdGhlIHVuaXRzIG9mIGEgc3Vic2Vjb25kIHRpbWluZyBncmFudWxhcml0eS4gSW4gcmVhZCBvcgorY29weSBtb2RlLCB0aGUgcGF4IHV0aWxpdHkgc2hhbGwgdHJ1bmNhdGUgdGhlIHRpbWUgb2YgYSBmaWxlIHRvCit0aGUgZ3JlYXRlc3QgdmFsdWUgdGhhdCBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dCBoZWFkZXIKK2ZpbGUgdGltZS4gSW4gd3JpdGUgb3IgY29weSBtb2RlLCB0aGUgcGF4IHV0aWxpdHkgc2hhbGwgb3V0cHV0IGEKK3RpbWUgZXhhY3RseSBpZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGRlY2ltYWwgbnVtYmVyLAorYW5kIG90aGVyd2lzZSBzaGFsbCBnZW5lcmF0ZSBvbmx5IGVub3VnaCBkaWdpdHMgc28gdGhhdCB0aGUgc2FtZQordGltZSBzaGFsbCBiZSByZWNvdmVyZWQgaWYgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIG9uIGEgc3lzdGVtIHdob3NlCit1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBzYW1lIHRpbWUgZ3JhbnVsYXJpdHkuCisKK0V4YW1wbGUgZnJvbSBMaW51eCBrZXJuZWwgYXJjaGl2ZSB0YXJiYWxsOgorCiswMDAwMDAwMCAgNzAgNjEgNzggNWYgNjcgNmMgNmYgNjIgIDYxIDZjIDVmIDY4IDY1IDYxIDY0IDY1ICB8cGF4X2dsb2JhbF9oZWFkZXwKKzAwMDAwMDEwICA3MiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHxyLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwMjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDAzMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMDQwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwNTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDA2MCAgMDAgMDAgMDAgMDAgMzAgMzAgMzAgMzAgIDM2IDM2IDM2IDAwIDMwIDMwIDMwIDMwICB8Li4uLjAwMDA2NjYuMDAwMHwKKzAwMDAwMDcwICAzMCAzMCAzMCAwMCAzMCAzMCAzMCAzMCAgMzAgMzAgMzAgMDAgMzAgMzAgMzAgMzAgIHwwMDAuMDAwMDAwMC4wMDAwfAorMDAwMDAwODAgIDMwIDMwIDMwIDMwIDMwIDM2IDM0IDAwICAzMCAzMCAzMCAzMCAzMCAzMCAzMCAzMCAgfDAwMDAwNjQuMDAwMDAwMDB8CiswMDAwMDA5MCAgMzAgMzAgMzAgMDAgMzAgMzAgMzEgMzQgIDMwIDM1IDMzIDAwIDY3IDAwIDAwIDAwICB8MDAwLjAwMTQwNTMuZy4uLnwKKzAwMDAwMGEwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwYjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDBjMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMGQwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwZTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDBmMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMTAwICAwMCA3NSA3MyA3NCA2MSA3MiAwMCAzMCAgMzAgNjcgNjkgNzQgMDAgMDAgMDAgMDAgIHwudXN0YXIuMDBnaXQuLi4ufAorMDAwMDAxMTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDEyMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDY3IDY5IDc0IDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uZ2l0Li4uLnwKKzAwMDAwMTMwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxNDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAzMCAzMCAzMCAzMCAzMCAzMCAzMCAgfC4uLi4uLi4uLjAwMDAwMDB8CiswMDAwMDE1MCAgMDAgMzAgMzAgMzAgMzAgMzAgMzAgMzAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8LjAwMDAwMDAuLi4uLi4uLnwKKzAwMDAwMTYwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxNzAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDE4MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMTkwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxYTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDFiMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMWMwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxZDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDFlMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMWYwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAyMDAgIDM1IDMyIDIwIDYzIDZmIDZkIDZkIDY1ICA2ZSA3NCAzZCA2MiAzMSAzMCAzNSAzMCAgfDUyIGNvbW1lbnQ9YjEwNTB8CiswMDAwMDIxMCAgMzIgNjIgMzIgMzIgNjEgMzEgMzIgMzAgIDM5IDY0IDM2IDYyIDM0IDM3IDM2IDMzICB8MmIyMmExMjA5ZDZiNDc2M3wKKzAwMDAwMjIwICAzOSA2NCAzOCAzOCA2MiAzOCAzMSAzMiAgNjIgMzIgMzEgNjYgNjIgMzUgMzkgMzQgIHw5ZDg4YjgxMmIyMWZiNTk0fAorMDAwMDAyMzAgIDM5IDY1IDM0IDBhIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfDllNC4uLi4uLi4uLi4uLi58CiswMDAwMDI0MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKy4uLgpkaWZmIC0tZ2l0IGEvZG9jcy91bmljb2RlLnR4dCBiL2RvY3MvdW5pY29kZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxNTljZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdW5pY29kZS50eHQKQEAgLTAsMCArMSw3MSBAQAorCVVuaWNvZGUgc3VwcG9ydCBpbiBidXN5Ym94CisKK1RoZXJlIGFyZSBzZXZlcmFsIHNjZW5hcmlvcyB3aGVyZSB3ZSBuZWVkIHRvIGhhbmRsZSB1bmljb2RlCitjb3JyZWN0bHkuCisKKwlTaGVsbCBpbnB1dAorCitXZSB3YW50IHRvIGNvcnJlY3RseSBoYW5kbGUgaW5wdXQgb2YgdW5pY29kZSBjaGFyYWN0ZXJzLgorVGhlcmUgYXJlIHNldmVyYWwgcHJvYmxlbXMgd2l0aCBpdC4gSnVzdCBoYW5kbGluZyBpbnB1dAorYXMgc2VxdWVuY2Ugb2YgYnl0ZXMgd291bGQgYnJlYWsgYW55IGVkaXRpbmcuIFRoaXMgd2FzIGZpeGVkCithbmQgbm93IGxpbmVlZGl0IG9wZXJhdGVzIG9uIHRoZSBhcnJheSBvZiB3Y2hhcl90J3MuCitCdXQgd2UgYWxzbyBuZWVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIHByb2JsZW1hdGljIG1vbWVudHM6CisKKyogSXQgaXMgdW5yZWFzb25hYmxlIHRvIGV4cGVjdCB0aGF0IG91dHB1dCBkZXZpY2Ugc3VwcG9ydHMKKyAgX2FueV8gdW5pY29kZSBjaGFycy4gUGVyaGFwcyB3ZSBuZWVkIHRvIGF2b2lkIHByaW50aW5nCisgIHRob3NlIGNoYXJzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IG91dHB1dCBkZXZpY2UuCisgIEV4YW1wbGVzOiBjaGFycyB3aGljaCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGZvbnQsCisgIGNoYXJzIHdoaWNoIGFyZSBub3QgYXNzaWduZWQgaW4gdW5pY29kZSwKKyAgY29tYmluaW5nIGNoYXJzIChlc3BlY2lhbGx5IHRyeWluZyB0byBjb21iaW5lIGJhZCBwYWlyczoKKyAgYV9jaGluZXNlX3N5bWJvbCArICJjb21iaW5pbmcgZ3JhdmUgYWNjZW50IiA9ID8/ISkKKworKiBXZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdW5pY29kZSBjaGFycyBoYXZlCisgIGRpZmZlcmVudCB3aWR0aHM6IDAgZm9yIGNvbWJpbmluZyBjaGFycywgMSBmb3IgdXN1YWwsCisgIDIgZm9yIGlkZW9ncmFtcyAoYXJlIHRoZXJlIDMrIHdpZGUgY2hhcnM/KS4KKworKiBCaWRpcmVjdGlvbmFsIGhhbmRsaW5nLiBJZiB1c2VyIHdhbnRzIHRvIGVjaG8gYSBwaHJhc2UKKyAgaW4gSGVicmV3LCBoZSB0eXBlczogZWNobyAic3JldHRlbCB3ZXJiZUgiCisKKwlFZGl0b3JzICh2aSwgZWQpCisKK1RoaXMgY2FzZSBpcyBhIGJpdCBzaW1pbGFyIHRvICJzaGVsbCBpbnB1dCIsIGJ1dCB1bmxpa2Ugc2hlbGwsCitlZGl0b3JzIG1heSBlbmNvdW50ZXIgbWFueSBtb3JlIHVuZXhwZWN0ZWQgdW5pY29kZSBzZXF1ZW5jZXMKKyh0cnkgdG8gbG9hZCBhIHJhbmRvbSBiaW5hcnkgZmlsZS4uLiksIGFuZCB0aGV5IG5lZWQgdG8gcHJlc2VydmUKK3RoZW0sIHVubGlrZSBzaGVsbCB3aGljaCBjYW4gYWZmb3JkIHRvIGRyb3AgYm9ndXMgaW5wdXQuCisKKwltb3JlLCBsZXNzCisKK05lZWQgdG8gY29ycmVjdGx5IGRpc3BsYXkgYW55IGlucHV0IGZpbGUuIElkZWFsbHksIHdpdGgKK0FTQ0lJL3VuaWNvZGUvZmlsdGVyZWRfdW5pY29kZSBvcHRpb24gb3Iga2V5Ym9hcmQgc3dpdGNoLgorTm90ZTogbmVlZCB0byBoYW5kbGUgdGFicyBhbmQgYmFja3NwYWNlcyBzcGVjaWFsbHkKKyhia3NwIGlzIGZvciBtYW5wYWdlIGNvbXBhdCkuCisKKwljdXQsIGZvbGQsIHdhdGNoCisKK01heSBuZWVkIGFiaWxpdHkgdG8gY3V0IHVuaWNvZGUgc3RyaW5nIHRvIHNwZWNpZmllZCBudW1iZXIgb2Ygd2NoYXJzCithbmQvb3IgdG8gc3BlY2lmaWVkIHNjcmVlbiB3aWR0aC4gTmVlZCB0byBoYW5kbGUgdGFicyBzcGVjaWFsbHkuCisKKwlzZWQsIGF3aywgZ3JlcAorCitIYW5kbGUgdW5pY29kZS1hd2FyZSByZWdleHAgbWF0Y2gKKworCWxzIChtdWx0aS1jb2x1bW4gZGlzcGxheSkKKworbHMgd2lsbCBmYWlsIHRvIGxpbmUgdXAgY29sdW1uYXIgb3V0cHV0IGlmIGl0IHdpbGwgbm90IGFjY291bnQKK2ZvciBjaGFyYWN0ZXIgd2lkdGhzIChhbmQgbWF5YmUgZmlsdGVyIG91dCBzb21lIG9mIHRoZW0sIHNlZQorYWJvdmUpLiBPVE9ILCBub24tY29sdW1uYXIgdmlld3MgKGxzIC0xLCBscyAtbCwgbHMgfCBjYXIpCitzaG91bGQgTk9UIGZpbHRlciBvdXQgYmFkIHVuaWNvZGUgKGJ1dCBuZWVkIHRvIGZpbHRlciBvdXQKK2NvbnRyb2wgY2hhcnMgKGNvcmV1dGlscyBkb2VzIHRoYXQpLiBOb3RlIHRoYXQgdW5saWtlIG1vcmUvbGVzcywKK3RhYnMgYW5kIGJhY2tzcGFjZXMgbmVlZCBub3Qgc3BlY2lhbCBoYW5kbGluZy4KKworCXRvcCwgcHMKKworTmVlZCB0byBwZXJmb3JtIGZpbHRlcmluZyBzaW1pbGFyIHRvIGxzLgorCisJRmlsZW5hbWUgZGlzcGxheSAoaW4gZXJyb3IgbWVzc2FnZXMgYW5kIGVsc2V3aGVyZSkKKworTmVlZCB0byBwZXJmb3JtIGZpbHRlcmluZyBzaW1pbGFyIHRvIGxzLgorCisKK1RPRE86IHdyaXRlIGFuIGVtYWlsIHRvIEFzbXVzIEZyZXl0YWcgKGFzbXVzQHVuaWNvZGUub3JnKSwKK2F1dGhvciBvZiBodHRwOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjExLwpkaWZmIC0tZ2l0IGEvZG9jcy91bmljb2RlX1VURi04LXRlc3QudHh0IGIvZG9jcy91bmljb2RlX1VURi04LXRlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDE2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VuaWNvZGVfVVRGLTgtdGVzdC50eHQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91bmljb2RlX2Z1bGwtYm1wLnR4dCBiL2RvY3MvdW5pY29kZV9mdWxsLWJtcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlYWExZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdW5pY29kZV9mdWxsLWJtcC50eHQKQEAgLTAsMCArMSwyMDc5IEBACisKK0Z1bGwgQk1QIFRlc3QgRmlsZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hcmt1cyBLdWhuIDxodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvPiAtLSAyMDAzLTA0LTIyCisKK1RoaXMgZmlsZSBjb250YWlucyB0aGUgVVRGLTggc2VxdWVuY2VzIG9mIGFsbCBjb2RlIHBvc2l0aW9ucyBpbiB0aGUKK0lTTyAxMDY0Ni0xIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSwgZXhjZXB0IGZvciB0aGUgQzAgYW5kIEMxIGNvbnRyb2wKK2NoYXJhY3RlciBhcmVhcy4gVGhpcyBjb3JyZXNwb25kcyB0byBhbGwgY29kZXMgaW4gdGhlIHJhbmdlIFUrMDAyMCAtCitVKzAwN0UgYW5kIFUrMDBBMCAtIFUrRkZGRi4gW3VuaXNldCArMDAwMC4uZmZmZiB1dGY4LWxpc3RdCisKKworQmFzaWMgTGF0aW4gKFUrMDAwMC1VKzAwN0YpOgorCisgISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fCitgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+CisKK0xhdGluLTEgU3VwcGxlbWVudCAoVSswMDgwLVUrMDBGRik6CisKK8KgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfCivDoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/CisKK0xhdGluIEV4dGVuZGVkLUEgKFUrMDEwMC1VKzAxN0YpOgorCivEgMSBxILEg8SExIXEhsSHxIjEicSKxIvEjMSNxI7Ej8SQxJHEksSTxJTElcSWxJfEmMSZxJrEm8ScxJ3EnsSfxKDEocSixKPEpMSlxKbEp8SoxKnEqsSrxKzErcSuxK/EsMSxxLLEs8S0xLXEtsS3xLjEucS6xLvEvMS9xL7EvworxYDFgcWCxYPFhMWFxYbFh8WIxYnFisWLxYzFjcWOxY/FkMWRxZLFk8WUxZXFlsWXxZjFmcWaxZvFnMWdxZ7Fn8WgxaHFosWjxaTFpcWmxafFqMWpxarFq8Wsxa3FrsWvxbDFscWyxbPFtMW1xbbFt8W4xbnFusW7xbzFvcW+xb8KKworTGF0aW4gRXh0ZW5kZWQtQiAoVSswMTgwLVUrMDI0Rik6CisKK8aAxoHGgsaDxoTGhcaGxofGiMaJxorGi8aMxo3GjsaPxpDGkcaSxpPGlMaVxpbGl8aYxpnGmsabxpzGncaexp/GoMahxqLGo8akxqXGpsanxqjGqcaqxqvGrMatxq7Gr8awxrHGssazxrTGtca2xrfGuMa5xrrGu8a8xr3Gvsa/CivHgMeBx4LHg8eEx4XHhseHx4jHiceKx4vHjMeNx47Hj8eQx5HHkseTx5THlceWx5fHmMeZx5rHm8ecx53Hnsefx6DHoceix6PHpMelx6bHp8eox6nHqserx6zHrceux6/HsMexx7LHs8e0x7XHtse3x7jHuce6x7vHvMe9x77HvworyIDIgciCyIPIhMiFyIbIh8iIyInIisiLyIzIjciOyI/IkMiRyJLIk8iUyJXIlsiXyJjImciayJvInMidyJ7In8igyKHIosijyKTIpcimyKfIqMipyKrIq8isyK3IrsivyLDIsciyyLPItMi1yLbIt8i4yLnIusi7yLzIvci+yL8KK8mAyYHJgsmDyYTJhcmGyYfJiMmJyYrJi8mMyY3JjsmPCisKK0lQQSBFeHRlbnNpb25zIChVKzAyNTAtVSswMkFGKToKKworyZDJkcmSyZPJlMmVyZbJl8mYyZnJmsmbyZzJncmeyZ/JoMmhyaLJo8mkyaXJpsmnyajJqcmqyavJrMmtya7Jr8mwybHJssmzybTJtcm2ybfJuMm5ybrJu8m8yb3Jvsm/yoDKgcqCyoPKhMqFyobKh8qIyonKisqLyozKjcqOyo8KK8qQypHKksqTypTKlcqWypfKmMqZyprKm8qcyp3KnsqfyqDKocqiyqPKpMqlyqbKp8qoyqnKqsqryqzKrcquyq8KKworU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIChVKzAyQjAtVSswMkZGKToKKworyrDKscqyyrPKtMq1yrbKt8q4yrnKusq7yrzKvcq+yr/LgMuBy4LLg8uEy4XLhsuHy4jLicuKy4vLjMuNy47Lj8uQy5HLksuTy5TLlcuWy5fLmMuZy5rLm8ucy53Lnsufy6DLocuiy6PLpMuly6bLp8uoy6nLqsury6zLrcuuy68KK8uwy7HLssuzy7TLtcu2y7fLuMu5y7rLu8u8y73Lvsu/CisKK0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyAoVSswMzAwLVUrMDM2Rik6CisKK+KXjMyA4peMzIHil4zMguKXjMyD4peMzITil4zMheKXjMyG4peMzIfil4zMiOKXjMyJ4peMzIril4zMi+KXjMyM4peMzI3il4zMjuKXjMyP4peMzJDil4zMkeKXjMyS4peMzJPil4zMlOKXjMyV4peMzJbil4zMl+KXjMyY4peMzJnil4zMmuKXjMyb4peMzJzil4zMneKXjMye4peMzJ/il4zMoOKXjMyh4peMzKLil4zMo+KXjMyk4peMzKXil4zMpuKXjMyn4peMzKjil4zMqeKXjMyq4peMzKvil4zMrOKXjMyt4peMzK7il4zMr+KXjMyw4peMzLHil4zMsuKXjMyz4peMzLTil4zMteKXjMy24peMzLfil4zMuOKXjMy54peMzLril4zMu+KXjMy84peMzL3il4zMvuKXjMy/Civil4zNgOKXjM2B4peMzYLil4zNg+KXjM2E4peMzYXil4zNhuKXjM2H4peMzYjil4zNieKXjM2K4peMzYvil4zNjOKXjM2N4peMzY7il4zNj82QzZHNks2TzZTNlc2WzZfNmM2ZzZrNm82czZ3Nns2f4peMzaDil4zNoeKXjM2i4peMzaPil4zNpOKXjM2l4peMzabil4zNp+KXjM2o4peMzanil4zNquKXjM2r4peMzazil4zNreKXjM2u4peMza8KKworR3JlZWsgYW5kIENvcHRpYyAoVSswMzcwLVUrMDNGRik6CisKK82wzbHNss2zzbTNtc22zbfNuM25zbrNu828zb3Nvs2/zoDOgc6CzoPOhM6FzobOh86IzonOis6LzozOjc6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOos6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vCivOsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz43Pjs+Pz5DPkc+Sz5PPlM+Vz5bPl8+Yz5nPms+bz5zPnc+ez5/PoM+hz6LPo8+kz6XPps+nz6jPqc+qz6vPrM+tz67Prworz7DPsc+yz7PPtM+1z7bPt8+4z7nPus+7z7zPvc++z78KKworQ3lyaWxsaWMgKFUrMDQwMC1VKzA0RkYpOgorCivQgNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjNCN0I7Qj9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qvwor0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/RkNGR0ZLRk9GU0ZXRltGX0ZjRmdGa0ZvRnNGd0Z7Rn9Gg0aHRotGj0aTRpdGm0afRqNGp0arRq9Gs0a3RrtGv0bDRsdGy0bPRtNG10bbRt9G40bnRutG70bzRvdG+0b8KK9KA0oHSguKXjNKD4peM0oTil4zSheKXjNKG0ocg0ogg0onSitKL0ozSjdKO0o/SkNKR0pLSk9KU0pXSltKX0pjSmdKa0pvSnNKd0p7Sn9Kg0qHSotKj0qTSpdKm0qfSqNKp0qrSq9Ks0q3SrtKv0rDSsdKy0rPStNK10rbSt9K40rnSutK70rzSvdK+0r8KK9OA04HTgtOD04TThdOG04fTiNOJ04rTi9OM043TjtOP05DTkdOS05PTlNOV05bTl9OY05nTmtOb05zTndOe05/ToNOh06LTo9Ok06XTptOn06jTqdOq06vTrNOt067Tr9Ow07HTstOz07TTtdO207fTuNO507rTu9O8073TvtO/CisKK0N5cmlsbGljIFN1cHBsZW1lbnRhcnkgKFUrMDUwMC1VKzA1MkYpOgorCivUgNSB1ILUg9SE1IXUhtSH1IjUidSK1IvUjNSN1I7Uj9SQ1JHUktST1JTUldSW1JfUmNSZ1JrUm9Sc1J3UntSf1KDUodSi1KPUpNSl1KbUp9So1KnUqtSr1KzUrdSu1K8KKworQXJtZW5pYW4gKFUrMDUzMC1VKzA1OEYpOgorCivUsNSx1LLUs9S01LXUttS31LjUudS61LvUvNS91L7Uv9WA1YHVgtWD1YTVhdWG1YfViNWJ1YrVi9WM1Y3VjtWP1ZDVkdWS1ZPVlNWV1ZbVl9WY1ZnVmtWb1ZzVndWe1Z/VoNWh1aLVo9Wk1aXVptWn1ajVqdWq1avVrNWt1a7Vrwor1bDVsdWy1bPVtNW11bbVt9W41bnVutW71bzVvdW+1b/WgNaB1oLWg9aE1oXWhtaH1ojWidaK1ovWjNaN1o7WjworCitIZWJyZXcgKFUrMDU5MC1VKzA1RkYpOgorCivWkOKXjNaR4peM1pLil4zWk+KXjNaU4peM1pXil4zWluKXjNaX4peM1pjil4zWmeKXjNaa4peM1pvil4zWnOKXjNad4peM1p7il4zWn+KXjNag4peM1qHWouKXjNaj4peM1qTil4zWpeKXjNam4peM1qfil4zWqOKXjNap4peM1qril4zWq+KXjNas4peM1q3il4zWruKXjNav4peM1rDil4zWseKXjNay4peM1rPil4zWtOKXjNa14peM1rbil4zWt+KXjNa44peM1rnWuuKXjNa74peM1rzil4zWvda+4peM1r/XgOKXjNeB4peM14LXg+KXjNeE14XXhteH14jXideK14vXjNeN147Xjwor15DXkdeS15PXlNeV15bXl9eY15nXmteb15zXndee15/XoNeh16LXo9ek16XXpten16jXqdeq16vXrNet167Xr9ew17HXstez17TXtde217fXuNe517rXu9e8173Xvte/CisKK0FyYWJpYyAoVSswNjAwLVUrMDZGRik6CisKK9iA2IHYgtiD2ITYhdiG2IfYiNiJ2IrYi9iM2I3YjtiP2JDYkdiS2JPYlNiV2JbYl9iY2JnYmtib2JzYndie2J/YoNih2KLYo9ik2KXYptin2KjYqdiq2KvYrNit2K7Yr9iw2LHYstiz2LTYtdi22LfYuNi52LrYu9i82L3Yvti/CivZgNmB2YLZg9mE2YXZhtmH2YjZidmK4peM2Yvil4zZjOKXjNmN4peM2Y7il4zZj+KXjNmQ4peM2ZHil4zZkuKXjNmT4peM2ZTil4zZldmW2ZfZmNmZ2ZrZm9mc2Z3Zntmf2aDZodmi2aPZpNml2abZp9mo2anZqtmr2azZrdmu2a/il4zZsNmx2bLZs9m02bXZttm32bjZudm62bvZvNm92b7Zvwor2oDagdqC2oPahNqF2obah9qI2onaitqL2ozajdqO2o/akNqR2pLak9qU2pXaltqX2pjamdqa2pvanNqd2p7an9qg2qHaotqj2qTapdqm2qfaqNqp2qraq9qs2q3artqv2rDasdqy2rPatNq12rbat9q42rnautq72rzavdq+2r8KK9uA24HbgtuD24TbhduG24fbiNuJ24rbi9uM243bjtuP25DbkduS25PblNuV4peM25bil4zbl+KXjNuY4peM25nil4zbmuKXjNub4peM25zbnSDbnuKXjNuf4peM26Dil4zboeKXjNui4peM26Pil4zbpNul26bil4zbp+KXjNuo26nil4zbquKXjNur4peM26zil4zbrduu26/bsNux27Lbs9u027Xbttu327jbudu627vbvNu9277bvworCitTeXJpYWMgKFUrMDcwMC1VKzA3NEYpOgorCivcgNyB3ILcg9yE3IXchtyH3IjcidyK3IvcjNyN3I7cj9yQ4peM3JHcktyT3JTcldyW3JfcmNyZ3Jrcm9yc3J3cntyf3KDcodyi3KPcpNyl3Kbcp9yo3Kncqtyr3Kzcrdyu3K/il4zcsOKXjNyx4peM3LLil4zcs+KXjNy04peM3LXil4zctuKXjNy34peM3Ljil4zcueKXjNy64peM3Lvil4zcvOKXjNy94peM3L7il4zcvwor4peM3YDil4zdgeKXjN2C4peM3YPil4zdhOKXjN2F4peM3Ybil4zdh+KXjN2I4peM3Ynil4zdit2L3Yzdjd2O3Y8KKworRnJlZSBibG9jayAoVSswNzUwLVUrMDc3Rik6CisKK92Q3ZHdkt2T3ZTdld2W3ZfdmN2Z3Zrdm92c3Z3dnt2f3aDdod2i3aPdpN2l3abdp92o3andqt2r3azdrd2u3a/dsN2x3bLds9203bXdtt233bjdud263bvdvN293b7dvworCitUaGFhbmEgKFUrMDc4MC1VKzA3QkYpOgorCivegN6B3oLeg96E3oXeht6H3ojeid6K3ovejN6N3o7ej96Q3pHekt6T3pTeld6W3pfemN6Z3prem96c3p3ent6f3qDeod6i3qPepN6l4peM3qbil4zep+KXjN6o4peM3qnil4zequKXjN6r4peM3qzil4zereKXjN6u4peM3q/il4zesN6x3rLes9603rXett633rjeud663rvevN693r7evworCitGcmVlIGJsb2NrIChVKzA3QzAtVSswOEZGKToKKwor34Dfgd+C34PfhN+F34bfh9+I34nfit+L34zfjd+O34/fkN+R35Lfk9+U35Xflt+X35jfmd+a35vfnN+d357fn9+g36Hfot+j36Tfpd+m36ffqN+p36rfq9+s363frt+v37Dfsd+y37PftN+137bft9+437nfut+737zfvd++378KK+CggOCggeCgguCgg+CghOCgheCghuCgh+CgiOCgieCgiuCgi+CgjOCgjeCgjuCgj+CgkOCgkeCgkuCgk+CglOCgleCgluCgl+CgmOCgmeCgmuCgm+CgnOCgneCgnuCgn+CgoOCgoeCgouCgo+CgpOCgpeCgpuCgp+CgqOCgqeCgquCgq+CgrOCgreCgruCgr+CgsOCgseCgsuCgs+CgtOCgteCgtuCgt+CguOCgueCguuCgu+CgvOCgveCgvuCgvwor4KGA4KGB4KGC4KGD4KGE4KGF4KGG4KGH4KGI4KGJ4KGK4KGL4KGM4KGN4KGO4KGP4KGQ4KGR4KGS4KGT4KGU4KGV4KGW4KGX4KGY4KGZ4KGa4KGb4KGc4KGd4KGe4KGf4KGg4KGh4KGi4KGj4KGk4KGl4KGm4KGn4KGo4KGp4KGq4KGr4KGs4KGt4KGu4KGv4KGw4KGx4KGy4KGz4KG04KG14KG24KG34KG44KG54KG64KG74KG84KG94KG+4KG/CivgooDgooHgooLgooPgooTgooXgoobgoofgoojgoongoorgoovgoozgoo3goo7goo/gopDgopHgopLgopPgopTgopXgopbgopfgopjgopngoprgopvgopzgop3gop7gop/goqDgoqHgoqLgoqPgoqTgoqXgoqbgoqfgoqjgoqngoqrgoqvgoqzgoq3goq7goq/gorDgorHgorLgorPgorTgorXgorbgorfgorjgorngorrgorvgorzgor3gor7gor8KK+CjgOCjgeCjguCjg+CjhOCjheCjhuCjh+CjiOCjieCjiuCji+CjjOCjjeCjjuCjj+CjkOCjkeCjkuCjk+CjlOCjleCjluCjl+CjmOCjmeCjmuCjm+CjnOCjneCjnuCjn+CjoOCjoeCjouCjo+CjpOCjpeCjpuCjp+CjqOCjqeCjquCjq+CjrOCjreCjruCjr+CjsOCjseCjsuCjs+CjtOCjteCjtuCjt+CjuOCjueCjuuCju+CjvOCjveCjvuCjvworCitEZXZhbmFnYXJpIChVKzA5MDAtVSswOTdGKToKKwor4KSA4peM4KSB4peM4KSC4KSD4KSE4KSF4KSG4KSH4KSI4KSJ4KSK4KSL4KSM4KSN4KSO4KSP4KSQ4KSR4KSS4KST4KSU4KSV4KSW4KSX4KSY4KSZ4KSa4KSb4KSc4KSd4KSe4KSf4KSg4KSh4KSi4KSj4KSk4KSl4KSm4KSn4KSo4KSp4KSq4KSr4KSs4KSt4KSu4KSv4KSw4KSx4KSy4KSz4KS04KS14KS24KS34KS44KS54KS64KS74peM4KS84KS94KS+4KS/CivgpYDil4zgpYHil4zgpYLil4zgpYPil4zgpYTil4zgpYXil4zgpYbil4zgpYfil4zgpYjgpYngpYrgpYvgpYzil4zgpY3gpY7gpY/gpZDil4zgpZHil4zgpZLil4zgpZPil4zgpZTgpZXgpZbgpZfgpZjgpZngpZrgpZvgpZzgpZ3gpZ7gpZ/gpaDgpaHil4zgpaLil4zgpaPgpaTgpaXgpabgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpbDgpbHgpbLgpbPgpbTgpbXgpbbgpbfgpbjgpbngpbrgpbvgpbzgpb3gpb7gpb8KKworQmVuZ2FsaSAoVSswOTgwLVUrMDlGRik6CisKK+CmgOKXjOCmgeCmguCmg+CmhOCmheCmhuCmh+CmiOCmieCmiuCmi+CmjOCmjeCmjuCmj+CmkOCmkeCmkuCmk+CmlOCmleCmluCml+CmmOCmmeCmmuCmm+CmnOCmneCmnuCmn+CmoOCmoeCmouCmo+CmpOCmpeCmpuCmp+CmqOCmqeCmquCmq+CmrOCmreCmruCmr+CmsOCmseCmsuCms+CmtOCmteCmtuCmt+CmuOCmueCmuuCmu+KXjOCmvOCmveCmvuCmvwor4KeA4peM4KeB4peM4KeC4peM4KeD4peM4KeE4KeF4KeG4KeH4KeI4KeJ4KeK4KeL4KeM4peM4KeN4KeO4KeP4KeQ4KeR4KeS4KeT4KeU4KeV4KeW4KeX4KeY4KeZ4Kea4Keb4Kec4Ked4Kee4Kef4Keg4Keh4peM4Kei4peM4Kej4Kek4Kel4Kem4Ken4Keo4Kep4Keq4Ker4Kes4Ket4Keu4Kev4Kew4Kex4Key4Kez4Ke04Ke14Ke24Ke34Ke44Ke54Ke64Ke74Ke84Ke94Ke+4Ke/CisKK0d1cm11a2hpIChVKzBBMDAtVSswQTdGKToKKwor4KiA4KiB4peM4KiC4KiD4KiE4KiF4KiG4KiH4KiI4KiJ4KiK4KiL4KiM4KiN4KiO4KiP4KiQ4KiR4KiS4KiT4KiU4KiV4KiW4KiX4KiY4KiZ4Kia4Kib4Kic4Kid4Kie4Kif4Kig4Kih4Kii4Kij4Kik4Kil4Kim4Kin4Kio4Kip4Kiq4Kir4Kis4Kit4Kiu4Kiv4Kiw4Kix4Kiy4Kiz4Ki04Ki14Ki24Ki34Ki44Ki54Ki64Ki74peM4Ki84Ki94Ki+4Ki/CivgqYDil4zgqYHil4zgqYLgqYPgqYTgqYXgqYbil4zgqYfil4zgqYjgqYngqYril4zgqYvil4zgqYzil4zgqY3gqY7gqY/gqZDgqZHgqZLgqZPgqZTgqZXgqZbgqZfgqZjgqZngqZrgqZvgqZzgqZ3gqZ7gqZ/gqaDgqaHgqaLgqaPgqaTgqaXgqabgqafgqajgqangqargqavgqazgqa3gqa7gqa/il4zgqbDil4zgqbHgqbLgqbPgqbTgqbXgqbbgqbfgqbjgqbngqbrgqbvgqbzgqb3gqb7gqb8KKworR3VqYXJhdGkgKFUrMEE4MC1VKzBBRkYpOgorCivgqoDil4zgqoHil4zgqoLgqoPgqoTgqoXgqobgqofgqojgqongqorgqovgqozgqo3gqo7gqo/gqpDgqpHgqpLgqpPgqpTgqpXgqpbgqpfgqpjgqpngqprgqpvgqpzgqp3gqp7gqp/gqqDgqqHgqqLgqqPgqqTgqqXgqqbgqqfgqqjgqqngqqrgqqvgqqzgqq3gqq7gqq/gqrDgqrHgqrLgqrPgqrTgqrXgqrbgqrfgqrjgqrngqrrgqrvil4zgqrzgqr3gqr7gqr8KK+CrgOKXjOCrgeKXjOCrguKXjOCrg+KXjOCrhOKXjOCrheCrhuKXjOCrh+KXjOCriOCrieCriuCri+CrjOKXjOCrjeCrjuCrj+CrkOCrkeCrkuCrk+CrlOCrleCrluCrl+CrmOCrmeCrmuCrm+CrnOCrneCrnuCrn+CroOCroeCrouCro+CrpOCrpeCrpuCrp+CrqOCrqeCrquCrq+CrrOCrreCrruCrr+CrsOCrseCrsuCrs+CrtOCrteCrtuCrt+CruOCrueCruuCru+CrvOCrveCrvuCrvworCitPcml5YSAoVSswQjAwLVUrMEI3Rik6CisKK+CsgOKXjOCsgeCsguCsg+CshOCsheCshuCsh+CsiOCsieCsiuCsi+CsjOCsjeCsjuCsj+CskOCskeCskuCsk+CslOCsleCsluCsl+CsmOCsmeCsmuCsm+CsnOCsneCsnuCsn+CsoOCsoeCsouCso+CspOCspeCspuCsp+CsqOCsqeCsquCsq+CsrOCsreCsruCsr+CssOCsseCssuCss+CstOCsteCstuCst+CsuOCsueCsuuCsu+KXjOCsvOCsveCsvuKXjOCsvwor4K2A4peM4K2B4peM4K2C4peM4K2D4K2E4K2F4K2G4K2H4K2I4K2J4K2K4K2L4K2M4peM4K2N4K2O4K2P4K2Q4K2R4K2S4K2T4K2U4K2V4peM4K2W4K2X4K2Y4K2Z4K2a4K2b4K2c4K2d4K2e4K2f4K2g4K2h4K2i4K2j4K2k4K2l4K2m4K2n4K2o4K2p4K2q4K2r4K2s4K2t4K2u4K2v4K2w4K2x4K2y4K2z4K204K214K224K234K244K254K264K274K284K294K2+4K2/CisKK1RhbWlsIChVKzBCODAtVSswQkZGKToKKwor4K6A4K6B4peM4K6C4K6D4K6E4K6F4K6G4K6H4K6I4K6J4K6K4K6L4K6M4K6N4K6O4K6P4K6Q4K6R4K6S4K6T4K6U4K6V4K6W4K6X4K6Y4K6Z4K6a4K6b4K6c4K6d4K6e4K6f4K6g4K6h4K6i4K6j4K6k4K6l4K6m4K6n4K6o4K6p4K6q4K6r4K6s4K6t4K6u4K6v4K6w4K6x4K6y4K6z4K604K614K624K634K644K654K664K674K684K694K6+4K6/Civil4zgr4Dgr4Hgr4Lgr4Pgr4Tgr4Xgr4bgr4fgr4jgr4ngr4rgr4vgr4zil4zgr43gr47gr4/gr5Dgr5Hgr5Lgr5Pgr5Tgr5Xgr5bgr5fgr5jgr5ngr5rgr5vgr5zgr53gr57gr5/gr6Dgr6Hgr6Lgr6Pgr6Tgr6Xgr6bgr6fgr6jgr6ngr6rgr6vgr6zgr63gr67gr6/gr7Dgr7Hgr7Lgr7Pgr7Tgr7Xgr7bgr7fgr7jgr7ngr7rgr7vgr7zgr73gr77gr78KKworVGVsdWd1IChVKzBDMDAtVSswQzdGKToKKwor4LCA4LCB4LCC4LCD4LCE4LCF4LCG4LCH4LCI4LCJ4LCK4LCL4LCM4LCN4LCO4LCP4LCQ4LCR4LCS4LCT4LCU4LCV4LCW4LCX4LCY4LCZ4LCa4LCb4LCc4LCd4LCe4LCf4LCg4LCh4LCi4LCj4LCk4LCl4LCm4LCn4LCo4LCp4LCq4LCr4LCs4LCt4LCu4LCv4LCw4LCx4LCy4LCz4LC04LC14LC24LC34LC44LC54LC64LC74LC84LC94peM4LC+4peM4LC/Civil4zgsYDgsYHgsYLgsYPgsYTgsYXil4zgsYbil4zgsYfil4zgsYjgsYnil4zgsYril4zgsYvil4zgsYzil4zgsY3gsY7gsY/gsZDgsZHgsZLgsZPgsZTil4zgsZXil4zgsZbgsZfgsZjgsZngsZrgsZvgsZzgsZ3gsZ7gsZ/gsaDgsaHgsaLgsaPgsaTgsaXgsabgsafgsajgsangsargsavgsazgsa3gsa7gsa/gsbDgsbHgsbLgsbPgsbTgsbXgsbbgsbfgsbjgsbngsbrgsbvgsbzgsb3gsb7gsb8KKworS2FubmFkYSAoVSswQzgwLVUrMENGRik6CisKK+CygOCygeCyguCyg+CyhOCyheCyhuCyh+CyiOCyieCyiuCyi+CyjOCyjeCyjuCyj+CykOCykeCykuCyk+CylOCyleCyluCyl+CymOCymeCymuCym+CynOCyneCynuCyn+CyoOCyoeCyouCyo+CypOCypeCypuCyp+CyqOCyqeCyquCyq+CyrOCyreCyruCyr+CysOCyseCysuCys+CytOCyteCytuCyt+CyuOCyueCyuuCyu+CyvOCyveCyvuKXjOCyvwor4LOA4LOB4LOC4LOD4LOE4LOF4peM4LOG4LOH4LOI4LOJ4LOK4LOL4peM4LOM4peM4LON4LOO4LOP4LOQ4LOR4LOS4LOT4LOU4LOV4LOW4LOX4LOY4LOZ4LOa4LOb4LOc4LOd4LOe4LOf4LOg4LOh4LOi4LOj4LOk4LOl4LOm4LOn4LOo4LOp4LOq4LOr4LOs4LOt4LOu4LOv4LOw4LOx4LOy4LOz4LO04LO14LO24LO34LO44LO54LO64LO74LO84LO94LO+4LO/CisKK01hbGF5YWxhbSAoVSswRDAwLVUrMEQ3Rik6CisKK+C0gOC0geC0guC0g+C0hOC0heC0huC0h+C0iOC0ieC0iuC0i+C0jOC0jeC0juC0j+C0kOC0keC0kuC0k+C0lOC0leC0luC0l+C0mOC0meC0muC0m+C0nOC0neC0nuC0n+C0oOC0oeC0ouC0o+C0pOC0peC0puC0p+C0qOC0qeC0quC0q+C0rOC0reC0ruC0r+C0sOC0seC0suC0s+C0tOC0teC0tuC0t+C0uOC0ueC0uuC0u+C0vOC0veC0vuC0vwor4LWA4peM4LWB4peM4LWC4peM4LWD4LWE4LWF4LWG4LWH4LWI4LWJ4LWK4LWL4LWM4peM4LWN4LWO4LWP4LWQ4LWR4LWS4LWT4LWU4LWV4LWW4LWX4LWY4LWZ4LWa4LWb4LWc4LWd4LWe4LWf4LWg4LWh4LWi4LWj4LWk4LWl4LWm4LWn4LWo4LWp4LWq4LWr4LWs4LWt4LWu4LWv4LWw4LWx4LWy4LWz4LW04LW14LW24LW34LW44LW54LW64LW74LW84LW94LW+4LW/CisKK1NpbmhhbGEgKFUrMEQ4MC1VKzBERkYpOgorCivgtoDgtoHgtoLgtoPgtoTgtoXgtobgtofgtojgtongtorgtovgtozgto3gto7gto/gtpDgtpHgtpLgtpPgtpTgtpXgtpbgtpfgtpjgtpngtprgtpvgtpzgtp3gtp7gtp/gtqDgtqHgtqLgtqPgtqTgtqXgtqbgtqfgtqjgtqngtqrgtqvgtqzgtq3gtq7gtq/gtrDgtrHgtrLgtrPgtrTgtrXgtrbgtrfgtrjgtrngtrrgtrvgtrzgtr3gtr7gtr8KK+C3gOC3geC3guC3g+C3hOC3heC3huC3h+C3iOC3ieKXjOC3iuC3i+C3jOC3jeC3juC3j+C3kOC3keKXjOC3kuKXjOC3k+KXjOC3lOC3leKXjOC3luC3l+C3mOC3meC3muC3m+C3nOC3neC3nuC3n+C3oOC3oeC3ouC3o+C3pOC3peC3puC3p+C3qOC3qeC3quC3q+C3rOC3reC3ruC3r+C3sOC3seC3suC3s+C3tOC3teC3tuC3t+C3uOC3ueC3uuC3u+C3vOC3veC3vuC3vworCitUaGFpIChVKzBFMDAtVSswRTdGKToKKwor4LiA4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4peM4Lix4Liy4Liz4peM4Li04peM4Li14peM4Li24peM4Li34peM4Li44peM4Li54peM4Li64Li74Li84Li94Li+4Li/CivguYDguYHguYLguYPguYTguYXguYbil4zguYfil4zguYjil4zguYnil4zguYril4zguYvil4zguYzil4zguY3il4zguY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvguZzguZ3guZ7guZ/guaDguaHguaLguaPguaTguaXguabguafguajguanguarguavguazgua3gua7gua/gubDgubHgubLgubPgubTgubXgubbgubfgubjgubngubrgubvgubzgub3gub7gub8KKworTGFvIChVKzBFODAtVSswRUZGKToKKwor4LqA4LqB4LqC4LqD4LqE4LqF4LqG4LqH4LqI4LqJ4LqK4LqL4LqM4LqN4LqO4LqP4LqQ4LqR4LqS4LqT4LqU4LqV4LqW4LqX4LqY4LqZ4Lqa4Lqb4Lqc4Lqd4Lqe4Lqf4Lqg4Lqh4Lqi4Lqj4Lqk4Lql4Lqm4Lqn4Lqo4Lqp4Lqq4Lqr4Lqs4Lqt4Lqu4Lqv4Lqw4peM4Lqx4Lqy4Lqz4peM4Lq04peM4Lq14peM4Lq24peM4Lq34peM4Lq44peM4Lq54Lq64peM4Lq74peM4Lq84Lq94Lq+4Lq/Civgu4Dgu4Hgu4Lgu4Pgu4Tgu4Xgu4bgu4fil4zgu4jil4zgu4nil4zgu4ril4zgu4vil4zgu4zil4zgu43gu47gu4/gu5Dgu5Hgu5Lgu5Pgu5Tgu5Xgu5bgu5fgu5jgu5ngu5rgu5vgu5zgu53gu57gu5/gu6Dgu6Hgu6Lgu6Pgu6Tgu6Xgu6bgu6fgu6jgu6ngu6rgu6vgu6zgu63gu67gu6/gu7Dgu7Hgu7Lgu7Pgu7Tgu7Xgu7bgu7fgu7jgu7ngu7rgu7vgu7zgu73gu77gu78KKworVGliZXRhbiAoVSswRjAwLVUrMEZGRik6CisKK+C8gOC8geC8guC8g+C8hOC8heC8huC8h+C8iOC8ieC8iuC8i+C8jOC8jeC8juC8j+C8kOC8keC8kuC8k+C8lOC8leC8luC8l+KXjOC8mOKXjOC8meC8muC8m+C8nOC8neC8nuC8n+C8oOC8oeC8ouC8o+C8pOC8peC8puC8p+C8qOC8qeC8quC8q+C8rOC8reC8ruC8r+C8sOC8seC8suC8s+C8tOKXjOC8teC8tuKXjOC8t+C8uOKXjOC8ueC8uuC8u+C8vOC8veC8vuC8vwor4L2A4L2B4L2C4L2D4L2E4L2F4L2G4L2H4L2I4L2J4L2K4L2L4L2M4L2N4L2O4L2P4L2Q4L2R4L2S4L2T4L2U4L2V4L2W4L2X4L2Y4L2Z4L2a4L2b4L2c4L2d4L2e4L2f4L2g4L2h4L2i4L2j4L2k4L2l4L2m4L2n4L2o4L2p4L2q4L2r4L2s4L2t4L2u4L2v4L2w4peM4L2x4peM4L2y4peM4L2z4peM4L204peM4L214peM4L224peM4L234peM4L244peM4L254peM4L264peM4L274peM4L284peM4L294peM4L2+4L2/Civil4zgvoDil4zgvoHil4zgvoLil4zgvoPil4zgvoTgvoXil4zgvobil4zgvofgvojgvongvorgvovgvozgvo3gvo7gvo/il4zgvpDil4zgvpHil4zgvpLil4zgvpPil4zgvpTil4zgvpXil4zgvpbil4zgvpfgvpjil4zgvpnil4zgvpril4zgvpvil4zgvpzil4zgvp3il4zgvp7il4zgvp/il4zgvqDil4zgvqHil4zgvqLil4zgvqPil4zgvqTil4zgvqXil4zgvqbil4zgvqfil4zgvqjil4zgvqnil4zgvqril4zgvqvil4zgvqzil4zgvq3il4zgvq7il4zgvq/il4zgvrDil4zgvrHil4zgvrLil4zgvrPil4zgvrTil4zgvrXil4zgvrbil4zgvrfil4zgvrjil4zgvrnil4zgvrril4zgvrvil4zgvrzgvr3gvr7gvr8KK+C/gOC/geC/guC/g+C/hOC/heKXjOC/huC/h+C/iOC/ieC/iuC/i+C/jOC/jeC/juC/j+C/kOC/keC/kuC/k+C/lOC/leC/luC/l+C/mOC/meC/muC/m+C/nOC/neC/nuC/n+C/oOC/oeC/ouC/o+C/pOC/peC/puC/p+C/qOC/qeC/quC/q+C/rOC/reC/ruC/r+C/sOC/seC/suC/s+C/tOC/teC/tuC/t+C/uOC/ueC/uuC/u+C/vOC/veC/vuC/vworCitNeWFubWFyIChVKzEwMDAtVSsxMDlGKToKKwor4YCA4YCB4YCC4YCD4YCE4YCF4YCG4YCH4YCI4YCJ4YCK4YCL4YCM4YCN4YCO4YCP4YCQ4YCR4YCS4YCT4YCU4YCV4YCW4YCX4YCY4YCZ4YCa4YCb4YCc4YCd4YCe4YCf4YCg4YCh4YCi4YCj4YCk4YCl4YCm4YCn4YCo4YCp4YCq4YCr4YCs4peM4YCt4peM4YCu4peM4YCv4peM4YCw4YCx4peM4YCy4YCz4YC04YC14peM4YC24peM4YC34YC44peM4YC54YC64YC74YC84YC94YC+4YC/CivhgYDhgYHhgYLhgYPhgYThgYXhgYbhgYfhgYjhgYnhgYrhgYvhgYzhgY3hgY7hgY/hgZDhgZHhgZLhgZPhgZThgZXhgZbhgZfil4zhgZjil4zhgZnhgZrhgZvhgZzhgZ3hgZ7hgZ/hgaDhgaHhgaLhgaPhgaThgaXhgabhgafhgajhganhgarhgavhgazhga3hga7hga/hgbDhgbHhgbLhgbPhgbThgbXhgbbhgbfhgbjhgbnhgbrhgbvhgbzhgb3hgb7hgb8KK+GCgOGCgeGCguGCg+GChOGCheGChuGCh+GCiOGCieGCiuGCi+GCjOGCjeGCjuGCj+GCkOGCkeGCkuGCk+GClOGCleGCluGCl+GCmOGCmeGCmuGCm+GCnOGCneGCnuGCnworCitHZW9yZ2lhbiAoVSsxMEEwLVUrMTBGRik6CisKK+GCoOGCoeGCouGCo+GCpOGCpeGCpuGCp+GCqOGCqeGCquGCq+GCrOGCreGCruGCr+GCsOGCseGCsuGCs+GCtOGCteGCtuGCt+GCuOGCueGCuuGCu+GCvOGCveGCvuGCv+GDgOGDgeGDguGDg+GDhOGDheGDhuGDh+GDiOGDieGDiuGDi+GDjOGDjeGDjuGDj+GDkOGDkeGDkuGDk+GDlOGDleGDluGDl+GDmOGDmeGDmuGDm+GDnOGDneGDnuGDnwor4YOg4YOh4YOi4YOj4YOk4YOl4YOm4YOn4YOo4YOp4YOq4YOr4YOs4YOt4YOu4YOv4YOw4YOx4YOy4YOz4YO04YO14YO24YO34YO44YO54YO64YO74YO84YO94YO+4YO/CisKK0hhbmd1bCBKYW1vIChVKzExMDAtVSsxMUZGKToKKwor4YSA4YSB4YSC4YSD4YSE4YSF4YSG4YSH4YSI4YSJ4YSK4YSL4YSM4YSN4YSO4YSP4YSQ4YSR4YSS4YST4YSU4YSV4YSW4YSX4YSY4YSZ4YSa4YSb4YSc4YSd4YSe4YSfCivhhKDhhKHhhKLhhKPhhKThhKXhhKbhhKfhhKjhhKnhhKrhhKvhhKzhhK3hhK7hhK/hhLDhhLHhhLLhhLPhhLThhLXhhLbhhLfhhLjhhLnhhLrhhLvhhLzhhL3hhL7hhL8KK+GFgOGFgeGFguGFg+GFhOGFheGFhuGFh+GFiOGFieGFiuGFi+GFjOGFjeGFjuGFj+GFkOGFkeGFkuGFk+GFlOGFleGFluGFl+GFmOGFmeGFmuGFm+GFnOGFneGFnuGFnwor4YWg4YWh4YWi4YWj4YWk4YWl4YWm4YWn4YWo4YWp4YWq4YWr4YWs4YWt4YWu4YWv4YWw4YWx4YWy4YWz4YW04YW14YW24YW34YW44YW54YW64YW74YW84YW94YW+4YW/4YaA4YaB4YaC4YaD4YaE4YaF4YaG4YaH4YaI4YaJ4YaK4YaL4YaM4YaN4YaO4YaP4YaQ4YaR4YaS4YaT4YaU4YaV4YaW4YaX4YaY4YaZ4Yaa4Yab4Yac4Yad4Yae4YafCivhhqDhhqHhhqLhhqPhhqThhqXhhqbhhqfhhqjhhqnhhqrhhqvhhqzhhq3hhq7hhq/hhrDhhrHhhrLhhrPhhrThhrXhhrbhhrfhhrjhhrnhhrrhhrvhhrzhhr3hhr7hhr/hh4Dhh4Hhh4Lhh4Phh4Thh4Xhh4bhh4fhh4jhh4nhh4rhh4vhh4zhh43hh47hh4/hh5Dhh5Hhh5Lhh5Phh5Thh5Xhh5bhh5fhh5jhh5nhh5rhh5vhh5zhh53hh57hh58KK+GHoOGHoeGHouGHo+GHpOGHpeGHpuGHp+GHqOGHqeGHquGHq+GHrOGHreGHruGHr+GHsOGHseGHsuGHs+GHtOGHteGHtuGHt+GHuOGHueGHuuGHu+GHvOGHveGHvuGHvworCitFdGhpb3BpYyAoVSsxMjAwLVUrMTM3Rik6CisKK+GIgOGIgeGIguGIg+GIhOGIheGIhuGIh+GIiOGIieGIiuGIi+GIjOGIjeGIjuGIj+GIkOGIkeGIkuGIk+GIlOGIleGIluGIl+GImOGImeGImuGIm+GInOGIneGInuGIn+GIoOGIoeGIouGIo+GIpOGIpeGIpuGIp+GIqOGIqeGIquGIq+GIrOGIreGIruGIr+GIsOGIseGIsuGIs+GItOGIteGItuGIt+GIuOGIueGIuuGIu+GIvOGIveGIvuGIvwor4YmA4YmB4YmC4YmD4YmE4YmF4YmG4YmH4YmI4YmJ4YmK4YmL4YmM4YmN4YmO4YmP4YmQ4YmR4YmS4YmT4YmU4YmV4YmW4YmX4YmY4YmZ4Yma4Ymb4Ymc4Ymd4Yme4Ymf4Ymg4Ymh4Ymi4Ymj4Ymk4Yml4Ymm4Ymn4Ymo4Ymp4Ymq4Ymr4Yms4Ymt4Ymu4Ymv4Ymw4Ymx4Ymy4Ymz4Ym04Ym14Ym24Ym34Ym44Ym54Ym64Ym74Ym84Ym94Ym+4Ym/CivhioDhioHhioLhioPhioThioXhiobhiofhiojhionhiorhiovhiozhio3hio7hio/hipDhipHhipLhipPhipThipXhipbhipfhipjhipnhiprhipvhipzhip3hip7hip/hiqDhiqHhiqLhiqPhiqThiqXhiqbhiqfhiqjhiqnhiqrhiqvhiqzhiq3hiq7hiq/hirDhirHhirLhirPhirThirXhirbhirfhirjhirnhirrhirvhirzhir3hir7hir8KK+GLgOGLgeGLguGLg+GLhOGLheGLhuGLh+GLiOGLieGLiuGLi+GLjOGLjeGLjuGLj+GLkOGLkeGLkuGLk+GLlOGLleGLluGLl+GLmOGLmeGLmuGLm+GLnOGLneGLnuGLn+GLoOGLoeGLouGLo+GLpOGLpeGLpuGLp+GLqOGLqeGLquGLq+GLrOGLreGLruGLr+GLsOGLseGLsuGLs+GLtOGLteGLtuGLt+GLuOGLueGLuuGLu+GLvOGLveGLvuGLvwor4YyA4YyB4YyC4YyD4YyE4YyF4YyG4YyH4YyI4YyJ4YyK4YyL4YyM4YyN4YyO4YyP4YyQ4YyR4YyS4YyT4YyU4YyV4YyW4YyX4YyY4YyZ4Yya4Yyb4Yyc4Yyd4Yye4Yyf4Yyg4Yyh4Yyi4Yyj4Yyk4Yyl4Yym4Yyn4Yyo4Yyp4Yyq4Yyr4Yys4Yyt4Yyu4Yyv4Yyw4Yyx4Yyy4Yyz4Yy04Yy14Yy24Yy34Yy44Yy54Yy64Yy74Yy84Yy94Yy+4Yy/CivhjYDhjYHhjYLhjYPhjYThjYXhjYbhjYfhjYjhjYnhjYrhjYvhjYzhjY3hjY7hjY/hjZDhjZHhjZLhjZPhjZThjZXhjZbhjZfhjZjhjZnhjZrhjZvhjZzhjZ3hjZ7hjZ/hjaDhjaHhjaLhjaPhjaThjaXhjabhjafhjajhjanhjarhjavhjazhja3hja7hja/hjbDhjbHhjbLhjbPhjbThjbXhjbbhjbfhjbjhjbnhjbrhjbvhjbzhjb3hjb7hjb8KKworRnJlZSBibG9jayAoVSsxMzgwLVUrMTM5Rik6CisKK+GOgOGOgeGOguGOg+GOhOGOheGOhuGOh+GOiOGOieGOiuGOi+GOjOGOjeGOjuGOj+GOkOGOkeGOkuGOk+GOlOGOleGOluGOl+GOmOGOmeGOmuGOm+GOnOGOneGOnuGOnworCitDaGVyb2tlZSAoVSsxM0EwLVUrMTNGRik6CisKK+GOoOGOoeGOouGOo+GOpOGOpeGOpuGOp+GOqOGOqeGOquGOq+GOrOGOreGOruGOr+GOsOGOseGOsuGOs+GOtOGOteGOtuGOt+GOuOGOueGOuuGOu+GOvOGOveGOvuGOv+GPgOGPgeGPguGPg+GPhOGPheGPhuGPh+GPiOGPieGPiuGPi+GPjOGPjeGPjuGPj+GPkOGPkeGPkuGPk+GPlOGPleGPluGPl+GPmOGPmeGPmuGPm+GPnOGPneGPnuGPnwor4Y+g4Y+h4Y+i4Y+j4Y+k4Y+l4Y+m4Y+n4Y+o4Y+p4Y+q4Y+r4Y+s4Y+t4Y+u4Y+v4Y+w4Y+x4Y+y4Y+z4Y+04Y+14Y+24Y+34Y+44Y+54Y+64Y+74Y+84Y+94Y++4Y+/CisKK1VuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgKFUrMTQwMC1VKzE2N0YpOgorCivhkIDhkIHhkILhkIPhkIThkIXhkIbhkIfhkIjhkInhkIrhkIvhkIzhkI3hkI7hkI/hkJDhkJHhkJLhkJPhkJThkJXhkJbhkJfhkJjhkJnhkJrhkJvhkJzhkJ3hkJ7hkJ/hkKDhkKHhkKLhkKPhkKThkKXhkKbhkKfhkKjhkKnhkKrhkKvhkKzhkK3hkK7hkK/hkLDhkLHhkLLhkLPhkLThkLXhkLbhkLfhkLjhkLnhkLrhkLvhkLzhkL3hkL7hkL8KK+GRgOGRgeGRguGRg+GRhOGRheGRhuGRh+GRiOGRieGRiuGRi+GRjOGRjeGRjuGRj+GRkOGRkeGRkuGRk+GRlOGRleGRluGRl+GRmOGRmeGRmuGRm+GRnOGRneGRnuGRn+GRoOGRoeGRouGRo+GRpOGRpeGRpuGRp+GRqOGRqeGRquGRq+GRrOGRreGRruGRr+GRsOGRseGRsuGRs+GRtOGRteGRtuGRt+GRuOGRueGRuuGRu+GRvOGRveGRvuGRvwor4ZKA4ZKB4ZKC4ZKD4ZKE4ZKF4ZKG4ZKH4ZKI4ZKJ4ZKK4ZKL4ZKM4ZKN4ZKO4ZKP4ZKQ4ZKR4ZKS4ZKT4ZKU4ZKV4ZKW4ZKX4ZKY4ZKZ4ZKa4ZKb4ZKc4ZKd4ZKe4ZKf4ZKg4ZKh4ZKi4ZKj4ZKk4ZKl4ZKm4ZKn4ZKo4ZKp4ZKq4ZKr4ZKs4ZKt4ZKu4ZKv4ZKw4ZKx4ZKy4ZKz4ZK04ZK14ZK24ZK34ZK44ZK54ZK64ZK74ZK84ZK94ZK+4ZK/Civhk4Dhk4Hhk4Lhk4Phk4Thk4Xhk4bhk4fhk4jhk4nhk4rhk4vhk4zhk43hk47hk4/hk5Dhk5Hhk5Lhk5Phk5Thk5Xhk5bhk5fhk5jhk5nhk5rhk5vhk5zhk53hk57hk5/hk6Dhk6Hhk6Lhk6Phk6Thk6Xhk6bhk6fhk6jhk6nhk6rhk6vhk6zhk63hk67hk6/hk7Dhk7Hhk7Lhk7Phk7Thk7Xhk7bhk7fhk7jhk7nhk7rhk7vhk7zhk73hk77hk78KK+GUgOGUgeGUguGUg+GUhOGUheGUhuGUh+GUiOGUieGUiuGUi+GUjOGUjeGUjuGUj+GUkOGUkeGUkuGUk+GUlOGUleGUluGUl+GUmOGUmeGUmuGUm+GUnOGUneGUnuGUn+GUoOGUoeGUouGUo+GUpOGUpeGUpuGUp+GUqOGUqeGUquGUq+GUrOGUreGUruGUr+GUsOGUseGUsuGUs+GUtOGUteGUtuGUt+GUuOGUueGUuuGUu+GUvOGUveGUvuGUvwor4ZWA4ZWB4ZWC4ZWD4ZWE4ZWF4ZWG4ZWH4ZWI4ZWJ4ZWK4ZWL4ZWM4ZWN4ZWO4ZWP4ZWQ4ZWR4ZWS4ZWT4ZWU4ZWV4ZWW4ZWX4ZWY4ZWZ4ZWa4ZWb4ZWc4ZWd4ZWe4ZWf4ZWg4ZWh4ZWi4ZWj4ZWk4ZWl4ZWm4ZWn4ZWo4ZWp4ZWq4ZWr4ZWs4ZWt4ZWu4ZWv4ZWw4ZWx4ZWy4ZWz4ZW04ZW14ZW24ZW34ZW44ZW54ZW64ZW74ZW84ZW94ZW+4ZW/CivhloDhloHhloLhloPhloThloXhlobhlofhlojhlonhlorhlovhlozhlo3hlo7hlo/hlpDhlpHhlpLhlpPhlpThlpXhlpbhlpfhlpjhlpnhlprhlpvhlpzhlp3hlp7hlp/hlqDhlqHhlqLhlqPhlqThlqXhlqbhlqfhlqjhlqnhlqrhlqvhlqzhlq3hlq7hlq/hlrDhlrHhlrLhlrPhlrThlrXhlrbhlrfhlrjhlrnhlrrhlrvhlrzhlr3hlr7hlr8KK+GXgOGXgeGXguGXg+GXhOGXheGXhuGXh+GXiOGXieGXiuGXi+GXjOGXjeGXjuGXj+GXkOGXkeGXkuGXk+GXlOGXleGXluGXl+GXmOGXmeGXmuGXm+GXnOGXneGXnuGXn+GXoOGXoeGXouGXo+GXpOGXpeGXpuGXp+GXqOGXqeGXquGXq+GXrOGXreGXruGXr+GXsOGXseGXsuGXs+GXtOGXteGXtuGXt+GXuOGXueGXuuGXu+GXvOGXveGXvuGXvwor4ZiA4ZiB4ZiC4ZiD4ZiE4ZiF4ZiG4ZiH4ZiI4ZiJ4ZiK4ZiL4ZiM4ZiN4ZiO4ZiP4ZiQ4ZiR4ZiS4ZiT4ZiU4ZiV4ZiW4ZiX4ZiY4ZiZ4Zia4Zib4Zic4Zid4Zie4Zif4Zig4Zih4Zii4Zij4Zik4Zil4Zim4Zin4Zio4Zip4Ziq4Zir4Zis4Zit4Ziu4Ziv4Ziw4Zix4Ziy4Ziz4Zi04Zi14Zi24Zi34Zi44Zi54Zi64Zi74Zi84Zi94Zi+4Zi/CivhmYDhmYHhmYLhmYPhmYThmYXhmYbhmYfhmYjhmYnhmYrhmYvhmYzhmY3hmY7hmY/hmZDhmZHhmZLhmZPhmZThmZXhmZbhmZfhmZjhmZnhmZrhmZvhmZzhmZ3hmZ7hmZ/hmaDhmaHhmaLhmaPhmaThmaXhmabhmafhmajhmanhmarhmavhmazhma3hma7hma/hmbDhmbHhmbLhmbPhmbThmbXhmbbhmbfhmbjhmbnhmbrhmbvhmbzhmb3hmb7hmb8KKworT2doYW0gKFUrMTY4MC1VKzE2OUYpOgorCivhmoDhmoHhmoLhmoPhmoThmoXhmobhmofhmojhmonhmorhmovhmozhmo3hmo7hmo/hmpDhmpHhmpLhmpPhmpThmpXhmpbhmpfhmpjhmpnhmprhmpvhmpzhmp3hmp7hmp8KKworUnVuaWMgKFUrMTZBMC1VKzE2RkYpOgorCivhmqDhmqHhmqLhmqPhmqThmqXhmqbhmqfhmqjhmqnhmqrhmqvhmqzhmq3hmq7hmq/hmrDhmrHhmrLhmrPhmrThmrXhmrbhmrfhmrjhmrnhmrrhmrvhmrzhmr3hmr7hmr/hm4Dhm4Hhm4Lhm4Phm4Thm4Xhm4bhm4fhm4jhm4nhm4rhm4vhm4zhm43hm47hm4/hm5Dhm5Hhm5Lhm5Phm5Thm5Xhm5bhm5fhm5jhm5nhm5rhm5vhm5zhm53hm57hm58KK+GboOGboeGbouGbo+GbpOGbpeGbpuGbp+GbqOGbqeGbquGbq+GbrOGbreGbruGbr+GbsOGbseGbsuGbs+GbtOGbteGbtuGbt+GbuOGbueGbuuGbu+GbvOGbveGbvuGbvworCitUYWdhbG9nIChVKzE3MDAtVSsxNzFGKToKKwor4ZyA4ZyB4ZyC4ZyD4ZyE4ZyF4ZyG4ZyH4ZyI4ZyJ4ZyK4ZyL4ZyM4ZyN4ZyO4ZyP4ZyQ4ZyR4peM4ZyS4peM4ZyT4peM4ZyU4ZyV4ZyW4ZyX4ZyY4ZyZ4Zya4Zyb4Zyc4Zyd4Zye4ZyfCisKK0hhbnVub28gKFUrMTcyMC1VKzE3M0YpOgorCivhnKDhnKHhnKLhnKPhnKThnKXhnKbhnKfhnKjhnKnhnKrhnKvhnKzhnK3hnK7hnK/hnLDhnLHil4zhnLLil4zhnLPil4zhnLThnLXhnLbhnLfhnLjhnLnhnLrhnLvhnLzhnL3hnL7hnL8KKworQnVoaWQgKFUrMTc0MC1VKzE3NUYpOgorCivhnYDhnYHhnYLhnYPhnYThnYXhnYbhnYfhnYjhnYnhnYrhnYvhnYzhnY3hnY7hnY/hnZDhnZHil4zhnZLil4zhnZPhnZThnZXhnZbhnZfhnZjhnZnhnZrhnZvhnZzhnZ3hnZ7hnZ8KKworVGFnYmFud2EgKFUrMTc2MC1VKzE3N0YpOgorCivhnaDhnaHhnaLhnaPhnaThnaXhnabhnafhnajhnanhnarhnavhnazhna3hna7hna/hnbDhnbHil4zhnbLil4zhnbPhnbThnbXhnbbhnbfhnbjhnbnhnbrhnbvhnbzhnb3hnb7hnb8KKworS2htZXIgKFUrMTc4MC1VKzE3RkYpOgorCivhnoDhnoHhnoLhnoPhnoThnoXhnobhnofhnojhnonhnorhnovhnozhno3hno7hno/hnpDhnpHhnpLhnpPhnpThnpXhnpbhnpfhnpjhnpnhnprhnpvhnpzhnp3hnp7hnp/hnqDhnqHhnqLhnqPhnqThnqXhnqbhnqfhnqjhnqnhnqrhnqvhnqzhnq3hnq7hnq/hnrDhnrHhnrLhnrPhnrThnrXhnrbil4zhnrfil4zhnrjil4zhnrnil4zhnrril4zhnrvil4zhnrzil4zhnr3hnr7hnr8KK+GfgOGfgeGfguGfg+GfhOGfheKXjOGfhuGfh+GfiOKXjOGfieKXjOGfiuKXjOGfi+KXjOGfjOKXjOGfjeKXjOGfjuKXjOGfj+KXjOGfkOKXjOGfkeKXjOGfkuKXjOGfk+GflOGfleGfluGfl+GfmOGfmeGfmuGfm+GfnOGfneGfnuGfn+GfoOGfoeGfouGfo+GfpOGfpeGfpuGfp+GfqOGfqeGfquGfq+GfrOGfreGfruGfr+GfsOGfseGfsuGfs+GftOGfteGftuGft+GfuOGfueGfuuGfu+GfvOGfveGfvuGfvworCitNb25nb2xpYW4gKFUrMTgwMC1VKzE4QUYpOgorCivhoIDhoIHhoILhoIPhoIThoIXhoIbhoIfhoIjhoInhoIril4zhoIvil4zhoIzil4zhoI3hoI7hoI/hoJDhoJHhoJLhoJPhoJThoJXhoJbhoJfhoJjhoJnhoJrhoJvhoJzhoJ3hoJ7hoJ/hoKDhoKHhoKLhoKPhoKThoKXhoKbhoKfhoKjhoKnhoKrhoKvhoKzhoK3hoK7hoK/hoLDhoLHhoLLhoLPhoLThoLXhoLbhoLfhoLjhoLnhoLrhoLvhoLzhoL3hoL7hoL8KK+GhgOGhgeGhguGhg+GhhOGhheGhhuGhh+GhiOGhieGhiuGhi+GhjOGhjeGhjuGhj+GhkOGhkeGhkuGhk+GhlOGhleGhluGhl+GhmOGhmeGhmuGhm+GhnOGhneGhnuGhn+GhoOGhoeGhouGho+GhpOGhpeGhpuGhp+GhqOGhqeGhquGhq+GhrOGhreGhruGhr+GhsOGhseGhsuGhs+GhtOGhteGhtuGht+GhuOGhueGhuuGhu+GhvOGhveGhvuGhvwor4aKA4aKB4aKC4aKD4aKE4aKF4aKG4aKH4aKI4aKJ4aKK4aKL4aKM4aKN4aKO4aKP4aKQ4aKR4aKS4aKT4aKU4aKV4aKW4aKX4aKY4aKZ4aKa4aKb4aKc4aKd4aKe4aKf4aKg4aKh4aKi4aKj4aKk4aKl4aKm4aKn4aKo4peM4aKp4aKq4aKr4aKs4aKt4aKu4aKvCisKK0ZyZWUgYmxvY2sgKFUrMThCMC1VKzE4RkYpOgorCivhorDhorHhorLhorPhorThorXhorbhorfhorjhornhorrhorvhorzhor3hor7hor/ho4Dho4Hho4Lho4Pho4Tho4Xho4bho4fho4jho4nho4rho4vho4zho43ho47ho4/ho5Dho5Hho5Lho5Pho5Tho5Xho5bho5fho5jho5nho5rho5vho5zho53ho57ho5/ho6Dho6Hho6Lho6Pho6Tho6Xho6bho6fho6jho6nho6rho6vho6zho63ho67ho68KK+GjsOGjseGjsuGjs+GjtOGjteGjtuGjt+GjuOGjueGjuuGju+GjvOGjveGjvuGjvworCitMaW1idSAoVSsxOTAwLVUrMTk0Rik6CisKK+GkgOGkgeGkguGkg+GkhOGkheGkhuGkh+GkiOGkieGkiuGki+GkjOGkjeGkjuGkj+GkkOGkkeGkkuGkk+GklOGkleGkluGkl+GkmOGkmeGkmuGkm+GknOGkneGknuGkn+GkoOGkoeGkouGko+GkpOGkpeGkpuGkp+GkqOGkqeGkquGkq+GkrOGkreGkruGkr+GksOGkseGksuGks+GktOGkteGktuGkt+GkuOGkueGkuuGku+GkvOGkveGkvuGkvwor4aWA4aWB4aWC4aWD4aWE4aWF4aWG4aWH4aWI4aWJ4aWK4aWL4aWM4aWN4aWO4aWPCisKK1RhaSBMZSAoVSsxOTUwLVUrMTk3Rik6CisKK+GlkOGlkeGlkuGlk+GllOGlleGlluGll+GlmOGlmeGlmuGlm+GlnOGlneGlnuGln+GloOGloeGlouGlo+GlpOGlpeGlpuGlp+GlqOGlqeGlquGlq+GlrOGlreGlruGlr+GlsOGlseGlsuGls+GltOGlteGltuGlt+GluOGlueGluuGlu+GlvOGlveGlvuGlvworCitGcmVlIGJsb2NrIChVKzE5ODAtVSsxOURGKToKKwor4aaA4aaB4aaC4aaD4aaE4aaF4aaG4aaH4aaI4aaJ4aaK4aaL4aaM4aaN4aaO4aaP4aaQ4aaR4aaS4aaT4aaU4aaV4aaW4aaX4aaY4aaZ4aaa4aab4aac4aad4aae4aaf4aag4aah4aai4aaj4aak4aal4aam4aan4aao4aap4aaq4aar4aas4aat4aau4aav4aaw4aax4aay4aaz4aa04aa14aa24aa34aa44aa54aa64aa74aa84aa94aa+4aa/Civhp4Dhp4Hhp4Lhp4Php4Thp4Xhp4bhp4fhp4jhp4nhp4rhp4vhp4zhp43hp47hp4/hp5Dhp5Hhp5Lhp5Php5Thp5Xhp5bhp5fhp5jhp5nhp5rhp5vhp5zhp53hp57hp58KKworS2htZXIgU3ltYm9scyAoVSsxOUUwLVUrMTlGRik6CisKK+GnoOGnoeGnouGno+GnpOGnpeGnpuGnp+GnqOGnqeGnquGnq+GnrOGnreGnruGnr+GnsOGnseGnsuGns+GntOGnteGntuGnt+GnuOGnueGnuuGnu+GnvOGnveGnvuGnvworCitGcmVlIGJsb2NrIChVKzFBMDAtVSsxQ0ZGKToKKwor4aiA4aiB4aiC4aiD4aiE4aiF4aiG4aiH4aiI4aiJ4aiK4aiL4aiM4aiN4aiO4aiP4aiQ4aiR4aiS4aiT4aiU4aiV4aiW4aiX4aiY4aiZ4aia4aib4aic4aid4aie4aif4aig4aih4aii4aij4aik4ail4aim4ain4aio4aip4aiq4air4ais4ait4aiu4aiv4aiw4aix4aiy4aiz4ai04ai14ai24ai34ai44ai54ai64ai74ai84ai94ai+4ai/CivhqYDhqYHhqYLhqYPhqYThqYXhqYbhqYfhqYjhqYnhqYrhqYvhqYzhqY3hqY7hqY/hqZDhqZHhqZLhqZPhqZThqZXhqZbhqZfhqZjhqZnhqZrhqZvhqZzhqZ3hqZ7hqZ/hqaDhqaHhqaLhqaPhqaThqaXhqabhqafhqajhqanhqarhqavhqazhqa3hqa7hqa/hqbDhqbHhqbLhqbPhqbThqbXhqbbhqbfhqbjhqbnhqbrhqbvhqbzhqb3hqb7hqb8KK+GqgOGqgeGqguGqg+GqhOGqheGqhuGqh+GqiOGqieGqiuGqi+GqjOGqjeGqjuGqj+GqkOGqkeGqkuGqk+GqlOGqleGqluGql+GqmOGqmeGqmuGqm+GqnOGqneGqnuGqn+GqoOGqoeGqouGqo+GqpOGqpeGqpuGqp+GqqOGqqeGqquGqq+GqrOGqreGqruGqr+GqsOGqseGqsuGqs+GqtOGqteGqtuGqt+GquOGqueGquuGqu+GqvOGqveGqvuGqvwor4auA4auB4auC4auD4auE4auF4auG4auH4auI4auJ4auK4auL4auM4auN4auO4auP4auQ4auR4auS4auT4auU4auV4auW4auX4auY4auZ4aua4aub4auc4aud4aue4auf4aug4auh4aui4auj4auk4aul4aum4aun4auo4aup4auq4aur4aus4aut4auu4auv4auw4aux4auy4auz4au04au14au24au34au44au54au64au74au84au94au+4au/CivhrIDhrIHhrILhrIPhrIThrIXhrIbhrIfhrIjhrInhrIrhrIvhrIzhrI3hrI7hrI/hrJDhrJHhrJLhrJPhrJThrJXhrJbhrJfhrJjhrJnhrJrhrJvhrJzhrJ3hrJ7hrJ/hrKDhrKHhrKLhrKPhrKThrKXhrKbhrKfhrKjhrKnhrKrhrKvhrKzhrK3hrK7hrK/hrLDhrLHhrLLhrLPhrLThrLXhrLbhrLfhrLjhrLnhrLrhrLvhrLzhrL3hrL7hrL8KK+GtgOGtgeGtguGtg+GthOGtheGthuGth+GtiOGtieGtiuGti+GtjOGtjeGtjuGtj+GtkOGtkeGtkuGtk+GtlOGtleGtluGtl+GtmOGtmeGtmuGtm+GtnOGtneGtnuGtn+GtoOGtoeGtouGto+GtpOGtpeGtpuGtp+GtqOGtqeGtquGtq+GtrOGtreGtruGtr+GtsOGtseGtsuGts+GttOGtteGttuGtt+GtuOGtueGtuuGtu+GtvOGtveGtvuGtvwor4a6A4a6B4a6C4a6D4a6E4a6F4a6G4a6H4a6I4a6J4a6K4a6L4a6M4a6N4a6O4a6P4a6Q4a6R4a6S4a6T4a6U4a6V4a6W4a6X4a6Y4a6Z4a6a4a6b4a6c4a6d4a6e4a6f4a6g4a6h4a6i4a6j4a6k4a6l4a6m4a6n4a6o4a6p4a6q4a6r4a6s4a6t4a6u4a6v4a6w4a6x4a6y4a6z4a604a614a624a634a644a654a664a674a684a694a6+4a6/Civhr4Dhr4Hhr4Lhr4Phr4Thr4Xhr4bhr4fhr4jhr4nhr4rhr4vhr4zhr43hr47hr4/hr5Dhr5Hhr5Lhr5Phr5Thr5Xhr5bhr5fhr5jhr5nhr5rhr5vhr5zhr53hr57hr5/hr6Dhr6Hhr6Lhr6Phr6Thr6Xhr6bhr6fhr6jhr6nhr6rhr6vhr6zhr63hr67hr6/hr7Dhr7Hhr7Lhr7Phr7Thr7Xhr7bhr7fhr7jhr7nhr7rhr7vhr7zhr73hr77hr78KK+GwgOGwgeGwguGwg+GwhOGwheGwhuGwh+GwiOGwieGwiuGwi+GwjOGwjeGwjuGwj+GwkOGwkeGwkuGwk+GwlOGwleGwluGwl+GwmOGwmeGwmuGwm+GwnOGwneGwnuGwn+GwoOGwoeGwouGwo+GwpOGwpeGwpuGwp+GwqOGwqeGwquGwq+GwrOGwreGwruGwr+GwsOGwseGwsuGws+GwtOGwteGwtuGwt+GwuOGwueGwuuGwu+GwvOGwveGwvuGwvwor4bGA4bGB4bGC4bGD4bGE4bGF4bGG4bGH4bGI4bGJ4bGK4bGL4bGM4bGN4bGO4bGP4bGQ4bGR4bGS4bGT4bGU4bGV4bGW4bGX4bGY4bGZ4bGa4bGb4bGc4bGd4bGe4bGf4bGg4bGh4bGi4bGj4bGk4bGl4bGm4bGn4bGo4bGp4bGq4bGr4bGs4bGt4bGu4bGv4bGw4bGx4bGy4bGz4bG04bG14bG24bG34bG44bG54bG64bG74bG84bG94bG+4bG/CivhsoDhsoHhsoLhsoPhsoThsoXhsobhsofhsojhsonhsorhsovhsozhso3hso7hso/hspDhspHhspLhspPhspThspXhspbhspfhspjhspnhsprhspvhspzhsp3hsp7hsp/hsqDhsqHhsqLhsqPhsqThsqXhsqbhsqfhsqjhsqnhsqrhsqvhsqzhsq3hsq7hsq/hsrDhsrHhsrLhsrPhsrThsrXhsrbhsrfhsrjhsrnhsrrhsrvhsrzhsr3hsr7hsr8KK+GzgOGzgeGzguGzg+GzhOGzheGzhuGzh+GziOGzieGziuGzi+GzjOGzjeGzjuGzj+GzkOGzkeGzkuGzk+GzlOGzleGzluGzl+GzmOGzmeGzmuGzm+GznOGzneGznuGzn+GzoOGzoeGzouGzo+GzpOGzpeGzpuGzp+GzqOGzqeGzquGzq+GzrOGzreGzruGzr+GzsOGzseGzsuGzs+GztOGzteGztuGzt+GzuOGzueGzuuGzu+GzvOGzveGzvuGzvworCitQaG9uZXRpYyBFeHRlbnNpb25zIChVKzFEMDAtVSsxRDdGKToKKwor4bSA4bSB4bSC4bSD4bSE4bSF4bSG4bSH4bSI4bSJ4bSK4bSL4bSM4bSN4bSO4bSP4bSQ4bSR4bSS4bST4bSU4bSV4bSW4bSX4bSY4bSZ4bSa4bSb4bSc4bSd4bSe4bSf4bSg4bSh4bSi4bSj4bSk4bSl4bSm4bSn4bSo4bSp4bSq4bSr4bSs4bSt4bSu4bSv4bSw4bSx4bSy4bSz4bS04bS14bS24bS34bS44bS54bS64bS74bS84bS94bS+4bS/CivhtYDhtYHhtYLhtYPhtYThtYXhtYbhtYfhtYjhtYnhtYrhtYvhtYzhtY3htY7htY/htZDhtZHhtZLhtZPhtZThtZXhtZbhtZfhtZjhtZnhtZrhtZvhtZzhtZ3htZ7htZ/htaDhtaHhtaLhtaPhtaThtaXhtabhtafhtajhtanhtarhtavhtazhta3hta7hta/htbDhtbHhtbLhtbPhtbThtbXhtbbhtbfhtbjhtbnhtbrhtbvhtbzhtb3htb7htb8KKworRnJlZSBibG9jayAoVSsxRDgwLVUrMURGRik6CisKK+G2gOG2geG2guG2g+G2hOG2heG2huG2h+G2iOG2ieG2iuG2i+G2jOG2jeG2juG2j+G2kOG2keG2kuG2k+G2lOG2leG2luG2l+G2mOG2meG2muG2m+G2nOG2neG2nuG2n+G2oOG2oeG2ouG2o+G2pOG2peG2puG2p+G2qOG2qeG2quG2q+G2rOG2reG2ruG2r+G2sOG2seG2suG2s+G2tOG2teG2tuG2t+G2uOG2ueG2uuG2u+G2vOG2veG2vuG2vwor4beA4beB4beC4beD4beE4beF4beG4beH4beI4beJ4beK4beL4beM4beN4beO4beP4beQ4beR4beS4beT4beU4beV4beW4beX4beY4beZ4bea4beb4bec4bed4bee4bef4beg4beh4bei4bej4bek4bel4bem4ben4beo4bep4beq4ber4bes4bet4beu4bev4bew4bex4bey4bez4be04be14be24be34be44be54be64be74be84be94be+4be/CisKK0xhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwgKFUrMUUwMC1VKzFFRkYpOgorCivhuIDhuIHhuILhuIPhuIThuIXhuIbhuIfhuIjhuInhuIrhuIvhuIzhuI3huI7huI/huJDhuJHhuJLhuJPhuJThuJXhuJbhuJfhuJjhuJnhuJrhuJvhuJzhuJ3huJ7huJ/huKDhuKHhuKLhuKPhuKThuKXhuKbhuKfhuKjhuKnhuKrhuKvhuKzhuK3huK7huK/huLDhuLHhuLLhuLPhuLThuLXhuLbhuLfhuLjhuLnhuLrhuLvhuLzhuL3huL7huL8KK+G5gOG5geG5guG5g+G5hOG5heG5huG5h+G5iOG5ieG5iuG5i+G5jOG5jeG5juG5j+G5kOG5keG5kuG5k+G5lOG5leG5luG5l+G5mOG5meG5muG5m+G5nOG5neG5nuG5n+G5oOG5oeG5ouG5o+G5pOG5peG5puG5p+G5qOG5qeG5quG5q+G5rOG5reG5ruG5r+G5sOG5seG5suG5s+G5tOG5teG5tuG5t+G5uOG5ueG5uuG5u+G5vOG5veG5vuG5vwor4bqA4bqB4bqC4bqD4bqE4bqF4bqG4bqH4bqI4bqJ4bqK4bqL4bqM4bqN4bqO4bqP4bqQ4bqR4bqS4bqT4bqU4bqV4bqW4bqX4bqY4bqZ4bqa4bqb4bqc4bqd4bqe4bqf4bqg4bqh4bqi4bqj4bqk4bql4bqm4bqn4bqo4bqp4bqq4bqr4bqs4bqt4bqu4bqv4bqw4bqx4bqy4bqz4bq04bq14bq24bq34bq44bq54bq64bq74bq84bq94bq+4bq/Civhu4Dhu4Hhu4Lhu4Phu4Thu4Xhu4bhu4fhu4jhu4nhu4rhu4vhu4zhu43hu47hu4/hu5Dhu5Hhu5Lhu5Phu5Thu5Xhu5bhu5fhu5jhu5nhu5rhu5vhu5zhu53hu57hu5/hu6Dhu6Hhu6Lhu6Phu6Thu6Xhu6bhu6fhu6jhu6nhu6rhu6vhu6zhu63hu67hu6/hu7Dhu7Hhu7Lhu7Phu7Thu7Xhu7bhu7fhu7jhu7nhu7rhu7vhu7zhu73hu77hu78KKworR3JlZWsgRXh0ZW5kZWQgKFUrMUYwMC1VKzFGRkYpOgorCivhvIDhvIHhvILhvIPhvIThvIXhvIbhvIfhvIjhvInhvIrhvIvhvIzhvI3hvI7hvI/hvJDhvJHhvJLhvJPhvJThvJXhvJbhvJfhvJjhvJnhvJrhvJvhvJzhvJ3hvJ7hvJ/hvKDhvKHhvKLhvKPhvKThvKXhvKbhvKfhvKjhvKnhvKrhvKvhvKzhvK3hvK7hvK/hvLDhvLHhvLLhvLPhvLThvLXhvLbhvLfhvLjhvLnhvLrhvLvhvLzhvL3hvL7hvL8KK+G9gOG9geG9guG9g+G9hOG9heG9huG9h+G9iOG9ieG9iuG9i+G9jOG9jeG9juG9j+G9kOG9keG9kuG9k+G9lOG9leG9luG9l+G9mOG9meG9muG9m+G9nOG9neG9nuG9n+G9oOG9oeG9ouG9o+G9pOG9peG9puG9p+G9qOG9qeG9quG9q+G9rOG9reG9ruG9r+G9sOG9seG9suG9s+G9tOG9teG9tuG9t+G9uOG9ueG9uuG9u+G9vOG9veG9vuG9vwor4b6A4b6B4b6C4b6D4b6E4b6F4b6G4b6H4b6I4b6J4b6K4b6L4b6M4b6N4b6O4b6P4b6Q4b6R4b6S4b6T4b6U4b6V4b6W4b6X4b6Y4b6Z4b6a4b6b4b6c4b6d4b6e4b6f4b6g4b6h4b6i4b6j4b6k4b6l4b6m4b6n4b6o4b6p4b6q4b6r4b6s4b6t4b6u4b6v4b6w4b6x4b6y4b6z4b604b614b624b634b644b654b664b674b684b694b6+4b6/Civhv4Dhv4Hhv4Lhv4Phv4Thv4Xhv4bhv4fhv4jhv4nhv4rhv4vhv4zhv43hv47hv4/hv5Dhv5Hhv5Lhv5Phv5Thv5Xhv5bhv5fhv5jhv5nhv5rhv5vhv5zhv53hv57hv5/hv6Dhv6Hhv6Lhv6Phv6Thv6Xhv6bhv6fhv6jhv6nhv6rhv6vhv6zhv63hv67hv6/hv7Dhv7Hhv7Lhv7Phv7Thv7Xhv7bhv7fhv7jhv7nhv7rhv7vhv7zhv73hv77hv78KKworR2VuZXJhbCBQdW5jdHVhdGlvbiAoVSsyMDAwLVUrMjA2Rik6CisKK+KAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAi+KAjOKAjeKAjuKAj+KAkOKAkeKAkuKAk+KAlOKAleKAluKAl+KAmOKAmeKAmuKAm+KAnOKAneKAnuKAn+KAoOKAoeKAouKAo+KApOKApeKApuKAp+KAqOKAqeKAquKAq+KArOKAreKAruKAr+KAsOKAseKAsuKAs+KAtOKAteKAtuKAt+KAuOKAueKAuuKAu+KAvOKAveKAvuKAvwor4oGA4oGB4oGC4oGD4oGE4oGF4oGG4oGH4oGI4oGJ4oGK4oGL4oGM4oGN4oGO4oGP4oGQ4oGR4oGS4oGT4oGU4oGV4oGW4oGX4oGY4oGZ4oGa4oGb4oGc4oGd4oGe4oGf4oGg4oGh4oGi4oGj4oGk4oGl4oGm4oGn4oGo4oGp4oGq4oGr4oGs4oGt4oGu4oGvCisKK1N1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0cyAoVSsyMDcwLVUrMjA5Rik6CisKK+KBsOKBseKBsuKBs+KBtOKBteKBtuKBt+KBuOKBueKBuuKBu+KBvOKBveKBvuKBv+KCgOKCgeKCguKCg+KChOKCheKChuKCh+KCiOKCieKCiuKCi+KCjOKCjeKCjuKCj+KCkOKCkeKCkuKCk+KClOKCleKCluKCl+KCmOKCmeKCmuKCm+KCnOKCneKCnuKCnworCitDdXJyZW5jeSBTeW1ib2xzIChVKzIwQTAtVSsyMENGKToKKwor4oKg4oKh4oKi4oKj4oKk4oKl4oKm4oKn4oKo4oKp4oKq4oKr4oKs4oKt4oKu4oKv4oKw4oKx4oKy4oKz4oK04oK14oK24oK34oK44oK54oK64oK74oK84oK94oK+4oK/4oOA4oOB4oOC4oOD4oOE4oOF4oOG4oOH4oOI4oOJ4oOK4oOL4oOM4oON4oOO4oOPCisKK0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBmb3IgU3ltYm9scyAoVSsyMEQwLVUrMjBGRik6CisKK+KXjOKDkOKXjOKDkeKXjOKDkuKXjOKDk+KXjOKDlOKXjOKDleKXjOKDluKXjOKDl+KXjOKDmOKXjOKDmeKXjOKDmuKXjOKDm+KXjOKDnCDig50g4oOeIOKDnyDig6Dil4zig6Eg4oOiIOKDoyDig6Til4zig6Xil4zig6bil4zig6fil4zig6jil4zig6nil4zig6rig6vig6zig63ig67ig6/ig7Dig7Hig7Lig7Pig7Tig7Xig7big7fig7jig7nig7rig7vig7zig73ig77ig78KKworTGV0dGVybGlrZSBTeW1ib2xzIChVKzIxMDAtVSsyMTRGKToKKwor4oSA4oSB4oSC4oSD4oSE4oSF4oSG4oSH4oSI4oSJ4oSK4oSL4oSM4oSN4oSO4oSP4oSQ4oSR4oSS4oST4oSU4oSV4oSW4oSX4oSY4oSZ4oSa4oSb4oSc4oSd4oSe4oSf4oSg4oSh4oSi4oSj4oSk4oSl4oSm4oSn4oSo4oSp4oSq4oSr4oSs4oSt4oSu4oSv4oSw4oSx4oSy4oSz4oS04oS14oS24oS34oS44oS54oS64oS74oS84oS94oS+4oS/CivihYDihYHihYLihYPihYTihYXihYbihYfihYjihYnihYrihYvihYzihY3ihY7ihY8KKworTnVtYmVyIEZvcm1zIChVKzIxNTAtVSsyMThGKToKKwor4oWQ4oWR4oWS4oWT4oWU4oWV4oWW4oWX4oWY4oWZ4oWa4oWb4oWc4oWd4oWe4oWf4oWg4oWh4oWi4oWj4oWk4oWl4oWm4oWn4oWo4oWp4oWq4oWr4oWs4oWt4oWu4oWv4oWw4oWx4oWy4oWz4oW04oW14oW24oW34oW44oW54oW64oW74oW84oW94oW+4oW/4oaA4oaB4oaC4oaD4oaE4oaF4oaG4oaH4oaI4oaJ4oaK4oaL4oaM4oaN4oaO4oaPCisKK0Fycm93cyAoVSsyMTkwLVUrMjFGRik6CisKK+KGkOKGkeKGkuKGk+KGlOKGleKGluKGl+KGmOKGmeKGmuKGm+KGnOKGneKGnuKGn+KGoOKGoeKGouKGo+KGpOKGpeKGpuKGp+KGqOKGqeKGquKGq+KGrOKGreKGruKGr+KGsOKGseKGsuKGs+KGtOKGteKGtuKGt+KGuOKGueKGuuKGu+KGvOKGveKGvuKGv+KHgOKHgeKHguKHg+KHhOKHheKHhuKHh+KHiOKHieKHiuKHi+KHjOKHjeKHjuKHjwor4oeQ4oeR4oeS4oeT4oeU4oeV4oeW4oeX4oeY4oeZ4oea4oeb4oec4oed4oee4oef4oeg4oeh4oei4oej4oek4oel4oem4oen4oeo4oep4oeq4oer4oes4oet4oeu4oev4oew4oex4oey4oez4oe04oe14oe24oe34oe44oe54oe64oe74oe84oe94oe+4oe/CisKK01hdGhlbWF0aWNhbCBPcGVyYXRvcnMgKFUrMjIwMC1VKzIyRkYpOgorCiviiIDiiIHiiILiiIPiiITiiIXiiIbiiIfiiIjiiIniiIriiIviiIziiI3iiI7iiI/iiJDiiJHiiJLiiJPiiJTiiJXiiJbiiJfiiJjiiJniiJriiJviiJziiJ3iiJ7iiJ/iiKDiiKHiiKLiiKPiiKTiiKXiiKbiiKfiiKjiiKniiKriiKviiKziiK3iiK7iiK/iiLDiiLHiiLLiiLPiiLTiiLXiiLbiiLfiiLjiiLniiLriiLviiLziiL3iiL7iiL8KK+KJgOKJgeKJguKJg+KJhOKJheKJhuKJh+KJiOKJieKJiuKJi+KJjOKJjeKJjuKJj+KJkOKJkeKJkuKJk+KJlOKJleKJluKJl+KJmOKJmeKJmuKJm+KJnOKJneKJnuKJn+KJoOKJoeKJouKJo+KJpOKJpeKJpuKJp+KJqOKJqeKJquKJq+KJrOKJreKJruKJr+KJsOKJseKJsuKJs+KJtOKJteKJtuKJt+KJuOKJueKJuuKJu+KJvOKJveKJvuKJvwor4oqA4oqB4oqC4oqD4oqE4oqF4oqG4oqH4oqI4oqJ4oqK4oqL4oqM4oqN4oqO4oqP4oqQ4oqR4oqS4oqT4oqU4oqV4oqW4oqX4oqY4oqZ4oqa4oqb4oqc4oqd4oqe4oqf4oqg4oqh4oqi4oqj4oqk4oql4oqm4oqn4oqo4oqp4oqq4oqr4oqs4oqt4oqu4oqv4oqw4oqx4oqy4oqz4oq04oq14oq24oq34oq44oq54oq64oq74oq84oq94oq+4oq/Civii4Dii4Hii4Lii4Pii4Tii4Xii4bii4fii4jii4nii4rii4vii4zii43ii47ii4/ii5Dii5Hii5Lii5Pii5Tii5Xii5bii5fii5jii5nii5rii5vii5zii53ii57ii5/ii6Dii6Hii6Lii6Pii6Tii6Xii6bii6fii6jii6nii6rii6vii6zii63ii67ii6/ii7Dii7Hii7Lii7Pii7Tii7Xii7bii7fii7jii7nii7rii7vii7zii73ii77ii78KKworTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKFUrMjMwMC1VKzIzRkYpOgorCivijIDijIHijILijIPijITijIXijIbijIfijIjijInijIrijIvijIzijI3ijI7ijI/ijJDijJHijJLijJPijJTijJXijJbijJfijJjijJnijJrijJvijJzijJ3ijJ7ijJ/ijKDijKHijKLijKPijKTijKXijKbijKfijKjijKnijKrijKvijKzijK3ijK7ijK/ijLDijLHijLLijLPijLTijLXijLbijLfijLjijLnijLrijLvijLzijL0KK+KMvuKMv+KNgOKNgeKNguKNg+KNhOKNheKNhuKNh+KNiOKNieKNiuKNi+KNjOKNjeKNjuKNj+KNkOKNkeKNkuKNk+KNlOKNleKNluKNl+KNmOKNmeKNmuKNm+KNnOKNneKNnuKNn+KNoOKNoeKNouKNo+KNpOKNpeKNpuKNp+KNqOKNqeKNquKNq+KNrOKNreKNruKNr+KNsOKNseKNsuKNs+KNtOKNteKNtuKNt+KNuOKNueKNuuKNu+KNvOKNvQor4o2+4o2/4o6A4o6B4o6C4o6D4o6E4o6F4o6G4o6H4o6I4o6J4o6K4o6L4o6M4o6N4o6O4o6P4o6Q4o6R4o6S4o6T4o6U4o6V4o6W4o6X4o6Y4o6Z4o6a4o6b4o6c4o6d4o6e4o6f4o6g4o6h4o6i4o6j4o6k4o6l4o6m4o6n4o6o4o6p4o6q4o6r4o6s4o6t4o6u4o6v4o6w4o6x4o6y4o6z4o604o614o624o634o644o654o664o674o684o69Civijr7ijr/ij4Dij4Hij4Lij4Pij4Tij4Xij4bij4fij4jij4nij4rij4vij4zij43ij47ij4/ij5Dij5Hij5Lij5Pij5Tij5Xij5bij5fij5jij5nij5rij5vij5zij53ij57ij5/ij6Dij6Hij6Lij6Pij6Tij6Xij6bij6fij6jij6nij6rij6vij6zij63ij67ij6/ij7Dij7Hij7Lij7Pij7Tij7Xij7bij7fij7jij7nij7rij7vij7zij70KK+KPvuKPvworCitDb250cm9sIFBpY3R1cmVzIChVKzI0MDAtVSsyNDNGKToKKwor4pCA4pCB4pCC4pCD4pCE4pCF4pCG4pCH4pCI4pCJ4pCK4pCL4pCM4pCN4pCO4pCP4pCQ4pCR4pCS4pCT4pCU4pCV4pCW4pCX4pCY4pCZ4pCa4pCb4pCc4pCd4pCe4pCf4pCg4pCh4pCi4pCj4pCk4pCl4pCm4pCn4pCo4pCp4pCq4pCr4pCs4pCt4pCu4pCv4pCw4pCx4pCy4pCz4pC04pC14pC24pC34pC44pC54pC64pC74pC84pC94pC+4pC/CisKK09wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uIChVKzI0NDAtVSsyNDVGKToKKwor4pGA4pGB4pGC4pGD4pGE4pGF4pGG4pGH4pGI4pGJ4pGK4pGL4pGM4pGN4pGO4pGP4pGQ4pGR4pGS4pGT4pGU4pGV4pGW4pGX4pGY4pGZ4pGa4pGb4pGc4pGd4pGe4pGfCisKK0VuY2xvc2VkIEFscGhhbnVtZXJpY3MgKFUrMjQ2MC1VKzI0RkYpOgorCivikaDikaHikaLikaPikaTikaXikabikafikajikanikarikavikazika3ika7ika/ikbDikbHikbLikbPikbTikbXikbbikbfikbjikbnikbrikbvikbzikb3ikb7ikb/ikoDikoHikoLikoPikoTikoXikobikofikojikonikorikovikoziko3iko7iko/ikpDikpHikpLikpPikpTikpXikpbikpfikpjikpnikprikpvikpzikp3ikp7ikp8KK+KSoOKSoeKSouKSo+KSpOKSpeKSpuKSp+KSqOKSqeKSquKSq+KSrOKSreKSruKSr+KSsOKSseKSsuKSs+KStOKSteKStuKSt+KSuOKSueKSuuKSu+KSvOKSveKSvuKSv+KTgOKTgeKTguKTg+KThOKTheKThuKTh+KTiOKTieKTiuKTi+KTjOKTjeKTjuKTj+KTkOKTkeKTkuKTk+KTlOKTleKTluKTl+KTmOKTmeKTmuKTm+KTnOKTneKTnuKTnwor4pOg4pOh4pOi4pOj4pOk4pOl4pOm4pOn4pOo4pOp4pOq4pOr4pOs4pOt4pOu4pOv4pOw4pOx4pOy4pOz4pO04pO14pO24pO34pO44pO54pO64pO74pO84pO94pO+4pO/CisKK0JveCBEcmF3aW5nIChVKzI1MDAtVSsyNTdGKToKKwor4pSA4pSB4pSC4pSD4pSE4pSF4pSG4pSH4pSI4pSJ4pSK4pSL4pSM4pSN4pSO4pSP4pSQ4pSR4pSS4pST4pSU4pSV4pSW4pSX4pSY4pSZ4pSa4pSb4pSc4pSd4pSe4pSf4pSg4pSh4pSi4pSj4pSk4pSl4pSm4pSn4pSo4pSp4pSq4pSr4pSs4pSt4pSu4pSv4pSw4pSx4pSy4pSz4pS04pS14pS24pS34pS44pS54pS64pS74pS84pS94pS+4pS/CivilYDilYHilYLilYPilYTilYXilYbilYfilYjilYnilYrilYvilYzilY3ilY7ilY/ilZDilZHilZLilZPilZTilZXilZbilZfilZjilZnilZrilZvilZzilZ3ilZ7ilZ/ilaDilaHilaLilaPilaTilaXilabilafilajilanilarilavilazila3ila7ila/ilbDilbHilbLilbPilbTilbXilbbilbfilbjilbnilbrilbvilbzilb3ilb7ilb8KKworQmxvY2sgRWxlbWVudHMgKFUrMjU4MC1VKzI1OUYpOgorCiviloDiloHiloLiloPiloTiloXilobilofilojilonilorilovilozilo3ilo7ilo/ilpDilpHilpLilpPilpTilpXilpbilpfilpjilpnilprilpvilpzilp3ilp7ilp8KKworR2VvbWV0cmljIFNoYXBlcyAoVSsyNUEwLVUrMjVGRik6CisKK+KWoOKWoeKWouKWo+KWpOKWpeKWpuKWp+KWqOKWqeKWquKWq+KWrOKWreKWruKWr+KWsOKWseKWsuKWs+KWtOKWteKWtuKWt+KWuOKWueKWuuKWu+KWvOKWveKWvuKWv+KXgOKXgeKXguKXg+KXhOKXheKXhuKXh+KXiOKXieKXiuKXi+KXjOKXjeKXjuKXj+KXkOKXkeKXkuKXk+KXlOKXleKXluKXl+KXmOKXmeKXmuKXm+KXnOKXneKXnuKXnwor4peg4peh4pei4pej4pek4pel4pem4pen4peo4pep4peq4per4pes4pet4peu4pev4pew4pex4pey4pez4pe04pe14pe24pe34pe44pe54pe64pe74pe84pe94pe+4pe/CisKK01pc2NlbGxhbmVvdXMgU3ltYm9scyAoVSsyNjAwLVUrMjZGRik6CisKK+KYgOKYgeKYguKYg+KYhOKYheKYhuKYh+KYiOKYieKYiuKYi+KYjOKYjeKYjuKYj+KYkOKYkeKYkuKYk+KYlOKYleKYluKYl+KYmOKYmeKYmuKYm+KYnOKYneKYnuKYn+KYoOKYoeKYouKYo+KYpOKYpeKYpuKYp+KYqOKYqeKYquKYq+KYrOKYreKYruKYr+KYsOKYseKYsuKYs+KYtOKYteKYtuKYt+KYuOKYueKYuuKYu+KYvOKYveKYvuKYvwor4pmA4pmB4pmC4pmD4pmE4pmF4pmG4pmH4pmI4pmJ4pmK4pmL4pmM4pmN4pmO4pmP4pmQ4pmR4pmS4pmT4pmU4pmV4pmW4pmX4pmY4pmZ4pma4pmb4pmc4pmd4pme4pmf4pmg4pmh4pmi4pmj4pmk4pml4pmm4pmn4pmo4pmp4pmq4pmr4pms4pmt4pmu4pmv4pmw4pmx4pmy4pmz4pm04pm14pm24pm34pm44pm54pm64pm74pm84pm94pm+4pm/CivimoDimoHimoLimoPimoTimoXimobimofimojimonimorimovimozimo3imo7imo/impDimpHimpLimpPimpTimpXimpbimpfimpjimpnimprimpvimpzimp3imp7imp/imqDimqHimqLimqPimqTimqXimqbimqfimqjimqnimqrimqvimqzimq3imq7imq/imrDimrHimrLimrPimrTimrXimrbimrfimrjimrnimrrimrvimrzimr3imr7imr8KK+KbgOKbgeKbguKbg+KbhOKbheKbhuKbh+KbiOKbieKbiuKbi+KbjOKbjeKbjuKbj+KbkOKbkeKbkuKbk+KblOKbleKbluKbl+KbmOKbmeKbmuKbm+KbnOKbneKbnuKbn+KboOKboeKbouKbo+KbpOKbpeKbpuKbp+KbqOKbqeKbquKbq+KbrOKbreKbruKbr+KbsOKbseKbsuKbs+KbtOKbteKbtuKbt+KbuOKbueKbuuKbu+KbvOKbveKbvuKbvworCitEaW5nYmF0cyAoVSsyNzAwLVUrMjdCRik6CisKK+KcgOKcgeKcguKcg+KchOKcheKchuKch+KciOKcieKciuKci+KcjOKcjeKcjuKcj+KckOKckeKckuKck+KclOKcleKcluKcl+KcmOKcmeKcmuKcm+KcnOKcneKcnuKcn+KcoOKcoeKcouKco+KcpOKcpeKcpuKcp+KcqOKcqeKcquKcq+KcrOKcreKcruKcr+KcsOKcseKcsuKcs+KctOKcteKctuKct+KcuOKcueKcuuKcu+KcvOKcveKcvuKcvwor4p2A4p2B4p2C4p2D4p2E4p2F4p2G4p2H4p2I4p2J4p2K4p2L4p2M4p2N4p2O4p2P4p2Q4p2R4p2S4p2T4p2U4p2V4p2W4p2X4p2Y4p2Z4p2a4p2b4p2c4p2d4p2e4p2f4p2g4p2h4p2i4p2j4p2k4p2l4p2m4p2n4p2o4p2p4p2q4p2r4p2s4p2t4p2u4p2v4p2w4p2x4p2y4p2z4p204p214p224p234p244p254p264p274p284p294p2+4p2/CivinoDinoHinoLinoPinoTinoXinobinofinojinoninorinovinozino3ino7ino/inpDinpHinpLinpPinpTinpXinpbinpfinpjinpninprinpvinpzinp3inp7inp/inqDinqHinqLinqPinqTinqXinqbinqfinqjinqninqrinqvinqzinq3inq7inq/inrDinrHinrLinrPinrTinrXinrbinrfinrjinrninrrinrvinrzinr3inr7inr8KKworTWlzY2VsbGFuZW91cyBNYXRoZW1hdGljYWwgU3ltYm9scy1BIChVKzI3QzAtVSsyN0VGKToKKwor4p+A4p+B4p+C4p+D4p+E4p+F4p+G4p+H4p+I4p+J4p+K4p+L4p+M4p+N4p+O4p+P4p+Q4p+R4p+S4p+T4p+U4p+V4p+W4p+X4p+Y4p+Z4p+a4p+b4p+c4p+d4p+e4p+f4p+g4p+h4p+i4p+j4p+k4p+l4p+m4p+n4p+o4p+p4p+q4p+r4p+s4p+t4p+u4p+vCisKK1N1cHBsZW1lbnRhbCBBcnJvd3MtQSAoVSsyN0YwLVUrMjdGRik6CisKK+KfsOKfseKfsuKfs+KftOKfteKftuKft+KfuOKfueKfuuKfu+KfvOKfveKfvuKfvworCitCcmFpbGxlIFBhdHRlcm5zIChVKzI4MDAtVSsyOEZGKToKKwor4qCA4qCB4qCC4qCD4qCE4qCF4qCG4qCH4qCI4qCJ4qCK4qCL4qCM4qCN4qCO4qCP4qCQ4qCR4qCS4qCT4qCU4qCV4qCW4qCX4qCY4qCZ4qCa4qCb4qCc4qCd4qCe4qCf4qCg4qCh4qCi4qCj4qCk4qCl4qCm4qCn4qCo4qCp4qCq4qCr4qCs4qCt4qCu4qCv4qCw4qCx4qCy4qCz4qC04qC14qC24qC34qC44qC54qC64qC74qC84qC94qC+4qC/CivioYDioYHioYLioYPioYTioYXioYbioYfioYjioYnioYrioYvioYzioY3ioY7ioY/ioZDioZHioZLioZPioZTioZXioZbioZfioZjioZnioZrioZvioZzioZ3ioZ7ioZ/ioaDioaHioaLioaPioaTioaXioabioafioajioanioarioavioazioa3ioa7ioa/iobDiobHiobLiobPiobTiobXiobbiobfiobjiobniobriobviobziob3iob7iob8KK+KigOKigeKiguKig+KihOKiheKihuKih+KiiOKiieKiiuKii+KijOKijeKijuKij+KikOKikeKikuKik+KilOKileKiluKil+KimOKimeKimuKim+KinOKineKinuKin+KioOKioeKiouKio+KipOKipeKipuKip+KiqOKiqeKiquKiq+KirOKireKiruKir+KisOKiseKisuKis+KitOKiteKituKit+KiuOKiueKiuuKiu+KivOKiveKivuKivwor4qOA4qOB4qOC4qOD4qOE4qOF4qOG4qOH4qOI4qOJ4qOK4qOL4qOM4qON4qOO4qOP4qOQ4qOR4qOS4qOT4qOU4qOV4qOW4qOX4qOY4qOZ4qOa4qOb4qOc4qOd4qOe4qOf4qOg4qOh4qOi4qOj4qOk4qOl4qOm4qOn4qOo4qOp4qOq4qOr4qOs4qOt4qOu4qOv4qOw4qOx4qOy4qOz4qO04qO14qO24qO34qO44qO54qO64qO74qO84qO94qO+4qO/CisKK1N1cHBsZW1lbnRhbCBBcnJvd3MtQiAoVSsyOTAwLVUrMjk3Rik6CisKK+KkgOKkgeKkguKkg+KkhOKkheKkhuKkh+KkiOKkieKkiuKki+KkjOKkjeKkjuKkj+KkkOKkkeKkkuKkk+KklOKkleKkluKkl+KkmOKkmeKkmuKkm+KknOKkneKknuKkn+KkoOKkoeKkouKko+KkpOKkpeKkpuKkp+KkqOKkqeKkquKkq+KkrOKkreKkruKkr+KksOKkseKksuKks+KktOKkteKktuKkt+KkuOKkueKkuuKku+KkvOKkveKkvuKkvwor4qWA4qWB4qWC4qWD4qWE4qWF4qWG4qWH4qWI4qWJ4qWK4qWL4qWM4qWN4qWO4qWP4qWQ4qWR4qWS4qWT4qWU4qWV4qWW4qWX4qWY4qWZ4qWa4qWb4qWc4qWd4qWe4qWf4qWg4qWh4qWi4qWj4qWk4qWl4qWm4qWn4qWo4qWp4qWq4qWr4qWs4qWt4qWu4qWv4qWw4qWx4qWy4qWz4qW04qW14qW24qW34qW44qW54qW64qW74qW84qW94qW+4qW/CisKK01pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQiAoVSsyOTgwLVUrMjlGRik6CisKK+KmgOKmgeKmguKmg+KmhOKmheKmhuKmh+KmiOKmieKmiuKmi+KmjOKmjeKmjuKmj+KmkOKmkeKmkuKmk+KmlOKmleKmluKml+KmmOKmmeKmmuKmm+KmnOKmneKmnuKmn+KmoOKmoeKmouKmo+KmpOKmpeKmpuKmp+KmqOKmqeKmquKmq+KmrOKmreKmruKmr+KmsOKmseKmsuKms+KmtOKmteKmtuKmt+KmuOKmueKmuuKmu+KmvOKmveKmvuKmvwor4qeA4qeB4qeC4qeD4qeE4qeF4qeG4qeH4qeI4qeJ4qeK4qeL4qeM4qeN4qeO4qeP4qeQ4qeR4qeS4qeT4qeU4qeV4qeW4qeX4qeY4qeZ4qea4qeb4qec4qed4qee4qef4qeg4qeh4qei4qej4qek4qel4qem4qen4qeo4qep4qeq4qer4qes4qet4qeu4qev4qew4qex4qey4qez4qe04qe14qe24qe34qe44qe54qe64qe74qe84qe94qe+4qe/CisKK1N1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIChVKzJBMDAtVSsyQUZGKToKKwor4qiA4qiB4qiC4qiD4qiE4qiF4qiG4qiH4qiI4qiJ4qiK4qiL4qiM4qiN4qiO4qiP4qiQ4qiR4qiS4qiT4qiU4qiV4qiW4qiX4qiY4qiZ4qia4qib4qic4qid4qie4qif4qig4qih4qii4qij4qik4qil4qim4qin4qio4qip4qiq4qir4qis4qit4qiu4qiv4qiw4qix4qiy4qiz4qi04qi14qi24qi34qi44qi54qi64qi74qi84qi94qi+4qi/CiviqYDiqYHiqYLiqYPiqYTiqYXiqYbiqYfiqYjiqYniqYriqYviqYziqY3iqY7iqY/iqZDiqZHiqZLiqZPiqZTiqZXiqZbiqZfiqZjiqZniqZriqZviqZziqZ3iqZ7iqZ/iqaDiqaHiqaLiqaPiqaTiqaXiqabiqafiqajiqaniqariqaviqaziqa3iqa7iqa/iqbDiqbHiqbLiqbPiqbTiqbXiqbbiqbfiqbjiqbniqbriqbviqbziqb3iqb7iqb8KK+KqgOKqgeKqguKqg+KqhOKqheKqhuKqh+KqiOKqieKqiuKqi+KqjOKqjeKqjuKqj+KqkOKqkeKqkuKqk+KqlOKqleKqluKql+KqmOKqmeKqmuKqm+KqnOKqneKqnuKqn+KqoOKqoeKqouKqo+KqpOKqpeKqpuKqp+KqqOKqqeKqquKqq+KqrOKqreKqruKqr+KqsOKqseKqsuKqs+KqtOKqteKqtuKqt+KquOKqueKquuKqu+KqvOKqveKqvuKqvwor4quA4quB4quC4quD4quE4quF4quG4quH4quI4quJ4quK4quL4quM4quN4quO4quP4quQ4quR4quS4quT4quU4quV4quW4quX4quY4quZ4qua4qub4quc4qud4que4quf4qug4quh4qui4quj4quk4qul4qum4qun4quo4qup4quq4qur4qus4qut4quu4quv4quw4qux4quy4quz4qu04qu14qu24qu34qu44qu54qu64qu74qu84qu94qu+4qu/CisKK01pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzIChVKzJCMDAtVSsyQkZGKToKKwor4qyA4qyB4qyC4qyD4qyE4qyF4qyG4qyH4qyI4qyJ4qyK4qyL4qyM4qyN4qyO4qyP4qyQ4qyR4qyS4qyT4qyU4qyV4qyW4qyX4qyY4qyZ4qya4qyb4qyc4qyd4qye4qyf4qyg4qyh4qyi4qyj4qyk4qyl4qym4qyn4qyo4qyp4qyq4qyr4qys4qyt4qyu4qyv4qyw4qyx4qyy4qyz4qy04qy14qy24qy34qy44qy54qy64qy74qy84qy94qy+4qy/CivirYDirYHirYLirYPirYTirYXirYbirYfirYjirYnirYrirYvirYzirY3irY7irY/irZDirZHirZLirZPirZTirZXirZbirZfirZjirZnirZrirZvirZzirZ3irZ7irZ/iraDiraHiraLiraPiraTiraXirabirafirajiranirariravirazira3ira7ira/irbDirbHirbLirbPirbTirbXirbbirbfirbjirbnirbrirbvirbzirb3irb7irb8KK+KugOKugeKuguKug+KuhOKuheKuhuKuh+KuiOKuieKuiuKui+KujOKujeKujuKuj+KukOKukeKukuKuk+KulOKuleKuluKul+KumOKumeKumuKum+KunOKuneKunuKun+KuoOKuoeKuouKuo+KupOKupeKupuKup+KuqOKuqeKuquKuq+KurOKureKuruKur+KusOKuseKusuKus+KutOKuteKutuKut+KuuOKuueKuuuKuu+KuvOKuveKuvuKuvwor4q+A4q+B4q+C4q+D4q+E4q+F4q+G4q+H4q+I4q+J4q+K4q+L4q+M4q+N4q+O4q+P4q+Q4q+R4q+S4q+T4q+U4q+V4q+W4q+X4q+Y4q+Z4q+a4q+b4q+c4q+d4q+e4q+f4q+g4q+h4q+i4q+j4q+k4q+l4q+m4q+n4q+o4q+p4q+q4q+r4q+s4q+t4q+u4q+v4q+w4q+x4q+y4q+z4q+04q+14q+24q+34q+44q+54q+64q+74q+84q+94q++4q+/CisKK0ZyZWUgYmxvY2sgKFUrMkMwMC1VKzJFN0YpOgorCivisIDisIHisILisIPisITisIXisIbisIfisIjisInisIrisIvisIzisI3isI7isI/isJDisJHisJLisJPisJTisJXisJbisJfisJjisJnisJrisJvisJzisJ3isJ7isJ/isKDisKHisKLisKPisKTisKXisKbisKfisKjisKnisKrisKvisKzisK3isK7isK/isLDisLHisLLisLPisLTisLXisLbisLfisLjisLnisLrisLvisLzisL3isL7isL8KK+KxgOKxgeKxguKxg+KxhOKxheKxhuKxh+KxiOKxieKxiuKxi+KxjOKxjeKxjuKxj+KxkOKxkeKxkuKxk+KxlOKxleKxluKxl+KxmOKxmeKxmuKxm+KxnOKxneKxnuKxn+KxoOKxoeKxouKxo+KxpOKxpeKxpuKxp+KxqOKxqeKxquKxq+KxrOKxreKxruKxr+KxsOKxseKxsuKxs+KxtOKxteKxtuKxt+KxuOKxueKxuuKxu+KxvOKxveKxvuKxvwor4rKA4rKB4rKC4rKD4rKE4rKF4rKG4rKH4rKI4rKJ4rKK4rKL4rKM4rKN4rKO4rKP4rKQ4rKR4rKS4rKT4rKU4rKV4rKW4rKX4rKY4rKZ4rKa4rKb4rKc4rKd4rKe4rKf4rKg4rKh4rKi4rKj4rKk4rKl4rKm4rKn4rKo4rKp4rKq4rKr4rKs4rKt4rKu4rKv4rKw4rKx4rKy4rKz4rK04rK14rK24rK34rK44rK54rK64rK74rK84rK94rK+4rK/Civis4Dis4His4Lis4Pis4Tis4Xis4bis4fis4jis4nis4ris4vis4zis43is47is4/is5Dis5His5Lis5Pis5Tis5Xis5bis5fis5jis5nis5ris5vis5zis53is57is5/is6Dis6His6Lis6Pis6Tis6Xis6bis6fis6jis6nis6ris6vis6zis63is67is6/is7Dis7His7Lis7Pis7Tis7Xis7bis7fis7jis7nis7ris7vis7zis73is77is78KK+K0gOK0geK0guK0g+K0hOK0heK0huK0h+K0iOK0ieK0iuK0i+K0jOK0jeK0juK0j+K0kOK0keK0kuK0k+K0lOK0leK0luK0l+K0mOK0meK0muK0m+K0nOK0neK0nuK0n+K0oOK0oeK0ouK0o+K0pOK0peK0puK0p+K0qOK0qeK0quK0q+K0rOK0reK0ruK0r+K0sOK0seK0suK0s+K0tOK0teK0tuK0t+K0uOK0ueK0uuK0u+K0vOK0veK0vuK0vwor4rWA4rWB4rWC4rWD4rWE4rWF4rWG4rWH4rWI4rWJ4rWK4rWL4rWM4rWN4rWO4rWP4rWQ4rWR4rWS4rWT4rWU4rWV4rWW4rWX4rWY4rWZ4rWa4rWb4rWc4rWd4rWe4rWf4rWg4rWh4rWi4rWj4rWk4rWl4rWm4rWn4rWo4rWp4rWq4rWr4rWs4rWt4rWu4rWv4rWw4rWx4rWy4rWz4rW04rW14rW24rW34rW44rW54rW64rW74rW84rW94rW+4rW/CivitoDitoHitoLitoPitoTitoXitobitofitojitonitoritovitozito3ito7ito/itpDitpHitpLitpPitpTitpXitpbitpfitpjitpnitpritpvitpzitp3itp7itp/itqDitqHitqLitqPitqTitqXitqbitqfitqjitqnitqritqvitqzitq3itq7itq/itrDitrHitrLitrPitrTitrXitrbitrfitrjitrnitrritrvitrzitr3itr7itr8KK+K3gOK3geK3guK3g+K3hOK3heK3huK3h+K3iOK3ieK3iuK3i+K3jOK3jeK3juK3j+K3kOK3keK3kuK3k+K3lOK3leK3luK3l+K3mOK3meK3muK3m+K3nOK3neK3nuK3n+K3oOK3oeK3ouK3o+K3pOK3peK3puK3p+K3qOK3qeK3quK3q+K3rOK3reK3ruK3r+K3sOK3seK3suK3s+K3tOK3teK3tuK3t+K3uOK3ueK3uuK3u+K3vOK3veK3vuK3vwor4riA4riB4riC4riD4riE4riF4riG4riH4riI4riJ4riK4riL4riM4riN4riO4riP4riQ4riR4riS4riT4riU4riV4riW4riX4riY4riZ4ria4rib4ric4rid4rie4rif4rig4rih4rii4rij4rik4ril4rim4rin4rio4rip4riq4rir4ris4rit4riu4riv4riw4rix4riy4riz4ri04ri14ri24ri34ri44ri54ri64ri74ri84ri94ri+4ri/CiviuYDiuYHiuYLiuYPiuYTiuYXiuYbiuYfiuYjiuYniuYriuYviuYziuY3iuY7iuY/iuZDiuZHiuZLiuZPiuZTiuZXiuZbiuZfiuZjiuZniuZriuZviuZziuZ3iuZ7iuZ/iuaDiuaHiuaLiuaPiuaTiuaXiuabiuafiuajiuaniuariuaviuaziua3iua7iua/iubDiubHiubLiubPiubTiubXiubbiubfiubjiubniubriubviubziub3iub7iub8KKworQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQgKFUrMkU4MC1VKzJFRkYpOgorCiviuoDiuoHiuoLiuoPiuoTiuoXiuobiuofiuojiuoniuoriuoviuoziuo3iuo7iuo/iupDiupHiupLiupPiupTiupXiupbiupfiupjiupniupriupviupziup3iup7iup8KK+K6oOK6oeK6ouK6o+K6pOK6peK6puK6p+K6qOK6qeK6quK6q+K6rOK6reK6ruK6r+K6sOK6seK6suK6s+K6tOK6teK6tuK6t+K6uOK6ueK6uuK6u+K6vOK6veK6vuK6vwor4ruA4ruB4ruC4ruD4ruE4ruF4ruG4ruH4ruI4ruJ4ruK4ruL4ruM4ruN4ruO4ruP4ruQ4ruR4ruS4ruT4ruU4ruV4ruW4ruX4ruY4ruZ4rua4rub4ruc4rud4rue4rufCiviu6Diu6Hiu6Liu6Piu6Tiu6Xiu6biu6fiu6jiu6niu6riu6viu6ziu63iu67iu6/iu7Diu7Hiu7Liu7Piu7Tiu7Xiu7biu7fiu7jiu7niu7riu7viu7ziu73iu77iu78KKworS2FuZ3hpIFJhZGljYWxzIChVKzJGMDAtVSsyRkRGKToKKwor4ryA4ryB4ryC4ryD4ryE4ryF4ryG4ryH4ryI4ryJ4ryK4ryL4ryM4ryN4ryO4ryP4ryQ4ryR4ryS4ryT4ryU4ryV4ryW4ryX4ryY4ryZ4rya4ryb4ryc4ryd4rye4ryfCivivKDivKHivKLivKPivKTivKXivKbivKfivKjivKnivKrivKvivKzivK3ivK7ivK/ivLDivLHivLLivLPivLTivLXivLbivLfivLjivLnivLrivLvivLzivL3ivL7ivL8KK+K9gOK9geK9guK9g+K9hOK9heK9huK9h+K9iOK9ieK9iuK9i+K9jOK9jeK9juK9j+K9kOK9keK9kuK9k+K9lOK9leK9luK9l+K9mOK9meK9muK9m+K9nOK9neK9nuK9nwor4r2g4r2h4r2i4r2j4r2k4r2l4r2m4r2n4r2o4r2p4r2q4r2r4r2s4r2t4r2u4r2v4r2w4r2x4r2y4r2z4r204r214r224r234r244r254r264r274r284r294r2+4r2/CivivoDivoHivoLivoPivoTivoXivobivofivojivonivorivovivozivo3ivo7ivo/ivpDivpHivpLivpPivpTivpXivpbivpfivpjivpnivprivpvivpzivp3ivp7ivp8KK+K+oOK+oeK+ouK+o+K+pOK+peK+puK+p+K+qOK+qeK+quK+q+K+rOK+reK+ruK+r+K+sOK+seK+suK+s+K+tOK+teK+tuK+t+K+uOK+ueK+uuK+u+K+vOK+veK+vuK+vwor4r+A4r+B4r+C4r+D4r+E4r+F4r+G4r+H4r+I4r+J4r+K4r+L4r+M4r+N4r+O4r+P4r+Q4r+R4r+S4r+T4r+U4r+V4r+W4r+X4r+Y4r+Z4r+a4r+b4r+c4r+d4r+e4r+fCisKK0ZyZWUgYmxvY2sgKFUrMkZFMC1VKzJGRUYpOgorCiviv6Div6Hiv6Liv6Piv6Tiv6Xiv6biv6fiv6jiv6niv6riv6viv6ziv63iv67iv68KKworSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyAoVSsyRkYwLVUrMkZGRik6CisKK+K/sOK/seK/suK/s+K/tOK/teK/tuK/t+K/uOK/ueK/uuK/u+K/vOK/veK/vuK/vworCitDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24gKFUrMzAwMC1VKzMwM0YpOgorCivjgIDjgIHjgILjgIPjgITjgIXjgIbjgIfjgIjjgInjgIrjgIvjgIzjgI3jgI7jgI/jgJDjgJHjgJLjgJPjgJTjgJXjgJbjgJfjgJjjgJnjgJrjgJvjgJzjgJ3jgJ7jgJ8KK+OAoOOAoeOAouOAo+OApOOApeOApuOAp+OAqOOAqeKXjOOAquKXjOOAq+KXjOOArOKXjOOAreKXjOOAruKXjOOAr+OAsOOAseOAsuOAs+OAtOOAteOAtuOAt+OAuOOAueOAuuOAu+OAvOOAveOAvuOAvworCitIaXJhZ2FuYSAoVSszMDQwLVUrMzA5Rik6CisKK+OBgOOBgeOBguOBg+OBhOOBheOBhuOBh+OBiOOBieOBiuOBi+OBjOOBjeOBjuOBj+OBkOOBkeOBkuOBk+OBlOOBleOBluOBl+OBmOOBmeOBmuOBm+OBnOOBneOBnuOBnwor44Gg44Gh44Gi44Gj44Gk44Gl44Gm44Gn44Go44Gp44Gq44Gr44Gs44Gt44Gu44Gv44Gw44Gx44Gy44Gz44G044G144G244G344G444G544G644G744G844G944G+44G/CivjgoDjgoHjgoLjgoPjgoTjgoXjgobjgofjgojjgonjgorjgovjgozjgo3jgo7jgo/jgpDjgpHjgpLjgpPjgpTjgpXjgpbjgpfjgpjil4zjgpnil4zjgprjgpvjgpzjgp3jgp7jgp8KKworS2F0YWthbmEgKFUrMzBBMC1VKzMwRkYpOgorCivjgqDjgqHjgqLjgqPjgqTjgqXjgqbjgqfjgqjjgqnjgqrjgqvjgqzjgq3jgq7jgq/jgrDjgrHjgrLjgrPjgrTjgrXjgrbjgrfjgrjjgrnjgrrjgrvjgrzjgr3jgr7jgr8KK+ODgOODgeODguODg+ODhOODheODhuODh+ODiOODieODiuODi+ODjOODjeODjuODj+ODkOODkeODkuODk+ODlOODleODluODl+ODmOODmeODmuODm+ODnOODneODnuODnwor44Og44Oh44Oi44Oj44Ok44Ol44Om44On44Oo44Op44Oq44Or44Os44Ot44Ou44Ov44Ow44Ox44Oy44Oz44O044O144O244O344O444O544O644O744O844O944O+44O/CisKK0JvcG9tb2ZvIChVKzMxMDAtVSszMTJGKToKKwor44SA44SB44SC44SD44SE44SF44SG44SH44SI44SJ44SK44SL44SM44SN44SO44SP44SQ44SR44SS44ST44SU44SV44SW44SX44SY44SZ44Sa44Sb44Sc44Sd44Se44SfCivjhKDjhKHjhKLjhKPjhKTjhKXjhKbjhKfjhKjjhKnjhKrjhKvjhKzjhK3jhK7jhK8KKworSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyAoVSszMTMwLVUrMzE4Rik6CisKK+OEsOOEseOEsuOEs+OEtOOEteOEtuOEt+OEuOOEueOEuuOEu+OEvOOEveOEvuOEv+OFgOOFgeOFguOFg+OFhOOFheOFhuOFh+OFiOOFieOFiuOFi+OFjOOFjeOFjuOFjwor44WQ44WR44WS44WT44WU44WV44WW44WX44WY44WZ44Wa44Wb44Wc44Wd44We44Wf44Wg44Wh44Wi44Wj44Wk44Wl44Wm44Wn44Wo44Wp44Wq44Wr44Ws44Wt44Wu44WvCivjhbDjhbHjhbLjhbPjhbTjhbXjhbbjhbfjhbjjhbnjhbrjhbvjhbzjhb3jhb7jhb/jhoDjhoHjhoLjhoPjhoTjhoXjhobjhofjhojjhonjhorjhovjhozjho3jho7jho8KKworS2FuYnVuIChVKzMxOTAtVSszMTlGKToKKwor44aQ44aR44aS44aT44aU44aV44aW44aX44aY44aZ44aa44ab44ac44ad44ae44afCisKK0JvcG9tb2ZvIEV4dGVuZGVkIChVKzMxQTAtVSszMUJGKToKKwor44ag44ah44ai44aj44ak44al44am44an44ao44ap44aq44ar44as44at44au44av44aw44ax44ay44az44a044a144a244a344a444a544a644a744a844a944a+44a/CisKK0ZyZWUgYmxvY2sgKFUrMzFDMC1VKzMxRUYpOgorCivjh4Djh4Hjh4Ljh4Pjh4Tjh4Xjh4bjh4fjh4jjh4njh4rjh4vjh4zjh43jh47jh4/jh5Djh5Hjh5Ljh5Pjh5Tjh5Xjh5bjh5fjh5jjh5njh5rjh5vjh5zjh53jh57jh58KK+OHoOOHoeOHouOHo+OHpOOHpeOHpuOHp+OHqOOHqeOHquOHq+OHrOOHreOHruOHrworCitLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zIChVKzMxRjAtVSszMUZGKToKKwor44ew44ex44ey44ez44e044e144e244e344e444e544e644e744e844e944e+44e/CisKK0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgKFUrMzIwMC1VKzMyRkYpOgorCivjiIDjiIHjiILjiIPjiITjiIXjiIbjiIfjiIjjiInjiIrjiIvjiIzjiI3jiI7jiI/jiJDjiJHjiJLjiJPjiJTjiJXjiJbjiJfjiJjjiJnjiJrjiJvjiJzjiJ3jiJ7jiJ8KK+OIoOOIoeOIouOIo+OIpOOIpeOIpuOIp+OIqOOIqeOIquOIq+OIrOOIreOIruOIr+OIsOOIseOIsuOIs+OItOOIteOItuOIt+OIuOOIueOIuuOIu+OIvOOIveOIvuOIvwor44mA44mB44mC44mD44mE44mF44mG44mH44mI44mJ44mK44mL44mM44mN44mO44mP44mQ44mR44mS44mT44mU44mV44mW44mX44mY44mZ44ma44mb44mc44md44me44mfCivjiaDjiaHjiaLjiaPjiaTjiaXjiabjiafjiajjianjiarjiavjiazjia3jia7jia/jibDjibHjibLjibPjibTjibXjibbjibfjibjjibnjibrjibvjibzjib3jib7jib8KK+OKgOOKgeOKguOKg+OKhOOKheOKhuOKh+OKiOOKieOKiuOKi+OKjOOKjeOKjuOKj+OKkOOKkeOKkuOKk+OKlOOKleOKluOKl+OKmOOKmeOKmuOKm+OKnOOKneOKnuOKnwor44qg44qh44qi44qj44qk44ql44qm44qn44qo44qp44qq44qr44qs44qt44qu44qv44qw44qx44qy44qz44q044q144q244q344q444q544q644q744q844q944q+44q/Civji4Dji4Hji4Lji4Pji4Tji4Xji4bji4fji4jji4nji4rji4vji4zji43ji47ji4/ji5Dji5Hji5Lji5Pji5Tji5Xji5bji5fji5jji5nji5rji5vji5zji53ji57ji58KK+OLoOOLoeOLouOLo+OLpOOLpeOLpuOLp+OLqOOLqeOLquOLq+OLrOOLreOLruOLr+OLsOOLseOLsuOLs+OLtOOLteOLtuOLt+OLuOOLueOLuuOLu+OLvOOLveOLvuOLvworCitDSksgQ29tcGF0aWJpbGl0eSAoVSszMzAwLVUrMzNGRik6CisKK+OMgOOMgeOMguOMg+OMhOOMheOMhuOMh+OMiOOMieOMiuOMi+OMjOOMjeOMjuOMj+OMkOOMkeOMkuOMk+OMlOOMleOMluOMl+OMmOOMmeOMmuOMm+OMnOOMneOMnuOMnwor44yg44yh44yi44yj44yk44yl44ym44yn44yo44yp44yq44yr44ys44yt44yu44yv44yw44yx44yy44yz44y044y144y244y344y444y544y644y744y844y944y+44y/CivjjYDjjYHjjYLjjYPjjYTjjYXjjYbjjYfjjYjjjYnjjYrjjYvjjYzjjY3jjY7jjY/jjZDjjZHjjZLjjZPjjZTjjZXjjZbjjZfjjZjjjZnjjZrjjZvjjZzjjZ3jjZ7jjZ8KK+ONoOONoeONouONo+ONpOONpeONpuONp+ONqOONqeONquONq+ONrOONreONruONr+ONsOONseONsuONs+ONtOONteONtuONt+ONuOONueONuuONu+ONvOONveONvuONvwor446A446B446C446D446E446F446G446H446I446J446K446L446M446N446O446P446Q446R446S446T446U446V446W446X446Y446Z446a446b446c446d446e446fCivjjqDjjqHjjqLjjqPjjqTjjqXjjqbjjqfjjqjjjqnjjqrjjqvjjqzjjq3jjq7jjq/jjrDjjrHjjrLjjrPjjrTjjrXjjrbjjrfjjrjjjrnjjrrjjrvjjrzjjr3jjr7jjr8KK+OPgOOPgeOPguOPg+OPhOOPheOPhuOPh+OPiOOPieOPiuOPi+OPjOOPjeOPjuOPj+OPkOOPkeOPkuOPk+OPlOOPleOPluOPl+OPmOOPmeOPmuOPm+OPnOOPneOPnuOPnwor44+g44+h44+i44+j44+k44+l44+m44+n44+o44+p44+q44+r44+s44+t44+u44+v44+w44+x44+y44+z44+044+144+244+344+444+544+644+744+844+944++44+/CisKK0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEgKFUrMzQwMC1VKzREQkYpOgorCivjkIDjkIHjkILjkIPjkITjkIXjkIbjkIfjkIjjkInjkIrjkIvjkIzjkI3jkI7jkI/jkJDjkJHjkJLjkJPjkJTjkJXjkJbjkJfjkJjjkJnjkJrjkJvjkJzjkJ3jkJ7jkJ8KK+OQoOOQoeOQouOQo+OQpOOQpeOQpuOQp+OQqOOQqeOQquOQq+OQrOOQreOQruOQr+OQsOOQseOQsuOQs+OQtOOQteOQtuOQt+OQuOOQueOQuuOQu+OQvOOQveOQvuOQvwor45GA45GB45GC45GD45GE45GF45GG45GH45GI45GJ45GK45GL45GM45GN45GO45GP45GQ45GR45GS45GT45GU45GV45GW45GX45GY45GZ45Ga45Gb45Gc45Gd45Ge45GfCivjkaDjkaHjkaLjkaPjkaTjkaXjkabjkafjkajjkanjkarjkavjkazjka3jka7jka/jkbDjkbHjkbLjkbPjkbTjkbXjkbbjkbfjkbjjkbnjkbrjkbvjkbzjkb3jkb7jkb8KK+OSgOOSgeOSguOSg+OShOOSheOShuOSh+OSiOOSieOSiuOSi+OSjOOSjeOSjuOSj+OSkOOSkeOSkuOSk+OSlOOSleOSluOSl+OSmOOSmeOSmuOSm+OSnOOSneOSnuOSnwor45Kg45Kh45Ki45Kj45Kk45Kl45Km45Kn45Ko45Kp45Kq45Kr45Ks45Kt45Ku45Kv45Kw45Kx45Ky45Kz45K045K145K245K345K445K545K645K745K845K945K+45K/Civjk4Djk4Hjk4Ljk4Pjk4Tjk4Xjk4bjk4fjk4jjk4njk4rjk4vjk4zjk43jk47jk4/jk5Djk5Hjk5Ljk5Pjk5Tjk5Xjk5bjk5fjk5jjk5njk5rjk5vjk5zjk53jk57jk58KK+OToOOToeOTouOTo+OTpOOTpeOTpuOTp+OTqOOTqeOTquOTq+OTrOOTreOTruOTr+OTsOOTseOTsuOTs+OTtOOTteOTtuOTt+OTuOOTueOTuuOTu+OTvOOTveOTvuOTvwor45SA45SB45SC45SD45SE45SF45SG45SH45SI45SJ45SK45SL45SM45SN45SO45SP45SQ45SR45SS45ST45SU45SV45SW45SX45SY45SZ45Sa45Sb45Sc45Sd45Se45SfCivjlKDjlKHjlKLjlKPjlKTjlKXjlKbjlKfjlKjjlKnjlKrjlKvjlKzjlK3jlK7jlK/jlLDjlLHjlLLjlLPjlLTjlLXjlLbjlLfjlLjjlLnjlLrjlLvjlLzjlL3jlL7jlL8KK+OVgOOVgeOVguOVg+OVhOOVheOVhuOVh+OViOOVieOViuOVi+OVjOOVjeOVjuOVj+OVkOOVkeOVkuOVk+OVlOOVleOVluOVl+OVmOOVmeOVmuOVm+OVnOOVneOVnuOVnwor45Wg45Wh45Wi45Wj45Wk45Wl45Wm45Wn45Wo45Wp45Wq45Wr45Ws45Wt45Wu45Wv45Ww45Wx45Wy45Wz45W045W145W245W345W445W545W645W745W845W945W+45W/CivjloDjloHjloLjloPjloTjloXjlobjlofjlojjlonjlorjlovjlozjlo3jlo7jlo/jlpDjlpHjlpLjlpPjlpTjlpXjlpbjlpfjlpjjlpnjlprjlpvjlpzjlp3jlp7jlp8KK+OWoOOWoeOWouOWo+OWpOOWpeOWpuOWp+OWqOOWqeOWquOWq+OWrOOWreOWruOWr+OWsOOWseOWsuOWs+OWtOOWteOWtuOWt+OWuOOWueOWuuOWu+OWvOOWveOWvuOWvwor45eA45eB45eC45eD45eE45eF45eG45eH45eI45eJ45eK45eL45eM45eN45eO45eP45eQ45eR45eS45eT45eU45eV45eW45eX45eY45eZ45ea45eb45ec45ed45ee45efCivjl6Djl6Hjl6Ljl6Pjl6Tjl6Xjl6bjl6fjl6jjl6njl6rjl6vjl6zjl63jl67jl6/jl7Djl7Hjl7Ljl7Pjl7Tjl7Xjl7bjl7fjl7jjl7njl7rjl7vjl7zjl73jl77jl78KK+OYgOOYgeOYguOYg+OYhOOYheOYhuOYh+OYiOOYieOYiuOYi+OYjOOYjeOYjuOYj+OYkOOYkeOYkuOYk+OYlOOYleOYluOYl+OYmOOYmeOYmuOYm+OYnOOYneOYnuOYnwor45ig45ih45ii45ij45ik45il45im45in45io45ip45iq45ir45is45it45iu45iv45iw45ix45iy45iz45i045i145i245i345i445i545i645i745i845i945i+45i/CivjmYDjmYHjmYLjmYPjmYTjmYXjmYbjmYfjmYjjmYnjmYrjmYvjmYzjmY3jmY7jmY/jmZDjmZHjmZLjmZPjmZTjmZXjmZbjmZfjmZjjmZnjmZrjmZvjmZzjmZ3jmZ7jmZ8KK+OZoOOZoeOZouOZo+OZpOOZpeOZpuOZp+OZqOOZqeOZquOZq+OZrOOZreOZruOZr+OZsOOZseOZsuOZs+OZtOOZteOZtuOZt+OZuOOZueOZuuOZu+OZvOOZveOZvuOZvwor45qA45qB45qC45qD45qE45qF45qG45qH45qI45qJ45qK45qL45qM45qN45qO45qP45qQ45qR45qS45qT45qU45qV45qW45qX45qY45qZ45qa45qb45qc45qd45qe45qfCivjmqDjmqHjmqLjmqPjmqTjmqXjmqbjmqfjmqjjmqnjmqrjmqvjmqzjmq3jmq7jmq/jmrDjmrHjmrLjmrPjmrTjmrXjmrbjmrfjmrjjmrnjmrrjmrvjmrzjmr3jmr7jmr8KK+ObgOObgeObguObg+ObhOObheObhuObh+ObiOObieObiuObi+ObjOObjeObjuObj+ObkOObkeObkuObk+OblOObleObluObl+ObmOObmeObmuObm+ObnOObneObnuObnwor45ug45uh45ui45uj45uk45ul45um45un45uo45up45uq45ur45us45ut45uu45uv45uw45ux45uy45uz45u045u145u245u345u445u545u645u745u845u945u+45u/CivjnIDjnIHjnILjnIPjnITjnIXjnIbjnIfjnIjjnInjnIrjnIvjnIzjnI3jnI7jnI/jnJDjnJHjnJLjnJPjnJTjnJXjnJbjnJfjnJjjnJnjnJrjnJvjnJzjnJ3jnJ7jnJ8KK+OcoOOcoeOcouOco+OcpOOcpeOcpuOcp+OcqOOcqeOcquOcq+OcrOOcreOcruOcr+OcsOOcseOcsuOcs+OctOOcteOctuOct+OcuOOcueOcuuOcu+OcvOOcveOcvuOcvwor452A452B452C452D452E452F452G452H452I452J452K452L452M452N452O452P452Q452R452S452T452U452V452W452X452Y452Z452a452b452c452d452e452fCivjnaDjnaHjnaLjnaPjnaTjnaXjnabjnafjnajjnanjnarjnavjnazjna3jna7jna/jnbDjnbHjnbLjnbPjnbTjnbXjnbbjnbfjnbjjnbnjnbrjnbvjnbzjnb3jnb7jnb8KK+OegOOegeOeguOeg+OehOOeheOehuOeh+OeiOOeieOeiuOei+OejOOejeOejuOej+OekOOekeOekuOek+OelOOeleOeluOel+OemOOemeOemuOem+OenOOeneOenuOenwor456g456h456i456j456k456l456m456n456o456p456q456r456s456t456u456v456w456x456y456z4560456145624563456445654566456745684569456+456/Civjn4Djn4Hjn4Ljn4Pjn4Tjn4Xjn4bjn4fjn4jjn4njn4rjn4vjn4zjn43jn47jn4/jn5Djn5Hjn5Ljn5Pjn5Tjn5Xjn5bjn5fjn5jjn5njn5rjn5vjn5zjn53jn57jn58KK+OfoOOfoeOfouOfo+OfpOOfpeOfpuOfp+OfqOOfqeOfquOfq+OfrOOfreOfruOfr+OfsOOfseOfsuOfs+OftOOfteOftuOft+OfuOOfueOfuuOfu+OfvOOfveOfvuOfvwor46CA46CB46CC46CD46CE46CF46CG46CH46CI46CJ46CK46CL46CM46CN46CO46CP46CQ46CR46CS46CT46CU46CV46CW46CX46CY46CZ46Ca46Cb46Cc46Cd46Ce46CfCivjoKDjoKHjoKLjoKPjoKTjoKXjoKbjoKfjoKjjoKnjoKrjoKvjoKzjoK3joK7joK/joLDjoLHjoLLjoLPjoLTjoLXjoLbjoLfjoLjjoLnjoLrjoLvjoLzjoL3joL7joL8KK+OhgOOhgeOhguOhg+OhhOOhheOhhuOhh+OhiOOhieOhiuOhi+OhjOOhjeOhjuOhj+OhkOOhkeOhkuOhk+OhlOOhleOhluOhl+OhmOOhmeOhmuOhm+OhnOOhneOhnuOhnwor46Gg46Gh46Gi46Gj46Gk46Gl46Gm46Gn46Go46Gp46Gq46Gr46Gs46Gt46Gu46Gv46Gw46Gx46Gy46Gz46G046G146G246G346G446G546G646G746G846G946G+46G/CivjooDjooHjooLjooPjooTjooXjoobjoofjoojjoonjoorjoovjoozjoo3joo7joo/jopDjopHjopLjopPjopTjopXjopbjopfjopjjopnjoprjopvjopzjop3jop7jop8KK+OioOOioeOiouOio+OipOOipeOipuOip+OiqOOiqeOiquOiq+OirOOireOiruOir+OisOOiseOisuOis+OitOOiteOituOit+OiuOOiueOiuuOiu+OivOOiveOivuOivwor46OA46OB46OC46OD46OE46OF46OG46OH46OI46OJ46OK46OL46OM46ON46OO46OP46OQ46OR46OS46OT46OU46OV46OW46OX46OY46OZ46Oa46Ob46Oc46Od46Oe46OfCivjo6Djo6Hjo6Ljo6Pjo6Tjo6Xjo6bjo6fjo6jjo6njo6rjo6vjo6zjo63jo67jo6/jo7Djo7Hjo7Ljo7Pjo7Tjo7Xjo7bjo7fjo7jjo7njo7rjo7vjo7zjo73jo77jo78KK+OkgOOkgeOkguOkg+OkhOOkheOkhuOkh+OkiOOkieOkiuOki+OkjOOkjeOkjuOkj+OkkOOkkeOkkuOkk+OklOOkleOkluOkl+OkmOOkmeOkmuOkm+OknOOkneOknuOknwor46Sg46Sh46Si46Sj46Sk46Sl46Sm46Sn46So46Sp46Sq46Sr46Ss46St46Su46Sv46Sw46Sx46Sy46Sz46S046S146S246S346S446S546S646S746S846S946S+46S/CivjpYDjpYHjpYLjpYPjpYTjpYXjpYbjpYfjpYjjpYnjpYrjpYvjpYzjpY3jpY7jpY/jpZDjpZHjpZLjpZPjpZTjpZXjpZbjpZfjpZjjpZnjpZrjpZvjpZzjpZ3jpZ7jpZ8KK+OloOOloeOlouOlo+OlpOOlpeOlpuOlp+OlqOOlqeOlquOlq+OlrOOlreOlruOlr+OlsOOlseOlsuOls+OltOOlteOltuOlt+OluOOlueOluuOlu+OlvOOlveOlvuOlvwor46aA46aB46aC46aD46aE46aF46aG46aH46aI46aJ46aK46aL46aM46aN46aO46aP46aQ46aR46aS46aT46aU46aV46aW46aX46aY46aZ46aa46ab46ac46ad46ae46afCivjpqDjpqHjpqLjpqPjpqTjpqXjpqbjpqfjpqjjpqnjpqrjpqvjpqzjpq3jpq7jpq/jprDjprHjprLjprPjprTjprXjprbjprfjprjjprnjprrjprvjprzjpr3jpr7jpr8KK+OngOOngeOnguOng+OnhOOnheOnhuOnh+OniOOnieOniuOni+OnjOOnjeOnjuOnj+OnkOOnkeOnkuOnk+OnlOOnleOnluOnl+OnmOOnmeOnmuOnm+OnnOOnneOnnuOnnwor46eg46eh46ei46ej46ek46el46em46en46eo46ep46eq46er46es46et46eu46ev46ew46ex46ey46ez46e046e146e246e346e446e546e646e746e846e946e+46e/CivjqIDjqIHjqILjqIPjqITjqIXjqIbjqIfjqIjjqInjqIrjqIvjqIzjqI3jqI7jqI/jqJDjqJHjqJLjqJPjqJTjqJXjqJbjqJfjqJjjqJnjqJrjqJvjqJzjqJ3jqJ7jqJ8KK+OooOOooeOoouOoo+OopOOopeOopuOop+OoqOOoqeOoquOoq+OorOOoreOoruOor+OosOOoseOosuOos+OotOOoteOotuOot+OouOOoueOouuOou+OovOOoveOovuOovwor46mA46mB46mC46mD46mE46mF46mG46mH46mI46mJ46mK46mL46mM46mN46mO46mP46mQ46mR46mS46mT46mU46mV46mW46mX46mY46mZ46ma46mb46mc46md46me46mfCivjqaDjqaHjqaLjqaPjqaTjqaXjqabjqafjqajjqanjqarjqavjqazjqa3jqa7jqa/jqbDjqbHjqbLjqbPjqbTjqbXjqbbjqbfjqbjjqbnjqbrjqbvjqbzjqb3jqb7jqb8KK+OqgOOqgeOqguOqg+OqhOOqheOqhuOqh+OqiOOqieOqiuOqi+OqjOOqjeOqjuOqj+OqkOOqkeOqkuOqk+OqlOOqleOqluOql+OqmOOqmeOqmuOqm+OqnOOqneOqnuOqnwor46qg46qh46qi46qj46qk46ql46qm46qn46qo46qp46qq46qr46qs46qt46qu46qv46qw46qx46qy46qz46q046q146q246q346q446q546q646q746q846q946q+46q/Civjq4Djq4Hjq4Ljq4Pjq4Tjq4Xjq4bjq4fjq4jjq4njq4rjq4vjq4zjq43jq47jq4/jq5Djq5Hjq5Ljq5Pjq5Tjq5Xjq5bjq5fjq5jjq5njq5rjq5vjq5zjq53jq57jq58KK+OroOOroeOrouOro+OrpOOrpeOrpuOrp+OrqOOrqeOrquOrq+OrrOOrreOrruOrr+OrsOOrseOrsuOrs+OrtOOrteOrtuOrt+OruOOrueOruuOru+OrvOOrveOrvuOrvwor46yA46yB46yC46yD46yE46yF46yG46yH46yI46yJ46yK46yL46yM46yN46yO46yP46yQ46yR46yS46yT46yU46yV46yW46yX46yY46yZ46ya46yb46yc46yd46ye46yfCivjrKDjrKHjrKLjrKPjrKTjrKXjrKbjrKfjrKjjrKnjrKrjrKvjrKzjrK3jrK7jrK/jrLDjrLHjrLLjrLPjrLTjrLXjrLbjrLfjrLjjrLnjrLrjrLvjrLzjrL3jrL7jrL8KK+OtgOOtgeOtguOtg+OthOOtheOthuOth+OtiOOtieOtiuOti+OtjOOtjeOtjuOtj+OtkOOtkeOtkuOtk+OtlOOtleOtluOtl+OtmOOtmeOtmuOtm+OtnOOtneOtnuOtnwor462g462h462i462j462k462l462m462n462o462p462q462r462s462t462u462v462w462x462y462z4620462146224623462446254626462746284629462+462/CivjroDjroHjroLjroPjroTjroXjrobjrofjrojjronjrorjrovjrozjro3jro7jro/jrpDjrpHjrpLjrpPjrpTjrpXjrpbjrpfjrpjjrpnjrprjrpvjrpzjrp3jrp7jrp8KK+OuoOOuoeOuouOuo+OupOOupeOupuOup+OuqOOuqeOuquOuq+OurOOureOuruOur+OusOOuseOusuOus+OutOOuteOutuOut+OuuOOuueOuuuOuu+OuvOOuveOuvuOuvwor46+A46+B46+C46+D46+E46+F46+G46+H46+I46+J46+K46+L46+M46+N46+O46+P46+Q46+R46+S46+T46+U46+V46+W46+X46+Y46+Z46+a46+b46+c46+d46+e46+fCivjr6Djr6Hjr6Ljr6Pjr6Tjr6Xjr6bjr6fjr6jjr6njr6rjr6vjr6zjr63jr67jr6/jr7Djr7Hjr7Ljr7Pjr7Tjr7Xjr7bjr7fjr7jjr7njr7rjr7vjr7zjr73jr77jr78KK+OwgOOwgeOwguOwg+OwhOOwheOwhuOwh+OwiOOwieOwiuOwi+OwjOOwjeOwjuOwj+OwkOOwkeOwkuOwk+OwlOOwleOwluOwl+OwmOOwmeOwmuOwm+OwnOOwneOwnuOwnwor47Cg47Ch47Ci47Cj47Ck47Cl47Cm47Cn47Co47Cp47Cq47Cr47Cs47Ct47Cu47Cv47Cw47Cx47Cy47Cz47C047C147C247C347C447C547C647C747C847C947C+47C/CivjsYDjsYHjsYLjsYPjsYTjsYXjsYbjsYfjsYjjsYnjsYrjsYvjsYzjsY3jsY7jsY/jsZDjsZHjsZLjsZPjsZTjsZXjsZbjsZfjsZjjsZnjsZrjsZvjsZzjsZ3jsZ7jsZ8KK+OxoOOxoeOxouOxo+OxpOOxpeOxpuOxp+OxqOOxqeOxquOxq+OxrOOxreOxruOxr+OxsOOxseOxsuOxs+OxtOOxteOxtuOxt+OxuOOxueOxuuOxu+OxvOOxveOxvuOxvwor47KA47KB47KC47KD47KE47KF47KG47KH47KI47KJ47KK47KL47KM47KN47KO47KP47KQ47KR47KS47KT47KU47KV47KW47KX47KY47KZ47Ka47Kb47Kc47Kd47Ke47KfCivjsqDjsqHjsqLjsqPjsqTjsqXjsqbjsqfjsqjjsqnjsqrjsqvjsqzjsq3jsq7jsq/jsrDjsrHjsrLjsrPjsrTjsrXjsrbjsrfjsrjjsrnjsrrjsrvjsrzjsr3jsr7jsr8KK+OzgOOzgeOzguOzg+OzhOOzheOzhuOzh+OziOOzieOziuOzi+OzjOOzjeOzjuOzj+OzkOOzkeOzkuOzk+OzlOOzleOzluOzl+OzmOOzmeOzmuOzm+OznOOzneOznuOznwor47Og47Oh47Oi47Oj47Ok47Ol47Om47On47Oo47Op47Oq47Or47Os47Ot47Ou47Ov47Ow47Ox47Oy47Oz47O047O147O247O347O447O547O647O747O847O947O+47O/CivjtIDjtIHjtILjtIPjtITjtIXjtIbjtIfjtIjjtInjtIrjtIvjtIzjtI3jtI7jtI/jtJDjtJHjtJLjtJPjtJTjtJXjtJbjtJfjtJjjtJnjtJrjtJvjtJzjtJ3jtJ7jtJ8KK+O0oOO0oeO0ouO0o+O0pOO0peO0puO0p+O0qOO0qeO0quO0q+O0rOO0reO0ruO0r+O0sOO0seO0suO0s+O0tOO0teO0tuO0t+O0uOO0ueO0uuO0u+O0vOO0veO0vuO0vwor47WA47WB47WC47WD47WE47WF47WG47WH47WI47WJ47WK47WL47WM47WN47WO47WP47WQ47WR47WS47WT47WU47WV47WW47WX47WY47WZ47Wa47Wb47Wc47Wd47We47WfCivjtaDjtaHjtaLjtaPjtaTjtaXjtabjtafjtajjtanjtarjtavjtazjta3jta7jta/jtbDjtbHjtbLjtbPjtbTjtbXjtbbjtbfjtbjjtbnjtbrjtbvjtbzjtb3jtb7jtb8KK+O2gOO2geO2guO2g+O2hOO2heO2huO2h+O2iOO2ieO2iuO2i+O2jOO2jeO2juO2j+O2kOO2keO2kuO2k+O2lOO2leO2luO2l+O2mOO2meO2muO2m+O2nOO2neO2nuO2nwor47ag47ah47ai47aj47ak47al47am47an47ao47ap47aq47ar47as47at47au47av47aw47ax47ay47az47a047a147a247a347a447a547a647a747a847a947a+47a/Civjt4Djt4Hjt4Ljt4Pjt4Tjt4Xjt4bjt4fjt4jjt4njt4rjt4vjt4zjt43jt47jt4/jt5Djt5Hjt5Ljt5Pjt5Tjt5Xjt5bjt5fjt5jjt5njt5rjt5vjt5zjt53jt57jt58KK+O3oOO3oeO3ouO3o+O3pOO3peO3puO3p+O3qOO3qeO3quO3q+O3rOO3reO3ruO3r+O3sOO3seO3suO3s+O3tOO3teO3tuO3t+O3uOO3ueO3uuO3u+O3vOO3veO3vuO3vwor47iA47iB47iC47iD47iE47iF47iG47iH47iI47iJ47iK47iL47iM47iN47iO47iP47iQ47iR47iS47iT47iU47iV47iW47iX47iY47iZ47ia47ib47ic47id47ie47ifCivjuKDjuKHjuKLjuKPjuKTjuKXjuKbjuKfjuKjjuKnjuKrjuKvjuKzjuK3juK7juK/juLDjuLHjuLLjuLPjuLTjuLXjuLbjuLfjuLjjuLnjuLrjuLvjuLzjuL3juL7juL8KK+O5gOO5geO5guO5g+O5hOO5heO5huO5h+O5iOO5ieO5iuO5i+O5jOO5jeO5juO5j+O5kOO5keO5kuO5k+O5lOO5leO5luO5l+O5mOO5meO5muO5m+O5nOO5neO5nuO5nwor47mg47mh47mi47mj47mk47ml47mm47mn47mo47mp47mq47mr47ms47mt47mu47mv47mw47mx47my47mz47m047m147m247m347m447m547m647m747m847m947m+47m/CivjuoDjuoHjuoLjuoPjuoTjuoXjuobjuofjuojjuonjuorjuovjuozjuo3juo7juo/jupDjupHjupLjupPjupTjupXjupbjupfjupjjupnjuprjupvjupzjup3jup7jup8KK+O6oOO6oeO6ouO6o+O6pOO6peO6puO6p+O6qOO6qeO6quO6q+O6rOO6reO6ruO6r+O6sOO6seO6suO6s+O6tOO6teO6tuO6t+O6uOO6ueO6uuO6u+O6vOO6veO6vuO6vwor47uA47uB47uC47uD47uE47uF47uG47uH47uI47uJ47uK47uL47uM47uN47uO47uP47uQ47uR47uS47uT47uU47uV47uW47uX47uY47uZ47ua47ub47uc47ud47ue47ufCivju6Dju6Hju6Lju6Pju6Tju6Xju6bju6fju6jju6nju6rju6vju6zju63ju67ju6/ju7Dju7Hju7Lju7Pju7Tju7Xju7bju7fju7jju7nju7rju7vju7zju73ju77ju78KK+O8gOO8geO8guO8g+O8hOO8heO8huO8h+O8iOO8ieO8iuO8i+O8jOO8jeO8juO8j+O8kOO8keO8kuO8k+O8lOO8leO8luO8l+O8mOO8meO8muO8m+O8nOO8neO8nuO8nwor47yg47yh47yi47yj47yk47yl47ym47yn47yo47yp47yq47yr47ys47yt47yu47yv47yw47yx47yy47yz47y047y147y247y347y447y547y647y747y847y947y+47y/CivjvYDjvYHjvYLjvYPjvYTjvYXjvYbjvYfjvYjjvYnjvYrjvYvjvYzjvY3jvY7jvY/jvZDjvZHjvZLjvZPjvZTjvZXjvZbjvZfjvZjjvZnjvZrjvZvjvZzjvZ3jvZ7jvZ8KK+O9oOO9oeO9ouO9o+O9pOO9peO9puO9p+O9qOO9qeO9quO9q+O9rOO9reO9ruO9r+O9sOO9seO9suO9s+O9tOO9teO9tuO9t+O9uOO9ueO9uuO9u+O9vOO9veO9vuO9vwor476A476B476C476D476E476F476G476H476I476J476K476L476M476N476O476P476Q476R476S476T476U476V476W476X476Y476Z476a476b476c476d476e476fCivjvqDjvqHjvqLjvqPjvqTjvqXjvqbjvqfjvqjjvqnjvqrjvqvjvqzjvq3jvq7jvq/jvrDjvrHjvrLjvrPjvrTjvrXjvrbjvrfjvrjjvrnjvrrjvrvjvrzjvr3jvr7jvr8KK+O/gOO/geO/guO/g+O/hOO/heO/huO/h+O/iOO/ieO/iuO/i+O/jOO/jeO/juO/j+O/kOO/keO/kuO/k+O/lOO/leO/luO/l+O/mOO/meO/muO/m+O/nOO/neO/nuO/nwor47+g47+h47+i47+j47+k47+l47+m47+n47+o47+p47+q47+r47+s47+t47+u47+v47+w47+x47+y47+z47+047+147+247+347+447+547+647+747+847+947++47+/CivkgIDkgIHkgILkgIPkgITkgIXkgIbkgIfkgIjkgInkgIrkgIvkgIzkgI3kgI7kgI/kgJDkgJHkgJLkgJPkgJTkgJXkgJbkgJfkgJjkgJnkgJrkgJvkgJzkgJ3kgJ7kgJ8KK+SAoOSAoeSAouSAo+SApOSApeSApuSAp+SAqOSAqeSAquSAq+SArOSAreSAruSAr+SAsOSAseSAsuSAs+SAtOSAteSAtuSAt+SAuOSAueSAuuSAu+SAvOSAveSAvuSAvwor5IGA5IGB5IGC5IGD5IGE5IGF5IGG5IGH5IGI5IGJ5IGK5IGL5IGM5IGN5IGO5IGP5IGQ5IGR5IGS5IGT5IGU5IGV5IGW5IGX5IGY5IGZ5IGa5IGb5IGc5IGd5IGe5IGfCivkgaDkgaHkgaLkgaPkgaTkgaXkgabkgafkgajkgankgarkgavkgazkga3kga7kga/kgbDkgbHkgbLkgbPkgbTkgbXkgbbkgbfkgbjkgbnkgbrkgbvkgbzkgb3kgb7kgb8KK+SCgOSCgeSCguSCg+SChOSCheSChuSCh+SCiOSCieSCiuSCi+SCjOSCjeSCjuSCj+SCkOSCkeSCkuSCk+SClOSCleSCluSCl+SCmOSCmeSCmuSCm+SCnOSCneSCnuSCnwor5IKg5IKh5IKi5IKj5IKk5IKl5IKm5IKn5IKo5IKp5IKq5IKr5IKs5IKt5IKu5IKv5IKw5IKx5IKy5IKz5IK05IK15IK25IK35IK45IK55IK65IK75IK85IK95IK+5IK/Civkg4Dkg4Hkg4Lkg4Pkg4Tkg4Xkg4bkg4fkg4jkg4nkg4rkg4vkg4zkg43kg47kg4/kg5Dkg5Hkg5Lkg5Pkg5Tkg5Xkg5bkg5fkg5jkg5nkg5rkg5vkg5zkg53kg57kg58KK+SDoOSDoeSDouSDo+SDpOSDpeSDpuSDp+SDqOSDqeSDquSDq+SDrOSDreSDruSDr+SDsOSDseSDsuSDs+SDtOSDteSDtuSDt+SDuOSDueSDuuSDu+SDvOSDveSDvuSDvwor5ISA5ISB5ISC5ISD5ISE5ISF5ISG5ISH5ISI5ISJ5ISK5ISL5ISM5ISN5ISO5ISP5ISQ5ISR5ISS5IST5ISU5ISV5ISW5ISX5ISY5ISZ5ISa5ISb5ISc5ISd5ISe5ISfCivkhKDkhKHkhKLkhKPkhKTkhKXkhKbkhKfkhKjkhKnkhKrkhKvkhKzkhK3khK7khK/khLDkhLHkhLLkhLPkhLTkhLXkhLbkhLfkhLjkhLnkhLrkhLvkhLzkhL3khL7khL8KK+SFgOSFgeSFguSFg+SFhOSFheSFhuSFh+SFiOSFieSFiuSFi+SFjOSFjeSFjuSFj+SFkOSFkeSFkuSFk+SFlOSFleSFluSFl+SFmOSFmeSFmuSFm+SFnOSFneSFnuSFnwor5IWg5IWh5IWi5IWj5IWk5IWl5IWm5IWn5IWo5IWp5IWq5IWr5IWs5IWt5IWu5IWv5IWw5IWx5IWy5IWz5IW05IW15IW25IW35IW45IW55IW65IW75IW85IW95IW+5IW/CivkhoDkhoHkhoLkhoPkhoTkhoXkhobkhofkhojkhonkhorkhovkhozkho3kho7kho/khpDkhpHkhpLkhpPkhpTkhpXkhpbkhpfkhpjkhpnkhprkhpvkhpzkhp3khp7khp8KK+SGoOSGoeSGouSGo+SGpOSGpeSGpuSGp+SGqOSGqeSGquSGq+SGrOSGreSGruSGr+SGsOSGseSGsuSGs+SGtOSGteSGtuSGt+SGuOSGueSGuuSGu+SGvOSGveSGvuSGvwor5IeA5IeB5IeC5IeD5IeE5IeF5IeG5IeH5IeI5IeJ5IeK5IeL5IeM5IeN5IeO5IeP5IeQ5IeR5IeS5IeT5IeU5IeV5IeW5IeX5IeY5IeZ5Iea5Ieb5Iec5Ied5Iee5IefCivkh6Dkh6Hkh6Lkh6Pkh6Tkh6Xkh6bkh6fkh6jkh6nkh6rkh6vkh6zkh63kh67kh6/kh7Dkh7Hkh7Lkh7Pkh7Tkh7Xkh7bkh7fkh7jkh7nkh7rkh7vkh7zkh73kh77kh78KK+SIgOSIgeSIguSIg+SIhOSIheSIhuSIh+SIiOSIieSIiuSIi+SIjOSIjeSIjuSIj+SIkOSIkeSIkuSIk+SIlOSIleSIluSIl+SImOSImeSImuSIm+SInOSIneSInuSInwor5Iig5Iih5Iii5Iij5Iik5Iil5Iim5Iin5Iio5Iip5Iiq5Iir5Iis5Iit5Iiu5Iiv5Iiw5Iix5Iiy5Iiz5Ii05Ii15Ii25Ii35Ii45Ii55Ii65Ii75Ii85Ii95Ii+5Ii/CivkiYDkiYHkiYLkiYPkiYTkiYXkiYbkiYfkiYjkiYnkiYrkiYvkiYzkiY3kiY7kiY/kiZDkiZHkiZLkiZPkiZTkiZXkiZbkiZfkiZjkiZnkiZrkiZvkiZzkiZ3kiZ7kiZ8KK+SJoOSJoeSJouSJo+SJpOSJpeSJpuSJp+SJqOSJqeSJquSJq+SJrOSJreSJruSJr+SJsOSJseSJsuSJs+SJtOSJteSJtuSJt+SJuOSJueSJuuSJu+SJvOSJveSJvuSJvwor5IqA5IqB5IqC5IqD5IqE5IqF5IqG5IqH5IqI5IqJ5IqK5IqL5IqM5IqN5IqO5IqP5IqQ5IqR5IqS5IqT5IqU5IqV5IqW5IqX5IqY5IqZ5Iqa5Iqb5Iqc5Iqd5Iqe5IqfCivkiqDkiqHkiqLkiqPkiqTkiqXkiqbkiqfkiqjkiqnkiqrkiqvkiqzkiq3kiq7kiq/kirDkirHkirLkirPkirTkirXkirbkirfkirjkirnkirrkirvkirzkir3kir7kir8KK+SLgOSLgeSLguSLg+SLhOSLheSLhuSLh+SLiOSLieSLiuSLi+SLjOSLjeSLjuSLj+SLkOSLkeSLkuSLk+SLlOSLleSLluSLl+SLmOSLmeSLmuSLm+SLnOSLneSLnuSLnwor5Iug5Iuh5Iui5Iuj5Iuk5Iul5Ium5Iun5Iuo5Iup5Iuq5Iur5Ius5Iut5Iuu5Iuv5Iuw5Iux5Iuy5Iuz5Iu05Iu15Iu25Iu35Iu45Iu55Iu65Iu75Iu85Iu95Iu+5Iu/CivkjIDkjIHkjILkjIPkjITkjIXkjIbkjIfkjIjkjInkjIrkjIvkjIzkjI3kjI7kjI/kjJDkjJHkjJLkjJPkjJTkjJXkjJbkjJfkjJjkjJnkjJrkjJvkjJzkjJ3kjJ7kjJ8KK+SMoOSMoeSMouSMo+SMpOSMpeSMpuSMp+SMqOSMqeSMquSMq+SMrOSMreSMruSMr+SMsOSMseSMsuSMs+SMtOSMteSMtuSMt+SMuOSMueSMuuSMu+SMvOSMveSMvuSMvwor5I2A5I2B5I2C5I2D5I2E5I2F5I2G5I2H5I2I5I2J5I2K5I2L5I2M5I2N5I2O5I2P5I2Q5I2R5I2S5I2T5I2U5I2V5I2W5I2X5I2Y5I2Z5I2a5I2b5I2c5I2d5I2e5I2fCivkjaDkjaHkjaLkjaPkjaTkjaXkjabkjafkjajkjankjarkjavkjazkja3kja7kja/kjbDkjbHkjbLkjbPkjbTkjbXkjbbkjbfkjbjkjbnkjbrkjbvkjbzkjb3kjb7kjb8KK+SOgOSOgeSOguSOg+SOhOSOheSOhuSOh+SOiOSOieSOiuSOi+SOjOSOjeSOjuSOj+SOkOSOkeSOkuSOk+SOlOSOleSOluSOl+SOmOSOmeSOmuSOm+SOnOSOneSOnuSOnwor5I6g5I6h5I6i5I6j5I6k5I6l5I6m5I6n5I6o5I6p5I6q5I6r5I6s5I6t5I6u5I6v5I6w5I6x5I6y5I6z5I605I615I625I635I645I655I665I675I685I695I6+5I6/Civkj4Dkj4Hkj4Lkj4Pkj4Tkj4Xkj4bkj4fkj4jkj4nkj4rkj4vkj4zkj43kj47kj4/kj5Dkj5Hkj5Lkj5Pkj5Tkj5Xkj5bkj5fkj5jkj5nkj5rkj5vkj5zkj53kj57kj58KK+SPoOSPoeSPouSPo+SPpOSPpeSPpuSPp+SPqOSPqeSPquSPq+SPrOSPreSPruSPr+SPsOSPseSPsuSPs+SPtOSPteSPtuSPt+SPuOSPueSPuuSPu+SPvOSPveSPvuSPvwor5JCA5JCB5JCC5JCD5JCE5JCF5JCG5JCH5JCI5JCJ5JCK5JCL5JCM5JCN5JCO5JCP5JCQ5JCR5JCS5JCT5JCU5JCV5JCW5JCX5JCY5JCZ5JCa5JCb5JCc5JCd5JCe5JCfCivkkKDkkKHkkKLkkKPkkKTkkKXkkKbkkKfkkKjkkKnkkKrkkKvkkKzkkK3kkK7kkK/kkLDkkLHkkLLkkLPkkLTkkLXkkLbkkLfkkLjkkLnkkLrkkLvkkLzkkL3kkL7kkL8KK+SRgOSRgeSRguSRg+SRhOSRheSRhuSRh+SRiOSRieSRiuSRi+SRjOSRjeSRjuSRj+SRkOSRkeSRkuSRk+SRlOSRleSRluSRl+SRmOSRmeSRmuSRm+SRnOSRneSRnuSRnwor5JGg5JGh5JGi5JGj5JGk5JGl5JGm5JGn5JGo5JGp5JGq5JGr5JGs5JGt5JGu5JGv5JGw5JGx5JGy5JGz5JG05JG15JG25JG35JG45JG55JG65JG75JG85JG95JG+5JG/CivkkoDkkoHkkoLkkoPkkoTkkoXkkobkkofkkojkkonkkorkkovkkozkko3kko7kko/kkpDkkpHkkpLkkpPkkpTkkpXkkpbkkpfkkpjkkpnkkprkkpvkkpzkkp3kkp7kkp8KK+SSoOSSoeSSouSSo+SSpOSSpeSSpuSSp+SSqOSSqeSSquSSq+SSrOSSreSSruSSr+SSsOSSseSSsuSSs+SStOSSteSStuSSt+SSuOSSueSSuuSSu+SSvOSSveSSvuSSvwor5JOA5JOB5JOC5JOD5JOE5JOF5JOG5JOH5JOI5JOJ5JOK5JOL5JOM5JON5JOO5JOP5JOQ5JOR5JOS5JOT5JOU5JOV5JOW5JOX5JOY5JOZ5JOa5JOb5JOc5JOd5JOe5JOfCivkk6Dkk6Hkk6Lkk6Pkk6Tkk6Xkk6bkk6fkk6jkk6nkk6rkk6vkk6zkk63kk67kk6/kk7Dkk7Hkk7Lkk7Pkk7Tkk7Xkk7bkk7fkk7jkk7nkk7rkk7vkk7zkk73kk77kk78KK+SUgOSUgeSUguSUg+SUhOSUheSUhuSUh+SUiOSUieSUiuSUi+SUjOSUjeSUjuSUj+SUkOSUkeSUkuSUk+SUlOSUleSUluSUl+SUmOSUmeSUmuSUm+SUnOSUneSUnuSUnwor5JSg5JSh5JSi5JSj5JSk5JSl5JSm5JSn5JSo5JSp5JSq5JSr5JSs5JSt5JSu5JSv5JSw5JSx5JSy5JSz5JS05JS15JS25JS35JS45JS55JS65JS75JS85JS95JS+5JS/CivklYDklYHklYLklYPklYTklYXklYbklYfklYjklYnklYrklYvklYzklY3klY7klY/klZDklZHklZLklZPklZTklZXklZbklZfklZjklZnklZrklZvklZzklZ3klZ7klZ8KK+SVoOSVoeSVouSVo+SVpOSVpeSVpuSVp+SVqOSVqeSVquSVq+SVrOSVreSVruSVr+SVsOSVseSVsuSVs+SVtOSVteSVtuSVt+SVuOSVueSVuuSVu+SVvOSVveSVvuSVvwor5JaA5JaB5JaC5JaD5JaE5JaF5JaG5JaH5JaI5JaJ5JaK5JaL5JaM5JaN5JaO5JaP5JaQ5JaR5JaS5JaT5JaU5JaV5JaW5JaX5JaY5JaZ5Jaa5Jab5Jac5Jad5Jae5JafCivklqDklqHklqLklqPklqTklqXklqbklqfklqjklqnklqrklqvklqzklq3klq7klq/klrDklrHklrLklrPklrTklrXklrbklrfklrjklrnklrrklrvklrzklr3klr7klr8KK+SXgOSXgeSXguSXg+SXhOSXheSXhuSXh+SXiOSXieSXiuSXi+SXjOSXjeSXjuSXj+SXkOSXkeSXkuSXk+SXlOSXleSXluSXl+SXmOSXmeSXmuSXm+SXnOSXneSXnuSXnwor5Jeg5Jeh5Jei5Jej5Jek5Jel5Jem5Jen5Jeo5Jep5Jeq5Jer5Jes5Jet5Jeu5Jev5Jew5Jex5Jey5Jez5Je05Je15Je25Je35Je45Je55Je65Je75Je85Je95Je+5Je/CivkmIDkmIHkmILkmIPkmITkmIXkmIbkmIfkmIjkmInkmIrkmIvkmIzkmI3kmI7kmI/kmJDkmJHkmJLkmJPkmJTkmJXkmJbkmJfkmJjkmJnkmJrkmJvkmJzkmJ3kmJ7kmJ8KK+SYoOSYoeSYouSYo+SYpOSYpeSYpuSYp+SYqOSYqeSYquSYq+SYrOSYreSYruSYr+SYsOSYseSYsuSYs+SYtOSYteSYtuSYt+SYuOSYueSYuuSYu+SYvOSYveSYvuSYvwor5JmA5JmB5JmC5JmD5JmE5JmF5JmG5JmH5JmI5JmJ5JmK5JmL5JmM5JmN5JmO5JmP5JmQ5JmR5JmS5JmT5JmU5JmV5JmW5JmX5JmY5JmZ5Jma5Jmb5Jmc5Jmd5Jme5JmfCivkmaDkmaHkmaLkmaPkmaTkmaXkmabkmafkmajkmankmarkmavkmazkma3kma7kma/kmbDkmbHkmbLkmbPkmbTkmbXkmbbkmbfkmbjkmbnkmbrkmbvkmbzkmb3kmb7kmb8KK+SagOSageSaguSag+SahOSaheSahuSah+SaiOSaieSaiuSai+SajOSajeSajuSaj+SakOSakeSakuSak+SalOSaleSaluSal+SamOSameSamuSam+SanOSaneSanuSanwor5Jqg5Jqh5Jqi5Jqj5Jqk5Jql5Jqm5Jqn5Jqo5Jqp5Jqq5Jqr5Jqs5Jqt5Jqu5Jqv5Jqw5Jqx5Jqy5Jqz5Jq05Jq15Jq25Jq35Jq45Jq55Jq65Jq75Jq85Jq95Jq+5Jq/Civkm4Dkm4Hkm4Lkm4Pkm4Tkm4Xkm4bkm4fkm4jkm4nkm4rkm4vkm4zkm43km47km4/km5Dkm5Hkm5Lkm5Pkm5Tkm5Xkm5bkm5fkm5jkm5nkm5rkm5vkm5zkm53km57km58KK+SboOSboeSbouSbo+SbpOSbpeSbpuSbp+SbqOSbqeSbquSbq+SbrOSbreSbruSbr+SbsOSbseSbsuSbs+SbtOSbteSbtuSbt+SbuOSbueSbuuSbu+SbvOSbveSbvuSbvwor5JyA5JyB5JyC5JyD5JyE5JyF5JyG5JyH5JyI5JyJ5JyK5JyL5JyM5JyN5JyO5JyP5JyQ5JyR5JyS5JyT5JyU5JyV5JyW5JyX5JyY5JyZ5Jya5Jyb5Jyc5Jyd5Jye5JyfCivknKDknKHknKLknKPknKTknKXknKbknKfknKjknKnknKrknKvknKzknK3knK7knK/knLDknLHknLLknLPknLTknLXknLbknLfknLjknLnknLrknLvknLzknL3knL7knL8KK+SdgOSdgeSdguSdg+SdhOSdheSdhuSdh+SdiOSdieSdiuSdi+SdjOSdjeSdjuSdj+SdkOSdkeSdkuSdk+SdlOSdleSdluSdl+SdmOSdmeSdmuSdm+SdnOSdneSdnuSdnwor5J2g5J2h5J2i5J2j5J2k5J2l5J2m5J2n5J2o5J2p5J2q5J2r5J2s5J2t5J2u5J2v5J2w5J2x5J2y5J2z5J205J215J225J235J245J255J265J275J285J295J2+5J2/CivknoDknoHknoLknoPknoTknoXknobknofknojknonknorknovknozkno3kno7kno/knpDknpHknpLknpPknpTknpXknpbknpfknpjknpnknprknpvknpzknp3knp7knp8KK+SeoOSeoeSeouSeo+SepOSepeSepuSep+SeqOSeqeSequSeq+SerOSereSeruSer+SesOSeseSesuSes+SetOSeteSetuSet+SeuOSeueSeuuSeu+SevOSeveSevuSevwor5J+A5J+B5J+C5J+D5J+E5J+F5J+G5J+H5J+I5J+J5J+K5J+L5J+M5J+N5J+O5J+P5J+Q5J+R5J+S5J+T5J+U5J+V5J+W5J+X5J+Y5J+Z5J+a5J+b5J+c5J+d5J+e5J+fCivkn6Dkn6Hkn6Lkn6Pkn6Tkn6Xkn6bkn6fkn6jkn6nkn6rkn6vkn6zkn63kn67kn6/kn7Dkn7Hkn7Lkn7Pkn7Tkn7Xkn7bkn7fkn7jkn7nkn7rkn7vkn7zkn73kn77kn78KK+SggOSggeSgguSgg+SghOSgheSghuSgh+SgiOSgieSgiuSgi+SgjOSgjeSgjuSgj+SgkOSgkeSgkuSgk+SglOSgleSgluSgl+SgmOSgmeSgmuSgm+SgnOSgneSgnuSgnwor5KCg5KCh5KCi5KCj5KCk5KCl5KCm5KCn5KCo5KCp5KCq5KCr5KCs5KCt5KCu5KCv5KCw5KCx5KCy5KCz5KC05KC15KC25KC35KC45KC55KC65KC75KC85KC95KC+5KC/CivkoYDkoYHkoYLkoYPkoYTkoYXkoYbkoYfkoYjkoYnkoYrkoYvkoYzkoY3koY7koY/koZDkoZHkoZLkoZPkoZTkoZXkoZbkoZfkoZjkoZnkoZrkoZvkoZzkoZ3koZ7koZ8KK+ShoOShoeShouSho+ShpOShpeShpuShp+ShqOShqeShquShq+ShrOShreShruShr+ShsOShseShsuShs+ShtOShteShtuSht+ShuOShueShuuShu+ShvOShveShvuShvwor5KKA5KKB5KKC5KKD5KKE5KKF5KKG5KKH5KKI5KKJ5KKK5KKL5KKM5KKN5KKO5KKP5KKQ5KKR5KKS5KKT5KKU5KKV5KKW5KKX5KKY5KKZ5KKa5KKb5KKc5KKd5KKe5KKfCivkoqDkoqHkoqLkoqPkoqTkoqXkoqbkoqfkoqjkoqnkoqrkoqvkoqzkoq3koq7koq/korDkorHkorLkorPkorTkorXkorbkorfkorjkornkorrkorvkorzkor3kor7kor8KK+SjgOSjgeSjguSjg+SjhOSjheSjhuSjh+SjiOSjieSjiuSji+SjjOSjjeSjjuSjj+SjkOSjkeSjkuSjk+SjlOSjleSjluSjl+SjmOSjmeSjmuSjm+SjnOSjneSjnuSjnwor5KOg5KOh5KOi5KOj5KOk5KOl5KOm5KOn5KOo5KOp5KOq5KOr5KOs5KOt5KOu5KOv5KOw5KOx5KOy5KOz5KO05KO15KO25KO35KO45KO55KO65KO75KO85KO95KO+5KO/CivkpIDkpIHkpILkpIPkpITkpIXkpIbkpIfkpIjkpInkpIrkpIvkpIzkpI3kpI7kpI/kpJDkpJHkpJLkpJPkpJTkpJXkpJbkpJfkpJjkpJnkpJrkpJvkpJzkpJ3kpJ7kpJ8KK+SkoOSkoeSkouSko+SkpOSkpeSkpuSkp+SkqOSkqeSkquSkq+SkrOSkreSkruSkr+SksOSkseSksuSks+SktOSkteSktuSkt+SkuOSkueSkuuSku+SkvOSkveSkvuSkvwor5KWA5KWB5KWC5KWD5KWE5KWF5KWG5KWH5KWI5KWJ5KWK5KWL5KWM5KWN5KWO5KWP5KWQ5KWR5KWS5KWT5KWU5KWV5KWW5KWX5KWY5KWZ5KWa5KWb5KWc5KWd5KWe5KWfCivkpaDkpaHkpaLkpaPkpaTkpaXkpabkpafkpajkpankparkpavkpazkpa3kpa7kpa/kpbDkpbHkpbLkpbPkpbTkpbXkpbbkpbfkpbjkpbnkpbrkpbvkpbzkpb3kpb7kpb8KK+SmgOSmgeSmguSmg+SmhOSmheSmhuSmh+SmiOSmieSmiuSmi+SmjOSmjeSmjuSmj+SmkOSmkeSmkuSmk+SmlOSmleSmluSml+SmmOSmmeSmmuSmm+SmnOSmneSmnuSmnwor5Kag5Kah5Kai5Kaj5Kak5Kal5Kam5Kan5Kao5Kap5Kaq5Kar5Kas5Kat5Kau5Kav5Kaw5Kax5Kay5Kaz5Ka05Ka15Ka25Ka35Ka45Ka55Ka65Ka75Ka85Ka95Ka+5Ka/Civkp4Dkp4Hkp4Lkp4Pkp4Tkp4Xkp4bkp4fkp4jkp4nkp4rkp4vkp4zkp43kp47kp4/kp5Dkp5Hkp5Lkp5Pkp5Tkp5Xkp5bkp5fkp5jkp5nkp5rkp5vkp5zkp53kp57kp58KK+SnoOSnoeSnouSno+SnpOSnpeSnpuSnp+SnqOSnqeSnquSnq+SnrOSnreSnruSnr+SnsOSnseSnsuSns+SntOSnteSntuSnt+SnuOSnueSnuuSnu+SnvOSnveSnvuSnvwor5KiA5KiB5KiC5KiD5KiE5KiF5KiG5KiH5KiI5KiJ5KiK5KiL5KiM5KiN5KiO5KiP5KiQ5KiR5KiS5KiT5KiU5KiV5KiW5KiX5KiY5KiZ5Kia5Kib5Kic5Kid5Kie5KifCivkqKDkqKHkqKLkqKPkqKTkqKXkqKbkqKfkqKjkqKnkqKrkqKvkqKzkqK3kqK7kqK/kqLDkqLHkqLLkqLPkqLTkqLXkqLbkqLfkqLjkqLnkqLrkqLvkqLzkqL3kqL7kqL8KK+SpgOSpgeSpguSpg+SphOSpheSphuSph+SpiOSpieSpiuSpi+SpjOSpjeSpjuSpj+SpkOSpkeSpkuSpk+SplOSpleSpluSpl+SpmOSpmeSpmuSpm+SpnOSpneSpnuSpnwor5Kmg5Kmh5Kmi5Kmj5Kmk5Kml5Kmm5Kmn5Kmo5Kmp5Kmq5Kmr5Kms5Kmt5Kmu5Kmv5Kmw5Kmx5Kmy5Kmz5Km05Km15Km25Km35Km45Km55Km65Km75Km85Km95Km+5Km/CivkqoDkqoHkqoLkqoPkqoTkqoXkqobkqofkqojkqonkqorkqovkqozkqo3kqo7kqo/kqpDkqpHkqpLkqpPkqpTkqpXkqpbkqpfkqpjkqpnkqprkqpvkqpzkqp3kqp7kqp8KK+SqoOSqoeSqouSqo+SqpOSqpeSqpuSqp+SqqOSqqeSqquSqq+SqrOSqreSqruSqr+SqsOSqseSqsuSqs+SqtOSqteSqtuSqt+SquOSqueSquuSqu+SqvOSqveSqvuSqvwor5KuA5KuB5KuC5KuD5KuE5KuF5KuG5KuH5KuI5KuJ5KuK5KuL5KuM5KuN5KuO5KuP5KuQ5KuR5KuS5KuT5KuU5KuV5KuW5KuX5KuY5KuZ5Kua5Kub5Kuc5Kud5Kue5KufCivkq6Dkq6Hkq6Lkq6Pkq6Tkq6Xkq6bkq6fkq6jkq6nkq6rkq6vkq6zkq63kq67kq6/kq7Dkq7Hkq7Lkq7Pkq7Tkq7Xkq7bkq7fkq7jkq7nkq7rkq7vkq7zkq73kq77kq78KK+SsgOSsgeSsguSsg+SshOSsheSshuSsh+SsiOSsieSsiuSsi+SsjOSsjeSsjuSsj+SskOSskeSskuSsk+SslOSsleSsluSsl+SsmOSsmeSsmuSsm+SsnOSsneSsnuSsnwor5Kyg5Kyh5Kyi5Kyj5Kyk5Kyl5Kym5Kyn5Kyo5Kyp5Kyq5Kyr5Kys5Kyt5Kyu5Kyv5Kyw5Kyx5Kyy5Kyz5Ky05Ky15Ky25Ky35Ky45Ky55Ky65Ky75Ky85Ky95Ky+5Ky/CivkrYDkrYHkrYLkrYPkrYTkrYXkrYbkrYfkrYjkrYnkrYrkrYvkrYzkrY3krY7krY/krZDkrZHkrZLkrZPkrZTkrZXkrZbkrZfkrZjkrZnkrZrkrZvkrZzkrZ3krZ7krZ8KK+StoOStoeStouSto+StpOStpeStpuStp+StqOStqeStquStq+StrOStreStruStr+StsOStseStsuSts+SttOStteSttuStt+StuOStueStuuStu+StvOStveStvuStvwor5K6A5K6B5K6C5K6D5K6E5K6F5K6G5K6H5K6I5K6J5K6K5K6L5K6M5K6N5K6O5K6P5K6Q5K6R5K6S5K6T5K6U5K6V5K6W5K6X5K6Y5K6Z5K6a5K6b5K6c5K6d5K6e5K6fCivkrqDkrqHkrqLkrqPkrqTkrqXkrqbkrqfkrqjkrqnkrqrkrqvkrqzkrq3krq7krq/krrDkrrHkrrLkrrPkrrTkrrXkrrbkrrfkrrjkrrnkrrrkrrvkrrzkrr3krr7krr8KK+SvgOSvgeSvguSvg+SvhOSvheSvhuSvh+SviOSvieSviuSvi+SvjOSvjeSvjuSvj+SvkOSvkeSvkuSvk+SvlOSvleSvluSvl+SvmOSvmeSvmuSvm+SvnOSvneSvnuSvnwor5K+g5K+h5K+i5K+j5K+k5K+l5K+m5K+n5K+o5K+p5K+q5K+r5K+s5K+t5K+u5K+v5K+w5K+x5K+y5K+z5K+05K+15K+25K+35K+45K+55K+65K+75K+85K+95K++5K+/CivksIDksIHksILksIPksITksIXksIbksIfksIjksInksIrksIvksIzksI3ksI7ksI/ksJDksJHksJLksJPksJTksJXksJbksJfksJjksJnksJrksJvksJzksJ3ksJ7ksJ8KK+SwoOSwoeSwouSwo+SwpOSwpeSwpuSwp+SwqOSwqeSwquSwq+SwrOSwreSwruSwr+SwsOSwseSwsuSws+SwtOSwteSwtuSwt+SwuOSwueSwuuSwu+SwvOSwveSwvuSwvwor5LGA5LGB5LGC5LGD5LGE5LGF5LGG5LGH5LGI5LGJ5LGK5LGL5LGM5LGN5LGO5LGP5LGQ5LGR5LGS5LGT5LGU5LGV5LGW5LGX5LGY5LGZ5LGa5LGb5LGc5LGd5LGe5LGfCivksaDksaHksaLksaPksaTksaXksabksafksajksanksarksavksazksa3ksa7ksa/ksbDksbHksbLksbPksbTksbXksbbksbfksbjksbnksbrksbvksbzksb3ksb7ksb8KK+SygOSygeSyguSyg+SyhOSyheSyhuSyh+SyiOSyieSyiuSyi+SyjOSyjeSyjuSyj+SykOSykeSykuSyk+SylOSyleSyluSyl+SymOSymeSymuSym+SynOSyneSynuSynwor5LKg5LKh5LKi5LKj5LKk5LKl5LKm5LKn5LKo5LKp5LKq5LKr5LKs5LKt5LKu5LKv5LKw5LKx5LKy5LKz5LK05LK15LK25LK35LK45LK55LK65LK75LK85LK95LK+5LK/Civks4Dks4Hks4Lks4Pks4Tks4Xks4bks4fks4jks4nks4rks4vks4zks43ks47ks4/ks5Dks5Hks5Lks5Pks5Tks5Xks5bks5fks5jks5nks5rks5vks5zks53ks57ks58KK+SzoOSzoeSzouSzo+SzpOSzpeSzpuSzp+SzqOSzqeSzquSzq+SzrOSzreSzruSzr+SzsOSzseSzsuSzs+SztOSzteSztuSzt+SzuOSzueSzuuSzu+SzvOSzveSzvuSzvwor5LSA5LSB5LSC5LSD5LSE5LSF5LSG5LSH5LSI5LSJ5LSK5LSL5LSM5LSN5LSO5LSP5LSQ5LSR5LSS5LST5LSU5LSV5LSW5LSX5LSY5LSZ5LSa5LSb5LSc5LSd5LSe5LSfCivktKDktKHktKLktKPktKTktKXktKbktKfktKjktKnktKrktKvktKzktK3ktK7ktK/ktLDktLHktLLktLPktLTktLXktLbktLfktLjktLnktLrktLvktLzktL3ktL7ktL8KK+S1gOS1geS1guS1g+S1hOS1heS1huS1h+S1iOS1ieS1iuS1i+S1jOS1jeS1juS1j+S1kOS1keS1kuS1k+S1lOS1leS1luS1l+S1mOS1meS1muS1m+S1nOS1neS1nuS1nwor5LWg5LWh5LWi5LWj5LWk5LWl5LWm5LWn5LWo5LWp5LWq5LWr5LWs5LWt5LWu5LWv5LWw5LWx5LWy5LWz5LW05LW15LW25LW35LW45LW55LW65LW75LW85LW95LW+5LW/CivktoDktoHktoLktoPktoTktoXktobktofktojktonktorktovktozkto3kto7kto/ktpDktpHktpLktpPktpTktpXktpbktpfktpjktpnktprktpvktpzktp3ktp7ktp8KK+S2oOS2oeS2ouS2o+S2pOS2peS2puS2p+S2qOS2qeS2quS2q+S2rOS2reS2ruS2r+S2sOS2seS2suS2s+S2tOS2teS2tuS2t+S2uOS2ueS2uuS2u+S2vOS2veS2vuS2vworCitZaWppbmcgSGV4YWdyYW0gU3ltYm9scyAoVSs0REMwLVUrNERGRik6CisKK+S3gOS3geS3guS3g+S3hOS3heS3huS3h+S3iOS3ieS3iuS3i+S3jOS3jeS3juS3j+S3kOS3keS3kuS3k+S3lOS3leS3luS3l+S3mOS3meS3muS3m+S3nOS3neS3nuS3nwor5Leg5Leh5Lei5Lej5Lek5Lel5Lem5Len5Leo5Lep5Leq5Ler5Les5Let5Leu5Lev5Lew5Lex5Ley5Lez5Le05Le15Le25Le35Le45Le55Le65Le75Le85Le95Le+5Le/CisKK0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgKFUrNEUwMC1VKzlGRkYpOgorCivkuIDkuIHkuILkuIPkuITkuIXkuIbkuIfkuIjkuInkuIrkuIvkuIzkuI3kuI7kuI/kuJDkuJHkuJLkuJPkuJTkuJXkuJbkuJfkuJjkuJnkuJrkuJvkuJzkuJ3kuJ7kuJ8KK+S4oOS4oeS4ouS4o+S4pOS4peS4puS4p+S4qOS4qeS4quS4q+S4rOS4reS4ruS4r+S4sOS4seS4suS4s+S4tOS4teS4tuS4t+S4uOS4ueS4uuS4u+S4vOS4veS4vuS4vwor5LmA5LmB5LmC5LmD5LmE5LmF5LmG5LmH5LmI5LmJ5LmK5LmL5LmM5LmN5LmO5LmP5LmQ5LmR5LmS5LmT5LmU5LmV5LmW5LmX5LmY5LmZ5Lma5Lmb5Lmc5Lmd5Lme5LmfCivkuaDkuaHkuaLkuaPkuaTkuaXkuabkuafkuajkuankuarkuavkuazkua3kua7kua/kubDkubHkubLkubPkubTkubXkubbkubfkubjkubnkubrkubvkubzkub3kub7kub8KK+S6gOS6geS6guS6g+S6hOS6heS6huS6h+S6iOS6ieS6iuS6i+S6jOS6jeS6juS6j+S6kOS6keS6kuS6k+S6lOS6leS6luS6l+S6mOS6meS6muS6m+S6nOS6neS6nuS6nwor5Lqg5Lqh5Lqi5Lqj5Lqk5Lql5Lqm5Lqn5Lqo5Lqp5Lqq5Lqr5Lqs5Lqt5Lqu5Lqv5Lqw5Lqx5Lqy5Lqz5Lq05Lq15Lq25Lq35Lq45Lq55Lq65Lq75Lq85Lq95Lq+5Lq/Civku4Dku4Hku4Lku4Pku4Tku4Xku4bku4fku4jku4nku4rku4vku4zku43ku47ku4/ku5Dku5Hku5Lku5Pku5Tku5Xku5bku5fku5jku5nku5rku5vku5zku53ku57ku58KK+S7oOS7oeS7ouS7o+S7pOS7peS7puS7p+S7qOS7qeS7quS7q+S7rOS7reS7ruS7r+S7sOS7seS7suS7s+S7tOS7teS7tuS7t+S7uOS7ueS7uuS7u+S7vOS7veS7vuS7vwor5LyA5LyB5LyC5LyD5LyE5LyF5LyG5LyH5LyI5LyJ5LyK5LyL5LyM5LyN5LyO5LyP5LyQ5LyR5LyS5LyT5LyU5LyV5LyW5LyX5LyY5LyZ5Lya5Lyb5Lyc5Lyd5Lye5LyfCivkvKDkvKHkvKLkvKPkvKTkvKXkvKbkvKfkvKjkvKnkvKrkvKvkvKzkvK3kvK7kvK/kvLDkvLHkvLLkvLPkvLTkvLXkvLbkvLfkvLjkvLnkvLrkvLvkvLzkvL3kvL7kvL8KK+S9gOS9geS9guS9g+S9hOS9heS9huS9h+S9iOS9ieS9iuS9i+S9jOS9jeS9juS9j+S9kOS9keS9kuS9k+S9lOS9leS9luS9l+S9mOS9meS9muS9m+S9nOS9neS9nuS9nwor5L2g5L2h5L2i5L2j5L2k5L2l5L2m5L2n5L2o5L2p5L2q5L2r5L2s5L2t5L2u5L2v5L2w5L2x5L2y5L2z5L205L215L225L235L245L255L265L275L285L295L2+5L2/CivkvoDkvoHkvoLkvoPkvoTkvoXkvobkvofkvojkvonkvorkvovkvozkvo3kvo7kvo/kvpDkvpHkvpLkvpPkvpTkvpXkvpbkvpfkvpjkvpnkvprkvpvkvpzkvp3kvp7kvp8KK+S+oOS+oeS+ouS+o+S+pOS+peS+puS+p+S+qOS+qeS+quS+q+S+rOS+reS+ruS+r+S+sOS+seS+suS+s+S+tOS+teS+tuS+t+S+uOS+ueS+uuS+u+S+vOS+veS+vuS+vwor5L+A5L+B5L+C5L+D5L+E5L+F5L+G5L+H5L+I5L+J5L+K5L+L5L+M5L+N5L+O5L+P5L+Q5L+R5L+S5L+T5L+U5L+V5L+W5L+X5L+Y5L+Z5L+a5L+b5L+c5L+d5L+e5L+fCivkv6Dkv6Hkv6Lkv6Pkv6Tkv6Xkv6bkv6fkv6jkv6nkv6rkv6vkv6zkv63kv67kv6/kv7Dkv7Hkv7Lkv7Pkv7Tkv7Xkv7bkv7fkv7jkv7nkv7rkv7vkv7zkv73kv77kv78KK+WAgOWAgeWAguWAg+WAhOWAheWAhuWAh+WAiOWAieWAiuWAi+WAjOWAjeWAjuWAj+WAkOWAkeWAkuWAk+WAlOWAleWAluWAl+WAmOWAmeWAmuWAm+WAnOWAneWAnuWAnwor5YCg5YCh5YCi5YCj5YCk5YCl5YCm5YCn5YCo5YCp5YCq5YCr5YCs5YCt5YCu5YCv5YCw5YCx5YCy5YCz5YC05YC15YC25YC35YC45YC55YC65YC75YC85YC95YC+5YC/CivlgYDlgYHlgYLlgYPlgYTlgYXlgYblgYflgYjlgYnlgYrlgYvlgYzlgY3lgY7lgY/lgZDlgZHlgZLlgZPlgZTlgZXlgZblgZflgZjlgZnlgZrlgZvlgZzlgZ3lgZ7lgZ8KK+WBoOWBoeWBouWBo+WBpOWBpeWBpuWBp+WBqOWBqeWBquWBq+WBrOWBreWBruWBr+WBsOWBseWBsuWBs+WBtOWBteWBtuWBt+WBuOWBueWBuuWBu+WBvOWBveWBvuWBvwor5YKA5YKB5YKC5YKD5YKE5YKF5YKG5YKH5YKI5YKJ5YKK5YKL5YKM5YKN5YKO5YKP5YKQ5YKR5YKS5YKT5YKU5YKV5YKW5YKX5YKY5YKZ5YKa5YKb5YKc5YKd5YKe5YKfCivlgqDlgqHlgqLlgqPlgqTlgqXlgqblgqflgqjlgqnlgqrlgqvlgqzlgq3lgq7lgq/lgrDlgrHlgrLlgrPlgrTlgrXlgrblgrflgrjlgrnlgrrlgrvlgrzlgr3lgr7lgr8KK+WDgOWDgeWDguWDg+WDhOWDheWDhuWDh+WDiOWDieWDiuWDi+WDjOWDjeWDjuWDj+WDkOWDkeWDkuWDk+WDlOWDleWDluWDl+WDmOWDmeWDmuWDm+WDnOWDneWDnuWDnwor5YOg5YOh5YOi5YOj5YOk5YOl5YOm5YOn5YOo5YOp5YOq5YOr5YOs5YOt5YOu5YOv5YOw5YOx5YOy5YOz5YO05YO15YO25YO35YO45YO55YO65YO75YO85YO95YO+5YO/CivlhIDlhIHlhILlhIPlhITlhIXlhIblhIflhIjlhInlhIrlhIvlhIzlhI3lhI7lhI/lhJDlhJHlhJLlhJPlhJTlhJXlhJblhJflhJjlhJnlhJrlhJvlhJzlhJ3lhJ7lhJ8KK+WEoOWEoeWEouWEo+WEpOWEpeWEpuWEp+WEqOWEqeWEquWEq+WErOWEreWEruWEr+WEsOWEseWEsuWEs+WEtOWEteWEtuWEt+WEuOWEueWEuuWEu+WEvOWEveWEvuWEvwor5YWA5YWB5YWC5YWD5YWE5YWF5YWG5YWH5YWI5YWJ5YWK5YWL5YWM5YWN5YWO5YWP5YWQ5YWR5YWS5YWT5YWU5YWV5YWW5YWX5YWY5YWZ5YWa5YWb5YWc5YWd5YWe5YWfCivlhaDlhaHlhaLlhaPlhaTlhaXlhablhaflhajlhanlharlhavlhazlha3lha7lha/lhbDlhbHlhbLlhbPlhbTlhbXlhbblhbflhbjlhbnlhbrlhbvlhbzlhb3lhb7lhb8KK+WGgOWGgeWGguWGg+WGhOWGheWGhuWGh+WGiOWGieWGiuWGi+WGjOWGjeWGjuWGj+WGkOWGkeWGkuWGk+WGlOWGleWGluWGl+WGmOWGmeWGmuWGm+WGnOWGneWGnuWGnwor5Yag5Yah5Yai5Yaj5Yak5Yal5Yam5Yan5Yao5Yap5Yaq5Yar5Yas5Yat5Yau5Yav5Yaw5Yax5Yay5Yaz5Ya05Ya15Ya25Ya35Ya45Ya55Ya65Ya75Ya85Ya95Ya+5Ya/Civlh4Dlh4Hlh4Llh4Plh4Tlh4Xlh4blh4flh4jlh4nlh4rlh4vlh4zlh43lh47lh4/lh5Dlh5Hlh5Llh5Plh5Tlh5Xlh5blh5flh5jlh5nlh5rlh5vlh5zlh53lh57lh58KK+WHoOWHoeWHouWHo+WHpOWHpeWHpuWHp+WHqOWHqeWHquWHq+WHrOWHreWHruWHr+WHsOWHseWHsuWHs+WHtOWHteWHtuWHt+WHuOWHueWHuuWHu+WHvOWHveWHvuWHvwor5YiA5YiB5YiC5YiD5YiE5YiF5YiG5YiH5YiI5YiJ5YiK5YiL5YiM5YiN5YiO5YiP5YiQ5YiR5YiS5YiT5YiU5YiV5YiW5YiX5YiY5YiZ5Yia5Yib5Yic5Yid5Yie5YifCivliKDliKHliKLliKPliKTliKXliKbliKfliKjliKnliKrliKvliKzliK3liK7liK/liLDliLHliLLliLPliLTliLXliLbliLfliLjliLnliLrliLvliLzliL3liL7liL8KK+WJgOWJgeWJguWJg+WJhOWJheWJhuWJh+WJiOWJieWJiuWJi+WJjOWJjeWJjuWJj+WJkOWJkeWJkuWJk+WJlOWJleWJluWJl+WJmOWJmeWJmuWJm+WJnOWJneWJnuWJnwor5Ymg5Ymh5Ymi5Ymj5Ymk5Yml5Ymm5Ymn5Ymo5Ymp5Ymq5Ymr5Yms5Ymt5Ymu5Ymv5Ymw5Ymx5Ymy5Ymz5Ym05Ym15Ym25Ym35Ym45Ym55Ym65Ym75Ym85Ym95Ym+5Ym/CivlioDlioHlioLlioPlioTlioXliobliofliojlionliorliovliozlio3lio7lio/lipDlipHlipLlipPlipTlipXlipblipflipjlipnliprlipvlipzlip3lip7lip8KK+WKoOWKoeWKouWKo+WKpOWKpeWKpuWKp+WKqOWKqeWKquWKq+WKrOWKreWKruWKr+WKsOWKseWKsuWKs+WKtOWKteWKtuWKt+WKuOWKueWKuuWKu+WKvOWKveWKvuWKvwor5YuA5YuB5YuC5YuD5YuE5YuF5YuG5YuH5YuI5YuJ5YuK5YuL5YuM5YuN5YuO5YuP5YuQ5YuR5YuS5YuT5YuU5YuV5YuW5YuX5YuY5YuZ5Yua5Yub5Yuc5Yud5Yue5YufCivli6Dli6Hli6Lli6Pli6Tli6Xli6bli6fli6jli6nli6rli6vli6zli63li67li6/li7Dli7Hli7Lli7Pli7Tli7Xli7bli7fli7jli7nli7rli7vli7zli73li77li78KK+WMgOWMgeWMguWMg+WMhOWMheWMhuWMh+WMiOWMieWMiuWMi+WMjOWMjeWMjuWMj+WMkOWMkeWMkuWMk+WMlOWMleWMluWMl+WMmOWMmeWMmuWMm+WMnOWMneWMnuWMnwor5Yyg5Yyh5Yyi5Yyj5Yyk5Yyl5Yym5Yyn5Yyo5Yyp5Yyq5Yyr5Yys5Yyt5Yyu5Yyv5Yyw5Yyx5Yyy5Yyz5Yy05Yy15Yy25Yy35Yy45Yy55Yy65Yy75Yy85Yy95Yy+5Yy/CivljYDljYHljYLljYPljYTljYXljYbljYfljYjljYnljYrljYvljYzljY3ljY7ljY/ljZDljZHljZLljZPljZTljZXljZbljZfljZjljZnljZrljZvljZzljZ3ljZ7ljZ8KK+WNoOWNoeWNouWNo+WNpOWNpeWNpuWNp+WNqOWNqeWNquWNq+WNrOWNreWNruWNr+WNsOWNseWNsuWNs+WNtOWNteWNtuWNt+WNuOWNueWNuuWNu+WNvOWNveWNvuWNvwor5Y6A5Y6B5Y6C5Y6D5Y6E5Y6F5Y6G5Y6H5Y6I5Y6J5Y6K5Y6L5Y6M5Y6N5Y6O5Y6P5Y6Q5Y6R5Y6S5Y6T5Y6U5Y6V5Y6W5Y6X5Y6Y5Y6Z5Y6a5Y6b5Y6c5Y6d5Y6e5Y6fCivljqDljqHljqLljqPljqTljqXljqbljqfljqjljqnljqrljqvljqzljq3ljq7ljq/ljrDljrHljrLljrPljrTljrXljrbljrfljrjljrnljrrljrvljrzljr3ljr7ljr8KK+WPgOWPgeWPguWPg+WPhOWPheWPhuWPh+WPiOWPieWPiuWPi+WPjOWPjeWPjuWPj+WPkOWPkeWPkuWPk+WPlOWPleWPluWPl+WPmOWPmeWPmuWPm+WPnOWPneWPnuWPnwor5Y+g5Y+h5Y+i5Y+j5Y+k5Y+l5Y+m5Y+n5Y+o5Y+p5Y+q5Y+r5Y+s5Y+t5Y+u5Y+v5Y+w5Y+x5Y+y5Y+z5Y+05Y+15Y+25Y+35Y+45Y+55Y+65Y+75Y+85Y+95Y++5Y+/CivlkIDlkIHlkILlkIPlkITlkIXlkIblkIflkIjlkInlkIrlkIvlkIzlkI3lkI7lkI/lkJDlkJHlkJLlkJPlkJTlkJXlkJblkJflkJjlkJnlkJrlkJvlkJzlkJ3lkJ7lkJ8KK+WQoOWQoeWQouWQo+WQpOWQpeWQpuWQp+WQqOWQqeWQquWQq+WQrOWQreWQruWQr+WQsOWQseWQsuWQs+WQtOWQteWQtuWQt+WQuOWQueWQuuWQu+WQvOWQveWQvuWQvwor5ZGA5ZGB5ZGC5ZGD5ZGE5ZGF5ZGG5ZGH5ZGI5ZGJ5ZGK5ZGL5ZGM5ZGN5ZGO5ZGP5ZGQ5ZGR5ZGS5ZGT5ZGU5ZGV5ZGW5ZGX5ZGY5ZGZ5ZGa5ZGb5ZGc5ZGd5ZGe5ZGfCivlkaDlkaHlkaLlkaPlkaTlkaXlkablkaflkajlkanlkarlkavlkazlka3lka7lka/lkbDlkbHlkbLlkbPlkbTlkbXlkbblkbflkbjlkbnlkbrlkbvlkbzlkb3lkb7lkb8KK+WSgOWSgeWSguWSg+WShOWSheWShuWSh+WSiOWSieWSiuWSi+WSjOWSjeWSjuWSj+WSkOWSkeWSkuWSk+WSlOWSleWSluWSl+WSmOWSmeWSmuWSm+WSnOWSneWSnuWSnwor5ZKg5ZKh5ZKi5ZKj5ZKk5ZKl5ZKm5ZKn5ZKo5ZKp5ZKq5ZKr5ZKs5ZKt5ZKu5ZKv5ZKw5ZKx5ZKy5ZKz5ZK05ZK15ZK25ZK35ZK45ZK55ZK65ZK75ZK85ZK95ZK+5ZK/Civlk4Dlk4Hlk4Llk4Plk4Tlk4Xlk4blk4flk4jlk4nlk4rlk4vlk4zlk43lk47lk4/lk5Dlk5Hlk5Llk5Plk5Tlk5Xlk5blk5flk5jlk5nlk5rlk5vlk5zlk53lk57lk58KK+WToOWToeWTouWTo+WTpOWTpeWTpuWTp+WTqOWTqeWTquWTq+WTrOWTreWTruWTr+WTsOWTseWTsuWTs+WTtOWTteWTtuWTt+WTuOWTueWTuuWTu+WTvOWTveWTvuWTvwor5ZSA5ZSB5ZSC5ZSD5ZSE5ZSF5ZSG5ZSH5ZSI5ZSJ5ZSK5ZSL5ZSM5ZSN5ZSO5ZSP5ZSQ5ZSR5ZSS5ZST5ZSU5ZSV5ZSW5ZSX5ZSY5ZSZ5ZSa5ZSb5ZSc5ZSd5ZSe5ZSfCivllKDllKHllKLllKPllKTllKXllKbllKfllKjllKnllKrllKvllKzllK3llK7llK/llLDllLHllLLllLPllLTllLXllLbllLfllLjllLnllLrllLvllLzllL3llL7llL8KK+WVgOWVgeWVguWVg+WVhOWVheWVhuWVh+WViOWVieWViuWVi+WVjOWVjeWVjuWVj+WVkOWVkeWVkuWVk+WVlOWVleWVluWVl+WVmOWVmeWVmuWVm+WVnOWVneWVnuWVnwor5ZWg5ZWh5ZWi5ZWj5ZWk5ZWl5ZWm5ZWn5ZWo5ZWp5ZWq5ZWr5ZWs5ZWt5ZWu5ZWv5ZWw5ZWx5ZWy5ZWz5ZW05ZW15ZW25ZW35ZW45ZW55ZW65ZW75ZW85ZW95ZW+5ZW/CivlloDlloHlloLlloPlloTlloXllobllofllojllonllorllovllozllo3llo7llo/llpDllpHllpLllpPllpTllpXllpbllpfllpjllpnllprllpvllpzllp3llp7llp8KK+WWoOWWoeWWouWWo+WWpOWWpeWWpuWWp+WWqOWWqeWWquWWq+WWrOWWreWWruWWr+WWsOWWseWWsuWWs+WWtOWWteWWtuWWt+WWuOWWueWWuuWWu+WWvOWWveWWvuWWvwor5ZeA5ZeB5ZeC5ZeD5ZeE5ZeF5ZeG5ZeH5ZeI5ZeJ5ZeK5ZeL5ZeM5ZeN5ZeO5ZeP5ZeQ5ZeR5ZeS5ZeT5ZeU5ZeV5ZeW5ZeX5ZeY5ZeZ5Zea5Zeb5Zec5Zed5Zee5ZefCivll6Dll6Hll6Lll6Pll6Tll6Xll6bll6fll6jll6nll6rll6vll6zll63ll67ll6/ll7Dll7Hll7Lll7Pll7Tll7Xll7bll7fll7jll7nll7rll7vll7zll73ll77ll78KK+WYgOWYgeWYguWYg+WYhOWYheWYhuWYh+WYiOWYieWYiuWYi+WYjOWYjeWYjuWYj+WYkOWYkeWYkuWYk+WYlOWYleWYluWYl+WYmOWYmeWYmuWYm+WYnOWYneWYnuWYnwor5Zig5Zih5Zii5Zij5Zik5Zil5Zim5Zin5Zio5Zip5Ziq5Zir5Zis5Zit5Ziu5Ziv5Ziw5Zix5Ziy5Ziz5Zi05Zi15Zi25Zi35Zi45Zi55Zi65Zi75Zi85Zi95Zi+5Zi/CivlmYDlmYHlmYLlmYPlmYTlmYXlmYblmYflmYjlmYnlmYrlmYvlmYzlmY3lmY7lmY/lmZDlmZHlmZLlmZPlmZTlmZXlmZblmZflmZjlmZnlmZrlmZvlmZzlmZ3lmZ7lmZ8KK+WZoOWZoeWZouWZo+WZpOWZpeWZpuWZp+WZqOWZqeWZquWZq+WZrOWZreWZruWZr+WZsOWZseWZsuWZs+WZtOWZteWZtuWZt+WZuOWZueWZuuWZu+WZvOWZveWZvuWZvwor5ZqA5ZqB5ZqC5ZqD5ZqE5ZqF5ZqG5ZqH5ZqI5ZqJ5ZqK5ZqL5ZqM5ZqN5ZqO5ZqP5ZqQ5ZqR5ZqS5ZqT5ZqU5ZqV5ZqW5ZqX5ZqY5ZqZ5Zqa5Zqb5Zqc5Zqd5Zqe5ZqfCivlmqDlmqHlmqLlmqPlmqTlmqXlmqblmqflmqjlmqnlmqrlmqvlmqzlmq3lmq7lmq/lmrDlmrHlmrLlmrPlmrTlmrXlmrblmrflmrjlmrnlmrrlmrvlmrzlmr3lmr7lmr8KK+WbgOWbgeWbguWbg+WbhOWbheWbhuWbh+WbiOWbieWbiuWbi+WbjOWbjeWbjuWbj+WbkOWbkeWbkuWbk+WblOWbleWbluWbl+WbmOWbmeWbmuWbm+WbnOWbneWbnuWbnwor5Zug5Zuh5Zui5Zuj5Zuk5Zul5Zum5Zun5Zuo5Zup5Zuq5Zur5Zus5Zut5Zuu5Zuv5Zuw5Zux5Zuy5Zuz5Zu05Zu15Zu25Zu35Zu45Zu55Zu65Zu75Zu85Zu95Zu+5Zu/CivlnIDlnIHlnILlnIPlnITlnIXlnIblnIflnIjlnInlnIrlnIvlnIzlnI3lnI7lnI/lnJDlnJHlnJLlnJPlnJTlnJXlnJblnJflnJjlnJnlnJrlnJvlnJzlnJ3lnJ7lnJ8KK+WcoOWcoeWcouWco+WcpOWcpeWcpuWcp+WcqOWcqeWcquWcq+WcrOWcreWcruWcr+WcsOWcseWcsuWcs+WctOWcteWctuWct+WcuOWcueWcuuWcu+WcvOWcveWcvuWcvwor5Z2A5Z2B5Z2C5Z2D5Z2E5Z2F5Z2G5Z2H5Z2I5Z2J5Z2K5Z2L5Z2M5Z2N5Z2O5Z2P5Z2Q5Z2R5Z2S5Z2T5Z2U5Z2V5Z2W5Z2X5Z2Y5Z2Z5Z2a5Z2b5Z2c5Z2d5Z2e5Z2fCivlnaDlnaHlnaLlnaPlnaTlnaXlnablnaflnajlnanlnarlnavlnazlna3lna7lna/lnbDlnbHlnbLlnbPlnbTlnbXlnbblnbflnbjlnbnlnbrlnbvlnbzlnb3lnb7lnb8KK+WegOWegeWeguWeg+WehOWeheWehuWeh+WeiOWeieWeiuWei+WejOWejeWejuWej+WekOWekeWekuWek+WelOWeleWeluWel+WemOWemeWemuWem+WenOWeneWenuWenwor5Z6g5Z6h5Z6i5Z6j5Z6k5Z6l5Z6m5Z6n5Z6o5Z6p5Z6q5Z6r5Z6s5Z6t5Z6u5Z6v5Z6w5Z6x5Z6y5Z6z5Z605Z615Z625Z635Z645Z655Z665Z675Z685Z695Z6+5Z6/Civln4Dln4Hln4Lln4Pln4Tln4Xln4bln4fln4jln4nln4rln4vln4zln43ln47ln4/ln5Dln5Hln5Lln5Pln5Tln5Xln5bln5fln5jln5nln5rln5vln5zln53ln57ln58KK+WfoOWfoeWfouWfo+WfpOWfpeWfpuWfp+WfqOWfqeWfquWfq+WfrOWfreWfruWfr+WfsOWfseWfsuWfs+WftOWfteWftuWft+WfuOWfueWfuuWfu+WfvOWfveWfvuWfvwor5aCA5aCB5aCC5aCD5aCE5aCF5aCG5aCH5aCI5aCJ5aCK5aCL5aCM5aCN5aCO5aCP5aCQ5aCR5aCS5aCT5aCU5aCV5aCW5aCX5aCY5aCZ5aCa5aCb5aCc5aCd5aCe5aCfCivloKDloKHloKLloKPloKTloKXloKbloKfloKjloKnloKrloKvloKzloK3loK7loK/loLDloLHloLLloLPloLTloLXloLbloLfloLjloLnloLrloLvloLzloL3loL7loL8KK+WhgOWhgeWhguWhg+WhhOWhheWhhuWhh+WhiOWhieWhiuWhi+WhjOWhjeWhjuWhj+WhkOWhkeWhkuWhk+WhlOWhleWhluWhl+WhmOWhmeWhmuWhm+WhnOWhneWhnuWhnwor5aGg5aGh5aGi5aGj5aGk5aGl5aGm5aGn5aGo5aGp5aGq5aGr5aGs5aGt5aGu5aGv5aGw5aGx5aGy5aGz5aG05aG15aG25aG35aG45aG55aG65aG75aG85aG95aG+5aG/CivlooDlooHlooLlooPlooTlooXloobloofloojloonloorloovloozloo3loo7loo/lopDlopHlopLlopPlopTlopXlopblopflopjlopnloprlopvlopzlop3lop7lop8KK+WioOWioeWiouWio+WipOWipeWipuWip+WiqOWiqeWiquWiq+WirOWireWiruWir+WisOWiseWisuWis+WitOWiteWituWit+WiuOWiueWiuuWiu+WivOWiveWivuWivwor5aOA5aOB5aOC5aOD5aOE5aOF5aOG5aOH5aOI5aOJ5aOK5aOL5aOM5aON5aOO5aOP5aOQ5aOR5aOS5aOT5aOU5aOV5aOW5aOX5aOY5aOZ5aOa5aOb5aOc5aOd5aOe5aOfCivlo6Dlo6Hlo6Llo6Plo6Tlo6Xlo6blo6flo6jlo6nlo6rlo6vlo6zlo63lo67lo6/lo7Dlo7Hlo7Llo7Plo7Tlo7Xlo7blo7flo7jlo7nlo7rlo7vlo7zlo73lo77lo78KK+WkgOWkgeWkguWkg+WkhOWkheWkhuWkh+WkiOWkieWkiuWki+WkjOWkjeWkjuWkj+WkkOWkkeWkkuWkk+WklOWkleWkluWkl+WkmOWkmeWkmuWkm+WknOWkneWknuWknwor5aSg5aSh5aSi5aSj5aSk5aSl5aSm5aSn5aSo5aSp5aSq5aSr5aSs5aSt5aSu5aSv5aSw5aSx5aSy5aSz5aS05aS15aS25aS35aS45aS55aS65aS75aS85aS95aS+5aS/CivlpYDlpYHlpYLlpYPlpYTlpYXlpYblpYflpYjlpYnlpYrlpYvlpYzlpY3lpY7lpY/lpZDlpZHlpZLlpZPlpZTlpZXlpZblpZflpZjlpZnlpZrlpZvlpZzlpZ3lpZ7lpZ8KK+WloOWloeWlouWlo+WlpOWlpeWlpuWlp+WlqOWlqeWlquWlq+WlrOWlreWlruWlr+WlsOWlseWlsuWls+WltOWlteWltuWlt+WluOWlueWluuWlu+WlvOWlveWlvuWlvwor5aaA5aaB5aaC5aaD5aaE5aaF5aaG5aaH5aaI5aaJ5aaK5aaL5aaM5aaN5aaO5aaP5aaQ5aaR5aaS5aaT5aaU5aaV5aaW5aaX5aaY5aaZ5aaa5aab5aac5aad5aae5aafCivlpqDlpqHlpqLlpqPlpqTlpqXlpqblpqflpqjlpqnlpqrlpqvlpqzlpq3lpq7lpq/lprDlprHlprLlprPlprTlprXlprblprflprjlprnlprrlprvlprzlpr3lpr7lpr8KK+WngOWngeWnguWng+WnhOWnheWnhuWnh+WniOWnieWniuWni+WnjOWnjeWnjuWnj+WnkOWnkeWnkuWnk+WnlOWnleWnluWnl+WnmOWnmeWnmuWnm+WnnOWnneWnnuWnnwor5aeg5aeh5aei5aej5aek5ael5aem5aen5aeo5aep5aeq5aer5aes5aet5aeu5aev5aew5aex5aey5aez5ae05ae15ae25ae35ae45ae55ae65ae75ae85ae95ae+5ae/CivlqIDlqIHlqILlqIPlqITlqIXlqIblqIflqIjlqInlqIrlqIvlqIzlqI3lqI7lqI/lqJDlqJHlqJLlqJPlqJTlqJXlqJblqJflqJjlqJnlqJrlqJvlqJzlqJ3lqJ7lqJ8KK+WooOWooeWoouWoo+WopOWopeWopuWop+WoqOWoqeWoquWoq+WorOWoreWoruWor+WosOWoseWosuWos+WotOWoteWotuWot+WouOWoueWouuWou+WovOWoveWovuWovwor5amA5amB5amC5amD5amE5amF5amG5amH5amI5amJ5amK5amL5amM5amN5amO5amP5amQ5amR5amS5amT5amU5amV5amW5amX5amY5amZ5ama5amb5amc5amd5ame5amfCivlqaDlqaHlqaLlqaPlqaTlqaXlqablqaflqajlqanlqarlqavlqazlqa3lqa7lqa/lqbDlqbHlqbLlqbPlqbTlqbXlqbblqbflqbjlqbnlqbrlqbvlqbzlqb3lqb7lqb8KK+WqgOWqgeWqguWqg+WqhOWqheWqhuWqh+WqiOWqieWqiuWqi+WqjOWqjeWqjuWqj+WqkOWqkeWqkuWqk+WqlOWqleWqluWql+WqmOWqmeWqmuWqm+WqnOWqneWqnuWqnwor5aqg5aqh5aqi5aqj5aqk5aql5aqm5aqn5aqo5aqp5aqq5aqr5aqs5aqt5aqu5aqv5aqw5aqx5aqy5aqz5aq05aq15aq25aq35aq45aq55aq65aq75aq85aq95aq+5aq/Civlq4Dlq4Hlq4Llq4Plq4Tlq4Xlq4blq4flq4jlq4nlq4rlq4vlq4zlq43lq47lq4/lq5Dlq5Hlq5Llq5Plq5Tlq5Xlq5blq5flq5jlq5nlq5rlq5vlq5zlq53lq57lq58KK+WroOWroeWrouWro+WrpOWrpeWrpuWrp+WrqOWrqeWrquWrq+WrrOWrreWrruWrr+WrsOWrseWrsuWrs+WrtOWrteWrtuWrt+WruOWrueWruuWru+WrvOWrveWrvuWrvwor5ayA5ayB5ayC5ayD5ayE5ayF5ayG5ayH5ayI5ayJ5ayK5ayL5ayM5ayN5ayO5ayP5ayQ5ayR5ayS5ayT5ayU5ayV5ayW5ayX5ayY5ayZ5aya5ayb5ayc5ayd5aye5ayfCivlrKDlrKHlrKLlrKPlrKTlrKXlrKblrKflrKjlrKnlrKrlrKvlrKzlrK3lrK7lrK/lrLDlrLHlrLLlrLPlrLTlrLXlrLblrLflrLjlrLnlrLrlrLvlrLzlrL3lrL7lrL8KK+WtgOWtgeWtguWtg+WthOWtheWthuWth+WtiOWtieWtiuWti+WtjOWtjeWtjuWtj+WtkOWtkeWtkuWtk+WtlOWtleWtluWtl+WtmOWtmeWtmuWtm+WtnOWtneWtnuWtnwor5a2g5a2h5a2i5a2j5a2k5a2l5a2m5a2n5a2o5a2p5a2q5a2r5a2s5a2t5a2u5a2v5a2w5a2x5a2y5a2z5a205a215a225a235a245a255a265a275a285a295a2+5a2/CivlroDlroHlroLlroPlroTlroXlroblroflrojlronlrorlrovlrozlro3lro7lro/lrpDlrpHlrpLlrpPlrpTlrpXlrpblrpflrpjlrpnlrprlrpvlrpzlrp3lrp7lrp8KK+WuoOWuoeWuouWuo+WupOWupeWupuWup+WuqOWuqeWuquWuq+WurOWureWuruWur+WusOWuseWusuWus+WutOWuteWutuWut+WuuOWuueWuuuWuu+WuvOWuveWuvuWuvwor5a+A5a+B5a+C5a+D5a+E5a+F5a+G5a+H5a+I5a+J5a+K5a+L5a+M5a+N5a+O5a+P5a+Q5a+R5a+S5a+T5a+U5a+V5a+W5a+X5a+Y5a+Z5a+a5a+b5a+c5a+d5a+e5a+fCivlr6Dlr6Hlr6Llr6Plr6Tlr6Xlr6blr6flr6jlr6nlr6rlr6vlr6zlr63lr67lr6/lr7Dlr7Hlr7Llr7Plr7Tlr7Xlr7blr7flr7jlr7nlr7rlr7vlr7zlr73lr77lr78KK+WwgOWwgeWwguWwg+WwhOWwheWwhuWwh+WwiOWwieWwiuWwi+WwjOWwjeWwjuWwj+WwkOWwkeWwkuWwk+WwlOWwleWwluWwl+WwmOWwmeWwmuWwm+WwnOWwneWwnuWwnwor5bCg5bCh5bCi5bCj5bCk5bCl5bCm5bCn5bCo5bCp5bCq5bCr5bCs5bCt5bCu5bCv5bCw5bCx5bCy5bCz5bC05bC15bC25bC35bC45bC55bC65bC75bC85bC95bC+5bC/CivlsYDlsYHlsYLlsYPlsYTlsYXlsYblsYflsYjlsYnlsYrlsYvlsYzlsY3lsY7lsY/lsZDlsZHlsZLlsZPlsZTlsZXlsZblsZflsZjlsZnlsZrlsZvlsZzlsZ3lsZ7lsZ8KK+WxoOWxoeWxouWxo+WxpOWxpeWxpuWxp+WxqOWxqeWxquWxq+WxrOWxreWxruWxr+WxsOWxseWxsuWxs+WxtOWxteWxtuWxt+WxuOWxueWxuuWxu+WxvOWxveWxvuWxvwor5bKA5bKB5bKC5bKD5bKE5bKF5bKG5bKH5bKI5bKJ5bKK5bKL5bKM5bKN5bKO5bKP5bKQ5bKR5bKS5bKT5bKU5bKV5bKW5bKX5bKY5bKZ5bKa5bKb5bKc5bKd5bKe5bKfCivlsqDlsqHlsqLlsqPlsqTlsqXlsqblsqflsqjlsqnlsqrlsqvlsqzlsq3lsq7lsq/lsrDlsrHlsrLlsrPlsrTlsrXlsrblsrflsrjlsrnlsrrlsrvlsrzlsr3lsr7lsr8KK+WzgOWzgeWzguWzg+WzhOWzheWzhuWzh+WziOWzieWziuWzi+WzjOWzjeWzjuWzj+WzkOWzkeWzkuWzk+WzlOWzleWzluWzl+WzmOWzmeWzmuWzm+WznOWzneWznuWznwor5bOg5bOh5bOi5bOj5bOk5bOl5bOm5bOn5bOo5bOp5bOq5bOr5bOs5bOt5bOu5bOv5bOw5bOx5bOy5bOz5bO05bO15bO25bO35bO45bO55bO65bO75bO85bO95bO+5bO/CivltIDltIHltILltIPltITltIXltIbltIfltIjltInltIrltIvltIzltI3ltI7ltI/ltJDltJHltJLltJPltJTltJXltJbltJfltJjltJnltJrltJvltJzltJ3ltJ7ltJ8KK+W0oOW0oeW0ouW0o+W0pOW0peW0puW0p+W0qOW0qeW0quW0q+W0rOW0reW0ruW0r+W0sOW0seW0suW0s+W0tOW0teW0tuW0t+W0uOW0ueW0uuW0u+W0vOW0veW0vuW0vwor5bWA5bWB5bWC5bWD5bWE5bWF5bWG5bWH5bWI5bWJ5bWK5bWL5bWM5bWN5bWO5bWP5bWQ5bWR5bWS5bWT5bWU5bWV5bWW5bWX5bWY5bWZ5bWa5bWb5bWc5bWd5bWe5bWfCivltaDltaHltaLltaPltaTltaXltabltafltajltanltarltavltazlta3lta7lta/ltbDltbHltbLltbPltbTltbXltbbltbfltbjltbnltbrltbvltbzltb3ltb7ltb8KK+W2gOW2geW2guW2g+W2hOW2heW2huW2h+W2iOW2ieW2iuW2i+W2jOW2jeW2juW2j+W2kOW2keW2kuW2k+W2lOW2leW2luW2l+W2mOW2meW2muW2m+W2nOW2neW2nuW2nwor5bag5bah5bai5baj5bak5bal5bam5ban5bao5bap5baq5bar5bas5bat5bau5bav5baw5bax5bay5baz5ba05ba15ba25ba35ba45ba55ba65ba75ba85ba95ba+5ba/Civlt4Dlt4Hlt4Llt4Plt4Tlt4Xlt4blt4flt4jlt4nlt4rlt4vlt4zlt43lt47lt4/lt5Dlt5Hlt5Llt5Plt5Tlt5Xlt5blt5flt5jlt5nlt5rlt5vlt5zlt53lt57lt58KK+W3oOW3oeW3ouW3o+W3pOW3peW3puW3p+W3qOW3qeW3quW3q+W3rOW3reW3ruW3r+W3sOW3seW3suW3s+W3tOW3teW3tuW3t+W3uOW3ueW3uuW3u+W3vOW3veW3vuW3vwor5biA5biB5biC5biD5biE5biF5biG5biH5biI5biJ5biK5biL5biM5biN5biO5biP5biQ5biR5biS5biT5biU5biV5biW5biX5biY5biZ5bia5bib5bic5bid5bie5bifCivluKDluKHluKLluKPluKTluKXluKbluKfluKjluKnluKrluKvluKzluK3luK7luK/luLDluLHluLLluLPluLTluLXluLbluLfluLjluLnluLrluLvluLzluL3luL7luL8KK+W5gOW5geW5guW5g+W5hOW5heW5huW5h+W5iOW5ieW5iuW5i+W5jOW5jeW5juW5j+W5kOW5keW5kuW5k+W5lOW5leW5luW5l+W5mOW5meW5muW5m+W5nOW5neW5nuW5nwor5bmg5bmh5bmi5bmj5bmk5bml5bmm5bmn5bmo5bmp5bmq5bmr5bms5bmt5bmu5bmv5bmw5bmx5bmy5bmz5bm05bm15bm25bm35bm45bm55bm65bm75bm85bm95bm+5bm/CivluoDluoHluoLluoPluoTluoXluobluofluojluonluorluovluozluo3luo7luo/lupDlupHlupLlupPlupTlupXlupblupflupjlupnluprlupvlupzlup3lup7lup8KK+W6oOW6oeW6ouW6o+W6pOW6peW6puW6p+W6qOW6qeW6quW6q+W6rOW6reW6ruW6r+W6sOW6seW6suW6s+W6tOW6teW6tuW6t+W6uOW6ueW6uuW6u+W6vOW6veW6vuW6vwor5buA5buB5buC5buD5buE5buF5buG5buH5buI5buJ5buK5buL5buM5buN5buO5buP5buQ5buR5buS5buT5buU5buV5buW5buX5buY5buZ5bua5bub5buc5bud5bue5bufCivlu6Dlu6Hlu6Llu6Plu6Tlu6Xlu6blu6flu6jlu6nlu6rlu6vlu6zlu63lu67lu6/lu7Dlu7Hlu7Llu7Plu7Tlu7Xlu7blu7flu7jlu7nlu7rlu7vlu7zlu73lu77lu78KK+W8gOW8geW8guW8g+W8hOW8heW8huW8h+W8iOW8ieW8iuW8i+W8jOW8jeW8juW8j+W8kOW8keW8kuW8k+W8lOW8leW8luW8l+W8mOW8meW8muW8m+W8nOW8neW8nuW8nwor5byg5byh5byi5byj5byk5byl5bym5byn5byo5byp5byq5byr5bys5byt5byu5byv5byw5byx5byy5byz5by05by15by25by35by45by55by65by75by85by95by+5by/CivlvYDlvYHlvYLlvYPlvYTlvYXlvYblvYflvYjlvYnlvYrlvYvlvYzlvY3lvY7lvY/lvZDlvZHlvZLlvZPlvZTlvZXlvZblvZflvZjlvZnlvZrlvZvlvZzlvZ3lvZ7lvZ8KK+W9oOW9oeW9ouW9o+W9pOW9peW9puW9p+W9qOW9qeW9quW9q+W9rOW9reW9ruW9r+W9sOW9seW9suW9s+W9tOW9teW9tuW9t+W9uOW9ueW9uuW9u+W9vOW9veW9vuW9vwor5b6A5b6B5b6C5b6D5b6E5b6F5b6G5b6H5b6I5b6J5b6K5b6L5b6M5b6N5b6O5b6P5b6Q5b6R5b6S5b6T5b6U5b6V5b6W5b6X5b6Y5b6Z5b6a5b6b5b6c5b6d5b6e5b6fCivlvqDlvqHlvqLlvqPlvqTlvqXlvqblvqflvqjlvqnlvqrlvqvlvqzlvq3lvq7lvq/lvrDlvrHlvrLlvrPlvrTlvrXlvrblvrflvrjlvrnlvrrlvrvlvrzlvr3lvr7lvr8KK+W/gOW/geW/guW/g+W/hOW/heW/huW/h+W/iOW/ieW/iuW/i+W/jOW/jeW/juW/j+W/kOW/keW/kuW/k+W/lOW/leW/luW/l+W/mOW/meW/muW/m+W/nOW/neW/nuW/nwor5b+g5b+h5b+i5b+j5b+k5b+l5b+m5b+n5b+o5b+p5b+q5b+r5b+s5b+t5b+u5b+v5b+w5b+x5b+y5b+z5b+05b+15b+25b+35b+45b+55b+65b+75b+85b+95b++5b+/CivmgIDmgIHmgILmgIPmgITmgIXmgIbmgIfmgIjmgInmgIrmgIvmgIzmgI3mgI7mgI/mgJDmgJHmgJLmgJPmgJTmgJXmgJbmgJfmgJjmgJnmgJrmgJvmgJzmgJ3mgJ7mgJ8KK+aAoOaAoeaAouaAo+aApOaApeaApuaAp+aAqOaAqeaAquaAq+aArOaAreaAruaAr+aAsOaAseaAsuaAs+aAtOaAteaAtuaAt+aAuOaAueaAuuaAu+aAvOaAveaAvuaAvwor5oGA5oGB5oGC5oGD5oGE5oGF5oGG5oGH5oGI5oGJ5oGK5oGL5oGM5oGN5oGO5oGP5oGQ5oGR5oGS5oGT5oGU5oGV5oGW5oGX5oGY5oGZ5oGa5oGb5oGc5oGd5oGe5oGfCivmgaDmgaHmgaLmgaPmgaTmgaXmgabmgafmgajmganmgarmgavmgazmga3mga7mga/mgbDmgbHmgbLmgbPmgbTmgbXmgbbmgbfmgbjmgbnmgbrmgbvmgbzmgb3mgb7mgb8KK+aCgOaCgeaCguaCg+aChOaCheaChuaCh+aCiOaCieaCiuaCi+aCjOaCjeaCjuaCj+aCkOaCkeaCkuaCk+aClOaCleaCluaCl+aCmOaCmeaCmuaCm+aCnOaCneaCnuaCnwor5oKg5oKh5oKi5oKj5oKk5oKl5oKm5oKn5oKo5oKp5oKq5oKr5oKs5oKt5oKu5oKv5oKw5oKx5oKy5oKz5oK05oK15oK25oK35oK45oK55oK65oK75oK85oK95oK+5oK/Civmg4Dmg4Hmg4Lmg4Pmg4Tmg4Xmg4bmg4fmg4jmg4nmg4rmg4vmg4zmg43mg47mg4/mg5Dmg5Hmg5Lmg5Pmg5Tmg5Xmg5bmg5fmg5jmg5nmg5rmg5vmg5zmg53mg57mg58KK+aDoOaDoeaDouaDo+aDpOaDpeaDpuaDp+aDqOaDqeaDquaDq+aDrOaDreaDruaDr+aDsOaDseaDsuaDs+aDtOaDteaDtuaDt+aDuOaDueaDuuaDu+aDvOaDveaDvuaDvwor5oSA5oSB5oSC5oSD5oSE5oSF5oSG5oSH5oSI5oSJ5oSK5oSL5oSM5oSN5oSO5oSP5oSQ5oSR5oSS5oST5oSU5oSV5oSW5oSX5oSY5oSZ5oSa5oSb5oSc5oSd5oSe5oSfCivmhKDmhKHmhKLmhKPmhKTmhKXmhKbmhKfmhKjmhKnmhKrmhKvmhKzmhK3mhK7mhK/mhLDmhLHmhLLmhLPmhLTmhLXmhLbmhLfmhLjmhLnmhLrmhLvmhLzmhL3mhL7mhL8KK+aFgOaFgeaFguaFg+aFhOaFheaFhuaFh+aFiOaFieaFiuaFi+aFjOaFjeaFjuaFj+aFkOaFkeaFkuaFk+aFlOaFleaFluaFl+aFmOaFmeaFmuaFm+aFnOaFneaFnuaFnwor5oWg5oWh5oWi5oWj5oWk5oWl5oWm5oWn5oWo5oWp5oWq5oWr5oWs5oWt5oWu5oWv5oWw5oWx5oWy5oWz5oW05oW15oW25oW35oW45oW55oW65oW75oW85oW95oW+5oW/CivmhoDmhoHmhoLmhoPmhoTmhoXmhobmhofmhojmhonmhormhovmhozmho3mho7mho/mhpDmhpHmhpLmhpPmhpTmhpXmhpbmhpfmhpjmhpnmhprmhpvmhpzmhp3mhp7mhp8KK+aGoOaGoeaGouaGo+aGpOaGpeaGpuaGp+aGqOaGqeaGquaGq+aGrOaGreaGruaGr+aGsOaGseaGsuaGs+aGtOaGteaGtuaGt+aGuOaGueaGuuaGu+aGvOaGveaGvuaGvwor5oeA5oeB5oeC5oeD5oeE5oeF5oeG5oeH5oeI5oeJ5oeK5oeL5oeM5oeN5oeO5oeP5oeQ5oeR5oeS5oeT5oeU5oeV5oeW5oeX5oeY5oeZ5oea5oeb5oec5oed5oee5oefCivmh6Dmh6Hmh6Lmh6Pmh6Tmh6Xmh6bmh6fmh6jmh6nmh6rmh6vmh6zmh63mh67mh6/mh7Dmh7Hmh7Lmh7Pmh7Tmh7Xmh7bmh7fmh7jmh7nmh7rmh7vmh7zmh73mh77mh78KK+aIgOaIgeaIguaIg+aIhOaIheaIhuaIh+aIiOaIieaIiuaIi+aIjOaIjeaIjuaIj+aIkOaIkeaIkuaIk+aIlOaIleaIluaIl+aImOaImeaImuaIm+aInOaIneaInuaInwor5oig5oih5oii5oij5oik5oil5oim5oin5oio5oip5oiq5oir5ois5oit5oiu5oiv5oiw5oix5oiy5oiz5oi05oi15oi25oi35oi45oi55oi65oi75oi85oi95oi+5oi/CivmiYDmiYHmiYLmiYPmiYTmiYXmiYbmiYfmiYjmiYnmiYrmiYvmiYzmiY3miY7miY/miZDmiZHmiZLmiZPmiZTmiZXmiZbmiZfmiZjmiZnmiZrmiZvmiZzmiZ3miZ7miZ8KK+aJoOaJoeaJouaJo+aJpOaJpeaJpuaJp+aJqOaJqeaJquaJq+aJrOaJreaJruaJr+aJsOaJseaJsuaJs+aJtOaJteaJtuaJt+aJuOaJueaJuuaJu+aJvOaJveaJvuaJvwor5oqA5oqB5oqC5oqD5oqE5oqF5oqG5oqH5oqI5oqJ5oqK5oqL5oqM5oqN5oqO5oqP5oqQ5oqR5oqS5oqT5oqU5oqV5oqW5oqX5oqY5oqZ5oqa5oqb5oqc5oqd5oqe5oqfCivmiqDmiqHmiqLmiqPmiqTmiqXmiqbmiqfmiqjmiqnmiqrmiqvmiqzmiq3miq7miq/mirDmirHmirLmirPmirTmirXmirbmirfmirjmirnmirrmirvmirzmir3mir7mir8KK+aLgOaLgeaLguaLg+aLhOaLheaLhuaLh+aLiOaLieaLiuaLi+aLjOaLjeaLjuaLj+aLkOaLkeaLkuaLk+aLlOaLleaLluaLl+aLmOaLmeaLmuaLm+aLnOaLneaLnuaLnwor5oug5ouh5oui5ouj5ouk5oul5oum5oun5ouo5oup5ouq5our5ous5out5ouu5ouv5ouw5oux5ouy5ouz5ou05ou15ou25ou35ou45ou55ou65ou75ou85ou95ou+5ou/CivmjIDmjIHmjILmjIPmjITmjIXmjIbmjIfmjIjmjInmjIrmjIvmjIzmjI3mjI7mjI/mjJDmjJHmjJLmjJPmjJTmjJXmjJbmjJfmjJjmjJnmjJrmjJvmjJzmjJ3mjJ7mjJ8KK+aMoOaMoeaMouaMo+aMpOaMpeaMpuaMp+aMqOaMqeaMquaMq+aMrOaMreaMruaMr+aMsOaMseaMsuaMs+aMtOaMteaMtuaMt+aMuOaMueaMuuaMu+aMvOaMveaMvuaMvwor5o2A5o2B5o2C5o2D5o2E5o2F5o2G5o2H5o2I5o2J5o2K5o2L5o2M5o2N5o2O5o2P5o2Q5o2R5o2S5o2T5o2U5o2V5o2W5o2X5o2Y5o2Z5o2a5o2b5o2c5o2d5o2e5o2fCivmjaDmjaHmjaLmjaPmjaTmjaXmjabmjafmjajmjanmjarmjavmjazmja3mja7mja/mjbDmjbHmjbLmjbPmjbTmjbXmjbbmjbfmjbjmjbnmjbrmjbvmjbzmjb3mjb7mjb8KK+aOgOaOgeaOguaOg+aOhOaOheaOhuaOh+aOiOaOieaOiuaOi+aOjOaOjeaOjuaOj+aOkOaOkeaOkuaOk+aOlOaOleaOluaOl+aOmOaOmeaOmuaOm+aOnOaOneaOnuaOnwor5o6g5o6h5o6i5o6j5o6k5o6l5o6m5o6n5o6o5o6p5o6q5o6r5o6s5o6t5o6u5o6v5o6w5o6x5o6y5o6z5o605o615o625o635o645o655o665o675o685o695o6+5o6/Civmj4Dmj4Hmj4Lmj4Pmj4Tmj4Xmj4bmj4fmj4jmj4nmj4rmj4vmj4zmj43mj47mj4/mj5Dmj5Hmj5Lmj5Pmj5Tmj5Xmj5bmj5fmj5jmj5nmj5rmj5vmj5zmj53mj57mj58KK+aPoOaPoeaPouaPo+aPpOaPpeaPpuaPp+aPqOaPqeaPquaPq+aPrOaPreaPruaPr+aPsOaPseaPsuaPs+aPtOaPteaPtuaPt+aPuOaPueaPuuaPu+aPvOaPveaPvuaPvwor5pCA5pCB5pCC5pCD5pCE5pCF5pCG5pCH5pCI5pCJ5pCK5pCL5pCM5pCN5pCO5pCP5pCQ5pCR5pCS5pCT5pCU5pCV5pCW5pCX5pCY5pCZ5pCa5pCb5pCc5pCd5pCe5pCfCivmkKDmkKHmkKLmkKPmkKTmkKXmkKbmkKfmkKjmkKnmkKrmkKvmkKzmkK3mkK7mkK/mkLDmkLHmkLLmkLPmkLTmkLXmkLbmkLfmkLjmkLnmkLrmkLvmkLzmkL3mkL7mkL8KK+aRgOaRgeaRguaRg+aRhOaRheaRhuaRh+aRiOaRieaRiuaRi+aRjOaRjeaRjuaRj+aRkOaRkeaRkuaRk+aRlOaRleaRluaRl+aRmOaRmeaRmuaRm+aRnOaRneaRnuaRnwor5pGg5pGh5pGi5pGj5pGk5pGl5pGm5pGn5pGo5pGp5pGq5pGr5pGs5pGt5pGu5pGv5pGw5pGx5pGy5pGz5pG05pG15pG25pG35pG45pG55pG65pG75pG85pG95pG+5pG/CivmkoDmkoHmkoLmkoPmkoTmkoXmkobmkofmkojmkonmkormkovmkozmko3mko7mko/mkpDmkpHmkpLmkpPmkpTmkpXmkpbmkpfmkpjmkpnmkprmkpvmkpzmkp3mkp7mkp8KK+aSoOaSoeaSouaSo+aSpOaSpeaSpuaSp+aSqOaSqeaSquaSq+aSrOaSreaSruaSr+aSsOaSseaSsuaSs+aStOaSteaStuaSt+aSuOaSueaSuuaSu+aSvOaSveaSvuaSvwor5pOA5pOB5pOC5pOD5pOE5pOF5pOG5pOH5pOI5pOJ5pOK5pOL5pOM5pON5pOO5pOP5pOQ5pOR5pOS5pOT5pOU5pOV5pOW5pOX5pOY5pOZ5pOa5pOb5pOc5pOd5pOe5pOfCivmk6Dmk6Hmk6Lmk6Pmk6Tmk6Xmk6bmk6fmk6jmk6nmk6rmk6vmk6zmk63mk67mk6/mk7Dmk7Hmk7Lmk7Pmk7Tmk7Xmk7bmk7fmk7jmk7nmk7rmk7vmk7zmk73mk77mk78KK+aUgOaUgeaUguaUg+aUhOaUheaUhuaUh+aUiOaUieaUiuaUi+aUjOaUjeaUjuaUj+aUkOaUkeaUkuaUk+aUlOaUleaUluaUl+aUmOaUmeaUmuaUm+aUnOaUneaUnuaUnwor5pSg5pSh5pSi5pSj5pSk5pSl5pSm5pSn5pSo5pSp5pSq5pSr5pSs5pSt5pSu5pSv5pSw5pSx5pSy5pSz5pS05pS15pS25pS35pS45pS55pS65pS75pS85pS95pS+5pS/CivmlYDmlYHmlYLmlYPmlYTmlYXmlYbmlYfmlYjmlYnmlYrmlYvmlYzmlY3mlY7mlY/mlZDmlZHmlZLmlZPmlZTmlZXmlZbmlZfmlZjmlZnmlZrmlZvmlZzmlZ3mlZ7mlZ8KK+aVoOaVoeaVouaVo+aVpOaVpeaVpuaVp+aVqOaVqeaVquaVq+aVrOaVreaVruaVr+aVsOaVseaVsuaVs+aVtOaVteaVtuaVt+aVuOaVueaVuuaVu+aVvOaVveaVvuaVvwor5paA5paB5paC5paD5paE5paF5paG5paH5paI5paJ5paK5paL5paM5paN5paO5paP5paQ5paR5paS5paT5paU5paV5paW5paX5paY5paZ5paa5pab5pac5pad5pae5pafCivmlqDmlqHmlqLmlqPmlqTmlqXmlqbmlqfmlqjmlqnmlqrmlqvmlqzmlq3mlq7mlq/mlrDmlrHmlrLmlrPmlrTmlrXmlrbmlrfmlrjmlrnmlrrmlrvmlrzmlr3mlr7mlr8KK+aXgOaXgeaXguaXg+aXhOaXheaXhuaXh+aXiOaXieaXiuaXi+aXjOaXjeaXjuaXj+aXkOaXkeaXkuaXk+aXlOaXleaXluaXl+aXmOaXmeaXmuaXm+aXnOaXneaXnuaXnwor5peg5peh5pei5pej5pek5pel5pem5pen5peo5pep5peq5per5pes5pet5peu5pev5pew5pex5pey5pez5pe05pe15pe25pe35pe45pe55pe65pe75pe85pe95pe+5pe/CivmmIDmmIHmmILmmIPmmITmmIXmmIbmmIfmmIjmmInmmIrmmIvmmIzmmI3mmI7mmI/mmJDmmJHmmJLmmJPmmJTmmJXmmJbmmJfmmJjmmJnmmJrmmJvmmJzmmJ3mmJ7mmJ8KK+aYoOaYoeaYouaYo+aYpOaYpeaYpuaYp+aYqOaYqeaYquaYq+aYrOaYreaYruaYr+aYsOaYseaYsuaYs+aYtOaYteaYtuaYt+aYuOaYueaYuuaYu+aYvOaYveaYvuaYvwor5pmA5pmB5pmC5pmD5pmE5pmF5pmG5pmH5pmI5pmJ5pmK5pmL5pmM5pmN5pmO5pmP5pmQ5pmR5pmS5pmT5pmU5pmV5pmW5pmX5pmY5pmZ5pma5pmb5pmc5pmd5pme5pmfCivmmaDmmaHmmaLmmaPmmaTmmaXmmabmmafmmajmmanmmarmmavmmazmma3mma7mma/mmbDmmbHmmbLmmbPmmbTmmbXmmbbmmbfmmbjmmbnmmbrmmbvmmbzmmb3mmb7mmb8KK+aagOaageaaguaag+aahOaaheaahuaah+aaiOaaieaaiuaai+aajOaajeaajuaaj+aakOaakeaakuaak+aalOaaleaaluaal+aamOaameaamuaam+aanOaaneaanuaanwor5pqg5pqh5pqi5pqj5pqk5pql5pqm5pqn5pqo5pqp5pqq5pqr5pqs5pqt5pqu5pqv5pqw5pqx5pqy5pqz5pq05pq15pq25pq35pq45pq55pq65pq75pq85pq95pq+5pq/Civmm4Dmm4Hmm4Lmm4Pmm4Tmm4Xmm4bmm4fmm4jmm4nmm4rmm4vmm4zmm43mm47mm4/mm5Dmm5Hmm5Lmm5Pmm5Tmm5Xmm5bmm5fmm5jmm5nmm5rmm5vmm5zmm53mm57mm58KK+aboOaboeabouabo+abpOabpeabpuabp+abqOabqeabquabq+abrOabreabruabr+absOabseabsuabs+abtOabteabtuabt+abuOabueabuuabu+abvOabveabvuabvwor5pyA5pyB5pyC5pyD5pyE5pyF5pyG5pyH5pyI5pyJ5pyK5pyL5pyM5pyN5pyO5pyP5pyQ5pyR5pyS5pyT5pyU5pyV5pyW5pyX5pyY5pyZ5pya5pyb5pyc5pyd5pye5pyfCivmnKDmnKHmnKLmnKPmnKTmnKXmnKbmnKfmnKjmnKnmnKrmnKvmnKzmnK3mnK7mnK/mnLDmnLHmnLLmnLPmnLTmnLXmnLbmnLfmnLjmnLnmnLrmnLvmnLzmnL3mnL7mnL8KK+adgOadgeadguadg+adhOadheadhuadh+adiOadieadiuadi+adjOadjeadjuadj+adkOadkeadkuadk+adlOadleadluadl+admOadmeadmuadm+adnOadneadnuadnwor5p2g5p2h5p2i5p2j5p2k5p2l5p2m5p2n5p2o5p2p5p2q5p2r5p2s5p2t5p2u5p2v5p2w5p2x5p2y5p2z5p205p215p225p235p245p255p265p275p285p295p2+5p2/CivmnoDmnoHmnoLmnoPmnoTmnoXmnobmnofmnojmnonmnormnovmnozmno3mno7mno/mnpDmnpHmnpLmnpPmnpTmnpXmnpbmnpfmnpjmnpnmnprmnpvmnpzmnp3mnp7mnp8KK+aeoOaeoeaeouaeo+aepOaepeaepuaep+aeqOaeqeaequaeq+aerOaereaeruaer+aesOaeseaesuaes+aetOaeteaetuaet+aeuOaeueaeuuaeu+aevOaeveaevuaevwor5p+A5p+B5p+C5p+D5p+E5p+F5p+G5p+H5p+I5p+J5p+K5p+L5p+M5p+N5p+O5p+P5p+Q5p+R5p+S5p+T5p+U5p+V5p+W5p+X5p+Y5p+Z5p+a5p+b5p+c5p+d5p+e5p+fCivmn6Dmn6Hmn6Lmn6Pmn6Tmn6Xmn6bmn6fmn6jmn6nmn6rmn6vmn6zmn63mn67mn6/mn7Dmn7Hmn7Lmn7Pmn7Tmn7Xmn7bmn7fmn7jmn7nmn7rmn7vmn7zmn73mn77mn78KK+aggOaggeagguagg+aghOagheaghuagh+agiOagieagiuagi+agjOagjeagjuagj+agkOagkeagkuagk+aglOagleagluagl+agmOagmeagmuagm+agnOagneagnuagnwor5qCg5qCh5qCi5qCj5qCk5qCl5qCm5qCn5qCo5qCp5qCq5qCr5qCs5qCt5qCu5qCv5qCw5qCx5qCy5qCz5qC05qC15qC25qC35qC45qC55qC65qC75qC85qC95qC+5qC/CivmoYDmoYHmoYLmoYPmoYTmoYXmoYbmoYfmoYjmoYnmoYrmoYvmoYzmoY3moY7moY/moZDmoZHmoZLmoZPmoZTmoZXmoZbmoZfmoZjmoZnmoZrmoZvmoZzmoZ3moZ7moZ8KK+ahoOahoeahouaho+ahpOahpeahpuahp+ahqOahqeahquahq+ahrOahreahruahr+ahsOahseahsuahs+ahtOahteahtuaht+ahuOahueahuuahu+ahvOahveahvuahvwor5qKA5qKB5qKC5qKD5qKE5qKF5qKG5qKH5qKI5qKJ5qKK5qKL5qKM5qKN5qKO5qKP5qKQ5qKR5qKS5qKT5qKU5qKV5qKW5qKX5qKY5qKZ5qKa5qKb5qKc5qKd5qKe5qKfCivmoqDmoqHmoqLmoqPmoqTmoqXmoqbmoqfmoqjmoqnmoqrmoqvmoqzmoq3moq7moq/morDmorHmorLmorPmorTmorXmorbmorfmorjmornmorrmorvmorzmor3mor7mor8KK+ajgOajgeajguajg+ajhOajheajhuajh+ajiOajieajiuaji+ajjOajjeajjuajj+ajkOajkeajkuajk+ajlOajleajluajl+ajmOajmeajmuajm+ajnOajneajnuajnwor5qOg5qOh5qOi5qOj5qOk5qOl5qOm5qOn5qOo5qOp5qOq5qOr5qOs5qOt5qOu5qOv5qOw5qOx5qOy5qOz5qO05qO15qO25qO35qO45qO55qO65qO75qO85qO95qO+5qO/CivmpIDmpIHmpILmpIPmpITmpIXmpIbmpIfmpIjmpInmpIrmpIvmpIzmpI3mpI7mpI/mpJDmpJHmpJLmpJPmpJTmpJXmpJbmpJfmpJjmpJnmpJrmpJvmpJzmpJ3mpJ7mpJ8KK+akoOakoeakouako+akpOakpeakpuakp+akqOakqeakquakq+akrOakreakruakr+aksOakseaksuaks+aktOakteaktuakt+akuOakueakuuaku+akvOakveakvuakvwor5qWA5qWB5qWC5qWD5qWE5qWF5qWG5qWH5qWI5qWJ5qWK5qWL5qWM5qWN5qWO5qWP5qWQ5qWR5qWS5qWT5qWU5qWV5qWW5qWX5qWY5qWZ5qWa5qWb5qWc5qWd5qWe5qWfCivmpaDmpaHmpaLmpaPmpaTmpaXmpabmpafmpajmpanmparmpavmpazmpa3mpa7mpa/mpbDmpbHmpbLmpbPmpbTmpbXmpbbmpbfmpbjmpbnmpbrmpbvmpbzmpb3mpb7mpb8KK+amgOamgeamguamg+amhOamheamhuamh+amiOamieamiuami+amjOamjeamjuamj+amkOamkeamkuamk+amlOamleamluaml+ammOammeammuamm+amnOamneamnuamnwor5qag5qah5qai5qaj5qak5qal5qam5qan5qao5qap5qaq5qar5qas5qat5qau5qav5qaw5qax5qay5qaz5qa05qa15qa25qa35qa45qa55qa65qa75qa85qa95qa+5qa/Civmp4Dmp4Hmp4Lmp4Pmp4Tmp4Xmp4bmp4fmp4jmp4nmp4rmp4vmp4zmp43mp47mp4/mp5Dmp5Hmp5Lmp5Pmp5Tmp5Xmp5bmp5fmp5jmp5nmp5rmp5vmp5zmp53mp57mp58KK+anoOanoeanouano+anpOanpeanpuanp+anqOanqeanquanq+anrOanreanruanr+ansOanseansuans+antOanteantuant+anuOanueanuuanu+anvOanveanvuanvwor5qiA5qiB5qiC5qiD5qiE5qiF5qiG5qiH5qiI5qiJ5qiK5qiL5qiM5qiN5qiO5qiP5qiQ5qiR5qiS5qiT5qiU5qiV5qiW5qiX5qiY5qiZ5qia5qib5qic5qid5qie5qifCivmqKDmqKHmqKLmqKPmqKTmqKXmqKbmqKfmqKjmqKnmqKrmqKvmqKzmqK3mqK7mqK/mqLDmqLHmqLLmqLPmqLTmqLXmqLbmqLfmqLjmqLnmqLrmqLvmqLzmqL3mqL7mqL8KK+apgOapgeapguapg+aphOapheaphuaph+apiOapieapiuapi+apjOapjeapjuapj+apkOapkeapkuapk+aplOapleapluapl+apmOapmeapmuapm+apnOapneapnuapnwor5qmg5qmh5qmi5qmj5qmk5qml5qmm5qmn5qmo5qmp5qmq5qmr5qms5qmt5qmu5qmv5qmw5qmx5qmy5qmz5qm05qm15qm25qm35qm45qm55qm65qm75qm85qm95qm+5qm/CivmqoDmqoHmqoLmqoPmqoTmqoXmqobmqofmqojmqonmqormqovmqozmqo3mqo7mqo/mqpDmqpHmqpLmqpPmqpTmqpXmqpbmqpfmqpjmqpnmqprmqpvmqpzmqp3mqp7mqp8KK+aqoOaqoeaqouaqo+aqpOaqpeaqpuaqp+aqqOaqqeaqquaqq+aqrOaqreaqruaqr+aqsOaqseaqsuaqs+aqtOaqteaqtuaqt+aquOaqueaquuaqu+aqvOaqveaqvuaqvwor5quA5quB5quC5quD5quE5quF5quG5quH5quI5quJ5quK5quL5quM5quN5quO5quP5quQ5quR5quS5quT5quU5quV5quW5quX5quY5quZ5qua5qub5quc5qud5que5qufCivmq6Dmq6Hmq6Lmq6Pmq6Tmq6Xmq6bmq6fmq6jmq6nmq6rmq6vmq6zmq63mq67mq6/mq7Dmq7Hmq7Lmq7Pmq7Tmq7Xmq7bmq7fmq7jmq7nmq7rmq7vmq7zmq73mq77mq78KK+asgOasgeasguasg+ashOasheashuash+asiOasieasiuasi+asjOasjeasjuasj+askOaskeaskuask+aslOasleasluasl+asmOasmeasmuasm+asnOasneasnuasnwor5qyg5qyh5qyi5qyj5qyk5qyl5qym5qyn5qyo5qyp5qyq5qyr5qys5qyt5qyu5qyv5qyw5qyx5qyy5qyz5qy05qy15qy25qy35qy45qy55qy65qy75qy85qy95qy+5qy/CivmrYDmrYHmrYLmrYPmrYTmrYXmrYbmrYfmrYjmrYnmrYrmrYvmrYzmrY3mrY7mrY/mrZDmrZHmrZLmrZPmrZTmrZXmrZbmrZfmrZjmrZnmrZrmrZvmrZzmrZ3mrZ7mrZ8KK+atoOatoeatouato+atpOatpeatpuatp+atqOatqeatquatq+atrOatreatruatr+atsOatseatsuats+attOatteattuatt+atuOatueatuuatu+atvOatveatvuatvwor5q6A5q6B5q6C5q6D5q6E5q6F5q6G5q6H5q6I5q6J5q6K5q6L5q6M5q6N5q6O5q6P5q6Q5q6R5q6S5q6T5q6U5q6V5q6W5q6X5q6Y5q6Z5q6a5q6b5q6c5q6d5q6e5q6fCivmrqDmrqHmrqLmrqPmrqTmrqXmrqbmrqfmrqjmrqnmrqrmrqvmrqzmrq3mrq7mrq/mrrDmrrHmrrLmrrPmrrTmrrXmrrbmrrfmrrjmrrnmrrrmrrvmrrzmrr3mrr7mrr8KK+avgOavgeavguavg+avhOavheavhuavh+aviOavieaviuavi+avjOavjeavjuavj+avkOavkeavkuavk+avlOavleavluavl+avmOavmeavmuavm+avnOavneavnuavnwor5q+g5q+h5q+i5q+j5q+k5q+l5q+m5q+n5q+o5q+p5q+q5q+r5q+s5q+t5q+u5q+v5q+w5q+x5q+y5q+z5q+05q+15q+25q+35q+45q+55q+65q+75q+85q+95q++5q+/CivmsIDmsIHmsILmsIPmsITmsIXmsIbmsIfmsIjmsInmsIrmsIvmsIzmsI3msI7msI/msJDmsJHmsJLmsJPmsJTmsJXmsJbmsJfmsJjmsJnmsJrmsJvmsJzmsJ3msJ7msJ8KK+awoOawoeawouawo+awpOawpeawpuawp+awqOawqeawquawq+awrOawreawruawr+awsOawseawsuaws+awtOawteawtuawt+awuOawueawuuawu+awvOawveawvuawvwor5rGA5rGB5rGC5rGD5rGE5rGF5rGG5rGH5rGI5rGJ5rGK5rGL5rGM5rGN5rGO5rGP5rGQ5rGR5rGS5rGT5rGU5rGV5rGW5rGX5rGY5rGZ5rGa5rGb5rGc5rGd5rGe5rGfCivmsaDmsaHmsaLmsaPmsaTmsaXmsabmsafmsajmsanmsarmsavmsazmsa3msa7msa/msbDmsbHmsbLmsbPmsbTmsbXmsbbmsbfmsbjmsbnmsbrmsbvmsbzmsb3msb7msb8KK+aygOaygeayguayg+ayhOayheayhuayh+ayiOayieayiuayi+ayjOayjeayjuayj+aykOaykeaykuayk+aylOayleayluayl+aymOaymeaymuaym+aynOayneaynuaynwor5rKg5rKh5rKi5rKj5rKk5rKl5rKm5rKn5rKo5rKp5rKq5rKr5rKs5rKt5rKu5rKv5rKw5rKx5rKy5rKz5rK05rK15rK25rK35rK45rK55rK65rK75rK85rK95rK+5rK/Civms4Dms4Hms4Lms4Pms4Tms4Xms4bms4fms4jms4nms4rms4vms4zms43ms47ms4/ms5Dms5Hms5Lms5Pms5Tms5Xms5bms5fms5jms5nms5rms5vms5zms53ms57ms58KK+azoOazoeazouazo+azpOazpeazpuazp+azqOazqeazquazq+azrOazreazruazr+azsOazseazsuazs+aztOazteaztuazt+azuOazueazuuazu+azvOazveazvuazvwor5rSA5rSB5rSC5rSD5rSE5rSF5rSG5rSH5rSI5rSJ5rSK5rSL5rSM5rSN5rSO5rSP5rSQ5rSR5rSS5rST5rSU5rSV5rSW5rSX5rSY5rSZ5rSa5rSb5rSc5rSd5rSe5rSfCivmtKDmtKHmtKLmtKPmtKTmtKXmtKbmtKfmtKjmtKnmtKrmtKvmtKzmtK3mtK7mtK/mtLDmtLHmtLLmtLPmtLTmtLXmtLbmtLfmtLjmtLnmtLrmtLvmtLzmtL3mtL7mtL8KK+a1gOa1gea1gua1g+a1hOa1hea1hua1h+a1iOa1iea1iua1i+a1jOa1jea1jua1j+a1kOa1kea1kua1k+a1lOa1lea1lua1l+a1mOa1mea1mua1m+a1nOa1nea1nua1nwor5rWg5rWh5rWi5rWj5rWk5rWl5rWm5rWn5rWo5rWp5rWq5rWr5rWs5rWt5rWu5rWv5rWw5rWx5rWy5rWz5rW05rW15rW25rW35rW45rW55rW65rW75rW85rW95rW+5rW/CivmtoDmtoHmtoLmtoPmtoTmtoXmtobmtofmtojmtonmtormtovmtozmto3mto7mto/mtpDmtpHmtpLmtpPmtpTmtpXmtpbmtpfmtpjmtpnmtprmtpvmtpzmtp3mtp7mtp8KK+a2oOa2oea2oua2o+a2pOa2pea2pua2p+a2qOa2qea2qua2q+a2rOa2rea2rua2r+a2sOa2sea2sua2s+a2tOa2tea2tua2t+a2uOa2uea2uua2u+a2vOa2vea2vua2vwor5reA5reB5reC5reD5reE5reF5reG5reH5reI5reJ5reK5reL5reM5reN5reO5reP5reQ5reR5reS5reT5reU5reV5reW5reX5reY5reZ5rea5reb5rec5red5ree5refCivmt6Dmt6Hmt6Lmt6Pmt6Tmt6Xmt6bmt6fmt6jmt6nmt6rmt6vmt6zmt63mt67mt6/mt7Dmt7Hmt7Lmt7Pmt7Tmt7Xmt7bmt7fmt7jmt7nmt7rmt7vmt7zmt73mt77mt78KK+a4gOa4gea4gua4g+a4hOa4hea4hua4h+a4iOa4iea4iua4i+a4jOa4jea4jua4j+a4kOa4kea4kua4k+a4lOa4lea4lua4l+a4mOa4mea4mua4m+a4nOa4nea4nua4nwor5rig5rih5rii5rij5rik5ril5rim5rin5rio5rip5riq5rir5ris5rit5riu5riv5riw5rix5riy5riz5ri05ri15ri25ri35ri45ri55ri65ri75ri85ri95ri+5ri/CivmuYDmuYHmuYLmuYPmuYTmuYXmuYbmuYfmuYjmuYnmuYrmuYvmuYzmuY3muY7muY/muZDmuZHmuZLmuZPmuZTmuZXmuZbmuZfmuZjmuZnmuZrmuZvmuZzmuZ3muZ7muZ8KK+a5oOa5oea5oua5o+a5pOa5pea5pua5p+a5qOa5qea5qua5q+a5rOa5rea5rua5r+a5sOa5sea5sua5s+a5tOa5tea5tua5t+a5uOa5uea5uua5u+a5vOa5vea5vua5vwor5rqA5rqB5rqC5rqD5rqE5rqF5rqG5rqH5rqI5rqJ5rqK5rqL5rqM5rqN5rqO5rqP5rqQ5rqR5rqS5rqT5rqU5rqV5rqW5rqX5rqY5rqZ5rqa5rqb5rqc5rqd5rqe5rqfCivmuqDmuqHmuqLmuqPmuqTmuqXmuqbmuqfmuqjmuqnmuqrmuqvmuqzmuq3muq7muq/murDmurHmurLmurPmurTmurXmurbmurfmurjmurnmurrmurvmurzmur3mur7mur8KK+a7gOa7gea7gua7g+a7hOa7hea7hua7h+a7iOa7iea7iua7i+a7jOa7jea7jua7j+a7kOa7kea7kua7k+a7lOa7lea7lua7l+a7mOa7mea7mua7m+a7nOa7nea7nua7nwor5rug5ruh5rui5ruj5ruk5rul5rum5run5ruo5rup5ruq5rur5rus5rut5ruu5ruv5ruw5rux5ruy5ruz5ru05ru15ru25ru35ru45ru55ru65ru75ru85ru95ru+5ru/CivmvIDmvIHmvILmvIPmvITmvIXmvIbmvIfmvIjmvInmvIrmvIvmvIzmvI3mvI7mvI/mvJDmvJHmvJLmvJPmvJTmvJXmvJbmvJfmvJjmvJnmvJrmvJvmvJzmvJ3mvJ7mvJ8KK+a8oOa8oea8oua8o+a8pOa8pea8pua8p+a8qOa8qea8qua8q+a8rOa8rea8rua8r+a8sOa8sea8sua8s+a8tOa8tea8tua8t+a8uOa8uea8uua8u+a8vOa8vea8vua8vwor5r2A5r2B5r2C5r2D5r2E5r2F5r2G5r2H5r2I5r2J5r2K5r2L5r2M5r2N5r2O5r2P5r2Q5r2R5r2S5r2T5r2U5r2V5r2W5r2X5r2Y5r2Z5r2a5r2b5r2c5r2d5r2e5r2fCivmvaDmvaHmvaLmvaPmvaTmvaXmvabmvafmvajmvanmvarmvavmvazmva3mva7mva/mvbDmvbHmvbLmvbPmvbTmvbXmvbbmvbfmvbjmvbnmvbrmvbvmvbzmvb3mvb7mvb8KK+a+gOa+gea+gua+g+a+hOa+hea+hua+h+a+iOa+iea+iua+i+a+jOa+jea+jua+j+a+kOa+kea+kua+k+a+lOa+lea+lua+l+a+mOa+mea+mua+m+a+nOa+nea+nua+nwor5r6g5r6h5r6i5r6j5r6k5r6l5r6m5r6n5r6o5r6p5r6q5r6r5r6s5r6t5r6u5r6v5r6w5r6x5r6y5r6z5r605r615r625r635r645r655r665r675r685r695r6+5r6/Civmv4Dmv4Hmv4Lmv4Pmv4Tmv4Xmv4bmv4fmv4jmv4nmv4rmv4vmv4zmv43mv47mv4/mv5Dmv5Hmv5Lmv5Pmv5Tmv5Xmv5bmv5fmv5jmv5nmv5rmv5vmv5zmv53mv57mv58KK+a/oOa/oea/oua/o+a/pOa/pea/pua/p+a/qOa/qea/qua/q+a/rOa/rea/rua/r+a/sOa/sea/sua/s+a/tOa/tea/tua/t+a/uOa/uea/uua/u+a/vOa/vea/vua/vwor54CA54CB54CC54CD54CE54CF54CG54CH54CI54CJ54CK54CL54CM54CN54CO54CP54CQ54CR54CS54CT54CU54CV54CW54CX54CY54CZ54Ca54Cb54Cc54Cd54Ce54CfCivngKDngKHngKLngKPngKTngKXngKbngKfngKjngKnngKrngKvngKzngK3ngK7ngK/ngLDngLHngLLngLPngLTngLXngLbngLfngLjngLnngLrngLvngLzngL3ngL7ngL8KK+eBgOeBgeeBgueBg+eBhOeBheeBhueBh+eBiOeBieeBiueBi+eBjOeBjeeBjueBj+eBkOeBkeeBkueBk+eBlOeBleeBlueBl+eBmOeBmeeBmueBm+eBnOeBneeBnueBnwor54Gg54Gh54Gi54Gj54Gk54Gl54Gm54Gn54Go54Gp54Gq54Gr54Gs54Gt54Gu54Gv54Gw54Gx54Gy54Gz54G054G154G254G354G454G554G654G754G854G954G+54G/CivngoDngoHngoLngoPngoTngoXngobngofngojngonngorngovngozngo3ngo7ngo/ngpDngpHngpLngpPngpTngpXngpbngpfngpjngpnngprngpvngpzngp3ngp7ngp8KK+eCoOeCoeeCoueCo+eCpOeCpeeCpueCp+eCqOeCqeeCqueCq+eCrOeCreeCrueCr+eCsOeCseeCsueCs+eCtOeCteeCtueCt+eCuOeCueeCuueCu+eCvOeCveeCvueCvwor54OA54OB54OC54OD54OE54OF54OG54OH54OI54OJ54OK54OL54OM54ON54OO54OP54OQ54OR54OS54OT54OU54OV54OW54OX54OY54OZ54Oa54Ob54Oc54Od54Oe54OfCivng6Dng6Hng6Lng6Png6Tng6Xng6bng6fng6jng6nng6rng6vng6zng63ng67ng6/ng7Dng7Hng7Lng7Png7Tng7Xng7bng7fng7jng7nng7rng7vng7zng73ng77ng78KK+eEgOeEgeeEgueEg+eEhOeEheeEhueEh+eEiOeEieeEiueEi+eEjOeEjeeEjueEj+eEkOeEkeeEkueEk+eElOeEleeElueEl+eEmOeEmeeEmueEm+eEnOeEneeEnueEnwor54Sg54Sh54Si54Sj54Sk54Sl54Sm54Sn54So54Sp54Sq54Sr54Ss54St54Su54Sv54Sw54Sx54Sy54Sz54S054S154S254S354S454S554S654S754S854S954S+54S/CivnhYDnhYHnhYLnhYPnhYTnhYXnhYbnhYfnhYjnhYnnhYrnhYvnhYznhY3nhY7nhY/nhZDnhZHnhZLnhZPnhZTnhZXnhZbnhZfnhZjnhZnnhZrnhZvnhZznhZ3nhZ7nhZ8KK+eFoOeFoeeFoueFo+eFpOeFpeeFpueFp+eFqOeFqeeFqueFq+eFrOeFreeFrueFr+eFsOeFseeFsueFs+eFtOeFteeFtueFt+eFuOeFueeFuueFu+eFvOeFveeFvueFvwor54aA54aB54aC54aD54aE54aF54aG54aH54aI54aJ54aK54aL54aM54aN54aO54aP54aQ54aR54aS54aT54aU54aV54aW54aX54aY54aZ54aa54ab54ac54ad54ae54afCivnhqDnhqHnhqLnhqPnhqTnhqXnhqbnhqfnhqjnhqnnhqrnhqvnhqznhq3nhq7nhq/nhrDnhrHnhrLnhrPnhrTnhrXnhrbnhrfnhrjnhrnnhrrnhrvnhrznhr3nhr7nhr8KK+eHgOeHgeeHgueHg+eHhOeHheeHhueHh+eHiOeHieeHiueHi+eHjOeHjeeHjueHj+eHkOeHkeeHkueHk+eHlOeHleeHlueHl+eHmOeHmeeHmueHm+eHnOeHneeHnueHnwor54eg54eh54ei54ej54ek54el54em54en54eo54ep54eq54er54es54et54eu54ev54ew54ex54ey54ez54e054e154e254e354e454e554e654e754e854e954e+54e/CivniIDniIHniILniIPniITniIXniIbniIfniIjniInniIrniIvniIzniI3niI7niI/niJDniJHniJLniJPniJTniJXniJbniJfniJjniJnniJrniJvniJzniJ3niJ7niJ8KK+eIoOeIoeeIoueIo+eIpOeIpeeIpueIp+eIqOeIqeeIqueIq+eIrOeIreeIrueIr+eIsOeIseeIsueIs+eItOeIteeItueIt+eIuOeIueeIuueIu+eIvOeIveeIvueIvwor54mA54mB54mC54mD54mE54mF54mG54mH54mI54mJ54mK54mL54mM54mN54mO54mP54mQ54mR54mS54mT54mU54mV54mW54mX54mY54mZ54ma54mb54mc54md54me54mfCivniaDniaHniaLniaPniaTniaXniabniafniajnianniarniavniaznia3nia7nia/nibDnibHnibLnibPnibTnibXnibbnibfnibjnibnnibrnibvnibznib3nib7nib8KK+eKgOeKgeeKgueKg+eKhOeKheeKhueKh+eKiOeKieeKiueKi+eKjOeKjeeKjueKj+eKkOeKkeeKkueKk+eKlOeKleeKlueKl+eKmOeKmeeKmueKm+eKnOeKneeKnueKnwor54qg54qh54qi54qj54qk54ql54qm54qn54qo54qp54qq54qr54qs54qt54qu54qv54qw54qx54qy54qz54q054q154q254q354q454q554q654q754q854q954q+54q/Civni4Dni4Hni4Lni4Pni4Tni4Xni4bni4fni4jni4nni4rni4vni4zni43ni47ni4/ni5Dni5Hni5Lni5Pni5Tni5Xni5bni5fni5jni5nni5rni5vni5zni53ni57ni58KK+eLoOeLoeeLoueLo+eLpOeLpeeLpueLp+eLqOeLqeeLqueLq+eLrOeLreeLrueLr+eLsOeLseeLsueLs+eLtOeLteeLtueLt+eLuOeLueeLuueLu+eLvOeLveeLvueLvwor54yA54yB54yC54yD54yE54yF54yG54yH54yI54yJ54yK54yL54yM54yN54yO54yP54yQ54yR54yS54yT54yU54yV54yW54yX54yY54yZ54ya54yb54yc54yd54ye54yfCivnjKDnjKHnjKLnjKPnjKTnjKXnjKbnjKfnjKjnjKnnjKrnjKvnjKznjK3njK7njK/njLDnjLHnjLLnjLPnjLTnjLXnjLbnjLfnjLjnjLnnjLrnjLvnjLznjL3njL7njL8KK+eNgOeNgeeNgueNg+eNhOeNheeNhueNh+eNiOeNieeNiueNi+eNjOeNjeeNjueNj+eNkOeNkeeNkueNk+eNlOeNleeNlueNl+eNmOeNmeeNmueNm+eNnOeNneeNnueNnwor542g542h542i542j542k542l542m542n542o542p542q542r542s542t542u542v542w542x542y542z5420542154225423542454255426542754285429542+542/CivnjoDnjoHnjoLnjoPnjoTnjoXnjobnjofnjojnjonnjornjovnjoznjo3njo7njo/njpDnjpHnjpLnjpPnjpTnjpXnjpbnjpfnjpjnjpnnjprnjpvnjpznjp3njp7njp8KK+eOoOeOoeeOoueOo+eOpOeOpeeOpueOp+eOqOeOqeeOqueOq+eOrOeOreeOrueOr+eOsOeOseeOsueOs+eOtOeOteeOtueOt+eOuOeOueeOuueOu+eOvOeOveeOvueOvwor54+A54+B54+C54+D54+E54+F54+G54+H54+I54+J54+K54+L54+M54+N54+O54+P54+Q54+R54+S54+T54+U54+V54+W54+X54+Y54+Z54+a54+b54+c54+d54+e54+fCivnj6Dnj6Hnj6Lnj6Pnj6Tnj6Xnj6bnj6fnj6jnj6nnj6rnj6vnj6znj63nj67nj6/nj7Dnj7Hnj7Lnj7Pnj7Tnj7Xnj7bnj7fnj7jnj7nnj7rnj7vnj7znj73nj77nj78KK+eQgOeQgeeQgueQg+eQhOeQheeQhueQh+eQiOeQieeQiueQi+eQjOeQjeeQjueQj+eQkOeQkeeQkueQk+eQlOeQleeQlueQl+eQmOeQmeeQmueQm+eQnOeQneeQnueQnwor55Cg55Ch55Ci55Cj55Ck55Cl55Cm55Cn55Co55Cp55Cq55Cr55Cs55Ct55Cu55Cv55Cw55Cx55Cy55Cz55C055C155C255C355C455C555C655C755C855C955C+55C/CivnkYDnkYHnkYLnkYPnkYTnkYXnkYbnkYfnkYjnkYnnkYrnkYvnkYznkY3nkY7nkY/nkZDnkZHnkZLnkZPnkZTnkZXnkZbnkZfnkZjnkZnnkZrnkZvnkZznkZ3nkZ7nkZ8KK+eRoOeRoeeRoueRo+eRpOeRpeeRpueRp+eRqOeRqeeRqueRq+eRrOeRreeRrueRr+eRsOeRseeRsueRs+eRtOeRteeRtueRt+eRuOeRueeRuueRu+eRvOeRveeRvueRvwor55KA55KB55KC55KD55KE55KF55KG55KH55KI55KJ55KK55KL55KM55KN55KO55KP55KQ55KR55KS55KT55KU55KV55KW55KX55KY55KZ55Ka55Kb55Kc55Kd55Ke55KfCivnkqDnkqHnkqLnkqPnkqTnkqXnkqbnkqfnkqjnkqnnkqrnkqvnkqznkq3nkq7nkq/nkrDnkrHnkrLnkrPnkrTnkrXnkrbnkrfnkrjnkrnnkrrnkrvnkrznkr3nkr7nkr8KK+eTgOeTgeeTgueTg+eThOeTheeThueTh+eTiOeTieeTiueTi+eTjOeTjeeTjueTj+eTkOeTkeeTkueTk+eTlOeTleeTlueTl+eTmOeTmeeTmueTm+eTnOeTneeTnueTnwor55Og55Oh55Oi55Oj55Ok55Ol55Om55On55Oo55Op55Oq55Or55Os55Ot55Ou55Ov55Ow55Ox55Oy55Oz55O055O155O255O355O455O555O655O755O855O955O+55O/CivnlIDnlIHnlILnlIPnlITnlIXnlIbnlIfnlIjnlInnlIrnlIvnlIznlI3nlI7nlI/nlJDnlJHnlJLnlJPnlJTnlJXnlJbnlJfnlJjnlJnnlJrnlJvnlJznlJ3nlJ7nlJ8KK+eUoOeUoeeUoueUo+eUpOeUpeeUpueUp+eUqOeUqeeUqueUq+eUrOeUreeUrueUr+eUsOeUseeUsueUs+eUtOeUteeUtueUt+eUuOeUueeUuueUu+eUvOeUveeUvueUvwor55WA55WB55WC55WD55WE55WF55WG55WH55WI55WJ55WK55WL55WM55WN55WO55WP55WQ55WR55WS55WT55WU55WV55WW55WX55WY55WZ55Wa55Wb55Wc55Wd55We55WfCivnlaDnlaHnlaLnlaPnlaTnlaXnlabnlafnlajnlannlarnlavnlaznla3nla7nla/nlbDnlbHnlbLnlbPnlbTnlbXnlbbnlbfnlbjnlbnnlbrnlbvnlbznlb3nlb7nlb8KK+eWgOeWgeeWgueWg+eWhOeWheeWhueWh+eWiOeWieeWiueWi+eWjOeWjeeWjueWj+eWkOeWkeeWkueWk+eWlOeWleeWlueWl+eWmOeWmeeWmueWm+eWnOeWneeWnueWnwor55ag55ah55ai55aj55ak55al55am55an55ao55ap55aq55ar55as55at55au55av55aw55ax55ay55az55a055a155a255a355a455a555a655a755a855a955a+55a/Civnl4Dnl4Hnl4Lnl4Pnl4Tnl4Xnl4bnl4fnl4jnl4nnl4rnl4vnl4znl43nl47nl4/nl5Dnl5Hnl5Lnl5Pnl5Tnl5Xnl5bnl5fnl5jnl5nnl5rnl5vnl5znl53nl57nl58KK+eXoOeXoeeXoueXo+eXpOeXpeeXpueXp+eXqOeXqeeXqueXq+eXrOeXreeXrueXr+eXsOeXseeXsueXs+eXtOeXteeXtueXt+eXuOeXueeXuueXu+eXvOeXveeXvueXvwor55iA55iB55iC55iD55iE55iF55iG55iH55iI55iJ55iK55iL55iM55iN55iO55iP55iQ55iR55iS55iT55iU55iV55iW55iX55iY55iZ55ia55ib55ic55id55ie55ifCivnmKDnmKHnmKLnmKPnmKTnmKXnmKbnmKfnmKjnmKnnmKrnmKvnmKznmK3nmK7nmK/nmLDnmLHnmLLnmLPnmLTnmLXnmLbnmLfnmLjnmLnnmLrnmLvnmLznmL3nmL7nmL8KK+eZgOeZgeeZgueZg+eZhOeZheeZhueZh+eZiOeZieeZiueZi+eZjOeZjeeZjueZj+eZkOeZkeeZkueZk+eZlOeZleeZlueZl+eZmOeZmeeZmueZm+eZnOeZneeZnueZnwor55mg55mh55mi55mj55mk55ml55mm55mn55mo55mp55mq55mr55ms55mt55mu55mv55mw55mx55my55mz55m055m155m255m355m455m555m655m755m855m955m+55m/CivnmoDnmoHnmoLnmoPnmoTnmoXnmobnmofnmojnmonnmornmovnmoznmo3nmo7nmo/nmpDnmpHnmpLnmpPnmpTnmpXnmpbnmpfnmpjnmpnnmprnmpvnmpznmp3nmp7nmp8KK+eaoOeaoeeaoueao+eapOeapeeapueap+eaqOeaqeeaqueaq+earOeareearuear+easOeaseeasueas+eatOeateeatueat+eauOeaueeauueau+eavOeaveeavueavwor55uA55uB55uC55uD55uE55uF55uG55uH55uI55uJ55uK55uL55uM55uN55uO55uP55uQ55uR55uS55uT55uU55uV55uW55uX55uY55uZ55ua55ub55uc55ud55ue55ufCivnm6Dnm6Hnm6Lnm6Pnm6Tnm6Xnm6bnm6fnm6jnm6nnm6rnm6vnm6znm63nm67nm6/nm7Dnm7Hnm7Lnm7Pnm7Tnm7Xnm7bnm7fnm7jnm7nnm7rnm7vnm7znm73nm77nm78KK+ecgOecgeecguecg+echOecheechuech+eciOecieeciueci+ecjOecjeecjuecj+eckOeckeeckueck+eclOecleecluecl+ecmOecmeecmuecm+ecnOecneecnuecnwor55yg55yh55yi55yj55yk55yl55ym55yn55yo55yp55yq55yr55ys55yt55yu55yv55yw55yx55yy55yz55y055y155y255y355y455y555y655y755y855y955y+55y/CivnnYDnnYHnnYLnnYPnnYTnnYXnnYbnnYfnnYjnnYnnnYrnnYvnnYznnY3nnY7nnY/nnZDnnZHnnZLnnZPnnZTnnZXnnZbnnZfnnZjnnZnnnZrnnZvnnZznnZ3nnZ7nnZ8KK+edoOedoeedouedo+edpOedpeedpuedp+edqOedqeedquedq+edrOedreedruedr+edsOedseedsueds+edtOedteedtuedt+eduOedueeduuedu+edvOedveedvuedvwor556A556B556C556D556E556F556G556H556I556J556K556L556M556N556O556P556Q556R556S556T556U556V556W556X556Y556Z556a556b556c556d556e556fCivnnqDnnqHnnqLnnqPnnqTnnqXnnqbnnqfnnqjnnqnnnqrnnqvnnqznnq3nnq7nnq/nnrDnnrHnnrLnnrPnnrTnnrXnnrbnnrfnnrjnnrnnnrrnnrvnnrznnr3nnr7nnr8KK+efgOefgeefguefg+efhOefheefhuefh+efiOefieefiuefi+efjOefjeefjuefj+efkOefkeefkuefk+eflOefleefluefl+efmOefmeefmuefm+efnOefneefnuefnwor55+g55+h55+i55+j55+k55+l55+m55+n55+o55+p55+q55+r55+s55+t55+u55+v55+w55+x55+y55+z55+055+155+255+355+455+555+655+755+855+955++55+/CivnoIDnoIHnoILnoIPnoITnoIXnoIbnoIfnoIjnoInnoIrnoIvnoIznoI3noI7noI/noJDnoJHnoJLnoJPnoJTnoJXnoJbnoJfnoJjnoJnnoJrnoJvnoJznoJ3noJ7noJ8KK+egoOegoeegouego+egpOegpeegpuegp+egqOegqeegquegq+egrOegreegruegr+egsOegseegsuegs+egtOegteegtuegt+eguOegueeguuegu+egvOegveegvuegvwor56GA56GB56GC56GD56GE56GF56GG56GH56GI56GJ56GK56GL56GM56GN56GO56GP56GQ56GR56GS56GT56GU56GV56GW56GX56GY56GZ56Ga56Gb56Gc56Gd56Ge56GfCivnoaDnoaHnoaLnoaPnoaTnoaXnoabnoafnoajnoannoarnoavnoaznoa3noa7noa/nobDnobHnobLnobPnobTnobXnobbnobfnobjnobnnobrnobvnobznob3nob7nob8KK+eigOeigeeigueig+eihOeiheeihueih+eiiOeiieeiiueii+eijOeijeeijueij+eikOeikeeikueik+eilOeileeilueil+eimOeimeeimueim+einOeineeinueinwor56Kg56Kh56Ki56Kj56Kk56Kl56Km56Kn56Ko56Kp56Kq56Kr56Ks56Kt56Ku56Kv56Kw56Kx56Ky56Kz56K056K156K256K356K456K556K656K756K856K956K+56K/Civno4Dno4Hno4Lno4Pno4Tno4Xno4bno4fno4jno4nno4rno4vno4zno43no47no4/no5Dno5Hno5Lno5Pno5Tno5Xno5bno5fno5jno5nno5rno5vno5zno53no57no58KK+ejoOejoeejouejo+ejpOejpeejpuejp+ejqOejqeejquejq+ejrOejreejruejr+ejsOejseejsuejs+ejtOejteejtuejt+ejuOejueejuueju+ejvOejveejvuejvwor56SA56SB56SC56SD56SE56SF56SG56SH56SI56SJ56SK56SL56SM56SN56SO56SP56SQ56SR56SS56ST56SU56SV56SW56SX56SY56SZ56Sa56Sb56Sc56Sd56Se56SfCivnpKDnpKHnpKLnpKPnpKTnpKXnpKbnpKfnpKjnpKnnpKrnpKvnpKznpK3npK7npK/npLDnpLHnpLLnpLPnpLTnpLXnpLbnpLfnpLjnpLnnpLrnpLvnpLznpL3npL7npL8KK+elgOelgeelguelg+elhOelheelhuelh+eliOelieeliueli+eljOeljeeljuelj+elkOelkeelkuelk+ellOelleelluell+elmOelmeelmuelm+elnOelneelnuelnwor56Wg56Wh56Wi56Wj56Wk56Wl56Wm56Wn56Wo56Wp56Wq56Wr56Ws56Wt56Wu56Wv56Ww56Wx56Wy56Wz56W056W156W256W356W456W556W656W756W856W956W+56W/CivnpoDnpoHnpoLnpoPnpoTnpoXnpobnpofnpojnponnpornpovnpoznpo3npo7npo/nppDnppHnppLnppPnppTnppXnppbnppfnppjnppnnpprnppvnppznpp3npp7npp8KK+emoOemoeemouemo+empOempeempuemp+emqOemqeemquemq+emrOemreemruemr+emsOemseemsuems+emtOemteemtuemt+emuOemueemuuemu+emvOemveemvuemvwor56eA56eB56eC56eD56eE56eF56eG56eH56eI56eJ56eK56eL56eM56eN56eO56eP56eQ56eR56eS56eT56eU56eV56eW56eX56eY56eZ56ea56eb56ec56ed56ee56efCivnp6Dnp6Hnp6Lnp6Pnp6Tnp6Xnp6bnp6fnp6jnp6nnp6rnp6vnp6znp63np67np6/np7Dnp7Hnp7Lnp7Pnp7Tnp7Xnp7bnp7fnp7jnp7nnp7rnp7vnp7znp73np77np78KK+eogOeogeeogueog+eohOeoheeohueoh+eoiOeoieeoiueoi+eojOeojeeojueoj+eokOeokeeokueok+eolOeoleeolueol+eomOeomeeomueom+eonOeoneeonueonwor56ig56ih56ii56ij56ik56il56im56in56io56ip56iq56ir56is56it56iu56iv56iw56ix56iy56iz56i056i156i256i356i456i556i656i756i856i956i+56i/CivnqYDnqYHnqYLnqYPnqYTnqYXnqYbnqYfnqYjnqYnnqYrnqYvnqYznqY3nqY7nqY/nqZDnqZHnqZLnqZPnqZTnqZXnqZbnqZfnqZjnqZnnqZrnqZvnqZznqZ3nqZ7nqZ8KK+epoOepoeepouepo+eppOeppeeppuepp+epqOepqeepquepq+eprOepreepruepr+epsOepseepsueps+eptOepteeptuept+epuOepueepuuepu+epvOepveepvuepvwor56qA56qB56qC56qD56qE56qF56qG56qH56qI56qJ56qK56qL56qM56qN56qO56qP56qQ56qR56qS56qT56qU56qV56qW56qX56qY56qZ56qa56qb56qc56qd56qe56qfCivnqqDnqqHnqqLnqqPnqqTnqqXnqqbnqqfnqqjnqqnnqqrnqqvnqqznqq3nqq7nqq/nqrDnqrHnqrLnqrPnqrTnqrXnqrbnqrfnqrjnqrnnqrrnqrvnqrznqr3nqr7nqr8KK+ergOergeerguerg+erhOerheerhuerh+eriOerieeriueri+erjOerjeerjuerj+erkOerkeerkuerk+erlOerleerluerl+ermOermeermuerm+ernOerneernuernwor56ug56uh56ui56uj56uk56ul56um56un56uo56up56uq56ur56us56ut56uu56uv56uw56ux56uy56uz56u056u156u256u356u456u556u656u756u856u956u+56u/CivnrIDnrIHnrILnrIPnrITnrIXnrIbnrIfnrIjnrInnrIrnrIvnrIznrI3nrI7nrI/nrJDnrJHnrJLnrJPnrJTnrJXnrJbnrJfnrJjnrJnnrJrnrJvnrJznrJ3nrJ7nrJ8KK+esoOesoeesoueso+espOespeespuesp+esqOesqeesquesq+esrOesreesruesr+essOesseessuess+estOesteestuest+esuOesueesuuesu+esvOesveesvuesvwor562A562B562C562D562E562F562G562H562I562J562K562L562M562N562O562P562Q562R562S562T562U562V562W562X562Y562Z562a562b562c562d562e562fCivnraDnraHnraLnraPnraTnraXnrabnrafnrajnrannrarnravnraznra3nra7nra/nrbDnrbHnrbLnrbPnrbTnrbXnrbbnrbfnrbjnrbnnrbrnrbvnrbznrb3nrb7nrb8KK+eugOeugeeugueug+euhOeuheeuhueuh+euiOeuieeuiueui+eujOeujeeujueuj+eukOeukeeukueuk+eulOeuleeulueul+eumOeumeeumueum+eunOeuneeunueunwor566g566h566i566j566k566l566m566n566o566p566q566r566s566t566u566v566w566x566y566z5660566156625663566456655666566756685669566+566/Civnr4Dnr4Hnr4Lnr4Pnr4Tnr4Xnr4bnr4fnr4jnr4nnr4rnr4vnr4znr43nr47nr4/nr5Dnr5Hnr5Lnr5Pnr5Tnr5Xnr5bnr5fnr5jnr5nnr5rnr5vnr5znr53nr57nr58KK+evoOevoeevouevo+evpOevpeevpuevp+evqOevqeevquevq+evrOevreevruevr+evsOevseevsuevs+evtOevteevtuevt+evuOevueevuuevu+evvOevveevvuevvwor57CA57CB57CC57CD57CE57CF57CG57CH57CI57CJ57CK57CL57CM57CN57CO57CP57CQ57CR57CS57CT57CU57CV57CW57CX57CY57CZ57Ca57Cb57Cc57Cd57Ce57CfCivnsKDnsKHnsKLnsKPnsKTnsKXnsKbnsKfnsKjnsKnnsKrnsKvnsKznsK3nsK7nsK/nsLDnsLHnsLLnsLPnsLTnsLXnsLbnsLfnsLjnsLnnsLrnsLvnsLznsL3nsL7nsL8KK+exgOexgeexguexg+exhOexheexhuexh+exiOexieexiuexi+exjOexjeexjuexj+exkOexkeexkuexk+exlOexleexluexl+exmOexmeexmuexm+exnOexneexnuexnwor57Gg57Gh57Gi57Gj57Gk57Gl57Gm57Gn57Go57Gp57Gq57Gr57Gs57Gt57Gu57Gv57Gw57Gx57Gy57Gz57G057G157G257G357G457G557G657G757G857G957G+57G/CivnsoDnsoHnsoLnsoPnsoTnsoXnsobnsofnsojnsonnsornsovnsoznso3nso7nso/nspDnspHnspLnspPnspTnspXnspbnspfnspjnspnnsprnspvnspznsp3nsp7nsp8KK+eyoOeyoeeyoueyo+eypOeypeeypueyp+eyqOeyqeeyqueyq+eyrOeyreeyrueyr+eysOeyseeysueys+eytOeyteeytueyt+eyuOeyueeyuueyu+eyvOeyveeyvueyvwor57OA57OB57OC57OD57OE57OF57OG57OH57OI57OJ57OK57OL57OM57ON57OO57OP57OQ57OR57OS57OT57OU57OV57OW57OX57OY57OZ57Oa57Ob57Oc57Od57Oe57OfCivns6Dns6Hns6Lns6Pns6Tns6Xns6bns6fns6jns6nns6rns6vns6zns63ns67ns6/ns7Dns7Hns7Lns7Pns7Tns7Xns7bns7fns7jns7nns7rns7vns7zns73ns77ns78KK+e0gOe0gee0gue0g+e0hOe0hee0hue0h+e0iOe0iee0iue0i+e0jOe0jee0jue0j+e0kOe0kee0kue0k+e0lOe0lee0lue0l+e0mOe0mee0mue0m+e0nOe0nee0nue0nwor57Sg57Sh57Si57Sj57Sk57Sl57Sm57Sn57So57Sp57Sq57Sr57Ss57St57Su57Sv57Sw57Sx57Sy57Sz57S057S157S257S357S457S557S657S757S857S957S+57S/CivntYDntYHntYLntYPntYTntYXntYbntYfntYjntYnntYrntYvntYzntY3ntY7ntY/ntZDntZHntZLntZPntZTntZXntZbntZfntZjntZnntZrntZvntZzntZ3ntZ7ntZ8KK+e1oOe1oee1oue1o+e1pOe1pee1pue1p+e1qOe1qee1que1q+e1rOe1ree1rue1r+e1sOe1see1sue1s+e1tOe1tee1tue1t+e1uOe1uee1uue1u+e1vOe1vee1vue1vwor57aA57aB57aC57aD57aE57aF57aG57aH57aI57aJ57aK57aL57aM57aN57aO57aP57aQ57aR57aS57aT57aU57aV57aW57aX57aY57aZ57aa57ab57ac57ad57ae57afCivntqDntqHntqLntqPntqTntqXntqbntqfntqjntqnntqrntqvntqzntq3ntq7ntq/ntrDntrHntrLntrPntrTntrXntrbntrfntrjntrnntrrntrvntrzntr3ntr7ntr8KK+e3gOe3gee3gue3g+e3hOe3hee3hue3h+e3iOe3iee3iue3i+e3jOe3jee3jue3j+e3kOe3kee3kue3k+e3lOe3lee3lue3l+e3mOe3mee3mue3m+e3nOe3nee3nue3nwor57eg57eh57ei57ej57ek57el57em57en57eo57ep57eq57er57es57et57eu57ev57ew57ex57ey57ez57e057e157e257e357e457e557e657e757e857e957e+57e/CivnuIDnuIHnuILnuIPnuITnuIXnuIbnuIfnuIjnuInnuIrnuIvnuIznuI3nuI7nuI/nuJDnuJHnuJLnuJPnuJTnuJXnuJbnuJfnuJjnuJnnuJrnuJvnuJznuJ3nuJ7nuJ8KK+e4oOe4oee4oue4o+e4pOe4pee4pue4p+e4qOe4qee4que4q+e4rOe4ree4rue4r+e4sOe4see4sue4s+e4tOe4tee4tue4t+e4uOe4uee4uue4u+e4vOe4vee4vue4vwor57mA57mB57mC57mD57mE57mF57mG57mH57mI57mJ57mK57mL57mM57mN57mO57mP57mQ57mR57mS57mT57mU57mV57mW57mX57mY57mZ57ma57mb57mc57md57me57mfCivnuaDnuaHnuaLnuaPnuaTnuaXnuabnuafnuajnuannuarnuavnuaznua3nua7nua/nubDnubHnubLnubPnubTnubXnubbnubfnubjnubnnubrnubvnubznub3nub7nub8KK+e6gOe6gee6gue6g+e6hOe6hee6hue6h+e6iOe6iee6iue6i+e6jOe6jee6jue6j+e6kOe6kee6kue6k+e6lOe6lee6lue6l+e6mOe6mee6mue6m+e6nOe6nee6nue6nwor57qg57qh57qi57qj57qk57ql57qm57qn57qo57qp57qq57qr57qs57qt57qu57qv57qw57qx57qy57qz57q057q157q257q357q457q557q657q757q857q957q+57q/Civnu4Dnu4Hnu4Lnu4Pnu4Tnu4Xnu4bnu4fnu4jnu4nnu4rnu4vnu4znu43nu47nu4/nu5Dnu5Hnu5Lnu5Pnu5Tnu5Xnu5bnu5fnu5jnu5nnu5rnu5vnu5znu53nu57nu58KK+e7oOe7oee7oue7o+e7pOe7pee7pue7p+e7qOe7qee7que7q+e7rOe7ree7rue7r+e7sOe7see7sue7s+e7tOe7tee7tue7t+e7uOe7uee7uue7u+e7vOe7vee7vue7vwor57yA57yB57yC57yD57yE57yF57yG57yH57yI57yJ57yK57yL57yM57yN57yO57yP57yQ57yR57yS57yT57yU57yV57yW57yX57yY57yZ57ya57yb57yc57yd57ye57yfCivnvKDnvKHnvKLnvKPnvKTnvKXnvKbnvKfnvKjnvKnnvKrnvKvnvKznvK3nvK7nvK/nvLDnvLHnvLLnvLPnvLTnvLXnvLbnvLfnvLjnvLnnvLrnvLvnvLznvL3nvL7nvL8KK+e9gOe9gee9gue9g+e9hOe9hee9hue9h+e9iOe9iee9iue9i+e9jOe9jee9jue9j+e9kOe9kee9kue9k+e9lOe9lee9lue9l+e9mOe9mee9mue9m+e9nOe9nee9nue9nwor572g572h572i572j572k572l572m572n572o572p572q572r572s572t572u572v572w572x572y572z5720572157225723572457255726572757285729572+572/CivnvoDnvoHnvoLnvoPnvoTnvoXnvobnvofnvojnvonnvornvovnvoznvo3nvo7nvo/nvpDnvpHnvpLnvpPnvpTnvpXnvpbnvpfnvpjnvpnnvprnvpvnvpznvp3nvp7nvp8KK+e+oOe+oee+oue+o+e+pOe+pee+pue+p+e+qOe+qee+que+q+e+rOe+ree+rue+r+e+sOe+see+sue+s+e+tOe+tee+tue+t+e+uOe+uee+uue+u+e+vOe+vee+vue+vwor57+A57+B57+C57+D57+E57+F57+G57+H57+I57+J57+K57+L57+M57+N57+O57+P57+Q57+R57+S57+T57+U57+V57+W57+X57+Y57+Z57+a57+b57+c57+d57+e57+fCivnv6Dnv6Hnv6Lnv6Pnv6Tnv6Xnv6bnv6fnv6jnv6nnv6rnv6vnv6znv63nv67nv6/nv7Dnv7Hnv7Lnv7Pnv7Tnv7Xnv7bnv7fnv7jnv7nnv7rnv7vnv7znv73nv77nv78KK+iAgOiAgeiAguiAg+iAhOiAheiAhuiAh+iAiOiAieiAiuiAi+iAjOiAjeiAjuiAj+iAkOiAkeiAkuiAk+iAlOiAleiAluiAl+iAmOiAmeiAmuiAm+iAnOiAneiAnuiAnwor6ICg6ICh6ICi6ICj6ICk6ICl6ICm6ICn6ICo6ICp6ICq6ICr6ICs6ICt6ICu6ICv6ICw6ICx6ICy6ICz6IC06IC16IC26IC36IC46IC56IC66IC76IC86IC96IC+6IC/CivogYDogYHogYLogYPogYTogYXogYbogYfogYjogYnogYrogYvogYzogY3ogY7ogY/ogZDogZHogZLogZPogZTogZXogZbogZfogZjogZnogZrogZvogZzogZ3ogZ7ogZ8KK+iBoOiBoeiBouiBo+iBpOiBpeiBpuiBp+iBqOiBqeiBquiBq+iBrOiBreiBruiBr+iBsOiBseiBsuiBs+iBtOiBteiBtuiBt+iBuOiBueiBuuiBu+iBvOiBveiBvuiBvwor6IKA6IKB6IKC6IKD6IKE6IKF6IKG6IKH6IKI6IKJ6IKK6IKL6IKM6IKN6IKO6IKP6IKQ6IKR6IKS6IKT6IKU6IKV6IKW6IKX6IKY6IKZ6IKa6IKb6IKc6IKd6IKe6IKfCivogqDogqHogqLogqPogqTogqXogqbogqfogqjogqnogqrogqvogqzogq3ogq7ogq/ogrDogrHogrLogrPogrTogrXogrbogrfogrjogrnogrrogrvogrzogr3ogr7ogr8KK+iDgOiDgeiDguiDg+iDhOiDheiDhuiDh+iDiOiDieiDiuiDi+iDjOiDjeiDjuiDj+iDkOiDkeiDkuiDk+iDlOiDleiDluiDl+iDmOiDmeiDmuiDm+iDnOiDneiDnuiDnwor6IOg6IOh6IOi6IOj6IOk6IOl6IOm6IOn6IOo6IOp6IOq6IOr6IOs6IOt6IOu6IOv6IOw6IOx6IOy6IOz6IO06IO16IO26IO36IO46IO56IO66IO76IO86IO96IO+6IO/CivohIDohIHohILohIPohITohIXohIbohIfohIjohInohIrohIvohIzohI3ohI7ohI/ohJDohJHohJLohJPohJTohJXohJbohJfohJjohJnohJrohJvohJzohJ3ohJ7ohJ8KK+iEoOiEoeiEouiEo+iEpOiEpeiEpuiEp+iEqOiEqeiEquiEq+iErOiEreiEruiEr+iEsOiEseiEsuiEs+iEtOiEteiEtuiEt+iEuOiEueiEuuiEu+iEvOiEveiEvuiEvwor6IWA6IWB6IWC6IWD6IWE6IWF6IWG6IWH6IWI6IWJ6IWK6IWL6IWM6IWN6IWO6IWP6IWQ6IWR6IWS6IWT6IWU6IWV6IWW6IWX6IWY6IWZ6IWa6IWb6IWc6IWd6IWe6IWfCivohaDohaHohaLohaPohaTohaXohabohafohajohanoharohavohazoha3oha7oha/ohbDohbHohbLohbPohbTohbXohbbohbfohbjohbnohbrohbvohbzohb3ohb7ohb8KK+iGgOiGgeiGguiGg+iGhOiGheiGhuiGh+iGiOiGieiGiuiGi+iGjOiGjeiGjuiGj+iGkOiGkeiGkuiGk+iGlOiGleiGluiGl+iGmOiGmeiGmuiGm+iGnOiGneiGnuiGnwor6Iag6Iah6Iai6Iaj6Iak6Ial6Iam6Ian6Iao6Iap6Iaq6Iar6Ias6Iat6Iau6Iav6Iaw6Iax6Iay6Iaz6Ia06Ia16Ia26Ia36Ia46Ia56Ia66Ia76Ia86Ia96Ia+6Ia/Civoh4Doh4Hoh4Loh4Poh4Toh4Xoh4boh4foh4joh4noh4roh4voh4zoh43oh47oh4/oh5Doh5Hoh5Loh5Poh5Toh5Xoh5boh5foh5joh5noh5roh5voh5zoh53oh57oh58KK+iHoOiHoeiHouiHo+iHpOiHpeiHpuiHp+iHqOiHqeiHquiHq+iHrOiHreiHruiHr+iHsOiHseiHsuiHs+iHtOiHteiHtuiHt+iHuOiHueiHuuiHu+iHvOiHveiHvuiHvwor6IiA6IiB6IiC6IiD6IiE6IiF6IiG6IiH6IiI6IiJ6IiK6IiL6IiM6IiN6IiO6IiP6IiQ6IiR6IiS6IiT6IiU6IiV6IiW6IiX6IiY6IiZ6Iia6Iib6Iic6Iid6Iie6IifCivoiKDoiKHoiKLoiKPoiKToiKXoiKboiKfoiKjoiKnoiKroiKvoiKzoiK3oiK7oiK/oiLDoiLHoiLLoiLPoiLToiLXoiLboiLfoiLjoiLnoiLroiLvoiLzoiL3oiL7oiL8KK+iJgOiJgeiJguiJg+iJhOiJheiJhuiJh+iJiOiJieiJiuiJi+iJjOiJjeiJjuiJj+iJkOiJkeiJkuiJk+iJlOiJleiJluiJl+iJmOiJmeiJmuiJm+iJnOiJneiJnuiJnwor6Img6Imh6Imi6Imj6Imk6Iml6Imm6Imn6Imo6Imp6Imq6Imr6Ims6Imt6Imu6Imv6Imw6Imx6Imy6Imz6Im06Im16Im26Im36Im46Im56Im66Im76Im86Im96Im+6Im/CivoioDoioHoioLoioPoioToioXoioboiofoiojoionoioroiovoiozoio3oio7oio/oipDoipHoipLoipPoipToipXoipboipfoipjoipnoiproipvoipzoip3oip7oip8KK+iKoOiKoeiKouiKo+iKpOiKpeiKpuiKp+iKqOiKqeiKquiKq+iKrOiKreiKruiKr+iKsOiKseiKsuiKs+iKtOiKteiKtuiKt+iKuOiKueiKuuiKu+iKvOiKveiKvuiKvwor6IuA6IuB6IuC6IuD6IuE6IuF6IuG6IuH6IuI6IuJ6IuK6IuL6IuM6IuN6IuO6IuP6IuQ6IuR6IuS6IuT6IuU6IuV6IuW6IuX6IuY6IuZ6Iua6Iub6Iuc6Iud6Iue6IufCivoi6Doi6Hoi6Loi6Poi6Toi6Xoi6boi6foi6joi6noi6roi6voi6zoi63oi67oi6/oi7Doi7Hoi7Loi7Poi7Toi7Xoi7boi7foi7joi7noi7roi7voi7zoi73oi77oi78KK+iMgOiMgeiMguiMg+iMhOiMheiMhuiMh+iMiOiMieiMiuiMi+iMjOiMjeiMjuiMj+iMkOiMkeiMkuiMk+iMlOiMleiMluiMl+iMmOiMmeiMmuiMm+iMnOiMneiMnuiMnwor6Iyg6Iyh6Iyi6Iyj6Iyk6Iyl6Iym6Iyn6Iyo6Iyp6Iyq6Iyr6Iys6Iyt6Iyu6Iyv6Iyw6Iyx6Iyy6Iyz6Iy06Iy16Iy26Iy36Iy46Iy56Iy66Iy76Iy86Iy96Iy+6Iy/CivojYDojYHojYLojYPojYTojYXojYbojYfojYjojYnojYrojYvojYzojY3ojY7ojY/ojZDojZHojZLojZPojZTojZXojZbojZfojZjojZnojZrojZvojZzojZ3ojZ7ojZ8KK+iNoOiNoeiNouiNo+iNpOiNpeiNpuiNp+iNqOiNqeiNquiNq+iNrOiNreiNruiNr+iNsOiNseiNsuiNs+iNtOiNteiNtuiNt+iNuOiNueiNuuiNu+iNvOiNveiNvuiNvwor6I6A6I6B6I6C6I6D6I6E6I6F6I6G6I6H6I6I6I6J6I6K6I6L6I6M6I6N6I6O6I6P6I6Q6I6R6I6S6I6T6I6U6I6V6I6W6I6X6I6Y6I6Z6I6a6I6b6I6c6I6d6I6e6I6fCivojqDojqHojqLojqPojqTojqXojqbojqfojqjojqnojqrojqvojqzojq3ojq7ojq/ojrDojrHojrLojrPojrTojrXojrbojrfojrjojrnojrrojrvojrzojr3ojr7ojr8KK+iPgOiPgeiPguiPg+iPhOiPheiPhuiPh+iPiOiPieiPiuiPi+iPjOiPjeiPjuiPj+iPkOiPkeiPkuiPk+iPlOiPleiPluiPl+iPmOiPmeiPmuiPm+iPnOiPneiPnuiPnwor6I+g6I+h6I+i6I+j6I+k6I+l6I+m6I+n6I+o6I+p6I+q6I+r6I+s6I+t6I+u6I+v6I+w6I+x6I+y6I+z6I+06I+16I+26I+36I+46I+56I+66I+76I+86I+96I++6I+/CivokIDokIHokILokIPokITokIXokIbokIfokIjokInokIrokIvokIzokI3okI7okI/okJDokJHokJLokJPokJTokJXokJbokJfokJjokJnokJrokJvokJzokJ3okJ7okJ8KK+iQoOiQoeiQouiQo+iQpOiQpeiQpuiQp+iQqOiQqeiQquiQq+iQrOiQreiQruiQr+iQsOiQseiQsuiQs+iQtOiQteiQtuiQt+iQuOiQueiQuuiQu+iQvOiQveiQvuiQvwor6JGA6JGB6JGC6JGD6JGE6JGF6JGG6JGH6JGI6JGJ6JGK6JGL6JGM6JGN6JGO6JGP6JGQ6JGR6JGS6JGT6JGU6JGV6JGW6JGX6JGY6JGZ6JGa6JGb6JGc6JGd6JGe6JGfCivokaDokaHokaLokaPokaTokaXokabokafokajokanokarokavokazoka3oka7oka/okbDokbHokbLokbPokbTokbXokbbokbfokbjokbnokbrokbvokbzokb3okb7okb8KK+iSgOiSgeiSguiSg+iShOiSheiShuiSh+iSiOiSieiSiuiSi+iSjOiSjeiSjuiSj+iSkOiSkeiSkuiSk+iSlOiSleiSluiSl+iSmOiSmeiSmuiSm+iSnOiSneiSnuiSnwor6JKg6JKh6JKi6JKj6JKk6JKl6JKm6JKn6JKo6JKp6JKq6JKr6JKs6JKt6JKu6JKv6JKw6JKx6JKy6JKz6JK06JK16JK26JK36JK46JK56JK66JK76JK86JK96JK+6JK/Civok4Dok4Hok4Lok4Pok4Tok4Xok4bok4fok4jok4nok4rok4vok4zok43ok47ok4/ok5Dok5Hok5Lok5Pok5Tok5Xok5bok5fok5jok5nok5rok5vok5zok53ok57ok58KK+iToOiToeiTouiTo+iTpOiTpeiTpuiTp+iTqOiTqeiTquiTq+iTrOiTreiTruiTr+iTsOiTseiTsuiTs+iTtOiTteiTtuiTt+iTuOiTueiTuuiTu+iTvOiTveiTvuiTvwor6JSA6JSB6JSC6JSD6JSE6JSF6JSG6JSH6JSI6JSJ6JSK6JSL6JSM6JSN6JSO6JSP6JSQ6JSR6JSS6JST6JSU6JSV6JSW6JSX6JSY6JSZ6JSa6JSb6JSc6JSd6JSe6JSfCivolKDolKHolKLolKPolKTolKXolKbolKfolKjolKnolKrolKvolKzolK3olK7olK/olLDolLHolLLolLPolLTolLXolLbolLfolLjolLnolLrolLvolLzolL3olL7olL8KK+iVgOiVgeiVguiVg+iVhOiVheiVhuiVh+iViOiVieiViuiVi+iVjOiVjeiVjuiVj+iVkOiVkeiVkuiVk+iVlOiVleiVluiVl+iVmOiVmeiVmuiVm+iVnOiVneiVnuiVnwor6JWg6JWh6JWi6JWj6JWk6JWl6JWm6JWn6JWo6JWp6JWq6JWr6JWs6JWt6JWu6JWv6JWw6JWx6JWy6JWz6JW06JW16JW26JW36JW46JW56JW66JW76JW86JW96JW+6JW/CivoloDoloHoloLoloPoloToloXolobolofolojolonolorolovolozolo3olo7olo/olpDolpHolpLolpPolpTolpXolpbolpfolpjolpnolprolpvolpzolp3olp7olp8KK+iWoOiWoeiWouiWo+iWpOiWpeiWpuiWp+iWqOiWqeiWquiWq+iWrOiWreiWruiWr+iWsOiWseiWsuiWs+iWtOiWteiWtuiWt+iWuOiWueiWuuiWu+iWvOiWveiWvuiWvwor6JeA6JeB6JeC6JeD6JeE6JeF6JeG6JeH6JeI6JeJ6JeK6JeL6JeM6JeN6JeO6JeP6JeQ6JeR6JeS6JeT6JeU6JeV6JeW6JeX6JeY6JeZ6Jea6Jeb6Jec6Jed6Jee6JefCivol6Dol6Hol6Lol6Pol6Tol6Xol6bol6fol6jol6nol6rol6vol6zol63ol67ol6/ol7Dol7Hol7Lol7Pol7Tol7Xol7bol7fol7jol7nol7rol7vol7zol73ol77ol78KK+iYgOiYgeiYguiYg+iYhOiYheiYhuiYh+iYiOiYieiYiuiYi+iYjOiYjeiYjuiYj+iYkOiYkeiYkuiYk+iYlOiYleiYluiYl+iYmOiYmeiYmuiYm+iYnOiYneiYnuiYnwor6Jig6Jih6Jii6Jij6Jik6Jil6Jim6Jin6Jio6Jip6Jiq6Jir6Jis6Jit6Jiu6Jiv6Jiw6Jix6Jiy6Jiz6Ji06Ji16Ji26Ji36Ji46Ji56Ji66Ji76Ji86Ji96Ji+6Ji/CivomYDomYHomYLomYPomYTomYXomYbomYfomYjomYnomYromYvomYzomY3omY7omY/omZDomZHomZLomZPomZTomZXomZbomZfomZjomZnomZromZvomZzomZ3omZ7omZ8KK+iZoOiZoeiZouiZo+iZpOiZpeiZpuiZp+iZqOiZqeiZquiZq+iZrOiZreiZruiZr+iZsOiZseiZsuiZs+iZtOiZteiZtuiZt+iZuOiZueiZuuiZu+iZvOiZveiZvuiZvwor6JqA6JqB6JqC6JqD6JqE6JqF6JqG6JqH6JqI6JqJ6JqK6JqL6JqM6JqN6JqO6JqP6JqQ6JqR6JqS6JqT6JqU6JqV6JqW6JqX6JqY6JqZ6Jqa6Jqb6Jqc6Jqd6Jqe6JqfCivomqDomqHomqLomqPomqTomqXomqbomqfomqjomqnomqromqvomqzomq3omq7omq/omrDomrHomrLomrPomrTomrXomrbomrfomrjomrnomrromrvomrzomr3omr7omr8KK+ibgOibgeibguibg+ibhOibheibhuibh+ibiOibieibiuibi+ibjOibjeibjuibj+ibkOibkeibkuibk+iblOibleibluibl+ibmOibmeibmuibm+ibnOibneibnuibnwor6Jug6Juh6Jui6Juj6Juk6Jul6Jum6Jun6Juo6Jup6Juq6Jur6Jus6Jut6Juu6Juv6Juw6Jux6Juy6Juz6Ju06Ju16Ju26Ju36Ju46Ju56Ju66Ju76Ju86Ju96Ju+6Ju/CivonIDonIHonILonIPonITonIXonIbonIfonIjonInonIronIvonIzonI3onI7onI/onJDonJHonJLonJPonJTonJXonJbonJfonJjonJnonJronJvonJzonJ3onJ7onJ8KK+icoOicoeicouico+icpOicpeicpuicp+icqOicqeicquicq+icrOicreicruicr+icsOicseicsuics+ictOicteictuict+icuOicueicuuicu+icvOicveicvuicvwor6J2A6J2B6J2C6J2D6J2E6J2F6J2G6J2H6J2I6J2J6J2K6J2L6J2M6J2N6J2O6J2P6J2Q6J2R6J2S6J2T6J2U6J2V6J2W6J2X6J2Y6J2Z6J2a6J2b6J2c6J2d6J2e6J2fCivonaDonaHonaLonaPonaTonaXonabonafonajonanonaronavonazona3ona7ona/onbDonbHonbLonbPonbTonbXonbbonbfonbjonbnonbronbvonbzonb3onb7onb8KK+iegOiegeieguieg+iehOieheiehuieh+ieiOieieieiuiei+iejOiejeiejuiej+iekOiekeiekuiek+ielOieleieluiel+iemOiemeiemuiem+ienOieneienuienwor6J6g6J6h6J6i6J6j6J6k6J6l6J6m6J6n6J6o6J6p6J6q6J6r6J6s6J6t6J6u6J6v6J6w6J6x6J6y6J6z6J606J616J626J636J646J656J666J676J686J696J6+6J6/Civon4Don4Hon4Lon4Pon4Ton4Xon4bon4fon4jon4non4ron4von4zon43on47on4/on5Don5Hon5Lon5Pon5Ton5Xon5bon5fon5jon5non5ron5von5zon53on57on58KK+ifoOifoeifouifo+ifpOifpeifpuifp+ifqOifqeifquifq+ifrOifreifruifr+ifsOifseifsuifs+iftOifteiftuift+ifuOifueifuuifu+ifvOifveifvuifvwor6KCA6KCB6KCC6KCD6KCE6KCF6KCG6KCH6KCI6KCJ6KCK6KCL6KCM6KCN6KCO6KCP6KCQ6KCR6KCS6KCT6KCU6KCV6KCW6KCX6KCY6KCZ6KCa6KCb6KCc6KCd6KCe6KCfCivooKDooKHooKLooKPooKTooKXooKbooKfooKjooKnooKrooKvooKzooK3ooK7ooK/ooLDooLHooLLooLPooLTooLXooLbooLfooLjooLnooLrooLvooLzooL3ooL7ooL8KK+ihgOihgeihguihg+ihhOihheihhuihh+ihiOihieihiuihi+ihjOihjeihjuihj+ihkOihkeihkuihk+ihlOihleihluihl+ihmOihmeihmuihm+ihnOihneihnuihnwor6KGg6KGh6KGi6KGj6KGk6KGl6KGm6KGn6KGo6KGp6KGq6KGr6KGs6KGt6KGu6KGv6KGw6KGx6KGy6KGz6KG06KG16KG26KG36KG46KG56KG66KG76KG86KG96KG+6KG/CivoooDoooHoooLoooPoooToooXooobooofooojooonooorooovooozooo3ooo7ooo/oopDoopHoopLoopPoopToopXoopboopfoopjoopnooproopvoopzoop3oop7oop8KK+iioOiioeiiouiio+iipOiipeiipuiip+iiqOiiqeiiquiiq+iirOiireiiruiir+iisOiiseiisuiis+iitOiiteiituiit+iiuOiiueiiuuiiu+iivOiiveiivuiivwor6KOA6KOB6KOC6KOD6KOE6KOF6KOG6KOH6KOI6KOJ6KOK6KOL6KOM6KON6KOO6KOP6KOQ6KOR6KOS6KOT6KOU6KOV6KOW6KOX6KOY6KOZ6KOa6KOb6KOc6KOd6KOe6KOfCivoo6Doo6Hoo6Loo6Poo6Too6Xoo6boo6foo6joo6noo6roo6voo6zoo63oo67oo6/oo7Doo7Hoo7Loo7Poo7Too7Xoo7boo7foo7joo7noo7roo7voo7zoo73oo77oo78KK+ikgOikgeikguikg+ikhOikheikhuikh+ikiOikieikiuiki+ikjOikjeikjuikj+ikkOikkeikkuikk+iklOikleikluikl+ikmOikmeikmuikm+iknOikneiknuiknwor6KSg6KSh6KSi6KSj6KSk6KSl6KSm6KSn6KSo6KSp6KSq6KSr6KSs6KSt6KSu6KSv6KSw6KSx6KSy6KSz6KS06KS16KS26KS36KS46KS56KS66KS76KS86KS96KS+6KS/CivopYDopYHopYLopYPopYTopYXopYbopYfopYjopYnopYropYvopYzopY3opY7opY/opZDopZHopZLopZPopZTopZXopZbopZfopZjopZnopZropZvopZzopZ3opZ7opZ8KK+iloOiloeilouilo+ilpOilpeilpuilp+ilqOilqeilquilq+ilrOilreilruilr+ilsOilseilsuils+iltOilteiltuilt+iluOilueiluuilu+ilvOilveilvuilvwor6KaA6KaB6KaC6KaD6KaE6KaF6KaG6KaH6KaI6KaJ6KaK6KaL6KaM6KaN6KaO6KaP6KaQ6KaR6KaS6KaT6KaU6KaV6KaW6KaX6KaY6KaZ6Kaa6Kab6Kac6Kad6Kae6KafCivopqDopqHopqLopqPopqTopqXopqbopqfopqjopqnopqropqvopqzopq3opq7opq/oprDoprHoprLoprPoprToprXoprboprfoprjoprnoprroprvoprzopr3opr7opr8KK+ingOingeinguing+inhOinheinhuinh+iniOinieiniuini+injOinjeinjuinj+inkOinkeinkuink+inlOinleinluinl+inmOinmeinmuinm+innOinneinnuinnwor6Keg6Keh6Kei6Kej6Kek6Kel6Kem6Ken6Keo6Kep6Keq6Ker6Kes6Ket6Keu6Kev6Kew6Kex6Key6Kez6Ke06Ke16Ke26Ke36Ke46Ke56Ke66Ke76Ke86Ke96Ke+6Ke/CivoqIDoqIHoqILoqIPoqIToqIXoqIboqIfoqIjoqInoqIroqIvoqIzoqI3oqI7oqI/oqJDoqJHoqJLoqJPoqJToqJXoqJboqJfoqJjoqJnoqJroqJvoqJzoqJ3oqJ7oqJ8KK+iooOiooeioouioo+iopOiopeiopuiop+ioqOioqeioquioq+iorOioreioruior+iosOioseiosuios+iotOioteiotuiot+iouOioueiouuiou+iovOioveiovuiovwor6KmA6KmB6KmC6KmD6KmE6KmF6KmG6KmH6KmI6KmJ6KmK6KmL6KmM6KmN6KmO6KmP6KmQ6KmR6KmS6KmT6KmU6KmV6KmW6KmX6KmY6KmZ6Kma6Kmb6Kmc6Kmd6Kme6KmfCivoqaDoqaHoqaLoqaPoqaToqaXoqaboqafoqajoqanoqaroqavoqazoqa3oqa7oqa/oqbDoqbHoqbLoqbPoqbToqbXoqbboqbfoqbjoqbnoqbroqbvoqbzoqb3oqb7oqb8KK+iqgOiqgeiqguiqg+iqhOiqheiqhuiqh+iqiOiqieiqiuiqi+iqjOiqjeiqjuiqj+iqkOiqkeiqkuiqk+iqlOiqleiqluiql+iqmOiqmeiqmuiqm+iqnOiqneiqnuiqnwor6Kqg6Kqh6Kqi6Kqj6Kqk6Kql6Kqm6Kqn6Kqo6Kqp6Kqq6Kqr6Kqs6Kqt6Kqu6Kqv6Kqw6Kqx6Kqy6Kqz6Kq06Kq16Kq26Kq36Kq46Kq56Kq66Kq76Kq86Kq96Kq+6Kq/Civoq4Doq4Hoq4Loq4Poq4Toq4Xoq4boq4foq4joq4noq4roq4voq4zoq43oq47oq4/oq5Doq5Hoq5Loq5Poq5Toq5Xoq5boq5foq5joq5noq5roq5voq5zoq53oq57oq58KK+iroOiroeirouiro+irpOirpeirpuirp+irqOirqeirquirq+irrOirreirruirr+irsOirseirsuirs+irtOirteirtuirt+iruOirueiruuiru+irvOirveirvuirvwor6KyA6KyB6KyC6KyD6KyE6KyF6KyG6KyH6KyI6KyJ6KyK6KyL6KyM6KyN6KyO6KyP6KyQ6KyR6KyS6KyT6KyU6KyV6KyW6KyX6KyY6KyZ6Kya6Kyb6Kyc6Kyd6Kye6KyfCivorKDorKHorKLorKPorKTorKXorKborKforKjorKnorKrorKvorKzorK3orK7orK/orLDorLHorLLorLPorLTorLXorLborLforLjorLnorLrorLvorLzorL3orL7orL8KK+itgOitgeitguitg+ithOitheithuith+itiOitieitiuiti+itjOitjeitjuitj+itkOitkeitkuitk+itlOitleitluitl+itmOitmeitmuitm+itnOitneitnuitnwor6K2g6K2h6K2i6K2j6K2k6K2l6K2m6K2n6K2o6K2p6K2q6K2r6K2s6K2t6K2u6K2v6K2w6K2x6K2y6K2z6K206K216K226K236K246K256K266K276K286K296K2+6K2/CivoroDoroHoroLoroPoroToroXoroboroforojoronorororovorozoro3oro7oro/orpDorpHorpLorpPorpTorpXorpborpforpjorpnorprorpvorpzorp3orp7orp8KK+iuoOiuoeiuouiuo+iupOiupeiupuiup+iuqOiuqeiuquiuq+iurOiureiuruiur+iusOiuseiusuius+iutOiuteiutuiut+iuuOiuueiuuuiuu+iuvOiuveiuvuiuvwor6K+A6K+B6K+C6K+D6K+E6K+F6K+G6K+H6K+I6K+J6K+K6K+L6K+M6K+N6K+O6K+P6K+Q6K+R6K+S6K+T6K+U6K+V6K+W6K+X6K+Y6K+Z6K+a6K+b6K+c6K+d6K+e6K+fCivor6Dor6Hor6Lor6Por6Tor6Xor6bor6for6jor6nor6ror6vor6zor63or67or6/or7Dor7Hor7Lor7Por7Tor7Xor7bor7for7jor7nor7ror7vor7zor73or77or78KK+iwgOiwgeiwguiwg+iwhOiwheiwhuiwh+iwiOiwieiwiuiwi+iwjOiwjeiwjuiwj+iwkOiwkeiwkuiwk+iwlOiwleiwluiwl+iwmOiwmeiwmuiwm+iwnOiwneiwnuiwnwor6LCg6LCh6LCi6LCj6LCk6LCl6LCm6LCn6LCo6LCp6LCq6LCr6LCs6LCt6LCu6LCv6LCw6LCx6LCy6LCz6LC06LC16LC26LC36LC46LC56LC66LC76LC86LC96LC+6LC/CivosYDosYHosYLosYPosYTosYXosYbosYfosYjosYnosYrosYvosYzosY3osY7osY/osZDosZHosZLosZPosZTosZXosZbosZfosZjosZnosZrosZvosZzosZ3osZ7osZ8KK+ixoOixoeixouixo+ixpOixpeixpuixp+ixqOixqeixquixq+ixrOixreixruixr+ixsOixseixsuixs+ixtOixteixtuixt+ixuOixueixuuixu+ixvOixveixvuixvwor6LKA6LKB6LKC6LKD6LKE6LKF6LKG6LKH6LKI6LKJ6LKK6LKL6LKM6LKN6LKO6LKP6LKQ6LKR6LKS6LKT6LKU6LKV6LKW6LKX6LKY6LKZ6LKa6LKb6LKc6LKd6LKe6LKfCivosqDosqHosqLosqPosqTosqXosqbosqfosqjosqnosqrosqvosqzosq3osq7osq/osrDosrHosrLosrPosrTosrXosrbosrfosrjosrnosrrosrvosrzosr3osr7osr8KK+izgOizgeizguizg+izhOizheizhuizh+iziOizieiziuizi+izjOizjeizjuizj+izkOizkeizkuizk+izlOizleizluizl+izmOizmeizmuizm+iznOizneiznuiznwor6LOg6LOh6LOi6LOj6LOk6LOl6LOm6LOn6LOo6LOp6LOq6LOr6LOs6LOt6LOu6LOv6LOw6LOx6LOy6LOz6LO06LO16LO26LO36LO46LO56LO66LO76LO86LO96LO+6LO/CivotIDotIHotILotIPotITotIXotIbotIfotIjotInotIrotIvotIzotI3otI7otI/otJDotJHotJLotJPotJTotJXotJbotJfotJjotJnotJrotJvotJzotJ3otJ7otJ8KK+i0oOi0oei0oui0o+i0pOi0pei0pui0p+i0qOi0qei0qui0q+i0rOi0rei0rui0r+i0sOi0sei0sui0s+i0tOi0tei0tui0t+i0uOi0uei0uui0u+i0vOi0vei0vui0vwor6LWA6LWB6LWC6LWD6LWE6LWF6LWG6LWH6LWI6LWJ6LWK6LWL6LWM6LWN6LWO6LWP6LWQ6LWR6LWS6LWT6LWU6LWV6LWW6LWX6LWY6LWZ6LWa6LWb6LWc6LWd6LWe6LWfCivotaDotaHotaLotaPotaTotaXotabotafotajotanotarotavotazota3ota7ota/otbDotbHotbLotbPotbTotbXotbbotbfotbjotbnotbrotbvotbzotb3otb7otb8KK+i2gOi2gei2gui2g+i2hOi2hei2hui2h+i2iOi2iei2iui2i+i2jOi2jei2jui2j+i2kOi2kei2kui2k+i2lOi2lei2lui2l+i2mOi2mei2mui2m+i2nOi2nei2nui2nwor6Lag6Lah6Lai6Laj6Lak6Lal6Lam6Lan6Lao6Lap6Laq6Lar6Las6Lat6Lau6Lav6Law6Lax6Lay6Laz6La06La16La26La36La46La56La66La76La86La96La+6La/Civot4Dot4Hot4Lot4Pot4Tot4Xot4bot4fot4jot4not4rot4vot4zot43ot47ot4/ot5Dot5Hot5Lot5Pot5Tot5Xot5bot5fot5jot5not5rot5vot5zot53ot57ot58KK+i3oOi3oei3oui3o+i3pOi3pei3pui3p+i3qOi3qei3qui3q+i3rOi3rei3rui3r+i3sOi3sei3sui3s+i3tOi3tei3tui3t+i3uOi3uei3uui3u+i3vOi3vei3vui3vwor6LiA6LiB6LiC6LiD6LiE6LiF6LiG6LiH6LiI6LiJ6LiK6LiL6LiM6LiN6LiO6LiP6LiQ6LiR6LiS6LiT6LiU6LiV6LiW6LiX6LiY6LiZ6Lia6Lib6Lic6Lid6Lie6LifCivouKDouKHouKLouKPouKTouKXouKbouKfouKjouKnouKrouKvouKzouK3ouK7ouK/ouLDouLHouLLouLPouLTouLXouLbouLfouLjouLnouLrouLvouLzouL3ouL7ouL8KK+i5gOi5gei5gui5g+i5hOi5hei5hui5h+i5iOi5iei5iui5i+i5jOi5jei5jui5j+i5kOi5kei5kui5k+i5lOi5lei5lui5l+i5mOi5mei5mui5m+i5nOi5nei5nui5nwor6Lmg6Lmh6Lmi6Lmj6Lmk6Lml6Lmm6Lmn6Lmo6Lmp6Lmq6Lmr6Lms6Lmt6Lmu6Lmv6Lmw6Lmx6Lmy6Lmz6Lm06Lm16Lm26Lm36Lm46Lm56Lm66Lm76Lm86Lm96Lm+6Lm/CivouoDouoHouoLouoPouoTouoXouobouofouojouonouorouovouozouo3ouo7ouo/oupDoupHoupLoupPoupToupXoupboupfoupjoupnouproupvoupzoup3oup7oup8KK+i6oOi6oei6oui6o+i6pOi6pei6pui6p+i6qOi6qei6qui6q+i6rOi6rei6rui6r+i6sOi6sei6sui6s+i6tOi6tei6tui6t+i6uOi6uei6uui6u+i6vOi6vei6vui6vwor6LuA6LuB6LuC6LuD6LuE6LuF6LuG6LuH6LuI6LuJ6LuK6LuL6LuM6LuN6LuO6LuP6LuQ6LuR6LuS6LuT6LuU6LuV6LuW6LuX6LuY6LuZ6Lua6Lub6Luc6Lud6Lue6LufCivou6Dou6Hou6Lou6Pou6Tou6Xou6bou6fou6jou6nou6rou6vou6zou63ou67ou6/ou7Dou7Hou7Lou7Pou7Tou7Xou7bou7fou7jou7nou7rou7vou7zou73ou77ou78KK+i8gOi8gei8gui8g+i8hOi8hei8hui8h+i8iOi8iei8iui8i+i8jOi8jei8jui8j+i8kOi8kei8kui8k+i8lOi8lei8lui8l+i8mOi8mei8mui8m+i8nOi8nei8nui8nwor6Lyg6Lyh6Lyi6Lyj6Lyk6Lyl6Lym6Lyn6Lyo6Lyp6Lyq6Lyr6Lys6Lyt6Lyu6Lyv6Lyw6Lyx6Lyy6Lyz6Ly06Ly16Ly26Ly36Ly46Ly56Ly66Ly76Ly86Ly96Ly+6Ly/CivovYDovYHovYLovYPovYTovYXovYbovYfovYjovYnovYrovYvovYzovY3ovY7ovY/ovZDovZHovZLovZPovZTovZXovZbovZfovZjovZnovZrovZvovZzovZ3ovZ7ovZ8KK+i9oOi9oei9oui9o+i9pOi9pei9pui9p+i9qOi9qei9qui9q+i9rOi9rei9rui9r+i9sOi9sei9sui9s+i9tOi9tei9tui9t+i9uOi9uei9uui9u+i9vOi9vei9vui9vwor6L6A6L6B6L6C6L6D6L6E6L6F6L6G6L6H6L6I6L6J6L6K6L6L6L6M6L6N6L6O6L6P6L6Q6L6R6L6S6L6T6L6U6L6V6L6W6L6X6L6Y6L6Z6L6a6L6b6L6c6L6d6L6e6L6fCivovqDovqHovqLovqPovqTovqXovqbovqfovqjovqnovqrovqvovqzovq3ovq7ovq/ovrDovrHovrLovrPovrTovrXovrbovrfovrjovrnovrrovrvovrzovr3ovr7ovr8KK+i/gOi/gei/gui/g+i/hOi/hei/hui/h+i/iOi/iei/iui/i+i/jOi/jei/jui/j+i/kOi/kei/kui/k+i/lOi/lei/lui/l+i/mOi/mei/mui/m+i/nOi/nei/nui/nwor6L+g6L+h6L+i6L+j6L+k6L+l6L+m6L+n6L+o6L+p6L+q6L+r6L+s6L+t6L+u6L+v6L+w6L+x6L+y6L+z6L+06L+16L+26L+36L+46L+56L+66L+76L+86L+96L++6L+/CivpgIDpgIHpgILpgIPpgITpgIXpgIbpgIfpgIjpgInpgIrpgIvpgIzpgI3pgI7pgI/pgJDpgJHpgJLpgJPpgJTpgJXpgJbpgJfpgJjpgJnpgJrpgJvpgJzpgJ3pgJ7pgJ8KK+mAoOmAoemAoumAo+mApOmApemApumAp+mAqOmAqemAqumAq+mArOmAremArumAr+mAsOmAsemAsumAs+mAtOmAtemAtumAt+mAuOmAuemAuumAu+mAvOmAvemAvumAvwor6YGA6YGB6YGC6YGD6YGE6YGF6YGG6YGH6YGI6YGJ6YGK6YGL6YGM6YGN6YGO6YGP6YGQ6YGR6YGS6YGT6YGU6YGV6YGW6YGX6YGY6YGZ6YGa6YGb6YGc6YGd6YGe6YGfCivpgaDpgaHpgaLpgaPpgaTpgaXpgabpgafpgajpganpgarpgavpgazpga3pga7pga/pgbDpgbHpgbLpgbPpgbTpgbXpgbbpgbfpgbjpgbnpgbrpgbvpgbzpgb3pgb7pgb8KK+mCgOmCgemCgumCg+mChOmChemChumCh+mCiOmCiemCiumCi+mCjOmCjemCjumCj+mCkOmCkemCkumCk+mClOmClemClumCl+mCmOmCmemCmumCm+mCnOmCnemCnumCnwor6YKg6YKh6YKi6YKj6YKk6YKl6YKm6YKn6YKo6YKp6YKq6YKr6YKs6YKt6YKu6YKv6YKw6YKx6YKy6YKz6YK06YK16YK26YK36YK46YK56YK66YK76YK86YK96YK+6YK/Civpg4Dpg4Hpg4Lpg4Ppg4Tpg4Xpg4bpg4fpg4jpg4npg4rpg4vpg4zpg43pg47pg4/pg5Dpg5Hpg5Lpg5Ppg5Tpg5Xpg5bpg5fpg5jpg5npg5rpg5vpg5zpg53pg57pg58KK+mDoOmDoemDoumDo+mDpOmDpemDpumDp+mDqOmDqemDqumDq+mDrOmDremDrumDr+mDsOmDsemDsumDs+mDtOmDtemDtumDt+mDuOmDuemDuumDu+mDvOmDvemDvumDvwor6YSA6YSB6YSC6YSD6YSE6YSF6YSG6YSH6YSI6YSJ6YSK6YSL6YSM6YSN6YSO6YSP6YSQ6YSR6YSS6YST6YSU6YSV6YSW6YSX6YSY6YSZ6YSa6YSb6YSc6YSd6YSe6YSfCivphKDphKHphKLphKPphKTphKXphKbphKfphKjphKnphKrphKvphKzphK3phK7phK/phLDphLHphLLphLPphLTphLXphLbphLfphLjphLnphLrphLvphLzphL3phL7phL8KK+mFgOmFgemFgumFg+mFhOmFhemFhumFh+mFiOmFiemFiumFi+mFjOmFjemFjumFj+mFkOmFkemFkumFk+mFlOmFlemFlumFl+mFmOmFmemFmumFm+mFnOmFnemFnumFnwor6YWg6YWh6YWi6YWj6YWk6YWl6YWm6YWn6YWo6YWp6YWq6YWr6YWs6YWt6YWu6YWv6YWw6YWx6YWy6YWz6YW06YW16YW26YW36YW46YW56YW66YW76YW86YW96YW+6YW/CivphoDphoHphoLphoPphoTphoXphobphofphojphonphorphovphozpho3pho7pho/phpDphpHphpLphpPphpTphpXphpbphpfphpjphpnphprphpvphpzphp3php7php8KK+mGoOmGoemGoumGo+mGpOmGpemGpumGp+mGqOmGqemGqumGq+mGrOmGremGrumGr+mGsOmGsemGsumGs+mGtOmGtemGtumGt+mGuOmGuemGuumGu+mGvOmGvemGvumGvwor6YeA6YeB6YeC6YeD6YeE6YeF6YeG6YeH6YeI6YeJ6YeK6YeL6YeM6YeN6YeO6YeP6YeQ6YeR6YeS6YeT6YeU6YeV6YeW6YeX6YeY6YeZ6Yea6Yeb6Yec6Yed6Yee6YefCivph6Dph6Hph6Lph6Pph6Tph6Xph6bph6fph6jph6nph6rph6vph6zph63ph67ph6/ph7Dph7Hph7Lph7Pph7Tph7Xph7bph7fph7jph7nph7rph7vph7zph73ph77ph78KK+mIgOmIgemIgumIg+mIhOmIhemIhumIh+mIiOmIiemIiumIi+mIjOmIjemIjumIj+mIkOmIkemIkumIk+mIlOmIlemIlumIl+mImOmImemImumIm+mInOmInemInumInwor6Yig6Yih6Yii6Yij6Yik6Yil6Yim6Yin6Yio6Yip6Yiq6Yir6Yis6Yit6Yiu6Yiv6Yiw6Yix6Yiy6Yiz6Yi06Yi16Yi26Yi36Yi46Yi56Yi66Yi76Yi86Yi96Yi+6Yi/CivpiYDpiYHpiYLpiYPpiYTpiYXpiYbpiYfpiYjpiYnpiYrpiYvpiYzpiY3piY7piY/piZDpiZHpiZLpiZPpiZTpiZXpiZbpiZfpiZjpiZnpiZrpiZvpiZzpiZ3piZ7piZ8KK+mJoOmJoemJoumJo+mJpOmJpemJpumJp+mJqOmJqemJqumJq+mJrOmJremJrumJr+mJsOmJsemJsumJs+mJtOmJtemJtumJt+mJuOmJuemJuumJu+mJvOmJvemJvumJvwor6YqA6YqB6YqC6YqD6YqE6YqF6YqG6YqH6YqI6YqJ6YqK6YqL6YqM6YqN6YqO6YqP6YqQ6YqR6YqS6YqT6YqU6YqV6YqW6YqX6YqY6YqZ6Yqa6Yqb6Yqc6Yqd6Yqe6YqfCivpiqDpiqHpiqLpiqPpiqTpiqXpiqbpiqfpiqjpiqnpiqrpiqvpiqzpiq3piq7piq/pirDpirHpirLpirPpirTpirXpirbpirfpirjpirnpirrpirvpirzpir3pir7pir8KK+mLgOmLgemLgumLg+mLhOmLhemLhumLh+mLiOmLiemLiumLi+mLjOmLjemLjumLj+mLkOmLkemLkumLk+mLlOmLlemLlumLl+mLmOmLmemLmumLm+mLnOmLnemLnumLnwor6Yug6Yuh6Yui6Yuj6Yuk6Yul6Yum6Yun6Yuo6Yup6Yuq6Yur6Yus6Yut6Yuu6Yuv6Yuw6Yux6Yuy6Yuz6Yu06Yu16Yu26Yu36Yu46Yu56Yu66Yu76Yu86Yu96Yu+6Yu/CivpjIDpjIHpjILpjIPpjITpjIXpjIbpjIfpjIjpjInpjIrpjIvpjIzpjI3pjI7pjI/pjJDpjJHpjJLpjJPpjJTpjJXpjJbpjJfpjJjpjJnpjJrpjJvpjJzpjJ3pjJ7pjJ8KK+mMoOmMoemMoumMo+mMpOmMpemMpumMp+mMqOmMqemMqumMq+mMrOmMremMrumMr+mMsOmMsemMsumMs+mMtOmMtemMtumMt+mMuOmMuemMuumMu+mMvOmMvemMvumMvwor6Y2A6Y2B6Y2C6Y2D6Y2E6Y2F6Y2G6Y2H6Y2I6Y2J6Y2K6Y2L6Y2M6Y2N6Y2O6Y2P6Y2Q6Y2R6Y2S6Y2T6Y2U6Y2V6Y2W6Y2X6Y2Y6Y2Z6Y2a6Y2b6Y2c6Y2d6Y2e6Y2fCivpjaDpjaHpjaLpjaPpjaTpjaXpjabpjafpjajpjanpjarpjavpjazpja3pja7pja/pjbDpjbHpjbLpjbPpjbTpjbXpjbbpjbfpjbjpjbnpjbrpjbvpjbzpjb3pjb7pjb8KK+mOgOmOgemOgumOg+mOhOmOhemOhumOh+mOiOmOiemOiumOi+mOjOmOjemOjumOj+mOkOmOkemOkumOk+mOlOmOlemOlumOl+mOmOmOmemOmumOm+mOnOmOnemOnumOnwor6Y6g6Y6h6Y6i6Y6j6Y6k6Y6l6Y6m6Y6n6Y6o6Y6p6Y6q6Y6r6Y6s6Y6t6Y6u6Y6v6Y6w6Y6x6Y6y6Y6z6Y606Y616Y626Y636Y646Y656Y666Y676Y686Y696Y6+6Y6/Civpj4Dpj4Hpj4Lpj4Ppj4Tpj4Xpj4bpj4fpj4jpj4npj4rpj4vpj4zpj43pj47pj4/pj5Dpj5Hpj5Lpj5Ppj5Tpj5Xpj5bpj5fpj5jpj5npj5rpj5vpj5zpj53pj57pj58KK+mPoOmPoemPoumPo+mPpOmPpemPpumPp+mPqOmPqemPqumPq+mPrOmPremPrumPr+mPsOmPsemPsumPs+mPtOmPtemPtumPt+mPuOmPuemPuumPu+mPvOmPvemPvumPvwor6ZCA6ZCB6ZCC6ZCD6ZCE6ZCF6ZCG6ZCH6ZCI6ZCJ6ZCK6ZCL6ZCM6ZCN6ZCO6ZCP6ZCQ6ZCR6ZCS6ZCT6ZCU6ZCV6ZCW6ZCX6ZCY6ZCZ6ZCa6ZCb6ZCc6ZCd6ZCe6ZCfCivpkKDpkKHpkKLpkKPpkKTpkKXpkKbpkKfpkKjpkKnpkKrpkKvpkKzpkK3pkK7pkK/pkLDpkLHpkLLpkLPpkLTpkLXpkLbpkLfpkLjpkLnpkLrpkLvpkLzpkL3pkL7pkL8KK+mRgOmRgemRgumRg+mRhOmRhemRhumRh+mRiOmRiemRiumRi+mRjOmRjemRjumRj+mRkOmRkemRkumRk+mRlOmRlemRlumRl+mRmOmRmemRmumRm+mRnOmRnemRnumRnwor6ZGg6ZGh6ZGi6ZGj6ZGk6ZGl6ZGm6ZGn6ZGo6ZGp6ZGq6ZGr6ZGs6ZGt6ZGu6ZGv6ZGw6ZGx6ZGy6ZGz6ZG06ZG16ZG26ZG36ZG46ZG56ZG66ZG76ZG86ZG96ZG+6ZG/CivpkoDpkoHpkoLpkoPpkoTpkoXpkobpkofpkojpkonpkorpkovpkozpko3pko7pko/pkpDpkpHpkpLpkpPpkpTpkpXpkpbpkpfpkpjpkpnpkprpkpvpkpzpkp3pkp7pkp8KK+mSoOmSoemSoumSo+mSpOmSpemSpumSp+mSqOmSqemSqumSq+mSrOmSremSrumSr+mSsOmSsemSsumSs+mStOmStemStumSt+mSuOmSuemSuumSu+mSvOmSvemSvumSvwor6ZOA6ZOB6ZOC6ZOD6ZOE6ZOF6ZOG6ZOH6ZOI6ZOJ6ZOK6ZOL6ZOM6ZON6ZOO6ZOP6ZOQ6ZOR6ZOS6ZOT6ZOU6ZOV6ZOW6ZOX6ZOY6ZOZ6ZOa6ZOb6ZOc6ZOd6ZOe6ZOfCivpk6Dpk6Hpk6Lpk6Ppk6Tpk6Xpk6bpk6fpk6jpk6npk6rpk6vpk6zpk63pk67pk6/pk7Dpk7Hpk7Lpk7Ppk7Tpk7Xpk7bpk7fpk7jpk7npk7rpk7vpk7zpk73pk77pk78KK+mUgOmUgemUgumUg+mUhOmUhemUhumUh+mUiOmUiemUiumUi+mUjOmUjemUjumUj+mUkOmUkemUkumUk+mUlOmUlemUlumUl+mUmOmUmemUmumUm+mUnOmUnemUnumUnwor6ZSg6ZSh6ZSi6ZSj6ZSk6ZSl6ZSm6ZSn6ZSo6ZSp6ZSq6ZSr6ZSs6ZSt6ZSu6ZSv6ZSw6ZSx6ZSy6ZSz6ZS06ZS16ZS26ZS36ZS46ZS56ZS66ZS76ZS86ZS96ZS+6ZS/CivplYDplYHplYLplYPplYTplYXplYbplYfplYjplYnplYrplYvplYzplY3plY7plY/plZDplZHplZLplZPplZTplZXplZbplZfplZjplZnplZrplZvplZzplZ3plZ7plZ8KK+mVoOmVoemVoumVo+mVpOmVpemVpumVp+mVqOmVqemVqumVq+mVrOmVremVrumVr+mVsOmVsemVsumVs+mVtOmVtemVtumVt+mVuOmVuemVuumVu+mVvOmVvemVvumVvwor6ZaA6ZaB6ZaC6ZaD6ZaE6ZaF6ZaG6ZaH6ZaI6ZaJ6ZaK6ZaL6ZaM6ZaN6ZaO6ZaP6ZaQ6ZaR6ZaS6ZaT6ZaU6ZaV6ZaW6ZaX6ZaY6ZaZ6Zaa6Zab6Zac6Zad6Zae6ZafCivplqDplqHplqLplqPplqTplqXplqbplqfplqjplqnplqrplqvplqzplq3plq7plq/plrDplrHplrLplrPplrTplrXplrbplrfplrjplrnplrrplrvplrzplr3plr7plr8KK+mXgOmXgemXgumXg+mXhOmXhemXhumXh+mXiOmXiemXiumXi+mXjOmXjemXjumXj+mXkOmXkemXkumXk+mXlOmXlemXlumXl+mXmOmXmemXmumXm+mXnOmXnemXnumXnwor6Zeg6Zeh6Zei6Zej6Zek6Zel6Zem6Zen6Zeo6Zep6Zeq6Zer6Zes6Zet6Zeu6Zev6Zew6Zex6Zey6Zez6Ze06Ze16Ze26Ze36Ze46Ze56Ze66Ze76Ze86Ze96Ze+6Ze/CivpmIDpmIHpmILpmIPpmITpmIXpmIbpmIfpmIjpmInpmIrpmIvpmIzpmI3pmI7pmI/pmJDpmJHpmJLpmJPpmJTpmJXpmJbpmJfpmJjpmJnpmJrpmJvpmJzpmJ3pmJ7pmJ8KK+mYoOmYoemYoumYo+mYpOmYpemYpumYp+mYqOmYqemYqumYq+mYrOmYremYrumYr+mYsOmYsemYsumYs+mYtOmYtemYtumYt+mYuOmYuemYuumYu+mYvOmYvemYvumYvwor6ZmA6ZmB6ZmC6ZmD6ZmE6ZmF6ZmG6ZmH6ZmI6ZmJ6ZmK6ZmL6ZmM6ZmN6ZmO6ZmP6ZmQ6ZmR6ZmS6ZmT6ZmU6ZmV6ZmW6ZmX6ZmY6ZmZ6Zma6Zmb6Zmc6Zmd6Zme6ZmfCivpmaDpmaHpmaLpmaPpmaTpmaXpmabpmafpmajpmanpmarpmavpmazpma3pma7pma/pmbDpmbHpmbLpmbPpmbTpmbXpmbbpmbfpmbjpmbnpmbrpmbvpmbzpmb3pmb7pmb8KK+magOmagemagumag+mahOmahemahumah+maiOmaiemaiumai+majOmajemajumaj+makOmakemakumak+malOmalemalumal+mamOmamemamumam+manOmanemanumanwor6Zqg6Zqh6Zqi6Zqj6Zqk6Zql6Zqm6Zqn6Zqo6Zqp6Zqq6Zqr6Zqs6Zqt6Zqu6Zqv6Zqw6Zqx6Zqy6Zqz6Zq06Zq16Zq26Zq36Zq46Zq56Zq66Zq76Zq86Zq96Zq+6Zq/Civpm4Dpm4Hpm4Lpm4Ppm4Tpm4Xpm4bpm4fpm4jpm4npm4rpm4vpm4zpm43pm47pm4/pm5Dpm5Hpm5Lpm5Ppm5Tpm5Xpm5bpm5fpm5jpm5npm5rpm5vpm5zpm53pm57pm58KK+mboOmboemboumbo+mbpOmbpembpumbp+mbqOmbqembqumbq+mbrOmbrembrumbr+mbsOmbsembsumbs+mbtOmbtembtumbt+mbuOmbuembuumbu+mbvOmbvembvumbvwor6ZyA6ZyB6ZyC6ZyD6ZyE6ZyF6ZyG6ZyH6ZyI6ZyJ6ZyK6ZyL6ZyM6ZyN6ZyO6ZyP6ZyQ6ZyR6ZyS6ZyT6ZyU6ZyV6ZyW6ZyX6ZyY6ZyZ6Zya6Zyb6Zyc6Zyd6Zye6ZyfCivpnKDpnKHpnKLpnKPpnKTpnKXpnKbpnKfpnKjpnKnpnKrpnKvpnKzpnK3pnK7pnK/pnLDpnLHpnLLpnLPpnLTpnLXpnLbpnLfpnLjpnLnpnLrpnLvpnLzpnL3pnL7pnL8KK+mdgOmdgemdgumdg+mdhOmdhemdhumdh+mdiOmdiemdiumdi+mdjOmdjemdjumdj+mdkOmdkemdkumdk+mdlOmdlemdlumdl+mdmOmdmemdmumdm+mdnOmdnemdnumdnwor6Z2g6Z2h6Z2i6Z2j6Z2k6Z2l6Z2m6Z2n6Z2o6Z2p6Z2q6Z2r6Z2s6Z2t6Z2u6Z2v6Z2w6Z2x6Z2y6Z2z6Z206Z216Z226Z236Z246Z256Z266Z276Z286Z296Z2+6Z2/CivpnoDpnoHpnoLpnoPpnoTpnoXpnobpnofpnojpnonpnorpnovpnozpno3pno7pno/pnpDpnpHpnpLpnpPpnpTpnpXpnpbpnpfpnpjpnpnpnprpnpvpnpzpnp3pnp7pnp8KK+meoOmeoemeoumeo+mepOmepemepumep+meqOmeqemequmeq+merOmeremerumer+mesOmesemesumes+metOmetemetumet+meuOmeuemeuumeu+mevOmevemevumevwor6Z+A6Z+B6Z+C6Z+D6Z+E6Z+F6Z+G6Z+H6Z+I6Z+J6Z+K6Z+L6Z+M6Z+N6Z+O6Z+P6Z+Q6Z+R6Z+S6Z+T6Z+U6Z+V6Z+W6Z+X6Z+Y6Z+Z6Z+a6Z+b6Z+c6Z+d6Z+e6Z+fCivpn6Dpn6Hpn6Lpn6Ppn6Tpn6Xpn6bpn6fpn6jpn6npn6rpn6vpn6zpn63pn67pn6/pn7Dpn7Hpn7Lpn7Ppn7Tpn7Xpn7bpn7fpn7jpn7npn7rpn7vpn7zpn73pn77pn78KK+mggOmggemggumgg+mghOmghemghumgh+mgiOmgiemgiumgi+mgjOmgjemgjumgj+mgkOmgkemgkumgk+mglOmglemglumgl+mgmOmgmemgmumgm+mgnOmgnemgnumgnwor6aCg6aCh6aCi6aCj6aCk6aCl6aCm6aCn6aCo6aCp6aCq6aCr6aCs6aCt6aCu6aCv6aCw6aCx6aCy6aCz6aC06aC16aC26aC36aC46aC56aC66aC76aC86aC96aC+6aC/CivpoYDpoYHpoYLpoYPpoYTpoYXpoYbpoYfpoYjpoYnpoYrpoYvpoYzpoY3poY7poY/poZDpoZHpoZLpoZPpoZTpoZXpoZbpoZfpoZjpoZnpoZrpoZvpoZzpoZ3poZ7poZ8KK+mhoOmhoemhoumho+mhpOmhpemhpumhp+mhqOmhqemhqumhq+mhrOmhremhrumhr+mhsOmhsemhsumhs+mhtOmhtemhtumht+mhuOmhuemhuumhu+mhvOmhvemhvumhvwor6aKA6aKB6aKC6aKD6aKE6aKF6aKG6aKH6aKI6aKJ6aKK6aKL6aKM6aKN6aKO6aKP6aKQ6aKR6aKS6aKT6aKU6aKV6aKW6aKX6aKY6aKZ6aKa6aKb6aKc6aKd6aKe6aKfCivpoqDpoqHpoqLpoqPpoqTpoqXpoqbpoqfpoqjpoqnpoqrpoqvpoqzpoq3poq7poq/porDporHporLporPporTporXporbporfporjpornporrporvporzpor3por7por8KK+mjgOmjgemjgumjg+mjhOmjhemjhumjh+mjiOmjiemjiumji+mjjOmjjemjjumjj+mjkOmjkemjkumjk+mjlOmjlemjlumjl+mjmOmjmemjmumjm+mjnOmjnemjnumjnwor6aOg6aOh6aOi6aOj6aOk6aOl6aOm6aOn6aOo6aOp6aOq6aOr6aOs6aOt6aOu6aOv6aOw6aOx6aOy6aOz6aO06aO16aO26aO36aO46aO56aO66aO76aO86aO96aO+6aO/CivppIDppIHppILppIPppITppIXppIbppIfppIjppInppIrppIvppIzppI3ppI7ppI/ppJDppJHppJLppJPppJTppJXppJbppJfppJjppJnppJrppJvppJzppJ3ppJ7ppJ8KK+mkoOmkoemkoumko+mkpOmkpemkpumkp+mkqOmkqemkqumkq+mkrOmkremkrumkr+mksOmksemksumks+mktOmktemktumkt+mkuOmkuemkuumku+mkvOmkvemkvumkvwor6aWA6aWB6aWC6aWD6aWE6aWF6aWG6aWH6aWI6aWJ6aWK6aWL6aWM6aWN6aWO6aWP6aWQ6aWR6aWS6aWT6aWU6aWV6aWW6aWX6aWY6aWZ6aWa6aWb6aWc6aWd6aWe6aWfCivppaDppaHppaLppaPppaTppaXppabppafppajppanpparppavppazppa3ppa7ppa/ppbDppbHppbLppbPppbTppbXppbbppbfppbjppbnppbrppbvppbzppb3ppb7ppb8KK+mmgOmmgemmgummg+mmhOmmhemmhummh+mmiOmmiemmiummi+mmjOmmjemmjummj+mmkOmmkemmkummk+mmlOmmlemmlumml+mmmOmmmemmmummm+mmnOmmnemmnummnwor6aag6aah6aai6aaj6aak6aal6aam6aan6aao6aap6aaq6aar6aas6aat6aau6aav6aaw6aax6aay6aaz6aa06aa16aa26aa36aa46aa56aa66aa76aa86aa96aa+6aa/Civpp4Dpp4Hpp4Lpp4Ppp4Tpp4Xpp4bpp4fpp4jpp4npp4rpp4vpp4zpp43pp47pp4/pp5Dpp5Hpp5Lpp5Ppp5Tpp5Xpp5bpp5fpp5jpp5npp5rpp5vpp5zpp53pp57pp58KK+mnoOmnoemnoumno+mnpOmnpemnpumnp+mnqOmnqemnqumnq+mnrOmnremnrumnr+mnsOmnsemnsumns+mntOmntemntumnt+mnuOmnuemnuumnu+mnvOmnvemnvumnvwor6aiA6aiB6aiC6aiD6aiE6aiF6aiG6aiH6aiI6aiJ6aiK6aiL6aiM6aiN6aiO6aiP6aiQ6aiR6aiS6aiT6aiU6aiV6aiW6aiX6aiY6aiZ6aia6aib6aic6aid6aie6aifCivpqKDpqKHpqKLpqKPpqKTpqKXpqKbpqKfpqKjpqKnpqKrpqKvpqKzpqK3pqK7pqK/pqLDpqLHpqLLpqLPpqLTpqLXpqLbpqLfpqLjpqLnpqLrpqLvpqLzpqL3pqL7pqL8KK+mpgOmpgempgumpg+mphOmphemphumph+mpiOmpiempiumpi+mpjOmpjempjumpj+mpkOmpkempkumpk+mplOmplemplumpl+mpmOmpmempmumpm+mpnOmpnempnumpnwor6amg6amh6ami6amj6amk6aml6amm6amn6amo6amp6amq6amr6ams6amt6amu6amv6amw6amx6amy6amz6am06am16am26am36am46am56am66am76am86am96am+6am/CivpqoDpqoHpqoLpqoPpqoTpqoXpqobpqofpqojpqonpqorpqovpqozpqo3pqo7pqo/pqpDpqpHpqpLpqpPpqpTpqpXpqpbpqpfpqpjpqpnpqprpqpvpqpzpqp3pqp7pqp8KK+mqoOmqoemqoumqo+mqpOmqpemqpumqp+mqqOmqqemqqumqq+mqrOmqremqrumqr+mqsOmqsemqsumqs+mqtOmqtemqtumqt+mquOmquemquumqu+mqvOmqvemqvumqvwor6auA6auB6auC6auD6auE6auF6auG6auH6auI6auJ6auK6auL6auM6auN6auO6auP6auQ6auR6auS6auT6auU6auV6auW6auX6auY6auZ6aua6aub6auc6aud6aue6aufCivpq6Dpq6Hpq6Lpq6Ppq6Tpq6Xpq6bpq6fpq6jpq6npq6rpq6vpq6zpq63pq67pq6/pq7Dpq7Hpq7Lpq7Ppq7Tpq7Xpq7bpq7fpq7jpq7npq7rpq7vpq7zpq73pq77pq78KK+msgOmsgemsgumsg+mshOmshemshumsh+msiOmsiemsiumsi+msjOmsjemsjumsj+mskOmskemskumsk+mslOmslemslumsl+msmOmsmemsmumsm+msnOmsnemsnumsnwor6ayg6ayh6ayi6ayj6ayk6ayl6aym6ayn6ayo6ayp6ayq6ayr6ays6ayt6ayu6ayv6ayw6ayx6ayy6ayz6ay06ay16ay26ay36ay46ay56ay66ay76ay86ay96ay+6ay/CivprYDprYHprYLprYPprYTprYXprYbprYfprYjprYnprYrprYvprYzprY3prY7prY/prZDprZHprZLprZPprZTprZXprZbprZfprZjprZnprZrprZvprZzprZ3prZ7prZ8KK+mtoOmtoemtoumto+mtpOmtpemtpumtp+mtqOmtqemtqumtq+mtrOmtremtrumtr+mtsOmtsemtsumts+mttOmttemttumtt+mtuOmtuemtuumtu+mtvOmtvemtvumtvwor6a6A6a6B6a6C6a6D6a6E6a6F6a6G6a6H6a6I6a6J6a6K6a6L6a6M6a6N6a6O6a6P6a6Q6a6R6a6S6a6T6a6U6a6V6a6W6a6X6a6Y6a6Z6a6a6a6b6a6c6a6d6a6e6a6fCivprqDprqHprqLprqPprqTprqXprqbprqfprqjprqnprqrprqvprqzprq3prq7prq/prrDprrHprrLprrPprrTprrXprrbprrfprrjprrnprrrprrvprrzprr3prr7prr8KK+mvgOmvgemvgumvg+mvhOmvhemvhumvh+mviOmviemviumvi+mvjOmvjemvjumvj+mvkOmvkemvkumvk+mvlOmvlemvlumvl+mvmOmvmemvmumvm+mvnOmvnemvnumvnwor6a+g6a+h6a+i6a+j6a+k6a+l6a+m6a+n6a+o6a+p6a+q6a+r6a+s6a+t6a+u6a+v6a+w6a+x6a+y6a+z6a+06a+16a+26a+36a+46a+56a+66a+76a+86a+96a++6a+/CivpsIDpsIHpsILpsIPpsITpsIXpsIbpsIfpsIjpsInpsIrpsIvpsIzpsI3psI7psI/psJDpsJHpsJLpsJPpsJTpsJXpsJbpsJfpsJjpsJnpsJrpsJvpsJzpsJ3psJ7psJ8KK+mwoOmwoemwoumwo+mwpOmwpemwpumwp+mwqOmwqemwqumwq+mwrOmwremwrumwr+mwsOmwsemwsumws+mwtOmwtemwtumwt+mwuOmwuemwuumwu+mwvOmwvemwvumwvwor6bGA6bGB6bGC6bGD6bGE6bGF6bGG6bGH6bGI6bGJ6bGK6bGL6bGM6bGN6bGO6bGP6bGQ6bGR6bGS6bGT6bGU6bGV6bGW6bGX6bGY6bGZ6bGa6bGb6bGc6bGd6bGe6bGfCivpsaDpsaHpsaLpsaPpsaTpsaXpsabpsafpsajpsanpsarpsavpsazpsa3psa7psa/psbDpsbHpsbLpsbPpsbTpsbXpsbbpsbfpsbjpsbnpsbrpsbvpsbzpsb3psb7psb8KK+mygOmygemygumyg+myhOmyhemyhumyh+myiOmyiemyiumyi+myjOmyjemyjumyj+mykOmykemykumyk+mylOmylemylumyl+mymOmymemymumym+mynOmynemynumynwor6bKg6bKh6bKi6bKj6bKk6bKl6bKm6bKn6bKo6bKp6bKq6bKr6bKs6bKt6bKu6bKv6bKw6bKx6bKy6bKz6bK06bK16bK26bK36bK46bK56bK66bK76bK86bK96bK+6bK/Civps4Dps4Hps4Lps4Pps4Tps4Xps4bps4fps4jps4nps4rps4vps4zps43ps47ps4/ps5Dps5Hps5Lps5Pps5Tps5Xps5bps5fps5jps5nps5rps5vps5zps53ps57ps58KK+mzoOmzoemzoumzo+mzpOmzpemzpumzp+mzqOmzqemzqumzq+mzrOmzremzrumzr+mzsOmzsemzsumzs+mztOmztemztumzt+mzuOmzuemzuumzu+mzvOmzvemzvumzvwor6bSA6bSB6bSC6bSD6bSE6bSF6bSG6bSH6bSI6bSJ6bSK6bSL6bSM6bSN6bSO6bSP6bSQ6bSR6bSS6bST6bSU6bSV6bSW6bSX6bSY6bSZ6bSa6bSb6bSc6bSd6bSe6bSfCivptKDptKHptKLptKPptKTptKXptKbptKfptKjptKnptKrptKvptKzptK3ptK7ptK/ptLDptLHptLLptLPptLTptLXptLbptLfptLjptLnptLrptLvptLzptL3ptL7ptL8KK+m1gOm1gem1gum1g+m1hOm1hem1hum1h+m1iOm1iem1ium1i+m1jOm1jem1jum1j+m1kOm1kem1kum1k+m1lOm1lem1lum1l+m1mOm1mem1mum1m+m1nOm1nem1num1nwor6bWg6bWh6bWi6bWj6bWk6bWl6bWm6bWn6bWo6bWp6bWq6bWr6bWs6bWt6bWu6bWv6bWw6bWx6bWy6bWz6bW06bW16bW26bW36bW46bW56bW66bW76bW86bW96bW+6bW/CivptoDptoHptoLptoPptoTptoXptobptofptojptonptorptovptozpto3pto7pto/ptpDptpHptpLptpPptpTptpXptpbptpfptpjptpnptprptpvptpzptp3ptp7ptp8KK+m2oOm2oem2oum2o+m2pOm2pem2pum2p+m2qOm2qem2qum2q+m2rOm2rem2rum2r+m2sOm2sem2sum2s+m2tOm2tem2tum2t+m2uOm2uem2uum2u+m2vOm2vem2vum2vwor6beA6beB6beC6beD6beE6beF6beG6beH6beI6beJ6beK6beL6beM6beN6beO6beP6beQ6beR6beS6beT6beU6beV6beW6beX6beY6beZ6bea6beb6bec6bed6bee6befCivpt6Dpt6Hpt6Lpt6Ppt6Tpt6Xpt6bpt6fpt6jpt6npt6rpt6vpt6zpt63pt67pt6/pt7Dpt7Hpt7Lpt7Ppt7Tpt7Xpt7bpt7fpt7jpt7npt7rpt7vpt7zpt73pt77pt78KK+m4gOm4gem4gum4g+m4hOm4hem4hum4h+m4iOm4iem4ium4i+m4jOm4jem4jum4j+m4kOm4kem4kum4k+m4lOm4lem4lum4l+m4mOm4mem4mum4m+m4nOm4nem4num4nwor6big6bih6bii6bij6bik6bil6bim6bin6bio6bip6biq6bir6bis6bit6biu6biv6biw6bix6biy6biz6bi06bi16bi26bi36bi46bi56bi66bi76bi86bi96bi+6bi/CivpuYDpuYHpuYLpuYPpuYTpuYXpuYbpuYfpuYjpuYnpuYrpuYvpuYzpuY3puY7puY/puZDpuZHpuZLpuZPpuZTpuZXpuZbpuZfpuZjpuZnpuZrpuZvpuZzpuZ3puZ7puZ8KK+m5oOm5oem5oum5o+m5pOm5pem5pum5p+m5qOm5qem5qum5q+m5rOm5rem5rum5r+m5sOm5sem5sum5s+m5tOm5tem5tum5t+m5uOm5uem5uum5u+m5vOm5vem5vum5vwor6bqA6bqB6bqC6bqD6bqE6bqF6bqG6bqH6bqI6bqJ6bqK6bqL6bqM6bqN6bqO6bqP6bqQ6bqR6bqS6bqT6bqU6bqV6bqW6bqX6bqY6bqZ6bqa6bqb6bqc6bqd6bqe6bqfCivpuqDpuqHpuqLpuqPpuqTpuqXpuqbpuqfpuqjpuqnpuqrpuqvpuqzpuq3puq7puq/purDpurHpurLpurPpurTpurXpurbpurfpurjpurnpurrpurvpurzpur3pur7pur8KK+m7gOm7gem7gum7g+m7hOm7hem7hum7h+m7iOm7iem7ium7i+m7jOm7jem7jum7j+m7kOm7kem7kum7k+m7lOm7lem7lum7l+m7mOm7mem7mum7m+m7nOm7nem7num7nwor6bug6buh6bui6buj6buk6bul6bum6bun6buo6bup6buq6bur6bus6but6buu6buv6buw6bux6buy6buz6bu06bu16bu26bu36bu46bu56bu66bu76bu86bu96bu+6bu/CivpvIDpvIHpvILpvIPpvITpvIXpvIbpvIfpvIjpvInpvIrpvIvpvIzpvI3pvI7pvI/pvJDpvJHpvJLpvJPpvJTpvJXpvJbpvJfpvJjpvJnpvJrpvJvpvJzpvJ3pvJ7pvJ8KK+m8oOm8oem8oum8o+m8pOm8pem8pum8p+m8qOm8qem8qum8q+m8rOm8rem8rum8r+m8sOm8sem8sum8s+m8tOm8tem8tum8t+m8uOm8uem8uum8u+m8vOm8vem8vum8vwor6b2A6b2B6b2C6b2D6b2E6b2F6b2G6b2H6b2I6b2J6b2K6b2L6b2M6b2N6b2O6b2P6b2Q6b2R6b2S6b2T6b2U6b2V6b2W6b2X6b2Y6b2Z6b2a6b2b6b2c6b2d6b2e6b2fCivpvaDpvaHpvaLpvaPpvaTpvaXpvabpvafpvajpvanpvarpvavpvazpva3pva7pva/pvbDpvbHpvbLpvbPpvbTpvbXpvbbpvbfpvbjpvbnpvbrpvbvpvbzpvb3pvb7pvb8KK+m+gOm+gem+gum+g+m+hOm+hem+hum+h+m+iOm+iem+ium+i+m+jOm+jem+jum+j+m+kOm+kem+kum+k+m+lOm+lem+lum+l+m+mOm+mem+mum+m+m+nOm+nem+num+nwor6b6g6b6h6b6i6b6j6b6k6b6l6b6m6b6n6b6o6b6p6b6q6b6r6b6s6b6t6b6u6b6v6b6w6b6x6b6y6b6z6b606b616b626b636b646b656b666b676b686b696b6+6b6/Civpv4Dpv4Hpv4Lpv4Ppv4Tpv4Xpv4bpv4fpv4jpv4npv4rpv4vpv4zpv43pv47pv4/pv5Dpv5Hpv5Lpv5Ppv5Tpv5Xpv5bpv5fpv5jpv5npv5rpv5vpv5zpv53pv57pv58KK+m/oOm/oem/oum/o+m/pOm/pem/pum/p+m/qOm/qem/qum/q+m/rOm/rem/rum/r+m/sOm/sem/sum/s+m/tOm/tem/tum/t+m/uOm/uem/uum/u+m/vOm/vem/vum/vworCitZaSBTeWxsYWJsZXMgKFUrQTAwMC1VK0E0OEYpOgorCivqgIDqgIHqgILqgIPqgITqgIXqgIbqgIfqgIjqgInqgIrqgIvqgIzqgI3qgI7qgI/qgJDqgJHqgJLqgJPqgJTqgJXqgJbqgJfqgJjqgJnqgJrqgJvqgJzqgJ3qgJ7qgJ8KK+qAoOqAoeqAouqAo+qApOqApeqApuqAp+qAqOqAqeqAquqAq+qArOqAreqAruqAr+qAsOqAseqAsuqAs+qAtOqAteqAtuqAt+qAuOqAueqAuuqAu+qAvOqAveqAvuqAvwor6oGA6oGB6oGC6oGD6oGE6oGF6oGG6oGH6oGI6oGJ6oGK6oGL6oGM6oGN6oGO6oGP6oGQ6oGR6oGS6oGT6oGU6oGV6oGW6oGX6oGY6oGZ6oGa6oGb6oGc6oGd6oGe6oGfCivqgaDqgaHqgaLqgaPqgaTqgaXqgabqgafqgajqganqgarqgavqgazqga3qga7qga/qgbDqgbHqgbLqgbPqgbTqgbXqgbbqgbfqgbjqgbnqgbrqgbvqgbzqgb3qgb7qgb8KK+qCgOqCgeqCguqCg+qChOqCheqChuqCh+qCiOqCieqCiuqCi+qCjOqCjeqCjuqCj+qCkOqCkeqCkuqCk+qClOqCleqCluqCl+qCmOqCmeqCmuqCm+qCnOqCneqCnuqCnwor6oKg6oKh6oKi6oKj6oKk6oKl6oKm6oKn6oKo6oKp6oKq6oKr6oKs6oKt6oKu6oKv6oKw6oKx6oKy6oKz6oK06oK16oK26oK36oK46oK56oK66oK76oK86oK96oK+6oK/Civqg4Dqg4Hqg4Lqg4Pqg4Tqg4Xqg4bqg4fqg4jqg4nqg4rqg4vqg4zqg43qg47qg4/qg5Dqg5Hqg5Lqg5Pqg5Tqg5Xqg5bqg5fqg5jqg5nqg5rqg5vqg5zqg53qg57qg58KK+qDoOqDoeqDouqDo+qDpOqDpeqDpuqDp+qDqOqDqeqDquqDq+qDrOqDreqDruqDr+qDsOqDseqDsuqDs+qDtOqDteqDtuqDt+qDuOqDueqDuuqDu+qDvOqDveqDvuqDvwor6oSA6oSB6oSC6oSD6oSE6oSF6oSG6oSH6oSI6oSJ6oSK6oSL6oSM6oSN6oSO6oSP6oSQ6oSR6oSS6oST6oSU6oSV6oSW6oSX6oSY6oSZ6oSa6oSb6oSc6oSd6oSe6oSfCivqhKDqhKHqhKLqhKPqhKTqhKXqhKbqhKfqhKjqhKnqhKrqhKvqhKzqhK3qhK7qhK/qhLDqhLHqhLLqhLPqhLTqhLXqhLbqhLfqhLjqhLnqhLrqhLvqhLzqhL3qhL7qhL8KK+qFgOqFgeqFguqFg+qFhOqFheqFhuqFh+qFiOqFieqFiuqFi+qFjOqFjeqFjuqFj+qFkOqFkeqFkuqFk+qFlOqFleqFluqFl+qFmOqFmeqFmuqFm+qFnOqFneqFnuqFnwor6oWg6oWh6oWi6oWj6oWk6oWl6oWm6oWn6oWo6oWp6oWq6oWr6oWs6oWt6oWu6oWv6oWw6oWx6oWy6oWz6oW06oW16oW26oW36oW46oW56oW66oW76oW86oW96oW+6oW/CivqhoDqhoHqhoLqhoPqhoTqhoXqhobqhofqhojqhonqhorqhovqhozqho3qho7qho/qhpDqhpHqhpLqhpPqhpTqhpXqhpbqhpfqhpjqhpnqhprqhpvqhpzqhp3qhp7qhp8KK+qGoOqGoeqGouqGo+qGpOqGpeqGpuqGp+qGqOqGqeqGquqGq+qGrOqGreqGruqGr+qGsOqGseqGsuqGs+qGtOqGteqGtuqGt+qGuOqGueqGuuqGu+qGvOqGveqGvuqGvwor6oeA6oeB6oeC6oeD6oeE6oeF6oeG6oeH6oeI6oeJ6oeK6oeL6oeM6oeN6oeO6oeP6oeQ6oeR6oeS6oeT6oeU6oeV6oeW6oeX6oeY6oeZ6oea6oeb6oec6oed6oee6oefCivqh6Dqh6Hqh6Lqh6Pqh6Tqh6Xqh6bqh6fqh6jqh6nqh6rqh6vqh6zqh63qh67qh6/qh7Dqh7Hqh7Lqh7Pqh7Tqh7Xqh7bqh7fqh7jqh7nqh7rqh7vqh7zqh73qh77qh78KK+qIgOqIgeqIguqIg+qIhOqIheqIhuqIh+qIiOqIieqIiuqIi+qIjOqIjeqIjuqIj+qIkOqIkeqIkuqIk+qIlOqIleqIluqIl+qImOqImeqImuqIm+qInOqIneqInuqInwor6oig6oih6oii6oij6oik6oil6oim6oin6oio6oip6oiq6oir6ois6oit6oiu6oiv6oiw6oix6oiy6oiz6oi06oi16oi26oi36oi46oi56oi66oi76oi86oi96oi+6oi/CivqiYDqiYHqiYLqiYPqiYTqiYXqiYbqiYfqiYjqiYnqiYrqiYvqiYzqiY3qiY7qiY/qiZDqiZHqiZLqiZPqiZTqiZXqiZbqiZfqiZjqiZnqiZrqiZvqiZzqiZ3qiZ7qiZ8KK+qJoOqJoeqJouqJo+qJpOqJpeqJpuqJp+qJqOqJqeqJquqJq+qJrOqJreqJruqJr+qJsOqJseqJsuqJs+qJtOqJteqJtuqJt+qJuOqJueqJuuqJu+qJvOqJveqJvuqJvwor6oqA6oqB6oqC6oqD6oqE6oqF6oqG6oqH6oqI6oqJ6oqK6oqL6oqM6oqN6oqO6oqP6oqQ6oqR6oqS6oqT6oqU6oqV6oqW6oqX6oqY6oqZ6oqa6oqb6oqc6oqd6oqe6oqfCivqiqDqiqHqiqLqiqPqiqTqiqXqiqbqiqfqiqjqiqnqiqrqiqvqiqzqiq3qiq7qiq/qirDqirHqirLqirPqirTqirXqirbqirfqirjqirnqirrqirvqirzqir3qir7qir8KK+qLgOqLgeqLguqLg+qLhOqLheqLhuqLh+qLiOqLieqLiuqLi+qLjOqLjeqLjuqLj+qLkOqLkeqLkuqLk+qLlOqLleqLluqLl+qLmOqLmeqLmuqLm+qLnOqLneqLnuqLnwor6oug6ouh6oui6ouj6ouk6oul6oum6oun6ouo6oup6ouq6our6ous6out6ouu6ouv6ouw6oux6ouy6ouz6ou06ou16ou26ou36ou46ou56ou66ou76ou86ou96ou+6ou/CivqjIDqjIHqjILqjIPqjITqjIXqjIbqjIfqjIjqjInqjIrqjIvqjIzqjI3qjI7qjI/qjJDqjJHqjJLqjJPqjJTqjJXqjJbqjJfqjJjqjJnqjJrqjJvqjJzqjJ3qjJ7qjJ8KK+qMoOqMoeqMouqMo+qMpOqMpeqMpuqMp+qMqOqMqeqMquqMq+qMrOqMreqMruqMr+qMsOqMseqMsuqMs+qMtOqMteqMtuqMt+qMuOqMueqMuuqMu+qMvOqMveqMvuqMvwor6o2A6o2B6o2C6o2D6o2E6o2F6o2G6o2H6o2I6o2J6o2K6o2L6o2M6o2N6o2O6o2P6o2Q6o2R6o2S6o2T6o2U6o2V6o2W6o2X6o2Y6o2Z6o2a6o2b6o2c6o2d6o2e6o2fCivqjaDqjaHqjaLqjaPqjaTqjaXqjabqjafqjajqjanqjarqjavqjazqja3qja7qja/qjbDqjbHqjbLqjbPqjbTqjbXqjbbqjbfqjbjqjbnqjbrqjbvqjbzqjb3qjb7qjb8KK+qOgOqOgeqOguqOg+qOhOqOheqOhuqOh+qOiOqOieqOiuqOi+qOjOqOjeqOjuqOj+qOkOqOkeqOkuqOk+qOlOqOleqOluqOl+qOmOqOmeqOmuqOm+qOnOqOneqOnuqOnwor6o6g6o6h6o6i6o6j6o6k6o6l6o6m6o6n6o6o6o6p6o6q6o6r6o6s6o6t6o6u6o6v6o6w6o6x6o6y6o6z6o606o616o626o636o646o656o666o676o686o696o6+6o6/Civqj4Dqj4Hqj4Lqj4Pqj4Tqj4Xqj4bqj4fqj4jqj4nqj4rqj4vqj4zqj43qj47qj4/qj5Dqj5Hqj5Lqj5Pqj5Tqj5Xqj5bqj5fqj5jqj5nqj5rqj5vqj5zqj53qj57qj58KK+qPoOqPoeqPouqPo+qPpOqPpeqPpuqPp+qPqOqPqeqPquqPq+qPrOqPreqPruqPr+qPsOqPseqPsuqPs+qPtOqPteqPtuqPt+qPuOqPueqPuuqPu+qPvOqPveqPvuqPvwor6pCA6pCB6pCC6pCD6pCE6pCF6pCG6pCH6pCI6pCJ6pCK6pCL6pCM6pCN6pCO6pCP6pCQ6pCR6pCS6pCT6pCU6pCV6pCW6pCX6pCY6pCZ6pCa6pCb6pCc6pCd6pCe6pCfCivqkKDqkKHqkKLqkKPqkKTqkKXqkKbqkKfqkKjqkKnqkKrqkKvqkKzqkK3qkK7qkK/qkLDqkLHqkLLqkLPqkLTqkLXqkLbqkLfqkLjqkLnqkLrqkLvqkLzqkL3qkL7qkL8KK+qRgOqRgeqRguqRg+qRhOqRheqRhuqRh+qRiOqRieqRiuqRi+qRjOqRjeqRjuqRj+qRkOqRkeqRkuqRk+qRlOqRleqRluqRl+qRmOqRmeqRmuqRm+qRnOqRneqRnuqRnwor6pGg6pGh6pGi6pGj6pGk6pGl6pGm6pGn6pGo6pGp6pGq6pGr6pGs6pGt6pGu6pGv6pGw6pGx6pGy6pGz6pG06pG16pG26pG36pG46pG56pG66pG76pG86pG96pG+6pG/CivqkoDqkoHqkoLqkoPqkoTqkoXqkobqkofqkojqkonqkorqkovqkozqko3qko7qko8KKworWWkgUmFkaWNhbHMgKFUrQTQ5MC1VK0E0Q0YpOgorCivqkpDqkpHqkpLqkpPqkpTqkpXqkpbqkpfqkpjqkpnqkprqkpvqkpzqkp3qkp7qkp/qkqDqkqHqkqLqkqPqkqTqkqXqkqbqkqfqkqjqkqnqkqrqkqvqkqzqkq3qkq7qkq8KK+qSsOqSseqSsuqSs+qStOqSteqStuqSt+qSuOqSueqSuuqSu+qSvOqSveqSvuqSv+qTgOqTgeqTguqTg+qThOqTheqThuqTh+qTiOqTieqTiuqTi+qTjOqTjeqTjuqTjworCitGcmVlIGJsb2NrIChVK0E0RDAtVStBQkZGKToKKwor6pOQ6pOR6pOS6pOT6pOU6pOV6pOW6pOX6pOY6pOZ6pOa6pOb6pOc6pOd6pOe6pOf6pOg6pOh6pOi6pOj6pOk6pOl6pOm6pOn6pOo6pOp6pOq6pOr6pOs6pOt6pOu6pOv6pOw6pOx6pOy6pOz6pO06pO16pO26pO36pO46pO56pO66pO76pO86pO96pO+6pO/6pSA6pSB6pSC6pSD6pSE6pSF6pSG6pSH6pSI6pSJ6pSK6pSL6pSM6pSN6pSO6pSPCivqlJDqlJHqlJLqlJPqlJTqlJXqlJbqlJfqlJjqlJnqlJrqlJvqlJzqlJ3qlJ7qlJ/qlKDqlKHqlKLqlKPqlKTqlKXqlKbqlKfqlKjqlKnqlKrqlKvqlKzqlK3qlK7qlK/qlLDqlLHqlLLqlLPqlLTqlLXqlLbqlLfqlLjqlLnqlLrqlLvqlLzqlL3qlL7qlL/qlYDqlYHqlYLqlYPqlYTqlYXqlYbqlYfqlYjqlYnqlYrqlYvqlYzqlY3qlY7qlY8KK+qVkOqVkeqVkuqVk+qVlOqVleqVluqVl+qVmOqVmeqVmuqVm+qVnOqVneqVnuqVn+qVoOqVoeqVouqVo+qVpOqVpeqVpuqVp+qVqOqVqeqVquqVq+qVrOqVreqVruqVr+qVsOqVseqVsuqVs+qVtOqVteqVtuqVt+qVuOqVueqVuuqVu+qVvOqVveqVvuqVv+qWgOqWgeqWguqWg+qWhOqWheqWhuqWh+qWiOqWieqWiuqWi+qWjOqWjeqWjuqWjwor6paQ6paR6paS6paT6paU6paV6paW6paX6paY6paZ6paa6pab6pac6pad6pae6paf6pag6pah6pai6paj6pak6pal6pam6pan6pao6pap6paq6par6pas6pat6pau6pav6paw6pax6pay6paz6pa06pa16pa26pa36pa46pa56pa66pa76pa86pa96pa+6pa/6peA6peB6peC6peD6peE6peF6peG6peH6peI6peJ6peK6peL6peM6peN6peO6pePCivql5Dql5Hql5Lql5Pql5Tql5Xql5bql5fql5jql5nql5rql5vql5zql53ql57ql5/ql6Dql6Hql6Lql6Pql6Tql6Xql6bql6fql6jql6nql6rql6vql6zql63ql67ql6/ql7Dql7Hql7Lql7Pql7Tql7Xql7bql7fql7jql7nql7rql7vql7zql73ql77ql7/qmIDqmIHqmILqmIPqmITqmIXqmIbqmIfqmIjqmInqmIrqmIvqmIzqmI3qmI7qmI8KK+qYkOqYkeqYkuqYk+qYlOqYleqYluqYl+qYmOqYmeqYmuqYm+qYnOqYneqYnuqYn+qYoOqYoeqYouqYo+qYpOqYpeqYpuqYp+qYqOqYqeqYquqYq+qYrOqYreqYruqYr+qYsOqYseqYsuqYs+qYtOqYteqYtuqYt+qYuOqYueqYuuqYu+qYvOqYveqYvuqYv+qZgOqZgeqZguqZg+qZhOqZheqZhuqZh+qZiOqZieqZiuqZi+qZjOqZjeqZjuqZjwor6pmQ6pmR6pmS6pmT6pmU6pmV6pmW6pmX6pmY6pmZ6pma6pmb6pmc6pmd6pme6pmf6pmg6pmh6pmi6pmj6pmk6pml6pmm6pmn6pmo6pmp6pmq6pmr6pms6pmt6pmu6pmv6pmw6pmx6pmy6pmz6pm06pm16pm26pm36pm46pm56pm66pm76pm86pm96pm+6pm/6pqA6pqB6pqC6pqD6pqE6pqF6pqG6pqH6pqI6pqJ6pqK6pqL6pqM6pqN6pqO6pqPCivqmpDqmpHqmpLqmpPqmpTqmpXqmpbqmpfqmpjqmpnqmprqmpvqmpzqmp3qmp7qmp/qmqDqmqHqmqLqmqPqmqTqmqXqmqbqmqfqmqjqmqnqmqrqmqvqmqzqmq3qmq7qmq/qmrDqmrHqmrLqmrPqmrTqmrXqmrbqmrfqmrjqmrnqmrrqmrvqmrzqmr3qmr7qmr/qm4Dqm4Hqm4Lqm4Pqm4Tqm4Xqm4bqm4fqm4jqm4nqm4rqm4vqm4zqm43qm47qm48KK+qbkOqbkeqbkuqbk+qblOqbleqbluqbl+qbmOqbmeqbmuqbm+qbnOqbneqbnuqbn+qboOqboeqbouqbo+qbpOqbpeqbpuqbp+qbqOqbqeqbquqbq+qbrOqbreqbruqbr+qbsOqbseqbsuqbs+qbtOqbteqbtuqbt+qbuOqbueqbuuqbu+qbvOqbveqbvuqbv+qcgOqcgeqcguqcg+qchOqcheqchuqch+qciOqcieqciuqci+qcjOqcjeqcjuqcjwor6pyQ6pyR6pyS6pyT6pyU6pyV6pyW6pyX6pyY6pyZ6pya6pyb6pyc6pyd6pye6pyf6pyg6pyh6pyi6pyj6pyk6pyl6pym6pyn6pyo6pyp6pyq6pyr6pys6pyt6pyu6pyv6pyw6pyx6pyy6pyz6py06py16py26py36py46py56py66py76py86py96py+6py/6p2A6p2B6p2C6p2D6p2E6p2F6p2G6p2H6p2I6p2J6p2K6p2L6p2M6p2N6p2O6p2PCivqnZDqnZHqnZLqnZPqnZTqnZXqnZbqnZfqnZjqnZnqnZrqnZvqnZzqnZ3qnZ7qnZ/qnaDqnaHqnaLqnaPqnaTqnaXqnabqnafqnajqnanqnarqnavqnazqna3qna7qna/qnbDqnbHqnbLqnbPqnbTqnbXqnbbqnbfqnbjqnbnqnbrqnbvqnbzqnb3qnb7qnb/qnoDqnoHqnoLqnoPqnoTqnoXqnobqnofqnojqnonqnorqnovqnozqno3qno7qno8KK+qekOqekeqekuqek+qelOqeleqeluqel+qemOqemeqemuqem+qenOqeneqenuqen+qeoOqeoeqeouqeo+qepOqepeqepuqep+qeqOqeqeqequqeq+qerOqereqeruqer+qesOqeseqesuqes+qetOqeteqetuqet+qeuOqeueqeuuqeu+qevOqeveqevuqev+qfgOqfgeqfguqfg+qfhOqfheqfhuqfh+qfiOqfieqfiuqfi+qfjOqfjeqfjuqfjwor6p+Q6p+R6p+S6p+T6p+U6p+V6p+W6p+X6p+Y6p+Z6p+a6p+b6p+c6p+d6p+e6p+f6p+g6p+h6p+i6p+j6p+k6p+l6p+m6p+n6p+o6p+p6p+q6p+r6p+s6p+t6p+u6p+v6p+w6p+x6p+y6p+z6p+06p+16p+26p+36p+46p+56p+66p+76p+86p+96p++6p+/6qCA6qCB6qCC6qCD6qCE6qCF6qCG6qCH6qCI6qCJ6qCK6qCL6qCM6qCN6qCO6qCPCivqoJDqoJHqoJLqoJPqoJTqoJXqoJbqoJfqoJjqoJnqoJrqoJvqoJzqoJ3qoJ7qoJ/qoKDqoKHqoKLqoKPqoKTqoKXqoKbqoKfqoKjqoKnqoKrqoKvqoKzqoK3qoK7qoK/qoLDqoLHqoLLqoLPqoLTqoLXqoLbqoLfqoLjqoLnqoLrqoLvqoLzqoL3qoL7qoL/qoYDqoYHqoYLqoYPqoYTqoYXqoYbqoYfqoYjqoYnqoYrqoYvqoYzqoY3qoY7qoY8KK+qhkOqhkeqhkuqhk+qhlOqhleqhluqhl+qhmOqhmeqhmuqhm+qhnOqhneqhnuqhn+qhoOqhoeqhouqho+qhpOqhpeqhpuqhp+qhqOqhqeqhquqhq+qhrOqhreqhruqhr+qhsOqhseqhsuqhs+qhtOqhteqhtuqht+qhuOqhueqhuuqhu+qhvOqhveqhvuqhv+qigOqigeqiguqig+qihOqiheqihuqih+qiiOqiieqiiuqii+qijOqijeqijuqijwor6qKQ6qKR6qKS6qKT6qKU6qKV6qKW6qKX6qKY6qKZ6qKa6qKb6qKc6qKd6qKe6qKf6qKg6qKh6qKi6qKj6qKk6qKl6qKm6qKn6qKo6qKp6qKq6qKr6qKs6qKt6qKu6qKv6qKw6qKx6qKy6qKz6qK06qK16qK26qK36qK46qK56qK66qK76qK86qK96qK+6qK/6qOA6qOB6qOC6qOD6qOE6qOF6qOG6qOH6qOI6qOJ6qOK6qOL6qOM6qON6qOO6qOPCivqo5Dqo5Hqo5Lqo5Pqo5Tqo5Xqo5bqo5fqo5jqo5nqo5rqo5vqo5zqo53qo57qo5/qo6Dqo6Hqo6Lqo6Pqo6Tqo6Xqo6bqo6fqo6jqo6nqo6rqo6vqo6zqo63qo67qo6/qo7Dqo7Hqo7Lqo7Pqo7Tqo7Xqo7bqo7fqo7jqo7nqo7rqo7vqo7zqo73qo77qo7/qpIDqpIHqpILqpIPqpITqpIXqpIbqpIfqpIjqpInqpIrqpIvqpIzqpI3qpI7qpI8KK+qkkOqkkeqkkuqkk+qklOqkleqkluqkl+qkmOqkmeqkmuqkm+qknOqkneqknuqkn+qkoOqkoeqkouqko+qkpOqkpeqkpuqkp+qkqOqkqeqkquqkq+qkrOqkreqkruqkr+qksOqkseqksuqks+qktOqkteqktuqkt+qkuOqkueqkuuqku+qkvOqkveqkvuqkv+qlgOqlgeqlguqlg+qlhOqlheqlhuqlh+qliOqlieqliuqli+qljOqljeqljuqljwor6qWQ6qWR6qWS6qWT6qWU6qWV6qWW6qWX6qWY6qWZ6qWa6qWb6qWc6qWd6qWe6qWf6qWg6qWh6qWi6qWj6qWk6qWl6qWm6qWn6qWo6qWp6qWq6qWr6qWs6qWt6qWu6qWv6qWw6qWx6qWy6qWz6qW06qW16qW26qW36qW46qW56qW66qW76qW86qW96qW+6qW/6qaA6qaB6qaC6qaD6qaE6qaF6qaG6qaH6qaI6qaJ6qaK6qaL6qaM6qaN6qaO6qaPCivqppDqppHqppLqppPqppTqppXqppbqppfqppjqppnqpprqppvqppzqpp3qpp7qpp/qpqDqpqHqpqLqpqPqpqTqpqXqpqbqpqfqpqjqpqnqpqrqpqvqpqzqpq3qpq7qpq/qprDqprHqprLqprPqprTqprXqprbqprfqprjqprnqprrqprvqprzqpr3qpr7qpr/qp4Dqp4Hqp4Lqp4Pqp4Tqp4Xqp4bqp4fqp4jqp4nqp4rqp4vqp4zqp43qp47qp48KK+qnkOqnkeqnkuqnk+qnlOqnleqnluqnl+qnmOqnmeqnmuqnm+qnnOqnneqnnuqnn+qnoOqnoeqnouqno+qnpOqnpeqnpuqnp+qnqOqnqeqnquqnq+qnrOqnreqnruqnr+qnsOqnseqnsuqns+qntOqnteqntuqnt+qnuOqnueqnuuqnu+qnvOqnveqnvuqnv+qogOqogeqoguqog+qohOqoheqohuqoh+qoiOqoieqoiuqoi+qojOqojeqojuqojwor6qiQ6qiR6qiS6qiT6qiU6qiV6qiW6qiX6qiY6qiZ6qia6qib6qic6qid6qie6qif6qig6qih6qii6qij6qik6qil6qim6qin6qio6qip6qiq6qir6qis6qit6qiu6qiv6qiw6qix6qiy6qiz6qi06qi16qi26qi36qi46qi56qi66qi76qi86qi96qi+6qi/6qmA6qmB6qmC6qmD6qmE6qmF6qmG6qmH6qmI6qmJ6qmK6qmL6qmM6qmN6qmO6qmPCivqqZDqqZHqqZLqqZPqqZTqqZXqqZbqqZfqqZjqqZnqqZrqqZvqqZzqqZ3qqZ7qqZ/qqaDqqaHqqaLqqaPqqaTqqaXqqabqqafqqajqqanqqarqqavqqazqqa3qqa7qqa/qqbDqqbHqqbLqqbPqqbTqqbXqqbbqqbfqqbjqqbnqqbrqqbvqqbzqqb3qqb7qqb/qqoDqqoHqqoLqqoPqqoTqqoXqqobqqofqqojqqonqqorqqovqqozqqo3qqo7qqo8KK+qqkOqqkeqqkuqqk+qqlOqqleqqluqql+qqmOqqmeqqmuqqm+qqnOqqneqqnuqqn+qqoOqqoeqqouqqo+qqpOqqpeqqpuqqp+qqqOqqqeqqquqqq+qqrOqqreqqruqqr+qqsOqqseqqsuqqs+qqtOqqteqqtuqqt+qquOqqueqquuqqu+qqvOqqveqqvuqqv+qrgOqrgeqrguqrg+qrhOqrheqrhuqrh+qriOqrieqriuqri+qrjOqrjeqrjuqrjwor6quQ6quR6quS6quT6quU6quV6quW6quX6quY6quZ6qua6qub6quc6qud6que6quf6qug6quh6qui6quj6quk6qul6qum6qun6quo6qup6quq6qur6qus6qut6quu6quv6quw6qux6quy6quz6qu06qu16qu26qu36qu46qu56qu66qu76qu86qu96qu+6qu/6qyA6qyB6qyC6qyD6qyE6qyF6qyG6qyH6qyI6qyJ6qyK6qyL6qyM6qyN6qyO6qyPCivqrJDqrJHqrJLqrJPqrJTqrJXqrJbqrJfqrJjqrJnqrJrqrJvqrJzqrJ3qrJ7qrJ/qrKDqrKHqrKLqrKPqrKTqrKXqrKbqrKfqrKjqrKnqrKrqrKvqrKzqrK3qrK7qrK/qrLDqrLHqrLLqrLPqrLTqrLXqrLbqrLfqrLjqrLnqrLrqrLvqrLzqrL3qrL7qrL/qrYDqrYHqrYLqrYPqrYTqrYXqrYbqrYfqrYjqrYnqrYrqrYvqrYzqrY3qrY7qrY8KK+qtkOqtkeqtkuqtk+qtlOqtleqtluqtl+qtmOqtmeqtmuqtm+qtnOqtneqtnuqtn+qtoOqtoeqtouqto+qtpOqtpeqtpuqtp+qtqOqtqeqtquqtq+qtrOqtreqtruqtr+qtsOqtseqtsuqts+qttOqtteqttuqtt+qtuOqtueqtuuqtu+qtvOqtveqtvuqtv+qugOqugequguqug+quhOquhequhuquh+quiOquiequiuqui+qujOqujequjuqujwor6q6Q6q6R6q6S6q6T6q6U6q6V6q6W6q6X6q6Y6q6Z6q6a6q6b6q6c6q6d6q6e6q6f6q6g6q6h6q6i6q6j6q6k6q6l6q6m6q6n6q6o6q6p6q6q6q6r6q6s6q6t6q6u6q6v6q6w6q6x6q6y6q6z6q606q616q626q636q646q656q666q676q686q696q6+6q6/6q+A6q+B6q+C6q+D6q+E6q+F6q+G6q+H6q+I6q+J6q+K6q+L6q+M6q+N6q+O6q+PCivqr5Dqr5Hqr5Lqr5Pqr5Tqr5Xqr5bqr5fqr5jqr5nqr5rqr5vqr5zqr53qr57qr5/qr6Dqr6Hqr6Lqr6Pqr6Tqr6Xqr6bqr6fqr6jqr6nqr6rqr6vqr6zqr63qr67qr6/qr7Dqr7Hqr7Lqr7Pqr7Tqr7Xqr7bqr7fqr7jqr7nqr7rqr7vqr7zqr73qr77qr78KKworSGFuZ3VsIFN5bGxhYmxlcyAoVStBQzAwLVUrRDdBRik6CisKK+qwgOqwgeqwguqwg+qwhOqwheqwhuqwh+qwiOqwieqwiuqwi+qwjOqwjeqwjuqwj+qwkOqwkeqwkuqwk+qwlOqwleqwluqwl+qwmOqwmeqwmuqwm+qwnOqwneqwnuqwnwor6rCg6rCh6rCi6rCj6rCk6rCl6rCm6rCn6rCo6rCp6rCq6rCr6rCs6rCt6rCu6rCv6rCw6rCx6rCy6rCz6rC06rC16rC26rC36rC46rC56rC66rC76rC86rC96rC+6rC/CivqsYDqsYHqsYLqsYPqsYTqsYXqsYbqsYfqsYjqsYnqsYrqsYvqsYzqsY3qsY7qsY/qsZDqsZHqsZLqsZPqsZTqsZXqsZbqsZfqsZjqsZnqsZrqsZvqsZzqsZ3qsZ7qsZ8KK+qxoOqxoeqxouqxo+qxpOqxpeqxpuqxp+qxqOqxqeqxquqxq+qxrOqxreqxruqxr+qxsOqxseqxsuqxs+qxtOqxteqxtuqxt+qxuOqxueqxuuqxu+qxvOqxveqxvuqxvwor6rKA6rKB6rKC6rKD6rKE6rKF6rKG6rKH6rKI6rKJ6rKK6rKL6rKM6rKN6rKO6rKP6rKQ6rKR6rKS6rKT6rKU6rKV6rKW6rKX6rKY6rKZ6rKa6rKb6rKc6rKd6rKe6rKfCivqsqDqsqHqsqLqsqPqsqTqsqXqsqbqsqfqsqjqsqnqsqrqsqvqsqzqsq3qsq7qsq/qsrDqsrHqsrLqsrPqsrTqsrXqsrbqsrfqsrjqsrnqsrrqsrvqsrzqsr3qsr7qsr8KK+qzgOqzgeqzguqzg+qzhOqzheqzhuqzh+qziOqzieqziuqzi+qzjOqzjeqzjuqzj+qzkOqzkeqzkuqzk+qzlOqzleqzluqzl+qzmOqzmeqzmuqzm+qznOqzneqznuqznwor6rOg6rOh6rOi6rOj6rOk6rOl6rOm6rOn6rOo6rOp6rOq6rOr6rOs6rOt6rOu6rOv6rOw6rOx6rOy6rOz6rO06rO16rO26rO36rO46rO56rO66rO76rO86rO96rO+6rO/CivqtIDqtIHqtILqtIPqtITqtIXqtIbqtIfqtIjqtInqtIrqtIvqtIzqtI3qtI7qtI/qtJDqtJHqtJLqtJPqtJTqtJXqtJbqtJfqtJjqtJnqtJrqtJvqtJzqtJ3qtJ7qtJ8KK+q0oOq0oeq0ouq0o+q0pOq0peq0puq0p+q0qOq0qeq0quq0q+q0rOq0req0ruq0r+q0sOq0seq0suq0s+q0tOq0teq0tuq0t+q0uOq0ueq0uuq0u+q0vOq0veq0vuq0vwor6rWA6rWB6rWC6rWD6rWE6rWF6rWG6rWH6rWI6rWJ6rWK6rWL6rWM6rWN6rWO6rWP6rWQ6rWR6rWS6rWT6rWU6rWV6rWW6rWX6rWY6rWZ6rWa6rWb6rWc6rWd6rWe6rWfCivqtaDqtaHqtaLqtaPqtaTqtaXqtabqtafqtajqtanqtarqtavqtazqta3qta7qta/qtbDqtbHqtbLqtbPqtbTqtbXqtbbqtbfqtbjqtbnqtbrqtbvqtbzqtb3qtb7qtb8KK+q2gOq2geq2guq2g+q2hOq2heq2huq2h+q2iOq2ieq2iuq2i+q2jOq2jeq2juq2j+q2kOq2keq2kuq2k+q2lOq2leq2luq2l+q2mOq2meq2muq2m+q2nOq2neq2nuq2nwor6rag6rah6rai6raj6rak6ral6ram6ran6rao6rap6raq6rar6ras6rat6rau6rav6raw6rax6ray6raz6ra06ra16ra26ra36ra46ra56ra66ra76ra86ra96ra+6ra/Civqt4Dqt4Hqt4Lqt4Pqt4Tqt4Xqt4bqt4fqt4jqt4nqt4rqt4vqt4zqt43qt47qt4/qt5Dqt5Hqt5Lqt5Pqt5Tqt5Xqt5bqt5fqt5jqt5nqt5rqt5vqt5zqt53qt57qt58KK+q3oOq3oeq3ouq3o+q3pOq3peq3puq3p+q3qOq3qeq3quq3q+q3rOq3req3ruq3r+q3sOq3seq3suq3s+q3tOq3teq3tuq3t+q3uOq3ueq3uuq3u+q3vOq3veq3vuq3vwor6riA6riB6riC6riD6riE6riF6riG6riH6riI6riJ6riK6riL6riM6riN6riO6riP6riQ6riR6riS6riT6riU6riV6riW6riX6riY6riZ6ria6rib6ric6rid6rie6rifCivquKDquKHquKLquKPquKTquKXquKbquKfquKjquKnquKrquKvquKzquK3quK7quK/quLDquLHquLLquLPquLTquLXquLbquLfquLjquLnquLrquLvquLzquL3quL7quL8KK+q5gOq5geq5guq5g+q5hOq5heq5huq5h+q5iOq5ieq5iuq5i+q5jOq5jeq5juq5j+q5kOq5keq5kuq5k+q5lOq5leq5luq5l+q5mOq5meq5muq5m+q5nOq5neq5nuq5nwor6rmg6rmh6rmi6rmj6rmk6rml6rmm6rmn6rmo6rmp6rmq6rmr6rms6rmt6rmu6rmv6rmw6rmx6rmy6rmz6rm06rm16rm26rm36rm46rm56rm66rm76rm86rm96rm+6rm/CivquoDquoHquoLquoPquoTquoXquobquofquojquonquorquovquozquo3quo7quo/qupDqupHqupLqupPqupTqupXqupbqupfqupjqupnquprqupvqupzqup3qup7qup8KK+q6oOq6oeq6ouq6o+q6pOq6peq6puq6p+q6qOq6qeq6quq6q+q6rOq6req6ruq6r+q6sOq6seq6suq6s+q6tOq6teq6tuq6t+q6uOq6ueq6uuq6u+q6vOq6veq6vuq6vwor6ruA6ruB6ruC6ruD6ruE6ruF6ruG6ruH6ruI6ruJ6ruK6ruL6ruM6ruN6ruO6ruP6ruQ6ruR6ruS6ruT6ruU6ruV6ruW6ruX6ruY6ruZ6rua6rub6ruc6rud6rue6rufCivqu6Dqu6Hqu6Lqu6Pqu6Tqu6Xqu6bqu6fqu6jqu6nqu6rqu6vqu6zqu63qu67qu6/qu7Dqu7Hqu7Lqu7Pqu7Tqu7Xqu7bqu7fqu7jqu7nqu7rqu7vqu7zqu73qu77qu78KK+q8gOq8geq8guq8g+q8hOq8heq8huq8h+q8iOq8ieq8iuq8i+q8jOq8jeq8juq8j+q8kOq8keq8kuq8k+q8lOq8leq8luq8l+q8mOq8meq8muq8m+q8nOq8neq8nuq8nwor6ryg6ryh6ryi6ryj6ryk6ryl6rym6ryn6ryo6ryp6ryq6ryr6rys6ryt6ryu6ryv6ryw6ryx6ryy6ryz6ry06ry16ry26ry36ry46ry56ry66ry76ry86ry96ry+6ry/CivqvYDqvYHqvYLqvYPqvYTqvYXqvYbqvYfqvYjqvYnqvYrqvYvqvYzqvY3qvY7qvY/qvZDqvZHqvZLqvZPqvZTqvZXqvZbqvZfqvZjqvZnqvZrqvZvqvZzqvZ3qvZ7qvZ8KK+q9oOq9oeq9ouq9o+q9pOq9peq9puq9p+q9qOq9qeq9quq9q+q9rOq9req9ruq9r+q9sOq9seq9suq9s+q9tOq9teq9tuq9t+q9uOq9ueq9uuq9u+q9vOq9veq9vuq9vwor6r6A6r6B6r6C6r6D6r6E6r6F6r6G6r6H6r6I6r6J6r6K6r6L6r6M6r6N6r6O6r6P6r6Q6r6R6r6S6r6T6r6U6r6V6r6W6r6X6r6Y6r6Z6r6a6r6b6r6c6r6d6r6e6r6fCivqvqDqvqHqvqLqvqPqvqTqvqXqvqbqvqfqvqjqvqnqvqrqvqvqvqzqvq3qvq7qvq/qvrDqvrHqvrLqvrPqvrTqvrXqvrbqvrfqvrjqvrnqvrrqvrvqvrzqvr3qvr7qvr8KK+q/gOq/geq/guq/g+q/hOq/heq/huq/h+q/iOq/ieq/iuq/i+q/jOq/jeq/juq/j+q/kOq/keq/kuq/k+q/lOq/leq/luq/l+q/mOq/meq/muq/m+q/nOq/neq/nuq/nwor6r+g6r+h6r+i6r+j6r+k6r+l6r+m6r+n6r+o6r+p6r+q6r+r6r+s6r+t6r+u6r+v6r+w6r+x6r+y6r+z6r+06r+16r+26r+36r+46r+56r+66r+76r+86r+96r++6r+/CivrgIDrgIHrgILrgIPrgITrgIXrgIbrgIfrgIjrgInrgIrrgIvrgIzrgI3rgI7rgI/rgJDrgJHrgJLrgJPrgJTrgJXrgJbrgJfrgJjrgJnrgJrrgJvrgJzrgJ3rgJ7rgJ8KK+uAoOuAoeuAouuAo+uApOuApeuApuuAp+uAqOuAqeuAquuAq+uArOuAreuAruuAr+uAsOuAseuAsuuAs+uAtOuAteuAtuuAt+uAuOuAueuAuuuAu+uAvOuAveuAvuuAvwor64GA64GB64GC64GD64GE64GF64GG64GH64GI64GJ64GK64GL64GM64GN64GO64GP64GQ64GR64GS64GT64GU64GV64GW64GX64GY64GZ64Ga64Gb64Gc64Gd64Ge64GfCivrgaDrgaHrgaLrgaPrgaTrgaXrgabrgafrgajrganrgarrgavrgazrga3rga7rga/rgbDrgbHrgbLrgbPrgbTrgbXrgbbrgbfrgbjrgbnrgbrrgbvrgbzrgb3rgb7rgb8KK+uCgOuCgeuCguuCg+uChOuCheuChuuCh+uCiOuCieuCiuuCi+uCjOuCjeuCjuuCj+uCkOuCkeuCkuuCk+uClOuCleuCluuCl+uCmOuCmeuCmuuCm+uCnOuCneuCnuuCnwor64Kg64Kh64Ki64Kj64Kk64Kl64Km64Kn64Ko64Kp64Kq64Kr64Ks64Kt64Ku64Kv64Kw64Kx64Ky64Kz64K064K164K264K364K464K564K664K764K864K964K+64K/Civrg4Drg4Hrg4Lrg4Prg4Trg4Xrg4brg4frg4jrg4nrg4rrg4vrg4zrg43rg47rg4/rg5Drg5Hrg5Lrg5Prg5Trg5Xrg5brg5frg5jrg5nrg5rrg5vrg5zrg53rg57rg58KK+uDoOuDoeuDouuDo+uDpOuDpeuDpuuDp+uDqOuDqeuDquuDq+uDrOuDreuDruuDr+uDsOuDseuDsuuDs+uDtOuDteuDtuuDt+uDuOuDueuDuuuDu+uDvOuDveuDvuuDvwor64SA64SB64SC64SD64SE64SF64SG64SH64SI64SJ64SK64SL64SM64SN64SO64SP64SQ64SR64SS64ST64SU64SV64SW64SX64SY64SZ64Sa64Sb64Sc64Sd64Se64SfCivrhKDrhKHrhKLrhKPrhKTrhKXrhKbrhKfrhKjrhKnrhKrrhKvrhKzrhK3rhK7rhK/rhLDrhLHrhLLrhLPrhLTrhLXrhLbrhLfrhLjrhLnrhLrrhLvrhLzrhL3rhL7rhL8KK+uFgOuFgeuFguuFg+uFhOuFheuFhuuFh+uFiOuFieuFiuuFi+uFjOuFjeuFjuuFj+uFkOuFkeuFkuuFk+uFlOuFleuFluuFl+uFmOuFmeuFmuuFm+uFnOuFneuFnuuFnwor64Wg64Wh64Wi64Wj64Wk64Wl64Wm64Wn64Wo64Wp64Wq64Wr64Ws64Wt64Wu64Wv64Ww64Wx64Wy64Wz64W064W164W264W364W464W564W664W764W864W964W+64W/CivrhoDrhoHrhoLrhoPrhoTrhoXrhobrhofrhojrhonrhorrhovrhozrho3rho7rho/rhpDrhpHrhpLrhpPrhpTrhpXrhpbrhpfrhpjrhpnrhprrhpvrhpzrhp3rhp7rhp8KK+uGoOuGoeuGouuGo+uGpOuGpeuGpuuGp+uGqOuGqeuGquuGq+uGrOuGreuGruuGr+uGsOuGseuGsuuGs+uGtOuGteuGtuuGt+uGuOuGueuGuuuGu+uGvOuGveuGvuuGvwor64eA64eB64eC64eD64eE64eF64eG64eH64eI64eJ64eK64eL64eM64eN64eO64eP64eQ64eR64eS64eT64eU64eV64eW64eX64eY64eZ64ea64eb64ec64ed64ee64efCivrh6Drh6Hrh6Lrh6Prh6Trh6Xrh6brh6frh6jrh6nrh6rrh6vrh6zrh63rh67rh6/rh7Drh7Hrh7Lrh7Prh7Trh7Xrh7brh7frh7jrh7nrh7rrh7vrh7zrh73rh77rh78KK+uIgOuIgeuIguuIg+uIhOuIheuIhuuIh+uIiOuIieuIiuuIi+uIjOuIjeuIjuuIj+uIkOuIkeuIkuuIk+uIlOuIleuIluuIl+uImOuImeuImuuIm+uInOuIneuInuuInwor64ig64ih64ii64ij64ik64il64im64in64io64ip64iq64ir64is64it64iu64iv64iw64ix64iy64iz64i064i164i264i364i464i564i664i764i864i964i+64i/CivriYDriYHriYLriYPriYTriYXriYbriYfriYjriYnriYrriYvriYzriY3riY7riY/riZDriZHriZLriZPriZTriZXriZbriZfriZjriZnriZrriZvriZzriZ3riZ7riZ8KK+uJoOuJoeuJouuJo+uJpOuJpeuJpuuJp+uJqOuJqeuJquuJq+uJrOuJreuJruuJr+uJsOuJseuJsuuJs+uJtOuJteuJtuuJt+uJuOuJueuJuuuJu+uJvOuJveuJvuuJvwor64qA64qB64qC64qD64qE64qF64qG64qH64qI64qJ64qK64qL64qM64qN64qO64qP64qQ64qR64qS64qT64qU64qV64qW64qX64qY64qZ64qa64qb64qc64qd64qe64qfCivriqDriqHriqLriqPriqTriqXriqbriqfriqjriqnriqrriqvriqzriq3riq7riq/rirDrirHrirLrirPrirTrirXrirbrirfrirjrirnrirrrirvrirzrir3rir7rir8KK+uLgOuLgeuLguuLg+uLhOuLheuLhuuLh+uLiOuLieuLiuuLi+uLjOuLjeuLjuuLj+uLkOuLkeuLkuuLk+uLlOuLleuLluuLl+uLmOuLmeuLmuuLm+uLnOuLneuLnuuLnwor64ug64uh64ui64uj64uk64ul64um64un64uo64up64uq64ur64us64ut64uu64uv64uw64ux64uy64uz64u064u164u264u364u464u564u664u764u864u964u+64u/CivrjIDrjIHrjILrjIPrjITrjIXrjIbrjIfrjIjrjInrjIrrjIvrjIzrjI3rjI7rjI/rjJDrjJHrjJLrjJPrjJTrjJXrjJbrjJfrjJjrjJnrjJrrjJvrjJzrjJ3rjJ7rjJ8KK+uMoOuMoeuMouuMo+uMpOuMpeuMpuuMp+uMqOuMqeuMquuMq+uMrOuMreuMruuMr+uMsOuMseuMsuuMs+uMtOuMteuMtuuMt+uMuOuMueuMuuuMu+uMvOuMveuMvuuMvwor642A642B642C642D642E642F642G642H642I642J642K642L642M642N642O642P642Q642R642S642T642U642V642W642X642Y642Z642a642b642c642d642e642fCivrjaDrjaHrjaLrjaPrjaTrjaXrjabrjafrjajrjanrjarrjavrjazrja3rja7rja/rjbDrjbHrjbLrjbPrjbTrjbXrjbbrjbfrjbjrjbnrjbrrjbvrjbzrjb3rjb7rjb8KK+uOgOuOgeuOguuOg+uOhOuOheuOhuuOh+uOiOuOieuOiuuOi+uOjOuOjeuOjuuOj+uOkOuOkeuOkuuOk+uOlOuOleuOluuOl+uOmOuOmeuOmuuOm+uOnOuOneuOnuuOnwor646g646h646i646j646k646l646m646n646o646p646q646r646s646t646u646v646w646x646y646z6460646164626463646464656466646764686469646+646/Civrj4Drj4Hrj4Lrj4Prj4Trj4Xrj4brj4frj4jrj4nrj4rrj4vrj4zrj43rj47rj4/rj5Drj5Hrj5Lrj5Prj5Trj5Xrj5brj5frj5jrj5nrj5rrj5vrj5zrj53rj57rj58KK+uPoOuPoeuPouuPo+uPpOuPpeuPpuuPp+uPqOuPqeuPquuPq+uPrOuPreuPruuPr+uPsOuPseuPsuuPs+uPtOuPteuPtuuPt+uPuOuPueuPuuuPu+uPvOuPveuPvuuPvwor65CA65CB65CC65CD65CE65CF65CG65CH65CI65CJ65CK65CL65CM65CN65CO65CP65CQ65CR65CS65CT65CU65CV65CW65CX65CY65CZ65Ca65Cb65Cc65Cd65Ce65CfCivrkKDrkKHrkKLrkKPrkKTrkKXrkKbrkKfrkKjrkKnrkKrrkKvrkKzrkK3rkK7rkK/rkLDrkLHrkLLrkLPrkLTrkLXrkLbrkLfrkLjrkLnrkLrrkLvrkLzrkL3rkL7rkL8KK+uRgOuRgeuRguuRg+uRhOuRheuRhuuRh+uRiOuRieuRiuuRi+uRjOuRjeuRjuuRj+uRkOuRkeuRkuuRk+uRlOuRleuRluuRl+uRmOuRmeuRmuuRm+uRnOuRneuRnuuRnwor65Gg65Gh65Gi65Gj65Gk65Gl65Gm65Gn65Go65Gp65Gq65Gr65Gs65Gt65Gu65Gv65Gw65Gx65Gy65Gz65G065G165G265G365G465G565G665G765G865G965G+65G/CivrkoDrkoHrkoLrkoPrkoTrkoXrkobrkofrkojrkonrkorrkovrkozrko3rko7rko/rkpDrkpHrkpLrkpPrkpTrkpXrkpbrkpfrkpjrkpnrkprrkpvrkpzrkp3rkp7rkp8KK+uSoOuSoeuSouuSo+uSpOuSpeuSpuuSp+uSqOuSqeuSquuSq+uSrOuSreuSruuSr+uSsOuSseuSsuuSs+uStOuSteuStuuSt+uSuOuSueuSuuuSu+uSvOuSveuSvuuSvwor65OA65OB65OC65OD65OE65OF65OG65OH65OI65OJ65OK65OL65OM65ON65OO65OP65OQ65OR65OS65OT65OU65OV65OW65OX65OY65OZ65Oa65Ob65Oc65Od65Oe65OfCivrk6Drk6Hrk6Lrk6Prk6Trk6Xrk6brk6frk6jrk6nrk6rrk6vrk6zrk63rk67rk6/rk7Drk7Hrk7Lrk7Prk7Trk7Xrk7brk7frk7jrk7nrk7rrk7vrk7zrk73rk77rk78KK+uUgOuUgeuUguuUg+uUhOuUheuUhuuUh+uUiOuUieuUiuuUi+uUjOuUjeuUjuuUj+uUkOuUkeuUkuuUk+uUlOuUleuUluuUl+uUmOuUmeuUmuuUm+uUnOuUneuUnuuUnwor65Sg65Sh65Si65Sj65Sk65Sl65Sm65Sn65So65Sp65Sq65Sr65Ss65St65Su65Sv65Sw65Sx65Sy65Sz65S065S165S265S365S465S565S665S765S865S965S+65S/CivrlYDrlYHrlYLrlYPrlYTrlYXrlYbrlYfrlYjrlYnrlYrrlYvrlYzrlY3rlY7rlY/rlZDrlZHrlZLrlZPrlZTrlZXrlZbrlZfrlZjrlZnrlZrrlZvrlZzrlZ3rlZ7rlZ8KK+uVoOuVoeuVouuVo+uVpOuVpeuVpuuVp+uVqOuVqeuVquuVq+uVrOuVreuVruuVr+uVsOuVseuVsuuVs+uVtOuVteuVtuuVt+uVuOuVueuVuuuVu+uVvOuVveuVvuuVvwor65aA65aB65aC65aD65aE65aF65aG65aH65aI65aJ65aK65aL65aM65aN65aO65aP65aQ65aR65aS65aT65aU65aV65aW65aX65aY65aZ65aa65ab65ac65ad65ae65afCivrlqDrlqHrlqLrlqPrlqTrlqXrlqbrlqfrlqjrlqnrlqrrlqvrlqzrlq3rlq7rlq/rlrDrlrHrlrLrlrPrlrTrlrXrlrbrlrfrlrjrlrnrlrrrlrvrlrzrlr3rlr7rlr8KK+uXgOuXgeuXguuXg+uXhOuXheuXhuuXh+uXiOuXieuXiuuXi+uXjOuXjeuXjuuXj+uXkOuXkeuXkuuXk+uXlOuXleuXluuXl+uXmOuXmeuXmuuXm+uXnOuXneuXnuuXnwor65eg65eh65ei65ej65ek65el65em65en65eo65ep65eq65er65es65et65eu65ev65ew65ex65ey65ez65e065e165e265e365e465e565e665e765e865e965e+65e/CivrmIDrmIHrmILrmIPrmITrmIXrmIbrmIfrmIjrmInrmIrrmIvrmIzrmI3rmI7rmI/rmJDrmJHrmJLrmJPrmJTrmJXrmJbrmJfrmJjrmJnrmJrrmJvrmJzrmJ3rmJ7rmJ8KK+uYoOuYoeuYouuYo+uYpOuYpeuYpuuYp+uYqOuYqeuYquuYq+uYrOuYreuYruuYr+uYsOuYseuYsuuYs+uYtOuYteuYtuuYt+uYuOuYueuYuuuYu+uYvOuYveuYvuuYvwor65mA65mB65mC65mD65mE65mF65mG65mH65mI65mJ65mK65mL65mM65mN65mO65mP65mQ65mR65mS65mT65mU65mV65mW65mX65mY65mZ65ma65mb65mc65md65me65mfCivrmaDrmaHrmaLrmaPrmaTrmaXrmabrmafrmajrmanrmarrmavrmazrma3rma7rma/rmbDrmbHrmbLrmbPrmbTrmbXrmbbrmbfrmbjrmbnrmbrrmbvrmbzrmb3rmb7rmb8KK+uagOuageuaguuag+uahOuaheuahuuah+uaiOuaieuaiuuai+uajOuajeuajuuaj+uakOuakeuakuuak+ualOualeualuual+uamOuameuamuuam+uanOuaneuanuuanwor65qg65qh65qi65qj65qk65ql65qm65qn65qo65qp65qq65qr65qs65qt65qu65qv65qw65qx65qy65qz65q065q165q265q365q465q565q665q765q865q965q+65q/Civrm4Drm4Hrm4Lrm4Prm4Trm4Xrm4brm4frm4jrm4nrm4rrm4vrm4zrm43rm47rm4/rm5Drm5Hrm5Lrm5Prm5Trm5Xrm5brm5frm5jrm5nrm5rrm5vrm5zrm53rm57rm58KK+uboOuboeubouubo+ubpOubpeubpuubp+ubqOubqeubquubq+ubrOubreubruubr+ubsOubseubsuubs+ubtOubteubtuubt+ubuOubueubuuubu+ubvOubveubvuubvwor65yA65yB65yC65yD65yE65yF65yG65yH65yI65yJ65yK65yL65yM65yN65yO65yP65yQ65yR65yS65yT65yU65yV65yW65yX65yY65yZ65ya65yb65yc65yd65ye65yfCivrnKDrnKHrnKLrnKPrnKTrnKXrnKbrnKfrnKjrnKnrnKrrnKvrnKzrnK3rnK7rnK/rnLDrnLHrnLLrnLPrnLTrnLXrnLbrnLfrnLjrnLnrnLrrnLvrnLzrnL3rnL7rnL8KK+udgOudgeudguudg+udhOudheudhuudh+udiOudieudiuudi+udjOudjeudjuudj+udkOudkeudkuudk+udlOudleudluudl+udmOudmeudmuudm+udnOudneudnuudnwor652g652h652i652j652k652l652m652n652o652p652q652r652s652t652u652v652w652x652y652z6520652165226523652465256526652765286529652+652/CivrnoDrnoHrnoLrnoPrnoTrnoXrnobrnofrnojrnonrnorrnovrnozrno3rno7rno/rnpDrnpHrnpLrnpPrnpTrnpXrnpbrnpfrnpjrnpnrnprrnpvrnpzrnp3rnp7rnp8KK+ueoOueoeueouueo+uepOuepeuepuuep+ueqOueqeuequueq+uerOuereueruuer+uesOueseuesuues+uetOueteuetuuet+ueuOueueueuuueu+uevOueveuevuuevwor65+A65+B65+C65+D65+E65+F65+G65+H65+I65+J65+K65+L65+M65+N65+O65+P65+Q65+R65+S65+T65+U65+V65+W65+X65+Y65+Z65+a65+b65+c65+d65+e65+fCivrn6Drn6Hrn6Lrn6Prn6Trn6Xrn6brn6frn6jrn6nrn6rrn6vrn6zrn63rn67rn6/rn7Drn7Hrn7Lrn7Prn7Trn7Xrn7brn7frn7jrn7nrn7rrn7vrn7zrn73rn77rn78KK+uggOuggeugguugg+ughOugheughuugh+ugiOugieugiuugi+ugjOugjeugjuugj+ugkOugkeugkuugk+uglOugleugluugl+ugmOugmeugmuugm+ugnOugneugnuugnwor66Cg66Ch66Ci66Cj66Ck66Cl66Cm66Cn66Co66Cp66Cq66Cr66Cs66Ct66Cu66Cv66Cw66Cx66Cy66Cz66C066C166C266C366C466C566C666C766C866C966C+66C/CivroYDroYHroYLroYProYTroYXroYbroYfroYjroYnroYrroYvroYzroY3roY7roY/roZDroZHroZLroZProZTroZXroZbroZfroZjroZnroZrroZvroZzroZ3roZ7roZ8KK+uhoOuhoeuhouuho+uhpOuhpeuhpuuhp+uhqOuhqeuhquuhq+uhrOuhreuhruuhr+uhsOuhseuhsuuhs+uhtOuhteuhtuuht+uhuOuhueuhuuuhu+uhvOuhveuhvuuhvwor66KA66KB66KC66KD66KE66KF66KG66KH66KI66KJ66KK66KL66KM66KN66KO66KP66KQ66KR66KS66KT66KU66KV66KW66KX66KY66KZ66Ka66Kb66Kc66Kd66Ke66KfCivroqDroqHroqLroqProqTroqXroqbroqfroqjroqnroqrroqvroqzroq3roq7roq/rorDrorHrorLrorProrTrorXrorbrorfrorjrornrorrrorvrorzror3ror7ror8KK+ujgOujgeujguujg+ujhOujheujhuujh+ujiOujieujiuuji+ujjOujjeujjuujj+ujkOujkeujkuujk+ujlOujleujluujl+ujmOujmeujmuujm+ujnOujneujnuujnwor66Og66Oh66Oi66Oj66Ok66Ol66Om66On66Oo66Op66Oq66Or66Os66Ot66Ou66Ov66Ow66Ox66Oy66Oz66O066O166O266O366O466O566O666O766O866O966O+66O/CivrpIDrpIHrpILrpIPrpITrpIXrpIbrpIfrpIjrpInrpIrrpIvrpIzrpI3rpI7rpI/rpJDrpJHrpJLrpJPrpJTrpJXrpJbrpJfrpJjrpJnrpJrrpJvrpJzrpJ3rpJ7rpJ8KK+ukoOukoeukouuko+ukpOukpeukpuukp+ukqOukqeukquukq+ukrOukreukruukr+uksOukseuksuuks+uktOukteuktuukt+ukuOukueukuuuku+ukvOukveukvuukvwor66WA66WB66WC66WD66WE66WF66WG66WH66WI66WJ66WK66WL66WM66WN66WO66WP66WQ66WR66WS66WT66WU66WV66WW66WX66WY66WZ66Wa66Wb66Wc66Wd66We66WfCivrpaDrpaHrpaLrpaPrpaTrpaXrpabrpafrpajrpanrparrpavrpazrpa3rpa7rpa/rpbDrpbHrpbLrpbPrpbTrpbXrpbbrpbfrpbjrpbnrpbrrpbvrpbzrpb3rpb7rpb8KK+umgOumgeumguumg+umhOumheumhuumh+umiOumieumiuumi+umjOumjeumjuumj+umkOumkeumkuumk+umlOumleumluuml+ummOummeummuumm+umnOumneumnuumnwor66ag66ah66ai66aj66ak66al66am66an66ao66ap66aq66ar66as66at66au66av66aw66ax66ay66az66a066a166a266a366a466a566a666a766a866a966a+66a/Civrp4Drp4Hrp4Lrp4Prp4Trp4Xrp4brp4frp4jrp4nrp4rrp4vrp4zrp43rp47rp4/rp5Drp5Hrp5Lrp5Prp5Trp5Xrp5brp5frp5jrp5nrp5rrp5vrp5zrp53rp57rp58KK+unoOunoeunouuno+unpOunpeunpuunp+unqOunqeunquunq+unrOunreunruunr+unsOunseunsuuns+untOunteuntuunt+unuOunueunuuunu+unvOunveunvuunvwor66iA66iB66iC66iD66iE66iF66iG66iH66iI66iJ66iK66iL66iM66iN66iO66iP66iQ66iR66iS66iT66iU66iV66iW66iX66iY66iZ66ia66ib66ic66id66ie66ifCivrqKDrqKHrqKLrqKPrqKTrqKXrqKbrqKfrqKjrqKnrqKrrqKvrqKzrqK3rqK7rqK/rqLDrqLHrqLLrqLPrqLTrqLXrqLbrqLfrqLjrqLnrqLrrqLvrqLzrqL3rqL7rqL8KK+upgOupgeupguupg+uphOupheuphuuph+upiOupieupiuupi+upjOupjeupjuupj+upkOupkeupkuupk+uplOupleupluupl+upmOupmeupmuupm+upnOupneupnuupnwor66mg66mh66mi66mj66mk66ml66mm66mn66mo66mp66mq66mr66ms66mt66mu66mv66mw66mx66my66mz66m066m166m266m366m466m566m666m766m866m966m+66m/CivrqoDrqoHrqoLrqoPrqoTrqoXrqobrqofrqojrqonrqorrqovrqozrqo3rqo7rqo/rqpDrqpHrqpLrqpPrqpTrqpXrqpbrqpfrqpjrqpnrqprrqpvrqpzrqp3rqp7rqp8KK+uqoOuqoeuqouuqo+uqpOuqpeuqpuuqp+uqqOuqqeuqquuqq+uqrOuqreuqruuqr+uqsOuqseuqsuuqs+uqtOuqteuqtuuqt+uquOuqueuquuuqu+uqvOuqveuqvuuqvwor66uA66uB66uC66uD66uE66uF66uG66uH66uI66uJ66uK66uL66uM66uN66uO66uP66uQ66uR66uS66uT66uU66uV66uW66uX66uY66uZ66ua66ub66uc66ud66ue66ufCivrq6Drq6Hrq6Lrq6Prq6Trq6Xrq6brq6frq6jrq6nrq6rrq6vrq6zrq63rq67rq6/rq7Drq7Hrq7Lrq7Prq7Trq7Xrq7brq7frq7jrq7nrq7rrq7vrq7zrq73rq77rq78KK+usgOusgeusguusg+ushOusheushuush+usiOusieusiuusi+usjOusjeusjuusj+uskOuskeuskuusk+uslOusleusluusl+usmOusmeusmuusm+usnOusneusnuusnwor66yg66yh66yi66yj66yk66yl66ym66yn66yo66yp66yq66yr66ys66yt66yu66yv66yw66yx66yy66yz66y066y166y266y366y466y566y666y766y866y966y+66y/CivrrYDrrYHrrYLrrYPrrYTrrYXrrYbrrYfrrYjrrYnrrYrrrYvrrYzrrY3rrY7rrY/rrZDrrZHrrZLrrZPrrZTrrZXrrZbrrZfrrZjrrZnrrZrrrZvrrZzrrZ3rrZ7rrZ8KK+utoOutoeutouuto+utpOutpeutpuutp+utqOutqeutquutq+utrOutreutruutr+utsOutseutsuuts+uttOutteuttuutt+utuOutueutuuutu+utvOutveutvuutvwor666A666B666C666D666E666F666G666H666I666J666K666L666M666N666O666P666Q666R666S666T666U666V666W666X666Y666Z666a666b666c666d666e666fCivrrqDrrqHrrqLrrqPrrqTrrqXrrqbrrqfrrqjrrqnrrqrrrqvrrqzrrq3rrq7rrq/rrrDrrrHrrrLrrrPrrrTrrrXrrrbrrrfrrrjrrrnrrrrrrrvrrrzrrr3rrr7rrr8KK+uvgOuvgeuvguuvg+uvhOuvheuvhuuvh+uviOuvieuviuuvi+uvjOuvjeuvjuuvj+uvkOuvkeuvkuuvk+uvlOuvleuvluuvl+uvmOuvmeuvmuuvm+uvnOuvneuvnuuvnwor66+g66+h66+i66+j66+k66+l66+m66+n66+o66+p66+q66+r66+s66+t66+u66+v66+w66+x66+y66+z66+066+166+266+366+466+566+666+766+866+966++66+/CivrsIDrsIHrsILrsIPrsITrsIXrsIbrsIfrsIjrsInrsIrrsIvrsIzrsI3rsI7rsI/rsJDrsJHrsJLrsJPrsJTrsJXrsJbrsJfrsJjrsJnrsJrrsJvrsJzrsJ3rsJ7rsJ8KK+uwoOuwoeuwouuwo+uwpOuwpeuwpuuwp+uwqOuwqeuwquuwq+uwrOuwreuwruuwr+uwsOuwseuwsuuws+uwtOuwteuwtuuwt+uwuOuwueuwuuuwu+uwvOuwveuwvuuwvwor67GA67GB67GC67GD67GE67GF67GG67GH67GI67GJ67GK67GL67GM67GN67GO67GP67GQ67GR67GS67GT67GU67GV67GW67GX67GY67GZ67Ga67Gb67Gc67Gd67Ge67GfCivrsaDrsaHrsaLrsaPrsaTrsaXrsabrsafrsajrsanrsarrsavrsazrsa3rsa7rsa/rsbDrsbHrsbLrsbPrsbTrsbXrsbbrsbfrsbjrsbnrsbrrsbvrsbzrsb3rsb7rsb8KK+uygOuygeuyguuyg+uyhOuyheuyhuuyh+uyiOuyieuyiuuyi+uyjOuyjeuyjuuyj+uykOuykeuykuuyk+uylOuyleuyluuyl+uymOuymeuymuuym+uynOuyneuynuuynwor67Kg67Kh67Ki67Kj67Kk67Kl67Km67Kn67Ko67Kp67Kq67Kr67Ks67Kt67Ku67Kv67Kw67Kx67Ky67Kz67K067K167K267K367K467K567K667K767K867K967K+67K/Civrs4Drs4Hrs4Lrs4Prs4Trs4Xrs4brs4frs4jrs4nrs4rrs4vrs4zrs43rs47rs4/rs5Drs5Hrs5Lrs5Prs5Trs5Xrs5brs5frs5jrs5nrs5rrs5vrs5zrs53rs57rs58KK+uzoOuzoeuzouuzo+uzpOuzpeuzpuuzp+uzqOuzqeuzquuzq+uzrOuzreuzruuzr+uzsOuzseuzsuuzs+uztOuzteuztuuzt+uzuOuzueuzuuuzu+uzvOuzveuzvuuzvwor67SA67SB67SC67SD67SE67SF67SG67SH67SI67SJ67SK67SL67SM67SN67SO67SP67SQ67SR67SS67ST67SU67SV67SW67SX67SY67SZ67Sa67Sb67Sc67Sd67Se67SfCivrtKDrtKHrtKLrtKPrtKTrtKXrtKbrtKfrtKjrtKnrtKrrtKvrtKzrtK3rtK7rtK/rtLDrtLHrtLLrtLPrtLTrtLXrtLbrtLfrtLjrtLnrtLrrtLvrtLzrtL3rtL7rtL8KK+u1gOu1geu1guu1g+u1hOu1heu1huu1h+u1iOu1ieu1iuu1i+u1jOu1jeu1juu1j+u1kOu1keu1kuu1k+u1lOu1leu1luu1l+u1mOu1meu1muu1m+u1nOu1neu1nuu1nwor67Wg67Wh67Wi67Wj67Wk67Wl67Wm67Wn67Wo67Wp67Wq67Wr67Ws67Wt67Wu67Wv67Ww67Wx67Wy67Wz67W067W167W267W367W467W567W667W767W867W967W+67W/CivrtoDrtoHrtoLrtoPrtoTrtoXrtobrtofrtojrtonrtorrtovrtozrto3rto7rto/rtpDrtpHrtpLrtpPrtpTrtpXrtpbrtpfrtpjrtpnrtprrtpvrtpzrtp3rtp7rtp8KK+u2oOu2oeu2ouu2o+u2pOu2peu2puu2p+u2qOu2qeu2quu2q+u2rOu2reu2ruu2r+u2sOu2seu2suu2s+u2tOu2teu2tuu2t+u2uOu2ueu2uuu2u+u2vOu2veu2vuu2vwor67eA67eB67eC67eD67eE67eF67eG67eH67eI67eJ67eK67eL67eM67eN67eO67eP67eQ67eR67eS67eT67eU67eV67eW67eX67eY67eZ67ea67eb67ec67ed67ee67efCivrt6Drt6Hrt6Lrt6Prt6Trt6Xrt6brt6frt6jrt6nrt6rrt6vrt6zrt63rt67rt6/rt7Drt7Hrt7Lrt7Prt7Trt7Xrt7brt7frt7jrt7nrt7rrt7vrt7zrt73rt77rt78KK+u4gOu4geu4guu4g+u4hOu4heu4huu4h+u4iOu4ieu4iuu4i+u4jOu4jeu4juu4j+u4kOu4keu4kuu4k+u4lOu4leu4luu4l+u4mOu4meu4muu4m+u4nOu4neu4nuu4nwor67ig67ih67ii67ij67ik67il67im67in67io67ip67iq67ir67is67it67iu67iv67iw67ix67iy67iz67i067i167i267i367i467i567i667i767i867i967i+67i/CivruYDruYHruYLruYPruYTruYXruYbruYfruYjruYnruYrruYvruYzruY3ruY7ruY/ruZDruZHruZLruZPruZTruZXruZbruZfruZjruZnruZrruZvruZzruZ3ruZ7ruZ8KK+u5oOu5oeu5ouu5o+u5pOu5peu5puu5p+u5qOu5qeu5quu5q+u5rOu5reu5ruu5r+u5sOu5seu5suu5s+u5tOu5teu5tuu5t+u5uOu5ueu5uuu5u+u5vOu5veu5vuu5vwor67qA67qB67qC67qD67qE67qF67qG67qH67qI67qJ67qK67qL67qM67qN67qO67qP67qQ67qR67qS67qT67qU67qV67qW67qX67qY67qZ67qa67qb67qc67qd67qe67qfCivruqDruqHruqLruqPruqTruqXruqbruqfruqjruqnruqrruqvruqzruq3ruq7ruq/rurDrurHrurLrurPrurTrurXrurbrurfrurjrurnrurrrurvrurzrur3rur7rur8KK+u7gOu7geu7guu7g+u7hOu7heu7huu7h+u7iOu7ieu7iuu7i+u7jOu7jeu7juu7j+u7kOu7keu7kuu7k+u7lOu7leu7luu7l+u7mOu7meu7muu7m+u7nOu7neu7nuu7nwor67ug67uh67ui67uj67uk67ul67um67un67uo67up67uq67ur67us67ut67uu67uv67uw67ux67uy67uz67u067u167u267u367u467u567u667u767u867u967u+67u/CivrvIDrvIHrvILrvIPrvITrvIXrvIbrvIfrvIjrvInrvIrrvIvrvIzrvI3rvI7rvI/rvJDrvJHrvJLrvJPrvJTrvJXrvJbrvJfrvJjrvJnrvJrrvJvrvJzrvJ3rvJ7rvJ8KK+u8oOu8oeu8ouu8o+u8pOu8peu8puu8p+u8qOu8qeu8quu8q+u8rOu8reu8ruu8r+u8sOu8seu8suu8s+u8tOu8teu8tuu8t+u8uOu8ueu8uuu8u+u8vOu8veu8vuu8vwor672A672B672C672D672E672F672G672H672I672J672K672L672M672N672O672P672Q672R672S672T672U672V672W672X672Y672Z672a672b672c672d672e672fCivrvaDrvaHrvaLrvaPrvaTrvaXrvabrvafrvajrvanrvarrvavrvazrva3rva7rva/rvbDrvbHrvbLrvbPrvbTrvbXrvbbrvbfrvbjrvbnrvbrrvbvrvbzrvb3rvb7rvb8KK+u+gOu+geu+guu+g+u+hOu+heu+huu+h+u+iOu+ieu+iuu+i+u+jOu+jeu+juu+j+u+kOu+keu+kuu+k+u+lOu+leu+luu+l+u+mOu+meu+muu+m+u+nOu+neu+nuu+nwor676g676h676i676j676k676l676m676n676o676p676q676r676s676t676u676v676w676x676y676z6760676167626763676467656766676767686769676+676/Civrv4Drv4Hrv4Lrv4Prv4Trv4Xrv4brv4frv4jrv4nrv4rrv4vrv4zrv43rv47rv4/rv5Drv5Hrv5Lrv5Prv5Trv5Xrv5brv5frv5jrv5nrv5rrv5vrv5zrv53rv57rv58KK+u/oOu/oeu/ouu/o+u/pOu/peu/puu/p+u/qOu/qeu/quu/q+u/rOu/reu/ruu/r+u/sOu/seu/suu/s+u/tOu/teu/tuu/t+u/uOu/ueu/uuu/u+u/vOu/veu/vuu/vwor7ICA7ICB7ICC7ICD7ICE7ICF7ICG7ICH7ICI7ICJ7ICK7ICL7ICM7ICN7ICO7ICP7ICQ7ICR7ICS7ICT7ICU7ICV7ICW7ICX7ICY7ICZ7ICa7ICb7ICc7ICd7ICe7ICfCivsgKDsgKHsgKLsgKPsgKTsgKXsgKbsgKfsgKjsgKnsgKrsgKvsgKzsgK3sgK7sgK/sgLDsgLHsgLLsgLPsgLTsgLXsgLbsgLfsgLjsgLnsgLrsgLvsgLzsgL3sgL7sgL8KK+yBgOyBgeyBguyBg+yBhOyBheyBhuyBh+yBiOyBieyBiuyBi+yBjOyBjeyBjuyBj+yBkOyBkeyBkuyBk+yBlOyBleyBluyBl+yBmOyBmeyBmuyBm+yBnOyBneyBnuyBnwor7IGg7IGh7IGi7IGj7IGk7IGl7IGm7IGn7IGo7IGp7IGq7IGr7IGs7IGt7IGu7IGv7IGw7IGx7IGy7IGz7IG07IG17IG27IG37IG47IG57IG67IG77IG87IG97IG+7IG/CivsgoDsgoHsgoLsgoPsgoTsgoXsgobsgofsgojsgonsgorsgovsgozsgo3sgo7sgo/sgpDsgpHsgpLsgpPsgpTsgpXsgpbsgpfsgpjsgpnsgprsgpvsgpzsgp3sgp7sgp8KK+yCoOyCoeyCouyCo+yCpOyCpeyCpuyCp+yCqOyCqeyCquyCq+yCrOyCreyCruyCr+yCsOyCseyCsuyCs+yCtOyCteyCtuyCt+yCuOyCueyCuuyCu+yCvOyCveyCvuyCvwor7IOA7IOB7IOC7IOD7IOE7IOF7IOG7IOH7IOI7IOJ7IOK7IOL7IOM7ION7IOO7IOP7IOQ7IOR7IOS7IOT7IOU7IOV7IOW7IOX7IOY7IOZ7IOa7IOb7IOc7IOd7IOe7IOfCivsg6Dsg6Hsg6Lsg6Psg6Tsg6Xsg6bsg6fsg6jsg6nsg6rsg6vsg6zsg63sg67sg6/sg7Dsg7Hsg7Lsg7Psg7Tsg7Xsg7bsg7fsg7jsg7nsg7rsg7vsg7zsg73sg77sg78KK+yEgOyEgeyEguyEg+yEhOyEheyEhuyEh+yEiOyEieyEiuyEi+yEjOyEjeyEjuyEj+yEkOyEkeyEkuyEk+yElOyEleyEluyEl+yEmOyEmeyEmuyEm+yEnOyEneyEnuyEnwor7ISg7ISh7ISi7ISj7ISk7ISl7ISm7ISn7ISo7ISp7ISq7ISr7ISs7ISt7ISu7ISv7ISw7ISx7ISy7ISz7IS07IS17IS27IS37IS47IS57IS67IS77IS87IS97IS+7IS/CivshYDshYHshYLshYPshYTshYXshYbshYfshYjshYnshYrshYvshYzshY3shY7shY/shZDshZHshZLshZPshZTshZXshZbshZfshZjshZnshZrshZvshZzshZ3shZ7shZ8KK+yFoOyFoeyFouyFo+yFpOyFpeyFpuyFp+yFqOyFqeyFquyFq+yFrOyFreyFruyFr+yFsOyFseyFsuyFs+yFtOyFteyFtuyFt+yFuOyFueyFuuyFu+yFvOyFveyFvuyFvwor7IaA7IaB7IaC7IaD7IaE7IaF7IaG7IaH7IaI7IaJ7IaK7IaL7IaM7IaN7IaO7IaP7IaQ7IaR7IaS7IaT7IaU7IaV7IaW7IaX7IaY7IaZ7Iaa7Iab7Iac7Iad7Iae7IafCivshqDshqHshqLshqPshqTshqXshqbshqfshqjshqnshqrshqvshqzshq3shq7shq/shrDshrHshrLshrPshrTshrXshrbshrfshrjshrnshrrshrvshrzshr3shr7shr8KK+yHgOyHgeyHguyHg+yHhOyHheyHhuyHh+yHiOyHieyHiuyHi+yHjOyHjeyHjuyHj+yHkOyHkeyHkuyHk+yHlOyHleyHluyHl+yHmOyHmeyHmuyHm+yHnOyHneyHnuyHnwor7Ieg7Ieh7Iei7Iej7Iek7Iel7Iem7Ien7Ieo7Iep7Ieq7Ier7Ies7Iet7Ieu7Iev7Iew7Iex7Iey7Iez7Ie07Ie17Ie27Ie37Ie47Ie57Ie67Ie77Ie87Ie97Ie+7Ie/CivsiIDsiIHsiILsiIPsiITsiIXsiIbsiIfsiIjsiInsiIrsiIvsiIzsiI3siI7siI/siJDsiJHsiJLsiJPsiJTsiJXsiJbsiJfsiJjsiJnsiJrsiJvsiJzsiJ3siJ7siJ8KK+yIoOyIoeyIouyIo+yIpOyIpeyIpuyIp+yIqOyIqeyIquyIq+yIrOyIreyIruyIr+yIsOyIseyIsuyIs+yItOyIteyItuyIt+yIuOyIueyIuuyIu+yIvOyIveyIvuyIvwor7ImA7ImB7ImC7ImD7ImE7ImF7ImG7ImH7ImI7ImJ7ImK7ImL7ImM7ImN7ImO7ImP7ImQ7ImR7ImS7ImT7ImU7ImV7ImW7ImX7ImY7ImZ7Ima7Imb7Imc7Imd7Ime7ImfCivsiaDsiaHsiaLsiaPsiaTsiaXsiabsiafsiajsiansiarsiavsiazsia3sia7sia/sibDsibHsibLsibPsibTsibXsibbsibfsibjsibnsibrsibvsibzsib3sib7sib8KK+yKgOyKgeyKguyKg+yKhOyKheyKhuyKh+yKiOyKieyKiuyKi+yKjOyKjeyKjuyKj+yKkOyKkeyKkuyKk+yKlOyKleyKluyKl+yKmOyKmeyKmuyKm+yKnOyKneyKnuyKnwor7Iqg7Iqh7Iqi7Iqj7Iqk7Iql7Iqm7Iqn7Iqo7Iqp7Iqq7Iqr7Iqs7Iqt7Iqu7Iqv7Iqw7Iqx7Iqy7Iqz7Iq07Iq17Iq27Iq37Iq47Iq57Iq67Iq77Iq87Iq97Iq+7Iq/Civsi4Dsi4Hsi4Lsi4Psi4Tsi4Xsi4bsi4fsi4jsi4nsi4rsi4vsi4zsi43si47si4/si5Dsi5Hsi5Lsi5Psi5Tsi5Xsi5bsi5fsi5jsi5nsi5rsi5vsi5zsi53si57si58KK+yLoOyLoeyLouyLo+yLpOyLpeyLpuyLp+yLqOyLqeyLquyLq+yLrOyLreyLruyLr+yLsOyLseyLsuyLs+yLtOyLteyLtuyLt+yLuOyLueyLuuyLu+yLvOyLveyLvuyLvwor7IyA7IyB7IyC7IyD7IyE7IyF7IyG7IyH7IyI7IyJ7IyK7IyL7IyM7IyN7IyO7IyP7IyQ7IyR7IyS7IyT7IyU7IyV7IyW7IyX7IyY7IyZ7Iya7Iyb7Iyc7Iyd7Iye7IyfCivsjKDsjKHsjKLsjKPsjKTsjKXsjKbsjKfsjKjsjKnsjKrsjKvsjKzsjK3sjK7sjK/sjLDsjLHsjLLsjLPsjLTsjLXsjLbsjLfsjLjsjLnsjLrsjLvsjLzsjL3sjL7sjL8KK+yNgOyNgeyNguyNg+yNhOyNheyNhuyNh+yNiOyNieyNiuyNi+yNjOyNjeyNjuyNj+yNkOyNkeyNkuyNk+yNlOyNleyNluyNl+yNmOyNmeyNmuyNm+yNnOyNneyNnuyNnwor7I2g7I2h7I2i7I2j7I2k7I2l7I2m7I2n7I2o7I2p7I2q7I2r7I2s7I2t7I2u7I2v7I2w7I2x7I2y7I2z7I207I217I227I237I247I257I267I277I287I297I2+7I2/CivsjoDsjoHsjoLsjoPsjoTsjoXsjobsjofsjojsjonsjorsjovsjozsjo3sjo7sjo/sjpDsjpHsjpLsjpPsjpTsjpXsjpbsjpfsjpjsjpnsjprsjpvsjpzsjp3sjp7sjp8KK+yOoOyOoeyOouyOo+yOpOyOpeyOpuyOp+yOqOyOqeyOquyOq+yOrOyOreyOruyOr+yOsOyOseyOsuyOs+yOtOyOteyOtuyOt+yOuOyOueyOuuyOu+yOvOyOveyOvuyOvwor7I+A7I+B7I+C7I+D7I+E7I+F7I+G7I+H7I+I7I+J7I+K7I+L7I+M7I+N7I+O7I+P7I+Q7I+R7I+S7I+T7I+U7I+V7I+W7I+X7I+Y7I+Z7I+a7I+b7I+c7I+d7I+e7I+fCivsj6Dsj6Hsj6Lsj6Psj6Tsj6Xsj6bsj6fsj6jsj6nsj6rsj6vsj6zsj63sj67sj6/sj7Dsj7Hsj7Lsj7Psj7Tsj7Xsj7bsj7fsj7jsj7nsj7rsj7vsj7zsj73sj77sj78KK+yQgOyQgeyQguyQg+yQhOyQheyQhuyQh+yQiOyQieyQiuyQi+yQjOyQjeyQjuyQj+yQkOyQkeyQkuyQk+yQlOyQleyQluyQl+yQmOyQmeyQmuyQm+yQnOyQneyQnuyQnwor7JCg7JCh7JCi7JCj7JCk7JCl7JCm7JCn7JCo7JCp7JCq7JCr7JCs7JCt7JCu7JCv7JCw7JCx7JCy7JCz7JC07JC17JC27JC37JC47JC57JC67JC77JC87JC97JC+7JC/CivskYDskYHskYLskYPskYTskYXskYbskYfskYjskYnskYrskYvskYzskY3skY7skY/skZDskZHskZLskZPskZTskZXskZbskZfskZjskZnskZrskZvskZzskZ3skZ7skZ8KK+yRoOyRoeyRouyRo+yRpOyRpeyRpuyRp+yRqOyRqeyRquyRq+yRrOyRreyRruyRr+yRsOyRseyRsuyRs+yRtOyRteyRtuyRt+yRuOyRueyRuuyRu+yRvOyRveyRvuyRvwor7JKA7JKB7JKC7JKD7JKE7JKF7JKG7JKH7JKI7JKJ7JKK7JKL7JKM7JKN7JKO7JKP7JKQ7JKR7JKS7JKT7JKU7JKV7JKW7JKX7JKY7JKZ7JKa7JKb7JKc7JKd7JKe7JKfCivskqDskqHskqLskqPskqTskqXskqbskqfskqjskqnskqrskqvskqzskq3skq7skq/skrDskrHskrLskrPskrTskrXskrbskrfskrjskrnskrrskrvskrzskr3skr7skr8KK+yTgOyTgeyTguyTg+yThOyTheyThuyTh+yTiOyTieyTiuyTi+yTjOyTjeyTjuyTj+yTkOyTkeyTkuyTk+yTlOyTleyTluyTl+yTmOyTmeyTmuyTm+yTnOyTneyTnuyTnwor7JOg7JOh7JOi7JOj7JOk7JOl7JOm7JOn7JOo7JOp7JOq7JOr7JOs7JOt7JOu7JOv7JOw7JOx7JOy7JOz7JO07JO17JO27JO37JO47JO57JO67JO77JO87JO97JO+7JO/CivslIDslIHslILslIPslITslIXslIbslIfslIjslInslIrslIvslIzslI3slI7slI/slJDslJHslJLslJPslJTslJXslJbslJfslJjslJnslJrslJvslJzslJ3slJ7slJ8KK+yUoOyUoeyUouyUo+yUpOyUpeyUpuyUp+yUqOyUqeyUquyUq+yUrOyUreyUruyUr+yUsOyUseyUsuyUs+yUtOyUteyUtuyUt+yUuOyUueyUuuyUu+yUvOyUveyUvuyUvwor7JWA7JWB7JWC7JWD7JWE7JWF7JWG7JWH7JWI7JWJ7JWK7JWL7JWM7JWN7JWO7JWP7JWQ7JWR7JWS7JWT7JWU7JWV7JWW7JWX7JWY7JWZ7JWa7JWb7JWc7JWd7JWe7JWfCivslaDslaHslaLslaPslaTslaXslabslafslajslanslarslavslazsla3sla7sla/slbDslbHslbLslbPslbTslbXslbbslbfslbjslbnslbrslbvslbzslb3slb7slb8KK+yWgOyWgeyWguyWg+yWhOyWheyWhuyWh+yWiOyWieyWiuyWi+yWjOyWjeyWjuyWj+yWkOyWkeyWkuyWk+yWlOyWleyWluyWl+yWmOyWmeyWmuyWm+yWnOyWneyWnuyWnwor7Jag7Jah7Jai7Jaj7Jak7Jal7Jam7Jan7Jao7Jap7Jaq7Jar7Jas7Jat7Jau7Jav7Jaw7Jax7Jay7Jaz7Ja07Ja17Ja27Ja37Ja47Ja57Ja67Ja77Ja87Ja97Ja+7Ja/Civsl4Dsl4Hsl4Lsl4Psl4Tsl4Xsl4bsl4fsl4jsl4nsl4rsl4vsl4zsl43sl47sl4/sl5Dsl5Hsl5Lsl5Psl5Tsl5Xsl5bsl5fsl5jsl5nsl5rsl5vsl5zsl53sl57sl58KK+yXoOyXoeyXouyXo+yXpOyXpeyXpuyXp+yXqOyXqeyXquyXq+yXrOyXreyXruyXr+yXsOyXseyXsuyXs+yXtOyXteyXtuyXt+yXuOyXueyXuuyXu+yXvOyXveyXvuyXvwor7JiA7JiB7JiC7JiD7JiE7JiF7JiG7JiH7JiI7JiJ7JiK7JiL7JiM7JiN7JiO7JiP7JiQ7JiR7JiS7JiT7JiU7JiV7JiW7JiX7JiY7JiZ7Jia7Jib7Jic7Jid7Jie7JifCivsmKDsmKHsmKLsmKPsmKTsmKXsmKbsmKfsmKjsmKnsmKrsmKvsmKzsmK3smK7smK/smLDsmLHsmLLsmLPsmLTsmLXsmLbsmLfsmLjsmLnsmLrsmLvsmLzsmL3smL7smL8KK+yZgOyZgeyZguyZg+yZhOyZheyZhuyZh+yZiOyZieyZiuyZi+yZjOyZjeyZjuyZj+yZkOyZkeyZkuyZk+yZlOyZleyZluyZl+yZmOyZmeyZmuyZm+yZnOyZneyZnuyZnwor7Jmg7Jmh7Jmi7Jmj7Jmk7Jml7Jmm7Jmn7Jmo7Jmp7Jmq7Jmr7Jms7Jmt7Jmu7Jmv7Jmw7Jmx7Jmy7Jmz7Jm07Jm17Jm27Jm37Jm47Jm57Jm67Jm77Jm87Jm97Jm+7Jm/CivsmoDsmoHsmoLsmoPsmoTsmoXsmobsmofsmojsmonsmorsmovsmozsmo3smo7smo/smpDsmpHsmpLsmpPsmpTsmpXsmpbsmpfsmpjsmpnsmprsmpvsmpzsmp3smp7smp8KK+yaoOyaoeyaouyao+yapOyapeyapuyap+yaqOyaqeyaquyaq+yarOyareyaruyar+yasOyaseyasuyas+yatOyateyatuyat+yauOyaueyauuyau+yavOyaveyavuyavwor7JuA7JuB7JuC7JuD7JuE7JuF7JuG7JuH7JuI7JuJ7JuK7JuL7JuM7JuN7JuO7JuP7JuQ7JuR7JuS7JuT7JuU7JuV7JuW7JuX7JuY7JuZ7Jua7Jub7Juc7Jud7Jue7JufCivsm6Dsm6Hsm6Lsm6Psm6Tsm6Xsm6bsm6fsm6jsm6nsm6rsm6vsm6zsm63sm67sm6/sm7Dsm7Hsm7Lsm7Psm7Tsm7Xsm7bsm7fsm7jsm7nsm7rsm7vsm7zsm73sm77sm78KK+ycgOycgeycguycg+ychOycheychuych+yciOycieyciuyci+ycjOycjeycjuycj+yckOyckeyckuyck+yclOycleycluycl+ycmOycmeycmuycm+ycnOycneycnuycnwor7Jyg7Jyh7Jyi7Jyj7Jyk7Jyl7Jym7Jyn7Jyo7Jyp7Jyq7Jyr7Jys7Jyt7Jyu7Jyv7Jyw7Jyx7Jyy7Jyz7Jy07Jy17Jy27Jy37Jy47Jy57Jy67Jy77Jy87Jy97Jy+7Jy/CivsnYDsnYHsnYLsnYPsnYTsnYXsnYbsnYfsnYjsnYnsnYrsnYvsnYzsnY3snY7snY/snZDsnZHsnZLsnZPsnZTsnZXsnZbsnZfsnZjsnZnsnZrsnZvsnZzsnZ3snZ7snZ8KK+ydoOydoeydouydo+ydpOydpeydpuydp+ydqOydqeydquydq+ydrOydreydruydr+ydsOydseydsuyds+ydtOydteydtuydt+yduOydueyduuydu+ydvOydveydvuydvwor7J6A7J6B7J6C7J6D7J6E7J6F7J6G7J6H7J6I7J6J7J6K7J6L7J6M7J6N7J6O7J6P7J6Q7J6R7J6S7J6T7J6U7J6V7J6W7J6X7J6Y7J6Z7J6a7J6b7J6c7J6d7J6e7J6fCivsnqDsnqHsnqLsnqPsnqTsnqXsnqbsnqfsnqjsnqnsnqrsnqvsnqzsnq3snq7snq/snrDsnrHsnrLsnrPsnrTsnrXsnrbsnrfsnrjsnrnsnrrsnrvsnrzsnr3snr7snr8KK+yfgOyfgeyfguyfg+yfhOyfheyfhuyfh+yfiOyfieyfiuyfi+yfjOyfjeyfjuyfj+yfkOyfkeyfkuyfk+yflOyfleyfluyfl+yfmOyfmeyfmuyfm+yfnOyfneyfnuyfnwor7J+g7J+h7J+i7J+j7J+k7J+l7J+m7J+n7J+o7J+p7J+q7J+r7J+s7J+t7J+u7J+v7J+w7J+x7J+y7J+z7J+07J+17J+27J+37J+47J+57J+67J+77J+87J+97J++7J+/CivsoIDsoIHsoILsoIPsoITsoIXsoIbsoIfsoIjsoInsoIrsoIvsoIzsoI3soI7soI/soJDsoJHsoJLsoJPsoJTsoJXsoJbsoJfsoJjsoJnsoJrsoJvsoJzsoJ3soJ7soJ8KK+ygoOygoeygouygo+ygpOygpeygpuygp+ygqOygqeygquygq+ygrOygreygruygr+ygsOygseygsuygs+ygtOygteygtuygt+yguOygueyguuygu+ygvOygveygvuygvwor7KGA7KGB7KGC7KGD7KGE7KGF7KGG7KGH7KGI7KGJ7KGK7KGL7KGM7KGN7KGO7KGP7KGQ7KGR7KGS7KGT7KGU7KGV7KGW7KGX7KGY7KGZ7KGa7KGb7KGc7KGd7KGe7KGfCivsoaDsoaHsoaLsoaPsoaTsoaXsoabsoafsoajsoansoarsoavsoazsoa3soa7soa/sobDsobHsobLsobPsobTsobXsobbsobfsobjsobnsobrsobvsobzsob3sob7sob8KK+yigOyigeyiguyig+yihOyiheyihuyih+yiiOyiieyiiuyii+yijOyijeyijuyij+yikOyikeyikuyik+yilOyileyiluyil+yimOyimeyimuyim+yinOyineyinuyinwor7KKg7KKh7KKi7KKj7KKk7KKl7KKm7KKn7KKo7KKp7KKq7KKr7KKs7KKt7KKu7KKv7KKw7KKx7KKy7KKz7KK07KK17KK27KK37KK47KK57KK67KK77KK87KK97KK+7KK/Civso4Dso4Hso4Lso4Pso4Tso4Xso4bso4fso4jso4nso4rso4vso4zso43so47so4/so5Dso5Hso5Lso5Pso5Tso5Xso5bso5fso5jso5nso5rso5vso5zso53so57so58KK+yjoOyjoeyjouyjo+yjpOyjpeyjpuyjp+yjqOyjqeyjquyjq+yjrOyjreyjruyjr+yjsOyjseyjsuyjs+yjtOyjteyjtuyjt+yjuOyjueyjuuyju+yjvOyjveyjvuyjvwor7KSA7KSB7KSC7KSD7KSE7KSF7KSG7KSH7KSI7KSJ7KSK7KSL7KSM7KSN7KSO7KSP7KSQ7KSR7KSS7KST7KSU7KSV7KSW7KSX7KSY7KSZ7KSa7KSb7KSc7KSd7KSe7KSfCivspKDspKHspKLspKPspKTspKXspKbspKfspKjspKnspKrspKvspKzspK3spK7spK/spLDspLHspLLspLPspLTspLXspLbspLfspLjspLnspLrspLvspLzspL3spL7spL8KK+ylgOylgeylguylg+ylhOylheylhuylh+yliOylieyliuyli+yljOyljeyljuylj+ylkOylkeylkuylk+yllOylleylluyll+ylmOylmeylmuylm+ylnOylneylnuylnwor7KWg7KWh7KWi7KWj7KWk7KWl7KWm7KWn7KWo7KWp7KWq7KWr7KWs7KWt7KWu7KWv7KWw7KWx7KWy7KWz7KW07KW17KW27KW37KW47KW57KW67KW77KW87KW97KW+7KW/CivspoDspoHspoLspoPspoTspoXspobspofspojsponsporspovspozspo3spo7spo/sppDsppHsppLsppPsppTsppXsppbsppfsppjsppnspprsppvsppzspp3spp7spp8KK+ymoOymoeymouymo+ympOympeympuymp+ymqOymqeymquymq+ymrOymreymruymr+ymsOymseymsuyms+ymtOymteymtuymt+ymuOymueymuuymu+ymvOymveymvuymvwor7KeA7KeB7KeC7KeD7KeE7KeF7KeG7KeH7KeI7KeJ7KeK7KeL7KeM7KeN7KeO7KeP7KeQ7KeR7KeS7KeT7KeU7KeV7KeW7KeX7KeY7KeZ7Kea7Keb7Kec7Ked7Kee7KefCivsp6Dsp6Hsp6Lsp6Psp6Tsp6Xsp6bsp6fsp6jsp6nsp6rsp6vsp6zsp63sp67sp6/sp7Dsp7Hsp7Lsp7Psp7Tsp7Xsp7bsp7fsp7jsp7nsp7rsp7vsp7zsp73sp77sp78KK+yogOyogeyoguyog+yohOyoheyohuyoh+yoiOyoieyoiuyoi+yojOyojeyojuyoj+yokOyokeyokuyok+yolOyoleyoluyol+yomOyomeyomuyom+yonOyoneyonuyonwor7Kig7Kih7Kii7Kij7Kik7Kil7Kim7Kin7Kio7Kip7Kiq7Kir7Kis7Kit7Kiu7Kiv7Kiw7Kix7Kiy7Kiz7Ki07Ki17Ki27Ki37Ki47Ki57Ki67Ki77Ki87Ki97Ki+7Ki/CivsqYDsqYHsqYLsqYPsqYTsqYXsqYbsqYfsqYjsqYnsqYrsqYvsqYzsqY3sqY7sqY/sqZDsqZHsqZLsqZPsqZTsqZXsqZbsqZfsqZjsqZnsqZrsqZvsqZzsqZ3sqZ7sqZ8KK+ypoOypoeypouypo+yppOyppeyppuypp+ypqOypqeypquypq+yprOypreypruypr+ypsOypseypsuyps+yptOypteyptuypt+ypuOypueypuuypu+ypvOypveypvuypvwor7KqA7KqB7KqC7KqD7KqE7KqF7KqG7KqH7KqI7KqJ7KqK7KqL7KqM7KqN7KqO7KqP7KqQ7KqR7KqS7KqT7KqU7KqV7KqW7KqX7KqY7KqZ7Kqa7Kqb7Kqc7Kqd7Kqe7KqfCivsqqDsqqHsqqLsqqPsqqTsqqXsqqbsqqfsqqjsqqnsqqrsqqvsqqzsqq3sqq7sqq/sqrDsqrHsqrLsqrPsqrTsqrXsqrbsqrfsqrjsqrnsqrrsqrvsqrzsqr3sqr7sqr8KK+yrgOyrgeyrguyrg+yrhOyrheyrhuyrh+yriOyrieyriuyri+yrjOyrjeyrjuyrj+yrkOyrkeyrkuyrk+yrlOyrleyrluyrl+yrmOyrmeyrmuyrm+yrnOyrneyrnuyrnwor7Kug7Kuh7Kui7Kuj7Kuk7Kul7Kum7Kun7Kuo7Kup7Kuq7Kur7Kus7Kut7Kuu7Kuv7Kuw7Kux7Kuy7Kuz7Ku07Ku17Ku27Ku37Ku47Ku57Ku67Ku77Ku87Ku97Ku+7Ku/CivsrIDsrIHsrILsrIPsrITsrIXsrIbsrIfsrIjsrInsrIrsrIvsrIzsrI3srI7srI/srJDsrJHsrJLsrJPsrJTsrJXsrJbsrJfsrJjsrJnsrJrsrJvsrJzsrJ3srJ7srJ8KK+ysoOysoeysouyso+yspOyspeyspuysp+ysqOysqeysquysq+ysrOysreysruysr+yssOysseyssuyss+ystOysteystuyst+ysuOysueysuuysu+ysvOysveysvuysvwor7K2A7K2B7K2C7K2D7K2E7K2F7K2G7K2H7K2I7K2J7K2K7K2L7K2M7K2N7K2O7K2P7K2Q7K2R7K2S7K2T7K2U7K2V7K2W7K2X7K2Y7K2Z7K2a7K2b7K2c7K2d7K2e7K2fCivsraDsraHsraLsraPsraTsraXsrabsrafsrajsransrarsravsrazsra3sra7sra/srbDsrbHsrbLsrbPsrbTsrbXsrbbsrbfsrbjsrbnsrbrsrbvsrbzsrb3srb7srb8KK+yugOyugeyuguyug+yuhOyuheyuhuyuh+yuiOyuieyuiuyui+yujOyujeyujuyuj+yukOyukeyukuyuk+yulOyuleyuluyul+yumOyumeyumuyum+yunOyuneyunuyunwor7K6g7K6h7K6i7K6j7K6k7K6l7K6m7K6n7K6o7K6p7K6q7K6r7K6s7K6t7K6u7K6v7K6w7K6x7K6y7K6z7K607K617K627K637K647K657K667K677K687K697K6+7K6/Civsr4Dsr4Hsr4Lsr4Psr4Tsr4Xsr4bsr4fsr4jsr4nsr4rsr4vsr4zsr43sr47sr4/sr5Dsr5Hsr5Lsr5Psr5Tsr5Xsr5bsr5fsr5jsr5nsr5rsr5vsr5zsr53sr57sr58KK+yvoOyvoeyvouyvo+yvpOyvpeyvpuyvp+yvqOyvqeyvquyvq+yvrOyvreyvruyvr+yvsOyvseyvsuyvs+yvtOyvteyvtuyvt+yvuOyvueyvuuyvu+yvvOyvveyvvuyvvwor7LCA7LCB7LCC7LCD7LCE7LCF7LCG7LCH7LCI7LCJ7LCK7LCL7LCM7LCN7LCO7LCP7LCQ7LCR7LCS7LCT7LCU7LCV7LCW7LCX7LCY7LCZ7LCa7LCb7LCc7LCd7LCe7LCfCivssKDssKHssKLssKPssKTssKXssKbssKfssKjssKnssKrssKvssKzssK3ssK7ssK/ssLDssLHssLLssLPssLTssLXssLbssLfssLjssLnssLrssLvssLzssL3ssL7ssL8KK+yxgOyxgeyxguyxg+yxhOyxheyxhuyxh+yxiOyxieyxiuyxi+yxjOyxjeyxjuyxj+yxkOyxkeyxkuyxk+yxlOyxleyxluyxl+yxmOyxmeyxmuyxm+yxnOyxneyxnuyxnwor7LGg7LGh7LGi7LGj7LGk7LGl7LGm7LGn7LGo7LGp7LGq7LGr7LGs7LGt7LGu7LGv7LGw7LGx7LGy7LGz7LG07LG17LG27LG37LG47LG57LG67LG77LG87LG97LG+7LG/CivssoDssoHssoLssoPssoTssoXssobssofssojssonssorssovssozsso3sso7sso/sspDsspHsspLsspPsspTsspXsspbsspfsspjsspnssprsspvsspzssp3ssp7ssp8KK+yyoOyyoeyyouyyo+yypOyypeyypuyyp+yyqOyyqeyyquyyq+yyrOyyreyyruyyr+yysOyyseyysuyys+yytOyyteyytuyyt+yyuOyyueyyuuyyu+yyvOyyveyyvuyyvwor7LOA7LOB7LOC7LOD7LOE7LOF7LOG7LOH7LOI7LOJ7LOK7LOL7LOM7LON7LOO7LOP7LOQ7LOR7LOS7LOT7LOU7LOV7LOW7LOX7LOY7LOZ7LOa7LOb7LOc7LOd7LOe7LOfCivss6Dss6Hss6Lss6Pss6Tss6Xss6bss6fss6jss6nss6rss6vss6zss63ss67ss6/ss7Dss7Hss7Lss7Pss7Tss7Xss7bss7fss7jss7nss7rss7vss7zss73ss77ss78KK+y0gOy0gey0guy0g+y0hOy0hey0huy0h+y0iOy0iey0iuy0i+y0jOy0jey0juy0j+y0kOy0key0kuy0k+y0lOy0ley0luy0l+y0mOy0mey0muy0m+y0nOy0ney0nuy0nwor7LSg7LSh7LSi7LSj7LSk7LSl7LSm7LSn7LSo7LSp7LSq7LSr7LSs7LSt7LSu7LSv7LSw7LSx7LSy7LSz7LS07LS17LS27LS37LS47LS57LS67LS77LS87LS97LS+7LS/CivstYDstYHstYLstYPstYTstYXstYbstYfstYjstYnstYrstYvstYzstY3stY7stY/stZDstZHstZLstZPstZTstZXstZbstZfstZjstZnstZrstZvstZzstZ3stZ7stZ8KK+y1oOy1oey1ouy1o+y1pOy1pey1puy1p+y1qOy1qey1quy1q+y1rOy1rey1ruy1r+y1sOy1sey1suy1s+y1tOy1tey1tuy1t+y1uOy1uey1uuy1u+y1vOy1vey1vuy1vwor7LaA7LaB7LaC7LaD7LaE7LaF7LaG7LaH7LaI7LaJ7LaK7LaL7LaM7LaN7LaO7LaP7LaQ7LaR7LaS7LaT7LaU7LaV7LaW7LaX7LaY7LaZ7Laa7Lab7Lac7Lad7Lae7LafCivstqDstqHstqLstqPstqTstqXstqbstqfstqjstqnstqrstqvstqzstq3stq7stq/strDstrHstrLstrPstrTstrXstrbstrfstrjstrnstrrstrvstrzstr3str7str8KK+y3gOy3gey3guy3g+y3hOy3hey3huy3h+y3iOy3iey3iuy3i+y3jOy3jey3juy3j+y3kOy3key3kuy3k+y3lOy3ley3luy3l+y3mOy3mey3muy3m+y3nOy3ney3nuy3nwor7Leg7Leh7Lei7Lej7Lek7Lel7Lem7Len7Leo7Lep7Leq7Ler7Les7Let7Leu7Lev7Lew7Lex7Ley7Lez7Le07Le17Le27Le37Le47Le57Le67Le77Le87Le97Le+7Le/CivsuIDsuIHsuILsuIPsuITsuIXsuIbsuIfsuIjsuInsuIrsuIvsuIzsuI3suI7suI/suJDsuJHsuJLsuJPsuJTsuJXsuJbsuJfsuJjsuJnsuJrsuJvsuJzsuJ3suJ7suJ8KK+y4oOy4oey4ouy4o+y4pOy4pey4puy4p+y4qOy4qey4quy4q+y4rOy4rey4ruy4r+y4sOy4sey4suy4s+y4tOy4tey4tuy4t+y4uOy4uey4uuy4u+y4vOy4vey4vuy4vwor7LmA7LmB7LmC7LmD7LmE7LmF7LmG7LmH7LmI7LmJ7LmK7LmL7LmM7LmN7LmO7LmP7LmQ7LmR7LmS7LmT7LmU7LmV7LmW7LmX7LmY7LmZ7Lma7Lmb7Lmc7Lmd7Lme7LmfCivsuaDsuaHsuaLsuaPsuaTsuaXsuabsuafsuajsuansuarsuavsuazsua3sua7sua/subDsubHsubLsubPsubTsubXsubbsubfsubjsubnsubrsubvsubzsub3sub7sub8KK+y6gOy6gey6guy6g+y6hOy6hey6huy6h+y6iOy6iey6iuy6i+y6jOy6jey6juy6j+y6kOy6key6kuy6k+y6lOy6ley6luy6l+y6mOy6mey6muy6m+y6nOy6ney6nuy6nwor7Lqg7Lqh7Lqi7Lqj7Lqk7Lql7Lqm7Lqn7Lqo7Lqp7Lqq7Lqr7Lqs7Lqt7Lqu7Lqv7Lqw7Lqx7Lqy7Lqz7Lq07Lq17Lq27Lq37Lq47Lq57Lq67Lq77Lq87Lq97Lq+7Lq/Civsu4Dsu4Hsu4Lsu4Psu4Tsu4Xsu4bsu4fsu4jsu4nsu4rsu4vsu4zsu43su47su4/su5Dsu5Hsu5Lsu5Psu5Tsu5Xsu5bsu5fsu5jsu5nsu5rsu5vsu5zsu53su57su58KK+y7oOy7oey7ouy7o+y7pOy7pey7puy7p+y7qOy7qey7quy7q+y7rOy7rey7ruy7r+y7sOy7sey7suy7s+y7tOy7tey7tuy7t+y7uOy7uey7uuy7u+y7vOy7vey7vuy7vwor7LyA7LyB7LyC7LyD7LyE7LyF7LyG7LyH7LyI7LyJ7LyK7LyL7LyM7LyN7LyO7LyP7LyQ7LyR7LyS7LyT7LyU7LyV7LyW7LyX7LyY7LyZ7Lya7Lyb7Lyc7Lyd7Lye7LyfCivsvKDsvKHsvKLsvKPsvKTsvKXsvKbsvKfsvKjsvKnsvKrsvKvsvKzsvK3svK7svK/svLDsvLHsvLLsvLPsvLTsvLXsvLbsvLfsvLjsvLnsvLrsvLvsvLzsvL3svL7svL8KK+y9gOy9gey9guy9g+y9hOy9hey9huy9h+y9iOy9iey9iuy9i+y9jOy9jey9juy9j+y9kOy9key9kuy9k+y9lOy9ley9luy9l+y9mOy9mey9muy9m+y9nOy9ney9nuy9nwor7L2g7L2h7L2i7L2j7L2k7L2l7L2m7L2n7L2o7L2p7L2q7L2r7L2s7L2t7L2u7L2v7L2w7L2x7L2y7L2z7L207L217L227L237L247L257L267L277L287L297L2+7L2/CivsvoDsvoHsvoLsvoPsvoTsvoXsvobsvofsvojsvonsvorsvovsvozsvo3svo7svo/svpDsvpHsvpLsvpPsvpTsvpXsvpbsvpfsvpjsvpnsvprsvpvsvpzsvp3svp7svp8KK+y+oOy+oey+ouy+o+y+pOy+pey+puy+p+y+qOy+qey+quy+q+y+rOy+rey+ruy+r+y+sOy+sey+suy+s+y+tOy+tey+tuy+t+y+uOy+uey+uuy+u+y+vOy+vey+vuy+vwor7L+A7L+B7L+C7L+D7L+E7L+F7L+G7L+H7L+I7L+J7L+K7L+L7L+M7L+N7L+O7L+P7L+Q7L+R7L+S7L+T7L+U7L+V7L+W7L+X7L+Y7L+Z7L+a7L+b7L+c7L+d7L+e7L+fCivsv6Dsv6Hsv6Lsv6Psv6Tsv6Xsv6bsv6fsv6jsv6nsv6rsv6vsv6zsv63sv67sv6/sv7Dsv7Hsv7Lsv7Psv7Tsv7Xsv7bsv7fsv7jsv7nsv7rsv7vsv7zsv73sv77sv78KK+2AgO2Age2Agu2Ag+2AhO2Ahe2Ahu2Ah+2AiO2Aie2Aiu2Ai+2AjO2Aje2Aju2Aj+2AkO2Ake2Aku2Ak+2AlO2Ale2Alu2Al+2AmO2Ame2Amu2Am+2AnO2Ane2Anu2Anwor7YCg7YCh7YCi7YCj7YCk7YCl7YCm7YCn7YCo7YCp7YCq7YCr7YCs7YCt7YCu7YCv7YCw7YCx7YCy7YCz7YC07YC17YC27YC37YC47YC57YC67YC77YC87YC97YC+7YC/CivtgYDtgYHtgYLtgYPtgYTtgYXtgYbtgYftgYjtgYntgYrtgYvtgYztgY3tgY7tgY/tgZDtgZHtgZLtgZPtgZTtgZXtgZbtgZftgZjtgZntgZrtgZvtgZztgZ3tgZ7tgZ8KK+2BoO2Boe2Bou2Bo+2BpO2Bpe2Bpu2Bp+2BqO2Bqe2Bqu2Bq+2BrO2Bre2Bru2Br+2BsO2Bse2Bsu2Bs+2BtO2Bte2Btu2Bt+2BuO2Bue2Buu2Bu+2BvO2Bve2Bvu2Bvwor7YKA7YKB7YKC7YKD7YKE7YKF7YKG7YKH7YKI7YKJ7YKK7YKL7YKM7YKN7YKO7YKP7YKQ7YKR7YKS7YKT7YKU7YKV7YKW7YKX7YKY7YKZ7YKa7YKb7YKc7YKd7YKe7YKfCivtgqDtgqHtgqLtgqPtgqTtgqXtgqbtgqftgqjtgqntgqrtgqvtgqztgq3tgq7tgq/tgrDtgrHtgrLtgrPtgrTtgrXtgrbtgrftgrjtgrntgrrtgrvtgrztgr3tgr7tgr8KK+2DgO2Dge2Dgu2Dg+2DhO2Dhe2Dhu2Dh+2DiO2Die2Diu2Di+2DjO2Dje2Dju2Dj+2DkO2Dke2Dku2Dk+2DlO2Dle2Dlu2Dl+2DmO2Dme2Dmu2Dm+2DnO2Dne2Dnu2Dnwor7YOg7YOh7YOi7YOj7YOk7YOl7YOm7YOn7YOo7YOp7YOq7YOr7YOs7YOt7YOu7YOv7YOw7YOx7YOy7YOz7YO07YO17YO27YO37YO47YO57YO67YO77YO87YO97YO+7YO/CivthIDthIHthILthIPthITthIXthIbthIfthIjthInthIrthIvthIzthI3thI7thI/thJDthJHthJLthJPthJTthJXthJbthJfthJjthJnthJrthJvthJzthJ3thJ7thJ8KK+2EoO2Eoe2Eou2Eo+2EpO2Epe2Epu2Ep+2EqO2Eqe2Equ2Eq+2ErO2Ere2Eru2Er+2EsO2Ese2Esu2Es+2EtO2Ete2Etu2Et+2EuO2Eue2Euu2Eu+2EvO2Eve2Evu2Evwor7YWA7YWB7YWC7YWD7YWE7YWF7YWG7YWH7YWI7YWJ7YWK7YWL7YWM7YWN7YWO7YWP7YWQ7YWR7YWS7YWT7YWU7YWV7YWW7YWX7YWY7YWZ7YWa7YWb7YWc7YWd7YWe7YWfCivthaDthaHthaLthaPthaTthaXthabthafthajthantharthavthaztha3tha7tha/thbDthbHthbLthbPthbTthbXthbbthbfthbjthbnthbrthbvthbzthb3thb7thb8KK+2GgO2Gge2Ggu2Gg+2GhO2Ghe2Ghu2Gh+2GiO2Gie2Giu2Gi+2GjO2Gje2Gju2Gj+2GkO2Gke2Gku2Gk+2GlO2Gle2Glu2Gl+2GmO2Gme2Gmu2Gm+2GnO2Gne2Gnu2Gnwor7Yag7Yah7Yai7Yaj7Yak7Yal7Yam7Yan7Yao7Yap7Yaq7Yar7Yas7Yat7Yau7Yav7Yaw7Yax7Yay7Yaz7Ya07Ya17Ya27Ya37Ya47Ya57Ya67Ya77Ya87Ya97Ya+7Ya/Civth4Dth4Hth4Lth4Pth4Tth4Xth4bth4fth4jth4nth4rth4vth4zth43th47th4/th5Dth5Hth5Lth5Pth5Tth5Xth5bth5fth5jth5nth5rth5vth5zth53th57th58KK+2HoO2Hoe2Hou2Ho+2HpO2Hpe2Hpu2Hp+2HqO2Hqe2Hqu2Hq+2HrO2Hre2Hru2Hr+2HsO2Hse2Hsu2Hs+2HtO2Hte2Htu2Ht+2HuO2Hue2Huu2Hu+2HvO2Hve2Hvu2Hvwor7YiA7YiB7YiC7YiD7YiE7YiF7YiG7YiH7YiI7YiJ7YiK7YiL7YiM7YiN7YiO7YiP7YiQ7YiR7YiS7YiT7YiU7YiV7YiW7YiX7YiY7YiZ7Yia7Yib7Yic7Yid7Yie7YifCivtiKDtiKHtiKLtiKPtiKTtiKXtiKbtiKftiKjtiKntiKrtiKvtiKztiK3tiK7tiK/tiLDtiLHtiLLtiLPtiLTtiLXtiLbtiLftiLjtiLntiLrtiLvtiLztiL3tiL7tiL8KK+2JgO2Jge2Jgu2Jg+2JhO2Jhe2Jhu2Jh+2JiO2Jie2Jiu2Ji+2JjO2Jje2Jju2Jj+2JkO2Jke2Jku2Jk+2JlO2Jle2Jlu2Jl+2JmO2Jme2Jmu2Jm+2JnO2Jne2Jnu2Jnwor7Ymg7Ymh7Ymi7Ymj7Ymk7Yml7Ymm7Ymn7Ymo7Ymp7Ymq7Ymr7Yms7Ymt7Ymu7Ymv7Ymw7Ymx7Ymy7Ymz7Ym07Ym17Ym27Ym37Ym47Ym57Ym67Ym77Ym87Ym97Ym+7Ym/CivtioDtioHtioLtioPtioTtioXtiobtioftiojtiontiortiovtioztio3tio7tio/tipDtipHtipLtipPtipTtipXtipbtipftipjtipntiprtipvtipztip3tip7tip8KK+2KoO2Koe2Kou2Ko+2KpO2Kpe2Kpu2Kp+2KqO2Kqe2Kqu2Kq+2KrO2Kre2Kru2Kr+2KsO2Kse2Ksu2Ks+2KtO2Kte2Ktu2Kt+2KuO2Kue2Kuu2Ku+2KvO2Kve2Kvu2Kvwor7YuA7YuB7YuC7YuD7YuE7YuF7YuG7YuH7YuI7YuJ7YuK7YuL7YuM7YuN7YuO7YuP7YuQ7YuR7YuS7YuT7YuU7YuV7YuW7YuX7YuY7YuZ7Yua7Yub7Yuc7Yud7Yue7YufCivti6Dti6Hti6Lti6Pti6Tti6Xti6bti6fti6jti6nti6rti6vti6zti63ti67ti6/ti7Dti7Hti7Lti7Pti7Tti7Xti7bti7fti7jti7nti7rti7vti7zti73ti77ti78KK+2MgO2Mge2Mgu2Mg+2MhO2Mhe2Mhu2Mh+2MiO2Mie2Miu2Mi+2MjO2Mje2Mju2Mj+2MkO2Mke2Mku2Mk+2MlO2Mle2Mlu2Ml+2MmO2Mme2Mmu2Mm+2MnO2Mne2Mnu2Mnwor7Yyg7Yyh7Yyi7Yyj7Yyk7Yyl7Yym7Yyn7Yyo7Yyp7Yyq7Yyr7Yys7Yyt7Yyu7Yyv7Yyw7Yyx7Yyy7Yyz7Yy07Yy17Yy27Yy37Yy47Yy57Yy67Yy77Yy87Yy97Yy+7Yy/CivtjYDtjYHtjYLtjYPtjYTtjYXtjYbtjYftjYjtjYntjYrtjYvtjYztjY3tjY7tjY/tjZDtjZHtjZLtjZPtjZTtjZXtjZbtjZftjZjtjZntjZrtjZvtjZztjZ3tjZ7tjZ8KK+2NoO2Noe2Nou2No+2NpO2Npe2Npu2Np+2NqO2Nqe2Nqu2Nq+2NrO2Nre2Nru2Nr+2NsO2Nse2Nsu2Ns+2NtO2Nte2Ntu2Nt+2NuO2Nue2Nuu2Nu+2NvO2Nve2Nvu2Nvwor7Y6A7Y6B7Y6C7Y6D7Y6E7Y6F7Y6G7Y6H7Y6I7Y6J7Y6K7Y6L7Y6M7Y6N7Y6O7Y6P7Y6Q7Y6R7Y6S7Y6T7Y6U7Y6V7Y6W7Y6X7Y6Y7Y6Z7Y6a7Y6b7Y6c7Y6d7Y6e7Y6fCivtjqDtjqHtjqLtjqPtjqTtjqXtjqbtjqftjqjtjqntjqrtjqvtjqztjq3tjq7tjq/tjrDtjrHtjrLtjrPtjrTtjrXtjrbtjrftjrjtjrntjrrtjrvtjrztjr3tjr7tjr8KK+2PgO2Pge2Pgu2Pg+2PhO2Phe2Phu2Ph+2PiO2Pie2Piu2Pi+2PjO2Pje2Pju2Pj+2PkO2Pke2Pku2Pk+2PlO2Ple2Plu2Pl+2PmO2Pme2Pmu2Pm+2PnO2Pne2Pnu2Pnwor7Y+g7Y+h7Y+i7Y+j7Y+k7Y+l7Y+m7Y+n7Y+o7Y+p7Y+q7Y+r7Y+s7Y+t7Y+u7Y+v7Y+w7Y+x7Y+y7Y+z7Y+07Y+17Y+27Y+37Y+47Y+57Y+67Y+77Y+87Y+97Y++7Y+/CivtkIDtkIHtkILtkIPtkITtkIXtkIbtkIftkIjtkIntkIrtkIvtkIztkI3tkI7tkI/tkJDtkJHtkJLtkJPtkJTtkJXtkJbtkJftkJjtkJntkJrtkJvtkJztkJ3tkJ7tkJ8KK+2QoO2Qoe2Qou2Qo+2QpO2Qpe2Qpu2Qp+2QqO2Qqe2Qqu2Qq+2QrO2Qre2Qru2Qr+2QsO2Qse2Qsu2Qs+2QtO2Qte2Qtu2Qt+2QuO2Que2Quu2Qu+2QvO2Qve2Qvu2Qvwor7ZGA7ZGB7ZGC7ZGD7ZGE7ZGF7ZGG7ZGH7ZGI7ZGJ7ZGK7ZGL7ZGM7ZGN7ZGO7ZGP7ZGQ7ZGR7ZGS7ZGT7ZGU7ZGV7ZGW7ZGX7ZGY7ZGZ7ZGa7ZGb7ZGc7ZGd7ZGe7ZGfCivtkaDtkaHtkaLtkaPtkaTtkaXtkabtkaftkajtkantkartkavtkaztka3tka7tka/tkbDtkbHtkbLtkbPtkbTtkbXtkbbtkbftkbjtkbntkbrtkbvtkbztkb3tkb7tkb8KK+2SgO2Sge2Sgu2Sg+2ShO2She2Shu2Sh+2SiO2Sie2Siu2Si+2SjO2Sje2Sju2Sj+2SkO2Ske2Sku2Sk+2SlO2Sle2Slu2Sl+2SmO2Sme2Smu2Sm+2SnO2Sne2Snu2Snwor7ZKg7ZKh7ZKi7ZKj7ZKk7ZKl7ZKm7ZKn7ZKo7ZKp7ZKq7ZKr7ZKs7ZKt7ZKu7ZKv7ZKw7ZKx7ZKy7ZKz7ZK07ZK17ZK27ZK37ZK47ZK57ZK67ZK77ZK87ZK97ZK+7ZK/Civtk4Dtk4Htk4Ltk4Ptk4Ttk4Xtk4btk4ftk4jtk4ntk4rtk4vtk4ztk43tk47tk4/tk5Dtk5Htk5Ltk5Ptk5Ttk5Xtk5btk5ftk5jtk5ntk5rtk5vtk5ztk53tk57tk58KK+2ToO2Toe2Tou2To+2TpO2Tpe2Tpu2Tp+2TqO2Tqe2Tqu2Tq+2TrO2Tre2Tru2Tr+2TsO2Tse2Tsu2Ts+2TtO2Tte2Ttu2Tt+2TuO2Tue2Tuu2Tu+2TvO2Tve2Tvu2Tvwor7ZSA7ZSB7ZSC7ZSD7ZSE7ZSF7ZSG7ZSH7ZSI7ZSJ7ZSK7ZSL7ZSM7ZSN7ZSO7ZSP7ZSQ7ZSR7ZSS7ZST7ZSU7ZSV7ZSW7ZSX7ZSY7ZSZ7ZSa7ZSb7ZSc7ZSd7ZSe7ZSfCivtlKDtlKHtlKLtlKPtlKTtlKXtlKbtlKftlKjtlKntlKrtlKvtlKztlK3tlK7tlK/tlLDtlLHtlLLtlLPtlLTtlLXtlLbtlLftlLjtlLntlLrtlLvtlLztlL3tlL7tlL8KK+2VgO2Vge2Vgu2Vg+2VhO2Vhe2Vhu2Vh+2ViO2Vie2Viu2Vi+2VjO2Vje2Vju2Vj+2VkO2Vke2Vku2Vk+2VlO2Vle2Vlu2Vl+2VmO2Vme2Vmu2Vm+2VnO2Vne2Vnu2Vnwor7ZWg7ZWh7ZWi7ZWj7ZWk7ZWl7ZWm7ZWn7ZWo7ZWp7ZWq7ZWr7ZWs7ZWt7ZWu7ZWv7ZWw7ZWx7ZWy7ZWz7ZW07ZW17ZW27ZW37ZW47ZW57ZW67ZW77ZW87ZW97ZW+7ZW/CivtloDtloHtloLtloPtloTtloXtlobtloftlojtlontlortlovtloztlo3tlo7tlo/tlpDtlpHtlpLtlpPtlpTtlpXtlpbtlpftlpjtlpntlprtlpvtlpztlp3tlp7tlp8KK+2WoO2Woe2Wou2Wo+2WpO2Wpe2Wpu2Wp+2WqO2Wqe2Wqu2Wq+2WrO2Wre2Wru2Wr+2WsO2Wse2Wsu2Ws+2WtO2Wte2Wtu2Wt+2WuO2Wue2Wuu2Wu+2WvO2Wve2Wvu2Wvwor7ZeA7ZeB7ZeC7ZeD7ZeE7ZeF7ZeG7ZeH7ZeI7ZeJ7ZeK7ZeL7ZeM7ZeN7ZeO7ZeP7ZeQ7ZeR7ZeS7ZeT7ZeU7ZeV7ZeW7ZeX7ZeY7ZeZ7Zea7Zeb7Zec7Zed7Zee7ZefCivtl6Dtl6Htl6Ltl6Ptl6Ttl6Xtl6btl6ftl6jtl6ntl6rtl6vtl6ztl63tl67tl6/tl7Dtl7Htl7Ltl7Ptl7Ttl7Xtl7btl7ftl7jtl7ntl7rtl7vtl7ztl73tl77tl78KK+2YgO2Yge2Ygu2Yg+2YhO2Yhe2Yhu2Yh+2YiO2Yie2Yiu2Yi+2YjO2Yje2Yju2Yj+2YkO2Yke2Yku2Yk+2YlO2Yle2Ylu2Yl+2YmO2Yme2Ymu2Ym+2YnO2Yne2Ynu2Ynwor7Zig7Zih7Zii7Zij7Zik7Zil7Zim7Zin7Zio7Zip7Ziq7Zir7Zis7Zit7Ziu7Ziv7Ziw7Zix7Ziy7Ziz7Zi07Zi17Zi27Zi37Zi47Zi57Zi67Zi77Zi87Zi97Zi+7Zi/CivtmYDtmYHtmYLtmYPtmYTtmYXtmYbtmYftmYjtmYntmYrtmYvtmYztmY3tmY7tmY/tmZDtmZHtmZLtmZPtmZTtmZXtmZbtmZftmZjtmZntmZrtmZvtmZztmZ3tmZ7tmZ8KK+2ZoO2Zoe2Zou2Zo+2ZpO2Zpe2Zpu2Zp+2ZqO2Zqe2Zqu2Zq+2ZrO2Zre2Zru2Zr+2ZsO2Zse2Zsu2Zs+2ZtO2Zte2Ztu2Zt+2ZuO2Zue2Zuu2Zu+2ZvO2Zve2Zvu2Zvwor7ZqA7ZqB7ZqC7ZqD7ZqE7ZqF7ZqG7ZqH7ZqI7ZqJ7ZqK7ZqL7ZqM7ZqN7ZqO7ZqP7ZqQ7ZqR7ZqS7ZqT7ZqU7ZqV7ZqW7ZqX7ZqY7ZqZ7Zqa7Zqb7Zqc7Zqd7Zqe7ZqfCivtmqDtmqHtmqLtmqPtmqTtmqXtmqbtmqftmqjtmqntmqrtmqvtmqztmq3tmq7tmq/tmrDtmrHtmrLtmrPtmrTtmrXtmrbtmrftmrjtmrntmrrtmrvtmrztmr3tmr7tmr8KK+2bgO2bge2bgu2bg+2bhO2bhe2bhu2bh+2biO2bie2biu2bi+2bjO2bje2bju2bj+2bkO2bke2bku2bk+2blO2ble2blu2bl+2bmO2bme2bmu2bm+2bnO2bne2bnu2bnwor7Zug7Zuh7Zui7Zuj7Zuk7Zul7Zum7Zun7Zuo7Zup7Zuq7Zur7Zus7Zut7Zuu7Zuv7Zuw7Zux7Zuy7Zuz7Zu07Zu17Zu27Zu37Zu47Zu57Zu67Zu77Zu87Zu97Zu+7Zu/CivtnIDtnIHtnILtnIPtnITtnIXtnIbtnIftnIjtnIntnIrtnIvtnIztnI3tnI7tnI/tnJDtnJHtnJLtnJPtnJTtnJXtnJbtnJftnJjtnJntnJrtnJvtnJztnJ3tnJ7tnJ8KK+2coO2coe2cou2co+2cpO2cpe2cpu2cp+2cqO2cqe2cqu2cq+2crO2cre2cru2cr+2csO2cse2csu2cs+2ctO2cte2ctu2ct+2cuO2cue2cuu2cu+2cvO2cve2cvu2cvwor7Z2A7Z2B7Z2C7Z2D7Z2E7Z2F7Z2G7Z2H7Z2I7Z2J7Z2K7Z2L7Z2M7Z2N7Z2O7Z2P7Z2Q7Z2R7Z2S7Z2T7Z2U7Z2V7Z2W7Z2X7Z2Y7Z2Z7Z2a7Z2b7Z2c7Z2d7Z2e7Z2fCivtnaDtnaHtnaLtnaPtnaTtnaXtnabtnaftnajtnantnartnavtnaztna3tna7tna/tnbDtnbHtnbLtnbPtnbTtnbXtnbbtnbftnbjtnbntnbrtnbvtnbztnb3tnb7tnb8KK+2egO2ege2egu2eg+2ehO2ehe2ehu2eh+2eiO2eie2eiu2ei+2ejO2eje2eju2ej+2ekO2eke2eku2ek+2elO2ele2elu2el+2emO2eme2emu2em+2enO2ene2enu2enwor7Z6g7Z6h7Z6i7Z6j7Z6k7Z6l7Z6m7Z6n7Z6o7Z6p7Z6q7Z6r7Z6s7Z6t7Z6u7Z6vCisKK0ZyZWUgYmxvY2sgKFUrRDdCMC1VK0Q3RkYpOgorCivtnrDtnrHtnrLtnrPtnrTtnrXtnrbtnrftnrjtnrntnrrtnrvtnrztnr3tnr7tnr/tn4Dtn4Htn4Ltn4Ptn4Ttn4Xtn4btn4ftn4jtn4ntn4rtn4vtn4ztn43tn47tn4/tn5Dtn5Htn5Ltn5Ptn5Ttn5Xtn5btn5ftn5jtn5ntn5rtn5vtn5ztn53tn57tn5/tn6Dtn6Htn6Ltn6Ptn6Ttn6Xtn6btn6ftn6jtn6ntn6rtn6vtn6ztn63tn67tn68KK+2fsO2fse2fsu2fs+2ftO2fte2ftu2ft+2fuO2fue2fuu2fu+2fvO2fve2fvu2fvworCitIaWdoIFN1cnJvZ2F0ZXMgKFUrRDgwMC1VK0RCN0YpOgorCivtoIDtoIHtoILtoIPtoITtoIXtoIbtoIftoIjtoIntoIrtoIvtoIztoI3toI7toI/toJDtoJHtoJLtoJPtoJTtoJXtoJbtoJftoJjtoJntoJrtoJvtoJztoJ3toJ7toJ/toKDtoKHtoKLtoKPtoKTtoKXtoKbtoKftoKjtoKntoKrtoKvtoKztoK3toK7toK/toLDtoLHtoLLtoLPtoLTtoLXtoLbtoLftoLjtoLntoLrtoLvtoLztoL3toL7toL8KK+2hgO2hge2hgu2hg+2hhO2hhe2hhu2hh+2hiO2hie2hiu2hi+2hjO2hje2hju2hj+2hkO2hke2hku2hk+2hlO2hle2hlu2hl+2hmO2hme2hmu2hm+2hnO2hne2hnu2hn+2hoO2hoe2hou2ho+2hpO2hpe2hpu2hp+2hqO2hqe2hqu2hq+2hrO2hre2hru2hr+2hsO2hse2hsu2hs+2htO2hte2htu2ht+2huO2hue2huu2hu+2hvO2hve2hvu2hvwor7aKA7aKB7aKC7aKD7aKE7aKF7aKG7aKH7aKI7aKJ7aKK7aKL7aKM7aKN7aKO7aKP7aKQ7aKR7aKS7aKT7aKU7aKV7aKW7aKX7aKY7aKZ7aKa7aKb7aKc7aKd7aKe7aKf7aKg7aKh7aKi7aKj7aKk7aKl7aKm7aKn7aKo7aKp7aKq7aKr7aKs7aKt7aKu7aKv7aKw7aKx7aKy7aKz7aK07aK17aK27aK37aK47aK57aK67aK77aK87aK97aK+7aK/Civto4Dto4Hto4Lto4Pto4Tto4Xto4bto4fto4jto4nto4rto4vto4zto43to47to4/to5Dto5Hto5Lto5Pto5Tto5Xto5bto5fto5jto5nto5rto5vto5zto53to57to5/to6Dto6Hto6Lto6Pto6Tto6Xto6bto6fto6jto6nto6rto6vto6zto63to67to6/to7Dto7Hto7Lto7Pto7Tto7Xto7bto7fto7jto7nto7rto7vto7zto73to77to78KK+2kgO2kge2kgu2kg+2khO2khe2khu2kh+2kiO2kie2kiu2ki+2kjO2kje2kju2kj+2kkO2kke2kku2kk+2klO2kle2klu2kl+2kmO2kme2kmu2km+2knO2kne2knu2kn+2koO2koe2kou2ko+2kpO2kpe2kpu2kp+2kqO2kqe2kqu2kq+2krO2kre2kru2kr+2ksO2kse2ksu2ks+2ktO2kte2ktu2kt+2kuO2kue2kuu2ku+2kvO2kve2kvu2kvwor7aWA7aWB7aWC7aWD7aWE7aWF7aWG7aWH7aWI7aWJ7aWK7aWL7aWM7aWN7aWO7aWP7aWQ7aWR7aWS7aWT7aWU7aWV7aWW7aWX7aWY7aWZ7aWa7aWb7aWc7aWd7aWe7aWf7aWg7aWh7aWi7aWj7aWk7aWl7aWm7aWn7aWo7aWp7aWq7aWr7aWs7aWt7aWu7aWv7aWw7aWx7aWy7aWz7aW07aW17aW27aW37aW47aW57aW67aW77aW87aW97aW+7aW/CivtpoDtpoHtpoLtpoPtpoTtpoXtpobtpoftpojtpontportpovtpoztpo3tpo7tpo/tppDtppHtppLtppPtppTtppXtppbtppftppjtppntpprtppvtppztpp3tpp7tpp/tpqDtpqHtpqLtpqPtpqTtpqXtpqbtpqftpqjtpqntpqrtpqvtpqztpq3tpq7tpq/tprDtprHtprLtprPtprTtprXtprbtprftprjtprntprrtprvtprztpr3tpr7tpr8KK+2ngO2nge2ngu2ng+2nhO2nhe2nhu2nh+2niO2nie2niu2ni+2njO2nje2nju2nj+2nkO2nke2nku2nk+2nlO2nle2nlu2nl+2nmO2nme2nmu2nm+2nnO2nne2nnu2nn+2noO2noe2nou2no+2npO2npe2npu2np+2nqO2nqe2nqu2nq+2nrO2nre2nru2nr+2nsO2nse2nsu2ns+2ntO2nte2ntu2nt+2nuO2nue2nuu2nu+2nvO2nve2nvu2nvwor7aiA7aiB7aiC7aiD7aiE7aiF7aiG7aiH7aiI7aiJ7aiK7aiL7aiM7aiN7aiO7aiP7aiQ7aiR7aiS7aiT7aiU7aiV7aiW7aiX7aiY7aiZ7aia7aib7aic7aid7aie7aif7aig7aih7aii7aij7aik7ail7aim7ain7aio7aip7aiq7air7ais7ait7aiu7aiv7aiw7aix7aiy7aiz7ai07ai17ai27ai37ai47ai57ai67ai77ai87ai97ai+7ai/CivtqYDtqYHtqYLtqYPtqYTtqYXtqYbtqYftqYjtqYntqYrtqYvtqYztqY3tqY7tqY/tqZDtqZHtqZLtqZPtqZTtqZXtqZbtqZftqZjtqZntqZrtqZvtqZztqZ3tqZ7tqZ/tqaDtqaHtqaLtqaPtqaTtqaXtqabtqaftqajtqantqartqavtqaztqa3tqa7tqa/tqbDtqbHtqbLtqbPtqbTtqbXtqbbtqbftqbjtqbntqbrtqbvtqbztqb3tqb7tqb8KK+2qgO2qge2qgu2qg+2qhO2qhe2qhu2qh+2qiO2qie2qiu2qi+2qjO2qje2qju2qj+2qkO2qke2qku2qk+2qlO2qle2qlu2ql+2qmO2qme2qmu2qm+2qnO2qne2qnu2qn+2qoO2qoe2qou2qo+2qpO2qpe2qpu2qp+2qqO2qqe2qqu2qq+2qrO2qre2qru2qr+2qsO2qse2qsu2qs+2qtO2qte2qtu2qt+2quO2que2quu2qu+2qvO2qve2qvu2qvwor7auA7auB7auC7auD7auE7auF7auG7auH7auI7auJ7auK7auL7auM7auN7auO7auP7auQ7auR7auS7auT7auU7auV7auW7auX7auY7auZ7aua7aub7auc7aud7aue7auf7aug7auh7aui7auj7auk7aul7aum7aun7auo7aup7auq7aur7aus7aut7auu7auv7auw7aux7auy7auz7au07au17au27au37au47au57au67au77au87au97au+7au/CivtrIDtrIHtrILtrIPtrITtrIXtrIbtrIftrIjtrIntrIrtrIvtrIztrI3trI7trI/trJDtrJHtrJLtrJPtrJTtrJXtrJbtrJftrJjtrJntrJrtrJvtrJztrJ3trJ7trJ/trKDtrKHtrKLtrKPtrKTtrKXtrKbtrKftrKjtrKntrKrtrKvtrKztrK3trK7trK/trLDtrLHtrLLtrLPtrLTtrLXtrLbtrLftrLjtrLntrLrtrLvtrLztrL3trL7trL8KK+2tgO2tge2tgu2tg+2thO2the2thu2th+2tiO2tie2tiu2ti+2tjO2tje2tju2tj+2tkO2tke2tku2tk+2tlO2tle2tlu2tl+2tmO2tme2tmu2tm+2tnO2tne2tnu2tn+2toO2toe2tou2to+2tpO2tpe2tpu2tp+2tqO2tqe2tqu2tq+2trO2tre2tru2tr+2tsO2tse2tsu2ts+2ttO2tte2ttu2tt+2tuO2tue2tuu2tu+2tvO2tve2tvu2tvworCitIaWdoIFByaXZhdGUgVXNlIFN1cnJvZ2F0ZXMgKFUrREI4MC1VK0RCRkYpOgorCivtroDtroHtroLtroPtroTtroXtrobtroftrojtrontrortrovtroztro3tro7tro/trpDtrpHtrpLtrpPtrpTtrpXtrpbtrpftrpjtrpntrprtrpvtrpztrp3trp7trp/trqDtrqHtrqLtrqPtrqTtrqXtrqbtrqftrqjtrqntrqrtrqvtrqztrq3trq7trq/trrDtrrHtrrLtrrPtrrTtrrXtrrbtrrftrrjtrrntrrrtrrvtrrztrr3trr7trr8KK+2vgO2vge2vgu2vg+2vhO2vhe2vhu2vh+2viO2vie2viu2vi+2vjO2vje2vju2vj+2vkO2vke2vku2vk+2vlO2vle2vlu2vl+2vmO2vme2vmu2vm+2vnO2vne2vnu2vn+2voO2voe2vou2vo+2vpO2vpe2vpu2vp+2vqO2vqe2vqu2vq+2vrO2vre2vru2vr+2vsO2vse2vsu2vs+2vtO2vte2vtu2vt+2vuO2vue2vuu2vu+2vvO2vve2vvu2vvworCitMb3cgU3Vycm9nYXRlcyAoVStEQzAwLVUrREZGRik6CisKK+2wgO2wge2wgu2wg+2whO2whe2whu2wh+2wiO2wie2wiu2wi+2wjO2wje2wju2wj+2wkO2wke2wku2wk+2wlO2wle2wlu2wl+2wmO2wme2wmu2wm+2wnO2wne2wnu2wn+2woO2woe2wou2wo+2wpO2wpe2wpu2wp+2wqO2wqe2wqu2wq+2wrO2wre2wru2wr+2wsO2wse2wsu2ws+2wtO2wte2wtu2wt+2wuO2wue2wuu2wu+2wvO2wve2wvu2wvwor7bGA7bGB7bGC7bGD7bGE7bGF7bGG7bGH7bGI7bGJ7bGK7bGL7bGM7bGN7bGO7bGP7bGQ7bGR7bGS7bGT7bGU7bGV7bGW7bGX7bGY7bGZ7bGa7bGb7bGc7bGd7bGe7bGf7bGg7bGh7bGi7bGj7bGk7bGl7bGm7bGn7bGo7bGp7bGq7bGr7bGs7bGt7bGu7bGv7bGw7bGx7bGy7bGz7bG07bG17bG27bG37bG47bG57bG67bG77bG87bG97bG+7bG/CivtsoDtsoHtsoLtsoPtsoTtsoXtsobtsoftsojtsontsortsovtsoztso3tso7tso/tspDtspHtspLtspPtspTtspXtspbtspftspjtspntsprtspvtspztsp3tsp7tsp/tsqDtsqHtsqLtsqPtsqTtsqXtsqbtsqftsqjtsqntsqrtsqvtsqztsq3tsq7tsq/tsrDtsrHtsrLtsrPtsrTtsrXtsrbtsrftsrjtsrntsrrtsrvtsrztsr3tsr7tsr8KK+2zgO2zge2zgu2zg+2zhO2zhe2zhu2zh+2ziO2zie2ziu2zi+2zjO2zje2zju2zj+2zkO2zke2zku2zk+2zlO2zle2zlu2zl+2zmO2zme2zmu2zm+2znO2zne2znu2zn+2zoO2zoe2zou2zo+2zpO2zpe2zpu2zp+2zqO2zqe2zqu2zq+2zrO2zre2zru2zr+2zsO2zse2zsu2zs+2ztO2zte2ztu2zt+2zuO2zue2zuu2zu+2zvO2zve2zvu2zvwor7bSA7bSB7bSC7bSD7bSE7bSF7bSG7bSH7bSI7bSJ7bSK7bSL7bSM7bSN7bSO7bSP7bSQ7bSR7bSS7bST7bSU7bSV7bSW7bSX7bSY7bSZ7bSa7bSb7bSc7bSd7bSe7bSf7bSg7bSh7bSi7bSj7bSk7bSl7bSm7bSn7bSo7bSp7bSq7bSr7bSs7bSt7bSu7bSv7bSw7bSx7bSy7bSz7bS07bS17bS27bS37bS47bS57bS67bS77bS87bS97bS+7bS/CivttYDttYHttYLttYPttYTttYXttYbttYfttYjttYnttYrttYvttYzttY3ttY7ttY/ttZDttZHttZLttZPttZTttZXttZbttZfttZjttZnttZrttZvttZzttZ3ttZ7ttZ/ttaDttaHttaLttaPttaTttaXttabttafttajttanttarttavttaztta3tta7tta/ttbDttbHttbLttbPttbTttbXttbbttbfttbjttbnttbrttbvttbzttb3ttb7ttb8KK+22gO22ge22gu22g+22hO22he22hu22h+22iO22ie22iu22i+22jO22je22ju22j+22kO22ke22ku22k+22lO22le22lu22l+22mO22me22mu22m+22nO22ne22nu22n+22oO22oe22ou22o+22pO22pe22pu22p+22qO22qe22qu22q+22rO22re22ru22r+22sO22se22su22s+22tO22te22tu22t+22uO22ue22uu22u+22vO22ve22vu22vwor7beA7beB7beC7beD7beE7beF7beG7beH7beI7beJ7beK7beL7beM7beN7beO7beP7beQ7beR7beS7beT7beU7beV7beW7beX7beY7beZ7bea7beb7bec7bed7bee7bef7beg7beh7bei7bej7bek7bel7bem7ben7beo7bep7beq7ber7bes7bet7beu7bev7bew7bex7bey7bez7be07be17be27be37be47be57be67be77be87be97be+7be/CivtuIDtuIHtuILtuIPtuITtuIXtuIbtuIftuIjtuIntuIrtuIvtuIztuI3tuI7tuI/tuJDtuJHtuJLtuJPtuJTtuJXtuJbtuJftuJjtuJntuJrtuJvtuJztuJ3tuJ7tuJ/tuKDtuKHtuKLtuKPtuKTtuKXtuKbtuKftuKjtuKntuKrtuKvtuKztuK3tuK7tuK/tuLDtuLHtuLLtuLPtuLTtuLXtuLbtuLftuLjtuLntuLrtuLvtuLztuL3tuL7tuL8KK+25gO25ge25gu25g+25hO25he25hu25h+25iO25ie25iu25i+25jO25je25ju25j+25kO25ke25ku25k+25lO25le25lu25l+25mO25me25mu25m+25nO25ne25nu25n+25oO25oe25ou25o+25pO25pe25pu25p+25qO25qe25qu25q+25rO25re25ru25r+25sO25se25su25s+25tO25te25tu25t+25uO25ue25uu25u+25vO25ve25vu25vwor7bqA7bqB7bqC7bqD7bqE7bqF7bqG7bqH7bqI7bqJ7bqK7bqL7bqM7bqN7bqO7bqP7bqQ7bqR7bqS7bqT7bqU7bqV7bqW7bqX7bqY7bqZ7bqa7bqb7bqc7bqd7bqe7bqf7bqg7bqh7bqi7bqj7bqk7bql7bqm7bqn7bqo7bqp7bqq7bqr7bqs7bqt7bqu7bqv7bqw7bqx7bqy7bqz7bq07bq17bq27bq37bq47bq57bq67bq77bq87bq97bq+7bq/Civtu4Dtu4Htu4Ltu4Ptu4Ttu4Xtu4btu4ftu4jtu4ntu4rtu4vtu4ztu43tu47tu4/tu5Dtu5Htu5Ltu5Ptu5Ttu5Xtu5btu5ftu5jtu5ntu5rtu5vtu5ztu53tu57tu5/tu6Dtu6Htu6Ltu6Ptu6Ttu6Xtu6btu6ftu6jtu6ntu6rtu6vtu6ztu63tu67tu6/tu7Dtu7Htu7Ltu7Ptu7Ttu7Xtu7btu7ftu7jtu7ntu7rtu7vtu7ztu73tu77tu78KK+28gO28ge28gu28g+28hO28he28hu28h+28iO28ie28iu28i+28jO28je28ju28j+28kO28ke28ku28k+28lO28le28lu28l+28mO28me28mu28m+28nO28ne28nu28n+28oO28oe28ou28o+28pO28pe28pu28p+28qO28qe28qu28q+28rO28re28ru28r+28sO28se28su28s+28tO28te28tu28t+28uO28ue28uu28u+28vO28ve28vu28vwor7b2A7b2B7b2C7b2D7b2E7b2F7b2G7b2H7b2I7b2J7b2K7b2L7b2M7b2N7b2O7b2P7b2Q7b2R7b2S7b2T7b2U7b2V7b2W7b2X7b2Y7b2Z7b2a7b2b7b2c7b2d7b2e7b2f7b2g7b2h7b2i7b2j7b2k7b2l7b2m7b2n7b2o7b2p7b2q7b2r7b2s7b2t7b2u7b2v7b2w7b2x7b2y7b2z7b207b217b227b237b247b257b267b277b287b297b2+7b2/CivtvoDtvoHtvoLtvoPtvoTtvoXtvobtvoftvojtvontvortvovtvoztvo3tvo7tvo/tvpDtvpHtvpLtvpPtvpTtvpXtvpbtvpftvpjtvpntvprtvpvtvpztvp3tvp7tvp/tvqDtvqHtvqLtvqPtvqTtvqXtvqbtvqftvqjtvqntvqrtvqvtvqztvq3tvq7tvq/tvrDtvrHtvrLtvrPtvrTtvrXtvrbtvrftvrjtvrntvrrtvrvtvrztvr3tvr7tvr8KK+2/gO2/ge2/gu2/g+2/hO2/he2/hu2/h+2/iO2/ie2/iu2/i+2/jO2/je2/ju2/j+2/kO2/ke2/ku2/k+2/lO2/le2/lu2/l+2/mO2/me2/mu2/m+2/nO2/ne2/nu2/n+2/oO2/oe2/ou2/o+2/pO2/pe2/pu2/p+2/qO2/qe2/qu2/q+2/rO2/re2/ru2/r+2/sO2/se2/su2/s+2/tO2/te2/tu2/t+2/uO2/ue2/uu2/u+2/vO2/ve2/vu2/vworCitQcml2YXRlIFVzZSBBcmVhIChVK0UwMDAtVStGOEZGKToKKwor7oCA7oCB7oCC7oCD7oCE7oCF7oCG7oCH7oCI7oCJ7oCK7oCL7oCM7oCN7oCO7oCP7oCQ7oCR7oCS7oCT7oCU7oCV7oCW7oCX7oCY7oCZ7oCa7oCb7oCc7oCd7oCe7oCf7oCg7oCh7oCi7oCj7oCk7oCl7oCm7oCn7oCo7oCp7oCq7oCr7oCs7oCt7oCu7oCv7oCw7oCx7oCy7oCz7oC07oC17oC27oC37oC47oC57oC67oC77oC87oC97oC+7oC/CivugYDugYHugYLugYPugYTugYXugYbugYfugYjugYnugYrugYvugYzugY3ugY7ugY/ugZDugZHugZLugZPugZTugZXugZbugZfugZjugZnugZrugZvugZzugZ3ugZ7ugZ/ugaDugaHugaLugaPugaTugaXugabugafugajuganugarugavugazuga3uga7uga/ugbDugbHugbLugbPugbTugbXugbbugbfugbjugbnugbrugbvugbzugb3ugb7ugb8KK+6CgO6Cge6Cgu6Cg+6ChO6Che6Chu6Ch+6CiO6Cie6Ciu6Ci+6CjO6Cje6Cju6Cj+6CkO6Cke6Cku6Ck+6ClO6Cle6Clu6Cl+6CmO6Cme6Cmu6Cm+6CnO6Cne6Cnu6Cn+6CoO6Coe6Cou6Co+6CpO6Cpe6Cpu6Cp+6CqO6Cqe6Cqu6Cq+6CrO6Cre6Cru6Cr+6CsO6Cse6Csu6Cs+6CtO6Cte6Ctu6Ct+6CuO6Cue6Cuu6Cu+6CvO6Cve6Cvu6Cvwor7oOA7oOB7oOC7oOD7oOE7oOF7oOG7oOH7oOI7oOJ7oOK7oOL7oOM7oON7oOO7oOP7oOQ7oOR7oOS7oOT7oOU7oOV7oOW7oOX7oOY7oOZ7oOa7oOb7oOc7oOd7oOe7oOf7oOg7oOh7oOi7oOj7oOk7oOl7oOm7oOn7oOo7oOp7oOq7oOr7oOs7oOt7oOu7oOv7oOw7oOx7oOy7oOz7oO07oO17oO27oO37oO47oO57oO67oO77oO87oO97oO+7oO/CivuhIDuhIHuhILuhIPuhITuhIXuhIbuhIfuhIjuhInuhIruhIvuhIzuhI3uhI7uhI/uhJDuhJHuhJLuhJPuhJTuhJXuhJbuhJfuhJjuhJnuhJruhJvuhJzuhJ3uhJ7uhJ/uhKDuhKHuhKLuhKPuhKTuhKXuhKbuhKfuhKjuhKnuhKruhKvuhKzuhK3uhK7uhK/uhLDuhLHuhLLuhLPuhLTuhLXuhLbuhLfuhLjuhLnuhLruhLvuhLzuhL3uhL7uhL8KK+6FgO6Fge6Fgu6Fg+6FhO6Fhe6Fhu6Fh+6FiO6Fie6Fiu6Fi+6FjO6Fje6Fju6Fj+6FkO6Fke6Fku6Fk+6FlO6Fle6Flu6Fl+6FmO6Fme6Fmu6Fm+6FnO6Fne6Fnu6Fn+6FoO6Foe6Fou6Fo+6FpO6Fpe6Fpu6Fp+6FqO6Fqe6Fqu6Fq+6FrO6Fre6Fru6Fr+6FsO6Fse6Fsu6Fs+6FtO6Fte6Ftu6Ft+6FuO6Fue6Fuu6Fu+6FvO6Fve6Fvu6Fvwor7oaA7oaB7oaC7oaD7oaE7oaF7oaG7oaH7oaI7oaJ7oaK7oaL7oaM7oaN7oaO7oaP7oaQ7oaR7oaS7oaT7oaU7oaV7oaW7oaX7oaY7oaZ7oaa7oab7oac7oad7oae7oaf7oag7oah7oai7oaj7oak7oal7oam7oan7oao7oap7oaq7oar7oas7oat7oau7oav7oaw7oax7oay7oaz7oa07oa17oa27oa37oa47oa57oa67oa77oa87oa97oa+7oa/Civuh4Duh4Huh4Luh4Puh4Tuh4Xuh4buh4fuh4juh4nuh4ruh4vuh4zuh43uh47uh4/uh5Duh5Huh5Luh5Puh5Tuh5Xuh5buh5fuh5juh5nuh5ruh5vuh5zuh53uh57uh5/uh6Duh6Huh6Luh6Puh6Tuh6Xuh6buh6fuh6juh6nuh6ruh6vuh6zuh63uh67uh6/uh7Duh7Huh7Luh7Puh7Tuh7Xuh7buh7fuh7juh7nuh7ruh7vuh7zuh73uh77uh78KK+6IgO6Ige6Igu6Ig+6IhO6Ihe6Ihu6Ih+6IiO6Iie6Iiu6Ii+6IjO6Ije6Iju6Ij+6IkO6Ike6Iku6Ik+6IlO6Ile6Ilu6Il+6ImO6Ime6Imu6Im+6InO6Ine6Inu6In+6IoO6Ioe6Iou6Io+6IpO6Ipe6Ipu6Ip+6IqO6Iqe6Iqu6Iq+6IrO6Ire6Iru6Ir+6IsO6Ise6Isu6Is+6ItO6Ite6Itu6It+6IuO6Iue6Iuu6Iu+6IvO6Ive6Ivu6Ivwor7omA7omB7omC7omD7omE7omF7omG7omH7omI7omJ7omK7omL7omM7omN7omO7omP7omQ7omR7omS7omT7omU7omV7omW7omX7omY7omZ7oma7omb7omc7omd7ome7omf7omg7omh7omi7omj7omk7oml7omm7omn7omo7omp7omq7omr7oms7omt7omu7omv7omw7omx7omy7omz7om07om17om27om37om47om57om67om77om87om97om+7om/CivuioDuioHuioLuioPuioTuioXuiobuiofuiojuionuioruiovuiozuio3uio7uio/uipDuipHuipLuipPuipTuipXuipbuipfuipjuipnuipruipvuipzuip3uip7uip/uiqDuiqHuiqLuiqPuiqTuiqXuiqbuiqfuiqjuiqnuiqruiqvuiqzuiq3uiq7uiq/uirDuirHuirLuirPuirTuirXuirbuirfuirjuirnuirruirvuirzuir3uir7uir8KK+6LgO6Lge6Lgu6Lg+6LhO6Lhe6Lhu6Lh+6LiO6Lie6Liu6Li+6LjO6Lje6Lju6Lj+6LkO6Lke6Lku6Lk+6LlO6Lle6Llu6Ll+6LmO6Lme6Lmu6Lm+6LnO6Lne6Lnu6Ln+6LoO6Loe6Lou6Lo+6LpO6Lpe6Lpu6Lp+6LqO6Lqe6Lqu6Lq+6LrO6Lre6Lru6Lr+6LsO6Lse6Lsu6Ls+6LtO6Lte6Ltu6Lt+6LuO6Lue6Luu6Lu+6LvO6Lve6Lvu6Lvwor7oyA7oyB7oyC7oyD7oyE7oyF7oyG7oyH7oyI7oyJ7oyK7oyL7oyM7oyN7oyO7oyP7oyQ7oyR7oyS7oyT7oyU7oyV7oyW7oyX7oyY7oyZ7oya7oyb7oyc7oyd7oye7oyf7oyg7oyh7oyi7oyj7oyk7oyl7oym7oyn7oyo7oyp7oyq7oyr7oys7oyt7oyu7oyv7oyw7oyx7oyy7oyz7oy07oy17oy27oy37oy47oy57oy67oy77oy87oy97oy+7oy/CivujYDujYHujYLujYPujYTujYXujYbujYfujYjujYnujYrujYvujYzujY3ujY7ujY/ujZDujZHujZLujZPujZTujZXujZbujZfujZjujZnujZrujZvujZzujZ3ujZ7ujZ/ujaDujaHujaLujaPujaTujaXujabujafujajujanujarujavujazuja3uja7uja/ujbDujbHujbLujbPujbTujbXujbbujbfujbjujbnujbrujbvujbzujb3ujb7ujb8KK+6OgO6Oge6Ogu6Og+6OhO6Ohe6Ohu6Oh+6OiO6Oie6Oiu6Oi+6OjO6Oje6Oju6Oj+6OkO6Oke6Oku6Ok+6OlO6Ole6Olu6Ol+6OmO6Ome6Omu6Om+6OnO6One6Onu6On+6OoO6Ooe6Oou6Oo+6OpO6Ope6Opu6Op+6OqO6Oqe6Oqu6Oq+6OrO6Ore6Oru6Or+6OsO6Ose6Osu6Os+6OtO6Ote6Otu6Ot+6OuO6Oue6Ouu6Ou+6OvO6Ove6Ovu6Ovwor7o+A7o+B7o+C7o+D7o+E7o+F7o+G7o+H7o+I7o+J7o+K7o+L7o+M7o+N7o+O7o+P7o+Q7o+R7o+S7o+T7o+U7o+V7o+W7o+X7o+Y7o+Z7o+a7o+b7o+c7o+d7o+e7o+f7o+g7o+h7o+i7o+j7o+k7o+l7o+m7o+n7o+o7o+p7o+q7o+r7o+s7o+t7o+u7o+v7o+w7o+x7o+y7o+z7o+07o+17o+27o+37o+47o+57o+67o+77o+87o+97o++7o+/CivukIDukIHukILukIPukITukIXukIbukIfukIjukInukIrukIvukIzukI3ukI7ukI/ukJDukJHukJLukJPukJTukJXukJbukJfukJjukJnukJrukJvukJzukJ3ukJ7ukJ/ukKDukKHukKLukKPukKTukKXukKbukKfukKjukKnukKrukKvukKzukK3ukK7ukK/ukLDukLHukLLukLPukLTukLXukLbukLfukLjukLnukLrukLvukLzukL3ukL7ukL8KK+6RgO6Rge6Rgu6Rg+6RhO6Rhe6Rhu6Rh+6RiO6Rie6Riu6Ri+6RjO6Rje6Rju6Rj+6RkO6Rke6Rku6Rk+6RlO6Rle6Rlu6Rl+6RmO6Rme6Rmu6Rm+6RnO6Rne6Rnu6Rn+6RoO6Roe6Rou6Ro+6RpO6Rpe6Rpu6Rp+6RqO6Rqe6Rqu6Rq+6RrO6Rre6Rru6Rr+6RsO6Rse6Rsu6Rs+6RtO6Rte6Rtu6Rt+6RuO6Rue6Ruu6Ru+6RvO6Rve6Rvu6Rvwor7pKA7pKB7pKC7pKD7pKE7pKF7pKG7pKH7pKI7pKJ7pKK7pKL7pKM7pKN7pKO7pKP7pKQ7pKR7pKS7pKT7pKU7pKV7pKW7pKX7pKY7pKZ7pKa7pKb7pKc7pKd7pKe7pKf7pKg7pKh7pKi7pKj7pKk7pKl7pKm7pKn7pKo7pKp7pKq7pKr7pKs7pKt7pKu7pKv7pKw7pKx7pKy7pKz7pK07pK17pK27pK37pK47pK57pK67pK77pK87pK97pK+7pK/Civuk4Duk4Huk4Luk4Puk4Tuk4Xuk4buk4fuk4juk4nuk4ruk4vuk4zuk43uk47uk4/uk5Duk5Huk5Luk5Puk5Tuk5Xuk5buk5fuk5juk5nuk5ruk5vuk5zuk53uk57uk5/uk6Duk6Huk6Luk6Puk6Tuk6Xuk6buk6fuk6juk6nuk6ruk6vuk6zuk63uk67uk6/uk7Duk7Huk7Luk7Puk7Tuk7Xuk7buk7fuk7juk7nuk7ruk7vuk7zuk73uk77uk78KK+6UgO6Uge6Ugu6Ug+6UhO6Uhe6Uhu6Uh+6UiO6Uie6Uiu6Ui+6UjO6Uje6Uju6Uj+6UkO6Uke6Uku6Uk+6UlO6Ule6Ulu6Ul+6UmO6Ume6Umu6Um+6UnO6Une6Unu6Un+6UoO6Uoe6Uou6Uo+6UpO6Upe6Upu6Up+6UqO6Uqe6Uqu6Uq+6UrO6Ure6Uru6Ur+6UsO6Use6Usu6Us+6UtO6Ute6Utu6Ut+6UuO6Uue6Uuu6Uu+6UvO6Uve6Uvu6Uvwor7pWA7pWB7pWC7pWD7pWE7pWF7pWG7pWH7pWI7pWJ7pWK7pWL7pWM7pWN7pWO7pWP7pWQ7pWR7pWS7pWT7pWU7pWV7pWW7pWX7pWY7pWZ7pWa7pWb7pWc7pWd7pWe7pWf7pWg7pWh7pWi7pWj7pWk7pWl7pWm7pWn7pWo7pWp7pWq7pWr7pWs7pWt7pWu7pWv7pWw7pWx7pWy7pWz7pW07pW17pW27pW37pW47pW57pW67pW77pW87pW97pW+7pW/CivuloDuloHuloLuloPuloTuloXulobulofulojulonulorulovulozulo3ulo7ulo/ulpDulpHulpLulpPulpTulpXulpbulpfulpjulpnulprulpvulpzulp3ulp7ulp/ulqDulqHulqLulqPulqTulqXulqbulqfulqjulqnulqrulqvulqzulq3ulq7ulq/ulrDulrHulrLulrPulrTulrXulrbulrfulrjulrnulrrulrvulrzulr3ulr7ulr8KK+6XgO6Xge6Xgu6Xg+6XhO6Xhe6Xhu6Xh+6XiO6Xie6Xiu6Xi+6XjO6Xje6Xju6Xj+6XkO6Xke6Xku6Xk+6XlO6Xle6Xlu6Xl+6XmO6Xme6Xmu6Xm+6XnO6Xne6Xnu6Xn+6XoO6Xoe6Xou6Xo+6XpO6Xpe6Xpu6Xp+6XqO6Xqe6Xqu6Xq+6XrO6Xre6Xru6Xr+6XsO6Xse6Xsu6Xs+6XtO6Xte6Xtu6Xt+6XuO6Xue6Xuu6Xu+6XvO6Xve6Xvu6Xvwor7piA7piB7piC7piD7piE7piF7piG7piH7piI7piJ7piK7piL7piM7piN7piO7piP7piQ7piR7piS7piT7piU7piV7piW7piX7piY7piZ7pia7pib7pic7pid7pie7pif7pig7pih7pii7pij7pik7pil7pim7pin7pio7pip7piq7pir7pis7pit7piu7piv7piw7pix7piy7piz7pi07pi17pi27pi37pi47pi57pi67pi77pi87pi97pi+7pi/CivumYDumYHumYLumYPumYTumYXumYbumYfumYjumYnumYrumYvumYzumY3umY7umY/umZDumZHumZLumZPumZTumZXumZbumZfumZjumZnumZrumZvumZzumZ3umZ7umZ/umaDumaHumaLumaPumaTumaXumabumafumajumanumarumavumazuma3uma7uma/umbDumbHumbLumbPumbTumbXumbbumbfumbjumbnumbrumbvumbzumb3umb7umb8KK+6agO6age6agu6ag+6ahO6ahe6ahu6ah+6aiO6aie6aiu6ai+6ajO6aje6aju6aj+6akO6ake6aku6ak+6alO6ale6alu6al+6amO6ame6amu6am+6anO6ane6anu6an+6aoO6aoe6aou6ao+6apO6ape6apu6ap+6aqO6aqe6aqu6aq+6arO6are6aru6ar+6asO6ase6asu6as+6atO6ate6atu6at+6auO6aue6auu6au+6avO6ave6avu6avwor7puA7puB7puC7puD7puE7puF7puG7puH7puI7puJ7puK7puL7puM7puN7puO7puP7puQ7puR7puS7puT7puU7puV7puW7puX7puY7puZ7pua7pub7puc7pud7pue7puf7pug7puh7pui7puj7puk7pul7pum7pun7puo7pup7puq7pur7pus7put7puu7puv7puw7pux7puy7puz7pu07pu17pu27pu37pu47pu57pu67pu77pu87pu97pu+7pu/CivunIDunIHunILunIPunITunIXunIbunIfunIjunInunIrunIvunIzunI3unI7unI/unJDunJHunJLunJPunJTunJXunJbunJfunJjunJnunJrunJvunJzunJ3unJ7unJ/unKDunKHunKLunKPunKTunKXunKbunKfunKjunKnunKrunKvunKzunK3unK7unK/unLDunLHunLLunLPunLTunLXunLbunLfunLjunLnunLrunLvunLzunL3unL7unL8KK+6dgO6dge6dgu6dg+6dhO6dhe6dhu6dh+6diO6die6diu6di+6djO6dje6dju6dj+6dkO6dke6dku6dk+6dlO6dle6dlu6dl+6dmO6dme6dmu6dm+6dnO6dne6dnu6dn+6doO6doe6dou6do+6dpO6dpe6dpu6dp+6dqO6dqe6dqu6dq+6drO6dre6dru6dr+6dsO6dse6dsu6ds+6dtO6dte6dtu6dt+6duO6due6duu6du+6dvO6dve6dvu6dvwor7p6A7p6B7p6C7p6D7p6E7p6F7p6G7p6H7p6I7p6J7p6K7p6L7p6M7p6N7p6O7p6P7p6Q7p6R7p6S7p6T7p6U7p6V7p6W7p6X7p6Y7p6Z7p6a7p6b7p6c7p6d7p6e7p6f7p6g7p6h7p6i7p6j7p6k7p6l7p6m7p6n7p6o7p6p7p6q7p6r7p6s7p6t7p6u7p6v7p6w7p6x7p6y7p6z7p607p617p627p637p647p657p667p677p687p697p6+7p6/Civun4Dun4Hun4Lun4Pun4Tun4Xun4bun4fun4jun4nun4run4vun4zun43un47un4/un5Dun5Hun5Lun5Pun5Tun5Xun5bun5fun5jun5nun5run5vun5zun53un57un5/un6Dun6Hun6Lun6Pun6Tun6Xun6bun6fun6jun6nun6run6vun6zun63un67un6/un7Dun7Hun7Lun7Pun7Tun7Xun7bun7fun7jun7nun7run7vun7zun73un77un78KK+6ggO6gge6ggu6gg+6ghO6ghe6ghu6gh+6giO6gie6giu6gi+6gjO6gje6gju6gj+6gkO6gke6gku6gk+6glO6gle6glu6gl+6gmO6gme6gmu6gm+6gnO6gne6gnu6gn+6goO6goe6gou6go+6gpO6gpe6gpu6gp+6gqO6gqe6gqu6gq+6grO6gre6gru6gr+6gsO6gse6gsu6gs+6gtO6gte6gtu6gt+6guO6gue6guu6gu+6gvO6gve6gvu6gvwor7qGA7qGB7qGC7qGD7qGE7qGF7qGG7qGH7qGI7qGJ7qGK7qGL7qGM7qGN7qGO7qGP7qGQ7qGR7qGS7qGT7qGU7qGV7qGW7qGX7qGY7qGZ7qGa7qGb7qGc7qGd7qGe7qGf7qGg7qGh7qGi7qGj7qGk7qGl7qGm7qGn7qGo7qGp7qGq7qGr7qGs7qGt7qGu7qGv7qGw7qGx7qGy7qGz7qG07qG17qG27qG37qG47qG57qG67qG77qG87qG97qG+7qG/CivuooDuooHuooLuooPuooTuooXuoobuoofuoojuoonuooruoovuoozuoo3uoo7uoo/uopDuopHuopLuopPuopTuopXuopbuopfuopjuopnuopruopvuopzuop3uop7uop/uoqDuoqHuoqLuoqPuoqTuoqXuoqbuoqfuoqjuoqnuoqruoqvuoqzuoq3uoq7uoq/uorDuorHuorLuorPuorTuorXuorbuorfuorjuornuorruorvuorzuor3uor7uor8KK+6jgO6jge6jgu6jg+6jhO6jhe6jhu6jh+6jiO6jie6jiu6ji+6jjO6jje6jju6jj+6jkO6jke6jku6jk+6jlO6jle6jlu6jl+6jmO6jme6jmu6jm+6jnO6jne6jnu6jn+6joO6joe6jou6jo+6jpO6jpe6jpu6jp+6jqO6jqe6jqu6jq+6jrO6jre6jru6jr+6jsO6jse6jsu6js+6jtO6jte6jtu6jt+6juO6jue6juu6ju+6jvO6jve6jvu6jvwor7qSA7qSB7qSC7qSD7qSE7qSF7qSG7qSH7qSI7qSJ7qSK7qSL7qSM7qSN7qSO7qSP7qSQ7qSR7qSS7qST7qSU7qSV7qSW7qSX7qSY7qSZ7qSa7qSb7qSc7qSd7qSe7qSf7qSg7qSh7qSi7qSj7qSk7qSl7qSm7qSn7qSo7qSp7qSq7qSr7qSs7qSt7qSu7qSv7qSw7qSx7qSy7qSz7qS07qS17qS27qS37qS47qS57qS67qS77qS87qS97qS+7qS/CivupYDupYHupYLupYPupYTupYXupYbupYfupYjupYnupYrupYvupYzupY3upY7upY/upZDupZHupZLupZPupZTupZXupZbupZfupZjupZnupZrupZvupZzupZ3upZ7upZ/upaDupaHupaLupaPupaTupaXupabupafupajupanuparupavupazupa3upa7upa/upbDupbHupbLupbPupbTupbXupbbupbfupbjupbnupbrupbvupbzupb3upb7upb8KK+6mgO6mge6mgu6mg+6mhO6mhe6mhu6mh+6miO6mie6miu6mi+6mjO6mje6mju6mj+6mkO6mke6mku6mk+6mlO6mle6mlu6ml+6mmO6mme6mmu6mm+6mnO6mne6mnu6mn+6moO6moe6mou6mo+6mpO6mpe6mpu6mp+6mqO6mqe6mqu6mq+6mrO6mre6mru6mr+6msO6mse6msu6ms+6mtO6mte6mtu6mt+6muO6mue6muu6mu+6mvO6mve6mvu6mvwor7qeA7qeB7qeC7qeD7qeE7qeF7qeG7qeH7qeI7qeJ7qeK7qeL7qeM7qeN7qeO7qeP7qeQ7qeR7qeS7qeT7qeU7qeV7qeW7qeX7qeY7qeZ7qea7qeb7qec7qed7qee7qef7qeg7qeh7qei7qej7qek7qel7qem7qen7qeo7qep7qeq7qer7qes7qet7qeu7qev7qew7qex7qey7qez7qe07qe17qe27qe37qe47qe57qe67qe77qe87qe97qe+7qe/CivuqIDuqIHuqILuqIPuqITuqIXuqIbuqIfuqIjuqInuqIruqIvuqIzuqI3uqI7uqI/uqJDuqJHuqJLuqJPuqJTuqJXuqJbuqJfuqJjuqJnuqJruqJvuqJzuqJ3uqJ7uqJ/uqKDuqKHuqKLuqKPuqKTuqKXuqKbuqKfuqKjuqKnuqKruqKvuqKzuqK3uqK7uqK/uqLDuqLHuqLLuqLPuqLTuqLXuqLbuqLfuqLjuqLnuqLruqLvuqLzuqL3uqL7uqL8KK+6pgO6pge6pgu6pg+6phO6phe6phu6ph+6piO6pie6piu6pi+6pjO6pje6pju6pj+6pkO6pke6pku6pk+6plO6ple6plu6pl+6pmO6pme6pmu6pm+6pnO6pne6pnu6pn+6poO6poe6pou6po+6ppO6ppe6ppu6pp+6pqO6pqe6pqu6pq+6prO6pre6pru6pr+6psO6pse6psu6ps+6ptO6pte6ptu6pt+6puO6pue6puu6pu+6pvO6pve6pvu6pvwor7qqA7qqB7qqC7qqD7qqE7qqF7qqG7qqH7qqI7qqJ7qqK7qqL7qqM7qqN7qqO7qqP7qqQ7qqR7qqS7qqT7qqU7qqV7qqW7qqX7qqY7qqZ7qqa7qqb7qqc7qqd7qqe7qqf7qqg7qqh7qqi7qqj7qqk7qql7qqm7qqn7qqo7qqp7qqq7qqr7qqs7qqt7qqu7qqv7qqw7qqx7qqy7qqz7qq07qq17qq27qq37qq47qq57qq67qq77qq87qq97qq+7qq/Civuq4Duq4Huq4Luq4Puq4Tuq4Xuq4buq4fuq4juq4nuq4ruq4vuq4zuq43uq47uq4/uq5Duq5Huq5Luq5Puq5Tuq5Xuq5buq5fuq5juq5nuq5ruq5vuq5zuq53uq57uq5/uq6Duq6Huq6Luq6Puq6Tuq6Xuq6buq6fuq6juq6nuq6ruq6vuq6zuq63uq67uq6/uq7Duq7Huq7Luq7Puq7Tuq7Xuq7buq7fuq7juq7nuq7ruq7vuq7zuq73uq77uq78KK+6sgO6sge6sgu6sg+6shO6she6shu6sh+6siO6sie6siu6si+6sjO6sje6sju6sj+6skO6ske6sku6sk+6slO6sle6slu6sl+6smO6sme6smu6sm+6snO6sne6snu6sn+6soO6soe6sou6so+6spO6spe6spu6sp+6sqO6sqe6squ6sq+6srO6sre6sru6sr+6ssO6sse6ssu6ss+6stO6ste6stu6st+6suO6sue6suu6su+6svO6sve6svu6svwor7q2A7q2B7q2C7q2D7q2E7q2F7q2G7q2H7q2I7q2J7q2K7q2L7q2M7q2N7q2O7q2P7q2Q7q2R7q2S7q2T7q2U7q2V7q2W7q2X7q2Y7q2Z7q2a7q2b7q2c7q2d7q2e7q2f7q2g7q2h7q2i7q2j7q2k7q2l7q2m7q2n7q2o7q2p7q2q7q2r7q2s7q2t7q2u7q2v7q2w7q2x7q2y7q2z7q207q217q227q237q247q257q267q277q287q297q2+7q2/CivuroDuroHuroLuroPuroTuroXuroburofurojuronurorurovurozuro3uro7uro/urpDurpHurpLurpPurpTurpXurpburpfurpjurpnurprurpvurpzurp3urp7urp/urqDurqHurqLurqPurqTurqXurqburqfurqjurqnurqrurqvurqzurq3urq7urq/urrDurrHurrLurrPurrTurrXurrburrfurrjurrnurrrurrvurrzurr3urr7urr8KK+6vgO6vge6vgu6vg+6vhO6vhe6vhu6vh+6viO6vie6viu6vi+6vjO6vje6vju6vj+6vkO6vke6vku6vk+6vlO6vle6vlu6vl+6vmO6vme6vmu6vm+6vnO6vne6vnu6vn+6voO6voe6vou6vo+6vpO6vpe6vpu6vp+6vqO6vqe6vqu6vq+6vrO6vre6vru6vr+6vsO6vse6vsu6vs+6vtO6vte6vtu6vt+6vuO6vue6vuu6vu+6vvO6vve6vvu6vvwor7rCA7rCB7rCC7rCD7rCE7rCF7rCG7rCH7rCI7rCJ7rCK7rCL7rCM7rCN7rCO7rCP7rCQ7rCR7rCS7rCT7rCU7rCV7rCW7rCX7rCY7rCZ7rCa7rCb7rCc7rCd7rCe7rCf7rCg7rCh7rCi7rCj7rCk7rCl7rCm7rCn7rCo7rCp7rCq7rCr7rCs7rCt7rCu7rCv7rCw7rCx7rCy7rCz7rC07rC17rC27rC37rC47rC57rC67rC77rC87rC97rC+7rC/CivusYDusYHusYLusYPusYTusYXusYbusYfusYjusYnusYrusYvusYzusY3usY7usY/usZDusZHusZLusZPusZTusZXusZbusZfusZjusZnusZrusZvusZzusZ3usZ7usZ/usaDusaHusaLusaPusaTusaXusabusafusajusanusarusavusazusa3usa7usa/usbDusbHusbLusbPusbTusbXusbbusbfusbjusbnusbrusbvusbzusb3usb7usb8KK+6ygO6yge6ygu6yg+6yhO6yhe6yhu6yh+6yiO6yie6yiu6yi+6yjO6yje6yju6yj+6ykO6yke6yku6yk+6ylO6yle6ylu6yl+6ymO6yme6ymu6ym+6ynO6yne6ynu6yn+6yoO6yoe6you6yo+6ypO6ype6ypu6yp+6yqO6yqe6yqu6yq+6yrO6yre6yru6yr+6ysO6yse6ysu6ys+6ytO6yte6ytu6yt+6yuO6yue6yuu6yu+6yvO6yve6yvu6yvwor7rOA7rOB7rOC7rOD7rOE7rOF7rOG7rOH7rOI7rOJ7rOK7rOL7rOM7rON7rOO7rOP7rOQ7rOR7rOS7rOT7rOU7rOV7rOW7rOX7rOY7rOZ7rOa7rOb7rOc7rOd7rOe7rOf7rOg7rOh7rOi7rOj7rOk7rOl7rOm7rOn7rOo7rOp7rOq7rOr7rOs7rOt7rOu7rOv7rOw7rOx7rOy7rOz7rO07rO17rO27rO37rO47rO57rO67rO77rO87rO97rO+7rO/CivutIDutIHutILutIPutITutIXutIbutIfutIjutInutIrutIvutIzutI3utI7utI/utJDutJHutJLutJPutJTutJXutJbutJfutJjutJnutJrutJvutJzutJ3utJ7utJ/utKDutKHutKLutKPutKTutKXutKbutKfutKjutKnutKrutKvutKzutK3utK7utK/utLDutLHutLLutLPutLTutLXutLbutLfutLjutLnutLrutLvutLzutL3utL7utL8KK+61gO61ge61gu61g+61hO61he61hu61h+61iO61ie61iu61i+61jO61je61ju61j+61kO61ke61ku61k+61lO61le61lu61l+61mO61me61mu61m+61nO61ne61nu61n+61oO61oe61ou61o+61pO61pe61pu61p+61qO61qe61qu61q+61rO61re61ru61r+61sO61se61su61s+61tO61te61tu61t+61uO61ue61uu61u+61vO61ve61vu61vwor7raA7raB7raC7raD7raE7raF7raG7raH7raI7raJ7raK7raL7raM7raN7raO7raP7raQ7raR7raS7raT7raU7raV7raW7raX7raY7raZ7raa7rab7rac7rad7rae7raf7rag7rah7rai7raj7rak7ral7ram7ran7rao7rap7raq7rar7ras7rat7rau7rav7raw7rax7ray7raz7ra07ra17ra27ra37ra47ra57ra67ra77ra87ra97ra+7ra/Civut4Dut4Hut4Lut4Put4Tut4Xut4but4fut4jut4nut4rut4vut4zut43ut47ut4/ut5Dut5Hut5Lut5Put5Tut5Xut5but5fut5jut5nut5rut5vut5zut53ut57ut5/ut6Dut6Hut6Lut6Put6Tut6Xut6but6fut6jut6nut6rut6vut6zut63ut67ut6/ut7Dut7Hut7Lut7Put7Tut7Xut7but7fut7jut7nut7rut7vut7zut73ut77ut78KK+64gO64ge64gu64g+64hO64he64hu64h+64iO64ie64iu64i+64jO64je64ju64j+64kO64ke64ku64k+64lO64le64lu64l+64mO64me64mu64m+64nO64ne64nu64n+64oO64oe64ou64o+64pO64pe64pu64p+64qO64qe64qu64q+64rO64re64ru64r+64sO64se64su64s+64tO64te64tu64t+64uO64ue64uu64u+64vO64ve64vu64vwor7rmA7rmB7rmC7rmD7rmE7rmF7rmG7rmH7rmI7rmJ7rmK7rmL7rmM7rmN7rmO7rmP7rmQ7rmR7rmS7rmT7rmU7rmV7rmW7rmX7rmY7rmZ7rma7rmb7rmc7rmd7rme7rmf7rmg7rmh7rmi7rmj7rmk7rml7rmm7rmn7rmo7rmp7rmq7rmr7rms7rmt7rmu7rmv7rmw7rmx7rmy7rmz7rm07rm17rm27rm37rm47rm57rm67rm77rm87rm97rm+7rm/CivuuoDuuoHuuoLuuoPuuoTuuoXuuobuuofuuojuuonuuoruuovuuozuuo3uuo7uuo/uupDuupHuupLuupPuupTuupXuupbuupfuupjuupnuupruupvuupzuup3uup7uup/uuqDuuqHuuqLuuqPuuqTuuqXuuqbuuqfuuqjuuqnuuqruuqvuuqzuuq3uuq7uuq/uurDuurHuurLuurPuurTuurXuurbuurfuurjuurnuurruurvuurzuur3uur7uur8KK+67gO67ge67gu67g+67hO67he67hu67h+67iO67ie67iu67i+67jO67je67ju67j+67kO67ke67ku67k+67lO67le67lu67l+67mO67me67mu67m+67nO67ne67nu67n+67oO67oe67ou67o+67pO67pe67pu67p+67qO67qe67qu67q+67rO67re67ru67r+67sO67se67su67s+67tO67te67tu67t+67uO67ue67uu67u+67vO67ve67vu67vwor7ryA7ryB7ryC7ryD7ryE7ryF7ryG7ryH7ryI7ryJ7ryK7ryL7ryM7ryN7ryO7ryP7ryQ7ryR7ryS7ryT7ryU7ryV7ryW7ryX7ryY7ryZ7rya7ryb7ryc7ryd7rye7ryf7ryg7ryh7ryi7ryj7ryk7ryl7rym7ryn7ryo7ryp7ryq7ryr7rys7ryt7ryu7ryv7ryw7ryx7ryy7ryz7ry07ry17ry27ry37ry47ry57ry67ry77ry87ry97ry+7ry/CivuvYDuvYHuvYLuvYPuvYTuvYXuvYbuvYfuvYjuvYnuvYruvYvuvYzuvY3uvY7uvY/uvZDuvZHuvZLuvZPuvZTuvZXuvZbuvZfuvZjuvZnuvZruvZvuvZzuvZ3uvZ7uvZ/uvaDuvaHuvaLuvaPuvaTuvaXuvabuvafuvajuvanuvaruvavuvazuva3uva7uva/uvbDuvbHuvbLuvbPuvbTuvbXuvbbuvbfuvbjuvbnuvbruvbvuvbzuvb3uvb7uvb8KK+6+gO6+ge6+gu6+g+6+hO6+he6+hu6+h+6+iO6+ie6+iu6+i+6+jO6+je6+ju6+j+6+kO6+ke6+ku6+k+6+lO6+le6+lu6+l+6+mO6+me6+mu6+m+6+nO6+ne6+nu6+n+6+oO6+oe6+ou6+o+6+pO6+pe6+pu6+p+6+qO6+qe6+qu6+q+6+rO6+re6+ru6+r+6+sO6+se6+su6+s+6+tO6+te6+tu6+t+6+uO6+ue6+uu6+u+6+vO6+ve6+vu6+vwor7r+A7r+B7r+C7r+D7r+E7r+F7r+G7r+H7r+I7r+J7r+K7r+L7r+M7r+N7r+O7r+P7r+Q7r+R7r+S7r+T7r+U7r+V7r+W7r+X7r+Y7r+Z7r+a7r+b7r+c7r+d7r+e7r+f7r+g7r+h7r+i7r+j7r+k7r+l7r+m7r+n7r+o7r+p7r+q7r+r7r+s7r+t7r+u7r+v7r+w7r+x7r+y7r+z7r+07r+17r+27r+37r+47r+57r+67r+77r+87r+97r++7r+/CivvgIDvgIHvgILvgIPvgITvgIXvgIbvgIfvgIjvgInvgIrvgIvvgIzvgI3vgI7vgI/vgJDvgJHvgJLvgJPvgJTvgJXvgJbvgJfvgJjvgJnvgJrvgJvvgJzvgJ3vgJ7vgJ/vgKDvgKHvgKLvgKPvgKTvgKXvgKbvgKfvgKjvgKnvgKrvgKvvgKzvgK3vgK7vgK/vgLDvgLHvgLLvgLPvgLTvgLXvgLbvgLfvgLjvgLnvgLrvgLvvgLzvgL3vgL7vgL8KK++BgO+Bge+Bgu+Bg++BhO+Bhe+Bhu+Bh++BiO+Bie+Biu+Bi++BjO+Bje+Bju+Bj++BkO+Bke+Bku+Bk++BlO+Ble+Blu+Bl++BmO+Bme+Bmu+Bm++BnO+Bne+Bnu+Bn++BoO+Boe+Bou+Bo++BpO+Bpe+Bpu+Bp++BqO+Bqe+Bqu+Bq++BrO+Bre+Bru+Br++BsO+Bse+Bsu+Bs++BtO+Bte+Btu+Bt++BuO+Bue+Buu+Bu++BvO+Bve+Bvu+Bvwor74KA74KB74KC74KD74KE74KF74KG74KH74KI74KJ74KK74KL74KM74KN74KO74KP74KQ74KR74KS74KT74KU74KV74KW74KX74KY74KZ74Ka74Kb74Kc74Kd74Ke74Kf74Kg74Kh74Ki74Kj74Kk74Kl74Km74Kn74Ko74Kp74Kq74Kr74Ks74Kt74Ku74Kv74Kw74Kx74Ky74Kz74K074K174K274K374K474K574K674K774K874K974K+74K/Civvg4Dvg4Hvg4Lvg4Pvg4Tvg4Xvg4bvg4fvg4jvg4nvg4rvg4vvg4zvg43vg47vg4/vg5Dvg5Hvg5Lvg5Pvg5Tvg5Xvg5bvg5fvg5jvg5nvg5rvg5vvg5zvg53vg57vg5/vg6Dvg6Hvg6Lvg6Pvg6Tvg6Xvg6bvg6fvg6jvg6nvg6rvg6vvg6zvg63vg67vg6/vg7Dvg7Hvg7Lvg7Pvg7Tvg7Xvg7bvg7fvg7jvg7nvg7rvg7vvg7zvg73vg77vg78KK++EgO+Ege+Egu+Eg++EhO+Ehe+Ehu+Eh++EiO+Eie+Eiu+Ei++EjO+Eje+Eju+Ej++EkO+Eke+Eku+Ek++ElO+Ele+Elu+El++EmO+Eme+Emu+Em++EnO+Ene+Enu+En++EoO+Eoe+Eou+Eo++EpO+Epe+Epu+Ep++EqO+Eqe+Equ+Eq++ErO+Ere+Eru+Er++EsO+Ese+Esu+Es++EtO+Ete+Etu+Et++EuO+Eue+Euu+Eu++EvO+Eve+Evu+Evwor74WA74WB74WC74WD74WE74WF74WG74WH74WI74WJ74WK74WL74WM74WN74WO74WP74WQ74WR74WS74WT74WU74WV74WW74WX74WY74WZ74Wa74Wb74Wc74Wd74We74Wf74Wg74Wh74Wi74Wj74Wk74Wl74Wm74Wn74Wo74Wp74Wq74Wr74Ws74Wt74Wu74Wv74Ww74Wx74Wy74Wz74W074W174W274W374W474W574W674W774W874W974W+74W/CivvhoDvhoHvhoLvhoPvhoTvhoXvhobvhofvhojvhonvhorvhovvhozvho3vho7vho/vhpDvhpHvhpLvhpPvhpTvhpXvhpbvhpfvhpjvhpnvhprvhpvvhpzvhp3vhp7vhp/vhqDvhqHvhqLvhqPvhqTvhqXvhqbvhqfvhqjvhqnvhqrvhqvvhqzvhq3vhq7vhq/vhrDvhrHvhrLvhrPvhrTvhrXvhrbvhrfvhrjvhrnvhrrvhrvvhrzvhr3vhr7vhr8KK++HgO+Hge+Hgu+Hg++HhO+Hhe+Hhu+Hh++HiO+Hie+Hiu+Hi++HjO+Hje+Hju+Hj++HkO+Hke+Hku+Hk++HlO+Hle+Hlu+Hl++HmO+Hme+Hmu+Hm++HnO+Hne+Hnu+Hn++HoO+Hoe+Hou+Ho++HpO+Hpe+Hpu+Hp++HqO+Hqe+Hqu+Hq++HrO+Hre+Hru+Hr++HsO+Hse+Hsu+Hs++HtO+Hte+Htu+Ht++HuO+Hue+Huu+Hu++HvO+Hve+Hvu+Hvwor74iA74iB74iC74iD74iE74iF74iG74iH74iI74iJ74iK74iL74iM74iN74iO74iP74iQ74iR74iS74iT74iU74iV74iW74iX74iY74iZ74ia74ib74ic74id74ie74if74ig74ih74ii74ij74ik74il74im74in74io74ip74iq74ir74is74it74iu74iv74iw74ix74iy74iz74i074i174i274i374i474i574i674i774i874i974i+74i/CivviYDviYHviYLviYPviYTviYXviYbviYfviYjviYnviYrviYvviYzviY3viY7viY/viZDviZHviZLviZPviZTviZXviZbviZfviZjviZnviZrviZvviZzviZ3viZ7viZ/viaDviaHviaLviaPviaTviaXviabviafviajvianviarviavviazvia3via7via/vibDvibHvibLvibPvibTvibXvibbvibfvibjvibnvibrvibvvibzvib3vib7vib8KK++KgO+Kge+Kgu+Kg++KhO+Khe+Khu+Kh++KiO+Kie+Kiu+Ki++KjO+Kje+Kju+Kj++KkO+Kke+Kku+Kk++KlO+Kle+Klu+Kl++KmO+Kme+Kmu+Km++KnO+Kne+Knu+Kn++KoO+Koe+Kou+Ko++KpO+Kpe+Kpu+Kp++KqO+Kqe+Kqu+Kq++KrO+Kre+Kru+Kr++KsO+Kse+Ksu+Ks++KtO+Kte+Ktu+Kt++KuO+Kue+Kuu+Ku++KvO+Kve+Kvu+Kvwor74uA74uB74uC74uD74uE74uF74uG74uH74uI74uJ74uK74uL74uM74uN74uO74uP74uQ74uR74uS74uT74uU74uV74uW74uX74uY74uZ74ua74ub74uc74ud74ue74uf74ug74uh74ui74uj74uk74ul74um74un74uo74up74uq74ur74us74ut74uu74uv74uw74ux74uy74uz74u074u174u274u374u474u574u674u774u874u974u+74u/CivvjIDvjIHvjILvjIPvjITvjIXvjIbvjIfvjIjvjInvjIrvjIvvjIzvjI3vjI7vjI/vjJDvjJHvjJLvjJPvjJTvjJXvjJbvjJfvjJjvjJnvjJrvjJvvjJzvjJ3vjJ7vjJ/vjKDvjKHvjKLvjKPvjKTvjKXvjKbvjKfvjKjvjKnvjKrvjKvvjKzvjK3vjK7vjK/vjLDvjLHvjLLvjLPvjLTvjLXvjLbvjLfvjLjvjLnvjLrvjLvvjLzvjL3vjL7vjL8KK++NgO+Nge+Ngu+Ng++NhO+Nhe+Nhu+Nh++NiO+Nie+Niu+Ni++NjO+Nje+Nju+Nj++NkO+Nke+Nku+Nk++NlO+Nle+Nlu+Nl++NmO+Nme+Nmu+Nm++NnO+Nne+Nnu+Nn++NoO+Noe+Nou+No++NpO+Npe+Npu+Np++NqO+Nqe+Nqu+Nq++NrO+Nre+Nru+Nr++NsO+Nse+Nsu+Ns++NtO+Nte+Ntu+Nt++NuO+Nue+Nuu+Nu++NvO+Nve+Nvu+Nvwor746A746B746C746D746E746F746G746H746I746J746K746L746M746N746O746P746Q746R746S746T746U746V746W746X746Y746Z746a746b746c746d746e746f746g746h746i746j746k746l746m746n746o746p746q746r746s746t746u746v746w746x746y746z7460746174627463746474657466746774687469746+746/Civvj4Dvj4Hvj4Lvj4Pvj4Tvj4Xvj4bvj4fvj4jvj4nvj4rvj4vvj4zvj43vj47vj4/vj5Dvj5Hvj5Lvj5Pvj5Tvj5Xvj5bvj5fvj5jvj5nvj5rvj5vvj5zvj53vj57vj5/vj6Dvj6Hvj6Lvj6Pvj6Tvj6Xvj6bvj6fvj6jvj6nvj6rvj6vvj6zvj63vj67vj6/vj7Dvj7Hvj7Lvj7Pvj7Tvj7Xvj7bvj7fvj7jvj7nvj7rvj7vvj7zvj73vj77vj78KK++QgO+Qge+Qgu+Qg++QhO+Qhe+Qhu+Qh++QiO+Qie+Qiu+Qi++QjO+Qje+Qju+Qj++QkO+Qke+Qku+Qk++QlO+Qle+Qlu+Ql++QmO+Qme+Qmu+Qm++QnO+Qne+Qnu+Qn++QoO+Qoe+Qou+Qo++QpO+Qpe+Qpu+Qp++QqO+Qqe+Qqu+Qq++QrO+Qre+Qru+Qr++QsO+Qse+Qsu+Qs++QtO+Qte+Qtu+Qt++QuO+Que+Quu+Qu++QvO+Qve+Qvu+Qvwor75GA75GB75GC75GD75GE75GF75GG75GH75GI75GJ75GK75GL75GM75GN75GO75GP75GQ75GR75GS75GT75GU75GV75GW75GX75GY75GZ75Ga75Gb75Gc75Gd75Ge75Gf75Gg75Gh75Gi75Gj75Gk75Gl75Gm75Gn75Go75Gp75Gq75Gr75Gs75Gt75Gu75Gv75Gw75Gx75Gy75Gz75G075G175G275G375G475G575G675G775G875G975G+75G/CivvkoDvkoHvkoLvkoPvkoTvkoXvkobvkofvkojvkonvkorvkovvkozvko3vko7vko/vkpDvkpHvkpLvkpPvkpTvkpXvkpbvkpfvkpjvkpnvkprvkpvvkpzvkp3vkp7vkp/vkqDvkqHvkqLvkqPvkqTvkqXvkqbvkqfvkqjvkqnvkqrvkqvvkqzvkq3vkq7vkq/vkrDvkrHvkrLvkrPvkrTvkrXvkrbvkrfvkrjvkrnvkrrvkrvvkrzvkr3vkr7vkr8KK++TgO+Tge+Tgu+Tg++ThO+The+Thu+Th++TiO+Tie+Tiu+Ti++TjO+Tje+Tju+Tj++TkO+Tke+Tku+Tk++TlO+Tle+Tlu+Tl++TmO+Tme+Tmu+Tm++TnO+Tne+Tnu+Tn++ToO+Toe+Tou+To++TpO+Tpe+Tpu+Tp++TqO+Tqe+Tqu+Tq++TrO+Tre+Tru+Tr++TsO+Tse+Tsu+Ts++TtO+Tte+Ttu+Tt++TuO+Tue+Tuu+Tu++TvO+Tve+Tvu+Tvwor75SA75SB75SC75SD75SE75SF75SG75SH75SI75SJ75SK75SL75SM75SN75SO75SP75SQ75SR75SS75ST75SU75SV75SW75SX75SY75SZ75Sa75Sb75Sc75Sd75Se75Sf75Sg75Sh75Si75Sj75Sk75Sl75Sm75Sn75So75Sp75Sq75Sr75Ss75St75Su75Sv75Sw75Sx75Sy75Sz75S075S175S275S375S475S575S675S775S875S975S+75S/CivvlYDvlYHvlYLvlYPvlYTvlYXvlYbvlYfvlYjvlYnvlYrvlYvvlYzvlY3vlY7vlY/vlZDvlZHvlZLvlZPvlZTvlZXvlZbvlZfvlZjvlZnvlZrvlZvvlZzvlZ3vlZ7vlZ/vlaDvlaHvlaLvlaPvlaTvlaXvlabvlafvlajvlanvlarvlavvlazvla3vla7vla/vlbDvlbHvlbLvlbPvlbTvlbXvlbbvlbfvlbjvlbnvlbrvlbvvlbzvlb3vlb7vlb8KK++WgO+Wge+Wgu+Wg++WhO+Whe+Whu+Wh++WiO+Wie+Wiu+Wi++WjO+Wje+Wju+Wj++WkO+Wke+Wku+Wk++WlO+Wle+Wlu+Wl++WmO+Wme+Wmu+Wm++WnO+Wne+Wnu+Wn++WoO+Woe+Wou+Wo++WpO+Wpe+Wpu+Wp++WqO+Wqe+Wqu+Wq++WrO+Wre+Wru+Wr++WsO+Wse+Wsu+Ws++WtO+Wte+Wtu+Wt++WuO+Wue+Wuu+Wu++WvO+Wve+Wvu+Wvwor75eA75eB75eC75eD75eE75eF75eG75eH75eI75eJ75eK75eL75eM75eN75eO75eP75eQ75eR75eS75eT75eU75eV75eW75eX75eY75eZ75ea75eb75ec75ed75ee75ef75eg75eh75ei75ej75ek75el75em75en75eo75ep75eq75er75es75et75eu75ev75ew75ex75ey75ez75e075e175e275e375e475e575e675e775e875e975e+75e/CivvmIDvmIHvmILvmIPvmITvmIXvmIbvmIfvmIjvmInvmIrvmIvvmIzvmI3vmI7vmI/vmJDvmJHvmJLvmJPvmJTvmJXvmJbvmJfvmJjvmJnvmJrvmJvvmJzvmJ3vmJ7vmJ/vmKDvmKHvmKLvmKPvmKTvmKXvmKbvmKfvmKjvmKnvmKrvmKvvmKzvmK3vmK7vmK/vmLDvmLHvmLLvmLPvmLTvmLXvmLbvmLfvmLjvmLnvmLrvmLvvmLzvmL3vmL7vmL8KK++ZgO+Zge+Zgu+Zg++ZhO+Zhe+Zhu+Zh++ZiO+Zie+Ziu+Zi++ZjO+Zje+Zju+Zj++ZkO+Zke+Zku+Zk++ZlO+Zle+Zlu+Zl++ZmO+Zme+Zmu+Zm++ZnO+Zne+Znu+Zn++ZoO+Zoe+Zou+Zo++ZpO+Zpe+Zpu+Zp++ZqO+Zqe+Zqu+Zq++ZrO+Zre+Zru+Zr++ZsO+Zse+Zsu+Zs++ZtO+Zte+Ztu+Zt++ZuO+Zue+Zuu+Zu++ZvO+Zve+Zvu+Zvwor75qA75qB75qC75qD75qE75qF75qG75qH75qI75qJ75qK75qL75qM75qN75qO75qP75qQ75qR75qS75qT75qU75qV75qW75qX75qY75qZ75qa75qb75qc75qd75qe75qf75qg75qh75qi75qj75qk75ql75qm75qn75qo75qp75qq75qr75qs75qt75qu75qv75qw75qx75qy75qz75q075q175q275q375q475q575q675q775q875q975q+75q/Civvm4Dvm4Hvm4Lvm4Pvm4Tvm4Xvm4bvm4fvm4jvm4nvm4rvm4vvm4zvm43vm47vm4/vm5Dvm5Hvm5Lvm5Pvm5Tvm5Xvm5bvm5fvm5jvm5nvm5rvm5vvm5zvm53vm57vm5/vm6Dvm6Hvm6Lvm6Pvm6Tvm6Xvm6bvm6fvm6jvm6nvm6rvm6vvm6zvm63vm67vm6/vm7Dvm7Hvm7Lvm7Pvm7Tvm7Xvm7bvm7fvm7jvm7nvm7rvm7vvm7zvm73vm77vm78KK++cgO+cge+cgu+cg++chO+che+chu+ch++ciO+cie+ciu+ci++cjO+cje+cju+cj++ckO+cke+cku+ck++clO+cle+clu+cl++cmO+cme+cmu+cm++cnO+cne+cnu+cn++coO+coe+cou+co++cpO+cpe+cpu+cp++cqO+cqe+cqu+cq++crO+cre+cru+cr++csO+cse+csu+cs++ctO+cte+ctu+ct++cuO+cue+cuu+cu++cvO+cve+cvu+cvwor752A752B752C752D752E752F752G752H752I752J752K752L752M752N752O752P752Q752R752S752T752U752V752W752X752Y752Z752a752b752c752d752e752f752g752h752i752j752k752l752m752n752o752p752q752r752s752t752u752v752w752x752y752z7520752175227523752475257526752775287529752+752/CivvnoDvnoHvnoLvnoPvnoTvnoXvnobvnofvnojvnonvnorvnovvnozvno3vno7vno/vnpDvnpHvnpLvnpPvnpTvnpXvnpbvnpfvnpjvnpnvnprvnpvvnpzvnp3vnp7vnp/vnqDvnqHvnqLvnqPvnqTvnqXvnqbvnqfvnqjvnqnvnqrvnqvvnqzvnq3vnq7vnq/vnrDvnrHvnrLvnrPvnrTvnrXvnrbvnrfvnrjvnrnvnrrvnrvvnrzvnr3vnr7vnr8KK++fgO+fge+fgu+fg++fhO+fhe+fhu+fh++fiO+fie+fiu+fi++fjO+fje+fju+fj++fkO+fke+fku+fk++flO+fle+flu+fl++fmO+fme+fmu+fm++fnO+fne+fnu+fn++foO+foe+fou+fo++fpO+fpe+fpu+fp++fqO+fqe+fqu+fq++frO+fre+fru+fr++fsO+fse+fsu+fs++ftO+fte+ftu+ft++fuO+fue+fuu+fu++fvO+fve+fvu+fvwor76CA76CB76CC76CD76CE76CF76CG76CH76CI76CJ76CK76CL76CM76CN76CO76CP76CQ76CR76CS76CT76CU76CV76CW76CX76CY76CZ76Ca76Cb76Cc76Cd76Ce76Cf76Cg76Ch76Ci76Cj76Ck76Cl76Cm76Cn76Co76Cp76Cq76Cr76Cs76Ct76Cu76Cv76Cw76Cx76Cy76Cz76C076C176C276C376C476C576C676C776C876C976C+76C/CivvoYDvoYHvoYLvoYPvoYTvoYXvoYbvoYfvoYjvoYnvoYrvoYvvoYzvoY3voY7voY/voZDvoZHvoZLvoZPvoZTvoZXvoZbvoZfvoZjvoZnvoZrvoZvvoZzvoZ3voZ7voZ/voaDvoaHvoaLvoaPvoaTvoaXvoabvoafvoajvoanvoarvoavvoazvoa3voa7voa/vobDvobHvobLvobPvobTvobXvobbvobfvobjvobnvobrvobvvobzvob3vob7vob8KK++igO+ige+igu+ig++ihO+ihe+ihu+ih++iiO+iie+iiu+ii++ijO+ije+iju+ij++ikO+ike+iku+ik++ilO+ile+ilu+il++imO+ime+imu+im++inO+ine+inu+in++ioO+ioe+iou+io++ipO+ipe+ipu+ip++iqO+iqe+iqu+iq++irO+ire+iru+ir++isO+ise+isu+is++itO+ite+itu+it++iuO+iue+iuu+iu++ivO+ive+ivu+ivwor76OA76OB76OC76OD76OE76OF76OG76OH76OI76OJ76OK76OL76OM76ON76OO76OP76OQ76OR76OS76OT76OU76OV76OW76OX76OY76OZ76Oa76Ob76Oc76Od76Oe76Of76Og76Oh76Oi76Oj76Ok76Ol76Om76On76Oo76Op76Oq76Or76Os76Ot76Ou76Ov76Ow76Ox76Oy76Oz76O076O176O276O376O476O576O676O776O876O976O+76O/CisKK0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKFUrRjkwMC1VK0ZBRkYpOgorCivvpIDvpIHvpILvpIPvpITvpIXvpIbvpIfvpIjvpInvpIrvpIvvpIzvpI3vpI7vpI/vpJDvpJHvpJLvpJPvpJTvpJXvpJbvpJfvpJjvpJnvpJrvpJvvpJzvpJ3vpJ7vpJ8KK++koO+koe+kou+ko++kpO+kpe+kpu+kp++kqO+kqe+kqu+kq++krO+kre+kru+kr++ksO+kse+ksu+ks++ktO+kte+ktu+kt++kuO+kue+kuu+ku++kvO+kve+kvu+kvwor76WA76WB76WC76WD76WE76WF76WG76WH76WI76WJ76WK76WL76WM76WN76WO76WP76WQ76WR76WS76WT76WU76WV76WW76WX76WY76WZ76Wa76Wb76Wc76Wd76We76WfCivvpaDvpaHvpaLvpaPvpaTvpaXvpabvpafvpajvpanvparvpavvpazvpa3vpa7vpa/vpbDvpbHvpbLvpbPvpbTvpbXvpbbvpbfvpbjvpbnvpbrvpbvvpbzvpb3vpb7vpb8KK++mgO+mge+mgu+mg++mhO+mhe+mhu+mh++miO+mie+miu+mi++mjO+mje+mju+mj++mkO+mke+mku+mk++mlO+mle+mlu+ml++mmO+mme+mmu+mm++mnO+mne+mnu+mnwor76ag76ah76ai76aj76ak76al76am76an76ao76ap76aq76ar76as76at76au76av76aw76ax76ay76az76a076a176a276a376a476a576a676a776a876a976a+76a/Civvp4Dvp4Hvp4Lvp4Pvp4Tvp4Xvp4bvp4fvp4jvp4nvp4rvp4vvp4zvp43vp47vp4/vp5Dvp5Hvp5Lvp5Pvp5Tvp5Xvp5bvp5fvp5jvp5nvp5rvp5vvp5zvp53vp57vp58KK++noO+noe+nou+no++npO+npe+npu+np++nqO+nqe+nqu+nq++nrO+nre+nru+nr++nsO+nse+nsu+ns++ntO+nte+ntu+nt++nuO+nue+nuu+nu++nvO+nve+nvu+nvwor76iA76iB76iC76iD76iE76iF76iG76iH76iI76iJ76iK76iL76iM76iN76iO76iP76iQ76iR76iS76iT76iU76iV76iW76iX76iY76iZ76ia76ib76ic76id76ie76ifCivvqKDvqKHvqKLvqKPvqKTvqKXvqKbvqKfvqKjvqKnvqKrvqKvvqKzvqK3vqK7vqK/vqLDvqLHvqLLvqLPvqLTvqLXvqLbvqLfvqLjvqLnvqLrvqLvvqLzvqL3vqL7vqL8KK++pgO+pge+pgu+pg++phO+phe+phu+ph++piO+pie+piu+pi++pjO+pje+pju+pj++pkO+pke+pku+pk++plO+ple+plu+pl++pmO+pme+pmu+pm++pnO+pne+pnu+pnwor76mg76mh76mi76mj76mk76ml76mm76mn76mo76mp76mq76mr76ms76mt76mu76mv76mw76mx76my76mz76m076m176m276m376m476m576m676m776m876m976m+76m/CivvqoDvqoHvqoLvqoPvqoTvqoXvqobvqofvqojvqonvqorvqovvqozvqo3vqo7vqo/vqpDvqpHvqpLvqpPvqpTvqpXvqpbvqpfvqpjvqpnvqprvqpvvqpzvqp3vqp7vqp8KK++qoO+qoe+qou+qo++qpO+qpe+qpu+qp++qqO+qqe+qqu+qq++qrO+qre+qru+qr++qsO+qse+qsu+qs++qtO+qte+qtu+qt++quO+que+quu+qu++qvO+qve+qvu+qvwor76uA76uB76uC76uD76uE76uF76uG76uH76uI76uJ76uK76uL76uM76uN76uO76uP76uQ76uR76uS76uT76uU76uV76uW76uX76uY76uZ76ua76ub76uc76ud76ue76ufCivvq6Dvq6Hvq6Lvq6Pvq6Tvq6Xvq6bvq6fvq6jvq6nvq6rvq6vvq6zvq63vq67vq6/vq7Dvq7Hvq7Lvq7Pvq7Tvq7Xvq7bvq7fvq7jvq7nvq7rvq7vvq7zvq73vq77vq78KKworQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKFUrRkIwMC1VK0ZCNEYpOgorCivvrIDvrIHvrILvrIPvrITvrIXvrIbvrIfvrIjvrInvrIrvrIvvrIzvrI3vrI7vrI/vrJDvrJHvrJLvrJPvrJTvrJXvrJbvrJfvrJjvrJnvrJrvrJvvrJzvrJ3il4zvrJ7vrJ/vrKDvrKHvrKLvrKPvrKTvrKXvrKbvrKfvrKjvrKnvrKrvrKvvrKzvrK3vrK7vrK/vrLDvrLHvrLLvrLPvrLTvrLXvrLbvrLfvrLjvrLnvrLrvrLvvrLzvrL3vrL7vrL8KK++tgO+tge+tgu+tg++thO+the+thu+th++tiO+tie+tiu+ti++tjO+tje+tju+tjworCitBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEgKFUrRkI1MC1VK0ZERkYpOgorCivvrZDvrZHvrZLvrZPvrZTvrZXvrZbvrZfvrZjvrZnvrZrvrZvvrZzvrZ3vrZ7vrZ/vraDvraHvraLvraPvraTvraXvrabvrafvrajvranvrarvravvrazvra3vra7vra/vrbDvrbHvrbLvrbPvrbTvrbXvrbbvrbfvrbjvrbnvrbrvrbvvrbzvrb3vrb7vrb/vroDvroHvroLvroPvroTvroXvrobvrofvrojvronvrorvrovvrozvro3vro7vro8KK++ukO+uke+uku+uk++ulO+ule+ulu+ul++umO+ume+umu+um++unO+une+unu+un++uoO+uoe+uou+uo++upO+upe+upu+up++uqO+uqe+uqu+uq++urO+ure+uru+ur++usO+use+usu+us++utO+ute+utu+ut++uuO+uue+uuu+uu++uvO+uve+uvu+uv++vgO+vge+vgu+vg++vhO+vhe+vhu+vh++viO+vie+viu+vi++vjO+vje+vju+vjwor76+Q76+R76+S76+T76+U76+V76+W76+X76+Y76+Z76+a76+b76+c76+d76+e76+f76+g76+h76+i76+j76+k76+l76+m76+n76+o76+p76+q76+r76+s76+t76+u76+v76+w76+x76+y76+z76+076+176+276+376+476+576+676+776+876+976++76+/77CA77CB77CC77CD77CE77CF77CG77CH77CI77CJ77CK77CL77CM77CN77CO77CPCivvsJDvsJHvsJLvsJPvsJTvsJXvsJbvsJfvsJjvsJnvsJrvsJvvsJzvsJ3vsJ7vsJ/vsKDvsKHvsKLvsKPvsKTvsKXvsKbvsKfvsKjvsKnvsKrvsKvvsKzvsK3vsK7vsK/vsLDvsLHvsLLvsLPvsLTvsLXvsLbvsLfvsLjvsLnvsLrvsLvvsLzvsL3vsL7vsL/vsYDvsYHvsYLvsYPvsYTvsYXvsYbvsYfvsYjvsYnvsYrvsYvvsYzvsY3vsY7vsY8KK++xkO+xke+xku+xk++xlO+xle+xlu+xl++xmO+xme+xmu+xm++xnO+xne+xnu+xn++xoO+xoe+xou+xo++xpO+xpe+xpu+xp++xqO+xqe+xqu+xq++xrO+xre+xru+xr++xsO+xse+xsu+xs++xtO+xte+xtu+xt++xuO+xue+xuu+xu++xvO+xve+xvu+xv++ygO+yge+ygu+yg++yhO+yhe+yhu+yh++yiO+yie+yiu+yi++yjO+yje+yju+yjwor77KQ77KR77KS77KT77KU77KV77KW77KX77KY77KZ77Ka77Kb77Kc77Kd77Ke77Kf77Kg77Kh77Ki77Kj77Kk77Kl77Km77Kn77Ko77Kp77Kq77Kr77Ks77Kt77Ku77Kv77Kw77Kx77Ky77Kz77K077K177K277K377K477K577K677K777K877K977K+77K/77OA77OB77OC77OD77OE77OF77OG77OH77OI77OJ77OK77OL77OM77ON77OO77OPCivvs5Dvs5Hvs5Lvs5Pvs5Tvs5Xvs5bvs5fvs5jvs5nvs5rvs5vvs5zvs53vs57vs5/vs6Dvs6Hvs6Lvs6Pvs6Tvs6Xvs6bvs6fvs6jvs6nvs6rvs6vvs6zvs63vs67vs6/vs7Dvs7Hvs7Lvs7Pvs7Tvs7Xvs7bvs7fvs7jvs7nvs7rvs7vvs7zvs73vs77vs7/vtIDvtIHvtILvtIPvtITvtIXvtIbvtIfvtIjvtInvtIrvtIvvtIzvtI3vtI7vtI8KK++0kO+0ke+0ku+0k++0lO+0le+0lu+0l++0mO+0me+0mu+0m++0nO+0ne+0nu+0n++0oO+0oe+0ou+0o++0pO+0pe+0pu+0p++0qO+0qe+0qu+0q++0rO+0re+0ru+0r++0sO+0se+0su+0s++0tO+0te+0tu+0t++0uO+0ue+0uu+0u++0vO+0ve+0vu+0v++1gO+1ge+1gu+1g++1hO+1he+1hu+1h++1iO+1ie+1iu+1i++1jO+1je+1ju+1jwor77WQ77WR77WS77WT77WU77WV77WW77WX77WY77WZ77Wa77Wb77Wc77Wd77We77Wf77Wg77Wh77Wi77Wj77Wk77Wl77Wm77Wn77Wo77Wp77Wq77Wr77Ws77Wt77Wu77Wv77Ww77Wx77Wy77Wz77W077W177W277W377W477W577W677W777W877W977W+77W/77aA77aB77aC77aD77aE77aF77aG77aH77aI77aJ77aK77aL77aM77aN77aO77aPCivvtpDvtpHvtpLvtpPvtpTvtpXvtpbvtpfvtpjvtpnvtprvtpvvtpzvtp3vtp7vtp/vtqDvtqHvtqLvtqPvtqTvtqXvtqbvtqfvtqjvtqnvtqrvtqvvtqzvtq3vtq7vtq/vtrDvtrHvtrLvtrPvtrTvtrXvtrbvtrfvtrjvtrnvtrrvtrvvtrzvtr3vtr7vtr/vt4Dvt4Hvt4Lvt4Pvt4Tvt4Xvt4bvt4fvt4jvt4nvt4rvt4vvt4zvt43vt47vt48KK++3kO+3ke+3ku+3k++3lO+3le+3lu+3l++3mO+3me+3mu+3m++3nO+3ne+3nu+3n++3oO+3oe+3ou+3o++3pO+3pe+3pu+3p++3qO+3qe+3qu+3q++3rO+3re+3ru+3r++3sO+3se+3su+3s++3tO+3te+3tu+3t++3uO+3ue+3uu+3u++3vO+3ve+3vu+3vworCitWYXJpYXRpb24gU2VsZWN0b3JzIChVK0ZFMDAtVStGRTBGKToKKwor4peM77iA4peM77iB4peM77iC4peM77iD4peM77iE4peM77iF4peM77iG4peM77iH4peM77iI4peM77iJ4peM77iK4peM77iL4peM77iM4peM77iN4peM77iO4peM77iPCisKK0ZyZWUgYmxvY2sgKFUrRkUxMC1VK0ZFMUYpOgorCivvuJDvuJHvuJLvuJPvuJTvuJXvuJbvuJfvuJjvuJnvuJrvuJvvuJzvuJ3vuJ7vuJ8KKworQ29tYmluaW5nIEhhbGYgTWFya3MgKFUrRkUyMC1VK0ZFMkYpOgorCivil4zvuKDil4zvuKHil4zvuKLil4zvuKPvuKTvuKXvuKbvuKfvuKjvuKnvuKrvuKvvuKzvuK3vuK7vuK8KKworQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKFUrRkUzMC1VK0ZFNEYpOgorCivvuLDvuLHvuLLvuLPvuLTvuLXvuLbvuLfvuLjvuLnvuLrvuLvvuLzvuL3vuL7vuL/vuYDvuYHvuYLvuYPvuYTvuYXvuYbvuYfvuYjvuYnvuYrvuYvvuYzvuY3vuY7vuY8KKworU21hbGwgRm9ybSBWYXJpYW50cyAoVStGRTUwLVUrRkU2Rik6CisKK++5kO+5ke+5ku+5k++5lO+5le+5lu+5l++5mO+5me+5mu+5m++5nO+5ne+5nu+5n++5oO+5oe+5ou+5o++5pO+5pe+5pu+5p++5qO+5qe+5qu+5q++5rO+5re+5ru+5rworCitBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIgKFUrRkU3MC1VK0ZFRkYpOgorCivvubDvubHvubLvubPvubTvubXvubbvubfvubjvubnvubrvubvvubzvub3vub7vub/vuoDvuoHvuoLvuoPvuoTvuoXvuobvuofvuojvuonvuorvuovvuozvuo3vuo7vuo/vupDvupHvupLvupPvupTvupXvupbvupfvupjvupnvuprvupvvupzvup3vup7vup/vuqDvuqHvuqLvuqPvuqTvuqXvuqbvuqfvuqjvuqnvuqrvuqvvuqzvuq3vuq7vuq8KK++6sO+6se+6su+6s++6tO+6te+6tu+6t++6uO+6ue+6uu+6u++6vO+6ve+6vu+6v++7gO+7ge+7gu+7g++7hO+7he+7hu+7h++7iO+7ie+7iu+7i++7jO+7je+7ju+7j++7kO+7ke+7ku+7k++7lO+7le+7lu+7l++7mO+7me+7mu+7m++7nO+7ne+7nu+7n++7oO+7oe+7ou+7o++7pO+7pe+7pu+7p++7qO+7qe+7qu+7q++7rO+7re+7ru+7rwor77uw77ux77uy77uz77u077u177u277u377u477u577u677u777u877u977u+77u/CisKK0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zIChVK0ZGMDAtVStGRkVGKToKKwor77yA77yB77yC77yD77yE77yF77yG77yH77yI77yJ77yK77yL77yM77yN77yO77yP77yQ77yR77yS77yT77yU77yV77yW77yX77yY77yZ77ya77yb77yc77yd77ye77yfCivvvKDvvKHvvKLvvKPvvKTvvKXvvKbvvKfvvKjvvKnvvKrvvKvvvKzvvK3vvK7vvK/vvLDvvLHvvLLvvLPvvLTvvLXvvLbvvLfvvLjvvLnvvLrvvLvvvLzvvL3vvL7vvL8KK++9gO+9ge+9gu+9g++9hO+9he+9hu+9h++9iO+9ie+9iu+9i++9jO+9je+9ju+9j++9kO+9ke+9ku+9k++9lO+9le+9lu+9l++9mO+9me+9mu+9m++9nO+9ne+9nu+9nwor772g772h772i772j772k772l772m772n772o772p772q772r772s772t772u772v772w772x772y772z7720772177227723772477257726772777287729772+772/776A776B776C776D776E776F776G776H776I776J776K776L776M776N776O776P776Q776R776S776T776U776V776W776X776Y776Z776a776b776c776d776eCivvvp/vvqDvvqHvvqLvvqPvvqTvvqXvvqbvvqfvvqjvvqnvvqrvvqvvvqzvvq3vvq7vvq/vvrDvvrHvvrLvvrPvvrTvvrXvvrbvvrfvvrjvvrnvvrrvvrvvvrzvvr3vvr7vvr/vv4Dvv4Hvv4Lvv4Pvv4Tvv4Xvv4bvv4fvv4jvv4nvv4rvv4vvv4zvv43vv47vv4/vv5Dvv5Hvv5Lvv5Pvv5Tvv5Xvv5bvv5fvv5jvv5nvv5rvv5vvv5zvv53vv54KK++/n++/oO+/oe+/ou+/o++/pO+/pe+/pu+/p++/qO+/qe+/qu+/q++/rO+/re+/ru+/rworCitTcGVjaWFscyAoVStGRkYwLVUrRkZGRik6CisKK++/sO+/se+/su+/s++/tO+/te+/tu+/t++/uO+/ue+/uu+/u++/vO+/ve+/vu+/vwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL0NvbmZpZy5pbiBiL2UyZnNwcm9ncy9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzNmJjMAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9Db25maWcuaW4KQEAgLTAsMCArMSw3MiBAQAorIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IEV4dDIgRlMgUHJvZ3MiCisKKworCitjb25maWcgQ0hBVFRSCisJYm9vbCAiY2hhdHRyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNoYXR0ciBjaGFuZ2VzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb24gYSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCisKKyMjIyBjb25maWcgRTJGU0NLCisjIyMJYm9vbCAiZTJmc2NrIgorIyMjCWRlZmF1bHQgeQorIyMjCWhlbHAKKyMjIwkgIGUyZnNjayBpcyB1c2VkIHRvIGNoZWNrIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbXMgKGV4dDJmcykuCisjIyMJICBlMmZzY2sgYWxzbyBzdXBwb3J0cyBleHQyIGZpbGVzeXN0ZW1zIGNvdW50YWluaW5nIGEgam91cm5hbCAoZXh0MykuCisjIyMJICBUaGUgbm9ybWFsIGNvbXBhdCBzeW1saW5rcyAnZnNjay5leHQyJyBhbmQgJ2ZzY2suZXh0MycgYXJlIGFsc28KKyMjIwkgIHByb3ZpZGVkLgorCitjb25maWcgRlNDSworCWJvb2wgImZzY2siCisJZGVmYXVsdCB5CisJaGVscAorCSAgZnNjayBpcyB1c2VkIHRvIGNoZWNrIGFuZCBvcHRpb25hbGx5IHJlcGFpciBvbmUgb3IgbW9yZSBmaWxlc3lzdGVtcy4KKwkgIEluIGFjdHVhbGl0eSwgZnNjayBpcyBzaW1wbHkgYSBmcm9udC1lbmQgZm9yIHRoZSB2YXJpb3VzIGZpbGUgc3lzdGVtCisJICBjaGVja2VycyAoZnNjay5mc3R5cGUpIGF2YWlsYWJsZSB1bmRlciBMaW51eC4KKworY29uZmlnIExTQVRUUgorCWJvb2wgImxzYXR0ciIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsc2F0dHIgbGlzdHMgdGhlIGZpbGUgYXR0cmlidXRlcyBvbiBhIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbS4KKworIyMjIGNvbmZpZyBNS0UyRlMKKyMjIwlib29sICJta2UyZnMiCisjIyMJZGVmYXVsdCB5CisjIyMJaGVscAorIyMjCSAgbWtlMmZzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGV4dDIvZXh0MyBmaWxlc3lzdGVtLiBUaGUgbm9ybWFsIGNvbXBhdAorIyMjCSAgc3ltbGlua3MgJ21rZnMuZXh0MicgYW5kICdta2ZzLmV4dDMnIGFyZSBhbHNvIHByb3ZpZGVkLgorCitjb25maWcgVFVORTJGUworCWJvb2wgInR1bmUyZnMiCisJZGVmYXVsdCBuICAjIG9mZjogaXQgaXMgdG9vIGxpbWl0ZWQgY29tcGFyZWQgdG8gdXBzdHJlYW0gdmVyc2lvbgorCWhlbHAKKwkgIHR1bmUyZnMgYWxsb3dzIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBhZGp1c3QgdmFyaW91cyB0dW5hYmxlCisJICBmaWxlc3lzdGVtIHBhcmFtZXRlcnMgb24gTGludXggZXh0Mi9leHQzIGZpbGVzeXN0ZW1zLgorCisjIyMgY29uZmlnIEUyTEFCRUwKKyMjIwlib29sICJlMmxhYmVsIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVFVORTJGUworIyMjCWhlbHAKKyMjIwkgIGUybGFiZWwgd2lsbCBkaXNwbGF5IG9yIGNoYW5nZSB0aGUgZmlsZXN5c3RlbSBsYWJlbCBvbiB0aGUgZXh0MgorIyMjCSAgZmlsZXN5c3RlbSBsb2NhdGVkIG9uIGRldmljZS4KKworIyMjIE5COiB0aGlzIG9uZSBpcyBub3cgcHJvdmlkZWQgYnkgdXRpbC1saW51eC92b2x1bWVfaWQvKgorIyMjIGNvbmZpZyBGSU5ERlMKKyMjIwlib29sICJmaW5kZnMiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBUVU5FMkZTCisjIyMJaGVscAorIyMjCSAgZmluZGZzIHdpbGwgc2VhcmNoIHRoZSBkaXNrcyBpbiB0aGUgc3lzdGVtIGxvb2tpbmcgZm9yIGEgZmlsZXN5c3RlbQorIyMjCSAgd2hpY2ggaGFzIGEgbGFiZWwgbWF0Y2hpbmcgbGFiZWwgb3IgYSBVVUlEIGVxdWFsIHRvIHV1aWQuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9Db25maWcuc3JjIGIvZTJmc3Byb2dzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzZTFlMQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9Db25maWcuc3JjCkBAIC0wLDAgKzEsNzEgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IEV4dDIgRlMgUHJvZ3MiCisKK0lOU0VSVAorCitjb25maWcgQ0hBVFRSCisJYm9vbCAiY2hhdHRyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNoYXR0ciBjaGFuZ2VzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb24gYSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCisKKyMjIyBjb25maWcgRTJGU0NLCisjIyMJYm9vbCAiZTJmc2NrIgorIyMjCWRlZmF1bHQgeQorIyMjCWhlbHAKKyMjIwkgIGUyZnNjayBpcyB1c2VkIHRvIGNoZWNrIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbXMgKGV4dDJmcykuCisjIyMJICBlMmZzY2sgYWxzbyBzdXBwb3J0cyBleHQyIGZpbGVzeXN0ZW1zIGNvdW50YWluaW5nIGEgam91cm5hbCAoZXh0MykuCisjIyMJICBUaGUgbm9ybWFsIGNvbXBhdCBzeW1saW5rcyAnZnNjay5leHQyJyBhbmQgJ2ZzY2suZXh0MycgYXJlIGFsc28KKyMjIwkgIHByb3ZpZGVkLgorCitjb25maWcgRlNDSworCWJvb2wgImZzY2siCisJZGVmYXVsdCB5CisJaGVscAorCSAgZnNjayBpcyB1c2VkIHRvIGNoZWNrIGFuZCBvcHRpb25hbGx5IHJlcGFpciBvbmUgb3IgbW9yZSBmaWxlc3lzdGVtcy4KKwkgIEluIGFjdHVhbGl0eSwgZnNjayBpcyBzaW1wbHkgYSBmcm9udC1lbmQgZm9yIHRoZSB2YXJpb3VzIGZpbGUgc3lzdGVtCisJICBjaGVja2VycyAoZnNjay5mc3R5cGUpIGF2YWlsYWJsZSB1bmRlciBMaW51eC4KKworY29uZmlnIExTQVRUUgorCWJvb2wgImxzYXR0ciIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsc2F0dHIgbGlzdHMgdGhlIGZpbGUgYXR0cmlidXRlcyBvbiBhIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbS4KKworIyMjIGNvbmZpZyBNS0UyRlMKKyMjIwlib29sICJta2UyZnMiCisjIyMJZGVmYXVsdCB5CisjIyMJaGVscAorIyMjCSAgbWtlMmZzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGV4dDIvZXh0MyBmaWxlc3lzdGVtLiBUaGUgbm9ybWFsIGNvbXBhdAorIyMjCSAgc3ltbGlua3MgJ21rZnMuZXh0MicgYW5kICdta2ZzLmV4dDMnIGFyZSBhbHNvIHByb3ZpZGVkLgorCitjb25maWcgVFVORTJGUworCWJvb2wgInR1bmUyZnMiCisJZGVmYXVsdCBuICAjIG9mZjogaXQgaXMgdG9vIGxpbWl0ZWQgY29tcGFyZWQgdG8gdXBzdHJlYW0gdmVyc2lvbgorCWhlbHAKKwkgIHR1bmUyZnMgYWxsb3dzIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBhZGp1c3QgdmFyaW91cyB0dW5hYmxlCisJICBmaWxlc3lzdGVtIHBhcmFtZXRlcnMgb24gTGludXggZXh0Mi9leHQzIGZpbGVzeXN0ZW1zLgorCisjIyMgY29uZmlnIEUyTEFCRUwKKyMjIwlib29sICJlMmxhYmVsIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVFVORTJGUworIyMjCWhlbHAKKyMjIwkgIGUybGFiZWwgd2lsbCBkaXNwbGF5IG9yIGNoYW5nZSB0aGUgZmlsZXN5c3RlbSBsYWJlbCBvbiB0aGUgZXh0MgorIyMjCSAgZmlsZXN5c3RlbSBsb2NhdGVkIG9uIGRldmljZS4KKworIyMjIE5COiB0aGlzIG9uZSBpcyBub3cgcHJvdmlkZWQgYnkgdXRpbC1saW51eC92b2x1bWVfaWQvKgorIyMjIGNvbmZpZyBGSU5ERlMKKyMjIwlib29sICJmaW5kZnMiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBUVU5FMkZTCisjIyMJaGVscAorIyMjCSAgZmluZGZzIHdpbGwgc2VhcmNoIHRoZSBkaXNrcyBpbiB0aGUgc3lzdGVtIGxvb2tpbmcgZm9yIGEgZmlsZXN5c3RlbQorIyMjCSAgd2hpY2ggaGFzIGEgbGFiZWwgbWF0Y2hpbmcgbGFiZWwgb3IgYSBVVUlEIGVxdWFsIHRvIHV1aWQuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9LYnVpbGQuc3JjIGIvZTJmc3Byb2dzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMTRjMwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTUgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWItJChDT05GSUdfQ0hBVFRSKSArPSBjaGF0dHIubyBlMmZzX2xpYi5vCitsaWItJChDT05GSUdfTFNBVFRSKSArPSBsc2F0dHIubyBlMmZzX2xpYi5vCisKK2xpYi0kKENPTkZJR19GU0NLKSAgICArPSBmc2NrLm8KK2xpYi0kKENPTkZJR19UVU5FMkZTKSArPSB0dW5lMmZzLm8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9SRUFETUUgYi9lMmZzcHJvZ3MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTU4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MvUkVBRE1FCkBAIC0wLDAgKzEsMTIgQEAKK0F1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycyBvZiBvcmlnaW5hbCBlMmZzcHJvZ3M6CisKK1JlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KK1RoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CitTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPgorQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorS2F6IEt5bGhla3UgPGthekBhc2hpLmZvb3RwcmludHMubmV0PgorRi5XLiB0ZW4gV29sZGUgPGZyYW5reUBkdXRlY2EuZXQudHVkZWxmdC5ubD4KK0plcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUB6aXAuY29tLmF1PgorTS5KLkUuIE1vbCA8bWFyY2VsQGR1dGVjYS5ldC50dWRlbGZ0Lm5sPgorTWlxdWVsIHZhbiBTbW9vcmVuYnVyZyA8bWlxdWVsc0Bkcmlua2VsLm93Lm9yZz4KK1V3ZSBPaHNlIDx1d2VAdGlya2EuZ3VuLmRlPgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL2NoYXR0ci5jIGIvZTJmc3Byb2dzL2NoYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2M4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MvY2hhdHRyLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNoYXR0ci5jCQktIENoYW5nZSBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCAgUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJLCBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEwLzMwCS0gQ3JlYXRpb24KKyAqIDkzLzExLzEzCS0gUmVwbGFjZSBzdGF0KCkgY2FsbHMgYnkgbHN0YXQoKSB0byBhdm9pZCBsb29wcworICogOTQvMDIvMjcJLSBJbnRlZ3JhdGVkIGluIFRlZCdzIGRpc3RyaWJ1dGlvbgorICogOTgvMTIvMjkJLSBJZ25vcmUgc3ltbGlua3Mgd2hlbiB3b3JraW5nIHJlY3Vyc2l2ZWx5IChHIE0gU2lwZSkKKyAqIDk4LzEyLzI5CS0gRGlzcGxheSB2ZXJzaW9uIGluZm8gb25seSB3aGVuIC1WIHNwZWNpZmllZCAoRyBNIFNpcGUpCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNoYXR0cl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1SXSBbLSs9QWFjRGRpanNTdFR1XSBbLXYgVkVSU0lPTl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGNoYXR0cl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmc1xuIgorLy91c2FnZTogICAgICJcbk1vZGlmaWVyczoiCisvL3VzYWdlOiAgICAgIlxuCS0JUmVtb3ZlIGF0dHJpYnV0ZXMiCisvL3VzYWdlOiAgICAgIlxuCSsJQWRkIGF0dHJpYnV0ZXMiCisvL3VzYWdlOiAgICAgIlxuCT0JU2V0IGF0dHJpYnV0ZXMiCisvL3VzYWdlOiAgICAgIlxuQXR0cmlidXRlczoiCisvL3VzYWdlOiAgICAgIlxuCUEJRG9uJ3QgdHJhY2sgYXRpbWUiCisvL3VzYWdlOiAgICAgIlxuCWEJQXBwZW5kIG1vZGUgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JYwlFbmFibGUgY29tcHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCUQJV3JpdGUgZGlyIGNvbnRlbnRzIHN5bmNocm9ub3VzbHkiCisvL3VzYWdlOiAgICAgIlxuCWQJRG9uJ3QgYmFja3VwIHdpdGggZHVtcCIKKy8vdXNhZ2U6ICAgICAiXG4JaQlDYW5ub3QgYmUgbW9kaWZpZWQgKGltbXV0YWJsZSkiCisvL3VzYWdlOiAgICAgIlxuCWoJV3JpdGUgYWxsIGRhdGEgdG8gam91cm5hbCBmaXJzdCIKKy8vdXNhZ2U6ICAgICAiXG4JcwlaZXJvIGRpc2sgc3RvcmFnZSB3aGVuIGRlbGV0ZWQiCisvL3VzYWdlOiAgICAgIlxuCVMJV3JpdGUgZmlsZSBjb250ZW50cyBzeW5jaHJvbm91c2x5IgorLy91c2FnZTogICAgICJcbgl0CURpc2FibGUgdGFpbC1tZXJnaW5nIG9mIHBhcnRpYWwgYmxvY2tzIHdpdGggb3RoZXIgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCXUJQWxsb3cgZmlsZSB0byBiZSB1bmRlbGV0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOiAgICAgIlxuCS12CVNldCB0aGUgZmlsZSdzIHZlcnNpb24vZ2VuZXJhdGlvbiBudW1iZXIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImUyZnNfbGliLmgiCisKKyNkZWZpbmUgT1BUX0FERCAxCisjZGVmaW5lIE9QVF9SRU0gMgorI2RlZmluZSBPUFRfU0VUIDQKKyNkZWZpbmUgT1BUX1NFVF9WRVIgOAorCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgbG9uZyB2ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgYWY7CisJdW5zaWduZWQgbG9uZyByZjsKKwlzbWFsbGludCBmbGFnczsKKwlzbWFsbGludCByZWN1cnNpdmU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZmxhZyhjaGFyIGMpCit7CisJY29uc3QgY2hhciAqZnAgPSBzdHJjaHIoZTJhdHRyX2ZsYWdzX3NuYW1lX2NoYXR0ciwgYyk7CisJaWYgKGZwKQorCQlyZXR1cm4gZTJhdHRyX2ZsYWdzX3ZhbHVlX2NoYXR0cltmcCAtIGUyYXR0cl9mbGFnc19zbmFtZV9jaGF0dHJdOworCWJiX3Nob3dfdXNhZ2UoKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXJnKGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IGdsb2JhbHMgKmdwKQoreworCXVuc2lnbmVkIGxvbmcgKmZsOworCWNoYXIgb3B0ID0gKmFyZysrOworCisJZmwgPSAmZ3AtPmFmOworCWlmIChvcHQgPT0gJy0nKSB7CisJCWdwLT5mbGFncyB8PSBPUFRfUkVNOworCQlmbCA9ICZncC0+cmY7CisJfSBlbHNlIGlmIChvcHQgPT0gJysnKSB7CisJCWdwLT5mbGFncyB8PSBPUFRfQUREOworCX0gZWxzZSBpZiAob3B0ID09ICc9JykgeworCQlncC0+ZmxhZ3MgfD0gT1BUX1NFVDsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKmFyZykKKwkJKmZsIHw9IGdldF9mbGFnKCphcmcrKyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgY2hhbmdlX2F0dHJpYnV0ZXMoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGdsb2JhbHMgKmdwKTsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgY2hhdHRyX2Rpcl9wcm9jKGNvbnN0IGNoYXIgKmRpcl9uYW1lLCBzdHJ1Y3QgZGlyZW50ICpkZSwgdm9pZCAqZ3ApCit7CisJY2hhciAqcGF0aCA9IGNvbmNhdF9zdWJwYXRoX2ZpbGUoZGlyX25hbWUsIGRlLT5kX25hbWUpOworCS8qIHBhdGggaXMgTlVMTCBpZiBkZS0+ZF9uYW1lIGlzICIuIiBvciAiLi4iLCBlbHNlLi4uICovCisJaWYgKHBhdGgpIHsKKwkJY2hhbmdlX2F0dHJpYnV0ZXMocGF0aCwgZ3ApOworCQlmcmVlKHBhdGgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hhbmdlX2F0dHJpYnV0ZXMoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGdsb2JhbHMgKmdwKQoreworCXVuc2lnbmVkIGxvbmcgZnNmbGFnczsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChsc3RhdChuYW1lLCAmc3QpICE9IDApIHsKKwkJYmJfcGVycm9yX21zZygic3RhdCAlcyIsIG5hbWUpOworCQlyZXR1cm47CisJfQorCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpICYmIGdwLT5yZWN1cnNpdmUpCisJCXJldHVybjsKKworCS8qIERvbid0IHRyeSB0byBvcGVuIGRldmljZSBmaWxlcywgZmlmb3MgZXRjLiAgV2UgcHJvYmFibHkKKwkgKiBvdWdodCB0byBkaXNwbGF5IGFuIGVycm9yIGlmIHRoZSBmaWxlIHdhcyBleHBsaWNpdGx5IGdpdmVuCisJICogb24gdGhlIGNvbW1hbmQgbGluZSAod2hldGhlciBvciBub3QgcmVjdXJzaXZlIHdhcworCSAqIHJlcXVlc3RlZCkuICAqLworCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSAmJiAhU19JU0xOSyhzdC5zdF9tb2RlKSAmJiAhU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJcmV0dXJuOworCisJaWYgKGdwLT5mbGFncyAmIE9QVF9TRVRfVkVSKQorCQlpZiAoZnNldHZlcnNpb24obmFtZSwgZ3AtPnZlcnNpb24pICE9IDApCisJCQliYl9wZXJyb3JfbXNnKCJzZXR0aW5nIHZlcnNpb24gb24gJXMiLCBuYW1lKTsKKworCWlmIChncC0+ZmxhZ3MgJiBPUFRfU0VUKSB7CisJCWZzZmxhZ3MgPSBncC0+YWY7CisJfSBlbHNlIHsKKwkJaWYgKGZnZXRmbGFncyhuYW1lLCAmZnNmbGFncykgIT0gMCkgeworCQkJYmJfcGVycm9yX21zZygicmVhZGluZyBmbGFncyBvbiAlcyIsIG5hbWUpOworCQkJZ290byBza2lwX3NldGZsYWdzOworCQl9CisJCS8qaWYgKGdwLT5mbGFncyAmIE9QVF9SRU0pIC0gbm90IG5lZWRlZCwgcmYgaXMgemVybyBvdGhlcndpc2UgKi8KKwkJCWZzZmxhZ3MgJj0gfmdwLT5yZjsKKwkJLyppZiAoZ3AtPmZsYWdzICYgT1BUX0FERCkgLSBub3QgbmVlZGVkLCBhZiBpcyB6ZXJvIG90aGVyd2lzZSAqLworCQkJZnNmbGFncyB8PSBncC0+YWY7CisJCS8qIFdoYXQgaXMgdGhpcz8gQW5kIHdoeSBpdCdzIG5vdCBkb25lIGZvciBTRVQgY2FzZT8gKi8KKwkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJZnNmbGFncyAmPSB+RVhUMl9ESVJTWU5DX0ZMOworCX0KKwlpZiAoZnNldGZsYWdzKG5hbWUsIGZzZmxhZ3MpICE9IDApCisJCWJiX3BlcnJvcl9tc2coInNldHRpbmcgZmxhZ3Mgb24gJXMiLCBuYW1lKTsKKworIHNraXBfc2V0ZmxhZ3M6CisJaWYgKGdwLT5yZWN1cnNpdmUgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJaXRlcmF0ZV9vbl9kaXIobmFtZSwgY2hhdHRyX2Rpcl9wcm9jLCBncCk7Cit9CisKK2ludCBjaGF0dHJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNoYXR0cl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdsb2JhbHMgZzsKKwljaGFyICphcmc7CisKKwltZW1zZXQoJmcsIDAsIHNpemVvZihnKSk7CisKKwkvKiBwYXJzZSB0aGUgYXJncyAqLworCXdoaWxlICgoYXJnID0gKisrYXJndikpIHsKKwkJLyogdGFrZSBjYXJlIG9mIC1SIGFuZCAtdiA8dmVyc2lvbj4gKi8KKwkJaWYgKGFyZ1swXSA9PSAnLScKKwkJICYmIChhcmdbMV0gPT0gJ1InIHx8IGFyZ1sxXSA9PSAndicpCisJCSAmJiAhYXJnWzJdCisJCSkgeworCQkJaWYgKGFyZ1sxXSA9PSAnUicpIHsKKwkJCQlnLnJlY3Vyc2l2ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBhcmdbMV0gPT0gJ3YnICovCisJCQlpZiAoISorK2FyZ3YpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJZy52ZXJzaW9uID0geGF0b3VsKCphcmd2KTsKKwkJCWcuZmxhZ3MgfD0gT1BUX1NFVF9WRVI7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZGVjb2RlX2FyZyhhcmcsICZnKSkKKwkJCWJyZWFrOworCX0KKworCS8qIHJ1biBzYW5pdHkgY2hlY2tzIG9uIGFsbCB0aGUgYXJndW1lbnRzIGdpdmVuIHVzICovCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCWlmICgoZy5mbGFncyAmIE9QVF9TRVQpICYmIChnLmZsYWdzICYgKE9QVF9BRER8T1BUX1JFTSkpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiPSBpcyBpbmNvbXBhdGlibGUgd2l0aCAtIGFuZCArIik7CisJaWYgKGcucmYgJiBnLmFmKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IGFuZCB1bnNldCBhIGZsYWciKTsKKwlpZiAoIWcuZmxhZ3MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IHVzZSAnLXYnLCA9LCAtIG9yICsiKTsKKworCS8qIG5vdyBydW4gY2hhdHRyIG9uIGFsbCB0aGUgZmlsZXMgcGFzc2VkIHRvIHVzICovCisJZG8gY2hhbmdlX2F0dHJpYnV0ZXMoKmFyZ3YsICZnKTsgd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9lMmZzX2RlZnMuaCBiL2UyZnNwcm9ncy9lMmZzX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk2NDBlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL2UyZnNfZGVmcy5oCkBAIC0wLDAgKzEsNTYxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpZm5kZWYgTElOVVhfRVhUMl9GU19ICisjZGVmaW5lIExJTlVYX0VYVDJfRlNfSCAxCisKKy8qCisgKiBTcGVjaWFsIGlub2RlIG51bWJlcnMKKyAqLworI2RlZmluZSBFWFQyX0JBRF9JTk8JCSAxCS8qIEJhZCBibG9ja3MgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9ST09UX0lOTwkJIDIJLyogUm9vdCBpbm9kZSAqLworI2RlZmluZSBFWFQyX0FDTF9JRFhfSU5PCSAzCS8qIEFDTCBpbm9kZSAqLworI2RlZmluZSBFWFQyX0FDTF9EQVRBX0lOTwkgNAkvKiBBQ0wgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9CT09UX0xPQURFUl9JTk8JIDUJLyogQm9vdCBsb2FkZXIgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9VTkRFTF9ESVJfSU5PCSA2CS8qIFVuZGVsZXRlIGRpcmVjdG9yeSBpbm9kZSAqLworI2RlZmluZSBFWFQyX1JFU0laRV9JTk8JCSA3CS8qIFJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3JzIGlub2RlICovCisjZGVmaW5lIEVYVDJfSk9VUk5BTF9JTk8JIDgJLyogSm91cm5hbCBpbm9kZSAqLworCisvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgZm9yIG9sZCBleHQyIGZpbGVzeXN0ZW1zICovCisjZGVmaW5lIEVYVDJfR09PRF9PTERfRklSU1RfSU5PCTExCisKKy8qCisgKiBUaGUgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIG1hZ2ljIG51bWJlcgorICovCisjZGVmaW5lIEVYVDJfU1VQRVJfTUFHSUMJMHhFRjUzCisKKy8qIEFzc3VtZSB0aGF0IHVzZXIgbW9kZSBwcm9ncmFtcyBhcmUgcGFzc2luZyBpbiBhbiBleHQyZnMgc3VwZXJibG9jaywgbm90CisgKiBhIGtlcm5lbCBzdHJ1Y3Qgc3VwZXJfYmxvY2suICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY2FsbCB0aGUgZmVhdHVyZS10ZXN0CisgKiBtYWNyb3MgZnJvbSB1c2VyIGxhbmQuICovCisjZGVmaW5lIEVYVDJfU0Ioc2IpCShzYikKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUMl9MSU5LX01BWAkJMzIwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUJCTEwCS8qIDEwMjQgKi8KKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUJCTE2CS8qIDY1NTM2ICovCisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX1NJWkUJKDEgPDwgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLX1NJWkUJKDEgPDwgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUpCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRShzKQkoRVhUMl9NSU5fQkxPQ0tfU0laRSA8PCAocyktPnNfbG9nX2Jsb2NrX3NpemUpCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKKyNkZWZpbmUgRVhUMl9JTk9ERV9TSVpFKHMpCSgoKHMpLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgPyBcCisJCQkJIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSA6IChzKS0+c19pbm9kZV9zaXplKQorI2RlZmluZSBFWFQyX0ZJUlNUX0lOTyhzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyA6IChzKS0+c19maXJzdF9pbm8pCisjZGVmaW5lIEVYVDJfQUREUl9QRVJfQkxPQ0socykJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZih1aW50MzJfdCkpCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZnJhZ21lbnRzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19TSVpFCQlFWFQyX01JTl9CTE9DS19TSVpFCisjZGVmaW5lIEVYVDJfTUFYX0ZSQUdfU0laRQkJRVhUMl9NQVhfQkxPQ0tfU0laRQorI2RlZmluZSBFWFQyX01JTl9GUkFHX0xPR19TSVpFCQlFWFQyX01JTl9CTE9DS19MT0dfU0laRQorI2RlZmluZSBFWFQyX0ZSQUdfU0laRShzKQkJKEVYVDJfTUlOX0ZSQUdfU0laRSA8PCAocyktPnNfbG9nX2ZyYWdfc2l6ZSkKKyNkZWZpbmUgRVhUMl9GUkFHU19QRVJfQkxPQ0socykJCShFWFQyX0JMT0NLX1NJWkUocykgLyBFWFQyX0ZSQUdfU0laRShzKSkKKworLyoKKyAqIEFDTCBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBleHQyX2FjbF9oZWFkZXIgewkvKiBIZWFkZXIgb2YgQWNjZXNzIENvbnRyb2wgTGlzdHMgKi8KKwl1aW50MzJfdAlhY2xoX3NpemU7CisJdWludDMyX3QJYWNsaF9maWxlX2NvdW50OworCXVpbnQzMl90CWFjbGhfYWNsZV9jb3VudDsKKwl1aW50MzJfdAlhY2xoX2ZpcnN0X2FjbGU7Cit9OworCitzdHJ1Y3QgZXh0Ml9hY2xfZW50cnkgewkvKiBBY2Nlc3MgQ29udHJvbCBMaXN0IEVudHJ5ICovCisJdWludDMyX3QJYWNsZV9zaXplOworCXVpbnQxNl90CWFjbGVfcGVybXM7CS8qIEFjY2VzcyBwZXJtaXNzaW9ucyAqLworCXVpbnQxNl90CWFjbGVfdHlwZTsJLyogVHlwZSBvZiBlbnRyeSAqLworCXVpbnQxNl90CWFjbGVfdGFnOwkvKiBVc2VyIG9yIGdyb3VwIGlkZW50aXR5ICovCisJdWludDE2X3QJYWNsZV9wYWQxOworCXVpbnQzMl90CWFjbGVfbmV4dDsJLyogUG9pbnRlciBvbiBuZXh0IGVudHJ5IGZvciB0aGUgKi8KKwkJCQkJLyogc2FtZSBpbm9kZSBvciBvbiBuZXh0IGZyZWUgZW50cnkgKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBibG9ja3MgZ3JvdXAgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjIHsKKwl1aW50MzJfdAliZ19ibG9ja19iaXRtYXA7CS8qIEJsb2NrcyBiaXRtYXAgYmxvY2sgKi8KKwl1aW50MzJfdAliZ19pbm9kZV9iaXRtYXA7CS8qIElub2RlcyBiaXRtYXAgYmxvY2sgKi8KKwl1aW50MzJfdAliZ19pbm9kZV90YWJsZTsJCS8qIElub2RlcyB0YWJsZSBibG9jayAqLworCXVpbnQxNl90CWJnX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCXVpbnQxNl90CWJnX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCXVpbnQxNl90CWJnX3VzZWRfZGlyc19jb3VudDsJLyogRGlyZWN0b3JpZXMgY291bnQgKi8KKwl1aW50MTZfdAliZ19wYWQ7CisJdWludDMyX3QJYmdfcmVzZXJ2ZWRbM107Cit9OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIGRpcmVjdG9yeSBpbmRleGluZyBmZWF0dXJlCisgKgorICogTm90ZTogYWxsIG9mIHRoZSBtdWx0aWJ5dGUgaW50ZWdlciBmaWVsZHMgYXJlIGxpdHRsZSBlbmRpYW4uCisgKi8KKworLyoKKyAqIE5vdGU6IGR4X3Jvb3RfaW5mbyBpcyBsYWlkIG91dCBzbyB0aGF0IGlmIGl0IHNob3VsZCBzb21laG93IGdldAorICogb3ZlcmxhaWQgYnkgYSBkaXJlbnQgdGhlIHR3byBsb3cgYml0cyBvZiB0aGUgaGFzaCB2ZXJzaW9uIHdpbGwgYmUKKyAqIHplcm8uICBUaGVyZWZvcmUsIHRoZSBoYXNoIHZlcnNpb24gbW9kIDQgc2hvdWxkIG5ldmVyIGJlIDAuCisgKiBTaW5jZXJlbHksIHRoZSBwYXJhbm9pYSBkZXBhcnRtZW50LgorICovCitzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8geworCXVpbnQzMl90CXJlc2VydmVkX3plcm87CisJdWludDhfdAkJaGFzaF92ZXJzaW9uOyAvKiAwIG5vdywgMSBhdCByZWxlYXNlICovCisJdWludDhfdAkJaW5mb19sZW5ndGg7IC8qIDggKi8KKwl1aW50OF90CQlpbmRpcmVjdF9sZXZlbHM7CisJdWludDhfdAkJdW51c2VkX2ZsYWdzOworfTsKKworI2RlZmluZSBFWFQyX0hBU0hfTEVHQUNZCTAKKyNkZWZpbmUgRVhUMl9IQVNIX0hBTEZfTUQ0CTEKKyNkZWZpbmUgRVhUMl9IQVNIX1RFQQkJMgorCisjZGVmaW5lIEVYVDJfSEFTSF9GTEFHX0lOQ09NUEFUCTB4MQorCitzdHJ1Y3QgZXh0Ml9keF9lbnRyeSB7CisJdWludDMyX3QgaGFzaDsKKwl1aW50MzJfdCBibG9jazsKK307CisKK3N0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgeworCXVpbnQxNl90IGxpbWl0OworCXVpbnQxNl90IGNvdW50OworfTsKKworCisvKgorICogTWFjcm8taW5zdHJ1Y3Rpb25zIHVzZWQgdG8gbWFuYWdlIGdyb3VwIGRlc2NyaXB0b3JzCisgKi8KKyNkZWZpbmUgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHMpCShFWFQyX1NCKHMpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCisjZGVmaW5lIEVYVDJfSU5PREVTX1BFUl9HUk9VUChzKQkoRVhUMl9TQihzKS0+c19pbm9kZXNfcGVyX2dyb3VwKQorI2RlZmluZSBFWFQyX0lOT0RFU19QRVJfQkxPQ0socykJKEVYVDJfQkxPQ0tfU0laRShzKS9FWFQyX0lOT0RFX1NJWkUocykpCisvKiBsaW1pdHMgaW1wb3NlZCBieSAxNi1iaXQgdmFsdWUgZ2RfZnJlZV97YmxvY2tzLGlub2RlfV9jb3VudCAqLworI2RlZmluZSBFWFQyX01BWF9CTE9DS1NfUEVSX0dST1VQKHMpCSgoMSA8PCAxNikgLSA4KQorI2RlZmluZSBFWFQyX01BWF9JTk9ERVNfUEVSX0dST1VQKHMpCSgoMSA8PCAxNikgLSBFWFQyX0lOT0RFU19QRVJfQkxPQ0socykpCisjZGVmaW5lIEVYVDJfREVTQ19QRVJfQkxPQ0socykJCShFWFQyX0JMT0NLX1NJWkUocykgLyBzaXplb2YgKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpKQorCisvKgorICogQ29uc3RhbnRzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIGJsb2NrcworICovCisjZGVmaW5lIEVYVDJfTkRJUl9CTE9DS1MJCTEyCisjZGVmaW5lIEVYVDJfSU5EX0JMT0NLCQkJRVhUMl9ORElSX0JMT0NLUworI2RlZmluZSBFWFQyX0RJTkRfQkxPQ0sJCQkoRVhUMl9JTkRfQkxPQ0sgKyAxKQorI2RlZmluZSBFWFQyX1RJTkRfQkxPQ0sJCQkoRVhUMl9ESU5EX0JMT0NLICsgMSkKKyNkZWZpbmUgRVhUMl9OX0JMT0NLUwkJCShFWFQyX1RJTkRfQkxPQ0sgKyAxKQorCisvKgorICogSW5vZGUgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX1NFQ1JNX0ZMCQkJMHgwMDAwMDAwMSAvKiBTZWN1cmUgZGVsZXRpb24gKi8KKyNkZWZpbmUgRVhUMl9VTlJNX0ZMCQkJMHgwMDAwMDAwMiAvKiBVbmRlbGV0ZSAqLworI2RlZmluZSBFWFQyX0NPTVBSX0ZMCQkJMHgwMDAwMDAwNCAvKiBDb21wcmVzcyBmaWxlICovCisjZGVmaW5lIEVYVDJfU1lOQ19GTAkJCTB4MDAwMDAwMDggLyogU3luY2hyb25vdXMgdXBkYXRlcyAqLworI2RlZmluZSBFWFQyX0lNTVVUQUJMRV9GTAkJMHgwMDAwMDAxMCAvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBFWFQyX0FQUEVORF9GTAkJCTB4MDAwMDAwMjAgLyogd3JpdGVzIHRvIGZpbGUgbWF5IG9ubHkgYXBwZW5kICovCisjZGVmaW5lIEVYVDJfTk9EVU1QX0ZMCQkJMHgwMDAwMDA0MCAvKiBkbyBub3QgZHVtcCBmaWxlICovCisjZGVmaW5lIEVYVDJfTk9BVElNRV9GTAkJCTB4MDAwMDAwODAgLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLworLyogUmVzZXJ2ZWQgZm9yIGNvbXByZXNzaW9uIHVzYWdlLi4uICovCisjZGVmaW5lIEVYVDJfRElSVFlfRkwJCQkweDAwMDAwMTAwCisjZGVmaW5lIEVYVDJfQ09NUFJCTEtfRkwJCTB4MDAwMDAyMDAgLyogT25lIG9yIG1vcmUgY29tcHJlc3NlZCBjbHVzdGVycyAqLworI2RlZmluZSBFWFQyX05PQ09NUFJfRkwJCQkweDAwMDAwNDAwIC8qIEFjY2VzcyByYXcgY29tcHJlc3NlZCBkYXRhICovCisjZGVmaW5lIEVYVDJfRUNPTVBSX0ZMCQkJMHgwMDAwMDgwMCAvKiBDb21wcmVzc2lvbiBlcnJvciAqLworLyogRW5kIGNvbXByZXNzaW9uIGZsYWdzIC0tLSBtYXliZSBub3QgYWxsIHVzZWQgKi8KKyNkZWZpbmUgRVhUMl9CVFJFRV9GTAkJCTB4MDAwMDEwMDAgLyogYnRyZWUgZm9ybWF0IGRpciAqLworI2RlZmluZSBFWFQyX0lOREVYX0ZMCQkJMHgwMDAwMTAwMCAvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDJfSU1BR0lDX0ZMCQkJMHgwMDAwMjAwMAorI2RlZmluZSBFWFQzX0pPVVJOQUxfREFUQV9GTAkJMHgwMDAwNDAwMCAvKiBmaWxlIGRhdGEgc2hvdWxkIGJlIGpvdXJuYWxlZCAqLworI2RlZmluZSBFWFQyX05PVEFJTF9GTAkJCTB4MDAwMDgwMDAgLyogZmlsZSB0YWlsIHNob3VsZCBub3QgYmUgbWVyZ2VkICovCisjZGVmaW5lIEVYVDJfRElSU1lOQ19GTAkJCTB4MDAwMTAwMDAgLyogU3luY2hyb25vdXMgZGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgKi8KKyNkZWZpbmUgRVhUMl9UT1BESVJfRkwJCQkweDAwMDIwMDAwIC8qIFRvcCBvZiBkaXJlY3RvcnkgaGllcmFyY2hpZXMqLworI2RlZmluZSBFWFQzX0VYVEVOVFNfRkwJCQkweDAwMDgwMDAwIC8qIElub2RlIHVzZXMgZXh0ZW50cyAqLworI2RlZmluZSBFWFQyX1JFU0VSVkVEX0ZMCQkweDgwMDAwMDAwIC8qIHJlc2VydmVkIGZvciBleHQyIGxpYiAqLworCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9WSVNJQkxFCQkweDAwMDNERkZGIC8qIFVzZXIgdmlzaWJsZSBmbGFncyAqLworI2RlZmluZSBFWFQyX0ZMX1VTRVJfTU9ESUZJQUJMRQkJMHgwMDAwODBGRiAvKiBVc2VyIG1vZGlmaWFibGUgZmxhZ3MgKi8KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgRVhUMl9JT0NfR0VURkxBR1MJCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19TRVRGTEFHUwkJX0lPVygnZicsIDIsIGxvbmcpCisjZGVmaW5lIEVYVDJfSU9DX0dFVFZFUlNJT04JCV9JT1IoJ3YnLCAxLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgbG9uZykKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBpbm9kZSBvbiB0aGUgZGlzaworICovCitzdHJ1Y3QgZXh0Ml9pbm9kZSB7CisJdWludDE2X3QJaV9tb2RlOwkJLyogRmlsZSBtb2RlICovCisJdWludDE2X3QJaV91aWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBPd25lciBVaWQgKi8KKwl1aW50MzJfdAlpX3NpemU7CQkvKiBTaXplIGluIGJ5dGVzICovCisJdWludDMyX3QJaV9hdGltZTsJLyogQWNjZXNzIHRpbWUgKi8KKwl1aW50MzJfdAlpX2N0aW1lOwkvKiBDcmVhdGlvbiB0aW1lICovCisJdWludDMyX3QJaV9tdGltZTsJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwl1aW50MzJfdAlpX2R0aW1lOwkvKiBEZWxldGlvbiBUaW1lICovCisJdWludDE2X3QJaV9naWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBHcm91cCBJZCAqLworCXVpbnQxNl90CWlfbGlua3NfY291bnQ7CS8qIExpbmtzIGNvdW50ICovCisJdWludDMyX3QJaV9ibG9ja3M7CS8qIEJsb2NrcyBjb3VudCAqLworCXVpbnQzMl90CWlfZmxhZ3M7CS8qIEZpbGUgZmxhZ3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAgbF9pX3Jlc2VydmVkMTsKKwkJfSBsaW51eDE7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAgaF9pX3RyYW5zbGF0b3I7CisJCX0gaHVyZDE7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAgbV9pX3Jlc2VydmVkMTsKKwkJfSBtYXNpeDE7CisJfSBvc2QxOwkJCQkvKiBPUyBkZXBlbmRlbnQgMSAqLworCXVpbnQzMl90CWlfYmxvY2tbRVhUMl9OX0JMT0NLU107LyogUG9pbnRlcnMgdG8gYmxvY2tzICovCisJdWludDMyX3QJaV9nZW5lcmF0aW9uOwkvKiBGaWxlIHZlcnNpb24gKGZvciBORlMpICovCisJdWludDMyX3QJaV9maWxlX2FjbDsJLyogRmlsZSBBQ0wgKi8KKwl1aW50MzJfdAlpX2Rpcl9hY2w7CS8qIERpcmVjdG9yeSBBQ0wgKi8KKwl1aW50MzJfdAlpX2ZhZGRyOwkvKiBGcmFnbWVudCBhZGRyZXNzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJdWludDhfdAkJbF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQl1aW50MTZfdAlpX3BhZDE7CisJCQl1aW50MTZfdAlsX2lfdWlkX2hpZ2g7CS8qIHRoZXNlIDIgZmllbGRzICAgICovCisJCQl1aW50MTZfdAlsX2lfZ2lkX2hpZ2g7CS8qIHdlcmUgcmVzZXJ2ZWQyWzBdICovCisJCQl1aW50MzJfdAlsX2lfcmVzZXJ2ZWQyOworCQl9IGxpbnV4MjsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QJCWhfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCXVpbnQ4X3QJCWhfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJdWludDE2X3QJaF9pX21vZGVfaGlnaDsKKwkJCXVpbnQxNl90CWhfaV91aWRfaGlnaDsKKwkJCXVpbnQxNl90CWhfaV9naWRfaGlnaDsKKwkJCXVpbnQzMl90CWhfaV9hdXRob3I7CisJCX0gaHVyZDI7CisJCXN0cnVjdCB7CisJCQl1aW50OF90CQltX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQl1aW50OF90CQltX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCXVpbnQxNl90CW1fcGFkMTsKKwkJCXVpbnQzMl90CW1faV9yZXNlcnZlZDJbMl07CisJCX0gbWFzaXgyOworCX0gb3NkMjsJCQkJLyogT1MgZGVwZW5kZW50IDIgKi8KK307CisKKy8qCisgKiBQZXJtYW5lbnQgcGFydCBvZiBhbiBsYXJnZSBpbm9kZSBvbiB0aGUgZGlzaworICovCitzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSB7CisJdWludDE2X3QJaV9tb2RlOwkJLyogRmlsZSBtb2RlICovCisJdWludDE2X3QJaV91aWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBPd25lciBVaWQgKi8KKwl1aW50MzJfdAlpX3NpemU7CQkvKiBTaXplIGluIGJ5dGVzICovCisJdWludDMyX3QJaV9hdGltZTsJLyogQWNjZXNzIHRpbWUgKi8KKwl1aW50MzJfdAlpX2N0aW1lOwkvKiBDcmVhdGlvbiB0aW1lICovCisJdWludDMyX3QJaV9tdGltZTsJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwl1aW50MzJfdAlpX2R0aW1lOwkvKiBEZWxldGlvbiBUaW1lICovCisJdWludDE2X3QJaV9naWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBHcm91cCBJZCAqLworCXVpbnQxNl90CWlfbGlua3NfY291bnQ7CS8qIExpbmtzIGNvdW50ICovCisJdWludDMyX3QJaV9ibG9ja3M7CS8qIEJsb2NrcyBjb3VudCAqLworCXVpbnQzMl90CWlfZmxhZ3M7CS8qIEZpbGUgZmxhZ3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAgbF9pX3Jlc2VydmVkMTsKKwkJfSBsaW51eDE7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAgaF9pX3RyYW5zbGF0b3I7CisJCX0gaHVyZDE7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCAgbV9pX3Jlc2VydmVkMTsKKwkJfSBtYXNpeDE7CisJfSBvc2QxOwkJCQkvKiBPUyBkZXBlbmRlbnQgMSAqLworCXVpbnQzMl90CWlfYmxvY2tbRVhUMl9OX0JMT0NLU107LyogUG9pbnRlcnMgdG8gYmxvY2tzICovCisJdWludDMyX3QJaV9nZW5lcmF0aW9uOwkvKiBGaWxlIHZlcnNpb24gKGZvciBORlMpICovCisJdWludDMyX3QJaV9maWxlX2FjbDsJLyogRmlsZSBBQ0wgKi8KKwl1aW50MzJfdAlpX2Rpcl9hY2w7CS8qIERpcmVjdG9yeSBBQ0wgKi8KKwl1aW50MzJfdAlpX2ZhZGRyOwkvKiBGcmFnbWVudCBhZGRyZXNzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJdWludDhfdAkJbF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQl1aW50MTZfdAlpX3BhZDE7CisJCQl1aW50MTZfdAlsX2lfdWlkX2hpZ2g7CS8qIHRoZXNlIDIgZmllbGRzICAgICovCisJCQl1aW50MTZfdAlsX2lfZ2lkX2hpZ2g7CS8qIHdlcmUgcmVzZXJ2ZWQyWzBdICovCisJCQl1aW50MzJfdAlsX2lfcmVzZXJ2ZWQyOworCQl9IGxpbnV4MjsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QJCWhfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCXVpbnQ4X3QJCWhfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJdWludDE2X3QJaF9pX21vZGVfaGlnaDsKKwkJCXVpbnQxNl90CWhfaV91aWRfaGlnaDsKKwkJCXVpbnQxNl90CWhfaV9naWRfaGlnaDsKKwkJCXVpbnQzMl90CWhfaV9hdXRob3I7CisJCX0gaHVyZDI7CisJCXN0cnVjdCB7CisJCQl1aW50OF90CQltX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQl1aW50OF90CQltX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCXVpbnQxNl90CW1fcGFkMTsKKwkJCXVpbnQzMl90CW1faV9yZXNlcnZlZDJbMl07CisJCX0gbWFzaXgyOworCX0gb3NkMjsJCQkJLyogT1MgZGVwZW5kZW50IDIgKi8KKwl1aW50MTZfdAlpX2V4dHJhX2lzaXplOworCXVpbnQxNl90CWlfcGFkMTsKK307CisKKyNkZWZpbmUgaV9zaXplX2hpZ2gJaV9kaXJfYWNsCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzdGF0ZXMKKyAqLworI2RlZmluZSBFWFQyX1ZBTElEX0ZTCQkJMHgwMDAxCS8qIFVubW91bnRlZCBjbGVhbmx5ICovCisjZGVmaW5lIEVYVDJfRVJST1JfRlMJCQkweDAwMDIJLyogRXJyb3JzIGRldGVjdGVkICovCisKKy8qCisgKiBNb3VudCBmbGFncworICovCisjZGVmaW5lIEVYVDJfTU9VTlRfQ0hFQ0sJCTB4MDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLworI2RlZmluZSBFWFQyX01PVU5UX0dSUElECQkweDAwMDQJLyogQ3JlYXRlIGZpbGVzIHdpdGggZGlyZWN0b3J5J3MgZ3JvdXAgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9ERUJVRwkJMHgwMDA4CS8qIFNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX0NPTlQJCTB4MDAxMAkvKiBDb250aW51ZSBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfUk8JCTB4MDAyMAkvKiBSZW1vdW50IGZzIHJvIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19QQU5JQwkJMHgwMDQwCS8qIFBhbmljIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX01JTklYX0RGCQkweDAwODAJLyogTWltaWNzIHRoZSBNaW5peCBzdGF0ZnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9OT19VSUQzMgkJMHgwMjAwICAvKiBEaXNhYmxlIDMyLWJpdCBVSURzICovCisKKyNkZWZpbmUgY2xlYXJfb3B0KG8sIG9wdCkJCW8gJj0gfkVYVDJfTU9VTlRfIyNvcHQKKyNkZWZpbmUgc2V0X29wdChvLCBvcHQpCQkJbyB8PSBFWFQyX01PVU5UXyMjb3B0CisjZGVmaW5lIHRlc3Rfb3B0KHNiLCBvcHQpCQkoRVhUMl9TQihzYiktPnNfbW91bnRfb3B0ICYgXAorCQkJCQkgRVhUMl9NT1VOVF8jI29wdCkKKy8qCisgKiBNYXhpbWFsIG1vdW50IGNvdW50cyBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtIGNoZWNrcworICovCisjZGVmaW5lIEVYVDJfREZMX01BWF9NTlRfQ09VTlQJCTIwCS8qIEFsbG93IDIwIG1vdW50cyAqLworI2RlZmluZSBFWFQyX0RGTF9DSEVDS0lOVEVSVkFMCQkwCS8qIERvbid0IHVzZSBpbnRlcnZhbCBjaGVjayAqLworCisvKgorICogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycworICovCisjZGVmaW5lIEVYVDJfRVJST1JTX0NPTlRJTlVFCQkxCS8qIENvbnRpbnVlIGV4ZWN1dGlvbiAqLworI2RlZmluZSBFWFQyX0VSUk9SU19STwkJCTIJLyogUmVtb3VudCBmcyByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfUEFOSUMJCTMJLyogUGFuaWMgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfREVGQVVMVAkJRVhUMl9FUlJPUlNfQ09OVElOVUUKKworLyoKKyAqIFN0cnVjdHVyZSBvZiB0aGUgc3VwZXIgYmxvY2sKKyAqLworc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CXNfaW5vZGVzX2NvdW50OwkJLyogSW5vZGVzIGNvdW50ICovCisJdWludDMyX3QJc19ibG9ja3NfY291bnQ7CQkvKiBCbG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlzX3JfYmxvY2tzX2NvdW50OwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCXVpbnQzMl90CXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJdWludDMyX3QJc19maXJzdF9kYXRhX2Jsb2NrOwkvKiBGaXJzdCBEYXRhIEJsb2NrICovCisJdWludDMyX3QJc19sb2dfYmxvY2tfc2l6ZTsJLyogQmxvY2sgc2l6ZSAqLworCWludDMyX3QJCXNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCXVpbnQzMl90CXNfYmxvY2tzX3Blcl9ncm91cDsJLyogIyBCbG9ja3MgcGVyIGdyb3VwICovCisJdWludDMyX3QJc19mcmFnc19wZXJfZ3JvdXA7CS8qICMgRnJhZ21lbnRzIHBlciBncm91cCAqLworCXVpbnQzMl90CXNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisJdWludDMyX3QJc19tdGltZTsJCS8qIE1vdW50IHRpbWUgKi8KKwl1aW50MzJfdAlzX3d0aW1lOwkJLyogV3JpdGUgdGltZSAqLworCXVpbnQxNl90CXNfbW50X2NvdW50OwkJLyogTW91bnQgY291bnQgKi8KKwlpbnQxNl90CQlzX21heF9tbnRfY291bnQ7CS8qIE1heGltYWwgbW91bnQgY291bnQgKi8KKwl1aW50MTZfdAlzX21hZ2ljOwkJLyogTWFnaWMgc2lnbmF0dXJlICovCisJdWludDE2X3QJc19zdGF0ZTsJCS8qIEZpbGUgc3lzdGVtIHN0YXRlICovCisJdWludDE2X3QJc19lcnJvcnM7CQkvKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzICovCisJdWludDE2X3QJc19taW5vcl9yZXZfbGV2ZWw7CS8qIG1pbm9yIHJldmlzaW9uIGxldmVsICovCisJdWludDMyX3QJc19sYXN0Y2hlY2s7CQkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKwl1aW50MzJfdAlzX2NoZWNraW50ZXJ2YWw7CS8qIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCXVpbnQzMl90CXNfY3JlYXRvcl9vczsJCS8qIE9TICovCisJdWludDMyX3QJc19yZXZfbGV2ZWw7CQkvKiBSZXZpc2lvbiBsZXZlbCAqLworCXVpbnQxNl90CXNfZGVmX3Jlc3VpZDsJCS8qIERlZmF1bHQgdWlkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwl1aW50MTZfdAlzX2RlZl9yZXNnaWQ7CQkvKiBEZWZhdWx0IGdpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBFWFQyX0RZTkFNSUNfUkVWIHN1cGVyYmxvY2tzIG9ubHkuCisJICoKKwkgKiBOb3RlOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb21wYXRpYmxlIGZlYXR1cmUgc2V0IGFuZAorCSAqIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgaXMgdGhhdCBpZiB0aGVyZSBpcyBhIGJpdCBzZXQKKwkgKiBpbiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IHRoYXQgdGhlIGtlcm5lbCBkb2Vzbid0CisJICoga25vdyBhYm91dCwgaXQgc2hvdWxkIHJlZnVzZSB0byBtb3VudCB0aGUgZmlsZXN5c3RlbS4KKwkgKgorCSAqIGUyZnNjaydzIHJlcXVpcmVtZW50cyBhcmUgbW9yZSBzdHJpY3Q7IGlmIGl0IGRvZXNuJ3Qga25vdworCSAqIGFib3V0IGEgZmVhdHVyZSBpbiBlaXRoZXIgdGhlIGNvbXBhdGlibGUgb3IgaW5jb21wYXRpYmxlCisJICogZmVhdHVyZSBzZXQsIGl0IG11c3QgYWJvcnQgYW5kIG5vdCB0cnkgdG8gbWVkZGxlIHdpdGgKKwkgKiB0aGluZ3MgaXQgZG9lc24ndCB1bmRlcnN0YW5kLi4uCisJICovCisJdWludDMyX3QJc19maXJzdF9pbm87CQkvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgKi8KKwl1aW50MTZfdAlzX2lub2RlX3NpemU7CQkvKiBzaXplIG9mIGlub2RlIHN0cnVjdHVyZSAqLworCXVpbnQxNl90CXNfYmxvY2tfZ3JvdXBfbnI7CS8qIGJsb2NrIGdyb3VwICMgb2YgdGhpcyBzdXBlcmJsb2NrICovCisJdWludDMyX3QJc19mZWF0dXJlX2NvbXBhdDsJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9pbmNvbXBhdDsJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJdWludDMyX3QJc19mZWF0dXJlX3JvX2NvbXBhdDsJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQ4X3QJCXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIJCXNfdm9sdW1lX25hbWVbMTZdOwkvKiB2b2x1bWUgbmFtZSAqLworCWNoYXIJCXNfbGFzdF9tb3VudGVkWzY0XTsJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCXVpbnQzMl90CXNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcDsgLyogRm9yIGNvbXByZXNzaW9uICovCisJLyoKKwkgKiBQZXJmb3JtYW5jZSBoaW50cy4gIERpcmVjdG9yeSBwcmVhbGxvY2F0aW9uIHNob3VsZCBvbmx5CisJICogaGFwcGVuIGlmIHRoZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQyBmbGFnIGlzIG9uLgorCSAqLworCXVpbnQ4X3QJc19wcmVhbGxvY19ibG9ja3M7CS8qIE5yIG9mIGJsb2NrcyB0byB0cnkgdG8gcHJlYWxsb2NhdGUqLworCXVpbnQ4X3QJc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCXVpbnQxNl90CXNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsJLyogUGVyIGdyb3VwIHRhYmxlIGZvciBvbmxpbmUgZ3Jvd3RoICovCisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUMl9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisJdWludDhfdAkJc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworCXVpbnQzMl90CXNfam91cm5hbF9pbnVtOwkJLyogaW5vZGUgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCXVpbnQzMl90CXNfam91cm5hbF9kZXY7CQkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCXVpbnQzMl90CXNfbGFzdF9vcnBoYW47CQkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwl1aW50MzJfdAlzX2hhc2hfc2VlZFs0XTsJCS8qIEhUUkVFIGhhc2ggc2VlZCAqLworCXVpbnQ4X3QJCXNfZGVmX2hhc2hfdmVyc2lvbjsJLyogRGVmYXVsdCBoYXNoIHZlcnNpb24gdG8gdXNlICovCisJdWludDhfdAkJc19qbmxfYmFja3VwX3R5cGU7CS8qIERlZmF1bHQgdHlwZSBvZiBqb3VybmFsIGJhY2t1cCAqLworCXVpbnQxNl90CXNfcmVzZXJ2ZWRfd29yZF9wYWQ7CisJdWludDMyX3QJc19kZWZhdWx0X21vdW50X29wdHM7CisJdWludDMyX3QJc19maXJzdF9tZXRhX2JnOwkvKiBGaXJzdCBtZXRhYmxvY2sgZ3JvdXAgKi8KKwl1aW50MzJfdAlzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwl1aW50MzJfdAlzX2pubF9ibG9ja3NbMTddOwkvKiBCYWNrdXAgb2YgdGhlIGpvdXJuYWwgaW5vZGUgKi8KKwl1aW50MzJfdAlzX3Jlc2VydmVkWzE3Ml07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KK307CisKKy8qCisgKiBDb2RlcyBmb3Igb3BlcmF0aW5nIHN5c3RlbXMKKyAqLworI2RlZmluZSBFWFQyX09TX0xJTlVYCQkwCisjZGVmaW5lIEVYVDJfT1NfSFVSRAkJMQorI2RlZmluZSBFWFQyX09TX01BU0lYCQkyCisjZGVmaW5lIEVYVDJfT1NfRlJFRUJTRAkJMworI2RlZmluZSBFWFQyX09TX0xJVEVTCQk0CisKKy8qCisgKiBSZXZpc2lvbiBsZXZlbHMKKyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX1JFVgkwCS8qIFRoZSBnb29kIG9sZCAob3JpZ2luYWwpIGZvcm1hdCAqLworI2RlZmluZSBFWFQyX0RZTkFNSUNfUkVWCTEJLyogVjIgZm9ybWF0IHcvIGR5bmFtaWMgaW5vZGUgc2l6ZXMgKi8KKworI2RlZmluZSBFWFQyX0NVUlJFTlRfUkVWCUVYVDJfR09PRF9PTERfUkVWCisjZGVmaW5lIEVYVDJfTUFYX1NVUFBfUkVWCUVYVDJfRFlOQU1JQ19SRVYKKworI2RlZmluZSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgMTI4CisKKy8qCisgKiBKb3VybmFsIGlub2RlIGJhY2t1cCB0eXBlcworICovCisjZGVmaW5lIEVYVDNfSk5MX0JBQ0tVUF9CTE9DS1MJMQorCisvKgorICogRmVhdHVyZSBzZXQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZmVhdHVyZV9jb21wYXQgJiAobWFzaykgKQorI2RlZmluZSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiAobWFzaykgKQorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0lNQUdJQ19JTk9ERVMJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwNAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUJMHgwMDEwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYCQkweDAwMjAKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFCTB4MDAwMgorLyogI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUgkweDAwMDQgbm90IHVzZWQgKi8KKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT04JMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRQkJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSCQkweDAwMDQgLyogTmVlZHMgcmVjb3ZlcnkgKi8KKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWCTB4MDAwOCAvKiBKb3VybmFsIGRldmljZSAqLworI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRwkJMHgwMDEwCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTCQkweDAwNDAKKworCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfU1VQUAkwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisKKy8qCisgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdXNlciBhbmQvb3IgZ3JvdXAgdXNpbmcgcmVzZXJ2ZWQgYmxvY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ERUZfUkVTVUlECQkwCisjZGVmaW5lIEVYVDJfREVGX1JFU0dJRAkJMAorCisvKgorICogRGVmYXVsdCBtb3VudCBvcHRpb25zCisgKi8KKyNkZWZpbmUgRVhUMl9ERUZNX0RFQlVHCQkweDAwMDEKKyNkZWZpbmUgRVhUMl9ERUZNX0JTREdST1VQUwkweDAwMDIKKyNkZWZpbmUgRVhUMl9ERUZNX1hBVFRSX1VTRVIJMHgwMDA0CisjZGVmaW5lIEVYVDJfREVGTV9BQ0wJCTB4MDAwOAorI2RlZmluZSBFWFQyX0RFRk1fVUlEMTYJCTB4MDAxMAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREUJCTB4MDA2MAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfREFUQQkweDAwMjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX09SREVSRUQJMHgwMDQwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9XQkFDSwkweDAwNjAKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQorICovCisjZGVmaW5lIEVYVDJfTkFNRV9MRU4gMjU1CisKK3N0cnVjdCBleHQyX2Rpcl9lbnRyeSB7CisJdWludDMyX3QJaW5vZGU7CQkJLyogSW5vZGUgbnVtYmVyICovCisJdWludDE2X3QJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwl1aW50MTZfdAluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJY2hhcgkJbmFtZVtFWFQyX05BTUVfTEVOXTsJLyogRmlsZSBuYW1lICovCit9OworCisvKgorICogVGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkuICBTaW5jZSBFWFQyIHN0cnVjdHVyZXMgYXJlCisgKiBzdG9yZWQgaW4gaW50ZWwgYnl0ZSBvcmRlciwgYW5kIHRoZSBuYW1lX2xlbiBmaWVsZCBjb3VsZCBuZXZlciBiZQorICogYmlnZ2VyIHRoYW4gMjU1IGNoYXJzLCBpdCdzIHNhZmUgdG8gcmVjbGFpbSB0aGUgZXh0cmEgYnl0ZSBmb3IgdGhlCisgKiBmaWxlX3R5cGUgZmllbGQuCisgKi8KK3N0cnVjdCBleHQyX2Rpcl9lbnRyeV8yIHsKKwl1aW50MzJfdAlpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwl1aW50MTZfdAlyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCXVpbnQ4X3QJCW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwl1aW50OF90CQlmaWxlX3R5cGU7CisJY2hhcgkJbmFtZVtFWFQyX05BTUVfTEVOXTsJLyogRmlsZSBuYW1lICovCit9OworCisvKgorICogRXh0MiBkaXJlY3RvcnkgZmlsZSB0eXBlcy4gIE9ubHkgdGhlIGxvdyAzIGJpdHMgYXJlIHVzZWQuICBUaGUKKyAqIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBub3cuCisgKi8KKyNkZWZpbmUgRVhUMl9GVF9VTktOT1dOCQkwCisjZGVmaW5lIEVYVDJfRlRfUkVHX0ZJTEUJMQorI2RlZmluZSBFWFQyX0ZUX0RJUgkJMgorI2RlZmluZSBFWFQyX0ZUX0NIUkRFVgkJMworI2RlZmluZSBFWFQyX0ZUX0JMS0RFVgkJNAorI2RlZmluZSBFWFQyX0ZUX0ZJRk8JCTUKKyNkZWZpbmUgRVhUMl9GVF9TT0NLCQk2CisjZGVmaW5lIEVYVDJfRlRfU1lNTElOSwkJNworCisjZGVmaW5lIEVYVDJfRlRfTUFYCQk4CisKKy8qCisgKiBFWFQyX0RJUl9QQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJpZXMgYm91bmRhcmllcworICoKKyAqIE5PVEU6IEl0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0CisgKi8KKyNkZWZpbmUgRVhUMl9ESVJfUEFECQkJNAorI2RlZmluZSBFWFQyX0RJUl9ST1VORAkJCShFWFQyX0RJUl9QQUQgLSAxKQorI2RlZmluZSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVfbGVuKQkoKChuYW1lX2xlbikgKyA4ICsgRVhUMl9ESVJfUk9VTkQpICYgXAorCQkJCQkgfkVYVDJfRElSX1JPVU5EKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9lMmZzX2xpYi5jIGIvZTJmc3Byb2dzL2UyZnNfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhZWM5NAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9lMmZzX2xpYi5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTZWUgUkVBRE1FIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJlMmZzX2xpYi5oIgorCisjZGVmaW5lIEhBVkVfRVhUMl9JT0NUTFMgMQorCisjaWYgSU5UX01BWCA9PSBMT05HX01BWAorI2RlZmluZSBJRl9MT05HX0lTX1NBTUUoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBJRl9MT05HX0lTX1dJREVSKC4uLikKKyNlbHNlCisjZGVmaW5lIElGX0xPTkdfSVNfU0FNRSguLi4pCisjZGVmaW5lIElGX0xPTkdfSVNfV0lERVIoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNsb3NlX3NpbGVudGx5KGludCBmZCkKK3sKKwlpbnQgZSA9IGVycm5vOworCWNsb3NlKGZkKTsKKwllcnJubyA9IGU7Cit9CisKKworLyogSXRlcmF0ZSBhIGZ1bmN0aW9uIG9uIGVhY2ggZW50cnkgb2YgYSBkaXJlY3RvcnkgKi8KK2ludCBpdGVyYXRlX29uX2Rpcihjb25zdCBjaGFyICpkaXJfbmFtZSwKKwkJaW50IEZBU1RfRlVOQyAoKmZ1bmMpKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpcmVudCAqLCB2b2lkICopLAorCQl2b2lkICpwcml2YXRlKQoreworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJZGlyID0gb3BlbmRpcihkaXJfbmFtZSk7CisJaWYgKGRpciA9PSBOVUxMKSB7CisJCXJldHVybiAtMTsKKwl9CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlmdW5jKGRpcl9uYW1lLCBkZSwgcHJpdmF0ZSk7CisJfQorCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIDA7Cit9CisKKworLyogR2V0L3NldCBhIGZpbGUgdmVyc2lvbiBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCitpbnQgZmdldHNldHZlcnNpb24oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqZ2V0X3ZlcnNpb24sIHVuc2lnbmVkIGxvbmcgc2V0X3ZlcnNpb24pCit7CisjaWYgSEFWRV9FWFQyX0lPQ1RMUworCWludCBmZCwgcjsKKwlJRl9MT05HX0lTX1dJREVSKGludCB2ZXI7KQorCisJZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZIHwgT19OT05CTE9DSyk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKCFnZXRfdmVyc2lvbikgeworCQlJRl9MT05HX0lTX1dJREVSKAorCQkJdmVyID0gKGludCkgc2V0X3ZlcnNpb247CisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX1NFVFZFUlNJT04sICZ2ZXIpOworCQkpCisJCUlGX0xPTkdfSVNfU0FNRSgKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfU0VUVkVSU0lPTiwgKHZvaWQqKSZzZXRfdmVyc2lvbik7CisJCSkKKwl9IGVsc2UgeworCQlJRl9MT05HX0lTX1dJREVSKAorCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19HRVRWRVJTSU9OLCAmdmVyKTsKKwkJCSpnZXRfdmVyc2lvbiA9IHZlcjsKKwkJKQorCQlJRl9MT05HX0lTX1NBTUUoCisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX0dFVFZFUlNJT04sICh2b2lkKilnZXRfdmVyc2lvbik7CisJCSkKKwl9CisJY2xvc2Vfc2lsZW50bHkoZmQpOworCXJldHVybiByOworI2Vsc2UgLyogISBIQVZFX0VYVDJfSU9DVExTICovCisJZXJybm8gPSBFT1BOT1RTVVBQOworCXJldHVybiAtMTsKKyNlbmRpZiAvKiAhIEhBVkVfRVhUMl9JT0NUTFMgKi8KK30KKworCisvKiBHZXQvc2V0IGEgZmlsZSBmbGFncyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCitpbnQgZmdldHNldGZsYWdzKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKmdldF9mbGFncywgdW5zaWduZWQgbG9uZyBzZXRfZmxhZ3MpCit7CisjaWYgSEFWRV9FWFQyX0lPQ1RMUworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlpbnQgZmQsIHI7CisJSUZfTE9OR19JU19XSURFUihpbnQgZjspCisKKwlpZiAoc3RhdChuYW1lLCAmYnVmKSA9PSAwIC8qIHN0YXQgaXMgb2sgKi8KKwkgJiYgIVNfSVNSRUcoYnVmLnN0X21vZGUpICYmICFTX0lTRElSKGJ1Zi5zdF9tb2RlKQorCSkgeworCQlnb3RvIG5vdHN1cHA7CisJfQorCWZkID0gb3BlbihuYW1lLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOyAvKiBuZWl0aGVyIHJlYWQgbm9yIHdyaXRlIGFza2VkIGZvciAqLworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFnZXRfZmxhZ3MpIHsKKwkJSUZfTE9OR19JU19XSURFUigKKwkJCWYgPSAoaW50KSBzZXRfZmxhZ3M7CisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX1NFVEZMQUdTLCAmZik7CisJCSkKKwkJSUZfTE9OR19JU19TQU1FKAorCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19TRVRGTEFHUywgKHZvaWQqKSZzZXRfZmxhZ3MpOworCQkpCisJfSBlbHNlIHsKKwkJSUZfTE9OR19JU19XSURFUigKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfR0VURkxBR1MsICZmKTsKKwkJCSpnZXRfZmxhZ3MgPSBmOworCQkpCisJCUlGX0xPTkdfSVNfU0FNRSgKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfR0VURkxBR1MsICh2b2lkKilnZXRfZmxhZ3MpOworCQkpCisJfQorCisJY2xvc2Vfc2lsZW50bHkoZmQpOworCXJldHVybiByOworIG5vdHN1cHA6CisjZW5kaWYgLyogSEFWRV9FWFQyX0lPQ1RMUyAqLworCWVycm5vID0gRU9QTk9UU1VQUDsKKwlyZXR1cm4gLTE7Cit9CisKKworLyogUHJpbnQgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KK2NvbnN0IHVpbnQzMl90IGUyYXR0cl9mbGFnc192YWx1ZVtdID0geworI2lmZGVmIEVOQUJMRV9DT01QUkVTU0lPTgorCUVYVDJfQ09NUFJCTEtfRkwsCisJRVhUMl9ESVJUWV9GTCwKKwlFWFQyX05PQ09NUFJfRkwsCisJRVhUMl9FQ09NUFJfRkwsCisjZW5kaWYKKwlFWFQyX0lOREVYX0ZMLAorCUVYVDJfU0VDUk1fRkwsCisJRVhUMl9VTlJNX0ZMLAorCUVYVDJfU1lOQ19GTCwKKwlFWFQyX0RJUlNZTkNfRkwsCisJRVhUMl9JTU1VVEFCTEVfRkwsCisJRVhUMl9BUFBFTkRfRkwsCisJRVhUMl9OT0RVTVBfRkwsCisJRVhUMl9OT0FUSU1FX0ZMLAorCUVYVDJfQ09NUFJfRkwsCisJRVhUM19KT1VSTkFMX0RBVEFfRkwsCisJRVhUMl9OT1RBSUxfRkwsCisJRVhUMl9UT1BESVJfRkwKK307CisKK2NvbnN0IGNoYXIgZTJhdHRyX2ZsYWdzX3NuYW1lW10gPQorI2lmZGVmIEVOQUJMRV9DT01QUkVTU0lPTgorCSJCWlhFIgorI2VuZGlmCisJIkkiCisJInN1U0RpYWRBY2p0VCI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGUyYXR0cl9mbGFnc19sbmFtZVtdID0KKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKwkiQ29tcHJlc3NlZF9GaWxlIiAiXDAiCisJIkNvbXByZXNzZWRfRGlydHlfRmlsZSIgIlwwIgorCSJDb21wcmVzc2lvbl9SYXdfQWNjZXNzIiAiXDAiCisJIkNvbXByZXNzaW9uX0Vycm9yIiAiXDAiCisjZW5kaWYKKwkiSW5kZXhlZF9kaXJlY3RvcnkiICJcMCIKKwkiU2VjdXJlX0RlbGV0aW9uIiAiXDAiCisJIlVuZGVsZXRlIiAiXDAiCisJIlN5bmNocm9ub3VzX1VwZGF0ZXMiICJcMCIKKwkiU3luY2hyb25vdXNfRGlyZWN0b3J5X1VwZGF0ZXMiICJcMCIKKwkiSW1tdXRhYmxlIiAiXDAiCisJIkFwcGVuZF9Pbmx5IiAiXDAiCisJIk5vX0R1bXAiICJcMCIKKwkiTm9fQXRpbWUiICJcMCIKKwkiQ29tcHJlc3Npb25fUmVxdWVzdGVkIiAiXDAiCisJIkpvdXJuYWxlZF9EYXRhIiAiXDAiCisJIk5vX1RhaWxtZXJnaW5nIiAiXDAiCisJIlRvcF9vZl9EaXJlY3RvcnlfSGllcmFyY2hpZXMiICJcMCIKKwkvKiBBbm90aGVyIHRyYWlsaW5nIE5VTCBpcyBhZGRlZCBieSBjb21waWxlciAqLzsKKwordm9pZCBwcmludF9lMmZsYWdzKEZJTEUgKmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIG9wdGlvbnMpCit7CisJY29uc3QgdWludDMyX3QgKmZ2OworCWNvbnN0IGNoYXIgKmZuOworCisJZnYgPSBlMmF0dHJfZmxhZ3NfdmFsdWU7CisJaWYgKG9wdGlvbnMgJiBQRk9QVF9MT05HKSB7CisJCWludCBmaXJzdCA9IDE7CisJCWZuID0gZTJhdHRyX2ZsYWdzX2xuYW1lOworCQlkbyB7CisJCQlpZiAoZmxhZ3MgJiAqZnYpIHsKKwkJCQlpZiAoIWZpcnN0KQorCQkJCQlmcHV0cygiLCAiLCBmKTsKKwkJCQlmcHV0cyhmbiwgZik7CisJCQkJZmlyc3QgPSAwOworCQkJfQorCQkJZnYrKzsKKwkJCWZuICs9IHN0cmxlbihmbikgKyAxOworCQl9IHdoaWxlICgqZm4pOworCQlpZiAoZmlyc3QpCisJCQlmcHV0cygiLS0tIiwgZik7CisJfSBlbHNlIHsKKwkJZm4gPSBlMmF0dHJfZmxhZ3Nfc25hbWU7CisJCWRvICB7CisJCQljaGFyIGMgPSAnLSc7CisJCQlpZiAoZmxhZ3MgJiAqZnYpCisJCQkJYyA9ICpmbjsKKwkJCWZwdXRjKGMsIGYpOworCQkJZnYrKzsKKwkJCWZuKys7CisJCX0gd2hpbGUgKCpmbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL2UyZnNfbGliLmggYi9lMmZzcHJvZ3MvZTJmc19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTA1ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL2UyZnNfbGliLmgKQEAgLTAsMCArMSw0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2VlIFJFQURNRSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyogQ29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzICovCisjaW5jbHVkZSAiZTJmc19kZWZzLmgiCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBJdGVyYXRlIGEgZnVuY3Rpb24gb24gZWFjaCBlbnRyeSBvZiBhIGRpcmVjdG9yeSAqLworaW50IGl0ZXJhdGVfb25fZGlyKGNvbnN0IGNoYXIgKmRpcl9uYW1lLAorCQlpbnQgRkFTVF9GVU5DICgqZnVuYykoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGlyZW50ICosIHZvaWQgKiksCisJCXZvaWQgKnByaXZhdGUpOworCisvKiBHZXQvc2V0IGEgZmlsZSB2ZXJzaW9uIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KK2ludCBmZ2V0c2V0dmVyc2lvbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpnZXRfdmVyc2lvbiwgdW5zaWduZWQgbG9uZyBzZXRfdmVyc2lvbik7CisjZGVmaW5lIGZnZXR2ZXJzaW9uKG5hbWUsIHZlcnNpb24pIGZnZXRzZXR2ZXJzaW9uKG5hbWUsIHZlcnNpb24sIDApCisjZGVmaW5lIGZzZXR2ZXJzaW9uKG5hbWUsIHZlcnNpb24pIGZnZXRzZXR2ZXJzaW9uKG5hbWUsIE5VTEwsIHZlcnNpb24pCisKKy8qIEdldC9zZXQgYSBmaWxlIGZsYWdzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KK2ludCBmZ2V0c2V0ZmxhZ3MoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqZ2V0X2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNldF9mbGFncyk7CisjZGVmaW5lIGZnZXRmbGFncyhuYW1lLCBmbGFncykgZmdldHNldGZsYWdzKG5hbWUsIGZsYWdzLCAwKQorI2RlZmluZSBmc2V0ZmxhZ3MobmFtZSwgZmxhZ3MpIGZnZXRzZXRmbGFncyhuYW1lLCBOVUxMLCBmbGFncykKKworLyogTXVzdCBiZSAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYGludCBsb25nX2Zvcm1hdCcuICovCisjZGVmaW5lIFBGT1BUX0xPTkcgIDEKKy8qIFByaW50IGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCit2b2lkIHByaW50X2UyZmxhZ3MoRklMRSAqZiwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgb3B0aW9ucyk7CisKK2V4dGVybiBjb25zdCB1aW50MzJfdCBlMmF0dHJfZmxhZ3NfdmFsdWVbXTsKK2V4dGVybiBjb25zdCBjaGFyIGUyYXR0cl9mbGFnc19zbmFtZVtdOworCisvKiBJZiB5b3UgcGxhbiB0byBFTkFCTEVfQ09NUFJFU1NJT04sIHNlZSBlMmZzX2xpYi5jIGFuZCBjaGF0dHIuYyAtICovCisvKiBtYWtlIHN1cmUgdGhhdCBjaGF0dHIgZG9lc24ndCBhY2NlcHQgYmFkIG9wdGlvbnMhICovCisjaWZkZWYgRU5BQkxFX0NPTVBSRVNTSU9OCisjZGVmaW5lIGUyYXR0cl9mbGFnc192YWx1ZV9jaGF0dHIgKCZlMmF0dHJfZmxhZ3NfdmFsdWVbNV0pCisjZGVmaW5lIGUyYXR0cl9mbGFnc19zbmFtZV9jaGF0dHIgKCZlMmF0dHJfZmxhZ3Nfc25hbWVbNV0pCisjZWxzZQorI2RlZmluZSBlMmF0dHJfZmxhZ3NfdmFsdWVfY2hhdHRyICgmZTJhdHRyX2ZsYWdzX3ZhbHVlWzFdKQorI2RlZmluZSBlMmF0dHJfZmxhZ3Nfc25hbWVfY2hhdHRyICgmZTJhdHRyX2ZsYWdzX3NuYW1lWzFdKQorI2VuZGlmCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MvZnNjay5jIGIvZTJmc3Byb2dzL2ZzY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjJmNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL2ZzY2suYwpAQCAtMCwwICsxLDEwOTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZzY2sgLS0tIEEgZ2VuZXJpYywgcGFyYWxsZWxpemluZyBmcm9udC1lbmQgZm9yIHRoZSBmc2NrIHByb2dyYW0uCisgKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIHJ1biBmc2NrIHByb2dyYW1zIGluIHBhcmFsbGVsIGlmIHRoZQorICogZGV2aWNlcyBhcmUgb24gc2VwYXJhdGUgc3BpbmRsZXMuICBJdCBpcyBiYXNlZCBvbiB0aGUgc2FtZSBpZGVhcyBhcworICogdGhlIGdlbmVyaWMgZnJvbnQgZW5kIGZvciBmc2NrIGJ5IERhdmlkIEVuZ2VsIGFuZCBGcmVkIHZhbiBLZW1wZW4sCisgKiBidXQgaXQgaGFzIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIHRvIHN1cHBvcnQKKyAqIHBhcmFsbGVsIGV4ZWN1dGlvbi4KKyAqCisgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDx0eXRzb0BtaXQuZWR1PgorICoKKyAqIE1pcXVlbCB2YW4gU21vb3JlbmJ1cmcgKG1pcXVlbHNAZHJpbmtlbC5vdy5vcmcpIDIwLU9jdC0xOTk0OgorICogICBvIENoYW5nZWQgLXQgZnN0eXBlIHRvIGJlaGF2ZSBsaWtlIHdpdGggbW91bnQgd2hlbiAtQSAoYWxsIGZpbGUKKyAqICAgICBzeXN0ZW1zKSBvciAtTSAobGlrZSBtb3VudCkgaXMgc3BlY2lmaWVkLgorICogICBvIGZzY2sgbG9va3MgaWYgaXQgY2FuIGZpbmQgdGhlIGZzY2sudHlwZSBwcm9ncmFtIHRvIGRlY2lkZQorICogICAgIGlmIGl0IHNob3VsZCBpZ25vcmUgdGhlIGZzIHR5cGUuIFRoaXMgd2F5IG1vcmUgZnNjayBwcm9ncmFtcworICogICAgIGNhbiBiZSBhZGRlZCB3aXRob3V0IGNoYW5naW5nIHRoaXMgZnJvbnQtZW5kLgorICogICBvIC1SIGZsYWcgc2tpcCByb290IGZpbGUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKKyAqICAgICAgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBieSAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEFsbCBmaWxlc3lzdGVtIHNwZWNpZmljIGhvb2tzIGhhdmUgYmVlbiByZW1vdmVkLgorICogSWYgZmlsZXN5c3RlbSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgd2Ugd2lsbCBleGVjdXRlCisgKiAiZnNjay5hdXRvIi4gQ3VycmVudGx5IHRoaXMgYWxzbyBoYXBwZW5zIGlmIHlvdSBzcGVjaWZ5CisgKiBVVUlEPXh4eCBvciBMQUJFTD14eHggYXMgYW4gb2JqZWN0IHRvIGNoZWNrLgorICogRGV0ZWN0aW9uIGNvZGUgZm9yIHRoYXQgaXMgYWxzbyBwcm9iYWJseSBoYXMgdG8gYmUgaW4gZnNjay5hdXRvLgorICoKKyAqIEluIG90aGVyIHdvcmRzLCB0aGlzIGlzIF9yZWFsbHlfIGlzIGp1c3QgYSBkcml2ZXIgcHJvZ3JhbSB3aGljaAorICogc3Bhd25zIGFjdHVhbCBmc2NrLnNvbWV0aGluZyBmb3IgZWFjaCBmaWxlc3lzdGVtIHRvIGNoZWNrLgorICogSXQgZG9lc24ndCBndWVzcyBmaWxlc3lzdGVtIHR5cGVzIGZyb20gb24tZGlzayBmb3JtYXQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZzY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstQU5QUlRWXSBbLUMgRkRdIFstdCBGU1RZUEVdIFtGU19PUFRTXSBbQkxPQ0tERVZdLi4uIgorLy91c2FnZTojZGVmaW5lIGZzY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGVjayBhbmQgcmVwYWlyIGZpbGVzeXN0ZW1zXG4iCisvL3VzYWdlOiAgICAgIlxuCS1BCVdhbGsgL2V0Yy9mc3RhYiBhbmQgY2hlY2sgYWxsIGZpbGVzeXN0ZW1zIgorLy91c2FnZTogICAgICJcbgktTglEb24ndCBleGVjdXRlLCBqdXN0IHNob3cgd2hhdCB3b3VsZCBiZSBkb25lIgorLy91c2FnZTogICAgICJcbgktUAlXaXRoIC1BLCBjaGVjayBmaWxlc3lzdGVtcyBpbiBwYXJhbGxlbCIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJV2l0aCAtQSwgc2tpcCB0aGUgcm9vdCBmaWxlc3lzdGVtIgorLy91c2FnZTogICAgICJcbgktVAlEb24ndCBzaG93IHRpdGxlIG9uIHN0YXJ0dXAiCisvL3VzYWdlOiAgICAgIlxuCS1WCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1DIG4JV3JpdGUgc3RhdHVzIGluZm9ybWF0aW9uIHRvIHNwZWNpZmllZCBmaWxlZGVzY3JpcHRvciIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgVFlQRQlMaXN0IG9mIGZpbGVzeXN0ZW0gdHlwZXMgdG8gY2hlY2siCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiAicHJvZ3Jlc3MgaW5kaWNhdG9yIiBjb2RlIGlzIHNvbWV3aGF0IGJ1Z2d5IGFuZCBleHRbMjNdIHNwZWNpZmljLgorICogV2Ugc2hvdWxkIGJlIGZpbGVzeXN0ZW0gYWdub3N0aWMuIElPVzogdGhlcmUgc2hvdWxkIGJlIGEgd2VsbC1kZWZpbmVkCisgKiBBUEkgZm9yIGZzY2suc29tZXRoaW5nLCBOT1QgYWQtaG9jIGhhY2tzIGluIGdlbmVyaWMgZnNjay4gKi8KKyNkZWZpbmUgRE9fUFJPR1JFU1NfSU5ESUNBVE9SIDAKKworLyogZnNjayAxLjQxLjQgKDI3LUphbi0yMDA5KSBtYW5wYWdlIHNheXM6CisgKiAwICAgLSBObyBlcnJvcnMKKyAqIDEgICAtIEZpbGUgc3lzdGVtIGVycm9ycyBjb3JyZWN0ZWQKKyAqIDIgICAtIFN5c3RlbSBzaG91bGQgYmUgcmVib290ZWQKKyAqIDQgICAtIEZpbGUgc3lzdGVtIGVycm9ycyBsZWZ0IHVuY29ycmVjdGVkCisgKiA4ICAgLSBPcGVyYXRpb25hbCBlcnJvcgorICogMTYgIC0gVXNhZ2Ugb3Igc3ludGF4IGVycm9yCisgKiAzMiAgLSBGc2NrIGNhbmNlbGVkIGJ5IHVzZXIgcmVxdWVzdAorICogMTI4IC0gU2hhcmVkIGxpYnJhcnkgZXJyb3IKKyAqLworI2RlZmluZSBFWElUX09LICAgICAgICAgIDAKKyNkZWZpbmUgRVhJVF9OT05ERVNUUlVDVCAxCisjZGVmaW5lIEVYSVRfREVTVFJVQ1QgICAgMgorI2RlZmluZSBFWElUX1VOQ09SUkVDVEVEIDQKKyNkZWZpbmUgRVhJVF9FUlJPUiAgICAgICA4CisjZGVmaW5lIEVYSVRfVVNBR0UgICAgICAgMTYKKyNkZWZpbmUgRlNDS19DQU5DRUxFRCAgICAzMiAgICAgLyogQWJvcnRlZCB3aXRoIGEgc2lnbmFsIG9yIF5DICovCisKKy8qCisgKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIG1vdW50IHRhYmxlIGVudHJpZXMuCisgKi8KK3N0cnVjdCBmc19pbmZvIHsKKwlzdHJ1Y3QgZnNfaW5mbyAqbmV4dDsKKwljaGFyCSpkZXZpY2U7CisJY2hhcgkqbW91bnRwdDsKKwljaGFyCSp0eXBlOworCWNoYXIJKm9wdHM7CisJaW50CXBhc3NubzsKKwlpbnQJZmxhZ3M7Cit9OworCisjZGVmaW5lIEZMQUdfRE9ORSAxCisjZGVmaW5lIEZMQUdfUFJPR1JFU1MgMgorLyoKKyAqIFN0cnVjdHVyZSB0byBhbGxvdyBleGl0IGNvZGVzIHRvIGJlIHN0b3JlZAorICovCitzdHJ1Y3QgZnNja19pbnN0YW5jZSB7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKm5leHQ7CisJaW50CXBpZDsKKwlpbnQJZmxhZ3M7CisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCisJdGltZV90CXN0YXJ0X3RpbWU7CisjZW5kaWYKKwljaGFyCSpwcm9nOworCWNoYXIJKmRldmljZTsKKwljaGFyCSpiYXNlX2RldmljZTsgLyogL2Rldi9oZGEgZm9yIC9kZXYvaGRhTiBldGMgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGlnbm9yZWRfdHlwZXNbXSBBTElHTjEgPQorCSJpZ25vcmVcMCIKKwkiaXNvOTY2MFwwIgorCSJuZnNcMCIKKwkicHJvY1wwIgorCSJzd1wwIgorCSJzd2FwXDAiCisJInRtcGZzXDAiCisJImRldnB0c1wwIjsKKworI2lmIDAKK3N0YXRpYyBjb25zdCBjaGFyIHJlYWxseV93YW50ZWRbXSBBTElHTjEgPQorCSJtaW5peFwwIgorCSJleHQyXDAiCisJImV4dDNcMCIKKwkiamZzXDAiCisJInJlaXNlcmZzXDAiCisJInhpYWZzXDAiCisJInhmc1wwIjsKKyNlbmRpZgorCisjZGVmaW5lIEJBU0VfTUQgIi9kZXYvbWQiCisKK3N0YXRpYyBjaGFyICoqYXJnczsKK3N0YXRpYyBpbnQgbnVtX2FyZ3M7CitzdGF0aWMgaW50IHZlcmJvc2U7CisKKyNkZWZpbmUgRlNfVFlQRV9GTEFHX05PUk1BTCAwCisjZGVmaW5lIEZTX1RZUEVfRkxBR19PUFQgICAgMQorI2RlZmluZSBGU19UWVBFX0ZMQUdfTkVHT1BUIDIKK3N0YXRpYyBjaGFyICoqZnNfdHlwZV9saXN0Oworc3RhdGljIHVpbnQ4X3QgKmZzX3R5cGVfZmxhZzsKK3N0YXRpYyBzbWFsbGludCBmc190eXBlX25lZ2F0ZWQ7CisKK3N0YXRpYyBzbWFsbGludCBub2V4ZWN1dGU7CitzdGF0aWMgc21hbGxpbnQgc2VyaWFsaXplOworc3RhdGljIHNtYWxsaW50IHNraXBfcm9vdDsKKy8qIHN0YXRpYyBzbWFsbGludCBsaWtlX21vdW50OyAqLworc3RhdGljIHNtYWxsaW50IHBhcmFsbGVsX3Jvb3Q7CitzdGF0aWMgc21hbGxpbnQgZm9yY2VfYWxsX3BhcmFsbGVsOworCisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCitzdGF0aWMgc21hbGxpbnQgcHJvZ3Jlc3M7CitzdGF0aWMgaW50IHByb2dyZXNzX2ZkOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbnVtX3J1bm5pbmc7CitzdGF0aWMgaW50IG1heF9ydW5uaW5nOworc3RhdGljIGNoYXIgKmZzdHlwZTsKK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyAqZmlsZXN5c19pbmZvOworc3RhdGljIHN0cnVjdCBmc19pbmZvICpmaWxlc3lzX2xhc3Q7CitzdGF0aWMgc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3RhbmNlX2xpc3Q7CisKKy8qCisgKiBSZXR1cm4gdGhlICJiYXNlIGRldmljZSIgZ2l2ZW4gYSBwYXJ0aWN1bGFyIGRldmljZTsgdGhpcyBpcyB1c2VkIHRvCisgKiBhc3N1cmUgdGhhdCB3ZSBvbmx5IGZzY2sgb25lIHBhcnRpdGlvbiBvbiBhIHBhcnRpY3VsYXIgZHJpdmUgYXQgYW55CisgKiBvbmUgdGltZS4gIE90aGVyd2lzZSwgdGhlIGRpc2sgaGVhZHMgd2lsbCBiZSBzZWVraW5nIGFsbCBvdmVyIHRoZQorICogcGxhY2UuICBJZiB0aGUgYmFzZSBkZXZpY2UgY2Fubm90IGJlIGRldGVybWluZWQsIHJldHVybiBOVUxMLgorICoKKyAqIFRoZSBiYXNlX2RldmljZSgpIGZ1bmN0aW9uIHJldHVybnMgYW4gYWxsb2NhdGVkIHN0cmluZyB3aGljaCBtdXN0CisgKiBiZSBmcmVlZC4KKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0RFVkZTCisvKgorICogUmVxdWlyZWQgZm9yIHRoZSB1YmVyLXNpbGx5IGRldmZzIC9kZXYvaWRlL2hvc3QxL2J1czIvdGFyZ2V0My9sdW4zCisgKiBwYXRoYW1lcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRldmZzX2hpZXJbXSA9IHsKKwkiaG9zdCIsICJidXMiLCAidGFyZ2V0IiwgImx1biIsIE5VTEwKK307CisjZW5kaWYKKworc3RhdGljIGNoYXIgKmJhc2VfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwljaGFyICpzdHIsICpjcDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERVZGUworCWNvbnN0IGNoYXIgKmNvbnN0ICpoaWVyOworCWNvbnN0IGNoYXIgKmRpc2s7CisJaW50IGxlbjsKKyNlbmRpZgorCXN0ciA9IHhzdHJkdXAoZGV2aWNlKTsKKworCS8qIFNraXAgb3ZlciAiL2Rldi8iOyBpZiBpdCdzIG5vdCBwcmVzZW50LCBnaXZlIHVwICovCisJY3AgPSBza2lwX2Rldl9wZngoc3RyKTsKKwlpZiAoY3AgPT0gc3RyKQorCQlnb3RvIGVycm91dDsKKworCS8qCisJICogRm9yIG1kIGRldmljZXMsIHdlIHRyZWF0IHRoZW0gYWxsIGFzIGlmIHRoZXkgd2VyZSBhbGwKKwkgKiBvbiBvbmUgZGlzaywgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gcGFyYWxsZWxpemUgdGhlbS4KKwkgKi8KKwlpZiAoY3BbMF0gPT0gJ20nICYmIGNwWzFdID09ICdkJykgeworCQljcFsyXSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogSGFuZGxlIERBQyA5NjAgZGV2aWNlcyAqLworCWlmIChzdHJuY21wKGNwLCAicmQvIiwgMykgPT0gMCkgeworCQljcCArPSAzOworCQlpZiAoY3BbMF0gIT0gJ2MnIHx8ICFpc2RpZ2l0KGNwWzFdKQorCQkgfHwgY3BbMl0gIT0gJ2QnIHx8ICFpc2RpZ2l0KGNwWzNdKSkKKwkJCWdvdG8gZXJyb3V0OworCQljcFs0XSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogTm93IGxldCdzIGhhbmRsZSAvZGV2L2hkKiBhbmQgL2Rldi9zZCogZGV2aWNlcy4uLi4gKi8KKwlpZiAoKGNwWzBdID09ICdoJyB8fCBjcFswXSA9PSAncycpICYmIGNwWzFdID09ICdkJykgeworCQljcCArPSAyOworCQkvKiBJZiB0aGVyZSdzIGEgc2luZ2xlIG51bWJlciBhZnRlciAvZGV2L2hkLCBza2lwIGl0ICovCisJCWlmIChpc2RpZ2l0KCpjcCkpCisJCQljcCsrOworCQkvKiBXaGF0IGZvbGxvd3MgbXVzdCBiZSBhbiBhbHBoYSBjaGFyLCBvciBnaXZlIHVwICovCisJCWlmICghaXNhbHBoYSgqY3ApKQorCQkJZ290byBlcnJvdXQ7CisJCWNwWzFdID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERVZGUworCS8qIE5vdyBsZXQncyBoYW5kbGUgZGV2ZnMgKHVnaCkgbmFtZXMgKi8KKwlsZW4gPSAwOworCWlmIChzdHJuY21wKGNwLCAiaWRlLyIsIDQpID09IDApCisJCWxlbiA9IDQ7CisJaWYgKHN0cm5jbXAoY3AsICJzY3NpLyIsIDUpID09IDApCisJCWxlbiA9IDU7CisJaWYgKGxlbikgeworCQljcCArPSBsZW47CisJCS8qCisJCSAqIE5vdyB3ZSBwcm9jZWVkIGRvd24gdGhlIGV4cGVjdGVkIGRldmZzIGhpZXJhcmNoeS4KKwkJICogaS5lLiwgLi4uL2hvc3QxL2J1czIvdGFyZ2V0My9sdW40Ly4uLgorCQkgKiBJZiB3ZSBkb24ndCBmaW5kIHRoZSBleHBlY3RlZCB0b2tlbiwgZm9sbG93ZWQgYnkKKwkJICogc29tZSBudW1iZXIgb2YgZGlnaXRzIGF0IGVhY2ggbGV2ZWwsIGFib3J0LgorCQkgKi8KKwkJZm9yIChoaWVyID0gZGV2ZnNfaGllcjsgKmhpZXI7IGhpZXIrKykgeworCQkJbGVuID0gc3RybGVuKCpoaWVyKTsKKwkJCWlmIChzdHJuY21wKGNwLCAqaGllciwgbGVuKSAhPSAwKQorCQkJCWdvdG8gZXJyb3V0OworCQkJY3AgKz0gbGVuOworCQkJd2hpbGUgKCpjcCAhPSAnLycgJiYgKmNwICE9IDApIHsKKwkJCQlpZiAoIWlzZGlnaXQoKmNwKSkKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJY3ArKzsKKwkJCX0KKwkJCWNwKys7CisJCX0KKwkJY3BbLTFdID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwkvKiBOb3cgaGFuZGxlIGRldmZzIC9kZXYvZGlzYyBvciAvZGV2L2Rpc2sgbmFtZXMgKi8KKwlkaXNrID0gMDsKKwlpZiAoc3RybmNtcChjcCwgImRpc2NzLyIsIDYpID09IDApCisJCWRpc2sgPSAiZGlzYyI7CisJZWxzZSBpZiAoc3RybmNtcChjcCwgImRpc2tzLyIsIDYpID09IDApCisJCWRpc2sgPSAiZGlzayI7CisJaWYgKGRpc2spIHsKKwkJY3AgKz0gNjsKKwkJaWYgKHN0cm5jbXAoY3AsIGRpc2ssIDQpICE9IDApCisJCQlnb3RvIGVycm91dDsKKwkJY3AgKz0gNDsKKwkJd2hpbGUgKCpjcCAhPSAnLycgJiYgKmNwICE9IDApIHsKKwkJCWlmICghaXNkaWdpdCgqY3ApKQorCQkJCWdvdG8gZXJyb3V0OworCQkJY3ArKzsKKwkJfQorCQkqY3AgPSAwOworCQlyZXR1cm4gc3RyOworCX0KKyNlbmRpZgorIGVycm91dDoKKwlmcmVlKHN0cik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaW5zdGFuY2Uoc3RydWN0IGZzY2tfaW5zdGFuY2UgKnApCit7CisJZnJlZShwLT5wcm9nKTsKKwlmcmVlKHAtPmRldmljZSk7CisJZnJlZShwLT5iYXNlX2RldmljZSk7CisJZnJlZShwKTsKK30KKworc3RhdGljIHN0cnVjdCBmc19pbmZvICpjcmVhdGVfZnNfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY29uc3QgY2hhciAqbW50cG50LAorCQkJCQljb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvcHRzLAorCQkJCQlpbnQgcGFzc25vKQoreworCXN0cnVjdCBmc19pbmZvICpmczsKKworCWZzID0geHphbGxvYyhzaXplb2YoKmZzKSk7CisJZnMtPmRldmljZSA9IHhzdHJkdXAoZGV2aWNlKTsKKwlmcy0+bW91bnRwdCA9IHhzdHJkdXAobW50cG50KTsKKwlpZiAoc3RyY2hyKHR5cGUsICcsJykpCisJCXR5cGUgPSAoY2hhciAqKSJhdXRvIjsKKwlmcy0+dHlwZSA9IHhzdHJkdXAodHlwZSk7CisJZnMtPm9wdHMgPSB4c3RyZHVwKG9wdHMgPyBvcHRzIDogIiIpOworCWZzLT5wYXNzbm8gPSBwYXNzbm8gPCAwID8gMSA6IHBhc3NubzsKKwkvKmZzLT5mbGFncyA9IDA7ICovCisJLypmcy0+bmV4dCA9IE5VTEw7ICovCisKKwlpZiAoIWZpbGVzeXNfaW5mbykKKwkJZmlsZXN5c19pbmZvID0gZnM7CisJZWxzZQorCQlmaWxlc3lzX2xhc3QtPm5leHQgPSBmczsKKwlmaWxlc3lzX2xhc3QgPSBmczsKKworCXJldHVybiBmczsKK30KKworLyogTG9hZCB0aGUgZmlsZXN5c3RlbSBkYXRhYmFzZSBmcm9tIC9ldGMvZnN0YWIgKi8KK3N0YXRpYyB2b2lkIGxvYWRfZnNfaW5mbyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpmc3RhYjsKKwlzdHJ1Y3QgbW50ZW50IG10ZTsKKworCWZzdGFiID0gc2V0bW50ZW50KGZpbGVuYW1lLCAiciIpOworCWlmICghZnN0YWIpIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVhZCAnJXMnIiwgZmlsZW5hbWUpOworCQlyZXR1cm47CisJfQorCisJLy8gTG9vcCB0aHJvdWdoIGVudHJpZXMKKwl3aGlsZSAoZ2V0bW50ZW50X3IoZnN0YWIsICZtdGUsIGJiX2NvbW1vbl9idWZzaXoxLCBDT01NT05fQlVGU0laRSkpIHsKKwkJLy9iYl9pbmZvX21zZygiQ1JFQVRFWyVzXVslc11bJXNdWyVzXVslZF0iLCBtdGUubW50X2ZzbmFtZSwgbXRlLm1udF9kaXIsCisJCS8vCW10ZS5tbnRfdHlwZSwgbXRlLm1udF9vcHRzLAorCQkvLwltdGUubW50X3Bhc3Nubyk7CisJCWNyZWF0ZV9mc19kZXZpY2UobXRlLm1udF9mc25hbWUsIG10ZS5tbnRfZGlyLAorCQkJbXRlLm1udF90eXBlLCBtdGUubW50X29wdHMsCisJCQltdGUubW50X3Bhc3Nubyk7CisJfQorCWVuZG1udGVudChmc3RhYik7Cit9CisKKy8qIExvb2t1cCBmaWxlc3lzIGluIC9ldGMvZnN0YWIgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBlbnRyeS4gKi8KK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyAqbG9va3VwKGNoYXIgKmZpbGVzeXMpCit7CisJc3RydWN0IGZzX2luZm8gKmZzOworCisJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChmaWxlc3lzLCBmcy0+ZGV2aWNlKSA9PSAwCisJCSB8fCAoZnMtPm1vdW50cHQgJiYgc3RyY21wKGZpbGVzeXMsIGZzLT5tb3VudHB0KSA9PSAwKQorCQkpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZnM7Cit9CisKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKK3N0YXRpYyBpbnQgcHJvZ3Jlc3NfYWN0aXZlKHZvaWQpCit7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3Q7CisKKwlmb3IgKGluc3QgPSBpbnN0YW5jZV9saXN0OyBpbnN0OyBpbnN0ID0gaW5zdC0+bmV4dCkgeworCQlpZiAoaW5zdC0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQljb250aW51ZTsKKwkJaWYgKGluc3QtPmZsYWdzICYgRkxBR19QUk9HUkVTUykKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBTZW5kIGEgc2lnbmFsIHRvIGFsbCBvdXRzdGFuZGluZyBmc2NrIGNoaWxkIHByb2Nlc3NlcworICovCitzdGF0aWMgdm9pZCBraWxsX2FsbF9pZl9nb3Rfc2lnbmFsKHZvaWQpCit7CisJc3RhdGljIHNtYWxsaW50IGtpbGxfc2VudDsKKworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCisJaWYgKCFiYl9nb3Rfc2lnbmFsIHx8IGtpbGxfc2VudCkKKwkJcmV0dXJuOworCisJZm9yIChpbnN0ID0gaW5zdGFuY2VfbGlzdDsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKwkJaWYgKGluc3QtPmZsYWdzICYgRkxBR19ET05FKQorCQkJY29udGludWU7CisJCWtpbGwoaW5zdC0+cGlkLCBTSUdURVJNKTsKKwl9CisJa2lsbF9zZW50ID0gMTsKK30KKworLyoKKyAqIFdhaXQgZm9yIG9uZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQ7IHdoZW4gaXQgZG9lcywgdW5saW5rIGl0IGZyb20KKyAqIHRoZSBsaXN0IG9mIGV4ZWN1dGluZyBjaGlsZCBwcm9jZXNzZXMsIGZyZWUsIGFuZCByZXR1cm4gaXRzIGV4aXQgc3RhdHVzLgorICogSWYgdGhlcmUgaXMgbm8gZXhpdGVkIGNoaWxkLCByZXR1cm4gLTEuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9vbmUoaW50IGZsYWdzKQoreworCWludCBzdGF0dXM7CisJaW50IHNpZzsKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdCwgKnByZXY7CisJcGlkX3QgcGlkOworCisJaWYgKCFpbnN0YW5jZV9saXN0KQorCQlyZXR1cm4gLTE7CisJLyogaWYgKG5vZXhlY3V0ZSkgeyBhbHJlYWR5IHJldHVybmVkIC0xOyB9ICovCisKKwl3aGlsZSAoMSkgeworCQlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBmbGFncyk7CisJCWtpbGxfYWxsX2lmX2dvdF9zaWduYWwoKTsKKwkJaWYgKHBpZCA9PSAwKSAvKiBmbGFncyA9PSBXTk9IQU5HIGFuZCBubyBjaGlsZHJlbiBleGl0ZWQgKi8KKwkJCXJldHVybiAtMTsKKwkJaWYgKHBpZCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWlmIChlcnJubyA9PSBFQ0hJTEQpIHsgLyogcGFyYW5vaWEgKi8KKwkJCQliYl9lcnJvcl9tc2coIndhaXQ6IG5vIG1vcmUgY2hpbGRyZW4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQliYl9wZXJyb3JfbXNnKCJ3YWl0Iik7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmV2ID0gTlVMTDsKKwkJaW5zdCA9IGluc3RhbmNlX2xpc3Q7CisJCWRvIHsKKwkJCWlmIChpbnN0LT5waWQgPT0gcGlkKQorCQkJCWdvdG8gY2hpbGRfZGllZDsKKwkJCXByZXYgPSBpbnN0OworCQkJaW5zdCA9IGluc3QtPm5leHQ7CisJCX0gd2hpbGUgKGluc3QpOworCX0KKyBjaGlsZF9kaWVkOgorCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpKQorCQlzdGF0dXMgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCWVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKwkJc2lnID0gV1RFUk1TSUcoc3RhdHVzKTsKKwkJc3RhdHVzID0gRVhJVF9VTkNPUlJFQ1RFRDsKKwkJaWYgKHNpZyAhPSBTSUdJTlQpIHsKKwkJCXByaW50ZigiV2FybmluZzogJXMgJXMgdGVybWluYXRlZCAiCisJCQkJImJ5IHNpZ25hbCAlZFxuIiwKKwkJCQlpbnN0LT5wcm9nLCBpbnN0LT5kZXZpY2UsIHNpZyk7CisJCQlzdGF0dXMgPSBFWElUX0VSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlcyAlczogc3RhdHVzIGlzICV4LCBzaG91bGQgbmV2ZXIgaGFwcGVuXG4iLAorCQkJaW5zdC0+cHJvZywgaW5zdC0+ZGV2aWNlLCBzdGF0dXMpOworCQlzdGF0dXMgPSBFWElUX0VSUk9SOworCX0KKworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorCWlmIChwcm9ncmVzcyAmJiAoaW5zdC0+ZmxhZ3MgJiBGTEFHX1BST0dSRVNTKSAmJiAhcHJvZ3Jlc3NfYWN0aXZlKCkpIHsKKwkJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3QyOworCQlmb3IgKGluc3QyID0gaW5zdGFuY2VfbGlzdDsgaW5zdDI7IGluc3QyID0gaW5zdDItPm5leHQpIHsKKwkJCWlmIChpbnN0Mi0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQkJY29udGludWU7CisJCQlpZiAoc3RyY21wKGluc3QyLT50eXBlLCAiZXh0MiIpICE9IDAKKwkJCSAmJiBzdHJjbXAoaW5zdDItPnR5cGUsICJleHQzIikgIT0gMAorCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBleHRbMjNdLCB3ZSB3aWxsIHNlbmQgVVNSMQorCQkJICogKHJlcXVlc3QgdG8gc3RhcnQgZGlzcGxheWluZyBwcm9ncmVzcyBiYXIpCisJCQkgKgorCQkJICogSWYgd2UndmUganVzdCBzdGFydGVkIHRoZSBmc2NrLCB3YWl0IGEgdGlueQorCQkJICogYml0IGJlZm9yZSBzZW5kaW5nIHRoZSBraWxsLCB0byBnaXZlIGl0CisJCQkgKiB0aW1lIHRvIHNldCB1cCB0aGUgc2lnbmFsIGhhbmRsZXIKKwkJCSAqLworCQkJaWYgKGluc3QyLT5zdGFydF90aW1lID49IHRpbWUoTlVMTCkgLSAxKQorCQkJCXNsZWVwKDEpOworCQkJa2lsbChpbnN0Mi0+cGlkLCBTSUdVU1IxKTsKKwkJCWluc3QyLT5mbGFncyB8PSBGTEFHX1BST0dSRVNTOworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChwcmV2KQorCQlwcmV2LT5uZXh0ID0gaW5zdC0+bmV4dDsKKwllbHNlCisJCWluc3RhbmNlX2xpc3QgPSBpbnN0LT5uZXh0OworCWlmICh2ZXJib3NlID4gMSkKKwkJcHJpbnRmKCJGaW5pc2hlZCB3aXRoICVzIChleGl0IHN0YXR1cyAlZClcbiIsCisJCSAgICAgICBpbnN0LT5kZXZpY2UsIHN0YXR1cyk7CisJbnVtX3J1bm5pbmctLTsKKwlmcmVlX2luc3RhbmNlKGluc3QpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFdhaXQgdW50aWwgYWxsIGV4ZWN1dGluZyBjaGlsZCBwcm9jZXNzZXMgaGF2ZSBleGl0ZWQ7IHJldHVybiB0aGUKKyAqIGxvZ2ljYWwgT1Igb2YgYWxsIG9mIHRoZWlyIGV4aXQgY29kZSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgRkxBR19XQUlUX0FMTCAgICAgICAgICAgMAorI2RlZmluZSBGTEFHX1dBSVRfQVRMRUFTVF9PTkUgICBXTk9IQU5HCitzdGF0aWMgaW50IHdhaXRfbWFueShpbnQgZmxhZ3MpCit7CisJaW50IGV4aXRfc3RhdHVzOworCWludCBnbG9iYWxfc3RhdHVzID0gMDsKKwlpbnQgd2FpdF9mbGFncyA9IDA7CisKKwl3aGlsZSAoKGV4aXRfc3RhdHVzID0gd2FpdF9vbmUod2FpdF9mbGFncykpICE9IC0xKSB7CisJCWdsb2JhbF9zdGF0dXMgfD0gZXhpdF9zdGF0dXM7CisJCXdhaXRfZmxhZ3MgfD0gZmxhZ3M7CisJfQorCXJldHVybiBnbG9iYWxfc3RhdHVzOworfQorCisvKgorICogRXhlY3V0ZSBhIHBhcnRpY3VsYXIgZnNjayBwcm9ncmFtLCBhbmQgbGluayBpdCBpbnRvIHRoZSBsaXN0IG9mCisgKiBjaGlsZCBwcm9jZXNzZXMgd2UgYXJlIHdhaXRpbmcgZm9yLgorICovCitzdGF0aWMgdm9pZCBleGVjdXRlKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmRldmljZSwKKwkJY29uc3QgY2hhciAqbW50cHQgLyosIGludCBpbnRlcmFjdGl2ZSAqLykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKwlwaWRfdCBwaWQ7CisKKwlhcmdzWzBdID0geGFzcHJpbnRmKCJmc2NrLiVzIiwgdHlwZSk7CisKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKKwlpZiAocHJvZ3Jlc3MgJiYgIXByb2dyZXNzX2FjdGl2ZSgpKSB7CisJCWlmIChzdHJjbXAodHlwZSwgImV4dDIiKSA9PSAwCisJCSB8fCBzdHJjbXAodHlwZSwgImV4dDMiKSA9PSAwCisJCSkgeworCQkJYXJnc1tYWFhdID0geGFzcHJpbnRmKCItQyVkIiwgcHJvZ3Jlc3NfZmQpOyAvKiAxICovCisJCQlpbnN0LT5mbGFncyB8PSBGTEFHX1BST0dSRVNTOworCQl9CisJfQorI2VuZGlmCisKKwlhcmdzW251bV9hcmdzIC0gMl0gPSAoY2hhciopZGV2aWNlOworCS8qIGFyZ3NbbnVtX2FyZ3MgLSAxXSA9IE5VTEw7IC0gYWxyZWFkeSBpcyAqLworCisJaWYgKHZlcmJvc2UgfHwgbm9leGVjdXRlKSB7CisJCXByaW50ZigiWyVzICglZCkgLS0gJXNdIiwgYXJnc1swXSwgbnVtX3J1bm5pbmcsCisJCQkJCW1udHB0ID8gbW50cHQgOiBkZXZpY2UpOworCQlmb3IgKGkgPSAwOyBhcmdzW2ldOyBpKyspCisJCQlwcmludGYoIiAlcyIsIGFyZ3NbaV0pOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworCS8qIEZvcmsgYW5kIGV4ZWN1dGUgdGhlIGNvcnJlY3QgcHJvZ3JhbS4gKi8KKwlwaWQgPSAtMTsKKwlpZiAoIW5vZXhlY3V0ZSkgeworCQlwaWQgPSBzcGF3bihhcmdzKTsKKwkJaWYgKHBpZCA8IDApCisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhhcmdzWzBdKTsKKwl9CisKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKKwlmcmVlKGFyZ3NbWFhYXSk7CisjZW5kaWYKKworCS8qIE5vIGNoaWxkLCBzbyBkb24ndCByZWNvcmQgYW4gaW5zdGFuY2UgKi8KKwlpZiAocGlkIDw9IDApIHsKKwkJZnJlZShhcmdzWzBdKTsKKwkJcmV0dXJuOworCX0KKworCWluc3QgPSB4emFsbG9jKHNpemVvZigqaW5zdCkpOworCWluc3QtPnBpZCA9IHBpZDsKKwlpbnN0LT5wcm9nID0gYXJnc1swXTsKKwlpbnN0LT5kZXZpY2UgPSB4c3RyZHVwKGRldmljZSk7CisJaW5zdC0+YmFzZV9kZXZpY2UgPSBiYXNlX2RldmljZShkZXZpY2UpOworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorCWluc3QtPnN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOworI2VuZGlmCisKKwkvKiBBZGQgdG8gdGhlIGxpc3Qgb2YgcnVubmluZyBmc2NrJ3MuCisJICogKHdhcyBhZGRpbmcgdG8gdGhlIGVuZCwgYnV0IGFkZGluZyB0byB0aGUgZnJvbnQgaXMgc2ltcGxlci4uLikgKi8KKwlpbnN0LT5uZXh0ID0gaW5zdGFuY2VfbGlzdDsKKwlpbnN0YW5jZV9saXN0ID0gaW5zdDsKK30KKworLyoKKyAqIFJ1biB0aGUgZnNjayBwcm9ncmFtIG9uIGEgcGFydGljdWxhciBkZXZpY2UKKyAqCisgKiBJZiB0aGUgdHlwZSBpcyBzcGVjaWZpZWQgdXNpbmcgLXQsIGFuZCBpdCBpc24ndCBwcmVmaXhlZCB3aXRoICJubyIKKyAqIChhcyBpbiAibm9leHQyIikgYW5kIG9ubHkgb25lIGZpbGVzeXN0ZW0gdHlwZSBpcyBzcGVjaWZpZWQsIHRoZW4KKyAqIHVzZSB0aGF0IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIHNwZWNpZmllZCBpbiAvZXRjL2ZzdGFiLgorICoKKyAqIElmIHRoZSB0eXBlIGlzbid0IHNwZWNpZmllZCBieSB0aGUgdXNlciwgdGhlbiB1c2UgZWl0aGVyIHRoZSB0eXBlCisgKiBzcGVjaWZpZWQgaW4gL2V0Yy9mc3RhYiwgb3IgImF1dG8iLgorICovCitzdGF0aWMgdm9pZCBmc2NrX2RldmljZShzdHJ1Y3QgZnNfaW5mbyAqZnMgLyosIGludCBpbnRlcmFjdGl2ZSAqLykKK3sKKwljb25zdCBjaGFyICp0eXBlOworCisJaWYgKHN0cmNtcChmcy0+dHlwZSwgImF1dG8iKSAhPSAwKSB7CisJCXR5cGUgPSBmcy0+dHlwZTsKKwkJaWYgKHZlcmJvc2UgPiAyKQorCQkJYmJfaW5mb19tc2coInVzaW5nIGZpbGVzeXN0ZW0gdHlwZSAnJXMnICVzIiwKKwkJCQkJdHlwZSwgImZyb20gZnN0YWIiKTsKKwl9IGVsc2UgaWYgKGZzdHlwZQorCSAmJiAoZnN0eXBlWzBdICE9ICduJyB8fCBmc3R5cGVbMV0gIT0gJ28nKSAvKiAhPSAibm8iICovCisJICYmIHN0cm5jbXAoZnN0eXBlLCAib3B0cz0iLCA1KSAhPSAwCisJICYmIHN0cm5jbXAoZnN0eXBlLCAibG9vcCIsIDQpICE9IDAKKwkgJiYgIXN0cmNocihmc3R5cGUsICcsJykKKwkpIHsKKwkJdHlwZSA9IGZzdHlwZTsKKwkJaWYgKHZlcmJvc2UgPiAyKQorCQkJYmJfaW5mb19tc2coInVzaW5nIGZpbGVzeXN0ZW0gdHlwZSAnJXMnICVzIiwKKwkJCQkJdHlwZSwgImZyb20gLXQiKTsKKwl9IGVsc2UgeworCQl0eXBlID0gImF1dG8iOworCQlpZiAodmVyYm9zZSA+IDIpCisJCQliYl9pbmZvX21zZygidXNpbmcgZmlsZXN5c3RlbSB0eXBlICclcycgJXMiLAorCQkJCQl0eXBlLCAiKGRlZmF1bHQpIik7CisJfQorCisJbnVtX3J1bm5pbmcrKzsKKwlleGVjdXRlKHR5cGUsIGZzLT5kZXZpY2UsIGZzLT5tb3VudHB0IC8qLCBpbnRlcmFjdGl2ZSAqLyk7Cit9CisKKy8qCisgKiBSZXR1cm5zIFRSVUUgaWYgYSBwYXJ0aXRpb24gb24gdGhlIHNhbWUgZGlzayBpcyBhbHJlYWR5IGJlaW5nCisgKiBjaGVja2VkLgorICovCitzdGF0aWMgaW50IGRldmljZV9hbHJlYWR5X2FjdGl2ZShjaGFyICpkZXZpY2UpCit7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3Q7CisJY2hhciAqYmFzZTsKKworCWlmIChmb3JjZV9hbGxfcGFyYWxsZWwpCisJCXJldHVybiAwOworCisjaWZkZWYgQkFTRV9NRAorCS8qIERvbid0IGNoZWNrIGEgc29mdCByYWlkIGRpc2sgd2l0aCBhbnkgb3RoZXIgZGlzayAqLworCWlmIChpbnN0YW5jZV9saXN0CisJICYmICghc3RybmNtcChpbnN0YW5jZV9saXN0LT5kZXZpY2UsIEJBU0VfTUQsIHNpemVvZihCQVNFX01EKS0xKQorCSAgICAgfHwgIXN0cm5jbXAoZGV2aWNlLCBCQVNFX01ELCBzaXplb2YoQkFTRV9NRCktMSkpCisJKSB7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJYmFzZSA9IGJhc2VfZGV2aWNlKGRldmljZSk7CisJLyoKKwkgKiBJZiB3ZSBkb24ndCBrbm93IHRoZSBiYXNlIGRldmljZSwgYXNzdW1lIHRoYXQgdGhlIGRldmljZSBpcworCSAqIGFscmVhZHkgYWN0aXZlIGlmIHRoZXJlIGFyZSBhbnkgZnNjayBpbnN0YW5jZXMgcnVubmluZy4KKwkgKi8KKwlpZiAoIWJhc2UpCisJCXJldHVybiAoaW5zdGFuY2VfbGlzdCAhPSBOVUxMKTsKKworCWZvciAoaW5zdCA9IGluc3RhbmNlX2xpc3Q7IGluc3Q7IGluc3QgPSBpbnN0LT5uZXh0KSB7CisJCWlmICghaW5zdC0+YmFzZV9kZXZpY2UgfHwgIXN0cmNtcChiYXNlLCBpbnN0LT5iYXNlX2RldmljZSkpIHsKKwkJCWZyZWUoYmFzZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWZyZWUoYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgb3B0aW9uIGFwcGVhcnMgaW4gYQorICogY29tbWEtZGVsaW1pdGVkIG9wdGlvbnMgbGlzdAorICovCitzdGF0aWMgaW50IG9wdF9pbl9saXN0KGNoYXIgKm9wdCwgY2hhciAqb3B0bGlzdCkKK3sKKwljaGFyICpzOworCWludCBsZW47CisKKwlpZiAoIW9wdGxpc3QpCisJCXJldHVybiAwOworCisJbGVuID0gc3RybGVuKG9wdCk7CisJcyA9IG9wdGxpc3QgLSAxOworCXdoaWxlICgxKSB7CisJCXMgPSBzdHJzdHIocyArIDEsIG9wdCk7CisJCWlmICghcykKKwkJCXJldHVybiAwOworCQkvKiBuZWl0aGVyICJvcHQuLiIgbm9yICJ4eHgsb3B0Li4iPyAqLworCQlpZiAocyAhPSBvcHRsaXN0ICYmIHNbLTFdICE9ICcsJykKKwkJCWNvbnRpbnVlOworCQkvKiBuZWl0aGVyICIuLm9wdCIgbm9yICIuLm9wdCx4eHgiPyAqLworCQlpZiAoc1tsZW5dICE9ICdcMCcgJiYgc1tsZW5dICE9ICcsJykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIFNlZSBpZiB0aGUgZmlsZXN5c3RlbSBtYXRjaGVzIHRoZSBjcml0ZXJpYSBnaXZlbiBieSB0aGUgLXQgb3B0aW9uICovCitzdGF0aWMgaW50IGZzX21hdGNoKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKwlpbnQgbiwgcmV0LCBjaGVja2VkX3R5cGU7CisJY2hhciAqY3A7CisKKwlpZiAoIWZzX3R5cGVfbGlzdCkKKwkJcmV0dXJuIDE7CisKKwlyZXQgPSAwOworCWNoZWNrZWRfdHlwZSA9IDA7CisJbiA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY3AgPSBmc190eXBlX2xpc3Rbbl07CisJCWlmICghY3ApCisJCQlicmVhazsKKwkJc3dpdGNoIChmc190eXBlX2ZsYWdbbl0pIHsKKwkJY2FzZSBGU19UWVBFX0ZMQUdfTk9STUFMOgorCQkJY2hlY2tlZF90eXBlKys7CisJCQlpZiAoc3RyY21wKGNwLCBmcy0+dHlwZSkgPT0gMCkKKwkJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRlNfVFlQRV9GTEFHX05FR09QVDoKKwkJCWlmIChvcHRfaW5fbGlzdChjcCwgZnMtPm9wdHMpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgRlNfVFlQRV9GTEFHX09QVDoKKwkJCWlmICghb3B0X2luX2xpc3QoY3AsIGZzLT5vcHRzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJCW4rKzsKKwl9CisJaWYgKGNoZWNrZWRfdHlwZSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAoZnNfdHlwZV9uZWdhdGVkID8gIXJldCA6IHJldCk7Cit9CisKKy8qIENoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgdGhpcyBmaWxlc3lzdGVtLiAqLworc3RhdGljIGludCBpZ25vcmUoc3RydWN0IGZzX2luZm8gKmZzKQoreworCS8qCisJICogSWYgdGhlIHBhc3MgbnVtYmVyIGlzIDAsIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAoZnMtPnBhc3NubyA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogSWYgYSBzcGVjaWZpYyBmc3R5cGUgaXMgc3BlY2lmaWVkLCBhbmQgaXQgZG9lc24ndCBtYXRjaCwKKwkgKiBpZ25vcmUgaXQuCisJICovCisJaWYgKCFmc19tYXRjaChmcykpCisJCXJldHVybiAxOworCisJLyogQXJlIHdlIGlnbm9yaW5nIHRoaXMgdHlwZT8gKi8KKwlpZiAoaW5kZXhfaW5fc3RyaW5ncyhpZ25vcmVkX3R5cGVzLCBmcy0+dHlwZSkgPj0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBXZSBjYW4gYW5kIHdhbnQgdG8gY2hlY2sgdGhpcyBmaWxlIHN5c3RlbSB0eXBlLiAqLworCXJldHVybiAwOworfQorCisvKiBDaGVjayBhbGwgZmlsZSBzeXN0ZW1zLCB1c2luZyB0aGUgL2V0Yy9mc3RhYiB0YWJsZS4gKi8KK3N0YXRpYyBpbnQgY2hlY2tfYWxsKHZvaWQpCit7CisJc3RydWN0IGZzX2luZm8gKmZzOworCWludCBzdGF0dXMgPSBFWElUX09LOworCXNtYWxsaW50IG5vdF9kb25lX3lldDsKKwlzbWFsbGludCBwYXNzX2RvbmU7CisJaW50IHBhc3NubzsKKworCWlmICh2ZXJib3NlKQorCQlwdXRzKCJDaGVja2luZyBhbGwgZmlsZXN5c3RlbXMiKTsKKworCS8qCisJICogRG8gYW4gaW5pdGlhbCBzY2FuIG92ZXIgdGhlIGZpbGVzeXN0ZW07IG1hcmsgZmlsZXN5c3RlbXMKKwkgKiB3aGljaCBzaG91bGQgYmUgaWdub3JlZCBhcyBkb25lLCBhbmQgcmVzb2x2ZSBhbnkgImF1dG8iCisJICogZmlsZXN5c3RlbSB0eXBlcyAoZG9uZSBhcyBhIHNpZGUtZWZmZWN0IG9mIGNhbGxpbmcgaWdub3JlKCkpLgorCSAqLworCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KQorCQlpZiAoaWdub3JlKGZzKSkKKwkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisKKwkvKgorCSAqIEZpbmQgYW5kIGNoZWNrIHRoZSByb290IGZpbGVzeXN0ZW0uCisJICovCisJaWYgKCFwYXJhbGxlbF9yb290KSB7CisJCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisJCQlpZiAoTE9ORV9DSEFSKGZzLT5tb3VudHB0LCAnLycpKSB7CisJCQkJaWYgKCFza2lwX3Jvb3QgJiYgIWlnbm9yZShmcykpIHsKKwkJCQkJZnNja19kZXZpY2UoZnMgLyosIDEqLyk7CisJCQkJCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FMTCk7CisJCQkJCWlmIChzdGF0dXMgPiBFWElUX05PTkRFU1RSVUNUKQorCQkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQl9CisJCQkJZnMtPmZsYWdzIHw9IEZMQUdfRE9ORTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIFRoaXMgaXMgZm9yIHRoZSBib25lLWhlYWRlZCB1c2VyIHdobyBoYXMgcm9vdAorCSAqIGZpbGVzeXN0ZW0gbGlzdGVkIHR3aWNlLgorCSAqICJTa2lwIHJvb3QiIHdpbGwgc2tpcCBfYWxsXyByb290IGVudHJpZXMuCisJICovCisJaWYgKHNraXBfcm9vdCkKKwkJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpCisJCQlpZiAoTE9ORV9DSEFSKGZzLT5tb3VudHB0LCAnLycpKQorCQkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisKKwlub3RfZG9uZV95ZXQgPSAxOworCXBhc3NubyA9IDE7CisJd2hpbGUgKG5vdF9kb25lX3lldCkgeworCQlub3RfZG9uZV95ZXQgPSAwOworCQlwYXNzX2RvbmUgPSAxOworCisJCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisJCQlpZiAoYmJfZ290X3NpZ25hbCkKKwkJCQlicmVhazsKKwkJCWlmIChmcy0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogSWYgdGhlIGZpbGVzeXN0ZW0ncyBwYXNzIG51bWJlciBpcyBoaWdoZXIKKwkJCSAqIHRoYW4gdGhlIGN1cnJlbnQgcGFzcyBudW1iZXIsIHRoZW4gd2UgZGlkbid0CisJCQkgKiBkbyBpdCB5ZXQuCisJCQkgKi8KKwkJCWlmIChmcy0+cGFzc25vID4gcGFzc25vKSB7CisJCQkJbm90X2RvbmVfeWV0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiBhIGZpbGVzeXN0ZW0gb24gYSBwYXJ0aWN1bGFyIGRldmljZSBoYXMKKwkJCSAqIGFscmVhZHkgYmVlbiBzcGF3bmVkLCB0aGVuIHdlIG5lZWQgdG8gZGVmZXIKKwkJCSAqIHRoaXMgdG8gYW5vdGhlciBwYXNzLgorCQkJICovCisJCQlpZiAoZGV2aWNlX2FscmVhZHlfYWN0aXZlKGZzLT5kZXZpY2UpKSB7CisJCQkJcGFzc19kb25lID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBTcGF3biBvZmYgdGhlIGZzY2sgcHJvY2VzcworCQkJICovCisJCQlmc2NrX2RldmljZShmcyAvKiwgc2VyaWFsaXplKi8pOworCQkJZnMtPmZsYWdzIHw9IEZMQUdfRE9ORTsKKworCQkJLyoKKwkJCSAqIE9ubHkgZG8gb25lIGZpbGVzeXN0ZW0gYXQgYSB0aW1lLCBvciBpZiB3ZQorCQkJICogaGF2ZSBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZnNjaydzIGV4dGFudAorCQkJICogYXQgb25lIHRpbWUsIGFwcGx5IHRoYXQgbGltaXQuCisJCQkgKi8KKwkJCWlmIChzZXJpYWxpemUKKwkJCSB8fCAobWF4X3J1bm5pbmcgJiYgKG51bV9ydW5uaW5nID49IG1heF9ydW5uaW5nKSkKKwkJCSkgeworCQkJCXBhc3NfZG9uZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGJiX2dvdF9zaWduYWwpCisJCQlicmVhazsKKwkJaWYgKHZlcmJvc2UgPiAxKQorCQkJcHJpbnRmKCItLXdhaXRpbmctLSAocGFzcyAlZClcbiIsIHBhc3Nubyk7CisJCXN0YXR1cyB8PSB3YWl0X21hbnkocGFzc19kb25lID8gRkxBR19XQUlUX0FMTCA6CisJCQkJICAgIEZMQUdfV0FJVF9BVExFQVNUX09ORSk7CisJCWlmIChwYXNzX2RvbmUpIHsKKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJCQlwYXNzbm8rKzsKKwkJfSBlbHNlCisJCQlub3RfZG9uZV95ZXQgPSAxOworCX0KKwlraWxsX2FsbF9pZl9nb3Rfc2lnbmFsKCk7CisJc3RhdHVzIHw9IHdhaXRfbWFueShGTEFHX1dBSVRfQVRMRUFTVF9PTkUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWFsIHdpdGggdGhlIGZzY2sgLXQgYXJndW1lbnQuCisgKiBIdWgsIGZvciBtb3VudCAiLXQgbm92ZmF0LG5mcyIgbWVhbnMgIm5laXRoZXIgdmZhdCBub3IgbmZzIiEKKyAqIFdoeSBoZXJlIHdlIHJlcXVpcmUgIi10IG5vdmZhdCxub25mcyIgPz8KKyAqLworc3RhdGljIHZvaWQgY29tcGlsZV9mc190eXBlKGNoYXIgKmZzX3R5cGUpCit7CisJY2hhciAqczsKKwlpbnQgbnVtID0gMjsKKwlzbWFsbGludCBuZWdhdGU7CisKKwlzID0gZnNfdHlwZTsKKwl3aGlsZSAoKHMgPSBzdHJjaHIocywgJywnKSkpIHsKKwkJbnVtKys7CisJCXMrKzsKKwl9CisKKwlmc190eXBlX2xpc3QgPSB4emFsbG9jKG51bSAqIHNpemVvZihmc190eXBlX2xpc3RbMF0pKTsKKwlmc190eXBlX2ZsYWcgPSB4emFsbG9jKG51bSAqIHNpemVvZihmc190eXBlX2ZsYWdbMF0pKTsKKwlmc190eXBlX25lZ2F0ZWQgPSAtMTsgLyogbm90IHlldCBrbm93biBpcyBpdCBuZWdhdGVkIG9yIG5vdCAqLworCisJbnVtID0gMDsKKwlzID0gZnNfdHlwZTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpjb21tYTsKKworCQluZWdhdGUgPSAwOworCQlpZiAoc1swXSA9PSAnbicgJiYgc1sxXSA9PSAnbycpIHsgLyogIm5vLi4iICovCisJCQlzICs9IDI7CisJCQluZWdhdGUgPSAxOworCQl9IGVsc2UgaWYgKHNbMF0gPT0gJyEnKSB7CisJCQlzKys7CisJCQluZWdhdGUgPSAxOworCQl9CisKKwkJaWYgKHN0cmNtcChzLCAibG9vcCIpID09IDApCisJCQkvKiBsb29wIGlzIHJlYWxseSBzaG9ydC1oYW5kIGZvciBvcHRzPWxvb3AgKi8KKwkJCWdvdG8gbG9vcF9zcGVjaWFsX2Nhc2U7CisJCWlmIChzdHJuY21wKHMsICJvcHRzPSIsIDUpID09IDApIHsKKwkJCXMgKz0gNTsKKyBsb29wX3NwZWNpYWxfY2FzZToKKwkJCWZzX3R5cGVfZmxhZ1tudW1dID0gbmVnYXRlID8gRlNfVFlQRV9GTEFHX05FR09QVCA6IEZTX1RZUEVfRkxBR19PUFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoZnNfdHlwZV9uZWdhdGVkID09IC0xKQorCQkJCWZzX3R5cGVfbmVnYXRlZCA9IG5lZ2F0ZTsKKwkJCWlmIChmc190eXBlX25lZ2F0ZWQgIT0gbmVnYXRlKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorImVpdGhlciBhbGwgb3Igbm9uZSBvZiB0aGUgZmlsZXN5c3RlbSB0eXBlcyBwYXNzZWQgdG8gLXQgbXVzdCBiZSBwcmVmaXhlZCAiCisid2l0aCAnbm8nIG9yICchJyIpOworCQl9CisJCWNvbW1hID0gc3RyY2hyKHMsICcsJyk7CisJCWZzX3R5cGVfbGlzdFtudW0rK10gPSBjb21tYSA/IHhzdHJuZHVwKHMsIGNvbW1hLXMpIDogeHN0cmR1cChzKTsKKwkJaWYgKCFjb21tYSkKKwkJCWJyZWFrOworCQlzID0gY29tbWEgKyAxOworCX0KK30KKworc3RhdGljIGNoYXIgKipuZXdfYXJncyh2b2lkKQoreworCWFyZ3MgPSB4cmVhbGxvY192ZWN0b3IoYXJncywgMiwgbnVtX2FyZ3MpOworCXJldHVybiAmYXJnc1tudW1fYXJncysrXTsKK30KKworaW50IGZzY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZzY2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpLCBzdGF0dXM7CisJLyppbnQgaW50ZXJhY3RpdmU7Ki8KKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisJY29uc3QgY2hhciAqZnN0YWI7CisJY2hhciAqdG1wOworCWNoYXIgKipkZXZpY2VzOworCWludCBudW1fZGV2aWNlczsKKwlzbWFsbGludCBvcHRzX2Zvcl9mc2NrOworCXNtYWxsaW50IGRvYWxsOworCXNtYWxsaW50IG5vdGl0bGU7CisKKwkvKiB3ZSB3YW50IHdhaXQoKSB0byBiZSBpbnRlcnJ1cHRpYmxlICovCisJc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdJTlQsIHJlY29yZF9zaWdubyk7CisJc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdURVJNLCByZWNvcmRfc2lnbm8pOworCisJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisKKwlvcHRzX2Zvcl9mc2NrID0gZG9hbGwgPSBub3RpdGxlID0gMDsKKwlkZXZpY2VzID0gTlVMTDsKKwludW1fZGV2aWNlcyA9IDA7CisJbmV3X2FyZ3MoKTsgLyogYXJnc1swXSA9IE5VTEwsIHdpbGwgYmUgcmVwbGFjZWQgYnkgZnNjay48dHlwZT4gKi8KKwkvKiBpbnN0YW5jZV9saXN0ID0gTlVMTDsgLSBpbiBic3MsIHNvIGFscmVhZHkgemVyb2VkICovCisKKwl3aGlsZSAoKisrYXJndikgeworCQlpbnQgajsKKwkJaW50IG9wdHBvczsKKwkJY2hhciAqb3B0aW9uczsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJLyogIi9kZXYvYmxrIiBvciAiL3BhdGgiIG9yICJVVUlEPXh4eCIgb3IgIkxBQkVMPXh4eCIgKi8KKwkJaWYgKChhcmdbMF0gPT0gJy8nICYmICFvcHRzX2Zvcl9mc2NrKSB8fCBzdHJjaHIoYXJnLCAnPScpKSB7CisvLyBGSVhNRTogbXVzdCBjaGVjayB0aGF0IGFyZyBpcyBhIGJsa2Rldiwgb3IgcmVzb2x2ZQorLy8gIi9wYXRoIiwgIlVVSUQ9eHh4IiBvciAiTEFCRUw9eHh4IiBpbnRvIGJsb2NrIGRldmljZSBuYW1lCisvLyAoIlVVSUQ9eHh4Ii8iTEFCRUw9eHh4IiBjYW4gcHJvYmFibHkgc2hpZnRlZCB0byBmc2NrLmF1dG8gZHV0aWVzKQorCQkJZGV2aWNlcyA9IHhyZWFsbG9jX3ZlY3RvcihkZXZpY2VzLCAyLCBudW1fZGV2aWNlcyk7CisJCQlkZXZpY2VzW251bV9kZXZpY2VzKytdID0gYXJnOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYXJnWzBdICE9ICctJyB8fCBvcHRzX2Zvcl9mc2NrKSB7CisJCQkqbmV3X2FyZ3MoKSA9IGFyZzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKExPTkVfQ0hBUihhcmcgKyAxLCAnLScpKSB7IC8qICItLSIgPyAqLworCQkJb3B0c19mb3JfZnNjayA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCW9wdHBvcyA9IDA7CisJCW9wdGlvbnMgPSBOVUxMOworCQlmb3IgKGogPSAxOyBhcmdbal07IGorKykgeworCQkJc3dpdGNoIChhcmdbal0pIHsKKwkJCWNhc2UgJ0EnOgorCQkJCWRvYWxsID0gMTsKKwkJCQlicmVhazsKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKKwkJCWNhc2UgJ0MnOgorCQkJCXByb2dyZXNzID0gMTsKKwkJCQlpZiAoYXJnWysral0pIHsgLyogLUNuICovCisJCQkJCXByb2dyZXNzX2ZkID0geGF0b2lfcG9zaXRpdmUoJmFyZ1tqXSk7CisJCQkJCWdvdG8gbmV4dF9hcmc7CisJCQkJfQorCQkJCS8qIC1DIG4gKi8KKwkJCQlpZiAoISorK2FyZ3YpCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlwcm9ncmVzc19mZCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJCQlnb3RvIG5leHRfYXJnOworI2VuZGlmCisJCQljYXNlICdWJzoKKwkJCQl2ZXJib3NlKys7CisJCQkJYnJlYWs7CisJCQljYXNlICdOJzoKKwkJCQlub2V4ZWN1dGUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnUic6CisJCQkJc2tpcF9yb290ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1QnOgorCQkJCW5vdGl0bGUgPSAxOworCQkJCWJyZWFrOworLyoJCQljYXNlICdNJzoKKwkJCQlsaWtlX21vdW50ID0gMTsKKwkJCQlicmVhazsgKi8KKwkJCWNhc2UgJ1AnOgorCQkJCXBhcmFsbGVsX3Jvb3QgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJc2VyaWFsaXplID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWlmIChmc3R5cGUpCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlpZiAoYXJnWysral0pCisJCQkJCXRtcCA9ICZhcmdbal07CisJCQkJZWxzZSBpZiAoKisrYXJndikKKwkJCQkJdG1wID0gKmFyZ3Y7CisJCQkJZWxzZQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJZnN0eXBlID0geHN0cmR1cCh0bXApOworCQkJCWNvbXBpbGVfZnNfdHlwZShmc3R5cGUpOworCQkJCWdvdG8gbmV4dF9hcmc7CisJCQljYXNlICc/JzoKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW9wdHBvcysrOworCQkJCS8qIG9uZSBleHRyYSBmb3IgJ1wwJyAqLworCQkJCW9wdGlvbnMgPSB4cmVhbGxvYyhvcHRpb25zLCBvcHRwb3MgKyAyKTsKKwkJCQlvcHRpb25zW29wdHBvc10gPSBhcmdbal07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyBuZXh0X2FyZzoKKwkJaWYgKG9wdHBvcykgeworCQkJb3B0aW9uc1swXSA9ICctJzsKKwkJCW9wdGlvbnNbb3B0cG9zICsgMV0gPSAnXDAnOworCQkJKm5ld19hcmdzKCkgPSBvcHRpb25zOworCQl9CisJfQorCWlmIChnZXRlbnYoIkZTQ0tfRk9SQ0VfQUxMX1BBUkFMTEVMIikpCisJCWZvcmNlX2FsbF9wYXJhbGxlbCA9IDE7CisJdG1wID0gZ2V0ZW52KCJGU0NLX01BWF9JTlNUIik7CisJaWYgKHRtcCkKKwkJbWF4X3J1bm5pbmcgPSB4YXRvaSh0bXApOworCW5ld19hcmdzKCk7IC8qIGFyZ3NbbnVtX2FyZ3MgLSAyXSB3aWxsIGJlIHJlcGxhY2VkIGJ5IDxkZXZpY2U+ICovCisJbmV3X2FyZ3MoKTsgLyogYXJnc1tudW1fYXJncyAtIDFdIGlzIHRoZSBsYXN0LCBOVUxMIGVsZW1lbnQgKi8KKworCWlmICghbm90aXRsZSkKKwkJcHV0cygiZnNjayAoYnVzeWJveCAiQkJfVkVSIiwgIkJCX0JUIikiKTsKKworCS8qIEV2ZW4gcGxhaW4gImZzY2sgL2Rldi9oZGExIiBuZWVkcyBmc3RhYiB0byBnZXQgZnMgdHlwZSwKKwkgKiBzbyB3ZSBhcmUgc2Nhbm5pbmcgaXQgYW55d2F5ICovCisJZnN0YWIgPSBnZXRlbnYoIkZTVEFCX0ZJTEUiKTsKKwlpZiAoIWZzdGFiKQorCQlmc3RhYiA9ICIvZXRjL2ZzdGFiIjsKKwlsb2FkX2ZzX2luZm8oZnN0YWIpOworCisJLyppbnRlcmFjdGl2ZSA9IChudW1fZGV2aWNlcyA9PSAxKSB8IHNlcmlhbGl6ZTsqLworCisJaWYgKG51bV9kZXZpY2VzID09IDApCisJCS8qaW50ZXJhY3RpdmUgPSovIHNlcmlhbGl6ZSA9IGRvYWxsID0gMTsKKwlpZiAoZG9hbGwpCisJCXJldHVybiBjaGVja19hbGwoKTsKKworCXN0YXR1cyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKKwkJaWYgKGJiX2dvdF9zaWduYWwpIHsKKwkJCWtpbGxfYWxsX2lmX2dvdF9zaWduYWwoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZnMgPSBsb29rdXAoZGV2aWNlc1tpXSk7CisJCWlmICghZnMpCisJCQlmcyA9IGNyZWF0ZV9mc19kZXZpY2UoZGV2aWNlc1tpXSwgIiIsICJhdXRvIiwgTlVMTCwgLTEpOworCQlmc2NrX2RldmljZShmcyAvKiwgaW50ZXJhY3RpdmUgKi8pOworCisJCWlmIChzZXJpYWxpemUKKwkJIHx8IChtYXhfcnVubmluZyAmJiAobnVtX3J1bm5pbmcgPj0gbWF4X3J1bm5pbmcpKQorCQkpIHsKKwkJCWludCBleGl0X3N0YXR1cyA9IHdhaXRfb25lKDApOworCQkJaWYgKGV4aXRfc3RhdHVzID49IDApCisJCQkJc3RhdHVzIHw9IGV4aXRfc3RhdHVzOworCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCXB1dHMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJfQorCX0KKwlzdGF0dXMgfD0gd2FpdF9tYW55KEZMQUdfV0FJVF9BTEwpOworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MvbHNhdHRyLmMgYi9lMmZzcHJvZ3MvbHNhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxMmZlNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9sc2F0dHIuYwpAQCAtMCwwICsxLDEyMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbHNhdHRyLmMJCS0gTGlzdCBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCAgUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJLCBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEwLzMwCS0gQ3JlYXRpb24KKyAqIDkzLzExLzEzCS0gUmVwbGFjZSBzdGF0KCkgY2FsbHMgYnkgbHN0YXQoKSB0byBhdm9pZCBsb29wcworICogOTQvMDIvMjcJLSBJbnRlZ3JhdGVkIGluIFRlZCdzIGRpc3RyaWJ1dGlvbgorICogOTgvMTIvMjkJLSBEaXNwbGF5IHZlcnNpb24gaW5mbyBvbmx5IHdoZW4gLVYgc3BlY2lmaWVkIChHIE0gU2lwZSkKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbHNhdHRyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLVJhZGx2XSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbHNhdHRyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmc1xuIgorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktYQlEb24ndCBoaWRlIGVudHJpZXMgc3RhcnRpbmcgd2l0aCAuIgorLy91c2FnZTogICAgICJcbgktZAlMaXN0IGRpcmVjdG9yeSBlbnRyaWVzIGluc3RlYWQgb2YgY29udGVudHMiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgbG9uZyBmbGFnIG5hbWVzIgorLy91c2FnZTogICAgICJcbgktdglMaXN0IHRoZSBmaWxlJ3MgdmVyc2lvbi9nZW5lcmF0aW9uIG51bWJlciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiZTJmc19saWIuaCIKKworZW51bSB7CisJT1BUX1JFQ1VSICAgICAgPSAweDEsCisJT1BUX0FMTCAgICAgICAgPSAweDIsCisJT1BUX0RJUlNfT1BUICAgPSAweDQsCisJT1BUX1BGX0xPTkcgICAgPSAweDgsCisJT1BUX0dFTkVSQVRJT04gPSAweDEwLAorfTsKKworc3RhdGljIHZvaWQgbGlzdF9hdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmc2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgZ2VuZXJhdGlvbjsKKworCWlmIChmZ2V0ZmxhZ3MobmFtZSwgJmZzZmxhZ3MpICE9IDApCisJCWdvdG8gcmVhZF9lcnI7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9HRU5FUkFUSU9OKSB7CisJCWlmIChmZ2V0dmVyc2lvbihuYW1lLCAmZ2VuZXJhdGlvbikgIT0gMCkKKwkJCWdvdG8gcmVhZF9lcnI7CisJCXByaW50ZigiJTVsdSAiLCBnZW5lcmF0aW9uKTsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9QRl9MT05HKSB7CisJCXByaW50ZigiJS0yOHMgIiwgbmFtZSk7CisJCXByaW50X2UyZmxhZ3Moc3Rkb3V0LCBmc2ZsYWdzLCBQRk9QVF9MT05HKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9IGVsc2UgeworCQlwcmludF9lMmZsYWdzKHN0ZG91dCwgZnNmbGFncywgMCk7CisJCXByaW50ZigiICVzXG4iLCBuYW1lKTsKKwl9CisKKwlyZXR1cm47CisgcmVhZF9lcnI6CisJYmJfcGVycm9yX21zZygicmVhZGluZyAlcyIsIG5hbWUpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsc2F0dHJfZGlyX3Byb2MoY29uc3QgY2hhciAqZGlyX25hbWUsCisJCXN0cnVjdCBkaXJlbnQgKmRlLAorCQl2b2lkICpwcml2YXRlIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpwYXRoOworCisJcGF0aCA9IGNvbmNhdF9wYXRoX2ZpbGUoZGlyX25hbWUsIGRlLT5kX25hbWUpOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkgIT0gMCkKKwkJYmJfcGVycm9yX21zZygic3RhdCAlcyIsIHBhdGgpOworCWVsc2UgaWYgKGRlLT5kX25hbWVbMF0gIT0gJy4nIHx8IChvcHRpb25fbWFzazMyICYgT1BUX0FMTCkpIHsKKwkJbGlzdF9hdHRyaWJ1dGVzKHBhdGgpOworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSAmJiAob3B0aW9uX21hc2szMiAmIE9QVF9SRUNVUikKKwkJICYmICFET1RfT1JfRE9URE9UKGRlLT5kX25hbWUpCisJCSkgeworCQkJcHJpbnRmKCJcbiVzOlxuIiwgcGF0aCk7CisJCQlpdGVyYXRlX29uX2RpcihwYXRoLCBsc2F0dHJfZGlyX3Byb2MsIE5VTEwpOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCX0KKworCWZyZWUocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxzYXR0cl9hcmdzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAobHN0YXQobmFtZSwgJnN0KSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJzdGF0ICVzIiwgbmFtZSk7CisJfSBlbHNlIGlmIChTX0lTRElSKHN0LnN0X21vZGUpICYmICEob3B0aW9uX21hc2szMiAmIE9QVF9ESVJTX09QVCkpIHsKKwkJaXRlcmF0ZV9vbl9kaXIobmFtZSwgbHNhdHRyX2Rpcl9wcm9jLCBOVUxMKTsKKwl9IGVsc2UgeworCQlsaXN0X2F0dHJpYnV0ZXMobmFtZSk7CisJfQorfQorCitpbnQgbHNhdHRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsc2F0dHJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJSYWRsdiIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyKikiLiI7CisJZG8gbHNhdHRyX2FyZ3MoKmFyZ3YrKyk7IHdoaWxlICgqYXJndik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvQ29uZmlnLmluIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWFjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9Db25maWcuaW4KQEAgLTAsMCArMSw3MCBAQAorIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IEV4dDIgRlMgUHJvZ3MiCisKKworCitjb25maWcgQ0hBVFRSCisJYm9vbCAiY2hhdHRyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIGNoYXR0ciBjaGFuZ2VzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb24gYSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0uCisKK2NvbmZpZyBFMkZTQ0sKKwlib29sICJlMmZzY2siCisJZGVmYXVsdCBuCisJaGVscAorCSAgZTJmc2NrIGlzIHVzZWQgdG8gY2hlY2sgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtcyAoZXh0MmZzKS4KKwkgIGUyZnNjayBhbHNvIHN1cHBvcnRzIGV4dDIgZmlsZXN5c3RlbXMgY291bnRhaW5pbmcgYSBqb3VybmFsIChleHQzKS4KKwkgIFRoZSBub3JtYWwgY29tcGF0IHN5bWxpbmtzICdmc2NrLmV4dDInIGFuZCAnZnNjay5leHQzJyBhcmUgYWxzbworCSAgcHJvdmlkZWQuCisKK2NvbmZpZyBGU0NLCisJYm9vbCAiZnNjayIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBmc2NrIGlzIHVzZWQgdG8gY2hlY2sgYW5kIG9wdGlvbmFsbHkgcmVwYWlyIG9uZSBvciBtb3JlIGZpbGVzeXN0ZW1zLgorCSAgSW4gYWN0dWFsaXR5LCBmc2NrIGlzIHNpbXBseSBhIGZyb250LWVuZCBmb3IgdGhlIHZhcmlvdXMgZmlsZSBzeXN0ZW0KKwkgIGNoZWNrZXJzIChmc2NrLmZzdHlwZSkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LgorCitjb25maWcgTFNBVFRSCisJYm9vbCAibHNhdHRyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIGxzYXR0ciBsaXN0cyB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorCitjb25maWcgTUtFMkZTCisJYm9vbCAibWtlMmZzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIG1rZTJmcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleHQyL2V4dDMgZmlsZXN5c3RlbS4gVGhlIG5vcm1hbCBjb21wYXQKKwkgIHN5bWxpbmtzICdta2ZzLmV4dDInIGFuZCAnbWtmcy5leHQzJyBhcmUgYWxzbyBwcm92aWRlZC4KKworY29uZmlnIFRVTkUyRlMKKwlib29sICJ0dW5lMmZzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIHR1bmUyZnMgYWxsb3dzIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBhZGp1c3QgdmFyaW91cyB0dW5hYmxlCisJICBmaWxlc3lzdGVtIHBhcmFtZXRlcnMgb24gTGludXggZXh0Mi9leHQzIGZpbGVzeXN0ZW1zLgorCitjb25maWcgRTJMQUJFTAorCWJvb2wgImUybGFiZWwiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBUVU5FMkZTCisJaGVscAorCSAgZTJsYWJlbCB3aWxsIGRpc3BsYXkgb3IgY2hhbmdlIHRoZSBmaWxlc3lzdGVtIGxhYmVsIG9uIHRoZSBleHQyCisJICBmaWxlc3lzdGVtIGxvY2F0ZWQgb24gZGV2aWNlLgorCitjb25maWcgRklOREZTCisJYm9vbCAiZmluZGZzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFVORTJGUworCWhlbHAKKwkgIGZpbmRmcyB3aWxsIHNlYXJjaCB0aGUgZGlza3MgaW4gdGhlIHN5c3RlbSBsb29raW5nIGZvciBhIGZpbGVzeXN0ZW0KKwkgIHdoaWNoIGhhcyBhIGxhYmVsIG1hdGNoaW5nIGxhYmVsIG9yIGEgVVVJRCBlcXVhbCB0byB1dWlkLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9Db25maWcuc3JjIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmVjMDhlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDY5IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMaW51eCBFeHQyIEZTIFByb2dzIgorCitJTlNFUlQKKworY29uZmlnIENIQVRUUgorCWJvb2wgImNoYXR0ciIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBjaGF0dHIgY2hhbmdlcyB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorCitjb25maWcgRTJGU0NLCisJYm9vbCAiZTJmc2NrIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIGUyZnNjayBpcyB1c2VkIHRvIGNoZWNrIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbXMgKGV4dDJmcykuCisJICBlMmZzY2sgYWxzbyBzdXBwb3J0cyBleHQyIGZpbGVzeXN0ZW1zIGNvdW50YWluaW5nIGEgam91cm5hbCAoZXh0MykuCisJICBUaGUgbm9ybWFsIGNvbXBhdCBzeW1saW5rcyAnZnNjay5leHQyJyBhbmQgJ2ZzY2suZXh0MycgYXJlIGFsc28KKwkgIHByb3ZpZGVkLgorCitjb25maWcgRlNDSworCWJvb2wgImZzY2siCisJZGVmYXVsdCBuCisJaGVscAorCSAgZnNjayBpcyB1c2VkIHRvIGNoZWNrIGFuZCBvcHRpb25hbGx5IHJlcGFpciBvbmUgb3IgbW9yZSBmaWxlc3lzdGVtcy4KKwkgIEluIGFjdHVhbGl0eSwgZnNjayBpcyBzaW1wbHkgYSBmcm9udC1lbmQgZm9yIHRoZSB2YXJpb3VzIGZpbGUgc3lzdGVtCisJICBjaGVja2VycyAoZnNjay5mc3R5cGUpIGF2YWlsYWJsZSB1bmRlciBMaW51eC4KKworY29uZmlnIExTQVRUUgorCWJvb2wgImxzYXR0ciIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBsc2F0dHIgbGlzdHMgdGhlIGZpbGUgYXR0cmlidXRlcyBvbiBhIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbS4KKworY29uZmlnIE1LRTJGUworCWJvb2wgIm1rZTJmcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBta2UyZnMgaXMgdXNlZCB0byBjcmVhdGUgYW4gZXh0Mi9leHQzIGZpbGVzeXN0ZW0uIFRoZSBub3JtYWwgY29tcGF0CisJICBzeW1saW5rcyAnbWtmcy5leHQyJyBhbmQgJ21rZnMuZXh0MycgYXJlIGFsc28gcHJvdmlkZWQuCisKK2NvbmZpZyBUVU5FMkZTCisJYm9vbCAidHVuZTJmcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICB0dW5lMmZzIGFsbG93cyB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IgdG8gYWRqdXN0IHZhcmlvdXMgdHVuYWJsZQorCSAgZmlsZXN5c3RlbSBwYXJhbWV0ZXJzIG9uIExpbnV4IGV4dDIvZXh0MyBmaWxlc3lzdGVtcy4KKworY29uZmlnIEUyTEFCRUwKKwlib29sICJlMmxhYmVsIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFVORTJGUworCWhlbHAKKwkgIGUybGFiZWwgd2lsbCBkaXNwbGF5IG9yIGNoYW5nZSB0aGUgZmlsZXN5c3RlbSBsYWJlbCBvbiB0aGUgZXh0MgorCSAgZmlsZXN5c3RlbSBsb2NhdGVkIG9uIGRldmljZS4KKworY29uZmlnIEZJTkRGUworCWJvb2wgImZpbmRmcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFRVTkUyRlMKKwloZWxwCisJICBmaW5kZnMgd2lsbCBzZWFyY2ggdGhlIGRpc2tzIGluIHRoZSBzeXN0ZW0gbG9va2luZyBmb3IgYSBmaWxlc3lzdGVtCisJICB3aGljaCBoYXMgYSBsYWJlbCBtYXRjaGluZyBsYWJlbCBvciBhIFVVSUQgZXF1YWwgdG8gdXVpZC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvS2J1aWxkLnNyYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmMWEwZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxOCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19DSEFUVFIpICAgICArPSBjaGF0dHIubworbGliLSQoQ09ORklHX0UyRlNDSykgICAgICs9IGUyZnNjay5vIHV0aWwubworbGliLSQoQ09ORklHX0ZTQ0spICAgICAgICs9IGZzY2subyB1dGlsLm8KK2xpYi0kKENPTkZJR19MU0FUVFIpICAgICArPSBsc2F0dHIubworbGliLSQoQ09ORklHX01LRTJGUykgICAgICs9IG1rZTJmcy5vIHV0aWwubworbGliLSQoQ09ORklHX1RVTkUyRlMpICAgICs9IHR1bmUyZnMubyB1dGlsLm8KKworQ0ZMQUdTICs9IC1pbmNsdWRlICQoc3JjdHJlZSkvZTJmc3Byb2dzL2UyZnNiYi5oCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9SRUFETUUgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMDkwMQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL1JFQURNRQpAQCAtMCwwICsxLDMgQEAKK1RoaXMgaXMgYSBwcmV0dHkgc3RyYWlnaHQgcmlwIGZyb20gdGhlIGUyZnNwcm9ncyBwa2cuCisKK1NlZSBSRUFETUUncyBpbiBzdWJkaXJzIGZvciBzcGVjaWZpYyBpbmZvLgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvS2J1aWxkLnNyYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiNGQyNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyNiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK05FRURFRC0kKENPTkZJR19FMkZTQ0spID0geQorTkVFREVELSQoQ09ORklHX0ZTQ0spID0geQorTkVFREVELSQoQ09ORklHX01LRTJGUykgPSB5CitORUVERUQtJChDT05GSUdfVFVORTJGUykgPSB5CisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKE5FRURFRC15KSArPSBjYWNoZS5vIGRldi5vIGRldm5hbWUubyBkZXZuby5vIGJsa2lkX2dldHNpemUubyBcCisgICAgICAgICAgICAgICAgICAgcHJvYmUubyByZWFkLm8gcmVzb2x2ZS5vIHNhdmUubyB0YWcubyBsaXN0Lm8KKworQ0ZMQUdTX2Rldi5vICAgICA6PSAtaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvYnVzeWJveC5oCitDRkxBR1NfZGV2bmFtZS5vIDo9IC1pbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9idXN5Ym94LmgKK0NGTEFHU19kZXZuby5vICAgOj0gLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2J1c3lib3guaAorQ0ZMQUdTX2Jsa2lkX2dldHNpemUubyA6PSAtaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvYnVzeWJveC5oCitDRkxBR1NfcHJvYmUubyAgIDo9IC1pbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9idXN5Ym94LmgKK0NGTEFHU19zYXZlLm8gICAgOj0gLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2J1c3lib3guaAorQ0ZMQUdTX3RhZy5vICAgICA6PSAtaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvYnVzeWJveC5oCitDRkxBR1NfbGlzdC5vICAgIDo9IC1pbmNsdWRlICQoc3JjdHJlZSkvaW5jbHVkZS9idXN5Ym94LmgKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2MyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBibGtpZC5oIC0gSW50ZXJmYWNlIGZvciBsaWJibGtpZCwgYSBsaWJyYXJ5IHRvIGlkZW50aWZ5IGJsb2NrIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworI2lmbmRlZiBCTEtJRF9CTEtJRF9ICisjZGVmaW5lIEJMS0lEX0JMS0lEX0ggMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEJMS0lEX1ZFUlNJT04JIjEuMC4wIgorI2RlZmluZSBCTEtJRF9EQVRFCSIxMi1GZWItMjAwMyIKKwordHlwZWRlZiBzdHJ1Y3QgYmxraWRfc3RydWN0X2RldiAqYmxraWRfZGV2OwordHlwZWRlZiBzdHJ1Y3QgYmxraWRfc3RydWN0X2NhY2hlICpibGtpZF9jYWNoZTsKK3R5cGVkZWYgX19zNjQgYmxraWRfbG9mZl90OworCit0eXBlZGVmIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnX2l0ZXJhdGUgKmJsa2lkX3RhZ19pdGVyYXRlOwordHlwZWRlZiBzdHJ1Y3QgYmxraWRfc3RydWN0X2Rldl9pdGVyYXRlICpibGtpZF9kZXZfaXRlcmF0ZTsKKworLyoKKyAqIEZsYWdzIGZvciBibGtpZF9nZXRfZGV2CisgKgorICogQkxLSURfREVWX0NSRUFURQlDcmVhdGUgYW4gZW1wdHkgZGV2aWNlIHN0cnVjdHVyZSBpZiBub3QgZm91bmQKKyAqCQkJaW4gdGhlIGNhY2hlLgorICogQkxLSURfREVWX1ZFUklGWQlNYWtlIHN1cmUgdGhlIGRldmljZSBzdHJ1Y3R1cmUgY29ycmVzcG9uZHMKKyAqCQkJd2l0aCByZWFsaXR5LgorICogQkxLSURfREVWX0ZJTkQJSnVzdCBsb29rIHVwIGEgZGV2aWNlIGVudHJ5LCBhbmQgcmV0dXJuIE5VTEwKKyAqCQkJaWYgaXQgaXMgbm90IGZvdW5kLgorICogQkxLSURfREVWX05PUk1BTAlHZXQgYSB2YWxpZCBkZXZpY2Ugc3RydWN0dXJlLCBlaXRoZXIgZnJvbSB0aGUKKyAqCQkJY2FjaGUgb3IgYnkgcHJvYmluZyB0aGUgZGV2aWNlLgorICovCisjZGVmaW5lIEJMS0lEX0RFVl9GSU5ECQkweDAwMDAKKyNkZWZpbmUgQkxLSURfREVWX0NSRUFURQkweDAwMDEKKyNkZWZpbmUgQkxLSURfREVWX1ZFUklGWQkweDAwMDIKKyNkZWZpbmUgQkxLSURfREVWX05PUk1BTAkoQkxLSURfREVWX0NSRUFURSB8IEJMS0lEX0RFVl9WRVJJRlkpCisKKy8qIGNhY2hlLmMgKi8KK2V4dGVybiB2b2lkIGJsa2lkX3B1dF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSk7CitleHRlcm4gaW50IGJsa2lkX2dldF9jYWNoZShibGtpZF9jYWNoZSAqY2FjaGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyogZGV2LmMgKi8KK2V4dGVybiBjb25zdCBjaGFyICpibGtpZF9kZXZfZGV2bmFtZShibGtpZF9kZXYgZGV2KTsKKworZXh0ZXJuIGJsa2lkX2Rldl9pdGVyYXRlIGJsa2lkX2Rldl9pdGVyYXRlX2JlZ2luKGJsa2lkX2NhY2hlIGNhY2hlKTsKK2V4dGVybiBpbnQgYmxraWRfZGV2X3NldF9zZWFyY2goYmxraWRfZGV2X2l0ZXJhdGUgaXRlciwKKwkJCQljaGFyICpzZWFyY2hfdHlwZSwgY2hhciAqc2VhcmNoX3ZhbHVlKTsKK2V4dGVybiBpbnQgYmxraWRfZGV2X25leHQoYmxraWRfZGV2X2l0ZXJhdGUgaXRlcmF0ZSwgYmxraWRfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgYmxraWRfZGV2X2l0ZXJhdGVfZW5kKGJsa2lkX2Rldl9pdGVyYXRlIGl0ZXJhdGUpOworCisvKiBkZXZuby5jICovCitleHRlcm4gY2hhciAqYmxraWRfZGV2bm9fdG9fZGV2bmFtZShkZXZfdCBkZXZubyk7CisKKy8qIGRldm5hbWUuYyAqLworZXh0ZXJuIGludCBibGtpZF9wcm9iZV9hbGwoYmxraWRfY2FjaGUgY2FjaGUpOworZXh0ZXJuIGludCBibGtpZF9wcm9iZV9hbGxfbmV3KGJsa2lkX2NhY2hlIGNhY2hlKTsKK2V4dGVybiBibGtpZF9kZXYgYmxraWRfZ2V0X2RldihibGtpZF9jYWNoZSBjYWNoZSwgY29uc3QgY2hhciAqZGV2bmFtZSwKKwkJCSAgICAgICBpbnQgZmxhZ3MpOworCisvKiBnZXRzaXplLmMgKi8KK2V4dGVybiBibGtpZF9sb2ZmX3QgYmxraWRfZ2V0X2Rldl9zaXplKGludCBmZCk7CisKKy8qIHByb2JlLmMgKi8KK2ludCBibGtpZF9rbm93bl9mc3R5cGUoY29uc3QgY2hhciAqZnN0eXBlKTsKK2V4dGVybiBibGtpZF9kZXYgYmxraWRfdmVyaWZ5KGJsa2lkX2NhY2hlIGNhY2hlLCBibGtpZF9kZXYgZGV2KTsKKworLyogcmVhZC5jICovCisKKy8qIHJlc29sdmUuYyAqLworZXh0ZXJuIGNoYXIgKmJsa2lkX2dldF90YWdfdmFsdWUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnRhZ25hbWUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRldm5hbWUpOworZXh0ZXJuIGNoYXIgKmJsa2lkX2dldF9kZXZuYW1lKGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICp0b2tlbiwKKwkJCSAgICAgICBjb25zdCBjaGFyICp2YWx1ZSk7CisKKy8qIHRhZy5jICovCitleHRlcm4gYmxraWRfdGFnX2l0ZXJhdGUgYmxraWRfdGFnX2l0ZXJhdGVfYmVnaW4oYmxraWRfZGV2IGRldik7CitleHRlcm4gaW50IGJsa2lkX3RhZ19uZXh0KGJsa2lkX3RhZ19pdGVyYXRlIGl0ZXJhdGUsCisJCQkgICAgICBjb25zdCBjaGFyICoqdHlwZSwgY29uc3QgY2hhciAqKnZhbHVlKTsKK2V4dGVybiB2b2lkIGJsa2lkX3RhZ19pdGVyYXRlX2VuZChibGtpZF90YWdfaXRlcmF0ZSBpdGVyYXRlKTsKK2V4dGVybiBpbnQgYmxraWRfZGV2X2hhc190YWcoYmxraWRfZGV2IGRldiwgY29uc3QgY2hhciAqdHlwZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiBibGtpZF9kZXYgYmxraWRfZmluZF9kZXZfd2l0aF90YWcoYmxraWRfY2FjaGUgY2FjaGUsCisJCQkJCSBjb25zdCBjaGFyICp0eXBlLAorCQkJCQkgY29uc3QgY2hhciAqdmFsdWUpOworZXh0ZXJuIGludCBibGtpZF9wYXJzZV90YWdfc3RyaW5nKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICoqcmV0X3R5cGUsCisJCQkJICBjaGFyICoqcmV0X3ZhbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvYmxraWRQLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmIyYjQyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvYmxraWRQLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJsa2lkUC5oIC0gSW50ZXJuYWwgaW50ZXJmYWNlcyBmb3IgbGliYmxraWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworI2lmbmRlZiBCTEtJRF9CTEtJRFBfSAorI2RlZmluZSBCTEtJRF9CTEtJRFBfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxraWQuaCIKKyNpbmNsdWRlICJsaXN0LmgiCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBfX0JMS0lEX0FUVFIoeCkgX19hdHRyaWJ1dGVfXyh4KQorI2Vsc2UKKyNkZWZpbmUgX19CTEtJRF9BVFRSKHgpCisjZW5kaWYKKworCisvKgorICogVGhpcyBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBzcGVjaWZpYyBkZXZpY2UuCisgKiBXZSBjYW4gdHJhdmVyc2UgYWxsIG9mIHRoZSB0YWdzIGJ5IGJpZF90YWdzIChsaW5raW5nIHRvIHRoZSB0YWcgYml0X25hbWVzKS4KKyAqIFRoZSBiaWRfbGFiZWwgYW5kIGJpZF91dWlkIGZpZWxkcyBhcmUgc2hvcnRjdXRzIHRvIHRoZSBMQUJFTCBhbmQgVVVJRCB0YWcKKyAqIHZhbHVlcywgaWYgdGhleSBleGlzdC4KKyAqLworc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJpZF9kZXZzOwkvKiBBbGwgZGV2aWNlcyBpbiB0aGUgY2FjaGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJpZF90YWdzOwkvKiBBbGwgdGFncyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlibGtpZF9jYWNoZQkJYmlkX2NhY2hlOwkvKiBEZXYgYmVsb25ncyB0byB0aGlzIGNhY2hlICovCisJY2hhcgkJCSpiaWRfbmFtZTsJLyogRGV2aWNlIGlub2RlIHBhdGhuYW1lICovCisJY2hhcgkJCSpiaWRfdHlwZTsJLyogUHJlZmVycmVkIGRldmljZSBUWVBFICovCisJaW50CQkJYmlkX3ByaTsJLyogRGV2aWNlIHByaW9yaXR5ICovCisJZGV2X3QJCQliaWRfZGV2bm87CS8qIERldmljZSBtYWpvci9taW5vciBudW1iZXIgKi8KKwl0aW1lX3QJCQliaWRfdGltZTsJLyogTGFzdCB1cGRhdGUgdGltZSBvZiBkZXZpY2UgKi8KKwl1bnNpZ25lZCBpbnQJCWJpZF9mbGFnczsJLyogRGV2aWNlIHN0YXR1cyBiaXRmbGFncyAqLworCWNoYXIJCQkqYmlkX2xhYmVsOwkvKiBTaG9ydGN1dCB0byBkZXZpY2UgTEFCRUwgKi8KKwljaGFyCQkJKmJpZF91dWlkOwkvKiBTaG9ydGN1dCB0byBiaW5hcnkgVVVJRCAqLworfTsKKworI2RlZmluZSBCTEtJRF9CSURfRkxfVkVSSUZJRUQJMHgwMDAxCS8qIERldmljZSBkYXRhIHZhbGlkYXRlZCBmcm9tIGRpc2sgKi8KKyNkZWZpbmUgQkxLSURfQklEX0ZMX0lOVkFMSUQJMHgwMDA0CS8qIERldmljZSBpcyBpbnZhbGlkICovCisKKy8qCisgKiBFYWNoIHRhZyBkZWZpbmVzIGEgTkFNRT12YWx1ZSBwYWlyIGZvciBhIHBhcnRpY3VsYXIgZGV2aWNlLiAgVGhlIHRhZ3MKKyAqIGFyZSBsaW5rZWQgdmlhIGJpdF9uYW1lcyBmb3IgYSBzaW5nbGUgZGV2aWNlLCBzbyB0aGF0IHRyYXZlcnNpbmcgdGhlCisgKiBuYW1lcyBsaXN0IHdpbGwgZ2V0IHlvdSBhIGxpc3Qgb2YgYWxsIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgZGV2aWNlLgorICogVGhleSBhcmUgYWxzbyBsaW5rZWQgdmlhIGJpdF92YWx1ZXMgZm9yIGFsbCBkZXZpY2VzLCBzbyBvbmUgY2FuIGVhc2lseQorICogc2VhcmNoIGFsbCB0YWdzIHdpdGggYSBnaXZlbiBOQU1FIGZvciBhIHNwZWNpZmljIHZhbHVlLgorICovCitzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZworeworCXN0cnVjdCBsaXN0X2hlYWQJYml0X3RhZ3M7CS8qIEFsbCB0YWdzIGZvciB0aGlzIGRldmljZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYml0X25hbWVzOwkvKiBBbGwgdGFncyB3aXRoIGdpdmVuIE5BTUUgKi8KKwljaGFyCQkJKmJpdF9uYW1lOwkvKiBOQU1FIG9mIHRhZyAoc2hhcmVkKSAqLworCWNoYXIJCQkqYml0X3ZhbDsJLyogdmFsdWUgb2YgdGFnICovCisJYmxraWRfZGV2CQliaXRfZGV2OwkvKiBwb2ludGVyIHRvIGRldmljZSAqLworfTsKK3R5cGVkZWYgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcgKmJsa2lkX3RhZzsKKworLyoKKyAqIE1pbmltdW0gbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBkZXZpY2UgcHJvYmVzLCBldmVuIHdoZW4gcmVhZGluZworICogZnJvbSB0aGUgY2FjaGUuICBUaGlzIGlzIHRvIGF2b2lkIHJlLXByb2JpbmcgYWxsIGRldmljZXMgd2hpY2ggd2VyZQorICoganVzdCBwcm9iZWQgYnkgYW5vdGhlciBwcm9ncmFtIHRoYXQgZG9lcyBub3Qgc2hhcmUgdGhlIGNhY2hlLgorICovCisjZGVmaW5lIEJMS0lEX1BST0JFX01JTgkJMgorCisvKgorICogVGltZSBpbiBzZWNvbmRzIGFuIGVudHJ5IHJlbWFpbnMgdmVyaWZpZWQgaW4gdGhlIGluLW1lbW9yeSBjYWNoZQorICogYmVmb3JlIGJlaW5nIHJldmVyaWZpZWQgKGluIGNhc2Ugb2YgbG9uZy1ydW5uaW5nIHByb2Nlc3NlcyB0aGF0CisgKiBrZWVwIGEgY2FjaGUgaW4gbWVtb3J5IGFuZCBjb250aW51ZSB0byB1c2UgaXQgZm9yIGEgbG9uZyB0aW1lKS4KKyAqLworI2RlZmluZSBCTEtJRF9QUk9CRV9JTlRFUlZBTAkyMDAKKworLyogVGhpcyBkZXNjcmliZXMgYW4gZW50aXJlIGJsa2lkIGNhY2hlIGZpbGUgYW5kIHByb2JlZCBkZXZpY2VzLgorICogV2UgY2FuIHRyYXZlcnNlIGFsbCBvZiB0aGUgZm91bmQgZGV2aWNlcyB2aWEgYmljX2xpc3QuCisgKiBXZSBjYW4gdHJhdmVyc2UgYWxsIG9mIHRoZSB0YWcgdHlwZXMgYnkgYmljX3RhZ3MsIHdoaWNoIGhvbGQgZW1wdHkgdGFncworICogZm9yIGVhY2ggdGFnIHR5cGUuICBUaG9zZSB0YWdzIGNhbiBiZSB1c2VkIGFzIGxpc3RfaGVhZHMgZm9yIGl0ZXJhdGluZworICogdGhyb3VnaCBhbGwgZGV2aWNlcyB3aXRoIGEgc3BlY2lmaWMgdGFnIHR5cGUgKGUuZy4gTEFCRUwpLgorICovCitzdHJ1Y3QgYmxraWRfc3RydWN0X2NhY2hlCit7CisJc3RydWN0IGxpc3RfaGVhZAliaWNfZGV2czsJLyogTGlzdCBoZWFkIG9mIGFsbCBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZAliaWNfdGFnczsJLyogTGlzdCBoZWFkIG9mIGFsbCB0YWcgdHlwZXMgKi8KKwl0aW1lX3QJCQliaWNfdGltZTsJLyogTGFzdCBwcm9iZSB0aW1lICovCisJdGltZV90CQkJYmljX2Z0aW1lOwkvKiBNb2QgdGltZSBvZiB0aGUgY2FjaGVmaWxlICovCisJdW5zaWduZWQgaW50CQliaWNfZmxhZ3M7CS8qIFN0YXR1cyBmbGFncyBvZiB0aGUgY2FjaGUgKi8KKwljaGFyCQkJKmJpY19maWxlbmFtZTsJLyogZmlsZW5hbWUgb2YgY2FjaGUgKi8KK307CisKKyNkZWZpbmUgQkxLSURfQklDX0ZMX1BST0JFRAkweDAwMDIJLyogV2UgcHJvYmVkIC9wcm9jL3BhcnRpdGlvbiBkZXZpY2VzICovCisjZGVmaW5lIEJMS0lEX0JJQ19GTF9DSEFOR0VECTB4MDAwNAkvKiBDYWNoZSBoYXMgY2hhbmdlZCBmcm9tIGRpc2sgKi8KKworZXh0ZXJuIGNoYXIgKmJsa2lkX3N0cmR1cChjb25zdCBjaGFyICpzKTsKK2V4dGVybiBjaGFyICpibGtpZF9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGludCBsZW5ndGgpOworCisjZGVmaW5lIEJMS0lEX0NBQ0hFX0ZJTEUgIi9ldGMvYmxraWQudGFiIgorZXh0ZXJuIGNvbnN0IGNoYXIgKmJsa2lkX2RldmRpcnNbXTsKKworI2RlZmluZSBCTEtJRF9FUlJfSU8JIDUKKyNkZWZpbmUgQkxLSURfRVJSX1BST0MJIDkKKyNkZWZpbmUgQkxLSURfRVJSX01FTQkxMgorI2RlZmluZSBCTEtJRF9FUlJfQ0FDSEUJMTQKKyNkZWZpbmUgQkxLSURfRVJSX0RFVgkxOQorI2RlZmluZSBCTEtJRF9FUlJfUEFSQU0JMjIKKyNkZWZpbmUgQkxLSURfRVJSX0JJRwkyNworCisvKgorICogUHJpb3JpdHkgc2V0dGluZ3MgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBkZXZpY2VzCisgKi8KKyNkZWZpbmUgQkxLSURfUFJJX0VWTVMJMzAKKyNkZWZpbmUgQkxLSURfUFJJX0xWTQkyMAorI2RlZmluZSBCTEtJRF9QUklfTUQJMTAKKworI2lmIGRlZmluZWQoVEVTVF9QUk9HUkFNKSAmJiAhZGVmaW5lZChDT05GSUdfQkxLSURfREVCVUcpCisjZGVmaW5lIENPTkZJR19CTEtJRF9ERUJVRworI2VuZGlmCisKKyNkZWZpbmUgREVCVUdfQ0FDSEUJMHgwMDAxCisjZGVmaW5lIERFQlVHX0RVTVAJMHgwMDAyCisjZGVmaW5lIERFQlVHX0RFVgkweDAwMDQKKyNkZWZpbmUgREVCVUdfREVWTkFNRQkweDAwMDgKKyNkZWZpbmUgREVCVUdfREVWTk8JMHgwMDEwCisjZGVmaW5lIERFQlVHX1BST0JFCTB4MDAyMAorI2RlZmluZSBERUJVR19SRUFECTB4MDA0MAorI2RlZmluZSBERUJVR19SRVNPTFZFCTB4MDA4MAorI2RlZmluZSBERUJVR19TQVZFCTB4MDEwMAorI2RlZmluZSBERUJVR19UQUcJMHgwMjAwCisjZGVmaW5lIERFQlVHX0lOSVQJMHg4MDAwCisjZGVmaW5lIERFQlVHX0FMTAkweEZGRkYKKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CitleHRlcm4gaW50ICAgICAgYmxraWRfZGVidWdfbWFzazsKKyNkZWZpbmUgREJHKG0seCkJaWYgKChtKSAmIGJsa2lkX2RlYnVnX21hc2spIHg7CisjZWxzZQorI2RlZmluZSBEQkcobSx4KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkxLSURfREVCVUcKK2V4dGVybiB2b2lkIGJsa2lkX2RlYnVnX2R1bXBfZGV2KGJsa2lkX2RldiBkZXYpOworZXh0ZXJuIHZvaWQgYmxraWRfZGVidWdfZHVtcF90YWcoYmxraWRfdGFnIHRhZyk7CisjZW5kaWYKKworLyogbHNlZWsuYyAqLworLyogZXh0ZXJuIGJsa2lkX2xvZmZfdCBibGtpZF9sbHNlZWsoaW50IGZkLCBibGtpZF9sb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsgKi8KKyNpZmRlZiBDT05GSUdfTEZTCisjIGRlZmluZSBibGtpZF9sbHNlZWsgbHNlZWs2NAorI2Vsc2UKKyMgZGVmaW5lIGJsa2lkX2xsc2VlayBsc2VlaworI2VuZGlmCisKKy8qIHJlYWQuYyAqLworZXh0ZXJuIHZvaWQgYmxraWRfcmVhZF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSk7CisKKy8qIHNhdmUuYyAqLworZXh0ZXJuIGludCBibGtpZF9mbHVzaF9jYWNoZShibGtpZF9jYWNoZSBjYWNoZSk7CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGFuZCBmaW5kIGEgc3BlY2lmaWMgdGFnIHR5cGU6IHRhZy5jCisgKi8KK2V4dGVybiB2b2lkIGJsa2lkX2ZyZWVfdGFnKGJsa2lkX3RhZyB0YWcpOworZXh0ZXJuIGJsa2lkX3RhZyBibGtpZF9maW5kX3RhZ19kZXYoYmxraWRfZGV2IGRldiwgY29uc3QgY2hhciAqdHlwZSk7CitleHRlcm4gaW50IGJsa2lkX3NldF90YWcoYmxraWRfZGV2IGRldiwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgaW50IHZsZW5ndGgpOworCisvKgorICogRnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQgZmluZCBhIHNwZWNpZmljIHRhZyB0eXBlOiBkZXYuYworICovCitleHRlcm4gYmxraWRfZGV2IGJsa2lkX25ld19kZXYodm9pZCk7CitleHRlcm4gdm9pZCBibGtpZF9mcmVlX2RldihibGtpZF9kZXYgZGV2KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZF9nZXRzaXplLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9ibGtpZF9nZXRzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmNmJhNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Jsa2lkX2dldHNpemUuYwpAQCAtMCwwICsxLDE3OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZ2V0c2l6ZS5jIC0tLSBnZXQgdGhlIHNpemUgb2YgYSBwYXJ0aXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisvKiBpbmNsdWRlIHRoaXMgYmVmb3JlIHN5cy9xdWV1ZXMuaCEgKi8KKyNpbmNsdWRlICJibGtpZFAuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9MSU5VWF9GRF9ICisjaW5jbHVkZSA8bGludXgvZmQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tMQUJFTF9ICisjaW5jbHVkZSA8c3lzL2Rpc2tsYWJlbC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19ESVNLX0gKKyNpZmRlZiBIQVZFX1NZU19RVUVVRV9ICisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+IC8qIGZvciBMSVNUX0hFQUQgKi8KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9kaXNrLmg+CisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfSU8pICYmICFkZWZpbmVkKEJMS0dFVFNJWkUpCisjZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfSU9SKSAmJiAhZGVmaW5lZChCTEtHRVRTSVpFNjQpCisjZGVmaW5lIEJMS0dFVFNJWkU2NCBfSU9SKDB4MTIsMTE0LHNpemVfdCkJLyogcmV0dXJuIGRldmljZSBzaXplIGluIGJ5dGVzICh1NjQgKmFyZykgKi8KKyNlbmRpZgorCisjaWZkZWYgQVBQTEVfREFSV0lOCisjZGVmaW5lIEJMS0dFVFNJWkUgREtJT0NHRVRCTE9DS0NPVU5UMzIKKyNlbmRpZiAvKiBBUFBMRV9EQVJXSU4gKi8KKworc3RhdGljIGludCB2YWxpZF9vZmZzZXQoaW50IGZkLCBibGtpZF9sb2ZmX3Qgb2Zmc2V0KQoreworCWNoYXIgY2g7CisKKwlpZiAoYmxraWRfbGxzZWVrKGZkLCBvZmZzZXQsIDApIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKHJlYWQoZmQsICZjaCwgMSkgPCAxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gYSBwYXJ0aXRpb24KKyAqLworYmxraWRfbG9mZl90IGJsa2lkX2dldF9kZXZfc2l6ZShpbnQgZmQpCit7CisJaW50IHZhbGlkX2Jsa2dldHNpemU2NCA9IDE7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0CQl1dHNuYW1lIHV0OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBsb25nIHNpemU2NDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJYmxraWRfbG9mZl90IGhpZ2gsIGxvdzsKKyNpZmRlZiBGREdFVFBSTQorCXN0cnVjdCBmbG9wcHlfc3RydWN0IHRoaXNfZmxvcHB5OworI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfRElTS0xBQkVMX0gKKwlpbnQgcGFydCA9IC0xOworCXN0cnVjdCBkaXNrbGFiZWwgbGFiOworCXN0cnVjdCBwYXJ0aXRpb24gKnBwOworCWNoYXIgY2g7CisJc3RydWN0IHN0YXQgc3Q7CisjZW5kaWYgLyogSEFWRV9TWVNfRElTS0xBQkVMX0ggKi8KKworI2lmZGVmIERLSU9DR0VUQkxPQ0tDT1VOVAkvKiBGb3IgQXBwbGUgRGFyd2luICovCisJaWYgKGlvY3RsKGZkLCBES0lPQ0dFVEJMT0NLQ09VTlQsICZzaXplNjQpID49IDApIHsKKwkJaWYgKChzaXplb2YoYmxraWRfbG9mZl90KSA8IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKQorCQkgICAgJiYgKHNpemU2NCA8PCA5ID4gMHhGRkZGRkZGRikpCisJCQlyZXR1cm4gMDsgLyogRUZCSUcgKi8KKwkJcmV0dXJuIChibGtpZF9sb2ZmX3QpIHNpemU2NCA8PCA5OworCX0KKyNlbmRpZgorCisjaWZkZWYgQkxLR0VUU0laRTY0CisjaWZkZWYgX19saW51eF9fCisJdW5hbWUoJnV0KTsKKwlpZiAoKHV0LnJlbGVhc2VbMF0gPT0gJzInKSAmJiAodXQucmVsZWFzZVsxXSA9PSAnLicpICYmCisJICAgICAodXQucmVsZWFzZVsyXSA8ICc2JykgJiYgKHV0LnJlbGVhc2VbM10gPT0gJy4nKSkKKwkJdmFsaWRfYmxrZ2V0c2l6ZTY0ID0gMDsKKyNlbmRpZgorCWlmICh2YWxpZF9ibGtnZXRzaXplNjQgJiYKKwkgICAgaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJnNpemU2NCkgPj0gMCkgeworCQlpZiAoKHNpemVvZihibGtpZF9sb2ZmX3QpIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpCisJCSAgICAmJiAoKHNpemU2NCkgPiAweEZGRkZGRkZGKSkKKwkJCXJldHVybiAwOyAvKiBFRkJJRyAqLworCQlyZXR1cm4gc2l6ZTY0OworCX0KKyNlbmRpZgorCisjaWZkZWYgQkxLR0VUU0laRQorCWlmIChpb2N0bChmZCwgQkxLR0VUU0laRSwgJnNpemUpID49IDApCisJCXJldHVybiAoYmxraWRfbG9mZl90KXNpemUgPDwgOTsKKyNlbmRpZgorCisjaWZkZWYgRkRHRVRQUk0KKwlpZiAoaW9jdGwoZmQsIEZER0VUUFJNLCAmdGhpc19mbG9wcHkpID49IDApCisJCXJldHVybiAoYmxraWRfbG9mZl90KXRoaXNfZmxvcHB5LnNpemUgPDwgOTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0RJU0tMQUJFTF9ICisjaWYgMAorCS8qCisJICogVGhpcyBzaG91bGQgd29yayBpbiB0aGVvcnkgYnV0IEkgaGF2ZW4ndCB0ZXN0ZWQgaXQuICBBbnlvbmUKKwkgKiBvbiBhIEJTRCBzeXN0ZW0gd2FudCB0byB0ZXN0IHRoaXMgZm9yIG1lPyAgSW4gdGhlIG1lYW50aW1lLAorCSAqIGJpbmFyeSBzZWFyY2ggbWVjaGFuaXNtIHNob3VsZCB3b3JrIGp1c3QgZmluZS4KKwkgKi8KKwlpZiAoKGZzdGF0KGZkLCAmc3QpID49IDApICYmIFNfSVNCTEsoc3Quc3RfbW9kZSkpCisJCXBhcnQgPSBzdC5zdF9yZGV2ICYgNzsKKwlpZiAocGFydCA+PSAwICYmIChpb2N0bChmZCwgRElPQ0dESU5GTywgKGNoYXIgKikmbGFiKSA+PSAwKSkgeworCQlwcCA9ICZsYWIuZF9wYXJ0aXRpb25zW3BhcnRdOworCQlpZiAocHAtPnBfc2l6ZSkKKwkJCXJldHVybiBwcC0+cF9zaXplIDw8IDk7CisJfQorI2VuZGlmCisjZW5kaWYgLyogSEFWRV9TWVNfRElTS0xBQkVMX0ggKi8KKworCS8qCisJICogT0ssIHdlIGNvdWxkbid0IGZpZ3VyZSBpdCBvdXQgYnkgdXNpbmcgYSBzcGVjaWFsaXplZCBpb2N0bCwKKwkgKiB3aGljaCBpcyBnZW5lcmFsbHkgdGhlIGJlc3Qgd2F5LiAgU28gZG8gYmluYXJ5IHNlYXJjaCB0bworCSAqIGZpbmQgdGhlIHNpemUgb2YgdGhlIHBhcnRpdGlvbi4KKwkgKi8KKwlsb3cgPSAwOworCWZvciAoaGlnaCA9IDEwMjQ7IHZhbGlkX29mZnNldChmZCwgaGlnaCk7IGhpZ2ggKj0gMikKKwkJbG93ID0gaGlnaDsKKwl3aGlsZSAobG93IDwgaGlnaCAtIDEpCisJeworCQljb25zdCBibGtpZF9sb2ZmX3QgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKworCQlpZiAodmFsaWRfb2Zmc2V0KGZkLCBtaWQpKQorCQkJbG93ID0gbWlkOworCQllbHNlCisJCQloaWdoID0gbWlkOworCX0KKwlyZXR1cm4gbG93ICsgMTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa2lkX2xvZmZfdCBieXRlczsKKwlpbnQJZmQ7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZGV2aWNlXG4iCisJCQkiRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgZGV2aWNlXG4iLCBhcmd2WzBdKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChmZCA9IG9wZW4oYXJndlsxXSwgT19SRE9OTFkpKSA8IDApCisJCXBlcnJvcihhcmd2WzBdKTsKKworCWJ5dGVzID0gYmxraWRfZ2V0X2Rldl9zaXplKGZkKTsKKwlwcmludGYoIkRldmljZSAlcyBoYXMgJWxsZCAxayBibG9ja3MuXG4iLCBhcmd2WzFdLCBieXRlcyA+PiAxMCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvY2FjaGUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkMjkxNAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2NhY2hlLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNhY2hlLmMgLSBhbGxvY2F0aW9uL2luaXRpYWxpemF0aW9uL2ZyZWUgcm91dGluZXMgZm9yIGNhY2hlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImJsa2lkUC5oIgorCitpbnQgYmxraWRfZGVidWdfbWFzayA9IDA7CisKK2ludCBibGtpZF9nZXRfY2FjaGUoYmxraWRfY2FjaGUgKnJldF9jYWNoZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJYmxraWRfY2FjaGUgY2FjaGU7CisKKyNpZmRlZiBDT05GSUdfQkxLSURfREVCVUcKKwlpZiAoIShibGtpZF9kZWJ1Z19tYXNrICYgREVCVUdfSU5JVCkpIHsKKwkJY2hhciAqZHN0ciA9IGdldGVudigiQkxLSURfREVCVUciKTsKKworCQlpZiAoZHN0cikKKwkJCWJsa2lkX2RlYnVnX21hc2sgPSBzdHJ0b3VsKGRzdHIsIDAsIDApOworCQlibGtpZF9kZWJ1Z19tYXNrIHw9IERFQlVHX0lOSVQ7CisJfQorI2VuZGlmCisKKwlEQkcoREVCVUdfQ0FDSEUsIHByaW50ZigiY3JlYXRpbmcgYmxraWQgY2FjaGUgKHVzaW5nICVzKVxuIiwKKwkJCQlmaWxlbmFtZSA/IGZpbGVuYW1lIDogImRlZmF1bHQgY2FjaGUiKSk7CisKKwljYWNoZSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibGtpZF9zdHJ1Y3RfY2FjaGUpKTsKKworCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+YmljX2RldnMpOworCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+YmljX3RhZ3MpOworCisJaWYgKGZpbGVuYW1lICYmICFzdHJsZW4oZmlsZW5hbWUpKQorCQlmaWxlbmFtZSA9IDA7CisJaWYgKCFmaWxlbmFtZSAmJiAoZ2V0dWlkKCkgPT0gZ2V0ZXVpZCgpKSkKKwkJZmlsZW5hbWUgPSBnZXRlbnYoIkJMS0lEX0ZJTEUiKTsKKwlpZiAoIWZpbGVuYW1lKQorCQlmaWxlbmFtZSA9IEJMS0lEX0NBQ0hFX0ZJTEU7CisJY2FjaGUtPmJpY19maWxlbmFtZSA9IGJsa2lkX3N0cmR1cChmaWxlbmFtZSk7CisKKwlibGtpZF9yZWFkX2NhY2hlKGNhY2hlKTsKKworCSpyZXRfY2FjaGUgPSBjYWNoZTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBibGtpZF9wdXRfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuOworCisJKHZvaWQpIGJsa2lkX2ZsdXNoX2NhY2hlKGNhY2hlKTsKKworCURCRyhERUJVR19DQUNIRSwgcHJpbnRmKCJmcmVlaW5nIGNhY2hlIHN0cnVjdFxuIikpOworCisJLyogREJHKERFQlVHX0NBQ0hFLCBibGtpZF9kZWJ1Z19kdW1wX2NhY2hlKGNhY2hlKSk7ICovCisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhY2hlLT5iaWNfZGV2cykpIHsKKwkJYmxraWRfZGV2IGRldiA9IGxpc3RfZW50cnkoY2FjaGUtPmJpY19kZXZzLm5leHQsCisJCQkJCSAgIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LAorCQkJCQkgICAgYmlkX2RldnMpOworCQlibGtpZF9mcmVlX2RldihkZXYpOworCX0KKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2FjaGUtPmJpY190YWdzKSkgeworCQlibGtpZF90YWcgdGFnID0gbGlzdF9lbnRyeShjYWNoZS0+YmljX3RhZ3MubmV4dCwKKwkJCQkJICAgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsCisJCQkJCSAgIGJpdF90YWdzKTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRhZy0+Yml0X25hbWVzKSkgeworCQkJYmxraWRfdGFnIGJhZCA9IGxpc3RfZW50cnkodGFnLT5iaXRfbmFtZXMubmV4dCwKKwkJCQkJCSAgIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLAorCQkJCQkJICAgYml0X25hbWVzKTsKKworCQkJREJHKERFQlVHX0NBQ0hFLCBwcmludGYoIndhcm5pbmc6IHVuZnJlZWQgdGFnICVzPSVzXG4iLAorCQkJCQkJYmFkLT5iaXRfbmFtZSwgYmFkLT5iaXRfdmFsKSk7CisJCQlibGtpZF9mcmVlX3RhZyhiYWQpOworCQl9CisJCWJsa2lkX2ZyZWVfdGFnKHRhZyk7CisJfQorCWZyZWUoY2FjaGUtPmJpY19maWxlbmFtZSk7CisKKwlmcmVlKGNhY2hlKTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCWJsa2lkX2NhY2hlIGNhY2hlID0gTlVMTDsKKwlpbnQgcmV0OworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoKGFyZ2MgPiAyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbZmlsZW5hbWVdXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGFyZ3ZbMV0pKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciAlZCBwYXJzaW5nIGNhY2hlIGZpbGUgJXNcbiIsIHJldCwKKwkJCWFyZ3ZbMV0gPyBhcmd2WzFdIDogQkxLSURfQ0FDSEVfRklMRSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgYmJfZGV2X251bGwpKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGNyZWF0aW5nIGNhY2hlICglZClcbiIsCisJCQlhcmd2WzBdLCByZXQpOworCQlleGl0KDEpOworCX0KKwlpZiAoKHJldCA9IGJsa2lkX3Byb2JlX2FsbChjYWNoZSkgPCAwKSkKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciBwcm9iaW5nIGRldmljZXNcbiIpOworCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Rldi5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwY2M5MQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Rldi5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkZXYuYyAtIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb24vZnJlZSByb3V0aW5lcyBmb3IgZGV2CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYmxraWRQLmgiCisKK2Jsa2lkX2RldiBibGtpZF9uZXdfZGV2KHZvaWQpCit7CisJYmxraWRfZGV2IGRldjsKKworCWRldiA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2KSk7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5iaWRfZGV2cyk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+YmlkX3RhZ3MpOworCisJcmV0dXJuIGRldjsKK30KKwordm9pZCBibGtpZF9mcmVlX2RldihibGtpZF9kZXYgZGV2KQoreworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlEQkcoREVCVUdfREVWLAorCSAgICBwcmludGYoIiAgZnJlZWluZyBkZXYgJXMgKCVzKVxuIiwgZGV2LT5iaWRfbmFtZSwgZGV2LT5iaWRfdHlwZSkpOworCURCRyhERUJVR19ERVYsIGJsa2lkX2RlYnVnX2R1bXBfZGV2KGRldikpOworCisJbGlzdF9kZWwoJmRldi0+YmlkX2RldnMpOworCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2LT5iaWRfdGFncykpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkoZGV2LT5iaWRfdGFncy5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywKKwkJCQkJICAgYml0X3RhZ3MpOworCQlibGtpZF9mcmVlX3RhZyh0YWcpOworCX0KKwlpZiAoZGV2LT5iaWRfbmFtZSkKKwkJZnJlZShkZXYtPmJpZF9uYW1lKTsKKwlmcmVlKGRldik7Cit9CisKKy8qCisgKiBHaXZlbiBhIGJsa2lkIGRldmljZSwgcmV0dXJuIGl0cyBuYW1lCisgKi8KK2NvbnN0IGNoYXIgKmJsa2lkX2Rldl9kZXZuYW1lKGJsa2lkX2RldiBkZXYpCit7CisJcmV0dXJuIGRldi0+YmlkX25hbWU7Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLSURfREVCVUcKK3ZvaWQgYmxraWRfZGVidWdfZHVtcF9kZXYoYmxraWRfZGV2IGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRmKCIgIGRldjogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiAgZGV2OiBuYW1lID0gJXNcbiIsIGRldi0+YmlkX25hbWUpOworCXByaW50ZigiICBkZXY6IERFVk5PPVwiMHglMGxseFwiXG4iLCBkZXYtPmJpZF9kZXZubyk7CisJcHJpbnRmKCIgIGRldjogVElNRT1cIiVsdVwiXG4iLCBkZXYtPmJpZF90aW1lKTsKKwlwcmludGYoIiAgZGV2OiBQUkk9XCIlZFwiXG4iLCBkZXYtPmJpZF9wcmkpOworCXByaW50ZigiICBkZXY6IGZsYWdzID0gMHglMDhYXG4iLCBkZXYtPmJpZF9mbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZkZXYtPmJpZF90YWdzKSB7CisJCWJsa2lkX3RhZyB0YWcgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLCBiaXRfdGFncyk7CisJCWlmICh0YWcpCisJCQlwcmludGYoIiAgICB0YWc6ICVzPVwiJXNcIlxuIiwgdGFnLT5iaXRfbmFtZSwKKwkJCSAgICAgICB0YWctPmJpdF92YWwpOworCQllbHNlCisJCQlwcmludGYoIiAgICB0YWc6IE5VTExcbiIpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworfQorI2VuZGlmCisKKy8qCisgKiBkZXYgaXRlcmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgcHVibGljIGxpYmJsa2lkIGludGVyZmFjZS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBkbyBub3QgZXhwb3NlIHRoZSBsaXN0LmggaW1wbGVtZW50YXRpb24sIHdoaWNoIGFyZSBhCisgKiBjb250YW1pbmF0aW9uIG9mIHRoZSBuYW1lc3BhY2UsIGFuZCB3aGljaCBmb3JjZSB1cyB0byByZXZlYWwgZmFyLCBmYXIKKyAqIHRvbyBtdWNoIG9mIG91ciBpbnRlcm5hbCBpbXBsZW1lbmF0aW9uLiAgSSdtIG5vdCBjb252aW5jZWQgSSB3YW50CisgKiB0byBrZWVwIGxpc3QuaCBpbiB0aGUgbG9uZyB0ZXJtLCBhbnl3YXkuICBJdCdzIGZpbmUgZm9yIGtlcm5lbAorICogcHJvZ3JhbW1pbmcsIGJ1dCBwZXJmb3JtYW5jZSBpcyBub3QgdGhlICMxIHByaW9yaXR5IGZvciB0aGlzCisgKiBsaWJyYXJ5LCBhbmQgSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGUgdHJhZGVvZmYgb2YgdHlwZS1zYWZldHkgZm9yCisgKiBwZXJmb3JtYW5jZSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIFt0eXRzbzoyMDAzMDEyNS4yMDA3RVNUXQorICovCisKKy8qCisgKiBUaGlzIHNlcmllcyBvZiBmdW5jdGlvbnMgaXRlcmF0ZSBvdmVyIGFsbCBkZXZpY2VzIGluIGEgYmxraWQgY2FjaGUKKyAqLworI2RlZmluZSBERVZfSVRFUkFURV9NQUdJQwkweDAxYTUyODRjCisKK3N0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2X2l0ZXJhdGUgeworCWludAkJCW1hZ2ljOworCWJsa2lkX2NhY2hlCQljYWNoZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwOworfTsKKworYmxraWRfZGV2X2l0ZXJhdGUgYmxraWRfZGV2X2l0ZXJhdGVfYmVnaW4oYmxraWRfY2FjaGUgY2FjaGUpCit7CisJYmxraWRfZGV2X2l0ZXJhdGUJaXRlcjsKKworCWl0ZXIgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxraWRfc3RydWN0X2Rldl9pdGVyYXRlKSk7CisJaXRlci0+bWFnaWMgPSBERVZfSVRFUkFURV9NQUdJQzsKKwlpdGVyLT5jYWNoZSA9IGNhY2hlOworCWl0ZXItPnAJPSBjYWNoZS0+YmljX2RldnMubmV4dDsKKwlyZXR1cm4gaXRlcjsKK30KKworLyoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKi8KK2V4dGVybiBpbnQgYmxraWRfZGV2X25leHQoYmxraWRfZGV2X2l0ZXJhdGUgaXRlciwKKwkJCSAgYmxraWRfZGV2ICpkZXYpCit7CisJKmRldiA9IDA7CisJaWYgKCFpdGVyIHx8IGl0ZXItPm1hZ2ljICE9IERFVl9JVEVSQVRFX01BR0lDIHx8CisJICAgIGl0ZXItPnAgPT0gJml0ZXItPmNhY2hlLT5iaWNfZGV2cykKKwkJcmV0dXJuIC0xOworCSpkZXYgPSBsaXN0X2VudHJ5KGl0ZXItPnAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfZGV2LCBiaWRfZGV2cyk7CisJaXRlci0+cCA9IGl0ZXItPnAtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmxraWRfZGV2X2l0ZXJhdGVfZW5kKGJsa2lkX2Rldl9pdGVyYXRlIGl0ZXIpCit7CisJaWYgKCFpdGVyIHx8IGl0ZXItPm1hZ2ljICE9IERFVl9JVEVSQVRFX01BR0lDKQorCQlyZXR1cm47CisJaXRlci0+bWFnaWMgPSAwOworCWZyZWUoaXRlcik7Cit9CisKKyNpZmRlZiBURVNUX1BST0dSQU0KKyNpZmRlZiBIQVZFX0dFVE9QVF9ICisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZWxzZQorZXh0ZXJuIGNoYXIgKm9wdGFyZzsKK2V4dGVybiBpbnQgb3B0aW5kOworI2VuZGlmCisKK3ZvaWQgdXNhZ2UoY2hhciAqcHJvZykKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWYgYmxraWRfZmlsZV0gWy1tIGRlYnVnX21hc2tdXG4iLCBwcm9nKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0TGlzdCBhbGwgZGV2aWNlcyBhbmQgZXhpdFxuIiwgcHJvZyk7CisJZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa2lkX2Rldl9pdGVyYXRlCWl0ZXI7CisJYmxraWRfY2FjaGUJCWNhY2hlID0gTlVMTDsKKwlibGtpZF9kZXYJCWRldjsKKwlpbnQJCQljLCByZXQ7CisJY2hhcgkJCSp0bXA7CisJY2hhcgkJCSpmaWxlID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF90eXBlID0gTlVMTDsKKwljaGFyCQkJKnNlYXJjaF92YWx1ZSA9IE5VTEw7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJtOmY6IikpICE9IEVPRikKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2YnOgorCQkJZmlsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWJsa2lkX2RlYnVnX21hc2sgPSBzdHJ0b3VsIChvcHRhcmcsICZ0bXAsIDApOworCQkJaWYgKCp0bXApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZGVidWcgbWFzazogJWRcbiIsCisJCQkJCW9wdGFyZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQl9CisJaWYgKGFyZ2MgPj0gb3B0aW5kKzIpIHsKKwkJc2VhcmNoX3R5cGUgPSBhcmd2W29wdGluZF07CisJCXNlYXJjaF92YWx1ZSA9IGFyZ3Zbb3B0aW5kKzFdOworCQlvcHRpbmQgKz0gMjsKKwl9CisJaWYgKGFyZ2MgIT0gb3B0aW5kKQorCQl1c2FnZShhcmd2WzBdKTsKKworCWlmICgocmV0ID0gYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgZmlsZSkpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgY3JlYXRpbmcgY2FjaGUgKCVkKVxuIiwKKwkJCWFyZ3ZbMF0sIHJldCk7CisJCWV4aXQoMSk7CisJfQorCisJaXRlciA9IGJsa2lkX2Rldl9pdGVyYXRlX2JlZ2luKGNhY2hlKTsKKwlpZiAoc2VhcmNoX3R5cGUpCisJCWJsa2lkX2Rldl9zZXRfc2VhcmNoKGl0ZXIsIHNlYXJjaF90eXBlLCBzZWFyY2hfdmFsdWUpOworCXdoaWxlIChibGtpZF9kZXZfbmV4dChpdGVyLCAmZGV2KSA9PSAwKSB7CisJCXByaW50ZigiRGV2aWNlOiAlc1xuIiwgYmxraWRfZGV2X2Rldm5hbWUoZGV2KSk7CisJfQorCWJsa2lkX2Rldl9pdGVyYXRlX2VuZChpdGVyKTsKKworCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvZGV2bmFtZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvZGV2bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDkyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9kZXZuYW1lLmMKQEAgLTAsMCArMSwzNjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRldm5hbWUuYyAtIGdldCBhIGRldiBieSBpdHMgZGV2aWNlIGlub2RlIG5hbWUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJpZXMgQnJvdXdlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJibGtpZFAuaCIKKworLyoKKyAqIEZpbmQgYSBkZXYgc3RydWN0IGluIHRoZSBjYWNoZSBieSBkZXZpY2UgbmFtZSwgaWYgYXZhaWxhYmxlLgorICoKKyAqIElmIHRoZXJlIGlzIG5vIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UgbmFtZSwgYW5kIHRoZSBjcmVhdGUKKyAqIGZsYWcgaXMgc2V0LCB0aGVuIGNyZWF0ZSBhbiBlbXB0eSBkZXZpY2UgZW50cnkuCisgKi8KK2Jsa2lkX2RldiBibGtpZF9nZXRfZGV2KGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICpkZXZuYW1lLCBpbnQgZmxhZ3MpCit7CisJYmxraWRfZGV2IGRldiA9IE5VTEwsIHRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFjYWNoZSB8fCAhZGV2bmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZS0+YmljX2RldnMpIHsKKwkJdG1wID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X2RldiwgYmlkX2RldnMpOworCQlpZiAoc3RyY21wKHRtcC0+YmlkX25hbWUsIGRldm5hbWUpKQorCQkJY29udGludWU7CisKKwkJREJHKERFQlVHX0RFVk5BTUUsCisJCSAgICBwcmludGYoImZvdW5kIGRldm5hbWUgJXMgaW4gY2FjaGVcbiIsIHRtcC0+YmlkX25hbWUpKTsKKwkJZGV2ID0gdG1wOworCQlicmVhazsKKwl9CisKKwlpZiAoIWRldiAmJiAoZmxhZ3MgJiBCTEtJRF9ERVZfQ1JFQVRFKSkgeworCQlkZXYgPSBibGtpZF9uZXdfZGV2KCk7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIE5VTEw7CisJCWRldi0+YmlkX25hbWUgPSBibGtpZF9zdHJkdXAoZGV2bmFtZSk7CisJCWRldi0+YmlkX2NhY2hlID0gY2FjaGU7CisJCWxpc3RfYWRkX3RhaWwoJmRldi0+YmlkX2RldnMsICZjYWNoZS0+YmljX2RldnMpOworCQljYWNoZS0+YmljX2ZsYWdzIHw9IEJMS0lEX0JJQ19GTF9DSEFOR0VEOworCX0KKworCWlmIChmbGFncyAmIEJMS0lEX0RFVl9WRVJJRlkpCisJCWRldiA9IGJsa2lkX3ZlcmlmeShjYWNoZSwgZGV2KTsKKwlyZXR1cm4gZGV2OworfQorCisvKgorICogUHJvYmUgYSBzaW5nbGUgYmxvY2sgZGV2aWNlIHRvIGFkZCB0byB0aGUgZGV2aWNlIGNhY2hlLgorICovCitzdGF0aWMgdm9pZCBwcm9iZV9vbmUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnB0bmFtZSwKKwkJICAgICAgZGV2X3QgZGV2bm8sIGludCBwcmkpCit7CisJYmxraWRfZGV2IGRldiA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwljb25zdCBjaGFyICoqZGlyOworCWNoYXIgKmRldm5hbWUgPSBOVUxMOworCisJLyogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGRldmljZSBudW1iZXIgaW4gdGhlIGNhY2hlLiAqLworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlLT5iaWNfZGV2cykgeworCQlibGtpZF9kZXYgdG1wID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X2RldiwKKwkJCQkJICAgYmlkX2RldnMpOworCQlpZiAodG1wLT5iaWRfZGV2bm8gPT0gZGV2bm8pIHsKKwkJCWRldiA9IGJsa2lkX3ZlcmlmeShjYWNoZSwgdG1wKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChkZXYgJiYgZGV2LT5iaWRfZGV2bm8gPT0gZGV2bm8pCisJCWdvdG8gc2V0X3ByaTsKKworCS8qCisJICogVGFrZSBhIHF1aWNrIGxvb2sgYXQgL2Rldi9wdG5hbWUgZm9yIHRoZSBkZXZpY2UgbnVtYmVyLiAgV2UgY2hlY2sKKwkgKiBhbGwgb2YgdGhlIGxpa2VseSBkZXZpY2UgZGlyZWN0b3JpZXMuICBJZiB3ZSBkb24ndCBmaW5kIGl0LCBvciBpZgorCSAqIHRoZSBzdGF0IGluZm9ybWF0aW9uIGRvZXNuJ3QgY2hlY2sgb3V0LCB1c2UgYmxraWRfZGV2bm9fdG9fZGV2bmFtZSgpCisJICogdG8gZmluZCBpdCB2aWEgYW4gZXhoYXVzdGl2ZSBzZWFyY2ggZm9yIHRoZSBkZXZpY2UgbWFqb3IvbWlub3IuCisJICovCisJZm9yIChkaXIgPSBibGtpZF9kZXZkaXJzOyAqZGlyOyBkaXIrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciBkZXZpY2VbMjU2XTsKKworCQlzcHJpbnRmKGRldmljZSwgIiVzLyVzIiwgKmRpciwgcHRuYW1lKTsKKwkJaWYgKChkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBkZXZpY2UsIEJMS0lEX0RFVl9GSU5EKSkgJiYKKwkJICAgIGRldi0+YmlkX2Rldm5vID09IGRldm5vKQorCQkJZ290byBzZXRfcHJpOworCisJCWlmIChzdGF0KGRldmljZSwgJnN0KSA9PSAwICYmIFNfSVNCTEsoc3Quc3RfbW9kZSkgJiYKKwkJICAgIHN0LnN0X3JkZXYgPT0gZGV2bm8pIHsKKwkJCWRldm5hbWUgPSBibGtpZF9zdHJkdXAoZGV2aWNlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZGV2bmFtZSkgeworCQlkZXZuYW1lID0gYmxraWRfZGV2bm9fdG9fZGV2bmFtZShkZXZubyk7CisJCWlmICghZGV2bmFtZSkKKwkJCXJldHVybjsKKwl9CisJZGV2ID0gYmxraWRfZ2V0X2RldihjYWNoZSwgZGV2bmFtZSwgQkxLSURfREVWX05PUk1BTCk7CisJZnJlZShkZXZuYW1lKTsKKworc2V0X3ByaToKKwlpZiAoIXByaSAmJiAhc3RybmNtcChwdG5hbWUsICJtZCIsIDIpKQorCQlwcmkgPSBCTEtJRF9QUklfTUQ7CisJaWYgKGRldikKKwkJZGV2LT5iaWRfcHJpID0gcHJpOworfQorCisjZGVmaW5lIFBST0NfUEFSVElUSU9OUyAiL3Byb2MvcGFydGl0aW9ucyIKKyNkZWZpbmUgVkdfRElSCQkiL3Byb2MvbHZtL1ZHcyIKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFVVSUQgY2FjaGUgd2l0aCBkZXZpY2VzIGZyb20gdGhlIExWTQorICogcHJvYyBoaWVyYXJjaHkuICBXZSBjdXJyZW50bHkgZGVwZW5kIG9uIHRoZSBuYW1lcyBvZiB0aGUgTFZNCisgKiBoaWVyYXJjaHkgZ2l2aW5nIHVzIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGluIC9kZXYuICAoWFhYIGlzIHRoaXMgYQorICogc2FmZSB0aGluZyB0byBkbz8pCisgKi8KKyNpZmRlZiBWR19ESVIKKyNpbmNsdWRlIDxkaXJlbnQuaD4KK3N0YXRpYyBkZXZfdCBsdm1fZ2V0X2Rldm5vKGNvbnN0IGNoYXIgKmx2bV9kZXZpY2UpCit7CisJRklMRSAqbHZmOworCWNoYXIgYnVmWzEwMjRdOworCWludCBtYSwgbWk7CisJZGV2X3QgcmV0ID0gMDsKKworCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoIm9wZW5pbmcgJXNcbiIsIGx2bV9kZXZpY2UpKTsKKwlpZiAoKGx2ZiA9IGZvcGVuX2Zvcl9yZWFkKGx2bV9kZXZpY2UpKSA9PSBOVUxMKSB7CisJCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoIiVzOiAoJWQpICVzXG4iLCBsdm1fZGV2aWNlLCBlcnJubywKKwkJCQkJICBzdHJlcnJvcihlcnJubykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGx2ZikpIHsKKwkJaWYgKHNzY2FuZihidWYsICJkZXZpY2U6ICVkOiVkIiwgJm1hLCAmbWkpID09IDIpIHsKKwkJCXJldCA9IG1ha2VkZXYobWEsIG1pKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShsdmYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbHZtX3Byb2JlX2FsbChibGtpZF9jYWNoZSBjYWNoZSkKK3sKKwlESVIJCSp2Z19saXN0OworCXN0cnVjdCBkaXJlbnQJKnZnX2l0ZXI7CisJaW50CQl2Z19sZW4gPSBzdHJsZW4oVkdfRElSKTsKKwlkZXZfdAkJZGV2OworCisJaWYgKCh2Z19saXN0ID0gb3BlbmRpcihWR19ESVIpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlEQkcoREVCVUdfREVWTkFNRSwgcHJpbnRmKCJwcm9iaW5nIExWTSBkZXZpY2VzIHVuZGVyICVzXG4iLCBWR19ESVIpKTsKKworCXdoaWxlICgodmdfaXRlciA9IHJlYWRkaXIodmdfbGlzdCkpICE9IE5VTEwpIHsKKwkJRElSCQkqbHZfbGlzdDsKKwkJY2hhcgkJKnZkaXJuYW1lOworCQljaGFyCQkqdmdfbmFtZTsKKwkJc3RydWN0IGRpcmVudAkqbHZfaXRlcjsKKworCQl2Z19uYW1lID0gdmdfaXRlci0+ZF9uYW1lOworCQlpZiAoTE9ORV9DSEFSKHZnX25hbWUsICcuJykgfHwgIXN0cmNtcCh2Z19uYW1lLCAiLi4iKSkKKwkJCWNvbnRpbnVlOworCQl2ZGlybmFtZSA9IHhtYWxsb2ModmdfbGVuICsgc3RybGVuKHZnX25hbWUpICsgOCk7CisJCXNwcmludGYodmRpcm5hbWUsICIlcy8lcy9MVnMiLCBWR19ESVIsIHZnX25hbWUpOworCisJCWx2X2xpc3QgPSBvcGVuZGlyKHZkaXJuYW1lKTsKKwkJZnJlZSh2ZGlybmFtZSk7CisJCWlmIChsdl9saXN0ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQl3aGlsZSAoKGx2X2l0ZXIgPSByZWFkZGlyKGx2X2xpc3QpKSAhPSBOVUxMKSB7CisJCQljaGFyCQkqbHZfbmFtZSwgKmx2bV9kZXZpY2U7CisKKwkJCWx2X25hbWUgPSBsdl9pdGVyLT5kX25hbWU7CisJCQlpZiAoTE9ORV9DSEFSKGx2X25hbWUsICcuJykgfHwgIXN0cmNtcChsdl9uYW1lLCAiLi4iKSkKKwkJCQljb250aW51ZTsKKworCQkJbHZtX2RldmljZSA9IHhtYWxsb2ModmdfbGVuICsgc3RybGVuKHZnX25hbWUpICsKKwkJCQkJICAgIHN0cmxlbihsdl9uYW1lKSArIDgpOworCQkJc3ByaW50Zihsdm1fZGV2aWNlLCAiJXMvJXMvTFZzLyVzIiwgVkdfRElSLCB2Z19uYW1lLAorCQkJCWx2X25hbWUpOworCQkJZGV2ID0gbHZtX2dldF9kZXZubyhsdm1fZGV2aWNlKTsKKwkJCXNwcmludGYobHZtX2RldmljZSwgIiVzLyVzIiwgdmdfbmFtZSwgbHZfbmFtZSk7CisJCQlEQkcoREVCVUdfREVWTkFNRSwgcHJpbnRmKCJMVk0gZGV2ICVzOiBkZXZubyAweCUwNFhcbiIsCisJCQkJCQkgIGx2bV9kZXZpY2UsCisJCQkJCQkgICh1bnNpZ25lZCBpbnQpIGRldikpOworCQkJcHJvYmVfb25lKGNhY2hlLCBsdm1fZGV2aWNlLCBkZXYsIEJMS0lEX1BSSV9MVk0pOworCQkJZnJlZShsdm1fZGV2aWNlKTsKKwkJfQorCQljbG9zZWRpcihsdl9saXN0KTsKKwl9CisJY2xvc2VkaXIodmdfbGlzdCk7Cit9CisjZW5kaWYKKworI2RlZmluZSBQUk9DX0VWTVNfVk9MVU1FUyAiL3Byb2MvZXZtcy92b2x1bWVzIgorCitzdGF0aWMgaW50Citldm1zX3Byb2JlX2FsbChibGtpZF9jYWNoZSBjYWNoZSkKK3sKKwljaGFyIGxpbmVbMTAwXTsKKwlpbnQgbWEsIG1pLCBzeiwgbnVtID0gMDsKKwlGSUxFICpwcm9jcHQ7CisJY2hhciBkZXZpY2VbMTEwXTsKKworCXByb2NwdCA9IGZvcGVuX2Zvcl9yZWFkKFBST0NfRVZNU19WT0xVTUVTKTsKKwlpZiAoIXByb2NwdCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgcHJvY3B0KSkgeworCQlpZiAoc3NjYW5mKGxpbmUsICIgJWQgJWQgJWQgJSpzICUqcyAlW15cbiBdIiwKKwkJCSAgICAmbWEsICZtaSwgJnN6LCBkZXZpY2UpICE9IDQpCisJCQljb250aW51ZTsKKworCQlEQkcoREVCVUdfREVWTkFNRSwgcHJpbnRmKCJDaGVja2luZyBwYXJ0aXRpb24gJXMgKCVkLCAlZClcbiIsCisJCQkJCSAgZGV2aWNlLCBtYSwgbWkpKTsKKworCQlwcm9iZV9vbmUoY2FjaGUsIGRldmljZSwgbWFrZWRldihtYSwgbWkpLCBCTEtJRF9QUklfRVZNUyk7CisJCW51bSsrOworCX0KKwlmY2xvc2UocHJvY3B0KTsKKwlyZXR1cm4gbnVtOworfQorCisvKgorICogUmVhZCB0aGUgZGV2aWNlIGRhdGEgZm9yIGFsbCBhdmFpbGFibGUgYmxvY2sgZGV2aWNlcyBpbiB0aGUgc3lzdGVtLgorICovCitpbnQgYmxraWRfcHJvYmVfYWxsKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCUZJTEUgKnByb2M7CisJY2hhciBsaW5lWzEwMjRdOworCWNoYXIgcHRuYW1lMFsxMjhdLCBwdG5hbWUxWzEyOF0sICpwdG5hbWUgPSBOVUxMOworCWNoYXIgKnB0bmFtZXNbMl07CisJZGV2X3QgZGV2c1syXTsKKwlpbnQgbWEsIG1pOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzejsKKwlpbnQgbGVuc1syXSA9IHsgMCwgMCB9OworCWludCB3aGljaCA9IDAsIGxhc3QgPSAwOworCisJcHRuYW1lc1swXSA9IHB0bmFtZTA7CisJcHRuYW1lc1sxXSA9IHB0bmFtZTE7CisKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9QQVJBTTsKKworCWlmIChjYWNoZS0+YmljX2ZsYWdzICYgQkxLSURfQklDX0ZMX1BST0JFRCAmJgorCSAgICB0aW1lKE5VTEwpIC0gY2FjaGUtPmJpY190aW1lIDwgQkxLSURfUFJPQkVfSU5URVJWQUwpCisJCXJldHVybiAwOworCisJYmxraWRfcmVhZF9jYWNoZShjYWNoZSk7CisJZXZtc19wcm9iZV9hbGwoY2FjaGUpOworI2lmZGVmIFZHX0RJUgorCWx2bV9wcm9iZV9hbGwoY2FjaGUpOworI2VuZGlmCisKKwlwcm9jID0gZm9wZW5fZm9yX3JlYWQoUFJPQ19QQVJUSVRJT05TKTsKKwlpZiAoIXByb2MpCisJCXJldHVybiAtQkxLSURfRVJSX1BST0M7CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwcm9jKSkgeworCQlsYXN0ID0gd2hpY2g7CisJCXdoaWNoIF49IDE7CisJCXB0bmFtZSA9IHB0bmFtZXNbd2hpY2hdOworCisJCWlmIChzc2NhbmYobGluZSwgIiAlZCAlZCAlbGx1ICUxMjhbXlxuIF0iLAorCQkJICAgJm1hLCAmbWksICZzeiwgcHRuYW1lKSAhPSA0KQorCQkJY29udGludWU7CisJCWRldnNbd2hpY2hdID0gbWFrZWRldihtYSwgbWkpOworCisJCURCRyhERUJVR19ERVZOQU1FLCBwcmludGYoInJlYWQgcGFydGl0aW9uIG5hbWUgJXNcbiIsIHB0bmFtZSkpOworCisJCS8qIFNraXAgd2hvbGUgZGlzayBkZXZzIHVubGVzcyB0aGV5IGhhdmUgbm8gcGFydGl0aW9ucworCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgcGFydGl0aW9uIG9uIHRoaXMgZGV2LCBhbHNvCisJCSAqIGNoZWNrIHByZXZpb3VzIGRldiB0byBzZWUgaWYgaXQgZGlkbid0IGhhdmUgYSBwYXJ0bi4KKwkJICogaGV1cmlzdGljOiBwYXJ0aXRpb24gbmFtZSBlbmRzIGluIGEgZGlnaXQuCisJCSAqCisJCSAqIFNraXAgZXh0ZW5kZWQgcGFydGl0aW9ucy4KKwkJICogaGV1cmlzdGljOiBzaXplIGlzIDEKKwkJICoKKwkJICogRklYTUU6IHNraXAgL2Rldi97aWRhLGNjaXNzLHJkfSB3aG9sZS1kaXNrIGRldnMKKwkJICovCisKKwkJbGVuc1t3aGljaF0gPSBzdHJsZW4ocHRuYW1lKTsKKwkJaWYgKGlzZGlnaXQocHRuYW1lW2xlbnNbd2hpY2hdIC0gMV0pKSB7CisJCQlEQkcoREVCVUdfREVWTkFNRSwKKwkJCSAgICBwcmludGYoInBhcnRpdGlvbiBkZXYgJXMsIGRldm5vIDB4JTA0WFxuIiwKKwkJCQkgICBwdG5hbWUsICh1bnNpZ25lZCBpbnQpIGRldnNbd2hpY2hdKSk7CisKKwkJCWlmIChzeiA+IDEpCisJCQkJcHJvYmVfb25lKGNhY2hlLCBwdG5hbWUsIGRldnNbd2hpY2hdLCAwKTsKKwkJCWxlbnNbd2hpY2hdID0gMDsKKwkJCWxlbnNbbGFzdF0gPSAwOworCQl9IGVsc2UgaWYgKGxlbnNbbGFzdF0gJiYgc3RybmNtcChwdG5hbWVzW2xhc3RdLCBwdG5hbWUsCisJCQkJCQkgbGVuc1tsYXN0XSkpIHsKKwkJCURCRyhERUJVR19ERVZOQU1FLAorCQkJICAgIHByaW50Zigid2hvbGUgZGV2ICVzLCBkZXZubyAweCUwNFhcbiIsCisJCQkJICAgcHRuYW1lc1tsYXN0XSwgKHVuc2lnbmVkIGludCkgZGV2c1tsYXN0XSkpOworCQkJcHJvYmVfb25lKGNhY2hlLCBwdG5hbWVzW2xhc3RdLCBkZXZzW2xhc3RdLCAwKTsKKwkJCWxlbnNbbGFzdF0gPSAwOworCQl9CisJfQorCisJLyogSGFuZGxlIHRoZSBsYXN0IGRldmljZSBpZiBpdCB3YXNuJ3QgcGFydGl0aW9uZWQgKi8KKwlpZiAobGVuc1t3aGljaF0pCisJCXByb2JlX29uZShjYWNoZSwgcHRuYW1lLCBkZXZzW3doaWNoXSwgMCk7CisKKwlmY2xvc2UocHJvYyk7CisKKwljYWNoZS0+YmljX3RpbWUgPSB0aW1lKE5VTEwpOworCWNhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX1BST0JFRDsKKwlibGtpZF9mbHVzaF9jYWNoZShjYWNoZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBURVNUX1BST0dSQU0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlibGtpZF9jYWNoZSBjYWNoZSA9IE5VTEw7CisJaW50IHJldDsKKworCWJsa2lkX2RlYnVnX21hc2sgPSBERUJVR19BTEw7CisJaWYgKGFyZ2MgIT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlc1xuIgorCQkJIlByb2JlIGFsbCBkZXZpY2VzIGFuZCBleGl0XG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBiYl9kZXZfbnVsbCkpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgY3JlYXRpbmcgY2FjaGUgKCVkKVxuIiwKKwkJCWFyZ3ZbMF0sIHJldCk7CisJCWV4aXQoMSk7CisJfQorCWlmIChibGtpZF9wcm9iZV9hbGwoY2FjaGUpIDwgMCkKKwkJcHJpbnRmKCIlczogZXJyb3IgcHJvYmluZyBkZXZpY2VzXG4iLCBhcmd2WzBdKTsKKworCWJsa2lkX3B1dF9jYWNoZShjYWNoZSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2Rldm5vLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9kZXZuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzI2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9kZXZuby5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkZXZuby5jIC0gZmluZCBhIHBhcnRpY3VsYXIgZGV2aWNlIGJ5IGl0cyBkZXZpY2UgbnVtYmVyIChtYWpvci9taW5vcikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDMgVGhlb2RvcmUgVHMnbworICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJsa2lkUC5oIgorCitzdHJ1Y3QgZGlyX2xpc3QgeworCWNoYXIJKm5hbWU7CisJc3RydWN0IGRpcl9saXN0ICpuZXh0OworfTsKKworY2hhciAqYmxraWRfc3RybmR1cChjb25zdCBjaGFyICpzLCBpbnQgbGVuZ3RoKQoreworCWNoYXIgKnJldDsKKworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWxlbmd0aCkKKwkJbGVuZ3RoID0gc3RybGVuKHMpOworCisJcmV0ID0geG1hbGxvYyhsZW5ndGggKyAxKTsKKwlzdHJuY3B5KHJldCwgcywgbGVuZ3RoKTsKKwlyZXRbbGVuZ3RoXSA9ICdcMCc7CisJcmV0dXJuIHJldDsKK30KKworY2hhciAqYmxraWRfc3RyZHVwKGNvbnN0IGNoYXIgKnMpCit7CisJcmV0dXJuIGJsa2lkX3N0cm5kdXAocywgMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gZW50cnkgdG8gdGhlIGRpcmVjdG9yeSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGFkZF90b19kaXJsaXN0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkaXJfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGRpcl9saXN0ICpkcDsKKworCWRwID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGRpcl9saXN0KSk7CisJZHAtPm5hbWUgPSBibGtpZF9zdHJkdXAobmFtZSk7CisJZHAtPm5leHQgPSAqbGlzdDsKKwkqbGlzdCA9IGRwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhIGRpcmVjdG9yeSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfZGlybGlzdChzdHJ1Y3QgZGlyX2xpc3QgKipsaXN0KQoreworCXN0cnVjdCBkaXJfbGlzdCAqZHAsICpuZXh0OworCisJZm9yIChkcCA9ICpsaXN0OyBkcDsgZHAgPSBuZXh0KSB7CisJCW5leHQgPSBkcC0+bmV4dDsKKwkJZnJlZShkcC0+bmFtZSk7CisJCWZyZWUoZHApOworCX0KKwkqbGlzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5fZGlyKGNoYXIgKmRpcl9uYW1lLCBkZXZfdCBkZXZubywgc3RydWN0IGRpcl9saXN0ICoqbGlzdCwKKwkJCSAgICBjaGFyICoqZGV2bmFtZSkKK3sKKwlESVIJKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkcDsKKwljaGFyCXBhdGhbMTAyNF07CisJaW50CWRpcmxlbjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICgoZGlyID0gb3BlbmRpcihkaXJfbmFtZSkpID09IE5VTEwpCisJCXJldHVybjsKKwlkaXJsZW4gPSBzdHJsZW4oZGlyX25hbWUpICsgMjsKKwl3aGlsZSAoKGRwID0gcmVhZGRpcihkaXIpKSAhPSAwKSB7CisJCWlmIChkaXJsZW4gKyBzdHJsZW4oZHAtPmRfbmFtZSkgPj0gc2l6ZW9mKHBhdGgpKQorCQkJY29udGludWU7CisKKwkJaWYgKGRwLT5kX25hbWVbMF0gPT0gJy4nICYmCisJCSAgICAoKGRwLT5kX25hbWVbMV0gPT0gMCkgfHwKKwkJICAgICAoKGRwLT5kX25hbWVbMV0gPT0gJy4nKSAmJiAoZHAtPmRfbmFtZVsyXSA9PSAwKSkpKQorCQkJY29udGludWU7CisKKwkJc3ByaW50ZihwYXRoLCAiJXMvJXMiLCBkaXJfbmFtZSwgZHAtPmRfbmFtZSk7CisJCWlmIChzdGF0KHBhdGgsICZzdCkgPCAwKQorCQkJY29udGludWU7CisKKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQlhZGRfdG9fZGlybGlzdChwYXRoLCBsaXN0KTsKKwkJZWxzZSBpZiAoU19JU0JMSyhzdC5zdF9tb2RlKSAmJiBzdC5zdF9yZGV2ID09IGRldm5vKSB7CisJCQkqZGV2bmFtZSA9IGJsa2lkX3N0cmR1cChwYXRoKTsKKwkJCURCRyhERUJVR19ERVZOTywKKwkJCSAgICBwcmludGYoImZvdW5kIDB4JWxseCBhdCAlcyAoJXApXG4iLCBkZXZubywKKwkJCQkgICBwYXRoLCAqZGV2bmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworLyogRGlyZWN0b3JpZXMgd2hlcmUgd2Ugd2lsbCB0cnkgdG8gc2VhcmNoIGZvciBkZXZpY2UgbnVtYmVycyAqLworY29uc3QgY2hhciAqYmxraWRfZGV2ZGlyc1tdID0geyAiL2RldmljZXMiLCAiL2RldmZzIiwgIi9kZXYiLCBOVUxMIH07CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBwYXRobmFtZSB0byBhIGJsb2NrIGRldmljZSB3aXRoIGEgZ2l2ZW4KKyAqIGRldmljZSBudW1iZXIuICBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IHRvIHRoZQorICogcGF0aG5hbWUgb24gc3VjY2VzcywgYW5kIE5VTEwgb24gZmFpbHVyZS4KKyAqLworY2hhciAqYmxraWRfZGV2bm9fdG9fZGV2bmFtZShkZXZfdCBkZXZubykKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmxpc3QgPSBOVUxMLCAqbmV3X2xpc3QgPSBOVUxMOworCWNoYXIgKmRldm5hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKipkaXI7CisKKwkvKgorCSAqIEFkZCB0aGUgc3RhcnRpbmcgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGluIHJldmVyc2Ugb3JkZXIgb2YKKwkgKiBpbXBvcnRhbmNlLCBzaW5jZSB3ZSBhcmUgdXNpbmcgYSBzdGFjay4uLgorCSAqLworCWZvciAoZGlyID0gYmxraWRfZGV2ZGlyczsgKmRpcjsgZGlyKyspCisJCWFkZF90b19kaXJsaXN0KCpkaXIsICZsaXN0KTsKKworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBkaXJfbGlzdCAqY3VycmVudCA9IGxpc3Q7CisKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCURCRyhERUJVR19ERVZOTywgcHJpbnRmKCJkaXJlY3RvcnkgJXNcbiIsIGN1cnJlbnQtPm5hbWUpKTsKKwkJc2Nhbl9kaXIoY3VycmVudC0+bmFtZSwgZGV2bm8sICZuZXdfbGlzdCwgJmRldm5hbWUpOworCQlmcmVlKGN1cnJlbnQtPm5hbWUpOworCQlmcmVlKGN1cnJlbnQpOworCQlpZiAoZGV2bmFtZSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBJZiB3ZSdyZSBkb25lIGNoZWNraW5nIGF0IHRoaXMgbGV2ZWwsIGRlc2NlbmQgdG8KKwkJICogdGhlIG5leHQgbGV2ZWwgb2Ygc3ViZGlyZWN0b3JpZXMuIChicmVhZHRoLWZpcnN0KQorCQkgKi8KKwkJaWYgKGxpc3QgPT0gTlVMTCkgeworCQkJbGlzdCA9IG5ld19saXN0OworCQkJbmV3X2xpc3QgPSBOVUxMOworCQl9CisJfQorCWZyZWVfZGlybGlzdCgmbGlzdCk7CisJZnJlZV9kaXJsaXN0KCZuZXdfbGlzdCk7CisKKwlpZiAoIWRldm5hbWUpIHsKKwkJREJHKERFQlVHX0RFVk5PLAorCQkgICAgcHJpbnRmKCJibGtpZDogY2Fubm90IGZpbmQgZGV2bm8gMHglMDRseFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKSBkZXZubykpOworCX0gZWxzZSB7CisJCURCRyhERUJVR19ERVZOTywKKwkJICAgIHByaW50ZigiZm91bmQgZGV2bm8gMHglMDRsbHggYXMgJXNcbiIsIGRldm5vLCBkZXZuYW1lKSk7CisJfQorCisKKwlyZXR1cm4gZGV2bmFtZTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCWNoYXIJKmRldm5hbWUsICp0bXA7CisJaW50CW1ham9yLCBtaW5vcjsKKwlkZXZfdAlkZXZubzsKKwljb25zdCBjaGFyICplcnJtc2cgPSAiQ2Fubm90IHBhcnNlICVzOiAlc1xuIjsKKworCWJsa2lkX2RlYnVnX21hc2sgPSBERUJVR19BTEw7CisJaWYgKChhcmdjICE9IDIpICYmIChhcmdjICE9IDMpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6XHQlcyBkZXZpY2VfbnVtYmVyXG5cdCVzIG1ham9yIG1pbm9yXG4iCisJCQkiUmVzb2x2ZSBhIGRldmljZSBudW1iZXIgdG8gYSBkZXZpY2UgbmFtZVxuIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoYXJnYyA9PSAyKSB7CisJCWRldm5vID0gc3RydG91bChhcmd2WzFdLCAmdG1wLCAwKTsKKwkJaWYgKCp0bXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlcnJtc2csICJkZXZpY2UgbnVtYmVyIiwgYXJndlsxXSk7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIHsKKwkJbWFqb3IgPSBzdHJ0b3VsKGFyZ3ZbMV0sICZ0bXAsIDApOworCQlpZiAoKnRtcCkgeworCQkJZnByaW50ZihzdGRlcnIsIGVycm1zZywgIm1ham9yIG51bWJlciIsIGFyZ3ZbMV0pOworCQkJZXhpdCgxKTsKKwkJfQorCQltaW5vciA9IHN0cnRvdWwoYXJndlsyXSwgJnRtcCwgMCk7CisJCWlmICgqdG1wKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZXJybXNnLCAibWlub3IgbnVtYmVyIiwgYXJndlsyXSk7CisJCQlleGl0KDEpOworCQl9CisJCWRldm5vID0gbWFrZWRldihtYWpvciwgbWlub3IpOworCX0KKwlwcmludGYoIkxvb2tpbmcgZm9yIGRldmljZSAweCUwNEx4XG4iLCBkZXZubyk7CisJZGV2bmFtZSA9IGJsa2lkX2Rldm5vX3RvX2Rldm5hbWUoZGV2bm8pOworCWZyZWUoZGV2bmFtZSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2xpc3QuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQ2MWExCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvbGlzdC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKworI2luY2x1ZGUgImxpc3QuaCIKKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3ZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICogYWRkLAorCXN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LAorCXN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBhZGQ7CisJYWRkLT5uZXh0ID0gbmV4dDsKKwlhZGQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBhZGQ7Cit9CisKKy8qCisgKiBsaXN0X2FkZCAtIGFkZCBhIG5ldyBlbnRyeQorICogQGFkZDoJbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDoJbGlzdCBoZWFkIHRvIGFkZCBpdCBhZnRlcgorICoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBhZnRlciB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIGdvb2QgZm9yIGltcGxlbWVudGluZyBzdGFja3MuCisgKi8KK3ZvaWQgbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqYWRkLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQoYWRkLCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworLyoKKyAqIGxpc3RfYWRkX3RhaWwgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBhZGQ6CW5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6CWxpc3QgaGVhZCB0byBhZGQgaXQgYmVmb3JlCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHF1ZXVlcy4KKyAqLwordm9pZCBsaXN0X2FkZF90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmFkZCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xpc3RfYWRkKGFkZCwgaGVhZC0+cHJldiwgaGVhZCk7Cit9CisKKy8qCisgKiBEZWxldGUgYSBsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLwordm9pZCBfX2xpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LCBzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV4dDsKK30KKworLyoKKyAqIGxpc3RfZGVsIC0gZGVsZXRlcyBlbnRyeSBmcm9tIGxpc3QuCisgKiBAZW50cnk6CXRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICoKKyAqIGxpc3RfZW1wdHkoKSBvbiBAZW50cnkgZG9lcyBub3QgcmV0dXJuIHRydWUgYWZ0ZXIgdGhpcywgQGVudHJ5IGlzCisgKiBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKi8KK3ZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworfQorCisvKgorICogbGlzdF9kZWxfaW5pdCAtIGRlbGV0ZXMgZW50cnkgZnJvbSBsaXN0IGFuZCByZWluaXRpYWxpemUgaXQuCisgKiBAZW50cnk6CXRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICovCit2b2lkIGxpc3RfZGVsX2luaXQoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCUlOSVRfTElTVF9IRUFEKGVudHJ5KTsKK30KKworLyoKKyAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6CXRoZSBsaXN0IHRvIHRlc3QuCisgKi8KK2ludCBsaXN0X2VtcHR5KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJcmV0dXJuIGhlYWQtPm5leHQgPT0gaGVhZDsKK30KKworLyoKKyAqIGxpc3Rfc3BsaWNlIC0gam9pbiB0d28gbGlzdHMKKyAqIEBsaXN0Ogl0aGUgbmV3IGxpc3QgdG8gYWRkLgorICogQGhlYWQ6CXRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCisgKi8KK3ZvaWQgbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpmaXJzdCA9IGxpc3QtPm5leHQ7CisKKwlpZiAoZmlyc3QgIT0gbGlzdCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqYXQgPSBoZWFkLT5uZXh0OworCisJCWZpcnN0LT5wcmV2ID0gaGVhZDsKKwkJaGVhZC0+bmV4dCA9IGZpcnN0OworCisJCWxhc3QtPm5leHQgPSBhdDsKKwkJYXQtPnByZXYgPSBsYXN0OworCX0KK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2xpc3QuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRiYWFhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvbGlzdC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmICFkZWZpbmVkKF9CTEtJRF9MSVNUX0gpICYmICFkZWZpbmVkKExJU1RfSEVBRCkKKyNkZWZpbmUgQkxLSURfTElTVF9IIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKK3N0cnVjdCBsaXN0X2hlYWQgeworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQsICpwcmV2OworfTsKKworI2RlZmluZSBMSVNUX0hFQURfSU5JVChuYW1lKSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIExJU1RfSEVBRChuYW1lKSBcCisJc3RydWN0IGxpc3RfaGVhZCBuYW1lID0gTElTVF9IRUFEX0lOSVQobmFtZSkKKworI2RlZmluZSBJTklUX0xJU1RfSEVBRChwdHIpIGRvIHsgXAorCShwdHIpLT5uZXh0ID0gKHB0cik7IChwdHIpLT5wcmV2ID0gKHB0cik7IFwKK30gd2hpbGUgKDApCisKK3ZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICogYWRkLCBzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwJc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpOwordm9pZCBsaXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICphZGQsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwordm9pZCBsaXN0X2FkZF90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmFkZCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Cit2b2lkIF9fbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KTsKK3ZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpOwordm9pZCBsaXN0X2RlbF9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KTsKK2ludCBsaXN0X2VtcHR5KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwordm9pZCBsaXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKKworLyoqCisgKiBsaXN0X2VudHJ5IC0gZ2V0IHRoZSBzdHJ1Y3QgZm9yIHRoaXMgZW50cnkKKyAqIEBwdHI6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCBwb2ludGVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJKCh0eXBlICopKChjaGFyICopKHB0ciktKHVuc2lnbmVkIGxvbmcpKCYoKHR5cGUgKikwKS0+bWVtYmVyKSkpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaCAtIGl0ZXJhdGUgb3ZlciBlbGVtZW50cyBpbiBhIGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9zYWZlIC0gaXRlcmF0ZSBvdmVyIGVsZW1lbnRzIGluIGEgbGlzdCwgYnV0IGRvbid0IGRlcmVmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBwb3MgYWZ0ZXIgdGhlIGJvZHkgaXMgZG9uZSAoaW4gY2FzZSBpdCBpcyBmcmVlZCkKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG5leHQ6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGl0ZW0uCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdCAobm90IGluY2x1ZGVkIGluIGl0ZXJhdGlvbikuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcG5leHQsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgcG5leHQgPSBwb3MtPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKwkgICAgIHBvcyA9IHBuZXh0LCBwbmV4dCA9IHBvcy0+bmV4dCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9wcm9iZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2JmYzczCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcHJvYmUuYwpAQCAtMCwwICsxLDcyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcHJvYmUuYyAtIGlkZW50aWZ5IGEgYmxvY2sgZGV2aWNlIGJ5IGl0cyBjb250ZW50cywgYW5kIHJldHVybiBhIGRldgorICogICAgICAgICAgIHN0cnVjdCB3aXRoIHRoZSBkZXRhaWxzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IEFuZHJpZXMgQnJvdXdlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzIGJ5IFRoZW9kb3JlIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfTUtERVZfSAorI2luY2x1ZGUgPHN5cy9ta2Rldi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgImJsa2lkUC5oIgorI2luY2x1ZGUgIi4uL3V1aWQvdXVpZC5oIgorI2luY2x1ZGUgInByb2JlLmgiCisKKy8qCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGNvZGUgdG8gY2hlY2sgZm9yIGFuIE1EUkFJRCBkZXZpY2UuICBXZSBkbworICogdGhpcyBzcGVjaWFsIHNpbmNlIGl0IHJlcXVpcmVzIGNoZWNraW5nIGZvciBhIHN1cGVyYmxvY2sgYXQgdGhlIGVuZAorICogb2YgdGhlIGRldmljZS4KKyAqLworc3RhdGljIGludCBjaGVja19tZHJhaWQoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpyZXRfdXVpZCkKK3sKKwlzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfcyAqbWQ7CisJYmxraWRfbG9mZl90CQlvZmZzZXQ7CisJY2hhcgkJCWJ1Zls0MDk2XTsKKworCWlmIChmZCA8IDApCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJb2Zmc2V0ID0gKGJsa2lkX2dldF9kZXZfc2l6ZShmZCkgJiB+KChibGtpZF9sb2ZmX3QpNjU1MzUpKSAtIDY1NTM2OworCisJaWYgKGJsa2lkX2xsc2VlayhmZCwgb2Zmc2V0LCAwKSA8IDAgfHwKKwkgICAgcmVhZChmZCwgYnVmLCA0MDk2KSAhPSA0MDk2KQorCQlyZXR1cm4gLUJMS0lEX0VSUl9JTzsKKworCS8qIENoZWNrIGZvciBtYWdpYyBudW1iZXIgKi8KKwlpZiAobWVtY21wKCJcMjUxK05cMzc0IiwgYnVmLCA0KSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAoIXJldF91dWlkKQorCQlyZXR1cm4gMDsKKwkqcmV0X3V1aWQgPSAwOworCisJLyogVGhlIE1EIFVVSUQgaXMgbm90IGNvbnRpZ3VvdXMgaW4gdGhlIHN1cGVyYmxvY2ssIG1ha2UgaXQgc28gKi8KKwltZCA9IChzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfcyAqKWJ1ZjsKKwlpZiAobWQtPnNldF91dWlkMCB8fCBtZC0+c2V0X3V1aWQxIHx8IG1kLT5zZXRfdXVpZDIgfHwgbWQtPnNldF91dWlkMykgeworCQltZW1jcHkocmV0X3V1aWQsICZtZC0+c2V0X3V1aWQwLCA0KTsKKwkJbWVtY3B5KHJldF91dWlkLCAmbWQtPnNldF91dWlkMSwgMTIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3V1aWQoYmxraWRfZGV2IGRldiwgdXVpZF90IHV1aWQpCit7CisJY2hhcglzdHJbMzddOworCisJaWYgKCF1dWlkX2lzX251bGwodXVpZCkpIHsKKwkJdXVpZF91bnBhcnNlKHV1aWQsIHN0cik7CisJCWJsa2lkX3NldF90YWcoZGV2LCAiVVVJRCIsIHN0ciwgc2l6ZW9mKHN0cikpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X2V4dDJfaW5mbyhibGtpZF9kZXYgZGV2LCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopIGJ1ZjsKKwljb25zdCBjaGFyICpsYWJlbCA9IE5VTEw7CisKKwlEQkcoREVCVUdfUFJPQkUsIHByaW50ZigiZXh0Ml9zYi5jb21wYXQgPSAlMDhYOiUwOFg6JTA4WFxuIiwKKwkJICAgYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2NvbXBhdCksCisJCSAgIGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCksCisJCSAgIGJsa2lkX2xlMzIoZXMtPnNfZmVhdHVyZV9yb19jb21wYXQpKSk7CisKKwlpZiAoc3RybGVuKGVzLT5zX3ZvbHVtZV9uYW1lKSkKKwkJbGFiZWwgPSBlcy0+c192b2x1bWVfbmFtZTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgbGFiZWwsIHNpemVvZihlcy0+c192b2x1bWVfbmFtZSkpOworCisJc2V0X3V1aWQoZGV2LCBlcy0+c191dWlkKTsKK30KKworc3RhdGljIGludCBwcm9iZV9leHQzKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisKKwllcyA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCS8qIERpc3Rpbmd1aXNoIGJldHdlZW4gamJkIGFuZCBleHQyLzMgZnMgKi8KKwlpZiAoYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwkvKiBEaXN0aW5ndWlzaCBiZXR3ZWVuIGV4dDMgYW5kIGV4dDIgKi8KKwlpZiAoIShibGtpZF9sZTMyKGVzLT5zX2ZlYXR1cmVfY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJZ2V0X2V4dDJfaW5mbyhkZXYsIGJ1Zik7CisKKwlibGtpZF9zZXRfdGFnKGRldiwgIlNFQ19UWVBFIiwgImV4dDIiLCBzaXplb2YoImV4dDIiKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9leHQyKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBibGtpZF9kZXYgZGV2LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisKKwllcyA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCS8qIERpc3Rpbmd1aXNoIGJldHdlZW4gamJkIGFuZCBleHQyLzMgZnMgKi8KKwlpZiAoYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlnZXRfZXh0Ml9pbmZvKGRldiwgYnVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX2piZChpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKikgYnVmOworCisJaWYgKCEoYmxraWRfbGUzMihlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlnZXRfZXh0Ml9pbmZvKGRldiwgYnVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3ZmYXQoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCB2ZmF0X3N1cGVyX2Jsb2NrICp2czsKKwljaGFyIHNlcm5vWzEwXTsKKwljb25zdCBjaGFyICpsYWJlbCA9IE5VTEw7CisJaW50IGxhYmVsX2xlbiA9IDA7CisKKwl2cyA9IChzdHJ1Y3QgdmZhdF9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzdHJuY21wKHZzLT52c19sYWJlbCwgIk5PIE5BTUUiLCA3KSkgeworCQljaGFyICplbmQgPSB2cy0+dnNfbGFiZWwgKyBzaXplb2YodnMtPnZzX2xhYmVsKSAtIDE7CisKKwkJd2hpbGUgKCplbmQgPT0gJyAnICYmIGVuZCA+PSB2cy0+dnNfbGFiZWwpCisJCQktLWVuZDsKKwkJaWYgKGVuZCA+PSB2cy0+dnNfbGFiZWwpIHsKKwkJCWxhYmVsID0gdnMtPnZzX2xhYmVsOworCQkJbGFiZWxfbGVuID0gZW5kIC0gdnMtPnZzX2xhYmVsICsgMTsKKwkJfQorCX0KKworCS8qIFdlIGNhbid0IGp1c3QgcHJpbnQgdGhlbSBhcyAlMDRYLCBiZWNhdXNlIHRoZXkgYXJlIHVuYWxpZ25lZCAqLworCXNwcmludGYoc2Vybm8sICIlMDJYJTAyWC0lMDJYJTAyWCIsIHZzLT52c19zZXJub1szXSwgdnMtPnZzX3Nlcm5vWzJdLAorCQl2cy0+dnNfc2Vybm9bMV0sIHZzLT52c19zZXJub1swXSk7CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIGxhYmVsLCBsYWJlbF9sZW4pOworCWJsa2lkX3NldF90YWcoZGV2LCAiVVVJRCIsIHNlcm5vLCBzaXplb2Yoc2Vybm8pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX21zZG9zKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IG1zZG9zX3N1cGVyX2Jsb2NrICptcyA9IChzdHJ1Y3QgbXNkb3Nfc3VwZXJfYmxvY2sgKikgYnVmOworCWNoYXIgc2Vybm9bMTBdOworCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKwlpbnQgbGFiZWxfbGVuID0gMDsKKworCWlmIChzdHJuY21wKG1zLT5tc19sYWJlbCwgIk5PIE5BTUUiLCA3KSkgeworCQljaGFyICplbmQgPSBtcy0+bXNfbGFiZWwgKyBzaXplb2YobXMtPm1zX2xhYmVsKSAtIDE7CisKKwkJd2hpbGUgKCplbmQgPT0gJyAnICYmIGVuZCA+PSBtcy0+bXNfbGFiZWwpCisJCQktLWVuZDsKKwkJaWYgKGVuZCA+PSBtcy0+bXNfbGFiZWwpIHsKKwkJCWxhYmVsID0gbXMtPm1zX2xhYmVsOworCQkJbGFiZWxfbGVuID0gZW5kIC0gbXMtPm1zX2xhYmVsICsgMTsKKwkJfQorCX0KKworCS8qIFdlIGNhbid0IGp1c3QgcHJpbnQgdGhlbSBhcyAlMDRYLCBiZWNhdXNlIHRoZXkgYXJlIHVuYWxpZ25lZCAqLworCXNwcmludGYoc2Vybm8sICIlMDJYJTAyWC0lMDJYJTAyWCIsIG1zLT5tc19zZXJub1szXSwgbXMtPm1zX3Nlcm5vWzJdLAorCQltcy0+bXNfc2Vybm9bMV0sIG1zLT5tc19zZXJub1swXSk7CisJYmxraWRfc2V0X3RhZyhkZXYsICJVVUlEIiwgc2Vybm8sIDApOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgbGFiZWxfbGVuKTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIlNFQ19UWVBFIiwgIm1zZG9zIiwgc2l6ZW9mKCJtc2RvcyIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3hmcyhpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrICp4czsKKwljb25zdCBjaGFyICpsYWJlbCA9IE5VTEw7CisKKwl4cyA9IChzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHN0cmxlbih4cy0+eHNfZm5hbWUpKQorCQlsYWJlbCA9IHhzLT54c19mbmFtZTsKKwlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgbGFiZWwsIHNpemVvZih4cy0+eHNfZm5hbWUpKTsKKwlzZXRfdXVpZChkZXYsIHhzLT54c191dWlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9yZWlzZXJmcyhpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJCSAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJCSAgYmxraWRfZGV2IGRldiwKKwkJCSAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICopIGJ1ZjsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKworCWJsb2Nrc2l6ZSA9IGJsa2lkX2xlMTYocnMtPnJzX2Jsb2Nrc2l6ZSk7CisKKwkvKiBJZiB0aGUgc3VwZXJibG9jayBpcyBpbnNpZGUgdGhlIGpvdXJuYWwsIHdlIGhhdmUgdGhlIHdyb25nIG9uZSAqLworCWlmIChpZC0+YmltX2tib2ZmLyhibG9ja3NpemU+PjEwKSA+IGJsa2lkX2xlMzIocnMtPnJzX2pvdXJuYWxfYmxvY2spKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9CSUc7CisKKwkvKiBMQUJFTC9VVUlEIGFyZSBvbmx5IHZhbGlkIGZvciBsYXRlciB2ZXJzaW9ucyBvZiBSZWlzZXJmcyB2My42LiAqLworCWlmICghc3RyY21wKGlkLT5iaW1fbWFnaWMsICJSZUlzRXIyRnMiKSB8fAorCSAgICAhc3RyY21wKGlkLT5iaW1fbWFnaWMsICJSZUlzRXIzRnMiKSkgeworCQlpZiAoc3RybGVuKHJzLT5yc19sYWJlbCkpCisJCQlsYWJlbCA9IHJzLT5yc19sYWJlbDsKKwkJc2V0X3V1aWQoZGV2LCBycy0+cnNfdXVpZCk7CisJfQorCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKHJzLT5yc19sYWJlbCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfamZzKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIGJsa2lkX2NhY2hlIGNhY2hlIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgdW5zaWduZWQgY2hhciAqYnVmKQoreworCXN0cnVjdCBqZnNfc3VwZXJfYmxvY2sgKmpzOworCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKworCWpzID0gKHN0cnVjdCBqZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoc3RybGVuKChjaGFyICopIGpzLT5qc19sYWJlbCkpCisJCWxhYmVsID0gKGNoYXIgKikganMtPmpzX2xhYmVsOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgc2l6ZW9mKGpzLT5qc19sYWJlbCkpOworCXNldF91dWlkKGRldiwganMtPmpzX3V1aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX3JvbWZzKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICpyb3M7CisJY29uc3QgY2hhciAqbGFiZWwgPSBOVUxMOworCisJcm9zID0gKHN0cnVjdCByb21mc19zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzdHJsZW4oKGNoYXIgKikgcm9zLT5yb3Nfdm9sdW1lKSkKKwkJbGFiZWwgPSAoY2hhciAqKSByb3MtPnJvc192b2x1bWU7CisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIGxhYmVsLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9jcmFtZnMoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3JhbWZzX3N1cGVyX2Jsb2NrICpjc2I7CisJY29uc3QgY2hhciAqbGFiZWwgPSBOVUxMOworCisJY3NiID0gKHN0cnVjdCBjcmFtZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoc3RybGVuKChjaGFyICopIGNzYi0+bmFtZSkpCisJCWxhYmVsID0gKGNoYXIgKikgY3NiLT5uYW1lOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCBsYWJlbCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfc3dhcDAoaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiBfX0JMS0lEX0FUVFIoKHVudXNlZCkpKQoreworCWJsa2lkX3NldF90YWcoZGV2LCAiVVVJRCIsIDAsIDApOworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9zd2FwMShpbnQgZmQsCisJCSAgICAgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiBfX0JMS0lEX0FUVFIoKHVudXNlZCkpKQoreworCXN0cnVjdCBzd2FwX2lkX2Jsb2NrICpzd3M7CisKKwlwcm9iZV9zd2FwMChmZCwgY2FjaGUsIGRldiwgaWQsIGJ1Zik7CisJLyoKKwkgKiBWZXJzaW9uIDEgc3dhcCBoZWFkZXJzIGFyZSBhbHdheXMgbG9jYXRlZCBhdCBvZmZzZXQgb2YgMTAyNAorCSAqIGJ5dGVzLCBhbHRob3VnaCB0aGUgc3dhcCBzaWduYXR1cmUgaXRzZWxmIGlzIGxvY2F0ZWQgYXQgdGhlCisJICogZW5kIG9mIHRoZSBwYWdlICh3aGljaCBtYXkgdmFyeSBkZXBlbmRpbmcgb24gaGFyZHdhcmUKKwkgKiBwYWdlc2l6ZSkuCisJICovCisJaWYgKGxzZWVrKGZkLCAxMDI0LCBTRUVLX1NFVCkgPCAwKSByZXR1cm4gMTsKKwlzd3MgPSB4bWFsbG9jKDEwMjQpOworCWlmIChyZWFkKGZkLCBzd3MsIDEwMjQpICE9IDEwMjQpIHsKKwkJZnJlZShzd3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBhcmJpdHJhcnkgc2FuaXR5IGNoZWNrLi4gaXMgdGhlcmUgYW55IGdhcmJhZ2UgZG93biB0aGVyZT8gKi8KKwlpZiAoc3dzLT5zd3NfcGFkWzMyXSA9PSAwICYmIHN3cy0+c3dzX3BhZFszM10gPT0gMCkgIHsKKwkJaWYgKHN3cy0+c3dzX3ZvbHVtZVswXSkKKwkJCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCAoY29uc3QgY2hhciopc3dzLT5zd3Nfdm9sdW1lLAorCQkJCSAgICAgIHNpemVvZihzd3MtPnN3c192b2x1bWUpKTsKKwkJaWYgKHN3cy0+c3dzX3V1aWRbMF0pCisJCQlzZXRfdXVpZChkZXYsIHN3cy0+c3dzX3V1aWQpOworCX0KKwlmcmVlKHN3cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIKKyogY29uc3QgdWRmX21hZ2ljW10gPSB7ICJCRUEwMSIsICJCT09UMiIsICJDRDAwMSIsICJDRFcwMiIsICJOU1IwMiIsCisJCSAiTlNSMDMiLCAiVEVBMDEiLCAwIH07CisKK3N0YXRpYyBpbnQgcHJvYmVfdWRmKGludCBmZCwgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICBibGtpZF9kZXYgZGV2IF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiBfX0JMS0lEX0FUVFIoKHVudXNlZCkpKQoreworCWludCBqLCBiczsKKwlzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yIGlzb3NiOworCWNvbnN0IGNoYXIgKmNvbnN0ICptOworCisJLyogZGV0ZXJtaW5lIHRoZSBibG9jayBzaXplIGJ5IHNjYW5uaW5nIGluIDJLIGluY3JlbWVudHMKKwkgICAoYmxvY2sgc2l6ZXMgbGFyZ2VyIHRoYW4gMksgd2lsbCBiZSBudWxsIHBhZGRlZCkgKi8KKwlmb3IgKGJzID0gMTsgYnMgPCAxNjsgYnMrKykgeworCQlsc2VlayhmZCwgYnMqMjA0OCszMjc2OCwgU0VFS19TRVQpOworCQlpZiAocmVhZChmZCwgKGNoYXIgKikmaXNvc2IsIHNpemVvZihpc29zYikpICE9IHNpemVvZihpc29zYikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGlzb3NiLmlkWzBdKQorCQkJYnJlYWs7CisJfQorCisJLyogU2NhbiB1cCB0byBhbm90aGVyIDY0IGJsb2NrcyBsb29raW5nIGZvciBhZGRpdGlvbmFsIFZTRCdzICovCisJZm9yIChqID0gMTsgaiA8IDY0OyBqKyspIHsKKwkJaWYgKGogPiAxKSB7CisJCQlsc2VlayhmZCwgaipicyoyMDQ4KzMyNzY4LCBTRUVLX1NFVCk7CisJCQlpZiAocmVhZChmZCwgKGNoYXIgKikmaXNvc2IsIHNpemVvZihpc29zYikpCisJCQkgICAgIT0gc2l6ZW9mKGlzb3NiKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBJZiB3ZSBmaW5kIE5TUjB4IHRoZW4gY2FsbCBpdCB1ZGY6CisJCSAgIE5TUjAxIGZvciBVREYgMS4wMAorCQkgICBOU1IwMiBmb3IgVURGIDEuNTAKKwkJICAgTlNSMDMgZm9yIFVERiAyLjAwICovCisJCWlmICghc3RybmNtcChpc29zYi5pZCwgIk5TUjAiLCA0KSkKKwkJCXJldHVybiAwOworCQlmb3IgKG0gPSB1ZGZfbWFnaWM7ICptOyBtKyspCisJCQlpZiAoIXN0cm5jbXAoKm0sIGlzb3NiLmlkLCA1KSkKKwkJCQlicmVhazsKKwkJaWYgKCptID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfb2NmcyhpbnQgZmQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgYmxraWRfZGV2IGRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IG9jZnNfdm9sdW1lX2hlYWRlciBvdmg7CisJc3RydWN0IG9jZnNfdm9sdW1lX2xhYmVsIG92bDsKKwlfX3UzMiBtYWpvcjsKKworCW1lbWNweSgmb3ZoLCBidWYsIHNpemVvZihvdmgpKTsKKwltZW1jcHkoJm92bCwgYnVmKzUxMiwgc2l6ZW9mKG92bCkpOworCisJbWFqb3IgPSBvY2ZzbWFqb3Iob3ZoKTsKKwlpZiAobWFqb3IgPT0gMSkKKwkJYmxraWRfc2V0X3RhZyhkZXYsICJTRUNfVFlQRSIsICJvY2ZzMSIsIHNpemVvZigib2NmczEiKSk7CisJZWxzZSBpZiAobWFqb3IgPj0gOSkKKwkJYmxraWRfc2V0X3RhZyhkZXYsICJTRUNfVFlQRSIsICJudG9jZnMiLCBzaXplb2YoIm50b2NmcyIpKTsKKworCWJsa2lkX3NldF90YWcoZGV2LCAiTEFCRUwiLCAoY29uc3QgY2hhciopb3ZsLmxhYmVsLCBvY2ZzbGFiZWxsZW4ob3ZsKSk7CisJYmxraWRfc2V0X3RhZyhkZXYsICJNT1VOVCIsIChjb25zdCBjaGFyKilvdmgubW91bnQsIG9jZnNtb3VudGxlbihvdmgpKTsKKwlzZXRfdXVpZChkZXYsIG92bC52b2xfaWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX29jZnMyKGludCBmZCBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgYmxraWRfY2FjaGUgY2FjaGUgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGJsa2lkX2RldiBkZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYmxraWRfbWFnaWMgKmlkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyX2Jsb2NrICpvc2I7CisKKwlvc2IgPSAoc3RydWN0IG9jZnMyX3N1cGVyX2Jsb2NrICopYnVmOworCisJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIChjb25zdCBjaGFyKilvc2ItPnNfbGFiZWwsIHNpemVvZihvc2ItPnNfbGFiZWwpKTsKKwlzZXRfdXVpZChkZXYsIG9zYi0+c191dWlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9iZV9vcmFjbGVhc20oaW50IGZkIF9fQkxLSURfQVRUUigodW51c2VkKSksCisJCQkgICBibGtpZF9jYWNoZSBjYWNoZSBfX0JMS0lEX0FUVFIoKHVudXNlZCkpLAorCQkJICAgYmxraWRfZGV2IGRldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQgX19CTEtJRF9BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb3JhY2xlX2FzbV9kaXNrX2xhYmVsICpkbDsKKworCWRsID0gKHN0cnVjdCBvcmFjbGVfYXNtX2Rpc2tfbGFiZWwgKilidWY7CisKKwlibGtpZF9zZXRfdGFnKGRldiwgIkxBQkVMIiwgZGwtPmRsX2lkLCBzaXplb2YoZGwtPmRsX2lkKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCTEtJRF9CTEtfT0ZGUyBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgaGlnaGVzdCBiaW1fa2JvZmYgZGVmaW5lZAorICogaW4gdGhlIHR5cGVfYXJyYXkgdGFibGUgYmVsb3cgKyBiaW1fa2JhbGlnbi4KKyAqCisgKiBXaGVuIHByb2JpbmcgZm9yIGEgbG90IG9mIG1hZ2ljcywgd2UgaGFuZGxlIGV2ZXJ5dGhpbmcgaW4gMWtCIGJ1ZmZlcnMgc28KKyAqIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCByZWFkaW5nIGVhY2ggY29tYmluYXRpb24gb2YgYmxvY2sgc2l6ZXMuCisgKi8KKyNkZWZpbmUgQkxLSURfQkxLX09GRlMJNjQJLyogY3VycmVudGx5IHJlaXNlcmZzICovCisKKy8qCisgKiBWYXJpb3VzIGZpbGVzeXN0ZW0gbWFnaWNzIHRoYXQgd2UgY2FuIGNoZWNrIGZvci4gIE5vdGUgdGhhdCBrYm9mZiBhbmQKKyAqIHNib2ZmIGFyZSBpbiBraWxvYnl0ZXMgYW5kIGJ5dGVzIHJlc3BlY3RpdmVseS4gIEFsbCBtYWdpY3MgYXJlIGluCisgKiBieXRlIHN0cmluZ3Mgc28gd2UgZG9uJ3Qgd29ycnkgYWJvdXQgZW5kaWFuIGlzc3Vlcy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyB0eXBlX2FycmF5W10gPSB7CisvKiAgdHlwZSAgICAga2JvZmYgICBzYm9mZiBsZW4gIG1hZ2ljCQkJcHJvYmUgKi8KKyAgeyAib3JhY2xlYXNtIiwgMCwJMzIsICA4LCAiT1JDTERJU0siLAkJcHJvYmVfb3JhY2xlYXNtIH0sCisgIHsgIm50ZnMiLCAgICAgIDAsICAgICAgMywgIDgsICJOVEZTICAgICIsICAgICAgICAgICAgIDAgfSwKKyAgeyAiamJkIiwJIDEsICAgMHgzOCwgIDIsICJcMTIzXDM1NyIsCQlwcm9iZV9qYmQgfSwKKyAgeyAiZXh0MyIsCSAxLCAgIDB4MzgsICAyLCAiXDEyM1wzNTciLAkJcHJvYmVfZXh0MyB9LAorICB7ICJleHQyIiwJIDEsICAgMHgzOCwgIDIsICJcMTIzXDM1NyIsCQlwcm9iZV9leHQyIH0sCisgIHsgInJlaXNlcmZzIiwJIDgsICAgMHgzNCwgIDgsICJSZUlzRXJGcyIsCQlwcm9iZV9yZWlzZXJmcyB9LAorICB7ICJyZWlzZXJmcyIsIDY0LCAgIDB4MzQsICA5LCAiUmVJc0VyMkZzIiwJCXByb2JlX3JlaXNlcmZzIH0sCisgIHsgInJlaXNlcmZzIiwgNjQsICAgMHgzNCwgIDksICJSZUlzRXIzRnMiLAkJcHJvYmVfcmVpc2VyZnMgfSwKKyAgeyAicmVpc2VyZnMiLCA2NCwgICAweDM0LCAgOCwgIlJlSXNFckZzIiwJCXByb2JlX3JlaXNlcmZzIH0sCisgIHsgInJlaXNlcmZzIiwJIDgsCTIwLCAgOCwgIlJlSXNFckZzIiwJCXByb2JlX3JlaXNlcmZzIH0sCisgIHsgInZmYXQiLCAgICAgIDAsICAgMHg1MiwgIDUsICJNU1dJTiIsICAgICAgICAgICAgICAgIHByb2JlX3ZmYXQgfSwKKyAgeyAidmZhdCIsICAgICAgMCwgICAweDUyLCAgOCwgIkZBVDMyICAgIiwgICAgICAgICAgICAgcHJvYmVfdmZhdCB9LAorICB7ICJ2ZmF0IiwgICAgICAwLCAgIDB4MzYsICA1LCAiTVNET1MiLCAgICAgICAgICAgICAgICBwcm9iZV9tc2RvcyB9LAorICB7ICJ2ZmF0IiwgICAgICAwLCAgIDB4MzYsICA4LCAiRkFUMTYgICAiLCAgICAgICAgICAgICBwcm9iZV9tc2RvcyB9LAorICB7ICJ2ZmF0IiwgICAgICAwLCAgIDB4MzYsICA4LCAiRkFUMTIgICAiLCAgICAgICAgICAgICBwcm9iZV9tc2RvcyB9LAorICB7ICJtaW5peCIsICAgICAxLCAgIDB4MTAsICAyLCAiXDE3N1wwMjMiLCAgICAgICAgICAgICAwIH0sCisgIHsgIm1pbml4IiwgICAgIDEsICAgMHgxMCwgIDIsICJcMjE3XDAyMyIsICAgICAgICAgICAgIDAgfSwKKyAgeyAibWluaXgiLAkgMSwgICAweDEwLCAgMiwgIlwxNTBcMDQ0IiwJCTAgfSwKKyAgeyAibWluaXgiLAkgMSwgICAweDEwLCAgMiwgIlwxNzBcMDQ0IiwJCTAgfSwKKyAgeyAidnhmcyIsCSAxLAkgMCwgIDQsICJcMzY1XDM3NFwwMDFcMjQ1IiwJMCB9LAorICB7ICJ4ZnMiLAkgMCwJIDAsICA0LCAiWEZTQiIsCQkJcHJvYmVfeGZzIH0sCisgIHsgInJvbWZzIiwJIDAsCSAwLCAgOCwgIi1yb20xZnMtIiwJCXByb2JlX3JvbWZzIH0sCisgIHsgImJmcyIsCSAwLAkgMCwgIDQsICJcMzE2XDM3MlwxNzNcMDMzIiwJMCB9LAorICB7ICJjcmFtZnMiLAkgMCwJIDAsICA0LCAiRT1cMzE1XDA1MCIsCQlwcm9iZV9jcmFtZnMgfSwKKyAgeyAicW54NCIsCSAwLAkgNCwgIDYsICJRTlg0RlMiLAkJMCB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiQkVBMDEiLAkJcHJvYmVfdWRmIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJCT09UMiIsCQlwcm9iZV91ZGYgfSwKKyAgeyAidWRmIiwJMzIsCSAxLCAgNSwgIkNEMDAxIiwJCXByb2JlX3VkZiB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiQ0RXMDIiLAkJcHJvYmVfdWRmIH0sCisgIHsgInVkZiIsCTMyLAkgMSwgIDUsICJOU1IwMiIsCQlwcm9iZV91ZGYgfSwKKyAgeyAidWRmIiwJMzIsCSAxLCAgNSwgIk5TUjAzIiwJCXByb2JlX3VkZiB9LAorICB7ICJ1ZGYiLAkzMiwJIDEsICA1LCAiVEVBMDEiLAkJcHJvYmVfdWRmIH0sCisgIHsgImlzbzk2NjAiLAkzMiwJIDEsICA1LCAiQ0QwMDEiLAkJMCB9LAorICB7ICJpc285NjYwIiwJMzIsCSA5LCAgNSwgIkNEUk9NIiwJCTAgfSwKKyAgeyAiamZzIiwJMzIsCSAwLCAgNCwgIkpGUzEiLAkJCXByb2JlX2pmcyB9LAorICB7ICJoZnMiLAkgMSwJIDAsICAyLCAiQkQiLAkJCTAgfSwKKyAgeyAidWZzIiwJIDgsICAweDU1YywgIDQsICJUXDAzMVwwMDFcMDAwIiwJMCB9LAorICB7ICJocGZzIiwJIDgsCSAwLCAgNCwgIklcMzUwXDIyNVwzNzEiLAkwIH0sCisgIHsgInN5c3YiLAkgMCwgIDB4M2Y4LCAgNCwgIlwwMjB+XDAzMFwzNzUiLAkwIH0sCisgIHsgInN3YXAiLAkgMCwgIDB4ZmY2LCAxMCwgIlNXQVAtU1BBQ0UiLAkJcHJvYmVfc3dhcDAgfSwKKyAgeyAic3dhcCIsCSAwLCAgMHhmZjYsIDEwLCAiU1dBUFNQQUNFMiIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd2FwIiwJIDAsIDB4MWZmNiwgMTAsICJTV0FQLVNQQUNFIiwJCXByb2JlX3N3YXAwIH0sCisgIHsgInN3YXAiLAkgMCwgMHgxZmY2LCAxMCwgIlNXQVBTUEFDRTIiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAic3dhcCIsCSAwLCAweDNmZjYsIDEwLCAiU1dBUC1TUEFDRSIsCQlwcm9iZV9zd2FwMCB9LAorICB7ICJzd2FwIiwJIDAsIDB4M2ZmNiwgMTAsICJTV0FQU1BBQ0UyIiwJCXByb2JlX3N3YXAxIH0sCisgIHsgInN3YXAiLAkgMCwgMHg3ZmY2LCAxMCwgIlNXQVAtU1BBQ0UiLAkJcHJvYmVfc3dhcDAgfSwKKyAgeyAic3dhcCIsCSAwLCAweDdmZjYsIDEwLCAiU1dBUFNQQUNFMiIsCQlwcm9iZV9zd2FwMSB9LAorICB7ICJzd2FwIiwJIDAsIDB4ZmZmNiwgMTAsICJTV0FQLVNQQUNFIiwJCXByb2JlX3N3YXAwIH0sCisgIHsgInN3YXAiLAkgMCwgMHhmZmY2LCAxMCwgIlNXQVBTUEFDRTIiLAkJcHJvYmVfc3dhcDEgfSwKKyAgeyAib2NmcyIsCSAwLAkgOCwgIDksCSJPcmFjbGVDRlMiLAkJcHJvYmVfb2NmcyB9LAorICB7ICJvY2ZzMiIsCSAxLAkgMCwgIDYsCSJPQ0ZTVjIiLAkJcHJvYmVfb2NmczIgfSwKKyAgeyAib2NmczIiLAkgMiwJIDAsICA2LAkiT0NGU1YyIiwJCXByb2JlX29jZnMyIH0sCisgIHsgIm9jZnMyIiwJIDQsCSAwLCAgNiwJIk9DRlNWMiIsCQlwcm9iZV9vY2ZzMiB9LAorICB7ICJvY2ZzMiIsCSA4LAkgMCwgIDYsCSJPQ0ZTVjIiLAkJcHJvYmVfb2NmczIgfSwKKyAgeyAgIE5VTEwsCSAwLAkgMCwgIDAsIE5VTEwsCQkJTlVMTCB9Cit9OworCisvKgorICogVmVyaWZ5IHRoYXQgdGhlIGRhdGEgaW4gZGV2IGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGlzIG9uIHRoZSBhY3R1YWwKKyAqIGJsb2NrIGRldmljZSAodXNpbmcgdGhlIGRldm5hbWUgZmllbGQgb25seSkuICBOb3JtYWxseSB0aGlzIHdpbGwgYmUKKyAqIGNhbGxlZCB3aGVuIGZpbmRpbmcgaXRlbXMgaW4gdGhlIGNhY2hlLCBidXQgZm9yIGxvbmcgcnVubmluZyBwcm9jZXNzZXMKKyAqIGlzIGFsc28gZGVzaXJhYmxlIHRvIHJldmFsaWRhdGUgYW4gaXRlbSBiZWZvcmUgdXNlLgorICoKKyAqIElmIHdlIGFyZSB1bmFibGUgdG8gcmV2YWxpZGF0ZSB0aGUgZGF0YSwgd2UgcmV0dXJuIHRoZSBvbGQgZGF0YSBhbmQKKyAqIGRvIG5vdCBzZXQgdGhlIEJMS0lEX0JJRF9GTF9WRVJJRklFRCBmbGFnIG9uIGl0LgorICovCitibGtpZF9kZXYgYmxraWRfdmVyaWZ5KGJsa2lkX2NhY2hlIGNhY2hlLCBibGtpZF9kZXYgZGV2KQoreworCWNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQ7CisJdW5zaWduZWQgY2hhciAqYnVmc1tCTEtJRF9CTEtfT0ZGUyArIDFdLCAqYnVmOworCWNvbnN0IGNoYXIgKnR5cGU7CisJc3RydWN0IHN0YXQgc3Q7CisJdGltZV90IGRpZmYsIG5vdzsKKwlpbnQgZmQsIGlkeDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCW5vdyA9IHRpbWUoTlVMTCk7CisJZGlmZiA9IG5vdyAtIGRldi0+YmlkX3RpbWU7CisKKwlpZiAoKG5vdyA8IGRldi0+YmlkX3RpbWUpIHx8CisJICAgIChkaWZmIDwgQkxLSURfUFJPQkVfTUlOKSB8fAorCSAgICAoZGV2LT5iaWRfZmxhZ3MgJiBCTEtJRF9CSURfRkxfVkVSSUZJRUQgJiYKKwkgICAgIGRpZmYgPCBCTEtJRF9QUk9CRV9JTlRFUlZBTCkpCisJCXJldHVybiBkZXY7CisKKwlEQkcoREVCVUdfUFJPQkUsCisJICAgIHByaW50ZigibmVlZCB0byByZXZhbGlkYXRlICVzICh0aW1lIHNpbmNlIGxhc3QgY2hlY2sgJWx1KVxuIiwKKwkJICAgZGV2LT5iaWRfbmFtZSwgZGlmZikpOworCisJaWYgKCgoZmQgPSBvcGVuKGRldi0+YmlkX25hbWUsIE9fUkRPTkxZKSkgPCAwKSB8fAorCSAgICAoZnN0YXQoZmQsICZzdCkgPCAwKSkgeworCQlpZiAoZXJybm8gPT0gRU5YSU8gfHwgZXJybm8gPT0gRU5PREVWIHx8IGVycm5vID09IEVOT0VOVCkgeworCQkJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIFdlIGRvbid0IGhhdmUgcmVhZCBwZXJtaXNzaW9uLCBqdXN0IHJldHVybiBjYWNoZSBkYXRhLiAqLworCQlEQkcoREVCVUdfUFJPQkUsCisJCSAgICBwcmludGYoInJldHVybmluZyB1bnZlcmlmaWVkIGRhdGEgZm9yICVzXG4iLAorCQkJICAgZGV2LT5iaWRfbmFtZSkpOworCQlyZXR1cm4gZGV2OworCX0KKworCW1lbXNldChidWZzLCAwLCBzaXplb2YoYnVmcykpOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgdGhlIHR5cGUgYXJyYXkuICBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIHR5cGUsCisJICogdGhlbiB0cnkgdGhhdCBmaXJzdC4gIElmIGl0IGRvZXNuJ3Qgd29yaywgdGhlbiBibG93IGF3YXkKKwkgKiB0aGUgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIHRyeSBhZ2Fpbi4KKwkgKgorCSAqLwordHJ5X2FnYWluOgorCXR5cGUgPSAwOworCWlmICghZGV2LT5iaWRfdHlwZSB8fCAhc3RyY21wKGRldi0+YmlkX3R5cGUsICJtZHJhaWQiKSkgeworCQl1dWlkX3QJdXVpZDsKKworCQlpZiAoY2hlY2tfbWRyYWlkKGZkLCB1dWlkKSA9PSAwKSB7CisJCQlzZXRfdXVpZChkZXYsIHV1aWQpOworCQkJdHlwZSA9ICJtZHJhaWQiOworCQkJZ290byBmb3VuZF90eXBlOworCQl9CisJfQorCWZvciAoaWQgPSB0eXBlX2FycmF5OyBpZC0+YmltX3R5cGU7IGlkKyspIHsKKwkJaWYgKGRldi0+YmlkX3R5cGUgJiYKKwkJICAgIHN0cmNtcChpZC0+YmltX3R5cGUsIGRldi0+YmlkX3R5cGUpKQorCQkJY29udGludWU7CisKKwkJaWR4ID0gaWQtPmJpbV9rYm9mZiArIChpZC0+YmltX3Nib2ZmID4+IDEwKTsKKwkJaWYgKGlkeCA+IEJMS0lEX0JMS19PRkZTIHx8IGlkeCA8IDApCisJCQljb250aW51ZTsKKwkJYnVmID0gYnVmc1tpZHhdOworCQlpZiAoIWJ1ZikgeworCQkJaWYgKGxzZWVrKGZkLCBpZHggPDwgMTAsIFNFRUtfU0VUKSA8IDApCisJCQkJY29udGludWU7CisKKwkJCWJ1ZiA9IHhtYWxsb2MoMTAyNCk7CisKKwkJCWlmIChyZWFkKGZkLCBidWYsIDEwMjQpICE9IDEwMjQpIHsKKwkJCQlmcmVlKGJ1Zik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlidWZzW2lkeF0gPSBidWY7CisJCX0KKworCQlpZiAobWVtY21wKGlkLT5iaW1fbWFnaWMsIGJ1ZiArIChpZC0+YmltX3Nib2ZmJjB4M2ZmKSwKKwkJCSAgIGlkLT5iaW1fbGVuKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoaWQtPmJpbV9wcm9iZSA9PSBOVUxMKSB8fAorCQkgICAgKGlkLT5iaW1fcHJvYmUoZmQsIGNhY2hlLCBkZXYsIGlkLCBidWYpID09IDApKSB7CisJCQl0eXBlID0gaWQtPmJpbV90eXBlOworCQkJZ290byBmb3VuZF90eXBlOworCQl9CisJfQorCisJaWYgKCFpZC0+YmltX3R5cGUgJiYgZGV2LT5iaWRfdHlwZSkgeworCQkvKgorCQkgKiBaYXAgdGhlIGRldmljZSBmaWxlc3lzdGVtIHR5cGUgYW5kIHRyeSBhZ2FpbgorCQkgKi8KKwkJYmxraWRfc2V0X3RhZyhkZXYsICJUWVBFIiwgMCwgMCk7CisJCWJsa2lkX3NldF90YWcoZGV2LCAiU0VDX1RZUEUiLCAwLCAwKTsKKwkJYmxraWRfc2V0X3RhZyhkZXYsICJMQUJFTCIsIDAsIDApOworCQlibGtpZF9zZXRfdGFnKGRldiwgIlVVSUQiLCAwLCAwKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKCFkZXYtPmJpZF90eXBlKSB7CisJCWJsa2lkX2ZyZWVfZGV2KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworZm91bmRfdHlwZToKKwlpZiAoZGV2ICYmIHR5cGUpIHsKKwkJZGV2LT5iaWRfZGV2bm8gPSBzdC5zdF9yZGV2OworCQlkZXYtPmJpZF90aW1lID0gdGltZShOVUxMKTsKKwkJZGV2LT5iaWRfZmxhZ3MgfD0gQkxLSURfQklEX0ZMX1ZFUklGSUVEOworCQljYWNoZS0+YmljX2ZsYWdzIHw9IEJMS0lEX0JJQ19GTF9DSEFOR0VEOworCisJCWJsa2lkX3NldF90YWcoZGV2LCAiVFlQRSIsIHR5cGUsIDApOworCisJCURCRyhERUJVR19QUk9CRSwgcHJpbnRmKCIlczogZGV2bm8gMHglMDRsbHgsIHR5cGUgJXNcbiIsCisJCQkgICBkZXYtPmJpZF9uYW1lLCBzdC5zdF9yZGV2LCB0eXBlKSk7CisJfQorCisJY2xvc2UoZmQpOworCisJcmV0dXJuIGRldjsKK30KKworaW50IGJsa2lkX2tub3duX2ZzdHlwZShjb25zdCBjaGFyICpmc3R5cGUpCit7CisJY29uc3Qgc3RydWN0IGJsa2lkX21hZ2ljICppZDsKKworCWZvciAoaWQgPSB0eXBlX2FycmF5OyBpZC0+YmltX3R5cGU7IGlkKyspIHsKKwkJaWYgKHN0cmNtcChmc3R5cGUsIGlkLT5iaW1fdHlwZSkgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa2lkX2RldiBkZXY7CisJYmxraWRfY2FjaGUgY2FjaGU7CisJaW50IHJldDsKKworCWJsa2lkX2RlYnVnX21hc2sgPSBERUJVR19BTEw7CisJaWYgKGFyZ2MgIT0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBkZXZpY2VcbiIKKwkJCSJQcm9iZSBhIHNpbmdsZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHR5cGVcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoKHJldCA9IGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGJiX2Rldl9udWxsKSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBjcmVhdGluZyBjYWNoZSAoJWQpXG4iLAorCQkJYXJndlswXSwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisJZGV2ID0gYmxraWRfZ2V0X2RldihjYWNoZSwgYXJndlsxXSwgQkxLSURfREVWX05PUk1BTCk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRmKCIlczogJXMgaGFzIGFuIHVuc3VwcG9ydGVkIHR5cGVcbiIsIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRmKCIlcyBpcyB0eXBlICVzXG4iLCBhcmd2WzFdLCBkZXYtPmJpZF90eXBlID8KKwkJZGV2LT5iaWRfdHlwZSA6ICIobnVsbCkiKTsKKwlpZiAoZGV2LT5iaWRfbGFiZWwpCisJCXByaW50ZigiXHRsYWJlbCBpcyAnJXMnXG4iLCBkZXYtPmJpZF9sYWJlbCk7CisJaWYgKGRldi0+YmlkX3V1aWQpCisJCXByaW50ZigiXHR1dWlkIGlzICVzXG4iLCBkZXYtPmJpZF91dWlkKTsKKworCWJsa2lkX2ZyZWVfZGV2KGRldik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Byb2JlLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9wcm9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDhmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9wcm9iZS5oCkBAIC0wLDAgKzEsMzc0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwcm9iZS5oIC0gY29uc3RhbnRzIGFuZCBvbi1kaXNrIHN0cnVjdHVyZXMgZm9yIGV4dHJhY3RpbmcgZGV2aWNlIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgQW5kcmllcyBCcm91d2VyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMgYnkgVGhlb2RvcmUgVHMnbworICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgRGlsZ2VyCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworI2lmbmRlZiBCTEtJRF9QUk9CRV9ICisjZGVmaW5lIEJMS0lEX1BST0JFX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGJsa2lkX21hZ2ljOworCit0eXBlZGVmIGludCAoKmJsa2lkX3Byb2JlX3QpKGludCBmZCwgYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiBkZXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBibGtpZF9tYWdpYyAqaWQsIHVuc2lnbmVkIGNoYXIgKmJ1Zik7CisKK3N0cnVjdCBibGtpZF9tYWdpYyB7CisJY29uc3QgY2hhcgkqYmltX3R5cGU7CS8qIHR5cGUgbmFtZSBmb3IgdGhpcyBtYWdpYyAqLworCWxvbmcJCWJpbV9rYm9mZjsJLyoga2lsb2J5dGUgb2Zmc2V0IG9mIHN1cGVyYmxvY2sgKi8KKwl1bnNpZ25lZAliaW1fc2JvZmY7CS8qIGJ5dGUgb2Zmc2V0IHdpdGhpbiBzdXBlcmJsb2NrICovCisJdW5zaWduZWQJYmltX2xlbjsJLyogbGVuZ3RoIG9mIG1hZ2ljICovCisJY29uc3QgY2hhcgkqYmltX21hZ2ljOwkvKiBtYWdpYyBzdHJpbmcgKi8KKwlibGtpZF9wcm9iZV90CWJpbV9wcm9iZTsJLyogcHJvYmUgZnVuY3Rpb24gKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmVzIGZvciBlYWNoIG9mIHRoZSBjb250ZW50IHR5cGVzIHdlIHdhbnQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbgorICogZnJvbS4gIFdlIGRvIG5vdCBuZWNlc3NhcmlseSBuZWVkIHRoZSBtYWdpYyBmaWVsZCBoZXJlLCBiZWNhdXNlIHdlIGhhdmUKKyAqIGFscmVhZHkgaWRlbnRpZmllZCB0aGUgY29udGVudCB0eXBlIGJlZm9yZSB3ZSBnZXQgdGhpcyBmYXIuICBJdCBtYXkgc3RpbGwKKyAqIGJlIHVzZWZ1bCBpZiB0aGVyZSBhcmUgcHJvYmUgZnVuY3Rpb25zIHdoaWNoIGhhbmRsZSBtdWx0aXBsZSBjb250ZW50IHR5cGVzLgorICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisJX191MzIJCXNfaW5vZGVzX2NvdW50OworCV9fdTMyCQlzX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJc19yX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJc19mcmVlX2Jsb2Nrc19jb3VudDsKKwlfX3UzMgkJc19mcmVlX2lub2Rlc19jb3VudDsKKwlfX3UzMgkJc19maXJzdF9kYXRhX2Jsb2NrOworCV9fdTMyCQlzX2xvZ19ibG9ja19zaXplOworCV9fdTMyCQlzX2R1bW15M1s3XTsKKwl1bnNpZ25lZCBjaGFyCXNfbWFnaWNbMl07CisJX191MTYJCXNfc3RhdGU7CisJX191MzIJCXNfZHVtbXk1WzhdOworCV9fdTMyCQlzX2ZlYXR1cmVfY29tcGF0OworCV9fdTMyCQlzX2ZlYXR1cmVfaW5jb21wYXQ7CisJX191MzIJCXNfZmVhdHVyZV9yb19jb21wYXQ7CisJdW5zaWduZWQgY2hhciAgIHNfdXVpZFsxNl07CisJY2hhcgkgICBzX3ZvbHVtZV9uYW1lWzE2XTsKK307CisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWCTB4MDAwMDAwMDgKKworc3RydWN0IHhmc19zdXBlcl9ibG9jayB7CisJdW5zaWduZWQgY2hhcgl4c19tYWdpY1s0XTsKKwlfX3UzMgkJeHNfYmxvY2tzaXplOworCV9fdTY0CQl4c19kYmxvY2tzOworCV9fdTY0CQl4c19yYmxvY2tzOworCV9fdTMyCQl4c19kdW1teTFbMl07CisJdW5zaWduZWQgY2hhcgl4c191dWlkWzE2XTsKKwlfX3UzMgkJeHNfZHVtbXkyWzE1XTsKKwljaGFyCQl4c19mbmFtZVsxMl07CisJX191MzIJCXhzX2R1bW15M1syXTsKKwlfX3U2NAkJeHNfaWNvdW50OworCV9fdTY0CQl4c19pZnJlZTsKKwlfX3U2NAkJeHNfZmRibG9ja3M7Cit9OworCitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCV9fdTMyCQlyc19ibG9ja3NfY291bnQ7CisJX191MzIJCXJzX2ZyZWVfYmxvY2tzOworCV9fdTMyCQlyc19yb290X2Jsb2NrOworCV9fdTMyCQlyc19qb3VybmFsX2Jsb2NrOworCV9fdTMyCQlyc19qb3VybmFsX2RldjsKKwlfX3UzMgkJcnNfb3JpZ19qb3VybmFsX3NpemU7CisJX191MzIJCXJzX2R1bW15Mls1XTsKKwlfX3UxNgkJcnNfYmxvY2tzaXplOworCV9fdTE2CQlyc19kdW1teTNbM107CisJdW5zaWduZWQgY2hhcglyc19tYWdpY1sxMl07CisJX191MzIJCXJzX2R1bW15NFs1XTsKKwl1bnNpZ25lZCBjaGFyCXJzX3V1aWRbMTZdOworCWNoYXIJCXJzX2xhYmVsWzE2XTsKK307CisKK3N0cnVjdCBqZnNfc3VwZXJfYmxvY2sgeworCXVuc2lnbmVkIGNoYXIJanNfbWFnaWNbNF07CisJX191MzIJCWpzX3ZlcnNpb247CisJX191NjQJCWpzX3NpemU7CisJX191MzIJCWpzX2JzaXplOworCV9fdTMyCQlqc19kdW1teTE7CisJX191MzIJCWpzX3Bic2l6ZTsKKwlfX3UzMgkJanNfZHVtbXkyWzI3XTsKKwl1bnNpZ25lZCBjaGFyCWpzX3V1aWRbMTZdOworCXVuc2lnbmVkIGNoYXIJanNfbGFiZWxbMTZdOworCXVuc2lnbmVkIGNoYXIJanNfbG9ndXVpZFsxNl07Cit9OworCitzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgeworCXVuc2lnbmVkIGNoYXIJcm9zX21hZ2ljWzhdOworCV9fdTMyCQlyb3NfZHVtbXkxWzJdOworCXVuc2lnbmVkIGNoYXIJcm9zX3ZvbHVtZVsxNl07Cit9OworCitzdHJ1Y3QgY3JhbWZzX3N1cGVyX2Jsb2NrIHsKKwlfX3U4CQltYWdpY1s0XTsKKwlfX3UzMgkJc2l6ZTsKKwlfX3UzMgkJZmxhZ3M7CisJX191MzIJCWZ1dHVyZTsKKwlfX3U4CQlzaWduYXR1cmVbMTZdOworCXN0cnVjdCBjcmFtZnNfaW5mbyB7CisJCV9fdTMyCQljcmM7CisJCV9fdTMyCQllZGl0aW9uOworCQlfX3UzMgkJYmxvY2tzOworCQlfX3UzMgkJZmlsZXM7CisJfSBpbmZvOworCV9fdTgJCW5hbWVbMTZdOworfTsKKworc3RydWN0IHN3YXBfaWRfYmxvY2sgeworLyoJdW5zaWduZWQgY2hhcglzd3NfYm9vdFsxMDI0XTsgKi8KKwlfX3UzMgkJc3dzX3ZlcnNpb247CisJX191MzIJCXN3c19sYXN0cGFnZTsKKwlfX3UzMgkJc3dzX25yYmFkOworCXVuc2lnbmVkIGNoYXIJc3dzX3V1aWRbMTZdOworCWNoYXIJCXN3c192b2x1bWVbMTZdOworCXVuc2lnbmVkIGNoYXIJc3dzX3BhZFsxMTddOworCV9fdTMyCQlzd3NfYmFkcGc7Cit9OworCisvKiBZdWNreSBtaXNhbGlnbmVkIHZhbHVlcyAqLworc3RydWN0IHZmYXRfc3VwZXJfYmxvY2sgeworLyogMDAqLwl1bnNpZ25lZCBjaGFyCXZzX2lnbm9yZWRbM107CisvKiAwMyovCXVuc2lnbmVkIGNoYXIJdnNfc3lzaWRbOF07CisvKiAwYiovCXVuc2lnbmVkIGNoYXIJdnNfc2VjdG9yX3NpemVbMl07CisvKiAwZCovCV9fdTgJCXZzX2NsdXN0ZXJfc2l6ZTsKKy8qIDBlKi8JX191MTYJCXZzX3Jlc2VydmVkOworLyogMTAqLwlfX3U4CQl2c19mYXRzOworLyogMTEqLwl1bnNpZ25lZCBjaGFyCXZzX2Rpcl9lbnRyaWVzWzJdOworLyogMTMqLwl1bnNpZ25lZCBjaGFyCXZzX3NlY3RvcnNbMl07CisvKiAxNSovCXVuc2lnbmVkIGNoYXIJdnNfbWVkaWE7CisvKiAxNiovCV9fdTE2CQl2c19mYXRfbGVuZ3RoOworLyogMTgqLwlfX3UxNgkJdnNfc2Vjc190cmFjazsKKy8qIDFhKi8JX191MTYJCXZzX2hlYWRzOworLyogMWMqLwlfX3UzMgkJdnNfaGlkZGVuOworLyogMjAqLwlfX3UzMgkJdnNfdG90YWxfc2VjdDsKKy8qIDI0Ki8JX191MzIJCXZzX2ZhdDMyX2xlbmd0aDsKKy8qIDI4Ki8JX191MTYJCXZzX2ZsYWdzOworLyogMmEqLwlfX3U4CQl2c192ZXJzaW9uWzJdOworLyogMmMqLwlfX3UzMgkJdnNfcm9vdF9jbHVzdGVyOworLyogMzAqLwlfX3UxNgkJdnNfaW5zZm9fc2VjdG9yOworLyogMzIqLwlfX3UxNgkJdnNfYmFja3VwX2Jvb3Q7CisvKiAzNCovCV9fdTE2CQl2c19yZXNlcnZlZDJbNl07CisvKiA0MCovCXVuc2lnbmVkIGNoYXIJdnNfdW5rbm93blszXTsKKy8qIDQzKi8JdW5zaWduZWQgY2hhcgl2c19zZXJub1s0XTsKKy8qIDQ3Ki8JY2hhcgkJdnNfbGFiZWxbMTFdOworLyogNTIqLwl1bnNpZ25lZCBjaGFyICAgdnNfbWFnaWNbOF07CisvKiA1YSovCXVuc2lnbmVkIGNoYXIJdnNfZHVtbXkyWzE2NF07CisvKjFmZSovCXVuc2lnbmVkIGNoYXIJdnNfcG1hZ2ljWzJdOworfTsKKworLyogWXVja3kgbWlzYWxpZ25lZCB2YWx1ZXMgKi8KK3N0cnVjdCBtc2Rvc19zdXBlcl9ibG9jayB7CisvKiAwMCovCXVuc2lnbmVkIGNoYXIJbXNfaWdub3JlZFszXTsKKy8qIDAzKi8JdW5zaWduZWQgY2hhcgltc19zeXNpZFs4XTsKKy8qIDBiKi8JdW5zaWduZWQgY2hhcgltc19zZWN0b3Jfc2l6ZVsyXTsKKy8qIDBkKi8JX191OAkJbXNfY2x1c3Rlcl9zaXplOworLyogMGUqLwlfX3UxNgkJbXNfcmVzZXJ2ZWQ7CisvKiAxMCovCV9fdTgJCW1zX2ZhdHM7CisvKiAxMSovCXVuc2lnbmVkIGNoYXIJbXNfZGlyX2VudHJpZXNbMl07CisvKiAxMyovCXVuc2lnbmVkIGNoYXIJbXNfc2VjdG9yc1syXTsKKy8qIDE1Ki8JdW5zaWduZWQgY2hhcgltc19tZWRpYTsKKy8qIDE2Ki8JX191MTYJCW1zX2ZhdF9sZW5ndGg7CisvKiAxOCovCV9fdTE2CQltc19zZWNzX3RyYWNrOworLyogMWEqLwlfX3UxNgkJbXNfaGVhZHM7CisvKiAxYyovCV9fdTMyCQltc19oaWRkZW47CisvKiAyMCovCV9fdTMyCQltc190b3RhbF9zZWN0OworLyogMjQqLwl1bnNpZ25lZCBjaGFyCW1zX3Vua25vd25bM107CisvKiAyNyovCXVuc2lnbmVkIGNoYXIJbXNfc2Vybm9bNF07CisvKiAyYiovCWNoYXIJCW1zX2xhYmVsWzExXTsKKy8qIDM2Ki8JdW5zaWduZWQgY2hhciAgIG1zX21hZ2ljWzhdOworLyogM2QqLwl1bnNpZ25lZCBjaGFyCW1zX2R1bW15MlsxOTJdOworLyoxZmUqLwl1bnNpZ25lZCBjaGFyCW1zX3BtYWdpY1syXTsKK307CisKK3N0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7CisJX191MTYJCW1zX25pbm9kZXM7CisJX191MTYJCW1zX256b25lczsKKwlfX3UxNgkJbXNfaW1hcF9ibG9ja3M7CisJX191MTYJCW1zX3ptYXBfYmxvY2tzOworCV9fdTE2CQltc19maXJzdGRhdGF6b25lOworCV9fdTE2CQltc19sb2dfem9uZV9zaXplOworCV9fdTMyCQltc19tYXhfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCW1zX21hZ2ljWzJdOworCV9fdTE2CQltc19zdGF0ZTsKKwlfX3UzMgkJbXNfem9uZXM7Cit9OworCitzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfcyB7CisJX191MzIgbWRfbWFnaWM7CisJX191MzIgbWFqb3JfdmVyc2lvbjsKKwlfX3UzMiBtaW5vcl92ZXJzaW9uOworCV9fdTMyIHBhdGNoX3ZlcnNpb247CisJX191MzIgZ3ZhbGlkX3dvcmRzOworCV9fdTMyIHNldF91dWlkMDsKKwlfX3UzMiBjdGltZTsKKwlfX3UzMiBsZXZlbDsKKwlfX3UzMiBzaXplOworCV9fdTMyIG5yX2Rpc2tzOworCV9fdTMyIHJhaWRfZGlza3M7CisJX191MzIgbWRfbWlub3I7CisJX191MzIgbm90X3BlcnNpc3RlbnQ7CisJX191MzIgc2V0X3V1aWQxOworCV9fdTMyIHNldF91dWlkMjsKKwlfX3UzMiBzZXRfdXVpZDM7Cit9OworCitzdHJ1Y3QgaGZzX3N1cGVyX2Jsb2NrIHsKKwljaGFyCWhfbWFnaWNbMl07CisJY2hhcgloX2R1bW15WzE4XTsKKwlfX3UzMgloX2Jsa3NpemU7Cit9OworCitzdHJ1Y3Qgb2Nmc192b2x1bWVfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyCW1pbm9yX3ZlcnNpb25bNF07CisJdW5zaWduZWQgY2hhcgltYWpvcl92ZXJzaW9uWzRdOworCXVuc2lnbmVkIGNoYXIJc2lnbmF0dXJlWzEyOF07CisJY2hhcgkJbW91bnRbMTI4XTsKKwl1bnNpZ25lZCBjaGFyICAgbW91bnRfbGVuWzJdOworfTsKKworc3RydWN0IG9jZnNfdm9sdW1lX2xhYmVsIHsKKwl1bnNpZ25lZCBjaGFyCWRpc2tfbG9ja1s0OF07CisJY2hhcgkJbGFiZWxbNjRdOworCXVuc2lnbmVkIGNoYXIJbGFiZWxfbGVuWzJdOworCXVuc2lnbmVkIGNoYXIgIHZvbF9pZFsxNl07CisJdW5zaWduZWQgY2hhciAgdm9sX2lkX2xlblsyXTsKK307CisKKyNkZWZpbmUgb2Nmc21ham9yKG8pICgoX191MzIpby5tYWpvcl92ZXJzaW9uWzBdIFwKKyAgICAgICAgICAgICAgICAgICArICgoKF9fdTMyKSBvLm1ham9yX3ZlcnNpb25bMV0pIDw8IDgpIFwKKyAgICAgICAgICAgICAgICAgICArICgoKF9fdTMyKSBvLm1ham9yX3ZlcnNpb25bMl0pIDw8IDE2KSBcCisgICAgICAgICAgICAgICAgICAgKyAoKChfX3UzMikgby5tYWpvcl92ZXJzaW9uWzNdKSA8PCAyNCkpCisjZGVmaW5lIG9jZnNsYWJlbGxlbihvKQkoKF9fdTMyKW8ubGFiZWxfbGVuWzBdICsgKCgoX191MzIpIG8ubGFiZWxfbGVuWzFdKSA8PCA4KSkKKyNkZWZpbmUgb2Nmc21vdW50bGVuKG8pCSgoX191MzIpby5tb3VudF9sZW5bMF0gKyAoKChfX3UzMikgby5tb3VudF9sZW5bMV0pPDw4KSkKKworI2RlZmluZSBPQ0ZTX01BR0lDICJPcmFjbGVDRlMiCisKK3N0cnVjdCBvY2ZzMl9zdXBlcl9ibG9jayB7CisJdW5zaWduZWQgY2hhciAgc2lnbmF0dXJlWzhdOworCXVuc2lnbmVkIGNoYXIgIHNfZHVtbXkxWzE4NF07CisJdW5zaWduZWQgY2hhciAgc19kdW1teTJbODBdOworCWNoYXIJICAgICAgIHNfbGFiZWxbNjRdOworCXVuc2lnbmVkIGNoYXIgIHNfdXVpZFsxNl07Cit9OworCisjZGVmaW5lIE9DRlMyX01JTl9CTE9DS1NJWkUgICAgICAgICAgICAgNTEyCisjZGVmaW5lIE9DRlMyX01BWF9CTE9DS1NJWkUgICAgICAgICAgICAgNDA5NgorCisjZGVmaW5lIE9DRlMyX1NVUEVSX0JMT0NLX0JMS05PICAgICAgICAgMgorCisjZGVmaW5lIE9DRlMyX1NVUEVSX0JMT0NLX1NJR05BVFVSRSAgICAgIk9DRlNWMiIKKworc3RydWN0IG9yYWNsZV9hc21fZGlza19sYWJlbCB7CisJY2hhciBkdW1teVszMl07CisJY2hhciBkbF90YWdbOF07CisJY2hhciBkbF9pZFsyNF07Cit9OworCisjZGVmaW5lIE9SQUNMRV9BU01fRElTS19MQUJFTF9NQVJLRUQgICAgIk9SQ0xESVNLIgorI2RlZmluZSBPUkFDTEVfQVNNX0RJU0tfTEFCRUxfT0ZGU0VUICAgIDMyCisKKyNkZWZpbmUgSVNPRENMKGZyb20sIHRvKSAodG8gLSBmcm9tICsgMSkKK3N0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgeworCWNoYXIgdHlwZVtJU09EQ0woMSwxKV07IC8qIDcxMSAqLworCWNoYXIgaWRbSVNPRENMKDIsNildOworCWNoYXIgdmVyc2lvbltJU09EQ0woNyw3KV07CisJY2hhciBkYXRhW0lTT0RDTCg4LDIwNDgpXTsKK307CisKKy8qCisgKiBCeXRlIHN3YXAgZnVuY3Rpb25zCisgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBfSU5MSU5FXyBzdGF0aWMgX19pbmxpbmVfXworI2Vsc2UJCQkJLyogRm9yIFdhdGNvbSBDICovCisjZGVmaW5lIF9JTkxJTkVfIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCitzdGF0aWMgX191MTYgYmxraWRfc3dhYjE2KF9fdTE2IHZhbCk7CitzdGF0aWMgX191MzIgYmxraWRfc3dhYjMyKF9fdTMyIHZhbCk7CitzdGF0aWMgX191NjQgYmxraWRfc3dhYjY0KF9fdTY0IHZhbCk7CisKKyNpZiAoKGRlZmluZWQgX19HTlVDX18pICYmIFwKKyAgICAgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pKSkKKworI2RlZmluZSBfQkxLSURfSEFWRV9BU01fQklUT1BTXworCitfSU5MSU5FXyBfX3UzMiBibGtpZF9zd2FiMzIoX191MzIgdmFsKQoreworI2lmZGVmIEVYVDJGU19SRVFVSVJFXzQ4NgorCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHZhbCkgOiAiMCIgKHZhbCkpOworI2Vsc2UKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJLyogc3dhcCBsb3dlciBieXRlcyAgKi8KKwkJInJvcmwgJDE2LCUwXG5cdCIJLyogc3dhcCB3b3JkcyAgICAgICAgKi8KKwkJInhjaGdiICViMCwlaDAiCQkvKiBzd2FwIGhpZ2hlciBieXRlcyAqLworCQk6Ij1xIiAodmFsKQorCQk6ICIwIiAodmFsKSk7CisjZW5kaWYKKwlyZXR1cm4gdmFsOworfQorCitfSU5MSU5FXyBfX3UxNiBibGtpZF9zd2FiMTYoX191MTYgdmFsKQoreworCV9fYXNtX18oInhjaGdiICViMCwlaDAiCQkvKiBzd2FwIGJ5dGVzICovCisJCTogIj1xIiAodmFsKQorCQk6ICAiMCIgKHZhbCkpOworCQlyZXR1cm4gdmFsOworfQorCitfSU5MSU5FXyBfX3U2NCBibGtpZF9zd2FiNjQoX191NjQgdmFsKQoreworCXJldHVybiBibGtpZF9zd2FiMzIodmFsID4+IDMyKSB8CisJICAgICAgICggKChfX3U2NClibGtpZF9zd2FiMzIoKF9fdTMyKXZhbCkpIDw8IDMyICk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9CTEtJRF9IQVZFX0FTTV9CSVRPUFNfKQorCitfSU5MSU5FXyAgX191MTYgYmxraWRfc3dhYjE2KF9fdTE2IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCA+PiA4KSB8ICh2YWwgPDwgOCk7Cit9CisKK19JTkxJTkVfIF9fdTMyIGJsa2lkX3N3YWIzMihfX3UzMiB2YWwpCit7CisJcmV0dXJuICh2YWw+PjI0KSB8ICgodmFsPj44KSAmIDB4RkYwMCkgfAorCQkoKHZhbDw8OCkgJiAweEZGMDAwMCkgfCAodmFsPDwyNCk7Cit9CisKK19JTkxJTkVfIF9fdTY0IGJsa2lkX3N3YWI2NChfX3U2NCB2YWwpCit7CisJcmV0dXJuIGJsa2lkX3N3YWIzMih2YWwgPj4gMzIpIHwKKwkgICAgICAgKCAoKF9fdTY0KWJsa2lkX3N3YWIzMigoX191MzIpdmFsKSkgPDwgMzIgKTsKK30KKyNlbmRpZgorCisKKworI2lmICBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjZGVmaW5lIGJsa2lkX2xlMTYoeCkgYmxraWRfc3dhYjE2KHgpCisjZGVmaW5lIGJsa2lkX2xlMzIoeCkgYmxraWRfc3dhYjMyKHgpCisjZGVmaW5lIGJsa2lkX2xlNjQoeCkgYmxraWRfc3dhYjY0KHgpCisjZGVmaW5lIGJsa2lkX2JlMTYoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2JlMzIoeCkgKHgpCisjZGVmaW5lIGJsa2lkX2JlNjQoeCkgKHgpCisjZWxzZQorI2RlZmluZSBibGtpZF9sZTE2KHgpICh4KQorI2RlZmluZSBibGtpZF9sZTMyKHgpICh4KQorI2RlZmluZSBibGtpZF9sZTY0KHgpICh4KQorI2RlZmluZSBibGtpZF9iZTE2KHgpIGJsa2lkX3N3YWIxNih4KQorI2RlZmluZSBibGtpZF9iZTMyKHgpIGJsa2lkX3N3YWIzMih4KQorI2RlZmluZSBibGtpZF9iZTY0KHgpIGJsa2lkX3N3YWI2NCh4KQorI2VuZGlmCisKKyN1bmRlZiBfSU5MSU5FXworCisjZW5kaWYgLyogX0JMS0lEX1BST0JFX0ggKi8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3JlYWQuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk1YTVkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvcmVhZC5jCkBAIC0wLDAgKzEsNDU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZWFkLmMgLSByZWFkIHRoZSBibGtpZCBjYWNoZSBmcm9tIGRpc2ssIHRvIGF2b2lkIHNjYW5uaW5nIGFsbCBkZXZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzIFRoZW9kb3JlIFkuIFRzJ28KKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJibGtpZFAuaCIKKyNpbmNsdWRlICIuLi91dWlkL3V1aWQuaCIKKworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyNkZWZpbmUgX19VU0VfSVNPQzlYCisjZGVmaW5lIFNUUlRPVUxMIHN0cnRvdWxsIC8qIGRlZmluZWQgaW4gc3RkbGliLmggaWYgeW91IHRyeSBoYXJkIGVub3VnaCAqLworI2Vsc2UKKy8qIEZJWE1FOiBuZWVkIHRvIHN1cHBvcnQgcmVhbCBzdHJ0b3VsbCBoZXJlICovCisjZGVmaW5lIFNUUlRPVUxMIHN0cnRvdWwKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBURVNUX1BST0dSQU0KKyNkZWZpbmUgYmxraWRfZGVidWdfZHVtcF9kZXYoZGV2KSAgKGRlYnVnX2R1bXBfZGV2KGRldikpCitzdGF0aWMgdm9pZCBkZWJ1Z19kdW1wX2RldihibGtpZF9kZXYgZGV2KTsKKyNlbmRpZgorCisvKgorICogRmlsZSBmb3JtYXQ6CisgKgorICoJPGRldmljZSBbPE5BTUU9InZhbHVlIj4gLi4uXT5kZXZpY2VfbmFtZTwvZGV2aWNlPgorICoKKyAqCVRoZSBmb2xsb3dpbmcgdGFncyBhcmUgcmVxdWlyZWQgZm9yIGVhY2ggZW50cnk6CisgKgk8SUQ9ImlkIj4JdW5pcXVlICh3aXRoaW4gdGhpcyBmaWxlKSBJRCBudW1iZXIgb2YgdGhpcyBkZXZpY2UKKyAqCTxUSU1FPSJ0aW1lIj4JKGFzY2lpIHRpbWVfdCkgdGltZSB0aGlzIGVudHJ5IHdhcyBsYXN0IHJlYWQgZnJvbSBkaXNrCisgKgk8VFlQRT0idHlwZSI+CShkZXRlY3RlZCkgdHlwZSBvZiBmaWxlc3lzdGVtL2RhdGEgZm9yIHRoaXMgcGFydGl0aW9uCisgKgorICoJVGhlIGZvbGxvd2luZyB0YWdzIG1heSBiZSBwcmVzZW50LCBkZXBlbmRpbmcgb24gdGhlIGRldmljZSBjb250ZW50cworICoJPExBQkVMPSJsYWJlbCI+CSh1c2VyIHN1cHBsaWVkKSBsYWJlbCAodm9sdW1lIG5hbWUsIGV0YykKKyAqCTxVVUlEPSJ1dWlkIj4JKGdlbmVyYXRlZCkgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgKHNlcmlhbCBubykKKyAqLworCitzdGF0aWMgY2hhciAqc2tpcF9vdmVyX2JsYW5rKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgaXNzcGFjZSgqY3ApKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworc3RhdGljIGNoYXIgKnNraXBfb3Zlcl93b3JkKGNoYXIgKmNwKQoreworCWNoYXIgY2g7CisKKwl3aGlsZSAoKGNoID0gKmNwKSkgeworCQkvKiBJZiB3ZSBzZWUgYSBiYWNrc2xhc2gsIHNraXAgdGhlIG5leHQgY2hhcmFjdGVyICovCisJCWlmIChjaCA9PSAnXFwnKSB7CisJCQljcCsrOworCQkJaWYgKCpjcCA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpc3NwYWNlKGNoKSB8fCBjaCA9PSAnPCcgfHwgY2ggPT0gJz4nKQorCQkJYnJlYWs7CisJCWNwKys7CisJfQorCXJldHVybiBjcDsKK30KKworc3RhdGljIGNoYXIgKnN0cmlwX2xpbmUoY2hhciAqbGluZSkKK3sKKwljaGFyCSpwOworCisJbGluZSA9IHNraXBfb3Zlcl9ibGFuayhsaW5lKTsKKworCXAgPSBsaW5lICsgc3RybGVuKGxpbmUpIC0gMTsKKworCXdoaWxlICgqbGluZSkgeworCQlpZiAoaXNzcGFjZSgqcCkpCisJCQkqcC0tID0gJ1wwJzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxpbmU7Cit9CisKKy8qCisgKiBTdGFydCBwYXJzaW5nIGEgbmV3IGxpbmUgZnJvbSB0aGUgY2FjaGUuCisgKgorICogbGluZSBzdGFydHMgd2l0aCAiPGRldmljZSIgcmV0dXJuIDEgLT4gY29udGludWUgcGFyc2luZyBsaW5lCisgKiBsaW5lIHN0YXJ0cyB3aXRoICI8Zm9vIiwgZW1wdHksIG9yICMgcmV0dXJuIDAgLT4gc2tpcCBsaW5lCisgKiBsaW5lIHN0YXJ0cyB3aXRoIG90aGVyLCByZXR1cm4gLUJMS0lEX0VSUl9DQUNIRSAtPiBlcnJvcgorICovCitzdGF0aWMgaW50IHBhcnNlX3N0YXJ0KGNoYXIgKipjcCkKK3sKKwljaGFyICpwOworCisJcCA9IHN0cmlwX2xpbmUoKmNwKTsKKworCS8qIFNraXAgY29tbWVudCBvciBibGFuayBsaW5lcy4gIFdlIGNhbid0IGp1c3QgTlVMIHRoZSBmaXJzdCAnIycgY2hhciwKKwkgKiBpbiBjYXNlIGl0IGlzIGluc2lkZSBxdW90ZXMsIG9yIGVzY2FwZWQuCisJICovCisJaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJyMnKQorCQlyZXR1cm4gMDsKKworCWlmICghc3RybmNtcChwLCAiPGRldmljZSIsIDcpKSB7CisJCURCRyhERUJVR19SRUFELCBwcmludGYoImZvdW5kIGRldmljZSBoZWFkZXI6ICU4c1xuIiwgcCkpOworCQlwICs9IDc7CisKKwkJKmNwID0gcDsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCpwID09ICc8JykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUJMS0lEX0VSUl9DQUNIRTsKK30KKworLyogQ29uc3VtZSB0aGUgcmVtYWluaW5nIFhNTCBvbiB0aGUgbGluZSAoY29zbWV0aWMgb25seSkgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZW5kKGNoYXIgKipjcCkKK3sKKwkqY3AgPSBza2lwX292ZXJfYmxhbmsoKmNwKTsKKworCWlmICghc3RybmNtcCgqY3AsICI8L2RldmljZT4iLCA5KSkgeworCQlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCJmb3VuZCBkZXZpY2UgdHJhaWxlciAlOXNcbiIsICpjcCkpOworCQkqY3AgKz0gOTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1CTEtJRF9FUlJfQ0FDSEU7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBkZXZpY2Ugc3RydWN0IHdpdGggZGV2aWNlIG5hbWUgZmlsbGVkIGluLiAgV2lsbCBoYW5kbGUKKyAqIGZpbmRpbmcgdGhlIGRldmljZSBvbiBsaW5lcyBvZiB0aGUgZm9ybToKKyAqIDxkZXZpY2UgZm9vPWJhcj5kZXZuYW1lPC9kZXZpY2U+CisgKiA8ZGV2aWNlPmRldm5hbWU8Zm9vPmJhcjwvZm9vPjwvZGV2aWNlPgorICovCitzdGF0aWMgaW50IHBhcnNlX2RldihibGtpZF9jYWNoZSBjYWNoZSwgYmxraWRfZGV2ICpkZXYsIGNoYXIgKipjcCkKK3sKKwljaGFyICpzdGFydCwgKnRtcCwgKmVuZCwgKm5hbWU7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gcGFyc2Vfc3RhcnQoY3ApKSA8PSAwKQorCQlyZXR1cm4gcmV0OworCisJc3RhcnQgPSB0bXAgPSBzdHJjaHIoKmNwLCAnPicpOworCWlmICghc3RhcnQpIHsKKwkJREJHKERFQlVHX1JFQUQsCisJCSAgICBwcmludGYoImJsa2lkOiBzaG9ydCBsaW5lIHBhcnNpbmcgZGV2OiAlc1xuIiwgKmNwKSk7CisJCXJldHVybiAtQkxLSURfRVJSX0NBQ0hFOworCX0KKwlzdGFydCA9IHNraXBfb3Zlcl9ibGFuayhzdGFydCArIDEpOworCWVuZCA9IHNraXBfb3Zlcl93b3JkKHN0YXJ0KTsKKworCURCRyhERUJVR19SRUFELCBwcmludGYoImRldmljZSBzaG91bGQgYmUgJSpzXG4iLCBlbmQgLSBzdGFydCwgc3RhcnQpKTsKKworCWlmICgqKmNwID09ICc+JykKKwkJKmNwID0gZW5kOworCWVsc2UKKwkJKCpjcCkrKzsKKworCSp0bXAgPSAnXDAnOworCisJaWYgKCEodG1wID0gc3RycmNocihlbmQsICc8JykpIHx8IHBhcnNlX2VuZCgmdG1wKSA8IDApIHsKKwkJREJHKERFQlVHX1JFQUQsCisJCSAgICBwcmludGYoImJsa2lkOiBtaXNzaW5nIDwvZGV2aWNlPiBlbmRpbmc6ICVzXG4iLCBlbmQpKTsKKwl9IGVsc2UgaWYgKHRtcCkKKwkJKnRtcCA9ICdcMCc7CisKKwlpZiAoZW5kIC0gc3RhcnQgPD0gMSkgeworCQlEQkcoREVCVUdfUkVBRCwgcHJpbnRmKCJibGtpZDogZW1wdHkgZGV2aWNlIG5hbWU6ICVzXG4iLCAqY3ApKTsKKwkJcmV0dXJuIC1CTEtJRF9FUlJfQ0FDSEU7CisJfQorCisJbmFtZSA9IGJsa2lkX3N0cm5kdXAoc3RhcnQsIGVuZC1zdGFydCk7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfTUVNOworCisJREJHKERFQlVHX1JFQUQsIHByaW50ZigiZm91bmQgZGV2ICVzXG4iLCBuYW1lKSk7CisKKwlpZiAoISgqZGV2ID0gYmxraWRfZ2V0X2RldihjYWNoZSwgbmFtZSwgQkxLSURfREVWX0NSRUFURSkpKQorCQlyZXR1cm4gLUJMS0lEX0VSUl9NRU07CisKKwlmcmVlKG5hbWUpOworCXJldHVybiAxOworfQorCisvKgorICogRXh0cmFjdCBhIHRhZyBvZiB0aGUgZm9ybSBOQU1FPSJ2YWx1ZSIgZnJvbSB0aGUgbGluZS4KKyAqLworc3RhdGljIGludCBwYXJzZV90b2tlbihjaGFyICoqbmFtZSwgY2hhciAqKnZhbHVlLCBjaGFyICoqY3ApCit7CisJY2hhciAqZW5kOworCisJaWYgKCFuYW1lIHx8ICF2YWx1ZSB8fCAhY3ApCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJaWYgKCEoKnZhbHVlID0gc3RyY2hyKCpjcCwgJz0nKSkpCisJCXJldHVybiAwOworCisJKip2YWx1ZSA9ICdcMCc7CisJKm5hbWUgPSBzdHJpcF9saW5lKCpjcCk7CisJKnZhbHVlID0gc2tpcF9vdmVyX2JsYW5rKCp2YWx1ZSArIDEpOworCisJaWYgKCoqdmFsdWUgPT0gJyInKSB7CisJCWVuZCA9IHN0cmNocigqdmFsdWUgKyAxLCAnIicpOworCQlpZiAoIWVuZCkgeworCQkJREJHKERFQlVHX1JFQUQsCisJCQkgICAgcHJpbnRmKCJ1bmJhbGFuY2VkIHF1b3RlcyBhdDogJXNcbiIsICp2YWx1ZSkpOworCQkJKmNwID0gKnZhbHVlOworCQkJcmV0dXJuIC1CTEtJRF9FUlJfQ0FDSEU7CisJCX0KKwkJKCp2YWx1ZSkrKzsKKwkJKmVuZCA9ICdcMCc7CisJCWVuZCsrOworCX0gZWxzZSB7CisJCWVuZCA9IHNraXBfb3Zlcl93b3JkKCp2YWx1ZSk7CisJCWlmICgqZW5kKSB7CisJCQkqZW5kID0gJ1wwJzsKKwkJCWVuZCsrOworCQl9CisJfQorCSpjcCA9IGVuZDsKKworCXJldHVybiAxOworfQorCisvKgorICogRXh0cmFjdCBhIHRhZyBvZiB0aGUgZm9ybSA8TkFNRT52YWx1ZTwvTkFNRT4gZnJvbSB0aGUgbGluZS4KKyAqLworLyoKK3N0YXRpYyBpbnQgcGFyc2VfeG1sKGNoYXIgKipuYW1lLCBjaGFyICoqdmFsdWUsIGNoYXIgKipjcCkKK3sKKwljaGFyICplbmQ7CisKKwlpZiAoIW5hbWUgfHwgIXZhbHVlIHx8ICFjcCkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwkqbmFtZSA9IHN0cmlwX2xpbmUoKmNwKTsKKworCWlmICgoKm5hbWUpWzBdICE9ICc8JyB8fCAoKm5hbWUpWzFdID09ICcvJykKKwkJcmV0dXJuIDA7CisKKwlGSVhNRTogZmluaXNoIHRoaXMuCit9CisqLworCisvKgorICogRXh0cmFjdCBhIHRhZyBmcm9tIHRoZSBsaW5lLgorICoKKyAqIFJldHVybiAxIGlmIGEgdmFsaWQgdGFnIHdhcyBmb3VuZC4KKyAqIFJldHVybiAwIGlmIG5vIHRhZyBmb3VuZC4KKyAqIFJldHVybiAtdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBwYXJzZV90YWcoYmxraWRfY2FjaGUgY2FjaGUsIGJsa2lkX2RldiBkZXYsIGNoYXIgKipjcCkKK3sKKwljaGFyICpuYW1lOworCWNoYXIgKnZhbHVlOworCWludCByZXQ7CisKKwlpZiAoIWNhY2hlIHx8ICFkZXYpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJaWYgKChyZXQgPSBwYXJzZV90b2tlbigmbmFtZSwgJnZhbHVlLCBjcCkpIDw9IDAgLyogJiYKKwkgICAgKHJldCA9IHBhcnNlX3htbCgmbmFtZSwgJnZhbHVlLCBjcCkpIDw9IDAgKi8pCisJCXJldHVybiByZXQ7CisKKwkvKiBTb21lIHRhZ3MgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgZGV2aWNlIHN0cnVjdCAqLworCWlmICghc3RyY21wKG5hbWUsICJERVZOTyIpKQorCQlkZXYtPmJpZF9kZXZubyA9IFNUUlRPVUxMKHZhbHVlLCAwLCAwKTsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJQUkkiKSkKKwkJZGV2LT5iaWRfcHJpID0gc3RydG9sKHZhbHVlLCAwLCAwKTsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJUSU1FIikpCisJCS8qIEZJWE1FOiBuZWVkIHRvIHBhcnNlIGEgbG9uZyBsb25nIGV2ZW50dWFsbHkgKi8KKwkJZGV2LT5iaWRfdGltZSA9IHN0cnRvbCh2YWx1ZSwgMCwgMCk7CisJZWxzZQorCQlyZXQgPSBibGtpZF9zZXRfdGFnKGRldiwgbmFtZSwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCisJREJHKERFQlVHX1JFQUQsIHByaW50ZigiICAgIHRhZzogJXM9XCIlc1wiXG4iLCBuYW1lLCB2YWx1ZSkpOworCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAxOworfQorCisvKgorICogUGFyc2UgYSBzaW5nbGUgbGluZSBvZiBkYXRhLCBhbmQgcmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGRldiBzdHJ1Y3QuCisgKiBBZGQgdGhlIG5ldyBkZXZpY2UgdG8gdGhlIGNhY2hlIHN0cnVjdCwgaWYgb25lIHdhcyByZWFkLgorICoKKyAqIExpbmVzIGFyZSBvZiB0aGUgZm9ybSA8ZGV2aWNlIFtUQUc9InZhbHVlIiAuLi5dPi9kZXYvZm9vPC9kZXZpY2U+CisgKgorICogUmV0dXJucyAtdmUgdmFsdWUgb24gZXJyb3IuCisgKiBSZXR1cm5zIDAgb3RoZXJ3aXNlLgorICogSWYgYSB2YWxpZCBkZXZpY2Ugd2FzIHJlYWQsICpkZXZfcCBpcyBub24tTlVMTCwgb3RoZXJ3aXNlIGl0IGlzIE5VTEwKKyAqIChlLmcuIGNvbW1lbnQgbGluZXMsIHVua25vd24gWE1MIGNvbnRlbnQsIGV0YykuCisgKi8KK3N0YXRpYyBpbnQgYmxraWRfcGFyc2VfbGluZShibGtpZF9jYWNoZSBjYWNoZSwgYmxraWRfZGV2ICpkZXZfcCwgY2hhciAqY3ApCit7CisJYmxraWRfZGV2IGRldjsKKwlpbnQgcmV0OworCisJaWYgKCFjYWNoZSB8fCAhZGV2X3ApCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJKmRldl9wID0gTlVMTDsKKworCURCRyhERUJVR19SRUFELCBwcmludGYoImxpbmU6ICVzXG4iLCBjcCkpOworCisJaWYgKChyZXQgPSBwYXJzZV9kZXYoY2FjaGUsIGRldl9wLCAmY3ApKSA8PSAwKQorCQlyZXR1cm4gcmV0OworCisJZGV2ID0gKmRldl9wOworCisJd2hpbGUgKChyZXQgPSBwYXJzZV90YWcoY2FjaGUsIGRldiwgJmNwKSkgPiAwKSB7CisJCTsKKwl9CisKKwlpZiAoZGV2LT5iaWRfdHlwZSA9PSBOVUxMKSB7CisJCURCRyhERUJVR19SRUFELAorCQkgICAgcHJpbnRmKCJibGtpZDogZGV2aWNlICVzIGhhcyBubyBUWVBFXG4iLGRldi0+YmlkX25hbWUpKTsKKwkJYmxraWRfZnJlZV9kZXYoZGV2KTsKKwl9CisKKwlEQkcoREVCVUdfUkVBRCwgYmxraWRfZGVidWdfZHVtcF9kZXYoZGV2KSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFyc2UgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwgYW5kIHJldHVybiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgb3IKKyAqIGEgbmV3bHkgYWxsb2NhdGVkIGNhY2hlIHN0cnVjdC4gIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHJldHVybiBhCisgKiBuZXcgZW1wdHkgY2FjaGUgc3RydWN0LgorICovCit2b2lkIGJsa2lkX3JlYWRfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUpCit7CisJRklMRSAqZmlsZTsKKwljaGFyIGJ1Zls0MDk2XTsKKwlpbnQgZmQsIGxpbmVubyA9IDA7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRoZW4gd2UganVzdCByZXR1cm4gYW4gZW1wdHkKKwkgKiBzdHJ1Y3Qgc28gdGhhdCB0aGUgY2FjaGUgY2FuIGJlIHBvcHVsYXRlZC4KKwkgKi8KKwlpZiAoKGZkID0gb3BlbihjYWNoZS0+YmljX2ZpbGVuYW1lLCBPX1JET05MWSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChmc3RhdChmZCwgJnN0KSA8IDApCisJCWdvdG8gZXJyb3V0OworCWlmICgoc3Quc3RfbXRpbWUgPT0gY2FjaGUtPmJpY19mdGltZSkgfHwKKwkgICAgKGNhY2hlLT5iaWNfZmxhZ3MgJiBCTEtJRF9CSUNfRkxfQ0hBTkdFRCkpIHsKKwkJREJHKERFQlVHX0NBQ0hFLCBwcmludGYoInNraXBwaW5nIHJlLXJlYWQgb2YgJXNcbiIsCisJCQkJCWNhY2hlLT5iaWNfZmlsZW5hbWUpKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJREJHKERFQlVHX0NBQ0hFLCBwcmludGYoInJlYWRpbmcgY2FjaGUgZmlsZSAlc1xuIiwKKwkJCQljYWNoZS0+YmljX2ZpbGVuYW1lKSk7CisKKwlmaWxlID0geGZkb3Blbl9mb3JfcmVhZChmZCk7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZmlsZSkpIHsKKwkJYmxraWRfZGV2IGRldjsKKwkJdW5zaWduZWQgaW50IGVuZDsKKworCQlsaW5lbm8rKzsKKwkJaWYgKGJ1ZlswXSA9PSAwKQorCQkJY29udGludWU7CisJCWVuZCA9IHN0cmxlbihidWYpIC0gMTsKKwkJLyogQ29udGludWUgcmVhZGluZyBuZXh0IGxpbmUgaWYgaXQgZW5kcyB3aXRoIGEgYmFja3NsYXNoICovCisJCXdoaWxlIChidWZbZW5kXSA9PSAnXFwnICYmIGVuZCA8IHNpemVvZihidWYpIC0gMiAmJgorCQkgICAgICAgZmdldHMoYnVmICsgZW5kLCBzaXplb2YoYnVmKSAtIGVuZCwgZmlsZSkpIHsKKwkJCWVuZCA9IHN0cmxlbihidWYpIC0gMTsKKwkJCWxpbmVubysrOworCQl9CisKKwkJaWYgKGJsa2lkX3BhcnNlX2xpbmUoY2FjaGUsICZkZXYsIGJ1ZikgPCAwKSB7CisJCQlEQkcoREVCVUdfUkVBRCwKKwkJCSAgICBwcmludGYoImJsa2lkOiBiYWQgZm9ybWF0IG9uIGxpbmUgJWRcbiIsIGxpbmVubykpOworCQkJY29udGludWU7CisJCX0KKwl9CisJZmNsb3NlKGZpbGUpOworCisJLyoKKwkgKiBJbml0aWFsbHkgd2UgZG8gbm90IG5lZWQgdG8gd3JpdGUgb3V0IHRoZSBjYWNoZSBmaWxlLgorCSAqLworCWNhY2hlLT5iaWNfZmxhZ3MgJj0gfkJMS0lEX0JJQ19GTF9DSEFOR0VEOworCWNhY2hlLT5iaWNfZnRpbWUgPSBzdC5zdF9tdGltZTsKKworCXJldHVybjsKK2Vycm91dDoKKwljbG9zZShmZCk7Cit9CisKKyNpZmRlZiBURVNUX1BST0dSQU0KK3N0YXRpYyB2b2lkIGRlYnVnX2R1bXBfZGV2KGJsa2lkX2RldiBkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghZGV2KSB7CisJCXByaW50ZigiICBkZXY6IE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCIgIGRldjogbmFtZSA9ICVzXG4iLCBkZXYtPmJpZF9uYW1lKTsKKwlwcmludGYoIiAgZGV2OiBERVZOTz1cIjB4JTBsbHhcIlxuIiwgZGV2LT5iaWRfZGV2bm8pOworCXByaW50ZigiICBkZXY6IFRJTUU9XCIlbHVcIlxuIiwgZGV2LT5iaWRfdGltZSk7CisJcHJpbnRmKCIgIGRldjogUFJJPVwiJWRcIlxuIiwgZGV2LT5iaWRfcHJpKTsKKwlwcmludGYoIiAgZGV2OiBmbGFncyA9IDB4JTA4WFxuIiwgZGV2LT5iaWRfZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaChwLCAmZGV2LT5iaWRfdGFncykgeworCQlibGtpZF90YWcgdGFnID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZywgYml0X3RhZ3MpOworCQlpZiAodGFnKQorCQkJcHJpbnRmKCIgICAgdGFnOiAlcz1cIiVzXCJcbiIsIHRhZy0+Yml0X25hbWUsCisJCQkgICAgICAgdGFnLT5iaXRfdmFsKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgICAgdGFnOiBOVUxMXG4iKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpCit7CisJYmxraWRfY2FjaGUgY2FjaGUgPSBOVUxMOworCWludCByZXQ7CisKKwlibGtpZF9kZWJ1Z19tYXNrID0gREVCVUdfQUxMOworCWlmIChhcmdjID4gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbZmlsZW5hbWVdXG4iCisJCQkiVGVzdCBwYXJzaW5nIG9mIHRoZSBjYWNoZSAoZmlsZW5hbWUpXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBhcmd2WzFdKSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yICVkIHJlYWRpbmcgY2FjaGUgZmlsZSAlc1xuIiwgcmV0LAorCQkJYXJndlsxXSA/IGFyZ3ZbMV0gOiBCTEtJRF9DQUNIRV9GSUxFKTsKKworCWJsa2lkX3B1dF9jYWNoZShjYWNoZSk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9yZXNvbHZlLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9yZXNvbHZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1Y2E2MQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3Jlc29sdmUuYwpAQCAtMCwwICsxLDEzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmVzb2x2ZS5jIC0gcmVzb2x2ZSBuYW1lcyBhbmQgdGFncyBpbnRvIHNwZWNpZmljIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMgVGhlb2RvcmUgVHMnby4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgImJsa2lkUC5oIgorI2luY2x1ZGUgInByb2JlLmgiCisKKy8qCisgKiBGaW5kIGEgdGFnbmFtZSAoZS5nLiBMQUJFTCBvciBVVUlEKSBvbiBhIHNwZWNpZmljIGRldmljZS4KKyAqLworY2hhciAqYmxraWRfZ2V0X3RhZ192YWx1ZShibGtpZF9jYWNoZSBjYWNoZSwgY29uc3QgY2hhciAqdGFnbmFtZSwKKwkJCSAgY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlibGtpZF90YWcgZm91bmQ7CisJYmxraWRfZGV2IGRldjsKKwlibGtpZF9jYWNoZSBjID0gY2FjaGU7CisJY2hhciAqcmV0ID0gTlVMTDsKKworCURCRyhERUJVR19SRVNPTFZFLCBwcmludGYoImxvb2tpbmcgZm9yICVzIG9uICVzXG4iLCB0YWduYW1lLCBkZXZuYW1lKSk7CisKKwlpZiAoIWRldm5hbWUpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFjYWNoZSkgeworCQlpZiAoYmxraWRfZ2V0X2NhY2hlKCZjLCBOVUxMKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKGRldiA9IGJsa2lkX2dldF9kZXYoYywgZGV2bmFtZSwgQkxLSURfREVWX05PUk1BTCkpICYmCisJICAgIChmb3VuZCA9IGJsa2lkX2ZpbmRfdGFnX2RldihkZXYsIHRhZ25hbWUpKSkKKwkJcmV0ID0gYmxraWRfc3RyZHVwKGZvdW5kLT5iaXRfdmFsKTsKKworCWlmICghY2FjaGUpCisJCWJsa2lkX3B1dF9jYWNoZShjKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMb2NhdGUgYSBkZXZpY2UgbmFtZSBmcm9tIGEgdG9rZW4gKE5BTUU9dmFsdWUgc3RyaW5nKSwgb3IgKG5hbWUsIHZhbHVlKQorICogcGFpci4gIEluIHRoZSBjYXNlIG9mIGEgdG9rZW4sIHZhbHVlIGlzIGlnbm9yZWQuICBJZiB0aGUgInRva2VuIiBpcyBub3QKKyAqIG9mIHRoZSBmb3JtICJOQU1FPXZhbHVlIiBhbmQgdGhlcmUgaXMgbm8gdmFsdWUgZ2l2ZW4sIHRoZW4gaXQgaXMgYXNzdW1lZAorICogdG8gYmUgdGhlIGFjdHVhbCBkZXZuYW1lIGFuZCBhIGNvcHkgaXMgcmV0dXJuZWQuCisgKi8KK2NoYXIgKmJsa2lkX2dldF9kZXZuYW1lKGJsa2lkX2NhY2hlIGNhY2hlLCBjb25zdCBjaGFyICp0b2tlbiwKKwkJCWNvbnN0IGNoYXIgKnZhbHVlKQoreworCWJsa2lkX2RldiBkZXY7CisJYmxraWRfY2FjaGUgYyA9IGNhY2hlOworCWNoYXIgKnQgPSBOVUxMLCAqdiA9IE5VTEw7CisJY2hhciAqcmV0ID0gTlVMTDsKKworCWlmICghdG9rZW4pCisJCXJldHVybiBOVUxMOworCisJaWYgKCFjYWNoZSkgeworCQlpZiAoYmxraWRfZ2V0X2NhY2hlKCZjLCBOVUxMKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlEQkcoREVCVUdfUkVTT0xWRSwKKwkgICAgcHJpbnRmKCJsb29raW5nIGZvciAlcyVzJXMgJXNcbiIsIHRva2VuLCB2YWx1ZSA/ICI9IiA6ICIiLAorCQkgICB2YWx1ZSA/IHZhbHVlIDogIiIsIGNhY2hlID8gImluIGNhY2hlIiA6ICJmcm9tIGRpc2siKSk7CisKKwlpZiAoIXZhbHVlKSB7CisJCWlmICghc3RyY2hyKHRva2VuLCAnPScpKQorCQkJcmV0dXJuIGJsa2lkX3N0cmR1cCh0b2tlbik7CisJCWJsa2lkX3BhcnNlX3RhZ19zdHJpbmcodG9rZW4sICZ0LCAmdik7CisJCWlmICghdCB8fCAhdikKKwkJCWdvdG8gZXJyb3V0OworCQl0b2tlbiA9IHQ7CisJCXZhbHVlID0gdjsKKwl9CisKKwlkZXYgPSBibGtpZF9maW5kX2Rldl93aXRoX3RhZyhjLCB0b2tlbiwgdmFsdWUpOworCWlmICghZGV2KQorCQlnb3RvIGVycm91dDsKKworCXJldCA9IGJsa2lkX3N0cmR1cChibGtpZF9kZXZfZGV2bmFtZShkZXYpKTsKKworZXJyb3V0OgorCWZyZWUodCk7CisJZnJlZSh2KTsKKwlpZiAoIWNhY2hlKSB7CisJCWJsa2lkX3B1dF9jYWNoZShjKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnZhbHVlOworCWJsa2lkX2NhY2hlIGNhY2hlOworCisJYmxraWRfZGVidWdfbWFzayA9IERFQlVHX0FMTDsKKwlpZiAoYXJnYyAhPSAyICYmIGFyZ2MgIT0gMykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOlx0JXMgdGFnbmFtZT12YWx1ZVxuIgorCQkJIlx0JXMgdGFnbmFtZSBkZXZuYW1lXG4iCisJCQkiRmluZCB3aGljaCBkZXZpY2UgaG9sZHMgYSBnaXZlbiB0b2tlbiBvclxuIgorCQkJIkZpbmQgd2hhdCB0aGUgdmFsdWUgb2YgYSB0YWcgaXMgaW4gYSBkZXZpY2VcbiIsCisJCQlhcmd2WzBdLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIGJiX2Rldl9udWxsKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBnZXQgYmxraWQgY2FjaGVcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmIChhcmd2WzJdKSB7CisJCXZhbHVlID0gYmxraWRfZ2V0X3RhZ192YWx1ZShjYWNoZSwgYXJndlsxXSwgYXJndlsyXSk7CisJCXByaW50ZigiJXMgaGFzIHRhZyAlcz0lc1xuIiwgYXJndlsyXSwgYXJndlsxXSwKKwkJICAgICAgIHZhbHVlID8gdmFsdWUgOiAiPG1pc3Npbmc+Iik7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBibGtpZF9nZXRfZGV2bmFtZShjYWNoZSwgYXJndlsxXSwgTlVMTCk7CisJCXByaW50ZigiJXMgaGFzIHRhZyAlc1xuIiwgdmFsdWUgPyB2YWx1ZSA6ICI8bm9uZT4iLCBhcmd2WzFdKTsKKwl9CisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gdmFsdWUgPyAwIDogMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvc2F2ZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvc2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGNjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9zYXZlLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNhdmUuYyAtIHdyaXRlIHRoZSBjYWNoZSBzdHJ1Y3QgdG8gZGlzaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBBbmRyZWFzIERpbGdlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSAiYmxraWRQLmgiCisKK3N0YXRpYyBpbnQgc2F2ZV9kZXYoYmxraWRfZGV2IGRldiwgRklMRSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFkZXYgfHwgZGV2LT5iaWRfbmFtZVswXSAhPSAnLycpCisJCXJldHVybiAwOworCisJREJHKERFQlVHX1NBVkUsCisJICAgIHByaW50ZigiZGV2aWNlICVzLCB0eXBlICVzXG4iLCBkZXYtPmJpZF9uYW1lLCBkZXYtPmJpZF90eXBlKSk7CisKKwlmcHJpbnRmKGZpbGUsCisJCSI8ZGV2aWNlIERFVk5PPVwiMHglMDRseFwiIFRJTUU9XCIlbHVcIiIsCisJCSh1bnNpZ25lZCBsb25nKSBkZXYtPmJpZF9kZXZubywgZGV2LT5iaWRfdGltZSk7CisJaWYgKGRldi0+YmlkX3ByaSkKKwkJZnByaW50ZihmaWxlLCAiIFBSST1cIiVkXCIiLCBkZXYtPmJpZF9wcmkpOworCWxpc3RfZm9yX2VhY2gocCwgJmRldi0+YmlkX3RhZ3MpIHsKKwkJYmxraWRfdGFnIHRhZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsIGJpdF90YWdzKTsKKwkJZnByaW50ZihmaWxlLCAiICVzPVwiJXNcIiIsIHRhZy0+Yml0X25hbWUsdGFnLT5iaXRfdmFsKTsKKwl9CisJZnByaW50ZihmaWxlLCAiPiVzPC9kZXZpY2U+XG4iLCBkZXYtPmJpZF9uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKgorICogV3JpdGUgb3V0IHRoZSBjYWNoZSBzdHJ1Y3QgdG8gdGhlIGNhY2hlIGZpbGUgb24gZGlzay4KKyAqLworaW50IGJsa2lkX2ZsdXNoX2NhY2hlKGJsa2lkX2NhY2hlIGNhY2hlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJY2hhciAqdG1wID0gTlVMTDsKKwljb25zdCBjaGFyICpvcGVuZWQgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCUZJTEUgKmZpbGUgPSBOVUxMOworCWludCBmZCwgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmICghY2FjaGUpCisJCXJldHVybiAtQkxLSURfRVJSX1BBUkFNOworCisJaWYgKGxpc3RfZW1wdHkoJmNhY2hlLT5iaWNfZGV2cykgfHwKKwkgICAgIShjYWNoZS0+YmljX2ZsYWdzICYgQkxLSURfQklDX0ZMX0NIQU5HRUQpKSB7CisJCURCRyhERUJVR19TQVZFLCBwcmludGYoInNraXBwaW5nIGNhY2hlIGZpbGUgd3JpdGVcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZmlsZW5hbWUgPSBjYWNoZS0+YmljX2ZpbGVuYW1lID8gY2FjaGUtPmJpY19maWxlbmFtZTogQkxLSURfQ0FDSEVfRklMRTsKKworCS8qIElmIHdlIGNhbid0IHdyaXRlIHRvIHRoZSBjYWNoZSBmaWxlLCB0aGVuIGRvbid0IGV2ZW4gdHJ5ICovCisJaWYgKCgocmV0ID0gc3RhdChmaWxlbmFtZSwgJnN0KSkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkgfHwKKwkgICAgKHJldCA9PSAwICYmIGFjY2VzcyhmaWxlbmFtZSwgV19PSykgPCAwKSkgeworCQlEQkcoREVCVUdfU0FWRSwKKwkJICAgIHByaW50ZigiY2FuJ3Qgd3JpdGUgdG8gY2FjaGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUcnkgYW5kIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBzbworCSAqIHRoYXQgaW4gY2FzZSBvZiBlcnJvciB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGNhY2hlIGZpbGUuCisJICogSWYgdGhlIGNhY2hlIGZpbGUgZG9lc24ndCB5ZXQgZXhpc3QsIGl0IGlzbid0IGEgcmVndWxhcgorCSAqIGZpbGUgKGUuZy4gL2Rldi9udWxsIG9yIGEgc29ja2V0KSwgb3Igd2UgY291bGRuJ3QgY3JlYXRlCisJICogYSB0ZW1wb3JhcnkgZmlsZSB0aGVuIHdlIG9wZW4gaXQgZGlyZWN0bHkuCisJICovCisJaWYgKHJldCA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJdG1wID0geG1hbGxvYyhzdHJsZW4oZmlsZW5hbWUpICsgOCk7CisJCXNwcmludGYodG1wLCAiJXMtWFhYWFhYIiwgZmlsZW5hbWUpOworCQlmZCA9IG1rc3RlbXAodG1wKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWZpbGUgPSB4ZmRvcGVuX2Zvcl93cml0ZShmZCk7CisJCQlvcGVuZWQgPSB0bXA7CisJCX0KKwkJZmNobW9kKGZkLCAwNjQ0KTsKKwl9CisKKwlpZiAoIWZpbGUpIHsKKwkJZmlsZSA9IGZvcGVuX2Zvcl93cml0ZShmaWxlbmFtZSk7CisJCW9wZW5lZCA9IGZpbGVuYW1lOworCX0KKworCURCRyhERUJVR19TQVZFLAorCSAgICBwcmludGYoIndyaXRpbmcgY2FjaGUgZmlsZSAlcyAocmVhbGx5ICVzKVxuIiwKKwkJICAgZmlsZW5hbWUsIG9wZW5lZCkpOworCisJaWYgKCFmaWxlKSB7CisJCXJldCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZS0+YmljX2RldnMpIHsKKwkJYmxraWRfZGV2IGRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF9kZXYsIGJpZF9kZXZzKTsKKwkJaWYgKCFkZXYtPmJpZF90eXBlKQorCQkJY29udGludWU7CisJCWlmICgocmV0ID0gc2F2ZV9kZXYoZGV2LCBmaWxlKSkgPCAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHJldCA+PSAwKSB7CisJCWNhY2hlLT5iaWNfZmxhZ3MgJj0gfkJMS0lEX0JJQ19GTF9DSEFOR0VEOworCQlyZXQgPSAxOworCX0KKworCWZjbG9zZShmaWxlKTsKKwlpZiAob3BlbmVkICE9IGZpbGVuYW1lKSB7CisJCWlmIChyZXQgPCAwKSB7CisJCQl1bmxpbmsob3BlbmVkKTsKKwkJCURCRyhERUJVR19TQVZFLAorCQkJICAgIHByaW50ZigidW5saW5rZWQgdGVtcCBjYWNoZSAlc1xuIiwgb3BlbmVkKSk7CisJCX0gZWxzZSB7CisJCQljaGFyICpiYWNrdXA7CisKKwkJCWJhY2t1cCA9IHhtYWxsb2Moc3RybGVuKGZpbGVuYW1lKSArIDUpOworCQkJc3ByaW50ZihiYWNrdXAsICIlcy5vbGQiLCBmaWxlbmFtZSk7CisJCQl1bmxpbmsoYmFja3VwKTsKKwkJCWxpbmsoZmlsZW5hbWUsIGJhY2t1cCk7CisJCQlmcmVlKGJhY2t1cCk7CisJCQlyZW5hbWUob3BlbmVkLCBmaWxlbmFtZSk7CisJCQlEQkcoREVCVUdfU0FWRSwKKwkJCSAgICBwcmludGYoIm1vdmVkIHRlbXAgY2FjaGUgJXNcbiIsIG9wZW5lZCkpOworCQl9CisJfQorCitlcnJvdXQ6CisJZnJlZSh0bXApOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBURVNUX1BST0dSQU0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlibGtpZF9jYWNoZSBjYWNoZSA9IE5VTEw7CisJaW50IHJldDsKKworCWJsa2lkX2RlYnVnX21hc2sgPSBERUJVR19BTEw7CisJaWYgKGFyZ2MgPiAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtmaWxlbmFtZV1cbiIKKwkJCSJUZXN0IGxvYWRpbmcvc2F2aW5nIGEgY2FjaGUgKGZpbGVuYW1lKVxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBiYl9kZXZfbnVsbCkpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgY3JlYXRpbmcgY2FjaGUgKCVkKVxuIiwKKwkJCWFyZ3ZbMF0sIHJldCk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gYmxraWRfcHJvYmVfYWxsKGNhY2hlKSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgKCVkKSBwcm9iaW5nIGRldmljZXNcbiIsIHJldCk7CisJCWV4aXQoMSk7CisJfQorCWNhY2hlLT5iaWNfZmlsZW5hbWUgPSBibGtpZF9zdHJkdXAoYXJndlsxXSk7CisKKwlpZiAoKHJldCA9IGJsa2lkX2ZsdXNoX2NhY2hlKGNhY2hlKSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgKCVkKSBzYXZpbmcgY2FjaGVcbiIsIHJldCk7CisJCWV4aXQoMSk7CisJfQorCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3RhZy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzN2I0NgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkL3RhZy5jCkBAIC0wLDAgKzEsNDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0YWcuYyAtIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb24vZnJlZSByb3V0aW5lcyBmb3IgdGFnIHN0cnVjdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhcyBEaWxnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGVvZG9yZSBUcydvCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImJsa2lkUC5oIgorCitzdGF0aWMgYmxraWRfdGFnIGJsa2lkX25ld190YWcodm9pZCkKK3sKKwlibGtpZF90YWcgdGFnOworCisJdGFnID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGJsa2lkX3N0cnVjdF90YWcpKTsKKworCUlOSVRfTElTVF9IRUFEKCZ0YWctPmJpdF90YWdzKTsKKwlJTklUX0xJU1RfSEVBRCgmdGFnLT5iaXRfbmFtZXMpOworCisJcmV0dXJuIHRhZzsKK30KKworI2lmZGVmIENPTkZJR19CTEtJRF9ERUJVRwordm9pZCBibGtpZF9kZWJ1Z19kdW1wX3RhZyhibGtpZF90YWcgdGFnKQoreworCWlmICghdGFnKSB7CisJCXByaW50ZigiICAgIHRhZzogTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiAgICB0YWc6ICVzPVwiJXNcIlxuIiwgdGFnLT5iaXRfbmFtZSwgdGFnLT5iaXRfdmFsKTsKK30KKyNlbmRpZgorCit2b2lkIGJsa2lkX2ZyZWVfdGFnKGJsa2lkX3RhZyB0YWcpCit7CisJaWYgKCF0YWcpCisJCXJldHVybjsKKworCURCRyhERUJVR19UQUcsIHByaW50ZigiICAgIGZyZWVpbmcgdGFnICVzPSVzXG4iLCB0YWctPmJpdF9uYW1lLAorCQkgICB0YWctPmJpdF92YWwgPyB0YWctPmJpdF92YWwgOiAiKE5VTEwpIikpOworCURCRyhERUJVR19UQUcsIGJsa2lkX2RlYnVnX2R1bXBfdGFnKHRhZykpOworCisJbGlzdF9kZWwoJnRhZy0+Yml0X3RhZ3MpOwkvKiBsaXN0IG9mIHRhZ3MgZm9yIHRoaXMgZGV2aWNlICovCisJbGlzdF9kZWwoJnRhZy0+Yml0X25hbWVzKTsJLyogbGlzdCBvZiB0YWdzIHdpdGggdGhpcyB0eXBlICovCisKKwlmcmVlKHRhZy0+Yml0X25hbWUpOworCWZyZWUodGFnLT5iaXRfdmFsKTsKKwlmcmVlKHRhZyk7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBkZXNpcmVkIHRhZyBvbiBhIGRldmljZS4gIElmIHZhbHVlIGlzIE5VTEwsIHRoZW4gdGhlCisgKiBmaXJzdCBzdWNoIHRhZyBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHJldHVybiBvbmx5IGV4YWN0IHRhZyBpZiBmb3VuZC4KKyAqLworYmxraWRfdGFnIGJsa2lkX2ZpbmRfdGFnX2RldihibGtpZF9kZXYgZGV2LCBjb25zdCBjaGFyICp0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlpZiAoIWRldiB8fCAhdHlwZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZkZXYtPmJpZF90YWdzKSB7CisJCWJsa2lkX3RhZyB0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLAorCQkJCQkgICBiaXRfdGFncyk7CisKKwkJaWYgKCFzdHJjbXAodG1wLT5iaXRfbmFtZSwgdHlwZSkpCisJCQlyZXR1cm4gdG1wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZpbmQgdGhlIGRlc2lyZWQgdGFnIHR5cGUgaW4gdGhlIGNhY2hlLgorICogV2UgcmV0dXJuIHRoZSBoZWFkIHRhZyBmb3IgdGhpcyB0YWcgdHlwZS4KKyAqLworc3RhdGljIGJsa2lkX3RhZyBibGtpZF9maW5kX2hlYWRfY2FjaGUoYmxraWRfY2FjaGUgY2FjaGUsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJYmxraWRfdGFnIGhlYWQgPSBOVUxMLCB0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlmICghY2FjaGUgfHwgIXR5cGUpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaChwLCAmY2FjaGUtPmJpY190YWdzKSB7CisJCXRtcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsIGJpdF90YWdzKTsKKwkJaWYgKCFzdHJjbXAodG1wLT5iaXRfbmFtZSwgdHlwZSkpIHsKKwkJCURCRyhERUJVR19UQUcsCisJCQkgICAgcHJpbnRmKCIgICAgZm91bmQgY2FjaGUgdGFnIGhlYWQgJXNcbiIsIHR5cGUpKTsKKwkJCWhlYWQgPSB0bXA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaGVhZDsKK30KKworLyoKKyAqIFNldCBhIHRhZyBvbiBhbiBleGlzdGluZyBkZXZpY2UuCisgKgorICogSWYgdmFsdWUgaXMgTlVMTCwgdGhlbiBkZWxldGUgdGhlIHRhZ3Nmcm9tIHRoZSBkZXZpY2UuCisgKi8KK2ludCBibGtpZF9zZXRfdGFnKGJsa2lkX2RldiBkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGludCB2bGVuZ3RoKQoreworCWJsa2lkX3RhZwl0ID0gMCwgaGVhZCA9IDA7CisJY2hhcgkJKnZhbCA9IE5VTEw7CisKKwlpZiAoIWRldiB8fCAhbmFtZSkKKwkJcmV0dXJuIC1CTEtJRF9FUlJfUEFSQU07CisKKwlpZiAoISh2YWwgPSBibGtpZF9zdHJuZHVwKHZhbHVlLCB2bGVuZ3RoKSkgJiYgdmFsdWUpCisJCXJldHVybiAtQkxLSURfRVJSX01FTTsKKwl0ID0gYmxraWRfZmluZF90YWdfZGV2KGRldiwgbmFtZSk7CisJaWYgKCF2YWx1ZSkgeworCQlibGtpZF9mcmVlX3RhZyh0KTsKKwl9IGVsc2UgaWYgKHQpIHsKKwkJaWYgKCFzdHJjbXAodC0+Yml0X3ZhbCwgdmFsKSkgeworCQkJLyogU2FtZSB0aGluZywgZXhpdCAqLworCQkJZnJlZSh2YWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZnJlZSh0LT5iaXRfdmFsKTsKKwkJdC0+Yml0X3ZhbCA9IHZhbDsKKwl9IGVsc2UgeworCQkvKiBFeGlzdGluZyB0YWcgbm90IHByZXNlbnQsIGFkZCB0byBkZXZpY2UgKi8KKwkJaWYgKCEodCA9IGJsa2lkX25ld190YWcoKSkpCisJCQlnb3RvIGVycm91dDsKKwkJdC0+Yml0X25hbWUgPSBibGtpZF9zdHJkdXAobmFtZSk7CisJCXQtPmJpdF92YWwgPSB2YWw7CisJCXQtPmJpdF9kZXYgPSBkZXY7CisKKwkJbGlzdF9hZGRfdGFpbCgmdC0+Yml0X3RhZ3MsICZkZXYtPmJpZF90YWdzKTsKKworCQlpZiAoZGV2LT5iaWRfY2FjaGUpIHsKKwkJCWhlYWQgPSBibGtpZF9maW5kX2hlYWRfY2FjaGUoZGV2LT5iaWRfY2FjaGUsCisJCQkJCQkgICAgIHQtPmJpdF9uYW1lKTsKKwkJCWlmICghaGVhZCkgeworCQkJCWhlYWQgPSBibGtpZF9uZXdfdGFnKCk7CisJCQkJaWYgKCFoZWFkKQorCQkJCQlnb3RvIGVycm91dDsKKworCQkJCURCRyhERUJVR19UQUcsCisJCQkJICAgIHByaW50ZigiICAgIGNyZWF0aW5nIG5ldyBjYWNoZSB0YWcgaGVhZCAlc1xuIiwgbmFtZSkpOworCQkJCWhlYWQtPmJpdF9uYW1lID0gYmxraWRfc3RyZHVwKG5hbWUpOworCQkJCWlmICghaGVhZC0+Yml0X25hbWUpCisJCQkJCWdvdG8gZXJyb3V0OworCQkJCWxpc3RfYWRkX3RhaWwoJmhlYWQtPmJpdF90YWdzLAorCQkJCQkgICAgICAmZGV2LT5iaWRfY2FjaGUtPmJpY190YWdzKTsKKwkJCX0KKwkJCWxpc3RfYWRkX3RhaWwoJnQtPmJpdF9uYW1lcywgJmhlYWQtPmJpdF9uYW1lcyk7CisJCX0KKwl9CisKKwkvKiBMaW5rIGNvbW1vbiB0YWdzIGRpcmVjdGx5IHRvIHRoZSBkZXZpY2Ugc3RydWN0ICovCisJaWYgKCFzdHJjbXAobmFtZSwgIlRZUEUiKSkKKwkJZGV2LT5iaWRfdHlwZSA9IHZhbDsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJMQUJFTCIpKQorCQlkZXYtPmJpZF9sYWJlbCA9IHZhbDsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJVVUlEIikpCisJCWRldi0+YmlkX3V1aWQgPSB2YWw7CisKKwlpZiAoZGV2LT5iaWRfY2FjaGUpCisJCWRldi0+YmlkX2NhY2hlLT5iaWNfZmxhZ3MgfD0gQkxLSURfQklDX0ZMX0NIQU5HRUQ7CisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlibGtpZF9mcmVlX3RhZyh0KTsKKwlpZiAoIXQpCisJCWZyZWUodmFsKTsKKwlibGtpZF9mcmVlX3RhZyhoZWFkKTsKKwlyZXR1cm4gLUJMS0lEX0VSUl9NRU07Cit9CisKKworLyoKKyAqIFBhcnNlIGEgIk5BTUU9dmFsdWUiIHN0cmluZy4gIFRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4KKyAqIHBhcnNlX3Rva2VuLCBiZWNhdXNlIHRoYXQgd2lsbCBlbmQgYW4gdW5xdW90ZWQgdmFsdWUgYXQgYSBzcGFjZSwgd2hpbGUKKyAqIHRoaXMgd2lsbCBhc3N1bWUgdGhhdCBhbiB1bnF1b3RlZCB2YWx1ZSBpcyB0aGUgcmVzdCBvZiB0aGUgdG9rZW4gKGUuZy4KKyAqIGlmIHdlIGFyZSBwYXNzZWQgYW4gYWxyZWFkeSBxdW90ZWQgc3RyaW5nIGZyb20gdGhlIGNvbW1hbmQtbGluZSB3ZSBkb24ndAorICogaGF2ZSB0byBib3RoIHF1b3RlIGFuZCBlc2NhcGUgcXVvdGUgc28gdGhhdCB0aGUgcXVvdGVzIG1ha2UgaXQgdG8KKyAqIHVzKS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYW5kIC0xIG9uIGZhaWx1cmUuCisgKi8KK2ludCBibGtpZF9wYXJzZV90YWdfc3RyaW5nKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICoqcmV0X3R5cGUsIGNoYXIgKipyZXRfdmFsKQoreworCWNoYXIgKm5hbWUsICp2YWx1ZSwgKmNwOworCisJREJHKERFQlVHX1RBRywgcHJpbnRmKCJ0cnlpbmcgdG8gcGFyc2UgJyVzJyBhcyBhIHRhZ1xuIiwgdG9rZW4pKTsKKworCWlmICghdG9rZW4gfHwgIShjcCA9IHN0cmNocih0b2tlbiwgJz0nKSkpCisJCXJldHVybiAtMTsKKworCW5hbWUgPSBibGtpZF9zdHJkdXAodG9rZW4pOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC0xOworCXZhbHVlID0gbmFtZSArIChjcCAtIHRva2VuKTsKKwkqdmFsdWUrKyA9ICdcMCc7CisJaWYgKCp2YWx1ZSA9PSAnIicgfHwgKnZhbHVlID09ICdcJycpIHsKKwkJY2hhciBjID0gKnZhbHVlKys7CisJCWlmICghKGNwID0gc3RycmNocih2YWx1ZSwgYykpKQorCQkJZ290byBlcnJvdXQ7IC8qIG1pc3NpbmcgY2xvc2luZyBxdW90ZSAqLworCQkqY3AgPSAnXDAnOworCX0KKwl2YWx1ZSA9IGJsa2lkX3N0cmR1cCh2YWx1ZSk7CisJaWYgKCF2YWx1ZSkKKwkJZ290byBlcnJvdXQ7CisKKwkqcmV0X3R5cGUgPSBuYW1lOworCSpyZXRfdmFsID0gdmFsdWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWZyZWUobmFtZSk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogVGFnIGl0ZXJhdGlvbiByb3V0aW5lcyBmb3IgdGhlIHB1YmxpYyBsaWJibGtpZCBpbnRlcmZhY2UuCisgKgorICogVGhlc2Ugcm91dGluZXMgZG8gbm90IGV4cG9zZSB0aGUgbGlzdC5oIGltcGxlbWVudGF0aW9uLCB3aGljaCBhcmUgYQorICogY29udGFtaW5hdGlvbiBvZiB0aGUgbmFtZXNwYWNlLCBhbmQgd2hpY2ggZm9yY2UgdXMgdG8gcmV2ZWFsIGZhciwgZmFyCisgKiB0b28gbXVjaCBvZiBvdXIgaW50ZXJuYWwgaW1wbGVtZW5hdGlvbi4gIEknbSBub3QgY29udmluY2VkIEkgd2FudAorICogdG8ga2VlcCBsaXN0LmggaW4gdGhlIGxvbmcgdGVybSwgYW55d2F5LiAgSXQncyBmaW5lIGZvciBrZXJuZWwKKyAqIHByb2dyYW1taW5nLCBidXQgcGVyZm9ybWFuY2UgaXMgbm90IHRoZSAjMSBwcmlvcml0eSBmb3IgdGhpcworICogbGlicmFyeSwgYW5kIEkgcmVhbGx5IGRvbid0IGxpa2UgdGhlIHRyYWRlb2ZmIG9mIHR5cGUtc2FmZXR5IGZvcgorICogcGVyZm9ybWFuY2UgZm9yIHRoaXMgYXBwbGljYXRpb24uICBbdHl0c286MjAwMzAxMjUuMjAwN0VTVF0KKyAqLworCisvKgorICogVGhpcyBzZXJpZXMgb2YgZnVuY3Rpb25zIGl0ZXJhdGUgb3ZlciBhbGwgdGFncyBpbiBhIGRldmljZQorICovCisjZGVmaW5lIFRBR19JVEVSQVRFX01BR0lDCTB4MDFhNTI4NGMKKworc3RydWN0IGJsa2lkX3N0cnVjdF90YWdfaXRlcmF0ZSB7CisJaW50CQkJbWFnaWM7CisJYmxraWRfZGV2CQlkZXY7CisJc3RydWN0IGxpc3RfaGVhZAkqcDsKK307CisKK2Jsa2lkX3RhZ19pdGVyYXRlIGJsa2lkX3RhZ19pdGVyYXRlX2JlZ2luKGJsa2lkX2RldiBkZXYpCit7CisJYmxraWRfdGFnX2l0ZXJhdGUJaXRlcjsKKworCWl0ZXIgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxraWRfc3RydWN0X3RhZ19pdGVyYXRlKSk7CisJaXRlci0+bWFnaWMgPSBUQUdfSVRFUkFURV9NQUdJQzsKKwlpdGVyLT5kZXYgPSBkZXY7CisJaXRlci0+cAk9IGRldi0+YmlkX3RhZ3MubmV4dDsKKwlyZXR1cm4gaXRlcjsKK30KKworLyoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKi8KK2V4dGVybiBpbnQgYmxraWRfdGFnX25leHQoYmxraWRfdGFnX2l0ZXJhdGUgaXRlciwKKwkJCSAgY29uc3QgY2hhciAqKnR5cGUsIGNvbnN0IGNoYXIgKip2YWx1ZSkKK3sKKwlibGtpZF90YWcgdGFnOworCisJKnR5cGUgPSAwOworCSp2YWx1ZSA9IDA7CisJaWYgKCFpdGVyIHx8IGl0ZXItPm1hZ2ljICE9IFRBR19JVEVSQVRFX01BR0lDIHx8CisJICAgIGl0ZXItPnAgPT0gJml0ZXItPmRldi0+YmlkX3RhZ3MpCisJCXJldHVybiAtMTsKKwl0YWcgPSBsaXN0X2VudHJ5KGl0ZXItPnAsIHN0cnVjdCBibGtpZF9zdHJ1Y3RfdGFnLCBiaXRfdGFncyk7CisJKnR5cGUgPSB0YWctPmJpdF9uYW1lOworCSp2YWx1ZSA9IHRhZy0+Yml0X3ZhbDsKKwlpdGVyLT5wID0gaXRlci0+cC0+bmV4dDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBibGtpZF90YWdfaXRlcmF0ZV9lbmQoYmxraWRfdGFnX2l0ZXJhdGUgaXRlcikKK3sKKwlpZiAoIWl0ZXIgfHwgaXRlci0+bWFnaWMgIT0gVEFHX0lURVJBVEVfTUFHSUMpCisJCXJldHVybjsKKwlpdGVyLT5tYWdpYyA9IDA7CisJZnJlZShpdGVyKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRldmljZSB3aGljaCBtYXRjaGVzIGEgcGFydGljdWxhcgorICogdHlwZS92YWx1ZSBwYWlyLiAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXZpY2UgdGhhdCBtYXRjaGVzIHRoZQorICogc2VhcmNoIHNwZWNpZmljYXRpb24sIGl0IHJldHVybnMgdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5CisgKiB2YWx1ZS4gIFRoaXMgYWxsb3dzIHVzIHRvIGdpdmUgcHJlZmVyZW5jZSB0byBFVk1TIG9yIExWTSBkZXZpY2VzLgorICoKKyAqIFhYWCB0aGVyZSBzaG91bGQgYWxzbyBiZSBhbiBpbnRlcmZhY2Ugd2hpY2ggdXNlcyBhbiBpdGVyYXRvciBzbyB3ZQorICogY2FuIGdldCBhbGwgb2YgdGhlIGRldmljZXMgd2hpY2ggbWF0Y2ggYSB0eXBlL3ZhbHVlIHNlYXJjaCBwYXJhbWV0ZXIuCisgKi8KK2V4dGVybiBibGtpZF9kZXYgYmxraWRfZmluZF9kZXZfd2l0aF90YWcoYmxraWRfY2FjaGUgY2FjaGUsCisJCQkJCSBjb25zdCBjaGFyICp0eXBlLAorCQkJCQkgY29uc3QgY2hhciAqdmFsdWUpCit7CisJYmxraWRfdGFnCWhlYWQ7CisJYmxraWRfZGV2CWRldjsKKwlpbnQJCXByaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJaWYgKCFjYWNoZSB8fCAhdHlwZSB8fCAhdmFsdWUpCisJCXJldHVybiBOVUxMOworCisJYmxraWRfcmVhZF9jYWNoZShjYWNoZSk7CisKKwlEQkcoREVCVUdfVEFHLCBwcmludGYoImxvb2tpbmcgZm9yICVzPSVzIGluIGNhY2hlXG4iLCB0eXBlLCB2YWx1ZSkpOworCit0cnlfYWdhaW46CisJcHJpID0gLTE7CisJZGV2ID0gMDsKKwloZWFkID0gYmxraWRfZmluZF9oZWFkX2NhY2hlKGNhY2hlLCB0eXBlKTsKKworCWlmIChoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2gocCwgJmhlYWQtPmJpdF9uYW1lcykgeworCQkJYmxraWRfdGFnIHRtcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsa2lkX3N0cnVjdF90YWcsCisJCQkJCQkgICBiaXRfbmFtZXMpOworCisJCQlpZiAoIXN0cmNtcCh0bXAtPmJpdF92YWwsIHZhbHVlKSAmJgorCQkJICAgIHRtcC0+Yml0X2Rldi0+YmlkX3ByaSA+IHByaSkgeworCQkJCWRldiA9IHRtcC0+Yml0X2RldjsKKwkJCQlwcmkgPSBkZXYtPmJpZF9wcmk7CisJCQl9CisJCX0KKwl9CisJaWYgKGRldiAmJiAhKGRldi0+YmlkX2ZsYWdzICYgQkxLSURfQklEX0ZMX1ZFUklGSUVEKSkgeworCQlkZXYgPSBibGtpZF92ZXJpZnkoY2FjaGUsIGRldik7CisJCWlmIChkZXYgJiYgKGRldi0+YmlkX2ZsYWdzICYgQkxLSURfQklEX0ZMX1ZFUklGSUVEKSkKKwkJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmICghZGV2ICYmICEoY2FjaGUtPmJpY19mbGFncyAmIEJMS0lEX0JJQ19GTF9QUk9CRUQpKSB7CisJCWlmIChibGtpZF9wcm9iZV9hbGwoY2FjaGUpIDwgMCkKKwkJCXJldHVybiBOVUxMOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisJcmV0dXJuIGRldjsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQorI2lmZGVmIEhBVkVfR0VUT1BUX0gKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBvcHRpbmQ7CisjZW5kaWYKKwordm9pZCB1c2FnZShjaGFyICpwcm9nKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZiBibGtpZF9maWxlXSBbLW0gZGVidWdfbWFza10gZGV2aWNlICIKKwkJIlt0eXBlIHZhbHVlXVxuIiwKKwkJcHJvZyk7CisJZnByaW50ZihzdGRlcnIsICJcdExpc3QgYWxsIHRhZ3MgZm9yIGEgZGV2aWNlIGFuZCBleGl0XG4iLCBwcm9nKTsKKwlleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYmxraWRfdGFnX2l0ZXJhdGUJaXRlcjsKKwlibGtpZF9jYWNoZQkJY2FjaGUgPSBOVUxMOworCWJsa2lkX2RldgkJZGV2OworCWludAkJCWMsIHJldCwgZm91bmQ7CisJaW50CQkJZmxhZ3MgPSBCTEtJRF9ERVZfRklORDsKKwljaGFyCQkJKnRtcDsKKwljaGFyCQkJKmZpbGUgPSBOVUxMOworCWNoYXIJCQkqZGV2bmFtZSA9IE5VTEw7CisJY2hhcgkJCSpzZWFyY2hfdHlwZSA9IE5VTEw7CisJY2hhcgkJCSpzZWFyY2hfdmFsdWUgPSBOVUxMOworCWNvbnN0IGNoYXIJCSp0eXBlLCAqdmFsdWU7CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJtOmY6IikpICE9IEVPRikKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2YnOgorCQkJZmlsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWJsa2lkX2RlYnVnX21hc2sgPSBzdHJ0b3VsIChvcHRhcmcsICZ0bXAsIDApOworCQkJaWYgKCp0bXApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZGVidWcgbWFzazogJWRcbiIsCisJCQkJCW9wdGFyZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQl9CisJaWYgKGFyZ2MgPiBvcHRpbmQpCisJCWRldm5hbWUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoYXJnYyA+IG9wdGluZCkKKwkJc2VhcmNoX3R5cGUgPSBhcmd2W29wdGluZCsrXTsKKwlpZiAoYXJnYyA+IG9wdGluZCkKKwkJc2VhcmNoX3ZhbHVlID0gYXJndltvcHRpbmQrK107CisJaWYgKCFkZXZuYW1lIHx8IChhcmdjICE9IG9wdGluZCkpCisJCXVzYWdlKGFyZ3ZbMF0pOworCisJaWYgKChyZXQgPSBibGtpZF9nZXRfY2FjaGUoJmNhY2hlLCBmaWxlKSkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBjcmVhdGluZyBjYWNoZSAoJWQpXG4iLAorCQkJYXJndlswXSwgcmV0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBkZXZuYW1lLCBmbGFncyk7CisJaWYgKCFkZXYpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IGZpbmQgZGV2aWNlIGluIGJsa2lkIGNhY2hlXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHNlYXJjaF90eXBlKSB7CisJCWZvdW5kID0gYmxraWRfZGV2X2hhc190YWcoZGV2LCBzZWFyY2hfdHlwZSwgc2VhcmNoX3ZhbHVlKTsKKwkJcHJpbnRmKCJEZXZpY2UgJXM6ICglcywgJXMpICVzXG4iLCBibGtpZF9kZXZfZGV2bmFtZShkZXYpLAorCQkgICAgICAgc2VhcmNoX3R5cGUsIHNlYXJjaF92YWx1ZSA/IHNlYXJjaF92YWx1ZSA6ICJOVUxMIiwKKwkJICAgICAgIGZvdW5kID8gIkZPVU5EIiA6ICJOT1QgRk9VTkQiKTsKKwkJcmV0dXJuICFmb3VuZDsKKwl9CisJcHJpbnRmKCJEZXZpY2UgJXMuLi5cbiIsIGJsa2lkX2Rldl9kZXZuYW1lKGRldikpOworCisJaXRlciA9IGJsa2lkX3RhZ19pdGVyYXRlX2JlZ2luKGRldik7CisJd2hpbGUgKGJsa2lkX3RhZ19uZXh0KGl0ZXIsICZ0eXBlLCAmdmFsdWUpID09IDApIHsKKwkJcHJpbnRmKCJcdFRhZyAlcyBoYXMgdmFsdWUgJXNcbiIsIHR5cGUsIHZhbHVlKTsKKwl9CisJYmxraWRfdGFnX2l0ZXJhdGVfZW5kKGl0ZXIpOworCisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvY2hhdHRyLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9jaGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTM5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvY2hhdHRyLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNoYXR0ci5jCQktIENoYW5nZSBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCAgUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJLCBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzEwLzMwCS0gQ3JlYXRpb24KKyAqIDkzLzExLzEzCS0gUmVwbGFjZSBzdGF0KCkgY2FsbHMgYnkgbHN0YXQoKSB0byBhdm9pZCBsb29wcworICogOTQvMDIvMjcJLSBJbnRlZ3JhdGVkIGluIFRlZCdzIGRpc3RyaWJ1dGlvbgorICogOTgvMTIvMjkJLSBJZ25vcmUgc3ltbGlua3Mgd2hlbiB3b3JraW5nIHJlY3Vyc2l2ZWx5IChHIE0gU2lwZSkKKyAqIDk4LzEyLzI5CS0gRGlzcGxheSB2ZXJzaW9uIGluZm8gb25seSB3aGVuIC1WIHNwZWNpZmllZCAoRyBNIFNpcGUpCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBFWFQyRlNfQVRUUih4KSBfX2F0dHJpYnV0ZV9fKHgpCisjZWxzZQorIyBkZWZpbmUgRVhUMkZTX0FUVFIoeCkKKyNlbmRpZgorCisjaW5jbHVkZSAiZTJmc2JiLmgiCisjaW5jbHVkZSAiZTJwL2UycC5oIgorCisjZGVmaW5lIE9QVF9BREQgMQorI2RlZmluZSBPUFRfUkVNIDIKKyNkZWZpbmUgT1BUX1NFVCA0CisjZGVmaW5lIE9QVF9TRVRfVkVSIDgKK3N0YXRpYyBpbnQgZmxhZ3M7CitzdGF0aWMgaW50IHJlY3Vyc2l2ZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmVyc2lvbjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWY7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByZjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNmOworCitzdHJ1Y3QgZmxhZ3NfY2hhciB7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCWNoYXIgb3B0Y2hhcjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmxhZ3NfY2hhciBmbGFnc19hcnJheVtdID0geworCXsgRVhUMl9OT0FUSU1FX0ZMLCAgICAgICdBJyB9LAorCXsgRVhUMl9TWU5DX0ZMLCAgICAgICAgICdTJyB9LAorCXsgRVhUMl9ESVJTWU5DX0ZMLCAgICAgICdEJyB9LAorCXsgRVhUMl9BUFBFTkRfRkwsICAgICAgICdhJyB9LAorCXsgRVhUMl9DT01QUl9GTCwgICAgICAgICdjJyB9LAorCXsgRVhUMl9OT0RVTVBfRkwsICAgICAgICdkJyB9LAorCXsgRVhUMl9JTU1VVEFCTEVfRkwsICAgICdpJyB9LAorCXsgRVhUM19KT1VSTkFMX0RBVEFfRkwsICdqJyB9LAorCXsgRVhUMl9TRUNSTV9GTCwgICAgICAgICdzJyB9LAorCXsgRVhUMl9VTlJNX0ZMLCAgICAgICAgICd1JyB9LAorCXsgRVhUMl9OT1RBSUxfRkwsICAgICAgICd0JyB9LAorCXsgRVhUMl9UT1BESVJfRkwsICAgICAgICdUJyB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZmxhZyhjaGFyIGMpCit7CisJY29uc3Qgc3RydWN0IGZsYWdzX2NoYXIgKmZwOworCWZvciAoZnAgPSBmbGFnc19hcnJheTsgZnAtPmZsYWc7IGZwKyspCisJCWlmIChmcC0+b3B0Y2hhciA9PSBjKQorCQkJcmV0dXJuIGZwLT5mbGFnOworCWJiX3Nob3dfdXNhZ2UoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXJnKGNoYXIgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nICpmbDsKKwljaGFyIG9wdCA9ICphcmcrKzsKKworCWlmIChvcHQgPT0gJy0nKSB7CisJCWZsYWdzIHw9IE9QVF9SRU07CisJCWZsID0gJnJmOworCX0gZWxzZSBpZiAob3B0ID09ICcrJykgeworCQlmbGFncyB8PSBPUFRfQUREOworCQlmbCA9ICZhZjsKKwl9IGVsc2UgaWYgKG9wdCA9PSAnPScpIHsKKwkJZmxhZ3MgfD0gT1BUX1NFVDsKKwkJZmwgPSAmc2Y7CisJfSBlbHNlCisJCXJldHVybiBFT0Y7CisKKwlmb3IgKDsgKmFyZzsgKythcmcpCisJCSgqZmwpIHw9IGdldF9mbGFnKCphcmcpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhdHRyX2Rpcl9wcm9jKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpcmVudCAqLCB2b2lkICopOworCitzdGF0aWMgdm9pZCBjaGFuZ2VfYXR0cmlidXRlcyhjb25zdCBjaGFyICogbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZzZmxhZ3M7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAobHN0YXQobmFtZSwgJnN0KSA9PSAtMSkgeworCQliYl9lcnJvcl9tc2coInN0YXQgJXMgZmFpbGVkIiwgbmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkgJiYgcmVjdXJzaXZlKQorCQlyZXR1cm47CisKKwkvKiBEb24ndCB0cnkgdG8gb3BlbiBkZXZpY2UgZmlsZXMsIGZpZm9zIGV0Yy4gIFdlIHByb2JhYmx5CisJICogb3VnaHQgdG8gZGlzcGxheSBhbiBlcnJvciBpZiB0aGUgZmlsZSB3YXMgZXhwbGljaXRseSBnaXZlbgorCSAqIG9uIHRoZSBjb21tYW5kIGxpbmUgKHdoZXRoZXIgb3Igbm90IHJlY3Vyc2l2ZSB3YXMKKwkgKiByZXF1ZXN0ZWQpLiAgKi8KKwlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgIVNfSVNMTksoc3Quc3RfbW9kZSkgJiYgIVNfSVNESVIoc3Quc3RfbW9kZSkpCisJCXJldHVybjsKKworCWlmIChmbGFncyAmIE9QVF9TRVRfVkVSKQorCQlpZiAoZnNldHZlcnNpb24obmFtZSwgdmVyc2lvbikgPT0gLTEpCisJCQliYl9lcnJvcl9tc2coInNldHRpbmcgdmVyc2lvbiBvbiAlcyIsIG5hbWUpOworCisJaWYgKGZsYWdzICYgT1BUX1NFVCkgeworCQlmc2ZsYWdzID0gc2Y7CisJfSBlbHNlIHsKKwkJaWYgKGZnZXRmbGFncyhuYW1lLCAmZnNmbGFncykgPT0gLTEpIHsKKwkJCWJiX2Vycm9yX21zZygicmVhZGluZyBmbGFncyBvbiAlcyIsIG5hbWUpOworCQkJZ290byBza2lwX3NldGZsYWdzOworCQl9CisJCWlmIChmbGFncyAmIE9QVF9SRU0pCisJCQlmc2ZsYWdzICY9IH5yZjsKKwkJaWYgKGZsYWdzICYgT1BUX0FERCkKKwkJCWZzZmxhZ3MgfD0gYWY7CisJCWlmICghU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWZzZmxhZ3MgJj0gfkVYVDJfRElSU1lOQ19GTDsKKwl9CisJaWYgKGZzZXRmbGFncyhuYW1lLCBmc2ZsYWdzKSA9PSAtMSkKKwkJYmJfZXJyb3JfbXNnKCJzZXR0aW5nIGZsYWdzIG9uICVzIiwgbmFtZSk7CisKK3NraXBfc2V0ZmxhZ3M6CisJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgcmVjdXJzaXZlKQorCQlpdGVyYXRlX29uX2RpcihuYW1lLCBjaGF0dHJfZGlyX3Byb2MsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGNoYXR0cl9kaXJfcHJvYyhjb25zdCBjaGFyICpkaXJfbmFtZSwgc3RydWN0IGRpcmVudCAqZGUsCisJCQkgICB2b2lkICpwcml2YXRlIEVYVDJGU19BVFRSKCh1bnVzZWQpKSkKK3sKKwkvKmlmIChzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSB8fCBzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikpIHsqLworCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJworCSAmJiAoIWRlLT5kX25hbWVbMV0gfHwgKGRlLT5kX25hbWVbMV0gPT0gJy4nICYmICFkZS0+ZF9uYW1lWzJdKSkKKwkpIHsKKwkJY2hhciAqcGF0aCA9IGNvbmNhdF9zdWJwYXRoX2ZpbGUoZGlyX25hbWUsIGRlLT5kX25hbWUpOworCQlpZiAocGF0aCkgeworCQkJY2hhbmdlX2F0dHJpYnV0ZXMocGF0aCk7CisJCQlmcmVlKHBhdGgpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgY2hhdHRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaGF0dHJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY2hhciAqYXJnOworCisJLyogcGFyc2UgdGhlIGFyZ3MgKi8KKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisJCWFyZyA9IGFyZ3ZbaV07CisKKwkJLyogdGFrZSBjYXJlIG9mIC1SIGFuZCAtdiA8dmVyc2lvbj4gKi8KKwkJaWYgKGFyZ1swXSA9PSAnLScpIHsKKwkJCWlmIChhcmdbMV0gPT0gJ1InICYmIGFyZ1syXSA9PSAnXDAnKSB7CisJCQkJcmVjdXJzaXZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoYXJnWzFdID09ICd2JyAmJiBhcmdbMl0gPT0gJ1wwJykgeworCQkJCWNoYXIgKnRtcDsKKwkJCQkrK2k7CisJCQkJaWYgKGkgPj0gYXJnYykKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCXZlcnNpb24gPSBzdHJ0b2woYXJndltpXSwgJnRtcCwgMCk7CisJCQkJaWYgKCp0bXApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgdmVyc2lvbiAnJXMnIiwgYXJnKTsKKwkJCQlmbGFncyB8PSBPUFRfU0VUX1ZFUjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmIChkZWNvZGVfYXJnKGFyZykgPT0gRU9GKQorCQkJYnJlYWs7CisJfQorCisJLyogcnVuIHNhbml0eSBjaGVja3Mgb24gYWxsIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdXMgKi8KKwlpZiAoaSA+PSBhcmdjKQorCQliYl9zaG93X3VzYWdlKCk7CisJaWYgKChmbGFncyAmIE9QVF9TRVQpICYmICgoZmxhZ3MgJiBPUFRfQUREKSB8fCAoZmxhZ3MgJiBPUFRfUkVNKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCI9IGlzIGluY29tcGF0aWJsZSB3aXRoIC0gYW5kICsiKTsKKwlpZiAoKHJmICYgYWYpICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJDYW4ndCBzZXQgYW5kIHVuc2V0IGEgZmxhZyIpOworCWlmICghZmxhZ3MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJNdXN0IHVzZSAnLXYnLCA9LCAtIG9yICsiKTsKKworCS8qIG5vdyBydW4gY2hhdHRyIG9uIGFsbCB0aGUgZmlsZXMgcGFzc2VkIHRvIHVzICovCisJd2hpbGUgKGkgPCBhcmdjKQorCQljaGFuZ2VfYXR0cmlidXRlcyhhcmd2W2krK10pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UyZnNiYi5oIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJmc2JiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxYzMxOQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UyZnNiYi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEZpbGU6IGUyZnNiYi5oCisgKgorICogUmVkZWZpbmUgYSBidW5jaCBvZiBlMmZzcHJvZ3Mgc3R1ZmYgdG8gdXNlIGJ1c3lib3ggcm91dGluZXMKKyAqIGluc3RlYWQuICBUaGlzIG1ha2VzIHVwZ3JhZGUgYmV0d2VlbiBlMmZzcHJvZ3MgdmVyc2lvbnMgZWFzeS4KKyAqLworCisjaWZuZGVmIEUyRlNCQl9ICisjZGVmaW5lIEUyRlNCQl9IIDEKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIHZlcnNpb24gd2UndmUgbGFzdCBzeW5jZWQgYWdhaW5zdCAqLworI2RlZmluZSBFMkZTUFJPR1NfVkVSU0lPTiAiMS4zOCIKKyNkZWZpbmUgRTJGU1BST0dTX0RBVEUgIjMwLUp1bi0yMDA1IgorCit0eXBlZGVmIGxvbmcgZXJyY29kZV90OworI2RlZmluZSBFUlJDT0RFX1JBTkdFIDgKKyNkZWZpbmUgZXJyb3JfbWVzc2FnZShjb2RlKSBzdHJlcnJvcigoaW50KSAoY29kZSAmICgoMTw8RVJSQ09ERV9SQU5HRSktMSkpKQorCisvKiBoZWFkZXIgZGVmaW5lcyAqLworI2RlZmluZSBFTkFCTEVfSFRSRUUgMQorI2RlZmluZSBIQVZFX0VSUk5PX0ggMQorI2RlZmluZSBIQVZFX0VYVDJfSU9DVExTIDEKKyNkZWZpbmUgSEFWRV9MSU5VWF9GRF9IIDEKKyNkZWZpbmUgSEFWRV9NTlRFTlRfSCAxCisjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKKyNkZWZpbmUgSEFWRV9ORVRfSUZfSCAxCisjZGVmaW5lIEhBVkVfU1lTX0lPQ1RMX0ggMQorI2RlZmluZSBIQVZFX1NZU19NT1VOVF9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfUVVFVUVfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogRW5kaWFubmVzcyAqLworI2lmIEJCX0JJR19FTkRJQU4KKyNkZWZpbmUgRU5BQkxFX1NXQVBGUyAxCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMmZzY2suYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UyZnNjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZmZhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMmZzY2suYwpAQCAtMCwwICsxLDEzNTIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBlMmZzY2sKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBHYXJyZXR0IEtham1vd2ljegorICoKKyAqIERpY3Rpb25hcnkgQWJzdHJhY3QgRGF0YSBUeXBlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgS2F6IEt5bGhla3UgPGthekBhc2hpLmZvb3RwcmludHMubmV0PgorICogRnJlZSBTb2Z0d2FyZSBMaWNlbnNlOgorICogQWxsIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQgYnkgdGhlIGF1dGhvciwgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZnJlZWx5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLAorICogcG9zc2libHkgaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzCisgKiBpbnRhY3QuIFBlcm1pc3Npb24gaXMgYWxzbyBncmFudGVkIHRvIGFkYXB0IHRoaXMgc29mdHdhcmUgdG8gcHJvZHVjZQorICogZGVyaXZhdGl2ZSB3b3JrcywgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbnMgY2FycnkgdGhpcyBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgYWRkaXRpb25hbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGUgd29yayBoYXMgYmVlbiBtb2RpZmllZC4KKyAqIFRoaXMgc291cmNlIGNvZGUgbWF5IGJlIHRyYW5zbGF0ZWQgaW50byBleGVjdXRhYmxlIGZvcm0gYW5kIGluY29ycG9yYXRlZAorICogaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZTsgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgZm9yIHN1Y2ggc29mdHdhcmUgdG8KKyAqIGNvbnRhaW4gYSBjb3B5cmlnaHQgbm90aWNlIHJlbGF0ZWQgdG8gdGhpcyBzb3VyY2UuCisgKgorICogbGludXgvZnMvcmVjb3ZlcnkgIGFuZCBsaW51eC9mcy9yZXZva2UKKyAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4sIDE5OTkKKyAqCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAwIFJlZCBIYXQgU29mdHdhcmUgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBKb3VybmFsIHJlY292ZXJ5IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisvL3VzYWdlOiNkZWZpbmUgZTJmc2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXBhbnlyY2RmdnN0REZTVl0gWy1iIHN1cGVyYmxvY2tdIFstQiBibG9ja3NpemVdICIKKy8vdXNhZ2U6ICAgICAgICJbLUkgaW5vZGVfYnVmZmVyX2Jsb2Nrc10gWy1QIHByb2Nlc3NfaW5vZGVfc2l6ZV0gIgorLy91c2FnZTogICAgICAgIlstbHwtTCBiYWRfYmxvY2tzX2ZpbGVdIFstQyBmZF0gWy1qIGV4dGVybmFsX2pvdXJuYWxdICIKKy8vdXNhZ2U6ICAgICAgICJbLUUgZXh0ZW5kZWQtb3B0aW9uc10gZGV2aWNlIgorLy91c2FnZTojZGVmaW5lIGUyZnNja19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoZWNrIGV4dDIvZXh0MyBmaWxlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICJcbgktcAkJQXV0b21hdGljIHJlcGFpciAobm8gcXVlc3Rpb25zKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCU1ha2Ugbm8gY2hhbmdlcyB0byB0aGUgZmlsZXN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JLXkJCUFzc3VtZSAneWVzJyB0byBhbGwgcXVlc3Rpb25zIgorLy91c2FnZTogICAgICJcbgktYwkJQ2hlY2sgZm9yIGJhZCBibG9ja3MgYW5kIGFkZCB0aGVtIHRvIHRoZSBiYWRibG9jayBsaXN0IgorLy91c2FnZTogICAgICJcbgktZgkJRm9yY2UgY2hlY2tpbmcgZXZlbiBpZiBmaWxlc3lzdGVtIGlzIG1hcmtlZCBjbGVhbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1iIHN1cGVyYmxvY2sJVXNlIGFsdGVybmF0aXZlIHN1cGVyYmxvY2siCisvL3VzYWdlOiAgICAgIlxuCS1CIGJsb2Nrc2l6ZQlGb3JjZSBibG9ja3NpemUgd2hlbiBsb29raW5nIGZvciBzdXBlcmJsb2NrIgorLy91c2FnZTogICAgICJcbgktaiBqb3VybmFsCVNldCBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgam91cm5hbCIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgZmlsZQkJQWRkIHRvIGJhZGJsb2NrcyBsaXN0IgorLy91c2FnZTogICAgICJcbgktTCBmaWxlCQlTZXQgYmFkYmxvY2tzIGxpc3QiCisqLworCisjaW5jbHVkZSAiZTJmc2NrLmgiCS8qUHV0IGFsbCBvZiBvdXIgZGVmaW5lcyBoZXJlIHRvIGNsZWFuIHRoaW5ncyB1cCovCisKKyNkZWZpbmUgXyh4KSB4CisjZGVmaW5lIE5fKHgpIHgKKworLyoKKyAqIFByb2NlZHVyZSBkZWNsYXJhdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBlMmZzY2tfcGFzczFfZHVwYmxvY2tzKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKTsKKworLyogcGFzczEuYyAqLworc3RhdGljIHZvaWQgZTJmc2NrX3VzZV9pbm9kZV9zaG9ydGN1dHMoZTJmc2NrX3QgY3R4LCBpbnQgYm9vbCk7CisKKy8qIHBhc3MyLmMgKi8KK3N0YXRpYyBpbnQgZTJmc2NrX3Byb2Nlc3NfYmFkX2lub2RlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBkaXIsCisJCQkJICAgIGV4dDJfaW5vX3QgaW5vLCBjaGFyICpidWYpOworCisvKiBwYXNzMy5jICovCitzdGF0aWMgaW50IGUyZnNja19yZWNvbm5lY3RfZmlsZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vZGUpOworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfZXhwYW5kX2RpcmVjdG9yeShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgZGlyLAorCQkJCQkgaW50IG51bSwgaW50IGdhdXJhbnRlZWRfc2l6ZSk7CitzdGF0aWMgZXh0Ml9pbm9fdCBlMmZzY2tfZ2V0X2xvc3RfYW5kX2ZvdW5kKGUyZnNja190IGN0eCwgaW50IGZpeCk7CitzdGF0aWMgZXJyY29kZV90IGUyZnNja19hZGp1c3RfaW5vZGVfY291bnQoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywKKwkJCQkJICAgaW50IGFkaik7CisKKy8qIHJlaGFzaC5jICovCitzdGF0aWMgdm9pZCBlMmZzY2tfcmVoYXNoX2RpcmVjdG9yaWVzKGUyZnNja190IGN0eCk7CisKKy8qIHV0aWwuYyAqLworc3RhdGljIHZvaWQgKmUyZnNja19hbGxvY2F0ZV9tZW1vcnkoZTJmc2NrX3QgY3R4LCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworc3RhdGljIGludCBhc2soZTJmc2NrX3QgY3R4LCBjb25zdCBjaGFyICogc3RyaW5nLCBpbnQgZGVmKTsKK3N0YXRpYyB2b2lkIGUyZnNja19yZWFkX2JpdG1hcHMoZTJmc2NrX3QgY3R4KTsKK3N0YXRpYyB2b2lkIHByZWVuaGFsdChlMmZzY2tfdCBjdHgpOworc3RhdGljIHZvaWQgZTJmc2NrX3JlYWRfaW5vZGUoZTJmc2NrX3QgY3R4LCB1bnNpZ25lZCBsb25nIGlubywKKwkJCSAgICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsIGNvbnN0IGNoYXIgKiBwcm9jKTsKK3N0YXRpYyB2b2lkIGUyZnNja193cml0ZV9pbm9kZShlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGxvbmcgaW5vLAorCQkJICAgICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsIGNvbnN0IGNoYXIgKiBwcm9jKTsKK3N0YXRpYyBibGtfdCBnZXRfYmFja3VwX3NiKGUyZnNja190IGN0eCwgZXh0Ml9maWxzeXMgZnMsCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpb19tYW5hZ2VyIG1hbmFnZXIpOworCisvKiB1bml4LmMgKi8KK3N0YXRpYyB2b2lkIGUyZnNja19jbGVhcl9wcm9nYmFyKGUyZnNja190IGN0eCk7CitzdGF0aWMgaW50IGUyZnNja19zaW1wbGVfcHJvZ3Jlc3MoZTJmc2NrX3QgY3R4LCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQkgIGZsb2F0IHBlcmNlbnQsIHVuc2lnbmVkIGludCBkcHludW0pOworCisKKy8qCisgKiBwcm9ibGVtLmggLS0tIGUyZnNjayBwcm9ibGVtIGVycm9yIGNvZGVzCisgKi8KKwordHlwZWRlZiBfX3UzMiBwcm9ibGVtX3Q7CisKK3N0cnVjdCBwcm9ibGVtX2NvbnRleHQgeworCWVycmNvZGVfdCAgICAgICBlcnJjb2RlOworCWV4dDJfaW5vX3QgICAgICBpbm8sIGlubzIsIGRpcjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGU7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQ7CisJYmxrX3QgICAgICAgICAgIGJsaywgYmxrMjsKKwllMl9ibGtjbnRfdCAgICAgYmxrY291bnQ7CisJaW50ICAgICAgICAgICAgIGdyb3VwOworCV9fdTY0ICAgICAgICAgICBudW07CisJY29uc3QgY2hhciAgICAgICpzdHI7Cit9OworCisKKy8qCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIGludCBmaXhfcHJvYmxlbShlMmZzY2tfdCBjdHgsIHByb2JsZW1fdCBjb2RlLCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KTsKK3N0YXRpYyBpbnQgZW5kX3Byb2JsZW1fbGF0Y2goZTJmc2NrX3QgY3R4LCBpbnQgbWFzayk7CitzdGF0aWMgaW50IHNldF9sYXRjaF9mbGFncyhpbnQgbWFzaywgaW50IHNldGZsYWdzLCBpbnQgY2xlYXJmbGFncyk7CitzdGF0aWMgdm9pZCBjbGVhcl9wcm9ibGVtX2NvbnRleHQoc3RydWN0IHByb2JsZW1fY29udGV4dCAqY3R4KTsKKworLyoKKyAqIERpY3Rpb25hcnkgQWJzdHJhY3QgRGF0YSBUeXBlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgS2F6IEt5bGhla3UgPGthekBhc2hpLmZvb3RwcmludHMubmV0PgorICoKKyAqIGRpY3QuaCB2IDEuMjIuMi42IDIwMDAvMTEvMTMgMDE6MzY6NDQga2F6CisgKiBrYXpsaWJfMV8yMAorICovCisKKyNpZm5kZWYgRElDVF9ICisjZGVmaW5lIERJQ1RfSAorCisvKgorICogQmx1cmIgZm9yIGluY2x1c2lvbiBpbnRvIEMrKyB0cmFuc2xhdGlvbiB1bml0cworICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkaWN0Y291bnRfdDsKKyNkZWZpbmUgRElDVENPVU5UX1RfTUFYIFVMT05HX01BWAorCisvKgorICogVGhlIGRpY3Rpb25hcnkgaXMgaW1wbGVtZW50ZWQgYXMgYSByZWQtYmxhY2sgdHJlZQorICovCisKK3R5cGVkZWYgZW51bSB7IGRub2RlX3JlZCwgZG5vZGVfYmxhY2sgfSBkbm9kZV9jb2xvcl90OworCit0eXBlZGVmIHN0cnVjdCBkbm9kZV90IHsKKwlzdHJ1Y3QgZG5vZGVfdCAqZGljdF9sZWZ0OworCXN0cnVjdCBkbm9kZV90ICpkaWN0X3JpZ2h0OworCXN0cnVjdCBkbm9kZV90ICpkaWN0X3BhcmVudDsKKwlkbm9kZV9jb2xvcl90IGRpY3RfY29sb3I7CisJY29uc3Qgdm9pZCAqZGljdF9rZXk7CisJdm9pZCAqZGljdF9kYXRhOworfSBkbm9kZV90OworCit0eXBlZGVmIGludCAoKmRpY3RfY29tcF90KShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgKCpkbm9kZV9mcmVlX3QpKGRub2RlX3QgKik7CisKK3R5cGVkZWYgc3RydWN0IGRpY3RfdCB7CisJZG5vZGVfdCBkaWN0X25pbG5vZGU7CisJZGljdGNvdW50X3QgZGljdF9ub2RlY291bnQ7CisJZGljdGNvdW50X3QgZGljdF9tYXhjb3VudDsKKwlkaWN0X2NvbXBfdCBkaWN0X2NvbXBhcmU7CisJZG5vZGVfZnJlZV90IGRpY3RfZnJlZW5vZGU7CisJaW50IGRpY3RfZHVwZXM7Cit9IGRpY3RfdDsKKwordHlwZWRlZiB2b2lkICgqZG5vZGVfcHJvY2Vzc190KShkaWN0X3QgKiwgZG5vZGVfdCAqLCB2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCBkaWN0X2xvYWRfdCB7CisJZGljdF90ICpkaWN0X2RpY3RwdHI7CisJZG5vZGVfdCBkaWN0X25pbG5vZGU7Cit9IGRpY3RfbG9hZF90OworCisjZGVmaW5lIGRpY3RfY291bnQoRCkgKChEKS0+ZGljdF9ub2RlY291bnQpCisjZGVmaW5lIGRub2RlX2dldChOKSAoKE4pLT5kaWN0X2RhdGEpCisjZGVmaW5lIGRub2RlX2dldGtleShOKSAoKE4pLT5kaWN0X2tleSkKKworI2VuZGlmCisKKy8qCisgKiBDb21wYXRpYmlsaXR5IGhlYWRlciBmaWxlIGZvciBlMmZzY2sgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkCisgKiBpbnN0ZWFkIG9mIGxpbnV4L2pmcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXBoZW4gQy4gVHdlZWRpZQorICovCisKKy8qCisgKiBQdWxsIGluIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlMmZzY2sgY29udGV4dCBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgYnVmZmVyX2hlYWQgeworCWNoYXIgICAgICAgICAgICBiX2RhdGFbODE5Ml07CisJZTJmc2NrX3QgICAgICAgIGJfY3R4OworCWlvX2NoYW5uZWwgICAgICBiX2lvOworCWludCAgICAgICAgICAgICBiX3NpemU7CisJYmxrX3QgICAgICAgICAgIGJfYmxvY2tucjsKKwlpbnQgICAgICAgICAgICAgYl9kaXJ0eTsKKwlpbnQgICAgICAgICAgICAgYl91cHRvZGF0ZTsKKwlpbnQgICAgICAgICAgICAgYl9lcnI7Cit9OworCisKKyNkZWZpbmUgS19ERVZfRlMgICAgICAgIDEKKyNkZWZpbmUgS19ERVZfSk9VUk5BTCAgIDIKKworI2RlZmluZSBsb2NrX2J1ZmZlcihiaCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHVubG9ja19idWZmZXIoYmgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBidWZmZXJfcmVxKGJoKSAxCisjZGVmaW5lIGRvX3JlYWRhaGVhZChqb3VybmFsLCBzdGFydCkgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBlMmZzY2tfdCBlMmZzY2tfZ2xvYmFsX2N0eDsgIC8qIFRyeSB5b3VyIHZlcnkgYmVzdCBub3QgdG8gdXNlIHRoaXMhICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgICAgIG9iamVjdF9sZW5ndGg7Cit9IGttZW1fY2FjaGVfdDsKKworI2RlZmluZSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlLGZsYWdzKSBtYWxsb2MoKGNhY2hlKS0+b2JqZWN0X2xlbmd0aCkKKworLyoKKyAqIFdlIHVzZSB0aGUgc3RhbmRhcmQgbGliZXh0MmZzIHBvcnRhYmlsaXR5IHRyaWNrcyBmb3IgaW5saW5lCisgKiBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGttZW1fY2FjaGVfdCAqIGRvX2NhY2hlX2NyZWF0ZShpbnQgbGVuKQoreworCWttZW1fY2FjaGVfdCAqbmV3X2NhY2hlOworCisJbmV3X2NhY2hlID0geG1hbGxvYyhzaXplb2YoKm5ld19jYWNoZSkpOworCW5ld19jYWNoZS0+b2JqZWN0X2xlbmd0aCA9IGxlbjsKKwlyZXR1cm4gbmV3X2NhY2hlOworfQorCitzdGF0aWMgdm9pZCBkb19jYWNoZV9kZXN0cm95KGttZW1fY2FjaGVfdCAqY2FjaGUpCit7CisJZnJlZShjYWNoZSk7Cit9CisKKworLyoKKyAqIERpY3Rpb25hcnkgQWJzdHJhY3QgRGF0YSBUeXBlCisgKi8KKworCisvKgorICogVGhlc2UgbWFjcm9zIHByb3ZpZGUgc2hvcnQgY29udmVuaWVudCBuYW1lcyBmb3Igc3RydWN0dXJlIG1lbWJlcnMsCisgKiB3aGljaCBhcmUgZW1iZWxsaXNoZWQgd2l0aCBkaWN0XyBwcmVmaXhlcyBzbyB0aGF0IHRoZXkgYXJlCisgKiBwcm9wZXJseSBjb25maW5lZCB0byB0aGUgZG9jdW1lbnRlZCBuYW1lc3BhY2UuIEl0J3MgbGVnYWwgZm9yIGEKKyAqIHByb2dyYW0gd2hpY2ggdXNlcyBkaWN0IHRvIGRlZmluZSwgZm9yIGluc3RhbmNlLCBhIG1hY3JvIGNhbGxlZCBgYHBhcmVudCcnLgorICogU3VjaCBhIG1hY3JvIHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBkbm9kZV90IHN0cnVjdCBkZWZpbml0aW9uLgorICogSW4gZ2VuZXJhbCwgaGlnaGx5IHBvcnRhYmxlIGFuZCByZXVzYWJsZSBDIG1vZHVsZXMgd2hpY2ggZXhwb3NlIHRoZWlyCisgKiBzdHJ1Y3R1cmVzIG5lZWQgdG8gY29uZmluZSBzdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIHRvIHdlbGwtZGVmaW5lZCBzcGFjZXMuCisgKiBUaGUgcmVzdWx0aW5nIGlkZW50aWZpZXJzIGFyZW4ndCBuZWNlc3NhcmlseSBjb252ZW5pZW50IHRvIHVzZSwgbm9yCisgKiByZWFkYWJsZSwgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBob3dldmVyIQorICovCisKKyNkZWZpbmUgbGVmdCBkaWN0X2xlZnQKKyNkZWZpbmUgcmlnaHQgZGljdF9yaWdodAorI2RlZmluZSBwYXJlbnQgZGljdF9wYXJlbnQKKyNkZWZpbmUgY29sb3IgZGljdF9jb2xvcgorI2RlZmluZSBrZXkgZGljdF9rZXkKKyNkZWZpbmUgZGF0YSBkaWN0X2RhdGEKKworI2RlZmluZSBuaWxub2RlIGRpY3Rfbmlsbm9kZQorI2RlZmluZSBtYXhjb3VudCBkaWN0X21heGNvdW50CisjZGVmaW5lIGNvbXBhcmUgZGljdF9jb21wYXJlCisjZGVmaW5lIGR1cGVzIGRpY3RfZHVwZXMKKworI2RlZmluZSBkaWN0X3Jvb3QoRCkgKChEKS0+bmlsbm9kZS5sZWZ0KQorI2RlZmluZSBkaWN0X25pbChEKSAoJihEKS0+bmlsbm9kZSkKKworc3RhdGljIHZvaWQgZG5vZGVfZnJlZShkbm9kZV90ICpub2RlKTsKKworLyoKKyAqIFBlcmZvcm0gYSBgYGxlZnQgcm90YXRpb24nJyBhZGp1c3RtZW50IG9uIHRoZSB0cmVlLiAgVGhlIGdpdmVuIG5vZGUgUCBhbmQKKyAqIGl0cyByaWdodCBjaGlsZCBDIGFyZSByZWFycmFuZ2VkIHNvIHRoYXQgdGhlIFAgaW5zdGVhZCBiZWNvbWVzIHRoZSBsZWZ0CisgKiBjaGlsZCBvZiBDLiAgIFRoZSBsZWZ0IHN1YnRyZWUgb2YgQyBpcyBpbmhlcml0ZWQgYXMgdGhlIG5ldyByaWdodCBzdWJ0cmVlCisgKiBmb3IgUC4gIFRoZSBvcmRlcmluZyBvZiB0aGUga2V5cyB3aXRoaW4gdGhlIHRyZWUgaXMgdGh1cyBwcmVzZXJ2ZWQuCisgKi8KKworc3RhdGljIHZvaWQgcm90YXRlX2xlZnQoZG5vZGVfdCAqdXBwZXIpCit7CisJZG5vZGVfdCAqbG93ZXIsICpsb3dsZWZ0LCAqdXBwYXJlbnQ7CisKKwlsb3dlciA9IHVwcGVyLT5yaWdodDsKKwl1cHBlci0+cmlnaHQgPSBsb3dsZWZ0ID0gbG93ZXItPmxlZnQ7CisJbG93bGVmdC0+cGFyZW50ID0gdXBwZXI7CisKKwlsb3dlci0+cGFyZW50ID0gdXBwYXJlbnQgPSB1cHBlci0+cGFyZW50OworCisJLyogZG9uJ3QgbmVlZCB0byBjaGVjayBmb3Igcm9vdCBub2RlIGhlcmUgYmVjYXVzZSByb290LT5wYXJlbnQgaXMKKwkgICB0aGUgc2VudGluZWwgbmlsIG5vZGUsIGFuZCByb290LT5wYXJlbnQtPmxlZnQgcG9pbnRzIGJhY2sgdG8gcm9vdCAqLworCisJaWYgKHVwcGVyID09IHVwcGFyZW50LT5sZWZ0KSB7CisJCXVwcGFyZW50LT5sZWZ0ID0gbG93ZXI7CisJfSBlbHNlIHsKKwkJYXNzZXJ0ICh1cHBlciA9PSB1cHBhcmVudC0+cmlnaHQpOworCQl1cHBhcmVudC0+cmlnaHQgPSBsb3dlcjsKKwl9CisKKwlsb3dlci0+bGVmdCA9IHVwcGVyOworCXVwcGVyLT5wYXJlbnQgPSBsb3dlcjsKK30KKworLyoKKyAqIFRoaXMgb3BlcmF0aW9uIGlzIHRoZSBgYG1pcnJvcicnIGltYWdlIG9mIHJvdGF0ZV9sZWZ0LiBJdCBpcworICogdGhlIHNhbWUgcHJvY2VkdXJlLCBidXQgd2l0aCBsZWZ0IGFuZCByaWdodCBpbnRlcmNoYW5nZWQuCisgKi8KKworc3RhdGljIHZvaWQgcm90YXRlX3JpZ2h0KGRub2RlX3QgKnVwcGVyKQoreworCWRub2RlX3QgKmxvd2VyLCAqbG93cmlnaHQsICp1cHBhcmVudDsKKworCWxvd2VyID0gdXBwZXItPmxlZnQ7CisJdXBwZXItPmxlZnQgPSBsb3dyaWdodCA9IGxvd2VyLT5yaWdodDsKKwlsb3dyaWdodC0+cGFyZW50ID0gdXBwZXI7CisKKwlsb3dlci0+cGFyZW50ID0gdXBwYXJlbnQgPSB1cHBlci0+cGFyZW50OworCisJaWYgKHVwcGVyID09IHVwcGFyZW50LT5yaWdodCkgeworCQl1cHBhcmVudC0+cmlnaHQgPSBsb3dlcjsKKwl9IGVsc2UgeworCQlhc3NlcnQgKHVwcGVyID09IHVwcGFyZW50LT5sZWZ0KTsKKwkJdXBwYXJlbnQtPmxlZnQgPSBsb3dlcjsKKwl9CisKKwlsb3dlci0+cmlnaHQgPSB1cHBlcjsKKwl1cHBlci0+cGFyZW50ID0gbG93ZXI7Cit9CisKKy8qCisgKiBEbyBhIHBvc3RvcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUgcm9vdGVkIGF0IHRoZSBzcGVjaWZpZWQKKyAqIG5vZGUgYW5kIGZyZWUgZXZlcnl0aGluZyB1bmRlciBpdC4gIFVzZWQgYnkgZGljdF9mcmVlKCkuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9ub2RlcyhkaWN0X3QgKmRpY3QsIGRub2RlX3QgKm5vZGUsIGRub2RlX3QgKm5pbCkKK3sKKwlpZiAobm9kZSA9PSBuaWwpCisJCXJldHVybjsKKwlmcmVlX25vZGVzKGRpY3QsIG5vZGUtPmxlZnQsIG5pbCk7CisJZnJlZV9ub2RlcyhkaWN0LCBub2RlLT5yaWdodCwgbmlsKTsKKwlkaWN0LT5kaWN0X2ZyZWVub2RlKG5vZGUpOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgdGhlIHRyZWUgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUuIFRoaXMgaXMgZG9uZSBieQorICogdHJhdmVyc2luZyBhbGwgb2YgdGhlIG5vZGVzIGFuZCBjb21wYXJpbmcgdGhlaXIgcG9pbnRlcnMgdG8gdGhlCisgKiBnaXZlbiBwb2ludGVyLiBSZXR1cm5zIDEgaWYgdGhlIG5vZGUgaXMgZm91bmQsIG90aGVyd2lzZQorICogcmV0dXJucyB6ZXJvLiBJdCBpcyBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICovCisKK3N0YXRpYyBpbnQgdmVyaWZ5X2RpY3RfaGFzX25vZGUoZG5vZGVfdCAqbmlsLCBkbm9kZV90ICpyb290LCBkbm9kZV90ICpub2RlKQoreworCWlmIChyb290ICE9IG5pbCkgeworCQlyZXR1cm4gcm9vdCA9PSBub2RlCisJCQl8fCB2ZXJpZnlfZGljdF9oYXNfbm9kZShuaWwsIHJvb3QtPmxlZnQsIG5vZGUpCisJCQl8fCB2ZXJpZnlfZGljdF9oYXNfbm9kZShuaWwsIHJvb3QtPnJpZ2h0LCBub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFNlbGVjdCBhIGRpZmZlcmVudCBzZXQgb2Ygbm9kZSBhbGxvY2F0b3Igcm91dGluZXMuCisgKi8KKworc3RhdGljIHZvaWQgZGljdF9zZXRfYWxsb2NhdG9yKGRpY3RfdCAqZGljdCwgZG5vZGVfZnJlZV90IGZyKQoreworCWFzc2VydChkaWN0X2NvdW50KGRpY3QpID09IDApOworCWRpY3QtPmRpY3RfZnJlZW5vZGUgPSBmcjsKK30KKworLyoKKyAqIEZyZWUgYWxsIHRoZSBub2RlcyBpbiB0aGUgZGljdGlvbmFyeSBieSB1c2luZyB0aGUgZGljdGlvbmFyeSdzCisgKiBpbnN0YWxsZWQgZnJlZSByb3V0aW5lLiBUaGUgZGljdGlvbmFyeSBpcyBlbXB0aWVkLgorICovCisKK3N0YXRpYyB2b2lkIGRpY3RfZnJlZV9ub2RlcyhkaWN0X3QgKmRpY3QpCit7CisJZG5vZGVfdCAqbmlsID0gZGljdF9uaWwoZGljdCksICpyb290ID0gZGljdF9yb290KGRpY3QpOworCWZyZWVfbm9kZXMoZGljdCwgcm9vdCwgbmlsKTsKKwlkaWN0LT5kaWN0X25vZGVjb3VudCA9IDA7CisJZGljdC0+bmlsbm9kZS5sZWZ0ID0gJmRpY3QtPm5pbG5vZGU7CisJZGljdC0+bmlsbm9kZS5yaWdodCA9ICZkaWN0LT5uaWxub2RlOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHVzZXItc3VwcGxpZWQgZGljdGlvbmFyeSBvYmplY3QuCisgKi8KKworc3RhdGljIGRpY3RfdCAqZGljdF9pbml0KGRpY3RfdCAqZGljdCwgZGljdGNvdW50X3QgbWF4Y291bnQsIGRpY3RfY29tcF90IGNvbXApCit7CisJZGljdC0+Y29tcGFyZSA9IGNvbXA7CisJZGljdC0+ZGljdF9mcmVlbm9kZSA9IGRub2RlX2ZyZWU7CisJZGljdC0+ZGljdF9ub2RlY291bnQgPSAwOworCWRpY3QtPm1heGNvdW50ID0gbWF4Y291bnQ7CisJZGljdC0+bmlsbm9kZS5sZWZ0ID0gJmRpY3QtPm5pbG5vZGU7CisJZGljdC0+bmlsbm9kZS5yaWdodCA9ICZkaWN0LT5uaWxub2RlOworCWRpY3QtPm5pbG5vZGUucGFyZW50ID0gJmRpY3QtPm5pbG5vZGU7CisJZGljdC0+bmlsbm9kZS5jb2xvciA9IGRub2RlX2JsYWNrOworCWRpY3QtPmR1cGVzID0gMDsKKwlyZXR1cm4gZGljdDsKK30KKworLyoKKyAqIExvY2F0ZSBhIG5vZGUgaW4gdGhlIGRpY3Rpb25hcnkgaGF2aW5nIHRoZSBnaXZlbiBrZXkuCisgKiBJZiB0aGUgbm9kZSBpcyBub3QgZm91bmQsIGEgbnVsbCBhIHBvaW50ZXIgaXMgcmV0dXJuZWQgKHJhdGhlciB0aGFuCisgKiBhIHBvaW50ZXIgdGhhdCBkaWN0aW9uYXJ5J3MgbmlsIHNlbnRpbmVsIG5vZGUpLCBvdGhlcndpc2UgYSBwb2ludGVyIHRvIHRoZQorICogbG9jYXRlZCBub2RlIGlzIHJldHVybmVkLgorICovCisKK3N0YXRpYyBkbm9kZV90ICpkaWN0X2xvb2t1cChkaWN0X3QgKmRpY3QsIGNvbnN0IHZvaWQgKmtleSkKK3sKKwlkbm9kZV90ICpyb290ID0gZGljdF9yb290KGRpY3QpOworCWRub2RlX3QgKm5pbCA9IGRpY3RfbmlsKGRpY3QpOworCWRub2RlX3QgKnNhdmVkOworCWludCByZXN1bHQ7CisKKwkvKiBzaW1wbGUgYmluYXJ5IHNlYXJjaCBhZGFwdGVkIGZvciB0cmVlcyB0aGF0IGNvbnRhaW4gZHVwbGljYXRlIGtleXMgKi8KKworCXdoaWxlIChyb290ICE9IG5pbCkgeworCQlyZXN1bHQgPSBkaWN0LT5jb21wYXJlKGtleSwgcm9vdC0+a2V5KTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlyb290ID0gcm9vdC0+bGVmdDsKKwkJZWxzZSBpZiAocmVzdWx0ID4gMCkKKwkJCXJvb3QgPSByb290LT5yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAoIWRpY3QtPmR1cGVzKSB7IC8qIG5vIGR1cGxpY2F0ZXMsIHJldHVybiBtYXRjaCAgICAgICAgICAqLworCQkJCXJldHVybiByb290OworCQkJfSBlbHNlIHsgICAgICAgICAgICAvKiBjb3VsZCBiZSBkdXBlcywgZmluZCBsZWZ0bW9zdCBvbmUgICAgKi8KKwkJCQlkbyB7CisJCQkJCXNhdmVkID0gcm9vdDsKKwkJCQkJcm9vdCA9IHJvb3QtPmxlZnQ7CisJCQkJCXdoaWxlIChyb290ICE9IG5pbCAmJiBkaWN0LT5jb21wYXJlKGtleSwgcm9vdC0+a2V5KSkKKwkJCQkJCXJvb3QgPSByb290LT5yaWdodDsKKwkJCQl9IHdoaWxlIChyb290ICE9IG5pbCk7CisJCQkJcmV0dXJuIHNhdmVkOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBJbnNlcnQgYSBub2RlIGludG8gdGhlIGRpY3Rpb25hcnkuIFRoZSBub2RlIHNob3VsZCBoYXZlIGJlZW4KKyAqIGluaXRpYWxpemVkIHdpdGggYSBkYXRhIGZpZWxkLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBpZ25vcmVkLgorICogVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiB0aGUgdXNlciBhdHRlbXB0cyB0byBpbnNlcnQgaW50bworICogYSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWxyZWFkeSBmdWxsIChmb3Igd2hpY2ggdGhlIGRpY3RfaXNmdWxsKCkKKyAqIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSkuCisgKi8KKworc3RhdGljIHZvaWQgZGljdF9pbnNlcnQoZGljdF90ICpkaWN0LCBkbm9kZV90ICpub2RlLCBjb25zdCB2b2lkICprZXkpCit7CisJZG5vZGVfdCAqd2hlcmUgPSBkaWN0X3Jvb3QoZGljdCksICpuaWwgPSBkaWN0X25pbChkaWN0KTsKKwlkbm9kZV90ICpwYXJlbnQgPSBuaWwsICp1bmNsZSwgKmdyYW5kcGE7CisJaW50IHJlc3VsdCA9IC0xOworCisJbm9kZS0+a2V5ID0ga2V5OworCisJLyogYmFzaWMgYmluYXJ5IHRyZWUgaW5zZXJ0ICovCisKKwl3aGlsZSAod2hlcmUgIT0gbmlsKSB7CisJCXBhcmVudCA9IHdoZXJlOworCQlyZXN1bHQgPSBkaWN0LT5jb21wYXJlKGtleSwgd2hlcmUtPmtleSk7CisJCS8qIHRyYXAgYXR0ZW1wdHMgYXQgZHVwbGljYXRlIGtleSBpbnNlcnRpb24gdW5sZXNzIGl0J3MgZXhwbGljaXRseSBhbGxvd2VkICovCisJCWFzc2VydChkaWN0LT5kdXBlcyB8fCByZXN1bHQgIT0gMCk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJd2hlcmUgPSB3aGVyZS0+bGVmdDsKKwkJZWxzZQorCQkJd2hlcmUgPSB3aGVyZS0+cmlnaHQ7CisJfQorCisJYXNzZXJ0KHdoZXJlID09IG5pbCk7CisKKwlpZiAocmVzdWx0IDwgMCkKKwkJcGFyZW50LT5sZWZ0ID0gbm9kZTsKKwllbHNlCisJCXBhcmVudC0+cmlnaHQgPSBub2RlOworCisJbm9kZS0+cGFyZW50ID0gcGFyZW50OworCW5vZGUtPmxlZnQgPSBuaWw7CisJbm9kZS0+cmlnaHQgPSBuaWw7CisKKwlkaWN0LT5kaWN0X25vZGVjb3VudCsrOworCisJLyogcmVkIGJsYWNrIGFkanVzdG1lbnRzICovCisKKwlub2RlLT5jb2xvciA9IGRub2RlX3JlZDsKKworCXdoaWxlIChwYXJlbnQtPmNvbG9yID09IGRub2RlX3JlZCkgeworCQlncmFuZHBhID0gcGFyZW50LT5wYXJlbnQ7CisJCWlmIChwYXJlbnQgPT0gZ3JhbmRwYS0+bGVmdCkgeworCQkJdW5jbGUgPSBncmFuZHBhLT5yaWdodDsKKwkJCWlmICh1bmNsZS0+Y29sb3IgPT0gZG5vZGVfcmVkKSB7ICAgIC8qIHJlZCBwYXJlbnQsIHJlZCB1bmNsZSAqLworCQkJCXBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkJCQl1bmNsZS0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkJCQlncmFuZHBhLT5jb2xvciA9IGRub2RlX3JlZDsKKwkJCQlub2RlID0gZ3JhbmRwYTsKKwkJCQlwYXJlbnQgPSBncmFuZHBhLT5wYXJlbnQ7CisJCQl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWQgcGFyZW50LCBibGFjayB1bmNsZSAqLworCQkJCWlmIChub2RlID09IHBhcmVudC0+cmlnaHQpIHsKKwkJCQkJcm90YXRlX2xlZnQocGFyZW50KTsKKwkJCQkJcGFyZW50ID0gbm9kZTsKKwkJCQkJYXNzZXJ0IChncmFuZHBhID09IHBhcmVudC0+cGFyZW50KTsKKwkJCQkJLyogcm90YXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHByZXNlcnZlcyBncmFuZHBhICovCisJCQkJfQorCQkJCXBhcmVudC0+Y29sb3IgPSBkbm9kZV9ibGFjazsKKwkJCQlncmFuZHBhLT5jb2xvciA9IGRub2RlX3JlZDsKKwkJCQlyb3RhdGVfcmlnaHQoZ3JhbmRwYSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7ICAgICAgICAvKiBzeW1tZXRyaWMgY2FzZXM6IHBhcmVudCA9PSBwYXJlbnQtPnBhcmVudC0+cmlnaHQgKi8KKwkJCXVuY2xlID0gZ3JhbmRwYS0+bGVmdDsKKwkJCWlmICh1bmNsZS0+Y29sb3IgPT0gZG5vZGVfcmVkKSB7CisJCQkJcGFyZW50LT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkJCXVuY2xlLT5jb2xvciA9IGRub2RlX2JsYWNrOworCQkJCWdyYW5kcGEtPmNvbG9yID0gZG5vZGVfcmVkOworCQkJCW5vZGUgPSBncmFuZHBhOworCQkJCXBhcmVudCA9IGdyYW5kcGEtPnBhcmVudDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5vZGUgPT0gcGFyZW50LT5sZWZ0KSB7CisJCQkJCXJvdGF0ZV9yaWdodChwYXJlbnQpOworCQkJCQlwYXJlbnQgPSBub2RlOworCQkJCQlhc3NlcnQgKGdyYW5kcGEgPT0gcGFyZW50LT5wYXJlbnQpOworCQkJCX0KKwkJCQlwYXJlbnQtPmNvbG9yID0gZG5vZGVfYmxhY2s7CisJCQkJZ3JhbmRwYS0+Y29sb3IgPSBkbm9kZV9yZWQ7CisJCQkJcm90YXRlX2xlZnQoZ3JhbmRwYSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlkaWN0X3Jvb3QoZGljdCktPmNvbG9yID0gZG5vZGVfYmxhY2s7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5vZGUgdXNpbmcgdGhlIGRpY3Rpb25hcnkncyBhbGxvY2F0b3Igcm91dGluZSwgZ2l2ZSBpdAorICogdGhlIGRhdGEgaXRlbS4KKyAqLworCitzdGF0aWMgZG5vZGVfdCAqZG5vZGVfaW5pdChkbm9kZV90ICpkbm9kZSwgdm9pZCAqZGF0YSkKK3sKKwlkbm9kZS0+ZGF0YSA9IGRhdGE7CisJZG5vZGUtPnBhcmVudCA9IE5VTEw7CisJZG5vZGUtPmxlZnQgPSBOVUxMOworCWRub2RlLT5yaWdodCA9IE5VTEw7CisJcmV0dXJuIGRub2RlOworfQorCitzdGF0aWMgaW50IGRpY3RfYWxsb2NfaW5zZXJ0KGRpY3RfdCAqZGljdCwgY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhKQoreworCWRub2RlX3QgKm5vZGUgPSB4bWFsbG9jKHNpemVvZihkbm9kZV90KSk7CisKKwlkbm9kZV9pbml0KG5vZGUsIGRhdGEpOworCWRpY3RfaW5zZXJ0KGRpY3QsIG5vZGUsIGtleSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG5vZGUgd2l0aCB0aGUgbG93ZXN0IChsZWZ0bW9zdCkga2V5LiBJZiB0aGUgZGljdGlvbmFyeSBpcyBlbXB0eQorICogKHRoYXQgaXMsIGRpY3RfaXNlbXB0eShkaWN0KSByZXR1cm5zIDEpIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkLgorICovCisKK3N0YXRpYyBkbm9kZV90ICpkaWN0X2ZpcnN0KGRpY3RfdCAqZGljdCkKK3sKKwlkbm9kZV90ICpuaWwgPSBkaWN0X25pbChkaWN0KSwgKnJvb3QgPSBkaWN0X3Jvb3QoZGljdCksICpsZWZ0OworCisJaWYgKHJvb3QgIT0gbmlsKQorCQl3aGlsZSAoKGxlZnQgPSByb290LT5sZWZ0KSAhPSBuaWwpCisJCQlyb290ID0gbGVmdDsKKworCXJldHVybiAocm9vdCA9PSBuaWwpID8gTlVMTCA6IHJvb3Q7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGdpdmVuIG5vZGUncyBzdWNjZXNzb3Igbm9kZS0tLXRoZSBub2RlIHdoaWNoIGhhcyB0aGUKKyAqIG5leHQga2V5IGluIHRoZSBsZWZ0IHRvIHJpZ2h0IG9yZGVyaW5nLiBJZiB0aGUgbm9kZSBoYXMKKyAqIG5vIHN1Y2Nlc3NvciwgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQgcmF0aGVyIHRoYW4gYSBwb2ludGVyIHRvCisgKiB0aGUgbmlsIG5vZGUuCisgKi8KKworc3RhdGljIGRub2RlX3QgKmRpY3RfbmV4dChkaWN0X3QgKmRpY3QsIGRub2RlX3QgKmN1cnIpCit7CisJZG5vZGVfdCAqbmlsID0gZGljdF9uaWwoZGljdCksICpwYXJlbnQsICpsZWZ0OworCisJaWYgKGN1cnItPnJpZ2h0ICE9IG5pbCkgeworCQljdXJyID0gY3Vyci0+cmlnaHQ7CisJCXdoaWxlICgobGVmdCA9IGN1cnItPmxlZnQpICE9IG5pbCkKKwkJCWN1cnIgPSBsZWZ0OworCQlyZXR1cm4gY3VycjsKKwl9CisKKwlwYXJlbnQgPSBjdXJyLT5wYXJlbnQ7CisKKwl3aGlsZSAocGFyZW50ICE9IG5pbCAmJiBjdXJyID09IHBhcmVudC0+cmlnaHQpIHsKKwkJY3VyciA9IHBhcmVudDsKKwkJcGFyZW50ID0gY3Vyci0+cGFyZW50OworCX0KKworCXJldHVybiAocGFyZW50ID09IG5pbCkgPyBOVUxMIDogcGFyZW50OworfQorCisKK3N0YXRpYyB2b2lkIGRub2RlX2ZyZWUoZG5vZGVfdCAqbm9kZSkKK3sKKwlmcmVlKG5vZGUpOworfQorCisKKyN1bmRlZiBsZWZ0CisjdW5kZWYgcmlnaHQKKyN1bmRlZiBwYXJlbnQKKyN1bmRlZiBjb2xvcgorI3VuZGVmIGtleQorI3VuZGVmIGRhdGEKKworI3VuZGVmIG5pbG5vZGUKKyN1bmRlZiBtYXhjb3VudAorI3VuZGVmIGNvbXBhcmUKKyN1bmRlZiBkdXBlcworCisKKy8qCisgKiBkaXJpbmZvLmMgLS0tIG1haW50YWlucyB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHRhYmxlIGZvciBlMmZzY2suCisgKi8KKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBpcyBjYWxsZWQgZHVyaW5nIHBhc3MxIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBpbmZvCisgKiBlbnRyeS4gIER1cmluZyBwYXNzMSwgdGhlIHBhc3NlZC1pbiBwYXJlbnQgaXMgMDsgaXQgd2lsbCBnZXQgZmlsbGVkCisgKiBpbiBkdXJpbmcgcGFzczIuCisgKi8KK3N0YXRpYyB2b2lkIGUyZnNja19hZGRfZGlyX2luZm8oZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywgZXh0Ml9pbm9fdCBwYXJlbnQpCit7CisJc3RydWN0IGRpcl9pbmZvICpkaXI7CisJaW50ICAgICAgICAgICAgIGksIGo7CisJZXh0Ml9pbm9fdCAgICAgIG51bV9kaXJzOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJdW5zaWduZWQgbG9uZyAgIG9sZF9zaXplOworCisJaWYgKCFjdHgtPmRpcl9pbmZvKSB7CisJCWN0eC0+ZGlyX2luZm9fY291bnQgPSAwOworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X251bV9kaXJzKGN0eC0+ZnMsICZudW1fZGlycyk7CisJCWlmIChyZXR2YWwpCisJCQludW1fZGlycyA9IDEwMjQ7ICAgICAgICAvKiBHdWVzcyAqLworCQljdHgtPmRpcl9pbmZvX3NpemUgPSBudW1fZGlycyArIDEwOworCQljdHgtPmRpcl9pbmZvICA9IChzdHJ1Y3QgZGlyX2luZm8gKikKKwkJCWUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBjdHgtPmRpcl9pbmZvX3NpemUKKwkJCQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZGlyX2luZm8pLAorCQkJCQkgICAgICAgImRpcmVjdG9yeSBtYXAiKTsKKwl9CisKKwlpZiAoY3R4LT5kaXJfaW5mb19jb3VudCA+PSBjdHgtPmRpcl9pbmZvX3NpemUpIHsKKwkJb2xkX3NpemUgPSBjdHgtPmRpcl9pbmZvX3NpemUgKiBzaXplb2Yoc3RydWN0IGRpcl9pbmZvKTsKKwkJY3R4LT5kaXJfaW5mb19zaXplICs9IDEwOworCQlyZXR2YWwgPSBleHQyZnNfcmVzaXplX21lbShvbGRfc2l6ZSwgY3R4LT5kaXJfaW5mb19zaXplICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBkaXJfaW5mbyksCisJCQkJCSAgICZjdHgtPmRpcl9pbmZvKTsKKwkJaWYgKHJldHZhbCkgeworCQkJY3R4LT5kaXJfaW5mb19zaXplIC09IDEwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBOb3JtYWxseSwgYWRkX2Rpcl9pbmZvIGlzIGNhbGxlZCB3aXRoIGVhY2ggaW5vZGUgaW4KKwkgKiBzZXF1ZW50aWFsIG9yZGVyOyBidXQgb25jZSBpbiBhIHdoaWxlIChsaWtlIHdoZW4gcGFzcyAzCisJICogbmVlZHMgdG8gcmVjcmVhdGUgdGhlIHJvb3QgZGlyZWN0b3J5IG9yIGxvc3QrZm91bmQKKwkgKiBkaXJlY3RvcnkpIGl0IGlzIGNhbGxlZCBvdXQgb2Ygb3JkZXIuICBJbiB0aG9zZSBjYXNlcywgd2UKKwkgKiBuZWVkIHRvIG1vdmUgdGhlIGRpcl9pbmZvIGVudHJpZXMgZG93biB0byBtYWtlIHJvb20sIHNpbmNlCisJICogdGhlIGRpcl9pbmZvIGFycmF5IG5lZWRzIHRvIGJlIHNvcnRlZCBieSBpbm9kZSBudW1iZXIgZm9yCisJICogZ2V0X2Rpcl9pbmZvKCkncyBzYWtlLgorCSAqLworCWlmIChjdHgtPmRpcl9pbmZvX2NvdW50ICYmCisJICAgIGN0eC0+ZGlyX2luZm9bY3R4LT5kaXJfaW5mb19jb3VudC0xXS5pbm8gPj0gaW5vKSB7CisJCWZvciAoaSA9IGN0eC0+ZGlyX2luZm9fY291bnQtMTsgaSA+IDA7IGktLSkKKwkJCWlmIChjdHgtPmRpcl9pbmZvW2ktMV0uaW5vIDwgaW5vKQorCQkJCWJyZWFrOworCQlkaXIgPSAmY3R4LT5kaXJfaW5mb1tpXTsKKwkJaWYgKGRpci0+aW5vICE9IGlubykKKwkJCWZvciAoaiA9IGN0eC0+ZGlyX2luZm9fY291bnQrKzsgaiA+IGk7IGotLSkKKwkJCQljdHgtPmRpcl9pbmZvW2pdID0gY3R4LT5kaXJfaW5mb1tqLTFdOworCX0gZWxzZQorCQlkaXIgPSAmY3R4LT5kaXJfaW5mb1tjdHgtPmRpcl9pbmZvX2NvdW50KytdOworCisJZGlyLT5pbm8gPSBpbm87CisJZGlyLT5kb3Rkb3QgPSBwYXJlbnQ7CisJZGlyLT5wYXJlbnQgPSBwYXJlbnQ7Cit9CisKKy8qCisgKiBnZXRfZGlyX2luZm8oKSAtLS0gZ2l2ZW4gYW4gaW5vZGUgbnVtYmVyLCB0cnkgdG8gZmluZCB0aGUgZGlyZWN0b3J5CisgKiBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlyX2luZm8gKmUyZnNja19nZXRfZGlyX2luZm8oZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubykKK3sKKwlpbnQgICAgIGxvdywgaGlnaCwgbWlkOworCisJbG93ID0gMDsKKwloaWdoID0gY3R4LT5kaXJfaW5mb19jb3VudC0xOworCWlmICghY3R4LT5kaXJfaW5mbykKKwkJcmV0dXJuIDA7CisJaWYgKGlubyA9PSBjdHgtPmRpcl9pbmZvW2xvd10uaW5vKQorCQlyZXR1cm4gJmN0eC0+ZGlyX2luZm9bbG93XTsKKwlpZiAgKGlubyA9PSBjdHgtPmRpcl9pbmZvW2hpZ2hdLmlubykKKwkJcmV0dXJuICZjdHgtPmRpcl9pbmZvW2hpZ2hdOworCisJd2hpbGUgKGxvdyA8IGhpZ2gpIHsKKwkJbWlkID0gKGxvdytoaWdoKS8yOworCQlpZiAobWlkID09IGxvdyB8fCBtaWQgPT0gaGlnaCkKKwkJCWJyZWFrOworCQlpZiAoaW5vID09IGN0eC0+ZGlyX2luZm9bbWlkXS5pbm8pCisJCQlyZXR1cm4gJmN0eC0+ZGlyX2luZm9bbWlkXTsKKwkJaWYgKGlubyA8IGN0eC0+ZGlyX2luZm9bbWlkXS5pbm8pCisJCQloaWdoID0gbWlkOworCQllbHNlCisJCQlsb3cgPSBtaWQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnJlZSB0aGUgZGlyX2luZm8gc3RydWN0dXJlIHdoZW4gaXQgaXNuJ3QgbmVlZGVkIGFueSBtb3JlLgorICovCitzdGF0aWMgdm9pZCBlMmZzY2tfZnJlZV9kaXJfaW5mbyhlMmZzY2tfdCBjdHgpCit7CisJZXh0MmZzX2ZyZWVfbWVtKCZjdHgtPmRpcl9pbmZvKTsKKwljdHgtPmRpcl9pbmZvX3NpemUgPSAwOworCWN0eC0+ZGlyX2luZm9fY291bnQgPSAwOworfQorCisvKgorICogUmV0dXJuIHRoZSBjb3VudCBvZiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgaW4gdGhlIGRpcl9pbmZvIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW50IGUyZnNja19nZXRfbnVtX2RpcmluZm8oZTJmc2NrX3QgY3R4KQoreworCXJldHVybiBjdHgtPmRpcl9pbmZvX2NvdW50OworfQorCisvKgorICogQSBzaW1wbGUgaW50ZXJhdG9yIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlyX2luZm8gKmUyZnNja19kaXJfaW5mb19pdGVyKGUyZnNja190IGN0eCwgaW50ICpjb250cm9sKQoreworCWlmICgqY29udHJvbCA+PSBjdHgtPmRpcl9pbmZvX2NvdW50KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjdHgtPmRpcl9pbmZvICsgKCpjb250cm9sKSsrOworfQorCisvKgorICogZGlyaW5mby5jIC0tLSBtYWludGFpbnMgdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiB0YWJsZSBmb3IgZTJmc2NrLgorICoKKyAqLworCisjaWZkZWYgRU5BQkxFX0hUUkVFCisKKy8qCisgKiBUaGlzIHN1YnJvdXRpbmUgaXMgY2FsbGVkIGR1cmluZyBwYXNzMSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgaW5mbworICogZW50cnkuICBEdXJpbmcgcGFzczEsIHRoZSBwYXNzZWQtaW4gcGFyZW50IGlzIDA7IGl0IHdpbGwgZ2V0IGZpbGxlZAorICogaW4gZHVyaW5nIHBhc3MyLgorICovCitzdGF0aWMgdm9pZCBlMmZzY2tfYWRkX2R4X2RpcihlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLCBpbnQgbnVtX2Jsb2NrcykKK3sKKwlzdHJ1Y3QgZHhfZGlyX2luZm8gKmRpcjsKKwlpbnQgICAgICAgICAgICAgaSwgajsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgICBvbGRfc2l6ZTsKKworCWlmICghY3R4LT5keF9kaXJfaW5mbykgeworCQljdHgtPmR4X2Rpcl9pbmZvX2NvdW50ID0gMDsKKwkJY3R4LT5keF9kaXJfaW5mb19zaXplID0gMTAwOyAvKiBHdWVzcyAqLworCQljdHgtPmR4X2Rpcl9pbmZvICA9IChzdHJ1Y3QgZHhfZGlyX2luZm8gKikKKwkJCWUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBjdHgtPmR4X2Rpcl9pbmZvX3NpemUKKwkJCQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZHhfZGlyX2luZm8pLAorCQkJCQkgICAgICAgImRpcmVjdG9yeSBtYXAiKTsKKwl9CisKKwlpZiAoY3R4LT5keF9kaXJfaW5mb19jb3VudCA+PSBjdHgtPmR4X2Rpcl9pbmZvX3NpemUpIHsKKwkJb2xkX3NpemUgPSBjdHgtPmR4X2Rpcl9pbmZvX3NpemUgKiBzaXplb2Yoc3RydWN0IGR4X2Rpcl9pbmZvKTsKKwkJY3R4LT5keF9kaXJfaW5mb19zaXplICs9IDEwOworCQlyZXR2YWwgPSBleHQyZnNfcmVzaXplX21lbShvbGRfc2l6ZSwgY3R4LT5keF9kaXJfaW5mb19zaXplICoKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBkeF9kaXJfaW5mbyksCisJCQkJCSAgICZjdHgtPmR4X2Rpcl9pbmZvKTsKKwkJaWYgKHJldHZhbCkgeworCQkJY3R4LT5keF9kaXJfaW5mb19zaXplIC09IDEwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBOb3JtYWxseSwgYWRkX2R4X2Rpcl9pbmZvIGlzIGNhbGxlZCB3aXRoIGVhY2ggaW5vZGUgaW4KKwkgKiBzZXF1ZW50aWFsIG9yZGVyOyBidXQgb25jZSBpbiBhIHdoaWxlIChsaWtlIHdoZW4gcGFzcyAzCisJICogbmVlZHMgdG8gcmVjcmVhdGUgdGhlIHJvb3QgZGlyZWN0b3J5IG9yIGxvc3QrZm91bmQKKwkgKiBkaXJlY3RvcnkpIGl0IGlzIGNhbGxlZCBvdXQgb2Ygb3JkZXIuICBJbiB0aG9zZSBjYXNlcywgd2UKKwkgKiBuZWVkIHRvIG1vdmUgdGhlIGR4X2Rpcl9pbmZvIGVudHJpZXMgZG93biB0byBtYWtlIHJvb20sIHNpbmNlCisJICogdGhlIGR4X2Rpcl9pbmZvIGFycmF5IG5lZWRzIHRvIGJlIHNvcnRlZCBieSBpbm9kZSBudW1iZXIgZm9yCisJICogZ2V0X2R4X2Rpcl9pbmZvKCkncyBzYWtlLgorCSAqLworCWlmIChjdHgtPmR4X2Rpcl9pbmZvX2NvdW50ICYmCisJICAgIGN0eC0+ZHhfZGlyX2luZm9bY3R4LT5keF9kaXJfaW5mb19jb3VudC0xXS5pbm8gPj0gaW5vKSB7CisJCWZvciAoaSA9IGN0eC0+ZHhfZGlyX2luZm9fY291bnQtMTsgaSA+IDA7IGktLSkKKwkJCWlmIChjdHgtPmR4X2Rpcl9pbmZvW2ktMV0uaW5vIDwgaW5vKQorCQkJCWJyZWFrOworCQlkaXIgPSAmY3R4LT5keF9kaXJfaW5mb1tpXTsKKwkJaWYgKGRpci0+aW5vICE9IGlubykKKwkJCWZvciAoaiA9IGN0eC0+ZHhfZGlyX2luZm9fY291bnQrKzsgaiA+IGk7IGotLSkKKwkJCQljdHgtPmR4X2Rpcl9pbmZvW2pdID0gY3R4LT5keF9kaXJfaW5mb1tqLTFdOworCX0gZWxzZQorCQlkaXIgPSAmY3R4LT5keF9kaXJfaW5mb1tjdHgtPmR4X2Rpcl9pbmZvX2NvdW50KytdOworCisJZGlyLT5pbm8gPSBpbm87CisJZGlyLT5udW1ibG9ja3MgPSBudW1fYmxvY2tzOworCWRpci0+aGFzaHZlcnNpb24gPSAwOworCWRpci0+ZHhfYmxvY2sgPSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgbnVtX2Jsb2NrcworCQkJCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGR4X2RpcmJsb2NrX2luZm8pLAorCQkJCSAgICAgICAiZHhfYmxvY2sgaW5mbyBhcnJheSIpOworfQorCisvKgorICogZ2V0X2R4X2Rpcl9pbmZvKCkgLS0tIGdpdmVuIGFuIGlub2RlIG51bWJlciwgdHJ5IHRvIGZpbmQgdGhlIGRpcmVjdG9yeQorICogaW5mb3JtYXRpb24gZW50cnkgZm9yIGl0LgorICovCitzdGF0aWMgc3RydWN0IGR4X2Rpcl9pbmZvICplMmZzY2tfZ2V0X2R4X2Rpcl9pbmZvKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8pCit7CisJaW50ICAgICBsb3csIGhpZ2gsIG1pZDsKKworCWxvdyA9IDA7CisJaGlnaCA9IGN0eC0+ZHhfZGlyX2luZm9fY291bnQtMTsKKwlpZiAoIWN0eC0+ZHhfZGlyX2luZm8pCisJCXJldHVybiAwOworCWlmIChpbm8gPT0gY3R4LT5keF9kaXJfaW5mb1tsb3ddLmlubykKKwkJcmV0dXJuICZjdHgtPmR4X2Rpcl9pbmZvW2xvd107CisJaWYgIChpbm8gPT0gY3R4LT5keF9kaXJfaW5mb1toaWdoXS5pbm8pCisJCXJldHVybiAmY3R4LT5keF9kaXJfaW5mb1toaWdoXTsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCW1pZCA9IChsb3craGlnaCkvMjsKKwkJaWYgKG1pZCA9PSBsb3cgfHwgbWlkID09IGhpZ2gpCisJCQlicmVhazsKKwkJaWYgKGlubyA9PSBjdHgtPmR4X2Rpcl9pbmZvW21pZF0uaW5vKQorCQkJcmV0dXJuICZjdHgtPmR4X2Rpcl9pbmZvW21pZF07CisJCWlmIChpbm8gPCBjdHgtPmR4X2Rpcl9pbmZvW21pZF0uaW5vKQorCQkJaGlnaCA9IG1pZDsKKwkJZWxzZQorCQkJbG93ID0gbWlkOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgdGhlIGR4X2Rpcl9pbmZvIHN0cnVjdHVyZSB3aGVuIGl0IGlzbid0IG5lZWRlZCBhbnkgbW9yZS4KKyAqLworc3RhdGljIHZvaWQgZTJmc2NrX2ZyZWVfZHhfZGlyX2luZm8oZTJmc2NrX3QgY3R4KQoreworCWludCAgICAgaTsKKwlzdHJ1Y3QgZHhfZGlyX2luZm8gKmRpcjsKKworCWlmIChjdHgtPmR4X2Rpcl9pbmZvKSB7CisJCWRpciA9IGN0eC0+ZHhfZGlyX2luZm87CisJCWZvciAoaT0wOyBpIDwgY3R4LT5keF9kaXJfaW5mb19jb3VudDsgaSsrKSB7CisJCQlleHQyZnNfZnJlZV9tZW0oJmRpci0+ZHhfYmxvY2spOworCQl9CisJCWV4dDJmc19mcmVlX21lbSgmY3R4LT5keF9kaXJfaW5mbyk7CisJfQorCWN0eC0+ZHhfZGlyX2luZm9fc2l6ZSA9IDA7CisJY3R4LT5keF9kaXJfaW5mb19jb3VudCA9IDA7Cit9CisKKy8qCisgKiBBIHNpbXBsZSBpbnRlcmF0b3IgZnVuY3Rpb24KKyAqLworc3RhdGljIHN0cnVjdCBkeF9kaXJfaW5mbyAqZTJmc2NrX2R4X2Rpcl9pbmZvX2l0ZXIoZTJmc2NrX3QgY3R4LCBpbnQgKmNvbnRyb2wpCit7CisJaWYgKCpjb250cm9sID49IGN0eC0+ZHhfZGlyX2luZm9fY291bnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGN0eC0+ZHhfZGlyX2luZm8gKyAoKmNvbnRyb2wpKys7Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfSFRSRUUgKi8KKy8qCisgKiBlMmZzY2suYyAtIGEgY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgdGhlIG5ldyBleHRlbmRlZCBmaWxlIHN5c3RlbS4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuIGUyZnNjayBjb250ZXh0CisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX2FsbG9jYXRlX2NvbnRleHQoZTJmc2NrX3QgKnJldCkKK3sKKwllMmZzY2tfdCAgICAgICAgY29udGV4dDsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBlMmZzY2tfc3RydWN0KSwgJmNvbnRleHQpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKHN0cnVjdCBlMmZzY2tfc3RydWN0KSk7CisKKwljb250ZXh0LT5wcm9jZXNzX2lub2RlX3NpemUgPSAyNTY7CisJY29udGV4dC0+ZXh0X2F0dHJfdmVyID0gMjsKKworCSpyZXQgPSBjb250ZXh0OworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZWFfcmVmY291bnRfZWwgeworCWJsa190ICAgZWFfYmxrOworCWludCAgICAgZWFfY291bnQ7Cit9OworCitzdHJ1Y3QgZWFfcmVmY291bnQgeworCWJsa190ICAgICAgICAgICBjb3VudDsKKwlibGtfdCAgICAgICAgICAgc2l6ZTsKKwlibGtfdCAgICAgICAgICAgY3Vyc29yOworCXN0cnVjdCBlYV9yZWZjb3VudF9lbCAgICpsaXN0OworfTsKKworc3RhdGljIHZvaWQgZWFfcmVmY291bnRfZnJlZShleHQyX3JlZmNvdW50X3QgcmVmY291bnQpCit7CisJaWYgKCFyZWZjb3VudCkKKwkJcmV0dXJuOworCisJZXh0MmZzX2ZyZWVfbWVtKCZyZWZjb3VudC0+bGlzdCk7CisJZXh0MmZzX2ZyZWVfbWVtKCZyZWZjb3VudCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBhbiBlMmZzY2sgY29udGV4dDsgaXQgaXMgY2FsbGVkIHdoZW4gZTJmc2NrCisgKiBuZWVkcyB0byBiZSByZXN0YXJ0ZWQuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX3Jlc2V0X2NvbnRleHQoZTJmc2NrX3QgY3R4KQoreworCWN0eC0+ZmxhZ3MgPSAwOworCWN0eC0+bG9zdF9hbmRfZm91bmQgPSAwOworCWN0eC0+YmFkX2xvc3RfYW5kX2ZvdW5kID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCk7CisJY3R4LT5pbm9kZV91c2VkX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCk7CisJY3R4LT5pbm9kZV9kaXJfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9yZWdfbWFwKTsKKwljdHgtPmlub2RlX3JlZ19tYXAgPSAwOworCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCk7CisJY3R4LT5ibG9ja19mb3VuZF9tYXAgPSAwOworCWV4dDJmc19mcmVlX2ljb3VudChjdHgtPmlub2RlX2xpbmtfaW5mbyk7CisJY3R4LT5pbm9kZV9saW5rX2luZm8gPSAwOworCWlmIChjdHgtPmpvdXJuYWxfaW8pIHsKKwkJaWYgKGN0eC0+ZnMgJiYgY3R4LT5mcy0+aW8gIT0gY3R4LT5qb3VybmFsX2lvKQorCQkJaW9fY2hhbm5lbF9jbG9zZShjdHgtPmpvdXJuYWxfaW8pOworCQljdHgtPmpvdXJuYWxfaW8gPSAwOworCX0KKwlpZiAoY3R4LT5mcykgeworCQlleHQyZnNfZnJlZV9kYmxpc3QoY3R4LT5mcy0+ZGJsaXN0KTsKKwkJY3R4LT5mcy0+ZGJsaXN0ID0gMDsKKwl9CisJZTJmc2NrX2ZyZWVfZGlyX2luZm8oY3R4KTsKKyNpZmRlZiBFTkFCTEVfSFRSRUUKKwllMmZzY2tfZnJlZV9keF9kaXJfaW5mbyhjdHgpOworI2VuZGlmCisJZWFfcmVmY291bnRfZnJlZShjdHgtPnJlZmNvdW50KTsKKwljdHgtPnJlZmNvdW50ID0gMDsKKwllYV9yZWZjb3VudF9mcmVlKGN0eC0+cmVmY291bnRfZXh0cmEpOworCWN0eC0+cmVmY291bnRfZXh0cmEgPSAwOworCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2R1cF9tYXApOworCWN0eC0+YmxvY2tfZHVwX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZWFfbWFwKTsKKwljdHgtPmJsb2NrX2VhX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfYmFkX21hcCk7CisJY3R4LT5pbm9kZV9iYWRfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9pbWFnaWNfbWFwKTsKKwljdHgtPmlub2RlX2ltYWdpY19tYXAgPSAwOworCWV4dDJmc191MzJfbGlzdF9mcmVlKGN0eC0+ZGlyc190b19oYXNoKTsKKwljdHgtPmRpcnNfdG9faGFzaCA9IDA7CisKKwkvKgorCSAqIENsZWFyIHRoZSBhcnJheSBvZiBpbnZhbGlkIG1ldGEtZGF0YSBmbGFncworCSAqLworCWV4dDJmc19mcmVlX21lbSgmY3R4LT5pbnZhbGlkX2lub2RlX2JpdG1hcF9mbGFnKTsKKwlleHQyZnNfZnJlZV9tZW0oJmN0eC0+aW52YWxpZF9ibG9ja19iaXRtYXBfZmxhZyk7CisJZXh0MmZzX2ZyZWVfbWVtKCZjdHgtPmludmFsaWRfaW5vZGVfdGFibGVfZmxhZyk7CisKKwkvKiBDbGVhciBzdGF0aXN0aWMgY291bnRlcnMgKi8KKwljdHgtPmZzX2RpcmVjdG9yeV9jb3VudCA9IDA7CisJY3R4LT5mc19yZWd1bGFyX2NvdW50ID0gMDsKKwljdHgtPmZzX2Jsb2NrZGV2X2NvdW50ID0gMDsKKwljdHgtPmZzX2NoYXJkZXZfY291bnQgPSAwOworCWN0eC0+ZnNfbGlua3NfY291bnQgPSAwOworCWN0eC0+ZnNfc3ltbGlua3NfY291bnQgPSAwOworCWN0eC0+ZnNfZmFzdF9zeW1saW5rc19jb3VudCA9IDA7CisJY3R4LT5mc19maWZvX2NvdW50ID0gMDsKKwljdHgtPmZzX3RvdGFsX2NvdW50ID0gMDsKKwljdHgtPmZzX3NvY2tldHNfY291bnQgPSAwOworCWN0eC0+ZnNfaW5kX2NvdW50ID0gMDsKKwljdHgtPmZzX2RpbmRfY291bnQgPSAwOworCWN0eC0+ZnNfdGluZF9jb3VudCA9IDA7CisJY3R4LT5mc19mcmFnbWVudGVkID0gMDsKKwljdHgtPmxhcmdlX2ZpbGVzID0gMDsKKworCS8qIFJlc2V0IHRoZSBzdXBlcmJsb2NrIHRvIHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHZhbHVlICovCisJY3R4LT5zdXBlcmJsb2NrID0gY3R4LT51c2Vfc3VwZXJibG9jazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlMmZzY2tfZnJlZV9jb250ZXh0KGUyZnNja190IGN0eCkKK3sKKwlpZiAoIWN0eCkKKwkJcmV0dXJuOworCisJZTJmc2NrX3Jlc2V0X2NvbnRleHQoY3R4KTsKKwlpZiAoY3R4LT5ibGtpZCkKKwkJYmxraWRfcHV0X2NhY2hlKGN0eC0+YmxraWQpOworCisJZXh0MmZzX2ZyZWVfbWVtKCZjdHgpOworfQorCisvKgorICogZWFfcmVmY291bnQuYworICovCisKKy8qCisgKiBUaGUgc3RyYXRlZ3kgd2UgdXNlIGZvciBrZWVwaW5nIHRyYWNrIG9mIEVBIHJlZmNvdW50cyBpcyBhcworICogZm9sbG93cy4gIFdlIGtlZXAgYSBzb3J0ZWQgYXJyYXkgb2YgZmlyc3QgRUEgYmxvY2tzIGFuZCBpdHMKKyAqIHJlZmVyZW5jZSBjb3VudHMuICBPbmNlIHRoZSByZWZjb3VudCBoYXMgZHJvcHBlZCB0byB6ZXJvLCBpdCBpcworICogcmVtb3ZlZCBmcm9tIHRoZSBhcnJheSB0byBzYXZlIG1lbW9yeSBzcGFjZS4gIE9uY2UgdGhlIEVBIGJsb2NrIGlzCisgKiBjaGVja2VkLCBpdHMgYml0IGlzIHNldCBpbiB0aGUgYmxvY2tfZWFfbWFwIGJpdG1hcC4KKyAqLworCisKK3N0YXRpYyBlcnJjb2RlX3QgZWFfcmVmY291bnRfY3JlYXRlKGludCBzaXplLCBleHQyX3JlZmNvdW50X3QgKnJldCkKK3sKKwlleHQyX3JlZmNvdW50X3QgcmVmY291bnQ7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlzaXplX3QgICAgICAgICAgYnl0ZXM7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGVhX3JlZmNvdW50KSwgJnJlZmNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChyZWZjb3VudCwgMCwgc2l6ZW9mKHN0cnVjdCBlYV9yZWZjb3VudCkpOworCisJaWYgKCFzaXplKQorCQlzaXplID0gNTAwOworCXJlZmNvdW50LT5zaXplID0gc2l6ZTsKKwlieXRlcyA9IChzaXplX3QpIChzaXplICogc2l6ZW9mKHN0cnVjdCBlYV9yZWZjb3VudF9lbCkpOworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJSZWZjb3VudCBhbGxvY2F0ZWQgJWQgZW50cmllcywgJWQgYnl0ZXMuXG4iLAorCSAgICAgICByZWZjb3VudC0+c2l6ZSwgYnl0ZXMpOworI2VuZGlmCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oYnl0ZXMsICZyZWZjb3VudC0+bGlzdCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJbWVtc2V0KHJlZmNvdW50LT5saXN0LCAwLCBieXRlcyk7CisKKwlyZWZjb3VudC0+Y291bnQgPSAwOworCXJlZmNvdW50LT5jdXJzb3IgPSAwOworCisJKnJldCA9IHJlZmNvdW50OworCXJldHVybiAwOworCitlcnJvdXQ6CisJZWFfcmVmY291bnRfZnJlZShyZWZjb3VudCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGNvbGxhcHNlX3JlZmNvdW50KCkgLS0tIGdvIHRocm91Z2ggdGhlIHJlZmNvdW50IGFycmF5LCBhbmQgZ2V0IHJpZAorICogb2YgYW55IGNvdW50ID09IHplcm8gZW50cmllcworICovCitzdGF0aWMgdm9pZCByZWZjb3VudF9jb2xsYXBzZShleHQyX3JlZmNvdW50X3QgcmVmY291bnQpCit7CisJdW5zaWduZWQgaW50ICAgIGksIGo7CisJc3RydWN0IGVhX3JlZmNvdW50X2VsICAgKmxpc3Q7CisKKwlsaXN0ID0gcmVmY291bnQtPmxpc3Q7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCByZWZjb3VudC0+Y291bnQ7IGkrKykgeworCQlpZiAobGlzdFtpXS5lYV9jb3VudCkgeworCQkJaWYgKGkgIT0gaikKKwkJCQlsaXN0W2pdID0gbGlzdFtpXTsKKwkJCWorKzsKKwkJfQorCX0KKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFRFU1RfUFJPR1JBTSkKKwlwcmludGYoIlJlZmNvdW50X2NvbGxhcHNlOiBzaXplIHdhcyAlZCwgbm93ICVkXG4iLAorCSAgICAgICByZWZjb3VudC0+Y291bnQsIGopOworI2VuZGlmCisJcmVmY291bnQtPmNvdW50ID0gajsKK30KKworCisvKgorICogaW5zZXJ0X3JlZmNvdW50X2VsKCkgLS0tIEluc2VydCBhIG5ldyBlbnRyeSBpbnRvIHRoZSBzb3J0ZWQgbGlzdCBhdCBhCisgKiAgICAgIHNwZWNpZmllZCBwb3NpdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBlYV9yZWZjb3VudF9lbCAqaW5zZXJ0X3JlZmNvdW50X2VsKGV4dDJfcmVmY291bnRfdCByZWZjb3VudCwKKwkJCQkJCSBibGtfdCBibGssIGludCBwb3MpCit7CisJc3RydWN0IGVhX3JlZmNvdW50X2VsICAgKmVsOworCWVycmNvZGVfdCAgICAgICAgICAgICAgIHJldHZhbDsKKwlibGtfdCAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IDA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbnVtOworCisJaWYgKHJlZmNvdW50LT5jb3VudCA+PSByZWZjb3VudC0+c2l6ZSkgeworCQluZXdfc2l6ZSA9IHJlZmNvdW50LT5zaXplICsgMTAwOworI2lmZGVmIERFQlVHCisJCXByaW50ZigiUmVhbGxvY2F0aW5nIHJlZmNvdW50ICVkIGVudHJpZXMuLi5cbiIsIG5ld19zaXplKTsKKyNlbmRpZgorCQlyZXR2YWwgPSBleHQyZnNfcmVzaXplX21lbSgoc2l6ZV90KSByZWZjb3VudC0+c2l6ZSAqCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZWFfcmVmY291bnRfZWwpLAorCQkJCQkgICAoc2l6ZV90KSBuZXdfc2l6ZSAqCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZWFfcmVmY291bnRfZWwpLAorCQkJCQkgICAmcmVmY291bnQtPmxpc3QpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIDA7CisJCXJlZmNvdW50LT5zaXplID0gbmV3X3NpemU7CisJfQorCW51bSA9IChpbnQpIHJlZmNvdW50LT5jb3VudCAtIHBvczsKKwlpZiAobnVtIDwgMCkKKwkJcmV0dXJuIDA7ICAgICAgIC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlpZiAobnVtKSB7CisJCW1lbW1vdmUoJnJlZmNvdW50LT5saXN0W3BvcysxXSwgJnJlZmNvdW50LT5saXN0W3Bvc10sCisJCQlzaXplb2Yoc3RydWN0IGVhX3JlZmNvdW50X2VsKSAqIG51bSk7CisJfQorCXJlZmNvdW50LT5jb3VudCsrOworCWVsID0gJnJlZmNvdW50LT5saXN0W3Bvc107CisJZWwtPmVhX2NvdW50ID0gMDsKKwllbC0+ZWFfYmxrID0gYmxrOworCXJldHVybiBlbDsKK30KKworCisvKgorICogZ2V0X3JlZmNvdW50X2VsKCkgLS0tIGdpdmVuIGFuIGJsb2NrIG51bWJlciwgdHJ5IHRvIGZpbmQgcmVmY291bnQKKyAqICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIHNvcnRlZCBsaXN0LiAgSWYgdGhlIGNyZWF0ZSBmbGFnIGlzIHNldCwKKyAqICAgICAgYW5kIHdlIGNhbid0IGZpbmQgYW4gZW50cnksIGNyZWF0ZSBvbmUgaW4gdGhlIHNvcnRlZCBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IGVhX3JlZmNvdW50X2VsICpnZXRfcmVmY291bnRfZWwoZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50LAorCQkJCQkgICAgICBibGtfdCBibGssIGludCBjcmVhdGUpCit7CisJZmxvYXQgICByYW5nZTsKKwlpbnQgICAgIGxvdywgaGlnaCwgbWlkOworCWJsa190ICAgbG93dmFsLCBoaWdodmFsOworCisJaWYgKCFyZWZjb3VudCB8fCAhcmVmY291bnQtPmxpc3QpCisJCXJldHVybiAwOworcmV0cnk6CisJbG93ID0gMDsKKwloaWdoID0gKGludCkgcmVmY291bnQtPmNvdW50LTE7CisJaWYgKGNyZWF0ZSAmJiAoKHJlZmNvdW50LT5jb3VudCA9PSAwKSB8fAorCQkgICAgICAgKGJsayA+IHJlZmNvdW50LT5saXN0W2hpZ2hdLmVhX2JsaykpKSB7CisJCWlmIChyZWZjb3VudC0+Y291bnQgPj0gcmVmY291bnQtPnNpemUpCisJCQlyZWZjb3VudF9jb2xsYXBzZShyZWZjb3VudCk7CisKKwkJcmV0dXJuIGluc2VydF9yZWZjb3VudF9lbChyZWZjb3VudCwgYmxrLAorCQkJCQkgICh1bnNpZ25lZCkgcmVmY291bnQtPmNvdW50KTsKKwl9CisJaWYgKHJlZmNvdW50LT5jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChyZWZjb3VudC0+Y3Vyc29yID49IHJlZmNvdW50LT5jb3VudCkKKwkJcmVmY291bnQtPmN1cnNvciA9IDA7CisJaWYgKGJsayA9PSByZWZjb3VudC0+bGlzdFtyZWZjb3VudC0+Y3Vyc29yXS5lYV9ibGspCisJCXJldHVybiAmcmVmY291bnQtPmxpc3RbcmVmY291bnQtPmN1cnNvcisrXTsKKyNpZmRlZiBERUJVRworCXByaW50ZigiTm9uLWN1cnNvciBnZXRfcmVmY291bnRfZWw6ICV1XG4iLCBibGspOworI2VuZGlmCisJd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisJCWlmIChsb3cgPT0gaGlnaCkKKwkJCW1pZCA9IGxvdzsKKwkJZWxzZSB7CisJCQkvKiBJbnRlcnBvbGF0ZSBmb3IgZWZmaWNpZW5jeSAqLworCQkJbG93dmFsID0gcmVmY291bnQtPmxpc3RbbG93XS5lYV9ibGs7CisJCQloaWdodmFsID0gcmVmY291bnQtPmxpc3RbaGlnaF0uZWFfYmxrOworCisJCQlpZiAoYmxrIDwgbG93dmFsKQorCQkJCXJhbmdlID0gMDsKKwkJCWVsc2UgaWYgKGJsayA+IGhpZ2h2YWwpCisJCQkJcmFuZ2UgPSAxOworCQkJZWxzZQorCQkJCXJhbmdlID0gKChmbG9hdCkgKGJsayAtIGxvd3ZhbCkpIC8KKwkJCQkJKGhpZ2h2YWwgLSBsb3d2YWwpOworCQkJbWlkID0gbG93ICsgKChpbnQpIChyYW5nZSAqIChoaWdoLWxvdykpKTsKKwkJfQorCisJCWlmIChibGsgPT0gcmVmY291bnQtPmxpc3RbbWlkXS5lYV9ibGspIHsKKwkJCXJlZmNvdW50LT5jdXJzb3IgPSBtaWQrMTsKKwkJCXJldHVybiAmcmVmY291bnQtPmxpc3RbbWlkXTsKKwkJfQorCQlpZiAoYmxrIDwgcmVmY291bnQtPmxpc3RbbWlkXS5lYV9ibGspCisJCQloaWdoID0gbWlkLTE7CisJCWVsc2UKKwkJCWxvdyA9IG1pZCsxOworCX0KKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5LCBpdCBzaG91bGQgYmUgcmlnaHQgYXQKKwkgKiBsb3cgKHdoZXJlIGhpZ2ggd2lsbCBiZSBsZWZ0IGF0IGxvdy0xKS4KKwkgKi8KKwlpZiAoY3JlYXRlKSB7CisJCWlmIChyZWZjb3VudC0+Y291bnQgPj0gcmVmY291bnQtPnNpemUpIHsKKwkJCXJlZmNvdW50X2NvbGxhcHNlKHJlZmNvdW50KTsKKwkJCWlmIChyZWZjb3VudC0+Y291bnQgPCByZWZjb3VudC0+c2l6ZSkKKwkJCQlnb3RvIHJldHJ5OworCQl9CisJCXJldHVybiBpbnNlcnRfcmVmY291bnRfZWwocmVmY291bnQsIGJsaywgbG93KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QKK2VhX3JlZmNvdW50X2luY3JlbWVudChleHQyX3JlZmNvdW50X3QgcmVmY291bnQsIGJsa190IGJsaywgaW50ICpyZXQpCit7CisJc3RydWN0IGVhX3JlZmNvdW50X2VsICAgKmVsOworCisJZWwgPSBnZXRfcmVmY291bnRfZWwocmVmY291bnQsIGJsaywgMSk7CisJaWYgKCFlbCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fTUVNT1JZOworCWVsLT5lYV9jb3VudCsrOworCisJaWYgKHJldCkKKwkJKnJldCA9IGVsLT5lYV9jb3VudDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdAorZWFfcmVmY291bnRfZGVjcmVtZW50KGV4dDJfcmVmY291bnRfdCByZWZjb3VudCwgYmxrX3QgYmxrLCBpbnQgKnJldCkKK3sKKwlzdHJ1Y3QgZWFfcmVmY291bnRfZWwgICAqZWw7CisKKwllbCA9IGdldF9yZWZjb3VudF9lbChyZWZjb3VudCwgYmxrLCAwKTsKKwlpZiAoIWVsIHx8IGVsLT5lYV9jb3VudCA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJZWwtPmVhX2NvdW50LS07CisKKwlpZiAocmV0KQorCQkqcmV0ID0gZWwtPmVhX2NvdW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90CitlYV9yZWZjb3VudF9zdG9yZShleHQyX3JlZmNvdW50X3QgcmVmY291bnQsIGJsa190IGJsaywgaW50IGNvdW50KQoreworCXN0cnVjdCBlYV9yZWZjb3VudF9lbCAgICplbDsKKworCS8qCisJICogR2V0IHRoZSByZWZjb3VudCBlbGVtZW50CisJICovCisJZWwgPSBnZXRfcmVmY291bnRfZWwocmVmY291bnQsIGJsaywgY291bnQgPyAxIDogMCk7CisJaWYgKCFlbCkKKwkJcmV0dXJuIGNvdW50ID8gRVhUMl9FVF9OT19NRU1PUlkgOiAwOworCWVsLT5lYV9jb3VudCA9IGNvdW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWFfcmVmY291bnRfaW50cl9iZWdpbihleHQyX3JlZmNvdW50X3QgcmVmY291bnQpCit7CisJcmVmY291bnQtPmN1cnNvciA9IDA7Cit9CisKKworc3RhdGljIGJsa190IGVhX3JlZmNvdW50X2ludHJfbmV4dChleHQyX3JlZmNvdW50X3QgcmVmY291bnQsIGludCAqcmV0KQoreworCXN0cnVjdCBlYV9yZWZjb3VudF9lbCAgICpsaXN0OworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHJlZmNvdW50LT5jdXJzb3IgPj0gcmVmY291bnQtPmNvdW50KQorCQkJcmV0dXJuIDA7CisJCWxpc3QgPSByZWZjb3VudC0+bGlzdDsKKwkJaWYgKGxpc3RbcmVmY291bnQtPmN1cnNvcl0uZWFfY291bnQpIHsKKwkJCWlmIChyZXQpCisJCQkJKnJldCA9IGxpc3RbcmVmY291bnQtPmN1cnNvcl0uZWFfY291bnQ7CisJCQlyZXR1cm4gbGlzdFtyZWZjb3VudC0+Y3Vyc29yKytdLmVhX2JsazsKKwkJfQorCQlyZWZjb3VudC0+Y3Vyc29yKys7CisJfQorfQorCisKKy8qCisgKiBlaGFuZGxlci5jIC0tLSBoYW5kbGUgYmFkIGJsb2NrIGVycm9ycyB3aGljaCBjb21lIHVwIGR1cmluZyB0aGUKKyAqICAgICAgY291cnNlIG9mIGFuIGUyZnNjayBzZXNzaW9uLgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKm9wZXJhdGlvbjsKKworc3RhdGljIGVycmNvZGVfdAorZTJmc2NrX2hhbmRsZV9yZWFkX2Vycm9yKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywgaW50IGNvdW50LAorCQkJIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgaW50IGFjdHVhbCBGU0NLX0FUVFIoKHVudXNlZCkpLCBlcnJjb2RlX3QgZXJyb3IpCit7CisJaW50ICAgICBpOworCWNoYXIgICAgKnA7CisJZXh0Ml9maWxzeXMgZnMgPSAoZXh0Ml9maWxzeXMpIGNoYW5uZWwtPmFwcF9kYXRhOworCWUyZnNja190IGN0eDsKKworCWN0eCA9IChlMmZzY2tfdCkgZnMtPnByaXZfZGF0YTsKKworCS8qCisJICogSWYgbW9yZSB0aGFuIG9uZSBibG9jayB3YXMgcmVhZCwgdHJ5IHJlYWRpbmcgZWFjaCBibG9jaworCSAqIHNlcGFyYXRlbHkuICBXZSBjb3VsZCB1c2UgdGhlIGFjdHVhbCBieXRlcyByZWFkIHRvIGZpZ3VyZQorCSAqIG91dCB3aGVyZSB0byBzdGFydCwgYnV0IHdlIGRvbid0IGJvdGhlci4KKwkgKi8KKwlpZiAoY291bnQgPiAxKSB7CisJCXAgPSAoY2hhciAqKSBkYXRhOworCQlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyssIHAgKz0gY2hhbm5lbC0+YmxvY2tfc2l6ZSwgYmxvY2srKykgeworCQkJZXJyb3IgPSBpb19jaGFubmVsX3JlYWRfYmxrKGNoYW5uZWwsIGJsb2NrLAorCQkJCQkJICAgIDEsIHApOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9wZXJhdGlvbikKKwkJcHJpbnRmKF8oIkVycm9yIHJlYWRpbmcgYmxvY2sgJWx1ICglcykgd2hpbGUgJXMuICAiKSwgYmxvY2ssCisJCSAgICAgICBlcnJvcl9tZXNzYWdlKGVycm9yKSwgb3BlcmF0aW9uKTsKKwllbHNlCisJCXByaW50ZihfKCJFcnJvciByZWFkaW5nIGJsb2NrICVsdSAoJXMpLiAgIiksIGJsb2NrLAorCQkgICAgICAgZXJyb3JfbWVzc2FnZShlcnJvcikpOworCXByZWVuaGFsdChjdHgpOworCWlmIChhc2soY3R4LCBfKCJJZ25vcmUgZXJyb3IiKSwgMSkpIHsKKwkJaWYgKGFzayhjdHgsIF8oIkZvcmNlIHJld3JpdGUiKSwgMSkpCisJCQlpb19jaGFubmVsX3dyaXRlX2JsayhjaGFubmVsLCBibG9jaywgMSwgZGF0YSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGVycmNvZGVfdAorZTJmc2NrX2hhbmRsZV93cml0ZV9lcnJvcihpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwKKwkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQlpbnQgYWN0dWFsIEZTQ0tfQVRUUigodW51c2VkKSksIGVycmNvZGVfdCBlcnJvcikKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwljb25zdCBjaGFyICAgICAgKnA7CisJZXh0Ml9maWxzeXMgZnMgPSAoZXh0Ml9maWxzeXMpIGNoYW5uZWwtPmFwcF9kYXRhOworCWUyZnNja190IGN0eDsKKworCWN0eCA9IChlMmZzY2tfdCkgZnMtPnByaXZfZGF0YTsKKworCS8qCisJICogSWYgbW9yZSB0aGFuIG9uZSBibG9jayB3YXMgd3JpdHRlbiwgdHJ5IHdyaXRpbmcgZWFjaCBibG9jaworCSAqIHNlcGFyYXRlbHkuICBXZSBjb3VsZCB1c2UgdGhlIGFjdHVhbCBieXRlcyByZWFkIHRvIGZpZ3VyZQorCSAqIG91dCB3aGVyZSB0byBzdGFydCwgYnV0IHdlIGRvbid0IGJvdGhlci4KKwkgKi8KKwlpZiAoY291bnQgPiAxKSB7CisJCXAgPSAoY29uc3QgY2hhciAqKSBkYXRhOworCQlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyssIHAgKz0gY2hhbm5lbC0+YmxvY2tfc2l6ZSwgYmxvY2srKykgeworCQkJZXJyb3IgPSBpb19jaGFubmVsX3dyaXRlX2JsayhjaGFubmVsLCBibG9jaywKKwkJCQkJCSAgICAgMSwgcCk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChvcGVyYXRpb24pCisJCXByaW50ZihfKCJFcnJvciB3cml0aW5nIGJsb2NrICVsdSAoJXMpIHdoaWxlICVzLiAgIiksIGJsb2NrLAorCQkgICAgICAgZXJyb3JfbWVzc2FnZShlcnJvciksIG9wZXJhdGlvbik7CisJZWxzZQorCQlwcmludGYoXygiRXJyb3Igd3JpdGluZyBibG9jayAlbHUgKCVzKS4gICIpLCBibG9jaywKKwkJICAgICAgIGVycm9yX21lc3NhZ2UoZXJyb3IpKTsKKwlwcmVlbmhhbHQoY3R4KTsKKwlpZiAoYXNrKGN0eCwgXygiSWdub3JlIGVycm9yIiksIDEpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmVoYW5kbGVyX29wZXJhdGlvbihjb25zdCBjaGFyICpvcCkKK3sKKwljb25zdCBjaGFyICpyZXQgPSBvcGVyYXRpb247CisKKwlvcGVyYXRpb24gPSBvcDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlaGFuZGxlcl9pbml0KGlvX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwljaGFubmVsLT5yZWFkX2Vycm9yID0gZTJmc2NrX2hhbmRsZV9yZWFkX2Vycm9yOworCWNoYW5uZWwtPndyaXRlX2Vycm9yID0gZTJmc2NrX2hhbmRsZV93cml0ZV9lcnJvcjsKK30KKworLyoKKyAqIGpvdXJuYWwuYyAtLS0gY29kZSBmb3IgaGFuZGxpbmcgdGhlICJleHQzIiBqb3VybmFsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJlYXMgRGlsZ2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgVGhlb2RvcmUgVHMnbworICoKKyAqIFBhcnRzIG9mIHRoZSBjb2RlIGFyZSBiYXNlZCBvbiBmcy9qZnMvam91cm5hbC5jIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZQorICogQ29weXJpZ2h0IChDKSAxOTk5IFJlZCBIYXQgU29mdHdhcmUKKyAqCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9yIGF0IHlvdXIgZGlzY3JldGlvbgorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIERlZmluZSBVU0VfSU5PREVfSU8gdG8gdXNlIHRoZSBpbm9kZV9pby5jIC8gZmlsZWlvLmMgY29kZXBhdGhzLgorICogVGhpcyBjcmVhdGVzIGEgbGFyZ2VyIHN0YXRpYyBiaW5hcnksIGFuZCBhIHNtYWxsZXIgYmluYXJ5IHVzaW5nCisgKiBzaGFyZWQgbGlicmFyaWVzLiAgSXQncyBhbHNvIHByb2JhYmx5IHNsaWdodGx5IGxlc3MgQ1BVLWVmZmljaWVudCwKKyAqIHdoaWNoIGlzIHdoeSBpdCdzIG5vdCBvbiBieSBkZWZhdWx0LiAgQnV0LCBpdCdzIGEgZ29vZCB3YXkgb2YKKyAqIHRlc3RpbmcgdGhlIGZ1bmN0aW9ucyBpbiBpbm9kZV9pby5jIGFuZCBmaWxlaW8uYy4KKyAqLworI3VuZGVmIFVTRV9JTk9ERV9JTworCisvKiBLZXJuZWwgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRoZSBqb3VybmFsLiAgVGhlc2UgYWxsb3cgdXMKKyAqIHRvIHVzZSB0aGUgcmVjb3ZlcnkuYyBmaWxlIHZpcnR1YWxseSB1bmNoYW5nZWQgZnJvbSB0aGUga2VybmVsLCBzbyB3ZQorICogZG9uJ3QgaGF2ZSB0byBkbyBtdWNoIHRvIGtlZXAga2VybmVsIGFuZCB1c2VyIHJlY292ZXJ5IGluIHN5bmMuCisgKi8KK3N0YXRpYyBpbnQgam91cm5hbF9ibWFwKGpvdXJuYWxfdCAqam91cm5hbCwgYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgKnBoeXMpCit7CisjaWZkZWYgVVNFX0lOT0RFX0lPCisJKnBoeXMgPSBibG9jazsKKwlyZXR1cm4gMDsKKyNlbHNlCisJc3RydWN0IGlub2RlICAgICppbm9kZSA9IGpvdXJuYWwtPmpfaW5vZGU7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlibGtfdCAgICAgICAgICAgcGJsazsKKworCWlmICghaW5vZGUpIHsKKwkJKnBoeXMgPSBibG9jazsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dmFsPSBleHQyZnNfYm1hcChpbm9kZS0+aV9jdHgtPmZzLCBpbm9kZS0+aV9pbm8sCisJCQkgICAgJmlub2RlLT5pX2V4dDIsIE5VTEwsIDAsIGJsb2NrLCAmcGJsayk7CisJKnBoeXMgPSBwYmxrOworCXJldHVybiByZXR2YWw7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqZ2V0YmxrKGtkZXZfdCBrZGV2LCBibGtfdCBibG9ja25yLCBpbnQgYmxvY2tzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwliaCA9IGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoa2Rldi0+a19jdHgsIHNpemVvZigqYmgpLCAiYmxvY2sgYnVmZmVyIik7CisJaWYgKCFiaCkKKwkJcmV0dXJuIE5VTEw7CisKKwliaC0+Yl9jdHggPSBrZGV2LT5rX2N0eDsKKwlpZiAoa2Rldi0+a19kZXYgPT0gS19ERVZfRlMpCisJCWJoLT5iX2lvID0ga2Rldi0+a19jdHgtPmZzLT5pbzsKKwllbHNlCisJCWJoLT5iX2lvID0ga2Rldi0+a19jdHgtPmpvdXJuYWxfaW87CisJYmgtPmJfc2l6ZSA9IGJsb2Nrc2l6ZTsKKwliaC0+Yl9ibG9ja25yID0gYmxvY2tucjsKKworCXJldHVybiBiaDsKK30KKworc3RhdGljIHZvaWQgc3luY19ibG9ja2RldihrZGV2X3Qga2RldikKK3sKKwlpb19jaGFubmVsICAgICAgaW87CisKKwlpZiAoa2Rldi0+a19kZXYgPT0gS19ERVZfRlMpCisJCWlvID0ga2Rldi0+a19jdHgtPmZzLT5pbzsKKwllbHNlCisJCWlvID0ga2Rldi0+a19jdHgtPmpvdXJuYWxfaW87CisKKwlpb19jaGFubmVsX2ZsdXNoKGlvKTsKK30KKworc3RhdGljIHZvaWQgbGxfcndfYmxvY2soaW50IHJ3LCBpbnQgbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhwW10pCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZm9yICg7IG5yID4gMDsgLS1ucikgeworCQliaCA9ICpiaHArKzsKKwkJaWYgKHJ3ID09IFJFQUQgJiYgIWJoLT5iX3VwdG9kYXRlKSB7CisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGJoLT5iX2lvLAorCQkJCQkJICAgICBiaC0+Yl9ibG9ja25yLAorCQkJCQkJICAgICAxLCBiaC0+Yl9kYXRhKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQliYl9lcnJvcl9tc2coIndoaWxlIHJlYWRpbmcgYmxvY2sgJWx1IiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIGJoLT5iX2Jsb2NrbnIpOworCQkJCWJoLT5iX2VyciA9IHJldHZhbDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJoLT5iX3VwdG9kYXRlID0gMTsKKwkJfSBlbHNlIGlmIChydyA9PSBXUklURSAmJiBiaC0+Yl9kaXJ0eSkgeworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoYmgtPmJfaW8sCisJCQkJCQkgICAgICBiaC0+Yl9ibG9ja25yLAorCQkJCQkJICAgICAgMSwgYmgtPmJfZGF0YSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJ3aGlsZSB3cml0aW5nIGJsb2NrICVsdSIsCisJCQkJCSh1bnNpZ25lZCBsb25nKSBiaC0+Yl9ibG9ja25yKTsKKwkJCQliaC0+Yl9lcnIgPSByZXR2YWw7CisJCQkJY29udGludWU7CisJCQl9CisJCQliaC0+Yl9kaXJ0eSA9IDA7CisJCQliaC0+Yl91cHRvZGF0ZSA9IDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfYnVmZmVyX2RpcnR5KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJYmgtPmJfZGlydHkgPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19idWZmZXJfY2xlYW4oc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisJYmgtPmJfZGlydHkgPSAwOworfQorCitzdGF0aWMgdm9pZCBicmVsc2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoYmgtPmJfZGlydHkpCisJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworCWV4dDJmc19mcmVlX21lbSgmYmgpOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl91cHRvZGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBiaC0+Yl91cHRvZGF0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hcmtfYnVmZmVyX3VwdG9kYXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB2YWwpCit7CisJYmgtPmJfdXB0b2RhdGUgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfb25fYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFiaC0+Yl91cHRvZGF0ZSkKKwkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKK30KKworCitzdGF0aWMgdm9pZCBlMmZzY2tfY2xlYXJfcmVjb3ZlcihlMmZzY2tfdCBjdHgsIGludCBlcnJvcikKK3sKKwljdHgtPmZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICY9IH5FWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUjsKKworCS8qIGlmIHdlIGhhZCBhbiBlcnJvciBkb2luZyBqb3VybmFsIHJlY292ZXJ5LCB3ZSBuZWVkIGEgZnVsbCBmc2NrICovCisJaWYgKGVycm9yKQorCQljdHgtPmZzLT5zdXBlci0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShjdHgtPmZzKTsKK30KKworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfZ2V0X2pvdXJuYWwoZTJmc2NrX3QgY3R4LCBqb3VybmFsX3QgKipyZXRfam91cm5hbCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayBqc3VwZXI7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgICAgICAqYmg7CisJc3RydWN0IGlub2RlICAgICAgICAgICAgKmpfaW5vZGUgPSBOVUxMOworCXN0cnVjdCBrZGV2X3MgICAgICAgICAgICpkZXZfZnMgPSBOVUxMLCAqZGV2X2pvdXJuYWw7CisJY29uc3QgY2hhciAgICAgICAgICAgICAgKmpvdXJuYWxfbmFtZSA9IE5VTEw7CisJam91cm5hbF90ICAgICAgICAgICAgICAgKmpvdXJuYWwgPSBOVUxMOworCWVycmNvZGVfdCAgICAgICAgICAgICAgIHJldHZhbCA9IDA7CisJaW9fbWFuYWdlciAgICAgICAgICAgICAgaW9fcHRyID0gMDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBzdGFydCA9IDA7CisJYmxrX3QgICAgICAgICAgICAgICAgICAgYmxrOworCWludCAgICAgICAgICAgICAgICAgICAgIGV4dF9qb3VybmFsID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICB0cmllZF9iYWNrdXBfam5sID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWpvdXJuYWwgPSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgc2l6ZW9mKGpvdXJuYWxfdCksICJqb3VybmFsIik7CisJaWYgKCFqb3VybmFsKSB7CisJCXJldHVybiBFWFQyX0VUX05PX01FTU9SWTsKKwl9CisKKwlkZXZfZnMgPSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgMipzaXplb2Yoc3RydWN0IGtkZXZfcyksICJrZGV2Iik7CisJaWYgKCFkZXZfZnMpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9OT19NRU1PUlk7CisJCWdvdG8gZXJyb3V0OworCX0KKwlkZXZfam91cm5hbCA9IGRldl9mcysxOworCisJZGV2X2ZzLT5rX2N0eCA9IGRldl9qb3VybmFsLT5rX2N0eCA9IGN0eDsKKwlkZXZfZnMtPmtfZGV2ID0gS19ERVZfRlM7CisJZGV2X2pvdXJuYWwtPmtfZGV2ID0gS19ERVZfSk9VUk5BTDsKKworCWpvdXJuYWwtPmpfZGV2ID0gZGV2X2pvdXJuYWw7CisJam91cm5hbC0+al9mc19kZXYgPSBkZXZfZnM7CisJam91cm5hbC0+al9pbm9kZSA9IE5VTEw7CisJam91cm5hbC0+al9ibG9ja3NpemUgPSBjdHgtPmZzLT5ibG9ja3NpemU7CisKKwlpZiAodXVpZF9pc19udWxsKHNiLT5zX2pvdXJuYWxfdXVpZCkpIHsKKwkJaWYgKCFzYi0+c19qb3VybmFsX2ludW0pCisJCQlyZXR1cm4gRVhUMl9FVF9CQURfSU5PREVfTlVNOworCQlqX2lub2RlID0gZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsIHNpemVvZigqal9pbm9kZSksCisJCQkJCQkgImpvdXJuYWwgaW5vZGUiKTsKKwkJaWYgKCFqX2lub2RlKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX05PX01FTU9SWTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisKKwkJal9pbm9kZS0+aV9jdHggPSBjdHg7CisJCWpfaW5vZGUtPmlfaW5vID0gc2ItPnNfam91cm5hbF9pbnVtOworCisJCWlmICgocmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoY3R4LT5mcywKKwkJCQkJCXNiLT5zX2pvdXJuYWxfaW51bSwKKwkJCQkJCSZqX2lub2RlLT5pX2V4dDIpKSkgeworCQl0cnlfYmFja3VwX2pvdXJuYWw6CisJCQlpZiAoc2ItPnNfam5sX2JhY2t1cF90eXBlICE9IEVYVDNfSk5MX0JBQ0tVUF9CTE9DS1MgfHwKKwkJCSAgICB0cmllZF9iYWNrdXBfam5sKQorCQkJCWdvdG8gZXJyb3V0OworCQkJbWVtc2V0KCZqX2lub2RlLT5pX2V4dDIsIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworCQkJbWVtY3B5KCZqX2lub2RlLT5pX2V4dDIuaV9ibG9ja1swXSwgc2ItPnNfam5sX2Jsb2NrcywKKwkJCSAgICAgICBFWFQyX05fQkxPQ0tTKjQpOworCQkJal9pbm9kZS0+aV9leHQyLmlfc2l6ZSA9IHNiLT5zX2pubF9ibG9ja3NbMTZdOworCQkJal9pbm9kZS0+aV9leHQyLmlfbGlua3NfY291bnQgPSAxOworCQkJal9pbm9kZS0+aV9leHQyLmlfbW9kZSA9IExJTlVYX1NfSUZSRUcgfCAwNjAwOworCQkJdHJpZWRfYmFja3VwX2pubCsrOworCQl9CisJCWlmICghal9pbm9kZS0+aV9leHQyLmlfbGlua3NfY291bnQgfHwKKwkJICAgICFMSU5VWF9TX0lTUkVHKGpfaW5vZGUtPmlfZXh0Mi5pX21vZGUpKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX05PX0pPVVJOQUw7CisJCQlnb3RvIHRyeV9iYWNrdXBfam91cm5hbDsKKwkJfQorCQlpZiAoal9pbm9kZS0+aV9leHQyLmlfc2l6ZSAvIGpvdXJuYWwtPmpfYmxvY2tzaXplIDwKKwkJICAgIEpGU19NSU5fSk9VUk5BTF9CTE9DS1MpIHsKKwkJCXJldHZhbCA9IEVYVDJfRVRfSk9VUk5BTF9UT09fU01BTEw7CisJCQlnb3RvIHRyeV9iYWNrdXBfam91cm5hbDsKKwkJfQorCQlmb3IgKGk9MDsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykgeworCQkJYmxrID0gal9pbm9kZS0+aV9leHQyLmlfYmxvY2tbaV07CisJCQlpZiAoIWJsaykgeworCQkJCWlmIChpIDwgRVhUMl9ORElSX0JMT0NLUykgeworCQkJCQlyZXR2YWwgPSBFWFQyX0VUX0pPVVJOQUxfVE9PX1NNQUxMOworCQkJCQlnb3RvIHRyeV9iYWNrdXBfam91cm5hbDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYmxrIDwgc2ItPnNfZmlyc3RfZGF0YV9ibG9jayB8fAorCQkJICAgIGJsayA+PSBzYi0+c19ibG9ja3NfY291bnQpIHsKKwkJCQlyZXR2YWwgPSBFWFQyX0VUX0JBRF9CTE9DS19OVU07CisJCQkJZ290byB0cnlfYmFja3VwX2pvdXJuYWw7CisJCQl9CisJCX0KKwkJam91cm5hbC0+al9tYXhsZW4gPSBqX2lub2RlLT5pX2V4dDIuaV9zaXplIC8gam91cm5hbC0+al9ibG9ja3NpemU7CisKKyNpZmRlZiBVU0VfSU5PREVfSU8KKwkJcmV0dmFsID0gZXh0MmZzX2lub2RlX2lvX2ludGVybjIoY3R4LT5mcywgc2ItPnNfam91cm5hbF9pbnVtLAorCQkJCQkJICZqX2lub2RlLT5pX2V4dDIsCisJCQkJCQkgJmpvdXJuYWxfbmFtZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKworCQlpb19wdHIgPSBpbm9kZV9pb19tYW5hZ2VyOworI2Vsc2UKKwkJam91cm5hbC0+al9pbm9kZSA9IGpfaW5vZGU7CisJCWN0eC0+am91cm5hbF9pbyA9IGN0eC0+ZnMtPmlvOworCQlpZiAoKHJldHZhbCA9IGpvdXJuYWxfYm1hcChqb3VybmFsLCAwLCAmc3RhcnQpKSAhPSAwKQorCQkJZ290byBlcnJvdXQ7CisjZW5kaWYKKwl9IGVsc2UgeworCQlleHRfam91cm5hbCA9IDE7CisJCWlmICghY3R4LT5qb3VybmFsX25hbWUpIHsKKwkJCWNoYXIgdXVpZFszN107CisKKwkJCXV1aWRfdW5wYXJzZShzYi0+c19qb3VybmFsX3V1aWQsIHV1aWQpOworCQkJY3R4LT5qb3VybmFsX25hbWUgPSBibGtpZF9nZXRfZGV2bmFtZShjdHgtPmJsa2lkLAorCQkJCQkJCSAgICAgICJVVUlEIiwgdXVpZCk7CisJCQlpZiAoIWN0eC0+am91cm5hbF9uYW1lKQorCQkJCWN0eC0+am91cm5hbF9uYW1lID0gYmxraWRfZGV2bm9fdG9fZGV2bmFtZShzYi0+c19qb3VybmFsX2Rldik7CisJCX0KKwkJam91cm5hbF9uYW1lID0gY3R4LT5qb3VybmFsX25hbWU7CisKKwkJaWYgKCFqb3VybmFsX25hbWUpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9DQU5UX0ZJTkRfSk9VUk5BTCwgJnBjdHgpOworCQkJcmV0dXJuIEVYVDJfRVRfTE9BRF9FWFRfSk9VUk5BTDsKKwkJfQorCisJCWlvX3B0ciA9IHVuaXhfaW9fbWFuYWdlcjsKKwl9CisKKyNpZm5kZWYgVVNFX0lOT0RFX0lPCisJaWYgKGV4dF9qb3VybmFsKQorI2VuZGlmCisJCXJldHZhbCA9IGlvX3B0ci0+b3Blbihqb3VybmFsX25hbWUsIElPX0ZMQUdfUlcsCisJCQkJICAgICAgJmN0eC0+am91cm5hbF9pbyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisKKwlpb19jaGFubmVsX3NldF9ibGtzaXplKGN0eC0+am91cm5hbF9pbywgY3R4LT5mcy0+YmxvY2tzaXplKTsKKworCWlmIChleHRfam91cm5hbCkgeworCQlpZiAoY3R4LT5mcy0+YmxvY2tzaXplID09IDEwMjQpCisJCQlzdGFydCA9IDE7CisJCWJoID0gZ2V0YmxrKGRldl9qb3VybmFsLCBzdGFydCwgY3R4LT5mcy0+YmxvY2tzaXplKTsKKwkJaWYgKCFiaCkgeworCQkJcmV0dmFsID0gRVhUMl9FVF9OT19NRU1PUlk7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQlpZiAoKHJldHZhbCA9IGJoLT5iX2VycikgIT0gMCkKKwkJCWdvdG8gZXJyb3V0OworCQltZW1jcHkoJmpzdXBlciwgc3RhcnQgPyBiaC0+Yl9kYXRhIDogIGJoLT5iX2RhdGEgKyAxMDI0LAorCQkgICAgICAgc2l6ZW9mKGpzdXBlcikpOworCQlicmVsc2UoYmgpOworI2lmIEJCX0JJR19FTkRJQU4KKwkJaWYgKGpzdXBlci5zX21hZ2ljID09IGV4dDJmc19zd2FiMTYoRVhUMl9TVVBFUl9NQUdJQykpCisJCQlleHQyZnNfc3dhcF9zdXBlcigmanN1cGVyKTsKKyNlbmRpZgorCQlpZiAoanN1cGVyLnNfbWFnaWMgIT0gRVhUMl9TVVBFUl9NQUdJQyB8fAorCQkgICAgIShqc3VwZXIuc19mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0VYVF9KT1VSTkFMX0JBRF9TVVBFUiwgJnBjdHgpOworCQkJcmV0dmFsID0gRVhUMl9FVF9MT0FEX0VYVF9KT1VSTkFMOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJLyogTWFrZSBzdXJlIHRoZSBqb3VybmFsIFVVSUQgaXMgY29ycmVjdCAqLworCQlpZiAobWVtY21wKGpzdXBlci5zX3V1aWQsIGN0eC0+ZnMtPnN1cGVyLT5zX2pvdXJuYWxfdXVpZCwKKwkJCSAgIHNpemVvZihqc3VwZXIuc191dWlkKSkpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX0JBRF9VVUlELCAmcGN0eCk7CisJCQlyZXR2YWwgPSBFWFQyX0VUX0xPQURfRVhUX0pPVVJOQUw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCisJCWpvdXJuYWwtPmpfbWF4bGVuID0ganN1cGVyLnNfYmxvY2tzX2NvdW50OworCQlzdGFydCsrOworCX0KKworCWlmICghKGJoID0gZ2V0YmxrKGRldl9qb3VybmFsLCBzdGFydCwgam91cm5hbC0+al9ibG9ja3NpemUpKSkgeworCQlyZXR2YWwgPSBFWFQyX0VUX05PX01FTU9SWTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJam91cm5hbC0+al9zYl9idWZmZXIgPSBiaDsKKwlqb3VybmFsLT5qX3N1cGVyYmxvY2sgPSAoam91cm5hbF9zdXBlcmJsb2NrX3QgKiliaC0+Yl9kYXRhOworCisjaWZkZWYgVVNFX0lOT0RFX0lPCisJZXh0MmZzX2ZyZWVfbWVtKCZqX2lub2RlKTsKKyNlbmRpZgorCisJKnJldF9qb3VybmFsID0gam91cm5hbDsKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWV4dDJmc19mcmVlX21lbSgmZGV2X2ZzKTsKKwlleHQyZnNfZnJlZV9tZW0oJmpfaW5vZGUpOworCWV4dDJmc19mcmVlX21lbSgmam91cm5hbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCBlMmZzY2tfam91cm5hbF9maXhfYmFkX2lub2RlKGUyZnNja190IGN0eCwKKwkJCQkJICAgICAgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlpbnQgcmVjb3ZlciA9IGN0eC0+ZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQlFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUjsKKwlpbnQgaGFzX2pvdXJuYWwgPSBjdHgtPmZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmCisJCUVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisKKwlpZiAoaGFzX2pvdXJuYWwgfHwgc2ItPnNfam91cm5hbF9pbnVtKSB7CisJCS8qIFRoZSBqb3VybmFsIGlub2RlIGlzIGJvZ3VzLCByZW1vdmUgYW5kIGZvcmNlIGZ1bGwgZnNjayAqLworCQlwY3R4LT5pbm8gPSBzYi0+c19qb3VybmFsX2ludW07CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfSk9VUk5BTF9CQURfSU5PREUsIHBjdHgpKSB7CisJCQlpZiAoaGFzX2pvdXJuYWwgJiYgc2ItPnNfam91cm5hbF9pbnVtKQorCQkJCXByaW50ZigiKioqIGV4dDMgam91cm5hbCBoYXMgYmVlbiBkZWxldGVkIC0gIgorCQkJCSAgICAgICAiZmlsZXN5c3RlbSBpcyBub3cgZXh0MiBvbmx5ICoqKlxuXG4iKTsKKwkJCXNiLT5zX2ZlYXR1cmVfY29tcGF0ICY9IH5FWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCQkJc2ItPnNfam91cm5hbF9pbnVtID0gMDsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfSk9VUk5BTF9JTk9ERTsgLyogRklYTUU6IHRvZG8gKi8KKwkJCWUyZnNja19jbGVhcl9yZWNvdmVyKGN0eCwgMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gRVhUMl9FVF9CQURfSU5PREVfTlVNOworCX0gZWxzZSBpZiAocmVjb3ZlcikgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfUkVDT1ZFUl9TRVQsIHBjdHgpKSB7CisJCQllMmZzY2tfY2xlYXJfcmVjb3ZlcihjdHgsIDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIEVYVDJfRVRfVU5TVVBQX0ZFQVRVUkU7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIFYxX1NCX1NJWkUgICAgICAweDAwMjQKK3N0YXRpYyB2b2lkIGNsZWFyX3YyX2pvdXJuYWxfZmllbGRzKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwllMmZzY2tfdCBjdHggPSBqb3VybmFsLT5qX2Rldi0+a19jdHg7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8wX0NMRUFSX1YyX0pPVVJOQUwsICZwY3R4KSkKKwkJcmV0dXJuOworCisJbWVtc2V0KCgoY2hhciAqKSBqb3VybmFsLT5qX3N1cGVyYmxvY2spICsgVjFfU0JfU0laRSwgMCwKKwkgICAgICAgY3R4LT5mcy0+YmxvY2tzaXplLVYxX1NCX1NJWkUpOworCW1hcmtfYnVmZmVyX2RpcnR5KGpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKK30KKworCitzdGF0aWMgZXJyY29kZV90IGUyZnNja19qb3VybmFsX2xvYWQoam91cm5hbF90ICpqb3VybmFsKQoreworCWUyZnNja190IGN0eCA9IGpvdXJuYWwtPmpfZGV2LT5rX2N0eDsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqanNiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqamJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZqYmgpOworCWlmIChqYmgtPmJfZXJyKSB7CisJCWJiX2Vycm9yX21zZyhfKCJyZWFkaW5nIGpvdXJuYWwgc3VwZXJibG9jayIpKTsKKwkJcmV0dXJuIGpiaC0+Yl9lcnI7CisJfQorCisJanNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCS8qIElmIHdlIGRvbid0IGV2ZW4gaGF2ZSBKRlNfTUFHSUMsIHdlIHByb2JhYmx5IGhhdmUgYSB3cm9uZyBpbm9kZSAqLworCWlmIChqc2ItPnNfaGVhZGVyLmhfbWFnaWMgIT0gaHRvbmwoSkZTX01BR0lDX05VTUJFUikpCisJCXJldHVybiBlMmZzY2tfam91cm5hbF9maXhfYmFkX2lub2RlKGN0eCwgJnBjdHgpOworCisJc3dpdGNoIChudG9obChqc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlKSkgeworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjE6CisJCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAxOworCQlpZiAoanNiLT5zX2ZlYXR1cmVfY29tcGF0IHx8CisJCSAgICBqc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCB8fAorCQkgICAganNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHx8CisJCSAgICBqc2ItPnNfbnJfdXNlcnMpCisJCQljbGVhcl92Ml9qb3VybmFsX2ZpZWxkcyhqb3VybmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIEpGU19TVVBFUkJMT0NLX1YyOgorCQlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKKwkJaWYgKG50b2hsKGpzYi0+c19ucl91c2VycykgPiAxICYmCisJCSAgICB1dWlkX2lzX251bGwoY3R4LT5mcy0+c3VwZXItPnNfam91cm5hbF91dWlkKSkKKwkJCWNsZWFyX3YyX2pvdXJuYWxfZmllbGRzKGpvdXJuYWwpOworCQlpZiAobnRvaGwoanNiLT5zX25yX3VzZXJzKSA+IDEpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX1VOU1VQUF9NVUxUSUZTLCAmcGN0eCk7CisJCQlyZXR1cm4gRVhUMl9FVF9KT1VSTkFMX1VOU1VQUF9WRVJTSU9OOworCQl9CisJCWJyZWFrOworCisJLyoKKwkgKiBUaGVzZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGEgam91cm5hbCBzdXBlciBibG9jaywgc28gaWYKKwkgKiB0aGV5IGRvLCB0aGUgam91cm5hbCBpcyBiYWRseSBjb3JydXB0ZWQuCisJICovCisJY2FzZSBKRlNfREVTQ1JJUFRPUl9CTE9DSzoKKwljYXNlIEpGU19DT01NSVRfQkxPQ0s6CisJY2FzZSBKRlNfUkVWT0tFX0JMT0NLOgorCQlyZXR1cm4gRVhUMl9FVF9DT1JSVVBUX1NVUEVSQkxPQ0s7CisKKwkvKiBJZiB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoZSBzdXBlcmJsb2NrIG1ham9yIHR5cGUsIGJ1dCB0aGVyZQorCSAqIGlzIGEgbWFnaWMgbnVtYmVyLCB0aGVuIGl0IGlzIGxpa2VseSB0byBiZSBhIG5ldyBmb3JtYXQgd2UKKwkgKiBqdXN0IGRvbid0IHVuZGVyc3RhbmQsIHNvIGxlYXZlIGl0IGFsb25lLiAqLworCWRlZmF1bHQ6CisJCXJldHVybiBFWFQyX0VUX0pPVVJOQUxfVU5TVVBQX1ZFUlNJT047CisJfQorCisJaWYgKEpGU19IQVNfSU5DT01QQVRfRkVBVFVSRShqb3VybmFsLCB+SkZTX0tOT1dOX0lOQ09NUEFUX0ZFQVRVUkVTKSkKKwkJcmV0dXJuIEVYVDJfRVRfVU5TVVBQX0ZFQVRVUkU7CisKKwlpZiAoSkZTX0hBU19ST19DT01QQVRfRkVBVFVSRShqb3VybmFsLCB+SkZTX0tOT1dOX1JPQ09NUEFUX0ZFQVRVUkVTKSkKKwkJcmV0dXJuIEVYVDJfRVRfUk9fVU5TVVBQX0ZFQVRVUkU7CisKKwkvKiBXZSBoYXZlIG5vdyBjaGVja2VkIHdoZXRoZXIgd2Uga25vdyBlbm91Z2ggYWJvdXQgdGhlIGpvdXJuYWwKKwkgKiBmb3JtYXQgdG8gYmUgYWJsZSB0byBwcm9jZWVkIHNhZmVseSwgc28gYW55IG90aGVyIGNoZWNrcyB0aGF0CisJICogZmFpbCB3ZSBzaG91bGQgYXR0ZW1wdCB0byByZWNvdmVyIGZyb20uICovCisJaWYgKGpzYi0+c19ibG9ja3NpemUgIT0gaHRvbmwoam91cm5hbC0+al9ibG9ja3NpemUpKSB7CisJCWJiX2Vycm9yX21zZyhfKCIlczogbm8gdmFsaWQgam91cm5hbCBzdXBlcmJsb2NrIGZvdW5kIiksCisJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLOworCX0KKworCWlmIChudG9obChqc2ItPnNfbWF4bGVuKSA8IGpvdXJuYWwtPmpfbWF4bGVuKQorCQlqb3VybmFsLT5qX21heGxlbiA9IG50b2hsKGpzYi0+c19tYXhsZW4pOworCWVsc2UgaWYgKG50b2hsKGpzYi0+c19tYXhsZW4pID4gam91cm5hbC0+al9tYXhsZW4pIHsKKwkJYmJfZXJyb3JfbXNnKF8oIiVzOiBqb3VybmFsIHRvbyBzaG9ydCIpLAorCQkJY3R4LT5kZXZpY2VfbmFtZSk7CisJCXJldHVybiBFWFQyX0VUX0NPUlJVUFRfU1VQRVJCTE9DSzsKKwl9CisKKwlqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UgPSBudG9obChqc2ItPnNfc2VxdWVuY2UpOworCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2U7CisJam91cm5hbC0+al90YWlsID0gbnRvaGwoanNiLT5zX3N0YXJ0KTsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gbnRvaGwoanNiLT5zX2ZpcnN0KTsKKwlqb3VybmFsLT5qX2xhc3QgPSBudG9obChqc2ItPnNfbWF4bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlMmZzY2tfam91cm5hbF9yZXNldF9zdXBlcihlMmZzY2tfdCBjdHgsIGpvdXJuYWxfc3VwZXJibG9ja190ICpqc2IsCisJCQkJICAgICAgIGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwljaGFyICpwOworCXVuaW9uIHsKKwkJdXVpZF90IHV1aWQ7CisJCV9fdTMyIHZhbFs0XTsKKwl9IHU7CisJX191MzIgbmV3X3NlcSA9IDA7CisJaW50IGk7CisKKwkvKiBMZWF2ZSBhIHZhbGlkIGV4aXN0aW5nIFYxIHN1cGVyYmxvY2sgc2lnbmF0dXJlIGFsb25lLgorCSAqIEFueXRoaW5nIHVucmVjb2duaXphYmxlIHdlIG92ZXJ3cml0ZSB3aXRoIGEgbmV3IFYyCisJICogc2lnbmF0dXJlLiAqLworCisJaWYgKGpzYi0+c19oZWFkZXIuaF9tYWdpYyAhPSBodG9ubChKRlNfTUFHSUNfTlVNQkVSKSB8fAorCSAgICBqc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlICE9IGh0b25sKEpGU19TVVBFUkJMT0NLX1YxKSkgeworCQlqc2ItPnNfaGVhZGVyLmhfbWFnaWMgPSBodG9ubChKRlNfTUFHSUNfTlVNQkVSKTsKKwkJanNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGh0b25sKEpGU19TVVBFUkJMT0NLX1YyKTsKKwl9CisKKwkvKiBaZXJvIG91dCBldmVyeXRoaW5nIGVsc2UgYmV5b25kIHRoZSBzdXBlcmJsb2NrIGhlYWRlciAqLworCisJcCA9ICgoY2hhciAqKSBqc2IpICsgc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpOworCW1lbXNldCAocCwgMCwgY3R4LT5mcy0+YmxvY2tzaXplLXNpemVvZihqb3VybmFsX2hlYWRlcl90KSk7CisKKwlqc2ItPnNfYmxvY2tzaXplID0gaHRvbmwoY3R4LT5mcy0+YmxvY2tzaXplKTsKKwlqc2ItPnNfbWF4bGVuID0gaHRvbmwoam91cm5hbC0+al9tYXhsZW4pOworCWpzYi0+c19maXJzdCA9IGh0b25sKDEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgam91cm5hbCBzZXF1ZW5jZSBudW1iZXIgc28gdGhhdCB0aGVyZSBpcyAibm8iCisJICogY2hhbmNlIHdlIHdpbGwgZmluZCBvbGQgInZhbGlkIiB0cmFuc2FjdGlvbnMgaW4gdGhlIGpvdXJuYWwuCisJICogVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gemVybyB0aGUgd2hvbGUgam91cm5hbCAoc2xvdyB0byBkbywKKwkgKiBhbmQgcmlza3kgd2hlbiB3ZSBhcmUganVzdCByZWNvdmVyaW5nIHRoZSBmaWxlc3lzdGVtKS4KKwkgKi8KKwl1dWlkX2dlbmVyYXRlKHUudXVpZCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspCisJCW5ld19zZXEgXj0gdS52YWxbaV07CisJanNiLT5zX3NlcXVlbmNlID0gaHRvbmwobmV3X3NlcSk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJbGxfcndfYmxvY2soV1JJVEUsIDEsICZqb3VybmFsLT5qX3NiX2J1ZmZlcik7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX2pvdXJuYWxfZml4X2NvcnJ1cHRfc3VwZXIoZTJmc2NrX3QgY3R4LAorCQkJCQkJICBqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCQkgIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiID0gY3R4LT5mcy0+c3VwZXI7CisJaW50IHJlY292ZXIgPSBjdHgtPmZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVI7CisKKwlpZiAoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfSk9VUk5BTF9CQURfU1VQRVIsIHBjdHgpKSB7CisJCQllMmZzY2tfam91cm5hbF9yZXNldF9zdXBlcihjdHgsIGpvdXJuYWwtPmpfc3VwZXJibG9jaywKKwkJCQkJCSAgIGpvdXJuYWwpOworCQkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9IDE7CisJCQllMmZzY2tfY2xlYXJfcmVjb3ZlcihjdHgsIHJlY292ZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLOworCX0gZWxzZSBpZiAoZTJmc2NrX2pvdXJuYWxfZml4X2JhZF9pbm9kZShjdHgsIHBjdHgpKQorCQlyZXR1cm4gRVhUMl9FVF9DT1JSVVBUX1NVUEVSQkxPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZTJmc2NrX2pvdXJuYWxfcmVsZWFzZShlMmZzY2tfdCBjdHgsIGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkgICBpbnQgcmVzZXQsIGludCBkcm9wKQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpqc2I7CisKKwlpZiAoZHJvcCkKKwkJbWFya19idWZmZXJfY2xlYW4oam91cm5hbC0+al9zYl9idWZmZXIpOworCWVsc2UgaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkpIHsKKwkJanNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCQlqc2ItPnNfc2VxdWVuY2UgPSBodG9ubChqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlKTsKKwkJaWYgKHJlc2V0KQorCQkJanNiLT5zX3N0YXJ0ID0gMDsgLyogdGhpcyBtYXJrcyB0aGUgam91cm5hbCBhcyBlbXB0eSAqLworCQltYXJrX2J1ZmZlcl9kaXJ0eShqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJfQorCWJyZWxzZShqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisKKwlpZiAoY3R4LT5qb3VybmFsX2lvKSB7CisJCWlmIChjdHgtPmZzICYmIGN0eC0+ZnMtPmlvICE9IGN0eC0+am91cm5hbF9pbykKKwkJCWlvX2NoYW5uZWxfY2xvc2UoY3R4LT5qb3VybmFsX2lvKTsKKwkJY3R4LT5qb3VybmFsX2lvID0gMDsKKwl9CisKKyNpZm5kZWYgVVNFX0lOT0RFX0lPCisJZXh0MmZzX2ZyZWVfbWVtKCZqb3VybmFsLT5qX2lub2RlKTsKKyNlbmRpZgorCWV4dDJmc19mcmVlX21lbSgmam91cm5hbC0+al9mc19kZXYpOworCWV4dDJmc19mcmVlX21lbSgmam91cm5hbCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCB0aGUgc3VwZXJibG9jayBmaWVsZHMgcmVnYXJkaW5nIHRoZQorICogam91cm5hbCBhcmUgY29uc2lzdGVudC4KKyAqLworc3RhdGljIGludCBlMmZzY2tfY2hlY2tfZXh0M19qb3VybmFsKGUyZnNja190IGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IHJlY292ZXIgPSBjdHgtPmZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVI7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCXByb2JsZW1fdCBwcm9ibGVtOworCWludCByZXNldCA9IDAsIGZvcmNlX2ZzY2sgPSAwOworCWludCByZXR2YWw7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSBqb3VybmFsIGZlYXR1cmVzLCBkb24ndCBkbyBhbnl0aGluZyBtb3JlICovCisJaWYgKCEoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSAmJgorCSAgICAhcmVjb3ZlciAmJiBzYi0+c19qb3VybmFsX2ludW0gPT0gMCAmJiBzYi0+c19qb3VybmFsX2RldiA9PSAwICYmCisJICAgIHV1aWRfaXNfbnVsbChzYi0+c19qb3VybmFsX3V1aWQpKQorCQlyZXR1cm4gMDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJcGN0eC5udW0gPSBzYi0+c19qb3VybmFsX2ludW07CisKKwlyZXR2YWwgPSBlMmZzY2tfZ2V0X2pvdXJuYWwoY3R4LCAmam91cm5hbCk7CisJaWYgKHJldHZhbCkgeworCQlpZiAoKHJldHZhbCA9PSBFWFQyX0VUX0JBRF9JTk9ERV9OVU0pIHx8CisJCSAgICAocmV0dmFsID09IEVYVDJfRVRfQkFEX0JMT0NLX05VTSkgfHwKKwkJICAgIChyZXR2YWwgPT0gRVhUMl9FVF9KT1VSTkFMX1RPT19TTUFMTCkgfHwKKwkJICAgIChyZXR2YWwgPT0gRVhUMl9FVF9OT19KT1VSTkFMKSkKKwkJCXJldHVybiBlMmZzY2tfam91cm5hbF9maXhfYmFkX2lub2RlKGN0eCwgJnBjdHgpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IGUyZnNja19qb3VybmFsX2xvYWQoam91cm5hbCk7CisJaWYgKHJldHZhbCkgeworCQlpZiAoKHJldHZhbCA9PSBFWFQyX0VUX0NPUlJVUFRfU1VQRVJCTE9DSykgfHwKKwkJICAgICgocmV0dmFsID09IEVYVDJfRVRfVU5TVVBQX0ZFQVRVUkUpICYmCisJCSAgICAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX1VOU1VQUF9JTkNPTVBBVCwKKwkJCQkgICZwY3R4KSkpIHx8CisJCSAgICAoKHJldHZhbCA9PSBFWFQyX0VUX1JPX1VOU1VQUF9GRUFUVVJFKSAmJgorCQkgICAgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzBfSk9VUk5BTF9VTlNVUFBfUk9DT01QQVQsCisJCQkJICAmcGN0eCkpKSB8fAorCQkgICAgKChyZXR2YWwgPT0gRVhUMl9FVF9KT1VSTkFMX1VOU1VQUF9WRVJTSU9OKSAmJgorCQkgICAgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzBfSk9VUk5BTF9VTlNVUFBfVkVSU0lPTiwgJnBjdHgpKSkpCisJCQlyZXR2YWwgPSBlMmZzY2tfam91cm5hbF9maXhfY29ycnVwdF9zdXBlcihjdHgsIGpvdXJuYWwsCisJCQkJCQkJCSAgJnBjdHgpOworCQllMmZzY2tfam91cm5hbF9yZWxlYXNlKGN0eCwgam91cm5hbCwgMCwgMSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyoKKwkgKiBXZSB3YW50IHRvIG1ha2UgdGhlIGZsYWdzIGNvbnNpc3RlbnQgaGVyZS4gIFdlIHdpbGwgbm90IGxlYXZlIHdpdGgKKwkgKiBuZWVkc19yZWNvdmVyeSBzZXQgYnV0IGhhc19qb3VybmFsIGNsZWFyLiAgV2UgY2FuJ3QgZ2V0IGluIGEgbG9vcAorCSAqIHdpdGggLXksIC1uLCBvciAtcCwgb25seSBpZiBhIHVzZXIgaXNuJ3QgbWFraW5nIHVwIHRoZWlyIG1pbmQuCisJICovCitub19oYXNfam91cm5hbDoKKwlpZiAoIShzYi0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKSB7CisJCXJlY292ZXIgPSBzYi0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVI7CisJCXBjdHguc3RyID0gImlub2RlIjsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX0hBU19KT1VSTkFMLCAmcGN0eCkpIHsKKwkJCWlmIChyZWNvdmVyICYmCisJCQkgICAgIWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9KT1VSTkFMX1JFQ09WRVJfU0VULCAmcGN0eCkpCisJCQkJZ290byBub19oYXNfam91cm5hbDsKKwkJCS8qCisJCQkgKiBOZWVkIGEgZnVsbCBmc2NrIGlmIHdlIGFyZSByZWxlYXNpbmcgYQorCQkJICogam91cm5hbCBzdG9yZWQgb24gYSByZXNlcnZlZCBpbm9kZS4KKwkJCSAqLworCQkJZm9yY2VfZnNjayA9IHJlY292ZXIgfHwKKwkJCQkoc2ItPnNfam91cm5hbF9pbnVtIDwgRVhUMl9GSVJTVF9JTk9ERShzYikpOworCQkJLyogQ2xlYXIgYWxsIG9mIHRoZSBqb3VybmFsIGZpZWxkcyAqLworCQkJc2ItPnNfam91cm5hbF9pbnVtID0gMDsKKwkJCXNiLT5zX2pvdXJuYWxfZGV2ID0gMDsKKwkJCW1lbXNldChzYi0+c19qb3VybmFsX3V1aWQsIDAsCisJCQkgICAgICAgc2l6ZW9mKHNiLT5zX2pvdXJuYWxfdXVpZCkpOworCQkJZTJmc2NrX2NsZWFyX3JlY292ZXIoY3R4LCBmb3JjZV9mc2NrKTsKKwkJfSBlbHNlIGlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpKSB7CisJCQlzYi0+c19mZWF0dXJlX2NvbXBhdCB8PSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoY3R4LT5mcyk7CisJCX0KKwl9CisKKwlpZiAoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMICYmCisJICAgICEoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSAmJgorCSAgICBqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfc3RhcnQgIT0gMCkgeworCQkvKiBQcmludCBzdGF0dXMgaW5mb3JtYXRpb24gKi8KKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0pPVVJOQUxfUkVDT1ZFUllfQ0xFQVIsICZwY3R4KTsKKwkJaWYgKGN0eC0+c3VwZXJibG9jaykKKwkJCXByb2JsZW0gPSBQUl8wX0pPVVJOQUxfUlVOX0RFRkFVTFQ7CisJCWVsc2UKKwkJCXByb2JsZW0gPSBQUl8wX0pPVVJOQUxfUlVOOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBwcm9ibGVtLCAmcGN0eCkpIHsKKwkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX0ZPUkNFOworCQkJc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCB8PQorCQkJCUVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoY3R4LT5mcyk7CisJCX0gZWxzZSBpZiAoZml4X3Byb2JsZW0oY3R4LAorCQkJCSAgICAgICBQUl8wX0pPVVJOQUxfUkVTRVRfSk9VUk5BTCwgJnBjdHgpKSB7CisJCQlyZXNldCA9IDE7CisJCQlzYi0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGN0eC0+ZnMpOworCQl9CisJCS8qCisJCSAqIElmIHRoZSB1c2VyIGFuc3dlcnMgbm8gdG8gdGhlIGFib3ZlIHF1ZXN0aW9uLCB3ZQorCQkgKiBpZ25vcmUgdGhlIGZhY3QgdGhhdCBqb3VybmFsIGFwcGFyZW50bHkgaGFzIGRhdGE7CisJCSAqIGFjY2lkZW50YWxseSByZXBsYXlpbmcgb3ZlciB2YWxpZCBkYXRhIHdvdWxkIGJlIGZhcgorCQkgKiB3b3JzZSB0aGFuIHNraXBwaW5nIGEgcXVlc3Rpb25hYmxlIHJlY292ZXJ5LgorCQkgKgorCQkgKiBYWFggc2hvdWxkIHdlIGFib3J0IHdpdGggYSBmYXRhbCBlcnJvciBoZXJlPyAgV2hhdAorCQkgKiB3aWxsIHRoZSBleHQzIGtlcm5lbCBjb2RlIGRvIGlmIGEgZmlsZXN5c3RlbSB3aXRoCisJCSAqICFORUVEU19SRUNPVkVSWSBidXQgd2l0aCBhIG5vbi16ZXJvCisJCSAqIGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19zdGFydCBpcyBtb3VudGVkPworCQkgKi8KKwl9CisKKwllMmZzY2tfam91cm5hbF9yZWxlYXNlKGN0eCwgam91cm5hbCwgcmVzZXQsIDApOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgcmVjb3Zlcl9leHQzX2pvdXJuYWwoZTJmc2NrX3QgY3R4KQoreworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgcmV0dmFsOworCisJam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXMoKTsKKwlyZXR2YWwgPSBlMmZzY2tfZ2V0X2pvdXJuYWwoY3R4LCAmam91cm5hbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGUyZnNja19qb3VybmFsX2xvYWQoam91cm5hbCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisKKwlyZXR2YWwgPSBqb3VybmFsX2luaXRfcmV2b2tlKGpvdXJuYWwsIDEwMjQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCisJcmV0dmFsID0gLWpvdXJuYWxfcmVjb3Zlcihqb3VybmFsKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworCWlmIChqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfZXJybm8pIHsKKwkJY3R4LT5mcy0+c3VwZXItPnNfc3RhdGUgfD0gRVhUMl9FUlJPUl9GUzsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoY3R4LT5mcyk7CisJCWpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19lcnJubyA9IDA7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKwl9CisKK2Vycm91dDoKKwlqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlKGpvdXJuYWwpOworCWpvdXJuYWxfZGVzdHJveV9yZXZva2VfY2FjaGVzKCk7CisJZTJmc2NrX2pvdXJuYWxfcmVsZWFzZShjdHgsIGpvdXJuYWwsIDEsIDApOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZTJmc2NrX3J1bl9leHQzX2pvdXJuYWwoZTJmc2NrX3QgY3R4KQoreworCWlvX21hbmFnZXIgaW9fcHRyID0gY3R4LT5mcy0+aW8tPm1hbmFnZXI7CisJaW50IGJsb2Nrc2l6ZSA9IGN0eC0+ZnMtPmJsb2Nrc2l6ZTsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsLCByZWNvdmVyX3JldHZhbDsKKworCXByaW50ZihfKCIlczogcmVjb3ZlcmluZyBqb3VybmFsXG4iKSwgY3R4LT5kZXZpY2VfbmFtZSk7CisJaWYgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpIHsKKwkJcHJpbnRmKF8oIiVzOiB3b24ndCBkbyBqb3VybmFsIHJlY292ZXJ5IHdoaWxlIHJlYWQtb25seVxuIiksCisJCSAgICAgICBjdHgtPmRldmljZV9uYW1lKTsKKwkJcmV0dXJuIEVYVDJfRVRfRklMRV9STzsKKwl9CisKKwlpZiAoY3R4LT5mcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfRElSVFkpCisJCWV4dDJmc19mbHVzaChjdHgtPmZzKTsgIC8qIEZvcmNlIG91dCBhbnkgbW9kaWZpY2F0aW9ucyAqLworCisJcmVjb3Zlcl9yZXR2YWwgPSByZWNvdmVyX2V4dDNfam91cm5hbChjdHgpOworCisJLyoKKwkgKiBSZWxvYWQgdGhlIGZpbGVzeXN0ZW0gY29udGV4dCB0byBnZXQgdXAtdG8tZGF0ZSBkYXRhIGZyb20gZGlzaworCSAqIGJlY2F1c2Ugam91cm5hbCByZWNvdmVyeSB3aWxsIGNoYW5nZSB0aGUgZmlsZXN5c3RlbSB1bmRlciB1cy4KKwkgKi8KKwlleHQyZnNfY2xvc2UoY3R4LT5mcyk7CisJcmV0dmFsID0gZXh0MmZzX29wZW4oY3R4LT5maWxlc3lzdGVtX25hbWUsIEVYVDJfRkxBR19SVywKKwkJCSAgICAgY3R4LT5zdXBlcmJsb2NrLCBibG9ja3NpemUsIGlvX3B0ciwKKwkJCSAgICAgJmN0eC0+ZnMpOworCisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgdHJ5aW5nIHRvIHJlLW9wZW4gJXMiKSwKKwkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9CisJY3R4LT5mcy0+cHJpdl9kYXRhID0gY3R4OworCisJLyogU2V0IHRoZSBzdXBlcmJsb2NrIGZsYWdzICovCisJZTJmc2NrX2NsZWFyX3JlY292ZXIoY3R4LCByZWNvdmVyX3JldHZhbCk7CisJcmV0dXJuIHJlY292ZXJfcmV0dmFsOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG1vdmUgdGhlIGpvdXJuYWwgaW5vZGUgZnJvbSBhIHZpc2libGUgZmlsZSBpbgorICogdGhlIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IGhpZXJhcmNoeSB0byB0aGUgcmVzZXJ2ZWQgaW5vZGUgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgam91cm5hbF9uYW1lc1tdID0geworCSIuam91cm5hbCIsICJqb3VybmFsIiwgIi5qb3VybmFsLmRhdCIsICJqb3VybmFsLmRhdCIsIDAgfTsKKworc3RhdGljIHZvaWQgZTJmc2NrX21vdmVfZXh0M19qb3VybmFsKGUyZnNja190IGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCWV4dDJfZmlsc3lzICAgICAgICAgICAgIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgICAgICAgICBpbm87CisJZXJyY29kZV90ICAgICAgICAgICAgICAgcmV0dmFsOworCWNvbnN0IGNoYXIgKmNvbnN0ICogICAgY3BwOworCWludCAgICAgICAgICAgICAgICAgICAgIGdyb3VwLCBtb3VudF9mbGFnczsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGlzIG9wZW5lZCByZWFkLW9ubHksIG9yIHRoZXJlIGlzIG5vCisJICogam91cm5hbCwgdGhlbiBkbyBub3RoaW5nLgorCSAqLworCWlmICgoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgfHwKKwkgICAgKHNiLT5zX2pvdXJuYWxfaW51bSA9PSAwKSB8fAorCSAgICAhKHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCisJCXJldHVybjsKKworCS8qCisJICogUmVhZCBpbiB0aGUgam91cm5hbCBpbm9kZQorCSAqLworCWlmIChleHQyZnNfcmVhZF9pbm9kZShmcywgc2ItPnNfam91cm5hbF9pbnVtLCAmaW5vZGUpICE9IDApCisJCXJldHVybjsKKworCS8qCisJICogSWYgaXQncyBuZWNlc3NhcnkgdG8gYmFja3VwIHRoZSBqb3VybmFsIGlub2RlLCBkbyBzby4KKwkgKi8KKwlpZiAoKHNiLT5zX2pubF9iYWNrdXBfdHlwZSA9PSAwKSB8fAorCSAgICAoKHNiLT5zX2pubF9iYWNrdXBfdHlwZSA9PSBFWFQzX0pOTF9CQUNLVVBfQkxPQ0tTKSAmJgorCSAgICAgbWVtY21wKGlub2RlLmlfYmxvY2ssIHNiLT5zX2pubF9ibG9ja3MsIEVYVDJfTl9CTE9DS1MqNCkpKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfQkFDS1VQX0pOTCwgJnBjdHgpKSB7CisJCQltZW1jcHkoc2ItPnNfam5sX2Jsb2NrcywgaW5vZGUuaV9ibG9jaywKKwkJCSAgICAgICBFWFQyX05fQkxPQ0tTKjQpOworCQkJc2ItPnNfam5sX2Jsb2Nrc1sxNl0gPSBpbm9kZS5pX3NpemU7CisJCQlzYi0+c19qbmxfYmFja3VwX3R5cGUgPSBFWFQzX0pOTF9CQUNLVVBfQkxPQ0tTOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQkJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBqb3VybmFsIGlzIGFscmVhZHkgdGhlIGhpZGRlbiBpbm9kZSwgdGhlbiBkbyBub3RoaW5nCisJICovCisJaWYgKHNiLT5zX2pvdXJuYWxfaW51bSA9PSBFWFQyX0pPVVJOQUxfSU5PKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSBqb3VybmFsIGlub2RlIGhhZCBiZXR0ZXIgaGF2ZSBvbmx5IG9uZSBsaW5rIGFuZCBub3QgYmUgcmVhZGFibGUuCisJICovCisJaWYgKGlub2RlLmlfbGlua3NfY291bnQgIT0gMSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkLCBvciB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIKKwkgKiBvciBub3QgaXQncyBtb3VudGVkLCBkbyBub3RoaW5nLgorCSAqLworCXJldHZhbCA9IGV4dDJmc19jaGVja19pZl9tb3VudGVkKGN0eC0+ZmlsZXN5c3RlbV9uYW1lLCAmbW91bnRfZmxhZ3MpOworCWlmIChyZXR2YWwgfHwgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBuYW1lIG9mIHRoZSBqb3VybmFsIGlub2RlLCB0aGVuIGRvCisJICogbm90aGluZy4KKwkgKi8KKwlmb3IgKGNwcCA9IGpvdXJuYWxfbmFtZXM7ICpjcHA7IGNwcCsrKSB7CisJCXJldHZhbCA9IGV4dDJmc19sb29rdXAoZnMsIEVYVDJfUk9PVF9JTk8sICpjcHAsCisJCQkJICAgICAgIHN0cmxlbigqY3BwKSwgMCwgJmlubyk7CisJCWlmICgocmV0dmFsID09IDApICYmIChpbm8gPT0gc2ItPnNfam91cm5hbF9pbnVtKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoKmNwcCA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBXZSBuZWVkIHRoZSBpbm9kZSBiaXRtYXAgdG8gYmUgbG9hZGVkICovCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfYml0bWFwcyhmcyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuOworCisJcGN0eC5zdHIgPSAqY3BwOworCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8wX01PVkVfSk9VUk5BTCwgJnBjdHgpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE9LLCB3ZSd2ZSBkb25lIGFsbCB0aGUgY2hlY2tzLCBsZXQncyBhY3R1YWxseSBtb3ZlIHRoZQorCSAqIGpvdXJuYWwgaW5vZGUuICBFcnJvcnMgYXQgdGhpcyBwb2ludCBtZWFuIHdlIG5lZWQgdG8gZm9yY2UKKwkgKiBhbiBleHQyIGZpbGVzeXN0ZW0gY2hlY2suCisJICovCisJaWYgKChyZXR2YWwgPSBleHQyZnNfdW5saW5rKGZzLCBFWFQyX1JPT1RfSU5PLCAqY3BwLCBpbm8sIDApKSAhPSAwKQorCQlnb3RvIGVycl9vdXQ7CisJaWYgKChyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIEVYVDJfSk9VUk5BTF9JTk8sICZpbm9kZSkpICE9IDApCisJCWdvdG8gZXJyX291dDsKKwlzYi0+c19qb3VybmFsX2ludW0gPSBFWFQyX0pPVVJOQUxfSU5POworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19NQVNURVJfU0JfT05MWTsKKwlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMDsKKwlpbm9kZS5pX2R0aW1lID0gdGltZShOVUxMKTsKKwlpZiAoKHJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShmcywgaW5vLCAmaW5vZGUpKSAhPSAwKQorCQlnb3RvIGVycl9vdXQ7CisKKwlncm91cCA9IGV4dDJmc19ncm91cF9vZl9pbm8oZnMsIGlubyk7CisJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoZnMtPmlub2RlX21hcCwgaW5vKTsKKwlleHQyZnNfbWFya19pYl9kaXJ0eShmcyk7CisJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2ZyZWVfaW5vZGVzX2NvdW50Kys7CisJZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50Kys7CisJcmV0dXJuOworCitlcnJfb3V0OgorCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwlmaXhfcHJvYmxlbShjdHgsIFBSXzBfRVJSX01PVkVfSk9VUk5BTCwgJnBjdHgpOworCWZzLT5zdXBlci0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7Cit9CisKKy8qCisgKiBtZXNzYWdlLmMgLS0tIHByaW50IGUyZnNjayBtZXNzYWdlcyAod2l0aCBjb21wcmVzc2lvbikKKyAqCisgKiBwcmludF9lMmZzY2tfbWVzc2FnZSgpIHByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIsIHVzaW5nCisgKiBjb21wcmVzc2lvbiB0ZWNobmlxdWVzIGFuZCBleHBhbnNpb25zIG9mIGFiYnJldmlhdGlvbnMuCisgKgorICogVGhlIGZvbGxvd2luZyAlIGV4cGFuc2lvbnMgYXJlIHN1cHBvcnRlZDoKKyAqCisgKiAgICAgICViICAgICAgPGJsaz4gICAgICAgICAgICAgICAgICAgYmxvY2sgbnVtYmVyCisgKiAgICAgICVCICAgICAgPGJsa2NvdW50PiAgICAgICAgICAgICAgaW50ZWdlcgorICogICAgICAlYyAgICAgIDxibGsyPiAgICAgICAgICAgICAgICAgIGJsb2NrIG51bWJlcgorICogICAgICAlRGkgICAgIDxkaXJlbnQ+LT5pbm8gICAgICAgICAgIGlub2RlIG51bWJlcgorICogICAgICAlRG4gICAgIDxkaXJlbnQ+LT5uYW1lICAgICAgICAgIHN0cmluZworICogICAgICAlRHIgICAgIDxkaXJlbnQ+LT5yZWNfbGVuCisgKiAgICAgICVEbCAgICAgPGRpcmVudD4tPm5hbWVfbGVuCisgKiAgICAgICVEdCAgICAgPGRpcmVudD4tPmZpbGV0eXBlCisgKiAgICAgICVkICAgICAgPGRpcj4gICAgICAgICAgICAgICAgICAgaW5vZGUgbnVtYmVyCisgKiAgICAgICVnICAgICAgPGdyb3VwPiAgICAgICAgICAgICAgICAgaW50ZWdlcgorICogICAgICAlaSAgICAgIDxpbm8+ICAgICAgICAgICAgICAgICAgIGlub2RlIG51bWJlcgorICogICAgICAlSXMgICAgIDxpbm9kZT4gLT4gaV9zaXplCisgKiAgICAgICVJUyAgICAgPGlub2RlPiAtPiBpX2V4dHJhX2lzaXplCisgKiAgICAgICVJYiAgICAgPGlub2RlPiAtPiBpX2Jsb2NrcworICogICAgICAlSWwgICAgIDxpbm9kZT4gLT4gaV9saW5rc19jb3VudAorICogICAgICAlSW0gICAgIDxpbm9kZT4gLT4gaV9tb2RlCisgKiAgICAgICVJTSAgICAgPGlub2RlPiAtPiBpX210aW1lCisgKiAgICAgICVJRiAgICAgPGlub2RlPiAtPiBpX2ZhZGRyCisgKiAgICAgICVJZiAgICAgPGlub2RlPiAtPiBpX2ZpbGVfYWNsCisgKiAgICAgICVJZCAgICAgPGlub2RlPiAtPiBpX2Rpcl9hY2wKKyAqICAgICAgJUl1ICAgICA8aW5vZGU+IC0+IGlfdWlkCisgKiAgICAgICVJZyAgICAgPGlub2RlPiAtPiBpX2dpZAorICogICAgICAlaiAgICAgIDxpbm8yPiAgICAgICAgICAgICAgICAgIGlub2RlIG51bWJlcgorICogICAgICAlbSAgICAgIDxjb21fZXJyIGVycm9yIG1lc3NhZ2U+CisgKiAgICAgICVOICAgICAgPG51bT4KKyAqICAgICAgJXAgICAgICBleHQyZnNfZ2V0X3BhdGhuYW1lIG9mIGRpcmVjdG9yeSA8aW5vPgorICogICAgICAlUCAgICAgIGV4dDJmc19nZXRfcGF0aG5hbWUgb2YgPGRpcmVudD4tPmlubyB3aXRoIDxpbm8yPiBhcworICogICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5LiAgKElmIGRpcmVudCBpcyBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGVuIHJldHVybiB0aGUgcGF0aG5hbWUgb2YgZGlyZWN0b3J5IDxpbm8yPikKKyAqICAgICAgJXEgICAgICBleHQyZnNfZ2V0X3BhdGhuYW1lIG9mIGRpcmVjdG9yeSA8ZGlyPgorICogICAgICAlUSAgICAgIGV4dDJmc19nZXRfcGF0aG5hbWUgb2YgZGlyZWN0b3J5IDxpbm8+IHdpdGggPGRpcj4gYXMKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeS4KKyAqICAgICAgJXMgICAgICA8c3RyPiAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzIHN0cmluZworICogICAgICAlUyAgICAgIGJhY2t1cCBzdXBlcmJsb2NrCisgKiAgICAgICVYICAgICAgPG51bT4gaGV4YWRlY2ltYWwgZm9ybWF0CisgKgorICogVGhlIGZvbGxvd2luZyAnQCcgZXhwYW5zaW9ucyBhcmUgc3VwcG9ydGVkOgorICoKKyAqICAgICAgQGEgICAgICBleHRlbmRlZCBhdHRyaWJ1dGUKKyAqICAgICAgQEEgICAgICBlcnJvciBhbGxvY2F0aW5nCisgKiAgICAgIEBiICAgICAgYmxvY2sKKyAqICAgICAgQEIgICAgICBiaXRtYXAKKyAqICAgICAgQGMgICAgICBjb21wcmVzcworICogICAgICBAQyAgICAgIGNvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgZnMgYmxvY2sKKyAqICAgICAgQEQgICAgICBkZWxldGVkCisgKiAgICAgIEBkICAgICAgZGlyZWN0b3J5CisgKiAgICAgIEBlICAgICAgZW50cnkKKyAqICAgICAgQEUgICAgICBFbnRyeSAnJURuJyBpbiAlcCAoJWkpCisgKiAgICAgIEBmICAgICAgZmlsZXN5c3RlbQorICogICAgICBARiAgICAgIGZvciBAaSAlaSAoJVEpIGlzCisgKiAgICAgIEBnICAgICAgZ3JvdXAKKyAqICAgICAgQGggICAgICBIVFJFRSBkaXJlY3RvcnkgaW5vZGUKKyAqICAgICAgQGkgICAgICBpbm9kZQorICogICAgICBASSAgICAgIGlsbGVnYWwKKyAqICAgICAgQGogICAgICBqb3VybmFsCisgKiAgICAgIEBsICAgICAgbG9zdCtmb3VuZAorICogICAgICBATCAgICAgIGlzIGEgbGluaworICogICAgICBAbSAgICAgIG11bHRpcGx5LWNsYWltZWQKKyAqICAgICAgQG4gICAgICBpbnZhbGlkCisgKiAgICAgIEBvICAgICAgb3JwaGFuZWQKKyAqICAgICAgQHAgICAgICBwcm9ibGVtIGluCisgKiAgICAgIEByICAgICAgcm9vdCBpbm9kZQorICogICAgICBAcyAgICAgIHNob3VsZCBiZQorICogICAgICBAUyAgICAgIHN1cGVyYmxvY2sKKyAqICAgICAgQHUgICAgICB1bmF0dGFjaGVkCisgKiAgICAgIEB2ICAgICAgZGV2aWNlCisgKiAgICAgIEB6ICAgICAgemVyby1sZW5ndGgKKyAqLworCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhYmJyZXZpYXRpb25zIHVzZWQgYnkgdGhlIHRleHQgc3RyaW5ncworICogYmVsb3cuICBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgaXMgdGhlIGluZGV4IGxldHRlci4gIEFuCisgKiBhYmJyZXZpYXRpb24gb2YgdGhlIGZvcm0gJ0A8aT4nIGlzIGV4cGFuZGVkIGJ5IGxvb2tpbmcgdXAgdGhlIGluZGV4CisgKiBsZXR0ZXIgPGk+IGluIHRoZSB0YWJsZSBiZWxvdy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFiYnJldnNbXSA9IHsKKwlOXygiYWV4dGVuZGVkIGF0dHJpYnV0ZSIpLAorCU5fKCJBZXJyb3IgYWxsb2NhdGluZyIpLAorCU5fKCJiYmxvY2siKSwKKwlOXygiQmJpdG1hcCIpLAorCU5fKCJjY29tcHJlc3MiKSwKKwlOXygiQ2NvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgZnMgQGIiKSwKKwlOXygiaWlub2RlIiksCisJTl8oIklpbGxlZ2FsIiksCisJTl8oImpqb3VybmFsIiksCisJTl8oIkRkZWxldGVkIiksCisJTl8oImRkaXJlY3RvcnkiKSwKKwlOXygiZWVudHJ5IiksCisJTl8oIkVAZSAnJURuJyBpbiAlcCAoJWkpIiksCisJTl8oImZmaWxlc3lzdGVtIiksCisJTl8oIkZmb3IgQGkgJWkgKCVRKSBpcyIpLAorCU5fKCJnZ3JvdXAiKSwKKwlOXygiaEhUUkVFIEBkIEBpIiksCisJTl8oImxsb3N0K2ZvdW5kIiksCisJTl8oIkxpcyBhIGxpbmsiKSwKKwlOXygibW11bHRpcGx5LWNsYWltZWQiKSwKKwlOXygibmludmFsaWQiKSwKKwlOXygib29ycGhhbmVkIiksCisJTl8oInBwcm9ibGVtIGluIiksCisJTl8oInJyb290IEBpIiksCisJTl8oInNzaG91bGQgYmUiKSwKKwlOXygiU3N1cGVyQGIiKSwKKwlOXygidXVuYXR0YWNoZWQiKSwKKwlOXygidmRldmljZSIpLAorCU5fKCJ6emVyby1sZW5ndGgiKSwKKwkiQEAiLAorCTAKKwl9OworCisvKgorICogR2l2ZSBtb3JlIHVzZXIgZnJpZW5kbHkgbmFtZXMgdG8gdGhlICJzcGVjaWFsIiBpbm9kZXMuCisgKi8KKyNkZWZpbmUgbnVtX3NwZWNpYWxfaW5vZGVzICAgICAgMTEKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzcGVjaWFsX2lub2RlX25hbWVbXSA9Cit7CisJTl8oIjxUaGUgTlVMTCBpbm9kZT4iKSwgICAgICAgICAgICAgICAgIC8qIDAgKi8KKwlOXygiPFRoZSBiYWQgYmxvY2tzIGlub2RlPiIpLCAgICAgICAgICAgLyogMSAqLworCSIvIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCisJTl8oIjxUaGUgQUNMIGluZGV4IGlub2RlPiIpLCAgICAgICAgICAgIC8qIDMgKi8KKwlOXygiPFRoZSBBQ0wgZGF0YSBpbm9kZT4iKSwgICAgICAgICAgICAgLyogNCAqLworCU5fKCI8VGhlIGJvb3QgbG9hZGVyIGlub2RlPiIpLCAgICAgICAgICAvKiA1ICovCisJTl8oIjxUaGUgdW5kZWxldGUgZGlyZWN0b3J5IGlub2RlPiIpLCAgIC8qIDYgKi8KKwlOXygiPFRoZSBncm91cCBkZXNjcmlwdG9yIGlub2RlPiIpLCAgICAgLyogNyAqLworCU5fKCI8VGhlIGpvdXJuYWwgaW5vZGU+IiksICAgICAgICAgICAgICAvKiA4ICovCisJTl8oIjxSZXNlcnZlZCBpbm9kZSA5PiIpLCAgICAgICAgICAgICAgIC8qIDkgKi8KKwlOXygiPFJlc2VydmVkIGlub2RlIDEwPiIpLCAgICAgICAgICAgICAgLyogMTAgKi8KK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgInNhZmUiIHByaW50aW5nLiAgSXQgd2lsbCBjb252ZXJ0IG5vbi1wcmludGFibGUKKyAqIEFTQ0lJIGNoYXJhY3RlcnMgdXNpbmcgJ14nIGFuZCBNLSBub3RhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgc2FmZV9wcmludChjb25zdCBjaGFyICpjcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICAgY2g7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gc3RybGVuKGNwKTsKKworCXdoaWxlIChsZW4tLSkgeworCQljaCA9ICpjcCsrOworCQlpZiAoY2ggPiAxMjgpIHsKKwkJCWZwdXRzKCJNLSIsIHN0ZG91dCk7CisJCQljaCAtPSAxMjg7CisJCX0KKwkJaWYgKChjaCA8IDMyKSB8fCAoY2ggPT0gMHg3ZikpIHsKKwkJCWJiX3B1dGNoYXIoJ14nKTsKKwkJCWNoIF49IDB4NDA7IC8qIF5ALCBeQSwgXkI7IF4/IGZvciBERUwgKi8KKwkJfQorCQliYl9wdXRjaGFyKGNoKTsKKwl9Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJpbnRzIGEgcGF0aG5hbWUsIHVzaW5nIHRoZSBleHQyZnNfZ2V0X3BhdGhuYW1lCisgKiBmdW5jdGlvbgorICovCitzdGF0aWMgdm9pZCBwcmludF9wYXRobmFtZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGV4dDJfaW5vX3QgaW5vKQoreworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJY2hhciAgICAgICAgICAgICpwYXRoOworCisJaWYgKCFkaXIgJiYgKGlubyA8IG51bV9zcGVjaWFsX2lub2RlcykpIHsKKwkJZnB1dHMoXyhzcGVjaWFsX2lub2RlX25hbWVbaW5vXSksIHN0ZG91dCk7CisJCXJldHVybjsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X3BhdGhuYW1lKGZzLCBkaXIsIGlubywgJnBhdGgpOworCWlmIChyZXR2YWwpCisJCWZwdXRzKCI/Pz8iLCBzdGRvdXQpOworCWVsc2UgeworCQlzYWZlX3ByaW50KHBhdGgsIC0xKTsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZwYXRoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2UyZnNja19tZXNzYWdlKGUyZnNja190IGN0eCwgY29uc3QgY2hhciAqbXNnLAorCQkJICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LCBpbnQgZmlyc3QpOworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgJ0AnIGV4cGFuc2lvbi4gIFdlIGFsbG93IHJlY3Vyc2l2ZQorICogZXhwYW5zaW9uOyBhbiBAIGV4cHJlc3Npb24gY2FuIGNvbnRhaW4gZnVydGhlciAnQCcgYW5kICclJworICogZXhwcmVzc2lvbnMuCisgKi8KK3N0YXRpYyB2b2lkIGV4cGFuZF9hdF9leHByZXNzaW9uKGUyZnNja190IGN0eCwgY2hhciBjaCwKKwkJCQkJICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LAorCQkJCQkgIGludCAqZmlyc3QpCit7CisJY29uc3QgY2hhciAqY29uc3QgKmNwcDsKKwljb25zdCBjaGFyICpzdHI7CisKKwkvKiBTZWFyY2ggZm9yIHRoZSBhYmJyZXZpYXRpb24gKi8KKwlmb3IgKGNwcCA9IGFiYnJldnM7ICpjcHA7IGNwcCsrKSB7CisJCWlmIChjaCA9PSAqY3BwWzBdKQorCQkJYnJlYWs7CisJfQorCWlmICgqY3BwKSB7CisJCXN0ciA9IF8oKmNwcCkgKyAxOworCQlpZiAoKmZpcnN0ICYmIGlzbG93ZXIoKnN0cikpIHsKKwkJCSpmaXJzdCA9IDA7CisJCQliYl9wdXRjaGFyKHRvdXBwZXIoKnN0cisrKSk7CisJCX0KKwkJcHJpbnRfZTJmc2NrX21lc3NhZ2UoY3R4LCBzdHIsIHBjdHgsICpmaXJzdCk7CisJfSBlbHNlCisJCXByaW50ZigiQCVjIiwgY2gpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBleHBhbmRzICclSVgnIGV4cHJlc3Npb25zCisgKi8KK3N0YXRpYyB2b2lkIGV4cGFuZF9pbm9kZV9leHByZXNzaW9uKGNoYXIgY2gsCisJCQkJCSAgICAgc3RydWN0IHByb2JsZW1fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBleHQyX2lub2RlICAgICAgICppbm9kZTsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqbGFyZ2VfaW5vZGU7CisJY2hhciAqICAgICAgICAgICAgICAgICAgdGltZV9zdHI7CisJdGltZV90ICAgICAgICAgICAgICAgICAgdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBkb19nbXQgPSAtMTsKKworCWlmICghY3R4IHx8ICFjdHgtPmlub2RlKQorCQlnb3RvIG5vX2lub2RlOworCisJaW5vZGUgPSBjdHgtPmlub2RlOworCWxhcmdlX2lub2RlID0gKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGlub2RlOworCisJc3dpdGNoIChjaCkgeworCWNhc2UgJ3MnOgorCQlpZiAoTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXByaW50ZigiJXUiLCBpbm9kZS0+aV9zaXplKTsKKwkJZWxzZSB7CisJCQlwcmludGYoIiUiUFJJdTY0LCAoaW5vZGUtPmlfc2l6ZSB8CisJCQkJCSgodWludDY0X3QpIGlub2RlLT5pX3NpemVfaGlnaCA8PCAzMikpKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdTJzoKKwkJcHJpbnRmKCIldSIsIGxhcmdlX2lub2RlLT5pX2V4dHJhX2lzaXplKTsKKwkJYnJlYWs7CisJY2FzZSAnYic6CisJCXByaW50ZigiJXUiLCBpbm9kZS0+aV9ibG9ja3MpOworCQlicmVhazsKKwljYXNlICdsJzoKKwkJcHJpbnRmKCIlZCIsIGlub2RlLT5pX2xpbmtzX2NvdW50KTsKKwkJYnJlYWs7CisJY2FzZSAnbSc6CisJCXByaW50ZigiMCVvIiwgaW5vZGUtPmlfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgJ00nOgorCQkvKiBUaGUgZGlldCBsaWJjIGRvZXNuJ3QgcmVzcGVjdCB0aGUgVFogZW52aXJvbmVtbnQgdmFyaWFibGUgKi8KKwkJaWYgKGRvX2dtdCA9PSAtMSkgeworCQkJdGltZV9zdHIgPSBnZXRlbnYoIlRaIik7CisJCQlpZiAoIXRpbWVfc3RyKQorCQkJCXRpbWVfc3RyID0gIiI7CisJCQlkb19nbXQgPSAhc3RyY21wKHRpbWVfc3RyLCAiR01UIik7CisJCX0KKwkJdCA9IGlub2RlLT5pX210aW1lOworCQl0aW1lX3N0ciA9IGFzY3RpbWUoZG9fZ210ID8gZ210aW1lKCZ0KSA6IGxvY2FsdGltZSgmdCkpOworCQlwcmludGYoIiUuMjRzIiwgdGltZV9zdHIpOworCQlicmVhazsKKwljYXNlICdGJzoKKwkJcHJpbnRmKCIldSIsIGlub2RlLT5pX2ZhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSAnZic6CisJCXByaW50ZigiJXUiLCBpbm9kZS0+aV9maWxlX2FjbCk7CisJCWJyZWFrOworCWNhc2UgJ2QnOgorCQlwcmludGYoIiV1IiwgKExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkgPworCQkJICAgICAgaW5vZGUtPmlfZGlyX2FjbCA6IDApKTsKKwkJYnJlYWs7CisJY2FzZSAndSc6CisJCXByaW50ZigiJWQiLCAoaW5vZGUtPmlfdWlkIHwKKwkJCSAgICAgIChpbm9kZS0+b3NkMi5saW51eDIubF9pX3VpZF9oaWdoIDw8IDE2KSkpOworCQlicmVhazsKKwljYXNlICdnJzoKKwkJcHJpbnRmKCIlZCIsIChpbm9kZS0+aV9naWQgfAorCQkJICAgICAgKGlub2RlLT5vc2QyLmxpbnV4Mi5sX2lfZ2lkX2hpZ2ggPDwgMTYpKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJbm9faW5vZGU6CisJCXByaW50ZigiJSVJJWMiLCBjaCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyAnJWRYJyBleHByZXNzaW9ucworICovCitzdGF0aWMgdm9pZCBleHBhbmRfZGlyZW50X2V4cHJlc3Npb24oY2hhciBjaCwKKwkJCQkJICAgICAgc3RydWN0IHByb2JsZW1fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAgICpkaXJlbnQ7CisJaW50ICAgICBsZW47CisKKwlpZiAoIWN0eCB8fCAhY3R4LT5kaXJlbnQpCisJCWdvdG8gbm9fZGlyZW50OworCisJZGlyZW50ID0gY3R4LT5kaXJlbnQ7CisKKwlzd2l0Y2ggKGNoKSB7CisJY2FzZSAnaSc6CisJCXByaW50ZigiJXUiLCBkaXJlbnQtPmlub2RlKTsKKwkJYnJlYWs7CisJY2FzZSAnbic6CisJCWxlbiA9IGRpcmVudC0+bmFtZV9sZW4gJiAweEZGOworCQlpZiAobGVuID4gRVhUMl9OQU1FX0xFTikKKwkJCWxlbiA9IEVYVDJfTkFNRV9MRU47CisJCWlmIChsZW4gPiBkaXJlbnQtPnJlY19sZW4pCisJCQlsZW4gPSBkaXJlbnQtPnJlY19sZW47CisJCXNhZmVfcHJpbnQoZGlyZW50LT5uYW1lLCBsZW4pOworCQlicmVhazsKKwljYXNlICdyJzoKKwkJcHJpbnRmKCIldSIsIGRpcmVudC0+cmVjX2xlbik7CisJCWJyZWFrOworCWNhc2UgJ2wnOgorCQlwcmludGYoIiV1IiwgZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpOworCQlicmVhazsKKwljYXNlICd0JzoKKwkJcHJpbnRmKCIldSIsIGRpcmVudC0+bmFtZV9sZW4gPj4gOCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJbm9fZGlyZW50OgorCQlwcmludGYoIiUlRCVjIiwgY2gpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV4cGFuZF9wZXJjZW50X2V4cHJlc3Npb24oZXh0Ml9maWxzeXMgZnMsIGNoYXIgY2gsCisJCQkJCSAgICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpjdHgpCit7CisJaWYgKCFjdHgpCisJCWdvdG8gbm9fY29udGV4dDsKKworCXN3aXRjaCAoY2gpIHsKKwljYXNlICclJzoKKwkJYmJfcHV0Y2hhcignJScpOworCQlicmVhazsKKwljYXNlICdiJzoKKwkJcHJpbnRmKCIldSIsIGN0eC0+YmxrKTsKKwkJYnJlYWs7CisJY2FzZSAnQic6CisJCXByaW50ZigiJSJQUklpNjQsIGN0eC0+YmxrY291bnQpOworCQlicmVhazsKKwljYXNlICdjJzoKKwkJcHJpbnRmKCIldSIsIGN0eC0+YmxrMik7CisJCWJyZWFrOworCWNhc2UgJ2QnOgorCQlwcmludGYoIiV1IiwgY3R4LT5kaXIpOworCQlicmVhazsKKwljYXNlICdnJzoKKwkJcHJpbnRmKCIlZCIsIGN0eC0+Z3JvdXApOworCQlicmVhazsKKwljYXNlICdpJzoKKwkJcHJpbnRmKCIldSIsIGN0eC0+aW5vKTsKKwkJYnJlYWs7CisJY2FzZSAnaic6CisJCXByaW50ZigiJXUiLCBjdHgtPmlubzIpOworCQlicmVhazsKKwljYXNlICdtJzoKKwkJZnB1dHMoZXJyb3JfbWVzc2FnZShjdHgtPmVycmNvZGUpLCBzdGRvdXQpOworCQlicmVhazsKKwljYXNlICdOJzoKKwkJcHJpbnRmKCIlIlBSSWk2NCwgY3R4LT5udW0pOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJcHJpbnRfcGF0aG5hbWUoZnMsIGN0eC0+aW5vLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAnUCc6CisJCXByaW50X3BhdGhuYW1lKGZzLCBjdHgtPmlubzIsCisJCQkgICAgICAgY3R4LT5kaXJlbnQgPyBjdHgtPmRpcmVudC0+aW5vZGUgOiAwKTsKKwkJYnJlYWs7CisJY2FzZSAncSc6CisJCXByaW50X3BhdGhuYW1lKGZzLCBjdHgtPmRpciwgMCk7CisJCWJyZWFrOworCWNhc2UgJ1EnOgorCQlwcmludF9wYXRobmFtZShmcywgY3R4LT5kaXIsIGN0eC0+aW5vKTsKKwkJYnJlYWs7CisJY2FzZSAnUyc6CisJCXByaW50ZigiJWQiLCBnZXRfYmFja3VwX3NiKE5VTEwsIGZzLCBOVUxMLCBOVUxMKSk7CisJCWJyZWFrOworCWNhc2UgJ3MnOgorCQlmcHV0cygoY3R4LT5zdHIgPyBjdHgtPnN0ciA6ICJOVUxMIiksIHN0ZG91dCk7CisJCWJyZWFrOworCWNhc2UgJ1gnOgorCQlwcmludGYoIjB4JSJQUklpNjQsIGN0eC0+bnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwlub19jb250ZXh0OgorCQlwcmludGYoIiUlJWMiLCBjaCk7CisJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgdm9pZCBwcmludF9lMmZzY2tfbWVzc2FnZShlMmZzY2tfdCBjdHgsIGNvbnN0IGNoYXIgKm1zZywKKwkJCSAgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCwgaW50IGZpcnN0KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwljb25zdCBjaGFyICogICAgY3A7CisJaW50ICAgICAgICAgICAgIGk7CisKKwllMmZzY2tfY2xlYXJfcHJvZ2JhcihjdHgpOworCWZvciAoY3AgPSBtc2c7ICpjcDsgY3ArKykgeworCQlpZiAoY3BbMF0gPT0gJ0AnKSB7CisJCQljcCsrOworCQkJZXhwYW5kX2F0X2V4cHJlc3Npb24oY3R4LCAqY3AsIHBjdHgsICZmaXJzdCk7CisJCX0gZWxzZSBpZiAoY3BbMF0gPT0gJyUnICYmIGNwWzFdID09ICdJJykgeworCQkJY3AgKz0gMjsKKwkJCWV4cGFuZF9pbm9kZV9leHByZXNzaW9uKCpjcCwgcGN0eCk7CisJCX0gZWxzZSBpZiAoY3BbMF0gPT0gJyUnICYmIGNwWzFdID09ICdEJykgeworCQkJY3AgKz0gMjsKKwkJCWV4cGFuZF9kaXJlbnRfZXhwcmVzc2lvbigqY3AsIHBjdHgpOworCQl9IGVsc2UgaWYgKChjcFswXSA9PSAnJScpKSB7CisJCQljcCsrOworCQkJZXhwYW5kX3BlcmNlbnRfZXhwcmVzc2lvbihmcywgKmNwLCBwY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaT0wOyBjcFtpXTsgaSsrKQorCQkJCWlmICgoY3BbaV0gPT0gJ0AnKSB8fCBjcFtpXSA9PSAnJScpCisJCQkJCWJyZWFrOworCQkJcHJpbnRmKCIlLipzIiwgaSwgY3ApOworCQkJY3AgKz0gaS0xOworCQl9CisJCWZpcnN0ID0gMDsKKwl9Cit9CisKKworLyoKKyAqIHJlZ2lvbi5jIC0tLSBjb2RlIHdoaWNoIG1hbmFnZXMgYWxsb2NhdGlvbnMgd2l0aGluIGEgcmVnaW9uLgorICovCisKK3N0cnVjdCByZWdpb25fZWwgeworCXJlZ2lvbl9hZGRyX3QgICBzdGFydDsKKwlyZWdpb25fYWRkcl90ICAgZW5kOworCXN0cnVjdCByZWdpb25fZWwgKm5leHQ7Cit9OworCitzdHJ1Y3QgcmVnaW9uX3N0cnVjdCB7CisJcmVnaW9uX2FkZHJfdCAgIG1pbjsKKwlyZWdpb25fYWRkcl90ICAgbWF4OworCXN0cnVjdCByZWdpb25fZWwgKmFsbG9jYXRlZDsKK307CisKK3N0YXRpYyByZWdpb25fdCByZWdpb25fY3JlYXRlKHJlZ2lvbl9hZGRyX3QgbWluLCByZWdpb25fYWRkcl90IG1heCkKK3sKKwlyZWdpb25fdCAgICAgICAgcmVnaW9uOworCisJcmVnaW9uID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHJlZ2lvbl9zdHJ1Y3QpKTsKKwlyZWdpb24tPm1pbiA9IG1pbjsKKwlyZWdpb24tPm1heCA9IG1heDsKKwlyZXR1cm4gcmVnaW9uOworfQorCitzdGF0aWMgdm9pZCByZWdpb25fZnJlZShyZWdpb25fdCByZWdpb24pCit7CisJc3RydWN0IHJlZ2lvbl9lbCAgICAgICAgKnIsICpuZXh0OworCisJZm9yIChyID0gcmVnaW9uLT5hbGxvY2F0ZWQ7IHI7IHIgPSBuZXh0KSB7CisJCW5leHQgPSByLT5uZXh0OworCQlmcmVlKHIpOworCX0KKwltZW1zZXQocmVnaW9uLCAwLCBzaXplb2Yoc3RydWN0IHJlZ2lvbl9zdHJ1Y3QpKTsKKwlmcmVlKHJlZ2lvbik7Cit9CisKK3N0YXRpYyBpbnQgcmVnaW9uX2FsbG9jYXRlKHJlZ2lvbl90IHJlZ2lvbiwgcmVnaW9uX2FkZHJfdCBzdGFydCwgaW50IG4pCit7CisJc3RydWN0IHJlZ2lvbl9lbCAgICAgICAgKnIsICpuZXdfcmVnaW9uLCAqcHJldiwgKm5leHQ7CisJcmVnaW9uX2FkZHJfdCBlbmQ7CisKKwllbmQgPSBzdGFydCtuOworCWlmICgoc3RhcnQgPCByZWdpb24tPm1pbikgfHwgKGVuZCA+IHJlZ2lvbi0+bWF4KSkKKwkJcmV0dXJuIC0xOworCWlmIChuID09IDApCisJCXJldHVybiAxOworCisJLyoKKwkgKiBTZWFyY2ggdGhyb3VnaCB0aGUgbGlua2VkIGxpc3QuICBJZiB3ZSBmaW5kIHRoYXQgaXQKKwkgKiBjb25mbGljdHMgd2l0aWggc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IGFsbG9jYXRlZCwgcmV0dXJuCisJICogMTsgaWYgd2UgY2FuIGZpbmQgYW4gZXhpc3RpbmcgcmVnaW9uIHdoaWNoIHdlIGNhbiBncm93LCBkbworCSAqIHNvLiAgT3RoZXJ3aXNlLCBzdG9wIHdoZW4gd2UgZmluZCB0aGUgYXBwcm9wcmlhdGUgcGxhY2UKKwkgKiBpbnNlcnQgYSBuZXcgcmVnaW9uIGVsZW1lbnQgaW50byB0aGUgbGlua2VkIGxpc3QuCisJICovCisJZm9yIChyID0gcmVnaW9uLT5hbGxvY2F0ZWQsIHByZXY9TlVMTDsgcjsgcHJldiA9IHIsIHIgPSByLT5uZXh0KSB7CisJCWlmICgoKHN0YXJ0ID49IHItPnN0YXJ0KSAmJiAoc3RhcnQgPCByLT5lbmQpKSB8fAorCQkgICAgKChlbmQgPiByLT5zdGFydCkgJiYgKGVuZCA8PSByLT5lbmQpKSB8fAorCQkgICAgKChzdGFydCA8PSByLT5zdGFydCkgJiYgKGVuZCA+PSByLT5lbmQpKSkKKwkJCXJldHVybiAxOworCQlpZiAoZW5kID09IHItPnN0YXJ0KSB7CisJCQlyLT5zdGFydCA9IHN0YXJ0OworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHN0YXJ0ID09IHItPmVuZCkgeworCQkJaWYgKChuZXh0ID0gci0+bmV4dCkpIHsKKwkJCQlpZiAoZW5kID4gbmV4dC0+c3RhcnQpCisJCQkJCXJldHVybiAxOworCQkJCWlmIChlbmQgPT0gbmV4dC0+c3RhcnQpIHsKKwkJCQkJci0+ZW5kID0gbmV4dC0+ZW5kOworCQkJCQlyLT5uZXh0ID0gbmV4dC0+bmV4dDsKKwkJCQkJZnJlZShuZXh0KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJci0+ZW5kID0gZW5kOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHN0YXJ0IDwgci0+c3RhcnQpCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBJbnNlcnQgYSBuZXcgcmVnaW9uIGVsZW1lbnQgc3RydWN0dXJlIGludG8gdGhlIGxpbmtlZCBsaXN0CisJICovCisJbmV3X3JlZ2lvbiA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWdpb25fZWwpKTsKKwluZXdfcmVnaW9uLT5zdGFydCA9IHN0YXJ0OworCW5ld19yZWdpb24tPmVuZCA9IHN0YXJ0ICsgbjsKKwluZXdfcmVnaW9uLT5uZXh0ID0gcjsKKwlpZiAocHJldikKKwkJcHJldi0+bmV4dCA9IG5ld19yZWdpb247CisJZWxzZQorCQlyZWdpb24tPmFsbG9jYXRlZCA9IG5ld19yZWdpb247CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXNzMS5jIC0tIHBhc3MgIzEgb2YgZTJmc2NrOiBzZXF1ZW50aWFsIHNjYW4gb2YgdGhlIGlub2RlIHRhYmxlCisgKgorICogUGFzcyAxIG9mIGUyZnNjayBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgaW5vZGVzIGluIHRoZSBmaWxlc3lzdGVtcywKKyAqIGFuZCBhcHBsaWVzIHRoZSBmb2xsb3dpbmcgdGVzdHMgdG8gZWFjaCBpbm9kZToKKyAqCisgKiAgICAgIC0gVGhlIG1vZGUgZmllbGQgb2YgdGhlIGlub2RlIG11c3QgYmUgbGVnYWwuCisgKiAgICAgIC0gVGhlIHNpemUgYW5kIGJsb2NrIGNvdW50IGZpZWxkcyBvZiB0aGUgaW5vZGUgYXJlIGNvcnJlY3QuCisgKiAgICAgIC0gQSBkYXRhIGJsb2NrIG11c3Qgbm90IGJlIHVzZWQgYnkgYW5vdGhlciBpbm9kZQorICoKKyAqIFBhc3MgMSBhbHNvIGdhdGhlcnMgdGhlIGNvbGxlY3RzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgKgorICogICAgICAtIEEgYml0bWFwIG9mIHdoaWNoIGlub2RlcyBhcmUgaW4gdXNlLiAgICAgICAgICAoaW5vZGVfdXNlZF9tYXApCisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggaW5vZGVzIGFyZSBkaXJlY3Rvcmllcy4gICAgIChpbm9kZV9kaXJfbWFwKQorICogICAgICAtIEEgYml0bWFwIG9mIHdoaWNoIGlub2RlcyBhcmUgcmVndWxhciBmaWxlcy4gICAoaW5vZGVfcmVnX21hcCkKKyAqICAgICAgLSBBIGJpdG1hcCBvZiB3aGljaCBpbm9kZXMgaGF2ZSBiYWQgZmllbGRzLiAgICAgKGlub2RlX2JhZF9tYXApCisgKiAgICAgIC0gQSBiaXRtYXAgb2Ygd2hpY2ggaW5vZGVzIGFyZSBpbWFnaWMgaW5vZGVzLiAgIChpbm9kZV9pbWFnaWNfbWFwKQorICogICAgICAtIEEgYml0bWFwIG9mIHdoaWNoIGJsb2NrcyBhcmUgaW4gdXNlLiAgICAgICAgICAoYmxvY2tfZm91bmRfbWFwKQorICogICAgICAtIEEgYml0bWFwIG9mIHdoaWNoIGJsb2NrcyBhcmUgaW4gdXNlIGJ5IHR3byBpbm9kZXMgICAgIChibG9ja19kdXBfbWFwKQorICogICAgICAtIFRoZSBkYXRhIGJsb2NrcyBvZiB0aGUgZGlyZWN0b3J5IGlub2Rlcy4gICAgICAoZGlyX21hcCkKKyAqCisgKiBQYXNzIDEgaXMgZGVzaWduZWQgdG8gc3Rhc2ggYXdheSBlbm91Z2ggaW5mb3JtYXRpb24gc28gdGhhdCB0aGUKKyAqIG90aGVyIHBhc3NlcyBzaG91bGQgbm90IG5lZWQgdG8gcmVhZCBpbiB0aGUgaW5vZGUgaW5mb3JtYXRpb24KKyAqIGR1cmluZyB0aGUgbm9ybWFsIGNvdXJzZSBvZiBhIGZpbGVzeXN0ZW0gY2hlY2suICAoQWx0aG9naCBpZiBhbgorICogaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZCwgb3RoZXIgcGFzc2VzIG1heSBuZWVkIHRvIHJlYWQgaW4gYW4KKyAqIGlub2RlIHRvIGZpeCBpdC4pCisgKgorICogTm90ZSB0aGF0IHBhc3MgMUIgd2lsbCBiZSBpbnZva2VkIGlmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIGJsb2NrcworICogZm91bmQuCisgKi8KKworCitzdGF0aWMgaW50IHByb2Nlc3NfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190ICAqYmxvY2tuciwKKwkJCSBlMl9ibGtjbnRfdCBibG9ja2NudCwgYmxrX3QgcmVmX2JsaywKKwkJCSBpbnQgcmVmX29mZnNldCwgdm9pZCAqcHJpdl9kYXRhKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19iYWRfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwKKwkJCSAgICAgZTJfYmxrY250X3QgYmxvY2tjbnQsIGJsa190IHJlZl9ibGssCisJCQkgICAgIGludCByZWZfb2Zmc2V0LCB2b2lkICpwcml2X2RhdGEpOworc3RhdGljIHZvaWQgY2hlY2tfYmxvY2tzKGUyZnNja190IGN0eCwgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCwKKwkJCSBjaGFyICpibG9ja19idWYpOworc3RhdGljIHZvaWQgbWFya190YWJsZV9ibG9ja3MoZTJmc2NrX3QgY3R4KTsKK3N0YXRpYyB2b2lkIGFsbG9jX2ltYWdpY19tYXAoZTJmc2NrX3QgY3R4KTsKK3N0YXRpYyB2b2lkIG1hcmtfaW5vZGVfYmFkKGUyZnNja190IGN0eCwgaW5vX3QgaW5vKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9mc19iYWRfYmxvY2tzKGUyZnNja190IGN0eCk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX2lub2RlcyhlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1Zik7CitzdGF0aWMgaW50IHByb2Nlc3NfaW5vZGVfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworc3RhdGljIGVycmNvZGVfdCBzY2FuX2NhbGxiYWNrKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgZGdycF90IGdyb3VwLCB2b2lkICogcHJpdl9kYXRhKTsKK3N0YXRpYyB2b2lkIGFkanVzdF9leHRhdHRyX3JlZmNvdW50KGUyZnNja190IGN0eCwgZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50LAorCQkJCSAgICBjaGFyICpibG9ja19idWYsIGludCBhZGp1c3Rfc2lnbik7CisvKiBzdGF0aWMgY2hhciAqZGVzY3JpYmVfaWxsZWdhbF9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2spOyAqLworCitzdGF0aWMgdm9pZCBlMmZzY2tfd3JpdGVfaW5vZGVfZnVsbChlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGxvbmcgaW5vLAorCQkJICAgICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsIGludCBidWZzaXplLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb2MpOworCitzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMSB7CisJZXh0Ml9pbm9fdCAgICAgIGlubzsKKwl1bnNpZ25lZCAgICAgICAgaXNfZGlyOjEsIGlzX3JlZzoxLCBjbGVhcjoxLCBzdXBwcmVzczoxLAorCQkJCWZyYWdtZW50ZWQ6MSwgY29tcHJlc3NlZDoxLCBiYmNoZWNrOjE7CisJYmxrX3QgICAgICAgICAgIG51bV9ibG9ja3M7CisJYmxrX3QgICAgICAgICAgIG1heF9ibG9ja3M7CisJZTJfYmxrY250X3QgICAgIGxhc3RfYmxvY2s7CisJaW50ICAgICAgICAgICAgIG51bV9pbGxlZ2FsX2Jsb2NrczsKKwlibGtfdCAgICAgICAgICAgcHJldmlvdXNfYmxvY2s7CisJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHg7CisJZXh0MmZzX2Jsb2NrX2JpdG1hcCBmc19tZXRhX2Jsb2NrczsKKwllMmZzY2tfdCAgICAgICAgY3R4OworfTsKKworc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgeworCWV4dDJfaW5vX3QgaW5vOworCXN0cnVjdCBleHQyX2lub2RlIGlub2RlOworfTsKKworc3RydWN0IHNjYW5fY2FsbGJhY2tfc3RydWN0IHsKKwllMmZzY2tfdCAgICAgICAgY3R4OworCWNoYXIgICAgICAgICAgICAqYmxvY2tfYnVmOworfTsKKworLyoKKyAqIEZvciB0aGUgaW5vZGVzIHRvIHByb2Nlc3MgbGlzdC4KKyAqLworc3RhdGljIHN0cnVjdCBwcm9jZXNzX2lub2RlX2Jsb2NrICppbm9kZXNfdG9fcHJvY2VzczsKK3N0YXRpYyBpbnQgcHJvY2Vzc19pbm9kZV9jb3VudDsKKworc3RhdGljIF9fdTY0IGV4dDJfbWF4X3NpemVzW0VYVDJfTUFYX0JMT0NLX0xPR19TSVpFIC0KKwkJCSAgICBFWFQyX01JTl9CTE9DS19MT0dfU0laRSArIDFdOworCisvKgorICogRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBwYXNzMSBpbiBwcmVwYXJhdGlvbiBmb3IgcmVzdGFydGluZworICogdGhpbmdzLgorICovCitzdGF0aWMgdm9pZCB1bndpbmRfcGFzczEodm9pZCkKK3sKKwlleHQyZnNfZnJlZV9tZW0oJmlub2Rlc190b19wcm9jZXNzKTsKK30KKworLyoKKyAqIENoZWNrIHRvIG1ha2Ugc3VyZSBhIGRldmljZSBpbm9kZSBpcyByZWFsLiAgUmV0dXJucyAxIGlmIHRoZSBkZXZpY2UKKyAqIGNoZWNrcyBvdXQsIDAgaWYgbm90LgorICoKKyAqIE5vdGU6IHRoaXMgcm91dGluZSBpcyBub3cgYWxzbyB1c2VkIHRvIGNoZWNrIEZJRk8ncyBhbmQgU29ja2V0cywKKyAqIHNpbmNlIHRoZXkgaGF2ZSB0aGUgc2FtZSByZXF1aXJlbWVudDsgdGhlIGlfYmxvY2sgZmllbGRzIHNob3VsZCBiZQorICogemVyby4KKyAqLworc3RhdGljIGludAorZTJmc2NrX3Bhc3MxX2NoZWNrX2RldmljZV9pbm9kZShleHQyX2ZpbHN5cyBmcywgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQoreworCWludCAgICAgaTsKKworCS8qCisJICogSWYgaV9ibG9ja3MgaXMgbm9uLXplcm8sIG9yIHRoZSBpbmRleCBmbGFnIGlzIHNldCwgdGhlbgorCSAqIHRoaXMgaXMgYSBib2d1cyBkZXZpY2UvZmlmby9zb2NrZXQKKwkgKi8KKwlpZiAoKGV4dDJmc19pbm9kZV9kYXRhX2Jsb2NrcyhmcywgaW5vZGUpICE9IDApIHx8CisJICAgIChpbm9kZS0+aV9mbGFncyAmIEVYVDJfSU5ERVhfRkwpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gdGhlIHRlc3QgYmVsb3cgYWxsIHRoZSB0aW1lLCBidXQKKwkgKiBiZWNhdXNlIHRoZSBrZXJuZWwgZG9lc24ndCBmb3JjaWJseSBjbGVhciB0aGUgZGV2aWNlCisJICogaW5vZGUncyBhZGRpdGlvbmFsIGlfYmxvY2sgZmllbGRzLCB0aGVyZSBhcmUgc29tZSByYXJlCisJICogb2NjYXNpb25zIHdoZW4gYSBsZWdpdGltYXRlIGRldmljZSBpbm9kZSB3aWxsIGhhdmUgbm9uLXplcm8KKwkgKiBhZGRpdGlvbmFsIGlfYmxvY2sgZmllbGRzLiAgU28gZm9yIG5vdywgd2Ugb25seSBjb21wbGFpbgorCSAqIHdoZW4gdGhlIGltbXV0YWJsZSBmbGFnIGlzIHNldCwgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbgorCSAqIGZvciBkZXZpY2VzLiAgKEFuZCB0aGF0J3Mgd2hlbiB0aGUgcHJvYmxlbSBpcyBjYXVzZWQsIHNpbmNlCisJICogeW91IGNhbid0IHNldCBvciBjbGVhciBpbW11dGFibGUgZmxhZ3MgZm9yIGRldmljZXMuKSAgT25jZQorCSAqIHRoZSBrZXJuZWwgaGFzIGJlZW4gZml4ZWQgd2UgY2FuIGNoYW5nZSB0aGlzLi4uCisJICovCisJaWYgKGlub2RlLT5pX2ZsYWdzICYgKEVYVDJfSU1NVVRBQkxFX0ZMIHwgRVhUMl9BUFBFTkRfRkwpKSB7CisJCWZvciAoaT00OyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKQorCQkJaWYgKGlub2RlLT5pX2Jsb2NrW2ldKQorCQkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrIHRvIG1ha2Ugc3VyZSBhIHN5bWxpbmsgaW5vZGUgaXMgcmVhbC4gIFJldHVybnMgMSBpZiB0aGUgc3ltbGluaworICogY2hlY2tzIG91dCwgMCBpZiBub3QuCisgKi8KK3N0YXRpYyBpbnQKK2UyZnNja19wYXNzMV9jaGVja19zeW1saW5rKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCBpOworCWJsa190ICAgYmxvY2tzOworCisJaWYgKChpbm9kZS0+aV9zaXplX2hpZ2ggfHwgaW5vZGUtPmlfc2l6ZSA9PSAwKSB8fAorCSAgICAoaW5vZGUtPmlfZmxhZ3MgJiBFWFQyX0lOREVYX0ZMKSkKKwkJcmV0dXJuIDA7CisKKwlibG9ja3MgPSBleHQyZnNfaW5vZGVfZGF0YV9ibG9ja3MoZnMsIGlub2RlKTsKKwlpZiAoYmxvY2tzKSB7CisJCWlmICgoaW5vZGUtPmlfc2l6ZSA+PSBmcy0+YmxvY2tzaXplKSB8fAorCQkgICAgKGJsb2NrcyAhPSBmcy0+YmxvY2tzaXplID4+IDkpIHx8CisJCSAgICAoaW5vZGUtPmlfYmxvY2tbMF0gPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkJICAgIChpbm9kZS0+aV9ibG9ja1swXSA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkKKwkJCXJldHVybiAwOworCisJCWZvciAoaSA9IDE7IGkgPCBFWFQyX05fQkxPQ0tTOyBpKyspCisJCQlpZiAoaW5vZGUtPmlfYmxvY2tbaV0pCisJCQkJcmV0dXJuIDA7CisKKwkJaWYgKGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBpbm9kZS0+aV9ibG9ja1swXSwgMSwgYnVmKSkKKwkJCXJldHVybiAwOworCisJCWxlbiA9IHN0cm5sZW4oYnVmLCBmcy0+YmxvY2tzaXplKTsKKwkJaWYgKGxlbiA9PSBmcy0+YmxvY2tzaXplKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGlub2RlLT5pX3NpemUgPj0gc2l6ZW9mKGlub2RlLT5pX2Jsb2NrKSkKKwkJCXJldHVybiAwOworCisJCWxlbiA9IHN0cm5sZW4oKGNoYXIgKilpbm9kZS0+aV9ibG9jaywgc2l6ZW9mKGlub2RlLT5pX2Jsb2NrKSk7CisJCWlmIChsZW4gPT0gc2l6ZW9mKGlub2RlLT5pX2Jsb2NrKSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAobGVuICE9IGlub2RlLT5pX3NpemUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogSWYgdGhlIGltbXV0YWJsZSAob3IgYXBwZW5kLW9ubHkpIGZsYWcgaXMgc2V0IG9uIHRoZSBpbm9kZSwgb2ZmZXIKKyAqIHRvIGNsZWFyIGl0LgorICovCisjZGVmaW5lIEJBRF9TUEVDSUFMX0ZMQUdTIChFWFQyX0lNTVVUQUJMRV9GTCB8IEVYVDJfQVBQRU5EX0ZMKQorc3RhdGljIHZvaWQgY2hlY2tfaW1tdXRhYmxlKGUyZnNja190IGN0eCwgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlpZiAoIShwY3R4LT5pbm9kZS0+aV9mbGFncyAmIEJBRF9TUEVDSUFMX0ZMQUdTKSkKKwkJcmV0dXJuOworCisJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzFfU0VUX0lNTVVUQUJMRSwgcGN0eCkpCisJCXJldHVybjsKKworCXBjdHgtPmlub2RlLT5pX2ZsYWdzICY9IH5CQURfU1BFQ0lBTF9GTEFHUzsKKwllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBwY3R4LT5pbm8sIHBjdHgtPmlub2RlLCAicGFzczEiKTsKK30KKworLyoKKyAqIElmIGRldmljZSwgZmlmbyBvciBzb2NrZXQsIGNoZWNrIHNpemUgaXMgemVybyAtLSBpZiBub3Qgb2ZmZXIgdG8KKyAqIGNsZWFyIGl0CisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3NpemUoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZSA9IHBjdHgtPmlub2RlOworCisJaWYgKChpbm9kZS0+aV9zaXplID09IDApICYmIChpbm9kZS0+aV9zaXplX2hpZ2ggPT0gMCkpCisJCXJldHVybjsKKworCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8xX1NFVF9OT05aU0laRSwgcGN0eCkpCisJCXJldHVybjsKKworCWlub2RlLT5pX3NpemUgPSAwOworCWlub2RlLT5pX3NpemVfaGlnaCA9IDA7CisJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgcGN0eC0+aW5vLCBwY3R4LT5pbm9kZSwgInBhc3MxIik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2VhX2luX2lub2RlKGUyZnNja190IGN0eCwgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqaW5vZGU7CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKmVudHJ5OworCWNoYXIgKnN0YXJ0LCAqZW5kOworCWludCBzdG9yYWdlX3NpemUsIHJlbWFpbiwgb2ZmczsKKwlpbnQgcHJvYmxlbSA9IDA7CisKKwlpbm9kZSA9IChzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBwY3R4LT5pbm9kZTsKKwlzdG9yYWdlX3NpemUgPSBFWFQyX0lOT0RFX1NJWkUoY3R4LT5mcy0+c3VwZXIpIC0gRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIC0KKwkJaW5vZGUtPmlfZXh0cmFfaXNpemU7CisJc3RhcnQgPSAoKGNoYXIgKikgaW5vZGUpICsgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFICsKKwkJaW5vZGUtPmlfZXh0cmFfaXNpemUgKyBzaXplb2YoX191MzIpOworCWVuZCA9IChjaGFyICopIGlub2RlICsgRVhUMl9JTk9ERV9TSVpFKGN0eC0+ZnMtPnN1cGVyKTsKKwllbnRyeSA9IChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqKSBzdGFydDsKKworCS8qIHNjYW4gYWxsIGVudHJ5J3MgaGVhZGVycyBmaXJzdCAqLworCisJLyogdGFrZSBmaW5pc2ggZW50cnkgMFVMIGludG8gYWNjb3VudCAqLworCXJlbWFpbiA9IHN0b3JhZ2Vfc2l6ZSAtIHNpemVvZihfX3UzMik7CisJb2ZmcyA9IGVuZCAtIHN0YXJ0OworCisJd2hpbGUgKCFFWFQyX0VYVF9JU19MQVNUX0VOVFJZKGVudHJ5KSkgeworCisJCS8qIGhlYWRlciBlYXRzIHRoaXMgc3BhY2UgKi8KKwkJcmVtYWluIC09IHNpemVvZihzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSk7CisKKwkJLyogaXMgYXR0cmlidXRlIG5hbWUgdmFsaWQ/ICovCisJCWlmIChFWFQyX0VYVF9BVFRSX1NJWkUoZW50cnktPmVfbmFtZV9sZW4pID4gcmVtYWluKSB7CisJCQlwY3R4LT5udW0gPSBlbnRyeS0+ZV9uYW1lX2xlbjsKKwkJCXByb2JsZW0gPSBQUl8xX0FUVFJfTkFNRV9MRU47CisJCQlnb3RvIGZpeDsKKwkJfQorCisJCS8qIGF0dHJpYnV0ZSBsZW4gZWF0cyB0aGlzIHNwYWNlICovCisJCXJlbWFpbiAtPSBFWFQyX0VYVF9BVFRSX1NJWkUoZW50cnktPmVfbmFtZV9sZW4pOworCisJCS8qIGNoZWNrIHZhbHVlIHNpemUgKi8KKwkJaWYgKGVudHJ5LT5lX3ZhbHVlX3NpemUgPT0gMCB8fCBlbnRyeS0+ZV92YWx1ZV9zaXplID4gcmVtYWluKSB7CisJCQlwY3R4LT5udW0gPSBlbnRyeS0+ZV92YWx1ZV9zaXplOworCQkJcHJvYmxlbSA9IFBSXzFfQVRUUl9WQUxVRV9TSVpFOworCQkJZ290byBmaXg7CisJCX0KKworCQkvKiBjaGVjayB2YWx1ZSBwbGFjZW1lbnQgKi8KKwkJaWYgKGVudHJ5LT5lX3ZhbHVlX29mZnMgKworCQkgICAgRVhUMl9YQVRUUl9TSVpFKGVudHJ5LT5lX3ZhbHVlX3NpemUpICE9IG9mZnMpIHsKKwkJCXByaW50ZigiKGVudHJ5LT5lX3ZhbHVlX29mZnMgKyBlbnRyeS0+ZV92YWx1ZV9zaXplOiAlZCwgb2ZmczogJWQpXG4iLCBlbnRyeS0+ZV92YWx1ZV9vZmZzICsgZW50cnktPmVfdmFsdWVfc2l6ZSwgb2Zmcyk7CisJCQlwY3R4LT5udW0gPSBlbnRyeS0+ZV92YWx1ZV9vZmZzOworCQkJcHJvYmxlbSA9IFBSXzFfQVRUUl9WQUxVRV9PRkZTRVQ7CisJCQlnb3RvIGZpeDsKKwkJfQorCisJCS8qIGVfdmFsdWVfYmxvY2sgbXVzdCBiZSAwIGluIGlub2RlJ3MgZWEgKi8KKwkJaWYgKGVudHJ5LT5lX3ZhbHVlX2Jsb2NrICE9IDApIHsKKwkJCXBjdHgtPm51bSA9IGVudHJ5LT5lX3ZhbHVlX2Jsb2NrOworCQkJcHJvYmxlbSA9IFBSXzFfQVRUUl9WQUxVRV9CTE9DSzsKKwkJCWdvdG8gZml4OworCQl9CisKKwkJLyogZV9oYXNoIG11c3QgYmUgMCBpbiBpbm9kZSdzIGVhICovCisJCWlmIChlbnRyeS0+ZV9oYXNoICE9IDApIHsKKwkJCXBjdHgtPm51bSA9IGVudHJ5LT5lX2hhc2g7CisJCQlwcm9ibGVtID0gUFJfMV9BVFRSX0hBU0g7CisJCQlnb3RvIGZpeDsKKwkJfQorCisJCXJlbWFpbiAtPSBlbnRyeS0+ZV92YWx1ZV9zaXplOworCQlvZmZzIC09IEVYVDJfWEFUVFJfU0laRShlbnRyeS0+ZV92YWx1ZV9zaXplKTsKKworCQllbnRyeSA9IEVYVDJfRVhUX0FUVFJfTkVYVChlbnRyeSk7CisJfQorZml4OgorCS8qCisJICogaXQgc2VlbXMgbGlrZSBhIGNvcnJ1cHRpb24uIGl0J3MgdmVyeSB1bmxpa2VseSB3ZSBjb3VsZCByZXBhaXIKKwkgKiBFQShzKSBpbiBhdXRvbWF0aWMgZmFzaGlvbiAtYnp6egorCSAqLworCWlmIChwcm9ibGVtID09IDAgfHwgIWZpeF9wcm9ibGVtKGN0eCwgcHJvYmxlbSwgcGN0eCkpCisJCXJldHVybjsKKworCS8qIHNpbXBsZSByZW1vdmUgYWxsIHBvc3NpYmxlIEVBKHMpICovCisJKigoX191MzIgKilzdGFydCkgPSAwVUw7CisJZTJmc2NrX3dyaXRlX2lub2RlX2Z1bGwoY3R4LCBwY3R4LT5pbm8sIChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKWlub2RlLAorCQkJCUVYVDJfSU5PREVfU0laRShzYiksICJwYXNzMSIpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19pbm9kZV9leHRyYV9zcGFjZShlMmZzY2tfdCBjdHgsIHN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHgpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiID0gY3R4LT5mcy0+c3VwZXI7CisJc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKmlub2RlOworCV9fdTMyICplYW1hZ2ljOworCWludCBtaW4sIG1heDsKKworCWlub2RlID0gKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIHBjdHgtPmlub2RlOworCWlmIChFWFQyX0lOT0RFX1NJWkUoc2IpID09IEVYVDJfR09PRF9PTERfSU5PREVfU0laRSkgeworCQkvKiB0aGlzIGlzbid0IGxhcmdlIGlub2RlLiBzbywgbm90aGluZyB0byBjaGVjayAqLworCQlyZXR1cm47CisJfQorCisJLyogaV9leHRyYV9pc2l6ZSBtdXN0IGNvdmVyIGlfZXh0cmFfaXNpemUgKyBpX3BhZDEgYXQgbGVhc3QgKi8KKwltaW4gPSBzaXplb2YoaW5vZGUtPmlfZXh0cmFfaXNpemUpICsgc2l6ZW9mKGlub2RlLT5pX3BhZDEpOworCW1heCA9IEVYVDJfSU5PREVfU0laRShzYikgLSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJLyoKKwkgKiBGb3Igbm93IHdlIHdpbGwgYWxsb3cgaV9leHRyYV9pc2l6ZSB0byBiZSAwLCBidXQgcmVhbGx5CisJICogaW1wbGVtZW50YXRpb25zIHNob3VsZCBuZXZlciBhbGxvdyBpX2V4dHJhX2lzaXplIHRvIGJlIDAKKwkgKi8KKwlpZiAoaW5vZGUtPmlfZXh0cmFfaXNpemUgJiYKKwkgICAgKGlub2RlLT5pX2V4dHJhX2lzaXplIDwgbWluIHx8IGlub2RlLT5pX2V4dHJhX2lzaXplID4gbWF4KSkgeworCQlpZiAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FWFRSQV9JU0laRSwgcGN0eCkpCisJCQlyZXR1cm47CisJCWlub2RlLT5pX2V4dHJhX2lzaXplID0gbWluOworCQllMmZzY2tfd3JpdGVfaW5vZGVfZnVsbChjdHgsIHBjdHgtPmlubywgcGN0eC0+aW5vZGUsCisJCQkJCUVYVDJfSU5PREVfU0laRShzYiksICJwYXNzMSIpOworCQlyZXR1cm47CisJfQorCisJZWFtYWdpYyA9IChfX3UzMiAqKSAoKChjaGFyICopIGlub2RlKSArIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSArCisJCQlpbm9kZS0+aV9leHRyYV9pc2l6ZSk7CisJaWYgKCplYW1hZ2ljID09IEVYVDJfRVhUX0FUVFJfTUFHSUMpIHsKKwkJLyogaXQgc2VlbXMgaW5vZGUgaGFzIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZShzKSBpbiBib2R5ICovCisJCWNoZWNrX2VhX2luX2lub2RlKGN0eCwgcGN0eCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlMmZzY2tfcGFzczEoZTJmc2NrX3QgY3R4KQoreworCWludCAgICAgaTsKKwlfX3U2NCAgIG1heF9zaXplczsKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCAgICAgIGlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGU7CisJZXh0Ml9pbm9kZV9zY2FuIHNjYW47CisJY2hhciAgICAgICAgICAgICpibG9ja19idWY7CisJdW5zaWduZWQgY2hhciAgIGZyYWcsIGZzaXplOworCXN0cnVjdCAgICAgICAgICBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKwlzdHJ1Y3QgICAgICAgICAgc2Nhbl9jYWxsYmFja19zdHJ1Y3Qgc2Nhbl9zdHJ1Y3Q7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiID0gY3R4LT5mcy0+c3VwZXI7CisJaW50ICAgICAgICAgICAgIGltYWdpY19mczsKKwlpbnQgICAgICAgICAgICAgYnVzdGVkX2ZzX3RpbWUgPSAwOworCWludCAgICAgICAgICAgICBpbm9kZV9zaXplOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfUEFTU19IRUFERVIsICZwY3R4KTsKKworCWlmICgoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpICYmCisJICAgICEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9OTykpIHsKKwkJaWYgKGV4dDJmc191MzJfbGlzdF9jcmVhdGUoJmN0eC0+ZGlyc190b19oYXNoLCA1MCkpCisJCQljdHgtPmRpcnNfdG9faGFzaCA9IDA7CisJfQorCisJLyogUGFzcyAxICovCisKKyNkZWZpbmUgRVhUMl9CUFAoYml0cykgKDFVTEwgPDwgKChiaXRzKSAtIDIpKQorCisJZm9yIChpID0gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkU7IGkgPD0gRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkU7IGkrKykgeworCQltYXhfc2l6ZXMgPSBFWFQyX05ESVJfQkxPQ0tTICsgRVhUMl9CUFAoaSk7CisJCW1heF9zaXplcyA9IG1heF9zaXplcyArIEVYVDJfQlBQKGkpICogRVhUMl9CUFAoaSk7CisJCW1heF9zaXplcyA9IG1heF9zaXplcyArIEVYVDJfQlBQKGkpICogRVhUMl9CUFAoaSkgKiBFWFQyX0JQUChpKTsKKwkJbWF4X3NpemVzID0gKG1heF9zaXplcyAqICgxVUwgPDwgaSkpIC0gMTsKKwkJZXh0Ml9tYXhfc2l6ZXNbaSAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFXSA9IG1heF9zaXplczsKKwl9CisjdW5kZWYgRVhUMl9CUFAKKworCWltYWdpY19mcyA9IChzYi0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUyk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGJpdG1hcHMgc3RydWN0dXJlcworCSAqLworCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsIF8oImluLXVzZSBpbm9kZSBtYXAiKSwKKwkJCQkJICAgICAgJmN0eC0+aW5vZGVfdXNlZF9tYXApOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5udW0gPSAxOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCXBjdHguZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsCisJCQkJXygiZGlyZWN0b3J5IGlub2RlIG1hcCIpLCAmY3R4LT5pbm9kZV9kaXJfbWFwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gMjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLAorCQkJXygicmVndWxhciBmaWxlIGlub2RlIG1hcCIpLCAmY3R4LT5pbm9kZV9yZWdfbWFwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gNjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfYmxvY2tfYml0bWFwKGZzLCBfKCJpbi11c2UgYmxvY2sgbWFwIiksCisJCQkJCSAgICAgICZjdHgtPmJsb2NrX2ZvdW5kX21hcCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDE7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9CQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2NyZWF0ZV9pY291bnQyKGZzLCAwLCAwLCAwLAorCQkJCQkgICAgICZjdHgtPmlub2RlX2xpbmtfaW5mbyk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfSUNPVU5ULCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJaW5vZGVfc2l6ZSA9IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCWlub2RlID0gKHN0cnVjdCBleHQyX2lub2RlICopCisJCWUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LCBpbm9kZV9zaXplLCAic2NyYXRjaCBpbm9kZSIpOworCisJaW5vZGVzX3RvX3Byb2Nlc3MgPSAoc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgKikKKwkJZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCQkJICAgICAgIChjdHgtPnByb2Nlc3NfaW5vZGVfc2l6ZSAqCisJCQkJCXNpemVvZihzdHJ1Y3QgcHJvY2Vzc19pbm9kZV9ibG9jaykpLAorCQkJCSAgICAgICAiYXJyYXkgb2YgaW5vZGVzIHRvIHByb2Nlc3MiKTsKKwlwcm9jZXNzX2lub2RlX2NvdW50ID0gMDsKKworCXBjdHguZXJyY29kZSA9IGV4dDJmc19pbml0X2RibGlzdChmcywgMCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfREJDT1VOVCwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbGFzdCBvcnBoYW4gZmllbGQgaXMgc2V0LCBjbGVhciBpdCwgc2luY2UgdGhlIHBhc3MxCisJICogcHJvY2Vzc2luZyB3aWxsIGF1dG9tYXRpY2FsbHkgZmluZCBhbmQgY2xlYXIgdGhlIG9ycGhhbnMuCisJICogSW4gdGhlIGZ1dHVyZSwgd2UgbWF5IHdhbnQgdG8gdHJ5IHVzaW5nIHRoZSBsYXN0X29ycGhhbgorCSAqIGxpbmtlZCBsaXN0IG91cnNlbHZlcywgYnV0IGZvciBub3csIHdlIGNsZWFyIGl0IHNvIHRoYXQgdGhlCisJICogZXh0MyBtb3VudCBjb2RlIHdvbid0IGdldCBjb25mdXNlZC4KKwkgKi8KKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSkgeworCQlpZiAoZnMtPnN1cGVyLT5zX2xhc3Rfb3JwaGFuKSB7CisJCQlmcy0+c3VwZXItPnNfbGFzdF9vcnBoYW4gPSAwOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9CisJfQorCisJbWFya190YWJsZV9ibG9ja3MoY3R4KTsKKwlibG9ja19idWYgPSAoY2hhciAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgZnMtPmJsb2Nrc2l6ZSAqIDMsCisJCQkJCQkgICAgImJsb2NrIGludGVyYXRlIGJ1ZmZlciIpOworCWUyZnNja191c2VfaW5vZGVfc2hvcnRjdXRzKGN0eCwgMSk7CisJZWhhbmRsZXJfb3BlcmF0aW9uKF8oImRvaW5nIGlub2RlIHNjYW4iKSk7CisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX29wZW5faW5vZGVfc2NhbihmcywgY3R4LT5pbm9kZV9idWZmZXJfYmxvY2tzLAorCQkJCQkgICAgICAmc2Nhbik7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfSVNDQU5fRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlleHQyZnNfaW5vZGVfc2Nhbl9mbGFncyhzY2FuLCBFWFQyX1NGX1NLSVBfTUlTU0lOR19JVEFCTEUsIDApOworCWN0eC0+c3Rhc2hlZF9pbm9kZSA9IGlub2RlOworCXNjYW5fc3RydWN0LmN0eCA9IGN0eDsKKwlzY2FuX3N0cnVjdC5ibG9ja19idWYgPSBibG9ja19idWY7CisJZXh0MmZzX3NldF9pbm9kZV9jYWxsYmFjayhzY2FuLCBzY2FuX2NhbGxiYWNrLCAmc2Nhbl9zdHJ1Y3QpOworCWlmIChjdHgtPnByb2dyZXNzKQorCQlpZiAoKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgMSwgMCwgY3R4LT5mcy0+Z3JvdXBfZGVzY19jb3VudCkpCisJCQlyZXR1cm47CisJaWYgKChmcy0+c3VwZXItPnNfd3RpbWUgPCBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSB8fAorCSAgICAoZnMtPnN1cGVyLT5zX210aW1lIDwgZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudCkpCisJCWJ1c3RlZF9mc190aW1lID0gMTsKKworCXdoaWxlICgxKSB7CisJCXBjdHguZXJyY29kZSA9IGV4dDJmc19nZXRfbmV4dF9pbm9kZV9mdWxsKHNjYW4sICZpbm8sCisJCQkJCQkJICBpbm9kZSwgaW5vZGVfc2l6ZSk7CisJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQlyZXR1cm47CisJCWlmIChwY3R4LmVycmNvZGUgPT0gRVhUMl9FVF9CQURfQkxPQ0tfSU5fSU5PREVfVEFCTEUpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9JU0NBTl9FUlJPUiwgJnBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWlubykKKwkJCWJyZWFrOworCQlwY3R4LmlubyA9IGlubzsKKwkJcGN0eC5pbm9kZSA9IGlub2RlOworCQljdHgtPnN0YXNoZWRfaW5vID0gaW5vOworCQlpZiAoaW5vZGUtPmlfbGlua3NfY291bnQpIHsKKwkJCXBjdHguZXJyY29kZSA9IGV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9saW5rX2luZm8sCisJCQkJCSAgIGlubywgaW5vZGUtPmlfbGlua3NfY291bnQpOworCQkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJCXBjdHgubnVtID0gaW5vZGUtPmlfbGlua3NfY291bnQ7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0lDT1VOVF9TVE9SRSwgJnBjdHgpOworCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmIChpbm8gPT0gRVhUMl9CQURfSU5PKSB7CisJCQlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMSBwYjsKKworCQkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2NvcHlfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQkJCSAgJnBiLmZzX21ldGFfYmxvY2tzKTsKKwkJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCQlwY3R4Lm51bSA9IDQ7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0JCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXBiLmlubyA9IEVYVDJfQkFEX0lOTzsKKwkJCXBiLm51bV9ibG9ja3MgPSBwYi5sYXN0X2Jsb2NrID0gMDsKKwkJCXBiLm51bV9pbGxlZ2FsX2Jsb2NrcyA9IDA7CisJCQlwYi5zdXBwcmVzcyA9IDA7IHBiLmNsZWFyID0gMDsgcGIuaXNfZGlyID0gMDsKKwkJCXBiLmlzX3JlZyA9IDA7IHBiLmZyYWdtZW50ZWQgPSAwOyBwYi5iYmNoZWNrID0gMDsKKwkJCXBiLmlub2RlID0gaW5vZGU7CisJCQlwYi5wY3R4ID0gJnBjdHg7CisJCQlwYi5jdHggPSBjdHg7CisJCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgMCwKKwkJCQkgICAgIGJsb2NrX2J1ZiwgcHJvY2Vzc19iYWRfYmxvY2ssICZwYik7CisJCQlleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAocGIuZnNfbWV0YV9ibG9ja3MpOworCQkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CTE9DS19JVEVSQVRFLCAmcGN0eCk7CisJCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAocGIuYmJjaGVjaykKKwkJCQlpZiAoIWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CQklOT0RFX0JBRF9NRVRBQkxPQ0tfUFJPTVBULCAmcGN0eCkpIHsKKwkJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCQkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGlubyA9PSBFWFQyX1JPT1RfSU5PKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoZSByb290IGlub2RlIGlzIGEgZGlyZWN0b3J5OyBpZgorCQkJICogbm90LCBvZmZlciB0byBjbGVhciBpdC4gIEl0IHdpbGwgYmUKKwkJCSAqIHJlZ25lcmF0ZWQgaW4gcGFzcyAjMy4KKwkJCSAqLworCQkJaWYgKCFMSU5VWF9TX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9ST09UX05PX0RJUiwgJnBjdHgpKSB7CisJCQkJCWlub2RlLT5pX2R0aW1lID0gdGltZShOVUxMKTsKKwkJCQkJaW5vZGUtPmlfbGlua3NfY291bnQgPSAwOworCQkJCQlleHQyZnNfaWNvdW50X3N0b3JlKGN0eC0+aW5vZGVfbGlua19pbmZvLAorCQkJCQkJCSAgICBpbm8sIDApOworCQkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLAorCQkJCQkJCSAgICJwYXNzMSIpOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBJZiBkdGltZSBpcyBzZXQsIG9mZmVyIHRvIGNsZWFyIGl0LiAgbWtlMmZzCisJCQkgKiB2ZXJzaW9uIDAuMmIgY3JlYXRlZCBmaWxlc3lzdGVtcyB3aXRoIHRoZQorCQkJICogZHRpbWUgZmllbGQgc2V0IGZvciB0aGUgcm9vdCBhbmQgbG9zdCtmb3VuZAorCQkJICogZGlyZWN0b3JpZXMuICBXZSB3b24ndCB3b3JyeSBhYm91dAorCQkJICogL2xvc3QrZm91bmQsIHNpbmNlIHRoYXQgY2FuIGJlIHJlZ2VuZXJhdGVkCisJCQkgKiBlYXNpbHkuICBCdXQgd2Ugd2lsbCBmaXggdGhlIHJvb3QgZGlyZWN0b3J5CisJCQkgKiBhcyBhIHNwZWNpYWwgY2FzZS4KKwkJCSAqLworCQkJaWYgKGlub2RlLT5pX2R0aW1lICYmIGlub2RlLT5pX2xpbmtzX2NvdW50KSB7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9ST09UX0RUSU1FLCAmcGN0eCkpIHsKKwkJCQkJaW5vZGUtPmlfZHRpbWUgPSAwOworCQkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLAorCQkJCQkJCSAgICJwYXNzMSIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChpbm8gPT0gRVhUMl9KT1VSTkFMX0lOTykgeworCQkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsIGlubyk7CisJCQlpZiAoZnMtPnN1cGVyLT5zX2pvdXJuYWxfaW51bSA9PSBFWFQyX0pPVVJOQUxfSU5PKSB7CisJCQkJaWYgKCFMSU5VWF9TX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJCQkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9KT1VSTkFMX0JBRF9NT0RFLAorCQkJCQkJJnBjdHgpKSB7CisJCQkJCWlub2RlLT5pX21vZGUgPSBMSU5VWF9TX0lGUkVHOworCQkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLAorCQkJCQkJCSAgICJwYXNzMSIpOworCQkJCX0KKwkJCQljaGVja19ibG9ja3MoY3R4LCAmcGN0eCwgYmxvY2tfYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgoaW5vZGUtPmlfbGlua3NfY291bnQgfHwgaW5vZGUtPmlfYmxvY2tzIHx8CisJCQkgICAgIGlub2RlLT5pX2Jsb2NrcyB8fCBpbm9kZS0+aV9ibG9ja1swXSkgJiYKKwkJCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSk9VUk5BTF9JTk9ERV9OT1RfQ0xFQVIsCisJCQkJCSZwY3R4KSkgeworCQkJCW1lbXNldChpbm9kZSwgMCwgaW5vZGVfc2l6ZSk7CisJCQkJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywKKwkJCQkJCSAgICBpbm8sIDApOworCQkJCWUyZnNja193cml0ZV9pbm9kZV9mdWxsKGN0eCwgaW5vLCBpbm9kZSwKKwkJCQkJCQlpbm9kZV9zaXplLCAicGFzczEiKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpbm8gPCBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcikpIHsKKwkJCWludCAgICAgcHJvYmxlbSA9IDA7CisKKwkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCQkJaWYgKGlubyA9PSBFWFQyX0JPT1RfTE9BREVSX0lOTykgeworCQkJCWlmIChMSU5VWF9TX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJCQlwcm9ibGVtID0gUFJfMV9SRVNFUlZFRF9CQURfTU9ERTsKKwkJCX0gZWxzZSBpZiAoaW5vID09IEVYVDJfUkVTSVpFX0lOTykgeworCQkJCWlmIChpbm9kZS0+aV9tb2RlICYmCisJCQkJICAgICFMSU5VWF9TX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJCQlwcm9ibGVtID0gUFJfMV9SRVNFUlZFRF9CQURfTU9ERTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlub2RlLT5pX21vZGUgIT0gMCkKKwkJCQkJcHJvYmxlbSA9IFBSXzFfUkVTRVJWRURfQkFEX01PREU7CisJCQl9CisJCQlpZiAocHJvYmxlbSkgeworCQkJCWlmIChmaXhfcHJvYmxlbShjdHgsIHByb2JsZW0sICZwY3R4KSkgeworCQkJCQlpbm9kZS0+aV9tb2RlID0gMDsKKwkJCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCBpbm9kZSwKKwkJCQkJCQkgICAicGFzczEiKTsKKwkJCQl9CisJCQl9CisJCQljaGVja19ibG9ja3MoY3R4LCAmcGN0eCwgYmxvY2tfYnVmKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIENoZWNrIGZvciBpbm9kZXMgd2hvIG1pZ2h0IGhhdmUgYmVlbiBwYXJ0IG9mIHRoZQorCQkgKiBvcnBoYW5lZCBsaXN0IGxpbmtlZCBsaXN0LiAgVGhleSBzaG91bGQgaGF2ZSBnb3R0ZW4KKwkJICogZGVhbHQgd2l0aCBieSBub3csIHVubGVzcyB0aGUgbGlzdCBoYWQgc29tZWhvdyBiZWVuCisJCSAqIGNvcnJ1cHRlZC4KKwkJICoKKwkJICogRklYTUU6IEluIHRoZSBmdXR1cmUsIGlub2RlcyB3aGljaCBhcmUgc3RpbGwgaW4gdXNlCisJCSAqIChhbmQgd2hpY2ggYXJlIHRoZXJlZm9yZSkgcGVuZGluZyB0cnVuY2F0aW9uIHNob3VsZAorCQkgKiBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFJpZ2h0IG5vdyB3ZSBqdXN0IGNsZWFyIHRoZQorCQkgKiBkdGltZSBmaWVsZCwgYW5kIHRoZSBub3JtYWwgZTJmc2NrIGhhbmRsaW5nIG9mCisJCSAqIGlub2RlcyB3aGVyZSBpX3NpemUgYW5kIHRoZSBpbm9kZSBibG9ja3MgYXJlCisJCSAqIGluY29uc2lzdGVudCBpcyB0byBmaXggaV9zaXplLCBpbnN0ZWFkIG9mIHJlbGVhc2luZworCQkgKiB0aGUgZXh0cmEgYmxvY2tzLiAgVGhpcyB3b24ndCBjYXRjaCB0aGUgaW5vZGVzIHRoYXQKKwkJICogd2FzIGF0IHRoZSBlbmQgb2YgdGhlIG9ycGhhbiBsaXN0LCBidXQgaXQncyBiZXR0ZXIKKwkJICogdGhhbiBub3RoaW5nLiAgVGhlIHJpZ2h0IGFuc3dlciBpcyB0aGF0IHRoZXJlCisJCSAqIHNob3VsZG4ndCBiZSBhbnkgYnVncyBpbiB0aGUgb3JwaGFuIGxpc3QgaGFuZGxpbmcuICA6LSkKKwkJICovCisJCWlmIChpbm9kZS0+aV9kdGltZSAmJiAhYnVzdGVkX2ZzX3RpbWUgJiYKKwkJICAgIGlub2RlLT5pX2R0aW1lIDwgY3R4LT5mcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0xPV19EVElNRSwgJnBjdHgpKSB7CisJCQkJaW5vZGUtPmlfZHRpbWUgPSBpbm9kZS0+aV9saW5rc19jb3VudCA/CisJCQkJCTAgOiB0aW1lKE5VTEwpOworCQkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgaW5vZGUsCisJCQkJCQkgICAicGFzczEiKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgZGVsZXRlZCBpbm9kZXMgaGF2ZQorCQkgKiBpX2xpbmtzX2NvdW50IHNldCB0byAwLgorCQkgKi8KKwkJaWYgKCFpbm9kZS0+aV9saW5rc19jb3VudCkgeworCQkJaWYgKCFpbm9kZS0+aV9kdGltZSAmJiBpbm9kZS0+aV9tb2RlKSB7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwKKwkJCQkJICAgIFBSXzFfWkVST19EVElNRSwgJnBjdHgpKSB7CisJCQkJCWlub2RlLT5pX2R0aW1lID0gdGltZShOVUxMKTsKKwkJCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCBpbm9kZSwKKwkJCQkJCQkgICAicGFzczEiKTsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBuLmIuICAwLjNjIGV4dDJmcyBjb2RlIGRpZG4ndCBjbGVhciBpX2xpbmtzX2NvdW50IGZvcgorCQkgKiBkZWxldGVkIGZpbGVzLiAgT29wcy4KKwkJICoKKwkJICogU2luY2UgYWxsIG5ldyBleHQyIGltcGxlbWVudGF0aW9ucyBnZXQgdGhpcyByaWdodCwKKwkJICogd2Ugbm93IGFzc3VtZSB0aGF0IHRoZSBjYXNlIG9mIG5vbi16ZXJvCisJCSAqIGlfbGlua3NfY291bnQgYW5kIG5vbi16ZXJvIGR0aW1lIG1lYW5zIHRoYXQgd2UKKwkJICogc2hvdWxkIGtlZXAgdGhlIGZpbGUsIG5vdCBkZWxldGUgaXQuCisJCSAqCisJCSAqLworCQlpZiAoaW5vZGUtPmlfZHRpbWUpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfU0VUX0RUSU1FLCAmcGN0eCkpIHsKKwkJCQlpbm9kZS0+aV9kdGltZSA9IDA7CisJCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCBpbm9kZSwgInBhc3MxIik7CisJCQl9CisJCX0KKworCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKTsKKwkJc3dpdGNoIChmcy0+c3VwZXItPnNfY3JlYXRvcl9vcykgeworCQkgICAgY2FzZSBFWFQyX09TX0xJTlVYOgorCQkJZnJhZyA9IGlub2RlLT5vc2QyLmxpbnV4Mi5sX2lfZnJhZzsKKwkJCWZzaXplID0gaW5vZGUtPm9zZDIubGludXgyLmxfaV9mc2l6ZTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBFWFQyX09TX0hVUkQ6CisJCQlmcmFnID0gaW5vZGUtPm9zZDIuaHVyZDIuaF9pX2ZyYWc7CisJCQlmc2l6ZSA9IGlub2RlLT5vc2QyLmh1cmQyLmhfaV9mc2l6ZTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBFWFQyX09TX01BU0lYOgorCQkJZnJhZyA9IGlub2RlLT5vc2QyLm1hc2l4Mi5tX2lfZnJhZzsKKwkJCWZzaXplID0gaW5vZGUtPm9zZDIubWFzaXgyLm1faV9mc2l6ZTsKKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJCWZyYWcgPSBmc2l6ZSA9IDA7CisJCX0KKworCQlpZiAoaW5vZGUtPmlfZmFkZHIgfHwgZnJhZyB8fCBmc2l6ZSB8fAorCQkgICAgKExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfZGlyX2FjbCkpCisJCQltYXJrX2lub2RlX2JhZChjdHgsIGlubyk7CisJCWlmIChpbm9kZS0+aV9mbGFncyAmIEVYVDJfSU1BR0lDX0ZMKSB7CisJCQlpZiAoaW1hZ2ljX2ZzKSB7CisJCQkJaWYgKCFjdHgtPmlub2RlX2ltYWdpY19tYXApCisJCQkJCWFsbG9jX2ltYWdpY19tYXAoY3R4KTsKKwkJCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9pbWFnaWNfbWFwLAorCQkJCQkJCSBpbm8pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX1NFVF9JTUFHSUMsICZwY3R4KSkgeworCQkJCQlpbm9kZS0+aV9mbGFncyAmPSB+RVhUMl9JTUFHSUNfRkw7CisJCQkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywKKwkJCQkJCQkgICBpbm9kZSwgInBhc3MxIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJY2hlY2tfaW5vZGVfZXh0cmFfc3BhY2UoY3R4LCAmcGN0eCk7CisKKwkJaWYgKExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGlubyk7CisJCQllMmZzY2tfYWRkX2Rpcl9pbmZvKGN0eCwgaW5vLCAwKTsKKwkJCWN0eC0+ZnNfZGlyZWN0b3J5X2NvdW50Kys7CisJCX0gZWxzZSBpZiAoTElOVVhfU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3JlZ19tYXAsIGlubyk7CisJCQljdHgtPmZzX3JlZ3VsYXJfY291bnQrKzsKKwkJfSBlbHNlIGlmIChMSU5VWF9TX0lTQ0hSIChpbm9kZS0+aV9tb2RlKSAmJgorCQkJICAgZTJmc2NrX3Bhc3MxX2NoZWNrX2RldmljZV9pbm9kZShmcywgaW5vZGUpKSB7CisJCQljaGVja19pbW11dGFibGUoY3R4LCAmcGN0eCk7CisJCQljaGVja19zaXplKGN0eCwgJnBjdHgpOworCQkJY3R4LT5mc19jaGFyZGV2X2NvdW50Kys7CisJCX0gZWxzZSBpZiAoTElOVVhfU19JU0JMSyAoaW5vZGUtPmlfbW9kZSkgJiYKKwkJCSAgIGUyZnNja19wYXNzMV9jaGVja19kZXZpY2VfaW5vZGUoZnMsIGlub2RlKSkgeworCQkJY2hlY2tfaW1tdXRhYmxlKGN0eCwgJnBjdHgpOworCQkJY2hlY2tfc2l6ZShjdHgsICZwY3R4KTsKKwkJCWN0eC0+ZnNfYmxvY2tkZXZfY291bnQrKzsKKwkJfSBlbHNlIGlmIChMSU5VWF9TX0lTTE5LIChpbm9kZS0+aV9tb2RlKSAmJgorCQkJICAgZTJmc2NrX3Bhc3MxX2NoZWNrX3N5bWxpbmsoZnMsIGlub2RlLCBibG9ja19idWYpKSB7CisJCQljaGVja19pbW11dGFibGUoY3R4LCAmcGN0eCk7CisJCQljdHgtPmZzX3N5bWxpbmtzX2NvdW50Kys7CisJCQlpZiAoZXh0MmZzX2lub2RlX2RhdGFfYmxvY2tzKGZzLCBpbm9kZSkgPT0gMCkgeworCQkJCWN0eC0+ZnNfZmFzdF9zeW1saW5rc19jb3VudCsrOworCQkJCWNoZWNrX2Jsb2NrcyhjdHgsICZwY3R4LCBibG9ja19idWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWVsc2UgaWYgKExJTlVYX1NfSVNGSUZPIChpbm9kZS0+aV9tb2RlKSAmJgorCQkJIGUyZnNja19wYXNzMV9jaGVja19kZXZpY2VfaW5vZGUoZnMsIGlub2RlKSkgeworCQkJY2hlY2tfaW1tdXRhYmxlKGN0eCwgJnBjdHgpOworCQkJY2hlY2tfc2l6ZShjdHgsICZwY3R4KTsKKwkJCWN0eC0+ZnNfZmlmb19jb3VudCsrOworCQl9IGVsc2UgaWYgKChMSU5VWF9TX0lTU09DSyAoaW5vZGUtPmlfbW9kZSkpICYmCisJCQkgICBlMmZzY2tfcGFzczFfY2hlY2tfZGV2aWNlX2lub2RlKGZzLCBpbm9kZSkpIHsKKwkJCWNoZWNrX2ltbXV0YWJsZShjdHgsICZwY3R4KTsKKwkJCWNoZWNrX3NpemUoY3R4LCAmcGN0eCk7CisJCQljdHgtPmZzX3NvY2tldHNfY291bnQrKzsKKwkJfSBlbHNlCisJCQltYXJrX2lub2RlX2JhZChjdHgsIGlubyk7CisJCWlmIChpbm9kZS0+aV9ibG9ja1tFWFQyX0lORF9CTE9DS10pCisJCQljdHgtPmZzX2luZF9jb3VudCsrOworCQlpZiAoaW5vZGUtPmlfYmxvY2tbRVhUMl9ESU5EX0JMT0NLXSkKKwkJCWN0eC0+ZnNfZGluZF9jb3VudCsrOworCQlpZiAoaW5vZGUtPmlfYmxvY2tbRVhUMl9USU5EX0JMT0NLXSkKKwkJCWN0eC0+ZnNfdGluZF9jb3VudCsrOworCQlpZiAoaW5vZGUtPmlfYmxvY2tbRVhUMl9JTkRfQkxPQ0tdIHx8CisJCSAgICBpbm9kZS0+aV9ibG9ja1tFWFQyX0RJTkRfQkxPQ0tdIHx8CisJCSAgICBpbm9kZS0+aV9ibG9ja1tFWFQyX1RJTkRfQkxPQ0tdIHx8CisJCSAgICBpbm9kZS0+aV9maWxlX2FjbCkgeworCQkJaW5vZGVzX3RvX3Byb2Nlc3NbcHJvY2Vzc19pbm9kZV9jb3VudF0uaW5vID0gaW5vOworCQkJaW5vZGVzX3RvX3Byb2Nlc3NbcHJvY2Vzc19pbm9kZV9jb3VudF0uaW5vZGUgPSAqaW5vZGU7CisJCQlwcm9jZXNzX2lub2RlX2NvdW50Kys7CisJCX0gZWxzZQorCQkJY2hlY2tfYmxvY2tzKGN0eCwgJnBjdHgsIGJsb2NrX2J1Zik7CisKKwkJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJCXJldHVybjsKKworCQlpZiAocHJvY2Vzc19pbm9kZV9jb3VudCA+PSBjdHgtPnByb2Nlc3NfaW5vZGVfc2l6ZSkgeworCQkJcHJvY2Vzc19pbm9kZXMoY3R4LCBibG9ja19idWYpOworCisJCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJCXJldHVybjsKKwkJfQorCX0KKwlwcm9jZXNzX2lub2RlcyhjdHgsIGJsb2NrX2J1Zik7CisJZXh0MmZzX2Nsb3NlX2lub2RlX3NjYW4oc2Nhbik7CisJZWhhbmRsZXJfb3BlcmF0aW9uKDApOworCisJLyoKKwkgKiBJZiBhbnkgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrcycgcmVmZXJlbmNlIGNvdW50cyBuZWVkIHRvCisJICogYmUgYWRqdXN0ZWQsIGVpdGhlciB1cCAoY3R4LT5yZWZjb3VudF9leHRyYSksIG9yIGRvd24KKwkgKiAoY3R4LT5yZWZjb3VudCksIHRoZW4gZml4IHRoZW0uCisJICovCisJaWYgKGN0eC0+cmVmY291bnQpIHsKKwkJYWRqdXN0X2V4dGF0dHJfcmVmY291bnQoY3R4LCBjdHgtPnJlZmNvdW50LCBibG9ja19idWYsIC0xKTsKKwkJZWFfcmVmY291bnRfZnJlZShjdHgtPnJlZmNvdW50KTsKKwkJY3R4LT5yZWZjb3VudCA9IDA7CisJfQorCWlmIChjdHgtPnJlZmNvdW50X2V4dHJhKSB7CisJCWFkanVzdF9leHRhdHRyX3JlZmNvdW50KGN0eCwgY3R4LT5yZWZjb3VudF9leHRyYSwKKwkJCQkJYmxvY2tfYnVmLCArMSk7CisJCWVhX3JlZmNvdW50X2ZyZWUoY3R4LT5yZWZjb3VudF9leHRyYSk7CisJCWN0eC0+cmVmY291bnRfZXh0cmEgPSAwOworCX0KKworCWlmIChjdHgtPmludmFsaWRfYml0bWFwcykKKwkJaGFuZGxlX2ZzX2JhZF9ibG9ja3MoY3R4KTsKKworCS8qIFdlIGRvbid0IG5lZWQgdGhlIGJsb2NrX2VhX21hcCBhbnkgbW9yZSAqLworCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2VhX21hcCk7CisJY3R4LT5ibG9ja19lYV9tYXAgPSAwOworCisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19SRVNJWkVfSU5PREUpIHsKKwkJZXh0MmZzX2Jsb2NrX2JpdG1hcCBzYXZlX2JtYXA7CisKKwkJc2F2ZV9ibWFwID0gZnMtPmJsb2NrX21hcDsKKwkJZnMtPmJsb2NrX21hcCA9IGN0eC0+YmxvY2tfZm91bmRfbWFwOworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfY3JlYXRlX3Jlc2l6ZV9pbm9kZShmcyk7CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9SRVNJWkVfSU5PREVfQ1JFQVRFLCAmcGN0eCk7CisJCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm47CisJCX0KKwkJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBFWFQyX1JFU0laRV9JTk8sIGlub2RlLAorCQkJCSAgInJlY3JlYXRlIGlub2RlIik7CisJCWlub2RlLT5pX210aW1lID0gdGltZShOVUxMKTsKKwkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgRVhUMl9SRVNJWkVfSU5PLCBpbm9kZSwKKwkJCQkgICJyZWNyZWF0ZSBpbm9kZSIpOworCQlmcy0+YmxvY2tfbWFwID0gc2F2ZV9ibWFwOworCQljdHgtPmZsYWdzICY9IH5FMkZfRkxBR19SRVNJWkVfSU5PREU7CisJfQorCisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19SRVNUQVJUKSB7CisJCS8qCisJCSAqIE9ubHkgdGhlIG1hc3RlciBjb3B5IG9mIHRoZSBzdXBlcmJsb2NrIGFuZCBibG9jaworCQkgKiBncm91cCBkZXNjcmlwdG9ycyBhcmUgZ29pbmcgdG8gYmUgd3JpdHRlbiBkdXJpbmcgYQorCQkgKiByZXN0YXJ0LCBzbyBzZXQgdGhlIHN1cGVyYmxvY2sgdG8gYmUgdXNlZCB0byBiZSB0aGUKKwkJICogbWFzdGVyIHN1cGVyYmxvY2suCisJCSAqLworCQljdHgtPnVzZV9zdXBlcmJsb2NrID0gMDsKKwkJdW53aW5kX3Bhc3MxKCk7CisJCWdvdG8gZW5kaXQ7CisJfQorCisJaWYgKGN0eC0+YmxvY2tfZHVwX21hcCkgeworCQlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikgeworCQkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9EVVBfQkxPQ0tTX1BSRUVOU1RPUCwgJnBjdHgpOworCQl9CisJCWUyZnNja19wYXNzMV9kdXBibG9ja3MoY3R4LCBibG9ja19idWYpOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmlub2Rlc190b19wcm9jZXNzKTsKK2VuZGl0OgorCWUyZnNja191c2VfaW5vZGVfc2hvcnRjdXRzKGN0eCwgMCk7CisKKwlleHQyZnNfZnJlZV9tZW0oJmJsb2NrX2J1Zik7CisJZXh0MmZzX2ZyZWVfbWVtKCZpbm9kZSk7Cit9CisKKy8qCisgKiBXaGVuIHRoZSBpbm9kZV9zY2FuIHJvdXRpbmVzIGNhbGwgdGhpcyBjYWxsYmFjayBhdCB0aGUgZW5kIG9mIHRoZQorICogZ2xvY2sgZ3JvdXAsIGNhbGwgcHJvY2Vzc19pbm9kZXMuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3Qgc2Nhbl9jYWxsYmFjayhleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgICBkZ3JwX3QgZ3JvdXAsIHZvaWQgKiBwcml2X2RhdGEpCit7CisJc3RydWN0IHNjYW5fY2FsbGJhY2tfc3RydWN0ICpzY2FuX3N0cnVjdDsKKwllMmZzY2tfdCBjdHg7CisKKwlzY2FuX3N0cnVjdCA9IChzdHJ1Y3Qgc2Nhbl9jYWxsYmFja19zdHJ1Y3QgKikgcHJpdl9kYXRhOworCWN0eCA9IHNjYW5fc3RydWN0LT5jdHg7CisKKwlwcm9jZXNzX2lub2RlcygoZTJmc2NrX3QpIGZzLT5wcml2X2RhdGEsIHNjYW5fc3RydWN0LT5ibG9ja19idWYpOworCisJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCWlmICgoY3R4LT5wcm9ncmVzcykoY3R4LCAxLCBncm91cCsxLAorCQkJCSAgICBjdHgtPmZzLT5ncm91cF9kZXNjX2NvdW50KSkKKwkJCXJldHVybiBFWFQyX0VUX0NBTkNFTF9SRVFVRVNURUQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2Nlc3MgdGhlIGlub2RlcyBpbiB0aGUgImlub2RlcyB0byBwcm9jZXNzIiBsaXN0LgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2lub2RlcyhlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1ZikKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgICpvbGRfc3Rhc2hlZF9pbm9kZTsKKwlleHQyX2lub190ICAgICAgICAgICAgICBvbGRfc3Rhc2hlZF9pbm87CisJY29uc3QgY2hhciAgICAgICAgICAgICAgKm9sZF9vcGVyYXRpb247CisJY2hhciAgICAgICAgICAgICAgICAgICAgYnVmWzgwXTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCisJLyogYmVnaW4gcHJvY2Vzc19pbm9kZXMgKi8KKwlpZiAocHJvY2Vzc19pbm9kZV9jb3VudCA9PSAwKQorCQlyZXR1cm47CisJb2xkX29wZXJhdGlvbiA9IGVoYW5kbGVyX29wZXJhdGlvbigwKTsKKwlvbGRfc3Rhc2hlZF9pbm9kZSA9IGN0eC0+c3Rhc2hlZF9pbm9kZTsKKwlvbGRfc3Rhc2hlZF9pbm8gPSBjdHgtPnN0YXNoZWRfaW5vOworCXFzb3J0KGlub2Rlc190b19wcm9jZXNzLCBwcm9jZXNzX2lub2RlX2NvdW50LAorCQkgICAgICBzaXplb2Yoc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2spLCBwcm9jZXNzX2lub2RlX2NtcCk7CisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlmb3IgKGk9MDsgaSA8IHByb2Nlc3NfaW5vZGVfY291bnQ7IGkrKykgeworCQlwY3R4Lmlub2RlID0gY3R4LT5zdGFzaGVkX2lub2RlID0gJmlub2Rlc190b19wcm9jZXNzW2ldLmlub2RlOworCQlwY3R4LmlubyA9IGN0eC0+c3Rhc2hlZF9pbm8gPSBpbm9kZXNfdG9fcHJvY2Vzc1tpXS5pbm87CisJCXNwcmludGYoYnVmLCBfKCJyZWFkaW5nIGluZGlyZWN0IGJsb2NrcyBvZiBpbm9kZSAldSIpLAorCQkJcGN0eC5pbm8pOworCQllaGFuZGxlcl9vcGVyYXRpb24oYnVmKTsKKwkJY2hlY2tfYmxvY2tzKGN0eCwgJnBjdHgsIGJsb2NrX2J1Zik7CisJCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCQlicmVhazsKKwl9CisJY3R4LT5zdGFzaGVkX2lub2RlID0gb2xkX3N0YXNoZWRfaW5vZGU7CisJY3R4LT5zdGFzaGVkX2lubyA9IG9sZF9zdGFzaGVkX2lubzsKKwlwcm9jZXNzX2lub2RlX2NvdW50ID0gMDsKKwkvKiBlbmQgcHJvY2VzcyBpbm9kZXMgKi8KKworCWVoYW5kbGVyX29wZXJhdGlvbihvbGRfb3BlcmF0aW9uKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2lub2RlX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBwcm9jZXNzX2lub2RlX2Jsb2NrICppYl9hID0KKwkJKGNvbnN0IHN0cnVjdCBwcm9jZXNzX2lub2RlX2Jsb2NrICopIGE7CisJY29uc3Qgc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgKmliX2IgPQorCQkoY29uc3Qgc3RydWN0IHByb2Nlc3NfaW5vZGVfYmxvY2sgKikgYjsKKwlpbnQgICAgIHJldDsKKworCXJldCA9IChpYl9hLT5pbm9kZS5pX2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSAtCisJICAgICAgIGliX2ItPmlub2RlLmlfYmxvY2tbRVhUMl9JTkRfQkxPQ0tdKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGliX2EtPmlub2RlLmlfZmlsZV9hY2wgLSBpYl9iLT5pbm9kZS5pX2ZpbGVfYWNsOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNYXJrIGFuIGlub2RlIGFzIGJlaW5nIGJhZCBpbiBzb21lIHdoYXQKKyAqLworc3RhdGljIHZvaWQgbWFya19pbm9kZV9iYWQoZTJmc2NrX3QgY3R4LCBpbm9fdCBpbm8pCit7CisJc3RydWN0ICAgICAgICAgIHByb2JsZW1fY29udGV4dCBwY3R4OworCisJaWYgKCFjdHgtPmlub2RlX2JhZF9tYXApIHsKKwkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGN0eC0+ZnMsCisJCQkgICAgXygiYmFkIGlub2RlIG1hcCIpLCAmY3R4LT5pbm9kZV9iYWRfbWFwKTsKKwkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJcGN0eC5udW0gPSAzOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9iYWRfbWFwLCBpbm8pOworfQorCisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSB3aWxsIGFsbG9jYXRlIHRoZSBpbm9kZSBpbWFnaWMgdGFibGUKKyAqLworc3RhdGljIHZvaWQgYWxsb2NfaW1hZ2ljX21hcChlMmZzY2tfdCBjdHgpCit7CisJc3RydWN0ICAgICAgICAgIHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGN0eC0+ZnMsCisJCQkJCSAgICAgIF8oImltYWdpYyBpbm9kZSBtYXAiKSwKKwkJCQkJICAgICAgJmN0eC0+aW5vZGVfaW1hZ2ljX21hcCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDU7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9JQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorfQorCisvKgorICogTWFya3MgYSBibG9jayBhcyBpbiB1c2UsIHNldHRpbmcgdGhlIGR1cF9tYXAgaWYgaXQncyBiZWVuIHNldAorICogYWxyZWFkeS4gIENhbGxlZCBieSBwcm9jZXNzX2Jsb2NrIGFuZCBwcm9jZXNzX2JhZF9ibG9jay4KKyAqCisgKiBXQVJOSU5HOiBBc3N1bWVzIGNoZWNrcyBoYXZlIGFscmVhZHkgYmVlbiBkb25lIHRvIG1ha2Ugc3VyZSBibG9jaworICogaXMgdmFsaWQuICBUaGlzIGlzIHRydWUgaW4gYm90aCBwcm9jZXNzX2Jsb2NrIGFuZCBwcm9jZXNzX2JhZF9ibG9jay4KKyAqLworc3RhdGljIHZvaWQgbWFya19ibG9ja191c2VkKGUyZnNja190IGN0eCwgYmxrX3QgYmxvY2spCit7CisJc3RydWN0ICAgICAgICAgIHByb2JsZW1fY29udGV4dCBwY3R4OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWlmIChleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgYmxvY2spKSB7CisJCWlmICghY3R4LT5ibG9ja19kdXBfbWFwKSB7CisJCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfYmxvY2tfYml0bWFwKGN0eC0+ZnMsCisJCQkgICAgICBfKCJtdWx0aXBseSBjbGFpbWVkIGJsb2NrIG1hcCIpLAorCQkJICAgICAgJmN0eC0+YmxvY2tfZHVwX21hcCk7CisJCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQkJcGN0eC5udW0gPSAzOworCQkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9CQklUTUFQX0VSUk9SLAorCQkJCQkgICAgJnBjdHgpOworCQkJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZHVwX21hcCwgYmxvY2spOworCX0gZWxzZSB7CisJCWV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLCBibG9jayk7CisJfQorfQorCisvKgorICogQWRqdXN0IHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sncyByZWZlcmVuY2UgY291bnRzIGF0IHRoZSBlbmQKKyAqIG9mIHBhc3MgMSwgZWl0aGVyIGJ5IHN1YnRyYWN0aW5nIG91dCByZWZlcmVuY2VzIGZvciBFQSBibG9ja3MgdGhhdAorICogYXJlIHN0aWxsIHJlZmVyZW5jZWQgaW4gY3R4LT5yZWZjb3VudCwgb3IgYnkgYWRkaW5nIHJlZmVyZW5jZXMgZm9yCisgKiBFQSBibG9ja3MgdGhhdCBoYWQgZXh0cmEgcmVmZXJlbmNlcyBhcyBhY2NvdW50ZWQgZm9yIGluCisgKiBjdHgtPnJlZmNvdW50X2V4dHJhLgorICovCitzdGF0aWMgdm9pZCBhZGp1c3RfZXh0YXR0cl9yZWZjb3VudChlMmZzY2tfdCBjdHgsIGV4dDJfcmVmY291bnRfdCByZWZjb3VudCwKKwkJCQkgICAgY2hhciAqYmxvY2tfYnVmLCBpbnQgYWRqdXN0X3NpZ24pCit7CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICAgICAqaGVhZGVyOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgICAgICAgICAgcGN0eDsKKwlleHQyX2ZpbHN5cyAgICAgICAgICAgICAgICAgICAgIGZzID0gY3R4LT5mczsKKwlibGtfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsazsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9iZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCWVhX3JlZmNvdW50X2ludHJfYmVnaW4ocmVmY291bnQpOworCXdoaWxlICgxKSB7CisJCWlmICgoYmxrID0gZWFfcmVmY291bnRfaW50cl9uZXh0KHJlZmNvdW50LCAmY291bnQpKSA9PSAwKQorCQkJYnJlYWs7CisJCXBjdHguYmxrID0gYmxrOworCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfcmVhZF9leHRfYXR0cihmcywgYmxrLCBibG9ja19idWYpOworCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfRVhUQVRUUl9SRUFEX0FCT1JULCAmcGN0eCk7CisJCQlyZXR1cm47CisJCX0KKwkJaGVhZGVyID0gKHN0cnVjdCBleHQyX2V4dF9hdHRyX2hlYWRlciAqKSBibG9ja19idWY7CisJCXBjdHguYmxrY291bnQgPSBoZWFkZXItPmhfcmVmY291bnQ7CisJCXNob3VsZF9iZSA9IGhlYWRlci0+aF9yZWZjb3VudCArIGFkanVzdF9zaWduICogY291bnQ7CisJCXBjdHgubnVtID0gc2hvdWxkX2JlOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VYVEFUVFJfUkVGQ09VTlQsICZwY3R4KSkgeworCQkJaGVhZGVyLT5oX3JlZmNvdW50ID0gc2hvdWxkX2JlOworCQkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX3dyaXRlX2V4dF9hdHRyKGZzLCBibGssCisJCQkJCQkJICAgICBibG9ja19idWYpOworCQkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FWFRBVFRSX1dSSVRFLCAmcGN0eCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgcHJvY2Vzc2luZyB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrcworICovCitzdGF0aWMgaW50IGNoZWNrX2V4dF9hdHRyKGUyZnNja190IGN0eCwgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCwKKwkJCSAgIGNoYXIgKmJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCAgICAgIGlubyA9IHBjdHgtPmlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUgPSBwY3R4LT5pbm9kZTsKKwlibGtfdCAgICAgICAgICAgYmxrOworCWNoYXIgKiAgICAgICAgICBlbmQ7CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKmVudHJ5OworCWludCAgICAgICAgICAgICBjb3VudDsKKwlyZWdpb25fdCAgICAgICAgcmVnaW9uOworCisJYmxrID0gaW5vZGUtPmlfZmlsZV9hY2w7CisJaWYgKGJsayA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgdGhlIEV4dGVuZGVkIGF0dHJpYnV0ZSBmbGFnIGlzbid0IHNldCwgdGhlbiBhIG5vbi16ZXJvCisJICogZmlsZSBhY2wgbWVhbnMgdGhhdCB0aGUgaW5vZGUgaXMgY29ycnVwdGVkLgorCSAqCisJICogT3IgaWYgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jayBpcyBhbiBpbnZhbGlkIGJsb2NrLAorCSAqIHRoZW4gdGhlIGlub2RlIGlzIGFsc28gY29ycnVwdGVkLgorCSAqLworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpIHx8CisJICAgIChibGsgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgKGJsayA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkgeworCQltYXJrX2lub2RlX2JhZChjdHgsIGlubyk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIGVhIGJpdG1hcCBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQsIGNyZWF0ZSBpdCAqLworCWlmICghY3R4LT5ibG9ja19lYV9tYXApIHsKKwkJcGN0eC0+ZXJyY29kZSA9IGV4dDJmc19hbGxvY2F0ZV9ibG9ja19iaXRtYXAoZnMsCisJCQkJCQkgICAgICBfKCJleHQgYXR0ciBibG9jayBtYXAiKSwKKwkJCQkJCSAgICAgICZjdHgtPmJsb2NrX2VhX21hcCk7CisJCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCQlwY3R4LT5udW0gPSAyOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xX0FMTE9DQVRFX0JCSVRNQVBfRVJST1IsIHBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogQ3JlYXRlIHRoZSBFQSByZWZjb3VudCBzdHJ1Y3R1cmUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCFjdHgtPnJlZmNvdW50KSB7CisJCXBjdHgtPmVycmNvZGUgPSBlYV9yZWZjb3VudF9jcmVhdGUoMCwgJmN0eC0+cmVmY291bnQpOworCQlpZiAocGN0eC0+ZXJyY29kZSkgeworCQkJcGN0eC0+bnVtID0gMTsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9BTExPQ0FURV9SRUZDT1VOVCwgcGN0eCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBIYXZlIHdlIHNlZW4gdGhpcyBFQSBibG9jayBiZWZvcmU/ICovCisJaWYgKGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZWFfbWFwLCBibGspKSB7CisJCWlmIChlYV9yZWZjb3VudF9kZWNyZW1lbnQoY3R4LT5yZWZjb3VudCwgYmxrLCAwKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJCS8qIE9vb3BzLCB0aGlzIEVBIHdhcyByZWZlcmVuY2VkIG1vcmUgdGhhbiBpdCBzdGF0ZWQgKi8KKwkJaWYgKCFjdHgtPnJlZmNvdW50X2V4dHJhKSB7CisJCQlwY3R4LT5lcnJjb2RlID0gZWFfcmVmY291bnRfY3JlYXRlKDAsCisJCQkJCSAgICZjdHgtPnJlZmNvdW50X2V4dHJhKTsKKwkJCWlmIChwY3R4LT5lcnJjb2RlKSB7CisJCQkJcGN0eC0+bnVtID0gMjsKKwkJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUxMT0NBVEVfUkVGQ09VTlQsIHBjdHgpOworCQkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZWFfcmVmY291bnRfaW5jcmVtZW50KGN0eC0+cmVmY291bnRfZXh0cmEsIGJsaywgMCk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogT0ssIHdlIGhhdmVuJ3Qgc2VlbiB0aGlzIEVBIGJsb2NrIHlldC4gIFNvIHdlIG5lZWQgdG8KKwkgKiB2YWxpZGF0ZSBpdAorCSAqLworCXBjdHgtPmJsayA9IGJsazsKKwlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX3JlYWRfZXh0X2F0dHIoZnMsIGJsaywgYmxvY2tfYnVmKTsKKwlpZiAocGN0eC0+ZXJyY29kZSAmJiBmaXhfcHJvYmxlbShjdHgsIFBSXzFfUkVBRF9FQV9CTE9DSywgcGN0eCkpCisJCWdvdG8gY2xlYXJfZXh0YXR0cjsKKwloZWFkZXIgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICopIGJsb2NrX2J1ZjsKKwlwY3R4LT5ibGsgPSBpbm9kZS0+aV9maWxlX2FjbDsKKwlpZiAoKChjdHgtPmV4dF9hdHRyX3ZlciA9PSAxKSAmJgorCSAgICAgKGhlYWRlci0+aF9tYWdpYyAhPSBFWFQyX0VYVF9BVFRSX01BR0lDX3YxKSkgfHwKKwkgICAgKChjdHgtPmV4dF9hdHRyX3ZlciA9PSAyKSAmJgorCSAgICAgKGhlYWRlci0+aF9tYWdpYyAhPSBFWFQyX0VYVF9BVFRSX01BR0lDKSkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CQURfRUFfQkxPQ0ssIHBjdHgpKQorCQkJZ290byBjbGVhcl9leHRhdHRyOworCX0KKworCWlmIChoZWFkZXItPmhfYmxvY2tzICE9IDEpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FQV9NVUxUSV9CTE9DSywgcGN0eCkpCisJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJfQorCisJcmVnaW9uID0gcmVnaW9uX2NyZWF0ZSgwLCBmcy0+YmxvY2tzaXplKTsKKwlpZiAoIXJlZ2lvbikgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfRUFfQUxMT0NfUkVHSU9OLCBwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZWdpb25fYWxsb2NhdGUocmVnaW9uLCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyKSkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FQV9BTExPQ19DT0xMSVNJT04sIHBjdHgpKQorCQkJZ290byBjbGVhcl9leHRhdHRyOworCX0KKworCWVudHJ5ID0gKHN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5ICopKGhlYWRlcisxKTsKKwllbmQgPSBibG9ja19idWYgKyBmcy0+YmxvY2tzaXplOworCXdoaWxlICgoY2hhciAqKWVudHJ5IDwgZW5kICYmICooX191MzIgKillbnRyeSkgeworCQlpZiAocmVnaW9uX2FsbG9jYXRlKHJlZ2lvbiwgKGNoYXIgKillbnRyeSAtIChjaGFyICopaGVhZGVyLAorCQkJCSAgIEVYVDJfRVhUX0FUVFJfTEVOKGVudHJ5LT5lX25hbWVfbGVuKSkpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfRUFfQUxMT0NfQ09MTElTSU9OLCBwY3R4KSkKKwkJCQlnb3RvIGNsZWFyX2V4dGF0dHI7CisJCX0KKwkJaWYgKChjdHgtPmV4dF9hdHRyX3ZlciA9PSAxICYmCisJCSAgICAgKGVudHJ5LT5lX25hbWVfbGVuID09IDAgfHwgZW50cnktPmVfbmFtZV9pbmRleCAhPSAwKSkgfHwKKwkJICAgIChjdHgtPmV4dF9hdHRyX3ZlciA9PSAyICYmCisJCSAgICAgZW50cnktPmVfbmFtZV9pbmRleCA9PSAwKSkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FQV9CQURfTkFNRSwgcGN0eCkpCisJCQkJZ290byBjbGVhcl9leHRhdHRyOworCQl9CisJCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayAhPSAwKSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VBX0JBRF9WQUxVRSwgcGN0eCkpCisJCQkJZ290byBjbGVhcl9leHRhdHRyOworCQl9CisJCWlmIChlbnRyeS0+ZV92YWx1ZV9zaXplICYmCisJCSAgICByZWdpb25fYWxsb2NhdGUocmVnaW9uLCBlbnRyeS0+ZV92YWx1ZV9vZmZzLAorCQkJCSAgICBFWFQyX0VYVF9BVFRSX1NJWkUoZW50cnktPmVfdmFsdWVfc2l6ZSkpKSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX0VBX0FMTE9DX0NPTExJU0lPTiwgcGN0eCkpCisJCQkJZ290byBjbGVhcl9leHRhdHRyOworCQl9CisJCWVudHJ5ID0gRVhUMl9FWFRfQVRUUl9ORVhUKGVudHJ5KTsKKwl9CisJaWYgKHJlZ2lvbl9hbGxvY2F0ZShyZWdpb24sIChjaGFyICopZW50cnkgLSAoY2hhciAqKWhlYWRlciwgNCkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9FQV9BTExPQ19DT0xMSVNJT04sIHBjdHgpKQorCQkJZ290byBjbGVhcl9leHRhdHRyOworCX0KKwlyZWdpb25fZnJlZShyZWdpb24pOworCisJY291bnQgPSBoZWFkZXItPmhfcmVmY291bnQgLSAxOworCWlmIChjb3VudCkKKwkJZWFfcmVmY291bnRfc3RvcmUoY3R4LT5yZWZjb3VudCwgYmxrLCBjb3VudCk7CisJbWFya19ibG9ja191c2VkKGN0eCwgYmxrKTsKKwlleHQyZnNfZmFzdF9tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2VhX21hcCwgYmxrKTsKKworCXJldHVybiAxOworCitjbGVhcl9leHRhdHRyOgorCWlub2RlLT5pX2ZpbGVfYWNsID0gMDsKKwllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLCAiY2hlY2tfZXh0X2F0dHIiKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyAxIGlmIGJhZCBodHJlZSwgMCBpZiBPSyAqLworc3RhdGljIGludCBoYW5kbGVfaHRyZWUoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LAorCQkJZXh0Ml9pbm9fdCBpbm8gRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCXN0cnVjdCBleHQyX2lub2RlICppbm9kZSwKKwkJCWNoYXIgKmJsb2NrX2J1ZikKK3sKKwlzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gICAgICAgICpyb290OworCWV4dDJfZmlsc3lzICAgICAgICAgICAgICAgICAgICAgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsOworCWJsa190ICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrOworCisJaWYgKCghTElOVVhfU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8xX0hUUkVFX05PRElSLCBwY3R4KSkgfHwKKwkgICAgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpICYmCisJICAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSFRSRUVfU0VULCBwY3R4KSkpCisJCXJldHVybiAxOworCisJYmxrID0gaW5vZGUtPmlfYmxvY2tbMF07CisJaWYgKCgoYmxrID09IDApIHx8CisJICAgICAoYmxrIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgICAoYmxrID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKSAmJgorCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSFRSRUVfQkFEUk9PVCwgcGN0eCkpCisJCXJldHVybiAxOworCisJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsaywgMSwgYmxvY2tfYnVmKTsKKwlpZiAocmV0dmFsICYmIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9IVFJFRV9CQURST09ULCBwY3R4KSkKKwkJcmV0dXJuIDE7CisKKwkvKiBYWFggc2hvdWxkIGNoZWNrIHRoYXQgYmVnaW5uaW5nIG1hdGNoZXMgYSBkaXJlY3RvcnkgKi8KKwlyb290ID0gKHN0cnVjdCBleHQyX2R4X3Jvb3RfaW5mbyAqKSAoYmxvY2tfYnVmICsgMjQpOworCisJaWYgKChyb290LT5yZXNlcnZlZF96ZXJvIHx8IHJvb3QtPmluZm9fbGVuZ3RoIDwgOCkgJiYKKwkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8xX0hUUkVFX0JBRFJPT1QsIHBjdHgpKQorCQlyZXR1cm4gMTsKKworCXBjdHgtPm51bSA9IHJvb3QtPmhhc2hfdmVyc2lvbjsKKwlpZiAoKHJvb3QtPmhhc2hfdmVyc2lvbiAhPSBFWFQyX0hBU0hfTEVHQUNZKSAmJgorCSAgICAocm9vdC0+aGFzaF92ZXJzaW9uICE9IEVYVDJfSEFTSF9IQUxGX01ENCkgJiYKKwkgICAgKHJvb3QtPmhhc2hfdmVyc2lvbiAhPSBFWFQyX0hBU0hfVEVBKSAmJgorCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfSFRSRUVfSEFTSFYsIHBjdHgpKQorCQlyZXR1cm4gMTsKKworCWlmICgocm9vdC0+dW51c2VkX2ZsYWdzICYgRVhUMl9IQVNIX0ZMQUdfSU5DT01QQVQpICYmCisJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9IVFJFRV9JTkNPTVBBVCwgcGN0eCkpCisJCXJldHVybiAxOworCisJcGN0eC0+bnVtID0gcm9vdC0+aW5kaXJlY3RfbGV2ZWxzOworCWlmICgocm9vdC0+aW5kaXJlY3RfbGV2ZWxzID4gMSkgJiYKKwkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8xX0hUUkVFX0RFUFRILCBwY3R4KSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBpcyBjYWxsZWQgb24gZWFjaCBpbm9kZSB0byBhY2NvdW50IGZvciBhbGwgb2YgdGhlCisgKiBibG9ja3MgdXNlZCBieSB0aGF0IGlub2RlLgorICovCitzdGF0aWMgdm9pZCBjaGVja19ibG9ja3MoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4LAorCQkJIGNoYXIgKmJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzEgcGI7CisJZXh0Ml9pbm9fdCAgICAgIGlubyA9IHBjdHgtPmlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUgPSBwY3R4LT5pbm9kZTsKKwlpbnQgICAgICAgICAgICAgYmFkX3NpemUgPSAwOworCWludCAgICAgICAgICAgICBkaXJ0eV9pbm9kZSA9IDA7CisJX191NjQgICAgICAgICAgIHNpemU7CisKKwlwYi5pbm8gPSBpbm87CisJcGIubnVtX2Jsb2NrcyA9IDA7CisJcGIubGFzdF9ibG9jayA9IC0xOworCXBiLm51bV9pbGxlZ2FsX2Jsb2NrcyA9IDA7CisJcGIuc3VwcHJlc3MgPSAwOyBwYi5jbGVhciA9IDA7CisJcGIuZnJhZ21lbnRlZCA9IDA7CisJcGIuY29tcHJlc3NlZCA9IDA7CisJcGIucHJldmlvdXNfYmxvY2sgPSAwOworCXBiLmlzX2RpciA9IExJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSk7CisJcGIuaXNfcmVnID0gTElOVVhfU19JU1JFRyhpbm9kZS0+aV9tb2RlKTsKKwlwYi5tYXhfYmxvY2tzID0gMSA8PCAoMzEgLSBmcy0+c3VwZXItPnNfbG9nX2Jsb2NrX3NpemUpOworCXBiLmlub2RlID0gaW5vZGU7CisJcGIucGN0eCA9IHBjdHg7CisJcGIuY3R4ID0gY3R4OworCXBjdHgtPmlubyA9IGlubzsKKwlwY3R4LT5lcnJjb2RlID0gMDsKKworCWlmIChpbm9kZS0+aV9mbGFncyAmIEVYVDJfQ09NUFJCTEtfRkwpIHsKKwkJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJICAgIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTikKKwkJCXBiLmNvbXByZXNzZWQgPSAxOworCQllbHNlIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfQ09NUFJfU0VULCBwY3R4KSkgeworCQkJCWlub2RlLT5pX2ZsYWdzICY9IH5FWFQyX0NPTVBSQkxLX0ZMOworCQkJCWRpcnR5X2lub2RlKys7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaW5vZGUtPmlfZmlsZV9hY2wgJiYgY2hlY2tfZXh0X2F0dHIoY3R4LCBwY3R4LCBibG9ja19idWYpKQorCQlwYi5udW1fYmxvY2tzKys7CisKKwlpZiAoZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoaW5vZGUpKQorCQlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBpbm8sCisJCQkJICAgICAgIHBiLmlzX2RpciA/IEJMT0NLX0ZMQUdfSE9MRSA6IDAsCisJCQkJICAgICAgIGJsb2NrX2J1ZiwgcHJvY2Vzc19ibG9jaywgJnBiKTsKKwllbmRfcHJvYmxlbV9sYXRjaChjdHgsIFBSX0xBVENIX0JMT0NLKTsKKwllbmRfcHJvYmxlbV9sYXRjaChjdHgsIFBSX0xBVENIX1RPT0JJRyk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJZ290byBvdXQ7CisJaWYgKHBjdHgtPmVycmNvZGUpCisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMV9CTE9DS19JVEVSQVRFLCBwY3R4KTsKKworCWlmIChwYi5mcmFnbWVudGVkICYmIHBiLm51bV9ibG9ja3MgPCBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCkKKwkJY3R4LT5mc19mcmFnbWVudGVkKys7CisKKwlpZiAocGIuY2xlYXIpIHsKKwkJaW5vZGUtPmlfbGlua3NfY291bnQgPSAwOworCQlleHQyZnNfaWNvdW50X3N0b3JlKGN0eC0+aW5vZGVfbGlua19pbmZvLCBpbm8sIDApOworCQlpbm9kZS0+aV9kdGltZSA9IHRpbWUoTlVMTCk7CisJCWRpcnR5X2lub2RlKys7CisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaW5vKTsKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9yZWdfbWFwLCBpbm8pOworCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpbm8pOworCQkvKgorCQkgKiBUaGUgaW5vZGUgd2FzIHByb2JhYmx5IHBhcnRpYWxseSBhY2NvdW50ZWQgZm9yCisJCSAqIGJlZm9yZSBwcm9jZXNzaW5nIHdhcyBhYm9ydGVkLCBzbyB3ZSBuZWVkIHRvCisJCSAqIHJlc3RhcnQgdGhlIHBhc3MgMSBzY2FuLgorCQkgKi8KKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19SRVNUQVJUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBFWFQyX0lOREVYX0ZMKSB7CisJCWlmIChoYW5kbGVfaHRyZWUoY3R4LCBwY3R4LCBpbm8sIGlub2RlLCBibG9ja19idWYpKSB7CisJCQlpbm9kZS0+aV9mbGFncyAmPSB+RVhUMl9JTkRFWF9GTDsKKwkJCWRpcnR5X2lub2RlKys7CisJCX0gZWxzZSB7CisjaWZkZWYgRU5BQkxFX0hUUkVFCisJCQllMmZzY2tfYWRkX2R4X2RpcihjdHgsIGlubywgcGIubGFzdF9ibG9jaysxKTsKKyNlbmRpZgorCQl9CisJfQorCWlmIChjdHgtPmRpcnNfdG9faGFzaCAmJiBwYi5pc19kaXIgJiYKKwkgICAgIShpbm9kZS0+aV9mbGFncyAmIEVYVDJfSU5ERVhfRkwpICYmCisJICAgICgoaW5vZGUtPmlfc2l6ZSAvIGZzLT5ibG9ja3NpemUpID49IDMpKQorCQlleHQyZnNfdTMyX2xpc3RfYWRkKGN0eC0+ZGlyc190b19oYXNoLCBpbm8pOworCisJaWYgKCFwYi5udW1fYmxvY2tzICYmIHBiLmlzX2RpcikgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8xX1pFUk9fTEVOR1RIX0RJUiwgcGN0eCkpIHsKKwkJCWlub2RlLT5pX2xpbmtzX2NvdW50ID0gMDsKKwkJCWV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9saW5rX2luZm8sIGlubywgMCk7CisJCQlpbm9kZS0+aV9kdGltZSA9IHRpbWUoTlVMTCk7CisJCQlkaXJ0eV9pbm9kZSsrOworCQkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBpbm8pOworCQkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9yZWdfbWFwLCBpbm8pOworCQkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKTsKKwkJCWN0eC0+ZnNfZGlyZWN0b3J5X2NvdW50LS07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXBiLm51bV9ibG9ja3MgKj0gKGZzLT5ibG9ja3NpemUgLyA1MTIpOworCisJaWYgKHBiLmlzX2RpcikgeworCQlpbnQgbmJsb2NrID0gaW5vZGUtPmlfc2l6ZSA+PiBFWFQyX0JMT0NLX1NJWkVfQklUUyhmcy0+c3VwZXIpOworCQlpZiAobmJsb2NrID4gKHBiLmxhc3RfYmxvY2sgKyAxKSkKKwkJCWJhZF9zaXplID0gMTsKKwkJZWxzZSBpZiAobmJsb2NrIDwgKHBiLmxhc3RfYmxvY2sgKyAxKSkgeworCQkJaWYgKCgocGIubGFzdF9ibG9jayArIDEpIC0gbmJsb2NrKSA+CisJCQkgICAgZnMtPnN1cGVyLT5zX3ByZWFsbG9jX2Rpcl9ibG9ja3MpCisJCQkJYmFkX3NpemUgPSAyOworCQl9CisJfSBlbHNlIHsKKwkJc2l6ZSA9IEVYVDJfSV9TSVpFKGlub2RlKTsKKwkJaWYgKChwYi5sYXN0X2Jsb2NrID49IDApICYmCisJCSAgICAoc2l6ZSA8IChfX3U2NCkgcGIubGFzdF9ibG9jayAqIGZzLT5ibG9ja3NpemUpKQorCQkJYmFkX3NpemUgPSAzOworCQllbHNlIGlmIChzaXplID4gZXh0Ml9tYXhfc2l6ZXNbZnMtPnN1cGVyLT5zX2xvZ19ibG9ja19zaXplXSkKKwkJCWJhZF9zaXplID0gNDsKKwl9CisJLyogaV9zaXplIGZvciBzeW1saW5rcyBpcyBjaGVja2VkIGVsc2V3aGVyZSAqLworCWlmIChiYWRfc2l6ZSAmJiAhTElOVVhfU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlwY3R4LT5udW0gPSAocGIubGFzdF9ibG9jaysxKSAqIGZzLT5ibG9ja3NpemU7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfQkFEX0lfU0laRSwgcGN0eCkpIHsKKwkJCWlub2RlLT5pX3NpemUgPSBwY3R4LT5udW07CisJCQlpZiAoIUxJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJaW5vZGUtPmlfc2l6ZV9oaWdoID0gcGN0eC0+bnVtID4+IDMyOworCQkJZGlydHlfaW5vZGUrKzsKKwkJfQorCQlwY3R4LT5udW0gPSAwOworCX0KKwlpZiAoTElOVVhfU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoaW5vZGUtPmlfc2l6ZV9oaWdoIHx8IGlub2RlLT5pX3NpemUgJiAweDgwMDAwMDAwVUwpKQorCQljdHgtPmxhcmdlX2ZpbGVzKys7CisJaWYgKHBiLm51bV9ibG9ja3MgIT0gaW5vZGUtPmlfYmxvY2tzKSB7CisJCXBjdHgtPm51bSA9IHBiLm51bV9ibG9ja3M7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfQkFEX0lfQkxPQ0tTLCBwY3R4KSkgeworCQkJaW5vZGUtPmlfYmxvY2tzID0gcGIubnVtX2Jsb2NrczsKKwkJCWRpcnR5X2lub2RlKys7CisJCX0KKwkJcGN0eC0+bnVtID0gMDsKKwl9CitvdXQ6CisJaWYgKGRpcnR5X2lub2RlKQorCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sIGlub2RlLCAiY2hlY2tfYmxvY2tzIik7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNoZWNrX2Jsb2NrcygpLgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCSAgYmxrX3QgKmJsb2NrX25yLAorCQkgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkgIGJsa190IHJlZl9ibG9jayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCSAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xICpwOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgKnBjdHg7CisJYmxrX3QgICBibGsgPSAqYmxvY2tfbnI7CisJaW50ICAgICByZXRfY29kZSA9IDA7CisJaW50ICAgICBwcm9ibGVtID0gMDsKKwllMmZzY2tfdCAgICAgICAgY3R4OworCisJcCA9IChzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMSAqKSBwcml2X2RhdGE7CisJcGN0eCA9IHAtPnBjdHg7CisJY3R4ID0gcC0+Y3R4OworCisJaWYgKHAtPmNvbXByZXNzZWQgJiYgKGJsayA9PSBFWFQyRlNfQ09NUFJFU1NFRF9CTEtBRERSKSkgeworCQkvKiB0b2RvOiBDaGVjayB0aGF0IHRoZSBjb21wcmJsa19mbCBpcyBoaWdoLCB0aGF0IHRoZQorCQkgICBibGthZGRyIHBhdHRlcm4gbG9va3MgcmlnaHQgKGFsbCBub24taG9sZXMgdXAgdG8KKwkJICAgZmlyc3QgRVhUMkZTX0NPTVBSRVNTRURfQkxLQUREUiwgdGhlbiBhbGwKKwkJICAgRVhUMkZTX0NPTVBSRVNTRURfQkxLQUREUiB1cCB0byBlbmQgb2YgY2x1c3RlciksCisJCSAgIHRoYXQgdGhlIGZlYXR1cmVfaW5jb21wYXQgYml0IGlzIGhpZ2gsIGFuZCB0aGF0IHRoZQorCQkgICBpbm9kZSBpcyBhIHJlZ3VsYXIgZmlsZS4gIElmIHdlJ3JlIGRvaW5nIGEgImZ1bGwKKwkJICAgY2hlY2siIChhIGNvbmNlcHQgaW50cm9kdWNlZCB0byBlMmZzY2sgYnkgZTJjb21wciwKKwkJICAgbWVhbmluZyB0aGF0IHdlIGxvb2sgYXQgZGF0YSBibG9ja3MgYXMgd2VsbCBhcworCQkgICBtZXRhZGF0YSkgdGhlbiBjYWxsIHNvbWUgbGlicmFyeSByb3V0aW5lIHRoYXQKKwkJICAgY2hlY2tzIHRoZSBjb21wcmVzc2VkIGRhdGEuICBJJ2xsIGhhdmUgdG8gdGhpbmsKKwkJICAgYWJvdXQgdGhpcywgYmVjYXVzZSBvbmUgcGFydGljdWxhcmx5IGltcG9ydGFudAorCQkgICBwcm9ibGVtIHRvIGJlIGFibGUgdG8gZml4IGlzIHRvIHJlY2FsY3VsYXRlIHRoZQorCQkgICBjbHVzdGVyIHNpemUgaWYgbmVjZXNzYXJ5LiAgSSB0aGluayB0aGF0IHBlcmhhcHMKKwkJICAgd2UnZCBiZXR0ZXIgZG8gbW9zdC9hbGwgZTJjb21wci1zcGVjaWZpYyBjaGVja3MKKwkJICAgc2VwYXJhdGVseSwgYWZ0ZXIgdGhlIG5vbi1lMmNvbXByIGNoZWNrcy4gIElmIG5vdAorCQkgICBkb2luZyBhIGZ1bGwgY2hlY2ssIGl0IG1heSBiZSB1c2VmdWwgdG8gdGVzdCB0aGF0CisJCSAgIHRoZSBwZXJzb25hbGl0eSBpcyBsaW51eDsgZS5nLiBpZiBpdCBpc24ndCB0aGVuCisJCSAgIHBlcmhhcHMgdGhpcyByZWFsbHkgaXMganVzdCBhbiBpbGxlZ2FsIGJsb2NrLiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYmxrID09IDApIHsKKwkJaWYgKHAtPmlzX2RpciA9PSAwKSB7CisJCQkvKgorCQkJICogU2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2Ugb25seSBkaXJlY3RvcmllcworCQkJICogZ2V0IGNhbGxlZCB3aXRoIEJMT0NLX0ZMQUdfSE9MRQorCQkJICovCisjaWZkZWYgREVCVUdfRTJGU0NLCisJCQlwcmludGYoInByb2Nlc3NfYmxvY2soKSBjYWxsZWQgd2l0aCBibGsgPT0gMCwgIgorCQkJICAgICAgICJibG9ja2NudD0lZCwgaW5vZGUgJWx1Pz8/XG4iLAorCQkJICAgICAgIGJsb2NrY250LCBwLT5pbm8pOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoYmxvY2tjbnQgPCAwKQorCQkJcmV0dXJuIDA7CisJCWlmIChibG9ja2NudCAqIGZzLT5ibG9ja3NpemUgPCBwLT5pbm9kZS0+aV9zaXplKSB7CisJCQlnb3RvIG1hcmtfZGlyOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogU2ltcGxpc3RpYyBmcmFnbWVudGF0aW9uIGNoZWNrLiAgV2UgbWVyZWx5IHJlcXVpcmUgdGhhdCB0aGUKKwkgKiBmaWxlIGJlIGNvbnRpZ3VvdXMuICAoV2hpY2ggY2FuIG5ldmVyIGJlIHRydWUgZm9yIHJlYWxseQorCSAqIGJpZyBmaWxlcyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gYSBibG9jayBncm91cC4pCisJICovCisJaWYgKCFIT0xFX0JMS0FERFIocC0+cHJldmlvdXNfYmxvY2spKSB7CisJCWlmIChwLT5wcmV2aW91c19ibG9jaysxICE9IGJsaykKKwkJCXAtPmZyYWdtZW50ZWQgPSAxOworCX0KKwlwLT5wcmV2aW91c19ibG9jayA9IGJsazsKKworCWlmIChwLT5pc19kaXIgJiYgYmxvY2tjbnQgPiAoMSA8PCAoMjEgLSBmcy0+c3VwZXItPnNfbG9nX2Jsb2NrX3NpemUpKSkKKwkJcHJvYmxlbSA9IFBSXzFfVE9PQklHX0RJUjsKKwlpZiAocC0+aXNfcmVnICYmIHAtPm51bV9ibG9ja3MrMSA+PSBwLT5tYXhfYmxvY2tzKQorCQlwcm9ibGVtID0gUFJfMV9UT09CSUdfUkVHOworCWlmICghcC0+aXNfZGlyICYmICFwLT5pc19yZWcgJiYgYmxvY2tjbnQgPiAwKQorCQlwcm9ibGVtID0gUFJfMV9UT09CSUdfU1lNTElOSzsKKworCWlmIChibGsgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayB8fAorCSAgICBibGsgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkKKwkJcHJvYmxlbSA9IFBSXzFfSUxMRUdBTF9CTE9DS19OVU07CisKKwlpZiAocHJvYmxlbSkgeworCQlwLT5udW1faWxsZWdhbF9ibG9ja3MrKzsKKwkJaWYgKCFwLT5zdXBwcmVzcyAmJiAocC0+bnVtX2lsbGVnYWxfYmxvY2tzICUgMTIpID09IDApIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfVE9PX01BTllfQkFEX0JMT0NLUywgcGN0eCkpIHsKKwkJCQlwLT5jbGVhciA9IDE7CisJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQkJfQorCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9TVVBQUkVTU19NRVNTQUdFUywgcGN0eCkpIHsKKwkJCQlwLT5zdXBwcmVzcyA9IDE7CisJCQkJc2V0X2xhdGNoX2ZsYWdzKFBSX0xBVENIX0JMT0NLLAorCQkJCQkJUFJMX1NVUFBSRVNTLCAwKTsKKwkJCX0KKwkJfQorCQlwY3R4LT5ibGsgPSBibGs7CisJCXBjdHgtPmJsa2NvdW50ID0gYmxvY2tjbnQ7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIHByb2JsZW0sIHBjdHgpKSB7CisJCQlibGsgPSAqYmxvY2tfbnIgPSAwOworCQkJcmV0X2NvZGUgPSBCTE9DS19DSEFOR0VEOworCQkJZ290byBtYXJrX2RpcjsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocC0+aW5vID09IEVYVDJfUkVTSVpFX0lOTykgeworCQkvKgorCQkgKiBUaGUgcmVzaXplIGlub2RlIGhhcyBhbHJlYWR5IGJlIHNhbml0eSBjaGVja2VkCisJCSAqIGR1cmluZyBwYXNzICMwICh0aGUgc3VwZXJibG9jayBjaGVja3MpLiAgQWxsIHdlCisJCSAqIGhhdmUgdG8gZG8gaXMgbWFyayB0aGUgZG91YmxlIGluZGlyZWN0IGJsb2NrIGFzCisJCSAqIGJlaW5nIGluIHVzZTsgYWxsIG9mIHRoZSBvdGhlciBibG9ja3MgYXJlIGhhbmRsZWQKKwkJICogYnkgbWFya190YWJsZV9ibG9ja3MoKSkuCisJCSAqLworCQlpZiAoYmxvY2tjbnQgPT0gQkxPQ0tfQ09VTlRfRElORCkKKwkJCW1hcmtfYmxvY2tfdXNlZChjdHgsIGJsayk7CisJfSBlbHNlCisJCW1hcmtfYmxvY2tfdXNlZChjdHgsIGJsayk7CisJcC0+bnVtX2Jsb2NrcysrOworCWlmIChibG9ja2NudCA+PSAwKQorCQlwLT5sYXN0X2Jsb2NrID0gYmxvY2tjbnQ7CittYXJrX2RpcjoKKwlpZiAocC0+aXNfZGlyICYmIChibG9ja2NudCA+PSAwKSkgeworCQlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX2FkZF9kaXJfYmxvY2soZnMtPmRibGlzdCwgcC0+aW5vLAorCQkJCQkJICAgIGJsaywgYmxvY2tjbnQpOworCQlpZiAocGN0eC0+ZXJyY29kZSkgeworCQkJcGN0eC0+YmxrID0gYmxrOworCQkJcGN0eC0+bnVtID0gYmxvY2tjbnQ7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFfQUREX0RCTE9DSywgcGN0eCk7CisJCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwl9CisJcmV0dXJuIHJldF9jb2RlOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfYmFkX2Jsb2NrKGV4dDJfZmlsc3lzIGZzIEZTQ0tfQVRUUigodW51c2VkKSksCisJCSAgICAgIGJsa190ICpibG9ja19uciwKKwkJICAgICAgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCSAgICAgIGJsa190IHJlZl9ibG9jayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICB2b2lkICpwcml2X2RhdGEgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCS8qCisJICogTm90ZTogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYmxvY2tzIGZvciB0aGUgYmFkIGJsb2NrcworCSAqIGlub2RlLCB3aGljaCBpcyBuZXZlciBjb21wcmVzc2VkLiAgU28gd2UgZG9uJ3QgdXNlIEhPTEVfQkxLQUREUigpLgorCSAqLworCisJcHJpbnRmKCJVbnJlY292ZXJhYmxlIEVycm9yOiBGb3VuZCAlIlBSSWk2NCIgYmFkIGJsb2NrcyBzdGFydGluZyBhdCBibG9jayBudW1iZXI6ICV1XG4iLCBibG9ja2NudCwgKmJsb2NrX25yKTsKKwlyZXR1cm4gQkxPQ0tfRVJST1I7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBwYXNzIDEgaWYgYmFkIGJsb2NrcyBhcmUKKyAqIGRldGVjdGVkIGluIHRoZSBzdXBlcmJsb2NrLCBncm91cCBkZXNjcmlwdG9ycywgaW5vZGVfYml0bWFwcywgb3IKKyAqIGJsb2NrIGJpdG1hcHMuICBBdCB0aGlzIHBvaW50LCBhbGwgb2YgdGhlIGJsb2NrcyBoYXZlIGJlZW4gbWFwcGVkCisgKiBvdXQsIHNvIHdlIGNhbiB0cnkgdG8gYWxsb2NhdGUgbmV3IGJsb2NrKHMpIHRvIHJlcGxhY2UgdGhlIGJhZAorICogYmxvY2tzLgorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfZnNfYmFkX2Jsb2NrcyhlMmZzY2tfdCBjdHgpCit7CisJcHJpbnRmKCJCYWQgYmxvY2tzIGRldGVjdGVkIG9uIHlvdXIgZmlsZXN5c3RlbVxuIgorCQkiWW91IHNob3VsZCBnZXQgeW91ciBkYXRhIG9mZiBhcyB0aGUgZGV2aWNlIHdpbGwgc29vbiBkaWVcbiIpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIG1hcmtzIGFsbCBibG9ja3Mgd2hpY2ggYXJlIHVzZWQgYnkgdGhlIHN1cGVyYmxvY2ssCisgKiBncm91cCBkZXNjcmlwdG9ycywgaW5vZGUgYml0bWFwcywgYW5kIGJsb2NrIGJpdG1hcHMuCisgKi8KK3N0YXRpYyB2b2lkIG1hcmtfdGFibGVfYmxvY2tzKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJYmxrX3QgICBibG9jaywgYjsKKwlkZ3JwX3QgIGk7CisJaW50ICAgICBqOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCXBjdHguZ3JvdXAgPSBpOworCisJCWV4dDJmc19yZXNlcnZlX3N1cGVyX2FuZF9iZ2QoZnMsIGksIGN0eC0+YmxvY2tfZm91bmRfbWFwKTsKKworCQkvKgorCQkgKiBNYXJrIHRoZSBibG9ja3MgdXNlZCBmb3IgdGhlIGlub2RlIHRhYmxlCisJCSAqLworCQlpZiAoZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfdGFibGUpIHsKKwkJCWZvciAoaiA9IDAsIGIgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV90YWJsZTsKKwkJCSAgICAgaiA8IGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCQkJICAgICBqKyssIGIrKykgeworCQkJCWlmIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJCQkJICAgICBiKSkgeworCQkJCQlwY3R4LmJsayA9IGI7CisJCQkJCWlmIChmaXhfcHJvYmxlbShjdHgsCisJCQkJCQlQUl8xX0lUQUJMRV9DT05GTElDVCwgJnBjdHgpKSB7CisJCQkJCQljdHgtPmludmFsaWRfaW5vZGVfdGFibGVfZmxhZ1tpXSsrOworCQkJCQkJY3R4LT5pbnZhbGlkX2JpdG1hcHMrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgYik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogTWFyayBibG9jayB1c2VkIGZvciB0aGUgYmxvY2sgYml0bWFwCisJCSAqLworCQlpZiAoZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwKSB7CisJCQlpZiAoZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCSAgICAgZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwKSkgeworCQkJCXBjdHguYmxrID0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwOworCQkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFfQkJfQ09ORkxJQ1QsICZwY3R4KSkgeworCQkJCQljdHgtPmludmFsaWRfYmxvY2tfYml0bWFwX2ZsYWdbaV0rKzsKKwkJCQkJY3R4LT5pbnZhbGlkX2JpdG1hcHMrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwKKwkJCQkJZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBNYXJrIGJsb2NrIHVzZWQgZm9yIHRoZSBpbm9kZSBiaXRtYXAKKwkJICovCisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXApIHsKKwkJCWlmIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsCisJCQkJICAgICBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXApKSB7CisJCQkJcGN0eC5ibGsgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXA7CisJCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMV9JQl9DT05GTElDVCwgJnBjdHgpKSB7CisJCQkJCWN0eC0+aW52YWxpZF9pbm9kZV9iaXRtYXBfZmxhZ1tpXSsrOworCQkJCQljdHgtPmludmFsaWRfYml0bWFwcysrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQlmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXApOworCQkJfQorCQl9CisJCWJsb2NrICs9IGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworCX0KK30KKworLyoKKyAqIFRoZXMgc3Vicm91dGluZXMgc2hvcnQgY2lyY3VpdHMgZXh0MmZzX2dldF9ibG9ja3MgYW5kCisgKiBleHQyZnNfY2hlY2tfZGlyZWN0b3J5OyB3ZSB1c2UgdGhlbSBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGlub2RlCisgKiBzdHJ1Y3R1cmUsIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gbGV0dGluZyB0aGUgZXh0MmZzIGxpYnJhcnkgcmVhZAorICogdGhlIGlub2RlIGFnYWluLgorICovCitzdGF0aWMgZXJyY29kZV90IHBhc3MxX2dldF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgYmxrX3QgKmJsb2NrcykKK3sKKwllMmZzY2tfdCBjdHggPSAoZTJmc2NrX3QpIGZzLT5wcml2X2RhdGE7CisJaW50ICAgICBpOworCisJaWYgKChpbm8gIT0gY3R4LT5zdGFzaGVkX2lubykgfHwgIWN0eC0+c3Rhc2hlZF9pbm9kZSkKKwkJcmV0dXJuIEVYVDJfRVRfQ0FMTEJBQ0tfTk9USEFORExFRDsKKworCWZvciAoaT0wOyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKQorCQlibG9ja3NbaV0gPSBjdHgtPnN0YXNoZWRfaW5vZGUtPmlfYmxvY2tbaV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgcGFzczFfcmVhZF9pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJZTJmc2NrX3QgY3R4ID0gKGUyZnNja190KSBmcy0+cHJpdl9kYXRhOworCisJaWYgKChpbm8gIT0gY3R4LT5zdGFzaGVkX2lubykgfHwgIWN0eC0+c3Rhc2hlZF9pbm9kZSkKKwkJcmV0dXJuIEVYVDJfRVRfQ0FMTEJBQ0tfTk9USEFORExFRDsKKwkqaW5vZGUgPSAqY3R4LT5zdGFzaGVkX2lub2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IHBhc3MxX3dyaXRlX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJZTJmc2NrX3QgY3R4ID0gKGUyZnNja190KSBmcy0+cHJpdl9kYXRhOworCisJaWYgKChpbm8gPT0gY3R4LT5zdGFzaGVkX2lubykgJiYgY3R4LT5zdGFzaGVkX2lub2RlKQorCQkqY3R4LT5zdGFzaGVkX2lub2RlID0gKmlub2RlOworCXJldHVybiBFWFQyX0VUX0NBTExCQUNLX05PVEhBTkRMRUQ7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgcGFzczFfY2hlY2tfZGlyZWN0b3J5KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubykKK3sKKwllMmZzY2tfdCBjdHggPSAoZTJmc2NrX3QpIGZzLT5wcml2X2RhdGE7CisKKwlpZiAoKGlubyAhPSBjdHgtPnN0YXNoZWRfaW5vKSB8fCAhY3R4LT5zdGFzaGVkX2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9DQUxMQkFDS19OT1RIQU5ETEVEOworCisJaWYgKCFMSU5VWF9TX0lTRElSKGN0eC0+c3Rhc2hlZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fRElSRUNUT1JZOworCXJldHVybiAwOworfQorCit2b2lkIGUyZnNja191c2VfaW5vZGVfc2hvcnRjdXRzKGUyZnNja190IGN0eCwgaW50IGJvb2wpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCisJaWYgKGJvb2wpIHsKKwkJZnMtPmdldF9ibG9ja3MgPSBwYXNzMV9nZXRfYmxvY2tzOworCQlmcy0+Y2hlY2tfZGlyZWN0b3J5ID0gcGFzczFfY2hlY2tfZGlyZWN0b3J5OworCQlmcy0+cmVhZF9pbm9kZSA9IHBhc3MxX3JlYWRfaW5vZGU7CisJCWZzLT53cml0ZV9pbm9kZSA9IHBhc3MxX3dyaXRlX2lub2RlOworCQljdHgtPnN0YXNoZWRfaW5vID0gMDsKKwl9IGVsc2UgeworCQlmcy0+Z2V0X2Jsb2NrcyA9IDA7CisJCWZzLT5jaGVja19kaXJlY3RvcnkgPSAwOworCQlmcy0+cmVhZF9pbm9kZSA9IDA7CisJCWZzLT53cml0ZV9pbm9kZSA9IDA7CisJfQorfQorCisvKgorICogcGFzczFiLmMgLS0tIFBhc3MgIzFiIG9mIGUyZnNjaworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBwYXNzMUIsIHBhc3MxQywgYW5kIHBhc3MxRCBvZiBlMmZzY2suICBUaGV5IGFyZQorICogb25seSBpbnZva2VkIGlmIHBhc3MgMSBkaXNjb3ZlcmVkIGJsb2NrcyB3aGljaCBhcmUgaW4gdXNlIGJ5IG1vcmUKKyAqIHRoYW4gb25lIGlub2RlLgorICoKKyAqIFBhc3MxQiBzY2FucyB0aGUgZGF0YSBibG9ja3Mgb2YgYWxsIHRoZSBpbm9kZXMgYWdhaW4sIGdlbmVyYXRpbmcgYQorICogY29tcGxldGUgbGlzdCBvZiBkdXBsaWNhdGUgYmxvY2tzIGFuZCB3aGljaCBpbm9kZXMgaGF2ZSBjbGFpbWVkCisgKiB0aGVtLgorICoKKyAqIFBhc3MxQyBkb2VzIGEgdHJlZS10cmF2ZXJzYWwgb2YgdGhlIGZpbGVzeXN0ZW0sIHRvIGRldGVybWluZSB0aGUKKyAqIHBhcmVudCBkaXJlY3RvcmllcyBvZiB0aGVzZSBpbm9kZXMuICBUaGlzIHN0ZXAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQKKyAqIGUyZnNjayBjYW4gcHJpbnQgb3V0IHRoZSBwYXRobmFtZXMgb2YgYWZmZWN0ZWQgaW5vZGVzLgorICoKKyAqIFBhc3MxRCBpcyBhIHJlY29uY2lsaWF0aW9uIHBhc3MuICBGb3IgZWFjaCBpbm9kZSB3aXRoIGR1cGxpY2F0ZQorICogYmxvY2tzLCB0aGUgdXNlciBpcyBwcm9tcHRlZCBpZiBzL2hlIHdvdWxkIGxpa2UgdG8gY2xvbmUgdGhlIGZpbGUKKyAqIChzbyB0aGF0IHRoZSBmaWxlIGdldHMgYSBmcmVzaCBjb3B5IG9mIHRoZSBkdXBsaWNhdGVkIGJsb2Nrcykgb3IKKyAqIHNpbXBseSB0byBkZWxldGUgdGhlIGZpbGUuCisgKgorICovCisKKworLyogTmVlZGVkIGZvciBhcmNoaXRlY3R1cmVzIHdoZXJlIHNpemVvZihpbnQpICE9IHNpemVvZih2b2lkICopICovCisjZGVmaW5lIElOVF9UT19WT0lEUFRSKHZhbCkgICgodm9pZCAqKShpbnRwdHJfdCkodmFsKSkKKyNkZWZpbmUgVk9JRFBUUl9UT19JTlQocHRyKSAgKChpbnQpKGludHB0cl90KShwdHIpKQorCisvKiBEZWZpbmUgYW4gZXh0ZW5zaW9uIHRvIHRoZSBleHQyIGxpYnJhcnkncyBibG9jayBjb3VudCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBCTE9DS19DT1VOVF9FWFRBVFRSICAgICAoLTUpCisKK3N0cnVjdCBibG9ja19lbCB7CisJYmxrX3QgICBibG9jazsKKwlzdHJ1Y3QgYmxvY2tfZWwgKm5leHQ7Cit9OworCitzdHJ1Y3QgaW5vZGVfZWwgeworCWV4dDJfaW5vX3QgICAgICBpbm9kZTsKKwlzdHJ1Y3QgaW5vZGVfZWwgKm5leHQ7Cit9OworCitzdHJ1Y3QgZHVwX2Jsb2NrIHsKKwlpbnQgICAgICAgICAgICAgbnVtX2JhZDsKKwlzdHJ1Y3QgaW5vZGVfZWwgKmlub2RlX2xpc3Q7Cit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBpbm9kZSB3aGljaAorICogaXMgc2hhcmluZyBibG9ja3Mgd2l0aCBvdGhlciBpbm9kZXMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZAorICogdG8gZGlzcGxheSB0byB0aGUgdXNlciwgc28gdGhhdCB0aGUgdXNlciBrbm93cyB3aGF0IGZpbGVzIGhlIG9yIHNoZQorICogaXMgZGVhbGluZyB3aXRoLCB3aGVuIHRyeWluZyB0byBkZWNpZGUgaG93IHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0CisgKiBvZiBtdWx0aXBseS1jbGFpbWVkIGJsb2Nrcy4KKyAqLworc3RydWN0IGR1cF9pbm9kZSB7CisJZXh0Ml9pbm9fdCAgICAgICAgICAgICAgZGlyOworCWludCAgICAgICAgICAgICAgICAgICAgIG51bV9kdXBibG9ja3M7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJc3RydWN0IGJsb2NrX2VsICAgICAgICAgKmJsb2NrX2xpc3Q7Cit9OworCitzdGF0aWMgaW50IHByb2Nlc3NfcGFzczFiX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAgICpibG9ja25yLAorCQkJCWUyX2Jsa2NudF90IGJsb2NrY250LCBibGtfdCByZWZfYmxrLAorCQkJCWludCByZWZfb2Zmc2V0LCB2b2lkICpwcml2X2RhdGEpOworc3RhdGljIHZvaWQgZGVsZXRlX2ZpbGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywKKwkJCXN0cnVjdCBkdXBfaW5vZGUgKmRwLCBjaGFyICpibG9ja19idWYpOworc3RhdGljIGludCBjbG9uZV9maWxlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sCisJCSAgICAgIHN0cnVjdCBkdXBfaW5vZGUgKmRwLCBjaGFyKiBibG9ja19idWYpOworc3RhdGljIGludCBjaGVja19pZl9mc19ibG9jayhlMmZzY2tfdCBjdHgsIGJsa190IHRlc3RfYmxrKTsKKworc3RhdGljIHZvaWQgcGFzczFiKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKTsKK3N0YXRpYyB2b2lkIHBhc3MxYyhlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1Zik7CitzdGF0aWMgdm9pZCBwYXNzMWQoZTJmc2NrX3QgY3R4LCBjaGFyICpibG9ja19idWYpOworCitzdGF0aWMgaW50IGR1cF9pbm9kZV9jb3VudCA9IDA7CisKK3N0YXRpYyBkaWN0X3QgYmxrX2RpY3QsIGlub19kaWN0OworCitzdGF0aWMgZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV9kdXBfbWFwOworCitzdGF0aWMgaW50IGRpY3RfaW50X2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWludHB0cl90ICAgICAgICBpYSwgaWI7CisKKwlpYSA9IChpbnRwdHJfdClhOworCWliID0gKGludHB0cl90KWI7CisKKwlyZXR1cm4gKGlhLWliKTsKK30KKworLyoKKyAqIEFkZCBhIGR1cGxpY2F0ZSBibG9jayByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgYWRkX2R1cGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywgYmxrX3QgYmxrLAorCQkgICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwlkbm9kZV90ICpuOworCXN0cnVjdCBkdXBfYmxvY2sgICAgICAgICpkYjsKKwlzdHJ1Y3QgZHVwX2lub2RlICAgICAgICAqZGk7CisJc3RydWN0IGJsb2NrX2VsICAgICAgICAgKmJsa19lbDsKKwlzdHJ1Y3QgaW5vZGVfZWwgICAgICAgICAqaW5vX2VsOworCisJbiA9IGRpY3RfbG9va3VwKCZibGtfZGljdCwgSU5UX1RPX1ZPSURQVFIoYmxrKSk7CisJaWYgKG4pCisJCWRiID0gKHN0cnVjdCBkdXBfYmxvY2sgKikgZG5vZGVfZ2V0KG4pOworCWVsc2UgeworCQlkYiA9IChzdHJ1Y3QgZHVwX2Jsb2NrICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkJIHNpemVvZihzdHJ1Y3QgZHVwX2Jsb2NrKSwgImR1cGxpY2F0ZSBibG9jayBoZWFkZXIiKTsKKwkJZGItPm51bV9iYWQgPSAwOworCQlkYi0+aW5vZGVfbGlzdCA9IDA7CisJCWRpY3RfYWxsb2NfaW5zZXJ0KCZibGtfZGljdCwgSU5UX1RPX1ZPSURQVFIoYmxrKSwgZGIpOworCX0KKwlpbm9fZWwgPSAoc3RydWN0IGlub2RlX2VsICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkJIHNpemVvZihzdHJ1Y3QgaW5vZGVfZWwpLCAiaW5vZGUgZWxlbWVudCIpOworCWlub19lbC0+aW5vZGUgPSBpbm87CisJaW5vX2VsLT5uZXh0ID0gZGItPmlub2RlX2xpc3Q7CisJZGItPmlub2RlX2xpc3QgPSBpbm9fZWw7CisJZGItPm51bV9iYWQrKzsKKworCW4gPSBkaWN0X2xvb2t1cCgmaW5vX2RpY3QsIElOVF9UT19WT0lEUFRSKGlubykpOworCWlmIChuKQorCQlkaSA9IChzdHJ1Y3QgZHVwX2lub2RlICopIGRub2RlX2dldChuKTsKKwllbHNlIHsKKwkJZGkgPSAoc3RydWN0IGR1cF9pbm9kZSAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkJCSBzaXplb2Yoc3RydWN0IGR1cF9pbm9kZSksICJkdXBsaWNhdGUgaW5vZGUgaGVhZGVyIik7CisJCWRpLT5kaXIgPSAoaW5vID09IEVYVDJfUk9PVF9JTk8pID8gRVhUMl9ST09UX0lOTyA6IDA7CisJCWRpLT5udW1fZHVwYmxvY2tzID0gMDsKKwkJZGktPmJsb2NrX2xpc3QgPSAwOworCQlkaS0+aW5vZGUgPSAqaW5vZGU7CisJCWRpY3RfYWxsb2NfaW5zZXJ0KCZpbm9fZGljdCwgSU5UX1RPX1ZPSURQVFIoaW5vKSwgZGkpOworCX0KKwlibGtfZWwgPSAoc3RydWN0IGJsb2NrX2VsICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkJIHNpemVvZihzdHJ1Y3QgYmxvY2tfZWwpLCAiYmxvY2sgZWxlbWVudCIpOworCWJsa19lbC0+YmxvY2sgPSBibGs7CisJYmxrX2VsLT5uZXh0ID0gZGktPmJsb2NrX2xpc3Q7CisJZGktPmJsb2NrX2xpc3QgPSBibGtfZWw7CisJZGktPm51bV9kdXBibG9ja3MrKzsKK30KKworLyoKKyAqIEZyZWUgYSBkdXBsaWNhdGUgaW5vZGUgcmVjb3JkCisgKi8KK3N0YXRpYyB2b2lkIGlub2RlX2Rub2RlX2ZyZWUoZG5vZGVfdCAqbm9kZSkKK3sKKwlzdHJ1Y3QgZHVwX2lub2RlICAgICAgICAqZGk7CisJc3RydWN0IGJsb2NrX2VsICAgICAgICAgKnAsICpuZXh0OworCisJZGkgPSAoc3RydWN0IGR1cF9pbm9kZSAqKSBkbm9kZV9nZXQobm9kZSk7CisJZm9yIChwID0gZGktPmJsb2NrX2xpc3Q7IHA7IHAgPSBuZXh0KSB7CisJCW5leHQgPSBwLT5uZXh0OworCQlmcmVlKHApOworCX0KKwlmcmVlKG5vZGUpOworfQorCisvKgorICogRnJlZSBhIGR1cGxpY2F0ZSBibG9jayByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgYmxvY2tfZG5vZGVfZnJlZShkbm9kZV90ICpub2RlKQoreworCXN0cnVjdCBkdXBfYmxvY2sgICAgICAgICpkYjsKKwlzdHJ1Y3QgaW5vZGVfZWwgICAgICAgICAqcCwgKm5leHQ7CisKKwlkYiA9IChzdHJ1Y3QgZHVwX2Jsb2NrICopIGRub2RlX2dldChub2RlKTsKKwlmb3IgKHAgPSBkYi0+aW5vZGVfbGlzdDsgcDsgcCA9IG5leHQpIHsKKwkJbmV4dCA9IHAtPm5leHQ7CisJCWZyZWUocCk7CisJfQorCWZyZWUobm9kZSk7Cit9CisKKworLyoKKyAqIE1haW4gcHJvY2VkdXJlIGZvciBoYW5kbGluZyBkdXBsaWNhdGUgYmxvY2tzCisgKi8KK3ZvaWQgZTJmc2NrX3Bhc3MxX2R1cGJsb2NrcyhlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyAgICAgICAgICAgICBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLAorCQkgICAgICBfKCJtdWx0aXBseSBjbGFpbWVkIGlub2RlIG1hcCIpLCAmaW5vZGVfZHVwX21hcCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKworCWRpY3RfaW5pdCgmaW5vX2RpY3QsIERJQ1RDT1VOVF9UX01BWCwgZGljdF9pbnRfY21wKTsKKwlkaWN0X2luaXQoJmJsa19kaWN0LCBESUNUQ09VTlRfVF9NQVgsIGRpY3RfaW50X2NtcCk7CisJZGljdF9zZXRfYWxsb2NhdG9yKCZpbm9fZGljdCwgaW5vZGVfZG5vZGVfZnJlZSk7CisJZGljdF9zZXRfYWxsb2NhdG9yKCZibGtfZGljdCwgYmxvY2tfZG5vZGVfZnJlZSk7CisKKwlwYXNzMWIoY3R4LCBibG9ja19idWYpOworCXBhc3MxYyhjdHgsIGJsb2NrX2J1Zik7CisJcGFzczFkKGN0eCwgYmxvY2tfYnVmKTsKKworCS8qCisJICogVGltZSB0byBmcmVlIGFsbCBvZiB0aGUgYWNjdW11bGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgd2UKKwkgKiBkb24ndCBuZWVkIGFueW1vcmUuCisJICovCisJZGljdF9mcmVlX25vZGVzKCZpbm9fZGljdCk7CisJZGljdF9mcmVlX25vZGVzKCZibGtfZGljdCk7Cit9CisKKy8qCisgKiBTY2FuIHRoZSBpbm9kZXMgbG9va2luZyBmb3IgaW5vZGVzIHRoYXQgY29udGFpbiBkdXBsaWNhdGUgYmxvY2tzLgorICovCitzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMWIgeworCWUyZnNja190ICAgICAgICBjdHg7CisJZXh0Ml9pbm9fdCAgICAgIGlubzsKKwlpbnQgICAgICAgICAgICAgZHVwX2Jsb2NrczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eDsKK307CisKK3N0YXRpYyB2b2lkIHBhc3MxYihlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCBpbm87CisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGU7CisJZXh0Ml9pbm9kZV9zY2FuIHNjYW47CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzFiIHBiOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQl9QQVNTX0hFQURFUiwgJnBjdHgpOworCXBjdHguZXJyY29kZSA9IGV4dDJmc19vcGVuX2lub2RlX3NjYW4oZnMsIGN0eC0+aW5vZGVfYnVmZmVyX2Jsb2NrcywKKwkJCQkJICAgICAgJnNjYW4pOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQl9JU0NBTl9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCWN0eC0+c3Rhc2hlZF9pbm9kZSA9ICZpbm9kZTsKKwlwYi5jdHggPSBjdHg7CisJcGIucGN0eCA9ICZwY3R4OworCXBjdHguc3RyID0gInBhc3MxYiI7CisJd2hpbGUgKDEpIHsKKwkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2dldF9uZXh0X2lub2RlKHNjYW4sICZpbm8sICZpbm9kZSk7CisJCWlmIChwY3R4LmVycmNvZGUgPT0gRVhUMl9FVF9CQURfQkxPQ0tfSU5fSU5PREVfVEFCTEUpCisJCQljb250aW51ZTsKKwkJaWYgKHBjdHguZXJyY29kZSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQl9JU0NBTl9FUlJPUiwgJnBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIWlubykKKwkJCWJyZWFrOworCQlwY3R4LmlubyA9IGN0eC0+c3Rhc2hlZF9pbm8gPSBpbm87CisJCWlmICgoaW5vICE9IEVYVDJfQkFEX0lOTykgJiYKKwkJICAgICFleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKSkKKwkJCWNvbnRpbnVlOworCisJCXBiLmlubyA9IGlubzsKKwkJcGIuZHVwX2Jsb2NrcyA9IDA7CisJCXBiLmlub2RlID0gJmlub2RlOworCisJCWlmIChleHQyZnNfaW5vZGVfaGFzX3ZhbGlkX2Jsb2NrcygmaW5vZGUpIHx8CisJCSAgICAoaW5vID09IEVYVDJfQkFEX0lOTykpCisJCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywKKwkJCQkgICAgIDAsIGJsb2NrX2J1ZiwgcHJvY2Vzc19wYXNzMWJfYmxvY2ssICZwYik7CisJCWlmIChpbm9kZS5pX2ZpbGVfYWNsKQorCQkJcHJvY2Vzc19wYXNzMWJfYmxvY2soZnMsICZpbm9kZS5pX2ZpbGVfYWNsLAorCQkJCQkgICAgIEJMT0NLX0NPVU5UX0VYVEFUVFIsIDAsIDAsICZwYik7CisJCWlmIChwYi5kdXBfYmxvY2tzKSB7CisJCQllbmRfcHJvYmxlbV9sYXRjaChjdHgsIFBSX0xBVENIX0RCTE9DSyk7CisJCQlpZiAoaW5vID49IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKSB8fAorCQkJICAgIGlubyA9PSBFWFQyX1JPT1RfSU5PKQorCQkJCWR1cF9pbm9kZV9jb3VudCsrOworCQl9CisJCWlmIChwY3R4LmVycmNvZGUpCisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX0JMT0NLX0lURVJBVEUsICZwY3R4KTsKKwl9CisJZXh0MmZzX2Nsb3NlX2lub2RlX3NjYW4oc2Nhbik7CisJZTJmc2NrX3VzZV9pbm9kZV9zaG9ydGN1dHMoY3R4LCAwKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Bhc3MxYl9ibG9jayhleHQyX2ZpbHN5cyBmcyBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJCWJsa190ICAgKmJsb2NrX25yLAorCQkJCWUyX2Jsa2NudF90IGJsb2NrY250IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJYmxrX3QgcmVmX2JsayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJCWludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xYiAqcDsKKwllMmZzY2tfdCBjdHg7CisKKwlpZiAoSE9MRV9CTEtBRERSKCpibG9ja19ucikpCisJCXJldHVybiAwOworCXAgPSAoc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0XzFiICopIHByaXZfZGF0YTsKKwljdHggPSBwLT5jdHg7CisKKwlpZiAoIWV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2R1cF9tYXAsICpibG9ja19ucikpCisJCXJldHVybiAwOworCisJLyogT0ssIHRoaXMgaXMgYSBkdXBsaWNhdGUgYmxvY2sgKi8KKwlpZiAocC0+aW5vICE9IEVYVDJfQkFEX0lOTykgeworCQlwLT5wY3R4LT5ibGsgPSAqYmxvY2tfbnI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMUJfRFVQX0JMT0NLLCBwLT5wY3R4KTsKKwl9CisJcC0+ZHVwX2Jsb2NrcysrOworCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChpbm9kZV9kdXBfbWFwLCBwLT5pbm8pOworCisJYWRkX2R1cGUoY3R4LCBwLT5pbm8sICpibG9ja19uciwgcC0+aW5vZGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXNzIDFjOiBTY2FuIGRpcmVjdG9yaWVzIGZvciBpbm9kZXMgd2l0aCBkdXBsaWNhdGUgYmxvY2tzLiAgVGhpcworICogaXMgdXNlZCBzbyB0aGF0IHdlIGNhbiBwcmludCBwYXRobmFtZXMgd2hlbiBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yCisgKiB3aGF0IHRvIGRvLgorICovCitzdHJ1Y3Qgc2VhcmNoX2Rpcl9zdHJ1Y3QgeworCWludCAgICAgICAgICAgICBjb3VudDsKKwlleHQyX2lub190ICAgICAgZmlyc3RfaW5vZGU7CisJZXh0Ml9pbm9fdCAgICAgIG1heF9pbm9kZTsKK307CisKK3N0YXRpYyBpbnQgc2VhcmNoX2RpcmVudF9wcm9jKGV4dDJfaW5vX3QgZGlyLCBpbnQgZW50cnksCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCSAgICAgIGludCBvZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgIGludCBibG9ja3NpemUgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgIGNoYXIgKmJ1ZiBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBzZWFyY2hfZGlyX3N0cnVjdCAqc2Q7CisJc3RydWN0IGR1cF9pbm9kZSAgICAgICAgKnA7CisJZG5vZGVfdCAgICAgICAgICAgICAgICAgKm47CisKKwlzZCA9IChzdHJ1Y3Qgc2VhcmNoX2Rpcl9zdHJ1Y3QgKikgcHJpdl9kYXRhOworCisJaWYgKGRpcmVudC0+aW5vZGUgPiBzZC0+bWF4X2lub2RlKQorCQkvKiBTaG91bGQgYWJvcnQgdGhpcyBpbm9kZSwgYnV0IG5vdCBldmVyeXRoaW5nICovCisJCXJldHVybiAwOworCisJaWYgKChkaXJlbnQtPmlub2RlIDwgc2QtPmZpcnN0X2lub2RlKSB8fCAoZW50cnkgPCBESVJFTlRfT1RIRVJfRklMRSkgfHwKKwkgICAgIWV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpbm9kZV9kdXBfbWFwLCBkaXJlbnQtPmlub2RlKSkKKwkJcmV0dXJuIDA7CisKKwluID0gZGljdF9sb29rdXAoJmlub19kaWN0LCBJTlRfVE9fVk9JRFBUUihkaXJlbnQtPmlub2RlKSk7CisJaWYgKCFuKQorCQlyZXR1cm4gMDsKKwlwID0gKHN0cnVjdCBkdXBfaW5vZGUgKikgZG5vZGVfZ2V0KG4pOworCXAtPmRpciA9IGRpcjsKKwlzZC0+Y291bnQtLTsKKworCXJldHVybiBzZC0+Y291bnQgPyAwIDogRElSRU5UX0FCT1JUOworfQorCisKK3N0YXRpYyB2b2lkIHBhc3MxYyhlMmZzY2tfdCBjdHgsIGNoYXIgKmJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IHNlYXJjaF9kaXJfc3RydWN0IHNkOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQ19QQVNTX0hFQURFUiwgJnBjdHgpOworCisJLyoKKwkgKiBTZWFyY2ggdGhyb3VnaCBhbGwgZGlyZWN0b3JpZXMgdG8gdHJhbnNsYXRlIGlub2RlcyB0byBuYW1lcworCSAqIChieSBzZWFyY2hpbmcgZm9yIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeSBmb3IgdGhhdCBpbm9kZS4pCisJICovCisJc2QuY291bnQgPSBkdXBfaW5vZGVfY291bnQ7CisJc2QuZmlyc3RfaW5vZGUgPSBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcik7CisJc2QubWF4X2lub2RlID0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudDsKKwlleHQyZnNfZGJsaXN0X2Rpcl9pdGVyYXRlKGZzLT5kYmxpc3QsIDAsIGJsb2NrX2J1ZiwKKwkJCQkgIHNlYXJjaF9kaXJlbnRfcHJvYywgJnNkKTsKK30KKworc3RhdGljIHZvaWQgcGFzczFkKGUyZnNja190IGN0eCwgY2hhciAqYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgZHVwX2lub2RlICAgICAgICAqcCwgKnQ7CisJc3RydWN0IGR1cF9ibG9jayAgICAgICAgKnE7CisJZXh0Ml9pbm9fdCAgICAgICAgICAgICAgKnNoYXJlZCwgaW5vOworCWludCAgICAgc2hhcmVkX2xlbjsKKwlpbnQgICAgIGk7CisJaW50ICAgICBmaWxlX29rOworCWludCAgICAgbWV0YV9kYXRhID0gMDsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisJZG5vZGVfdCAqbiwgKm07CisJc3RydWN0IGJsb2NrX2VsICpzOworCXN0cnVjdCBpbm9kZV9lbCAqcjsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9QQVNTX0hFQURFUiwgJnBjdHgpOworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKworCXBjdHgubnVtID0gZHVwX2lub2RlX2NvdW50OyAvKiBkaWN0X2NvdW50KCZpbm9fZGljdCk7ICovCisJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9OVU1fRFVQX0lOT0RFUywgJnBjdHgpOworCXNoYXJlZCA9IChleHQyX2lub190ICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkJCXNpemVvZihleHQyX2lub190KSAqIGRpY3RfY291bnQoJmlub19kaWN0KSwKKwkJCQkiU2hhcmVkIGlub2RlIGxpc3QiKTsKKwlmb3IgKG4gPSBkaWN0X2ZpcnN0KCZpbm9fZGljdCk7IG47IG4gPSBkaWN0X25leHQoJmlub19kaWN0LCBuKSkgeworCQlwID0gKHN0cnVjdCBkdXBfaW5vZGUgKikgZG5vZGVfZ2V0KG4pOworCQlzaGFyZWRfbGVuID0gMDsKKwkJZmlsZV9vayA9IDE7CisJCWlubyA9IChleHQyX2lub190KVZPSURQVFJfVE9fSU5UKGRub2RlX2dldGtleShuKSk7CisJCWlmIChpbm8gPT0gRVhUMl9CQURfSU5PIHx8IGlubyA9PSBFWFQyX1JFU0laRV9JTk8pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBGaW5kIGFsbCBvZiB0aGUgaW5vZGVzIHdoaWNoIHNoYXJlIGJsb2NrcyB3aXRoIHRoaXMKKwkJICogb25lLiAgRmlyc3Qgd2UgZmluZCBhbGwgb2YgdGhlIGR1cGxpY2F0ZSBibG9ja3MKKwkJICogYmVsb25naW5nIHRvIHRoaXMgaW5vZGUsIGFuZCB0aGVuIHNlYXJjaCBlYWNoIGJsb2NrCisJCSAqIGdldCB0aGUgbGlzdCBvZiBpbm9kZXMsIGFuZCBtZXJnZSB0aGVtIHRvZ2V0aGVyLgorCQkgKi8KKwkJZm9yIChzID0gcC0+YmxvY2tfbGlzdDsgczsgcyA9IHMtPm5leHQpIHsKKwkJCW0gPSBkaWN0X2xvb2t1cCgmYmxrX2RpY3QsIElOVF9UT19WT0lEUFRSKHMtPmJsb2NrKSk7CisJCQlpZiAoIW0pCisJCQkJY29udGludWU7IC8qIFNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KKwkJCXEgPSAoc3RydWN0IGR1cF9ibG9jayAqKSBkbm9kZV9nZXQobSk7CisJCQlpZiAocS0+bnVtX2JhZCA+IDEpCisJCQkJZmlsZV9vayA9IDA7CisJCQlpZiAoY2hlY2tfaWZfZnNfYmxvY2soY3R4LCBzLT5ibG9jaykpIHsKKwkJCQlmaWxlX29rID0gMDsKKwkJCQltZXRhX2RhdGEgPSAxOworCQkJfQorCisJCQkvKgorCQkJICogQWRkIGFsbCBpbm9kZXMgdXNlZCBieSB0aGlzIGJsb2NrIHRvIHRoZQorCQkJICogc2hhcmVkW10gLS0tIHdoaWNoIGlzIGEgdW5pcXVlIGxpc3QsIHNvCisJCQkgKiBpZiBhbiBpbm9kZSBpcyBhbHJlYWR5IGluIHNoYXJlZFtdLCBkb24ndAorCQkJICogYWRkIGl0IGFnYWluLgorCQkJICovCisJCQlmb3IgKHIgPSBxLT5pbm9kZV9saXN0OyByOyByID0gci0+bmV4dCkgeworCQkJCWlmIChyLT5pbm9kZSA9PSBpbm8pCisJCQkJCWNvbnRpbnVlOworCQkJCWZvciAoaSA9IDA7IGkgPCBzaGFyZWRfbGVuOyBpKyspCisJCQkJCWlmIChzaGFyZWRbaV0gPT0gci0+aW5vZGUpCisJCQkJCQlicmVhazsKKwkJCQlpZiAoaSA9PSBzaGFyZWRfbGVuKSB7CisJCQkJCXNoYXJlZFtzaGFyZWRfbGVuKytdID0gci0+aW5vZGU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogUmVwb3J0IHRoZSBpbm9kZSB0aGF0IHdlIGFyZSB3b3JraW5nIG9uCisJCSAqLworCQlwY3R4Lmlub2RlID0gJnAtPmlub2RlOworCQlwY3R4LmlubyA9IGlubzsKKwkJcGN0eC5kaXIgPSBwLT5kaXI7CisJCXBjdHguYmxrY291bnQgPSBwLT5udW1fZHVwYmxvY2tzOworCQlwY3R4Lm51bSA9IG1ldGFfZGF0YSA/IHNoYXJlZF9sZW4rMSA6IHNoYXJlZF9sZW47CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMURfRFVQX0ZJTEUsICZwY3R4KTsKKwkJcGN0eC5ibGtjb3VudCA9IDA7CisJCXBjdHgubnVtID0gMDsKKworCQlpZiAobWV0YV9kYXRhKQorCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9TSEFSRV9NRVRBREFUQSwgJnBjdHgpOworCisJCWZvciAoaSA9IDA7IGkgPCBzaGFyZWRfbGVuOyBpKyspIHsKKwkJCW0gPSBkaWN0X2xvb2t1cCgmaW5vX2RpY3QsIElOVF9UT19WT0lEUFRSKHNoYXJlZFtpXSkpOworCQkJaWYgKCFtKQorCQkJCWNvbnRpbnVlOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQl0ID0gKHN0cnVjdCBkdXBfaW5vZGUgKikgZG5vZGVfZ2V0KG0pOworCQkJLyoKKwkJCSAqIFJlcG9ydCB0aGUgaW5vZGUgdGhhdCB3ZSBhcmUgc2hhcmluZyB3aXRoCisJCQkgKi8KKwkJCXBjdHguaW5vZGUgPSAmdC0+aW5vZGU7CisJCQlwY3R4LmlubyA9IHNoYXJlZFtpXTsKKwkJCXBjdHguZGlyID0gdC0+ZGlyOworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9EVVBfRklMRV9MSVNULCAmcGN0eCk7CisJCX0KKwkJaWYgKGZpbGVfb2spIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMURfRFVQX0JMT0NLU19ERUFMVCwgJnBjdHgpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMURfQ0xPTkVfUVVFU1RJT04sICZwY3R4KSkgeworCQkJcGN0eC5lcnJjb2RlID0gY2xvbmVfZmlsZShjdHgsIGlubywgcCwgYmxvY2tfYnVmKTsKKwkJCWlmIChwY3R4LmVycmNvZGUpCisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8xRF9DTE9ORV9FUlJPUiwgJnBjdHgpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzFEX0RFTEVURV9RVUVTVElPTiwgJnBjdHgpKQorCQkJZGVsZXRlX2ZpbGUoY3R4LCBpbm8sIHAsIGJsb2NrX2J1Zik7CisJCWVsc2UKKwkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJnNoYXJlZCk7Cit9CisKKy8qCisgKiBEcm9wIHRoZSByZWZjb3VudCBvbiB0aGUgZHVwX2Jsb2NrIHN0cnVjdHVyZSwgYW5kIGNsZWFyIHRoZSBlbnRyeQorICogaW4gdGhlIGJsb2NrX2R1cF9tYXAgaWYgYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGRlY3JlbWVudF9iYWRjb3VudChlMmZzY2tfdCBjdHgsIGJsa190IGJsb2NrLCBzdHJ1Y3QgZHVwX2Jsb2NrICpwKQoreworCXAtPm51bV9iYWQtLTsKKwlpZiAocC0+bnVtX2JhZCA8PSAwIHx8CisJICAgIChwLT5udW1fYmFkID09IDEgJiYgIWNoZWNrX2lmX2ZzX2Jsb2NrKGN0eCwgYmxvY2spKSkKKwkJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19kdXBfbWFwLCBibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZGVsZXRlX2ZpbGVfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgIGJsa190ICAgICAgKmJsb2NrX25yLAorCQkJICAgICBlMl9ibGtjbnRfdCBibG9ja2NudCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICBibGtfdCByZWZfYmxvY2sgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgaW50IHJlZl9vZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xYiAqcGI7CisJc3RydWN0IGR1cF9ibG9jayAqcDsKKwlkbm9kZV90ICpuOworCWUyZnNja190IGN0eDsKKworCXBiID0gKHN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdF8xYiAqKSBwcml2X2RhdGE7CisJY3R4ID0gcGItPmN0eDsKKworCWlmIChIT0xFX0JMS0FERFIoKmJsb2NrX25yKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZHVwX21hcCwgKmJsb2NrX25yKSkgeworCQluID0gZGljdF9sb29rdXAoJmJsa19kaWN0LCBJTlRfVE9fVk9JRFBUUigqYmxvY2tfbnIpKTsKKwkJaWYgKG4pIHsKKwkJCXAgPSAoc3RydWN0IGR1cF9ibG9jayAqKSBkbm9kZV9nZXQobik7CisJCQlkZWNyZW1lbnRfYmFkY291bnQoY3R4LCAqYmxvY2tfbnIsIHApOworCQl9IGVsc2UKKwkJCWJiX2Vycm9yX21zZyhfKCJpbnRlcm5hbCBlcnJvcjsgY2FuJ3QgZmluZCBkdXBfYmxrIGZvciAlZCIpLAorCQkJCSpibG9ja19ucik7CisJfSBlbHNlIHsKKwkJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsICpibG9ja19ucik7CisJCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgKmJsb2NrX25yLCAtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9maWxlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sCisJCQlzdHJ1Y3QgZHVwX2lub2RlICpkcCwgY2hhciogYmxvY2tfYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3RfMWIgcGI7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjb3VudDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJcGN0eC5pbm8gPSBwYi5pbm8gPSBpbm87CisJcGIuZHVwX2Jsb2NrcyA9IGRwLT5udW1fZHVwYmxvY2tzOworCXBiLmN0eCA9IGN0eDsKKwlwY3R4LnN0ciA9ICJkZWxldGVfZmlsZSI7CisKKwllMmZzY2tfcmVhZF9pbm9kZShjdHgsIGlubywgJmlub2RlLCAiZGVsZXRlX2ZpbGUiKTsKKwlpZiAoZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoJmlub2RlKSkKKwkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBpbm8sIDAsIGJsb2NrX2J1ZiwKKwkJCQkJCSAgICAgZGVsZXRlX2ZpbGVfYmxvY2ssICZwYik7CisJaWYgKHBjdHguZXJyY29kZSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8xQl9CTE9DS19JVEVSQVRFLCAmcGN0eCk7CisJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKTsKKwlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGlubyk7CisJaWYgKGN0eC0+aW5vZGVfYmFkX21hcCkKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9iYWRfbWFwLCBpbm8pOworCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGlubywgLTEsIExJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSk7CisKKwkvKiBJbm9kZSBtYXkgaGF2ZSBjaGFuZ2VkIGJ5IGJsb2NrX2l0ZXJhdGUsIHNvIHJlcmVhZCBpdCAqLworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJkZWxldGVfZmlsZSIpOworCWlub2RlLmlfbGlua3NfY291bnQgPSAwOworCWlub2RlLmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCWlmIChpbm9kZS5pX2ZpbGVfYWNsICYmCisJICAgIChmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkgeworCQljb3VudCA9IDE7CisJCXBjdHguZXJyY29kZSA9IGV4dDJmc19hZGp1c3RfZWFfcmVmY291bnQoZnMsIGlub2RlLmlfZmlsZV9hY2wsCisJCQkJCQkgICBibG9ja19idWYsIC0xLCAmY291bnQpOworCQlpZiAocGN0eC5lcnJjb2RlID09IEVYVDJfRVRfQkFEX0VBX0JMT0NLX05VTSkgeworCQkJcGN0eC5lcnJjb2RlID0gMDsKKwkJCWNvdW50ID0gMTsKKwkJfQorCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQlwY3R4LmJsayA9IGlub2RlLmlfZmlsZV9hY2w7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzFCX0FESl9FQV9SRUZDT1VOVCwgJnBjdHgpOworCQl9CisJCS8qCisJCSAqIElmIHRoZSBjb3VudCBpcyB6ZXJvLCB0aGVuIGFycmFuZ2UgdG8gaGF2ZSB0aGUKKwkJICogYmxvY2sgZGVsZXRlZC4gIElmIHRoZSBibG9jayBpcyBpbiB0aGUgYmxvY2tfZHVwX21hcCwKKwkJICogYWxzbyBjYWxsIGRlbGV0ZV9maWxlX2Jsb2NrIHNpbmNlIGl0IHdpbGwgdGFrZSBjYXJlCisJCSAqIG9mIGtlZXBpbmcgdGhlIGFjY291bnRpbmcgc3RyYWlnaHQuCisJCSAqLworCQlpZiAoKGNvdW50ID09IDApIHx8CisJCSAgICBleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19kdXBfbWFwLAorCQkJCQkgICAgIGlub2RlLmlfZmlsZV9hY2wpKQorCQkJZGVsZXRlX2ZpbGVfYmxvY2soZnMsICZpbm9kZS5pX2ZpbGVfYWNsLAorCQkJCQkgIEJMT0NLX0NPVU5UX0VYVEFUVFIsIDAsIDAsICZwYik7CisJfQorCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgJmlub2RlLCAiZGVsZXRlX2ZpbGUiKTsKK30KKworc3RydWN0IGNsb25lX3N0cnVjdCB7CisJZXJyY29kZV90ICAgICAgIGVycmNvZGU7CisJZXh0Ml9pbm9fdCAgICAgIGRpcjsKKwljaGFyICAgICpidWY7CisJZTJmc2NrX3QgY3R4OworfTsKKworc3RhdGljIGludCBjbG9uZV9maWxlX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgIGJsa190ICAgICAgICpibG9ja19uciwKKwkJCSAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCSAgICBibGtfdCByZWZfYmxvY2sgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZHVwX2Jsb2NrICpwOworCWJsa190ICAgbmV3X2Jsb2NrOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJc3RydWN0IGNsb25lX3N0cnVjdCAqY3MgPSAoc3RydWN0IGNsb25lX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJZG5vZGVfdCAqbjsKKwllMmZzY2tfdCBjdHg7CisKKwljdHggPSBjcy0+Y3R4OworCisJaWYgKEhPTEVfQkxLQUREUigqYmxvY2tfbnIpKQorCQlyZXR1cm4gMDsKKworCWlmIChleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19kdXBfbWFwLCAqYmxvY2tfbnIpKSB7CisJCW4gPSBkaWN0X2xvb2t1cCgmYmxrX2RpY3QsIElOVF9UT19WT0lEUFRSKCpibG9ja19ucikpOworCQlpZiAobikgeworCQkJcCA9IChzdHJ1Y3QgZHVwX2Jsb2NrICopIGRub2RlX2dldChuKTsKKwkJCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIDAsIGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQkJICAmbmV3X2Jsb2NrKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQljcy0+ZXJyY29kZSA9IHJldHZhbDsKKwkJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCQl9CisJCQlpZiAoY3MtPmRpciAmJiAoYmxvY2tjbnQgPj0gMCkpIHsKKwkJCQlyZXR2YWwgPSBleHQyZnNfc2V0X2Rpcl9ibG9jayhmcy0+ZGJsaXN0LAorCQkJCSAgICAgIGNzLT5kaXIsIG5ld19ibG9jaywgYmxvY2tjbnQpOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJY3MtPmVycmNvZGUgPSByZXR2YWw7CisJCQkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJCQl9CisJCQl9CisKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCAqYmxvY2tfbnIsIDEsCisJCQkJCQkgICAgIGNzLT5idWYpOworCQkJaWYgKHJldHZhbCkgeworCQkJCWNzLT5lcnJjb2RlID0gcmV0dmFsOworCQkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJCX0KKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgbmV3X2Jsb2NrLCAxLAorCQkJCQkJICAgICAgY3MtPmJ1Zik7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJY3MtPmVycmNvZGUgPSByZXR2YWw7CisJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQkJfQorCQkJZGVjcmVtZW50X2JhZGNvdW50KGN0eCwgKmJsb2NrX25yLCBwKTsKKwkJCSpibG9ja19uciA9IG5ld19ibG9jazsKKwkJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwKKwkJCQkJCSBuZXdfYmxvY2spOworCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsIG5ld19ibG9jayk7CisJCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKKwkJfSBlbHNlCisJCQliYl9lcnJvcl9tc2coXygiaW50ZXJuYWwgZXJyb3I7IGNhbid0IGZpbmQgZHVwX2JsayBmb3IgJWQiKSwKKwkJCQkqYmxvY2tfbnIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbG9uZV9maWxlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sCisJCSAgICAgIHN0cnVjdCBkdXBfaW5vZGUgKmRwLCBjaGFyKiBibG9ja19idWYpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJc3RydWN0IGNsb25lX3N0cnVjdCBjczsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCWJsa190ICAgICAgICAgICBibGs7CisJZG5vZGVfdCAgICAgICAgICpuOworCXN0cnVjdCBpbm9kZV9lbCAqaW5vX2VsOworCXN0cnVjdCBkdXBfYmxvY2sgICAgICAgICpkYjsKKwlzdHJ1Y3QgZHVwX2lub2RlICAgICAgICAqZGk7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCWNzLmVycmNvZGUgPSAwOworCWNzLmRpciA9IDA7CisJY3MuY3R4ID0gY3R4OworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZjcy5idWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaW5vKSkKKwkJY3MuZGlyID0gaW5vOworCisJcGN0eC5pbm8gPSBpbm87CisJcGN0eC5zdHIgPSAiY2xvbmVfZmlsZSI7CisJaWYgKGV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKCZkcC0+aW5vZGUpKQorCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgMCwgYmxvY2tfYnVmLAorCQkJCQkJICAgICBjbG9uZV9maWxlX2Jsb2NrLCAmY3MpOworCWV4dDJmc19tYXJrX2JiX2RpcnR5KGZzKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMUJfQkxPQ0tfSVRFUkFURSwgJnBjdHgpOworCQlyZXR2YWwgPSBwY3R4LmVycmNvZGU7CisJCWdvdG8gZXJyb3V0OworCX0KKwlpZiAoY3MuZXJyY29kZSkgeworCQliYl9lcnJvcl9tc2coXygicmV0dXJuZWQgZnJvbSBjbG9uZV9maWxlX2Jsb2NrIikpOworCQlyZXR2YWwgPSBjcy5lcnJjb2RlOworCQlnb3RvIGVycm91dDsKKwl9CisJLyogVGhlIGlub2RlIG1heSBoYXZlIGNoYW5nZWQgb24gZGlzaywgc28gd2UgaGF2ZSB0byByZS1yZWFkIGl0ICovCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZkcC0+aW5vZGUsICJjbG9uZSBmaWxlIEVBIik7CisJYmxrID0gZHAtPmlub2RlLmlfZmlsZV9hY2w7CisJaWYgKGJsayAmJiAoY2xvbmVfZmlsZV9ibG9jayhmcywgJmRwLT5pbm9kZS5pX2ZpbGVfYWNsLAorCQkJCSAgICAgQkxPQ0tfQ09VTlRfRVhUQVRUUiwgMCwgMCwgJmNzKSA9PQorCQkgICAgQkxPQ0tfQ0hBTkdFRCkpIHsKKwkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCAmZHAtPmlub2RlLCAiY2xvbmUgZmlsZSBFQSIpOworCQkvKgorCQkgKiBJZiB3ZSBjbG9uZWQgdGhlIEVBIGJsb2NrLCBmaW5kIGFsbCBvdGhlciBpbm9kZXMKKwkJICogd2hpY2ggcmVmZXJlZCB0byB0aGF0IEVBIGJsb2NrLCBhbmQgbW9kaWZ5CisJCSAqIHRoZW0gdG8gcG9pbnQgdG8gdGhlIG5ldyBFQSBibG9jay4KKwkJICovCisJCW4gPSBkaWN0X2xvb2t1cCgmYmxrX2RpY3QsIElOVF9UT19WT0lEUFRSKGJsaykpOworCQlkYiA9IChzdHJ1Y3QgZHVwX2Jsb2NrICopIGRub2RlX2dldChuKTsKKwkJZm9yIChpbm9fZWwgPSBkYi0+aW5vZGVfbGlzdDsgaW5vX2VsOyBpbm9fZWwgPSBpbm9fZWwtPm5leHQpIHsKKwkJCWlmIChpbm9fZWwtPmlub2RlID09IGlubykKKwkJCQljb250aW51ZTsKKwkJCW4gPSBkaWN0X2xvb2t1cCgmaW5vX2RpY3QsIElOVF9UT19WT0lEUFRSKGlub19lbC0+aW5vZGUpKTsKKwkJCWRpID0gKHN0cnVjdCBkdXBfaW5vZGUgKikgZG5vZGVfZ2V0KG4pOworCQkJaWYgKGRpLT5pbm9kZS5pX2ZpbGVfYWNsID09IGJsaykgeworCQkJCWRpLT5pbm9kZS5pX2ZpbGVfYWNsID0gZHAtPmlub2RlLmlfZmlsZV9hY2w7CisJCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vX2VsLT5pbm9kZSwKKwkJCQkJICAgJmRpLT5pbm9kZSwgImNsb25lIGZpbGUgRUEiKTsKKwkJCQlkZWNyZW1lbnRfYmFkY291bnQoY3R4LCBibGssIGRiKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR2YWwgPSAwOworZXJyb3V0OgorCWV4dDJmc19mcmVlX21lbSgmY3MuYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgMSBpZiBhIGJsb2NrIG92ZXJsYXBzIHdpdGggb25lIG9mIHRoZSBzdXBlcmJsb2NrcywKKyAqIGdyb3VwIGRlc2NyaXB0b3JzLCBpbm9kZSBiaXRtYXBzLCBvciBibG9jayBiaXRtYXBzLgorICovCitzdGF0aWMgaW50IGNoZWNrX2lmX2ZzX2Jsb2NrKGUyZnNja190IGN0eCwgYmxrX3QgdGVzdF9ibG9jaykKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJYmxrX3QgICBibG9jazsKKwlkZ3JwX3QgIGk7CisKKwlibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisKKwkJLyogQ2hlY2sgc3VwZXJibG9ja3MvYmxvY2sgZ3JvdXAgZGVzY3JpcHRyb3MgKi8KKwkJaWYgKGV4dDJmc19iZ19oYXNfc3VwZXIoZnMsIGkpKSB7CisJCQlpZiAodGVzdF9ibG9jayA+PSBibG9jayAmJgorCQkJICAgICh0ZXN0X2Jsb2NrIDw9IGJsb2NrICsgZnMtPmRlc2NfYmxvY2tzKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIENoZWNrIHRoZSBpbm9kZSB0YWJsZSAqLworCQlpZiAoKGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX3RhYmxlKSAmJgorCQkgICAgKHRlc3RfYmxvY2sgPj0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfdGFibGUpICYmCisJCSAgICAodGVzdF9ibG9jayA8IChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV90YWJsZSArCisJCQkJICAgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXApKSkKKwkJCXJldHVybiAxOworCisJCS8qIENoZWNrIHRoZSBiaXRtYXAgYmxvY2tzICovCisJCWlmICgodGVzdF9ibG9jayA9PSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXApIHx8CisJCSAgICAodGVzdF9ibG9jayA9PSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXApKQorCQkJcmV0dXJuIDE7CisKKwkJYmxvY2sgKz0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJfQorCXJldHVybiAwOworfQorLyoKKyAqIHBhc3MyLmMgLS0tIGNoZWNrIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAqCisgKiBQYXNzIDIgb2YgZTJmc2NrIGl0ZXJhdGVzIHRocm91Z2ggYWxsIGFjdGl2ZSBkaXJlY3RvcnkgaW5vZGVzLCBhbmQKKyAqIGFwcGxpZXMgdG8gZm9sbG93aW5nIHRlc3RzIHRvIGVhY2ggZGlyZWN0b3J5IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkKKyAqIGJsb2NrcyBpbiB0aGUgaW5vZGVzOgorICoKKyAqICAgICAgLSBUaGUgbGVuZ3RoIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgKHJlY19sZW4pIHNob3VsZCBiZSBhdAorICogICAgICAgICAgICAgIGxlYXN0IDggYnl0ZXMsIGFuZCBubyBtb3JlIHRoYW4gdGhlIHJlbWFpbmluZyBzcGFjZQorICogICAgICAgICAgICAgIGxlZnQgaW4gdGhlIGRpcmVjdG9yeSBibG9jay4KKyAqICAgICAgLSBUaGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGluIHRoZSBkaXJlY3RvcnkgZW50cnkgKG5hbWVfbGVuKQorICogICAgICAgICAgICAgIHNob3VsZCBiZSBsZXNzIHRoYW4gKHJlY19sZW4gLSA4KS4KKyAqICAgICAgLSBUaGUgaW5vZGUgbnVtYmVyIGluIHRoZSBkaXJlY3RvcnkgZW50cnkgc2hvdWxkIGJlIHdpdGhpbgorICogICAgICAgICAgICAgIGxlZ2FsIGJvdW5kcy4KKyAqICAgICAgLSBUaGUgaW5vZGUgbnVtYmVyIHNob3VsZCByZWZlciB0byBhIGluLXVzZSBpbm9kZS4KKyAqICAgICAgLSBUaGUgZmlyc3QgZW50cnkgc2hvdWxkIGJlICcuJywgYW5kIGl0cyBpbm9kZSBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICB0aGUgaW5vZGUgb2YgdGhlIGRpcmVjdG9yeS4KKyAqICAgICAgLSBUaGUgc2Vjb25kIGVudHJ5IHNob3VsZCBiZSAnLi4nLgorICoKKyAqIFRvIG1pbmltaXplIGRpc2sgc2VlayB0aW1lLCB0aGUgZGlyZWN0b3J5IGJsb2NrcyBhcmUgcHJvY2Vzc2VkIGluCisgKiBzb3J0ZWQgb3JkZXIgb2YgYmxvY2sgbnVtYmVycy4KKyAqCisgKiBQYXNzIDIgYWxzbyBjb2xsZWN0cyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorICogICAgICAtIFRoZSBpbm9kZSBudW1iZXJzIG9mIHRoZSBzdWJkaXJlY3RvcmllcyBmb3IgZWFjaCBkaXJlY3RvcnkuCisgKgorICogUGFzcyAyIHJlbGllcyBvbiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgcGFzc2VzOgorICogICAgICAtIFRoZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHBhc3MgMS4KKyAqICAgICAgLSBUaGUgaW5vZGVfdXNlZF9tYXAgYml0bWFwCisgKiAgICAgIC0gVGhlIGlub2RlX2JhZF9tYXAgYml0bWFwCisgKiAgICAgIC0gVGhlIGlub2RlX2Rpcl9tYXAgYml0bWFwCisgKgorICogUGFzcyAyIGZyZWVzIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzCisgKiAgICAgIC0gVGhlIGlub2RlX2JhZF9tYXAgYml0bWFwCisgKiAgICAgIC0gVGhlIGlub2RlX3JlZ19tYXAgYml0bWFwCisgKi8KKworLyoKKyAqIEtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRpbWVzIGFuIGlub2RlIGlzIHJlZmVyZW5jZWQuCisgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NhdGVfaW5vZGUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywgY2hhciogYmxvY2tfYnVmKTsKK3N0YXRpYyBpbnQgY2hlY2tfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRpcl9ibG9ja3NfaW5mbywKKwkJCSAgIHZvaWQgKnByaXZfZGF0YSk7CitzdGF0aWMgaW50IGFsbG9jYXRlX2Rpcl9ibG9jayhlMmZzY2tfdCBjdHgsIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkaXJfYmxvY2tzX2luZm8sCisJCQkgICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KTsKK3N0YXRpYyBpbnQgdXBkYXRlX2Rpcl9ibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCSAgICBibGtfdCAgICAgICAqYmxvY2tfbnIsCisJCQkgICAgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCQkgICAgYmxrX3QgICAgICAgcmVmX2Jsb2NrLAorCQkJICAgIGludCAgICAgICAgIHJlZl9vZmZzZXQsCisJCQkgICAgdm9pZCAgICAgICAgKnByaXZfZGF0YSk7CitzdGF0aWMgdm9pZCBjbGVhcl9odHJlZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vKTsKK3N0YXRpYyBpbnQgaHRyZWVfZGVwdGgoc3RydWN0IGR4X2Rpcl9pbmZvICpkeF9kaXIsCisJCSAgICAgICBzdHJ1Y3QgZHhfZGlyYmxvY2tfaW5mbyAqZHhfZGIpOworc3RhdGljIGludCBzcGVjaWFsX2Rpcl9ibG9ja19jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CisKK3N0cnVjdCBjaGVja19kaXJfc3RydWN0IHsKKwljaGFyICpidWY7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlpbnQgICAgIGNvdW50LCBtYXg7CisJZTJmc2NrX3QgY3R4OworfTsKKworc3RhdGljIHZvaWQgZTJmc2NrX3Bhc3MyKGUyZnNja190IGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBjdHgtPmZzLT5zdXBlcjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCWV4dDJfZmlsc3lzICAgICAgICAgICAgIGZzID0gY3R4LT5mczsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqYnVmOworCXN0cnVjdCBkaXJfaW5mbyAgICAgICAgICpkaXI7CisJc3RydWN0IGNoZWNrX2Rpcl9zdHJ1Y3QgY2Q7CisJc3RydWN0IGR4X2Rpcl9pbmZvICAgICAgKmR4X2RpcjsKKwlzdHJ1Y3QgZHhfZGlyYmxvY2tfaW5mbyAqZHhfZGIsICpkeF9wYXJlbnQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgYjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpLCBkZXB0aDsKKwlwcm9ibGVtX3QgICAgICAgICAgICAgICBjb2RlOworCWludCAgICAgICAgICAgICAgICAgICAgIGJhZF9kaXI7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJmNkLnBjdHgpOworCisJLyogUGFzcyAyICovCisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX1BBU1NfSEVBREVSLCAmY2QucGN0eCk7CisKKwljZC5wY3R4LmVycmNvZGUgPSBleHQyZnNfY3JlYXRlX2ljb3VudDIoZnMsIEVYVDJfSUNPVU5UX09QVF9JTkNSRU1FTlQsCisJCQkJCQkwLCBjdHgtPmlub2RlX2xpbmtfaW5mbywKKwkJCQkJCSZjdHgtPmlub2RlX2NvdW50KTsKKwlpZiAoY2QucGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9BTExPQ0FURV9JQ09VTlQsICZjZC5wY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlidWYgPSAoY2hhciAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgMipmcy0+YmxvY2tzaXplLAorCQkJCQkgICAgICAiZGlyZWN0b3J5IHNjYW4gYnVmZmVyIik7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgcGFyZW50IHBvaW50ZXIgZm9yIHRoZSByb290IGRpcmVjdG9yeSwgaWYKKwkgKiBwcmVzZW50LiAgKElmIHRoZSByb290IGRpcmVjdG9yeSBpcyBub3QgcHJlc2VudCwgd2Ugd2lsbAorCSAqIGNyZWF0ZSBpdCBpbiBwYXNzIDMuKQorCSAqLworCWRpciA9IGUyZnNja19nZXRfZGlyX2luZm8oY3R4LCBFWFQyX1JPT1RfSU5PKTsKKwlpZiAoZGlyKQorCQlkaXItPnBhcmVudCA9IEVYVDJfUk9PVF9JTk87CisKKwljZC5idWYgPSBidWY7CisJY2QuY3R4ID0gY3R4OworCWNkLmNvdW50ID0gMTsKKwljZC5tYXggPSBleHQyZnNfZGJsaXN0X2NvdW50KGZzLT5kYmxpc3QpOworCisJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCSh2b2lkKSAoY3R4LT5wcm9ncmVzcykoY3R4LCAyLCAwLCBjZC5tYXgpOworCisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKQorCQlleHQyZnNfZGJsaXN0X3NvcnQoZnMtPmRibGlzdCwgc3BlY2lhbF9kaXJfYmxvY2tfY21wKTsKKworCWNkLnBjdHguZXJyY29kZSA9IGV4dDJmc19kYmxpc3RfaXRlcmF0ZShmcy0+ZGJsaXN0LCBjaGVja19kaXJfYmxvY2ssCisJCQkJCQkmY2QpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCXJldHVybjsKKwlpZiAoY2QucGN0eC5lcnJjb2RlKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9EQkxJU1RfSVRFUkFURSwgJmNkLnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgRU5BQkxFX0hUUkVFCisJZm9yIChpPTA7IChkeF9kaXIgPSBlMmZzY2tfZHhfZGlyX2luZm9faXRlcihjdHgsICZpKSkgIT0gMDspIHsKKwkJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJCXJldHVybjsKKwkJaWYgKGR4X2Rpci0+bnVtYmxvY2tzID09IDApCisJCQljb250aW51ZTsKKwkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJYmFkX2RpciA9IDA7CisJCXBjdHguZGlyID0gZHhfZGlyLT5pbm87CisJCWR4X2RiID0gZHhfZGlyLT5keF9ibG9jazsKKwkJaWYgKGR4X2RiLT5mbGFncyAmIERYX0ZMQUdfUkVGRVJFTkNFRCkKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX0RVUF9SRUY7CisJCWVsc2UKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX1JFRkVSRU5DRUQ7CisJCS8qCisJCSAqIEZpbmQgYWxsIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBsZWFmIGJsb2NrcywgYW5kCisJCSAqIHVwZGF0ZSB0aGVpciBwYXJlbnQncyBtaW4gYW5kIG1heCBoYXNoIHZhbHVlcworCQkgKi8KKwkJZm9yIChiPTAsIGR4X2RiID0gZHhfZGlyLT5keF9ibG9jazsKKwkJICAgICBiIDwgZHhfZGlyLT5udW1ibG9ja3M7CisJCSAgICAgYisrLCBkeF9kYisrKSB7CisJCQlpZiAoKGR4X2RiLT50eXBlICE9IERYX0RJUkJMT0NLX0xFQUYpIHx8CisJCQkgICAgIShkeF9kYi0+ZmxhZ3MgJiAoRFhfRkxBR19GSVJTVCB8IERYX0ZMQUdfTEFTVCkpKQorCQkJCWNvbnRpbnVlOworCQkJZHhfcGFyZW50ID0gJmR4X2Rpci0+ZHhfYmxvY2tbZHhfZGItPnBhcmVudF07CisJCQkvKgorCQkJICogWFhYIE1ha2Ugc3VyZSBkeF9wYXJlbnQtPm1pbl9oYXNoID4gZHhfZGItPm1pbl9oYXNoCisJCQkgKi8KKwkJCWlmIChkeF9kYi0+ZmxhZ3MgJiBEWF9GTEFHX0ZJUlNUKQorCQkJCWR4X3BhcmVudC0+bWluX2hhc2ggPSBkeF9kYi0+bWluX2hhc2g7CisJCQkvKgorCQkJICogWFhYIE1ha2Ugc3VyZSBkeF9wYXJlbnQtPm1heF9oYXNoIDwgZHhfZGItPm1heF9oYXNoCisJCQkgKi8KKwkJCWlmIChkeF9kYi0+ZmxhZ3MgJiBEWF9GTEFHX0xBU1QpCisJCQkJZHhfcGFyZW50LT5tYXhfaGFzaCA9IGR4X2RiLT5tYXhfaGFzaDsKKwkJfQorCisJCWZvciAoYj0wLCBkeF9kYiA9IGR4X2Rpci0+ZHhfYmxvY2s7CisJCSAgICAgYiA8IGR4X2Rpci0+bnVtYmxvY2tzOworCQkgICAgIGIrKywgZHhfZGIrKykgeworCQkJcGN0eC5ibGtjb3VudCA9IGI7CisJCQlwY3R4Lmdyb3VwID0gZHhfZGItPnBhcmVudDsKKwkJCWNvZGUgPSAwOworCQkJaWYgKCEoZHhfZGItPmZsYWdzICYgRFhfRkxBR19GSVJTVCkgJiYKKwkJCSAgICAoZHhfZGItPm1pbl9oYXNoIDwgZHhfZGItPm5vZGVfbWluX2hhc2gpKSB7CisJCQkJcGN0eC5ibGsgPSBkeF9kYi0+bWluX2hhc2g7CisJCQkJcGN0eC5ibGsyID0gZHhfZGItPm5vZGVfbWluX2hhc2g7CisJCQkJY29kZSA9IFBSXzJfSFRSRUVfTUlOX0hBU0g7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBjb2RlLCAmcGN0eCk7CisJCQkJYmFkX2RpcisrOworCQkJfQorCQkJaWYgKGR4X2RiLT50eXBlID09IERYX0RJUkJMT0NLX0xFQUYpIHsKKwkJCQlkZXB0aCA9IGh0cmVlX2RlcHRoKGR4X2RpciwgZHhfZGIpOworCQkJCWlmIChkZXB0aCAhPSBkeF9kaXItPmRlcHRoKSB7CisJCQkJCWNvZGUgPSBQUl8yX0hUUkVFX0JBRF9ERVBUSDsKKwkJCQkJZml4X3Byb2JsZW0oY3R4LCBjb2RlLCAmcGN0eCk7CisJCQkJCWJhZF9kaXIrKzsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogVGhpcyB0ZXN0IGRvZXNuJ3QgYXBwbHkgZm9yIHRoZSByb290IGJsb2NrCisJCQkgKiBhdCBibG9jayAjMAorCQkJICovCisJCQlpZiAoYiAmJgorCQkJICAgIChkeF9kYi0+bWF4X2hhc2ggPiBkeF9kYi0+bm9kZV9tYXhfaGFzaCkpIHsKKwkJCQlwY3R4LmJsayA9IGR4X2RiLT5tYXhfaGFzaDsKKwkJCQlwY3R4LmJsazIgPSBkeF9kYi0+bm9kZV9tYXhfaGFzaDsKKwkJCQljb2RlID0gUFJfMl9IVFJFRV9NQVhfSEFTSDsKKwkJCQlmaXhfcHJvYmxlbShjdHgsIGNvZGUsICZwY3R4KTsKKwkJCQliYWRfZGlyKys7CisJCQl9CisJCQlpZiAoIShkeF9kYi0+ZmxhZ3MgJiBEWF9GTEFHX1JFRkVSRU5DRUQpKSB7CisJCQkJY29kZSA9IFBSXzJfSFRSRUVfTk9UUkVGOworCQkJCWZpeF9wcm9ibGVtKGN0eCwgY29kZSwgJnBjdHgpOworCQkJCWJhZF9kaXIrKzsKKwkJCX0gZWxzZSBpZiAoZHhfZGItPmZsYWdzICYgRFhfRkxBR19EVVBfUkVGKSB7CisJCQkJY29kZSA9IFBSXzJfSFRSRUVfRFVQUkVGOworCQkJCWZpeF9wcm9ibGVtKGN0eCwgY29kZSwgJnBjdHgpOworCQkJCWJhZF9kaXIrKzsKKwkJCX0KKwkJCWlmIChjb2RlID09IDApCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGJhZF9kaXIgJiYgZml4X3Byb2JsZW0oY3R4LCBQUl8yX0hUUkVFX0NMRUFSLCAmcGN0eCkpIHsKKwkJCWNsZWFyX2h0cmVlKGN0eCwgZHhfZGlyLT5pbm8pOworCQkJZHhfZGlyLT5udW1ibG9ja3MgPSAwOworCQl9CisJfQorI2VuZGlmCisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCWV4dDJmc19mcmVlX2RibGlzdChmcy0+ZGJsaXN0KTsKKworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2JhZF9tYXApOworCWN0eC0+aW5vZGVfYmFkX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfcmVnX21hcCk7CisJY3R4LT5pbm9kZV9yZWdfbWFwID0gMDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJaWYgKGN0eC0+bGFyZ2VfZmlsZXMpIHsKKwkJaWYgKCEoc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCQkgICAgICBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUpICYmCisJCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzJfRkVBVFVSRV9MQVJHRV9GSUxFUywgJnBjdHgpKSB7CisJCQlzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCB8PQorCQkJCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRTsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJfQorCQlpZiAoc2ItPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWICYmCisJCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzFfRlNfUkVWX0xFVkVMLCAmcGN0eCkpIHsKKwkJCWV4dDJmc191cGRhdGVfZHluYW1pY19yZXYoZnMpOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9CisJfSBlbHNlIGlmICghY3R4LT5sYXJnZV9maWxlcyAmJgorCSAgICAoc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCSAgICAgIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSkpIHsKKwkJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykgeworCQkJc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJj0KKwkJCQl+RVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9CisJfQorfQorCisjZGVmaW5lIE1BWF9ERVBUSCAzMjAwMAorc3RhdGljIGludCBodHJlZV9kZXB0aChzdHJ1Y3QgZHhfZGlyX2luZm8gKmR4X2RpciwKKwkJICAgICAgIHN0cnVjdCBkeF9kaXJibG9ja19pbmZvICpkeF9kYikKK3sKKwlpbnQgICAgIGRlcHRoID0gMDsKKworCXdoaWxlIChkeF9kYi0+dHlwZSAhPSBEWF9ESVJCTE9DS19ST09UICYmIGRlcHRoIDwgTUFYX0RFUFRIKSB7CisJCWR4X2RiID0gJmR4X2Rpci0+ZHhfYmxvY2tbZHhfZGItPnBhcmVudF07CisJCWRlcHRoKys7CisJfQorCXJldHVybiBkZXB0aDsKK30KKworc3RhdGljIGludCBkaWN0X2RlX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGVfYSwgKmRlX2I7CisJaW50ICAgICBhX2xlbiwgYl9sZW47CisKKwlkZV9hID0gKGNvbnN0IHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSBhOworCWFfbGVuID0gZGVfYS0+bmFtZV9sZW4gJiAweEZGOworCWRlX2IgPSAoY29uc3Qgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGI7CisJYl9sZW4gPSBkZV9iLT5uYW1lX2xlbiAmIDB4RkY7CisKKwlpZiAoYV9sZW4gIT0gYl9sZW4pCisJCXJldHVybiAoYV9sZW4gLSBiX2xlbik7CisKKwlyZXR1cm4gc3RybmNtcChkZV9hLT5uYW1lLCBkZV9iLT5uYW1lLCBhX2xlbik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHNwZWNpYWwgc29ydCBmdW5jdGlvbiB0aGF0IG1ha2VzIHN1cmUgdGhhdCBkaXJlY3RvcnkgYmxvY2tzCisgKiB3aXRoIGEgZGlyYmxvY2sgb2YgemVybyBhcmUgc29ydGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCisgKiBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgcm9vdCBub2RlIG9mIHRoZSBodHJlZSBkaXJlY3RvcmllcyBhcmUKKyAqIHByb2Nlc3NlZCBmaXJzdCwgc28gd2Uga25vdyB3aGF0IGhhc2ggdmVyc2lvbiB0byB1c2UuCisgKi8KK3N0YXRpYyBpbnQgc3BlY2lhbF9kaXJfYmxvY2tfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRiX2EgPQorCQkoY29uc3Qgc3RydWN0IGV4dDJfZGJfZW50cnkgKikgYTsKKwljb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfYiA9CisJCShjb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqKSBiOworCisJaWYgKGRiX2EtPmJsb2NrY250ICYmICFkYl9iLT5ibG9ja2NudCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWRiX2EtPmJsb2NrY250ICYmIGRiX2ItPmJsb2NrY250KQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZGJfYS0+YmxrICE9IGRiX2ItPmJsaykKKwkJcmV0dXJuIChpbnQpIChkYl9hLT5ibGsgLSBkYl9iLT5ibGspOworCisJaWYgKGRiX2EtPmlubyAhPSBkYl9iLT5pbm8pCisJCXJldHVybiAoaW50KSAoZGJfYS0+aW5vIC0gZGJfYi0+aW5vKTsKKworCXJldHVybiAoaW50KSAoZGJfYS0+YmxvY2tjbnQgLSBkYl9iLT5ibG9ja2NudCk7Cit9CisKKworLyoKKyAqIE1ha2Ugc3VyZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBpcyAnLicsIGFuZCB0aGF0IHRoZQorICogZGlyZWN0b3J5IGVudHJ5IGlzIHNhbmUuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZG90KGUyZnNja190IGN0eCwKKwkJICAgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJICAgICBleHQyX2lub190IGlubywgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKm5leHRkaXI7CisJaW50ICAgICBzdGF0dXMgPSAwOworCWludCAgICAgY3JlYXRlZCA9IDA7CisJaW50ICAgICBuZXdfbGVuOworCWludCAgICAgcHJvYmxlbSA9IDA7CisKKwlpZiAoIWRpcmVudC0+aW5vZGUpCisJCXByb2JsZW0gPSBQUl8yX01JU1NJTkdfRE9UOworCWVsc2UgaWYgKCgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpICE9IDEpIHx8CisJCSAoZGlyZW50LT5uYW1lWzBdICE9ICcuJykpCisJCXByb2JsZW0gPSBQUl8yXzFTVF9OT1RfRE9UOworCWVsc2UgaWYgKGRpcmVudC0+bmFtZVsxXSAhPSAnXDAnKQorCQlwcm9ibGVtID0gUFJfMl9ET1RfTlVMTF9URVJNOworCisJaWYgKHByb2JsZW0pIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgcHJvYmxlbSwgcGN0eCkpIHsKKwkJCWlmIChkaXJlbnQtPnJlY19sZW4gPCAxMikKKwkJCQlkaXJlbnQtPnJlY19sZW4gPSAxMjsKKwkJCWRpcmVudC0+aW5vZGUgPSBpbm87CisJCQlkaXJlbnQtPm5hbWVfbGVuID0gMTsKKwkJCWRpcmVudC0+bmFtZVswXSA9ICcuJzsKKwkJCWRpcmVudC0+bmFtZVsxXSA9ICdcMCc7CisJCQlzdGF0dXMgPSAxOworCQkJY3JlYXRlZCA9IDE7CisJCX0KKwl9CisJaWYgKGRpcmVudC0+aW5vZGUgIT0gaW5vKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfQkFEX0lOT0RFX0RPVCwgcGN0eCkpIHsKKwkJCWRpcmVudC0+aW5vZGUgPSBpbm87CisJCQlzdGF0dXMgPSAxOworCQl9CisJfQorCWlmIChkaXJlbnQtPnJlY19sZW4gPiAxMikgeworCQluZXdfbGVuID0gZGlyZW50LT5yZWNfbGVuIC0gMTI7CisJCWlmIChuZXdfbGVuID4gMTIpIHsKKwkJCWlmIChjcmVhdGVkIHx8CisJCQkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8yX1NQTElUX0RPVCwgcGN0eCkpIHsKKwkJCQluZXh0ZGlyID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKQorCQkJCQkoKGNoYXIgKikgZGlyZW50ICsgMTIpOworCQkJCWRpcmVudC0+cmVjX2xlbiA9IDEyOworCQkJCW5leHRkaXItPnJlY19sZW4gPSBuZXdfbGVuOworCQkJCW5leHRkaXItPmlub2RlID0gMDsKKwkJCQluZXh0ZGlyLT5uYW1lX2xlbiA9IDA7CisJCQkJc3RhdHVzID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogTWFrZSBzdXJlIHRoZSBzZWNvbmQgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBpcyAnLi4nLCBhbmQgdGhhdCB0aGUKKyAqIGRpcmVjdG9yeSBlbnRyeSBpcyBzYW5lLiAgV2UgZG8gbm90IGNoZWNrIHRoZSBpbm9kZSBudW1iZXIgb2YgJy4uJworICogaGVyZTsgdGhpcyBnZXRzIGRvbmUgaW4gcGFzcyAzLgorICovCitzdGF0aWMgaW50IGNoZWNrX2RvdGRvdChlMmZzY2tfdCBjdHgsCisJCQlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCXN0cnVjdCBkaXJfaW5mbyAqZGlyLCBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWludCAgICAgICAgICAgICBwcm9ibGVtID0gMDsKKworCWlmICghZGlyZW50LT5pbm9kZSkKKwkJcHJvYmxlbSA9IFBSXzJfTUlTU0lOR19ET1RfRE9UOworCWVsc2UgaWYgKCgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpICE9IDIpIHx8CisJCSAoZGlyZW50LT5uYW1lWzBdICE9ICcuJykgfHwKKwkJIChkaXJlbnQtPm5hbWVbMV0gIT0gJy4nKSkKKwkJcHJvYmxlbSA9IFBSXzJfMk5EX05PVF9ET1RfRE9UOworCWVsc2UgaWYgKGRpcmVudC0+bmFtZVsyXSAhPSAnXDAnKQorCQlwcm9ibGVtID0gUFJfMl9ET1RfRE9UX05VTExfVEVSTTsKKworCWlmIChwcm9ibGVtKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIHByb2JsZW0sIHBjdHgpKSB7CisJCQlpZiAoZGlyZW50LT5yZWNfbGVuIDwgMTIpCisJCQkJZGlyZW50LT5yZWNfbGVuID0gMTI7CisJCQkvKgorCQkJICogTm90ZTogd2UgZG9uJ3QgaGF2ZSB0aGUgcGFyZW50IGlub2RlIGp1c3QKKwkJCSAqIHlldCwgc28gd2Ugd2lsbCBmaWxsIGl0IGluIHdpdGggdGhlIHJvb3QKKwkJCSAqIGlub2RlLiAgVGhpcyB3aWxsIGdldCBmaXhlZCBpbiBwYXNzIDMuCisJCQkgKi8KKwkJCWRpcmVudC0+aW5vZGUgPSBFWFQyX1JPT1RfSU5POworCQkJZGlyZW50LT5uYW1lX2xlbiA9IDI7CisJCQlkaXJlbnQtPm5hbWVbMF0gPSAnLic7CisJCQlkaXJlbnQtPm5hbWVbMV0gPSAnLic7CisJCQlkaXJlbnQtPm5hbWVbMl0gPSAnXDAnOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWRpci0+ZG90ZG90ID0gZGlyZW50LT5pbm9kZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHRvIG1ha2Ugc3VyZSBhIGRpcmVjdG9yeSBlbnRyeSBkb2Vzbid0IGNvbnRhaW4gYW55IGlsbGVnYWwKKyAqIGNoYXJhY3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfbmFtZShlMmZzY2tfdCBjdHgsCisJCSAgICAgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkgICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWludCAgICAgaTsKKwlpbnQgICAgIGZpeHVwID0gLTE7CisJaW50ICAgICByZXQgPSAwOworCisJZm9yICggaSA9IDA7IGkgPCAoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpOyBpKyspIHsKKwkJaWYgKGRpcmVudC0+bmFtZVtpXSA9PSAnLycgfHwgZGlyZW50LT5uYW1lW2ldID09ICdcMCcpIHsKKwkJCWlmIChmaXh1cCA8IDApIHsKKwkJCQlmaXh1cCA9IGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9CQURfTkFNRSwgcGN0eCk7CisJCQl9CisJCQlpZiAoZml4dXApIHsKKwkJCQlkaXJlbnQtPm5hbWVbaV0gPSAnLic7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2hlY2sgdGhlIGRpcmVjdG9yeSBmaWxldHlwZSAoaWYgcHJlc2VudCkKKyAqLworCisvKgorICogR2l2ZW4gYSBtb2RlLCByZXR1cm4gdGhlIGV4dDIgZmlsZSB0eXBlCisgKi8KK3N0YXRpYyBpbnQgZXh0Ml9maWxlX3R5cGUodW5zaWduZWQgaW50IG1vZGUpCit7CisJaWYgKExJTlVYX1NfSVNSRUcobW9kZSkpCisJCXJldHVybiBFWFQyX0ZUX1JFR19GSUxFOworCisJaWYgKExJTlVYX1NfSVNESVIobW9kZSkpCisJCXJldHVybiBFWFQyX0ZUX0RJUjsKKworCWlmIChMSU5VWF9TX0lTQ0hSKG1vZGUpKQorCQlyZXR1cm4gRVhUMl9GVF9DSFJERVY7CisKKwlpZiAoTElOVVhfU19JU0JMSyhtb2RlKSkKKwkJcmV0dXJuIEVYVDJfRlRfQkxLREVWOworCisJaWYgKExJTlVYX1NfSVNMTksobW9kZSkpCisJCXJldHVybiBFWFQyX0ZUX1NZTUxJTks7CisKKwlpZiAoTElOVVhfU19JU0ZJRk8obW9kZSkpCisJCXJldHVybiBFWFQyX0ZUX0ZJRk87CisKKwlpZiAoTElOVVhfU19JU1NPQ0sobW9kZSkpCisJCXJldHVybiBFWFQyX0ZUX1NPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19maWxldHlwZShlMmZzY2tfdCBjdHgsCisJCQkJICAgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkJICAgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlpbnQgICAgIGZpbGV0eXBlID0gZGlyZW50LT5uYW1lX2xlbiA+PiA4OworCWludCAgICAgc2hvdWxkX2JlID0gRVhUMl9GVF9VTktOT1dOOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCisJaWYgKCEoY3R4LT5mcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJICAgICAgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKSkgeworCQlpZiAoZmlsZXR5cGUgPT0gMCB8fAorCQkgICAgIWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9DTEVBUl9GSUxFVFlQRSwgcGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJZGlyZW50LT5uYW1lX2xlbiA9IGRpcmVudC0+bmFtZV9sZW4gJiAweEZGOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgZGlyZW50LT5pbm9kZSkpIHsKKwkJc2hvdWxkX2JlID0gRVhUMl9GVF9ESVI7CisJfSBlbHNlIGlmIChleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9yZWdfbWFwLAorCQkJCQkgICAgZGlyZW50LT5pbm9kZSkpIHsKKwkJc2hvdWxkX2JlID0gRVhUMl9GVF9SRUdfRklMRTsKKwl9IGVsc2UgaWYgKGN0eC0+aW5vZGVfYmFkX21hcCAmJgorCQkgICBleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9iYWRfbWFwLAorCQkJCQkgICAgZGlyZW50LT5pbm9kZSkpCisJCXNob3VsZF9iZSA9IDA7CisJZWxzZSB7CisJCWUyZnNja19yZWFkX2lub2RlKGN0eCwgZGlyZW50LT5pbm9kZSwgJmlub2RlLAorCQkJCSAgImNoZWNrX2ZpbGV0eXBlIik7CisJCXNob3VsZF9iZSA9IGV4dDJfZmlsZV90eXBlKGlub2RlLmlfbW9kZSk7CisJfQorCWlmIChmaWxldHlwZSA9PSBzaG91bGRfYmUpCisJCXJldHVybiAwOworCXBjdHgtPm51bSA9IHNob3VsZF9iZTsKKworCWlmIChmaXhfcHJvYmxlbShjdHgsIGZpbGV0eXBlID8gUFJfMl9CQURfRklMRVRZUEUgOiBQUl8yX1NFVF9GSUxFVFlQRSwKKwkJCXBjdHgpID09IDApCisJCXJldHVybiAwOworCisJZGlyZW50LT5uYW1lX2xlbiA9IChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgfCBzaG91bGRfYmUgPDwgODsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIEVOQUJMRV9IVFJFRQorc3RhdGljIHZvaWQgcGFyc2VfaW50X25vZGUoZXh0Ml9maWxzeXMgZnMsCisJCQkgICBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGIsCisJCQkgICBzdHJ1Y3QgY2hlY2tfZGlyX3N0cnVjdCAqY2QsCisJCQkgICBzdHJ1Y3QgZHhfZGlyX2luZm8gICAqZHhfZGlyLAorCQkJICAgY2hhciAqYmxvY2tfYnVmKQoreworCXN0cnVjdCAgICAgICAgICBleHQyX2R4X3Jvb3RfaW5mbyAgKnJvb3Q7CisJc3RydWN0ICAgICAgICAgIGV4dDJfZHhfZW50cnkgKmVudDsKKwlzdHJ1Y3QgICAgICAgICAgZXh0Ml9keF9jb3VudGxpbWl0ICpsaW1pdDsKKwlzdHJ1Y3QgZHhfZGlyYmxvY2tfaW5mbyAqZHhfZGI7CisJaW50ICAgICAgICAgICAgIGksIGV4cGVjdF9saW1pdCwgY291bnQ7CisJYmxrX3QgICAgICAgICAgIGJsazsKKwlleHQyX2Rpcmhhc2hfdCAgbWluX2hhc2ggPSAweGZmZmZmZmZmOworCWV4dDJfZGlyaGFzaF90ICBtYXhfaGFzaCA9IDA7CisJZXh0Ml9kaXJoYXNoX3QgIGhhc2ggPSAwLCBwcmV2X2hhc2g7CisKKwlpZiAoZGItPmJsb2NrY250ID09IDApIHsKKwkJcm9vdCA9IChzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gKikgKGJsb2NrX2J1ZiArIDI0KTsKKwkJZW50ID0gKHN0cnVjdCBleHQyX2R4X2VudHJ5ICopIChibG9ja19idWYgKyAyNCArIHJvb3QtPmluZm9fbGVuZ3RoKTsKKwl9IGVsc2UgeworCQllbnQgPSAoc3RydWN0IGV4dDJfZHhfZW50cnkgKikgKGJsb2NrX2J1Zis4KTsKKwl9CisJbGltaXQgPSAoc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqKSBlbnQ7CisKKwljb3VudCA9IGV4dDJmc19sZTE2X3RvX2NwdShsaW1pdC0+Y291bnQpOworCWV4cGVjdF9saW1pdCA9IChmcy0+YmxvY2tzaXplIC0gKChjaGFyICopIGVudCAtIGJsb2NrX2J1ZikpIC8KKwkJc2l6ZW9mKHN0cnVjdCBleHQyX2R4X2VudHJ5KTsKKwlpZiAoZXh0MmZzX2xlMTZfdG9fY3B1KGxpbWl0LT5saW1pdCkgIT0gZXhwZWN0X2xpbWl0KSB7CisJCWNkLT5wY3R4Lm51bSA9IGV4dDJmc19sZTE2X3RvX2NwdShsaW1pdC0+bGltaXQpOworCQlpZiAoZml4X3Byb2JsZW0oY2QtPmN0eCwgUFJfMl9IVFJFRV9CQURfTElNSVQsICZjZC0+cGN0eCkpCisJCQlnb3RvIGNsZWFyX2FuZF9leGl0OworCX0KKwlpZiAoY291bnQgPiBleHBlY3RfbGltaXQpIHsKKwkJY2QtPnBjdHgubnVtID0gY291bnQ7CisJCWlmIChmaXhfcHJvYmxlbShjZC0+Y3R4LCBQUl8yX0hUUkVFX0JBRF9DT1VOVCwgJmNkLT5wY3R4KSkKKwkJCWdvdG8gY2xlYXJfYW5kX2V4aXQ7CisJCWNvdW50ID0gZXhwZWN0X2xpbWl0OworCX0KKworCWZvciAoaT0wOyBpIDwgY291bnQ7IGkrKykgeworCQlwcmV2X2hhc2ggPSBoYXNoOworCQloYXNoID0gaSA/IChleHQyZnNfbGUzMl90b19jcHUoZW50W2ldLmhhc2gpICYgfjEpIDogMDsKKwkJYmxrID0gZXh0MmZzX2xlMzJfdG9fY3B1KGVudFtpXS5ibG9jaykgJiAweDBmZmZmZmY7CisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgYmxvY2sgaXMgdmFsaWQgKi8KKwkJaWYgKGJsayA+IChibGtfdCkgZHhfZGlyLT5udW1ibG9ja3MpIHsKKwkJCWNkLT5wY3R4LmJsayA9IGJsazsKKwkJCWlmIChmaXhfcHJvYmxlbShjZC0+Y3R4LCBQUl8yX0hUUkVFX0JBREJMSywKKwkJCQkJJmNkLT5wY3R4KSkKKwkJCQlnb3RvIGNsZWFyX2FuZF9leGl0OworCQl9CisJCWlmIChoYXNoIDwgcHJldl9oYXNoICYmCisJCSAgICBmaXhfcHJvYmxlbShjZC0+Y3R4LCBQUl8yX0hUUkVFX0hBU0hfT1JERVIsICZjZC0+cGN0eCkpCisJCQlnb3RvIGNsZWFyX2FuZF9leGl0OworCQlkeF9kYiA9ICZkeF9kaXItPmR4X2Jsb2NrW2Jsa107CisJCWlmIChkeF9kYi0+ZmxhZ3MgJiBEWF9GTEFHX1JFRkVSRU5DRUQpIHsKKwkJCWR4X2RiLT5mbGFncyB8PSBEWF9GTEFHX0RVUF9SRUY7CisJCX0gZWxzZSB7CisJCQlkeF9kYi0+ZmxhZ3MgfD0gRFhfRkxBR19SRUZFUkVOQ0VEOworCQkJZHhfZGItPnBhcmVudCA9IGRiLT5ibG9ja2NudDsKKwkJfQorCQlpZiAoaGFzaCA8IG1pbl9oYXNoKQorCQkJbWluX2hhc2ggPSBoYXNoOworCQlpZiAoaGFzaCA+IG1heF9oYXNoKQorCQkJbWF4X2hhc2ggPSBoYXNoOworCQlkeF9kYi0+bm9kZV9taW5faGFzaCA9IGhhc2g7CisJCWlmICgoaSsxKSA8IGNvdW50KQorCQkJZHhfZGItPm5vZGVfbWF4X2hhc2ggPQorCQkJICBleHQyZnNfbGUzMl90b19jcHUoZW50W2krMV0uaGFzaCkgJiB+MTsKKwkJZWxzZSB7CisJCQlkeF9kYi0+bm9kZV9tYXhfaGFzaCA9IDB4ZmZmZmZmZmU7CisJCQlkeF9kYi0+ZmxhZ3MgfD0gRFhfRkxBR19MQVNUOworCQl9CisJCWlmIChpID09IDApCisJCQlkeF9kYi0+ZmxhZ3MgfD0gRFhfRkxBR19GSVJTVDsKKwl9CisJZHhfZGIgPSAmZHhfZGlyLT5keF9ibG9ja1tkYi0+YmxvY2tjbnRdOworCWR4X2RiLT5taW5faGFzaCA9IG1pbl9oYXNoOworCWR4X2RiLT5tYXhfaGFzaCA9IG1heF9oYXNoOworCXJldHVybjsKKworY2xlYXJfYW5kX2V4aXQ6CisJY2xlYXJfaHRyZWUoY2QtPmN0eCwgY2QtPnBjdHguaW5vKTsKKwlkeF9kaXItPm51bWJsb2NrcyA9IDA7Cit9CisjZW5kaWYgLyogRU5BQkxFX0hUUkVFICovCisKKy8qCisgKiBHaXZlbiBhIGJ1c3RlZCBkaXJlY3RvcnksIHRyeSB0byBzYWx2YWdlIGl0IHNvbWVob3cuCisgKgorICovCitzdGF0aWMgdm9pZCBzYWx2YWdlX2RpcmVjdG9yeShleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJICAgICAgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpwcmV2LAorCQkJICAgICAgdW5zaWduZWQgaW50ICpvZmZzZXQpCit7CisJY2hhciAgICAqY3AgPSAoY2hhciAqKSBkaXJlbnQ7CisJaW50IGxlZnQgPSBmcy0+YmxvY2tzaXplIC0gKm9mZnNldCAtIGRpcmVudC0+cmVjX2xlbjsKKwlpbnQgbmFtZV9sZW4gPSBkaXJlbnQtPm5hbWVfbGVuICYgMHhGRjsKKworCS8qCisJICogU3BlY2lhbCBjYXNlIG9mIGRpcmVjdG9yeSBlbnRyeSBvZiBzaXplIDg6IGNvcHkgd2hhdCdzIGxlZnQKKwkgKiBvZiB0aGUgZGlyZWN0b3J5IGJsb2NrIHVwIHRvIGNvdmVyIHVwIHRoZSBpbnZhbGlkIGhvbGUuCisJICovCisJaWYgKChsZWZ0ID49IDEyKSAmJiAoZGlyZW50LT5yZWNfbGVuID09IDgpKSB7CisJCW1lbW1vdmUoY3AsIGNwKzgsIGxlZnQpOworCQltZW1zZXQoY3AgKyBsZWZ0LCAwLCA4KTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIElmIHRoZSBkaXJlY3RvcnkgZW50cnkgb3ZlcnJ1bnMgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5CisJICogYmxvY2ssIGFuZCB0aGUgbmFtZSBpcyBzbWFsbCBlbm91Z2ggdG8gZml0LCB0aGVuIGFkanVzdCB0aGUKKwkgKiByZWNvcmQgbGVuZ3RoLgorCSAqLworCWlmICgobGVmdCA8IDApICYmCisJICAgIChuYW1lX2xlbiArIDggPD0gZGlyZW50LT5yZWNfbGVuICsgbGVmdCkgJiYKKwkgICAgZGlyZW50LT5pbm9kZSA8PSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50ICYmCisJICAgIHN0cm5sZW4oZGlyZW50LT5uYW1lLCBuYW1lX2xlbikgPT0gbmFtZV9sZW4pIHsKKwkJZGlyZW50LT5yZWNfbGVuICs9IGxlZnQ7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBJZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGlzIGEgbXVsdGlwbGUgb2YgZm91ciwgc28gaXQgaXMKKwkgKiB2YWxpZCwgbGV0IHRoZSBwcmV2aW91cyBkaXJlY3RvcnkgZW50cnkgYWJzb3JiIHRoZSBpbnZhbGlkCisJICogb25lLgorCSAqLworCWlmIChwcmV2ICYmIGRpcmVudC0+cmVjX2xlbiAmJiAoZGlyZW50LT5yZWNfbGVuICUgNCkgPT0gMCkgeworCQlwcmV2LT5yZWNfbGVuICs9IGRpcmVudC0+cmVjX2xlbjsKKwkJKm9mZnNldCArPSBkaXJlbnQtPnJlY19sZW47CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBEZWZhdWx0IHNhbHZhZ2UgbWV0aG9kIC0tLSBraWxsIGFsbCBvZiB0aGUgZGlyZWN0b3J5CisJICogZW50cmllcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrLiAgV2Ugd2lsbCBlaXRoZXIgdHJ5IHRvCisJICogYWJzb3JiIGl0IGludG8gdGhlIHByZXZpb3VzIGRpcmVjdG9yeSBlbnRyeSwgb3IgY3JlYXRlIGEKKwkgKiBuZXcgZW1wdHkgZGlyZWN0b3J5IGVudHJ5IHRoZSByZXN0IG9mIHRoZSBkaXJlY3RvcnkgYmxvY2suCisJICovCisJaWYgKHByZXYpIHsKKwkJcHJldi0+cmVjX2xlbiArPSBmcy0+YmxvY2tzaXplIC0gKm9mZnNldDsKKwkJKm9mZnNldCA9IGZzLT5ibG9ja3NpemU7CisJfSBlbHNlIHsKKwkJZGlyZW50LT5yZWNfbGVuID0gZnMtPmJsb2Nrc2l6ZSAtICpvZmZzZXQ7CisJCWRpcmVudC0+bmFtZV9sZW4gPSAwOworCQlkaXJlbnQtPmlub2RlID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRiLAorCQkJICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBkaXJfaW5mbyAgICAgICAgICpzdWJkaXIsICpkaXI7CisJc3RydWN0IGR4X2Rpcl9pbmZvICAgICAgKmR4X2RpcjsKKyNpZmRlZiBFTkFCTEVfSFRSRUUKKwlzdHJ1Y3QgZHhfZGlyYmxvY2tfaW5mbyAqZHhfZGIgPSBOVUxMOworI2VuZGlmIC8qIEVOQUJMRV9IVFJFRSAqLworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAgICpkaXJlbnQsICpwcmV2OworCWV4dDJfZGlyaGFzaF90ICAgICAgICAgIGhhc2g7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBkaXJfbW9kaWZpZWQgPSAwOworCWludCAgICAgICAgICAgICAgICAgICAgIGRvdF9zdGF0ZTsKKwlibGtfdCAgICAgICAgICAgICAgICAgICBibG9ja19uciA9IGRiLT5ibGs7CisJZXh0Ml9pbm9fdCAgICAgICAgICAgICAgaW5vID0gZGItPmlubzsKKwlfX3UxNiAgICAgICAgICAgICAgICAgICBsaW5rczsKKwlzdHJ1Y3QgY2hlY2tfZGlyX3N0cnVjdCAqY2Q7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKmJ1ZjsKKwllMmZzY2tfdCAgICAgICAgICAgICAgICBjdHg7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbTsKKwlzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gKnJvb3Q7CisJc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqbGltaXQ7CisJc3RhdGljIGRpY3RfdCBkZV9kaWN0OworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJaW50ICAgICBkdXBzX2ZvdW5kID0gMDsKKworCWNkID0gKHN0cnVjdCBjaGVja19kaXJfc3RydWN0ICopIHByaXZfZGF0YTsKKwlidWYgPSBjZC0+YnVmOworCWN0eCA9IGNkLT5jdHg7CisKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQlyZXR1cm4gRElSRU5UX0FCT1JUOworCisJaWYgKGN0eC0+cHJvZ3Jlc3MgJiYgKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgMiwgY2QtPmNvdW50KyssIGNkLT5tYXgpKQorCQlyZXR1cm4gRElSRU5UX0FCT1JUOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGlub2RlIGlzIHN0aWxsIGluIHVzZSAoY291bGQgaGF2ZSBiZWVuCisJICogZGVsZXRlZCBpbiB0aGUgZHVwbGljYXRlL2JhZCBibG9ja3MgcGFzcy4KKwkgKi8KKwlpZiAoIShleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKSkpCisJCXJldHVybiAwOworCisJY2QtPnBjdHguaW5vID0gaW5vOworCWNkLT5wY3R4LmJsayA9IGJsb2NrX25yOworCWNkLT5wY3R4LmJsa2NvdW50ID0gZGItPmJsb2NrY250OworCWNkLT5wY3R4LmlubzIgPSAwOworCWNkLT5wY3R4LmRpcmVudCA9IDA7CisJY2QtPnBjdHgubnVtID0gMDsKKworCWlmIChkYi0+YmxrID09IDApIHsKKwkJaWYgKGFsbG9jYXRlX2Rpcl9ibG9jayhjdHgsIGRiLCAmY2QtPnBjdHgpKQorCQkJcmV0dXJuIDA7CisJCWJsb2NrX25yID0gZGItPmJsazsKKwl9CisKKwlpZiAoZGItPmJsb2NrY250KQorCQlkb3Rfc3RhdGUgPSAyOworCWVsc2UKKwkJZG90X3N0YXRlID0gMDsKKworCWlmIChjdHgtPmRpcnNfdG9faGFzaCAmJgorCSAgICBleHQyZnNfdTMyX2xpc3RfdGVzdChjdHgtPmRpcnNfdG9faGFzaCwgaW5vKSkKKwkJZHVwc19mb3VuZCsrOworCisJY2QtPnBjdHguZXJyY29kZSA9IGV4dDJmc19yZWFkX2Rpcl9ibG9jayhmcywgYmxvY2tfbnIsIGJ1Zik7CisJaWYgKGNkLT5wY3R4LmVycmNvZGUgPT0gRVhUMl9FVF9ESVJfQ09SUlVQVEVEKQorCQljZC0+cGN0eC5lcnJjb2RlID0gMDsgLyogV2UnbGwgaGFuZGxlIHRoaXMgb3Vyc2VsdmVzICovCisJaWYgKGNkLT5wY3R4LmVycmNvZGUpIHsKKwkJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzJfUkVBRF9ESVJCTE9DSywgJmNkLT5wY3R4KSkgeworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybiBESVJFTlRfQUJPUlQ7CisJCX0KKwkJbWVtc2V0KGJ1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJfQorI2lmZGVmIEVOQUJMRV9IVFJFRQorCWR4X2RpciA9IGUyZnNja19nZXRfZHhfZGlyX2luZm8oY3R4LCBpbm8pOworCWlmIChkeF9kaXIgJiYgZHhfZGlyLT5udW1ibG9ja3MpIHsKKwkJaWYgKGRiLT5ibG9ja2NudCA+PSBkeF9kaXItPm51bWJsb2NrcykgeworCQkJcHJpbnRmKCJYWFggc2hvdWxkIG5ldmVyIGhhcHBlbiEhIVxuIik7CisJCQlhYm9ydCgpOworCQl9CisJCWR4X2RiID0gJmR4X2Rpci0+ZHhfYmxvY2tbZGItPmJsb2NrY250XTsKKwkJZHhfZGItPnR5cGUgPSBEWF9ESVJCTE9DS19MRUFGOworCQlkeF9kYi0+cGh5cyA9IGJsb2NrX25yOworCQlkeF9kYi0+bWluX2hhc2ggPSB+MDsKKwkJZHhfZGItPm1heF9oYXNoID0gMDsKKworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGJ1ZjsKKwkJbGltaXQgPSAoc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqKSAoYnVmKzgpOworCQlpZiAoZGItPmJsb2NrY250ID09IDApIHsKKwkJCXJvb3QgPSAoc3RydWN0IGV4dDJfZHhfcm9vdF9pbmZvICopIChidWYgKyAyNCk7CisJCQlkeF9kYi0+dHlwZSA9IERYX0RJUkJMT0NLX1JPT1Q7CisJCQlkeF9kYi0+ZmxhZ3MgfD0gRFhfRkxBR19GSVJTVCB8IERYX0ZMQUdfTEFTVDsKKwkJCWlmICgocm9vdC0+cmVzZXJ2ZWRfemVybyB8fAorCQkJICAgICByb290LT5pbmZvX2xlbmd0aCA8IDggfHwKKwkJCSAgICAgcm9vdC0+aW5kaXJlY3RfbGV2ZWxzID4gMSkgJiYKKwkJCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzJfSFRSRUVfQkFEX1JPT1QsICZjZC0+cGN0eCkpIHsKKwkJCQljbGVhcl9odHJlZShjdHgsIGlubyk7CisJCQkJZHhfZGlyLT5udW1ibG9ja3MgPSAwOworCQkJCWR4X2RiID0gMDsKKwkJCX0KKwkJCWR4X2Rpci0+aGFzaHZlcnNpb24gPSByb290LT5oYXNoX3ZlcnNpb247CisJCQlkeF9kaXItPmRlcHRoID0gcm9vdC0+aW5kaXJlY3RfbGV2ZWxzICsgMTsKKwkJfSBlbHNlIGlmICgoZGlyZW50LT5pbm9kZSA9PSAwKSAmJgorCQkJICAgKGRpcmVudC0+cmVjX2xlbiA9PSBmcy0+YmxvY2tzaXplKSAmJgorCQkJICAgKGRpcmVudC0+bmFtZV9sZW4gPT0gMCkgJiYKKwkJCSAgIChleHQyZnNfbGUxNl90b19jcHUobGltaXQtPmxpbWl0KSA9PQorCQkJICAgICgoZnMtPmJsb2Nrc2l6ZS04KSAvCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgZXh0Ml9keF9lbnRyeSkpKSkKKwkJCWR4X2RiLT50eXBlID0gRFhfRElSQkxPQ0tfTk9ERTsKKwl9CisjZW5kaWYgLyogRU5BQkxFX0hUUkVFICovCisKKwlkaWN0X2luaXQoJmRlX2RpY3QsIERJQ1RDT1VOVF9UX01BWCwgZGljdF9kZV9jbXApOworCXByZXYgPSAwOworCWRvIHsKKwkJcHJvYmxlbSA9IDA7CisJCWRpcmVudCA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgKGJ1ZiArIG9mZnNldCk7CisJCWNkLT5wY3R4LmRpcmVudCA9IGRpcmVudDsKKwkJY2QtPnBjdHgubnVtID0gb2Zmc2V0OworCQlpZiAoKChvZmZzZXQgKyBkaXJlbnQtPnJlY19sZW4pID4gZnMtPmJsb2Nrc2l6ZSkgfHwKKwkJICAgIChkaXJlbnQtPnJlY19sZW4gPCAxMikgfHwKKwkJICAgICgoZGlyZW50LT5yZWNfbGVuICUgNCkgIT0gMCkgfHwKKwkJICAgICgoKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSs4KSA+IGRpcmVudC0+cmVjX2xlbikpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRElSX0NPUlJVUFRFRCwgJmNkLT5wY3R4KSkgeworCQkJCXNhbHZhZ2VfZGlyZWN0b3J5KGZzLCBkaXJlbnQsIHByZXYsICZvZmZzZXQpOworCQkJCWRpcl9tb2RpZmllZCsrOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJZ290byBhYm9ydF9mcmVlX2RpY3Q7CisJCX0KKwkJaWYgKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgPiBFWFQyX05BTUVfTEVOKSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0ZJTEVOQU1FX0xPTkcsICZjZC0+cGN0eCkpIHsKKwkJCQlkaXJlbnQtPm5hbWVfbGVuID0gRVhUMl9OQU1FX0xFTjsKKwkJCQlkaXJfbW9kaWZpZWQrKzsKKwkJCX0KKwkJfQorCisJCWlmIChkb3Rfc3RhdGUgPT0gMCkgeworCQkJaWYgKGNoZWNrX2RvdChjdHgsIGRpcmVudCwgaW5vLCAmY2QtPnBjdHgpKQorCQkJCWRpcl9tb2RpZmllZCsrOworCQl9IGVsc2UgaWYgKGRvdF9zdGF0ZSA9PSAxKSB7CisJCQlkaXIgPSBlMmZzY2tfZ2V0X2Rpcl9pbmZvKGN0eCwgaW5vKTsKKwkJCWlmICghZGlyKSB7CisJCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX05PX0RJUklORk8sICZjZC0+cGN0eCk7CisJCQkJZ290byBhYm9ydF9mcmVlX2RpY3Q7CisJCQl9CisJCQlpZiAoY2hlY2tfZG90ZG90KGN0eCwgZGlyZW50LCBkaXIsICZjZC0+cGN0eCkpCisJCQkJZGlyX21vZGlmaWVkKys7CisJCX0gZWxzZSBpZiAoZGlyZW50LT5pbm9kZSA9PSBpbm8pIHsKKwkJCXByb2JsZW0gPSBQUl8yX0xJTktfRE9UOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9MSU5LX0RPVCwgJmNkLT5wY3R4KSkgeworCQkJCWRpcmVudC0+aW5vZGUgPSAwOworCQkJCWRpcl9tb2RpZmllZCsrOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQlpZiAoIWRpcmVudC0+aW5vZGUpCisJCQlnb3RvIG5leHQ7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBpbm9kZSBsaXN0ZWQgaXMgYSBsZWdhbCBvbmUuCisJCSAqLworCQlpZiAoKChkaXJlbnQtPmlub2RlICE9IEVYVDJfUk9PVF9JTk8pICYmCisJCSAgICAgKGRpcmVudC0+aW5vZGUgPCBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcikpKSB8fAorCQkgICAgKGRpcmVudC0+aW5vZGUgPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSkgeworCQkJcHJvYmxlbSA9IFBSXzJfQkFEX0lOTzsKKwkJfSBlbHNlIGlmICghKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLAorCQkJCQkgICAgICAgZGlyZW50LT5pbm9kZSkpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGlub2RlIGlzIHVudXNlZCwgb2ZmZXIgdG8gY2xlYXIgaXQuCisJCQkgKi8KKwkJCXByb2JsZW0gPSBQUl8yX1VOVVNFRF9JTk9ERTsKKwkJfSBlbHNlIGlmICgoZG90X3N0YXRlID4gMSkgJiYKKwkJCSAgICgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpID09IDEpICYmCisJCQkgICAoZGlyZW50LT5uYW1lWzBdID09ICcuJykpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSdzIGEgJy4nIGVudHJ5IGluIGFueXRoaW5nIG90aGVyCisJCQkgKiB0aGFuIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnksIGl0J3MgYQorCQkJICogZHVwbGljYXRlIGVudHJ5IHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQuCisJCQkgKi8KKwkJCXByb2JsZW0gPSBQUl8yX0RVUF9ET1Q7CisJCX0gZWxzZSBpZiAoKGRvdF9zdGF0ZSA+IDEpICYmCisJCQkgICAoKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSA9PSAyKSAmJgorCQkJICAgKGRpcmVudC0+bmFtZVswXSA9PSAnLicpICYmCisJCQkgICAoZGlyZW50LT5uYW1lWzFdID09ICcuJykpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSdzIGEgJy4uJyBlbnRyeSBpbiBhbnl0aGluZyBvdGhlcgorCQkJICogdGhhbiB0aGUgc2Vjb25kIGRpcmVjdG9yeSBlbnRyeSwgaXQncyBhCisJCQkgKiBkdXBsaWNhdGUgZW50cnkgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzJfRFVQX0RPVF9ET1Q7CisJCX0gZWxzZSBpZiAoKGRvdF9zdGF0ZSA+IDEpICYmCisJCQkgICAoZGlyZW50LT5pbm9kZSA9PSBFWFQyX1JPT1RfSU5PKSkgeworCQkJLyoKKwkJCSAqIERvbid0IGFsbG93IGxpbmtzIHRvIHRoZSByb290IGRpcmVjdG9yeS4KKwkJCSAqIFdlIGNoZWNrIHRoaXMgc3BlY2lhbGx5IHRvIG1ha2Ugc3VyZSB3ZQorCQkJICogY2F0Y2ggdGhpcyBlcnJvciBjYXNlIGV2ZW4gaWYgdGhlIHJvb3QKKwkJCSAqIGRpcmVjdG9yeSBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC4KKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzJfTElOS19ST09UOworCQl9IGVsc2UgaWYgKChkb3Rfc3RhdGUgPiAxKSAmJgorCQkJICAgKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSA9PSAwKSB7CisJCQkvKgorCQkJICogRG9uJ3QgYWxsb3cgemVyby1sZW5ndGggZGlyZWN0b3J5IG5hbWVzLgorCQkJICovCisJCQlwcm9ibGVtID0gUFJfMl9OVUxMX05BTUU7CisJCX0KKworCQlpZiAocHJvYmxlbSkgeworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgcHJvYmxlbSwgJmNkLT5wY3R4KSkgeworCQkJCWRpcmVudC0+aW5vZGUgPSAwOworCQkJCWRpcl9tb2RpZmllZCsrOworCQkJCWdvdG8gbmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCQkJaWYgKHByb2JsZW0gPT0gUFJfMl9CQURfSU5PKQorCQkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgaW5vZGUgd2FzIG1hcmtlZCBhcyBoYXZpbmcgYmFkIGZpZWxkcyBpbgorCQkgKiBwYXNzMSwgcHJvY2VzcyBpdCBhbmQgb2ZmZXIgdG8gZml4L2NsZWFyIGl0LgorCQkgKiAoV2Ugd2FpdCB1bnRpbCBub3cgc28gdGhhdCB3ZSBjYW4gZGlzcGxheSB0aGUKKwkJICogcGF0aG5hbWUgdG8gdGhlIHVzZXIuKQorCQkgKi8KKwkJaWYgKGN0eC0+aW5vZGVfYmFkX21hcCAmJgorCQkgICAgZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfYmFkX21hcCwKKwkJCQkJICAgICBkaXJlbnQtPmlub2RlKSkgeworCQkJaWYgKGUyZnNja19wcm9jZXNzX2JhZF9pbm9kZShjdHgsIGlubywKKwkJCQkJCSAgICAgZGlyZW50LT5pbm9kZSwKKwkJCQkJCSAgICAgYnVmICsgZnMtPmJsb2Nrc2l6ZSkpIHsKKwkJCQlkaXJlbnQtPmlub2RlID0gMDsKKwkJCQlkaXJfbW9kaWZpZWQrKzsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJCXJldHVybiBESVJFTlRfQUJPUlQ7CisJCX0KKworCQlpZiAoY2hlY2tfbmFtZShjdHgsIGRpcmVudCwgJmNkLT5wY3R4KSkKKwkJCWRpcl9tb2RpZmllZCsrOworCisJCWlmIChjaGVja19maWxldHlwZShjdHgsIGRpcmVudCwgJmNkLT5wY3R4KSkKKwkJCWRpcl9tb2RpZmllZCsrOworCisjaWZkZWYgRU5BQkxFX0hUUkVFCisJCWlmIChkeF9kYikgeworCQkJZXh0MmZzX2Rpcmhhc2goZHhfZGlyLT5oYXNodmVyc2lvbiwgZGlyZW50LT5uYW1lLAorCQkJCSAgICAgICAoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpLAorCQkJCSAgICAgICBmcy0+c3VwZXItPnNfaGFzaF9zZWVkLCAmaGFzaCwgMCk7CisJCQlpZiAoaGFzaCA8IGR4X2RiLT5taW5faGFzaCkKKwkJCQlkeF9kYi0+bWluX2hhc2ggPSBoYXNoOworCQkJaWYgKGhhc2ggPiBkeF9kYi0+bWF4X2hhc2gpCisJCQkJZHhfZGItPm1heF9oYXNoID0gaGFzaDsKKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIGRpcmVjdG9yeSwgdGhlbiBtYXJrIGl0cyBwYXJlbnQgaW4gaXRzCisJCSAqIGRpcl9pbmZvIHN0cnVjdHVyZS4gIElmIHRoZSBwYXJlbnQgZmllbGQgaXMgYWxyZWFkeQorCQkgKiBmaWxsZWQgaW4sIHRoZW4gdGhpcyBkaXJlY3RvcnkgaGFzIG1vcmUgdGhhbiBvbmUKKwkJICogaGFyZCBsaW5rLiAgV2UgYXNzdW1lIHRoZSBmaXJzdCBsaW5rIGlzIGNvcnJlY3QsCisJCSAqIGFuZCBhc2sgdGhlIHVzZXIgaWYgaGUvc2hlIHdhbnRzIHRvIGNsZWFyIHRoaXMgb25lLgorCQkgKi8KKwkJaWYgKChkb3Rfc3RhdGUgPiAxKSAmJgorCQkgICAgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsCisJCQkJCSAgICAgIGRpcmVudC0+aW5vZGUpKSkgeworCQkJc3ViZGlyID0gZTJmc2NrX2dldF9kaXJfaW5mbyhjdHgsIGRpcmVudC0+aW5vZGUpOworCQkJaWYgKCFzdWJkaXIpIHsKKwkJCQljZC0+cGN0eC5pbm8gPSBkaXJlbnQtPmlub2RlOworCQkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9OT19ESVJJTkZPLCAmY2QtPnBjdHgpOworCQkJCWdvdG8gYWJvcnRfZnJlZV9kaWN0OworCQkJfQorCQkJaWYgKHN1YmRpci0+cGFyZW50KSB7CisJCQkJY2QtPnBjdHguaW5vMiA9IHN1YmRpci0+cGFyZW50OworCQkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfTElOS19ESVIsCisJCQkJCQkmY2QtPnBjdHgpKSB7CisJCQkJCWRpcmVudC0+aW5vZGUgPSAwOworCQkJCQlkaXJfbW9kaWZpZWQrKzsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCQljZC0+cGN0eC5pbm8yID0gMDsKKwkJCX0gZWxzZQorCQkJCXN1YmRpci0+cGFyZW50ID0gaW5vOworCQl9CisKKwkJaWYgKGR1cHNfZm91bmQpIHsKKwkJCTsKKwkJfSBlbHNlIGlmIChkaWN0X2xvb2t1cCgmZGVfZGljdCwgZGlyZW50KSkgeworCQkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJCXBjdHguaW5vID0gaW5vOworCQkJcGN0eC5kaXJlbnQgPSBkaXJlbnQ7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzJfUkVQT1JUX0RVUF9ESVJFTlQsICZwY3R4KTsKKwkJCWlmICghY3R4LT5kaXJzX3RvX2hhc2gpCisJCQkJZXh0MmZzX3UzMl9saXN0X2NyZWF0ZSgmY3R4LT5kaXJzX3RvX2hhc2gsIDUwKTsKKwkJCWlmIChjdHgtPmRpcnNfdG9faGFzaCkKKwkJCQlleHQyZnNfdTMyX2xpc3RfYWRkKGN0eC0+ZGlyc190b19oYXNoLCBpbm8pOworCQkJZHVwc19mb3VuZCsrOworCQl9IGVsc2UKKwkJCWRpY3RfYWxsb2NfaW5zZXJ0KCZkZV9kaWN0LCBkaXJlbnQsIGRpcmVudCk7CisKKwkJZXh0MmZzX2ljb3VudF9pbmNyZW1lbnQoY3R4LT5pbm9kZV9jb3VudCwgZGlyZW50LT5pbm9kZSwKKwkJCQkJJmxpbmtzKTsKKwkJaWYgKGxpbmtzID4gMSkKKwkJCWN0eC0+ZnNfbGlua3NfY291bnQrKzsKKwkJY3R4LT5mc190b3RhbF9jb3VudCsrOworCW5leHQ6CisJCXByZXYgPSBkaXJlbnQ7CisJCW9mZnNldCArPSBkaXJlbnQtPnJlY19sZW47CisJCWRvdF9zdGF0ZSsrOworCX0gd2hpbGUgKG9mZnNldCA8IGZzLT5ibG9ja3NpemUpOworI2lmZGVmIEVOQUJMRV9IVFJFRQorCWlmIChkeF9kYikgeworCQljZC0+cGN0eC5kaXIgPSBjZC0+cGN0eC5pbm87CisJCWlmICgoZHhfZGItPnR5cGUgPT0gRFhfRElSQkxPQ0tfUk9PVCkgfHwKKwkJICAgIChkeF9kYi0+dHlwZSA9PSBEWF9ESVJCTE9DS19OT0RFKSkKKwkJCXBhcnNlX2ludF9ub2RlKGZzLCBkYiwgY2QsIGR4X2RpciwgYnVmKTsKKwl9CisjZW5kaWYgLyogRU5BQkxFX0hUUkVFICovCisJaWYgKG9mZnNldCAhPSBmcy0+YmxvY2tzaXplKSB7CisJCWNkLT5wY3R4Lm51bSA9IGRpcmVudC0+cmVjX2xlbiAtIGZzLT5ibG9ja3NpemUgKyBvZmZzZXQ7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRklOQUxfUkVDTEVOLCAmY2QtPnBjdHgpKSB7CisJCQlkaXJlbnQtPnJlY19sZW4gPSBjZC0+cGN0eC5udW07CisJCQlkaXJfbW9kaWZpZWQrKzsKKwkJfQorCX0KKwlpZiAoZGlyX21vZGlmaWVkKSB7CisJCWNkLT5wY3R4LmVycmNvZGUgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCBibG9ja19uciwgYnVmKTsKKwkJaWYgKGNkLT5wY3R4LmVycmNvZGUpIHsKKwkJCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8yX1dSSVRFX0RJUkJMT0NLLAorCQkJCQkgJmNkLT5wY3R4KSkKKwkJCQlnb3RvIGFib3J0X2ZyZWVfZGljdDsKKwkJfQorCQlleHQyZnNfbWFya19jaGFuZ2VkKGZzKTsKKwl9CisJZGljdF9mcmVlX25vZGVzKCZkZV9kaWN0KTsKKwlyZXR1cm4gMDsKK2Fib3J0X2ZyZWVfZGljdDoKKwlkaWN0X2ZyZWVfbm9kZXMoJmRlX2RpY3QpOworCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJcmV0dXJuIERJUkVOVF9BQk9SVDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlYWxsb2NhdGUgYSBibG9jaywgYW5kIGlzIGFuIGludGVyYXRvcgorICogZnVuY3Rpb25lZCBjYWxsZWQgYnkgZGVhbGxvY2F0ZSBpbm9kZSB2aWEgZXh0MmZzX2l0ZXJhdGVfYmxvY2soKS4KKyAqLworc3RhdGljIGludCBkZWFsbG9jYXRlX2lub2RlX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tfbnIsCisJCQkJICBlMl9ibGtjbnRfdCBibG9ja2NudCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJCSAgYmxrX3QgcmVmX2Jsb2NrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkJICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJCSAgdm9pZCAqcHJpdl9kYXRhKQoreworCWUyZnNja190ICAgICAgICBjdHggPSAoZTJmc2NrX3QpIHByaXZfZGF0YTsKKworCWlmIChIT0xFX0JMS0FERFIoKmJsb2NrX25yKSkKKwkJcmV0dXJuIDA7CisJaWYgKCgqYmxvY2tfbnIgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgKCpibG9ja19uciA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkKKwkJcmV0dXJuIDA7CisJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsICpibG9ja19ucik7CisJZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGZzLCAqYmxvY2tfbnIsIC0xKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVjdGlvbiBkZWFsbG9jYXRlcyBhbiBpbm9kZQorICovCitzdGF0aWMgdm9pZCBkZWFsbG9jYXRlX2lub2RlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sIGNoYXIqIGJsb2NrX2J1ZikKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBjb3VudDsKKworCWV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9saW5rX2luZm8sIGlubywgMCk7CisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgImRlYWxsb2NhdGVfaW5vZGUiKTsKKwlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMDsKKwlpbm9kZS5pX2R0aW1lID0gdGltZShOVUxMKTsKKwllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgImRlYWxsb2NhdGVfaW5vZGUiKTsKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCXBjdHguaW5vID0gaW5vOworCisJLyoKKwkgKiBGaXggdXAgdGhlIGJpdG1hcHMuLi4KKwkgKi8KKwllMmZzY2tfcmVhZF9iaXRtYXBzKGN0eCk7CisJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKTsKKwlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGlubyk7CisJaWYgKGN0eC0+aW5vZGVfYmFkX21hcCkKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9iYWRfbWFwLCBpbm8pOworCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGlubywgLTEsIExJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSk7CisKKwlpZiAoaW5vZGUuaV9maWxlX2FjbCAmJgorCSAgICAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUikpIHsKKwkJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2FkanVzdF9lYV9yZWZjb3VudChmcywgaW5vZGUuaV9maWxlX2FjbCwKKwkJCQkJCSAgIGJsb2NrX2J1ZiwgLTEsICZjb3VudCk7CisJCWlmIChwY3R4LmVycmNvZGUgPT0gRVhUMl9FVF9CQURfRUFfQkxPQ0tfTlVNKSB7CisJCQlwY3R4LmVycmNvZGUgPSAwOworCQkJY291bnQgPSAxOworCQl9CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCXBjdHguYmxrID0gaW5vZGUuaV9maWxlX2FjbDsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9BREpfRUFfUkVGQ09VTlQsICZwY3R4KTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGNvdW50ID09IDApIHsKKwkJCWV4dDJmc191bm1hcmtfYmxvY2tfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQkJICAgaW5vZGUuaV9maWxlX2FjbCk7CisJCQlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGlub2RlLmlfZmlsZV9hY2wsIC0xKTsKKwkJfQorCQlpbm9kZS5pX2ZpbGVfYWNsID0gMDsKKwl9CisKKwlpZiAoIWV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKCZpbm9kZSkpCisJCXJldHVybjsKKworCWlmIChMSU5VWF9TX0lTUkVHKGlub2RlLmlfbW9kZSkgJiYKKwkgICAgKGlub2RlLmlfc2l6ZV9oaWdoIHx8IGlub2RlLmlfc2l6ZSAmIDB4ODAwMDAwMDBVTCkpCisJCWN0eC0+bGFyZ2VfZmlsZXMtLTsKKworCXBjdHguZXJyY29kZSA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCAwLCBibG9ja19idWYsCisJCQkJCSAgICBkZWFsbG9jYXRlX2lub2RlX2Jsb2NrLCBjdHgpOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8yX0RFQUxMT0NfSU5PREUsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVjdGlvbiBjbGVhcnMgdGhlIGh0cmVlIGZsYWcgb24gYW4gaW5vZGUKKyAqLworc3RhdGljIHZvaWQgY2xlYXJfaHRyZWUoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubykKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJjbGVhcl9odHJlZSIpOworCWlub2RlLmlfZmxhZ3MgPSBpbm9kZS5pX2ZsYWdzICYgfkVYVDJfSU5ERVhfRkw7CisJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJjbGVhcl9odHJlZSIpOworCWlmIChjdHgtPmRpcnNfdG9faGFzaCkKKwkJZXh0MmZzX3UzMl9saXN0X2FkZChjdHgtPmRpcnNfdG9faGFzaCwgaW5vKTsKK30KKworCitzdGF0aWMgaW50IGUyZnNja19wcm9jZXNzX2JhZF9pbm9kZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgZGlyLAorCQkJCSAgICBleHQyX2lub190IGlubywgY2hhciAqYnVmKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpbm9kZV9tb2RpZmllZCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbm90X2ZpeGVkID0gMDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAqZnJhZywgKmZzaXplOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJaW50ICAgICBwcm9ibGVtID0gMDsKKworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJwcm9jZXNzX2JhZF9pbm9kZSIpOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlwY3R4LmlubyA9IGlubzsKKwlwY3R4LmRpciA9IGRpcjsKKwlwY3R4Lmlub2RlID0gJmlub2RlOworCisJaWYgKGlub2RlLmlfZmlsZV9hY2wgJiYKKwkgICAgIShmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSAmJgorCSAgICBmaXhfcHJvYmxlbShjdHgsIFBSXzJfRklMRV9BQ0xfWkVSTywgJnBjdHgpKSB7CisJCWlub2RlLmlfZmlsZV9hY2wgPSAwOworI2lmIEJCX0JJR19FTkRJQU4KKwkJLyoKKwkJICogVGhpcyBpcyBhIHNwZWNpYWwga2x1ZGdlIHRvIGRlYWwgd2l0aCBsb25nIHN5bWxpbmtzCisJCSAqIG9uIGJpZyBlbmRpYW4gc3lzdGVtcy4gIGlfYmxvY2tzIGhhZCBhbHJlYWR5IGJlZW4KKwkJICogZGVjcmVtZW50ZWQgZWFybGllciBpbiBwYXNzIDEsIGJ1dCBzaW5jZSBpX2ZpbGVfYWNsCisJCSAqIGhhZG4ndCB5ZXQgYmVlbiBjbGVhcmVkLCBleHQyZnNfcmVhZF9pbm9kZSgpCisJCSAqIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSB3YXMgc2hvcnQgc3ltbGluayBhbmQgd291bGQKKwkJICogbm90IGhhdmUgYnl0ZSBzd2FwcGVkIGlfYmxvY2tbMF0uICBIZW5jZSwgd2UgaGF2ZQorCQkgKiB0byBieXRlLXN3YXAgaXQgaGVyZS4KKwkJICovCisJCWlmIChMSU5VWF9TX0lTTE5LKGlub2RlLmlfbW9kZSkgJiYKKwkJICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgJiYKKwkJICAgIChpbm9kZS5pX2Jsb2NrcyA9PSBmcy0+YmxvY2tzaXplID4+IDkpKQorCQkJaW5vZGUuaV9ibG9ja1swXSA9IGV4dDJmc19zd2FiMzIoaW5vZGUuaV9ibG9ja1swXSk7CisjZW5kaWYKKwkJaW5vZGVfbW9kaWZpZWQrKzsKKwl9IGVsc2UKKwkJbm90X2ZpeGVkKys7CisKKwlpZiAoIUxJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSAmJiAhTElOVVhfU19JU1JFRyhpbm9kZS5pX21vZGUpICYmCisJICAgICFMSU5VWF9TX0lTQ0hSKGlub2RlLmlfbW9kZSkgJiYgIUxJTlVYX1NfSVNCTEsoaW5vZGUuaV9tb2RlKSAmJgorCSAgICAhTElOVVhfU19JU0xOSyhpbm9kZS5pX21vZGUpICYmICFMSU5VWF9TX0lTRklGTyhpbm9kZS5pX21vZGUpICYmCisJICAgICEoTElOVVhfU19JU1NPQ0soaW5vZGUuaV9tb2RlKSkpCisJCXByb2JsZW0gPSBQUl8yX0JBRF9NT0RFOworCWVsc2UgaWYgKExJTlVYX1NfSVNDSFIoaW5vZGUuaV9tb2RlKQorCQkgJiYgIWUyZnNja19wYXNzMV9jaGVja19kZXZpY2VfaW5vZGUoZnMsICZpbm9kZSkpCisJCXByb2JsZW0gPSBQUl8yX0JBRF9DSEFSX0RFVjsKKwllbHNlIGlmIChMSU5VWF9TX0lTQkxLKGlub2RlLmlfbW9kZSkKKwkJICYmICFlMmZzY2tfcGFzczFfY2hlY2tfZGV2aWNlX2lub2RlKGZzLCAmaW5vZGUpKQorCQlwcm9ibGVtID0gUFJfMl9CQURfQkxPQ0tfREVWOworCWVsc2UgaWYgKExJTlVYX1NfSVNGSUZPKGlub2RlLmlfbW9kZSkKKwkJICYmICFlMmZzY2tfcGFzczFfY2hlY2tfZGV2aWNlX2lub2RlKGZzLCAmaW5vZGUpKQorCQlwcm9ibGVtID0gUFJfMl9CQURfRklGTzsKKwllbHNlIGlmIChMSU5VWF9TX0lTU09DSyhpbm9kZS5pX21vZGUpCisJCSAmJiAhZTJmc2NrX3Bhc3MxX2NoZWNrX2RldmljZV9pbm9kZShmcywgJmlub2RlKSkKKwkJcHJvYmxlbSA9IFBSXzJfQkFEX1NPQ0tFVDsKKwllbHNlIGlmIChMSU5VWF9TX0lTTE5LKGlub2RlLmlfbW9kZSkKKwkJICYmICFlMmZzY2tfcGFzczFfY2hlY2tfc3ltbGluayhmcywgJmlub2RlLCBidWYpKSB7CisJCXByb2JsZW0gPSBQUl8yX0lOVkFMSURfU1lNTElOSzsKKwl9CisKKwlpZiAocHJvYmxlbSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBwcm9ibGVtLCAmcGN0eCkpIHsKKwkJCWRlYWxsb2NhdGVfaW5vZGUoY3R4LCBpbm8sIDApOworCQkJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAxOworCQl9IGVsc2UKKwkJCW5vdF9maXhlZCsrOworCQlwcm9ibGVtID0gMDsKKwl9CisKKwlpZiAoaW5vZGUuaV9mYWRkcikgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0ZBRERSX1pFUk8sICZwY3R4KSkgeworCQkJaW5vZGUuaV9mYWRkciA9IDA7CisJCQlpbm9kZV9tb2RpZmllZCsrOworCQl9IGVsc2UKKwkJCW5vdF9maXhlZCsrOworCX0KKworCXN3aXRjaCAoZnMtPnN1cGVyLT5zX2NyZWF0b3Jfb3MpIHsKKwkgICAgY2FzZSBFWFQyX09TX0xJTlVYOgorCQlmcmFnID0gJmlub2RlLm9zZDIubGludXgyLmxfaV9mcmFnOworCQlmc2l6ZSA9ICZpbm9kZS5vc2QyLmxpbnV4Mi5sX2lfZnNpemU7CisJCWJyZWFrOworCSAgICBjYXNlIEVYVDJfT1NfSFVSRDoKKwkJZnJhZyA9ICZpbm9kZS5vc2QyLmh1cmQyLmhfaV9mcmFnOworCQlmc2l6ZSA9ICZpbm9kZS5vc2QyLmh1cmQyLmhfaV9mc2l6ZTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRVhUMl9PU19NQVNJWDoKKwkJZnJhZyA9ICZpbm9kZS5vc2QyLm1hc2l4Mi5tX2lfZnJhZzsKKwkJZnNpemUgPSAmaW5vZGUub3NkMi5tYXNpeDIubV9pX2ZzaXplOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJZnJhZyA9IGZzaXplID0gMDsKKwl9CisJaWYgKGZyYWcgJiYgKmZyYWcpIHsKKwkJcGN0eC5udW0gPSAqZnJhZzsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9GUkFHX1pFUk8sICZwY3R4KSkgeworCQkJKmZyYWcgPSAwOworCQkJaW5vZGVfbW9kaWZpZWQrKzsKKwkJfSBlbHNlCisJCQlub3RfZml4ZWQrKzsKKwkJcGN0eC5udW0gPSAwOworCX0KKwlpZiAoZnNpemUgJiYgKmZzaXplKSB7CisJCXBjdHgubnVtID0gKmZzaXplOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0ZTSVpFX1pFUk8sICZwY3R4KSkgeworCQkJKmZzaXplID0gMDsKKwkJCWlub2RlX21vZGlmaWVkKys7CisJCX0gZWxzZQorCQkJbm90X2ZpeGVkKys7CisJCXBjdHgubnVtID0gMDsKKwl9CisKKwlpZiAoaW5vZGUuaV9maWxlX2FjbCAmJgorCSAgICAoKGlub2RlLmlfZmlsZV9hY2wgPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgIChpbm9kZS5pX2ZpbGVfYWNsID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKSkgeworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX0ZJTEVfQUNMX0JBRCwgJnBjdHgpKSB7CisJCQlpbm9kZS5pX2ZpbGVfYWNsID0gMDsKKwkJCWlub2RlX21vZGlmaWVkKys7CisJCX0gZWxzZQorCQkJbm90X2ZpeGVkKys7CisJfQorCWlmIChpbm9kZS5pX2Rpcl9hY2wgJiYKKwkgICAgTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzJfRElSX0FDTF9aRVJPLCAmcGN0eCkpIHsKKwkJCWlub2RlLmlfZGlyX2FjbCA9IDA7CisJCQlpbm9kZV9tb2RpZmllZCsrOworCQl9IGVsc2UKKwkJCW5vdF9maXhlZCsrOworCX0KKworCWlmIChpbm9kZV9tb2RpZmllZCkKKwkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJwcm9jZXNzX2JhZF9pbm9kZSIpOworCWlmICghbm90X2ZpeGVkKQorCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2JhZF9tYXAsIGlubyk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGFsbG9jYXRlX2Rpcl9ibG9jayAtLS0gdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgZGlyZWN0b3J5CisgKiAgICAgIGJsb2NrIGZvciBhIHBhcnRpY3VsYXIgaW5vZGU7IHRoaXMgaXMgZG9uZSBpZiBhIGRpcmVjdG9yeSBoYXMKKyAqICAgICAgYSAiaG9sZSIgaW4gaXQsIG9yIGlmIGEgZGlyZWN0b3J5IGhhcyBhIGlsbGVnYWwgYmxvY2sgbnVtYmVyCisgKiAgICAgIHRoYXQgd2FzIHplcm9lZCBvdXQgYW5kIG5vdyBuZWVkcyB0byBiZSByZXBsYWNlZC4KKyAqLworc3RhdGljIGludCBhbGxvY2F0ZV9kaXJfYmxvY2soZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGIsCisJCQkgICAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgICAgICAgICAgICAgICAgICBibGs7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKmJsb2NrOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCisJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9ESVJFQ1RPUllfSE9MRSwgcGN0eCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFJlYWQgdGhlIGlub2RlIGFuZCBibG9jayBiaXRtYXBzIGluOyB3ZSdsbCBiZSBtZXNzaW5nIHdpdGgKKwkgKiB0aGVtLgorCSAqLworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKworCS8qCisJICogRmlyc3QsIGZpbmQgYSBmcmVlIGJsb2NrCisJICovCisJcGN0eC0+ZXJyY29kZSA9IGV4dDJmc19uZXdfYmxvY2soZnMsIDAsIGN0eC0+YmxvY2tfZm91bmRfbWFwLCAmYmxrKTsKKwlpZiAocGN0eC0+ZXJyY29kZSkgeworCQlwY3R4LT5zdHIgPSAiZXh0MmZzX25ld19ibG9jayI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9BTExPQ19ESVJCT0NLLCBwY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgYmxrKTsKKwlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKTsKKwlleHQyZnNfbWFya19iYl9kaXJ0eShmcyk7CisKKwkvKgorCSAqIE5vdyBsZXQncyBjcmVhdGUgdGhlIGFjdHVhbCBkYXRhIGJsb2NrIGZvciB0aGUgaW5vZGUKKwkgKi8KKwlpZiAoZGItPmJsb2NrY250KQorCQlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX25ld19kaXJfYmxvY2soZnMsIDAsIDAsICZibG9jayk7CisJZWxzZQorCQlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX25ld19kaXJfYmxvY2soZnMsIGRiLT5pbm8sCisJCQkJCQkgICAgIEVYVDJfUk9PVF9JTk8sICZibG9jayk7CisKKwlpZiAocGN0eC0+ZXJyY29kZSkgeworCQlwY3R4LT5zdHIgPSAiZXh0MmZzX25ld19kaXJfYmxvY2siOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzJfQUxMT0NfRElSQk9DSywgcGN0eCk7CisJCXJldHVybiAxOworCX0KKworCXBjdHgtPmVycmNvZGUgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCBibGssIGJsb2NrKTsKKwlleHQyZnNfZnJlZV9tZW0oJmJsb2NrKTsKKwlpZiAocGN0eC0+ZXJyY29kZSkgeworCQlwY3R4LT5zdHIgPSAiZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMl9BTExPQ19ESVJCT0NLLCBwY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgdGhlIGlub2RlIGJsb2NrIGNvdW50CisJICovCisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBkYi0+aW5vLCAmaW5vZGUsICJhbGxvY2F0ZV9kaXJfYmxvY2siKTsKKwlpbm9kZS5pX2Jsb2NrcyArPSBmcy0+YmxvY2tzaXplIC8gNTEyOworCWlmIChpbm9kZS5pX3NpemUgPCAoZGItPmJsb2NrY250KzEpICogZnMtPmJsb2Nrc2l6ZSkKKwkJaW5vZGUuaV9zaXplID0gKGRiLT5ibG9ja2NudCsxKSAqIGZzLT5ibG9ja3NpemU7CisJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgZGItPmlubywgJmlub2RlLCAiYWxsb2NhdGVfZGlyX2Jsb2NrIik7CisKKwkvKgorCSAqIEZpbmFsbHksIHVwZGF0ZSB0aGUgYmxvY2sgcG9pbnRlcnMgZm9yIHRoZSBpbm9kZQorCSAqLworCWRiLT5ibGsgPSBibGs7CisJcGN0eC0+ZXJyY29kZSA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgZGItPmlubywgQkxPQ0tfRkxBR19IT0xFLAorCQkJCSAgICAgIDAsIHVwZGF0ZV9kaXJfYmxvY2ssIGRiKTsKKwlpZiAocGN0eC0+ZXJyY29kZSkgeworCQlwY3R4LT5zdHIgPSAiZXh0MmZzX2Jsb2NrX2l0ZXJhdGUiOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzJfQUxMT0NfRElSQk9DSywgcGN0eCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgYWxsb2NhdGVfZGlyX2Jsb2NrKCkuCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2Rpcl9ibG9jayhleHQyX2ZpbHN5cyBmcyBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgIGJsa190ICAgICAgICpibG9ja19uciwKKwkJCSAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCSAgICBibGtfdCByZWZfYmxvY2sgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGI7CisKKwlkYiA9IChzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqKSBwcml2X2RhdGE7CisJaWYgKGRiLT5ibG9ja2NudCA9PSAoaW50KSBibG9ja2NudCkgeworCQkqYmxvY2tfbnIgPSBkYi0+YmxrOworCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXNzMy5jIC0tIHBhc3MgIzMgb2YgZTJmc2NrOiBDaGVjayBmb3IgZGlyZWN0b3J5IGNvbm5lY3Rpdml0eQorICoKKyAqIFBhc3MgIzMgYXNzdXJlcyB0aGF0IGFsbCBkaXJlY3RvcmllcyBhcmUgY29ubmVjdGVkIHRvIHRoZQorICogZmlsZXN5c3RlbSB0cmVlLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKyAqCisgKiBGaXJzdCwgdGhlIHJvb3QgZGlyZWN0b3J5IGlzIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0IGV4aXN0czsgaWYKKyAqIG5vdCwgZTJmc2NrIHdpbGwgb2ZmZXIgdG8gY3JlYXRlIGEgbmV3IG9uZS4gIEl0IGlzIHRoZW4gbWFya2VkIGFzCisgKiAiZG9uZSIuCisgKgorICogVGhlbiwgcGFzczMgaW50ZXJhdGVzIG92ZXIgYWxsIGRpcmVjdG9yeSBpbm9kZXM7IGZvciBlYWNoIGRpcmVjdG9yeQorICogaXQgYXR0ZW1wdHMgdG8gdHJhY2UgdXAgdGhlIGZpbGVzeXN0ZW0gdHJlZSwgdXNpbmcgZGlyaW5mby5wYXJlbnQKKyAqIHVudGlsIGl0IHJlYWNoZXMgYSBkaXJlY3Rvcnkgd2hpY2ggaGFzIGJlZW4gbWFya2VkICJkb25lIi4gIElmIGl0CisgKiBjYW5ub3QgZG8gc28sIHRoZW4gdGhlIGRpcmVjdG9yeSBtdXN0IGJlIGRpc2Nvbm5lY3RlZCwgYW5kIGUyZnNjaworICogd2lsbCBvZmZlciB0byByZWNvbm5lY3QgaXQgdG8gL2xvc3QrZm91bmQuICBXaGlsZSBpdCBpcyBjaGFzaW5nCisgKiBwYXJlbnQgcG9pbnRlcnMgdXAgdGhlIGZpbGVzeXN0ZW0gdHJlZSwgaWYgcGFzczMgc2VlcyBhIGRpcmVjdG9yeQorICogdHdpY2UsIHRoZW4gaXQgaGFzIGRldGVjdGVkIGEgZmlsZXN5c3RlbSBsb29wLCBhbmQgaXQgd2lsbCBhZ2FpbgorICogb2ZmZXIgdG8gcmVjb25uZWN0IHRoZSBkaXJlY3RvcnkgdG8gL2xvc3QrZm91bmQgaW4gdG8gYnJlYWsgdGhlCisgKiBmaWxlc3lzdGVtIGxvb3AuCisgKgorICogUGFzcyAzIGFsc28gY29udGFpbnMgdGhlIHN1YnJvdXRpbmUsIGUyZnNja19yZWNvbm5lY3RfZmlsZSgpIHRvCisgKiByZWNvbm5lY3QgaW5vZGVzIHRvIC9sb3N0K2ZvdW5kOyB0aGlzIHN1YnJvdXRpbmUgaXMgYWxzbyB1c2VkIGJ5CisgKiBwYXNzIDQuICBlMmZzY2tfcmVjb25uZWN0X2ZpbGUoKSBjYWxscyBnZXRfbG9zdF9hbmRfZm91bmQoKSwgd2hpY2gKKyAqIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyAvbG9zdCtmb3VuZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAqCisgKiBQYXNzIDMgZnJlZXMgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXM6CisgKiAgICAgIC0gVGhlIGRpcmluZm8gZGlyZWN0b3J5IGluZm9ybWF0aW9uIGNhY2hlLgorICovCisKK3N0YXRpYyB2b2lkIGNoZWNrX3Jvb3QoZTJmc2NrX3QgY3R4KTsKK3N0YXRpYyBpbnQgY2hlY2tfZGlyZWN0b3J5KGUyZnNja190IGN0eCwgc3RydWN0IGRpcl9pbmZvICpkaXIsCisJCQkgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KTsKK3N0YXRpYyB2b2lkIGZpeF9kb3Rkb3QoZTJmc2NrX3QgY3R4LCBzdHJ1Y3QgZGlyX2luZm8gKmRpciwgZXh0Ml9pbm9fdCBwYXJlbnQpOworCitzdGF0aWMgZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV9sb29wX2RldGVjdDsKK3N0YXRpYyBleHQyZnNfaW5vZGVfYml0bWFwIGlub2RlX2RvbmVfbWFwOworCitzdGF0aWMgdm9pZCBlMmZzY2tfcGFzczMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlpbnQgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCXN0cnVjdCBkaXJfaW5mbyAqZGlyOworCXVuc2lnbmVkIGxvbmcgbWF4ZGlycywgY291bnQ7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJLyogUGFzcyAzICovCisKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX1BBU1NfSEVBREVSLCAmcGN0eCk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNvbWUgYml0bWFwcyB0byBkbyBsb29wIGRldGVjdGlvbi4KKwkgKi8KKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLCBfKCJpbm9kZSBkb25lIGJpdG1hcCIpLAorCQkJCQkJICAgICZpbm9kZV9kb25lX21hcCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19BTExPQ0FURV9JQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCWdvdG8gYWJvcnRfZXhpdDsKKwl9CisJY2hlY2tfcm9vdChjdHgpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCWdvdG8gYWJvcnRfZXhpdDsKKworCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChpbm9kZV9kb25lX21hcCwgRVhUMl9ST09UX0lOTyk7CisKKwltYXhkaXJzID0gZTJmc2NrX2dldF9udW1fZGlyaW5mbyhjdHgpOworCWNvdW50ID0gMTsKKworCWlmIChjdHgtPnByb2dyZXNzKQorCQlpZiAoKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgMywgMCwgbWF4ZGlycykpCisJCQlnb3RvIGFib3J0X2V4aXQ7CisKKwlmb3IgKGk9MDsgKGRpciA9IGUyZnNja19kaXJfaW5mb19pdGVyKGN0eCwgJmkpKSAhPSAwOykgeworCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJZ290byBhYm9ydF9leGl0OworCQlpZiAoY3R4LT5wcm9ncmVzcyAmJiAoY3R4LT5wcm9ncmVzcykoY3R4LCAzLCBjb3VudCsrLCBtYXhkaXJzKSkKKwkJCWdvdG8gYWJvcnRfZXhpdDsKKwkJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGRpci0+aW5vKSkKKwkJCWlmIChjaGVja19kaXJlY3RvcnkoY3R4LCBkaXIsICZwY3R4KSkKKwkJCQlnb3RvIGFib3J0X2V4aXQ7CisJfQorCisJLyoKKwkgKiBGb3JjZSB0aGUgY3JlYXRpb24gb2YgL2xvc3QrZm91bmQgaWYgbm90IHByZXNlbnQKKwkgKi8KKwlpZiAoKGN0eC0+ZmxhZ3MgJiBFMkZfT1BUX1JFQURPTkxZKSA9PSAwKQorCQllMmZzY2tfZ2V0X2xvc3RfYW5kX2ZvdW5kKGN0eCwgMSk7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBhbnkgZGlyZWN0b3JpZXMgdGhhdCBuZWVkIHRvIGJlIGluZGV4ZWQgb3IKKwkgKiBvcHRpbWl6ZWQsIGRvIGl0IGhlcmUuCisJICovCisJZTJmc2NrX3JlaGFzaF9kaXJlY3RvcmllcyhjdHgpOworCithYm9ydF9leGl0OgorCWUyZnNja19mcmVlX2Rpcl9pbmZvKGN0eCk7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGlub2RlX2xvb3BfZGV0ZWN0KTsKKwlpbm9kZV9sb29wX2RldGVjdCA9IDA7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGlub2RlX2RvbmVfbWFwKTsKKwlpbm9kZV9kb25lX21hcCA9IDA7Cit9CisKKy8qCisgKiBUaGlzIG1ha2VzIHN1cmUgdGhlIHJvb3QgaW5vZGUgaXMgcHJlc2VudDsgaWYgbm90LCB3ZSBhc2sgaWYgdGhlCisgKiB1c2VyIHdhbnRzIHVzIHRvIGNyZWF0ZSBpdC4gIE5vdCBjcmVhdGluZyBpdCBpcyBhIGZhdGFsIGVycm9yLgorICovCitzdGF0aWMgdm9pZCBjaGVja19yb290KGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJYmxrX3QgICAgICAgICAgICAgICAgICAgYmxrOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCWNoYXIgKiAgICAgICAgICAgICAgICAgIGJsb2NrOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBFWFQyX1JPT1RfSU5PKSkgeworCQkvKgorCQkgKiBJZiB0aGUgcm9vdCBpbm9kZSBpcyBub3QgYSBkaXJlY3RvcnksIGRpZSBoZXJlLiAgVGhlCisJCSAqIHVzZXIgbXVzdCBoYXZlIGFuc3dlcmVkICdubycgaW4gcGFzczEgd2hlbiB3ZQorCQkgKiBvZmZlcmVkIHRvIGNsZWFyIGl0LgorCQkgKi8KKwkJaWYgKCEoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwKKwkJCQkJICAgICAgIEVYVDJfUk9PVF9JTk8pKSkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX1JPT1RfTk9UX0RJUl9BQk9SVCwgJnBjdHgpOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKCFmaXhfcHJvYmxlbShjdHgsIFBSXzNfTk9fUk9PVF9JTk9ERSwgJnBjdHgpKSB7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19OT19ST09UX0lOT0RFX0FCT1JULCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisKKwllMmZzY2tfcmVhZF9iaXRtYXBzKGN0eCk7CisKKwkvKgorCSAqIEZpcnN0LCBmaW5kIGEgZnJlZSBibG9jaworCSAqLworCXBjdHguZXJyY29kZSA9IGV4dDJmc19uZXdfYmxvY2soZnMsIDAsIGN0eC0+YmxvY2tfZm91bmRfbWFwLCAmYmxrKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHguc3RyID0gImV4dDJmc19uZXdfYmxvY2siOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfQ1JFQVRFX1JPT1RfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsIGJsayk7CisJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsIGJsayk7CisJZXh0MmZzX21hcmtfYmJfZGlydHkoZnMpOworCisJLyoKKwkgKiBOb3cgbGV0J3MgY3JlYXRlIHRoZSBhY3R1YWwgZGF0YSBibG9jayBmb3IgdGhlIGlub2RlCisJICovCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX25ld19kaXJfYmxvY2soZnMsIEVYVDJfUk9PVF9JTk8sIEVYVDJfUk9PVF9JTk8sCisJCQkJCSAgICAmYmxvY2spOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5zdHIgPSAiZXh0MmZzX25ld19kaXJfYmxvY2siOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfQ1JFQVRFX1JPT1RfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKworCXBjdHguZXJyY29kZSA9IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZnMsIGJsaywgYmxvY2spOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5zdHIgPSAiZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19DUkVBVEVfUk9PVF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCWV4dDJmc19mcmVlX21lbSgmYmxvY2spOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIGlub2RlIHN0cnVjdHVyZQorCSAqLworCW1lbXNldCgmaW5vZGUsIDAsIHNpemVvZihpbm9kZSkpOworCWlub2RlLmlfbW9kZSA9IDA0MDc1NTsKKwlpbm9kZS5pX3NpemUgPSBmcy0+YmxvY2tzaXplOworCWlub2RlLmlfYXRpbWUgPSBpbm9kZS5pX2N0aW1lID0gaW5vZGUuaV9tdGltZSA9IHRpbWUoTlVMTCk7CisJaW5vZGUuaV9saW5rc19jb3VudCA9IDI7CisJaW5vZGUuaV9ibG9ja3MgPSBmcy0+YmxvY2tzaXplIC8gNTEyOworCWlub2RlLmlfYmxvY2tbMF0gPSBibGs7CisKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgaW5vZGUuCisJICovCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX3dyaXRlX25ld19pbm9kZShmcywgRVhUMl9ST09UX0lOTywgJmlub2RlKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHguc3RyID0gImV4dDJmc193cml0ZV9pbm9kZSI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19DUkVBVEVfUk9PVF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBNaXNjZWxsYW5lb3VzIGJvb2trZWVwaW5nLi4uCisJICovCisJZTJmc2NrX2FkZF9kaXJfaW5mbyhjdHgsIEVYVDJfUk9PVF9JTk8sIEVYVDJfUk9PVF9JTk8pOworCWV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9jb3VudCwgRVhUMl9ST09UX0lOTywgMik7CisJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywgRVhUMl9ST09UX0lOTywgMik7CisKKwlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgRVhUMl9ST09UX0lOTyk7CisJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgRVhUMl9ST09UX0lOTyk7CisJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXAsIEVYVDJfUk9PVF9JTk8pOworCWV4dDJmc19tYXJrX2liX2RpcnR5KGZzKTsKK30KKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhhdCBhIHBhcnRpY3VsYXIKKyAqIGRpcmVjdG9yeSBpcyBjb25uZWN0ZWQgdG8gdGhlIHJvb3Q7IGlmIGl0IGlzbid0IHdlIHRyYWNlIGl0IHVwIGFzCisgKiBmYXIgYXMgd2UgY2FuIGdvLCBhbmQgdGhlbiBvZmZlciB0byBjb25uZWN0IHRoZSByZXN1bHRpbmcgcGFyZW50IHRvCisgKiB0aGUgbG9zdCtmb3VuZC4gIFdlIGhhdmUgdG8gZG8gbG9vcCBkZXRlY3Rpb247IGlmIHdlIGV2ZXIgZGlzY292ZXIKKyAqIGEgbG9vcCwgd2UgdHJlYXQgdGhhdCBhcyBhIGRpc2Nvbm5lY3RlZCBkaXJlY3RvcnkgYW5kIG9mZmVyIHRvCisgKiByZXBhcmVudCBpdCB0byBsb3N0K2ZvdW5kLgorICoKKyAqIEhvd2V2ZXIsIGxvb3AgZGV0ZWN0aW9uIGlzIGV4cGVuc2l2ZSwgYmVjYXVzZSBmb3IgdmVyeSBsYXJnZQorICogZmlsZXN5c3RlbXMsIHRoZSBpbm9kZV9sb29wX2RldGVjdCBiaXRtYXAgaXMgaHVnZSwgYW5kIGNsZWFyaW5nIGl0CisgKiBpcyBub24tdHJpdmlhbC4gIExvb3BzIGluIGZpbGVzeXN0ZW1zIGFyZSBhbHNvIGEgcmFyZSBlcnJvciBjYXNlLAorICogYW5kIHdlIHNob3VsZG4ndCBvcHRpbWl6ZSBmb3IgZXJyb3IgY2FzZXMuICBTbyB3ZSB0cnkgdHdvIHBhc3NlcyBvZgorICogdGhlIGFsZ29yaXRobS4gIFRoZSBmaXJzdCB0aW1lLCB3ZSBpZ25vcmUgbG9vcCBkZXRlY3Rpb24gYW5kIG1lcmVseQorICogaW5jcmVtZW50IGEgY291bnRlcjsgaWYgdGhlIGNvdW50ZXIgZXhjZWVkcyBzb21lIGV4dHJlbWUgdGhyZXNob2xkLAorICogdGhlbiB3ZSB0cnkgYWdhaW4gd2l0aCB0aGUgbG9vcCBkZXRlY3Rpb24gYml0bWFwIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZGlyZWN0b3J5KGUyZnNja190IGN0eCwgc3RydWN0IGRpcl9pbmZvICpkaXIsCisJCQkgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCWV4dDJfZmlsc3lzICAgICBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IGRpcl9pbmZvICpwID0gZGlyOworCWludCAgICAgICAgICAgICBsb29wX3Bhc3MgPSAwLCBwYXJlbnRfY291bnQgPSAwOworCisJaWYgKCFwKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIE1hcmsgdGhpcyBpbm9kZSBhcyBiZWluZyAiZG9uZSI7IGJ5IHRoZSB0aW1lIHdlCisJCSAqIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24sIHRoZSBpbm9kZSB3ZSBlaXRoZXIgYmUKKwkJICogdmVyaWZpZWQgYXMgYmVpbmcgY29ubmVjdGVkIHRvIHRoZSBkaXJlY3RvcnkgdHJlZSwKKwkJICogb3Igd2Ugd2lsbCBoYXZlIG9mZmVyZWQgdG8gcmVjb25uZWN0IHRoaXMgdG8KKwkJICogbG9zdCtmb3VuZC4KKwkJICoKKwkJICogSWYgaXQgd2FzIG1hcmtlZCBkb25lIGFscmVhZHksIHRoZW4gd2UndmUgcmVhY2hlZCBhCisJCSAqIHBhcmVudCB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQuCisJCSAqLworCQlpZiAoZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGlub2RlX2RvbmVfbWFwLCBwLT5pbm8pKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogSWYgdGhpcyBkaXJlY3RvcnkgZG9lc24ndCBoYXZlIGEgcGFyZW50LCBvciB3ZSd2ZQorCQkgKiBzZWVuIHRoZSBwYXJlbnQgb25jZSBhbHJlYWR5LCB0aGVuIG9mZmVyIHRvCisJCSAqIHJlcGFyZW50IGl0IHRvIGxvc3QrZm91bmQKKwkJICovCisJCWlmICghcC0+cGFyZW50IHx8CisJCSAgICAobG9vcF9wYXNzICYmCisJCSAgICAgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpbm9kZV9sb29wX2RldGVjdCwKKwkJCQkJICAgICAgcC0+cGFyZW50KSkpKSB7CisJCQlwY3R4LT5pbm8gPSBwLT5pbm87CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8zX1VOQ09OTkVDVEVEX0RJUiwgcGN0eCkpIHsKKwkJCQlpZiAoZTJmc2NrX3JlY29ubmVjdF9maWxlKGN0eCwgcGN0eC0+aW5vKSkKKwkJCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCQkJZWxzZSB7CisJCQkJCXAgPSBlMmZzY2tfZ2V0X2Rpcl9pbmZvKGN0eCwgcGN0eC0+aW5vKTsKKwkJCQkJcC0+cGFyZW50ID0gY3R4LT5sb3N0X2FuZF9mb3VuZDsKKwkJCQkJZml4X2RvdGRvdChjdHgsIHAsIGN0eC0+bG9zdF9hbmRfZm91bmQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXAgPSBlMmZzY2tfZ2V0X2Rpcl9pbmZvKGN0eCwgcC0+cGFyZW50KTsKKwkJaWYgKCFwKSB7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfTk9fRElSSU5GTywgcGN0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobG9vcF9wYXNzKSB7CisJCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoaW5vZGVfbG9vcF9kZXRlY3QsCisJCQkJCQkgcC0+aW5vKTsKKwkJfSBlbHNlIGlmIChwYXJlbnRfY291bnQrKyA+IDIwNDgpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSd2ZSBydW4gaW50byBhIHBhdGggZGVwdGggdGhhdCdzCisJCQkgKiBncmVhdGVyIHRoYW4gMjA0OCwgdHJ5IGFnYWluIHdpdGggdGhlIGlub2RlCisJCQkgKiBsb29wIGJpdG1hcCB0dXJuZWQgb24gYW5kIHN0YXJ0IGZyb20gdGhlCisJCQkgKiB0b3AuCisJCQkgKi8KKwkJCWxvb3BfcGFzcyA9IDE7CisJCQlpZiAoaW5vZGVfbG9vcF9kZXRlY3QpCisJCQkJZXh0MmZzX2NsZWFyX2lub2RlX2JpdG1hcChpbm9kZV9sb29wX2RldGVjdCk7CisJCQllbHNlIHsKKwkJCQlwY3R4LT5lcnJjb2RlID0gZXh0MmZzX2FsbG9jYXRlX2lub2RlX2JpdG1hcChmcywgXygiaW5vZGUgbG9vcCBkZXRlY3Rpb24gYml0bWFwIiksICZpbm9kZV9sb29wX2RldGVjdCk7CisJCQkJaWYgKHBjdHgtPmVycmNvZGUpIHsKKwkJCQkJcGN0eC0+bnVtID0gMTsKKwkJCQkJZml4X3Byb2JsZW0oY3R4LAorCQkJCSAgICBQUl8zX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsIHBjdHgpOworCQkJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQkJcCA9IGRpcjsKKwkJfQorCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgLi4gYW5kIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFyZSB0aGUgc2FtZTsKKwkgKiBvZmZlciB0byBmaXggaXQgaWYgbm90LgorCSAqLworCWlmIChkaXItPnBhcmVudCAhPSBkaXItPmRvdGRvdCkgeworCQlwY3R4LT5pbm8gPSBkaXItPmlubzsKKwkJcGN0eC0+aW5vMiA9IGRpci0+ZG90ZG90OworCQlwY3R4LT5kaXIgPSBkaXItPnBhcmVudDsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfM19CQURfRE9UX0RPVCwgcGN0eCkpCisJCQlmaXhfZG90ZG90KGN0eCwgZGlyLCBkaXItPnBhcmVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGdldHMgdGhlIGxvc3RfYW5kX2ZvdW5kIGlub2RlLCBtYWtpbmcgaXQgYSBkaXJlY3RvcnkKKyAqIGlmIG5lY2Vzc2FyeQorICovCitleHQyX2lub190IGUyZnNja19nZXRfbG9zdF9hbmRfZm91bmQoZTJmc2NrX3QgY3R4LCBpbnQgZml4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlleHQyX2lub190ICAgICAgICAgICAgICAgICAgICAgIGlubzsKKwlibGtfdCAgICAgICAgICAgICAgICAgICBibGs7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgcmV0dmFsOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCWNoYXIgKiAgICAgICAgICAgICAgICAgIGJsb2NrOworCXN0YXRpYyBjb25zdCBjaGFyICAgICAgIG5hbWVbXSA9ICJsb3N0K2ZvdW5kIjsKKwlzdHJ1Y3QgIHByb2JsZW1fY29udGV4dCBwY3R4OworCXN0cnVjdCBkaXJfaW5mbyAgICAgICAgICpkaXJpbmZvOworCisJaWYgKGN0eC0+bG9zdF9hbmRfZm91bmQpCisJCXJldHVybiBjdHgtPmxvc3RfYW5kX2ZvdW5kOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCXJldHZhbCA9IGV4dDJmc19sb29rdXAoZnMsIEVYVDJfUk9PVF9JTk8sIG5hbWUsCisJCQkgICAgICAgc2l6ZW9mKG5hbWUpLTEsIDAsICZpbm8pOworCWlmIChyZXR2YWwgJiYgIWZpeCkKKwkJcmV0dXJuIDA7CisJaWYgKCFyZXR2YWwpIHsKKwkJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGlubykpIHsKKwkJCWN0eC0+bG9zdF9hbmRfZm91bmQgPSBpbm87CisJCQlyZXR1cm4gaW5vOworCQl9CisKKwkJLyogTG9zdCtmb3VuZCBpc24ndCBhIGRpcmVjdG9yeSEgKi8KKwkJaWYgKCFmaXgpCisJCQlyZXR1cm4gMDsKKwkJcGN0eC5pbm8gPSBpbm87CisJCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8zX0xQRl9OT1RESVIsICZwY3R4KSkKKwkJCXJldHVybiAwOworCisJCS8qIE9LLCB1bmxpbmsgdGhlIG9sZCAvbG9zdCtmb3VuZCBmaWxlLiAqLworCQlwY3R4LmVycmNvZGUgPSBleHQyZnNfdW5saW5rKGZzLCBFWFQyX1JPT1RfSU5PLCBuYW1lLCBpbm8sIDApOworCQlpZiAocGN0eC5lcnJjb2RlKSB7CisJCQlwY3R4LnN0ciA9ICJleHQyZnNfdW5saW5rIjsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19DUkVBVEVfTFBGX0VSUk9SLCAmcGN0eCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkaXJpbmZvID0gZTJmc2NrX2dldF9kaXJfaW5mbyhjdHgsIGlubyk7CisJCWlmIChkaXJpbmZvKQorCQkJZGlyaW5mby0+cGFyZW50ID0gMDsKKwkJZTJmc2NrX2FkanVzdF9pbm9kZV9jb3VudChjdHgsIGlubywgLTEpOworCX0gZWxzZSBpZiAocmV0dmFsICE9IEVYVDJfRVRfRklMRV9OT1RfRk9VTkQpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNfRVJSX0ZJTkRfTFBGLCAmcGN0eCk7CisJfQorCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8zX05PX0xGX0RJUiwgMCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBSZWFkIHRoZSBpbm9kZSBhbmQgYmxvY2sgYml0bWFwcyBpbjsgd2UnbGwgYmUgbWVzc2luZyB3aXRoCisJICogdGhlbS4KKwkgKi8KKwllMmZzY2tfcmVhZF9iaXRtYXBzKGN0eCk7CisKKwkvKgorCSAqIEZpcnN0LCBmaW5kIGEgZnJlZSBibG9jaworCSAqLworCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIDAsIGN0eC0+YmxvY2tfZm91bmRfbWFwLCAmYmxrKTsKKwlpZiAocmV0dmFsKSB7CisJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0VSUl9MUEZfTkVXX0JMT0NLLCAmcGN0eCk7CisJCXJldHVybiAwOworCX0KKwlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXAsIGJsayk7CisJZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGZzLCBibGssICsxKTsKKworCS8qCisJICogTmV4dCBmaW5kIGEgZnJlZSBpbm9kZS4KKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfbmV3X2lub2RlKGZzLCBFWFQyX1JPT1RfSU5PLCAwNDA3MDAsCisJCQkJICBjdHgtPmlub2RlX3VzZWRfbWFwLCAmaW5vKTsKKwlpZiAocmV0dmFsKSB7CisJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0VSUl9MUEZfTkVXX0lOT0RFLCAmcGN0eCk7CisJCXJldHVybiAwOworCX0KKwlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaW5vKTsKKwlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9kaXJfbWFwLCBpbm8pOworCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGlubywgKzEsIDEpOworCisJLyoKKwkgKiBOb3cgbGV0J3MgY3JlYXRlIHRoZSBhY3R1YWwgZGF0YSBibG9jayBmb3IgdGhlIGlub2RlCisJICovCisJcmV0dmFsID0gZXh0MmZzX25ld19kaXJfYmxvY2soZnMsIGlubywgRVhUMl9ST09UX0lOTywgJmJsb2NrKTsKKwlpZiAocmV0dmFsKSB7CisJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0VSUl9MUEZfTkVXX0RJUl9CTE9DSywgJnBjdHgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCBibGssIGJsb2NrKTsKKwlleHQyZnNfZnJlZV9tZW0oJmJsb2NrKTsKKwlpZiAocmV0dmFsKSB7CisJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0VSUl9MUEZfV1JJVEVfQkxPQ0ssICZwY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgdGhlIGlub2RlIHN0cnVjdHVyZQorCSAqLworCW1lbXNldCgmaW5vZGUsIDAsIHNpemVvZihpbm9kZSkpOworCWlub2RlLmlfbW9kZSA9IDA0MDcwMDsKKwlpbm9kZS5pX3NpemUgPSBmcy0+YmxvY2tzaXplOworCWlub2RlLmlfYXRpbWUgPSBpbm9kZS5pX2N0aW1lID0gaW5vZGUuaV9tdGltZSA9IHRpbWUoTlVMTCk7CisJaW5vZGUuaV9saW5rc19jb3VudCA9IDI7CisJaW5vZGUuaV9ibG9ja3MgPSBmcy0+YmxvY2tzaXplIC8gNTEyOworCWlub2RlLmlfYmxvY2tbMF0gPSBibGs7CisKKwkvKgorCSAqIE5leHQsIHdyaXRlIG91dCB0aGUgaW5vZGUuCisJICovCisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX3dyaXRlX25ld19pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5zdHIgPSAiZXh0MmZzX3dyaXRlX2lub2RlIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NSRUFURV9MUEZfRVJST1IsICZwY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogRmluYWxseSwgY3JlYXRlIHRoZSBkaXJlY3RvcnkgbGluaworCSAqLworCXBjdHguZXJyY29kZSA9IGV4dDJmc19saW5rKGZzLCBFWFQyX1JPT1RfSU5PLCBuYW1lLCBpbm8sIEVYVDJfRlRfRElSKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHguc3RyID0gImV4dDJmc19saW5rIjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NSRUFURV9MUEZfRVJST1IsICZwY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBNaXNjZWxsYW5lb3VzIGJvb2trZWVwaW5nIHRoYXQgbmVlZHMgdG8gYmUga2VwdCBzdHJhaWdodC4KKwkgKi8KKwllMmZzY2tfYWRkX2Rpcl9pbmZvKGN0eCwgaW5vLCBFWFQyX1JPT1RfSU5PKTsKKwllMmZzY2tfYWRqdXN0X2lub2RlX2NvdW50KGN0eCwgRVhUMl9ST09UX0lOTywgMSk7CisJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2NvdW50LCBpbm8sIDIpOworCWV4dDJmc19pY291bnRfc3RvcmUoY3R4LT5pbm9kZV9saW5rX2luZm8sIGlubywgMik7CisJY3R4LT5sb3N0X2FuZF9mb3VuZCA9IGlubzsKKwlyZXR1cm4gaW5vOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHdpbGwgY29ubmVjdCBhIGZpbGUgdG8gbG9zdCtmb3VuZAorICovCitpbnQgZTJmc2NrX3JlY29ubmVjdF9maWxlKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8pCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJY2hhciAgICAgICAgICAgIG5hbWVbODBdOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJaW50ICAgICAgICAgICAgIGZpbGVfdHlwZSA9IDA7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCXBjdHguaW5vID0gaW5vOworCisJaWYgKCFjdHgtPmJhZF9sb3N0X2FuZF9mb3VuZCAmJiAhY3R4LT5sb3N0X2FuZF9mb3VuZCkgeworCQlpZiAoZTJmc2NrX2dldF9sb3N0X2FuZF9mb3VuZChjdHgsIDEpID09IDApCisJCQljdHgtPmJhZF9sb3N0X2FuZF9mb3VuZCsrOworCX0KKwlpZiAoY3R4LT5iYWRfbG9zdF9hbmRfZm91bmQpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX05PX0xQRiwgJnBjdHgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcHJpbnRmKG5hbWUsICIjJXUiLCBpbm8pOworCWlmIChleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGUpID09IDApCisJCWZpbGVfdHlwZSA9IGV4dDJfZmlsZV90eXBlKGlub2RlLmlfbW9kZSk7CisJcmV0dmFsID0gZXh0MmZzX2xpbmsoZnMsIGN0eC0+bG9zdF9hbmRfZm91bmQsIG5hbWUsIGlubywgZmlsZV90eXBlKTsKKwlpZiAocmV0dmFsID09IEVYVDJfRVRfRElSX05PX1NQQUNFKSB7CisJCWlmICghZml4X3Byb2JsZW0oY3R4LCBQUl8zX0VYUEFORF9MRl9ESVIsICZwY3R4KSkKKwkJCXJldHVybiAxOworCQlyZXR2YWwgPSBlMmZzY2tfZXhwYW5kX2RpcmVjdG9yeShjdHgsIGN0eC0+bG9zdF9hbmRfZm91bmQsCisJCQkJCQkgMSwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM19DQU5UX0VYUEFORF9MUEYsICZwY3R4KTsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHZhbCA9IGV4dDJmc19saW5rKGZzLCBjdHgtPmxvc3RfYW5kX2ZvdW5kLCBuYW1lLAorCQkJCSAgICAgaW5vLCBmaWxlX3R5cGUpOworCX0KKwlpZiAocmV0dmFsKSB7CisJCXBjdHguZXJyY29kZSA9IHJldHZhbDsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8zX0NBTlRfUkVDT05ORUNULCAmcGN0eCk7CisJCXJldHVybiAxOworCX0KKwllMmZzY2tfYWRqdXN0X2lub2RlX2NvdW50KGN0eCwgaW5vLCAxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVXRpbGl0eSByb3V0aW5lIHRvIGFkanVzdCB0aGUgaW5vZGUgY291bnRzIG9uIGFuIGlub2RlLgorICovCitlcnJjb2RlX3QgZTJmc2NrX2FkanVzdF9pbm9kZV9jb3VudChlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaW5vLCBpbnQgYWRqKQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisKKwlpZiAoIWlubykKKwkJcmV0dXJuIDA7CisKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoYWRqID09IDEpIHsKKwkJZXh0MmZzX2ljb3VudF9pbmNyZW1lbnQoY3R4LT5pbm9kZV9jb3VudCwgaW5vLCAwKTsKKwkJaWYgKGlub2RlLmlfbGlua3NfY291bnQgPT0gKF9fdTE2KSB+MCkKKwkJCXJldHVybiAwOworCQlleHQyZnNfaWNvdW50X2luY3JlbWVudChjdHgtPmlub2RlX2xpbmtfaW5mbywgaW5vLCAwKTsKKwkJaW5vZGUuaV9saW5rc19jb3VudCsrOworCX0gZWxzZSBpZiAoYWRqID09IC0xKSB7CisJCWV4dDJmc19pY291bnRfZGVjcmVtZW50KGN0eC0+aW5vZGVfY291bnQsIGlubywgMCk7CisJCWlmIChpbm9kZS5pX2xpbmtzX2NvdW50ID09IDApCisJCQlyZXR1cm4gMDsKKwkJZXh0MmZzX2ljb3VudF9kZWNyZW1lbnQoY3R4LT5pbm9kZV9saW5rX2luZm8sIGlubywgMCk7CisJCWlub2RlLmlfbGlua3NfY291bnQtLTsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGlubywgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaXggcGFyZW50IC0tLSB0aGlzIHJvdXRpbmUgZml4ZXMgdXAgdGhlIHBhcmVudCBvZiBhIGRpcmVjdG9yeS4KKyAqLworc3RydWN0IGZpeF9kb3Rkb3Rfc3RydWN0IHsKKwlleHQyX2ZpbHN5cyAgICAgZnM7CisJZXh0Ml9pbm9fdCAgICAgIHBhcmVudDsKKwlpbnQgICAgICAgICAgICAgZG9uZTsKKwllMmZzY2tfdCAgICAgICAgY3R4OworfTsKKworc3RhdGljIGludCBmaXhfZG90ZG90X3Byb2Moc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkgICBpbnQgIG9mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgaW50ICBibG9ja3NpemUgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIGNoYXIgKmJ1ZiBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBmaXhfZG90ZG90X3N0cnVjdCAqZnAgPSAoc3RydWN0IGZpeF9kb3Rkb3Rfc3RydWN0ICopIHByaXZfZGF0YTsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKworCWlmICgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpICE9IDIpCisJCXJldHVybiAwOworCWlmIChzdHJuY21wKGRpcmVudC0+bmFtZSwgIi4uIiwgMikpCisJCXJldHVybiAwOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCXJldHZhbCA9IGUyZnNja19hZGp1c3RfaW5vZGVfY291bnQoZnAtPmN0eCwgZGlyZW50LT5pbm9kZSwgLTEpOworCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShmcC0+Y3R4LCBQUl8zX0FESlVTVF9JTk9ERSwgJnBjdHgpOworCX0KKwlyZXR2YWwgPSBlMmZzY2tfYWRqdXN0X2lub2RlX2NvdW50KGZwLT5jdHgsIGZwLT5wYXJlbnQsIDEpOworCWlmIChyZXR2YWwpIHsKKwkJcGN0eC5lcnJjb2RlID0gcmV0dmFsOworCQlmaXhfcHJvYmxlbShmcC0+Y3R4LCBQUl8zX0FESlVTVF9JTk9ERSwgJnBjdHgpOworCX0KKwlkaXJlbnQtPmlub2RlID0gZnAtPnBhcmVudDsKKworCWZwLT5kb25lKys7CisJcmV0dXJuIERJUkVOVF9BQk9SVCB8IERJUkVOVF9DSEFOR0VEOworfQorCitzdGF0aWMgdm9pZCBmaXhfZG90ZG90KGUyZnNja190IGN0eCwgc3RydWN0IGRpcl9pbmZvICpkaXIsIGV4dDJfaW5vX3QgcGFyZW50KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXN0cnVjdCBmaXhfZG90ZG90X3N0cnVjdCBmcDsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0IHBjdHg7CisKKwlmcC5mcyA9IGZzOworCWZwLnBhcmVudCA9IHBhcmVudDsKKwlmcC5kb25lID0gMDsKKwlmcC5jdHggPSBjdHg7CisKKwlyZXR2YWwgPSBleHQyZnNfZGlyX2l0ZXJhdGUoZnMsIGRpci0+aW5vLCBESVJFTlRfRkxBR19JTkNMVURFX0VNUFRZLAorCQkJCSAgICAwLCBmaXhfZG90ZG90X3Byb2MsICZmcCk7CisJaWYgKHJldHZhbCB8fCAhZnAuZG9uZSkgeworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQlwY3R4LmlubyA9IGRpci0+aW5vOworCQlwY3R4LmVycmNvZGUgPSByZXR2YWw7CisJCWZpeF9wcm9ibGVtKGN0eCwgcmV0dmFsID8gUFJfM19GSVhfUEFSRU5UX0VSUiA6CisJCQkgICAgUFJfM19GSVhfUEFSRU5UX05PRklORCwgJnBjdHgpOworCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwl9CisJZGlyLT5kb3Rkb3QgPSBwYXJlbnQ7Cit9CisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIGV4cGFuZGluZyBhIC9sb3N0K2ZvdW5kIGlmIGl0IGlzCisgKiB0b28gc21hbGwuCisgKi8KKworc3RydWN0IGV4cGFuZF9kaXJfc3RydWN0IHsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBudW07CisJaW50ICAgICAgICAgICAgICAgICAgICAgZ3VhcmFudGVlZF9zaXplOworCWludCAgICAgICAgICAgICAgICAgICAgIG5ld2Jsb2NrczsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBsYXN0X2Jsb2NrOworCWVycmNvZGVfdCAgICAgICAgICAgICAgIGVycjsKKwllMmZzY2tfdCAgICAgICAgICAgICAgICBjdHg7Cit9OworCitzdGF0aWMgaW50IGV4cGFuZF9kaXJfcHJvYyhleHQyX2ZpbHN5cyBmcywKKwkJCSAgIGJsa190ICAgICAgICAqYmxvY2tuciwKKwkJCSAgIGUyX2Jsa2NudF90ICBibG9ja2NudCwKKwkJCSAgIGJsa190IHJlZl9ibG9jayBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgaW50IHJlZl9vZmZzZXQgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZXhwYW5kX2Rpcl9zdHJ1Y3QgKmVzID0gKHN0cnVjdCBleHBhbmRfZGlyX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJYmxrX3QgICBuZXdfYmxrOworCXN0YXRpYyBibGtfdCAgICBsYXN0X2JsayA9IDA7CisJY2hhciAgICAgICAgICAgICpibG9jazsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCWUyZnNja190ICAgICAgICBjdHg7CisKKwljdHggPSBlcy0+Y3R4OworCisJaWYgKGVzLT5ndWFyYW50ZWVkX3NpemUgJiYgYmxvY2tjbnQgPj0gZXMtPmd1YXJhbnRlZWRfc2l6ZSkKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCisJaWYgKGJsb2NrY250ID4gMCkKKwkJZXMtPmxhc3RfYmxvY2sgPSBibG9ja2NudDsKKwlpZiAoKmJsb2NrbnIpIHsKKwkJbGFzdF9ibGsgPSAqYmxvY2tucjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIGxhc3RfYmxrLCBjdHgtPmJsb2NrX2ZvdW5kX21hcCwKKwkJCQkgICZuZXdfYmxrKTsKKwlpZiAocmV0dmFsKSB7CisJCWVzLT5lcnIgPSByZXR2YWw7CisJCXJldHVybiBCTE9DS19BQk9SVDsKKwl9CisJaWYgKGJsb2NrY250ID4gMCkgeworCQlyZXR2YWwgPSBleHQyZnNfbmV3X2Rpcl9ibG9jayhmcywgMCwgMCwgJmJsb2NrKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZXMtPmVyciA9IHJldHZhbDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCQllcy0+bnVtLS07CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9kaXJfYmxvY2soZnMsIG5ld19ibGssIGJsb2NrKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYmxvY2spOworCQlpZiAocmV0dmFsKSB7CisJCQllcy0+ZXJyID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCW1lbXNldChibG9jaywgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgbmV3X2JsaywgMSwgYmxvY2spOworCX0KKwlpZiAocmV0dmFsKSB7CisJCWVzLT5lcnIgPSByZXR2YWw7CisJCXJldHVybiBCTE9DS19BQk9SVDsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZibG9jayk7CisJKmJsb2NrbnIgPSBuZXdfYmxrOworCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgbmV3X2Jsayk7CisJZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGZzLCBuZXdfYmxrLCArMSk7CisJZXMtPm5ld2Jsb2NrcysrOworCisJaWYgKGVzLT5udW0gPT0gMCkKKwkJcmV0dXJuIChCTE9DS19DSEFOR0VEIHwgQkxPQ0tfQUJPUlQpOworCWVsc2UKKwkJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7Cit9CisKK2VycmNvZGVfdCBlMmZzY2tfZXhwYW5kX2RpcmVjdG9yeShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgZGlyLAorCQkJCSAgaW50IG51bSwgaW50IGd1YXJhbnRlZWRfc2l6ZSkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlzdHJ1Y3QgZXhwYW5kX2Rpcl9zdHJ1Y3QgZXM7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisKKwlpZiAoIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfUlcpKQorCQlyZXR1cm4gRVhUMl9FVF9ST19GSUxTWVM7CisKKwkvKgorCSAqIFJlYWQgdGhlIGlub2RlIGFuZCBibG9jayBiaXRtYXBzIGluOyB3ZSdsbCBiZSBtZXNzaW5nIHdpdGgKKwkgKiB0aGVtLgorCSAqLworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKworCXJldHZhbCA9IGV4dDJmc19jaGVja19kaXJlY3RvcnkoZnMsIGRpcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWVzLm51bSA9IG51bTsKKwllcy5ndWFyYW50ZWVkX3NpemUgPSBndWFyYW50ZWVkX3NpemU7CisJZXMubGFzdF9ibG9jayA9IDA7CisJZXMuZXJyID0gMDsKKwllcy5uZXdibG9ja3MgPSAwOworCWVzLmN0eCA9IGN0eDsKKworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgZGlyLCBCTE9DS19GTEFHX0FQUEVORCwKKwkJCQkgICAgICAgMCwgZXhwYW5kX2Rpcl9wcm9jLCAmZXMpOworCisJaWYgKGVzLmVycikKKwkJcmV0dXJuIGVzLmVycjsKKworCS8qCisJICogVXBkYXRlIHRoZSBzaXplIGFuZCBibG9jayBjb3VudCBmaWVsZHMgaW4gdGhlIGlub2RlLgorCSAqLworCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBkaXIsICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlub2RlLmlfc2l6ZSA9IChlcy5sYXN0X2Jsb2NrICsgMSkgKiBmcy0+YmxvY2tzaXplOworCWlub2RlLmlfYmxvY2tzICs9IChmcy0+YmxvY2tzaXplIC8gNTEyKSAqIGVzLm5ld2Jsb2NrczsKKworCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGRpciwgJmlub2RlLCAiZXhwYW5kX2RpcmVjdG9yeSIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXNzNC5jIC0tIHBhc3MgIzQgb2YgZTJmc2NrOiBDaGVjayByZWZlcmVuY2UgY291bnRzCisgKgorICogUGFzcyA0IGZyZWVzIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzOgorICogICAgICAtIEEgYml0bWFwIG9mIHdoaWNoIGlub2RlcyBhcmUgaW1hZ2ljIGlub2Rlcy4gICAoaW5vZGVfaW1hZ2ljX21hcCkKKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGlub2RlIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlCisgKiBkaXJlY3RvcnkgdHJlZS4KKyAqCisgKiBUaGlzIHN1YnJvdXRpbmUgcmV0dXJucyAxIHRoZW4gdGhlIGNhbGxlciBzaG91bGRuJ3QgYm90aGVyIHdpdGggdGhlCisgKiByZXN0IG9mIHRoZSBwYXNzIDQgdGVzdHMuCisgKi8KK3N0YXRpYyBpbnQgZGlzY29ubmVjdF9pbm9kZShlMmZzY2tfdCBjdHgsIGV4dDJfaW5vX3QgaSkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaSwgJmlub2RlLCAicGFzczQ6IGRpc2Nvbm5lY3RfaW5vZGUiKTsKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCXBjdHguaW5vID0gaTsKKwlwY3R4Lmlub2RlID0gJmlub2RlOworCisJLyoKKwkgKiBPZmZlciB0byBkZWxldGUgYW55IHplcm8tbGVuZ3RoIGZpbGVzIHRoYXQgZG9lcyBub3QgaGF2ZQorCSAqIGJsb2Nrcy4gIElmIHRoZXJlIGlzIGFuIEVBIGJsb2NrLCBpdCBtaWdodCBoYXZlIHVzZWZ1bAorCSAqIGluZm9ybWF0aW9uLCBzbyB3ZSB3b24ndCBwcm9tcHQgdG8gZGVsZXRlIGl0LCBidXQgbGV0IGl0IGJlCisJICogcmVjb25uZWN0ZWQgdG8gbG9zdCtmb3VuZC4KKwkgKi8KKwlpZiAoIWlub2RlLmlfYmxvY2tzICYmIChMSU5VWF9TX0lTUkVHKGlub2RlLmlfbW9kZSkgfHwKKwkJCQlMSU5VWF9TX0lTRElSKGlub2RlLmlfbW9kZSkpKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzRfWkVST19MRU5fSU5PREUsICZwY3R4KSkgeworCQkJZXh0MmZzX2ljb3VudF9zdG9yZShjdHgtPmlub2RlX2xpbmtfaW5mbywgaSwgMCk7CisJCQlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMDsKKwkJCWlub2RlLmlfZHRpbWUgPSB0aW1lKE5VTEwpOworCQkJZTJmc2NrX3dyaXRlX2lub2RlKGN0eCwgaSwgJmlub2RlLAorCQkJCQkgICAiZGlzY29ubmVjdF9pbm9kZSIpOworCQkJLyoKKwkJCSAqIEZpeCB1cCB0aGUgYml0bWFwcy4uLgorCQkJICovCisJCQllMmZzY2tfcmVhZF9iaXRtYXBzKGN0eCk7CisJCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpKTsKKwkJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCwgaSk7CisJCQlleHQyZnNfaW5vZGVfYWxsb2Nfc3RhdHMyKGZzLCBpLCAtMSwKKwkJCQkJCSAgTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBQcm9tcHQgdG8gcmVjb25uZWN0LgorCSAqLworCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzRfVU5BVFRBQ0hFRF9JTk9ERSwgJnBjdHgpKSB7CisJCWlmIChlMmZzY2tfcmVjb25uZWN0X2ZpbGUoY3R4LCBpKSkKKwkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHdlIGRvbid0IGF0dGFjaCB0aGUgaW5vZGUsIHRoZW4gc2tpcCB0aGUKKwkJICogaV9saW5rc190ZXN0IHNpbmNlIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvCisJCSAqIGZvcmNlIGlfbGlua3NfY291bnQgdG8gemVyby4KKwkJICovCisJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZTJmc2NrX3Bhc3M0KGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCAgICAgIGk7CisJc3RydWN0IGV4dDJfaW5vZGUgICAgICAgaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlfX3UxNiAgIGxpbmtfY291bnQsIGxpbmtfY291bnRlZDsKKwljaGFyICAgICpidWYgPSBOVUxMOworCWludCAgICAgZ3JvdXAsIG1heGdyb3VwOworCisJLyogUGFzcyA0ICovCisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpCisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNF9QQVNTX0hFQURFUiwgJnBjdHgpOworCisJZ3JvdXAgPSAwOworCW1heGdyb3VwID0gZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCWlmICgoY3R4LT5wcm9ncmVzcykoY3R4LCA0LCAwLCBtYXhncm91cCkpCisJCQlyZXR1cm47CisKKwlmb3IgKGk9MTsgaSA8PSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OyBpKyspIHsKKwkJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJCXJldHVybjsKKwkJaWYgKChpICUgZnMtPnN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXApID09IDApIHsKKwkJCWdyb3VwKys7CisJCQlpZiAoY3R4LT5wcm9ncmVzcykKKwkJCQlpZiAoKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgNCwgZ3JvdXAsIG1heGdyb3VwKSkKKwkJCQkJcmV0dXJuOworCQl9CisJCWlmIChpID09IEVYVDJfQkFEX0lOTyB8fAorCQkgICAgKGkgPiBFWFQyX1JPT1RfSU5PICYmIGkgPCBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcikpKQorCQkJY29udGludWU7CisJCWlmICghKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX3VzZWRfbWFwLCBpKSkgfHwKKwkJICAgIChjdHgtPmlub2RlX2ltYWdpY19tYXAgJiYKKwkJICAgICBleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV9pbWFnaWNfbWFwLCBpKSkpCisJCQljb250aW51ZTsKKwkJZXh0MmZzX2ljb3VudF9mZXRjaChjdHgtPmlub2RlX2xpbmtfaW5mbywgaSwgJmxpbmtfY291bnQpOworCQlleHQyZnNfaWNvdW50X2ZldGNoKGN0eC0+aW5vZGVfY291bnQsIGksICZsaW5rX2NvdW50ZWQpOworCQlpZiAobGlua19jb3VudGVkID09IDApIHsKKwkJCWlmICghYnVmKQorCQkJCWJ1ZiA9IGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCQkJCSAgICAgZnMtPmJsb2Nrc2l6ZSwgImJhZF9pbm9kZSBidWZmZXIiKTsKKwkJCWlmIChlMmZzY2tfcHJvY2Vzc19iYWRfaW5vZGUoY3R4LCAwLCBpLCBidWYpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGRpc2Nvbm5lY3RfaW5vZGUoY3R4LCBpKSkKKwkJCQljb250aW51ZTsKKwkJCWV4dDJmc19pY291bnRfZmV0Y2goY3R4LT5pbm9kZV9saW5rX2luZm8sIGksCisJCQkJCSAgICAmbGlua19jb3VudCk7CisJCQlleHQyZnNfaWNvdW50X2ZldGNoKGN0eC0+aW5vZGVfY291bnQsIGksCisJCQkJCSAgICAmbGlua19jb3VudGVkKTsKKwkJfQorCQlpZiAobGlua19jb3VudGVkICE9IGxpbmtfY291bnQpIHsKKwkJCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaSwgJmlub2RlLCAicGFzczQiKTsKKwkJCXBjdHguaW5vID0gaTsKKwkJCXBjdHguaW5vZGUgPSAmaW5vZGU7CisJCQlpZiAobGlua19jb3VudCAhPSBpbm9kZS5pX2xpbmtzX2NvdW50KSB7CisJCQkJcGN0eC5udW0gPSBsaW5rX2NvdW50OworCQkJCWZpeF9wcm9ibGVtKGN0eCwKKwkJCQkJICAgIFBSXzRfSU5DT05TSVNURU5UX0NPVU5ULCAmcGN0eCk7CisJCQl9CisJCQlwY3R4Lm51bSA9IGxpbmtfY291bnRlZDsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzRfQkFEX1JFRl9DT1VOVCwgJnBjdHgpKSB7CisJCQkJaW5vZGUuaV9saW5rc19jb3VudCA9IGxpbmtfY291bnRlZDsKKwkJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBpLCAmaW5vZGUsICJwYXNzNCIpOworCQkJfQorCQl9CisJfQorCWV4dDJmc19mcmVlX2ljb3VudChjdHgtPmlub2RlX2xpbmtfaW5mbyk7IGN0eC0+aW5vZGVfbGlua19pbmZvID0gMDsKKwlleHQyZnNfZnJlZV9pY291bnQoY3R4LT5pbm9kZV9jb3VudCk7IGN0eC0+aW5vZGVfY291bnQgPSAwOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2ltYWdpY19tYXApOworCWN0eC0+aW5vZGVfaW1hZ2ljX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworfQorCisvKgorICogcGFzczUuYyAtLS0gY2hlY2sgYmxvY2sgYW5kIGlub2RlIGJpdG1hcHMgYWdhaW5zdCBvbi1kaXNrIGJpdG1hcHMKKyAqLworCisjZGVmaW5lIE5PX0JMSyAoKGJsa190KSAtMSkKKworc3RhdGljIHZvaWQgcHJpbnRfYml0bWFwX3Byb2JsZW0oZTJmc2NrX3QgY3R4LCBpbnQgcHJvYmxlbSwKKwkJCSAgICBzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4KQoreworCXN3aXRjaCAocHJvYmxlbSkgeworCWNhc2UgUFJfNV9CTE9DS19VTlVTRUQ6CisJCWlmIChwY3R4LT5ibGsgPT0gcGN0eC0+YmxrMikKKwkJCXBjdHgtPmJsazIgPSAwOworCQllbHNlCisJCQlwcm9ibGVtID0gUFJfNV9CTE9DS19SQU5HRV9VTlVTRUQ7CisJCWJyZWFrOworCWNhc2UgUFJfNV9CTE9DS19VU0VEOgorCQlpZiAocGN0eC0+YmxrID09IHBjdHgtPmJsazIpCisJCQlwY3R4LT5ibGsyID0gMDsKKwkJZWxzZQorCQkJcHJvYmxlbSA9IFBSXzVfQkxPQ0tfUkFOR0VfVVNFRDsKKwkJYnJlYWs7CisJY2FzZSBQUl81X0lOT0RFX1VOVVNFRDoKKwkJaWYgKHBjdHgtPmlubyA9PSBwY3R4LT5pbm8yKQorCQkJcGN0eC0+aW5vMiA9IDA7CisJCWVsc2UKKwkJCXByb2JsZW0gPSBQUl81X0lOT0RFX1JBTkdFX1VOVVNFRDsKKwkJYnJlYWs7CisJY2FzZSBQUl81X0lOT0RFX1VTRUQ6CisJCWlmIChwY3R4LT5pbm8gPT0gcGN0eC0+aW5vMikKKwkJCXBjdHgtPmlubzIgPSAwOworCQllbHNlCisJCQlwcm9ibGVtID0gUFJfNV9JTk9ERV9SQU5HRV9VU0VEOworCQlicmVhazsKKwl9CisJZml4X3Byb2JsZW0oY3R4LCBwcm9ibGVtLCBwY3R4KTsKKwlwY3R4LT5ibGsgPSBwY3R4LT5ibGsyID0gTk9fQkxLOworCXBjdHgtPmlubyA9IHBjdHgtPmlubzIgPSAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19ibG9ja19iaXRtYXBzKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJYmxrX3QgICBpOworCWludCAgICAgKmZyZWVfYXJyYXk7CisJaW50ICAgICBncm91cCA9IDA7CisJdW5zaWduZWQgaW50ICAgIGJsb2NrcyA9IDA7CisJdW5zaWduZWQgaW50ICAgIGZyZWVfYmxvY2tzID0gMDsKKwlpbnQgICAgIGdyb3VwX2ZyZWUgPSAwOworCWludCAgICAgYWN0dWFsLCBiaXRtYXA7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlpbnQgICAgIHByb2JsZW0sIHNhdmVfcHJvYmxlbSwgZml4aXQsIGhhZF9wcm9ibGVtOworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCWZyZWVfYXJyYXkgPSAoaW50ICopIGUyZnNja19hbGxvY2F0ZV9tZW1vcnkoY3R4LAorCSAgICBmcy0+Z3JvdXBfZGVzY19jb3VudCAqIHNpemVvZihpbnQpLCAiZnJlZSBibG9jayBjb3VudCBhcnJheSIpOworCisJaWYgKChmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayA8CisJICAgICBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9zdGFydChjdHgtPmJsb2NrX2ZvdW5kX21hcCkpIHx8CisJICAgIChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50LTEgPgorCSAgICAgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfZW5kKGN0eC0+YmxvY2tfZm91bmRfbWFwKSkpIHsKKwkJcGN0eC5udW0gPSAxOworCQlwY3R4LmJsayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCQlwY3R4LmJsazIgPSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IC0xOworCQlwY3R4LmlubyA9IGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX3N0YXJ0KGN0eC0+YmxvY2tfZm91bmRfbWFwKTsKKwkJcGN0eC5pbm8yID0gZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfZW5kKGN0eC0+YmxvY2tfZm91bmRfbWFwKTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0JNQVBfRU5EUE9JTlRTLCAmcGN0eCk7CisKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogZmF0YWwgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2sgPAorCSAgICAgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfc3RhcnQoZnMtPmJsb2NrX21hcCkpIHx8CisJICAgIChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50LTEgPgorCSAgICAgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfZW5kKGZzLT5ibG9ja19tYXApKSkgeworCQlwY3R4Lm51bSA9IDI7CisJCXBjdHguYmxrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJCXBjdHguYmxrMiA9IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgLTE7CisJCXBjdHguaW5vID0gZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfc3RhcnQoZnMtPmJsb2NrX21hcCk7CisJCXBjdHguaW5vMiA9IGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX2VuZChmcy0+YmxvY2tfbWFwKTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0JNQVBfRU5EUE9JTlRTLCAmcGN0eCk7CisKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogZmF0YWwgKi8KKwkJcmV0dXJuOworCX0KKworcmVkb19jb3VudHM6CisJaGFkX3Byb2JsZW0gPSAwOworCXNhdmVfcHJvYmxlbSA9IDA7CisJcGN0eC5ibGsgPSBwY3R4LmJsazIgPSBOT19CTEs7CisJZm9yIChpID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJICAgICBpIDwgZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudDsKKwkgICAgIGkrKykgeworCQlhY3R1YWwgPSBleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChjdHgtPmJsb2NrX2ZvdW5kX21hcCwgaSk7CisJCWJpdG1hcCA9IGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsIGkpOworCisJCWlmIChhY3R1YWwgPT0gYml0bWFwKQorCQkJZ290byBkb19jb3VudHM7CisKKwkJaWYgKCFhY3R1YWwgJiYgYml0bWFwKSB7CisJCQkvKgorCQkJICogQmxvY2sgbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gdXNlIGluIHRoZSBiaXRtYXAuCisJCQkgKi8KKwkJCXByb2JsZW0gPSBQUl81X0JMT0NLX1VOVVNFRDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBCbG9jayB1c2VkLCBidXQgbm90IG1hcmtlZCBpbiB1c2UgaW4gdGhlIGJpdG1hcC4KKwkJCSAqLworCQkJcHJvYmxlbSA9IFBSXzVfQkxPQ0tfVVNFRDsKKwkJfQorCQlpZiAocGN0eC5ibGsgPT0gTk9fQkxLKSB7CisJCQlwY3R4LmJsayA9IHBjdHguYmxrMiA9IGk7CisJCQlzYXZlX3Byb2JsZW0gPSBwcm9ibGVtOworCQl9IGVsc2UgeworCQkJaWYgKChwcm9ibGVtID09IHNhdmVfcHJvYmxlbSkgJiYKKwkJCSAgICAocGN0eC5ibGsyID09IGktMSkpCisJCQkJcGN0eC5ibGsyKys7CisJCQllbHNlIHsKKwkJCQlwcmludF9iaXRtYXBfcHJvYmxlbShjdHgsIHNhdmVfcHJvYmxlbSwgJnBjdHgpOworCQkJCXBjdHguYmxrID0gcGN0eC5ibGsyID0gaTsKKwkJCQlzYXZlX3Byb2JsZW0gPSBwcm9ibGVtOworCQkJfQorCQl9CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfUFJPR19TVVBQUkVTUzsKKwkJaGFkX3Byb2JsZW0rKzsKKworCWRvX2NvdW50czoKKwkJaWYgKCFiaXRtYXApIHsKKwkJCWdyb3VwX2ZyZWUrKzsKKwkJCWZyZWVfYmxvY2tzKys7CisJCX0KKwkJYmxvY2tzICsrOworCQlpZiAoKGJsb2NrcyA9PSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCkgfHwKKwkJICAgIChpID09IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQtMSkpIHsKKwkJCWZyZWVfYXJyYXlbZ3JvdXBdID0gZ3JvdXBfZnJlZTsKKwkJCWdyb3VwICsrOworCQkJYmxvY2tzID0gMDsKKwkJCWdyb3VwX2ZyZWUgPSAwOworCQkJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCQkJaWYgKChjdHgtPnByb2dyZXNzKShjdHgsIDUsIGdyb3VwLAorCQkJCQkJICAgIGZzLT5ncm91cF9kZXNjX2NvdW50KjIpKQorCQkJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKHBjdHguYmxrICE9IE5PX0JMSykKKwkJcHJpbnRfYml0bWFwX3Byb2JsZW0oY3R4LCBzYXZlX3Byb2JsZW0sICZwY3R4KTsKKwlpZiAoaGFkX3Byb2JsZW0pCisJCWZpeGl0ID0gZW5kX3Byb2JsZW1fbGF0Y2goY3R4LCBQUl9MQVRDSF9CQklUTUFQKTsKKwllbHNlCisJCWZpeGl0ID0gLTE7CisJY3R4LT5mbGFncyAmPSB+RTJGX0ZMQUdfUFJPR19TVVBQUkVTUzsKKworCWlmIChmaXhpdCA9PSAxKSB7CisJCWV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChmcy0+YmxvY2tfbWFwKTsKKwkJcmV0dmFsID0gZXh0MmZzX2NvcHlfYml0bWFwKGN0eC0+YmxvY2tfZm91bmRfbWFwLAorCQkJCQkJICAmZnMtPmJsb2NrX21hcCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfQ09QWV9CQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJcmV0dXJuOworCQl9CisJCWV4dDJmc19zZXRfYml0bWFwX3BhZGRpbmcoZnMtPmJsb2NrX21hcCk7CisJCWV4dDJmc19tYXJrX2JiX2RpcnR5KGZzKTsKKworCQkvKiBSZWRvIHRoZSBjb3VudHMgKi8KKwkJYmxvY2tzID0gMDsgZnJlZV9ibG9ja3MgPSAwOyBncm91cF9mcmVlID0gMDsgZ3JvdXAgPSAwOworCQltZW1zZXQoZnJlZV9hcnJheSwgMCwgZnMtPmdyb3VwX2Rlc2NfY291bnQgKiBzaXplb2YoaW50KSk7CisJCWdvdG8gcmVkb19jb3VudHM7CisJfSBlbHNlIGlmIChmaXhpdCA9PSAwKQorCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCWlmIChmcmVlX2FycmF5W2ldICE9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50KSB7CisJCQlwY3R4Lmdyb3VwID0gaTsKKwkJCXBjdHguYmxrID0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQ7CisJCQlwY3R4LmJsazIgPSBmcmVlX2FycmF5W2ldOworCisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl81X0ZSRUVfQkxPQ0tfQ09VTlRfR1JPVVAsCisJCQkJCSZwY3R4KSkgeworCQkJCWZzLT5ncm91cF9kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0KKwkJCQkJZnJlZV9hcnJheVtpXTsKKwkJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQl9IGVsc2UKKwkJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJfQorCX0KKwlpZiAoZnJlZV9ibG9ja3MgIT0gZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSB7CisJCXBjdHguZ3JvdXAgPSAwOworCQlwY3R4LmJsayA9IGZzLT5zdXBlci0+c19mcmVlX2Jsb2Nrc19jb3VudDsKKwkJcGN0eC5ibGsyID0gZnJlZV9ibG9ja3M7CisKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GUkVFX0JMT0NLX0NPVU5ULCAmcGN0eCkpIHsKKwkJCWZzLT5zdXBlci0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGZyZWVfYmxvY2tzOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9IGVsc2UKKwkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmZyZWVfYXJyYXkpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19pbm9kZV9iaXRtYXBzKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCAgICAgIGk7CisJdW5zaWduZWQgaW50ICAgIGZyZWVfaW5vZGVzID0gMDsKKwlpbnQgICAgICAgICAgICAgZ3JvdXBfZnJlZSA9IDA7CisJaW50ICAgICAgICAgICAgIGRpcnNfY291bnQgPSAwOworCWludCAgICAgICAgICAgICBncm91cCA9IDA7CisJdW5zaWduZWQgaW50ICAgIGlub2RlcyA9IDA7CisJaW50ICAgICAgICAgICAgICpmcmVlX2FycmF5OworCWludCAgICAgICAgICAgICAqZGlyX2FycmF5OworCWludCAgICAgICAgICAgICBhY3R1YWwsIGJpdG1hcDsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJaW50ICAgICAgICAgICAgIHByb2JsZW0sIHNhdmVfcHJvYmxlbSwgZml4aXQsIGhhZF9wcm9ibGVtOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwlmcmVlX2FycmF5ID0gKGludCAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkgICAgZnMtPmdyb3VwX2Rlc2NfY291bnQgKiBzaXplb2YoaW50KSwgImZyZWUgaW5vZGUgY291bnQgYXJyYXkiKTsKKworCWRpcl9hcnJheSA9IChpbnQgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJICAgZnMtPmdyb3VwX2Rlc2NfY291bnQgKiBzaXplb2YoaW50KSwgImRpcmVjdG9yeSBjb3VudCBhcnJheSIpOworCisJaWYgKCgxIDwgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfc3RhcnQoY3R4LT5pbm9kZV91c2VkX21hcCkpIHx8CisJICAgIChmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50ID4KKwkgICAgIGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX2VuZChjdHgtPmlub2RlX3VzZWRfbWFwKSkpIHsKKwkJcGN0eC5udW0gPSAzOworCQlwY3R4LmJsayA9IDE7CisJCXBjdHguYmxrMiA9IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQ7CisJCXBjdHguaW5vID0gZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfc3RhcnQoY3R4LT5pbm9kZV91c2VkX21hcCk7CisJCXBjdHguaW5vMiA9IGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX2VuZChjdHgtPmlub2RlX3VzZWRfbWFwKTsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0JNQVBfRU5EUE9JTlRTLCAmcGN0eCk7CisKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogZmF0YWwgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoKDEgPCBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9zdGFydChmcy0+aW5vZGVfbWFwKSkgfHwKKwkgICAgKGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQgPgorCSAgICAgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfZW5kKGZzLT5pbm9kZV9tYXApKSkgeworCQlwY3R4Lm51bSA9IDQ7CisJCXBjdHguYmxrID0gMTsKKwkJcGN0eC5ibGsyID0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudDsKKwkJcGN0eC5pbm8gPSBleHQyZnNfZ2V0X2lub2RlX2JpdG1hcF9zdGFydChmcy0+aW5vZGVfbWFwKTsKKwkJcGN0eC5pbm8yID0gZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfZW5kKGZzLT5pbm9kZV9tYXApOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfQk1BUF9FTkRQT0lOVFMsICZwY3R4KTsKKworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorCityZWRvX2NvdW50czoKKwloYWRfcHJvYmxlbSA9IDA7CisJc2F2ZV9wcm9ibGVtID0gMDsKKwlwY3R4LmlubyA9IHBjdHguaW5vMiA9IDA7CisJZm9yIChpID0gMTsgaSA8PSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OyBpKyspIHsKKwkJYWN0dWFsID0gZXh0MmZzX2Zhc3RfdGVzdF9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCwgaSk7CisJCWJpdG1hcCA9IGV4dDJmc19mYXN0X3Rlc3RfaW5vZGVfYml0bWFwKGZzLT5pbm9kZV9tYXAsIGkpOworCisJCWlmIChhY3R1YWwgPT0gYml0bWFwKQorCQkJZ290byBkb19jb3VudHM7CisKKwkJaWYgKCFhY3R1YWwgJiYgYml0bWFwKSB7CisJCQkvKgorCQkJICogSW5vZGUgd2Fzbid0IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwCisJCQkgKi8KKwkJCXByb2JsZW0gPSBQUl81X0lOT0RFX1VOVVNFRDsKKwkJfSBlbHNlIC8qIGlmIChhY3R1YWwgJiYgIWJpdG1hcCkgKi8geworCQkJLyoKKwkJCSAqIElub2RlIHVzZWQsIGJ1dCBub3QgaW4gYml0bWFwCisJCQkgKi8KKwkJCXByb2JsZW0gPSBQUl81X0lOT0RFX1VTRUQ7CisJCX0KKwkJaWYgKHBjdHguaW5vID09IDApIHsKKwkJCXBjdHguaW5vID0gcGN0eC5pbm8yID0gaTsKKwkJCXNhdmVfcHJvYmxlbSA9IHByb2JsZW07CisJCX0gZWxzZSB7CisJCQlpZiAoKHByb2JsZW0gPT0gc2F2ZV9wcm9ibGVtKSAmJgorCQkJICAgIChwY3R4LmlubzIgPT0gaS0xKSkKKwkJCQlwY3R4LmlubzIrKzsKKwkJCWVsc2UgeworCQkJCXByaW50X2JpdG1hcF9wcm9ibGVtKGN0eCwgc2F2ZV9wcm9ibGVtLCAmcGN0eCk7CisJCQkJcGN0eC5pbm8gPSBwY3R4LmlubzIgPSBpOworCQkJCXNhdmVfcHJvYmxlbSA9IHByb2JsZW07CisJCQl9CisJCX0KKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19QUk9HX1NVUFBSRVNTOworCQloYWRfcHJvYmxlbSsrOworCitkb19jb3VudHM6CisJCWlmICghYml0bWFwKSB7CisJCQlncm91cF9mcmVlKys7CisJCQlmcmVlX2lub2RlcysrOworCQl9IGVsc2UgeworCQkJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChjdHgtPmlub2RlX2Rpcl9tYXAsIGkpKQorCQkJCWRpcnNfY291bnQrKzsKKwkJfQorCQlpbm9kZXMrKzsKKwkJaWYgKChpbm9kZXMgPT0gZnMtPnN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXApIHx8CisJCSAgICAoaSA9PSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSkgeworCQkJZnJlZV9hcnJheVtncm91cF0gPSBncm91cF9mcmVlOworCQkJZGlyX2FycmF5W2dyb3VwXSA9IGRpcnNfY291bnQ7CisJCQlncm91cCArKzsKKwkJCWlub2RlcyA9IDA7CisJCQlncm91cF9mcmVlID0gMDsKKwkJCWRpcnNfY291bnQgPSAwOworCQkJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCQkJaWYgKChjdHgtPnByb2dyZXNzKShjdHgsIDUsCisJCQkJCSAgICBncm91cCArIGZzLT5ncm91cF9kZXNjX2NvdW50LAorCQkJCQkgICAgZnMtPmdyb3VwX2Rlc2NfY291bnQqMikpCisJCQkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAocGN0eC5pbm8pCisJCXByaW50X2JpdG1hcF9wcm9ibGVtKGN0eCwgc2F2ZV9wcm9ibGVtLCAmcGN0eCk7CisKKwlpZiAoaGFkX3Byb2JsZW0pCisJCWZpeGl0ID0gZW5kX3Byb2JsZW1fbGF0Y2goY3R4LCBQUl9MQVRDSF9JQklUTUFQKTsKKwllbHNlCisJCWZpeGl0ID0gLTE7CisJY3R4LT5mbGFncyAmPSB+RTJGX0ZMQUdfUFJPR19TVVBQUkVTUzsKKworCWlmIChmaXhpdCA9PSAxKSB7CisJCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwKTsKKwkJcmV0dmFsID0gZXh0MmZzX2NvcHlfYml0bWFwKGN0eC0+aW5vZGVfdXNlZF9tYXAsCisJCQkJCQkgICZmcy0+aW5vZGVfbWFwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9DT1BZX0lCSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm47CisJCX0KKwkJZXh0MmZzX3NldF9iaXRtYXBfcGFkZGluZyhmcy0+aW5vZGVfbWFwKTsKKwkJZXh0MmZzX21hcmtfaWJfZGlydHkoZnMpOworCisJCS8qIHJlZG8gY291bnRzICovCisJCWlub2RlcyA9IDA7IGZyZWVfaW5vZGVzID0gMDsgZ3JvdXBfZnJlZSA9IDA7CisJCWRpcnNfY291bnQgPSAwOyBncm91cCA9IDA7CisJCW1lbXNldChmcmVlX2FycmF5LCAwLCBmcy0+Z3JvdXBfZGVzY19jb3VudCAqIHNpemVvZihpbnQpKTsKKwkJbWVtc2V0KGRpcl9hcnJheSwgMCwgZnMtPmdyb3VwX2Rlc2NfY291bnQgKiBzaXplb2YoaW50KSk7CisJCWdvdG8gcmVkb19jb3VudHM7CisJfSBlbHNlIGlmIChmaXhpdCA9PSAwKQorCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCWlmIChmcmVlX2FycmF5W2ldICE9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50KSB7CisJCQlwY3R4Lmdyb3VwID0gaTsKKwkJCXBjdHguaW5vID0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQ7CisJCQlwY3R4LmlubzIgPSBmcmVlX2FycmF5W2ldOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GUkVFX0lOT0RFX0NPVU5UX0dST1VQLAorCQkJCQkmcGN0eCkpIHsKKwkJCQlmcy0+Z3JvdXBfZGVzY1tpXS5iZ19mcmVlX2lub2Rlc19jb3VudCA9CisJCQkJCWZyZWVfYXJyYXlbaV07CisJCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQkJfSBlbHNlCisJCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCX0KKwkJaWYgKGRpcl9hcnJheVtpXSAhPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ191c2VkX2RpcnNfY291bnQpIHsKKwkJCXBjdHguZ3JvdXAgPSBpOworCQkJcGN0eC5pbm8gPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ191c2VkX2RpcnNfY291bnQ7CisJCQlwY3R4LmlubzIgPSBkaXJfYXJyYXlbaV07CisKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzVfRlJFRV9ESVJfQ09VTlRfR1JPVVAsCisJCQkJCSZwY3R4KSkgeworCQkJCWZzLT5ncm91cF9kZXNjW2ldLmJnX3VzZWRfZGlyc19jb3VudCA9CisJCQkJCWRpcl9hcnJheVtpXTsKKwkJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQl9IGVsc2UKKwkJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwkJfQorCX0KKwlpZiAoZnJlZV9pbm9kZXMgIT0gZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50KSB7CisJCXBjdHguZ3JvdXAgPSAtMTsKKwkJcGN0eC5pbm8gPSBmcy0+c3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQ7CisJCXBjdHguaW5vMiA9IGZyZWVfaW5vZGVzOworCisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzVfRlJFRV9JTk9ERV9DT1VOVCwgJnBjdHgpKSB7CisJCQlmcy0+c3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQgPSBmcmVlX2lub2RlczsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJfSBlbHNlCisJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZmcmVlX2FycmF5KTsKKwlleHQyZnNfZnJlZV9tZW0oJmRpcl9hcnJheSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2lub2RlX2VuZChlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCWV4dDJfaW5vX3QgICAgICBlbmQsIHNhdmVfaW5vZGVzX2NvdW50LCBpOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJZW5kID0gRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcikgKiBmcy0+Z3JvdXBfZGVzY19jb3VudDsKKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfZnVkZ2VfaW5vZGVfYml0bWFwX2VuZChmcy0+aW5vZGVfbWFwLCBlbmQsCisJCQkJCQkgICAgICZzYXZlX2lub2Rlc19jb3VudCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDE7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GVURHRV9CSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogZmF0YWwgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoc2F2ZV9pbm9kZXNfY291bnQgPT0gZW5kKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBzYXZlX2lub2Rlc19jb3VudCArIDE7IGkgPD0gZW5kOyBpKyspIHsKKwkJaWYgKCFleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoZnMtPmlub2RlX21hcCwgaSkpIHsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzVfSU5PREVfQk1BUF9QQURESU5HLCAmcGN0eCkpIHsKKwkJCQlmb3IgKGkgPSBzYXZlX2lub2Rlc19jb3VudCArIDE7IGkgPD0gZW5kOyBpKyspCisJCQkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLAorCQkJCQkJCQkgaSk7CisJCQkJZXh0MmZzX21hcmtfaWJfZGlydHkoZnMpOworCQkJfSBlbHNlCisJCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXBjdHguZXJyY29kZSA9IGV4dDJmc19mdWRnZV9pbm9kZV9iaXRtYXBfZW5kKGZzLT5pbm9kZV9tYXAsCisJCQkJCQkgICAgIHNhdmVfaW5vZGVzX2NvdW50LCAwKTsKKwlpZiAocGN0eC5lcnJjb2RlKSB7CisJCXBjdHgubnVtID0gMjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl81X0ZVREdFX0JJVE1BUF9FUlJPUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBmYXRhbCAqLworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19ibG9ja19lbmQoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlibGtfdCAgIGVuZCwgc2F2ZV9ibG9ja3NfY291bnQsIGk7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwllbmQgPSBmcy0+YmxvY2tfbWFwLT5zdGFydCArCisJCShFWFQyX0JMT0NLU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAqIGZzLT5ncm91cF9kZXNjX2NvdW50KSAtIDE7CisJcGN0eC5lcnJjb2RlID0gZXh0MmZzX2Z1ZGdlX2Jsb2NrX2JpdG1hcF9lbmQoZnMtPmJsb2NrX21hcCwgZW5kLAorCQkJCQkJICAgICAmc2F2ZV9ibG9ja3NfY291bnQpOworCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJcGN0eC5udW0gPSAzOworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzVfRlVER0VfQklUTUFQX0VSUk9SLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7IC8qIGZhdGFsICovCisJCXJldHVybjsKKwl9CisJaWYgKHNhdmVfYmxvY2tzX2NvdW50ID09IGVuZCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gc2F2ZV9ibG9ja3NfY291bnQgKyAxOyBpIDw9IGVuZDsgaSsrKSB7CisJCWlmICghZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsIGkpKSB7CisJCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl81X0JMT0NLX0JNQVBfUEFERElORywgJnBjdHgpKSB7CisJCQkJZm9yIChpID0gc2F2ZV9ibG9ja3NfY291bnQgKyAxOyBpIDw9IGVuZDsgaSsrKQorCQkJCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwKKwkJCQkJCQkJIGkpOworCQkJCWV4dDJmc19tYXJrX2JiX2RpcnR5KGZzKTsKKwkJCX0gZWxzZQorCQkJCWV4dDJmc191bm1hcmtfdmFsaWQoZnMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwY3R4LmVycmNvZGUgPSBleHQyZnNfZnVkZ2VfYmxvY2tfYml0bWFwX2VuZChmcy0+YmxvY2tfbWFwLAorCQkJCQkJICAgICBzYXZlX2Jsb2Nrc19jb3VudCwgMCk7CisJaWYgKHBjdHguZXJyY29kZSkgeworCQlwY3R4Lm51bSA9IDQ7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9GVURHRV9CSVRNQVBfRVJST1IsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogZmF0YWwgKi8KKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgZTJmc2NrX3Bhc3M1KGUyZnNja190IGN0eCkKK3sKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCisJLyogUGFzcyA1ICovCisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpCisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfNV9QQVNTX0hFQURFUiwgJnBjdHgpOworCisJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCWlmICgoY3R4LT5wcm9ncmVzcykoY3R4LCA1LCAwLCBjdHgtPmZzLT5ncm91cF9kZXNjX2NvdW50KjIpKQorCQkJcmV0dXJuOworCisJZTJmc2NrX3JlYWRfYml0bWFwcyhjdHgpOworCisJY2hlY2tfYmxvY2tfYml0bWFwcyhjdHgpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCXJldHVybjsKKwljaGVja19pbm9kZV9iaXRtYXBzKGN0eCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJcmV0dXJuOworCWNoZWNrX2lub2RlX2VuZChjdHgpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCXJldHVybjsKKwljaGVja19ibG9ja19lbmQoY3R4KTsKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQlyZXR1cm47CisKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoY3R4LT5pbm9kZV91c2VkX21hcCk7CisJY3R4LT5pbm9kZV91c2VkX21hcCA9IDA7CisJZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGN0eC0+aW5vZGVfZGlyX21hcCk7CisJY3R4LT5pbm9kZV9kaXJfbWFwID0gMDsKKwlleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAoY3R4LT5ibG9ja19mb3VuZF9tYXApOworCWN0eC0+YmxvY2tfZm91bmRfbWFwID0gMDsKK30KKworLyoKKyAqIHByb2JsZW0uYyAtLS0gcmVwb3J0IGZpbGVzeXN0ZW0gcHJvYmxlbXMgdG8gdGhlIHVzZXIKKyAqLworCisjZGVmaW5lIFBSX1BSRUVOX09LICAgICAweDAwMDAwMSAvKiBEb24ndCBuZWVkIHRvIGRvIHByZWVuaGFsdCAqLworI2RlZmluZSBQUl9OT19PSyAgICAgICAgMHgwMDAwMDIgLyogSWYgdXNlciBhbnN3ZXJzIG5vLCBkb24ndCBtYWtlIGZzIGludmFsaWQgKi8KKyNkZWZpbmUgUFJfTk9fREVGQVVMVCAgIDB4MDAwMDA0IC8qIERlZmF1bHQgdG8gbm8gKi8KKyNkZWZpbmUgUFJfTVNHX09OTFkgICAgIDB4MDAwMDA4IC8qIFByaW50IG1lc3NhZ2Ugb25seSAqLworCisvKiBCaXQgcG9zaXRpb25zIDB4MDAwZmYwIGFyZSByZXNlcnZlZCBmb3IgdGhlIFBSX0xBVENIIGZsYWdzICovCisKKyNkZWZpbmUgUFJfRkFUQUwgICAgICAgIDB4MDAxMDAwIC8qIEZhdGFsIGVycm9yICovCisjZGVmaW5lIFBSX0FGVEVSX0NPREUgICAweDAwMjAwMCAvKiBBZnRlciBhc2tpbmcgdGhlIGZpcnN0IHF1ZXN0aW9uLCAqLworCQkJCSAvKiBhc2sgYW5vdGhlciAqLworI2RlZmluZSBQUl9QUkVFTl9OT01TRyAgMHgwMDQwMDAgLyogRG9uJ3QgcHJpbnQgYSBtZXNzYWdlIGlmIHdlJ3JlIHByZWVuaW5nICovCisjZGVmaW5lIFBSX05PQ09MTEFURSAgICAweDAwODAwMCAvKiBEb24ndCBjb2xsYXRlIGFuc3dlcnMgZm9yIHRoaXMgbGF0Y2ggKi8KKyNkZWZpbmUgUFJfTk9fTk9NU0cgICAgIDB4MDEwMDAwIC8qIERvbid0IHByaW50IGEgbWVzc2FnZSBpZiBlMmZzY2sgLW4gKi8KKyNkZWZpbmUgUFJfUFJFRU5fTk8gICAgIDB4MDIwMDAwIC8qIFVzZSBObyBhcyBhbiBhbnN3ZXIgaWYgcHJlZW5pbmcgKi8KKyNkZWZpbmUgUFJfUFJFRU5fTk9IRFIgIDB4MDQwMDAwIC8qIERvbid0IHByaW50IHRoZSBwcmVlbiBoZWFkZXIgKi8KKworCisjZGVmaW5lIFBST01QVF9OT05FICAgICAwCisjZGVmaW5lIFBST01QVF9GSVggICAgICAxCisjZGVmaW5lIFBST01QVF9DTEVBUiAgICAyCisjZGVmaW5lIFBST01QVF9SRUxPQ0FURSAzCisjZGVmaW5lIFBST01QVF9BTExPQ0FURSA0CisjZGVmaW5lIFBST01QVF9FWFBBTkQgICA1CisjZGVmaW5lIFBST01QVF9DT05ORUNUICA2CisjZGVmaW5lIFBST01QVF9DUkVBVEUgICA3CisjZGVmaW5lIFBST01QVF9TQUxWQUdFICA4CisjZGVmaW5lIFBST01QVF9UUlVOQ0FURSA5CisjZGVmaW5lIFBST01QVF9DTEVBUl9JTk9ERSAxMAorI2RlZmluZSBQUk9NUFRfQUJPUlQgICAgMTEKKyNkZWZpbmUgUFJPTVBUX1NQTElUICAgIDEyCisjZGVmaW5lIFBST01QVF9DT05USU5VRSAxMworI2RlZmluZSBQUk9NUFRfQ0xPTkUgICAgMTQKKyNkZWZpbmUgUFJPTVBUX0RFTEVURSAgIDE1CisjZGVmaW5lIFBST01QVF9TVVBQUkVTUyAxNgorI2RlZmluZSBQUk9NUFRfVU5MSU5LICAgMTcKKyNkZWZpbmUgUFJPTVBUX0NMRUFSX0hUUkVFIDE4CisjZGVmaW5lIFBST01QVF9SRUNSRUFURSAxOQorI2RlZmluZSBQUk9NUFRfTlVMTCAgICAgMjAKKworc3RydWN0IGUyZnNja19wcm9ibGVtIHsKKwlwcm9ibGVtX3QgICAgICAgZTJwX2NvZGU7CisJY29uc3QgY2hhciAqICAgIGUycF9kZXNjcmlwdGlvbjsKKwljaGFyICAgICAgICAgICAgcHJvbXB0OworCWludCAgICAgICAgICAgICBmbGFnczsKKwlwcm9ibGVtX3QgICAgICAgc2Vjb25kX2NvZGU7Cit9OworCitzdHJ1Y3QgbGF0Y2hfZGVzY3IgeworCWludCAgICAgICAgICAgICBsYXRjaF9jb2RlOworCXByb2JsZW1fdCAgICAgICBxdWVzdGlvbjsKKwlwcm9ibGVtX3QgICAgICAgZW5kX21lc3NhZ2U7CisJaW50ICAgICAgICAgICAgIGZsYWdzOworfTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHJvbXB0cyB3aGljaCBhcmUgdXNlZCB0byBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50CisgKiB0byBmaXggYSBwcm9ibGVtLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJvbXB0W10gPSB7CisJTl8oIihubyBwcm9tcHQpIiksICAgICAgLyogMCAqLworCU5fKCJGaXgiKSwgICAgICAgICAgICAgIC8qIDEgKi8KKwlOXygiQ2xlYXIiKSwgICAgICAgICAgICAvKiAyICovCisJTl8oIlJlbG9jYXRlIiksICAgICAgICAgLyogMyAqLworCU5fKCJBbGxvY2F0ZSIpLCAgICAgICAgIC8qIDQgKi8KKwlOXygiRXhwYW5kIiksICAgICAgICAgICAvKiA1ICovCisJTl8oIkNvbm5lY3QgdG8gL2xvc3QrZm91bmQiKSwgLyogNiAqLworCU5fKCJDcmVhdGUiKSwgICAgICAgICAgIC8qIDcgKi8KKwlOXygiU2FsdmFnZSIpLCAgICAgICAgICAvKiA4ICovCisJTl8oIlRydW5jYXRlIiksICAgICAgICAgLyogOSAqLworCU5fKCJDbGVhciBpbm9kZSIpLCAgICAgIC8qIDEwICovCisJTl8oIkFib3J0IiksICAgICAgICAgICAgLyogMTEgKi8KKwlOXygiU3BsaXQiKSwgICAgICAgICAgICAvKiAxMiAqLworCU5fKCJDb250aW51ZSIpLCAgICAgICAgIC8qIDEzICovCisJTl8oIkNsb25lIG11bHRpcGx5LWNsYWltZWQgYmxvY2tzIiksIC8qIDE0ICovCisJTl8oIkRlbGV0ZSBmaWxlIiksICAgICAgLyogMTUgKi8KKwlOXygiU3VwcHJlc3MgbWVzc2FnZXMiKSwvKiAxNiAqLworCU5fKCJVbmxpbmsiKSwgICAgICAgICAgIC8qIDE3ICovCisJTl8oIkNsZWFyIEhUcmVlIGluZGV4IiksLyogMTggKi8KKwlOXygiUmVjcmVhdGUiKSwgICAgICAgICAvKiAxOSAqLworCSIiLCAgICAgICAgICAgICAgICAgICAgIC8qIDIwICovCit9OworCisvKgorICogVGhlc2UgbWVzc2FnZXMgYXJlIHByaW50ZWQgd2hlbiB3ZSBhcmUgcHJlZW4gbW9kZSBhbmQgd2Ugd2lsbCBiZQorICogYXV0b21hdGljYWxseSBmaXhpbmcgdGhlIHByb2JsZW0uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcmVlbl9tc2dbXSA9IHsKKwlOXygiKE5PTkUpIiksICAgICAgICAgICAvKiAwICovCisJTl8oIkZJWEVEIiksICAgICAgICAgICAgLyogMSAqLworCU5fKCJDTEVBUkVEIiksICAgICAgICAgIC8qIDIgKi8KKwlOXygiUkVMT0NBVEVEIiksICAgICAgICAvKiAzICovCisJTl8oIkFMTE9DQVRFRCIpLCAgICAgICAgLyogNCAqLworCU5fKCJFWFBBTkRFRCIpLCAgICAgICAgIC8qIDUgKi8KKwlOXygiUkVDT05ORUNURUQiKSwgICAgICAvKiA2ICovCisJTl8oIkNSRUFURUQiKSwgICAgICAgICAgLyogNyAqLworCU5fKCJTQUxWQUdFRCIpLCAgICAgICAgIC8qIDggKi8KKwlOXygiVFJVTkNBVEVEIiksICAgICAgICAvKiA5ICovCisJTl8oIklOT0RFIENMRUFSRUQiKSwgICAgLyogMTAgKi8KKwlOXygiQUJPUlRFRCIpLCAgICAgICAgICAvKiAxMSAqLworCU5fKCJTUExJVCIpLCAgICAgICAgICAgIC8qIDEyICovCisJTl8oIkNPTlRJTlVJTkciKSwgICAgICAgLyogMTMgKi8KKwlOXygiTVVMVElQTFktQ0xBSU1FRCBCTE9DS1MgQ0xPTkVEIiksIC8qIDE0ICovCisJTl8oIkZJTEUgREVMRVRFRCIpLCAgICAgLyogMTUgKi8KKwlOXygiU1VQUFJFU1NFRCIpLCAgICAgICAvKiAxNiAqLworCU5fKCJVTkxJTktFRCIpLCAgICAgICAgIC8qIDE3ICovCisJTl8oIkhUUkVFIElOREVYIENMRUFSRUQiKSwvKiAxOCAqLworCU5fKCJXSUxMIFJFQ1JFQVRFIiksICAgIC8qIDE5ICovCisJIiIsICAgICAgICAgICAgICAgICAgICAgLyogMjAgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZTJmc2NrX3Byb2JsZW0gcHJvYmxlbV90YWJsZVtdID0geworCisJLyogUHJlLVBhc3MgMSBlcnJvcnMgKi8KKworCS8qIEJsb2NrIGJpdG1hcCBub3QgaW4gZ3JvdXAgKi8KKwl7IFBSXzBfQkJfTk9UX0dST1VQLCBOXygiQGIgQEIgZm9yIEBnICVnIGlzIG5vdCBpbiBAZy4gIChAYiAlYilcbiIpLAorCSAgUFJPTVBUX1JFTE9DQVRFLCBQUl9MQVRDSF9SRUxPQyB9LAorCisJLyogSW5vZGUgYml0bWFwIG5vdCBpbiBncm91cCAqLworCXsgUFJfMF9JQl9OT1RfR1JPVVAsIE5fKCJAaSBAQiBmb3IgQGcgJWcgaXMgbm90IGluIEBnLiAgKEBiICViKVxuIiksCisJICBQUk9NUFRfUkVMT0NBVEUsIFBSX0xBVENIX1JFTE9DIH0sCisKKwkvKiBJbm9kZSB0YWJsZSBub3QgaW4gZ3JvdXAgKi8KKwl7IFBSXzBfSVRBQkxFX05PVF9HUk9VUCwKKwkgIE5fKCJAaSB0YWJsZSBmb3IgQGcgJWcgaXMgbm90IGluIEBnLiAgKEBiICViKVxuIgorCSAgIldBUk5JTkc6IFNFVkVSRSBEQVRBIExPU1MgUE9TU0lCTEUuXG4iKSwKKwkgIFBST01QVF9SRUxPQ0FURSwgUFJfTEFUQ0hfUkVMT0MgfSwKKworCS8qIFN1cGVyYmxvY2sgY29ycnVwdCAqLworCXsgUFJfMF9TQl9DT1JSVVBULAorCSAgTl8oIlxuVGhlIEBTIGNvdWxkIG5vdCBiZSByZWFkIG9yIGRvZXMgbm90IGRlc2NyaWJlIGEgY29ycmVjdCBleHQyXG4iCisJICAiQGYuICBJZiB0aGUgQHYgaXMgdmFsaWQgYW5kIGl0IHJlYWxseSBjb250YWlucyBhbiBleHQyXG4iCisJICAiQGYgKGFuZCBub3Qgc3dhcCBvciB1ZnMgb3Igc29tZXRoaW5nIGVsc2UpLCB0aGVuIHRoZSBAU1xuIgorCSAgImlzIGNvcnJ1cHQsIGFuZCB5b3UgbWlnaHQgdHJ5IHJ1bm5pbmcgZTJmc2NrIHdpdGggYW4gYWx0ZXJuYXRlIEBTOlxuIgorCSAgIiAgICBlMmZzY2sgLWIgJVMgPEB2PlxuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRmlsZXN5c3RlbSBzaXplIGlzIHdyb25nICovCisJeyBQUl8wX0ZTX1NJWkVfV1JPTkcsCisJICBOXygiVGhlIEBmIHNpemUgKGFjY29yZGluZyB0byB0aGUgQFMpIGlzICViIEBic1xuIgorCSAgIlRoZSBwaHlzaWNhbCBzaXplIG9mIHRoZSBAdiBpcyAlYyBAYnNcbiIKKwkgICJFaXRoZXIgdGhlIEBTIG9yIHRoZSBwYXJ0aXRpb24gdGFibGUgaXMgbGlrZWx5IHRvIGJlIGNvcnJ1cHQhXG4iKSwKKwkgIFBST01QVF9BQk9SVCwgMCB9LAorCisJLyogRnJhZ21lbnRzIG5vdCBzdXBwb3J0ZWQgKi8KKwl7IFBSXzBfTk9fRlJBR01FTlRTLAorCSAgTl8oIkBTIEBiX3NpemUgPSAlYiwgZnJhZ3NpemUgPSAlYy5cbiIKKwkgICJUaGlzIHZlcnNpb24gb2YgZTJmc2NrIGRvZXMgbm90IHN1cHBvcnQgZnJhZ21lbnQgc2l6ZXMgZGlmZmVyZW50XG4iCisJICAiZnJvbSB0aGUgQGIgc2l6ZS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkgIC8qIEJhZCBibG9ja3NfcGVyX2dyb3VwICovCisJeyBQUl8wX0JMT0NLU19QRVJfR1JPVVAsCisJICBOXygiQFMgQGJzX3Blcl9ncm91cCA9ICViLCBzaG91bGQgaGF2ZSBiZWVuICVjXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9BRlRFUl9DT0RFLCBQUl8wX1NCX0NPUlJVUFQgfSwKKworCS8qIEJhZCBmaXJzdF9kYXRhX2Jsb2NrICovCisJeyBQUl8wX0ZJUlNUX0RBVEFfQkxPQ0ssCisJICBOXygiQFMgZmlyc3RfZGF0YV9AYiA9ICViLCBzaG91bGQgaGF2ZSBiZWVuICVjXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9BRlRFUl9DT0RFLCBQUl8wX1NCX0NPUlJVUFQgfSwKKworCS8qIEFkZGluZyBVVUlEIHRvIGZpbGVzeXN0ZW0gKi8KKwl7IFBSXzBfQUREX1VVSUQsCisJICBOXygiQGYgZGlkIG5vdCBoYXZlIGEgVVVJRDsgZ2VuZXJhdGluZyBvbmUuXG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIFJlbG9jYXRlIGhpbnQgKi8KKwl7IFBSXzBfUkVMT0NBVEVfSElOVCwKKwkgIE5fKCJOb3RlOiBpZiBzZXZlcmFsIGlub2RlIG9yIGJsb2NrIGJpdG1hcCBibG9ja3Mgb3IgcGFydFxuIgorCSAgIm9mIHRoZSBpbm9kZSB0YWJsZSByZXF1aXJlIHJlbG9jYXRpb24sIHlvdSBtYXkgd2lzaCB0byB0cnlcbiIKKwkgICJydW5uaW5nIGUyZnNjayB3aXRoIHRoZSAnLWIgJVMnIG9wdGlvbiBmaXJzdC4gIFRoZSBwcm9ibGVtXG4iCisJICAibWF5IGxpZSBvbmx5IHdpdGggdGhlIHByaW1hcnkgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMsIGFuZFxuIgorCSAgInRoZSBiYWNrdXAgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMgbWF5IGJlIE9LLlxuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB8IFBSX05PQ09MTEFURSB9LAorCisJLyogTWlzY2VsbGFuZW91cyBzdXBlcmJsb2NrIGNvcnJ1cHRpb24gKi8KKwl7IFBSXzBfTUlTQ19DT1JSVVBUX1NVUEVSLAorCSAgTl8oIkNvcnJ1cHRpb24gZm91bmQgaW4gQFMuICAoJXMgPSAlTikuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9BRlRFUl9DT0RFLCBQUl8wX1NCX0NPUlJVUFQgfSwKKworCS8qIEVycm9yIGRldGVybWluZyBwaHlzaWNhbCBkZXZpY2Ugc2l6ZSBvZiBmaWxlc3lzdGVtICovCisJeyBQUl8wX0dFVFNJWkVfRVJST1IsCisJICBOXygiRXJyb3IgZGV0ZXJtaW5pbmcgc2l6ZSBvZiB0aGUgcGh5c2ljYWwgQHY6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogSW5vZGUgY291bnQgaW4gc3VwZXJibG9jayBpcyBpbmNvcnJlY3QgKi8KKwl7IFBSXzBfSU5PREVfQ09VTlRfV1JPTkcsCisJICBOXygiQGkgY291bnQgaW4gQFMgaXMgJWksIEBzICVqLlxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwl7IFBSXzBfSFVSRF9DTEVBUl9GSUxFVFlQRSwKKwkgIE5fKCJUaGUgSHVyZCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmaWxldHlwZSBmZWF0dXJlLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIEpvdXJuYWwgaW5vZGUgaXMgaW52YWxpZCAqLworCXsgUFJfMF9KT1VSTkFMX0JBRF9JTk9ERSwKKwkgIE5fKCJAUyBoYXMgYW4gQG4gZXh0MyBAaiAoQGkgJWkpLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBUaGUgZXh0ZXJuYWwgam91cm5hbCBoYXMgKHVuc3VwcG9ydGVkKSBtdWx0aXBsZSBmaWxlc3lzdGVtcyAqLworCXsgUFJfMF9KT1VSTkFMX1VOU1VQUF9NVUxUSUZTLAorCSAgTl8oIkV4dGVybmFsIEBqIGhhcyBtdWx0aXBsZSBAZiB1c2VycyAodW5zdXBwb3J0ZWQpLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIENhbid0IGZpbmQgZXh0ZXJuYWwgam91cm5hbCAqLworCXsgUFJfMF9DQU5UX0ZJTkRfSk9VUk5BTCwKKwkgIE5fKCJDYW4ndCBmaW5kIGV4dGVybmFsIEBqXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXh0ZXJuYWwgam91cm5hbCBoYXMgYmFkIHN1cGVyYmxvY2sgKi8KKwl7IFBSXzBfRVhUX0pPVVJOQUxfQkFEX1NVUEVSLAorCSAgTl8oIkV4dGVybmFsIEBqIGhhcyBiYWQgQFNcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBTdXBlcmJsb2NrIGhhcyBhIGJhZCBqb3VybmFsIFVVSUQgKi8KKwl7IFBSXzBfSk9VUk5BTF9CQURfVVVJRCwKKwkgIE5fKCJFeHRlcm5hbCBAaiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgQGZcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBKb3VybmFsIGhhcyBhbiB1bmtub3duIHN1cGVyYmxvY2sgdHlwZSAqLworCXsgUFJfMF9KT1VSTkFMX1VOU1VQUF9TVVBFUiwKKwkgIE5fKCJFeHQzIEBqIEBTIGlzIHVua25vd24gdHlwZSAlTiAodW5zdXBwb3J0ZWQpLlxuIgorCSAgICAgIkl0IGlzIGxpa2VseSB0aGF0IHlvdXIgY29weSBvZiBlMmZzY2sgaXMgb2xkIGFuZC9vciBkb2Vzbid0ICIKKwkgICAgICJzdXBwb3J0IHRoaXMgQGogZm9ybWF0LlxuIgorCSAgICAgIkl0IGlzIGFsc28gcG9zc2libGUgdGhlIEBqIEBTIGlzIGNvcnJ1cHQuXG4iKSwKKwkgIFBST01QVF9BQk9SVCwgUFJfTk9fT0sgfCBQUl9BRlRFUl9DT0RFLCBQUl8wX0pPVVJOQUxfQkFEX1NVUEVSIH0sCisKKwkvKiBKb3VybmFsIHN1cGVyYmxvY2sgaXMgY29ycnVwdCAqLworCXsgUFJfMF9KT1VSTkFMX0JBRF9TVVBFUiwKKwkgIE5fKCJFeHQzIEBqIEBTIGlzIGNvcnJ1cHQuXG4iKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBTdXBlcmJsb2NrIGZsYWcgc2hvdWxkIGJlIGNsZWFyZWQgKi8KKwl7IFBSXzBfSk9VUk5BTF9IQVNfSk9VUk5BTCwKKwkgIE5fKCJAUyBkb2Vzbid0IGhhdmUgaGFzX0BqIGZsYWcsIGJ1dCBoYXMgZXh0MyBAaiAlcy5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogU3VwZXJibG9jayBmbGFnIGlzIGluY29ycmVjdCAqLworCXsgUFJfMF9KT1VSTkFMX1JFQ09WRVJfU0VULAorCSAgTl8oIkBTIGhhcyBleHQzIG5lZWRzX3JlY292ZXJ5IGZsYWcgc2V0LCBidXQgbm8gQGouXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEpvdXJuYWwgaGFzIGRhdGEsIGJ1dCByZWNvdmVyeSBmbGFnIGlzIGNsZWFyICovCisJeyBQUl8wX0pPVVJOQUxfUkVDT1ZFUllfQ0xFQVIsCisJICBOXygiZXh0MyByZWNvdmVyeSBmbGFnIGlzIGNsZWFyLCBidXQgQGogaGFzIGRhdGEuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBBc2sgaWYgd2Ugc2hvdWxkIGNsZWFyIHRoZSBqb3VybmFsICovCisJeyBQUl8wX0pPVVJOQUxfUkVTRVRfSk9VUk5BTCwKKwkgIE5fKCJDbGVhciBAaiIpLAorCSAgUFJPTVBUX05VTEwsIFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBBc2sgaWYgd2Ugc2hvdWxkIHJ1biB0aGUgam91cm5hbCBhbnl3YXkgKi8KKwl7IFBSXzBfSk9VUk5BTF9SVU4sCisJICBOXygiUnVuIEBqIGFueXdheSIpLAorCSAgUFJPTVBUX05VTEwsIDAgfSwKKworCS8qIFJ1biB0aGUgam91cm5hbCBieSBkZWZhdWx0ICovCisJeyBQUl8wX0pPVVJOQUxfUlVOX0RFRkFVTFQsCisJICBOXygiUmVjb3ZlcnkgZmxhZyBub3Qgc2V0IGluIGJhY2t1cCBAUywgc28gcnVubmluZyBAaiBhbnl3YXkuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBDbGVhcmluZyBvcnBoYW4gaW5vZGUgKi8KKwl7IFBSXzBfT1JQSEFOX0NMRUFSX0lOT0RFLAorCSAgTl8oIiVzIEBvIEBpICVpICh1aWQ9JUl1LCBnaWQ9JUlnLCBtb2RlPSVJbSwgc2l6ZT0lSXMpXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBJbGxlZ2FsIGJsb2NrIGZvdW5kIGluIG9ycGhhbmVkIGlub2RlICovCisJeyBQUl8wX09SUEhBTl9JTExFR0FMX0JMT0NLX05VTSwKKwkgICBOXygiQEkgQGIgIyVCICglYikgZm91bmQgaW4gQG8gQGkgJWkuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBBbHJlYWR5IGNsZWFyZWQgYmxvY2sgZm91bmQgaW4gb3JwaGFuZWQgaW5vZGUgKi8KKwl7IFBSXzBfT1JQSEFOX0FMUkVBRFlfQ0xFQVJFRF9CTE9DSywKKwkgICBOXygiQWxyZWFkeSBjbGVhcmVkIEBiICMlQiAoJWIpIGZvdW5kIGluIEBvIEBpICVpLlxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogSWxsZWdhbCBvcnBoYW4gaW5vZGUgaW4gc3VwZXJibG9jayAqLworCXsgUFJfMF9PUlBIQU5fSUxMRUdBTF9IRUFEX0lOT0RFLAorCSAgTl8oIkBJIEBvIEBpICVpIGluIEBTLlxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogSWxsZWdhbCBpbm9kZSBpbiBvcnBoYW5lZCBpbm9kZSBsaXN0ICovCisJeyBQUl8wX09SUEhBTl9JTExFR0FMX0lOT0RFLAorCSAgTl8oIkBJIEBpICVpIGluIEBvIEBpIGxpc3QuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBGaWxlc3lzdGVtIHJldmlzaW9uIGlzIDAsIGJ1dCBmZWF0dXJlIGZsYWdzIGFyZSBzZXQgKi8KKwl7IFBSXzBfRlNfUkVWX0xFVkVMLAorCSAgTl8oIkBmIGhhcyBmZWF0dXJlIGZsYWcocykgc2V0LCBidXQgaXMgYSByZXZpc2lvbiAwIEBmLiAgIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB8IFBSX05PX09LIH0sCisKKwkvKiBKb3VybmFsIHN1cGVyYmxvY2sgaGFzIGFuIHVua25vd24gcmVhZC1vbmx5IGZlYXR1cmUgZmxhZyBzZXQgKi8KKwl7IFBSXzBfSk9VUk5BTF9VTlNVUFBfUk9DT01QQVQsCisJICBOXygiRXh0MyBAaiBAUyBoYXMgYW4gdW5rbm93biByZWFkLW9ubHkgZmVhdHVyZSBmbGFnIHNldC5cbiIpLAorCSAgUFJPTVBUX0FCT1JULCAwIH0sCisKKwkvKiBKb3VybmFsIHN1cGVyYmxvY2sgaGFzIGFuIHVua25vd24gaW5jb21wYXRpYmxlIGZlYXR1cmUgZmxhZyBzZXQgKi8KKwl7IFBSXzBfSk9VUk5BTF9VTlNVUFBfSU5DT01QQVQsCisJICBOXygiRXh0MyBAaiBAUyBoYXMgYW4gdW5rbm93biBpbmNvbXBhdGlibGUgZmVhdHVyZSBmbGFnIHNldC5cbiIpLAorCSAgUFJPTVBUX0FCT1JULCAwIH0sCisKKwkvKiBKb3VybmFsIGhhcyB1bnN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciAqLworCXsgUFJfMF9KT1VSTkFMX1VOU1VQUF9WRVJTSU9OLAorCSAgTl8oIkBqIHZlcnNpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzIGUyZnNjay5cbiIpLAorCSAgUFJPTVBUX0FCT1JULCAwIH0sCisKKwkvKiBNb3Zpbmcgam91cm5hbCB0byBoaWRkZW4gZmlsZSAqLworCXsgUFJfMF9NT1ZFX0pPVVJOQUwsCisJICBOXygiTW92aW5nIEBqIGZyb20gLyVzIHRvIGhpZGRlbiBAaS5cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgbW92aW5nIGpvdXJuYWwgdG8gaGlkZGVuIGZpbGUgKi8KKwl7IFBSXzBfRVJSX01PVkVfSk9VUk5BTCwKKwkgIE5fKCJFcnJvciBtb3ZpbmcgQGo6ICVtXG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIENsZWFyaW5nIFYyIGpvdXJuYWwgc3VwZXJibG9jayAqLworCXsgUFJfMF9DTEVBUl9WMl9KT1VSTkFMLAorCSAgTl8oIkZvdW5kIEBuIFYyIEBqIEBTIGZpZWxkcyAoZnJvbSBWMSBAaikuXG4iCisJICAgICAiQ2xlYXJpbmcgZmllbGRzIGJleW9uZCB0aGUgVjEgQGogQFMuLi5cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQmFja3VwIGpvdXJuYWwgaW5vZGUgYmxvY2tzICovCisJeyBQUl8wX0JBQ0tVUF9KTkwsCisJICBOXygiQmFja2luZyB1cCBAaiBAaSBAYiBpbmZvcm1hdGlvbi5cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUmVzZXJ2ZWQgYmxvY2tzIHcvbyByZXNpemVfaW5vZGUgKi8KKwl7IFBSXzBfTk9OWkVST19SRVNFUlZFRF9HRFRfQkxPQ0tTLAorCSAgTl8oIkBmIGRvZXMgbm90IGhhdmUgcmVzaXplX0BpIGVuYWJsZWQsIGJ1dCBzX3Jlc2VydmVkX2dkdF9AYnNcbiIKKwkgICAgICJpcyAlTjsgQHMgemVyby4gICIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogUmVzaXplX2lub2RlIG5vdCBlbmFibGVkLCBidXQgcmVzaXplIGlub2RlIGlzIG5vbi16ZXJvICovCisJeyBQUl8wX0NMRUFSX1JFU0laRV9JTk9ERSwKKwkgIE5fKCJSZXNpemVfQGkgbm90IGVuYWJsZWQsIGJ1dCB0aGUgcmVzaXplIEBpIGlzIG5vbi16ZXJvLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIFJlc2l6ZSBpbm9kZSBpbnZhbGlkICovCisJeyBQUl8wX1JFU0laRV9JTk9ERV9JTlZBTElELAorCSAgTl8oIlJlc2l6ZSBAaSBub3QgdmFsaWQuICAiKSwKKwkgIFBST01QVF9SRUNSRUFURSwgMCB9LAorCisJLyogUGFzcyAxIGVycm9ycyAqLworCisJLyogUGFzcyAxOiBDaGVja2luZyBpbm9kZXMsIGJsb2NrcywgYW5kIHNpemVzICovCisJeyBQUl8xX1BBU1NfSEVBREVSLAorCSAgTl8oIlBhc3MgMTogQ2hlY2tpbmcgQGlzLCBAYnMsIGFuZCBzaXplc1xuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUm9vdCBkaXJlY3RvcnkgaXMgbm90IGFuIGlub2RlICovCisJeyBQUl8xX1JPT1RfTk9fRElSLCBOXygiQHIgaXMgbm90IGEgQGQuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogUm9vdCBkaXJlY3RvcnkgaGFzIGR0aW1lIHNldCAqLworCXsgUFJfMV9ST09UX0RUSU1FLAorCSAgTl8oIkByIGhhcyBkdGltZSBzZXQgKHByb2JhYmx5IGR1ZSB0byBvbGQgbWtlMmZzKS4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFJlc2VydmVkIGlub2RlIGhhcyBiYWQgbW9kZSAqLworCXsgUFJfMV9SRVNFUlZFRF9CQURfTU9ERSwKKwkgIE5fKCJSZXNlcnZlZCBAaSAlaSAoJVEpIGhhcyBAbiBtb2RlLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBEZWxldGVkIGlub2RlIGhhcyB6ZXJvIGR0aW1lICovCisJeyBQUl8xX1pFUk9fRFRJTUUsCisJICBOXygiQEQgQGkgJWkgaGFzIHplcm8gZHRpbWUuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBJbm9kZSBpbiB1c2UsIGJ1dCBkdGltZSBzZXQgKi8KKwl7IFBSXzFfU0VUX0RUSU1FLAorCSAgTl8oIkBpICVpIGlzIGluIHVzZSwgYnV0IGhhcyBkdGltZSBzZXQuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBaZXJvLWxlbmd0aCBkaXJlY3RvcnkgKi8KKwl7IFBSXzFfWkVST19MRU5HVEhfRElSLAorCSAgTl8oIkBpICVpIGlzIGEgQHogQGQuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEJsb2NrIGJpdG1hcCBjb25mbGljdHMgd2l0aCBzb21lIG90aGVyIGZzIGJsb2NrICovCisJeyBQUl8xX0JCX0NPTkZMSUNULAorCSAgTl8oIkBnICVnJ3MgQGIgQEIgYXQgJWIgQEMuXG4iKSwKKwkgIFBST01QVF9SRUxPQ0FURSwgMCB9LAorCisJLyogSW5vZGUgYml0bWFwIGNvbmZsaWN0cyB3aXRoIHNvbWUgb3RoZXIgZnMgYmxvY2sgKi8KKwl7IFBSXzFfSUJfQ09ORkxJQ1QsCisJICBOXygiQGcgJWcncyBAaSBAQiBhdCAlYiBAQy5cbiIpLAorCSAgUFJPTVBUX1JFTE9DQVRFLCAwIH0sCisKKwkvKiBJbm9kZSB0YWJsZSBjb25mbGljdHMgd2l0aCBzb21lIG90aGVyIGZzIGJsb2NrICovCisJeyBQUl8xX0lUQUJMRV9DT05GTElDVCwKKwkgIE5fKCJAZyAlZydzIEBpIHRhYmxlIGF0ICViIEBDLlxuIiksCisJICBQUk9NUFRfUkVMT0NBVEUsIDAgfSwKKworCS8qIEJsb2NrIGJpdG1hcCBpcyBvbiBhIGJhZCBibG9jayAqLworCXsgUFJfMV9CQl9CQURfQkxPQ0ssCisJICBOXygiQGcgJWcncyBAYiBAQiAoJWIpIGlzIGJhZC4gICIpLAorCSAgUFJPTVBUX1JFTE9DQVRFLCAwIH0sCisKKwkvKiBJbm9kZSBiaXRtYXAgaXMgb24gYSBiYWQgYmxvY2sgKi8KKwl7IFBSXzFfSUJfQkFEX0JMT0NLLAorCSAgTl8oIkBnICVnJ3MgQGkgQEIgKCViKSBpcyBiYWQuICAiKSwKKwkgIFBST01QVF9SRUxPQ0FURSwgMCB9LAorCisJLyogSW5vZGUgaGFzIGluY29ycmVjdCBpX3NpemUgKi8KKwl7IFBSXzFfQkFEX0lfU0laRSwKKwkgIE5fKCJAaSAlaSwgaV9zaXplIGlzICVJcywgQHMgJU4uICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBJbm9kZSBoYXMgaW5jb3JyZWN0IGlfYmxvY2tzICovCisJeyBQUl8xX0JBRF9JX0JMT0NLUywKKwkgIE5fKCJAaSAlaSwgaV9AYnMgaXMgJUliLCBAcyAlTi4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIElsbGVnYWwgYmxvY2tudW1iZXIgaW4gaW5vZGUgKi8KKwl7IFBSXzFfSUxMRUdBTF9CTE9DS19OVU0sCisJICBOXygiQEkgQGIgIyVCICglYikgaW4gQGkgJWkuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfTEFUQ0hfQkxPQ0sgfSwKKworCS8qIEJsb2NrIG51bWJlciBvdmVybGFwcyBmcyBtZXRhZGF0YSAqLworCXsgUFJfMV9CTE9DS19PVkVSTEFQU19NRVRBREFUQSwKKwkgIE5fKCJAYiAjJUIgKCViKSBvdmVybGFwcyBAZiBtZXRhZGF0YSBpbiBAaSAlaS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9MQVRDSF9CTE9DSyB9LAorCisJLyogSW5vZGUgaGFzIGlsbGVnYWwgYmxvY2tzIChsYXRjaCBxdWVzdGlvbikgKi8KKwl7IFBSXzFfSU5PREVfQkxPQ0tfTEFUQ0gsCisJICBOXygiQGkgJWkgaGFzIGlsbGVnYWwgQGIocykuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogVG9vIG1hbnkgYmFkIGJsb2NrcyBpbiBpbm9kZSAqLworCXsgUFJfMV9UT09fTUFOWV9CQURfQkxPQ0tTLAorCSAgTl8oIlRvbyBtYW55IGlsbGVnYWwgQGJzIGluIEBpICVpLlxuIiksCisJICBQUk9NUFRfQ0xFQVJfSU5PREUsIFBSX05PX09LIH0sCisKKwkvKiBJbGxlZ2FsIGJsb2NrIG51bWJlciBpbiBiYWQgYmxvY2sgaW5vZGUgKi8KKwl7IFBSXzFfQkJfSUxMRUdBTF9CTE9DS19OVU0sCisJICBOXygiQEkgQGIgIyVCICglYikgaW4gYmFkIEBiIEBpLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX0JCTE9DSyB9LAorCisJLyogQmFkIGJsb2NrIGlub2RlIGhhcyBpbGxlZ2FsIGJsb2NrcyAobGF0Y2ggcXVlc3Rpb24pICovCisJeyBQUl8xX0lOT0RFX0JCTE9DS19MQVRDSCwKKwkgIE5fKCJCYWQgQGIgQGkgaGFzIGlsbGVnYWwgQGIocykuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRHVwbGljYXRlIG9yIGJhZCBibG9ja3MgaW4gdXNlISAqLworCXsgUFJfMV9EVVBfQkxPQ0tTX1BSRUVOU1RPUCwKKwkgIE5fKCJEdXBsaWNhdGUgb3IgYmFkIEBiIGluIHVzZSFcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEJhZCBibG9jayB1c2VkIGFzIGJhZCBibG9jayBpbmRpcmVjdCBibG9jayAqLworCXsgUFJfMV9CQklOT0RFX0JBRF9NRVRBQkxPQ0ssCisJICBOXygiQmFkIEBiICViIHVzZWQgYXMgYmFkIEBiIEBpIGluZGlyZWN0IEBiLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX0JCTE9DSyB9LAorCisJLyogSW5jb25zaXN0ZW5jeSBjYW4ndCBiZSBmaXhlZCBwcm9tcHQgKi8KKwl7IFBSXzFfQkJJTk9ERV9CQURfTUVUQUJMT0NLX1BST01QVCwKKwkgIE5fKCJcblRoZSBiYWQgQGIgQGkgaGFzIHByb2JhYmx5IGJlZW4gY29ycnVwdGVkLiAgWW91IHByb2JhYmx5XG4iCisJICAgICAic2hvdWxkIHN0b3Agbm93IGFuZCBydW4gIiJlMmZzY2sgLWMiIiB0byBzY2FuIGZvciBiYWQgYmxvY2tzXG4iCisJICAgICAiaW4gdGhlIEBmLlxuIiksCisJICBQUk9NUFRfQ09OVElOVUUsIFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBCYWQgcHJpbWFyeSBibG9jayAqLworCXsgUFJfMV9CQURfUFJJTUFSWV9CTE9DSywKKwkgIE5fKCJcbklmIHRoZSBAYiBpcyByZWFsbHkgYmFkLCB0aGUgQGYgY2Fubm90IGJlIGZpeGVkLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfQUZURVJfQ09ERSwgUFJfMV9CQURfUFJJTUFSWV9CTE9DS19QUk9NUFQgfSwKKworCS8qIEJhZCBwcmltYXJ5IGJsb2NrIHByb21wdCAqLworCXsgUFJfMV9CQURfUFJJTUFSWV9CTE9DS19QUk9NUFQsCisJICBOXygiWW91IGNhbiByZW1vdmUgdGhpcyBAYiBmcm9tIHRoZSBiYWQgQGIgbGlzdCBhbmQgaG9wZVxuIgorCSAgICAgInRoYXQgdGhlIEBiIGlzIHJlYWxseSBPSy4gIEJ1dCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcy5cblxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBCYWQgcHJpbWFyeSBzdXBlcmJsb2NrICovCisJeyBQUl8xX0JBRF9QUklNQVJZX1NVUEVSQkxPQ0ssCisJICBOXygiVGhlIHByaW1hcnkgQFMgKCViKSBpcyBvbiB0aGUgYmFkIEBiIGxpc3QuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9BRlRFUl9DT0RFLCBQUl8xX0JBRF9QUklNQVJZX0JMT0NLIH0sCisKKwkvKiBCYWQgcHJpbWFyeSBibG9jayBncm91cCBkZXNjcmlwdG9ycyAqLworCXsgUFJfMV9CQURfUFJJTUFSWV9HUk9VUF9ERVNDUklQVE9SLAorCSAgTl8oIkJsb2NrICViIGluIHRoZSBwcmltYXJ5IEBnIGRlc2NyaXB0b3JzICIKKwkgICJpcyBvbiB0aGUgYmFkIEBiIGxpc3RcbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0FGVEVSX0NPREUsIFBSXzFfQkFEX1BSSU1BUllfQkxPQ0sgfSwKKworCS8qIEJhZCBzdXBlcmJsb2NrIGluIGdyb3VwICovCisJeyBQUl8xX0JBRF9TVVBFUkJMT0NLLAorCSAgTl8oIldhcm5pbmc6IEdyb3VwICVnJ3MgQFMgKCViKSBpcyBiYWQuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBCYWQgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMgaW4gZ3JvdXAgKi8KKwl7IFBSXzFfQkFEX0dST1VQX0RFU0NSSVBUT1JTLAorCSAgTl8oIldhcm5pbmc6IEdyb3VwICVnJ3MgY29weSBvZiB0aGUgQGcgZGVzY3JpcHRvcnMgaGFzIGEgYmFkICIKKwkgICJAYiAoJWIpLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogQmxvY2sgY2xhaW1lZCBmb3Igbm8gcmVhc29uICovCisJeyBQUl8xX1BST0dFUlJfQ0xBSU1FRF9CTE9DSywKKwkgIE5fKCJQcm9ncmFtbWluZyBlcnJvcj8gIEBiICMlYiBjbGFpbWVkIGZvciBubyByZWFzb24gaW4gIgorCSAgInByb2Nlc3NfYmFkX0BiLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgYmxvY2tzIGZvciByZWxvY2F0aW5nIG1ldGFkYXRhICovCisJeyBQUl8xX1JFTE9DX0JMT0NLX0FMTE9DQVRFLAorCSAgTl8oIkBBICVOIGNvbnRpZ3VvdXMgQGIocykgaW4gQGIgQGcgJWcgZm9yICVzOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgYmxvY2sgYnVmZmVyIGR1cmluZyByZWxvY2F0aW9uIHByb2Nlc3MgKi8KKwl7IFBSXzFfUkVMT0NfTUVNT1JZX0FMTE9DQVRFLAorCSAgTl8oIkBBIEBiIGJ1ZmZlciBmb3IgcmVsb2NhdGluZyAlc1xuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFJlbG9jYXRpbmcgbWV0YWRhdGEgZ3JvdXAgaW5mb3JtYXRpb24gZnJvbSBYIHRvIFkgKi8KKwl7IFBSXzFfUkVMT0NfRlJPTV9UTywKKwkgIE5fKCJSZWxvY2F0aW5nIEBnICVnJ3MgJXMgZnJvbSAlYiB0byAlYy4uLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFJlbG9jYXRpbmcgbWV0YXRkYXRhIGdyb3VwIGluZm9ybWF0aW9uIHRvIFggKi8KKwl7IFBSXzFfUkVMT0NfVE8sCisJICBOXygiUmVsb2NhdGluZyBAZyAlZydzICVzIHRvICVjLi4uXG4iKSwgLyogeGdldHRleHQ6bm8tYy1mb3JtYXQgKi8KKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogQmxvY2sgcmVhZCBlcnJvciBkdXJpbmcgcmVsb2NhdGlvbiBwcm9jZXNzICovCisJeyBQUl8xX1JFTE9DX1JFQURfRVJSLAorCSAgTl8oIldhcm5pbmc6IGNvdWxkIG5vdCByZWFkIEBiICViIG9mICVzOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEJsb2NrIHdyaXRlIGVycm9yIGR1cmluZyByZWxvY2F0aW9uIHByb2Nlc3MgKi8KKwl7IFBSXzFfUkVMT0NfV1JJVEVfRVJSLAorCSAgTl8oIldhcm5pbmc6IGNvdWxkIG5vdCB3cml0ZSBAYiAlYiBmb3IgJXM6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBpbm9kZSBiaXRtYXAgKi8KKwl7IFBSXzFfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiwKKwkgIE5fKCJAQSBAaSBAQiAoJU4pOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgYmxvY2sgYml0bWFwICovCisJeyBQUl8xX0FMTE9DQVRFX0JCSVRNQVBfRVJST1IsCisJICBOXygiQEEgQGIgQEIgKCVOKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIGljb3VudCBzdHJ1Y3R1cmUgKi8KKwl7IFBSXzFfQUxMT0NBVEVfSUNPVU5ULAorCSAgTl8oIkBBIGljb3VudCBsaW5rIGluZm9ybWF0aW9uOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgZGJjb3VudCAqLworCXsgUFJfMV9BTExPQ0FURV9EQkNPVU5ULAorCSAgTl8oIkBBIEBkIEBiIGFycmF5OiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIHdoaWxlIHNjYW5uaW5nIGlub2RlcyAqLworCXsgUFJfMV9JU0NBTl9FUlJPUiwKKwkgIE5fKCJFcnJvciB3aGlsZSBzY2FubmluZyBAaXMgKCVpKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciB3aGlsZSBpdGVyYXRpbmcgb3ZlciBibG9ja3MgKi8KKwl7IFBSXzFfQkxPQ0tfSVRFUkFURSwKKwkgIE5fKCJFcnJvciB3aGlsZSBpdGVyYXRpbmcgb3ZlciBAYnMgaW4gQGkgJWk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3Igd2hpbGUgc3RvcmluZyBpbm9kZSBjb3VudCBpbmZvcm1hdGlvbiAqLworCXsgUFJfMV9JQ09VTlRfU1RPUkUsCisJICBOXygiRXJyb3Igc3RvcmluZyBAaSBjb3VudCBpbmZvcm1hdGlvbiAoQGk9JWksIGNvdW50PSVOKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciB3aGlsZSBzdG9yaW5nIGRpcmVjdG9yeSBibG9jayBpbmZvcm1hdGlvbiAqLworCXsgUFJfMV9BRERfREJMT0NLLAorCSAgTl8oIkVycm9yIHN0b3JpbmcgQGQgQGIgaW5mb3JtYXRpb24gIgorCSAgIihAaT0laSwgQGI9JWIsIG51bT0lTik6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3Igd2hpbGUgcmVhZGluZyBpbm9kZSAoZm9yIGNsZWFyaW5nKSAqLworCXsgUFJfMV9SRUFEX0lOT0RFLAorCSAgTl8oIkVycm9yIHJlYWRpbmcgQGkgJWk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogU3VwcHJlc3MgbWVzc2FnZXMgcHJvbXB0ICovCisJeyBQUl8xX1NVUFBSRVNTX01FU1NBR0VTLCAiIiwgUFJPTVBUX1NVUFBSRVNTLCBQUl9OT19PSyB9LAorCisJLyogSW1hZ2ljIGZsYWcgc2V0IG9uIGFuIGlub2RlIHdoZW4gZmlsZXN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQgKi8KKwl7IFBSXzFfU0VUX0lNQUdJQywKKwkgIE5fKCJAaSAlaSBoYXMgaW1hZ2ljIGZsYWcgc2V0LiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIEltbXV0YWJsZSBmbGFnIHNldCBvbiBhIGRldmljZSBvciBzb2NrZXQgaW5vZGUgKi8KKwl7IFBSXzFfU0VUX0lNTVVUQUJMRSwKKwkgIE5fKCJTcGVjaWFsIChAdi9zb2NrZXQvZmlmby9zeW1saW5rKSBmaWxlIChAaSAlaSkgaGFzIGltbXV0YWJsZVxuIgorCSAgICAgIm9yIGFwcGVuZC1vbmx5IGZsYWcgc2V0LiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk8gfCBQUl9OT19PSyB9LAorCisJLyogQ29tcHJlc3Npb24gZmxhZyBzZXQgb24gYW4gaW5vZGUgd2hlbiBmaWxlc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworCXsgUFJfMV9DT01QUl9TRVQsCisJICBOXygiQGkgJWkgaGFzIEBjaW9uIGZsYWcgc2V0IG9uIEBmIHdpdGhvdXQgQGNpb24gc3VwcG9ydC4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBOb24temVybyBzaXplIGZvciBkZXZpY2UsIGZpZm8gb3Igc29ja2V0IGlub2RlICovCisJeyBQUl8xX1NFVF9OT05aU0laRSwKKwkgIE5fKCJTcGVjaWFsIChAdi9zb2NrZXQvZmlmbykgQGkgJWkgaGFzIG5vbi16ZXJvIHNpemUuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBGaWxlc3lzdGVtIHJldmlzaW9uIGlzIDAsIGJ1dCBmZWF0dXJlIGZsYWdzIGFyZSBzZXQgKi8KKwl7IFBSXzFfRlNfUkVWX0xFVkVMLAorCSAgTl8oIkBmIGhhcyBmZWF0dXJlIGZsYWcocykgc2V0LCBidXQgaXMgYSByZXZpc2lvbiAwIEBmLiAgIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB8IFBSX05PX09LIH0sCisKKwkvKiBKb3VybmFsIGlub2RlIGlzIG5vdCBpbiB1c2UsIGJ1dCBjb250YWlucyBkYXRhICovCisJeyBQUl8xX0pPVVJOQUxfSU5PREVfTk9UX0NMRUFSLAorCSAgTl8oIkBqIEBpIGlzIG5vdCBpbiB1c2UsIGJ1dCBjb250YWlucyBkYXRhLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBKb3VybmFsIGhhcyBiYWQgbW9kZSAqLworCXsgUFJfMV9KT1VSTkFMX0JBRF9NT0RFLAorCSAgTl8oIkBqIGlzIG5vdCByZWd1bGFyIGZpbGUuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBEZWFsIHdpdGggaW5vZGVzIHRoYXQgd2VyZSBwYXJ0IG9mIG9ycGhhbiBsaW5rZWQgbGlzdCAqLworCXsgUFJfMV9MT1dfRFRJTUUsCisJICBOXygiQGkgJWkgd2FzIHBhcnQgb2YgdGhlIEBvIEBpIGxpc3QuICAiKSwKKwkgIFBST01QVF9GSVgsIFBSX0xBVENIX0xPV19EVElNRSwgMCB9LAorCisJLyogRGVhbCB3aXRoIGlub2RlcyB0aGF0IHdlcmUgcGFydCBvZiBjb3JydXB0ZWQgb3JwaGFuIGxpbmtlZAorCSAgIGxpc3QgKGxhdGNoIHF1ZXN0aW9uKSAqLworCXsgUFJfMV9PUlBIQU5fTElTVF9SRUZVR0VFUywKKwkgIE5fKCJAaXMgdGhhdCB3ZXJlIHBhcnQgb2YgYSBjb3JydXB0ZWQgb3JwaGFuIGxpbmtlZCBsaXN0IGZvdW5kLiAgIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIHJlZmNvdW50IHN0cnVjdHVyZSAqLworCXsgUFJfMV9BTExPQ0FURV9SRUZDT1VOVCwKKwkgIE5fKCJAQSByZWZjb3VudCBzdHJ1Y3R1cmUgKCVOKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBFcnJvciByZWFkaW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jayAqLworCXsgUFJfMV9SRUFEX0VBX0JMT0NLLAorCSAgTl8oIkVycm9yIHJlYWRpbmcgQGEgQGIgJWIgZm9yIEBpICVpLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIEludmFsaWQgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrICovCisJeyBQUl8xX0JBRF9FQV9CTE9DSywKKwkgIE5fKCJAaSAlaSBoYXMgYSBiYWQgQGEgQGIgJWIuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRXJyb3IgcmVhZGluZyBFeHRlbmRlZCBBdHRyaWJ1dGUgYmxvY2sgd2hpbGUgZml4aW5nIHJlZmNvdW50ICovCisJeyBQUl8xX0VYVEFUVFJfUkVBRF9BQk9SVCwKKwkgIE5fKCJFcnJvciByZWFkaW5nIEBhIEBiICViICglbSkuICAiKSwKKwkgIFBST01QVF9BQk9SVCwgMCB9LAorCisJLyogRXh0ZW5kZWQgYXR0cmlidXRlIHJlZmVyZW5jZSBjb3VudCBpbmNvcnJlY3QgKi8KKwl7IFBSXzFfRVhUQVRUUl9SRUZDT1VOVCwKKwkgIE5fKCJAYSBAYiAlYiBoYXMgcmVmZXJlbmNlIGNvdW50ICVCLCBAcyAlTi4gICIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogRXJyb3Igd3JpdGluZyBFeHRlbmRlZCBBdHRyaWJ1dGUgYmxvY2sgd2hpbGUgZml4aW5nIHJlZmNvdW50ICovCisJeyBQUl8xX0VYVEFUVFJfV1JJVEUsCisJICBOXygiRXJyb3Igd3JpdGluZyBAYSBAYiAlYiAoJW0pLiAgIiksCisJICBQUk9NUFRfQUJPUlQsIDAgfSwKKworCS8qIE11bHRpcGxlIEVBIGJsb2NrcyBub3Qgc3VwcG9ydGVkICovCisJeyBQUl8xX0VBX01VTFRJX0JMT0NLLAorCSAgTl8oIkBhIEBiICViIGhhcyBoX0BicyA+IDEuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIEVBIHJlZ2lvbiBhbGxvY2F0aW9uIHN0cnVjdHVyZSAqLworCXsgUFJfMV9FQV9BTExPQ19SRUdJT04sCisJICBOXygiQEEgQGEgQGIgJWIuICAiKSwKKwkgIFBST01QVF9BQk9SVCwgMH0sCisKKwkvKiBFcnJvciBFQSBhbGxvY2F0aW9uIGNvbGxpc2lvbiAqLworCXsgUFJfMV9FQV9BTExPQ19DT0xMSVNJT04sCisJICBOXygiQGEgQGIgJWIgaXMgY29ycnVwdCAoYWxsb2NhdGlvbiBjb2xsaXNpb24pLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDB9LAorCisJLyogQmFkIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lICovCisJeyBQUl8xX0VBX0JBRF9OQU1FLAorCSAgTl8oIkBhIEBiICViIGlzIGNvcnJ1cHQgKEBuIG5hbWUpLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDB9LAorCisJLyogQmFkIGV4dGVuZGVkIGF0dHJpYnV0ZSB2YWx1ZSAqLworCXsgUFJfMV9FQV9CQURfVkFMVUUsCisJICBOXygiQGEgQGIgJWIgaXMgY29ycnVwdCAoQG4gdmFsdWUpLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDB9LAorCisJLyogSW5vZGUgdG9vIGJpZyAobGF0Y2ggcXVlc3Rpb24pICovCisJeyBQUl8xX0lOT0RFX1RPT0JJRywKKwkgIE5fKCJAaSAlaSBpcyB0b28gYmlnLiAgIiksIFBST01QVF9UUlVOQ0FURSwgMCB9LAorCisJLyogRGlyZWN0b3J5IHRvbyBiaWcgKi8KKwl7IFBSXzFfVE9PQklHX0RJUiwKKwkgIE5fKCJAYiAjJUIgKCViKSBjYXVzZXMgQGQgdG8gYmUgdG9vIGJpZy4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9MQVRDSF9UT09CSUcgfSwKKworCS8qIFJlZ3VsYXIgZmlsZSB0b28gYmlnICovCisJeyBQUl8xX1RPT0JJR19SRUcsCisJICBOXygiQGIgIyVCICglYikgY2F1c2VzIGZpbGUgdG8gYmUgdG9vIGJpZy4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9MQVRDSF9UT09CSUcgfSwKKworCS8qIFN5bWxpbmsgdG9vIGJpZyAqLworCXsgUFJfMV9UT09CSUdfU1lNTElOSywKKwkgIE5fKCJAYiAjJUIgKCViKSBjYXVzZXMgc3ltbGluayB0byBiZSB0b28gYmlnLiAgIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX0xBVENIX1RPT0JJRyB9LAorCisJLyogSU5ERVhfRkwgZmxhZyBzZXQgb24gYSBub24tSFRSRUUgZmlsZXN5c3RlbSAqLworCXsgUFJfMV9IVFJFRV9TRVQsCisJICBOXygiQGkgJWkgaGFzIElOREVYX0ZMIGZsYWcgc2V0IG9uIEBmIHdpdGhvdXQgaHRyZWUgc3VwcG9ydC5cbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSU5ERVhfRkwgZmxhZyBzZXQgb24gYSBub24tZGlyZWN0b3J5ICovCisJeyBQUl8xX0hUUkVFX05PRElSLAorCSAgTl8oIkBpICVpIGhhcyBJTkRFWF9GTCBmbGFnIHNldCBidXQgaXMgbm90IGEgQGQuXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEludmFsaWQgcm9vdCBub2RlIGluIEhUUkVFIGRpcmVjdG9yeSAqLworCXsgUFJfMV9IVFJFRV9CQURST09ULAorCSAgTl8oIkBoICVpIGhhcyBhbiBAbiByb290IG5vZGUuXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFVuc3VwcG9ydGVkIGhhc2ggdmVyc2lvbiBpbiBIVFJFRSBkaXJlY3RvcnkgKi8KKwl7IFBSXzFfSFRSRUVfSEFTSFYsCisJICBOXygiQGggJWkgaGFzIGFuIHVuc3VwcG9ydGVkIGhhc2ggdmVyc2lvbiAoJU4pXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEluY29tcGF0aWJsZSBmbGFnIGluIEhUUkVFIHJvb3Qgbm9kZSAqLworCXsgUFJfMV9IVFJFRV9JTkNPTVBBVCwKKwkgIE5fKCJAaCAlaSB1c2VzIGFuIGluY29tcGF0aWJsZSBodHJlZSByb290IG5vZGUgZmxhZy5cbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSFRSRUUgdG9vIGRlZXAgKi8KKwl7IFBSXzFfSFRSRUVfREVQVEgsCisJICBOXygiQGggJWkgaGFzIGEgdHJlZSBkZXB0aCAoJU4pIHdoaWNoIGlzIHRvbyBiaWdcbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogQmFkIGJsb2NrIGhhcyBpbmRpcmVjdCBibG9jayB0aGF0IGNvbmZsaWN0cyB3aXRoIGZpbGVzeXN0ZW0gYmxvY2sgKi8KKwl7IFBSXzFfQkJfRlNfQkxPQ0ssCisJICBOXygiQmFkIEBiIEBpIGhhcyBhbiBpbmRpcmVjdCBAYiAoJWIpIHRoYXQgY29uZmxpY3RzIHdpdGhcbiIKKwkgICAgICJAZiBtZXRhZGF0YS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9MQVRDSF9CQkxPQ0sgfSwKKworCS8qIFJlc2l6ZSBpbm9kZSBmYWlsZWQgKi8KKwl7IFBSXzFfUkVTSVpFX0lOT0RFX0NSRUFURSwKKwkgIE5fKCJSZXNpemUgQGkgKHJlKWNyZWF0aW9uIGZhaWxlZDogJW0uIiksCisJICBQUk9NUFRfQUJPUlQsIDAgfSwKKworCS8qIGludmFsaWQgaW5vZGUtPmlfZXh0cmFfaXNpemUgKi8KKwl7IFBSXzFfRVhUUkFfSVNJWkUsCisJICBOXygiQGkgJWkgaGFzIGEgZXh0cmEgc2l6ZSAoJUlTKSB3aGljaCBpcyBAblxuIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB9LAorCisJLyogaW52YWxpZCBlYSBlbnRyeS0+ZV9uYW1lX2xlbiAqLworCXsgUFJfMV9BVFRSX05BTUVfTEVOLAorCSAgTl8oIkBhIGluIEBpICVpIGhhcyBhIG5hbWVsZW4gKCVOKSB3aGljaCBpcyBAblxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBpbnZhbGlkIGVhIGVudHJ5LT5lX3ZhbHVlX3NpemUgKi8KKwl7IFBSXzFfQVRUUl9WQUxVRV9TSVpFLAorCSAgTl8oIkBhIGluIEBpICVpIGhhcyBhIHZhbHVlIHNpemUgKCVOKSB3aGljaCBpcyBAblxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBpbnZhbGlkIGVhIGVudHJ5LT5lX3ZhbHVlX29mZnMgKi8KKwl7IFBSXzFfQVRUUl9WQUxVRV9PRkZTRVQsCisJICBOXygiQGEgaW4gQGkgJWkgaGFzIGEgdmFsdWUgb2Zmc2V0ICglTikgd2hpY2ggaXMgQG5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogaW52YWxpZCBlYSBlbnRyeS0+ZV92YWx1ZV9ibG9jayAqLworCXsgUFJfMV9BVFRSX1ZBTFVFX0JMT0NLLAorCSAgTl8oIkBhIGluIEBpICVpIGhhcyBhIHZhbHVlIEBiICglTikgd2hpY2ggaXMgQG4gKG11c3QgYmUgMClcbiIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogaW52YWxpZCBlYSBlbnRyeS0+ZV9oYXNoICovCisJeyBQUl8xX0FUVFJfSEFTSCwKKwkgIE5fKCJAYSBpbiBAaSAlaSBoYXMgYSBoYXNoICglTikgd2hpY2ggaXMgQG4gKG11c3QgYmUgMClcbiIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PSyB9LAorCisJLyogUGFzcyAxYiBlcnJvcnMgKi8KKworCS8qIFBhc3MgMUI6IFJlc2NhbiBmb3IgZHVwbGljYXRlL2JhZCBibG9ja3MgKi8KKwl7IFBSXzFCX1BBU1NfSEVBREVSLAorCSAgTl8oIlxuUnVubmluZyBhZGRpdGlvbmFsIHBhc3NlcyB0byByZXNvbHZlIEBicyBjbGFpbWVkIGJ5IG1vcmUgdGhhbiBvbmUgQGkuLi5cbiIKKwkgICJQYXNzIDFCOiBSZXNjYW5uaW5nIGZvciBAbSBAYnNcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIER1cGxpY2F0ZS9iYWQgYmxvY2socykgaGVhZGVyICovCisJeyBQUl8xQl9EVVBfQkxPQ0tfSEVBREVSLAorCSAgTl8oIkBtIEBiKHMpIGluIEBpICVpOiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIER1cGxpY2F0ZS9iYWQgYmxvY2socykgaW4gaW5vZGUgKi8KKwl7IFBSXzFCX0RVUF9CTE9DSywKKwkgICIgJWIiLAorCSAgUFJPTVBUX05PTkUsIFBSX0xBVENIX0RCTE9DSyB8IFBSX1BSRUVOX05PSERSIH0sCisKKwkvKiBEdXBsaWNhdGUvYmFkIGJsb2NrKHMpIGVuZCAqLworCXsgUFJfMUJfRFVQX0JMT0NLX0VORCwKKwkgICJcbiIsCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fTk9IRFIgfSwKKworCS8qIEVycm9yIHdoaWxlIHNjYW5uaW5nIGlub2RlcyAqLworCXsgUFJfMUJfSVNDQU5fRVJST1IsCisJICBOXygiRXJyb3Igd2hpbGUgc2Nhbm5pbmcgaW5vZGVzICglaSk6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgYWxsb2NhdGluZyBpbm9kZSBiaXRtYXAgKi8KKwl7IFBSXzFCX0FMTE9DQVRFX0lCSVRNQVBfRVJST1IsCisJICBOXygiQEEgQGkgQEIgKEBpX2R1cF9tYXApOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGJsb2NrcyAqLworCXsgUFJfMUJfQkxPQ0tfSVRFUkFURSwKKwkgIE5fKCJFcnJvciB3aGlsZSBpdGVyYXRpbmcgb3ZlciBAYnMgaW4gQGkgJWkgKCVzKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIGFkanVzdGluZyBFQSByZWZjb3VudCAqLworCXsgUFJfMUJfQURKX0VBX1JFRkNPVU5ULAorCSAgTl8oIkVycm9yIGFkanVzdGluZyByZWZjb3VudCBmb3IgQGEgQGIgJWIgKEBpICVpKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCisJLyogUGFzcyAxQzogU2NhbiBkaXJlY3RvcmllcyBmb3IgaW5vZGVzIHdpdGggbXVsdGlwbHktY2xhaW1lZCBibG9ja3MuICovCisJeyBQUl8xQ19QQVNTX0hFQURFUiwKKwkgIE5fKCJQYXNzIDFDOiBTY2FubmluZyBkaXJlY3RvcmllcyBmb3IgQGlzIHdpdGggQG0gQGJzLlxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisKKwkvKiBQYXNzIDFEOiBSZWNvbmNpbGluZyBtdWx0aXBseS1jbGFpbWVkIGJsb2NrcyAqLworCXsgUFJfMURfUEFTU19IRUFERVIsCisJICBOXygiUGFzcyAxRDogUmVjb25jaWxpbmcgQG0gQGJzXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBGaWxlIGhhcyBkdXBsaWNhdGUgYmxvY2tzICovCisJeyBQUl8xRF9EVVBfRklMRSwKKwkgIE5fKCJGaWxlICVRIChAaSAjJWksIG1vZCB0aW1lICVJTSlcbiIKKwkgICIgIGhhcyAlQiBAbSBAYihzKSwgc2hhcmVkIHdpdGggJU4gZmlsZShzKTpcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIExpc3Qgb2YgZmlsZXMgc2hhcmluZyBkdXBsaWNhdGUgYmxvY2tzICovCisJeyBQUl8xRF9EVVBfRklMRV9MSVNULAorCSAgTl8oIlx0JVEgKEBpICMlaSwgbW9kIHRpbWUgJUlNKVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRmlsZSBzaGFyaW5nIGJsb2NrcyB3aXRoIGZpbGVzeXN0ZW0gbWV0YWRhdGEgICovCisJeyBQUl8xRF9TSEFSRV9NRVRBREFUQSwKKwkgIE5fKCJcdDxAZiBtZXRhZGF0YT5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIFJlcG9ydCBvZiBob3cgbWFueSBkdXBsaWNhdGUvYmFkIGlub2RlcyAqLworCXsgUFJfMURfTlVNX0RVUF9JTk9ERVMsCisJICBOXygiKFRoZXJlIGFyZSAlTiBAaXMgY29udGFpbmluZyBAbSBAYnMuKVxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBEdXBsaWNhdGVkIGJsb2NrcyBhbHJlYWR5IHJlYXNzaWduZWQgb3IgY2xvbmVkLiAqLworCXsgUFJfMURfRFVQX0JMT0NLU19ERUFMVCwKKwkgIE5fKCJAbSBAYnMgYWxyZWFkeSByZWFzc2lnbmVkIG9yIGNsb25lZC5cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ2xvbmUgZHVwbGljYXRlL2JhZCBibG9ja3M/ICovCisJeyBQUl8xRF9DTE9ORV9RVUVTVElPTiwKKwkgICIiLCBQUk9NUFRfQ0xPTkUsIFBSX05PX09LIH0sCisKKwkvKiBEZWxldGUgZmlsZT8gKi8KKwl7IFBSXzFEX0RFTEVURV9RVUVTVElPTiwKKwkgICIiLCBQUk9NUFRfREVMRVRFLCAwIH0sCisKKwkvKiBDb3VsZG4ndCBjbG9uZSBmaWxlIChlcnJvcikgKi8KKwl7IFBSXzFEX0NMT05FX0VSUk9SLAorCSAgTl8oIkNvdWxkbid0IGNsb25lIGZpbGU6ICVtXG4iKSwgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIFBhc3MgMiBlcnJvcnMgKi8KKworCS8qIFBhc3MgMjogQ2hlY2tpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSAqLworCXsgUFJfMl9QQVNTX0hFQURFUiwKKwkgIE5fKCJQYXNzIDI6IENoZWNraW5nIEBkIHN0cnVjdHVyZVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQmFkIGlub2RlIG51bWJlciBmb3IgJy4nICovCisJeyBQUl8yX0JBRF9JTk9ERV9ET1QsCisJICBOXygiQG4gQGkgbnVtYmVyIGZvciAnLicgaW4gQGQgQGkgJWkuXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIERpcmVjdG9yeSBlbnRyeSBoYXMgYmFkIGlub2RlIG51bWJlciAqLworCXsgUFJfMl9CQURfSU5PLAorCSAgTl8oIkBFIGhhcyBAbiBAaSAjOiAlRGkuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRGlyZWN0b3J5IGVudHJ5IGhhcyBkZWxldGVkIG9yIHVudXNlZCBpbm9kZSAqLworCXsgUFJfMl9VTlVTRURfSU5PREUsCisJICBOXygiQEUgaGFzIEBEL3VudXNlZCBAaSAlRGkuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgUFJfUFJFRU5fT0sgfSwKKworCS8qIERpcmVjdHJ5IGVudHJ5IGlzIGxpbmsgdG8gJy4nICovCisJeyBQUl8yX0xJTktfRE9ULAorCSAgTl8oIkBFIEBMIHRvICcuJyAgIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIERpcmVjdG9yeSBlbnRyeSBwb2ludHMgdG8gaW5vZGUgbm93IGxvY2F0ZWQgaW4gYSBiYWQgYmxvY2sgKi8KKwl7IFBSXzJfQkJfSU5PREUsCisJICBOXygiQEUgcG9pbnRzIHRvIEBpICglRGkpIGxvY2F0ZWQgaW4gYSBiYWQgQGIuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRGlyZWN0b3J5IGVudHJ5IGNvbnRhaW5zIGEgbGluayB0byBhIGRpcmVjdG9yeSAqLworCXsgUFJfMl9MSU5LX0RJUiwKKwkgIE5fKCJARSBATCB0byBAZCAlUCAoJURpKS5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEaXJlY3RvcnkgZW50cnkgY29udGFpbnMgYSBsaW5rIHRvIHRoZSByb290IGRpcmVjdHJ5ICovCisJeyBQUl8yX0xJTktfUk9PVCwKKwkgIE5fKCJARSBATCB0byB0aGUgQHIuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRGlyZWN0b3J5IGVudHJ5IGhhcyBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gaXRzIG5hbWUgKi8KKwl7IFBSXzJfQkFEX05BTUUsCisJICBOXygiQEUgaGFzIGlsbGVnYWwgY2hhcmFjdGVycyBpbiBpdHMgbmFtZS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogTWlzc2luZyAnLicgaW4gZGlyZWN0b3J5IGlub2RlICovCisJeyBQUl8yX01JU1NJTkdfRE9ULAorCSAgTl8oIk1pc3NpbmcgJy4nIGluIEBkIEBpICVpLlxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBNaXNzaW5nICcuLicgaW4gZGlyZWN0b3J5IGlub2RlICovCisJeyBQUl8yX01JU1NJTkdfRE9UX0RPVCwKKwkgIE5fKCJNaXNzaW5nICcuLicgaW4gQGQgQGkgJWkuXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIEZpcnN0IGVudHJ5IGluIGRpcmVjdG9yeSBpbm9kZSBkb2Vzbid0IGNvbnRhaW4gJy4nICovCisJeyBQUl8yXzFTVF9OT1RfRE9ULAorCSAgTl8oIkZpcnN0IEBlICclRG4nIChAaT0lRGkpIGluIEBkIEBpICVpICglcCkgQHMgJy4nXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIFNlY29uZCBlbnRyeSBpbiBkaXJlY3RvcnkgaW5vZGUgZG9lc24ndCBjb250YWluICcuLicgKi8KKwl7IFBSXzJfMk5EX05PVF9ET1RfRE9ULAorCSAgTl8oIlNlY29uZCBAZSAnJURuJyAoQGk9JURpKSBpbiBAZCBAaSAlaSBAcyAnLi4nXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIGlfZmFkZHIgc2hvdWxkIGJlIHplcm8gKi8KKwl7IFBSXzJfRkFERFJfWkVSTywKKwkgIE5fKCJpX2ZhZGRyIEBGICVJRiwgQHMgemVyby5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBpX2ZpbGVfYWNsIHNob3VsZCBiZSB6ZXJvICovCisJeyBQUl8yX0ZJTEVfQUNMX1pFUk8sCisJICBOXygiaV9maWxlX2FjbCBARiAlSWYsIEBzIHplcm8uXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogaV9kaXJfYWNsIHNob3VsZCBiZSB6ZXJvICovCisJeyBQUl8yX0RJUl9BQ0xfWkVSTywKKwkgIE5fKCJpX2Rpcl9hY2wgQEYgJUlkLCBAcyB6ZXJvLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIGlfZnJhZyBzaG91bGQgYmUgemVybyAqLworCXsgUFJfMl9GUkFHX1pFUk8sCisJICBOXygiaV9mcmFnIEBGICVOLCBAcyB6ZXJvLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIGlfZnNpemUgc2hvdWxkIGJlIHplcm8gKi8KKwl7IFBSXzJfRlNJWkVfWkVSTywKKwkgIE5fKCJpX2ZzaXplIEBGICVOLCBAcyB6ZXJvLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIGlub2RlIGhhcyBiYWQgbW9kZSAqLworCXsgUFJfMl9CQURfTU9ERSwKKwkgIE5fKCJAaSAlaSAoJVEpIGhhcyBAbiBtb2RlICglSW0pLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIGRpcmVjdG9yeSBjb3JydXB0ZWQgKi8KKwl7IFBSXzJfRElSX0NPUlJVUFRFRCwKKwkgIE5fKCJAZCBAaSAlaSwgQGIgJUIsIG9mZnNldCAlTjogQGQgY29ycnVwdGVkXG4iKSwKKwkgIFBST01QVF9TQUxWQUdFLCAwIH0sCisKKwkvKiBmaWxlbmFtZSB0b28gbG9uZyAqLworCXsgUFJfMl9GSUxFTkFNRV9MT05HLAorCSAgTl8oIkBkIEBpICVpLCBAYiAlQiwgb2Zmc2V0ICVOOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiksCisJICBQUk9NUFRfVFJVTkNBVEUsIDAgfSwKKworCS8qIERpcmVjdG9yeSBpbm9kZSBoYXMgYSBtaXNzaW5nIGJsb2NrIChob2xlKSAqLworCXsgUFJfMl9ESVJFQ1RPUllfSE9MRSwKKwkgIE5fKCJAZCBAaSAlaSBoYXMgYW4gdW5hbGxvY2F0ZWQgQGIgIyVCLiAgIiksCisJICBQUk9NUFRfQUxMT0NBVEUsIDAgfSwKKworCS8qICcuJyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkICovCisJeyBQUl8yX0RPVF9OVUxMX1RFUk0sCisJICBOXygiJy4nIEBkIEBlIGluIEBkIEBpICVpIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWRcbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogJy4uJyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkICovCisJeyBQUl8yX0RPVF9ET1RfTlVMTF9URVJNLAorCSAgTl8oIicuLicgQGQgQGUgaW4gQGQgQGkgJWkgaXMgbm90IE5VTEwgdGVybWluYXRlZFxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBJbGxlZ2FsIGNoYXJhY3RlciBkZXZpY2UgaW5vZGUgKi8KKwl7IFBSXzJfQkFEX0NIQVJfREVWLAorCSAgTl8oIkBpICVpICglUSkgaXMgYW4gQEkgY2hhcmFjdGVyIEB2LlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIElsbGVnYWwgYmxvY2sgZGV2aWNlIGlub2RlICovCisJeyBQUl8yX0JBRF9CTE9DS19ERVYsCisJICBOXygiQGkgJWkgKCVRKSBpcyBhbiBASSBAYiBAdi5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBEdXBsaWNhdGUgJy4nIGVudHJ5ICovCisJeyBQUl8yX0RVUF9ET1QsCisJICBOXygiQEUgaXMgZHVwbGljYXRlICcuJyBAZS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogRHVwbGljYXRlICcuLicgZW50cnkgKi8KKwl7IFBSXzJfRFVQX0RPVF9ET1QsCisJICBOXygiQEUgaXMgZHVwbGljYXRlICcuLicgQGUuXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIEludGVybmFsIGVycm9yOiBjb3VsZG4ndCBmaW5kIGRpcl9pbmZvICovCisJeyBQUl8yX05PX0RJUklORk8sCisJICBOXygiSW50ZXJuYWwgZXJyb3I6IGNhbm5vdCBmaW5kIGRpcl9pbmZvIGZvciAlaS5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBGaW5hbCByZWNfbGVuIGlzIHdyb25nICovCisJeyBQUl8yX0ZJTkFMX1JFQ0xFTiwKKwkgIE5fKCJARSBoYXMgcmVjX2xlbiBvZiAlRHIsIEBzICVOLlxuIiksCisJICBQUk9NUFRfRklYLCAwIH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIGljb3VudCBzdHJ1Y3R1cmUgKi8KKwl7IFBSXzJfQUxMT0NBVEVfSUNPVU5ULAorCSAgTl8oIkBBIGljb3VudCBzdHJ1Y3R1cmU6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgaXRlcmF0aW5nIG92ZXIgZGlyZWN0b3J5IGJsb2NrcyAqLworCXsgUFJfMl9EQkxJU1RfSVRFUkFURSwKKwkgIE5fKCJFcnJvciBpdGVyYXRpbmcgb3ZlciBAZCBAYnM6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgcmVhZGluZyBkaXJlY3RvcnkgYmxvY2sgKi8KKwl7IFBSXzJfUkVBRF9ESVJCTE9DSywKKwkgIE5fKCJFcnJvciByZWFkaW5nIEBkIEBiICViIChAaSAlaSk6ICVtXG4iKSwKKwkgIFBST01QVF9DT05USU5VRSwgMCB9LAorCisJLyogRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgYmxvY2sgKi8KKwl7IFBSXzJfV1JJVEVfRElSQkxPQ0ssCisJICBOXygiRXJyb3Igd3JpdGluZyBAZCBAYiAlYiAoQGkgJWkpOiAlbVxuIiksCisJICBQUk9NUFRfQ09OVElOVUUsIDAgfSwKKworCS8qIEVycm9yIGFsbG9jYXRpbmcgbmV3IGRpcmVjdG9yeSBibG9jayAqLworCXsgUFJfMl9BTExPQ19ESVJCT0NLLAorCSAgTl8oIkBBIG5ldyBAZCBAYiBmb3IgQGkgJWkgKCVzKTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIGRlYWxsb2NhdGluZyBpbm9kZSAqLworCXsgUFJfMl9ERUFMTE9DX0lOT0RFLAorCSAgTl8oIkVycm9yIGRlYWxsb2NhdGluZyBAaSAlaTogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBEaXJlY3RvcnkgZW50cnkgZm9yICcuJyBpcyBiaWcuICBTcGxpdD8gKi8KKwl7IFBSXzJfU1BMSVRfRE9ULAorCSAgTl8oIkBkIEBlIGZvciAnLicgaXMgYmlnLiAgIiksCisJICBQUk9NUFRfU1BMSVQsIFBSX05PX09LIH0sCisKKwkvKiBJbGxlZ2FsIEZJRk8gaW5vZGUgKi8KKwl7IFBSXzJfQkFEX0ZJRk8sCisJICBOXygiQGkgJWkgKCVRKSBpcyBhbiBASSBGSUZPLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIElsbGVnYWwgc29ja2V0IGlub2RlICovCisJeyBQUl8yX0JBRF9TT0NLRVQsCisJICBOXygiQGkgJWkgKCVRKSBpcyBhbiBASSBzb2NrZXQuXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogRGlyZWN0b3J5IGZpbGV0eXBlIG5vdCBzZXQgKi8KKwl7IFBSXzJfU0VUX0ZJTEVUWVBFLAorCSAgTl8oIlNldHRpbmcgZmlsZXR5cGUgZm9yIEBFIHRvICVOLlxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfUFJFRU5fT0sgfCBQUl9OT19PSyB8IFBSX05PX05PTVNHIH0sCisKKwkvKiBEaXJlY3RvcnkgZmlsZXR5cGUgaW5jb3JyZWN0ICovCisJeyBQUl8yX0JBRF9GSUxFVFlQRSwKKwkgIE5fKCJARSBoYXMgYW4gaW5jb3JyZWN0IGZpbGV0eXBlICh3YXMgJUR0LCBAcyAlTikuXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIERpcmVjdG9yeSBmaWxldHlwZSBzZXQgb24gZmlsZXN5c3RlbSAqLworCXsgUFJfMl9DTEVBUl9GSUxFVFlQRSwKKwkgIE5fKCJARSBoYXMgZmlsZXR5cGUgc2V0LlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBEaXJlY3RvcnkgZmlsZW5hbWUgaXMgbnVsbCAqLworCXsgUFJfMl9OVUxMX05BTUUsCisJICBOXygiQEUgaGFzIGEgQHogbmFtZS5cbiIpLAorCSAgUFJPTVBUX0NMRUFSLCAwIH0sCisKKwkvKiBJbnZhbGlkIHN5bWxpbmsgKi8KKwl7IFBSXzJfSU5WQUxJRF9TWU1MSU5LLAorCSAgTl8oIlN5bWxpbmsgJVEgKEBpICMlaSkgaXMgQG4uXG4iKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogaV9maWxlX2FjbCAoZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrKSBpcyBiYWQgKi8KKwl7IFBSXzJfRklMRV9BQ0xfQkFELAorCSAgTl8oIkBhIEBiIEBGIEBuICglSWYpLlxuIiksCisJICBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIEZpbGVzeXN0ZW0gY29udGFpbnMgbGFyZ2UgZmlsZXMsIGJ1dCBoYXMgbm8gc3VjaCBmbGFnIGluIHNiICovCisJeyBQUl8yX0ZFQVRVUkVfTEFSR0VfRklMRVMsCisJICBOXygiQGYgY29udGFpbnMgbGFyZ2UgZmlsZXMsIGJ1dCBsYWNrcyBMQVJHRV9GSUxFIGZsYWcgaW4gQFMuXG4iKSwKKwkgIFBST01QVF9GSVgsIDAgfSwKKworCS8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IG5vdCByZWZlcmVuY2VkICovCisJeyBQUl8yX0hUUkVFX05PVFJFRiwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIG5vdCByZWZlcmVuY2VkXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSByZWZlcmVuY2VkIHR3aWNlICovCisJeyBQUl8yX0hUUkVFX0RVUFJFRiwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIHJlZmVyZW5jZWQgdHdpY2VcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIE5vZGUgaW4gSFRSRUUgZGlyZWN0b3J5IGhhcyBiYWQgbWluIGhhc2ggKi8KKwl7IFBSXzJfSFRSRUVfTUlOX0hBU0gsCisJICBOXygiQHAgQGggJWQ6IG5vZGUgKCVCKSBoYXMgYmFkIG1pbiBoYXNoXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSBoYXMgYmFkIG1heCBoYXNoICovCisJeyBQUl8yX0hUUkVFX01BWF9IQVNILAorCSAgTl8oIkBwIEBoICVkOiBub2RlICglQikgaGFzIGJhZCBtYXggaGFzaFxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ2xlYXIgaW52YWxpZCBIVFJFRSBkaXJlY3RvcnkgKi8KKwl7IFBSXzJfSFRSRUVfQ0xFQVIsCisJICBOXygiQG4gQGggJWQgKCVxKS4gICIpLCBQUk9NUFRfQ0xFQVIsIDAgfSwKKworCS8qIEJhZCBibG9jayBpbiBodHJlZSBpbnRlcmlvciBub2RlICovCisJeyBQUl8yX0hUUkVFX0JBREJMSywKKwkgIE5fKCJAcCBAaCAlZCAoJXEpOiBiYWQgQGIgbnVtYmVyICViLlxuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIDAgfSwKKworCS8qIEVycm9yIGFkanVzdGluZyBFQSByZWZjb3VudCAqLworCXsgUFJfMl9BREpfRUFfUkVGQ09VTlQsCisJICBOXygiRXJyb3IgYWRqdXN0aW5nIHJlZmNvdW50IGZvciBAYSBAYiAlYiAoQGkgJWkpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEludmFsaWQgSFRSRUUgcm9vdCBub2RlICovCisJeyBQUl8yX0hUUkVFX0JBRF9ST09ULAorCSAgTl8oIkBwIEBoICVkOiByb290IG5vZGUgaXMgQG5cbiIpLAorCSAgUFJPTVBUX0NMRUFSX0hUUkVFLCBQUl9QUkVFTl9PSyB9LAorCisJLyogSW52YWxpZCBIVFJFRSBsaW1pdCAqLworCXsgUFJfMl9IVFJFRV9CQURfTElNSVQsCisJICBOXygiQHAgQGggJWQ6IG5vZGUgKCVCKSBoYXMgQG4gbGltaXQgKCVOKVxuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBJbnZhbGlkIEhUUkVFIGNvdW50ICovCisJeyBQUl8yX0hUUkVFX0JBRF9DT1VOVCwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIGhhcyBAbiBjb3VudCAoJU4pXG4iKSwKKwkgIFBST01QVF9DTEVBUl9IVFJFRSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIEhUUkVFIGludGVyaW9yIG5vZGUgaGFzIG91dC1vZi1vcmRlciBoYXNoZXMgaW4gdGFibGUgKi8KKwl7IFBSXzJfSFRSRUVfSEFTSF9PUkRFUiwKKwkgIE5fKCJAcCBAaCAlZDogbm9kZSAoJUIpIGhhcyBhbiB1bm9yZGVyZWQgaGFzaCB0YWJsZVxuIiksCisJICBQUk9NUFRfQ0xFQVJfSFRSRUUsIFBSX1BSRUVOX09LIH0sCisKKwkvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSBoYXMgaW52YWxpZCBkZXB0aCAqLworCXsgUFJfMl9IVFJFRV9CQURfREVQVEgsCisJICBOXygiQHAgQGggJWQ6IG5vZGUgKCVCKSBoYXMgQG4gZGVwdGhcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIER1cGxpY2F0ZSBkaXJlY3RvcnkgZW50cnkgZm91bmQgKi8KKwl7IFBSXzJfRFVQTElDQVRFX0RJUkVOVCwKKwkgIE5fKCJEdXBsaWNhdGUgQEUgZm91bmQuICAiKSwKKwkgIFBST01QVF9DTEVBUiwgMCB9LAorCisJLyogTm9uLXVuaXF1ZSBmaWxlbmFtZSBmb3VuZCAqLworCXsgUFJfMl9OT05fVU5JUVVFX0ZJTEUsIC8qIHhnZXR0ZXh0OiBuby1jLWZvcm1hdCAqLworCSAgTl8oIkBFIGhhcyBhIG5vbi11bmlxdWUgZmlsZW5hbWUuXG5SZW5hbWUgdG8gJXMiKSwKKwkgIFBST01QVF9OVUxMLCAwIH0sCisKKwkvKiBEdXBsaWNhdGUgZGlyZWN0b3J5IGVudHJ5IGZvdW5kICovCisJeyBQUl8yX1JFUE9SVF9EVVBfRElSRU5ULAorCSAgTl8oIkR1cGxpY2F0ZSBAZSAnJURuJyBmb3VuZC5cblx0TWFya2luZyAlcCAoJWkpIHRvIGJlIHJlYnVpbHQuXG5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIFBhc3MgMyBlcnJvcnMgKi8KKworCS8qIFBhc3MgMzogQ2hlY2tpbmcgZGlyZWN0b3J5IGNvbm5lY3Rpdml0eSAqLworCXsgUFJfM19QQVNTX0hFQURFUiwKKwkgIE5fKCJQYXNzIDM6IENoZWNraW5nIEBkIGNvbm5lY3Rpdml0eVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUm9vdCBpbm9kZSBub3QgYWxsb2NhdGVkICovCisJeyBQUl8zX05PX1JPT1RfSU5PREUsCisJICBOXygiQHIgbm90IGFsbG9jYXRlZC4gICIpLAorCSAgUFJPTVBUX0FMTE9DQVRFLCAwIH0sCisKKwkvKiBObyByb29tIGluIGxvc3QrZm91bmQgKi8KKwl7IFBSXzNfRVhQQU5EX0xGX0RJUiwKKwkgIE5fKCJObyByb29tIGluIEBsIEBkLiAgIiksCisJICBQUk9NUFRfRVhQQU5ELCAwIH0sCisKKwkvKiBVbmNvbm5lY3RlZCBkaXJlY3RvcnkgaW5vZGUgKi8KKwl7IFBSXzNfVU5DT05ORUNURURfRElSLAorCSAgTl8oIlVuY29ubmVjdGVkIEBkIEBpICVpICglcClcbiIpLAorCSAgUFJPTVBUX0NPTk5FQ1QsIDAgfSwKKworCS8qIC9sb3N0K2ZvdW5kIG5vdCBmb3VuZCAqLworCXsgUFJfM19OT19MRl9ESVIsCisJICBOXygiL0BsIG5vdCBmb3VuZC4gICIpLAorCSAgUFJPTVBUX0NSRUFURSwgUFJfUFJFRU5fT0sgfSwKKworCS8qIC4uIGVudHJ5IGlzIGluY29ycmVjdCAqLworCXsgUFJfM19CQURfRE9UX0RPVCwKKwkgIE5fKCInLi4nIGluICVRICglaSkgaXMgJVAgKCVqKSwgQHMgJXEgKCVkKS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgMCB9LAorCisJLyogQmFkIG9yIG5vbi1leGlzdGVudCAvbG9zdCtmb3VuZC4gIENhbm5vdCByZWNvbm5lY3QgKi8KKwl7IFBSXzNfTk9fTFBGLAorCSAgTl8oIkJhZCBvciBub24tZXhpc3RlbnQgL0BsLiAgQ2Fubm90IHJlY29ubmVjdC5cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIENvdWxkIG5vdCBleHBhbmQgL2xvc3QrZm91bmQgKi8KKwl7IFBSXzNfQ0FOVF9FWFBBTkRfTFBGLAorCSAgTl8oIkNvdWxkIG5vdCBleHBhbmQgL0BsOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ291bGQgbm90IHJlY29ubmVjdCBpbm9kZSAqLworCXsgUFJfM19DQU5UX1JFQ09OTkVDVCwKKwkgIE5fKCJDb3VsZCBub3QgcmVjb25uZWN0ICVpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGZpbmQgL2xvc3QrZm91bmQgKi8KKwl7IFBSXzNfRVJSX0ZJTkRfTFBGLAorCSAgTl8oIkVycm9yIHdoaWxlIHRyeWluZyB0byBmaW5kIC9AbDogJW1cbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIGluIGV4dDJmc19uZXdfYmxvY2sgd2hpbGUgY3JlYXRpbmcgL2xvc3QrZm91bmQgKi8KKwl7IFBSXzNfRVJSX0xQRl9ORVdfQkxPQ0ssCisJICBOXygiZXh0MmZzX25ld19AYjogJW0gd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSAvQGwgQGRcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIGluIGV4dDJmc19uZXdfaW5vZGUgd2hpbGUgY3JlYXRpbmcgL2xvc3QrZm91bmQgKi8KKwl7IFBSXzNfRVJSX0xQRl9ORVdfSU5PREUsCisJICBOXygiZXh0MmZzX25ld19AaTogJW0gd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSAvQGwgQGRcbiIpLAorCSAgUFJPTVBUX05PTkUsIDAgfSwKKworCS8qIEVycm9yIGluIGV4dDJmc19uZXdfZGlyX2Jsb2NrIHdoaWxlIGNyZWF0aW5nIC9sb3N0K2ZvdW5kICovCisJeyBQUl8zX0VSUl9MUEZfTkVXX0RJUl9CTE9DSywKKwkgIE5fKCJleHQyZnNfbmV3X2Rpcl9AYjogJW0gd2hpbGUgY3JlYXRpbmcgbmV3IEBkIEBiXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBFcnJvciB3aGlsZSB3cml0aW5nIGRpcmVjdG9yeSBibG9jayBmb3IgL2xvc3QrZm91bmQgKi8KKwl7IFBSXzNfRVJSX0xQRl9XUklURV9CTE9DSywKKwkgIE5fKCJleHQyZnNfd3JpdGVfZGlyX0BiOiAlbSB3aGlsZSB3cml0aW5nIHRoZSBAZCBAYiBmb3IgL0BsXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBFcnJvciB3aGlsZSBhZGp1c3RpbmcgaW5vZGUgY291bnQgKi8KKwl7IFBSXzNfQURKVVNUX0lOT0RFLAorCSAgTl8oIkVycm9yIHdoaWxlIGFkanVzdGluZyBAaSBjb3VudCBvbiBAaSAlaVxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ291bGRuJ3QgZml4IHBhcmVudCBkaXJlY3RvcnkgLS0gZXJyb3IgKi8KKwl7IFBSXzNfRklYX1BBUkVOVF9FUlIsCisJICBOXygiQ291bGRuJ3QgZml4IHBhcmVudCBvZiBAaSAlaTogJW1cblxuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogQ291bGRuJ3QgZml4IHBhcmVudCBkaXJlY3RvcnkgLS0gY291bGRuJ3QgZmluZCBpdCAqLworCXsgUFJfM19GSVhfUEFSRU5UX05PRklORCwKKwkgIE5fKCJDb3VsZG4ndCBmaXggcGFyZW50IG9mIEBpICVpOiBDb3VsZG4ndCBmaW5kIHBhcmVudCBAZCBAZVxuXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBFcnJvciBhbGxvY2F0aW5nIGlub2RlIGJpdG1hcCAqLworCXsgUFJfM19BTExPQ0FURV9JQklUTUFQX0VSUk9SLAorCSAgTl8oIkBBIEBpIEBCICglTik6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgY3JlYXRpbmcgcm9vdCBkaXJlY3RvcnkgKi8KKwl7IFBSXzNfQ1JFQVRFX1JPT1RfRVJST1IsCisJICBOXygiRXJyb3IgY3JlYXRpbmcgcm9vdCBAZCAoJXMpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIEVycm9yIGNyZWF0aW5nIGxvc3QgYW5kIGZvdW5kIGRpcmVjdG9yeSAqLworCXsgUFJfM19DUkVBVEVfTFBGX0VSUk9SLAorCSAgTl8oIkVycm9yIGNyZWF0aW5nIC9AbCBAZCAoJXMpOiAlbVxuIiksCisJICBQUk9NUFRfTk9ORSwgUFJfRkFUQUwgfSwKKworCS8qIFJvb3QgaW5vZGUgaXMgbm90IGRpcmVjdG9yeTsgYWJvcnRpbmcgKi8KKwl7IFBSXzNfUk9PVF9OT1RfRElSX0FCT1JULAorCSAgTl8oIkByIGlzIG5vdCBhIEBkOyBhYm9ydGluZy5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBDYW5ub3QgcHJvY2VlZCB3aXRob3V0IGEgcm9vdCBpbm9kZS4gKi8KKwl7IFBSXzNfTk9fUk9PVF9JTk9ERV9BQk9SVCwKKwkgIE5fKCJjYW4ndCBwcm9jZWVkIHdpdGhvdXQgYSBAci5cbiIpLAorCSAgUFJPTVBUX05PTkUsIFBSX0ZBVEFMIH0sCisKKwkvKiBJbnRlcm5hbCBlcnJvcjogY291bGRuJ3QgZmluZCBkaXJfaW5mbyAqLworCXsgUFJfM19OT19ESVJJTkZPLAorCSAgTl8oIkludGVybmFsIGVycm9yOiBjYW5ub3QgZmluZCBkaXJfaW5mbyBmb3IgJWkuXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogTG9zdCtmb3VuZCBub3QgYSBkaXJlY3RvcnkgKi8KKwl7IFBSXzNfTFBGX05PVERJUiwKKwkgIE5fKCIvQGwgaXMgbm90IGEgQGQgKGlubz0laSlcbiIpLAorCSAgUFJPTVBUX1VOTElOSywgMCB9LAorCisJLyogUGFzcyAzQSBEaXJlY3RvcnkgT3B0aW1pemF0aW9uICAgICAgICovCisKKwkvKiBQYXNzIDNBOiBPcHRpbWl6aW5nIGRpcmVjdG9yaWVzICovCisJeyBQUl8zQV9QQVNTX0hFQURFUiwKKwkgIE5fKCJQYXNzIDNBOiBPcHRpbWl6aW5nIGRpcmVjdG9yaWVzXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogRXJyb3IgaXRlcmF0aW5nIG92ZXIgZGlyZWN0b3JpZXMgKi8KKwl7IFBSXzNBX09QVElNSVpFX0lURVIsCisJICBOXygiRmFpbGVkIHRvIGNyZWF0ZSBkaXJzX3RvX2hhc2ggaXRlcmF0b3I6ICVtIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogRXJyb3IgcmVoYXNoIGRpcmVjdG9yeSAqLworCXsgUFJfM0FfT1BUSU1JWkVfRElSX0VSUiwKKwkgIE5fKCJGYWlsZWQgdG8gb3B0aW1pemUgZGlyZWN0b3J5ICVxICglZCk6ICVtIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogUmVoYXNoaW5nIGRpciBoZWFkZXIgKi8KKwl7IFBSXzNBX09QVElNSVpFX0RJUl9IRUFERVIsCisJICBOXygiT3B0aW1pemluZyBkaXJlY3RvcmllczogIiksCisJICBQUk9NUFRfTk9ORSwgUFJfTVNHX09OTFkgfSwKKworCS8qIFJlaGFzaGluZyBkaXJlY3RvcnkgJWQgKi8KKwl7IFBSXzNBX09QVElNSVpFX0RJUiwKKwkgICIgJWQiLAorCSAgUFJPTVBUX05PTkUsIFBSX0xBVENIX09QVElNSVpFX0RJUiB8IFBSX1BSRUVOX05PSERSfSwKKworCS8qIFJlaGFzaGluZyBkaXIgZW5kICovCisJeyBQUl8zQV9PUFRJTUlaRV9ESVJfRU5ELAorCSAgIlxuIiwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9OT0hEUiB9LAorCisJLyogUGFzcyA0IGVycm9ycyAqLworCisJLyogUGFzcyA0OiBDaGVja2luZyByZWZlcmVuY2UgY291bnRzICovCisJeyBQUl80X1BBU1NfSEVBREVSLAorCSAgTl8oIlBhc3MgNDogQ2hlY2tpbmcgcmVmZXJlbmNlIGNvdW50c1xuIiksCisJICBQUk9NUFRfTk9ORSwgMCB9LAorCisJLyogVW5hdHRhY2hlZCB6ZXJvLWxlbmd0aCBpbm9kZSAqLworCXsgUFJfNF9aRVJPX0xFTl9JTk9ERSwKKwkgIE5fKCJAdSBAeiBAaSAlaS4gICIpLAorCSAgUFJPTVBUX0NMRUFSLCBQUl9QUkVFTl9PS3xQUl9OT19PSyB9LAorCisJLyogVW5hdHRhY2hlZCBpbm9kZSAqLworCXsgUFJfNF9VTkFUVEFDSEVEX0lOT0RFLAorCSAgTl8oIkB1IEBpICVpXG4iKSwKKwkgIFBST01QVF9DT05ORUNULCAwIH0sCisKKwkvKiBJbm9kZSByZWYgY291bnQgd3JvbmcgKi8KKwl7IFBSXzRfQkFEX1JFRl9DT1VOVCwKKwkgIE5fKCJAaSAlaSByZWYgY291bnQgaXMgJUlsLCBAcyAlTi4gICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCXsgUFJfNF9JTkNPTlNJU1RFTlRfQ09VTlQsCisJICBOXygiV0FSTklORzogUFJPR1JBTU1JTkcgQlVHIElOIEUyRlNDSyFcbiIKKwkgICJcdE9SIFNPTUUgQk9ORUhFQUQgKFlPVSkgSVMgQ0hFQ0tJTkcgQSBNT1VOVEVEIChMSVZFKSBGSUxFU1lTVEVNLlxuIgorCSAgIkBpX2xpbmtfaW5mb1slaV0gaXMgJU4sIEBpLmlfbGlua3NfY291bnQgaXMgJUlsLiAgIgorCSAgIlRoZXkgQHMgdGhlIHNhbWUhXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBQYXNzIDUgZXJyb3JzICovCisKKwkvKiBQYXNzIDU6IENoZWNraW5nIGdyb3VwIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKwl7IFBSXzVfUEFTU19IRUFERVIsCisJICBOXygiUGFzcyA1OiBDaGVja2luZyBAZyBzdW1tYXJ5IGluZm9ybWF0aW9uXG4iKSwKKwkgIFBST01QVF9OT05FLCAwIH0sCisKKwkvKiBQYWRkaW5nIGF0IGVuZCBvZiBpbm9kZSBiaXRtYXAgaXMgbm90IHNldC4gKi8KKwl7IFBSXzVfSU5PREVfQk1BUF9QQURESU5HLAorCSAgTl8oIlBhZGRpbmcgYXQgZW5kIG9mIEBpIEBCIGlzIG5vdCBzZXQuICIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfSwKKworCS8qIFBhZGRpbmcgYXQgZW5kIG9mIGJsb2NrIGJpdG1hcCBpcyBub3Qgc2V0LiAqLworCXsgUFJfNV9CTE9DS19CTUFQX1BBRERJTkcsCisJICBOXygiUGFkZGluZyBhdCBlbmQgb2YgQGIgQEIgaXMgbm90IHNldC4gIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB9LAorCisJLyogQmxvY2sgYml0bWFwIGRpZmZlcmVuY2VzIGhlYWRlciAqLworCXsgUFJfNV9CTE9DS19CSVRNQVBfSEVBREVSLAorCSAgTl8oIkBiIEBCIGRpZmZlcmVuY2VzOiAiKSwKKwkgIFBST01QVF9OT05FLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHfSwKKworCS8qIEJsb2NrIG5vdCB1c2VkLCBidXQgbWFya2VkIGluIGJpdG1hcCAqLworCXsgUFJfNV9CTE9DS19VTlVTRUQsCisJICAiIC0lYiIsCisJICBQUk9NUFRfTk9ORSwgUFJfTEFUQ0hfQkJJVE1BUCB8IFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEJsb2NrIHVzZWQsIGJ1dCBub3QgbWFya2VkIHVzZWQgaW4gYml0bWFwICovCisJeyBQUl81X0JMT0NLX1VTRUQsCisJICAiICslYiIsCisJICBQUk9NUFRfTk9ORSwgUFJfTEFUQ0hfQkJJVE1BUCB8IFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEJsb2NrIGJpdG1hcCBkaWZmZXJlbmNlcyBlbmQgKi8KKwl7IFBSXzVfQkxPQ0tfQklUTUFQX0VORCwKKwkgICJcbiIsCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBJbm9kZSBiaXRtYXAgZGlmZmVyZW5jZXMgaGVhZGVyICovCisJeyBQUl81X0lOT0RFX0JJVE1BUF9IRUFERVIsCisJICBOXygiQGkgQEIgZGlmZmVyZW5jZXM6ICIpLAorCSAgUFJPTVBUX05PTkUsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIElub2RlIG5vdCB1c2VkLCBidXQgbWFya2VkIGluIGJpdG1hcCAqLworCXsgUFJfNV9JTk9ERV9VTlVTRUQsCisJICAiIC0laSIsCisJICBQUk9NUFRfTk9ORSwgUFJfTEFUQ0hfSUJJVE1BUCB8IFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIElub2RlIHVzZWQsIGJ1dCBub3QgbWFya2VkIHVzZWQgaW4gYml0bWFwICovCisJeyBQUl81X0lOT0RFX1VTRUQsCisJICAiICslaSIsCisJICBQUk9NUFRfTk9ORSwgUFJfTEFUQ0hfSUJJVE1BUCB8IFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIElub2RlIGJpdG1hcCBkaWZmZXJlbmNlcyBlbmQgKi8KKwl7IFBSXzVfSU5PREVfQklUTUFQX0VORCwKKwkgICJcbiIsCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBGcmVlIGlub2RlcyBjb3VudCBmb3IgZ3JvdXAgd3JvbmcgKi8KKwl7IFBSXzVfRlJFRV9JTk9ERV9DT1VOVF9HUk9VUCwKKwkgIE5fKCJGcmVlIEBpcyBjb3VudCB3cm9uZyBmb3IgQGcgIyVnICglaSwgY291bnRlZD0laikuXG4iKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIERpcmVjdG9yaWVzIGNvdW50IGZvciBncm91cCB3cm9uZyAqLworCXsgUFJfNV9GUkVFX0RJUl9DT1VOVF9HUk9VUCwKKwkgIE5fKCJEaXJlY3RvcmllcyBjb3VudCB3cm9uZyBmb3IgQGcgIyVnICglaSwgY291bnRlZD0laikuXG4iKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIEZyZWUgaW5vZGVzIGNvdW50IHdyb25nICovCisJeyBQUl81X0ZSRUVfSU5PREVfQ09VTlQsCisJICBOXygiRnJlZSBAaXMgY291bnQgd3JvbmcgKCVpLCBjb3VudGVkPSVqKS5cbiIpLAorCSAgUFJPTVBUX0ZJWCwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogRnJlZSBibG9ja3MgY291bnQgZm9yIGdyb3VwIHdyb25nICovCisJeyBQUl81X0ZSRUVfQkxPQ0tfQ09VTlRfR1JPVVAsCisJICBOXygiRnJlZSBAYnMgY291bnQgd3JvbmcgZm9yIEBnICMlZyAoJWIsIGNvdW50ZWQ9JWMpLlxuIiksCisJICBQUk9NUFRfRklYLCBQUl9QUkVFTl9PSyB8IFBSX1BSRUVOX05PTVNHIH0sCisKKwkvKiBGcmVlIGJsb2NrcyBjb3VudCB3cm9uZyAqLworCXsgUFJfNV9GUkVFX0JMT0NLX0NPVU5ULAorCSAgTl8oIkZyZWUgQGJzIGNvdW50IHdyb25nICglYiwgY291bnRlZD0lYykuXG4iKSwKKwkgIFBST01QVF9GSVgsIFBSX1BSRUVOX09LIHwgUFJfUFJFRU5fTk9NU0cgfSwKKworCS8qIFByb2dyYW1taW5nIGVycm9yOiBiaXRtYXAgZW5kcG9pbnRzIGRvbid0IG1hdGNoICovCisJeyBQUl81X0JNQVBfRU5EUE9JTlRTLAorCSAgTl8oIlBST0dSQU1NSU5HIEVSUk9SOiBAZiAoIyVOKSBAQiBlbmRwb2ludHMgKCViLCAlYykgZG9uJ3QgIgorCSAgIm1hdGNoIGNhbGN1bGF0ZWQgQEIgZW5kcG9pbnRzICglaSwgJWopXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogSW50ZXJuYWwgZXJyb3I6IGZ1ZGdpbmcgZW5kIG9mIGJpdG1hcCAqLworCXsgUFJfNV9GVURHRV9CSVRNQVBfRVJST1IsCisJICBOXygiSW50ZXJuYWwgZXJyb3I6IGZ1ZGdpbmcgZW5kIG9mIGJpdG1hcCAoJU4pXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgY29weWluZyBpbiByZXBsYWNlbWVudCBpbm9kZSBiaXRtYXAgKi8KKwl7IFBSXzVfQ09QWV9JQklUTUFQX0VSUk9SLAorCSAgTl8oIkVycm9yIGNvcHlpbmcgaW4gcmVwbGFjZW1lbnQgQGkgQEI6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogRXJyb3IgY29weWluZyBpbiByZXBsYWNlbWVudCBibG9jayBiaXRtYXAgKi8KKwl7IFBSXzVfQ09QWV9CQklUTUFQX0VSUk9SLAorCSAgTl8oIkVycm9yIGNvcHlpbmcgaW4gcmVwbGFjZW1lbnQgQGIgQEI6ICVtXG4iKSwKKwkgIFBST01QVF9OT05FLCBQUl9GQVRBTCB9LAorCisJLyogQmxvY2sgcmFuZ2Ugbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisJeyBQUl81X0JMT0NLX1JBTkdFX1VOVVNFRCwKKwkgICIgLSglYi0tJWMpIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9CQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogQmxvY2sgcmFuZ2UgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKwl7IFBSXzVfQkxPQ0tfUkFOR0VfVVNFRCwKKwkgICIgKyglYi0tJWMpIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9CQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogSW5vZGUgcmFuZ2Ugbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisJeyBQUl81X0lOT0RFX1JBTkdFX1VOVVNFRCwKKwkgICIgLSglaS0tJWopIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9JQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJLyogSW5vZGUgcmFuZ2UgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKwl7IFBSXzVfSU5PREVfUkFOR0VfVVNFRCwKKwkgICIgKyglaS0tJWopIiwKKwkgIFBST01QVF9OT05FLCBQUl9MQVRDSF9JQklUTUFQIHwgUFJfUFJFRU5fT0sgfCBQUl9QUkVFTl9OT01TRyB9LAorCisJeyAwIH0KK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBsYXRjaCBmbGFncyByZWdpc3Rlci4gIEl0IGFsbG93cyBzZXZlcmFsIHByb2JsZW1zIHRvIGJlCisgKiAibGF0Y2hlZCIgdG9nZXRoZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgaGFzIHRvIGFuc3dlciBidXQgb25lCisgKiBxdWVzdGlvbiBmb3IgdGhlIHNldCBvZiBwcm9ibGVtcywgYW5kIGFsbCBvZiB0aGUgYXNzb2NpYXRlZAorICogcHJvYmxlbXMgd2lsbCBiZSBlaXRoZXIgZml4ZWQgb3Igbm90IGZpeGVkLgorICovCitzdGF0aWMgc3RydWN0IGxhdGNoX2Rlc2NyIHByX2xhdGNoX2luZm9bXSA9IHsKKwl7IFBSX0xBVENIX0JMT0NLLCBQUl8xX0lOT0RFX0JMT0NLX0xBVENILCAwIH0sCisJeyBQUl9MQVRDSF9CQkxPQ0ssIFBSXzFfSU5PREVfQkJMT0NLX0xBVENILCAwIH0sCisJeyBQUl9MQVRDSF9JQklUTUFQLCBQUl81X0lOT0RFX0JJVE1BUF9IRUFERVIsIFBSXzVfSU5PREVfQklUTUFQX0VORCB9LAorCXsgUFJfTEFUQ0hfQkJJVE1BUCwgUFJfNV9CTE9DS19CSVRNQVBfSEVBREVSLCBQUl81X0JMT0NLX0JJVE1BUF9FTkQgfSwKKwl7IFBSX0xBVENIX1JFTE9DLCBQUl8wX1JFTE9DQVRFX0hJTlQsIDAgfSwKKwl7IFBSX0xBVENIX0RCTE9DSywgUFJfMUJfRFVQX0JMT0NLX0hFQURFUiwgUFJfMUJfRFVQX0JMT0NLX0VORCB9LAorCXsgUFJfTEFUQ0hfTE9XX0RUSU1FLCBQUl8xX09SUEhBTl9MSVNUX1JFRlVHRUVTLCAwIH0sCisJeyBQUl9MQVRDSF9UT09CSUcsIFBSXzFfSU5PREVfVE9PQklHLCAwIH0sCisJeyBQUl9MQVRDSF9PUFRJTUlaRV9ESVIsIFBSXzNBX09QVElNSVpFX0RJUl9IRUFERVIsIFBSXzNBX09QVElNSVpFX0RJUl9FTkQgfSwKKwl7IC0xLCAwLCAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGUyZnNja19wcm9ibGVtICpmaW5kX3Byb2JsZW0ocHJvYmxlbV90IGNvZGUpCit7CisJaW50ICAgICBpOworCisJZm9yIChpPTA7IHByb2JsZW1fdGFibGVbaV0uZTJwX2NvZGU7IGkrKykgeworCQlpZiAocHJvYmxlbV90YWJsZVtpXS5lMnBfY29kZSA9PSBjb2RlKQorCQkJcmV0dXJuICZwcm9ibGVtX3RhYmxlW2ldOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsYXRjaF9kZXNjciAqZmluZF9sYXRjaChpbnQgY29kZSkKK3sKKwlpbnQgICAgIGk7CisKKwlmb3IgKGk9MDsgcHJfbGF0Y2hfaW5mb1tpXS5sYXRjaF9jb2RlID49IDA7IGkrKykgeworCQlpZiAocHJfbGF0Y2hfaW5mb1tpXS5sYXRjaF9jb2RlID09IGNvZGUpCisJCQlyZXR1cm4gJnByX2xhdGNoX2luZm9baV07CisJfQorCXJldHVybiAwOworfQorCitpbnQgZW5kX3Byb2JsZW1fbGF0Y2goZTJmc2NrX3QgY3R4LCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgbGF0Y2hfZGVzY3IgKmxkZXNjOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgcGN0eDsKKwlpbnQgYW5zd2VyID0gLTE7CisKKwlsZGVzYyA9IGZpbmRfbGF0Y2gobWFzayk7CisJaWYgKGxkZXNjLT5lbmRfbWVzc2FnZSAmJiAobGRlc2MtPmZsYWdzICYgUFJMX0xBVENIRUQpKSB7CisJCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisJCWFuc3dlciA9IGZpeF9wcm9ibGVtKGN0eCwgbGRlc2MtPmVuZF9tZXNzYWdlLCAmcGN0eCk7CisJfQorCWxkZXNjLT5mbGFncyAmPSB+KFBSTF9WQVJJQUJMRSk7CisJcmV0dXJuIGFuc3dlcjsKK30KKworaW50IHNldF9sYXRjaF9mbGFncyhpbnQgbWFzaywgaW50IHNldGZsYWdzLCBpbnQgY2xlYXJmbGFncykKK3sKKwlzdHJ1Y3QgbGF0Y2hfZGVzY3IgKmxkZXNjOworCisJbGRlc2MgPSBmaW5kX2xhdGNoKG1hc2spOworCWlmICghbGRlc2MpCisJCXJldHVybiAtMTsKKwlsZGVzYy0+ZmxhZ3MgfD0gc2V0ZmxhZ3M7CisJbGRlc2MtPmZsYWdzICY9IH5jbGVhcmZsYWdzOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFyX3Byb2JsZW1fY29udGV4dChzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpjdHgpCit7CisJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9ibGVtX2NvbnRleHQpKTsKKwljdHgtPmJsa2NvdW50ID0gLTE7CisJY3R4LT5ncm91cCA9IC0xOworfQorCitpbnQgZml4X3Byb2JsZW0oZTJmc2NrX3QgY3R4LCBwcm9ibGVtX3QgY29kZSwgc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJY29uc3Qgc3RydWN0IGUyZnNja19wcm9ibGVtICpwdHI7CisJc3RydWN0IGxhdGNoX2Rlc2NyICpsZGVzYyA9IE5VTEw7CisJY29uc3QgY2hhciAqbWVzc2FnZTsKKwlpbnQgICAgICAgICAgICAgZGVmX3luLCBhbnN3ZXIsIGFuczsKKwlpbnQgICAgICAgICAgICAgcHJpbnRfYW5zd2VyID0gMDsKKwlpbnQgICAgICAgICAgICAgc3VwcHJlc3MgPSAwOworCisJcHRyID0gZmluZF9wcm9ibGVtKGNvZGUpOworCWlmICghcHRyKSB7CisJCXByaW50ZihfKCJVbmhhbmRsZWQgZXJyb3IgY29kZSAoMHgleCkhXG4iKSwgY29kZSk7CisJCXJldHVybiAwOworCX0KKwlkZWZfeW4gPSAxOworCWlmICgocHRyLT5mbGFncyAmIFBSX05PX0RFRkFVTFQpIHx8CisJICAgICgocHRyLT5mbGFncyAmIFBSX1BSRUVOX05PKSAmJiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpIHx8CisJICAgIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX05PKSkKKwkJZGVmX3luPSAwOworCisJLyoKKwkgKiBEbyBzcGVjaWFsIGxhdGNoIHByb2Nlc3NpbmcuICBUaGlzIGlzIHdoZXJlIHdlIGFzayB0aGUKKwkgKiBsYXRjaCBxdWVzdGlvbiwgaWYgaXQgZXhpc3RzCisJICovCisJaWYgKHB0ci0+ZmxhZ3MgJiBQUl9MQVRDSF9NQVNLKSB7CisJCWxkZXNjID0gZmluZF9sYXRjaChwdHItPmZsYWdzICYgUFJfTEFUQ0hfTUFTSyk7CisJCWlmIChsZGVzYy0+cXVlc3Rpb24gJiYgIShsZGVzYy0+ZmxhZ3MgJiBQUkxfTEFUQ0hFRCkpIHsKKwkJCWFucyA9IGZpeF9wcm9ibGVtKGN0eCwgbGRlc2MtPnF1ZXN0aW9uLCBwY3R4KTsKKwkJCWlmIChhbnMgPT0gMSkKKwkJCQlsZGVzYy0+ZmxhZ3MgfD0gUFJMX1lFUzsKKwkJCWlmIChhbnMgPT0gMCkKKwkJCQlsZGVzYy0+ZmxhZ3MgfD0gUFJMX05POworCQkJbGRlc2MtPmZsYWdzIHw9IFBSTF9MQVRDSEVEOworCQl9CisJCWlmIChsZGVzYy0+ZmxhZ3MgJiBQUkxfU1VQUFJFU1MpCisJCQlzdXBwcmVzcysrOworCX0KKwlpZiAoKHB0ci0+ZmxhZ3MgJiBQUl9QUkVFTl9OT01TRykgJiYKKwkgICAgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQlzdXBwcmVzcysrOworCWlmICgocHRyLT5mbGFncyAmIFBSX05PX05PTVNHKSAmJgorCSAgICAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9OTykpCisJCXN1cHByZXNzKys7CisJaWYgKCFzdXBwcmVzcykgeworCQltZXNzYWdlID0gcHRyLT5lMnBfZGVzY3JpcHRpb247CisJCWlmICgoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikgJiYKKwkJICAgICEocHRyLT5mbGFncyAmIFBSX1BSRUVOX05PSERSKSkgeworCQkJcHJpbnRmKCIlczogIiwgY3R4LT5kZXZpY2VfbmFtZSA/CisJCQkgICAgICAgY3R4LT5kZXZpY2VfbmFtZSA6IGN0eC0+ZmlsZXN5c3RlbV9uYW1lKTsKKwkJfQorCQlpZiAoKm1lc3NhZ2UpCisJCQlwcmludF9lMmZzY2tfbWVzc2FnZShjdHgsIF8obWVzc2FnZSksIHBjdHgsIDEpOworCX0KKwlpZiAoIShwdHItPmZsYWdzICYgUFJfUFJFRU5fT0spICYmIChwdHItPnByb21wdCAhPSBQUk9NUFRfTk9ORSkpCisJCXByZWVuaGFsdChjdHgpOworCisJaWYgKHB0ci0+ZmxhZ3MgJiBQUl9GQVRBTCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisKKwlpZiAocHRyLT5wcm9tcHQgPT0gUFJPTVBUX05PTkUpIHsKKwkJaWYgKHB0ci0+ZmxhZ3MgJiBQUl9OT0NPTExBVEUpCisJCQlhbnN3ZXIgPSAtMTsKKwkJZWxzZQorCQkJYW5zd2VyID0gZGVmX3luOworCX0gZWxzZSB7CisJCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSB7CisJCQlhbnN3ZXIgPSBkZWZfeW47CisJCQlpZiAoIShwdHItPmZsYWdzICYgUFJfUFJFRU5fTk9NU0cpKQorCQkJCXByaW50X2Fuc3dlciA9IDE7CisJCX0gZWxzZSBpZiAoKHB0ci0+ZmxhZ3MgJiBQUl9MQVRDSF9NQVNLKSAmJgorCQkJICAgKGxkZXNjLT5mbGFncyAmIChQUkxfWUVTIHwgUFJMX05PKSkpIHsKKwkJCWlmICghc3VwcHJlc3MpCisJCQkJcHJpbnRfYW5zd2VyID0gMTsKKwkJCWlmIChsZGVzYy0+ZmxhZ3MgJiBQUkxfWUVTKQorCQkJCWFuc3dlciA9IDE7CisJCQllbHNlCisJCQkJYW5zd2VyID0gMDsKKwkJfSBlbHNlCisJCQlhbnN3ZXIgPSBhc2soY3R4LCBfKHByb21wdFsoaW50KSBwdHItPnByb21wdF0pLCBkZWZfeW4pOworCQlpZiAoIWFuc3dlciAmJiAhKHB0ci0+ZmxhZ3MgJiBQUl9OT19PSykpCisJCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKworCQlpZiAocHJpbnRfYW5zd2VyKQorCQkJcHJpbnRmKCIlcy5cbiIsIGFuc3dlciA/CisJCQkgICAgICAgXyhwcmVlbl9tc2dbKGludCkgcHRyLT5wcm9tcHRdKSA6IF8oIklHTk9SRUQiKSk7CisJfQorCisJaWYgKChwdHItPnByb21wdCA9PSBQUk9NUFRfQUJPUlQpICYmIGFuc3dlcikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisKKwlpZiAocHRyLT5mbGFncyAmIFBSX0FGVEVSX0NPREUpCisJCWFuc3dlciA9IGZpeF9wcm9ibGVtKGN0eCwgcHRyLT5zZWNvbmRfY29kZSwgcGN0eCk7CisKKwlyZXR1cm4gYW5zd2VyOworfQorCisvKgorICogbGludXgvZnMvcmVjb3ZlcnkuYworICoKKyAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4sIDE5OTkKKyAqLworCisvKgorICogTWFpbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyZXNzIG9mIHRoZSByZWNvdmVyeSBqb2IsIHNvIHRoYXQKKyAqIHRoZSBkaWZmZXJlbnQgcGFzc2VzIGNhbiBjYXJyeSBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZW0uCisgKi8KK3N0cnVjdCByZWNvdmVyeV9pbmZvCit7CisJdGlkX3QgICAgICAgICAgIHN0YXJ0X3RyYW5zYWN0aW9uOworCXRpZF90ICAgICAgICAgICBlbmRfdHJhbnNhY3Rpb247CisKKwlpbnQgICAgICAgICAgICAgbnJfcmVwbGF5czsKKwlpbnQgICAgICAgICAgICAgbnJfcmV2b2tlczsKKwlpbnQgICAgICAgICAgICAgbnJfcmV2b2tlX2hpdHM7Cit9OworCitlbnVtIHBhc3N0eXBlIHtQQVNTX1NDQU4sIFBBU1NfUkVWT0tFLCBQQVNTX1JFUExBWX07CitzdGF0aWMgaW50IGRvX29uZV9wYXNzKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQlzdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAqaW5mbywgZW51bSBwYXNzdHlwZSBwYXNzKTsKK3N0YXRpYyBpbnQgc2Nhbl9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkJdGlkX3QsIHN0cnVjdCByZWNvdmVyeV9pbmZvICopOworCisvKgorICogUmVhZCBhIGJsb2NrIGZyb20gdGhlIGpvdXJuYWwKKyAqLworCitzdGF0aWMgaW50IGpyZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocCwgam91cm5hbF90ICpqb3VybmFsLAorCQkgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJKmJocCA9IE5VTEw7CisKKwllcnIgPSBqb3VybmFsX2JtYXAoam91cm5hbCwgb2Zmc2V0LCAmYmxvY2tucik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ZigiSkJEOiBiYWQgYmxvY2sgYXQgb2Zmc2V0ICV1XG4iLCBvZmZzZXQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWJoID0gZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJLyogSWYgdGhpcyBpcyBhIGJyYW5kIG5ldyBidWZmZXIsIHN0YXJ0IHJlYWRhaGVhZC4KKwkJICAgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgd2UgYXJlIGFscmVhZHkgcmVhZGluZyBpdC4gICovCisJCWlmICghYnVmZmVyX3JlcShiaCkpCisJCQlkb19yZWFkYWhlYWQoam91cm5hbCwgb2Zmc2V0KTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlwcmludGYoIkpCRDogRmFpbGVkIHRvIHJlYWQgYmxvY2sgYXQgb2Zmc2V0ICV1XG4iLCBvZmZzZXQpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkqYmhwID0gYmg7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENvdW50IHRoZSBudW1iZXIgb2YgaW4tdXNlIHRhZ3MgaW4gYSBqb3VybmFsIGRlc2NyaXB0b3IgYmxvY2suCisgKi8KKworc3RhdGljIGludCBjb3VudF90YWdzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBzaXplKQoreworCWNoYXIgKiAgICAgICAgICAgICAgICAgIHRhZ3A7CisJam91cm5hbF9ibG9ja190YWdfdCAqICAgdGFnOworCWludCAgICAgICAgICAgICAgICAgICAgIG5yID0gMDsKKworCXRhZ3AgPSAmYmgtPmJfZGF0YVtzaXplb2Yoam91cm5hbF9oZWFkZXJfdCldOworCisJd2hpbGUgKCh0YWdwIC0gYmgtPmJfZGF0YSArIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KSkgPD0gc2l6ZSkgeworCQl0YWcgPSAoam91cm5hbF9ibG9ja190YWdfdCAqKSB0YWdwOworCisJCW5yKys7CisJCXRhZ3AgKz0gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCQlpZiAoISh0YWctPnRfZmxhZ3MgJiBodG9ubChKRlNfRkxBR19TQU1FX1VVSUQpKSkKKwkJCXRhZ3AgKz0gMTY7CisKKwkJaWYgKHRhZy0+dF9mbGFncyAmIGh0b25sKEpGU19GTEFHX0xBU1RfVEFHKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBucjsKK30KKworCisvKiBNYWtlIHN1cmUgd2Ugd3JhcCBhcm91bmQgdGhlIGxvZyBjb3JyZWN0bHkhICovCisjZGVmaW5lIHdyYXAoam91cm5hbCwgdmFyKQkJCQkJICAgICAgXAorZG8gewkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAodmFyID49IChqb3VybmFsKS0+al9sYXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl2YXIgLT0gKChqb3VybmFsKS0+al9sYXN0IC0gKGpvdXJuYWwpLT5qX2ZpcnN0KTsgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qKgorICogaW50IGpvdXJuYWxfcmVjb3Zlcihqb3VybmFsX3QgKmpvdXJuYWwpIC0gcmVjb3ZlcnMgYSBvbi1kaXNrIGpvdXJuYWwKKyAqIEBqb3VybmFsOiB0aGUgam91cm5hbCB0byByZWNvdmVyCisgKgorICogVGhlIHByaW1hcnkgZnVuY3Rpb24gZm9yIHJlY292ZXJpbmcgdGhlIGxvZyBjb250ZW50cyB3aGVuIG1vdW50aW5nIGEKKyAqIGpvdXJuYWxlZCBkZXZpY2UuCisgKgorICogUmVjb3ZlcnkgaXMgZG9uZSBpbiB0aHJlZSBwYXNzZXMuICBJbiB0aGUgZmlyc3QgcGFzcywgd2UgbG9vayBmb3IgdGhlCisgKiBlbmQgb2YgdGhlIGxvZy4gIEluIHRoZSBzZWNvbmQsIHdlIGFzc2VtYmxlIHRoZSBsaXN0IG9mIHJldm9rZQorICogYmxvY2tzLiAgSW4gdGhlIHRoaXJkIGFuZCBmaW5hbCBwYXNzLCB3ZSByZXBsYXkgYW55IHVuLXJldm9rZWQgYmxvY2tzCisgKiBpbiB0aGUgbG9nLgorICovCitpbnQgam91cm5hbF9yZWNvdmVyKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnI7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKiAgc2I7CisKKwlzdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAgICBpbmZvOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJLyoKKwkgKiBUaGUgam91cm5hbCBzdXBlcmJsb2NrJ3Mgc19zdGFydCBmaWVsZCAodGhlIGN1cnJlbnQgbG9nIGhlYWQpCisJICogaXMgYWx3YXlzIHplcm8gaWYsIGFuZCBvbmx5IGlmLCB0aGUgam91cm5hbCB3YXMgY2xlYW5seQorCSAqIHVubW91bnRlZC4KKwkgKi8KKworCWlmICghc2ItPnNfc3RhcnQpIHsKKwkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9IG50b2hsKHNiLT5zX3NlcXVlbmNlKSArIDE7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1NDQU4pOworCWlmICghZXJyKQorCQllcnIgPSBkb19vbmVfcGFzcyhqb3VybmFsLCAmaW5mbywgUEFTU19SRVZPS0UpOworCWlmICghZXJyKQorCQllcnIgPSBkb19vbmVfcGFzcyhqb3VybmFsLCAmaW5mbywgUEFTU19SRVBMQVkpOworCisJLyogUmVzdGFydCB0aGUgbG9nIGF0IHRoZSBuZXh0IHRyYW5zYWN0aW9uIElELCB0aHVzIGludmFsaWRhdGluZworCSAqIGFueSBleGlzdGluZyBjb21taXQgcmVjb3JkcyBpbiB0aGUgbG9nLiAqLworCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSArK2luZm8uZW5kX3RyYW5zYWN0aW9uOworCisJam91cm5hbF9jbGVhcl9yZXZva2Uoam91cm5hbCk7CisJc3luY19ibG9ja2Rldihqb3VybmFsLT5qX2ZzX2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19vbmVfcGFzcyhqb3VybmFsX3QgKmpvdXJuYWwsCisJCQlzdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAqaW5mbywgZW51bSBwYXNzdHlwZSBwYXNzKQoreworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGZpcnN0X2NvbW1pdF9JRCwgbmV4dF9jb21taXRfSUQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgbmV4dF9sb2dfYmxvY2s7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZXJyLCBzdWNjZXNzID0gMDsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqICBzYjsKKwlqb3VybmFsX2hlYWRlcl90ICogICAgICB0bXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogICAgYmg7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgc2VxdWVuY2U7CisJaW50ICAgICAgICAgICAgICAgICAgICAgYmxvY2t0eXBlOworCisJLyogUHJlY29tcHV0ZSB0aGUgbWF4aW11bSBtZXRhZGF0YSBkZXNjcmlwdG9ycyBpbiBhIGRlc2NyaXB0b3IgYmxvY2sgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBNQVhfQkxPQ0tTX1BFUl9ERVNDOworCU1BWF9CTE9DS1NfUEVSX0RFU0MgPSAoKGpvdXJuYWwtPmpfYmxvY2tzaXplLXNpemVvZihqb3VybmFsX2hlYWRlcl90KSkKKwkJCSAgICAgICAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KSk7CisKKwkvKgorCSAqIEZpcnN0IHRoaW5nIGlzIHRvIGVzdGFibGlzaCB3aGF0IHdlIGV4cGVjdCB0byBmaW5kIGluIHRoZSBsb2cKKwkgKiAoaW4gdGVybXMgb2YgdHJhbnNhY3Rpb24gSURzKSwgYW5kIHdoZXJlIChpbiB0ZXJtcyBvZiBsb2cKKwkgKiBibG9jayBvZmZzZXRzKTogcXVlcnkgdGhlIHN1cGVyYmxvY2suCisJICovCisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKwluZXh0X2NvbW1pdF9JRCA9IG50b2hsKHNiLT5zX3NlcXVlbmNlKTsKKwluZXh0X2xvZ19ibG9jayA9IG50b2hsKHNiLT5zX3N0YXJ0KTsKKworCWZpcnN0X2NvbW1pdF9JRCA9IG5leHRfY29tbWl0X0lEOworCWlmIChwYXNzID09IFBBU1NfU0NBTikKKwkJaW5mby0+c3RhcnRfdHJhbnNhY3Rpb24gPSBmaXJzdF9jb21taXRfSUQ7CisKKwkvKgorCSAqIE5vdyB3ZSB3YWxrIHRocm91Z2ggdGhlIGxvZywgdHJhbnNhY3Rpb24gYnkgdHJhbnNhY3Rpb24sCisJICogbWFraW5nIHN1cmUgdGhhdCBlYWNoIHRyYW5zYWN0aW9uIGhhcyBhIGNvbW1pdCBibG9jayBpbiB0aGUKKwkgKiBleHBlY3RlZCBwbGFjZS4gIEVhY2ggY29tcGxldGUgdHJhbnNhY3Rpb24gZ2V0cyByZXBsYXllZCBiYWNrCisJICogaW50byB0aGUgbWFpbiBmaWxlc3lzdGVtLgorCSAqLworCisJd2hpbGUgKDEpIHsKKwkJaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisJCWNoYXIgKiAgICAgICAgICAgICAgICAgIHRhZ3A7CisJCWpvdXJuYWxfYmxvY2tfdGFnX3QgKiAgIHRhZzsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICogICAgb2JoOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiAgICBuYmg7CisKKwkJLyogSWYgd2UgYWxyZWFkeSBrbm93IHdoZXJlIHRvIHN0b3AgdGhlIGxvZyB0cmF2ZXJzYWwsCisJCSAqIGNoZWNrIHJpZ2h0IG5vdyB0aGF0IHdlIGhhdmVuJ3QgZ29uZSBwYXN0IHRoZSBlbmQgb2YKKwkJICogdGhlIGxvZy4gKi8KKworCQlpZiAocGFzcyAhPSBQQVNTX1NDQU4pCisJCQlpZiAodGlkX2dlcShuZXh0X2NvbW1pdF9JRCwgaW5mby0+ZW5kX3RyYW5zYWN0aW9uKSkKKwkJCQlicmVhazsKKworCQkvKiBTa2lwIG92ZXIgZWFjaCBjaHVuayBvZiB0aGUgdHJhbnNhY3Rpb24gbG9va2luZworCQkgKiBlaXRoZXIgdGhlIG5leHQgZGVzY3JpcHRvciBibG9jayBvciB0aGUgZmluYWwgY29tbWl0CisJCSAqIHJlY29yZC4gKi8KKworCQllcnIgPSBqcmVhZCgmYmgsIGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbGVkOworCisJCW5leHRfbG9nX2Jsb2NrKys7CisJCXdyYXAoam91cm5hbCwgbmV4dF9sb2dfYmxvY2spOworCisJCS8qIFdoYXQga2luZCBvZiBidWZmZXIgaXMgaXQ/CisJCSAqCisJCSAqIElmIGl0IGlzIGEgZGVzY3JpcHRvciBibG9jaywgY2hlY2sgdGhhdCBpdCBoYXMgdGhlCisJCSAqIGV4cGVjdGVkIHNlcXVlbmNlIG51bWJlci4gIE90aGVyd2lzZSwgd2UncmUgYWxsIGRvbmUKKwkJICogaGVyZS4gKi8KKworCQl0bXAgPSAoam91cm5hbF9oZWFkZXJfdCAqKWJoLT5iX2RhdGE7CisKKwkJaWYgKHRtcC0+aF9tYWdpYyAhPSBodG9ubChKRlNfTUFHSUNfTlVNQkVSKSkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYmxvY2t0eXBlID0gbnRvaGwodG1wLT5oX2Jsb2NrdHlwZSk7CisJCXNlcXVlbmNlID0gbnRvaGwodG1wLT5oX3NlcXVlbmNlKTsKKworCQlpZiAoc2VxdWVuY2UgIT0gbmV4dF9jb21taXRfSUQpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9LLCB3ZSBoYXZlIGEgdmFsaWQgZGVzY3JpcHRvciBibG9jayB3aGljaCBtYXRjaGVzCisJCSAqIGFsbCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGNoZWNrcy4gIFdoYXQgYXJlIHdlIGdvaW5nCisJCSAqIHRvIGRvIHdpdGggaXQ/ICBUaGF0IGRlcGVuZHMgb24gdGhlIHBhc3MuLi4gKi8KKworCQlzd2l0Y2ggKGJsb2NrdHlwZSkgeworCQljYXNlIEpGU19ERVNDUklQVE9SX0JMT0NLOgorCQkJLyogSWYgaXQgaXMgYSB2YWxpZCBkZXNjcmlwdG9yIGJsb2NrLCByZXBsYXkgaXQKKwkJCSAqIGluIHBhc3MgUkVQTEFZOyBvdGhlcndpc2UsIGp1c3Qgc2tpcCBvdmVyIHRoZQorCQkJICogYmxvY2tzIGl0IGRlc2NyaWJlcy4gKi8KKwkJCWlmIChwYXNzICE9IFBBU1NfUkVQTEFZKSB7CisJCQkJbmV4dF9sb2dfYmxvY2sgKz0KKwkJCQkJY291bnRfdGFncyhiaCwgam91cm5hbC0+al9ibG9ja3NpemUpOworCQkJCXdyYXAoam91cm5hbCwgbmV4dF9sb2dfYmxvY2spOworCQkJCWJyZWxzZShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEEgZGVzY3JpcHRvciBibG9jazogd2UgY2FuIG5vdyB3cml0ZSBhbGwgb2YKKwkJCSAqIHRoZSBkYXRhIGJsb2Nrcy4gIFlheSwgdXNlZnVsIHdvcmsgaXMgZmluYWxseQorCQkJICogZ2V0dGluZyBkb25lIGhlcmUhICovCisKKwkJCXRhZ3AgPSAmYmgtPmJfZGF0YVtzaXplb2Yoam91cm5hbF9oZWFkZXJfdCldOworCQkJd2hpbGUgKCh0YWdwIC0gYmgtPmJfZGF0YSArc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpKQorCQkJICAgICAgIDw9IGpvdXJuYWwtPmpfYmxvY2tzaXplKSB7CisJCQkJdW5zaWduZWQgbG9uZyBpb19ibG9jazsKKworCQkJCXRhZyA9IChqb3VybmFsX2Jsb2NrX3RhZ190ICopIHRhZ3A7CisJCQkJZmxhZ3MgPSBudG9obCh0YWctPnRfZmxhZ3MpOworCisJCQkJaW9fYmxvY2sgPSBuZXh0X2xvZ19ibG9jaysrOworCQkJCXdyYXAoam91cm5hbCwgbmV4dF9sb2dfYmxvY2spOworCQkJCWVyciA9IGpyZWFkKCZvYmgsIGpvdXJuYWwsIGlvX2Jsb2NrKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCS8qIFJlY292ZXIgd2hhdCB3ZSBjYW4sIGJ1dAorCQkJCQkgKiByZXBvcnQgZmFpbHVyZSBhdCB0aGUgZW5kLiAqLworCQkJCQlzdWNjZXNzID0gZXJyOworCQkJCQlwcmludGYoIkpCRDogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyAiCisJCQkJCQkiYmxvY2sgJWxkIGluIGxvZ1xuIiwKKwkJCQkJCWVyciwgaW9fYmxvY2spOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKworCQkJCQlibG9ja25yID0gbnRvaGwodGFnLT50X2Jsb2NrbnIpOworCisJCQkJCS8qIElmIHRoZSBibG9jayBoYXMgYmVlbgorCQkJCQkgKiByZXZva2VkLCB0aGVuIHdlJ3JlIGFsbCBkb25lCisJCQkJCSAqIGhlcmUuICovCisJCQkJCWlmIChqb3VybmFsX3Rlc3RfcmV2b2tlCisJCQkJCSAgICAoam91cm5hbCwgYmxvY2tuciwKKwkJCQkJICAgICBuZXh0X2NvbW1pdF9JRCkpIHsKKwkJCQkJCWJyZWxzZShvYmgpOworCQkJCQkJKytpbmZvLT5ucl9yZXZva2VfaGl0czsKKwkJCQkJCWdvdG8gc2tpcF93cml0ZTsKKwkJCQkJfQorCisJCQkJCS8qIEZpbmQgYSBidWZmZXIgZm9yIHRoZSBuZXcKKwkJCQkJICogZGF0YSBiZWluZyByZXN0b3JlZCAqLworCQkJCQluYmggPSBnZXRibGsoam91cm5hbC0+al9mc19kZXYsCisJCQkJCQkgICAgICAgYmxvY2tuciwKKwkJCQkJCSAgICAgam91cm5hbC0+al9ibG9ja3NpemUpOworCQkJCQlpZiAobmJoID09IE5VTEwpIHsKKwkJCQkJCXByaW50ZigiSkJEOiBPdXQgb2YgbWVtb3J5ICIKKwkJCQkJCSAgICAgICAiZHVyaW5nIHJlY292ZXJ5LlxuIik7CisJCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQkJYnJlbHNlKGJoKTsKKwkJCQkJCWJyZWxzZShvYmgpOworCQkJCQkJZ290byBmYWlsZWQ7CisJCQkJCX0KKworCQkJCQlsb2NrX2J1ZmZlcihuYmgpOworCQkJCQltZW1jcHkobmJoLT5iX2RhdGEsIG9iaC0+Yl9kYXRhLAorCQkJCQkJCWpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJCQkJaWYgKGZsYWdzICYgSkZTX0ZMQUdfRVNDQVBFKSB7CisJCQkJCQkqKCh1bnNpZ25lZCBpbnQgKiliaC0+Yl9kYXRhKSA9CisJCQkJCQkJaHRvbmwoSkZTX01BR0lDX05VTUJFUik7CisJCQkJCX0KKworCQkJCQltYXJrX2J1ZmZlcl91cHRvZGF0ZShuYmgsIDEpOworCQkJCQltYXJrX2J1ZmZlcl9kaXJ0eShuYmgpOworCQkJCQkrK2luZm8tPm5yX3JlcGxheXM7CisJCQkJCS8qIGxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmbmJoKTsgKi8KKwkJCQkJdW5sb2NrX2J1ZmZlcihuYmgpOworCQkJCQlicmVsc2Uob2JoKTsKKwkJCQkJYnJlbHNlKG5iaCk7CisJCQkJfQorCisJCQlza2lwX3dyaXRlOgorCQkJCXRhZ3AgKz0gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCQkJCWlmICghKGZsYWdzICYgSkZTX0ZMQUdfU0FNRV9VVUlEKSkKKwkJCQkJdGFncCArPSAxNjsKKworCQkJCWlmIChmbGFncyAmIEpGU19GTEFHX0xBU1RfVEFHKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlbHNlKGJoKTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgSkZTX0NPTU1JVF9CTE9DSzoKKwkJCS8qIEZvdW5kIGFuIGV4cGVjdGVkIGNvbW1pdCBibG9jazogbm90IG11Y2ggdG8KKwkJCSAqIGRvIG90aGVyIHRoYW4gbW92ZSBvbiB0byB0aGUgbmV4dCBzZXF1ZW5jZQorCQkJICogbnVtYmVyLiAqLworCQkJYnJlbHNlKGJoKTsKKwkJCW5leHRfY29tbWl0X0lEKys7CisJCQljb250aW51ZTsKKworCQljYXNlIEpGU19SRVZPS0VfQkxPQ0s6CisJCQkvKiBJZiB3ZSBhcmVuJ3QgaW4gdGhlIFJFVk9LRSBwYXNzLCB0aGVuIHdlIGNhbgorCQkJICoganVzdCBza2lwIG92ZXIgdGhpcyBibG9jay4gKi8KKwkJCWlmIChwYXNzICE9IFBBU1NfUkVWT0tFKSB7CisJCQkJYnJlbHNlKGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZXJyID0gc2Nhbl9yZXZva2VfcmVjb3Jkcyhqb3VybmFsLCBiaCwKKwkJCQkJCSAgbmV4dF9jb21taXRfSUQsIGluZm8pOworCQkJYnJlbHNlKGJoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsZWQ7CisJCQljb250aW51ZTsKKworCQlkZWZhdWx0OgorCQkJZ290byBkb25lOworCQl9CisJfQorCisgZG9uZToKKwkvKgorCSAqIFdlIGJyb2tlIG91dCBvZiB0aGUgbG9nIHNjYW4gbG9vcDogZWl0aGVyIHdlIGNhbWUgdG8gdGhlCisJICoga25vd24gZW5kIG9mIHRoZSBsb2cgb3Igd2UgZm91bmQgYW4gdW5leHBlY3RlZCBibG9jayBpbiB0aGUKKwkgKiBsb2cuICBJZiB0aGUgbGF0dGVyIGhhcHBlbmVkLCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgImN1cnJlbnQiCisJICogdHJhbnNhY3Rpb24gbWFya3MgdGhlIGVuZCBvZiB0aGUgdmFsaWQgbG9nLgorCSAqLworCisJaWYgKHBhc3MgPT0gUEFTU19TQ0FOKQorCQlpbmZvLT5lbmRfdHJhbnNhY3Rpb24gPSBuZXh0X2NvbW1pdF9JRDsKKwllbHNlIHsKKwkJLyogSXQncyByZWFsbHkgYmFkIG5ld3MgaWYgZGlmZmVyZW50IHBhc3NlcyBlbmQgdXAgYXQKKwkJICogZGlmZmVyZW50IHBsYWNlcyAoYnV0IHBvc3NpYmxlIGR1ZSB0byBJTyBlcnJvcnMpLiAqLworCQlpZiAoaW5mby0+ZW5kX3RyYW5zYWN0aW9uICE9IG5leHRfY29tbWl0X0lEKSB7CisJCQlwcmludGYoIkpCRDogcmVjb3ZlcnkgcGFzcyAlZCBlbmRlZCBhdCAiCisJCQkJInRyYW5zYWN0aW9uICV1LCBleHBlY3RlZCAldVxuIiwKKwkJCQlwYXNzLCBuZXh0X2NvbW1pdF9JRCwgaW5mby0+ZW5kX3RyYW5zYWN0aW9uKTsKKwkJCWlmICghc3VjY2VzcykKKwkJCQlzdWNjZXNzID0gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiBzdWNjZXNzOworCisgZmFpbGVkOgorCXJldHVybiBlcnI7Cit9CisKKworLyogU2NhbiBhIHJldm9rZSByZWNvcmQsIG1hcmtpbmcgYWxsIGJsb2NrcyBtZW50aW9uZWQgYXMgcmV2b2tlZC4gKi8KKworc3RhdGljIGludCBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSwgc3RydWN0IHJlY292ZXJ5X2luZm8gKmluZm8pCit7CisJam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKmhlYWRlcjsKKwlpbnQgb2Zmc2V0LCBtYXg7CisKKwloZWFkZXIgPSAoam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKikgYmgtPmJfZGF0YTsKKwlvZmZzZXQgPSBzaXplb2Yoam91cm5hbF9yZXZva2VfaGVhZGVyX3QpOworCW1heCA9IG50b2hsKGhlYWRlci0+cl9jb3VudCk7CisKKwl3aGlsZSAob2Zmc2V0IDwgbWF4KSB7CisJCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwkJaW50IGVycjsKKworCQlibG9ja25yID0gbnRvaGwoKiAoKHVuc2lnbmVkIGludCAqKSAoYmgtPmJfZGF0YStvZmZzZXQpKSk7CisJCW9mZnNldCArPSA0OworCQllcnIgPSBqb3VybmFsX3NldF9yZXZva2Uoam91cm5hbCwgYmxvY2tuciwgc2VxdWVuY2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJKytpbmZvLT5ucl9yZXZva2VzOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcmVoYXNoLmMgLS0tIHJlYnVpbGQgaGFzaCB0cmVlIGRpcmVjdG9yaWVzCisgKgorICogVGhpcyBhbGdvcml0aG0gaXMgZGVzaWduZWQgZm9yIHNpbXBsaWNpdHkgb2YgaW1wbGVtZW50YXRpb24gYW5kIHRvCisgKiBwYWNrIHRoZSBkaXJlY3RvcnkgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIEl0IGhvd2V2ZXIgcmVxdWlyZXMgdHdpY2UKKyAqIGFzIG11Y2ggbWVtb3J5IGFzIHRoZSBzaXplIG9mIHRoZSBkaXJlY3RvcnkuICBUaGUgbWF4aW11bSBzaXplCisgKiBkaXJlY3Rvcnkgc3VwcG9ydGVkIHVzaW5nIGEgNGsgYmxvY2tzaXplIGlzIHJvdWdobHkgYSBnaWdhYnl0ZSwgYW5kCisgKiBzbyB0aGVyZSBtYXkgdmVyeSB3ZWxsIGJlIHByb2JsZW1zIHdpdGggbWFjaGluZXMgdGhhdCBkb24ndCBoYXZlCisgKiB2aXJ0dWFsIG1lbW9yeSwgYW5kIG9ic2NlbmVseSBsYXJnZSBkaXJlY3Rvcmllcy4KKyAqCisgKiBBbiBhbHRlcm5hdGUgYWxnb3JpdGhtIHdoaWNoIGlzIG11Y2ggbW9yZSBkaXNrIGludGVuc2l2ZSBjb3VsZCBiZQorICogd3JpdHRlbiwgYW5kIHByb2JhYmx5IHdpbGwgbmVlZCB0byBiZSB3cml0dGVuIGluIHRoZSBmdXR1cmUuICBUaGUKKyAqIGRlc2lnbiBnb2FscyBvZiBzdWNoIGFuIGFsZ29yaXRobSBhcmU6IChhKSB1c2UgKHJvdWdobHkpIGNvbnN0YW50CisgKiBhbW91bnRzIG9mIG1lbW9yeSwgbm8gbWF0dGVyIGhvdyBsYXJnZSB0aGUgZGlyZWN0b3J5LCAoYikgdGhlCisgKiBkaXJlY3RvcnkgbXVzdCBiZSBzYWZlIGF0IGFsbCB0aW1lcywgZXZlbiBpZiBlMmZzY2sgaXMgaW50ZXJydXB0ZWQKKyAqIGluIHRoZSBtaWRkbGUsIChjKSB3ZSBtdXN0IHVzZSBtaW5pbWFsIGFtb3VudHMgb2YgZXh0cmEgZGlzaworICogYmxvY2tzLiAgVGhpcyBwcmV0dHkgbXVjaCByZXF1aXJlcyBhbiBpbmNyZW1lbnRhbCBhcHByb2FjaCwgd2hlcmUKKyAqIHdlIGFyZSByZWFkaW5nIGZyb20gb25lIHBhcnQgb2YgdGhlIGRpcmVjdG9yeSwgYW5kIGluc2VydGluZyBpbnRvCisgKiB0aGUgZnJvbnQgaGFsZi4gIFNvIHRoZSBhbGdvcml0aG0gd2lsbCBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgYQorICogbW92aW5nIGJsb2NrIGJvdW5kYXJ5IGJldHdlZW4gdGhlIG5ldyB0cmVlIGFuZCB0aGUgb2xkIHRyZWUsIGFuZAorICogZmlsZXMgd2lsbCBuZWVkIHRvIGJlIG1vdmVkIGZyb20gdGhlIG9sZCBkaXJlY3RvcnkgYW5kIGluc2VydGVkCisgKiBpbnRvIHRoZSBuZXcgdHJlZS4gIElmIHRoZSBuZXcgZGlyZWN0b3J5IHJlcXVpcmVzIHNwYWNlIHdoaWNoIGlzbid0CisgKiB5ZXQgYXZhaWxhYmxlLCBibG9ja3MgZnJvbSB0aGUgYmVnaW5uaW5nIHBhcnQgb2YgdGhlIG9sZCBkaXJlY3RvcnkKKyAqIG1heSBuZWVkIHRvIGJlIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeSB0byBtYWtlIHJvb20gZm9yCisgKiB0aGUgbmV3IHRyZWU6CisgKgorICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgIHwgIG5ldyB0cmVlICAgfCAgICAgICAgfCBvbGQgdHJlZSAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICBeIHB0ciAgICBecHRyCisgKiAgICAgICAgICAgICAgICB0YWlsIG5ldyAgIGhlYWQgb2xkCisgKgorICogVGhpcyBpcyBnb2luZyB0byBiZSBhIHBhaW4gaW4gdGhlIHR1Y2t1cyB0byBpbXBsZW1lbnQsIGFuZCB3aWxsCisgKiByZXF1aXJlIGEgbG90IG1vcmUgZGlzayBhY2Nlc3Nlcy4gIFNvIEknbSBnb2luZyB0byBza2lwIGl0IGZvciBub3c7CisgKiBpdCdzIG9ubHkgcmVhbGx5IGdvaW5nIHRvIGJlIGFuIGlzc3VlIGZvciByZWFsbHksIHJlYWxseSBiaWcKKyAqIGZpbGVzeXN0ZW1zICh3aGVuIHdlIHJlYWNoIHRoZSBsZXZlbCBvZiB0ZW5zIG9mIG1pbGxpb25zIG9mIGZpbGVzCisgKiBpbiBhIHNpbmdsZSBkaXJlY3RvcnkpLiAgSXQgd2lsbCBwcm9iYWJseSBiZSBlYXNpZXIgdG8gc2ltcGx5CisgKiByZXF1aXJlIHRoYXQgZTJmc2NrIHVzZSBWTSBmaXJzdC4KKyAqLworCitzdHJ1Y3QgZmlsbF9kaXJfc3RydWN0IHsKKwljaGFyICpidWY7CisJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlOworCWludCBlcnI7CisJZTJmc2NrX3QgY3R4OworCXN0cnVjdCBoYXNoX2VudHJ5ICpoYXJyYXk7CisJaW50IG1heF9hcnJheSwgbnVtX2FycmF5OworCWludCBkaXJfc2l6ZTsKKwlpbnQgY29tcHJlc3M7CisJaW5vX3QgcGFyZW50OworfTsKKworc3RydWN0IGhhc2hfZW50cnkgeworCWV4dDJfZGlyaGFzaF90ICBoYXNoOworCWV4dDJfZGlyaGFzaF90ICBtaW5vcl9oYXNoOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAgICpkaXI7Cit9OworCitzdHJ1Y3Qgb3V0X2RpciB7CisJaW50ICAgICAgICAgICAgIG51bTsKKwlpbnQgICAgICAgICAgICAgbWF4OworCWNoYXIgICAgICAgICAgICAqYnVmOworCWV4dDJfZGlyaGFzaF90ICAqaGFzaGVzOworfTsKKworc3RhdGljIGludCBmaWxsX2Rpcl9ibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCSAgYmxrX3QgKmJsb2NrX25yLAorCQkJICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCSAgYmxrX3QgcmVmX2Jsb2NrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgIGludCByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZmlsbF9kaXJfc3RydWN0ICAqZmQgPSAoc3RydWN0IGZpbGxfZGlyX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJc3RydWN0IGhhc2hfZW50cnkgICAgICAgKm5ld19hcnJheSwgKmVudDsKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgICAqZGlyZW50OworCWNoYXIgICAgICAgICAgICAgICAgICAgICpkaXI7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgb2Zmc2V0LCBkaXJfb2Zmc2V0OworCisJaWYgKGJsb2NrY250IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlvZmZzZXQgPSBibG9ja2NudCAqIGZzLT5ibG9ja3NpemU7CisJaWYgKG9mZnNldCArIGZzLT5ibG9ja3NpemUgPiBmZC0+aW5vZGUtPmlfc2l6ZSkgeworCQlmZC0+ZXJyID0gRVhUMl9FVF9ESVJfQ09SUlVQVEVEOworCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCWRpciA9IChmZC0+YnVmK29mZnNldCk7CisJaWYgKEhPTEVfQkxLQUREUigqYmxvY2tfbnIpKSB7CisJCW1lbXNldChkaXIsIDAsIGZzLT5ibG9ja3NpemUpOworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGRpcjsKKwkJZGlyZW50LT5yZWNfbGVuID0gZnMtPmJsb2Nrc2l6ZTsKKwl9IGVsc2UgeworCQlmZC0+ZXJyID0gZXh0MmZzX3JlYWRfZGlyX2Jsb2NrKGZzLCAqYmxvY2tfbnIsIGRpcik7CisJCWlmIChmZC0+ZXJyKQorCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwkvKiBXaGlsZSB0aGUgZGlyZWN0b3J5IGJsb2NrIGlzICJob3QiLCBpbmRleCBpdC4gKi8KKwlkaXJfb2Zmc2V0ID0gMDsKKwl3aGlsZSAoZGlyX29mZnNldCA8IGZzLT5ibG9ja3NpemUpIHsKKwkJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSAoZGlyICsgZGlyX29mZnNldCk7CisJCWlmICgoKGRpcl9vZmZzZXQgKyBkaXJlbnQtPnJlY19sZW4pID4gZnMtPmJsb2Nrc2l6ZSkgfHwKKwkJICAgIChkaXJlbnQtPnJlY19sZW4gPCA4KSB8fAorCQkgICAgKChkaXJlbnQtPnJlY19sZW4gJSA0KSAhPSAwKSB8fAorCQkgICAgKCgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpKzgpID4gZGlyZW50LT5yZWNfbGVuKSkgeworCQkJZmQtPmVyciA9IEVYVDJfRVRfRElSX0NPUlJVUFRFRDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCQlkaXJfb2Zmc2V0ICs9IGRpcmVudC0+cmVjX2xlbjsKKwkJaWYgKGRpcmVudC0+aW5vZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWZkLT5jb21wcmVzcyAmJiAoKGRpcmVudC0+bmFtZV9sZW4mMHhGRikgPT0gMSkgJiYKKwkJICAgIChkaXJlbnQtPm5hbWVbMF0gPT0gJy4nKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWZkLT5jb21wcmVzcyAmJiAoKGRpcmVudC0+bmFtZV9sZW4mMHhGRikgPT0gMikgJiYKKwkJICAgIChkaXJlbnQtPm5hbWVbMF0gPT0gJy4nKSAmJiAoZGlyZW50LT5uYW1lWzFdID09ICcuJykpIHsKKwkJCWZkLT5wYXJlbnQgPSBkaXJlbnQtPmlub2RlOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZkLT5udW1fYXJyYXkgPj0gZmQtPm1heF9hcnJheSkgeworCQkJbmV3X2FycmF5ID0geHJlYWxsb2MoZmQtPmhhcnJheSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpICogKGZkLT5tYXhfYXJyYXkrNTAwKSk7CisJCQlmZC0+aGFycmF5ID0gbmV3X2FycmF5OworCQkJZmQtPm1heF9hcnJheSArPSA1MDA7CisJCX0KKwkJZW50ID0gZmQtPmhhcnJheSArIGZkLT5udW1fYXJyYXkrKzsKKwkJZW50LT5kaXIgPSBkaXJlbnQ7CisJCWZkLT5kaXJfc2l6ZSArPSBFWFQyX0RJUl9SRUNfTEVOKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKTsKKwkJaWYgKGZkLT5jb21wcmVzcykKKwkJCWVudC0+aGFzaCA9IGVudC0+bWlub3JfaGFzaCA9IDA7CisJCWVsc2UgeworCQkJZmQtPmVyciA9IGV4dDJmc19kaXJoYXNoKGZzLT5zdXBlci0+c19kZWZfaGFzaF92ZXJzaW9uLAorCQkJCQkJIGRpcmVudC0+bmFtZSwKKwkJCQkJCSBkaXJlbnQtPm5hbWVfbGVuICYgMHhGRiwKKwkJCQkJCSBmcy0+c3VwZXItPnNfaGFzaF9zZWVkLAorCQkJCQkJICZlbnQtPmhhc2gsICZlbnQtPm1pbm9yX2hhc2gpOworCQkJaWYgKGZkLT5lcnIpCisJCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFVzZWQgZm9yIHNvcnRpbmcgdGhlIGhhc2ggZW50cnkgKi8KK3N0YXRpYyBpbnQgbmFtZV9jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgaGFzaF9lbnRyeSAqaGVfYSA9IChjb25zdCBzdHJ1Y3QgaGFzaF9lbnRyeSAqKSBhOworCWNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICpoZV9iID0gKGNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICopIGI7CisJaW50ICAgICByZXQ7CisJaW50ICAgICBtaW5fbGVuOworCisJbWluX2xlbiA9IGhlX2EtPmRpci0+bmFtZV9sZW47CisJaWYgKG1pbl9sZW4gPiBoZV9iLT5kaXItPm5hbWVfbGVuKQorCQltaW5fbGVuID0gaGVfYi0+ZGlyLT5uYW1lX2xlbjsKKworCXJldCA9IHN0cm5jbXAoaGVfYS0+ZGlyLT5uYW1lLCBoZV9iLT5kaXItPm5hbWUsIG1pbl9sZW4pOworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoaGVfYS0+ZGlyLT5uYW1lX2xlbiA+IGhlX2ItPmRpci0+bmFtZV9sZW4pCisJCQlyZXQgPSAxOworCQllbHNlIGlmIChoZV9hLT5kaXItPm5hbWVfbGVuIDwgaGVfYi0+ZGlyLT5uYW1lX2xlbikKKwkJCXJldCA9IC0xOworCQllbHNlCisJCQlyZXQgPSBoZV9iLT5kaXItPmlub2RlIC0gaGVfYS0+ZGlyLT5pbm9kZTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogVXNlZCBmb3Igc29ydGluZyB0aGUgaGFzaCBlbnRyeSAqLworc3RhdGljIGludCBoYXNoX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICpoZV9hID0gKGNvbnN0IHN0cnVjdCBoYXNoX2VudHJ5ICopIGE7CisJY29uc3Qgc3RydWN0IGhhc2hfZW50cnkgKmhlX2IgPSAoY29uc3Qgc3RydWN0IGhhc2hfZW50cnkgKikgYjsKKwlpbnQgICAgIHJldDsKKworCWlmIChoZV9hLT5oYXNoID4gaGVfYi0+aGFzaCkKKwkJcmV0ID0gMTsKKwllbHNlIGlmIChoZV9hLT5oYXNoIDwgaGVfYi0+aGFzaCkKKwkJcmV0ID0gLTE7CisJZWxzZSB7CisJCWlmIChoZV9hLT5taW5vcl9oYXNoID4gaGVfYi0+bWlub3JfaGFzaCkKKwkJCXJldCA9IDE7CisJCWVsc2UgaWYgKGhlX2EtPm1pbm9yX2hhc2ggPCBoZV9iLT5taW5vcl9oYXNoKQorCQkJcmV0ID0gLTE7CisJCWVsc2UKKwkJCXJldCA9IG5hbWVfY21wKGEsIGIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZXJyY29kZV90IGFsbG9jX3NpemVfZGlyKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3Qgb3V0X2RpciAqb3V0ZGlyLAorCQkJCWludCBibG9ja3MpCit7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgKm5ld19tZW07CisKKwlpZiAob3V0ZGlyLT5tYXgpIHsKKwkJbmV3X21lbSA9IHhyZWFsbG9jKG91dGRpci0+YnVmLCBibG9ja3MgKiBmcy0+YmxvY2tzaXplKTsKKwkJb3V0ZGlyLT5idWYgPSBuZXdfbWVtOworCQluZXdfbWVtID0geHJlYWxsb2Mob3V0ZGlyLT5oYXNoZXMsCisJCQkJICBibG9ja3MgKiBzaXplb2YoZXh0Ml9kaXJoYXNoX3QpKTsKKwkJb3V0ZGlyLT5oYXNoZXMgPSBuZXdfbWVtOworCX0gZWxzZSB7CisJCW91dGRpci0+YnVmID0geG1hbGxvYyhibG9ja3MgKiBmcy0+YmxvY2tzaXplKTsKKwkJb3V0ZGlyLT5oYXNoZXMgPSB4bWFsbG9jKGJsb2NrcyAqIHNpemVvZihleHQyX2Rpcmhhc2hfdCkpOworCQlvdXRkaXItPm51bSA9IDA7CisJfQorCW91dGRpci0+bWF4ID0gYmxvY2tzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX291dF9kaXIoc3RydWN0IG91dF9kaXIgKm91dGRpcikKK3sKKwlmcmVlKG91dGRpci0+YnVmKTsKKwlmcmVlKG91dGRpci0+aGFzaGVzKTsKKwlvdXRkaXItPm1heCA9IDA7CisJb3V0ZGlyLT5udW0gPTA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgZ2V0X25leHRfYmxvY2soZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBvdXRfZGlyICpvdXRkaXIsCisJCQkgY2hhciAqKiByZXQpCit7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKworCWlmIChvdXRkaXItPm51bSA+PSBvdXRkaXItPm1heCkgeworCQlyZXR2YWwgPSBhbGxvY19zaXplX2Rpcihmcywgb3V0ZGlyLCBvdXRkaXItPm1heCArIDUwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCSpyZXQgPSBvdXRkaXItPmJ1ZiArIChvdXRkaXItPm51bSsrICogZnMtPmJsb2Nrc2l6ZSk7CisJbWVtc2V0KCpyZXQsIDAsIGZzLT5ibG9ja3NpemUpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1ha2UgYSB1bmlxdWUgZmlsZW5hbWUuICBXZSBkbyB0aGlzIGJ5CisgKiBhcHBlbmRpbmcgfjAsIGFuZCB0aGVuIGluY3JlbWVudGluZyB0aGUgbnVtYmVyLiAgSG93ZXZlciwgd2UgY2Fubm90CisgKiBleHBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZW5hbWUgYmV5b25kIHRoZSBwYWRkaW5nIGF2YWlsYWJsZSBpbgorICogdGhlIGRpcmVjdG9yeSBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQgbXV0YXRlX25hbWUoY2hhciAqc3RyLCBfX3UxNiAqbGVuKQoreworCWludCAgICAgaTsKKwlfX3UxNiAgIGwgPSAqbGVuICYgMHhGRiwgaCA9ICpsZW4gJiAweGZmMDA7CisKKwkvKgorCSAqIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpdCBsb29rcyB0aGUgbmFtZSBoYXMgYmVlbiBtdXRhdGVkCisJICogYWxyZWFkeQorCSAqLworCWZvciAoaSA9IGwtMTsgaSA+IDA7IGktLSkgeworCQlpZiAoIWlzZGlnaXQoc3RyW2ldKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoKGkgPT0gbC0xKSB8fCAoc3RyW2ldICE9ICd+JykpIHsKKwkJaWYgKCgobC0xKSAmIDMpIDwgMikKKwkJCWwgKz0gMjsKKwkJZWxzZQorCQkJbCA9IChsKzMpICYgfjM7CisJCXN0cltsLTJdID0gJ34nOworCQlzdHJbbC0xXSA9ICcwJzsKKwkJKmxlbiA9IGwgfCBoOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IGwtMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGlzZGlnaXQoc3RyW2ldKSkgeworCQkJaWYgKHN0cltpXSA9PSAnOScpCisJCQkJc3RyW2ldID0gJzAnOworCQkJZWxzZSB7CisJCQkJc3RyW2ldKys7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGkgPT0gMSkgeworCQkJaWYgKHN0clswXSA9PSAneicpCisJCQkJc3RyWzBdID0gJ0EnOworCQkJZWxzZSBpZiAoc3RyWzBdID09ICdaJykgeworCQkJCXN0clswXSA9ICd+JzsKKwkJCQlzdHJbMV0gPSAnMCc7CisJCQl9IGVsc2UKKwkJCQlzdHJbMF0rKzsKKwkJfSBlbHNlIGlmIChpID4gMCkgeworCQkJc3RyW2ldID0gJzEnOworCQkJc3RyW2ktMV0gPSAnfic7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RyWzBdID09ICd+JykKKwkJCQlzdHJbMF0gPSAnYSc7CisJCQllbHNlCisJCQkJc3RyWzBdKys7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGR1cGxpY2F0ZV9zZWFyY2hfYW5kX2ZpeChlMmZzY2tfdCBjdHgsIGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICBleHQyX2lub190IGlubywKKwkJCQkgICAgc3RydWN0IGZpbGxfZGlyX3N0cnVjdCAqZmQpCit7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCAgcGN0eDsKKwlzdHJ1Y3QgaGFzaF9lbnRyeSAgICAgICAqZW50LCAqcHJldjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpLCBqOworCWludCAgICAgICAgICAgICAgICAgICAgIGZpeGVkID0gMDsKKwljaGFyICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZVsyNTZdOworCV9fdTE2ICAgICAgICAgICAgICAgICAgIG5ld19sZW47CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCXBjdHguaW5vID0gaW5vOworCisJZm9yIChpPTE7IGkgPCBmZC0+bnVtX2FycmF5OyBpKyspIHsKKwkJZW50ID0gZmQtPmhhcnJheSArIGk7CisJCXByZXYgPSBlbnQgLSAxOworCQlpZiAoIWVudC0+ZGlyLT5pbm9kZSB8fAorCQkgICAgKChlbnQtPmRpci0+bmFtZV9sZW4gJiAweEZGKSAhPQorCQkgICAgIChwcmV2LT5kaXItPm5hbWVfbGVuICYgMHhGRikpIHx8CisJCSAgICAoc3RybmNtcChlbnQtPmRpci0+bmFtZSwgcHJldi0+ZGlyLT5uYW1lLAorCQkJICAgICBlbnQtPmRpci0+bmFtZV9sZW4gJiAweEZGKSkpCisJCQljb250aW51ZTsKKwkJcGN0eC5kaXJlbnQgPSBlbnQtPmRpcjsKKwkJaWYgKChlbnQtPmRpci0+aW5vZGUgPT0gcHJldi0+ZGlyLT5pbm9kZSkgJiYKKwkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMl9EVVBMSUNBVEVfRElSRU5ULCAmcGN0eCkpIHsKKwkJCWUyZnNja19hZGp1c3RfaW5vZGVfY291bnQoY3R4LCBlbnQtPmRpci0+aW5vZGUsIC0xKTsKKwkJCWVudC0+ZGlyLT5pbm9kZSA9IDA7CisJCQlmaXhlZCsrOworCQkJY29udGludWU7CisJCX0KKwkJbWVtY3B5KG5ld19uYW1lLCBlbnQtPmRpci0+bmFtZSwgZW50LT5kaXItPm5hbWVfbGVuICYgMHhGRik7CisJCW5ld19sZW4gPSBlbnQtPmRpci0+bmFtZV9sZW47CisJCW11dGF0ZV9uYW1lKG5ld19uYW1lLCAmbmV3X2xlbik7CisJCWZvciAoaj0wOyBqIDwgZmQtPm51bV9hcnJheTsgaisrKSB7CisJCQlpZiAoKGk9PWopIHx8CisJCQkgICAgKChlbnQtPmRpci0+bmFtZV9sZW4gJiAweEZGKSAhPQorCQkJICAgICAoZmQtPmhhcnJheVtqXS5kaXItPm5hbWVfbGVuICYgMHhGRikpIHx8CisJCQkgICAgKHN0cm5jbXAobmV3X25hbWUsIGZkLT5oYXJyYXlbal0uZGlyLT5uYW1lLAorCQkJCSAgICAgbmV3X2xlbiAmIDB4RkYpKSkKKwkJCQljb250aW51ZTsKKwkJCW11dGF0ZV9uYW1lKG5ld19uYW1lLCAmbmV3X2xlbik7CisKKwkJCWogPSAtMTsKKwkJfQorCQluZXdfbmFtZVtuZXdfbGVuICYgMHhGRl0gPSAwOworCQlwY3R4LnN0ciA9IG5ld19uYW1lOworCQlpZiAoZml4X3Byb2JsZW0oY3R4LCBQUl8yX05PTl9VTklRVUVfRklMRSwgJnBjdHgpKSB7CisJCQltZW1jcHkoZW50LT5kaXItPm5hbWUsIG5ld19uYW1lLCBuZXdfbGVuICYgMHhGRik7CisJCQllbnQtPmRpci0+bmFtZV9sZW4gPSBuZXdfbGVuOworCQkJZXh0MmZzX2Rpcmhhc2goZnMtPnN1cGVyLT5zX2RlZl9oYXNoX3ZlcnNpb24sCisJCQkJICAgICAgIGVudC0+ZGlyLT5uYW1lLAorCQkJCSAgICAgICBlbnQtPmRpci0+bmFtZV9sZW4gJiAweEZGLAorCQkJCSAgICAgICBmcy0+c3VwZXItPnNfaGFzaF9zZWVkLAorCQkJCSAgICAgICAmZW50LT5oYXNoLCAmZW50LT5taW5vcl9oYXNoKTsKKwkJCWZpeGVkKys7CisJCX0KKwl9CisJcmV0dXJuIGZpeGVkOworfQorCisKK3N0YXRpYyBlcnJjb2RlX3QgY29weV9kaXJfZW50cmllcyhleHQyX2ZpbHN5cyBmcywKKwkJCQkgIHN0cnVjdCBmaWxsX2Rpcl9zdHJ1Y3QgKmZkLAorCQkJCSAgc3RydWN0IG91dF9kaXIgKm91dGRpcikKK3sKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJY2hhciAgICAgICAgICAgICAgICAgICAgKmJsb2NrX3N0YXJ0OworCXN0cnVjdCBoYXNoX2VudHJ5ICAgICAgICplbnQ7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICAgKmRpcmVudDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpLCByZWNfbGVuLCBsZWZ0OworCWV4dDJfZGlyaGFzaF90ICAgICAgICAgIHByZXZfaGFzaDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisKKwlvdXRkaXItPm1heCA9IDA7CisJcmV0dmFsID0gYWxsb2Nfc2l6ZV9kaXIoZnMsIG91dGRpciwKKwkJCQkoZmQtPmRpcl9zaXplIC8gZnMtPmJsb2Nrc2l6ZSkgKyAyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW91dGRpci0+bnVtID0gZmQtPmNvbXByZXNzID8gMCA6IDE7CisJb2Zmc2V0ID0gMDsKKwlvdXRkaXItPmhhc2hlc1swXSA9IDA7CisJcHJldl9oYXNoID0gMTsKKwlpZiAoKHJldHZhbCA9IGdldF9uZXh0X2Jsb2NrKGZzLCBvdXRkaXIsICZibG9ja19zdGFydCkpKQorCQlyZXR1cm4gcmV0dmFsOworCWRpcmVudCA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgYmxvY2tfc3RhcnQ7CisJbGVmdCA9IGZzLT5ibG9ja3NpemU7CisJZm9yIChpPTA7IGkgPCBmZC0+bnVtX2FycmF5OyBpKyspIHsKKwkJZW50ID0gZmQtPmhhcnJheSArIGk7CisJCWlmIChlbnQtPmRpci0+aW5vZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlyZWNfbGVuID0gRVhUMl9ESVJfUkVDX0xFTihlbnQtPmRpci0+bmFtZV9sZW4gJiAweEZGKTsKKwkJaWYgKHJlY19sZW4gPiBsZWZ0KSB7CisJCQlpZiAobGVmdCkKKwkJCQlkaXJlbnQtPnJlY19sZW4gKz0gbGVmdDsKKwkJCWlmICgocmV0dmFsID0gZ2V0X25leHRfYmxvY2soZnMsIG91dGRpciwKKwkJCQkJCSAgICAgICZibG9ja19zdGFydCkpKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlvZmZzZXQgPSAwOworCQl9CisJCWxlZnQgPSBmcy0+YmxvY2tzaXplIC0gb2Zmc2V0OworCQlkaXJlbnQgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIChibG9ja19zdGFydCArIG9mZnNldCk7CisJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJaWYgKGVudC0+aGFzaCA9PSBwcmV2X2hhc2gpCisJCQkJb3V0ZGlyLT5oYXNoZXNbb3V0ZGlyLT5udW0tMV0gPSBlbnQtPmhhc2ggfCAxOworCQkJZWxzZQorCQkJCW91dGRpci0+aGFzaGVzW291dGRpci0+bnVtLTFdID0gZW50LT5oYXNoOworCQl9CisJCWRpcmVudC0+aW5vZGUgPSBlbnQtPmRpci0+aW5vZGU7CisJCWRpcmVudC0+bmFtZV9sZW4gPSBlbnQtPmRpci0+bmFtZV9sZW47CisJCWRpcmVudC0+cmVjX2xlbiA9IHJlY19sZW47CisJCW1lbWNweShkaXJlbnQtPm5hbWUsIGVudC0+ZGlyLT5uYW1lLCBkaXJlbnQtPm5hbWVfbGVuICYgMHhGRik7CisJCW9mZnNldCArPSByZWNfbGVuOworCQlsZWZ0IC09IHJlY19sZW47CisJCWlmIChsZWZ0IDwgMTIpIHsKKwkJCWRpcmVudC0+cmVjX2xlbiArPSBsZWZ0OworCQkJb2Zmc2V0ICs9IGxlZnQ7CisJCQlsZWZ0ID0gMDsKKwkJfQorCQlwcmV2X2hhc2ggPSBlbnQtPmhhc2g7CisJfQorCWlmIChsZWZ0KQorCQlkaXJlbnQtPnJlY19sZW4gKz0gbGVmdDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gKnNldF9yb290X25vZGUoZXh0Ml9maWxzeXMgZnMsIGNoYXIgKmJ1ZiwKKwkJCQkgICAgZXh0Ml9pbm9fdCBpbm8sIGV4dDJfaW5vX3QgcGFyZW50KQoreworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAgICAgICAgICAgKmRpcjsKKwlzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gICAgICAgICpyb290OworCXN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgICAgICAgKmxpbWl0czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlID0gMDsKKworCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkKKwkJZmlsZXR5cGUgPSBFWFQyX0ZUX0RJUiA8PCA4OworCisJbWVtc2V0KGJ1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJZGlyID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSBidWY7CisJZGlyLT5pbm9kZSA9IGlubzsKKwlkaXItPm5hbWVbMF0gPSAnLic7CisJZGlyLT5uYW1lX2xlbiA9IDEgfCBmaWxldHlwZTsKKwlkaXItPnJlY19sZW4gPSAxMjsKKwlkaXIgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIChidWYgKyAxMik7CisJZGlyLT5pbm9kZSA9IHBhcmVudDsKKwlkaXItPm5hbWVbMF0gPSAnLic7CisJZGlyLT5uYW1lWzFdID0gJy4nOworCWRpci0+bmFtZV9sZW4gPSAyIHwgZmlsZXR5cGU7CisJZGlyLT5yZWNfbGVuID0gZnMtPmJsb2Nrc2l6ZSAtIDEyOworCisJcm9vdCA9IChzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8gKikgKGJ1ZisyNCk7CisJcm9vdC0+cmVzZXJ2ZWRfemVybyA9IDA7CisJcm9vdC0+aGFzaF92ZXJzaW9uID0gZnMtPnN1cGVyLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJcm9vdC0+aW5mb19sZW5ndGggPSA4OworCXJvb3QtPmluZGlyZWN0X2xldmVscyA9IDA7CisJcm9vdC0+dW51c2VkX2ZsYWdzID0gMDsKKworCWxpbWl0cyA9IChzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0ICopIChidWYrMzIpOworCWxpbWl0cy0+bGltaXQgPSAoZnMtPmJsb2Nrc2l6ZSAtIDMyKSAvIHNpemVvZihzdHJ1Y3QgZXh0Ml9keF9lbnRyeSk7CisJbGltaXRzLT5jb3VudCA9IDA7CisKKwlyZXR1cm4gcm9vdDsKK30KKworCitzdGF0aWMgc3RydWN0IGV4dDJfZHhfZW50cnkgKnNldF9pbnRfbm9kZShleHQyX2ZpbHN5cyBmcywgY2hhciAqYnVmKQoreworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAgICAgICAgICAgKmRpcjsKKwlzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0ICAgICAgICpsaW1pdHM7CisKKwltZW1zZXQoYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwlkaXIgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIGJ1ZjsKKwlkaXItPmlub2RlID0gMDsKKwlkaXItPnJlY19sZW4gPSBmcy0+YmxvY2tzaXplOworCisJbGltaXRzID0gKHN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgKikgKGJ1Zis4KTsKKwlsaW1pdHMtPmxpbWl0ID0gKGZzLT5ibG9ja3NpemUgLSA4KSAvIHNpemVvZihzdHJ1Y3QgZXh0Ml9keF9lbnRyeSk7CisJbGltaXRzLT5jb3VudCA9IDA7CisKKwlyZXR1cm4gKHN0cnVjdCBleHQyX2R4X2VudHJ5ICopIGxpbWl0czsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGxlYWYgbm9kZXMgd2hpY2ggaGF2ZSBiZWVuIHdyaXR0ZW4gaW4KKyAqIG91dGRpciwgYW5kIHBvcHVsYXRlcyB0aGUgcm9vdCBub2RlIGFuZCBhbnkgbmVjZXNzYXJ5IGludGVyaW9yIG5vZGVzLgorICovCitzdGF0aWMgZXJyY29kZV90IGNhbGN1bGF0ZV90cmVlKGV4dDJfZmlsc3lzIGZzLAorCQkJCXN0cnVjdCBvdXRfZGlyICpvdXRkaXIsCisJCQkJZXh0Ml9pbm9fdCBpbm8sCisJCQkJZXh0Ml9pbm9fdCBwYXJlbnQpCit7CisJc3RydWN0IGV4dDJfZHhfcm9vdF9pbmZvICAgICAgICAqcm9vdF9pbmZvOworCXN0cnVjdCBleHQyX2R4X2VudHJ5ICAgICAgICAgICAgKnJvb3QsICpkeF9lbnQgPSBOVUxMOworCXN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgICAgICAgKnJvb3RfbGltaXQsICpsaW1pdDsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmxvY2tfc3RhcnQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBjMSwgYzIsIG5ibGtzOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRfb2Zmc2V0LCByb290X29mZnNldDsKKworCXJvb3RfaW5mbyA9IHNldF9yb290X25vZGUoZnMsIG91dGRpci0+YnVmLCBpbm8sIHBhcmVudCk7CisJcm9vdF9vZmZzZXQgPSBsaW1pdF9vZmZzZXQgPSAoKGNoYXIgKikgcm9vdF9pbmZvIC0gb3V0ZGlyLT5idWYpICsKKwkJcm9vdF9pbmZvLT5pbmZvX2xlbmd0aDsKKwlyb290X2xpbWl0ID0gKHN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgKikgKG91dGRpci0+YnVmICsgbGltaXRfb2Zmc2V0KTsKKwljMSA9IHJvb3RfbGltaXQtPmxpbWl0OworCW5ibGtzID0gb3V0ZGlyLT5udW07CisKKwkvKiBXcml0ZSBvdXQgdGhlIHBvaW50ZXIgYmxvY2tzICovCisJaWYgKG5ibGtzLTEgPD0gYzEpIHsKKwkJLyogSnVzdCB3cml0ZSBvdXQgdGhlIHJvb3QgYmxvY2ssIGFuZCB3ZSdyZSBkb25lICovCisJCXJvb3QgPSAoc3RydWN0IGV4dDJfZHhfZW50cnkgKikgKG91dGRpci0+YnVmICsgcm9vdF9vZmZzZXQpOworCQlmb3IgKGk9MTsgaSA8IG5ibGtzOyBpKyspIHsKKwkJCXJvb3QtPmJsb2NrID0gZXh0MmZzX2NwdV90b19sZTMyKGkpOworCQkJaWYgKGkgIT0gMSkKKwkJCQlyb290LT5oYXNoID0KKwkJCQkJZXh0MmZzX2NwdV90b19sZTMyKG91dGRpci0+aGFzaGVzW2ldKTsKKwkJCXJvb3QrKzsKKwkJCWMxLS07CisJCX0KKwl9IGVsc2UgeworCQljMiA9IDA7CisJCWxpbWl0ID0gMDsKKwkJcm9vdF9pbmZvLT5pbmRpcmVjdF9sZXZlbHMgPSAxOworCQlmb3IgKGk9MTsgaSA8IG5ibGtzOyBpKyspIHsKKwkJCWlmIChjMSA9PSAwKQorCQkJCXJldHVybiBFTk9TUEM7CisJCQlpZiAoYzIgPT0gMCkgeworCQkJCWlmIChsaW1pdCkKKwkJCQkJbGltaXQtPmxpbWl0ID0gbGltaXQtPmNvdW50ID0KKwkJZXh0MmZzX2NwdV90b19sZTE2KGxpbWl0LT5saW1pdCk7CisJCQkJcm9vdCA9IChzdHJ1Y3QgZXh0Ml9keF9lbnRyeSAqKQorCQkJCQkob3V0ZGlyLT5idWYgKyByb290X29mZnNldCk7CisJCQkJcm9vdC0+YmxvY2sgPSBleHQyZnNfY3B1X3RvX2xlMzIob3V0ZGlyLT5udW0pOworCQkJCWlmIChpICE9IDEpCisJCQkJCXJvb3QtPmhhc2ggPQorCQkJZXh0MmZzX2NwdV90b19sZTMyKG91dGRpci0+aGFzaGVzW2ldKTsKKwkJCQlpZiAoKHJldHZhbCA9ICBnZXRfbmV4dF9ibG9jayhmcywgb3V0ZGlyLAorCQkJCQkJCSAgICAgICZibG9ja19zdGFydCkpKQorCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCWR4X2VudCA9IHNldF9pbnRfbm9kZShmcywgYmxvY2tfc3RhcnQpOworCQkJCWxpbWl0ID0gKHN0cnVjdCBleHQyX2R4X2NvdW50bGltaXQgKikgZHhfZW50OworCQkJCWMyID0gbGltaXQtPmxpbWl0OworCQkJCXJvb3Rfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZXh0Ml9keF9lbnRyeSk7CisJCQkJYzEtLTsKKwkJCX0KKwkJCWR4X2VudC0+YmxvY2sgPSBleHQyZnNfY3B1X3RvX2xlMzIoaSk7CisJCQlpZiAoYzIgIT0gbGltaXQtPmxpbWl0KQorCQkJCWR4X2VudC0+aGFzaCA9CisJCQkJCWV4dDJmc19jcHVfdG9fbGUzMihvdXRkaXItPmhhc2hlc1tpXSk7CisJCQlkeF9lbnQrKzsKKwkJCWMyLS07CisJCX0KKwkJbGltaXQtPmNvdW50ID0gZXh0MmZzX2NwdV90b19sZTE2KGxpbWl0LT5saW1pdCAtIGMyKTsKKwkJbGltaXQtPmxpbWl0ID0gZXh0MmZzX2NwdV90b19sZTE2KGxpbWl0LT5saW1pdCk7CisJfQorCXJvb3RfbGltaXQgPSAoc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCAqKSAob3V0ZGlyLT5idWYgKyBsaW1pdF9vZmZzZXQpOworCXJvb3RfbGltaXQtPmNvdW50ID0gZXh0MmZzX2NwdV90b19sZTE2KHJvb3RfbGltaXQtPmxpbWl0IC0gYzEpOworCXJvb3RfbGltaXQtPmxpbWl0ID0gZXh0MmZzX2NwdV90b19sZTE2KHJvb3RfbGltaXQtPmxpbWl0KTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgd3JpdGVfZGlyX3N0cnVjdCB7CisJc3RydWN0IG91dF9kaXIgKm91dGRpcjsKKwllcnJjb2RlX3QgICAgICAgZXJyOworCWUyZnNja190ICAgICAgICBjdHg7CisJaW50ICAgICAgICAgICAgIGNsZWFyZWQ7Cit9OworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIHdyaXRlcyBvdXQgYSBkaXJlY3RvcnkgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgYmxrX3QgICAgICAgICpibG9ja19uciwKKwkJCSAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgYmxrX3QgcmVmX2Jsb2NrIEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICBpbnQgcmVmX29mZnNldCBGU0NLX0FUVFIoKHVudXNlZCkpLAorCQkJICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCB3cml0ZV9kaXJfc3RydWN0ICp3ZCA9IChzdHJ1Y3Qgd3JpdGVfZGlyX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJYmxrX3QgICBibGs7CisJY2hhciAgICAqZGlyOworCisJaWYgKCpibG9ja19uciA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoYmxvY2tjbnQgPj0gd2QtPm91dGRpci0+bnVtKSB7CisJCWUyZnNja19yZWFkX2JpdG1hcHMod2QtPmN0eCk7CisJCWJsayA9ICpibG9ja19ucjsKKwkJZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXAod2QtPmN0eC0+YmxvY2tfZm91bmRfbWFwLCBibGspOworCQlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGJsaywgLTEpOworCQkqYmxvY2tfbnIgPSAwOworCQl3ZC0+Y2xlYXJlZCsrOworCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKKwl9CisJaWYgKGJsb2NrY250IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlkaXIgPSB3ZC0+b3V0ZGlyLT5idWYgKyAoYmxvY2tjbnQgKiBmcy0+YmxvY2tzaXplKTsKKwl3ZC0+ZXJyID0gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayhmcywgKmJsb2NrX25yLCBkaXIpOworCWlmICh3ZC0+ZXJyKQorCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3Qgd3JpdGVfZGlyZWN0b3J5KGUyZnNja190IGN0eCwgZXh0Ml9maWxzeXMgZnMsCisJCQkJIHN0cnVjdCBvdXRfZGlyICpvdXRkaXIsCisJCQkJIGV4dDJfaW5vX3QgaW5vLCBpbnQgY29tcHJlc3MpCit7CisJc3RydWN0IHdyaXRlX2Rpcl9zdHJ1Y3Qgd2Q7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAgICAgICBpbm9kZTsKKworCXJldHZhbCA9IGUyZnNja19leHBhbmRfZGlyZWN0b3J5KGN0eCwgaW5vLCAtMSwgb3V0ZGlyLT5udW0pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwl3ZC5vdXRkaXIgPSBvdXRkaXI7CisJd2QuZXJyID0gMDsKKwl3ZC5jdHggPSBjdHg7CisJd2QuY2xlYXJlZCA9IDA7CisKKwlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgMCwgMCwKKwkJCQkgICAgICAgd3JpdGVfZGlyX2Jsb2NrLCAmd2QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKHdkLmVycikKKwkJcmV0dXJuIHdkLmVycjsKKworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaW5vLCAmaW5vZGUsICJyZWhhc2hfZGlyIik7CisJaWYgKGNvbXByZXNzKQorCQlpbm9kZS5pX2ZsYWdzICY9IH5FWFQyX0lOREVYX0ZMOworCWVsc2UKKwkJaW5vZGUuaV9mbGFncyB8PSBFWFQyX0lOREVYX0ZMOworCWlub2RlLmlfc2l6ZSA9IG91dGRpci0+bnVtICogZnMtPmJsb2Nrc2l6ZTsKKwlpbm9kZS5pX2Jsb2NrcyAtPSAoZnMtPmJsb2Nrc2l6ZSAvIDUxMikgKiB3ZC5jbGVhcmVkOworCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgJmlub2RlLCAicmVoYXNoX2RpciIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX3JlaGFzaF9kaXIoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubykKK3sKKwlleHQyX2ZpbHN5cyAgICAgICAgICAgICBmcyA9IGN0eC0+ZnM7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgcmV0dmFsOworCXN0cnVjdCBleHQyX2lub2RlICAgICAgIGlub2RlOworCWNoYXIgICAgICAgICAgICAgICAgICAgICpkaXJfYnVmID0gTlVMTDsKKwlzdHJ1Y3QgZmlsbF9kaXJfc3RydWN0ICBmZDsKKwlzdHJ1Y3Qgb3V0X2RpciAgICAgICAgICBvdXRkaXI7CisKKwlvdXRkaXIubWF4ID0gb3V0ZGlyLm51bSA9IDA7CisJb3V0ZGlyLmJ1ZiA9IDA7CisJb3V0ZGlyLmhhc2hlcyA9IDA7CisJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgInJlaGFzaF9kaXIiKTsKKworCXJldHZhbCA9IEVOT01FTTsKKwlmZC5oYXJyYXkgPSAwOworCWRpcl9idWYgPSB4bWFsbG9jKGlub2RlLmlfc2l6ZSk7CisKKwlmZC5tYXhfYXJyYXkgPSBpbm9kZS5pX3NpemUgLyAzMjsKKwlmZC5udW1fYXJyYXkgPSAwOworCWZkLmhhcnJheSA9IHhtYWxsb2MoZmQubWF4X2FycmF5ICogc2l6ZW9mKHN0cnVjdCBoYXNoX2VudHJ5KSk7CisKKwlmZC5jdHggPSBjdHg7CisJZmQuYnVmID0gZGlyX2J1ZjsKKwlmZC5pbm9kZSA9ICZpbm9kZTsKKwlmZC5lcnIgPSAwOworCWZkLmRpcl9zaXplID0gMDsKKwlmZC5jb21wcmVzcyA9IDA7CisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpIHx8CisJICAgIChpbm9kZS5pX3NpemUgLyBmcy0+YmxvY2tzaXplKSA8IDIpCisJCWZkLmNvbXByZXNzID0gMTsKKwlmZC5wYXJlbnQgPSAwOworCisJLyogUmVhZCBpbiB0aGUgZW50aXJlIGRpcmVjdG9yeSBpbnRvIG1lbW9yeSAqLworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCAwLCAwLAorCQkJCSAgICAgICBmaWxsX2Rpcl9ibG9jaywgJmZkKTsKKwlpZiAoZmQuZXJyKSB7CisJCXJldHZhbCA9IGZkLmVycjsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJLyogU29ydCB0aGUgbGlzdCAqLworcmVzb3J0OgorCWlmIChmZC5jb21wcmVzcykKKwkJcXNvcnQoZmQuaGFycmF5KzIsIGZkLm51bV9hcnJheS0yLAorCQkgICAgICBzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpLCBuYW1lX2NtcCk7CisJZWxzZQorCQlxc29ydChmZC5oYXJyYXksIGZkLm51bV9hcnJheSwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBoYXNoX2VudHJ5KSwgaGFzaF9jbXApOworCisJLyoKKwkgKiBMb29rIGZvciBkdXBsaWNhdGVzCisJICovCisJaWYgKGR1cGxpY2F0ZV9zZWFyY2hfYW5kX2ZpeChjdHgsIGZzLCBpbm8sICZmZCkpCisJCWdvdG8gcmVzb3J0OworCisJaWYgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfTk8pIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBkaXJlY3RvcnkgZW50cmllcy4gIEluIGEgaHRyZWUgZGlyZWN0b3J5IHRoZXNlCisJICogd2lsbCBiZWNvbWUgdGhlIGxlYWYgbm9kZXMuCisJICovCisJcmV0dmFsID0gY29weV9kaXJfZW50cmllcyhmcywgJmZkLCAmb3V0ZGlyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworCWZyZWUoZGlyX2J1Zik7IGRpcl9idWYgPSAwOworCisJaWYgKCFmZC5jb21wcmVzcykgeworCQkvKiBDYWxjdWxhdGUgdGhlIGludGVyaW9yIG5vZGVzICovCisJCXJldHZhbCA9IGNhbGN1bGF0ZV90cmVlKGZzLCAmb3V0ZGlyLCBpbm8sIGZkLnBhcmVudCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwl9CisKKwlyZXR2YWwgPSB3cml0ZV9kaXJlY3RvcnkoY3R4LCBmcywgJm91dGRpciwgaW5vLCBmZC5jb21wcmVzcyk7CisKK2Vycm91dDoKKwlmcmVlKGRpcl9idWYpOworCWZyZWUoZmQuaGFycmF5KTsKKworCWZyZWVfb3V0X2Rpcigmb3V0ZGlyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGUyZnNja19yZWhhc2hfZGlyZWN0b3JpZXMoZTJmc2NrX3QgY3R4KQoreworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJc3RydWN0IGRpcl9pbmZvICAgICAgICAgKmRpcjsKKwlleHQyX3UzMl9pdGVyYXRlICAgICAgICBpdGVyOworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIGlubzsKKwllcnJjb2RlX3QgICAgICAgICAgICAgICByZXR2YWw7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaSwgY3VyLCBtYXgsIGFsbF9kaXJzLCBkaXJfaW5kZXgsIGZpcnN0ID0gMTsKKworCWFsbF9kaXJzID0gY3R4LT5vcHRpb25zICYgRTJGX09QVF9DT01QUkVTU19ESVJTOworCisJaWYgKCFjdHgtPmRpcnNfdG9faGFzaCAmJiAhYWxsX2RpcnMpCisJCXJldHVybjsKKworCWUyZnNja19nZXRfbG9zdF9hbmRfZm91bmQoY3R4LCAwKTsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlkaXJfaW5kZXggPSBjdHgtPmZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYOworCWN1ciA9IDA7CisJaWYgKGFsbF9kaXJzKSB7CisJCWkgPSAwOworCQltYXggPSBlMmZzY2tfZ2V0X251bV9kaXJpbmZvKGN0eCk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfYmVnaW4oY3R4LT5kaXJzX3RvX2hhc2gsCisJCQkJCQkgICAgICAgJml0ZXIpOworCQlpZiAocmV0dmFsKSB7CisJCQlwY3R4LmVycmNvZGUgPSByZXR2YWw7CisJCQlmaXhfcHJvYmxlbShjdHgsIFBSXzNBX09QVElNSVpFX0lURVIsICZwY3R4KTsKKwkJCXJldHVybjsKKwkJfQorCQltYXggPSBleHQyZnNfdTMyX2xpc3RfY291bnQoY3R4LT5kaXJzX3RvX2hhc2gpOworCX0KKwl3aGlsZSAoMSkgeworCQlpZiAoYWxsX2RpcnMpIHsKKwkJCWlmICgoZGlyID0gZTJmc2NrX2Rpcl9pbmZvX2l0ZXIoY3R4LCAmaSkpID09IDApCisJCQkJYnJlYWs7CisJCQlpbm8gPSBkaXItPmlubzsKKwkJfSBlbHNlIHsKKwkJCWlmICghZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGUoaXRlciwgJmlubykpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGlubyA9PSBjdHgtPmxvc3RfYW5kX2ZvdW5kKQorCQkJY29udGludWU7CisJCXBjdHguZGlyID0gaW5vOworCQlpZiAoZmlyc3QpIHsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM0FfUEFTU19IRUFERVIsICZwY3R4KTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCQlwY3R4LmVycmNvZGUgPSBlMmZzY2tfcmVoYXNoX2RpcihjdHgsIGlubyk7CisJCWlmIChwY3R4LmVycmNvZGUpIHsKKwkJCWVuZF9wcm9ibGVtX2xhdGNoKGN0eCwgUFJfTEFUQ0hfT1BUSU1JWkVfRElSKTsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfM0FfT1BUSU1JWkVfRElSX0VSUiwgJnBjdHgpOworCQl9CisJCWlmIChjdHgtPnByb2dyZXNzICYmICFjdHgtPnByb2dyZXNzX2ZkKQorCQkJZTJmc2NrX3NpbXBsZV9wcm9ncmVzcyhjdHgsICJSZWJ1aWxkaW5nIGRpcmVjdG9yeSIsCisJCQkgICAgICAgMTAwLjAgKiAoZmxvYXQpICgrK2N1cikgLyAoZmxvYXQpIG1heCwgaW5vKTsKKwl9CisJZW5kX3Byb2JsZW1fbGF0Y2goY3R4LCBQUl9MQVRDSF9PUFRJTUlaRV9ESVIpOworCWlmICghYWxsX2RpcnMpCisJCWV4dDJmc191MzJfbGlzdF9pdGVyYXRlX2VuZChpdGVyKTsKKworCWV4dDJmc191MzJfbGlzdF9mcmVlKGN0eC0+ZGlyc190b19oYXNoKTsKKwljdHgtPmRpcnNfdG9faGFzaCA9IDA7Cit9CisKKy8qCisgKiBsaW51eC9mcy9yZXZva2UuYworICoKKyAqIEpvdXJuYWwgcmV2b2tlIHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqCisgKiBSZXZva2UgaXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHByZXZlbnQgb2xkIGxvZyByZWNvcmRzIGZvciBkZWxldGVkCisgKiBtZXRhZGF0YSBmcm9tIGJlaW5nIHJlcGxheWVkIG9uIHRvcCBvZiBuZXdlciBkYXRhIHVzaW5nIHRoZSBzYW1lCisgKiBibG9ja3MuICBUaGUgcmV2b2tlIG1lY2hhbmlzbSBpcyB1c2VkIGluIHR3byBzZXBhcmF0ZSBwbGFjZXM6CisgKgorICogKyBDb21taXQ6IGR1cmluZyBjb21taXQgd2Ugd3JpdGUgdGhlIGVudGlyZSBsaXN0IG9mIHRoZSBjdXJyZW50CisgKiAgIHRyYW5zYWN0aW9uJ3MgcmV2b2tlZCBibG9ja3MgdG8gdGhlIGpvdXJuYWwKKyAqCisgKiArIFJlY292ZXJ5OiBkdXJpbmcgcmVjb3Zlcnkgd2UgcmVjb3JkIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiBhbGwKKyAqICAgcmV2b2tlZCBibG9ja3MuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmV2b2tlIHJlY29yZHMgaW4gdGhlIGxvZworICogICBmb3IgYSBzaW5nbGUgYmxvY2ssIG9ubHkgdGhlIGxhc3Qgb25lIGNvdW50cywgYW5kIGlmIHRoZXJlIGlzIGEgbG9nCisgKiAgIGVudHJ5IGZvciBhIGJsb2NrIGJleW9uZCB0aGUgbGFzdCByZXZva2UsIHRoZW4gdGhhdCBsb2cgZW50cnkgc3RpbGwKKyAqICAgZ2V0cyByZXBsYXllZC4KKyAqCisgKiBXZSBjYW4gZ2V0IGludGVyYWN0aW9ucyBiZXR3ZWVuIHJldm9rZXMgYW5kIG5ldyBsb2cgZGF0YSB3aXRoaW4gYQorICogc2luZ2xlIHRyYW5zYWN0aW9uOgorICoKKyAqIEJsb2NrIGlzIHJldm9rZWQgYW5kIHRoZW4gam91cm5hbGVkOgorICogICBUaGUgZGVzaXJlZCBlbmQgcmVzdWx0IGlzIHRoZSBqb3VybmFsaW5nIG9mIHRoZSBuZXcgYmxvY2ssIHNvIHdlCisgKiAgIGNhbmNlbCB0aGUgcmV2b2tlIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKyAqCisgKiBCbG9jayBpcyBqb3VybmFsZWQgYW5kIHRoZW4gcmV2b2tlZDoKKyAqICAgVGhlIHJldm9rZSBtdXN0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSB3cml0ZSBvZiB0aGUgYmxvY2ssIHNvIHdlCisgKiAgIG5lZWQgZWl0aGVyIHRvIGNhbmNlbCB0aGUgam91cm5hbCBlbnRyeSBvciB0byB3cml0ZSB0aGUgcmV2b2tlCisgKiAgIGxhdGVyIGluIHRoZSBsb2cgdGhhbiB0aGUgbG9nIGJsb2NrLiAgSW4gdGhpcyBjYXNlLCB3ZSBjaG9vc2UgdGhlCisgKiAgIGxhdHRlcjogam91cm5hbGluZyBhIGJsb2NrIGNhbmNlbHMgYW55IHJldm9rZSByZWNvcmQgZm9yIHRoYXQgYmxvY2sKKyAqICAgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHNvIGFueSByZXZva2UgZm9yIHRoYXQgYmxvY2sgaW4gdGhlCisgKiAgIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBoYXBwZW5lZCBhZnRlciB0aGUgYmxvY2sgd2FzIGpvdXJuYWxlZCBhbmQgc28KKyAqICAgdGhlIHJldm9rZSBtdXN0IHRha2UgcHJlY2VkZW5jZS4KKyAqCisgKiBCbG9jayBpcyByZXZva2VkIGFuZCB0aGVuIHdyaXR0ZW4gYXMgZGF0YToKKyAqICAgVGhlIGRhdGEgd3JpdGUgaXMgYWxsb3dlZCB0byBzdWNjZWVkLCBidXQgdGhlIHJldm9rZSBpcyBfbm90XworICogICBjYW5jZWxsZWQuICBXZSBzdGlsbCBuZWVkIHRvIHByZXZlbnQgb2xkIGxvZyByZWNvcmRzIGZyb20KKyAqICAgb3ZlcndyaXRpbmcgdGhlIG5ldyBkYXRhLiAgV2UgZG9uJ3QgZXZlbiBuZWVkIHRvIGNsZWFyIHRoZSByZXZva2UKKyAqICAgYml0IGhlcmUuCisgKgorICogUmV2b2tlIGluZm9ybWF0aW9uIG9uIGJ1ZmZlcnMgaXMgYSB0cmktc3RhdGUgdmFsdWU6CisgKgorICogUmV2b2tlVmFsaWQgY2xlYXI6ICAgbm8gY2FjaGVkIHJldm9rZSBzdGF0dXMsIG5lZWQgdG8gbG9vayBpdCB1cAorICogUmV2b2tlVmFsaWQgc2V0LCBSZXZva2VkIGNsZWFyOgorICogICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGhhcyBub3QgYmVlbiByZXZva2VkLCBhbmQgY2FuY2VsX3Jldm9rZQorICogICAgICAgICAgICAgICAgICAgICAgbmVlZCBkbyBub3RoaW5nLgorICogUmV2b2tlVmFsaWQgc2V0LCBSZXZva2VkIHNldDoKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBoYXMgYmVlbiByZXZva2VkLgorICovCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnJldm9rZV9yZWNvcmRfY2FjaGU7CitzdGF0aWMga21lbV9jYWNoZV90ICpyZXZva2VfdGFibGVfY2FjaGU7CisKKy8qIEVhY2ggcmV2b2tlIHJlY29yZCByZXByZXNlbnRzIG9uZSBzaW5nbGUgcmV2b2tlZCBibG9jay4gIER1cmluZworICAgam91cm5hbCByZXBsYXksIHRoaXMgaW52b2x2ZXMgcmVjb3JkaW5nIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUKKyAgIGxhc3QgdHJhbnNhY3Rpb24gdG8gcmV2b2tlIHRoaXMgYmxvY2suICovCisKK3N0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zCit7CisJc3RydWN0IGxpc3RfaGVhZCAgaGFzaDsKKwl0aWRfdCAgICAgICAgICAgICBzZXF1ZW5jZTsgICAgIC8qIFVzZWQgZm9yIHJlY292ZXJ5IG9ubHkgKi8KKwl1bnNpZ25lZCBsb25nICAgICBibG9ja25yOworfTsKKworCisvKiBUaGUgcmV2b2tlIHRhYmxlIGlzIGp1c3QgYSBzaW1wbGUgaGFzaCB0YWJsZSBvZiByZXZva2UgcmVjb3Jkcy4gKi8KK3N0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MKK3sKKwkvKiBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHdlIG1pZ2h0IHdhbnQgYSBsYXJnZXIgaGFzaCB0YWJsZQorCSAqIGZvciByZWNvdmVyeS4gIE11c3QgYmUgYSBwb3dlciBvZiB0d28uICovCisJaW50ICAgICAgICAgICAgICAgaGFzaF9zaXplOworCWludCAgICAgICAgICAgICAgIGhhc2hfc2hpZnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF90YWJsZTsKK307CisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFpbnRhaW4gdGhlIHJldm9rZSB0YWJsZSAqLworCisvKiBCb3Jyb3dlZCBmcm9tIGJ1ZmZlci5jOiB0aGlzIGlzIGEgdHJpZWQgYW5kIHRlc3RlZCBibG9jayBoYXNoIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGhhc2goam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGJsb2NrKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKnRhYmxlID0gam91cm5hbC0+al9yZXZva2U7CisJaW50IGhhc2hfc2hpZnQgPSB0YWJsZS0+aGFzaF9zaGlmdDsKKworCXJldHVybiAoKGJsb2NrIDw8IChoYXNoX3NoaWZ0IC0gNikpIF4KKwkJKGJsb2NrID4+IDEzKSBeCisJCShibG9jayA8PCAoaGFzaF9zaGlmdCAtIDEyKSkpICYgKHRhYmxlLT5oYXNoX3NpemUgLSAxKTsKK30KKworc3RhdGljIGludCBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGJsb2NrbnIsCisJCQkgICAgICB0aWRfdCBzZXEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9saXN0OworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwlyZWNvcmQgPSBrbWVtX2NhY2hlX2FsbG9jKHJldm9rZV9yZWNvcmRfY2FjaGUsIEdGUF9OT0ZTKTsKKwlpZiAoIXJlY29yZCkKKwkJZ290byBvb207CisKKwlyZWNvcmQtPnNlcXVlbmNlID0gc2VxOworCXJlY29yZC0+YmxvY2tuciA9IGJsb2NrbnI7CisJaGFzaF9saXN0ID0gJmpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlW2hhc2goam91cm5hbCwgYmxvY2tucildOworCWxpc3RfYWRkKCZyZWNvcmQtPmhhc2gsIGhhc2hfbGlzdCk7CisJcmV0dXJuIDA7CisKK29vbToKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogRmluZCBhIHJldm9rZSByZWNvcmQgaW4gdGhlIGpvdXJuYWwncyBoYXNoIHRhYmxlLiAqLworCitzdGF0aWMgc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKmZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrbnIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9saXN0OworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwloYXNoX2xpc3QgPSAmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaGFzaChqb3VybmFsLCBibG9ja25yKV07CisKKwlyZWNvcmQgPSAoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKikgaGFzaF9saXN0LT5uZXh0OworCXdoaWxlICgmKHJlY29yZC0+aGFzaCkgIT0gaGFzaF9saXN0KSB7CisJCWlmIChyZWNvcmQtPmJsb2NrbnIgPT0gYmxvY2tucikKKwkJCXJldHVybiByZWNvcmQ7CisJCXJlY29yZCA9IChzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqKSByZWNvcmQtPmhhc2gubmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBqb3VybmFsX2luaXRfcmV2b2tlX2NhY2hlcyh2b2lkKQoreworCXJldm9rZV9yZWNvcmRfY2FjaGUgPSBkb19jYWNoZV9jcmVhdGUoc2l6ZW9mKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zKSk7CisJaWYgKHJldm9rZV9yZWNvcmRfY2FjaGUgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXZva2VfdGFibGVfY2FjaGUgPSBkb19jYWNoZV9jcmVhdGUoc2l6ZW9mKHN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MpKTsKKwlpZiAocmV2b2tlX3RhYmxlX2NhY2hlID09IDApIHsKKwkJZG9fY2FjaGVfZGVzdHJveShyZXZva2VfcmVjb3JkX2NhY2hlKTsKKwkJcmV2b2tlX3JlY29yZF9jYWNoZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlX2NhY2hlcyh2b2lkKQoreworCWRvX2NhY2hlX2Rlc3Ryb3kocmV2b2tlX3JlY29yZF9jYWNoZSk7CisJcmV2b2tlX3JlY29yZF9jYWNoZSA9IDA7CisJZG9fY2FjaGVfZGVzdHJveShyZXZva2VfdGFibGVfY2FjaGUpOworCXJldm9rZV90YWJsZV9jYWNoZSA9IDA7Cit9CisKKy8qIEluaXRpYWxpc2UgdGhlIHJldm9rZSB0YWJsZSBmb3IgYSBnaXZlbiBqb3VybmFsIHRvIGEgZ2l2ZW4gc2l6ZS4gKi8KKworaW50IGpvdXJuYWxfaW5pdF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLCBpbnQgaGFzaF9zaXplKQoreworCWludCBzaGlmdCwgdG1wOworCisJam91cm5hbC0+al9yZXZva2UgPSBrbWVtX2NhY2hlX2FsbG9jKHJldm9rZV90YWJsZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3Jldm9rZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOworCisJc2hpZnQgPSAwOworCXRtcCA9IGhhc2hfc2l6ZTsKKwl3aGlsZSAoKHRtcCA+Pj0gMVVMKSAhPSAwVUwpCisJCXNoaWZ0Kys7CisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2hpZnQgPSBzaGlmdDsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlID0geG1hbGxvYyhoYXNoX3NpemUgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpOworCisJZm9yICh0bXAgPSAwOyB0bXAgPCBoYXNoX3NpemU7IHRtcCsrKQorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbdG1wXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVzdG95IGEgam91cm5hbCdzIHJldm9rZSB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGFscmVhZHkgYmUgZW1wdHkhICovCisKK3ZvaWQgam91cm5hbF9kZXN0cm95X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJc3RydWN0IGpiZF9yZXZva2VfdGFibGVfcyAqdGFibGU7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9saXN0OworCWludCBpOworCisJdGFibGUgPSBqb3VybmFsLT5qX3Jldm9rZTsKKwlpZiAoIXRhYmxlKQorCQlyZXR1cm47CisKKwlmb3IgKGk9MDsgaTx0YWJsZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnRhYmxlLT5oYXNoX3RhYmxlW2ldOworCX0KKworCWZyZWUodGFibGUtPmhhc2hfdGFibGUpOworCWZyZWUodGFibGUpOworCWpvdXJuYWwtPmpfcmV2b2tlID0gTlVMTDsKK30KKworLyoKKyAqIFJldm9rZSBzdXBwb3J0IGZvciByZWNvdmVyeS4KKyAqCisgKiBSZWNvdmVyeSBuZWVkcyB0byBiZSBhYmxlIHRvOgorICoKKyAqICByZWNvcmQgYWxsIHJldm9rZSByZWNvcmRzLCBpbmNsdWRpbmcgdGhlIHRpZCBvZiB0aGUgbGF0ZXN0IGluc3RhbmNlCisgKiAgb2YgZWFjaCByZXZva2UgaW4gdGhlIGpvdXJuYWwKKyAqCisgKiAgY2hlY2sgd2hldGhlciBhIGdpdmVuIGJsb2NrIGluIGEgZ2l2ZW4gdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHJlcGxheWVkCisgKiAgKGllLiBoYXMgbm90IGJlZW4gcmV2b2tlZCBieSBhIHJldm9rZSByZWNvcmQgaW4gdGhhdCBvciBhIHN1YnNlcXVlbnQKKyAqICB0cmFuc2FjdGlvbikKKyAqCisgKiAgZW1wdHkgdGhlIHJldm9rZSB0YWJsZSBhZnRlciByZWNvdmVyeS4KKyAqLworCisvKgorICogRmlyc3QsIHNldHRpbmcgcmV2b2tlIHJlY29yZHMuICBXZSBjcmVhdGUgYSBuZXcgcmV2b2tlIHJlY29yZCBmb3IKKyAqIGV2ZXJ5IGJsb2NrIGV2ZXIgcmV2b2tlZCBpbiB0aGUgbG9nIGFzIHdlIHNjYW4gaXQgZm9yIHJlY292ZXJ5LCBhbmQKKyAqIHdlIHVwZGF0ZSB0aGUgZXhpc3RpbmcgcmVjb3JkcyBpZiB3ZSBmaW5kIG11bHRpcGxlIHJldm9rZXMgZm9yIGEKKyAqIHNpbmdsZSBibG9jay4KKyAqLworCitpbnQgam91cm5hbF9zZXRfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9ja25yLAorCQkgICAgICAgdGlkX3Qgc2VxdWVuY2UpCit7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBibG9ja25yKTsKKwlpZiAocmVjb3JkKSB7CisJCS8qIElmIHdlIGhhdmUgbXVsdGlwbGUgb2NjdXJlbmNlcywgb25seSByZWNvcmQgdGhlCisJCSAqIGxhdGVzdCBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIGhhc2hlZCByZWNvcmQgKi8KKwkJaWYgKHRpZF9ndChzZXF1ZW5jZSwgcmVjb3JkLT5zZXF1ZW5jZSkpCisJCQlyZWNvcmQtPnNlcXVlbmNlID0gc2VxdWVuY2U7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gaW5zZXJ0X3Jldm9rZV9oYXNoKGpvdXJuYWwsIGJsb2NrbnIsIHNlcXVlbmNlKTsKK30KKworLyoKKyAqIFRlc3QgcmV2b2tlIHJlY29yZHMuICBGb3IgYSBnaXZlbiBibG9jayByZWZlcmVuY2VkIGluIHRoZSBsb2csIGhhcworICogdGhhdCBibG9jayBiZWVuIHJldm9rZWQ/ICBBIHJldm9rZSByZWNvcmQgd2l0aCBhIGdpdmVuIHRyYW5zYWN0aW9uCisgKiBzZXF1ZW5jZSBudW1iZXIgcmV2b2tlcyBhbGwgYmxvY2tzIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGVhcmxpZXIKKyAqIG9uZXMsIGJ1dCBsYXRlciB0cmFuc2FjdGlvbnMgc3RpbGwgbmVlZCByZXBsYXllZC4KKyAqLworCitpbnQgam91cm5hbF90ZXN0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwKKwkJCXRpZF90IHNlcXVlbmNlKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwlyZWNvcmQgPSBmaW5kX3Jldm9rZV9yZWNvcmQoam91cm5hbCwgYmxvY2tucik7CisJaWYgKCFyZWNvcmQpCisJCXJldHVybiAwOworCWlmICh0aWRfZ3Qoc2VxdWVuY2UsIHJlY29yZC0+c2VxdWVuY2UpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmFsbHksIG9uY2UgcmVjb3ZlcnkgaXMgb3Zlciwgd2UgbmVlZCB0byBjbGVhciB0aGUgcmV2b2tlIHRhYmxlIHNvCisgKiB0aGF0IGl0IGNhbiBiZSByZXVzZWQgYnkgdGhlIHJ1bm5pbmcgZmlsZXN5c3RlbS4KKyAqLworCit2b2lkIGpvdXJuYWxfY2xlYXJfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICpyZXZva2VfdmFyOworCisJcmV2b2tlX3ZhciA9IGpvdXJuYWwtPmpfcmV2b2tlOworCisJZm9yIChpID0gMDsgaSA8IHJldm9rZV92YXItPmhhc2hfc2l6ZTsgaSsrKSB7CisJCWhhc2hfbGlzdCA9ICZyZXZva2VfdmFyLT5oYXNoX3RhYmxlW2ldOworCQl3aGlsZSAoIWxpc3RfZW1wdHkoaGFzaF9saXN0KSkgeworCQkJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zKikgaGFzaF9saXN0LT5uZXh0OworCQkJbGlzdF9kZWwoJnJlY29yZC0+aGFzaCk7CisJCQlmcmVlKHJlY29yZCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBlMmZzY2suYyAtIHN1cGVyYmxvY2sgY2hlY2tzCisgKi8KKworI2RlZmluZSBNSU5fQ0hFQ0sgMQorI2RlZmluZSBNQVhfQ0hFQ0sgMgorCitzdGF0aWMgdm9pZCBjaGVja19zdXBlcl92YWx1ZShlMmZzY2tfdCBjdHgsIGNvbnN0IGNoYXIgKmRlc2NyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IGZsYWdzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBtaW5fdmFsLCB1bnNpZ25lZCBsb25nIG1heF92YWwpCit7CisJc3RydWN0ICAgICAgICAgIHByb2JsZW1fY29udGV4dCBwY3R4OworCisJaWYgKCgoZmxhZ3MgJiBNSU5fQ0hFQ0spICYmICh2YWx1ZSA8IG1pbl92YWwpKSB8fAorCSAgICAoKGZsYWdzICYgTUFYX0NIRUNLKSAmJiAodmFsdWUgPiBtYXhfdmFsKSkpIHsKKwkJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKwkJcGN0eC5udW0gPSB2YWx1ZTsKKwkJcGN0eC5zdHIgPSBkZXNjcjsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX01JU0NfQ09SUlVQVF9TVVBFUiwgJnBjdHgpOworCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOyAvKiBuZXZlciBnZXQgaGVyZSEgKi8KKwl9Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgbWF5IGdldCBzdHViYmVkIG91dCBpbiBzcGVjaWFsIGNvbXBpbGF0aW9ucyBvZiB0aGUKKyAqIGUyZnNjayBjb2RlLi4KKyAqLworI2lmbmRlZiBFWFQyX1NQRUNJQUxfREVWSUNFX1NJWkUKK3N0YXRpYyBlcnJjb2RlX3QgZTJmc2NrX2dldF9kZXZpY2Vfc2l6ZShlMmZzY2tfdCBjdHgpCit7CisJcmV0dXJuIChleHQyZnNfZ2V0X2RldmljZV9zaXplKGN0eC0+ZmlsZXN5c3RlbV9uYW1lLAorCQkJCSAgICAgICBFWFQyX0JMT0NLX1NJWkUoY3R4LT5mcy0+c3VwZXIpLAorCQkJCSAgICAgICAmY3R4LT5udW1fYmxvY2tzKSk7Cit9CisjZW5kaWYKKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byByZWxlYXNlIGFuIGlub2RlCisgKi8KK3N0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdCB7CisJZTJmc2NrX3QgICAgICAgIGN0eDsKKwljaGFyICAgICAgICAgICAgKmJ1ZjsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICpwY3R4OworCWludCAgICAgICAgICAgICB0cnVuY2F0aW5nOworCWludCAgICAgICAgICAgICB0cnVuY2F0ZV9vZmZzZXQ7CisJZTJfYmxrY250X3QgICAgIHRydW5jYXRlX2Jsb2NrOworCWludCAgICAgICAgICAgICB0cnVuY2F0ZWRfYmxvY2tzOworCWludCAgICAgICAgICAgICBhYm9ydDsKKwllcnJjb2RlX3QgICAgICAgZXJyY29kZTsKK307CisKK3N0YXRpYyBpbnQgcmVsZWFzZV9pbm9kZV9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkJICAgICAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgICAgIGJsa190ICAgIHJlZl9ibGsgRlNDS19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgICBpbnQgICAgICByZWZfb2Zmc2V0IEZTQ0tfQVRUUigodW51c2VkKSksCisJCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdCAqcGI7CisJZTJmc2NrX3QgICAgICAgICAgICAgICAgY3R4OworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgICpwY3R4OworCWJsa190ICAgICAgICAgICAgICAgICAgIGJsayA9ICpibG9ja19ucjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAwOworCisJcGIgPSAoc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0ICopIHByaXZfZGF0YTsKKwljdHggPSBwYi0+Y3R4OworCXBjdHggPSBwYi0+cGN0eDsKKworCXBjdHgtPmJsayA9IGJsazsKKwlwY3R4LT5ibGtjb3VudCA9IGJsb2NrY250OworCisJaWYgKEhPTEVfQkxLQUREUihibGspKQorCQlyZXR1cm4gMDsKKworCWlmICgoYmxrIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIChibGsgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX09SUEhBTl9JTExFR0FMX0JMT0NLX05VTSwgcGN0eCk7CisgcmV0dXJuX2Fib3J0OgorCQlwYi0+YWJvcnQgPSAxOworCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCisJaWYgKCFleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKSkgeworCQlmaXhfcHJvYmxlbShjdHgsIFBSXzBfT1JQSEFOX0FMUkVBRFlfQ0xFQVJFRF9CTE9DSywgcGN0eCk7CisJCWdvdG8gcmV0dXJuX2Fib3J0OworCX0KKworCS8qCisJICogSWYgd2UgYXJlIGRlbGV0aW5nIGFuIG9ycGhhbiwgdGhlbiB3ZSBsZWF2ZSB0aGUgZmllbGRzIGFsb25lLgorCSAqIElmIHdlIGFyZSB0cnVuY2F0aW5nIGFuIG9ycGhhbiwgdGhlbiB1cGRhdGUgdGhlIGlub2RlIGZpZWxkcworCSAqIGFuZCBjbGVhbiB1cCBhbnkgcGFydGlhbCBibG9jayBkYXRhLgorCSAqLworCWlmIChwYi0+dHJ1bmNhdGluZykgeworCQkvKgorCQkgKiBXZSBvbmx5IHJlbW92ZSBpbmRpcmVjdCBibG9ja3MgaWYgdGhleSBhcmUKKwkJICogY29tcGxldGVseSBlbXB0eS4KKwkJICovCisJCWlmIChibG9ja2NudCA8IDApIHsKKwkJCWludCAgICAgaSwgbGltaXQ7CisJCQlibGtfdCAgICpicDsKKworCQkJcGItPmVycmNvZGUgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxrLCAxLAorCQkJCQkJCXBiLT5idWYpOworCQkJaWYgKHBiLT5lcnJjb2RlKQorCQkJCWdvdG8gcmV0dXJuX2Fib3J0OworCisJCQlsaW1pdCA9IGZzLT5ibG9ja3NpemUgPj4gMjsKKwkJCWZvciAoaSA9IDAsIGJwID0gKGJsa190ICopIHBiLT5idWY7CisJCQkgICAgIGkgPCBsaW1pdDsgIGkrKywgYnArKykKKwkJCQlpZiAoKmJwKQorCQkJCQlyZXR1cm4gMDsKKwkJfQorCQkvKgorCQkgKiBXZSBkb24ndCByZW1vdmUgZGlyZWN0IGJsb2NrcyB1bnRpbCB3ZSd2ZSByZWFjaGVkCisJCSAqIHRoZSB0cnVuY2F0aW9uIGJsb2NrLgorCQkgKi8KKwkJaWYgKGJsb2NrY250ID49IDAgJiYgYmxvY2tjbnQgPCBwYi0+dHJ1bmNhdGVfYmxvY2spCisJCQlyZXR1cm4gMDsKKwkJLyoKKwkJICogSWYgcGFydCBvZiB0aGUgbGFzdCBibG9jayBuZWVkcyB0cnVuY2F0aW5nLCB3ZSBkbworCQkgKiBpdCBoZXJlLgorCQkgKi8KKwkJaWYgKChibG9ja2NudCA9PSBwYi0+dHJ1bmNhdGVfYmxvY2spICYmIHBiLT50cnVuY2F0ZV9vZmZzZXQpIHsKKwkJCXBiLT5lcnJjb2RlID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsaywgMSwKKwkJCQkJCQlwYi0+YnVmKTsKKwkJCWlmIChwYi0+ZXJyY29kZSkKKwkJCQlnb3RvIHJldHVybl9hYm9ydDsKKwkJCW1lbXNldChwYi0+YnVmICsgcGItPnRydW5jYXRlX29mZnNldCwgMCwKKwkJCSAgICAgICBmcy0+YmxvY2tzaXplIC0gcGItPnRydW5jYXRlX29mZnNldCk7CisJCQlwYi0+ZXJyY29kZSA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxrLCAxLAorCQkJCQkJCSBwYi0+YnVmKTsKKwkJCWlmIChwYi0+ZXJyY29kZSkKKwkJCQlnb3RvIHJldHVybl9hYm9ydDsKKwkJfQorCQlwYi0+dHJ1bmNhdGVkX2Jsb2NrcysrOworCQkqYmxvY2tfbnIgPSAwOworCQlyZXR2YWwgfD0gQkxPQ0tfQ0hBTkdFRDsKKwl9CisKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGJsaywgLTEpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFuIGlub2RlLiAgUmV0dXJucyAxIGlmIGFuIGluY29uc2lzdGVuY3kgd2FzCisgKiBmb3VuZC4gIElmIHRoZSBpbm9kZSBoYXMgYSBsaW5rIGNvdW50LCB0aGVuIGl0IGlzIGJlaW5nIHRydW5jYXRlZCBhbmQKKyAqIG5vdCBkZWxldGVkLgorICovCitzdGF0aWMgaW50IHJlbGVhc2VfaW5vZGVfYmxvY2tzKGUyZnNja190IGN0eCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLCBjaGFyICpibG9ja19idWYsCisJCQkJc3RydWN0IHByb2JsZW1fY29udGV4dCAqcGN0eCkKK3sKKwlzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3QgICAgIHBiOworCWV4dDJfZmlsc3lzICAgICAgICAgICAgICAgICAgICAgZnMgPSBjdHgtPmZzOworCWVycmNvZGVfdCAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsOworCV9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisKKwlpZiAoIWV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKGlub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlwYi5idWYgPSBibG9ja19idWYgKyAzICogY3R4LT5mcy0+YmxvY2tzaXplOworCXBiLmN0eCA9IGN0eDsKKwlwYi5hYm9ydCA9IDA7CisJcGIuZXJyY29kZSA9IDA7CisJcGIucGN0eCA9IHBjdHg7CisJaWYgKGlub2RlLT5pX2xpbmtzX2NvdW50KSB7CisJCXBiLnRydW5jYXRpbmcgPSAxOworCQlwYi50cnVuY2F0ZV9ibG9jayA9IChlMl9ibGtjbnRfdCkKKwkJCSgoKChsb25nIGxvbmcpaW5vZGUtPmlfc2l6ZV9oaWdoIDw8IDMyKSArCisJCQkgIGlub2RlLT5pX3NpemUgKyBmcy0+YmxvY2tzaXplIC0gMSkgLworCQkJIGZzLT5ibG9ja3NpemUpOworCQlwYi50cnVuY2F0ZV9vZmZzZXQgPSBpbm9kZS0+aV9zaXplICUgZnMtPmJsb2Nrc2l6ZTsKKwl9IGVsc2UgeworCQlwYi50cnVuY2F0aW5nID0gMDsKKwkJcGIudHJ1bmNhdGVfYmxvY2sgPSAwOworCQlwYi50cnVuY2F0ZV9vZmZzZXQgPSAwOworCX0KKwlwYi50cnVuY2F0ZWRfYmxvY2tzID0gMDsKKwlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGlubywgQkxPQ0tfRkxBR19ERVBUSF9UUkFWRVJTRSwKKwkJCQkgICAgICBibG9ja19idWYsIHJlbGVhc2VfaW5vZGVfYmxvY2ssICZwYik7CisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgY2FsbGluZyBleHQyZnNfYmxvY2tfaXRlcmF0ZSBmb3IgaW5vZGUgJWQiKSwKKwkJCWlubyk7CisJCXJldHVybiAxOworCX0KKwlpZiAocGIuYWJvcnQpCisJCXJldHVybiAxOworCisJLyogUmVmcmVzaCB0aGUgaW5vZGUgc2luY2UgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUgbWF5IGhhdmUgY2hhbmdlZCBpdCAqLworCWUyZnNja19yZWFkX2lub2RlKGN0eCwgaW5vLCBpbm9kZSwgInJlbGVhc2VfaW5vZGVfYmxvY2tzIik7CisKKwlpZiAocGIudHJ1bmNhdGVkX2Jsb2NrcykKKwkJaW5vZGUtPmlfYmxvY2tzIC09IHBiLnRydW5jYXRlZF9ibG9ja3MgKgorCQkJKGZzLT5ibG9ja3NpemUgLyA1MTIpOworCisJaWYgKGlub2RlLT5pX2ZpbGVfYWNsKSB7CisJCXJldHZhbCA9IGV4dDJmc19hZGp1c3RfZWFfcmVmY291bnQoZnMsIGlub2RlLT5pX2ZpbGVfYWNsLAorCQkJCQkJICAgYmxvY2tfYnVmLCAtMSwgJmNvdW50KTsKKwkJaWYgKHJldHZhbCA9PSBFWFQyX0VUX0JBRF9FQV9CTE9DS19OVU0pIHsKKwkJCXJldHZhbCA9IDA7CisJCQljb3VudCA9IDE7CisJCX0KKwkJaWYgKHJldHZhbCkgeworCQkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIGNhbGxpbmcgZXh0MmZzX2FkanVzdF9lYV9yZWZvY3VudCBmb3IgaW5vZGUgJWQiKSwKKwkJCQlpbm8pOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGNvdW50ID09IDApCisJCQlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGlub2RlLT5pX2ZpbGVfYWNsLCAtMSk7CisJCWlub2RlLT5pX2ZpbGVfYWNsID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCBvZiB0aGUgb3JwaGFuIGlub2Rlcy4gIEl0IHJldHVybnMgMSBpZgorICogaXQgaGl0IHNvbWUgZXJyb3IsIGFuZCAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVsZWFzZV9vcnBoYW5faW5vZGVzKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZXh0Ml9pbm9fdCAgICAgIGlubywgbmV4dF9pbm87CisJc3RydWN0IGV4dDJfaW5vZGUgaW5vZGU7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCWNoYXIgKmJsb2NrX2J1ZjsKKworCWlmICgoaW5vID0gZnMtPnN1cGVyLT5zX2xhc3Rfb3JwaGFuKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2luIG9yIGxvc2UsIHdlIHdvbid0IGJlIHVzaW5nIHRoZSBoZWFkIG9mIHRoZSBvcnBoYW4gaW5vZGUKKwkgKiBsaXN0IGFnYWluLgorCSAqLworCWZzLT5zdXBlci0+c19sYXN0X29ycGhhbiA9IDA7CisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZXN5c3RlbSBjb250YWlucyBlcnJvcnMsIGRvbid0IHJ1biB0aGUgb3JwaGFuCisJICogbGlzdCwgc2luY2UgdGhlIG9ycGhhbiBsaXN0IGNhbid0IGJlIHRydXN0ZWQ7IGFuZCB3ZSdyZQorCSAqIGdvaW5nIHRvIGJlIHJ1bm5pbmcgYSBmdWxsIGUyZnNjayBydW4gYW55d2F5Li4uCisJICovCisJaWYgKGZzLT5zdXBlci0+c19zdGF0ZSAmIEVYVDJfRVJST1JfRlMpCisJCXJldHVybiAwOworCisJaWYgKChpbm8gPCBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcikpIHx8CisJICAgIChpbm8gPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSkgeworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQlwY3R4LmlubyA9IGlubzsKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX09SUEhBTl9JTExFR0FMX0hFQURfSU5PREUsICZwY3R4KTsKKwkJcmV0dXJuIDE7CisJfQorCisJYmxvY2tfYnVmID0gKGNoYXIgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsIGZzLT5ibG9ja3NpemUgKiA0LAorCQkJCQkJICAgICJibG9jayBpdGVyYXRlIGJ1ZmZlciIpOworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKworCXdoaWxlIChpbm8pIHsKKwkJZTJmc2NrX3JlYWRfaW5vZGUoY3R4LCBpbm8sICZpbm9kZSwgInJlbGVhc2Vfb3JwaGFuX2lub2RlcyIpOworCQljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCQlwY3R4LmlubyA9IGlubzsKKwkJcGN0eC5pbm9kZSA9ICZpbm9kZTsKKwkJcGN0eC5zdHIgPSBpbm9kZS5pX2xpbmtzX2NvdW50ID8gXygiVHJ1bmNhdGluZyIpIDoKKwkJCV8oIkNsZWFyaW5nIik7CisKKwkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX09SUEhBTl9DTEVBUl9JTk9ERSwgJnBjdHgpOworCisJCW5leHRfaW5vID0gaW5vZGUuaV9kdGltZTsKKwkJaWYgKG5leHRfaW5vICYmCisJCSAgICAoKG5leHRfaW5vIDwgRVhUMl9GSVJTVF9JTk9ERShmcy0+c3VwZXIpKSB8fAorCQkgICAgIChuZXh0X2lubyA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKSkgeworCQkJcGN0eC5pbm8gPSBuZXh0X2lubzsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9PUlBIQU5fSUxMRUdBTF9JTk9ERSwgJnBjdHgpOworCQkJZ290byByZXR1cm5fYWJvcnQ7CisJCX0KKworCQlpZiAocmVsZWFzZV9pbm9kZV9ibG9ja3MoY3R4LCBpbm8sICZpbm9kZSwgYmxvY2tfYnVmLCAmcGN0eCkpCisJCQlnb3RvIHJldHVybl9hYm9ydDsKKworCQlpZiAoIWlub2RlLmlfbGlua3NfY291bnQpIHsKKwkJCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGlubywgLTEsCisJCQkJCQkgIExJTlVYX1NfSVNESVIoaW5vZGUuaV9tb2RlKSk7CisJCQlpbm9kZS5pX2R0aW1lID0gdGltZShOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLmlfZHRpbWUgPSAwOworCQl9CisJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIGlubywgJmlub2RlLCAiZGVsZXRlX2ZpbGUiKTsKKwkJaW5vID0gbmV4dF9pbm87CisJfQorCWV4dDJmc19mcmVlX21lbSgmYmxvY2tfYnVmKTsKKwlyZXR1cm4gMDsKKyByZXR1cm5fYWJvcnQ6CisJZXh0MmZzX2ZyZWVfbWVtKCZibG9ja19idWYpOworCXJldHVybiAxOworfQorCisvKgorICogQ2hlY2sgdGhlIHJlc2l6ZSBpbm9kZSB0byBtYWtlIHN1cmUgaXQgaXMgc2FuZS4gIFdlIGNoZWNrIGJvdGggZm9yCisgKiB0aGUgY2FzZSB3aGVyZSBvbi1saW5lIHJlc2l6aW5nIGlzIG5vdCBlbmFibGVkIChpbiB3aGljaCBjYXNlIHRoZQorICogcmVzaXplIGlub2RlIHNob3VsZCBiZSBjbGVhcmVkKSBhcyB3ZWxsIGFzIHRoZSBjYXNlIHdoZXJlIG9uLWxpbmUKKyAqIHJlc2l6aW5nIGlzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc2l6ZV9pbm9kZShlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCXN0cnVjdCBleHQyX2lub2RlIGlub2RlOworCXN0cnVjdCBwcm9ibGVtX2NvbnRleHQgIHBjdHg7CisJaW50ICAgICAgICAgICAgIGksIGosIGdkdF9vZmYsIGluZF9vZmY7CisJYmxrX3QgICAgICAgICAgIGJsaywgcGJsaywgZXhwZWN0OworCV9fdTMyICAgICAgICAgICAqZGluZF9idWYgPSBOVUxMLCAqaW5kX2J1ZjsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCS8qCisJICogSWYgdGhlIHJlc2l6ZSBpbm9kZSBmZWF0dXJlIGlzbid0IHNldCwgdGhlbgorCSAqIHNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyBtdXN0IGJlIHplcm8uCisJICovCisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfY29tcGF0ICYKKwkgICAgICBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSkpIHsKKwkJaWYgKGZzLT5zdXBlci0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSB7CisJCQlwY3R4Lm51bSA9IGZzLT5zdXBlci0+c19yZXNlcnZlZF9nZHRfYmxvY2tzOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9OT05aRVJPX1JFU0VSVkVEX0dEVF9CTE9DS1MsCisJCQkJCSZwY3R4KSkgeworCQkJCWZzLT5zdXBlci0+c19yZXNlcnZlZF9nZHRfYmxvY2tzID0gMDsKKwkJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZWFkIHRoZSByZXNpemUgaW5vZGUgKi8KKwlwY3R4LmlubyA9IEVYVDJfUkVTSVpFX0lOTzsKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgRVhUMl9SRVNJWkVfSU5PLCAmaW5vZGUpOworCWlmIChyZXR2YWwpIHsKKwkJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmCisJCSAgICBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSkKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfUkVTSVpFX0lOT0RFOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcmVzaXplIGlub2RlIGZlYXR1cmUgaXNuJ3Qgc2V0LCBjaGVjayB0byBtYWtlIHN1cmUKKwkgKiB0aGUgcmVzaXplIGlub2RlIGlzIGNsZWFyZWQ7IHRoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJgorCSAgICAgIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFKSkgeworCQlmb3IgKGk9MDsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykgeworCQkJaWYgKGlub2RlLmlfYmxvY2tbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChpIDwgRVhUMl9OX0JMT0NLUykgJiYKKwkJICAgIGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9DTEVBUl9SRVNJWkVfSU5PREUsICZwY3R4KSkgeworCQkJbWVtc2V0KCZpbm9kZSwgMCwgc2l6ZW9mKGlub2RlKSk7CisJCQllMmZzY2tfd3JpdGVfaW5vZGUoY3R4LCBFWFQyX1JFU0laRV9JTk8sICZpbm9kZSwKKwkJCQkJICAgImNsZWFyX3Jlc2l6ZSIpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoZSByZXNpemUgaW5vZGUgZmVhdHVyZSBpcyBlbmFibGVkOyBjaGVjayB0byBtYWtlIHN1cmUgdGhlCisJICogb25seSBibG9jayBpbiB1c2UgaXMgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jaworCSAqLworCWJsayA9IGlub2RlLmlfYmxvY2tbRVhUMl9ESU5EX0JMT0NLXTsKKwlmb3IgKGk9MDsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykgeworCQlpZiAoaSAhPSBFWFQyX0RJTkRfQkxPQ0sgJiYgaW5vZGUuaV9ibG9ja1tpXSkKKwkJCWJyZWFrOworCX0KKwlpZiAoKGkgPCBFWFQyX05fQkxPQ0tTKSB8fCAhYmxrIHx8ICFpbm9kZS5pX2xpbmtzX2NvdW50IHx8CisJICAgICEoaW5vZGUuaV9tb2RlICYgTElOVVhfU19JRlJFRykgfHwKKwkgICAgKGJsayA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrIHx8CisJICAgICBibGsgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpIHsKKyByZXNpemVfaW5vZGVfaW52YWxpZDoKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9SRVNJWkVfSU5PREVfSU5WQUxJRCwgJnBjdHgpKSB7CisJCQltZW1zZXQoJmlub2RlLCAwLCBzaXplb2YoaW5vZGUpKTsKKwkJCWUyZnNja193cml0ZV9pbm9kZShjdHgsIEVYVDJfUkVTSVpFX0lOTywgJmlub2RlLAorCQkJCQkgICAiY2xlYXJfcmVzaXplIik7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX1JFU0laRV9JTk9ERTsKKwkJfQorCQlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSkgeworCQkJZnMtPnN1cGVyLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQl9CisJCWdvdG8gY2xlYW51cDsKKwl9CisJZGluZF9idWYgPSAoX191MzIgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsIGZzLT5ibG9ja3NpemUgKiAyLAorCQkJCQkJICAgICJyZXNpemUgZGluZCBidWZmZXIiKTsKKwlpbmRfYnVmID0gKF9fdTMyICopICgoY2hhciAqKSBkaW5kX2J1ZiArIGZzLT5ibG9ja3NpemUpOworCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5kX2Jsb2NrKGZzLCBibGssIGRpbmRfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHJlc2l6ZV9pbm9kZV9pbnZhbGlkOworCisJZ2R0X29mZiA9IGZzLT5kZXNjX2Jsb2NrczsKKwlwYmxrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2sgKyAxICsgZnMtPmRlc2NfYmxvY2tzOworCWZvciAoaSA9IDA7IGkgPCBmcy0+c3VwZXItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyAvIDQ7CisJICAgICBpKyssIGdkdF9vZmYrKywgcGJsaysrKSB7CisJCWdkdF9vZmYgJT0gZnMtPmJsb2Nrc2l6ZS80OworCQlpZiAoZGluZF9idWZbZ2R0X29mZl0gIT0gcGJsaykKKwkJCWdvdG8gcmVzaXplX2lub2RlX2ludmFsaWQ7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2luZF9ibG9jayhmcywgcGJsaywgaW5kX2J1Zik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIHJlc2l6ZV9pbm9kZV9pbnZhbGlkOworCQlpbmRfb2ZmID0gMDsKKwkJZm9yIChqID0gMTsgaiA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBqKyspIHsKKwkJCWlmICghZXh0MmZzX2JnX2hhc19zdXBlcihmcywgaikpCisJCQkJY29udGludWU7CisJCQlleHBlY3QgPSBwYmxrICsgKGogKiBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCk7CisJCQlpZiAoaW5kX2J1ZltpbmRfb2ZmXSAhPSBleHBlY3QpCisJCQkJZ290byByZXNpemVfaW5vZGVfaW52YWxpZDsKKwkJCWluZF9vZmYrKzsKKwkJfQorCX0KKworIGNsZWFudXA6CisJZXh0MmZzX2ZyZWVfbWVtKCZkaW5kX2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N1cGVyX2Jsb2NrKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJYmxrX3QgICBmaXJzdF9ibG9jaywgbGFzdF9ibG9jazsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2IgPSBmcy0+c3VwZXI7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2Q7CisJYmxrX3QgICBibG9ja3NfcGVyX2dyb3VwID0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJYmxrX3QgICBicGdfbWF4OworCWludCAgICAgaW5vZGVzX3Blcl9ibG9jazsKKwlpbnQgICAgIGlwZ19tYXg7CisJaW50ICAgICBpbm9kZV9zaXplOworCWRncnBfdCAgaTsKKwlibGtfdCAgIHNob3VsZF9iZTsKKwlzdHJ1Y3QgcHJvYmxlbV9jb250ZXh0ICBwY3R4OworCV9fdTMyICAgZnJlZV9ibG9ja3MgPSAwLCBmcmVlX2lub2RlcyA9IDA7CisKKwlpbm9kZXNfcGVyX2Jsb2NrID0gRVhUMl9JTk9ERVNfUEVSX0JMT0NLKGZzLT5zdXBlcik7CisJaXBnX21heCA9IGlub2Rlc19wZXJfYmxvY2sgKiAoYmxvY2tzX3Blcl9ncm91cCAtIDQpOworCWlmIChpcGdfbWF4ID4gRVhUMl9NQVhfSU5PREVTX1BFUl9HUk9VUChzYikpCisJCWlwZ19tYXggPSBFWFQyX01BWF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKKwlicGdfbWF4ID0gOCAqIEVYVDJfQkxPQ0tfU0laRShzYik7CisJaWYgKGJwZ19tYXggPiBFWFQyX01BWF9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJYnBnX21heCA9IEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCisJY3R4LT5pbnZhbGlkX2lub2RlX2JpdG1hcF9mbGFnID0gKGludCAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwKKwkJIHNpemVvZihpbnQpICogZnMtPmdyb3VwX2Rlc2NfY291bnQsICJpbnZhbGlkX2lub2RlX2JpdG1hcCIpOworCWN0eC0+aW52YWxpZF9ibG9ja19iaXRtYXBfZmxhZyA9IChpbnQgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCSBzaXplb2YoaW50KSAqIGZzLT5ncm91cF9kZXNjX2NvdW50LCAiaW52YWxpZF9ibG9ja19iaXRtYXAiKTsKKwljdHgtPmludmFsaWRfaW5vZGVfdGFibGVfZmxhZyA9IChpbnQgKikgZTJmc2NrX2FsbG9jYXRlX21lbW9yeShjdHgsCisJCXNpemVvZihpbnQpICogZnMtPmdyb3VwX2Rlc2NfY291bnQsICJpbnZhbGlkX2lub2RlX3RhYmxlIik7CisKKwljbGVhcl9wcm9ibGVtX2NvbnRleHQoJnBjdHgpOworCisJLyoKKwkgKiBWZXJpZnkgdGhlIHN1cGVyIGJsb2NrIGNvbnN0YW50cy4uLgorCSAqLworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgImlub2Rlc19jb3VudCIsIHNiLT5zX2lub2Rlc19jb3VudCwKKwkJCSAgTUlOX0NIRUNLLCAxLCAwKTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJibG9ja3NfY291bnQiLCBzYi0+c19ibG9ja3NfY291bnQsCisJCQkgIE1JTl9DSEVDSywgMSwgMCk7CisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAiZmlyc3RfZGF0YV9ibG9jayIsIHNiLT5zX2ZpcnN0X2RhdGFfYmxvY2ssCisJCQkgIE1BWF9DSEVDSywgMCwgc2ItPnNfYmxvY2tzX2NvdW50KTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJsb2dfYmxvY2tfc2l6ZSIsIHNiLT5zX2xvZ19ibG9ja19zaXplLAorCQkJICBNSU5fQ0hFQ0sgfCBNQVhfQ0hFQ0ssIDAsCisJCQkgIEVYVDJfTUFYX0JMT0NLX0xPR19TSVpFIC0gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgImxvZ19mcmFnX3NpemUiLCBzYi0+c19sb2dfZnJhZ19zaXplLAorCQkJICBNSU5fQ0hFQ0sgfCBNQVhfQ0hFQ0ssIDAsIHNiLT5zX2xvZ19ibG9ja19zaXplKTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJmcmFnc19wZXJfZ3JvdXAiLCBzYi0+c19mcmFnc19wZXJfZ3JvdXAsCisJCQkgIE1JTl9DSEVDSyB8IE1BWF9DSEVDSywgc2ItPnNfYmxvY2tzX3Blcl9ncm91cCwKKwkJCSAgYnBnX21heCk7CisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAiYmxvY2tzX3Blcl9ncm91cCIsIHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXAsCisJCQkgIE1JTl9DSEVDSyB8IE1BWF9DSEVDSywgOCwgYnBnX21heCk7CisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAiaW5vZGVzX3Blcl9ncm91cCIsIHNiLT5zX2lub2Rlc19wZXJfZ3JvdXAsCisJCQkgIE1JTl9DSEVDSyB8IE1BWF9DSEVDSywgaW5vZGVzX3Blcl9ibG9jaywgaXBnX21heCk7CisJY2hlY2tfc3VwZXJfdmFsdWUoY3R4LCAicl9ibG9ja3NfY291bnQiLCBzYi0+c19yX2Jsb2Nrc19jb3VudCwKKwkJCSAgTUFYX0NIRUNLLCAwLCBzYi0+c19ibG9ja3NfY291bnQgLyAyKTsKKwljaGVja19zdXBlcl92YWx1ZShjdHgsICJyZXNlcnZlZF9nZHRfYmxvY2tzIiwKKwkJCSAgc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgTUFYX0NIRUNLLCAwLAorCQkJICBmcy0+YmxvY2tzaXplLzQpOworCWlub2RlX3NpemUgPSBFWFQyX0lOT0RFX1NJWkUoc2IpOworCWNoZWNrX3N1cGVyX3ZhbHVlKGN0eCwgImlub2RlX3NpemUiLAorCQkJICBpbm9kZV9zaXplLCBNSU5fQ0hFQ0sgfCBNQVhfQ0hFQ0ssCisJCQkgIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSwgZnMtPmJsb2Nrc2l6ZSk7CisJaWYgKGlub2RlX3NpemUgJiAoaW5vZGVfc2l6ZSAtIDEpKSB7CisJCXBjdHgubnVtID0gaW5vZGVfc2l6ZTsKKwkJcGN0eC5zdHIgPSAiaW5vZGVfc2l6ZSI7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9NSVNDX0NPUlJVUFRfU1VQRVIsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsgLyogbmV2ZXIgZ2V0IGhlcmUhICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoIWN0eC0+bnVtX2Jsb2NrcykgeworCQlwY3R4LmVycmNvZGUgPSBlMmZzY2tfZ2V0X2RldmljZV9zaXplKGN0eCk7CisJCWlmIChwY3R4LmVycmNvZGUgJiYgcGN0eC5lcnJjb2RlICE9IEVYVDJfRVRfVU5JTVBMRU1FTlRFRCkgeworCQkJZml4X3Byb2JsZW0oY3R4LCBQUl8wX0dFVFNJWkVfRVJST1IsICZwY3R4KTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChwY3R4LmVycmNvZGUgIT0gRVhUMl9FVF9VTklNUExFTUVOVEVEKSAmJgorCQkgICAgKGN0eC0+bnVtX2Jsb2NrcyA8IHNiLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJCXBjdHguYmxrID0gc2ItPnNfYmxvY2tzX2NvdW50OworCQkJcGN0eC5ibGsyID0gY3R4LT5udW1fYmxvY2tzOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9GU19TSVpFX1dST05HLCAmcGN0eCkpIHsKKwkJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX0FCT1JUOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzYi0+c19sb2dfYmxvY2tfc2l6ZSAhPSAoX191MzIpIHNiLT5zX2xvZ19mcmFnX3NpemUpIHsKKwkJcGN0eC5ibGsgPSBFWFQyX0JMT0NLX1NJWkUoc2IpOworCQlwY3R4LmJsazIgPSBFWFQyX0ZSQUdfU0laRShzYik7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9OT19GUkFHTUVOVFMsICZwY3R4KTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKworCXNob3VsZF9iZSA9IHNiLT5zX2ZyYWdzX3Blcl9ncm91cCA+PgorCQkoc2ItPnNfbG9nX2Jsb2NrX3NpemUgLSBzYi0+c19sb2dfZnJhZ19zaXplKTsKKwlpZiAoc2ItPnNfYmxvY2tzX3Blcl9ncm91cCAhPSBzaG91bGRfYmUpIHsKKwkJcGN0eC5ibGsgPSBzYi0+c19ibG9ja3NfcGVyX2dyb3VwOworCQlwY3R4LmJsazIgPSBzaG91bGRfYmU7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9CTE9DS1NfUEVSX0dST1VQLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisKKwlzaG91bGRfYmUgPSAoc2ItPnNfbG9nX2Jsb2NrX3NpemUgPT0gMCkgPyAxIDogMDsKKwlpZiAoc2ItPnNfZmlyc3RfZGF0YV9ibG9jayAhPSBzaG91bGRfYmUpIHsKKwkJcGN0eC5ibGsgPSBzYi0+c19maXJzdF9kYXRhX2Jsb2NrOworCQlwY3R4LmJsazIgPSBzaG91bGRfYmU7CisJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9GSVJTVF9EQVRBX0JMT0NLLCAmcGN0eCk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisKKwlzaG91bGRfYmUgPSBzYi0+c19pbm9kZXNfcGVyX2dyb3VwICogZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisJaWYgKHNiLT5zX2lub2Rlc19jb3VudCAhPSBzaG91bGRfYmUpIHsKKwkJcGN0eC5pbm8gPSBzYi0+c19pbm9kZXNfY291bnQ7CisJCXBjdHguaW5vMiA9IHNob3VsZF9iZTsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9JTk9ERV9DT1VOVF9XUk9ORywgJnBjdHgpKSB7CisJCQlzYi0+c19pbm9kZXNfY291bnQgPSBzaG91bGRfYmU7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFZlcmlmeSB0aGUgZ3JvdXAgZGVzY3JpcHRvcnMuLi4uCisJICovCisJZmlyc3RfYmxvY2sgPSAgc2ItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwlsYXN0X2Jsb2NrID0gZmlyc3RfYmxvY2sgKyBibG9ja3NfcGVyX2dyb3VwOworCisJZm9yIChpID0gMCwgZ2Q9ZnMtPmdyb3VwX2Rlc2M7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrLCBnZCsrKSB7CisJCXBjdHguZ3JvdXAgPSBpOworCisJCWlmIChpID09IGZzLT5ncm91cF9kZXNjX2NvdW50IC0gMSkKKwkJCWxhc3RfYmxvY2sgPSBzYi0+c19ibG9ja3NfY291bnQ7CisJCWlmICgoZ2QtPmJnX2Jsb2NrX2JpdG1hcCA8IGZpcnN0X2Jsb2NrKSB8fAorCQkgICAgKGdkLT5iZ19ibG9ja19iaXRtYXAgPj0gbGFzdF9ibG9jaykpIHsKKwkJCXBjdHguYmxrID0gZ2QtPmJnX2Jsb2NrX2JpdG1hcDsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfQkJfTk9UX0dST1VQLCAmcGN0eCkpCisJCQkJZ2QtPmJnX2Jsb2NrX2JpdG1hcCA9IDA7CisJCX0KKwkJaWYgKGdkLT5iZ19ibG9ja19iaXRtYXAgPT0gMCkgeworCQkJY3R4LT5pbnZhbGlkX2Jsb2NrX2JpdG1hcF9mbGFnW2ldKys7CisJCQljdHgtPmludmFsaWRfYml0bWFwcysrOworCQl9CisJCWlmICgoZ2QtPmJnX2lub2RlX2JpdG1hcCA8IGZpcnN0X2Jsb2NrKSB8fAorCQkgICAgKGdkLT5iZ19pbm9kZV9iaXRtYXAgPj0gbGFzdF9ibG9jaykpIHsKKwkJCXBjdHguYmxrID0gZ2QtPmJnX2lub2RlX2JpdG1hcDsKKwkJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfSUJfTk9UX0dST1VQLCAmcGN0eCkpCisJCQkJZ2QtPmJnX2lub2RlX2JpdG1hcCA9IDA7CisJCX0KKwkJaWYgKGdkLT5iZ19pbm9kZV9iaXRtYXAgPT0gMCkgeworCQkJY3R4LT5pbnZhbGlkX2lub2RlX2JpdG1hcF9mbGFnW2ldKys7CisJCQljdHgtPmludmFsaWRfYml0bWFwcysrOworCQl9CisJCWlmICgoZ2QtPmJnX2lub2RlX3RhYmxlIDwgZmlyc3RfYmxvY2spIHx8CisJCSAgICAoKGdkLT5iZ19pbm9kZV90YWJsZSArCisJCSAgICAgIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwIC0gMSkgPj0gbGFzdF9ibG9jaykpIHsKKwkJCXBjdHguYmxrID0gZ2QtPmJnX2lub2RlX3RhYmxlOworCQkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9JVEFCTEVfTk9UX0dST1VQLCAmcGN0eCkpCisJCQkJZ2QtPmJnX2lub2RlX3RhYmxlID0gMDsKKwkJfQorCQlpZiAoZ2QtPmJnX2lub2RlX3RhYmxlID09IDApIHsKKwkJCWN0eC0+aW52YWxpZF9pbm9kZV90YWJsZV9mbGFnW2ldKys7CisJCQljdHgtPmludmFsaWRfYml0bWFwcysrOworCQl9CisJCWZyZWVfYmxvY2tzICs9IGdkLT5iZ19mcmVlX2Jsb2Nrc19jb3VudDsKKwkJZnJlZV9pbm9kZXMgKz0gZ2QtPmJnX2ZyZWVfaW5vZGVzX2NvdW50OworCQlmaXJzdF9ibG9jayArPSBzYi0+c19ibG9ja3NfcGVyX2dyb3VwOworCQlsYXN0X2Jsb2NrICs9IHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisKKwkJaWYgKChnZC0+YmdfZnJlZV9ibG9ja3NfY291bnQgPiBzYi0+c19ibG9ja3NfcGVyX2dyb3VwKSB8fAorCQkgICAgKGdkLT5iZ19mcmVlX2lub2Rlc19jb3VudCA+IHNiLT5zX2lub2Rlc19wZXJfZ3JvdXApIHx8CisJCSAgICAoZ2QtPmJnX3VzZWRfZGlyc19jb3VudCA+IHNiLT5zX2lub2Rlc19wZXJfZ3JvdXApKQorCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgdGhlIGdsb2JhbCBjb3VudHMgZnJvbSB0aGUgYmxvY2sgZ3JvdXAgY291bnRzLiAgVGhpcworCSAqIGlzIG5lZWRlZCBmb3IgYW4gZXhwZXJpbWVudGFsIHBhdGNoIHdoaWNoIGVsaW1pbmF0ZXMKKwkgKiBsb2NraW5nIHRoZSBlbnRpcmUgZmlsZXN5c3RlbSB3aGVuIGFsbG9jYXRpbmcgYmxvY2tzIG9yCisJICogaW5vZGVzOyBpZiB0aGUgZmlsZXN5c3RlbSBpcyBub3QgdW5tb3VudGVkIGNsZWFubHksIHRoZQorCSAqIGdsb2JhbCBjb3VudHMgbWF5IG5vdCBiZSBhY2N1cmF0ZS4KKwkgKi8KKwlpZiAoKGZyZWVfYmxvY2tzICE9IHNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSB8fAorCSAgICAoZnJlZV9pbm9kZXMgIT0gc2ItPnNfZnJlZV9pbm9kZXNfY291bnQpKSB7CisJCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKQorCQkJZXh0MmZzX3VubWFya192YWxpZChmcyk7CisJCWVsc2UgeworCQkJc2ItPnNfZnJlZV9ibG9ja3NfY291bnQgPSBmcmVlX2Jsb2NrczsKKwkJCXNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gZnJlZV9pbm9kZXM7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwl9CisKKwlpZiAoKHNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID4gc2ItPnNfYmxvY2tzX2NvdW50KSB8fAorCSAgICAoc2ItPnNfZnJlZV9pbm9kZXNfY291bnQgPiBzYi0+c19pbm9kZXNfY291bnQpKQorCQlleHQyZnNfdW5tYXJrX3ZhbGlkKGZzKTsKKworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGludmFsaWQgYml0bWFwcywgc2V0IHRoZSBlcnJvciBzdGF0ZSBvZiB0aGUKKwkgKiBmaWxlc3lzdGVtLgorCSAqLworCWlmIChjdHgtPmludmFsaWRfYml0bWFwcyAmJiAhKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpKSB7CisJCXNiLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJfQorCisJY2xlYXJfcHJvYmxlbV9jb250ZXh0KCZwY3R4KTsKKworCS8qCisJICogSWYgdGhlIFVVSUQgZmllbGQgaXNuJ3QgYXNzaWduZWQsIGFzc2lnbiBpdC4KKwkgKi8KKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSAmJiB1dWlkX2lzX251bGwoc2ItPnNfdXVpZCkpIHsKKwkJaWYgKGZpeF9wcm9ibGVtKGN0eCwgUFJfMF9BRERfVVVJRCwgJnBjdHgpKSB7CisJCQl1dWlkX2dlbmVyYXRlKHNiLT5zX3V1aWQpOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQkJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFk7CisJCX0KKwl9CisKKwkvKiBGSVhNRSAtIEhVUkQgc3VwcG9ydD8KKwkgKiBGb3IgdGhlIEh1cmQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZXR5cGUgb3B0aW9uIGlzIHNldCwKKwkgKiBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgaXQuCisJICovCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgJiYKKwkgICAgZnMtPnN1cGVyLT5zX2NyZWF0b3Jfb3MgPT0gRVhUMl9PU19IVVJEICYmCisJICAgIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJICAgICBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpKSB7CisJCWlmIChmaXhfcHJvYmxlbShjdHgsIFBSXzBfSFVSRF9DTEVBUl9GSUxFVFlQRSwgJnBjdHgpKSB7CisJCQlmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmPQorCQkJCX5FWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEU7CisJCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYW55IG9mIHRoZSBjb21wYXRpYmlsaXR5IGZsYWdzIHNldCwgd2UgbmVlZCB0byBoYXZlIGEKKwkgKiByZXZpc2lvbiAxIGZpbGVzeXN0ZW0uICBNb3N0IGtlcm5lbHMgd2lsbCBub3QgY2hlY2sgdGhlIGZsYWdzIG9uCisJICogYSByZXYgMCBmaWxlc3lzdGVtIGFuZCB3ZSBtYXkgaGF2ZSBjb3JydXB0aW9uIGlzc3VlcyBiZWNhdXNlIG9mCisJICogdGhlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBmaWxlc3lzdGVtLgorCSAqLworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpICYmCisJICAgIGZzLT5zdXBlci0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYgJiYKKwkgICAgKGZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCB8fAorCSAgICAgZnMtPnN1cGVyLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHx8CisJICAgICBmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCkgJiYKKwkgICAgZml4X3Byb2JsZW0oY3R4LCBQUl8wX0ZTX1JFVl9MRVZFTCwgJnBjdHgpKSB7CisJCWV4dDJmc191cGRhdGVfZHluYW1pY19yZXYoZnMpOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJfQorCisJY2hlY2tfcmVzaXplX2lub2RlKGN0eCk7CisKKwkvKgorCSAqIENsZWFuIHVwIGFueSBvcnBoYW4gaW5vZGVzLCBpZiBwcmVzZW50LgorCSAqLworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpICYmIHJlbGVhc2Vfb3JwaGFuX2lub2RlcyhjdHgpKSB7CisJCWZzLT5zdXBlci0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCX0KKworCS8qCisJICogTW92ZSB0aGUgZXh0MyBqb3VybmFsIGZpbGUsIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwllMmZzY2tfbW92ZV9leHQzX2pvdXJuYWwoY3R4KTsKK30KKworLyoKKyAqIHN3YXBmcy5jIC0tLSBieXRlLXN3YXAgYW4gZXh0MiBmaWxlc3lzdGVtCisgKi8KKworI2lmZGVmIEVOQUJMRV9TV0FQRlMKKworc3RydWN0IHN3YXBfYmxvY2tfc3RydWN0IHsKKwlleHQyX2lub190ICAgICAgaW5vOworCWludCAgICAgICAgICAgICBpc2RpcjsKKwllcnJjb2RlX3QgICAgICAgZXJyY29kZTsKKwljaGFyICAgICAgICAgICAgKmRpcl9idWY7CisJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlOworfTsKKworLyoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGJsb2NrX2l0ZXJhdGUuICBXZSBtYXJrIGFsbCBvZiB0aGUKKyAqIGluZGlyZWN0IGFuZCBkaXJlY3QgYmxvY2tzIGFzIGNoYW5nZWQsIHNvIHRoYXQgYmxvY2tfaXRlcmF0ZSB3aWxsCisgKiB3cml0ZSB0aGVtIG91dC4KKyAqLworc3RhdGljIGludCBzd2FwX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tfbnIsIGludCBibG9ja2NudCwKKwkJICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisKKwlzdHJ1Y3Qgc3dhcF9ibG9ja19zdHJ1Y3QgKnNiID0gKHN0cnVjdCBzd2FwX2Jsb2NrX3N0cnVjdCAqKSBwcml2X2RhdGE7CisKKwlpZiAoc2ItPmlzZGlyICYmIChibG9ja2NudCA+PSAwKSAmJiAqYmxvY2tfbnIpIHsKKwkJcmV0dmFsID0gZXh0MmZzX3JlYWRfZGlyX2Jsb2NrKGZzLCAqYmxvY2tfbnIsIHNiLT5kaXJfYnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJc2ItPmVycmNvZGUgPSByZXR2YWw7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwkJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayhmcywgKmJsb2NrX25yLCBzYi0+ZGlyX2J1Zik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXNiLT5lcnJjb2RlID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJfQorCWlmIChibG9ja2NudCA+PSAwKSB7CisJCWlmIChibG9ja2NudCA8IEVYVDJfTkRJUl9CTE9DS1MpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7CisJfQorCWlmIChibG9ja2NudCA9PSBCTE9DS19DT1VOVF9JTkQpIHsKKwkJaWYgKCpibG9ja19uciA9PSBzYi0+aW5vZGUtPmlfYmxvY2tbRVhUMl9JTkRfQkxPQ0tdKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBCTE9DS19DSEFOR0VEOworCX0KKwlpZiAoYmxvY2tjbnQgPT0gQkxPQ0tfQ09VTlRfRElORCkgeworCQlpZiAoKmJsb2NrX25yID09IHNiLT5pbm9kZS0+aV9ibG9ja1tFWFQyX0RJTkRfQkxPQ0tdKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBCTE9DS19DSEFOR0VEOworCX0KKwlpZiAoYmxvY2tjbnQgPT0gQkxPQ0tfQ09VTlRfVElORCkgeworCQlpZiAoKmJsb2NrX25yID09IHNiLT5pbm9kZS0+aV9ibG9ja1tFWFQyX1RJTkRfQkxPQ0tdKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBCTE9DS19DSEFOR0VEOworCX0KKwlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJ5dGUtc3dhcHBpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCwKKyAqIGJsb2NrIHBvaW50ZXJzLiAgSXQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgYnl0ZS1zd2FwcGluZyBkaXJlY3Rvcmllcy4KKyAqLworc3RhdGljIHZvaWQgc3dhcF9pbm9kZV9ibG9ja3MoZTJmc2NrX3QgY3R4LCBleHQyX2lub190IGlubywgY2hhciAqYmxvY2tfYnVmLAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQoreworCWVycmNvZGVfdCAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsOworCXN0cnVjdCBzd2FwX2Jsb2NrX3N0cnVjdCAgICAgICAgc2I7CisKKwlzYi5pbm8gPSBpbm87CisJc2IuaW5vZGUgPSBpbm9kZTsKKwlzYi5kaXJfYnVmID0gYmxvY2tfYnVmICsgY3R4LT5mcy0+YmxvY2tzaXplKjM7CisJc2IuZXJyY29kZSA9IDA7CisJc2IuaXNkaXIgPSAwOworCWlmIChMSU5VWF9TX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlzYi5pc2RpciA9IDE7CisKKwlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZShjdHgtPmZzLCBpbm8sIDAsIGJsb2NrX2J1ZiwKKwkJCQkgICAgICBzd2FwX2Jsb2NrLCAmc2IpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIGNhbGxpbmcgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUiKSk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJaWYgKHNiLmVycmNvZGUpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIGNhbGxpbmcgaXRlcmF0b3IgZnVuY3Rpb24iKSk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfaW5vZGVzKGUyZnNja190IGN0eCkKK3sKKwlleHQyX2ZpbHN5cyBmcyA9IGN0eC0+ZnM7CisJZGdycF90ICAgICAgICAgICAgICAgICAgZ3JvdXA7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgaTsKKwlleHQyX2lub190ICAgICAgICAgICAgICBpbm8gPSAxOworCWNoYXIgICAgICAgICAgICAgICAgICAgICpidWYsICpibG9ja19idWY7CisJZXJyY29kZV90ICAgICAgICAgICAgICAgcmV0dmFsOworCXN0cnVjdCBleHQyX2lub2RlICogICAgIGlub2RlOworCisJZTJmc2NrX3VzZV9pbm9kZV9zaG9ydGN1dHMoY3R4LCAxKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUgKiBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCwKKwkJCQkmYnVmKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSBhbGxvY2F0aW5nIGlub2RlIGJ1ZmZlciIpKTsKKwkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJcmV0dXJuOworCX0KKwlibG9ja19idWYgPSAoY2hhciAqKSBlMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGN0eCwgZnMtPmJsb2Nrc2l6ZSAqIDQsCisJCQkJCQkgICAgImJsb2NrIGludGVyYXRlIGJ1ZmZlciIpOworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBncm91cCsrKSB7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLAorCQkgICAgICBmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfaW5vZGVfdGFibGUsCisJCSAgICAgIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwLCBidWYpOworCQlpZiAocmV0dmFsKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmVhZGluZyBpbm9kZSB0YWJsZSAoZ3JvdXAgJWQpIiksCisJCQkJZ3JvdXApOworCQkJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19BQk9SVDsKKwkJCXJldHVybjsKKwkJfQorCQlpbm9kZSA9IChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKSBidWY7CisJCWZvciAoaT0wOyBpIDwgZnMtPnN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXA7CisJCSAgICAgaSsrLCBpbm8rKywgaW5vZGUrKykgeworCQkJY3R4LT5zdGFzaGVkX2lubyA9IGlubzsKKwkJCWN0eC0+c3Rhc2hlZF9pbm9kZSA9IGlub2RlOworCisJCQlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkKKwkJCQlleHQyZnNfc3dhcF9pbm9kZShmcywgaW5vZGUsIGlub2RlLCAwKTsKKworCQkJLyoKKwkJCSAqIFNraXAgZGVsZXRlZCBmaWxlcy4KKwkJCSAqLworCQkJaWYgKGlub2RlLT5pX2xpbmtzX2NvdW50ID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChMSU5VWF9TX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CisJCQkgICAgKChpbm9kZS0+aV9ibG9ja1tFWFQyX0lORF9CTE9DS10gfHwKKwkJCSAgICAgIGlub2RlLT5pX2Jsb2NrW0VYVDJfRElORF9CTE9DS10gfHwKKwkJCSAgICAgIGlub2RlLT5pX2Jsb2NrW0VYVDJfVElORF9CTE9DS10pICYmCisJCQkgICAgIGV4dDJmc19pbm9kZV9oYXNfdmFsaWRfYmxvY2tzKGlub2RlKSkpCisJCQkJc3dhcF9pbm9kZV9ibG9ja3MoY3R4LCBpbm8sIGJsb2NrX2J1ZiwgaW5vZGUpOworCisJCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJCXJldHVybjsKKworCQkJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKQorCQkJCWV4dDJmc19zd2FwX2lub2RlKGZzLCBpbm9kZSwgaW5vZGUsIDEpOworCQl9CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywKKwkJICAgICAgZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2lub2RlX3RhYmxlLAorCQkgICAgICBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCwgYnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHdyaXRpbmcgaW5vZGUgdGFibGUgKGdyb3VwICVkKSIpLAorCQkJCWdyb3VwKTsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCWV4dDJmc19mcmVlX21lbSgmYmxvY2tfYnVmKTsKKwllMmZzY2tfdXNlX2lub2RlX3Nob3J0Y3V0cyhjdHgsIDApOworCWV4dDJmc19mbHVzaF9pY2FjaGUoZnMpOworfQorCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgQkJfQklHX0VORElBTgorLyoKKyAqIE9uIHRoZSBQb3dlclBDLCB0aGUgYmlnLWVuZGlhbiB2YXJpYW50IG9mIHRoZSBleHQyIGZpbGVzeXN0ZW0KKyAqIGhhcyBpdHMgYml0bWFwcyBzdG9yZWQgYXMgMzItYml0IHdvcmRzIHdpdGggYml0IDAgYXMgdGhlIExTQgorICogb2YgZWFjaCB3b3JkLiAgVGh1cyBhIGJpdG1hcCB3aXRoIG9ubHkgYml0IDAgc2V0IHdvdWxkIGJlLCBhcworICogYSBzdHJpbmcgb2YgYnl0ZXMsIDAwIDAwIDAwIDAxIDAwIC4uLgorICogVG8gY29wZSB3aXRoIHRoaXMsIHdlIGJ5dGUtcmV2ZXJzZSBlYWNoIHdvcmQgb2YgYSBiaXRtYXAgaWYKKyAqIHdlIGhhdmUgYSBiaWctZW5kaWFuIGZpbGVzeXN0ZW0sIHRoYXQgaXMsIGlmIHdlIGFyZSAqbm90KgorICogYnl0ZS1zd2FwcGluZyBvdGhlciB3b3JkLXNpemVkIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKKyNlbmRpZgorCisjaWZkZWYgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKK3N0YXRpYyB2b2lkIGV4dDJmc19zd2FwX2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgYm1hcCkKK3sKKwlfX3UzMiAqcCA9IChfX3UzMiAqKSBibWFwLT5iaXRtYXA7CisJaW50IG4sIG5ieXRlcyA9IChibWFwLT5lbmQgLSBibWFwLT5zdGFydCArIDcpIC8gODsKKworCWZvciAobiA9IG5ieXRlcyAvIHNpemVvZihfX3UzMik7IG4gPiAwOyAtLW4sICsrcCkKKwkJKnAgPSBleHQyZnNfc3dhYjMyKCpwKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBFTkFCTEVfU1dBUEZTCitzdGF0aWMgdm9pZCBzd2FwX2ZpbGVzeXMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlpZiAoIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1BSRUVOKSkKKwkJcHJpbnRmKF8oIlBhc3MgMDogRG9pbmcgYnl0ZS1zd2FwIG9mIGZpbGVzeXN0ZW1cbiIpKTsKKworCS8qIEJ5dGUgc3dhcCAqLworCisJaWYgKGZzLT5zdXBlci0+c19tbnRfY291bnQpIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIiVzOiB0aGUgZmlsZXN5c3RlbSBtdXN0IGJlIGZyZXNobHkgIgorCQkJImNoZWNrZWQgdXNpbmcgZnNja1xuIgorCQkJImFuZCBub3QgbW91bnRlZCBiZWZvcmUgdHJ5aW5nIHRvICIKKwkJCSJieXRlLXN3YXAgaXQuXG4iKSwgY3R4LT5kZXZpY2VfbmFtZSk7CisJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfQUJPUlQ7CisJCXJldHVybjsKKwl9CisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB7CisJCWZzLT5mbGFncyAmPSB+KEVYVDJfRkxBR19TV0FQX0JZVEVTfAorCQkJICAgICAgIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKTsKKwkJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQ7CisJfSBlbHNlIHsKKwkJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEOworCQlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEU7CisJfQorCXN3YXBfaW5vZGVzKGN0eCk7CisJaWYgKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TSUdOQUxfTUFTSykKKwkJcmV0dXJuOworCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSkKKwkJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19TV0FQX0JZVEVTOworCWZzLT5mbGFncyAmPSB+KEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUR8CisJCSAgICAgICBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSk7CisKKyNpZmRlZiBFWFQyX0JJR19FTkRJQU5fQklUTUFQUworCWUyZnNja19yZWFkX2JpdG1hcHMoY3R4KTsKKwlleHQyZnNfc3dhcF9iaXRtYXAoZnMtPmlub2RlX21hcCk7CisJZXh0MmZzX3N3YXBfYml0bWFwKGZzLT5ibG9ja19tYXApOworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfQkJfRElSVFkgfCBFWFQyX0ZMQUdfSUJfRElSVFk7CisjZW5kaWYKKwlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19NQVNURVJfU0JfT05MWTsKKwlleHQyZnNfZmx1c2goZnMpOworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFk7Cit9CisjZW5kaWYgIC8qIEVOQUJMRV9TV0FQRlMgKi8KKworI2VuZGlmCisKKy8qCisgKiB1dGlsLmMgLS0tIG1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzCisgKi8KKworCit2b2lkICplMmZzY2tfYWxsb2NhdGVfbWVtb3J5KGUyZnNja190IGN0eCwgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKQoreworCXZvaWQgKnJldDsKKwljaGFyIGJ1ZlsyNTZdOworCisJcmV0ID0geHphbGxvYyhzaXplKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciAqc3RyaW5nX2NvcHkoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCWNoYXIgICAgKnJldDsKKworCWlmICghc3RyKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWxlbikKKwkJbGVuID0gc3RybGVuKHN0cik7CisJcmV0ID0geG1hbGxvYyhsZW4rMSk7CisJc3RybmNweShyZXQsIHN0ciwgbGVuKTsKKwlyZXRbbGVuXSA9IDA7CisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBIQVZFX0NPTklPX0gKK3N0YXRpYyBpbnQgcmVhZF9hX2NoYXIodm9pZCkKK3sKKwljaGFyICAgIGM7CisJaW50ICAgICByOworCWludCAgICAgZmFpbCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoZTJmc2NrX2dsb2JhbF9jdHggJiYKKwkJICAgIChlMmZzY2tfZ2xvYmFsX2N0eC0+ZmxhZ3MgJiBFMkZfRkxBR19DQU5DRUwpKSB7CisJCQlyZXR1cm4gMzsKKwkJfQorCQlyID0gcmVhZCgwLCAmYywgMSk7CisJCWlmIChyID09IDEpCisJCQlyZXR1cm4gYzsKKwkJaWYgKGZhaWwrKyA+IDEwMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gRU9GOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXNrX3luKGNvbnN0IGNoYXIgKiBzdHJpbmcsIGludCBkZWYpCit7CisJaW50ICAgICAgICAgICAgIGM7CisJY29uc3QgY2hhciAgICAgICpkZWZzdHI7CisJc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRfeWVzW10gPSAieVkiOworCXN0YXRpYyBjb25zdCBjaGFyIHNob3J0X25vW10gPSAibk4iOworCisjaWZkZWYgSEFWRV9URVJNSU9TX0gKKwlzdHJ1Y3QgdGVybWlvcyAgdGVybWlvcywgdG1wOworCisJdGNnZXRhdHRyICgwLCAmdGVybWlvcyk7CisJdG1wID0gdGVybWlvczsKKwl0bXAuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworCXRtcC5jX2NjW1ZNSU5dID0gMTsKKwl0bXAuY19jY1tWVElNRV0gPSAwOworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0bXApOworI2VuZGlmCisKKwlpZiAoZGVmID09IDEpCisJCWRlZnN0ciA9ICI8eT4iOworCWVsc2UgaWYgKGRlZiA9PSAwKQorCQlkZWZzdHIgPSAiPG4+IjsKKwllbHNlCisJCWRlZnN0ciA9ICIgKHkvbikiOworCXByaW50ZigiJXMlcz8gIiwgc3RyaW5nLCBkZWZzdHIpOworCXdoaWxlICgxKSB7CisJCWZmbHVzaCAoc3Rkb3V0KTsKKwkJaWYgKChjID0gcmVhZF9hX2NoYXIoKSkgPT0gRU9GKQorCQkJYnJlYWs7CisJCWlmIChjID09IDMpIHsKKyNpZmRlZiBIQVZFX1RFUk1JT1NfSAorCQkJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRlcm1pb3MpOworI2VuZGlmCisJCQlpZiAoZTJmc2NrX2dsb2JhbF9jdHggJiYKKwkJCSAgICBlMmZzY2tfZ2xvYmFsX2N0eC0+ZmxhZ3MgJiBFMkZfRkxBR19TRVRKTVBfT0spIHsKKwkJCQlwdXRzKCJcbiIpOworCQkJCWxvbmdqbXAoZTJmc2NrX2dsb2JhbF9jdHgtPmFib3J0X2xvYywgMSk7CisJCQl9CisJCQlwdXRzKF8oImNhbmNlbGxlZCFcbiIpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzdHJjaHIoc2hvcnRfeWVzLCAoY2hhcikgYykpIHsKKwkJCWRlZiA9IDE7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmIChzdHJjaHIoc2hvcnRfbm8sIChjaGFyKSBjKSkgeworCQkJZGVmID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKChjID09ICcgJyB8fCBjID09ICdcbicpICYmIChkZWYgIT0gLTEpKQorCQkJYnJlYWs7CisJfQorCWlmIChkZWYpCisJCXB1dHMoInllc1xuIik7CisJZWxzZQorCQlwdXRzICgibm9cbiIpOworI2lmZGVmIEhBVkVfVEVSTUlPU19ICisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRlcm1pb3MpOworI2VuZGlmCisJcmV0dXJuIGRlZjsKK30KKworaW50IGFzayAoZTJmc2NrX3QgY3R4LCBjb25zdCBjaGFyICogc3RyaW5nLCBpbnQgZGVmKQoreworCWlmIChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX05PKSB7CisJCXByaW50ZihfKCIlcz8gbm9cblxuIiksIHN0cmluZyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9ZRVMpIHsKKwkJcHJpbnRmKF8oIiVzPyB5ZXNcblxuIiksIHN0cmluZyk7CisJCXJldHVybiAxOworCX0KKwlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikgeworCQlwcmludGYoIiVzPyAlc1xuXG4iLCBzdHJpbmcsIGRlZiA/IF8oInllcyIpIDogXygibm8iKSk7CisJCXJldHVybiBkZWY7CisJfQorCXJldHVybiBhc2tfeW4oc3RyaW5nLCBkZWYpOworfQorCit2b2lkIGUyZnNja19yZWFkX2JpdG1hcHMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCisJaWYgKGN0eC0+aW52YWxpZF9iaXRtYXBzKSB7CisJCWJiX2Vycm9yX21zZyhfKCJlMmZzY2tfcmVhZF9iaXRtYXBzOiBpbGxlZ2FsIGJpdG1hcCBibG9jayhzKSBmb3IgJXMiKSwKKwkJCWN0eC0+ZGV2aWNlX25hbWUpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9CisKKwllaGFuZGxlcl9vcGVyYXRpb24oXygicmVhZGluZyBpbm9kZSBhbmQgYmxvY2sgYml0bWFwcyIpKTsKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9iaXRtYXBzKGZzKTsKKwllaGFuZGxlcl9vcGVyYXRpb24oMCk7CisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmV0cnlpbmcgdG8gcmVhZCBiaXRtYXBzIGZvciAlcyIpLAorCQkJY3R4LT5kZXZpY2VfbmFtZSk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KK30KKworc3RhdGljIHZvaWQgZTJmc2NrX3dyaXRlX2JpdG1hcHMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCisJaWYgKGV4dDJmc190ZXN0X2JiX2RpcnR5KGZzKSkgeworCQllaGFuZGxlcl9vcGVyYXRpb24oXygid3JpdGluZyBibG9jayBiaXRtYXBzIikpOworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfYmxvY2tfYml0bWFwKGZzKTsKKwkJZWhhbmRsZXJfb3BlcmF0aW9uKDApOworCQlpZiAocmV0dmFsKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmV0cnlpbmcgdG8gd3JpdGUgYmxvY2sgYml0bWFwcyBmb3IgJXMiKSwKKwkJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCQl9CisJfQorCisJaWYgKGV4dDJmc190ZXN0X2liX2RpcnR5KGZzKSkgeworCQllaGFuZGxlcl9vcGVyYXRpb24oXygid3JpdGluZyBpbm9kZSBiaXRtYXBzIikpOworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGVfYml0bWFwKGZzKTsKKwkJZWhhbmRsZXJfb3BlcmF0aW9uKDApOworCQlpZiAocmV0dmFsKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmV0cnlpbmcgdG8gd3JpdGUgaW5vZGUgYml0bWFwcyBmb3IgJXMiKSwKKwkJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCQl9CisJfQorfQorCit2b2lkIHByZWVuaGFsdChlMmZzY2tfdCBjdHgpCit7CisJZXh0Ml9maWxzeXMgZnMgPSBjdHgtPmZzOworCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikpCisJCXJldHVybjsKKwlmcHJpbnRmKHN0ZGVyciwgXygiXG5cbiVzOiBVTkVYUEVDVEVEIElOQ09OU0lTVEVOQ1k7ICIKKwkJIlJVTiBmc2NrIE1BTlVBTExZLlxuXHQoaS5lLiwgd2l0aG91dCAtYSBvciAtcCBvcHRpb25zKVxuIiksCisJICAgICAgIGN0eC0+ZGV2aWNlX25hbWUpOworCWlmIChmcyAhPSBOVUxMKSB7CisJCWZzLT5zdXBlci0+c19zdGF0ZSB8PSBFWFQyX0VSUk9SX0ZTOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCWV4dDJmc19jbG9zZShmcyk7CisJfQorCWV4aXQoRVhJVF9VTkNPUlJFQ1RFRCk7Cit9CisKK3ZvaWQgZTJmc2NrX3JlYWRfaW5vZGUoZTJmc2NrX3QgY3R4LCB1bnNpZ25lZCBsb25nIGlubywKKwkJCSAgICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsIGNvbnN0IGNoYXIgKnByb2MpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGN0eC0+ZnMsIGlubywgaW5vZGUpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHJlYWRpbmcgaW5vZGUgJWxkIGluICVzIiksIGlubywgcHJvYyk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KK30KKworZXh0ZXJuIHZvaWQgZTJmc2NrX3dyaXRlX2lub2RlX2Z1bGwoZTJmc2NrX3QgY3R4LCB1bnNpZ25lZCBsb25nIGlubywKKwkJCSAgICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqIGlub2RlLCBpbnQgYnVmc2l6ZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwcm9jKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGVfZnVsbChjdHgtPmZzLCBpbm8sIGlub2RlLCBidWZzaXplKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSB3cml0aW5nIGlub2RlICVsZCBpbiAlcyIpLCBpbm8sIHByb2MpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9Cit9CisKK2V4dGVybiB2b2lkIGUyZnNja193cml0ZV9pbm9kZShlMmZzY2tfdCBjdHgsIHVuc2lnbmVkIGxvbmcgaW5vLAorCQkJICAgICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUsIGNvbnN0IGNoYXIgKnByb2MpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGV4dDJmc193cml0ZV9pbm9kZShjdHgtPmZzLCBpbm8sIGlub2RlKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSB3cml0aW5nIGlub2RlICVsZCBpbiAlcyIpLCBpbm8sIHByb2MpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9Cit9CisKK2Jsa190IGdldF9iYWNrdXBfc2IoZTJmc2NrX3QgY3R4LCBleHQyX2ZpbHN5cyBmcywgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgaW9fbWFuYWdlciBtYW5hZ2VyKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsKKwlpb19jaGFubmVsICAgICAgICAgICAgICBpbyA9IE5VTEw7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CisJaW50ICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplOworCWJsa190ICAgICAgICAgICAgICAgICAgIHN1cGVyYmxvY2ssIHJldF9zYiA9IDgxOTM7CisKKwlpZiAoZnMgJiYgZnMtPnN1cGVyKSB7CisJCXJldF9zYiA9IChmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCArCisJCQkgIGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwkJaWYgKGN0eCkgeworCQkJY3R4LT5zdXBlcmJsb2NrID0gcmV0X3NiOworCQkJY3R4LT5ibG9ja3NpemUgPSBmcy0+YmxvY2tzaXplOworCQl9CisJCXJldHVybiByZXRfc2I7CisJfQorCisJaWYgKGN0eCkgeworCQlpZiAoY3R4LT5ibG9ja3NpemUpIHsKKwkJCXJldF9zYiA9IGN0eC0+YmxvY2tzaXplICogODsKKwkJCWlmIChjdHgtPmJsb2Nrc2l6ZSA9PSAxMDI0KQorCQkJCXJldF9zYisrOworCQkJY3R4LT5zdXBlcmJsb2NrID0gcmV0X3NiOworCQkJcmV0dXJuIHJldF9zYjsKKwkJfQorCQljdHgtPnN1cGVyYmxvY2sgPSByZXRfc2I7CisJCWN0eC0+YmxvY2tzaXplID0gMTAyNDsKKwl9CisKKwlpZiAoIW5hbWUgfHwgIW1hbmFnZXIpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChtYW5hZ2VyLT5vcGVuKG5hbWUsIDAsICZpbykgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGV4dDJmc19nZXRfbWVtKFNVUEVSQkxPQ0tfU0laRSwgJmJ1ZikpCisJCWdvdG8gY2xlYW51cDsKKwlzYiA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKSBidWY7CisKKwlmb3IgKGJsb2Nrc2l6ZSA9IEVYVDJfTUlOX0JMT0NLX1NJWkU7CisJICAgICBibG9ja3NpemUgPD0gRVhUMl9NQVhfQkxPQ0tfU0laRTsgYmxvY2tzaXplICo9IDIpIHsKKwkJc3VwZXJibG9jayA9IGJsb2Nrc2l6ZSo4OworCQlpZiAoYmxvY2tzaXplID09IDEwMjQpCisJCQlzdXBlcmJsb2NrKys7CisJCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoaW8sIGJsb2Nrc2l6ZSk7CisJCWlmIChpb19jaGFubmVsX3JlYWRfYmxrKGlvLCBzdXBlcmJsb2NrLAorCQkJCQktU1VQRVJCTE9DS19TSVpFLCBidWYpKQorCQkJY29udGludWU7CisjaWYgQkJfQklHX0VORElBTgorCQlpZiAoc2ItPnNfbWFnaWMgPT0gZXh0MmZzX3N3YWIxNihFWFQyX1NVUEVSX01BR0lDKSkKKwkJCWV4dDJmc19zd2FwX3N1cGVyKHNiKTsKKyNlbmRpZgorCQlpZiAoc2ItPnNfbWFnaWMgPT0gRVhUMl9TVVBFUl9NQUdJQykgeworCQkJcmV0X3NiID0gc3VwZXJibG9jazsKKwkJCWlmIChjdHgpIHsKKwkJCQljdHgtPnN1cGVyYmxvY2sgPSBzdXBlcmJsb2NrOworCQkJCWN0eC0+YmxvY2tzaXplID0gYmxvY2tzaXplOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKK2NsZWFudXA6CisJaWYgKGlvKQorCQlpb19jaGFubmVsX2Nsb3NlKGlvKTsKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJcmV0dXJuIHJldF9zYjsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIGUyZnNjayBwYXNzZXMgYW5kIGNhbGxzIHRoZW0gYWxsLAorICogcmV0dXJuaW5nIHJlc3RhcnQsIGFib3J0LCBvciBjYW5jZWwgYXMgbmVjZXNzYXJ5Li4uCisgKi8KK3R5cGVkZWYgdm9pZCAoKnBhc3NfdCkoZTJmc2NrX3QgY3R4KTsKKworc3RhdGljIGNvbnN0IHBhc3NfdCBlMmZzY2tfcGFzc2VzW10gPSB7CisJZTJmc2NrX3Bhc3MxLCBlMmZzY2tfcGFzczIsIGUyZnNja19wYXNzMywgZTJmc2NrX3Bhc3M0LAorCWUyZnNja19wYXNzNSwgMCB9OworCisjZGVmaW5lIEUyRl9GTEFHX1JVTl9SRVRVUk4gICAgIChFMkZfRkxBR19TSUdOQUxfTUFTS3xFMkZfRkxBR19SRVNUQVJUKQorCitzdGF0aWMgaW50IGUyZnNja19ydW4oZTJmc2NrX3QgY3R4KQoreworCWludCAgICAgaTsKKwlwYXNzX3QgIGUyZnNja19wYXNzOworCisJaWYgKHNldGptcChjdHgtPmFib3J0X2xvYykpIHsKKwkJY3R4LT5mbGFncyAmPSB+RTJGX0ZMQUdfU0VUSk1QX09LOworCQlyZXR1cm4gKGN0eC0+ZmxhZ3MgJiBFMkZfRkxBR19SVU5fUkVUVVJOKTsKKwl9CisJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19TRVRKTVBfT0s7CisKKwlmb3IgKGk9MDsgKGUyZnNja19wYXNzID0gZTJmc2NrX3Bhc3Nlc1tpXSk7IGkrKykgeworCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1JVTl9SRVRVUk4pCisJCQlicmVhazsKKwkJZTJmc2NrX3Bhc3MoY3R4KTsKKwkJaWYgKGN0eC0+cHJvZ3Jlc3MpCisJCQkodm9pZCkgKGN0eC0+cHJvZ3Jlc3MpKGN0eCwgMCwgMCwgMCk7CisJfQorCWN0eC0+ZmxhZ3MgJj0gfkUyRl9GTEFHX1NFVEpNUF9PSzsKKworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfUlVOX1JFVFVSTikKKwkJcmV0dXJuIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfUlVOX1JFVFVSTik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHVuaXguYyAtIFRoZSB1bml4LXNwZWNpZmljIGNvZGUgZm9yIGUyZnNjaworICovCisKKworLyogQ29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgc3dhcGZzOworI2lmZGVmIEVOQUJMRV9TV0FQRlMKK3N0YXRpYyBpbnQgbm9ybWFsaXplX3N3YXBmczsKKyNlbmRpZgorc3RhdGljIGludCBjZmxhZzsgICAgICAgICAgICAgICAvKiBjaGVjayBkaXNrICovCitzdGF0aWMgaW50IHNob3dfdmVyc2lvbl9vbmx5Oworc3RhdGljIGludCB2ZXJib3NlOworCisjZGVmaW5lIFBfRTIoc2luZ3VsYXIsIHBsdXJhbCwgbikgICAgICAgbiwgKChuKSA9PSAxID8gc2luZ3VsYXIgOiBwbHVyYWwpCisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwlpbnQgaW5vZGVzLCBpbm9kZXNfdXNlZCwgYmxvY2tzLCBibG9ja3NfdXNlZDsKKwlpbnQgZGlyX2xpbmtzOworCWludCBudW1fZmlsZXMsIG51bV9saW5rczsKKwlpbnQgZnJhZ19wZXJjZW50OworCisJZGlyX2xpbmtzID0gMiAqIGN0eC0+ZnNfZGlyZWN0b3J5X2NvdW50IC0gMTsKKwludW1fZmlsZXMgPSBjdHgtPmZzX3RvdGFsX2NvdW50IC0gZGlyX2xpbmtzOworCW51bV9saW5rcyA9IGN0eC0+ZnNfbGlua3NfY291bnQgLSBkaXJfbGlua3M7CisJaW5vZGVzID0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudDsKKwlpbm9kZXNfdXNlZCA9IChmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50IC0KKwkJICAgICAgIGZzLT5zdXBlci0+c19mcmVlX2lub2Rlc19jb3VudCk7CisJYmxvY2tzID0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudDsKKwlibG9ja3NfdXNlZCA9IChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IC0KKwkJICAgICAgIGZzLT5zdXBlci0+c19mcmVlX2Jsb2Nrc19jb3VudCk7CisKKwlmcmFnX3BlcmNlbnQgPSAoMTAwMDAgKiBjdHgtPmZzX2ZyYWdtZW50ZWQpIC8gaW5vZGVzX3VzZWQ7CisJZnJhZ19wZXJjZW50ID0gKGZyYWdfcGVyY2VudCArIDUpIC8gMTA7CisKKwlpZiAoIXZlcmJvc2UpIHsKKwkJcHJpbnRmKCIlczogJWQvJWQgZmlsZXMgKCUwZC4lZCUlIG5vbi1jb250aWd1b3VzKSwgJWQvJWQgYmxvY2tzXG4iLAorCQkgICAgICAgY3R4LT5kZXZpY2VfbmFtZSwgaW5vZGVzX3VzZWQsIGlub2RlcywKKwkJICAgICAgIGZyYWdfcGVyY2VudCAvIDEwLCBmcmFnX3BlcmNlbnQgJSAxMCwKKwkJICAgICAgIGJsb2Nrc191c2VkLCBibG9ja3MpOworCQlyZXR1cm47CisJfQorCXByaW50ZigiXG4lOGQgaW5vZGUlcyB1c2VkICglZCUlKVxuIiwgUF9FMigiIiwgInMiLCBpbm9kZXNfdXNlZCksCisJCTEwMCAqIGlub2Rlc191c2VkIC8gaW5vZGVzKTsKKwlwcmludGYoIiU4ZCBub24tY29udGlndW91cyBpbm9kZSVzICglMGQuJWQlJSlcbiIsCisJCVBfRTIoIiIsICJzIiwgY3R4LT5mc19mcmFnbWVudGVkKSwKKwkJZnJhZ19wZXJjZW50IC8gMTAsIGZyYWdfcGVyY2VudCAlIDEwKTsKKwlwcmludGYoXygiICAgICAgICAgIyBvZiBpbm9kZXMgd2l0aCBpbmQvZGluZC90aW5kIGJsb2NrczogJWQvJWQvJWRcbiIpLAorCQljdHgtPmZzX2luZF9jb3VudCwgY3R4LT5mc19kaW5kX2NvdW50LCBjdHgtPmZzX3RpbmRfY291bnQpOworCXByaW50ZigiJThkIGJsb2NrJXMgdXNlZCAoJWQlJSlcbiIsIFBfRTIoIiIsICJzIiwgYmxvY2tzX3VzZWQpLAorCQkoaW50KSAoKGxvbmcgbG9uZykgMTAwICogYmxvY2tzX3VzZWQgLyBibG9ja3MpKTsKKwlwcmludGYoIiU4ZCBsYXJnZSBmaWxlJXNcbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5sYXJnZV9maWxlcykpOworCXByaW50ZigiXG4lOGQgcmVndWxhciBmaWxlJXNcbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19yZWd1bGFyX2NvdW50KSk7CisJcHJpbnRmKCIlOGQgZGlyZWN0b3Ilc1xuIiwgUF9FMigieSIsICJpZXMiLCBjdHgtPmZzX2RpcmVjdG9yeV9jb3VudCkpOworCXByaW50ZigiJThkIGNoYXJhY3RlciBkZXZpY2UgZmlsZSVzXG4iLCBQX0UyKCIiLCAicyIsIGN0eC0+ZnNfY2hhcmRldl9jb3VudCkpOworCXByaW50ZigiJThkIGJsb2NrIGRldmljZSBmaWxlJXNcbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19ibG9ja2Rldl9jb3VudCkpOworCXByaW50ZigiJThkIGZpZm8lc1xuIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX2ZpZm9fY291bnQpKTsKKwlwcmludGYoIiU4ZCBsaW5rJXNcbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19saW5rc19jb3VudCAtIGRpcl9saW5rcykpOworCXByaW50ZigiJThkIHN5bWJvbGljIGxpbmslcyIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19zeW1saW5rc19jb3VudCkpOworCXByaW50ZigiICglZCBmYXN0IHN5bWJvbGljIGxpbmslcylcbiIsIFBfRTIoIiIsICJzIiwgY3R4LT5mc19mYXN0X3N5bWxpbmtzX2NvdW50KSk7CisJcHJpbnRmKCIlOGQgc29ja2V0JXMtLS0tLS0tLVxuXG4iLCBQX0UyKCIiLCAicyIsIGN0eC0+ZnNfc29ja2V0c19jb3VudCkpOworCXByaW50ZigiJThkIGZpbGUlc1xuIiwgUF9FMigiIiwgInMiLCBjdHgtPmZzX3RvdGFsX2NvdW50IC0gZGlyX2xpbmtzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX21vdW50KGUyZnNja190IGN0eCkKK3sKKwllcnJjb2RlX3QgICAgICAgcmV0dmFsOworCWludCAgICAgICAgICAgICBjb250OworCisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQoY3R4LT5maWxlc3lzdGVtX25hbWUsCisJCQkJCSAmY3R4LT5tb3VudF9mbGFncyk7CisJaWYgKHJldHZhbCkgeworCQliYl9lcnJvcl9tc2coXygid2hpbGUgZGV0ZXJtaW5pbmcgd2hldGhlciAlcyBpcyBtb3VudGVkIiksCisJCQljdHgtPmZpbGVzeXN0ZW1fbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGlzbid0IG1vdW50ZWQsIG9yIGl0J3MgdGhlIHJvb3QgZmlsZXN5c3RlbQorCSAqIGFuZCBpdCdzIG1vdW50ZWQgcmVhZC1vbmx5LCB0aGVuIGV2ZXJ5dGhpbmcncyBmaW5lLgorCSAqLworCWlmICgoIShjdHgtPm1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKSkgfHwKKwkgICAgKChjdHgtPm1vdW50X2ZsYWdzICYgRVhUMl9NRl9JU1JPT1QpICYmCisJICAgICAoY3R4LT5tb3VudF9mbGFncyAmIEVYVDJfTUZfUkVBRE9OTFkpKSkKKwkJcmV0dXJuOworCisJaWYgKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUkVBRE9OTFkpIHsKKwkJcHJpbnRmKF8oIldhcm5pbmchICAlcyBpcyBtb3VudGVkLlxuIiksIGN0eC0+ZmlsZXN5c3RlbV9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZihfKCIlcyBpcyBtb3VudGVkLiAgIiksIGN0eC0+ZmlsZXN5c3RlbV9uYW1lKTsKKwlpZiAoIWN0eC0+aW50ZXJhY3RpdmUpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKF8oImNhbid0IGNvbnRpbnVlLCBhYm9ydGluZyIpKTsKKwlwcmludGYoXygiXG5cblwwMDdcMDA3XDAwN1wwMDdXQVJOSU5HISEhICAiCisJICAgICAgICJSdW5uaW5nIGUyZnNjayBvbiBhIG1vdW50ZWQgZmlsZXN5c3RlbSBtYXkgY2F1c2VcbiIKKwkgICAgICAgIlNFVkVSRSBmaWxlc3lzdGVtIGRhbWFnZS5cMDA3XDAwN1wwMDdcblxuIikpOworCWNvbnQgPSBhc2tfeW4oXygiRG8geW91IHJlYWxseSB3YW50IHRvIGNvbnRpbnVlIiksIC0xKTsKKwlpZiAoIWNvbnQpIHsKKwkJcHJpbnRmKF8oImNoZWNrIGFib3J0ZWQuXG4iKSk7CisJCWV4aXQoMCk7CisJfQorfQorCitzdGF0aWMgaW50IGlzX29uX2JhdHQodm9pZCkKK3sKKwlGSUxFICAgICpmOworCURJUiAgICAgKmQ7CisJY2hhciAgICB0bXBbODBdLCB0bXAyWzgwXSwgZm5hbWVbODBdOworCXVuc2lnbmVkIGludCAgICBhY2ZsYWc7CisJc3RydWN0IGRpcmVudCogIGRlOworCisJZiA9IGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9hcG0iKTsKKwlpZiAoZikgeworCQlpZiAoZnNjYW5mKGYsICIlcyAlcyAlcyAleCIsIHRtcCwgdG1wLCB0bXAsICZhY2ZsYWcpICE9IDQpCisJCQlhY2ZsYWcgPSAxOworCQlmY2xvc2UoZik7CisJCXJldHVybiAoYWNmbGFnICE9IDEpOworCX0KKwlkID0gb3BlbmRpcigiL3Byb2MvYWNwaS9hY19hZGFwdGVyIik7CisJaWYgKGQpIHsKKwkJd2hpbGUgKChkZT1yZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisJCQlpZiAoIXN0cm5jbXAoIi4iLCBkZS0+ZF9uYW1lLCAxKSkKKwkJCQljb250aW51ZTsKKwkJCXNucHJpbnRmKGZuYW1lLCA4MCwgIi9wcm9jL2FjcGkvYWNfYWRhcHRlci8lcy9zdGF0ZSIsCisJCQkJIGRlLT5kX25hbWUpOworCQkJZiA9IGZvcGVuX2Zvcl9yZWFkKGZuYW1lKTsKKwkJCWlmICghZikKKwkJCQljb250aW51ZTsKKwkJCWlmIChmc2NhbmYoZiwgIiVzICVzIiwgdG1wMiwgdG1wKSAhPSAyKQorCQkJCXRtcFswXSA9IDA7CisJCQlmY2xvc2UoZik7CisJCQlpZiAoc3RybmNtcCh0bXAsICJvZmYtbGluZSIsIDgpID09IDApIHsKKwkJCQljbG9zZWRpcihkKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQljbG9zZWRpcihkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIHRvIHNlZSBpZiBhIGZpbGVzeXN0ZW0gY2FuIGJlIHNraXBwZWQ7IGlmIHNvLAorICogaXQgd2lsbCBleGl0IHdpdGggRVhJVF9PSy4gIFVuZGVyIHNvbWUgY29uZGl0aW9ucyBpdCB3aWxsIHByaW50IGEKKyAqIG1lc3NhZ2UgZXhwbGFpbmluZyB3aHkgYSBjaGVjayBpcyBiZWluZyBmb3JjZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2lmX3NraXAoZTJmc2NrX3QgY3R4KQoreworCWV4dDJfZmlsc3lzIGZzID0gY3R4LT5mczsKKwljb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOworCXVuc2lnbmVkIGludCByZWFzb25fYXJnID0gMDsKKwlsb25nIG5leHRfY2hlY2s7CisJaW50IGJhdHQgPSBpc19vbl9iYXR0KCk7CisJdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisKKwlpZiAoKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfRk9SQ0UpIHx8IGNmbGFnIHx8IHN3YXBmcykKKwkJcmV0dXJuOworCisJaWYgKChmcy0+c3VwZXItPnNfc3RhdGUgJiBFWFQyX0VSUk9SX0ZTKSB8fAorCSAgICAhZXh0MmZzX3Rlc3RfdmFsaWQoZnMpKQorCQlyZWFzb24gPSBfKCIgY29udGFpbnMgYSBmaWxlIHN5c3RlbSB3aXRoIGVycm9ycyIpOworCWVsc2UgaWYgKChmcy0+c3VwZXItPnNfc3RhdGUgJiBFWFQyX1ZBTElEX0ZTKSA9PSAwKQorCQlyZWFzb24gPSBfKCIgd2FzIG5vdCBjbGVhbmx5IHVubW91bnRlZCIpOworCWVsc2UgaWYgKChmcy0+c3VwZXItPnNfbWF4X21udF9jb3VudCA+IDApICYmCisJCSAoZnMtPnN1cGVyLT5zX21udF9jb3VudCA+PQorCQkgICh1bnNpZ25lZCkgZnMtPnN1cGVyLT5zX21heF9tbnRfY291bnQpKSB7CisJCXJlYXNvbiA9IF8oIiBoYXMgYmVlbiBtb3VudGVkICV1IHRpbWVzIHdpdGhvdXQgYmVpbmcgY2hlY2tlZCIpOworCQlyZWFzb25fYXJnID0gZnMtPnN1cGVyLT5zX21udF9jb3VudDsKKwkJaWYgKGJhdHQgJiYgKGZzLT5zdXBlci0+c19tbnRfY291bnQgPAorCQkJICAgICAodW5zaWduZWQpIGZzLT5zdXBlci0+c19tYXhfbW50X2NvdW50KjIpKQorCQkJcmVhc29uID0gMDsKKwl9IGVsc2UgaWYgKGZzLT5zdXBlci0+c19jaGVja2ludGVydmFsICYmCisJCSAgICgobm93IC0gZnMtPnN1cGVyLT5zX2xhc3RjaGVjaykgPj0KKwkJICAgIGZzLT5zdXBlci0+c19jaGVja2ludGVydmFsKSkgeworCQlyZWFzb24gPSBfKCIgaGFzIGdvbmUgJXUgZGF5cyB3aXRob3V0IGJlaW5nIGNoZWNrZWQiKTsKKwkJcmVhc29uX2FyZyA9IChub3cgLSBmcy0+c3VwZXItPnNfbGFzdGNoZWNrKS8oMzYwMCoyNCk7CisJCWlmIChiYXR0ICYmICgobm93IC0gZnMtPnN1cGVyLT5zX2xhc3RjaGVjaykgPAorCQkJICAgICBmcy0+c3VwZXItPnNfY2hlY2tpbnRlcnZhbCoyKSkKKwkJCXJlYXNvbiA9IDA7CisJfQorCWlmIChyZWFzb24pIHsKKwkJZnB1dHMoY3R4LT5kZXZpY2VfbmFtZSwgc3Rkb3V0KTsKKwkJcHJpbnRmKHJlYXNvbiwgcmVhc29uX2FyZyk7CisJCWZwdXRzKF8oIiwgY2hlY2sgZm9yY2VkLlxuIiksIHN0ZG91dCk7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKF8oIiVzOiBjbGVhbiwgJWQvJWQgZmlsZXMsICVkLyVkIGJsb2NrcyIpLCBjdHgtPmRldmljZV9uYW1lLAorCSAgICAgICBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50IC0gZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50LAorCSAgICAgICBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50LAorCSAgICAgICBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IC0gZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50LAorCSAgICAgICBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KTsKKwluZXh0X2NoZWNrID0gMTAwMDAwOworCWlmIChmcy0+c3VwZXItPnNfbWF4X21udF9jb3VudCA+IDApIHsKKwkJbmV4dF9jaGVjayA9IGZzLT5zdXBlci0+c19tYXhfbW50X2NvdW50IC0gZnMtPnN1cGVyLT5zX21udF9jb3VudDsKKwkJaWYgKG5leHRfY2hlY2sgPD0gMCkKKwkJCW5leHRfY2hlY2sgPSAxOworCX0KKwlpZiAoZnMtPnN1cGVyLT5zX2NoZWNraW50ZXJ2YWwgJiYKKwkgICAgKChub3cgLSBmcy0+c3VwZXItPnNfbGFzdGNoZWNrKSA+PSBmcy0+c3VwZXItPnNfY2hlY2tpbnRlcnZhbCkpCisJCW5leHRfY2hlY2sgPSAxOworCWlmIChuZXh0X2NoZWNrIDw9IDUpIHsKKwkJaWYgKG5leHRfY2hlY2sgPT0gMSkKKwkJCWZwdXRzKF8oIiAoY2hlY2sgYWZ0ZXIgbmV4dCBtb3VudCkiKSwgc3Rkb3V0KTsKKwkJZWxzZQorCQkJcHJpbnRmKF8oIiAoY2hlY2sgaW4gJWxkIG1vdW50cykiKSwgbmV4dF9jaGVjayk7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJZXh0MmZzX2Nsb3NlKGZzKTsKKwljdHgtPmZzID0gTlVMTDsKKwllMmZzY2tfZnJlZV9jb250ZXh0KGN0eCk7CisJZXhpdChFWElUX09LKTsKK30KKworLyoKKyAqIEZvciBjb21wbGV0aW9uIG5vdGljZQorICovCitzdHJ1Y3QgcGVyY2VudF90YmwgeworCWludCAgICAgbWF4X3Bhc3M7CisJaW50ICAgICB0YWJsZVszMl07Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBwZXJjZW50X3RibCBlMmZzY2tfdGJsID0geworCTUsIHsgMCwgNzAsIDkwLCA5MiwgIDk1LCAxMDAgfQorfTsKKworc3RhdGljIGNoYXIgYmFyWzEyOF0sIHNwYWNlc1sxMjhdOworCitzdGF0aWMgZmxvYXQgY2FsY19wZXJjZW50KGNvbnN0IHN0cnVjdCBwZXJjZW50X3RibCAqdGJsLCBpbnQgcGFzcywgaW50IGN1cnIsCisJCQkgIGludCBtYXgpCit7CisJZmxvYXQgICBwZXJjZW50OworCisJaWYgKHBhc3MgPD0gMCkKKwkJcmV0dXJuIDAuMDsKKwlpZiAocGFzcyA+IHRibC0+bWF4X3Bhc3MgfHwgbWF4ID09IDApCisJCXJldHVybiAxMDAuMDsKKwlwZXJjZW50ID0gKChmbG9hdCkgY3VycikgLyAoKGZsb2F0KSBtYXgpOworCXJldHVybiAoKHBlcmNlbnQgKiAodGJsLT50YWJsZVtwYXNzXSAtIHRibC0+dGFibGVbcGFzcy0xXSkpCisJCSsgdGJsLT50YWJsZVtwYXNzLTFdKTsKK30KKwordm9pZCBlMmZzY2tfY2xlYXJfcHJvZ2JhcihlMmZzY2tfdCBjdHgpCit7CisJaWYgKCEoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1BST0dfQkFSKSkKKwkJcmV0dXJuOworCisJcHJpbnRmKCIlcyVzXHIlcyIsIGN0eC0+c3RhcnRfbWV0YSwgc3BhY2VzICsgKHNpemVvZihzcGFjZXMpIC0gODApLAorCSAgICAgICBjdHgtPnN0b3BfbWV0YSk7CisJZmZsdXNoKHN0ZG91dCk7CisJY3R4LT5mbGFncyAmPSB+RTJGX0ZMQUdfUFJPR19CQVI7Cit9CisKK2ludCBlMmZzY2tfc2ltcGxlX3Byb2dyZXNzKGUyZnNja190IGN0eCwgY29uc3QgY2hhciAqbGFiZWwsIGZsb2F0IHBlcmNlbnQsCisJCQkgICB1bnNpZ25lZCBpbnQgZHB5bnVtKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHNwaW5uZXJbXSA9ICJcXHwvLSI7CisJaW50ICAgICBpOworCXVuc2lnbmVkIGludCAgICB0aWNrOworCXN0cnVjdCB0aW1ldmFsICB0djsKKwlpbnQgZHB5d2lkdGg7CisJaW50IGZpeGVkX3BlcmNlbnQ7CisKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1BST0dfU1VQUFJFU1MpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIG5ldyBwcm9ncmVzcyBwb3NpdGlvbi4gIElmIHRoZQorCSAqIHBlcmNlbnRhZ2UgaGFzbid0IGNoYW5nZWQsIHRoZW4gd2Ugc2tpcCBvdXQgcmlnaHQKKwkgKiBhd2F5LgorCSAqLworCWZpeGVkX3BlcmNlbnQgPSAoaW50KSAoKDEwICogcGVyY2VudCkgKyAwLjUpOworCWlmIChjdHgtPnByb2dyZXNzX2xhc3RfcGVyY2VudCA9PSBmaXhlZF9wZXJjZW50KQorCQlyZXR1cm4gMDsKKwljdHgtPnByb2dyZXNzX2xhc3RfcGVyY2VudCA9IGZpeGVkX3BlcmNlbnQ7CisKKwkvKgorCSAqIElmIHdlJ3ZlIGFscmVhZHkgdXBkYXRlZCB0aGUgc3Bpbm5lciBvbmNlIHdpdGhpbgorCSAqIHRoZSBsYXN0IDEvOHRoIG9mIGEgc2Vjb25kLCBubyBwb2ludCBkb2luZyBpdAorCSAqIGFnYWluLgorCSAqLworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCXRpY2sgPSAodHYudHZfc2VjIDw8IDMpICsgKHR2LnR2X3VzZWMgLyAoMTAwMDAwMCAvIDgpKTsKKwlpZiAoKHRpY2sgPT0gY3R4LT5wcm9ncmVzc19sYXN0X3RpbWUpICYmCisJICAgIChmaXhlZF9wZXJjZW50ICE9IDApICYmIChmaXhlZF9wZXJjZW50ICE9IDEwMDApKQorCQlyZXR1cm4gMDsKKwljdHgtPnByb2dyZXNzX2xhc3RfdGltZSA9IHRpY2s7CisKKwkvKgorCSAqIEFkdmFuY2UgdGhlIHNwaW5uZXIsIGFuZCBub3RlIHRoYXQgdGhlIHByb2dyZXNzIGJhcgorCSAqIHdpbGwgYmUgb24gdGhlIHNjcmVlbgorCSAqLworCWN0eC0+cHJvZ3Jlc3NfcG9zID0gKGN0eC0+cHJvZ3Jlc3NfcG9zKzEpICYgMzsKKwljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX1BST0dfQkFSOworCisJZHB5d2lkdGggPSA2NiAtIHN0cmxlbihsYWJlbCk7CisJZHB5d2lkdGggPSA4ICogKGRweXdpZHRoIC8gOCk7CisJaWYgKGRweW51bSkKKwkJZHB5d2lkdGggLT0gODsKKworCWkgPSAoKHBlcmNlbnQgKiBkcHl3aWR0aCkgKyA1MCkgLyAxMDA7CisJcHJpbnRmKCIlcyVzOiB8JXMlcyIsIGN0eC0+c3RhcnRfbWV0YSwgbGFiZWwsCisJICAgICAgIGJhciArIChzaXplb2YoYmFyKSAtIChpKzEpKSwKKwkgICAgICAgc3BhY2VzICsgKHNpemVvZihzcGFjZXMpIC0gKGRweXdpZHRoIC0gaSArIDEpKSk7CisJaWYgKGZpeGVkX3BlcmNlbnQgPT0gMTAwMCkKKwkJYmJfcHV0Y2hhcignfCcpOworCWVsc2UKKwkJYmJfcHV0Y2hhcihzcGlubmVyW2N0eC0+cHJvZ3Jlc3NfcG9zICYgM10pOworCXByaW50ZigiICU0LjFmJSUgICIsIHBlcmNlbnQpOworCWlmIChkcHludW0pCisJCXByaW50ZigiJXVcciIsIGRweW51bSk7CisJZWxzZQorCQlmcHV0cygiIFxyIiwgc3Rkb3V0KTsKKwlmcHV0cyhjdHgtPnN0b3BfbWV0YSwgc3Rkb3V0KTsKKworCWlmIChmaXhlZF9wZXJjZW50ID09IDEwMDApCisJCWUyZnNja19jbGVhcl9wcm9nYmFyKGN0eCk7CisJZmZsdXNoKHN0ZG91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlMmZzY2tfdXBkYXRlX3Byb2dyZXNzKGUyZnNja190IGN0eCwgaW50IHBhc3MsCisJCQkJICB1bnNpZ25lZCBsb25nIGN1ciwgdW5zaWduZWQgbG9uZyBtYXgpCit7CisJY2hhciBidWZbODBdOworCWZsb2F0IHBlcmNlbnQ7CisKKwlpZiAocGFzcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChjdHgtPnByb2dyZXNzX2ZkKSB7CisJCXNwcmludGYoYnVmLCAiJWQgJWx1ICVsdVxuIiwgcGFzcywgY3VyLCBtYXgpOworCQl4d3JpdGVfc3RyKGN0eC0+cHJvZ3Jlc3NfZmQsIGJ1Zik7CisJfSBlbHNlIHsKKwkJcGVyY2VudCA9IGNhbGNfcGVyY2VudCgmZTJmc2NrX3RibCwgcGFzcywgY3VyLCBtYXgpOworCQllMmZzY2tfc2ltcGxlX3Byb2dyZXNzKGN0eCwgY3R4LT5kZXZpY2VfbmFtZSwKKwkJCQkgICAgICAgcGVyY2VudCwgMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXNlcnZlX3N0ZGlvX2Zkcyh2b2lkKQoreworCWludCAgICAgZmQ7CisKKwl3aGlsZSAoMSkgeworCQlmZCA9IG9wZW4oYmJfZGV2X251bGwsIE9fUkRXUik7CisJCWlmIChmZCA+IDIpCisJCQlicmVhazsKKwkJaWYgKGZkIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIkVSUk9SOiBDYW5ub3Qgb3BlbiAiCisJCQkJIi9kZXYvbnVsbCAoJXMpXG4iKSwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJCX0KKwl9CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfcHJvZ3Jlc3Nfb24oaW50IHNpZyBGU0NLX0FUVFIoKHVudXNlZCkpKQoreworCWUyZnNja190IGN0eCA9IGUyZnNja19nbG9iYWxfY3R4OworCisJaWYgKCFjdHgpCisJCXJldHVybjsKKworCWN0eC0+cHJvZ3Jlc3MgPSBlMmZzY2tfdXBkYXRlX3Byb2dyZXNzOworCWN0eC0+cHJvZ3Jlc3NfZmQgPSAwOworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfcHJvZ3Jlc3Nfb2ZmKGludCBzaWcgRlNDS19BVFRSKCh1bnVzZWQpKSkKK3sKKwllMmZzY2tfdCBjdHggPSBlMmZzY2tfZ2xvYmFsX2N0eDsKKworCWlmICghY3R4KQorCQlyZXR1cm47CisKKwllMmZzY2tfY2xlYXJfcHJvZ2JhcihjdHgpOworCWN0eC0+cHJvZ3Jlc3MgPSAwOworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfY2FuY2VsKGludCBzaWcgRlNDS19BVFRSKCh1bnVzZWQpKSkKK3sKKwllMmZzY2tfdCBjdHggPSBlMmZzY2tfZ2xvYmFsX2N0eDsKKworCWlmICghY3R4KQorCQlleGl0KEZTQ0tfQ0FOQ0VMRUQpOworCisJY3R4LT5mbGFncyB8PSBFMkZfRkxBR19DQU5DRUw7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2V4dGVuZGVkX29wdHMoZTJmc2NrX3QgY3R4LCBjb25zdCBjaGFyICpvcHRzKQoreworCWNoYXIgICAgKmJ1ZiwgKnRva2VuLCAqbmV4dCwgKnAsICphcmc7CisJaW50ICAgICBlYV92ZXI7CisJaW50ICAgICBleHRlbmRlZF91c2FnZSA9IDA7CisKKwlidWYgPSBzdHJpbmdfY29weShvcHRzLCAwKTsKKwlmb3IgKHRva2VuID0gYnVmOyB0b2tlbiAmJiAqdG9rZW47IHRva2VuID0gbmV4dCkgeworCQlwID0gc3RyY2hyKHRva2VuLCAnLCcpOworCQluZXh0ID0gMDsKKwkJaWYgKHApIHsKKwkJCSpwID0gMDsKKwkJCW5leHQgPSBwKzE7CisJCX0KKwkJYXJnID0gc3RyY2hyKHRva2VuLCAnPScpOworCQlpZiAoYXJnKSB7CisJCQkqYXJnID0gMDsKKwkJCWFyZysrOworCQl9CisJCWlmIChzdHJjbXAodG9rZW4sICJlYV92ZXIiKSA9PSAwKSB7CisJCQlpZiAoIWFyZykgeworCQkJCWV4dGVuZGVkX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQllYV92ZXIgPSBzdHJ0b3VsKGFyZywgJnAsIDApOworCQkJaWYgKCpwIHx8CisJCQkgICAgKChlYV92ZXIgIT0gMSkgJiYgKGVhX3ZlciAhPSAyKSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJXygiSW52YWxpZCBFQSB2ZXJzaW9uLlxuIikpOworCQkJCWV4dGVuZGVkX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQljdHgtPmV4dF9hdHRyX3ZlciA9IGVhX3ZlcjsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJVbmtub3duIGV4dGVuZGVkIG9wdGlvbjogJXNcbiIpLAorCQkJCXRva2VuKTsKKwkJCWV4dGVuZGVkX3VzYWdlKys7CisJCX0KKwl9CisJaWYgKGV4dGVuZGVkX3VzYWdlKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJIkV4dGVuZGVkIG9wdGlvbnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsICIKKwkJCSJhbmQgbWF5IHRha2UgYW4gYXJndW1lbnQgd2hpY2hcbiIKKwkJCSJpcyBzZXQgb2ZmIGJ5IGFuIGVxdWFscyAoJz0nKSBzaWduLiAgIgorCQkJIlZhbGlkIGV4dGVuZGVkIG9wdGlvbnMgYXJlOlxuIgorCQkJIlx0ZWFfdmVyPTxlYV92ZXJzaW9uICgxIG9yIDIpPlxuXG4iKTsKKwl9Cit9CisKKworc3RhdGljIGVycmNvZGVfdCBQUlMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBlMmZzY2tfdCAqcmV0X2N0eCkKK3sKKwlpbnQgICAgICAgICAgICAgZmx1c2ggPSAwOworCWludCAgICAgICAgICAgICBjLCBmZDsKKwllMmZzY2tfdCAgICAgICAgY3R4OworCWVycmNvZGVfdCAgICAgICByZXR2YWw7CisJc3RydWN0IHNpZ2FjdGlvbiAgICAgICAgc2E7CisJY2hhciAgICAgICAgICAgICpleHRlbmRlZF9vcHRzID0gTlVMTDsKKworCXJldHZhbCA9IGUyZnNja19hbGxvY2F0ZV9jb250ZXh0KCZjdHgpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkqcmV0X2N0eCA9IGN0eDsKKworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIEJVRlNJWik7CisJc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgQlVGU0laKTsKKwlpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkgeworCQljdHgtPmludGVyYWN0aXZlID0gMTsKKwl9IGVsc2UgeworCQljdHgtPnN0YXJ0X21ldGFbMF0gPSAnXDAwMSc7CisJCWN0eC0+c3RvcF9tZXRhWzBdID0gJ1wwMDInOworCX0KKwltZW1zZXQoYmFyLCAnPScsIHNpemVvZihiYXIpLTEpOworCW1lbXNldChzcGFjZXMsICcgJywgc2l6ZW9mKHNwYWNlcyktMSk7CisJYmxraWRfZ2V0X2NhY2hlKCZjdHgtPmJsa2lkLCBOVUxMKTsKKworCWlmIChhcmdjICYmICphcmd2KQorCQljdHgtPnByb2dyYW1fbmFtZSA9ICphcmd2OworCWVsc2UKKwkJY3R4LT5wcm9ncmFtX25hbWUgPSAiZTJmc2NrIjsKKwl3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJwYW55cmNDOkI6ZEU6ZnZ0RlZNOmI6STpqOlA6bDpMOk46U3NEayIpKSAhPSBFT0YpCisJCXN3aXRjaCAoYykgeworCQljYXNlICdDJzoKKwkJCWN0eC0+cHJvZ3Jlc3MgPSBlMmZzY2tfdXBkYXRlX3Byb2dyZXNzOworCQkJY3R4LT5wcm9ncmVzc19mZCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmICghY3R4LT5wcm9ncmVzc19mZCkKKwkJCQlicmVhazsKKwkJCS8qIFZhbGlkYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gYXZvaWQgZGlzYXN0ZXJzICovCisJCQlmZCA9IGR1cChjdHgtPnByb2dyZXNzX2ZkKTsKKwkJCWlmIChmZCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQlfKCJFcnJvciB2YWxpZGF0aW5nIGZpbGUgZGVzY3JpcHRvciAlZDogJXNcbiIpLAorCQkJCQljdHgtPnByb2dyZXNzX2ZkLAorCQkJCQllcnJvcl9tZXNzYWdlKGVycm5vKSk7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoXygiSW52YWxpZCBjb21wbGV0aW9uIGluZm9ybWF0aW9uIGZpbGUgZGVzY3JpcHRvciIpKTsKKwkJCX0gZWxzZQorCQkJCWNsb3NlKGZkKTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX0NPTVBSRVNTX0RJUlM7CisJCQlicmVhazsKKwkJY2FzZSAnRSc6CisJCQlleHRlbmRlZF9vcHRzID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQljYXNlICdhJzoKKwkJCWlmIChjdHgtPm9wdGlvbnMgJiAoRTJGX09QVF9ZRVN8RTJGX09QVF9OTykpIHsKKwkJCWNvbmZsaWN0X29wdDoKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShfKCJvbmx5IG9uZSB0aGUgb3B0aW9ucyAtcC8tYSwgLW4gb3IgLXkgbWF5IGJlIHNwZWNpZmllZCIpKTsKKwkJCX0KKwkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX1BSRUVOOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJaWYgKGN0eC0+b3B0aW9ucyAmIChFMkZfT1BUX1lFU3xFMkZfT1BUX1BSRUVOKSkKKwkJCQlnb3RvIGNvbmZsaWN0X29wdDsKKwkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX05POworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJaWYgKGN0eC0+b3B0aW9ucyAmIChFMkZfT1BUX1BSRUVOfEUyRl9PUFRfTk8pKQorCQkJCWdvdG8gY29uZmxpY3Rfb3B0OworCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfWUVTOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJLyogRklYTUUgLSBUaGlzIG5lZWRzIHRvIGdvIGF3YXkgaW4gYSBmdXR1cmUgcGF0aCAtIHdpbGwgY2hhbmdlIGJpbmFyeSAqLworCQkJZnByaW50ZihzdGRlcnIsIF8oIlRoZSAtdCBvcHRpb24gaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkIG9uIHRoaXMgdmVyc2lvbiBvZiBlMmZzY2suXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlpZiAoY2ZsYWcrKykKKwkJCQljdHgtPm9wdGlvbnMgfD0gRTJGX09QVF9XUklURUNIRUNLOworCQkJY3R4LT5vcHRpb25zIHw9IEUyRl9PUFRfQ0hFQ0tCTE9DS1M7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQkvKiBXaGF0IHdlIGRvIGJ5IGRlZmF1bHQsIGFueXdheSEgKi8KKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWN0eC0+dXNlX3N1cGVyYmxvY2sgPSBhdG9pKG9wdGFyZyk7CisJCQljdHgtPmZsYWdzIHw9IEUyRl9GTEFHX1NCX1NQRUNJRklFRDsKKwkJCWJyZWFrOworCQljYXNlICdCJzoKKwkJCWN0eC0+YmxvY2tzaXplID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0knOgorCQkJY3R4LT5pbm9kZV9idWZmZXJfYmxvY2tzID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2onOgorCQkJY3R4LT5qb3VybmFsX25hbWUgPSBzdHJpbmdfY29weShvcHRhcmcsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJY3R4LT5wcm9jZXNzX2lub2RlX3NpemUgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQljdHgtPm9wdGlvbnMgfD0gRTJGX09QVF9ERUJVRzsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX0ZPUkNFOworCQkJYnJlYWs7CisJCWNhc2UgJ0YnOgorCQkJZmx1c2ggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnVic6CisJCQlzaG93X3ZlcnNpb25fb25seSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnTic6CisJCQljdHgtPmRldmljZV9uYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisjaWZkZWYgRU5BQkxFX1NXQVBGUworCQljYXNlICdzJzoKKwkJCW5vcm1hbGl6ZV9zd2FwZnMgPSAxOworCQljYXNlICdTJzoKKwkJCXN3YXBmcyA9IDE7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgJ3MnOgorCQljYXNlICdTJzoKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJCeXRlLXN3YXBwaW5nIGZpbGVzeXN0ZW1zICIKKwkJCQkJICAibm90IGNvbXBpbGVkIGluIHRoaXMgdmVyc2lvbiAiCisJCQkJCSAgIm9mIGUyZnNja1xuIikpOworCQkJZXhpdCgxKTsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJaWYgKHNob3dfdmVyc2lvbl9vbmx5KQorCQlyZXR1cm4gMDsKKwlpZiAob3B0aW5kICE9IGFyZ2MgLSAxKQorCQliYl9zaG93X3VzYWdlKCk7CisJaWYgKChjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX05PKSAmJgorCSAgICAhY2ZsYWcgJiYgIXN3YXBmcyAmJiAhKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfQ09NUFJFU1NfRElSUykpCisJCWN0eC0+b3B0aW9ucyB8PSBFMkZfT1BUX1JFQURPTkxZOworCWN0eC0+aW9fb3B0aW9ucyA9IHN0cmNocihhcmd2W29wdGluZF0sICc/Jyk7CisJaWYgKGN0eC0+aW9fb3B0aW9ucykKKwkJKmN0eC0+aW9fb3B0aW9ucysrID0gMDsKKwljdHgtPmZpbGVzeXN0ZW1fbmFtZSA9IGJsa2lkX2dldF9kZXZuYW1lKGN0eC0+YmxraWQsIGFyZ3Zbb3B0aW5kXSwgMCk7CisJaWYgKCFjdHgtPmZpbGVzeXN0ZW1fbmFtZSkgeworCQliYl9lcnJvcl9tc2coXygiVW5hYmxlIHRvIHJlc29sdmUgJyVzJyIpLCBhcmd2W29wdGluZF0pOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwl9CisJaWYgKGV4dGVuZGVkX29wdHMpCisJCXBhcnNlX2V4dGVuZGVkX29wdHMoY3R4LCBleHRlbmRlZF9vcHRzKTsKKworCWlmIChmbHVzaCkgeworCQlmZCA9IG9wZW4oY3R4LT5maWxlc3lzdGVtX25hbWUsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIG9wZW5pbmcgJXMgZm9yIGZsdXNoaW5nIiksCisJCQkJY3R4LT5maWxlc3lzdGVtX25hbWUpOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJCX0KKwkJaWYgKChyZXR2YWwgPSBleHQyZnNfc3luY19kZXZpY2UoZmQsIDEpKSkgeworCQkJYmJfZXJyb3JfbXNnKF8oIndoaWxlIHRyeWluZyB0byBmbHVzaCAlcyIpLAorCQkJCWN0eC0+ZmlsZXN5c3RlbV9uYW1lKTsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCQl9CisJCWNsb3NlKGZkKTsKKwl9CisjaWZkZWYgRU5BQkxFX1NXQVBGUworCWlmIChzd2FwZnMgJiYgY2ZsYWcpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJJbmNvbXBhdGlibGUgb3B0aW9ucyBub3QgIgorCQkJCQkgICJhbGxvd2VkIHdoZW4gYnl0ZS1zd2FwcGluZy5cbiIpKTsKKwkJCWV4aXQoRVhJVF9VU0FHRSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBTZXQgdXAgc2lnbmFsIGFjdGlvbgorCSAqLworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzdHJ1Y3Qgc2lnYWN0aW9uKSk7CisJc2Euc2FfaGFuZGxlciA9IHNpZ25hbF9jYW5jZWw7CisJc2lnYWN0aW9uKFNJR0lOVCwgJnNhLCAwKTsKKwlzaWdhY3Rpb24oU0lHVEVSTSwgJnNhLCAwKTsKKyNpZmRlZiBTQV9SRVNUQVJUCisJc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOworI2VuZGlmCisJZTJmc2NrX2dsb2JhbF9jdHggPSBjdHg7CisJc2Euc2FfaGFuZGxlciA9IHNpZ25hbF9wcm9ncmVzc19vbjsKKwlzaWdhY3Rpb24oU0lHVVNSMSwgJnNhLCAwKTsKKwlzYS5zYV9oYW5kbGVyID0gc2lnbmFsX3Byb2dyZXNzX29mZjsKKwlzaWdhY3Rpb24oU0lHVVNSMiwgJnNhLCAwKTsKKworCS8qIFVwZGF0ZSBvdXIgUEFUSCB0byBpbmNsdWRlIC9zYmluIGlmIHdlIG5lZWQgdG8gcnVuIGJhZGJsb2NrcyAgKi8KKwlpZiAoY2ZsYWcpCisJCWUyZnNfc2V0X3NiaW5fcGF0aCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciBteV92ZXJfc3RyaW5nW10gPSBFMkZTUFJPR1NfVkVSU0lPTjsKK3N0YXRpYyBjb25zdCBjaGFyIG15X3Zlcl9kYXRlW10gPSBFMkZTUFJPR1NfREFURTsKKworaW50IGUyZnNja19tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworaW50IGUyZnNja19tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXJyY29kZV90ICAgICAgIHJldHZhbDsKKwlpbnQgICAgICAgICAgICAgZXhpdF92YWx1ZSA9IEVYSVRfT0s7CisJZXh0Ml9maWxzeXMgICAgIGZzID0gMDsKKwlpb19tYW5hZ2VyICAgICAgaW9fcHRyOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsKKwljb25zdCBjaGFyICAgICAgKmxpYl92ZXJfZGF0ZTsKKwlpbnQgICAgICAgICAgICAgbXlfdmVyLCBsaWJfdmVyOworCWUyZnNja190ICAgICAgICBjdHg7CisJc3RydWN0IHByb2JsZW1fY29udGV4dCBwY3R4OworCWludCBmbGFncywgcnVuX3Jlc3VsdDsKKworCWNsZWFyX3Byb2JsZW1fY29udGV4dCgmcGN0eCk7CisKKwlteV92ZXIgPSBleHQyZnNfcGFyc2VfdmVyc2lvbl9zdHJpbmcobXlfdmVyX3N0cmluZyk7CisJbGliX3ZlciA9IGV4dDJmc19nZXRfbGlicmFyeV92ZXJzaW9uKDAsICZsaWJfdmVyX2RhdGUpOworCWlmIChteV92ZXIgPiBsaWJfdmVyKSB7CisJCWZwcmludGYoIHN0ZGVyciwgXygiRXJyb3I6IGV4dDJmcyBsaWJyYXJ5IHZlcnNpb24gIgorCQkJIm91dCBvZiBkYXRlIVxuIikpOworCQlzaG93X3ZlcnNpb25fb25seSsrOworCX0KKworCXJldHZhbCA9IFBSUyhhcmdjLCBhcmd2LCAmY3R4KTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSB0cnlpbmcgdG8gaW5pdGlhbGl6ZSBwcm9ncmFtIikpOworCQlleGl0KEVYSVRfRVJST1IpOworCX0KKwlyZXNlcnZlX3N0ZGlvX2ZkcygpOworCisJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9QUkVFTikgfHwgc2hvd192ZXJzaW9uX29ubHkpCisJCWZwcmludGYoc3RkZXJyLCAiZTJmc2NrICVzICglcylcbiIsIG15X3Zlcl9zdHJpbmcsCisJCQkgbXlfdmVyX2RhdGUpOworCisJaWYgKHNob3dfdmVyc2lvbl9vbmx5KSB7CisJCWZwcmludGYoc3RkZXJyLCBfKCJcdFVzaW5nICVzLCAlc1xuIiksCisJCQllcnJvcl9tZXNzYWdlKEVYVDJfRVRfQkFTRSksIGxpYl92ZXJfZGF0ZSk7CisJCWV4aXQoRVhJVF9PSyk7CisJfQorCisJY2hlY2tfbW91bnQoY3R4KTsKKworCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pICYmCisJICAgICEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9OTykgJiYKKwkgICAgIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1lFUykpIHsKKwkJaWYgKCFjdHgtPmludGVyYWN0aXZlKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoXygibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpKTsKKwl9CisJY3R4LT5zdXBlcmJsb2NrID0gY3R4LT51c2Vfc3VwZXJibG9jazsKK3Jlc3RhcnQ6CisjaWZkZWYgQ09ORklHX1RFU1RJT19ERUJVRworCWlvX3B0ciA9IHRlc3RfaW9fbWFuYWdlcjsKKwl0ZXN0X2lvX2JhY2tpbmdfbWFuYWdlciA9IHVuaXhfaW9fbWFuYWdlcjsKKyNlbHNlCisJaW9fcHRyID0gdW5peF9pb19tYW5hZ2VyOworI2VuZGlmCisJZmxhZ3MgPSAwOworCWlmICgoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgPT0gMCkKKwkJZmxhZ3MgfD0gRVhUMl9GTEFHX1JXOworCisJaWYgKGN0eC0+c3VwZXJibG9jayAmJiBjdHgtPmJsb2Nrc2l6ZSkgeworCQlyZXR2YWwgPSBleHQyZnNfb3BlbjIoY3R4LT5maWxlc3lzdGVtX25hbWUsIGN0eC0+aW9fb3B0aW9ucywKKwkJCQkgICAgICBmbGFncywgY3R4LT5zdXBlcmJsb2NrLCBjdHgtPmJsb2Nrc2l6ZSwKKwkJCQkgICAgICBpb19wdHIsICZmcyk7CisJfSBlbHNlIGlmIChjdHgtPnN1cGVyYmxvY2spIHsKKwkJaW50IGJsb2Nrc2l6ZTsKKwkJZm9yIChibG9ja3NpemUgPSBFWFQyX01JTl9CTE9DS19TSVpFOworCQkgICAgIGJsb2Nrc2l6ZSA8PSBFWFQyX01BWF9CTE9DS19TSVpFOyBibG9ja3NpemUgKj0gMikgeworCQkJcmV0dmFsID0gZXh0MmZzX29wZW4yKGN0eC0+ZmlsZXN5c3RlbV9uYW1lLAorCQkJCQkgICAgICBjdHgtPmlvX29wdGlvbnMsIGZsYWdzLAorCQkJCQkgICAgICBjdHgtPnN1cGVyYmxvY2ssIGJsb2Nrc2l6ZSwKKwkJCQkJICAgICAgaW9fcHRyLCAmZnMpOworCQkJaWYgKCFyZXR2YWwpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJcmV0dmFsID0gZXh0MmZzX29wZW4yKGN0eC0+ZmlsZXN5c3RlbV9uYW1lLCBjdHgtPmlvX29wdGlvbnMsCisJCQkJICAgICAgZmxhZ3MsIDAsIDAsIGlvX3B0ciwgJmZzKTsKKwlpZiAoIWN0eC0+c3VwZXJibG9jayAmJiAhKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pICYmCisJICAgICEoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NCX1NQRUNJRklFRCkgJiYKKwkgICAgKChyZXR2YWwgPT0gRVhUMl9FVF9CQURfTUFHSUMpIHx8CisJICAgICAoKHJldHZhbCA9PSAwKSAmJiBleHQyZnNfY2hlY2tfZGVzYyhmcykpKSkgeworCQlpZiAoIWZzIHx8IChmcy0+Z3JvdXBfZGVzY19jb3VudCA+IDEpKSB7CisJCQlwcmludGYoXygiJXMgdHJ5aW5nIGJhY2t1cCBibG9ja3MuLi5cbiIpLAorCQkJICAgICAgIHJldHZhbCA/IF8oIkNvdWxkbid0IGZpbmQgZXh0MiBzdXBlcmJsb2NrLCIpIDoKKwkJCSAgICAgICBfKCJHcm91cCBkZXNjcmlwdG9ycyBsb29rIGJhZC4uLiIpKTsKKwkJCWdldF9iYWNrdXBfc2IoY3R4LCBmcywgY3R4LT5maWxlc3lzdGVtX25hbWUsIGlvX3B0cik7CisJCQlpZiAoZnMpCisJCQkJZXh0MmZzX2Nsb3NlKGZzKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCX0KKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSB0cnlpbmcgdG8gb3BlbiAlcyIpLAorCQkJY3R4LT5maWxlc3lzdGVtX25hbWUpOworCQlpZiAocmV0dmFsID09IEVYVDJfRVRfUkVWX1RPT19ISUdIKSB7CisJCQlwcmludGYoXygiVGhlIGZpbGVzeXN0ZW0gcmV2aXNpb24gaXMgYXBwYXJlbnRseSAiCisJCQkgICAgICAgInRvbyBoaWdoIGZvciB0aGlzIHZlcnNpb24gb2YgZTJmc2NrLlxuIgorCQkJICAgICAgICIoT3IgdGhlIGZpbGVzeXN0ZW0gc3VwZXJibG9jayAiCisJCQkgICAgICAgImlzIGNvcnJ1cHQpXG5cbiIpKTsKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9TQl9DT1JSVVBULCAmcGN0eCk7CisJCX0gZWxzZSBpZiAocmV0dmFsID09IEVYVDJfRVRfU0hPUlRfUkVBRCkKKwkJCXByaW50ZihfKCJDb3VsZCB0aGlzIGJlIGEgemVyby1sZW5ndGggcGFydGl0aW9uP1xuIikpOworCQllbHNlIGlmICgocmV0dmFsID09IEVQRVJNKSB8fCAocmV0dmFsID09IEVBQ0NFUykpCisJCQlwcmludGYoXygiWW91IG11c3QgaGF2ZSAlcyBhY2Nlc3MgdG8gdGhlICIKKwkJCSAgICAgICAiZmlsZXN5c3RlbSBvciBiZSByb290XG4iKSwKKwkJCSAgICAgICAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgPworCQkJICAgICAgICJyL28iIDogInIvdyIpOworCQllbHNlIGlmIChyZXR2YWwgPT0gRU5YSU8pCisJCQlwcmludGYoXygiUG9zc2libHkgbm9uLWV4aXN0ZW50IG9yIHN3YXAgZGV2aWNlP1xuIikpOworI2lmZGVmIEVST0ZTCisJCWVsc2UgaWYgKHJldHZhbCA9PSBFUk9GUykKKwkJCXByaW50ZihfKCJEaXNrIHdyaXRlLXByb3RlY3RlZDsgdXNlIHRoZSAtbiBvcHRpb24gIgorCQkJICAgICAgICJ0byBkbyBhIHJlYWQtb25seVxuIgorCQkJICAgICAgICJjaGVjayBvZiB0aGUgZGV2aWNlLlxuIikpOworI2VuZGlmCisJCWVsc2UKKwkJCWZpeF9wcm9ibGVtKGN0eCwgUFJfMF9TQl9DT1JSVVBULCAmcGN0eCk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCX0KKwljdHgtPmZzID0gZnM7CisJZnMtPnByaXZfZGF0YSA9IGN0eDsKKwlzYiA9IGZzLT5zdXBlcjsKKwlpZiAoc2ItPnNfcmV2X2xldmVsID4gRTJGU0NLX0NVUlJFTlRfUkVWKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSB0cnlpbmcgdG8gb3BlbiAlcyIpLAorCQkJY3R4LT5maWxlc3lzdGVtX25hbWUpOworCWdldF9uZXdlcjoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoXygiR2V0IGEgbmV3ZXIgdmVyc2lvbiBvZiBlMmZzY2shIikpOworCX0KKworCS8qCisJICogU2V0IHRoZSBkZXZpY2UgbmFtZSwgd2hpY2ggaXMgdXNlZCB3aGVuZXZlciB3ZSBwcmludCBlcnJvcgorCSAqIG9yIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHVzZXIuCisJICovCisJaWYgKGN0eC0+ZGV2aWNlX25hbWUgPT0gMCAmJgorCSAgICAoc2ItPnNfdm9sdW1lX25hbWVbMF0gIT0gMCkpIHsKKwkJY3R4LT5kZXZpY2VfbmFtZSA9IHN0cmluZ19jb3B5KHNiLT5zX3ZvbHVtZV9uYW1lLAorCQkJCQkgICAgICAgc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSk7CisJfQorCWlmIChjdHgtPmRldmljZV9uYW1lID09IDApCisJCWN0eC0+ZGV2aWNlX25hbWUgPSBjdHgtPmZpbGVzeXN0ZW1fbmFtZTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBleHQzIHN1cGVyYmxvY2sgZmllbGRzIGFyZSBjb25zaXN0ZW50LgorCSAqLworCXJldHZhbCA9IGUyZnNja19jaGVja19leHQzX2pvdXJuYWwoY3R4KTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSBjaGVja2luZyBleHQzIGpvdXJuYWwgZm9yICVzIiksCisJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJfQorCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBkbyBleHQzLXN0eWxlIHJlY292ZXJ5LiAgSWYgc28sCisJICogZG8gaXQsIGFuZCB0aGVuIHJlc3RhcnQgdGhlIGZzY2suCisJICovCisJaWYgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgeworCQlpZiAoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkgeworCQkJcHJpbnRmKF8oIldhcm5pbmc6IHNraXBwaW5nIGpvdXJuYWwgcmVjb3ZlcnkgIgorCQkJCSAiYmVjYXVzZSBkb2luZyBhIHJlYWQtb25seSBmaWxlc3lzdGVtICIKKwkJCQkgImNoZWNrLlxuIikpOworCQkJaW9fY2hhbm5lbF9mbHVzaChjdHgtPmZzLT5pbyk7CisJCX0gZWxzZSB7CisJCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1JFU1RBUlRFRCkgeworCQkJCS8qCisJCQkJICogV2hvb3BzLCB3ZSBhdHRlbXB0ZWQgdG8gcnVuIHRoZQorCQkJCSAqIGpvdXJuYWwgdHdpY2UuICBUaGlzIHNob3VsZCBuZXZlcgorCQkJCSAqIGhhcHBlbiwgdW5sZXNzIHRoZSBoYXJkd2FyZSBvcgorCQkJCSAqIGRldmljZSBkcml2ZXIgaXMgYmVpbmcgYm9ndXMuCisJCQkJICovCisJCQkJYmJfZXJyb3JfbXNnKF8oImNhbid0IHNldCBzdXBlcmJsb2NrIGZsYWdzIG9uICVzIiksIGN0eC0+ZGV2aWNlX25hbWUpOworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCQkJfQorCQkJcmV0dmFsID0gZTJmc2NrX3J1bl9leHQzX2pvdXJuYWwoY3R4KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmVjb3ZlcmluZyBleHQzIGpvdXJuYWwgb2YgJXMiKSwKKwkJCQkJY3R4LT5kZXZpY2VfbmFtZSk7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJCQl9CisJCQlleHQyZnNfY2xvc2UoY3R4LT5mcyk7CisJCQljdHgtPmZzID0gMDsKKwkJCWN0eC0+ZmxhZ3MgfD0gRTJGX0ZMQUdfUkVTVEFSVEVEOworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmZWF0dXJlIHNldHMuICBXZSBuZWVkIHRvCisJICogYmUgbW9yZSBzdHJpbmdlbnQgdGhhbiBleHQyZnNfb3BlbigpLgorCSAqLworCWlmICgoc2ItPnNfZmVhdHVyZV9jb21wYXQgJiB+RVhUMl9MSUJfRkVBVFVSRV9DT01QQVRfU1VQUCkgfHwKKwkgICAgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiB+RVhUMl9MSUJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKSkgeworCQliYl9lcnJvcl9tc2coIiglcykiLCBjdHgtPmRldmljZV9uYW1lKTsKKwkJZ290byBnZXRfbmV3ZXI7CisJfQorCWlmIChzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIH5FWFQyX0xJQl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSB7CisJCWJiX2Vycm9yX21zZygiKCVzKSIsIGN0eC0+ZGV2aWNlX25hbWUpOworCQlnb3RvIGdldF9uZXdlcjsKKwl9CisjaWZkZWYgRU5BQkxFX0NPTVBSRVNTSU9OCisJLyogRklYTUUgLSBkbyB3ZSBzdXBwb3J0IHRoaXMgYXQgYWxsPyAqLworCWlmIChzYi0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OKQorCQliYl9lcnJvcl9tc2coXygid2FybmluZzogY29tcHJlc3Npb24gc3VwcG9ydCBpcyBleHBlcmltZW50YWwiKSk7CisjZW5kaWYKKyNpZm5kZWYgRU5BQkxFX0hUUkVFCisJaWYgKHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpIHsKKwkJYmJfZXJyb3JfbXNnKF8oIkUyZnNjayBub3QgY29tcGlsZWQgd2l0aCBIVFJFRSBzdXBwb3J0LFxuXHQiCisJCQkgICJidXQgZmlsZXN5c3RlbSAlcyBoYXMgSFRSRUUgZGlyZWN0b3JpZXMuIiksCisJCQljdHgtPmRldmljZV9uYW1lKTsKKwkJZ290byBnZXRfbmV3ZXI7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHNwZWNpZmljIHN1cGVyYmxvY2ssIHByZXN1bWFibHkgdGhlCisJICogbWFzdGVyIHN1cGVyYmxvY2sgaGFzIGJlZW4gdHJhc2hlZC4gIFNvIHdlIG1hcmsgdGhlCisJICogc3VwZXJibG9jayBhcyBkaXJ0eSwgc28gaXQgY2FuIGJlIHdyaXR0ZW4gb3V0LgorCSAqLworCWlmIChjdHgtPnN1cGVyYmxvY2sgJiYKKwkgICAgIShjdHgtPm9wdGlvbnMgJiBFMkZfT1BUX1JFQURPTkxZKSkKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCisJLyoKKwkgKiBXZSBvbmx5IHVwZGF0ZSB0aGUgbWFzdGVyIHN1cGVyYmxvY2sgYmVjYXVzZSAoYSkgcGFyYW5vaWE7CisJICogd2UgZG9uJ3Qgd2FudCB0byBjb3JydXB0IHRoZSBiYWNrdXAgc3VwZXJibG9ja3MsIGFuZCAoYikgd2UKKwkgKiBkb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgbW91bnQgY291bnQgYW5kIGxhc3QgY2hlY2tlZAorCSAqIGZpZWxkcyBpbiB0aGUgYmFja3VwIHN1cGVyYmxvY2sgKHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIHVwZGF0ZSB0aGUgYmFja3VwIHN1cGVyYmxvY2tzIGFueXdheSkuCisJICovCisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19NQVNURVJfU0JfT05MWTsKKworCWVoYW5kbGVyX2luaXQoZnMtPmlvKTsKKworCWlmIChjdHgtPnN1cGVyYmxvY2spCisJCXNldF9sYXRjaF9mbGFncyhQUl9MQVRDSF9SRUxPQywgUFJMX0xBVENIRUQsIDApOworCWV4dDJmc19tYXJrX3ZhbGlkKGZzKTsKKwljaGVja19zdXBlcl9ibG9jayhjdHgpOworCWlmIChjdHgtPmZsYWdzICYgRTJGX0ZMQUdfU0lHTkFMX01BU0spCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKDApOworCWNoZWNrX2lmX3NraXAoY3R4KTsKKwlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKyNpZmRlZiBFTkFCTEVfU1dBUEZTCisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgTkFUSVZFX0ZMQUcgRVhUMl9GTEFHX1NXQVBfQllURVMKKyNlbHNlCisjZGVmaW5lIE5BVElWRV9GTEFHIDAKKyNlbmRpZgorCisKKwlpZiAobm9ybWFsaXplX3N3YXBmcykgeworCQlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSA9PSBOQVRJVkVfRkxBRykgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIiVzOiBGaWxlc3lzdGVtIGJ5dGUgb3JkZXIgIgorCQkJCSJhbHJlYWR5IG5vcm1hbGl6ZWQuXG4iKSwgY3R4LT5kZXZpY2VfbmFtZSk7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwkJfQorCX0KKwlpZiAoc3dhcGZzKSB7CisJCXN3YXBfZmlsZXN5cyhjdHgpOworCQlpZiAoY3R4LT5mbGFncyAmIEUyRl9GTEFHX1NJR05BTF9NQVNLKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoMCk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIE1hcmsgdGhlIHN5c3RlbSBhcyB2YWxpZCwgJ3RpbCBwcm92ZW4gb3RoZXJ3aXNlCisJICovCisJZXh0MmZzX21hcmtfdmFsaWQoZnMpOworCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfYmJfaW5vZGUoZnMsICZmcy0+YmFkYmxvY2tzKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZyhfKCJ3aGlsZSByZWFkaW5nIGJhZCBibG9ja3MgaW5vZGUiKSk7CisJCXByZWVuaGFsdChjdHgpOworCQlwcmludGYoXygiVGhpcyBkb2Vzbid0IGJvZGUgd2VsbCwiCisJCQkgIiBidXQgd2UnbGwgdHJ5IHRvIGdvIG9uLi4uXG4iKSk7CisJfQorCisJcnVuX3Jlc3VsdCA9IGUyZnNja19ydW4oY3R4KTsKKwllMmZzY2tfY2xlYXJfcHJvZ2JhcihjdHgpOworCWlmIChydW5fcmVzdWx0ID09IEUyRl9GTEFHX1JFU1RBUlQpIHsKKwkJcHJpbnRmKF8oIlJlc3RhcnRpbmcgZTJmc2NrIGZyb20gdGhlIGJlZ2lubmluZy4uLlxuIikpOworCQlyZXR2YWwgPSBlMmZzY2tfcmVzZXRfY29udGV4dChjdHgpOworCQlpZiAocmV0dmFsKSB7CisJCQliYl9lcnJvcl9tc2coXygid2hpbGUgcmVzZXR0aW5nIGNvbnRleHQiKSk7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgwKTsKKwkJfQorCQlleHQyZnNfY2xvc2UoZnMpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCWlmIChydW5fcmVzdWx0ICYgRTJGX0ZMQUdfQ0FOQ0VMKSB7CisJCXByaW50ZihfKCIlczogZTJmc2NrIGNhbmNlbGVkLlxuIiksIGN0eC0+ZGV2aWNlX25hbWUgPworCQkgICAgICAgY3R4LT5kZXZpY2VfbmFtZSA6IGN0eC0+ZmlsZXN5c3RlbV9uYW1lKTsKKwkJZXhpdF92YWx1ZSB8PSBGU0NLX0NBTkNFTEVEOworCX0KKwlpZiAocnVuX3Jlc3VsdCAmIEUyRl9GTEFHX0FCT1JUKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShfKCJhYm9ydGVkIikpOworCisJLyogQ2xlYW51cCAqLworCWlmIChleHQyZnNfdGVzdF9jaGFuZ2VkKGZzKSkgeworCQlleGl0X3ZhbHVlIHw9IEVYSVRfTk9OREVTVFJVQ1Q7CisJCWlmICghKGN0eC0+b3B0aW9ucyAmIEUyRl9PUFRfUFJFRU4pKQorCQkgICAgcHJpbnRmKF8oIlxuJXM6ICoqKioqIEZJTEUgU1lTVEVNIFdBUyBNT0RJRklFRCAqKioqKlxuIiksCisJCQkgICAgICAgY3R4LT5kZXZpY2VfbmFtZSk7CisJCWlmIChjdHgtPm1vdW50X2ZsYWdzICYgRVhUMl9NRl9JU1JPT1QpIHsKKwkJCXByaW50ZihfKCIlczogKioqKiogUkVCT09UIExJTlVYICoqKioqXG4iKSwKKwkJCSAgICAgICBjdHgtPmRldmljZV9uYW1lKTsKKwkJCWV4aXRfdmFsdWUgfD0gRVhJVF9ERVNUUlVDVDsKKwkJfQorCX0KKwlpZiAoIWV4dDJmc190ZXN0X3ZhbGlkKGZzKSkgeworCQlwcmludGYoXygiXG4lczogKioqKioqKioqKiBXQVJOSU5HOiBGaWxlc3lzdGVtIHN0aWxsIGhhcyAiCisJCQkgImVycm9ycyAqKioqKioqKioqXG5cbiIpLCBjdHgtPmRldmljZV9uYW1lKTsKKwkJZXhpdF92YWx1ZSB8PSBFWElUX1VOQ09SUkVDVEVEOworCQlleGl0X3ZhbHVlICY9IH5FWElUX05PTkRFU1RSVUNUOworCX0KKwlpZiAoZXhpdF92YWx1ZSAmIEZTQ0tfQ0FOQ0VMRUQpCisJCWV4aXRfdmFsdWUgJj0gfkVYSVRfTk9OREVTVFJVQ1Q7CisJZWxzZSB7CisJCXNob3dfc3RhdHMoY3R4KTsKKwkJaWYgKCEoY3R4LT5vcHRpb25zICYgRTJGX09QVF9SRUFET05MWSkpIHsKKwkJCWlmIChleHQyZnNfdGVzdF92YWxpZChmcykpIHsKKwkJCQlpZiAoIShzYi0+c19zdGF0ZSAmIEVYVDJfVkFMSURfRlMpKQorCQkJCQlleGl0X3ZhbHVlIHw9IEVYSVRfTk9OREVTVFJVQ1Q7CisJCQkJc2ItPnNfc3RhdGUgPSBFWFQyX1ZBTElEX0ZTOworCQkJfSBlbHNlCisJCQkJc2ItPnNfc3RhdGUgJj0gfkVYVDJfVkFMSURfRlM7CisJCQlzYi0+c19tbnRfY291bnQgPSAwOworCQkJc2ItPnNfbGFzdGNoZWNrID0gdGltZShOVUxMKTsKKwkJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJfQorCX0KKworCWUyZnNja193cml0ZV9iaXRtYXBzKGN0eCk7CisKKwlleHQyZnNfY2xvc2UoZnMpOworCWN0eC0+ZnMgPSBOVUxMOworCWZyZWUoY3R4LT5maWxlc3lzdGVtX25hbWUpOworCWZyZWUoY3R4LT5qb3VybmFsX25hbWUpOworCWUyZnNja19mcmVlX2NvbnRleHQoY3R4KTsKKworCXJldHVybiBleGl0X3ZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJmc2NrLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMmZzY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU5ZmFiCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJmc2NrLmgKQEAgLTAsMCArMSw2MzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgImV4dDJmcy9rZXJuZWwtbGlzdC5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBOb3cgcHVsbCBpbiB0aGUgcmVhbCBsaW51eC9qZnMuaCBkZWZpbml0aW9ucy4KKyAqLworI2luY2x1ZGUgImV4dDJmcy9rZXJuZWwtamJkLmgiCisKKworCisjaW5jbHVkZSAiZnNjay5oIgorCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZnMuaCIKKyNpbmNsdWRlICJibGtpZC9ibGtpZC5oIgorI2luY2x1ZGUgImV4dDJmcy9leHQyX2V4dF9hdHRyLmgiCisjaW5jbHVkZSAidXVpZC91dWlkLmgiCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIEhBVkVfQ09OSU9fSAorI3VuZGVmIEhBVkVfVEVSTUlPU19ICisjaW5jbHVkZSA8Y29uaW8uaD4KKyNkZWZpbmUgcmVhZF9hX2NoYXIoKSAgIGdldGNoKCkKKyNlbHNlCisjaWZkZWYgSEFWRV9URVJNSU9TX0gKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBUaGUgbGFzdCBleHQyZnMgcmV2aXNpb24gbGV2ZWwgdGhhdCB0aGlzIHZlcnNpb24gb2YgZTJmc2NrIGlzIGFibGUgdG8KKyAqIHN1cHBvcnQKKyAqLworI2RlZmluZSBFMkZTQ0tfQ1VSUkVOVF9SRVYgICAgICAxCisKKy8qIFVzZWQgYnkgdGhlIHJlZ2lvbiBhbGxvY2F0aW9uIGNvZGUgKi8KK3R5cGVkZWYgX191MzIgcmVnaW9uX2FkZHJfdDsKK3R5cGVkZWYgc3RydWN0IHJlZ2lvbl9zdHJ1Y3QgKnJlZ2lvbl90OworCitzdHJ1Y3QgZHhfZGlyYmxvY2tfaW5mbyB7CisJaW50ICAgICAgICAgICAgIHR5cGU7CisJYmxrX3QgICAgICAgICAgIHBoeXM7CisJaW50ICAgICAgICAgICAgIGZsYWdzOworCWJsa190ICAgICAgICAgICBwYXJlbnQ7CisJZXh0Ml9kaXJoYXNoX3QgIG1pbl9oYXNoOworCWV4dDJfZGlyaGFzaF90ICBtYXhfaGFzaDsKKwlleHQyX2Rpcmhhc2hfdCAgbm9kZV9taW5faGFzaDsKKwlleHQyX2Rpcmhhc2hfdCAgbm9kZV9tYXhfaGFzaDsKK307CisKKy8qCitUaGVzZSBkZWZpbmVzIGFyZSB1c2VkIGluIHRoZSB0eXBlIGZpZWxkIG9mIGR4X2RpcmJsb2NrX2luZm8KKyovCisKKyNkZWZpbmUgRFhfRElSQkxPQ0tfUk9PVCAgICAgICAgMQorI2RlZmluZSBEWF9ESVJCTE9DS19MRUFGICAgICAgICAyCisjZGVmaW5lIERYX0RJUkJMT0NLX05PREUgICAgICAgIDMKKworCisvKgorVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIGluIHRoZSAnZmxhZ3MnIGZpZWxkIG9mIGEgZHhfZGlyYmxvY2tfaW5mbworKi8KKyNkZWZpbmUgRFhfRkxBR19SRUZFUkVOQ0VEICAgICAgMQorI2RlZmluZSBEWF9GTEFHX0RVUF9SRUYgICAgICAgICAyCisjZGVmaW5lIERYX0ZMQUdfRklSU1QgICAgICAgICAgIDQKKyNkZWZpbmUgRFhfRkxBR19MQVNUICAgICAgICAgICAgOAorCisvKgorICogRTJmc2NrIG9wdGlvbnMKKyAqLworI2RlZmluZSBFMkZfT1BUX1JFQURPTkxZICAgICAgICAweDAwMDEKKyNkZWZpbmUgRTJGX09QVF9QUkVFTiAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEUyRl9PUFRfWUVTICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBFMkZfT1BUX05PICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgRTJGX09QVF9USU1FICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEUyRl9PUFRfQ0hFQ0tCTE9DS1MgICAgIDB4MDA0MAorI2RlZmluZSBFMkZfT1BUX0RFQlVHICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRTJGX09QVF9GT1JDRSAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEUyRl9PUFRfV1JJVEVDSEVDSyAgICAgIDB4MDIwMAorI2RlZmluZSBFMkZfT1BUX0NPTVBSRVNTX0RJUlMgICAweDA0MDAKKworLyoKKyAqIEUyZnNjayBmbGFncworICovCisjZGVmaW5lIEUyRl9GTEFHX0FCT1JUICAgICAgICAgIDB4MDAwMSAvKiBBYm9ydCBzaWduYWxlZCAqLworI2RlZmluZSBFMkZfRkxBR19DQU5DRUwgICAgICAgICAweDAwMDIgLyogQ2FuY2VsIHNpZ25hbGVkICovCisjZGVmaW5lIEUyRl9GTEFHX1NJR05BTF9NQVNLICAgIDB4MDAwMworI2RlZmluZSBFMkZfRkxBR19SRVNUQVJUICAgICAgICAweDAwMDQgLyogUmVzdGFydCBzaWduYWxlZCAqLworCisjZGVmaW5lIEUyRl9GTEFHX1NFVEpNUF9PSyAgICAgIDB4MDAxMCAvKiBTZXRqbXAgdmFsaWQgZm9yIGFib3J0ICovCisKKyNkZWZpbmUgRTJGX0ZMQUdfUFJPR19CQVIgICAgICAgMHgwMDIwIC8qIFByb2dyZXNzIGJhciBvbiBzY3JlZW4gKi8KKyNkZWZpbmUgRTJGX0ZMQUdfUFJPR19TVVBQUkVTUyAgMHgwMDQwIC8qIFByb2dyZXNzIHN1c3BlbmRlZCAqLworI2RlZmluZSBFMkZfRkxBR19KT1VSTkFMX0lOT0RFICAweDAwODAgLyogQ3JlYXRlIGEgbmV3IGV4dDMgam91cm5hbCBpbm9kZSAqLworI2RlZmluZSBFMkZfRkxBR19TQl9TUEVDSUZJRUQgICAweDAxMDAgLyogVGhlIHN1cGVyYmxvY2sgd2FzIGV4cGxpY2l0bHkKKwkJCQkJKiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgKi8KKyNkZWZpbmUgRTJGX0ZMQUdfUkVTVEFSVEVEICAgICAgMHgwMjAwIC8qIEUyZnNjayBoYXMgYmVlbiByZXN0YXJ0ZWQgKi8KKyNkZWZpbmUgRTJGX0ZMQUdfUkVTSVpFX0lOT0RFICAgMHgwNDAwIC8qIFJlcXVlc3QgdG8gcmVjcmVhdGUgcmVzaXplIGlub2RlICovCisKKworLypEb24ndCBrbm93IHdoZXJlIHRoZXNlIGNvbWUgZnJvbSovCisjZGVmaW5lIFJFQUQgMAorI2RlZmluZSBXUklURSAxCisjZGVmaW5lIGNwdV90b19iZTMyKG4pIGh0b25sKG4pCisjZGVmaW5lIGJlMzJfdG9fY3B1KG4pIG50b2hsKG4pCisKKy8qCisgKiBXZSBkZWZpbmUgYSBzZXQgb2YgImxhdGNoIGdyb3VwcyI7IHRoZXNlIGFyZSBwcm9ibGVtcyB3aGljaCBhcmUKKyAqIGhhbmRsZWQgYXMgYSBzZXQuICBUaGUgdXNlciBhbnN3ZXJzIG9uY2UgZm9yIGEgcGFydGljdWxhciBsYXRjaAorICogZ3JvdXAuCisgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfTUFTSyAgICAgICAgIDB4MGZmMCAvKiBMYXRjaCBtYXNrICovCisjZGVmaW5lIFBSX0xBVENIX0JMT0NLICAgICAgICAweDAwMTAgLyogTGF0Y2ggZm9yIGlsbGVnYWwgYmxvY2tzIChwYXNzIDEpICovCisjZGVmaW5lIFBSX0xBVENIX0JCTE9DSyAgICAgICAweDAwMjAgLyogTGF0Y2ggZm9yIGJhZCBibG9jayBpbm9kZSBibG9ja3MgKHBhc3MgMSkgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfSUJJVE1BUCAgICAgIDB4MDAzMCAvKiBMYXRjaCBmb3IgcGFzcyA1IGlub2RlIGJpdG1hcCBwcm9jLiAqLworI2RlZmluZSBQUl9MQVRDSF9CQklUTUFQICAgICAgMHgwMDQwIC8qIExhdGNoIGZvciBwYXNzIDUgaW5vZGUgYml0bWFwIHByb2MuICovCisjZGVmaW5lIFBSX0xBVENIX1JFTE9DICAgICAgICAweDAwNTAgLyogTGF0Y2ggZm9yIHN1cGVyYmxvY2sgcmVsb2NhdGUgaGludCAqLworI2RlZmluZSBQUl9MQVRDSF9EQkxPQ0sgICAgICAgMHgwMDYwIC8qIExhdGNoIGZvciBwYXNzIDFiIGR1cCBibG9jayBoZWFkZXJzICovCisjZGVmaW5lIFBSX0xBVENIX0xPV19EVElNRSAgICAweDAwNzAgLyogTGF0Y2ggZm9yIHBhc3MxIG9ycGhhbmVkIGxpc3QgcmVmdWdlZXMgKi8KKyNkZWZpbmUgUFJfTEFUQ0hfVE9PQklHICAgICAgIDB4MDA4MCAvKiBMYXRjaCBmb3IgZmlsZSB0byBiaWcgZXJyb3JzICovCisjZGVmaW5lIFBSX0xBVENIX09QVElNSVpFX0RJUiAweDAwOTAgLyogTGF0Y2ggZm9yIG9wdGltaXplIGRpcmVjdG9yaWVzICovCisKKyNkZWZpbmUgUFJfTEFUQ0goeCkgICAgICgoKCh4KSAmIFBSX0xBVENIX01BU0spID4+IDQpIC0gMSkKKworLyoKKyAqIExhdGNoIGdyb3VwIGRlc2NyaXB0b3IgZmxhZ3MKKyAqLworI2RlZmluZSBQUkxfWUVTICAgICAgICAgMHgwMDAxICAvKiBBbnN3ZXIgeWVzICovCisjZGVmaW5lIFBSTF9OTyAgICAgICAgICAweDAwMDIgIC8qIEFuc3dlciBubyAqLworI2RlZmluZSBQUkxfTEFUQ0hFRCAgICAgMHgwMDA0ICAvKiBUaGUgbGF0Y2ggZ3JvdXAgaXMgbGF0Y2hlZCAqLworI2RlZmluZSBQUkxfU1VQUFJFU1MgICAgMHgwMDA4ICAvKiBTdXBwcmVzcyBhbGwgbGF0Y2ggZ3JvdXAgcXVlc3Rpb25zICovCisKKyNkZWZpbmUgUFJMX1ZBUklBQkxFICAgIDB4MDAwZiAgLyogQWxsIHRoZSBmbGFncyB0aGF0IG5lZWQgdG8gYmUgcmVzZXQgKi8KKworLyoKKyAqIFByZS1QYXNzIDEgZXJyb3JzCisgKi8KKworI2RlZmluZSBQUl8wX0JCX05PVF9HUk9VUCAgICAgICAweDAwMDAwMSAgLyogQmxvY2sgYml0bWFwIG5vdCBpbiBncm91cCAqLworI2RlZmluZSBQUl8wX0lCX05PVF9HUk9VUCAgICAgICAweDAwMDAwMiAgLyogSW5vZGUgYml0bWFwIG5vdCBpbiBncm91cCAqLworI2RlZmluZSBQUl8wX0lUQUJMRV9OT1RfR1JPVVAgICAweDAwMDAwMyAgLyogSW5vZGUgdGFibGUgbm90IGluIGdyb3VwICovCisjZGVmaW5lIFBSXzBfU0JfQ09SUlVQVCAgICAgICAgIDB4MDAwMDA0ICAvKiBTdXBlcmJsb2NrIGNvcnJ1cHQgKi8KKyNkZWZpbmUgUFJfMF9GU19TSVpFX1dST05HICAgICAgMHgwMDAwMDUgIC8qIEZpbGVzeXN0ZW0gc2l6ZSBpcyB3cm9uZyAqLworI2RlZmluZSBQUl8wX05PX0ZSQUdNRU5UUyAgICAgICAweDAwMDAwNiAgLyogRnJhZ21lbnRzIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUFJfMF9CTE9DS1NfUEVSX0dST1VQICAgMHgwMDAwMDcgIC8qIEJhZCBibG9ja3NfcGVyX2dyb3VwICovCisjZGVmaW5lIFBSXzBfRklSU1RfREFUQV9CTE9DSyAgIDB4MDAwMDA4ICAvKiBCYWQgZmlyc3RfZGF0YV9ibG9jayAqLworI2RlZmluZSBQUl8wX0FERF9VVUlEICAgICAgICAgICAweDAwMDAwOSAgLyogQWRkaW5nIFVVSUQgdG8gZmlsZXN5c3RlbSAqLworI2RlZmluZSBQUl8wX1JFTE9DQVRFX0hJTlQgICAgICAweDAwMDAwQSAgLyogUmVsb2NhdGUgaGludCAqLworI2RlZmluZSBQUl8wX01JU0NfQ09SUlVQVF9TVVBFUiAweDAwMDAwQiAgLyogTWlzY2VsbGFuZW91cyBzdXBlcmJsb2NrIGNvcnJ1cHRpb24gKi8KKyNkZWZpbmUgUFJfMF9HRVRTSVpFX0VSUk9SICAgICAgMHgwMDAwMEMgIC8qIEVycm9yIGRldGVybWluZyBwaHlzaWNhbCBkZXZpY2Ugc2l6ZSBvZiBmaWxlc3lzdGVtICovCisjZGVmaW5lIFBSXzBfSU5PREVfQ09VTlRfV1JPTkcgIDB4MDAwMDBEICAvKiBJbm9kZSBjb3VudCBpbiB0aGUgc3VwZXJibG9jayBpbmNvcnJlY3QgKi8KKyNkZWZpbmUgUFJfMF9IVVJEX0NMRUFSX0ZJTEVUWVBFIDB4MDAwMDBFIC8qIFRoZSBIdXJkIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpbGV0eXBlIGZlYXR1cmUgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX0JBRF9JTk9ERSAgMHgwMDAwMEYgIC8qIFRoZSBIdXJkIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpbGV0eXBlIGZlYXR1cmUgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1VOU1VQUF9NVUxUSUZTIDB4MDAwMDEwIC8qIFRoZSBleHRlcm5hbCBqb3VybmFsIGhhcyBtdWx0aXBsZSBmaWxlc3lzdGVtcyAod2hpY2ggd2UgY2FuJ3QgaGFuZGxlIHlldCkgKi8KKyNkZWZpbmUgUFJfMF9DQU5UX0ZJTkRfSk9VUk5BTCAgMHgwMDAwMTEgIC8qIENhbid0IGZpbmQgZXh0ZXJuYWwgam91cm5hbCAqLworI2RlZmluZSBQUl8wX0VYVF9KT1VSTkFMX0JBRF9TVVBFUiAweDAwMDAxMi8qIEV4dGVybmFsIGpvdXJuYWwgaGFzIGJhZCBzdXBlcmJsb2NrICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9CQURfVVVJRCAgIDB4MDAwMDEzICAvKiBTdXBlcmJsb2NrIGhhcyBhIGJhZCBqb3VybmFsIFVVSUQgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1VOU1VQUF9TVVBFUiAweDAwMDAxNCAvKiBKb3VybmFsIGhhcyBhbiB1bmtub3duIHN1cGVyYmxvY2sgdHlwZSAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfQkFEX1NVUEVSICAweDAwMDAxNSAgLyogSm91cm5hbCBzdXBlcmJsb2NrIGlzIGNvcnJ1cHQgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX0hBU19KT1VSTkFMIDB4MDAwMDE2IC8qIEpvdXJuYWwgc3VwZXJibG9jayBpcyBjb3JydXB0ICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9SRUNPVkVSX1NFVCAweDAwMDAxNyAvKiBTdXBlcmJsb2NrIGhhcyByZWNvdmVyeSBmbGFnIHNldCBidXQgbm8gam91cm5hbCAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfUkVDT1ZFUllfQ0xFQVIgMHgwMDAwMTggLyogSm91cm5hbCBoYXMgZGF0YSwgYnV0IHJlY292ZXJ5IGZsYWcgaXMgY2xlYXIgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1JFU0VUX0pPVVJOQUwgMHgwMDAwMTkgLyogQXNrIGlmIHdlIHNob3VsZCBjbGVhciB0aGUgam91cm5hbCAqLworI2RlZmluZSBQUl8wX0ZTX1JFVl9MRVZFTCAgICAgICAweDAwMDAxQSAgLyogRmlsZXN5c3RlbSByZXZpc2lvbiBpcyAwLCBidXQgZmVhdHVyZSBmbGFncyBhcmUgc2V0ICovCisjZGVmaW5lIFBSXzBfT1JQSEFOX0NMRUFSX0lOT0RFICAgICAgICAgICAgIDB4MDAwMDIwIC8qIENsZWFyaW5nIG9ycGhhbiBpbm9kZSAqLworI2RlZmluZSBQUl8wX09SUEhBTl9JTExFR0FMX0JMT0NLX05VTSAgICAgICAweDAwMDAyMSAvKiBJbGxlZ2FsIGJsb2NrIGZvdW5kIGluIG9ycGhhbmVkIGlub2RlICovCisjZGVmaW5lIFBSXzBfT1JQSEFOX0FMUkVBRFlfQ0xFQVJFRF9CTE9DSyAgIDB4MDAwMDIyIC8qIEFscmVhZHkgY2xlYXJlZCBibG9jayBmb3VuZCBpbiBvcnBoYW5lZCBpbm9kZSAqLworI2RlZmluZSBQUl8wX09SUEhBTl9JTExFR0FMX0hFQURfSU5PREUgICAgICAweDAwMDAyMyAvKiBJbGxlZ2FsIG9ycGhhbiBpbm9kZSBpbiBzdXBlcmJsb2NrICovCisjZGVmaW5lIFBSXzBfT1JQSEFOX0lMTEVHQUxfSU5PREUgICAgICAgICAgIDB4MDAwMDI0IC8qIElsbGVnYWwgaW5vZGUgaW4gb3JwaGFuZWQgaW5vZGUgbGlzdCAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfVU5TVVBQX1JPQ09NUEFUICAgICAgICAweDAwMDAyNSAvKiBKb3VybmFsIGhhcyB1bnN1cHBvcnRlZCByZWFkLW9ubHkgZmVhdHVyZSAtIGFib3J0ICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9VTlNVUFBfSU5DT01QQVQgICAgICAgIDB4MDAwMDI2IC8qIEpvdXJuYWwgaGFzIHVuc3VwcG9ydGVkIGluY29tcGF0aWJsZSBmZWF0dXJlIC0gYWJvcnQgKi8KKyNkZWZpbmUgUFJfMF9KT1VSTkFMX1VOU1VQUF9WRVJTSU9OICAgICAgICAgMHgwMDAwMjcgLyogSm91cm5hbCBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUFJfMF9NT1ZFX0pPVVJOQUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMjggLyogTW92aW5nIGpvdXJuYWwgdG8gaGlkZGVuIGZpbGUgKi8KKyNkZWZpbmUgUFJfMF9FUlJfTU9WRV9KT1VSTkFMICAgICAgICAgICAgICAgMHgwMDAwMjkgLyogRXJyb3IgbW92aW5nIGpvdXJuYWwgKi8KKyNkZWZpbmUgUFJfMF9DTEVBUl9WMl9KT1VSTkFMICAgICAgICAgICAgICAgMHgwMDAwMkEgLyogQ2xlYXJpbmcgVjIgam91cm5hbCBzdXBlcmJsb2NrICovCisjZGVmaW5lIFBSXzBfSk9VUk5BTF9SVU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDJCIC8qIFJ1biBqb3VybmFsIGFueXdheSAqLworI2RlZmluZSBQUl8wX0pPVVJOQUxfUlVOX0RFRkFVTFQgICAgICAgICAgICAweDAwMDAyQyAvKiBSdW4gam91cm5hbCBhbnl3YXkgYnkgZGVmYXVsdCAqLworI2RlZmluZSBQUl8wX0JBQ0tVUF9KTkwgICAgICAgICAgICAgICAgICAgICAweDAwMDAyRCAvKiBCYWNrdXAgam91cm5hbCBpbm9kZSBibG9ja3MgKi8KKyNkZWZpbmUgUFJfMF9OT05aRVJPX1JFU0VSVkVEX0dEVF9CTE9DS1MgICAgMHgwMDAwMkUgLyogUmVzZXJ2ZWQgYmxvY2tzIHcvbyByZXNpemVfaW5vZGUgKi8KKyNkZWZpbmUgUFJfMF9DTEVBUl9SRVNJWkVfSU5PREUgICAgICAgICAgICAgMHgwMDAwMkYgLyogUmVzaXplX2lub2RlIG5vdCBlbmFibGVkLCBidXQgcmVzaXplIGlub2RlIGlzIG5vbi16ZXJvICovCisjZGVmaW5lIFBSXzBfUkVTSVpFX0lOT0RFX0lOVkFMSUQgICAgICAgICAgIDB4MDAwMDMwIC8qIFJlc2l6ZSBpbm9kZSBpbnZhbGlkICovCisKKy8qCisgKiBQYXNzIDEgZXJyb3JzCisgKi8KKworI2RlZmluZSBQUl8xX1BBU1NfSEVBREVSICAgICAgICAgICAgICAweDAxMDAwMCAgLyogUGFzcyAxOiBDaGVja2luZyBpbm9kZXMsIGJsb2NrcywgYW5kIHNpemVzICovCisjZGVmaW5lIFBSXzFfUk9PVF9OT19ESVIgICAgICAgICAgICAgIDB4MDEwMDAxICAvKiBSb290IGRpcmVjdG9yeSBpcyBub3QgYW4gaW5vZGUgKi8KKyNkZWZpbmUgUFJfMV9ST09UX0RUSU1FICAgICAgICAgICAgICAgMHgwMTAwMDIgIC8qIFJvb3QgZGlyZWN0b3J5IGhhcyBkdGltZSBzZXQgKi8KKyNkZWZpbmUgUFJfMV9SRVNFUlZFRF9CQURfTU9ERSAgICAgICAgMHgwMTAwMDMgIC8qIFJlc2VydmVkIGlub2RlIGhhcyBiYWQgbW9kZSAqLworI2RlZmluZSBQUl8xX1pFUk9fRFRJTUUgICAgICAgICAgICAgICAweDAxMDAwNCAgLyogRGVsZXRlZCBpbm9kZSBoYXMgemVybyBkdGltZSAqLworI2RlZmluZSBQUl8xX1NFVF9EVElNRSAgICAgICAgICAgICAgICAweDAxMDAwNSAgLyogSW5vZGUgaW4gdXNlLCBidXQgZHRpbWUgc2V0ICovCisjZGVmaW5lIFBSXzFfWkVST19MRU5HVEhfRElSICAgICAgICAgIDB4MDEwMDA2ICAvKiBaZXJvLWxlbmd0aCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfMV9CQl9DT05GTElDVCAgICAgICAgICAgICAgMHgwMTAwMDcgIC8qIEJsb2NrIGJpdG1hcCBjb25mbGljdHMgd2l0aCBzb21lIG90aGVyIGZzIGJsb2NrICovCisjZGVmaW5lIFBSXzFfSUJfQ09ORkxJQ1QgICAgICAgICAgICAgIDB4MDEwMDA4ICAvKiBJbm9kZSBiaXRtYXAgY29uZmxpY3RzIHdpdGggc29tZSBvdGhlciBmcyBibG9jayAqLworI2RlZmluZSBQUl8xX0lUQUJMRV9DT05GTElDVCAgICAgICAgICAweDAxMDAwOSAgLyogSW5vZGUgdGFibGUgY29uZmxpY3RzIHdpdGggc29tZSBvdGhlciBmcyBibG9jayAqLworI2RlZmluZSBQUl8xX0JCX0JBRF9CTE9DSyAgICAgICAgICAgICAweDAxMDAwQSAgLyogQmxvY2sgYml0bWFwIGlzIG9uIGEgYmFkIGJsb2NrICovCisjZGVmaW5lIFBSXzFfSUJfQkFEX0JMT0NLICAgICAgICAgICAgIDB4MDEwMDBCICAvKiBJbm9kZSBiaXRtYXAgaXMgb24gYSBiYWQgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMV9CQURfSV9TSVpFICAgICAgICAgICAgICAgMHgwMTAwMEMgIC8qIElub2RlIGhhcyBpbmNvcnJlY3QgaV9zaXplICovCisjZGVmaW5lIFBSXzFfQkFEX0lfQkxPQ0tTICAgICAgICAgICAgIDB4MDEwMDBEICAvKiBJbm9kZSBoYXMgaW5jb3JyZWN0IGlfYmxvY2tzICovCisjZGVmaW5lIFBSXzFfSUxMRUdBTF9CTE9DS19OVU0gICAgICAgIDB4MDEwMDBFICAvKiBJbGxlZ2FsIGJsb2NrIG51bWJlciBpbiBpbm9kZSAqLworI2RlZmluZSBQUl8xX0JMT0NLX09WRVJMQVBTX01FVEFEQVRBICAweDAxMDAwRiAgLyogQmxvY2sgbnVtYmVyIG92ZXJsYXBzIGZzIG1ldGFkYXRhICovCisjZGVmaW5lIFBSXzFfSU5PREVfQkxPQ0tfTEFUQ0ggICAgICAgIDB4MDEwMDEwICAvKiBJbm9kZSBoYXMgaWxsZWdhbCBibG9ja3MgKGxhdGNoIHF1ZXN0aW9uKSAqLworI2RlZmluZSBQUl8xX1RPT19NQU5ZX0JBRF9CTE9DS1MgICAgICAweDAxMDAxMSAgLyogVG9vIG1hbnkgYmFkIGJsb2NrcyBpbiBpbm9kZSAqLworI2RlZmluZSBQUl8xX0JCX0lMTEVHQUxfQkxPQ0tfTlVNICAgICAweDAxMDAxMiAgLyogSWxsZWdhbCBibG9jayBudW1iZXIgaW4gYmFkIGJsb2NrIGlub2RlICovCisjZGVmaW5lIFBSXzFfSU5PREVfQkJMT0NLX0xBVENIICAgICAgIDB4MDEwMDEzICAvKiBCYWQgYmxvY2sgaW5vZGUgaGFzIGlsbGVnYWwgYmxvY2tzIChsYXRjaCBxdWVzdGlvbikgKi8KKyNkZWZpbmUgUFJfMV9EVVBfQkxPQ0tTX1BSRUVOU1RPUCAgICAgMHgwMTAwMTQgIC8qIER1cGxpY2F0ZSBvciBiYWQgYmxvY2tzIGluIHVzZSEgKi8KKyNkZWZpbmUgUFJfMV9CQklOT0RFX0JBRF9NRVRBQkxPQ0sgICAgMHgwMTAwMTUgIC8qIEJhZCBibG9jayB1c2VkIGFzIGJhZCBibG9jayBpbmRpcmVjdCBibG9jayAqLworI2RlZmluZSBQUl8xX0JCSU5PREVfQkFEX01FVEFCTE9DS19QUk9NUFQgMHgwMTAwMTYgLyogSW5jb25zaXN0ZW5jeSBjYW4ndCBiZSBmaXhlZCBwcm9tcHQgKi8KKyNkZWZpbmUgUFJfMV9CQURfUFJJTUFSWV9CTE9DSyAgICAgICAgMHgwMTAwMTcgIC8qIEJhZCBwcmltYXJ5IGJsb2NrICovCisjZGVmaW5lIFBSXzFfQkFEX1BSSU1BUllfQkxPQ0tfUFJPTVBUIDB4MDEwMDE4ICAvKiBCYWQgcHJpbWFyeSBibG9jayBwcm9tcHQgKi8KKyNkZWZpbmUgUFJfMV9CQURfUFJJTUFSWV9TVVBFUkJMT0NLICAgMHgwMTAwMTkgIC8qIEJhZCBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgUFJfMV9CQURfUFJJTUFSWV9HUk9VUF9ERVNDUklQVE9SIDB4MDEwMDFBIC8qIEJhZCBwcmltYXJ5IGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIFBSXzFfQkFEX1NVUEVSQkxPQ0sgICAgICAgICAgIDB4MDEwMDFCICAvKiBCYWQgc3VwZXJibG9jayBpbiBncm91cCAqLworI2RlZmluZSBQUl8xX0JBRF9HUk9VUF9ERVNDUklQVE9SUyAgICAweDAxMDAxQyAgLyogQmFkIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzIGluIGdyb3VwICovCisjZGVmaW5lIFBSXzFfUFJPR0VSUl9DTEFJTUVEX0JMT0NLICAgIDB4MDEwMDFEICAvKiBCbG9jayBjbGFpbWVkIGZvciBubyByZWFzb24gKi8KKyNkZWZpbmUgUFJfMV9SRUxPQ19CTE9DS19BTExPQ0FURSAgICAgMHgwMTAwMUUgIC8qIEVycm9yIGFsbG9jYXRpbmcgYmxvY2tzIGZvciByZWxvY2F0aW5nIG1ldGFkYXRhICovCisjZGVmaW5lIFBSXzFfUkVMT0NfTUVNT1JZX0FMTE9DQVRFICAgIDB4MDEwMDFGICAvKiBFcnJvciBhbGxvY2F0aW5nIGJsb2NrIGJ1ZmZlciBkdXJpbmcgcmVsb2NhdGlvbiBwcm9jZXNzICovCisjZGVmaW5lIFBSXzFfUkVMT0NfRlJPTV9UTyAgICAgICAgICAgIDB4MDEwMDIwICAvKiBSZWxvY2F0aW5nIG1ldGFkYXRhIGdyb3VwIGluZm9ybWF0aW9uIGZyb20gWCB0byBZICovCisjZGVmaW5lIFBSXzFfUkVMT0NfVE8gICAgICAgICAgICAgICAgIDB4MDEwMDIxICAvKiBSZWxvY2F0aW5nIG1ldGF0ZGF0YSBncm91cCBpbmZvcm1hdGlvbiB0byBYICovCisjZGVmaW5lIFBSXzFfUkVMT0NfUkVBRF9FUlIgICAgICAgICAgIDB4MDEwMDIyICAvKiBCbG9jayByZWFkIGVycm9yIGR1cmluZyByZWxvY2F0aW9uIHByb2Nlc3MgKi8KKyNkZWZpbmUgUFJfMV9SRUxPQ19XUklURV9FUlIgICAgICAgICAgMHgwMTAwMjMgIC8qIEJsb2NrIHdyaXRlIGVycm9yIGR1cmluZyByZWxvY2F0aW9uIHByb2Nlc3MgKi8KKyNkZWZpbmUgUFJfMV9BTExPQ0FURV9JQklUTUFQX0VSUk9SICAgMHgwMTAwMjQgIC8qIEVycm9yIGFsbG9jYXRpbmcgaW5vZGUgYml0bWFwICovCisjZGVmaW5lIFBSXzFfQUxMT0NBVEVfQkJJVE1BUF9FUlJPUiAgIDB4MDEwMDI1ICAvKiBFcnJvciBhbGxvY2F0aW5nIGJsb2NrIGJpdG1hcCAqLworI2RlZmluZSBQUl8xX0FMTE9DQVRFX0lDT1VOVCAgICAgICAgICAweDAxMDAyNiAgLyogRXJyb3IgYWxsb2NhdGluZyBpY291bnQgc3RydWN0dXJlICovCisjZGVmaW5lIFBSXzFfQUxMT0NBVEVfREJDT1VOVCAgICAgICAgIDB4MDEwMDI3ICAvKiBFcnJvciBhbGxvY2F0aW5nIGRiY291bnQgKi8KKyNkZWZpbmUgUFJfMV9JU0NBTl9FUlJPUiAgICAgICAgICAgICAgMHgwMTAwMjggIC8qIEVycm9yIHdoaWxlIHNjYW5uaW5nIGlub2RlcyAqLworI2RlZmluZSBQUl8xX0JMT0NLX0lURVJBVEUgICAgICAgICAgICAweDAxMDAyOSAgLyogRXJyb3Igd2hpbGUgaXRlcmF0aW5nIG92ZXIgYmxvY2tzICovCisjZGVmaW5lIFBSXzFfSUNPVU5UX1NUT1JFICAgICAgICAgICAgIDB4MDEwMDJBICAvKiBFcnJvciB3aGlsZSBzdG9yaW5nIGlub2RlIGNvdW50IGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBSXzFfQUREX0RCTE9DSyAgICAgICAgICAgICAgIDB4MDEwMDJCICAvKiBFcnJvciB3aGlsZSBzdG9yaW5nIGRpcmVjdG9yeSBibG9jayBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQUl8xX1JFQURfSU5PREUgICAgICAgICAgICAgICAweDAxMDAyQyAgLyogRXJyb3Igd2hpbGUgcmVhZGluZyBpbm9kZSAoZm9yIGNsZWFyaW5nKSAqLworI2RlZmluZSBQUl8xX1NVUFBSRVNTX01FU1NBR0VTICAgICAgICAweDAxMDAyRCAgLyogU3VwcHJlc3MgbWVzc2FnZXMgcHJvbXB0ICovCisjZGVmaW5lIFBSXzFfU0VUX0lNQUdJQyAgICAweDAxMDAyRiAgLyogSW1hZ2ljIGZsYWcgc2V0IG9uIGFuIGlub2RlIHdoZW4gZmlsZXN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQgKi8KKyNkZWZpbmUgUFJfMV9TRVRfSU1NVVRBQkxFICAgICAgICAgICAgMHgwMTAwMzAgIC8qIEltbXV0YWJsZSBmbGFnIHNldCBvbiBhIGRldmljZSBvciBzb2NrZXQgaW5vZGUgKi8KKyNkZWZpbmUgUFJfMV9DT01QUl9TRVQgICAgICAgICAgICAgICAgMHgwMTAwMzEgIC8qIENvbXByZXNzaW9uIGZsYWcgc2V0IG9uIGEgbm9uLWNvbXByZXNzZWQgZmlsZXN5c3RlbSAqLworI2RlZmluZSBQUl8xX1NFVF9OT05aU0laRSAgICAgICAgICAgICAweDAxMDAzMiAgLyogTm9uLXplcm8gc2l6ZSBvbiBkZXZpY2UsIGZpZm8gb3Igc29ja2V0IGlub2RlICovCisjZGVmaW5lIFBSXzFfRlNfUkVWX0xFVkVMICAgICAgICAgICAgIDB4MDEwMDMzICAvKiBGaWxlc3lzdGVtIHJldmlzaW9uIGlzIDAsIGJ1dCBmZWF0dXJlIGZsYWdzIGFyZSBzZXQgKi8KKyNkZWZpbmUgUFJfMV9KT1VSTkFMX0lOT0RFX05PVF9DTEVBUiAgMHgwMTAwMzQgIC8qIEpvdXJuYWwgaW5vZGUgbm90IGluIHVzZSwgbmVlZHMgY2xlYXJpbmcgKi8KKyNkZWZpbmUgUFJfMV9KT1VSTkFMX0JBRF9NT0RFICAgICAgICAgMHgwMTAwMzUgIC8qIEpvdXJuYWwgaW5vZGUgaGFzIHdyb25nIG1vZGUgKi8KKyNkZWZpbmUgUFJfMV9MT1dfRFRJTUUgICAgICAgICAgICAgICAgMHgwMTAwMzYgIC8qIElub2RlIHRoYXQgd2FzIHBhcnQgb2Ygb3JwaGFuIGxpbmtlZCBsaXN0ICovCisjZGVmaW5lIFBSXzFfT1JQSEFOX0xJU1RfUkVGVUdFRVMgICAgIDB4MDEwMDM3ICAvKiBMYXRjaCBxdWVzdGlvbiB3aGljaCBhc2tzIGhvdyB0byBkZWFsIHdpdGggbG93IGR0aW1lIGlub2RlcyAqLworI2RlZmluZSBQUl8xX0FMTE9DQVRFX1JFRkNPVU5UICAgICAgICAweDAxMDAzOCAgLyogRXJyb3IgYWxsb2NhdGluZyByZWZjb3VudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUFJfMV9SRUFEX0VBX0JMT0NLICAgICAgICAgICAgMHgwMTAwMzkgIC8qIEVycm9yIHJlYWRpbmcgRXh0ZW5kZWQgQXR0cmlidXRlIGJsb2NrICovCisjZGVmaW5lIFBSXzFfQkFEX0VBX0JMT0NLICAgICAgICAgICAgIDB4MDEwMDNBICAvKiBJbnZhbGlkIEV4dGVuZGVkIEF0dHJpYnV0ZSBibG9jayAqLworI2RlZmluZSBQUl8xX0VYVEFUVFJfUkVBRF9BQk9SVCAgIDB4MDEwMDNCICAvKiBFcnJvciByZWFkaW5nIEV4dGVuZGVkIEF0dHJpYnV0ZSBibG9jayB3aGlsZSBmaXhpbmcgcmVmY291bnQgLS0gYWJvcnQgKi8KKyNkZWZpbmUgUFJfMV9FWFRBVFRSX1JFRkNPVU5UICAgICAgICAgMHgwMTAwM0MgIC8qIEV4dGVuZGVkIGF0dHJpYnV0ZSByZWZlcmVuY2UgY291bnQgaW5jb3JyZWN0ICovCisjZGVmaW5lIFBSXzFfRVhUQVRUUl9XUklURSAgICAgICAgICAgIDB4MDEwMDNEICAvKiBFcnJvciB3cml0aW5nIEV4dGVuZGVkIEF0dHJpYnV0ZSBibG9jayB3aGlsZSBmaXhpbmcgcmVmY291bnQgKi8KKyNkZWZpbmUgUFJfMV9FQV9NVUxUSV9CTE9DSyAgICAgICAgICAgMHgwMTAwM0UgIC8qIE11bHRpcGxlIEVBIGJsb2NrcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFBSXzFfRUFfQUxMT0NfUkVHSU9OICAgICAgICAgIDB4MDEwMDNGICAvKiBFcnJvciBhbGxvY2F0aW5nIEVBIHJlZ2lvbiBhbGxvY2F0aW9uIHN0cnVjdHVyZSAqLworI2RlZmluZSBQUl8xX0VBX0FMTE9DX0NPTExJU0lPTiAgICAgICAweDAxMDA0MCAgLyogRXJyb3IgRUEgYWxsb2NhdGlvbiBjb2xsaXNpb24gKi8KKyNkZWZpbmUgUFJfMV9FQV9CQURfTkFNRSAgICAgICAgICAgICAgMHgwMTAwNDEgIC8qIEJhZCBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZSAqLworI2RlZmluZSBQUl8xX0VBX0JBRF9WQUxVRSAgICAgICAgICAgICAweDAxMDA0MiAgLyogQmFkIGV4dGVuZGVkIGF0dHJpYnV0ZSB2YWx1ZSAqLworI2RlZmluZSBQUl8xX0lOT0RFX1RPT0JJRyAgICAgICAgICAgICAweDAxMDA0MyAgLyogSW5vZGUgdG9vIGJpZyAobGF0Y2ggcXVlc3Rpb24pICovCisjZGVmaW5lIFBSXzFfVE9PQklHX0RJUiAgICAgICAgICAgICAgIDB4MDEwMDQ0ICAvKiBEaXJlY3RvcnkgdG9vIGJpZyAqLworI2RlZmluZSBQUl8xX1RPT0JJR19SRUcgICAgICAgICAgICAgICAweDAxMDA0NSAgLyogUmVndWxhciBmaWxlIHRvbyBiaWcgKi8KKyNkZWZpbmUgUFJfMV9UT09CSUdfU1lNTElOSyAgICAgICAgICAgMHgwMTAwNDYgIC8qIFN5bWxpbmsgdG9vIGJpZyAqLworI2RlZmluZSBQUl8xX0hUUkVFX1NFVCAgICAgICAgICAgICAgICAweDAxMDA0NyAgLyogSU5ERVhfRkwgZmxhZyBzZXQgb24gYSBub24tSFRSRUUgZmlsZXN5c3RlbSAqLworI2RlZmluZSBQUl8xX0hUUkVFX05PRElSICAgICAgICAgICAgICAweDAxMDA0OCAgLyogSU5ERVhfRkwgZmxhZyBzZXQgb24gYSBub24tZGlyZWN0b3J5ICovCisjZGVmaW5lIFBSXzFfSFRSRUVfQkFEUk9PVCAgICAgICAgICAgIDB4MDEwMDQ5ICAvKiBJbnZhbGlkIHJvb3Qgbm9kZSBpbiBIVFJFRSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfMV9IVFJFRV9IQVNIViAgICAgICAgICAgICAgMHgwMTAwNEEgIC8qIFVuc3VwcG9ydGVkIGhhc2ggdmVyc2lvbiBpbiBIVFJFRSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfMV9IVFJFRV9JTkNPTVBBVCAgICAgICAgICAgMHgwMTAwNEIgIC8qIEluY29tcGF0aWJsZSBmbGFnIGluIEhUUkVFIHJvb3Qgbm9kZSAqLworI2RlZmluZSBQUl8xX0hUUkVFX0RFUFRIICAgICAgICAgICAgICAweDAxMDA0QyAgLyogSFRSRUUgdG9vIGRlZXAgKi8KKyNkZWZpbmUgUFJfMV9CQl9GU19CTE9DSyAgIDB4MDEwMDREICAvKiBCYWQgYmxvY2sgaGFzIGluZGlyZWN0IGJsb2NrIHRoYXQgY29uZmxpY3RzIHdpdGggZmlsZXN5c3RlbSBibG9jayAqLworI2RlZmluZSBQUl8xX1JFU0laRV9JTk9ERV9DUkVBVEUgICAgICAweDAxMDA0RSAgLyogUmVzaXplIGlub2RlIGZhaWxlZCAqLworI2RlZmluZSBQUl8xX0VYVFJBX0lTSVpFICAgICAgICAgICAgICAweDAxMDA0RiAgLyogaW5vZGUtPmlfc2l6ZSBpcyB0b28gbG9uZyAqLworI2RlZmluZSBQUl8xX0FUVFJfTkFNRV9MRU4gICAgICAgICAgICAweDAxMDA1MCAgLyogYXR0cmlidXRlIG5hbWUgaXMgdG9vIGxvbmcgKi8KKyNkZWZpbmUgUFJfMV9BVFRSX1ZBTFVFX09GRlNFVCAgICAgICAgMHgwMTAwNTEgIC8qIHdyb25nIEVBIHZhbHVlIG9mZnNldCAqLworI2RlZmluZSBQUl8xX0FUVFJfVkFMVUVfQkxPQ0sgICAgICAgICAweDAxMDA1MiAgLyogd3JvbmcgRUEgYmxvY2tudW1iZXIgKi8KKyNkZWZpbmUgUFJfMV9BVFRSX1ZBTFVFX1NJWkUgICAgICAgICAgMHgwMTAwNTMgIC8qIHdyb25nIEVBIHZhbHVlIHNpemUgKi8KKyNkZWZpbmUgUFJfMV9BVFRSX0hBU0ggICAgICAgICAgICAgICAgMHgwMTAwNTQgIC8qIHdyb25nIEVBIGhhc2ggdmFsdWUgKi8KKworLyoKKyAqIFBhc3MgMWIgZXJyb3JzCisgKi8KKworI2RlZmluZSBQUl8xQl9QQVNTX0hFQURFUiAgICAgICAweDAxMTAwMCAgLyogUGFzcyAxQjogUmVzY2FuIGZvciBkdXBsaWNhdGUvYmFkIGJsb2NrcyAqLworI2RlZmluZSBQUl8xQl9EVVBfQkxPQ0tfSEVBREVSICAweDAxMTAwMSAgLyogRHVwbGljYXRlL2JhZCBibG9jayhzKSBoZWFkZXIgKi8KKyNkZWZpbmUgUFJfMUJfRFVQX0JMT0NLICAgICAgICAgMHgwMTEwMDIgIC8qIER1cGxpY2F0ZS9iYWQgYmxvY2socykgaW4gaW5vZGUgKi8KKyNkZWZpbmUgUFJfMUJfRFVQX0JMT0NLX0VORCAgICAgMHgwMTEwMDMgIC8qIER1cGxpY2F0ZS9iYWQgYmxvY2socykgZW5kICovCisjZGVmaW5lIFBSXzFCX0lTQ0FOX0VSUk9SICAgICAgIDB4MDExMDA0ICAvKiBFcnJvciB3aGlsZSBzY2FubmluZyBpbm9kZXMgKi8KKyNkZWZpbmUgUFJfMUJfQUxMT0NBVEVfSUJJVE1BUF9FUlJPUiAweDAxMTAwNSAgLyogRXJyb3IgYWxsb2NhdGluZyBpbm9kZSBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfMUJfQkxPQ0tfSVRFUkFURSAgICAgMHgwMTEwMDA2ICAvKiBFcnJvciB3aGlsZSBpdGVyYXRpbmcgb3ZlciBibG9ja3MgKi8KKyNkZWZpbmUgUFJfMUJfQURKX0VBX1JFRkNPVU5UICAgMHgwMTEwMDA3ICAvKiBFcnJvciBhZGp1c3RpbmcgRUEgcmVmY291bnQgKi8KKyNkZWZpbmUgUFJfMUNfUEFTU19IRUFERVIgICAgICAgMHgwMTIwMDAgIC8qIFBhc3MgMUM6IFNjYW4gZGlyZWN0b3JpZXMgZm9yIGlub2RlcyB3aXRoIGR1cCBibG9ja3MuICovCisjZGVmaW5lIFBSXzFEX1BBU1NfSEVBREVSICAgICAgIDB4MDEzMDAwICAvKiBQYXNzIDFEOiBSZWNvbmNpbGluZyBkdXBsaWNhdGUgYmxvY2tzICovCisjZGVmaW5lIFBSXzFEX0RVUF9GSUxFICAgICAgICAgIDB4MDEzMDAxICAvKiBGaWxlIGhhcyBkdXBsaWNhdGUgYmxvY2tzICovCisjZGVmaW5lIFBSXzFEX0RVUF9GSUxFX0xJU1QgICAgIDB4MDEzMDAyICAvKiBMaXN0IG9mIGZpbGVzIHNoYXJpbmcgZHVwbGljYXRlIGJsb2NrcyAqLworI2RlZmluZSBQUl8xRF9TSEFSRV9NRVRBREFUQSAgICAweDAxMzAwMyAgLyogRmlsZSBzaGFyaW5nIGJsb2NrcyB3aXRoIGZpbGVzeXN0ZW0gbWV0YWRhdGEgICovCisjZGVmaW5lIFBSXzFEX05VTV9EVVBfSU5PREVTICAgIDB4MDEzMDA0ICAvKiBSZXBvcnQgb2YgaG93IG1hbnkgZHVwbGljYXRlL2JhZCBpbm9kZXMgKi8KKyNkZWZpbmUgUFJfMURfRFVQX0JMT0NLU19ERUFMVCAgMHgwMTMwMDUgIC8qIER1cGxpY2F0ZWQgYmxvY2tzIGFscmVhZHkgcmVhc3NpZ25lZCBvciBjbG9uZWQuICovCisjZGVmaW5lIFBSXzFEX0NMT05FX1FVRVNUSU9OICAgIDB4MDEzMDA2ICAvKiBDbG9uZSBkdXBsaWNhdGUvYmFkIGJsb2Nrcz8gKi8KKyNkZWZpbmUgUFJfMURfREVMRVRFX1FVRVNUSU9OICAgMHgwMTMwMDcgIC8qIERlbGV0ZSBmaWxlPyAqLworI2RlZmluZSBQUl8xRF9DTE9ORV9FUlJPUiAgICAgICAweDAxMzAwOCAgLyogQ291bGRuJ3QgY2xvbmUgZmlsZSAoZXJyb3IpICovCisKKy8qCisgKiBQYXNzIDIgZXJyb3JzCisgKi8KKworI2RlZmluZSBQUl8yX1BBU1NfSEVBREVSICAgICAgICAweDAyMDAwMCAgLyogUGFzcyAyOiBDaGVja2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlICovCisjZGVmaW5lIFBSXzJfQkFEX0lOT0RFX0RPVCAgICAgIDB4MDIwMDAxICAvKiBCYWQgaW5vZGUgbnVtYmVyIGZvciAnLicgKi8KKyNkZWZpbmUgUFJfMl9CQURfSU5PICAgICAgICAgICAgMHgwMjAwMDIgIC8qIERpcmVjdG9yeSBlbnRyeSBoYXMgYmFkIGlub2RlIG51bWJlciAqLworI2RlZmluZSBQUl8yX1VOVVNFRF9JTk9ERSAgICAgICAweDAyMDAwMyAgLyogRGlyZWN0b3J5IGVudHJ5IGhhcyBkZWxldGVkIG9yIHVudXNlZCBpbm9kZSAqLworI2RlZmluZSBQUl8yX0xJTktfRE9UICAgICAgICAgICAweDAyMDAwNCAgLyogRGlyZWN0cnkgZW50cnkgaXMgbGluayB0byAnLicgKi8KKyNkZWZpbmUgUFJfMl9CQl9JTk9ERSAgICAgICAgICAgMHgwMjAwMDUgIC8qIERpcmVjdG9yeSBlbnRyeSBwb2ludHMgdG8gaW5vZGUgbm93IGxvY2F0ZWQgaW4gYSBiYWQgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMl9MSU5LX0RJUiAgICAgICAgICAgMHgwMjAwMDYgIC8qIERpcmVjdG9yeSBlbnRyeSBjb250YWlucyBhIGxpbmsgdG8gYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfMl9MSU5LX1JPT1QgICAgICAgICAgMHgwMjAwMDcgIC8qIERpcmVjdG9yeSBlbnRyeSBjb250YWlucyBhIGxpbmsgdG8gdGhlIHJvb3QgZGlyZWN0cnkgKi8KKyNkZWZpbmUgUFJfMl9CQURfTkFNRSAgICAgICAgICAgMHgwMjAwMDggIC8qIERpcmVjdG9yeSBlbnRyeSBoYXMgaWxsZWdhbCBjaGFyYWN0ZXJzIGluIGl0cyBuYW1lICovCisjZGVmaW5lIFBSXzJfTUlTU0lOR19ET1QgICAgICAgIDB4MDIwMDA5ICAvKiBNaXNzaW5nICcuJyBpbiBkaXJlY3RvcnkgaW5vZGUgKi8KKyNkZWZpbmUgUFJfMl9NSVNTSU5HX0RPVF9ET1QgICAgMHgwMjAwMEEgIC8qIE1pc3NpbmcgJy4uJyBpbiBkaXJlY3RvcnkgaW5vZGUgKi8KKyNkZWZpbmUgUFJfMl8xU1RfTk9UX0RPVCAgICAgICAgMHgwMjAwMEIgIC8qIEZpcnN0IGVudHJ5IGluIGRpcmVjdG9yeSBpbm9kZSBkb2Vzbid0IGNvbnRhaW4gJy4nICovCisjZGVmaW5lIFBSXzJfMk5EX05PVF9ET1RfRE9UICAgIDB4MDIwMDBDICAvKiBTZWNvbmQgZW50cnkgaW4gZGlyZWN0b3J5IGlub2RlIGRvZXNuJ3QgY29udGFpbiAnLi4nICovCisjZGVmaW5lIFBSXzJfRkFERFJfWkVSTyAgICAgICAgIDB4MDIwMDBEICAvKiBpX2ZhZGRyIHNob3VsZCBiZSB6ZXJvICovCisjZGVmaW5lIFBSXzJfRklMRV9BQ0xfWkVSTyAgICAgIDB4MDIwMDBFICAvKiBpX2ZpbGVfYWNsIHNob3VsZCBiZSB6ZXJvICovCisjZGVmaW5lIFBSXzJfRElSX0FDTF9aRVJPICAgICAgIDB4MDIwMDBGICAvKiBpX2Rpcl9hY2wgc2hvdWxkIGJlIHplcm8gKi8KKyNkZWZpbmUgUFJfMl9GUkFHX1pFUk8gICAgICAgICAgMHgwMjAwMTAgIC8qIGlfZnJhZyBzaG91bGQgYmUgemVybyAqLworI2RlZmluZSBQUl8yX0ZTSVpFX1pFUk8gICAgICAgICAweDAyMDAxMSAgLyogaV9mc2l6ZSBzaG91bGQgYmUgemVybyAqLworI2RlZmluZSBQUl8yX0JBRF9NT0RFICAgICAgICAgICAweDAyMDAxMiAgLyogaW5vZGUgaGFzIGJhZCBtb2RlICovCisjZGVmaW5lIFBSXzJfRElSX0NPUlJVUFRFRCAgICAgIDB4MDIwMDEzICAvKiBkaXJlY3RvcnkgY29ycnVwdGVkICovCisjZGVmaW5lIFBSXzJfRklMRU5BTUVfTE9ORyAgICAgIDB4MDIwMDE0ICAvKiBmaWxlbmFtZSB0b28gbG9uZyAqLworI2RlZmluZSBQUl8yX0RJUkVDVE9SWV9IT0xFICAgICAweDAyMDAxNSAgLyogRGlyZWN0b3J5IGlub2RlIGhhcyBhIG1pc3NpbmcgYmxvY2sgKGhvbGUpICovCisjZGVmaW5lIFBSXzJfRE9UX05VTExfVEVSTSAgICAgIDB4MDIwMDE2ICAvKiAnLicgaXMgbm90IE5VTEwgdGVybWluYXRlZCAqLworI2RlZmluZSBQUl8yX0RPVF9ET1RfTlVMTF9URVJNICAweDAyMDAxNyAgLyogJy4uJyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkICovCisjZGVmaW5lIFBSXzJfQkFEX0NIQVJfREVWICAgICAgIDB4MDIwMDE4ICAvKiBJbGxlZ2FsIGNoYXJhY3RlciBkZXZpY2UgaW4gaW5vZGUgKi8KKyNkZWZpbmUgUFJfMl9CQURfQkxPQ0tfREVWICAgICAgMHgwMjAwMTkgIC8qIElsbGVnYWwgYmxvY2sgZGV2aWNlIGluIGlub2RlICovCisjZGVmaW5lIFBSXzJfRFVQX0RPVCAgICAgICAgICAgIDB4MDIwMDFBICAvKiBEdXBsaWNhdGUgJy4nIGVudHJ5ICovCisjZGVmaW5lIFBSXzJfRFVQX0RPVF9ET1QgICAgICAgIDB4MDIwMDFCICAvKiBEdXBsaWNhdGUgJy4uJyBlbnRyeSAqLworI2RlZmluZSBQUl8yX05PX0RJUklORk8gICAgICAgICAweDAyMDAxQyAgLyogSW50ZXJuYWwgZXJyb3I6IGNvdWxkbid0IGZpbmQgZGlyX2luZm8gKi8KKyNkZWZpbmUgUFJfMl9GSU5BTF9SRUNMRU4gICAgICAgMHgwMjAwMUQgIC8qIEZpbmFsIHJlY19sZW4gaXMgd3JvbmcgKi8KKyNkZWZpbmUgUFJfMl9BTExPQ0FURV9JQ09VTlQgICAgMHgwMjAwMUUgIC8qIEVycm9yIGFsbG9jYXRpbmcgaWNvdW50IHN0cnVjdHVyZSAqLworI2RlZmluZSBQUl8yX0RCTElTVF9JVEVSQVRFICAgICAweDAyMDAxRiAgLyogRXJyb3IgaXRlcmF0aW5nIG92ZXIgZGlyZWN0b3J5IGJsb2NrcyAqLworI2RlZmluZSBQUl8yX1JFQURfRElSQkxPQ0sgICAgICAweDAyMDAyMCAgLyogRXJyb3IgcmVhZGluZyBkaXJlY3RvcnkgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMl9XUklURV9ESVJCTE9DSyAgICAgMHgwMjAwMjEgIC8qIEVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGJsb2NrICovCisjZGVmaW5lIFBSXzJfQUxMT0NfRElSQk9DSyAgICAgIDB4MDIwMDIyICAvKiBFcnJvciBhbGxvY2F0aW5nIG5ldyBkaXJlY3RvcnkgYmxvY2sgKi8KKyNkZWZpbmUgUFJfMl9ERUFMTE9DX0lOT0RFICAgICAgMHgwMjAwMjMgIC8qIEVycm9yIGRlYWxsb2NhdGluZyBpbm9kZSAqLworI2RlZmluZSBQUl8yX1NQTElUX0RPVCAgICAgICAgICAweDAyMDAyNCAgLyogRGlyZWN0b3J5IGVudHJ5IGZvciAnLicgaXMgYmlnLiAgU3BsaXQ/ICovCisjZGVmaW5lIFBSXzJfQkFEX0ZJRk8gICAgICAgICAgIDB4MDIwMDI1ICAvKiBJbGxlZ2FsIEZJRk8gKi8KKyNkZWZpbmUgUFJfMl9CQURfU09DS0VUICAgICAgICAgMHgwMjAwMjYgIC8qIElsbGVnYWwgc29ja2V0ICovCisjZGVmaW5lIFBSXzJfU0VUX0ZJTEVUWVBFICAgICAgIDB4MDIwMDI3ICAvKiBEaXJlY3RvcnkgZmlsZXR5cGUgbm90IHNldCAqLworI2RlZmluZSBQUl8yX0JBRF9GSUxFVFlQRSAgICAgICAweDAyMDAyOCAgLyogRGlyZWN0b3J5IGZpbGV0eXBlIGluY29ycmVjdCAqLworI2RlZmluZSBQUl8yX0NMRUFSX0ZJTEVUWVBFICAgICAweDAyMDAyOSAgLyogRGlyZWN0b3J5IGZpbGV0eXBlIHNldCB3aGVuIGl0IHNob3VsZG4ndCBiZSAqLworI2RlZmluZSBQUl8yX05VTExfTkFNRSAgICAgICAgICAweDAyMDAzMCAgLyogRGlyZWN0b3J5IGZpbGVuYW1lIGNhbid0IGJlIHplcm8tbGVuZ3RoICAqLworI2RlZmluZSBQUl8yX0lOVkFMSURfU1lNTElOSyAgICAweDAyMDAzMSAgLyogSW52YWxpZCBzeW1saW5rICovCisjZGVmaW5lIFBSXzJfRklMRV9BQ0xfQkFEICAgICAgIDB4MDIwMDMyICAvKiBpX2ZpbGVfYWNsIChleHRlbmRlZCBhdHRyaWJ1dGUpIGlzIGJhZCAqLworI2RlZmluZSBQUl8yX0ZFQVRVUkVfTEFSR0VfRklMRVMgMHgwMjAwMzMgIC8qIEZpbGVzeXN0ZW0gY29udGFpbnMgbGFyZ2UgZmlsZXMsIGJ1dCBoYXMgbm8gc3VjaCBmbGFnIGluIHNiICovCisjZGVmaW5lIFBSXzJfSFRSRUVfTk9UUkVGICAgICAgIDB4MDIwMDM0ICAvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSBub3QgcmVmZXJlbmNlZCAqLworI2RlZmluZSBQUl8yX0hUUkVFX0RVUFJFRiAgICAgICAweDAyMDAzNSAgLyogTm9kZSBpbiBIVFJFRSBkaXJlY3RvcnkgcmVmZXJlbmNlZCB0d2ljZSAqLworI2RlZmluZSBQUl8yX0hUUkVFX01JTl9IQVNIICAgICAweDAyMDAzNiAgLyogTm9kZSBpbiBIVFJFRSBkaXJlY3RvcnkgaGFzIGJhZCBtaW4gaGFzaCAqLworI2RlZmluZSBQUl8yX0hUUkVFX01BWF9IQVNIICAgICAweDAyMDAzNyAgLyogTm9kZSBpbiBIVFJFRSBkaXJlY3RvcnkgaGFzIGJhZCBtYXggaGFzaCAqLworI2RlZmluZSBQUl8yX0hUUkVFX0NMRUFSICAgICAgICAweDAyMDAzOCAgLyogQ2xlYXIgaW52YWxpZCBIVFJFRSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9CQURCTEsgICAgICAgMHgwMjAwM0EgIC8qIEJhZCBibG9jayBpbiBodHJlZSBpbnRlcmlvciBub2RlICovCisjZGVmaW5lIFBSXzJfQURKX0VBX1JFRkNPVU5UICAgIDB4MDIwMDNCICAvKiBFcnJvciBhZGp1c3RpbmcgRUEgcmVmY291bnQgKi8KKyNkZWZpbmUgUFJfMl9IVFJFRV9CQURfUk9PVCAgICAgMHgwMjAwM0MgIC8qIEludmFsaWQgSFRSRUUgcm9vdCBub2RlICovCisjZGVmaW5lIFBSXzJfSFRSRUVfQkFEX0xJTUlUICAgIDB4MDIwMDNEICAvKiBJbnZhbGlkIEhUUkVFIGxpbWl0ICovCisjZGVmaW5lIFBSXzJfSFRSRUVfQkFEX0NPVU5UICAgIDB4MDIwMDNFICAvKiBJbnZhbGlkIEhUUkVFIGNvdW50ICovCisjZGVmaW5lIFBSXzJfSFRSRUVfSEFTSF9PUkRFUiAgIDB4MDIwMDNGICAvKiBIVFJFRSBpbnRlcmlvciBub2RlIGhhcyBvdXQtb2Ytb3JkZXIgaGFzaGVzIGluIHRhYmxlICovCisjZGVmaW5lIFBSXzJfSFRSRUVfQkFEX0RFUFRIICAgIDB4MDIwMDQwICAvKiBOb2RlIGluIEhUUkVFIGRpcmVjdG9yeSBoYXMgYmFkIGRlcHRoICovCisjZGVmaW5lIFBSXzJfRFVQTElDQVRFX0RJUkVOVCAgIDB4MDIwMDQxICAvKiBEdXBsaWNhdGUgZGlyZWN0b3J5IGVudHJ5IGZvdW5kICovCisjZGVmaW5lIFBSXzJfTk9OX1VOSVFVRV9GSUxFICAgIDB4MDIwMDQyICAvKiBOb24tdW5pcXVlIGZpbGVuYW1lIGZvdW5kICovCisjZGVmaW5lIFBSXzJfUkVQT1JUX0RVUF9ESVJFTlQgIDB4MDIwMDQzICAvKiBEdXBsaWNhdGUgZGlyZWN0b3J5IGVudHJ5IGZvdW5kICovCisKKy8qCisgKiBQYXNzIDMgZXJyb3JzCisgKi8KKworI2RlZmluZSBQUl8zX1BBU1NfSEVBREVSICAgICAgICAgICAgMHgwMzAwMDAgIC8qIFBhc3MgMzogQ2hlY2tpbmcgZGlyZWN0b3J5IGNvbm5lY3Rpdml0eSAqLworI2RlZmluZSBQUl8zX05PX1JPT1RfSU5PREUgICAgICAgICAgMHgwMzAwMDEgIC8qIFJvb3QgaW5vZGUgbm90IGFsbG9jYXRlZCAqLworI2RlZmluZSBQUl8zX0VYUEFORF9MRl9ESVIgICAgICAgICAgMHgwMzAwMDIgIC8qIE5vIHJvb20gaW4gbG9zdCtmb3VuZCAqLworI2RlZmluZSBQUl8zX1VOQ09OTkVDVEVEX0RJUiAgICAgICAgMHgwMzAwMDMgIC8qIFVuY29ubmVjdGVkIGRpcmVjdG9yeSBpbm9kZSAqLworI2RlZmluZSBQUl8zX05PX0xGX0RJUiAgICAgICAgICAgICAgMHgwMzAwMDQgIC8qIC9sb3N0K2ZvdW5kIG5vdCBmb3VuZCAqLworI2RlZmluZSBQUl8zX0JBRF9ET1RfRE9UICAgICAgICAgICAgMHgwMzAwMDUgIC8qIC4uIGVudHJ5IGlzIGluY29ycmVjdCAqLworI2RlZmluZSBQUl8zX05PX0xQRiAgICAgICAgICAgICAgICAgMHgwMzAwMDYgIC8qIEJhZCBvciBub24tZXhpc3RlbnQgL2xvc3QrZm91bmQuICBDYW5ub3QgcmVjb25uZWN0ICovCisjZGVmaW5lIFBSXzNfQ0FOVF9FWFBBTkRfTFBGICAgICAgICAweDAzMDAwNyAgLyogQ291bGQgbm90IGV4cGFuZCAvbG9zdCtmb3VuZCAqLworI2RlZmluZSBQUl8zX0NBTlRfUkVDT05ORUNUICAgICAgICAgMHgwMzAwMDggIC8qIENvdWxkIG5vdCByZWNvbm5lY3QgaW5vZGUgKi8KKyNkZWZpbmUgUFJfM19FUlJfRklORF9MUEYgICAgICAgICAgIDB4MDMwMDA5ICAvKiBFcnJvciB3aGlsZSB0cnlpbmcgdG8gZmluZCAvbG9zdCtmb3VuZCAqLworI2RlZmluZSBQUl8zX0VSUl9MUEZfTkVXX0JMT0NLICAgICAgMHgwMzAwMEEgIC8qIEVycm9yIGluIGV4dDJmc19uZXdfYmxvY2sgd2hpbGUgY3JlYXRpbmcgL2xvc3QrZm91bmQgKi8KKyNkZWZpbmUgUFJfM19FUlJfTFBGX05FV19JTk9ERSAgICAgIDB4MDMwMDBCICAvKiBFcnJvciBpbiBleHQyZnNfbmV3X2lub2RlIHdoaWxlIGNyZWF0aW5nIC9sb3N0K2ZvdW5kICovCisjZGVmaW5lIFBSXzNfRVJSX0xQRl9ORVdfRElSX0JMT0NLICAweDAzMDAwQyAgLyogRXJyb3IgaW4gZXh0MmZzX25ld19kaXJfYmxvY2sgd2hpbGUgY3JlYXRpbmcgL2xvc3QrZm91bmQgKi8KKyNkZWZpbmUgUFJfM19FUlJfTFBGX1dSSVRFX0JMT0NLICAgIDB4MDMwMDBEICAvKiBFcnJvciB3aGlsZSB3cml0aW5nIGRpcmVjdG9yeSBibG9jayBmb3IgL2xvc3QrZm91bmQgKi8KKyNkZWZpbmUgUFJfM19BREpVU1RfSU5PREUgICAgICAgICAgIDB4MDMwMDBFICAvKiBFcnJvciB3aGlsZSBhZGp1c3RpbmcgaW5vZGUgY291bnQgKi8KKyNkZWZpbmUgUFJfM19GSVhfUEFSRU5UX0VSUiAgICAgICAgIDB4MDMwMDBGICAvKiBDb3VsZG4ndCBmaXggcGFyZW50IGRpcmVjdG9yeSAtLSBlcnJvciAqLworI2RlZmluZSBQUl8zX0ZJWF9QQVJFTlRfTk9GSU5EICAgICAgMHgwMzAwMTAgIC8qIENvdWxkbid0IGZpeCBwYXJlbnQgZGlyZWN0b3J5IC0tIGNvdWxkbid0IGZpbmQgaXQgKi8KKyNkZWZpbmUgUFJfM19BTExPQ0FURV9JQklUTUFQX0VSUk9SIDB4MDMwMDExICAvKiBFcnJvciBhbGxvY2F0aW5nIGlub2RlIGJpdG1hcCAqLworI2RlZmluZSBQUl8zX0NSRUFURV9ST09UX0VSUk9SICAgICAgMHgwMzAwMTIgIC8qIEVycm9yIGNyZWF0aW5nIHJvb3QgZGlyZWN0b3J5ICovCisjZGVmaW5lIFBSXzNfQ1JFQVRFX0xQRl9FUlJPUiAgICAgICAweDAzMDAxMyAgLyogRXJyb3IgY3JlYXRpbmcgbG9zdCBhbmQgZm91bmQgZGlyZWN0b3J5ICovCisjZGVmaW5lIFBSXzNfUk9PVF9OT1RfRElSX0FCT1JUICAgICAweDAzMDAxNCAgLyogUm9vdCBpbm9kZSBpcyBub3QgZGlyZWN0b3J5OyBhYm9ydGluZyAqLworI2RlZmluZSBQUl8zX05PX1JPT1RfSU5PREVfQUJPUlQgICAgMHgwMzAwMTUgIC8qIENhbm5vdCBwcm9jZWVkIHdpdGhvdXQgYSByb290IGlub2RlLiAqLworI2RlZmluZSBQUl8zX05PX0RJUklORk8gICAgICAgICAgICAgMHgwMzAwMTYgIC8qIEludGVybmFsIGVycm9yOiBjb3VsZG4ndCBmaW5kIGRpcl9pbmZvICovCisjZGVmaW5lIFBSXzNfTFBGX05PVERJUiAgICAgICAgICAgICAweDAzMDAxNyAgLyogTG9zdCtmb3VuZCBpcyBub3QgYSBkaXJlY3RvcnkgKi8KKworLyoKKyAqIFBhc3MgM2EgLS0tIHJlaGFzaGluZyBkaXJldG9yaWVzCisgKi8KKyNkZWZpbmUgUFJfM0FfUEFTU19IRUFERVIgICAgICAgICAweDAzMTAwMCAgLyogUGFzcyAzYTogUmVpbmRleGluZyBkaXJlY3RvcmllcyAqLworI2RlZmluZSBQUl8zQV9PUFRJTUlaRV9JVEVSICAgICAgIDB4MDMxMDAxICAvKiBFcnJvciBpdGVyYXRpbmcgb3ZlciBkaXJlY3RvcmllcyAqLworI2RlZmluZSBQUl8zQV9PUFRJTUlaRV9ESVJfRVJSICAgIDB4MDMxMDAyICAvKiBFcnJvciByZWhhc2ggZGlyZWN0b3J5ICovCisjZGVmaW5lIFBSXzNBX09QVElNSVpFX0RJUl9IRUFERVIgMHgwMzEwMDMgIC8qIFJlaGFzaGluZyBkaXIgaGVhZGVyICovCisjZGVmaW5lIFBSXzNBX09QVElNSVpFX0RJUiAgICAgICAgMHgwMzEwMDQgIC8qIFJlaGFzaGluZyBkaXJlY3RvcnkgJWQgKi8KKyNkZWZpbmUgUFJfM0FfT1BUSU1JWkVfRElSX0VORCAgICAweDAzMTAwNSAgLyogUmVoYXNoaW5nIGRpciBlbmQgKi8KKworLyoKKyAqIFBhc3MgNCBlcnJvcnMKKyAqLworCisjZGVmaW5lIFBSXzRfUEFTU19IRUFERVIgICAgICAgIDB4MDQwMDAwICAvKiBQYXNzIDQ6IENoZWNraW5nIHJlZmVyZW5jZSBjb3VudHMgKi8KKyNkZWZpbmUgUFJfNF9aRVJPX0xFTl9JTk9ERSAgICAgMHgwNDAwMDEgIC8qIFVuYXR0YWNoZWQgemVyby1sZW5ndGggaW5vZGUgKi8KKyNkZWZpbmUgUFJfNF9VTkFUVEFDSEVEX0lOT0RFICAgMHgwNDAwMDIgIC8qIFVuYXR0YWNoZWQgaW5vZGUgKi8KKyNkZWZpbmUgUFJfNF9CQURfUkVGX0NPVU5UICAgICAgMHgwNDAwMDMgIC8qIElub2RlIHJlZiBjb3VudCB3cm9uZyAqLworI2RlZmluZSBQUl80X0lOQ09OU0lTVEVOVF9DT1VOVCAweDA0MDAwNCAgLyogSW5jb25zaXN0ZW50IGlub2RlIGNvdW50IGluZm9ybWF0aW9uIGNhY2hlZCAqLworCisvKgorICogUGFzcyA1IGVycm9ycworICovCisKKyNkZWZpbmUgUFJfNV9QQVNTX0hFQURFUiAgICAgICAgICAgIDB4MDUwMDAwICAvKiBQYXNzIDU6IENoZWNraW5nIGdyb3VwIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFJfNV9JTk9ERV9CTUFQX1BBRERJTkcgICAgIDB4MDUwMDAxICAvKiBQYWRkaW5nIGF0IGVuZCBvZiBpbm9kZSBiaXRtYXAgaXMgbm90IHNldC4gKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19CTUFQX1BBRERJTkcgICAgIDB4MDUwMDAyICAvKiBQYWRkaW5nIGF0IGVuZCBvZiBibG9jayBiaXRtYXAgaXMgbm90IHNldC4gKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19CSVRNQVBfSEVBREVSICAgIDB4MDUwMDAzICAvKiBCbG9jayBiaXRtYXAgZGlmZmVyZW5jZXMgaGVhZGVyICovCisjZGVmaW5lIFBSXzVfQkxPQ0tfVU5VU0VEICAgICAgICAgICAweDA1MDAwNCAgLyogQmxvY2sgbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisjZGVmaW5lIFBSXzVfQkxPQ0tfVVNFRCAgICAgICAgICAgICAweDA1MDAwNSAgLyogQmxvY2sgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9CTE9DS19CSVRNQVBfRU5EICAgICAgIDB4MDUwMDA2ICAvKiBCbG9jayBiaXRtYXAgZGlmZmVyZW5jZXMgZW5kICovCisjZGVmaW5lIFBSXzVfSU5PREVfQklUTUFQX0hFQURFUiAgICAweDA1MDAwNyAgLyogSW5vZGUgYml0bWFwIGRpZmZlcmVuY2VzIGhlYWRlciAqLworI2RlZmluZSBQUl81X0lOT0RFX1VOVVNFRCAgICAgICAgICAgMHgwNTAwMDggIC8qIElub2RlIG5vdCB1c2VkLCBidXQgbWFya2VkIGluIGJpdG1hcCAqLworI2RlZmluZSBQUl81X0lOT0RFX1VTRUQgICAgICAgICAgICAgMHgwNTAwMDkgIC8qIElub2RlIHVzZWQsIGJ1dCBub3QgbWFya2VkIHVzZWQgaW4gYml0bWFwICovCisjZGVmaW5lIFBSXzVfSU5PREVfQklUTUFQX0VORCAgICAgICAweDA1MDAwQSAgLyogSW5vZGUgYml0bWFwIGRpZmZlcmVuY2VzIGVuZCAqLworI2RlZmluZSBQUl81X0ZSRUVfSU5PREVfQ09VTlRfR1JPVVAgMHgwNTAwMEIgIC8qIEZyZWUgaW5vZGVzIGNvdW50IGZvciBncm91cCB3cm9uZyAqLworI2RlZmluZSBQUl81X0ZSRUVfRElSX0NPVU5UX0dST1VQICAgMHgwNTAwMEMgIC8qIERpcmVjdG9yaWVzIGNvdW50IGZvciBncm91cCB3cm9uZyAqLworI2RlZmluZSBQUl81X0ZSRUVfSU5PREVfQ09VTlQgICAgICAgMHgwNTAwMEQgIC8qIEZyZWUgaW5vZGVzIGNvdW50IHdyb25nICovCisjZGVmaW5lIFBSXzVfRlJFRV9CTE9DS19DT1VOVF9HUk9VUCAweDA1MDAwRSAgLyogRnJlZSBibG9ja3MgY291bnQgZm9yIGdyb3VwIHdyb25nICovCisjZGVmaW5lIFBSXzVfRlJFRV9CTE9DS19DT1VOVCAgICAgICAweDA1MDAwRiAgLyogRnJlZSBibG9ja3MgY291bnQgd3JvbmcgKi8KKyNkZWZpbmUgUFJfNV9CTUFQX0VORFBPSU5UUyAgICAgICAgIDB4MDUwMDEwICAvKiBQcm9ncmFtbWluZyBlcnJvcjogYml0bWFwIGVuZHBvaW50cyBkb24ndCBtYXRjaCAqLworI2RlZmluZSBQUl81X0ZVREdFX0JJVE1BUF9FUlJPUiAgICAgMHgwNTAwMTEgIC8qIEludGVybmFsIGVycm9yOiBmdWRnaW5nIGVuZCBvZiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9DT1BZX0lCSVRNQVBfRVJST1IgICAgIDB4MDUwMDEyICAvKiBFcnJvciBjb3B5aW5nIGluIHJlcGxhY2VtZW50IGlub2RlIGJpdG1hcCAqLworI2RlZmluZSBQUl81X0NPUFlfQkJJVE1BUF9FUlJPUiAgICAgMHgwNTAwMTMgIC8qIEVycm9yIGNvcHlpbmcgaW4gcmVwbGFjZW1lbnQgYmxvY2sgYml0bWFwICovCisjZGVmaW5lIFBSXzVfQkxPQ0tfUkFOR0VfVU5VU0VEICAgICAweDA1MDAxNCAgLyogQmxvY2sgcmFuZ2Ugbm90IHVzZWQsIGJ1dCBtYXJrZWQgaW4gYml0bWFwICovCisjZGVmaW5lIFBSXzVfQkxPQ0tfUkFOR0VfVVNFRCAgICAgICAweDA1MDAxNSAgLyogQmxvY2sgcmFuZ2UgdXNlZCwgYnV0IG5vdCBtYXJrZWQgdXNlZCBpbiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9JTk9ERV9SQU5HRV9VTlVTRUQgICAgIDB4MDUwMDE2ICAvKiBJbm9kZSByYW5nZSBub3QgdXNlZCwgYnV0IG1hcmtlZCBpbiBiaXRtYXAgKi8KKyNkZWZpbmUgUFJfNV9JTk9ERV9SQU5HRV9VU0VEICAgICAgIDB4MDUwMDE3ICAvKiBJbm9kZSByYW5nZXVzZWQsIGJ1dCBub3QgbWFya2VkIHVzZWQgaW4gYml0bWFwICovCisKKworLyoKKyAqIFRoZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gc3RydWN0dXJlOyBzdG9yZXMgZGlyZWN0b3J5IGluZm9ybWF0aW9uCisgKiBjb2xsZWN0ZWQgaW4gZWFybGllciBwYXNzZXMsIHRvIGF2b2lkIGRpc2sgaS9vIGluIGZldGNoaW5nIHRoZQorICogZGlyZWN0b3J5IGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgZGlyX2luZm8geworCWV4dDJfaW5vX3QgICAgICAgICAgICAgIGlubzsgICAgLyogSW5vZGUgbnVtYmVyICovCisJZXh0Ml9pbm9fdCAgICAgICAgICAgICAgZG90ZG90OyAvKiBQYXJlbnQgYWNjb3JkaW5nIHRvICcuLicgKi8KKwlleHQyX2lub190ICAgICAgICAgICAgICBwYXJlbnQ7IC8qIFBhcmVudCBhY2NvcmRpbmcgdG8gdHJlZXdhbGsgKi8KK307CisKKworCisvKgorICogVGhlIGluZGV4ZWQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHN0cnVjdHVyZTsgc3RvcmVzIGluZm9ybWF0aW9uIGZvcgorICogZGlyZWN0b3JpZXMgd2hpY2ggY29udGFpbiBhIGhhc2ggdHJlZSBpbmRleC4KKyAqLworc3RydWN0IGR4X2Rpcl9pbmZvIHsKKwlleHQyX2lub190ICAgICAgICAgICAgICBpbm87ICAgICAgICAgICAgLyogSW5vZGUgbnVtYmVyICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgbnVtYmxvY2tzOyAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBoYXNodmVyc2lvbjsKKwlzaG9ydCAgICAgICAgICAgICAgICAgICBkZXB0aDsgICAgICAgICAgLyogZGVwdGggb2YgdHJlZSAqLworCXN0cnVjdCBkeF9kaXJibG9ja19pbmZvICpkeF9ibG9jazsgICAgICAvKiBBcnJheSBvZiBzaXplIG51bWJsb2NrcyAqLworfTsKKworLyoKKyAqIERlZmluZSB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlZmNvdW50IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBlYV9yZWZjb3VudCAqZXh0Ml9yZWZjb3VudF90OworCitzdHJ1Y3QgZTJmc2NrX3N0cnVjdCB7CisJZXh0Ml9maWxzeXMgZnM7CisJY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lOworCWNoYXIgKmZpbGVzeXN0ZW1fbmFtZTsKKwljaGFyICpkZXZpY2VfbmFtZTsKKwljaGFyICppb19vcHRpb25zOworCWludCAgICAgZmxhZ3M7ICAgICAgICAgIC8qIEUyZnNjayBpbnRlcm5hbCBmbGFncyAqLworCWludCAgICAgb3B0aW9uczsKKwlibGtfdCAgIHVzZV9zdXBlcmJsb2NrOyAvKiBzYiByZXF1ZXN0ZWQgYnkgdXNlciAqLworCWJsa190ICAgc3VwZXJibG9jazsgICAgIC8qIHNiIHVzZWQgdG8gb3BlbiBmcyAqLworCWludCAgICAgYmxvY2tzaXplOyAgICAgIC8qIGJsb2Nrc2l6ZSAqLworCWJsa190ICAgbnVtX2Jsb2NrczsgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKwlpbnQgICAgIG1vdW50X2ZsYWdzOworCWJsa2lkX2NhY2hlIGJsa2lkOyAgICAgIC8qIGJsa2lkIGNhY2hlICovCisKKwlqbXBfYnVmIGFib3J0X2xvYzsKKworCXVuc2lnbmVkIGxvbmcgYWJvcnRfY29kZTsKKworCWludCAoKnByb2dyZXNzKShlMmZzY2tfdCBjdHgsIGludCBwYXNzLCB1bnNpZ25lZCBsb25nIGN1ciwKKwkJCXVuc2lnbmVkIGxvbmcgbWF4KTsKKworCWV4dDJmc19pbm9kZV9iaXRtYXAgaW5vZGVfdXNlZF9tYXA7IC8qIElub2RlcyB3aGljaCBhcmUgaW4gdXNlICovCisJZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV9iYWRfbWFwOyAvKiBJbm9kZXMgd2hpY2ggYXJlIGJhZCBzb21laG93ICovCisJZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV9kaXJfbWFwOyAvKiBJbm9kZXMgd2hpY2ggYXJlIGRpcmVjdG9yaWVzICovCisJZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV9pbWFnaWNfbWFwOyAvKiBBRlMgaW5vZGVzICovCisJZXh0MmZzX2lub2RlX2JpdG1hcCBpbm9kZV9yZWdfbWFwOyAvKiBJbm9kZXMgd2hpY2ggYXJlIHJlZ3VsYXIgZmlsZXMqLworCisJZXh0MmZzX2Jsb2NrX2JpdG1hcCBibG9ja19mb3VuZF9tYXA7IC8qIEJsb2NrcyB3aGljaCBhcmUgaW4gdXNlICovCisJZXh0MmZzX2Jsb2NrX2JpdG1hcCBibG9ja19kdXBfbWFwOyAvKiBCbGtzIHJlZmVyZW5jZWQgbW9yZSB0aGFuIG9uY2UgKi8KKwlleHQyZnNfYmxvY2tfYml0bWFwIGJsb2NrX2VhX21hcDsgLyogQmxvY2tzIHdoaWNoIGFyZSB1c2VkIGJ5IEVBJ3MgKi8KKworCS8qCisJICogSW5vZGUgY291bnQgYXJyYXlzCisJICovCisJZXh0Ml9pY291bnRfdCAgIGlub2RlX2NvdW50OworCWV4dDJfaWNvdW50X3QgaW5vZGVfbGlua19pbmZvOworCisJZXh0Ml9yZWZjb3VudF90IHJlZmNvdW50OworCWV4dDJfcmVmY291bnRfdCByZWZjb3VudF9leHRyYTsKKworCS8qCisJICogQXJyYXkgb2YgZmxhZ3MgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGlub2RlIGJpdG1hcCwgYmxvY2sKKwkgKiBiaXRtYXAsIG9yIGlub2RlIHRhYmxlIGlzIGludmFsaWQKKwkgKi8KKwlpbnQgKmludmFsaWRfaW5vZGVfYml0bWFwX2ZsYWc7CisJaW50ICppbnZhbGlkX2Jsb2NrX2JpdG1hcF9mbGFnOworCWludCAqaW52YWxpZF9pbm9kZV90YWJsZV9mbGFnOworCWludCBpbnZhbGlkX2JpdG1hcHM7ICAgIC8qIFRoZXJlIGFyZSBpbnZhbGlkIGJpdG1hcHMvaXRhYmxlICovCisKKwkvKgorCSAqIEJsb2NrIGJ1ZmZlcgorCSAqLworCWNoYXIgKmJsb2NrX2J1ZjsKKworCS8qCisJICogRm9yIHBhc3MxX2NoZWNrX2RpcmVjdG9yeSBhbmQgcGFzczFfZ2V0X2Jsb2NrcworCSAqLworCWV4dDJfaW5vX3Qgc3Rhc2hlZF9pbm87CisJc3RydWN0IGV4dDJfaW5vZGUgKnN0YXNoZWRfaW5vZGU7CisKKwkvKgorCSAqIExvY2F0aW9uIG9mIHRoZSBsb3N0IGFuZCBmb3VuZCBkaXJlY3RvcnkKKwkgKi8KKwlleHQyX2lub190IGxvc3RfYW5kX2ZvdW5kOworCWludCBiYWRfbG9zdF9hbmRfZm91bmQ7CisKKwkvKgorCSAqIERpcmVjdG9yeSBpbmZvcm1hdGlvbgorCSAqLworCWludCAgICAgICAgICAgICBkaXJfaW5mb19jb3VudDsKKwlpbnQgICAgICAgICAgICAgZGlyX2luZm9fc2l6ZTsKKwlzdHJ1Y3QgZGlyX2luZm8gKmRpcl9pbmZvOworCisJLyoKKwkgKiBJbmRleGVkIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorCSAqLworCWludCAgICAgICAgICAgICBkeF9kaXJfaW5mb19jb3VudDsKKwlpbnQgICAgICAgICAgICAgZHhfZGlyX2luZm9fc2l6ZTsKKwlzdHJ1Y3QgZHhfZGlyX2luZm8gKmR4X2Rpcl9pbmZvOworCisJLyoKKwkgKiBEaXJlY3RvcmllcyB0byBoYXNoCisJICovCisJZXh0Ml91MzJfbGlzdCAgIGRpcnNfdG9faGFzaDsKKworCS8qCisJICogVHVuaW5nIHBhcmFtZXRlcnMKKwkgKi8KKwlpbnQgcHJvY2Vzc19pbm9kZV9zaXplOworCWludCBpbm9kZV9idWZmZXJfYmxvY2tzOworCisJLyoKKwkgKiBleHQzIGpvdXJuYWwgc3VwcG9ydAorCSAqLworCWlvX2NoYW5uZWwgICAgICBqb3VybmFsX2lvOworCWNoYXIgICAgKmpvdXJuYWxfbmFtZTsKKworCS8qCisJICogSG93IHdlIGRpc3BsYXkgdGhlIHByb2dyZXNzIHVwZGF0ZSAoZm9yIHVuaXgpCisJICovCisJaW50IHByb2dyZXNzX2ZkOworCWludCBwcm9ncmVzc19wb3M7CisJaW50IHByb2dyZXNzX2xhc3RfcGVyY2VudDsKKwl1bnNpZ25lZCBpbnQgcHJvZ3Jlc3NfbGFzdF90aW1lOworCWludCBpbnRlcmFjdGl2ZTsgICAgICAgIC8qIEFyZSB3ZSBjb25uZWN0ZWQgZGlyZWN0bHkgdG8gYSB0dHk/ICovCisJY2hhciBzdGFydF9tZXRhWzJdLCBzdG9wX21ldGFbMl07CisKKwkvKiBGaWxlIGNvdW50cyAqLworCWludCBmc19kaXJlY3RvcnlfY291bnQ7CisJaW50IGZzX3JlZ3VsYXJfY291bnQ7CisJaW50IGZzX2Jsb2NrZGV2X2NvdW50OworCWludCBmc19jaGFyZGV2X2NvdW50OworCWludCBmc19saW5rc19jb3VudDsKKwlpbnQgZnNfc3ltbGlua3NfY291bnQ7CisJaW50IGZzX2Zhc3Rfc3ltbGlua3NfY291bnQ7CisJaW50IGZzX2ZpZm9fY291bnQ7CisJaW50IGZzX3RvdGFsX2NvdW50OworCWludCBmc19zb2NrZXRzX2NvdW50OworCWludCBmc19pbmRfY291bnQ7CisJaW50IGZzX2RpbmRfY291bnQ7CisJaW50IGZzX3RpbmRfY291bnQ7CisJaW50IGZzX2ZyYWdtZW50ZWQ7CisJaW50IGxhcmdlX2ZpbGVzOworCWludCBmc19leHRfYXR0cl9pbm9kZXM7CisJaW50IGZzX2V4dF9hdHRyX2Jsb2NrczsKKworCWludCBleHRfYXR0cl92ZXI7CisKKwkvKgorCSAqIEZvciB0aGUgdXNlIG9mIGNhbGxlcnMgb2YgdGhlIGUyZnNjayBmdW5jdGlvbnM7IG5vdCB1c2VkIGJ5CisJICogZTJmc2NrIGZ1bmN0aW9ucyB0aGVtc2VsdmVzLgorCSAqLworCXZvaWQgKnByaXZfZGF0YTsKK307CisKKworI2RlZmluZSB0aWRfZ3QoeCwgeSkgICgoeCAtIHkpID4gMCkKKworc3RhdGljIGlubGluZSBpbnQgdGlkX2dlcSh0aWRfdCB4LCB0aWRfdCB5KQoreworCWludCBkaWZmZXJlbmNlID0gKHggLSB5KTsKKwlyZXR1cm4gKGRpZmZlcmVuY2UgPj0gMCk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvS2J1aWxkLnNyYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjYzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE4IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworTkVFREVELSQoQ09ORklHX0NIQVRUUikgPSB5CitORUVERUQtJChDT05GSUdfTFNBVFRSKSA9IHkKK05FRURFRC0kKENPTkZJR19NS0UyRlMpID0geQorTkVFREVELSQoQ09ORklHX1RVTkUyRlMpID0geQorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWItJChORUVERUQteSkgKz0gZmdldHNldGZsYWdzLm8gZmdldHNldHZlcnNpb24ubyBwZi5vIGlvZC5vIG1udG9wdHMubyBcCisgICAgICAgICAgIGZlYXR1cmUubyBscy5vIHV1aWQubyBwZS5vIG9zdHlwZS5vIHBzLm8gaGFzaHN0ci5vIFwKKyAgICAgICAgICAgcGFyc2VfbnVtLm8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9lMnAuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9lMnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQyZDZhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2UycC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkvKiBOZWVkZWQgYnkgZGlyZW50Lmggb24gbmV0YnNkICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2luY2x1ZGUgIi4uL2V4dDJmcy9leHQyX2ZzLmgiCisKKyNkZWZpbmUgRTJQX0ZFQVRVUkVfQ09NUEFUCTAKKyNkZWZpbmUgRTJQX0ZFQVRVUkVfSU5DT01QQVQJMQorI2RlZmluZSBFMlBfRkVBVFVSRV9ST19JTkNPTVBBVAkyCisjaWZuZGVmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTICAgICAgICAgICAweDAwNDAKKyNlbmRpZgorCisvKiBgb3B0aW9ucycgZm9yIHByaW50X2UyZmxhZ3MoKSAqLworCisjZGVmaW5lIFBGT1BUX0xPTkcgIDEgLyogTXVzdCBiZSAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYGludCBsb25nX2Zvcm1hdCcuICovCisKKy8qaW50IGZnZXR2ZXJzaW9uIChjb25zdCBjaGFyICogbmFtZSwgdW5zaWduZWQgbG9uZyAqIHZlcnNpb24pOyovCisvKmludCBmc2V0dmVyc2lvbiAoY29uc3QgY2hhciAqIG5hbWUsIHVuc2lnbmVkIGxvbmcgdmVyc2lvbik7Ki8KK2ludCBmZ2V0c2V0dmVyc2lvbihjb25zdCBjaGFyICogbmFtZSwgdW5zaWduZWQgbG9uZyAqIGdldF92ZXJzaW9uLCB1bnNpZ25lZCBsb25nIHNldF92ZXJzaW9uKTsKKyNkZWZpbmUgZmdldHZlcnNpb24obmFtZSwgdmVyc2lvbikgZmdldHNldHZlcnNpb24obmFtZSwgdmVyc2lvbiwgMCkKKyNkZWZpbmUgZnNldHZlcnNpb24obmFtZSwgdmVyc2lvbikgZmdldHNldHZlcnNpb24obmFtZSwgTlVMTCwgdmVyc2lvbikKKworLyppbnQgZmdldGZsYWdzIChjb25zdCBjaGFyICogbmFtZSwgdW5zaWduZWQgbG9uZyAqIGZsYWdzKTsqLworLyppbnQgZnNldGZsYWdzIChjb25zdCBjaGFyICogbmFtZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ki8KK2ludCBmZ2V0c2V0ZmxhZ3MoY29uc3QgY2hhciAqIG5hbWUsIHVuc2lnbmVkIGxvbmcgKiBnZXRfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc2V0X2ZsYWdzKTsKKyNkZWZpbmUgZmdldGZsYWdzKG5hbWUsIGZsYWdzKSBmZ2V0c2V0ZmxhZ3MobmFtZSwgZmxhZ3MsIDApCisjZGVmaW5lIGZzZXRmbGFncyhuYW1lLCBmbGFncykgZmdldHNldGZsYWdzKG5hbWUsIE5VTEwsIGZsYWdzKQorCitpbnQgZ2V0ZmxhZ3MgKGludCBmZCwgdW5zaWduZWQgbG9uZyAqIGZsYWdzKTsKK2ludCBnZXR2ZXJzaW9uIChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgKiB2ZXJzaW9uKTsKK2ludCBpdGVyYXRlX29uX2RpciAoY29uc3QgY2hhciAqIGRpcl9uYW1lLAorCQkgICAgaW50ICgqZnVuYykgKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpcmVudCAqLCB2b2lkICopLAorCQkgICAgdm9pZCAqIHByaXZhdGUpOworLyp2b2lkIGxpc3Rfc3VwZXIoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBzKTsqLwordm9pZCBsaXN0X3N1cGVyMihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHMsIEZJTEUgKmYpOworI2RlZmluZSBsaXN0X3N1cGVyKHMpIGxpc3Rfc3VwZXIyKHMsIHN0ZG91dCkKK3ZvaWQgcHJpbnRfZnNfZXJyb3JzIChGSUxFICpmLCB1bnNpZ25lZCBzaG9ydCBlcnJvcnMpOwordm9pZCBwcmludF9mbGFncyAoRklMRSAqZiwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgb3B0aW9ucyk7Cit2b2lkIHByaW50X2ZzX3N0YXRlIChGSUxFICpmLCB1bnNpZ25lZCBzaG9ydCBzdGF0ZSk7CitpbnQgc2V0ZmxhZ3MgKGludCBmZCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitpbnQgc2V0dmVyc2lvbiAoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZlcnNpb24pOworCitjb25zdCBjaGFyICplMnBfZmVhdHVyZTJzdHJpbmcoaW50IGNvbXBhdCwgdW5zaWduZWQgaW50IG1hc2spOworaW50IGUycF9zdHJpbmcyZmVhdHVyZShjaGFyICpzdHJpbmcsIGludCAqY29tcGF0LCB1bnNpZ25lZCBpbnQgKm1hc2spOworaW50IGUycF9lZGl0X2ZlYXR1cmUoY29uc3QgY2hhciAqc3RyLCBfX3UzMiAqY29tcGF0X2FycmF5LCBfX3UzMiAqb2tfYXJyYXkpOworCitpbnQgZTJwX2lzX251bGxfdXVpZCh2b2lkICp1dSk7Cit2b2lkIGUycF91dWlkX3RvX3N0cih2b2lkICp1dSwgY2hhciAqb3V0KTsKK2NvbnN0IGNoYXIgKmUycF91dWlkMnN0cih2b2lkICp1dSk7CisKK2NvbnN0IGNoYXIgKmUycF9oYXNoMnN0cmluZyhpbnQgbnVtKTsKK2ludCBlMnBfc3RyaW5nMmhhc2goY2hhciAqc3RyaW5nKTsKKworY29uc3QgY2hhciAqZTJwX21udG9wdDJzdHJpbmcodW5zaWduZWQgaW50IG1hc2spOworaW50IGUycF9zdHJpbmcybW50b3B0KGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50ICptYXNrKTsKK2ludCBlMnBfZWRpdF9tbnRvcHRzKGNvbnN0IGNoYXIgKnN0ciwgX191MzIgKm1udG9wdHMsIF9fdTMyIG9rKTsKKwordW5zaWduZWQgbG9uZyBwYXJzZV9udW1fYmxvY2tzKGNvbnN0IGNoYXIgKmFyZywgaW50IGxvZ19ibG9ja19zaXplKTsKKworY2hhciAqZTJwX29zMnN0cmluZyhpbnQgb3NfdHlwZSk7CitpbnQgZTJwX3N0cmluZzJvcyhjaGFyICpzdHIpOwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZlYXR1cmUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9mZWF0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1NzU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9mZWF0dXJlLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZlYXR1cmUuYyAtLS0gY29udmVydCBiZXR3ZWVuIGZlYXR1cmVzIGFuZCBzdHJpbmdzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBUaGVvZG9yZSBUcydvIDx0eXRzb0BtaXQuZWR1PgorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImUycC5oIgorCitzdHJ1Y3QgZmVhdHVyZSB7CisJaW50CQljb21wYXQ7CisJdW5zaWduZWQgaW50CW1hc2s7CisJY29uc3QgY2hhcgkqc3RyaW5nOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWF0dXJlIGZlYXR1cmVfbGlzdFtdID0geworCXsJRTJQX0ZFQVRVUkVfQ09NUEFULCBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQywKKwkJCSJkaXJfcHJlYWxsb2MiIH0sCisJewlFMlBfRkVBVFVSRV9DT01QQVQsIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwsCisJCQkiaGFzX2pvdXJuYWwiIH0sCisJewlFMlBfRkVBVFVSRV9DT01QQVQsIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUywKKwkJCSJpbWFnaWNfaW5vZGVzIiB9LAorCXsJRTJQX0ZFQVRVUkVfQ09NUEFULCBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSLAorCQkJImV4dF9hdHRyIiB9LAorCXsJRTJQX0ZFQVRVUkVfQ09NUEFULCBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCwKKwkJCSJkaXJfaW5kZXgiIH0sCisJewlFMlBfRkVBVFVSRV9DT01QQVQsIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFLAorCQkJInJlc2l6ZV9pbm9kZSIgfSwKKwl7CUUyUF9GRUFUVVJFX1JPX0lOQ09NUEFULCBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUiwKKwkJCSJzcGFyc2Vfc3VwZXIiIH0sCisJewlFMlBfRkVBVFVSRV9ST19JTkNPTVBBVCwgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFLAorCQkJImxhcmdlX2ZpbGUiIH0sCisJewlFMlBfRkVBVFVSRV9JTkNPTVBBVCwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OLAorCQkJImNvbXByZXNzaW9uIiB9LAorCXsJRTJQX0ZFQVRVUkVfSU5DT01QQVQsIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSwKKwkJCSJmaWxldHlwZSIgfSwKKwl7CUUyUF9GRUFUVVJFX0lOQ09NUEFULCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUiwKKwkJCSJuZWVkc19yZWNvdmVyeSIgfSwKKwl7CUUyUF9GRUFUVVJFX0lOQ09NUEFULCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYsCisJCQkiam91cm5hbF9kZXYiIH0sCisJewlFMlBfRkVBVFVSRV9JTkNPTVBBVCwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMsCisJCQkiZXh0ZW50cyIgfSwKKwl7CUUyUF9GRUFUVVJFX0lOQ09NUEFULCBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRywKKwkJCSJtZXRhX2JnIiB9LAorCXsJMCwgMCwgMCB9LAorfTsKKworY29uc3QgY2hhciAqZTJwX2ZlYXR1cmUyc3RyaW5nKGludCBjb21wYXQsIHVuc2lnbmVkIGludCBtYXNrKQoreworCWNvbnN0IHN0cnVjdCBmZWF0dXJlICpmOworCXN0YXRpYyBjaGFyIGJ1ZlsyMF07CisJY2hhciBmY2hhcjsKKwlpbnQgZm51bTsKKworCWZvciAoZiA9IGZlYXR1cmVfbGlzdDsgZi0+c3RyaW5nOyBmKyspIHsKKwkJaWYgKChjb21wYXQgPT0gZi0+Y29tcGF0KSAmJgorCQkgICAgKG1hc2sgPT0gZi0+bWFzaykpCisJCQlyZXR1cm4gZi0+c3RyaW5nOworCX0KKwlzd2l0Y2ggKGNvbXBhdCkgeworCWNhc2UgRTJQX0ZFQVRVUkVfQ09NUEFUOgorCQlmY2hhciA9ICdDJzsKKwkJYnJlYWs7CisJY2FzZSBFMlBfRkVBVFVSRV9JTkNPTVBBVDoKKwkJZmNoYXIgPSAnSSc7CisJCWJyZWFrOworCWNhc2UgRTJQX0ZFQVRVUkVfUk9fSU5DT01QQVQ6CisJCWZjaGFyID0gJ1InOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmY2hhciA9ICc/JzsKKwkJYnJlYWs7CisJfQorCWZvciAoZm51bSA9IDA7IG1hc2sgPj49IDE7IGZudW0rKyk7CisJCXNwcmludGYoYnVmLCAiRkVBVFVSRV8lYyVkIiwgZmNoYXIsIGZudW0pOworCXJldHVybiBidWY7Cit9CisKK2ludCBlMnBfc3RyaW5nMmZlYXR1cmUoY2hhciAqc3RyaW5nLCBpbnQgKmNvbXBhdF90eXBlLCB1bnNpZ25lZCBpbnQgKm1hc2spCit7CisJY29uc3Qgc3RydWN0IGZlYXR1cmUgKmY7CisJY2hhciAqZXB0cjsKKwlpbnQgbnVtOworCisJZm9yIChmID0gZmVhdHVyZV9saXN0OyBmLT5zdHJpbmc7IGYrKykgeworCQlpZiAoIXN0cmNhc2VjbXAoc3RyaW5nLCBmLT5zdHJpbmcpKSB7CisJCQkqY29tcGF0X3R5cGUgPSBmLT5jb21wYXQ7CisJCQkqbWFzayA9IGYtPm1hc2s7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoc3RybmNhc2VjbXAoc3RyaW5nLCAiRkVBVFVSRV8iLCA4KSkKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKHN0cmluZ1s4XSkgeworCWNhc2UgJ2MnOgorCWNhc2UgJ0MnOgorCQkqY29tcGF0X3R5cGUgPSBFMlBfRkVBVFVSRV9DT01QQVQ7CisJCWJyZWFrOworCWNhc2UgJ2knOgorCWNhc2UgJ0knOgorCQkqY29tcGF0X3R5cGUgPSBFMlBfRkVBVFVSRV9JTkNPTVBBVDsKKwkJYnJlYWs7CisJY2FzZSAncic6CisJY2FzZSAnUic6CisJCSpjb21wYXRfdHlwZSA9IEUyUF9GRUFUVVJFX1JPX0lOQ09NUEFUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisJaWYgKHN0cmluZ1s5XSA9PSAwKQorCQlyZXR1cm4gMTsKKwludW0gPSBzdHJ0b2woc3RyaW5nKzksICZlcHRyLCAxMCk7CisJaWYgKG51bSA+IDMyIHx8IG51bSA8IDApCisJCXJldHVybiAxOworCWlmICgqZXB0cikKKwkJcmV0dXJuIDE7CisJKm1hc2sgPSAxIDw8IG51bTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpza2lwX292ZXJfYmxhbmtzKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgaXNzcGFjZSgqY3ApKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpza2lwX292ZXJfd29yZChjaGFyICpjcCkKK3sKKwl3aGlsZSAoKmNwICYmICFpc3NwYWNlKCpjcCkgJiYgKmNwICE9ICcsJykKKwkJY3ArKzsKKwlyZXR1cm4gY3A7Cit9CisKKy8qCisgKiBFZGl0IGEgZmVhdHVyZSBzZXQgYXJyYXkgYXMgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLiAgVGhlIG9rX2FycmF5LAorICogaWYgc2V0LCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGxpbWl0IHdoYXQgZmVhdHVyZXMgdGhlIHVzZXIgaXMKKyAqIGFsbG93ZWQgdG8gc2V0IG9yIGNsZWFyIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBlMnBfZWRpdF9mZWF0dXJlKGNvbnN0IGNoYXIgKnN0ciwgX191MzIgKmNvbXBhdF9hcnJheSwgX191MzIgKm9rX2FycmF5KQoreworCWNoYXIJKmNwLCAqYnVmLCAqbmV4dDsKKwlpbnQJbmVnOworCXVuc2lnbmVkIGludAltYXNrOworCWludAkJY29tcGF0X3R5cGU7CisKKwlidWYgPSB4c3RyZHVwKHN0cik7CisJY3AgPSBidWY7CisJd2hpbGUgKGNwICYmICpjcCkgeworCQluZWcgPSAwOworCQljcCA9IHNraXBfb3Zlcl9ibGFua3MoY3ApOworCQluZXh0ID0gc2tpcF9vdmVyX3dvcmQoY3ApOworCQlpZiAoKm5leHQgPT0gMCkKKwkJCW5leHQgPSAwOworCQllbHNlCisJCQkqbmV4dCA9IDA7CisJCXN3aXRjaCAoKmNwKSB7CisJCWNhc2UgJy0nOgorCQljYXNlICdeJzoKKwkJCW5lZysrOworCQljYXNlICcrJzoKKwkJCWNwKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZTJwX3N0cmluZzJmZWF0dXJlKGNwLCAmY29tcGF0X3R5cGUsICZtYXNrKSkKKwkJCXJldHVybiAxOworCQlpZiAob2tfYXJyYXkgJiYgIShva19hcnJheVtjb21wYXRfdHlwZV0gJiBtYXNrKSkKKwkJCXJldHVybiAxOworCQlpZiAobmVnKQorCQkJY29tcGF0X2FycmF5W2NvbXBhdF90eXBlXSAmPSB+bWFzazsKKwkJZWxzZQorCQkJY29tcGF0X2FycmF5W2NvbXBhdF90eXBlXSB8PSBtYXNrOworCQljcCA9IG5leHQgPyBuZXh0KzEgOiAwOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9mZ2V0c2V0ZmxhZ3MuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9mZ2V0c2V0ZmxhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhiNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZnZXRzZXRmbGFncy5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZnZXRmbGFncy5jCQktIEdldCBhIGZpbGUgZmxhZ3Mgb24gYW4gZXh0MiBmaWxlIHN5c3RlbQorICogZnNldGZsYWdzLmMJCS0gU2V0IGEgZmlsZSBmbGFncyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMAktIENyZWF0aW9uCisgKi8KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfRVhUMl9JT0NUTFMKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJlMnAuaCIKKworI2lmZGVmIE9fTEFSR0VGSUxFCisjZGVmaW5lIE9QRU5fRkxBR1MgKE9fUkRPTkxZfE9fTk9OQkxPQ0t8T19MQVJHRUZJTEUpCisjZWxzZQorI2RlZmluZSBPUEVOX0ZMQUdTIChPX1JET05MWXxPX05PTkJMT0NLKQorI2VuZGlmCisKK2ludCBmZ2V0c2V0ZmxhZ3MgKGNvbnN0IGNoYXIgKiBuYW1lLCB1bnNpZ25lZCBsb25nICogZ2V0X2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNldF9mbGFncykKK3sKKyNpZmRlZiBIQVZFX0VYVDJfSU9DVExTCisJc3RydWN0IHN0YXQgYnVmOworCWludCBmZCwgciwgZiwgc2F2ZV9lcnJubyA9IDA7CisKKwlpZiAoIXN0YXQobmFtZSwgJmJ1ZikgJiYKKwkgICAgIVNfSVNSRUcoYnVmLnN0X21vZGUpICYmICFTX0lTRElSKGJ1Zi5zdF9tb2RlKSkgeworCQlnb3RvIG5vdHN1cHA7CisJfQorCWZkID0gb3BlbiAobmFtZSwgT1BFTl9GTEFHUyk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKCFnZXRfZmxhZ3MpIHsKKwkJZiA9IChpbnQpIHNldF9mbGFnczsKKwkJciA9IGlvY3RsIChmZCwgRVhUMl9JT0NfU0VURkxBR1MsICZmKTsKKwl9IGVsc2UgeworCQlyID0gaW9jdGwgKGZkLCBFWFQyX0lPQ19HRVRGTEFHUywgJmYpOworCQkqZ2V0X2ZsYWdzID0gZjsKKwl9CisJaWYgKHIgPT0gLTEpCisJCXNhdmVfZXJybm8gPSBlcnJubzsKKwljbG9zZSAoZmQpOworCWlmIChzYXZlX2Vycm5vKQorCQllcnJubyA9IHNhdmVfZXJybm87CisJcmV0dXJuIHI7Citub3RzdXBwOgorI2VuZGlmIC8qIEhBVkVfRVhUMl9JT0NUTFMgKi8KKwllcnJubyA9IEVPUE5PVFNVUFA7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZnZXRzZXR2ZXJzaW9uLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvZmdldHNldHZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDc5MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2ZnZXRzZXR2ZXJzaW9uLmMKQEAgLTAsMCArMSw3MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmdldHZlcnNpb24uYwktIEdldCBhIGZpbGUgdmVyc2lvbiBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKiBmc2V0dmVyc2lvbi5jCS0gU2V0IGEgZmlsZSB2ZXJzaW9uIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMAktIENyZWF0aW9uCisgKi8KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiZTJwLmgiCisKKyNpZmRlZiBPX0xBUkdFRklMRQorI2RlZmluZSBPUEVOX0ZMQUdTIChPX1JET05MWXxPX05PTkJMT0NLfE9fTEFSR0VGSUxFKQorI2Vsc2UKKyNkZWZpbmUgT1BFTl9GTEFHUyAoT19SRE9OTFl8T19OT05CTE9DSykKKyNlbmRpZgorCisvKgorICAgVG8gZG8gZnNldHZlcnNpb246ICAgICB1bnNpZ25lZCBsb25nICpwdHJfdmVyc2lvbiBtdXN0IGJlIHNldCB0byBOVUxMLgorCQkgICAgICBhbmQgdW5zaWduZWQgbG9uZyB2ZXJzaW9uIG11c3QgYmUgc2V0IHRvIGEgdmFsdWUKKyAgIFRvIGRvIGZnZXR2ZXJzaW9uOiAgICAgdW5zaWduZWQgbG9uZyAqcHRyX3ZlcnNpb24gbXVzdCBOT1QgYmUgc2V0IHRvIE5VTEwKKwkJICAgICAgYW5kIHVuc2lnbmVkIGxvbmcgdmVyc2lvbiBpcyBpZ25vcmVkLgorCVRJVE8uCisqLworCitpbnQgZmdldHNldHZlcnNpb24gKGNvbnN0IGNoYXIgKiBuYW1lLCB1bnNpZ25lZCBsb25nICogZ2V0X3ZlcnNpb24sIHVuc2lnbmVkIGxvbmcgc2V0X3ZlcnNpb24pCit7CisjaWZkZWYgSEFWRV9FWFQyX0lPQ1RMUworCWludCBmZCwgciwgdmVyLCBzYXZlX2Vycm5vID0gMDsKKworCWZkID0gb3BlbiAobmFtZSwgT1BFTl9GTEFHUyk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKCFnZXRfdmVyc2lvbikgeworCQl2ZXIgPSAoaW50KSBzZXRfdmVyc2lvbjsKKwkJciA9IGlvY3RsIChmZCwgRVhUMl9JT0NfU0VUVkVSU0lPTiwgJnZlcik7CisJfSBlbHNlIHsKKwkJciA9IGlvY3RsIChmZCwgRVhUMl9JT0NfR0VUVkVSU0lPTiwgJnZlcik7CisJCSpnZXRfdmVyc2lvbiA9IHZlcjsKKwl9CisJaWYgKHIgPT0gLTEpCisJCXNhdmVfZXJybm8gPSBlcnJubzsKKwljbG9zZSAoZmQpOworCWlmIChzYXZlX2Vycm5vKQorCQllcnJubyA9IHNhdmVfZXJybm87CisJcmV0dXJuIHI7CisjZWxzZSAvKiAhIEhBVkVfRVhUMl9JT0NUTFMgKi8KKwllcnJubyA9IEVPUE5PVFNVUFA7CisJcmV0dXJuIC0xOworI2VuZGlmIC8qICEgSEFWRV9FWFQyX0lPQ1RMUyAqLworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2hhc2hzdHIuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9oYXNoc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3ZmZhZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9oYXNoc3RyLmMKQEAgLTAsMCArMSw3MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmVhdHVyZS5jIC0tLSBjb252ZXJ0IGJldHdlZW4gZmVhdHVyZXMgYW5kIHN0cmluZ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZTJwLmgiCisKK3N0cnVjdCBoYXNoIHsKKwlpbnQgbnVtOworCWNvbnN0IGNoYXIgKnN0cmluZzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGFzaCBoYXNoX2xpc3RbXSA9IHsKKwl7IEVYVDJfSEFTSF9MRUdBQ1ksICAgImxlZ2FjeSIgfSwKKwl7IEVYVDJfSEFTSF9IQUxGX01ENCwgImhhbGZfbWQ0IiB9LAorCXsgRVhUMl9IQVNIX1RFQSwgICAgICAidGVhIiB9LAorCXsgMCwgMCB9LAorfTsKKworY29uc3QgY2hhciAqZTJwX2hhc2gyc3RyaW5nKGludCBudW0pCit7CisJY29uc3Qgc3RydWN0IGhhc2ggKnA7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKworCWZvciAocCA9IGhhc2hfbGlzdDsgcC0+c3RyaW5nOyBwKyspIHsKKwkJaWYgKG51bSA9PSBwLT5udW0pCisJCQlyZXR1cm4gcC0+c3RyaW5nOworCX0KKwlzcHJpbnRmKGJ1ZiwgIkhBU0hBTEdfJWQiLCBudW0pOworCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBoYXNoIGFsZ29yaXRobSwgb3IgLTEgb24gZXJyb3IKKyAqLworaW50IGUycF9zdHJpbmcyaGFzaChjaGFyICpzdHJpbmcpCit7CisJY29uc3Qgc3RydWN0IGhhc2ggKnA7CisJY2hhciAqZXB0cjsKKwlpbnQgbnVtOworCisJZm9yIChwID0gaGFzaF9saXN0OyBwLT5zdHJpbmc7IHArKykgeworCQlpZiAoIXN0cmNhc2VjbXAoc3RyaW5nLCBwLT5zdHJpbmcpKSB7CisJCQlyZXR1cm4gcC0+bnVtOworCQl9CisJfQorCWlmIChzdHJuY2FzZWNtcChzdHJpbmcsICJIQVNIQUxHXyIsIDgpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3RyaW5nWzhdID09IDApCisJCXJldHVybiAtMTsKKwludW0gPSBzdHJ0b2woc3RyaW5nKzgsICZlcHRyLCAxMCk7CisJaWYgKG51bSA+IDI1NSB8fCBudW0gPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKCplcHRyKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIG51bTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9pb2QuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9pb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FiOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2lvZC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlvZC5jCQktIEl0ZXJhdGUgYSBmdW5jdGlvbiBvbiBlYWNoIGVudHJ5IG9mIGEgZGlyZWN0b3J5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMC8zMAktIENyZWF0aW9uCisgKi8KKworI2luY2x1ZGUgImUycC5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgaXRlcmF0ZV9vbl9kaXIgKGNvbnN0IGNoYXIgKiBkaXJfbmFtZSwKKwkJICAgIGludCAoKmZ1bmMpIChjb25zdCBjaGFyICosIHN0cnVjdCBkaXJlbnQgKiwgdm9pZCAqKSwKKwkJICAgIHZvaWQgKiBwcml2YXRlKQoreworCURJUiAqIGRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZSwgKmRlcDsKKwlpbnQJbWF4X2xlbiwgbGVuOworCisJbWF4X2xlbiA9IFBBVEhfTUFYICsgc2l6ZW9mKHN0cnVjdCBkaXJlbnQpOworCWRlID0geG1hbGxvYyhtYXhfbGVuKzEpOworCW1lbXNldChkZSwgMCwgbWF4X2xlbisxKTsKKworCWRpciA9IG9wZW5kaXIgKGRpcl9uYW1lKTsKKwlpZiAoZGlyID09IE5VTEwpIHsKKwkJZnJlZShkZSk7CisJCXJldHVybiAtMTsKKwl9CisJd2hpbGUgKChkZXAgPSByZWFkZGlyIChkaXIpKSkgeworCQlsZW4gPSBzaXplb2Yoc3RydWN0IGRpcmVudCk7CisJCWlmIChsZW4gPCBkZXAtPmRfcmVjbGVuKQorCQkJbGVuID0gZGVwLT5kX3JlY2xlbjsKKwkJaWYgKGxlbiA+IG1heF9sZW4pCisJCQlsZW4gPSBtYXhfbGVuOworCQltZW1jcHkoZGUsIGRlcCwgbGVuKTsKKwkJKCpmdW5jKSAoZGlyX25hbWUsIGRlLCBwcml2YXRlKTsKKwl9CisJZnJlZShkZSk7CisJY2xvc2VkaXIoZGlyKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9scy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyOWRiNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9scy5jCkBAIC0wLDAgKzEsMjczIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBscy5jCQkJLSBMaXN0IHRoZSBjb250ZW50cyBvZiBhbiBleHQyZnMgc3VwZXJibG9jaworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCAgUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJLCBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJlMnAuaCIKKworc3RhdGljIHZvaWQgcHJpbnRfdXNlcih1bnNpZ25lZCBzaG9ydCB1aWQsIEZJTEUgKmYpCit7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOworCWZwcmludGYoZiwgIiV1ICh1c2VyICVzKVxuIiwgdWlkLAorCQkJKHB3ID09IE5VTEwgPyAidW5rbm93biIgOiBwdy0+cHdfbmFtZSkpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ncm91cCh1bnNpZ25lZCBzaG9ydCBnaWQsIEZJTEUgKmYpCit7CisJc3RydWN0IGdyb3VwICpnciA9IGdldGdyZ2lkKGdpZCk7CisJZnByaW50ZihmLCAiJXUgKGdyb3VwICVzKVxuIiwgZ2lkLAorCQkJKGdyID09IE5VTEwgPyAidW5rbm93biIgOiBnci0+Z3JfbmFtZSkpOworfQorCisjZGVmaW5lIE1PTlRIX0lOVCAoODY0MDAgKiAzMCkKKyNkZWZpbmUgV0VFS19JTlQgKDg2NDAwICogNykKKyNkZWZpbmUgREFZX0lOVAkoODY0MDApCisjZGVmaW5lIEhPVVJfSU5UICg2MCAqIDYwKQorI2RlZmluZSBNSU5VVEVfSU5UICg2MCkKKworc3RhdGljIGNvbnN0IGNoYXIgKmludGVydmFsX3N0cmluZyh1bnNpZ25lZCBpbnQgc2VjcykKK3sKKwlzdGF0aWMgY2hhciBidWZbMjU2XSwgdG1wWzgwXTsKKwlpbnQJCWhyLCBtaW4sIG51bTsKKworCWJ1ZlswXSA9IDA7CisKKwlpZiAoc2VjcyA9PSAwKQorCQlyZXR1cm4gIjxub25lPiI7CisKKwlpZiAoc2VjcyA+PSBNT05USF9JTlQpIHsKKwkJbnVtID0gc2VjcyAvIE1PTlRIX0lOVDsKKwkJc2VjcyAtPSBudW0qTU9OVEhfSU5UOworCQlzcHJpbnRmKGJ1ZiwgIiVkIG1vbnRoJXMiLCBudW0sIChudW0+MSkgPyAicyIgOiAiIik7CisJfQorCWlmIChzZWNzID49IFdFRUtfSU5UKSB7CisJCW51bSA9IHNlY3MgLyBXRUVLX0lOVDsKKwkJc2VjcyAtPSBudW0qV0VFS19JTlQ7CisJCXNwcmludGYodG1wLCAiJXMlZCB3ZWVrJXMiLCBidWZbMF0gPyAiLCAiIDogIiIsCisJCQludW0sIChudW0+MSkgPyAicyIgOiAiIik7CisJCXN0cmNhdChidWYsIHRtcCk7CisJfQorCWlmIChzZWNzID49IERBWV9JTlQpIHsKKwkJbnVtID0gc2VjcyAvIERBWV9JTlQ7CisJCXNlY3MgLT0gbnVtKkRBWV9JTlQ7CisJCXNwcmludGYodG1wLCAiJXMlZCBkYXklcyIsIGJ1ZlswXSA/ICIsICIgOiAiIiwKKwkJCW51bSwgKG51bT4xKSA/ICJzIiA6ICIiKTsKKwkJc3RyY2F0KGJ1ZiwgdG1wKTsKKwl9CisJaWYgKHNlY3MgPiAwKSB7CisJCWhyID0gc2VjcyAvIEhPVVJfSU5UOworCQlzZWNzIC09IGhyKkhPVVJfSU5UOworCQltaW4gPSBzZWNzIC8gTUlOVVRFX0lOVDsKKwkJc2VjcyAtPSBtaW4qTUlOVVRFX0lOVDsKKwkJc3ByaW50Zih0bXAsICIlcyVkOiUwMmQ6JTAyZCIsIGJ1ZlswXSA/ICIsICIgOiAiIiwKKwkJCWhyLCBtaW4sIHNlY3MpOworCQlzdHJjYXQoYnVmLCB0bXApOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9mZWF0dXJlcyhzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHMsIEZJTEUgKmYpCit7CisjaWZkZWYgRVhUMl9EWU5BTUlDX1JFVgorCWludAlpLCBqLCBwcmludGVkPTA7CisJX191MzIJKm1hc2sgPSAmcy0+c19mZWF0dXJlX2NvbXBhdCwgbTsKKworCWZwcmludGYoZiwgIkZpbGVzeXN0ZW0gZmVhdHVyZXM6ICAgICAiKTsKKwlmb3IgKGk9MDsgaSA8MzsgaSsrLG1hc2srKykgeworCQlmb3IgKGo9MCxtPTE7IGogPCAzMjsgaisrLCBtPDw9MSkgeworCQkJaWYgKCptYXNrICYgbSkgeworCQkJCWZwcmludGYoZiwgIiAlcyIsIGUycF9mZWF0dXJlMnN0cmluZyhpLCBtKSk7CisJCQkJcHJpbnRlZCsrOworCQkJfQorCQl9CisJfQorCWlmIChwcmludGVkID09IDApCisJCWZwcmludGYoZiwgIiAobm9uZSkiKTsKKwlmcHJpbnRmKGYsICJcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHByaW50X21udG9wdHMoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBzLCBGSUxFICpmKQoreworI2lmZGVmIEVYVDJfRFlOQU1JQ19SRVYKKwlpbnQJaSwgcHJpbnRlZD0wOworCV9fdTMyCW1hc2sgPSBzLT5zX2RlZmF1bHRfbW91bnRfb3B0cywgbTsKKworCWZwcmludGYoZiwgIkRlZmF1bHQgbW91bnQgb3B0aW9uczogICAiKTsKKwlpZiAobWFzayAmIEVYVDNfREVGTV9KTU9ERSkgeworCQlmcHJpbnRmKGYsICIgJXMiLCBlMnBfbW50b3B0MnN0cmluZyhtYXNrICYgRVhUM19ERUZNX0pNT0RFKSk7CisJCXByaW50ZWQrKzsKKwl9CisJZm9yIChpPTAsbT0xOyBpIDwgMzI7IGkrKywgbTw8PTEpIHsKKwkJaWYgKG0gJiBFWFQzX0RFRk1fSk1PREUpCisJCQljb250aW51ZTsKKwkJaWYgKG1hc2sgJiBtKSB7CisJCQlmcHJpbnRmKGYsICIgJXMiLCBlMnBfbW50b3B0MnN0cmluZyhtKSk7CisJCQlwcmludGVkKys7CisJCX0KKwl9CisJaWYgKHByaW50ZWQgPT0gMCkKKwkJZnByaW50ZihmLCAiIChub25lKSIpOworCWZwcmludGYoZiwgIlxuIik7CisjZW5kaWYKK30KKworCisjaWZuZGVmIEVYVDJfSU5PREVfU0laRQorI2RlZmluZSBFWFQyX0lOT0RFX1NJWkUocykgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKQorI2VuZGlmCisKKyNpZm5kZWYgRVhUMl9HT09EX09MRF9SRVYKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9SRVYgMAorI2VuZGlmCisKK3ZvaWQgbGlzdF9zdXBlcjIoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBzYiwgRklMRSAqZikKK3sKKwlpbnQgaW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKwljaGFyIGJ1Zls4MF0sICpzdHI7CisJdGltZV90CXRtOworCisJaW5vZGVfYmxvY2tzX3Blcl9ncm91cCA9ICgoKHNiLT5zX2lub2Rlc19wZXJfZ3JvdXAgKgorCQkJCSAgICBFWFQyX0lOT0RFX1NJWkUoc2IpKSArCisJCQkJICAgRVhUMl9CTE9DS19TSVpFKHNiKSAtIDEpIC8KKwkJCQkgIEVYVDJfQkxPQ0tfU0laRShzYikpOworCWlmIChzYi0+c192b2x1bWVfbmFtZVswXSkgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXN0cm5jcHkoYnVmLCBzYi0+c192b2x1bWVfbmFtZSwgc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSk7CisJfSBlbHNlCisJCXN0cmNweShidWYsICI8bm9uZT4iKTsKKwlmcHJpbnRmKGYsICJGaWxlc3lzdGVtIHZvbHVtZSBuYW1lOiAgICVzXG4iLCBidWYpOworCWlmIChzYi0+c19sYXN0X21vdW50ZWRbMF0pIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQlzdHJuY3B5KGJ1Ziwgc2ItPnNfbGFzdF9tb3VudGVkLCBzaXplb2Yoc2ItPnNfbGFzdF9tb3VudGVkKSk7CisJfSBlbHNlCisJCXN0cmNweShidWYsICI8bm90IGF2YWlsYWJsZT4iKTsKKwlmcHJpbnRmKGYsCisJCSJMYXN0IG1vdW50ZWQgb246ICAgICAgICAgICVzXG4iCisJCSJGaWxlc3lzdGVtIFVVSUQ6ICAgICAgICAgICVzXG4iCisJCSJGaWxlc3lzdGVtIG1hZ2ljIG51bWJlcjogIDB4JTA0WFxuIgorCQkiRmlsZXN5c3RlbSByZXZpc2lvbiAjOiAgICAlZCIsCisJCWJ1ZiwgZTJwX3V1aWQyc3RyKHNiLT5zX3V1aWQpLCBzYi0+c19tYWdpYywgc2ItPnNfcmV2X2xldmVsKTsKKwlpZiAoc2ItPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSB7CisJCWZwcmludGYoZiwgIiAob3JpZ2luYWwpXG4iKTsKKyNpZmRlZiBFWFQyX0RZTkFNSUNfUkVWCisJfSBlbHNlIGlmIChzYi0+c19yZXZfbGV2ZWwgPT0gRVhUMl9EWU5BTUlDX1JFVikgeworCQlmcHJpbnRmKGYsICIgKGR5bmFtaWMpXG4iKTsKKyNlbmRpZgorCX0gZWxzZQorCQlmcHJpbnRmKGYsICIgKHVua25vd24pXG4iKTsKKwlwcmludF9mZWF0dXJlcyhzYiwgZik7CisJcHJpbnRfbW50b3B0cyhzYiwgZik7CisJZnByaW50ZihmLCAiRmlsZXN5c3RlbSBzdGF0ZTogICAgICAgICIpOworCXByaW50X2ZzX3N0YXRlIChmLCBzYi0+c19zdGF0ZSk7CisJZnByaW50ZihmLCAiXG5FcnJvcnMgYmVoYXZpb3I6ICAgICAgICAgICIpOworCXByaW50X2ZzX2Vycm9ycyhmLCBzYi0+c19lcnJvcnMpOworCXN0ciA9IGUycF9vczJzdHJpbmcoc2ItPnNfY3JlYXRvcl9vcyk7CisJZnByaW50ZihmLAorCQkiXG4iCisJCSJGaWxlc3lzdGVtIE9TIHR5cGU6ICAgICAgICVzXG4iCisJCSJJbm9kZSBjb3VudDogICAgICAgICAgICAgICV1XG4iCisJCSJCbG9jayBjb3VudDogICAgICAgICAgICAgICV1XG4iCisJCSJSZXNlcnZlZCBibG9jayBjb3VudDogICAgICV1XG4iCisJCSJGcmVlIGJsb2NrczogICAgICAgICAgICAgICV1XG4iCisJCSJGcmVlIGlub2RlczogICAgICAgICAgICAgICV1XG4iCisJCSJGaXJzdCBibG9jazogICAgICAgICAgICAgICV1XG4iCisJCSJCbG9jayBzaXplOiAgICAgICAgICAgICAgICV1XG4iCisJCSJGcmFnbWVudCBzaXplOiAgICAgICAgICAgICV1XG4iLAorCQlzdHIsIHNiLT5zX2lub2Rlc19jb3VudCwgc2ItPnNfYmxvY2tzX2NvdW50LCBzYi0+c19yX2Jsb2Nrc19jb3VudCwKKwkJc2ItPnNfZnJlZV9ibG9ja3NfY291bnQsIHNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50LAorCQlzYi0+c19maXJzdF9kYXRhX2Jsb2NrLCBFWFQyX0JMT0NLX1NJWkUoc2IpLCBFWFQyX0ZSQUdfU0laRShzYikpOworCWZyZWUoc3RyKTsKKwlpZiAoc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykKKwkJZnByaW50ZihmLCAiUmVzZXJ2ZWQgR0RUIGJsb2NrczogICAgICAldVxuIiwKKwkJCXNiLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpOworCWZwcmludGYoZiwKKwkJIkJsb2NrcyBwZXIgZ3JvdXA6ICAgICAgICAgJXVcbiIKKwkJIkZyYWdtZW50cyBwZXIgZ3JvdXA6ICAgICAgJXVcbiIKKwkJIklub2RlcyBwZXIgZ3JvdXA6ICAgICAgICAgJXVcbiIKKwkJIklub2RlIGJsb2NrcyBwZXIgZ3JvdXA6ICAgJXVcbiIsCisJCXNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXAsIHNiLT5zX2ZyYWdzX3Blcl9ncm91cCwKKwkJc2ItPnNfaW5vZGVzX3Blcl9ncm91cCwgaW5vZGVfYmxvY2tzX3Blcl9ncm91cCk7CisJaWYgKHNiLT5zX2ZpcnN0X21ldGFfYmcpCisJCWZwcmludGYoZiwgIkZpcnN0IG1ldGEgYmxvY2sgZ3JvdXA6ICAgJXVcbiIsCisJCQlzYi0+c19maXJzdF9tZXRhX2JnKTsKKwlpZiAoc2ItPnNfbWtmc190aW1lKSB7CisJCXRtID0gc2ItPnNfbWtmc190aW1lOworCQlmcHJpbnRmKGYsICJGaWxlc3lzdGVtIGNyZWF0ZWQ6ICAgICAgICVzIiwgY3RpbWUoJnRtKSk7CisJfQorCXRtID0gc2ItPnNfbXRpbWU7CisJZnByaW50ZihmLCAiTGFzdCBtb3VudCB0aW1lOiAgICAgICAgICAlcyIsCisJCXNiLT5zX210aW1lID8gY3RpbWUoJnRtKSA6ICJuL2FcbiIpOworCXRtID0gc2ItPnNfd3RpbWU7CisJZnByaW50ZihmLAorCQkiTGFzdCB3cml0ZSB0aW1lOiAgICAgICAgICAlcyIKKwkJIk1vdW50IGNvdW50OiAgICAgICAgICAgICAgJXVcbiIKKwkJIk1heGltdW0gbW91bnQgY291bnQ6ICAgICAgJWRcbiIsCisJCWN0aW1lKCZ0bSksIHNiLT5zX21udF9jb3VudCwgc2ItPnNfbWF4X21udF9jb3VudCk7CisJdG0gPSBzYi0+c19sYXN0Y2hlY2s7CisJZnByaW50ZihmLAorCQkiTGFzdCBjaGVja2VkOiAgICAgICAgICAgICAlcyIKKwkJIkNoZWNrIGludGVydmFsOiAgICAgICAgICAgJXUgKCVzKVxuIiwKKwkJY3RpbWUoJnRtKSwKKwkJc2ItPnNfY2hlY2tpbnRlcnZhbCwgaW50ZXJ2YWxfc3RyaW5nKHNiLT5zX2NoZWNraW50ZXJ2YWwpKTsKKwlpZiAoc2ItPnNfY2hlY2tpbnRlcnZhbCkKKwl7CisJCXRpbWVfdCBuZXh0OworCisJCW5leHQgPSBzYi0+c19sYXN0Y2hlY2sgKyBzYi0+c19jaGVja2ludGVydmFsOworCQlmcHJpbnRmKGYsICJOZXh0IGNoZWNrIGFmdGVyOiAgICAgICAgICVzIiwgY3RpbWUoJm5leHQpKTsKKwl9CisJZnByaW50ZihmLCAiUmVzZXJ2ZWQgYmxvY2tzIHVpZDogICAgICAiKTsKKwlwcmludF91c2VyKHNiLT5zX2RlZl9yZXN1aWQsIGYpOworCWZwcmludGYoZiwgIlJlc2VydmVkIGJsb2NrcyBnaWQ6ICAgICAgIik7CisJcHJpbnRfZ3JvdXAoc2ItPnNfZGVmX3Jlc2dpZCwgZik7CisJaWYgKHNiLT5zX3Jldl9sZXZlbCA+PSBFWFQyX0RZTkFNSUNfUkVWKSB7CisJCWZwcmludGYoZiwKKwkJCSJGaXJzdCBpbm9kZTogICAgICAgICAgICAgICVkXG4iCisJCQkiSW5vZGUgc2l6ZToJCSAgJWRcbiIsCisJCQlzYi0+c19maXJzdF9pbm8sIHNiLT5zX2lub2RlX3NpemUpOworCX0KKwlpZiAoIWUycF9pc19udWxsX3V1aWQoc2ItPnNfam91cm5hbF91dWlkKSkKKwkJZnByaW50ZihmLCAiSm91cm5hbCBVVUlEOiAgICAgICAgICAgICAlc1xuIiwKKwkJCWUycF91dWlkMnN0cihzYi0+c19qb3VybmFsX3V1aWQpKTsKKwlpZiAoc2ItPnNfam91cm5hbF9pbnVtKQorCQlmcHJpbnRmKGYsICJKb3VybmFsIGlub2RlOiAgICAgICAgICAgICV1XG4iLAorCQkJc2ItPnNfam91cm5hbF9pbnVtKTsKKwlpZiAoc2ItPnNfam91cm5hbF9kZXYpCisJCWZwcmludGYoZiwgIkpvdXJuYWwgZGV2aWNlOgkgICAgICAgICAgMHglMDR4XG4iLAorCQkJc2ItPnNfam91cm5hbF9kZXYpOworCWlmIChzYi0+c19sYXN0X29ycGhhbikKKwkJZnByaW50ZihmLCAiRmlyc3Qgb3JwaGFuIGlub2RlOiAgICAgICAldVxuIiwKKwkJCXNiLT5zX2xhc3Rfb3JwaGFuKTsKKwlpZiAoKHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpIHx8CisJICAgIHNiLT5zX2RlZl9oYXNoX3ZlcnNpb24pCisJCWZwcmludGYoZiwgIkRlZmF1bHQgZGlyZWN0b3J5IGhhc2g6ICAgJXNcbiIsCisJCQllMnBfaGFzaDJzdHJpbmcoc2ItPnNfZGVmX2hhc2hfdmVyc2lvbikpOworCWlmICghZTJwX2lzX251bGxfdXVpZChzYi0+c19oYXNoX3NlZWQpKQorCQlmcHJpbnRmKGYsICJEaXJlY3RvcnkgSGFzaCBTZWVkOiAgICAgICVzXG4iLAorCQkJZTJwX3V1aWQyc3RyKHNiLT5zX2hhc2hfc2VlZCkpOworCWlmIChzYi0+c19qbmxfYmFja3VwX3R5cGUpIHsKKwkJZnByaW50ZihmLCAiSm91cm5hbCBiYWNrdXA6ICAgICAgICAgICAiKTsKKwkJaWYgKHNiLT5zX2pubF9iYWNrdXBfdHlwZSA9PSAxKQorCQkJZnByaW50ZihmLCAiaW5vZGUgYmxvY2tzXG4iKTsKKwkJZWxzZQorCQkJZnByaW50ZihmLCAidHlwZSAldVxuIiwgc2ItPnNfam5sX2JhY2t1cF90eXBlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvbW50b3B0cy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL21udG9wdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2MyNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL21udG9wdHMuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbW91bnRvcHRzLmMgLS0tIGNvbnZlcnQgYmV0d2VlbiBkZWZhdWx0IG1vdW50IG9wdGlvbnMgYW5kIHN0cmluZ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZTJwLmgiCisKK3N0cnVjdCBtbnRvcHQgeworCXVuc2lnbmVkIGludAltYXNrOworCWNvbnN0IGNoYXIJKnN0cmluZzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW50b3B0IG1udG9wdF9saXN0W10gPSB7CisJeyBFWFQyX0RFRk1fREVCVUcsCSJkZWJ1ZyIgfSwKKwl7IEVYVDJfREVGTV9CU0RHUk9VUFMsCSJic2Rncm91cHMiIH0sCisJeyBFWFQyX0RFRk1fWEFUVFJfVVNFUiwJInVzZXJfeGF0dHIiIH0sCisJeyBFWFQyX0RFRk1fQUNMLAkiYWNsIiB9LAorCXsgRVhUMl9ERUZNX1VJRDE2LAkidWlkMTYiIH0sCisJeyBFWFQzX0RFRk1fSk1PREVfREFUQSwgImpvdXJuYWxfZGF0YSIgfSwKKwl7IEVYVDNfREVGTV9KTU9ERV9PUkRFUkVELCAiam91cm5hbF9kYXRhX29yZGVyZWQiIH0sCisJeyBFWFQzX0RFRk1fSk1PREVfV0JBQ0ssICJqb3VybmFsX2RhdGFfd3JpdGViYWNrIiB9LAorCXsgMCwgMCB9LAorfTsKKworY29uc3QgY2hhciAqZTJwX21udG9wdDJzdHJpbmcodW5zaWduZWQgaW50IG1hc2spCit7CisJY29uc3Qgc3RydWN0IG1udG9wdCAgKmY7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKwlpbnQJZm51bTsKKworCWZvciAoZiA9IG1udG9wdF9saXN0OyBmLT5zdHJpbmc7IGYrKykgeworCQlpZiAobWFzayA9PSBmLT5tYXNrKQorCQkJcmV0dXJuIGYtPnN0cmluZzsKKwl9CisJZm9yIChmbnVtID0gMDsgbWFzayA+Pj0gMTsgZm51bSsrKTsKKwlzcHJpbnRmKGJ1ZiwgIk1OVE9QVF8lZCIsIGZudW0pOworCXJldHVybiBidWY7Cit9CisKK2ludCBlMnBfc3RyaW5nMm1udG9wdChjaGFyICpzdHJpbmcsIHVuc2lnbmVkIGludCAqbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgbW50b3B0ICAqZjsKKwljaGFyCQkqZXB0cjsKKwlpbnQJCW51bTsKKworCWZvciAoZiA9IG1udG9wdF9saXN0OyBmLT5zdHJpbmc7IGYrKykgeworCQlpZiAoIXN0cmNhc2VjbXAoc3RyaW5nLCBmLT5zdHJpbmcpKSB7CisJCQkqbWFzayA9IGYtPm1hc2s7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoc3RybmNhc2VjbXAoc3RyaW5nLCAiTU5UT1BUXyIsIDgpKQorCQlyZXR1cm4gMTsKKworCWlmIChzdHJpbmdbOF0gPT0gMCkKKwkJcmV0dXJuIDE7CisJbnVtID0gc3RydG9sKHN0cmluZys4LCAmZXB0ciwgMTApOworCWlmIChudW0gPiAzMiB8fCBudW0gPCAwKQorCQlyZXR1cm4gMTsKKwlpZiAoKmVwdHIpCisJCXJldHVybiAxOworCSptYXNrID0gMSA8PCBudW07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpza2lwX292ZXJfYmxhbmtzKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgaXNzcGFjZSgqY3ApKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworc3RhdGljIGNoYXIgKnNraXBfb3Zlcl93b3JkKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgIWlzc3BhY2UoKmNwKSAmJiAqY3AgIT0gJywnKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworLyoKKyAqIEVkaXQgYSBtbnRvcHQgc2V0IGFycmF5IGFzIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gIFRoZSBvaworICogcGFyYW1ldGVyLCBpZiBub24temVybywgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBsaW1pdCB3aGF0CisgKiBtbnRvcHRzIHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gc2V0IG9yIGNsZWFyIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBlMnBfZWRpdF9tbnRvcHRzKGNvbnN0IGNoYXIgKnN0ciwgX191MzIgKm1udG9wdHMsIF9fdTMyIG9rKQoreworCWNoYXIJKmNwLCAqYnVmLCAqbmV4dDsKKwlpbnQJbmVnOworCXVuc2lnbmVkIGludAltYXNrOworCisJYnVmID0geHN0cmR1cChzdHIpOworCWNwID0gYnVmOworCXdoaWxlIChjcCAmJiAqY3ApIHsKKwkJbmVnID0gMDsKKwkJY3AgPSBza2lwX292ZXJfYmxhbmtzKGNwKTsKKwkJbmV4dCA9IHNraXBfb3Zlcl93b3JkKGNwKTsKKwkJaWYgKCpuZXh0ID09IDApCisJCQluZXh0ID0gMDsKKwkJZWxzZQorCQkJKm5leHQgPSAwOworCQlzd2l0Y2ggKCpjcCkgeworCQljYXNlICctJzoKKwkJY2FzZSAnXic6CisJCQluZWcrKzsKKwkJY2FzZSAnKyc6CisJCQljcCsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUycF9zdHJpbmcybW50b3B0KGNwLCAmbWFzaykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG9rICYmICEob2sgJiBtYXNrKSkKKwkJCXJldHVybiAxOworCQlpZiAobWFzayAmIEVYVDNfREVGTV9KTU9ERSkKKwkJCSptbnRvcHRzICY9IH5FWFQzX0RFRk1fSk1PREU7CisJCWlmIChuZWcpCisJCQkqbW50b3B0cyAmPSB+bWFzazsKKwkJZWxzZQorCQkJKm1udG9wdHMgfD0gbWFzazsKKwkJY3AgPSBuZXh0ID8gbmV4dCsxIDogMDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvb3N0eXBlLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvb3N0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZjE3OAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9vc3R5cGUuYwpAQCAtMCwwICsxLDcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZXRvc3R5cGUuYyAgICAgICAgICAtIEdldCB0aGUgRmlsZXN5c3RlbSBPUyB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisjaW5jbHVkZSAiZTJwLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBvc190YWJbXSA9CisJeyAiTGludXgiLAorCSAgIkh1cmQiLAorCSAgIk1hc2l4IiwKKwkgICJGcmVlQlNEIiwKKwkgICJMaXRlcyIsCisJICAwIH07CisKKy8qCisgKiBDb252ZXJ0IGFuIG9zX3R5cGUgdG8gYSBzdHJpbmcKKyAqLworY2hhciAqZTJwX29zMnN0cmluZyhpbnQgb3NfdHlwZSkKK3sKKwljb25zdCBjaGFyICpvczsKKwljaGFyICpyZXQ7CisKKwlpZiAob3NfdHlwZSA8PSBFWFQyX09TX0xJVEVTKQorCQlvcyA9IG9zX3RhYltvc190eXBlXTsKKwllbHNlCisJCW9zID0gIih1bmtub3duIG9zKSI7CisKKwlyZXQgPSB4c3RyZHVwKG9zKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29udmVydCBhbiBvc190eXBlIHRvIGEgc3RyaW5nCisgKi8KK2ludCBlMnBfc3RyaW5nMm9zKGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpjb25zdCAqY3BwOworCWludCBpID0gMDsKKworCWZvciAoY3BwID0gb3NfdGFiOyAqY3BwOyBjcHArKywgaSsrKSB7CisJCWlmICghc3RyY2FzZWNtcChzdHIsICpjcHApKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworI2lmZGVmIFRFU1RfUFJPR1JBTQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIJKnM7CisJaW50CWksIG9zOworCisJZm9yIChpPTA7IGkgPD0gRVhUMl9PU19MSVRFUzsgaSsrKSB7CisJCXMgPSBlMnBfb3Myc3RyaW5nKGkpOworCQlvcyA9IGUycF9zdHJpbmcyb3Mocyk7CisJCXByaW50ZigiJWQ6ICVzICglZClcbiIsIGksIHMsIG9zKTsKKwkJaWYgKGkgIT0gb3MpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbHVyZSFcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwlleGl0KDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGFyc2VfbnVtLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGFyc2VfbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiMDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wYXJzZV9udW0uYwpAQCAtMCwwICsxLDY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwYXJzZV9udW0uYwkJLSBQYXJzZSB0aGUgbnVtYmVyIG9mIGJsb2NrcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBUaGVvZG9yZSBUcydvIDx0eXRzb0BtaXQuZWR1PgorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworI2luY2x1ZGUgImUycC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3Vuc2lnbmVkIGxvbmcgcGFyc2VfbnVtX2Jsb2Nrcyhjb25zdCBjaGFyICphcmcsIGludCBsb2dfYmxvY2tfc2l6ZSkKK3sKKwljaGFyICpwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBudW07CisKKwludW0gPSBzdHJ0b3VsbChhcmcsICZwLCAwKTsKKworCWlmIChwWzBdICYmIHBbMV0pCisJCXJldHVybiAwOworCisJc3dpdGNoICgqcCkgewkJLyogVXNpbmcgZmFsbC10aHJvdWdoIGxvZ2ljICovCisJY2FzZSAnVCc6IGNhc2UgJ3QnOgorCQludW0gPDw9IDEwOworCWNhc2UgJ0cnOiBjYXNlICdnJzoKKwkJbnVtIDw8PSAxMDsKKwljYXNlICdNJzogY2FzZSAnbSc6CisJCW51bSA8PD0gMTA7CisJY2FzZSAnSyc6IGNhc2UgJ2snOgorCQludW0gPj49IGxvZ19ibG9ja19zaXplOworCQlicmVhazsKKwljYXNlICdzJzoKKwkJbnVtID4+PSAxOworCQlicmVhazsKKwljYXNlICdcMCc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gbnVtOworfQorCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIG51bTsKKwlpbnQgbG9nX2Jsb2NrX3NpemUgPSAwOworCisJaWYgKGFyZ2MgIT0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBhcmdcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCW51bSA9IHBhcnNlX251bV9ibG9ja3MoYXJndlsxXSwgbG9nX2Jsb2NrX3NpemUpOworCisJcHJpbnRmKCJQYXJzZWQgbnVtYmVyOiAlbHVcbiIsIG51bSk7CisJZXhpdCgwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3BlLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUyNzRiCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3BlLmMKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGUuYwkJCS0gUHJpbnQgYSBzZWNvbmQgZXh0ZW5kZWQgZmlsZXN5c3RlbSBlcnJvcnMgYmVoYXZpb3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQgIFJlbXkgQ2FyZCA8Y2FyZEBtYXNpLmlicC5mcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSwgSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDk0LzAxLzA5CS0gQ3JlYXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImUycC5oIgorCit2b2lkIHByaW50X2ZzX2Vycm9ycyhGSUxFICpmLCB1bnNpZ25lZCBzaG9ydCBlcnJvcnMpCit7CisJY2hhciAqZGlzcCA9IE5VTEw7CisJc3dpdGNoIChlcnJvcnMpIHsKKwljYXNlIEVYVDJfRVJST1JTX0NPTlRJTlVFOiBkaXNwID0gIkNvbnRpbnVlIjsgYnJlYWs7CisJY2FzZSBFWFQyX0VSUk9SU19STzogICAgICAgZGlzcCA9ICJSZW1vdW50IHJlYWQtb25seSI7IGJyZWFrOworCWNhc2UgRVhUMl9FUlJPUlNfUEFOSUM6ICAgIGRpc3AgPSAiUGFuaWMiOyBicmVhazsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICBkaXNwID0gIlVua25vd24gKGNvbnRpbnVlKSI7CisJfQorCWZwcmludGYoZiwgZGlzcCk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGYuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2JlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcGYuYwpAQCAtMCwwICsxLDc0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwZi5jCQkJLSBQcmludCBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCAgUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJLCBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTMvMTAvMzAJLSBDcmVhdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZTJwLmgiCisKK3N0cnVjdCBmbGFnc19uYW1lIHsKKwl1bnNpZ25lZCBsb25nCWZsYWc7CisJY29uc3QgY2hhcgkqc2hvcnRfbmFtZTsKKwljb25zdCBjaGFyCSpsb25nX25hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZsYWdzX25hbWUgZmxhZ3NfYXJyYXlbXSA9IHsKKwl7IEVYVDJfU0VDUk1fRkwsICJzIiwgIlNlY3VyZV9EZWxldGlvbiIgfSwKKwl7IEVYVDJfVU5STV9GTCwgInUiICwgIlVuZGVsZXRlIiB9LAorCXsgRVhUMl9TWU5DX0ZMLCAiUyIsICJTeW5jaHJvbm91c19VcGRhdGVzIiB9LAorCXsgRVhUMl9ESVJTWU5DX0ZMLCAiRCIsICJTeW5jaHJvbm91c19EaXJlY3RvcnlfVXBkYXRlcyIgfSwKKwl7IEVYVDJfSU1NVVRBQkxFX0ZMLCAiaSIsICJJbW11dGFibGUiIH0sCisJeyBFWFQyX0FQUEVORF9GTCwgImEiLCAiQXBwZW5kX09ubHkiIH0sCisJeyBFWFQyX05PRFVNUF9GTCwgImQiLCAiTm9fRHVtcCIgfSwKKwl7IEVYVDJfTk9BVElNRV9GTCwgIkEiLCAiTm9fQXRpbWUiIH0sCisJeyBFWFQyX0NPTVBSX0ZMLCAiYyIsICJDb21wcmVzc2lvbl9SZXF1ZXN0ZWQiIH0sCisjaWZkZWYgRU5BQkxFX0NPTVBSRVNTSU9OCisJeyBFWFQyX0NPTVBSQkxLX0ZMLCAiQiIsICJDb21wcmVzc2VkX0ZpbGUiIH0sCisJeyBFWFQyX0RJUlRZX0ZMLCAiWiIsICJDb21wcmVzc2VkX0RpcnR5X0ZpbGUiIH0sCisJeyBFWFQyX05PQ09NUFJfRkwsICJYIiwgIkNvbXByZXNzaW9uX1Jhd19BY2Nlc3MiIH0sCisJeyBFWFQyX0VDT01QUl9GTCwgIkUiLCAiQ29tcHJlc3Npb25fRXJyb3IiIH0sCisjZW5kaWYKKwl7IEVYVDNfSk9VUk5BTF9EQVRBX0ZMLCAiaiIsICJKb3VybmFsZWRfRGF0YSIgfSwKKwl7IEVYVDJfSU5ERVhfRkwsICJJIiwgIkluZGV4ZWRfZGlyZWNjdG9yeSIgfSwKKwl7IEVYVDJfTk9UQUlMX0ZMLCAidCIsICJOb19UYWlsbWVyZ2luZyIgfSwKKwl7IEVYVDJfVE9QRElSX0ZMLCAiVCIsICJUb3Bfb2ZfRGlyZWN0b3J5X0hpZXJhcmNoaWVzIiB9LAorCXsgMCwgTlVMTCwgTlVMTCB9Cit9OworCit2b2lkIHByaW50X2ZsYWdzIChGSUxFICpmLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBvcHRpb25zKQoreworCWludCBsb25nX29wdCA9IChvcHRpb25zICYgUEZPUFRfTE9ORyk7CisJY29uc3Qgc3RydWN0IGZsYWdzX25hbWUgKmZwOworCWludAlmaXJzdCA9IDE7CisKKwlmb3IgKGZwID0gZmxhZ3NfYXJyYXk7IGZwLT5mbGFnICE9IDA7IGZwKyspIHsKKwkJaWYgKGZsYWdzICYgZnAtPmZsYWcpIHsKKwkJCWlmIChsb25nX29wdCkgeworCQkJCWlmIChmaXJzdCkKKwkJCQkJZmlyc3QgPSAwOworCQkJCWVsc2UKKwkJCQkJZnB1dHMoIiwgIiwgZik7CisJCQkJZnB1dHMoZnAtPmxvbmdfbmFtZSwgZik7CisJCQl9IGVsc2UKKwkJCQlmcHV0cyhmcC0+c2hvcnRfbmFtZSwgZik7CisJCX0gZWxzZSB7CisJCQlpZiAoIWxvbmdfb3B0KQorCQkJCWZwdXRzKCItIiwgZik7CisJCX0KKwl9CisJaWYgKGxvbmdfb3B0ICYmIGZpcnN0KQorCQlmcHV0cygiLS0tIiwgZik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcHMuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjQwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9lMnAvcHMuYwpAQCAtMCwwICsxLDI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwcy5jCQkJLSBQcmludCBmaWxlc3lzdGVtIHN0YXRlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlCisgKi8KKworLyoKKyAqIEhpc3Rvcnk6CisgKiA5My8xMi8yMgktIENyZWF0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJlMnAuaCIKKwordm9pZCBwcmludF9mc19zdGF0ZShGSUxFICpmLCB1bnNpZ25lZCBzaG9ydCBzdGF0ZSkKK3sKKwlmcHJpbnRmKGYsIChzdGF0ZSAmIEVYVDJfVkFMSURfRlMgPyAiIGNsZWFuIiA6ICIgbm90IGNsZWFuIikpOworCWlmIChzdGF0ZSAmIEVYVDJfRVJST1JfRlMpCisJCWZwcmludGYoZiwgIiB3aXRoIGVycm9ycyIpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL3V1aWQuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC91dWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0ZDY0YQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC91dWlkLmMKQEAgLTAsMCArMSw3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdXVpZC5jIC0tIHV0aWxpdHkgcm91dGluZXMgZm9yIG1hbmlwdWxhdGluZyBVVUlEJ3MuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiLi4vZXh0MmZzL2V4dDJfdHlwZXMuaCIKKworI2luY2x1ZGUgImUycC5oIgorCitzdHJ1Y3QgdXVpZCB7CisJX191MzIJdGltZV9sb3c7CisJX191MTYJdGltZV9taWQ7CisJX191MTYJdGltZV9oaV9hbmRfdmVyc2lvbjsKKwlfX3UxNgljbG9ja19zZXE7CisJX191OAlub2RlWzZdOworfTsKKworLyogUmV0dXJucyAxIGlmIHRoZSB1dWlkIGlzIHRoZSBOVUxMIHV1aWQgKi8KK2ludCBlMnBfaXNfbnVsbF91dWlkKHZvaWQgKnV1KQoreworCV9fdTgJKmNwOworCWludAlpOworCisJZm9yIChpPTAsIGNwID0gdXU7IGkgPCAxNjsgaSsrKQorCQlpZiAoKmNwKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGUycF91bnBhY2tfdXVpZCh2b2lkICppbiwgc3RydWN0IHV1aWQgKnV1KQoreworCV9fdTgJKnB0ciA9IGluOworCV9fdTMyCXRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+dGltZV9sb3cgPSB0bXA7CisKKwl0bXAgPSAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+dGltZV9taWQgPSB0bXA7CisKKwl0bXAgPSAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+dGltZV9oaV9hbmRfdmVyc2lvbiA9IHRtcDsKKworCXRtcCA9ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXV1LT5jbG9ja19zZXEgPSB0bXA7CisKKwltZW1jcHkodXUtPm5vZGUsIHB0ciwgNik7Cit9CisKK3ZvaWQgZTJwX3V1aWRfdG9fc3RyKHZvaWQgKnV1LCBjaGFyICpvdXQpCit7CisJc3RydWN0IHV1aWQgdXVpZDsKKworCWUycF91bnBhY2tfdXVpZCh1dSwgJnV1aWQpOworCXNwcmludGYob3V0LAorCQkiJTA4eC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJdXVpZC50aW1lX2xvdywgdXVpZC50aW1lX21pZCwgdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uLAorCQl1dWlkLmNsb2NrX3NlcSA+PiA4LCB1dWlkLmNsb2NrX3NlcSAmIDB4RkYsCisJCXV1aWQubm9kZVswXSwgdXVpZC5ub2RlWzFdLCB1dWlkLm5vZGVbMl0sCisJCXV1aWQubm9kZVszXSwgdXVpZC5ub2RlWzRdLCB1dWlkLm5vZGVbNV0pOworfQorCitjb25zdCBjaGFyICplMnBfdXVpZDJzdHIodm9pZCAqdXUpCit7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKwlpZiAoZTJwX2lzX251bGxfdXVpZCh1dSkpCisJCXJldHVybiAiPG5vbmU+IjsKKwllMnBfdXVpZF90b19zdHIodXUsIGJ1Zik7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9LYnVpbGQuc3JjIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZGM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMjYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitORUVERUQtJChDT05GSUdfRTJGU0NLKSA9IHkKK05FRURFRC0kKENPTkZJR19GU0NLKSA9IHkKK05FRURFRC0kKENPTkZJR19NS0UyRlMpID0geQorTkVFREVELSQoQ09ORklHX1RVTkUyRlMpID0geQorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWItJChORUVERUQteSkgKz0gZ2VuX2JpdG1hcC5vIGJpdG9wcy5vIGlzbW91bnRlZC5vIG1ram91cm5hbC5vIHVuaXhfaW8ubyBcCisgICAgICAgICAgICAgICAgICAgcndfYml0bWFwcy5vIGluaXRpYWxpemUubyBiaXRtYXBzLm8gYmxvY2subyBcCisgICAgICAgICAgICAgICAgICAgaW5kX2Jsb2NrLm8gaW5vZGUubyBmcmVlZnMubyBhbGxvY19zdGF0cy5vIGNsb3NlZnMubyBcCisgICAgICAgICAgICAgICAgICAgb3BlbmZzLm8gaW9fbWFuYWdlci5vIGZpbmRkZXYubyByZWFkX2JiLm8gYWxsb2MubyBiYWRibG9ja3MubyBcCisgICAgICAgICAgICAgICAgICAgZ2V0c2l6ZS5vIGdldHNlY3RzaXplLm8gYWxsb2NfdGFibGVzLm8gcmVhZF9iYl9maWxlLm8gbWtkaXIubyBcCisgICAgICAgICAgICAgICAgICAgYmJfaW5vZGUubyBuZXdkaXIubyBhbGxvY19zYi5vIGxvb2t1cC5vIGRpcmJsb2NrLm8gZXhwYW5kZGlyLm8gXAorICAgICAgICAgICAgICAgICAgIGRpcl9pdGVyYXRlLm8gbGluay5vIHJlc19nZHQubyBpY291bnQubyBnZXRfcGF0aG5hbWUubyBkYmxpc3QubyBcCisgICAgICAgICAgICAgICAgICAgZGlyaGFzaC5vIHZlcnNpb24ubyBmbHVzaGIubyB1bmxpbmsubyBjaGVja19kZXNjLm8gdmFsaWRfYmxrLm8gXAorICAgICAgICAgICAgICAgICAgIGV4dF9hdHRyLm8gYm1hcC5vIGRibGlzdF9kaXIubyBleHQyZnNfaW5saW5lLm8gc3dhcGZzLm8KKworQ0ZMQUdTICs9IC1pbmNsdWRlICQoc3JjdHJlZSkvZTJmc3Byb2dzL2UyZnNiYi5oCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2MuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjYzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2MuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYWxsb2MuYyAtLS0gYWxsb2NhdGUgbmV3IGlub2RlcywgYmxvY2tzIGZvciBleHQyZnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogUmlnaHQgbm93LCBqdXN0IHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnkncyBibG9jaworICogZ3JvdXAgdG8gZmluZCB0aGUgbmV4dCBmcmVlIGlub2RlLgorICoKKyAqIFNob3VsZCBoYXZlIGEgc3BlY2lhbCBwb2xpY3kgZm9yIGRpcmVjdG9yaWVzLgorICovCitlcnJjb2RlX3QgZXh0MmZzX25ld19pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsCisJCQkgICBpbnQgbW9kZSBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICBleHQyZnNfaW5vZGVfYml0bWFwIG1hcCwgZXh0Ml9pbm9fdCAqcmV0KQoreworCWV4dDJfaW5vX3QJZGlyX2dyb3VwID0gMDsKKwlleHQyX2lub190CWk7CisJZXh0Ml9pbm9fdAlzdGFydF9pbm9kZTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoIW1hcCkKKwkJbWFwID0gZnMtPmlub2RlX21hcDsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fSU5PREVfQklUTUFQOworCisJaWYgKGRpciA+IDApCisJCWRpcl9ncm91cCA9IChkaXIgLSAxKSAvIEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpOworCisJc3RhcnRfaW5vZGUgPSAoZGlyX2dyb3VwICogRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcikpICsgMTsKKwlpZiAoc3RhcnRfaW5vZGUgPCBFWFQyX0ZJUlNUX0lOT0RFKGZzLT5zdXBlcikpCisJCXN0YXJ0X2lub2RlID0gRVhUMl9GSVJTVF9JTk9ERShmcy0+c3VwZXIpOworCWkgPSBzdGFydF9pbm9kZTsKKworCWRvIHsKKwkJaWYgKCFleHQyZnNfZmFzdF90ZXN0X2lub2RlX2JpdG1hcChtYXAsIGkpKQorCQkJYnJlYWs7CisJCWkrKzsKKwkJaWYgKGkgPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KQorCQkJaSA9IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKTsKKwl9IHdoaWxlIChpICE9IHN0YXJ0X2lub2RlKTsKKworCWlmIChleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAobWFwLCBpKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5PREVfQUxMT0NfRkFJTDsKKwkqcmV0ID0gaTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0dXBpZCBhbGdvcml0aG0gLS0tIHdlIG5vdyBqdXN0IHNlYXJjaCBmb3J3YXJkIHN0YXJ0aW5nIGZyb20gdGhlCisgKiBnb2FsLiAgU2hvdWxkIHB1dCBpbiBhIHNtYXJ0ZXIgb25lIHNvbWVkYXkuLi4uCisgKi8KK2VycmNvZGVfdCBleHQyZnNfbmV3X2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBnb2FsLAorCQkJICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCBtYXAsIGJsa190ICpyZXQpCit7CisJYmxrX3QJaTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoIW1hcCkKKwkJbWFwID0gZnMtPmJsb2NrX21hcDsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fQkxPQ0tfQklUTUFQOworCWlmICghZ29hbCB8fCAoZ29hbCA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSkKKwkJZ29hbCA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWkgPSBnb2FsOworCWRvIHsKKwkJaWYgKCFleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChtYXAsIGkpKSB7CisJCQkqcmV0ID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJCWkrKzsKKwkJaWYgKGkgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkKKwkJCWkgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwl9IHdoaWxlIChpICE9IGdvYWwpOworCXJldHVybiBFWFQyX0VUX0JMT0NLX0FMTE9DX0ZBSUw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHplcm9zIG91dCB0aGUgYWxsb2NhdGVkIGJsb2NrLCBhbmQgdXBkYXRlcyBhbGwgb2YgdGhlCisgKiBhcHByb3ByaWF0ZSBmaWxlc3lzdGVtIHJlY29yZHMuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfYWxsb2NfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGdvYWwsCisJCQkgICAgIGNoYXIgKmJsb2NrX2J1ZiwgYmxrX3QgKnJldCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQlibG9jazsKKwljaGFyCQkqYnVmID0gTlVMTDsKKworCWlmICghYmxvY2tfYnVmKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJYmxvY2tfYnVmID0gYnVmOworCX0KKwltZW1zZXQoYmxvY2tfYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKworCWlmICghZnMtPmJsb2NrX21hcCkgeworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9ibG9ja19iaXRtYXAoZnMpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBmYWlsOworCX0KKworCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIGdvYWwsIDAsICZibG9jayk7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsOworCisJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibG9jaywgMSwgYmxvY2tfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZhaWw7CisKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGJsb2NrLCArMSk7CisJKnJldCA9IGJsb2NrOworCXJldHVybiAwOworCitmYWlsOgorCWlmIChidWYpCisJCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2dldF9mcmVlX2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywgYmxrX3Qgc3RhcnQsIGJsa190IGZpbmlzaCwKKwkJCQkgaW50IG51bSwgZXh0MmZzX2Jsb2NrX2JpdG1hcCBtYXAsIGJsa190ICpyZXQpCit7CisJYmxrX3QJYiA9IHN0YXJ0OworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghbWFwKQorCQltYXAgPSBmcy0+YmxvY2tfbWFwOworCWlmICghbWFwKQorCQlyZXR1cm4gRVhUMl9FVF9OT19CTE9DS19CSVRNQVA7CisJaWYgKCFiKQorCQliID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJaWYgKCFmaW5pc2gpCisJCWZpbmlzaCA9IHN0YXJ0OworCWlmICghbnVtKQorCQludW0gPSAxOworCWRvIHsKKwkJaWYgKGIrbnVtLTEgPiBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KQorCQkJYiA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCQlpZiAoZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXBfcmFuZ2UobWFwLCBiLCBudW0pKSB7CisJCQkqcmV0ID0gYjsKKwkJCXJldHVybiAwOworCQl9CisJCWIrKzsKKwl9IHdoaWxlIChiICE9IGZpbmlzaCk7CisJcmV0dXJuIEVYVDJfRVRfQkxPQ0tfQUxMT0NfRkFJTDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvY19zYi5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0MzdjOQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9hbGxvY19zYi5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFsbG9jX3NiLmMgLS0tIEFsbG9jYXRlIHRoZSBzdXBlcmJsb2NrIGFuZCBibG9jayBncm91cCBkZXNjcmlwdG9ycyBmb3IgYQorICogbmV3bHkgaW5pdGlhbGl6ZWQgZmlsZXN5c3RlbS4gIFVzZWQgYnkgbWtlMmZzIHdoZW4gaW5pdGlhbGl6aW5nIGEgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMjAwMyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitpbnQgZXh0MmZzX3Jlc2VydmVfc3VwZXJfYW5kX2JnZChleHQyX2ZpbHN5cyBmcywKKwkJCQkgZGdycF90IGdyb3VwLAorCQkJCSBleHQyZnNfYmxvY2tfYml0bWFwIGJtYXApCit7CisJYmxrX3QJc3VwZXJfYmxrLCBvbGRfZGVzY19ibGssIG5ld19kZXNjX2JsazsKKwlpbnQJaiwgb2xkX2Rlc2NfYmxvY2tzLCBudW1fYmxvY2tzOworCisJbnVtX2Jsb2NrcyA9IGV4dDJmc19zdXBlcl9hbmRfYmdkX2xvYyhmcywgZ3JvdXAsICZzdXBlcl9ibGssCisJCQkJCSAgICAgICZvbGRfZGVzY19ibGssICZuZXdfZGVzY19ibGssIDApOworCisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpCisJCW9sZF9kZXNjX2Jsb2NrcyA9IGZzLT5zdXBlci0+c19maXJzdF9tZXRhX2JnOworCWVsc2UKKwkJb2xkX2Rlc2NfYmxvY2tzID0KKwkJCWZzLT5kZXNjX2Jsb2NrcyArIGZzLT5zdXBlci0+c19yZXNlcnZlZF9nZHRfYmxvY2tzOworCisJaWYgKHN1cGVyX2JsayB8fCAoZ3JvdXAgPT0gMCkpCisJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChibWFwLCBzdXBlcl9ibGspOworCisJaWYgKG9sZF9kZXNjX2JsaykgeworCQlmb3IgKGo9MDsgaiA8IG9sZF9kZXNjX2Jsb2NrczsgaisrKQorCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGJtYXAsIG9sZF9kZXNjX2JsayArIGopOworCX0KKwlpZiAobmV3X2Rlc2NfYmxrKQorCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoYm1hcCwgbmV3X2Rlc2NfYmxrKTsKKworCXJldHVybiBudW1fYmxvY2tzOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3N0YXRzLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2Nfc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FiMDZhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3N0YXRzLmMKQEAgLTAsMCArMSw1MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYWxsb2Nfc3RhdHMuYyAtLS0gVXBkYXRlIGFsbG9jYXRpb24gc3RhdGlzdGljcyBmb3IgZXh0MmZzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3ZvaWQgZXh0MmZzX2lub2RlX2FsbG9jX3N0YXRzMihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgICAgaW50IGludXNlLCBpbnQgaXNkaXIpCit7CisJaW50CWdyb3VwID0gZXh0MmZzX2dyb3VwX29mX2lubyhmcywgaW5vKTsKKworCWlmIChpbnVzZSA+IDApCisJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLCBpbm8pOworCWVsc2UKKwkJZXh0MmZzX3VubWFya19pbm9kZV9iaXRtYXAoZnMtPmlub2RlX21hcCwgaW5vKTsKKwlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfZnJlZV9pbm9kZXNfY291bnQgLT0gaW51c2U7CisJaWYgKGlzZGlyKQorCQlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfdXNlZF9kaXJzX2NvdW50ICs9IGludXNlOworCWZzLT5zdXBlci0+c19mcmVlX2lub2Rlc19jb3VudCAtPSBpbnVzZTsKKwlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJZXh0MmZzX21hcmtfaWJfZGlydHkoZnMpOworfQorCit2b2lkIGV4dDJmc19pbm9kZV9hbGxvY19zdGF0cyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sIGludCBpbnVzZSkKK3sKKwlleHQyZnNfaW5vZGVfYWxsb2Nfc3RhdHMyKGZzLCBpbm8sIGludXNlLCAwKTsKK30KKwordm9pZCBleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaywgaW50IGludXNlKQoreworCWludAlncm91cCA9IGV4dDJmc19ncm91cF9vZl9ibGsoZnMsIGJsayk7CisKKwlpZiAoaW51c2UgPiAwKQorCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKTsKKwllbHNlCisJCWV4dDJmc191bm1hcmtfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsIGJsayk7CisJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2ZyZWVfYmxvY2tzX2NvdW50IC09IGludXNlOworCWZzLT5zdXBlci0+c19mcmVlX2Jsb2Nrc19jb3VudCAtPSBpbnVzZTsKKwlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJZXh0MmZzX21hcmtfYmJfZGlydHkoZnMpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3RhYmxlcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2FsbG9jX3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjBlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYWxsb2NfdGFibGVzLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFsbG9jX3RhYmxlcy5jIC0tLSBBbGxvY2F0ZSB0YWJsZXMgZm9yIGEgbmV3bHkgaW5pdGlhbGl6ZWQKKyAqIGZpbGVzeXN0ZW0uICBVc2VkIGJ5IG1rZTJmcyB3aGVuIGluaXRpYWxpemluZyBhIGZpbGVzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9ncm91cF90YWJsZShleHQyX2ZpbHN5cyBmcywgZGdycF90IGdyb3VwLAorCQkJCSAgICAgIGV4dDJmc19ibG9ja19iaXRtYXAgYm1hcCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQlncm91cF9ibGssIHN0YXJ0X2JsaywgbGFzdF9ibGssIG5ld19ibGssIGJsazsKKwlpbnQJCWo7CisKKwlncm91cF9ibGsgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArCisJCShncm91cCAqIGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKworCWxhc3RfYmxrID0gZ3JvdXBfYmxrICsgZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJaWYgKGxhc3RfYmxrID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpCisJCWxhc3RfYmxrID0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCAtIDE7CisKKwlpZiAoIWJtYXApCisJCWJtYXAgPSBmcy0+YmxvY2tfbWFwOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgYmxvY2sgYW5kIGlub2RlIGJpdG1hcHMsIGlmIG5lY2Vzc2FyeQorCSAqLworCWlmIChmcy0+c3RyaWRlKSB7CisJCXN0YXJ0X2JsayA9IGdyb3VwX2JsayArIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCQlzdGFydF9ibGsgKz0gKChmcy0+c3RyaWRlICogZ3JvdXApICUKKwkJCSAgICAgIChsYXN0X2JsayAtIHN0YXJ0X2JsaykpOworCQlpZiAoc3RhcnRfYmxrID4gbGFzdF9ibGspCisJCQlzdGFydF9ibGsgPSBncm91cF9ibGs7CisJfSBlbHNlCisJCXN0YXJ0X2JsayA9IGdyb3VwX2JsazsKKworCWlmICghZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2Jsb2NrX2JpdG1hcCkgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X2ZyZWVfYmxvY2tzKGZzLCBzdGFydF9ibGssIGxhc3RfYmxrLAorCQkJCQkJMSwgYm1hcCwgJm5ld19ibGspOworCQlpZiAocmV0dmFsID09IEVYVDJfRVRfQkxPQ0tfQUxMT0NfRkFJTCkKKwkJCXJldHZhbCA9IGV4dDJmc19nZXRfZnJlZV9ibG9ja3MoZnMsIGdyb3VwX2JsaywKKwkJCQkJbGFzdF9ibGssIDEsIGJtYXAsICZuZXdfYmxrKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChibWFwLCBuZXdfYmxrKTsKKwkJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2Jsb2NrX2JpdG1hcCA9IG5ld19ibGs7CisJfQorCisJaWYgKCFmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfaW5vZGVfYml0bWFwKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfZnJlZV9ibG9ja3MoZnMsIHN0YXJ0X2JsaywgbGFzdF9ibGssCisJCQkJCQkxLCBibWFwLCAmbmV3X2Jsayk7CisJCWlmIChyZXR2YWwgPT0gRVhUMl9FVF9CTE9DS19BTExPQ19GQUlMKQorCQkJcmV0dmFsID0gZXh0MmZzX2dldF9mcmVlX2Jsb2NrcyhmcywgZ3JvdXBfYmxrLAorCQkJCQlsYXN0X2JsaywgMSwgYm1hcCwgJm5ld19ibGspOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGJtYXAsIG5ld19ibGspOworCQlmcy0+Z3JvdXBfZGVzY1tncm91cF0uYmdfaW5vZGVfYml0bWFwID0gbmV3X2JsazsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBpbm9kZSB0YWJsZQorCSAqLworCWlmICghZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2lub2RlX3RhYmxlKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfZnJlZV9ibG9ja3MoZnMsIGdyb3VwX2JsaywgbGFzdF9ibGssCisJCQkJCQlmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCwKKwkJCQkJCWJtYXAsICZuZXdfYmxrKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWZvciAoaj0wLCBibGsgPSBuZXdfYmxrOworCQkgICAgIGogPCBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKwkJICAgICBqKyssIGJsaysrKQorCQkJZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGJtYXAsIGJsayk7CisJCWZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19pbm9kZV90YWJsZSA9IG5ld19ibGs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfdGFibGVzKGV4dDJfZmlsc3lzIGZzKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJZGdycF90CQlpOworCisJZm9yIChpID0gMDsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX2dyb3VwX3RhYmxlKGZzLCBpLCBmcy0+YmxvY2tfbWFwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JhZGJsb2Nrcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JhZGJsb2Nrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWNjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmFkYmxvY2tzLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJhZGJsb2Nrcy5jIC0tLSByb3V0aW5lcyB0byBtYW5pcHVsYXRlIHRoZSBiYWQgYmxvY2sgc3RydWN0dXJlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzUC5oIgorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBtYWtpbmcgYSBiYWRibG9ja3MgbGlzdAorICovCitzdGF0aWMgZXJyY29kZV90IG1ha2VfdTMyX2xpc3QoaW50IHNpemUsIGludCBudW0sIF9fdTMyICpsaXN0LAorCQkJICAgICAgIGV4dDJfdTMyX2xpc3QgKnJldCkKK3sKKwlleHQyX3UzMl9saXN0CWJiOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfc3RydWN0X3UzMl9saXN0KSwgJmJiKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChiYiwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX3N0cnVjdF91MzJfbGlzdCkpOworCWJiLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0xJU1Q7CisJYmItPnNpemUgPSBzaXplID8gc2l6ZSA6IDEwOworCWJiLT5udW0gPSBudW07CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oYmItPnNpemUgKiBzaXplb2YoYmxrX3QpLCAmYmItPmxpc3QpOworCWlmICghYmItPmxpc3QpIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZiYik7CisJCXJldHVybiByZXR2YWw7CisJfQorCWlmIChsaXN0KQorCQltZW1jcHkoYmItPmxpc3QsIGxpc3QsIGJiLT5zaXplICogc2l6ZW9mKGJsa190KSk7CisJZWxzZQorCQltZW1zZXQoYmItPmxpc3QsIDAsIGJiLT5zaXplICogc2l6ZW9mKGJsa190KSk7CisJKnJldCA9IGJiOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSBjcmVhdGVzIGFuIGVtcHR5IHUzMiBsaXN0LgorICovCitlcnJjb2RlX3QgZXh0MmZzX3UzMl9saXN0X2NyZWF0ZShleHQyX3UzMl9saXN0ICpyZXQsIGludCBzaXplKQoreworCXJldHVybiBtYWtlX3UzMl9saXN0KHNpemUsIDAsIDAsIHJldCk7Cit9CisKKy8qCisgKiBUaGlzIHByb2NlZHVyZSBjcmVhdGVzIGFuIGVtcHR5IGJhZGJsb2NrcyBsaXN0LgorICovCitlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2NyZWF0ZShleHQyX2JhZGJsb2Nrc19saXN0ICpyZXQsIGludCBzaXplKQoreworCXJldHVybiBtYWtlX3UzMl9saXN0KHNpemUsIDAsIDAsIChleHQyX2JhZGJsb2Nrc19saXN0ICopIHJldCk7Cit9CisKKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIGNvcGllcyBhIGJhZGJsb2NrcyBsaXN0CisgKi8KK2VycmNvZGVfdCBleHQyZnNfdTMyX2NvcHkoZXh0Ml91MzJfbGlzdCBzcmMsIGV4dDJfdTMyX2xpc3QgKmRlc3QpCit7CisJZXJyY29kZV90CXJldHZhbDsKKworCXJldHZhbCA9IG1ha2VfdTMyX2xpc3Qoc3JjLT5zaXplLCBzcmMtPm51bSwgc3JjLT5saXN0LCBkZXN0KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCSgqZGVzdCktPmJhZGJsb2Nrc19mbGFncyA9IHNyYy0+YmFkYmxvY2tzX2ZsYWdzOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19jb3B5KGV4dDJfYmFkYmxvY2tzX2xpc3Qgc3JjLAorCQkJCWV4dDJfYmFkYmxvY2tzX2xpc3QgKmRlc3QpCit7CisJcmV0dXJuIGV4dDJmc191MzJfY29weSgoZXh0Ml91MzJfbGlzdCkgc3JjLAorCQkJICAgICAgIChleHQyX3UzMl9saXN0ICopIGRlc3QpOworfQorCisvKgorICogVGhpcyBwcm9jZWR1cmUgZnJlZXMgYSBiYWRibG9ja3MgbGlzdC4KKyAqCisgKiAobm90ZTogbW92ZWQgdG8gY2xvc2Vmcy5jKQorICovCisKKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIGFkZHMgYSBibG9jayB0byBhIGJhZGJsb2NrcyBsaXN0LgorICovCitlcnJjb2RlX3QgZXh0MmZzX3UzMl9saXN0X2FkZChleHQyX3UzMl9saXN0IGJiLCBfX3UzMiBibGspCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlpbnQJCWksIGo7CisJdW5zaWduZWQgbG9uZwlvbGRfc2l6ZTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoYmIsIEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0xJU1QpOworCisJaWYgKGJiLT5udW0gPj0gYmItPnNpemUpIHsKKwkJb2xkX3NpemUgPSBiYi0+c2l6ZSAqIHNpemVvZihfX3UzMik7CisJCWJiLT5zaXplICs9IDEwMDsKKwkJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9tZW0ob2xkX3NpemUsIGJiLT5zaXplICogc2l6ZW9mKF9fdTMyKSwKKwkJCQkJICAgJmJiLT5saXN0KTsKKwkJaWYgKHJldHZhbCkgeworCQkJYmItPnNpemUgLT0gMTAwOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKworCS8qCisJICogQWRkIHNwZWNpYWwgY2FzZSBjb2RlIGZvciBhcHBlbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorCSAqLworCWkgPSBiYi0+bnVtLTE7CisJaWYgKChiYi0+bnVtICE9IDApICYmIChiYi0+bGlzdFtpXSA9PSBibGspKQorCQlyZXR1cm4gMDsKKwlpZiAoKGJiLT5udW0gPT0gMCkgfHwgKGJiLT5saXN0W2ldIDwgYmxrKSkgeworCQliYi0+bGlzdFtiYi0+bnVtKytdID0gYmxrOworCQlyZXR1cm4gMDsKKwl9CisKKwlqID0gYmItPm51bTsKKwlmb3IgKGk9MDsgaSA8IGJiLT5udW07IGkrKykgeworCQlpZiAoYmItPmxpc3RbaV0gPT0gYmxrKQorCQkJcmV0dXJuIDA7CisJCWlmIChiYi0+bGlzdFtpXSA+IGJsaykgeworCQkJaiA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlmb3IgKGk9YmItPm51bTsgaSA+IGo7IGktLSkKKwkJYmItPmxpc3RbaV0gPSBiYi0+bGlzdFtpLTFdOworCWJiLT5saXN0W2pdID0gYmxrOworCWJiLT5udW0rKzsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19iYWRibG9ja3NfbGlzdF9hZGQoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYiwgYmxrX3QgYmxrKQoreworCXJldHVybiBleHQyZnNfdTMyX2xpc3RfYWRkKChleHQyX3UzMl9saXN0KSBiYiwgKF9fdTMyKSBibGspOworfQorCisvKgorICogVGhpcyBwcm9jZWR1cmUgZmluZHMgYSBwYXJ0aWN1bGFyIGJsb2NrIGlzIG9uIGEgYmFkYmxvY2tzCisgKiBsaXN0LgorICovCitpbnQgZXh0MmZzX3UzMl9saXN0X2ZpbmQoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKQoreworCWludAlsb3csIGhpZ2gsIG1pZDsKKworCWlmIChiYi0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGJiLT5udW0gPT0gMCkKKwkJcmV0dXJuIC0xOworCisJbG93ID0gMDsKKwloaWdoID0gYmItPm51bS0xOworCWlmIChibGsgPT0gYmItPmxpc3RbbG93XSkKKwkJcmV0dXJuIGxvdzsKKwlpZiAoYmxrID09IGJiLT5saXN0W2hpZ2hdKQorCQlyZXR1cm4gaGlnaDsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCW1pZCA9IChsb3craGlnaCkvMjsKKwkJaWYgKG1pZCA9PSBsb3cgfHwgbWlkID09IGhpZ2gpCisJCQlicmVhazsKKwkJaWYgKGJsayA9PSBiYi0+bGlzdFttaWRdKQorCQkJcmV0dXJuIG1pZDsKKwkJaWYgKGJsayA8IGJiLT5saXN0W21pZF0pCisJCQloaWdoID0gbWlkOworCQllbHNlCisJCQlsb3cgPSBtaWQ7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIHRlc3RzIHRvIHNlZSBpZiBhIHBhcnRpY3VsYXIgYmxvY2sgaXMgb24gYSBiYWRibG9ja3MKKyAqIGxpc3QuCisgKi8KK2ludCBleHQyZnNfdTMyX2xpc3RfdGVzdChleHQyX3UzMl9saXN0IGJiLCBfX3UzMiBibGspCit7CisJaWYgKGV4dDJmc191MzJfbGlzdF9maW5kKGJiLCBibGspIDwgMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworaW50IGV4dDJmc19iYWRibG9ja3NfbGlzdF90ZXN0KGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIsIGJsa190IGJsaykKK3sKKwlyZXR1cm4gZXh0MmZzX3UzMl9saXN0X3Rlc3QoKGV4dDJfdTMyX2xpc3QpIGJiLCAoX191MzIpIGJsayk7Cit9CisKKworLyoKKyAqIFJlbW92ZSBhIGJsb2NrIGZyb20gdGhlIGJhZGJsb2NrIGxpc3QKKyAqLworaW50IGV4dDJmc191MzJfbGlzdF9kZWwoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKQoreworCWludAlyZW1sb2MsIGk7CisKKwlpZiAoYmItPm51bSA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlyZW1sb2MgPSBleHQyZnNfdTMyX2xpc3RfZmluZChiYiwgYmxrKTsKKwlpZiAocmVtbG9jIDwgMCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gcmVtbG9jOyBpIDwgYmItPm51bSAtIDE7IGkrKykKKwkJYmItPmxpc3RbaV0gPSBiYi0+bGlzdFtpKzFdOworCWJiLT5udW0tLTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfZGVsKGV4dDJfdTMyX2xpc3QgYmIsIF9fdTMyIGJsaykKK3sKKwlleHQyZnNfdTMyX2xpc3RfZGVsKGJiLCBibGspOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfYmVnaW4oZXh0Ml91MzJfbGlzdCBiYiwKKwkJCQkJZXh0Ml91MzJfaXRlcmF0ZSAqcmV0KQoreworCWV4dDJfdTMyX2l0ZXJhdGUgaXRlcjsKKwllcnJjb2RlX3QJCXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoYmIsIEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0xJU1QpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBleHQyX3N0cnVjdF91MzJfaXRlcmF0ZSksICZpdGVyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaXRlci0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19JVEVSQVRFOworCWl0ZXItPmJiID0gYmI7CisJaXRlci0+cHRyID0gMDsKKwkqcmV0ID0gaXRlcjsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIsCisJCQkJCSAgICAgIGV4dDJfYmFkYmxvY2tzX2l0ZXJhdGUgKnJldCkKK3sKKwlyZXR1cm4gZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfYmVnaW4oKGV4dDJfdTMyX2xpc3QpIGJiLAorCQkJCQkgICAgICAoZXh0Ml91MzJfaXRlcmF0ZSAqKSByZXQpOworfQorCisKK2ludCBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZShleHQyX3UzMl9pdGVyYXRlIGl0ZXIsIF9fdTMyICpibGspCit7CisJZXh0Ml91MzJfbGlzdAliYjsKKworCWlmIChpdGVyLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19JVEVSQVRFKQorCQlyZXR1cm4gMDsKKworCWJiID0gaXRlci0+YmI7CisKKwlpZiAoYmItPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0xJU1QpCisJCXJldHVybiAwOworCisJaWYgKGl0ZXItPnB0ciA8IGJiLT5udW0pIHsKKwkJKmJsayA9IGJiLT5saXN0W2l0ZXItPnB0cisrXTsKKwkJcmV0dXJuIDE7CisJfQorCSpibGsgPSAwOworCXJldHVybiAwOworfQorCitpbnQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGUoZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZSBpdGVyLCBibGtfdCAqYmxrKQoreworCXJldHVybiBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZSgoZXh0Ml91MzJfaXRlcmF0ZSkgaXRlciwKKwkJCQkgICAgICAgKF9fdTMyICopIGJsayk7Cit9CisKKwordm9pZCBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZV9lbmQoZXh0Ml91MzJfaXRlcmF0ZSBpdGVyKQoreworCWlmICghaXRlciB8fCAoaXRlci0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfSVRFUkFURSkpCisJCXJldHVybjsKKworCWl0ZXItPmJiID0gMDsKKwlleHQyZnNfZnJlZV9tZW0oJml0ZXIpOworfQorCit2b2lkIGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZChleHQyX2JhZGJsb2Nrc19pdGVyYXRlIGl0ZXIpCit7CisJZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfZW5kKChleHQyX3UzMl9pdGVyYXRlKSBpdGVyKTsKK30KKworCitpbnQgZXh0MmZzX3UzMl9saXN0X2VxdWFsKGV4dDJfdTMyX2xpc3QgYmIxLCBleHQyX3UzMl9saXN0IGJiMikKK3sKKwlFWFQyX0NIRUNLX01BR0lDKGJiMSwgRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCk7CisJRVhUMl9DSEVDS19NQUdJQyhiYjIsIEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0xJU1QpOworCisJaWYgKGJiMS0+bnVtICE9IGJiMi0+bnVtKQorCQlyZXR1cm4gMDsKKworCWlmIChtZW1jbXAoYmIxLT5saXN0LCBiYjItPmxpc3QsIGJiMS0+bnVtICogc2l6ZW9mKGJsa190KSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK2ludCBleHQyZnNfYmFkYmxvY2tzX2VxdWFsKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIxLCBleHQyX2JhZGJsb2Nrc19saXN0IGJiMikKK3sKKwlyZXR1cm4gZXh0MmZzX3UzMl9saXN0X2VxdWFsKChleHQyX3UzMl9saXN0KSBiYjEsCisJCQkJICAgICAoZXh0Ml91MzJfbGlzdCkgYmIyKTsKK30KKworaW50IGV4dDJmc191MzJfbGlzdF9jb3VudChleHQyX3UzMl9saXN0IGJiKQoreworCXJldHVybiBiYi0+bnVtOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JiX2NvbXBhdC5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JiX2NvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWFjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmJfY29tcGF0LmMKQEAgLTAsMCArMSw2NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfY29tcGF0LmMgLS0tIGNvbXBhdGliaWxpdHkgYmFkYmxvY2tzIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzUC5oIgorCitlcnJjb2RlX3QgYmFkYmxvY2tzX2xpc3RfY3JlYXRlKGJhZGJsb2Nrc19saXN0ICpyZXQsIGludCBzaXplKQoreworCXJldHVybiBleHQyZnNfYmFkYmxvY2tzX2xpc3RfY3JlYXRlKHJldCwgc2l6ZSk7Cit9CisKK3ZvaWQgYmFkYmxvY2tzX2xpc3RfZnJlZShiYWRibG9ja3NfbGlzdCBiYikKK3sKKwlleHQyZnNfYmFkYmxvY2tzX2xpc3RfZnJlZShiYik7Cit9CisKK2VycmNvZGVfdCBiYWRibG9ja3NfbGlzdF9hZGQoYmFkYmxvY2tzX2xpc3QgYmIsIGJsa190IGJsaykKK3sKKwlyZXR1cm4gZXh0MmZzX2JhZGJsb2Nrc19saXN0X2FkZChiYiwgYmxrKTsKK30KKworaW50IGJhZGJsb2Nrc19saXN0X3Rlc3QoYmFkYmxvY2tzX2xpc3QgYmIsIGJsa190IGJsaykKK3sKKwlyZXR1cm4gZXh0MmZzX2JhZGJsb2Nrc19saXN0X3Rlc3QoYmIsIGJsayk7Cit9CisKK2VycmNvZGVfdCBiYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGJhZGJsb2Nrc19saXN0IGJiLAorCQkJCSAgICAgICBiYWRibG9ja3NfaXRlcmF0ZSAqcmV0KQoreworCXJldHVybiBleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9iZWdpbihiYiwgcmV0KTsKK30KKworaW50IGJhZGJsb2Nrc19saXN0X2l0ZXJhdGUoYmFkYmxvY2tzX2l0ZXJhdGUgaXRlciwgYmxrX3QgKmJsaykKK3sKKwlyZXR1cm4gZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGUoaXRlciwgYmxrKTsKK30KKwordm9pZCBiYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZChiYWRibG9ja3NfaXRlcmF0ZSBpdGVyKQoreworCWV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2VuZChpdGVyKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iYl9pbm9kZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JiX2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2Nzg5NgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iYl9pbm9kZS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9pbm9kZS5jIC0tLSByb3V0aW5lcyB0byB1cGRhdGUgdGhlIGJhZCBibG9jayBpbm9kZS4KKyAqCisgKiBXQVJOSU5HOiBUaGlzIHJvdXRpbmUgbW9kaWZpZXMgYSBsb3Qgb2Ygc3RhdGUgaW4gdGhlIGZpbGVzeXN0ZW07IGlmCisgKiB0aGlzIHJvdXRpbmUgcmV0dXJucyBhbiBlcnJvciwgdGhlIGJhZCBibG9jayBpbm9kZSBtYXkgYmUgaW4gYW4KKyAqIGluY29uc2lzdGVudCBzdGF0ZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IHNldF9iYWRibG9ja19yZWNvcmQgeworCWV4dDJfYmFkYmxvY2tzX2l0ZXJhdGUJYmJfaXRlcjsKKwlpbnQJCWJhZF9ibG9ja19jb3VudDsKKwlibGtfdAkJKmluZF9ibG9ja3M7CisJaW50CQltYXhfaW5kX2Jsb2NrczsKKwlpbnQJCWluZF9ibG9ja3Nfc2l6ZTsKKwlpbnQJCWluZF9ibG9ja3NfcHRyOworCWNoYXIJCSpibG9ja19idWY7CisJZXJyY29kZV90CWVycjsKK307CisKK3N0YXRpYyBpbnQgc2V0X2JhZF9ibG9ja19wcm9jKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tfbnIsCisJCQkgICAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCSAgICAgIGJsa190IHJlZl9ibG9jaywgaW50IHJlZl9vZmZzZXQsCisJCQkgICAgICB2b2lkICpwcml2X2RhdGEpOworc3RhdGljIGludCBjbGVhcl9iYWRfYmxvY2tfcHJvYyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrX25yLAorCQkJCWUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJCWJsa190IHJlZl9ibG9jaywgaW50IHJlZl9vZmZzZXQsCisJCQkJdm9pZCAqcHJpdl9kYXRhKTsKKworLyoKKyAqIEdpdmVuIGEgYmFkIGJsb2NrcyBiaXRtYXAsIHVwZGF0ZSB0aGUgYmFkIGJsb2NrcyBpbm9kZSB0byByZWZsZWN0CisgKiB0aGUgbWFwLgorICovCitlcnJjb2RlX3QgZXh0MmZzX3VwZGF0ZV9iYl9pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9iYWRibG9ja3NfbGlzdCBiYl9saXN0KQoreworCWVycmNvZGVfdAkJCXJldHZhbDsKKwlzdHJ1Y3Qgc2V0X2JhZGJsb2NrX3JlY29yZAlyZWM7CisJc3RydWN0IGV4dDJfaW5vZGUJCWlub2RlOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghZnMtPmJsb2NrX21hcCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fQkxPQ0tfQklUTUFQOworCisJcmVjLmJhZF9ibG9ja19jb3VudCA9IDA7CisJcmVjLmluZF9ibG9ja3Nfc2l6ZSA9IHJlYy5pbmRfYmxvY2tzX3B0ciA9IDA7CisJcmVjLm1heF9pbmRfYmxvY2tzID0gMTA7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0ocmVjLm1heF9pbmRfYmxvY2tzICogc2l6ZW9mKGJsa190KSwKKwkJCQkmcmVjLmluZF9ibG9ja3MpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KHJlYy5pbmRfYmxvY2tzLCAwLCByZWMubWF4X2luZF9ibG9ja3MgKiBzaXplb2YoYmxrX3QpKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmcmVjLmJsb2NrX2J1Zik7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCW1lbXNldChyZWMuYmxvY2tfYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwlyZWMuZXJyID0gMDsKKworCS8qCisJICogRmlyc3QgY2xlYXIgdGhlIG9sZCBiYWQgYmxvY2tzICh3aGlsZSBzYXZpbmcgdGhlIGluZGlyZWN0IGJsb2NrcykKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIEVYVDJfQkFEX0lOTywKKwkJCQkgICAgICAgQkxPQ0tfRkxBR19ERVBUSF9UUkFWRVJTRSwgMCwKKwkJCQkgICAgICAgY2xlYXJfYmFkX2Jsb2NrX3Byb2MsICZyZWMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAocmVjLmVycikgeworCQlyZXR2YWwgPSByZWMuZXJyOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyoKKwkgKiBOb3cgc2V0IHRoZSBiYWQgYmxvY2tzIQorCSAqCisJICogRmlyc3QsIG1hcmsgdGhlIGJhZCBibG9ja3MgYXMgdXNlZC4gIFRoaXMgcHJldmVudHMgYSBiYWQKKwkgKiBibG9jayBmcm9tIGJlaW5nIHVzZWQgYXMgYW4gaW5kaXJlY3RvIGJsb2NrIGZvciB0aGUgYmFkCisJICogYmxvY2sgaW5vZGUgKCEpLgorCSAqLworCWlmIChiYl9saXN0KSB7CisJCXJldHZhbCA9IGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGJiX2xpc3QsCisJCQkJCQkJICAgICAmcmVjLmJiX2l0ZXIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCQlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIEVYVDJfQkFEX0lOTywKKwkJCQkJICAgICAgIEJMT0NLX0ZMQUdfQVBQRU5ELCAwLAorCQkJCQkgICAgICAgc2V0X2JhZF9ibG9ja19wcm9jLCAmcmVjKTsKKwkJZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfZW5kKHJlYy5iYl9pdGVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwkJaWYgKHJlYy5lcnIpIHsKKwkJCXJldHZhbCA9IHJlYy5lcnI7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgYmFkIGJsb2NrIGlub2RlJ3MgbW9kIHRpbWUgYW5kIGJsb2NrIGNvdW50CisJICogZmllbGQuCisJICovCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIEVYVDJfQkFEX0lOTywgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlpbm9kZS5pX2F0aW1lID0gaW5vZGUuaV9tdGltZSA9IHRpbWUoTlVMTCk7CisJaWYgKCFpbm9kZS5pX2N0aW1lKQorCQlpbm9kZS5pX2N0aW1lID0gdGltZShOVUxMKTsKKwlpbm9kZS5pX2Jsb2NrcyA9IHJlYy5iYWRfYmxvY2tfY291bnQgKiAoZnMtPmJsb2Nrc2l6ZSAvIDUxMik7CisJaW5vZGUuaV9zaXplID0gcmVjLmJhZF9ibG9ja19jb3VudCAqIGZzLT5ibG9ja3NpemU7CisKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIEVYVDJfQkFEX0lOTywgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKK2NsZWFudXA6CisJZXh0MmZzX2ZyZWVfbWVtKCZyZWMuaW5kX2Jsb2Nrcyk7CisJZXh0MmZzX2ZyZWVfbWVtKCZyZWMuYmxvY2tfYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciB1cGRhdGVfYmJfaW5vZGUoKQorICoKKyAqIENsZWFyIHRoZSBiYWQgYmxvY2tzIGluIHRoZSBiYWQgYmxvY2sgaW5vZGUsIHdoaWxlIHNhdmluZyB0aGUKKyAqIGluZGlyZWN0IGJsb2Nrcy4KKyAqLworI2lmZGVmIF9fVFVSQk9DX18KKyMgcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK3N0YXRpYyBpbnQgY2xlYXJfYmFkX2Jsb2NrX3Byb2MoZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwKKwkJCQllMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCQlibGtfdCByZWZfYmxvY2sgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJCWludCByZWZfb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCQl2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHNldF9iYWRibG9ja19yZWNvcmQgKnJlYyA9IChzdHJ1Y3Qgc2V0X2JhZGJsb2NrX3JlY29yZCAqKQorCQlwcml2X2RhdGE7CisJZXJyY29kZV90CXJldHZhbDsKKwl1bnNpZ25lZCBsb25nCW9sZF9zaXplOworCisJaWYgKCEqYmxvY2tfbnIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgbnVtYmVyIGlzIG91dHJhZ2VvdXMsIGNsZWFyIGl0IGFuZCBpZ25vcmUgaXQuCisJICovCisJaWYgKCpibG9ja19uciA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IHx8CisJICAgICpibG9ja19uciA8IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB7CisJCSpibG9ja19uciA9IDA7CisJCXJldHVybiBCTE9DS19DSEFOR0VEOworCX0KKworCWlmIChibG9ja2NudCA8IDApIHsKKwkJaWYgKHJlYy0+aW5kX2Jsb2Nrc19zaXplID49IHJlYy0+bWF4X2luZF9ibG9ja3MpIHsKKwkJCW9sZF9zaXplID0gcmVjLT5tYXhfaW5kX2Jsb2NrcyAqIHNpemVvZihibGtfdCk7CisJCQlyZWMtPm1heF9pbmRfYmxvY2tzICs9IDEwOworCQkJcmV0dmFsID0gZXh0MmZzX3Jlc2l6ZV9tZW0ob2xkX3NpemUsCisJCQkJICAgcmVjLT5tYXhfaW5kX2Jsb2NrcyAqIHNpemVvZihibGtfdCksCisJCQkJICAgJnJlYy0+aW5kX2Jsb2Nrcyk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcmVjLT5tYXhfaW5kX2Jsb2NrcyAtPSAxMDsKKwkJCQlyZWMtPmVyciA9IHJldHZhbDsKKwkJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCQl9CisJCX0KKwkJcmVjLT5pbmRfYmxvY2tzW3JlYy0+aW5kX2Jsb2Nrc19zaXplKytdID0gKmJsb2NrX25yOworCX0KKworCS8qCisJICogTWFyayB0aGUgYmxvY2sgYXMgdW51c2VkLCBhbmQgdXBkYXRlIGFjY291bnRpbmcgaW5mb3JtYXRpb24KKwkgKi8KKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsICpibG9ja19uciwgLTEpOworCisJKmJsb2NrX25yID0gMDsKKwlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKK30KKworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciB1cGRhdGVfYmJfaW5vZGUoKQorICoKKyAqIFNldCB0aGUgYmxvY2sgbGlzdCBpbiB0aGUgYmFkIGJsb2NrIGlub2RlLCB1c2luZyB0aGUgc3VwcGxpZWQgYml0bWFwLgorICovCisjaWZkZWYgX19UVVJCT0NfXworICNwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCBzZXRfYmFkX2Jsb2NrX3Byb2MoZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwKKwkJCSAgICAgIGUyX2Jsa2NudF90IGJsb2NrY250LAorCQkJICAgICAgYmxrX3QgcmVmX2Jsb2NrIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgIGludCByZWZfb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2V0X2JhZGJsb2NrX3JlY29yZCAqcmVjID0gKHN0cnVjdCBzZXRfYmFkYmxvY2tfcmVjb3JkICopCisJCXByaXZfZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsOworCWJsa190CQlibGs7CisKKwlpZiAoYmxvY2tjbnQgPj0gMCkgeworCQkvKgorCQkgKiBHZXQgdGhlIG5leHQgYmFkIGJsb2NrLgorCQkgKi8KKwkJaWYgKCFleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZShyZWMtPmJiX2l0ZXIsICZibGspKQorCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQlyZWMtPmJhZF9ibG9ja19jb3VudCsrOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFuIGluZGlyZWN0IGJsb2NrOyBmZXRjaCBhIGJsb2NrIGZyb20gdGhlCisJCSAqIHByZXZpb3VzbHkgdXNlZCBpbmRpcmVjdCBibG9jayBsaXN0LiAgVGhlIGJsb2NrCisJCSAqIG1vc3QgYmUgbm90IG1hcmtlZCBhcyB1c2VkOyBpZiBzbywgZ2V0IGFub3RoZXIgb25lLgorCQkgKiBJZiB3ZSBydW4gb3V0IG9mIHJlc2VydmVkIGluZGlyZWN0IGJsb2NrcywgYWxsb2NhdGUKKwkJICogYSBuZXcgb25lLgorCQkgKi8KKwlyZXRyeToKKwkJaWYgKHJlYy0+aW5kX2Jsb2Nrc19wdHIgPCByZWMtPmluZF9ibG9ja3Nfc2l6ZSkgeworCQkJYmxrID0gcmVjLT5pbmRfYmxvY2tzW3JlYy0+aW5kX2Jsb2Nrc19wdHIrK107CisJCQlpZiAoZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsIGJsaykpCisJCQkJZ290byByZXRyeTsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIDAsIDAsICZibGspOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJlYy0+ZXJyID0gcmV0dmFsOworCQkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJCX0KKwkJfQorCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsaywgMSwgcmVjLT5ibG9ja19idWYpOworCQlpZiAocmV0dmFsKSB7CisJCQlyZWMtPmVyciA9IHJldHZhbDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCX0KKworCS8qCisJICogVXBkYXRlIGJsb2NrIGNvdW50cworCSAqLworCWV4dDJmc19ibG9ja19hbGxvY19zdGF0cyhmcywgYmxrLCArMSk7CisKKwkqYmxvY2tfbnIgPSBibGs7CisJcmV0dXJuIEJMT0NLX0NIQU5HRUQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYml0bWFwcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG1hcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdlZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG1hcHMuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYml0bWFwcy5jIC0tLSByb3V0aW5lcyB0byByZWFkLCB3cml0ZSwgYW5kIG1hbmlwdWxhdGUgdGhlIGlub2RlIGFuZAorICogYmxvY2sgYml0bWFwcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RhdGljIGVycmNvZGVfdCBtYWtlX2JpdG1hcChfX3UzMiBzdGFydCwgX191MzIgZW5kLCBfX3UzMiByZWFsX2VuZCwKKwkJCSAgICAgY29uc3QgY2hhciAqZGVzY3IsIGNoYXIgKmluaXRfbWFwLAorCQkJICAgICBleHQyZnNfZ2VuZXJpY19iaXRtYXAgKnJldCkKK3sKKwlleHQyZnNfZ2VuZXJpY19iaXRtYXAJYml0bWFwOworCWVycmNvZGVfdAkJcmV0dmFsOworCXNpemVfdAkJCXNpemU7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJmc19zdHJ1Y3RfZ2VuZXJpY19iaXRtYXApLAorCQkJCSZiaXRtYXApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwliaXRtYXAtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19HRU5FUklDX0JJVE1BUDsKKwliaXRtYXAtPmZzID0gTlVMTDsKKwliaXRtYXAtPnN0YXJ0ID0gc3RhcnQ7CisJYml0bWFwLT5lbmQgPSBlbmQ7CisJYml0bWFwLT5yZWFsX2VuZCA9IHJlYWxfZW5kOworCWJpdG1hcC0+YmFzZV9lcnJvcl9jb2RlID0gRVhUMl9FVF9CQURfR0VORVJJQ19NQVJLOworCWlmIChkZXNjcikgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4oZGVzY3IpKzEsICZiaXRtYXAtPmRlc2NyaXB0aW9uKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZXh0MmZzX2ZyZWVfbWVtKCZiaXRtYXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlzdHJjcHkoYml0bWFwLT5kZXNjcmlwdGlvbiwgZGVzY3IpOworCX0gZWxzZQorCQliaXRtYXAtPmRlc2NyaXB0aW9uID0gMDsKKworCXNpemUgPSAoc2l6ZV90KSAoKChiaXRtYXAtPnJlYWxfZW5kIC0gYml0bWFwLT5zdGFydCkgLyA4KSArIDEpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemUsICZiaXRtYXAtPmJpdG1hcCk7CisJaWYgKHJldHZhbCkgeworCQlleHQyZnNfZnJlZV9tZW0oJmJpdG1hcC0+ZGVzY3JpcHRpb24pOworCQlleHQyZnNfZnJlZV9tZW0oJmJpdG1hcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKGluaXRfbWFwKQorCQltZW1jcHkoYml0bWFwLT5iaXRtYXAsIGluaXRfbWFwLCBzaXplKTsKKwllbHNlCisJCW1lbXNldChiaXRtYXAtPmJpdG1hcCwgMCwgc2l6ZSk7CisJKnJldCA9IGJpdG1hcDsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV9nZW5lcmljX2JpdG1hcChfX3UzMiBzdGFydCwKKwkJCQkJIF9fdTMyIGVuZCwKKwkJCQkJIF9fdTMyIHJlYWxfZW5kLAorCQkJCQkgY29uc3QgY2hhciAqZGVzY3IsCisJCQkJCSBleHQyZnNfZ2VuZXJpY19iaXRtYXAgKnJldCkKK3sKKwlyZXR1cm4gbWFrZV9iaXRtYXAoc3RhcnQsIGVuZCwgcmVhbF9lbmQsIGRlc2NyLCAwLCByZXQpOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2NvcHlfYml0bWFwKGV4dDJmc19nZW5lcmljX2JpdG1hcCBzcmMsCisJCQkgICAgIGV4dDJmc19nZW5lcmljX2JpdG1hcCAqZGVzdCkKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlleHQyZnNfZ2VuZXJpY19iaXRtYXAJbmV3X21hcDsKKworCXJldHZhbCA9IG1ha2VfYml0bWFwKHNyYy0+c3RhcnQsIHNyYy0+ZW5kLCBzcmMtPnJlYWxfZW5kLAorCQkJICAgICBzcmMtPmRlc2NyaXB0aW9uLCBzcmMtPmJpdG1hcCwgJm5ld19tYXApOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbmV3X21hcC0+bWFnaWMgPSBzcmMtPm1hZ2ljOworCW5ld19tYXAtPmZzID0gc3JjLT5mczsKKwluZXdfbWFwLT5iYXNlX2Vycm9yX2NvZGUgPSBzcmMtPmJhc2VfZXJyb3JfY29kZTsKKwkqZGVzdCA9IG5ld19tYXA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXh0MmZzX3NldF9iaXRtYXBfcGFkZGluZyhleHQyZnNfZ2VuZXJpY19iaXRtYXAgbWFwKQoreworCV9fdTMyCWksIGo7CisKKwlmb3IgKGk9bWFwLT5lbmQrMSwgaiA9IGkgLSBtYXAtPnN0YXJ0OyBpIDw9IG1hcC0+cmVhbF9lbmQ7IGkrKywgaisrKQorCQlleHQyZnNfc2V0X2JpdChqLCBtYXAtPmJpdG1hcCk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpkZXNjciwKKwkJCQkgICAgICAgZXh0MmZzX2lub2RlX2JpdG1hcCAqcmV0KQoreworCWV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwOworCWVycmNvZGVfdAlyZXR2YWw7CisJX191MzIJCXN0YXJ0LCBlbmQsIHJlYWxfZW5kOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWZzLT53cml0ZV9iaXRtYXBzID0gZXh0MmZzX3dyaXRlX2JpdG1hcHM7CisKKwlzdGFydCA9IDE7CisJZW5kID0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudDsKKwlyZWFsX2VuZCA9IChFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAqIGZzLT5ncm91cF9kZXNjX2NvdW50KTsKKworCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9nZW5lcmljX2JpdG1hcChzdGFydCwgZW5kLCByZWFsX2VuZCwKKwkJCQkJCWRlc2NyLCAmYml0bWFwKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJYml0bWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfSU5PREVfQklUTUFQOworCWJpdG1hcC0+ZnMgPSBmczsKKwliaXRtYXAtPmJhc2VfZXJyb3JfY29kZSA9IEVYVDJfRVRfQkFEX0lOT0RFX01BUks7CisKKwkqcmV0ID0gYml0bWFwOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX2Jsb2NrX2JpdG1hcChleHQyX2ZpbHN5cyBmcywKKwkJCQkgICAgICAgY29uc3QgY2hhciAqZGVzY3IsCisJCQkJICAgICAgIGV4dDJmc19ibG9ja19iaXRtYXAgKnJldCkKK3sKKwlleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcDsKKwllcnJjb2RlX3QJcmV0dmFsOworCV9fdTMyCQlzdGFydCwgZW5kLCByZWFsX2VuZDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlmcy0+d3JpdGVfYml0bWFwcyA9IGV4dDJmc193cml0ZV9iaXRtYXBzOworCisJc3RhcnQgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwllbmQgPSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50LTE7CisJcmVhbF9lbmQgPSAoRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcikKKwkJICAgICogZnMtPmdyb3VwX2Rlc2NfY291bnQpLTEgKyBzdGFydDsKKworCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9nZW5lcmljX2JpdG1hcChzdGFydCwgZW5kLCByZWFsX2VuZCwKKwkJCQkJCWRlc2NyLCAmYml0bWFwKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJYml0bWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQOworCWJpdG1hcC0+ZnMgPSBmczsKKwliaXRtYXAtPmJhc2VfZXJyb3JfY29kZSA9IEVYVDJfRVRfQkFEX0JMT0NLX01BUks7CisKKwkqcmV0ID0gYml0bWFwOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2Z1ZGdlX2lub2RlX2JpdG1hcF9lbmQoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJCWV4dDJfaW5vX3QgZW5kLCBleHQyX2lub190ICpvZW5kKQoreworCUVYVDJfQ0hFQ0tfTUFHSUMoYml0bWFwLCBFWFQyX0VUX01BR0lDX0lOT0RFX0JJVE1BUCk7CisKKwlpZiAoZW5kID4gYml0bWFwLT5yZWFsX2VuZCkKKwkJcmV0dXJuIEVYVDJfRVRfRlVER0VfSU5PREVfQklUTUFQX0VORDsKKwlpZiAob2VuZCkKKwkJKm9lbmQgPSBiaXRtYXAtPmVuZDsKKwliaXRtYXAtPmVuZCA9IGVuZDsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19mdWRnZV9ibG9ja19iaXRtYXBfZW5kKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQlibGtfdCBlbmQsIGJsa190ICpvZW5kKQoreworCUVYVDJfQ0hFQ0tfTUFHSUMoYml0bWFwLCBFWFQyX0VUX01BR0lDX0JMT0NLX0JJVE1BUCk7CisKKwlpZiAoZW5kID4gYml0bWFwLT5yZWFsX2VuZCkKKwkJcmV0dXJuIEVYVDJfRVRfRlVER0VfQkxPQ0tfQklUTUFQX0VORDsKKwlpZiAob2VuZCkKKwkJKm9lbmQgPSBiaXRtYXAtPmVuZDsKKwliaXRtYXAtPmVuZCA9IGVuZDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBleHQyZnNfY2xlYXJfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKQoreworCWlmICghYml0bWFwIHx8IChiaXRtYXAtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfSU5PREVfQklUTUFQKSkKKwkJcmV0dXJuOworCisJbWVtc2V0KGJpdG1hcC0+Yml0bWFwLCAwLAorCSAgICAgICAoc2l6ZV90KSAoKChiaXRtYXAtPnJlYWxfZW5kIC0gYml0bWFwLT5zdGFydCkgLyA4KSArIDEpKTsKK30KKwordm9pZCBleHQyZnNfY2xlYXJfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwKQoreworCWlmICghYml0bWFwIHx8IChiaXRtYXAtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQKSkKKwkJcmV0dXJuOworCisJbWVtc2V0KGJpdG1hcC0+Yml0bWFwLCAwLAorCSAgICAgICAoc2l6ZV90KSAoKChiaXRtYXAtPnJlYWxfZW5kIC0gYml0bWFwLT5zdGFydCkgLyA4KSArIDEpKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iaXRvcHMuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iaXRvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDA4Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG9wcy5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJpdG9wcy5jIC0tLSBCaXRtYXAgZnJvYmJpbmcgY29kZS4gIFNlZSBiaXRvcHMuaCBmb3IgdGhlIGlubGluZWQKKyAqCXJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKyNpZm5kZWYgX0VYVDJfSEFWRV9BU01fQklUT1BTXworCisvKgorICogRm9yIHRoZSBiZW5lZml0IG9mIHRob3NlIHdobyBhcmUgdHJ5aW5nIHRvIHBvcnQgTGludXggdG8gYW5vdGhlcgorICogYXJjaGl0ZWN0dXJlLCBoZXJlIGFyZSBzb21lIEMtbGFuZ3VhZ2UgZXF1aXZhbGVudHMuICBZb3Ugc2hvdWxkCisgKiByZWNvZGUgdGhlc2UgaW4gdGhlIG5hdGl2ZSBhc3NtZWJseSBsYW5ndWFnZSwgaWYgYXQgYWxsIHBvc3NpYmxlLgorICoKKyAqIEMgbGFuZ3VhZ2UgZXF1aXZhbGVudHMgd3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCA5LzI2LzkyLgorICogTW9kaWZpZWQgYnkgUGV0ZSBBLiBaYWl0Y2V2IDcvMTQvOTUgdG8gYmUgcG9ydGFibGUgdG8gYmlnIGVuZGlhbgorICogc3lzdGVtcywgYXMgd2VsbCBhcyBub24tMzIgYml0IHN5c3RlbXMuCisgKi8KKworaW50IGV4dDJmc19zZXRfYml0KHVuc2lnbmVkIGludCBucix2b2lkICogYWRkcikKK3sKKwlpbnQJCW1hc2ssIHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyCSpBRERSID0gKHVuc2lnbmVkIGNoYXIgKikgYWRkcjsKKworCUFERFIgKz0gbnIgPj4gMzsKKwltYXNrID0gMSA8PCAobnIgJiAweDA3KTsKKwlyZXR2YWwgPSBtYXNrICYgKkFERFI7CisJKkFERFIgfD0gbWFzazsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZXh0MmZzX2NsZWFyX2JpdCh1bnNpZ25lZCBpbnQgbnIsIHZvaWQgKiBhZGRyKQoreworCWludAkJbWFzaywgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIJKkFERFIgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOworCisJQUREUiArPSBuciA+PiAzOworCW1hc2sgPSAxIDw8IChuciAmIDB4MDcpOworCXJldHZhbCA9IG1hc2sgJiAqQUREUjsKKwkqQUREUiAmPSB+bWFzazsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZXh0MmZzX3Rlc3RfYml0KHVuc2lnbmVkIGludCBuciwgY29uc3Qgdm9pZCAqIGFkZHIpCit7CisJaW50CQkJbWFzazsKKwljb25zdCB1bnNpZ25lZCBjaGFyCSpBRERSID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgYWRkcjsKKworCUFERFIgKz0gbnIgPj4gMzsKKwltYXNrID0gMSA8PCAobnIgJiAweDA3KTsKKwlyZXR1cm4gKG1hc2sgJiAqQUREUik7Cit9CisKKyNlbmRpZiAgLyogIV9FWFQyX0hBVkVfQVNNX0JJVE9QU18gKi8KKwordm9pZCBleHQyZnNfd2Fybl9iaXRtYXAoZXJyY29kZV90IGVycmNvZGUsIHVuc2lnbmVkIGxvbmcgYXJnLAorCQkJY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7CisjaWZuZGVmIE9NSVRfQ09NX0VSUgorCWlmIChkZXNjcmlwdGlvbikKKwkJYmJfZXJyb3JfbXNnKCIjJWx1IGZvciAlcyIsIGFyZywgZGVzY3JpcHRpb24pOworCWVsc2UKKwkJYmJfZXJyb3JfbXNnKCIjJWx1IiwgYXJnKTsKKyNlbmRpZgorfQorCit2b2lkIGV4dDJmc193YXJuX2JpdG1hcDIoZXh0MmZzX2dlbmVyaWNfYml0bWFwIGJpdG1hcCwKKwkJCSAgICBpbnQgY29kZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisjaWZuZGVmIE9NSVRfQ09NX0VSUgorCWlmIChiaXRtYXAtPmRlc2NyaXB0aW9uKQorCQliYl9lcnJvcl9tc2coIiMlbHUgZm9yICVzIiwgYXJnLCBiaXRtYXAtPmRlc2NyaXB0aW9uKTsKKwllbHNlCisJCWJiX2Vycm9yX21zZygiIyVsdSIsIGFyZyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iaXRvcHMuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjcxYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JpdG9wcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiaXRvcHMuaCAtLS0gQml0bWFwIGZyb2JiaW5nIGNvZGUuICBUaGUgYnl0ZSBzd2FwcGluZyByb3V0aW5lcyBhcmUKKyAqCWFsc28gaW5jbHVkZWQgaGVyZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICoKKyAqIGkzODYgYml0b3BzIG9wZXJhdGlvbnMgdGFrZW4gZnJvbSA8YXNtL2JpdG9wcy5oPiwgQ29weXJpZ2h0IDE5OTIsCisgKiBMaW51cyBUb3J2YWxkcy4KKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gaW50IGV4dDJmc19zZXRfYml0KHVuc2lnbmVkIGludCBucix2b2lkICogYWRkcik7CitleHRlcm4gaW50IGV4dDJmc19jbGVhcl9iaXQodW5zaWduZWQgaW50IG5yLCB2b2lkICogYWRkcik7CitleHRlcm4gaW50IGV4dDJmc190ZXN0X2JpdCh1bnNpZ25lZCBpbnQgbnIsIGNvbnN0IHZvaWQgKiBhZGRyKTsKK2V4dGVybiBfX3UxNiBleHQyZnNfc3dhYjE2KF9fdTE2IHZhbCk7CitleHRlcm4gX191MzIgZXh0MmZzX3N3YWIzMihfX3UzMiB2YWwpOworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIGV4dDJmc19jcHVfdG9fbGUzMih4KSBleHQyZnNfc3dhYjMyKCh4KSkKKyNkZWZpbmUgZXh0MmZzX2xlMzJfdG9fY3B1KHgpIGV4dDJmc19zd2FiMzIoKHgpKQorI2RlZmluZSBleHQyZnNfY3B1X3RvX2xlMTYoeCkgZXh0MmZzX3N3YWIxNigoeCkpCisjZGVmaW5lIGV4dDJmc19sZTE2X3RvX2NwdSh4KSBleHQyZnNfc3dhYjE2KCh4KSkKKyNkZWZpbmUgZXh0MmZzX2NwdV90b19iZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBleHQyZnNfYmUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIGV4dDJmc19jcHVfdG9fYmUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgZXh0MmZzX2JlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2Vsc2UKKyNkZWZpbmUgZXh0MmZzX2NwdV90b19sZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBleHQyZnNfbGUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIGV4dDJmc19jcHVfdG9fbGUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgZXh0MmZzX2xlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBleHQyZnNfY3B1X3RvX2JlMzIoeCkgZXh0MmZzX3N3YWIzMigoeCkpCisjZGVmaW5lIGV4dDJmc19iZTMyX3RvX2NwdSh4KSBleHQyZnNfc3dhYjMyKCh4KSkKKyNkZWZpbmUgZXh0MmZzX2NwdV90b19iZTE2KHgpIGV4dDJmc19zd2FiMTYoKHgpKQorI2RlZmluZSBleHQyZnNfYmUxNl90b19jcHUoeCkgZXh0MmZzX3N3YWIxNigoeCkpCisjZW5kaWYKKworLyoKKyAqIEVYVDJGUyBiaXRtYXAgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICovCisKKy8qIFN1cHBvcnQgZm9yIHNlbmRpbmcgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRoZSBpbmxpbmUgc3Vicm91dGluZXMgKi8KK2V4dGVybiBjb25zdCBjaGFyICpleHQyZnNfYmxvY2tfc3RyaW5nOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4dDJmc19pbm9kZV9zdHJpbmc7CitleHRlcm4gY29uc3QgY2hhciAqZXh0MmZzX21hcmtfc3RyaW5nOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4dDJmc191bm1hcmtfc3RyaW5nOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4dDJmc190ZXN0X3N0cmluZzsKK2V4dGVybiB2b2lkIGV4dDJmc193YXJuX2JpdG1hcChlcnJjb2RlX3QgZXJyY29kZSwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQkgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworZXh0ZXJuIHZvaWQgZXh0MmZzX3dhcm5fYml0bWFwMihleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJCWludCBjb2RlLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK2V4dGVybiBpbnQgZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLCBibGtfdCBibG9jayk7CitleHRlcm4gaW50IGV4dDJmc191bm1hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCSAgICAgICBibGtfdCBibG9jayk7CitleHRlcm4gaW50IGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwgYmxrX3QgYmxvY2spOworCitleHRlcm4gaW50IGV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwgZXh0Ml9pbm9fdCBpbm9kZSk7CitleHRlcm4gaW50IGV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCSAgICAgICBleHQyX2lub190IGlub2RlKTsKK2V4dGVybiBpbnQgZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLCBleHQyX2lub190IGlub2RlKTsKKworZXh0ZXJuIHZvaWQgZXh0MmZzX2Zhc3RfbWFya19ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgYmxrX3QgYmxvY2spOworZXh0ZXJuIHZvaWQgZXh0MmZzX2Zhc3RfdW5tYXJrX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgIGJsa190IGJsb2NrKTsKK2V4dGVybiBpbnQgZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSBibGtfdCBibG9jayk7CisKK2V4dGVybiB2b2lkIGV4dDJmc19mYXN0X21hcmtfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgIGV4dDJfaW5vX3QgaW5vZGUpOworZXh0ZXJuIHZvaWQgZXh0MmZzX2Zhc3RfdW5tYXJrX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgIGV4dDJfaW5vX3QgaW5vZGUpOworZXh0ZXJuIGludCBleHQyZnNfZmFzdF90ZXN0X2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJIGV4dDJfaW5vX3QgaW5vZGUpOworZXh0ZXJuIGJsa190IGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX3N0YXJ0KGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwKTsKK2V4dGVybiBleHQyX2lub190IGV4dDJmc19nZXRfaW5vZGVfYml0bWFwX3N0YXJ0KGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKTsKK2V4dGVybiBibGtfdCBleHQyZnNfZ2V0X2Jsb2NrX2JpdG1hcF9lbmQoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXApOworZXh0ZXJuIGV4dDJfaW5vX3QgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfZW5kKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKTsKKworZXh0ZXJuIHZvaWQgZXh0MmZzX21hcmtfYmxvY2tfYml0bWFwX3JhbmdlKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICBibGtfdCBibG9jaywgaW50IG51bSk7CitleHRlcm4gdm9pZCBleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICBibGtfdCBibG9jaywgaW50IG51bSk7CitleHRlcm4gaW50IGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICBibGtfdCBibG9jaywgaW50IG51bSk7CitleHRlcm4gdm9pZCBleHQyZnNfZmFzdF9tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJCWJsa190IGJsb2NrLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGV4dDJmc19mYXN0X3VubWFya19ibG9ja19iaXRtYXBfcmFuZ2UoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCQkgIGJsa190IGJsb2NrLCBpbnQgbnVtKTsKK2V4dGVybiBpbnQgZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXBfcmFuZ2UoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgICAgICBibGtfdCBibG9jaywgaW50IG51bSk7CitleHRlcm4gdm9pZCBleHQyZnNfc2V0X2JpdG1hcF9wYWRkaW5nKGV4dDJmc19nZW5lcmljX2JpdG1hcCBtYXApOworCisvKiBUaGVzZSB0d28gcm91dGluZXMgbW92ZWQgdG8gZ2VuX2JpdG1hcC5jICovCitleHRlcm4gaW50IGV4dDJmc19tYXJrX2dlbmVyaWNfYml0bWFwKGV4dDJmc19nZW5lcmljX2JpdG1hcCBiaXRtYXAsCisJCQkJCSBfX3UzMiBiaXRubyk7CitleHRlcm4gaW50IGV4dDJmc191bm1hcmtfZ2VuZXJpY19iaXRtYXAoZXh0MmZzX2dlbmVyaWNfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgYmxrX3QgYml0bm8pOwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Jsb2NrLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQwNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Jsb2NrLmMKQEAgLTAsMCArMSw0MzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJsb2NrLmMgLS0tIGl0ZXJhdGUgb3ZlciBhbGwgYmxvY2tzIGluIGFuIGlub2RlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IGJsb2NrX2NvbnRleHQgeworCWV4dDJfZmlsc3lzCWZzOworCWludCAoKmZ1bmMpKGV4dDJfZmlsc3lzCWZzLAorCQkgICAgYmxrX3QJKmJsb2NrbnIsCisJCSAgICBlMl9ibGtjbnRfdAliY291bnQsCisJCSAgICBibGtfdAlyZWZfYmxrLAorCQkgICAgaW50CQlyZWZfb2Zmc2V0LAorCQkgICAgdm9pZAkqcHJpdl9kYXRhKTsKKwllMl9ibGtjbnRfdAliY291bnQ7CisJaW50CQlic2l6ZTsKKwlpbnQJCWZsYWdzOworCWVycmNvZGVfdAllcnJjb2RlOworCWNoYXIJKmluZF9idWY7CisJY2hhcgkqZGluZF9idWY7CisJY2hhcgkqdGluZF9idWY7CisJdm9pZAkqcHJpdl9kYXRhOworfTsKKworc3RhdGljIGludCBibG9ja19pdGVyYXRlX2luZChibGtfdCAqaW5kX2Jsb2NrLCBibGtfdCByZWZfYmxvY2ssCisJCQkgICAgIGludCByZWZfb2Zmc2V0LCBzdHJ1Y3QgYmxvY2tfY29udGV4dCAqY3R4KQoreworCWludAlyZXQgPSAwLCBjaGFuZ2VkID0gMDsKKwlpbnQJaSwgZmxhZ3MsIGxpbWl0LCBvZmZzZXQ7CisJYmxrX3QJKmJsb2NrX25yOworCisJbGltaXQgPSBjdHgtPmZzLT5ibG9ja3NpemUgPj4gMjsKKwlpZiAoIShjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19ERVBUSF9UUkFWRVJTRSkgJiYKKwkgICAgIShjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19EQVRBX09OTFkpKQorCQlyZXQgPSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgaW5kX2Jsb2NrLAorCQkJCSAgIEJMT0NLX0NPVU5UX0lORCwgcmVmX2Jsb2NrLAorCQkJCSAgIHJlZl9vZmZzZXQsIGN0eC0+cHJpdl9kYXRhKTsKKwlpZiAoISppbmRfYmxvY2sgfHwgKHJldCAmIEJMT0NLX0FCT1JUKSkgeworCQljdHgtPmJjb3VudCArPSBsaW1pdDsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCppbmRfYmxvY2sgPj0gY3R4LT5mcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IHx8CisJICAgICppbmRfYmxvY2sgPCBjdHgtPmZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSB7CisJCWN0eC0+ZXJyY29kZSA9IEVYVDJfRVRfQkFEX0lORF9CTE9DSzsKKwkJcmV0IHw9IEJMT0NLX0VSUk9SOworCQlyZXR1cm4gcmV0OworCX0KKwljdHgtPmVycmNvZGUgPSBleHQyZnNfcmVhZF9pbmRfYmxvY2soY3R4LT5mcywgKmluZF9ibG9jaywKKwkJCQkJICAgICBjdHgtPmluZF9idWYpOworCWlmIChjdHgtPmVycmNvZGUpIHsKKwkJcmV0IHw9IEJMT0NLX0VSUk9SOworCQlyZXR1cm4gcmV0OworCX0KKworCWJsb2NrX25yID0gKGJsa190ICopIGN0eC0+aW5kX2J1ZjsKKwlvZmZzZXQgPSAwOworCWlmIChjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyssIGN0eC0+YmNvdW50KyssIGJsb2NrX25yKyspIHsKKwkJCWZsYWdzID0gKCpjdHgtPmZ1bmMpKGN0eC0+ZnMsIGJsb2NrX25yLCBjdHgtPmJjb3VudCwKKwkJCQkJICAgICAqaW5kX2Jsb2NrLCBvZmZzZXQsCisJCQkJCSAgICAgY3R4LT5wcml2X2RhdGEpOworCQkJY2hhbmdlZAl8PSBmbGFnczsKKwkJCWlmIChmbGFncyAmIEJMT0NLX0FCT1JUKSB7CisJCQkJcmV0IHw9IEJMT0NLX0FCT1JUOworCQkJCWJyZWFrOworCQkJfQorCQkJb2Zmc2V0ICs9IHNpemVvZihibGtfdCk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgY3R4LT5iY291bnQrKywgYmxvY2tfbnIrKykgeworCQkJaWYgKCpibG9ja19uciA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJZmxhZ3MgPSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgYmxvY2tfbnIsIGN0eC0+YmNvdW50LAorCQkJCQkgICAgICppbmRfYmxvY2ssIG9mZnNldCwKKwkJCQkJICAgICBjdHgtPnByaXZfZGF0YSk7CisJCQljaGFuZ2VkCXw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgQkxPQ0tfQUJPUlQpIHsKKwkJCQlyZXQgfD0gQkxPQ0tfQUJPUlQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmZzZXQgKz0gc2l6ZW9mKGJsa190KTsKKwkJfQorCX0KKwlpZiAoY2hhbmdlZCAmIEJMT0NLX0NIQU5HRUQpIHsKKwkJY3R4LT5lcnJjb2RlID0gZXh0MmZzX3dyaXRlX2luZF9ibG9jayhjdHgtPmZzLCAqaW5kX2Jsb2NrLAorCQkJCQkJICAgICAgY3R4LT5pbmRfYnVmKTsKKwkJaWYgKGN0eC0+ZXJyY29kZSkKKwkJCXJldCB8PSBCTE9DS19FUlJPUiB8IEJMT0NLX0FCT1JUOworCX0KKwlpZiAoKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFKSAmJgorCSAgICAhKGN0eC0+ZmxhZ3MgJiBCTE9DS19GTEFHX0RBVEFfT05MWSkgJiYKKwkgICAgIShyZXQgJiBCTE9DS19BQk9SVCkpCisJCXJldCB8PSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgaW5kX2Jsb2NrLAorCQkJCSAgICBCTE9DS19DT1VOVF9JTkQsIHJlZl9ibG9jaywKKwkJCQkgICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfaXRlcmF0ZV9kaW5kKGJsa190ICpkaW5kX2Jsb2NrLCBibGtfdCByZWZfYmxvY2ssCisJCQkgICAgICBpbnQgcmVmX29mZnNldCwgc3RydWN0IGJsb2NrX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQJcmV0ID0gMCwgY2hhbmdlZCA9IDA7CisJaW50CWksIGZsYWdzLCBsaW1pdCwgb2Zmc2V0OworCWJsa190CSpibG9ja19ucjsKKworCWxpbWl0ID0gY3R4LT5mcy0+YmxvY2tzaXplID4+IDI7CisJaWYgKCEoY3R4LT5mbGFncyAmIChCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFIHwKKwkJCSAgICBCTE9DS19GTEFHX0RBVEFfT05MWSkpKQorCQlyZXQgPSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgZGluZF9ibG9jaywKKwkJCQkgICBCTE9DS19DT1VOVF9ESU5ELCByZWZfYmxvY2ssCisJCQkJICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOworCWlmICghKmRpbmRfYmxvY2sgfHwgKHJldCAmIEJMT0NLX0FCT1JUKSkgeworCQljdHgtPmJjb3VudCArPSBsaW1pdCpsaW1pdDsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCpkaW5kX2Jsb2NrID49IGN0eC0+ZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCB8fAorCSAgICAqZGluZF9ibG9jayA8IGN0eC0+ZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHsKKwkJY3R4LT5lcnJjb2RlID0gRVhUMl9FVF9CQURfRElORF9CTE9DSzsKKwkJcmV0IHw9IEJMT0NLX0VSUk9SOworCQlyZXR1cm4gcmV0OworCX0KKwljdHgtPmVycmNvZGUgPSBleHQyZnNfcmVhZF9pbmRfYmxvY2soY3R4LT5mcywgKmRpbmRfYmxvY2ssCisJCQkJCSAgICAgY3R4LT5kaW5kX2J1Zik7CisJaWYgKGN0eC0+ZXJyY29kZSkgeworCQlyZXQgfD0gQkxPQ0tfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCisJYmxvY2tfbnIgPSAoYmxrX3QgKikgY3R4LT5kaW5kX2J1ZjsKKwlvZmZzZXQgPSAwOworCWlmIChjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyssIGJsb2NrX25yKyspIHsKKwkJCWZsYWdzID0gYmxvY2tfaXRlcmF0ZV9pbmQoYmxvY2tfbnIsCisJCQkJCQkgICpkaW5kX2Jsb2NrLCBvZmZzZXQsCisJCQkJCQkgIGN0eCk7CisJCQljaGFuZ2VkIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpKSB7CisJCQkJcmV0IHw9IGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpOworCQkJCWJyZWFrOworCQkJfQorCQkJb2Zmc2V0ICs9IHNpemVvZihibGtfdCk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgYmxvY2tfbnIrKykgeworCQkJaWYgKCpibG9ja19uciA9PSAwKSB7CisJCQkJY3R4LT5iY291bnQgKz0gbGltaXQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmbGFncyA9IGJsb2NrX2l0ZXJhdGVfaW5kKGJsb2NrX25yLAorCQkJCQkJICAqZGluZF9ibG9jaywgb2Zmc2V0LAorCQkJCQkJICBjdHgpOworCQkJY2hhbmdlZCB8PSBmbGFnczsKKwkJCWlmIChmbGFncyAmIChCTE9DS19BQk9SVCB8IEJMT0NLX0VSUk9SKSkgeworCQkJCXJldCB8PSBmbGFncyAmIChCTE9DS19BQk9SVCB8IEJMT0NLX0VSUk9SKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9mZnNldCArPSBzaXplb2YoYmxrX3QpOworCQl9CisJfQorCWlmIChjaGFuZ2VkICYgQkxPQ0tfQ0hBTkdFRCkgeworCQljdHgtPmVycmNvZGUgPSBleHQyZnNfd3JpdGVfaW5kX2Jsb2NrKGN0eC0+ZnMsICpkaW5kX2Jsb2NrLAorCQkJCQkJICAgICAgY3R4LT5kaW5kX2J1Zik7CisJCWlmIChjdHgtPmVycmNvZGUpCisJCQlyZXQgfD0gQkxPQ0tfRVJST1IgfCBCTE9DS19BQk9SVDsKKwl9CisJaWYgKChjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19ERVBUSF9UUkFWRVJTRSkgJiYKKwkgICAgIShjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19EQVRBX09OTFkpICYmCisJICAgICEocmV0ICYgQkxPQ0tfQUJPUlQpKQorCQlyZXQgfD0gKCpjdHgtPmZ1bmMpKGN0eC0+ZnMsIGRpbmRfYmxvY2ssCisJCQkJICAgIEJMT0NLX0NPVU5UX0RJTkQsIHJlZl9ibG9jaywKKwkJCQkgICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfaXRlcmF0ZV90aW5kKGJsa190ICp0aW5kX2Jsb2NrLCBibGtfdCByZWZfYmxvY2ssCisJCQkgICAgICBpbnQgcmVmX29mZnNldCwgc3RydWN0IGJsb2NrX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQJcmV0ID0gMCwgY2hhbmdlZCA9IDA7CisJaW50CWksIGZsYWdzLCBsaW1pdCwgb2Zmc2V0OworCWJsa190CSpibG9ja19ucjsKKworCWxpbWl0ID0gY3R4LT5mcy0+YmxvY2tzaXplID4+IDI7CisJaWYgKCEoY3R4LT5mbGFncyAmIChCTE9DS19GTEFHX0RFUFRIX1RSQVZFUlNFIHwKKwkJCSAgICBCTE9DS19GTEFHX0RBVEFfT05MWSkpKQorCQlyZXQgPSAoKmN0eC0+ZnVuYykoY3R4LT5mcywgdGluZF9ibG9jaywKKwkJCQkgICBCTE9DS19DT1VOVF9USU5ELCByZWZfYmxvY2ssCisJCQkJICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOworCWlmICghKnRpbmRfYmxvY2sgfHwgKHJldCAmIEJMT0NLX0FCT1JUKSkgeworCQljdHgtPmJjb3VudCArPSBsaW1pdCpsaW1pdCpsaW1pdDsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCp0aW5kX2Jsb2NrID49IGN0eC0+ZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCB8fAorCSAgICAqdGluZF9ibG9jayA8IGN0eC0+ZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHsKKwkJY3R4LT5lcnJjb2RlID0gRVhUMl9FVF9CQURfVElORF9CTE9DSzsKKwkJcmV0IHw9IEJMT0NLX0VSUk9SOworCQlyZXR1cm4gcmV0OworCX0KKwljdHgtPmVycmNvZGUgPSBleHQyZnNfcmVhZF9pbmRfYmxvY2soY3R4LT5mcywgKnRpbmRfYmxvY2ssCisJCQkJCSAgICAgY3R4LT50aW5kX2J1Zik7CisJaWYgKGN0eC0+ZXJyY29kZSkgeworCQlyZXQgfD0gQkxPQ0tfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCisJYmxvY2tfbnIgPSAoYmxrX3QgKikgY3R4LT50aW5kX2J1ZjsKKwlvZmZzZXQgPSAwOworCWlmIChjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19BUFBFTkQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyssIGJsb2NrX25yKyspIHsKKwkJCWZsYWdzID0gYmxvY2tfaXRlcmF0ZV9kaW5kKGJsb2NrX25yLAorCQkJCQkJICAgKnRpbmRfYmxvY2ssCisJCQkJCQkgICBvZmZzZXQsIGN0eCk7CisJCQljaGFuZ2VkIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpKSB7CisJCQkJcmV0IHw9IGZsYWdzICYgKEJMT0NLX0FCT1JUIHwgQkxPQ0tfRVJST1IpOworCQkJCWJyZWFrOworCQkJfQorCQkJb2Zmc2V0ICs9IHNpemVvZihibGtfdCk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgYmxvY2tfbnIrKykgeworCQkJaWYgKCpibG9ja19uciA9PSAwKSB7CisJCQkJY3R4LT5iY291bnQgKz0gbGltaXQqbGltaXQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmbGFncyA9IGJsb2NrX2l0ZXJhdGVfZGluZChibG9ja19uciwKKwkJCQkJCSAgICp0aW5kX2Jsb2NrLAorCQkJCQkJICAgb2Zmc2V0LCBjdHgpOworCQkJY2hhbmdlZCB8PSBmbGFnczsKKwkJCWlmIChmbGFncyAmIChCTE9DS19BQk9SVCB8IEJMT0NLX0VSUk9SKSkgeworCQkJCXJldCB8PSBmbGFncyAmIChCTE9DS19BQk9SVCB8IEJMT0NLX0VSUk9SKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9mZnNldCArPSBzaXplb2YoYmxrX3QpOworCQl9CisJfQorCWlmIChjaGFuZ2VkICYgQkxPQ0tfQ0hBTkdFRCkgeworCQljdHgtPmVycmNvZGUgPSBleHQyZnNfd3JpdGVfaW5kX2Jsb2NrKGN0eC0+ZnMsICp0aW5kX2Jsb2NrLAorCQkJCQkJICAgICAgY3R4LT50aW5kX2J1Zik7CisJCWlmIChjdHgtPmVycmNvZGUpCisJCQlyZXQgfD0gQkxPQ0tfRVJST1IgfCBCTE9DS19BQk9SVDsKKwl9CisJaWYgKChjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19ERVBUSF9UUkFWRVJTRSkgJiYKKwkgICAgIShjdHgtPmZsYWdzICYgQkxPQ0tfRkxBR19EQVRBX09OTFkpICYmCisJICAgICEocmV0ICYgQkxPQ0tfQUJPUlQpKQorCQlyZXQgfD0gKCpjdHgtPmZ1bmMpKGN0eC0+ZnMsIHRpbmRfYmxvY2ssCisJCQkJICAgIEJMT0NLX0NPVU5UX1RJTkQsIHJlZl9ibG9jaywKKwkJCQkgICAgcmVmX29mZnNldCwgY3R4LT5wcml2X2RhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworZXJyY29kZV90IGV4dDJmc19ibG9ja19pdGVyYXRlMihleHQyX2ZpbHN5cyBmcywKKwkJCQlleHQyX2lub190IGlubywKKwkJCQlpbnQJZmxhZ3MsCisJCQkJY2hhciAqYmxvY2tfYnVmLAorCQkJCWludCAoKmZ1bmMpKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkgICAgYmxrX3QJKmJsb2NrbnIsCisJCQkJCSAgICBlMl9ibGtjbnRfdAlibG9ja2NudCwKKwkJCQkJICAgIGJsa190CXJlZl9ibGssCisJCQkJCSAgICBpbnQJCXJlZl9vZmZzZXQsCisJCQkJCSAgICB2b2lkCSpwcml2X2RhdGEpLAorCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwlpbnQJaTsKKwlpbnQJZ290X2lub2RlID0gMDsKKwlpbnQJcmV0ID0gMDsKKwlibGtfdAlibG9ja3NbRVhUMl9OX0JMT0NLU107CS8qIGRpcmVjdG9yeSBkYXRhIGJsb2NrcyAqLworCXN0cnVjdCBleHQyX2lub2RlIGlub2RlOworCWVycmNvZGVfdAlyZXR2YWw7CisJc3RydWN0IGJsb2NrX2NvbnRleHQgY3R4OworCWludAlsaW1pdDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGxpbWl0IGxhcmdlIGZpbGVzCisJICovCisJaWYgKGZsYWdzICYgQkxPQ0tfRkxBR19OT19MQVJHRSkgeworCQljdHguZXJyY29kZSA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJCWlmIChjdHguZXJyY29kZSkKKwkJCXJldHVybiBjdHguZXJyY29kZTsKKwkJZ290X2lub2RlID0gMTsKKwkJaWYgKCFMSU5VWF9TX0lTRElSKGlub2RlLmlfbW9kZSkgJiYKKwkJICAgIChpbm9kZS5pX3NpemVfaGlnaCAhPSAwKSkKKwkJCXJldHVybiBFWFQyX0VUX0ZJTEVfVE9PX0JJRzsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X2Jsb2NrcyhmcywgaW5vLCBibG9ja3MpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlsaW1pdCA9IGZzLT5ibG9ja3NpemUgPj4gMjsKKworCWN0eC5mcyA9IGZzOworCWN0eC5mdW5jID0gZnVuYzsKKwljdHgucHJpdl9kYXRhID0gcHJpdl9kYXRhOworCWN0eC5mbGFncyA9IGZsYWdzOworCWN0eC5iY291bnQgPSAwOworCWlmIChibG9ja19idWYpIHsKKwkJY3R4LmluZF9idWYgPSBibG9ja19idWY7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSAqIDMsICZjdHguaW5kX2J1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwljdHguZGluZF9idWYgPSBjdHguaW5kX2J1ZiArIGZzLT5ibG9ja3NpemU7CisJY3R4LnRpbmRfYnVmID0gY3R4LmRpbmRfYnVmICsgZnMtPmJsb2Nrc2l6ZTsKKworCS8qCisJICogSXRlcmF0ZSBvdmVyIHRoZSBIVVJEIHRyYW5zbGF0b3IgYmxvY2sgKGlmIHByZXNlbnQpCisJICovCisJaWYgKChmcy0+c3VwZXItPnNfY3JlYXRvcl9vcyA9PSBFWFQyX09TX0hVUkQpICYmCisJICAgICEoZmxhZ3MgJiBCTE9DS19GTEFHX0RBVEFfT05MWSkpIHsKKwkJY3R4LmVycmNvZGUgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCQlpZiAoY3R4LmVycmNvZGUpCisJCQlnb3RvIGFib3J0X2V4aXQ7CisJCWdvdF9pbm9kZSA9IDE7CisJCWlmIChpbm9kZS5vc2QxLmh1cmQxLmhfaV90cmFuc2xhdG9yKSB7CisJCQlyZXQgfD0gKCpjdHguZnVuYykoZnMsCisJCQkJCSAgICZpbm9kZS5vc2QxLmh1cmQxLmhfaV90cmFuc2xhdG9yLAorCQkJCQkgICBCTE9DS19DT1VOVF9UUkFOU0xBVE9SLAorCQkJCQkgICAwLCAwLCBwcml2X2RhdGEpOworCQkJaWYgKHJldCAmIEJMT0NLX0FCT1JUKQorCQkJCWdvdG8gYWJvcnRfZXhpdDsKKwkJfQorCX0KKworCS8qCisJICogSXRlcmF0ZSBvdmVyIG5vcm1hbCBkYXRhIGJsb2NrcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBFWFQyX05ESVJfQkxPQ0tTOyBpKyssIGN0eC5iY291bnQrKykgeworCQlpZiAoYmxvY2tzW2ldIHx8IChmbGFncyAmIEJMT0NLX0ZMQUdfQVBQRU5EKSkgeworCQkJcmV0IHw9ICgqY3R4LmZ1bmMpKGZzLCAmYmxvY2tzW2ldLAorCQkJCQkgICAgY3R4LmJjb3VudCwgMCwgaSwgcHJpdl9kYXRhKTsKKwkJCWlmIChyZXQgJiBCTE9DS19BQk9SVCkKKwkJCQlnb3RvIGFib3J0X2V4aXQ7CisJCX0KKwl9CisJaWYgKCooYmxvY2tzICsgRVhUMl9JTkRfQkxPQ0spIHx8IChmbGFncyAmIEJMT0NLX0ZMQUdfQVBQRU5EKSkgeworCQlyZXQgfD0gYmxvY2tfaXRlcmF0ZV9pbmQoYmxvY2tzICsgRVhUMl9JTkRfQkxPQ0ssCisJCQkJCSAwLCBFWFQyX0lORF9CTE9DSywgJmN0eCk7CisJCWlmIChyZXQgJiBCTE9DS19BQk9SVCkKKwkJCWdvdG8gYWJvcnRfZXhpdDsKKwl9IGVsc2UKKwkJY3R4LmJjb3VudCArPSBsaW1pdDsKKwlpZiAoKihibG9ja3MgKyBFWFQyX0RJTkRfQkxPQ0spIHx8IChmbGFncyAmIEJMT0NLX0ZMQUdfQVBQRU5EKSkgeworCQlyZXQgfD0gYmxvY2tfaXRlcmF0ZV9kaW5kKGJsb2NrcyArIEVYVDJfRElORF9CTE9DSywKKwkJCQkJICAwLCBFWFQyX0RJTkRfQkxPQ0ssICZjdHgpOworCQlpZiAocmV0ICYgQkxPQ0tfQUJPUlQpCisJCQlnb3RvIGFib3J0X2V4aXQ7CisJfSBlbHNlCisJCWN0eC5iY291bnQgKz0gbGltaXQgKiBsaW1pdDsKKwlpZiAoKihibG9ja3MgKyBFWFQyX1RJTkRfQkxPQ0spIHx8IChmbGFncyAmIEJMT0NLX0ZMQUdfQVBQRU5EKSkgeworCQlyZXQgfD0gYmxvY2tfaXRlcmF0ZV90aW5kKGJsb2NrcyArIEVYVDJfVElORF9CTE9DSywKKwkJCQkJICAwLCBFWFQyX1RJTkRfQkxPQ0ssICZjdHgpOworCQlpZiAocmV0ICYgQkxPQ0tfQUJPUlQpCisJCQlnb3RvIGFib3J0X2V4aXQ7CisJfQorCithYm9ydF9leGl0OgorCWlmIChyZXQgJiBCTE9DS19DSEFOR0VEKSB7CisJCWlmICghZ290X2lub2RlKSB7CisJCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWZvciAoaT0wOyBpIDwgRVhUMl9OX0JMT0NLUzsgaSsrKQorCQkJaW5vZGUuaV9ibG9ja1tpXSA9IGJsb2Nrc1tpXTsKKwkJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmICghYmxvY2tfYnVmKQorCQlleHQyZnNfZnJlZV9tZW0oJmN0eC5pbmRfYnVmKTsKKworCXJldHVybiAocmV0ICYgQkxPQ0tfRVJST1IpID8gY3R4LmVycmNvZGUgOiAwOworfQorCisvKgorICogRW11bGF0ZSB0aGUgb2xkIGV4dDJmc19ibG9ja19pdGVyYXRlIGZ1bmN0aW9uIQorICovCisKK3N0cnVjdCB4bGF0ZSB7CisJaW50ICgqZnVuYykoZXh0Ml9maWxzeXMJZnMsCisJCSAgICBibGtfdAkqYmxvY2tuciwKKwkJICAgIGludAkJYmNvdW50LAorCQkgICAgdm9pZAkqcHJpdl9kYXRhKTsKKwl2b2lkICpyZWFsX3ByaXZhdGU7Cit9OworCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorc3RhdGljIGludCB4bGF0ZV9mdW5jKGV4dDJfZmlsc3lzIGZzLCBibGtfdCAqYmxvY2tuciwgZTJfYmxrY250X3QgYmxvY2tjbnQsCisJCSAgICAgIGJsa190IHJlZl9ibG9jayBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCSAgICAgIGludCByZWZfb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCB4bGF0ZSAqeGwgPSAoc3RydWN0IHhsYXRlICopIHByaXZfZGF0YTsKKworCXJldHVybiAoKnhsLT5mdW5jKShmcywgYmxvY2tuciwgKGludCkgYmxvY2tjbnQsIHhsLT5yZWFsX3ByaXZhdGUpOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUoZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgICAgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgICAgaW50CWZsYWdzLAorCQkJICAgICAgIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCSAgICAgICBpbnQgKCpmdW5jKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgYmxrX3QJKmJsb2NrbnIsCisJCQkJCSAgIGludAlibG9ja2NudCwKKwkJCQkJICAgdm9pZAkqcHJpdl9kYXRhKSwKKwkJCSAgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHhsYXRlIHhsOworCisJeGwucmVhbF9wcml2YXRlID0gcHJpdl9kYXRhOworCXhsLmZ1bmMgPSBmdW5jOworCisJcmV0dXJuIGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgaW5vLCBCTE9DS19GTEFHX05PX0xBUkdFIHwgZmxhZ3MsCisJCQkJICAgICBibG9ja19idWYsIHhsYXRlX2Z1bmMsICZ4bCk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYm1hcC5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZiMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JtYXAuYwpAQCAtMCwwICsxLDI2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYm1hcC5jIC0tLSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19ibWFwKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkJICAgICBjaGFyICpibG9ja19idWYsIGludCBibWFwX2ZsYWdzLAorCQkJICAgICBibGtfdCBibG9jaywgYmxrX3QgKnBoeXNfYmxrKTsKKworI2RlZmluZSBpbm9kZV9ibWFwKGlub2RlLCBucikgKChpbm9kZSktPmlfYmxvY2tbKG5yKV0pCisKK3N0YXRpYyBlcnJjb2RlX3QgYmxvY2tfaW5kX2JtYXAoZXh0Ml9maWxzeXMgZnMsIGludCBmbGFncywKKwkJCQkJICAgICAgYmxrX3QgaW5kLCBjaGFyICpibG9ja19idWYsCisJCQkJCSAgICAgIGludCAqYmxvY2tzX2FsbG9jLAorCQkJCQkgICAgICBibGtfdCBuciwgYmxrX3QgKnJldF9ibGspCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlibGtfdAkJYjsKKworCWlmICghaW5kKSB7CisJCWlmIChmbGFncyAmIEJNQVBfU0VUKQorCQkJcmV0dXJuIEVYVDJfRVRfU0VUX0JNQVBfTk9fSU5EOworCQkqcmV0X2JsayA9IDA7CisJCXJldHVybiAwOworCX0KKwlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgaW5kLCAxLCBibG9ja19idWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoZmxhZ3MgJiBCTUFQX1NFVCkgeworCQliID0gKnJldF9ibGs7CisjaWYgQkJfQklHX0VORElBTgorCQlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCQkgICAgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKSkKKwkJCWIgPSBleHQyZnNfc3dhYjMyKGIpOworI2VuZGlmCisJCSgoYmxrX3QgKikgYmxvY2tfYnVmKVtucl0gPSBiOworCQlyZXR1cm4gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBpbmQsIDEsIGJsb2NrX2J1Zik7CisJfQorCisJYiA9ICgoYmxrX3QgKikgYmxvY2tfYnVmKVtucl07CisKKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkgICAgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQpKQorCQliID0gZXh0MmZzX3N3YWIzMihiKTsKKyNlbmRpZgorCisJaWYgKCFiICYmIChmbGFncyAmIEJNQVBfQUxMT0MpKSB7CisJCWIgPSBuciA/ICgoYmxrX3QgKikgYmxvY2tfYnVmKVtuci0xXSA6IDA7CisJCXJldHZhbCA9IGV4dDJmc19hbGxvY19ibG9jayhmcywgYiwKKwkJCQkJICAgIGJsb2NrX2J1ZiArIGZzLT5ibG9ja3NpemUsICZiKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisKKyNpZiBCQl9CSUdfRU5ESUFOCisJCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKQorCQkJKChibGtfdCAqKSBibG9ja19idWYpW25yXSA9IGV4dDJmc19zd2FiMzIoYik7CisJCWVsc2UKKyNlbmRpZgorCQkJKChibGtfdCAqKSBibG9ja19idWYpW25yXSA9IGI7CisKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBpbmQsIDEsIGJsb2NrX2J1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCisJCSgqYmxvY2tzX2FsbG9jKSsrOworCX0KKworCSpyZXRfYmxrID0gYjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBibG9ja19kaW5kX2JtYXAoZXh0Ml9maWxzeXMgZnMsIGludCBmbGFncywKKwkJCQkJICAgICAgIGJsa190IGRpbmQsIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCQkJICAgICAgIGludCAqYmxvY2tzX2FsbG9jLAorCQkJCQkgICAgICAgYmxrX3QgbnIsIGJsa190ICpyZXRfYmxrKQoreworCWJsa190CQliOworCWVycmNvZGVfdAlyZXR2YWw7CisJYmxrX3QJCWFkZHJfcGVyX2Jsb2NrOworCisJYWRkcl9wZXJfYmxvY2sgPSAoYmxrX3QpIGZzLT5ibG9ja3NpemUgPj4gMjsKKworCXJldHZhbCA9IGJsb2NrX2luZF9ibWFwKGZzLCBmbGFncyAmIH5CTUFQX1NFVCwgZGluZCwgYmxvY2tfYnVmLAorCQkJCWJsb2Nrc19hbGxvYywgbnIgLyBhZGRyX3Blcl9ibG9jaywgJmIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gYmxvY2tfaW5kX2JtYXAoZnMsIGZsYWdzLCBiLCBibG9ja19idWYsIGJsb2Nrc19hbGxvYywKKwkJCQluciAlIGFkZHJfcGVyX2Jsb2NrLCByZXRfYmxrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IGJsb2NrX3RpbmRfYm1hcChleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLAorCQkJCQkgICAgICAgYmxrX3QgdGluZCwgY2hhciAqYmxvY2tfYnVmLAorCQkJCQkgICAgICAgaW50ICpibG9ja3NfYWxsb2MsCisJCQkJCSAgICAgICBibGtfdCBuciwgYmxrX3QgKnJldF9ibGspCit7CisJYmxrX3QJCWI7CisJZXJyY29kZV90CXJldHZhbDsKKwlibGtfdAkJYWRkcl9wZXJfYmxvY2s7CisKKwlhZGRyX3Blcl9ibG9jayA9IChibGtfdCkgZnMtPmJsb2Nrc2l6ZSA+PiAyOworCisJcmV0dmFsID0gYmxvY2tfZGluZF9ibWFwKGZzLCBmbGFncyAmIH5CTUFQX1NFVCwgdGluZCwgYmxvY2tfYnVmLAorCQkJCSBibG9ja3NfYWxsb2MsIG5yIC8gYWRkcl9wZXJfYmxvY2ssICZiKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IGJsb2NrX2luZF9ibWFwKGZzLCBmbGFncywgYiwgYmxvY2tfYnVmLCBibG9ja3NfYWxsb2MsCisJCQkJbnIgJSBhZGRyX3Blcl9ibG9jaywgcmV0X2Jsayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19ibWFwKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkgICAgICBjaGFyICpibG9ja19idWYsIGludCBibWFwX2ZsYWdzLCBibGtfdCBibG9jaywKKwkJICAgICAgYmxrX3QgKnBoeXNfYmxrKQoreworCXN0cnVjdCBleHQyX2lub2RlIGlub2RlX2J1ZjsKKwlibGtfdCBhZGRyX3Blcl9ibG9jazsKKwlibGtfdAliOworCWNoYXIJKmJ1ZiA9IE5VTEw7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisJaW50CQlibG9ja3NfYWxsb2MgPSAwLCBpbm9kZV9kaXJ0eSA9IDA7CisKKwlpZiAoIShibWFwX2ZsYWdzICYgQk1BUF9TRVQpKQorCQkqcGh5c19ibGsgPSAwOworCisJLyogUmVhZCBpbm9kZSBzdHJ1Y3R1cmUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCFpbm9kZSkgeworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGVfYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlub2RlID0gJmlub2RlX2J1ZjsKKwl9CisJYWRkcl9wZXJfYmxvY2sgPSAoYmxrX3QpIGZzLT5ibG9ja3NpemUgPj4gMjsKKworCWlmICghYmxvY2tfYnVmKSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUgKiAyLCAmYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJsb2NrX2J1ZiA9IGJ1ZjsKKwl9CisKKwlpZiAoYmxvY2sgPCBFWFQyX05ESVJfQkxPQ0tTKSB7CisJCWlmIChibWFwX2ZsYWdzICYgQk1BUF9TRVQpIHsKKwkJCWIgPSAqcGh5c19ibGs7CisjaWYgQkJfQklHX0VORElBTgorCQkJaWYgKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkpCisJCQkJYiA9IGV4dDJmc19zd2FiMzIoYik7CisjZW5kaWYKKwkJCWlub2RlX2JtYXAoaW5vZGUsIGJsb2NrKSA9IGI7CisJCQlpbm9kZV9kaXJ0eSsrOworCQkJZ290byBkb25lOworCQl9CisKKwkJKnBoeXNfYmxrID0gaW5vZGVfYm1hcChpbm9kZSwgYmxvY2spOworCQliID0gYmxvY2sgPyBpbm9kZV9ibWFwKGlub2RlLCBibG9jay0xKSA6IDA7CisKKwkJaWYgKCgqcGh5c19ibGsgPT0gMCkgJiYgKGJtYXBfZmxhZ3MgJiBCTUFQX0FMTE9DKSkgeworCQkJcmV0dmFsID0gZXh0MmZzX2FsbG9jX2Jsb2NrKGZzLCBiLCBibG9ja19idWYsICZiKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBkb25lOworCQkJaW5vZGVfYm1hcChpbm9kZSwgYmxvY2spID0gYjsKKwkJCWJsb2Nrc19hbGxvYysrOworCQkJKnBoeXNfYmxrID0gYjsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCisJLyogSW5kaXJlY3QgYmxvY2sgKi8KKwlibG9jayAtPSBFWFQyX05ESVJfQkxPQ0tTOworCWlmIChibG9jayA8IGFkZHJfcGVyX2Jsb2NrKSB7CisJCWIgPSBpbm9kZV9ibWFwKGlub2RlLCBFWFQyX0lORF9CTE9DSyk7CisJCWlmICghYikgeworCQkJaWYgKCEoYm1hcF9mbGFncyAmIEJNQVBfQUxMT0MpKSB7CisJCQkJaWYgKGJtYXBfZmxhZ3MgJiBCTUFQX1NFVCkKKwkJCQkJcmV0dmFsID0gRVhUMl9FVF9TRVRfQk1BUF9OT19JTkQ7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCQliID0gaW5vZGVfYm1hcChpbm9kZSwgRVhUMl9JTkRfQkxPQ0stMSk7CisJCQlyZXR2YWwgPSBleHQyZnNfYWxsb2NfYmxvY2soZnMsIGIsIGJsb2NrX2J1ZiwgJmIpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGRvbmU7CisJCQlpbm9kZV9ibWFwKGlub2RlLCBFWFQyX0lORF9CTE9DSykgPSBiOworCQkJYmxvY2tzX2FsbG9jKys7CisJCX0KKwkJcmV0dmFsID0gYmxvY2tfaW5kX2JtYXAoZnMsIGJtYXBfZmxhZ3MsIGIsIGJsb2NrX2J1ZiwKKwkJCQkJJmJsb2Nrc19hbGxvYywgYmxvY2ssIHBoeXNfYmxrKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIERvdWJseSBpbmRpcmVjdCBibG9jayAgKi8KKwlibG9jayAtPSBhZGRyX3Blcl9ibG9jazsKKwlpZiAoYmxvY2sgPCBhZGRyX3Blcl9ibG9jayAqIGFkZHJfcGVyX2Jsb2NrKSB7CisJCWIgPSBpbm9kZV9ibWFwKGlub2RlLCBFWFQyX0RJTkRfQkxPQ0spOworCQlpZiAoIWIpIHsKKwkJCWlmICghKGJtYXBfZmxhZ3MgJiBCTUFQX0FMTE9DKSkgeworCQkJCWlmIChibWFwX2ZsYWdzICYgQk1BUF9TRVQpCisJCQkJCXJldHZhbCA9IEVYVDJfRVRfU0VUX0JNQVBfTk9fSU5EOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKworCQkJYiA9IGlub2RlX2JtYXAoaW5vZGUsIEVYVDJfSU5EX0JMT0NLKTsKKwkJCXJldHZhbCA9IGV4dDJmc19hbGxvY19ibG9jayhmcywgYiwgYmxvY2tfYnVmLCAmYik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlub2RlX2JtYXAoaW5vZGUsIEVYVDJfRElORF9CTE9DSykgPSBiOworCQkJYmxvY2tzX2FsbG9jKys7CisJCX0KKwkJcmV0dmFsID0gYmxvY2tfZGluZF9ibWFwKGZzLCBibWFwX2ZsYWdzLCBiLCBibG9ja19idWYsCisJCQkJCSAmYmxvY2tzX2FsbG9jLCBibG9jaywgcGh5c19ibGspOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVHJpcGx5IGluZGlyZWN0IGJsb2NrICovCisJYmxvY2sgLT0gYWRkcl9wZXJfYmxvY2sgKiBhZGRyX3Blcl9ibG9jazsKKwliID0gaW5vZGVfYm1hcChpbm9kZSwgRVhUMl9USU5EX0JMT0NLKTsKKwlpZiAoIWIpIHsKKwkJaWYgKCEoYm1hcF9mbGFncyAmIEJNQVBfQUxMT0MpKSB7CisJCQlpZiAoYm1hcF9mbGFncyAmIEJNQVBfU0VUKQorCQkJCXJldHZhbCA9IEVYVDJfRVRfU0VUX0JNQVBfTk9fSU5EOworCQkJZ290byBkb25lOworCQl9CisKKwkJYiA9IGlub2RlX2JtYXAoaW5vZGUsIEVYVDJfRElORF9CTE9DSyk7CisJCXJldHZhbCA9IGV4dDJmc19hbGxvY19ibG9jayhmcywgYiwgYmxvY2tfYnVmLCAmYik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGRvbmU7CisJCWlub2RlX2JtYXAoaW5vZGUsIEVYVDJfVElORF9CTE9DSykgPSBiOworCQlibG9ja3NfYWxsb2MrKzsKKwl9CisJcmV0dmFsID0gYmxvY2tfdGluZF9ibWFwKGZzLCBibWFwX2ZsYWdzLCBiLCBibG9ja19idWYsCisJCQkJICZibG9ja3NfYWxsb2MsIGJsb2NrLCBwaHlzX2Jsayk7Citkb25lOgorCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlpZiAoKHJldHZhbCA9PSAwKSAmJiAoYmxvY2tzX2FsbG9jIHx8IGlub2RlX2RpcnR5KSkgeworCQlpbm9kZS0+aV9ibG9ja3MgKz0gKGJsb2Nrc19hbGxvYyAqIGZzLT5ibG9ja3NpemUpIC8gNTEyOworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGlubywgaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Jtb3ZlLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYm1vdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzkyNDRkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Jtb3ZlLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJtb3ZlLmMgLS0tIE1vdmUgYmxvY2tzIGFyb3VuZCB0byBtYWtlIHdheSBmb3IgYSBwYXJ0aWN1bGFyCisgKglmaWxlc3lzdGVtIHN0cnVjdHVyZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhlb2RvcmUgVHMnby4gIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzUC5oIgorCitzdHJ1Y3QgcHJvY2Vzc19ibG9ja19zdHJ1Y3QgeworCWV4dDJfaW5vX3QJCWlubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqCWlub2RlOworCWV4dDJmc19ibG9ja19iaXRtYXAJcmVzZXJ2ZTsKKwlleHQyZnNfYmxvY2tfYml0bWFwCWFsbG9jX21hcDsKKwllcnJjb2RlX3QJCWVycm9yOworCWNoYXIJCQkqYnVmOworCWludAkJCWFkZF9kaXI7CisJaW50CQkJZmxhZ3M7Cit9OworCitzdGF0aWMgaW50IHByb2Nlc3NfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190CSpibG9ja19uciwKKwkJCSBlMl9ibGtjbnRfdCBibG9ja2NudCwgYmxrX3QgcmVmX2Jsb2NrLAorCQkJIGludCByZWZfb2Zmc2V0LCB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0ICpwYjsKKwllcnJjb2RlX3QJcmV0dmFsOworCWludAkJcmV0OworCWJsa190CQlibG9jaywgb3JpZzsKKworCXBiID0gKHN0cnVjdCBwcm9jZXNzX2Jsb2NrX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJYmxvY2sgPSBvcmlnID0gKmJsb2NrX25yOworCXJldCA9IDA7CisKKwkvKgorCSAqIExldCdzIHNlZSBpZiB0aGlzIGlzIG9uZSB3aGljaCB3ZSBuZWVkIHRvIHJlbG9jYXRlCisJICovCisJaWYgKGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChwYi0+cmVzZXJ2ZSwgYmxvY2spKSB7CisJCWRvIHsKKwkJCWlmICgrK2Jsb2NrID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpCisJCQkJYmxvY2sgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwkJCWlmIChibG9jayA9PSBvcmlnKSB7CisJCQkJcGItPmVycm9yID0gRVhUMl9FVF9CTE9DS19BTExPQ19GQUlMOworCQkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJCX0KKwkJfSB3aGlsZSAoZXh0MmZzX3Rlc3RfYmxvY2tfYml0bWFwKHBiLT5yZXNlcnZlLCBibG9jaykgfHwKKwkJCSBleHQyZnNfdGVzdF9ibG9ja19iaXRtYXAocGItPmFsbG9jX21hcCwgYmxvY2spKTsKKworCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgb3JpZywgMSwgcGItPmJ1Zik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXBiLT5lcnJvciA9IHJldHZhbDsKKwkJCXJldHVybiBCTE9DS19BQk9SVDsKKwkJfQorCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsb2NrLCAxLCBwYi0+YnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcGItPmVycm9yID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCSpibG9ja19uciA9IGJsb2NrOworCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAocGItPmFsbG9jX21hcCwgYmxvY2spOworCQlyZXQgPSBCTE9DS19DSEFOR0VEOworCQlpZiAocGItPmZsYWdzICYgRVhUMl9CTU9WRV9ERUJVRykKKwkJCXByaW50ZigiaW5vPSVsZCwgYmxvY2tjbnQ9JWxsZCwgJWQtPiVkXG4iLCBwYi0+aW5vLAorCQkJICAgICAgIGJsb2NrY250LCBvcmlnLCBibG9jayk7CisJfQorCWlmIChwYi0+YWRkX2RpcikgeworCQlyZXR2YWwgPSBleHQyZnNfYWRkX2Rpcl9ibG9jayhmcy0+ZGJsaXN0LCBwYi0+aW5vLAorCQkJCQkgICAgICBibG9jaywgKGludCkgYmxvY2tjbnQpOworCQlpZiAocmV0dmFsKSB7CisJCQlwYi0+ZXJyb3IgPSByZXR2YWw7CisJCQlyZXQgfD0gQkxPQ0tfQUJPUlQ7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworZXJyY29kZV90IGV4dDJmc19tb3ZlX2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCByZXNlcnZlLAorCQkJICAgICBleHQyZnNfYmxvY2tfYml0bWFwIGFsbG9jX21hcCwKKwkJCSAgICAgaW50IGZsYWdzKQoreworCWV4dDJfaW5vX3QJaW5vOworCXN0cnVjdCBleHQyX2lub2RlIGlub2RlOworCWVycmNvZGVfdAlyZXR2YWw7CisJc3RydWN0IHByb2Nlc3NfYmxvY2tfc3RydWN0IHBiOworCWV4dDJfaW5vZGVfc2NhbglzY2FuOworCWNoYXIJCSpibG9ja19idWY7CisKKwlyZXR2YWwgPSBleHQyZnNfb3Blbl9pbm9kZV9zY2FuKGZzLCAwLCAmc2Nhbik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXBiLnJlc2VydmUgPSByZXNlcnZlOworCXBiLmVycm9yID0gMDsKKwlwYi5hbGxvY19tYXAgPSBhbGxvY19tYXAgPyBhbGxvY19tYXAgOiBmcy0+YmxvY2tfbWFwOworCXBiLmZsYWdzID0gZmxhZ3M7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplICogNCwgJmJsb2NrX2J1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlwYi5idWYgPSBibG9ja19idWYgKyBmcy0+YmxvY2tzaXplICogMzsKKworCS8qCisJICogSWYgR0VUX0RCTElTVCBpcyBzZXQgaW4gdGhlIGZsYWdzIGZpZWxkLCB0aGVuIHdlIHNob3VsZAorCSAqIGdhdGhlciBkaXJlY3RvcnkgYmxvY2sgaW5mb3JtYXRpb24gd2hpbGUgd2UncmUgZG9pbmcgdGhlCisJICogYmxvY2sgbW92ZS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBFWFQyX0JNT1ZFX0dFVF9EQkxJU1QpIHsKKwkJZXh0MmZzX2ZyZWVfZGJsaXN0KGZzLT5kYmxpc3QpOworCQlmcy0+ZGJsaXN0ID0gTlVMTDsKKwkJcmV0dmFsID0gZXh0MmZzX2luaXRfZGJsaXN0KGZzLCAwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX2dldF9uZXh0X2lub2RlKHNjYW4sICZpbm8sICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXdoaWxlIChpbm8pIHsKKwkJaWYgKChpbm9kZS5pX2xpbmtzX2NvdW50ID09IDApIHx8CisJCSAgICAhZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3MoJmlub2RlKSkKKwkJCWdvdG8gbmV4dDsKKworCQlwYi5pbm8gPSBpbm87CisJCXBiLmlub2RlID0gJmlub2RlOworCisJCXBiLmFkZF9kaXIgPSAoTElOVVhfU19JU0RJUihpbm9kZS5pX21vZGUpICYmCisJCQkgICAgICBmbGFncyAmIEVYVDJfQk1PVkVfR0VUX0RCTElTVCk7CisKKwkJcmV0dmFsID0gZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGZzLCBpbm8sIDAsIGJsb2NrX2J1ZiwKKwkJCQkJICAgICAgcHJvY2Vzc19ibG9jaywgJnBiKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmIChwYi5lcnJvcikKKwkJCXJldHVybiBwYi5lcnJvcjsKKworCW5leHQ6CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbmV4dF9pbm9kZShzY2FuLCAmaW5vLCAmaW5vZGUpOworCQlpZiAocmV0dmFsID09IEVYVDJfRVRfQkFEX0JMT0NLX0lOX0lOT0RFX1RBQkxFKQorCQkJZ290byBuZXh0OworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9icmVsLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYnJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmY3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYnJlbC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJyZWwuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgeworCWJsa190CW5ldzsKKwlfX3MxNglvZmZzZXQ7CisJX191MTYJZmxhZ3M7CisJdW5pb24geworCQlibGtfdAkJYmxvY2tfcmVmOworCQlleHQyX2lub190CWlub2RlX3JlZjsKKwl9IG93bmVyOworfTsKKworI2RlZmluZSBSRUxPQ0FURV9UWVBFX1JFRiAgMHgwMDA3CisjZGVmaW5lIFJFTE9DQVRFX0JMT0NLX1JFRiAweDAwMDEKKyNkZWZpbmUgUkVMT0NBVEVfSU5PREVfUkVGIDB4MDAwMgorCit0eXBlZGVmIHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRpb25fdGFibGUgKmV4dDJfYnJlbDsKKworc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGlvbl90YWJsZSB7CisJX191MzIJbWFnaWM7CisJY2hhcgkqbmFtZTsKKwlibGtfdAljdXJyZW50OworCXZvaWQJKnByaXZfZGF0YTsKKworCS8qCisJICogQWRkIGEgYmxvY2sgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKi8KKwllcnJjb2RlX3QgKCpwdXQpKGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSAqZW50KTsKKworCS8qCisJICogR2V0IGEgYmxvY2sgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKi8KKwllcnJjb2RlX3QgKCpnZXQpKGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSAqZW50KTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBmb3IgaXRlcmF0aW5nIG92ZXIgdGhlIGJsb2NrIHJlbG9jYXRpb24gZW50cmllcy4KKwkgKi8KKwllcnJjb2RlX3QgKCpzdGFydF9pdGVyKShleHQyX2JyZWwgYnJlbCk7CisKKwkvKgorCSAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiBmb3IgdGhlIGlub2RlIHJlbG9jYXRpb24gZW50cmllcy4KKwkgKiBSZXR1cm5zIGFuIGlub2RlIG51bWJlciBvZiAwIHdoZW4gb3V0IG9mIGVudHJpZXMuCisJICovCisJZXJyY29kZV90ICgqbmV4dCkoZXh0Ml9icmVsIGJyZWwsIGJsa190ICpvbGQsCisJCQkgIHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpOworCisJLyoKKwkgKiBNb3ZlIHRoZSBpbm9kZSByZWxvY2F0aW9uIHRhYmxlIGZyb20gb25lIGJsb2NrIG51bWJlciB0bworCSAqIGFub3RoZXIuCisJICovCisJZXJyY29kZV90ICgqbW92ZSkoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCwgYmxrX3QgbmV3KTsKKworCS8qCisJICogUmVtb3ZlIGEgYmxvY2sgcmVsb2NhdGlvbiBlbnRyeS4KKwkgKi8KKwllcnJjb2RlX3QgKCpkZWxldGUpKGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQpOworCisKKwkvKgorCSAqIEZyZWUgdGhlIGJsb2NrIHJlbG9jYXRpb24gdGFibGUuCisJICovCisJZXJyY29kZV90ICgqZnJlZSkoZXh0Ml9icmVsIGJyZWwpOworfTsKKworZXJyY29kZV90IGV4dDJmc19icmVsX21lbWFycmF5X2NyZWF0ZShjaGFyICpuYW1lLCBibGtfdCBtYXhfYmxvY2ssCisJCQkJICAgIGV4dDJfYnJlbCAqYnJlbCk7CisKKyNkZWZpbmUgZXh0MmZzX2JyZWxfcHV0KGJyZWwsIG9sZCwgZW50KSAoKGJyZWwpLT5wdXQoKGJyZWwpLCBvbGQsIGVudCkpCisjZGVmaW5lIGV4dDJmc19icmVsX2dldChicmVsLCBvbGQsIGVudCkgKChicmVsKS0+Z2V0KChicmVsKSwgb2xkLCBlbnQpKQorI2RlZmluZSBleHQyZnNfYnJlbF9zdGFydF9pdGVyKGJyZWwpICgoYnJlbCktPnN0YXJ0X2l0ZXIoKGJyZWwpKSkKKyNkZWZpbmUgZXh0MmZzX2JyZWxfbmV4dChicmVsLCBvbGQsIGVudCkgKChicmVsKS0+bmV4dCgoYnJlbCksIG9sZCwgZW50KSkKKyNkZWZpbmUgZXh0MmZzX2JyZWxfbW92ZShicmVsLCBvbGQsIG5ldykgKChicmVsKS0+bW92ZSgoYnJlbCksIG9sZCwgbmV3KSkKKyNkZWZpbmUgZXh0MmZzX2JyZWxfZGVsZXRlKGJyZWwsIG9sZCkgKChicmVsKS0+ZGVsZXRlKChicmVsKSwgb2xkKSkKKyNkZWZpbmUgZXh0MmZzX2JyZWxfZnJlZShicmVsKSAoKGJyZWwpLT5mcmVlKChicmVsKSkpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvYnJlbF9tYS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JyZWxfbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTJhMzUwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2JyZWxfbWEuYwpAQCAtMCwwICsxLDE5NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYnJlbF9tYS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogVE9ETzogcmV3cml0ZSB0byBub3QgdXNlIGEgZGlyZWN0IGFycmF5ISEhICAoRm9ydHVuYXRlbHkgdGhpcworICogbW9kdWxlIGlzbid0IHJlYWxseSB1c2VkIHlldC4pCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKyNpbmNsdWRlICJicmVsLmgiCisKK3N0YXRpYyBlcnJjb2RlX3QgYm1hX3B1dChleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLAorCQkJc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudCk7CitzdGF0aWMgZXJyY29kZV90IGJtYV9nZXQoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCwKKwkJCXN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpOworc3RhdGljIGVycmNvZGVfdCBibWFfc3RhcnRfaXRlcihleHQyX2JyZWwgYnJlbCk7CitzdGF0aWMgZXJyY29kZV90IGJtYV9uZXh0KGV4dDJfYnJlbCBicmVsLCBibGtfdCAqb2xkLAorCQkJIHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpOworc3RhdGljIGVycmNvZGVfdCBibWFfbW92ZShleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLCBibGtfdCBuZXcpOworc3RhdGljIGVycmNvZGVfdCBibWFfZGVsZXRlKGV4dDJfYnJlbCBicmVsLCBibGtfdCBvbGQpOworc3RhdGljIGVycmNvZGVfdCBibWFfZnJlZShleHQyX2JyZWwgYnJlbCk7CisKK3N0cnVjdCBicmVsX21hIHsKKwlfX3UzMiBtYWdpYzsKKwlibGtfdCBtYXhfYmxvY2s7CisJc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkgKmVudHJpZXM7Cit9OworCitlcnJjb2RlX3QgZXh0MmZzX2JyZWxfbWVtYXJyYXlfY3JlYXRlKGNoYXIgKm5hbWUsIGJsa190IG1heF9ibG9jaywKKwkJCQkgICAgICBleHQyX2JyZWwgKm5ld19icmVsKQoreworCWV4dDJfYnJlbAkJYnJlbCA9IDA7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgYnJlbF9tYQkqbWEgPSAwOworCXNpemVfdAkJc2l6ZTsKKworCSpuZXdfYnJlbCA9IDA7CisKKwkvKgorCSAqIEFsbG9jYXRlIG1lbW9yeSBzdHJ1Y3R1cmVzCisJICovCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRpb25fdGFibGUpLAorCQkJCSZicmVsKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQoYnJlbCwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRpb25fdGFibGUpKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihuYW1lKSsxLCAmYnJlbC0+bmFtZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJc3RyY3B5KGJyZWwtPm5hbWUsIG5hbWUpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBicmVsX21hKSwgJm1hKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQobWEsIDAsIHNpemVvZihzdHJ1Y3QgYnJlbF9tYSkpOworCWJyZWwtPnByaXZfZGF0YSA9IG1hOworCisJc2l6ZSA9IChzaXplX3QpIChzaXplb2Yoc3RydWN0IGV4dDJfYmxvY2tfcmVsb2NhdGVfZW50cnkpICoKKwkJCSAobWF4X2Jsb2NrKzEpKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplLCAmbWEtPmVudHJpZXMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChtYS0+ZW50cmllcywgMCwgc2l6ZSk7CisJbWEtPm1heF9ibG9jayA9IG1heF9ibG9jazsKKworCS8qCisJICogRmlsbCBpbiB0aGUgYnJlbCBkYXRhIHN0cnVjdHVyZQorCSAqLworCWJyZWwtPnB1dCA9IGJtYV9wdXQ7CisJYnJlbC0+Z2V0ID0gYm1hX2dldDsKKwlicmVsLT5zdGFydF9pdGVyID0gYm1hX3N0YXJ0X2l0ZXI7CisJYnJlbC0+bmV4dCA9IGJtYV9uZXh0OworCWJyZWwtPm1vdmUgPSBibWFfbW92ZTsKKwlicmVsLT5kZWxldGUgPSBibWFfZGVsZXRlOworCWJyZWwtPmZyZWUgPSBibWFfZnJlZTsKKworCSpuZXdfYnJlbCA9IGJyZWw7CisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlibWFfZnJlZShicmVsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9wdXQoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCwKKwkJCXN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpCit7CisJc3RydWN0IGJyZWxfbWEJKm1hOworCisJbWEgPSBicmVsLT5wcml2X2RhdGE7CisJaWYgKG9sZCA+IG1hLT5tYXhfYmxvY2spCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJbWEtPmVudHJpZXNbKHVuc2lnbmVkKW9sZF0gPSAqZW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9nZXQoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCwKKwkJCXN0cnVjdCBleHQyX2Jsb2NrX3JlbG9jYXRlX2VudHJ5ICplbnQpCit7CisJc3RydWN0IGJyZWxfbWEJKm1hOworCisJbWEgPSBicmVsLT5wcml2X2RhdGE7CisJaWYgKG9sZCA+IG1hLT5tYXhfYmxvY2spCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZClvbGRdLm5ldyA9PSAwKQorCQlyZXR1cm4gRU5PRU5UOworCSplbnQgPSBtYS0+ZW50cmllc1tvbGRdOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9zdGFydF9pdGVyKGV4dDJfYnJlbCBicmVsKQoreworCWJyZWwtPmN1cnJlbnQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9uZXh0KGV4dDJfYnJlbCBicmVsLCBibGtfdCAqb2xkLAorCQkJICBzdHJ1Y3QgZXh0Ml9ibG9ja19yZWxvY2F0ZV9lbnRyeSAqZW50KQoreworCXN0cnVjdCBicmVsX21hCSptYTsKKworCW1hID0gYnJlbC0+cHJpdl9kYXRhOworCXdoaWxlICgrK2JyZWwtPmN1cnJlbnQgPCBtYS0+bWF4X2Jsb2NrKSB7CisJCWlmIChtYS0+ZW50cmllc1sodW5zaWduZWQpYnJlbC0+Y3VycmVudF0ubmV3ID09IDApCisJCQljb250aW51ZTsKKwkJKm9sZCA9IGJyZWwtPmN1cnJlbnQ7CisJCSplbnQgPSBtYS0+ZW50cmllc1sodW5zaWduZWQpYnJlbC0+Y3VycmVudF07CisJCXJldHVybiAwOworCX0KKwkqb2xkID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBibWFfbW92ZShleHQyX2JyZWwgYnJlbCwgYmxrX3Qgb2xkLCBibGtfdCBuZXcpCit7CisJc3RydWN0IGJyZWxfbWEJKm1hOworCisJbWEgPSBicmVsLT5wcml2X2RhdGE7CisJaWYgKChvbGQgPiBtYS0+bWF4X2Jsb2NrKSB8fCAobmV3ID4gbWEtPm1heF9ibG9jaykpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZClvbGRdLm5ldyA9PSAwKQorCQlyZXR1cm4gRU5PRU5UOworCW1hLT5lbnRyaWVzWyh1bnNpZ25lZCluZXddID0gbWEtPmVudHJpZXNbb2xkXTsKKwltYS0+ZW50cmllc1sodW5zaWduZWQpb2xkXS5uZXcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGJtYV9kZWxldGUoZXh0Ml9icmVsIGJyZWwsIGJsa190IG9sZCkKK3sKKwlzdHJ1Y3QgYnJlbF9tYQkqbWE7CisKKwltYSA9IGJyZWwtPnByaXZfZGF0YTsKKwlpZiAob2xkID4gbWEtPm1heF9ibG9jaykKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKW9sZF0ubmV3ID09IDApCisJCXJldHVybiBFTk9FTlQ7CisJbWEtPmVudHJpZXNbKHVuc2lnbmVkKW9sZF0ubmV3ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBibWFfZnJlZShleHQyX2JyZWwgYnJlbCkKK3sKKwlzdHJ1Y3QgYnJlbF9tYQkqbWE7CisKKwlpZiAoIWJyZWwpCisJCXJldHVybiAwOworCisJbWEgPSBicmVsLT5wcml2X2RhdGE7CisKKwlpZiAobWEpIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZtYS0+ZW50cmllcyk7CisJCWV4dDJmc19mcmVlX21lbSgmbWEpOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmJyZWwtPm5hbWUpOworCWV4dDJmc19mcmVlX21lbSgmYnJlbCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY2hlY2tfZGVzYy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2NoZWNrX2Rlc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRiMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2NoZWNrX2Rlc2MuYwpAQCAtMCwwICsxLDY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaGVja19kZXNjLmMgLS0tIENoZWNrIHRoZSBncm91cCBkZXNjcmlwdG9ycyBvZiBhbiBleHQyIGZpbGVzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIFRoaXMgcm91dGluZSBzYW5pdHkgY2hlY2tzIHRoZSBncm91cCBkZXNjcmlwdG9ycworICovCitlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2Rlc2MoZXh0Ml9maWxzeXMgZnMpCit7CisJZGdycF90IGk7CisJYmxrX3QgYmxvY2sgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsKKwlibGtfdCBuZXh0OworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCW5leHQgPSBibG9jayArIGZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworCQkvKgorCQkgKiBDaGVjayB0byBtYWtlIHN1cmUgYmxvY2sgYml0bWFwIGZvciBncm91cCBpcworCQkgKiBsb2NhdGVkIHdpdGhpbiB0aGUgZ3JvdXAuCisJCSAqLworCQlpZiAoZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwIDwgYmxvY2sgfHwKKwkJICAgIGZzLT5ncm91cF9kZXNjW2ldLmJnX2Jsb2NrX2JpdG1hcCA+PSBuZXh0KQorCQkJcmV0dXJuIEVYVDJfRVRfR0RFU0NfQkFEX0JMT0NLX01BUDsKKwkJLyoKKwkJICogQ2hlY2sgdG8gbWFrZSBzdXJlIGlub2RlIGJpdG1hcCBmb3IgZ3JvdXAgaXMKKwkJICogbG9jYXRlZCB3aXRoaW4gdGhlIGdyb3VwCisJCSAqLworCQlpZiAoZnMtPmdyb3VwX2Rlc2NbaV0uYmdfaW5vZGVfYml0bWFwIDwgYmxvY2sgfHwKKwkJICAgIGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcCA+PSBuZXh0KQorCQkJcmV0dXJuIEVYVDJfRVRfR0RFU0NfQkFEX0lOT0RFX01BUDsKKwkJLyoKKwkJICogQ2hlY2sgdG8gbWFrZSBzdXJlIGlub2RlIHRhYmxlIGZvciBncm91cCBpcyBsb2NhdGVkCisJCSAqIHdpdGhpbiB0aGUgZ3JvdXAKKwkJICovCisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV90YWJsZSA8IGJsb2NrIHx8CisJCSAgICAoKGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX3RhYmxlICsKKwkJICAgICAgZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXApID49IG5leHQpKQorCQkJcmV0dXJuIEVYVDJfRVRfR0RFU0NfQkFEX0lOT0RFX1RBQkxFOworCisJCWJsb2NrID0gbmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvY2xvc2Vmcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Nsb3NlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmExNWUyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Nsb3NlZnMuYwpAQCAtMCwwICsxLDM4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2xvc2Vmcy5jIC0tLSBjbG9zZSBhbiBleHQyIGZpbGVzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK3N0YXRpYyBpbnQgdGVzdF9yb290KGludCBhLCBpbnQgYikKK3sKKwlpZiAoYSA9PSAwKQorCQlyZXR1cm4gMTsKKwl3aGlsZSAoMSkgeworCQlpZiAoYSA9PSAxKQorCQkJcmV0dXJuIDE7CisJCWlmIChhICUgYikKKwkJCXJldHVybiAwOworCQlhID0gYSAvIGI7CisJfQorfQorCitpbnQgZXh0MmZzX2JnX2hhc19zdXBlcihleHQyX2ZpbHN5cyBmcywgaW50IGdyb3VwX2Jsb2NrKQoreworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJICAgICAgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpKQorCQlyZXR1cm4gMTsKKworCWlmICh0ZXN0X3Jvb3QoZ3JvdXBfYmxvY2ssIDMpIHx8ICh0ZXN0X3Jvb3QoZ3JvdXBfYmxvY2ssIDUpKSB8fAorCSAgICB0ZXN0X3Jvb3QoZ3JvdXBfYmxvY2ssIDcpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitpbnQgZXh0MmZzX3N1cGVyX2FuZF9iZ2RfbG9jKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgICBkZ3JwX3QgZ3JvdXAsCisJCQkgICAgIGJsa190ICpyZXRfc3VwZXJfYmxrLAorCQkJICAgICBibGtfdCAqcmV0X29sZF9kZXNjX2JsaywKKwkJCSAgICAgYmxrX3QgKnJldF9uZXdfZGVzY19ibGssCisJCQkgICAgIGludCAqcmV0X21ldGFfYmcpCit7CisJYmxrX3QJZ3JvdXBfYmxvY2ssIHN1cGVyX2JsayA9IDAsIG9sZF9kZXNjX2JsayA9IDAsIG5ld19kZXNjX2JsayA9IDA7CisJdW5zaWduZWQgaW50IG1ldGFfYmcsIG1ldGFfYmdfc2l6ZTsKKwlpbnQJbnVtYmxvY2tzLCBoYXNfc3VwZXI7CisJaW50CW9sZF9kZXNjX2Jsb2NrczsKKworCWdyb3VwX2Jsb2NrID0gZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2sgKworCQkoZ3JvdXAgKiBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCk7CisKKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykKKwkJb2xkX2Rlc2NfYmxvY2tzID0gZnMtPnN1cGVyLT5zX2ZpcnN0X21ldGFfYmc7CisJZWxzZQorCQlvbGRfZGVzY19ibG9ja3MgPQorCQkJZnMtPmRlc2NfYmxvY2tzICsgZnMtPnN1cGVyLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3M7CisKKwlpZiAoZ3JvdXAgPT0gZnMtPmdyb3VwX2Rlc2NfY291bnQtMSkgeworCQludW1ibG9ja3MgPSAoZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCAtCisJCQkgICAgIGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKSAlCisJCQlmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwkJaWYgKCFudW1ibG9ja3MpCisJCQludW1ibG9ja3MgPSBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwl9IGVsc2UKKwkJbnVtYmxvY2tzID0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisKKwloYXNfc3VwZXIgPSBleHQyZnNfYmdfaGFzX3N1cGVyKGZzLCBncm91cCk7CisKKwlpZiAoaGFzX3N1cGVyKSB7CisJCXN1cGVyX2JsayA9IGdyb3VwX2Jsb2NrOworCQludW1ibG9ja3MtLTsKKwl9CisJbWV0YV9iZ19zaXplID0gKGZzLT5ibG9ja3NpemUgLyBzaXplb2YgKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpKTsKKwltZXRhX2JnID0gZ3JvdXAgLyBtZXRhX2JnX3NpemU7CisKKwlpZiAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKSB8fAorCSAgICAobWV0YV9iZyA8IGZzLT5zdXBlci0+c19maXJzdF9tZXRhX2JnKSkgeworCQlpZiAoaGFzX3N1cGVyKSB7CisJCQlvbGRfZGVzY19ibGsgPSBncm91cF9ibG9jayArIDE7CisJCQludW1ibG9ja3MgLT0gb2xkX2Rlc2NfYmxvY2tzOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCgoZ3JvdXAgJSBtZXRhX2JnX3NpemUpID09IDApIHx8CisJCSAgICAoKGdyb3VwICUgbWV0YV9iZ19zaXplKSA9PSAxKSB8fAorCQkgICAgKChncm91cCAlIG1ldGFfYmdfc2l6ZSkgPT0gKG1ldGFfYmdfc2l6ZS0xKSkpIHsKKwkJCWlmIChoYXNfc3VwZXIpCisJCQkJaGFzX3N1cGVyID0gMTsKKwkJCW5ld19kZXNjX2JsayA9IGdyb3VwX2Jsb2NrICsgaGFzX3N1cGVyOworCQkJbnVtYmxvY2tzLS07CisJCX0KKwl9CisKKwludW1ibG9ja3MgLT0gMiArIGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCisJaWYgKHJldF9zdXBlcl9ibGspCisJCSpyZXRfc3VwZXJfYmxrID0gc3VwZXJfYmxrOworCWlmIChyZXRfb2xkX2Rlc2NfYmxrKQorCQkqcmV0X29sZF9kZXNjX2JsayA9IG9sZF9kZXNjX2JsazsKKwlpZiAocmV0X25ld19kZXNjX2JsaykKKwkJKnJldF9uZXdfZGVzY19ibGsgPSBuZXdfZGVzY19ibGs7CisJaWYgKHJldF9tZXRhX2JnKQorCQkqcmV0X21ldGFfYmcgPSBtZXRhX2JnOworCXJldHVybiBudW1ibG9ja3M7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIG91dCB0aGUgcHJpbWFyeSBzdXBlcmJsb2NrLiAgV2UgbmVlZCB0byBvbmx5CisgKiB3cml0ZSBvdXQgdGhvc2UgZmllbGRzIHdoaWNoIHdlIGhhdmUgY2hhbmdlZCwgc2luY2UgaWYgdGhlCisgKiBmaWxlc3lzdGVtIGlzIG1vdW50ZWQsIGl0IG1heSBoYXZlIGNoYW5nZWQgc29tZSBvZiB0aGUgb3RoZXIKKyAqIGZpZWxkcy4KKyAqCisgKiBJdCB0YWtlcyBhcyBpbnB1dCBhIHN1cGVyYmxvY2sgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBieXRlIHN3YXBwZWQKKyAqIChpZiBuZWNlc3NhcnkpLgorICoKKyAqLworc3RhdGljIGVycmNvZGVfdCB3cml0ZV9wcmltYXJ5X3N1cGVyYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnN1cGVyKQoreworCV9fdTE2CQkqb2xkX3N1cGVyLCAqbmV3X3N1cGVyOworCWludAkJY2hlY2tfaWR4LCB3cml0ZV9pZHgsIHNpemU7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmICghZnMtPmlvLT5tYW5hZ2VyLT53cml0ZV9ieXRlIHx8ICFmcy0+b3JpZ19zdXBlcikgeworCQlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgU1VQRVJCTE9DS19PRkZTRVQpOworCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIDEsIC1TVVBFUkJMT0NLX1NJWkUsCisJCQkJCSAgICAgIHN1cGVyKTsKKwkJaW9fY2hhbm5lbF9zZXRfYmxrc2l6ZShmcy0+aW8sIGZzLT5ibG9ja3NpemUpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCW9sZF9zdXBlciA9IChfX3UxNiAqKSBmcy0+b3JpZ19zdXBlcjsKKwluZXdfc3VwZXIgPSAoX191MTYgKikgc3VwZXI7CisKKwlmb3IgKGNoZWNrX2lkeCA9IDA7IGNoZWNrX2lkeCA8IFNVUEVSQkxPQ0tfU0laRS8yOyBjaGVja19pZHgrKykgeworCQlpZiAob2xkX3N1cGVyW2NoZWNrX2lkeF0gPT0gbmV3X3N1cGVyW2NoZWNrX2lkeF0pCisJCQljb250aW51ZTsKKwkJd3JpdGVfaWR4ID0gY2hlY2tfaWR4OworCQlmb3IgKGNoZWNrX2lkeCsrOyBjaGVja19pZHggPCBTVVBFUkJMT0NLX1NJWkUvMjsgY2hlY2tfaWR4KyspCisJCQlpZiAob2xkX3N1cGVyW2NoZWNrX2lkeF0gPT0gbmV3X3N1cGVyW2NoZWNrX2lkeF0pCisJCQkJYnJlYWs7CisJCXNpemUgPSAyICogKGNoZWNrX2lkeCAtIHdyaXRlX2lkeCk7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYnl0ZShmcy0+aW8sCisJCQkgICAgICAgU1VQRVJCTE9DS19PRkZTRVQgKyAoMiAqIHdyaXRlX2lkeCksIHNpemUsCisJCQkJCSAgICAgICBuZXdfc3VwZXIgKyB3cml0ZV9pZHgpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJbWVtY3B5KGZzLT5vcmlnX3N1cGVyLCBzdXBlciwgU1VQRVJCTE9DS19TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVXBkYXRlcyB0aGUgcmV2aXNpb24gdG8gRVhUMl9EWU5BTUlDX1JFVgorICovCit2b2lkIGV4dDJmc191cGRhdGVfZHluYW1pY19yZXYoZXh0Ml9maWxzeXMgZnMpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiID0gZnMtPnN1cGVyOworCisJaWYgKHNiLT5zX3Jldl9sZXZlbCA+IEVYVDJfR09PRF9PTERfUkVWKQorCQlyZXR1cm47CisKKwlzYi0+c19yZXZfbGV2ZWwgPSBFWFQyX0RZTkFNSUNfUkVWOworCXNiLT5zX2ZpcnN0X2lubyA9IEVYVDJfR09PRF9PTERfRklSU1RfSU5POworCXNiLT5zX2lub2RlX3NpemUgPSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJLyogc191dWlkIGlzIGhhbmRsZWQgYnkgZTJmc2NrIGFscmVhZHkgKi8KKwkvKiBvdGhlciBmaWVsZHMgc2hvdWxkIGJlIGxlZnQgYWxvbmUgKi8KK30KKworc3RhdGljIGVycmNvZGVfdCB3cml0ZV9iYWNrdXBfc3VwZXIoZXh0Ml9maWxzeXMgZnMsIGRncnBfdCBncm91cCwKKwkJCQkgICAgYmxrX3QgZ3JvdXBfYmxvY2ssCisJCQkJICAgIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzdXBlcl9zaGFkb3cpCit7CisJZGdycF90CXNncnAgPSBncm91cDsKKworCWlmIChzZ3JwID4gKCgxIDw8IDE2KSAtIDEpKQorCQlzZ3JwID0gKDEgPDwgMTYpIC0gMTsKKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKQorCQlzdXBlcl9zaGFkb3ctPnNfYmxvY2tfZ3JvdXBfbnIgPSBleHQyZnNfc3dhYjE2KHNncnApOworCWVsc2UKKyNlbmRpZgorCQlmcy0+c3VwZXItPnNfYmxvY2tfZ3JvdXBfbnIgPSBzZ3JwOworCisJcmV0dXJuIGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgZ3JvdXBfYmxvY2ssIC1TVVBFUkJMT0NLX1NJWkUsCisJCQkJICAgIHN1cGVyX3NoYWRvdyk7Cit9CisKKworZXJyY29kZV90IGV4dDJmc19mbHVzaChleHQyX2ZpbHN5cyBmcykKK3sKKwlkZ3JwX3QJCWk7CisJYmxrX3QJCWdyb3VwX2Jsb2NrOworCWVycmNvZGVfdAlyZXR2YWw7CisJdW5zaWduZWQgbG9uZwlmc19zdGF0ZTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc3VwZXJfc2hhZG93ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpncm91cF9zaGFkb3cgPSBOVUxMOworCWNoYXIJKmdyb3VwX3B0cjsKKwlpbnQJb2xkX2Rlc2NfYmxvY2tzOworI2lmIEJCX0JJR19FTkRJQU4KKwlkZ3JwX3QJCWo7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqcywgKnQ7CisjZW5kaWYKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlmc19zdGF0ZSA9IGZzLT5zdXBlci0+c19zdGF0ZTsKKworCWZzLT5zdXBlci0+c193dGltZSA9IHRpbWUoTlVMTCk7CisJZnMtPnN1cGVyLT5zX2Jsb2NrX2dyb3VwX25yID0gMDsKKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfTk9fTUVNT1JZOworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShTVVBFUkJMT0NLX1NJWkUsICZzdXBlcl9zaGFkb3cpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKChzaXplX3QpKGZzLT5ibG9ja3NpemUgKgorCQkJCQkJIGZzLT5kZXNjX2Jsb2NrcyksCisJCQkJCSZncm91cF9zaGFkb3cpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJCW1lbXNldChncm91cF9zaGFkb3csIDAsIChzaXplX3QpIGZzLT5ibG9ja3NpemUgKgorCQkgICAgICAgZnMtPmRlc2NfYmxvY2tzKTsKKworCQkvKiBzd2FwIHRoZSBncm91cCBkZXNjcmlwdG9ycyAqLworCQlmb3IgKGo9MCwgcz1mcy0+Z3JvdXBfZGVzYywgdD1ncm91cF9zaGFkb3c7CisJCSAgICAgaiA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBqKyssIHQrKywgcysrKSB7CisJCQkqdCA9ICpzOworCQkJZXh0MmZzX3N3YXBfZ3JvdXBfZGVzYyh0KTsKKwkJfQorCX0gZWxzZSB7CisJCXN1cGVyX3NoYWRvdyA9IGZzLT5zdXBlcjsKKwkJZ3JvdXBfc2hhZG93ID0gZnMtPmdyb3VwX2Rlc2M7CisJfQorI2Vsc2UKKwlzdXBlcl9zaGFkb3cgPSBmcy0+c3VwZXI7CisJZ3JvdXBfc2hhZG93ID0gZnMtPmdyb3VwX2Rlc2M7CisjZW5kaWYKKworCS8qCisJICogSWYgdGhpcyBpcyBhbiBleHRlcm5hbCBqb3VybmFsIGRldmljZSwgZG9uJ3Qgd3JpdGUgb3V0IHRoZQorCSAqIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzIG9yIGFueSBvZiB0aGUgYmFja3VwIHN1cGVyYmxvY2tzCisJICovCisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKQorCQlnb3RvIHdyaXRlX3ByaW1hcnlfc3VwZXJibG9ja19vbmx5OworCisJLyoKKwkgKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBGUyB0byBiZSBub24tdmFsaWQuICAoVGhlIHN0YXRlIGhhcworCSAqIGFscmVhZHkgYmVlbiBiYWNrZWQgdXAgZWFybGllciwgYW5kIHdpbGwgYmUgcmVzdG9yZWQgYWZ0ZXIKKwkgKiB3ZSB3cml0ZSBvdXQgdGhlIGJhY2t1cCBzdXBlcmJsb2Nrcy4pCisJICovCisJZnMtPnN1cGVyLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHsKKwkJKnN1cGVyX3NoYWRvdyA9ICpmcy0+c3VwZXI7CisJCWV4dDJmc19zd2FwX3N1cGVyKHN1cGVyX3NoYWRvdyk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgbWFzdGVyIGdyb3VwIGRlc2NyaXB0b3JzLCBhbmQgdGhlIGJhY2t1cAorCSAqIHN1cGVyYmxvY2tzIGFuZCBncm91cCBkZXNjcmlwdG9ycy4KKwkgKi8KKwlncm91cF9ibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWdyb3VwX3B0ciA9IChjaGFyICopIGdyb3VwX3NoYWRvdzsKKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykKKwkJb2xkX2Rlc2NfYmxvY2tzID0gZnMtPnN1cGVyLT5zX2ZpcnN0X21ldGFfYmc7CisJZWxzZQorCQlvbGRfZGVzY19ibG9ja3MgPSBmcy0+ZGVzY19ibG9ja3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGkrKykgeworCQlibGtfdAlzdXBlcl9ibGssIG9sZF9kZXNjX2JsaywgbmV3X2Rlc2NfYmxrOworCQlpbnQJbWV0YV9iZzsKKworCQlleHQyZnNfc3VwZXJfYW5kX2JnZF9sb2MoZnMsIGksICZzdXBlcl9ibGssICZvbGRfZGVzY19ibGssCisJCQkJCSAmbmV3X2Rlc2NfYmxrLCAmbWV0YV9iZyk7CisKKwkJaWYgKCEoZnMtPmZsYWdzICYgRVhUMl9GTEFHX01BU1RFUl9TQl9PTkxZKSAmJmkgJiYgc3VwZXJfYmxrKSB7CisJCQlyZXR2YWwgPSB3cml0ZV9iYWNrdXBfc3VwZXIoZnMsIGksIHN1cGVyX2JsaywKKwkJCQkJCSAgICBzdXBlcl9zaGFkb3cpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycm91dDsKKwkJfQorCQlpZiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NVUEVSX09OTFkpCisJCQljb250aW51ZTsKKwkJaWYgKChvbGRfZGVzY19ibGspICYmCisJCSAgICAoIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfTUFTVEVSX1NCX09OTFkpIHx8IChpID09IDApKSkgeworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLAorCQkJICAgICAgb2xkX2Rlc2NfYmxrLCBvbGRfZGVzY19ibG9ja3MsIGdyb3VwX3B0cik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyb3V0OworCQl9CisJCWlmIChuZXdfZGVzY19ibGspIHsKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgbmV3X2Rlc2NfYmxrLAorCQkJCTEsIGdyb3VwX3B0ciArIChtZXRhX2JnKmZzLT5ibG9ja3NpemUpKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnJvdXQ7CisJCX0KKwl9CisJZnMtPnN1cGVyLT5zX2Jsb2NrX2dyb3VwX25yID0gMDsKKwlmcy0+c3VwZXItPnNfc3RhdGUgPSBmc19zdGF0ZTsKKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB7CisJCSpzdXBlcl9zaGFkb3cgPSAqZnMtPnN1cGVyOworCQlleHQyZnNfc3dhcF9zdXBlcihzdXBlcl9zaGFkb3cpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBJZiB0aGUgd3JpdGVfYml0bWFwcygpIGZ1bmN0aW9uIGlzIHByZXNlbnQsIGNhbGwgaXQgdG8KKwkgKiBmbHVzaCB0aGUgYml0bWFwcy4gIFRoaXMgaXMgZG9uZSB0aGlzIHdheSBzbyB0aGF0IGEgc2ltcGxlCisJICogcHJvZ3JhbSB0aGF0IGRvZXNuJ3QgbWVzcyB3aXRoIHRoZSBiaXRtYXBzIGRvZXNuJ3QgbmVlZCB0bworCSAqIGRyYWcgaW4gdGhlIGJpdG1hcHMuYyBjb2RlLgorCSAqLworCWlmIChmcy0+d3JpdGVfYml0bWFwcykgeworCQlyZXR2YWwgPSBmcy0+d3JpdGVfYml0bWFwcyhmcyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwl9CisKK3dyaXRlX3ByaW1hcnlfc3VwZXJibG9ja19vbmx5OgorCS8qCisJICogV3JpdGUgb3V0IG1hc3RlciBzdXBlcmJsb2NrLiAgVGhpcyBoYXMgdG8gYmUgZG9uZQorCSAqIHNlcGFyYXRlbHksIHNpbmNlIGl0IGlzIGxvY2F0ZWQgYXQgYSBmaXhlZCBsb2NhdGlvbgorCSAqIChTVVBFUkJMT0NLX09GRlNFVCkuICBXZSBmbHVzaCBhbGwgb3RoZXIgcGVuZGluZyBjaGFuZ2VzCisJICogb3V0IHRvIGRpc2sgZmlyc3QsIGp1c3QgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aXRoIGFuCisJICogaW5zeS10aW5zeSB3aW5kb3cuLi4uCisJICovCisJcmV0dmFsID0gaW9fY2hhbm5lbF9mbHVzaChmcy0+aW8pOworCXJldHZhbCA9IHdyaXRlX3ByaW1hcnlfc3VwZXJibG9jayhmcywgc3VwZXJfc2hhZG93KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworCWZzLT5mbGFncyAmPSB+RVhUMl9GTEFHX0RJUlRZOworCisJcmV0dmFsID0gaW9fY2hhbm5lbF9mbHVzaChmcy0+aW8pOworZXJyb3V0OgorCWZzLT5zdXBlci0+c19zdGF0ZSA9IGZzX3N0YXRlOworCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgeworCQlpZiAoc3VwZXJfc2hhZG93KQorCQkJZXh0MmZzX2ZyZWVfbWVtKCZzdXBlcl9zaGFkb3cpOworCQlpZiAoZ3JvdXBfc2hhZG93KQorCQkJZXh0MmZzX2ZyZWVfbWVtKCZncm91cF9zaGFkb3cpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2Nsb3NlKGV4dDJfZmlsc3lzIGZzKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19ESVJUWSkgeworCQlyZXR2YWwgPSBleHQyZnNfZmx1c2goZnMpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKGZzLT53cml0ZV9iaXRtYXBzKSB7CisJCXJldHZhbCA9IGZzLT53cml0ZV9iaXRtYXBzKGZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWV4dDJmc19mcmVlKGZzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9jbXBfYml0bWFwcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2NtcF9iaXRtYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3OGZmOAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9jbXBfYml0bWFwcy5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNtcF9iaXRtYXBzLmMgLS0tIHJvdXRpbmVzIHRvIGNvbXBhcmUgaW5vZGUgYW5kIGJsb2NrIGJpdG1hcHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2VycmNvZGVfdCBleHQyZnNfY29tcGFyZV9ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBibTEsCisJCQkJICAgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCBibTIpCit7CisJYmxrX3QJaTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoYm0xLCBFWFQyX0VUX01BR0lDX0JMT0NLX0JJVE1BUCk7CisJRVhUMl9DSEVDS19NQUdJQyhibTIsIEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQKTsKKworCWlmICgoYm0xLT5zdGFydCAhPSBibTItPnN0YXJ0KSB8fAorCSAgICAoYm0xLT5lbmQgIT0gYm0yLT5lbmQpIHx8CisJICAgIChtZW1jbXAoYm0xLT5iaXRtYXAsIGJtMi0+Yml0bWFwLAorCQkgICAgKHNpemVfdCkgKGJtMS0+ZW5kIC0gYm0xLT5zdGFydCkvOCkpKQorCQlyZXR1cm4gRVhUMl9FVF9ORVFfQkxPQ0tfQklUTUFQOworCisJZm9yIChpID0gYm0xLT5lbmQgLSAoKGJtMS0+ZW5kIC0gYm0xLT5zdGFydCkgJSA4KTsgaSA8PSBibTEtPmVuZDsgaSsrKQorCQlpZiAoZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXAoYm0xLCBpKSAhPQorCQkgICAgZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXAoYm0yLCBpKSkKKwkJCXJldHVybiBFWFQyX0VUX05FUV9CTE9DS19CSVRNQVA7CisKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19jb21wYXJlX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJtMSwKKwkJCQkgICAgICBleHQyZnNfaW5vZGVfYml0bWFwIGJtMikKK3sKKwlleHQyX2lub190CWk7CisKKwlFWFQyX0NIRUNLX01BR0lDKGJtMSwgRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVApOworCUVYVDJfQ0hFQ0tfTUFHSUMoYm0yLCBFWFQyX0VUX01BR0lDX0lOT0RFX0JJVE1BUCk7CisKKwlpZiAoKGJtMS0+c3RhcnQgIT0gYm0yLT5zdGFydCkgfHwKKwkgICAgKGJtMS0+ZW5kICE9IGJtMi0+ZW5kKSB8fAorCSAgICAobWVtY21wKGJtMS0+Yml0bWFwLCBibTItPmJpdG1hcCwKKwkJICAgIChzaXplX3QpIChibTEtPmVuZCAtIGJtMS0+c3RhcnQpLzgpKSkKKwkJcmV0dXJuIEVYVDJfRVRfTkVRX0lOT0RFX0JJVE1BUDsKKworCWZvciAoaSA9IGJtMS0+ZW5kIC0gKChibTEtPmVuZCAtIGJtMS0+c3RhcnQpICUgOCk7IGkgPD0gYm0xLT5lbmQ7IGkrKykKKwkJaWYgKGV4dDJmc19mYXN0X3Rlc3RfaW5vZGVfYml0bWFwKGJtMSwgaSkgIT0KKwkJICAgIGV4dDJmc19mYXN0X3Rlc3RfaW5vZGVfYml0bWFwKGJtMiwgaSkpCisJCQlyZXR1cm4gRVhUMl9FVF9ORVFfSU5PREVfQklUTUFQOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGJsaXN0LmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGJsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmZjZkOAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kYmxpc3QuYwpAQCAtMCwwICsxLDI2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGJsaXN0LmMgLS0gZGlyZWN0b3J5IGJsb2NrIGxpc3QgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTcgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK3N0YXRpYyBpbnQgZGlyX2Jsb2NrX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKKworLyoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaXJlY3RvcmllcyBpbiB0aGUgZmlsZXN5c3RlbSBhcyByZXBvcnRlZCBieQorICogdGhlIGdyb3VwIGRlc2NyaXB0b3JzLiAgT2YgY291cnNlLCB0aGUgZ3JvdXAgZGVzY3JpcHRvcnMgY291bGQgYmUKKyAqIHdyb25nIQorICovCitlcnJjb2RlX3QgZXh0MmZzX2dldF9udW1fZGlycyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCAqcmV0X251bV9kaXJzKQoreworCWRncnBfdAlpOworCWV4dDJfaW5vX3QJbnVtX2RpcnMsIG1heF9kaXJzOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCW51bV9kaXJzID0gMDsKKwltYXhfZGlycyA9IGZzLT5zdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwOworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCWlmIChmcy0+Z3JvdXBfZGVzY1tpXS5iZ191c2VkX2RpcnNfY291bnQgPiBtYXhfZGlycykKKwkJCW51bV9kaXJzICs9IG1heF9kaXJzIC8gODsKKwkJZWxzZQorCQkJbnVtX2RpcnMgKz0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfdXNlZF9kaXJzX2NvdW50OworCX0KKwlpZiAobnVtX2RpcnMgPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KQorCQludW1fZGlycyA9IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQ7CisKKwkqcmV0X251bV9kaXJzID0gbnVtX2RpcnM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiBmb3IgbWFraW5nIGEgbmV3IGRpcmVjdG9yeSBibG9jayBsaXN0IChmb3IKKyAqIGluaXRpYWxpemUgYW5kIGNvcHkpLgorICovCitzdGF0aWMgZXJyY29kZV90IG1ha2VfZGJsaXN0KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHNpemUsIGV4dDJfaW5vX3QgY291bnQsCisJCQkgICAgIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpsaXN0LAorCQkJICAgICBleHQyX2RibGlzdCAqcmV0X2RibGlzdCkKK3sKKwlleHQyX2RibGlzdAlkYmxpc3Q7CisJZXJyY29kZV90CXJldHZhbDsKKwlzaXplX3QJCWxlbjsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoKHJldF9kYmxpc3QgPT0gMCkgJiYgZnMtPmRibGlzdCAmJgorCSAgICAoZnMtPmRibGlzdC0+bWFnaWMgPT0gRVhUMl9FVF9NQUdJQ19EQkxJU1QpKQorCQlyZXR1cm4gMDsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfZGJsaXN0KSwgJmRibGlzdCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQoZGJsaXN0LCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfc3RydWN0X2RibGlzdCkpOworCisJZGJsaXN0LT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfREJMSVNUOworCWRibGlzdC0+ZnMgPSBmczsKKwlpZiAoc2l6ZSkKKwkJZGJsaXN0LT5zaXplID0gc2l6ZTsKKwllbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9udW1fZGlycyhmcywgJmRibGlzdC0+c2l6ZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJCWRibGlzdC0+c2l6ZSA9IChkYmxpc3QtPnNpemUgKiAyKSArIDEyOworCX0KKwlsZW4gPSAoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGV4dDJfZGJfZW50cnkpICogZGJsaXN0LT5zaXplOworCWRibGlzdC0+Y291bnQgPSBjb3VudDsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShsZW4sICZkYmxpc3QtPmxpc3QpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChsaXN0KQorCQltZW1jcHkoZGJsaXN0LT5saXN0LCBsaXN0LCBsZW4pOworCWVsc2UKKwkJbWVtc2V0KGRibGlzdC0+bGlzdCwgMCwgbGVuKTsKKwlpZiAocmV0X2RibGlzdCkKKwkJKnJldF9kYmxpc3QgPSBkYmxpc3Q7CisJZWxzZQorCQlmcy0+ZGJsaXN0ID0gZGJsaXN0OworCXJldHVybiAwOworY2xlYW51cDoKKwlleHQyZnNfZnJlZV9tZW0oJmRibGlzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBkaXJlY3RvcnkgYmxvY2sgbGlzdAorICovCitlcnJjb2RlX3QgZXh0MmZzX2luaXRfZGJsaXN0KGV4dDJfZmlsc3lzIGZzLCBleHQyX2RibGlzdCAqcmV0X2RibGlzdCkKK3sKKwlleHQyX2RibGlzdAlkYmxpc3Q7CisJZXJyY29kZV90CXJldHZhbDsKKworCXJldHZhbCA9IG1ha2VfZGJsaXN0KGZzLCAwLCAwLCAwLCAmZGJsaXN0KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZGJsaXN0LT5zb3J0ZWQgPSAxOworCWlmIChyZXRfZGJsaXN0KQorCQkqcmV0X2RibGlzdCA9IGRibGlzdDsKKwllbHNlCisJCWZzLT5kYmxpc3QgPSBkYmxpc3Q7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgYSBkaXJlY3RvcnkgYmxvY2sgbGlzdAorICovCitlcnJjb2RlX3QgZXh0MmZzX2NvcHlfZGJsaXN0KGV4dDJfZGJsaXN0IHNyYywgZXh0Ml9kYmxpc3QgKmRlc3QpCit7CisJZXh0Ml9kYmxpc3QJZGJsaXN0OworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlyZXR2YWwgPSBtYWtlX2RibGlzdChzcmMtPmZzLCBzcmMtPnNpemUsIHNyYy0+Y291bnQsIHNyYy0+bGlzdCwKKwkJCSAgICAgJmRibGlzdCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlkYmxpc3QtPnNvcnRlZCA9IHNyYy0+c29ydGVkOworCSpkZXN0ID0gZGJsaXN0OworCXJldHVybiAwOworfQorCisvKgorICogQ2xvc2UgYSBkaXJlY3RvcnkgYmxvY2sgbGlzdAorICoKKyAqIChtb3ZlZCB0byBjbG9zZWZzLmMpCisgKi8KKworCisvKgorICogQWRkIGEgZGlyZWN0b3J5IGJsb2NrIHRvIHRoZSBkaXJlY3RvcnkgYmxvY2sgbGlzdAorICovCitlcnJjb2RlX3QgZXh0MmZzX2FkZF9kaXJfYmxvY2soZXh0Ml9kYmxpc3QgZGJsaXN0LCBleHQyX2lub190IGlubywgYmxrX3QgYmxrLAorCQkJICAgICAgIGludCBibG9ja2NudCkKK3sKKwlzdHJ1Y3QgZXh0Ml9kYl9lbnRyeQkqbmV3X2VudHJ5OworCWVycmNvZGVfdAkJcmV0dmFsOworCXVuc2lnbmVkIGxvbmcJCW9sZF9zaXplOworCisJRVhUMl9DSEVDS19NQUdJQyhkYmxpc3QsIEVYVDJfRVRfTUFHSUNfREJMSVNUKTsKKworCWlmIChkYmxpc3QtPmNvdW50ID49IGRibGlzdC0+c2l6ZSkgeworCQlvbGRfc2l6ZSA9IGRibGlzdC0+c2l6ZSAqIHNpemVvZihzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSk7CisJCWRibGlzdC0+c2l6ZSArPSAxMDA7CisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKG9sZF9zaXplLCAoc2l6ZV90KSBkYmxpc3QtPnNpemUgKgorCQkJCQkgICBzaXplb2Yoc3RydWN0IGV4dDJfZGJfZW50cnkpLAorCQkJCQkgICAmZGJsaXN0LT5saXN0KTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGJsaXN0LT5zaXplIC09IDEwMDsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisJbmV3X2VudHJ5ID0gZGJsaXN0LT5saXN0ICsgKCAoaW50KSBkYmxpc3QtPmNvdW50KyspOworCW5ld19lbnRyeS0+YmxrID0gYmxrOworCW5ld19lbnRyeS0+aW5vID0gaW5vOworCW5ld19lbnRyeS0+YmxvY2tjbnQgPSBibG9ja2NudDsKKworCWRibGlzdC0+c29ydGVkID0gMDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hhbmdlIHRoZSBkaXJlY3RvcnkgYmxvY2sgdG8gdGhlIGRpcmVjdG9yeSBibG9jayBsaXN0CisgKi8KK2VycmNvZGVfdCBleHQyZnNfc2V0X2Rpcl9ibG9jayhleHQyX2RibGlzdCBkYmxpc3QsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCBibGssCisJCQkgICAgICAgaW50IGJsb2NrY250KQoreworCWRncnBfdAkJCWk7CisKKwlFWFQyX0NIRUNLX01BR0lDKGRibGlzdCwgRVhUMl9FVF9NQUdJQ19EQkxJU1QpOworCisJZm9yIChpPTA7IGkgPCBkYmxpc3QtPmNvdW50OyBpKyspIHsKKwkJaWYgKChkYmxpc3QtPmxpc3RbaV0uaW5vICE9IGlubykgfHwKKwkJICAgIChkYmxpc3QtPmxpc3RbaV0uYmxvY2tjbnQgIT0gYmxvY2tjbnQpKQorCQkJY29udGludWU7CisJCWRibGlzdC0+bGlzdFtpXS5ibGsgPSBibGs7CisJCWRibGlzdC0+c29ydGVkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBFWFQyX0VUX0RCX05PVF9GT1VORDsKK30KKwordm9pZCBleHQyZnNfZGJsaXN0X3NvcnQoZXh0Ml9kYmxpc3QgZGJsaXN0LAorCQkJaW50ICgqc29ydGZ1bmMpKGNvbnN0IHZvaWQgKiwKKwkJCQkJCSAgICBjb25zdCB2b2lkICopKQoreworCWlmICghc29ydGZ1bmMpCisJCXNvcnRmdW5jID0gZGlyX2Jsb2NrX2NtcDsKKwlxc29ydChkYmxpc3QtPmxpc3QsIChzaXplX3QpIGRibGlzdC0+Y291bnQsCisJICAgICAgc2l6ZW9mKHN0cnVjdCBleHQyX2RiX2VudHJ5KSwgc29ydGZ1bmMpOworCWRibGlzdC0+c29ydGVkID0gMTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciB0aGUgZGlyZWN0b3J5IGJsb2NrIGxpc3QKKyAqLworZXJyY29kZV90IGV4dDJmc19kYmxpc3RfaXRlcmF0ZShleHQyX2RibGlzdCBkYmxpc3QsCisJCQkJaW50ICgqZnVuYykoZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgICBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfaW5mbywKKwkJCQkJICAgIHZvaWQJKnByaXZfZGF0YSksCisJCQkJdm9pZCAqcHJpdl9kYXRhKQoreworCWV4dDJfaW5vX3QJaTsKKwlpbnQJCXJldDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZGJsaXN0LCBFWFQyX0VUX01BR0lDX0RCTElTVCk7CisKKwlpZiAoIWRibGlzdC0+c29ydGVkKQorCQlleHQyZnNfZGJsaXN0X3NvcnQoZGJsaXN0LCAwKTsKKwlmb3IgKGk9MDsgaSA8IGRibGlzdC0+Y291bnQ7IGkrKykgeworCQlyZXQgPSAoKmZ1bmMpKGRibGlzdC0+ZnMsICZkYmxpc3QtPmxpc3RbKGludClpXSwgcHJpdl9kYXRhKTsKKwkJaWYgKHJldCAmIERCTElTVF9BQk9SVCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXJfYmxvY2tfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRiX2EgPQorCQkoY29uc3Qgc3RydWN0IGV4dDJfZGJfZW50cnkgKikgYTsKKwljb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfYiA9CisJCShjb25zdCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqKSBiOworCisJaWYgKGRiX2EtPmJsayAhPSBkYl9iLT5ibGspCisJCXJldHVybiAoaW50KSAoZGJfYS0+YmxrIC0gZGJfYi0+YmxrKTsKKworCWlmIChkYl9hLT5pbm8gIT0gZGJfYi0+aW5vKQorCQlyZXR1cm4gKGludCkgKGRiX2EtPmlubyAtIGRiX2ItPmlubyk7CisKKwlyZXR1cm4gKGludCkgKGRiX2EtPmJsb2NrY250IC0gZGJfYi0+YmxvY2tjbnQpOworfQorCitpbnQgZXh0MmZzX2RibGlzdF9jb3VudChleHQyX2RibGlzdCBkYmxpc3QpCit7CisJcmV0dXJuIChpbnQpIGRibGlzdC0+Y291bnQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGJsaXN0X2Rpci5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2RibGlzdF9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM5MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2RibGlzdF9kaXIuYwpAQCAtMCwwICsxLDc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkYmxpc3RfZGlyLmMgLS0tIGl0ZXJhdGUgYnkgZGlyZWN0b3J5IGVudHJ5CisgKgorICogQ29weXJpZ2h0IDE5OTcgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK3N0YXRpYyBpbnQgZGJfZGlyX3Byb2MoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBleHQyX2RiX2VudHJ5ICpkYl9pbmZvLAorCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKTsKKworZXJyY29kZV90IGV4dDJmc19kYmxpc3RfZGlyX2l0ZXJhdGUoZXh0Ml9kYmxpc3QgZGJsaXN0LAorCQkJCSAgICBpbnQJZmxhZ3MsCisJCQkJICAgIGNoYXIJKmJsb2NrX2J1ZiwKKwkJCQkgICAgaW50ICgqZnVuYykoZXh0Ml9pbm9fdCBkaXIsCisJCQkJCQlpbnQJZW50cnksCisJCQkJCQlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCQkJCWludAlvZmZzZXQsCisJCQkJCQlpbnQJYmxvY2tzaXplLAorCQkJCQkJY2hhcgkqYnVmLAorCQkJCQkJdm9pZAkqcHJpdl9kYXRhKSwKKwkJCQkgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCWVycmNvZGVfdAkJcmV0dmFsOworCXN0cnVjdCBkaXJfY29udGV4dAljdHg7CisKKwlFWFQyX0NIRUNLX01BR0lDKGRibGlzdCwgRVhUMl9FVF9NQUdJQ19EQkxJU1QpOworCisJY3R4LmRpciA9IDA7CisJY3R4LmZsYWdzID0gZmxhZ3M7CisJaWYgKGJsb2NrX2J1ZikKKwkJY3R4LmJ1ZiA9IGJsb2NrX2J1ZjsKKwllbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZGJsaXN0LT5mcy0+YmxvY2tzaXplLCAmY3R4LmJ1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwljdHguZnVuYyA9IGZ1bmM7CisJY3R4LnByaXZfZGF0YSA9IHByaXZfZGF0YTsKKwljdHguZXJyY29kZSA9IDA7CisKKwlyZXR2YWwgPSBleHQyZnNfZGJsaXN0X2l0ZXJhdGUoZGJsaXN0LCBkYl9kaXJfcHJvYywgJmN0eCk7CisKKwlpZiAoIWJsb2NrX2J1ZikKKwkJZXh0MmZzX2ZyZWVfbWVtKCZjdHguYnVmKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBjdHguZXJyY29kZTsKK30KKworc3RhdGljIGludCBkYl9kaXJfcHJvYyhleHQyX2ZpbHN5cyBmcywgc3RydWN0IGV4dDJfZGJfZW50cnkgKmRiX2luZm8sCisJCSAgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IGRpcl9jb250ZXh0CSpjdHg7CisKKwljdHggPSAoc3RydWN0IGRpcl9jb250ZXh0ICopIHByaXZfZGF0YTsKKwljdHgtPmRpciA9IGRiX2luZm8tPmlubzsKKworCXJldHVybiBleHQyZnNfcHJvY2Vzc19kaXJfYmxvY2soZnMsICZkYl9pbmZvLT5ibGssCisJCQkJCWRiX2luZm8tPmJsb2NrY250LCAwLCAwLCBwcml2X2RhdGEpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Rpcl9pdGVyYXRlLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZGlyX2l0ZXJhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjVkYWUwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Rpcl9pdGVyYXRlLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRpcl9pdGVyYXRlLmMgLS0tIGV4dDJmcyBkaXJlY3RvcnkgaXRlcmF0aW9uIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgd2hldGhlciBvciBub3QgYSBwb3RlbnRpYWwgZGVsZXRlZAorICogZGlyZWN0b3J5IGVudHJ5IGxvb2tzIHZhbGlkLiAgV2hhdCB3ZSBkbyBpcyBjaGVjayB0aGUgZGVsZXRlZCBlbnRyeQorICogYW5kIGVhY2ggc3VjY2Vzc2l2ZSBlbnRyeSB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGFsbCBsb29rIHZhbGlkIGFuZAorICogdGhhdCB0aGUgbGFzdCBkZWxldGVkIGVudHJ5IGVuZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dAorICogdW5kZWxldGVkIGVudHJ5LiAgUmV0dXJucyAxIGlmIHRoZSBkZWxldGVkIGVudHJ5IGxvb2tzIHZhbGlkLCB6ZXJvCisgKiBpZiBub3QgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgZXh0MmZzX3ZhbGlkYXRlX2VudHJ5KGNoYXIgKmJ1ZiwgaW50IG9mZnNldCwgaW50IGZpbmFsX29mZnNldCkKK3sKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudDsKKworCXdoaWxlIChvZmZzZXQgPCBmaW5hbF9vZmZzZXQpIHsKKwkJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKShidWYgKyBvZmZzZXQpOworCQlvZmZzZXQgKz0gZGlyZW50LT5yZWNfbGVuOworCQlpZiAoKGRpcmVudC0+cmVjX2xlbiA8IDgpIHx8CisJCSAgICAoKGRpcmVudC0+cmVjX2xlbiAlIDQpICE9IDApIHx8CisJCSAgICAoKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikrOCkgPiBkaXJlbnQtPnJlY19sZW4pKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAob2Zmc2V0ID09IGZpbmFsX29mZnNldCk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZGlyX2l0ZXJhdGUyKGV4dDJfZmlsc3lzIGZzLAorCQkJICAgICAgZXh0Ml9pbm9fdCBkaXIsCisJCQkgICAgICBpbnQgZmxhZ3MsCisJCQkgICAgICBjaGFyICpibG9ja19idWYsCisJCQkgICAgICBpbnQgKCpmdW5jKShleHQyX2lub190CWRpciwKKwkJCQkJICBpbnQJCWVudHJ5LAorCQkJCQkgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJCQkgIGludAlvZmZzZXQsCisJCQkJCSAgaW50CWJsb2Nrc2l6ZSwKKwkJCQkJICBjaGFyCSpidWYsCisJCQkJCSAgdm9pZAkqcHJpdl9kYXRhKSwKKwkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QJCWRpcl9jb250ZXh0CWN0eDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCXJldHZhbCA9IGV4dDJmc19jaGVja19kaXJlY3RvcnkoZnMsIGRpcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWN0eC5kaXIgPSBkaXI7CisJY3R4LmZsYWdzID0gZmxhZ3M7CisJaWYgKGJsb2NrX2J1ZikKKwkJY3R4LmJ1ZiA9IGJsb2NrX2J1ZjsKKwllbHNlIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmN0eC5idWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJY3R4LmZ1bmMgPSBmdW5jOworCWN0eC5wcml2X2RhdGEgPSBwcml2X2RhdGE7CisJY3R4LmVycmNvZGUgPSAwOworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgZGlyLCAwLCAwLAorCQkJCSAgICAgICBleHQyZnNfcHJvY2Vzc19kaXJfYmxvY2ssICZjdHgpOworCWlmICghYmxvY2tfYnVmKQorCQlleHQyZnNfZnJlZV9tZW0oJmN0eC5idWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGN0eC5lcnJjb2RlOworfQorCitzdHJ1Y3QgeGxhdGUgeworCWludCAoKmZ1bmMpKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkgICAgaW50CQlvZmZzZXQsCisJCSAgICBpbnQJCWJsb2Nrc2l6ZSwKKwkJICAgIGNoYXIJKmJ1ZiwKKwkJICAgIHZvaWQJKnByaXZfZGF0YSk7CisJdm9pZCAqcmVhbF9wcml2YXRlOworfTsKKworc3RhdGljIGludCB4bGF0ZV9mdW5jKGV4dDJfaW5vX3QgZGlyIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgaW50IGVudHJ5IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsIGludCBvZmZzZXQsCisJCSAgICAgIGludCBibG9ja3NpemUsIGNoYXIgKmJ1Ziwgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCB4bGF0ZSAqeGwgPSAoc3RydWN0IHhsYXRlICopIHByaXZfZGF0YTsKKworCXJldHVybiAoKnhsLT5mdW5jKShkaXJlbnQsIG9mZnNldCwgYmxvY2tzaXplLCBidWYsIHhsLT5yZWFsX3ByaXZhdGUpOworfQorCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19kaXJfaXRlcmF0ZShleHQyX2ZpbHN5cyBmcywKKwkJCSAgICAgIGV4dDJfaW5vX3QgZGlyLAorCQkJICAgICAgaW50IGZsYWdzLAorCQkJICAgICAgY2hhciAqYmxvY2tfYnVmLAorCQkJICAgICAgaW50ICgqZnVuYykoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkJCSAgaW50CW9mZnNldCwKKwkJCQkJICBpbnQJYmxvY2tzaXplLAorCQkJCQkgIGNoYXIJKmJ1ZiwKKwkJCQkJICB2b2lkCSpwcml2X2RhdGEpLAorCQkJICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCB4bGF0ZSB4bDsKKworCXhsLnJlYWxfcHJpdmF0ZSA9IHByaXZfZGF0YTsKKwl4bC5mdW5jID0gZnVuYzsKKworCXJldHVybiBleHQyZnNfZGlyX2l0ZXJhdGUyKGZzLCBkaXIsIGZsYWdzLCBibG9ja19idWYsCisJCQkJICAgeGxhdGVfZnVuYywgJnhsKTsKK30KKworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGlzIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUuICBVc2VkIGJ5CisgKiBleHQyZnNfZGlyX2l0ZXJhdGUoKSBhbmQgZXh0MmZzX2RibGlzdF9kaXJfaXRlcmF0ZSgpCisgKi8KK2ludCBleHQyZnNfcHJvY2Vzc19kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgIGJsa190CSpibG9ja25yLAorCQkJICAgICBlMl9ibGtjbnRfdCBibG9ja2NudCwKKwkJCSAgICAgYmxrX3QJcmVmX2Jsb2NrIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgaW50CXJlZl9vZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICB2b2lkCSpwcml2X2RhdGEpCit7CisJc3RydWN0IGRpcl9jb250ZXh0ICpjdHggPSAoc3RydWN0IGRpcl9jb250ZXh0ICopIHByaXZfZGF0YTsKKwl1bnNpZ25lZCBpbnQJb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBpbnQJbmV4dF9yZWFsX2VudHJ5ID0gMDsKKwlpbnQJCXJldCA9IDA7CisJaW50CQljaGFuZ2VkID0gMDsKKwlpbnQJCWRvX2Fib3J0ID0gMDsKKwlpbnQJCWVudHJ5LCBzaXplOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50OworCisJaWYgKGJsb2NrY250IDwgMCkKKwkJcmV0dXJuIDA7CisKKwllbnRyeSA9IGJsb2NrY250ID8gRElSRU5UX09USEVSX0ZJTEUgOiBESVJFTlRfRE9UX0ZJTEU7CisKKwljdHgtPmVycmNvZGUgPSBleHQyZnNfcmVhZF9kaXJfYmxvY2soZnMsICpibG9ja25yLCBjdHgtPmJ1Zik7CisJaWYgKGN0eC0+ZXJyY29kZSkKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCisJd2hpbGUgKG9mZnNldCA8IGZzLT5ibG9ja3NpemUpIHsKKwkJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSAoY3R4LT5idWYgKyBvZmZzZXQpOworCQlpZiAoKChvZmZzZXQgKyBkaXJlbnQtPnJlY19sZW4pID4gZnMtPmJsb2Nrc2l6ZSkgfHwKKwkJICAgIChkaXJlbnQtPnJlY19sZW4gPCA4KSB8fAorCQkgICAgKChkaXJlbnQtPnJlY19sZW4gJSA0KSAhPSAwKSB8fAorCQkgICAgKCgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpKzgpID4gZGlyZW50LT5yZWNfbGVuKSkgeworCQkJY3R4LT5lcnJjb2RlID0gRVhUMl9FVF9ESVJfQ09SUlVQVEVEOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCWlmICghZGlyZW50LT5pbm9kZSAmJgorCQkgICAgIShjdHgtPmZsYWdzICYgRElSRU5UX0ZMQUdfSU5DTFVERV9FTVBUWSkpCisJCQlnb3RvIG5leHQ7CisKKwkJcmV0ID0gKGN0eC0+ZnVuYykoY3R4LT5kaXIsCisJCQkJICAobmV4dF9yZWFsX2VudHJ5ID4gb2Zmc2V0KSA/CisJCQkJICBESVJFTlRfREVMRVRFRF9GSUxFIDogZW50cnksCisJCQkJICBkaXJlbnQsIG9mZnNldCwKKwkJCQkgIGZzLT5ibG9ja3NpemUsIGN0eC0+YnVmLAorCQkJCSAgY3R4LT5wcml2X2RhdGEpOworCQlpZiAoZW50cnkgPCBESVJFTlRfT1RIRVJfRklMRSkKKwkJCWVudHJ5Kys7CisKKwkJaWYgKHJldCAmIERJUkVOVF9DSEFOR0VEKQorCQkJY2hhbmdlZCsrOworCQlpZiAocmV0ICYgRElSRU5UX0FCT1JUKSB7CisJCQlkb19hYm9ydCsrOworCQkJYnJlYWs7CisJCX0KK25leHQ6CisJCWlmIChuZXh0X3JlYWxfZW50cnkgPT0gb2Zmc2V0KQorCQkJbmV4dF9yZWFsX2VudHJ5ICs9IGRpcmVudC0+cmVjX2xlbjsKKworCQlpZiAoY3R4LT5mbGFncyAmIERJUkVOVF9GTEFHX0lOQ0xVREVfUkVNT1ZFRCkgeworCQkJc2l6ZSA9ICgoZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpICsgMTEpICYgfjM7CisKKwkJCWlmIChkaXJlbnQtPnJlY19sZW4gIT0gc2l6ZSkgIHsKKwkJCQl1bnNpZ25lZCBpbnQgZmluYWxfb2Zmc2V0OworCisJCQkJZmluYWxfb2Zmc2V0ID0gb2Zmc2V0ICsgZGlyZW50LT5yZWNfbGVuOworCQkJCW9mZnNldCArPSBzaXplOworCQkJCXdoaWxlIChvZmZzZXQgPCBmaW5hbF9vZmZzZXQgJiYKKwkJCQkgICAgICAgIWV4dDJmc192YWxpZGF0ZV9lbnRyeShjdHgtPmJ1ZiwKKwkJCQkJCQkgICAgICBvZmZzZXQsCisJCQkJCQkJICAgICAgZmluYWxfb2Zmc2V0KSkKKwkJCQkJb2Zmc2V0ICs9IDQ7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJb2Zmc2V0ICs9IGRpcmVudC0+cmVjX2xlbjsKKwl9CisKKwlpZiAoY2hhbmdlZCkgeworCQljdHgtPmVycmNvZGUgPSBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGZzLCAqYmxvY2tuciwgY3R4LT5idWYpOworCQlpZiAoY3R4LT5lcnJjb2RlKQorCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwlpZiAoZG9fYWJvcnQpCisJCXJldHVybiBCTE9DS19BQk9SVDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kaXJibG9jay5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2RpcmJsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljNWExMAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kaXJibG9jay5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkaXJibG9jay5jIC0tLSBkaXJlY3RvcnkgYmxvY2sgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9kaXJfYmxvY2syKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywKKwkJCQkgdm9pZCAqYnVmLCBpbnQgZmxhZ3MgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJKnAsICplbmQ7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQ7CisJdW5zaWduZWQgaW50CW5hbWVfbGVuLCByZWNfbGVuOworI2lmIEJCX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgZG9fc3dhcDsKKyNlbmRpZgorCisJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsb2NrLCAxLCBidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisjaWYgQkJfQklHX0VORElBTgorCWRvX3N3YXAgPSAoZnMtPmZsYWdzICYgKEVYVDJfRkxBR19TV0FQX0JZVEVTfAorCQkJCUVYVDJfRkxBR19TV0FQX0JZVEVTX1JFQUQpKSAhPSAwOworI2VuZGlmCisJcCA9IChjaGFyICopIGJ1ZjsKKwllbmQgPSAoY2hhciAqKSBidWYgKyBmcy0+YmxvY2tzaXplOworCXdoaWxlIChwIDwgZW5kLTgpIHsKKwkJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSBwOworI2lmIEJCX0JJR19FTkRJQU4KKwkJaWYgKGRvX3N3YXApIHsKKwkJCWRpcmVudC0+aW5vZGUgPSBleHQyZnNfc3dhYjMyKGRpcmVudC0+aW5vZGUpOworCQkJZGlyZW50LT5yZWNfbGVuID0gZXh0MmZzX3N3YWIxNihkaXJlbnQtPnJlY19sZW4pOworCQkJZGlyZW50LT5uYW1lX2xlbiA9IGV4dDJmc19zd2FiMTYoZGlyZW50LT5uYW1lX2xlbik7CisJCX0KKyNlbmRpZgorCQluYW1lX2xlbiA9IGRpcmVudC0+bmFtZV9sZW47CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisJCWlmIChmbGFncyAmIEVYVDJfRElSQkxPQ0tfVjJfU1RSVUNUKQorCQkJZGlyZW50LT5uYW1lX2xlbiA9IGV4dDJmc19zd2FiMTYoZGlyZW50LT5uYW1lX2xlbik7CisjZW5kaWYKKwkJcmVjX2xlbiA9IGRpcmVudC0+cmVjX2xlbjsKKwkJaWYgKChyZWNfbGVuIDwgOCkgfHwgKHJlY19sZW4gJSA0KSkgeworCQkJcmVjX2xlbiA9IDg7CisJCQlyZXR2YWwgPSBFWFQyX0VUX0RJUl9DT1JSVVBURUQ7CisJCX0KKwkJaWYgKCgobmFtZV9sZW4gJiAweEZGKSArIDgpID4gZGlyZW50LT5yZWNfbGVuKQorCQkJcmV0dmFsID0gRVhUMl9FVF9ESVJfQ09SUlVQVEVEOworCQlwICs9IHJlY19sZW47CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCSB2b2lkICpidWYpCit7CisJcmV0dXJuIGV4dDJmc19yZWFkX2Rpcl9ibG9jazIoZnMsIGJsb2NrLCBidWYsIDApOworfQorCisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrMihleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2ssCisJCQkJICB2b2lkICppbmJ1ZiwgaW50IGZsYWdzIEVYVDJGU19BVFRSKCh1bnVzZWQpKSkKK3sKKyNpZiBCQl9CSUdfRU5ESUFOCisJaW50CQlkb19zd2FwID0gMDsKKwllcnJjb2RlX3QJcmV0dmFsOworCWNoYXIJCSpwLCAqZW5kOworCWNoYXIJCSpidWYgPSBOVUxMOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50OworCisJaWYgKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkgICAgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKSkKKwkJZG9fc3dhcCA9IDE7CisKKyNpZm5kZWYgV09SRFNfQklHRU5ESUFOCisJaWYgKCFkb19zd2FwKQorCQlyZXR1cm4gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibG9jaywgMSwgKGNoYXIgKikgaW5idWYpOworI2VuZGlmCisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYnVmKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbWNweShidWYsIGluYnVmLCBmcy0+YmxvY2tzaXplKTsKKwlwID0gYnVmOworCWVuZCA9IGJ1ZiArIGZzLT5ibG9ja3NpemU7CisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJZGlyZW50ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSBwOworCQlpZiAoKGRpcmVudC0+cmVjX2xlbiA8IDgpIHx8CisJCSAgICAoZGlyZW50LT5yZWNfbGVuICUgNCkpIHsKKwkJCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwkJCXJldHVybiBFWFQyX0VUX0RJUl9DT1JSVVBURUQ7CisJCX0KKwkJcCArPSBkaXJlbnQtPnJlY19sZW47CisJCWlmIChkb19zd2FwKSB7CisJCQlkaXJlbnQtPmlub2RlID0gZXh0MmZzX3N3YWIzMihkaXJlbnQtPmlub2RlKTsKKwkJCWRpcmVudC0+cmVjX2xlbiA9IGV4dDJmc19zd2FiMTYoZGlyZW50LT5yZWNfbGVuKTsKKwkJCWRpcmVudC0+bmFtZV9sZW4gPSBleHQyZnNfc3dhYjE2KGRpcmVudC0+bmFtZV9sZW4pOworCQl9CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisJCWlmIChmbGFncyAmIEVYVDJfRElSQkxPQ0tfVjJfU1RSVUNUKQorCQkJZGlyZW50LT5uYW1lX2xlbiA9IGV4dDJmc19zd2FiMTYoZGlyZW50LT5uYW1lX2xlbik7CisjZW5kaWYKKwl9CisJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibG9jaywgMSwgYnVmKTsKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJcmV0dXJuIHJldHZhbDsKKyNlbHNlCisJcmV0dXJuIGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxvY2ssIDEsIChjaGFyICopIGluYnVmKTsKKyNlbmRpZgorfQorCisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywKKwkJCQkgdm9pZCAqaW5idWYpCit7CisJcmV0dXJuIGV4dDJmc193cml0ZV9kaXJfYmxvY2syKGZzLCBibG9jaywgaW5idWYsIDApOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2Rpcmhhc2guYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kaXJoYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllMzRiZQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kaXJoYXNoLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRpcmhhc2guYyAtLSBDYWxjdWxhdGUgdGhlIGhhc2ggb2YgYSBkaXJlY3RvcnkgZW50cnkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgIERhbmllbCBQaGlsbGlwcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBLZXllZCAzMi1iaXQgaGFzaCBmdW5jdGlvbiB1c2luZyBURUEgaW4gYSBEYXZpcy1NZXllciBmdW5jdGlvbgorICogICBIMCA9IEtleQorICogICBIaSA9IEUgTWkoSGktMSkgKyBIaS0xCisgKgorICogKHNlZSBBcHBsaWVkIENyeXB0b2dyYXBoeSwgMm5kIGVkaXRpb24sIHA0NDgpLgorICoKKyAqIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUB6aXAuY29tLmF1PiAxOTk4CisgKgorICogVGhpcyBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMCisgKi8KKyNkZWZpbmUgREVMVEEgMHg5RTM3NzlCOQorCitzdGF0aWMgdm9pZCBURUFfdHJhbnNmb3JtKF9fdTMyIGJ1Zls0XSwgX191MzIgY29uc3QgaW5bXSkKK3sKKwlfX3UzMglzdW0gPSAwOworCV9fdTMyCWIwID0gYnVmWzBdLCBiMSA9IGJ1ZlsxXTsKKwlfX3UzMglhID0gaW5bMF0sIGIgPSBpblsxXSwgYyA9IGluWzJdLCBkID0gaW5bM107CisJaW50CW4gPSAxNjsKKworCWRvIHsKKwkJc3VtICs9IERFTFRBOworCQliMCArPSAoKGIxIDw8IDQpK2EpIF4gKGIxK3N1bSkgXiAoKGIxID4+IDUpK2IpOworCQliMSArPSAoKGIwIDw8IDQpK2MpIF4gKGIwK3N1bSkgXiAoKGIwID4+IDUpK2QpOworCX0gd2hpbGUgKC0tbik7CisKKwlidWZbMF0gKz0gYjA7CisJYnVmWzFdICs9IGIxOworfQorCisvKiBGLCBHIGFuZCBIIGFyZSBiYXNpYyBNRDQgZnVuY3Rpb25zOiBzZWxlY3Rpb24sIG1ham9yaXR5LCBwYXJpdHkgKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKHopIF4gKCh4KSAmICgoeSkgXiAoeikpKSkKKyNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh5KSkgKyAoKCh4KSBeICh5KSkgJiAoeikpKQorI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisKKy8qCisgKiBUaGUgZ2VuZXJpYyByb3VuZCBmdW5jdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiBpcyBzbyBzcGVjaWZpYyB0aGF0CisgKiB3ZSBkb24ndCBib3RoZXIgcHJvdGVjdGluZyBhbGwgdGhlIGFyZ3VtZW50cyB3aXRoIHBhcmVucywgYXMgaXMgZ2VuZXJhbGx5CisgKiBnb29kIG1hY3JvIHByYWN0aWNlLCBpbiBmYXZvciBvZiBleHRyYSBsZWdpYmlsaXR5LgorICogUm90YXRpb24gaXMgc2VwYXJhdGUgZnJvbSBhZGRpdGlvbiB0byBwcmV2ZW50IHJlY29tcHV0YXRpb24KKyAqLworI2RlZmluZSBST1VORChmLCBhLCBiLCBjLCBkLCB4LCBzKQlcCisJKGEgKz0gZihiLCBjLCBkKSArIHgsIGEgPSAoYSA8PCBzKSB8IChhID4+ICgzMi1zKSkpCisjZGVmaW5lIEsxIDAKKyNkZWZpbmUgSzIgMDEzMjQwNDc0NjMxVUwKKyNkZWZpbmUgSzMgMDE1NjY2MzY1NjQxVUwKKworLyoKKyAqIEJhc2ljIGN1dC1kb3duIE1ENCB0cmFuc2Zvcm0uICBSZXR1cm5zIG9ubHkgMzIgYml0cyBvZiByZXN1bHQuCisgKi8KK3N0YXRpYyB2b2lkIGhhbGZNRDRUcmFuc2Zvcm0gKF9fdTMyIGJ1Zls0XSwgX191MzIgY29uc3QgaW5bXSkKK3sKKwlfX3UzMglhID0gYnVmWzBdLCBiID0gYnVmWzFdLCBjID0gYnVmWzJdLCBkID0gYnVmWzNdOworCisJLyogUm91bmQgMSAqLworCVJPVU5EKEYsIGEsIGIsIGMsIGQsIGluWzBdICsgSzEsICAzKTsKKwlST1VORChGLCBkLCBhLCBiLCBjLCBpblsxXSArIEsxLCAgNyk7CisJUk9VTkQoRiwgYywgZCwgYSwgYiwgaW5bMl0gKyBLMSwgMTEpOworCVJPVU5EKEYsIGIsIGMsIGQsIGEsIGluWzNdICsgSzEsIDE5KTsKKwlST1VORChGLCBhLCBiLCBjLCBkLCBpbls0XSArIEsxLCAgMyk7CisJUk9VTkQoRiwgZCwgYSwgYiwgYywgaW5bNV0gKyBLMSwgIDcpOworCVJPVU5EKEYsIGMsIGQsIGEsIGIsIGluWzZdICsgSzEsIDExKTsKKwlST1VORChGLCBiLCBjLCBkLCBhLCBpbls3XSArIEsxLCAxOSk7CisKKwkvKiBSb3VuZCAyICovCisJUk9VTkQoRywgYSwgYiwgYywgZCwgaW5bMV0gKyBLMiwgIDMpOworCVJPVU5EKEcsIGQsIGEsIGIsIGMsIGluWzNdICsgSzIsICA1KTsKKwlST1VORChHLCBjLCBkLCBhLCBiLCBpbls1XSArIEsyLCAgOSk7CisJUk9VTkQoRywgYiwgYywgZCwgYSwgaW5bN10gKyBLMiwgMTMpOworCVJPVU5EKEcsIGEsIGIsIGMsIGQsIGluWzBdICsgSzIsICAzKTsKKwlST1VORChHLCBkLCBhLCBiLCBjLCBpblsyXSArIEsyLCAgNSk7CisJUk9VTkQoRywgYywgZCwgYSwgYiwgaW5bNF0gKyBLMiwgIDkpOworCVJPVU5EKEcsIGIsIGMsIGQsIGEsIGluWzZdICsgSzIsIDEzKTsKKworCS8qIFJvdW5kIDMgKi8KKwlST1VORChILCBhLCBiLCBjLCBkLCBpblszXSArIEszLCAgMyk7CisJUk9VTkQoSCwgZCwgYSwgYiwgYywgaW5bN10gKyBLMywgIDkpOworCVJPVU5EKEgsIGMsIGQsIGEsIGIsIGluWzJdICsgSzMsIDExKTsKKwlST1VORChILCBiLCBjLCBkLCBhLCBpbls2XSArIEszLCAxNSk7CisJUk9VTkQoSCwgYSwgYiwgYywgZCwgaW5bMV0gKyBLMywgIDMpOworCVJPVU5EKEgsIGQsIGEsIGIsIGMsIGluWzVdICsgSzMsICA5KTsKKwlST1VORChILCBjLCBkLCBhLCBiLCBpblswXSArIEszLCAxMSk7CisJUk9VTkQoSCwgYiwgYywgZCwgYSwgaW5bNF0gKyBLMywgMTUpOworCisJYnVmWzBdICs9IGE7CisJYnVmWzFdICs9IGI7CisJYnVmWzJdICs9IGM7CisJYnVmWzNdICs9IGQ7Cit9CisKKyN1bmRlZiBST1VORAorI3VuZGVmIEYKKyN1bmRlZiBHCisjdW5kZWYgSAorI3VuZGVmIEsxCisjdW5kZWYgSzIKKyN1bmRlZiBLMworCisvKiBUaGUgb2xkIGxlZ2FjeSBoYXNoICovCitzdGF0aWMgZXh0Ml9kaXJoYXNoX3QgZHhfaGFja19oYXNoIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCXdoaWxlIChsZW4tLSkgeworCQlfX3UzMiBoYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKm5hbWUrKyAqIDcxNTIzNzMpKTsKKworCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwkJaGFzaDEgPSBoYXNoMDsKKwkJaGFzaDAgPSBoYXNoOworCX0KKwlyZXR1cm4gKGhhc2gwIDw8IDEpOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCit7CisJX191MzIJcGFkLCB2YWw7CisJaW50CWk7CisKKwlwYWQgPSAoX191MzIpbGVuIHwgKChfX3UzMilsZW4gPDwgOCk7CisJcGFkIHw9IHBhZCA8PCAxNjsKKworCXZhbCA9IHBhZDsKKwlpZiAobGVuID4gbnVtKjQpCisJCWxlbiA9IG51bSAqIDQ7CisJZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOworCQlpZiAoKGkgJSA0KSA9PSAzKSB7CisJCQkqYnVmKysgPSB2YWw7CisJCQl2YWwgPSBwYWQ7CisJCQludW0tLTsKKwkJfQorCX0KKwlpZiAoLS1udW0gPj0gMCkKKwkJKmJ1ZisrID0gdmFsOworCXdoaWxlICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSBwYWQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIGEgZmlsZW5hbWUuICBJZiBsZW4gaXMgMCBhbmQgbmFtZSBpcyBOVUxMLCB0aGVuCisgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBvciBub3QgYSBoYXNoIHZlcnNpb24gaXMKKyAqIHN1cHBvcnRlZC4KKyAqCisgKiBUaGUgc2VlZCBpcyBhbiA0IGxvbmd3b3JkICgzMiBiaXRzKSAic2VjcmV0IiB3aGljaCBjYW4gYmUgdXNlZCB0bworICogdW5pcXVpZnkgYSBoYXNoLiAgSWYgdGhlIHNlZWQgaXMgYWxsIHplcm8ncywgdGhlbiBzb21lIGRlZmF1bHQgc2VlZAorICogbWF5IGJlIHVzZWQuCisgKgorICogQSBwYXJ0aWN1bGFyIGhhc2ggdmVyc2lvbiBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHNlZWQgaXMKKyAqIHJlcHJlc2VudGVkLCBhbmQgd2hldGhlciBvciBub3QgdGhlIHJldHVybmVkIGhhc2ggaXMgMzIgYml0cyBvciA2NAorICogYml0cy4gIDMyIGJpdCBoYXNoZXMgd2lsbCByZXR1cm4gMCBmb3IgdGhlIG1pbm9yIGhhc2guCisgKi8KK2VycmNvZGVfdCBleHQyZnNfZGlyaGFzaChpbnQgdmVyc2lvbiwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSBjb25zdCBfX3UzMiAqc2VlZCwKKwkJCSBleHQyX2Rpcmhhc2hfdCAqcmV0X2hhc2gsCisJCQkgZXh0Ml9kaXJoYXNoX3QgKnJldF9taW5vcl9oYXNoKQoreworCV9fdTMyCWhhc2g7CisJX191MzIJbWlub3JfaGFzaCA9IDA7CisJY29uc3QgY2hhcgkqcDsKKwlpbnQJCWk7CisJX191MzIJCWluWzhdLCBidWZbNF07CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHNlZWQgZm9yIHRoZSBoYXNoIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLworCWJ1ZlswXSA9IDB4Njc0NTIzMDE7CisJYnVmWzFdID0gMHhlZmNkYWI4OTsKKwlidWZbMl0gPSAweDk4YmFkY2ZlOworCWJ1ZlszXSA9IDB4MTAzMjU0NzY7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIHNlZWQgaXMgYWxsIHplcm8ncyAqLworCWlmIChzZWVkKSB7CisJCWZvciAoaT0wOyBpIDwgNDsgaSsrKSB7CisJCQlpZiAoc2VlZFtpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA8IDQpCisJCQltZW1jcHkoYnVmLCBzZWVkLCBzaXplb2YoYnVmKSk7CisJfQorCisJc3dpdGNoICh2ZXJzaW9uKSB7CisJY2FzZSBFWFQyX0hBU0hfTEVHQUNZOgorCQloYXNoID0gZHhfaGFja19oYXNoKG5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgRVhUMl9IQVNIX0hBTEZfTUQ0OgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDgpOworCQkJaGFsZk1ENFRyYW5zZm9ybShidWYsIGluKTsKKwkJCWxlbiAtPSAzMjsKKwkJCXAgKz0gMzI7CisJCX0KKwkJbWlub3JfaGFzaCA9IGJ1ZlsyXTsKKwkJaGFzaCA9IGJ1ZlsxXTsKKwkJYnJlYWs7CisJY2FzZSBFWFQyX0hBU0hfVEVBOgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDQpOworCQkJVEVBX3RyYW5zZm9ybShidWYsIGluKTsKKwkJCWxlbiAtPSAxNjsKKwkJCXAgKz0gMTY7CisJCX0KKwkJaGFzaCA9IGJ1ZlswXTsKKwkJbWlub3JfaGFzaCA9IGJ1ZlsxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnJldF9oYXNoID0gMDsKKwkJcmV0dXJuIEVYVDJfRVRfRElSSEFTSF9VTlNVUFA7CisJfQorCSpyZXRfaGFzaCA9IGhhc2ggJiB+MTsKKwlpZiAocmV0X21pbm9yX2hhc2gpCisJCSpyZXRfbWlub3JfaGFzaCA9IG1pbm9yX2hhc2g7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZHVwZnMuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9kdXBmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODc5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZHVwZnMuYwpAQCAtMCwwICsxLDk1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkdXBmcy5jIC0tLSBkdXBsaWNhdGUgYSBleHQyIGZpbGVzeXN0ZW0gaGFuZGxlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAxLCAyMDAzLCAyMDA1IGJ5IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzUC5oIgorCitlcnJjb2RlX3QgZXh0MmZzX2R1cF9oYW5kbGUoZXh0Ml9maWxzeXMgc3JjLCBleHQyX2ZpbHN5cyAqZGVzdCkKK3sKKwlleHQyX2ZpbHN5cwlmczsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhzcmMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IHN0cnVjdF9leHQyX2ZpbHN5cyksICZmcyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCSpmcyA9ICpzcmM7CisJZnMtPmRldmljZV9uYW1lID0gMDsKKwlmcy0+c3VwZXIgPSAwOworCWZzLT5vcmlnX3N1cGVyID0gMDsKKwlmcy0+Z3JvdXBfZGVzYyA9IDA7CisJZnMtPmlub2RlX21hcCA9IDA7CisJZnMtPmJsb2NrX21hcCA9IDA7CisJZnMtPmJhZGJsb2NrcyA9IDA7CisJZnMtPmRibGlzdCA9IDA7CisKKwlpb19jaGFubmVsX2J1bXBjb3VudChmcy0+aW8pOworCWlmIChmcy0+aWNhY2hlKQorCQlmcy0+aWNhY2hlLT5yZWZjb3VudCsrOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKHNyYy0+ZGV2aWNlX25hbWUpKzEsICZmcy0+ZGV2aWNlX25hbWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCXN0cmNweShmcy0+ZGV2aWNlX25hbWUsIHNyYy0+ZGV2aWNlX25hbWUpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oU1VQRVJCTE9DS19TSVpFLCAmZnMtPnN1cGVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1jcHkoZnMtPnN1cGVyLCBzcmMtPnN1cGVyLCBTVVBFUkJMT0NLX1NJWkUpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oU1VQRVJCTE9DS19TSVpFLCAmZnMtPm9yaWdfc3VwZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbWNweShmcy0+b3JpZ19zdXBlciwgc3JjLT5vcmlnX3N1cGVyLCBTVVBFUkJMT0NLX1NJWkUpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oKHNpemVfdCkgZnMtPmRlc2NfYmxvY2tzICogZnMtPmJsb2Nrc2l6ZSwKKwkJCQkmZnMtPmdyb3VwX2Rlc2MpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbWNweShmcy0+Z3JvdXBfZGVzYywgc3JjLT5ncm91cF9kZXNjLAorCSAgICAgICAoc2l6ZV90KSBmcy0+ZGVzY19ibG9ja3MgKiBmcy0+YmxvY2tzaXplKTsKKworCWlmIChzcmMtPmlub2RlX21hcCkgeworCQlyZXR2YWwgPSBleHQyZnNfY29weV9iaXRtYXAoc3JjLT5pbm9kZV9tYXAsICZmcy0+aW5vZGVfbWFwKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKwlpZiAoc3JjLT5ibG9ja19tYXApIHsKKwkJcmV0dmFsID0gZXh0MmZzX2NvcHlfYml0bWFwKHNyYy0+YmxvY2tfbWFwLCAmZnMtPmJsb2NrX21hcCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKHNyYy0+YmFkYmxvY2tzKSB7CisJCXJldHZhbCA9IGV4dDJmc19iYWRibG9ja3NfY29weShzcmMtPmJhZGJsb2NrcywgJmZzLT5iYWRibG9ja3MpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJfQorCWlmIChzcmMtPmRibGlzdCkgeworCQlyZXR2YWwgPSBleHQyZnNfY29weV9kYmxpc3Qoc3JjLT5kYmxpc3QsICZmcy0+ZGJsaXN0KTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKwkqZGVzdCA9IGZzOworCXJldHVybiAwOworZXJyb3V0OgorCWV4dDJmc19mcmVlKGZzKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2UyaW1hZ2UuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9lMmltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5OGQwMQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9lMmltYWdlLmgKQEAgLTAsMCArMSwzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZTJpbWFnZS5oIC0tLSBoZWFkZXIgZmlsZSBkZXNjcmliaW5nIHRoZSBleHQyIGltYWdlIGZvcm1hdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUaGVvZG9yZSBUcydvLgorICoKKyAqIE5vdGU6IHRoaXMgdXNlcyB0aGUgUE9TSVggSU8gaW50ZXJmYWNlcywgdW5saWtlIG1vc3Qgb2YgdGhlIG90aGVyCisgKiBmdW5jdGlvbnMgaW4gdGhpcyBsaWJyYXJ5LiAgU28gc3VlIG1lLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworCitzdHJ1Y3QgZXh0Ml9pbWFnZV9oZHIgeworCV9fdTMyCW1hZ2ljX251bWJlcjsJLyogVGhpcyBtdXN0IGJlIEVYVDJfRVRfTUFHSUNfRTJJTUFHRSAqLworCWNoYXIJbWFnaWNfZGVzY3JpcHRvclsxNl07IC8qICJFeHQyIEltYWdlIDEuMCIsIHcvIG51bGwgcGFkZGluZyAqLworCWNoYXIJZnNfaG9zdG5hbWVbNjRdOy8qIEhvc3RuYW1lIG9mIG1hY2hpbmUgb2YgaW1hZ2UgKi8KKwljaGFyCWZzX25ldGFkZHJbMzJdOwkvKiBOZXR3b3JrIGFkZHJlc3MgKi8KKwlfX3UzMglmc19uZXRhZGRyX3R5cGU7LyogMCA9IElQVjQsIDEgPSBJUFY2LCBldGMuICovCisJX191MzIJZnNfZGV2aWNlOwkvKiBEZXZpY2UgbnVtYmVyIG9mIGltYWdlICovCisJY2hhcglmc19kZXZpY2VfbmFtZVs2NF07IC8qIERldmljZSBuYW1lICovCisJY2hhcglmc191dWlkWzE2XTsJLyogVVVJRCBvZiBmaWxlc3lzdGVtICovCisJX191MzIJZnNfYmxvY2tzaXplOwkvKiBCbG9jayBzaXplIG9mIHRoZSBmaWxlc3lzdGVtICovCisJX191MzIJZnNfcmVzZXJ2ZWRbOF07CisKKwlfX3UzMglpbWFnZV9kZXZpY2U7CS8qIERldmljZSBudW1iZXIgb2YgaW1hZ2UgZmlsZSAqLworCV9fdTMyCWltYWdlX2lub2RlOwkvKiBJbm9kZSBudW1iZXIgb2YgaW1hZ2UgZmlsZSAqLworCV9fdTMyCWltYWdlX3RpbWU7CS8qIFRpbWUgb2YgaW1hZ2UgY3JlYXRpb24gKi8KKwlfX3UzMglpbWFnZV9yZXNlcnZlZFs4XTsKKworCV9fdTMyCW9mZnNldF9zdXBlcjsJLyogQnl0ZSBvZmZzZXQgb2YgdGhlIHNiIGFuZCBkZXNjcmlwdG9ycyAqLworCV9fdTMyCW9mZnNldF9pbm9kZTsJLyogQnl0ZSBvZmZzZXQgb2YgdGhlIGlub2RlIHRhYmxlICAqLworCV9fdTMyCW9mZnNldF9pbm9kZW1hcDsgLyogQnl0ZSBvZmZzZXQgb2YgdGhlIGlub2RlIGJpdG1hcHMgKi8KKwlfX3UzMglvZmZzZXRfYmxvY2ttYXA7IC8qIEJ5dGUgb2Zmc2V0IG9mIHRoZSBpbm9kZSBiaXRtYXBzICovCisJX191MzIJb2Zmc2V0X3Jlc2VydmVkWzhdOworfTsKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHBhbmRkaXIuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHBhbmRkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTI5YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4cGFuZGRpci5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBleHBhbmQuYyAtLS0gZXhwYW5kIGFuIGV4dDJmcyBkaXJlY3RvcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IGV4cGFuZF9kaXJfc3RydWN0IHsKKwlpbnQJCWRvbmU7CisJaW50CQluZXdibG9ja3M7CisJZXJyY29kZV90CWVycjsKK307CisKK3N0YXRpYyBpbnQgZXhwYW5kX2Rpcl9wcm9jKGV4dDJfZmlsc3lzCWZzLAorCQkJICAgYmxrX3QJKmJsb2NrbnIsCisJCQkgICBlMl9ibGtjbnRfdAlibG9ja2NudCwKKwkJCSAgIGJsa190CXJlZl9ibG9jayBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICBpbnQJCXJlZl9vZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgdm9pZAkJKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgZXhwYW5kX2Rpcl9zdHJ1Y3QgKmVzID0gKHN0cnVjdCBleHBhbmRfZGlyX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJYmxrX3QJbmV3X2JsazsKKwlzdGF0aWMgYmxrX3QJbGFzdF9ibGsgPSAwOworCWNoYXIJCSpibG9jazsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKCpibG9ja25yKSB7CisJCWxhc3RfYmxrID0gKmJsb2NrbnI7CisJCXJldHVybiAwOworCX0KKwlyZXR2YWwgPSBleHQyZnNfbmV3X2Jsb2NrKGZzLCBsYXN0X2JsaywgMCwgJm5ld19ibGspOworCWlmIChyZXR2YWwpIHsKKwkJZXMtPmVyciA9IHJldHZhbDsKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwlpZiAoYmxvY2tjbnQgPiAwKSB7CisJCXJldHZhbCA9IGV4dDJmc19uZXdfZGlyX2Jsb2NrKGZzLCAwLCAwLCAmYmxvY2spOworCQlpZiAocmV0dmFsKSB7CisJCQllcy0+ZXJyID0gcmV0dmFsOworCQkJcmV0dXJuIEJMT0NLX0FCT1JUOworCQl9CisJCWVzLT5kb25lID0gMTsKKwkJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayhmcywgbmV3X2JsaywgYmxvY2spOworCX0gZWxzZSB7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZibG9jayk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWVzLT5lcnIgPSByZXR2YWw7CisJCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJCX0KKwkJbWVtc2V0KGJsb2NrLCAwLCBmcy0+YmxvY2tzaXplKTsKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBuZXdfYmxrLCAxLCBibG9jayk7CisJfQorCWlmIChyZXR2YWwpIHsKKwkJZXMtPmVyciA9IHJldHZhbDsKKwkJcmV0dXJuIEJMT0NLX0FCT1JUOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmJsb2NrKTsKKwkqYmxvY2tuciA9IG5ld19ibGs7CisJZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGZzLCBuZXdfYmxrLCArMSk7CisJZXMtPm5ld2Jsb2NrcysrOworCisJaWYgKGVzLT5kb25lKQorCQlyZXR1cm4gKEJMT0NLX0NIQU5HRUQgfCBCTE9DS19BQk9SVCk7CisJZWxzZQorCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKK30KKworZXJyY29kZV90IGV4dDJmc19leHBhbmRfZGlyKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpcikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBleHBhbmRfZGlyX3N0cnVjdCBlczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfUlcpKQorCQlyZXR1cm4gRVhUMl9FVF9ST19GSUxTWVM7CisKKwlpZiAoIWZzLT5ibG9ja19tYXApCisJCXJldHVybiBFWFQyX0VUX05PX0JMT0NLX0JJVE1BUDsKKworCXJldHZhbCA9IGV4dDJmc19jaGVja19kaXJlY3RvcnkoZnMsIGRpcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWVzLmRvbmUgPSAwOworCWVzLmVyciA9IDA7CisJZXMubmV3YmxvY2tzID0gMDsKKworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgZGlyLCBCTE9DS19GTEFHX0FQUEVORCwKKwkJCQkgICAgICAgMCwgZXhwYW5kX2Rpcl9wcm9jLCAmZXMpOworCisJaWYgKGVzLmVycikKKwkJcmV0dXJuIGVzLmVycjsKKwlpZiAoIWVzLmRvbmUpCisJCXJldHVybiBFWFQyX0VUX0VYUEFORF9ESVJfRVJSOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHNpemUgYW5kIGJsb2NrIGNvdW50IGZpZWxkcyBpbiB0aGUgaW5vZGUuCisJICovCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGRpciwgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaW5vZGUuaV9zaXplICs9IGZzLT5ibG9ja3NpemU7CisJaW5vZGUuaV9ibG9ja3MgKz0gKGZzLT5ibG9ja3NpemUgLyA1MTIpICogZXMubmV3YmxvY2tzOworCisJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2lub2RlKGZzLCBkaXIsICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfZXJyLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9lcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQzNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfZXJyLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGV4dDJfZXJyLmg6CisgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQ7IHBsZWFzZSBkbyBub3QgZWRpdCBpdC4KKyAqLworCisjZGVmaW5lIEVYVDJfRVRfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzMjhMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMgICAgICAgICAgICAgICgyMTMzNTcxMzI5TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19CQURCTE9DS1NfTElTVCAgICAgICAgICAgICAoMjEzMzU3MTMzMEwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfQkFEQkxPQ0tTX0lURVJBVEUgICAgICAgICAgKDIxMzM1NzEzMzFMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0lOT0RFX1NDQU4gICAgICAgICAgICAgICAgICgyMTMzNTcxMzMyTCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMICAgICAgICAgICAgICAgICAoMjEzMzU3MTMzM0wpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMICAgICAgICAgICAgKDIxMzM1NzEzMzRMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0lPX01BTkFHRVIgICAgICAgICAgICAgICAgICgyMTMzNTcxMzM1TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19CTE9DS19CSVRNQVAgICAgICAgICAgICAgICAoMjEzMzU3MTMzNkwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfSU5PREVfQklUTUFQICAgICAgICAgICAgICAgKDIxMzM1NzEzMzdMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQICAgICAgICAgICAgICgyMTMzNTcxMzM4TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19URVNUX0lPX0NIQU5ORUwgICAgICAgICAgICAoMjEzMzU3MTMzOUwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfREJMSVNUICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDBMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0lDT1VOVCAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzQxTCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19QUV9JT19DSEFOTkVMICAgICAgICAgICAgICAoMjEzMzU3MTM0MkwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDNMKQorI2RlZmluZSBFWFQyX0VUX01BR0lDX0UySU1BR0UgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzQ0TCkKKyNkZWZpbmUgRVhUMl9FVF9NQUdJQ19JTk9ERV9JT19DSEFOTkVMICAgICAgICAgICAoMjEzMzU3MTM0NUwpCisjZGVmaW5lIEVYVDJfRVRfTUFHSUNfUkVTRVJWRURfOSAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDZMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9NQUdJQyAgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzQ3TCkKKyNkZWZpbmUgRVhUMl9FVF9SRVZfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM0OEwpCisjZGVmaW5lIEVYVDJfRVRfUk9fRklMU1lTICAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNDlMKQorI2RlZmluZSBFWFQyX0VUX0dERVNDX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzUwTCkKKyNkZWZpbmUgRVhUMl9FVF9HREVTQ19XUklURSAgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM1MUwpCisjZGVmaW5lIEVYVDJfRVRfR0RFU0NfQkFEX0JMT0NLX01BUCAgICAgICAgICAgICAgKDIxMzM1NzEzNTJMKQorI2RlZmluZSBFWFQyX0VUX0dERVNDX0JBRF9JTk9ERV9NQVAgICAgICAgICAgICAgICgyMTMzNTcxMzUzTCkKKyNkZWZpbmUgRVhUMl9FVF9HREVTQ19CQURfSU5PREVfVEFCTEUgICAgICAgICAgICAoMjEzMzU3MTM1NEwpCisjZGVmaW5lIEVYVDJfRVRfSU5PREVfQklUTUFQX1dSSVRFICAgICAgICAgICAgICAgKDIxMzM1NzEzNTVMKQorI2RlZmluZSBFWFQyX0VUX0lOT0RFX0JJVE1BUF9SRUFEICAgICAgICAgICAgICAgICgyMTMzNTcxMzU2TCkKKyNkZWZpbmUgRVhUMl9FVF9CTE9DS19CSVRNQVBfV1JJVEUgICAgICAgICAgICAgICAoMjEzMzU3MTM1N0wpCisjZGVmaW5lIEVYVDJfRVRfQkxPQ0tfQklUTUFQX1JFQUQgICAgICAgICAgICAgICAgKDIxMzM1NzEzNThMKQorI2RlZmluZSBFWFQyX0VUX0lOT0RFX1RBQkxFX1dSSVRFICAgICAgICAgICAgICAgICgyMTMzNTcxMzU5TCkKKyNkZWZpbmUgRVhUMl9FVF9JTk9ERV9UQUJMRV9SRUFEICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2MEwpCisjZGVmaW5lIEVYVDJfRVRfTkVYVF9JTk9ERV9SRUFEICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNjFMKQorI2RlZmluZSBFWFQyX0VUX1VORVhQRUNURURfQkxPQ0tfU0laRSAgICAgICAgICAgICgyMTMzNTcxMzYyTCkKKyNkZWZpbmUgRVhUMl9FVF9ESVJfQ09SUlVQVEVEICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2M0wpCisjZGVmaW5lIEVYVDJfRVRfU0hPUlRfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNjRMKQorI2RlZmluZSBFWFQyX0VUX1NIT1JUX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzY1TCkKKyNkZWZpbmUgRVhUMl9FVF9ESVJfTk9fU1BBQ0UgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2NkwpCisjZGVmaW5lIEVYVDJfRVRfTk9fSU5PREVfQklUTUFQICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNjdMKQorI2RlZmluZSBFWFQyX0VUX05PX0JMT0NLX0JJVE1BUCAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzY4TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfSU5PREVfTlVNICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM2OUwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0JMT0NLX05VTSAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNzBMKQorI2RlZmluZSBFWFQyX0VUX0VYUEFORF9ESVJfRVJSICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzcxTCkKKyNkZWZpbmUgRVhUMl9FVF9UT09TTUFMTCAgICAgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM3MkwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0JMT0NLX01BUksgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNzNMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9CTE9DS19VTk1BUksgICAgICAgICAgICAgICAgICgyMTMzNTcxMzc0TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfQkxPQ0tfVEVTVCAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM3NUwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0lOT0RFX01BUksgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzNzZMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9JTk9ERV9VTk1BUksgICAgICAgICAgICAgICAgICgyMTMzNTcxMzc3TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfSU5PREVfVEVTVCAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM3OEwpCisjZGVmaW5lIEVYVDJfRVRfRlVER0VfQkxPQ0tfQklUTUFQX0VORCAgICAgICAgICAgKDIxMzM1NzEzNzlMKQorI2RlZmluZSBFWFQyX0VUX0ZVREdFX0lOT0RFX0JJVE1BUF9FTkQgICAgICAgICAgICgyMTMzNTcxMzgwTCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfSU5EX0JMT0NLICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTM4MUwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0RJTkRfQkxPQ0sgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzODJMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9USU5EX0JMT0NLICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzgzTCkKKyNkZWZpbmUgRVhUMl9FVF9ORVFfQkxPQ0tfQklUTUFQICAgICAgICAgICAgICAgICAoMjEzMzU3MTM4NEwpCisjZGVmaW5lIEVYVDJfRVRfTkVRX0lOT0RFX0JJVE1BUCAgICAgICAgICAgICAgICAgKDIxMzM1NzEzODVMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzg2TCkKKyNkZWZpbmUgRVhUMl9FVF9NSVNTSU5HX0lOT0RFX1RBQkxFICAgICAgICAgICAgICAoMjEzMzU3MTM4N0wpCisjZGVmaW5lIEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLICAgICAgICAgICAgICAgKDIxMzM1NzEzODhMKQorI2RlZmluZSBFWFQyX0VUX0JBRF9HRU5FUklDX01BUksgICAgICAgICAgICAgICAgICgyMTMzNTcxMzg5TCkKKyNkZWZpbmUgRVhUMl9FVF9CQURfR0VORVJJQ19VTk1BUksgICAgICAgICAgICAgICAoMjEzMzU3MTM5MEwpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0dFTkVSSUNfVEVTVCAgICAgICAgICAgICAgICAgKDIxMzM1NzEzOTFMKQorI2RlZmluZSBFWFQyX0VUX1NZTUxJTktfTE9PUCAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzkyTCkKKyNkZWZpbmUgRVhUMl9FVF9DQUxMQkFDS19OT1RIQU5ETEVEICAgICAgICAgICAgICAoMjEzMzU3MTM5M0wpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0JMT0NLX0lOX0lOT0RFX1RBQkxFICAgICAgICAgKDIxMzM1NzEzOTRMKQorI2RlZmluZSBFWFQyX0VUX1VOU1VQUF9GRUFUVVJFICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzk1TCkKKyNkZWZpbmUgRVhUMl9FVF9ST19VTlNVUFBfRkVBVFVSRSAgICAgICAgICAgICAgICAoMjEzMzU3MTM5NkwpCisjZGVmaW5lIEVYVDJfRVRfTExTRUVLX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzEzOTdMKQorI2RlZmluZSBFWFQyX0VUX05PX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxMzk4TCkKKyNkZWZpbmUgRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UICAgICAgICAgICAgICAgICAoMjEzMzU3MTM5OUwpCisjZGVmaW5lIEVYVDJfRVRfQkxPQ0tfQUxMT0NfRkFJTCAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDBMKQorI2RlZmluZSBFWFQyX0VUX0lOT0RFX0FMTE9DX0ZBSUwgICAgICAgICAgICAgICAgICgyMTMzNTcxNDAxTCkKKyNkZWZpbmUgRVhUMl9FVF9OT19ESVJFQ1RPUlkgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwMkwpCisjZGVmaW5lIEVYVDJfRVRfVE9PX01BTllfUkVGUyAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDNMKQorI2RlZmluZSBFWFQyX0VUX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDA0TCkKKyNkZWZpbmUgRVhUMl9FVF9GSUxFX1JPICAgICAgICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwNUwpCisjZGVmaW5lIEVYVDJfRVRfREJfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDZMKQorI2RlZmluZSBFWFQyX0VUX0RJUl9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDA3TCkKKyNkZWZpbmUgRVhUMl9FVF9VTklNUExFTUVOVEVEICAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQwOEwpCisjZGVmaW5lIEVYVDJfRVRfQ0FOQ0VMX1JFUVVFU1RFRCAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MDlMKQorI2RlZmluZSBFWFQyX0VUX0ZJTEVfVE9PX0JJRyAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDEwTCkKKyNkZWZpbmUgRVhUMl9FVF9KT1VSTkFMX05PVF9CTE9DSyAgICAgICAgICAgICAgICAoMjEzMzU3MTQxMUwpCisjZGVmaW5lIEVYVDJfRVRfTk9fSk9VUk5BTF9TQiAgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MTJMKQorI2RlZmluZSBFWFQyX0VUX0pPVVJOQUxfVE9PX1NNQUxMICAgICAgICAgICAgICAgICgyMTMzNTcxNDEzTCkKKyNkZWZpbmUgRVhUMl9FVF9KT1VSTkFMX1VOU1VQUF9WRVJTSU9OICAgICAgICAgICAoMjEzMzU3MTQxNEwpCisjZGVmaW5lIEVYVDJfRVRfTE9BRF9FWFRfSk9VUk5BTCAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MTVMKQorI2RlZmluZSBFWFQyX0VUX05PX0pPVVJOQUwgICAgICAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDE2TCkKKyNkZWZpbmUgRVhUMl9FVF9ESVJIQVNIX1VOU1VQUCAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQxN0wpCisjZGVmaW5lIEVYVDJfRVRfQkFEX0VBX0JMT0NLX05VTSAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MThMKQorI2RlZmluZSBFWFQyX0VUX1RPT19NQU5ZX0lOT0RFUyAgICAgICAgICAgICAgICAgICgyMTMzNTcxNDE5TCkKKyNkZWZpbmUgRVhUMl9FVF9OT1RfSU1BR0VfRklMRSAgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQyMEwpCisjZGVmaW5lIEVYVDJfRVRfUkVTX0dEVF9CTE9DS1MgICAgICAgICAgICAgICAgICAgKDIxMzM1NzE0MjFMKQorI2RlZmluZSBFWFQyX0VUX1JFU0laRV9JTk9ERV9DT1JSVVBUICAgICAgICAgICAgICgyMTMzNTcxNDIyTCkKKyNkZWZpbmUgRVhUMl9FVF9TRVRfQk1BUF9OT19JTkQgICAgICAgICAgICAgICAgICAoMjEzMzU3MTQyM0wpCisKKyNpZiAwCitleHRlcm4gY29uc3Qgc3RydWN0IGVycm9yX3RhYmxlIGV0X2V4dDJfZXJyb3JfdGFibGU7CitleHRlcm4gdm9pZCBpbml0aWFsaXplX2V4dDJfZXJyb3JfdGFibGUodm9pZCk7CisKKy8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggSGVpbWRhbCAqLworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9leHQyX2Vycm9yX3RhYmxlX3Ioc3RydWN0IGV0X2xpc3QgKipsaXN0KTsKKworI2RlZmluZSBFUlJPUl9UQUJMRV9CQVNFX2V4dDIgKDIxMzM1NzEzMjhMKQorCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zLi4uICovCisjZGVmaW5lIGluaXRfZXh0Ml9lcnJfdGJsIGluaXRpYWxpemVfZXh0Ml9lcnJvcl90YWJsZQorI2RlZmluZSBleHQyX2Vycl9iYXNlIEVSUk9SX1RBQkxFX0JBU0VfZXh0MgorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9leHRfYXR0ci5oIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfZXh0X2F0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTMwOWMwCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfZXh0X2F0dHIuaApAQCAtMCwwICsxLDUyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgIEZpbGU6IGxpbnV4L2V4dDJfZXh0X2F0dHIuaAorCisgIE9uLWRpc2sgZm9ybWF0IG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBleHQyIGZpbGVzeXN0ZW0uCisKKyAgKEMpIDIwMDAgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorKi8KKworLyogTWFnaWMgdmFsdWUgaW4gYXR0cmlidXRlIGJsb2NrcyAqLworI2RlZmluZSBFWFQyX0VYVF9BVFRSX01BR0lDX3YxCQkweEVBMDEwMDAwCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfTUFHSUMJCTB4RUEwMjAwMDAKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBvbmUgYXR0cmlidXRlIGJsb2NrICovCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfUkVGQ09VTlRfTUFYCTEwMjQKKworc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyIHsKKwlfX3UzMgloX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGlkZW50aWZpY2F0aW9uICovCisJX191MzIJaF9yZWZjb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCisJX191MzIJaF9ibG9ja3M7CS8qIG51bWJlciBvZiBkaXNrIGJsb2NrcyB1c2VkICovCisJX191MzIJaF9oYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiBhbGwgYXR0cmlidXRlcyAqLworCV9fdTMyCWhfcmVzZXJ2ZWRbNF07CS8qIHplcm8gcmlnaHQgbm93ICovCit9OworCitzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSB7CisJX191OAllX25hbWVfbGVuOwkvKiBsZW5ndGggb2YgbmFtZSAqLworCV9fdTgJZV9uYW1lX2luZGV4OwkvKiBhdHRyaWJ1dGUgbmFtZSBpbmRleCAqLworCV9fdTE2CWVfdmFsdWVfb2ZmczsJLyogb2Zmc2V0IGluIGRpc2sgYmxvY2sgb2YgdmFsdWUgKi8KKwlfX3UzMgllX3ZhbHVlX2Jsb2NrOwkvKiBkaXNrIGJsb2NrIGF0dHJpYnV0ZSBpcyBzdG9yZWQgb24gKG4vaSkgKi8KKwlfX3UzMgllX3ZhbHVlX3NpemU7CS8qIHNpemUgb2YgYXR0cmlidXRlIHZhbHVlICovCisJX191MzIJZV9oYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiBuYW1lIGFuZCB2YWx1ZSAqLworfTsKKworI2RlZmluZSBFWFQyX0VYVF9BVFRSX1BBRF9CSVRTCQkyCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfUEFECQkoMTw8RVhUMl9FWFRfQVRUUl9QQURfQklUUykKKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9ST1VORAkJKEVYVDJfRVhUX0FUVFJfUEFELTEpCisjZGVmaW5lIEVYVDJfRVhUX0FUVFJfTEVOKG5hbWVfbGVuKSBcCisJKCgobmFtZV9sZW4pICsgRVhUMl9FWFRfQVRUUl9ST1VORCArIFwKKwlzaXplb2Yoc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkpKSAmIH5FWFQyX0VYVF9BVFRSX1JPVU5EKQorI2RlZmluZSBFWFQyX0VYVF9BVFRSX05FWFQoZW50cnkpIFwKKwkoIChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSAqKSggXAorCSAgKGNoYXIgKikoZW50cnkpICsgRVhUMl9FWFRfQVRUUl9MRU4oKGVudHJ5KS0+ZV9uYW1lX2xlbikpICkKKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9TSVpFKHNpemUpIFwKKwkoKChzaXplKSArIEVYVDJfRVhUX0FUVFJfUk9VTkQpICYgfkVYVDJfRVhUX0FUVFJfUk9VTkQpCisjZGVmaW5lIEVYVDJfRVhUX0lTX0xBU1RfRU5UUlkoZW50cnkpICgqKChfX3UzMiAqKShlbnRyeSkpID09IDBVTCkKKyNkZWZpbmUgRVhUMl9FWFRfQVRUUl9OQU1FKGVudHJ5KSBcCisJKCgoY2hhciAqKSAoZW50cnkpKSArIHNpemVvZihzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9lbnRyeSkpCisjZGVmaW5lIEVYVDJfWEFUVFJfTEVOKG5hbWVfbGVuKSBcCisJKCgobmFtZV9sZW4pICsgRVhUMl9FWFRfQVRUUl9ST1VORCArIFwKKwlzaXplb2Yoc3RydWN0IGV4dDJfeGF0dHJfZW50cnkpKSAmIH5FWFQyX0VYVF9BVFRSX1JPVU5EKQorI2RlZmluZSBFWFQyX1hBVFRSX1NJWkUoc2l6ZSkgXAorCSgoKHNpemUpICsgRVhUMl9FWFRfQVRUUl9ST1VORCkgJiB+RVhUMl9FWFRfQVRUUl9ST1VORCkKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2ZzLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGY3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9mcy5oCkBAIC0wLDAgKzEsNTY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9taW5peF9mcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworI2lmbmRlZiBMSU5VWF9FWFQyX0ZTX0gKKyNkZWZpbmUgTElOVVhfRVhUMl9GU19IIDEKKworI2luY2x1ZGUgImV4dDJfdHlwZXMuaCIJCS8qIENoYW5nZWQgZnJvbSBsaW51eC90eXBlcy5oICovCisKKy8qCisgKiBTcGVjaWFsIGlub2RlIG51bWJlcnMKKyAqLworI2RlZmluZSBFWFQyX0JBRF9JTk8JCSAxCS8qIEJhZCBibG9ja3MgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9ST09UX0lOTwkJIDIJLyogUm9vdCBpbm9kZSAqLworI2RlZmluZSBFWFQyX0FDTF9JRFhfSU5PCSAzCS8qIEFDTCBpbm9kZSAqLworI2RlZmluZSBFWFQyX0FDTF9EQVRBX0lOTwkgNAkvKiBBQ0wgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9CT09UX0xPQURFUl9JTk8JIDUJLyogQm9vdCBsb2FkZXIgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9VTkRFTF9ESVJfSU5PCSA2CS8qIFVuZGVsZXRlIGRpcmVjdG9yeSBpbm9kZSAqLworI2RlZmluZSBFWFQyX1JFU0laRV9JTk8JCSA3CS8qIFJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3JzIGlub2RlICovCisjZGVmaW5lIEVYVDJfSk9VUk5BTF9JTk8JIDgJLyogSm91cm5hbCBpbm9kZSAqLworCisvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgZm9yIG9sZCBleHQyIGZpbGVzeXN0ZW1zICovCisjZGVmaW5lIEVYVDJfR09PRF9PTERfRklSU1RfSU5PCTExCisKKy8qCisgKiBUaGUgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIG1hZ2ljIG51bWJlcgorICovCisjZGVmaW5lIEVYVDJfU1VQRVJfTUFHSUMJMHhFRjUzCisKKy8qIEFzc3VtZSB0aGF0IHVzZXIgbW9kZSBwcm9ncmFtcyBhcmUgcGFzc2luZyBpbiBhbiBleHQyZnMgc3VwZXJibG9jaywgbm90CisgKiBhIGtlcm5lbCBzdHJ1Y3Qgc3VwZXJfYmxvY2suICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY2FsbCB0aGUgZmVhdHVyZS10ZXN0CisgKiBtYWNyb3MgZnJvbSB1c2VyIGxhbmQuICovCisjZGVmaW5lIEVYVDJfU0Ioc2IpCShzYikKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUMl9MSU5LX01BWAkJMzIwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUJCTEwCS8qIDEwMjQgKi8KKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUJCTE2CS8qIDY1NTM2ICovCisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX1NJWkUJKDEgPDwgRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLX1NJWkUJKDEgPDwgRVhUMl9NQVhfQkxPQ0tfTE9HX1NJWkUpCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRShzKQkoRVhUMl9NSU5fQkxPQ0tfU0laRSA8PCAocyktPnNfbG9nX2Jsb2NrX3NpemUpCisjZGVmaW5lIEVYVDJfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKKyNkZWZpbmUgRVhUMl9JTk9ERV9TSVpFKHMpCSgoKHMpLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgPyBcCisJCQkJIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSA6IChzKS0+c19pbm9kZV9zaXplKQorI2RlZmluZSBFWFQyX0ZJUlNUX0lOTyhzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyA6IChzKS0+c19maXJzdF9pbm8pCisjZGVmaW5lIEVYVDJfQUREUl9QRVJfQkxPQ0socykJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZihfX3UzMikpCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZnJhZ21lbnRzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19TSVpFCQlFWFQyX01JTl9CTE9DS19TSVpFCisjZGVmaW5lIEVYVDJfTUFYX0ZSQUdfU0laRQkJRVhUMl9NQVhfQkxPQ0tfU0laRQorI2RlZmluZSBFWFQyX01JTl9GUkFHX0xPR19TSVpFCQlFWFQyX01JTl9CTE9DS19MT0dfU0laRQorIyBkZWZpbmUgRVhUMl9GUkFHX1NJWkUocykJCShFWFQyX01JTl9GUkFHX1NJWkUgPDwgKHMpLT5zX2xvZ19mcmFnX3NpemUpCisjIGRlZmluZSBFWFQyX0ZSQUdTX1BFUl9CTE9DSyhzKQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gRVhUMl9GUkFHX1NJWkUocykpCisKKy8qCisgKiBBQ0wgc3RydWN0dXJlcworICovCitzdHJ1Y3QgZXh0Ml9hY2xfaGVhZGVyCS8qIEhlYWRlciBvZiBBY2Nlc3MgQ29udHJvbCBMaXN0cyAqLworeworCV9fdTMyCWFjbGhfc2l6ZTsKKwlfX3UzMglhY2xoX2ZpbGVfY291bnQ7CisJX191MzIJYWNsaF9hY2xlX2NvdW50OworCV9fdTMyCWFjbGhfZmlyc3RfYWNsZTsKK307CisKK3N0cnVjdCBleHQyX2FjbF9lbnRyeQkvKiBBY2Nlc3MgQ29udHJvbCBMaXN0IEVudHJ5ICovCit7CisJX191MzIJYWNsZV9zaXplOworCV9fdTE2CWFjbGVfcGVybXM7CS8qIEFjY2VzcyBwZXJtaXNzaW9ucyAqLworCV9fdTE2CWFjbGVfdHlwZTsJLyogVHlwZSBvZiBlbnRyeSAqLworCV9fdTE2CWFjbGVfdGFnOwkvKiBVc2VyIG9yIGdyb3VwIGlkZW50aXR5ICovCisJX191MTYJYWNsZV9wYWQxOworCV9fdTMyCWFjbGVfbmV4dDsJLyogUG9pbnRlciBvbiBuZXh0IGVudHJ5IGZvciB0aGUgKi8KKwkJCQkJLyogc2FtZSBpbm9kZSBvciBvbiBuZXh0IGZyZWUgZW50cnkgKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBibG9ja3MgZ3JvdXAgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjCit7CisJX191MzIJYmdfYmxvY2tfYml0bWFwOwkJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworCV9fdTMyCWJnX2lub2RlX2JpdG1hcDsJCS8qIElub2RlcyBiaXRtYXAgYmxvY2sgKi8KKwlfX3UzMgliZ19pbm9kZV90YWJsZTsJCS8qIElub2RlcyB0YWJsZSBibG9jayAqLworCV9fdTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fdTE2CWJnX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fdTE2CWJnX3VzZWRfZGlyc19jb3VudDsJLyogRGlyZWN0b3JpZXMgY291bnQgKi8KKwlfX3UxNgliZ19wYWQ7CisJX191MzIJYmdfcmVzZXJ2ZWRbM107Cit9OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIGRpcmVjdG9yeSBpbmRleGluZyBmZWF0dXJlCisgKgorICogTm90ZTogYWxsIG9mIHRoZSBtdWx0aWJ5dGUgaW50ZWdlciBmaWVsZHMgYXJlIGxpdHRsZSBlbmRpYW4uCisgKi8KKworLyoKKyAqIE5vdGU6IGR4X3Jvb3RfaW5mbyBpcyBsYWlkIG91dCBzbyB0aGF0IGlmIGl0IHNob3VsZCBzb21laG93IGdldAorICogb3ZlcmxhaWQgYnkgYSBkaXJlbnQgdGhlIHR3byBsb3cgYml0cyBvZiB0aGUgaGFzaCB2ZXJzaW9uIHdpbGwgYmUKKyAqIHplcm8uICBUaGVyZWZvcmUsIHRoZSBoYXNoIHZlcnNpb24gbW9kIDQgc2hvdWxkIG5ldmVyIGJlIDAuCisgKiBTaW5jZXJlbHksIHRoZSBwYXJhbm9pYSBkZXBhcnRtZW50LgorICovCitzdHJ1Y3QgZXh0Ml9keF9yb290X2luZm8geworCV9fdTMyIHJlc2VydmVkX3plcm87CisJX191OCBoYXNoX3ZlcnNpb247IC8qIDAgbm93LCAxIGF0IHJlbGVhc2UgKi8KKwlfX3U4IGluZm9fbGVuZ3RoOyAvKiA4ICovCisJX191OCBpbmRpcmVjdF9sZXZlbHM7CisJX191OCB1bnVzZWRfZmxhZ3M7Cit9OworCisjZGVmaW5lIEVYVDJfSEFTSF9MRUdBQ1kJMAorI2RlZmluZSBFWFQyX0hBU0hfSEFMRl9NRDQJMQorI2RlZmluZSBFWFQyX0hBU0hfVEVBCQkyCisKKyNkZWZpbmUgRVhUMl9IQVNIX0ZMQUdfSU5DT01QQVQJMHgxCisKK3N0cnVjdCBleHQyX2R4X2VudHJ5IHsKKwlfX3UzMiBoYXNoOworCV9fdTMyIGJsb2NrOworfTsKKworc3RydWN0IGV4dDJfZHhfY291bnRsaW1pdCB7CisJX191MTYgbGltaXQ7CisJX191MTYgY291bnQ7Cit9OworCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZ3JvdXAgZGVzY3JpcHRvcnMKKyAqLworI2RlZmluZSBFWFQyX0JMT0NLU19QRVJfR1JPVVAocykJKEVYVDJfU0IocyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyNkZWZpbmUgRVhUMl9JTk9ERVNfUEVSX0dST1VQKHMpCShFWFQyX1NCKHMpLT5zX2lub2Rlc19wZXJfZ3JvdXApCisjZGVmaW5lIEVYVDJfSU5PREVTX1BFUl9CTE9DSyhzKQkoRVhUMl9CTE9DS19TSVpFKHMpL0VYVDJfSU5PREVfU0laRShzKSkKKy8qIGxpbWl0cyBpbXBvc2VkIGJ5IDE2LWJpdCB2YWx1ZSBnZF9mcmVlX3tibG9ja3MsaW5vZGV9X2NvdW50ICovCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAocykJKCgxIDw8IDE2KSAtIDgpCisjZGVmaW5lIEVYVDJfTUFYX0lOT0RFU19QRVJfR1JPVVAocykJKCgxIDw8IDE2KSAtIEVYVDJfSU5PREVTX1BFUl9CTE9DSyhzKSkKKyNkZWZpbmUgRVhUMl9ERVNDX1BFUl9CTE9DSyhzKQkJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZiAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYykpCisKKy8qCisgKiBDb25zdGFudHMgcmVsYXRpdmUgdG8gdGhlIGRhdGEgYmxvY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ORElSX0JMT0NLUwkJMTIKKyNkZWZpbmUgRVhUMl9JTkRfQkxPQ0sJCQlFWFQyX05ESVJfQkxPQ0tTCisjZGVmaW5lIEVYVDJfRElORF9CTE9DSwkJCShFWFQyX0lORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDJfVElORF9CTE9DSwkJCShFWFQyX0RJTkRfQkxPQ0sgKyAxKQorI2RlZmluZSBFWFQyX05fQkxPQ0tTCQkJKEVYVDJfVElORF9CTE9DSyArIDEpCisKKy8qCisgKiBJbm9kZSBmbGFncworICovCisjZGVmaW5lIEVYVDJfU0VDUk1fRkwJCQkweDAwMDAwMDAxIC8qIFNlY3VyZSBkZWxldGlvbiAqLworI2RlZmluZSBFWFQyX1VOUk1fRkwJCQkweDAwMDAwMDAyIC8qIFVuZGVsZXRlICovCisjZGVmaW5lIEVYVDJfQ09NUFJfRkwJCQkweDAwMDAwMDA0IC8qIENvbXByZXNzIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9TWU5DX0ZMCQkJMHgwMDAwMDAwOCAvKiBTeW5jaHJvbm91cyB1cGRhdGVzICovCisjZGVmaW5lIEVYVDJfSU1NVVRBQkxFX0ZMCQkweDAwMDAwMDEwIC8qIEltbXV0YWJsZSBmaWxlICovCisjZGVmaW5lIEVYVDJfQVBQRU5EX0ZMCQkJMHgwMDAwMDAyMCAvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgRVhUMl9OT0RVTVBfRkwJCQkweDAwMDAwMDQwIC8qIGRvIG5vdCBkdW1wIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9OT0FUSU1FX0ZMCQkJMHgwMDAwMDA4MCAvKiBkbyBub3QgdXBkYXRlIGF0aW1lICovCisvKiBSZXNlcnZlZCBmb3IgY29tcHJlc3Npb24gdXNhZ2UuLi4gKi8KKyNkZWZpbmUgRVhUMl9ESVJUWV9GTAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRVhUMl9DT01QUkJMS19GTAkJMHgwMDAwMDIwMCAvKiBPbmUgb3IgbW9yZSBjb21wcmVzc2VkIGNsdXN0ZXJzICovCisjZGVmaW5lIEVYVDJfTk9DT01QUl9GTAkJCTB4MDAwMDA0MDAgLyogQWNjZXNzIHJhdyBjb21wcmVzc2VkIGRhdGEgKi8KKyNkZWZpbmUgRVhUMl9FQ09NUFJfRkwJCQkweDAwMDAwODAwIC8qIENvbXByZXNzaW9uIGVycm9yICovCisvKiBFbmQgY29tcHJlc3Npb24gZmxhZ3MgLS0tIG1heWJlIG5vdCBhbGwgdXNlZCAqLworI2RlZmluZSBFWFQyX0JUUkVFX0ZMCQkJMHgwMDAwMTAwMCAvKiBidHJlZSBmb3JtYXQgZGlyICovCisjZGVmaW5lIEVYVDJfSU5ERVhfRkwJCQkweDAwMDAxMDAwIC8qIGhhc2gtaW5kZXhlZCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVhUMl9JTUFHSUNfRkwJCQkweDAwMDAyMDAwCisjZGVmaW5lIEVYVDNfSk9VUk5BTF9EQVRBX0ZMCQkweDAwMDA0MDAwIC8qIGZpbGUgZGF0YSBzaG91bGQgYmUgam91cm5hbGVkICovCisjZGVmaW5lIEVYVDJfTk9UQUlMX0ZMCQkJMHgwMDAwODAwMCAvKiBmaWxlIHRhaWwgc2hvdWxkIG5vdCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgRVhUMl9ESVJTWU5DX0ZMCQkJMHgwMDAxMDAwMCAvKiBTeW5jaHJvbm91cyBkaXJlY3RvcnkgbW9kaWZpY2F0aW9ucyAqLworI2RlZmluZSBFWFQyX1RPUERJUl9GTAkJCTB4MDAwMjAwMDAgLyogVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcyovCisjZGVmaW5lIEVYVDNfRVhURU5UU19GTAkJCTB4MDAwODAwMDAgLyogSW5vZGUgdXNlcyBleHRlbnRzICovCisjZGVmaW5lIEVYVDJfUkVTRVJWRURfRkwJCTB4ODAwMDAwMDAgLyogcmVzZXJ2ZWQgZm9yIGV4dDIgbGliICovCisKKyNkZWZpbmUgRVhUMl9GTF9VU0VSX1ZJU0lCTEUJCTB4MDAwM0RGRkYgLyogVXNlciB2aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9NT0RJRklBQkxFCQkweDAwMDA4MEZGIC8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLworCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworI2RlZmluZSBFWFQyX0lPQ19HRVRGTEFHUwkJX0lPUignZicsIDEsIGxvbmcpCisjZGVmaW5lIEVYVDJfSU9DX1NFVEZMQUdTCQlfSU9XKCdmJywgMiwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfR0VUVkVSU0lPTgkJX0lPUigndicsIDEsIGxvbmcpCisjZGVmaW5lIEVYVDJfSU9DX1NFVFZFUlNJT04JCV9JT1coJ3YnLCAyLCBsb25nKQorCisvKgorICogU3RydWN0dXJlIG9mIGFuIGlub2RlIG9uIHRoZSBkaXNrCisgKi8KK3N0cnVjdCBleHQyX2lub2RlIHsKKwlfX3UxNglpX21vZGU7CQkvKiBGaWxlIG1vZGUgKi8KKwlfX3UxNglpX3VpZDsJCS8qIExvdyAxNiBiaXRzIG9mIE93bmVyIFVpZCAqLworCV9fdTMyCWlfc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgKi8KKwlfX3UzMglpX2F0aW1lOwkvKiBBY2Nlc3MgdGltZSAqLworCV9fdTMyCWlfY3RpbWU7CS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX3UzMglpX210aW1lOwkvKiBNb2RpZmljYXRpb24gdGltZSAqLworCV9fdTMyCWlfZHRpbWU7CS8qIERlbGV0aW9uIFRpbWUgKi8KKwlfX3UxNglpX2dpZDsJCS8qIExvdyAxNiBiaXRzIG9mIEdyb3VwIElkICovCisJX191MTYJaV9saW5rc19jb3VudDsJLyogTGlua3MgY291bnQgKi8KKwlfX3UzMglpX2Jsb2NrczsJLyogQmxvY2tzIGNvdW50ICovCisJX191MzIJaV9mbGFnczsJLyogRmlsZSBmbGFncyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBsX2lfcmVzZXJ2ZWQxOworCQl9IGxpbnV4MTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBoX2lfdHJhbnNsYXRvcjsKKwkJfSBodXJkMTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBtX2lfcmVzZXJ2ZWQxOworCQl9IG1hc2l4MTsKKwl9IG9zZDE7CQkJCS8qIE9TIGRlcGVuZGVudCAxICovCisJX191MzIJaV9ibG9ja1tFWFQyX05fQkxPQ0tTXTsvKiBQb2ludGVycyB0byBibG9ja3MgKi8KKwlfX3UzMglpX2dlbmVyYXRpb247CS8qIEZpbGUgdmVyc2lvbiAoZm9yIE5GUykgKi8KKwlfX3UzMglpX2ZpbGVfYWNsOwkvKiBGaWxlIEFDTCAqLworCV9fdTMyCWlfZGlyX2FjbDsJLyogRGlyZWN0b3J5IEFDTCAqLworCV9fdTMyCWlfZmFkZHI7CS8qIEZyYWdtZW50IGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4CWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNglpX3BhZDE7CisJCQlfX3UxNglsX2lfdWlkX2hpZ2g7CS8qIHRoZXNlIDIgZmllbGRzICAgICovCisJCQlfX3UxNglsX2lfZ2lkX2hpZ2g7CS8qIHdlcmUgcmVzZXJ2ZWQyWzBdICovCisJCQlfX3UzMglsX2lfcmVzZXJ2ZWQyOworCQl9IGxpbnV4MjsKKwkJc3RydWN0IHsKKwkJCV9fdTgJaF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWhfaV9tb2RlX2hpZ2g7CisJCQlfX3UxNgloX2lfdWlkX2hpZ2g7CisJCQlfX3UxNgloX2lfZ2lkX2hpZ2g7CisJCQlfX3UzMgloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJX191OAltX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CW1faV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJbV9wYWQxOworCQkJX191MzIJbV9pX3Jlc2VydmVkMlsyXTsKKwkJfSBtYXNpeDI7CisJfSBvc2QyOwkJCQkvKiBPUyBkZXBlbmRlbnQgMiAqLworfTsKKworLyoKKyAqIFBlcm1hbmVudCBwYXJ0IG9mIGFuIGxhcmdlIGlub2RlIG9uIHRoZSBkaXNrCisgKi8KK3N0cnVjdCBleHQyX2lub2RlX2xhcmdlIHsKKwlfX3UxNglpX21vZGU7CQkvKiBGaWxlIG1vZGUgKi8KKwlfX3UxNglpX3VpZDsJCS8qIExvdyAxNiBiaXRzIG9mIE93bmVyIFVpZCAqLworCV9fdTMyCWlfc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgKi8KKwlfX3UzMglpX2F0aW1lOwkvKiBBY2Nlc3MgdGltZSAqLworCV9fdTMyCWlfY3RpbWU7CS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX3UzMglpX210aW1lOwkvKiBNb2RpZmljYXRpb24gdGltZSAqLworCV9fdTMyCWlfZHRpbWU7CS8qIERlbGV0aW9uIFRpbWUgKi8KKwlfX3UxNglpX2dpZDsJCS8qIExvdyAxNiBiaXRzIG9mIEdyb3VwIElkICovCisJX191MTYJaV9saW5rc19jb3VudDsJLyogTGlua3MgY291bnQgKi8KKwlfX3UzMglpX2Jsb2NrczsJLyogQmxvY2tzIGNvdW50ICovCisJX191MzIJaV9mbGFnczsJLyogRmlsZSBmbGFncyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBsX2lfcmVzZXJ2ZWQxOworCQl9IGxpbnV4MTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBoX2lfdHJhbnNsYXRvcjsKKwkJfSBodXJkMTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBtX2lfcmVzZXJ2ZWQxOworCQl9IG1hc2l4MTsKKwl9IG9zZDE7CQkJCS8qIE9TIGRlcGVuZGVudCAxICovCisJX191MzIJaV9ibG9ja1tFWFQyX05fQkxPQ0tTXTsvKiBQb2ludGVycyB0byBibG9ja3MgKi8KKwlfX3UzMglpX2dlbmVyYXRpb247CS8qIEZpbGUgdmVyc2lvbiAoZm9yIE5GUykgKi8KKwlfX3UzMglpX2ZpbGVfYWNsOwkvKiBGaWxlIEFDTCAqLworCV9fdTMyCWlfZGlyX2FjbDsJLyogRGlyZWN0b3J5IEFDTCAqLworCV9fdTMyCWlfZmFkZHI7CS8qIEZyYWdtZW50IGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4CWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNglpX3BhZDE7CisJCQlfX3UxNglsX2lfdWlkX2hpZ2g7CS8qIHRoZXNlIDIgZmllbGRzICAgICovCisJCQlfX3UxNglsX2lfZ2lkX2hpZ2g7CS8qIHdlcmUgcmVzZXJ2ZWQyWzBdICovCisJCQlfX3UzMglsX2lfcmVzZXJ2ZWQyOworCQl9IGxpbnV4MjsKKwkJc3RydWN0IHsKKwkJCV9fdTgJaF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWhfaV9tb2RlX2hpZ2g7CisJCQlfX3UxNgloX2lfdWlkX2hpZ2g7CisJCQlfX3UxNgloX2lfZ2lkX2hpZ2g7CisJCQlfX3UzMgloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJX191OAltX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CW1faV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJbV9wYWQxOworCQkJX191MzIJbV9pX3Jlc2VydmVkMlsyXTsKKwkJfSBtYXNpeDI7CisJfSBvc2QyOwkJCQkvKiBPUyBkZXBlbmRlbnQgMiAqLworCV9fdTE2CWlfZXh0cmFfaXNpemU7CisJX191MTYJaV9wYWQxOworfTsKKworI2RlZmluZSBpX3NpemVfaGlnaAlpX2Rpcl9hY2wKKworLyoKKyAqIEZpbGUgc3lzdGVtIHN0YXRlcworICovCisjZGVmaW5lIEVYVDJfVkFMSURfRlMJCQkweDAwMDEJLyogVW5tb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUl9GUwkJCTB4MDAwMgkvKiBFcnJvcnMgZGV0ZWN0ZWQgKi8KKworLyoKKyAqIE1vdW50IGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9DSEVDSwkJMHgwMDAxCS8qIERvIG1vdW50LXRpbWUgY2hlY2tzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQSUQJCTB4MDAwNAkvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQyX01PVU5UX0RFQlVHCQkweDAwMDgJLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDEwCS8qIENvbnRpbnVlIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19STwkJMHgwMDIwCS8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwNDAJLyogUGFuaWMgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTUlOSVhfREYJCTB4MDA4MAkvKiBNaW1pY3MgdGhlIE1pbml4IHN0YXRmcyAqLworI2RlZmluZSBFWFQyX01PVU5UX05PX1VJRDMyCQkweDAyMDAgIC8qIERpc2FibGUgMzItYml0IFVJRHMgKi8KKworI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSBzZXRfb3B0KG8sIG9wdCkJCQlvIHw9IEVYVDJfTU9VTlRfIyNvcHQKKyNkZWZpbmUgdGVzdF9vcHQoc2IsIG9wdCkJCShFWFQyX1NCKHNiKS0+c19tb3VudF9vcHQgJiBcCisJCQkJCSBFWFQyX01PVU5UXyMjb3B0KQorLyoKKyAqIE1heGltYWwgbW91bnQgY291bnRzIGJldHdlZW4gdHdvIGZpbGVzeXN0ZW0gY2hlY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVAkJMjAJLyogQWxsb3cgMjAgbW91bnRzICovCisjZGVmaW5lIEVYVDJfREZMX0NIRUNLSU5URVJWQUwJCTAJLyogRG9uJ3QgdXNlIGludGVydmFsIGNoZWNrICovCisKKy8qCisgKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzCisgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfQ09OVElOVUUJCTEJLyogQ29udGludWUgZXhlY3V0aW9uICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1JPCQkJMgkvKiBSZW1vdW50IGZzIHJlYWQtb25seSAqLworI2RlZmluZSBFWFQyX0VSUk9SU19QQU5JQwkJMwkvKiBQYW5pYyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19ERUZBVUxUCQlFWFQyX0VSUk9SU19DT05USU5VRQorCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBzdXBlciBibG9jaworICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisJX191MzIJc19pbm9kZXNfY291bnQ7CQkvKiBJbm9kZXMgY291bnQgKi8KKwlfX3UzMglzX2Jsb2Nrc19jb3VudDsJCS8qIEJsb2NrcyBjb3VudCAqLworCV9fdTMyCXNfcl9ibG9ja3NfY291bnQ7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fdTMyCXNfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX191MzIJc19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwlfX3UzMglzX2ZpcnN0X2RhdGFfYmxvY2s7CS8qIEZpcnN0IERhdGEgQmxvY2sgKi8KKwlfX3UzMglzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCisJX19zMzIJc19sb2dfZnJhZ19zaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJX191MzIJc19ibG9ja3NfcGVyX2dyb3VwOwkvKiAjIEJsb2NrcyBwZXIgZ3JvdXAgKi8KKwlfX3UzMglzX2ZyYWdzX3Blcl9ncm91cDsJLyogIyBGcmFnbWVudHMgcGVyIGdyb3VwICovCisJX191MzIJc19pbm9kZXNfcGVyX2dyb3VwOwkvKiAjIElub2RlcyBwZXIgZ3JvdXAgKi8KKwlfX3UzMglzX210aW1lOwkJLyogTW91bnQgdGltZSAqLworCV9fdTMyCXNfd3RpbWU7CQkvKiBXcml0ZSB0aW1lICovCisJX191MTYJc19tbnRfY291bnQ7CQkvKiBNb3VudCBjb3VudCAqLworCV9fczE2CXNfbWF4X21udF9jb3VudDsJLyogTWF4aW1hbCBtb3VudCBjb3VudCAqLworCV9fdTE2CXNfbWFnaWM7CQkvKiBNYWdpYyBzaWduYXR1cmUgKi8KKwlfX3UxNglzX3N0YXRlOwkJLyogRmlsZSBzeXN0ZW0gc3RhdGUgKi8KKwlfX3UxNglzX2Vycm9yczsJCS8qIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMgKi8KKwlfX3UxNglzX21pbm9yX3Jldl9sZXZlbDsJLyogbWlub3IgcmV2aXNpb24gbGV2ZWwgKi8KKwlfX3UzMglzX2xhc3RjaGVjazsJCS8qIHRpbWUgb2YgbGFzdCBjaGVjayAqLworCV9fdTMyCXNfY2hlY2tpbnRlcnZhbDsJLyogbWF4LiB0aW1lIGJldHdlZW4gY2hlY2tzICovCisJX191MzIJc19jcmVhdG9yX29zOwkJLyogT1MgKi8KKwlfX3UzMglzX3Jldl9sZXZlbDsJCS8qIFJldmlzaW9uIGxldmVsICovCisJX191MTYJc19kZWZfcmVzdWlkOwkJLyogRGVmYXVsdCB1aWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCV9fdTE2CXNfZGVmX3Jlc2dpZDsJCS8qIERlZmF1bHQgZ2lkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgZm9yIEVYVDJfRFlOQU1JQ19SRVYgc3VwZXJibG9ja3Mgb25seS4KKwkgKgorCSAqIE5vdGU6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgYW5kCisJICogdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCBpcyB0aGF0IGlmIHRoZXJlIGlzIGEgYml0IHNldAorCSAqIGluIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgdGhhdCB0aGUga2VybmVsIGRvZXNuJ3QKKwkgKiBrbm93IGFib3V0LCBpdCBzaG91bGQgcmVmdXNlIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtLgorCSAqCisJICogZTJmc2NrJ3MgcmVxdWlyZW1lbnRzIGFyZSBtb3JlIHN0cmljdDsgaWYgaXQgZG9lc24ndCBrbm93CisJICogYWJvdXQgYSBmZWF0dXJlIGluIGVpdGhlciB0aGUgY29tcGF0aWJsZSBvciBpbmNvbXBhdGlibGUKKwkgKiBmZWF0dXJlIHNldCwgaXQgbXVzdCBhYm9ydCBhbmQgbm90IHRyeSB0byBtZWRkbGUgd2l0aAorCSAqIHRoaW5ncyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuLi4KKwkgKi8KKwlfX3UzMglzX2ZpcnN0X2lubzsJCS8qIEZpcnN0IG5vbi1yZXNlcnZlZCBpbm9kZSAqLworCV9fdTE2ICAgc19pbm9kZV9zaXplOwkJLyogc2l6ZSBvZiBpbm9kZSBzdHJ1Y3R1cmUgKi8KKwlfX3UxNglzX2Jsb2NrX2dyb3VwX25yOwkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCV9fdTMyCXNfZmVhdHVyZV9jb21wYXQ7CS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3UzMglzX2ZlYXR1cmVfaW5jb21wYXQ7CS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fdTMyCXNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3U4CXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIJc192b2x1bWVfbmFtZVsxNl07CS8qIHZvbHVtZSBuYW1lICovCisJY2hhcglzX2xhc3RfbW91bnRlZFs2NF07CS8qIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQgKi8KKwlfX3UzMglzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7IC8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwlfX3U4CXNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlKi8KKwlfX3U4CXNfcHJlYWxsb2NfZGlyX2Jsb2NrczsJLyogTnIgdG8gcHJlYWxsb2NhdGUgZm9yIGRpcnMgKi8KKwlfX3UxNglzX3Jlc2VydmVkX2dkdF9ibG9ja3M7CS8qIFBlciBncm91cCB0YWJsZSBmb3Igb25saW5lIGdyb3d0aCAqLworCS8qCisJICogSm91cm5hbGluZyBzdXBwb3J0IHZhbGlkIGlmIEVYVDJfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgc2V0LgorCSAqLworCV9fdTgJc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworCV9fdTMyCXNfam91cm5hbF9pbnVtOwkJLyogaW5vZGUgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfam91cm5hbF9kZXY7CQkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfbGFzdF9vcnBoYW47CQkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwlfX3UzMglzX2hhc2hfc2VlZFs0XTsJCS8qIEhUUkVFIGhhc2ggc2VlZCAqLworCV9fdTgJc19kZWZfaGFzaF92ZXJzaW9uOwkvKiBEZWZhdWx0IGhhc2ggdmVyc2lvbiB0byB1c2UgKi8KKwlfX3U4CXNfam5sX2JhY2t1cF90eXBlOwkvKiBEZWZhdWx0IHR5cGUgb2Ygam91cm5hbCBiYWNrdXAgKi8KKwlfX3UxNglzX3Jlc2VydmVkX3dvcmRfcGFkOworCV9fdTMyCXNfZGVmYXVsdF9tb3VudF9vcHRzOworCV9fdTMyCXNfZmlyc3RfbWV0YV9iZzsJLyogRmlyc3QgbWV0YWJsb2NrIGdyb3VwICovCisJX191MzIJc19ta2ZzX3RpbWU7CQkvKiBXaGVuIHRoZSBmaWxlc3lzdGVtIHdhcyBjcmVhdGVkICovCisJX191MzIJc19qbmxfYmxvY2tzWzE3XTsJLyogQmFja3VwIG9mIHRoZSBqb3VybmFsIGlub2RlICovCisJX191MzIJc19yZXNlcnZlZFsxNzJdOwkvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCit9OworCisvKgorICogQ29kZXMgZm9yIG9wZXJhdGluZyBzeXN0ZW1zCisgKi8KKyNkZWZpbmUgRVhUMl9PU19MSU5VWAkJMAorI2RlZmluZSBFWFQyX09TX0hVUkQJCTEKKyNkZWZpbmUgRVhUMl9PU19NQVNJWAkJMgorI2RlZmluZSBFWFQyX09TX0ZSRUVCU0QJCTMKKyNkZWZpbmUgRVhUMl9PU19MSVRFUwkJNAorCisvKgorICogUmV2aXNpb24gbGV2ZWxzCisgKi8KKyNkZWZpbmUgRVhUMl9HT09EX09MRF9SRVYJMAkvKiBUaGUgZ29vZCBvbGQgKG9yaWdpbmFsKSBmb3JtYXQgKi8KKyNkZWZpbmUgRVhUMl9EWU5BTUlDX1JFVgkxCS8qIFYyIGZvcm1hdCB3LyBkeW5hbWljIGlub2RlIHNpemVzICovCisKKyNkZWZpbmUgRVhUMl9DVVJSRU5UX1JFVglFWFQyX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQyX01BWF9TVVBQX1JFVglFWFQyX0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvKgorICogSm91cm5hbCBpbm9kZSBiYWNrdXAgdHlwZXMKKyAqLworI2RlZmluZSBFWFQzX0pOTF9CQUNLVVBfQkxPQ0tTCTEKKworLyoKKyAqIEZlYXR1cmUgc2V0IGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfY29tcGF0ICYgKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIChtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX2luY29tcGF0ICYgKG1hc2spICkKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9QUkVBTExPQwkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9JTUFHSUNfSU5PREVTCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMCQkweDAwMDQKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUgkJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFCTB4MDAxMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWAkJMHgwMDIwCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRQkweDAwMDIKKy8qICNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIJMHgwMDA0IG5vdCB1c2VkICovCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUJCTB4MDAwMgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUgkJMHgwMDA0IC8qIE5lZWRzIHJlY292ZXJ5ICovCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVgkweDAwMDggLyogSm91cm5hbCBkZXZpY2UgKi8KKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcJCTB4MDAxMAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUwkJMHgwMDQwCisKKworI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1NVUFAJMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSKQorCisvKgorICogRGVmYXVsdCB2YWx1ZXMgZm9yIHVzZXIgYW5kL29yIGdyb3VwIHVzaW5nIHJlc2VydmVkIGJsb2NrcworICovCisjZGVmaW5lIEVYVDJfREVGX1JFU1VJRAkJMAorI2RlZmluZSBFWFQyX0RFRl9SRVNHSUQJCTAKKworLyoKKyAqIERlZmF1bHQgbW91bnQgb3B0aW9ucworICovCisjZGVmaW5lIEVYVDJfREVGTV9ERUJVRwkJMHgwMDAxCisjZGVmaW5lIEVYVDJfREVGTV9CU0RHUk9VUFMJMHgwMDAyCisjZGVmaW5lIEVYVDJfREVGTV9YQVRUUl9VU0VSCTB4MDAwNAorI2RlZmluZSBFWFQyX0RFRk1fQUNMCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9ERUZNX1VJRDE2CQkweDAwMTAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFCQkweDAwNjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX0RBVEEJMHgwMDIwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9PUkRFUkVECTB4MDA0MAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfV0JBQ0sJMHgwMDYwCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnkKKyAqLworI2RlZmluZSBFWFQyX05BTUVfTEVOIDI1NQorCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgeworCV9fdTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCV9fdTE2CXJlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisJX191MTYJbmFtZV9sZW47CQkvKiBOYW1lIGxlbmd0aCAqLworCWNoYXIJbmFtZVtFWFQyX05BTUVfTEVOXTsJLyogRmlsZSBuYW1lICovCit9OworCisvKgorICogVGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkuICBTaW5jZSBFWFQyIHN0cnVjdHVyZXMgYXJlCisgKiBzdG9yZWQgaW4gaW50ZWwgYnl0ZSBvcmRlciwgYW5kIHRoZSBuYW1lX2xlbiBmaWVsZCBjb3VsZCBuZXZlciBiZQorICogYmlnZ2VyIHRoYW4gMjU1IGNoYXJzLCBpdCdzIHNhZmUgdG8gcmVjbGFpbSB0aGUgZXh0cmEgYnl0ZSBmb3IgdGhlCisgKiBmaWxlX3R5cGUgZmllbGQuCisgKi8KK3N0cnVjdCBleHQyX2Rpcl9lbnRyeV8yIHsKKwlfX3UzMglpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwlfX3UxNglyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCV9fdTgJbmFtZV9sZW47CQkvKiBOYW1lIGxlbmd0aCAqLworCV9fdTgJZmlsZV90eXBlOworCWNoYXIJbmFtZVtFWFQyX05BTUVfTEVOXTsJLyogRmlsZSBuYW1lICovCit9OworCisvKgorICogRXh0MiBkaXJlY3RvcnkgZmlsZSB0eXBlcy4gIE9ubHkgdGhlIGxvdyAzIGJpdHMgYXJlIHVzZWQuICBUaGUKKyAqIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBub3cuCisgKi8KKyNkZWZpbmUgRVhUMl9GVF9VTktOT1dOCQkwCisjZGVmaW5lIEVYVDJfRlRfUkVHX0ZJTEUJMQorI2RlZmluZSBFWFQyX0ZUX0RJUgkJMgorI2RlZmluZSBFWFQyX0ZUX0NIUkRFVgkJMworI2RlZmluZSBFWFQyX0ZUX0JMS0RFVgkJNAorI2RlZmluZSBFWFQyX0ZUX0ZJRk8JCTUKKyNkZWZpbmUgRVhUMl9GVF9TT0NLCQk2CisjZGVmaW5lIEVYVDJfRlRfU1lNTElOSwkJNworCisjZGVmaW5lIEVYVDJfRlRfTUFYCQk4CisKKy8qCisgKiBFWFQyX0RJUl9QQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJpZXMgYm91bmRhcmllcworICoKKyAqIE5PVEU6IEl0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0CisgKi8KKyNkZWZpbmUgRVhUMl9ESVJfUEFECQkJNAorI2RlZmluZSBFWFQyX0RJUl9ST1VORAkJCShFWFQyX0RJUl9QQUQgLSAxKQorI2RlZmluZSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVfbGVuKQkoKChuYW1lX2xlbikgKyA4ICsgRVhUMl9ESVJfUk9VTkQpICYgXAorCQkJCQkgfkVYVDJfRElSX1JPVU5EKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX2lvLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDBhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0Ml9pby5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpby5oIC0tLSB0aGUgSS9PIG1hbmFnZXIgYWJzdHJhY3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisjaWZuZGVmIEVYVDJGU19FWFQyX0lPX0gKKyNkZWZpbmUgRVhUMkZTX0VYVDJfSU9fSCAxCisKKy8qCisgKiBleHQyX2xvZmZfdCBpcyBkZWZpbmVkIGhlcmUgc2luY2UgdW5peF9pby5jIG5lZWRzIGl0LgorICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChIQVNfTE9OR19MT05HKQordHlwZWRlZiBsb25nIGxvbmcJZXh0Ml9sb2ZmX3Q7CisjZWxzZQordHlwZWRlZiBsb25nCQlleHQyX2xvZmZfdDsKKyNlbmRpZgorCisvKiBsbHNlZWsuYyAqLworLyogZXh0Ml9sb2ZmX3QgZXh0MmZzX2xsc2VlayAoaW50LCBleHQyX2xvZmZfdCwgaW50KTsgKi8KKyNpZmRlZiBDT05GSUdfTEZTCisjIGRlZmluZSBleHQyZnNfbGxzZWVrIGxzZWVrNjQKKyNlbHNlCisjIGRlZmluZSBleHQyZnNfbGxzZWVrIGxzZWVrCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc3RydWN0X2lvX21hbmFnZXIgKmlvX21hbmFnZXI7Cit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfaW9fY2hhbm5lbCAqaW9fY2hhbm5lbDsKKworI2RlZmluZSBDSEFOTkVMX0ZMQUdTX1dSSVRFVEhST1VHSAkweDAxCisKK3N0cnVjdCBzdHJ1Y3RfaW9fY2hhbm5lbCB7CisJZXJyY29kZV90CW1hZ2ljOworCWlvX21hbmFnZXIJbWFuYWdlcjsKKwljaGFyCQkqbmFtZTsKKwlpbnQJCWJsb2NrX3NpemU7CisJZXJyY29kZV90CSgqcmVhZF9lcnJvcikoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIHZvaWQgKmRhdGEsCisJCQkJICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgaW50IGFjdHVhbF9ieXRlc19yZWFkLAorCQkJCSAgICAgIGVycmNvZGVfdCBlcnJvcik7CisJZXJyY29kZV90ICAgICAgICgqd3JpdGVfZXJyb3IpKGlvX2NoYW5uZWwgY2hhbm5lbCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQkgICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgaW50IGFjdHVhbF9ieXRlc193cml0dGVuLAorCQkJCSAgICAgICBlcnJjb2RlX3QgZXJyb3IpOworCWludAkJcmVmY291bnQ7CisJaW50CQlmbGFnczsKKwlpbnQJCXJlc2VydmVkWzE0XTsKKwl2b2lkCQkqcHJpdmF0ZV9kYXRhOworCXZvaWQJCSphcHBfZGF0YTsKK307CisKK3N0cnVjdCBzdHJ1Y3RfaW9fbWFuYWdlciB7CisJZXJyY29kZV90IG1hZ2ljOworCWNvbnN0IGNoYXIgKm5hbWU7CisJZXJyY29kZV90ICgqb3BlbikoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBpb19jaGFubmVsICpjaGFubmVsKTsKKwllcnJjb2RlX3QgKCpjbG9zZSkoaW9fY2hhbm5lbCBjaGFubmVsKTsKKwllcnJjb2RlX3QgKCpzZXRfYmxrc2l6ZSkoaW9fY2hhbm5lbCBjaGFubmVsLCBpbnQgYmxrc2l6ZSk7CisJZXJyY29kZV90ICgqcmVhZF9ibGspKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgIGludCBjb3VudCwgdm9pZCAqZGF0YSk7CisJZXJyY29kZV90ICgqd3JpdGVfYmxrKShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICAgaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKKwllcnJjb2RlX3QgKCpmbHVzaCkoaW9fY2hhbm5lbCBjaGFubmVsKTsKKwllcnJjb2RlX3QgKCp3cml0ZV9ieXRlKShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCWludCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CisJZXJyY29kZV90ICgqc2V0X29wdGlvbikoaW9fY2hhbm5lbCBjaGFubmVsLCBjb25zdCBjaGFyICpvcHRpb24sCisJCQkJY29uc3QgY2hhciAqYXJnKTsKKwlpbnQgICAgICAgICAgICAgcmVzZXJ2ZWRbMTRdOworfTsKKworI2RlZmluZSBJT19GTEFHX1JXCTEKKworLyoKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9ucy4uLi4KKyAqLworI2RlZmluZSBpb19jaGFubmVsX2Nsb3NlKGMpCQkoKGMpLT5tYW5hZ2VyLT5jbG9zZSgoYykpKQorI2RlZmluZSBpb19jaGFubmVsX3NldF9ibGtzaXplKGMscykJKChjKS0+bWFuYWdlci0+c2V0X2Jsa3NpemUoKGMpLHMpKQorI2RlZmluZSBpb19jaGFubmVsX3JlYWRfYmxrKGMsYixuLGQpCSgoYyktPm1hbmFnZXItPnJlYWRfYmxrKChjKSxiLG4sZCkpCisjZGVmaW5lIGlvX2NoYW5uZWxfd3JpdGVfYmxrKGMsYixuLGQpCSgoYyktPm1hbmFnZXItPndyaXRlX2JsaygoYyksYixuLGQpKQorI2RlZmluZSBpb19jaGFubmVsX2ZsdXNoKGMpCQkoKGMpLT5tYW5hZ2VyLT5mbHVzaCgoYykpKQorI2RlZmluZSBpb19jaGFubmVsX2J1bXBjb3VudChjKQkJKChjKS0+cmVmY291bnQrKykKKworLyogaW9fbWFuYWdlci5jICovCitleHRlcm4gZXJyY29kZV90IGlvX2NoYW5uZWxfc2V0X29wdGlvbnMoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJCQljb25zdCBjaGFyICpvcHRpb25zKTsKK2V4dGVybiBlcnJjb2RlX3QgaW9fY2hhbm5lbF93cml0ZV9ieXRlKGlvX2NoYW5uZWwgY2hhbm5lbCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICAgICAgIGludCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CisKKy8qIHVuaXhfaW8uYyAqLworZXh0ZXJuIGlvX21hbmFnZXIgdW5peF9pb19tYW5hZ2VyOworCisvKiB0ZXN0X2lvLmMgKi8KK2V4dGVybiBpb19tYW5hZ2VyIHRlc3RfaW9fbWFuYWdlciwgdGVzdF9pb19iYWNraW5nX21hbmFnZXI7CitleHRlcm4gdm9pZCAoKnRlc3RfaW9fY2JfcmVhZF9ibGspCisJKHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwgZXJyY29kZV90IGVycik7CitleHRlcm4gdm9pZCAoKnRlc3RfaW9fY2Jfd3JpdGVfYmxrKQorCSh1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsIGVycmNvZGVfdCBlcnIpOworZXh0ZXJuIHZvaWQgKCp0ZXN0X2lvX2NiX3NldF9ibGtzaXplKQorCShpbnQgYmxrc2l6ZSwgZXJyY29kZV90IGVycik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJfdHlwZXMuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxMTk2YgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyX3R5cGVzLmgKQEAgLTAsMCArMSwyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmcy5oIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzcyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZXh0MmZzLmgKQEAgLTAsMCArMSw5MjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGV4dDJmcy5oIC0tLSBleHQyZnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisjaWZuZGVmIEVYVDJGU19FWFQyRlNfSAorI2RlZmluZSBFWFQyRlNfRVhUMkZTX0ggMQorCisKKyNkZWZpbmUgRVhUMkZTX0FUVFIoeCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogV2hlcmUgdGhlIG1hc3RlciBjb3B5IG9mIHRoZSBzdXBlcmJsb2NrIGlzIGxvY2F0ZWQsIGFuZCBob3cgYmlnCisgKiBzdXBlcmJsb2NrcyBhcmUgc3VwcG9zZWQgdG8gYmUuICBXZSBkZWZpbmUgU1VQRVJCTE9DS19TSVpFIGJlY2F1c2UKKyAqIHRoZSBzaXplIG9mIHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1c3R3b3J0aHkKKyAqIChzb21lIHZlcnNpb25zIGhhdmUgdGhlIHBhZGRpbmcgc2V0IHVwIHNvIHRoYXQgdGhlIHN1cGVyYmxvY2sgaXMKKyAqIDEwMzIgYnl0ZXMgbG9uZykuCisgKi8KKyNkZWZpbmUgU1VQRVJCTE9DS19PRkZTRVQJMTAyNAorI2RlZmluZSBTVVBFUkJMT0NLX1NJWkUJCTEwMjQKKworLyoKKyAqIFRoZSBsYXN0IGV4dDJmcyByZXZpc2lvbiBsZXZlbCB0aGF0IHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBpcworICogYWJsZSB0byBzdXBwb3J0LgorICovCisjZGVmaW5lIEVYVDJfTElCX0NVUlJFTlRfUkVWCUVYVDJfRFlOQU1JQ19SRVYKKworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImV4dDJfdHlwZXMuaCIKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisKK3R5cGVkZWYgX191MzIJCWV4dDJfaW5vX3Q7Cit0eXBlZGVmIF9fdTMyCQlibGtfdDsKK3R5cGVkZWYgX191MzIJCWRncnBfdDsKK3R5cGVkZWYgX191MzIJCWV4dDJfb2ZmX3Q7Cit0eXBlZGVmIF9fczY0CQllMl9ibGtjbnRfdDsKK3R5cGVkZWYgX191MzIJCWV4dDJfZGlyaGFzaF90OworCisjaW5jbHVkZSAiZXh0Ml9pby5oIgorI2luY2x1ZGUgImV4dDJfZXJyLmgiCisKK3R5cGVkZWYgc3RydWN0IHN0cnVjdF9leHQyX2ZpbHN5cyAqZXh0Ml9maWxzeXM7CisKK3N0cnVjdCBleHQyZnNfc3RydWN0X2dlbmVyaWNfYml0bWFwIHsKKwllcnJjb2RlX3QJbWFnaWM7CisJZXh0Ml9maWxzeXMJZnM7CisJX191MzIJCXN0YXJ0LCBlbmQ7CisJX191MzIJCXJlYWxfZW5kOworCWNoYXIJKglkZXNjcmlwdGlvbjsKKwljaGFyCSoJYml0bWFwOworCWVycmNvZGVfdAliYXNlX2Vycm9yX2NvZGU7CisJX191MzIJCXJlc2VydmVkWzddOworfTsKKworI2RlZmluZSBFWFQyRlNfTUFSS19FUlJPUgkwCisjZGVmaW5lIEVYVDJGU19VTk1BUktfRVJST1IJMQorI2RlZmluZSBFWFQyRlNfVEVTVF9FUlJPUgkyCisKK3R5cGVkZWYgc3RydWN0IGV4dDJmc19zdHJ1Y3RfZ2VuZXJpY19iaXRtYXAgKmV4dDJmc19nZW5lcmljX2JpdG1hcDsKK3R5cGVkZWYgc3RydWN0IGV4dDJmc19zdHJ1Y3RfZ2VuZXJpY19iaXRtYXAgKmV4dDJmc19pbm9kZV9iaXRtYXA7Cit0eXBlZGVmIHN0cnVjdCBleHQyZnNfc3RydWN0X2dlbmVyaWNfYml0bWFwICpleHQyZnNfYmxvY2tfYml0bWFwOworCisjZGVmaW5lIEVYVDJfRklSU1RfSU5PREUocykJRVhUMl9GSVJTVF9JTk8ocykKKworLyoKKyAqIGJhZGJsb2NrcyBsaXN0IGRlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfdTMyX2xpc3QgKmV4dDJfYmFkYmxvY2tzX2xpc3Q7Cit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF91MzJfaXRlcmF0ZSAqZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfdTMyX2xpc3QgKmV4dDJfdTMyX2xpc3Q7Cit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF91MzJfaXRlcmF0ZSAqZXh0Ml91MzJfaXRlcmF0ZTsKKworLyogb2xkICovCit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF91MzJfbGlzdCAqYmFkYmxvY2tzX2xpc3Q7Cit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF91MzJfaXRlcmF0ZSAqYmFkYmxvY2tzX2l0ZXJhdGU7CisKKyNkZWZpbmUgQkFEQkxPQ0tTX0ZMQUdfRElSVFkJMQorCisvKgorICogZXh0Ml9kYmxpc3Qgc3RydWN0dXJlIGFuZCBhYnN0cmFjdGlvbnMgKHNlZSBkYmxpc3QuYykKKyAqLworc3RydWN0IGV4dDJfZGJfZW50cnkgeworCWV4dDJfaW5vX3QJaW5vOworCWJsa190CWJsazsKKwlpbnQJYmxvY2tjbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF9kYmxpc3QgKmV4dDJfZGJsaXN0OworCisjZGVmaW5lIERCTElTVF9BQk9SVAkxCisKKy8qCisgKiBleHQyX2ZpbGVpbyBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgRVhUMl9GSUxFX1dSSVRFCQkweDAwMDEKKyNkZWZpbmUgRVhUMl9GSUxFX0NSRUFURQkweDAwMDIKKworI2RlZmluZSBFWFQyX0ZJTEVfTUFTSwkJMHgwMEZGCisKKyNkZWZpbmUgRVhUMl9GSUxFX0JVRl9ESVJUWQkweDQwMDAKKyNkZWZpbmUgRVhUMl9GSUxFX0JVRl9WQUxJRAkweDIwMDAKKwordHlwZWRlZiBzdHJ1Y3QgZXh0Ml9maWxlICpleHQyX2ZpbGVfdDsKKworI2RlZmluZSBFWFQyX1NFRUtfU0VUCTAKKyNkZWZpbmUgRVhUMl9TRUVLX0NVUgkxCisjZGVmaW5lIEVYVDJfU0VFS19FTkQJMgorCisvKgorICogRmxhZ3MgZm9yIHRoZSBleHQyX2ZpbHN5cyBzdHJ1Y3R1cmUgYW5kIGZvciBleHQyZnNfb3BlbigpCisgKi8KKyNkZWZpbmUgRVhUMl9GTEFHX1JXCQkJMHgwMQorI2RlZmluZSBFWFQyX0ZMQUdfQ0hBTkdFRAkJMHgwMgorI2RlZmluZSBFWFQyX0ZMQUdfRElSVFkJCQkweDA0CisjZGVmaW5lIEVYVDJfRkxBR19WQUxJRAkJCTB4MDgKKyNkZWZpbmUgRVhUMl9GTEFHX0lCX0RJUlRZCQkweDEwCisjZGVmaW5lIEVYVDJfRkxBR19CQl9ESVJUWQkJMHgyMAorI2RlZmluZSBFWFQyX0ZMQUdfU1dBUF9CWVRFUwkJMHg0MAorI2RlZmluZSBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFECTB4ODAKKyNkZWZpbmUgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUJMHgxMDAKKyNkZWZpbmUgRVhUMl9GTEFHX01BU1RFUl9TQl9PTkxZCTB4MjAwCisjZGVmaW5lIEVYVDJfRkxBR19GT1JDRQkJCTB4NDAwCisjZGVmaW5lIEVYVDJfRkxBR19TVVBFUl9PTkxZCQkweDgwMAorI2RlZmluZSBFWFQyX0ZMQUdfSk9VUk5BTF9ERVZfT0sJMHgxMDAwCisjZGVmaW5lIEVYVDJfRkxBR19JTUFHRV9GSUxFCQkweDIwMDAKKworLyoKKyAqIFNwZWNpYWwgZmxhZyBpbiB0aGUgZXh0MiBpbm9kZSBpX2ZsYWcgZmllbGQgdGhhdCBtZWFucyB0aGF0IHRoaXMgaXMKKyAqIGEgbmV3IGlub2RlLiAgKFNvIHRoYXQgZXh0Ml93cml0ZV9pbm9kZSgpIGNhbiBjbGVhciBleHRyYSBmaWVsZHMuKQorICovCisjZGVmaW5lIEVYVDJfTkVXX0lOT0RFX0ZMCTB4ODAwMDAwMDAKKworLyoKKyAqIEZsYWdzIGZvciBta2pvdXJuYWwKKyAqCisgKiBFWFQyX01LSk9VUk5BTF9WMV9TVVBFUglNYWtlIGEgKGRlcHJlY2F0ZWQpIFYxIGpvdXJuYWwgc3VwZXJibG9jaworICovCisjZGVmaW5lIEVYVDJfTUtKT1VSTkFMX1YxX1NVUEVSCTB4MDAwMDAwMQorCitzdHJ1Y3Qgc3RydWN0X2V4dDJfZmlsc3lzIHsKKwllcnJjb2RlX3QJCQltYWdpYzsKKwlpb19jaGFubmVsCQkJaW87CisJaW50CQkJCWZsYWdzOworCWNoYXIgKgkJCQlkZXZpY2VfbmFtZTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jawkqCXN1cGVyOworCXVuc2lnbmVkIGludAkJCWJsb2Nrc2l6ZTsKKwlpbnQJCQkJZnJhZ3NpemU7CisJZGdycF90CQkJCWdyb3VwX2Rlc2NfY291bnQ7CisJdW5zaWduZWQgbG9uZwkJCWRlc2NfYmxvY2tzOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKglncm91cF9kZXNjOworCWludAkJCQlpbm9kZV9ibG9ja3NfcGVyX2dyb3VwOworCWV4dDJmc19pbm9kZV9iaXRtYXAJCWlub2RlX21hcDsKKwlleHQyZnNfYmxvY2tfYml0bWFwCQlibG9ja19tYXA7CisJZXJyY29kZV90ICgqZ2V0X2Jsb2NrcykoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCAqYmxvY2tzKTsKKwllcnJjb2RlX3QgKCpjaGVja19kaXJlY3RvcnkpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubyk7CisJZXJyY29kZV90ICgqd3JpdGVfYml0bWFwcykoZXh0Ml9maWxzeXMgZnMpOworCWVycmNvZGVfdCAoKnJlYWRfaW5vZGUpKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpOworCWVycmNvZGVfdCAoKndyaXRlX2lub2RlKShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKTsKKwlleHQyX2JhZGJsb2Nrc19saXN0CQliYWRibG9ja3M7CisJZXh0Ml9kYmxpc3QJCQlkYmxpc3Q7CisJX191MzIJCQkJc3RyaWRlOwkvKiBmb3IgbWtlMmZzICovCisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKglvcmlnX3N1cGVyOworCXN0cnVjdCBleHQyX2ltYWdlX2hkciAqCQlpbWFnZV9oZWFkZXI7CisJX191MzIJCQkJdW1hc2s7CisJLyoKKwkgKiBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbgorCSAqLworCV9fdTMyCQkJCXJlc2VydmVkWzhdOworCisJLyoKKwkgKiBSZXNlcnZlZCBmb3IgdGhlIHVzZSBvZiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4KKwkgKi8KKwl2b2lkICoJCQkJcHJpdl9kYXRhOworCisJLyoKKwkgKiBJbm9kZSBjYWNoZQorCSAqLworCXN0cnVjdCBleHQyX2lub2RlX2NhY2hlCQkqaWNhY2hlOworCWlvX2NoYW5uZWwJCQlpbWFnZV9pbzsKK307CisKKyNpbmNsdWRlICJiaXRvcHMuaCIKKworLyoKKyAqIFJldHVybiBmbGFncyBmb3IgdGhlIGJsb2NrIGl0ZXJhdG9yIGZ1bmN0aW9ucworICovCisjZGVmaW5lIEJMT0NLX0NIQU5HRUQJMQorI2RlZmluZSBCTE9DS19BQk9SVAkyCisjZGVmaW5lIEJMT0NLX0VSUk9SCTQKKworLyoKKyAqIEJsb2NrIGludGVyYXRlIGZsYWdzCisgKgorICogQkxPQ0tfRkxBR19BUFBFTkQsIG9yIEJMT0NLX0ZMQUdfSE9MRSwgaW5kaWNhdGVzIHRoYXQgdGhlIGludGVyYXRvcgorICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbiBibG9ja3Mgd2hlcmUgdGhlIGJsb2NrIG51bWJlciBpcyB6ZXJvLgorICogVGhpcyBpcyB1c2VkIGJ5IGV4dDJmc19leHBhbmRfZGlyKCkgdG8gYmUgYWJsZSB0byBhZGQgYSBuZXcgYmxvY2sKKyAqIHRvIGFuIGlub2RlLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBmb3IgcHJvZ3JhbXMgdGhhdCB3YW50IHRvIGJlIGFibGUKKyAqIHRvIGRlYWwgd2l0aCBmaWxlcyB0aGF0IGNvbnRhaW4gImhvbGVzIi4KKyAqCisgKiBCTE9DS19GTEFHX1RSQVZFUlNFIGluZGljYXRlcyB0aGF0IHRoZSBpdGVyYXRvciBmdW5jdGlvbiBmb3IgdGhlCisgKiBpbmRpcmVjdCwgZG91Ymx5IGluZGlyZWN0LCBldGMuIGJsb2NrcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFsbAorICogb2YgdGhlIGJsb2NrcyBjb250YWluaW5lZCBpbiB0aGUgaW5kaXJlY3QgYmxvY2tzIGFyZSBwcm9jZXNzZWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGdvaW5nIHRvIGJlIGRlYWxsb2NhdGluZyBibG9ja3MgZnJvbSBhbgorICogaW5vZGUuCisgKgorICogQkxPQ0tfRkxBR19EQVRBX09OTFkgaW5kaWNhdGVzIHRoYXQgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHNob3VsZCBiZQorICogY2FsbGVkIGZvciBkYXRhIGJsb2NrcyBvbmx5LgorICoKKyAqIEJMT0NLX0ZMQUdfTk9fTEFSR0UgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgSXQgaW5mb3JtcworICogZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyIHRoYXQgbGFyZ2UgZmlsZXMgd29uJ3QgYmUgYWNjZXB0ZWQuCisgKi8KKyNkZWZpbmUgQkxPQ0tfRkxBR19BUFBFTkQJMQorI2RlZmluZSBCTE9DS19GTEFHX0hPTEUJCTEKKyNkZWZpbmUgQkxPQ0tfRkxBR19ERVBUSF9UUkFWRVJTRQkyCisjZGVmaW5lIEJMT0NLX0ZMQUdfREFUQV9PTkxZCTQKKworI2RlZmluZSBCTE9DS19GTEFHX05PX0xBUkdFCTB4MTAwMAorCisvKgorICogTWFnaWMgImJsb2NrIGNvdW50IiByZXR1cm4gdmFsdWVzIGZvciB0aGUgYmxvY2sgaXRlcmF0b3IgZnVuY3Rpb24uCisgKi8KKyNkZWZpbmUgQkxPQ0tfQ09VTlRfSU5ECQkoLTEpCisjZGVmaW5lIEJMT0NLX0NPVU5UX0RJTkQJKC0yKQorI2RlZmluZSBCTE9DS19DT1VOVF9USU5ECSgtMykKKyNkZWZpbmUgQkxPQ0tfQ09VTlRfVFJBTlNMQVRPUgkoLTQpCisKKyNpZiAwCisvKgorICogRmxhZ3MgZm9yIGV4dDJmc19tb3ZlX2Jsb2NrcworICovCisjZGVmaW5lIEVYVDJfQk1PVkVfR0VUX0RCTElTVAkweDAwMDEKKyNkZWZpbmUgRVhUMl9CTU9WRV9ERUJVRwkweDAwMDIKKyNlbmRpZgorCisvKgorICogRmxhZ3MgZm9yIGRpcmVjdG9yeSBibG9jayByZWFkaW5nIGFuZCB3cml0aW5nIGZ1bmN0aW9ucworICovCisjZGVmaW5lIEVYVDJfRElSQkxPQ0tfVjJfU1RSVUNUCTB4MDAwMQorCisvKgorICogUmV0dXJuIGZsYWdzIGZvciB0aGUgZGlyZWN0b3J5IGl0ZXJhdG9yIGZ1bmN0aW9ucworICovCisjZGVmaW5lIERJUkVOVF9DSEFOR0VECTEKKyNkZWZpbmUgRElSRU5UX0FCT1JUCTIKKyNkZWZpbmUgRElSRU5UX0VSUk9SCTMKKworLyoKKyAqIERpcmVjdG9yeSBpdGVyYXRvciBmbGFncworICovCisKKyNkZWZpbmUgRElSRU5UX0ZMQUdfSU5DTFVERV9FTVBUWQkxCisjZGVmaW5lIERJUkVOVF9GTEFHX0lOQ0xVREVfUkVNT1ZFRAkyCisKKyNkZWZpbmUgRElSRU5UX0RPVF9GSUxFCQkxCisjZGVmaW5lIERJUkVOVF9ET1RfRE9UX0ZJTEUJMgorI2RlZmluZSBESVJFTlRfT1RIRVJfRklMRQkzCisjZGVmaW5lIERJUkVOVF9ERUxFVEVEX0ZJTEUJNAorCisvKgorICogSW5vZGUgc2NhbiBkZWZpbml0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCBleHQyX3N0cnVjdF9pbm9kZV9zY2FuICpleHQyX2lub2RlX3NjYW47CisKKy8qCisgKiBleHQyZnNfc2NhbiBmbGFncworICovCisjZGVmaW5lIEVYVDJfU0ZfQ0hLX0JBREJMT0NLUwkweDAwMDEKKyNkZWZpbmUgRVhUMl9TRl9CQURfSU5PREVfQkxLCTB4MDAwMgorI2RlZmluZSBFWFQyX1NGX0JBRF9FWFRSQV9CWVRFUwkweDAwMDQKKyNkZWZpbmUgRVhUMl9TRl9TS0lQX01JU1NJTkdfSVRBQkxFCTB4MDAwOAorCisvKgorICogZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX01GX01PVU5URUQJCTEKKyNkZWZpbmUgRVhUMl9NRl9JU1JPT1QJCTIKKyNkZWZpbmUgRVhUMl9NRl9SRUFET05MWQk0CisjZGVmaW5lIEVYVDJfTUZfU1dBUAkJOAorI2RlZmluZSBFWFQyX01GX0JVU1kJCTE2CisKKy8qCisgKiBFeHQyL2xpbnV4IG1vZGUgZmxhZ3MuICBXZSBkZWZpbmUgdGhlbSBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZAorICogdG8gZGVwZW5kIG9uIHRoZSBPUydzIHN5cy9zdGF0LmgsIHNpbmNlIHdlIG1heSBiZSBjb21waWxpbmcgb24gYQorICogbm9uLUxpbnV4IHN5c3RlbS4KKyAqLworI2RlZmluZSBMSU5VWF9TX0lGTVQgIDAwMTcwMDAwCisjZGVmaW5lIExJTlVYX1NfSUZTT0NLIDAxNDAwMDAKKyNkZWZpbmUgTElOVVhfU19JRkxOSwkgMDEyMDAwMAorI2RlZmluZSBMSU5VWF9TX0lGUkVHICAwMTAwMDAwCisjZGVmaW5lIExJTlVYX1NfSUZCTEsgIDAwNjAwMDAKKyNkZWZpbmUgTElOVVhfU19JRkRJUiAgMDA0MDAwMAorI2RlZmluZSBMSU5VWF9TX0lGQ0hSICAwMDIwMDAwCisjZGVmaW5lIExJTlVYX1NfSUZJRk8gIDAwMTAwMDAKKyNkZWZpbmUgTElOVVhfU19JU1VJRCAgMDAwNDAwMAorI2RlZmluZSBMSU5VWF9TX0lTR0lEICAwMDAyMDAwCisjZGVmaW5lIExJTlVYX1NfSVNWVFggIDAwMDEwMDAKKworI2RlZmluZSBMSU5VWF9TX0lSV1hVIDAwNzAwCisjZGVmaW5lIExJTlVYX1NfSVJVU1IgMDA0MDAKKyNkZWZpbmUgTElOVVhfU19JV1VTUiAwMDIwMAorI2RlZmluZSBMSU5VWF9TX0lYVVNSIDAwMTAwCisKKyNkZWZpbmUgTElOVVhfU19JUldYRyAwMDA3MAorI2RlZmluZSBMSU5VWF9TX0lSR1JQIDAwMDQwCisjZGVmaW5lIExJTlVYX1NfSVdHUlAgMDAwMjAKKyNkZWZpbmUgTElOVVhfU19JWEdSUCAwMDAxMAorCisjZGVmaW5lIExJTlVYX1NfSVJXWE8gMDAwMDcKKyNkZWZpbmUgTElOVVhfU19JUk9USCAwMDAwNAorI2RlZmluZSBMSU5VWF9TX0lXT1RIIDAwMDAyCisjZGVmaW5lIExJTlVYX1NfSVhPVEggMDAwMDEKKworI2RlZmluZSBMSU5VWF9TX0lTTE5LKG0pCSgoKG0pICYgTElOVVhfU19JRk1UKSA9PSBMSU5VWF9TX0lGTE5LKQorI2RlZmluZSBMSU5VWF9TX0lTUkVHKG0pCSgoKG0pICYgTElOVVhfU19JRk1UKSA9PSBMSU5VWF9TX0lGUkVHKQorI2RlZmluZSBMSU5VWF9TX0lTRElSKG0pCSgoKG0pICYgTElOVVhfU19JRk1UKSA9PSBMSU5VWF9TX0lGRElSKQorI2RlZmluZSBMSU5VWF9TX0lTQ0hSKG0pCSgoKG0pICYgTElOVVhfU19JRk1UKSA9PSBMSU5VWF9TX0lGQ0hSKQorI2RlZmluZSBMSU5VWF9TX0lTQkxLKG0pCSgoKG0pICYgTElOVVhfU19JRk1UKSA9PSBMSU5VWF9TX0lGQkxLKQorI2RlZmluZSBMSU5VWF9TX0lTRklGTyhtKQkoKChtKSAmIExJTlVYX1NfSUZNVCkgPT0gTElOVVhfU19JRklGTykKKyNkZWZpbmUgTElOVVhfU19JU1NPQ0sobSkJKCgobSkgJiBMSU5VWF9TX0lGTVQpID09IExJTlVYX1NfSUZTT0NLKQorCisvKgorICogZXh0MiBzaXplIG9mIGFuIGlub2RlCisgKi8KKyNkZWZpbmUgRVhUMl9JX1NJWkUoaSkJKChpKS0+aV9zaXplIHwgKChfX3U2NCkgKGkpLT5pX3NpemVfaGlnaCA8PCAzMikpCisKKy8qCisgKiBleHQyX2ljb3VudF90IGFic3RyYWN0aW9uCisgKi8KKyNkZWZpbmUgRVhUMl9JQ09VTlRfT1BUX0lOQ1JFTUVOVAkweDAxCisKK3R5cGVkZWYgc3RydWN0IGV4dDJfaWNvdW50ICpleHQyX2ljb3VudF90OworCisvKgorICogRmxhZ3MgZm9yIGV4dDJmc19ibWFwCisgKi8KKyNkZWZpbmUgQk1BUF9BTExPQwkweDAwMDEKKyNkZWZpbmUgQk1BUF9TRVQJMHgwMDAyCisKKy8qCisgKiBGbGFncyBmb3IgaW1hZ2VyLmMgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgSU1BR0VSX0ZMQUdfSU5PREVNQVAJMQorI2RlZmluZSBJTUFHRVJfRkxBR19TUEFSU0VXUklURQkyCisKKy8qCisgKiBGb3IgY2hlY2tpbmcgc3RydWN0dXJlIG1hZ2ljIG51bWJlcnMuLi4KKyAqLworCisjZGVmaW5lIEVYVDJfQ0hFQ0tfTUFHSUMoc3RydWN0LCBjb2RlKSBcCisJICBpZiAoKHN0cnVjdCktPm1hZ2ljICE9IChjb2RlKSkgcmV0dXJuIChjb2RlKQorCisKKy8qCisgKiBGb3IgZXh0MiBjb21wcmVzc2lvbiBzdXBwb3J0CisgKi8KKyNkZWZpbmUgRVhUMkZTX0NPTVBSRVNTRURfQkxLQUREUiAoKGJsa190KSAweGZmZmZmZmZmKQorI2RlZmluZSBIT0xFX0JMS0FERFIoX2IpICgoX2IpID09IDAgfHwgKF9iKSA9PSBFWFQyRlNfQ09NUFJFU1NFRF9CTEtBRERSKQorCisvKgorICogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorICovCisjZGVmaW5lIEVYVDJfTElCX0ZFQVRVUkVfQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFU3xcCisJCQkJCSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpCisKKy8qIFRoaXMgI2lmZGVmIGlzIHRlbXBvcmFyeSB1bnRpbCBjb21wcmVzc2lvbiBpcyBmdWxseSBzdXBwb3J0ZWQgKi8KKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKyNpZm5kZWYgSV9LTk9XX1RIQVRfQ09NUFJFU1NJT05fSVNfRVhQRVJJTUVOVEFMCisvKiBJZiB0aGUgYmVsb3cgd2FybmluZyBidWdzIHlvdSwgdGhlbiBoYXZlCisgICBgQ1BQRkxBR1M9LURJX0tOT1dfVEhBVF9DT01QUkVTU0lPTl9JU19FWFBFUklNRU5UQUwnIGluIHlvdXIKKyAgIGVudmlyb25tZW50IGF0IGNvbmZpZ3VyZSB0aW1lLiAqLworICN3YXJuaW5nICJDb21wcmVzc2lvbiBzdXBwb3J0IGlzIGV4cGVyaW1lbnRhbCIKKyNlbmRpZgorI2RlZmluZSBFWFQyX0xJQl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXxcCisJCQkJCSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NJT058XAorCQkJCQkgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHfFwKKwkJCQkJIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKQorI2Vsc2UKKyNkZWZpbmUgRVhUMl9MSUJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEV8XAorCQkJCQkgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHfFwKKwkJCQkJIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKQorI2VuZGlmCisjZGVmaW5lIEVYVDJfTElCX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSfFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSkKKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworLyogYWxsb2MuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfbmV3X2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgaW50IG1vZGUsCisJCQkJICBleHQyZnNfaW5vZGVfYml0bWFwIG1hcCwgZXh0Ml9pbm9fdCAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX25ld19ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgZ29hbCwKKwkJCQkgIGV4dDJmc19ibG9ja19iaXRtYXAgbWFwLCBibGtfdCAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2dldF9mcmVlX2Jsb2NrcyhleHQyX2ZpbHN5cyBmcywgYmxrX3Qgc3RhcnQsCisJCQkJCWJsa190IGZpbmlzaCwgaW50IG51bSwKKwkJCQkJZXh0MmZzX2Jsb2NrX2JpdG1hcCBtYXAsCisJCQkJCWJsa190ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWxsb2NfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGdvYWwsCisJCQkJICAgIGNoYXIgKmJsb2NrX2J1ZiwgYmxrX3QgKnJldCk7CisKKy8qIGFsbG9jX3NiLmMgKi8KK2V4dGVybiBpbnQgZXh0MmZzX3Jlc2VydmVfc3VwZXJfYW5kX2JnZChleHQyX2ZpbHN5cyBmcywKKwkJCQkJZGdycF90IGdyb3VwLAorCQkJCQlleHQyZnNfYmxvY2tfYml0bWFwIGJtYXApOworCisvKiBhbGxvY19zdGF0cy5jICovCit2b2lkIGV4dDJmc19pbm9kZV9hbGxvY19zdGF0cyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sIGludCBpbnVzZSk7Cit2b2lkIGV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICAgIGludCBpbnVzZSwgaW50IGlzZGlyKTsKK3ZvaWQgZXh0MmZzX2Jsb2NrX2FsbG9jX3N0YXRzKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssIGludCBpbnVzZSk7CisKKy8qIGFsbG9jX3RhYmxlcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hbGxvY2F0ZV90YWJsZXMoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfZ3JvdXBfdGFibGUoZXh0Ml9maWxzeXMgZnMsIGRncnBfdCBncm91cCwKKwkJCQkJICAgICBleHQyZnNfYmxvY2tfYml0bWFwIGJtYXApOworCisvKiBiYWRibG9ja3MuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfdTMyX2xpc3RfY3JlYXRlKGV4dDJfdTMyX2xpc3QgKnJldCwgaW50IHNpemUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfdTMyX2xpc3RfYWRkKGV4dDJfdTMyX2xpc3QgYmIsIF9fdTMyIGJsayk7CitleHRlcm4gaW50IGV4dDJmc191MzJfbGlzdF9maW5kKGV4dDJfdTMyX2xpc3QgYmIsIF9fdTMyIGJsayk7CitleHRlcm4gaW50IGV4dDJmc191MzJfbGlzdF90ZXN0KGV4dDJfdTMyX2xpc3QgYmIsIGJsa190IGJsayk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc191MzJfbGlzdF9pdGVyYXRlX2JlZ2luKGV4dDJfdTMyX2xpc3QgYmIsCisJCQkJCSAgICAgICBleHQyX3UzMl9pdGVyYXRlICpyZXQpOworZXh0ZXJuIGludCBleHQyZnNfdTMyX2xpc3RfaXRlcmF0ZShleHQyX3UzMl9pdGVyYXRlIGl0ZXIsIGJsa190ICpibGspOworZXh0ZXJuIHZvaWQgZXh0MmZzX3UzMl9saXN0X2l0ZXJhdGVfZW5kKGV4dDJfdTMyX2l0ZXJhdGUgaXRlcik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc191MzJfY29weShleHQyX3UzMl9saXN0IHNyYywgZXh0Ml91MzJfbGlzdCAqZGVzdCk7CitleHRlcm4gaW50IGV4dDJmc191MzJfbGlzdF9lcXVhbChleHQyX3UzMl9saXN0IGJiMSwgZXh0Ml91MzJfbGlzdCBiYjIpOworCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19iYWRibG9ja3NfbGlzdF9jcmVhdGUoZXh0Ml9iYWRibG9ja3NfbGlzdCAqcmV0LAorCQkJCQkgICAgaW50IHNpemUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfYWRkKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIsCisJCQkJCSAgIGJsa190IGJsayk7CitleHRlcm4gaW50IGV4dDJmc19iYWRibG9ja3NfbGlzdF90ZXN0KGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIsCisJCQkJICAgIGJsa190IGJsayk7CitleHRlcm4gaW50IGV4dDJmc191MzJfbGlzdF9kZWwoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKTsKK2V4dGVybiB2b2lkIGV4dDJmc19iYWRibG9ja3NfbGlzdF9kZWwoZXh0Ml91MzJfbGlzdCBiYiwgX191MzIgYmxrKTsKK2V4dGVybiBlcnJjb2RlX3QKKwlleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9iZWdpbihleHQyX2JhZGJsb2Nrc19saXN0IGJiLAorCQkJCQkgICAgZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZSAqcmV0KTsKK2V4dGVybiBpbnQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGUoZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZSBpdGVyLAorCQkJCQkgYmxrX3QgKmJsayk7CitleHRlcm4gdm9pZCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9lbmQoZXh0Ml9iYWRibG9ja3NfaXRlcmF0ZSBpdGVyKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2JhZGJsb2Nrc19jb3B5KGV4dDJfYmFkYmxvY2tzX2xpc3Qgc3JjLAorCQkJCSAgICAgICBleHQyX2JhZGJsb2Nrc19saXN0ICpkZXN0KTsKK2V4dGVybiBpbnQgZXh0MmZzX2JhZGJsb2Nrc19lcXVhbChleHQyX2JhZGJsb2Nrc19saXN0IGJiMSwKKwkJCQkgIGV4dDJfYmFkYmxvY2tzX2xpc3QgYmIyKTsKK2V4dGVybiBpbnQgZXh0MmZzX3UzMl9saXN0X2NvdW50KGV4dDJfdTMyX2xpc3QgYmIpOworCisvKiBiYl9jb21wYXQgKi8KK2V4dGVybiBlcnJjb2RlX3QgYmFkYmxvY2tzX2xpc3RfY3JlYXRlKGJhZGJsb2Nrc19saXN0ICpyZXQsIGludCBzaXplKTsKK2V4dGVybiBlcnJjb2RlX3QgYmFkYmxvY2tzX2xpc3RfYWRkKGJhZGJsb2Nrc19saXN0IGJiLCBibGtfdCBibGspOworZXh0ZXJuIGludCBiYWRibG9ja3NfbGlzdF90ZXN0KGJhZGJsb2Nrc19saXN0IGJiLCBibGtfdCBibGspOworZXh0ZXJuIGVycmNvZGVfdCBiYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGJhZGJsb2Nrc19saXN0IGJiLAorCQkJCQkgICAgICBiYWRibG9ja3NfaXRlcmF0ZSAqcmV0KTsKK2V4dGVybiBpbnQgYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZShiYWRibG9ja3NfaXRlcmF0ZSBpdGVyLCBibGtfdCAqYmxrKTsKK2V4dGVybiB2b2lkIGJhZGJsb2Nrc19saXN0X2l0ZXJhdGVfZW5kKGJhZGJsb2Nrc19pdGVyYXRlIGl0ZXIpOworZXh0ZXJuIHZvaWQgYmFkYmxvY2tzX2xpc3RfZnJlZShiYWRibG9ja3NfbGlzdCBiYik7CisKKy8qIGJiX2lub2RlLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3VwZGF0ZV9iYl9pbm9kZShleHQyX2ZpbHN5cyBmcywKKwkJCQkJZXh0Ml9iYWRibG9ja3NfbGlzdCBiYl9saXN0KTsKKworLyogYml0bWFwcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9pbm9kZV9iaXRtYXAoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfYmxvY2tfYml0bWFwIChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2lub2RlX2JpdG1hcCAoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9ibG9ja19iaXRtYXAoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfZ2VuZXJpY19iaXRtYXAoX191MzIgc3RhcnQsCisJCQkJCQlfX3UzMiBlbmQsCisJCQkJCQlfX3UzMiByZWFsX2VuZCwKKwkJCQkJCWNvbnN0IGNoYXIgKmRlc2NyLAorCQkJCQkJZXh0MmZzX2dlbmVyaWNfYml0bWFwICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWxsb2NhdGVfYmxvY2tfYml0bWFwKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpkZXNjciwKKwkJCQkJICAgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2FsbG9jYXRlX2lub2RlX2JpdG1hcChleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZGVzY3IsCisJCQkJCSAgICAgIGV4dDJmc19pbm9kZV9iaXRtYXAgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19mdWRnZV9pbm9kZV9iaXRtYXBfZW5kKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgICAgZXh0Ml9pbm9fdCBlbmQsIGV4dDJfaW5vX3QgKm9lbmQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZnVkZ2VfYmxvY2tfYml0bWFwX2VuZChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICAgIGJsa190IGVuZCwgYmxrX3QgKm9lbmQpOworZXh0ZXJuIHZvaWQgZXh0MmZzX2NsZWFyX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCk7CitleHRlcm4gdm9pZCBleHQyZnNfY2xlYXJfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3JlYWRfYml0bWFwcyhleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9iaXRtYXBzKGV4dDJfZmlsc3lzIGZzKTsKKworLyogYmxvY2suYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYmxvY2tfaXRlcmF0ZShleHQyX2ZpbHN5cyBmcywKKwkJCQkgICAgICBleHQyX2lub190CWlubywKKwkJCQkgICAgICBpbnQJZmxhZ3MsCisJCQkJICAgICAgY2hhciAqYmxvY2tfYnVmLAorCQkJCSAgICAgIGludCAoKmZ1bmMpKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkJICBibGtfdAkqYmxvY2tuciwKKwkJCQkJCSAgaW50CWJsb2NrY250LAorCQkJCQkJICB2b2lkCSpwcml2X2RhdGEpLAorCQkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSk7CitlcnJjb2RlX3QgZXh0MmZzX2Jsb2NrX2l0ZXJhdGUyKGV4dDJfZmlsc3lzIGZzLAorCQkJCWV4dDJfaW5vX3QJaW5vLAorCQkJCWludAlmbGFncywKKwkJCQljaGFyICpibG9ja19idWYsCisJCQkJaW50ICgqZnVuYykoZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgICBibGtfdAkqYmxvY2tuciwKKwkJCQkJICAgIGUyX2Jsa2NudF90CWJsb2NrY250LAorCQkJCQkgICAgYmxrX3QJcmVmX2JsaywKKwkJCQkJICAgIGludAkJcmVmX29mZnNldCwKKwkJCQkJICAgIHZvaWQJKnByaXZfZGF0YSksCisJCQkJdm9pZCAqcHJpdl9kYXRhKTsKKworLyogYm1hcC5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19ibWFwKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkJICAgICBjaGFyICpibG9ja19idWYsIGludCBibWFwX2ZsYWdzLAorCQkJICAgICBibGtfdCBibG9jaywgYmxrX3QgKnBoeXNfYmxrKTsKKworCisjaWYgMAorLyogYm1vdmUuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfbW92ZV9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsCisJCQkJICAgIGV4dDJmc19ibG9ja19iaXRtYXAgcmVzZXJ2ZSwKKwkJCQkgICAgZXh0MmZzX2Jsb2NrX2JpdG1hcCBhbGxvY19tYXAsCisJCQkJICAgIGludCBmbGFncyk7CisjZW5kaWYKKworLyogY2hlY2tfZGVzYy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jaGVja19kZXNjKGV4dDJfZmlsc3lzIGZzKTsKKworLyogY2xvc2Vmcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jbG9zZShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19mbHVzaChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gaW50IGV4dDJmc19iZ19oYXNfc3VwZXIoZXh0Ml9maWxzeXMgZnMsIGludCBncm91cF9ibG9jayk7CitleHRlcm4gaW50IGV4dDJmc19zdXBlcl9hbmRfYmdkX2xvYyhleHQyX2ZpbHN5cyBmcywKKwkJCQkgICAgZGdycF90IGdyb3VwLAorCQkJCSAgICBibGtfdCAqcmV0X3N1cGVyX2JsaywKKwkJCQkgICAgYmxrX3QgKnJldF9vbGRfZGVzY19ibGssCisJCQkJICAgIGJsa190ICpyZXRfbmV3X2Rlc2NfYmxrLAorCQkJCSAgICBpbnQgKnJldF9tZXRhX2JnKTsKK2V4dGVybiB2b2lkIGV4dDJmc191cGRhdGVfZHluYW1pY19yZXYoZXh0Ml9maWxzeXMgZnMpOworCisvKiBjbXBfYml0bWFwcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jb21wYXJlX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJtMSwKKwkJCQkJICAgICBleHQyZnNfYmxvY2tfYml0bWFwIGJtMik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jb21wYXJlX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJtMSwKKwkJCQkJICAgICBleHQyZnNfaW5vZGVfYml0bWFwIGJtMik7CisKKy8qIGRibGlzdC5jICovCisKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2dldF9udW1fZGlycyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCAqcmV0X251bV9kaXJzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2luaXRfZGJsaXN0KGV4dDJfZmlsc3lzIGZzLCBleHQyX2RibGlzdCAqcmV0X2RibGlzdCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hZGRfZGlyX2Jsb2NrKGV4dDJfZGJsaXN0IGRibGlzdCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICAgICAgYmxrX3QgYmxrLCBpbnQgYmxvY2tjbnQpOworZXh0ZXJuIHZvaWQgZXh0MmZzX2RibGlzdF9zb3J0KGV4dDJfZGJsaXN0IGRibGlzdCwKKwkJCSAgICAgICBpbnQgKCpzb3J0ZnVuYykoY29uc3Qgdm9pZCAqLAorCQkJCQkJCSAgIGNvbnN0IHZvaWQgKikpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZGJsaXN0X2l0ZXJhdGUoZXh0Ml9kYmxpc3QgZGJsaXN0LAorCWludCAoKmZ1bmMpKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3QgZXh0Ml9kYl9lbnRyeSAqZGJfaW5mbywKKwkJICAgIHZvaWQJKnByaXZfZGF0YSksCisgICAgICAgdm9pZCAqcHJpdl9kYXRhKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3NldF9kaXJfYmxvY2soZXh0Ml9kYmxpc3QgZGJsaXN0LCBleHQyX2lub190IGlubywKKwkJCQkgICAgICBibGtfdCBibGssIGludCBibG9ja2NudCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jb3B5X2RibGlzdChleHQyX2RibGlzdCBzcmMsCisJCQkJICAgIGV4dDJfZGJsaXN0ICpkZXN0KTsKK2V4dGVybiBpbnQgZXh0MmZzX2RibGlzdF9jb3VudChleHQyX2RibGlzdCBkYmxpc3QpOworCisvKiBkYmxpc3RfZGlyLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QKKwlleHQyZnNfZGJsaXN0X2Rpcl9pdGVyYXRlKGV4dDJfZGJsaXN0IGRibGlzdCwKKwkJCQkgIGludAlmbGFncywKKwkJCQkgIGNoYXIJKmJsb2NrX2J1ZiwKKwkJCQkgIGludCAoKmZ1bmMpKGV4dDJfaW5vX3QJZGlyLAorCQkJCQkgICAgICBpbnQJCWVudHJ5LAorCQkJCQkgICAgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCQkJICAgICAgaW50CW9mZnNldCwKKwkJCQkJICAgICAgaW50CWJsb2Nrc2l6ZSwKKwkJCQkJICAgICAgY2hhcgkqYnVmLAorCQkJCQkgICAgICB2b2lkCSpwcml2X2RhdGEpLAorCQkJCSAgdm9pZCAqcHJpdl9kYXRhKTsKKworLyogZGlyYmxvY2suYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9kaXJfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCSAgICAgICB2b2lkICpidWYpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9kaXJfYmxvY2syKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywKKwkJCQkJdm9pZCAqYnVmLCBpbnQgZmxhZ3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywKKwkJCQkJdm9pZCAqYnVmKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2Rpcl9ibG9jazIoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLAorCQkJCQkgdm9pZCAqYnVmLCBpbnQgZmxhZ3MpOworCisvKiBkaXJoYXNoLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2Rpcmhhc2goaW50IHZlcnNpb24sIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCQkJY29uc3QgX191MzIgKnNlZWQsCisJCQkJZXh0Ml9kaXJoYXNoX3QgKnJldF9oYXNoLAorCQkJCWV4dDJfZGlyaGFzaF90ICpyZXRfbWlub3JfaGFzaCk7CisKKworLyogZGlyX2l0ZXJhdGUuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZGlyX2l0ZXJhdGUoZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgICBleHQyX2lub190IGRpciwKKwkJCSAgICAgIGludCBmbGFncywKKwkJCSAgICAgIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCSAgICAgIGludCAoKmZ1bmMpKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZGlyZW50LAorCQkJCQkgIGludAlvZmZzZXQsCisJCQkJCSAgaW50CWJsb2Nrc2l6ZSwKKwkJCQkJICBjaGFyCSpidWYsCisJCQkJCSAgdm9pZAkqcHJpdl9kYXRhKSwKKwkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19kaXJfaXRlcmF0ZTIoZXh0Ml9maWxzeXMgZnMsCisJCQkgICAgICBleHQyX2lub190IGRpciwKKwkJCSAgICAgIGludCBmbGFncywKKwkJCSAgICAgIGNoYXIgKmJsb2NrX2J1ZiwKKwkJCSAgICAgIGludCAoKmZ1bmMpKGV4dDJfaW5vX3QJZGlyLAorCQkJCQkgIGludAllbnRyeSwKKwkJCQkJICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJCQkJICBpbnQJb2Zmc2V0LAorCQkJCQkgIGludAlibG9ja3NpemUsCisJCQkJCSAgY2hhcgkqYnVmLAorCQkJCQkgIHZvaWQJKnByaXZfZGF0YSksCisJCQkgICAgICB2b2lkICpwcml2X2RhdGEpOworCisvKiBkdXBmcy5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19kdXBfaGFuZGxlKGV4dDJfZmlsc3lzIHNyYywgZXh0Ml9maWxzeXMgKmRlc3QpOworCisvKiBleHBhbmRkaXIuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZXhwYW5kX2RpcihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIpOworCisvKiBleHRfYXR0ci5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2V4dF9hdHRyKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywgdm9pZCAqYnVmKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2V4dF9hdHRyKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibG9jaywKKwkJCQkgICAgICAgdm9pZCAqYnVmKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2FkanVzdF9lYV9yZWZjb3VudChleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLAorCQkJCQkgICBjaGFyICpibG9ja19idWYsCisJCQkJCSAgIGludCBhZGp1c3QsIF9fdTMyICpuZXdjb3VudCk7CisKKy8qIGZpbGVpby5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19maWxlX29wZW4yKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCQkJICAgaW50IGZsYWdzLCBleHQyX2ZpbGVfdCAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfb3BlbihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICBpbnQgZmxhZ3MsIGV4dDJfZmlsZV90ICpyZXQpOworZXh0ZXJuIGV4dDJfZmlsc3lzIGV4dDJmc19maWxlX2dldF9mcyhleHQyX2ZpbGVfdCBmaWxlKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfY2xvc2UoZXh0Ml9maWxlX3QgZmlsZSk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19maWxlX2ZsdXNoKGV4dDJfZmlsZV90IGZpbGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZmlsZV9yZWFkKGV4dDJfZmlsZV90IGZpbGUsIHZvaWQgKmJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGludCB3YW50ZWQsIHVuc2lnbmVkIGludCAqZ290KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfd3JpdGUoZXh0Ml9maWxlX3QgZmlsZSwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHVuc2lnbmVkIGludCAqd3JpdHRlbik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19maWxlX2xsc2VlayhleHQyX2ZpbGVfdCBmaWxlLCBfX3U2NCBvZmZzZXQsCisJCQkJICAgaW50IHdoZW5jZSwgX191NjQgKnJldF9wb3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZmlsZV9sc2VlayhleHQyX2ZpbGVfdCBmaWxlLCBleHQyX29mZl90IG9mZnNldCwKKwkJCQkgICBpbnQgd2hlbmNlLCBleHQyX29mZl90ICpyZXRfcG9zKTsKK2VycmNvZGVfdCBleHQyZnNfZmlsZV9nZXRfbHNpemUoZXh0Ml9maWxlX3QgZmlsZSwgX191NjQgKnJldF9zaXplKTsKK2V4dGVybiBleHQyX29mZl90IGV4dDJmc19maWxlX2dldF9zaXplKGV4dDJfZmlsZV90IGZpbGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZmlsZV9zZXRfc2l6ZShleHQyX2ZpbGVfdCBmaWxlLCBleHQyX29mZl90IHNpemUpOworCisvKiBmaW5kZGV2LmMgKi8KK2V4dGVybiBjaGFyICpleHQyZnNfZmluZF9ibG9ja19kZXZpY2UoZGV2X3QgZGV2aWNlKTsKKworLyogZmx1c2hiLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3N5bmNfZGV2aWNlKGludCBmZCwgaW50IGZsdXNoYik7CisKKy8qIGZyZWVmcy5jICovCitleHRlcm4gdm9pZCBleHQyZnNfZnJlZShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gdm9pZCBleHQyZnNfZnJlZV9nZW5lcmljX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCk7CitleHRlcm4gdm9pZCBleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXApOworZXh0ZXJuIHZvaWQgZXh0MmZzX2ZyZWVfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKTsKK2V4dGVybiB2b2lkIGV4dDJmc19mcmVlX2RibGlzdChleHQyX2RibGlzdCBkYmxpc3QpOworZXh0ZXJuIHZvaWQgZXh0MmZzX2JhZGJsb2Nrc19saXN0X2ZyZWUoZXh0Ml9iYWRibG9ja3NfbGlzdCBiYik7CitleHRlcm4gdm9pZCBleHQyZnNfdTMyX2xpc3RfZnJlZShleHQyX3UzMl9saXN0IGJiKTsKKworLyogZ2V0c2l6ZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19nZXRfZGV2aWNlX3NpemUoY29uc3QgY2hhciAqZmlsZSwgaW50IGJsb2Nrc2l6ZSwKKwkJCQkJYmxrX3QgKnJldGJsb2Nrcyk7CisKKy8qIGdldHNlY3RzaXplLmMgKi8KK2VycmNvZGVfdCBleHQyZnNfZ2V0X2RldmljZV9zZWN0c2l6ZShjb25zdCBjaGFyICpmaWxlLCBpbnQgKnNlY3RzaXplKTsKKworLyogaW1hZ2VyLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX2lub2RlX3dyaXRlKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbWFnZV9pbm9kZV9yZWFkKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbWFnZV9zdXBlcl93cml0ZShleHQyX2ZpbHN5cyBmcywgaW50IGZkLCBpbnQgZmxhZ3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW1hZ2Vfc3VwZXJfcmVhZChleHQyX2ZpbHN5cyBmcywgaW50IGZkLCBpbnQgZmxhZ3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW1hZ2VfYml0bWFwX3dyaXRlKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncyk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbWFnZV9iaXRtYXBfcmVhZChleHQyX2ZpbHN5cyBmcywgaW50IGZkLCBpbnQgZmxhZ3MpOworCisvKiBpbmRfYmxvY2suYyAqLworZXJyY29kZV90IGV4dDJmc19yZWFkX2luZF9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLCB2b2lkICpidWYpOworZXJyY29kZV90IGV4dDJmc193cml0ZV9pbmRfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaywgdm9pZCAqYnVmKTsKKworLyogaW5pdGlhbGl6ZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pbml0aWFsaXplKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywKKwkJCQkgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqcGFyYW0sCisJCQkJICAgaW9fbWFuYWdlciBtYW5hZ2VyLCBleHQyX2ZpbHN5cyAqcmV0X2ZzKTsKKworLyogaWNvdW50LmMgKi8KK2V4dGVybiB2b2lkIGV4dDJmc19mcmVlX2ljb3VudChleHQyX2ljb3VudF90IGljb3VudCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jcmVhdGVfaWNvdW50MihleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgICAgICAgZXh0Ml9pY291bnRfdCBoaW50LCBleHQyX2ljb3VudF90ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfY3JlYXRlX2ljb3VudChleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgIGV4dDJfaWNvdW50X3QgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pY291bnRfZmV0Y2goZXh0Ml9pY291bnRfdCBpY291bnQsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgICAgX191MTYgKnJldCk7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19pY291bnRfaW5jcmVtZW50KGV4dDJfaWNvdW50X3QgaWNvdW50LCBleHQyX2lub190IGlubywKKwkJCQkJIF9fdTE2ICpyZXQpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaWNvdW50X2RlY3JlbWVudChleHQyX2ljb3VudF90IGljb3VudCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkJCSBfX3UxNiAqcmV0KTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9zdG9yZShleHQyX2ljb3VudF90IGljb3VudCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkJICAgICBfX3UxNiBjb3VudCk7CitleHRlcm4gZXh0Ml9pbm9fdCBleHQyZnNfZ2V0X2ljb3VudF9zaXplKGV4dDJfaWNvdW50X3QgaWNvdW50KTsKK2VycmNvZGVfdCBleHQyZnNfaWNvdW50X3ZhbGlkYXRlKGV4dDJfaWNvdW50X3QgaWNvdW50LCBGSUxFICopOworCisvKiBpbm9kZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19mbHVzaF9pY2FjaGUoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X25leHRfaW5vZGVfZnVsbChleHQyX2lub2RlX3NjYW4gc2NhbiwKKwkJCQkJICAgIGV4dDJfaW5vX3QgKmlubywKKwkJCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSwKKwkJCQkJICAgIGludCBidWZzaXplKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX29wZW5faW5vZGVfc2NhbihleHQyX2ZpbHN5cyBmcywgaW50IGJ1ZmZlcl9ibG9ja3MsCisJCQkJICBleHQyX2lub2RlX3NjYW4gKnJldF9zY2FuKTsKK2V4dGVybiB2b2lkIGV4dDJmc19jbG9zZV9pbm9kZV9zY2FuKGV4dDJfaW5vZGVfc2NhbiBzY2FuKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2dldF9uZXh0X2lub2RlKGV4dDJfaW5vZGVfc2NhbiBzY2FuLCBleHQyX2lub190ICppbm8sCisJCQkgICAgICAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2lub2RlX3NjYW5fZ290b19ibG9ja2dyb3VwKGV4dDJfaW5vZGVfc2NhbiBzY2FuLAorCQkJCQkJICAgaW50CWdyb3VwKTsKK2V4dGVybiB2b2lkIGV4dDJmc19zZXRfaW5vZGVfY2FsbGJhY2sKKwkoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sCisJIGVycmNvZGVfdCAoKmRvbmVfZ3JvdXApKGV4dDJfZmlsc3lzIGZzLAorCQkJCSBkZ3JwX3QgZ3JvdXAsCisJCQkJIHZvaWQgKiBwcml2X2RhdGEpLAorCSB2b2lkICpkb25lX2dyb3VwX2RhdGEpOworZXh0ZXJuIGludCBleHQyZnNfaW5vZGVfc2Nhbl9mbGFncyhleHQyX2lub2RlX3NjYW4gc2NhbiwgaW50IHNldF9mbGFncywKKwkJCQkgICBpbnQgY2xlYXJfZmxhZ3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9pbm9kZV9mdWxsKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkJc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwKKwkJCQkJaW50IGJ1ZnNpemUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9pbm9kZSAoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfaW5vZGVfZnVsbChleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZSAqIGlub2RlLAorCQkJCQkgaW50IGJ1ZnNpemUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfd3JpdGVfbmV3X2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqIGlub2RlKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2dldF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLCBibGtfdCAqYmxvY2tzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2RpcmVjdG9yeShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8pOworCisvKiBpbm9kZV9pby5jICovCitleHRlcm4gaW9fbWFuYWdlciBpbm9kZV9pb19tYW5hZ2VyOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW5vZGVfaW9faW50ZXJuKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkJY2hhciAqKm5hbWUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfaW5vZGVfaW9faW50ZXJuMihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCQkJCSBjaGFyICoqbmFtZSk7CisKKy8qIGlzbW91bnRlZC5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19jaGVja19pZl9tb3VudGVkKGNvbnN0IGNoYXIgKmZpbGUsIGludCAqbW91bnRfZmxhZ3MpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfY2hlY2tfbW91bnRfcG9pbnQoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgKm1vdW50X2ZsYWdzLAorCQkJCQkgIGNoYXIgKm10cHQsIGludCBtdGxlbik7CisKKy8qIG5hbWVpLmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2xvb2t1cChleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgaW50IG5hbWVsZW4sIGNoYXIgKmJ1ZiwgZXh0Ml9pbm9fdCAqaW5vZGUpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfbmFtZWkoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qgcm9vdCwgZXh0Ml9pbm9fdCBjd2QsCisJCQljb25zdCBjaGFyICpuYW1lLCBleHQyX2lub190ICppbm9kZSk7CitlcnJjb2RlX3QgZXh0MmZzX25hbWVpX2ZvbGxvdyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGN3ZCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgKmlub2RlKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2ZvbGxvd19saW5rKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgY3dkLAorCQkJZXh0Ml9pbm9fdCBpbm9kZSwgZXh0Ml9pbm9fdCAqcmVzX2lub2RlKTsKKworLyogbmF0aXZlLmMgKi8KK2ludCBleHQyZnNfbmF0aXZlX2ZsYWcodm9pZCk7CisKKy8qIG5ld2Rpci5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19uZXdfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpcl9pbm8sCisJCQkJZXh0Ml9pbm9fdCBwYXJlbnRfaW5vLCBjaGFyICoqYmxvY2spOworCisvKiBta2Rpci5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19ta2RpcihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBwYXJlbnQsIGV4dDJfaW5vX3QgaW51bSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBta2pvdXJuYWwuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfY3JlYXRlX2pvdXJuYWxfc3VwZXJibG9jayhleHQyX2ZpbHN5cyBmcywKKwkJCQkJCSAgX191MzIgc2l6ZSwgaW50IGZsYWdzLAorCQkJCQkJICBjaGFyICAqKnJldF9qc2IpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfYWRkX2pvdXJuYWxfZGV2aWNlKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkgICBleHQyX2ZpbHN5cyBqb3VybmFsX2Rldik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19hZGRfam91cm5hbF9pbm9kZShleHQyX2ZpbHN5cyBmcywgYmxrX3Qgc2l6ZSwKKwkJCQkJICBpbnQgZmxhZ3MpOworCisvKiBvcGVuZnMuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGludCBzdXBlcmJsb2NrLAorCQkJICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwgaW9fbWFuYWdlciBtYW5hZ2VyLAorCQkJICAgICBleHQyX2ZpbHN5cyAqcmV0X2ZzKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX29wZW4yKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmlvX29wdGlvbnMsCisJCQkgICAgICBpbnQgZmxhZ3MsIGludCBzdXBlcmJsb2NrLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIGlvX21hbmFnZXIgbWFuYWdlciwKKwkJCSAgICAgIGV4dDJfZmlsc3lzICpyZXRfZnMpOworZXh0ZXJuIGJsa190IGV4dDJmc19kZXNjcmlwdG9yX2Jsb2NrX2xvYyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgZ3JvdXBfYmxvY2ssCisJCQkJCSBkZ3JwX3QgaSk7CitlcnJjb2RlX3QgZXh0MmZzX2dldF9kYXRhX2lvKGV4dDJfZmlsc3lzIGZzLCBpb19jaGFubmVsICpvbGRfaW8pOworZXJyY29kZV90IGV4dDJmc19zZXRfZGF0YV9pbyhleHQyX2ZpbHN5cyBmcywgaW9fY2hhbm5lbCBuZXdfaW8pOworZXJyY29kZV90IGV4dDJmc19yZXdyaXRlX3RvX2lvKGV4dDJfZmlsc3lzIGZzLCBpb19jaGFubmVsIG5ld19pbyk7CisKKy8qIGdldF9wYXRobmFtZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19nZXRfcGF0aG5hbWUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyLCBleHQyX2lub190IGlubywKKwkJCSAgICAgICBjaGFyICoqbmFtZSk7CisKKy8qIGxpbmsuYyAqLworZXJyY29kZV90IGV4dDJmc19saW5rKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgZXh0Ml9pbm9fdCBpbm8sIGludCBmbGFncyk7CitlcnJjb2RlX3QgZXh0MmZzX3VubGluayhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlleHQyX2lub190IGlubywgaW50IGZsYWdzKTsKKworLyogcmVhZF9iYi5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc19yZWFkX2JiX2lub2RlKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICAgIGV4dDJfYmFkYmxvY2tzX2xpc3QgKmJiX2xpc3QpOworCisvKiByZWFkX2JiX2ZpbGUuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVhZF9iYl9GSUxFMihleHQyX2ZpbHN5cyBmcywgRklMRSAqZiwKKwkJCQkgICAgICBleHQyX2JhZGJsb2Nrc19saXN0ICpiYl9saXN0LAorCQkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSwKKwkJCQkgICAgICB2b2lkICgqaW52YWxpZCkoZXh0Ml9maWxzeXMgZnMsCisJCQkJCQkgICAgICBibGtfdCBibGssCisJCQkJCQkgICAgICBjaGFyICpiYWRzdHIsCisJCQkJCQkgICAgICB2b2lkICpwcml2X2RhdGEpKTsKK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX3JlYWRfYmJfRklMRShleHQyX2ZpbHN5cyBmcywgRklMRSAqZiwKKwkJCQkgICAgIGV4dDJfYmFkYmxvY2tzX2xpc3QgKmJiX2xpc3QsCisJCQkJICAgICB2b2lkICgqaW52YWxpZCkoZXh0Ml9maWxzeXMgZnMsCisJCQkJCQkgICAgIGJsa190IGJsaykpOworCisvKiByZXNfZ2R0LmMgKi8KK2V4dGVybiBlcnJjb2RlX3QgZXh0MmZzX2NyZWF0ZV9yZXNpemVfaW5vZGUoZXh0Ml9maWxzeXMgZnMpOworCisvKiByc19iaXRtYXAuYyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVzaXplX2dlbmVyaWNfYml0bWFwKF9fdTMyIG5ld19lbmQsCisJCQkJCSAgICAgIF9fdTMyIG5ld19yZWFsX2VuZCwKKwkJCQkJICAgICAgZXh0MmZzX2dlbmVyaWNfYml0bWFwIGJtYXApOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVzaXplX2lub2RlX2JpdG1hcChfX3UzMiBuZXdfZW5kLCBfX3UzMiBuZXdfcmVhbF9lbmQsCisJCQkJCSAgICBleHQyZnNfaW5vZGVfYml0bWFwIGJtYXApOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVzaXplX2Jsb2NrX2JpdG1hcChfX3UzMiBuZXdfZW5kLCBfX3UzMiBuZXdfcmVhbF9lbmQsCisJCQkJCSAgICBleHQyZnNfYmxvY2tfYml0bWFwIGJtYXApOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfY29weV9iaXRtYXAoZXh0MmZzX2dlbmVyaWNfYml0bWFwIHNyYywKKwkJCQkgICAgZXh0MmZzX2dlbmVyaWNfYml0bWFwICpkZXN0KTsKKworLyogc3dhcGZzLmMgKi8KK2V4dGVybiB2b2lkIGV4dDJmc19zd2FwX2V4dF9hdHRyKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgYnVmc2l6ZSwKKwkJCQkgaW50IGhhc19oZWFkZXIpOworZXh0ZXJuIHZvaWQgZXh0MmZzX3N3YXBfc3VwZXIoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBzdXBlcik7CitleHRlcm4gdm9pZCBleHQyZnNfc3dhcF9ncm91cF9kZXNjKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmdkcCk7CitleHRlcm4gdm9pZCBleHQyZnNfc3dhcF9pbm9kZV9mdWxsKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqdCwKKwkJCQkgICBzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqZiwgaW50IGhvc3RvcmRlciwKKwkJCQkgICBpbnQgYnVmc2l6ZSk7CitleHRlcm4gdm9pZCBleHQyZnNfc3dhcF9pbm9kZShleHQyX2ZpbHN5cyBmcyxzdHJ1Y3QgZXh0Ml9pbm9kZSAqdCwKKwkJCSAgICAgIHN0cnVjdCBleHQyX2lub2RlICpmLCBpbnQgaG9zdG9yZGVyKTsKKworLyogdmFsaWRfYmxrLmMgKi8KK2V4dGVybiBpbnQgZXh0MmZzX2lub2RlX2hhc192YWxpZF9ibG9ja3Moc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKTsKKworLyogdmVyc2lvbi5jICovCitleHRlcm4gaW50IGV4dDJmc19wYXJzZV92ZXJzaW9uX3N0cmluZyhjb25zdCBjaGFyICp2ZXJfc3RyaW5nKTsKK2V4dGVybiBpbnQgZXh0MmZzX2dldF9saWJyYXJ5X3ZlcnNpb24oY29uc3QgY2hhciAqKnZlcl9zdHJpbmcsCisJCQkJICAgICAgY29uc3QgY2hhciAqKmRhdGVfc3RyaW5nKTsKKworLyogd3JpdGVfYmJfZmlsZS5jICovCitleHRlcm4gZXJyY29kZV90IGV4dDJmc193cml0ZV9iYl9GSUxFKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmJfbGlzdCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJICAgICAgRklMRSAqZik7CisKKworLyogaW5saW5lIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfZ2V0X21lbSh1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKnB0cik7CitleHRlcm4gZXJyY29kZV90IGV4dDJmc19mcmVlX21lbSh2b2lkICpwdHIpOworZXh0ZXJuIGVycmNvZGVfdCBleHQyZnNfcmVzaXplX21lbSh1bnNpZ25lZCBsb25nIG9sZF9zaXplLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqcHRyKTsKK2V4dGVybiB2b2lkIGV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIGV4dDJmc19tYXJrX2NoYW5nZWQoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGludCBleHQyZnNfdGVzdF9jaGFuZ2VkKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIGV4dDJmc19tYXJrX3ZhbGlkKGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIGV4dDJmc191bm1hcmtfdmFsaWQoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGludCBleHQyZnNfdGVzdF92YWxpZChleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gdm9pZCBleHQyZnNfbWFya19pYl9kaXJ0eShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gdm9pZCBleHQyZnNfbWFya19iYl9kaXJ0eShleHQyX2ZpbHN5cyBmcyk7CitleHRlcm4gaW50IGV4dDJmc190ZXN0X2liX2RpcnR5KGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiBpbnQgZXh0MmZzX3Rlc3RfYmJfZGlydHkoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIGludCBleHQyZnNfZ3JvdXBfb2ZfYmxrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGspOworZXh0ZXJuIGludCBleHQyZnNfZ3JvdXBfb2ZfaW5vKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubyk7CitleHRlcm4gYmxrX3QgZXh0MmZzX2lub2RlX2RhdGFfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLAorCQkJCSAgICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmc1AuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyZnNQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwMmU5YQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyZnNQLmgKQEAgLTAsMCArMSw4NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZXh0MmZzUC5oIC0tLSBwcml2YXRlIGhlYWRlciBmaWxlIGZvciBleHQyIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIEJhZGJsb2NrcyBsaXN0CisgKi8KK3N0cnVjdCBleHQyX3N0cnVjdF91MzJfbGlzdCB7CisJaW50CW1hZ2ljOworCWludAludW07CisJaW50CXNpemU7CisJX191MzIJKmxpc3Q7CisJaW50CWJhZGJsb2Nrc19mbGFnczsKK307CisKK3N0cnVjdCBleHQyX3N0cnVjdF91MzJfaXRlcmF0ZSB7CisJaW50CQkJbWFnaWM7CisJZXh0Ml91MzJfbGlzdAkJYmI7CisJaW50CQkJcHRyOworfTsKKworCisvKgorICogRGlyZWN0b3J5IGJsb2NrIGl0ZXJhdG9yIGRlZmluaXRpb24KKyAqLworc3RydWN0IGV4dDJfc3RydWN0X2RibGlzdCB7CisJaW50CQkJbWFnaWM7CisJZXh0Ml9maWxzeXMJCWZzOworCWV4dDJfaW5vX3QJCXNpemU7CisJZXh0Ml9pbm9fdAkJY291bnQ7CisJaW50CQkJc29ydGVkOworCXN0cnVjdCBleHQyX2RiX2VudHJ5ICoJbGlzdDsKK307CisKKy8qCisgKiBGb3IgZGlyZWN0b3J5IGl0ZXJhdG9ycworICovCitzdHJ1Y3QgZGlyX2NvbnRleHQgeworCWV4dDJfaW5vX3QJCWRpcjsKKwlpbnQJCWZsYWdzOworCWNoYXIJCSpidWY7CisJaW50ICgqZnVuYykoZXh0Ml9pbm9fdAlkaXIsCisJCSAgICBpbnQJZW50cnksCisJCSAgICBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJICAgIGludAlvZmZzZXQsCisJCSAgICBpbnQJYmxvY2tzaXplLAorCQkgICAgY2hhcgkqYnVmLAorCQkgICAgdm9pZAkqcHJpdl9kYXRhKTsKKwl2b2lkCQkqcHJpdl9kYXRhOworCWVycmNvZGVfdAllcnJjb2RlOworfTsKKworLyoKKyAqIElub2RlIGNhY2hlIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZSB7CisJdm9pZCAqCQkJCWJ1ZmZlcjsKKwlibGtfdAkJCQlidWZmZXJfYmxrOworCWludAkJCQljYWNoZV9sYXN0OworCWludAkJCQljYWNoZV9zaXplOworCWludAkJCQlyZWZjb3VudDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZV9lbnQJKmNhY2hlOworfTsKKworc3RydWN0IGV4dDJfaW5vZGVfY2FjaGVfZW50IHsKKwlleHQyX2lub190CQlpbm87CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7Cit9OworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisKK2V4dGVybiBpbnQgZXh0MmZzX3Byb2Nlc3NfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzCQlmcywKKwkJCQkgICAgYmxrX3QJCSpibG9ja25yLAorCQkJCSAgICBlMl9ibGtjbnRfdAkJYmxvY2tjbnQsCisJCQkJICAgIGJsa190CQlyZWZfYmxvY2ssCisJCQkJICAgIGludAkJCXJlZl9vZmZzZXQsCisJCQkJICAgIHZvaWQJCSpwcml2X2RhdGEpOwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dDJmc19pbmxpbmUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyZnNfaW5saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzN2QyMwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHQyZnNfaW5saW5lLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGV4dDJmcy5oIC0tLSBleHQyZnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlICJleHQyZnMuaCIKKyNpbmNsdWRlICJiaXRvcHMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqICBBbGxvY2F0ZSBtZW1vcnkKKyAqLworZXJyY29kZV90IGV4dDJmc19nZXRfbWVtKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqcHRyKQoreworCXZvaWQgKipwcCA9ICh2b2lkICoqKXB0cjsKKworCSpwcCA9IG1hbGxvYyhzaXplKTsKKwlpZiAoISpwcCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fTUVNT1JZOworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBtZW1vcnkKKyAqLworZXJyY29kZV90IGV4dDJmc19mcmVlX21lbSh2b2lkICpwdHIpCit7CisJdm9pZCAqKnBwID0gKHZvaWQgKiopcHRyOworCisJZnJlZSgqcHApOworCSpwcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgUmVzaXplIG1lbW9yeQorICovCitlcnJjb2RlX3QgZXh0MmZzX3Jlc2l6ZV9tZW0odW5zaWduZWQgbG9uZyBFWFQyRlNfQVRUUigodW51c2VkKSkgb2xkX3NpemUsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKnB0cikKK3sKKwl2b2lkICpwOworCisJLyogVXNlICJtZW1jcHkiIGZvciBwb2ludGVyIGFzc2lnbm1lbnRzIGhlcmUgdG8gYXZvaWQgcHJvYmxlbXMKKwkgKiB3aXRoIEM5OSBzdHJpY3QgdHlwZSBhbGlhc2luZyBydWxlcy4gKi8KKwltZW1jcHkoJnAsIHB0ciwgc2l6ZW9mIChwKSk7CisJcCA9IHhyZWFsbG9jKHAsIHNpemUpOworCW1lbWNweShwdHIsICZwLCBzaXplb2YgKHApKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1hcmsgYSBmaWxlc3lzdGVtIHN1cGVyYmxvY2sgYXMgZGlydHkKKyAqLwordm9pZCBleHQyZnNfbWFya19zdXBlcl9kaXJ0eShleHQyX2ZpbHN5cyBmcykKK3sKKwlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX0RJUlRZIHwgRVhUMl9GTEFHX0NIQU5HRUQ7Cit9CisKKy8qCisgKiBNYXJrIGEgZmlsZXN5c3RlbSBhcyBjaGFuZ2VkCisgKi8KK3ZvaWQgZXh0MmZzX21hcmtfY2hhbmdlZChleHQyX2ZpbHN5cyBmcykKK3sKKwlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX0NIQU5HRUQ7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYSBmaWxlc3lzdGVtIGhhcyBjaGFuZ2VkCisgKi8KK2ludCBleHQyZnNfdGVzdF9jaGFuZ2VkKGV4dDJfZmlsc3lzIGZzKQoreworCXJldHVybiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0NIQU5HRUQpOworfQorCisvKgorICogTWFyayBhIGZpbGVzeXN0ZW0gYXMgdmFsaWQKKyAqLwordm9pZCBleHQyZnNfbWFya192YWxpZChleHQyX2ZpbHN5cyBmcykKK3sKKwlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX1ZBTElEOworfQorCisvKgorICogTWFyayBhIGZpbGVzeXN0ZW0gYXMgTk9UIHZhbGlkCisgKi8KK3ZvaWQgZXh0MmZzX3VubWFya192YWxpZChleHQyX2ZpbHN5cyBmcykKK3sKKwlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19WQUxJRDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGZpbGVzeXN0ZW0gaXMgdmFsaWQKKyAqLworaW50IGV4dDJmc190ZXN0X3ZhbGlkKGV4dDJfZmlsc3lzIGZzKQoreworCXJldHVybiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1ZBTElEKTsKK30KKworLyoKKyAqIE1hcmsgdGhlIGlub2RlIGJpdG1hcCBhcyBkaXJ0eQorICovCit2b2lkIGV4dDJmc19tYXJrX2liX2RpcnR5KGV4dDJfZmlsc3lzIGZzKQoreworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfSUJfRElSVFkgfCBFWFQyX0ZMQUdfQ0hBTkdFRDsKK30KKworLyoKKyAqIE1hcmsgdGhlIGJsb2NrIGJpdG1hcCBhcyBkaXJ0eQorICovCit2b2lkIGV4dDJmc19tYXJrX2JiX2RpcnR5KGV4dDJfZmlsc3lzIGZzKQoreworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfQkJfRElSVFkgfCBFWFQyX0ZMQUdfQ0hBTkdFRDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGZpbGVzeXN0ZW0ncyBpbm9kZSBiaXRtYXAgaXMgZGlydHkKKyAqLworaW50IGV4dDJmc190ZXN0X2liX2RpcnR5KGV4dDJfZmlsc3lzIGZzKQoreworCXJldHVybiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0lCX0RJUlRZKTsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGZpbGVzeXN0ZW0ncyBibG9jayBiaXRtYXAgaXMgZGlydHkKKyAqLworaW50IGV4dDJmc190ZXN0X2JiX2RpcnR5KGV4dDJfZmlsc3lzIGZzKQoreworCXJldHVybiAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0JCX0RJUlRZKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgZ3JvdXAgIyBvZiBhIGJsb2NrCisgKi8KK2ludCBleHQyZnNfZ3JvdXBfb2ZfYmxrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGspCit7CisJcmV0dXJuIChibGsgLSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgLworCQlmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgZ3JvdXAgIyBvZiBhbiBpbm9kZSBudW1iZXIKKyAqLworaW50IGV4dDJmc19ncm91cF9vZl9pbm8oZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vKQoreworCXJldHVybiAoaW5vIC0gMSkgLyBmcy0+c3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cDsKK30KKworYmxrX3QgZXh0MmZzX2lub2RlX2RhdGFfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLAorCQkJCQlzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGlub2RlLT5pX2Jsb2NrcyAtCisJCShpbm9kZS0+aV9maWxlX2FjbCA/IGZzLT5ibG9ja3NpemUgPj4gOSA6IDApOworfQorCisKKworCisKKworCisKKworX191MTYgZXh0MmZzX3N3YWIxNihfX3UxNiB2YWwpCit7CisJcmV0dXJuICh2YWwgPj4gOCkgfCAodmFsIDw8IDgpOworfQorCitfX3UzMiBleHQyZnNfc3dhYjMyKF9fdTMyIHZhbCkKK3sKKwlyZXR1cm4gKCh2YWw+PjI0KSB8ICgodmFsPj44KSYweEZGMDApIHwKKwkJKCh2YWw8PDgpJjB4RkYwMDAwKSB8ICh2YWw8PDI0KSk7Cit9CisKK2ludCBleHQyZnNfdGVzdF9nZW5lcmljX2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJCQlibGtfdCBiaXRubyk7CisKK2ludCBleHQyZnNfdGVzdF9nZW5lcmljX2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJCQlibGtfdCBiaXRubykKK3sKKwlpZiAoKGJpdG5vIDwgYml0bWFwLT5zdGFydCkgfHwgKGJpdG5vID4gYml0bWFwLT5lbmQpKSB7CisJCWV4dDJmc193YXJuX2JpdG1hcDIoYml0bWFwLCBFWFQyRlNfVEVTVF9FUlJPUiwgYml0bm8pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV4dDJmc190ZXN0X2JpdChiaXRubyAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKworaW50IGV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkgICAgICAgYmxrX3QgYmxvY2spCit7CisJcmV0dXJuIGV4dDJmc19tYXJrX2dlbmVyaWNfYml0bWFwKChleHQyZnNfZ2VuZXJpY19iaXRtYXApCisJCQkJICAgICAgIGJpdG1hcCwKKwkJCQkJICBibG9jayk7Cit9CisKK2ludCBleHQyZnNfdW5tYXJrX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJIGJsa190IGJsb2NrKQoreworCXJldHVybiBleHQyZnNfdW5tYXJrX2dlbmVyaWNfYml0bWFwKChleHQyZnNfZ2VuZXJpY19iaXRtYXApIGJpdG1hcCwKKwkJCQkJICAgIGJsb2NrKTsKK30KKworaW50IGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkgICAgICAgYmxrX3QgYmxvY2spCit7CisJcmV0dXJuIGV4dDJmc190ZXN0X2dlbmVyaWNfYml0bWFwKChleHQyZnNfZ2VuZXJpY19iaXRtYXApIGJpdG1hcCwKKwkJCQkJICBibG9jayk7Cit9CisKK2ludCBleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJICAgICAgIGV4dDJfaW5vX3QgaW5vZGUpCit7CisJcmV0dXJuIGV4dDJmc19tYXJrX2dlbmVyaWNfYml0bWFwKChleHQyZnNfZ2VuZXJpY19iaXRtYXApIGJpdG1hcCwKKwkJCQkJICBpbm9kZSk7Cit9CisKK2ludCBleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJIGV4dDJfaW5vX3QgaW5vZGUpCit7CisJcmV0dXJuIGV4dDJmc191bm1hcmtfZ2VuZXJpY19iaXRtYXAoKGV4dDJmc19nZW5lcmljX2JpdG1hcCkgYml0bWFwLAorCQkJCSAgICAgaW5vZGUpOworfQorCitpbnQgZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwLAorCQkJCSAgICAgICBleHQyX2lub190IGlub2RlKQoreworCXJldHVybiBleHQyZnNfdGVzdF9nZW5lcmljX2JpdG1hcCgoZXh0MmZzX2dlbmVyaWNfYml0bWFwKSBiaXRtYXAsCisJCQkJCSAgaW5vZGUpOworfQorCit2b2lkIGV4dDJmc19mYXN0X21hcmtfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgYmxrX3QgYmxvY2spCit7CisJZXh0MmZzX3NldF9iaXQoYmxvY2sgLSBiaXRtYXAtPnN0YXJ0LCBiaXRtYXAtPmJpdG1hcCk7Cit9CisKK3ZvaWQgZXh0MmZzX2Zhc3RfdW5tYXJrX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICAgYmxrX3QgYmxvY2spCit7CisJZXh0MmZzX2NsZWFyX2JpdChibG9jayAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKworaW50IGV4dDJmc19mYXN0X3Rlc3RfYmxvY2tfYml0bWFwKGV4dDJmc19ibG9ja19iaXRtYXAgYml0bWFwLAorCQkJCQkgICAgYmxrX3QgYmxvY2spCit7CisJcmV0dXJuIGV4dDJmc190ZXN0X2JpdChibG9jayAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfZmFzdF9tYXJrX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgIGV4dDJfaW5vX3QgaW5vZGUpCit7CisJZXh0MmZzX3NldF9iaXQoaW5vZGUgLSBiaXRtYXAtPnN0YXJ0LCBiaXRtYXAtPmJpdG1hcCk7Cit9CisKK3ZvaWQgZXh0MmZzX2Zhc3RfdW5tYXJrX2lub2RlX2JpdG1hcChleHQyZnNfaW5vZGVfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICAgZXh0Ml9pbm9fdCBpbm9kZSkKK3sKKwlleHQyZnNfY2xlYXJfYml0KGlub2RlIC0gYml0bWFwLT5zdGFydCwgYml0bWFwLT5iaXRtYXApOworfQorCitpbnQgZXh0MmZzX2Zhc3RfdGVzdF9pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgIGV4dDJfaW5vX3QgaW5vZGUpCit7CisJcmV0dXJuIGV4dDJmc190ZXN0X2JpdChpbm9kZSAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKworYmxrX3QgZXh0MmZzX2dldF9ibG9ja19iaXRtYXBfc3RhcnQoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXApCit7CisJcmV0dXJuIGJpdG1hcC0+c3RhcnQ7Cit9CisKK2V4dDJfaW5vX3QgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfc3RhcnQoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApCit7CisJcmV0dXJuIGJpdG1hcC0+c3RhcnQ7Cit9CisKK2Jsa190IGV4dDJmc19nZXRfYmxvY2tfYml0bWFwX2VuZChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCkKK3sKKwlyZXR1cm4gYml0bWFwLT5lbmQ7Cit9CisKK2V4dDJfaW5vX3QgZXh0MmZzX2dldF9pbm9kZV9iaXRtYXBfZW5kKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKQoreworCXJldHVybiBiaXRtYXAtPmVuZDsKK30KKworaW50IGV4dDJmc190ZXN0X2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgIGJsa190IGJsb2NrLCBpbnQgbnVtKQoreworCWludAlpOworCisJaWYgKChibG9jayA8IGJpdG1hcC0+c3RhcnQpIHx8IChibG9jaytudW0tMSA+IGJpdG1hcC0+ZW5kKSkgeworCQlleHQyZnNfd2Fybl9iaXRtYXAoRVhUMl9FVF9CQURfQkxPQ0tfVEVTVCwKKwkJCQkgICBibG9jaywgYml0bWFwLT5kZXNjcmlwdGlvbik7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGk9MDsgaSA8IG51bTsgaSsrKSB7CisJCWlmIChleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChiaXRtYXAsIGJsb2NrK2kpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQgZXh0MmZzX2Zhc3RfdGVzdF9ibG9ja19iaXRtYXBfcmFuZ2UoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCQkgYmxrX3QgYmxvY2ssIGludCBudW0pCit7CisJaW50CWk7CisKKwlmb3IgKGk9MDsgaSA8IG51bTsgaSsrKSB7CisJCWlmIChleHQyZnNfZmFzdF90ZXN0X2Jsb2NrX2JpdG1hcChiaXRtYXAsIGJsb2NrK2kpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIGV4dDJmc19tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgICBibGtfdCBibG9jaywgaW50IG51bSkKK3sKKwlpbnQJaTsKKworCWlmICgoYmxvY2sgPCBiaXRtYXAtPnN0YXJ0KSB8fCAoYmxvY2srbnVtLTEgPiBiaXRtYXAtPmVuZCkpIHsKKwkJZXh0MmZzX3dhcm5fYml0bWFwKEVYVDJfRVRfQkFEX0JMT0NLX01BUkssIGJsb2NrLAorCQkJCSAgIGJpdG1hcC0+ZGVzY3JpcHRpb24pOworCQlyZXR1cm47CisJfQorCWZvciAoaT0wOyBpIDwgbnVtOyBpKyspCisJCWV4dDJmc19zZXRfYml0KGJsb2NrICsgaSAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfZmFzdF9tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJCSAgYmxrX3QgYmxvY2ssIGludCBudW0pCit7CisJaW50CWk7CisKKwlmb3IgKGk9MDsgaSA8IG51bTsgaSsrKQorCQlleHQyZnNfc2V0X2JpdChibG9jayArIGkgLSBiaXRtYXAtPnN0YXJ0LCBiaXRtYXAtPmJpdG1hcCk7Cit9CisKK3ZvaWQgZXh0MmZzX3VubWFya19ibG9ja19iaXRtYXBfcmFuZ2UoZXh0MmZzX2Jsb2NrX2JpdG1hcCBiaXRtYXAsCisJCQkJCSAgICAgICBibGtfdCBibG9jaywgaW50IG51bSkKK3sKKwlpbnQJaTsKKworCWlmICgoYmxvY2sgPCBiaXRtYXAtPnN0YXJ0KSB8fCAoYmxvY2srbnVtLTEgPiBiaXRtYXAtPmVuZCkpIHsKKwkJZXh0MmZzX3dhcm5fYml0bWFwKEVYVDJfRVRfQkFEX0JMT0NLX1VOTUFSSywgYmxvY2ssCisJCQkJICAgYml0bWFwLT5kZXNjcmlwdGlvbik7CisJCXJldHVybjsKKwl9CisJZm9yIChpPTA7IGkgPCBudW07IGkrKykKKwkJZXh0MmZzX2NsZWFyX2JpdChibG9jayArIGkgLSBiaXRtYXAtPnN0YXJ0LCBiaXRtYXAtPmJpdG1hcCk7Cit9CisKK3ZvaWQgZXh0MmZzX2Zhc3RfdW5tYXJrX2Jsb2NrX2JpdG1hcF9yYW5nZShleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCwKKwkJCQkJCSAgICBibGtfdCBibG9jaywgaW50IG51bSkKK3sKKwlpbnQJaTsKKwlmb3IgKGk9MDsgaSA8IG51bTsgaSsrKQorCQlleHQyZnNfY2xlYXJfYml0KGJsb2NrICsgaSAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHRfYXR0ci5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2V4dF9hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiYTEyZAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9leHRfYXR0ci5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBleHRfYXR0ci5jIC0tLSBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyX2V4dF9hdHRyLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9leHRfYXR0cihleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxvY2ssIHZvaWQgKmJ1ZikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsb2NrLCAxLCBidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisjaWYgQkJfQklHX0VORElBTgorCWlmICgoZnMtPmZsYWdzICYgKEVYVDJfRkxBR19TV0FQX0JZVEVTfAorCQkJICBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkgIT0gMCkKKwkJZXh0MmZzX3N3YXBfZXh0X2F0dHIoYnVmLCBidWYsIGZzLT5ibG9ja3NpemUsIDEpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfZXh0X2F0dHIoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsb2NrLCB2b2lkICppbmJ1ZikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWNoYXIJCSp3cml0ZV9idWY7CisJY2hhcgkJKmJ1ZiA9IE5VTEw7CisKKwlpZiAoQkJfQklHX0VORElBTiAmJiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKSkgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXdyaXRlX2J1ZiA9IGJ1ZjsKKwkJZXh0MmZzX3N3YXBfZXh0X2F0dHIoYnVmLCBpbmJ1ZiwgZnMtPmJsb2Nrc2l6ZSwgMSk7CisJfSBlbHNlCisJCXdyaXRlX2J1ZiA9IChjaGFyICopIGluYnVmOworCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxvY2ssIDEsIHdyaXRlX2J1Zik7CisJaWYgKGJ1ZikKKwkJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCWlmICghcmV0dmFsKQorCQlleHQyZnNfbWFya19jaGFuZ2VkKGZzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhZGp1c3RzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIEVBIGJsb2NrLgorICovCitlcnJjb2RlX3QgZXh0MmZzX2FkanVzdF9lYV9yZWZjb3VudChleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLAorCQkJCSAgICBjaGFyICpibG9ja19idWYsIGludCBhZGp1c3QsCisJCQkJICAgIF9fdTMyICpuZXdjb3VudCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCBleHQyX2V4dF9hdHRyX2hlYWRlciAqaGVhZGVyOworCWNoYXIJKmJ1ZiA9IE5VTEw7CisKKwlpZiAoKGJsayA+PSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KSB8fAorCSAgICAoYmxrIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spKQorCQlyZXR1cm4gRVhUMl9FVF9CQURfRUFfQkxPQ0tfTlVNOworCisJaWYgKCFibG9ja19idWYpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlibG9ja19idWYgPSBidWY7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfZXh0X2F0dHIoZnMsIGJsaywgYmxvY2tfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworCWhlYWRlciA9IChzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgKikgYmxvY2tfYnVmOworCWhlYWRlci0+aF9yZWZjb3VudCArPSBhZGp1c3Q7CisJaWYgKG5ld2NvdW50KQorCQkqbmV3Y291bnQgPSBoZWFkZXItPmhfcmVmY291bnQ7CisKKwlyZXR2YWwgPSBleHQyZnNfd3JpdGVfZXh0X2F0dHIoZnMsIGJsaywgYmxvY2tfYnVmKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKworZXJyb3V0OgorCWlmIChidWYpCisJCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ZpbGVpby5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ZpbGVpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNWFkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmlsZWlvLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZpbGVpby5jIC0tLSBTaW1wbGUgZmlsZSBJL08gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgZXh0Ml9maWxlIHsKKwllcnJjb2RlX3QJCW1hZ2ljOworCWV4dDJfZmlsc3lzCQlmczsKKwlleHQyX2lub190CQlpbm87CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7CisJaW50CQkJZmxhZ3M7CisJX191NjQJCQlwb3M7CisJYmxrX3QJCQlibG9ja25vOworCWJsa190CQkJcGh5c2Jsb2NrOworCWNoYXIJCQkqYnVmOworfTsKKworI2RlZmluZSBCTUFQX0JVRkZFUiAoZmlsZS0+YnVmICsgZnMtPmJsb2Nrc2l6ZSkKKworZXJyY29kZV90IGV4dDJmc19maWxlX29wZW4yKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsCisJCQkgICAgaW50IGZsYWdzLCBleHQyX2ZpbGVfdCAqcmV0KQoreworCWV4dDJfZmlsZV90CWZpbGU7CisJZXJyY29kZV90CXJldHZhbDsKKworCS8qCisJICogRG9uJ3QgbGV0IGNhbGxlciBjcmVhdGUgb3Igb3BlbiBhIGZpbGUgZm9yIHdyaXRpbmcgaWYgdGhlCisJICogZmlsZXN5c3RlbSBpcyByZWFkLW9ubHkuCisJICovCisJaWYgKChmbGFncyAmIChFWFQyX0ZJTEVfV1JJVEUgfCBFWFQyX0ZJTEVfQ1JFQVRFKSkgJiYKKwkgICAgIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfUlcpKQorCQlyZXR1cm4gRVhUMl9FVF9ST19GSUxTWVM7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfZmlsZSksICZmaWxlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJbWVtc2V0KGZpbGUsIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9maWxlKSk7CisJZmlsZS0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0VYVDJfRklMRTsKKwlmaWxlLT5mcyA9IGZzOworCWZpbGUtPmlubyA9IGlubzsKKwlmaWxlLT5mbGFncyA9IGZsYWdzICYgRVhUMl9GSUxFX01BU0s7CisKKwlpZiAoaW5vZGUpIHsKKwkJbWVtY3B5KCZmaWxlLT5pbm9kZSwgaW5vZGUsIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBpbm8sICZmaWxlLT5pbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSAqIDMsICZmaWxlLT5idWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbDsKKworCSpyZXQgPSBmaWxlOworCXJldHVybiAwOworCitmYWlsOgorCWV4dDJmc19mcmVlX21lbSgmZmlsZS0+YnVmKTsKKwlleHQyZnNfZnJlZV9tZW0oJmZpbGUpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZmlsZV9vcGVuKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCSAgIGludCBmbGFncywgZXh0Ml9maWxlX3QgKnJldCkKK3sKKwlyZXR1cm4gZXh0MmZzX2ZpbGVfb3BlbjIoZnMsIGlubywgTlVMTCwgZmxhZ3MsIHJldCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpbGVzeXN0ZW0gaGFuZGxlIG9mIGEgZmlsZSBmcm9tIHRoZSBzdHJ1Y3R1cmUKKyAqLworZXh0Ml9maWxzeXMgZXh0MmZzX2ZpbGVfZ2V0X2ZzKGV4dDJfZmlsZV90IGZpbGUpCit7CisJaWYgKGZpbGUtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZmlsZS0+ZnM7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgdGhlIGRpcnR5IGJsb2NrIGJ1ZmZlciBvdXQgdG8gZGlzayBpZgorICogbmVjZXNzYXJ5LgorICovCitlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfZmx1c2goZXh0Ml9maWxlX3QgZmlsZSkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWV4dDJfZmlsc3lzIGZzOworCisJRVhUMl9DSEVDS19NQUdJQyhmaWxlLCBFWFQyX0VUX01BR0lDX0VYVDJfRklMRSk7CisJZnMgPSBmaWxlLT5mczsKKworCWlmICghKGZpbGUtPmZsYWdzICYgRVhUMl9GSUxFX0JVRl9WQUxJRCkgfHwKKwkgICAgIShmaWxlLT5mbGFncyAmIEVYVDJfRklMRV9CVUZfRElSVFkpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogT0ssIHRoZSBwaHlzaWNhbCBibG9jayBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LgorCSAqIEFsbG9jYXRlIGl0LgorCSAqLworCWlmICghZmlsZS0+cGh5c2Jsb2NrKSB7CisJCXJldHZhbCA9IGV4dDJmc19ibWFwKGZzLCBmaWxlLT5pbm8sICZmaWxlLT5pbm9kZSwKKwkJCQkgICAgIEJNQVBfQlVGRkVSLCBmaWxlLT5pbm8gPyBCTUFQX0FMTE9DIDogMCwKKwkJCQkgICAgIGZpbGUtPmJsb2Nrbm8sICZmaWxlLT5waHlzYmxvY2spOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGZpbGUtPnBoeXNibG9jaywKKwkJCQkgICAgICAxLCBmaWxlLT5idWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlmaWxlLT5mbGFncyAmPSB+RVhUMl9GSUxFX0JVRl9ESVJUWTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHN5bmNocm9uaXplcyB0aGUgZmlsZSdzIGJsb2NrIGJ1ZmZlciBhbmQgdGhlIGN1cnJlbnQKKyAqIGZpbGUgcG9zaXRpb24sIHBvc3NpYmx5IGludmFsaWRhdGluZyBibG9jayBidWZmZXIgaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBlcnJjb2RlX3Qgc3luY19idWZmZXJfcG9zaXRpb24oZXh0Ml9maWxlX3QgZmlsZSkKK3sKKwlibGtfdAliOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwliID0gZmlsZS0+cG9zIC8gZmlsZS0+ZnMtPmJsb2Nrc2l6ZTsKKwlpZiAoYiAhPSBmaWxlLT5ibG9ja25vKSB7CisJCXJldHZhbCA9IGV4dDJmc19maWxlX2ZsdXNoKGZpbGUpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJZmlsZS0+ZmxhZ3MgJj0gfkVYVDJfRklMRV9CVUZfVkFMSUQ7CisJfQorCWZpbGUtPmJsb2Nrbm8gPSBiOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgZmlsZSdzIGJsb2NrIGJ1ZmZlciB3aXRoIHZhbGlkIGRhdGEgZnJvbQorICogdGhlIGRpc2sgYXMgbmVjZXNzYXJ5LgorICoKKyAqIElmIGRvbnRmaWxsIGlzIHRydWUsIHRoZW4gc2tpcCBpbml0aWFsaXppbmcgdGhlIGJ1ZmZlciBzaW5jZSB3ZSdyZQorICogZ29pbmcgdG8gYmUgcmVwbGFjaW5nIGl0cyBlbnRpcmUgY29udGVudHMgYW55d2F5LiAgSWYgc2V0LCB0aGVuIHRoZQorICogZnVuY3Rpb24gYmFzaWNhbGx5IG9ubHkgc2V0cyBmaWxlLT5waHlzYmxvY2sgYW5kIEVYVDJfRklMRV9CVUZfVkFMSUQKKyAqLworI2RlZmluZSBET05URklMTCAxCitzdGF0aWMgZXJyY29kZV90IGxvYWRfYnVmZmVyKGV4dDJfZmlsZV90IGZpbGUsIGludCBkb250ZmlsbCkKK3sKKwlleHQyX2ZpbHN5cwlmcyA9IGZpbGUtPmZzOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlpZiAoIShmaWxlLT5mbGFncyAmIEVYVDJfRklMRV9CVUZfVkFMSUQpKSB7CisJCXJldHZhbCA9IGV4dDJmc19ibWFwKGZzLCBmaWxlLT5pbm8sICZmaWxlLT5pbm9kZSwKKwkJCQkgICAgIEJNQVBfQlVGRkVSLCAwLCBmaWxlLT5ibG9ja25vLAorCQkJCSAgICAgJmZpbGUtPnBoeXNibG9jayk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAoIWRvbnRmaWxsKSB7CisJCQlpZiAoZmlsZS0+cGh5c2Jsb2NrKSB7CisJCQkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sCisJCQkJCQkJICAgICBmaWxlLT5waHlzYmxvY2ssCisJCQkJCQkJICAgICAxLCBmaWxlLT5idWYpOworCQkJCWlmIChyZXR2YWwpCisJCQkJCXJldHVybiByZXR2YWw7CisJCQl9IGVsc2UKKwkJCQltZW1zZXQoZmlsZS0+YnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwkJfQorCQlmaWxlLT5mbGFncyB8PSBFWFQyX0ZJTEVfQlVGX1ZBTElEOworCX0KKwlyZXR1cm4gMDsKK30KKworCitlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfY2xvc2UoZXh0Ml9maWxlX3QgZmlsZSkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmaWxlLCBFWFQyX0VUX01BR0lDX0VYVDJfRklMRSk7CisKKwlyZXR2YWwgPSBleHQyZnNfZmlsZV9mbHVzaChmaWxlKTsKKworCWV4dDJmc19mcmVlX21lbSgmZmlsZS0+YnVmKTsKKwlleHQyZnNfZnJlZV9tZW0oJmZpbGUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitlcnJjb2RlX3QgZXh0MmZzX2ZpbGVfcmVhZChleHQyX2ZpbGVfdCBmaWxlLCB2b2lkICpidWYsCisJCQkgICB1bnNpZ25lZCBpbnQgd2FudGVkLCB1bnNpZ25lZCBpbnQgKmdvdCkKK3sKKwlleHQyX2ZpbHN5cwlmczsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBpbnQJc3RhcnQsIGMsIGNvdW50ID0gMDsKKwlfX3U2NAkJbGVmdDsKKwljaGFyCQkqcHRyID0gKGNoYXIgKikgYnVmOworCisJRVhUMl9DSEVDS19NQUdJQyhmaWxlLCBFWFQyX0VUX01BR0lDX0VYVDJfRklMRSk7CisJZnMgPSBmaWxlLT5mczsKKworCXdoaWxlICgoZmlsZS0+cG9zIDwgRVhUMl9JX1NJWkUoJmZpbGUtPmlub2RlKSkgJiYgKHdhbnRlZCA+IDApKSB7CisJCXJldHZhbCA9IHN5bmNfYnVmZmVyX3Bvc2l0aW9uKGZpbGUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBmYWlsOworCQlyZXR2YWwgPSBsb2FkX2J1ZmZlcihmaWxlLCAwKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZmFpbDsKKworCQlzdGFydCA9IGZpbGUtPnBvcyAlIGZzLT5ibG9ja3NpemU7CisJCWMgPSBmcy0+YmxvY2tzaXplIC0gc3RhcnQ7CisJCWlmIChjID4gd2FudGVkKQorCQkJYyA9IHdhbnRlZDsKKwkJbGVmdCA9IEVYVDJfSV9TSVpFKCZmaWxlLT5pbm9kZSkgLSBmaWxlLT5wb3M7CisJCWlmIChjID4gbGVmdCkKKwkJCWMgPSBsZWZ0OworCisJCW1lbWNweShwdHIsIGZpbGUtPmJ1ZitzdGFydCwgYyk7CisJCWZpbGUtPnBvcyArPSBjOworCQlwdHIgKz0gYzsKKwkJY291bnQgKz0gYzsKKwkJd2FudGVkIC09IGM7CisJfQorCitmYWlsOgorCWlmIChnb3QpCisJCSpnb3QgPSBjb3VudDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2VycmNvZGVfdCBleHQyZnNfZmlsZV93cml0ZShleHQyX2ZpbGVfdCBmaWxlLCBjb25zdCB2b2lkICpidWYsCisJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdW5zaWduZWQgaW50ICp3cml0dGVuKQoreworCWV4dDJfZmlsc3lzCWZzOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCXVuc2lnbmVkIGludAlzdGFydCwgYywgY291bnQgPSAwOworCWNvbnN0IGNoYXIJKnB0ciA9IChjb25zdCBjaGFyICopIGJ1ZjsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZmlsZSwgRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEUpOworCWZzID0gZmlsZS0+ZnM7CisKKwlpZiAoIShmaWxlLT5mbGFncyAmIEVYVDJfRklMRV9XUklURSkpCisJCXJldHVybiBFWFQyX0VUX0ZJTEVfUk87CisKKwl3aGlsZSAobmJ5dGVzID4gMCkgeworCQlyZXR2YWwgPSBzeW5jX2J1ZmZlcl9wb3NpdGlvbihmaWxlKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZmFpbDsKKworCQlzdGFydCA9IGZpbGUtPnBvcyAlIGZzLT5ibG9ja3NpemU7CisJCWMgPSBmcy0+YmxvY2tzaXplIC0gc3RhcnQ7CisJCWlmIChjID4gbmJ5dGVzKQorCQkJYyA9IG5ieXRlczsKKworCQkvKgorCQkgKiBXZSBvbmx5IG5lZWQgdG8gZG8gYSByZWFkLW1vZGlmeS11cGRhdGUgY3ljbGUgaWYKKwkJICogd2UncmUgZG9pbmcgYSBwYXJ0aWFsIHdyaXRlLgorCQkgKi8KKwkJcmV0dmFsID0gbG9hZF9idWZmZXIoZmlsZSwgKGMgPT0gZnMtPmJsb2Nrc2l6ZSkpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBmYWlsOworCisJCWZpbGUtPmZsYWdzIHw9IEVYVDJfRklMRV9CVUZfRElSVFk7CisJCW1lbWNweShmaWxlLT5idWYrc3RhcnQsIHB0ciwgYyk7CisJCWZpbGUtPnBvcyArPSBjOworCQlwdHIgKz0gYzsKKwkJY291bnQgKz0gYzsKKwkJbmJ5dGVzIC09IGM7CisJfQorCitmYWlsOgorCWlmICh3cml0dGVuKQorCQkqd3JpdHRlbiA9IGNvdW50OworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZmlsZV9sbHNlZWsoZXh0Ml9maWxlX3QgZmlsZSwgX191NjQgb2Zmc2V0LAorCQkJICAgIGludCB3aGVuY2UsIF9fdTY0ICpyZXRfcG9zKQoreworCUVYVDJfQ0hFQ0tfTUFHSUMoZmlsZSwgRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEUpOworCisJaWYgKHdoZW5jZSA9PSBFWFQyX1NFRUtfU0VUKQorCQlmaWxlLT5wb3MgPSBvZmZzZXQ7CisJZWxzZSBpZiAod2hlbmNlID09IEVYVDJfU0VFS19DVVIpCisJCWZpbGUtPnBvcyArPSBvZmZzZXQ7CisJZWxzZSBpZiAod2hlbmNlID09IEVYVDJfU0VFS19FTkQpCisJCWZpbGUtPnBvcyA9IEVYVDJfSV9TSVpFKCZmaWxlLT5pbm9kZSkgKyBvZmZzZXQ7CisJZWxzZQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJaWYgKHJldF9wb3MpCisJCSpyZXRfcG9zID0gZmlsZS0+cG9zOworCisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfZmlsZV9sc2VlayhleHQyX2ZpbGVfdCBmaWxlLCBleHQyX29mZl90IG9mZnNldCwKKwkJCSAgICBpbnQgd2hlbmNlLCBleHQyX29mZl90ICpyZXRfcG9zKQoreworCV9fdTY0CQlsb2Zmc2V0LCByZXRfbG9mZnNldDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJbG9mZnNldCA9IG9mZnNldDsKKwlyZXR2YWwgPSBleHQyZnNfZmlsZV9sbHNlZWsoZmlsZSwgbG9mZnNldCwgd2hlbmNlLCAmcmV0X2xvZmZzZXQpOworCWlmIChyZXRfcG9zKQorCQkqcmV0X3BvcyA9IChleHQyX29mZl90KSByZXRfbG9mZnNldDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpbGUsIGFjY29yZGluZyB0byB0aGUgaW5vZGUKKyAqLworZXJyY29kZV90IGV4dDJmc19maWxlX2dldF9sc2l6ZShleHQyX2ZpbGVfdCBmaWxlLCBfX3U2NCAqcmV0X3NpemUpCit7CisJaWYgKGZpbGUtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfRVhUMl9GSUxFKQorCQlyZXR1cm4gRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEU7CisJKnJldF9zaXplID0gRVhUMl9JX1NJWkUoJmZpbGUtPmlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgYWNjb3JkaW5nIHRvIHRoZSBpbm9kZQorICovCitleHQyX29mZl90IGV4dDJmc19maWxlX2dldF9zaXplKGV4dDJfZmlsZV90IGZpbGUpCit7CisJX191NjQJc2l6ZTsKKworCWlmIChleHQyZnNfZmlsZV9nZXRfbHNpemUoZmlsZSwgJnNpemUpKQorCQlyZXR1cm4gMDsKKwlpZiAoKHNpemUgPj4gMzIpICE9IDApCisJCXJldHVybiAwOworCXJldHVybiBzaXplOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzaXplIG9mIHRoZSBmaWxlLCB0cnVuY2F0aW5nIGl0IGlmIG5lY2Vzc2FyeQorICoKKyAqIFhYWCBzdGlsbCBuZWVkIHRvIGNhbGwgdHJ1bmNhdGUKKyAqLworZXJyY29kZV90IGV4dDJmc19maWxlX3NldF9zaXplKGV4dDJfZmlsZV90IGZpbGUsIGV4dDJfb2ZmX3Qgc2l6ZSkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCUVYVDJfQ0hFQ0tfTUFHSUMoZmlsZSwgRVhUMl9FVF9NQUdJQ19FWFQyX0ZJTEUpOworCisJZmlsZS0+aW5vZGUuaV9zaXplID0gc2l6ZTsKKwlmaWxlLT5pbm9kZS5pX3NpemVfaGlnaCA9IDA7CisJaWYgKGZpbGUtPmlubykgeworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZmlsZS0+ZnMsIGZpbGUtPmlubywgJmZpbGUtPmlub2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJLyoKKwkgKiBYWFggdHJ1bmNhdGUgaW5vZGUgaWYgbmVjZXNzYXJ5CisJICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9maW5kZGV2LmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmluZGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTgzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmluZGRldi5jCkBAIC0wLDAgKzEsMTk5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmaW5kZGV2LmMgLS0gdGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIGZpbmQgYSBwYXJ0aWN1bGFyIGRldmljZSBpbgorICoJL2RldgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19NS0RFVl9ICisjaW5jbHVkZSA8c3lzL21rZGV2Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IGRpcl9saXN0IHsKKwljaGFyCSpuYW1lOworCXN0cnVjdCBkaXJfbGlzdCAqbmV4dDsKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gZW50cnkgdG8gdGhlIGRpcmVjdG9yeSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGFkZF90b19kaXJsaXN0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkaXJfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGRpcl9saXN0ICpkcDsKKworCWRwID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGRpcl9saXN0KSk7CisJZHAtPm5hbWUgPSB4bWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKwlzdHJjcHkoZHAtPm5hbWUsIG5hbWUpOworCWRwLT5uZXh0ID0gKmxpc3Q7CisJKmxpc3QgPSBkcDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYSBkaXJlY3RvcnkgbGlzdAorICovCitzdGF0aWMgdm9pZCBmcmVlX2Rpcmxpc3Qoc3RydWN0IGRpcl9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZGlyX2xpc3QgKmRwLCAqbmV4dDsKKworCWZvciAoZHAgPSAqbGlzdDsgZHA7IGRwID0gbmV4dCkgeworCQluZXh0ID0gZHAtPm5leHQ7CisJCWZyZWUoZHAtPm5hbWUpOworCQlmcmVlKGRwKTsKKwl9CisJKmxpc3QgPSAwOworfQorCitzdGF0aWMgaW50IHNjYW5fZGlyKGNoYXIgKmRpcl9uYW1lLCBkZXZfdCBkZXZpY2UsIHN0cnVjdCBkaXJfbGlzdCAqKmxpc3QsCisJCSAgICBjaGFyICoqcmV0X3BhdGgpCit7CisJRElSCSpkaXI7CisJc3RydWN0IGRpcmVudCAqZHA7CisJY2hhcglwYXRoWzEwMjRdLCAqY3A7CisJaW50CWRpcmxlbjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWRpcmxlbiA9IHN0cmxlbihkaXJfbmFtZSk7CisJaWYgKChkaXIgPSBvcGVuZGlyKGRpcl9uYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuIGVycm5vOworCWRwID0gcmVhZGRpcihkaXIpOworCXdoaWxlIChkcCkgeworCQlpZiAoZGlybGVuICsgc3RybGVuKGRwLT5kX25hbWUpICsgMiA+PSBzaXplb2YocGF0aCkpCisJCQlnb3RvIHNraXBfdG9fbmV4dDsKKwkJaWYgKGRwLT5kX25hbWVbMF0gPT0gJy4nICYmCisJCSAgICAoKGRwLT5kX25hbWVbMV0gPT0gMCkgfHwKKwkJICAgICAoKGRwLT5kX25hbWVbMV0gPT0gJy4nKSAmJiAoZHAtPmRfbmFtZVsyXSA9PSAwKSkpKQorCQkJZ290byBza2lwX3RvX25leHQ7CisJCXNwcmludGYocGF0aCwgIiVzLyVzIiwgZGlyX25hbWUsIGRwLT5kX25hbWUpOworCQlpZiAoc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJCWdvdG8gc2tpcF90b19uZXh0OworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCWFkZF90b19kaXJsaXN0KHBhdGgsIGxpc3QpOworCQlpZiAoU19JU0JMSyhzdC5zdF9tb2RlKSAmJiBzdC5zdF9yZGV2ID09IGRldmljZSkgeworCQkJY3AgPSB4bWFsbG9jKHN0cmxlbihwYXRoKSsxKTsKKwkJCXN0cmNweShjcCwgcGF0aCk7CisJCQkqcmV0X3BhdGggPSBjcDsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCXNraXBfdG9fbmV4dDoKKwkJZHAgPSByZWFkZGlyKGRpcik7CisJfQorc3VjY2VzczoKKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgcGF0aG5hbWUgdG8gYSBibG9jayBkZXZpY2Ugd2l0aCBhIGdpdmVuCisgKiBkZXZpY2UgbnVtYmVyLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSB0byB0aGUKKyAqIHBhdGhuYW1lIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK2NoYXIgKmV4dDJmc19maW5kX2Jsb2NrX2RldmljZShkZXZfdCBkZXZpY2UpCit7CisJc3RydWN0IGRpcl9saXN0ICpsaXN0ID0gTlVMTCwgKm5ld19saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZGlyX2xpc3QgKmN1cnJlbnQ7CisJY2hhcgkqcmV0X3BhdGggPSBOVUxMOworCisJLyoKKwkgKiBBZGQgdGhlIHN0YXJ0aW5nIGRpcmVjdG9yaWVzIHRvIHNlYXJjaC4uLgorCSAqLworCWFkZF90b19kaXJsaXN0KCIvZGV2aWNlcyIsICZsaXN0KTsKKwlhZGRfdG9fZGlybGlzdCgiL2RldmZzIiwgJmxpc3QpOworCWFkZF90b19kaXJsaXN0KCIvZGV2IiwgJmxpc3QpOworCisJd2hpbGUgKGxpc3QpIHsKKwkJY3VycmVudCA9IGxpc3Q7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworI2lmZGVmIERFQlVHCisJCXByaW50ZigiU2Nhbm5pbmcgZGlyZWN0b3J5ICVzXG4iLCBjdXJyZW50LT5uYW1lKTsKKyNlbmRpZgorCQlzY2FuX2RpcihjdXJyZW50LT5uYW1lLCBkZXZpY2UsICZuZXdfbGlzdCwgJnJldF9wYXRoKTsKKwkJZnJlZShjdXJyZW50LT5uYW1lKTsKKwkJZnJlZShjdXJyZW50KTsKKwkJaWYgKHJldF9wYXRoKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHdlJ3JlIGRvbmUgY2hlY2tpbmcgYXQgdGhpcyBsZXZlbCwgZGVzY2VuZCB0bworCQkgKiB0aGUgbmV4dCBsZXZlbCBvZiBzdWJkaXJlY3Rvcmllcy4gKGJyZWFkdGgtZmlyc3QpCisJCSAqLworCQlpZiAobGlzdCA9PSAwKSB7CisJCQlsaXN0ID0gbmV3X2xpc3Q7CisJCQluZXdfbGlzdCA9IDA7CisJCX0KKwl9CisJZnJlZV9kaXJsaXN0KCZsaXN0KTsKKwlmcmVlX2Rpcmxpc3QoJm5ld19saXN0KTsKKwlyZXR1cm4gcmV0X3BhdGg7Cit9CisKKworI2lmZGVmIERFQlVHCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJY2hhcgkqZGV2bmFtZSwgKnRtcDsKKwlpbnQJbWFqb3IsIG1pbm9yOworCWRldl90CWRldmljZTsKKwljb25zdCBjaGFyICplcnJtc2cgPSAiQ2Fubm90IHBhcnNlICVzOiAlc1xuIjsKKworCWlmICgoYXJnYyAhPSAyKSAmJiAoYXJnYyAhPSAzKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBkZXZpY2VfbnVtYmVyXG4iLCBhcmd2WzBdKTsKKwkJZnByaW50ZihzdGRlcnIsICJcdDogJXMgbWFqb3IgbWlub3JcbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoYXJnYyA9PSAyKSB7CisJCWRldmljZSA9IHN0cnRvdWwoYXJndlsxXSwgJnRtcCwgMCk7CisJCWlmICgqdG1wKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgZXJybXNnLCAiZGV2aWNlIG51bWJlciIsIGFyZ3ZbMV0pOworCQkJZXhpdCgxKTsKKwkJfQorCX0gZWxzZSB7CisJCW1ham9yID0gc3RydG91bChhcmd2WzFdLCAmdG1wLCAwKTsKKwkJaWYgKCp0bXApIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlcnJtc2csICJtYWpvciBudW1iZXIiLCBhcmd2WzFdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJbWlub3IgPSBzdHJ0b3VsKGFyZ3ZbMl0sICZ0bXAsIDApOworCQlpZiAoKnRtcCkgeworCQkJZnByaW50ZihzdGRlcnIsIGVycm1zZywgIm1pbm9yIG51bWJlciIsIGFyZ3ZbMl0pOworCQkJZXhpdCgxKTsKKwkJfQorCQlkZXZpY2UgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJCXByaW50ZigiTG9va2luZyBmb3IgZGV2aWNlIDB4JTA0eCAoJWQ6JWQpXG4iLCBkZXZpY2UsCisJCSAgICAgICBtYWpvciwgbWlub3IpOworCX0KKwlkZXZuYW1lID0gZXh0MmZzX2ZpbmRfYmxvY2tfZGV2aWNlKGRldmljZSk7CisJaWYgKGRldm5hbWUpIHsKKwkJcHJpbnRmKCJGb3VuZCBkZXZpY2UhICAlc1xuIiwgZGV2bmFtZSk7CisJCWZyZWUoZGV2bmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJDYW5ub3QgZmluZCBkZXZpY2UuXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ZsdXNoYi5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ZsdXNoYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZWQ3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZmx1c2hiLmMKQEAgLTAsMCArMSw4MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmx1c2hiLmMgLS0tIEhpZGVzIHN5c3RlbS1kZXBlbmRlbnQgaW5mb3JtYXRpb24gZm9yIGJvdGggc3luY2luZyBhCisgKglkZXZpY2UgdG8gZGlzayBhbmQgdG8gZmx1c2ggYW55IGJ1ZmZlcnMgZnJvbSBkaXNrIGNhY2hlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX01PVU5UX0gKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4gIC8qIFRoaXMgbWF5IGRlZmluZSBCTEtGTFNCVUYgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogRm9yIExpbnV4LCBkZWZpbmUgQkxLRkxTQlVGIGFuZCBGREZMVVNIIGlmIG5lY2Vzc2FyeSwgc2luY2UKKyAqIG5vdCBhbGwgcG9ydGFibGUgaGVhZGVyIGZpbGUgZG9lcyBzbyBmb3IgdXMuICBUaGlzIHJlYWxseSBzaG91bGQgYmUKKyAqIGZpeGVkIGluIHRoZSBnbGliYyBoZWFkZXIgZmlsZXMuICAoUmVjZW50IGdsaWJjcyBhcHBlYXIgdG8gZGVmaW5lCisgKiBCTEtGTFNCVUYgaW4gc3lzL21vdW50LmgsIGJ1dCBGREZMVVNIIHN0aWxsIGRvZXNuJ3Qgc2VlbSB0byBiZQorICogZGVmaW5lZCBhbnl3aGVyZSBwb3J0YWJsZS4pICBVbnRpbCB0aGVuLi4uLgorICovCisjaWZkZWYgX19saW51eF9fCisjaWZuZGVmIEJMS0ZMU0JVRgorI2RlZmluZSBCTEtGTFNCVUYgIF9JTygweDEyLDk3KSAgLyogZmx1c2ggYnVmZmVyIGNhY2hlICovCisjZW5kaWYKKyNpZm5kZWYgRkRGTFVTSAorI2RlZmluZSBGREZMVVNIICAgIF9JTygyLDB4NGIpICAvKiBmbHVzaCBmbG9wcHkgZGlzayAqLworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzeW5jIGEgZGV2aWNlL2ZpbGUsIGFuZCBvcHRpb25hbGx5IGF0dGVtcHQgdG8KKyAqIGZsdXNoIHRoZSBidWZmZXIgY2FjaGUuICBUaGUgbGF0dGVyIGlzIGJhc2ljYWxseSBvbmx5IHVzZWZ1bCBmb3IKKyAqIHN5c3RlbSBiZW5jaG1hcmtzIGFuZCBmb3IgdG9ydHVyaW5nIHN5c3RlbXMgaW4gYnVybi1pbiB0ZXN0cy4gIDopCisgKi8KK2VycmNvZGVfdCBleHQyZnNfc3luY19kZXZpY2UoaW50IGZkLCBpbnQgZmx1c2hiKQoreworCS8qCisJICogV2UgYWx3YXlzIHN5bmMgdGhlIGRldmljZSBpbiBjYXNlIHdlJ3JlIHJ1bm5pbmcgb24gb2xkCisJICoga2VybmVscyBmb3Igd2hpY2ggd2UgY2FuIGxvc2UgZGF0YSBpZiB3ZSBkb24ndC4gIChUaGVyZQorCSAqIHN0aWxsIGlzIGEgcmFjZSBjb25kaXRpb24gZm9yIHRob3NlIGtlcm5lbHMsIGJ1dCB0aGlzCisJICogcmVkdWNlcyBpdCBncmVhdGx5LikKKwkgKi8KKwlpZiAoZnN5bmMgKGZkKSA9PSAtMSkKKwkJcmV0dXJuIGVycm5vOworCisJaWYgKGZsdXNoYikgeworCisjaWZkZWYgQkxLRkxTQlVGCisJCWlmIChpb2N0bCAoZmQsIEJMS0ZMU0JVRiwgMCkgPT0gMCkKKwkJCXJldHVybiAwOworI2Vsc2UKKyNpZmRlZiBfX0dOVUNfXworIyB3YXJuaW5nIEJMS0ZMU0JVRiBub3QgZGVmaW5lZAorI2VuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYKKyNpZmRlZiBGREZMVVNICisJCWlvY3RsIChmZCwgRkRGTFVTSCwgMCk7ICAgLyogSW4gY2FzZSB0aGlzIGlzIGEgZmxvcHB5ICovCisjZWxzZQorI2lmZGVmIF9fR05VQ19fCisjIHdhcm5pbmcgRkRGTFVTSCBub3QgZGVmaW5lZAorI2VuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZnJlZWZzLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZnJlZWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9mcmVlZnMuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZnJlZWZzLmMgLS0tIGZyZWUgYW4gZXh0MiBmaWxlc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK3N0YXRpYyB2b2lkIGV4dDJmc19mcmVlX2lub2RlX2NhY2hlKHN0cnVjdCBleHQyX2lub2RlX2NhY2hlICppY2FjaGUpOworCit2b2lkIGV4dDJmc19mcmVlKGV4dDJfZmlsc3lzIGZzKQoreworCWlmICghZnMgfHwgKGZzLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpKQorCQlyZXR1cm47CisJaWYgKGZzLT5pbWFnZV9pbyAhPSBmcy0+aW8pIHsKKwkJaWYgKGZzLT5pbWFnZV9pbykKKwkJCWlvX2NoYW5uZWxfY2xvc2UoZnMtPmltYWdlX2lvKTsKKwl9CisJaWYgKGZzLT5pbykgeworCQlpb19jaGFubmVsX2Nsb3NlKGZzLT5pbyk7CisJfQorCWV4dDJmc19mcmVlX21lbSgmZnMtPmRldmljZV9uYW1lKTsKKwlleHQyZnNfZnJlZV9tZW0oJmZzLT5zdXBlcik7CisJZXh0MmZzX2ZyZWVfbWVtKCZmcy0+b3JpZ19zdXBlcik7CisJZXh0MmZzX2ZyZWVfbWVtKCZmcy0+Z3JvdXBfZGVzYyk7CisJZXh0MmZzX2ZyZWVfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXApOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwKTsKKworCWV4dDJmc19iYWRibG9ja3NfbGlzdF9mcmVlKGZzLT5iYWRibG9ja3MpOworCWZzLT5iYWRibG9ja3MgPSAwOworCisJZXh0MmZzX2ZyZWVfZGJsaXN0KGZzLT5kYmxpc3QpOworCisJaWYgKGZzLT5pY2FjaGUpCisJCWV4dDJmc19mcmVlX2lub2RlX2NhY2hlKGZzLT5pY2FjaGUpOworCisJZnMtPm1hZ2ljID0gMDsKKworCWV4dDJmc19mcmVlX21lbSgmZnMpOworfQorCit2b2lkIGV4dDJmc19mcmVlX2dlbmVyaWNfYml0bWFwKGV4dDJmc19pbm9kZV9iaXRtYXAgYml0bWFwKQoreworCWlmICghYml0bWFwIHx8IChiaXRtYXAtPm1hZ2ljICE9IEVYVDJfRVRfTUFHSUNfR0VORVJJQ19CSVRNQVApKQorCQlyZXR1cm47CisKKwliaXRtYXAtPm1hZ2ljID0gMDsKKwlleHQyZnNfZnJlZV9tZW0oJmJpdG1hcC0+ZGVzY3JpcHRpb24pOworCWV4dDJmc19mcmVlX21lbSgmYml0bWFwLT5iaXRtYXApOworCWV4dDJmc19mcmVlX21lbSgmYml0bWFwKTsKK30KKwordm9pZCBleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoZXh0MmZzX2lub2RlX2JpdG1hcCBiaXRtYXApCit7CisJaWYgKCFiaXRtYXAgfHwgKGJpdG1hcC0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVApKQorCQlyZXR1cm47CisKKwliaXRtYXAtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19HRU5FUklDX0JJVE1BUDsKKwlleHQyZnNfZnJlZV9nZW5lcmljX2JpdG1hcChiaXRtYXApOworfQorCit2b2lkIGV4dDJmc19mcmVlX2Jsb2NrX2JpdG1hcChleHQyZnNfYmxvY2tfYml0bWFwIGJpdG1hcCkKK3sKKwlpZiAoIWJpdG1hcCB8fCAoYml0bWFwLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0JMT0NLX0JJVE1BUCkpCisJCXJldHVybjsKKworCWJpdG1hcC0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQOworCWV4dDJmc19mcmVlX2dlbmVyaWNfYml0bWFwKGJpdG1hcCk7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBpbm9kZSBjYWNoZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgZXh0MmZzX2ZyZWVfaW5vZGVfY2FjaGUoc3RydWN0IGV4dDJfaW5vZGVfY2FjaGUgKmljYWNoZSkKK3sKKwlpZiAoLS1pY2FjaGUtPnJlZmNvdW50KQorCQlyZXR1cm47CisJZXh0MmZzX2ZyZWVfbWVtKCZpY2FjaGUtPmJ1ZmZlcik7CisJZXh0MmZzX2ZyZWVfbWVtKCZpY2FjaGUtPmNhY2hlKTsKKwlpY2FjaGUtPmJ1ZmZlcl9ibGsgPSAwOworCWV4dDJmc19mcmVlX21lbSgmaWNhY2hlKTsKK30KKworLyoKKyAqIFRoaXMgcHJvY2VkdXJlIGZyZWVzIGEgYmFkYmxvY2tzIGxpc3QuCisgKi8KK3ZvaWQgZXh0MmZzX3UzMl9saXN0X2ZyZWUoZXh0Ml91MzJfbGlzdCBiYikKK3sKKwlpZiAoIWJiIHx8IGJiLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0JBREJMT0NLU19MSVNUKQorCQlyZXR1cm47CisKKwlleHQyZnNfZnJlZV9tZW0oJmJiLT5saXN0KTsKKwlleHQyZnNfZnJlZV9tZW0oJmJiKTsKK30KKwordm9pZCBleHQyZnNfYmFkYmxvY2tzX2xpc3RfZnJlZShleHQyX2JhZGJsb2Nrc19saXN0IGJiKQoreworCWV4dDJmc191MzJfbGlzdF9mcmVlKChleHQyX3UzMl9saXN0KSBiYik7Cit9CisKKworLyoKKyAqIEZyZWUgYSBkaXJlY3RvcnkgYmxvY2sgbGlzdAorICovCit2b2lkIGV4dDJmc19mcmVlX2RibGlzdChleHQyX2RibGlzdCBkYmxpc3QpCit7CisJaWYgKCFkYmxpc3QgfHwgKGRibGlzdC0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19EQkxJU1QpKQorCQlyZXR1cm47CisKKwlleHQyZnNfZnJlZV9tZW0oJmRibGlzdC0+bGlzdCk7CisJaWYgKGRibGlzdC0+ZnMgJiYgZGJsaXN0LT5mcy0+ZGJsaXN0ID09IGRibGlzdCkKKwkJZGJsaXN0LT5mcy0+ZGJsaXN0ID0gMDsKKwlkYmxpc3QtPm1hZ2ljID0gMDsKKwlleHQyZnNfZnJlZV9tZW0oJmRibGlzdCk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2VuX2JpdG1hcC5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dlbl9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg2OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dlbl9iaXRtYXAuYwpAQCAtMCwwICsxLDQ5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZW5fYml0bWFwLmMgLS0tIEdlbmVyaWMgYml0bWFwIHJvdXRpbmVzIHRoYXQgdXNlZCB0byBiZSBpbmxpbmVkLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK2ludCBleHQyZnNfbWFya19nZW5lcmljX2JpdG1hcChleHQyZnNfZ2VuZXJpY19iaXRtYXAgYml0bWFwLAorCQkJCQkgX191MzIgYml0bm8pCit7CisJaWYgKChiaXRubyA8IGJpdG1hcC0+c3RhcnQpIHx8IChiaXRubyA+IGJpdG1hcC0+ZW5kKSkgeworCQlleHQyZnNfd2Fybl9iaXRtYXAyKGJpdG1hcCwgRVhUMkZTX01BUktfRVJST1IsIGJpdG5vKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBleHQyZnNfc2V0X2JpdChiaXRubyAtIGJpdG1hcC0+c3RhcnQsIGJpdG1hcC0+Yml0bWFwKTsKK30KKworaW50IGV4dDJmc191bm1hcmtfZ2VuZXJpY19iaXRtYXAoZXh0MmZzX2dlbmVyaWNfYml0bWFwIGJpdG1hcCwKKwkJCQkJICAgYmxrX3QgYml0bm8pCit7CisJaWYgKChiaXRubyA8IGJpdG1hcC0+c3RhcnQpIHx8IChiaXRubyA+IGJpdG1hcC0+ZW5kKSkgeworCQlleHQyZnNfd2Fybl9iaXRtYXAyKGJpdG1hcCwgRVhUMkZTX1VOTUFSS19FUlJPUiwgYml0bm8pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV4dDJmc19jbGVhcl9iaXQoYml0bm8gLSBiaXRtYXAtPnN0YXJ0LCBiaXRtYXAtPmJpdG1hcCk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2V0X3BhdGhuYW1lLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2V0X3BhdGhuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiMWNjMgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZXRfcGF0aG5hbWUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZ2V0X3BhdGhuYW1lLmMgLS0tIGRvIGRpcmVjdHJ5L2lub2RlIC0+IG5hbWUgdHJhbnNsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICoKKyAqCWV4dDJmc19nZXRfcGF0aG5hbWUoZnMsIGRpciwgaW5vLCBuYW1lKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0YWtlcyB0d28gaW5vZGUgbnVtYmVycyBpbnRvIGEKKyAqCXN0cmluZywgcGxhY2luZyB0aGUgcmVzdWx0IGluIDxuYW1lPi4gIDxkaXI+IGlzIHRoZSBjb250YWluaW5nCisgKglkaXJlY3RvcnkgaW5vZGUsIGFuZCA8aW5vPiBpcyB0aGUgaW5vZGUgbnVtYmVyIGl0c2VsZi4gIElmCisgKgk8aW5vPiBpcyB6ZXJvLCB0aGVuIGV4dDJmc19nZXRfcGF0aG5hbWUgd2lsbCByZXR1cm4gcGF0aG5hbWUKKyAqCW9mIHRoZSBkaXJlY3RvcnkgPGRpcj4uCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdHJ1Y3QgZ2V0X3BhdGhuYW1lX3N0cnVjdCB7CisJZXh0Ml9pbm9fdAlzZWFyY2hfaW5vOworCWV4dDJfaW5vX3QJcGFyZW50OworCWNoYXIJCSpuYW1lOworCWVycmNvZGVfdAllcnJjb2RlOworfTsKKworI2lmZGVmIF9fVFVSQk9DX18KKyMgcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK3N0YXRpYyBpbnQgZ2V0X3BhdGhuYW1lX3Byb2Moc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCQkgICAgIGludAlvZmZzZXQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICBpbnQJYmxvY2tzaXplIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgY2hhcgkqYnVmIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgdm9pZAkqcHJpdl9kYXRhKQoreworCXN0cnVjdCBnZXRfcGF0aG5hbWVfc3RydWN0CSpncDsKKwllcnJjb2RlX3QJCQlyZXR2YWw7CisKKwlncCA9IChzdHJ1Y3QgZ2V0X3BhdGhuYW1lX3N0cnVjdCAqKSBwcml2X2RhdGE7CisKKwlpZiAoKChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikgPT0gMikgJiYKKwkgICAgIXN0cm5jbXAoZGlyZW50LT5uYW1lLCAiLi4iLCAyKSkKKwkJZ3AtPnBhcmVudCA9IGRpcmVudC0+aW5vZGU7CisJaWYgKGRpcmVudC0+aW5vZGUgPT0gZ3AtPnNlYXJjaF9pbm8pIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSArIDEsCisJCQkJCSZncC0+bmFtZSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWdwLT5lcnJjb2RlID0gcmV0dmFsOworCQkJcmV0dXJuIERJUkVOVF9BQk9SVDsKKwkJfQorCQlzdHJuY3B5KGdwLT5uYW1lLCBkaXJlbnQtPm5hbWUsIChkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikpOworCQlncC0+bmFtZVtkaXJlbnQtPm5hbWVfbGVuICYgMHhGRl0gPSAnXDAnOworCQlyZXR1cm4gRElSRU5UX0FCT1JUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBleHQyZnNfZ2V0X3BhdGhuYW1lX2ludChleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsCisJCQkJCSBleHQyX2lub190IGlubywgaW50IG1heGRlcHRoLAorCQkJCQkgY2hhciAqYnVmLCBjaGFyICoqbmFtZSkKK3sKKwlzdHJ1Y3QgZ2V0X3BhdGhuYW1lX3N0cnVjdCBncDsKKwljaGFyCSpwYXJlbnRfbmFtZSwgKnJldDsKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKGRpciA9PSBpbm8pIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oMiwgbmFtZSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlzdHJjcHkoKm5hbWUsIChkaXIgPT0gRVhUMl9ST09UX0lOTykgPyAiLyIgOiAiLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRpciB8fCAobWF4ZGVwdGggPCAwKSkgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSg0LCBuYW1lKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXN0cmNweSgqbmFtZSwgIi4uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlncC5zZWFyY2hfaW5vID0gaW5vOworCWdwLnBhcmVudCA9IDA7CisJZ3AubmFtZSA9IDA7CisJZ3AuZXJyY29kZSA9IDA7CisKKwlyZXR2YWwgPSBleHQyZnNfZGlyX2l0ZXJhdGUoZnMsIGRpciwgMCwgYnVmLCBnZXRfcGF0aG5hbWVfcHJvYywgJmdwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKGdwLmVycmNvZGUpIHsKKwkJcmV0dmFsID0gZ3AuZXJyY29kZTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXJldHZhbCA9IGV4dDJmc19nZXRfcGF0aG5hbWVfaW50KGZzLCBncC5wYXJlbnQsIGRpciwgbWF4ZGVwdGgtMSwKKwkJCQkJIGJ1ZiwgJnBhcmVudF9uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKCFpbm8pIHsKKwkJKm5hbWUgPSBwYXJlbnRfbmFtZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGdwLm5hbWUpCisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihwYXJlbnRfbmFtZSkrc3RybGVuKGdwLm5hbWUpKzIsCisJCQkJCSZyZXQpOworCWVsc2UKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKHBhcmVudF9uYW1lKSs1LCAmcmV0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlyZXRbMF0gPSAwOworCWlmIChwYXJlbnRfbmFtZVsxXSkKKwkJc3RyY2F0KHJldCwgcGFyZW50X25hbWUpOworCXN0cmNhdChyZXQsICIvIik7CisJaWYgKGdwLm5hbWUpCisJCXN0cmNhdChyZXQsIGdwLm5hbWUpOworCWVsc2UKKwkJc3RyY2F0KHJldCwgIj8/PyIpOworCSpuYW1lID0gcmV0OworCWV4dDJmc19mcmVlX21lbSgmcGFyZW50X25hbWUpOworCXJldHZhbCA9IDA7CisKK2NsZWFudXA6CisJZXh0MmZzX2ZyZWVfbWVtKCZncC5uYW1lKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2dldF9wYXRobmFtZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICAgY2hhciAqKm5hbWUpCit7CisJY2hhcgkqYnVmOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAoZGlyID09IGlubykKKwkJaW5vID0gMDsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X3BhdGhuYW1lX2ludChmcywgZGlyLCBpbm8sIDMyLCBidWYsIG5hbWUpOworCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dldHNlY3RzaXplLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvZ2V0c2VjdHNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNlYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dldHNlY3RzaXplLmMKQEAgLTAsMCArMSw1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZ2V0c2VjdHNpemUuYyAtLS0gZ2V0IHRoZSBzZWN0b3Igc2l6ZSBvZiBhIGRldmljZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBWTXdhcmUsIEluYy4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfTElOVVhfRkRfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9JTykgJiYgIWRlZmluZWQoQkxLU1NaR0VUKQorI2RlZmluZSBCTEtTU1pHRVQgIF9JTygweDEyLDEwNCkvKiBnZXQgYmxvY2sgZGV2aWNlIHNlY3RvciBzaXplICovCisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gYSBwYXJ0aXRpb24KKyAqLworZXJyY29kZV90IGV4dDJmc19nZXRfZGV2aWNlX3NlY3RzaXplKGNvbnN0IGNoYXIgKmZpbGUsIGludCAqc2VjdHNpemUpCit7CisJaW50CWZkOworCisjaWZkZWYgQ09ORklHX0xGUworCWZkID0gb3BlbjY0KGZpbGUsIE9fUkRPTkxZKTsKKyNlbHNlCisJZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKyNlbmRpZgorCWlmIChmZCA8IDApCisJCXJldHVybiBlcnJubzsKKworI2lmZGVmIEJMS1NTWkdFVAorCWlmIChpb2N0bChmZCwgQkxLU1NaR0VULCBzZWN0c2l6ZSkgPj0gMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCSpzZWN0c2l6ZSA9IDA7CisJY2xvc2UoZmQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2dldHNpemUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZXRzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0YmJiNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9nZXRzaXplLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGdldHNpemUuYyAtLS0gZ2V0IHRoZSBzaXplIG9mIGEgcGFydGl0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NSBUaGVvZG9yZSBUcydvLgorICogQ29weXJpZ2h0IChDKSAyMDAzIFZNd2FyZSwgSW5jLgorICoKKyAqIFdpbmRvd3MgdmVyc2lvbiBvZiBleHQyZnNfZ2V0X2RldmljZV9zaXplIGJ5IENocmlzIExpLCBWTXdhcmUuCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0xJTlVYX0ZEX0gKKyNpbmNsdWRlIDxsaW51eC9mZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfRElTS0xBQkVMX0gKKyNpbmNsdWRlIDxzeXMvZGlza2xhYmVsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19ESVNLX0gKKyNpZmRlZiBIQVZFX1NZU19RVUVVRV9ICisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+IC8qIGZvciBMSVNUX0hFQUQgKi8KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9kaXNrLmg+CisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfSU8pICYmICFkZWZpbmVkKEJMS0dFVFNJWkUpCisjZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChfSU9SKSAmJiAhZGVmaW5lZChCTEtHRVRTSVpFNjQpCisjZGVmaW5lIEJMS0dFVFNJWkU2NCBfSU9SKDB4MTIsMTE0LHNpemVfdCkJLyogcmV0dXJuIGRldmljZSBzaXplIGluIGJ5dGVzICh1NjQgKmFyZykgKi8KKyNlbmRpZgorCisjaWZkZWYgQVBQTEVfREFSV0lOCisjZGVmaW5lIEJMS0dFVFNJWkUgREtJT0NHRVRCTE9DS0NPVU5UMzIKKyNlbmRpZiAvKiBBUFBMRV9EQVJXSU4gKi8KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChXSU4zMikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luaW9jdGwuaD4KKworI2lmIChfV0lOMzJfV0lOTlQgPj0gMHgwNTAwKQorI2RlZmluZSBIQVZFX0dFVF9GSUxFX1NJWkVfRVggMQorI2VuZGlmCisKK2VycmNvZGVfdCBleHQyZnNfZ2V0X2RldmljZV9zaXplKGNvbnN0IGNoYXIgKmZpbGUsIGludCBibG9ja3NpemUsCisJCQkJIGJsa190ICpyZXRibG9ja3MpCit7CisJSEFORExFIGRldjsKKwlQQVJUSVRJT05fSU5GT1JNQVRJT04gcGk7CisJRElTS19HRU9NRVRSWSBnaTsKKwlEV09SRCByZXRieXRlczsKKyNpZmRlZiBIQVZFX0dFVF9GSUxFX1NJWkVfRVgKKwlMQVJHRV9JTlRFR0VSIGZpbGVzaXplOworI2Vsc2UKKwlEV09SRCBmaWxlc2l6ZTsKKyNlbmRpZiAvKiBIQVZFX0dFVF9GSUxFX1NJWkVfRVggKi8KKworCWRldiA9IENyZWF0ZUZpbGUoZmlsZSwgR0VORVJJQ19SRUFELAorCQkJIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUgLAorCQkJIE5VTEwsIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisKKwlpZiAoZGV2ID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCQlyZXR1cm4gRUJBREY7CisJaWYgKERldmljZUlvQ29udHJvbChkZXYsIElPQ1RMX0RJU0tfR0VUX1BBUlRJVElPTl9JTkZPLAorCQkJICAgICZwaSwgc2l6ZW9mKFBBUlRJVElPTl9JTkZPUk1BVElPTiksCisJCQkgICAgJnBpLCBzaXplb2YoUEFSVElUSU9OX0lORk9STUFUSU9OKSwKKwkJCSAgICAmcmV0Ynl0ZXMsIE5VTEwpKSB7CisKKwkJKnJldGJsb2NrcyA9IHBpLlBhcnRpdGlvbkxlbmd0aC5RdWFkUGFydCAvIGJsb2Nrc2l6ZTsKKworCX0gZWxzZSBpZiAoRGV2aWNlSW9Db250cm9sKGRldiwgSU9DVExfRElTS19HRVRfRFJJVkVfR0VPTUVUUlksCisJCQkJJmdpLCBzaXplb2YoRElTS19HRU9NRVRSWSksCisJCQkJJmdpLCBzaXplb2YoRElTS19HRU9NRVRSWSksCisJCQkJJnJldGJ5dGVzLCBOVUxMKSkgeworCisJCSpyZXRibG9ja3MgPSBnaS5CeXRlc1BlclNlY3RvciAqCisJCQkgICAgIGdpLlNlY3RvcnNQZXJUcmFjayAqCisJCQkgICAgIGdpLlRyYWNrc1BlckN5bGluZGVyICoKKwkJCSAgICAgZ2kuQ3lsaW5kZXJzLlF1YWRQYXJ0IC8gYmxvY2tzaXplOworCisjaWZkZWYgSEFWRV9HRVRfRklMRV9TSVpFX0VYCisJfSBlbHNlIGlmIChHZXRGaWxlU2l6ZUV4KGRldiwgJmZpbGVzaXplKSkgeworCQkqcmV0YmxvY2tzID0gZmlsZXNpemUuUXVhZFBhcnQgLyBibG9ja3NpemU7CisJfQorI2Vsc2UKKwl9IGVsc2UgeworCQlmaWxlc2l6ZSA9IEdldEZpbGVTaXplKGRldiwgTlVMTCk7CisJCWlmIChJTlZBTElEX0ZJTEVfU0laRSAhPSBmaWxlc2l6ZSkgeworCQkJKnJldGJsb2NrcyA9IGZpbGVzaXplIC8gYmxvY2tzaXplOworCQl9CisJfQorI2VuZGlmIC8qIEhBVkVfR0VUX0ZJTEVfU0laRV9FWCAqLworCisJQ2xvc2VIYW5kbGUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCB2YWxpZF9vZmZzZXQgKGludCBmZCwgZXh0Ml9sb2ZmX3Qgb2Zmc2V0KQoreworCWNoYXIgY2g7CisKKwlpZiAoZXh0MmZzX2xsc2VlayAoZmQsIG9mZnNldCwgMCkgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAocmVhZCAoZmQsICZjaCwgMSkgPCAxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gYSBwYXJ0aXRpb24KKyAqLworZXJyY29kZV90IGV4dDJmc19nZXRfZGV2aWNlX3NpemUoY29uc3QgY2hhciAqZmlsZSwgaW50IGJsb2Nrc2l6ZSwKKwkJCQkgYmxrX3QgKnJldGJsb2NrcykKK3sKKwlpbnQJZmQ7CisJaW50IHZhbGlkX2Jsa2dldHNpemU2NCA9IDE7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0CQl1dHNuYW1lIHV0OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBsb25nIHNpemU2NDsKKwl1bnNpZ25lZCBsb25nCXNpemU7CisJZXh0Ml9sb2ZmX3QgaGlnaCwgbG93OworI2lmZGVmIEZER0VUUFJNCisJc3RydWN0IGZsb3BweV9zdHJ1Y3QgdGhpc19mbG9wcHk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19ESVNLTEFCRUxfSAorCWludCBwYXJ0OworCXN0cnVjdCBkaXNrbGFiZWwgbGFiOworCXN0cnVjdCBwYXJ0aXRpb24gKnBwOworCWNoYXIgY2g7CisjZW5kaWYgLyogSEFWRV9TWVNfRElTS0xBQkVMX0ggKi8KKworI2lmZGVmIENPTkZJR19MRlMKKwlmZCA9IG9wZW42NChmaWxlLCBPX1JET05MWSk7CisjZWxzZQorCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisjZW5kaWYKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZXJybm87CisKKyNpZmRlZiBES0lPQ0dFVEJMT0NLQ09VTlQJLyogRm9yIEFwcGxlIERhcndpbiAqLworCWlmIChpb2N0bChmZCwgREtJT0NHRVRCTE9DS0NPVU5ULCAmc2l6ZTY0KSA+PSAwKSB7CisJCWlmICgoc2l6ZW9mKCpyZXRibG9ja3MpIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpCisJCSAgICAmJiAoKHNpemU2NCAvIChibG9ja3NpemUgLyA1MTIpKSA+IDB4RkZGRkZGRkYpKQorCQkJcmV0dXJuIEVGQklHOworCQljbG9zZShmZCk7CisJCSpyZXRibG9ja3MgPSBzaXplNjQgLyAoYmxvY2tzaXplIC8gNTEyKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKyNpZmRlZiBCTEtHRVRTSVpFNjQKKyNpZmRlZiBfX2xpbnV4X18KKwl1bmFtZSgmdXQpOworCWlmICgodXQucmVsZWFzZVswXSA9PSAnMicpICYmICh1dC5yZWxlYXNlWzFdID09ICcuJykgJiYKKwkgICAgICh1dC5yZWxlYXNlWzJdIDwgJzYnKSAmJiAodXQucmVsZWFzZVszXSA9PSAnLicpKQorCQl2YWxpZF9ibGtnZXRzaXplNjQgPSAwOworI2VuZGlmCisJaWYgKHZhbGlkX2Jsa2dldHNpemU2NCAmJgorCSAgICBpb2N0bChmZCwgQkxLR0VUU0laRTY0LCAmc2l6ZTY0KSA+PSAwKSB7CisJCWlmICgoc2l6ZW9mKCpyZXRibG9ja3MpIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpCisJCSAgICAmJiAoKHNpemU2NCAvIGJsb2Nrc2l6ZSkgPiAweEZGRkZGRkZGKSkKKwkJCXJldHVybiBFRkJJRzsKKwkJY2xvc2UoZmQpOworCQkqcmV0YmxvY2tzID0gc2l6ZTY0IC8gYmxvY2tzaXplOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEJMS0dFVFNJWkUKKwlpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJKnJldGJsb2NrcyA9IHNpemUgLyAoYmxvY2tzaXplIC8gNTEyKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKyNpZmRlZiBGREdFVFBSTQorCWlmIChpb2N0bChmZCwgRkRHRVRQUk0sICZ0aGlzX2Zsb3BweSkgPj0gMCkgeworCQljbG9zZShmZCk7CisJCSpyZXRibG9ja3MgPSB0aGlzX2Zsb3BweS5zaXplIC8gKGJsb2Nrc2l6ZSAvIDUxMik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfRElTS0xBQkVMX0gKKyNpZiBkZWZpbmVkKERJT0NHTUVESUFTSVpFKQorCXsKKwkgICAgb2ZmX3QgbXM7CisJICAgIHVfaW50IGJzOworCSAgICBpZiAoaW9jdGwoZmQsIERJT0NHTUVESUFTSVpFLCAmbXMpID49IDApIHsKKwkJKnJldGJsb2NrcyA9IG1zIC8gYmxvY2tzaXplOworCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKyNlbGlmIGRlZmluZWQoRElPQ0dESU5GTykKKwkvKiBvbGQgZGlza2xhYmVsIGludGVyZmFjZSAqLworCXBhcnQgPSBzdHJsZW4oZmlsZSkgLSAxOworCWlmIChwYXJ0ID49IDApIHsKKwkJY2ggPSBmaWxlW3BhcnRdOworCQlpZiAoaXNkaWdpdChjaCkpCisJCQlwYXJ0ID0gMDsKKwkJZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdoJykKKwkJCXBhcnQgPSBjaCAtICdhJzsKKwkJZWxzZQorCQkJcGFydCA9IC0xOworCX0KKwlpZiAocGFydCA+PSAwICYmIChpb2N0bChmZCwgRElPQ0dESU5GTywgKGNoYXIgKikmbGFiKSA+PSAwKSkgeworCQlwcCA9ICZsYWIuZF9wYXJ0aXRpb25zW3BhcnRdOworCQlpZiAocHAtPnBfc2l6ZSkgeworCQkJY2xvc2UoZmQpOworCQkJKnJldGJsb2NrcyA9IHBwLT5wX3NpemUgLyAoYmxvY2tzaXplIC8gNTEyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmIC8qIGRlZmluZWQoRElPQ0cqKSAqLworI2VuZGlmIC8qIEhBVkVfU1lTX0RJU0tMQUJFTF9IICovCisKKwkvKgorCSAqIE9LLCB3ZSBjb3VsZG4ndCBmaWd1cmUgaXQgb3V0IGJ5IHVzaW5nIGEgc3BlY2lhbGl6ZWQgaW9jdGwsCisJICogd2hpY2ggaXMgZ2VuZXJhbGx5IHRoZSBiZXN0IHdheS4gIFNvIGRvIGJpbmFyeSBzZWFyY2ggdG8KKwkgKiBmaW5kIHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24uCisJICovCisJbG93ID0gMDsKKwlmb3IgKGhpZ2ggPSAxMDI0OyB2YWxpZF9vZmZzZXQgKGZkLCBoaWdoKTsgaGlnaCAqPSAyKQorCQlsb3cgPSBoaWdoOworCXdoaWxlIChsb3cgPCBoaWdoIC0gMSkKKwl7CisJCWNvbnN0IGV4dDJfbG9mZl90IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisKKwkJaWYgKHZhbGlkX29mZnNldCAoZmQsIG1pZCkpCisJCQlsb3cgPSBtaWQ7CisJCWVsc2UKKwkJCWhpZ2ggPSBtaWQ7CisJfQorCXZhbGlkX29mZnNldCAoZmQsIDApOworCWNsb3NlKGZkKTsKKwlzaXplNjQgPSBsb3cgKyAxOworCWlmICgoc2l6ZW9mKCpyZXRibG9ja3MpIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpCisJICAgICYmICgoc2l6ZTY0IC8gYmxvY2tzaXplKSA+IDB4RkZGRkZGRkYpKQorCQlyZXR1cm4gRUZCSUc7CisJKnJldGJsb2NrcyA9IHNpemU2NCAvIGJsb2Nrc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIFdJTjMyICovCisKKyNpZmRlZiBERUJVRworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWJsa190CWJsb2NrczsKKwlpbnQJcmV0dmFsOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGRldmljZVxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dmFsID0gZXh0MmZzX2dldF9kZXZpY2Vfc2l6ZShhcmd2WzFdLCAxMDI0LCAmYmxvY2tzKTsKKwlpZiAocmV0dmFsKSB7CisJCWNvbV9lcnIoYXJndlswXSwgcmV0dmFsLAorCQkJIndoaWxlIGNhbGxpbmcgZXh0MmZzX2dldF9kZXZpY2Vfc2l6ZSIpOworCQlleGl0KDEpOworCX0KKwlwcmludGYoIkRldmljZSAlcyBoYXMgJWQgMWsgYmxvY2tzLlxuIiwgYXJndlsxXSwgYmxvY2tzKTsKKwlleGl0KDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaWNvdW50LmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaWNvdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiNWY1MQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pY291bnQuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaWNvdW50LmMgLS0tIGFuIGVmZmljaWVudCBpbm9kZSBjb3VudCBhYnN0cmFjdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBUaGUgZGF0YSBzdG9yYWdlIHN0cmF0ZWd5IHVzZWQgYnkgaWNvdW50IHJlbGllcyBvbiB0aGUgb2JzZXJ2YXRpb24KKyAqIHRoYXQgbW9zdCBpbm9kZSBjb3VudHMgYXJlIGVpdGhlciB6ZXJvIChmb3Igbm9uLWFsbG9jYXRlZCBpbm9kZXMpLAorICogb25lIChmb3IgbW9zdCBmaWxlcyksIGFuZCBvbmx5IGEgZmV3IHRoYXQgYXJlIHR3byBvciBtb3JlCisgKiAoZGlyZWN0b3JpZXMgYW5kIGZpbGVzIHRoYXQgYXJlIGxpbmtlZCB0byBtb3JlIHRoYW4gb25lIGRpcmVjdG9yeSkuCisgKgorICogQWxzbywgZTJmc2NrIHRlbmRzIHRvIGxvYWQgdGhlIGljb3VudCBkYXRhIHNlcXVlbnRpYWxseS4KKyAqCisgKiBTbywgd2UgdXNlIGFuIGlub2RlIGJpdG1hcCB0byBpbmRpY2F0ZSB3aGljaCBpbm9kZXMgaGF2ZSBhIGNvdW50IG9mCisgKiBvbmUsIGFuZCB0aGVuIHVzZSBhIHNvcnRlZCBsaXN0IHRvIHN0b3JlIHRoZSBjb3VudHMgZm9yIGlub2RlcworICogd2hpY2ggYXJlIGdyZWF0ZXIgdGhhbiBvbmUuCisgKgorICogV2UgYWxzbyB1c2UgYW4gb3B0aW9uYWwgYml0bWFwIHRvIGluZGljYXRlIHdoaWNoIGlub2RlcyBhcmUgYWxyZWFkeQorICogaW4gdGhlIHNvcnRlZCBsaXN0LCB0byBzcGVlZCB1cCB0aGUgdXNlIG9mIHRoaXMgYWJzdHJhY3Rpb24gYnkKKyAqIGUyZnNjaydzIHBhc3MgMi4gIFBhc3MgMiBpbmNyZW1lbnRzIGlub2RlIGNvdW50cyBhcyBpdCBmaW5kcyB0aGVtLAorICogc28gdGhpcyBleHRyYSBiaXRtYXAgYXZvaWRzIHNlYXJjaGluZyB0aGUgc29ydGVkIGxpc3QgdG8gc2VlIGlmIGEKKyAqIHBhcnRpY3VsYXIgaW5vZGUgaXMgb24gdGhlIHNvcnRlZCBsaXN0IGFscmVhZHkuCisgKi8KKworc3RydWN0IGV4dDJfaWNvdW50X2VsIHsKKwlleHQyX2lub190CWlubzsKKwlfX3UxNgljb3VudDsKK307CisKK3N0cnVjdCBleHQyX2ljb3VudCB7CisJZXJyY29kZV90CQltYWdpYzsKKwlleHQyZnNfaW5vZGVfYml0bWFwCXNpbmdsZTsKKwlleHQyZnNfaW5vZGVfYml0bWFwCW11bHRpcGxlOworCWV4dDJfaW5vX3QJCWNvdW50OworCWV4dDJfaW5vX3QJCXNpemU7CisJZXh0Ml9pbm9fdAkJbnVtX2lub2RlczsKKwlleHQyX2lub190CQljdXJzb3I7CisJc3RydWN0IGV4dDJfaWNvdW50X2VsCSpsaXN0OworfTsKKwordm9pZCBleHQyZnNfZnJlZV9pY291bnQoZXh0Ml9pY291bnRfdCBpY291bnQpCit7CisJaWYgKCFpY291bnQpCisJCXJldHVybjsKKworCWljb3VudC0+bWFnaWMgPSAwOworCWV4dDJmc19mcmVlX21lbSgmaWNvdW50LT5saXN0KTsKKwlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUpOworCWV4dDJmc19mcmVlX2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlKTsKKwlleHQyZnNfZnJlZV9tZW0oJmljb3VudCk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfY3JlYXRlX2ljb3VudDIoZXh0Ml9maWxzeXMgZnMsIGludCBmbGFncywgdW5zaWduZWQgaW50IHNpemUsCisJCQkJZXh0Ml9pY291bnRfdCBoaW50LCBleHQyX2ljb3VudF90ICpyZXQpCit7CisJZXh0Ml9pY291bnRfdAlpY291bnQ7CisJZXJyY29kZV90CXJldHZhbDsKKwlzaXplX3QJCWJ5dGVzOworCWV4dDJfaW5vX3QJaTsKKworCWlmIChoaW50KSB7CisJCUVYVDJfQ0hFQ0tfTUFHSUMoaGludCwgRVhUMl9FVF9NQUdJQ19JQ09VTlQpOworCQlpZiAoaGludC0+c2l6ZSA+IHNpemUpCisJCQlzaXplID0gKHNpemVfdCkgaGludC0+c2l6ZTsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfaWNvdW50KSwgJmljb3VudCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQoaWNvdW50LCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfaWNvdW50KSk7CisKKwlyZXR2YWwgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLCAwLAorCQkJCQkgICAgICAmaWNvdW50LT5zaW5nbGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCisJaWYgKGZsYWdzICYgRVhUMl9JQ09VTlRfT1BUX0lOQ1JFTUVOVCkgeworCQlyZXR2YWwgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLCAwLAorCQkJCQkJICAgICAgJmljb3VudC0+bXVsdGlwbGUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisJfSBlbHNlCisJCWljb3VudC0+bXVsdGlwbGUgPSAwOworCisJaWYgKHNpemUpIHsKKwkJaWNvdW50LT5zaXplID0gc2l6ZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IHNwZWNpYWwgY2FzZSBpbm9kZSBjb3VudHMgd2Ugd2lsbAorCQkgKiBoYXZlLiAgV2Uga25vdyB3ZSB3aWxsIG5lZWQgb25lIGZvciBlYWNoIGRpcmVjdG9yeTsKKwkJICogd2UgYWxzbyBuZWVkIHRvIHJlc2VydmUgc29tZSBleHRyYSByb29tIGZvciBmaWxlIGxpbmtzCisJCSAqLworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X251bV9kaXJzKGZzLCAmaWNvdW50LT5zaXplKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3V0OworCQlpY291bnQtPnNpemUgKz0gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudCAvIDUwOworCX0KKworCWJ5dGVzID0gKHNpemVfdCkgKGljb3VudC0+c2l6ZSAqIHNpemVvZihzdHJ1Y3QgZXh0Ml9pY291bnRfZWwpKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShieXRlcywgJmljb3VudC0+bGlzdCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJbWVtc2V0KGljb3VudC0+bGlzdCwgMCwgYnl0ZXMpOworCisJaWNvdW50LT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfSUNPVU5UOworCWljb3VudC0+Y291bnQgPSAwOworCWljb3VudC0+Y3Vyc29yID0gMDsKKwlpY291bnQtPm51bV9pbm9kZXMgPSBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50OworCisJLyoKKwkgKiBQb3B1bGF0ZSB0aGUgc29ydGVkIGxpc3Qgd2l0aCB0aG9zZSBlbnRyaWVzIHdoaWNoIHdlcmUKKwkgKiBmb3VuZCBpbiB0aGUgaGludCBpY291bnQgKHNpbmNlIHRob3NlIGFyZSBvbmVzIHdoaWNoIHdpbGwKKwkgKiBsaWtlbHkgbmVlZCB0byBiZSBpbiB0aGUgc29ydGVkIGxpc3QgdGhpcyB0aW1lIGFyb3VuZCkuCisJICovCisJaWYgKGhpbnQpIHsKKwkJZm9yIChpPTA7IGkgPCBoaW50LT5jb3VudDsgaSsrKQorCQkJaWNvdW50LT5saXN0W2ldLmlubyA9IGhpbnQtPmxpc3RbaV0uaW5vOworCQlpY291bnQtPmNvdW50ID0gaGludC0+Y291bnQ7CisJfQorCisJKnJldCA9IGljb3VudDsKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWV4dDJmc19mcmVlX2ljb3VudChpY291bnQpOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfY3JlYXRlX2ljb3VudChleHQyX2ZpbHN5cyBmcywgaW50IGZsYWdzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgICAgIGV4dDJfaWNvdW50X3QgKnJldCkKK3sKKwlyZXR1cm4gZXh0MmZzX2NyZWF0ZV9pY291bnQyKGZzLCBmbGFncywgc2l6ZSwgMCwgcmV0KTsKK30KKworLyoKKyAqIGluc2VydF9pY291bnRfZWwoKSAtLS0gSW5zZXJ0IGEgbmV3IGVudHJ5IGludG8gdGhlIHNvcnRlZCBsaXN0IGF0IGEKKyAqCXNwZWNpZmllZCBwb3NpdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBleHQyX2ljb3VudF9lbCAqaW5zZXJ0X2ljb3VudF9lbChleHQyX2ljb3VudF90IGljb3VudCwKKwkJCQkJICAgIGV4dDJfaW5vX3QgaW5vLCBpbnQgcG9zKQoreworCXN0cnVjdCBleHQyX2ljb3VudF9lbAkqZWw7CisJZXJyY29kZV90CQlyZXR2YWw7CisJZXh0Ml9pbm9fdAkJCW5ld19zaXplID0gMDsKKwlpbnQJCQludW07CisKKwlpZiAoaWNvdW50LT5jb3VudCA+PSBpY291bnQtPnNpemUpIHsKKwkJaWYgKGljb3VudC0+Y291bnQpIHsKKwkJCW5ld19zaXplID0gaWNvdW50LT5saXN0Wyh1bnNpZ25lZClpY291bnQtPmNvdW50LTFdLmlubzsKKwkJCW5ld19zaXplID0gKGV4dDJfaW5vX3QpIChpY291bnQtPmNvdW50ICoKKwkJCQkoKGZsb2F0KSBpY291bnQtPm51bV9pbm9kZXMgLyBuZXdfc2l6ZSkpOworCQl9CisJCWlmIChuZXdfc2l6ZSA8IChpY291bnQtPnNpemUgKyAxMDApKQorCQkJbmV3X3NpemUgPSBpY291bnQtPnNpemUgKyAxMDA7CisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKChzaXplX3QpIGljb3VudC0+c2l6ZSAqCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZXh0Ml9pY291bnRfZWwpLAorCQkJCQkgICAoc2l6ZV90KSBuZXdfc2l6ZSAqCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZXh0Ml9pY291bnRfZWwpLAorCQkJCQkgICAmaWNvdW50LT5saXN0KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiAwOworCQlpY291bnQtPnNpemUgPSBuZXdfc2l6ZTsKKwl9CisJbnVtID0gKGludCkgaWNvdW50LT5jb3VudCAtIHBvczsKKwlpZiAobnVtIDwgMCkKKwkJcmV0dXJuIDA7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlpZiAobnVtKSB7CisJCW1lbW1vdmUoJmljb3VudC0+bGlzdFtwb3MrMV0sICZpY291bnQtPmxpc3RbcG9zXSwKKwkJCXNpemVvZihzdHJ1Y3QgZXh0Ml9pY291bnRfZWwpICogbnVtKTsKKwl9CisJaWNvdW50LT5jb3VudCsrOworCWVsID0gJmljb3VudC0+bGlzdFtwb3NdOworCWVsLT5jb3VudCA9IDA7CisJZWwtPmlubyA9IGlubzsKKwlyZXR1cm4gZWw7Cit9CisKKy8qCisgKiBnZXRfaWNvdW50X2VsKCkgLS0tIGdpdmVuIGFuIGlub2RlIG51bWJlciwgdHJ5IHRvIGZpbmQgaWNvdW50CisgKglpbmZvcm1hdGlvbiBpbiB0aGUgc29ydGVkIGxpc3QuICBJZiB0aGUgY3JlYXRlIGZsYWcgaXMgc2V0LAorICoJYW5kIHdlIGNhbid0IGZpbmQgYW4gZW50cnksIGNyZWF0ZSBvbmUgaW4gdGhlIHNvcnRlZCBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IGV4dDJfaWNvdW50X2VsICpnZXRfaWNvdW50X2VsKGV4dDJfaWNvdW50X3QgaWNvdW50LAorCQkJCQkgICAgZXh0Ml9pbm9fdCBpbm8sIGludCBjcmVhdGUpCit7CisJZmxvYXQJcmFuZ2U7CisJaW50CWxvdywgaGlnaCwgbWlkOworCWV4dDJfaW5vX3QJbG93dmFsLCBoaWdodmFsOworCisJaWYgKCFpY291bnQgfHwgIWljb3VudC0+bGlzdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY3JlYXRlICYmICgoaWNvdW50LT5jb3VudCA9PSAwKSB8fAorCQkgICAgICAgKGlubyA+IGljb3VudC0+bGlzdFsodW5zaWduZWQpaWNvdW50LT5jb3VudC0xXS5pbm8pKSkgeworCQlyZXR1cm4gaW5zZXJ0X2ljb3VudF9lbChpY291bnQsIGlubywgKHVuc2lnbmVkKSBpY291bnQtPmNvdW50KTsKKwl9CisJaWYgKGljb3VudC0+Y291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWNvdW50LT5jdXJzb3IgPj0gaWNvdW50LT5jb3VudCkKKwkJaWNvdW50LT5jdXJzb3IgPSAwOworCWlmIChpbm8gPT0gaWNvdW50LT5saXN0W2ljb3VudC0+Y3Vyc29yXS5pbm8pCisJCXJldHVybiAmaWNvdW50LT5saXN0W2ljb3VudC0+Y3Vyc29yKytdOworCWxvdyA9IDA7CisJaGlnaCA9IChpbnQpIGljb3VudC0+Y291bnQtMTsKKwl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJaWYgKGxvdyA9PSBoaWdoKQorCQkJbWlkID0gbG93OworCQllbHNlIHsKKwkJCS8qIEludGVycG9sYXRlIGZvciBlZmZpY2llbmN5ICovCisJCQlsb3d2YWwgPSBpY291bnQtPmxpc3RbbG93XS5pbm87CisJCQloaWdodmFsID0gaWNvdW50LT5saXN0W2hpZ2hdLmlubzsKKworCQkJaWYgKGlubyA8IGxvd3ZhbCkKKwkJCQlyYW5nZSA9IDA7CisJCQllbHNlIGlmIChpbm8gPiBoaWdodmFsKQorCQkJCXJhbmdlID0gMTsKKwkJCWVsc2UKKwkJCQlyYW5nZSA9ICgoZmxvYXQpIChpbm8gLSBsb3d2YWwpKSAvCisJCQkJCShoaWdodmFsIC0gbG93dmFsKTsKKwkJCW1pZCA9IGxvdyArICgoaW50KSAocmFuZ2UgKiAoaGlnaC1sb3cpKSk7CisJCX0KKwkJaWYgKGlubyA9PSBpY291bnQtPmxpc3RbbWlkXS5pbm8pIHsKKwkJCWljb3VudC0+Y3Vyc29yID0gbWlkKzE7CisJCQlyZXR1cm4gJmljb3VudC0+bGlzdFttaWRdOworCQl9CisJCWlmIChpbm8gPCBpY291bnQtPmxpc3RbbWlkXS5pbm8pCisJCQloaWdoID0gbWlkLTE7CisJCWVsc2UKKwkJCWxvdyA9IG1pZCsxOworCX0KKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5LCBpdCBzaG91bGQgYmUgcmlnaHQgYXQKKwkgKiBsb3cgKHdoZXJlIGhpZ2ggd2lsbCBiZSBsZWZ0IGF0IGxvdy0xKS4KKwkgKi8KKwlpZiAoY3JlYXRlKQorCQlyZXR1cm4gaW5zZXJ0X2ljb3VudF9lbChpY291bnQsIGlubywgbG93KTsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19pY291bnRfdmFsaWRhdGUoZXh0Ml9pY291bnRfdCBpY291bnQsIEZJTEUgKm91dCkKK3sKKwllcnJjb2RlX3QJcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQJaTsKKwljb25zdCBjaGFyICpiYWQgPSAiYmFkIGljb3VudCI7CisKKwlFWFQyX0NIRUNLX01BR0lDKGljb3VudCwgRVhUMl9FVF9NQUdJQ19JQ09VTlQpOworCisJaWYgKGljb3VudC0+Y291bnQgPiBpY291bnQtPnNpemUpIHsKKwkJZnByaW50ZihvdXQsICIlczogY291bnQgPiBzaXplXG4iLCBiYWQpOworCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCX0KKwlmb3IgKGk9MTsgaSA8IGljb3VudC0+Y291bnQ7IGkrKykgeworCQlpZiAoaWNvdW50LT5saXN0W2ktMV0uaW5vID49IGljb3VudC0+bGlzdFtpXS5pbm8pIHsKKwkJCWZwcmludGYob3V0LCAiJXM6IGxpc3RbJWRdLmlubz0ldSwgbGlzdFslZF0uaW5vPSV1XG4iLAorCQkJCWJhZCwgaS0xLCBpY291bnQtPmxpc3RbaS0xXS5pbm8sCisJCQkJaSwgaWNvdW50LT5saXN0W2ldLmlubyk7CisJCQlyZXQgPSBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworZXJyY29kZV90IGV4dDJmc19pY291bnRfZmV0Y2goZXh0Ml9pY291bnRfdCBpY291bnQsIGV4dDJfaW5vX3QgaW5vLCBfX3UxNiAqcmV0KQoreworCXN0cnVjdCBleHQyX2ljb3VudF9lbAkqZWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGljb3VudCwgRVhUMl9FVF9NQUdJQ19JQ09VTlQpOworCisJaWYgKCFpbm8gfHwgKGlubyA+IGljb3VudC0+bnVtX2lub2RlcykpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlpZiAoZXh0MmZzX3Rlc3RfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pKSB7CisJCSpyZXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGljb3VudC0+bXVsdGlwbGUgJiYKKwkgICAgIWV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pKSB7CisJCSpyZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAwKTsKKwlpZiAoIWVsKSB7CisJCSpyZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJKnJldCA9IGVsLT5jb3VudDsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19pY291bnRfaW5jcmVtZW50KGV4dDJfaWNvdW50X3QgaWNvdW50LCBleHQyX2lub190IGlubywKKwkJCQkgIF9fdTE2ICpyZXQpCit7CisJc3RydWN0IGV4dDJfaWNvdW50X2VsCSplbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoaWNvdW50LCBFWFQyX0VUX01BR0lDX0lDT1VOVCk7CisKKwlpZiAoIWlubyB8fCAoaW5vID4gaWNvdW50LT5udW1faW5vZGVzKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCWlmIChleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoaWNvdW50LT5zaW5nbGUsIGlubykpIHsKKwkJLyoKKwkJICogSWYgdGhlIGV4aXN0aW5nIGNvdW50IGlzIDEsIHRoZW4gd2Uga25vdyB0aGVyZSBpcworCQkgKiBubyBlbnRyeSBpbiB0aGUgbGlzdC4KKwkJICovCisJCWVsID0gZ2V0X2ljb3VudF9lbChpY291bnQsIGlubywgMSk7CisJCWlmICghZWwpCisJCQlyZXR1cm4gRVhUMl9FVF9OT19NRU1PUlk7CisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCQllbC0+Y291bnQgPSAyOworCX0gZWxzZSBpZiAoaWNvdW50LT5tdWx0aXBsZSkgeworCQkvKgorCQkgKiBUaGUgY291bnQgaXMgZWl0aGVyIHplcm8gb3IgZ3JlYXRlciB0aGFuIDE7IGlmIHRoZQorCQkgKiBpbm9kZSBpcyBzZXQgaW4gaWNvdW50LT5tdWx0aXBsZSwgdGhlbiB0aGVyZSBzaG91bGQKKwkJICogYmUgYW4gZW50cnkgaW4gdGhlIGxpc3QsIHNvIGZpbmQgaXQgdXNpbmcKKwkJICogZ2V0X2ljb3VudF9lbCgpLgorCQkgKi8KKwkJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pKSB7CisJCQllbCA9IGdldF9pY291bnRfZWwoaWNvdW50LCBpbm8sIDEpOworCQkJaWYgKCFlbCkKKwkJCQlyZXR1cm4gRVhUMl9FVF9OT19NRU1PUlk7CisJCQllbC0+Y291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgY291bnQgd2FzIHplcm87IG1hcmsgdGhlIHNpbmdsZSBiaXRtYXAKKwkJCSAqIGFuZCByZXR1cm4uCisJCQkgKi8KKwkJemVyb19jb3VudDoKKwkJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPnNpbmdsZSwgaW5vKTsKKwkJCWlmIChyZXQpCisJCQkJKnJldCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBjb3VudCBpcyBlaXRoZXIgemVybyBvciBncmVhdGVyIHRoYW4gMTsgdHJ5IHRvCisJCSAqIGZpbmQgYW4gZW50cnkgaW4gdGhlIGxpc3QgdG8gZGV0ZXJtaW5lIHdoaWNoLgorCQkgKi8KKwkJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAwKTsKKwkJaWYgKCFlbCkgeworCQkJLyogTm8gZW50cnkgbWVhbnMgdGhlIGNvdW50IHdhcyB6ZXJvICovCisJCQlnb3RvIHplcm9fY291bnQ7CisJCX0KKwkJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAxKTsKKwkJaWYgKCFlbCkKKwkJCXJldHVybiBFWFQyX0VUX05PX01FTU9SWTsKKwkJZWwtPmNvdW50Kys7CisJfQorCWlmIChpY291bnQtPm11bHRpcGxlKQorCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5tdWx0aXBsZSwgaW5vKTsKKwlpZiAocmV0KQorCQkqcmV0ID0gZWwtPmNvdW50OworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9kZWNyZW1lbnQoZXh0Ml9pY291bnRfdCBpY291bnQsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgX191MTYgKnJldCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pY291bnRfZWwJKmVsOworCisJaWYgKCFpbm8gfHwgKGlubyA+IGljb3VudC0+bnVtX2lub2RlcykpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlFWFQyX0NIRUNLX01BR0lDKGljb3VudCwgRVhUMl9FVF9NQUdJQ19JQ09VTlQpOworCisJaWYgKGV4dDJmc190ZXN0X2lub2RlX2JpdG1hcChpY291bnQtPnNpbmdsZSwgaW5vKSkgeworCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPnNpbmdsZSwgaW5vKTsKKwkJaWYgKGljb3VudC0+bXVsdGlwbGUpCisJCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pOworCQllbHNlIHsKKwkJCWVsID0gZ2V0X2ljb3VudF9lbChpY291bnQsIGlubywgMCk7CisJCQlpZiAoZWwpCisJCQkJZWwtPmNvdW50ID0gMDsKKwkJfQorCQlpZiAocmV0KQorCQkJKnJldCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChpY291bnQtPm11bHRpcGxlICYmCisJICAgICFleHQyZnNfdGVzdF9pbm9kZV9iaXRtYXAoaWNvdW50LT5tdWx0aXBsZSwgaW5vKSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCWVsID0gZ2V0X2ljb3VudF9lbChpY291bnQsIGlubywgMCk7CisJaWYgKCFlbCB8fCBlbC0+Y291bnQgPT0gMCkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCWVsLT5jb3VudC0tOworCWlmIChlbC0+Y291bnQgPT0gMSkKKwkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCWlmICgoZWwtPmNvdW50ID09IDApICYmIGljb3VudC0+bXVsdGlwbGUpCisJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUsIGlubyk7CisKKwlpZiAocmV0KQorCQkqcmV0ID0gZWwtPmNvdW50OworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2ljb3VudF9zdG9yZShleHQyX2ljb3VudF90IGljb3VudCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgICBfX3UxNiBjb3VudCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pY291bnRfZWwJKmVsOworCisJaWYgKCFpbm8gfHwgKGlubyA+IGljb3VudC0+bnVtX2lub2RlcykpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlFWFQyX0NIRUNLX01BR0lDKGljb3VudCwgRVhUMl9FVF9NQUdJQ19JQ09VTlQpOworCisJaWYgKGNvdW50ID09IDEpIHsKKwkJZXh0MmZzX21hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCQlpZiAoaWNvdW50LT5tdWx0aXBsZSkKKwkJCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+bXVsdGlwbGUsIGlubyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoY291bnQgPT0gMCkgeworCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPnNpbmdsZSwgaW5vKTsKKwkJaWYgKGljb3VudC0+bXVsdGlwbGUpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgaWNvdW50LT5tdWx0aXBsZSBiaXRtYXAgaXMgZW5hYmxlZCwKKwkJCSAqIHdlIGNhbiBqdXN0IGNsZWFyIGJvdGggYml0bWFwcyBhbmQgd2UncmUgZG9uZQorCQkJICovCisJCQlleHQyZnNfdW5tYXJrX2lub2RlX2JpdG1hcChpY291bnQtPm11bHRpcGxlLCBpbm8pOworCQl9IGVsc2UgeworCQkJZWwgPSBnZXRfaWNvdW50X2VsKGljb3VudCwgaW5vLCAwKTsKKwkJCWlmIChlbCkKKwkJCQllbC0+Y291bnQgPSAwOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogR2V0IHRoZSBpY291bnQgZWxlbWVudAorCSAqLworCWVsID0gZ2V0X2ljb3VudF9lbChpY291bnQsIGlubywgMSk7CisJaWYgKCFlbCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9fTUVNT1JZOworCWVsLT5jb3VudCA9IGNvdW50OworCWV4dDJmc191bm1hcmtfaW5vZGVfYml0bWFwKGljb3VudC0+c2luZ2xlLCBpbm8pOworCWlmIChpY291bnQtPm11bHRpcGxlKQorCQlleHQyZnNfbWFya19pbm9kZV9iaXRtYXAoaWNvdW50LT5tdWx0aXBsZSwgaW5vKTsKKwlyZXR1cm4gMDsKK30KKworZXh0Ml9pbm9fdCBleHQyZnNfZ2V0X2ljb3VudF9zaXplKGV4dDJfaWNvdW50X3QgaWNvdW50KQoreworCWlmICghaWNvdW50IHx8IGljb3VudC0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19JQ09VTlQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGljb3VudC0+c2l6ZTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbWFnZXIuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbWFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjljZmNmCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2ltYWdlci5jCkBAIC0wLDAgKzEsMzc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpbWFnZS5jIC0tLSB3cml0ZXMgb3V0IHRoZSBjcml0aWNhbCBwYXJ0cyBvZiB0aGUgZmlsZXN5c3RlbSBhcyBhCisgKglmbGF0IGZpbGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRoZW9kb3JlIFRzJ28uCisgKgorICogTm90ZTogdGhpcyB1c2VzIHRoZSBQT1NJWCBJTyBpbnRlcmZhY2VzLCB1bmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIKKyAqIGZ1bmN0aW9ucyBpbiB0aGlzIGxpYnJhcnkuICBTbyBzdWUgbWUuCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisjaWZuZGVmIEhBVkVfVFlQRV9TU0laRV9UCit0eXBlZGVmIGludCBzc2l6ZV90OworI2VuZGlmCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiB0aGUgc3BlY2lmaWVkIGJsb2NrIGlzIGFsbCB6ZXJvcworICovCitzdGF0aWMgaW50IGNoZWNrX3plcm9fYmxvY2soY2hhciAqYnVmLCBpbnQgYmxvY2tzaXplKQoreworCWNoYXIJKmNwID0gYnVmOworCWludAlsZWZ0ID0gYmxvY2tzaXplOworCisJd2hpbGUgKGxlZnQgPiAwKSB7CisJCWlmICgqY3ArKykKKwkJCXJldHVybiAwOworCQlsZWZ0LS07CisJfQorCXJldHVybiAxOworfQorCisvKgorICogV3JpdGUgdGhlIGlub2RlIHRhYmxlIG91dCBhcyBhIHNpbmdsZSBibG9jay4KKyAqLworI2RlZmluZSBCVUZfQkxPQ0tTCTMyCisKK2VycmNvZGVfdCBleHQyZnNfaW1hZ2VfaW5vZGVfd3JpdGUoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludAlncm91cCwgbGVmdCwgYywgZDsKKwljaGFyCQkqYnVmLCAqY3A7CisJYmxrX3QJCWJsazsKKwlzc2l6ZV90CQlhY3R1YWw7CisJZXJyY29kZV90CXJldHZhbDsKKworCWJ1ZiA9IHhtYWxsb2MoZnMtPmJsb2Nrc2l6ZSAqIEJVRl9CTE9DS1MpOworCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGdyb3VwKyspIHsKKwkJYmxrID0gZnMtPmdyb3VwX2Rlc2NbKHVuc2lnbmVkKWdyb3VwXS5iZ19pbm9kZV90YWJsZTsKKwkJaWYgKCFibGspCisJCQlyZXR1cm4gRVhUMl9FVF9NSVNTSU5HX0lOT0RFX1RBQkxFOworCQlsZWZ0ID0gZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCXdoaWxlIChsZWZ0KSB7CisJCQljID0gQlVGX0JMT0NLUzsKKwkJCWlmIChjID4gbGVmdCkKKwkJCQljID0gbGVmdDsKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBibGssIGMsIGJ1Zik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyb3V0OworCQkJY3AgPSBidWY7CisJCQl3aGlsZSAoYykgeworCQkJCWlmICghKGZsYWdzICYgSU1BR0VSX0ZMQUdfU1BBUlNFV1JJVEUpKSB7CisJCQkJCWQgPSBjOworCQkJCQlnb3RvIHNraXBfc3BhcnNlOworCQkJCX0KKwkJCQkvKiBTa2lwIHplcm8gYmxvY2tzICovCisJCQkJaWYgKGNoZWNrX3plcm9fYmxvY2soY3AsIGZzLT5ibG9ja3NpemUpKSB7CisJCQkJCWMtLTsKKwkJCQkJYmxrKys7CisJCQkJCWxlZnQtLTsKKwkJCQkJY3AgKz0gZnMtPmJsb2Nrc2l6ZTsKKwkJCQkJbHNlZWsoZmQsIGZzLT5ibG9ja3NpemUsIFNFRUtfQ1VSKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEZpbmQgbm9uLXplcm8gYmxvY2tzICovCisJCQkJZm9yIChkPTE7IGQgPCBjOyBkKyspIHsKKwkJCQkJaWYgKGNoZWNrX3plcm9fYmxvY2soY3AgKyBkKmZzLT5ibG9ja3NpemUsIGZzLT5ibG9ja3NpemUpKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJc2tpcF9zcGFyc2U6CisJCQkJYWN0dWFsID0gd3JpdGUoZmQsIGNwLCBmcy0+YmxvY2tzaXplICogZCk7CisJCQkJaWYgKGFjdHVhbCA9PSAtMSkgeworCQkJCQlyZXR2YWwgPSBlcnJubzsKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJfQorCQkJCWlmIChhY3R1YWwgIT0gKHNzaXplX3QpIChmcy0+YmxvY2tzaXplICogZCkpIHsKKwkJCQkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9XUklURTsKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJfQorCQkJCWJsayArPSBkOworCQkJCWxlZnQgLT0gZDsKKwkJCQljcCArPSBmcy0+YmxvY2tzaXplICogZDsKKwkJCQljIC09IGQ7CisJCQl9CisJCX0KKwl9CisJcmV0dmFsID0gMDsKKworZXJyb3V0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmVhZCBpbiB0aGUgaW5vZGUgdGFibGUgYW5kIHN0dWZmIGl0IGludG8gcGxhY2UKKyAqLworZXJyY29kZV90IGV4dDJmc19pbWFnZV9pbm9kZV9yZWFkKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsCisJCQkJICBpbnQgZmxhZ3MgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCXVuc2lnbmVkIGludAlncm91cCwgYywgbGVmdDsKKwljaGFyCQkqYnVmOworCWJsa190CQlibGs7CisJc3NpemVfdAkJYWN0dWFsOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlidWYgPSB4bWFsbG9jKGZzLT5ibG9ja3NpemUgKiBCVUZfQkxPQ0tTKTsKKworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBncm91cCsrKSB7CisJCWJsayA9IGZzLT5ncm91cF9kZXNjWyh1bnNpZ25lZClncm91cF0uYmdfaW5vZGVfdGFibGU7CisJCWlmICghYmxrKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX01JU1NJTkdfSU5PREVfVEFCTEU7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQlsZWZ0ID0gZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCXdoaWxlIChsZWZ0KSB7CisJCQljID0gQlVGX0JMT0NLUzsKKwkJCWlmIChjID4gbGVmdCkKKwkJCQljID0gbGVmdDsKKwkJCWFjdHVhbCA9IHJlYWQoZmQsIGJ1ZiwgZnMtPmJsb2Nrc2l6ZSAqIGMpOworCQkJaWYgKGFjdHVhbCA9PSAtMSkgeworCQkJCXJldHZhbCA9IGVycm5vOworCQkJCWdvdG8gZXJyb3V0OworCQkJfQorCQkJaWYgKGFjdHVhbCAhPSAoc3NpemVfdCkgKGZzLT5ibG9ja3NpemUgKiBjKSkgeworCQkJCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfUkVBRDsKKwkJCQlnb3RvIGVycm91dDsKKwkJCX0KKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxrLCBjLCBidWYpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycm91dDsKKworCQkJYmxrICs9IGM7CisJCQlsZWZ0IC09IGM7CisJCX0KKwl9CisJcmV0dmFsID0gZXh0MmZzX2ZsdXNoX2ljYWNoZShmcyk7CisKK2Vycm91dDoKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFdyaXRlIG91dCBzdXBlcmJsb2NrIGFuZCBncm91cCBkZXNjcmlwdG9ycworICovCitlcnJjb2RlX3QgZXh0MmZzX2ltYWdlX3N1cGVyX3dyaXRlKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsCisJCQkJICAgaW50IGZsYWdzIEVYVDJGU19BVFRSKCh1bnVzZWQpKSkKK3sKKwljaGFyCQkqYnVmLCAqY3A7CisJc3NpemVfdAkJYWN0dWFsOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlidWYgPSB4bWFsbG9jKGZzLT5ibG9ja3NpemUpOworCisJLyoKKwkgKiBXcml0ZSBvdXQgdGhlIHN1cGVyYmxvY2sKKwkgKi8KKwltZW1zZXQoYnVmLCAwLCBmcy0+YmxvY2tzaXplKTsKKwltZW1jcHkoYnVmLCBmcy0+c3VwZXIsIFNVUEVSQkxPQ0tfU0laRSk7CisJYWN0dWFsID0gd3JpdGUoZmQsIGJ1ZiwgZnMtPmJsb2Nrc2l6ZSk7CisJaWYgKGFjdHVhbCA9PSAtMSkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChhY3R1YWwgIT0gKHNzaXplX3QpIGZzLT5ibG9ja3NpemUpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9XUklURTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJLyoKKwkgKiBOb3cgd3JpdGUgb3V0IHRoZSBibG9jayBncm91cCBkZXNjcmlwdG9ycworCSAqLworCWNwID0gKGNoYXIgKikgZnMtPmdyb3VwX2Rlc2M7CisJYWN0dWFsID0gd3JpdGUoZmQsIGNwLCBmcy0+YmxvY2tzaXplICogZnMtPmRlc2NfYmxvY2tzKTsKKwlpZiAoYWN0dWFsID09IC0xKSB7CisJCXJldHZhbCA9IGVycm5vOworCQlnb3RvIGVycm91dDsKKwl9CisJaWYgKGFjdHVhbCAhPSAoc3NpemVfdCkgKGZzLT5ibG9ja3NpemUgKiBmcy0+ZGVzY19ibG9ja3MpKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfV1JJVEU7CisJCWdvdG8gZXJyb3V0OworCX0KKworCXJldHZhbCA9IDA7CisKK2Vycm91dDoKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJlYWQgdGhlIHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzIGFuZCBvdmVyd3JpdGUgdGhlbS4KKyAqLworZXJyY29kZV90IGV4dDJmc19pbWFnZV9zdXBlcl9yZWFkKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsCisJCQkJICBpbnQgZmxhZ3MgRVhUMkZTX0FUVFIoKHVudXNlZCkpKQoreworCWNoYXIJCSpidWY7CisJc3NpemVfdAkJYWN0dWFsLCBzaXplOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlzaXplID0gZnMtPmJsb2Nrc2l6ZSAqIChmcy0+Z3JvdXBfZGVzY19jb3VudCArIDEpOworCWJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisKKwkvKgorCSAqIFJlYWQgaXQgYWxsIGluLgorCSAqLworCWFjdHVhbCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSk7CisJaWYgKGFjdHVhbCA9PSAtMSkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChhY3R1YWwgIT0gc2l6ZSkgeworCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1JFQUQ7CisJCWdvdG8gZXJyb3V0OworCX0KKworCS8qCisJICogTm93IGNvcHkgaW4gdGhlIHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzCisJICovCisJbWVtY3B5KGZzLT5zdXBlciwgYnVmLCBTVVBFUkJMT0NLX1NJWkUpOworCisJbWVtY3B5KGZzLT5ncm91cF9kZXNjLCBidWYgKyBmcy0+YmxvY2tzaXplLAorCSAgICAgICBmcy0+YmxvY2tzaXplICogZnMtPmdyb3VwX2Rlc2NfY291bnQpOworCisJcmV0dmFsID0gMDsKKworZXJyb3V0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogV3JpdGUgdGhlIGJsb2NrL2lub2RlIGJpdG1hcHMuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfaW1hZ2VfYml0bWFwX3dyaXRlKGV4dDJfZmlsc3lzIGZzLCBpbnQgZmQsIGludCBmbGFncykKK3sKKwljaGFyCQkqcHRyOworCWludAkJYywgc2l6ZTsKKwljaGFyCQl6ZXJvX2J1ZlsxMDI0XTsKKwlzc2l6ZV90CQlhY3R1YWw7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmIChmbGFncyAmIElNQUdFUl9GTEFHX0lOT0RFTUFQKSB7CisJCWlmICghZnMtPmlub2RlX21hcCkgeworCQkJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGVfYml0bWFwKGZzKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlwdHIgPSBmcy0+aW5vZGVfbWFwLT5iaXRtYXA7CisJCXNpemUgPSAoRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcikgLyA4KTsKKwl9IGVsc2UgeworCQlpZiAoIWZzLT5ibG9ja19tYXApIHsKKwkJCXJldHZhbCA9IGV4dDJmc19yZWFkX2Jsb2NrX2JpdG1hcChmcyk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcHRyID0gZnMtPmJsb2NrX21hcC0+Yml0bWFwOworCQlzaXplID0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcikgLyA4OworCX0KKwlzaXplID0gc2l6ZSAqIGZzLT5ncm91cF9kZXNjX2NvdW50OworCisJYWN0dWFsID0gd3JpdGUoZmQsIHB0ciwgc2l6ZSk7CisJaWYgKGFjdHVhbCA9PSAtMSkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChhY3R1YWwgIT0gc2l6ZSkgeworCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1dSSVRFOworCQlnb3RvIGVycm91dDsKKwl9CisJc2l6ZSA9IHNpemUgJSBmcy0+YmxvY2tzaXplOworCW1lbXNldCh6ZXJvX2J1ZiwgMCwgc2l6ZW9mKHplcm9fYnVmKSk7CisJaWYgKHNpemUpIHsKKwkJc2l6ZSA9IGZzLT5ibG9ja3NpemUgLSBzaXplOworCQl3aGlsZSAoc2l6ZSkgeworCQkJYyA9IHNpemU7CisJCQlpZiAoYyA+IChpbnQpIHNpemVvZih6ZXJvX2J1ZikpCisJCQkJYyA9IHNpemVvZih6ZXJvX2J1Zik7CisJCQlhY3R1YWwgPSB3cml0ZShmZCwgemVyb19idWYsIGMpOworCQkJaWYgKGFjdHVhbCA9PSAtMSkgeworCQkJCXJldHZhbCA9IGVycm5vOworCQkJCWdvdG8gZXJyb3V0OworCQkJfQorCQkJaWYgKGFjdHVhbCAhPSBjKSB7CisJCQkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9XUklURTsKKwkJCQlnb3RvIGVycm91dDsKKwkJCX0KKwkJCXNpemUgLT0gYzsKKwkJfQorCX0KKwlyZXR2YWwgPSAwOworZXJyb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGJsb2NrL2lub2RlIGJpdG1hcHMuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfaW1hZ2VfYml0bWFwX3JlYWQoZXh0Ml9maWxzeXMgZnMsIGludCBmZCwgaW50IGZsYWdzKQoreworCWNoYXIJCSpwdHIsICpidWYgPSBOVUxMOworCWludAkJc2l6ZTsKKwlzc2l6ZV90CQlhY3R1YWw7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmIChmbGFncyAmIElNQUdFUl9GTEFHX0lOT0RFTUFQKSB7CisJCWlmICghZnMtPmlub2RlX21hcCkgeworCQkJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGVfYml0bWFwKGZzKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlwdHIgPSBmcy0+aW5vZGVfbWFwLT5iaXRtYXA7CisJCXNpemUgPSAoRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcikgLyA4KTsKKwl9IGVsc2UgeworCQlpZiAoIWZzLT5ibG9ja19tYXApIHsKKwkJCXJldHZhbCA9IGV4dDJmc19yZWFkX2Jsb2NrX2JpdG1hcChmcyk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcHRyID0gZnMtPmJsb2NrX21hcC0+Yml0bWFwOworCQlzaXplID0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcikgLyA4OworCX0KKwlzaXplID0gc2l6ZSAqIGZzLT5ncm91cF9kZXNjX2NvdW50OworCisJYnVmID0geG1hbGxvYyhzaXplKTsKKworCWFjdHVhbCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSk7CisJaWYgKGFjdHVhbCA9PSAtMSkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCWlmIChhY3R1YWwgIT0gc2l6ZSkgeworCQlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1dSSVRFOworCQlnb3RvIGVycm91dDsKKwl9CisJbWVtY3B5KHB0ciwgYnVmLCBzaXplKTsKKworCXJldHZhbCA9IDA7CitlcnJvdXQ6CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5kX2Jsb2NrLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5kX2Jsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwMzgzMAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbmRfYmxvY2suYwpAQCAtMCwwICsxLDY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpbmRfYmxvY2suYyAtLS0gaW5kaXJlY3QgYmxvY2sgSS9PIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorICoJMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBieSAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRfaW5kX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssIHZvaWQgKmJ1ZikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworI2lmIEJCX0JJR19FTkRJQU4KKwlibGtfdAkJKmJsb2NrX25yOworCWludAkJaTsKKwlpbnQJCWxpbWl0ID0gZnMtPmJsb2Nrc2l6ZSA+PiAyOworI2VuZGlmCisKKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKSAmJgorCSAgICAoZnMtPmlvICE9IGZzLT5pbWFnZV9pbykpCisJCW1lbXNldChidWYsIDAsIGZzLT5ibG9ja3NpemUpOworCWVsc2UgeworCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxrLCAxLCBidWYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisjaWYgQkJfQklHX0VORElBTgorCWlmIChmcy0+ZmxhZ3MgJiAoRVhUMl9GTEFHX1NXQVBfQllURVMgfCBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkgeworCQlibG9ja19uciA9IChibGtfdCAqKSBidWY7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBibG9ja19ucisrKQorCQkJKmJsb2NrX25yID0gZXh0MmZzX3N3YWIzMigqYmxvY2tfbnIpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2luZF9ibG9jayhleHQyX2ZpbHN5cyBmcywgYmxrX3QgYmxrLCB2b2lkICpidWYpCit7CisjaWYgQkJfQklHX0VORElBTgorCWJsa190CQkqYmxvY2tfbnI7CisJaW50CQlpOworCWludAkJbGltaXQgPSBmcy0+YmxvY2tzaXplID4+IDI7CisjZW5kaWYKKworCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfSU1BR0VfRklMRSkKKwkJcmV0dXJuIDA7CisKKyNpZiBCQl9CSUdfRU5ESUFOCisJaWYgKGZzLT5mbGFncyAmIChFWFQyX0ZMQUdfU1dBUF9CWVRFUyB8IEVYVDJfRkxBR19TV0FQX0JZVEVTX1dSSVRFKSkgeworCQlibG9ja19uciA9IChibGtfdCAqKSBidWY7CisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBibG9ja19ucisrKQorCQkJKmJsb2NrX25yID0gZXh0MmZzX3N3YWIzMigqYmxvY2tfbnIpOworCX0KKyNlbmRpZgorCXJldHVybiBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsaywgMSwgYnVmKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbml0aWFsaXplLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5pdGlhbGl6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMWQzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5pdGlhbGl6ZS5jCkBAIC0wLDAgKzEsMzg4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpbml0aWFsaXplLmMgLS0tIGluaXRpYWxpemUgYSBmaWxlc3lzdGVtIGhhbmRsZSBnaXZlbiBzdXBlcmJsb2NrCisgKglwYXJhbWV0ZXJzLiAgVXNlZCBieSBta2UyZnMgd2hlbiBpbml0aWFsaXppbmcgYSBmaWxlc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICAgICYmCWRlZmluZWQoRVhUMl9PU19MSU5VWCkKKyNkZWZpbmUgQ1JFQVRPUl9PUyBFWFQyX09TX0xJTlVYCisjZWxzZQorI2lmIGRlZmluZWQoX19HTlVfXykgICAgICYmCWRlZmluZWQoRVhUMl9PU19IVVJEKQorI2RlZmluZSBDUkVBVE9SX09TIEVYVDJfT1NfSFVSRAorI2Vsc2UKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJglkZWZpbmVkKEVYVDJfT1NfRlJFRUJTRCkKKyNkZWZpbmUgQ1JFQVRPUl9PUyBFWFQyX09TX0ZSRUVCU0QKKyNlbHNlCisjaWYgZGVmaW5lZChMSVRFUykJICAgJiYJZGVmaW5lZChFWFQyX09TX0xJVEVTKQorI2RlZmluZSBDUkVBVE9SX09TIEVYVDJfT1NfTElURVMKKyNlbHNlCisjZGVmaW5lIENSRUFUT1JfT1MgRVhUMl9PU19MSU5VWCAvKiBieSBkZWZhdWx0ICovCisjZW5kaWYgLyogZGVmaW5lZChMSVRFUykgJiYgZGVmaW5lZChFWFQyX09TX0xJVEVTKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19GcmVlQlNEX18pICYmIGRlZmluZWQoRVhUMl9PU19GUkVFQlNEKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19HTlVfXykgICAgICYmIGRlZmluZWQoRVhUMl9PU19IVVJEKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19saW51eF9fKSAgICYmIGRlZmluZWQoRVhUMl9PU19MSU5VWCkgKi8KKworLyoKKyAqIE5vdGUgd2Ugb3ZlcnJpZGUgdGhlIGtlcm5lbCBpbmNsdWRlIGZpbGUncyBpZGVhIG9mIHdoYXQgdGhlIGRlZmF1bHQKKyAqIGNoZWNrIGludGVydmFsIChuZXZlcikgc2hvdWxkIGJlLiAgSXQncyBhIGdvb2QgaWRlYSB0byBjaGVjayBhdAorICogbGVhc3QgKm9jY2FzaW9uYWxseSosIHNwZWNpYWxseSBzaW5jZSBzZXJ2ZXJzIHdpbGwgbmV2ZXIgcmFyZWx5IGdldAorICogdG8gcmVib290LCBzaW5jZSBMaW51eCBpcyBzbyByb2J1c3QgdGhlc2UgZGF5cy4gIDotKQorICoKKyAqIDE4MCBkYXlzIChzaXggbW9udGhzKSBzZWVtcyBsaWtlIGEgZ29vZCB2YWx1ZS4KKyAqLworI2lmZGVmIEVYVDJfREZMX0NIRUNLSU5URVJWQUwKKyN1bmRlZiBFWFQyX0RGTF9DSEVDS0lOVEVSVkFMCisjZW5kaWYKKyNkZWZpbmUgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTCAoODY0MDBMICogMTgwTCkKKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIEdEVCBibG9ja3MgdG8gcmVzZXJ2ZSBmb3Igb25saW5lIGZpbGVzeXN0ZW0gZ3Jvd3RoLgorICogVGhlIGFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIEdEVCBibG9ja3Mgd2UgY2FuIHJlc2VydmUgaXMgZGV0ZXJtaW5lZCBieQorICogdGhlIG51bWJlciBvZiBibG9jayBwb2ludGVycyB0aGF0IGNhbiBmaXQgaW50byBhIHNpbmdsZSBibG9jay4KKyAqLworc3RhdGljIGludCBjYWxjX3Jlc2VydmVkX2dkdF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiID0gZnMtPnN1cGVyOworCXVuc2lnbmVkIGxvbmcgYnBnID0gc2ItPnNfYmxvY2tzX3Blcl9ncm91cDsKKwl1bnNpZ25lZCBpbnQgZ2RwYiA9IGZzLT5ibG9ja3NpemUgLyBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyk7CisJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzID0gMHhmZmZmZmZmZjsKKwl1bnNpZ25lZCBsb25nIHJzdl9ncm91cHM7CisJaW50IHJzdl9nZGI7CisKKwkvKiBXZSBzZXQgaXQgYXQgMTAyNHggdGhlIGN1cnJlbnQgZmlsZXN5c3RlbSBzaXplLCBvcgorCSAqIHRoZSB1cHBlciBibG9jayBjb3VudCBsaW1pdCAoMl4zMiksIHdoaWNoZXZlciBpcyBsb3dlci4KKwkgKi8KKwlpZiAoc2ItPnNfYmxvY2tzX2NvdW50IDwgbWF4X2Jsb2NrcyAvIDEwMjQpCisJCW1heF9ibG9ja3MgPSBzYi0+c19ibG9ja3NfY291bnQgKiAxMDI0OworCXJzdl9ncm91cHMgPSAobWF4X2Jsb2NrcyAtIHNiLT5zX2ZpcnN0X2RhdGFfYmxvY2sgKyBicGcgLSAxKSAvIGJwZzsKKwlyc3ZfZ2RiID0gKHJzdl9ncm91cHMgKyBnZHBiIC0gMSkgLyBnZHBiIC0gZnMtPmRlc2NfYmxvY2tzOworCWlmIChyc3ZfZ2RiID4gRVhUMl9BRERSX1BFUl9CTE9DSyhzYikpCisJCXJzdl9nZGIgPSBFWFQyX0FERFJfUEVSX0JMT0NLKHNiKTsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJcHJpbnRmKCJtYXhfYmxvY2tzICVsdSwgcnN2X2dyb3VwcyA9ICVsdSwgcnN2X2dkYiA9ICVsdVxuIiwKKwkgICAgICAgbWF4X2Jsb2NrcywgcnN2X2dyb3VwcywgcnN2X2dkYik7CisjZW5kaWYKKworCXJldHVybiByc3ZfZ2RiOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2luaXRpYWxpemUoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLAorCQkJICAgIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpwYXJhbSwKKwkJCSAgICBpb19tYW5hZ2VyIG1hbmFnZXIsIGV4dDJfZmlsc3lzICpyZXRfZnMpCit7CisJZXh0Ml9maWxzeXMJZnM7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc3VwZXI7CisJaW50CQlmcmFnc19wZXJfYmxvY2s7CisJdW5zaWduZWQgaW50CXJlbTsKKwl1bnNpZ25lZCBpbnQJb3ZlcmhlYWQgPSAwOworCWJsa190CQlncm91cF9ibG9jazsKKwl1bnNpZ25lZCBpbnQJaXBnOworCWRncnBfdAkJaTsKKwlibGtfdAkJbnVtYmxvY2tzOworCWludAkJcnN2X2dkdDsKKwljaGFyCQkqYnVmOworCisJaWYgKCFwYXJhbSB8fCAhcGFyYW0tPnNfYmxvY2tzX2NvdW50KQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfZXh0Ml9maWxzeXMpLCAmZnMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltZW1zZXQoZnMsIDAsIHNpemVvZihzdHJ1Y3Qgc3RydWN0X2V4dDJfZmlsc3lzKSk7CisJZnMtPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTOworCWZzLT5mbGFncyA9IGZsYWdzIHwgRVhUMl9GTEFHX1JXOworCWZzLT51bWFzayA9IDAyMjsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX1NXQVBfQllURVM7CisjZW5kaWYKKwlyZXR2YWwgPSBtYW5hZ2VyLT5vcGVuKG5hbWUsIElPX0ZMQUdfUlcsICZmcy0+aW8pOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlmcy0+aW1hZ2VfaW8gPSBmcy0+aW87CisJZnMtPmlvLT5hcHBfZGF0YSA9IGZzOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihuYW1lKSsxLCAmZnMtPmRldmljZV9uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlzdHJjcHkoZnMtPmRldmljZV9uYW1lLCBuYW1lKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShTVVBFUkJMT0NLX1NJWkUsICZzdXBlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCWZzLT5zdXBlciA9IHN1cGVyOworCisJbWVtc2V0KHN1cGVyLCAwLCBTVVBFUkJMT0NLX1NJWkUpOworCisjZGVmaW5lIHNldF9maWVsZChmaWVsZCwgZGVmYXVsdCkgKHN1cGVyLT5maWVsZCA9IHBhcmFtLT5maWVsZCA/IFwKKwkJCQkgICBwYXJhbS0+ZmllbGQgOiAoZGVmYXVsdCkpCisKKwlzdXBlci0+c19tYWdpYyA9IEVYVDJfU1VQRVJfTUFHSUM7CisJc3VwZXItPnNfc3RhdGUgPSBFWFQyX1ZBTElEX0ZTOworCisJc2V0X2ZpZWxkKHNfbG9nX2Jsb2NrX3NpemUsIDApOwkvKiBkZWZhdWx0IGJsb2Nrc2l6ZTogMTAyNCBieXRlcyAqLworCXNldF9maWVsZChzX2xvZ19mcmFnX3NpemUsIDApOyAvKiBkZWZhdWx0IGZyYWdzaXplOiAxMDI0IGJ5dGVzICovCisJc2V0X2ZpZWxkKHNfZmlyc3RfZGF0YV9ibG9jaywgc3VwZXItPnNfbG9nX2Jsb2NrX3NpemUgPyAwIDogMSk7CisJc2V0X2ZpZWxkKHNfbWF4X21udF9jb3VudCwgRVhUMl9ERkxfTUFYX01OVF9DT1VOVCk7CisJc2V0X2ZpZWxkKHNfZXJyb3JzLCBFWFQyX0VSUk9SU19ERUZBVUxUKTsKKwlzZXRfZmllbGQoc19mZWF0dXJlX2NvbXBhdCwgMCk7CisJc2V0X2ZpZWxkKHNfZmVhdHVyZV9pbmNvbXBhdCwgMCk7CisJc2V0X2ZpZWxkKHNfZmVhdHVyZV9yb19jb21wYXQsIDApOworCXNldF9maWVsZChzX2ZpcnN0X21ldGFfYmcsIDApOworCWlmIChzdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgfkVYVDJfTElCX0ZFQVRVUkVfSU5DT01QQVRfU1VQUCkgeworCQlyZXR2YWwgPSBFWFQyX0VUX1VOU1VQUF9GRUFUVVJFOworCQlnb3RvIGNsZWFudXA7CisJfQorCWlmIChzdXBlci0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIH5FWFQyX0xJQl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfUk9fVU5TVVBQX0ZFQVRVUkU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlzZXRfZmllbGQoc19yZXZfbGV2ZWwsIEVYVDJfR09PRF9PTERfUkVWKTsKKwlpZiAoc3VwZXItPnNfcmV2X2xldmVsID49IEVYVDJfRFlOQU1JQ19SRVYpIHsKKwkJc2V0X2ZpZWxkKHNfZmlyc3RfaW5vLCBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJCXNldF9maWVsZChzX2lub2RlX3NpemUsIEVYVDJfR09PRF9PTERfSU5PREVfU0laRSk7CisJfQorCisJc2V0X2ZpZWxkKHNfY2hlY2tpbnRlcnZhbCwgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTCk7CisJc3VwZXItPnNfbWtmc190aW1lID0gc3VwZXItPnNfbGFzdGNoZWNrID0gdGltZShOVUxMKTsKKworCXN1cGVyLT5zX2NyZWF0b3Jfb3MgPSBDUkVBVE9SX09TOworCisJZnMtPmJsb2Nrc2l6ZSA9IEVYVDJfQkxPQ0tfU0laRShzdXBlcik7CisJZnMtPmZyYWdzaXplID0gRVhUMl9GUkFHX1NJWkUoc3VwZXIpOworCWZyYWdzX3Blcl9ibG9jayA9IGZzLT5ibG9ja3NpemUgLyBmcy0+ZnJhZ3NpemU7CisKKwkvKiBkZWZhdWx0OiAoZnMtPmJsb2Nrc2l6ZSo4KSBibG9ja3MvZ3JvdXAsIHVwIHRvIDJeMTYgKEdEVCBsaW1pdCkgKi8KKwlzZXRfZmllbGQoc19ibG9ja3NfcGVyX2dyb3VwLCBmcy0+YmxvY2tzaXplICogOCk7CisJaWYgKHN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBFWFQyX01BWF9CTE9DS1NfUEVSX0dST1VQKHN1cGVyKSkKKwkJc3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCA9IEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAoc3VwZXIpOworCXN1cGVyLT5zX2ZyYWdzX3Blcl9ncm91cCA9IHN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgKiBmcmFnc19wZXJfYmxvY2s7CisKKwlzdXBlci0+c19ibG9ja3NfY291bnQgPSBwYXJhbS0+c19ibG9ja3NfY291bnQ7CisJc3VwZXItPnNfcl9ibG9ja3NfY291bnQgPSBwYXJhbS0+c19yX2Jsb2Nrc19jb3VudDsKKwlpZiAoc3VwZXItPnNfcl9ibG9ja3NfY291bnQgPj0gcGFyYW0tPnNfYmxvY2tzX2NvdW50KSB7CisJCXJldHZhbCA9IEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogSWYgd2UncmUgY3JlYXRpbmcgYW4gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UsIHdlIGRvbid0IG5lZWQKKwkgKiB0byBib3RoZXIgd2l0aCB0aGUgcmVzdC4KKwkgKi8KKwlpZiAoc3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikgeworCQlmcy0+Z3JvdXBfZGVzY19jb3VudCA9IDA7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJKnJldF9mcyA9IGZzOworCQlyZXR1cm4gMDsKKwl9CisKK3JldHJ5OgorCWZzLT5ncm91cF9kZXNjX2NvdW50ID0gKHN1cGVyLT5zX2Jsb2Nrc19jb3VudCAtCisJCQkJc3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArCisJCQkJRVhUMl9CTE9DS1NfUEVSX0dST1VQKHN1cGVyKSAtIDEpCisJCS8gRVhUMl9CTE9DS1NfUEVSX0dST1VQKHN1cGVyKTsKKwlpZiAoZnMtPmdyb3VwX2Rlc2NfY291bnQgPT0gMCkgeworCQlyZXR2YWwgPSBFWFQyX0VUX1RPT1NNQUxMOworCQlnb3RvIGNsZWFudXA7CisJfQorCWZzLT5kZXNjX2Jsb2NrcyA9IChmcy0+Z3JvdXBfZGVzY19jb3VudCArCisJCQkgICBFWFQyX0RFU0NfUEVSX0JMT0NLKHN1cGVyKSAtIDEpCisJCS8gRVhUMl9ERVNDX1BFUl9CTE9DSyhzdXBlcik7CisKKwlpID0gZnMtPmJsb2Nrc2l6ZSA+PSA0MDk2ID8gMSA6IDQwOTYgLyBmcy0+YmxvY2tzaXplOworCXNldF9maWVsZChzX2lub2Rlc19jb3VudCwgc3VwZXItPnNfYmxvY2tzX2NvdW50IC8gaSk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IEVYVDJfRklSU1RfSU5PICsgMSBpbm9kZXMsIHNvCisJICogdGhhdCB3ZSBoYXZlIGVub3VnaCBpbm9kZXMgZm9yIHRoZSBmaWxlc3lzdGVtKCEpCisJICovCisJaWYgKHN1cGVyLT5zX2lub2Rlc19jb3VudCA8IEVYVDJfRklSU1RfSU5PREUoc3VwZXIpKzEpCisJCXN1cGVyLT5zX2lub2Rlc19jb3VudCA9IEVYVDJfRklSU1RfSU5PREUoc3VwZXIpKzE7CisKKwkvKgorCSAqIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBtYW55IGlub2RlcyBhcyB0aGUgdXNlcgorCSAqIHJlcXVlc3RlZC4gIEZpZ3VyZSBvdXQgaG93IG1hbnkgaW5vZGVzIHBlciBncm91cCB0aGF0CisJICogc2hvdWxkIGJlLiAgQnV0IG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGFsbG9jYXRlIG1vcmUgdGhhbgorCSAqIG9uZSBiaXRtYXAncyB3b3J0aCBvZiBpbm9kZXMgZWFjaCBncm91cC4KKwkgKi8KKwlpcGcgPSAoc3VwZXItPnNfaW5vZGVzX2NvdW50ICsgZnMtPmdyb3VwX2Rlc2NfY291bnQgLSAxKSAvCisJCWZzLT5ncm91cF9kZXNjX2NvdW50OworCWlmIChpcGcgPiBmcy0+YmxvY2tzaXplICogOCkgeworCQlpZiAoc3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCA+PSAyNTYpIHsKKwkJCS8qIFRyeSBhZ2FpbiB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBwYXJhbWV0ZXJzICovCisJCQlzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwIC09IDg7CisJCQlzdXBlci0+c19ibG9ja3NfY291bnQgPSBwYXJhbS0+c19ibG9ja3NfY291bnQ7CisJCQlzdXBlci0+c19mcmFnc19wZXJfZ3JvdXAgPSBzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwICoKKwkJCQlmcmFnc19wZXJfYmxvY2s7CisJCQlnb3RvIHJldHJ5OworCQl9IGVsc2UKKwkJCXJldHVybiBFWFQyX0VUX1RPT19NQU5ZX0lOT0RFUzsKKwl9CisKKwlpZiAoaXBnID4gKHVuc2lnbmVkKSBFWFQyX01BWF9JTk9ERVNfUEVSX0dST1VQKHN1cGVyKSkKKwkJaXBnID0gRVhUMl9NQVhfSU5PREVTX1BFUl9HUk9VUChzdXBlcik7CisKKwlzdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwID0gaXBnOworCWlmIChzdXBlci0+c19pbm9kZXNfY291bnQgPiBpcGcgKiBmcy0+Z3JvdXBfZGVzY19jb3VudCkKKwkJc3VwZXItPnNfaW5vZGVzX2NvdW50ID0gaXBnICogZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgbnVtYmVyIG9mIGlub2RlcyBwZXIgZ3JvdXAgY29tcGxldGVseSBmaWxscworCSAqIHRoZSBpbm9kZSB0YWJsZSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuICBJZiBub3QsIGFkZCBzb21lCisJICogYWRkaXRpb25hbCBpbm9kZXMvZ3JvdXAuICBXYXN0ZSBub3QsIHdhbnQgbm90Li4uCisJICovCisJZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXAgPSAoKChzdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwICoKKwkJCQkJRVhUMl9JTk9ERV9TSVpFKHN1cGVyKSkgKworCQkJCSAgICAgICBFWFQyX0JMT0NLX1NJWkUoc3VwZXIpIC0gMSkgLworCQkJCSAgICAgIEVYVDJfQkxPQ0tfU0laRShzdXBlcikpOworCXN1cGVyLT5zX2lub2Rlc19wZXJfZ3JvdXAgPSAoKGZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwICoKKwkJCQkgICAgICBFWFQyX0JMT0NLX1NJWkUoc3VwZXIpKSAvCisJCQkJICAgICBFWFQyX0lOT0RFX1NJWkUoc3VwZXIpKTsKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGUgbnVtYmVyIG9mIGlub2RlcyBwZXIgZ3JvdXAgaXMgYQorCSAqIG11bHRpcGxlIG9mIDguICBUaGlzIGlzIG5lZWRlZCB0byBzaW1wbGlmeSB0aGUgYml0bWFwCisJICogc3BsaWNpbmcgY29kZS4KKwkgKi8KKwlzdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwICY9IH43OworCWZzLT5pbm9kZV9ibG9ja3NfcGVyX2dyb3VwID0gKCgoc3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cCAqCisJCQkJCUVYVDJfSU5PREVfU0laRShzdXBlcikpICsKKwkJCQkgICAgICAgRVhUMl9CTE9DS19TSVpFKHN1cGVyKSAtIDEpIC8KKwkJCQkgICAgICBFWFQyX0JMT0NLX1NJWkUoc3VwZXIpKTsKKworCS8qCisJICogYWRqdXN0IGlub2RlIGNvdW50IHRvIHJlZmxlY3QgdGhlIGFkanVzdGVkIGlub2Rlc19wZXJfZ3JvdXAKKwkgKi8KKwlzdXBlci0+c19pbm9kZXNfY291bnQgPSBzdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwICoKKwkJZnMtPmdyb3VwX2Rlc2NfY291bnQ7CisJc3VwZXItPnNfZnJlZV9pbm9kZXNfY291bnQgPSBzdXBlci0+c19pbm9kZXNfY291bnQ7CisKKwkvKgorCSAqIGNoZWNrIHRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSBibG9ja3MKKwkgKi8KKwlpZiAoc3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJiBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSkKKwkJcnN2X2dkdCA9IGNhbGNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyhmcyk7CisJZWxzZQorCQlyc3ZfZ2R0ID0gMDsKKwlzZXRfZmllbGQoc19yZXNlcnZlZF9nZHRfYmxvY2tzLCByc3ZfZ2R0KTsKKwlpZiAoc3VwZXItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyA+IEVYVDJfQUREUl9QRVJfQkxPQ0soc3VwZXIpKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfUkVTX0dEVF9CTE9DS1M7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIE92ZXJoZWFkIGlzIHRoZSBudW1iZXIgb2YgYm9va2tlZXBpbmcgYmxvY2tzIHBlciBncm91cC4gIEl0CisJICogaW5jbHVkZXMgdGhlIHN1cGVyYmxvY2sgYmFja3VwLCB0aGUgZ3JvdXAgZGVzY3JpcHRvcgorCSAqIGJhY2t1cHMsIHRoZSBpbm9kZSBiaXRtYXAsIHRoZSBibG9jayBiaXRtYXAsIGFuZCB0aGUgaW5vZGUKKwkgKiB0YWJsZS4KKwkgKi8KKworCW92ZXJoZWFkID0gKGludCkgKDIgKyBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCk7CisKKwlpZiAoZXh0MmZzX2JnX2hhc19zdXBlcihmcywgZnMtPmdyb3VwX2Rlc2NfY291bnQgLSAxKSkKKwkJb3ZlcmhlYWQgKz0gMSArIGZzLT5kZXNjX2Jsb2NrcyArIHN1cGVyLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3M7CisKKwkvKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgdG9vIG1hbnkgaW5vZGVzICovCisJaWYgKG92ZXJoZWFkID4gc3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCkKKwkJcmV0dXJuIEVYVDJfRVRfVE9PX01BTllfSU5PREVTOworCisJLyoKKwkgKiBTZWUgaWYgdGhlIGxhc3QgZ3JvdXAgaXMgYmlnIGVub3VnaCB0byBzdXBwb3J0IHRoZQorCSAqIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMuICBJZiBub3QsIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZgorCSAqIGl0LgorCSAqLworCXJlbSA9ICgoc3VwZXItPnNfYmxvY2tzX2NvdW50IC0gc3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgJQorCSAgICAgICBzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwlpZiAoKGZzLT5ncm91cF9kZXNjX2NvdW50ID09IDEpICYmIHJlbSAmJiAocmVtIDwgb3ZlcmhlYWQpKQorCQlyZXR1cm4gRVhUMl9FVF9UT09TTUFMTDsKKwlpZiAocmVtICYmIChyZW0gPCBvdmVyaGVhZCs1MCkpIHsKKwkJc3VwZXItPnNfYmxvY2tzX2NvdW50IC09IHJlbTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Uga25vdyBob3cgYmlnIHRoZSBmaWxlc3lzdGVtIHdpbGwgYmUuICBTbworCSAqIHdlIGNhbiBkbyBhbnkgYW5kIGFsbCBhbGxvY2F0aW9ucyB0aGF0IGRlcGVuZCBvbiB0aGUgYmxvY2sKKwkgKiBjb3VudC4KKwkgKi8KKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihmcy0+ZGV2aWNlX25hbWUpICsgODAsICZidWYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCXNwcmludGYoYnVmLCAiYmxvY2sgYml0bWFwIGZvciAlcyIsIGZzLT5kZXZpY2VfbmFtZSk7CisJcmV0dmFsID0gZXh0MmZzX2FsbG9jYXRlX2Jsb2NrX2JpdG1hcChmcywgYnVmLCAmZnMtPmJsb2NrX21hcCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJc3ByaW50ZihidWYsICJpbm9kZSBiaXRtYXAgZm9yICVzIiwgZnMtPmRldmljZV9uYW1lKTsKKwlyZXR2YWwgPSBleHQyZnNfYWxsb2NhdGVfaW5vZGVfYml0bWFwKGZzLCBidWYsICZmcy0+aW5vZGVfbWFwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSgoc2l6ZV90KSBmcy0+ZGVzY19ibG9ja3MgKiBmcy0+YmxvY2tzaXplLAorCQkJCSZmcy0+Z3JvdXBfZGVzYyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJbWVtc2V0KGZzLT5ncm91cF9kZXNjLCAwLCAoc2l6ZV90KSBmcy0+ZGVzY19ibG9ja3MgKiBmcy0+YmxvY2tzaXplKTsKKworCS8qCisJICogUmVzZXJ2ZSB0aGUgc3VwZXJibG9jayBhbmQgZ3JvdXAgZGVzY3JpcHRvcnMgZm9yIGVhY2gKKwkgKiBncm91cCwgYW5kIGZpbGwgaW4gdGhlIGNvcnJlY3QgZ3JvdXAgc3RhdGlzdGljcyBmb3IgZ3JvdXAuCisJICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoZSBibG9jayBiaXRtYXAsIGlub2RlIGJpdG1hcCwgYW5kCisJICogaW5vZGUgdGFibGUgaGF2ZSBub3QgYmVlbiBhbGxvY2F0ZWQgKGFuZCBpbiBmYWN0IHdvbid0IGJlCisJICogYnkgdGhpcyByb3V0aW5lKSwgdGhleSBhcmUgYWNjb3VudGVkIGZvciBuZXZlcnRoZWxlc3MuCisJICovCisJZ3JvdXBfYmxvY2sgPSBzdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCXN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGkrKykgeworCQludW1ibG9ja3MgPSBleHQyZnNfcmVzZXJ2ZV9zdXBlcl9hbmRfYmdkKGZzLCBpLCBmcy0+YmxvY2tfbWFwKTsKKworCQlzdXBlci0+c19mcmVlX2Jsb2Nrc19jb3VudCArPSBudW1ibG9ja3M7CisJCWZzLT5ncm91cF9kZXNjW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gbnVtYmxvY2tzOworCQlmcy0+Z3JvdXBfZGVzY1tpXS5iZ19mcmVlX2lub2Rlc19jb3VudCA9CisJCQlmcy0+c3VwZXItPnNfaW5vZGVzX3Blcl9ncm91cDsKKwkJZnMtPmdyb3VwX2Rlc2NbaV0uYmdfdXNlZF9kaXJzX2NvdW50ID0gMDsKKworCQlncm91cF9ibG9jayArPSBzdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworCX0KKworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwlleHQyZnNfbWFya19iYl9kaXJ0eShmcyk7CisJZXh0MmZzX21hcmtfaWJfZGlydHkoZnMpOworCisJaW9fY2hhbm5lbF9zZXRfYmxrc2l6ZShmcy0+aW8sIGZzLT5ibG9ja3NpemUpOworCisJKnJldF9mcyA9IGZzOworCXJldHVybiAwOworY2xlYW51cDoKKwlleHQyZnNfZnJlZShmcyk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbmxpbmUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbmxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU3YjkzCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lubGluZS5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlubGluZS5jIC0tLSBJbmNsdWRlcyB0aGUgaW5saW5lZCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgaGVhZGVyCisgKiBmaWxlcyBhcyBzdGFuZGFsb25lIGZ1bmN0aW9ucywgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbQorICogaXMgY29tcGlsZWQgd2l0aCBpbmxpbmluZyB0dXJuZWQgb2ZmLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjZGVmaW5lIElOQ0xVREVfSU5MSU5FX0ZVTkNTCisjaW5jbHVkZSAiZXh0MmZzLmgiCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5vZGUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWQ1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW5vZGUuYwpAQCAtMCwwICsxLDc2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaW5vZGUuYyAtLS0gdXRpbGl0eSByb3V0aW5lcyB0byByZWFkIGFuZCB3cml0ZSBpbm9kZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzUC5oIgorI2luY2x1ZGUgImUyaW1hZ2UuaCIKKworc3RydWN0IGV4dDJfc3RydWN0X2lub2RlX3NjYW4geworCWVycmNvZGVfdAkJbWFnaWM7CisJZXh0Ml9maWxzeXMJCWZzOworCWV4dDJfaW5vX3QJCWN1cnJlbnRfaW5vZGU7CisJYmxrX3QJCQljdXJyZW50X2Jsb2NrOworCWRncnBfdAkJCWN1cnJlbnRfZ3JvdXA7CisJZXh0Ml9pbm9fdAkJaW5vZGVzX2xlZnQ7CisJYmxrX3QJCQlibG9ja3NfbGVmdDsKKwlkZ3JwX3QJCQlncm91cHNfbGVmdDsKKwlibGtfdAkJCWlub2RlX2J1ZmZlcl9ibG9ja3M7CisJY2hhciAqCQkJaW5vZGVfYnVmZmVyOworCWludAkJCWlub2RlX3NpemU7CisJY2hhciAqCQkJcHRyOworCWludAkJCWJ5dGVzX2xlZnQ7CisJY2hhcgkJCSp0ZW1wX2J1ZmZlcjsKKwllcnJjb2RlX3QJCSgqZG9uZV9ncm91cCkoZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgICAgIGRncnBfdCBncm91cCwKKwkJCQkJICAgICAgdm9pZCAqIHByaXZfZGF0YSk7CisJdm9pZCAqCQkJZG9uZV9ncm91cF9kYXRhOworCWludAkJCWJhZF9ibG9ja19wdHI7CisJaW50CQkJc2Nhbl9mbGFnczsKKwlpbnQJCQlyZXNlcnZlZFs2XTsKK307CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZmx1c2hlcyB0aGUgaWNhY2hlLCBpZiBpdCBleGlzdHMuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfZmx1c2hfaWNhY2hlKGV4dDJfZmlsc3lzIGZzKQoreworCWludAlpOworCisJaWYgKCFmcy0+aWNhY2hlKQorCQlyZXR1cm4gMDsKKworCWZvciAoaT0wOyBpIDwgZnMtPmljYWNoZS0+Y2FjaGVfc2l6ZTsgaSsrKQorCQlmcy0+aWNhY2hlLT5jYWNoZVtpXS5pbm8gPSAwOworCisJZnMtPmljYWNoZS0+YnVmZmVyX2JsayA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgY3JlYXRlX2ljYWNoZShleHQyX2ZpbHN5cyBmcykKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJaWYgKGZzLT5pY2FjaGUpCisJCXJldHVybiAwOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZSksICZmcy0+aWNhY2hlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJbWVtc2V0KGZzLT5pY2FjaGUsIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZV9jYWNoZSkpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZmcy0+aWNhY2hlLT5idWZmZXIpOworCWlmIChyZXR2YWwpIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZmcy0+aWNhY2hlKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJZnMtPmljYWNoZS0+YnVmZmVyX2JsayA9IDA7CisJZnMtPmljYWNoZS0+Y2FjaGVfbGFzdCA9IC0xOworCWZzLT5pY2FjaGUtPmNhY2hlX3NpemUgPSA0OworCWZzLT5pY2FjaGUtPnJlZmNvdW50ID0gMTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfY2FjaGVfZW50KQorCQkJCSogZnMtPmljYWNoZS0+Y2FjaGVfc2l6ZSwKKwkJCQkmZnMtPmljYWNoZS0+Y2FjaGUpOworCWlmIChyZXR2YWwpIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZmcy0+aWNhY2hlLT5idWZmZXIpOworCQlleHQyZnNfZnJlZV9tZW0oJmZzLT5pY2FjaGUpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlleHQyZnNfZmx1c2hfaWNhY2hlKGZzKTsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19vcGVuX2lub2RlX3NjYW4oZXh0Ml9maWxzeXMgZnMsIGludCBidWZmZXJfYmxvY2tzLAorCQkJCSBleHQyX2lub2RlX3NjYW4gKnJldF9zY2FuKQoreworCWV4dDJfaW5vZGVfc2NhbglzY2FuOworCWVycmNvZGVfdAlyZXR2YWw7CisJZXJyY29kZV90ICgqc2F2ZV9nZXRfYmxvY2tzKShleHQyX2ZpbHN5cyBmLCBleHQyX2lub190IGlubywgYmxrX3QgKmJsb2Nrcyk7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJLyoKKwkgKiBJZiBmcy0+YmFkYmxvY2tzIGlzbid0IHNldCwgdGhlbiBzZXQgaXQgLS0tIHNpbmNlIHRoZSBpbm9kZQorCSAqIHNjYW5uaW5nIGZ1bmN0aW9ucyByZXF1aXJlIGl0LgorCSAqLworCWlmIChmcy0+YmFkYmxvY2tzID09IDApIHsKKwkJLyoKKwkJICogVGVtcG9yYXJseSBzYXZlIGZzLT5nZXRfYmxvY2tzIGFuZCBzZXQgaXQgdG8gemVybywKKwkJICogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZTJmc2NrJ3MuCisJCSAqLworCQlzYXZlX2dldF9ibG9ja3MgPSBmcy0+Z2V0X2Jsb2NrczsKKwkJZnMtPmdldF9ibG9ja3MgPSAwOworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9iYl9pbm9kZShmcywgJmZzLT5iYWRibG9ja3MpOworCQlpZiAocmV0dmFsKSB7CisJCQlleHQyZnNfYmFkYmxvY2tzX2xpc3RfZnJlZShmcy0+YmFkYmxvY2tzKTsKKwkJCWZzLT5iYWRibG9ja3MgPSAwOworCQl9CisJCWZzLT5nZXRfYmxvY2tzID0gc2F2ZV9nZXRfYmxvY2tzOworCX0KKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgZXh0Ml9zdHJ1Y3RfaW5vZGVfc2NhbiksICZzY2FuKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGV4dDJfc3RydWN0X2lub2RlX3NjYW4pKTsKKworCXNjYW4tPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JTk9ERV9TQ0FOOworCXNjYW4tPmZzID0gZnM7CisJc2Nhbi0+aW5vZGVfc2l6ZSA9IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCXNjYW4tPmJ5dGVzX2xlZnQgPSAwOworCXNjYW4tPmN1cnJlbnRfZ3JvdXAgPSAwOworCXNjYW4tPmdyb3Vwc19sZWZ0ID0gZnMtPmdyb3VwX2Rlc2NfY291bnQgLSAxOworCXNjYW4tPmlub2RlX2J1ZmZlcl9ibG9ja3MgPSBidWZmZXJfYmxvY2tzID8gYnVmZmVyX2Jsb2NrcyA6IDg7CisJc2Nhbi0+Y3VycmVudF9ibG9jayA9IHNjYW4tPmZzLT4KKwkJZ3JvdXBfZGVzY1tzY2FuLT5jdXJyZW50X2dyb3VwXS5iZ19pbm9kZV90YWJsZTsKKwlzY2FuLT5pbm9kZXNfbGVmdCA9IEVYVDJfSU5PREVTX1BFUl9HUk9VUChzY2FuLT5mcy0+c3VwZXIpOworCXNjYW4tPmJsb2Nrc19sZWZ0ID0gc2Nhbi0+ZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oKHNpemVfdCkgKHNjYW4tPmlub2RlX2J1ZmZlcl9ibG9ja3MgKgorCQkJCQkgIGZzLT5ibG9ja3NpemUpLAorCQkJCSZzY2FuLT5pbm9kZV9idWZmZXIpOworCXNjYW4tPmRvbmVfZ3JvdXAgPSAwOworCXNjYW4tPmRvbmVfZ3JvdXBfZGF0YSA9IDA7CisJc2Nhbi0+YmFkX2Jsb2NrX3B0ciA9IDA7CisJaWYgKHJldHZhbCkgeworCQlleHQyZnNfZnJlZV9tZW0oJnNjYW4pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzY2FuLT5pbm9kZV9zaXplLCAmc2Nhbi0+dGVtcF9idWZmZXIpOworCWlmIChyZXR2YWwpIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZzY2FuLT5pbm9kZV9idWZmZXIpOworCQlleHQyZnNfZnJlZV9tZW0oJnNjYW4pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAoc2Nhbi0+ZnMtPmJhZGJsb2NrcyAmJiBzY2FuLT5mcy0+YmFkYmxvY2tzLT5udW0pCisJCXNjYW4tPnNjYW5fZmxhZ3MgfD0gRVhUMl9TRl9DSEtfQkFEQkxPQ0tTOworCSpyZXRfc2NhbiA9IHNjYW47CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXh0MmZzX2Nsb3NlX2lub2RlX3NjYW4oZXh0Ml9pbm9kZV9zY2FuIHNjYW4pCit7CisJaWYgKCFzY2FuIHx8IChzY2FuLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0lOT0RFX1NDQU4pKQorCQlyZXR1cm47CisKKwlleHQyZnNfZnJlZV9tZW0oJnNjYW4tPmlub2RlX2J1ZmZlcik7CisJc2Nhbi0+aW5vZGVfYnVmZmVyID0gTlVMTDsKKwlleHQyZnNfZnJlZV9tZW0oJnNjYW4tPnRlbXBfYnVmZmVyKTsKKwlzY2FuLT50ZW1wX2J1ZmZlciA9IE5VTEw7CisJZXh0MmZzX2ZyZWVfbWVtKCZzY2FuKTsKK30KKwordm9pZCBleHQyZnNfc2V0X2lub2RlX2NhbGxiYWNrKGV4dDJfaW5vZGVfc2NhbiBzY2FuLAorCQkJICAgICAgIGVycmNvZGVfdCAoKmRvbmVfZ3JvdXApKGV4dDJfZmlsc3lzIGZzLAorCQkJCQkJICAgICAgIGRncnBfdCBncm91cCwKKwkJCQkJCSAgICAgICB2b2lkICogcHJpdl9kYXRhKSwKKwkJCSAgICAgICB2b2lkICpkb25lX2dyb3VwX2RhdGEpCit7CisJaWYgKCFzY2FuIHx8IChzY2FuLT5tYWdpYyAhPSBFWFQyX0VUX01BR0lDX0lOT0RFX1NDQU4pKQorCQlyZXR1cm47CisKKwlzY2FuLT5kb25lX2dyb3VwID0gZG9uZV9ncm91cDsKKwlzY2FuLT5kb25lX2dyb3VwX2RhdGEgPSBkb25lX2dyb3VwX2RhdGE7Cit9CisKK2ludCBleHQyZnNfaW5vZGVfc2Nhbl9mbGFncyhleHQyX2lub2RlX3NjYW4gc2NhbiwgaW50IHNldF9mbGFncywKKwkJCSAgICBpbnQgY2xlYXJfZmxhZ3MpCit7CisJaW50CW9sZF9mbGFnczsKKworCWlmICghc2NhbiB8fCAoc2Nhbi0+bWFnaWMgIT0gRVhUMl9FVF9NQUdJQ19JTk9ERV9TQ0FOKSkKKwkJcmV0dXJuIDA7CisKKwlvbGRfZmxhZ3MgPSBzY2FuLT5zY2FuX2ZsYWdzOworCXNjYW4tPnNjYW5fZmxhZ3MgJj0gfmNsZWFyX2ZsYWdzOworCXNjYW4tPnNjYW5fZmxhZ3MgfD0gc2V0X2ZsYWdzOworCXJldHVybiBvbGRfZmxhZ3M7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBleHQyZnNfZ2V0X25leHRfaW5vZGUgd2hlbiBpdCBuZWVkcyB0bworICogZ2V0IHJlYWR5IHRvIHJlYWQgaW4gYSBuZXcgYmxvY2tncm91cC4KKyAqLworc3RhdGljIGVycmNvZGVfdCBnZXRfbmV4dF9ibG9ja2dyb3VwKGV4dDJfaW5vZGVfc2NhbiBzY2FuKQoreworCXNjYW4tPmN1cnJlbnRfZ3JvdXArKzsKKwlzY2FuLT5ncm91cHNfbGVmdC0tOworCisJc2Nhbi0+Y3VycmVudF9ibG9jayA9IHNjYW4tPmZzLT4KKwkJZ3JvdXBfZGVzY1tzY2FuLT5jdXJyZW50X2dyb3VwXS5iZ19pbm9kZV90YWJsZTsKKworCXNjYW4tPmN1cnJlbnRfaW5vZGUgPSBzY2FuLT5jdXJyZW50X2dyb3VwICoKKwkJRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNjYW4tPmZzLT5zdXBlcik7CisKKwlzY2FuLT5ieXRlc19sZWZ0ID0gMDsKKwlzY2FuLT5pbm9kZXNfbGVmdCA9IEVYVDJfSU5PREVTX1BFUl9HUk9VUChzY2FuLT5mcy0+c3VwZXIpOworCXNjYW4tPmJsb2Nrc19sZWZ0ID0gc2Nhbi0+ZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfaW5vZGVfc2Nhbl9nb3RvX2Jsb2NrZ3JvdXAoZXh0Ml9pbm9kZV9zY2FuIHNjYW4sCisJCQkJCSAgICBpbnQJZ3JvdXApCit7CisJc2Nhbi0+Y3VycmVudF9ncm91cCA9IGdyb3VwIC0gMTsKKwlzY2FuLT5ncm91cHNfbGVmdCA9IHNjYW4tPmZzLT5ncm91cF9kZXNjX2NvdW50IC0gZ3JvdXA7CisJcmV0dXJuIGdldF9uZXh0X2Jsb2NrZ3JvdXAoc2Nhbik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBnZXRfbmV4dF9ibG9ja3MoKSB0byBjaGVjayBmb3IgYmFkCisgKiBibG9ja3MgaW4gdGhlIGlub2RlIHRhYmxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGJhZGJsb2Nrc19saXN0LT5saXN0IGlzIHNvcnRlZCBpbgorICogaW5jcmVhc2luZyBvcmRlci4KKyAqLworc3RhdGljIGVycmNvZGVfdCBjaGVja19mb3JfaW5vZGVfYmFkX2Jsb2NrcyhleHQyX2lub2RlX3NjYW4gc2NhbiwKKwkJCQkJICAgIGJsa190ICpudW1fYmxvY2tzKQoreworCWJsa190CWJsayA9IHNjYW4tPmN1cnJlbnRfYmxvY2s7CisJYmFkYmxvY2tzX2xpc3QJYmIgPSBzY2FuLT5mcy0+YmFkYmxvY2tzOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgdGFibGUgaXMgbWlzc2luZywgdGhlbiBvYnZpb3VzbHkgdGhlcmUgYXJlIG5vCisJICogYmFkIGJsb2Nrcy4gIDotKQorCSAqLworCWlmIChibGsgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IGJsb2NrIGlzIGdyZWF0ZXIgdGhhbiB0aGUgYmFkIGJsb2NrIGxpc3RlZAorCSAqIGluIHRoZSBiYWQgYmxvY2sgbGlzdCwgdGhlbiBhZHZhbmNlIHRoZSBwb2ludGVyIHVudGlsIHRoaXMKKwkgKiBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBJZiB3ZSBydW4gb3V0IG9mIGJhZCBibG9ja3MsIHRoZW4KKwkgKiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBtb3JlIGNoZWNraW5nIQorCSAqLworCXdoaWxlIChibGsgPiBiYi0+bGlzdFtzY2FuLT5iYWRfYmxvY2tfcHRyXSkgeworCQlpZiAoKytzY2FuLT5iYWRfYmxvY2tfcHRyID49IGJiLT5udW0pIHsKKwkJCXNjYW4tPnNjYW5fZmxhZ3MgJj0gfkVYVDJfU0ZfQ0hLX0JBREJMT0NLUzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBibG9jayBpcyBlcXVhbCB0byB0aGUgYmFkIGJsb2NrIGxpc3RlZCBpbgorCSAqIHRoZSBiYWQgYmxvY2sgbGlzdCwgdGhlbiBoYW5kbGUgdGhhdCBvbmUgYmxvY2sgc3BlY2lhbGx5LgorCSAqIChXZSBjb3VsZCB0cnkgdG8gaGFuZGxlIHJ1bnMgb2YgYmFkIGJsb2NrcywgYnV0IHRoYXQKKwkgKiBvbmx5IGluY3JlYXNlcyBDUFUgZWZmaWNpZW5jeSBieSBhIHNtYWxsIGFtb3VudCwgYXQgdGhlCisJICogZXhwZW5zZSBvZiBhIGh1Z2UgZXhwZW5zZSBvZiBjb2RlIGNvbXBsZXhpdHksIGFuZCBmb3IgYW4KKwkgKiB1bmNvbW1vbiBjYXNlIGF0IHRoYXQuKQorCSAqLworCWlmIChibGsgPT0gYmItPmxpc3Rbc2Nhbi0+YmFkX2Jsb2NrX3B0cl0pIHsKKwkJc2Nhbi0+c2Nhbl9mbGFncyB8PSBFWFQyX1NGX0JBRF9JTk9ERV9CTEs7CisJCSpudW1fYmxvY2tzID0gMTsKKwkJaWYgKCsrc2Nhbi0+YmFkX2Jsb2NrX3B0ciA+PSBiYi0+bnVtKQorCQkJc2Nhbi0+c2Nhbl9mbGFncyAmPSB+RVhUMl9TRl9DSEtfQkFEQkxPQ0tTOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgYmFkIGJsb2NrIGluIHRoZSByYW5nZSB0aGF0IHdlJ3JlIGFib3V0IHRvCisJICogcmVhZCBpbiwgYWRqdXN0IHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIHJlYWQgc28gdGhhdCB3ZSB3ZQorCSAqIGRvbid0IHJlYWQgaW4gdGhlIGJhZCBibG9jay4gIChUaGVuIHRoZSBuZXh0IGJsb2NrIHRvIHJlYWQKKwkgKiB3aWxsIGJlIHRoZSBiYWQgYmxvY2ssIHdoaWNoIGlzIGhhbmRsZWQgaW4gdGhlIGFib3ZlIGNhc2UuKQorCSAqLworCWlmICgoYmxrICsgKm51bV9ibG9ja3MpID4gYmItPmxpc3Rbc2Nhbi0+YmFkX2Jsb2NrX3B0cl0pCisJCSpudW1fYmxvY2tzID0gKGludCkgKGJiLT5saXN0W3NjYW4tPmJhZF9ibG9ja19wdHJdIC0gYmxrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXh0MmZzX2dldF9uZXh0X2lub2RlIHdoZW4gaXQgbmVlZHMgdG8KKyAqIHJlYWQgaW4gbW9yZSBibG9ja3MgZnJvbSB0aGUgY3VycmVudCBibG9ja2dyb3VwJ3MgaW5vZGUgdGFibGUuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgZ2V0X25leHRfYmxvY2tzKGV4dDJfaW5vZGVfc2NhbiBzY2FuKQoreworCWJsa190CQludW1fYmxvY2tzOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgYmxvY2tzIHRvIHJlYWQ7IHdlIHJlYWQgYXQgbW9zdAorCSAqIGlub2RlX2J1ZmZlcl9ibG9ja3MsIGFuZCBwZXJoYXBzIGxlc3MgaWYgdGhlcmUgYXJlbid0IHRoYXQKKwkgKiBtYW55IGJsb2NrcyBsZWZ0IHRvIHJlYWQuCisJICovCisJbnVtX2Jsb2NrcyA9IHNjYW4tPmlub2RlX2J1ZmZlcl9ibG9ja3M7CisJaWYgKG51bV9ibG9ja3MgPiBzY2FuLT5ibG9ja3NfbGVmdCkKKwkJbnVtX2Jsb2NrcyA9IHNjYW4tPmJsb2Nrc19sZWZ0OworCisJLyoKKwkgKiBJZiB0aGUgcGFzdCBibG9jayAicmVhZCIgd2FzIGEgYmFkIGJsb2NrLCB0aGVuIG1hcmsgdGhlCisJICogbGVmdC1vdmVyIGV4dHJhIGJ5dGVzIGFzIGFsc28gYmVpbmcgYmFkLgorCSAqLworCWlmIChzY2FuLT5zY2FuX2ZsYWdzICYgRVhUMl9TRl9CQURfSU5PREVfQkxLKSB7CisJCWlmIChzY2FuLT5ieXRlc19sZWZ0KQorCQkJc2Nhbi0+c2Nhbl9mbGFncyB8PSBFWFQyX1NGX0JBRF9FWFRSQV9CWVRFUzsKKwkJc2Nhbi0+c2Nhbl9mbGFncyAmPSB+RVhUMl9TRl9CQURfSU5PREVfQkxLOworCX0KKworCS8qCisJICogRG8gaW5vZGUgYmFkIGJsb2NrIHByb2Nlc3NpbmcsIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoc2Nhbi0+c2Nhbl9mbGFncyAmIEVYVDJfU0ZfQ0hLX0JBREJMT0NLUykgeworCQlyZXR2YWwgPSBjaGVja19mb3JfaW5vZGVfYmFkX2Jsb2NrcyhzY2FuLCAmbnVtX2Jsb2Nrcyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmICgoc2Nhbi0+c2Nhbl9mbGFncyAmIEVYVDJfU0ZfQkFEX0lOT0RFX0JMSykgfHwKKwkgICAgKHNjYW4tPmN1cnJlbnRfYmxvY2sgPT0gMCkpIHsKKwkJbWVtc2V0KHNjYW4tPmlub2RlX2J1ZmZlciwgMCwKKwkJICAgICAgIChzaXplX3QpIG51bV9ibG9ja3MgKiBzY2FuLT5mcy0+YmxvY2tzaXplKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKHNjYW4tPmZzLT5pbywKKwkJCQkJICAgICBzY2FuLT5jdXJyZW50X2Jsb2NrLAorCQkJCQkgICAgIChpbnQpIG51bV9ibG9ja3MsCisJCQkJCSAgICAgc2Nhbi0+aW5vZGVfYnVmZmVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiBFWFQyX0VUX05FWFRfSU5PREVfUkVBRDsKKwl9CisJc2Nhbi0+cHRyID0gc2Nhbi0+aW5vZGVfYnVmZmVyOworCXNjYW4tPmJ5dGVzX2xlZnQgPSBudW1fYmxvY2tzICogc2Nhbi0+ZnMtPmJsb2Nrc2l6ZTsKKworCXNjYW4tPmJsb2Nrc19sZWZ0IC09IG51bV9ibG9ja3M7CisJaWYgKHNjYW4tPmN1cnJlbnRfYmxvY2spCisJCXNjYW4tPmN1cnJlbnRfYmxvY2sgKz0gbnVtX2Jsb2NrczsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19nZXRfbmV4dF9pbm9kZV9mdWxsKGV4dDJfaW5vZGVfc2NhbiBzY2FuLCBleHQyX2lub190ICppbm8sCisJCQkJICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUsIGludCBidWZzaXplKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJaW50CQlleHRyYV9ieXRlcyA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKHNjYW4sIEVYVDJfRVRfTUFHSUNfSU5PREVfU0NBTik7CisKKwkvKgorCSAqIERvIHdlIG5lZWQgdG8gc3RhcnQgcmVhZGluZyBhIG5ldyBibG9jayBncm91cD8KKwkgKi8KKwlpZiAoc2Nhbi0+aW5vZGVzX2xlZnQgPD0gMCkgeworCWZvcmNlX25ld19ncm91cDoKKwkJaWYgKHNjYW4tPmRvbmVfZ3JvdXApIHsKKwkJCXJldHZhbCA9IChzY2FuLT5kb25lX2dyb3VwKQorCQkJCShzY2FuLT5mcywgc2Nhbi0+Y3VycmVudF9ncm91cCwKKwkJCQkgc2Nhbi0+ZG9uZV9ncm91cF9kYXRhKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAoc2Nhbi0+Z3JvdXBzX2xlZnQgPD0gMCkgeworCQkJKmlubyA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR2YWwgPSBnZXRfbmV4dF9ibG9ja2dyb3VwKHNjYW4pOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyoKKwkgKiBUaGlzIGlzIGRvbmUgb3V0c2lkZSB0aGUgYWJvdmUgaWYgc3RhdGVtZW50IHNvIHRoYXQgdGhlCisJICogY2hlY2sgY2FuIGJlIGRvbmUgZm9yIGJsb2NrIGdyb3VwICMwLgorCSAqLworCWlmIChzY2FuLT5jdXJyZW50X2Jsb2NrID09IDApIHsKKwkJaWYgKHNjYW4tPnNjYW5fZmxhZ3MgJiBFWFQyX1NGX1NLSVBfTUlTU0lOR19JVEFCTEUpIHsKKwkJCWdvdG8gZm9yY2VfbmV3X2dyb3VwOworCQl9IGVsc2UKKwkJCXJldHVybiBFWFQyX0VUX01JU1NJTkdfSU5PREVfVEFCTEU7CisJfQorCisKKwkvKgorCSAqIEhhdmUgd2UgcnVuIG91dCBvZiBzcGFjZSBpbiB0aGUgaW5vZGUgYnVmZmVyPyAgSWYgc28sIHdlCisJICogbmVlZCB0byByZWFkIGluIG1vcmUgYmxvY2tzLgorCSAqLworCWlmIChzY2FuLT5ieXRlc19sZWZ0IDwgc2Nhbi0+aW5vZGVfc2l6ZSkgeworCQltZW1jcHkoc2Nhbi0+dGVtcF9idWZmZXIsIHNjYW4tPnB0ciwgc2Nhbi0+Ynl0ZXNfbGVmdCk7CisJCWV4dHJhX2J5dGVzID0gc2Nhbi0+Ynl0ZXNfbGVmdDsKKworCQlyZXR2YWwgPSBnZXRfbmV4dF9ibG9ja3Moc2Nhbik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworI2lmIDAKKwkJLyoKKwkJICogWFhYIHRlc3QgIE5lZWQgY2hlY2sgZm9yIHVzZWQgaW5vZGUgc29tZWhvdy4KKwkJICogKE5vdGU6IHRoaXMgaXMgaGFyZC4pCisJCSAqLworCQlpZiAoaXNfZW1wdHlfc2NhbihzY2FuKSkKKwkJCWdvdG8gZm9yY2VfbmV3X2dyb3VwOworI2VuZGlmCisJfQorCisJcmV0dmFsID0gMDsKKwlpZiAoZXh0cmFfYnl0ZXMpIHsKKwkJbWVtY3B5KHNjYW4tPnRlbXBfYnVmZmVyK2V4dHJhX2J5dGVzLCBzY2FuLT5wdHIsCisJCSAgICAgICBzY2FuLT5pbm9kZV9zaXplIC0gZXh0cmFfYnl0ZXMpOworCQlzY2FuLT5wdHIgKz0gc2Nhbi0+aW5vZGVfc2l6ZSAtIGV4dHJhX2J5dGVzOworCQlzY2FuLT5ieXRlc19sZWZ0IC09IHNjYW4tPmlub2RlX3NpemUgLSBleHRyYV9ieXRlczsKKworI2lmIEJCX0JJR19FTkRJQU4KKwkJaWYgKChzY2FuLT5mcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJICAgIChzY2FuLT5mcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkKKwkJCWV4dDJmc19zd2FwX2lub2RlX2Z1bGwoc2Nhbi0+ZnMsCisJCQkJKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGlub2RlLAorCQkJCShzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBzY2FuLT50ZW1wX2J1ZmZlciwKKwkJCQkwLCBidWZzaXplKTsKKwkJZWxzZQorI2VuZGlmCisJCQkqaW5vZGUgPSAqKChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKSBzY2FuLT50ZW1wX2J1ZmZlcik7CisJCWlmIChzY2FuLT5zY2FuX2ZsYWdzICYgRVhUMl9TRl9CQURfRVhUUkFfQllURVMpCisJCQlyZXR2YWwgPSBFWFQyX0VUX0JBRF9CTE9DS19JTl9JTk9ERV9UQUJMRTsKKwkJc2Nhbi0+c2Nhbl9mbGFncyAmPSB+RVhUMl9TRl9CQURfRVhUUkFfQllURVM7CisJfSBlbHNlIHsKKyNpZiBCQl9CSUdfRU5ESUFOCisJCWlmICgoc2Nhbi0+ZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJCSAgICAoc2Nhbi0+ZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkpCisJCQlleHQyZnNfc3dhcF9pbm9kZV9mdWxsKHNjYW4tPmZzLAorCQkJCShzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBpbm9kZSwKKwkJCQkoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKikgc2Nhbi0+cHRyLAorCQkJCTAsIGJ1ZnNpemUpOworCQllbHNlCisjZW5kaWYKKwkJCW1lbWNweShpbm9kZSwgc2Nhbi0+cHRyLCBidWZzaXplKTsKKwkJc2Nhbi0+cHRyICs9IHNjYW4tPmlub2RlX3NpemU7CisJCXNjYW4tPmJ5dGVzX2xlZnQgLT0gc2Nhbi0+aW5vZGVfc2l6ZTsKKwkJaWYgKHNjYW4tPnNjYW5fZmxhZ3MgJiBFWFQyX1NGX0JBRF9JTk9ERV9CTEspCisJCQlyZXR2YWwgPSBFWFQyX0VUX0JBRF9CTE9DS19JTl9JTk9ERV9UQUJMRTsKKwl9CisKKwlzY2FuLT5pbm9kZXNfbGVmdC0tOworCXNjYW4tPmN1cnJlbnRfaW5vZGUrKzsKKwkqaW5vID0gc2Nhbi0+Y3VycmVudF9pbm9kZTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2dldF9uZXh0X2lub2RlKGV4dDJfaW5vZGVfc2NhbiBzY2FuLCBleHQyX2lub190ICppbm8sCisJCQkJc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQoreworCXJldHVybiBleHQyZnNfZ2V0X25leHRfaW5vZGVfZnVsbChzY2FuLCBpbm8sIGlub2RlLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgYSBzaW5nbGUgaW5vZGUuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfcmVhZF9pbm9kZV9mdWxsKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgaW50IGJ1ZnNpemUpCit7CisJdW5zaWduZWQgbG9uZwlncm91cCwgYmxvY2ssIGJsb2NrX25yLCBvZmZzZXQ7CisJY2hhcgkJKnB0cjsKKwllcnJjb2RlX3QJcmV0dmFsOworCWludAkJY2xlbiwgaSwgaW5vZGVzX3Blcl9ibG9jaywgbGVuZ3RoOworCWlvX2NoYW5uZWwJaW87CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHVzZXIgaGFzIGFuIG92ZXJyaWRlIGZ1bmN0aW9uICovCisJaWYgKGZzLT5yZWFkX2lub2RlKSB7CisJCXJldHZhbCA9IChmcy0+cmVhZF9pbm9kZSkoZnMsIGlubywgaW5vZGUpOworCQlpZiAocmV0dmFsICE9IEVYVDJfRVRfQ0FMTEJBQ0tfTk9USEFORExFRCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCS8qIENyZWF0ZSBpbm9kZSBjYWNoZSBpZiBub3QgcHJlc2VudCAqLworCWlmICghZnMtPmljYWNoZSkgeworCQlyZXR2YWwgPSBjcmVhdGVfaWNhY2hlKGZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCS8qIENoZWNrIHRvIHNlZSBpZiBpdCdzIGluIHRoZSBpbm9kZSBjYWNoZSAqLworCWlmIChidWZzaXplID09IHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpIHsKKwkJLyogb25seSBvbGQgZ29vZCBpbm9kZSBjYW4gYmUgcmV0cmlldmUgZnJvbSB0aGUgY2FjaGUgKi8KKwkJZm9yIChpPTA7IGkgPCBmcy0+aWNhY2hlLT5jYWNoZV9zaXplOyBpKyspIHsKKwkJCWlmIChmcy0+aWNhY2hlLT5jYWNoZVtpXS5pbm8gPT0gaW5vKSB7CisJCQkJKmlub2RlID0gZnMtPmljYWNoZS0+Y2FjaGVbaV0uaW5vZGU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJaWYgKChpbm8gPT0gMCkgfHwgKGlubyA+IGZzLT5zdXBlci0+c19pbm9kZXNfY291bnQpKQorCQlyZXR1cm4gRVhUMl9FVF9CQURfSU5PREVfTlVNOworCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfSU1BR0VfRklMRSkgeworCQlpbm9kZXNfcGVyX2Jsb2NrID0gZnMtPmJsb2Nrc2l6ZSAvIEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCQlibG9ja19uciA9IGZzLT5pbWFnZV9oZWFkZXItPm9mZnNldF9pbm9kZSAvIGZzLT5ibG9ja3NpemU7CisJCWJsb2NrX25yICs9IChpbm8gLSAxKSAvIGlub2Rlc19wZXJfYmxvY2s7CisJCW9mZnNldCA9ICgoaW5vIC0gMSkgJSBpbm9kZXNfcGVyX2Jsb2NrKSAqCisJCQlFWFQyX0lOT0RFX1NJWkUoZnMtPnN1cGVyKTsKKwkJaW8gPSBmcy0+aW1hZ2VfaW87CisJfSBlbHNlIHsKKwkJZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKTsKKwkJb2Zmc2V0ID0gKChpbm8gLSAxKSAlIEVYVDJfSU5PREVTX1BFUl9HUk9VUChmcy0+c3VwZXIpKSAqCisJCQlFWFQyX0lOT0RFX1NJWkUoZnMtPnN1cGVyKTsKKwkJYmxvY2sgPSBvZmZzZXQgPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMoZnMtPnN1cGVyKTsKKwkJaWYgKCFmcy0+Z3JvdXBfZGVzY1sodW5zaWduZWQpZ3JvdXBdLmJnX2lub2RlX3RhYmxlKQorCQkJcmV0dXJuIEVYVDJfRVRfTUlTU0lOR19JTk9ERV9UQUJMRTsKKwkJYmxvY2tfbnIgPSBmcy0+Z3JvdXBfZGVzY1sodW5zaWduZWQpZ3JvdXBdLmJnX2lub2RlX3RhYmxlICsKKwkJCWJsb2NrOworCQlpbyA9IGZzLT5pbzsKKwl9CisJb2Zmc2V0ICY9IChFWFQyX0JMT0NLX1NJWkUoZnMtPnN1cGVyKSAtIDEpOworCisJbGVuZ3RoID0gRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJaWYgKGJ1ZnNpemUgPCBsZW5ndGgpCisJCWxlbmd0aCA9IGJ1ZnNpemU7CisKKwlwdHIgPSAoY2hhciAqKSBpbm9kZTsKKwl3aGlsZSAobGVuZ3RoKSB7CisJCWNsZW4gPSBsZW5ndGg7CisJCWlmICgob2Zmc2V0ICsgbGVuZ3RoKSA+IGZzLT5ibG9ja3NpemUpCisJCQljbGVuID0gZnMtPmJsb2Nrc2l6ZSAtIG9mZnNldDsKKworCQlpZiAoYmxvY2tfbnIgIT0gZnMtPmljYWNoZS0+YnVmZmVyX2JsaykgeworCQkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2JsayhpbywgYmxvY2tfbnIsIDEsCisJCQkJCQkgICAgIGZzLT5pY2FjaGUtPmJ1ZmZlcik7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlmcy0+aWNhY2hlLT5idWZmZXJfYmxrID0gYmxvY2tfbnI7CisJCX0KKworCQltZW1jcHkocHRyLCAoKGNoYXIgKikgZnMtPmljYWNoZS0+YnVmZmVyKSArICh1bnNpZ25lZCkgb2Zmc2V0LAorCQkgICAgICAgY2xlbik7CisKKwkJb2Zmc2V0ID0gMDsKKwkJbGVuZ3RoIC09IGNsZW47CisJCXB0ciArPSBjbGVuOworCQlibG9ja19ucisrOworCX0KKworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkpCisJCWV4dDJmc19zd2FwX2lub2RlX2Z1bGwoZnMsIChzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBpbm9kZSwKKwkJCQkgICAgICAgKHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICopIGlub2RlLAorCQkJCSAgICAgICAwLCBsZW5ndGgpOworI2VuZGlmCisKKwkvKiBVcGRhdGUgdGhlIGlub2RlIGNhY2hlICovCisJZnMtPmljYWNoZS0+Y2FjaGVfbGFzdCA9IChmcy0+aWNhY2hlLT5jYWNoZV9sYXN0ICsgMSkgJQorCQlmcy0+aWNhY2hlLT5jYWNoZV9zaXplOworCWZzLT5pY2FjaGUtPmNhY2hlW2ZzLT5pY2FjaGUtPmNhY2hlX2xhc3RdLmlubyA9IGlubzsKKwlmcy0+aWNhY2hlLT5jYWNoZVtmcy0+aWNhY2hlLT5jYWNoZV9sYXN0XS5pbm9kZSA9ICppbm9kZTsKKworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3JlYWRfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlICogaW5vZGUpCit7CisJcmV0dXJuIGV4dDJmc19yZWFkX2lub2RlX2Z1bGwoZnMsIGlubywgaW5vZGUsCisJCQkJCXNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2lub2RlX2Z1bGwoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgc3RydWN0IGV4dDJfaW5vZGUgKiBpbm9kZSwgaW50IGJ1ZnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBncm91cCwgYmxvY2ssIGJsb2NrX25yLCBvZmZzZXQ7CisJZXJyY29kZV90IHJldHZhbCA9IDA7CisJc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgdGVtcF9pbm9kZSwgKndfaW5vZGU7CisJY2hhciAqcHRyOworCWludCBjbGVuLCBpLCBsZW5ndGg7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHVzZXIgcHJvdmlkZWQgYW4gb3ZlcnJpZGUgZnVuY3Rpb24gKi8KKwlpZiAoZnMtPndyaXRlX2lub2RlKSB7CisJCXJldHZhbCA9IChmcy0+d3JpdGVfaW5vZGUpKGZzLCBpbm8sIGlub2RlKTsKKwkJaWYgKHJldHZhbCAhPSBFWFQyX0VUX0NBTExCQUNLX05PVEhBTkRMRUQpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5vZGUgY2FjaGUgbmVlZHMgdG8gYmUgdXBkYXRlZCAqLworCWlmIChmcy0+aWNhY2hlKSB7CisJCWZvciAoaT0wOyBpIDwgZnMtPmljYWNoZS0+Y2FjaGVfc2l6ZTsgaSsrKSB7CisJCQlpZiAoZnMtPmljYWNoZS0+Y2FjaGVbaV0uaW5vID09IGlubykgeworCQkJCWZzLT5pY2FjaGUtPmNhY2hlW2ldLmlub2RlID0gKmlub2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gY3JlYXRlX2ljYWNoZShmcyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKworCWlmICgoaW5vID09IDApIHx8IChpbm8gPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KSkKKwkJcmV0dXJuIEVYVDJfRVRfQkFEX0lOT0RFX05VTTsKKworCWxlbmd0aCA9IGJ1ZnNpemU7CisJaWYgKGxlbmd0aCA8IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpKQorCQlsZW5ndGggPSBFWFQyX0lOT0RFX1NJWkUoZnMtPnN1cGVyKTsKKworCWlmIChsZW5ndGggPiAoaW50KSBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UpKSB7CisJCXdfaW5vZGUgPSB4bWFsbG9jKGxlbmd0aCk7CisJfSBlbHNlCisJCXdfaW5vZGUgPSAmdGVtcF9pbm9kZTsKKwltZW1zZXQod19pbm9kZSwgMCwgbGVuZ3RoKTsKKworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKQorCQlleHQyZnNfc3dhcF9pbm9kZV9mdWxsKGZzLCB3X2lub2RlLAorCQkJCSAgICAgICAoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgKikgaW5vZGUsCisJCQkJICAgICAgIDEsIGJ1ZnNpemUpOworCWVsc2UKKyNlbmRpZgorCQltZW1jcHkod19pbm9kZSwgaW5vZGUsIGJ1ZnNpemUpOworCisJZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKTsKKwlvZmZzZXQgPSAoKGlubyAtIDEpICUgRVhUMl9JTk9ERVNfUEVSX0dST1VQKGZzLT5zdXBlcikpICoKKwkJRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcik7CisJYmxvY2sgPSBvZmZzZXQgPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMoZnMtPnN1cGVyKTsKKwlpZiAoIWZzLT5ncm91cF9kZXNjWyh1bnNpZ25lZCkgZ3JvdXBdLmJnX2lub2RlX3RhYmxlKQorCQlyZXR1cm4gRVhUMl9FVF9NSVNTSU5HX0lOT0RFX1RBQkxFOworCWJsb2NrX25yID0gZnMtPmdyb3VwX2Rlc2NbKHVuc2lnbmVkKSBncm91cF0uYmdfaW5vZGVfdGFibGUgKyBibG9jazsKKworCW9mZnNldCAmPSAoRVhUMl9CTE9DS19TSVpFKGZzLT5zdXBlcikgLSAxKTsKKworCWxlbmd0aCA9IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCWlmIChsZW5ndGggPiBidWZzaXplKQorCQlsZW5ndGggPSBidWZzaXplOworCisJcHRyID0gKGNoYXIgKikgd19pbm9kZTsKKworCXdoaWxlIChsZW5ndGgpIHsKKwkJY2xlbiA9IGxlbmd0aDsKKwkJaWYgKChvZmZzZXQgKyBsZW5ndGgpID4gZnMtPmJsb2Nrc2l6ZSkKKwkJCWNsZW4gPSBmcy0+YmxvY2tzaXplIC0gb2Zmc2V0OworCisJCWlmIChmcy0+aWNhY2hlLT5idWZmZXJfYmxrICE9IGJsb2NrX25yKSB7CisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxvY2tfbnIsIDEsCisJCQkJCQkgICAgIGZzLT5pY2FjaGUtPmJ1ZmZlcik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyb3V0OworCQkJZnMtPmljYWNoZS0+YnVmZmVyX2JsayA9IGJsb2NrX25yOworCQl9CisKKworCQltZW1jcHkoKGNoYXIgKikgZnMtPmljYWNoZS0+YnVmZmVyICsgKHVuc2lnbmVkKSBvZmZzZXQsCisJCSAgICAgICBwdHIsIGNsZW4pOworCisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxvY2tfbnIsIDEsCisJCQkJCSAgICAgIGZzLT5pY2FjaGUtPmJ1ZmZlcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm91dDsKKworCQlvZmZzZXQgPSAwOworCQlwdHIgKz0gY2xlbjsKKwkJbGVuZ3RoIC09IGNsZW47CisJCWJsb2NrX25yKys7CisJfQorCisJZnMtPmZsYWdzIHw9IEVYVDJfRkxBR19DSEFOR0VEOworZXJyb3V0OgorCWlmICh3X2lub2RlICYmIHdfaW5vZGUgIT0gJnRlbXBfaW5vZGUpCisJCWZyZWUod19pbm9kZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc193cml0ZV9pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgIHN0cnVjdCBleHQyX2lub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gZXh0MmZzX3dyaXRlX2lub2RlX2Z1bGwoZnMsIGlubywgaW5vZGUsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gd3JpdGluZyBhIG5ldyBpbm9kZS4gIEl0IG1ha2VzCisgKiBzdXJlIHRoYXQgZXh0cmEgcGFydCBvZiBsYXJnZSBpbm9kZXMgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfbmV3X2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBleHQyX2lub2RlCSpidWY7CisJaW50CQkJc2l6ZSA9IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpOworCXN0cnVjdCBleHQyX2lub2RlX2xhcmdlCSpsYXJnZV9pbm9kZTsKKworCWlmIChzaXplID09IHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpCisJCXJldHVybiBleHQyZnNfd3JpdGVfaW5vZGVfZnVsbChmcywgaW5vLCBpbm9kZSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworCisJYnVmID0geG1hbGxvYyhzaXplKTsKKworCW1lbXNldChidWYsIDAsIHNpemUpOworCSpidWYgPSAqaW5vZGU7CisKKwlsYXJnZV9pbm9kZSA9IChzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBidWY7CisJbGFyZ2VfaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UpIC0KKwkJRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFOworCisJcmV0dXJuIGV4dDJmc193cml0ZV9pbm9kZV9mdWxsKGZzLCBpbm8sIGJ1Ziwgc2l6ZSk7Cit9CisKKworZXJyY29kZV90IGV4dDJmc19nZXRfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywgYmxrX3QgKmJsb2NrcykKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZQlpbm9kZTsKKwlpbnQJCQlpOworCWVycmNvZGVfdAkJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmIChpbm8gPiBmcy0+c3VwZXItPnNfaW5vZGVzX2NvdW50KQorCQlyZXR1cm4gRVhUMl9FVF9CQURfSU5PREVfTlVNOworCisJaWYgKGZzLT5nZXRfYmxvY2tzKSB7CisJCWlmICghKCpmcy0+Z2V0X2Jsb2NrcykoZnMsIGlubywgYmxvY2tzKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJZm9yIChpPTA7IGkgPCBFWFQyX05fQkxPQ0tTOyBpKyspCisJCWJsb2Nrc1tpXSA9IGlub2RlLmlfYmxvY2tbaV07CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfY2hlY2tfZGlyZWN0b3J5KGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubykKK3sKKwlzdHJ1Y3QJZXh0Ml9pbm9kZQlpbm9kZTsKKwllcnJjb2RlX3QJCXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoaW5vID4gZnMtPnN1cGVyLT5zX2lub2Rlc19jb3VudCkKKwkJcmV0dXJuIEVYVDJfRVRfQkFEX0lOT0RFX05VTTsKKworCWlmIChmcy0+Y2hlY2tfZGlyZWN0b3J5KSB7CisJCXJldHZhbCA9IChmcy0+Y2hlY2tfZGlyZWN0b3J5KShmcywgaW5vKTsKKwkJaWYgKHJldHZhbCAhPSBFWFQyX0VUX0NBTExCQUNLX05PVEhBTkRMRUQpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgaW5vLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKCFMSU5VWF9TX0lTRElSKGlub2RlLmlfbW9kZSkpCisJCXJldHVybiBFWFQyX0VUX05PX0RJUkVDVE9SWTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbm9kZV9pby5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lub2RlX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2MWQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pbm9kZV9pby5jCkBAIC0wLDAgKzEsMjcwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpbm9kZV9pby5jIC0tLSBUaGlzIGlzIGFsbG93cyBhbiBpbm9kZSBpbiBhbiBleHQyIGZpbGVzeXN0ZW0gaW1hZ2UKKyAqCXRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgSS9PIG1hbmFnZXIgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIEZvciBjaGVja2luZyBzdHJ1Y3R1cmUgbWFnaWMgbnVtYmVycy4uLgorICovCisKKyNkZWZpbmUgRVhUMl9DSEVDS19NQUdJQyhzdHJ1Y3QsIGNvZGUpIFwKKwkgIGlmICgoc3RydWN0KS0+bWFnaWMgIT0gKGNvZGUpKSByZXR1cm4gKGNvZGUpCisKK3N0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgeworCWludAkJCQltYWdpYzsKKwljaGFyCQkJCW5hbWVbMzJdOworCWV4dDJfZmlsZV90CQkJZmlsZTsKKwlleHQyX2ZpbHN5cwkJCWZzOworCWV4dDJfaW5vX3QJCQlpbm87CisJc3RydWN0IGV4dDJfaW5vZGUJCWlub2RlOworCWludAkJCQlmbGFnczsKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhCSpuZXh0OworfTsKKworI2RlZmluZSBDSEFOTkVMX0hBU19JTk9ERQkweDgwMDAKKworc3RhdGljIHN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKnRvcF9pbnRlcm47CitzdGF0aWMgaW50IGlub191bmlxdWUgPSAwOworCitzdGF0aWMgZXJyY29kZV90IGlub2RlX29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBpb19jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfY2xvc2UoaW9fY2hhbm5lbCBjaGFubmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfc2V0X2Jsa3NpemUoaW9fY2hhbm5lbCBjaGFubmVsLCBpbnQgYmxrc2l6ZSk7CitzdGF0aWMgZXJyY29kZV90IGlub2RlX3JlYWRfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIHZvaWQgKmRhdGEpOworc3RhdGljIGVycmNvZGVfdCBpbm9kZV93cml0ZV9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJCWludCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CitzdGF0aWMgZXJyY29kZV90IGlub2RlX2ZsdXNoKGlvX2NoYW5uZWwgY2hhbm5lbCk7CitzdGF0aWMgZXJyY29kZV90IGlub2RlX3dyaXRlX2J5dGUoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQlpbnQgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3RydWN0X2lvX21hbmFnZXIgc3RydWN0X2lub2RlX21hbmFnZXIgPSB7CisJRVhUMl9FVF9NQUdJQ19JT19NQU5BR0VSLAorCSJJbm9kZSBJL08gTWFuYWdlciIsCisJaW5vZGVfb3BlbiwKKwlpbm9kZV9jbG9zZSwKKwlpbm9kZV9zZXRfYmxrc2l6ZSwKKwlpbm9kZV9yZWFkX2JsaywKKwlpbm9kZV93cml0ZV9ibGssCisJaW5vZGVfZmx1c2gsCisJaW5vZGVfd3JpdGVfYnl0ZQorfTsKKworaW9fbWFuYWdlciBpbm9kZV9pb19tYW5hZ2VyID0gJnN0cnVjdF9pbm9kZV9tYW5hZ2VyOworCitlcnJjb2RlX3QgZXh0MmZzX2lub2RlX2lvX2ludGVybjIoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgaW5vLAorCQkJCSAgc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLAorCQkJCSAgY2hhciAqKm5hbWUpCit7CisJc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YQkqZGF0YTsKKwllcnJjb2RlX3QJCQlyZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhKSwKKwkJCQkgICAgICZkYXRhKSkpCisJCXJldHVybiByZXR2YWw7CisJZGF0YS0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0lOT0RFX0lPX0NIQU5ORUw7CisJc3ByaW50ZihkYXRhLT5uYW1lLCAiJXU6JWQiLCBpbm8sIGlub191bmlxdWUrKyk7CisJZGF0YS0+ZmlsZSA9IDA7CisJZGF0YS0+ZnMgPSBmczsKKwlkYXRhLT5pbm8gPSBpbm87CisJZGF0YS0+ZmxhZ3MgPSAwOworCWlmIChpbm9kZSkgeworCQltZW1jcHkoJmRhdGEtPmlub2RlLCBpbm9kZSwgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7CisJCWRhdGEtPmZsYWdzIHw9IENIQU5ORUxfSEFTX0lOT0RFOworCX0KKwlkYXRhLT5uZXh0ID0gdG9wX2ludGVybjsKKwl0b3BfaW50ZXJuID0gZGF0YTsKKwkqbmFtZSA9IGRhdGEtPm5hbWU7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfaW5vZGVfaW9faW50ZXJuKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGlubywKKwkJCQkgY2hhciAqKm5hbWUpCit7CisJcmV0dXJuIGV4dDJmc19pbm9kZV9pb19pbnRlcm4yKGZzLCBpbm8sIE5VTEwsIG5hbWUpOworfQorCisKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGlvX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaW9fY2hhbm5lbAlpbyA9IE5VTEw7CisJc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSAqcHJldiwgKmRhdGEgPSBOVUxMOworCWVycmNvZGVfdAlyZXR2YWw7CisJaW50CQlvcGVuX2ZsYWdzOworCisJaWYgKG5hbWUgPT0gMCkKKwkJcmV0dXJuIEVYVDJfRVRfQkFEX0RFVklDRV9OQU1FOworCisJZm9yIChkYXRhID0gdG9wX2ludGVybiwgcHJldiA9IE5VTEw7IGRhdGE7CisJICAgICBwcmV2ID0gZGF0YSwgZGF0YSA9IGRhdGEtPm5leHQpCisJCWlmIChzdHJjbXAobmFtZSwgZGF0YS0+bmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCWlmICghZGF0YSkKKwkJcmV0dXJuIEVOT0VOVDsKKwlpZiAocHJldikKKwkJcHJldi0+bmV4dCA9IGRhdGEtPm5leHQ7CisJZWxzZQorCQl0b3BfaW50ZXJuID0gZGF0YS0+bmV4dDsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3Qgc3RydWN0X2lvX2NoYW5uZWwpLCAmaW8pOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwltZW1zZXQoaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RydWN0X2lvX2NoYW5uZWwpKTsKKworCWlvLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTDsKKwlpby0+bWFuYWdlciA9IGlub2RlX2lvX21hbmFnZXI7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKG5hbWUpKzEsICZpby0+bmFtZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJc3RyY3B5KGlvLT5uYW1lLCBuYW1lKTsKKwlpby0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKwlpby0+YmxvY2tfc2l6ZSA9IDEwMjQ7CisJaW8tPnJlYWRfZXJyb3IgPSAwOworCWlvLT53cml0ZV9lcnJvciA9IDA7CisJaW8tPnJlZmNvdW50ID0gMTsKKworCW9wZW5fZmxhZ3MgPSAoZmxhZ3MgJiBJT19GTEFHX1JXKSA/IEVYVDJfRklMRV9XUklURSA6IDA7CisJcmV0dmFsID0gZXh0MmZzX2ZpbGVfb3BlbjIoZGF0YS0+ZnMsIGRhdGEtPmlubywKKwkJCQkgICAoZGF0YS0+ZmxhZ3MgJiBDSEFOTkVMX0hBU19JTk9ERSkgPworCQkJCSAgICZkYXRhLT5pbm9kZSA6IDAsIG9wZW5fZmxhZ3MsCisJCQkJICAgJmRhdGEtPmZpbGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKworCSpjaGFubmVsID0gaW87CisJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJaWYgKGRhdGEpIHsKKwkJZXh0MmZzX2ZyZWVfbWVtKCZkYXRhKTsKKwl9CisJaWYgKGlvKQorCQlleHQyZnNfZnJlZV9tZW0oJmlvKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IGlub2RlX2Nsb3NlKGlvX2NoYW5uZWwgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX0lOT0RFX0lPX0NIQU5ORUwpOworCisJaWYgKC0tY2hhbm5lbC0+cmVmY291bnQgPiAwKQorCQlyZXR1cm4gMDsKKworCXJldHZhbCA9IGV4dDJmc19maWxlX2Nsb3NlKGRhdGEtPmZpbGUpOworCisJZXh0MmZzX2ZyZWVfbWVtKCZjaGFubmVsLT5wcml2YXRlX2RhdGEpOworCWlmIChjaGFubmVsLT5uYW1lKQorCQlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwtPm5hbWUpOworCWV4dDJmc19mcmVlX21lbSgmY2hhbm5lbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbm9kZV9zZXRfYmxrc2l6ZShpb19jaGFubmVsIGNoYW5uZWwsIGludCBibGtzaXplKQoreworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKmRhdGE7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTCk7CisKKwljaGFubmVsLT5ibG9ja19zaXplID0gYmxrc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgZXJyY29kZV90IGlub2RlX3JlYWRfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTCk7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19maWxlX2xzZWVrKGRhdGEtPmZpbGUsCisJCQkJCWJsb2NrICogY2hhbm5lbC0+YmxvY2tfc2l6ZSwKKwkJCQkJRVhUMl9TRUVLX1NFVCwgMCkpKQorCQlyZXR1cm4gcmV0dmFsOworCisJY291bnQgPSAoY291bnQgPCAwKSA/IC1jb3VudCA6IChjb3VudCAqIGNoYW5uZWwtPmJsb2NrX3NpemUpOworCisJcmV0dXJuIGV4dDJmc19maWxlX3JlYWQoZGF0YS0+ZmlsZSwgYnVmLCBjb3VudCwgMCk7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQlpbnQgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTCk7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19maWxlX2xzZWVrKGRhdGEtPmZpbGUsCisJCQkJCWJsb2NrICogY2hhbm5lbC0+YmxvY2tfc2l6ZSwKKwkJCQkJRVhUMl9TRUVLX1NFVCwgMCkpKQorCQlyZXR1cm4gcmV0dmFsOworCisJY291bnQgPSAoY291bnQgPCAwKSA/IC1jb3VudCA6IChjb3VudCAqIGNoYW5uZWwtPmJsb2NrX3NpemUpOworCisJcmV0dXJuIGV4dDJmc19maWxlX3dyaXRlKGRhdGEtPmZpbGUsIGJ1ZiwgY291bnQsIDApOworfQorCitzdGF0aWMgZXJyY29kZV90IGlub2RlX3dyaXRlX2J5dGUoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgaW50IHNpemUsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IGlub2RlX3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX0lOT0RFX0lPX0NIQU5ORUwpOworCisJaWYgKChyZXR2YWwgPSBleHQyZnNfZmlsZV9sc2VlayhkYXRhLT5maWxlLCBvZmZzZXQsCisJCQkJCUVYVDJfU0VFS19TRVQsIDApKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBleHQyZnNfZmlsZV93cml0ZShkYXRhLT5maWxlLCBidWYsIHNpemUsIDApOworfQorCisvKgorICogRmx1c2ggZGF0YSBidWZmZXJzIHRvIGRpc2suCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgaW5vZGVfZmx1c2goaW9fY2hhbm5lbCBjaGFubmVsKQoreworCXN0cnVjdCBpbm9kZV9wcml2YXRlX2RhdGEgKmRhdGE7CisKKwlFWFQyX0NIRUNLX01BR0lDKGNoYW5uZWwsIEVYVDJfRVRfTUFHSUNfSU9fQ0hBTk5FTCk7CisJZGF0YSA9IChzdHJ1Y3QgaW5vZGVfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfSU5PREVfSU9fQ0hBTk5FTCk7CisKKwlyZXR1cm4gZXh0MmZzX2ZpbGVfZmx1c2goZGF0YS0+ZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaW9fbWFuYWdlci5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lvX21hbmFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDcwMzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lvX21hbmFnZXIuYwpAQCAtMCwwICsxLDcwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpb19tYW5hZ2VyLmMgLS0tIHRoZSBJL08gbWFuYWdlciBhYnN0cmFjdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGlvX2NoYW5uZWxfc2V0X29wdGlvbnMoaW9fY2hhbm5lbCBjaGFubmVsLCBjb25zdCBjaGFyICpvcHRzKQoreworCWVycmNvZGVfdCByZXR2YWwgPSAwOworCWNoYXIgKm5leHQsICpwdHIsICpvcHRpb25zLCAqYXJnOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCisJaWYgKCFvcHRzKQorCQlyZXR1cm4gMDsKKworCWlmICghY2hhbm5lbC0+bWFuYWdlci0+c2V0X29wdGlvbikKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCW9wdGlvbnMgPSBtYWxsb2Moc3RybGVuKG9wdHMpKzEpOworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIEVYVDJfRVRfTk9fTUVNT1JZOworCXN0cmNweShvcHRpb25zLCBvcHRzKTsKKwlwdHIgPSBvcHRpb25zOworCisJd2hpbGUgKHB0ciAmJiAqcHRyKSB7CisJCW5leHQgPSBzdHJjaHIocHRyLCAnJicpOworCQlpZiAobmV4dCkKKwkJCSpuZXh0KysgPSAwOworCisJCWFyZyA9IHN0cmNocihwdHIsICc9Jyk7CisJCWlmIChhcmcpCisJCQkqYXJnKysgPSAwOworCisJCXJldHZhbCA9IChjaGFubmVsLT5tYW5hZ2VyLT5zZXRfb3B0aW9uKShjaGFubmVsLCBwdHIsIGFyZyk7CisJCWlmIChyZXR2YWwpCisJCQlicmVhazsKKwkJcHRyID0gbmV4dDsKKwl9CisJZnJlZShvcHRpb25zKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgaW9fY2hhbm5lbF93cml0ZV9ieXRlKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKQoreworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKworCWlmIChjaGFubmVsLT5tYW5hZ2VyLT53cml0ZV9ieXRlKQorCQlyZXR1cm4gY2hhbm5lbC0+bWFuYWdlci0+d3JpdGVfYnl0ZShjaGFubmVsLCBvZmZzZXQsCisJCQkJCQkgICAgY291bnQsIGRhdGEpOworCisJcmV0dXJuIEVYVDJfRVRfVU5JTVBMRU1FTlRFRDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9pcmVsLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDFkODkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXJlbC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpcmVsLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKK3N0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSB7CisJYmxrX3QJYmxvY2s7CisJX191MTYgb2Zmc2V0OworfTsKKworc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgeworCWV4dDJfaW5vX3QJbmV3OworCWV4dDJfaW5vX3QJb3JpZzsKKwlfX3UxNgkJZmxhZ3M7CisJX191MTYJCW1heF9yZWZzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0aW9uX3RhYmxlICpleHQyX2lyZWw7CisKK3N0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRpb25fdGFibGUgeworCV9fdTMyCW1hZ2ljOworCWNoYXIJKm5hbWU7CisJZXh0Ml9pbm9fdAljdXJyZW50OworCXZvaWQJKnByaXZfZGF0YTsKKworCS8qCisJICogQWRkIGFuIGlub2RlIHJlbG9jYXRpb24gZW50cnkuCisJICovCisJZXJyY29kZV90ICgqcHV0KShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKKwkvKgorCSAqIEdldCBhbiBpbm9kZSByZWxvY2F0aW9uIGVudHJ5LgorCSAqLworCWVycmNvZGVfdCAoKmdldCkoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkLAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudCk7CisKKwkvKgorCSAqIEdldCBhbiBpbm9kZSByZWxvY2F0aW9uIGVudHJ5IGJ5IGl0cyBvcmlnaW5hbCBpbm9kZSBudW1iZXIKKwkgKi8KKwllcnJjb2RlX3QgKCpnZXRfYnlfb3JpZykoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb3JpZywgZXh0Ml9pbm9fdCAqb2xkLAorCQkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBmb3IgaXRlcmF0aW5nIG92ZXIgdGhlIGlub2RlIHJlbG9jYXRpb24gZW50cmllcy4KKwkgKi8KKwllcnJjb2RlX3QgKCpzdGFydF9pdGVyKShleHQyX2lyZWwgaXJlbCk7CisKKwkvKgorCSAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiBmb3IgdGhlIGlub2RlIHJlbG9jYXRpb24gZW50cmllcy4KKwkgKiBSZXR1cm5zIGFuIGlub2RlIG51bWJlciBvZiAwIHdoZW4gb3V0IG9mIGVudHJpZXMuCisJICovCisJZXJyY29kZV90ICgqbmV4dCkoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3QgKm9sZCwKKwkJCSAgc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudCk7CisKKwkvKgorCSAqIEFkZCBhbiBpbm9kZSByZWZlcmVuY2UgKGkuZS4sIG5vdGUgdGhlIGZhY3QgdGhhdCBhCisJICogcGFydGljdWxhciBibG9jay9vZmZzZXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYW4gaW5vZGUpCisJICovCisJZXJyY29kZV90ICgqYWRkX3JlZikoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWZlcmVuY2UgKnJlZik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgZm9yIGl0ZXJhdGluZyBvdmVyIHRoZSBpbm9kZSByZWZlcmVuY2VzIGZvciBhCisJICogcGFydGljdWxhciBpbm9kZS4KKwkgKi8KKwllcnJjb2RlX3QgKCpzdGFydF9pdGVyX3JlZikoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3QgaW5vKTsKKworCS8qCisJICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGZvciB0aGUgaW5vZGUgcmVmZXJlbmNlcyBmb3IgYW4KKwkgKiBpbm9kZS4gIFRoZSByZWZlcmVuY2VzIGZvciBvbmx5IG9uZSBpbm9kZSBjYW4gYmUgaW50ZXJhdG9yCisJICogb3ZlciBhdCBhIHRpbWUsIGFzIHRoZSBpdGVyYXRvciBzdGF0ZSBpcyBzdG9yZWQgaW4gZXh0Ml9pcmVsLgorCSAqLworCWVycmNvZGVfdCAoKm5leHRfcmVmKShleHQyX2lyZWwgaXJlbCwKKwkJCSAgICAgIHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSAqcmVmKTsKKworCS8qCisJICogTW92ZSB0aGUgaW5vZGUgcmVsb2NhdGlvbiB0YWJsZSBmcm9tIG9uZSBpbm9kZSBudW1iZXIgdG8KKwkgKiBhbm90aGVyLiAgTm90ZSB0aGF0IHRoZSBpbm9kZSByZWZlcmVuY2VzIGFsc28gbXVzdCBtb3ZlLgorCSAqLworCWVycmNvZGVfdCAoKm1vdmUpKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCwgZXh0Ml9pbm9fdCBuZXcpOworCisJLyoKKwkgKiBSZW1vdmUgYW4gaW5vZGUgcmVsb2NhdGlvbiBlbnRyeSwgYWxvbmcgd2l0aCBhbGwgb2YgdGhlCisJICogaW5vZGUgcmVmZXJlbmNlcy4KKwkgKi8KKwllcnJjb2RlX3QgKCpkZWxldGUpKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCk7CisKKwkvKgorCSAqIEZyZWUgdGhlIGlub2RlIHJlbG9jYXRpb24gdGFibGUuCisJICovCisJZXJyY29kZV90ICgqZnJlZSkoZXh0Ml9pcmVsIGlyZWwpOworfTsKKworZXJyY29kZV90IGV4dDJmc19pcmVsX21lbWFycmF5X2NyZWF0ZShjaGFyICpuYW1lLCBleHQyX2lub190IG1heF9pbm9kZSwKKwkJCQkgICAgZXh0Ml9pcmVsICppcmVsKTsKKworI2RlZmluZSBleHQyZnNfaXJlbF9wdXQoaXJlbCwgb2xkLCBlbnQpICgoaXJlbCktPnB1dCgoaXJlbCksIG9sZCwgZW50KSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfZ2V0KGlyZWwsIG9sZCwgZW50KSAoKGlyZWwpLT5nZXQoKGlyZWwpLCBvbGQsIGVudCkpCisjZGVmaW5lIGV4dDJmc19pcmVsX2dldF9ieV9vcmlnKGlyZWwsIG9yaWcsIG9sZCwgZW50KSBcCisJCQkoKGlyZWwpLT5nZXRfYnlfb3JpZygoaXJlbCksIG9yaWcsIG9sZCwgZW50KSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfc3RhcnRfaXRlcihpcmVsKSAoKGlyZWwpLT5zdGFydF9pdGVyKChpcmVsKSkpCisjZGVmaW5lIGV4dDJmc19pcmVsX25leHQoaXJlbCwgb2xkLCBlbnQpICgoaXJlbCktPm5leHQoKGlyZWwpLCBvbGQsIGVudCkpCisjZGVmaW5lIGV4dDJmc19pcmVsX2FkZF9yZWYoaXJlbCwgaW5vLCByZWYpICgoaXJlbCktPmFkZF9yZWYoKGlyZWwpLCBpbm8sIHJlZikpCisjZGVmaW5lIGV4dDJmc19pcmVsX3N0YXJ0X2l0ZXJfcmVmKGlyZWwsIGlubykgKChpcmVsKS0+c3RhcnRfaXRlcl9yZWYoKGlyZWwpLCBpbm8pKQorI2RlZmluZSBleHQyZnNfaXJlbF9uZXh0X3JlZihpcmVsLCByZWYpICgoaXJlbCktPm5leHRfcmVmKChpcmVsKSwgcmVmKSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfbW92ZShpcmVsLCBvbGQsIG5ldykgKChpcmVsKS0+bW92ZSgoaXJlbCksIG9sZCwgbmV3KSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfZGVsZXRlKGlyZWwsIG9sZCkgKChpcmVsKS0+ZGVsZXRlKChpcmVsKSwgb2xkKSkKKyNkZWZpbmUgZXh0MmZzX2lyZWxfZnJlZShpcmVsKSAoKGlyZWwpLT5mcmVlKChpcmVsKSkpCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXJlbF9tYS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lyZWxfbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODcxYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lyZWxfbWEuYwpAQCAtMCwwICsxLDM2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaXJlbF9tYS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKyNpbmNsdWRlICJpcmVsLmgiCisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX3B1dChleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsCisJCQkgc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudCk7CitzdGF0aWMgZXJyY29kZV90IGltYV9nZXQoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkLAorCQkJIHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpOworc3RhdGljIGVycmNvZGVfdCBpbWFfZ2V0X2J5X29yaWcoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb3JpZywgZXh0Ml9pbm9fdCAqb2xkLAorCQkJCSBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX3N0YXJ0X2l0ZXIoZXh0Ml9pcmVsIGlyZWwpOworc3RhdGljIGVycmNvZGVfdCBpbWFfbmV4dChleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCAqb2xkLAorCQkJICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX2FkZF9yZWYoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3QgaW5vLAorCQkJICAgICBzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWZlcmVuY2UgKnJlZik7CitzdGF0aWMgZXJyY29kZV90IGltYV9zdGFydF9pdGVyX3JlZihleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBpbm8pOworc3RhdGljIGVycmNvZGVfdCBpbWFfbmV4dF9yZWYoZXh0Ml9pcmVsIGlyZWwsIHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSAqcmVmKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX21vdmUoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkLCBleHQyX2lub190IG5ldyk7CitzdGF0aWMgZXJyY29kZV90IGltYV9kZWxldGUoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3Qgb2xkKTsKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX2ZyZWUoZXh0Ml9pcmVsIGlyZWwpOworCisvKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBzdG9yZXMgdGhlIGFycmF5IG9mIGlub2RlIHJlZmVyZW5jZXM7IHRoZXJlIGlzCisgKiBhIHN0cnVjdHVyZSBmb3IgZWFjaCBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlX3JlZmVyZW5jZV9lbnRyeSB7CisJX191MTYgbnVtOworCXN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSAqcmVmczsKK307CisKK3N0cnVjdCBpcmVsX21hIHsKKwlfX3UzMiBtYWdpYzsKKwlleHQyX2lub190IG1heF9pbm9kZTsKKwlleHQyX2lub190IHJlZl9jdXJyZW50OworCWludCAgIHJlZl9pdGVyOworCWV4dDJfaW5vX3QJKm9yaWdfbWFwOworCXN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnRyaWVzOworCXN0cnVjdCBpbm9kZV9yZWZlcmVuY2VfZW50cnkgKnJlZl9lbnRyaWVzOworfTsKKworZXJyY29kZV90IGV4dDJmc19pcmVsX21lbWFycmF5X2NyZWF0ZShjaGFyICpuYW1lLCBleHQyX2lub190IG1heF9pbm9kZSwKKwkJCQkgICAgICBleHQyX2lyZWwgKm5ld19pcmVsKQoreworCWV4dDJfaXJlbAkJaXJlbCA9IDA7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgaXJlbF9tYQkqbWEgPSAwOworCXNpemVfdAkJc2l6ZTsKKworCSpuZXdfaXJlbCA9IDA7CisKKwkvKgorCSAqIEFsbG9jYXRlIG1lbW9yeSBzdHJ1Y3R1cmVzCisJICovCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRpb25fdGFibGUpLAorCQkJCSZpcmVsKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQoaXJlbCwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRpb25fdGFibGUpKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihuYW1lKSsxLCAmaXJlbC0+bmFtZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvdXQ7CisJc3RyY3B5KGlyZWwtPm5hbWUsIG5hbWUpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZW9mKHN0cnVjdCBpcmVsX21hKSwgJm1hKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQobWEsIDAsIHNpemVvZihzdHJ1Y3QgaXJlbF9tYSkpOworCWlyZWwtPnByaXZfZGF0YSA9IG1hOworCisJc2l6ZSA9IChzaXplX3QpIChzaXplb2YoZXh0Ml9pbm9fdCkgKiAobWF4X2lub2RlKzEpKTsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplLCAmbWEtPm9yaWdfbWFwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQobWEtPm9yaWdfbWFwLCAwLCBzaXplKTsKKworCXNpemUgPSAoc2l6ZV90KSAoc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5KSAqCisJCQkgKG1heF9pbm9kZSsxKSk7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc2l6ZSwgJm1hLT5lbnRyaWVzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQobWEtPmVudHJpZXMsIDAsIHNpemUpOworCisJc2l6ZSA9IChzaXplX3QpIChzaXplb2Yoc3RydWN0IGlub2RlX3JlZmVyZW5jZV9lbnRyeSkgKgorCQkJIChtYXhfaW5vZGUrMSkpOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemUsICZtYS0+cmVmX2VudHJpZXMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChtYS0+cmVmX2VudHJpZXMsIDAsIHNpemUpOworCW1hLT5tYXhfaW5vZGUgPSBtYXhfaW5vZGU7CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGlyZWwgZGF0YSBzdHJ1Y3R1cmUKKwkgKi8KKwlpcmVsLT5wdXQgPSBpbWFfcHV0OworCWlyZWwtPmdldCA9IGltYV9nZXQ7CisJaXJlbC0+Z2V0X2J5X29yaWcgPSBpbWFfZ2V0X2J5X29yaWc7CisJaXJlbC0+c3RhcnRfaXRlciA9IGltYV9zdGFydF9pdGVyOworCWlyZWwtPm5leHQgPSBpbWFfbmV4dDsKKwlpcmVsLT5hZGRfcmVmID0gaW1hX2FkZF9yZWY7CisJaXJlbC0+c3RhcnRfaXRlcl9yZWYgPSBpbWFfc3RhcnRfaXRlcl9yZWY7CisJaXJlbC0+bmV4dF9yZWYgPSBpbWFfbmV4dF9yZWY7CisJaXJlbC0+bW92ZSA9IGltYV9tb3ZlOworCWlyZWwtPmRlbGV0ZSA9IGltYV9kZWxldGU7CisJaXJlbC0+ZnJlZSA9IGltYV9mcmVlOworCisJKm5ld19pcmVsID0gaXJlbDsKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWltYV9mcmVlKGlyZWwpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX3B1dChleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsCisJCQlzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KQoreworCXN0cnVjdCBpbm9kZV9yZWZlcmVuY2VfZW50cnkJKnJlZl9lbnQ7CisJc3RydWN0IGlyZWxfbWEJCQkqbWE7CisJZXJyY29kZV90CQkJcmV0dmFsOworCXNpemVfdAkJCQlzaXplLCBvbGRfc2l6ZTsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCWlmIChvbGQgPiBtYS0+bWF4X2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJLyoKKwkgKiBGb3JjZSB0aGUgb3JpZyBmaWVsZCB0byB0aGUgY29ycmVjdCB2YWx1ZTsgdGhlIGFwcGxpY2F0aW9uCisJICogcHJvZ3JhbSBzaG91bGRuJ3QgYmUgbWVzc2luZyB3aXRoIHRoaXMgZmllbGQuCisJICovCisJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5uZXcgPT0gMCkKKwkJZW50LT5vcmlnID0gb2xkOworCWVsc2UKKwkJZW50LT5vcmlnID0gbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm9yaWc7CisKKwkvKgorCSAqIElmIG1heF9yZWZzIGhhcyBjaGFuZ2VkLCByZWFsbG9jYXRlIHRoZSByZWZzIGFycmF5CisJICovCisJcmVmX2VudCA9IG1hLT5yZWZfZW50cmllcyArICh1bnNpZ25lZCkgb2xkOworCWlmIChyZWZfZW50LT5yZWZzICYmIGVudC0+bWF4X3JlZnMgIT0KKwkgICAgbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm1heF9yZWZzKSB7CisJCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSkgKiBlbnQtPm1heF9yZWZzKTsKKwkJb2xkX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSkgKgorCQkJICAgIG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5tYXhfcmVmcyk7CisJCXJldHZhbCA9IGV4dDJmc19yZXNpemVfbWVtKG9sZF9zaXplLCBzaXplLCAmcmVmX2VudC0+cmVmcyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCW1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXSA9ICplbnQ7CisJbWEtPm9yaWdfbWFwWyh1bnNpZ25lZCkgZW50LT5vcmlnXSA9IG9sZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbWFfZ2V0KGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCwKKwkJCXN0cnVjdCBleHQyX2lub2RlX3JlbG9jYXRlX2VudHJ5ICplbnQpCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCisJbWEgPSBpcmVsLT5wcml2X2RhdGE7CisJaWYgKG9sZCA+IG1hLT5tYXhfaW5vZGUpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJaWYgKG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5uZXcgPT0gMCkKKwkJcmV0dXJuIEVOT0VOVDsKKwkqZW50ID0gbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9nZXRfYnlfb3JpZyhleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvcmlnLCBleHQyX2lub190ICpvbGQsCisJCQlzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50KQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKwlleHQyX2lub190CWlubzsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCWlmIChvcmlnID4gbWEtPm1heF9pbm9kZSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwlpbm8gPSBtYS0+b3JpZ19tYXBbKHVuc2lnbmVkKSBvcmlnXTsKKwlpZiAoaW5vID09IDApCisJCXJldHVybiBFTk9FTlQ7CisJKm9sZCA9IGlubzsKKwkqZW50ID0gbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBpbm9dOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9zdGFydF9pdGVyKGV4dDJfaXJlbCBpcmVsKQoreworCWlyZWwtPmN1cnJlbnQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9uZXh0KGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190ICpvbGQsCisJCQkgc3RydWN0IGV4dDJfaW5vZGVfcmVsb2NhdGVfZW50cnkgKmVudCkKK3sKKwlzdHJ1Y3QgaXJlbF9tYQkqbWE7CisKKwltYSA9IGlyZWwtPnByaXZfZGF0YTsKKwl3aGlsZSAoKytpcmVsLT5jdXJyZW50IDwgbWEtPm1heF9pbm9kZSkgeworCQlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKSBpcmVsLT5jdXJyZW50XS5uZXcgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkqb2xkID0gaXJlbC0+Y3VycmVudDsKKwkJKmVudCA9IG1hLT5lbnRyaWVzWyh1bnNpZ25lZCkgaXJlbC0+Y3VycmVudF07CisJCXJldHVybiAwOworCX0KKwkqb2xkID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbWFfYWRkX3JlZihleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBpbm8sCisJCQkgICAgIHN0cnVjdCBleHQyX2lub2RlX3JlZmVyZW5jZSAqcmVmKQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKwlzaXplX3QJCXNpemU7CisJc3RydWN0IGlub2RlX3JlZmVyZW5jZV9lbnRyeSAqcmVmX2VudDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9yZWxvY2F0ZV9lbnRyeSAqZW50OworCWVycmNvZGVfdAkJcmV0dmFsOworCisJbWEgPSBpcmVsLT5wcml2X2RhdGE7CisJaWYgKGlubyA+IG1hLT5tYXhfaW5vZGUpCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlyZWZfZW50ID0gbWEtPnJlZl9lbnRyaWVzICsgKHVuc2lnbmVkKSBpbm87CisJZW50ID0gbWEtPmVudHJpZXMgKyAodW5zaWduZWQpIGlubzsKKworCS8qCisJICogSWYgdGhlIGlub2RlIHJlZmVyZW5jZSBhcnJheSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQuCisJICovCisJaWYgKHJlZl9lbnQtPnJlZnMgPT0gMCkgeworCQlzaXplID0gKHNpemVfdCkgKChzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlKSAqCisJCQkJICBlbnQtPm1heF9yZWZzKSk7CisJCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemUsICZyZWZfZW50LT5yZWZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCW1lbXNldChyZWZfZW50LT5yZWZzLCAwLCBzaXplKTsKKwkJcmVmX2VudC0+bnVtID0gMDsKKwl9CisKKwlpZiAocmVmX2VudC0+bnVtID49IGVudC0+bWF4X3JlZnMpCisJCXJldHVybiBFWFQyX0VUX1RPT19NQU5ZX1JFRlM7CisKKwlyZWZfZW50LT5yZWZzWyh1bnNpZ25lZCkgcmVmX2VudC0+bnVtKytdID0gKnJlZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbWFfc3RhcnRfaXRlcl9yZWYoZXh0Ml9pcmVsIGlyZWwsIGV4dDJfaW5vX3QgaW5vKQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCWlmIChpbm8gPiBtYS0+bWF4X2lub2RlKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCWlmIChtYS0+ZW50cmllc1sodW5zaWduZWQpIGlub10ubmV3ID09IDApCisJCXJldHVybiBFTk9FTlQ7CisJbWEtPnJlZl9jdXJyZW50ID0gaW5vOworCW1hLT5yZWZfaXRlciA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgaW1hX25leHRfcmVmKGV4dDJfaXJlbCBpcmVsLAorCQkJICAgICAgc3RydWN0IGV4dDJfaW5vZGVfcmVmZXJlbmNlICpyZWYpCit7CisJc3RydWN0IGlyZWxfbWEJKm1hOworCXN0cnVjdCBpbm9kZV9yZWZlcmVuY2VfZW50cnkgKnJlZl9lbnQ7CisKKwltYSA9IGlyZWwtPnByaXZfZGF0YTsKKworCXJlZl9lbnQgPSBtYS0+cmVmX2VudHJpZXMgKyBtYS0+cmVmX2N1cnJlbnQ7CisKKwlpZiAoKHJlZl9lbnQtPnJlZnMgPT0gTlVMTCkgfHwKKwkgICAgKG1hLT5yZWZfaXRlciA+PSByZWZfZW50LT5udW0pKSB7CisJCXJlZi0+YmxvY2sgPSAwOworCQlyZWYtPm9mZnNldCA9IDA7CisJCXJldHVybiAwOworCX0KKwkqcmVmID0gcmVmX2VudC0+cmVmc1ttYS0+cmVmX2l0ZXIrK107CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGVycmNvZGVfdCBpbWFfbW92ZShleHQyX2lyZWwgaXJlbCwgZXh0Ml9pbm9fdCBvbGQsIGV4dDJfaW5vX3QgbmV3KQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKworCW1hID0gaXJlbC0+cHJpdl9kYXRhOworCWlmICgob2xkID4gbWEtPm1heF9pbm9kZSkgfHwgKG5ldyA+IG1hLT5tYXhfaW5vZGUpKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCWlmIChtYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF0ubmV3ID09IDApCisJCXJldHVybiBFTk9FTlQ7CisKKwltYS0+ZW50cmllc1sodW5zaWduZWQpIG5ld10gPSBtYS0+ZW50cmllc1sodW5zaWduZWQpIG9sZF07CisJZXh0MmZzX2ZyZWVfbWVtKCZtYS0+cmVmX2VudHJpZXNbKHVuc2lnbmVkKSBuZXddLnJlZnMpOworCW1hLT5yZWZfZW50cmllc1sodW5zaWduZWQpIG5ld10gPSBtYS0+cmVmX2VudHJpZXNbKHVuc2lnbmVkKSBvbGRdOworCisJbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm5ldyA9IDA7CisJbWEtPnJlZl9lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5udW0gPSAwOworCW1hLT5yZWZfZW50cmllc1sodW5zaWduZWQpIG9sZF0ucmVmcyA9IDA7CisKKwltYS0+b3JpZ19tYXBbbWEtPmVudHJpZXNbbmV3XS5vcmlnXSA9IG5ldzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVycmNvZGVfdCBpbWFfZGVsZXRlKGV4dDJfaXJlbCBpcmVsLCBleHQyX2lub190IG9sZCkKK3sKKwlzdHJ1Y3QgaXJlbF9tYQkqbWE7CisKKwltYSA9IGlyZWwtPnByaXZfZGF0YTsKKwlpZiAob2xkID4gbWEtPm1heF9pbm9kZSkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKwlpZiAobWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm5ldyA9PSAwKQorCQlyZXR1cm4gRU5PRU5UOworCisJbWEtPmVudHJpZXNbb2xkXS5uZXcgPSAwOworCWV4dDJmc19mcmVlX21lbSgmbWEtPnJlZl9lbnRyaWVzWyh1bnNpZ25lZCkgb2xkXS5yZWZzKTsKKwltYS0+b3JpZ19tYXBbbWEtPmVudHJpZXNbKHVuc2lnbmVkKSBvbGRdLm9yaWddID0gMDsKKworCW1hLT5yZWZfZW50cmllc1sodW5zaWduZWQpIG9sZF0ubnVtID0gMDsKKwltYS0+cmVmX2VudHJpZXNbKHVuc2lnbmVkKSBvbGRdLnJlZnMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZXJyY29kZV90IGltYV9mcmVlKGV4dDJfaXJlbCBpcmVsKQoreworCXN0cnVjdCBpcmVsX21hCSptYTsKKwlleHQyX2lub190CWlubzsKKworCWlmICghaXJlbCkKKwkJcmV0dXJuIDA7CisKKwltYSA9IGlyZWwtPnByaXZfZGF0YTsKKworCWlmIChtYSkgeworCQlleHQyZnNfZnJlZV9tZW0oJm1hLT5vcmlnX21hcCk7CisJCWV4dDJmc19mcmVlX21lbSgmbWEtPmVudHJpZXMpOworCQlpZiAobWEtPnJlZl9lbnRyaWVzKSB7CisJCQlmb3IgKGlubyA9IDA7IGlubyA8PSBtYS0+bWF4X2lub2RlOyBpbm8rKykgeworCQkJCWV4dDJmc19mcmVlX21lbSgmbWEtPnJlZl9lbnRyaWVzWyh1bnNpZ25lZCkgaW5vXS5yZWZzKTsKKwkJCX0KKwkJCWV4dDJmc19mcmVlX21lbSgmbWEtPnJlZl9lbnRyaWVzKTsKKwkJfQorCQlleHQyZnNfZnJlZV9tZW0oJm1hKTsKKwl9CisJZXh0MmZzX2ZyZWVfbWVtKCZpcmVsLT5uYW1lKTsKKwlleHQyZnNfZnJlZV9tZW0oJmlyZWwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lzbW91bnRlZC5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2lzbW91bnRlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvaXNtb3VudGVkLmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlzbW91bnRlZC5jIC0tLSBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGVzeXN0ZW0gd2FzIG1vdW50ZWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTgsMTk5OSwyMDAwIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX0xJTlVYX0ZEX0gKKyNpbmNsdWRlIDxsaW51eC9mZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9NTlRFTlRfSAorI2luY2x1ZGUgPG1udGVudC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9HRVRNTlRJTkZPCisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNlbmRpZiAvKiBIQVZFX0dFVE1OVElORk8gKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisjaWZkZWYgSEFWRV9NTlRFTlRfSAorLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCBjaGVja3MgYSBmaWxlIGluIC9ldGMvbXRhYiBmb3JtYXQgdG8gc2VlIGlmIGEKKyAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZC4gIFJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdAorICogb3IgY2FuJ3QgYmUgb3BlbmVkLgorICovCitzdGF0aWMgZXJyY29kZV90IGNoZWNrX21udGVudF9maWxlKGNvbnN0IGNoYXIgKm10YWJfZmlsZSwgY29uc3QgY2hhciAqZmlsZSwKKwkJCQkgICBpbnQgKm1vdW50X2ZsYWdzLCBjaGFyICptdHB0LCBpbnQgbXRsZW4pCit7CisJc3RydWN0IG1udGVudAkqbW50OworCXN0cnVjdCBzdGF0CXN0X2J1ZjsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKwlkZXZfdAkJZmlsZV9kZXY9MCwgZmlsZV9yZGV2PTA7CisJaW5vX3QJCWZpbGVfaW5vPTA7CisJRklMRQkJKmY7CisJaW50CQlmZDsKKworCSptb3VudF9mbGFncyA9IDA7CisJaWYgKChmID0gc2V0bW50ZW50IChtdGFiX2ZpbGUsICJyIikpID09IE5VTEwpCisJCXJldHVybiBlcnJubzsKKwlpZiAoc3RhdChmaWxlLCAmc3RfYnVmKSA9PSAwKSB7CisJCWlmIChTX0lTQkxLKHN0X2J1Zi5zdF9tb2RlKSkgeworI2lmbmRlZiBfX0dOVV9fIC8qIFRoZSBHTlUgaHVyZCBpcyBicm9rZW4gd2l0aCByZXNwZWN0IHRvIHN0YXQgZGV2aWNlcyAqLworCQkJZmlsZV9yZGV2ID0gc3RfYnVmLnN0X3JkZXY7CisjZW5kaWYgIC8qIF9fR05VX18gKi8KKwkJfSBlbHNlIHsKKwkJCWZpbGVfZGV2ID0gc3RfYnVmLnN0X2RldjsKKwkJCWZpbGVfaW5vID0gc3RfYnVmLnN0X2lubzsKKwkJfQorCX0KKwl3aGlsZSAoKG1udCA9IGdldG1udGVudCAoZikpICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChmaWxlLCBtbnQtPm1udF9mc25hbWUpID09IDApCisJCQlicmVhazsKKwkJaWYgKHN0YXQobW50LT5tbnRfZnNuYW1lLCAmc3RfYnVmKSA9PSAwKSB7CisJCQlpZiAoU19JU0JMSyhzdF9idWYuc3RfbW9kZSkpIHsKKyNpZm5kZWYgX19HTlVfXworCQkJCWlmIChmaWxlX3JkZXYgJiYgKGZpbGVfcmRldiA9PSBzdF9idWYuc3RfcmRldikpCisJCQkJCWJyZWFrOworI2VuZGlmICAvKiBfX0dOVV9fICovCisJCQl9IGVsc2UgeworCQkJCWlmIChmaWxlX2RldiAmJiAoKGZpbGVfZGV2ID09IHN0X2J1Zi5zdF9kZXYpICYmCisJCQkJCQkgKGZpbGVfaW5vID09IHN0X2J1Zi5zdF9pbm8pKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobW50ID09IDApIHsKKyNpZm5kZWYgX19HTlVfXyAvKiBUaGUgR05VIGh1cmQgaXMgYnJva2VuIHdpdGggcmVzcGVjdCB0byBzdGF0IGRldmljZXMgKi8KKwkJLyoKKwkJICogRG8gYW4gZXh0cmEgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIHJvb3QgZGV2aWNlLiAgV2UKKwkJICogY2FuJ3QgdHJ1c3QgL2V0Yy9tdGFiLCBhbmQgL3Byb2MvbW91bnRzIHdpbGwgb25seSBsaXN0CisJCSAqIC9kZXYvcm9vdCBmb3IgdGhlIHJvb3QgZmlsZXN5c3RlbS4gIEFyZ2guICBJbnN0ZWFkIHdlCisJCSAqIGNoZWNrIGlmIHRoZSBnaXZlbiBkZXZpY2UgaGFzIHRoZSBzYW1lIG1ham9yL21pbm9yIG51bWJlcgorCQkgKiBhcyB0aGUgZGV2aWNlIHRoYXQgdGhlIHJvb3QgZGlyZWN0b3J5IGlzIG9uLgorCQkgKi8KKwkJaWYgKGZpbGVfcmRldiAmJiBzdGF0KCIvIiwgJnN0X2J1ZikgPT0gMCkgeworCQkJaWYgKHN0X2J1Zi5zdF9kZXYgPT0gZmlsZV9yZGV2KSB7CisJCQkJKm1vdW50X2ZsYWdzID0gRVhUMl9NRl9NT1VOVEVEOworCQkJCWlmIChtdHB0KQorCQkJCQlzdHJuY3B5KG10cHQsICIvIiwgbXRsZW4pOworCQkJCWdvdG8gaXNfcm9vdDsKKwkJCX0KKwkJfQorI2VuZGlmICAvKiBfX0dOVV9fICovCisJCWdvdG8gZXJyb3V0OworCX0KKyNpZm5kZWYgX19HTlVfXyAvKiBUaGUgR05VIGh1cmQgaXMgZGVmaWNpZW50OyB3aGF0IGVsc2UgaXMgbmV3PyAqLworCS8qIFZhbGlkYXRlIHRoZSBlbnRyeSBpbiBjYXNlIC9ldGMvbXRhYiBpcyBvdXQgb2YgZGF0ZSAqLworCS8qCisJICogV2UgbmVlZCB0byBiZSBwYXJhbm9pZCwgYmVjYXVzZSBzb21lIGJyb2tlbiBkaXN0cmlidXRpb25zCisJICogKHJlYWQ6IFNsYWNrd2FyZSkgZG9uJ3QgaW5pdGlhbGl6ZSAvZXRjL210YWIgYmVmb3JlIGNoZWNraW5nCisJICogYWxsIG9mIHRoZSBub24tcm9vdCBmaWxlc3lzdGVtcyBvbiB0aGUgZGlzay4KKwkgKi8KKwlpZiAoc3RhdChtbnQtPm1udF9kaXIsICZzdF9idWYpIDwgMCkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJaWYgKHJldHZhbCA9PSBFTk9FTlQpIHsKKyNpZmRlZiBERUJVRworCQkJcHJpbnRmKCJCb2d1cyBlbnRyeSBpbiAlcyEgICglcyBkb2VzIG5vdCBleGlzdClcbiIsCisJCQkgICAgICAgbXRhYl9maWxlLCBtbnQtPm1udF9kaXIpOworI2VuZGlmIC8qIERFQlVHICovCisJCQlyZXR2YWwgPSAwOworCQl9CisJCWdvdG8gZXJyb3V0OworCX0KKwlpZiAoZmlsZV9yZGV2ICYmIChzdF9idWYuc3RfZGV2ICE9IGZpbGVfcmRldikpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGYoIkJvZ3VzIGVudHJ5IGluICVzISAgKCVzIG5vdCBtb3VudGVkIG9uICVzKVxuIiwKKwkJICAgICAgIG10YWJfZmlsZSwgZmlsZSwgbW50LT5tbnRfZGlyKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQlnb3RvIGVycm91dDsKKwl9CisjZW5kaWYgLyogX19HTlVfXyAqLworCSptb3VudF9mbGFncyA9IEVYVDJfTUZfTU9VTlRFRDsKKworI2lmZGVmIE1OVE9QVF9STworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgcm8gb3B0aW9uIGlzIHNldCAqLworCWlmIChoYXNtbnRvcHQobW50LCBNTlRPUFRfUk8pKQorCQkqbW91bnRfZmxhZ3MgfD0gRVhUMl9NRl9SRUFET05MWTsKKyNlbmRpZgorCisJaWYgKG10cHQpCisJCXN0cm5jcHkobXRwdCwgbW50LT5tbnRfZGlyLCBtdGxlbik7CisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UncmUgcmVmZXJyaW5nIHRvIHRoZSByb290IGZpbGVzeXN0ZW0uCisJICogSWYgc28sIGRvIGEgbWFudWFsIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gb3BlbiAvZXRjL210YWIKKwkgKiByZWFkL3dyaXRlLCBzaW5jZSBpZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQvb25seSwgdGhlCisJICogY29udGVudHMgb2YgL2V0Yy9tdGFiIG1heSBub3QgYmUgYWNjdXJhdGUuCisJICovCisJaWYgKExPTkVfQ0hBUihtbnQtPm1udF9kaXIsICcvJykpIHsKK2lzX3Jvb3Q6CisjZGVmaW5lIFRFU1RfRklMRSAiLy5pc21vdW50LXRlc3QtZmlsZSIKKwkJKm1vdW50X2ZsYWdzIHw9IEVYVDJfTUZfSVNST09UOworCQlmZCA9IG9wZW4oVEVTVF9GSUxFLCBPX1JEV1J8T19DUkVBVCk7CisJCWlmIChmZCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFUk9GUykKKwkJCQkqbW91bnRfZmxhZ3MgfD0gRVhUMl9NRl9SRUFET05MWTsKKwkJfSBlbHNlCisJCQljbG9zZShmZCk7CisJCSh2b2lkKSB1bmxpbmsoVEVTVF9GSUxFKTsKKwl9CisJcmV0dmFsID0gMDsKK2Vycm91dDoKKwllbmRtbnRlbnQgKGYpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgY2hlY2tfbW50ZW50KGNvbnN0IGNoYXIgKmZpbGUsIGludCAqbW91bnRfZmxhZ3MsCisJCQkgICAgICBjaGFyICptdHB0LCBpbnQgbXRsZW4pCit7CisJZXJyY29kZV90CXJldHZhbDsKKworI2lmZGVmIERFQlVHCisJcmV0dmFsID0gY2hlY2tfbW50ZW50X2ZpbGUoIi90bXAvbXRhYiIsIGZpbGUsIG1vdW50X2ZsYWdzLAorCQkJCSAgIG10cHQsIG10bGVuKTsKKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiAwOworI2VuZGlmIC8qIERFQlVHICovCisjaWZkZWYgX19saW51eF9fCisJcmV0dmFsID0gY2hlY2tfbW50ZW50X2ZpbGUoIi9wcm9jL21vdW50cyIsIGZpbGUsIG1vdW50X2ZsYWdzLAorCQkJCSAgIG10cHQsIG10bGVuKTsKKwlpZiAocmV0dmFsID09IDAgJiYgKCptb3VudF9mbGFncyAhPSAwKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYgLyogX19saW51eF9fICovCisjaWYgZGVmaW5lZChNT1VOVEVEKSB8fCBkZWZpbmVkKF9QQVRIX01PVU5URUQpCisjaWZuZGVmIE1PVU5URUQKKyNkZWZpbmUgTU9VTlRFRCBfUEFUSF9NT1VOVEVECisjZW5kaWYgLyogTU9VTlRFRCAqLworCXJldHZhbCA9IGNoZWNrX21udGVudF9maWxlKE1PVU5URUQsIGZpbGUsIG1vdW50X2ZsYWdzLCBtdHB0LCBtdGxlbik7CisJcmV0dXJuIHJldHZhbDsKKyNlbHNlCisJKm1vdW50X2ZsYWdzID0gMDsKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBkZWZpbmVkKE1PVU5URUQpIHx8IGRlZmluZWQoX1BBVEhfTU9VTlRFRCkgKi8KK30KKworI2Vsc2UKKyNpZiBkZWZpbmVkKEhBVkVfR0VUTU5USU5GTykKKworc3RhdGljIGVycmNvZGVfdCBjaGVja19nZXRtbnRpbmZvKGNvbnN0IGNoYXIgKmZpbGUsIGludCAqbW91bnRfZmxhZ3MsCisJCQkJICBjaGFyICptdHB0LCBpbnQgbXRsZW4pCit7CisJc3RydWN0IHN0YXRmcyAqbXA7CisJaW50ICAgIGxlbiwgbjsKKwljb25zdCAgY2hhciAgICpzMTsKKwljaGFyCSpzMjsKKworCW4gPSBnZXRtbnRpbmZvKCZtcCwgTU5UX05PV0FJVCk7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIGVycm5vOworCisJbGVuID0gc2l6ZW9mKF9QQVRIX0RFVikgLSAxOworCXMxID0gZmlsZTsKKwlpZiAoc3RybmNtcChfUEFUSF9ERVYsIHMxLCBsZW4pID09IDApCisJCXMxICs9IGxlbjsKKworCSptb3VudF9mbGFncyA9IDA7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCXMyID0gbXAtPmZfbW50ZnJvbW5hbWU7CisJCWlmIChzdHJuY21wKF9QQVRIX0RFViwgczIsIGxlbikgPT0gMCkgeworCQkJczIgKz0gbGVuIC0gMTsKKwkJCSpzMiA9ICdyJzsKKwkJfQorCQlpZiAoc3RyY21wKHMxLCBzMikgPT0gMCB8fCBzdHJjbXAoczEsICZzMlsxXSkgPT0gMCkgeworCQkJKm1vdW50X2ZsYWdzID0gRVhUMl9NRl9NT1VOVEVEOworCQkJYnJlYWs7CisJCX0KKwkJKyttcDsKKwl9CisJaWYgKG10cHQpCisJCXN0cm5jcHkobXRwdCwgbXAtPmZfbW50b25uYW1lLCBtdGxlbik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSEFWRV9HRVRNTlRJTkZPICovCisjZW5kaWYgLyogSEFWRV9NTlRFTlRfSCAqLworCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCB0aGUgc3dhcCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgaXNfc3dhcF9kZXZpY2UoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlGSUxFCQkqZjsKKwljaGFyCQlidWZbMTAyNF0sICpjcDsKKwlkZXZfdAkJZmlsZV9kZXY7CisJc3RydWN0IHN0YXQJc3RfYnVmOworCWludAkJcmV0ID0gMDsKKworCWZpbGVfZGV2ID0gMDsKKyNpZm5kZWYgX19HTlVfXyAvKiBUaGUgR05VIGh1cmQgaXMgYnJva2VuIHdpdGggcmVzcGVjdCB0byBzdGF0IGRldmljZXMgKi8KKwlpZiAoKHN0YXQoZmlsZSwgJnN0X2J1ZikgPT0gMCkgJiYKKwkgICAgU19JU0JMSyhzdF9idWYuc3RfbW9kZSkpCisJCWZpbGVfZGV2ID0gc3RfYnVmLnN0X3JkZXY7CisjZW5kaWYgIC8qIF9fR05VX18gKi8KKworCWlmICghKGYgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2Mvc3dhcHMiKSkpCisJCXJldHVybiAwOworCS8qIFNraXAgdGhlIGZpcnN0IGxpbmUgKi8KKwlmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKTsKKwl3aGlsZSAoIWZlb2YoZikpIHsKKwkJaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkKKwkJCWJyZWFrOworCQlpZiAoKGNwID0gc3RyY2hyKGJ1ZiwgJyAnKSkgIT0gTlVMTCkKKwkJCSpjcCA9IDA7CisJCWlmICgoY3AgPSBzdHJjaHIoYnVmLCAnXHQnKSkgIT0gTlVMTCkKKwkJCSpjcCA9IDA7CisJCWlmIChzdHJjbXAoYnVmLCBmaWxlKSA9PSAwKSB7CisJCQlyZXQrKzsKKwkJCWJyZWFrOworCQl9CisjaWZuZGVmIF9fR05VX18KKwkJaWYgKGZpbGVfZGV2ICYmIChzdGF0KGJ1ZiwgJnN0X2J1ZikgPT0gMCkgJiYKKwkJICAgIFNfSVNCTEsoc3RfYnVmLnN0X21vZGUpICYmCisJCSAgICBmaWxlX2RldiA9PSBzdF9idWYuc3RfcmRldikgeworCQkJcmV0Kys7CisJCQlicmVhazsKKwkJfQorI2VuZGlmICAvKiBfX0dOVV9fICovCisJfQorCWZjbG9zZShmKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBleHQyZnNfY2hlY2tfbW91bnRfcG9pbnQoKSByZXR1cm5zIDEgaWYgdGhlIGRldmljZSBpcyBtb3VudGVkLCAwCisgKiBvdGhlcndpc2UuICBJZiBtdHB0IGlzIG5vbi1OVUxMLCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkZXZpY2UgaXMKKyAqIG1vdW50ZWQgaXMgY29waWVkIHRvIHdoZXJlIG10cHQgaXMgcG9pbnRpbmcsIHVwIHRvIG10bGVuCisgKiBjaGFyYWN0ZXJzLgorICovCisjaWZkZWYgX19UVVJCT0NfXworIyBwcmFnbWEgYXJnc3VzZWQKKyNlbmRpZgorZXJyY29kZV90IGV4dDJmc19jaGVja19tb3VudF9wb2ludChjb25zdCBjaGFyICpkZXZpY2UsIGludCAqbW91bnRfZmxhZ3MsCisJCQkJICBjaGFyICptdHB0LCBpbnQgbXRsZW4pCit7CisJaWYgKGlzX3N3YXBfZGV2aWNlKGRldmljZSkpIHsKKwkJKm1vdW50X2ZsYWdzID0gRVhUMl9NRl9NT1VOVEVEIHwgRVhUMl9NRl9TV0FQOworCQlzdHJuY3B5KG10cHQsICI8c3dhcD4iLCBtdGxlbik7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBIQVZFX01OVEVOVF9ICisJcmV0dXJuIGNoZWNrX21udGVudChkZXZpY2UsIG1vdW50X2ZsYWdzLCBtdHB0LCBtdGxlbik7CisjZWxzZQorI2lmZGVmIEhBVkVfR0VUTU5USU5GTworCXJldHVybiBjaGVja19nZXRtbnRpbmZvKGRldmljZSwgbW91bnRfZmxhZ3MsIG10cHQsIG10bGVuKTsKKyNlbHNlCisjaWZkZWYgX19HTlVDX18KKyAjd2FybmluZyAiQ2FuJ3QgdXNlIGdldG1udGVudCBvciBnZXRtbnRpbmZvIHRvIGNoZWNrIGZvciBtb3VudGVkIGZpbGVzeXN0ZW1zISIKKyNlbmRpZgorCSptb3VudF9mbGFncyA9IDA7CisJcmV0dXJuIDA7CisjZW5kaWYgLyogSEFWRV9HRVRNTlRJTkZPICovCisjZW5kaWYgLyogSEFWRV9NTlRFTlRfSCAqLworfQorCisvKgorICogZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQoKSBzZXRzIHRoZSBtb3VudF9mbGFncyBFWFQyX01GX01PVU5URUQsCisgKiBFWFQyX01GX1JFQURPTkxZLCBhbmQgRVhUMl9NRl9ST09UCisgKgorICovCitlcnJjb2RlX3QgZXh0MmZzX2NoZWNrX2lmX21vdW50ZWQoY29uc3QgY2hhciAqZmlsZSwgaW50ICptb3VudF9mbGFncykKK3sKKwlyZXR1cm4gZXh0MmZzX2NoZWNrX21vdW50X3BvaW50KGZpbGUsIG1vdW50X2ZsYWdzLCBOVUxMLCAwKTsKK30KKworI2lmZGVmIERFQlVHCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50CXJldHZhbCwgbW91bnRfZmxhZ3M7CisJY2hhcgltbnRwdFs4MF07CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZGV2aWNlXG4iLCBhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwltbnRwdFswXSA9IDA7CisJcmV0dmFsID0gZXh0MmZzX2NoZWNrX21vdW50X3BvaW50KGFyZ3ZbMV0sICZtb3VudF9mbGFncywKKwkJCQkJICBtbnRwdCwgc2l6ZW9mKG1udHB0KSk7CisJaWYgKHJldHZhbCkgeworCQljb21fZXJyKGFyZ3ZbMF0sIHJldHZhbCwKKwkJCSJ3aGlsZSBjYWxsaW5nIGV4dDJmc19jaGVja19pZl9tb3VudGVkIik7CisJCWV4aXQoMSk7CisJfQorCXByaW50ZigiRGV2aWNlICVzIHJlcG9ydHMgZmxhZ3MgJTAyeFxuIiwgYXJndlsxXSwgbW91bnRfZmxhZ3MpOworCWlmIChtb3VudF9mbGFncyAmIEVYVDJfTUZfQlVTWSkKKwkJcHJpbnRmKCJcdCVzIGlzIGFwcGFyZW50bHkgaW4gdXNlLlxuIiwgYXJndlsxXSk7CisJaWYgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKQorCQlwcmludGYoIlx0JXMgaXMgbW91bnRlZC5cbiIsIGFyZ3ZbMV0pOworCWlmIChtb3VudF9mbGFncyAmIEVYVDJfTUZfU1dBUCkKKwkJcHJpbnRmKCJcdCVzIGlzIGEgc3dhcCBkZXZpY2UuXG4iLCBhcmd2WzFdKTsKKwlpZiAobW91bnRfZmxhZ3MgJiBFWFQyX01GX1JFQURPTkxZKQorCQlwcmludGYoIlx0JXMgaXMgcmVhZC1vbmx5LlxuIiwgYXJndlsxXSk7CisJaWYgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9JU1JPT1QpCisJCXByaW50ZigiXHQlcyBpcyB0aGUgcm9vdCBmaWxlc3lzdGVtLlxuIiwgYXJndlsxXSk7CisJaWYgKG1udHB0WzBdKQorCQlwcmludGYoIlx0JXMgaXMgbW91bnRlZCBvbiAlcy5cbiIsIGFyZ3ZbMV0sIG1udHB0KTsKKwlleGl0KDApOworfQorI2VuZGlmIC8qIERFQlVHICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvamZzX2RhdC5oIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2pmc19kYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2M1ODZhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2pmc19kYXQuaApAQCAtMCwwICsxLDYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBqZnNfZGF0LmggLS0tIHN0cmlwcGVkIGRvd24gaGVhZGVyIGZpbGUgd2hpY2ggb25seSBjb250YWlucyB0aGUgSkZTCisgKglvbi1kaXNrIGRhdGEgc3RydWN0dXJlcworICovCisKKyNkZWZpbmUgSkZTX01BR0lDX05VTUJFUiAweGMwM2IzOTk4VSAvKiBUaGUgZmlyc3QgNCBieXRlcyBvZiAvZGV2L3JhbmRvbSEgKi8KKworLyoKKyAqIE9uLWRpc2sgc3RydWN0dXJlcworICovCisKKy8qCisgKiBEZXNjcmlwdG9yIGJsb2NrIHR5cGVzOgorICovCisKKyNkZWZpbmUgSkZTX0RFU0NSSVBUT1JfQkxPQ0sJMQorI2RlZmluZSBKRlNfQ09NTUlUX0JMT0NLCTIKKyNkZWZpbmUgSkZTX1NVUEVSQkxPQ0sJCTMKKworLyoKKyAqIFN0YW5kYXJkIGhlYWRlciBmb3IgYWxsIGRlc2NyaXB0b3IgYmxvY2tzOgorICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2hlYWRlcl9zCit7CisJX191MzIJCWhfbWFnaWM7CisJX191MzIJCWhfYmxvY2t0eXBlOworCV9fdTMyCQloX3NlcXVlbmNlOworfSBqb3VybmFsX2hlYWRlcl90OworCisKKy8qCisgKiBUaGUgYmxvY2sgdGFnOiB1c2VkIHRvIGRlc2NyaWJlIGEgc2luZ2xlIGJ1ZmZlciBpbiB0aGUgam91cm5hbAorICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2Jsb2NrX3RhZ19zCit7CisJX191MzIJCXRfYmxvY2tucjsJLyogVGhlIG9uLWRpc2sgYmxvY2sgbnVtYmVyICovCisJX191MzIJCXRfZmxhZ3M7CS8qIFNlZSBiZWxvdyAqLworfSBqb3VybmFsX2Jsb2NrX3RhZ190OworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIGpvdXJuYWwgdGFnIGZsYWdzIHdvcmQ6ICovCisjZGVmaW5lIEpGU19GTEFHX0VTQ0FQRQkJMQkvKiBvbi1kaXNrIGJsb2NrIGlzIGVzY2FwZWQgKi8KKyNkZWZpbmUgSkZTX0ZMQUdfU0FNRV9VVUlECTIJLyogYmxvY2sgaGFzIHNhbWUgdXVpZCBhcyBwcmV2aW91cyAqLworI2RlZmluZSBKRlNfRkxBR19ERUxFVEVECTQJLyogYmxvY2sgZGVsZXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uICovCisjZGVmaW5lIEpGU19GTEFHX0xBU1RfVEFHCTgJLyogbGFzdCB0YWcgaW4gdGhpcyBkZXNjcmlwdG9yIGJsb2NrICovCisKKworLyoKKyAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MKK3sKKwlqb3VybmFsX2hlYWRlcl90IHNfaGVhZGVyOworCisJLyogU3RhdGljIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGpvdXJuYWwgKi8KKwlfX3UzMgkJc19ibG9ja3NpemU7CS8qIGpvdXJuYWwgZGV2aWNlIGJsb2Nrc2l6ZSAqLworCV9fdTMyCQlzX21heGxlbjsJLyogdG90YWwgYmxvY2tzIGluIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCQlzX2ZpcnN0OwkvKiBmaXJzdCBibG9jayBvZiBsb2cgaW5mb3JtYXRpb24gKi8KKworCS8qIER5bmFtaWMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9nICovCisJX191MzIJCXNfc2VxdWVuY2U7CS8qIGZpcnN0IGNvbW1pdCBJRCBleHBlY3RlZCBpbiBsb2cgKi8KKwlfX3UzMgkJc19zdGFydDsJLyogYmxvY2tuciBvZiBzdGFydCBvZiBsb2cgKi8KK30gam91cm5hbF9zdXBlcmJsb2NrX3Q7CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMva2VybmVsLWpiZC5oIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2tlcm5lbC1qYmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNkOTdhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2tlcm5lbC1qYmQuaApAQCAtMCwwICsxLDIzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9qYmQuaAorICoKKyAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAwIFJlZCBIYXQsIEluYyAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIERlZmluaXRpb25zIGZvciB0cmFuc2FjdGlvbiBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBidWZmZXIgY2FjaGUKKyAqIGZpbGVzeXN0ZW0gam91cm5hbGluZyBzdXBwb3J0LgorICovCisjaWZuZGVmIExJTlVYX0pCRF9ICisjZGVmaW5lIExJTlVYX0pCRF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBTdGFuZGFyZCBoZWFkZXIgZm9yIGFsbCBkZXNjcmlwdG9yIGJsb2NrczoKKyAqLworCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2hlYWRlcl9zCit7CisJX191MzIJCWhfbWFnaWM7CisJX191MzIJCWhfYmxvY2t0eXBlOworCV9fdTMyCQloX3NlcXVlbmNlOworfSBqb3VybmFsX2hlYWRlcl90OworCisvKgorICogVGhpcyBpcyB0aGUgZ2xvYmFsIGUyZnNjayBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGUyZnNja19zdHJ1Y3QgKmUyZnNja190OworCisKK3N0cnVjdCBpbm9kZSB7CisJZTJmc2NrX3QgICAgICAgIGlfY3R4OworCWV4dDJfaW5vX3QgICAgICBpX2lubzsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSBpX2V4dDI7Cit9OworCisKKy8qCisgKiBUaGUgam91cm5hbCBzdXBlcmJsb2NrLiAgQWxsIGZpZWxkcyBhcmUgaW4gYmlnLWVuZGlhbiBieXRlIG9yZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcworeworLyogMHgwMDAwICovCisJam91cm5hbF9oZWFkZXJfdCBzX2hlYWRlcjsKKworLyogMHgwMDBDICovCisJLyogU3RhdGljIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGpvdXJuYWwgKi8KKwlfX3UzMglzX2Jsb2Nrc2l6ZTsJCS8qIGpvdXJuYWwgZGV2aWNlIGJsb2Nrc2l6ZSAqLworCV9fdTMyCXNfbWF4bGVuOwkJLyogdG90YWwgYmxvY2tzIGluIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfZmlyc3Q7CQkvKiBmaXJzdCBibG9jayBvZiBsb2cgaW5mb3JtYXRpb24gKi8KKworLyogMHgwMDE4ICovCisJLyogRHluYW1pYyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsb2cgKi8KKwlfX3UzMglzX3NlcXVlbmNlOwkJLyogZmlyc3QgY29tbWl0IElEIGV4cGVjdGVkIGluIGxvZyAqLworCV9fdTMyCXNfc3RhcnQ7CQkvKiBibG9ja25yIG9mIHN0YXJ0IG9mIGxvZyAqLworCisvKiAweDAwMjAgKi8KKwkvKiBFcnJvciB2YWx1ZSwgYXMgc2V0IGJ5IGpvdXJuYWxfYWJvcnQoKS4gKi8KKwlfX3MzMglzX2Vycm5vOworCisvKiAweDAwMjQgKi8KKwkvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGluIGEgdmVyc2lvbi0yIHN1cGVyYmxvY2sgKi8KKwlfX3UzMglzX2ZlYXR1cmVfY29tcGF0OwkvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX191MzIJc19mZWF0dXJlX2luY29tcGF0OwkvKiBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3UzMglzX2ZlYXR1cmVfcm9fY29tcGF0OwkvKiByZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisvKiAweDAwMzAgKi8KKwlfX3U4CXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIGpvdXJuYWwgKi8KKworLyogMHgwMDQwICovCisJX191MzIJc19ucl91c2VyczsJCS8qIE5yIG9mIGZpbGVzeXN0ZW1zIHNoYXJpbmcgbG9nICovCisKKwlfX3UzMglzX2R5bnN1cGVyOwkJLyogQmxvY2tuciBvZiBkeW5hbWljIHN1cGVyYmxvY2sgY29weSovCisKKy8qIDB4MDA0OCAqLworCV9fdTMyCXNfbWF4X3RyYW5zYWN0aW9uOwkvKiBMaW1pdCBvZiBqb3VybmFsIGJsb2NrcyBwZXIgdHJhbnMuKi8KKwlfX3UzMglzX21heF90cmFuc19kYXRhOwkvKiBMaW1pdCBvZiBkYXRhIGJsb2NrcyBwZXIgdHJhbnMuICovCisKKy8qIDB4MDA1MCAqLworCV9fdTMyCXNfcGFkZGluZ1s0NF07CisKKy8qIDB4MDEwMCAqLworCV9fdTgJc191c2Vyc1sxNio0OF07CQkvKiBpZHMgb2YgYWxsIGZzJ2VzIHNoYXJpbmcgdGhlIGxvZyAqLworLyogMHgwNDAwICovCit9IGpvdXJuYWxfc3VwZXJibG9ja190OworCisKK2V4dGVybiBpbnQgam91cm5hbF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gaW50IGpiZF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSk7CisKKyNkZWZpbmUgSkZTX01JTl9KT1VSTkFMX0JMT0NLUyAxMDI0CisKKworLyoKKyAqIEludGVybmFsIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgbG9nZ2luZyBtZWNoYW5pc206CisgKi8KKworI2RlZmluZSBKRlNfTUFHSUNfTlVNQkVSIDB4YzAzYjM5OThVIC8qIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIC9kZXYvcmFuZG9tISAqLworCisvKgorICogRGVzY3JpcHRvciBibG9jayB0eXBlczoKKyAqLworCisjZGVmaW5lIEpGU19ERVNDUklQVE9SX0JMT0NLCTEKKyNkZWZpbmUgSkZTX0NPTU1JVF9CTE9DSwkyCisjZGVmaW5lIEpGU19TVVBFUkJMT0NLX1YxCTMKKyNkZWZpbmUgSkZTX1NVUEVSQkxPQ0tfVjIJNAorI2RlZmluZSBKRlNfUkVWT0tFX0JMT0NLCTUKKworLyoKKyAqIFRoZSBibG9jayB0YWc6IHVzZWQgdG8gZGVzY3JpYmUgYSBzaW5nbGUgYnVmZmVyIGluIHRoZSBqb3VybmFsCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfYmxvY2tfdGFnX3MKK3sKKwlfX3UzMgkJdF9ibG9ja25yOwkvKiBUaGUgb24tZGlzayBibG9jayBudW1iZXIgKi8KKwlfX3UzMgkJdF9mbGFnczsJLyogU2VlIGJlbG93ICovCit9IGpvdXJuYWxfYmxvY2tfdGFnX3Q7CisKKy8qCisgKiBUaGUgcmV2b2tlIGRlc2NyaXB0b3I6IHVzZWQgb24gZGlzayB0byBkZXNjcmliZSBhIHNlcmllcyBvZiBibG9ja3MgdG8KKyAqIGJlIHJldm9rZWQgZnJvbSB0aGUgbG9nCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfcmV2b2tlX2hlYWRlcl9zCit7CisJam91cm5hbF9oZWFkZXJfdCByX2hlYWRlcjsKKwlpbnQJCSByX2NvdW50OwkvKiBDb3VudCBvZiBieXRlcyB1c2VkIGluIHRoZSBibG9jayAqLworfSBqb3VybmFsX3Jldm9rZV9oZWFkZXJfdDsKKworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIGpvdXJuYWwgdGFnIGZsYWdzIHdvcmQ6ICovCisjZGVmaW5lIEpGU19GTEFHX0VTQ0FQRQkJMQkvKiBvbi1kaXNrIGJsb2NrIGlzIGVzY2FwZWQgKi8KKyNkZWZpbmUgSkZTX0ZMQUdfU0FNRV9VVUlECTIJLyogYmxvY2sgaGFzIHNhbWUgdXVpZCBhcyBwcmV2aW91cyAqLworI2RlZmluZSBKRlNfRkxBR19ERUxFVEVECTQJLyogYmxvY2sgZGVsZXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uICovCisjZGVmaW5lIEpGU19GTEFHX0xBU1RfVEFHCTgJLyogbGFzdCB0YWcgaW4gdGhpcyBkZXNjcmlwdG9yIGJsb2NrICovCisKKworCisKKyNkZWZpbmUgSkZTX0hBU19DT01QQVRfRkVBVFVSRShqLG1hc2spCQkJCQlcCisJKChqKS0+al9mb3JtYXRfdmVyc2lvbiA+PSAyICYmCQkJCQlcCisJICgoaiktPmpfc3VwZXJibG9jay0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19iZTMyKChtYXNrKSkpKQorI2RlZmluZSBKRlNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKGosbWFzaykJCQkJXAorCSgoaiktPmpfZm9ybWF0X3ZlcnNpb24gPj0gMiAmJgkJCQkJXAorCSAoKGopLT5qX3N1cGVyYmxvY2stPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fYmUzMigobWFzaykpKSkKKyNkZWZpbmUgSkZTX0hBU19JTkNPTVBBVF9GRUFUVVJFKGosbWFzaykJCQkJXAorCSgoaiktPmpfZm9ybWF0X3ZlcnNpb24gPj0gMiAmJgkJCQkJXAorCSAoKGopLT5qX3N1cGVyYmxvY2stPnNfZmVhdHVyZV9pbmNvbXBhdCAmIGNwdV90b19iZTMyKChtYXNrKSkpKQorCisjZGVmaW5lIEpGU19GRUFUVVJFX0lOQ09NUEFUX1JFVk9LRQkweDAwMDAwMDAxCisKKy8qIEZlYXR1cmVzIGtub3duIHRvIHRoaXMga2VybmVsIHZlcnNpb246ICovCisjZGVmaW5lIEpGU19LTk9XTl9DT01QQVRfRkVBVFVSRVMJMAorI2RlZmluZSBKRlNfS05PV05fUk9DT01QQVRfRkVBVFVSRVMJMAorI2RlZmluZSBKRlNfS05PV05fSU5DT01QQVRfRkVBVFVSRVMJSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFCisKKy8qIENvbXBhcmlzb24gZnVuY3Rpb25zIGZvciB0cmFuc2FjdGlvbiBJRHM6IHBlcmZvcm0gY29tcGFyaXNvbnMgdXNpbmcKKyAqIG1vZHVsbyBhcml0aG1ldGljIHNvIHRoYXQgdGhleSB3b3JrIG92ZXIgc2VxdWVuY2UgbnVtYmVyIHdyYXBzLiAqLworCisKKy8qCisgKiBEZWZpbml0aW9ucyB3aGljaCBhdWdtZW50IHRoZSBidWZmZXJfaGVhZCBsYXllcgorICovCisKKy8qIGpvdXJuYWxpbmcgYnVmZmVyIHR5cGVzICovCisjZGVmaW5lIEJKX05vbmUJCTAJLyogTm90IGpvdXJuYWxlZCAqLworI2RlZmluZSBCSl9TeW5jRGF0YQkxCS8qIE5vcm1hbCBkYXRhOiBmbHVzaCBiZWZvcmUgY29tbWl0ICovCisjZGVmaW5lIEJKX0FzeW5jRGF0YQkyCS8qIHdyaXRlcGFnZSBkYXRhOiB3YWl0IG9uIGl0IGJlZm9yZSBjb21taXQgKi8KKyNkZWZpbmUgQkpfTWV0YWRhdGEJMwkvKiBOb3JtYWwgam91cm5hbGVkIG1ldGFkYXRhICovCisjZGVmaW5lIEJKX0ZvcmdldAk0CS8qIEJ1ZmZlciBzdXBlcmNlZGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgQkpfSU8JCTUJLyogQnVmZmVyIGlzIGZvciB0ZW1wb3JhcnkgSU8gdXNlICovCisjZGVmaW5lIEJKX1NoYWRvdwk2CS8qIEJ1ZmZlciBjb250ZW50cyBiZWluZyBzaGFkb3dlZCB0byB0aGUgbG9nICovCisjZGVmaW5lIEJKX0xvZ0N0bAk3CS8qIEJ1ZmZlciBjb250YWlucyBsb2cgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQkpfUmVzZXJ2ZWQJOAkvKiBCdWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIGFjY2VzcyBieSBqb3VybmFsICovCisjZGVmaW5lIEJKX1R5cGVzCTkKKworCitzdHJ1Y3Qga2Rldl9zIHsKKwllMmZzY2tfdCAgICAgICAga19jdHg7CisJaW50ICAgICAgICAgICAgIGtfZGV2OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga2Rldl9zICprZGV2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB0aWRfdDsKKworc3RydWN0IGpvdXJuYWxfcworeworCXVuc2lnbmVkIGxvbmcJCWpfZmxhZ3M7CisJaW50CQkJal9lcnJubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKglqX3NiX2J1ZmZlcjsKKwlzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MgKmpfc3VwZXJibG9jazsKKwlpbnQJCQlqX2Zvcm1hdF92ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcJCWpfaGVhZDsKKwl1bnNpZ25lZCBsb25nCQlqX3RhaWw7CisJdW5zaWduZWQgbG9uZwkJal9mcmVlOworCXVuc2lnbmVkIGxvbmcJCWpfZmlyc3QsIGpfbGFzdDsKKwlrZGV2X3QJCQlqX2RldjsKKwlrZGV2X3QJCQlqX2ZzX2RldjsKKwlpbnQJCQlqX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCWpfYmxrX29mZnNldDsKKwl1bnNpZ25lZCBpbnQJCWpfbWF4bGVuOworCXN0cnVjdCBpbm9kZSAqCQlqX2lub2RlOworCXRpZF90CQkJal90YWlsX3NlcXVlbmNlOworCXRpZF90CQkJal90cmFuc2FjdGlvbl9zZXF1ZW5jZTsKKwlfX3U4CQkJal91dWlkWzE2XTsKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICpqX3Jldm9rZTsKK307CisKK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfcyBqb3VybmFsX3Q7CisKK2V4dGVybiBpbnQJICAgam91cm5hbF9yZWNvdmVyICAgIChqb3VybmFsX3QgKmpvdXJuYWwpOworZXh0ZXJuIGludAkgICBqb3VybmFsX3NraXBfcmVjb3ZlcnkgKGpvdXJuYWxfdCAqKTsKKworLyogUHJpbWFyeSByZXZva2Ugc3VwcG9ydCAqLworZXh0ZXJuIGludAkgICBqb3VybmFsX2luaXRfcmV2b2tlKGpvdXJuYWxfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQJICAgam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXModm9pZCk7CitleHRlcm4gaW50CSAgIGpvdXJuYWxfaW5pdF9yZXZva2VfY2FjaGVzKHZvaWQpOworCisvKiBSZWNvdmVyeSByZXZva2Ugc3VwcG9ydCAqLworZXh0ZXJuIGludAkgICBqb3VybmFsX3NldF9yZXZva2Uoam91cm5hbF90ICosIHVuc2lnbmVkIGxvbmcsIHRpZF90KTsKK2V4dGVybiBpbnQJICAgam91cm5hbF90ZXN0X3Jldm9rZShqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZywgdGlkX3QpOworZXh0ZXJuIHZvaWQJICAgam91cm5hbF9jbGVhcl9yZXZva2Uoam91cm5hbF90ICopOworZXh0ZXJuIHZvaWQJICAgam91cm5hbF9icmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICpiW10sIGludCBuKTsKKworZXh0ZXJuIHZvaWQJICAgam91cm5hbF9kZXN0cm95X3Jldm9rZShqb3VybmFsX3QgKik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMva2VybmVsLWxpc3QuaCBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9rZXJuZWwtbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDcxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMva2VybmVsLWxpc3QuaApAQCAtMCwwICsxLDExMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIExJTlVYX0xJU1RfSAorI2RlZmluZSBMSU5VWF9MSVNUX0ggMQorCisvKgorICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTb21lIG9mIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKCJfX3h4eCIpIGFyZSB1c2VmdWwgd2hlbgorICogbWFuaXB1bGF0aW5nIHdob2xlIGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKK3N0cnVjdCBsaXN0X2hlYWQgeworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQsICpwcmV2OworfTsKKworI2RlZmluZSBMSVNUX0hFQURfSU5JVChuYW1lKSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIExJU1RfSEVBRChuYW1lKSBcCisJc3RydWN0IGxpc3RfaGVhZCBuYW1lID0geyAmbmFtZSwgJm5hbWUgfQorCisjZGVmaW5lIElOSVRfTElTVF9IRUFEKHB0cikgZG8geyBcCisJKHB0ciktPm5leHQgPSAocHRyKTsgKHB0ciktPnByZXYgPSAocHRyKTsgXAorfSB3aGlsZSAoMCkKKworI2lmICghZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19XQVRDT01DX18pKQorI2RlZmluZSBfX2lubGluZV9fCisjZW5kaWYKKworLyoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBiZXR3ZWVuIHR3byBrbm93biBjb25zZWN1dGl2ZSBlbnRyaWVzLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICogbmV3LAorCXN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LAorCXN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBuZXc7CisJbmV3LT5uZXh0ID0gbmV4dDsKKwluZXctPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXc7Cit9CisKKy8qCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBoZWFkLi4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBsaXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChuZXcsIGhlYWQsIGhlYWQtPm5leHQpOworfQorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGF0IHRoZSB0YWlsCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlzdF9hZGRfdGFpbChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChuZXcsIGhlYWQtPnByZXYsIGhlYWQpOworfQorCisvKgorICogRGVsZXRlIGEgbGlzdCBlbnRyeSBieSBtYWtpbmcgdGhlIHByZXYvbmV4dCBlbnRyaWVzCisgKiBwb2ludCB0byBlYWNoIG90aGVyLgorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19saXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKiBuZXh0KQoreworCW5leHQtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBuZXh0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGxpc3RfZW1wdHkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisvKgorICogU3BsaWNlIGluICJsaXN0IiBpbnRvICJoZWFkIgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpc3Rfc3BsaWNlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3QgPSBsaXN0LT5uZXh0OworCisJaWYgKGZpcnN0ICE9IGxpc3QpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGFzdCA9IGxpc3QtPnByZXY7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKKworCQlmaXJzdC0+cHJldiA9IGhlYWQ7CisJCWhlYWQtPm5leHQgPSBmaXJzdDsKKworCQlsYXN0LT5uZXh0ID0gYXQ7CisJCWF0LT5wcmV2ID0gbGFzdDsKKwl9Cit9CisKKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCSgodHlwZSAqKSgoY2hhciAqKShwdHIpLSh1bnNpZ25lZCBsb25nKSgmKCh0eXBlICopMCktPm1lbWJlcikpKQorCisjZGVmaW5lIGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbGluay5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2xpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGIyZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL2xpbmsuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGluay5jIC0tLSBjcmVhdGUgbGlua3MgaW4gYSBleHQyZnMgZGlyZWN0b3J5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IGxpbmtfc3RydWN0ICB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlpbnQJCW5hbWVsZW47CisJZXh0Ml9pbm9fdAlpbm9kZTsKKwlpbnQJCWZsYWdzOworCWludAkJZG9uZTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2I7Cit9OworCitzdGF0aWMgaW50IGxpbmtfcHJvYyhzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKmRpcmVudCwKKwkJICAgICBpbnQJb2Zmc2V0LAorCQkgICAgIGludAlibG9ja3NpemUsCisJCSAgICAgY2hhcgkqYnVmLAorCQkgICAgIHZvaWQJKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgbGlua19zdHJ1Y3QgKmxzID0gKHN0cnVjdCBsaW5rX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpuZXh0OworCWludCByZWNfbGVuLCBtaW5fcmVjX2xlbjsKKwlpbnQgcmV0ID0gMDsKKworCXJlY19sZW4gPSBFWFQyX0RJUl9SRUNfTEVOKGxzLT5uYW1lbGVuKTsKKworCS8qCisJICogU2VlIGlmIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IGVudHJ5IChpZiBhbnkpIGlzIHVudXNlZDsKKwkgKiBpZiBzbywgYWJzb3JiIGl0IGludG8gdGhpcyBvbmUuCisJICovCisJbmV4dCA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgKGJ1ZiArIG9mZnNldCArIGRpcmVudC0+cmVjX2xlbik7CisJaWYgKChvZmZzZXQgKyBkaXJlbnQtPnJlY19sZW4gPCBibG9ja3NpemUgLSA4KSAmJgorCSAgICAobmV4dC0+aW5vZGUgPT0gMCkgJiYKKwkgICAgKG9mZnNldCArIGRpcmVudC0+cmVjX2xlbiArIG5leHQtPnJlY19sZW4gPD0gYmxvY2tzaXplKSkgeworCQlkaXJlbnQtPnJlY19sZW4gKz0gbmV4dC0+cmVjX2xlbjsKKwkJcmV0ID0gRElSRU5UX0NIQU5HRUQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGlzIHVzZWQsIHNlZSBpZiB3ZSBjYW4gc3BsaXQgdGhlCisJICogZGlyZWN0b3J5IGVudHJ5IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBuYW1lLiAgSWYgc28sCisJICogdHJ1bmNhdGUgaXQgYW5kIHJldHVybi4KKwkgKi8KKwlpZiAoZGlyZW50LT5pbm9kZSkgeworCQltaW5fcmVjX2xlbiA9IEVYVDJfRElSX1JFQ19MRU4oZGlyZW50LT5uYW1lX2xlbiAmIDB4RkYpOworCQlpZiAoZGlyZW50LT5yZWNfbGVuIDwgKG1pbl9yZWNfbGVuICsgcmVjX2xlbikpCisJCQlyZXR1cm4gcmV0OworCQlyZWNfbGVuID0gZGlyZW50LT5yZWNfbGVuIC0gbWluX3JlY19sZW47CisJCWRpcmVudC0+cmVjX2xlbiA9IG1pbl9yZWNfbGVuOworCQluZXh0ID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSAoYnVmICsgb2Zmc2V0ICsKKwkJCQkJCSAgZGlyZW50LT5yZWNfbGVuKTsKKwkJbmV4dC0+aW5vZGUgPSAwOworCQluZXh0LT5uYW1lX2xlbiA9IDA7CisJCW5leHQtPnJlY19sZW4gPSByZWNfbGVuOworCQlyZXR1cm4gRElSRU5UX0NIQU5HRUQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBnZXQgdGhpcyBmYXIsIHRoZW4gdGhlIGRpcmVjdG9yeSBlbnRyeSBpcyBub3QgdXNlZC4KKwkgKiBTZWUgaWYgd2UgY2FuIGZpdCB0aGUgcmVxdWVzdCBlbnRyeSBpbi4gIElmIHNvLCBkbyBpdC4KKwkgKi8KKwlpZiAoZGlyZW50LT5yZWNfbGVuIDwgcmVjX2xlbikKKwkJcmV0dXJuIHJldDsKKwlkaXJlbnQtPmlub2RlID0gbHMtPmlub2RlOworCWRpcmVudC0+bmFtZV9sZW4gPSBscy0+bmFtZWxlbjsKKwlzdHJuY3B5KGRpcmVudC0+bmFtZSwgbHMtPm5hbWUsIGxzLT5uYW1lbGVuKTsKKwlpZiAobHMtPnNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpCisJCWRpcmVudC0+bmFtZV9sZW4gfD0gKGxzLT5mbGFncyAmIDB4NykgPDwgODsKKworCWxzLT5kb25lKys7CisJcmV0dXJuIERJUkVOVF9BQk9SVHxESVJFTlRfQ0hBTkdFRDsKK30KKworLyoKKyAqIE5vdGU6IHRoZSBsb3cgMyBiaXRzIG9mIHRoZSBmbGFncyBmaWVsZCBhcmUgdXNlZCBhcyB0aGUgZGlyZWN0b3J5CisgKiBlbnRyeSBmaWxldHlwZS4KKyAqLworI2lmZGVmIF9fVFVSQk9DX18KKyMgcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK2VycmNvZGVfdCBleHQyZnNfbGluayhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIGV4dDJfaW5vX3QgaW5vLCBpbnQgZmxhZ3MpCit7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc3RydWN0IGxpbmtfc3RydWN0CWxzOworCXN0cnVjdCBleHQyX2lub2RlCWlub2RlOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKworCWxzLm5hbWUgPSBuYW1lOworCWxzLm5hbWVsZW4gPSBuYW1lID8gc3RybGVuKG5hbWUpIDogMDsKKwlscy5pbm9kZSA9IGlubzsKKwlscy5mbGFncyA9IGZsYWdzOworCWxzLmRvbmUgPSAwOworCWxzLnNiID0gZnMtPnN1cGVyOworCisJcmV0dmFsID0gZXh0MmZzX2Rpcl9pdGVyYXRlKGZzLCBkaXIsIERJUkVOVF9GTEFHX0lOQ0xVREVfRU1QVFksCisJCQkJICAgIDAsIGxpbmtfcHJvYywgJmxzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKCFscy5kb25lKQorCQlyZXR1cm4gRVhUMl9FVF9ESVJfTk9fU1BBQ0U7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBkaXIsICZpbm9kZSkpICE9IDApCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoaW5vZGUuaV9mbGFncyAmIEVYVDJfSU5ERVhfRkwpIHsKKwkJaW5vZGUuaV9mbGFncyAmPSB+RVhUMl9JTkRFWF9GTDsKKwkJaWYgKChyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIGRpciwgJmlub2RlKSkgIT0gMCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbG9va3VwLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbG9va3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlOGRlOAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9sb29rdXAuYwpAQCAtMCwwICsxLDY4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsb29rdXAuYyAtLS0gZXh0MmZzIGRpcmVjdG9yeSBsb29rdXAgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NCwgMTk5NSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3N0cnVjdCBsb29rdXBfc3RydWN0ICB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlpbnQJCWxlbjsKKwlleHQyX2lub190CSppbm9kZTsKKwlpbnQJCWZvdW5kOworfTsKKworI2lmZGVmIF9fVFVSQk9DX18KKyMgcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK3N0YXRpYyBpbnQgbG9va3VwX3Byb2Moc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCSAgICAgICBpbnQJb2Zmc2V0IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIGludAlibG9ja3NpemUgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkgICAgICAgY2hhcgkqYnVmIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICAgIHZvaWQJKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgbG9va3VwX3N0cnVjdCAqbHMgPSAoc3RydWN0IGxvb2t1cF9zdHJ1Y3QgKikgcHJpdl9kYXRhOworCisJaWYgKGxzLT5sZW4gIT0gKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cm5jbXAobHMtPm5hbWUsIGRpcmVudC0+bmFtZSwgKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSkpCisJCXJldHVybiAwOworCSpscy0+aW5vZGUgPSBkaXJlbnQtPmlub2RlOworCWxzLT5mb3VuZCsrOworCXJldHVybiBESVJFTlRfQUJPUlQ7Cit9CisKKworZXJyY29kZV90IGV4dDJmc19sb29rdXAoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3QgZGlyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJaW50IG5hbWVsZW4sIGNoYXIgKmJ1ZiwgZXh0Ml9pbm9fdCAqaW5vZGUpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgbG9va3VwX3N0cnVjdCBsczsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlscy5uYW1lID0gbmFtZTsKKwlscy5sZW4gPSBuYW1lbGVuOworCWxzLmlub2RlID0gaW5vZGU7CisJbHMuZm91bmQgPSAwOworCisJcmV0dmFsID0gZXh0MmZzX2Rpcl9pdGVyYXRlKGZzLCBkaXIsIDAsIGJ1ZiwgbG9va3VwX3Byb2MsICZscyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAobHMuZm91bmQpID8gMCA6IEVYVDJfRVRfRklMRV9OT1RfRk9VTkQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbWtkaXIuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ta2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmFjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbWtkaXIuYwpAQCAtMCwwICsxLDEzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtkaXIuYyAtLS0gbWFrZSBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisjaWZuZGVmIEVYVDJfRlRfRElSCisjZGVmaW5lIEVYVDJfRlRfRElSCQkyCisjZW5kaWYKKworZXJyY29kZV90IGV4dDJmc19ta2RpcihleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBwYXJlbnQsIGV4dDJfaW5vX3QgaW51bSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUJcGFyZW50X2lub2RlLCBpbm9kZTsKKwlleHQyX2lub190CQlpbm8gPSBpbnVtOworCWV4dDJfaW5vX3QJCXNjcmF0Y2hfaW5vOworCWJsa190CQkJYmxrOworCWNoYXIJCQkqYmxvY2sgPSBOVUxMOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCS8qCisJICogQWxsb2NhdGUgYW4gaW5vZGUsIGlmIG5lY2Vzc2FyeQorCSAqLworCWlmICghaW5vKSB7CisJCXJldHZhbCA9IGV4dDJmc19uZXdfaW5vZGUoZnMsIHBhcmVudCwgTElOVVhfU19JRkRJUiB8IDA3NTUsCisJCQkJCSAgMCwgJmlubyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIGRhdGEgYmxvY2sgZm9yIHRoZSBkaXJlY3RvcnkKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfbmV3X2Jsb2NrKGZzLCAwLCAwLCAmYmxrKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKgorCSAqIENyZWF0ZSBhIHNjcmF0Y2ggdGVtcGxhdGUgZm9yIHRoZSBkaXJlY3RvcnkKKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfbmV3X2Rpcl9ibG9jayhmcywgaW5vLCBwYXJlbnQsICZibG9jayk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJLyoKKwkgKiBHZXQgdGhlIHBhcmVudCdzIGlub2RlLCBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAocGFyZW50ICE9IGlubykgeworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgcGFyZW50LCAmcGFyZW50X2lub2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9IGVsc2UKKwkJbWVtc2V0KCZwYXJlbnRfaW5vZGUsIDAsIHNpemVvZihwYXJlbnRfaW5vZGUpKTsKKworCS8qCisJICogQ3JlYXRlIHRoZSBpbm9kZSBzdHJ1Y3R1cmUuLi4uCisJICovCisJbWVtc2V0KCZpbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7CisJaW5vZGUuaV9tb2RlID0gTElOVVhfU19JRkRJUiB8ICgwNzc3ICYgfmZzLT51bWFzayk7CisJaW5vZGUuaV91aWQgPSBpbm9kZS5pX2dpZCA9IDA7CisJaW5vZGUuaV9ibG9ja3MgPSBmcy0+YmxvY2tzaXplIC8gNTEyOworCWlub2RlLmlfYmxvY2tbMF0gPSBibGs7CisJaW5vZGUuaV9saW5rc19jb3VudCA9IDI7CisJaW5vZGUuaV9jdGltZSA9IGlub2RlLmlfYXRpbWUgPSBpbm9kZS5pX210aW1lID0gdGltZShOVUxMKTsKKwlpbm9kZS5pX3NpemUgPSBmcy0+YmxvY2tzaXplOworCisJLyoKKwkgKiBXcml0ZSBvdXQgdGhlIGlub2RlIGFuZCBpbm9kZSBkYXRhIGJsb2NrCisJICovCisJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2Rpcl9ibG9jayhmcywgYmxrLCBibG9jayk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCXJldHZhbCA9IGV4dDJmc193cml0ZV9uZXdfaW5vZGUoZnMsIGlubywgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKgorCSAqIExpbmsgdGhlIGRpcmVjdG9yeSBpbnRvIHRoZSBmaWxlc3lzdGVtIGhpZXJhcmNoeQorCSAqLworCWlmIChuYW1lKSB7CisJCXJldHZhbCA9IGV4dDJmc19sb29rdXAoZnMsIHBhcmVudCwgbmFtZSwgc3RybGVuKG5hbWUpLCAwLAorCQkJCSAgICAgICAmc2NyYXRjaF9pbm8pOworCQlpZiAoIXJldHZhbCkgeworCQkJcmV0dmFsID0gRVhUMl9FVF9ESVJfRVhJU1RTOworCQkJbmFtZSA9IDA7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKHJldHZhbCAhPSBFWFQyX0VUX0ZJTEVfTk9UX0ZPVU5EKQorCQkJZ290byBjbGVhbnVwOworCQlyZXR2YWwgPSBleHQyZnNfbGluayhmcywgcGFyZW50LCBuYW1lLCBpbm8sIEVYVDJfRlRfRElSKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBwYXJlbnQgaW5vZGUncyBjb3VudHMKKwkgKi8KKwlpZiAocGFyZW50ICE9IGlubykgeworCQlwYXJlbnRfaW5vZGUuaV9saW5rc19jb3VudCsrOworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGUoZnMsIHBhcmVudCwgJnBhcmVudF9pbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgYWNjb3VudGluZy4uLi4KKwkgKi8KKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIGJsaywgKzEpOworCWV4dDJmc19pbm9kZV9hbGxvY19zdGF0czIoZnMsIGlubywgKzEsIDEpOworCitjbGVhbnVwOgorCWV4dDJmc19mcmVlX21lbSgmYmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbWtqb3VybmFsLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbWtqb3VybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4ZDlhYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9ta2pvdXJuYWwuYwpAQCAtMCwwICsxLDQyNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtqb3VybmFsLmMgLS0tIG1ha2UgYSBqb3VybmFsIGZvciBhIGZpbGVzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICIuLi9lMnAvZTJwLmgiCisjaW5jbHVkZSAiLi4vZTJmc2NrLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisjaW5jbHVkZSAia2VybmVsLWpiZC5oIgorCisvKgorICogVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IHNldHMgdXAgdGhlIGpvdXJuYWwgc3VwZXJibG9jayBhbmQKKyAqIHJldHVybnMgaXQgYXMgYW4gYWxsb2NhdGVkIGJsb2NrLgorICovCitlcnJjb2RlX3QgZXh0MmZzX2NyZWF0ZV9qb3VybmFsX3N1cGVyYmxvY2soZXh0Ml9maWxzeXMgZnMsCisJCQkJCSAgIF9fdTMyIHNpemUsIGludCBmbGFncywKKwkJCQkJICAgY2hhciAgKipyZXRfanNiKQoreworCWVycmNvZGVfdAkJcmV0dmFsOworCWpvdXJuYWxfc3VwZXJibG9ja190CSpqc2I7CisKKwlpZiAoc2l6ZSA8IDEwMjQpCisJCXJldHVybiBFWFQyX0VUX0pPVVJOQUxfVE9PX1NNQUxMOworCisJaWYgKChyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmanNiKSkpCisJCXJldHVybiByZXR2YWw7CisKKwltZW1zZXQgKGpzYiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisKKwlqc2ItPnNfaGVhZGVyLmhfbWFnaWMgPSBodG9ubChKRlNfTUFHSUNfTlVNQkVSKTsKKwlpZiAoZmxhZ3MgJiBFWFQyX01LSk9VUk5BTF9WMV9TVVBFUikKKwkJanNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGh0b25sKEpGU19TVVBFUkJMT0NLX1YxKTsKKwllbHNlCisJCWpzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgPSBodG9ubChKRlNfU1VQRVJCTE9DS19WMik7CisJanNiLT5zX2Jsb2Nrc2l6ZSA9IGh0b25sKGZzLT5ibG9ja3NpemUpOworCWpzYi0+c19tYXhsZW4gPSBodG9ubChzaXplKTsKKwlqc2ItPnNfbnJfdXNlcnMgPSBodG9ubCgxKTsKKwlqc2ItPnNfZmlyc3QgPSBodG9ubCgxKTsKKwlqc2ItPnNfc2VxdWVuY2UgPSBodG9ubCgxKTsKKwltZW1jcHkoanNiLT5zX3V1aWQsIGZzLT5zdXBlci0+c191dWlkLCBzaXplb2YoZnMtPnN1cGVyLT5zX3V1aWQpKTsKKwkvKgorCSAqIElmIHdlJ3JlIGNyZWF0aW5nIGFuIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLCB3ZSBuZWVkIHRvCisJICogYWRqdXN0IHRoZXNlIGZpZWxkcy4KKwkgKi8KKwlpZiAoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCSAgICBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYpIHsKKwkJanNiLT5zX25yX3VzZXJzID0gMDsKKwkJaWYgKGZzLT5ibG9ja3NpemUgPT0gMTAyNCkKKwkJCWpzYi0+c19maXJzdCA9IGh0b25sKDMpOworCQllbHNlCisJCQlqc2ItPnNfZmlyc3QgPSBodG9ubCgyKTsKKwl9CisKKwkqcmV0X2pzYiA9IChjaGFyICopIGpzYjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgam91cm5hbCB1c2luZyBQT1NJWCByb3V0aW5lcy4gIEl0IGlzIHVzZWQKKyAqIGZvciBjcmVhdGluZyBleHRlcm5hbCBqb3VybmFscyBhbmQgY3JlYXRpbmcgam91cm5hbHMgb24gbGl2ZQorICogZmlsZXN5c3RlbXMuCisgKi8KK3N0YXRpYyBlcnJjb2RlX3Qgd3JpdGVfam91cm5hbF9maWxlKGV4dDJfZmlsc3lzIGZzLCBjaGFyICpmaWxlbmFtZSwKKwkJCQkgICAgYmxrX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJKmJ1ZiA9IE5VTEw7CisJaW50CQlmZCwgcmV0X3NpemU7CisJYmxrX3QJCWk7CisKKwlpZiAoKHJldHZhbCA9IGV4dDJmc19jcmVhdGVfam91cm5hbF9zdXBlcmJsb2NrKGZzLCBzaXplLCBmbGFncywgJmJ1ZikpKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogT3BlbiB0aGUgZGV2aWNlIG9yIGpvdXJuYWwgZmlsZSAqLworCWlmICgoZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSkpIDwgMCkgeworCQlyZXR2YWwgPSBlcnJubzsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJLyogV3JpdGUgdGhlIHN1cGVyYmxvY2sgb3V0ICovCisJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9XUklURTsKKwlyZXRfc2l6ZSA9IHdyaXRlKGZkLCBidWYsIGZzLT5ibG9ja3NpemUpOworCWlmIChyZXRfc2l6ZSA8IDApIHsKKwkJcmV0dmFsID0gZXJybm87CisJCWdvdG8gZXJyb3V0OworCX0KKwlpZiAocmV0X3NpemUgIT0gKGludCkgZnMtPmJsb2Nrc2l6ZSkKKwkJZ290byBlcnJvdXQ7CisJbWVtc2V0KGJ1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXJldF9zaXplID0gd3JpdGUoZmQsIGJ1ZiwgZnMtPmJsb2Nrc2l6ZSk7CisJCWlmIChyZXRfc2l6ZSA8IDApIHsKKwkJCXJldHZhbCA9IGVycm5vOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJaWYgKHJldF9zaXplICE9IChpbnQpIGZzLT5ibG9ja3NpemUpCisJCQlnb3RvIGVycm91dDsKKwl9CisJY2xvc2UoZmQpOworCisJcmV0dmFsID0gMDsKK2Vycm91dDoKKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdGhlIGpvdXJuYWwgdXNpbmcgZGlyZWN0IEkvTyByb3V0aW5lcworICovCitzdHJ1Y3QgbWtqb3VybmFsX3N0cnVjdCB7CisJaW50CQludW1fYmxvY2tzOworCWludAkJbmV3YmxvY2tzOworCWNoYXIJCSpidWY7CisJZXJyY29kZV90CWVycjsKK307CisKK3N0YXRpYyBpbnQgbWtqb3VybmFsX3Byb2MoZXh0Ml9maWxzeXMJZnMsCisJCQkgICBibGtfdAkqYmxvY2tuciwKKwkJCSAgIGUyX2Jsa2NudF90CWJsb2NrY250LAorCQkJICAgYmxrX3QJcmVmX2Jsb2NrIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgIGludAkJcmVmX29mZnNldCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgICB2b2lkCQkqcHJpdl9kYXRhKQoreworCXN0cnVjdCBta2pvdXJuYWxfc3RydWN0ICplcyA9IChzdHJ1Y3QgbWtqb3VybmFsX3N0cnVjdCAqKSBwcml2X2RhdGE7CisJYmxrX3QJbmV3X2JsazsKKwlzdGF0aWMgYmxrX3QJbGFzdF9ibGsgPSAwOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwlpZiAoKmJsb2NrbnIpIHsKKwkJbGFzdF9ibGsgPSAqYmxvY2tucjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIGxhc3RfYmxrLCAwLCAmbmV3X2Jsayk7CisJaWYgKHJldHZhbCkgeworCQllcy0+ZXJyID0gcmV0dmFsOworCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJfQorCWlmIChibG9ja2NudCA+IDApCisJCWVzLT5udW1fYmxvY2tzLS07CisKKwllcy0+bmV3YmxvY2tzKys7CisJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBuZXdfYmxrLCAxLCBlcy0+YnVmKTsKKworCWlmIChibG9ja2NudCA9PSAwKQorCQltZW1zZXQoZXMtPmJ1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisKKwlpZiAocmV0dmFsKSB7CisJCWVzLT5lcnIgPSByZXR2YWw7CisJCXJldHVybiBCTE9DS19BQk9SVDsKKwl9CisJKmJsb2NrbnIgPSBuZXdfYmxrOworCWxhc3RfYmxrID0gbmV3X2JsazsKKwlleHQyZnNfYmxvY2tfYWxsb2Nfc3RhdHMoZnMsIG5ld19ibGssICsxKTsKKworCWlmIChlcy0+bnVtX2Jsb2NrcyA9PSAwKQorCQlyZXR1cm4gKEJMT0NLX0NIQU5HRUQgfCBCTE9DS19BQk9SVCk7CisJZWxzZQorCQlyZXR1cm4gQkxPQ0tfQ0hBTkdFRDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGpvdXJuYWwgdXNpbmcgZGlyZWN0IEkvTyByb3V0aW5lcy4KKyAqLworc3RhdGljIGVycmNvZGVfdCB3cml0ZV9qb3VybmFsX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGpvdXJuYWxfaW5vLAorCQkJCSAgICAgYmxrX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIJCQkqYnVmOworCWVycmNvZGVfdAkJcmV0dmFsOworCXN0cnVjdCBleHQyX2lub2RlCWlub2RlOworCXN0cnVjdCBta2pvdXJuYWxfc3RydWN0CWVzOworCisJaWYgKChyZXR2YWwgPSBleHQyZnNfY3JlYXRlX2pvdXJuYWxfc3VwZXJibG9jayhmcywgc2l6ZSwgZmxhZ3MsICZidWYpKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX3JlYWRfYml0bWFwcyhmcykpKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKChyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgam91cm5hbF9pbm8sICZpbm9kZSkpKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKGlub2RlLmlfYmxvY2tzID4gMCkKKwkJcmV0dXJuIEVFWElTVDsKKworCWVzLm51bV9ibG9ja3MgPSBzaXplOworCWVzLm5ld2Jsb2NrcyA9IDA7CisJZXMuYnVmID0gYnVmOworCWVzLmVyciA9IDA7CisKKwlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZTIoZnMsIGpvdXJuYWxfaW5vLCBCTE9DS19GTEFHX0FQUEVORCwKKwkJCQkgICAgICAgMCwgbWtqb3VybmFsX3Byb2MsICZlcyk7CisJaWYgKGVzLmVycikgeworCQlyZXR2YWwgPSBlcy5lcnI7CisJCWdvdG8gZXJyb3V0OworCX0KKworCWlmICgocmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGpvdXJuYWxfaW5vLCAmaW5vZGUpKSkKKwkJZ290byBlcnJvdXQ7CisKKwlpbm9kZS5pX3NpemUgKz0gZnMtPmJsb2Nrc2l6ZSAqIHNpemU7CisJaW5vZGUuaV9ibG9ja3MgKz0gKGZzLT5ibG9ja3NpemUgLyA1MTIpICogZXMubmV3YmxvY2tzOworCWlub2RlLmlfbXRpbWUgPSBpbm9kZS5pX2N0aW1lID0gdGltZShOVUxMKTsKKwlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMTsKKwlpbm9kZS5pX21vZGUgPSBMSU5VWF9TX0lGUkVHIHwgMDYwMDsKKworCWlmICgocmV0dmFsID0gZXh0MmZzX3dyaXRlX2lub2RlKGZzLCBqb3VybmFsX2lubywgJmlub2RlKSkpCisJCWdvdG8gZXJyb3V0OworCXJldHZhbCA9IDA7CisKKwltZW1jcHkoZnMtPnN1cGVyLT5zX2pubF9ibG9ja3MsIGlub2RlLmlfYmxvY2ssIEVYVDJfTl9CTE9DS1MqNCk7CisJZnMtPnN1cGVyLT5zX2pubF9ibG9ja3NbMTZdID0gaW5vZGUuaV9zaXplOworCWZzLT5zdXBlci0+c19qbmxfYmFja3VwX3R5cGUgPSBFWFQzX0pOTF9CQUNLVVBfQkxPQ0tTOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKworZXJyb3V0OgorCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGEgam91cm5hbCBkZXZpY2UgdG8gYSBmaWxlc3lzdGVtCisgKi8KK2VycmNvZGVfdCBleHQyZnNfYWRkX2pvdXJuYWxfZGV2aWNlKGV4dDJfZmlsc3lzIGZzLCBleHQyX2ZpbHN5cyBqb3VybmFsX2RldikKK3sKKwlzdHJ1Y3Qgc3RhdAlzdDsKKwllcnJjb2RlX3QJcmV0dmFsOworCWNoYXIJCWJ1ZlsxMDI0XTsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdAkqanNiOworCWludAkJc3RhcnQ7CisJX191MzIJCWksIG5yX3VzZXJzOworCisJLyogTWFrZSBzdXJlIHRoZSBkZXZpY2UgZXhpc3RzIGFuZCBpcyBhIGJsb2NrIGRldmljZSAqLworCWlmIChzdGF0KGpvdXJuYWxfZGV2LT5kZXZpY2VfbmFtZSwgJnN0KSA8IDApCisJCXJldHVybiBlcnJubzsKKworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIEVYVDJfRVRfSk9VUk5BTF9OT1RfQkxPQ0s7IC8qIE11c3QgYmUgYSBibG9jayBkZXZpY2UgKi8KKworCS8qIEdldCB0aGUgam91cm5hbCBzdXBlcmJsb2NrICovCisJc3RhcnQgPSAxOworCWlmIChqb3VybmFsX2Rldi0+YmxvY2tzaXplID09IDEwMjQpCisJCXN0YXJ0Kys7CisJaWYgKChyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGpvdXJuYWxfZGV2LT5pbywgc3RhcnQsIC0xMDI0LCBidWYpKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCWpzYiA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKSBidWY7CisJaWYgKChqc2ItPnNfaGVhZGVyLmhfbWFnaWMgIT0gKHVuc2lnbmVkKSBudG9obChKRlNfTUFHSUNfTlVNQkVSKSkgfHwKKwkgICAgKGpzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgIT0gKHVuc2lnbmVkKSBudG9obChKRlNfU1VQRVJCTE9DS19WMikpKQorCQlyZXR1cm4gRVhUMl9FVF9OT19KT1VSTkFMX1NCOworCisJaWYgKG50b2hsKGpzYi0+c19ibG9ja3NpemUpICE9ICh1bnNpZ25lZCBsb25nKSBmcy0+YmxvY2tzaXplKQorCQlyZXR1cm4gRVhUMl9FVF9VTkVYUEVDVEVEX0JMT0NLX1NJWkU7CisKKwkvKiBDaGVjayBhbmQgc2VlIGlmIHRoaXMgZmlsZXN5c3RlbSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkICovCisJbnJfdXNlcnMgPSBudG9obChqc2ItPnNfbnJfdXNlcnMpOworCWZvciAoaT0wOyBpIDwgbnJfdXNlcnM7IGkrKykgeworCQlpZiAobWVtY21wKGZzLT5zdXBlci0+c191dWlkLAorCQkJICAgJmpzYi0+c191c2Vyc1tpKjE2XSwgMTYpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gbnJfdXNlcnMpIHsKKwkJbWVtY3B5KCZqc2ItPnNfdXNlcnNbbnJfdXNlcnMqMTZdLAorCQkgICAgICAgZnMtPnN1cGVyLT5zX3V1aWQsIDE2KTsKKwkJanNiLT5zX25yX3VzZXJzID0gaHRvbmwobnJfdXNlcnMrMSk7CisJfQorCisJLyogV3JpdGViYWNrIHRoZSBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKwlpZiAoKHJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGpvdXJuYWxfZGV2LT5pbywgc3RhcnQsIC0xMDI0LCBidWYpKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCWZzLT5zdXBlci0+c19qb3VybmFsX2ludW0gPSAwOworCWZzLT5zdXBlci0+c19qb3VybmFsX2RldiA9IHN0LnN0X3JkZXY7CisJbWVtY3B5KGZzLT5zdXBlci0+c19qb3VybmFsX3V1aWQsIGpzYi0+c191dWlkLAorCSAgICAgICBzaXplb2YoZnMtPnN1cGVyLT5zX2pvdXJuYWxfdXVpZCkpOworCWZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCB8PSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhIGpvdXJuYWwgaW5vZGUgdG8gYSBmaWxlc3lzdGVtLCB1c2luZyBlaXRoZXIKKyAqIFBPU0lYIHJvdXRpbmVzIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQsIG9yIHVzaW5nIGRpcmVjdCBJL08KKyAqIGZ1bmN0aW9ucyBpZiBpdCBpcyBub3QuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfYWRkX2pvdXJuYWxfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGJsa190IHNpemUsIGludCBmbGFncykKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlleHQyX2lub190CQlqb3VybmFsX2lubzsKKwlzdHJ1Y3Qgc3RhdAkJc3Q7CisJY2hhcgkJCWpmaWxlWzEwMjRdOworCWludAkJCWZkLCBtb3VudF9mbGFncywgZjsKKworCXJldHZhbCA9IGV4dDJmc19jaGVja19tb3VudF9wb2ludChmcy0+ZGV2aWNlX25hbWUsICZtb3VudF9mbGFncywKKwkJCQkJICAgICAgIGpmaWxlLCBzaXplb2YoamZpbGUpLTEwKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKG1vdW50X2ZsYWdzICYgRVhUMl9NRl9NT1VOVEVEKSB7CisJCXN0cmNhdChqZmlsZSwgIi8uam91cm5hbCIpOworCisJCS8qCisJCSAqIElmIC4uLi8uam91cm5hbCBhbHJlYWR5IGV4aXN0cywgbWFrZSBzdXJlIGFueQorCQkgKiBpbW11dGFibGUgb3IgYXBwZW5kLW9ubHkgZmxhZ3MgYXJlIGNsZWFyZWQuCisJCSAqLworI2lmIGRlZmluZWQoSEFWRV9DSEZMQUdTKSAmJiBkZWZpbmVkKFVGX05PRFVNUCkKKwkJKHZvaWQpIGNoZmxhZ3MgKGpmaWxlLCAwKTsKKyNlbHNlCisjaWYgSEFWRV9FWFQyX0lPQ1RMUworCQlmZCA9IG9wZW4oamZpbGUsIE9fUkRPTkxZKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWYgPSAwOworCQkJaW9jdGwoZmQsIEVYVDJfSU9DX1NFVEZMQUdTLCAmZik7CisJCQljbG9zZShmZCk7CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwkJLyogQ3JlYXRlIHRoZSBqb3VybmFsIGZpbGUgKi8KKwkJaWYgKChmZCA9IG9wZW4oamZpbGUsIE9fQ1JFQVR8T19XUk9OTFksIDA2MDApKSA8IDApCisJCQlyZXR1cm4gZXJybm87CisKKwkJaWYgKChyZXR2YWwgPSB3cml0ZV9qb3VybmFsX2ZpbGUoZnMsIGpmaWxlLCBzaXplLCBmbGFncykpKQorCQkJZ290byBlcnJvdXQ7CisKKwkJLyogR2V0IGlub2RlIG51bWJlciBvZiB0aGUgam91cm5hbCBmaWxlICovCisJCWlmIChmc3RhdChmZCwgJnN0KSA8IDApCisJCQlnb3RvIGVycm91dDsKKworI2lmIGRlZmluZWQoSEFWRV9DSEZMQUdTKSAmJiBkZWZpbmVkKFVGX05PRFVNUCkKKwkJcmV0dmFsID0gZmNoZmxhZ3MgKGZkLCBVRl9OT0RVTVB8VUZfSU1NVVRBQkxFKTsKKyNlbHNlCisjaWYgSEFWRV9FWFQyX0lPQ1RMUworCQlmID0gRVhUMl9OT0RVTVBfRkwgfCBFWFQyX0lNTVVUQUJMRV9GTDsKKwkJcmV0dmFsID0gaW9jdGwoZmQsIEVYVDJfSU9DX1NFVEZMQUdTLCAmZik7CisjZW5kaWYKKyNlbmRpZgorCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvdXQ7CisKKwkJY2xvc2UoZmQpOworCQlqb3VybmFsX2lubyA9IHN0LnN0X2lubzsKKwl9IGVsc2UgeworCQlqb3VybmFsX2lubyA9IEVYVDJfSk9VUk5BTF9JTk87CisJCWlmICgocmV0dmFsID0gd3JpdGVfam91cm5hbF9pbm9kZShmcywgam91cm5hbF9pbm8sCisJCQkJCQkgIHNpemUsIGZsYWdzKSkpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWZzLT5zdXBlci0+c19qb3VybmFsX2ludW0gPSBqb3VybmFsX2lubzsKKwlmcy0+c3VwZXItPnNfam91cm5hbF9kZXYgPSAwOworCW1lbXNldChmcy0+c3VwZXItPnNfam91cm5hbF91dWlkLCAwLAorCSAgICAgICBzaXplb2YoZnMtPnN1cGVyLT5zX2pvdXJuYWxfdXVpZCkpOworCWZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCB8PSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCisJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCXJldHVybiAwOworZXJyb3V0OgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgREVCVUcKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJKmRldmljZV9uYW1lOworCWV4dDJfZmlsc3lzCWZzOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGZpbGVzeXN0ZW1cbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlkZXZpY2VfbmFtZSA9IGFyZ3ZbMV07CisKKwlyZXR2YWwgPSBleHQyZnNfb3BlbiAoZGV2aWNlX25hbWUsIEVYVDJfRkxBR19SVywgMCwgMCwKKwkJCSAgICAgIHVuaXhfaW9fbWFuYWdlciwgJmZzKTsKKwlpZiAocmV0dmFsKSB7CisJCWNvbV9lcnIoYXJndlswXSwgcmV0dmFsLCAid2hpbGUgb3BlbmluZyAlcyIsIGRldmljZV9uYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR2YWwgPSBleHQyZnNfYWRkX2pvdXJuYWxfaW5vZGUoZnMsIDEwMjQpOworCWlmIChyZXR2YWwpIHsKKwkJY29tX2Vycihhcmd2WzBdLCByZXR2YWwsICJ3aGlsZSBhZGRpbmcgam91cm5hbCB0byAlcyIsCisJCQlkZXZpY2VfbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXJldHZhbCA9IGV4dDJmc19mbHVzaChmcyk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGYoIldhcm5pbmcsIGhhZCB0cm91YmxlIHdyaXRpbmcgb3V0IHN1cGVyYmxvY2tzLlxuIik7CisJfQorCWV4dDJmc19jbG9zZShmcyk7CisJZXhpdCgwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL25hbWVpLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODI0NDYxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL25hbWVpLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG5hbWVpLmMgLS0tIGV4dDJmcyBkaXJlY3RvcnkgbG9va3VwIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTQsIDE5OTUgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisvKiAjZGVmaW5lIE5BTUVJX0RFQlVHICovCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3N0YXRpYyBlcnJjb2RlX3Qgb3Blbl9uYW1laShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGJhc2UsCisJCQkgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIHNpemVfdCBwYXRobGVuLCBpbnQgZm9sbG93LAorCQkJICAgIGludCBsaW5rX2NvdW50LCBjaGFyICpidWYsIGV4dDJfaW5vX3QgKnJlc19pbm9kZSk7CisKK3N0YXRpYyBlcnJjb2RlX3QgZm9sbG93X2xpbmsoZXh0Ml9maWxzeXMgZnMsIGV4dDJfaW5vX3Qgcm9vdCwgZXh0Ml9pbm9fdCBkaXIsCisJCQkgICAgIGV4dDJfaW5vX3QgaW5vZGUsIGludCBsaW5rX2NvdW50LAorCQkJICAgICBjaGFyICpidWYsIGV4dDJfaW5vX3QgKnJlc19pbm9kZSkKK3sKKwljaGFyICpwYXRobmFtZTsKKwljaGFyICpidWZmZXIgPSBOVUxMOworCWVycmNvZGVfdCByZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUgZWk7CisKKyNpZmRlZiBOQU1FSV9ERUJVRworCXByaW50ZigiZm9sbG93X2xpbms6IHJvb3Q9JWx1LCBkaXI9JWx1LCBpbm9kZT0lbHUsIGxjPSVkXG4iLAorCSAgICAgICByb290LCBkaXIsIGlub2RlLCBsaW5rX2NvdW50KTsKKworI2VuZGlmCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUgKGZzLCBpbm9kZSwgJmVpKTsKKwlpZiAocmV0dmFsKSByZXR1cm4gcmV0dmFsOworCWlmICghTElOVVhfU19JU0xOSyAoZWkuaV9tb2RlKSkgeworCQkqcmVzX2lub2RlID0gaW5vZGU7CisJCXJldHVybiAwOworCX0KKwlpZiAobGlua19jb3VudCsrID4gNSkgeworCQlyZXR1cm4gRVhUMl9FVF9TWU1MSU5LX0xPT1A7CisJfQorCWlmIChleHQyZnNfaW5vZGVfZGF0YV9ibG9ja3MoZnMsICZlaSkpIHsKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJ1ZmZlcik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgZWkuaV9ibG9ja1swXSwgMSwgYnVmZmVyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZXh0MmZzX2ZyZWVfbWVtKCZidWZmZXIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlwYXRobmFtZSA9IGJ1ZmZlcjsKKwl9IGVsc2UKKwkJcGF0aG5hbWUgPSAoY2hhciAqKSYoZWkuaV9ibG9ja1swXSk7CisJcmV0dmFsID0gb3Blbl9uYW1laShmcywgcm9vdCwgZGlyLCBwYXRobmFtZSwgZWkuaV9zaXplLCAxLAorCQkJICAgIGxpbmtfY291bnQsIGJ1ZiwgcmVzX2lub2RlKTsKKwlleHQyZnNfZnJlZV9tZW0oJmJ1ZmZlcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpbnRlcnByZXRzIGEgcGF0aG5hbWUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQKKyAqIGRpcmVjdG9yeSBhbmQgdGhlIHJvb3QgZGlyZWN0b3J5LCBhbmQgcmV0dXJucyB0aGUgaW5vZGUgb2YgdGhlCisgKiBjb250YWluaW5nIGRpcmVjdG9yeSwgYW5kIGEgcG9pbnRlciB0byB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUKKyAqIChwb2ludGluZyBpbnRvIHRoZSBwYXRobmFtZSkgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGZpbGVuYW1lLgorICovCitzdGF0aWMgZXJyY29kZV90IGRpcl9uYW1laShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGRpciwKKwkJCSAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgcGF0aGxlbiwKKwkJCSAgIGludCBsaW5rX2NvdW50LCBjaGFyICpidWYsCisJCQkgICBjb25zdCBjaGFyICoqbmFtZSwgaW50ICpuYW1lbGVuLAorCQkJICAgZXh0Ml9pbm9fdCAqcmVzX2lub2RlKQoreworCWNoYXIgYzsKKwljb25zdCBjaGFyICp0aGlzbmFtZTsKKwlpbnQgbGVuOworCWV4dDJfaW5vX3QgaW5vZGU7CisJZXJyY29kZV90IHJldHZhbDsKKworCWlmICgoYyA9ICpwYXRobmFtZSkgPT0gJy8nKSB7CisJCWRpciA9IHJvb3Q7CisJCXBhdGhuYW1lKys7CisJCXBhdGhsZW4tLTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJdGhpc25hbWUgPSBwYXRobmFtZTsKKwkJZm9yIChsZW49MDsgLS1wYXRobGVuID49IDA7bGVuKyspIHsKKwkJCWMgPSAqKHBhdGhuYW1lKyspOworCQkJaWYgKGMgPT0gJy8nKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChwYXRobGVuIDwgMCkKKwkJCWJyZWFrOworCQlyZXR2YWwgPSBleHQyZnNfbG9va3VwIChmcywgZGlyLCB0aGlzbmFtZSwgbGVuLCBidWYsICZpbm9kZSk7CisJCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IGZvbGxvd19saW5rIChmcywgcm9vdCwgZGlyLCBpbm9kZSwKKwkJCQkgICAgICBsaW5rX2NvdW50LCBidWYsICZkaXIpOworCQlpZiAocmV0dmFsKSByZXR1cm4gcmV0dmFsOworCX0KKwkqbmFtZSA9IHRoaXNuYW1lOworCSpuYW1lbGVuID0gbGVuOworCSpyZXNfaW5vZGUgPSBkaXI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3Qgb3Blbl9uYW1laShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGJhc2UsCisJCQkgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIHNpemVfdCBwYXRobGVuLCBpbnQgZm9sbG93LAorCQkJICAgIGludCBsaW5rX2NvdW50LCBjaGFyICpidWYsIGV4dDJfaW5vX3QgKnJlc19pbm9kZSkKK3sKKwljb25zdCBjaGFyICpiYXNlbmFtZTsKKwlpbnQgbmFtZWxlbjsKKwlleHQyX2lub190IGRpciwgaW5vZGU7CisJZXJyY29kZV90IHJldHZhbDsKKworI2lmZGVmIE5BTUVJX0RFQlVHCisJcHJpbnRmKCJvcGVuX25hbWVpOiByb290PSVsdSwgZGlyPSVsdSwgcGF0aD0lKnMsIGxjPSVkXG4iLAorCSAgICAgICByb290LCBiYXNlLCBwYXRobGVuLCBwYXRobmFtZSwgbGlua19jb3VudCk7CisjZW5kaWYKKwlyZXR2YWwgPSBkaXJfbmFtZWkoZnMsIHJvb3QsIGJhc2UsIHBhdGhuYW1lLCBwYXRobGVuLAorCQkJICAgbGlua19jb3VudCwgYnVmLCAmYmFzZW5hbWUsICZuYW1lbGVuLCAmZGlyKTsKKwlpZiAocmV0dmFsKSByZXR1cm4gcmV0dmFsOworCWlmICghbmFtZWxlbikgeyAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZTogJy91c3IvJyBldGMgKi8KKwkJKnJlc19pbm9kZT1kaXI7CisJCXJldHVybiAwOworCX0KKwlyZXR2YWwgPSBleHQyZnNfbG9va3VwIChmcywgZGlyLCBiYXNlbmFtZSwgbmFtZWxlbiwgYnVmLCAmaW5vZGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGZvbGxvdykgeworCQlyZXR2YWwgPSBmb2xsb3dfbGluayhmcywgcm9vdCwgZGlyLCBpbm9kZSwgbGlua19jb3VudCwKKwkJCQkgICAgIGJ1ZiwgJmlub2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorI2lmZGVmIE5BTUVJX0RFQlVHCisJcHJpbnRmKCJvcGVuX25hbWVpOiAobGlua19jb3VudD0lZCkgcmV0dXJucyAlbHVcbiIsCisJICAgICAgIGxpbmtfY291bnQsIGlub2RlKTsKKyNlbmRpZgorCSpyZXNfaW5vZGUgPSBpbm9kZTsKKwlyZXR1cm4gMDsKK30KKworZXJyY29kZV90IGV4dDJmc19uYW1laShleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGN3ZCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgKmlub2RlKQoreworCWNoYXIgKmJ1ZjsKKwllcnJjb2RlX3QgcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBvcGVuX25hbWVpKGZzLCByb290LCBjd2QsIG5hbWUsIHN0cmxlbihuYW1lKSwgMCwgMCwKKwkJCSAgICBidWYsIGlub2RlKTsKKworCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX25hbWVpX2ZvbGxvdyhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCByb290LCBleHQyX2lub190IGN3ZCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV4dDJfaW5vX3QgKmlub2RlKQoreworCWNoYXIgKmJ1ZjsKKwllcnJjb2RlX3QgcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBvcGVuX25hbWVpKGZzLCByb290LCBjd2QsIG5hbWUsIHN0cmxlbihuYW1lKSwgMSwgMCwKKwkJCSAgICBidWYsIGlub2RlKTsKKworCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitlcnJjb2RlX3QgZXh0MmZzX2ZvbGxvd19saW5rKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IHJvb3QsIGV4dDJfaW5vX3QgY3dkLAorCQkJZXh0Ml9pbm9fdCBpbm9kZSwgZXh0Ml9pbm9fdCAqcmVzX2lub2RlKQoreworCWNoYXIgKmJ1ZjsKKwllcnJjb2RlX3QgcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBmb2xsb3dfbGluayhmcywgcm9vdCwgY3dkLCBpbm9kZSwgMCwgYnVmLCByZXNfaW5vZGUpOworCisJZXh0MmZzX2ZyZWVfbWVtKCZidWYpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbmV3ZGlyLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvbmV3ZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxNTY2MgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9uZXdkaXIuYwpAQCAtMCwwICsxLDcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBuZXdkaXIuYyAtLS0gY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBibG9jaworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKyNpZm5kZWYgRVhUMl9GVF9ESVIKKyNkZWZpbmUgRVhUMl9GVF9ESVIJCTIKKyNlbmRpZgorCisvKgorICogQ3JlYXRlIG5ldyBkaXJlY3RvcnkgYmxvY2sKKyAqLworZXJyY29kZV90IGV4dDJmc19uZXdfZGlyX2Jsb2NrKGV4dDJfZmlsc3lzIGZzLCBleHQyX2lub190IGRpcl9pbm8sCisJCQkgICAgICAgZXh0Ml9pbm9fdCBwYXJlbnRfaW5vLCBjaGFyICoqYmxvY2spCit7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5CSpkaXIgPSBOVUxMOworCWVycmNvZGVfdAkJcmV0dmFsOworCWNoYXIJCQkqYnVmOworCWludAkJCXJlY19sZW47CisJaW50CQkJZmlsZXR5cGUgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKGZzLT5ibG9ja3NpemUsICZidWYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGJ1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJZGlyID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqKSBidWY7CisJZGlyLT5yZWNfbGVuID0gZnMtPmJsb2Nrc2l6ZTsKKworCWlmIChkaXJfaW5vKSB7CisJCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCSAgICBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpCisJCQlmaWxldHlwZSA9IEVYVDJfRlRfRElSIDw8IDg7CisJCS8qCisJCSAqIFNldCB1cCBlbnRyeSBmb3IgJy4nCisJCSAqLworCQlkaXItPmlub2RlID0gZGlyX2lubzsKKwkJZGlyLT5uYW1lX2xlbiA9IDEgfCBmaWxldHlwZTsKKwkJZGlyLT5uYW1lWzBdID0gJy4nOworCQlyZWNfbGVuID0gZGlyLT5yZWNfbGVuIC0gRVhUMl9ESVJfUkVDX0xFTigxKTsKKwkJZGlyLT5yZWNfbGVuID0gRVhUMl9ESVJfUkVDX0xFTigxKTsKKworCQkvKgorCQkgKiBTZXQgdXAgZW50cnkgZm9yICcuLicKKwkJICovCisJCWRpciA9IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKikgKGJ1ZiArIGRpci0+cmVjX2xlbik7CisJCWRpci0+cmVjX2xlbiA9IHJlY19sZW47CisJCWRpci0+aW5vZGUgPSBwYXJlbnRfaW5vOworCQlkaXItPm5hbWVfbGVuID0gMiB8IGZpbGV0eXBlOworCQlkaXItPm5hbWVbMF0gPSAnLic7CisJCWRpci0+bmFtZVsxXSA9ICcuJzsKKwl9CisJKmJsb2NrID0gYnVmOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL29wZW5mcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL29wZW5mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjcxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvb3BlbmZzLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG9wZW5mcy5jIC0tLSBvcGVuIGFuIGV4dDIgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorCisKKyNpbmNsdWRlICJleHQyZnMuaCIKKyNpbmNsdWRlICJlMmltYWdlLmgiCisKK2Jsa190IGV4dDJmc19kZXNjcmlwdG9yX2Jsb2NrX2xvYyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgZ3JvdXBfYmxvY2ssIGRncnBfdCBpKQoreworCWludAliZzsKKwlpbnQJaGFzX3N1cGVyID0gMDsKKwlpbnQJcmV0X2JsazsKKworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIChpIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X21ldGFfYmcpKQorCQlyZXR1cm4gKGdyb3VwX2Jsb2NrICsgaSArIDEpOworCisJYmcgPSAoZnMtPmJsb2Nrc2l6ZSAvIHNpemVvZiAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYykpICogaTsKKwlpZiAoZXh0MmZzX2JnX2hhc19zdXBlcihmcywgYmcpKQorCQloYXNfc3VwZXIgPSAxOworCXJldF9ibGsgPSAoZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2sgKyBoYXNfc3VwZXIgKworCQkgICAoYmcgKiBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCkpOworCS8qCisJICogSWYgZ3JvdXBfYmxvY2sgaXMgbm90IHRoZSBub3JtYWwgdmFsdWUsIHdlJ3JlIHRyeWluZyB0byB1c2UKKwkgKiB0aGUgYmFja3VwIGdyb3VwIGRlc2NyaXB0b3JzIGFuZCBzdXBlcmJsb2NrIC0tLSBzbyB1c2UgdGhlCisJICogYWx0ZXJuYXRlIGxvY2F0aW9uIG9mIHRoZSBzZWNvbmQgYmxvY2sgZ3JvdXAgaW4gdGhlCisJICogbWV0YWJsb2NrIGdyb3VwLiAgSWRlYWxseSB3ZSBzaG91bGQgYmUgdGVzdGluZyBlYWNoIGJnCisJICogZGVzY3JpcHRvciBibG9jayBpbmRpdmlkdWFsbHkgZm9yIGNvcnJlY3RuZXNzLCBidXQgd2UgZG9uJ3QKKwkgKiBoYXZlIHRoZSBpbmZyYXN0cnVjdHVyZSBpbiBwbGFjZSB0byBkbyB0aGF0LgorCSAqLworCWlmIChncm91cF9ibG9jayAhPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayAmJgorCSAgICAoKHJldF9ibGsgKyBmcy0+c3VwZXItPnNfYmxvY2tzX3Blcl9ncm91cCkgPAorCSAgICAgZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpCisJCXJldF9ibGsgKz0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJcmV0dXJuIHJldF9ibGs7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGludCBzdXBlcmJsb2NrLAorCQkgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwgaW9fbWFuYWdlciBtYW5hZ2VyLAorCQkgICAgICBleHQyX2ZpbHN5cyAqcmV0X2ZzKQoreworCXJldHVybiBleHQyZnNfb3BlbjIobmFtZSwgMCwgZmxhZ3MsIHN1cGVyYmxvY2ssIGJsb2NrX3NpemUsCisJCQkgICAgbWFuYWdlciwgcmV0X2ZzKTsKK30KKworLyoKKyAqICBOb3RlOiBpZiBzdXBlcmJsb2NrIGlzIG5vbi16ZXJvLCBibG9jay1zaXplIG11c3QgYWxzbyBiZSBub24temVyby4KKyAqCVN1cGVyYmxvY2sgYW5kIGJsb2NrX3NpemUgY2FuIGJlIHplcm8gdG8gdXNlIHRoZSBkZWZhdWx0IHNpemUuCisgKgorICogVmFsaWQgZmxhZ3MgZm9yIGV4dDJmc19vcGVuKCkKKyAqCisgKglFWFQyX0ZMQUdfUlcJLSBPcGVuIHRoZSBmaWxlc3lzdGVtIGZvciByZWFkL3dyaXRlLgorICoJRVhUMl9GTEFHX0ZPUkNFIC0gT3BlbiB0aGUgZmlsZXN5c3RlbSBldmVuIGlmIHNvbWUgb2YgdGhlCisgKgkJCQlmZWF0dXJlcyBhcmVuJ3Qgc3VwcG9ydGVkLgorICoJRVhUMl9GTEFHX0pPVVJOQUxfREVWX09LIC0gT3BlbiBhbiBleHQzIGpvdXJuYWwgZGV2aWNlCisgKi8KK2VycmNvZGVfdCBleHQyZnNfb3BlbjIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaW9fb3B0aW9ucywKKwkJICAgICAgIGludCBmbGFncywgaW50IHN1cGVyYmxvY2ssCisJCSAgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwgaW9fbWFuYWdlciBtYW5hZ2VyLAorCQkgICAgICAgZXh0Ml9maWxzeXMgKnJldF9mcykKK3sKKwlleHQyX2ZpbHN5cwlmczsKKwllcnJjb2RlX3QJcmV0dmFsOworCXVuc2lnbmVkIGxvbmcJaTsKKwlpbnQJCWdyb3Vwc19wZXJfYmxvY2ssIGJsb2Nrc19wZXJfZ3JvdXA7CisJYmxrX3QJCWdyb3VwX2Jsb2NrLCBibGs7CisJY2hhcgkJKmRlc3QsICpjcDsKKyNpZiBCQl9CSUdfRU5ESUFOCisJaW50IGo7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2RwOworI2VuZGlmCisKKwlFWFQyX0NIRUNLX01BR0lDKG1hbmFnZXIsIEVYVDJfRVRfTUFHSUNfSU9fTUFOQUdFUik7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IHN0cnVjdF9leHQyX2ZpbHN5cyksICZmcyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW1lbXNldChmcywgMCwgc2l6ZW9mKHN0cnVjdCBzdHJ1Y3RfZXh0Ml9maWxzeXMpKTsKKwlmcy0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVM7CisJZnMtPmZsYWdzID0gZmxhZ3M7CisJZnMtPnVtYXNrID0gMDIyOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHN0cmxlbihuYW1lKSsxLCAmZnMtPmRldmljZV9uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJc3RyY3B5KGZzLT5kZXZpY2VfbmFtZSwgbmFtZSk7CisJY3AgPSBzdHJjaHIoZnMtPmRldmljZV9uYW1lLCAnPycpOworCWlmICghaW9fb3B0aW9ucyAmJiBjcCkgeworCQkqY3ArKyA9IDA7CisJCWlvX29wdGlvbnMgPSBjcDsKKwl9CisKKwlyZXR2YWwgPSBtYW5hZ2VyLT5vcGVuKGZzLT5kZXZpY2VfbmFtZSwKKwkJCSAgICAgICAoZmxhZ3MgJiBFWFQyX0ZMQUdfUlcpID8gSU9fRkxBR19SVyA6IDAsCisJCQkgICAgICAgJmZzLT5pbyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCWlmIChpb19vcHRpb25zICYmCisJICAgIChyZXR2YWwgPSBpb19jaGFubmVsX3NldF9vcHRpb25zKGZzLT5pbywgaW9fb3B0aW9ucykpKQorCQlnb3RvIGNsZWFudXA7CisJZnMtPmltYWdlX2lvID0gZnMtPmlvOworCWZzLT5pby0+YXBwX2RhdGEgPSBmczsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShTVVBFUkJMT0NLX1NJWkUsICZmcy0+c3VwZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoZmxhZ3MgJiBFWFQyX0ZMQUdfSU1BR0VfRklMRSkgeworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzaXplb2Yoc3RydWN0IGV4dDJfaW1hZ2VfaGRyKSwKKwkJCQkJJmZzLT5pbWFnZV9oZWFkZXIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgMCwKKwkJCQkJICAgICAtKGludClzaXplb2Yoc3RydWN0IGV4dDJfaW1hZ2VfaGRyKSwKKwkJCQkJICAgICBmcy0+aW1hZ2VfaGVhZGVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2xlYW51cDsKKwkJaWYgKGZzLT5pbWFnZV9oZWFkZXItPm1hZ2ljX251bWJlciAhPSBFWFQyX0VUX01BR0lDX0UySU1BR0UpCisJCQlyZXR1cm4gRVhUMl9FVF9NQUdJQ19FMklNQUdFOworCQlzdXBlcmJsb2NrID0gMTsKKwkJYmxvY2tfc2l6ZSA9IGZzLT5pbWFnZV9oZWFkZXItPmZzX2Jsb2Nrc2l6ZTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSB1c2VyIHNwZWNpZmllcyBhIHNwZWNpZmljIGJsb2NrICMgZm9yIHRoZQorCSAqIHN1cGVyYmxvY2ssIHRoZW4gaGUvc2hlIG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBibG9jayBzaXplIQorCSAqIE90aGVyd2lzZSwgcmVhZCB0aGUgbWFzdGVyIHN1cGVyYmxvY2sgbG9jYXRlZCBhdCBvZmZzZXQKKwkgKiBTVVBFUkJMT0NLX09GRlNFVCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFydGl0aW9uLgorCSAqCisJICogTm90ZTogd2Ugb25seSBzYXZlIGEgYmFja3VwIGNvcHkgb2YgdGhlIHN1cGVyYmxvY2sgaWYgd2UKKwkgKiBhcmUgcmVhZGluZyB0aGUgc3VwZXJibG9jayBmcm9tIHRoZSBwcmltYXJ5IHN1cGVyYmxvY2sgbG9jYXRpb24uCisJICovCisJaWYgKHN1cGVyYmxvY2spIHsKKwkJaWYgKCFibG9ja19zaXplKSB7CisJCQlyZXR2YWwgPSBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaW9fY2hhbm5lbF9zZXRfYmxrc2l6ZShmcy0+aW8sIGJsb2NrX3NpemUpOworCQlncm91cF9ibG9jayA9IHN1cGVyYmxvY2s7CisJCWZzLT5vcmlnX3N1cGVyID0gMDsKKwl9IGVsc2UgeworCQlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgU1VQRVJCTE9DS19PRkZTRVQpOworCQlzdXBlcmJsb2NrID0gMTsKKwkJZ3JvdXBfYmxvY2sgPSAwOworCQlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShTVVBFUkJMT0NLX1NJWkUsICZmcy0+b3JpZ19zdXBlcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBzdXBlcmJsb2NrLCAtU1VQRVJCTE9DS19TSVpFLAorCQkJCSAgICAgZnMtPnN1cGVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKGZzLT5vcmlnX3N1cGVyKQorCQltZW1jcHkoZnMtPm9yaWdfc3VwZXIsIGZzLT5zdXBlciwgU1VQRVJCTE9DS19TSVpFKTsKKworI2lmIEJCX0JJR19FTkRJQU4KKwlpZiAoKGZzLT5zdXBlci0+c19tYWdpYyA9PSBleHQyZnNfc3dhYjE2KEVYVDJfU1VQRVJfTUFHSUMpKSB8fAorCSAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpKSB7CisJCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfU1dBUF9CWVRFUzsKKworCQlleHQyZnNfc3dhcF9zdXBlcihmcy0+c3VwZXIpOworCX0KKyNlbmRpZgorCisJaWYgKGZzLT5zdXBlci0+c19tYWdpYyAhPSBFWFQyX1NVUEVSX01BR0lDKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfQkFEX01BR0lDOworCQlnb3RvIGNsZWFudXA7CisJfQorCWlmIChmcy0+c3VwZXItPnNfcmV2X2xldmVsID4gRVhUMl9MSUJfQ1VSUkVOVF9SRVYpIHsKKwkJcmV0dmFsID0gRVhUMl9FVF9SRVZfVE9PX0hJR0g7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBmZWF0dXJlIHNldCBpbmNvbXBhdGliaWxpdHkKKwkgKi8KKwlpZiAoIShmbGFncyAmIEVYVDJfRkxBR19GT1JDRSkpIHsKKwkJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkJICAgIH5FWFQyX0xJQl9GRUFUVVJFX0lOQ09NUEFUX1NVUFApIHsKKwkJCXJldHZhbCA9IEVYVDJfRVRfVU5TVVBQX0ZFQVRVUkU7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKChmbGFncyAmIEVYVDJfRkxBR19SVykgJiYKKwkJICAgIChmcy0+c3VwZXItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCQkgICAgIH5FWFQyX0xJQl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSkgeworCQkJcmV0dmFsID0gRVhUMl9FVF9ST19VTlNVUFBfRkVBVFVSRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoIShmbGFncyAmIEVYVDJfRkxBR19KT1VSTkFMX0RFVl9PSykgJiYKKwkJICAgIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCSAgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkgeworCQkJcmV0dmFsID0gRVhUMl9FVF9VTlNVUFBfRkVBVFVSRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKworCWZzLT5ibG9ja3NpemUgPSBFWFQyX0JMT0NLX1NJWkUoZnMtPnN1cGVyKTsKKwlpZiAoZnMtPmJsb2Nrc2l6ZSA9PSAwKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfQ09SUlVQVF9TVVBFUkJMT0NLOworCQlnb3RvIGNsZWFudXA7CisJfQorCWZzLT5mcmFnc2l6ZSA9IEVYVDJfRlJBR19TSVpFKGZzLT5zdXBlcik7CisJZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXAgPSAoKGZzLT5zdXBlci0+c19pbm9kZXNfcGVyX2dyb3VwICoKKwkJCQkgICAgICAgRVhUMl9JTk9ERV9TSVpFKGZzLT5zdXBlcikgKworCQkJCSAgICAgICBFWFQyX0JMT0NLX1NJWkUoZnMtPnN1cGVyKSAtIDEpIC8KKwkJCQkgICAgICBFWFQyX0JMT0NLX1NJWkUoZnMtPnN1cGVyKSk7CisJaWYgKGJsb2NrX3NpemUpIHsKKwkJaWYgKGJsb2NrX3NpemUgIT0gZnMtPmJsb2Nrc2l6ZSkgeworCQkJcmV0dmFsID0gRVhUMl9FVF9VTkVYUEVDVEVEX0JMT0NLX1NJWkU7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9CisJLyoKKwkgKiBTZXQgdGhlIGJsb2Nrc2l6ZSB0byB0aGUgZmlsZXN5c3RlbSdzIGJsb2Nrc2l6ZS4KKwkgKi8KKwlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgZnMtPmJsb2Nrc2l6ZSk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UsIGRvbid0IHRyeSB0byByZWFkCisJICogdGhlIGdyb3VwIGRlc2NyaXB0b3JzLCBiZWNhdXNlIHRoZXkncmUgbm90IHRoZXJlLgorCSAqLworCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikgeworCQlmcy0+Z3JvdXBfZGVzY19jb3VudCA9IDA7CisJCSpyZXRfZnMgPSBmczsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBSZWFkIGdyb3VwIGRlc2NyaXB0b3JzCisJICovCisJYmxvY2tzX3Blcl9ncm91cCA9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChmcy0+c3VwZXIpOworCWlmIChibG9ja3NfcGVyX2dyb3VwID09IDAgfHwKKwkgICAgYmxvY2tzX3Blcl9ncm91cCA+IEVYVDJfTUFYX0JMT0NLU19QRVJfR1JPVVAoZnMtPnN1cGVyKSB8fAorCSAgICBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cCA+IEVYVDJfTUFYX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSkgeworCQlyZXR2YWwgPSBFWFQyX0VUX0NPUlJVUFRfU1VQRVJCTE9DSzsKKwkJZ290byBjbGVhbnVwOworCX0KKwlmcy0+Z3JvdXBfZGVzY19jb3VudCA9IChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50IC0KKwkJCQlmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArCisJCQkJYmxvY2tzX3Blcl9ncm91cCAtIDEpIC8gYmxvY2tzX3Blcl9ncm91cDsKKwlmcy0+ZGVzY19ibG9ja3MgPSAoZnMtPmdyb3VwX2Rlc2NfY291bnQgKworCQkJICAgRVhUMl9ERVNDX1BFUl9CTE9DSyhmcy0+c3VwZXIpIC0gMSkKKwkJLyBFWFQyX0RFU0NfUEVSX0JMT0NLKGZzLT5zdXBlcik7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmRlc2NfYmxvY2tzICogZnMtPmJsb2Nrc2l6ZSwKKwkJCQkmZnMtPmdyb3VwX2Rlc2MpOworCWlmIChyZXR2YWwpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoIWdyb3VwX2Jsb2NrKQorCQlncm91cF9ibG9jayA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrOworCWRlc3QgPSAoY2hhciAqKSBmcy0+Z3JvdXBfZGVzYzsKKwlncm91cHNfcGVyX2Jsb2NrID0gZnMtPmJsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKTsKKwlmb3IgKGkgPSAwOyBpIDwgZnMtPmRlc2NfYmxvY2tzOyBpKyspIHsKKwkJYmxrID0gZXh0MmZzX2Rlc2NyaXB0b3JfYmxvY2tfbG9jKGZzLCBncm91cF9ibG9jaywgaSk7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmlvLCBibGssIDEsIGRlc3QpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworI2lmIEJCX0JJR19FTkRJQU4KKwkJaWYgKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB7CisJCQlnZHAgPSAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqKSBkZXN0OworCQkJZm9yIChqPTA7IGogPCBncm91cHNfcGVyX2Jsb2NrOyBqKyspCisJCQkJZXh0MmZzX3N3YXBfZ3JvdXBfZGVzYyhnZHArKyk7CisJCX0KKyNlbmRpZgorCQlkZXN0ICs9IGZzLT5ibG9ja3NpemU7CisJfQorCisJKnJldF9mcyA9IGZzOworCXJldHVybiAwOworY2xlYW51cDoKKwlleHQyZnNfZnJlZShmcyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFNldC9nZXQgdGhlIGZpbGVzeXN0ZW0gZGF0YSBJL08gY2hhbm5lbC4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgdmFsaWQgaWYgRVhUMl9GTEFHX0lNQUdFX0ZJTEUgaXMgdHJ1ZS4KKyAqLworZXJyY29kZV90IGV4dDJmc19nZXRfZGF0YV9pbyhleHQyX2ZpbHN5cyBmcywgaW9fY2hhbm5lbCAqb2xkX2lvKQoreworCWlmICgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX0lNQUdFX0ZJTEUpID09IDApCisJCXJldHVybiBFWFQyX0VUX05PVF9JTUFHRV9GSUxFOworCWlmIChvbGRfaW8pIHsKKwkJKm9sZF9pbyA9IChmcy0+aW1hZ2VfaW8gPT0gZnMtPmlvKSA/IDAgOiBmcy0+aW87CisJfQorCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3NldF9kYXRhX2lvKGV4dDJfZmlsc3lzIGZzLCBpb19jaGFubmVsIG5ld19pbykKK3sKKwlpZiAoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19JTUFHRV9GSUxFKSA9PSAwKQorCQlyZXR1cm4gRVhUMl9FVF9OT1RfSU1BR0VfRklMRTsKKwlmcy0+aW8gPSBuZXdfaW8gPyBuZXdfaW8gOiBmcy0+aW1hZ2VfaW87CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmV3cml0ZV90b19pbyhleHQyX2ZpbHN5cyBmcywgaW9fY2hhbm5lbCBuZXdfaW8pCit7CisJaWYgKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfSU1BR0VfRklMRSkgPT0gMCkKKwkJcmV0dXJuIEVYVDJfRVRfTk9UX0lNQUdFX0ZJTEU7CisJZnMtPmlvID0gZnMtPmltYWdlX2lvID0gbmV3X2lvOworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfRElSVFkgfCBFWFQyX0ZMQUdfUlcgfAorCQlFWFQyX0ZMQUdfQkJfRElSVFkgfCBFWFQyX0ZMQUdfSUJfRElSVFk7CisJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfSU1BR0VfRklMRTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yZWFkX2JiLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVhZF9iYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzdiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVhZF9iYi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJlYWRfYmIgLS0tIHJlYWQgdGhlIGJhZCBibG9ja3MgaW5vZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworc3RydWN0IHJlYWRfYmJfcmVjb3JkIHsKKwlleHQyX2JhZGJsb2Nrc19saXN0CWJiX2xpc3Q7CisJZXJyY29kZV90CWVycjsKK307CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGV4dDJmc19yZWFkX2JiX2lub2RlKCkKKyAqLworI2lmZGVmIF9fVFVSQk9DX18KKyMgcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK3N0YXRpYyBpbnQgbWFya19iYWRfYmxvY2soZXh0Ml9maWxzeXMgZnMsIGJsa190ICpibG9ja19uciwKKwkJCSAgZTJfYmxrY250X3QgYmxvY2tjbnQgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICBibGtfdCByZWZfYmxvY2sgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICBpbnQgcmVmX29mZnNldCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCQkgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgcmVhZF9iYl9yZWNvcmQgKnJiID0gKHN0cnVjdCByZWFkX2JiX3JlY29yZCAqKSBwcml2X2RhdGE7CisKKwlpZiAoYmxvY2tjbnQgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmICgoKmJsb2NrX25yIDwgZnMtPnN1cGVyLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgICgqYmxvY2tfbnIgPj0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCkpCisJCXJldHVybiAwOwkvKiBJZ25vcmUgaWxsZWdhbCBibG9ja3MgKi8KKworCXJiLT5lcnIgPSBleHQyZnNfYmFkYmxvY2tzX2xpc3RfYWRkKHJiLT5iYl9saXN0LCAqYmxvY2tfbnIpOworCWlmIChyYi0+ZXJyKQorCQlyZXR1cm4gQkxPQ0tfQUJPUlQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkcyB0aGUgY3VycmVudCBiYWQgYmxvY2tzIGZyb20gdGhlIGJhZCBibG9ja3MgaW5vZGUuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfcmVhZF9iYl9pbm9kZShleHQyX2ZpbHN5cyBmcywgZXh0Ml9iYWRibG9ja3NfbGlzdCAqYmJfbGlzdCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXN0cnVjdCByZWFkX2JiX3JlY29yZCByYjsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSBpbm9kZTsKKwlibGtfdAludW1ibG9ja3M7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCEqYmJfbGlzdCkgeworCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbm9kZShmcywgRVhUMl9CQURfSU5PLCAmaW5vZGUpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKGlub2RlLmlfYmxvY2tzIDwgNTAwKQorCQkJbnVtYmxvY2tzID0gKGlub2RlLmlfYmxvY2tzIC8KKwkJCQkgICAgIChmcy0+YmxvY2tzaXplIC8gNTEyKSkgKyAyMDsKKwkJZWxzZQorCQkJbnVtYmxvY2tzID0gNTAwOworCQlyZXR2YWwgPSBleHQyZnNfYmFkYmxvY2tzX2xpc3RfY3JlYXRlKGJiX2xpc3QsIG51bWJsb2Nrcyk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJiLmJiX2xpc3QgPSAqYmJfbGlzdDsKKwlyYi5lcnIgPSAwOworCXJldHZhbCA9IGV4dDJmc19ibG9ja19pdGVyYXRlMihmcywgRVhUMl9CQURfSU5PLCAwLCAwLAorCQkJCSAgICAgIG1hcmtfYmFkX2Jsb2NrLCAmcmIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gcmIuZXJyOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3JlYWRfYmJfZmlsZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3JlYWRfYmJfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMWZjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVhZF9iYl9maWxlLmMKQEAgLTAsMCArMSw5NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmVhZF9iYl9maWxlLmMgLS0tIHJlYWQgYSBsaXN0IG9mIGJhZCBibG9ja3MgZnJvbSBhIEZJTEUgKgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMjAwMCBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogUmVhZHMgYSBsaXN0IG9mIGJhZCBibG9ja3MgZnJvbSAgYSBGSUxFICoKKyAqLworZXJyY29kZV90IGV4dDJmc19yZWFkX2JiX0ZJTEUyKGV4dDJfZmlsc3lzIGZzLCBGSUxFICpmLAorCQkJICAgICAgIGV4dDJfYmFkYmxvY2tzX2xpc3QgKmJiX2xpc3QsCisJCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhLAorCQkJICAgICAgIHZvaWQgKCppbnZhbGlkKShleHQyX2ZpbHN5cyBmcywKKwkJCQkJICAgICAgIGJsa190IGJsaywKKwkJCQkJICAgICAgIGNoYXIgKmJhZHN0ciwKKwkJCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlibGtfdAkJYmxvY2tubzsKKwlpbnQJCWNvdW50OworCWNoYXIJCWJ1ZlsxMjhdOworCisJaWYgKGZzKQorCQlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCEqYmJfbGlzdCkgeworCQlyZXR2YWwgPSBleHQyZnNfYmFkYmxvY2tzX2xpc3RfY3JlYXRlKGJiX2xpc3QsIDEwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJd2hpbGUgKCFmZW9mIChmKSkgeworCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgPT0gTlVMTCkKKwkJCWJyZWFrOworCQljb3VudCA9IHNzY2FuZihidWYsICIldSIsICZibG9ja25vKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQljb250aW51ZTsKKwkJaWYgKGZzICYmCisJCSAgICAoKGJsb2Nrbm8gPCBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkJICAgIChibG9ja25vID49IGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpKSkgeworCQkJaWYgKGludmFsaWQpCisJCQkJKGludmFsaWQpKGZzLCBibG9ja25vLCBidWYsIHByaXZfZGF0YSk7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXR2YWwgPSBleHQyZnNfYmFkYmxvY2tzX2xpc3RfYWRkKCpiYl9saXN0LCBibG9ja25vKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYWxsX2NvbXBhdF9pbnZhbGlkKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGssCisJCQkJY2hhciAqYmFkc3RyIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCQl2b2lkICpwcml2X2RhdGEpCit7CisJdm9pZCAoKmludmFsaWQpKGV4dDJfZmlsc3lzLCBibGtfdCk7CisKKwlpbnZhbGlkID0gKHZvaWQgKCopKGV4dDJfZmlsc3lzLCBibGtfdCkpIHByaXZfZGF0YTsKKwlpZiAoaW52YWxpZCkKKwkJaW52YWxpZChmcywgYmxrKTsKK30KKworCisvKgorICogUmVhZHMgYSBsaXN0IG9mIGJhZCBibG9ja3MgZnJvbSAgYSBGSUxFICoKKyAqLworZXJyY29kZV90IGV4dDJmc19yZWFkX2JiX0ZJTEUoZXh0Ml9maWxzeXMgZnMsIEZJTEUgKmYsCisJCQkgICAgICBleHQyX2JhZGJsb2Nrc19saXN0ICpiYl9saXN0LAorCQkJICAgICAgdm9pZCAoKmludmFsaWQpKGV4dDJfZmlsc3lzIGZzLCBibGtfdCBibGspKQoreworCXJldHVybiBleHQyZnNfcmVhZF9iYl9GSUxFMihmcywgZiwgYmJfbGlzdCwgKHZvaWQgKikgaW52YWxpZCwKKwkJCQkgICAgY2FsbF9jb21wYXRfaW52YWxpZCk7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcmVzX2dkdC5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3Jlc19nZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM0NjNhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3Jlc19nZHQuYwpAQCAtMCwwICsxLDIyMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmVzX2dkdC5jIC0tLSByZXNlcnZlIGJsb2NrcyBmb3IgZ3Jvd2luZyB0aGUgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZQorICogICAgICAgICAgICAgICBkdXJpbmcgb25saW5lIHJlc2l6aW5nLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBBbmRyZWFzIERpbGdlcgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworLyoKKyAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JvdXBzIHdoaWNoIGhvbGQgQkFDS1VQIHN1cGVyYmxvY2svR0RUIGNvcGllcyBpbiBhbgorICogZXh0MyBmaWxlc3lzdGVtLiAgVGhlIGNvdW50ZXJzIHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAxLCA1LCBhbmQgNyBiZWZvcmUKKyAqIGNhbGxpbmcgdGhpcyBmb3IgdGhlIGZpcnN0IHRpbWUuICBJbiBhIHNwYXJzZSBmaWxlc3lzdGVtIGl0IHdpbGwgYmUgdGhlCisgKiBzZXF1ZW5jZSBvZiBwb3dlcnMgb2YgMywgNSwgYW5kIDc6IDEsIDMsIDUsIDcsIDksIDI1LCAyNywgNDksIDgxLCAuLi4KKyAqIEZvciBhIG5vbi1zcGFyc2UgZmlsZXN5c3RlbSBpdCB3aWxsIGJlIGV2ZXJ5IGdyb3VwOiAxLCAyLCAzLCA0LCAuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBsaXN0X2JhY2t1cHMoZXh0Ml9maWxzeXMgZnMsIHVuc2lnbmVkIGludCAqdGhyZWUsCisJCQkJIHVuc2lnbmVkIGludCAqZml2ZSwgdW5zaWduZWQgaW50ICpzZXZlbikKK3sKKwl1bnNpZ25lZCBpbnQgKm1pbiA9IHRocmVlOworCWludCBtdWx0ID0gMzsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJaWYgKCEoZnMtPnN1cGVyLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYKKwkgICAgICBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpIHsKKwkJcmV0ID0gKm1pbjsKKwkJKm1pbiArPSAxOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICgqZml2ZSA8ICptaW4pIHsKKwkJbWluID0gZml2ZTsKKwkJbXVsdCA9IDU7CisJfQorCWlmICgqc2V2ZW4gPCAqbWluKSB7CisJCW1pbiA9IHNldmVuOworCQltdWx0ID0gNzsKKwl9CisKKwlyZXQgPSAqbWluOworCSptaW4gKj0gbXVsdDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSByZXNlcnZlZCBibG9ja3MgaGF2ZSBhbHJlYWR5IGJlZW4gbWFya2VkIGluLXVzZQorICogZHVyaW5nIGV4dDJmc19pbml0aWFsaXplKCksIHNvIHRoYXQgdGhleSBhcmUgbm90IGFsbG9jYXRlZCBmb3Igb3RoZXIKKyAqIHVzZXMgYmVmb3JlIHdlIGNhbiBhZGQgdGhlbSB0byB0aGUgcmVzaXplIGlub2RlICh3aGljaCBoYXMgdG8gY29tZQorICogYWZ0ZXIgdGhlIGNyZWF0aW9uIG9mIHRoZSBpbm9kZSB0YWJsZSkuCisgKi8KK2VycmNvZGVfdCBleHQyZnNfY3JlYXRlX3Jlc2l6ZV9pbm9kZShleHQyX2ZpbHN5cyBmcykKK3sKKwllcnJjb2RlX3QJCXJldHZhbCwgcmV0dmFsMjsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jawkqc2I7CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7CisJX191MzIJCQkqZGluZGlyX2J1ZiwgKmdkdF9idWY7CisJaW50CQkJcnN2X2FkZDsKKwl1bnNpZ25lZCBsb25nIGxvbmcJYXBiLCBpbm9kZV9zaXplOworCWJsa190CQkJZGluZGlyX2JsaywgcnN2X29mZiwgZ2R0X29mZiwgZ2R0X2JsazsKKwlpbnQJCQlkaW5kaXJfZGlydHkgPSAwLCBpbm9kZV9kaXJ0eSA9IDA7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJc2IgPSBmcy0+c3VwZXI7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbSgyICogZnMtPmJsb2Nrc2l6ZSwgKHZvaWQgKikmZGluZGlyX2J1Zik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfZnJlZTsKKwlnZHRfYnVmID0gKF9fdTMyICopKChjaGFyICopZGluZGlyX2J1ZiArIGZzLT5ibG9ja3NpemUpOworCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIEVYVDJfUkVTSVpFX0lOTywgJmlub2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dF9mcmVlOworCisJLyogTWF4aW11bSBwb3NzaWJsZSBmaWxlIHNpemUgKHdlIGRvbmx5IHVzZSB0aGUgZGluZGlyZWN0IGJsb2NrcykgKi8KKwlhcGIgPSBFWFQyX0FERFJfUEVSX0JMT0NLKHNiKTsKKwlyc3ZfYWRkID0gZnMtPmJsb2Nrc2l6ZSAvIDUxMjsKKwlpZiAoKGRpbmRpcl9ibGsgPSBpbm9kZS5pX2Jsb2NrW0VYVDJfRElORF9CTE9DS10pKSB7CisjaWZkZWYgUkVTX0dEVF9ERUJVRworCQlwcmludGYoInJlYWRpbmcgR0RUIGRpbmRpciAldVxuIiwgZGluZGlyX2Jsayk7CisjZW5kaWYKKwkJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5kX2Jsb2NrKGZzLCBkaW5kaXJfYmxrLCBkaW5kaXJfYnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gb3V0X2lub2RlOworCX0gZWxzZSB7CisJCWJsa190IGdvYWwgPSAzICsgc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyArCisJCQlmcy0+ZGVzY19ibG9ja3MgKyBmcy0+aW5vZGVfYmxvY2tzX3Blcl9ncm91cDsKKworCQlyZXR2YWwgPSBleHQyZnNfYWxsb2NfYmxvY2soZnMsIGdvYWwsIDAsICZkaW5kaXJfYmxrKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCWlub2RlLmlfbW9kZSA9IExJTlVYX1NfSUZSRUcgfCAwNjAwOworCQlpbm9kZS5pX2xpbmtzX2NvdW50ID0gMTsKKwkJaW5vZGUuaV9ibG9ja1tFWFQyX0RJTkRfQkxPQ0tdID0gZGluZGlyX2JsazsKKwkJaW5vZGUuaV9ibG9ja3MgPSByc3ZfYWRkOworCQltZW1zZXQoZGluZGlyX2J1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisjaWZkZWYgUkVTX0dEVF9ERUJVRworCQlwcmludGYoImFsbG9jYXRlZCBHRFQgZGluZGlyICV1XG4iLCBkaW5kaXJfYmxrKTsKKyNlbmRpZgorCQlkaW5kaXJfZGlydHkgPSBpbm9kZV9kaXJ0eSA9IDE7CisJCWlub2RlX3NpemUgPSBhcGIqYXBiICsgYXBiICsgRVhUMl9ORElSX0JMT0NLUzsKKwkJaW5vZGVfc2l6ZSAqPSBmcy0+YmxvY2tzaXplOworCQlpbm9kZS5pX3NpemUgPSBpbm9kZV9zaXplICYgMHhGRkZGRkZGRjsKKwkJaW5vZGUuaV9zaXplX2hpZ2ggPSAoaW5vZGVfc2l6ZSA+PiAzMikgJiAweEZGRkZGRkZGOworCQlpZiAoaW5vZGUuaV9zaXplX2hpZ2gpIHsKKwkJCXNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHw9CisJCQkJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFOworCQl9CisJCWlub2RlLmlfY3RpbWUgPSB0aW1lKE5VTEwpOworCX0KKworCWZvciAocnN2X29mZiA9IDAsIGdkdF9vZmYgPSBmcy0+ZGVzY19ibG9ja3MsCisJICAgICBnZHRfYmxrID0gc2ItPnNfZmlyc3RfZGF0YV9ibG9jayArIDEgKyBmcy0+ZGVzY19ibG9ja3M7CisJICAgICByc3Zfb2ZmIDwgc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsKKwkgICAgIHJzdl9vZmYrKywgZ2R0X29mZisrLCBnZHRfYmxrKyspIHsKKwkJdW5zaWduZWQgaW50IHRocmVlID0gMSwgZml2ZSA9IDUsIHNldmVuID0gNzsKKwkJdW5zaWduZWQgaW50IGdycCwgbGFzdCA9IDA7CisJCWludCBnZHRfZGlydHkgPSAwOworCisJCWdkdF9vZmYgJT0gYXBiOworCQlpZiAoIWRpbmRpcl9idWZbZ2R0X29mZl0pIHsKKwkJCS8qIEZJWE1FIFhYWCBYWFgKKwkJCWJsa190IG5ld19ibGs7CisKKwkJCXJldHZhbCA9IGV4dDJmc19uZXdfYmxvY2soZnMsIGdkdF9ibGssIDAsICZuZXdfYmxrKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXRfZnJlZTsKKwkJCWlmIChuZXdfYmxrICE9IGdkdF9ibGspIHsKKwkJCQkvLyBYWFggZnJlZSBibG9jaworCQkJCXJldHZhbCA9IC0xOyAvLyBYWFgKKwkJCX0KKwkJCSovCisJCQlnZHRfZGlydHkgPSBkaW5kaXJfZGlydHkgPSBpbm9kZV9kaXJ0eSA9IDE7CisJCQltZW1zZXQoZ2R0X2J1ZiwgMCwgZnMtPmJsb2Nrc2l6ZSk7CisJCQlkaW5kaXJfYnVmW2dkdF9vZmZdID0gZ2R0X2JsazsKKwkJCWlub2RlLmlfYmxvY2tzICs9IHJzdl9hZGQ7CisjaWZkZWYgUkVTX0dEVF9ERUJVRworCQkJcHJpbnRmKCJhZGRlZCBwcmltYXJ5IEdEVCBibG9jayAldSBhdCAldVsldV1cbiIsCisJCQkgICAgICAgZ2R0X2JsaywgZGluZGlyX2JsaywgZ2R0X29mZik7CisjZW5kaWYKKwkJfSBlbHNlIGlmIChkaW5kaXJfYnVmW2dkdF9vZmZdID09IGdkdF9ibGspIHsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCQlwcmludGYoInJlYWRpbmcgcHJpbWFyeSBHRFQgYmxvY2sgJXVcbiIsIGdkdF9ibGspOworI2VuZGlmCisJCQlyZXR2YWwgPSBleHQyZnNfcmVhZF9pbmRfYmxvY2soZnMsIGdkdF9ibGssIGdkdF9idWYpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIG91dF9kaW5kaXI7CisJCX0gZWxzZSB7CisjaWZkZWYgUkVTX0dEVF9ERUJVRworCQkJcHJpbnRmKCJiYWQgcHJpbWFyeSBHRFQgJXUgIT0gJXUgYXQgJXVbJXVdXG4iLAorCQkJICAgICAgIGRpbmRpcl9idWZbZ2R0X29mZl0sIGdkdF9ibGssZGluZGlyX2JsayxnZHRfb2ZmKTsKKyNlbmRpZgorCQkJcmV0dmFsID0gRVhUMl9FVF9SRVNJWkVfSU5PREVfQ09SUlVQVDsKKwkJCWdvdG8gb3V0X2RpbmRpcjsKKwkJfQorCisJCXdoaWxlICgoZ3JwID0gbGlzdF9iYWNrdXBzKGZzLCAmdGhyZWUsICZmaXZlLCAmc2V2ZW4pKSA8CisJCSAgICAgICBmcy0+Z3JvdXBfZGVzY19jb3VudCkgeworCQkJYmxrX3QgZXhwZWN0ID0gZ2R0X2JsayArIGdycCAqIHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisKKwkJCWlmICghZ2R0X2J1ZltsYXN0XSkgeworI2lmZGVmIFJFU19HRFRfREVCVUcKKwkJCQlwcmludGYoImFkZGVkIGJhY2t1cCBHRFQgJXUgZ3JwICV1QCV1WyV1XVxuIiwKKwkJCQkgICAgICAgZXhwZWN0LCBncnAsIGdkdF9ibGssIGxhc3QpOworI2VuZGlmCisJCQkJZ2R0X2J1ZltsYXN0XSA9IGV4cGVjdDsKKwkJCQlpbm9kZS5pX2Jsb2NrcyArPSByc3ZfYWRkOworCQkJCWdkdF9kaXJ0eSA9IGlub2RlX2RpcnR5ID0gMTsKKwkJCX0gZWxzZSBpZiAoZ2R0X2J1ZltsYXN0XSAhPSBleHBlY3QpIHsKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJCQkJcHJpbnRmKCJiYWQgYmFja3VwIEdEVCAldSAhPSAldSBhdCAldVsldV1cbiIsCisJCQkJICAgICAgIGdkdF9idWZbbGFzdF0sIGV4cGVjdCwgZ2R0X2JsaywgbGFzdCk7CisjZW5kaWYKKwkJCQlyZXR2YWwgPSBFWFQyX0VUX1JFU0laRV9JTk9ERV9DT1JSVVBUOworCQkJCWdvdG8gb3V0X2RpbmRpcjsKKwkJCX0KKwkJCWxhc3QrKzsKKwkJfQorCQlpZiAoZ2R0X2RpcnR5KSB7CisjaWZkZWYgUkVTX0dEVF9ERUJVRworCQkJcHJpbnRmKCJ3cml0aW5nIHByaW1hcnkgR0RUIGJsb2NrICV1XG4iLCBnZHRfYmxrKTsKKyNlbmRpZgorCQkJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2luZF9ibG9jayhmcywgZ2R0X2JsaywgZ2R0X2J1Zik7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gb3V0X2RpbmRpcjsKKwkJfQorCX0KKworb3V0X2RpbmRpcjoKKwlpZiAoZGluZGlyX2RpcnR5KSB7CisJCXJldHZhbDIgPSBleHQyZnNfd3JpdGVfaW5kX2Jsb2NrKGZzLCBkaW5kaXJfYmxrLCBkaW5kaXJfYnVmKTsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSByZXR2YWwyOworCX0KK291dF9pbm9kZToKKyNpZmRlZiBSRVNfR0RUX0RFQlVHCisJcHJpbnRmKCJpbm9kZS5pX2Jsb2NrcyA9ICV1LCBpX3NpemUgPSAldVxuIiwgaW5vZGUuaV9ibG9ja3MsCisJICAgICAgIGlub2RlLmlfc2l6ZSk7CisjZW5kaWYKKwlpZiAoaW5vZGVfZGlydHkpIHsKKwkJaW5vZGUuaV9hdGltZSA9IGlub2RlLmlfbXRpbWUgPSB0aW1lKE5VTEwpOworCQlyZXR2YWwyID0gZXh0MmZzX3dyaXRlX2lub2RlKGZzLCBFWFQyX1JFU0laRV9JTk8sICZpbm9kZSk7CisJCWlmICghcmV0dmFsKQorCQkJcmV0dmFsID0gcmV0dmFsMjsKKwl9CitvdXRfZnJlZToKKwlleHQyZnNfZnJlZV9tZW0oKHZvaWQgKikmZGluZGlyX2J1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yc19iaXRtYXAuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9yc19iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmU4N2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3JzX2JpdG1hcC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByc19iaXRtYXAuYyAtLS0gcm91dGluZSBmb3IgY2hhbmdpbmcgdGhlIHNpemUgb2YgYSBiaXRtYXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGV4dDJmc19yZXNpemVfZ2VuZXJpY19iaXRtYXAoX191MzIgbmV3X2VuZCwgX191MzIgbmV3X3JlYWxfZW5kLAorCQkJCSAgICAgICBleHQyZnNfZ2VuZXJpY19iaXRtYXAgYm1hcCkKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXNpemVfdAkJc2l6ZSwgbmV3X3NpemU7CisJX191MzIJCWJpdG5vOworCisJaWYgKCFibWFwKQorCQlyZXR1cm4gRVhUMl9FVF9JTlZBTElEX0FSR1VNRU5UOworCisJRVhUMl9DSEVDS19NQUdJQyhibWFwLCBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQKTsKKworCS8qCisJICogSWYgd2UncmUgZXhwYW5kaW5nIHRoZSBiaXRtYXAsIG1ha2Ugc3VyZSBhbGwgb2YgdGhlIG5ldworCSAqIHBhcnRzIG9mIHRoZSBiaXRtYXAgYXJlIHplcm8uCisJICovCisJaWYgKG5ld19lbmQgPiBibWFwLT5lbmQpIHsKKwkJYml0bm8gPSBibWFwLT5yZWFsX2VuZDsKKwkJaWYgKGJpdG5vID4gbmV3X2VuZCkKKwkJCWJpdG5vID0gbmV3X2VuZDsKKwkJZm9yICg7IGJpdG5vID4gYm1hcC0+ZW5kOyBiaXRuby0tKQorCQkJZXh0MmZzX2NsZWFyX2JpdChiaXRubyAtIGJtYXAtPnN0YXJ0LCBibWFwLT5iaXRtYXApOworCX0KKwlpZiAobmV3X3JlYWxfZW5kID09IGJtYXAtPnJlYWxfZW5kKSB7CisJCWJtYXAtPmVuZCA9IG5ld19lbmQ7CisJCXJldHVybiAwOworCX0KKworCXNpemUgPSAoKGJtYXAtPnJlYWxfZW5kIC0gYm1hcC0+c3RhcnQpIC8gOCkgKyAxOworCW5ld19zaXplID0gKChuZXdfcmVhbF9lbmQgLSBibWFwLT5zdGFydCkgLyA4KSArIDE7CisKKwlpZiAoc2l6ZSAhPSBuZXdfc2l6ZSkgeworCQlyZXR2YWwgPSBleHQyZnNfcmVzaXplX21lbShzaXplLCBuZXdfc2l6ZSwgJmJtYXAtPmJpdG1hcCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAobmV3X3NpemUgPiBzaXplKQorCQltZW1zZXQoYm1hcC0+Yml0bWFwICsgc2l6ZSwgMCwgbmV3X3NpemUgLSBzaXplKTsKKworCWJtYXAtPmVuZCA9IG5ld19lbmQ7CisJYm1hcC0+cmVhbF9lbmQgPSBuZXdfcmVhbF9lbmQ7CisJcmV0dXJuIDA7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmVzaXplX2lub2RlX2JpdG1hcChfX3UzMiBuZXdfZW5kLCBfX3UzMiBuZXdfcmVhbF9lbmQsCisJCQkJICAgICBleHQyZnNfaW5vZGVfYml0bWFwIGJtYXApCit7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmICghYm1hcCkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoYm1hcCwgRVhUMl9FVF9NQUdJQ19JTk9ERV9CSVRNQVApOworCisJYm1hcC0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQOworCXJldHZhbCA9IGV4dDJmc19yZXNpemVfZ2VuZXJpY19iaXRtYXAobmV3X2VuZCwgbmV3X3JlYWxfZW5kLAorCQkJCQkgICAgICBibWFwKTsKKwlibWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfSU5PREVfQklUTUFQOworCXJldHVybiByZXR2YWw7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmVzaXplX2Jsb2NrX2JpdG1hcChfX3UzMiBuZXdfZW5kLCBfX3UzMiBuZXdfcmVhbF9lbmQsCisJCQkJICAgICBleHQyZnNfYmxvY2tfYml0bWFwIGJtYXApCit7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmICghYm1hcCkKKwkJcmV0dXJuIEVYVDJfRVRfSU5WQUxJRF9BUkdVTUVOVDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoYm1hcCwgRVhUMl9FVF9NQUdJQ19CTE9DS19CSVRNQVApOworCisJYm1hcC0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX0dFTkVSSUNfQklUTUFQOworCXJldHZhbCA9IGV4dDJmc19yZXNpemVfZ2VuZXJpY19iaXRtYXAobmV3X2VuZCwgbmV3X3JlYWxfZW5kLAorCQkJCQkgICAgICBibWFwKTsKKwlibWFwLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfQkxPQ0tfQklUTUFQOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvcndfYml0bWFwcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3J3X2JpdG1hcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE0MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3J3X2JpdG1hcHMuYwpAQCAtMCwwICsxLDI5NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcndfYml0bWFwcy5jIC0tLSByb3V0aW5lcyB0byByZWFkIGFuZCB3cml0ZSB0aGUgIGlub2RlIGFuZCBibG9jayBiaXRtYXBzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NCwgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorI2luY2x1ZGUgImUyaW1hZ2UuaCIKKworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pICYmIEJCX0JJR19FTkRJQU4KKy8qCisgKiBPbiB0aGUgUG93ZXJQQywgdGhlIGJpZy1lbmRpYW4gdmFyaWFudCBvZiB0aGUgZXh0MiBmaWxlc3lzdGVtCisgKiBoYXMgaXRzIGJpdG1hcHMgc3RvcmVkIGFzIDMyLWJpdCB3b3JkcyB3aXRoIGJpdCAwIGFzIHRoZSBMU0IKKyAqIG9mIGVhY2ggd29yZC4gIFRodXMgYSBiaXRtYXAgd2l0aCBvbmx5IGJpdCAwIHNldCB3b3VsZCBiZSwgYXMKKyAqIGEgc3RyaW5nIG9mIGJ5dGVzLCAwMCAwMCAwMCAwMSAwMCAuLi4KKyAqIFRvIGNvcGUgd2l0aCB0aGlzLCB3ZSBieXRlLXJldmVyc2UgZWFjaCB3b3JkIG9mIGEgYml0bWFwIGlmCisgKiB3ZSBoYXZlIGEgYmlnLWVuZGlhbiBmaWxlc3lzdGVtLCB0aGF0IGlzLCBpZiB3ZSBhcmUgKm5vdCoKKyAqIGJ5dGUtc3dhcHBpbmcgb3RoZXIgd29yZC1zaXplZCBudW1iZXJzLgorICovCisjZGVmaW5lIEVYVDJfQklHX0VORElBTl9CSVRNQVBTCisjZW5kaWYKKworI2lmZGVmIEVYVDJfQklHX0VORElBTl9CSVRNQVBTCitzdGF0aWMgdm9pZCBleHQyZnNfc3dhcF9iaXRtYXAoZXh0Ml9maWxzeXMgZnMsIGNoYXIgKmJpdG1hcCwgaW50IG5ieXRlcykKK3sKKwlfX3UzMiAqcCA9IChfX3UzMiAqKSBiaXRtYXA7CisJaW50IG47CisKKwlmb3IgKG4gPSBuYnl0ZXMgLyBzaXplb2YoX191MzIpOyBuID4gMDsgLS1uLCArK3ApCisJCSpwID0gZXh0MmZzX3N3YWIzMigqcCk7Cit9CisjZW5kaWYKKworZXJyY29kZV90IGV4dDJmc193cml0ZV9pbm9kZV9iaXRtYXAoZXh0Ml9maWxzeXMgZnMpCit7CisJZGdycF90CQlpOworCXNpemVfdAkJbmJ5dGVzOworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhciAqIGlub2RlX2JpdG1hcCA9IGZzLT5pbm9kZV9tYXAtPmJpdG1hcDsKKwljaGFyICogYml0bWFwX2Jsb2NrID0gTlVMTDsKKwlibGtfdAkJYmxrOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmICghKGZzLT5mbGFncyAmIEVYVDJfRkxBR19SVykpCisJCXJldHVybiBFWFQyX0VUX1JPX0ZJTFNZUzsKKwlpZiAoIWlub2RlX2JpdG1hcCkKKwkJcmV0dXJuIDA7CisJbmJ5dGVzID0gKHNpemVfdCkgKChFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSs3KSAvIDgpOworCisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oZnMtPmJsb2Nrc2l6ZSwgJmJpdG1hcF9ibG9jayk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwltZW1zZXQoYml0bWFwX2Jsb2NrLCAweGZmLCBmcy0+YmxvY2tzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGkrKykgeworCQltZW1jcHkoYml0bWFwX2Jsb2NrLCBpbm9kZV9iaXRtYXAsIG5ieXRlcyk7CisJCWJsayA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2lub2RlX2JpdG1hcDsKKwkJaWYgKGJsaykgeworI2lmZGVmIEVYVDJfQklHX0VORElBTl9CSVRNQVBTCisJCQlpZiAoISgoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVMpIHx8CisJCQkgICAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfV1JJVEUpKSkKKwkJCQlleHQyZnNfc3dhcF9iaXRtYXAoZnMsIGJpdG1hcF9ibG9jaywgbmJ5dGVzKTsKKyNlbmRpZgorCQkJcmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoZnMtPmlvLCBibGssIDEsCisJCQkJCQkgICAgICBiaXRtYXBfYmxvY2spOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4gRVhUMl9FVF9JTk9ERV9CSVRNQVBfV1JJVEU7CisJCX0KKwkJaW5vZGVfYml0bWFwICs9IG5ieXRlczsKKwl9CisJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfSUJfRElSVFk7CisJZXh0MmZzX2ZyZWVfbWVtKCZiaXRtYXBfYmxvY2spOworCXJldHVybiAwOworfQorCitlcnJjb2RlX3QgZXh0MmZzX3dyaXRlX2Jsb2NrX2JpdG1hcCAoZXh0Ml9maWxzeXMgZnMpCit7CisJZGdycF90CQlpOworCXVuc2lnbmVkIGludAlqOworCWludAkJbmJ5dGVzOworCXVuc2lnbmVkIGludAluYml0czsKKwllcnJjb2RlX3QJcmV0dmFsOworCWNoYXIgKiBibG9ja19iaXRtYXAgPSBmcy0+YmxvY2tfbWFwLT5iaXRtYXA7CisJY2hhciAqIGJpdG1hcF9ibG9jayA9IE5VTEw7CisJYmxrX3QJCWJsazsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfUlcpKQorCQlyZXR1cm4gRVhUMl9FVF9ST19GSUxTWVM7CisJaWYgKCFibG9ja19iaXRtYXApCisJCXJldHVybiAwOworCW5ieXRlcyA9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChmcy0+c3VwZXIpIC8gODsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShmcy0+YmxvY2tzaXplLCAmYml0bWFwX2Jsb2NrKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChiaXRtYXBfYmxvY2ssIDB4ZmYsIGZzLT5ibG9ja3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCW1lbWNweShiaXRtYXBfYmxvY2ssIGJsb2NrX2JpdG1hcCwgbmJ5dGVzKTsKKwkJaWYgKGkgPT0gZnMtPmdyb3VwX2Rlc2NfY291bnQgLSAxKSB7CisJCQkvKiBGb3JjZSBiaXRtYXAgcGFkZGluZyBmb3IgdGhlIGxhc3QgZ3JvdXAgKi8KKwkJCW5iaXRzID0gKChmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50CisJCQkJICAtIGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrKQorCQkJCSAlIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChmcy0+c3VwZXIpKTsKKwkJCWlmIChuYml0cykKKwkJCQlmb3IgKGogPSBuYml0czsgaiA8IGZzLT5ibG9ja3NpemUgKiA4OyBqKyspCisJCQkJCWV4dDJmc19zZXRfYml0KGosIGJpdG1hcF9ibG9jayk7CisJCX0KKwkJYmxrID0gZnMtPmdyb3VwX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwOworCQlpZiAoYmxrKSB7CisjaWZkZWYgRVhUMl9CSUdfRU5ESUFOX0JJVE1BUFMKKwkJCWlmICghKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJCSAgICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19XUklURSkpKQorCQkJCWV4dDJmc19zd2FwX2JpdG1hcChmcywgYml0bWFwX2Jsb2NrLCBuYnl0ZXMpOworI2VuZGlmCisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2Jsayhmcy0+aW8sIGJsaywgMSwKKwkJCQkJCSAgICAgIGJpdG1hcF9ibG9jayk7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiBFWFQyX0VUX0JMT0NLX0JJVE1BUF9XUklURTsKKwkJfQorCQlibG9ja19iaXRtYXAgKz0gbmJ5dGVzOworCX0KKwlmcy0+ZmxhZ3MgJj0gfkVYVDJfRkxBR19CQl9ESVJUWTsKKwlleHQyZnNfZnJlZV9tZW0oJmJpdG1hcF9ibG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgcmVhZF9iaXRtYXBzKGV4dDJfZmlsc3lzIGZzLCBpbnQgZG9faW5vZGUsIGludCBkb19ibG9jaykKK3sKKwlkZ3JwX3QgaTsKKwljaGFyICpibG9ja19iaXRtYXAgPSBOVUxMLCAqaW5vZGVfYml0bWFwID0gTlVMTDsKKwljaGFyICpidWY7CisJZXJyY29kZV90IHJldHZhbDsKKwlpbnQgYmxvY2tfbmJ5dGVzID0gKGludCkgRVhUMl9CTE9DS1NfUEVSX0dST1VQKGZzLT5zdXBlcikgLyA4OworCWludCBpbm9kZV9uYnl0ZXMgPSAoaW50KSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoZnMtPnN1cGVyKSAvIDg7CisJYmxrX3QJYmxrOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWZzLT53cml0ZV9iaXRtYXBzID0gZXh0MmZzX3dyaXRlX2JpdG1hcHM7CisKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4oZnMtPmRldmljZV9uYW1lKSArIDgwLCAmYnVmKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWlmIChkb19ibG9jaykgeworCQlleHQyZnNfZnJlZV9ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCk7CisJCXNwcmludGYoYnVmLCAiYmxvY2sgYml0bWFwIGZvciAlcyIsIGZzLT5kZXZpY2VfbmFtZSk7CisJCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9ibG9ja19iaXRtYXAoZnMsIGJ1ZiwgJmZzLT5ibG9ja19tYXApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCQlibG9ja19iaXRtYXAgPSBmcy0+YmxvY2tfbWFwLT5iaXRtYXA7CisJfQorCWlmIChkb19pbm9kZSkgeworCQlleHQyZnNfZnJlZV9pbm9kZV9iaXRtYXAoZnMtPmlub2RlX21hcCk7CisJCXNwcmludGYoYnVmLCAiaW5vZGUgYml0bWFwIGZvciAlcyIsIGZzLT5kZXZpY2VfbmFtZSk7CisJCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV9pbm9kZV9iaXRtYXAoZnMsIGJ1ZiwgJmZzLT5pbm9kZV9tYXApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBjbGVhbnVwOworCQlpbm9kZV9iaXRtYXAgPSBmcy0+aW5vZGVfbWFwLT5iaXRtYXA7CisJfQorCWV4dDJmc19mcmVlX21lbSgmYnVmKTsKKworCWlmIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfSU1BR0VfRklMRSkgeworCQlpZiAoaW5vZGVfYml0bWFwKSB7CisJCQlibGsgPSAoZnMtPmltYWdlX2hlYWRlci0+b2Zmc2V0X2lub2RlbWFwIC8KKwkJCSAgICAgICBmcy0+YmxvY2tzaXplKTsKKwkJCXJldHZhbCA9IGlvX2NoYW5uZWxfcmVhZF9ibGsoZnMtPmltYWdlX2lvLCBibGssCisJCQkgICAgIC0oaW5vZGVfbmJ5dGVzICogZnMtPmdyb3VwX2Rlc2NfY291bnQpLAorCQkJICAgICBpbm9kZV9iaXRtYXApOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJaWYgKGJsb2NrX2JpdG1hcCkgeworCQkJYmxrID0gKGZzLT5pbWFnZV9oZWFkZXItPm9mZnNldF9ibG9ja21hcCAvCisJCQkgICAgICAgZnMtPmJsb2Nrc2l6ZSk7CisJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbWFnZV9pbywgYmxrLAorCQkJICAgICAtKGJsb2NrX25ieXRlcyAqIGZzLT5ncm91cF9kZXNjX2NvdW50KSwKKwkJCSAgICAgYmxvY2tfYml0bWFwKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCWlmIChibG9ja19iaXRtYXApIHsKKwkJCWJsayA9IGZzLT5ncm91cF9kZXNjW2ldLmJnX2Jsb2NrX2JpdG1hcDsKKwkJCWlmIChibGspIHsKKwkJCQlyZXR2YWwgPSBpb19jaGFubmVsX3JlYWRfYmxrKGZzLT5pbywgYmxrLAorCQkJCQkgICAgIC1ibG9ja19uYnl0ZXMsIGJsb2NrX2JpdG1hcCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlyZXR2YWwgPSBFWFQyX0VUX0JMT0NLX0JJVE1BUF9SRUFEOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorI2lmZGVmIEVYVDJfQklHX0VORElBTl9CSVRNQVBTCisJCQkJaWYgKCEoKGZzLT5mbGFncyAmIEVYVDJfRkxBR19TV0FQX0JZVEVTKSB8fAorCQkJCSAgICAgIChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFU19SRUFEKSkpCisJCQkJCWV4dDJmc19zd2FwX2JpdG1hcChmcywgYmxvY2tfYml0bWFwLCBibG9ja19uYnl0ZXMpOworI2VuZGlmCisJCQl9IGVsc2UKKwkJCQltZW1zZXQoYmxvY2tfYml0bWFwLCAwLCBibG9ja19uYnl0ZXMpOworCQkJYmxvY2tfYml0bWFwICs9IGJsb2NrX25ieXRlczsKKwkJfQorCQlpZiAoaW5vZGVfYml0bWFwKSB7CisJCQlibGsgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXA7CisJCQlpZiAoYmxrKSB7CisJCQkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIGJsaywKKwkJCQkJICAgICAtaW5vZGVfbmJ5dGVzLCBpbm9kZV9iaXRtYXApOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJcmV0dmFsID0gRVhUMl9FVF9JTk9ERV9CSVRNQVBfUkVBRDsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKyNpZmRlZiBFWFQyX0JJR19FTkRJQU5fQklUTUFQUworCQkJCWlmICghKChmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfU1dBUF9CWVRFUykgfHwKKwkJCQkgICAgICAoZnMtPmZsYWdzICYgRVhUMl9GTEFHX1NXQVBfQllURVNfUkVBRCkpKQorCQkJCQlleHQyZnNfc3dhcF9iaXRtYXAoZnMsIGlub2RlX2JpdG1hcCwgaW5vZGVfbmJ5dGVzKTsKKyNlbmRpZgorCQkJfSBlbHNlCisJCQkJbWVtc2V0KGlub2RlX2JpdG1hcCwgMCwgaW5vZGVfbmJ5dGVzKTsKKwkJCWlub2RlX2JpdG1hcCArPSBpbm9kZV9uYnl0ZXM7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJaWYgKGRvX2Jsb2NrKSB7CisJCWV4dDJmc19mcmVlX21lbSgmZnMtPmJsb2NrX21hcCk7CisJfQorCWlmIChkb19pbm9kZSkgeworCQlleHQyZnNfZnJlZV9tZW0oJmZzLT5pbm9kZV9tYXApOworCX0KKwlleHQyZnNfZnJlZV9tZW0oJmJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworZXJyY29kZV90IGV4dDJmc19yZWFkX2lub2RlX2JpdG1hcCAoZXh0Ml9maWxzeXMgZnMpCit7CisJcmV0dXJuIHJlYWRfYml0bWFwcyhmcywgMSwgMCk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9ibG9ja19iaXRtYXAoZXh0Ml9maWxzeXMgZnMpCit7CisJcmV0dXJuIHJlYWRfYml0bWFwcyhmcywgMCwgMSk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfcmVhZF9iaXRtYXBzKGV4dDJfZmlsc3lzIGZzKQoreworCUVYVDJfQ0hFQ0tfTUFHSUMoZnMsIEVYVDJfRVRfTUFHSUNfRVhUMkZTX0ZJTFNZUyk7CisKKwlpZiAoZnMtPmlub2RlX21hcCAmJiBmcy0+YmxvY2tfbWFwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiByZWFkX2JpdG1hcHMoZnMsICFmcy0+aW5vZGVfbWFwLCAhZnMtPmJsb2NrX21hcCk7Cit9CisKK2VycmNvZGVfdCBleHQyZnNfd3JpdGVfYml0bWFwcyhleHQyX2ZpbHN5cyBmcykKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCisJRVhUMl9DSEVDS19NQUdJQyhmcywgRVhUMl9FVF9NQUdJQ19FWFQyRlNfRklMU1lTKTsKKworCWlmIChmcy0+YmxvY2tfbWFwICYmIGV4dDJmc190ZXN0X2JiX2RpcnR5KGZzKSkgeworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfYmxvY2tfYml0bWFwKGZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCWlmIChmcy0+aW5vZGVfbWFwICYmIGV4dDJmc190ZXN0X2liX2RpcnR5KGZzKSkgeworCQlyZXR2YWwgPSBleHQyZnNfd3JpdGVfaW5vZGVfYml0bWFwKGZzKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3NwYXJzZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3NwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDMwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvc3BhcnNlLmMKQEAgLTAsMCArMSw3OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3BhcnNlLmMgLS0tIGZpbmQgdGhlIGdyb3VwcyBpbiBhbiBleHQyIGZpbGVzeXN0ZW0gd2l0aCBtZXRhZGF0YSBiYWNrdXBzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFRoZW9kb3JlIFRzJ28uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgQW5kcmVhcyBEaWxnZXIuCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnNQLmgiCisKK3N0YXRpYyBpbnQgdGVzdF9yb290KGludCBhLCBpbnQgYikKK3sKKwlpZiAoYSA9PSAwKQorCQlyZXR1cm4gMTsKKwl3aGlsZSAoMSkgeworCQlpZiAoYSA9PSAxKQorCQkJcmV0dXJuIDE7CisJCWlmIChhICUgYikKKwkJCXJldHVybiAwOworCQlhID0gYSAvIGI7CisJfQorfQorCitpbnQgZXh0MmZzX2JnX2hhc19zdXBlcihleHQyX2ZpbHN5cyBmcywgaW50IGdyb3VwX2Jsb2NrKQoreworCWlmICghKGZzLT5zdXBlci0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJICAgICAgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpKQorCQlyZXR1cm4gMTsKKworCWlmICh0ZXN0X3Jvb3QoZ3JvdXBfYmxvY2ssIDMpIHx8ICh0ZXN0X3Jvb3QoZ3JvdXBfYmxvY2ssIDUpKSB8fAorCSAgICB0ZXN0X3Jvb3QoZ3JvdXBfYmxvY2ssIDcpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBncm91cHMgd2hpY2ggaG9sZCBCQUNLVVAgc3VwZXJibG9jay9HRFQgY29waWVzIGluIGFuCisgKiBleHQzIGZpbGVzeXN0ZW0uICBUaGUgY291bnRlcnMgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIDEsIDUsIGFuZCA3IGJlZm9yZQorICogY2FsbGluZyB0aGlzIGZvciB0aGUgZmlyc3QgdGltZS4gIEluIGEgc3BhcnNlIGZpbGVzeXN0ZW0gaXQgd2lsbCBiZSB0aGUKKyAqIHNlcXVlbmNlIG9mIHBvd2VycyBvZiAzLCA1LCBhbmQgNzogMSwgMywgNSwgNywgOSwgMjUsIDI3LCA0OSwgODEsIC4uLgorICogRm9yIGEgbm9uLXNwYXJzZSBmaWxlc3lzdGVtIGl0IHdpbGwgYmUgZXZlcnkgZ3JvdXA6IDEsIDIsIDMsIDQsIC4uLgorICovCit1bnNpZ25lZCBpbnQgZXh0MmZzX2xpc3RfYmFja3VwcyhleHQyX2ZpbHN5cyBmcywgdW5zaWduZWQgaW50ICp0aHJlZSwKKwkJCQkgdW5zaWduZWQgaW50ICpmaXZlLCB1bnNpZ25lZCBpbnQgKnNldmVuKQoreworCXVuc2lnbmVkIGludCAqbWluID0gdGhyZWU7CisJaW50IG11bHQgPSAzOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlpZiAoIShmcy0+c3VwZXItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCSAgICAgIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSkgeworCQlyZXQgPSAqbWluOworCQkqbWluICs9IDE7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCpmaXZlIDwgKm1pbikgeworCQltaW4gPSBmaXZlOworCQltdWx0ID0gNTsKKwl9CisJaWYgKCpzZXZlbiA8ICptaW4pIHsKKwkJbWluID0gc2V2ZW47CisJCW11bHQgPSA3OworCX0KKworCXJldCA9ICptaW47CisJKm1pbiAqPSBtdWx0OworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9zd2FwZnMuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9zd2FwZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I3NTdhCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3N3YXBmcy5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzd2FwZnMuYyAtLS0gc3dhcCBleHQyIGZpbGVzeXN0ZW0gZGF0YSBzdHJ1Y3R1cmVzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAyMDAyIFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisjaW5jbHVkZSAiZXh0Ml9leHRfYXR0ci5oIgorCisjaWYgQkJfQklHX0VORElBTgordm9pZCBleHQyZnNfc3dhcF9zdXBlcihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHNiKQoreworCWludCBpOworCXNiLT5zX2lub2Rlc19jb3VudCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfaW5vZGVzX2NvdW50KTsKKwlzYi0+c19ibG9ja3NfY291bnQgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2Jsb2Nrc19jb3VudCk7CisJc2ItPnNfcl9ibG9ja3NfY291bnQgPSBleHQyZnNfc3dhYjMyKHNiLT5zX3JfYmxvY2tzX2NvdW50KTsKKwlzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZnJlZV9ibG9ja3NfY291bnQpOworCXNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gZXh0MmZzX3N3YWIzMihzYi0+c19mcmVlX2lub2Rlc19jb3VudCk7CisJc2ItPnNfZmlyc3RfZGF0YV9ibG9jayA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJc2ItPnNfbG9nX2Jsb2NrX3NpemUgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2xvZ19ibG9ja19zaXplKTsKKwlzYi0+c19sb2dfZnJhZ19zaXplID0gZXh0MmZzX3N3YWIzMihzYi0+c19sb2dfZnJhZ19zaXplKTsKKwlzYi0+c19ibG9ja3NfcGVyX2dyb3VwID0gZXh0MmZzX3N3YWIzMihzYi0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwlzYi0+c19mcmFnc19wZXJfZ3JvdXAgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2ZyYWdzX3Blcl9ncm91cCk7CisJc2ItPnNfaW5vZGVzX3Blcl9ncm91cCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfaW5vZGVzX3Blcl9ncm91cCk7CisJc2ItPnNfbXRpbWUgPSBleHQyZnNfc3dhYjMyKHNiLT5zX210aW1lKTsKKwlzYi0+c193dGltZSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfd3RpbWUpOworCXNiLT5zX21udF9jb3VudCA9IGV4dDJmc19zd2FiMTYoc2ItPnNfbW50X2NvdW50KTsKKwlzYi0+c19tYXhfbW50X2NvdW50ID0gZXh0MmZzX3N3YWIxNihzYi0+c19tYXhfbW50X2NvdW50KTsKKwlzYi0+c19tYWdpYyA9IGV4dDJmc19zd2FiMTYoc2ItPnNfbWFnaWMpOworCXNiLT5zX3N0YXRlID0gZXh0MmZzX3N3YWIxNihzYi0+c19zdGF0ZSk7CisJc2ItPnNfZXJyb3JzID0gZXh0MmZzX3N3YWIxNihzYi0+c19lcnJvcnMpOworCXNiLT5zX21pbm9yX3Jldl9sZXZlbCA9IGV4dDJmc19zd2FiMTYoc2ItPnNfbWlub3JfcmV2X2xldmVsKTsKKwlzYi0+c19sYXN0Y2hlY2sgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2xhc3RjaGVjayk7CisJc2ItPnNfY2hlY2tpbnRlcnZhbCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfY2hlY2tpbnRlcnZhbCk7CisJc2ItPnNfY3JlYXRvcl9vcyA9IGV4dDJmc19zd2FiMzIoc2ItPnNfY3JlYXRvcl9vcyk7CisJc2ItPnNfcmV2X2xldmVsID0gZXh0MmZzX3N3YWIzMihzYi0+c19yZXZfbGV2ZWwpOworCXNiLT5zX2RlZl9yZXN1aWQgPSBleHQyZnNfc3dhYjE2KHNiLT5zX2RlZl9yZXN1aWQpOworCXNiLT5zX2RlZl9yZXNnaWQgPSBleHQyZnNfc3dhYjE2KHNiLT5zX2RlZl9yZXNnaWQpOworCXNiLT5zX2ZpcnN0X2lubyA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZmlyc3RfaW5vKTsKKwlzYi0+c19pbm9kZV9zaXplID0gZXh0MmZzX3N3YWIxNihzYi0+c19pbm9kZV9zaXplKTsKKwlzYi0+c19ibG9ja19ncm91cF9uciA9IGV4dDJmc19zd2FiMTYoc2ItPnNfYmxvY2tfZ3JvdXBfbnIpOworCXNiLT5zX2ZlYXR1cmVfY29tcGF0ID0gZXh0MmZzX3N3YWIzMihzYi0+c19mZWF0dXJlX2NvbXBhdCk7CisJc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCk7CisJc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0KTsKKwlzYi0+c19hbGdvcml0aG1fdXNhZ2VfYml0bWFwID0gZXh0MmZzX3N3YWIzMihzYi0+c19hbGdvcml0aG1fdXNhZ2VfYml0bWFwKTsKKwlzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzID0gZXh0MmZzX3N3YWIxNihzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKTsKKwlzYi0+c19qb3VybmFsX2ludW0gPSBleHQyZnNfc3dhYjMyKHNiLT5zX2pvdXJuYWxfaW51bSk7CisJc2ItPnNfam91cm5hbF9kZXYgPSBleHQyZnNfc3dhYjMyKHNiLT5zX2pvdXJuYWxfZGV2KTsKKwlzYi0+c19sYXN0X29ycGhhbiA9IGV4dDJmc19zd2FiMzIoc2ItPnNfbGFzdF9vcnBoYW4pOworCXNiLT5zX2RlZmF1bHRfbW91bnRfb3B0cyA9IGV4dDJmc19zd2FiMzIoc2ItPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKKwlzYi0+c19maXJzdF9tZXRhX2JnID0gZXh0MmZzX3N3YWIzMihzYi0+c19maXJzdF9tZXRhX2JnKTsKKwlzYi0+c19ta2ZzX3RpbWUgPSBleHQyZnNfc3dhYjMyKHNiLT5zX21rZnNfdGltZSk7CisJZm9yIChpPTA7IGkgPCA0OyBpKyspCisJCXNiLT5zX2hhc2hfc2VlZFtpXSA9IGV4dDJmc19zd2FiMzIoc2ItPnNfaGFzaF9zZWVkW2ldKTsKKwlmb3IgKGk9MDsgaSA8IDE3OyBpKyspCisJCXNiLT5zX2pubF9ibG9ja3NbaV0gPSBleHQyZnNfc3dhYjMyKHNiLT5zX2pubF9ibG9ja3NbaV0pOworfQorCit2b2lkIGV4dDJmc19zd2FwX2dyb3VwX2Rlc2Moc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2RwKQoreworCWdkcC0+YmdfYmxvY2tfYml0bWFwID0gZXh0MmZzX3N3YWIzMihnZHAtPmJnX2Jsb2NrX2JpdG1hcCk7CisJZ2RwLT5iZ19pbm9kZV9iaXRtYXAgPSBleHQyZnNfc3dhYjMyKGdkcC0+YmdfaW5vZGVfYml0bWFwKTsKKwlnZHAtPmJnX2lub2RlX3RhYmxlID0gZXh0MmZzX3N3YWIzMihnZHAtPmJnX2lub2RlX3RhYmxlKTsKKwlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gZXh0MmZzX3N3YWIxNihnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gZXh0MmZzX3N3YWIxNihnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwlnZHAtPmJnX3VzZWRfZGlyc19jb3VudCA9IGV4dDJmc19zd2FiMTYoZ2RwLT5iZ191c2VkX2RpcnNfY291bnQpOworfQorCit2b2lkIGV4dDJmc19zd2FwX2V4dF9hdHRyKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgYnVmc2l6ZSwgaW50IGhhc19oZWFkZXIpCit7CisJc3RydWN0IGV4dDJfZXh0X2F0dHJfaGVhZGVyICpmcm9tX2hlYWRlciA9CisJCShzdHJ1Y3QgZXh0Ml9leHRfYXR0cl9oZWFkZXIgKilmcm9tOworCXN0cnVjdCBleHQyX2V4dF9hdHRyX2hlYWRlciAqdG9faGVhZGVyID0KKwkJKHN0cnVjdCBleHQyX2V4dF9hdHRyX2hlYWRlciAqKXRvOworCXN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5ICpmcm9tX2VudHJ5LCAqdG9fZW50cnk7CisJY2hhciAqZnJvbV9lbmQgPSAoY2hhciAqKWZyb21faGVhZGVyICsgYnVmc2l6ZTsKKwlpbnQgbjsKKworCWlmICh0b19oZWFkZXIgIT0gZnJvbV9oZWFkZXIpCisJCW1lbWNweSh0b19oZWFkZXIsIGZyb21faGVhZGVyLCBidWZzaXplKTsKKworCWZyb21fZW50cnkgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKilmcm9tX2hlYWRlcjsKKwl0b19lbnRyeSAgID0gKHN0cnVjdCBleHQyX2V4dF9hdHRyX2VudHJ5ICopdG9faGVhZGVyOworCisJaWYgKGhhc19oZWFkZXIpIHsKKwkJdG9faGVhZGVyLT5oX21hZ2ljICAgID0gZXh0MmZzX3N3YWIzMihmcm9tX2hlYWRlci0+aF9tYWdpYyk7CisJCXRvX2hlYWRlci0+aF9ibG9ja3MgICA9IGV4dDJmc19zd2FiMzIoZnJvbV9oZWFkZXItPmhfYmxvY2tzKTsKKwkJdG9faGVhZGVyLT5oX3JlZmNvdW50ID0gZXh0MmZzX3N3YWIzMihmcm9tX2hlYWRlci0+aF9yZWZjb3VudCk7CisJCWZvciAobj0wOyBuPDQ7IG4rKykKKwkJCXRvX2hlYWRlci0+aF9yZXNlcnZlZFtuXSA9CisJCQkJZXh0MmZzX3N3YWIzMihmcm9tX2hlYWRlci0+aF9yZXNlcnZlZFtuXSk7CisJCWZyb21fZW50cnkgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKikoZnJvbV9oZWFkZXIrMSk7CisJCXRvX2VudHJ5ICAgPSAoc3RydWN0IGV4dDJfZXh0X2F0dHJfZW50cnkgKikodG9faGVhZGVyKzEpOworCX0KKworCXdoaWxlICgoY2hhciAqKWZyb21fZW50cnkgPCBmcm9tX2VuZCAmJiAqKF9fdTMyICopZnJvbV9lbnRyeSkgeworCQl0b19lbnRyeS0+ZV92YWx1ZV9vZmZzICA9CisJCQlleHQyZnNfc3dhYjE2KGZyb21fZW50cnktPmVfdmFsdWVfb2Zmcyk7CisJCXRvX2VudHJ5LT5lX3ZhbHVlX2Jsb2NrID0KKwkJCWV4dDJmc19zd2FiMzIoZnJvbV9lbnRyeS0+ZV92YWx1ZV9ibG9jayk7CisJCXRvX2VudHJ5LT5lX3ZhbHVlX3NpemUgID0KKwkJCWV4dDJmc19zd2FiMzIoZnJvbV9lbnRyeS0+ZV92YWx1ZV9zaXplKTsKKwkJZnJvbV9lbnRyeSA9IEVYVDJfRVhUX0FUVFJfTkVYVChmcm9tX2VudHJ5KTsKKwkJdG9fZW50cnkgICA9IEVYVDJfRVhUX0FUVFJfTkVYVCh0b19lbnRyeSk7CisJfQorfQorCit2b2lkIGV4dDJmc19zd2FwX2lub2RlX2Z1bGwoZXh0Ml9maWxzeXMgZnMsIHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICp0LAorCQkJICAgIHN0cnVjdCBleHQyX2lub2RlX2xhcmdlICpmLCBpbnQgaG9zdG9yZGVyLAorCQkJICAgIGludCBidWZzaXplKQoreworCXVuc2lnbmVkIGk7CisJaW50IGlzbG5rID0gMDsKKwlfX3UzMiAqZWFmLCAqZWF0OworCisJaWYgKGhvc3RvcmRlciAmJiBMSU5VWF9TX0lTTE5LKGYtPmlfbW9kZSkpCisJCWlzbG5rID0gMTsKKwl0LT5pX21vZGUgPSBleHQyZnNfc3dhYjE2KGYtPmlfbW9kZSk7CisJaWYgKCFob3N0b3JkZXIgJiYgTElOVVhfU19JU0xOSyh0LT5pX21vZGUpKQorCQlpc2xuayA9IDE7CisJdC0+aV91aWQgPSBleHQyZnNfc3dhYjE2KGYtPmlfdWlkKTsKKwl0LT5pX3NpemUgPSBleHQyZnNfc3dhYjMyKGYtPmlfc2l6ZSk7CisJdC0+aV9hdGltZSA9IGV4dDJmc19zd2FiMzIoZi0+aV9hdGltZSk7CisJdC0+aV9jdGltZSA9IGV4dDJmc19zd2FiMzIoZi0+aV9jdGltZSk7CisJdC0+aV9tdGltZSA9IGV4dDJmc19zd2FiMzIoZi0+aV9tdGltZSk7CisJdC0+aV9kdGltZSA9IGV4dDJmc19zd2FiMzIoZi0+aV9kdGltZSk7CisJdC0+aV9naWQgPSBleHQyZnNfc3dhYjE2KGYtPmlfZ2lkKTsKKwl0LT5pX2xpbmtzX2NvdW50ID0gZXh0MmZzX3N3YWIxNihmLT5pX2xpbmtzX2NvdW50KTsKKwl0LT5pX2Jsb2NrcyA9IGV4dDJmc19zd2FiMzIoZi0+aV9ibG9ja3MpOworCXQtPmlfZmxhZ3MgPSBleHQyZnNfc3dhYjMyKGYtPmlfZmxhZ3MpOworCXQtPmlfZmlsZV9hY2wgPSBleHQyZnNfc3dhYjMyKGYtPmlfZmlsZV9hY2wpOworCXQtPmlfZGlyX2FjbCA9IGV4dDJmc19zd2FiMzIoZi0+aV9kaXJfYWNsKTsKKwlpZiAoIWlzbG5rIHx8IGV4dDJmc19pbm9kZV9kYXRhX2Jsb2NrcyhmcywgKHN0cnVjdCBleHQyX2lub2RlICopdCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IEVYVDJfTl9CTE9DS1M7IGkrKykKKwkJCXQtPmlfYmxvY2tbaV0gPSBleHQyZnNfc3dhYjMyKGYtPmlfYmxvY2tbaV0pOworCX0gZWxzZSBpZiAodCAhPSBmKSB7CisJCWZvciAoaSA9IDA7IGkgPCBFWFQyX05fQkxPQ0tTOyBpKyspCisJCQl0LT5pX2Jsb2NrW2ldID0gZi0+aV9ibG9ja1tpXTsKKwl9CisJdC0+aV9nZW5lcmF0aW9uID0gZXh0MmZzX3N3YWIzMihmLT5pX2dlbmVyYXRpb24pOworCXQtPmlfZmFkZHIgPSBleHQyZnNfc3dhYjMyKGYtPmlfZmFkZHIpOworCisJc3dpdGNoIChmcy0+c3VwZXItPnNfY3JlYXRvcl9vcykgeworCWNhc2UgRVhUMl9PU19MSU5VWDoKKwkJdC0+b3NkMS5saW51eDEubF9pX3Jlc2VydmVkMSA9CisJCQlleHQyZnNfc3dhYjMyKGYtPm9zZDEubGludXgxLmxfaV9yZXNlcnZlZDEpOworCQl0LT5vc2QyLmxpbnV4Mi5sX2lfZnJhZyA9IGYtPm9zZDIubGludXgyLmxfaV9mcmFnOworCQl0LT5vc2QyLmxpbnV4Mi5sX2lfZnNpemUgPSBmLT5vc2QyLmxpbnV4Mi5sX2lfZnNpemU7CisJCXQtPm9zZDIubGludXgyLmlfcGFkMSA9IGV4dDJmc19zd2FiMTYoZi0+b3NkMi5saW51eDIuaV9wYWQxKTsKKwkJdC0+b3NkMi5saW51eDIubF9pX3VpZF9oaWdoID0KKwkJICBleHQyZnNfc3dhYjE2IChmLT5vc2QyLmxpbnV4Mi5sX2lfdWlkX2hpZ2gpOworCQl0LT5vc2QyLmxpbnV4Mi5sX2lfZ2lkX2hpZ2ggPQorCQkgIGV4dDJmc19zd2FiMTYgKGYtPm9zZDIubGludXgyLmxfaV9naWRfaGlnaCk7CisJCXQtPm9zZDIubGludXgyLmxfaV9yZXNlcnZlZDIgPQorCQkJZXh0MmZzX3N3YWIzMihmLT5vc2QyLmxpbnV4Mi5sX2lfcmVzZXJ2ZWQyKTsKKwkJYnJlYWs7CisJY2FzZSBFWFQyX09TX0hVUkQ6CisJCXQtPm9zZDEuaHVyZDEuaF9pX3RyYW5zbGF0b3IgPQorCQkgIGV4dDJmc19zd2FiMzIgKGYtPm9zZDEuaHVyZDEuaF9pX3RyYW5zbGF0b3IpOworCQl0LT5vc2QyLmh1cmQyLmhfaV9mcmFnID0gZi0+b3NkMi5odXJkMi5oX2lfZnJhZzsKKwkJdC0+b3NkMi5odXJkMi5oX2lfZnNpemUgPSBmLT5vc2QyLmh1cmQyLmhfaV9mc2l6ZTsKKwkJdC0+b3NkMi5odXJkMi5oX2lfbW9kZV9oaWdoID0KKwkJICBleHQyZnNfc3dhYjE2IChmLT5vc2QyLmh1cmQyLmhfaV9tb2RlX2hpZ2gpOworCQl0LT5vc2QyLmh1cmQyLmhfaV91aWRfaGlnaCA9CisJCSAgZXh0MmZzX3N3YWIxNiAoZi0+b3NkMi5odXJkMi5oX2lfdWlkX2hpZ2gpOworCQl0LT5vc2QyLmh1cmQyLmhfaV9naWRfaGlnaCA9CisJCSAgZXh0MmZzX3N3YWIxNiAoZi0+b3NkMi5odXJkMi5oX2lfZ2lkX2hpZ2gpOworCQl0LT5vc2QyLmh1cmQyLmhfaV9hdXRob3IgPQorCQkgIGV4dDJmc19zd2FiMzIgKGYtPm9zZDIuaHVyZDIuaF9pX2F1dGhvcik7CisJCWJyZWFrOworCWNhc2UgRVhUMl9PU19NQVNJWDoKKwkJdC0+b3NkMS5tYXNpeDEubV9pX3Jlc2VydmVkMSA9CisJCQlleHQyZnNfc3dhYjMyKGYtPm9zZDEubWFzaXgxLm1faV9yZXNlcnZlZDEpOworCQl0LT5vc2QyLm1hc2l4Mi5tX2lfZnJhZyA9IGYtPm9zZDIubWFzaXgyLm1faV9mcmFnOworCQl0LT5vc2QyLm1hc2l4Mi5tX2lfZnNpemUgPSBmLT5vc2QyLm1hc2l4Mi5tX2lfZnNpemU7CisJCXQtPm9zZDIubWFzaXgyLm1fcGFkMSA9IGV4dDJmc19zd2FiMTYoZi0+b3NkMi5tYXNpeDIubV9wYWQxKTsKKwkJdC0+b3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMlswXSA9CisJCQlleHQyZnNfc3dhYjMyKGYtPm9zZDIubWFzaXgyLm1faV9yZXNlcnZlZDJbMF0pOworCQl0LT5vc2QyLm1hc2l4Mi5tX2lfcmVzZXJ2ZWQyWzFdID0KKwkJCWV4dDJmc19zd2FiMzIoZi0+b3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMlsxXSk7CisJCWJyZWFrOworCX0KKworCWlmIChidWZzaXplIDwgKGludCkgKHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkgKyBzaXplb2YoX191MTYpKSkKKwkJcmV0dXJuOyAvKiBubyBpX2V4dHJhX2lzaXplIGZpZWxkICovCisKKwl0LT5pX2V4dHJhX2lzaXplID0gZXh0MmZzX3N3YWIxNihmLT5pX2V4dHJhX2lzaXplKTsKKwlpZiAodC0+aV9leHRyYV9pc2l6ZSA+IEVYVDJfSU5PREVfU0laRShmcy0+c3VwZXIpIC0KKwkJCQlzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpKSB7CisJCS8qIHRoaXMgaXMgZXJyb3IgY2FzZTogaV9leHRyYV9zaXplIGlzIHRvbyBsYXJnZSAqLworCQlyZXR1cm47CisJfQorCisJaSA9IHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkgKyB0LT5pX2V4dHJhX2lzaXplICsgc2l6ZW9mKF9fdTMyKTsKKwlpZiAoYnVmc2l6ZSA8IChpbnQpIGkpCisJCXJldHVybjsgLyogbm8gc3BhY2UgZm9yIEVBIG1hZ2ljICovCisKKwllYWYgPSAoX191MzIgKikgKCgoY2hhciAqKSBmKSArIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkgKworCQkJCQlmLT5pX2V4dHJhX2lzaXplKTsKKworCWlmIChleHQyZnNfc3dhYjMyKCplYWYpICE9IEVYVDJfRVhUX0FUVFJfTUFHSUMpCisJCXJldHVybjsgLyogaXQgc2VlbXMgbm8gbWFnaWMgaGVyZSAqLworCisJZWF0ID0gKF9fdTMyICopICgoKGNoYXIgKikgdCkgKyBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpICsKKwkJCQkJZi0+aV9leHRyYV9pc2l6ZSk7CisJKmVhdCA9IGV4dDJmc19zd2FiMzIoKmVhZik7CisKKwkvKiBjb252ZXJ0IEVBKHMpICovCisJZXh0MmZzX3N3YXBfZXh0X2F0dHIoKGNoYXIgKikgKGVhdCArIDEpLCAoY2hhciAqKSAoZWFmICsgMSksCisJCQkgICAgIGJ1ZnNpemUgLSBzaXplb2Yoc3RydWN0IGV4dDJfaW5vZGUpIC0KKwkJCSAgICAgdC0+aV9leHRyYV9pc2l6ZSAtIHNpemVvZihfX3UzMiksIDApOworfQorCit2b2lkIGV4dDJmc19zd2FwX2lub2RlKGV4dDJfZmlsc3lzIGZzLCBzdHJ1Y3QgZXh0Ml9pbm9kZSAqdCwKKwkJICAgICAgIHN0cnVjdCBleHQyX2lub2RlICpmLCBpbnQgaG9zdG9yZGVyKQoreworCWV4dDJmc19zd2FwX2lub2RlX2Z1bGwoZnMsIChzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSB0LAorCQkJCShzdHJ1Y3QgZXh0Ml9pbm9kZV9sYXJnZSAqKSBmLCBob3N0b3JkZXIsCisJCQkJc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3Rlc3RfaW8uYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy90ZXN0X2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MGQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy90ZXN0X2lvLmMKQEAgLTAsMCArMSwzODAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHRlc3RfaW8uYyAtLS0gVGhpcyBpcyB0aGUgVGVzdCBJL08gaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCisvKgorICogRm9yIGNoZWNraW5nIHN0cnVjdHVyZSBtYWdpYyBudW1iZXJzLi4uCisgKi8KKworI2RlZmluZSBFWFQyX0NIRUNLX01BR0lDKHN0cnVjdCwgY29kZSkgXAorCSAgaWYgKChzdHJ1Y3QpLT5tYWdpYyAhPSAoY29kZSkpIHJldHVybiAoY29kZSkKKworc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhIHsKKwlpbnQJbWFnaWM7CisJaW9fY2hhbm5lbCByZWFsOworCWludCBmbGFnczsKKwlGSUxFICpvdXRmaWxlOworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJaW50IHJlYWRfYWJvcnRfY291bnQsIHdyaXRlX2Fib3J0X2NvdW50OworCXZvaWQgKCpyZWFkX2JsaykodW5zaWduZWQgbG9uZyBibG9jaywgaW50IGNvdW50LCBlcnJjb2RlX3QgZXJyKTsKKwl2b2lkICgqd3JpdGVfYmxrKSh1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsIGVycmNvZGVfdCBlcnIpOworCXZvaWQgKCpzZXRfYmxrc2l6ZSkoaW50IGJsa3NpemUsIGVycmNvZGVfdCBlcnIpOworCXZvaWQgKCp3cml0ZV9ieXRlKSh1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsIGVycmNvZGVfdCBlcnIpOworfTsKKworc3RhdGljIGVycmNvZGVfdCB0ZXN0X29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBpb19jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9jbG9zZShpb19jaGFubmVsIGNoYW5uZWwpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3NldF9ibGtzaXplKGlvX2NoYW5uZWwgY2hhbm5lbCwgaW50IGJsa3NpemUpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3JlYWRfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIHZvaWQgKmRhdGEpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3dyaXRlX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJaW50IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9mbHVzaChpb19jaGFubmVsIGNoYW5uZWwpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3dyaXRlX2J5dGUoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgaW50IGNvdW50LCBjb25zdCB2b2lkICpidWYpOworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3NldF9vcHRpb24oaW9fY2hhbm5lbCBjaGFubmVsLCBjb25zdCBjaGFyICpvcHRpb24sCisJCQkJIGNvbnN0IGNoYXIgKmFyZyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3RydWN0X2lvX21hbmFnZXIgc3RydWN0X3Rlc3RfbWFuYWdlciA9IHsKKwlFWFQyX0VUX01BR0lDX0lPX01BTkFHRVIsCisJIlRlc3QgSS9PIE1hbmFnZXIiLAorCXRlc3Rfb3BlbiwKKwl0ZXN0X2Nsb3NlLAorCXRlc3Rfc2V0X2Jsa3NpemUsCisJdGVzdF9yZWFkX2JsaywKKwl0ZXN0X3dyaXRlX2JsaywKKwl0ZXN0X2ZsdXNoLAorCXRlc3Rfd3JpdGVfYnl0ZSwKKwl0ZXN0X3NldF9vcHRpb24KK307CisKK2lvX21hbmFnZXIgdGVzdF9pb19tYW5hZ2VyID0gJnN0cnVjdF90ZXN0X21hbmFnZXI7CisKKy8qCisgKiBUaGVzZSBnbG9iYWwgdmFyaWFibGUgY2FuIGJlIHNldCBieSB0aGUgdGVzdCBwcm9ncmFtIGFzCisgKiBuZWNlc3NhcnkgKmJlZm9yZSogY2FsbGluZyB0ZXN0X29wZW4KKyAqLworaW9fbWFuYWdlciB0ZXN0X2lvX2JhY2tpbmdfbWFuYWdlciA9IDA7Cit2b2lkICgqdGVzdF9pb19jYl9yZWFkX2JsaykKKwkodW5zaWduZWQgbG9uZyBibG9jaywgaW50IGNvdW50LCBlcnJjb2RlX3QgZXJyKSA9IDA7Cit2b2lkICgqdGVzdF9pb19jYl93cml0ZV9ibGspCisJKHVuc2lnbmVkIGxvbmcgYmxvY2ssIGludCBjb3VudCwgZXJyY29kZV90IGVycikgPSAwOwordm9pZCAoKnRlc3RfaW9fY2Jfc2V0X2Jsa3NpemUpCisJKGludCBibGtzaXplLCBlcnJjb2RlX3QgZXJyKSA9IDA7Cit2b2lkICgqdGVzdF9pb19jYl93cml0ZV9ieXRlKQorCSh1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgY291bnQsIGVycmNvZGVfdCBlcnIpID0gMDsKKworLyoKKyAqIFRlc3QgZmxhZ3MKKyAqLworI2RlZmluZSBURVNUX0ZMQUdfUkVBRAkJCTB4MDEKKyNkZWZpbmUgVEVTVF9GTEFHX1dSSVRFCQkJMHgwMgorI2RlZmluZSBURVNUX0ZMQUdfU0VUX0JMS1NJWkUJCTB4MDQKKyNkZWZpbmUgVEVTVF9GTEFHX0ZMVVNICQkJMHgwOAorI2RlZmluZSBURVNUX0ZMQUdfRFVNUAkJCTB4MTAKKyNkZWZpbmUgVEVTVF9GTEFHX1NFVF9PUFRJT04JCTB4MjAKKworc3RhdGljIHZvaWQgdGVzdF9kdW1wX2Jsb2NrKGlvX2NoYW5uZWwgY2hhbm5lbCwKKwkJCSAgICBzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKmRhdGEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBibG9jaywgY29uc3Qgdm9pZCAqYnVmKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwOworCUZJTEUgKmYgPSBkYXRhLT5vdXRmaWxlOworCWludAlpOworCXVuc2lnbmVkIGxvbmcJY2tzdW0gPSAwOworCisJZm9yIChpPTAsIGNwID0gYnVmOyBpIDwgY2hhbm5lbC0+YmxvY2tfc2l6ZTsgaSsrLCBjcCsrKSB7CisJCWNrc3VtICs9ICpjcDsKKwl9CisJZnByaW50ZihmLCAiQ29udGVudHMgb2YgYmxvY2sgJWx1LCBjaGVja3N1bSAlMDhsdTpcbiIsIGJsb2NrLCBja3N1bSk7CisJZm9yIChpPTAsIGNwID0gYnVmOyBpIDwgY2hhbm5lbC0+YmxvY2tfc2l6ZTsgaSsrLCBjcCsrKSB7CisJCWlmICgoaSAlIDE2KSA9PSAwKQorCQkJZnByaW50ZihmLCAiJTA0eDogIiwgaSk7CisJCWZwcmludGYoZiwgIiUwMnglYyIsICpjcCwgKChpICUgMTYpID09IDE1KSA/ICdcbicgOiAnICcpOworCX0KK30KKworc3RhdGljIHZvaWQgdGVzdF9hYm9ydChpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2spCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCUZJTEUgKmY7CisKKwlkYXRhID0gKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJZiA9IGRhdGEtPm91dGZpbGU7CisJdGVzdF9mbHVzaChjaGFubmVsKTsKKworCWZwcmludGYoZiwgIkFib3J0aW5nIGR1ZSB0byBJL08gdG8gYmxvY2sgJWx1XG4iLCBibG9jayk7CisJZmZsdXNoKGYpOworCWFib3J0KCk7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgaW9fY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpb19jaGFubmVsCWlvID0gTlVMTDsKKwlzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEgKmRhdGEgPSBOVUxMOworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhcgkJKnZhbHVlOworCisJaWYgKG5hbWUgPT0gMCkKKwkJcmV0dXJuIEVYVDJfRVRfQkFEX0RFVklDRV9OQU1FOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3Qgc3RydWN0X2lvX2NoYW5uZWwpLCAmaW8pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGlvLCAwLCBzaXplb2Yoc3RydWN0IHN0cnVjdF9pb19jaGFubmVsKSk7CisJaW8tPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEpLCAmZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlyZXR2YWwgPSBFWFQyX0VUX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlpby0+bWFuYWdlciA9IHRlc3RfaW9fbWFuYWdlcjsKKwlyZXR2YWwgPSBleHQyZnNfZ2V0X21lbShzdHJsZW4obmFtZSkrMSwgJmlvLT5uYW1lKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNsZWFudXA7CisKKwlzdHJjcHkoaW8tPm5hbWUsIG5hbWUpOworCWlvLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCWlvLT5ibG9ja19zaXplID0gMTAyNDsKKwlpby0+cmVhZF9lcnJvciA9IDA7CisJaW8tPndyaXRlX2Vycm9yID0gMDsKKwlpby0+cmVmY291bnQgPSAxOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdGVzdF9wcml2YXRlX2RhdGEpKTsKKwlkYXRhLT5tYWdpYyA9IEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMOworCWlmICh0ZXN0X2lvX2JhY2tpbmdfbWFuYWdlcikgeworCQlyZXR2YWwgPSB0ZXN0X2lvX2JhY2tpbmdfbWFuYWdlci0+b3BlbihuYW1lLCBmbGFncywKKwkJCQkJCSAgICAgICAmZGF0YS0+cmVhbCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGNsZWFudXA7CisJfSBlbHNlCisJCWRhdGEtPnJlYWwgPSAwOworCWRhdGEtPnJlYWRfYmxrID0JdGVzdF9pb19jYl9yZWFkX2JsazsKKwlkYXRhLT53cml0ZV9ibGsgPQl0ZXN0X2lvX2NiX3dyaXRlX2JsazsKKwlkYXRhLT5zZXRfYmxrc2l6ZSA9CXRlc3RfaW9fY2Jfc2V0X2Jsa3NpemU7CisJZGF0YS0+d3JpdGVfYnl0ZSA9CXRlc3RfaW9fY2Jfd3JpdGVfYnl0ZTsKKworCWRhdGEtPm91dGZpbGUgPSBOVUxMOworCWlmICgodmFsdWUgPSBnZXRlbnYoIlRFU1RfSU9fTE9HRklMRSIpKSAhPSBOVUxMKQorCQlkYXRhLT5vdXRmaWxlID0gZm9wZW5fZm9yX3dyaXRlKHZhbHVlKTsKKwlpZiAoIWRhdGEtPm91dGZpbGUpCisJCWRhdGEtPm91dGZpbGUgPSBzdGRlcnI7CisKKwlkYXRhLT5mbGFncyA9IDA7CisJaWYgKCh2YWx1ZSA9IGdldGVudigiVEVTVF9JT19GTEFHUyIpKSAhPSBOVUxMKQorCQlkYXRhLT5mbGFncyA9IHN0cnRvdWwodmFsdWUsIE5VTEwsIDApOworCisJZGF0YS0+YmxvY2sgPSAwOworCWlmICgodmFsdWUgPSBnZXRlbnYoIlRFU1RfSU9fQkxPQ0siKSkgIT0gTlVMTCkKKwkJZGF0YS0+YmxvY2sgPSBzdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKKworCWRhdGEtPnJlYWRfYWJvcnRfY291bnQgPSAwOworCWlmICgodmFsdWUgPSBnZXRlbnYoIlRFU1RfSU9fUkVBRF9BQk9SVCIpKSAhPSBOVUxMKQorCQlkYXRhLT5yZWFkX2Fib3J0X2NvdW50ID0gc3RydG91bCh2YWx1ZSwgTlVMTCwgMCk7CisKKwlkYXRhLT53cml0ZV9hYm9ydF9jb3VudCA9IDA7CisJaWYgKCh2YWx1ZSA9IGdldGVudigiVEVTVF9JT19XUklURV9BQk9SVCIpKSAhPSBOVUxMKQorCQlkYXRhLT53cml0ZV9hYm9ydF9jb3VudCA9IHN0cnRvdWwodmFsdWUsIE5VTEwsIDApOworCisJKmNoYW5uZWwgPSBpbzsKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlleHQyZnNfZnJlZV9tZW0oJmlvKTsKKwlleHQyZnNfZnJlZV9tZW0oJmRhdGEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9jbG9zZShpb19jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCWlmICgtLWNoYW5uZWwtPnJlZmNvdW50ID4gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGF0YS0+cmVhbCkKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF9jbG9zZShkYXRhLT5yZWFsKTsKKworCWlmIChkYXRhLT5vdXRmaWxlICYmIGRhdGEtPm91dGZpbGUgIT0gc3RkZXJyKQorCQlmY2xvc2UoZGF0YS0+b3V0ZmlsZSk7CisKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwtPnByaXZhdGVfZGF0YSk7CisJZXh0MmZzX2ZyZWVfbWVtKCZjaGFubmVsLT5uYW1lKTsKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9zZXRfYmxrc2l6ZShpb19jaGFubmVsIGNoYW5uZWwsIGludCBibGtzaXplKQoreworCXN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX1RFU1RfSU9fQ0hBTk5FTCk7CisKKwlpZiAoZGF0YS0+cmVhbCkKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF9zZXRfYmxrc2l6ZShkYXRhLT5yZWFsLCBibGtzaXplKTsKKwlpZiAoZGF0YS0+c2V0X2Jsa3NpemUpCisJCWRhdGEtPnNldF9ibGtzaXplKGJsa3NpemUsIHJldHZhbCk7CisJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX1NFVF9CTEtTSVpFKQorCQlmcHJpbnRmKGRhdGEtPm91dGZpbGUsCisJCQkiVGVzdF9pbzogc2V0X2Jsa3NpemUoJWQpIHJldHVybmVkICVzXG4iLAorCQkJYmxrc2l6ZSwgcmV0dmFsID8gZXJyb3JfbWVzc2FnZShyZXR2YWwpIDogIk9LIik7CisJY2hhbm5lbC0+YmxvY2tfc2l6ZSA9IGJsa3NpemU7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgZXJyY29kZV90IHRlc3RfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgIGludCBjb3VudCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX1RFU1RfSU9fQ0hBTk5FTCk7CisKKwlpZiAoZGF0YS0+cmVhbCkKKwkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2JsayhkYXRhLT5yZWFsLCBibG9jaywgY291bnQsIGJ1Zik7CisJaWYgKGRhdGEtPnJlYWRfYmxrKQorCQlkYXRhLT5yZWFkX2JsayhibG9jaywgY291bnQsIHJldHZhbCk7CisJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX1JFQUQpCisJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwKKwkJCSJUZXN0X2lvOiByZWFkX2JsayglbHUsICVkKSByZXR1cm5lZCAlc1xuIiwKKwkJCWJsb2NrLCBjb3VudCwgcmV0dmFsID8gZXJyb3JfbWVzc2FnZShyZXR2YWwpIDogIk9LIik7CisJaWYgKGRhdGEtPmJsb2NrICYmIGRhdGEtPmJsb2NrID09IGJsb2NrKSB7CisJCWlmIChkYXRhLT5mbGFncyAmIFRFU1RfRkxBR19EVU1QKQorCQkJdGVzdF9kdW1wX2Jsb2NrKGNoYW5uZWwsIGRhdGEsIGJsb2NrLCBidWYpOworCQlpZiAoLS1kYXRhLT5yZWFkX2Fib3J0X2NvdW50ID09IDApCisJCQl0ZXN0X2Fib3J0KGNoYW5uZWwsIGJsb2NrKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGVycmNvZGVfdCB0ZXN0X3dyaXRlX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICAgaW50IGNvdW50LCBjb25zdCB2b2lkICpidWYpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCWlmIChkYXRhLT5yZWFsKQorCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2JsayhkYXRhLT5yZWFsLCBibG9jaywgY291bnQsIGJ1Zik7CisJaWYgKGRhdGEtPndyaXRlX2JsaykKKwkJZGF0YS0+d3JpdGVfYmxrKGJsb2NrLCBjb3VudCwgcmV0dmFsKTsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfV1JJVEUpCisJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwKKwkJCSJUZXN0X2lvOiB3cml0ZV9ibGsoJWx1LCAlZCkgcmV0dXJuZWQgJXNcbiIsCisJCQlibG9jaywgY291bnQsIHJldHZhbCA/IGVycm9yX21lc3NhZ2UocmV0dmFsKSA6ICJPSyIpOworCWlmIChkYXRhLT5ibG9jayAmJiBkYXRhLT5ibG9jayA9PSBibG9jaykgeworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfRFVNUCkKKwkJCXRlc3RfZHVtcF9ibG9jayhjaGFubmVsLCBkYXRhLCBibG9jaywgYnVmKTsKKwkJaWYgKC0tZGF0YS0+d3JpdGVfYWJvcnRfY291bnQgPT0gMCkKKwkJCXRlc3RfYWJvcnQoY2hhbm5lbCwgYmxvY2spOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IHRlc3Rfd3JpdGVfYnl0ZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICAgIGludCBjb3VudCwgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX1RFU1RfSU9fQ0hBTk5FTCk7CisKKwlpZiAoZGF0YS0+cmVhbCAmJiBkYXRhLT5yZWFsLT5tYW5hZ2VyLT53cml0ZV9ieXRlKQorCQlyZXR2YWwgPSBpb19jaGFubmVsX3dyaXRlX2J5dGUoZGF0YS0+cmVhbCwgb2Zmc2V0LCBjb3VudCwgYnVmKTsKKwlpZiAoZGF0YS0+d3JpdGVfYnl0ZSkKKwkJZGF0YS0+d3JpdGVfYnl0ZShvZmZzZXQsIGNvdW50LCByZXR2YWwpOworCWlmIChkYXRhLT5mbGFncyAmIFRFU1RfRkxBR19XUklURSkKKwkJZnByaW50ZihkYXRhLT5vdXRmaWxlLAorCQkJIlRlc3RfaW86IHdyaXRlX2J5dGUoJWx1LCAlZCkgcmV0dXJuZWQgJXNcbiIsCisJCQlvZmZzZXQsIGNvdW50LCByZXR2YWwgPyBlcnJvcl9tZXNzYWdlKHJldHZhbCkgOiAiT0siKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRmx1c2ggZGF0YSBidWZmZXJzIHRvIGRpc2suCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgdGVzdF9mbHVzaChpb19jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHRlc3RfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVEVTVF9JT19DSEFOTkVMKTsKKworCWlmIChkYXRhLT5yZWFsKQorCQlyZXR2YWwgPSBpb19jaGFubmVsX2ZsdXNoKGRhdGEtPnJlYWwpOworCisJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX0ZMVVNIKQorCQlmcHJpbnRmKGRhdGEtPm91dGZpbGUsICJUZXN0X2lvOiBmbHVzaCgpIHJldHVybmVkICVzXG4iLAorCQkJcmV0dmFsID8gZXJyb3JfbWVzc2FnZShyZXR2YWwpIDogIk9LIik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZXJyY29kZV90IHRlc3Rfc2V0X29wdGlvbihpb19jaGFubmVsIGNoYW5uZWwsIGNvbnN0IGNoYXIgKm9wdGlvbiwKKwkJCQkgY29uc3QgY2hhciAqYXJnKQoreworCXN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwllcnJjb2RlX3QJcmV0dmFsID0gMDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCB0ZXN0X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX1RFU1RfSU9fQ0hBTk5FTCk7CisKKworCWlmIChkYXRhLT5mbGFncyAmIFRFU1RfRkxBR19TRVRfT1BUSU9OKQorCQlmcHJpbnRmKGRhdGEtPm91dGZpbGUsICJUZXN0X2lvOiBzZXRfb3B0aW9uKCVzLCAlcykgIiwKKwkJCW9wdGlvbiwgYXJnKTsKKwlpZiAoZGF0YS0+cmVhbCAmJiBkYXRhLT5yZWFsLT5tYW5hZ2VyLT5zZXRfb3B0aW9uKSB7CisJCXJldHZhbCA9IChkYXRhLT5yZWFsLT5tYW5hZ2VyLT5zZXRfb3B0aW9uKShkYXRhLT5yZWFsLAorCQkJCQkJCSAgIG9wdGlvbiwgYXJnKTsKKwkJaWYgKGRhdGEtPmZsYWdzICYgVEVTVF9GTEFHX1NFVF9PUFRJT04pCisJCQlmcHJpbnRmKGRhdGEtPm91dGZpbGUsICJyZXR1cm5lZCAlc1xuIiwKKwkJCQlyZXR2YWwgPyBlcnJvcl9tZXNzYWdlKHJldHZhbCkgOiAiT0siKTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBURVNUX0ZMQUdfU0VUX09QVElPTikKKwkJCWZwcmludGYoZGF0YS0+b3V0ZmlsZSwgIm5vdCBpbXBsZW1lbnRlZFxuIik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdW5peF9pby5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3VuaXhfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRmMDczCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3VuaXhfaW8uYwpAQCAtMCwwICsxLDcwMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdW5peF9pby5jIC0tLSBUaGlzIGlzIHRoZSBVbml4ICh3ZWxsLCByZWFsbHkgUE9TSVgpIGltcGxlbWVudGF0aW9uCisgKglvZiB0aGUgSS9PIG1hbmFnZXIuCisgKgorICogSW1wbGVtZW50cyBhIG9uZS1ibG9jayB3cml0ZS10aHJvdWdoIGNhY2hlLgorICoKKyAqIEluY2x1ZGVzIHN1cHBvcnQgZm9yIFdpbmRvd3MgTlQgc3VwcG9ydCB1bmRlciBDeWd3aW4uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorICoJMjAwMiBieSBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19TVEFUX0gKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBGb3IgY2hlY2tpbmcgc3RydWN0dXJlIG1hZ2ljIG51bWJlcnMuLi4KKyAqLworCisjZGVmaW5lIEVYVDJfQ0hFQ0tfTUFHSUMoc3RydWN0LCBjb2RlKSBcCisJICBpZiAoKHN0cnVjdCktPm1hZ2ljICE9IChjb2RlKSkgcmV0dXJuIChjb2RlKQorCitzdHJ1Y3QgdW5peF9jYWNoZSB7CisJY2hhcgkJKmJ1ZjsKKwl1bnNpZ25lZCBsb25nCWJsb2NrOworCWludAkJYWNjZXNzX3RpbWU7CisJdW5zaWduZWQJZGlydHk6MTsKKwl1bnNpZ25lZAlpbl91c2U6MTsKK307CisKKyNkZWZpbmUgQ0FDSEVfU0laRSA4CisjZGVmaW5lIFdSSVRFX0RJUkVDVF9TSVpFIDQJLyogTXVzdCBiZSBzbWFsbGVyIHRoYW4gQ0FDSEVfU0laRSAqLworI2RlZmluZSBSRUFEX0RJUkVDVF9TSVpFIDQJLyogU2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBDQUNIRV9TSVpFICovCisKK3N0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSB7CisJaW50CW1hZ2ljOworCWludAlkZXY7CisJaW50CWZsYWdzOworCWludAlhY2Nlc3NfdGltZTsKKwlleHQyX2xvZmZfdCBvZmZzZXQ7CisJc3RydWN0IHVuaXhfY2FjaGUgY2FjaGVbQ0FDSEVfU0laRV07Cit9OworCitzdGF0aWMgZXJyY29kZV90IHVuaXhfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIGlvX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIGVycmNvZGVfdCB1bml4X2Nsb3NlKGlvX2NoYW5uZWwgY2hhbm5lbCk7CitzdGF0aWMgZXJyY29kZV90IHVuaXhfc2V0X2Jsa3NpemUoaW9fY2hhbm5lbCBjaGFubmVsLCBpbnQgYmxrc2l6ZSk7CitzdGF0aWMgZXJyY29kZV90IHVuaXhfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJICAgICAgIGludCBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgZXJyY29kZV90IHVuaXhfd3JpdGVfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCQlpbnQgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEpOworc3RhdGljIGVycmNvZGVfdCB1bml4X2ZsdXNoKGlvX2NoYW5uZWwgY2hhbm5lbCk7CitzdGF0aWMgZXJyY29kZV90IHVuaXhfd3JpdGVfYnl0ZShpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCWludCBzaXplLCBjb25zdCB2b2lkICpkYXRhKTsKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9zZXRfb3B0aW9uKGlvX2NoYW5uZWwgY2hhbm5lbCwgY29uc3QgY2hhciAqb3B0aW9uLAorCQkJCSBjb25zdCBjaGFyICphcmcpOworCitzdGF0aWMgdm9pZCByZXVzZV9jYWNoZShpb19jaGFubmVsIGNoYW5uZWwsIHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YSwKKwkJIHN0cnVjdCB1bml4X2NhY2hlICpjYWNoZSwgdW5zaWduZWQgbG9uZyBibG9jayk7CisKKy8qIF9fRnJlZUJTRF9rZXJuZWxfXyBpcyBkZWZpbmVkIGJ5IEdOVS9rRnJlZUJTRCAtIHRoZSBGcmVlQlNEIGtlcm5lbAorICogZG9lcyBub3Qga25vdyBidWZmZXJlZCBibG9jayBkZXZpY2VzIC0gZXZlcnl0aGluZyBpcyByYXcuICovCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyNkZWZpbmUgTkVFRF9CT1VOQ0VfQlVGRkVSCisjZWxzZQorI3VuZGVmIE5FRURfQk9VTkNFX0JVRkZFUgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3RydWN0X2lvX21hbmFnZXIgc3RydWN0X3VuaXhfbWFuYWdlciA9IHsKKwlFWFQyX0VUX01BR0lDX0lPX01BTkFHRVIsCisJIlVuaXggSS9PIE1hbmFnZXIiLAorCXVuaXhfb3BlbiwKKwl1bml4X2Nsb3NlLAorCXVuaXhfc2V0X2Jsa3NpemUsCisJdW5peF9yZWFkX2JsaywKKwl1bml4X3dyaXRlX2JsaywKKwl1bml4X2ZsdXNoLAorI2lmZGVmIE5FRURfQk9VTkNFX0JVRkZFUgorCTAsCisjZWxzZQorCXVuaXhfd3JpdGVfYnl0ZSwKKyNlbmRpZgorCXVuaXhfc2V0X29wdGlvbgorfTsKKworaW9fbWFuYWdlciB1bml4X2lvX21hbmFnZXIgPSAmc3RydWN0X3VuaXhfbWFuYWdlcjsKKworLyoKKyAqIEhlcmUgYXJlIHRoZSByYXcgSS9PIGZ1bmN0aW9ucworICovCisjaWZuZGVmIE5FRURfQk9VTkNFX0JVRkZFUgorc3RhdGljIGVycmNvZGVfdCByYXdfcmVhZF9ibGsoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJICAgICAgc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgIGludCBjb3VudCwgdm9pZCAqYnVmKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJc3NpemVfdAkJc2l6ZTsKKwlleHQyX2xvZmZfdAlsb2NhdGlvbjsKKwlpbnQJCWFjdHVhbCA9IDA7CisKKwlzaXplID0gKGNvdW50IDwgMCkgPyAtY291bnQgOiBjb3VudCAqIGNoYW5uZWwtPmJsb2NrX3NpemU7CisJbG9jYXRpb24gPSAoKGV4dDJfbG9mZl90KSBibG9jayAqIGNoYW5uZWwtPmJsb2NrX3NpemUpICsgZGF0YS0+b2Zmc2V0OworCWlmIChleHQyZnNfbGxzZWVrKGRhdGEtPmRldiwgbG9jYXRpb24sIFNFRUtfU0VUKSAhPSBsb2NhdGlvbikgeworCQlyZXR2YWwgPSBlcnJubyA/IGVycm5vIDogRVhUMl9FVF9MTFNFRUtfRkFJTEVEOworCQlnb3RvIGVycm9yX291dDsKKwl9CisJYWN0dWFsID0gcmVhZChkYXRhLT5kZXYsIGJ1Ziwgc2l6ZSk7CisJaWYgKGFjdHVhbCAhPSBzaXplKSB7CisJCWlmIChhY3R1YWwgPCAwKQorCQkJYWN0dWFsID0gMDsKKwkJcmV0dmFsID0gRVhUMl9FVF9TSE9SVF9SRUFEOworCQlnb3RvIGVycm9yX291dDsKKwl9CisJcmV0dXJuIDA7CisKK2Vycm9yX291dDoKKwltZW1zZXQoKGNoYXIgKikgYnVmK2FjdHVhbCwgMCwgc2l6ZS1hY3R1YWwpOworCWlmIChjaGFubmVsLT5yZWFkX2Vycm9yKQorCQlyZXR2YWwgPSAoY2hhbm5lbC0+cmVhZF9lcnJvcikoY2hhbm5lbCwgYmxvY2ssIGNvdW50LCBidWYsCisJCQkJCSAgICAgICBzaXplLCBhY3R1YWwsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKyNlbHNlIC8qIE5FRURfQk9VTkNFX0JVRkZFUiAqLworLyoKKyAqIFdpbmRvd3MgYW5kIEZyZWVCU0QgYmxvY2sgZGV2aWNlcyBvbmx5IGFsbG93IHNlY3RvciBhbGlnbm1lbnQgSU8gaW4gb2Zmc2V0IGFuZCBzaXplCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgcmF3X3JlYWRfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwKKwkJCSAgICAgIHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICBpbnQgY291bnQsIHZvaWQgKmJ1ZikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCXNpemVfdAkJc2l6ZSwgYWxpZ25zaXplLCBmcmFnbWVudDsKKwlleHQyX2xvZmZfdAlsb2NhdGlvbjsKKwlpbnQJCXRvdGFsID0gMCwgYWN0dWFsOworI2RlZmluZSBCTE9DS0FMSUdOIDUxMgorCWNoYXIJCXNlY3RvcltCTE9DS0FMSUdOXTsKKworCXNpemUgPSAoY291bnQgPCAwKSA/IC1jb3VudCA6IGNvdW50ICogY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwlsb2NhdGlvbiA9ICgoZXh0Ml9sb2ZmX3QpIGJsb2NrICogY2hhbm5lbC0+YmxvY2tfc2l6ZSkgKyBkYXRhLT5vZmZzZXQ7CisjaWZkZWYgREVCVUcKKwlwcmludGYoImNvdW50PSVkLCBzaXplPSVkLCBibG9jaz0lZCwgYmxrX3NpemU9JWQsIGxvY2F0aW9uPSVseFxuIiwKKwkJCWNvdW50LCBzaXplLCBibG9jaywgY2hhbm5lbC0+YmxvY2tfc2l6ZSwgbG9jYXRpb24pOworI2VuZGlmCisJaWYgKGV4dDJmc19sbHNlZWsoZGF0YS0+ZGV2LCBsb2NhdGlvbiwgU0VFS19TRVQpICE9IGxvY2F0aW9uKSB7CisJCXJldHZhbCA9IGVycm5vID8gZXJybm8gOiBFWFQyX0VUX0xMU0VFS19GQUlMRUQ7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlmcmFnbWVudCA9IHNpemUgJSBCTE9DS0FMSUdOOworCWFsaWduc2l6ZSA9IHNpemUgLSBmcmFnbWVudDsKKwlpZiAoYWxpZ25zaXplKSB7CisJCWFjdHVhbCA9IHJlYWQoZGF0YS0+ZGV2LCBidWYsIGFsaWduc2l6ZSk7CisJCWlmIChhY3R1YWwgIT0gYWxpZ25zaXplKQorCQkJZ290byBzaG9ydF9yZWFkOworCX0KKwlpZiAoZnJhZ21lbnQpIHsKKwkJYWN0dWFsID0gcmVhZChkYXRhLT5kZXYsIHNlY3RvciwgQkxPQ0tBTElHTik7CisJCWlmIChhY3R1YWwgIT0gQkxPQ0tBTElHTikKKwkJCWdvdG8gc2hvcnRfcmVhZDsKKwkJbWVtY3B5KGJ1ZithbGlnbnNpemUsIHNlY3RvciwgZnJhZ21lbnQpOworCX0KKwlyZXR1cm4gMDsKKworc2hvcnRfcmVhZDoKKwlpZiAoYWN0dWFsPjApCisJCXRvdGFsICs9IGFjdHVhbDsKKwlyZXR2YWwgPSBFWFQyX0VUX1NIT1JUX1JFQUQ7CisKK2Vycm9yX291dDoKKwltZW1zZXQoKGNoYXIgKikgYnVmK3RvdGFsLCAwLCBzaXplLWFjdHVhbCk7CisJaWYgKGNoYW5uZWwtPnJlYWRfZXJyb3IpCisJCXJldHZhbCA9IChjaGFubmVsLT5yZWFkX2Vycm9yKShjaGFubmVsLCBibG9jaywgY291bnQsIGJ1ZiwKKwkJCQkJICAgICAgIHNpemUsIGFjdHVhbCwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKK3N0YXRpYyBlcnJjb2RlX3QgcmF3X3dyaXRlX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsCisJCQkgICAgICAgc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkgICAgICAgaW50IGNvdW50LCBjb25zdCB2b2lkICpidWYpCit7CisJc3NpemVfdAkJc2l6ZTsKKwlleHQyX2xvZmZfdAlsb2NhdGlvbjsKKwlpbnQJCWFjdHVhbCA9IDA7CisJZXJyY29kZV90CXJldHZhbDsKKworCWlmIChjb3VudCA9PSAxKQorCQlzaXplID0gY2hhbm5lbC0+YmxvY2tfc2l6ZTsKKwllbHNlIHsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCXNpemUgPSAtY291bnQ7CisJCWVsc2UKKwkJCXNpemUgPSBjb3VudCAqIGNoYW5uZWwtPmJsb2NrX3NpemU7CisJfQorCisJbG9jYXRpb24gPSAoKGV4dDJfbG9mZl90KSBibG9jayAqIGNoYW5uZWwtPmJsb2NrX3NpemUpICsgZGF0YS0+b2Zmc2V0OworCWlmIChleHQyZnNfbGxzZWVrKGRhdGEtPmRldiwgbG9jYXRpb24sIFNFRUtfU0VUKSAhPSBsb2NhdGlvbikgeworCQlyZXR2YWwgPSBlcnJubyA/IGVycm5vIDogRVhUMl9FVF9MTFNFRUtfRkFJTEVEOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlhY3R1YWwgPSB3cml0ZShkYXRhLT5kZXYsIGJ1Ziwgc2l6ZSk7CisJaWYgKGFjdHVhbCAhPSBzaXplKSB7CisJCXJldHZhbCA9IEVYVDJfRVRfU0hPUlRfV1JJVEU7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlyZXR1cm4gMDsKKworZXJyb3Jfb3V0OgorCWlmIChjaGFubmVsLT53cml0ZV9lcnJvcikKKwkJcmV0dmFsID0gKGNoYW5uZWwtPndyaXRlX2Vycm9yKShjaGFubmVsLCBibG9jaywgY291bnQsIGJ1ZiwKKwkJCQkJCXNpemUsIGFjdHVhbCwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qCisgKiBIZXJlIHdlIGltcGxlbWVudCB0aGUgY2FjaGUgZnVuY3Rpb25zCisgKi8KKworLyogQWxsb2NhdGUgdGhlIGNhY2hlIGJ1ZmZlcnMgKi8KK3N0YXRpYyBlcnJjb2RlX3QgYWxsb2NfY2FjaGUoaW9fY2hhbm5lbCBjaGFubmVsLAorCQkJICAgICBzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEpCit7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc3RydWN0IHVuaXhfY2FjaGUJKmNhY2hlOworCWludAkJCWk7CisKKwlkYXRhLT5hY2Nlc3NfdGltZSA9IDA7CisJZm9yIChpPTAsIGNhY2hlID0gZGF0YS0+Y2FjaGU7IGkgPCBDQUNIRV9TSVpFOyBpKyssIGNhY2hlKyspIHsKKwkJY2FjaGUtPmJsb2NrID0gMDsKKwkJY2FjaGUtPmFjY2Vzc190aW1lID0gMDsKKwkJY2FjaGUtPmRpcnR5ID0gMDsKKwkJY2FjaGUtPmluX3VzZSA9IDA7CisJCWlmICgocmV0dmFsID0gZXh0MmZzX2dldF9tZW0oY2hhbm5lbC0+YmxvY2tfc2l6ZSwKKwkJCQkJICAgICAmY2FjaGUtPmJ1ZikpKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEZyZWUgdGhlIGNhY2hlIGJ1ZmZlcnMgKi8KK3N0YXRpYyB2b2lkIGZyZWVfY2FjaGUoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB1bml4X2NhY2hlCSpjYWNoZTsKKwlpbnQJCQlpOworCisJZGF0YS0+YWNjZXNzX3RpbWUgPSAwOworCWZvciAoaT0wLCBjYWNoZSA9IGRhdGEtPmNhY2hlOyBpIDwgQ0FDSEVfU0laRTsgaSsrLCBjYWNoZSsrKSB7CisJCWNhY2hlLT5ibG9jayA9IDA7CisJCWNhY2hlLT5hY2Nlc3NfdGltZSA9IDA7CisJCWNhY2hlLT5kaXJ0eSA9IDA7CisJCWNhY2hlLT5pbl91c2UgPSAwOworCQlleHQyZnNfZnJlZV9tZW0oJmNhY2hlLT5idWYpOworCQljYWNoZS0+YnVmID0gMDsKKwl9Cit9CisKKyNpZm5kZWYgTk9fSU9fQ0FDSEUKKy8qCisgKiBUcnkgdG8gZmluZCBhIGJsb2NrIGluIHRoZSBjYWNoZS4gIElmIHRoZSBibG9jayBpcyBub3QgZm91bmQsIGFuZAorICogZWxkZXN0IGlzIGEgbm9uLXplcm8gcG9pbnRlciwgdGhlbiBmaWxsIGluIGVsZGVzdCB3aXRoIHRoZSBjYWNoZQorICogZW50cnkgdG8gdGhhdCBzaG91bGQgYmUgcmV1c2VkLgorICovCitzdGF0aWMgc3RydWN0IHVuaXhfY2FjaGUgKmZpbmRfY2FjaGVkX2Jsb2NrKHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJCSAgICBzdHJ1Y3QgdW5peF9jYWNoZSAqKmVsZGVzdCkKK3sKKwlzdHJ1Y3QgdW5peF9jYWNoZQkqY2FjaGUsICp1bnVzZWRfY2FjaGUsICpvbGRlc3RfY2FjaGU7CisJaW50CQkJaTsKKworCXVudXNlZF9jYWNoZSA9IG9sZGVzdF9jYWNoZSA9IDA7CisJZm9yIChpPTAsIGNhY2hlID0gZGF0YS0+Y2FjaGU7IGkgPCBDQUNIRV9TSVpFOyBpKyssIGNhY2hlKyspIHsKKwkJaWYgKCFjYWNoZS0+aW5fdXNlKSB7CisJCQlpZiAoIXVudXNlZF9jYWNoZSkKKwkJCQl1bnVzZWRfY2FjaGUgPSBjYWNoZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjYWNoZS0+YmxvY2sgPT0gYmxvY2spIHsKKwkJCWNhY2hlLT5hY2Nlc3NfdGltZSA9ICsrZGF0YS0+YWNjZXNzX3RpbWU7CisJCQlyZXR1cm4gY2FjaGU7CisJCX0KKwkJaWYgKCFvbGRlc3RfY2FjaGUgfHwKKwkJICAgIChjYWNoZS0+YWNjZXNzX3RpbWUgPCBvbGRlc3RfY2FjaGUtPmFjY2Vzc190aW1lKSkKKwkJCW9sZGVzdF9jYWNoZSA9IGNhY2hlOworCX0KKwlpZiAoZWxkZXN0KQorCQkqZWxkZXN0ID0gKHVudXNlZF9jYWNoZSkgPyB1bnVzZWRfY2FjaGUgOiBvbGRlc3RfY2FjaGU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXVzZSBhIHBhcnRpY3VsYXIgY2FjaGUgZW50cnkgZm9yIGFub3RoZXIgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHJldXNlX2NhY2hlKGlvX2NoYW5uZWwgY2hhbm5lbCwgc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhLAorCQkgc3RydWN0IHVuaXhfY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGJsb2NrKQoreworCWlmIChjYWNoZS0+ZGlydHkgJiYgY2FjaGUtPmluX3VzZSkKKwkJcmF3X3dyaXRlX2JsayhjaGFubmVsLCBkYXRhLCBjYWNoZS0+YmxvY2ssIDEsIGNhY2hlLT5idWYpOworCisJY2FjaGUtPmluX3VzZSA9IDE7CisJY2FjaGUtPmRpcnR5ID0gMDsKKwljYWNoZS0+YmxvY2sgPSBibG9jazsKKwljYWNoZS0+YWNjZXNzX3RpbWUgPSArK2RhdGEtPmFjY2Vzc190aW1lOworfQorCisvKgorICogRmx1c2ggYWxsIG9mIHRoZSBibG9ja3MgaW4gdGhlIGNhY2hlCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgZmx1c2hfY2FjaGVkX2Jsb2Nrcyhpb19jaGFubmVsIGNoYW5uZWwsCisJCQkJICAgICBzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEsCisJCQkJICAgICBpbnQgaW52YWxpZGF0ZSkKKworeworCXN0cnVjdCB1bml4X2NhY2hlCSpjYWNoZTsKKwllcnJjb2RlX3QJCXJldHZhbCwgcmV0dmFsMjsKKwlpbnQJCQlpOworCisJcmV0dmFsMiA9IDA7CisJZm9yIChpPTAsIGNhY2hlID0gZGF0YS0+Y2FjaGU7IGkgPCBDQUNIRV9TSVpFOyBpKyssIGNhY2hlKyspIHsKKwkJaWYgKCFjYWNoZS0+aW5fdXNlKQorCQkJY29udGludWU7CisKKwkJaWYgKGludmFsaWRhdGUpCisJCQljYWNoZS0+aW5fdXNlID0gMDsKKworCQlpZiAoIWNhY2hlLT5kaXJ0eSkKKwkJCWNvbnRpbnVlOworCisJCXJldHZhbCA9IHJhd193cml0ZV9ibGsoY2hhbm5lbCwgZGF0YSwKKwkJCQkgICAgICAgY2FjaGUtPmJsb2NrLCAxLCBjYWNoZS0+YnVmKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHZhbDIgPSByZXR2YWw7CisJCWVsc2UKKwkJCWNhY2hlLT5kaXJ0eSA9IDA7CisJfQorCXJldHVybiByZXR2YWwyOworfQorI2VuZGlmIC8qIE5PX0lPX0NBQ0hFICovCisKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncywgaW9fY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpb19jaGFubmVsCWlvID0gTlVMTDsKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGEgPSBOVUxMOworCWVycmNvZGVfdAlyZXR2YWw7CisJaW50CQlvcGVuX2ZsYWdzOworCXN0cnVjdCBzdGF0CXN0OworI2lmZGVmIF9fbGludXhfXworCXN0cnVjdAkJdXRzbmFtZSB1dDsKKyNlbmRpZgorCisJaWYgKG5hbWUgPT0gMCkKKwkJcmV0dXJuIEVYVDJfRVRfQkFEX0RFVklDRV9OQU1FOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3Qgc3RydWN0X2lvX2NoYW5uZWwpLCAmaW8pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJbWVtc2V0KGlvLCAwLCBzaXplb2Yoc3RydWN0IHN0cnVjdF9pb19jaGFubmVsKSk7CisJaW8tPm1hZ2ljID0gRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMOworCXJldHZhbCA9IGV4dDJmc19nZXRfbWVtKHNpemVvZihzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEpLCAmZGF0YSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJaW8tPm1hbmFnZXIgPSB1bml4X2lvX21hbmFnZXI7CisJcmV0dmFsID0gZXh0MmZzX2dldF9tZW0oc3RybGVuKG5hbWUpKzEsICZpby0+bmFtZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjbGVhbnVwOworCisJc3RyY3B5KGlvLT5uYW1lLCBuYW1lKTsKKwlpby0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKwlpby0+YmxvY2tfc2l6ZSA9IDEwMjQ7CisJaW8tPnJlYWRfZXJyb3IgPSAwOworCWlvLT53cml0ZV9lcnJvciA9IDA7CisJaW8tPnJlZmNvdW50ID0gMTsKKworCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhKSk7CisJZGF0YS0+bWFnaWMgPSBFWFQyX0VUX01BR0lDX1VOSVhfSU9fQ0hBTk5FTDsKKworCWlmICgocmV0dmFsID0gYWxsb2NfY2FjaGUoaW8sIGRhdGEpKSkKKwkJZ290byBjbGVhbnVwOworCisJb3Blbl9mbGFncyA9IChmbGFncyAmIElPX0ZMQUdfUlcpID8gT19SRFdSIDogT19SRE9OTFk7CisjaWZkZWYgQ09ORklHX0xGUworCWRhdGEtPmRldiA9IG9wZW42NChpby0+bmFtZSwgb3Blbl9mbGFncyk7CisjZWxzZQorCWRhdGEtPmRldiA9IG9wZW4oaW8tPm5hbWUsIG9wZW5fZmxhZ3MpOworI2VuZGlmCisJaWYgKGRhdGEtPmRldiA8IDApIHsKKwkJcmV0dmFsID0gZXJybm87CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKyNpZmRlZiBfX2xpbnV4X18KKyN1bmRlZiBSTElNX0lORklOSVRZCisjaWYgKGRlZmluZWQoX19hbHBoYV9fKSB8fCAoKGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSkgJiYgKFNJWkVPRl9MT05HID09IDQpKSkKKyNkZWZpbmUgUkxJTV9JTkZJTklUWQkoKHVuc2lnbmVkIGxvbmcpKH4wVUw+PjEpKQorI2Vsc2UKKyNkZWZpbmUgUkxJTV9JTkZJTklUWSAgKH4wVUwpCisjZW5kaWYKKwkvKgorCSAqIFdvcmsgYXJvdW5kIGEgYnVnIGluIDIuNC4xMC0yLjQuMTgga2VybmVscyB3aGVyZSB3cml0ZXMgdG8KKwkgKiBibG9jayBkZXZpY2VzIGFyZSB3cm9uZ2x5IGdldHRpbmcgaGl0IGJ5IHRoZSBmaWxlc2l6ZQorCSAqIGxpbWl0LiAgVGhpcyB3b3JrYXJvdW5kIGlzbid0IHBlcmZlY3QsIHNpbmNlIGl0IHdvbid0IHdvcmsKKwkgKiBpZiBnbGliYyB3YXNuJ3QgYnVpbHQgYWdhaW5zdCAyLjIgaGVhZGVyIGZpbGVzLiAgKFNpZ2guKQorCSAqCisJICovCisJaWYgKChmbGFncyAmIElPX0ZMQUdfUlcpICYmCisJICAgICh1bmFtZSgmdXQpID09IDApICYmCisJICAgICgodXQucmVsZWFzZVswXSA9PSAnMicpICYmICh1dC5yZWxlYXNlWzFdID09ICcuJykgJiYKKwkgICAgICh1dC5yZWxlYXNlWzJdID09ICc0JykgJiYgKHV0LnJlbGVhc2VbM10gPT0gJy4nKSAmJgorCSAgICAgKHV0LnJlbGVhc2VbNF0gPT0gJzEnKSAmJiAodXQucmVsZWFzZVs1XSA+PSAnMCcpICYmCisJICAgICAodXQucmVsZWFzZVs1XSA8ICc4JykpICYmCisJICAgIChmc3RhdChkYXRhLT5kZXYsICZzdCkgPT0gMCkgJiYKKwkgICAgKFNfSVNCTEsoc3Quc3RfbW9kZSkpKSB7CisJCXN0cnVjdCBybGltaXQJcmxpbTsKKworCQlybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9ICh1bnNpZ25lZCBsb25nKSBSTElNX0lORklOSVRZOworCQlzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCAmcmxpbSk7CisJCWdldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltKTsKKwkJaWYgKCgodW5zaWduZWQgbG9uZykgcmxpbS5ybGltX2N1cikgPAorCQkgICAgKCh1bnNpZ25lZCBsb25nKSBybGltLnJsaW1fbWF4KSkgeworCQkJcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXg7CisJCQlzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCAmcmxpbSk7CisJCX0KKwl9CisjZW5kaWYKKwkqY2hhbm5lbCA9IGlvOworCXJldHVybiAwOworCitjbGVhbnVwOgorCWlmIChkYXRhKSB7CisJCWZyZWVfY2FjaGUoZGF0YSk7CisJCWV4dDJmc19mcmVlX21lbSgmZGF0YSk7CisJfQorCWV4dDJmc19mcmVlX21lbSgmaW8pOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9jbG9zZShpb19jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworCWlmICgtLWNoYW5uZWwtPnJlZmNvdW50ID4gMCkKKwkJcmV0dXJuIDA7CisKKyNpZm5kZWYgTk9fSU9fQ0FDSEUKKwlyZXR2YWwgPSBmbHVzaF9jYWNoZWRfYmxvY2tzKGNoYW5uZWwsIGRhdGEsIDApOworI2VuZGlmCisKKwlpZiAoY2xvc2UoZGF0YS0+ZGV2KSA8IDApCisJCXJldHZhbCA9IGVycm5vOworCWZyZWVfY2FjaGUoZGF0YSk7CisKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwtPnByaXZhdGVfZGF0YSk7CisJZXh0MmZzX2ZyZWVfbWVtKCZjaGFubmVsLT5uYW1lKTsKKwlleHQyZnNfZnJlZV9tZW0oJmNoYW5uZWwpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9zZXRfYmxrc2l6ZShpb19jaGFubmVsIGNoYW5uZWwsIGludCBibGtzaXplKQoreworCXN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqZGF0YTsKKwllcnJjb2RlX3QJCXJldHZhbDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX1VOSVhfSU9fQ0hBTk5FTCk7CisKKwlpZiAoY2hhbm5lbC0+YmxvY2tfc2l6ZSAhPSBibGtzaXplKSB7CisjaWZuZGVmIE5PX0lPX0NBQ0hFCisJCWlmICgocmV0dmFsID0gZmx1c2hfY2FjaGVkX2Jsb2NrcyhjaGFubmVsLCBkYXRhLCAwKSkpCisJCQlyZXR1cm4gcmV0dmFsOworI2VuZGlmCisKKwkJY2hhbm5lbC0+YmxvY2tfc2l6ZSA9IGJsa3NpemU7CisJCWZyZWVfY2FjaGUoZGF0YSk7CisJCWlmICgocmV0dmFsID0gYWxsb2NfY2FjaGUoY2hhbm5lbCwgZGF0YSkpKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGVycmNvZGVfdCB1bml4X3JlYWRfYmxrKGlvX2NoYW5uZWwgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJCSAgICAgICBpbnQgY291bnQsIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGE7CisJc3RydWN0IHVuaXhfY2FjaGUgKmNhY2hlLCAqcmV1c2VbUkVBRF9ESVJFQ1RfU0laRV07CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyCQkqY3A7CisJaW50CQlpLCBqOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworI2lmZGVmIE5PX0lPX0NBQ0hFCisJcmV0dXJuIHJhd19yZWFkX2JsayhjaGFubmVsLCBkYXRhLCBibG9jaywgY291bnQsIGJ1Zik7CisjZWxzZQorCS8qCisJICogSWYgd2UncmUgZG9pbmcgYW4gb2RkLXNpemVkIHJlYWQgb3IgYSB2ZXJ5IGxhcmdlIHJlYWQsCisJICogZmx1c2ggb3V0IHRoZSBjYWNoZSBhbmQgdGhlbiBkbyBhIGRpcmVjdCByZWFkLgorCSAqLworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiBXUklURV9ESVJFQ1RfU0laRSkgeworCQlpZiAoKHJldHZhbCA9IGZsdXNoX2NhY2hlZF9ibG9ja3MoY2hhbm5lbCwgZGF0YSwgMCkpKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJcmV0dXJuIHJhd19yZWFkX2JsayhjaGFubmVsLCBkYXRhLCBibG9jaywgY291bnQsIGJ1Zik7CisJfQorCisJY3AgPSBidWY7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvKiBJZiBpdCdzIGluIHRoZSBjYWNoZSwgdXNlIGl0ISAqLworCQlpZiAoKGNhY2hlID0gZmluZF9jYWNoZWRfYmxvY2soZGF0YSwgYmxvY2ssICZyZXVzZVswXSkpKSB7CisjaWZkZWYgREVCVUcKKwkJCXByaW50ZigiVXNpbmcgY2FjaGVkIGJsb2NrICVkXG4iLCBibG9jayk7CisjZW5kaWYKKwkJCW1lbWNweShjcCwgY2FjaGUtPmJ1ZiwgY2hhbm5lbC0+YmxvY2tfc2l6ZSk7CisJCQljb3VudC0tOworCQkJYmxvY2srKzsKKwkJCWNwICs9IGNoYW5uZWwtPmJsb2NrX3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBGaW5kIHRoZSBudW1iZXIgb2YgdW5jYWNoZWQgYmxvY2tzIHNvIHdlIGNhbiBkbyBhCisJCSAqIHNpbmdsZSByZWFkIHJlcXVlc3QKKwkJICovCisJCWZvciAoaT0xOyBpIDwgY291bnQ7IGkrKykKKwkJCWlmIChmaW5kX2NhY2hlZF9ibG9jayhkYXRhLCBibG9jaytpLCAmcmV1c2VbaV0pKQorCQkJCWJyZWFrOworI2lmZGVmIERFQlVHCisJCXByaW50ZigiUmVhZGluZyAlZCBibG9ja3Mgc3RhcnRpbmcgYXQgJWRcbiIsIGksIGJsb2NrKTsKKyNlbmRpZgorCQlpZiAoKHJldHZhbCA9IHJhd19yZWFkX2JsayhjaGFubmVsLCBkYXRhLCBibG9jaywgaSwgY3ApKSkKKwkJCXJldHVybiByZXR2YWw7CisKKwkJLyogU2F2ZSB0aGUgcmVzdWx0cyBpbiB0aGUgY2FjaGUgKi8KKwkJZm9yIChqPTA7IGogPCBpOyBqKyspIHsKKwkJCWNvdW50LS07CisJCQljYWNoZSA9IHJldXNlW2pdOworCQkJcmV1c2VfY2FjaGUoY2hhbm5lbCwgZGF0YSwgY2FjaGUsIGJsb2NrKyspOworCQkJbWVtY3B5KGNhY2hlLT5idWYsIGNwLCBjaGFubmVsLT5ibG9ja19zaXplKTsKKwkJCWNwICs9IGNoYW5uZWwtPmJsb2NrX3NpemU7CisJCX0KKwl9CisJcmV0dXJuIDA7CisjZW5kaWYgLyogTk9fSU9fQ0FDSEUgKi8KK30KKworc3RhdGljIGVycmNvZGVfdCB1bml4X3dyaXRlX2Jsayhpb19jaGFubmVsIGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYmxvY2ssCisJCQkJaW50IGNvdW50LCBjb25zdCB2b2lkICpidWYpCit7CisJc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhOworCXN0cnVjdCB1bml4X2NhY2hlICpjYWNoZSwgKnJldXNlOworCWVycmNvZGVfdAlyZXR2YWwgPSAwOworCWNvbnN0IGNoYXIJKmNwOworCWludAkJd3JpdGV0aHJvdWdoOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworI2lmZGVmIE5PX0lPX0NBQ0hFCisJcmV0dXJuIHJhd193cml0ZV9ibGsoY2hhbm5lbCwgZGF0YSwgYmxvY2ssIGNvdW50LCBidWYpOworI2Vsc2UKKwkvKgorCSAqIElmIHdlJ3JlIGRvaW5nIGFuIG9kZC1zaXplZCB3cml0ZSBvciBhIHZlcnkgbGFyZ2Ugd3JpdGUsCisJICogZmx1c2ggb3V0IHRoZSBjYWNoZSBjb21wbGV0ZWx5IGFuZCB0aGVuIGRvIGEgZGlyZWN0IHdyaXRlLgorCSAqLworCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiBXUklURV9ESVJFQ1RfU0laRSkgeworCQlpZiAoKHJldHZhbCA9IGZsdXNoX2NhY2hlZF9ibG9ja3MoY2hhbm5lbCwgZGF0YSwgMSkpKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJcmV0dXJuIHJhd193cml0ZV9ibGsoY2hhbm5lbCwgZGF0YSwgYmxvY2ssIGNvdW50LCBidWYpOworCX0KKworCS8qCisJICogRm9yIGEgbW9kZXJhdGUtc2l6ZWQgbXVsdGktYmxvY2sgd3JpdGUsIGZpcnN0IGZvcmNlIGEgd3JpdGUKKwkgKiBpZiB3ZSdyZSBpbiB3cml0ZS10aHJvdWdoIGNhY2hlIG1vZGUsIGFuZCB0aGVuIGZpbGwgdGhlCisJICogY2FjaGUgd2l0aCB0aGUgYmxvY2tzLgorCSAqLworCXdyaXRldGhyb3VnaCA9IGNoYW5uZWwtPmZsYWdzICYgQ0hBTk5FTF9GTEFHU19XUklURVRIUk9VR0g7CisJaWYgKHdyaXRldGhyb3VnaCkKKwkJcmV0dmFsID0gcmF3X3dyaXRlX2JsayhjaGFubmVsLCBkYXRhLCBibG9jaywgY291bnQsIGJ1Zik7CisKKwljcCA9IGJ1ZjsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWNhY2hlID0gZmluZF9jYWNoZWRfYmxvY2soZGF0YSwgYmxvY2ssICZyZXVzZSk7CisJCWlmICghY2FjaGUpIHsKKwkJCWNhY2hlID0gcmV1c2U7CisJCQlyZXVzZV9jYWNoZShjaGFubmVsLCBkYXRhLCBjYWNoZSwgYmxvY2spOworCQl9CisJCW1lbWNweShjYWNoZS0+YnVmLCBjcCwgY2hhbm5lbC0+YmxvY2tfc2l6ZSk7CisJCWNhY2hlLT5kaXJ0eSA9ICF3cml0ZXRocm91Z2g7CisJCWNvdW50LS07CisJCWJsb2NrKys7CisJCWNwICs9IGNoYW5uZWwtPmJsb2NrX3NpemU7CisJfQorCXJldHVybiByZXR2YWw7CisjZW5kaWYgLyogTk9fSU9fQ0FDSEUgKi8KK30KKworc3RhdGljIGVycmNvZGVfdCB1bml4X3dyaXRlX2J5dGUoaW9fY2hhbm5lbCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgaW50IHNpemUsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgdW5peF9wcml2YXRlX2RhdGEgKmRhdGE7CisJZXJyY29kZV90CXJldHZhbCA9IDA7CisJc3NpemVfdAkJYWN0dWFsOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworI2lmbmRlZiBOT19JT19DQUNIRQorCS8qCisJICogRmx1c2ggb3V0IHRoZSBjYWNoZSBjb21wbGV0ZWx5CisJICovCisJaWYgKChyZXR2YWwgPSBmbHVzaF9jYWNoZWRfYmxvY2tzKGNoYW5uZWwsIGRhdGEsIDEpKSkKKwkJcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorCisJaWYgKGxzZWVrKGRhdGEtPmRldiwgb2Zmc2V0ICsgZGF0YS0+b2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQorCQlyZXR1cm4gZXJybm87CisKKwlhY3R1YWwgPSB3cml0ZShkYXRhLT5kZXYsIGJ1Ziwgc2l6ZSk7CisJaWYgKGFjdHVhbCAhPSBzaXplKQorCQlyZXR1cm4gRVhUMl9FVF9TSE9SVF9XUklURTsKKworCXJldHVybiAwOworfQorCisvKgorICogRmx1c2ggZGF0YSBidWZmZXJzIHRvIGRpc2suCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9mbHVzaChpb19jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhOworCWVycmNvZGVfdCByZXR2YWwgPSAwOworCisJRVhUMl9DSEVDS19NQUdJQyhjaGFubmVsLCBFWFQyX0VUX01BR0lDX0lPX0NIQU5ORUwpOworCWRhdGEgPSAoc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICopIGNoYW5uZWwtPnByaXZhdGVfZGF0YTsKKwlFWFQyX0NIRUNLX01BR0lDKGRhdGEsIEVYVDJfRVRfTUFHSUNfVU5JWF9JT19DSEFOTkVMKTsKKworI2lmbmRlZiBOT19JT19DQUNIRQorCXJldHZhbCA9IGZsdXNoX2NhY2hlZF9ibG9ja3MoY2hhbm5lbCwgZGF0YSwgMCk7CisjZW5kaWYKKwlmc3luYyhkYXRhLT5kZXYpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBlcnJjb2RlX3QgdW5peF9zZXRfb3B0aW9uKGlvX2NoYW5uZWwgY2hhbm5lbCwgY29uc3QgY2hhciAqb3B0aW9uLAorCQkJCSBjb25zdCBjaGFyICphcmcpCit7CisJc3RydWN0IHVuaXhfcHJpdmF0ZV9kYXRhICpkYXRhOworCXVuc2lnbmVkIGxvbmcgdG1wOworCWNoYXIgKmVuZDsKKworCUVYVDJfQ0hFQ0tfTUFHSUMoY2hhbm5lbCwgRVhUMl9FVF9NQUdJQ19JT19DSEFOTkVMKTsKKwlkYXRhID0gKHN0cnVjdCB1bml4X3ByaXZhdGVfZGF0YSAqKSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CisJRVhUMl9DSEVDS19NQUdJQyhkYXRhLCBFWFQyX0VUX01BR0lDX1VOSVhfSU9fQ0hBTk5FTCk7CisKKwlpZiAoIXN0cmNtcChvcHRpb24sICJvZmZzZXQiKSkgeworCQlpZiAoIWFyZykKKwkJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwkJdG1wID0gc3RydG91bChhcmcsICZlbmQsIDApOworCQlpZiAoKmVuZCkKKwkJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisJCWRhdGEtPm9mZnNldCA9IHRtcDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdW5saW5rLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdW5saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhOWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy91bmxpbmsuYwpAQCAtMCwwICsxLDk5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bmxpbmsuYyAtLS0gZGVsZXRlIGxpbmtzIGluIGEgZXh0MmZzIGRpcmVjdG9yeQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKK3N0cnVjdCBsaW5rX3N0cnVjdCAgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJaW50CQluYW1lbGVuOworCWV4dDJfaW5vX3QJaW5vZGU7CisJaW50CQlmbGFnczsKKwlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkgKnByZXY7CisJaW50CQlkb25lOworfTsKKworI2lmZGVmIF9fVFVSQk9DX18KKyMgcHJhZ21hIGFyZ3N1c2VkCisjZW5kaWYKK3N0YXRpYyBpbnQgdW5saW5rX3Byb2Moc3RydWN0IGV4dDJfZGlyX2VudHJ5ICpkaXJlbnQsCisJCSAgICAgaW50CW9mZnNldCBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCSAgICAgaW50CWJsb2Nrc2l6ZSBFWFQyRlNfQVRUUigodW51c2VkKSksCisJCSAgICAgY2hhcgkqYnVmIEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJICAgICB2b2lkCSpwcml2X2RhdGEpCit7CisJc3RydWN0IGxpbmtfc3RydWN0ICpscyA9IChzdHJ1Y3QgbGlua19zdHJ1Y3QgKikgcHJpdl9kYXRhOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqcHJldjsKKworCXByZXYgPSBscy0+cHJldjsKKwlscy0+cHJldiA9IGRpcmVudDsKKworCWlmIChscy0+bmFtZSkgeworCQlpZiAoKGRpcmVudC0+bmFtZV9sZW4gJiAweEZGKSAhPSBscy0+bmFtZWxlbikKKwkJCXJldHVybiAwOworCQlpZiAoc3RybmNtcChscy0+bmFtZSwgZGlyZW50LT5uYW1lLCBkaXJlbnQtPm5hbWVfbGVuICYgMHhGRikpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxzLT5pbm9kZSkgeworCQlpZiAoZGlyZW50LT5pbm9kZSAhPSBscy0+aW5vZGUpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoIWRpcmVudC0+aW5vZGUpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocHJldikKKwkJcHJldi0+cmVjX2xlbiArPSBkaXJlbnQtPnJlY19sZW47CisJZWxzZQorCQlkaXJlbnQtPmlub2RlID0gMDsKKwlscy0+ZG9uZSsrOworCXJldHVybiBESVJFTlRfQUJPUlR8RElSRU5UX0NIQU5HRUQ7Cit9CisKKyNpZmRlZiBfX1RVUkJPQ19fCisgI3ByYWdtYSBhcmdzdXNlZAorI2VuZGlmCitlcnJjb2RlX3QgZXh0MmZzX3VubGluayhleHQyX2ZpbHN5cyBmcywgZXh0Ml9pbm9fdCBkaXIsCisJCQljb25zdCBjaGFyICpuYW1lLCBleHQyX2lub190IGlubywKKwkJCWludCBmbGFncyBFWFQyRlNfQVRUUigodW51c2VkKSkpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlzdHJ1Y3QgbGlua19zdHJ1Y3QgbHM7CisKKwlFWFQyX0NIRUNLX01BR0lDKGZzLCBFWFQyX0VUX01BR0lDX0VYVDJGU19GSUxTWVMpOworCisJaWYgKCFuYW1lICYmICFpbm8pCisJCXJldHVybiBFWFQyX0VUX0lOVkFMSURfQVJHVU1FTlQ7CisKKwlpZiAoIShmcy0+ZmxhZ3MgJiBFWFQyX0ZMQUdfUlcpKQorCQlyZXR1cm4gRVhUMl9FVF9ST19GSUxTWVM7CisKKwlscy5uYW1lID0gbmFtZTsKKwlscy5uYW1lbGVuID0gbmFtZSA/IHN0cmxlbihuYW1lKSA6IDA7CisJbHMuaW5vZGUgPSBpbm87CisJbHMuZmxhZ3MgPSAwOworCWxzLmRvbmUgPSAwOworCWxzLnByZXYgPSAwOworCisJcmV0dmFsID0gZXh0MmZzX2Rpcl9pdGVyYXRlKGZzLCBkaXIsIERJUkVOVF9GTEFHX0lOQ0xVREVfRU1QVFksCisJCQkJICAgIDAsIHVubGlua19wcm9jLCAmbHMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gKGxzLmRvbmUpID8gMCA6IEVYVDJfRVRfRElSX05PX1NQQUNFOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3ZhbGlkX2Jsay5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3ZhbGlkX2Jsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDc3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdmFsaWRfYmxrLmMKQEAgLTAsMCArMSw1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdmFsaWRfYmxrLmMgLS0tIGRvZXMgdGhlIGlub2RlIGhhdmUgdmFsaWQgYmxvY2tzPworICoKKyAqIENvcHlyaWdodCAxOTk3IGJ5IFRoZW9kb3JlIFRzJ28KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0MmZzLmgiCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiB0aGUgaW5vZGUncyBibG9jayBlbnRyaWVzIGFjdHVhbGx5CisgKiBjb250YWluIGJsb2NrIGVudHJpZXMuCisgKi8KK2ludCBleHQyZnNfaW5vZGVfaGFzX3ZhbGlkX2Jsb2NrcyhzdHJ1Y3QgZXh0Ml9pbm9kZSAqaW5vZGUpCit7CisJLyoKKwkgKiBPbmx5IGRpcmVjdG9yaWVzLCByZWd1bGFyIGZpbGVzLCBhbmQgc29tZSBzeW1ib2xpYyBsaW5rcworCSAqIGhhdmUgdmFsaWQgYmxvY2sgZW50cmllcy4KKwkgKi8KKwlpZiAoIUxJTlVYX1NfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIUxJTlVYX1NfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgIUxJTlVYX1NfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgc3ltYm9saWMgbGluayBpcyBhICJmYXN0IHN5bWxpbmsiLCB0aGVuIHRoZSBzeW1saW5rCisJICogdGFyZ2V0IGlzIHN0b3JlZCBpbiB0aGUgYmxvY2sgZW50cmllcy4KKwkgKi8KKwlpZiAoTElOVVhfU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKGlub2RlLT5pX2ZpbGVfYWNsID09IDApIHsKKwkJCS8qIFdpdGggbm8gRUEgYmxvY2ssIHdlIGNhbiByZWx5IG9uIGlfYmxvY2tzICovCisJCQlpZiAoaW5vZGUtPmlfYmxvY2tzID09IDApCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKiBXaXRoIGFuIEVBIGJsb2NrLCBsaWZlIGdldHMgbW9yZSB0cmlja3kgKi8KKwkJCWlmIChpbm9kZS0+aV9zaXplID49IEVYVDJfTl9CTE9DS1MqNCkKKwkJCQlyZXR1cm4gMTsgLyogZGVmaW5pdGVseSB1c2luZyBpX2Jsb2NrW10gKi8KKwkJCWlmIChpbm9kZS0+aV9zaXplID4gNCAmJiBpbm9kZS0+aV9ibG9ja1sxXSA9PSAwKQorCQkJCXJldHVybiAxOyAvKiBkZWZpbml0ZWx5IHVzaW5nIGlfYmxvY2tbXSAqLworCQkJcmV0dXJuIDA7IC8qIFByb2JhYmx5IGEgZmFzdCBzeW1saW5rICovCisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvdmVyc2lvbi5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk4MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3ZlcnNpb24uYwpAQCAtMCwwICsxLDUxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB2ZXJzaW9uLmMgLS0tIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgZXh0MiBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiZXh0Ml9mcy5oIgorI2luY2x1ZGUgImV4dDJmcy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbGliX3ZlcnNpb24gPSBFMkZTUFJPR1NfVkVSU0lPTjsKK3N0YXRpYyBjb25zdCBjaGFyICpsaWJfZGF0ZSA9IEUyRlNQUk9HU19EQVRFOworCitpbnQgZXh0MmZzX3BhcnNlX3ZlcnNpb25fc3RyaW5nKGNvbnN0IGNoYXIgKnZlcl9zdHJpbmcpCit7CisJY29uc3QgY2hhciAqY3A7CisJaW50IHZlcnNpb24gPSAwOworCisJZm9yIChjcCA9IHZlcl9zdHJpbmc7ICpjcDsgY3ArKykgeworCQlpZiAoKmNwID09ICcuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlzZGlnaXQoKmNwKSkKKwkJCWJyZWFrOworCQl2ZXJzaW9uID0gKHZlcnNpb24gKiAxMCkgKyAoKmNwIC0gJzAnKTsKKwl9CisJcmV0dXJuIHZlcnNpb247Cit9CisKKworaW50IGV4dDJmc19nZXRfbGlicmFyeV92ZXJzaW9uKGNvbnN0IGNoYXIgKip2ZXJfc3RyaW5nLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKipkYXRlX3N0cmluZykKK3sKKwlpZiAodmVyX3N0cmluZykKKwkJKnZlcl9zdHJpbmcgPSBsaWJfdmVyc2lvbjsKKwlpZiAoZGF0ZV9zdHJpbmcpCisJCSpkYXRlX3N0cmluZyA9IGxpYl9kYXRlOworCisJcmV0dXJuIGV4dDJmc19wYXJzZV92ZXJzaW9uX3N0cmluZyhsaWJfdmVyc2lvbik7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9leHQyZnMvd3JpdGVfYmJfZmlsZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3dyaXRlX2JiX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjE5ZWVmCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL3dyaXRlX2JiX2ZpbGUuYwpAQCAtMCwwICsxLDM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3cml0ZV9iYl9maWxlLmMgLS0tIHdyaXRlIGEgbGlzdCBvZiBiYWQgYmxvY2tzIHRvIGEgRklMRSAqCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImV4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMuaCIKKworZXJyY29kZV90IGV4dDJmc193cml0ZV9iYl9GSUxFKGV4dDJfYmFkYmxvY2tzX2xpc3QgYmJfbGlzdCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgRVhUMkZTX0FUVFIoKHVudXNlZCkpLAorCQkJICAgICAgIEZJTEUgKmYpCit7CisJYmFkYmxvY2tzX2l0ZXJhdGUJYmJfaXRlcjsKKwlibGtfdAkJCWJsazsKKwllcnJjb2RlX3QJCXJldHZhbDsKKworCXJldHZhbCA9IGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlX2JlZ2luKGJiX2xpc3QsICZiYl9pdGVyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJd2hpbGUgKGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlKGJiX2l0ZXIsICZibGspKSB7CisJCWZwcmludGYoZiwgIiVkXG4iLCBibGspOworCX0KKwlleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9lbmQoYmJfaXRlcik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9mc2NrLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9mc2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwNzQzYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2ZzY2suYwpAQCAtMCwwICsxLDEzNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBmc2NrIC0tLSBBIGdlbmVyaWMsIHBhcmFsbGVsaXppbmcgZnJvbnQtZW5kIGZvciB0aGUgZnNjayBwcm9ncmFtLgorICogSXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBydW4gZnNjayBwcm9ncmFtcyBpbiBwYXJhbGxlbCBpZiB0aGUKKyAqIGRldmljZXMgYXJlIG9uIHNlcGFyYXRlIHNwaW5kbGVzLiAgSXQgaXMgYmFzZWQgb24gdGhlIHNhbWUgaWRlYXMgYXMKKyAqIHRoZSBnZW5lcmljIGZyb250IGVuZCBmb3IgZnNjayBieSBEYXZpZCBFbmdlbCBhbmQgRnJlZCB2YW4gS2VtcGVuLAorICogYnV0IGl0IGhhcyBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuIGZyb20gc2NyYXRjaCB0byBzdXBwb3J0CisgKiBwYXJhbGxlbCBleGVjdXRpb24uCisgKgorICogV3JpdHRlbiBieSBUaGVvZG9yZSBUcydvLCA8dHl0c29AbWl0LmVkdT4KKyAqCisgKiBNaXF1ZWwgdmFuIFNtb29yZW5idXJnIChtaXF1ZWxzQGRyaW5rZWwub3cub3JnKSAyMC1PY3QtMTk5NDoKKyAqICAgbyBDaGFuZ2VkIC10IGZzdHlwZSB0byBiZWhhdmUgbGlrZSB3aXRoIG1vdW50IHdoZW4gLUEgKGFsbCBmaWxlCisgKiAgICAgc3lzdGVtcykgb3IgLU0gKGxpa2UgbW91bnQpIGlzIHNwZWNpZmllZC4KKyAqICAgbyBmc2NrIGxvb2tzIGlmIGl0IGNhbiBmaW5kIHRoZSBmc2NrLnR5cGUgcHJvZ3JhbSB0byBkZWNpZGUKKyAqICAgICBpZiBpdCBzaG91bGQgaWdub3JlIHRoZSBmcyB0eXBlLiBUaGlzIHdheSBtb3JlIGZzY2sgcHJvZ3JhbXMKKyAqICAgICBjYW4gYmUgYWRkZWQgd2l0aG91dCBjaGFuZ2luZyB0aGlzIGZyb250LWVuZC4KKyAqICAgbyAtUiBmbGFnIHNraXAgcm9vdCBmaWxlIHN5c3RlbS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsCisgKiAgICAgIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgYnkgIFRoZW9kb3JlIFRzJ28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJmc2NrLmgiCisjaW5jbHVkZSAiYmxraWQvYmxraWQuaCIKKworI2luY2x1ZGUgImUyZnNiYi5oIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmbmRlZiBfUEFUSF9NTlRUQUIKKyNkZWZpbmUgX1BBVEhfTU5UVEFCICAgICIvZXRjL2ZzdGFiIgorI2VuZGlmCisKKy8qCisgKiBmc2NrLmgKKyAqLworCisjaWZuZGVmIERFRkFVTFRfRlNUWVBFCisjZGVmaW5lIERFRkFVTFRfRlNUWVBFCSJleHQyIgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0RFVklDRVMgMzIKKyNkZWZpbmUgTUFYX0FSR1MgMzIKKworLyoKKyAqIEludGVybmFsIHN0cnVjdHVyZSBmb3IgbW91bnQgdGFiZWwgZW50cmllcy4KKyAqLworCitzdHJ1Y3QgZnNfaW5mbyB7CisJY2hhciAgKmRldmljZTsKKwljaGFyICAqbW91bnRwdDsKKwljaGFyICAqdHlwZTsKKwljaGFyICAqb3B0czsKKwlpbnQgICBmcmVxOworCWludCAgIHBhc3NubzsKKwlpbnQgICBmbGFnczsKKwlzdHJ1Y3QgZnNfaW5mbyAqbmV4dDsKK307CisKKyNkZWZpbmUgRkxBR19ET05FIDEKKyNkZWZpbmUgRkxBR19QUk9HUkVTUyAyCisKKy8qCisgKiBTdHJ1Y3R1cmUgdG8gYWxsb3cgZXhpdCBjb2RlcyB0byBiZSBzdG9yZWQKKyAqLworc3RydWN0IGZzY2tfaW5zdGFuY2UgeworCWludAlwaWQ7CisJaW50CWZsYWdzOworCWludAlleGl0X3N0YXR1czsKKwl0aW1lX3QJc3RhcnRfdGltZTsKKwljaGFyICoJcHJvZzsKKwljaGFyICoJdHlwZTsKKwljaGFyICoJZGV2aWNlOworCWNoYXIgKgliYXNlX2RldmljZTsKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqbmV4dDsKK307CisKKy8qCisgKiBiYXNlX2RldmljZS5jCisgKgorICogUmV0dXJuIHRoZSAiYmFzZSBkZXZpY2UiIGdpdmVuIGEgcGFydGljdWxhciBkZXZpY2U7IHRoaXMgaXMgdXNlZCB0bworICogYXNzdXJlIHRoYXQgd2Ugb25seSBmc2NrIG9uZSBwYXJ0aXRpb24gb24gYSBwYXJ0aWN1bGFyIGRyaXZlIGF0IGFueQorICogb25lIHRpbWUuICBPdGhlcndpc2UsIHRoZSBkaXNrIGhlYWRzIHdpbGwgYmUgc2Vla2luZyBhbGwgb3ZlciB0aGUKKyAqIHBsYWNlLiAgSWYgdGhlIGJhc2UgZGV2aWNlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGUgYmFzZV9kZXZpY2UoKSBmdW5jdGlvbiByZXR1cm5zIGFuIGFsbG9jYXRlZCBzdHJpbmcgd2hpY2ggbXVzdAorICogYmUgZnJlZWQuCisgKgorICovCisKKworI2lmZGVmIENPTkZJR19GRUFUVVJFX0RFVkZTCisvKgorICogUmVxdWlyZWQgZm9yIHRoZSB1YmVyLXNpbGx5IGRldmZzIC9kZXYvaWRlL2hvc3QxL2J1czIvdGFyZ2V0My9sdW4zCisgKiBwYXRoYW1lcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRldmZzX2hpZXJbXSA9IHsKKwkiaG9zdCIsICJidXMiLCAidGFyZ2V0IiwgImx1biIsIDAKK307CisjZW5kaWYKKworc3RhdGljIGNoYXIgKmJhc2VfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwljaGFyICpzdHIsICpjcDsKKyNpZmRlZiBDT05GSUdfRkVBVFVSRV9ERVZGUworCWNvbnN0IGNoYXIgKmNvbnN0ICpoaWVyOworCWNvbnN0IGNoYXIgKmRpc2s7CisJaW50IGxlbjsKKyNlbmRpZgorCisJY3AgPSBzdHIgPSB4c3RyZHVwKGRldmljZSk7CisKKwkvKiBTa2lwIG92ZXIgL2Rldi87IGlmIGl0J3Mgbm90IHByZXNlbnQsIGdpdmUgdXAuICovCisJaWYgKHN0cm5jbXAoY3AsICIvZGV2LyIsIDUpICE9IDApCisJCWdvdG8gZXJyb3V0OworCWNwICs9IDU7CisKKwkvKgorCSAqIEZvciBtZCBkZXZpY2VzLCB3ZSB0cmVhdCB0aGVtIGFsbCBhcyBpZiB0aGV5IHdlcmUgYWxsCisJICogb24gb25lIGRpc2ssIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIHBhcmFsbGVsaXplIHRoZW0uCisJICovCisJaWYgKGNwWzBdID09ICdtJyAmJiBjcFsxXSA9PSAnZCcpIHsKKwkJKihjcCsyKSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogSGFuZGxlIERBQyA5NjAgZGV2aWNlcyAqLworCWlmIChzdHJuY21wKGNwLCAicmQvIiwgMykgPT0gMCkgeworCQljcCArPSAzOworCQlpZiAoY3BbMF0gIT0gJ2MnIHx8IGNwWzJdICE9ICdkJyB8fAorCQkgICAgIWlzZGlnaXQoY3BbMV0pIHx8ICFpc2RpZ2l0KGNwWzNdKSkKKwkJCWdvdG8gZXJyb3V0OworCQkqKGNwKzQpID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwkvKiBOb3cgbGV0J3MgaGFuZGxlIC9kZXYvaGQqIGFuZCAvZGV2L3NkKiBkZXZpY2VzLi4uLiAqLworCWlmICgoY3BbMF0gPT0gJ2gnIHx8IGNwWzBdID09ICdzJykgJiYgKGNwWzFdID09ICdkJykpIHsKKwkJY3AgKz0gMjsKKwkJLyogSWYgdGhlcmUncyBhIHNpbmdsZSBudW1iZXIgYWZ0ZXIgL2Rldi9oZCwgc2tpcCBpdCAqLworCQlpZiAoaXNkaWdpdCgqY3ApKQorCQkJY3ArKzsKKwkJLyogV2hhdCBmb2xsb3dzIG11c3QgYmUgYW4gYWxwaGEgY2hhciwgb3IgZ2l2ZSB1cCAqLworCQlpZiAoIWlzYWxwaGEoKmNwKSkKKwkJCWdvdG8gZXJyb3V0OworCQkqKGNwICsgMSkgPSAwOworCQlyZXR1cm4gc3RyOworCX0KKworI2lmZGVmIENPTkZJR19GRUFUVVJFX0RFVkZTCisJLyogTm93IGxldCdzIGhhbmRsZSBkZXZmcyAodWdoKSBuYW1lcyAqLworCWxlbiA9IDA7CisJaWYgKHN0cm5jbXAoY3AsICJpZGUvIiwgNCkgPT0gMCkKKwkJbGVuID0gNDsKKwlpZiAoc3RybmNtcChjcCwgInNjc2kvIiwgNSkgPT0gMCkKKwkJbGVuID0gNTsKKwlpZiAobGVuKSB7CisJCWNwICs9IGxlbjsKKwkJLyoKKwkJICogTm93IHdlIHByb2NlZWQgZG93biB0aGUgZXhwZWN0ZWQgZGV2ZnMgaGllcmFyY2h5LgorCQkgKiBpLmUuLCAuLi4vaG9zdDEvYnVzMi90YXJnZXQzL2x1bjQvLi4uCisJCSAqIElmIHdlIGRvbid0IGZpbmQgdGhlIGV4cGVjdGVkIHRva2VuLCBmb2xsb3dlZCBieQorCQkgKiBzb21lIG51bWJlciBvZiBkaWdpdHMgYXQgZWFjaCBsZXZlbCwgYWJvcnQuCisJCSAqLworCQlmb3IgKGhpZXIgPSBkZXZmc19oaWVyOyAqaGllcjsgaGllcisrKSB7CisJCQlsZW4gPSBzdHJsZW4oKmhpZXIpOworCQkJaWYgKHN0cm5jbXAoY3AsICpoaWVyLCBsZW4pICE9IDApCisJCQkJZ290byBlcnJvdXQ7CisJCQljcCArPSBsZW47CisJCQl3aGlsZSAoKmNwICE9ICcvJyAmJiAqY3AgIT0gMCkgeworCQkJCWlmICghaXNkaWdpdCgqY3ApKQorCQkJCQlnb3RvIGVycm91dDsKKwkJCQljcCsrOworCQkJfQorCQkJY3ArKzsKKwkJfQorCQkqKGNwIC0gMSkgPSAwOworCQlyZXR1cm4gc3RyOworCX0KKworCS8qIE5vdyBoYW5kbGUgZGV2ZnMgL2Rldi9kaXNjIG9yIC9kZXYvZGlzayBuYW1lcyAqLworCWRpc2sgPSAwOworCWlmIChzdHJuY21wKGNwLCAiZGlzY3MvIiwgNikgPT0gMCkKKwkJZGlzayA9ICJkaXNjIjsKKwllbHNlIGlmIChzdHJuY21wKGNwLCAiZGlza3MvIiwgNikgPT0gMCkKKwkJZGlzayA9ICJkaXNrIjsKKwlpZiAoZGlzaykgeworCQljcCArPSA2OworCQlpZiAoc3RybmNtcChjcCwgZGlzaywgNCkgIT0gMCkKKwkJCWdvdG8gZXJyb3V0OworCQljcCArPSA0OworCQl3aGlsZSAoKmNwICE9ICcvJyAmJiAqY3AgIT0gMCkgeworCQkJaWYgKCFpc2RpZ2l0KCpjcCkpCisJCQkJZ290byBlcnJvdXQ7CisJCQljcCsrOworCQl9CisJCSpjcCA9IDA7CisJCXJldHVybiBzdHI7CisJfQorI2VuZGlmCisKK2Vycm91dDoKKwlmcmVlKHN0cik7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGlnbm9yZWRfdHlwZXNbXSA9IHsKKwkiaWdub3JlIiwKKwkiaXNvOTY2MCIsCisJIm5mcyIsCisJInByb2MiLAorCSJzdyIsCisJInN3YXAiLAorCSJ0bXBmcyIsCisJImRldnB0cyIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlYWxseV93YW50ZWRbXSA9IHsKKwkibWluaXgiLAorCSJleHQyIiwKKwkiZXh0MyIsCisJImpmcyIsCisJInJlaXNlcmZzIiwKKwkieGlhZnMiLAorCSJ4ZnMiLAorCU5VTEwKK307CisKKyNkZWZpbmUgQkFTRV9NRCAiL2Rldi9tZCIKKworLyoKKyAqIEdsb2JhbCB2YXJpYWJsZXMgZm9yIG9wdGlvbnMKKyAqLworc3RhdGljIGNoYXIgKmRldmljZXNbTUFYX0RFVklDRVNdOworc3RhdGljIGNoYXIgKmFyZ3NbTUFYX0FSR1NdOworc3RhdGljIGludCBudW1fZGV2aWNlcywgbnVtX2FyZ3M7CisKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgZG9hbGw7CitzdGF0aWMgaW50IG5vZXhlY3V0ZTsKK3N0YXRpYyBpbnQgc2VyaWFsaXplOworc3RhdGljIGludCBza2lwX3Jvb3Q7CitzdGF0aWMgaW50IGxpa2VfbW91bnQ7CitzdGF0aWMgaW50IG5vdGl0bGU7CitzdGF0aWMgaW50IHBhcmFsbGVsX3Jvb3Q7CitzdGF0aWMgaW50IHByb2dyZXNzOworc3RhdGljIGludCBwcm9ncmVzc19mZDsKK3N0YXRpYyBpbnQgZm9yY2VfYWxsX3BhcmFsbGVsOworc3RhdGljIGludCBudW1fcnVubmluZzsKK3N0YXRpYyBpbnQgbWF4X3J1bm5pbmc7CitzdGF0aWMgdm9sYXRpbGUgaW50IGNhbmNlbF9yZXF1ZXN0ZWQ7CitzdGF0aWMgaW50IGtpbGxfc2VudDsKK3N0YXRpYyBjaGFyICpmc3R5cGU7CitzdGF0aWMgc3RydWN0IGZzX2luZm8gKmZpbGVzeXNfaW5mbywgKmZpbGVzeXNfbGFzdDsKK3N0YXRpYyBzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdGFuY2VfbGlzdDsKK3N0YXRpYyBjaGFyICpmc2NrX3BhdGg7CitzdGF0aWMgYmxraWRfY2FjaGUgY2FjaGU7CisKK3N0YXRpYyBjaGFyICpzdHJpbmdfY29weShjb25zdCBjaGFyICpzKQoreworCWNoYXIgICAgKnJldDsKKworCWlmICghcykKKwkJcmV0dXJuIDA7CisJcmV0ID0geHN0cmR1cChzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0cmluZ190b19pbnQoY29uc3QgY2hhciAqcykKK3sKKwlsb25nIGw7CisJY2hhciAqcDsKKworCWwgPSBzdHJ0b2wocywgJnAsIDApOworCWlmICgqcCB8fCBsID09IExPTkdfTUlOIHx8IGwgPT0gTE9OR19NQVggfHwgbCA8IDAgfHwgbCA+IElOVF9NQVgpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAoaW50KSBsOworfQorCitzdGF0aWMgY2hhciAqc2tpcF9vdmVyX2JsYW5rKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgaXNzcGFjZSgqY3ApKQorCQljcCsrOworCXJldHVybiBjcDsKK30KKworc3RhdGljIGNoYXIgKnNraXBfb3Zlcl93b3JkKGNoYXIgKmNwKQoreworCXdoaWxlICgqY3AgJiYgIWlzc3BhY2UoKmNwKSkKKwkJY3ArKzsKKwlyZXR1cm4gY3A7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmlwX2xpbmUoY2hhciAqbGluZSkKK3sKKwljaGFyICAgICpwOworCisJd2hpbGUgKCpsaW5lKSB7CisJCXAgPSBsaW5lICsgc3RybGVuKGxpbmUpIC0gMTsKKwkJaWYgKCgqcCA9PSAnXG4nKSB8fCAoKnAgPT0gJ1xyJykpCisJCQkqcCA9IDA7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNoYXIgKnBhcnNlX3dvcmQoY2hhciAqKmJ1ZikKK3sKKwljaGFyICp3b3JkLCAqbmV4dDsKKworCXdvcmQgPSAqYnVmOworCWlmICgqd29yZCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXdvcmQgPSBza2lwX292ZXJfYmxhbmsod29yZCk7CisJbmV4dCA9IHNraXBfb3Zlcl93b3JkKHdvcmQpOworCWlmICgqbmV4dCkKKwkJKm5leHQrKyA9IDA7CisJKmJ1ZiA9IG5leHQ7CisJcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2VzY2FwZShjaGFyICp3b3JkKQoreworCWNoYXIgICAgKnEsIGM7CisJY29uc3QgY2hhciAqcDsKKworCWlmICghd29yZCkKKwkJcmV0dXJuOworCisJc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXMod29yZCwgd29yZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaW5zdGFuY2Uoc3RydWN0IGZzY2tfaW5zdGFuY2UgKmkpCit7CisJaWYgKGktPnByb2cpCisJCWZyZWUoaS0+cHJvZyk7CisJaWYgKGktPmRldmljZSkKKwkJZnJlZShpLT5kZXZpY2UpOworCWlmIChpLT5iYXNlX2RldmljZSkKKwkJZnJlZShpLT5iYXNlX2RldmljZSk7CisJZnJlZShpKTsKK30KKworc3RhdGljIHN0cnVjdCBmc19pbmZvICpjcmVhdGVfZnNfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY29uc3QgY2hhciAqbW50cG50LAorCQkJCQljb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvcHRzLAorCQkJCQlpbnQgZnJlcSwgaW50IHBhc3NubykKK3sKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisKKwlmcyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmc19pbmZvKSk7CisKKwlmcy0+ZGV2aWNlID0gc3RyaW5nX2NvcHkoZGV2aWNlKTsKKwlmcy0+bW91bnRwdCA9IHN0cmluZ19jb3B5KG1udHBudCk7CisJZnMtPnR5cGUgPSBzdHJpbmdfY29weSh0eXBlKTsKKwlmcy0+b3B0cyA9IHN0cmluZ19jb3B5KG9wdHMgPyBvcHRzIDogIiIpOworCWZzLT5mcmVxID0gZnJlcTsKKwlmcy0+cGFzc25vID0gcGFzc25vOworCWZzLT5mbGFncyA9IDA7CisJZnMtPm5leHQgPSBOVUxMOworCisJaWYgKCFmaWxlc3lzX2luZm8pCisJCWZpbGVzeXNfaW5mbyA9IGZzOworCWVsc2UKKwkJZmlsZXN5c19sYXN0LT5uZXh0ID0gZnM7CisJZmlsZXN5c19sYXN0ID0gZnM7CisKKwlyZXR1cm4gZnM7Cit9CisKKworCitzdGF0aWMgaW50IHBhcnNlX2ZzdGFiX2xpbmUoY2hhciAqbGluZSwgc3RydWN0IGZzX2luZm8gKipyZXRfZnMpCit7CisJY2hhciAgICAqZGV2LCAqZGV2aWNlLCAqbW50cG50LCAqdHlwZSwgKm9wdHMsICpmcmVxLCAqcGFzc25vLCAqY3A7CisJc3RydWN0IGZzX2luZm8gKmZzOworCisJKnJldF9mcyA9IDA7CisJc3RyaXBfbGluZShsaW5lKTsKKwlpZiAoKGNwID0gc3RyY2hyKGxpbmUsICcjJykpKQorCQkqY3AgPSAwOyAgICAgICAgLyogSWdub3JlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGNvbW1lbnQgY2hhciAqLworCWNwID0gbGluZTsKKworCWRldmljZSA9IHBhcnNlX3dvcmQoJmNwKTsKKwltbnRwbnQgPSBwYXJzZV93b3JkKCZjcCk7CisJdHlwZSA9IHBhcnNlX3dvcmQoJmNwKTsKKwlvcHRzID0gcGFyc2Vfd29yZCgmY3ApOworCWZyZXEgPSBwYXJzZV93b3JkKCZjcCk7CisJcGFzc25vID0gcGFyc2Vfd29yZCgmY3ApOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAwOyAgICAgICAvKiBBbGxvdyBibGFuayBsaW5lcyAqLworCisJaWYgKCFtbnRwbnQgfHwgIXR5cGUpCisJCXJldHVybiAtMTsKKworCXBhcnNlX2VzY2FwZShkZXZpY2UpOworCXBhcnNlX2VzY2FwZShtbnRwbnQpOworCXBhcnNlX2VzY2FwZSh0eXBlKTsKKwlwYXJzZV9lc2NhcGUob3B0cyk7CisJcGFyc2VfZXNjYXBlKGZyZXEpOworCXBhcnNlX2VzY2FwZShwYXNzbm8pOworCisJZGV2ID0gYmxraWRfZ2V0X2Rldm5hbWUoY2FjaGUsIGRldmljZSwgTlVMTCk7CisJaWYgKGRldikKKwkJZGV2aWNlID0gZGV2OworCisJaWYgKHN0cmNocih0eXBlLCAnLCcpKQorCQl0eXBlID0gMDsKKworCWZzID0gY3JlYXRlX2ZzX2RldmljZShkZXZpY2UsIG1udHBudCwgdHlwZSA/IHR5cGUgOiAiYXV0byIsIG9wdHMsCisJCQkgICAgICBmcmVxID8gYXRvaShmcmVxKSA6IC0xLAorCQkJICAgICAgcGFzc25vID8gYXRvaShwYXNzbm8pIDogLTEpOworCWlmIChkZXYpCisJCWZyZWUoZGV2KTsKKworCWlmICghZnMpCisJCXJldHVybiAtMTsKKwkqcmV0X2ZzID0gZnM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVycHJldF90eXBlKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKwljaGFyICAgICp0OworCisJaWYgKHN0cmNtcChmcy0+dHlwZSwgImF1dG8iKSAhPSAwKQorCQlyZXR1cm47CisJdCA9IGJsa2lkX2dldF90YWdfdmFsdWUoY2FjaGUsICJUWVBFIiwgZnMtPmRldmljZSk7CisJaWYgKHQpIHsKKwkJZnJlZShmcy0+dHlwZSk7CisJCWZzLT50eXBlID0gdDsKKwl9Cit9CisKKy8qCisgKiBMb2FkIHRoZSBmaWxlc3lzdGVtIGRhdGFiYXNlIGZyb20gL2V0Yy9mc3RhYgorICovCitzdGF0aWMgdm9pZCBsb2FkX2ZzX2luZm8oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAgICAqZjsKKwljaGFyICAgIGJ1ZlsxMDI0XTsKKwlpbnQgICAgIGxpbmVubyA9IDA7CisJaW50ICAgICBvbGRfZnN0YWIgPSAxOworCXN0cnVjdCBmc19pbmZvICpmczsKKworCWlmICgoZiA9IGZvcGVuX29yX3dhcm4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoIWZlb2YoZikpIHsKKwkJbGluZW5vKys7CisJCWlmICghZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpCisJCQlicmVhazsKKwkJYnVmW3NpemVvZihidWYpLTFdID0gMDsKKwkJaWYgKHBhcnNlX2ZzdGFiX2xpbmUoYnVmLCAmZnMpIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnKCJXQVJOSU5HOiBiYWQgZm9ybWF0ICIKKwkJCQkib24gbGluZSAlZCBvZiAlc1xuIiwgbGluZW5vLCBmaWxlbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWZzKQorCQkJY29udGludWU7CisJCWlmIChmcy0+cGFzc25vIDwgMCkKKwkJCWZzLT5wYXNzbm8gPSAwOworCQllbHNlCisJCQlvbGRfZnN0YWIgPSAwOworCX0KKworCWZjbG9zZShmKTsKKworCWlmIChvbGRfZnN0YWIpIHsKKwkJZnB1dHMoIlwwMDdcMDA3XDAwNyIKKwkJIldBUk5JTkc6IFlvdXIgL2V0Yy9mc3RhYiBkb2VzIG5vdCBjb250YWluIHRoZSBmc2NrIHBhc3Nub1xuIgorCQkiICAgICAgIGZpZWxkLiAgSSB3aWxsIGtsdWRnZSBhcm91bmQgdGhpbmdzIGZvciB5b3UsIGJ1dCB5b3VcbiIKKwkJIiAgICAgICBzaG91bGQgZml4IHlvdXIgL2V0Yy9mc3RhYiBmaWxlIGFzIHNvb24gYXMgeW91IGNhbi5cblxuIiwgc3RkZXJyKTsKKworCQlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQkJZnMtPnBhc3NubyA9IDE7CisJCX0KKwl9Cit9CisKKy8qIExvb2t1cCBmaWxlc3lzIGluIC9ldGMvZnN0YWIgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBlbnRyeS4gKi8KK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyAqbG9va3VwKGNoYXIgKmZpbGVzeXMpCit7CisJc3RydWN0IGZzX2luZm8gKmZzOworCisJLyogTm8gZmlsZXN5cyBuYW1lIGdpdmVuLiAqLworCWlmIChmaWxlc3lzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAoZmlsZXN5cywgZnMtPmRldmljZSkgfHwKKwkJICAgIChmcy0+bW91bnRwdCAmJiAhc3RyY21wKGZpbGVzeXMsIGZzLT5tb3VudHB0KSkpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZnM7Cit9CisKKy8qIEZpbmQgZnNjayBwcm9ncmFtIGZvciBhIGdpdmVuIGZzIHR5cGUuICovCitzdGF0aWMgY2hhciAqZmluZF9mc2NrKGNoYXIgKnR5cGUpCit7CisJY2hhciAqczsKKwljb25zdCBjaGFyICp0cGw7CisJY2hhciAqcCA9IHN0cmluZ19jb3B5KGZzY2tfcGF0aCk7CisJc3RydWN0IHN0YXQgc3Q7CisKKwkvKiBBcmUgd2UgbG9va2luZyBmb3IgYSBwcm9ncmFtIG9yIGp1c3QgYSB0eXBlPyAqLworCXRwbCA9IChzdHJuY21wKHR5cGUsICJmc2NrLiIsIDUpID8gIiVzL2ZzY2suJXMiIDogIiVzLyVzIik7CisKKwlmb3IgKHMgPSBzdHJ0b2socCwgIjoiKTsgczsgcyA9IHN0cnRvayhOVUxMLCAiOiIpKSB7CisJCXMgPSB4YXNwcmludGYodHBsLCBzLCB0eXBlKTsKKwkJaWYgKHN0YXQocywgJnN0KSA9PSAwKSBicmVhazsKKwkJZnJlZShzKTsKKwl9CisJZnJlZShwKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIGludCBwcm9ncmVzc19hY3RpdmUodm9pZCkKK3sKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKworCWZvciAoaW5zdCA9IGluc3RhbmNlX2xpc3Q7IGluc3Q7IGluc3QgPSBpbnN0LT5uZXh0KSB7CisJCWlmIChpbnN0LT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5zdC0+ZmxhZ3MgJiBGTEFHX1BST0dSRVNTKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRXhlY3V0ZSBhIHBhcnRpY3VsYXIgZnNjayBwcm9ncmFtLCBhbmQgbGluayBpdCBpbnRvIHRoZSBsaXN0IG9mCisgKiBjaGlsZCBwcm9jZXNzZXMgd2UgYXJlIHdhaXRpbmcgZm9yLgorICovCitzdGF0aWMgaW50IGV4ZWN1dGUoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICptbnRwdCwKKwkJICAgaW50IGludGVyYWN0aXZlKQoreworCWNoYXIgKnMsICphcmd2WzgwXTsKKwljaGFyICpwcm9nOworCWludCAgYXJnYywgaTsKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdCwgKnA7CisJcGlkX3QgICBwaWQ7CisKKwlpbnN0ID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGZzY2tfaW5zdGFuY2UpKTsKKworCXByb2cgPSB4YXNwcmludGYoImZzY2suJXMiLCB0eXBlKTsKKwlhcmd2WzBdID0gcHJvZzsKKwlhcmdjID0gMTsKKworCWZvciAoaT0wOyBpIDxudW1fYXJnczsgaSsrKQorCQlhcmd2W2FyZ2MrK10gPSBzdHJpbmdfY29weShhcmdzW2ldKTsKKworCWlmIChwcm9ncmVzcyAmJiAhcHJvZ3Jlc3NfYWN0aXZlKCkpIHsKKwkJaWYgKChzdHJjbXAodHlwZSwgImV4dDIiKSA9PSAwKSB8fAorCQkgICAgKHN0cmNtcCh0eXBlLCAiZXh0MyIpID09IDApKSB7CisJCQljaGFyIHRtcFs4MF07CisJCQlzbnByaW50Zih0bXAsIDgwLCAiLUMlZCIsIHByb2dyZXNzX2ZkKTsKKwkJCWFyZ3ZbYXJnYysrXSA9IHN0cmluZ19jb3B5KHRtcCk7CisJCQlpbnN0LT5mbGFncyB8PSBGTEFHX1BST0dSRVNTOworCQl9CisJfQorCisJYXJndlthcmdjKytdID0gc3RyaW5nX2NvcHkoZGV2aWNlKTsKKwlhcmd2W2FyZ2NdID0gMDsKKworCXMgPSBmaW5kX2ZzY2socHJvZyk7CisJaWYgKHMgPT0gTlVMTCkgeworCQliYl9lcnJvcl9tc2coIiVzOiBub3QgZm91bmQiLCBwcm9nKTsKKwkJcmV0dXJuIEVOT0VOVDsKKwl9CisKKwlpZiAodmVyYm9zZSB8fCBub2V4ZWN1dGUpIHsKKwkJcHJpbnRmKCJbJXMgKCVkKSAtLSAlc10gIiwgcywgbnVtX3J1bm5pbmcsCisJCSAgICAgICBtbnRwdCA/IG1udHB0IDogZGV2aWNlKTsKKwkJZm9yIChpPTA7IGkgPCBhcmdjOyBpKyspCisJCQlwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworCS8qIEZvcmsgYW5kIGV4ZWN1dGUgdGhlIGNvcnJlY3QgcHJvZ3JhbS4gKi8KKwlpZiAobm9leGVjdXRlKQorCQlwaWQgPSAtMTsKKwllbHNlIGlmICgocGlkID0gZm9yaygpKSA8IDApIHsKKwkJcGVycm9yKCJ2Zm9yayIrMSk7CisJCXJldHVybiBlcnJubzsKKwl9IGVsc2UgaWYgKHBpZCA9PSAwKSB7CisJCWlmICghaW50ZXJhY3RpdmUpCisJCQljbG9zZSgwKTsKKwkJKHZvaWQpIGV4ZWN2KHMsIGFyZ3YpOworCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGFyZ3ZbMF0pOworCX0KKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisJCWZyZWUoYXJndltpXSk7CisKKwlmcmVlKHMpOworCWluc3QtPnBpZCA9IHBpZDsKKwlpbnN0LT5wcm9nID0gcHJvZzsKKwlpbnN0LT50eXBlID0gc3RyaW5nX2NvcHkodHlwZSk7CisJaW5zdC0+ZGV2aWNlID0gc3RyaW5nX2NvcHkoZGV2aWNlKTsKKwlpbnN0LT5iYXNlX2RldmljZSA9IGJhc2VfZGV2aWNlKGRldmljZSk7CisJaW5zdC0+c3RhcnRfdGltZSA9IHRpbWUoMCk7CisJaW5zdC0+bmV4dCA9IE5VTEw7CisKKwkvKgorCSAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgc28gd2UgYWRkIHRoZSBpbnN0YW5jZSBvbiBhdCB0aGUgZW5kLgorCSAqLworCWZvciAocCA9IGluc3RhbmNlX2xpc3Q7IHAgJiYgcC0+bmV4dDsgcCA9IHAtPm5leHQpOworCisJaWYgKHApCisJCXAtPm5leHQgPSBpbnN0OworCWVsc2UKKwkJaW5zdGFuY2VfbGlzdCA9IGluc3Q7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNlbmQgYSBzaWduYWwgdG8gYWxsIG91dHN0YW5kaW5nIGZzY2sgY2hpbGQgcHJvY2Vzc2VzCisgKi8KK3N0YXRpYyBpbnQga2lsbF9hbGwoaW50IHNpZ251bSkKK3sKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKwlpbnQgICAgIG4gPSAwOworCisJZm9yIChpbnN0ID0gaW5zdGFuY2VfbGlzdDsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKwkJaWYgKGluc3QtPmZsYWdzICYgRkxBR19ET05FKQorCQkJY29udGludWU7CisJCWtpbGwoaW5zdC0+cGlkLCBzaWdudW0pOworCQluKys7CisJfQorCXJldHVybiBuOworfQorCisvKgorICogV2FpdCBmb3Igb25lIGNoaWxkIHByb2Nlc3MgdG8gZXhpdDsgd2hlbiBpdCBkb2VzLCB1bmxpbmsgaXQgZnJvbQorICogdGhlIGxpc3Qgb2YgZXhlY3V0aW5nIGNoaWxkIHByb2Nlc3NlcywgYW5kIHJldHVybiBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBmc2NrX2luc3RhbmNlICp3YWl0X29uZShpbnQgZmxhZ3MpCit7CisJaW50ICAgICBzdGF0dXM7CisJaW50ICAgICBzaWc7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3QsICppbnN0MiwgKnByZXY7CisJcGlkX3QgICBwaWQ7CisKKwlpZiAoIWluc3RhbmNlX2xpc3QpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5vZXhlY3V0ZSkgeworCQlpbnN0ID0gaW5zdGFuY2VfbGlzdDsKKwkJcHJldiA9IDA7CisjaWZkZWYgUkFORE9NX0RFQlVHCisJCXdoaWxlIChpbnN0LT5uZXh0ICYmIChyYW5kb20oKSAmIDEpKSB7CisJCQlwcmV2ID0gaW5zdDsKKwkJCWluc3QgPSBpbnN0LT5uZXh0OworCQl9CisjZW5kaWYKKwkJaW5zdC0+ZXhpdF9zdGF0dXMgPSAwOworCQlnb3RvIHJldF9pbnN0OworCX0KKworCS8qCisJICogZ2NjIC1XYWxsIGZhaWxzIHNhdmluZyB0aHJvdyBhZ2FpbnN0IHN0dXBpZGl0eQorCSAqIChpbnN0IGFuZCBwcmV2IGFyZSB0aG91Z2h0IHRvIGJlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzKQorCSAqLworCWluc3QgPSBwcmV2ID0gTlVMTDsKKworCWRvIHsKKwkJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgZmxhZ3MpOworCQlpZiAoY2FuY2VsX3JlcXVlc3RlZCAmJiAha2lsbF9zZW50KSB7CisJCQlraWxsX2FsbChTSUdURVJNKTsKKwkJCWtpbGxfc2VudCsrOworCQl9CisJCWlmICgocGlkID09IDApICYmIChmbGFncyAmIFdOT0hBTkcpKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChwaWQgPCAwKSB7CisJCQlpZiAoKGVycm5vID09IEVJTlRSKSB8fCAoZXJybm8gPT0gRUFHQUlOKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChlcnJubyA9PSBFQ0hJTEQpIHsKKwkJCQliYl9lcnJvcl9tc2coIndhaXQ6IG5vIG1vcmUgY2hpbGQgcHJvY2Vzcz8hPyIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJcGVycm9yKCJ3YWl0Iik7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKHByZXYgPSAwLCBpbnN0ID0gaW5zdGFuY2VfbGlzdDsKKwkJICAgICBpbnN0OworCQkgICAgIHByZXYgPSBpbnN0LCBpbnN0ID0gaW5zdC0+bmV4dCkgeworCQkJaWYgKGluc3QtPnBpZCA9PSBwaWQpCisJCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghaW5zdCk7CisKKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCXN0YXR1cyA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgeworCQlzaWcgPSBXVEVSTVNJRyhzdGF0dXMpOworCQlpZiAoc2lnID09IFNJR0lOVCkgeworCQkJc3RhdHVzID0gRVhJVF9VTkNPUlJFQ1RFRDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiV2FybmluZy4uLiAlcyBmb3IgZGV2aWNlICVzIGV4aXRlZCAiCisJCQkgICAgICAgIndpdGggc2lnbmFsICVkLlxuIiwKKwkJCSAgICAgICBpbnN0LT5wcm9nLCBpbnN0LT5kZXZpY2UsIHNpZyk7CisJCQlzdGF0dXMgPSBFWElUX0VSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlcyAlczogc3RhdHVzIGlzICV4LCBzaG91bGQgbmV2ZXIgaGFwcGVuLlxuIiwKKwkJICAgICAgIGluc3QtPnByb2csIGluc3QtPmRldmljZSwgc3RhdHVzKTsKKwkJc3RhdHVzID0gRVhJVF9FUlJPUjsKKwl9CisJaW5zdC0+ZXhpdF9zdGF0dXMgPSBzdGF0dXM7CisJaWYgKHByb2dyZXNzICYmIChpbnN0LT5mbGFncyAmIEZMQUdfUFJPR1JFU1MpICYmCisJICAgICFwcm9ncmVzc19hY3RpdmUoKSkgeworCQlmb3IgKGluc3QyID0gaW5zdGFuY2VfbGlzdDsgaW5zdDI7IGluc3QyID0gaW5zdDItPm5leHQpIHsKKwkJCWlmIChpbnN0Mi0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQkJY29udGludWU7CisJCQlpZiAoc3RyY21wKGluc3QyLT50eXBlLCAiZXh0MiIpICYmCisJCQkgICAgc3RyY21wKGluc3QyLT50eXBlLCAiZXh0MyIpKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIElmIHdlJ3ZlIGp1c3Qgc3RhcnRlZCB0aGUgZnNjaywgd2FpdCBhIHRpbnkKKwkJCSAqIGJpdCBiZWZvcmUgc2VuZGluZyB0aGUga2lsbCwgdG8gZ2l2ZSBpdAorCQkJICogdGltZSB0byBzZXQgdXAgdGhlIHNpZ25hbCBoYW5kbGVyCisJCQkgKi8KKwkJCWlmIChpbnN0Mi0+c3RhcnRfdGltZSA8IHRpbWUoMCkrMikgeworCQkJCWlmIChmb3JrKCkgPT0gMCkgeworCQkJCQlzbGVlcCgxKTsKKwkJCQkJa2lsbChpbnN0Mi0+cGlkLCBTSUdVU1IxKTsKKwkJCQkJZXhpdCgwKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlraWxsKGluc3QyLT5waWQsIFNJR1VTUjEpOworCQkJaW5zdDItPmZsYWdzIHw9IEZMQUdfUFJPR1JFU1M7CisJCQlicmVhazsKKwkJfQorCX0KK3JldF9pbnN0OgorCWlmIChwcmV2KQorCQlwcmV2LT5uZXh0ID0gaW5zdC0+bmV4dDsKKwllbHNlCisJCWluc3RhbmNlX2xpc3QgPSBpbnN0LT5uZXh0OworCWlmICh2ZXJib3NlID4gMSkKKwkJcHJpbnRmKCJGaW5pc2hlZCB3aXRoICVzIChleGl0IHN0YXR1cyAlZClcbiIsCisJCSAgICAgICBpbnN0LT5kZXZpY2UsIGluc3QtPmV4aXRfc3RhdHVzKTsKKwludW1fcnVubmluZy0tOworCXJldHVybiBpbnN0OworfQorCisjZGVmaW5lIEZMQUdfV0FJVF9BTEwgICAgICAgICAgIDAKKyNkZWZpbmUgRkxBR19XQUlUX0FUTEVBU1RfT05FICAgMQorLyoKKyAqIFdhaXQgdW50aWwgYWxsIGV4ZWN1dGluZyBjaGlsZCBwcm9jZXNzZXMgaGF2ZSBleGl0ZWQ7IHJldHVybiB0aGUKKyAqIGxvZ2ljYWwgT1Igb2YgYWxsIG9mIHRoZWlyIGV4aXQgY29kZSB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9tYW55KGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKwlpbnQgICAgIGdsb2JhbF9zdGF0dXMgPSAwOworCWludCAgICAgd2FpdF9mbGFncyA9IDA7CisKKwl3aGlsZSAoKGluc3QgPSB3YWl0X29uZSh3YWl0X2ZsYWdzKSkpIHsKKwkJZ2xvYmFsX3N0YXR1cyB8PSBpbnN0LT5leGl0X3N0YXR1czsKKwkJZnJlZV9pbnN0YW5jZShpbnN0KTsKKyNpZmRlZiBSQU5ET01fREVCVUcKKwkJaWYgKG5vZXhlY3V0ZSAmJiAoZmxhZ3MgJiBXTk9IQU5HKSAmJiAhKHJhbmRvbSgpICUgMykpCisJCQlicmVhazsKKyNlbmRpZgorCQlpZiAoZmxhZ3MgJiBGTEFHX1dBSVRfQVRMRUFTVF9PTkUpCisJCQl3YWl0X2ZsYWdzID0gV05PSEFORzsKKwl9CisJcmV0dXJuIGdsb2JhbF9zdGF0dXM7Cit9CisKKy8qCisgKiBSdW4gdGhlIGZzY2sgcHJvZ3JhbSBvbiBhIHBhcnRpY3VsYXIgZGV2aWNlCisgKgorICogSWYgdGhlIHR5cGUgaXMgc3BlY2lmaWVkIHVzaW5nIC10LCBhbmQgaXQgaXNuJ3QgcHJlZml4ZWQgd2l0aCAibm8iCisgKiAoYXMgaW4gIm5vZXh0MiIpIGFuZCBvbmx5IG9uZSBmaWxlc3lzdGVtIHR5cGUgaXMgc3BlY2lmaWVkLCB0aGVuCisgKiB1c2UgdGhhdCB0eXBlIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpcyBzcGVjaWZpZWQgaW4gL2V0Yy9mc3RhYi4KKyAqCisgKiBJZiB0aGUgdHlwZSBpc24ndCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gdXNlIGVpdGhlciB0aGUgdHlwZQorICogc3BlY2lmaWVkIGluIC9ldGMvZnN0YWIsIG9yIERFRkFVTFRfRlNUWVBFLgorICovCitzdGF0aWMgdm9pZCBmc2NrX2RldmljZShzdHJ1Y3QgZnNfaW5mbyAqZnMsIGludCBpbnRlcmFjdGl2ZSkKK3sKKwljb25zdCBjaGFyICp0eXBlOworCWludCByZXR2YWw7CisKKwlpbnRlcnByZXRfdHlwZShmcyk7CisKKwlpZiAoc3RyY21wKGZzLT50eXBlLCAiYXV0byIpICE9IDApCisJCXR5cGUgPSBmcy0+dHlwZTsKKwllbHNlIGlmIChmc3R5cGUgJiYgc3RybmNtcChmc3R5cGUsICJubyIsIDIpICYmCisJICAgIHN0cm5jbXAoZnN0eXBlLCAib3B0cz0iLCA1KSAmJiBzdHJuY21wKGZzdHlwZSwgImxvb3AiLCA0KSAmJgorCSAgICAhc3RyY2hyKGZzdHlwZSwgJywnKSkKKwkJdHlwZSA9IGZzdHlwZTsKKwllbHNlCisJCXR5cGUgPSBERUZBVUxUX0ZTVFlQRTsKKworCW51bV9ydW5uaW5nKys7CisJcmV0dmFsID0gZXhlY3V0ZSh0eXBlLCBmcy0+ZGV2aWNlLCBmcy0+bW91bnRwdCwgaW50ZXJhY3RpdmUpOworCWlmIChyZXR2YWwpIHsKKwkJYmJfZXJyb3JfbXNnKCJlcnJvciAlZCB3aGlsZSBleGVjdXRpbmcgZnNjay4lcyBmb3IgJXMiLAorCQkJCQkJcmV0dmFsLCB0eXBlLCBmcy0+ZGV2aWNlKTsKKwkJbnVtX3J1bm5pbmctLTsKKwl9Cit9CisKKworLyoKKyAqIERlYWwgd2l0aCB0aGUgZnNjayAtdCBhcmd1bWVudC4KKyAqLworc3RydWN0IGZzX3R5cGVfY29tcGlsZSB7CisJY2hhciAqKmxpc3Q7CisJaW50ICp0eXBlOworCWludCAgbmVnYXRlOworfSBmc190eXBlX2NvbXBpbGVkOworCisjZGVmaW5lIEZTX1RZUEVfTk9STUFMICAwCisjZGVmaW5lIEZTX1RZUEVfT1BUICAgICAxCisjZGVmaW5lIEZTX1RZUEVfTkVHT1BUICAyCisKK3N0YXRpYyBjb25zdCBjaGFyIGZzX3R5cGVfc3ludGF4X2Vycm9yW10gPQorIkVpdGhlciBhbGwgb3Igbm9uZSBvZiB0aGUgZmlsZXN5c3RlbSB0eXBlcyBwYXNzZWQgdG8gLXQgbXVzdCBiZSBwcmVmaXhlZFxuIgorICAgIndpdGggJ25vJyBvciAnIScuIjsKKworc3RhdGljIHZvaWQgY29tcGlsZV9mc190eXBlKGNoYXIgKmZzX3R5cGUsIHN0cnVjdCBmc190eXBlX2NvbXBpbGUgKmNtcCkKK3sKKwljaGFyICAgICpjcCwgKmxpc3QsICpzOworCWludCAgICAgbnVtID0gMjsKKwlpbnQgICAgIG5lZ2F0ZSwgZmlyc3RfbmVnYXRlID0gMTsKKworCWlmIChmc190eXBlKSB7CisJCWZvciAoY3A9ZnNfdHlwZTsgKmNwOyBjcCsrKSB7CisJCQlpZiAoKmNwID09ICcsJykKKwkJCQludW0rKzsKKwkJfQorCX0KKworCWNtcC0+bGlzdCA9IHh6YWxsb2MobnVtICogc2l6ZW9mKGNoYXIgKikpOworCWNtcC0+dHlwZSA9IHh6YWxsb2MobnVtICogc2l6ZW9mKGludCkpOworCWNtcC0+bmVnYXRlID0gMDsKKworCWlmICghZnNfdHlwZSkKKwkJcmV0dXJuOworCisJbGlzdCA9IHN0cmluZ19jb3B5KGZzX3R5cGUpOworCW51bSA9IDA7CisJcyA9IHN0cnRvayhsaXN0LCAiLCIpOworCXdoaWxlIChzKSB7CisJCW5lZ2F0ZSA9IDA7CisJCWlmIChzdHJuY21wKHMsICJubyIsIDIpID09IDApIHsKKwkJCXMgKz0gMjsKKwkJCW5lZ2F0ZSA9IDE7CisJCX0gZWxzZSBpZiAoKnMgPT0gJyEnKSB7CisJCQlzKys7CisJCQluZWdhdGUgPSAxOworCQl9CisJCWlmIChzdHJjbXAocywgImxvb3AiKSA9PSAwKQorCQkJLyogbG9vcCBpcyByZWFsbHkgc2hvcnQtaGFuZCBmb3Igb3B0cz1sb29wICovCisJCQlnb3RvIGxvb3Bfc3BlY2lhbF9jYXNlOworCQllbHNlIGlmIChzdHJuY21wKHMsICJvcHRzPSIsIDUpID09IDApIHsKKwkJCXMgKz0gNTsKKwkJbG9vcF9zcGVjaWFsX2Nhc2U6CisJCQljbXAtPnR5cGVbbnVtXSA9IG5lZ2F0ZSA/IEZTX1RZUEVfTkVHT1BUIDogRlNfVFlQRV9PUFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoZmlyc3RfbmVnYXRlKSB7CisJCQkJY21wLT5uZWdhdGUgPSBuZWdhdGU7CisJCQkJZmlyc3RfbmVnYXRlID0gMDsKKwkJCX0KKwkJCWlmICgobmVnYXRlICYmICFjbXAtPm5lZ2F0ZSkgfHwKKwkJCSAgICAoIW5lZ2F0ZSAmJiBjbXAtPm5lZ2F0ZSkpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBmc190eXBlX3N5bnRheF9lcnJvcik7CisJCQl9CisJCX0KKwkJY21wLT5saXN0W251bSsrXSA9IHN0cmluZ19jb3B5KHMpOworCQlzID0gc3RydG9rKE5VTEwsICIsIik7CisJfQorCWZyZWUobGlzdCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgb3B0aW9uIGFwcGVhcnMgaW4gYQorICogY29tbWEtZGVsaW1pdGVkIG9wdGlvbnMgbGlzdAorICovCitzdGF0aWMgaW50IG9wdF9pbl9saXN0KGNoYXIgKm9wdCwgY2hhciAqb3B0bGlzdCkKK3sKKwljaGFyICAgICpsaXN0LCAqczsKKworCWlmICghb3B0bGlzdCkKKwkJcmV0dXJuIDA7CisJbGlzdCA9IHN0cmluZ19jb3B5KG9wdGxpc3QpOworCisJcyA9IHN0cnRvayhsaXN0LCAiLCIpOworCXdoaWxlIChzKSB7CisJCWlmIChzdHJjbXAocywgb3B0KSA9PSAwKSB7CisJCQlmcmVlKGxpc3QpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcyA9IHN0cnRvayhOVUxMLCAiLCIpOworCX0KKwlmcmVlKGxpc3QpOworCXJldHVybiAwOworfQorCisvKiBTZWUgaWYgdGhlIGZpbGVzeXN0ZW0gbWF0Y2hlcyB0aGUgY3JpdGVyaWEgZ2l2ZW4gYnkgdGhlIC10IG9wdGlvbiAqLworc3RhdGljIGludCBmc19tYXRjaChzdHJ1Y3QgZnNfaW5mbyAqZnMsIHN0cnVjdCBmc190eXBlX2NvbXBpbGUgKmNtcCkKK3sKKwlpbnQgbiwgcmV0ID0gMCwgY2hlY2tlZF90eXBlID0gMDsKKwljaGFyICpjcDsKKworCWlmIChjbXAtPmxpc3QgPT0gMCB8fCBjbXAtPmxpc3RbMF0gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlmb3IgKG49MDsgKGNwID0gY21wLT5saXN0W25dKTsgbisrKSB7CisJCXN3aXRjaCAoY21wLT50eXBlW25dKSB7CisJCWNhc2UgRlNfVFlQRV9OT1JNQUw6CisJCQljaGVja2VkX3R5cGUrKzsKKwkJCWlmIChzdHJjbXAoY3AsIGZzLT50eXBlKSA9PSAwKSB7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZTX1RZUEVfTkVHT1BUOgorCQkJaWYgKG9wdF9pbl9saXN0KGNwLCBmcy0+b3B0cykpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSBGU19UWVBFX09QVDoKKwkJCWlmICghb3B0X2luX2xpc3QoY3AsIGZzLT5vcHRzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChjaGVja2VkX3R5cGUgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIChjbXAtPm5lZ2F0ZSA/ICFyZXQgOiByZXQpOworfQorCisvKiBDaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHRoaXMgZmlsZXN5c3RlbS4gKi8KK3N0YXRpYyBpbnQgaWdub3JlKHN0cnVjdCBmc19pbmZvICpmcykKK3sKKwlpbnQgd2FudGVkOworCWNoYXIgKnM7CisKKwkvKgorCSAqIElmIHRoZSBwYXNzIG51bWJlciBpcyAwLCBpZ25vcmUgaXQuCisJICovCisJaWYgKGZzLT5wYXNzbm8gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpbnRlcnByZXRfdHlwZShmcyk7CisKKwkvKgorCSAqIElmIGEgc3BlY2lmaWMgZnN0eXBlIGlzIHNwZWNpZmllZCwgYW5kIGl0IGRvZXNuJ3QgbWF0Y2gsCisJICogaWdub3JlIGl0LgorCSAqLworCWlmICghZnNfbWF0Y2goZnMsICZmc190eXBlX2NvbXBpbGVkKSkgcmV0dXJuIDE7CisKKwkvKiBBcmUgd2UgaWdub3JpbmcgdGhpcyB0eXBlPyAqLworCWlmIChpbmRleF9pbl9zdHJfYXJyYXkoaWdub3JlZF90eXBlcywgZnMtPnR5cGUpID49IDApCisJCXJldHVybiAxOworCisJLyogRG8gd2UgcmVhbGx5IHJlYWxseSB3YW50IHRvIGNoZWNrIHRoaXMgZnM/ICovCisJd2FudGVkID0gaW5kZXhfaW5fc3RyX2FycmF5KHJlYWxseV93YW50ZWQsIGZzLT50eXBlKSA+PSAwOworCisJLyogU2VlIGlmIHRoZSA8ZnNjay5mcz4gcHJvZ3JhbSBpcyBhdmFpbGFibGUuICovCisJcyA9IGZpbmRfZnNjayhmcy0+dHlwZSk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlpZiAod2FudGVkKQorCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjaGVjayAlczogZnNjay4lcyBub3QgZm91bmQiLAorCQkJCWZzLT5kZXZpY2UsIGZzLT50eXBlKTsKKwkJcmV0dXJuIDE7CisJfQorCWZyZWUocyk7CisKKwkvKiBXZSBjYW4gYW5kIHdhbnQgdG8gY2hlY2sgdGhpcyBmaWxlIHN5c3RlbSB0eXBlLiAqLworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyBUUlVFIGlmIGEgcGFydGl0aW9uIG9uIHRoZSBzYW1lIGRpc2sgaXMgYWxyZWFkeSBiZWluZworICogY2hlY2tlZC4KKyAqLworc3RhdGljIGludCBkZXZpY2VfYWxyZWFkeV9hY3RpdmUoY2hhciAqZGV2aWNlKQoreworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCWNoYXIgKmJhc2U7CisKKwlpZiAoZm9yY2VfYWxsX3BhcmFsbGVsKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIEJBU0VfTUQKKwkvKiBEb24ndCBjaGVjayBhIHNvZnQgcmFpZCBkaXNrIHdpdGggYW55IG90aGVyIGRpc2sgKi8KKwlpZiAoaW5zdGFuY2VfbGlzdCAmJgorCSAgICAoIXN0cm5jbXAoaW5zdGFuY2VfbGlzdC0+ZGV2aWNlLCBCQVNFX01ELCBzaXplb2YoQkFTRV9NRCktMSkgfHwKKwkgICAgICFzdHJuY21wKGRldmljZSwgQkFTRV9NRCwgc2l6ZW9mKEJBU0VfTUQpLTEpKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCWJhc2UgPSBiYXNlX2RldmljZShkZXZpY2UpOworCS8qCisJICogSWYgd2UgZG9uJ3Qga25vdyB0aGUgYmFzZSBkZXZpY2UsIGFzc3VtZSB0aGF0IHRoZSBkZXZpY2UgaXMKKwkgKiBhbHJlYWR5IGFjdGl2ZSBpZiB0aGVyZSBhcmUgYW55IGZzY2sgaW5zdGFuY2VzIHJ1bm5pbmcuCisJICovCisJaWYgKCFiYXNlKQorCQlyZXR1cm4gKGluc3RhbmNlX2xpc3QgIT0gMCk7CisJZm9yIChpbnN0ID0gaW5zdGFuY2VfbGlzdDsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKwkJaWYgKCFpbnN0LT5iYXNlX2RldmljZSB8fCAhc3RyY21wKGJhc2UsIGluc3QtPmJhc2VfZGV2aWNlKSkgeworCQkJZnJlZShiYXNlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWZyZWUoYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGFsbCBmaWxlIHN5c3RlbXMsIHVzaW5nIHRoZSAvZXRjL2ZzdGFiIHRhYmxlLiAqLworc3RhdGljIGludCBjaGVja19hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgZnNfaW5mbyAqZnMgPSBOVUxMOworCWludCBzdGF0dXMgPSBFWElUX09LOworCWludCBub3RfZG9uZV95ZXQgPSAxOworCWludCBwYXNzbm8gPSAxOworCWludCBwYXNzX2RvbmU7CisKKwlpZiAodmVyYm9zZSkKKwkJZnB1dHMoIkNoZWNraW5nIGFsbCBmaWxlIHN5c3RlbXMuXG4iLCBzdGRvdXQpOworCisJLyoKKwkgKiBEbyBhbiBpbml0aWFsIHNjYW4gb3ZlciB0aGUgZmlsZXN5c3RlbTsgbWFyayBmaWxlc3lzdGVtcworCSAqIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGFzIGRvbmUsIGFuZCByZXNvbHZlIGFueSAiYXV0byIKKwkgKiBmaWxlc3lzdGVtIHR5cGVzIChkb25lIGFzIGEgc2lkZS1lZmZlY3Qgb2YgY2FsbGluZyBpZ25vcmUoKSkuCisJICovCisJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJaWYgKGlnbm9yZShmcykpCisJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCX0KKworCS8qCisJICogRmluZCBhbmQgY2hlY2sgdGhlIHJvb3QgZmlsZXN5c3RlbS4KKwkgKi8KKwlpZiAoIXBhcmFsbGVsX3Jvb3QpIHsKKwkJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJCWlmIChMT05FX0NIQVIoZnMtPm1vdW50cHQsICcvJykpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZzKSB7CisJCQlpZiAoIXNraXBfcm9vdCAmJiAhaWdub3JlKGZzKSkgeworCQkJCWZzY2tfZGV2aWNlKGZzLCAxKTsKKwkJCQlzdGF0dXMgfD0gd2FpdF9tYW55KEZMQUdfV0FJVF9BTEwpOworCQkJCWlmIChzdGF0dXMgPiBFWElUX05PTkRFU1RSVUNUKQorCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJfQorCQkJZnMtPmZsYWdzIHw9IEZMQUdfRE9ORTsKKwkJfQorCX0KKwkvKgorCSAqIFRoaXMgaXMgZm9yIHRoZSBib25lLWhlYWRlZCB1c2VyIHdobyBlbnRlcnMgdGhlIHJvb3QKKwkgKiBmaWxlc3lzdGVtIHR3aWNlLiAgU2tpcCByb290IHdpbGwgc2tlcCBhbGwgcm9vdCBlbnRyaWVzLgorCSAqLworCWlmIChza2lwX3Jvb3QpCisJCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KQorCQkJaWYgKExPTkVfQ0hBUihmcy0+bW91bnRwdCwgJy8nKSkKKwkJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCisJd2hpbGUgKG5vdF9kb25lX3lldCkgeworCQlub3RfZG9uZV95ZXQgPSAwOworCQlwYXNzX2RvbmUgPSAxOworCisJCWZvciAoZnMgPSBmaWxlc3lzX2luZm87IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisJCQlpZiAoY2FuY2VsX3JlcXVlc3RlZCkKKwkJCQlicmVhazsKKwkJCWlmIChmcy0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogSWYgdGhlIGZpbGVzeXN0ZW0ncyBwYXNzIG51bWJlciBpcyBoaWdoZXIKKwkJCSAqIHRoYW4gdGhlIGN1cnJlbnQgcGFzcyBudW1iZXIsIHRoZW4gd2UgZG9uJ3QKKwkJCSAqIGRvIGl0IHlldC4KKwkJCSAqLworCQkJaWYgKGZzLT5wYXNzbm8gPiBwYXNzbm8pIHsKKwkJCQlub3RfZG9uZV95ZXQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiBhIGZpbGVzeXN0ZW0gb24gYSBwYXJ0aWN1bGFyIGRldmljZSBoYXMKKwkJCSAqIGFscmVhZHkgYmVlbiBzcGF3bmVkLCB0aGVuIHdlIG5lZWQgdG8gZGVmZXIKKwkJCSAqIHRoaXMgdG8gYW5vdGhlciBwYXNzLgorCQkJICovCisJCQlpZiAoZGV2aWNlX2FscmVhZHlfYWN0aXZlKGZzLT5kZXZpY2UpKSB7CisJCQkJcGFzc19kb25lID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBTcGF3biBvZmYgdGhlIGZzY2sgcHJvY2VzcworCQkJICovCisJCQlmc2NrX2RldmljZShmcywgc2VyaWFsaXplKTsKKwkJCWZzLT5mbGFncyB8PSBGTEFHX0RPTkU7CisKKwkJCS8qCisJCQkgKiBPbmx5IGRvIG9uZSBmaWxlc3lzdGVtIGF0IGEgdGltZSwgb3IgaWYgd2UKKwkJCSAqIGhhdmUgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGZzY2sncyBleHRhbnQKKwkJCSAqIGF0IG9uZSB0aW1lLCBhcHBseSB0aGF0IGxpbWl0LgorCQkJICovCisJCQlpZiAoc2VyaWFsaXplIHx8CisJCQkgICAgKG1heF9ydW5uaW5nICYmIChudW1fcnVubmluZyA+PSBtYXhfcnVubmluZykpKSB7CisJCQkJcGFzc19kb25lID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoY2FuY2VsX3JlcXVlc3RlZCkKKwkJCWJyZWFrOworCQlpZiAodmVyYm9zZSA+IDEpCisJCQlwcmludGYoIi0td2FpdGluZy0tIChwYXNzICVkKVxuIiwgcGFzc25vKTsKKwkJc3RhdHVzIHw9IHdhaXRfbWFueShwYXNzX2RvbmUgPyBGTEFHX1dBSVRfQUxMIDoKKwkJCQkgICAgRkxBR19XQUlUX0FUTEVBU1RfT05FKTsKKwkJaWYgKHBhc3NfZG9uZSkgeworCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCQlwYXNzbm8rKzsKKwkJfSBlbHNlCisJCQlub3RfZG9uZV95ZXQrKzsKKwl9CisJaWYgKGNhbmNlbF9yZXF1ZXN0ZWQgJiYgIWtpbGxfc2VudCkgeworCQlraWxsX2FsbChTSUdURVJNKTsKKwkJa2lsbF9zZW50Kys7CisJfQorCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FUTEVBU1RfT05FKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfY2FuY2VsKGludCBzaWcgRlNDS19BVFRSKCh1bnVzZWQpKSkKK3sKKwljYW5jZWxfcmVxdWVzdGVkKys7Cit9CisKK3N0YXRpYyB2b2lkIFBSUyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50ICAgICBpLCBqOworCWNoYXIgICAgKmFyZywgKmRldiwgKnRtcCA9IE5VTEw7CisJY2hhciAgICBvcHRpb25zWzEyOF07CisJaW50ICAgICBvcHQgPSAwOworCWludCAgICAgb3B0c19mb3JfZnNjayA9IDA7CisJc3RydWN0IHNpZ2FjdGlvbiAgICAgICAgc2E7CisKKwkvKgorCSAqIFNldCB1cCBzaWduYWwgYWN0aW9uCisJICovCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzaWdhY3Rpb24pKTsKKwlzYS5zYV9oYW5kbGVyID0gc2lnbmFsX2NhbmNlbDsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIDApOworCXNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIDApOworCisJbnVtX2RldmljZXMgPSAwOworCW51bV9hcmdzID0gMDsKKwlpbnN0YW5jZV9saXN0ID0gMDsKKworCWZvciAoaT0xOyBpIDwgYXJnYzsgaSsrKSB7CisJCWFyZyA9IGFyZ3ZbaV07CisJCWlmICghYXJnKQorCQkJY29udGludWU7CisJCWlmICgoYXJnWzBdID09ICcvJyAmJiAhb3B0c19mb3JfZnNjaykgfHwgc3RyY2hyKGFyZywgJz0nKSkgeworCQkJaWYgKG51bV9kZXZpY2VzID49IE1BWF9ERVZJQ0VTKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGRldmljZXMiKTsKKwkJCX0KKwkJCWRldiA9IGJsa2lkX2dldF9kZXZuYW1lKGNhY2hlLCBhcmcsIE5VTEwpOworCQkJaWYgKCFkZXYgJiYgc3RyY2hyKGFyZywgJz0nKSkgeworCQkJCS8qCisJCQkJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGZhaWxlZCBiZWNhdXNlCisJCQkJICogL3Byb2MvcGFydGl0aW9ucyBpc24ndCBmb3VuZC4KKwkJCQkgKi8KKwkJCQlpZiAoYWNjZXNzKCIvcHJvYy9wYXJ0aXRpb25zIiwgUl9PSykgPCAwKSB7CisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAvcHJvYy9wYXJ0aXRpb25zICIKKwkJCQkJCQkiKGlzIC9wcm9jIG1vdW50ZWQ/KSIpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGJlY2F1c2UKKwkJCQkgKiB3ZSdyZSBub3QgcnVubmluZyBhcyByb290CisJCQkJICovCisJCQkJaWYgKGdldGV1aWQoKSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCSJtdXN0IGJlIHJvb3QgdG8gc2NhbiBmb3IgbWF0Y2hpbmcgZmlsZXN5c3RlbXM6ICVzXG4iLCBhcmcpOworCQkJCWVsc2UKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCSJjYW4ndCBmaW5kIG1hdGNoaW5nIGZpbGVzeXN0ZW06ICVzIiwgYXJnKTsKKwkJCX0KKwkJCWRldmljZXNbbnVtX2RldmljZXMrK10gPSBkZXYgPyBkZXYgOiBzdHJpbmdfY29weShhcmcpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZ1swXSAhPSAnLScgfHwgb3B0c19mb3JfZnNjaykgeworCQkJaWYgKG51bV9hcmdzID49IE1BWF9BUkdTKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQkJfQorCQkJYXJnc1tudW1fYXJncysrXSA9IHN0cmluZ19jb3B5KGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKGo9MTsgYXJnW2pdOyBqKyspIHsKKwkJCWlmIChvcHRzX2Zvcl9mc2NrKSB7CisJCQkJb3B0aW9uc1srK29wdF0gPSBhcmdbal07CisJCQkJY29udGludWU7CisJCQl9CisJCQlzd2l0Y2ggKGFyZ1tqXSkgeworCQkJY2FzZSAnQSc6CisJCQkJZG9hbGwrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0MnOgorCQkJCXByb2dyZXNzKys7CisJCQkJaWYgKGFyZ1tqKzFdKSB7CisJCQkJCXByb2dyZXNzX2ZkID0gc3RyaW5nX3RvX2ludChhcmcraisxKTsKKwkJCQkJaWYgKHByb2dyZXNzX2ZkIDwgMCkKKwkJCQkJCXByb2dyZXNzX2ZkID0gMDsKKwkJCQkJZWxzZQorCQkJCQkJZ290byBuZXh0X2FyZzsKKwkJCQl9IGVsc2UgaWYgKChpKzEpIDwgYXJnYworCQkJCSAmJiBhcmd2W2krMV1bMF0gIT0gJy0nKSB7CisJCQkJCXByb2dyZXNzX2ZkID0gc3RyaW5nX3RvX2ludChhcmd2W2ldKTsKKwkJCQkJaWYgKHByb2dyZXNzX2ZkIDwgMCkKKwkJCQkJCXByb2dyZXNzX2ZkID0gMDsKKwkJCQkJZWxzZSB7CisJCQkJCQlnb3RvIG5leHRfYXJnOworCQkJCQkJaSsrOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnVic6CisJCQkJdmVyYm9zZSsrOworCQkJCWJyZWFrOworCQkJY2FzZSAnTic6CisJCQkJbm9leGVjdXRlKys7CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoKKwkJCQlza2lwX3Jvb3QrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1QnOgorCQkJCW5vdGl0bGUrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ00nOgorCQkJCWxpa2VfbW91bnQrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1AnOgorCQkJCXBhcmFsbGVsX3Jvb3QrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCXNlcmlhbGl6ZSsrOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJdG1wID0gMDsKKwkJCQlpZiAoZnN0eXBlKQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJaWYgKGFyZ1tqKzFdKQorCQkJCQl0bXAgPSBhcmcraisxOworCQkJCWVsc2UgaWYgKChpKzEpIDwgYXJnYykKKwkJCQkJdG1wID0gYXJndlsrK2ldOworCQkJCWVsc2UKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCWZzdHlwZSA9IHN0cmluZ19jb3B5KHRtcCk7CisJCQkJY29tcGlsZV9mc190eXBlKGZzdHlwZSwgJmZzX3R5cGVfY29tcGlsZWQpOworCQkJCWdvdG8gbmV4dF9hcmc7CisJCQljYXNlICctJzoKKwkJCQlvcHRzX2Zvcl9mc2NrKys7CisJCQkJYnJlYWs7CisJCQljYXNlICc/JzoKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW9wdGlvbnNbKytvcHRdID0gYXJnW2pdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJbmV4dF9hcmc6CisJCWlmIChvcHQpIHsKKwkJCW9wdGlvbnNbMF0gPSAnLSc7CisJCQlvcHRpb25zWysrb3B0XSA9ICdcMCc7CisJCQlpZiAobnVtX2FyZ3MgPj0gTUFYX0FSR1MpIHsKKwkJCQliYl9lcnJvcl9tc2coInRvbyBtYW55IGFyZ3VtZW50cyIpOworCQkJfQorCQkJYXJnc1tudW1fYXJncysrXSA9IHN0cmluZ19jb3B5KG9wdGlvbnMpOworCQkJb3B0ID0gMDsKKwkJfQorCX0KKwlpZiAoZ2V0ZW52KCJGU0NLX0ZPUkNFX0FMTF9QQVJBTExFTCIpKQorCQlmb3JjZV9hbGxfcGFyYWxsZWwrKzsKKwlpZiAoKHRtcCA9IGdldGVudigiRlNDS19NQVhfSU5TVCIpKSkKKwkgICAgbWF4X3J1bm5pbmcgPSBhdG9pKHRtcCk7Cit9CisKK2ludCBmc2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmc2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCBzdGF0dXMgPSAwOworCWludCBpbnRlcmFjdGl2ZSA9IDA7CisJY29uc3QgY2hhciAqZnN0YWI7CisJc3RydWN0IGZzX2luZm8gKmZzOworCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgQlVGU0laKTsKKwlzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTkJGLCBCVUZTSVopOworCisJYmxraWRfZ2V0X2NhY2hlKCZjYWNoZSwgTlVMTCk7CisJUFJTKGFyZ2MsIGFyZ3YpOworCisJaWYgKCFub3RpdGxlKQorCQlwcmludGYoImZzY2sgJXMgKCVzKVxuIiwgRTJGU1BST0dTX1ZFUlNJT04sIEUyRlNQUk9HU19EQVRFKTsKKworCWZzdGFiID0gZ2V0ZW52KCJGU1RBQl9GSUxFIik7CisJaWYgKCFmc3RhYikKKwkJZnN0YWIgPSBfUEFUSF9NTlRUQUI7CisJbG9hZF9mc19pbmZvKGZzdGFiKTsKKworCWZzY2tfcGF0aCA9IGUyZnNfc2V0X3NiaW5fcGF0aCgpOworCisJaWYgKChudW1fZGV2aWNlcyA9PSAxKSB8fCAoc2VyaWFsaXplKSkKKwkJaW50ZXJhY3RpdmUgPSAxOworCisJLyogSWYgLUEgd2FzIHNwZWNpZmllZCAoImNoZWNrIGFsbCIpLCBkbyB0aGF0ISAqLworCWlmIChkb2FsbCkKKwkJcmV0dXJuIGNoZWNrX2FsbCgpOworCisJaWYgKG51bV9kZXZpY2VzID09IDApIHsKKwkJc2VyaWFsaXplKys7CisJCWludGVyYWN0aXZlKys7CisJCXJldHVybiBjaGVja19hbGwoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKKwkJaWYgKGNhbmNlbF9yZXF1ZXN0ZWQpIHsKKwkJCWlmICgha2lsbF9zZW50KSB7CisJCQkJa2lsbF9hbGwoU0lHVEVSTSk7CisJCQkJa2lsbF9zZW50Kys7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlmcyA9IGxvb2t1cChkZXZpY2VzW2ldKTsKKwkJaWYgKCFmcykgeworCQkJZnMgPSBjcmVhdGVfZnNfZGV2aWNlKGRldmljZXNbaV0sIDAsICJhdXRvIiwKKwkJCQkJICAgICAgMCwgLTEsIC0xKTsKKwkJCWlmICghZnMpCisJCQkJY29udGludWU7CisJCX0KKwkJZnNja19kZXZpY2UoZnMsIGludGVyYWN0aXZlKTsKKwkJaWYgKHNlcmlhbGl6ZSB8fAorCQkgICAgKG1heF9ydW5uaW5nICYmIChudW1fcnVubmluZyA+PSBtYXhfcnVubmluZykpKSB7CisJCQlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKworCQkJaW5zdCA9IHdhaXRfb25lKDApOworCQkJaWYgKGluc3QpIHsKKwkJCQlzdGF0dXMgfD0gaW5zdC0+ZXhpdF9zdGF0dXM7CisJCQkJZnJlZV9pbnN0YW5jZShpbnN0KTsKKwkJCX0KKwkJCWlmICh2ZXJib3NlID4gMSkKKwkJCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQl9CisJfQorCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FMTCk7CisJYmxraWRfcHV0X2NhY2hlKGNhY2hlKTsKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZnNjay5oIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZnNjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTJhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9mc2NrLmgKQEAgLTAsMCArMSwxNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZnNjay5oCisgKi8KKworI2RlZmluZSBGU0NLX0FUVFIoeCkgX19hdHRyaWJ1dGVfXyh4KQorCisjZGVmaW5lIEVYSVRfT0sgICAgICAgICAgMAorI2RlZmluZSBFWElUX05PTkRFU1RSVUNUIDEKKyNkZWZpbmUgRVhJVF9ERVNUUlVDVCAgICAyCisjZGVmaW5lIEVYSVRfVU5DT1JSRUNURUQgNAorI2RlZmluZSBFWElUX0VSUk9SICAgICAgIDgKKyNkZWZpbmUgRVhJVF9VU0FHRSAgICAgICAxNgorI2RlZmluZSBGU0NLX0NBTkNFTEVEICAgIDMyICAgICAvKiBBYm9ydGVkIHdpdGggYSBzaWduYWwgb3IgXkMgKi8KKworZXh0ZXJuIGNoYXIgKmUyZnNfc2V0X3NiaW5fcGF0aCh2b2lkKTsKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2xzYXR0ci5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvbHNhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwZTRjYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2xzYXR0ci5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsc2F0dHIuYwkJLSBMaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTMvMTAvMzAgLSBDcmVhdGlvbgorICogOTMvMTEvMTMgLSBSZXBsYWNlIHN0YXQoKSBjYWxscyBieSBsc3RhdCgpIHRvIGF2b2lkIGxvb3BzCisgKiA5NC8wMi8yNyAtIEludGVncmF0ZWQgaW4gVGVkJ3MgZGlzdHJpYnV0aW9uCisgKiA5OC8xMi8yOSAtIERpc3BsYXkgdmVyc2lvbiBpbmZvIG9ubHkgd2hlbiAtViBzcGVjaWZpZWQgKEcgTSBTaXBlKQorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZnMuaCIKKyNpbmNsdWRlICJlMmZzYmIuaCIKKyNpbmNsdWRlICJlMnAvZTJwLmgiCisKKyNkZWZpbmUgT1BUX1JFQ1VSIDEKKyNkZWZpbmUgT1BUX0FMTCAyCisjZGVmaW5lIE9QVF9ESVJTX09QVCA0CisjZGVmaW5lIE9QVF9QRl9MT05HIDgKKyNkZWZpbmUgT1BUX0dFTkVSQVRJT04gMTYKK3N0YXRpYyBpbnQgZmxhZ3M7CisKK3N0YXRpYyB2b2lkIGxpc3RfYXR0cmlidXRlcyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZnNmbGFnczsKKwl1bnNpZ25lZCBsb25nIGdlbmVyYXRpb247CisKKwlpZiAoZmdldGZsYWdzKG5hbWUsICZmc2ZsYWdzKSA9PSAtMSkKKwkJZ290byByZWFkX2VycjsKKwlpZiAoZmxhZ3MgJiBPUFRfR0VORVJBVElPTikgeworCQlpZiAoZmdldHZlcnNpb24obmFtZSwgJmdlbmVyYXRpb24pID09IC0xKQorCQkJZ290byByZWFkX2VycjsKKwkJcHJpbnRmKCIlNWx1ICIsIGdlbmVyYXRpb24pOworCX0KKworCWlmIChmbGFncyAmIE9QVF9QRl9MT05HKSB7CisJCXByaW50ZigiJS0yOHMgIiwgbmFtZSk7CisJCXByaW50X2UyZmxhZ3Moc3Rkb3V0LCBmc2ZsYWdzLCBQRk9QVF9MT05HKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9IGVsc2UgeworCQlwcmludF9lMmZsYWdzKHN0ZG91dCwgZnNmbGFncywgMCk7CisJCXByaW50ZigiICVzXG4iLCBuYW1lKTsKKwl9CisKKwlyZXR1cm47CityZWFkX2VycjoKKwliYl9wZXJyb3JfbXNnKCJyZWFkaW5nICVzIiwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgbHNhdHRyX2Rpcl9wcm9jKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpcmVudCAqLCB2b2lkICopOworCitzdGF0aWMgdm9pZCBsc2F0dHJfYXJncyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGxzdGF0KG5hbWUsICZzdCkgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZygic3RhdGluZyAlcyIsIG5hbWUpOworCX0gZWxzZSB7CisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpICYmICEoZmxhZ3MgJiBPUFRfRElSU19PUFQpKQorCQkJaXRlcmF0ZV9vbl9kaXIobmFtZSwgbHNhdHRyX2Rpcl9wcm9jLCBOVUxMKTsKKwkJZWxzZQorCQkJbGlzdF9hdHRyaWJ1dGVzKG5hbWUpOworCX0KK30KKworc3RhdGljIGludCBsc2F0dHJfZGlyX3Byb2MoY29uc3QgY2hhciAqZGlyX25hbWUsIHN0cnVjdCBkaXJlbnQgKmRlLAorCQkJICAgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpwYXRoOworCisJcGF0aCA9IGNvbmNhdF9wYXRoX2ZpbGUoZGlyX25hbWUsIGRlLT5kX25hbWUpOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2cocGF0aCk7CisJZWxzZSB7CisJCWlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJyB8fCAoZmxhZ3MgJiBPUFRfQUxMKSkgeworCQkJbGlzdF9hdHRyaWJ1dGVzKHBhdGgpOworCQkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgKGZsYWdzICYgT1BUX1JFQ1VSKSAmJgorCQkJICAgKGRlLT5kX25hbWVbMF0gIT0gJy4nICYmIChkZS0+ZF9uYW1lWzFdICE9ICdcMCcgfHwKKwkJCSAgIChkZS0+ZF9uYW1lWzFdICE9ICcuJyAmJiBkZS0+ZF9uYW1lWzJdICE9ICdcMCcpKSkpIHsKKwkJCQlwcmludGYoIlxuJXM6XG4iLCBwYXRoKTsKKwkJCQlpdGVyYXRlX29uX2RpcihwYXRoLCBsc2F0dHJfZGlyX3Byb2MsIE5VTEwpOworCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQl9CisJCX0KKwl9CisKKwlmcmVlKHBhdGgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsc2F0dHJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxzYXR0cl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgIlJhZGx2Iik7CisKKwlpZiAob3B0aW5kID4gYXJnYyAtIDEpCisJCWxzYXR0cl9hcmdzKCIuIik7CisJZWxzZQorCQlmb3IgKGkgPSBvcHRpbmQ7IGkgPCBhcmdjOyBpKyspCisJCQlsc2F0dHJfYXJncyhhcmd2W2ldKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ta2UyZnMuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL21rZTJmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTU2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ta2UyZnMuYwpAQCAtMCwwICsxLDEzMzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rZTJmcy5jIC0gTWFrZSBhIGV4dDJmcyBmaWxlc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyAqCTIwMDMsIDIwMDQsIDIwMDUgYnkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFVzYWdlOiBta2UyZnMgW29wdGlvbnNdIGRldmljZQorICoKKyAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAorICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgImUyZnNiYi5oIgorI2luY2x1ZGUgImV4dDJmcy9leHQyX2ZzLmgiCisjaW5jbHVkZSAidXVpZC91dWlkLmgiCisjaW5jbHVkZSAiZTJwL2UycC5oIgorI2luY2x1ZGUgImV4dDJmcy9leHQyZnMuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNkZWZpbmUgU1RSSURFX0xFTkdUSCA4CisKKyNpZm5kZWYgX19zcGFyY19fCisjZGVmaW5lIFpBUF9CT09UQkxPQ0sKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqIGRldmljZV9uYW1lOworCisvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyAqLworc3RhdGljIGludAljZmxhZzsKK3N0YXRpYyBpbnQJcXVpZXQ7CitzdGF0aWMgaW50CXN1cGVyX29ubHk7CitzdGF0aWMgaW50CWZvcmNlOworc3RhdGljIGludAlub2FjdGlvbjsKK3N0YXRpYyBpbnQJam91cm5hbF9zaXplOworc3RhdGljIGludAlqb3VybmFsX2ZsYWdzOworc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9ibG9ja3NfZmlsZW5hbWU7CitzdGF0aWMgX191MzIJZnNfc3RyaWRlOworCitzdGF0aWMgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgcGFyYW07CitzdGF0aWMgY2hhciAqY3JlYXRvcl9vczsKK3N0YXRpYyBjaGFyICp2b2x1bWVfbGFiZWw7CitzdGF0aWMgY2hhciAqbW91bnRfZGlyOworc3RhdGljIGNoYXIgKmpvdXJuYWxfZGV2aWNlID0gTlVMTDsKK3N0YXRpYyBpbnQgICBzeW5jX2tsdWRnZTsgLyogU2V0IHVzaW5nIHRoZSBNS0UyRlNfU1lOQyBlbnYuIG9wdGlvbiAqLworCitzdGF0aWMgaW50IHN5c19wYWdlX3NpemUgPSA0MDk2Oworc3RhdGljIGludCBsaW51eF92ZXJzaW9uX2NvZGUgPSAwOworCitzdGF0aWMgaW50IGludF9sb2cyKGludCBhcmcpCit7CisJaW50IGwgPSAwOworCisJYXJnID4+PSAxOworCXdoaWxlIChhcmcpIHsKKwkJbCsrOworCQlhcmcgPj49IDE7CisJfQorCXJldHVybiBsOworfQorCitzdGF0aWMgaW50IGludF9sb2cxMCh1bnNpZ25lZCBpbnQgYXJnKQoreworCWludAlsOworCisJZm9yIChsID0gMDsgYXJnOyBsKyspCisJCWFyZyA9IGFyZyAvIDEwOworCXJldHVybiBsOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIGEgZmlsZXN5c3RlbQorICoKKyAqIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgdXNlci4gIFRoZSBzaXplIGlzIHRoZSBtYXhpbXVtIHNpemUKKyAqIChpbiBtZWdhYnl0ZXMpIGZvciB3aGljaCBhIHNldCBvZiBwYXJhbWV0ZXJzIGFwcGxpZXMsIHdpdGggYSBzaXplCisgKiBvZiB6ZXJvIG1lYW5pbmcgdGhhdCBpdCBpcyB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgZm9yIHRoZSB0eXBlLgorICogTm90ZSB0aGF0IG9yZGVyIGlzIGltcG9ydGFudCBpbiB0aGUgdGFibGUgYmVsb3cuCisgKi8KKyNkZWZpbmUgREVGX01BWF9CTE9DS1NJWkUgLTEKK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfc3RyW10gPSAiZGVmYXVsdCI7CitzdHJ1Y3QgbWtlMmZzX2RlZmF1bHRzIHsKKwljb25zdCBjaGFyCSp0eXBlOworCWludAkJc2l6ZTsKKwlpbnQJCWJsb2Nrc2l6ZTsKKwlpbnQJCWlub2RlX3JhdGlvOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBta2UyZnNfZGVmYXVsdHMgc2V0dGluZ3NbXSA9IHsKKwl7IGRlZmF1bHRfc3RyLAkgMCwgNDA5NiwgODE5MiB9LAorCXsgZGVmYXVsdF9zdHIsIDUxMiwgMTAyNCwgNDA5NiB9LAorCXsgZGVmYXVsdF9zdHIsCSAzLCAxMDI0LCA4MTkyIH0sCisJeyAiam91cm5hbCIsCSAwLCA0MDk2LCA4MTkyIH0sCisJeyAibmV3cyIsCSAwLCA0MDk2LCA0MDk2IH0sCisJeyAibGFyZ2VmaWxlIiwJIDAsIDQwOTYsIDEwMjQgKiAxMDI0IH0sCisJeyAibGFyZ2VmaWxlNCIsICAwLCA0MDk2LCA0MDk2ICogMTAyNCB9LAorCXsgMCwJCSAwLCAgICAwLCAwfSwKK307CisKK3N0YXRpYyB2b2lkIHNldF9mc19kZWZhdWx0cyhjb25zdCBjaGFyICpmc190eXBlLAorCQkJICAgIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzdXBlciwKKwkJCSAgICBpbnQgYmxvY2tzaXplLCBpbnQgc2VjdG9yX3NpemUsCisJCQkgICAgaW50ICppbm9kZV9yYXRpbykKK3sKKwlpbnQJbWVnczsKKwlpbnQJcmF0aW8gPSAwOworCWNvbnN0IHN0cnVjdCBta2UyZnNfZGVmYXVsdHMgKnA7CisJaW50CXVzZV9ic2l6ZSA9IDEwMjQ7CisKKwltZWdzID0gc3VwZXItPnNfYmxvY2tzX2NvdW50ICogKEVYVDJfQkxPQ0tfU0laRShzdXBlcikgLyAxMDI0KSAvIDEwMjQ7CisJaWYgKGlub2RlX3JhdGlvKQorCQlyYXRpbyA9ICppbm9kZV9yYXRpbzsKKwlpZiAoIWZzX3R5cGUpCisJCWZzX3R5cGUgPSBkZWZhdWx0X3N0cjsKKwlmb3IgKHAgPSBzZXR0aW5nczsgcC0+dHlwZTsgcCsrKSB7CisJCWlmICgoc3RyY21wKHAtPnR5cGUsIGZzX3R5cGUpICE9IDApICYmCisJCSAgICAoc3RyY21wKHAtPnR5cGUsIGRlZmF1bHRfc3RyKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHAtPnNpemUgIT0gMCkgJiYgKG1lZ3MgPiBwLT5zaXplKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmF0aW8gPT0gMCkKKwkJCSppbm9kZV9yYXRpbyA9IHAtPmlub2RlX3JhdGlvIDwgYmxvY2tzaXplID8KKwkJCQlibG9ja3NpemUgOiBwLT5pbm9kZV9yYXRpbzsKKwkJdXNlX2JzaXplID0gcC0+YmxvY2tzaXplOworCX0KKwlpZiAoYmxvY2tzaXplIDw9IDApIHsKKwkJaWYgKHVzZV9ic2l6ZSA9PSBERUZfTUFYX0JMT0NLU0laRSkgeworCQkJdXNlX2JzaXplID0gc3lzX3BhZ2Vfc2l6ZTsKKwkJCWlmICgobGludXhfdmVyc2lvbl9jb2RlIDwgKDIqNjU1MzYgKyA2KjI1NikpICYmCisJCQkgICAgKHVzZV9ic2l6ZSA+IDQwOTYpKQorCQkJCXVzZV9ic2l6ZSA9IDQwOTY7CisJCX0KKwkJaWYgKHNlY3Rvcl9zaXplICYmIHVzZV9ic2l6ZSA8IHNlY3Rvcl9zaXplKQorCQkJdXNlX2JzaXplID0gc2VjdG9yX3NpemU7CisJCWlmICgoYmxvY2tzaXplIDwgMCkgJiYgKHVzZV9ic2l6ZSA8ICgtYmxvY2tzaXplKSkpCisJCQl1c2VfYnNpemUgPSAtYmxvY2tzaXplOworCQlibG9ja3NpemUgPSB1c2VfYnNpemU7CisJCXN1cGVyLT5zX2Jsb2Nrc19jb3VudCAvPSBibG9ja3NpemUgLyAxMDI0OworCX0KKwlzdXBlci0+c19sb2dfZnJhZ19zaXplID0gc3VwZXItPnNfbG9nX2Jsb2NrX3NpemUgPQorCQlpbnRfbG9nMihibG9ja3NpemUgPj4gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworfQorCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlYWRfYmJfZmlsZSBhbmQgdGVzdF9kaXNrCisgKi8KK3N0YXRpYyB2b2lkIGludmFsaWRfYmxvY2soZXh0Ml9maWxzeXMgZnMgRVhUMkZTX0FUVFIoKHVudXNlZCkpLCBibGtfdCBibGspCit7CisJYmJfZXJyb3JfbXNnKCJCYWQgYmxvY2sgJXUgb3V0IG9mIHJhbmdlOyBpZ25vcmVkIiwgYmxrKTsKK30KKworLyoKKyAqIEJ1c3lib3ggc3R1ZmYKKyAqLworc3RhdGljIHZvaWQgbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKGludCByZXR2YWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgdm9pZCBta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUoaW50IHJldHZhbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCWlmIChyZXR2YWwpIHsKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5Db3VsZCBub3QgIik7CisJCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwkJdmFfZW5kKGFwKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWtlMmZzX3ZlcmJvc2UoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK3N0YXRpYyB2b2lkIG1rZTJmc192ZXJib3NlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwlpZiAoIXF1aWV0KSB7CisJCXZhX3N0YXJ0KGFwLCBmbXQpOworCQl2ZnByaW50ZihzdGRvdXQsIGZtdCwgYXApOworCQlmZmx1c2goc3Rkb3V0KTsKKwkJdmFfZW5kKGFwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1rZTJmc192ZXJib3NlX2RvbmUodm9pZCkKK3sKKwlta2UyZnNfdmVyYm9zZSgiZG9uZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIG1rZTJmc193YXJuaW5nX21zZyhpbnQgcmV0dmFsLCBjaGFyICpmbXQsIC4uLiApIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK3N0YXRpYyB2b2lkIG1rZTJmc193YXJuaW5nX21zZyhpbnQgcmV0dmFsLCBjaGFyICpmbXQsIC4uLiApCit7CisJdmFfbGlzdCBhcDsKKworCWlmIChyZXR2YWwpIHsKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5XYXJuaW5nOiAiKTsKKwkJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQl2YV9lbmQoYXApOworCX0KK30KKworLyoKKyAqIFJlYWRzIHRoZSBiYWQgYmxvY2tzIGxpc3QgZnJvbSBhIGZpbGUKKyAqLworc3RhdGljIHZvaWQgcmVhZF9iYl9maWxlKGV4dDJfZmlsc3lzIGZzLCBiYWRibG9ja3NfbGlzdCAqYmJfbGlzdCwKKwkJCSBjb25zdCBjaGFyICpiYWRfYmxvY2tzX2ZpbGUpCit7CisJRklMRQkJKmY7CisJZXJyY29kZV90CXJldHZhbDsKKworCWYgPSB4Zm9wZW5fZm9yX3JlYWQoYmFkX2Jsb2Nrc19maWxlKTsKKwlyZXR2YWwgPSBleHQyZnNfcmVhZF9iYl9GSUxFKGZzLCBmLCBiYl9saXN0LCBpbnZhbGlkX2Jsb2NrKTsKKwlmY2xvc2UgKGYpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJyZWFkIGJhZCBibG9ja3MgZnJvbSBsaXN0Iik7Cit9CisKKy8qCisgKiBSdW5zIHRoZSBiYWRibG9ja3MgcHJvZ3JhbSB0byB0ZXN0IHRoZSBkaXNrCisgKi8KK3N0YXRpYyB2b2lkIHRlc3RfZGlzayhleHQyX2ZpbHN5cyBmcywgYmFkYmxvY2tzX2xpc3QgKmJiX2xpc3QpCit7CisJRklMRQkJKmY7CisJZXJyY29kZV90CXJldHZhbDsKKwljaGFyCQlidWZbMTAyNF07CisKKwlzcHJpbnRmKGJ1ZiwgImJhZGJsb2NrcyAtYiAlZCAlcyVzJXMgJWQiLCBmcy0+YmxvY2tzaXplLAorCQlxdWlldCA/ICIiIDogIi1zICIsIChjZmxhZyA+IDEpID8gIi13ICIgOiAiIiwKKwkJZnMtPmRldmljZV9uYW1lLCBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50KTsKKwlta2UyZnNfdmVyYm9zZSgiUnVubmluZyBjb21tYW5kOiAlc1xuIiwgYnVmKTsKKwlmID0gcG9wZW4oYnVmLCAiciIpOworCWlmICghZikgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJ1biAnJXMnIiwgYnVmKTsKKwl9CisJcmV0dmFsID0gZXh0MmZzX3JlYWRfYmJfRklMRShmcywgZiwgYmJfbGlzdCwgaW52YWxpZF9ibG9jayk7CisJcGNsb3NlKGYpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJyZWFkIGJhZCBibG9ja3MgZnJvbSBwcm9ncmFtIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYWRfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLCBiYWRibG9ja3NfbGlzdCBiYl9saXN0KQoreworCWRncnBfdAkJCWk7CisJYmxrX3QJCQlqOworCXVuc2lnbmVkCQltdXN0X2JlX2dvb2Q7CisJYmxrX3QJCQlibGs7CisJYmFkYmxvY2tzX2l0ZXJhdGUJYmJfaXRlcjsKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlibGtfdAkJCWdyb3VwX2Jsb2NrOworCWludAkJCWdyb3VwOworCWludAkJCWdyb3VwX2JhZDsKKworCWlmICghYmJfbGlzdCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGUgcHJpbWFyeSBzdXBlcmJsb2NrIGFuZCBncm91cCBkZXNjcmlwdG9ycyAqbXVzdCogYmUKKwkgKiBnb29kOyBpZiBub3QsIGFib3J0LgorCSAqLworCW11c3RfYmVfZ29vZCA9IGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrICsgMSArIGZzLT5kZXNjX2Jsb2NrczsKKwlmb3IgKGkgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jazsgaSA8PSBtdXN0X2JlX2dvb2Q7IGkrKykgeworCQlpZiAoZXh0MmZzX2JhZGJsb2Nrc19saXN0X3Rlc3QoYmJfbGlzdCwgaSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCSJCbG9jayAlZCBpbiBwcmltYXJ5IHN1cGVyYmxvY2svZ3JvdXAgZGVzY3JpcHRvciBhcmVhIGJhZFxuIgorCQkJCSJCbG9ja3MgJWQgdGhyb3VnaCAlZCBtdXN0IGJlIGdvb2QgaW4gb3JkZXIgdG8gYnVpbGQgYSBmaWxlc3lzdGVtXG4iCisJCQkJIkFib3J0aW5nIC4uLiIsIGksIGZzLT5zdXBlci0+c19maXJzdF9kYXRhX2Jsb2NrLCBtdXN0X2JlX2dvb2QpOworCQl9CisJfQorCisJLyoKKwkgKiBTZWUgaWYgYW55IG9mIHRoZSBiYWQgYmxvY2tzIGFyZSBzaG93aW5nIHVwIGluIHRoZSBiYWNrdXAKKwkgKiBzdXBlcmJsb2NrcyBhbmQvb3IgZ3JvdXAgZGVzY3JpcHRvcnMuICBJZiBzbywgaXNzdWUgYQorCSAqIHdhcm5pbmcgYW5kIGFkanVzdCB0aGUgYmxvY2sgY291bnRzIGFwcHJvcHJpYXRlbHkuCisJICovCisJZ3JvdXBfYmxvY2sgPSBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jayArCisJCWZzLT5zdXBlci0+c19ibG9ja3NfcGVyX2dyb3VwOworCisJZm9yIChpID0gMTsgaSA8IGZzLT5ncm91cF9kZXNjX2NvdW50OyBpKyspIHsKKwkJZ3JvdXBfYmFkID0gMDsKKwkJZm9yIChqPTA7IGogPCBmcy0+ZGVzY19ibG9ja3MrMTsgaisrKSB7CisJCQlpZiAoZXh0MmZzX2JhZGJsb2Nrc19saXN0X3Rlc3QoYmJfbGlzdCwKKwkJCQkJCSAgICAgICBncm91cF9ibG9jayArIGopKSB7CisJCQkJbWtlMmZzX3dhcm5pbmdfbXNnKCFncm91cF9iYWQsCisJCQkJCSJ0aGUgYmFja3VwIHN1cGVyYmxvY2svZ3JvdXAgZGVzY3JpcHRvcnMgYXQgYmxvY2sgJWQgY29udGFpblxuIgorCQkJCQkiYmFkIGJsb2Nrc1xuIiwgZ3JvdXBfYmxvY2spOworCQkJCWdyb3VwX2JhZCsrOworCQkJCWdyb3VwID0gZXh0MmZzX2dyb3VwX29mX2JsayhmcywgZ3JvdXBfYmxvY2sraik7CisJCQkJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2ZyZWVfYmxvY2tzX2NvdW50Kys7CisJCQkJZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50Kys7CisJCQl9CisJCX0KKwkJZ3JvdXBfYmxvY2sgKz0gZnMtPnN1cGVyLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJfQorCisJLyoKKwkgKiBNYXJrIGFsbCB0aGUgYmFkIGJsb2NrcyBhcyB1c2VkLi4uCisJICovCisJcmV0dmFsID0gZXh0MmZzX2JhZGJsb2Nrc19saXN0X2l0ZXJhdGVfYmVnaW4oYmJfbGlzdCwgJmJiX2l0ZXIpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJtYXJrIGJhZCBibG9ja3MgYXMgdXNlZCIpOworCisJd2hpbGUgKGV4dDJmc19iYWRibG9ja3NfbGlzdF9pdGVyYXRlKGJiX2l0ZXIsICZibGspKQorCQlleHQyZnNfbWFya19ibG9ja19iaXRtYXAoZnMtPmJsb2NrX21hcCwgYmxrKTsKKwlleHQyZnNfYmFkYmxvY2tzX2xpc3RfaXRlcmF0ZV9lbmQoYmJfaXRlcik7Cit9CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IGEgZ2VuZXJhbGl6ZWQgcHJvZ3Jlc3MgbWV0ZXIuCisgKi8KK3N0cnVjdCBwcm9ncmVzc19zdHJ1Y3QgeworCWNoYXIJCWZvcm1hdFsyMF07CisJY2hhcgkJYmFja3VwWzgwXTsKKwlfX3UzMgkJbWF4OworCWludAkJc2tpcF9wcm9ncmVzczsKK307CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX2luaXQoc3RydWN0IHByb2dyZXNzX3N0cnVjdCAqcHJvZ3Jlc3MsCisJCQkgIGNvbnN0IGNoYXIgKmxhYmVsLF9fdTMyIG1heCkKK3sKKwlpbnQJaTsKKworCW1lbXNldChwcm9ncmVzcywgMCwgc2l6ZW9mKHN0cnVjdCBwcm9ncmVzc19zdHJ1Y3QpKTsKKwlpZiAocXVpZXQpCisJCXJldHVybjsKKworCS8qCisJICogRmlndXJlIG91dCBob3cgbWFueSBkaWdpdHMgd2UgbmVlZAorCSAqLworCWkgPSBpbnRfbG9nMTAobWF4KTsKKwlzcHJpbnRmKHByb2dyZXNzLT5mb3JtYXQsICIlJSVkZC8lJSVkbGQiLCBpLCBpKTsKKwltZW1zZXQocHJvZ3Jlc3MtPmJhY2t1cCwgJ1xiJywgc2l6ZW9mKHByb2dyZXNzLT5iYWNrdXApLTEpOworCXByb2dyZXNzLT5iYWNrdXBbc2l6ZW9mKHByb2dyZXNzLT5iYWNrdXApLTFdID0gMDsKKwlpZiAoKDIqaSkrMSA8IChpbnQpIHNpemVvZihwcm9ncmVzcy0+YmFja3VwKSkKKwkJcHJvZ3Jlc3MtPmJhY2t1cFsoMippKSsxXSA9IDA7CisJcHJvZ3Jlc3MtPm1heCA9IG1heDsKKworCXByb2dyZXNzLT5za2lwX3Byb2dyZXNzID0gMDsKKwlpZiAoZ2V0ZW52KCJNS0UyRlNfU0tJUF9QUk9HUkVTUyIpKQorCQlwcm9ncmVzcy0+c2tpcF9wcm9ncmVzcysrOworCisJZnB1dHMobGFiZWwsIHN0ZG91dCk7CisJZmZsdXNoKHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX3VwZGF0ZShzdHJ1Y3QgcHJvZ3Jlc3Nfc3RydWN0ICpwcm9ncmVzcywgX191MzIgdmFsKQoreworCWlmICgocHJvZ3Jlc3MtPmZvcm1hdFswXSA9PSAwKSB8fCBwcm9ncmVzcy0+c2tpcF9wcm9ncmVzcykKKwkJcmV0dXJuOworCXByaW50Zihwcm9ncmVzcy0+Zm9ybWF0LCB2YWwsIHByb2dyZXNzLT5tYXgpOworCWZwdXRzKHByb2dyZXNzLT5iYWNrdXAsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX2Nsb3NlKHN0cnVjdCBwcm9ncmVzc19zdHJ1Y3QgKnByb2dyZXNzKQoreworCWlmIChwcm9ncmVzcy0+Zm9ybWF0WzBdID09IDApCisJCXJldHVybjsKKwlwcmludGYoIiUtMjhzXG4iLCAiZG9uZSIpOworfQorCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggemVyb3Mgb3V0IF9udW1fIGJsb2NrcyBzdGFydGluZyBhdCBfYmxrXy4gIEluCisgKiBjYXNlIG9mIGFuIGVycm9yLCB0aGUgZGV0YWlscyBvZiB0aGUgZXJyb3IgaXMgcmV0dXJuZWQgdmlhIF9yZXRfYmxrXworICogYW5kIF9yZXRfY291bnRfIGlmIHRoZXkgYXJlIG5vbi1OVUxMIHBvaW50ZXJzLiAgUmV0dXJucyAwIG9uCisgKiBzdWNjZXNzLCBhbmQgYW4gZXJyb3IgY29kZSBvbiBhbiBlcnJvci4KKyAqCisgKiBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIE5VTEwsIHRoZW4gaXQgd2lsbAorICogYXR0ZW1wdCB0byBmcmVlIHRoZSBzdGF0aWMgemVyb2l6aW5nIGJ1ZmZlci4gIChUaGlzIGlzIHRvIGtlZXAKKyAqIHByb2dyYW1zIHRoYXQgY2hlY2sgZm9yIG1lbW9yeSBsZWFrcyBoYXBweS4pCisgKi8KK3N0YXRpYyBlcnJjb2RlX3QgemVyb19ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGJsa190IGJsaywgaW50IG51bSwKKwkJCSAgICAgc3RydWN0IHByb2dyZXNzX3N0cnVjdCAqcHJvZ3Jlc3MsCisJCQkgICAgIGJsa190ICpyZXRfYmxrLCBpbnQgKnJldF9jb3VudCkKK3sKKwlpbnQJCWosIGNvdW50LCBuZXh0X3VwZGF0ZSwgbmV4dF91cGRhdGVfaW5jcjsKKwlzdGF0aWMgY2hhcgkqYnVmOworCWVycmNvZGVfdAlyZXR2YWw7CisKKwkvKiBJZiBmcyBpcyBudWxsLCBjbGVhbiB1cCB0aGUgc3RhdGljIGJ1ZmZlciBhbmQgcmV0dXJuICovCisJaWYgKCFmcykgeworCQlpZiAoYnVmKSB7CisJCQlmcmVlKGJ1Zik7CisJCQlidWYgPSAwOworCQl9CisJCXJldHVybiAwOworCX0KKwkvKiBBbGxvY2F0ZSB0aGUgemVyb2l6aW5nIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIWJ1ZikgeworCQlidWYgPSB4emFsbG9jKGZzLT5ibG9ja3NpemUgKiBTVFJJREVfTEVOR1RIKTsKKwl9CisJLyogT0ssIGRvIHRoZSB3cml0ZSBsb29wICovCisJbmV4dF91cGRhdGUgPSAwOworCW5leHRfdXBkYXRlX2luY3IgPSBudW0gLyAxMDA7CisJaWYgKG5leHRfdXBkYXRlX2luY3IgPCAxKQorCQluZXh0X3VwZGF0ZV9pbmNyID0gMTsKKwlmb3IgKGo9MDsgaiA8IG51bTsgaiArPSBTVFJJREVfTEVOR1RILCBibGsgKz0gU1RSSURFX0xFTkdUSCkgeworCQljb3VudCA9IG51bSAtIGo7CisJCWlmIChjb3VudCA+IFNUUklERV9MRU5HVEgpCisJCQljb3VudCA9IFNUUklERV9MRU5HVEg7CisJCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgYmxrLCBjb3VudCwgYnVmKTsKKwkJaWYgKHJldHZhbCkgeworCQkJaWYgKHJldF9jb3VudCkKKwkJCQkqcmV0X2NvdW50ID0gY291bnQ7CisJCQlpZiAocmV0X2JsaykKKwkJCQkqcmV0X2JsayA9IGJsazsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJaWYgKHByb2dyZXNzICYmIGogPiBuZXh0X3VwZGF0ZSkgeworCQkJbmV4dF91cGRhdGUgKz0gbnVtIC8gMTAwOworCQkJcHJvZ3Jlc3NfdXBkYXRlKHByb2dyZXNzLCBibGspOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pbm9kZV90YWJsZXMoZXh0Ml9maWxzeXMgZnMpCit7CisJZXJyY29kZV90CXJldHZhbDsKKwlibGtfdAkJYmxrOworCWRncnBfdAkJaTsKKwlpbnQJCW51bTsKKwlzdHJ1Y3QgcHJvZ3Jlc3Nfc3RydWN0IHByb2dyZXNzOworCisJaWYgKHF1aWV0KQorCQltZW1zZXQoJnByb2dyZXNzLCAwLCBzaXplb2YocHJvZ3Jlc3MpKTsKKwllbHNlCisJCXByb2dyZXNzX2luaXQoJnByb2dyZXNzLCAiV3JpdGluZyBpbm9kZSB0YWJsZXM6ICIsCisJCQkgICAgICBmcy0+Z3JvdXBfZGVzY19jb3VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnMtPmdyb3VwX2Rlc2NfY291bnQ7IGkrKykgeworCQlwcm9ncmVzc191cGRhdGUoJnByb2dyZXNzLCBpKTsKKworCQlibGsgPSBmcy0+Z3JvdXBfZGVzY1tpXS5iZ19pbm9kZV90YWJsZTsKKwkJbnVtID0gZnMtPmlub2RlX2Jsb2Nrc19wZXJfZ3JvdXA7CisKKwkJcmV0dmFsID0gemVyb19ibG9ja3MoZnMsIGJsaywgbnVtLCAwLCAmYmxrLCAmbnVtKTsKKwkJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwKKwkJCSJ3cml0ZSAlZCBibG9ja3MgaW4gaW5vZGUgdGFibGUgc3RhcnRpbmcgYXQgJWQuIiwKKwkJCW51bSwgYmxrKTsKKwkJaWYgKHN5bmNfa2x1ZGdlKSB7CisJCQlpZiAoc3luY19rbHVkZ2UgPT0gMSkKKwkJCQlzeW5jKCk7CisJCQllbHNlIGlmICgoaSAlIHN5bmNfa2x1ZGdlKSA9PSAwKQorCQkJCXN5bmMoKTsKKwkJfQorCX0KKwl6ZXJvX2Jsb2NrcygwLCAwLCAwLCAwLCAwLCAwKTsKKwlwcm9ncmVzc19jbG9zZSgmcHJvZ3Jlc3MpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcm9vdF9kaXIoZXh0Ml9maWxzeXMgZnMpCit7CisJZXJyY29kZV90CQlyZXR2YWw7CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7CisKKwlyZXR2YWwgPSBleHQyZnNfbWtkaXIoZnMsIEVYVDJfUk9PVF9JTk8sIEVYVDJfUk9PVF9JTk8sIDApOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJjcmVhdGUgcm9vdCBkaXIiKTsKKwlpZiAoZ2V0ZXVpZCgpKSB7CisJCXJldHZhbCA9IGV4dDJmc19yZWFkX2lub2RlKGZzLCBFWFQyX1JPT1RfSU5PLCAmaW5vZGUpOworCQlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAicmVhZCByb290IGlub2RlIik7CisJCWlub2RlLmlfdWlkID0gZ2V0dWlkKCk7CisJCWlmIChpbm9kZS5pX3VpZCkKKwkJCWlub2RlLmlfZ2lkID0gZ2V0Z2lkKCk7CisJCXJldHZhbCA9IGV4dDJmc193cml0ZV9uZXdfaW5vZGUoZnMsIEVYVDJfUk9PVF9JTk8sICZpbm9kZSk7CisJCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJzZXQgcm9vdCBpbm9kZSBvd25lcnNoaXAiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9sb3N0X2FuZF9mb3VuZChleHQyX2ZpbHN5cyBmcykKK3sKKwllcnJjb2RlX3QJCXJldHZhbDsKKwlleHQyX2lub190CQlpbm87CisJY29uc3QgY2hhcgkJKm5hbWUgPSAibG9zdCtmb3VuZCI7CisJaW50CQkJaSA9IDE7CisJY2hhcgkJCSptc2cgPSAiY3JlYXRlIjsKKwlpbnQJCQlscGZfc2l6ZSA9IDA7CisKKwlmcy0+dW1hc2sgPSAwNzc7CisJcmV0dmFsID0gZXh0MmZzX21rZGlyKGZzLCBFWFQyX1JPT1RfSU5PLCAwLCBuYW1lKTsKKwlpZiAocmV0dmFsKSB7CisJCWdvdG8gQ1JFQVRFX0xPU1RfQU5EX0ZPVU5EX0VSUk9SOworCX0KKworCXJldHZhbCA9IGV4dDJmc19sb29rdXAoZnMsIEVYVDJfUk9PVF9JTk8sIG5hbWUsIHN0cmxlbihuYW1lKSwgMCwgJmlubyk7CisJaWYgKHJldHZhbCkgeworCQltc2cgPSAibG9va3VwIjsKKwkJZ290byBDUkVBVEVfTE9TVF9BTkRfRk9VTkRfRVJST1I7CisJfQorCisJZm9yICg7IGkgPCBFWFQyX05ESVJfQkxPQ0tTOyBpKyspIHsKKwkJaWYgKChscGZfc2l6ZSArPSBmcy0+YmxvY2tzaXplKSA+PSAxNioxMDI0KQorCQkJYnJlYWs7CisJCXJldHZhbCA9IGV4dDJmc19leHBhbmRfZGlyKGZzLCBpbm8pOworCQltc2cgPSAiZXhwYW5kIjsKK0NSRUFURV9MT1NUX0FORF9GT1VORF9FUlJPUjoKKwkJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgIiVzICVzIiwgbXNnLCBuYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9iYWRfYmxvY2tfaW5vZGUoZXh0Ml9maWxzeXMgZnMsIGJhZGJsb2Nrc19saXN0IGJiX2xpc3QpCit7CisJZXJyY29kZV90CXJldHZhbDsKKworCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLCBFWFQyX0JBRF9JTk8pOworCWZzLT5ncm91cF9kZXNjWzBdLmJnX2ZyZWVfaW5vZGVzX2NvdW50LS07CisJZnMtPnN1cGVyLT5zX2ZyZWVfaW5vZGVzX2NvdW50LS07CisJcmV0dmFsID0gZXh0MmZzX3VwZGF0ZV9iYl9pbm9kZShmcywgYmJfbGlzdCk7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgInNldCBiYWQgYmxvY2sgaW5vZGUiKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXJ2ZV9pbm9kZXMoZXh0Ml9maWxzeXMgZnMpCit7CisJZXh0Ml9pbm9fdAlpOworCWludAkJZ3JvdXA7CisKKwlmb3IgKGkgPSBFWFQyX1JPT1RfSU5PICsgMTsgaSA8IEVYVDJfRklSU1RfSU5PREUoZnMtPnN1cGVyKTsgaSsrKSB7CisJCWV4dDJmc19tYXJrX2lub2RlX2JpdG1hcChmcy0+aW5vZGVfbWFwLCBpKTsKKwkJZ3JvdXAgPSBleHQyZnNfZ3JvdXBfb2ZfaW5vKGZzLCBpKTsKKwkJZnMtPmdyb3VwX2Rlc2NbZ3JvdXBdLmJnX2ZyZWVfaW5vZGVzX2NvdW50LS07CisJCWZzLT5zdXBlci0+c19mcmVlX2lub2Rlc19jb3VudC0tOworCX0KKwlleHQyZnNfbWFya19pYl9kaXJ0eShmcyk7Cit9CisKKyNkZWZpbmUgQlNEX0RJU0tNQUdJQyAgICgweDgyNTY0NTU3VUwpICAvKiBUaGUgZGlzayBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgQlNEX01BR0lDRElTSyAgICgweDU3NDU1NjgyVUwpICAvKiBUaGUgZGlzayBtYWdpYyBudW1iZXIgcmV2ZXJzZWQgKi8KKyNkZWZpbmUgQlNEX0xBQkVMX09GRlNFVCAgICAgICAgNjQKKworc3RhdGljIHZvaWQgemFwX3NlY3RvcihleHQyX2ZpbHN5cyBmcywgaW50IHNlY3QsIGludCBuc2VjdCkKK3sKKwljaGFyICpidWY7CisJY2hhciAqZm10ID0gImNvdWxkIG5vdCAlcyAlZCI7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgKm1hZ2ljOworCisJYnVmID0geG1hbGxvYyg1MTIqbnNlY3QpOworCisJaWYgKHNlY3QgPT0gMCkgeworCQkvKiBDaGVjayBmb3IgYSBCU0QgZGlza2xhYmVsLCBhbmQgZG9uJ3QgZXJhc2UgaXQgaWYgc28gKi8KKwkJcmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2Jsayhmcy0+aW8sIDAsIC01MTIsIGJ1Zik7CisJCWlmIChyZXR2YWwpCisJCQlta2UyZnNfd2FybmluZ19tc2cocmV0dmFsLCBmbXQsICJyZWFkIGJsb2NrIiwgMCk7CisJCWVsc2UgeworCQkJbWFnaWMgPSAodW5zaWduZWQgaW50ICopIChidWYgKyBCU0RfTEFCRUxfT0ZGU0VUKTsKKwkJCWlmICgoKm1hZ2ljID09IEJTRF9ESVNLTUFHSUMpIHx8CisJCQkgICAgKCptYWdpYyA9PSBCU0RfTUFHSUNESVNLKSkKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwltZW1zZXQoYnVmLCAwLCA1MTIqbnNlY3QpOworCWlvX2NoYW5uZWxfc2V0X2Jsa3NpemUoZnMtPmlvLCA1MTIpOworCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywgc2VjdCwgLTUxMipuc2VjdCwgYnVmKTsKKwlpb19jaGFubmVsX3NldF9ibGtzaXplKGZzLT5pbywgZnMtPmJsb2Nrc2l6ZSk7CisJZnJlZShidWYpOworCW1rZTJmc193YXJuaW5nX21zZyhyZXR2YWwsIGZtdCwgImVyYXNlIHNlY3RvciIsIHNlY3QpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfam91cm5hbF9kZXYoZXh0Ml9maWxzeXMgZnMpCit7CisJc3RydWN0IHByb2dyZXNzX3N0cnVjdAlwcm9ncmVzczsKKwllcnJjb2RlX3QJCXJldHZhbDsKKwljaGFyCQkJKmJ1ZjsKKwljaGFyCQkJKmZtdCA9ICIlcyBqb3VybmFsIHN1cGVyYmxvY2siOworCWJsa190CQkJYmxrOworCWludAkJCWNvdW50OworCisJcmV0dmFsID0gZXh0MmZzX2NyZWF0ZV9qb3VybmFsX3N1cGVyYmxvY2soZnMsCisJCQkJICBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50LCAwLCAmYnVmKTsKKwlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCBmbXQsICJpbml0Iik7CisJaWYgKHF1aWV0KQorCQltZW1zZXQoJnByb2dyZXNzLCAwLCBzaXplb2YocHJvZ3Jlc3MpKTsKKwllbHNlCisJCXByb2dyZXNzX2luaXQoJnByb2dyZXNzLCAiWmVyb2luZyBqb3VybmFsIGRldmljZTogIiwKKwkJCSAgICAgIGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQpOworCisJcmV0dmFsID0gemVyb19ibG9ja3MoZnMsIDAsIGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQsCisJCQkgICAgICZwcm9ncmVzcywgJmJsaywgJmNvdW50KTsKKwlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAiemVybyBqb3VybmFsIGRldmljZSAoYmxvY2sgJXUsIGNvdW50ICVkKSIsCisJCQlibGssIGNvdW50KTsKKwl6ZXJvX2Jsb2NrcygwLCAwLCAwLCAwLCAwLCAwKTsKKworCXJldHZhbCA9IGlvX2NoYW5uZWxfd3JpdGVfYmxrKGZzLT5pbywKKwkJCQkgICAgICBmcy0+c3VwZXItPnNfZmlyc3RfZGF0YV9ibG9jaysxLAorCQkJCSAgICAgIDEsIGJ1Zik7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgZm10LCAid3JpdGUiKTsKKwlwcm9ncmVzc19jbG9zZSgmcHJvZ3Jlc3MpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3N0YXRzKGV4dDJfZmlsc3lzIGZzKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzID0gZnMtPnN1cGVyOworCWNoYXIJCQkqb3M7CisJYmxrX3QJCQlncm91cF9ibG9jazsKKwlkZ3JwX3QJCQlpOworCWludAkJCW5lZWQsIGNvbF9sZWZ0OworCisJbWtlMmZzX3dhcm5pbmdfbXNnKChwYXJhbS5zX2Jsb2Nrc19jb3VudCAhPSBzLT5zX2Jsb2Nrc19jb3VudCksCisJCSIlZCBibG9ja3MgdW51c2VkXG4iLCBwYXJhbS5zX2Jsb2Nrc19jb3VudCAtIHMtPnNfYmxvY2tzX2NvdW50KTsKKwlvcyA9IGUycF9vczJzdHJpbmcoZnMtPnN1cGVyLT5zX2NyZWF0b3Jfb3MpOworCXByaW50ZigJIkZpbGVzeXN0ZW0gbGFiZWw9JS4qc1xuIgorCQkJIk9TIHR5cGU6ICVzXG4iCisJCQkiQmxvY2sgc2l6ZT0ldSAobG9nPSV1KVxuIgorCQkJIkZyYWdtZW50IHNpemU9JXUgKGxvZz0ldSlcbiIKKwkJCSIldSBpbm9kZXMsICV1IGJsb2Nrc1xuIgorCQkJIiV1IGJsb2NrcyAoJTIuMmYlJSkgcmVzZXJ2ZWQgZm9yIHRoZSBzdXBlciB1c2VyXG4iCisJCQkiRmlyc3QgZGF0YSBibG9jaz0ldVxuIiwKKwkJCShpbnQpIHNpemVvZihzLT5zX3ZvbHVtZV9uYW1lKSwKKwkJCXMtPnNfdm9sdW1lX25hbWUsCisJCQlvcywKKwkJCWZzLT5ibG9ja3NpemUsIHMtPnNfbG9nX2Jsb2NrX3NpemUsCisJCQlmcy0+ZnJhZ3NpemUsIHMtPnNfbG9nX2ZyYWdfc2l6ZSwKKwkJCXMtPnNfaW5vZGVzX2NvdW50LCBzLT5zX2Jsb2Nrc19jb3VudCwKKwkJCXMtPnNfcl9ibG9ja3NfY291bnQsIDEwMC4wICogcy0+c19yX2Jsb2Nrc19jb3VudCAvIHMtPnNfYmxvY2tzX2NvdW50LAorCQkJcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlmcmVlKG9zKTsKKwlpZiAocy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSB7CisJCXByaW50ZigiTWF4aW11bSBmaWxlc3lzdGVtIGJsb2Nrcz0lbHVcbiIsCisJCSAgICAgICAocy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzICsgZnMtPmRlc2NfYmxvY2tzKSAqCisJCSAgICAgICAoZnMtPmJsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKSkgKgorCQkgICAgICAgcy0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwl9CisJcHJpbnRmKAkiJXUgYmxvY2sgZ3JvdXAlc1xuIgorCQkJIiV1IGJsb2NrcyBwZXIgZ3JvdXAsICV1IGZyYWdtZW50cyBwZXIgZ3JvdXBcbiIKKwkJCSIldSBpbm9kZXMgcGVyIGdyb3VwXG4iLAorCQkJZnMtPmdyb3VwX2Rlc2NfY291bnQsIChmcy0+Z3JvdXBfZGVzY19jb3VudCA+IDEpID8gInMiIDogIiIsCisJCQlzLT5zX2Jsb2Nrc19wZXJfZ3JvdXAsIHMtPnNfZnJhZ3NfcGVyX2dyb3VwLAorCQkJcy0+c19pbm9kZXNfcGVyX2dyb3VwKTsKKwlpZiAoZnMtPmdyb3VwX2Rlc2NfY291bnQgPT0gMSkgeworCQliYl9wdXRjaGFyKCdcbicpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJTdXBlcmJsb2NrIGJhY2t1cHMgc3RvcmVkIG9uIGJsb2NrczogIik7CisJZ3JvdXBfYmxvY2sgPSBzLT5zX2ZpcnN0X2RhdGFfYmxvY2s7CisJY29sX2xlZnQgPSAwOworCWZvciAoaSA9IDE7IGkgPCBmcy0+Z3JvdXBfZGVzY19jb3VudDsgaSsrKSB7CisJCWdyb3VwX2Jsb2NrICs9IHMtPnNfYmxvY2tzX3Blcl9ncm91cDsKKwkJaWYgKCFleHQyZnNfYmdfaGFzX3N1cGVyKGZzLCBpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaSAhPSAxKQorCQkJcHJpbnRmKCIsICIpOworCQluZWVkID0gaW50X2xvZzEwKGdyb3VwX2Jsb2NrKSArIDI7CisJCWlmIChuZWVkID4gY29sX2xlZnQpIHsKKwkJCXByaW50ZigiXG5cdCIpOworCQkJY29sX2xlZnQgPSA3MjsKKwkJfQorCQljb2xfbGVmdCAtPSBuZWVkOworCQlwcmludGYoIiV1IiwgZ3JvdXBfYmxvY2spOworCX0KKwlwdXRzKCJcbiIpOworfQorCisvKgorICogU2V0IHRoZSBTX0NSRUFUT1JfT1MgZmllbGQuICBSZXR1cm4gdHJ1ZSBpZiBPUyBpcyBrbm93biwKKyAqIG90aGVyd2lzZSwgMC4KKyAqLworc3RhdGljIGludCBzZXRfb3Moc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcykKK3sKKwlpZiAoaXNkaWdpdCAoKm9zKSkgeworCQlzYi0+c19jcmVhdG9yX29zID0gYXRvaShvcyk7CisJCXJldHVybiAxOworCX0KKworCWlmICgoc2ItPnNfY3JlYXRvcl9vcyA9IGUycF9zdHJpbmcyb3Mob3MpKSA+PSAwKSB7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoIkdOVSIsIG9zKSkgeworCQlzYi0+c19jcmVhdG9yX29zID0gRVhUMl9PU19IVVJEOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2V4dGVuZGVkX29wdHMoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiX3BhcmFtLAorCQkJCWNvbnN0IGNoYXIgKm9wdHMpCit7CisJY2hhcgkqYnVmLCAqdG9rZW4sICpuZXh0LCAqcCwgKmFyZzsKKwlpbnQJcl91c2FnZSA9IDA7CisKKwlidWYgPSB4c3RyZHVwKG9wdHMpOworCWZvciAodG9rZW4gPSBidWY7IHRva2VuICYmICp0b2tlbjsgdG9rZW4gPSBuZXh0KSB7CisJCXAgPSBzdHJjaHIodG9rZW4sICcsJyk7CisJCW5leHQgPSAwOworCQlpZiAocCkgeworCQkJKnAgPSAwOworCQkJbmV4dCA9IHArMTsKKwkJfQorCQlhcmcgPSBzdHJjaHIodG9rZW4sICc9Jyk7CisJCWlmIChhcmcpIHsKKwkJCSphcmcgPSAwOworCQkJYXJnKys7CisJCX0KKwkJaWYgKHN0cmNtcCh0b2tlbiwgInN0cmlkZSIpID09IDApIHsKKwkJCWlmICghYXJnKSB7CisJCQkJcl91c2FnZSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnNfc3RyaWRlID0gc3RydG91bChhcmcsICZwLCAwKTsKKwkJCWlmICgqcCB8fCAoZnNfc3RyaWRlID09IDApKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJJbnZhbGlkIHN0cmlkZSBwYXJhbWV0ZXI6ICVzIiwgYXJnKTsKKwkJCQlyX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgInJlc2l6ZSIpKSB7CisJCQl1bnNpZ25lZCBsb25nIHJlc2l6ZSwgYnBnLCByc3ZfZ3JvdXBzOworCQkJdW5zaWduZWQgbG9uZyBncm91cF9kZXNjX2NvdW50LCBkZXNjX2Jsb2NrczsKKwkJCXVuc2lnbmVkIGludCBnZHBiLCBibG9ja3NpemU7CisJCQlpbnQgcnN2X2dkYjsKKworCQkJaWYgKCFhcmcpIHsKKwkJCQlyX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXJlc2l6ZSA9IHBhcnNlX251bV9ibG9ja3MoYXJnLAorCQkJCQkJICBzYl9wYXJhbS0+c19sb2dfYmxvY2tfc2l6ZSk7CisKKwkJCWlmIChyZXNpemUgPT0gMCkgeworCQkJCWJiX2Vycm9yX21zZygiSW52YWxpZCByZXNpemUgcGFyYW1ldGVyOiAlcyIsIGFyZyk7CisJCQkJcl91c2FnZSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHJlc2l6ZSA8PSBzYl9wYXJhbS0+c19ibG9ja3NfY291bnQpIHsKKwkJCQliYl9lcnJvcl9tc2coIlRoZSByZXNpemUgbWF4aW11bSBtdXN0IGJlIGdyZWF0ZXIgIgorCQkJCQkJInRoYW4gdGhlIGZpbGVzeXN0ZW0gc2l6ZSIpOworCQkJCXJfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJYmxvY2tzaXplID0gRVhUMl9CTE9DS19TSVpFKHNiX3BhcmFtKTsKKwkJCWJwZyA9IHNiX3BhcmFtLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJCQlpZiAoIWJwZykKKwkJCQlicGcgPSBibG9ja3NpemUgKiA4OworCQkJZ2RwYiA9IGJsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKTsKKwkJCWdyb3VwX2Rlc2NfY291bnQgPSAoc2JfcGFyYW0tPnNfYmxvY2tzX2NvdW50ICsKKwkJCQkJICAgIGJwZyAtIDEpIC8gYnBnOworCQkJZGVzY19ibG9ja3MgPSAoZ3JvdXBfZGVzY19jb3VudCArCisJCQkJICAgICAgIGdkcGIgLSAxKSAvIGdkcGI7CisJCQlyc3ZfZ3JvdXBzID0gKHJlc2l6ZSArIGJwZyAtIDEpIC8gYnBnOworCQkJcnN2X2dkYiA9IChyc3ZfZ3JvdXBzICsgZ2RwYiAtIDEpIC8gZ2RwYiAtCisJCQkJZGVzY19ibG9ja3M7CisJCQlpZiAocnN2X2dkYiA+IEVYVDJfQUREUl9QRVJfQkxPQ0soc2JfcGFyYW0pKQorCQkJCXJzdl9nZGIgPSBFWFQyX0FERFJfUEVSX0JMT0NLKHNiX3BhcmFtKTsKKworCQkJaWYgKHJzdl9nZGIgPiAwKSB7CisJCQkJc2JfcGFyYW0tPnNfZmVhdHVyZV9jb21wYXQgfD0KKwkJCQkJRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREU7CisKKwkJCQlzYl9wYXJhbS0+c19yZXNlcnZlZF9nZHRfYmxvY2tzID0gcnN2X2dkYjsKKwkJCX0KKwkJfSBlbHNlCisJCQlyX3VzYWdlKys7CisJfQorCWlmIChyX3VzYWdlKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJIlxuQmFkIG9wdGlvbnMgc3BlY2lmaWVkLlxuXG4iCisJCQkiRXh0ZW5kZWQgb3B0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgIgorCQkJImFuZCBtYXkgdGFrZSBhbiBhcmd1bWVudCB3aGljaFxuIgorCQkJIlx0aXMgc2V0IG9mZiBieSBhbiBlcXVhbHMgKCc9Jykgc2lnbi5cblxuIgorCQkJIlZhbGlkIGV4dGVuZGVkIG9wdGlvbnMgYXJlOlxuIgorCQkJIlx0c3RyaWRlPTxzdHJpZGUgbGVuZ3RoIGluIGJsb2Nrcz5cbiIKKwkJCSJcdHJlc2l6ZT08cmVzaXplIG1heGltdW0gc2l6ZSBpbiBibG9ja3M+XG4iKTsKKwl9Cit9CisKK3N0YXRpYyBfX3UzMiBva19mZWF0dXJlc1szXSA9IHsKKwlFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMIHwKKwkJRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUgfAorCQlFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCwgIC8qIENvbXBhdCAqLworCUVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXwgICAgICAgICAvKiBJbmNvbXBhdCAqLworCQlFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVZ8CisJCUVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHLAorCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSICAgICAvKiBSL08gY29tcGF0ICovCit9OworCitzdGF0aWMgaW50IFBSUyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50CQljOworCWludAkJc2l6ZTsKKwljaGFyICoJCXRtcDsKKwlpbnQJCWJsb2Nrc2l6ZSA9IDA7CisJaW50CQlpbm9kZV9yYXRpbyA9IDA7CisJaW50CQlpbm9kZV9zaXplID0gMDsKKwlpbnQJCXJlc2VydmVkX3JhdGlvID0gNTsKKwlpbnQJCXNlY3Rvcl9zaXplID0gMDsKKwlpbnQJCXNob3dfdmVyc2lvbl9vbmx5ID0gMDsKKwlleHQyX2lub190CW51bV9pbm9kZXMgPSAwOworCWVycmNvZGVfdAlyZXR2YWw7CisJY2hhciAqCQlleHRlbmRlZF9vcHRzID0gTlVMTDsKKwljb25zdCBjaGFyICoJZnNfdHlwZSA9IE5VTEw7CisJYmxrX3QJCWRldl9zaXplOworCWxvbmcJCXN5c3ZhbDsKKworCS8qIFVwZGF0ZSBvdXIgUEFUSCB0byBpbmNsdWRlIC9zYmluICAqLworCWUyZnNfc2V0X3NiaW5fcGF0aCgpOworCisJdG1wID0gZ2V0ZW52KCJNS0UyRlNfU1lOQyIpOworCWlmICh0bXApCisJCXN5bmNfa2x1ZGdlID0gYXRvaSh0bXApOworCisJLyogRGV0ZXJtaW5lIHRoZSBzeXN0ZW0gcGFnZSBzaXplIGlmIHBvc3NpYmxlICovCisjaWYgKCFkZWZpbmVkKF9TQ19QQUdFU0laRSkgJiYgZGVmaW5lZChfU0NfUEFHRV9TSVpFKSkKKyNkZWZpbmUgX1NDX1BBR0VTSVpFIF9TQ19QQUdFX1NJWkUKKyNlbmRpZgorI2lmZGVmIF9TQ19QQUdFU0laRQorCXN5c3ZhbCA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwlpZiAoc3lzdmFsID4gMCkKKwkJc3lzX3BhZ2Vfc2l6ZSA9IHN5c3ZhbDsKKyNlbmRpZiAvKiBfU0NfUEFHRVNJWkUgKi8KKworCXNldGJ1ZihzdGRvdXQsIE5VTEwpOworCXNldGJ1ZihzdGRlcnIsIE5VTEwpOworCW1lbXNldCgmcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jaykpOworCXBhcmFtLnNfcmV2X2xldmVsID0gMTsgIC8qIENyZWF0ZSByZXZpc2lvbiAxIGZpbGVzeXN0ZW1zIG5vdyAqLworCXBhcmFtLnNfZmVhdHVyZV9pbmNvbXBhdCB8PSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEU7CisJcGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCB8PSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUjsKKworI2lmZGVmIF9fbGludXhfXworCWxpbnV4X3ZlcnNpb25fY29kZSA9IGdldF9saW51eF92ZXJzaW9uX2NvZGUoKTsKKwlpZiAobGludXhfdmVyc2lvbl9jb2RlICYmIGxpbnV4X3ZlcnNpb25fY29kZSA8IEtFUk5FTF9WRVJTSU9OKDIsMiwwKSkgeworCQlwYXJhbS5zX3Jldl9sZXZlbCA9IDA7CisJCXBhcmFtLnNfZmVhdHVyZV9pbmNvbXBhdCA9IDA7CisJCXBhcmFtLnNfZmVhdHVyZV9jb21wYXQgPSAwOworCQlwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0ID0gMDsKKwl9CisjZW5kaWYKKworCS8qIElmIGNhbGxlZCBhcyBta2ZzLmV4dDMsIGNyZWF0ZSBhIGpvdXJuYWwgaW5vZGUgKi8KKwlpZiAobGFzdF9jaGFyX2lzKGFwcGxldF9uYW1lLCAnMycpKQorCQlqb3VybmFsX3NpemUgPSAtMTsKKworCXdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwKKwkJICAgICJiOmNFOmY6ZzppOmpsOm06bm86cXI6UjpzOnR2STpKOlNUOkZMOk06TjpPOlYiKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdiJzoKKwkJCWJsb2Nrc2l6ZSA9IHhhdG91X3JhbmdlKG9wdGFyZywgRVhUMl9NSU5fQkxPQ0tfU0laRSwgRVhUMl9NQVhfQkxPQ0tfU0laRSk7CisJCQlta2UyZnNfd2FybmluZ19tc2coKGJsb2Nrc2l6ZSA+IDQwOTYpLAorCQkJCSJibG9ja3NpemUgJWQgbm90IHVzYWJsZSBvbiBtb3N0IHN5c3RlbXMiLAorCQkJCWJsb2Nrc2l6ZSk7CisJCQlwYXJhbS5zX2xvZ19ibG9ja19zaXplID0KKwkJCQlpbnRfbG9nMihibG9ja3NpemUgPj4gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgkvKiBDaGVjayBmb3IgYmFkIGJsb2NrcyAqLworCQljYXNlICd0JzoJLyogZGVwcmVjYXRlZCAqLworCQkJY2ZsYWcrKzsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXNpemUgPSB4YXRvdV9yYW5nZShvcHRhcmcsIEVYVDJfTUlOX0JMT0NLX1NJWkUsIEVYVDJfTUFYX0JMT0NLX1NJWkUpOworCQkJcGFyYW0uc19sb2dfZnJhZ19zaXplID0KKwkJCQlpbnRfbG9nMihzaXplID4+IEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKTsKKwkJCW1rZTJmc193YXJuaW5nX21zZygxLCAiZnJhZ21lbnRzIG5vdCBzdXBwb3J0ZWQuIElnbm9yaW5nIC1mIG9wdGlvbiIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJcGFyYW0uc19ibG9ja3NfcGVyX2dyb3VwID0geGF0b3UzMihvcHRhcmcpOworCQkJaWYgKChwYXJhbS5zX2Jsb2Nrc19wZXJfZ3JvdXAgJSA4KSAhPSAwKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJsb2NrcyBwZXIgZ3JvdXAgbXVzdCBiZSBtdWx0aXBsZSBvZiA4Iik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQkvKiBIdWg/IGlzICIqIDEwMjQiIGNvcnJlY3Q/ICovCisJCQlpbm9kZV9yYXRpbyA9IHhhdG91X3JhbmdlKG9wdGFyZywgRVhUMl9NSU5fQkxPQ0tfU0laRSwgRVhUMl9NQVhfQkxPQ0tfU0laRSAqIDEwMjQpOworCQkJYnJlYWs7CisJCWNhc2UgJ0onOgorCQkJcGFyc2Vfam91cm5hbF9vcHRzKCZqb3VybmFsX2RldmljZSwgJmpvdXJuYWxfZmxhZ3MsICZqb3VybmFsX3NpemUsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnaic6CisJCQlwYXJhbS5zX2ZlYXR1cmVfY29tcGF0IHw9CisJCQkJRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTDsKKwkJCWlmICgham91cm5hbF9zaXplKQorCQkJCWpvdXJuYWxfc2l6ZSA9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJYmFkX2Jsb2Nrc19maWxlbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCXJlc2VydmVkX3JhdGlvID0geGF0b3VfcmFuZ2Uob3B0YXJnLCAwLCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlub2FjdGlvbisrOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJY3JlYXRvcl9vcyA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXBhcmFtLnNfcmV2X2xldmVsID0geGF0b2lfcG9zaXRpdmUob3B0YXJnKTsKKwkJCWlmIChwYXJhbS5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFVikgeworCQkJCXBhcmFtLnNfZmVhdHVyZV9pbmNvbXBhdCA9IDA7CisJCQkJcGFyYW0uc19mZWF0dXJlX2NvbXBhdCA9IDA7CisJCQkJcGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAncyc6CS8qIGRlcHJlY2F0ZWQgKi8KKwkJCWlmICh4YXRvdShvcHRhcmcpKQorCQkJCXBhcmFtLnNfZmVhdHVyZV9yb19jb21wYXQgfD0KKwkJCQkJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVI7CisJCQllbHNlCisJCQkJcGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCAmPQorCQkJCQl+RVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVI7CisJCQlicmVhazsKKyNpZmRlZiBFWFQyX0RZTkFNSUNfUkVWCisJCWNhc2UgJ0knOgorCQkJaW5vZGVfc2l6ZSA9IHhhdG9pX3Bvc2l0aXZlKG9wdGFyZyk7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlICdOJzoKKwkJCW51bV9pbm9kZXMgPSB4YXRvaV9wb3NpdGl2ZShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJcXVpZXQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJcXVpZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0YnOgorCQkJZm9yY2UgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ0wnOgorCQkJdm9sdW1lX2xhYmVsID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ00nOgorCQkJbW91bnRfZGlyID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ08nOgorCQkJaWYgKCFzdHJjbXAob3B0YXJnLCAibm9uZSIpKSB7CisJCQkJcGFyYW0uc19mZWF0dXJlX2NvbXBhdCA9IDA7CisJCQkJcGFyYW0uc19mZWF0dXJlX2luY29tcGF0ID0gMDsKKwkJCQlwYXJhbS5zX2ZlYXR1cmVfcm9fY29tcGF0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlMnBfZWRpdF9mZWF0dXJlKG9wdGFyZywKKwkJCQkJICAgICZwYXJhbS5zX2ZlYXR1cmVfY29tcGF0LAorCQkJCQkgICAgb2tfZmVhdHVyZXMpKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkludmFsaWQgZmlsZXN5c3RlbSBvcHRpb24gc2V0OiAlcyIsIG9wdGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnRSc6CisJCWNhc2UgJ1InOgorCQkJZXh0ZW5kZWRfb3B0cyA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCXN1cGVyX29ubHkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkJZnNfdHlwZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCS8qIFByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0ICovCisJCQlzaG93X3ZlcnNpb25fb25seSA9IDE7CisJCQlxdWlldCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKwlpZiAoKG9wdGluZCA9PSBhcmdjKSAvKiYmICFzaG93X3ZlcnNpb25fb25seSovKQorCQliYl9zaG93X3VzYWdlKCk7CisJZGV2aWNlX25hbWUgPSBhcmd2W29wdGluZCsrXTsKKworCW1rZTJmc192ZXJib3NlKCJta2UyZnMgJXMgKCVzKVxuIiwgRTJGU1BST0dTX1ZFUlNJT04sIEUyRlNQUk9HU19EQVRFKTsKKworCWlmIChzaG93X3ZlcnNpb25fb25seSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8gYmxvY2tzaXplIHNwZWNpZmllZCBhbmQgdGhlcmUgaXMgYSBqb3VybmFsCisJICogZGV2aWNlLCB1c2UgaXQgdG8gZmlndXJlIG91dCB0aGUgYmxvY2tzaXplCisJICovCisJaWYgKGJsb2Nrc2l6ZSA8PSAwICYmIGpvdXJuYWxfZGV2aWNlKSB7CisJCWV4dDJfZmlsc3lzICAgICBqZnM7CisJCWlvX21hbmFnZXIgICAgICBpb19wdHI7CisKKyNpZmRlZiBDT05GSUdfVEVTVElPX0RFQlVHCisJCWlvX3B0ciA9IHRlc3RfaW9fbWFuYWdlcjsKKwkJdGVzdF9pb19iYWNraW5nX21hbmFnZXIgPSB1bml4X2lvX21hbmFnZXI7CisjZWxzZQorCQlpb19wdHIgPSB1bml4X2lvX21hbmFnZXI7CisjZW5kaWYKKwkJcmV0dmFsID0gZXh0MmZzX29wZW4oam91cm5hbF9kZXZpY2UsCisJCQkJICAgICBFWFQyX0ZMQUdfSk9VUk5BTF9ERVZfT0ssIDAsCisJCQkJICAgICAwLCBpb19wdHIsICZqZnMpOworCQlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAib3BlbiBqb3VybmFsIGRldmljZSAlcyIsIGpvdXJuYWxfZGV2aWNlKTsKKwkJaWYgKChibG9ja3NpemUgPCAwKSAmJiAoamZzLT5ibG9ja3NpemUgPCAodW5zaWduZWQpICgtYmxvY2tzaXplKSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCSJKb3VybmFsIGRldiBibG9ja3NpemUgKCVkKSBzbWFsbGVyIHRoYW4gIgorCQkJCSJtaW5pbXVtIGJsb2Nrc2l6ZSAlZFxuIiwgamZzLT5ibG9ja3NpemUsCisJCQkJLWJsb2Nrc2l6ZSk7CisJCX0KKwkJYmxvY2tzaXplID0gamZzLT5ibG9ja3NpemU7CisJCXBhcmFtLnNfbG9nX2Jsb2NrX3NpemUgPQorCQkJaW50X2xvZzIoYmxvY2tzaXplID4+IEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKTsKKwkJZXh0MmZzX2Nsb3NlKGpmcyk7CisJfQorCisJaWYgKGJsb2Nrc2l6ZSA+IHN5c19wYWdlX3NpemUpIHsKKwkJbWtlMmZzX3dhcm5pbmdfbXNnKDEsICIlZC1ieXRlIGJsb2NrcyB0b28gYmlnIGZvciBzeXN0ZW0gKG1heCAlZCkiLAorCQkJYmxvY2tzaXplLCBzeXNfcGFnZV9zaXplKTsKKwkJaWYgKCFmb3JjZSkgeworCQkJcHJvY2VlZF9xdWVzdGlvbigpOworCQl9CisJCWJiX2Vycm9yX21zZygiRm9yY2VkIHRvIGNvbnRpbnVlIik7CisJfQorCW1rZTJmc193YXJuaW5nX21zZygoKGJsb2Nrc2l6ZSA+IDQwOTYpICYmCisJCShwYXJhbS5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpLAorCQkic29tZSAyLjQga2VybmVscyBkbyBub3Qgc3VwcG9ydCAiCisJCSJibG9ja3NpemVzIGdyZWF0ZXIgdGhhbiA0MDk2IHVzaW5nIGV4dDMuXG4iCisJCSJVc2UgLWIgNDA5NiBpZiB0aGlzIGlzIGFuIGlzc3VlIGZvciB5b3VcbiIpOworCisJaWYgKG9wdGluZCA8IGFyZ2MpIHsKKwkJcGFyYW0uc19ibG9ja3NfY291bnQgPSBwYXJzZV9udW1fYmxvY2tzKGFyZ3Zbb3B0aW5kKytdLAorCQkJCXBhcmFtLnNfbG9nX2Jsb2NrX3NpemUpOworCQlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUoIXBhcmFtLnNfYmxvY2tzX2NvdW50LCAiaW52YWxpZCBibG9ja3MgY291bnQgLSAlcyIsIGFyZ3Zbb3B0aW5kIC0gMV0pOworCX0KKwlpZiAob3B0aW5kIDwgYXJnYykKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKHBhcmFtLnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikgeworCQlpZiAoIWZzX3R5cGUpCisJCQlmc190eXBlID0gImpvdXJuYWwiOworCQlyZXNlcnZlZF9yYXRpbyA9IDA7CisJCXBhcmFtLnNfZmVhdHVyZV9pbmNvbXBhdCA9IEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVjsKKwkJcGFyYW0uc19mZWF0dXJlX2NvbXBhdCA9IDA7CisJCXBhcmFtLnNfZmVhdHVyZV9yb19jb21wYXQgPSAwOworCX0KKwlpZiAocGFyYW0uc19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYgJiYKKwkgICAgKHBhcmFtLnNfZmVhdHVyZV9jb21wYXQgfHwgcGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCB8fAorCSAgICAgcGFyYW0uc19mZWF0dXJlX2luY29tcGF0KSkKKwkJcGFyYW0uc19yZXZfbGV2ZWwgPSAxOwkvKiBDcmVhdGUgYSByZXZpc2lvbiAxIGZpbGVzeXN0ZW0gKi8KKworCWNoZWNrX3BsYXVzaWJpbGl0eShkZXZpY2VfbmFtZSAsIGZvcmNlKTsKKwljaGVja19tb3VudChkZXZpY2VfbmFtZSwgZm9yY2UsICJmaWxlc3lzdGVtIik7CisKKwlwYXJhbS5zX2xvZ19mcmFnX3NpemUgPSBwYXJhbS5zX2xvZ19ibG9ja19zaXplOworCisJaWYgKG5vYWN0aW9uICYmIHBhcmFtLnNfYmxvY2tzX2NvdW50KSB7CisJCWRldl9zaXplID0gcGFyYW0uc19ibG9ja3NfY291bnQ7CisJCXJldHZhbCA9IDA7CisJfSBlbHNlIHsKKwlyZXRyeToKKwkJcmV0dmFsID0gZXh0MmZzX2dldF9kZXZpY2Vfc2l6ZShkZXZpY2VfbmFtZSwKKwkJCQkJCUVYVDJfQkxPQ0tfU0laRSgmcGFyYW0pLAorCQkJCQkJJmRldl9zaXplKTsKKwkJaWYgKChyZXR2YWwgPT0gRUZCSUcpICYmCisJCSAgICAoYmxvY2tzaXplID09IDApICYmCisJCSAgICAocGFyYW0uc19sb2dfYmxvY2tfc2l6ZSA9PSAwKSkgeworCQkJcGFyYW0uc19sb2dfYmxvY2tfc2l6ZSA9IDI7CisJCQlibG9ja3NpemUgPSA0MDk2OworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZSgocmV0dmFsICYmIChyZXR2YWwgIT0gRVhUMl9FVF9VTklNUExFTUVOVEVEKSksImRldGVybWluZSBmaWxlc3lzdGVtIHNpemUiKTsKKworCWlmICghcGFyYW0uc19ibG9ja3NfY291bnQpIHsKKwkJaWYgKHJldHZhbCA9PSBFWFQyX0VUX1VOSU1QTEVNRU5URUQpIHsKKwkJCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZSgxLAorCQkJCSJkZXRlcm1pbmUgZGV2aWNlIHNpemU7IHlvdSAiCisJCQkJIm11c3Qgc3BlY2lmeVxudGhlIHNpemUgb2YgdGhlICIKKwkJCQkiZmlsZXN5c3RlbSIpOworCQl9IGVsc2UgeworCQkJaWYgKGRldl9zaXplID09IDApIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkJIkRldmljZSBzaXplIHJlcG9ydGVkIHRvIGJlIHplcm8uICAiCisJCQkJCSJJbnZhbGlkIHBhcnRpdGlvbiBzcGVjaWZpZWQsIG9yXG5cdCIKKwkJCQkJInBhcnRpdGlvbiB0YWJsZSB3YXNuJ3QgcmVyZWFkICIKKwkJCQkJImFmdGVyIHJ1bm5pbmcgZmRpc2ssIGR1ZSB0b1xuXHQiCisJCQkJCSJhIG1vZGlmaWVkIHBhcnRpdGlvbiBiZWluZyBidXN5ICIKKwkJCQkJImFuZCBpbiB1c2UuICBZb3UgbWF5IG5lZWQgdG8gcmVib290XG5cdCIKKwkJCQkJInRvIHJlLXJlYWQgeW91ciBwYXJ0aXRpb24gdGFibGUuXG4iCisJCQkJKTsKKwkJCX0KKwkJCXBhcmFtLnNfYmxvY2tzX2NvdW50ID0gZGV2X3NpemU7CisJCQlpZiAoc3lzX3BhZ2Vfc2l6ZSA+IEVYVDJfQkxPQ0tfU0laRSgmcGFyYW0pKQorCQkJCXBhcmFtLnNfYmxvY2tzX2NvdW50ICY9IH4oKHN5c19wYWdlX3NpemUgLworCQkJCQkJCSAgIEVYVDJfQkxPQ0tfU0laRSgmcGFyYW0pKS0xKTsKKwkJfQorCisJfSBlbHNlIGlmICghZm9yY2UgJiYgKHBhcmFtLnNfYmxvY2tzX2NvdW50ID4gZGV2X3NpemUpKSB7CisJCWJiX2Vycm9yX21zZygiRmlsZXN5c3RlbSBsYXJnZXIgdGhhbiBhcHBhcmVudCBkZXZpY2Ugc2l6ZSIpOworCQlwcm9jZWVkX3F1ZXN0aW9uKCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgdXNlciBhc2tlZCBmb3IgSEFTX0pPVVJOQUwsIHRoZW4gbWFrZSBzdXJlIGEgam91cm5hbAorCSAqIGdldHMgY3JlYXRlZC4KKwkgKi8KKwlpZiAoKHBhcmFtLnNfZmVhdHVyZV9jb21wYXQgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSAmJgorCSAgICAham91cm5hbF9zaXplKQorCQlqb3VybmFsX3NpemUgPSAtMTsKKworCS8qIFNldCBmaXJzdCBtZXRhIGJsb2NrZ3JvdXAgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlICovCisJLyogKHRoaXMgaXMgbW9zdGx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpICovCisJaWYgKChwYXJhbS5zX2ZlYXR1cmVfaW5jb21wYXQgJiBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykgJiYKKwkgICAgKCh0bXAgPSBnZXRlbnYoIk1LRTJGU19GSVJTVF9NRVRBX0JHIikpKSkKKwkJcGFyYW0uc19maXJzdF9tZXRhX2JnID0gYXRvaSh0bXApOworCisJLyogR2V0IHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSwgaWYgYXZhaWxhYmxlICovCisJcmV0dmFsID0gZXh0MmZzX2dldF9kZXZpY2Vfc2VjdHNpemUoZGV2aWNlX25hbWUsICZzZWN0b3Jfc2l6ZSk7CisJbWtlMmZzX2Vycm9yX21zZ19hbmRfZGllKHJldHZhbCwgImRldGVybWluZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSIpOworCisJaWYgKCh0bXAgPSBnZXRlbnYoIk1LRTJGU19ERVZJQ0VfU0VDVFNJWkUiKSkgIT0gTlVMTCkKKwkJc2VjdG9yX3NpemUgPSBhdG9pKHRtcCk7CisKKwlzZXRfZnNfZGVmYXVsdHMoZnNfdHlwZSwgJnBhcmFtLCBibG9ja3NpemUsIHNlY3Rvcl9zaXplLCAmaW5vZGVfcmF0aW8pOworCWJsb2Nrc2l6ZSA9IEVYVDJfQkxPQ0tfU0laRSgmcGFyYW0pOworCisJaWYgKGV4dGVuZGVkX29wdHMpCisJCXBhcnNlX2V4dGVuZGVkX29wdHMoJnBhcmFtLCBleHRlbmRlZF9vcHRzKTsKKworCS8qIFNpbmNlIHNwYXJzZV9zdXBlciBpcyB0aGUgZGVmYXVsdCwgd2Ugd291bGQgb25seSBoYXZlIGEgcHJvYmxlbQorCSAqIGhlcmUgaWYgaXQgd2FzIGV4cGxpY2l0bHkgZGlzYWJsZWQuCisJICovCisJaWYgKChwYXJhbS5zX2ZlYXR1cmVfY29tcGF0ICYgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpICYmCisJICAgICEocGFyYW0uc19mZWF0dXJlX3JvX2NvbXBhdCZFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc2VydmVkIG9ubGluZSByZXNpemUgYmxvY2tzIG5vdCBzdXBwb3J0ZWQgIgorCQkJICAib24gbm9uLXNwYXJzZSBmaWxlc3lzdGVtIik7CisJfQorCisJaWYgKHBhcmFtLnNfYmxvY2tzX3Blcl9ncm91cCkgeworCQlpZiAocGFyYW0uc19ibG9ja3NfcGVyX2dyb3VwIDwgMjU2IHx8CisJCSAgICBwYXJhbS5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiA4ICogKHVuc2lnbmVkKSBibG9ja3NpemUpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJibG9ja3MgcGVyIGdyb3VwIGNvdW50IG91dCBvZiByYW5nZSIpOworCQl9CisJfQorCisJaWYgKCFmb3JjZSAmJiBwYXJhbS5zX2Jsb2Nrc19jb3VudCA+PSAoMSA8PCAzMSkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkZpbGVzeXN0ZW0gdG9vIGxhcmdlLiAgTm8gbW9yZSB0aGFuIDIqKjMxLTEgYmxvY2tzXG4iCisJCQkiXHQgKDhUQiB1c2luZyBhIGJsb2Nrc2l6ZSBvZiA0aykgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuIik7CisJfQorCisJaWYgKGlub2RlX3NpemUpIHsKKwkJaWYgKGlub2RlX3NpemUgPCBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgfHwKKwkJICAgIGlub2RlX3NpemUgPiBFWFQyX0JMT0NLX1NJWkUoJnBhcmFtKSB8fAorCQkgICAgaW5vZGVfc2l6ZSAmIChpbm9kZV9zaXplIC0gMSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGlub2RlIHNpemUgJWQgKG1pbiAlZC9tYXggJWQpIiwKKwkJCQlpbm9kZV9zaXplLCBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUsCisJCQkJYmxvY2tzaXplKTsKKwkJfQorCQlta2UyZnNfd2FybmluZ19tc2coKGlub2RlX3NpemUgIT0gRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFKSwKKwkJCSIlZC1ieXRlIGlub2RlcyBub3QgdXNhYmxlIG9uIG1vc3Qgc3lzdGVtcyIsCisJCQlpbm9kZV9zaXplKTsKKwkJcGFyYW0uc19pbm9kZV9zaXplID0gaW5vZGVfc2l6ZTsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBudW1iZXIgb2YgaW5vZGVzIGJhc2VkIG9uIHRoZSBpbm9kZSByYXRpbworCSAqLworCXBhcmFtLnNfaW5vZGVzX2NvdW50ID0gbnVtX2lub2RlcyA/IG51bV9pbm9kZXMgOgorCQkoKF9fdTY0KSBwYXJhbS5zX2Jsb2Nrc19jb3VudCAqIGJsb2Nrc2l6ZSkKKwkJCS8gaW5vZGVfcmF0aW87CisKKwkvKgorCSAqIENhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIHRvIHJlc2VydmUKKwkgKi8KKwlwYXJhbS5zX3JfYmxvY2tzX2NvdW50ID0gKHBhcmFtLnNfYmxvY2tzX2NvdW50ICogcmVzZXJ2ZWRfcmF0aW8pIC8gMTAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBta2UyZnNfY2xlYW5fdXAodm9pZCkKK3sKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgam91cm5hbF9kZXZpY2UpIGZyZWUoam91cm5hbF9kZXZpY2UpOworfQorCitpbnQgbWtlMmZzX21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgbWtlMmZzX21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllcnJjb2RlX3QJcmV0dmFsOworCWV4dDJfZmlsc3lzCWZzOworCWJhZGJsb2Nrc19saXN0CWJiX2xpc3QgPSAwOworCXVuc2lnbmVkIGludAlpOworCWludAkJdmFsOworCWlvX21hbmFnZXIJaW9fcHRyOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlhdGV4aXQobWtlMmZzX2NsZWFuX3VwKTsKKwlpZiAoIVBSUyhhcmdjLCBhcmd2KSkKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBDT05GSUdfVEVTVElPX0RFQlVHCisJaW9fcHRyID0gdGVzdF9pb19tYW5hZ2VyOworCXRlc3RfaW9fYmFja2luZ19tYW5hZ2VyID0gdW5peF9pb19tYW5hZ2VyOworI2Vsc2UKKwlpb19wdHIgPSB1bml4X2lvX21hbmFnZXI7CisjZW5kaWYKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgc3VwZXJibG9jay4uLi4KKwkgKi8KKwlyZXR2YWwgPSBleHQyZnNfaW5pdGlhbGl6ZShkZXZpY2VfbmFtZSwgMCwgJnBhcmFtLAorCQkJCSAgIGlvX3B0ciwgJmZzKTsKKwlta2UyZnNfZXJyb3JfbXNnX2FuZF9kaWUocmV0dmFsLCAic2V0IHVwIHN1cGVyYmxvY2siKTsKKworCS8qCisJICogV2lwZSBvdXQgdGhlIG9sZCBvbi1kaXNrIHN1cGVyYmxvY2sKKwkgKi8KKwlpZiAoIW5vYWN0aW9uKQorCQl6YXBfc2VjdG9yKGZzLCAyLCA2KTsKKworCS8qCisJICogR2VuZXJhdGUgYSBVVUlEIGZvciBpdC4uLgorCSAqLworCXV1aWRfZ2VuZXJhdGUoZnMtPnN1cGVyLT5zX3V1aWQpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBkaXJlY3RvcnkgaW5kZXggdmFyaWFibGVzCisJICovCisJZnMtPnN1cGVyLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBFWFQyX0hBU0hfVEVBOworCXV1aWRfZ2VuZXJhdGUoKHVuc2lnbmVkIGNoYXIgKikgZnMtPnN1cGVyLT5zX2hhc2hfc2VlZCk7CisKKwkvKgorCSAqIEFkZCAiaml0dGVyIiB0byB0aGUgc3VwZXJibG9jaydzIGNoZWNrIGludGVydmFsIHNvIHRoYXQgd2UKKwkgKiBkb24ndCBjaGVjayBhbGwgdGhlIGZpbGVzeXN0ZW1zIGF0IHRoZSBzYW1lIHRpbWUuICBXZSB1c2UgYQorCSAqIGtsdWRneSBoYWNrIG9mIHVzaW5nIHRoZSBVVUlEIHRvIGRlcml2ZSBhIHJhbmRvbSBqaXR0ZXIgdmFsdWUuCisJICovCisJZm9yIChpID0gMCwgdmFsID0gMDsgaSA8IHNpemVvZihmcy0+c3VwZXItPnNfdXVpZCk7IGkrKykKKwkJdmFsICs9IGZzLT5zdXBlci0+c191dWlkW2ldOworCWZzLT5zdXBlci0+c19tYXhfbW50X2NvdW50ICs9IHZhbCAlIEVYVDJfREZMX01BWF9NTlRfQ09VTlQ7CisKKwkvKgorCSAqIE92ZXJyaWRlIHRoZSBjcmVhdG9yIE9TLCBpZiBhcHBsaWNhYmxlCisJICovCisJaWYgKGNyZWF0b3Jfb3MgJiYgIXNldF9vcyhmcy0+c3VwZXIsIGNyZWF0b3Jfb3MpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIG9zIC0gJXMiLCBjcmVhdG9yX29zKTsKKwl9CisKKwkvKgorCSAqIEZvciB0aGUgSHVyZCwgd2Ugd2lsbCB0dXJuIG9mZiBmaWxldHlwZSBzaW5jZSBpdCBkb2Vzbid0CisJICogc3VwcG9ydCBpdC4KKwkgKi8KKwlpZiAoZnMtPnN1cGVyLT5zX2NyZWF0b3Jfb3MgPT0gRVhUMl9PU19IVVJEKQorCQlmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmPQorCQkJfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRTsKKworCS8qCisJICogU2V0IHRoZSB2b2x1bWUgbGFiZWwuLi4KKwkgKi8KKwlpZiAodm9sdW1lX2xhYmVsKSB7CisJCXNucHJpbnRmKGZzLT5zdXBlci0+c192b2x1bWVfbmFtZSwgc2l6ZW9mKGZzLT5zdXBlci0+c192b2x1bWVfbmFtZSksICIlcyIsIHZvbHVtZV9sYWJlbCk7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIGxhc3QgbW91bnQgZGlyZWN0b3J5CisJICovCisJaWYgKG1vdW50X2RpcikgeworCQlzbnByaW50Zihmcy0+c3VwZXItPnNfbGFzdF9tb3VudGVkLCBzaXplb2YoZnMtPnN1cGVyLT5zX2xhc3RfbW91bnRlZCksICIlcyIsIG1vdW50X2Rpcik7CisJfQorCisJaWYgKCFxdWlldCB8fCBub2FjdGlvbikKKwkJc2hvd19zdGF0cyhmcyk7CisKKwlpZiAobm9hY3Rpb24pCisJCXJldHVybiAwOworCisJaWYgKGZzLT5zdXBlci0+c19mZWF0dXJlX2luY29tcGF0ICYKKwkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSB7CisJCWNyZWF0ZV9qb3VybmFsX2Rldihmcyk7CisJCXJldHVybiAoZXh0MmZzX2Nsb3NlKGZzKSA/IDEgOiAwKTsKKwl9CisKKwlpZiAoYmFkX2Jsb2Nrc19maWxlbmFtZSkKKwkJcmVhZF9iYl9maWxlKGZzLCAmYmJfbGlzdCwgYmFkX2Jsb2Nrc19maWxlbmFtZSk7CisJaWYgKGNmbGFnKQorCQl0ZXN0X2Rpc2soZnMsICZiYl9saXN0KTsKKworCWhhbmRsZV9iYWRfYmxvY2tzKGZzLCBiYl9saXN0KTsKKwlmcy0+c3RyaWRlID0gZnNfc3RyaWRlOworCXJldHZhbCA9IGV4dDJmc19hbGxvY2F0ZV90YWJsZXMoZnMpOworCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJhbGxvY2F0ZSBmaWxlc3lzdGVtIHRhYmxlcyIpOworCWlmIChzdXBlcl9vbmx5KSB7CisJCWZzLT5zdXBlci0+c19zdGF0ZSB8PSBFWFQyX0VSUk9SX0ZTOworCQlmcy0+ZmxhZ3MgJj0gfihFWFQyX0ZMQUdfSUJfRElSVFl8RVhUMl9GTEFHX0JCX0RJUlRZKTsKKwl9IGVsc2UgeworCQkvKiByc3YgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAoNjRrQiBpcyBNRCBSQUlEIHNiIGFsaWdubWVudCkgKi8KKwkJdW5zaWduZWQgaW50IHJzdiA9IDY1NTM2IC8gZnMtPmJsb2Nrc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBibG9ja3MgPSBmcy0+c3VwZXItPnNfYmxvY2tzX2NvdW50OworCQl1bnNpZ25lZCBsb25nIHN0YXJ0OworCQlibGtfdCByZXRfYmxrOworCisjaWZkZWYgWkFQX0JPT1RCTE9DSworCQl6YXBfc2VjdG9yKGZzLCAwLCAyKTsKKyNlbmRpZgorCisJCS8qCisJCSAqIFdpcGUgb3V0IGFueSBvbGQgTUQgUkFJRCAob3Igb3RoZXIpIG1ldGFkYXRhIGF0IHRoZSBlbmQKKwkJICogb2YgdGhlIGRldmljZS4gIFRoaXMgd2lsbCBhbHNvIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2UgaXMKKwkJICogYXMgbGFyZ2UgYXMgd2UgdGhpbmsuICBCZSBjYXJlZnVsIHdpdGggdmVyeSBzbWFsbCBkZXZpY2VzLgorCQkgKi8KKwkJc3RhcnQgPSAoYmxvY2tzICYgfihyc3YgLSAxKSk7CisJCWlmIChzdGFydCA+IHJzdikKKwkJCXN0YXJ0IC09IHJzdjsKKwkJaWYgKHN0YXJ0ID4gMCkKKwkJCXJldHZhbCA9IHplcm9fYmxvY2tzKGZzLCBzdGFydCwgYmxvY2tzIC0gc3RhcnQsCisJCQkJCSAgICAgTlVMTCwgJnJldF9ibGssIE5VTEwpOworCisJCW1rZTJmc193YXJuaW5nX21zZyhyZXR2YWwsICJjYW4ndCB6ZXJvIGJsb2NrICV1IGF0IGVuZCBvZiBmaWxlc3lzdGVtIiwgcmV0X2Jsayk7CisJCXdyaXRlX2lub2RlX3RhYmxlcyhmcyk7CisJCWNyZWF0ZV9yb290X2Rpcihmcyk7CisJCWNyZWF0ZV9sb3N0X2FuZF9mb3VuZChmcyk7CisJCXJlc2VydmVfaW5vZGVzKGZzKTsKKwkJY3JlYXRlX2JhZF9ibG9ja19pbm9kZShmcywgYmJfbGlzdCk7CisJCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJgorCQkgICAgRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpIHsKKwkJCXJldHZhbCA9IGV4dDJmc19jcmVhdGVfcmVzaXplX2lub2RlKGZzKTsKKwkJCW1rZTJmc19lcnJvcl9tc2dfYW5kX2RpZShyZXR2YWwsICJyZXNlcnZlIGJsb2NrcyBmb3Igb25saW5lIHJlc2l6ZSIpOworCQl9CisJfQorCisJaWYgKGpvdXJuYWxfZGV2aWNlKSB7CisJCW1ha2Vfam91cm5hbF9kZXZpY2Uoam91cm5hbF9kZXZpY2UsIGZzLCBxdWlldCwgZm9yY2UpOworCX0gZWxzZSBpZiAoam91cm5hbF9zaXplKSB7CisJCW1ha2Vfam91cm5hbF9ibG9ja3MoZnMsIGpvdXJuYWxfc2l6ZSwgam91cm5hbF9mbGFncywgcXVpZXQpOworCX0KKworCW1rZTJmc192ZXJib3NlKCJXcml0aW5nIHN1cGVyYmxvY2tzIGFuZCBmaWxlc3lzdGVtIGFjY291bnRpbmcgaW5mb3JtYXRpb246ICIpOworCXJldHZhbCA9IGV4dDJmc19mbHVzaChmcyk7CisJbWtlMmZzX3dhcm5pbmdfbXNnKHJldHZhbCwgImhhZCB0cm91YmxlIHdyaXRpbmcgb3V0IHN1cGVyYmxvY2tzIik7CisJbWtlMmZzX3ZlcmJvc2VfZG9uZSgpOworCWlmICghcXVpZXQgJiYgIWdldGVudigiTUtFMkZTX1NLSVBfQ0hFQ0tfTVNHIikpCisJCXByaW50X2NoZWNrX21lc3NhZ2UoZnMpOworCXZhbCA9IGV4dDJmc19jbG9zZShmcyk7CisJcmV0dXJuIChyZXR2YWwgfHwgdmFsKSA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdHVuZTJmcy5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdHVuZTJmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjM2Y0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy90dW5lMmZzLmMKQEAgLTAsMCArMSw3MTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHR1bmUyZnMuYyAtIENoYW5nZSB0aGUgZmlsZSBzeXN0ZW0gcGFyYW1ldGVycyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIGJ5IFRoZW9kb3JlIFRzJ28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIDkzLzA2LzAxCS0gQ3JlYXRpb24KKyAqIDkzLzEwLzMxCS0gQWRkZWQgdGhlIC1jIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG1heGltYWwgbW91bnQgY291bnRzCisgKiA5My8xMi8xNAktIEFkZGVkIC1sIGZsYWcgdG8gbGlzdCBjb250ZW50cyBvZiBzdXBlcmJsb2NrCisgKiAgICAgICAgICAgICAgICBNLkouRS4gTW9sIChtYXJjZWxAZHV0ZWNhLmV0LnR1ZGVsZnQubmwpCisgKiAgICAgICAgICAgICAgICBGLlcuIHRlbiBXb2xkZSAoZnJhbmt5QGR1dGVjYS5ldC50dWRlbGZ0Lm5sKQorICogOTMvMTIvMjkJLSBBZGRlZCB0aGUgLWUgb3B0aW9uIHRvIGNoYW5nZSBlcnJvcnMgYmVoYXZpb3IKKyAqIDk0LzAyLzI3CS0gUG9ydGVkIHRvIHVzZSB0aGUgZXh0MmZzIGxpYnJhcnkKKyAqIDk0LzAzLzA2CS0gQWRkZWQgdGhlIGNoZWNrcyBpbnRlcnZhbCBmcm9tIFV3ZSBPaHNlICh1d2VAdGlya2EuZ3VuLmRlKQorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSAiZTJmc2JiLmgiCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMvZXh0MmZzLmgiCisjaW5jbHVkZSAidXVpZC91dWlkLmgiCisjaW5jbHVkZSAiZTJwL2UycC5oIgorI2luY2x1ZGUgImV4dDJmcy9rZXJuZWwtamJkLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImJsa2lkL2Jsa2lkLmgiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgY2hhciAqIGRldmljZV9uYW1lID0gTlVMTDsKK3N0YXRpYyBjaGFyICogbmV3X2xhYmVsLCAqbmV3X2xhc3RfbW91bnRlZCwgKm5ld19VVUlEOworc3RhdGljIGNoYXIgKiBpb19vcHRpb25zOworc3RhdGljIGludCBjX2ZsYWcsIENfZmxhZywgZV9mbGFnLCBmX2ZsYWcsIGdfZmxhZywgaV9mbGFnLCBsX2ZsYWcsIExfZmxhZzsKK3N0YXRpYyBpbnQgbV9mbGFnLCBNX2ZsYWcsIHJfZmxhZywgc19mbGFnID0gLTEsIHVfZmxhZywgVV9mbGFnLCBUX2ZsYWc7CitzdGF0aWMgdGltZV90IGxhc3RfY2hlY2tfdGltZTsKK3N0YXRpYyBpbnQgcHJpbnRfbGFiZWw7CitzdGF0aWMgaW50IG1heF9tb3VudF9jb3VudCwgbW91bnRfY291bnQsIG1vdW50X2ZsYWdzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwsIHJlc2VydmVkX2Jsb2NrczsKK3N0YXRpYyB1bnNpZ25lZCByZXNlcnZlZF9yYXRpbzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2dpZCwgcmVzdWlkOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVycm9yczsKK3N0YXRpYyBpbnQgb3Blbl9mbGFnOworc3RhdGljIGNoYXIgKmZlYXR1cmVzX2NtZDsKK3N0YXRpYyBjaGFyICptbnRvcHRzX2NtZDsKKworc3RhdGljIGludCBqb3VybmFsX3NpemUsIGpvdXJuYWxfZmxhZ3M7CitzdGF0aWMgY2hhciAqam91cm5hbF9kZXZpY2UgPSBOVUxMOworCitzdGF0aWMgY29uc3QgY2hhciAqcGxlYXNlX2ZzY2sgPSAiUGxlYXNlIHJ1biBlMmZzY2sgb24gdGhlIGZpbGVzeXN0ZW1cbiI7CisKK3N0YXRpYyBfX3UzMiBva19mZWF0dXJlc1szXSA9IHsKKwlFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMIHwgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgsCisJRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFLAorCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCit9OworCisvKgorICogUmVtb3ZlIGFuIGV4dGVybmFsIGpvdXJuYWwgZnJvbSB0aGUgZmlsZXN5c3RlbQorICovCitzdGF0aWMgdm9pZCByZW1vdmVfam91cm5hbF9kZXZpY2UoZXh0Ml9maWxzeXMgZnMpCit7CisJY2hhcgkJKmpvdXJuYWxfcGF0aDsKKwlleHQyX2ZpbHN5cwlqZnM7CisJY2hhcgkJYnVmWzEwMjRdOworCWpvdXJuYWxfc3VwZXJibG9ja190CSpqc2I7CisJaW50CQlpLCBucl91c2VyczsKKwllcnJjb2RlX3QJcmV0dmFsOworCWludAkJY29tbWl0X3JlbW92ZV9qb3VybmFsID0gMDsKKwlpb19tYW5hZ2VyCWlvX3B0cjsKKworCWlmIChmX2ZsYWcpCisJCWNvbW1pdF9yZW1vdmVfam91cm5hbCA9IDE7IC8qIGZvcmNlIHJlbW92YWwgZXZlbiBpZiBlcnJvciAqLworCisJdXVpZF91bnBhcnNlKGZzLT5zdXBlci0+c19qb3VybmFsX3V1aWQsIGJ1Zik7CisJam91cm5hbF9wYXRoID0gYmxraWRfZ2V0X2Rldm5hbWUoTlVMTCwgIlVVSUQiLCBidWYpOworCisJaWYgKCFqb3VybmFsX3BhdGgpIHsKKwkJam91cm5hbF9wYXRoID0KKwkJCWV4dDJmc19maW5kX2Jsb2NrX2RldmljZShmcy0+c3VwZXItPnNfam91cm5hbF9kZXYpOworCQlpZiAoIWpvdXJuYWxfcGF0aCkKKwkJCXJldHVybjsKKwl9CisKKwlpb19wdHIgPSB1bml4X2lvX21hbmFnZXI7CisJcmV0dmFsID0gZXh0MmZzX29wZW4oam91cm5hbF9wYXRoLCBFWFQyX0ZMQUdfUld8CisJCQkgICAgIEVYVDJfRkxBR19KT1VSTkFMX0RFVl9PSywgMCwKKwkJCSAgICAgZnMtPmJsb2Nrc2l6ZSwgaW9fcHRyLCAmamZzKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZygiRmFpbGVkIHRvIG9wZW4gZXh0ZXJuYWwgam91cm5hbCIpOworCQlnb3RvIG5vX3ZhbGlkX2pvdXJuYWw7CisJfQorCWlmICghKGpmcy0+c3VwZXItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikpIHsKKwkJYmJfZXJyb3JfbXNnKCIlcyBpcyBub3QgYSBqb3VybmFsIGRldmljZSIsIGpvdXJuYWxfcGF0aCk7CisJCWdvdG8gbm9fdmFsaWRfam91cm5hbDsKKwl9CisKKwkvKiBHZXQgdGhlIGpvdXJuYWwgc3VwZXJibG9jayAqLworCWlmICgocmV0dmFsID0gaW9fY2hhbm5lbF9yZWFkX2JsayhqZnMtPmlvLCAxLCAtMTAyNCwgYnVmKSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJGYWlsZWQgdG8gcmVhZCBqb3VybmFsIHN1cGVyYmxvY2siKTsKKwkJZ290byBub192YWxpZF9qb3VybmFsOworCX0KKworCWpzYiA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKSBidWY7CisJaWYgKChqc2ItPnNfaGVhZGVyLmhfbWFnaWMgIT0gKHVuc2lnbmVkKSBudG9obChKRlNfTUFHSUNfTlVNQkVSKSkgfHwKKwkgICAgKGpzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgIT0gKHVuc2lnbmVkKSBudG9obChKRlNfU1VQRVJCTE9DS19WMikpKSB7CisJCWJiX2Vycm9yX21zZygiSm91cm5hbCBzdXBlcmJsb2NrIG5vdCBmb3VuZCEiKTsKKwkJZ290byBub192YWxpZF9qb3VybmFsOworCX0KKworCS8qIEZpbmQgdGhlIGZpbGVzeXN0ZW0gVVVJRCAqLworCW5yX3VzZXJzID0gbnRvaGwoanNiLT5zX25yX3VzZXJzKTsKKwlmb3IgKGk9MDsgaSA8IG5yX3VzZXJzOyBpKyspIHsKKwkJaWYgKG1lbWNtcChmcy0+c3VwZXItPnNfdXVpZCwKKwkJCSAgICZqc2ItPnNfdXNlcnNbaSoxNl0sIDE2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IG5yX3VzZXJzKSB7CisJCWJiX2Vycm9yX21zZygiRmlsZXN5c3RlbSdzIFVVSUQgbm90IGZvdW5kIG9uIGpvdXJuYWwgZGV2aWNlIik7CisJCWNvbW1pdF9yZW1vdmVfam91cm5hbCA9IDE7CisJCWdvdG8gbm9fdmFsaWRfam91cm5hbDsKKwl9CisJbnJfdXNlcnMtLTsKKwlmb3IgKGk9MDsgaSA8IG5yX3VzZXJzOyBpKyspCisJCW1lbWNweSgmanNiLT5zX3VzZXJzW2kqMTZdLCAmanNiLT5zX3VzZXJzWyhpKzEpKjE2XSwgMTYpOworCWpzYi0+c19ucl91c2VycyA9IGh0b25sKG5yX3VzZXJzKTsKKworCS8qIFdyaXRlIGJhY2sgdGhlIGpvdXJuYWwgc3VwZXJibG9jayAqLworCWlmICgocmV0dmFsID0gaW9fY2hhbm5lbF93cml0ZV9ibGsoamZzLT5pbywgMSwgLTEwMjQsIGJ1ZikpKSB7CisJCWJiX2Vycm9yX21zZygiRmFpbGVkIHRvIHdyaXRlIGpvdXJuYWwgc3VwZXJibG9jayIpOworCQlnb3RvIG5vX3ZhbGlkX2pvdXJuYWw7CisJfQorCisJY29tbWl0X3JlbW92ZV9qb3VybmFsID0gMTsKKworbm9fdmFsaWRfam91cm5hbDoKKwlpZiAoY29tbWl0X3JlbW92ZV9qb3VybmFsID09IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJKb3VybmFsIE5PVCByZW1vdmVkIik7CisJZnMtPnN1cGVyLT5zX2pvdXJuYWxfZGV2ID0gMDsKKwl1dWlkX2NsZWFyKGZzLT5zdXBlci0+c19qb3VybmFsX3V1aWQpOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwlwdXRzKCJKb3VybmFsIHJlbW92ZWQiKTsKKwlmcmVlKGpvdXJuYWxfcGF0aCk7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVtb3ZlX2pvdXJuYWxfaW5vZGUgKi8KK3N0YXRpYyBpbnQgcmVsZWFzZV9ibG9ja3NfcHJvYyhleHQyX2ZpbHN5cyBmcywgYmxrX3QgKmJsb2NrbnIsCisJCQkgICAgICAgaW50IGJsb2NrY250IEVYVDJGU19BVFRSKCh1bnVzZWQpKSwKKwkJCSAgICAgICB2b2lkICpwcml2YXRlIEVYVDJGU19BVFRSKCh1bnVzZWQpKSkKK3sKKwlibGtfdAlibG9jazsKKwlpbnQJZ3JvdXA7CisKKwlibG9jayA9ICpibG9ja25yOworCWV4dDJmc191bm1hcmtfYmxvY2tfYml0bWFwKGZzLT5ibG9ja19tYXAsYmxvY2spOworCWdyb3VwID0gZXh0MmZzX2dyb3VwX29mX2JsayhmcywgYmxvY2spOworCWZzLT5ncm91cF9kZXNjW2dyb3VwXS5iZ19mcmVlX2Jsb2Nrc19jb3VudCsrOworCWZzLT5zdXBlci0+c19mcmVlX2Jsb2Nrc19jb3VudCsrOworCXJldHVybiAwOworfQorCisvKgorICogUmVtb3ZlIHRoZSBqb3VybmFsIGlub2RlIGZyb20gdGhlIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2pvdXJuYWxfaW5vZGUoZXh0Ml9maWxzeXMgZnMpCit7CisJc3RydWN0IGV4dDJfaW5vZGUJaW5vZGU7CisJZXJyY29kZV90CQlyZXR2YWw7CisJaW5vX3QJCQlpbm8gPSBmcy0+c3VwZXItPnNfam91cm5hbF9pbnVtOworCWNoYXIgKm1zZyA9ICJ0byByZWFkIjsKKwljaGFyICpzID0gImpvdXJuYWwgaW5vZGUiOworCisJcmV0dmFsID0gZXh0MmZzX3JlYWRfaW5vZGUoZnMsIGlubywgICZpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBSRU1PVkVfSk9VUk5BTF9JTk9ERV9FUlJPUjsKKwlpZiAoaW5vID09IEVYVDJfSk9VUk5BTF9JTk8pIHsKKwkJcmV0dmFsID0gZXh0MmZzX3JlYWRfYml0bWFwcyhmcyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCW1zZyA9ICJ0byByZWFkIGJpdG1hcHMiOworCQkJcyA9ICIiOworCQkJZ290byBSRU1PVkVfSk9VUk5BTF9JTk9ERV9FUlJPUjsKKwkJfQorCQlyZXR2YWwgPSBleHQyZnNfYmxvY2tfaXRlcmF0ZShmcywgaW5vLCAwLCBOVUxMLAorCQkJCQkgICAgICByZWxlYXNlX2Jsb2Nrc19wcm9jLCBOVUxMKTsKKwkJaWYgKHJldHZhbCkgeworCQkJbXNnID0gImNsZWFyaW5nIjsKKwkJCWdvdG8gUkVNT1ZFX0pPVVJOQUxfSU5PREVfRVJST1I7CisJCX0KKwkJbWVtc2V0KCZpbm9kZSwgMCwgc2l6ZW9mKGlub2RlKSk7CisJCWV4dDJmc19tYXJrX2JiX2RpcnR5KGZzKTsKKwkJZnMtPmZsYWdzICY9IH5FWFQyX0ZMQUdfU1VQRVJfT05MWTsKKwl9IGVsc2UKKwkJaW5vZGUuaV9mbGFncyAmPSB+RVhUMl9JTU1VVEFCTEVfRkw7CisJcmV0dmFsID0gZXh0MmZzX3dyaXRlX2lub2RlKGZzLCBpbm8sICZpbm9kZSk7CisJaWYgKHJldHZhbCkgeworCQltc2cgPSAid3JpdGluZyI7CitSRU1PVkVfSk9VUk5BTF9JTk9ERV9FUlJPUjoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkZhaWxlZCAlcyAlcyIsIG1zZywgcyk7CisJfQorCWZzLT5zdXBlci0+c19qb3VybmFsX2ludW0gPSAwOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgZGVmYXVsdCBtb3VudCBvcHRpb25zCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9tbnRvcHRzKGV4dDJfZmlsc3lzIGZzLCBjaGFyICptbnRvcHRzKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYj0gZnMtPnN1cGVyOworCisJaWYgKGUycF9lZGl0X21udG9wdHMobW50b3B0cywgJnNiLT5zX2RlZmF1bHRfbW91bnRfb3B0cywgfjApKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiSW52YWxpZCBtb3VudCBvcHRpb24gc2V0OiAlcyIsIG1udG9wdHMpOworCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgZmVhdHVyZSBzZXQgYXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9mZWF0dXJlX3NldChleHQyX2ZpbHN5cyBmcywgY2hhciAqZmVhdHVyZXMpCit7CisJaW50IHNwYXJzZSwgb2xkX3NwYXJzZSwgZmlsZXR5cGUsIG9sZF9maWxldHlwZTsKKwlpbnQgam91cm5hbCwgb2xkX2pvdXJuYWwsIGR4ZGlyLCBvbGRfZHhkaXI7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiPSBmcy0+c3VwZXI7CisJX191MzIJb2xkX2NvbXBhdCwgb2xkX2luY29tcGF0LCBvbGRfcm9fY29tcGF0OworCisJb2xkX2NvbXBhdCA9IHNiLT5zX2ZlYXR1cmVfY29tcGF0OworCW9sZF9yb19jb21wYXQgPSBzYi0+c19mZWF0dXJlX3JvX2NvbXBhdDsKKwlvbGRfaW5jb21wYXQgPSBzYi0+c19mZWF0dXJlX2luY29tcGF0OworCisJb2xkX3NwYXJzZSA9IHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYKKwkJRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVI7CisJb2xkX2ZpbGV0eXBlID0gc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCUVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRTsKKwlvbGRfam91cm5hbCA9IHNiLT5zX2ZlYXR1cmVfY29tcGF0ICYKKwkJRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTDsKKwlvbGRfZHhkaXIgPSBzYi0+c19mZWF0dXJlX2NvbXBhdCAmCisJCUVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYOworCWlmIChlMnBfZWRpdF9mZWF0dXJlKGZlYXR1cmVzLCAmc2ItPnNfZmVhdHVyZV9jb21wYXQsIG9rX2ZlYXR1cmVzKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkludmFsaWQgZmlsZXN5c3RlbSBvcHRpb24gc2V0OiAlcyIsIGZlYXR1cmVzKTsKKwlzcGFyc2UgPSBzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSOworCWZpbGV0eXBlID0gc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCUVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRTsKKwlqb3VybmFsID0gc2ItPnNfZmVhdHVyZV9jb21wYXQgJgorCQlFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMOworCWR4ZGlyID0gc2ItPnNfZmVhdHVyZV9jb21wYXQgJgorCQlFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWDsKKwlpZiAob2xkX2pvdXJuYWwgJiYgIWpvdXJuYWwpIHsKKwkJaWYgKChtb3VudF9mbGFncyAmIEVYVDJfTUZfTU9VTlRFRCkgJiYKKwkJICAgICEobW91bnRfZmxhZ3MgJiBFWFQyX01GX1JFQURPTkxZKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIlRoZSBoYXNfam91cm5hbCBmbGFnIG1heSBvbmx5IGJlICIKKwkJCQkiY2xlYXJlZCB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzXG4iCisJCQkJInVubW91bnRlZCBvciBtb3VudGVkICIKKwkJCQkicmVhZC1vbmx5Iik7CisJCX0KKwkJaWYgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgorCQkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCSJUaGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBpcyBzZXQuICAiCisJCQkJIiVzIGJlZm9yZSBjbGVhcmluZyB0aGUgaGFzX2pvdXJuYWwgZmxhZy4iLAorCQkJCXBsZWFzZV9mc2NrKTsKKwkJfQorCQlpZiAoc2ItPnNfam91cm5hbF9pbnVtKSB7CisJCQlyZW1vdmVfam91cm5hbF9pbm9kZShmcyk7CisJCX0KKwkJaWYgKHNiLT5zX2pvdXJuYWxfZGV2KSB7CisJCQlyZW1vdmVfam91cm5hbF9kZXZpY2UoZnMpOworCQl9CisJfQorCWlmIChqb3VybmFsICYmICFvbGRfam91cm5hbCkgeworCQkvKgorCQkgKiBJZiBhZGRpbmcgYSBqb3VybmFsIGZsYWcsIGxldCB0aGUgY3JlYXRlIGpvdXJuYWwKKwkJICogY29kZSBiZWxvdyBoYW5kbGUgY3JlYXRpbmcgc2V0dGluZyB0aGUgZmxhZyBhbmQKKwkJICogY3JlYXRpbmcgdGhlIGpvdXJuYWwuICBXZSBzdXBwbHkgYSBkZWZhdWx0IHNpemUgaWYKKwkJICogbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKCFqb3VybmFsX3NpemUpCisJCQlqb3VybmFsX3NpemUgPSAtMTsKKwkJc2ItPnNfZmVhdHVyZV9jb21wYXQgJj0gfkVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisJfQorCWlmIChkeGRpciAmJiAhb2xkX2R4ZGlyKSB7CisJCWlmICghc2ItPnNfZGVmX2hhc2hfdmVyc2lvbikKKwkJCXNiLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBFWFQyX0hBU0hfVEVBOworCQlpZiAodXVpZF9pc19udWxsKCh1bnNpZ25lZCBjaGFyICopIHNiLT5zX2hhc2hfc2VlZCkpCisJCQl1dWlkX2dlbmVyYXRlKCh1bnNpZ25lZCBjaGFyICopIHNiLT5zX2hhc2hfc2VlZCk7CisJfQorCisJaWYgKHNiLT5zX3Jldl9sZXZlbCA9PSBFWFQyX0dPT0RfT0xEX1JFViAmJgorCSAgICAoc2ItPnNfZmVhdHVyZV9jb21wYXQgfHwgc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgfHwKKwkgICAgIHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQpKQorCQlleHQyZnNfdXBkYXRlX2R5bmFtaWNfcmV2KGZzKTsKKwlpZiAoKHNwYXJzZSAhPSBvbGRfc3BhcnNlKSB8fAorCSAgICAoZmlsZXR5cGUgIT0gb2xkX2ZpbGV0eXBlKSkgeworCQlzYi0+c19zdGF0ZSAmPSB+RVhUMl9WQUxJRF9GUzsKKwkJcHJpbnRmKCJcbiVzXG4iLCBwbGVhc2VfZnNjayk7CisJfQorCWlmICgob2xkX2NvbXBhdCAhPSBzYi0+c19mZWF0dXJlX2NvbXBhdCkgfHwKKwkgICAgKG9sZF9yb19jb21wYXQgIT0gc2ItPnNfZmVhdHVyZV9yb19jb21wYXQpIHx8CisJICAgIChvbGRfaW5jb21wYXQgIT0gc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCkpCisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKK30KKworLyoKKyAqIEFkZCBhIGpvdXJuYWwgdG8gdGhlIGZpbGVzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9qb3VybmFsKGV4dDJfZmlsc3lzIGZzKQoreworCWlmIChmcy0+c3VwZXItPnNfZmVhdHVyZV9jb21wYXQgJgorCSAgICBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJUaGUgZmlsZXN5c3RlbSBhbHJlYWR5IGhhcyBhIGpvdXJuYWwiKTsKKwl9CisJaWYgKGpvdXJuYWxfZGV2aWNlKSB7CisJCW1ha2Vfam91cm5hbF9kZXZpY2Uoam91cm5hbF9kZXZpY2UsIGZzLCAwLCAwKTsKKwl9IGVsc2UgaWYgKGpvdXJuYWxfc2l6ZSkgeworCQltYWtlX2pvdXJuYWxfYmxvY2tzKGZzLCBqb3VybmFsX3NpemUsIGpvdXJuYWxfZmxhZ3MsIDApOworCQkvKgorCQkgKiBJZiB0aGUgZmlsZXN5c3RlbSB3YXNuJ3QgbW91bnRlZCwgd2UgbmVlZCB0byBmb3JjZQorCQkgKiB0aGUgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMgb3V0LgorCQkgKi8KKwkJaWYgKChtb3VudF9mbGFncyAmIEVYVDJfTUZfTU9VTlRFRCkgPT0gMCkKKwkJCWZzLT5mbGFncyAmPSB+RVhUMl9GTEFHX1NVUEVSX09OTFk7CisJfQorCXByaW50X2NoZWNrX21lc3NhZ2UoZnMpOworfQorCisvKgorICogQnVzeWJveCBzdHVmZgorICovCitzdGF0aWMgY2hhciAqIHhfYmxraWRfZ2V0X2Rldm5hbWUoY29uc3QgY2hhciAqdG9rZW4pCit7CisJY2hhciAqIGRldl9uYW1lOworCisJaWYgKCEoZGV2X25hbWUgPSBibGtpZF9nZXRfZGV2bmFtZShOVUxMLCB0b2tlbiwgTlVMTCkpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiVW5hYmxlIHRvIHJlc29sdmUgJyVzJyIsIHRva2VuKTsKKwlyZXR1cm4gZGV2X25hbWU7Cit9CisKKyNpZmRlZiBDT05GSUdfRTJMQUJFTAorc3RhdGljIHZvaWQgcGFyc2VfZTJsYWJlbF9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisJaWYgKChhcmdjIDwgMikgfHwgKGFyZ2MgPiAzKSkKKwkJYmJfc2hvd191c2FnZSgpOworCWlvX29wdGlvbnMgPSBzdHJjaHIoYXJndlsxXSwgJz8nKTsKKwlpZiAoaW9fb3B0aW9ucykKKwkJKmlvX29wdGlvbnMrKyA9IDA7CisJZGV2aWNlX25hbWUgPSB4X2Jsa2lkX2dldF9kZXZuYW1lKGFyZ3ZbMV0pOworCWlmIChhcmdjID09IDMpIHsKKwkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXIHwgRVhUMl9GTEFHX0pPVVJOQUxfREVWX09LOworCQlMX2ZsYWcgPSAxOworCQluZXdfbGFiZWwgPSBhcmd2WzJdOworCX0gZWxzZQorCQlwcmludF9sYWJlbCsrOworfQorI2Vsc2UKKyNkZWZpbmUgcGFyc2VfZTJsYWJlbF9vcHRpb25zKHgseSkKKyNlbmRpZgorCitzdGF0aWMgdGltZV90IHBhcnNlX3RpbWUoY2hhciAqc3RyKQoreworCXN0cnVjdAl0bQl0czsKKworCWlmIChzdHJjbXAoc3RyLCAibm93IikgPT0gMCkgeworCQlyZXR1cm4gdGltZSgwKTsKKwl9CisJbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7CisjaWZkZWYgSEFWRV9TVFJQVElNRQorCXN0cnB0aW1lKHN0ciwgIiVZJW0lZCVIJU0lUyIsICZ0cyk7CisjZWxzZQorCXNzY2FuZihzdHIsICIlNGQlMmQlMmQlMmQlMmQlMmQiLCAmdHMudG1feWVhciwgJnRzLnRtX21vbiwKKwkgICAgICAgJnRzLnRtX21kYXksICZ0cy50bV9ob3VyLCAmdHMudG1fbWluLCAmdHMudG1fc2VjKTsKKwl0cy50bV95ZWFyIC09IDE5MDA7CisJdHMudG1fbW9uIC09IDE7CisJaWYgKHRzLnRtX3llYXIgPCAwIHx8IHRzLnRtX21vbiA8IDAgfHwgdHMudG1fbW9uID4gMTEgfHwKKwkgICAgdHMudG1fbWRheSA8IDAgfHwgdHMudG1fbWRheSA+IDMxIHx8IHRzLnRtX2hvdXIgPiAyMyB8fAorCSAgICB0cy50bV9taW4gPiA1OSB8fCB0cy50bV9zZWMgPiA2MSkKKwkJdHMudG1fbWRheSA9IDA7CisjZW5kaWYKKwlpZiAodHMudG1fbWRheSA9PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBwYXJzZSBkYXRlL3RpbWUgc3BlY2lmaWVyOiAlcyIsIHN0cik7CisJfQorCXJldHVybiBta3RpbWUoJnRzKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfdHVuZTJmc19vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKwljaGFyICogdG1wOworCisJcHJpbnRmKCJ0dW5lMmZzICVzICglcylcbiIsIEUyRlNQUk9HU19WRVJTSU9OLCBFMkZTUFJPR1NfREFURSk7CisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJjOmU6Zmc6aTpqbG06bzpyOnM6dTpDOko6TDpNOk86VDpVOiIpKSAhPSBFT0YpCisJCXN3aXRjaCAoYykKKwkJeworCQkJY2FzZSAnYyc6CisJCQkJbWF4X21vdW50X2NvdW50ID0geGF0b3VfcmFuZ2Uob3B0YXJnLCAwLCAxNjAwMCk7CisJCQkJaWYgKG1heF9tb3VudF9jb3VudCA9PSAwKQorCQkJCQltYXhfbW91bnRfY291bnQgPSAtMTsKKwkJCQljX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0MnOgorCQkJCW1vdW50X2NvdW50ID0geGF0b3VfcmFuZ2Uob3B0YXJnLCAwLCAxNjAwMCk7CisJCQkJQ19mbGFnID0gMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdlJzoKKwkJCQlpZiAoc3RyY21wIChvcHRhcmcsICJjb250aW51ZSIpID09IDApCisJCQkJCWVycm9ycyA9IEVYVDJfRVJST1JTX0NPTlRJTlVFOworCQkJCWVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAicmVtb3VudC1ybyIpID09IDApCisJCQkJCWVycm9ycyA9IEVYVDJfRVJST1JTX1JPOworCQkJCWVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAicGFuaWMiKSA9PSAwKQorCQkJCQllcnJvcnMgPSBFWFQyX0VSUk9SU19QQU5JQzsKKwkJCQllbHNlIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBlcnJvciBiZWhhdmlvciAtICVzIiwgb3B0YXJnKTsKKwkJCQl9CisJCQkJZV9mbGFnID0gMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdmJzogLyogRm9yY2UgKi8KKwkJCQlmX2ZsYWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnZyc6CisJCQkJcmVzZ2lkID0gYmJfc3RydG91bChvcHRhcmcsIE5VTEwsIDEwKTsKKwkJCQlpZiAoZXJybm8pCisJCQkJCXJlc2dpZCA9IHhncm91cDJnaWQob3B0YXJnKTsKKwkJCQlnX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knOgorCQkJCWludGVydmFsID0gc3RydG91bChvcHRhcmcsICZ0bXAsIDApOworCQkJCXN3aXRjaCAoKnRtcCkgeworCQkJCWNhc2UgJ3MnOgorCQkJCQl0bXArKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXDAnOgorCQkJCWNhc2UgJ2QnOgorCQkJCWNhc2UgJ0QnOiAvKiBkYXlzICovCisJCQkJCWludGVydmFsICo9IDg2NDAwOworCQkJCQlpZiAoKnRtcCAhPSAnXDAnKQorCQkJCQkJdG1wKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ20nOgorCQkJCWNhc2UgJ00nOiAvKiBtb250aHMhICovCisJCQkJCWludGVydmFsICo9IDg2NDAwICogMzA7CisJCQkJCXRtcCsrOworCQkJCQlicmVhazsKKwkJCQljYXNlICd3JzoKKwkJCQljYXNlICdXJzogLyogd2Vla3MgKi8KKwkJCQkJaW50ZXJ2YWwgKj0gODY0MDAgKiA3OworCQkJCQl0bXArKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICgqdG1wIHx8IGludGVydmFsID4gKDM2NSAqIDg2NDAwKSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGludGVydmFsIC0gJXMiLCBvcHRhcmcpOworCQkJCX0KKwkJCQlpX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2onOgorCQkJCWlmICgham91cm5hbF9zaXplKQorCQkJCQlqb3VybmFsX3NpemUgPSAtMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdKJzoKKwkJCQlwYXJzZV9qb3VybmFsX29wdHMoJmpvdXJuYWxfZGV2aWNlLCAmam91cm5hbF9mbGFncywgJmpvdXJuYWxfc2l6ZSwgb3B0YXJnKTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdsJzoKKwkJCQlsX2ZsYWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJbmV3X2xhYmVsID0gb3B0YXJnOworCQkJCUxfZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXIHwKKwkJCQkJRVhUMl9GTEFHX0pPVVJOQUxfREVWX09LOworCQkJCWJyZWFrOworCQkJY2FzZSAnbSc6CisJCQkJcmVzZXJ2ZWRfcmF0aW8gPSB4YXRvdV9yYW5nZShvcHRhcmcsIDAsIDUwKTsKKwkJCQltX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ00nOgorCQkJCW5ld19sYXN0X21vdW50ZWQgPSBvcHRhcmc7CisJCQkJTV9mbGFnID0gMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdvJzoKKwkJCQlpZiAobW50b3B0c19jbWQpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi1vIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbmNlIik7CisJCQkJfQorCQkJCW1udG9wdHNfY21kID0gb3B0YXJnOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnTyc6CisJCQkJaWYgKGZlYXR1cmVzX2NtZCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiLU8gbWF5IG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UiKTsKKwkJCQl9CisJCQkJZmVhdHVyZXNfY21kID0gb3B0YXJnOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJCXJlc2VydmVkX2Jsb2NrcyA9IHhhdG91bChvcHRhcmcpOworCQkJCXJfZmxhZyA9IDE7CisJCQkJb3Blbl9mbGFnID0gRVhUMl9GTEFHX1JXOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJc19mbGFnID0gYXRvaShvcHRhcmcpOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1QnOgorCQkJCVRfZmxhZyA9IDE7CisJCQkJbGFzdF9jaGVja190aW1lID0gcGFyc2VfdGltZShvcHRhcmcpOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3UnOgorCQkJCXJlc3VpZCA9IGJiX3N0cnRvdWwob3B0YXJnLCBOVUxMLCAxMCk7CisJCQkJaWYgKGVycm5vKQorCQkJCQlyZXN1aWQgPSB4dW5hbWUydWlkKG9wdGFyZyk7CisJCQkJdV9mbGFnID0gMTsKKwkJCQlvcGVuX2ZsYWcgPSBFWFQyX0ZMQUdfUlc7CisJCQkJYnJlYWs7CisJCQljYXNlICdVJzoKKwkJCQluZXdfVVVJRCA9IG9wdGFyZzsKKwkJCQlVX2ZsYWcgPSAxOworCQkJCW9wZW5fZmxhZyA9IEVYVDJfRkxBR19SVyB8CisJCQkJCUVYVDJfRkxBR19KT1VSTkFMX0RFVl9PSzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJaWYgKG9wdGluZCA8IGFyZ2MgLSAxIHx8IG9wdGluZCA9PSBhcmdjKQorCQliYl9zaG93X3VzYWdlKCk7CisJaWYgKCFvcGVuX2ZsYWcgJiYgIWxfZmxhZykKKwkJYmJfc2hvd191c2FnZSgpOworCWlvX29wdGlvbnMgPSBzdHJjaHIoYXJndltvcHRpbmRdLCAnPycpOworCWlmIChpb19vcHRpb25zKQorCQkqaW9fb3B0aW9ucysrID0gMDsKKwlkZXZpY2VfbmFtZSA9IHhfYmxraWRfZ2V0X2Rldm5hbWUoYXJndltvcHRpbmRdKTsKK30KKworc3RhdGljIHZvaWQgdHVuZTJmc19jbGVhbl91cCh2b2lkKQoreworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBkZXZpY2VfbmFtZSkgZnJlZShkZXZpY2VfbmFtZSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIGpvdXJuYWxfZGV2aWNlKSBmcmVlKGpvdXJuYWxfZGV2aWNlKTsKK30KKworaW50IHR1bmUyZnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHR1bmUyZnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXJyY29kZV90IHJldHZhbDsKKwlleHQyX2ZpbHN5cyBmczsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqc2I7CisJaW9fbWFuYWdlciBpb19wdHI7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWF0ZXhpdCh0dW5lMmZzX2NsZWFuX3VwKTsKKworCWlmIChFTkFCTEVfRTJMQUJFTCAmJiAoYXBwbGV0X25hbWVbMF0gPT0gJ2UnKSkgLyogZTJsYWJlbCAqLworCQlwYXJzZV9lMmxhYmVsX29wdGlvbnMoYXJnYywgYXJndik7CisJZWxzZQorCQlwYXJzZV90dW5lMmZzX29wdGlvbnMoYXJnYywgYXJndik7ICAvKiB0dW5lMmZzICovCisKKwlpb19wdHIgPSB1bml4X2lvX21hbmFnZXI7CisJcmV0dmFsID0gZXh0MmZzX29wZW4yKGRldmljZV9uYW1lLCBpb19vcHRpb25zLCBvcGVuX2ZsYWcsCisJCQkgICAgICAwLCAwLCBpb19wdHIsICZmcyk7CisJaWYgKHJldHZhbCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIk5vIHZhbGlkIHN1cGVyYmxvY2sgb24gJXMiLCBkZXZpY2VfbmFtZSk7CisJc2IgPSBmcy0+c3VwZXI7CisJaWYgKHByaW50X2xhYmVsKSB7CisJCS8qIEZvciBlMmxhYmVsIGVtdWxhdGlvbiAqLworCQlwcmludGYoIiUuKnNcbiIsIChpbnQpIHNpemVvZihzYi0+c192b2x1bWVfbmFtZSksCisJCSAgICAgICBzYi0+c192b2x1bWVfbmFtZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR2YWwgPSBleHQyZnNfY2hlY2tfaWZfbW91bnRlZChkZXZpY2VfbmFtZSwgJm1vdW50X2ZsYWdzKTsKKwlpZiAocmV0dmFsKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZGV0ZXJtaW5lIGlmICVzIGlzIG1vdW50ZWQiLCBkZXZpY2VfbmFtZSk7CisJLyogTm9ybWFsbHkgd2Ugb25seSBuZWVkIHRvIHdyaXRlIG91dCB0aGUgc3VwZXJibG9jayAqLworCWZzLT5mbGFncyB8PSBFWFQyX0ZMQUdfU1VQRVJfT05MWTsKKworCWlmIChjX2ZsYWcpIHsKKwkJc2ItPnNfbWF4X21udF9jb3VudCA9IG1heF9tb3VudF9jb3VudDsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgbWF4aW1hbCBtb3VudCBjb3VudCB0byAlZFxuIiwgbWF4X21vdW50X2NvdW50KTsKKwl9CisJaWYgKENfZmxhZykgeworCQlzYi0+c19tbnRfY291bnQgPSBtb3VudF9jb3VudDsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgY3VycmVudCBtb3VudCBjb3VudCB0byAlZFxuIiwgbW91bnRfY291bnQpOworCX0KKwlpZiAoZV9mbGFnKSB7CisJCXNiLT5zX2Vycm9ycyA9IGVycm9yczsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgZXJyb3IgYmVoYXZpb3IgdG8gJWRcbiIsIGVycm9ycyk7CisJfQorCWlmIChnX2ZsYWcpIHsKKwkJc2ItPnNfZGVmX3Jlc2dpZCA9IHJlc2dpZDsKKwkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQlwcmludGYoIlNldHRpbmcgcmVzZXJ2ZWQgYmxvY2tzIGdpZCB0byAlbHVcbiIsIHJlc2dpZCk7CisJfQorCWlmIChpX2ZsYWcpIHsKKwkJc2ItPnNfY2hlY2tpbnRlcnZhbCA9IGludGVydmFsOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCXByaW50ZigiU2V0dGluZyBpbnRlcnZhbCBiZXR3ZWVuIGNoZWNrICVsdSBzZWNvbmRzXG4iLCBpbnRlcnZhbCk7CisJfQorCWlmIChtX2ZsYWcpIHsKKwkJc2ItPnNfcl9ibG9ja3NfY291bnQgPSAoc2ItPnNfYmxvY2tzX2NvdW50IC8gMTAwKQorCQkJCSogcmVzZXJ2ZWRfcmF0aW87CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJcHJpbnRmKCJTZXR0aW5nIHJlc2VydmVkIGJsb2NrcyBwZXJjZW50YWdlIHRvICV1ICgldSBibG9ja3MpXG4iLAorCQkJcmVzZXJ2ZWRfcmF0aW8sIHNiLT5zX3JfYmxvY2tzX2NvdW50KTsKKwl9CisJaWYgKHJfZmxhZykgeworCQlpZiAocmVzZXJ2ZWRfYmxvY2tzID49IHNiLT5zX2Jsb2Nrc19jb3VudC8yKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc2VydmVkIGJsb2NrcyBjb3VudCBpcyB0b28gYmlnICglbHUpIiwgcmVzZXJ2ZWRfYmxvY2tzKTsKKwkJc2ItPnNfcl9ibG9ja3NfY291bnQgPSByZXNlcnZlZF9ibG9ja3M7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJcHJpbnRmKCJTZXR0aW5nIHJlc2VydmVkIGJsb2NrcyBjb3VudCB0byAlbHVcbiIsIHJlc2VydmVkX2Jsb2Nrcyk7CisJfQorCWlmIChzX2ZsYWcgPT0gMSkgeworCQlpZiAoc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJgorCQkgICAgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpCisJCQliYl9lcnJvcl9tc2coIlxuVGhlIGZpbGVzeXN0ZW0gYWxyZWFkeSBoYXMgc3BhcnNlIHN1cGVyYmxvY2tzIik7CisJCWVsc2UgeworCQkJc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgfD0KKwkJCQlFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUjsKKwkJCXNiLT5zX3N0YXRlICY9IH5FWFQyX1ZBTElEX0ZTOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQkJcHJpbnRmKCJcblNwYXJzZSBzdXBlcmJsb2NrIGZsYWcgc2V0LiAgJXMiLCBwbGVhc2VfZnNjayk7CisJCX0KKwl9CisJaWYgKHNfZmxhZyA9PSAwKSB7CisJCWlmICghKHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYKKwkJICAgICAgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpKQorCQkJYmJfZXJyb3JfbXNnKCJcblRoZSBmaWxlc3lzdGVtIGFscmVhZHkgaGFzIHNwYXJzZSBzdXBlcmJsb2NrcyBkaXNhYmxlZCIpOworCQllbHNlIHsKKwkJCXNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICY9CisJCQkJfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSOworCQkJc2ItPnNfc3RhdGUgJj0gfkVYVDJfVkFMSURfRlM7CisJCQlmcy0+ZmxhZ3MgfD0gRVhUMl9GTEFHX01BU1RFUl9TQl9PTkxZOworCQkJZXh0MmZzX21hcmtfc3VwZXJfZGlydHkoZnMpOworCQkJcHJpbnRmKCJcblNwYXJzZSBzdXBlcmJsb2NrIGZsYWcgY2xlYXJlZC4gICVzIiwgcGxlYXNlX2ZzY2spOworCQl9CisJfQorCWlmIChUX2ZsYWcpIHsKKwkJc2ItPnNfbGFzdGNoZWNrID0gbGFzdF9jaGVja190aW1lOworCQlleHQyZnNfbWFya19zdXBlcl9kaXJ0eShmcyk7CisJCXByaW50ZigiU2V0dGluZyB0aW1lIGZpbGVzeXN0ZW0gbGFzdCBjaGVja2VkIHRvICVzXG4iLAorCQkgICAgICAgY3RpbWUoJmxhc3RfY2hlY2tfdGltZSkpOworCX0KKwlpZiAodV9mbGFnKSB7CisJCXNiLT5zX2RlZl9yZXN1aWQgPSByZXN1aWQ7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwkJcHJpbnRmKCJTZXR0aW5nIHJlc2VydmVkIGJsb2NrcyB1aWQgdG8gJWx1XG4iLCByZXN1aWQpOworCX0KKwlpZiAoTF9mbGFnKSB7CisJCWlmIChzdHJsZW4obmV3X2xhYmVsKSA+IHNpemVvZihzYi0+c192b2x1bWVfbmFtZSkpCisJCQliYl9lcnJvcl9tc2coIldhcm5pbmc6IGxhYmVsIHRvbyBsb25nLCB0cnVuY2F0aW5nIik7CisJCW1lbXNldChzYi0+c192b2x1bWVfbmFtZSwgMCwgc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSk7CisJCXNhZmVfc3RybmNweShzYi0+c192b2x1bWVfbmFtZSwgbmV3X2xhYmVsLAorCQkJc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSk7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwl9CisJaWYgKE1fZmxhZykgeworCQltZW1zZXQoc2ItPnNfbGFzdF9tb3VudGVkLCAwLCBzaXplb2Yoc2ItPnNfbGFzdF9tb3VudGVkKSk7CisJCXNhZmVfc3RybmNweShzYi0+c19sYXN0X21vdW50ZWQsIG5ld19sYXN0X21vdW50ZWQsCisJCQlzaXplb2Yoc2ItPnNfbGFzdF9tb3VudGVkKSk7CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwl9CisJaWYgKG1udG9wdHNfY21kKQorCQl1cGRhdGVfbW50b3B0cyhmcywgbW50b3B0c19jbWQpOworCWlmIChmZWF0dXJlc19jbWQpCisJCXVwZGF0ZV9mZWF0dXJlX3NldChmcywgZmVhdHVyZXNfY21kKTsKKwlpZiAoam91cm5hbF9zaXplIHx8IGpvdXJuYWxfZGV2aWNlKQorCQlhZGRfam91cm5hbChmcyk7CisKKwlpZiAoVV9mbGFnKSB7CisJCWlmICgoc3RyY2FzZWNtcChuZXdfVVVJRCwgIm51bGwiKSA9PSAwKSB8fAorCQkgICAgKHN0cmNhc2VjbXAobmV3X1VVSUQsICJjbGVhciIpID09IDApKSB7CisJCQl1dWlkX2NsZWFyKHNiLT5zX3V1aWQpOworCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAobmV3X1VVSUQsICJ0aW1lIikgPT0gMCkgeworCQkJdXVpZF9nZW5lcmF0ZV90aW1lKHNiLT5zX3V1aWQpOworCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAobmV3X1VVSUQsICJyYW5kb20iKSA9PSAwKSB7CisJCQl1dWlkX2dlbmVyYXRlKHNiLT5zX3V1aWQpOworCQl9IGVsc2UgaWYgKHV1aWRfcGFyc2UobmV3X1VVSUQsIHNiLT5zX3V1aWQpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiSW52YWxpZCBVVUlEIGZvcm1hdCIpOworCQl9CisJCWV4dDJmc19tYXJrX3N1cGVyX2RpcnR5KGZzKTsKKwl9CisKKwlpZiAobF9mbGFnKQorCQlsaXN0X3N1cGVyIChzYik7CisJcmV0dXJuIChleHQyZnNfY2xvc2UgKGZzKSA/IDEgOiAwKTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V0aWwuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFhYmMyCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXRpbC5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1dGlsLmMgLS0tIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSB0dW5lMmZzIGFuZCBta2UyZnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBieSBUaGVvZG9yZSBUcydvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJlMmZzYmIuaCIKKyNpbmNsdWRlICJlMnAvZTJwLmgiCisjaW5jbHVkZSAiZXh0MmZzL2V4dDJfZnMuaCIKKyNpbmNsdWRlICJleHQyZnMvZXh0MmZzLmgiCisjaW5jbHVkZSAiYmxraWQvYmxraWQuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKK3ZvaWQgcHJvY2VlZF9xdWVzdGlvbih2b2lkKQoreworCWZwdXRzKCJQcm9jZWVkIGFueXdheT8gKHksbikgIiwgc3Rkb3V0KTsKKwlpZiAoYmJfYXNrX2NvbmZpcm1hdGlvbigpID09IDApCisJCWV4aXQoMSk7Cit9CisKK3ZvaWQgY2hlY2tfcGxhdXNpYmlsaXR5KGNvbnN0IGNoYXIgKmRldmljZSwgaW50IGZvcmNlKQoreworCWludCB2YWw7CisJc3RydWN0IHN0YXQgczsKKwl2YWwgPSBzdGF0KGRldmljZSwgJnMpOworCWlmIChmb3JjZSkKKwkJcmV0dXJuOworCWlmICh2YWwgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc3RhdCAnJXMnIiwgZGV2aWNlKTsKKwlpZiAoIVNfSVNCTEsocy5zdF9tb2RlKSkgeworCQlwcmludGYoIiVzIGlzIG5vdCBhIGJsb2NrIHNwZWNpYWwgZGV2aWNlLlxuIiwgZGV2aWNlKTsKKwkJcHJvY2VlZF9xdWVzdGlvbigpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgSEFWRV9MSU5VWF9NQUpPUl9ICisjaWZuZGVmIE1BSk9SCisjZGVmaW5lIE1BSk9SKGRldikJKChkZXYpPj44KQorI2RlZmluZSBNSU5PUihkZXYpCSgoZGV2KSAmIDB4ZmYpCisjZW5kaWYKKyNpZm5kZWYgU0NTSV9CTEtfTUFKT1IKKyNpZmRlZiBTQ1NJX0RJU0swX01BSk9SCisjaWZkZWYgU0NTSV9ESVNLOF9NQUpPUgorI2RlZmluZSBTQ1NJX0RJU0tfTUFKT1IoTSkgKChNKSA9PSBTQ1NJX0RJU0swX01BSk9SIHx8IFwKKyAgKChNKSA+PSBTQ1NJX0RJU0sxX01BSk9SICYmIChNKSA8PSBTQ1NJX0RJU0s3X01BSk9SKSB8fCBcCisgICgoTSkgPj0gU0NTSV9ESVNLOF9NQUpPUiAmJiAoTSkgPD0gU0NTSV9ESVNLMTVfTUFKT1IpKQorI2Vsc2UKKyNkZWZpbmUgU0NTSV9ESVNLX01BSk9SKE0pICgoTSkgPT0gU0NTSV9ESVNLMF9NQUpPUiB8fCBcCisgICgoTSkgPj0gU0NTSV9ESVNLMV9NQUpPUiAmJiAoTSkgPD0gU0NTSV9ESVNLN19NQUpPUikpCisjZW5kaWYgLyogZGVmaW5lZChTQ1NJX0RJU0s4X01BSk9SKSAqLworI2RlZmluZSBTQ1NJX0JMS19NQUpPUihNKSAoU0NTSV9ESVNLX01BSk9SKChNKSkgfHwgKE0pID09IFNDU0lfQ0RST01fTUFKT1IpCisjZWxzZQorI2RlZmluZSBTQ1NJX0JMS19NQUpPUihNKSAgKChNKSA9PSBTQ1NJX0RJU0tfTUFKT1IgfHwgKE0pID09IFNDU0lfQ0RST01fTUFKT1IpCisjZW5kaWYgLyogZGVmaW5lZChTQ1NJX0RJU0swX01BSk9SKSAqLworI2VuZGlmIC8qIGRlZmluZWQoU0NTSV9CTEtfTUFKT1IpICovCisJaWYgKCgoTUFKT1Iocy5zdF9yZGV2KSA9PSBIRF9NQUpPUiAmJgorCSAgICAgIE1JTk9SKHMuc3RfcmRldiklNjQgPT0gMCkgfHwKKwkgICAgIChTQ1NJX0JMS19NQUpPUihNQUpPUihzLnN0X3JkZXYpKSAmJgorCSAgICAgIE1JTk9SKHMuc3RfcmRldiklMTYgPT0gMCkpKSB7CisJCXByaW50ZigiJXMgaXMgZW50aXJlIGRldmljZSwgbm90IGp1c3Qgb25lIHBhcnRpdGlvbiFcbiIsIGRldmljZSk7CisJCXByb2NlZWRfcXVlc3Rpb24oKTsKKwl9CisjZW5kaWYKK30KKwordm9pZCBjaGVja19tb3VudChjb25zdCBjaGFyICpkZXZpY2UsIGludCBmb3JjZSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwllcnJjb2RlX3QgcmV0dmFsOworCWludCBtb3VudF9mbGFnczsKKworCXJldHZhbCA9IGV4dDJmc19jaGVja19pZl9tb3VudGVkKGRldmljZSwgJm1vdW50X2ZsYWdzKTsKKwlpZiAocmV0dmFsKSB7CisJCWJiX2Vycm9yX21zZygiY2FuJ3QgZGV0ZXJtaW5lIGlmICVzIGlzIG1vdW50ZWQiLCBkZXZpY2UpOworCQlyZXR1cm47CisJfQorCWlmIChtb3VudF9mbGFncyAmIEVYVDJfTUZfTU9VTlRFRCkgeworCQliYl9lcnJvcl9tc2coIiVzIGlzIG1vdW50ZWQgISIsIGRldmljZSk7Citmb3JjZV9jaGVjazoKKwkJaWYgKGZvcmNlKQorCQkJYmJfZXJyb3JfbXNnKCJiYWRibG9ja3MgZm9yY2VkIGFueXdheXMiKTsKKwkJZWxzZQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIml0J3Mgbm90IHNhZmUgdG8gcnVuIGJhZGJsb2NrcyEiKTsKKwl9CisKKwlpZiAobW91bnRfZmxhZ3MgJiBFWFQyX01GX0JVU1kpIHsKKwkJYmJfZXJyb3JfbXNnKCIlcyBpcyBhcHBhcmVudGx5IGluIHVzZSBieSB0aGUgc3lzdGVtIiwgZGV2aWNlKTsKKwkJZ290byBmb3JjZV9jaGVjazsKKwl9Cit9CisKK3ZvaWQgcGFyc2Vfam91cm5hbF9vcHRzKGNoYXIgKipqb3VybmFsX2RldmljZSwgaW50ICpqb3VybmFsX2ZsYWdzLAorCQkJaW50ICpqb3VybmFsX3NpemUsIGNvbnN0IGNoYXIgKm9wdHMpCit7CisJY2hhciAqYnVmLCAqdG9rZW4sICpuZXh0LCAqcCwgKmFyZzsKKwlpbnQgam91cm5hbF91c2FnZSA9IDA7CisJYnVmID0geHN0cmR1cChvcHRzKTsKKwlmb3IgKHRva2VuID0gYnVmOyB0b2tlbiAmJiAqdG9rZW47IHRva2VuID0gbmV4dCkgeworCQlwID0gc3RyY2hyKHRva2VuLCAnLCcpOworCQluZXh0ID0gMDsKKwkJaWYgKHApIHsKKwkJCSpwID0gMDsKKwkJCW5leHQgPSBwKzE7CisJCX0KKwkJYXJnID0gc3RyY2hyKHRva2VuLCAnPScpOworCQlpZiAoYXJnKSB7CisJCQkqYXJnID0gMDsKKwkJCWFyZysrOworCQl9CisJCWlmIChzdHJjbXAodG9rZW4sICJkZXZpY2UiKSA9PSAwKSB7CisJCQkqam91cm5hbF9kZXZpY2UgPSBibGtpZF9nZXRfZGV2bmFtZShOVUxMLCBhcmcsIE5VTEwpOworCQkJaWYgKCFqb3VybmFsX2RldmljZSkgeworCQkJCWpvdXJuYWxfdXNhZ2UrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJzaXplIikgPT0gMCkgeworCQkJaWYgKCFhcmcpIHsKKwkJCQlqb3VybmFsX3VzYWdlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQkoKmpvdXJuYWxfc2l6ZSkgPSBzdHJ0b3VsKGFyZywgJnAsIDApOworCQkJaWYgKCpwKQorCQkJCWpvdXJuYWxfdXNhZ2UrKzsKKwkJfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ2MV9zdXBlcmJsb2NrIikgPT0gMCkgeworCQkJKCpqb3VybmFsX2ZsYWdzKSB8PSBFWFQyX01LSk9VUk5BTF9WMV9TVVBFUjsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWpvdXJuYWxfdXNhZ2UrKzsKKwl9CisJaWYgKGpvdXJuYWxfdXNhZ2UpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJIlxuQmFkIGpvdXJuYWwgb3B0aW9ucyBzcGVjaWZpZWQuXG5cbiIKKwkJCSJKb3VybmFsIG9wdGlvbnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsICIKKwkJCSJhbmQgbWF5IHRha2UgYW4gYXJndW1lbnQgd2hpY2hcbiIKKwkJCSJcdGlzIHNldCBvZmYgYnkgYW4gZXF1YWxzICgnPScpIHNpZ24uXG5cbiIKKwkJCSJWYWxpZCBqb3VybmFsIG9wdGlvbnMgYXJlOlxuIgorCQkJIlx0c2l6ZT08am91cm5hbCBzaXplIGluIG1lZ2FieXRlcz5cbiIKKwkJCSJcdGRldmljZT08am91cm5hbCBkZXZpY2U+XG5cbiIKKwkJCSJUaGUgam91cm5hbCBzaXplIG11c3QgYmUgYmV0d2VlbiAiCisJCQkiMTAyNCBhbmQgMTAyNDAwIGZpbGVzeXN0ZW0gYmxvY2tzLlxuXG4iKTsKK30KKworLyoKKyAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGpvdXJuYWwgYmxvY2tzIHRvIHVzZSwgZWl0aGVyIHZpYQorICogdXNlci1zcGVjaWZpZWQgIyBvZiBtZWdhYnl0ZXMsIG9yIHZpYSBzb21lIGludGVsbGlnZW50bHkgc2VsZWN0ZWQKKyAqIGRlZmF1bHRzLgorICoKKyAqIEZpbmQgYSByZWFzb25hYmxlIGpvdXJuYWwgZmlsZSBzaXplIChpbiBibG9ja3MpIGdpdmVuIHRoZSBudW1iZXIgb2YgYmxvY2tzCisgKiBpbiB0aGUgZmlsZXN5c3RlbS4gIEZvciB2ZXJ5IHNtYWxsIGZpbGVzeXN0ZW1zLCBpdCBpcyBub3QgcmVhc29uYWJsZSB0bworICogaGF2ZSBhIGpvdXJuYWwgdGhhdCBmaWxscyBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqLworaW50IGZpZ3VyZV9qb3VybmFsX3NpemUoaW50IHNpemUsIGV4dDJfZmlsc3lzIGZzKQoreworCWJsa190IGpfYmxvY2tzOworCisJaWYgKGZzLT5zdXBlci0+c19ibG9ja3NfY291bnQgPCAyMDQ4KSB7CisJCWJiX2Vycm9yX21zZygiRmlsZXN5c3RlbSB0b28gc21hbGwgZm9yIGEgam91cm5hbCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2l6ZSA+PSAwKSB7CisJCWpfYmxvY2tzID0gc2l6ZSAqIDEwMjQgLyAoZnMtPmJsb2Nrc2l6ZQkvIDEwMjQpOworCQlpZiAoal9ibG9ja3MgPCAxMDI0IHx8IGpfYmxvY2tzID4gMTAyNDAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlxuVGhlIHJlcXVlc3RlZCBqb3VybmFsICIKKwkJCQkic2l6ZSBpcyAlZCBibG9ja3M7XG4gaXQgbXVzdCBiZSAiCisJCQkJImJldHdlZW4gMTAyNCBhbmQgMTAyNDAwIGJsb2NrczsgQWJvcnRpbmciLAorCQkJCWpfYmxvY2tzKTsKKwkJaWYgKGpfYmxvY2tzID4gZnMtPnN1cGVyLT5zX2ZyZWVfYmxvY2tzX2NvdW50KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkpvdXJuYWwgc2l6ZSB0b28gYmlnIGZvciBmaWxlc3lzdGVtIik7CisJCXJldHVybiBqX2Jsb2NrczsKKwl9CisKKwlpZiAoZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCA8IDMyNzY4KQorCQlqX2Jsb2NrcyA9IDEwMjQ7CisJZWxzZSBpZiAoZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCA8IDI1NioxMDI0KQorCQlqX2Jsb2NrcyA9IDQwOTY7CisJZWxzZSBpZiAoZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCA8IDUxMioxMDI0KQorCQlqX2Jsb2NrcyA9IDgxOTI7CisJZWxzZSBpZiAoZnMtPnN1cGVyLT5zX2Jsb2Nrc19jb3VudCA8IDEwMjQqMTAyNCkKKwkJal9ibG9ja3MgPSAxNjM4NDsKKwllbHNlCisJCWpfYmxvY2tzID0gMzI3Njg7CisKKwlyZXR1cm4gal9ibG9ja3M7Cit9CisKK3ZvaWQgcHJpbnRfY2hlY2tfbWVzc2FnZShleHQyX2ZpbHN5cyBmcykKK3sKKwlwcmludGYoIlRoaXMgZmlsZXN5c3RlbSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgIgorCQkgImNoZWNrZWQgZXZlcnkgJWQgbW91bnRzIG9yXG4iCisJCSAiJWcgZGF5cywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiAgIgorCQkgIlVzZSB0dW5lMmZzIC1jIG9yIC1pIHRvIG92ZXJyaWRlLlxuIiwKKwkgICAgICAgZnMtPnN1cGVyLT5zX21heF9tbnRfY291bnQsCisJICAgICAgIChkb3VibGUpZnMtPnN1cGVyLT5zX2NoZWNraW50ZXJ2YWwgLyAoMzYwMCAqIDI0KSk7Cit9CisKK3ZvaWQgbWFrZV9qb3VybmFsX2RldmljZShjaGFyICpqb3VybmFsX2RldmljZSwgZXh0Ml9maWxzeXMgZnMsIGludCBxdWlldCwgaW50IGZvcmNlKQoreworCWVycmNvZGVfdAlyZXR2YWw7CisJZXh0Ml9maWxzeXMJamZzOworCWlvX21hbmFnZXIJaW9fcHRyOworCisJY2hlY2tfcGxhdXNpYmlsaXR5KGpvdXJuYWxfZGV2aWNlLCBmb3JjZSk7CisJY2hlY2tfbW91bnQoam91cm5hbF9kZXZpY2UsIGZvcmNlLCAiam91cm5hbCIpOworCWlvX3B0ciA9IHVuaXhfaW9fbWFuYWdlcjsKKwlyZXR2YWwgPSBleHQyZnNfb3Blbihqb3VybmFsX2RldmljZSwgRVhUMl9GTEFHX1JXfAorCQkJCQlFWFQyX0ZMQUdfSk9VUk5BTF9ERVZfT0ssIDAsCisJCQkJCWZzLT5ibG9ja3NpemUsIGlvX3B0ciwgJmpmcyk7CisJaWYgKHJldHZhbCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGpvdXJuYWwgZGV2aWNlICVzIiwgam91cm5hbF9kZXZpY2UpOworCWlmICghcXVpZXQpCisJCXByaW50ZigiQWRkaW5nIGpvdXJuYWwgdG8gZGV2aWNlICVzOiAiLCBqb3VybmFsX2RldmljZSk7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dmFsID0gZXh0MmZzX2FkZF9qb3VybmFsX2RldmljZShmcywgamZzKTsKKwlpZiAocmV0dmFsKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXG5GYWlsZWQgdG8gYWRkIGpvdXJuYWwgdG8gZGV2aWNlICVzIiwgam91cm5hbF9kZXZpY2UpOworCWlmICghcXVpZXQpCisJCXB1dHMoImRvbmUiKTsKKwlleHQyZnNfY2xvc2UoamZzKTsKK30KKwordm9pZCBtYWtlX2pvdXJuYWxfYmxvY2tzKGV4dDJfZmlsc3lzIGZzLCBpbnQgam91cm5hbF9zaXplLCBpbnQgam91cm5hbF9mbGFncywgaW50IHF1aWV0KQoreworCXVuc2lnbmVkIGxvbmcgam91cm5hbF9ibG9ja3M7CisJZXJyY29kZV90CXJldHZhbDsKKworCWpvdXJuYWxfYmxvY2tzID0gZmlndXJlX2pvdXJuYWxfc2l6ZShqb3VybmFsX3NpemUsIGZzKTsKKwlpZiAoIWpvdXJuYWxfYmxvY2tzKSB7CisJCWZzLT5zdXBlci0+c19mZWF0dXJlX2NvbXBhdCAmPQorCQkJfkVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUw7CisJCXJldHVybjsKKwl9CisJaWYgKCFxdWlldCkKKwkJcHJpbnRmKCJDcmVhdGluZyBqb3VybmFsICglbGQgYmxvY2tzKTogIiwgam91cm5hbF9ibG9ja3MpOworCWZmbHVzaChzdGRvdXQpOworCXJldHZhbCA9IGV4dDJmc19hZGRfam91cm5hbF9pbm9kZShmcywgam91cm5hbF9ibG9ja3MsCisJCQkJCQkgIGpvdXJuYWxfZmxhZ3MpOworCWlmIChyZXR2YWwpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjcmVhdGUgam91cm5hbCIpOworCWlmICghcXVpZXQpCisJCXB1dHMoImRvbmUiKTsKK30KKworY2hhciAqZTJmc19zZXRfc2Jpbl9wYXRoKHZvaWQpCit7CisJY2hhciAqb2xkcGF0aCA9IGdldGVudigiUEFUSCIpOworCS8qIFVwZGF0ZSBvdXIgUEFUSCB0byBpbmNsdWRlIC9zYmluICAqLworI2RlZmluZSBQQVRIX1NFVCAiL3NiaW4iCisJaWYgKG9sZHBhdGgpCisJCW9sZHBhdGggPSB4YXNwcmludGYoIiVzOiVzIiwgUEFUSF9TRVQsIG9sZHBhdGgpOworCSBlbHNlCisJCW9sZHBhdGggPSBQQVRIX1NFVDsKKwlwdXRlbnYob2xkcGF0aCk7CisJcmV0dXJuIG9sZHBhdGg7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dGlsLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkMjQxNwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V0aWwuaApAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1dGlsLmggLS0tIGhlYWRlciBmaWxlIGRlZmluaW5nIHByb3RvdHlwZXMgZm9yIGhlbHBlciBmdW5jdGlvbnMKKyAqIHVzZWQgYnkgdHVuZTJmcyBhbmQgbWtlMmZzCisgKgorICogQ29weXJpZ2h0IDIwMDAgYnkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYworICogTGljZW5zZS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKK2V4dGVybiB2b2lkIHByb2NlZWRfcXVlc3Rpb24odm9pZCk7CitleHRlcm4gdm9pZCBjaGVja19wbGF1c2liaWxpdHkoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgcGFyc2Vfam91cm5hbF9vcHRzKGNoYXIgKiosIGludCAqLCBpbnQgKiwgY29uc3QgY2hhciAqb3B0cyk7CitleHRlcm4gdm9pZCBjaGVja19tb3VudChjb25zdCBjaGFyICpkZXZpY2UsIGludCBmb3JjZSwgY29uc3QgY2hhciAqdHlwZSk7CitleHRlcm4gaW50IGZpZ3VyZV9qb3VybmFsX3NpemUoaW50IHNpemUsIGV4dDJfZmlsc3lzIGZzKTsKK2V4dGVybiB2b2lkIHByaW50X2NoZWNrX21lc3NhZ2UoZXh0Ml9maWxzeXMgZnMpOworZXh0ZXJuIHZvaWQgbWFrZV9qb3VybmFsX2RldmljZShjaGFyICpqb3VybmFsX2RldmljZSwgZXh0Ml9maWxzeXMgZnMsIGludCBxdWlldCwgaW50IGZvcmNlKTsKK2V4dGVybiB2b2lkIG1ha2Vfam91cm5hbF9ibG9ja3MoZXh0Ml9maWxzeXMgZnMsIGludCBqb3VybmFsX3NpemUsIGludCBqb3VybmFsX2ZsYWdzLCBpbnQgcXVpZXQpOworZXh0ZXJuIGNoYXIgKmUyZnNfc2V0X3NiaW5fcGF0aCh2b2lkKTsKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvS2J1aWxkLnNyYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM2ODdkCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitORUVERUQtJChDT05GSUdfRTJGU0NLKSA9IHkKK05FRURFRC0kKENPTkZJR19GU0NLKSA9IHkKK05FRURFRC0kKENPTkZJR19NS0UyRlMpID0geQorTkVFREVELSQoQ09ORklHX1RVTkUyRlMpID0geQorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoTkVFREVELXkpICs9IGNvbXBhcmUubyBnZW5fdXVpZC5vIHBhY2subyBwYXJzZS5vIHVucGFjay5vIHVucGFyc2UubyBcCisgICAgICAgICAgICAgICAgICAgdXVpZF90aW1lLm8KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvY29tcGFyZS5jIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9jb21wYXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4ZWE3YwotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvY29tcGFyZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNvbXBhcmUuYyAtLS0gY29tcGFyZSB3aGV0aGVyIG9yIG5vdCB0d28gVVVJRCdzIGFyZSB0aGUgc2FtZQorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgdHdvIFVVSUQncyBhcmUgZGlmZmVyZW50LCBhbmQgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSAidXVpZFAuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBVVUNNUCh1MSx1MikgaWYgKHUxICE9IHUyKSByZXR1cm4gKHUxIDwgdTIpID8gLTEgOiAxOworCitpbnQgdXVpZF9jb21wYXJlKGNvbnN0IHV1aWRfdCB1dTEsIGNvbnN0IHV1aWRfdCB1dTIpCit7CisJc3RydWN0IHV1aWQJdXVpZDEsIHV1aWQyOworCisJdXVpZF91bnBhY2sodXUxLCAmdXVpZDEpOworCXV1aWRfdW5wYWNrKHV1MiwgJnV1aWQyKTsKKworCVVVQ01QKHV1aWQxLnRpbWVfbG93LCB1dWlkMi50aW1lX2xvdyk7CisJVVVDTVAodXVpZDEudGltZV9taWQsIHV1aWQyLnRpbWVfbWlkKTsKKwlVVUNNUCh1dWlkMS50aW1lX2hpX2FuZF92ZXJzaW9uLCB1dWlkMi50aW1lX2hpX2FuZF92ZXJzaW9uKTsKKwlVVUNNUCh1dWlkMS5jbG9ja19zZXEsIHV1aWQyLmNsb2NrX3NlcSk7CisJcmV0dXJuIG1lbWNtcCh1dWlkMS5ub2RlLCB1dWlkMi5ub2RlLCA2KTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvZ2VuX3V1aWQuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvZ2VuX3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzEwYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9nZW5fdXVpZC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBnZW5fdXVpZC5jIC0tLSBnZW5lcmF0ZSBhIERDRS1jb21wYXRpYmxlIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLSU9fSAorI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUX0lGX0gKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRfSUZfRExfSAorI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ1dWlkUC5oIgorCisjaWZkZWYgSEFWRV9TUkFORE9NCisjZGVmaW5lIHNyYW5kKHgpCXNyYW5kb20oeCkKKyNkZWZpbmUgcmFuZCgpCQlyYW5kb20oKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X3JhbmRvbV9mZCh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsCXR2OworCXN0YXRpYyBpbnQJZmQgPSAtMjsKKwlpbnQJCWk7CisKKwlpZiAoZmQgPT0gLTIpIHsKKwkJZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisJCWZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworCQlpZiAoZmQgPT0gLTEpCisJCQlmZCA9IG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKwkJc3JhbmQoKGdldHBpZCgpIDw8IDE2KSBeIGdldHVpZCgpIF4gdHYudHZfc2VjIF4gdHYudHZfdXNlYyk7CisJfQorCS8qIENyYW5rIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBhIGZldyB0aW1lcyAqLworCWdldHRpbWVvZmRheSgmdHYsIDApOworCWZvciAoaSA9ICh0di50dl9zZWMgXiB0di50dl91c2VjKSAmIDB4MUY7IGkgPiAwOyBpLS0pCisJCXJhbmQoKTsKKwlyZXR1cm4gZmQ7Cit9CisKKworLyoKKyAqIEdlbmVyYXRlIGEgc2VyaWVzIG9mIHJhbmRvbSBieXRlcy4gIFVzZSAvZGV2L3VyYW5kb20gaWYgcG9zc2libGUsCisgKiBhbmQgaWYgbm90LCB1c2Ugc3JhbmRvbS9yYW5kb20uCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yYW5kb21fYnl0ZXModm9pZCAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWludCBpLCBuID0gbmJ5dGVzLCBmZCA9IGdldF9yYW5kb21fZmQoKTsKKwlpbnQgbG9zZV9jb3VudGVyID0gMDsKKwl1bnNpZ25lZCBjaGFyICpjcCA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKKworCWlmIChmZCA+PSAwKSB7CisJCXdoaWxlIChuID4gMCkgeworCQkJaSA9IHJlYWQoZmQsIGNwLCBuKTsKKwkJCWlmIChpIDw9IDApIHsKKwkJCQlpZiAobG9zZV9jb3VudGVyKysgPiAxNikKKwkJCQkJYnJlYWs7CisJCQkJY29udGludWU7CisJCQl9CisJCQluIC09IGk7CisJCQljcCArPSBpOworCQkJbG9zZV9jb3VudGVyID0gMDsKKwkJfQorCX0KKworCS8qCisJICogV2UgZG8gdGhpcyBhbGwgdGhlIHRpbWUsIGJ1dCB0aGlzIGlzIHRoZSBvbmx5IHNvdXJjZSBvZgorCSAqIHJhbmRvbW5lc3MgaWYgL2Rldi9yYW5kb20vdXJhbmRvbSBpcyBvdXQgdG8gbHVuY2guCisJICovCisJZm9yIChjcCA9IGJ1ZiwgaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKwkJKmNwKysgXj0gKHJhbmQoKSA+PiA3KSAmIDB4RkY7Cit9CisKKy8qCisgKiBHZXQgdGhlIGV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MsIGlmIHdlIGNhbiBmaW5kIGl0Li4uCisgKi8KK3N0YXRpYyBpbnQgZ2V0X25vZGVfaWQodW5zaWduZWQgY2hhciAqbm9kZV9pZCkKK3sKKyNpZmRlZiBIQVZFX05FVF9JRl9ICisJaW50CQlzZDsKKwlzdHJ1Y3QgaWZyZXEJaWZyLCAqaWZycDsKKwlzdHJ1Y3QgaWZjb25mCWlmYzsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQJCW4sIGk7CisJdW5zaWduZWQgY2hhcgkqYTsKKyNpZmRlZiBIQVZFX05FVF9JRl9ETF9ICisJc3RydWN0IHNvY2thZGRyX2RsICpzZGxwOworI2VuZGlmCisKKy8qCisgKiBCU0QgNC40IGRlZmluZXMgdGhlIHNpemUgb2YgYW4gaWZyZXEgdG8gYmUKKyAqIG1heChzaXplb2YoaWZyZXEpLCBzaXplb2YoaWZyZXEuaWZyX25hbWUpK2lmcmVxLmlmcl9hZGRyLnNhX2xlbgorICogSG93ZXZlciwgdW5kZXIgZWFybGllciBzeXN0ZW1zLCBzYV9sZW4gaXNuJ3QgcHJlc2VudCwgc28gdGhlIHNpemUgaXMKKyAqIGp1c3Qgc2l6ZW9mKHN0cnVjdCBpZnJlcSkKKyAqLworI2lmZGVmIEhBVkVfU0FfTEVOCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjZGVmaW5lIGlmcmVxX3NpemUoaSkgbWF4KHNpemVvZihzdHJ1Y3QgaWZyZXEpLFwKKyAgICAgc2l6ZW9mKChpKS5pZnJfbmFtZSkrKGkpLmlmcl9hZGRyLnNhX2xlbikKKyNlbHNlCisjZGVmaW5lIGlmcmVxX3NpemUoaSkgc2l6ZW9mKHN0cnVjdCBpZnJlcSkKKyNlbmRpZiAvKiBIQVZFX1NBX0xFTiovCisKKwlzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX0lQKTsKKwlpZiAoc2QgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWlmYy5pZmNfbGVuID0gc2l6ZW9mKGJ1Zik7CisJaWZjLmlmY19idWYgPSBidWY7CisJaWYgKGlvY3RsIChzZCwgU0lPQ0dJRkNPTkYsIChjaGFyICopJmlmYykgPCAwKSB7CisJCWNsb3NlKHNkKTsKKwkJcmV0dXJuIC0xOworCX0KKwluID0gaWZjLmlmY19sZW47CisJZm9yIChpID0gMDsgaSA8IG47IGkrPSBpZnJlcV9zaXplKCppZnJwKSApIHsKKwkJaWZycCA9IChzdHJ1Y3QgaWZyZXEgKikoKGNoYXIgKikgaWZjLmlmY19idWYraSk7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZnJwLT5pZnJfbmFtZSk7CisjaWZkZWYgU0lPQ0dJRkhXQUREUgorCQlpZiAoaW9jdGwoc2QsIFNJT0NHSUZIV0FERFIsICZpZnIpIDwgMCkKKwkJCWNvbnRpbnVlOworCQlhID0gKHVuc2lnbmVkIGNoYXIgKikgJmlmci5pZnJfaHdhZGRyLnNhX2RhdGE7CisjZWxzZQorI2lmZGVmIFNJT0NHRU5BRERSCisJCWlmIChpb2N0bChzZCwgU0lPQ0dFTkFERFIsICZpZnIpIDwgMCkKKwkJCWNvbnRpbnVlOworCQlhID0gKHVuc2lnbmVkIGNoYXIgKikgaWZyLmlmcl9lbmFkZHI7CisjZWxzZQorI2lmZGVmIEhBVkVfTkVUX0lGX0RMX0gKKwkJc2RscCA9IChzdHJ1Y3Qgc29ja2FkZHJfZGwgKikgJmlmcnAtPmlmcl9hZGRyOworCQlpZiAoKHNkbHAtPnNkbF9mYW1pbHkgIT0gQUZfTElOSykgfHwgKHNkbHAtPnNkbF9hbGVuICE9IDYpKQorCQkJY29udGludWU7CisJCWEgPSAodW5zaWduZWQgY2hhciAqKSAmc2RscC0+c2RsX2RhdGFbc2RscC0+c2RsX25sZW5dOworI2Vsc2UKKwkJLyoKKwkJICogWFhYIHdlIGRvbid0IGhhdmUgYSB3YXkgb2YgZ2V0dGluZyB0aGUgaGFyZHdhcmUKKwkJICogYWRkcmVzcworCQkgKi8KKwkJY2xvc2Uoc2QpOworCQlyZXR1cm4gMDsKKyNlbmRpZiAvKiBIQVZFX05FVF9JRl9ETF9IICovCisjZW5kaWYgLyogU0lPQ0dFTkFERFIgKi8KKyNlbmRpZiAvKiBTSU9DR0lGSFdBRERSICovCisJCWlmICghYVswXSAmJiAhYVsxXSAmJiAhYVsyXSAmJiAhYVszXSAmJiAhYVs0XSAmJiAhYVs1XSkKKwkJCWNvbnRpbnVlOworCQlpZiAobm9kZV9pZCkgeworCQkJbWVtY3B5KG5vZGVfaWQsIGEsIDYpOworCQkJY2xvc2Uoc2QpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJY2xvc2Uoc2QpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIEFzc3VtZSB0aGF0IHRoZSBnZXR0aW1lb2ZkYXkoKSBoYXMgbWljcm9zZWNvbmQgZ3JhbnVsYXJpdHkgKi8KKyNkZWZpbmUgTUFYX0FESlVTVE1FTlQgMTAKKworc3RhdGljIGludCBnZXRfY2xvY2sodWludDMyX3QgKmNsb2NrX2hpZ2gsIHVpbnQzMl90ICpjbG9ja19sb3csIHVpbnQxNl90ICpyZXRfY2xvY2tfc2VxKQoreworCXN0YXRpYyBpbnQJCQlhZGp1c3RtZW50ID0gMDsKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwJCWxhc3QgPSB7MCwgMH07CisJc3RhdGljIHVpbnQxNl90CQkJY2xvY2tfc2VxOworCXN0cnVjdCB0aW1ldmFsCQkJdHY7CisJdW5zaWduZWQgbG9uZyBsb25nCQljbG9ja19yZWc7CisKK3RyeV9hZ2FpbjoKKwlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKwlpZiAoKGxhc3QudHZfc2VjID09IDApICYmIChsYXN0LnR2X3VzZWMgPT0gMCkpIHsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmY2xvY2tfc2VxLCBzaXplb2YoY2xvY2tfc2VxKSk7CisJCWNsb2NrX3NlcSAmPSAweDNGRkY7CisJCWxhc3QgPSB0djsKKwkJbGFzdC50dl9zZWMtLTsKKwl9CisJaWYgKCh0di50dl9zZWMgPCBsYXN0LnR2X3NlYykgfHwKKwkgICAgKCh0di50dl9zZWMgPT0gbGFzdC50dl9zZWMpICYmCisJICAgICAodHYudHZfdXNlYyA8IGxhc3QudHZfdXNlYykpKSB7CisJCWNsb2NrX3NlcSA9IChjbG9ja19zZXErMSkgJiAweDNGRkY7CisJCWFkanVzdG1lbnQgPSAwOworCQlsYXN0ID0gdHY7CisJfSBlbHNlIGlmICgodHYudHZfc2VjID09IGxhc3QudHZfc2VjKSAmJgorCSAgICAodHYudHZfdXNlYyA9PSBsYXN0LnR2X3VzZWMpKSB7CisJCWlmIChhZGp1c3RtZW50ID49IE1BWF9BREpVU1RNRU5UKQorCQkJZ290byB0cnlfYWdhaW47CisJCWFkanVzdG1lbnQrKzsKKwl9IGVsc2UgeworCQlhZGp1c3RtZW50ID0gMDsKKwkJbGFzdCA9IHR2OworCX0KKworCWNsb2NrX3JlZyA9IHR2LnR2X3VzZWMqMTAgKyBhZGp1c3RtZW50OworCWNsb2NrX3JlZyArPSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgdHYudHZfc2VjKSoxMDAwMDAwMDsKKwljbG9ja19yZWcgKz0gKCgodW5zaWduZWQgbG9uZyBsb25nKSAweDAxQjIxREQyKSA8PCAzMikgKyAweDEzODE0MDAwOworCisJKmNsb2NrX2hpZ2ggPSBjbG9ja19yZWcgPj4gMzI7CisJKmNsb2NrX2xvdyA9IGNsb2NrX3JlZzsKKwkqcmV0X2Nsb2NrX3NlcSA9IGNsb2NrX3NlcTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB1dWlkX2dlbmVyYXRlX3RpbWUodXVpZF90IG91dCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBub2RlX2lkWzZdOworCXN0YXRpYyBpbnQgaGFzX2luaXQgPSAwOworCXN0cnVjdCB1dWlkIHV1OworCXVpbnQzMl90CWNsb2NrX21pZDsKKworCWlmICghaGFzX2luaXQpIHsKKwkJaWYgKGdldF9ub2RlX2lkKG5vZGVfaWQpIDw9IDApIHsKKwkJCWdldF9yYW5kb21fYnl0ZXMobm9kZV9pZCwgNik7CisJCQkvKgorCQkJICogU2V0IG11bHRpY2FzdCBiaXQsIHRvIHByZXZlbnQgY29uZmxpY3RzCisJCQkgKiB3aXRoIElFRUUgODAyIGFkZHJlc3NlcyBvYnRhaW5lZCBmcm9tCisJCQkgKiBuZXR3b3JrIGNhcmRzCisJCQkgKi8KKwkJCW5vZGVfaWRbMF0gfD0gMHgwMTsKKwkJfQorCQloYXNfaW5pdCA9IDE7CisJfQorCWdldF9jbG9jaygmY2xvY2tfbWlkLCAmdXUudGltZV9sb3csICZ1dS5jbG9ja19zZXEpOworCXV1LmNsb2NrX3NlcSB8PSAweDgwMDA7CisJdXUudGltZV9taWQgPSAodWludDE2X3QpIGNsb2NrX21pZDsKKwl1dS50aW1lX2hpX2FuZF92ZXJzaW9uID0gKChjbG9ja19taWQgPj4gMTYpICYgMHgwRkZGKSB8IDB4MTAwMDsKKwltZW1jcHkodXUubm9kZSwgbm9kZV9pZCwgNik7CisJdXVpZF9wYWNrKCZ1dSwgb3V0KTsKK30KKwordm9pZCB1dWlkX2dlbmVyYXRlX3JhbmRvbSh1dWlkX3Qgb3V0KQoreworCXV1aWRfdAlidWY7CisJc3RydWN0IHV1aWQgdXU7CisKKwlnZXRfcmFuZG9tX2J5dGVzKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXV1aWRfdW5wYWNrKGJ1ZiwgJnV1KTsKKworCXV1LmNsb2NrX3NlcSA9ICh1dS5jbG9ja19zZXEgJiAweDNGRkYpIHwgMHg4MDAwOworCXV1LnRpbWVfaGlfYW5kX3ZlcnNpb24gPSAodXUudGltZV9oaV9hbmRfdmVyc2lvbiAmIDB4MEZGRikgfCAweDQwMDA7CisJdXVpZF9wYWNrKCZ1dSwgb3V0KTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgZnJvbnQtZW5kIHRvIHV1aWRfZ2VuZXJhdGVfcmFuZG9tIGFuZAorICogdXVpZF9nZW5lcmF0ZV90aW1lLiAgSXQgdXNlcyB1dWlkX2dlbmVyYXRlX3JhbmRvbSBvbmx5IGlmCisgKiAvZGV2L3VyYW5kb20gaXMgYXZhaWxhYmxlLCBzaW5jZSBvdGhlcndpc2Ugd2Ugd29uJ3QgaGF2ZQorICogaGlnaC1xdWFsaXR5IHJhbmRvbW5lc3MuCisgKi8KK3ZvaWQgdXVpZF9nZW5lcmF0ZSh1dWlkX3Qgb3V0KQoreworCWlmIChnZXRfcmFuZG9tX2ZkKCkgPj0gMCkKKwkJdXVpZF9nZW5lcmF0ZV9yYW5kb20ob3V0KTsKKwllbHNlCisJCXV1aWRfZ2VuZXJhdGVfdGltZShvdXQpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9wYWNrLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3BhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTdjZmNlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9wYWNrLmMKQEAgLTAsMCArMSw2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogSW50ZXJuYWwgcm91dGluZSBmb3IgcGFja2luZyBVVUlEJ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXVpZFAuaCIKKwordm9pZCB1dWlkX3BhY2soY29uc3Qgc3RydWN0IHV1aWQgKnV1LCB1dWlkX3QgcHRyKQoreworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBjaGFyICpvdXQgPSBwdHI7CisKKwl0bXAgPSB1dS0+dGltZV9sb3c7CisJb3V0WzNdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKwl0bXAgPj49IDg7CisJb3V0WzJdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKwl0bXAgPj49IDg7CisJb3V0WzFdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKwl0bXAgPj49IDg7CisJb3V0WzBdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKworCXRtcCA9IHV1LT50aW1lX21pZDsKKwlvdXRbNV0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCXRtcCA+Pj0gODsKKwlvdXRbNF0gPSAodW5zaWduZWQgY2hhcikgdG1wOworCisJdG1wID0gdXUtPnRpbWVfaGlfYW5kX3ZlcnNpb247CisJb3V0WzddID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKwl0bXAgPj49IDg7CisJb3V0WzZdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKworCXRtcCA9IHV1LT5jbG9ja19zZXE7CisJb3V0WzldID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKwl0bXAgPj49IDg7CisJb3V0WzhdID0gKHVuc2lnbmVkIGNoYXIpIHRtcDsKKworCW1lbWNweShvdXQrMTAsIHV1LT5ub2RlLCA2KTsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvcGFyc2UuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNmOWNiCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9wYXJzZS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBhcnNlLmMgLS0tIFVVSUQgcGFyc2luZworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dWlkUC5oIgorCitpbnQgdXVpZF9wYXJzZShjb25zdCBjaGFyICppbiwgdXVpZF90IHV1KQoreworCXN0cnVjdCB1dWlkCXV1aWQ7CisJaW50CQlpOworCWNvbnN0IGNoYXIJKmNwOworCWNoYXIJCWJ1ZlszXTsKKworCWlmIChzdHJsZW4oaW4pICE9IDM2KQorCQlyZXR1cm4gLTE7CisJZm9yIChpPTAsIGNwID0gaW47IGkgPD0gMzY7IGkrKyxjcCsrKSB7CisJCWlmICgoaSA9PSA4KSB8fCAoaSA9PSAxMykgfHwgKGkgPT0gMTgpIHx8CisJCSAgICAoaSA9PSAyMykpIHsKKwkJCWlmICgqY3AgPT0gJy0nKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoaT09IDM2KQorCQkJaWYgKCpjcCA9PSAwKQorCQkJCWNvbnRpbnVlOworCQlpZiAoIWlzeGRpZ2l0KCpjcCkpCisJCQlyZXR1cm4gLTE7CisJfQorCXV1aWQudGltZV9sb3cgPSBzdHJ0b3VsKGluLCBOVUxMLCAxNik7CisJdXVpZC50aW1lX21pZCA9IHN0cnRvdWwoaW4rOSwgTlVMTCwgMTYpOworCXV1aWQudGltZV9oaV9hbmRfdmVyc2lvbiA9IHN0cnRvdWwoaW4rMTQsIE5VTEwsIDE2KTsKKwl1dWlkLmNsb2NrX3NlcSA9IHN0cnRvdWwoaW4rMTksIE5VTEwsIDE2KTsKKwljcCA9IGluKzI0OworCWJ1ZlsyXSA9IDA7CisJZm9yIChpPTA7IGkgPCA2OyBpKyspIHsKKwkJYnVmWzBdID0gKmNwKys7CisJCWJ1ZlsxXSA9ICpjcCsrOworCQl1dWlkLm5vZGVbaV0gPSBzdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCX0KKworCXV1aWRfcGFjaygmdXVpZCwgdXUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91bnBhY2suYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdW5wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkM2FhYgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdW5wYWNrLmMKQEAgLTAsMCArMSw2MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogSW50ZXJuYWwgcm91dGluZSBmb3IgdW5wYWNraW5nIFVVSUQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidXVpZFAuaCIKKwordm9pZCB1dWlkX3VucGFjayhjb25zdCB1dWlkX3QgaW4sIHN0cnVjdCB1dWlkICp1dSkKK3sKKwljb25zdCB1aW50OF90ICpwdHIgPSBpbjsKKwl1aW50MzJfdCB0bXA7CisKKwl0bXAgPSAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl0bXAgPSAodG1wIDw8IDgpIHwgKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdXUtPnRpbWVfbG93ID0gdG1wOworCisJdG1wID0gKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdXUtPnRpbWVfbWlkID0gdG1wOworCisJdG1wID0gKnB0cisrOworCXRtcCA9ICh0bXAgPDwgOCkgfCAqcHRyKys7CisJdXUtPnRpbWVfaGlfYW5kX3ZlcnNpb24gPSB0bXA7CisKKwl0bXAgPSAqcHRyKys7CisJdG1wID0gKHRtcCA8PCA4KSB8ICpwdHIrKzsKKwl1dS0+Y2xvY2tfc2VxID0gdG1wOworCisJbWVtY3B5KHV1LT5ub2RlLCBwdHIsIDYpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91bnBhcnNlLmMgYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3VucGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk0OGZlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91bnBhcnNlLmMKQEAgLTAsMCArMSw3NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdW5wYXJzZS5jIC0tIGNvbnZlcnQgYSBVVUlEIHRvIHN0cmluZworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBUaGVvZG9yZSBUcydvLgorICoKKyAqICVCZWdpbi1IZWFkZXIlCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIGFuZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0eSwKKyAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFMTCBPRgorICogV0hJQ0ggQVJFIEhFUkVCWSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICVFbmQtSGVhZGVyJQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAidXVpZFAuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9sb3dlciA9CisJIiUwOHgtJTA0eC0lMDR4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpmbXRfdXBwZXIgPQorCSIlMDhYLSUwNFgtJTA0WC0lMDJYJTAyWC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlgiOworCisjaWZkZWYgVVVJRF9VTlBBUlNFX0RFRkFVTFRfVVBQRVIKKyNkZWZpbmUgRk1UX0RFRkFVTFQgZm10X3VwcGVyCisjZWxzZQorI2RlZmluZSBGTVRfREVGQVVMVCBmbXRfbG93ZXIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB1dWlkX3VucGFyc2VfeChjb25zdCB1dWlkX3QgdXUsIGNoYXIgKm91dCwgY29uc3QgY2hhciAqZm10KQoreworCXN0cnVjdCB1dWlkIHV1aWQ7CisKKwl1dWlkX3VucGFjayh1dSwgJnV1aWQpOworCXNwcmludGYob3V0LCBmbXQsCisJCXV1aWQudGltZV9sb3csIHV1aWQudGltZV9taWQsIHV1aWQudGltZV9oaV9hbmRfdmVyc2lvbiwKKwkJdXVpZC5jbG9ja19zZXEgPj4gOCwgdXVpZC5jbG9ja19zZXEgJiAweEZGLAorCQl1dWlkLm5vZGVbMF0sIHV1aWQubm9kZVsxXSwgdXVpZC5ub2RlWzJdLAorCQl1dWlkLm5vZGVbM10sIHV1aWQubm9kZVs0XSwgdXVpZC5ub2RlWzVdKTsKK30KKwordm9pZCB1dWlkX3VucGFyc2VfbG93ZXIoY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQpCit7CisJdXVpZF91bnBhcnNlX3godXUsIG91dCwJZm10X2xvd2VyKTsKK30KKwordm9pZCB1dWlkX3VucGFyc2VfdXBwZXIoY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQpCit7CisJdXVpZF91bnBhcnNlX3godXUsIG91dCwJZm10X3VwcGVyKTsKK30KKwordm9pZCB1dWlkX3VucGFyc2UoY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQpCit7CisJdXVpZF91bnBhcnNlX3godXUsIG91dCwgRk1UX0RFRkFVTFQpOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91dWlkLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3V1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTk3MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91dWlkLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFB1YmxpYyBpbmNsdWRlIGZpbGUgZm9yIHRoZSBVVUlEIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworI2lmbmRlZiBVVUlEX1VVSURfSAorI2RlZmluZSBVVUlEX1VVSURfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1dWlkX3RbMTZdOworCisvKiBVVUlEIFZhcmlhbnQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVVVJRF9WQVJJQU5UX05DUwkwCisjZGVmaW5lIFVVSURfVkFSSUFOVF9EQ0UJMQorI2RlZmluZSBVVUlEX1ZBUklBTlRfTUlDUk9TT0ZUCTIKKyNkZWZpbmUgVVVJRF9WQVJJQU5UX09USEVSCTMKKworLyogVVVJRCBUeXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFVVSURfVFlQRV9EQ0VfVElNRSAgIDEKKyNkZWZpbmUgVVVJRF9UWVBFX0RDRV9SQU5ET00gNAorCisvKiBBbGxvdyBVVUlEIGNvbnN0YW50cyB0byBiZSBkZWZpbmVkICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVVVJRF9ERUZJTkUobmFtZSx1MCx1MSx1Mix1Myx1NCx1NSx1Nix1Nyx1OCx1OSx1MTAsdTExLHUxMix1MTMsdTE0LHUxNSkgXAorCXN0YXRpYyBjb25zdCB1dWlkX3QgbmFtZSBVTlVTRURfUEFSQU0gPSB7dTAsdTEsdTIsdTMsdTQsdTUsdTYsdTcsdTgsdTksdTEwLHUxMSx1MTIsdTEzLHUxNCx1MTV9CisjZWxzZQorI2RlZmluZSBVVUlEX0RFRklORShuYW1lLHUwLHUxLHUyLHUzLHU0LHU1LHU2LHU3LHU4LHU5LHUxMCx1MTEsdTEyLHUxMyx1MTQsdTE1KSBcCisJc3RhdGljIGNvbnN0IHV1aWRfdCBuYW1lID0ge3UwLHUxLHUyLHUzLHU0LHU1LHU2LHU3LHU4LHU5LHUxMCx1MTEsdTEyLHUxMyx1MTQsdTE1fQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogY2xlYXIuYyAqLworLyp2b2lkIHV1aWRfY2xlYXIodXVpZF90IHV1KTsqLworI2RlZmluZSB1dWlkX2NsZWFyKHV1KSBtZW1zZXQodXUsIDAsIHNpemVvZih1dSkpCisKKy8qIGNvbXBhcmUuYyAqLworaW50IHV1aWRfY29tcGFyZShjb25zdCB1dWlkX3QgdXUxLCBjb25zdCB1dWlkX3QgdXUyKTsKKworLyogY29weS5jICovCisvKnZvaWQgdXVpZF9jb3B5KHV1aWRfdCBkc3QsIGNvbnN0IHV1aWRfdCBzcmMpOyovCisjZGVmaW5lIHV1aWRfY29weShkc3Qsc3JjKSBtZW1jcHkoZHN0LCBzcmMsIHNpemVvZihkc3QpKQorCisvKiBnZW5fdXVpZC5jICovCit2b2lkIHV1aWRfZ2VuZXJhdGUodXVpZF90IG91dCk7Cit2b2lkIHV1aWRfZ2VuZXJhdGVfcmFuZG9tKHV1aWRfdCBvdXQpOwordm9pZCB1dWlkX2dlbmVyYXRlX3RpbWUodXVpZF90IG91dCk7CisKKy8qIGlzbnVsbC5jICovCisvKmludCB1dWlkX2lzX251bGwoY29uc3QgdXVpZF90IHV1KTsqLworI2RlZmluZSB1dWlkX2lzX251bGwodXUpICghbWVtY21wKHV1LCAiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLCBzaXplb2YodXUpKSkKKworLyogcGFyc2UuYyAqLworaW50IHV1aWRfcGFyc2UoY29uc3QgY2hhciAqaW4sIHV1aWRfdCB1dSk7CisKKy8qIHVucGFyc2UuYyAqLwordm9pZCB1dWlkX3VucGFyc2UoY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQpOwordm9pZCB1dWlkX3VucGFyc2VfbG93ZXIoY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQpOwordm9pZCB1dWlkX3VucGFyc2VfdXBwZXIoY29uc3QgdXVpZF90IHV1LCBjaGFyICpvdXQpOworCisvKiB1dWlkX3RpbWUuYyAqLwordGltZV90IHV1aWRfdGltZShjb25zdCB1dWlkX3QgdXUsIHN0cnVjdCB0aW1ldmFsICpyZXRfdHYpOworaW50IHV1aWRfdHlwZShjb25zdCB1dWlkX3QgdXUpOworaW50IHV1aWRfdmFyaWFudChjb25zdCB1dWlkX3QgdXUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1VVSURfVVVJRF9IICovCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3V1aWRQLmggYi9lMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL3V1aWRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNDFlZgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdXVpZFAuaApAQCAtMCwwICsxLDYwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1dWlkLmggLS0gcHJpdmF0ZSBoZWFkZXIgZmlsZSBmb3IgdXVpZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVGhlb2RvcmUgVHMnby4KKyAqCisgKiAlQmVnaW4tSGVhZGVyJQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBBTEwgT0YKKyAqIFdISUNIIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAlRW5kLUhlYWRlciUKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgInV1aWQuaCIKKworLyoKKyAqIE9mZnNldCBiZXR3ZWVuIDE1LU9jdC0xNTgyIGFuZCAxLUphbi03MAorICovCisjZGVmaW5lIFRJTUVfT0ZGU0VUX0hJR0ggMHgwMUIyMUREMgorI2RlZmluZSBUSU1FX09GRlNFVF9MT1cgIDB4MTM4MTQwMDAKKworc3RydWN0IHV1aWQgeworCXVpbnQzMl90CXRpbWVfbG93OworCXVpbnQxNl90CXRpbWVfbWlkOworCXVpbnQxNl90CXRpbWVfaGlfYW5kX3ZlcnNpb247CisJdWludDE2X3QJY2xvY2tfc2VxOworCXVpbnQ4X3QJbm9kZVs2XTsKK307CisKKworLyoKKyAqIHByb3RvdHlwZXMKKyAqLwordm9pZCB1dWlkX3BhY2soY29uc3Qgc3RydWN0IHV1aWQgKnV1LCB1dWlkX3QgcHRyKTsKK3ZvaWQgdXVpZF91bnBhY2soY29uc3QgdXVpZF90IGluLCBzdHJ1Y3QgdXVpZCAqdXUpOwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC91dWlkX3RpbWUuYyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdXVpZF90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmNzNlNgotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvdXVpZF90aW1lLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHV1aWRfdGltZS5jIC0tLSBJbnRlcnByZXQgdGhlIHRpbWUgZmllbGQgZnJvbSBhIHV1aWQuICBUaGlzIHByb2dyYW0KKyAqCXZpb2xhdGVzIHRoZSBVVUlEIGFic3RyYWN0aW9uIGJhcnJpZXIgYnkgcmVhY2hpbmcgaW50byB0aGUgZ3V0cworICoJb2YgYSBVVUlEIGFuZCBpbnRlcnByZXRpbmcgaXQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IFRoZW9kb3JlIFRzJ28uCisgKgorICogJUJlZ2luLUhlYWRlciUKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgYW5kIHRoZSBlbnRpcmUgcGVybWlzc2lvbiBub3RpY2UgaW4gaXRzIGVudGlyZXR5LAorICogICAgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnRpZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQUxMIE9GCisgKiBXSElDSCBBUkUgSEVSRUJZIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogJUVuZC1IZWFkZXIlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAidXVpZFAuaCIKKwordGltZV90IHV1aWRfdGltZShjb25zdCB1dWlkX3QgdXUsIHN0cnVjdCB0aW1ldmFsICpyZXRfdHYpCit7CisJc3RydWN0IHV1aWQJCXV1aWQ7CisJdWludDMyX3QJCQloaWdoOworCXN0cnVjdCB0aW1ldmFsCQl0djsKKwl1bnNpZ25lZCBsb25nIGxvbmcJY2xvY2tfcmVnOworCisJdXVpZF91bnBhY2sodXUsICZ1dWlkKTsKKworCWhpZ2ggPSB1dWlkLnRpbWVfbWlkIHwgKCh1dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24gJiAweEZGRikgPDwgMTYpOworCWNsb2NrX3JlZyA9IHV1aWQudGltZV9sb3cgfCAoKHVuc2lnbmVkIGxvbmcgbG9uZykgaGlnaCA8PCAzMik7CisKKwljbG9ja19yZWcgLT0gKCgodW5zaWduZWQgbG9uZyBsb25nKSAweDAxQjIxREQyKSA8PCAzMikgKyAweDEzODE0MDAwOworCXR2LnR2X3NlYyA9IGNsb2NrX3JlZyAvIDEwMDAwMDAwOworCXR2LnR2X3VzZWMgPSAoY2xvY2tfcmVnICUgMTAwMDAwMDApIC8gMTA7CisKKwlpZiAocmV0X3R2KQorCQkqcmV0X3R2ID0gdHY7CisKKwlyZXR1cm4gdHYudHZfc2VjOworfQorCitpbnQgdXVpZF90eXBlKGNvbnN0IHV1aWRfdCB1dSkKK3sKKwlzdHJ1Y3QgdXVpZAkJdXVpZDsKKworCXV1aWRfdW5wYWNrKHV1LCAmdXVpZCk7CisJcmV0dXJuICgodXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uID4+IDEyKSAmIDB4Rik7Cit9CisKK2ludCB1dWlkX3ZhcmlhbnQoY29uc3QgdXVpZF90IHV1KQoreworCXN0cnVjdCB1dWlkCQl1dWlkOworCWludAkJCXZhcjsKKworCXV1aWRfdW5wYWNrKHV1LCAmdXVpZCk7CisJdmFyID0gdXVpZC5jbG9ja19zZXE7CisKKwlpZiAoKHZhciAmIDB4ODAwMCkgPT0gMCkKKwkJcmV0dXJuIFVVSURfVkFSSUFOVF9OQ1M7CisJaWYgKCh2YXIgJiAweDQwMDApID09IDApCisJCXJldHVybiBVVUlEX1ZBUklBTlRfRENFOworCWlmICgodmFyICYgMHgyMDAwKSA9PSAwKQorCQlyZXR1cm4gVVVJRF9WQVJJQU5UX01JQ1JPU09GVDsKKwlyZXR1cm4gVVVJRF9WQVJJQU5UX09USEVSOworfQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICp2YXJpYW50X3N0cmluZyhpbnQgdmFyaWFudCkKK3sKKwlzd2l0Y2ggKHZhcmlhbnQpIHsKKwljYXNlIFVVSURfVkFSSUFOVF9OQ1M6CisJCXJldHVybiAiTkNTIjsKKwljYXNlIFVVSURfVkFSSUFOVF9EQ0U6CisJCXJldHVybiAiRENFIjsKKwljYXNlIFVVSURfVkFSSUFOVF9NSUNST1NPRlQ6CisJCXJldHVybiAiTWljcm9zb2Z0IjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIk90aGVyIjsKKwl9Cit9CisKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1dWlkX3QJCWJ1ZjsKKwl0aW1lX3QJCXRpbWVfcmVnOworCXN0cnVjdCB0aW1ldmFsCXR2OworCWludAkJdHlwZSwgdmFyaWFudDsKKworCWlmIChhcmdjICE9IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgdXVpZFxuIiwgYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCWlmICh1dWlkX3BhcnNlKGFyZ3ZbMV0sIGJ1ZikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFVVSUQ6ICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJdmFyaWFudCA9IHV1aWRfdmFyaWFudChidWYpOworCXR5cGUgPSB1dWlkX3R5cGUoYnVmKTsKKwl0aW1lX3JlZyA9IHV1aWRfdGltZShidWYsICZ0dik7CisKKwlwcmludGYoIlVVSUQgdmFyaWFudCBpcyAlZCAoJXMpXG4iLCB2YXJpYW50LCB2YXJpYW50X3N0cmluZyh2YXJpYW50KSk7CisJaWYgKHZhcmlhbnQgIT0gVVVJRF9WQVJJQU5UX0RDRSkgeworCQlwcmludGYoIldhcm5pbmc6IFRoaXMgcHJvZ3JhbSBvbmx5IGtub3dzIGhvdyB0byBpbnRlcnByZXQgIgorCQkgICAgICAgIkRDRSBVVUlEcy5cblx0VGhlIHJlc3Qgb2YgdGhlIG91dHB1dCBpcyBsaWtlbHkgIgorCQkgICAgICAgInRvIGJlIGluY29ycmVjdCEhXG4iKTsKKwl9CisJcHJpbnRmKCJVVUlEIHR5cGUgaXMgJWQiLCB0eXBlKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDE6CisJCXByaW50ZigiICh0aW1lIGJhc2VkKVxuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcHJpbnRmKCIgKERDRSlcbiIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXByaW50ZigiIChuYW1lLWJhc2VkKVxuIik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcHJpbnRmKCIgKHJhbmRvbSlcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliYl9wdXRjaGFyKCdcbicpOworCX0KKwlpZiAodHlwZSAhPSAxKSB7CisJCXByaW50ZigiV2FybmluZzogbm90IGEgdGltZS1iYXNlZCBVVUlELCBzbyBVVUlEIHRpbWUgIgorCQkgICAgICAgImRlY29kaW5nIHdpbGwgbGlrZWx5IG5vdCB3b3JrIVxuIik7CisJfQorCXByaW50ZigiVVVJRCB0aW1lIGlzOiAoJWxkLCAlbGQpOiAlc1xuIiwgdHYudHZfc2VjLCB0di50dl91c2VjLAorCSAgICAgICBjdGltZSgmdGltZV9yZWcpKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MvdHVuZTJmcy5jIGIvZTJmc3Byb2dzL3R1bmUyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFlYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL3R1bmUyZnMuYwpAQCAtMCwwICsxLDEwMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdHVuZTJmczogdXRpbGl0eSB0byBtb2RpZnkgRVhUMiBmaWxlc3lzdGVtCisgKgorICogQnVzeWJveCdlZCAoMjAwOSkgYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgorCisvLyBzdG9yYWdlIGhlbHBlcnMKK2NoYXIgQlVHX3dyb25nX2ZpZWxkX3NpemUodm9pZCk7CisjZGVmaW5lIFNUT1JFX0xFKGZpZWxkLCB2YWx1ZSkgXAorZG8geyBcCisJaWYgKHNpemVvZihmaWVsZCkgPT0gNCkgXAorCQlmaWVsZCA9IFNXQVBfTEUzMih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDIpIFwKKwkJZmllbGQgPSBTV0FQX0xFMTYodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAxKSBcCisJCWZpZWxkID0gKHZhbHVlKTsgXAorCWVsc2UgXAorCQlCVUdfd3JvbmdfZmllbGRfc2l6ZSgpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZFVENIX0xFMzIoZmllbGQpIFwKKwkoc2l6ZW9mKGZpZWxkKSA9PSA0ID8gU1dBUF9MRTMyKGZpZWxkKSA6IEJVR193cm9uZ19maWVsZF9zaXplKCkpCisKKy8vdXNhZ2U6I2RlZmluZSB0dW5lMmZzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWMgTU9VTlRfQ05UXSAiCisvLy8vdXNhZ2U6ICAgICAiWy1lIGVycm9ycy1iZWhhdmlvcl0gWy1nIGdyb3VwXSAiCisvL3VzYWdlOiAgICAgICAiWy1pIERBWVNdICIKKy8vLy91c2FnZTogICAgICJbLWpdIFstSiBqb3VybmFsLW9wdGlvbnNdIFstbF0gWy1zIHNwYXJzZS1mbGFnXSAiCisvLy8vdXNhZ2U6ICAgICAiWy1tIHJlc2VydmVkLWJsb2Nrcy1wZXJjZW50XSBbLW8gW15dbW91bnQtb3B0aW9uc1ssLi4uXV0gIgorLy8vL3VzYWdlOiAgICAgIlstciByZXNlcnZlZC1ibG9ja3MtY291bnRdIFstdSB1c2VyXSBbLUMgbW91bnQtY291bnRdICIKKy8vdXNhZ2U6ICAgICAgICJbLUwgTEFCRUxdICIKKy8vLy91c2FnZTogICAgICJbLU0gbGFzdC1tb3VudGVkLWRpcl0gWy1PIFteXWZlYXR1cmVbLC4uLl1dICIKKy8vLy91c2FnZTogICAgICJbLVQgbGFzdC1jaGVjay10aW1lXSBbLVUgVVVJRF0gIgorLy91c2FnZTogICAgICAgIkJMT0NLREVWIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0dW5lMmZzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRqdXN0IGZpbGVzeXN0ZW0gb3B0aW9ucyBvbiBleHRbMjNdIGZpbGVzeXN0ZW1zIgorCitlbnVtIHsKKwlPUFRfTCA9IDEgPDwgMCwgLy8gbGFiZWwKKwlPUFRfYyA9IDEgPDwgMSwgLy8gbWF4IG1vdW50IGNvdW50CisJT1BUX2kgPSAxIDw8IDIsIC8vIGNoZWNrIGludGVydmFsCit9OworCitpbnQgdHVuZTJmc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHVuZTJmc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwljb25zdCBjaGFyICpsYWJlbCwgKnN0cl9jLCAqc3RyX2k7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiOworCWludCBmZDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIkw6YzppOiIsICZsYWJlbCwgJnN0cl9jLCAmc3RyX2kpOworCWlmICghb3B0cykKKwkJYmJfc2hvd191c2FnZSgpOworCWFyZ3YgKz0gb3B0aW5kOyAvLyBhcmd2WzBdIC0tIGRldmljZQorCisJLy8gcmVhZCBzdXBlcmJsb2NrCisJZmQgPSB4b3Blbihhcmd2WzBdLCBPX1JEV1IpOworCXhsc2VlayhmZCwgMTAyNCwgU0VFS19TRVQpOworCXNiID0geHphbGxvYygxMDI0KTsKKwl4cmVhZChmZCwgc2IsIDEwMjQpOworCisJLy8gbWFuZ2xlIHN1cGVyYmxvY2sKKwkvL1NUT1JFX0xFKHNiLT5zX3d0aW1lLCB0aW1lKE5VTEwpKTsgLSB3aHkgYm90aGVyPworCisJLy8gc2V0IHRoZSBsYWJlbAorCWlmIChvcHRzICYgT1BUX0wpCisJCXNhZmVfc3RybmNweSgoY2hhciAqKXNiLT5zX3ZvbHVtZV9uYW1lLCBsYWJlbCwgc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSk7CisKKwlpZiAob3B0cyAmIE9QVF9jKSB7CisJCWludCBuID0geGF0b2lfcmFuZ2Uoc3RyX2MsIC0xLCAweGZmZmUpOworCQlpZiAobiA9PSAwKQorCQkJbiA9IC0xOworCQlTVE9SRV9MRShzYi0+c19tYXhfbW50X2NvdW50LCAodW5zaWduZWQpbik7CisJfQorCisJaWYgKG9wdHMgJiBPUFRfaSkgeworCQl1bnNpZ25lZCBuID0geGF0b3VfcmFuZ2Uoc3RyX2ksIDAsICh1bnNpZ25lZCkweGZmZmZmZmZmIC8gKDI0KjYwKjYwKSkgKiAyNCo2MCo2MDsKKwkJU1RPUkVfTEUoc2ItPnNfY2hlY2tpbnRlcnZhbCwgbik7CisJfQorCisJLy8gd3JpdGUgc3VwZXJibG9jaworCXhsc2VlayhmZCwgMTAyNCwgU0VFS19TRVQpOworCXh3cml0ZShmZCwgc2IsIDEwMjQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoc2IpOworCX0KKworCXhjbG9zZShmZCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2VkaXRvcnMvQ29uZmlnLmluIGIvZWRpdG9ycy9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMGJhMgotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvQ29uZmlnLmluCkBAIC0wLDAgKzEsMjA2IEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiRWRpdG9ycyIKKworY29uZmlnIFBBVENICisJYm9vbCAicGF0Y2giCisJZGVmYXVsdCB5CisJaGVscAorCSAgQXBwbHkgYSB1bmlmaWVkIGRpZmYgZm9ybWF0dGVkIHBhdGNoLgorY29uZmlnIFZJCisJYm9vbCAidmkiCisJZGVmYXVsdCB5CisJaGVscAorCSAgJ3ZpJyBpcyBhIHRleHQgZWRpdG9yLiBNb3JlIHNwZWNpZmljYWxseSwgaXQgaXMgdGhlIE9uZSBUcnVlCisJICB0ZXh0IGVkaXRvciA8Z3Jpbj4uIEl0IGRvZXMsIGhvd2V2ZXIsIGhhdmUgYSByYXRoZXIgc3RlZXAKKwkgIGxlYXJuaW5nIGN1cnZlLiBJZiB5b3UgYXJlIG5vdCBhbHJlYWR5IGNvbWZvcnRhYmxlIHdpdGggJ3ZpJworCSAgeW91IG1heSB3aXNoIHRvIHVzZSBzb21ldGhpbmcgZWxzZS4KKworY29uZmlnIEZFQVRVUkVfVklfTUFYX0xFTgorCWludCAiTWF4aW11bSBzY3JlZW4gd2lkdGggaW4gdmkiCisJcmFuZ2UgMjU2IDE2Mzg0CisJZGVmYXVsdCA0MDk2CisJZGVwZW5kcyBvbiBWSQorCWhlbHAKKwkgIENvbnRyYXJ5IHRvIHdoYXQgeW91IG1heSB0aGluaywgdGhpcyBpcyBub3QgZWF0aW5nIG11Y2guCisJICBNYWtlIGl0IHNtYWxsZXIgdGhhbiA0ayBvbmx5IGlmIHlvdSBhcmUgdmVyeSBsaW1pdGVkIG9uIG1lbW9yeS4KKworY29uZmlnIEZFQVRVUkVfVklfOEJJVAorCWJvb2wgIkFsbG93IHZpIHRvIGRpc3BsYXkgOC1iaXQgY2hhcnMgKG90aGVyd2lzZSBzaG93cyBkb3RzKSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFZJCisJaGVscAorCSAgSWYgeW91ciB0ZXJtaW5hbCBjYW4gZGlzcGxheSBjaGFyYWN0ZXJzIHdpdGggaGlnaCBiaXQgc2V0LAorCSAgeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzLiBOb3RlOiB2aSBpcyBub3QgVW5pY29kZS1jYXBhYmxlLgorCSAgSWYgeW91ciB0ZXJtaW5hbCBjb21iaW5lcyBzZXZlcmFsIDgtYml0IGJ5dGVzIGludG8gb25lIGNoYXJhY3RlcgorCSAgKGFzIGluIFVuaWNvZGUgbW9kZSksIHRoaXMgd2lsbCBub3Qgd29yayBwcm9wZXJseS4KKworY29uZmlnIEZFQVRVUkVfVklfQ09MT04KKwlib29sICJFbmFibGUgXCI6XCIgY29sb24gY29tbWFuZHMgKG5vIFwiZXhcIiBtb2RlKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZJCisJaGVscAorCSAgRW5hYmxlIGEgbGltaXRlZCBzZXQgb2YgY29sb24gY29tbWFuZHMgZm9yIHZpLiBUaGlzIGRvZXMgbm90CisJICBwcm92aWRlIGFuICJleCIgbW9kZS4KKworY29uZmlnIEZFQVRVUkVfVklfWUFOS01BUksKKwlib29sICJFbmFibGUgeWFuay9wdXQgY29tbWFuZHMgYW5kIG1hcmsgY21kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZJCisJaGVscAorCSAgVGhpcyB3aWxsIGVuYWJsZSB5b3UgdG8gdXNlIHlhbmsgYW5kIHB1dCwgYXMgd2VsbCBhcyBtYXJrIGluCisJICBidXN5Ym94IHZpLgorCitjb25maWcgRkVBVFVSRV9WSV9TRUFSQ0gKKwlib29sICJFbmFibGUgc2VhcmNoIGFuZCByZXBsYWNlIGNtZHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWSQorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gZG8gc2VhcmNoIGFuZCByZXBsYWNlIGluCisJICBidXN5Ym94IHZpLgorCitjb25maWcgRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0gKKwlib29sICJFbmFibGUgcmVnZXggaW4gc2VhcmNoIGFuZCByZXBsYWNlIgorCWRlZmF1bHQgbiAgICMgVXNlcyBHTlUgcmVnZXgsIHdoaWNoIG1heSBiZSB1bmF2YWlsYWJsZS4gRklYTUUKKwlkZXBlbmRzIG9uIEZFQVRVUkVfVklfU0VBUkNICisJaGVscAorCSAgVXNlIGV4dGVuZGVkIHJlZ2V4IHNlYXJjaC4KKworY29uZmlnIEZFQVRVUkVfVklfVVNFX1NJR05BTFMKKwlib29sICJDYXRjaCBzaWduYWxzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVkkKKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBtYWtlIGJ1c3lib3ggdmkgc2lnbmFsIGF3YXJlLiBUaGlzIHdpbGwKKwkgIG1ha2UgYnVzeWJveCB2aSBzdXBwb3J0IFNJR1dJTkNIIHRvIGRlYWwgd2l0aCBXaW5kb3cgQ2hhbmdlcywgY2F0Y2gKKwkgIEN0cmwtWiBhbmQgQ3RybC1DIGFuZCBhbGFybXMuCisKK2NvbmZpZyBGRUFUVVJFX1ZJX0RPVF9DTUQKKwlib29sICJSZW1lbWJlciBwcmV2aW91cyBjbWQgYW5kIFwiLlwiIGNtZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZJCisJaGVscAorCSAgTWFrZSBidXN5Ym94IHZpIHJlbWVtYmVyIHRoZSBsYXN0IGNvbW1hbmQgYW5kIGJlIGFibGUgdG8gcmVwZWF0IGl0LgorCitjb25maWcgRkVBVFVSRV9WSV9SRUFET05MWQorCWJvb2wgIkVuYWJsZSAtUiBvcHRpb24gYW5kIFwidmlld1wiIG1vZGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWSQorCWhlbHAKKwkgIEVuYWJsZSB0aGUgcmVhZC1vbmx5IGNvbW1hbmQgbGluZSBvcHRpb24sIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0bworCSAgb3BlbiBhIGZpbGUgaW4gcmVhZC1vbmx5IG1vZGUuCisKK2NvbmZpZyBGRUFUVVJFX1ZJX1NFVE9QVFMKKwlib29sICJFbmFibGUgc2V0LWFibGUgb3B0aW9ucywgYWkgaWMgc2hvd21hdGNoIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVkkKKwloZWxwCisJICBFbmFibGUgdGhlIGVkaXRvciB0byBzZXQgc29tZSAoYWksIGljLCBzaG93bWF0Y2gpIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX1ZJX1NFVAorCWJvb2wgIlN1cHBvcnQgZm9yIDpzZXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yICI6c2V0Ii4KKworY29uZmlnIEZFQVRVUkVfVklfV0lOX1JFU0laRQorCWJvb2wgIkhhbmRsZSB3aW5kb3cgcmVzaXplIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVkkKKwloZWxwCisJICBNYWtlIGJ1c3lib3ggdmkgYmVoYXZlIG5pY2VseSB3aXRoIHRlcm1pbmFscyB0aGF0IGdldCByZXNpemVkLgorCitjb25maWcgRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwKKwlib29sICJVc2UgJ3RlbGwgbWUgY3Vyc29yIHBvc2l0aW9uJyBFU0Mgc2VxdWVuY2UgdG8gbWVhc3VyZSB3aW5kb3ciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWSQorCWhlbHAKKwkgIElmIHRlcm1pbmFsIHNpemUgY2FuJ3QgYmUgcmV0cmlldmVkIGFuZCAkTElORVMvJENPTFVNTlMgYXJlIG5vdCBzZXQsCisJICB0aGlzIG9wdGlvbiBtYWtlcyB2aSBwZXJmb3JtIGEgbGFzdC1kaXRjaCBlZmZvcnQgdG8gZmluZCBpdDoKKwkgIHBvc2l0aW9uIGN1cnNvciB0byA5OTksOTk5IGFuZCBhc2sgdGVybWluYWwgdG8gcmVwb3J0IHJlYWwKKwkgIGN1cnNvciBwb3NpdGlvbiB1c2luZyAiRVNDIFsgNiBuIiBlc2NhcGUgc2VxdWVuY2UsIHRoZW4gcmVhZCBzdGRpbi4KKworCSAgVGhpcyBpcyBub3QgY2xlYW4gYnV0IGhlbHBzIGEgbG90IG9uIHNlcmlhbCBsaW5lcyBhbmQgc3VjaC4KKworY29uZmlnIEZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SCisJYm9vbCAiT3B0aW1pemUgY3Vyc29yIG1vdmVtZW50IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVkkKKwloZWxwCisJICBUaGlzIHdpbGwgbWFrZSB0aGUgY3Vyc29yIG1vdmVtZW50IGZhc3RlciwgYnV0IHJlcXVpcmVzIG1vcmUgbWVtb3J5CisJICBhbmQgaXQgbWFrZXMgdGhlIGFwcGxldCBhIHRpbnkgYml0IGxhcmdlci4KKworY29uZmlnIEFXSworCWJvb2wgImF3ayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBBd2sgaXMgdXNlZCBhcyBhIHBhdHRlcm4gc2Nhbm5pbmcgYW5kIHByb2Nlc3NpbmcgbGFuZ3VhZ2UuIFRoaXMgaXMKKwkgIHRoZSBCdXN5Qm94IGltcGxlbWVudGF0aW9uIG9mIHRoYXQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0FXS19MSUJNCisJYm9vbCAiRW5hYmxlIG1hdGggZnVuY3Rpb25zIChyZXF1aXJlcyBsaWJtKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFXSworCWhlbHAKKwkgIEVuYWJsZSBtYXRoIGZ1bmN0aW9ucyBvZiB0aGUgQXdrIHByb2dyYW1taW5nIGxhbmd1YWdlLgorCSAgTk9URTogVGhpcyB3aWxsIHJlcXVpcmUgbGlibSB0byBiZSBwcmVzZW50IGZvciBsaW5raW5nLgorCitjb25maWcgQ01QCisJYm9vbCAiY21wIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNtcCBpcyB1c2VkIHRvIGNvbXBhcmUgdHdvIGZpbGVzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKKwkgIHRvIHN0YW5kYXJkIG91dHB1dC4KKworY29uZmlnIERJRkYKKwlib29sICJkaWZmIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGRpZmYgY29tcGFyZXMgdHdvIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGFuZCBvdXRwdXRzIHRoZQorCSAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBnaXZlbiB0bworCSAgdGhlIHBhdGNoIGNvbW1hbmQuCisKK2NvbmZpZyBGRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERJRkYgJiYgTE9OR19PUFRTCisJaGVscAorCSAgRW5hYmxlIHVzZSBvZiBsb25nIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX0RJRkZfRElSCisJYm9vbCAiRW5hYmxlIGRpcmVjdG9yeSBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRElGRgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgZGlyZWN0b3J5IGFuZCBzdWJkaXJlY3RvcnkKKwkgIGNvbXBhcmlzb24uCisKK2NvbmZpZyBFRAorCWJvb2wgImVkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBvcmlnaW5hbCAxOTcwJ3MgVW5peCB0ZXh0IGVkaXRvciwgZnJvbSB0aGUgZGF5cyBvZiB0ZWxldHlwZXMuCisJICBTbWFsbCwgc2ltcGxlLCBldmlsLiBQYXJ0IG9mIFNVU3YzLiBJZiB5b3UncmUgbm90IGFscmVhZHkgdXNpbmcKKwkgIHRoaXMsIHlvdSBkb24ndCBuZWVkIGl0LgorCitjb25maWcgU0VECisJYm9vbCAic2VkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNlZCBpcyB1c2VkIHRvIHBlcmZvcm0gdGV4dCB0cmFuc2Zvcm1hdGlvbnMgb24gYSBmaWxlCisJICBvciBpbnB1dCBmcm9tIGEgcGlwZWxpbmUuCisKK2NvbmZpZyBGRUFUVVJFX0FMTE9XX0VYRUMKKwlib29sICJBbGxvdyB2aSBhbmQgYXdrIHRvIGV4ZWN1dGUgc2hlbGwgY29tbWFuZHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWSSB8fCBBV0sKKwloZWxwCisJICBFbmFibGVzIHZpIGFuZCBhd2sgZmVhdHVyZXMgd2hpY2ggYWxsb3dzIHVzZXIgdG8gZXhlY3V0ZQorCSAgc2hlbGwgY29tbWFuZHMgKHVzaW5nIHN5c3RlbSgpIEMgY2FsbCkuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2VkaXRvcnMvQ29uZmlnLnNyYyBiL2VkaXRvcnMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFlMWRlCi0tLSAvZGV2L251bGwKKysrIGIvZWRpdG9ycy9Db25maWcuc3JjCkBAIC0wLDAgKzEsNzggQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkVkaXRvcnMiCisKK0lOU0VSVAorCitjb25maWcgQVdLCisJYm9vbCAiYXdrIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEF3ayBpcyB1c2VkIGFzIGEgcGF0dGVybiBzY2FubmluZyBhbmQgcHJvY2Vzc2luZyBsYW5ndWFnZS4gVGhpcyBpcworCSAgdGhlIEJ1c3lCb3ggaW1wbGVtZW50YXRpb24gb2YgdGhhdCBwcm9ncmFtbWluZyBsYW5ndWFnZS4KKworY29uZmlnIEZFQVRVUkVfQVdLX0xJQk0KKwlib29sICJFbmFibGUgbWF0aCBmdW5jdGlvbnMgKHJlcXVpcmVzIGxpYm0pIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVdLCisJaGVscAorCSAgRW5hYmxlIG1hdGggZnVuY3Rpb25zIG9mIHRoZSBBd2sgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisJICBOT1RFOiBUaGlzIHdpbGwgcmVxdWlyZSBsaWJtIHRvIGJlIHByZXNlbnQgZm9yIGxpbmtpbmcuCisKK2NvbmZpZyBDTVAKKwlib29sICJjbXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY21wIGlzIHVzZWQgdG8gY29tcGFyZSB0d28gZmlsZXMgYW5kIHJldHVybnMgdGhlIHJlc3VsdAorCSAgdG8gc3RhbmRhcmQgb3V0cHV0LgorCitjb25maWcgRElGRgorCWJvb2wgImRpZmYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGlmZiBjb21wYXJlcyB0d28gZmlsZXMgb3IgZGlyZWN0b3JpZXMgYW5kIG91dHB1dHMgdGhlCisJICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0gaW4gYSBmb3JtIHRoYXQgY2FuIGJlIGdpdmVuIHRvCisJICB0aGUgcGF0Y2ggY29tbWFuZC4KKworY29uZmlnIEZFQVRVUkVfRElGRl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRElGRiAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgdXNlIG9mIGxvbmcgb3B0aW9ucy4KKworY29uZmlnIEZFQVRVUkVfRElGRl9ESVIKKwlib29sICJFbmFibGUgZGlyZWN0b3J5IHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBESUZGCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yeQorCSAgY29tcGFyaXNvbi4KKworY29uZmlnIEVECisJYm9vbCAiZWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG9yaWdpbmFsIDE5NzAncyBVbml4IHRleHQgZWRpdG9yLCBmcm9tIHRoZSBkYXlzIG9mIHRlbGV0eXBlcy4KKwkgIFNtYWxsLCBzaW1wbGUsIGV2aWwuIFBhcnQgb2YgU1VTdjMuIElmIHlvdSdyZSBub3QgYWxyZWFkeSB1c2luZworCSAgdGhpcywgeW91IGRvbid0IG5lZWQgaXQuCisKK2NvbmZpZyBTRUQKKwlib29sICJzZWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc2VkIGlzIHVzZWQgdG8gcGVyZm9ybSB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBvbiBhIGZpbGUKKwkgIG9yIGlucHV0IGZyb20gYSBwaXBlbGluZS4KKworY29uZmlnIEZFQVRVUkVfQUxMT1dfRVhFQworCWJvb2wgIkFsbG93IHZpIGFuZCBhd2sgdG8gZXhlY3V0ZSBzaGVsbCBjb21tYW5kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZJIHx8IEFXSworCWhlbHAKKwkgIEVuYWJsZXMgdmkgYW5kIGF3ayBmZWF0dXJlcyB3aGljaCBhbGxvd3MgdXNlciB0byBleGVjdXRlCisJICBzaGVsbCBjb21tYW5kcyAodXNpbmcgc3lzdGVtKCkgQyBjYWxsKS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9LYnVpbGQuc3JjIGIvZWRpdG9ycy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODhjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxNCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQVdLKSAgICAgICArPSBhd2subworbGliLSQoQ09ORklHX0NNUCkgICAgICAgKz0gY21wLm8KK2xpYi0kKENPTkZJR19ESUZGKSAgICAgICs9IGRpZmYubworbGliLSQoQ09ORklHX0VEKSAgICAgICAgKz0gZWQubworbGliLSQoQ09ORklHX1NFRCkgICAgICAgKz0gc2VkLm8KZGlmZiAtLWdpdCBhL2VkaXRvcnMvYXdrLmMgYi9lZGl0b3JzL2F3ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODU1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL2F3ay5jCkBAIC0wLDAgKzEsMzEzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYXdrIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IERtaXRyeSBaYWtoYXJvdiA8ZG1pdEBjcnAuYmFuay5nb3YudWE+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYXdrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0FXS19QUk9HUkFNXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgYXdrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS12IFZBUj1WQUwJU2V0IHZhcmlhYmxlIgorLy91c2FnZTogICAgICJcbgktRiBTRVAJCVVzZSBTRVAgYXMgZmllbGQgc2VwYXJhdG9yIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCQlSZWFkIHByb2dyYW0gZnJvbSBGSUxFIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworLyogSWYgeW91IGNvbW1lbnQgb3V0IG9uZSBvZiB0aGVzZSBiZWxvdywgaXQgd2lsbCBiZSAjZGVmaW5lZCBsYXRlcgorICogdG8gcGVyZm9ybSBkZWJ1ZyBwcmludGZzIHRvIHN0ZGVycjogKi8KKyNkZWZpbmUgZGVidWdfcHJpbnRmX3dhbGtlciguLi4pICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2V2YWwoLi4uKSAgZG8ge30gd2hpbGUgKDApCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3dhbGtlcgorIyBkZWZpbmUgZGVidWdfcHJpbnRmX3dhbGtlciguLi4pIChmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pKQorI2VuZGlmCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9ldmFsCisjIGRlZmluZSBkZWJ1Z19wcmludGZfZXZhbCguLi4pIChmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKworCisjZGVmaW5lCU1BWFZBUkZNVCAgICAgICAyNDAKKyNkZWZpbmUJTUlOTlZCTE9DSyAgICAgIDY0CisKKy8qIHZhcmlhYmxlIGZsYWdzICovCisjZGVmaW5lCVZGX05VTUJFUiAgICAgICAweDAwMDEJLyogMSA9IHByaW1hcnkgdHlwZSBpcyBudW1iZXIgKi8KKyNkZWZpbmUJVkZfQVJSQVkgICAgICAgIDB4MDAwMgkvKiAxID0gaXQncyBhbiBhcnJheSAqLworCisjZGVmaW5lCVZGX0NBQ0hFRCAgICAgICAweDAxMDAJLyogMSA9IG51bS9zdHIgdmFsdWUgaGFzIGNhY2hlZCBzdHIvbnVtIGVxICovCisjZGVmaW5lCVZGX1VTRVIgICAgICAgICAweDAyMDAJLyogMSA9IHVzZXIgaW5wdXQgKG1heSBiZSBudW1lcmljIHN0cmluZykgKi8KKyNkZWZpbmUJVkZfU1BFQ0lBTCAgICAgIDB4MDQwMAkvKiAxID0gcmVxdWlyZXMgZXh0cmEgaGFuZGxpbmcgd2hlbiBjaGFuZ2VkICovCisjZGVmaW5lCVZGX1dBTEsgICAgICAgICAweDA4MDAJLyogMSA9IHZhcmlhYmxlIGhhcyBhbGxvYydkIHgud2Fsa2VyIGxpc3QgKi8KKyNkZWZpbmUJVkZfRlNUUiAgICAgICAgIDB4MTAwMAkvKiAxID0gdmFyOjpzdHJpbmcgcG9pbnRzIHRvIGZzdHJpbmcgYnVmZmVyICovCisjZGVmaW5lCVZGX0NISUxEICAgICAgICAweDIwMDAJLyogMSA9IGZ1bmN0aW9uIGFyZzsgeC5wYXJlbnQgcG9pbnRzIHRvIHNvdXJjZSAqLworI2RlZmluZQlWRl9ESVJUWSAgICAgICAgMHg0MDAwCS8qIDEgPSB2YXJpYWJsZSB3YXMgc2V0IGV4cGxpY2l0bHkgKi8KKworLyogdGhlc2UgZmxhZ3MgYXJlIHN0YXRpYywgZG9uJ3QgY2hhbmdlIHRoZW0gd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovCisjZGVmaW5lCVZGX0RPTlRUT1VDSCAgICAoVkZfQVJSQVkgfCBWRl9TUEVDSUFMIHwgVkZfV0FMSyB8IFZGX0NISUxEIHwgVkZfRElSVFkpCisKK3R5cGVkZWYgc3RydWN0IHdhbGtlcl9saXN0IHsKKwljaGFyICplbmQ7CisJY2hhciAqY3VyOworCXN0cnVjdCB3YWxrZXJfbGlzdCAqcHJldjsKKwljaGFyIHdidWZbMV07Cit9IHdhbGtlcl9saXN0OworCisvKiBWYXJpYWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgdmFyX3MgeworCXVuc2lnbmVkIHR5cGU7ICAgICAgICAgICAgLyogZmxhZ3MgKi8KKwlkb3VibGUgbnVtYmVyOworCWNoYXIgKnN0cmluZzsKKwl1bmlvbiB7CisJCWludCBhaWR4OyAgICAgICAgICAgICAgIC8qIGZ1bmMgYXJnIGlkeCAoZm9yIGNvbXBpbGF0aW9uIHN0YWdlKSAqLworCQlzdHJ1Y3QgeGhhc2hfcyAqYXJyYXk7ICAvKiBhcnJheSBwdHIgKi8KKwkJc3RydWN0IHZhcl9zICpwYXJlbnQ7ICAgLyogZm9yIGZ1bmMgYXJncywgcHRyIHRvIGFjdHVhbCBwYXJhbWV0ZXIgKi8KKwkJd2Fsa2VyX2xpc3QgKndhbGtlcjsgICAgLyogbGlzdCBvZiBhcnJheSBlbGVtZW50cyAoZm9yLi5pbikgKi8KKwl9IHg7Cit9IHZhcjsKKworLyogTm9kZSBjaGFpbiAocGF0dGVybi1hY3Rpb24gY2hhaW4sIEJFR0lOLCBFTkQsIGZ1bmN0aW9uIGJvZGllcykgKi8KK3R5cGVkZWYgc3RydWN0IGNoYWluX3MgeworCXN0cnVjdCBub2RlX3MgKmZpcnN0OworCXN0cnVjdCBub2RlX3MgKmxhc3Q7CisJY29uc3QgY2hhciAqcHJvZ3JhbW5hbWU7Cit9IGNoYWluOworCisvKiBGdW5jdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgZnVuY19zIHsKKwl1bnNpZ25lZCBuYXJnczsKKwlzdHJ1Y3QgY2hhaW5fcyBib2R5OworfSBmdW5jOworCisvKiBJL08gc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdCByc3RyZWFtX3MgeworCUZJTEUgKkY7CisJY2hhciAqYnVmZmVyOworCWludCBhZHY7CisJaW50IHNpemU7CisJaW50IHBvczsKKwlzbWFsbGludCBpc19waXBlOworfSByc3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCBoYXNoX2l0ZW1fcyB7CisJdW5pb24geworCQlzdHJ1Y3QgdmFyX3MgdjsgICAgICAgICAvKiB2YXJpYWJsZS9hcnJheSBoYXNoICovCisJCXN0cnVjdCByc3RyZWFtX3MgcnM7ICAgIC8qIHJlZGlyZWN0IHN0cmVhbXMgaGFzaCAqLworCQlzdHJ1Y3QgZnVuY19zIGY7ICAgICAgICAvKiBmdW5jdGlvbnMgaGFzaCAqLworCX0gZGF0YTsKKwlzdHJ1Y3QgaGFzaF9pdGVtX3MgKm5leHQ7ICAgICAgIC8qIG5leHQgaW4gY2hhaW4gKi8KKwljaGFyIG5hbWVbMV07ICAgICAgICAgICAgICAgICAgIC8qIHJlYWxseSBpdCdzIGxvbmdlciAqLworfSBoYXNoX2l0ZW07CisKK3R5cGVkZWYgc3RydWN0IHhoYXNoX3MgeworCXVuc2lnbmVkIG5lbDsgICAgICAgICAgIC8qIG51bSBvZiBlbGVtZW50cyAqLworCXVuc2lnbmVkIGNzaXplOyAgICAgICAgIC8qIGN1cnJlbnQgaGFzaCBzaXplICovCisJdW5zaWduZWQgbnByaW1lOyAgICAgICAgLyogbmV4dCBoYXNoIHNpemUgaW4gUFJJTUVTW10gKi8KKwl1bnNpZ25lZCBnbGVuOyAgICAgICAgICAvKiBzdW1tYXJ5IGxlbmd0aCBvZiBpdGVtIG5hbWVzICovCisJc3RydWN0IGhhc2hfaXRlbV9zICoqaXRlbXM7Cit9IHhoYXNoOworCisvKiBUcmVlIG5vZGUgKi8KK3R5cGVkZWYgc3RydWN0IG5vZGVfcyB7CisJdWludDMyX3QgaW5mbzsKKwl1bnNpZ25lZCBsaW5lbm87CisJdW5pb24geworCQlzdHJ1Y3Qgbm9kZV9zICpuOworCQl2YXIgKnY7CisJCWludCBhaWR4OworCQljaGFyICpuZXdfcHJvZ25hbWU7CisJCXJlZ2V4X3QgKnJlOworCX0gbDsKKwl1bmlvbiB7CisJCXN0cnVjdCBub2RlX3MgKm47CisJCXJlZ2V4X3QgKmlyZTsKKwkJZnVuYyAqZjsKKwl9IHI7CisJdW5pb24geworCQlzdHJ1Y3Qgbm9kZV9zICpuOworCX0gYTsKK30gbm9kZTsKKworLyogQmxvY2sgb2YgdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLwordHlwZWRlZiBzdHJ1Y3QgbnZibG9ja19zIHsKKwlpbnQgc2l6ZTsKKwl2YXIgKnBvczsKKwlzdHJ1Y3QgbnZibG9ja19zICpwcmV2OworCXN0cnVjdCBudmJsb2NrX3MgKm5leHQ7CisJdmFyIG52W107Cit9IG52YmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IHRzcGxpdHRlcl9zIHsKKwlub2RlIG47CisJcmVnZXhfdCByZVsyXTsKK30gdHNwbGl0dGVyOworCisvKiBzaW1wbGUgdG9rZW4gY2xhc3NlcyAqLworLyogT3JkZXIgYW5kIGhleCB2YWx1ZXMgYXJlIHZlcnkgaW1wb3J0YW50ISEhICBTZWUgbmV4dF90b2tlbigpICovCisjZGVmaW5lCVRDX1NFUVNUQVJUCSAxCQkJCS8qICggKi8KKyNkZWZpbmUJVENfU0VRVEVSTQkoMSA8PCAxKQkJLyogKSAqLworI2RlZmluZQlUQ19SRUdFWFAJKDEgPDwgMikJCS8qIC8uLi4vICovCisjZGVmaW5lCVRDX09VVFJEUgkoMSA8PCAzKQkJLyogfCA+ID4+ICovCisjZGVmaW5lCVRDX1VPUFBPU1QJKDEgPDwgNCkJCS8qIHVuYXJ5IHBvc3RmaXggb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfVU9QUFJFMQkoMSA8PCA1KQkJLyogdW5hcnkgcHJlZml4IG9wZXJhdG9yICovCisjZGVmaW5lCVRDX0JJTk9QWAkoMSA8PCA2KQkJLyogdHdvLW9wbmQgb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfSU4JCSgxIDw8IDcpCisjZGVmaW5lCVRDX0NPTU1BCSgxIDw8IDgpCisjZGVmaW5lCVRDX1BJUEUJCSgxIDw8IDkpCQkvKiBpbnB1dCByZWRpcmVjdGlvbiBwaXBlICovCisjZGVmaW5lCVRDX1VPUFBSRTIJKDEgPDwgMTApCQkvKiB1bmFyeSBwcmVmaXggb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfQVJSVEVSTQkoMSA8PCAxMSkJCS8qIF0gKi8KKyNkZWZpbmUJVENfR1JQU1RBUlQJKDEgPDwgMTIpCQkvKiB7ICovCisjZGVmaW5lCVRDX0dSUFRFUk0JKDEgPDwgMTMpCQkvKiB9ICovCisjZGVmaW5lCVRDX1NFTUlDT0wJKDEgPDwgMTQpCisjZGVmaW5lCVRDX05FV0xJTkUJKDEgPDwgMTUpCisjZGVmaW5lCVRDX1NUQVRYCSgxIDw8IDE2KQkJLyogY3RsIHN0YXRlbWVudCAoZm9yLCBuZXh0Li4uKSAqLworI2RlZmluZQlUQ19XSElMRQkoMSA8PCAxNykKKyNkZWZpbmUJVENfRUxTRQkJKDEgPDwgMTgpCisjZGVmaW5lCVRDX0JVSUxUSU4JKDEgPDwgMTkpCisjZGVmaW5lCVRDX0dFVExJTkUJKDEgPDwgMjApCisjZGVmaW5lCVRDX0ZVTkNERUNMCSgxIDw8IDIxKQkJLyogYGZ1bmN0aW9uJyBgZnVuYycgKi8KKyNkZWZpbmUJVENfQkVHSU4JKDEgPDwgMjIpCisjZGVmaW5lCVRDX0VORAkJKDEgPDwgMjMpCisjZGVmaW5lCVRDX0VPRgkJKDEgPDwgMjQpCisjZGVmaW5lCVRDX1ZBUklBQkxFCSgxIDw8IDI1KQorI2RlZmluZQlUQ19BUlJBWQkoMSA8PCAyNikKKyNkZWZpbmUJVENfRlVOQ1RJT04JKDEgPDwgMjcpCisjZGVmaW5lCVRDX1NUUklORwkoMSA8PCAyOCkKKyNkZWZpbmUJVENfTlVNQkVSCSgxIDw8IDI5KQorCisjZGVmaW5lCVRDX1VPUFBSRSAgKFRDX1VPUFBSRTEgfCBUQ19VT1BQUkUyKQorCisvKiBjb21iaW5lZCB0b2tlbiBjbGFzc2VzICovCisjZGVmaW5lCVRDX0JJTk9QICAgKFRDX0JJTk9QWCB8IFRDX0NPTU1BIHwgVENfUElQRSB8IFRDX0lOKQorI2RlZmluZQlUQ19VTkFSWU9QIChUQ19VT1BQUkUgfCBUQ19VT1BQT1NUKQorI2RlZmluZQlUQ19PUEVSQU5EIChUQ19WQVJJQUJMRSB8IFRDX0FSUkFZIHwgVENfRlVOQ1RJT04gXAorICAgICAgICAgICAgICAgICAgIHwgVENfQlVJTFRJTiB8IFRDX0dFVExJTkUgfCBUQ19TRVFTVEFSVCB8IFRDX1NUUklORyB8IFRDX05VTUJFUikKKworI2RlZmluZQlUQ19TVEFURU1OVCAoVENfU1RBVFggfCBUQ19XSElMRSkKKyNkZWZpbmUJVENfT1BURVJNICAoVENfU0VNSUNPTCB8IFRDX05FV0xJTkUpCisKKy8qIHdvcmQgdG9rZW5zLCBjYW5ub3QgbWVhbiBzb21ldGhpbmcgZWxzZSBpZiBub3QgZXhwZWN0ZWQgKi8KKyNkZWZpbmUJVENfV09SRCAgICAoVENfSU4gfCBUQ19TVEFURU1OVCB8IFRDX0VMU0UgfCBUQ19CVUlMVElOIFwKKyAgICAgICAgICAgICAgICAgICB8IFRDX0dFVExJTkUgfCBUQ19GVU5DREVDTCB8IFRDX0JFR0lOIHwgVENfRU5EKQorCisvKiBkaXNjYXJkIG5ld2xpbmVzIGFmdGVyIHRoZXNlICovCisjZGVmaW5lCVRDX05PVEVSTSAgKFRDX0NPTU1BIHwgVENfR1JQU1RBUlQgfCBUQ19HUlBURVJNIFwKKyAgICAgICAgICAgICAgICAgICB8IFRDX0JJTk9QIHwgVENfT1BURVJNKQorCisvKiB3aGF0IGNhbiBleHByZXNzaW9uIGJlZ2luIHdpdGggKi8KKyNkZWZpbmUJVENfT1BTRVEgICAoVENfT1BFUkFORCB8IFRDX1VPUFBSRSB8IFRDX1JFR0VYUCkKKy8qIHdoYXQgY2FuIGdyb3VwIGJlZ2luIHdpdGggKi8KKyNkZWZpbmUJVENfR1JQU0VRICAoVENfT1BTRVEgfCBUQ19PUFRFUk0gfCBUQ19TVEFURU1OVCB8IFRDX0dSUFNUQVJUKQorCisvKiBpZiBwcmV2aW91cyB0b2tlbiBjbGFzcyBpcyBDT05DQVQxIGFuZCBuZXh0IGlzIENPTkNBVDIsIGNvbmNhdGVuYXRpb24gKi8KKy8qIG9wZXJhdG9yIGlzIGluc2VydGVkIGJldHdlZW4gdGhlbSAqLworI2RlZmluZQlUQ19DT05DQVQxIChUQ19WQVJJQUJMRSB8IFRDX0FSUlRFUk0gfCBUQ19TRVFURVJNIFwKKyAgICAgICAgICAgICAgICAgICB8IFRDX1NUUklORyB8IFRDX05VTUJFUiB8IFRDX1VPUFBPU1QpCisjZGVmaW5lCVRDX0NPTkNBVDIgKFRDX09QRVJBTkQgfCBUQ19VT1BQUkUpCisKKyNkZWZpbmUJT0ZfUkVTMSAgICAweDAxMDAwMAorI2RlZmluZQlPRl9SRVMyICAgIDB4MDIwMDAwCisjZGVmaW5lCU9GX1NUUjEgICAgMHgwNDAwMDAKKyNkZWZpbmUJT0ZfU1RSMiAgICAweDA4MDAwMAorI2RlZmluZQlPRl9OVU0xICAgIDB4MTAwMDAwCisjZGVmaW5lCU9GX0NIRUNLRUQgMHgyMDAwMDAKKworLyogY29tYmluZWQgb3BlcmF0b3IgZmxhZ3MgKi8KKyNkZWZpbmUJeHgJMAorI2RlZmluZQl4VglPRl9SRVMyCisjZGVmaW5lCXhTCShPRl9SRVMyIHwgT0ZfU1RSMikKKyNkZWZpbmUJVngJT0ZfUkVTMQorI2RlZmluZQlWVgkoT0ZfUkVTMSB8IE9GX1JFUzIpCisjZGVmaW5lCU54CShPRl9SRVMxIHwgT0ZfTlVNMSkKKyNkZWZpbmUJTlYJKE9GX1JFUzEgfCBPRl9OVU0xIHwgT0ZfUkVTMikKKyNkZWZpbmUJU3gJKE9GX1JFUzEgfCBPRl9TVFIxKQorI2RlZmluZQlTVgkoT0ZfUkVTMSB8IE9GX1NUUjEgfCBPRl9SRVMyKQorI2RlZmluZQlTUwkoT0ZfUkVTMSB8IE9GX1NUUjEgfCBPRl9SRVMyIHwgT0ZfU1RSMikKKworI2RlZmluZQlPUENMU01BU0sgMHhGRjAwCisjZGVmaW5lCU9QTk1BU0sgICAweDAwN0YKKworLyogb3BlcmF0b3IgcHJpb3JpdHkgaXMgYSBoaWdoZXN0IGJ5dGUgKGV2ZW46IHItPmwsIG9kZDogbC0+ciBncm91cGluZykKKyAqIEZvciBidWlsdGlucyBpdCBoYXMgZGlmZmVyZW50IG1lYW5pbmc6IG4gbiBzMyBzMiBzMSB2MyB2MiB2MSwKKyAqIG4gLSBtaW4uIG51bWJlciBvZiBhcmdzLCB2TiAtIHJlc29sdmUgTnRoIGFyZyB0byB2YXIsIHNOIC0gcmVzb2x2ZSB0byBzdHJpbmcKKyAqLworI2RlZmluZSBQKHgpICAgICAgKHggPDwgMjQpCisjZGVmaW5lIFBSSU1BU0sgICAweDdGMDAwMDAwCisjZGVmaW5lIFBSSU1BU0syICAweDdFMDAwMDAwCisKKy8qIE9wZXJhdGlvbiBjbGFzc2VzICovCisKKyNkZWZpbmUJU0hJRlRfVElMX1RISVMJMHgwNjAwCisjZGVmaW5lCVJFQ1VSX0ZST01fVEhJUwkweDEwMDAKKworZW51bSB7CisJT0NfREVMRVRFID0gMHgwMTAwLCAgICAgT0NfRVhFQyA9IDB4MDIwMCwgICAgICAgT0NfTkVXU09VUkNFID0gMHgwMzAwLAorCU9DX1BSSU5UID0gMHgwNDAwLCAgICAgIE9DX1BSSU5URiA9IDB4MDUwMCwgICAgIE9DX1dBTEtJTklUID0gMHgwNjAwLAorCisJT0NfQlIgPSAweDA3MDAsICAgICAgICAgT0NfQlJFQUsgPSAweDA4MDAsICAgICAgT0NfQ09OVElOVUUgPSAweDA5MDAsCisJT0NfRVhJVCA9IDB4MGEwMCwgICAgICAgT0NfTkVYVCA9IDB4MGIwMCwgICAgICAgT0NfTkVYVEZJTEUgPSAweDBjMDAsCisJT0NfVEVTVCA9IDB4MGQwMCwgICAgICAgT0NfV0FMS05FWFQgPSAweDBlMDAsCisKKwlPQ19CSU5BUlkgPSAweDEwMDAsICAgICBPQ19CVUlMVElOID0gMHgxMTAwLCAgICBPQ19DT0xPTiA9IDB4MTIwMCwKKwlPQ19DT01NQSA9IDB4MTMwMCwgICAgICBPQ19DT01QQVJFID0gMHgxNDAwLCAgICBPQ19DT05DQVQgPSAweDE1MDAsCisJT0NfRkJMVElOID0gMHgxNjAwLCAgICAgT0NfRklFTEQgPSAweDE3MDAsICAgICAgT0NfRk5BUkcgPSAweDE4MDAsCisJT0NfRlVOQyA9IDB4MTkwMCwgICAgICAgT0NfR0VUTElORSA9IDB4MWEwMCwgICAgT0NfSU4gPSAweDFiMDAsCisJT0NfTEFORCA9IDB4MWMwMCwgICAgICAgT0NfTE9SID0gMHgxZDAwLCAgICAgICAgT0NfTUFUQ0ggPSAweDFlMDAsCisJT0NfTU9WRSA9IDB4MWYwMCwgICAgICAgT0NfUEdFVExJTkUgPSAweDIwMDAsICAgT0NfUkVHRVhQID0gMHgyMTAwLAorCU9DX1JFUExBQ0UgPSAweDIyMDAsICAgIE9DX1JFVFVSTiA9IDB4MjMwMCwgICAgIE9DX1NQUklOVEYgPSAweDI0MDAsCisJT0NfVEVSTkFSWSA9IDB4MjUwMCwgICAgT0NfVU5BUlkgPSAweDI2MDAsICAgICAgT0NfVkFSID0gMHgyNzAwLAorCU9DX0RPTkUgPSAweDI4MDAsCisKKwlTVF9JRiA9IDB4MzAwMCwgICAgICAgICBTVF9ETyA9IDB4MzEwMCwgICAgICAgICBTVF9GT1IgPSAweDMyMDAsCisJU1RfV0hJTEUgPSAweDMzMDAKK307CisKKy8qIHNpbXBsZSBidWlsdGlucyAqLworZW51bSB7CisJRl9pbiwJRl9ybiwJRl9jbywJRl9leCwJRl9sZywJRl9zaSwJRl9zcSwJRl9zciwKKwlGX3RpLAlGX2xlLAlGX3N5LAlGX2ZmLAlGX2NsCit9OworCisvKiBidWlsdGlucyAqLworZW51bSB7CisJQl9hMiwJQl9peCwJQl9tYSwJQl9zcCwJQl9zcywJQl90aSwgICBCX210LAlCX2xvLAlCX3VwLAorCUJfZ2UsCUJfZ3MsCUJfc3UsCisJQl9hbiwJQl9jbywJQl9scywJQl9vciwJQl9ycywJQl94bywKK307CisKKy8qIHRva2VucyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmZvIHZhbHVlcyAqLworCisjZGVmaW5lIE5UQyAgICAgIlwzNzciICAvKiBzd2l0Y2ggdG8gbmV4dCB0b2tlbiBjbGFzcyAodGM8PDEpICovCisjZGVmaW5lIE5UQ0MgICAgJ1wzNzcnCisKKyNkZWZpbmUgT0NfQiAgT0NfQlVJTFRJTgorCitzdGF0aWMgY29uc3QgY2hhciB0b2tlbmxpc3RbXSBBTElHTjEgPQorCSJcMSgiICAgICAgICAgTlRDCisJIlwxKSIgICAgICAgICBOVEMKKwkiXDEvIiAgICAgICAgIE5UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVHRVhQICovCisJIlwyPj4iICAgICAgICAiXDE+IiAgICAgICAgICJcMXwiICAgICAgIE5UQyAgICAgICAgIC8qIE9VVFJEUiAqLworCSJcMisrIiAgICAgICAgIlwyLS0iICAgICAgICBOVEMgICAgICAgICAgICAgICAgICAgICAvKiBVT1BQT1NUICovCisJIlwyKysiICAgICAgICAiXDItLSIgICAgICAgICJcMSQiICAgICAgIE5UQyAgICAgICAgIC8qIFVPUFBSRTEgKi8KKwkiXDI9PSIgICAgICAgICJcMT0iICAgICAgICAgIlwyKz0iICAgICAgIlwyLT0iICAgICAgLyogQklOT1BYICovCisJIlwyKj0iICAgICAgICAiXDIvPSIgICAgICAgICJcMiU9IiAgICAgICJcMl49IgorCSJcMSsiICAgICAgICAgIlwxLSIgICAgICAgICAiXDMqKj0iICAgICAiXDIqKiIKKwkiXDEvIiAgICAgICAgICJcMSUiICAgICAgICAgIlwxXiIgICAgICAgIlwxKiIKKwkiXDIhPSIgICAgICAgICJcMj49IiAgICAgICAgIlwyPD0iICAgICAgIlwxPiIKKwkiXDE8IiAgICAgICAgICJcMiF+IiAgICAgICAgIlwxfiIgICAgICAgIlwyJiYiCisJIlwyfHwiICAgICAgICAiXDE/IiAgICAgICAgICJcMToiICAgICAgIE5UQworCSJcMmluIiAgICAgICAgTlRDCisJIlwxLCIgICAgICAgICBOVEMKKwkiXDF8IiAgICAgICAgIE5UQworCSJcMSsiICAgICAgICAgIlwxLSIgICAgICAgICAiXDEhIiAgICAgICBOVEMgICAgICAgICAvKiBVT1BQUkUyICovCisJIlwxXSIgICAgICAgICBOVEMKKwkiXDF7IiAgICAgICAgIE5UQworCSJcMX0iICAgICAgICAgTlRDCisJIlwxOyIgICAgICAgICBOVEMKKwkiXDFcbiIgICAgICAgIE5UQworCSJcMmlmIiAgICAgICAgIlwyZG8iICAgICAgICAiXDNmb3IiICAgICAiXDVicmVhayIgICAvKiBTVEFUWCAqLworCSJcMTBjb250aW51ZSIgIlw2ZGVsZXRlIiAgICAiXDVwcmludCIKKwkiXDZwcmludGYiICAgICJcNG5leHQiICAgICAgIlwxMG5leHRmaWxlIgorCSJcNnJldHVybiIgICAgIlw0ZXhpdCIgICAgICBOVEMKKwkiXDV3aGlsZSIgICAgIE5UQworCSJcNGVsc2UiICAgICAgTlRDCisKKwkiXDNhbmQiICAgICAgICJcNWNvbXBsIiAgICAgIlw2bHNoaWZ0IiAgIlwyb3IiCisJIlw2cnNoaWZ0IiAgICAiXDN4b3IiCisJIlw1Y2xvc2UiICAgICAiXDZzeXN0ZW0iICAgICJcNmZmbHVzaCIgICJcNWF0YW4yIiAgIC8qIEJVSUxUSU4gKi8KKwkiXDNjb3MiICAgICAgICJcM2V4cCIgICAgICAgIlwzaW50IiAgICAgIlwzbG9nIgorCSJcNHJhbmQiICAgICAgIlwzc2luIiAgICAgICAiXDRzcXJ0IiAgICAiXDVzcmFuZCIKKwkiXDZnZW5zdWIiICAgICJcNGdzdWIiICAgICAgIlw1aW5kZXgiICAgIlw2bGVuZ3RoIgorCSJcNW1hdGNoIiAgICAgIlw1c3BsaXQiICAgICAiXDdzcHJpbnRmIiAiXDNzdWIiCisJIlw2c3Vic3RyIiAgICAiXDdzeXN0aW1lIiAgICJcMTBzdHJmdGltZSIgIlw2bWt0aW1lIgorCSJcN3RvbG93ZXIiICAgIlw3dG91cHBlciIgICBOVEMKKwkiXDdnZXRsaW5lIiAgIE5UQworCSJcNGZ1bmMiICAgICAgIlwxMGZ1bmN0aW9uIiBOVEMKKwkiXDVCRUdJTiIgICAgIE5UQworCSJcM0VORCIKKwkvKiBjb21waWxlciBhZGRzIHRyYWlsaW5nICJcMCIgKi8KKwk7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB0b2tlbmluZm9bXSA9IHsKKwkwLAorCTAsCisJT0NfUkVHRVhQLAorCXhTfCdhJywgICAgICAgICAgICAgICAgICB4U3wndycsICAgICAgICAgICAgICAgICAgeFN8J3wnLAorCU9DX1VOQVJZfHhWfFAoOSl8J3AnLCAgICBPQ19VTkFSWXx4VnxQKDkpfCdtJywKKwlPQ19VTkFSWXx4VnxQKDkpfCdQJywgICAgT0NfVU5BUll8eFZ8UCg5KXwnTScsICAgIE9DX0ZJRUxEfHhWfFAoNSksCisJT0NfQ09NUEFSRXxWVnxQKDM5KXw1LCAgIE9DX01PVkV8VlZ8UCg3NCksICAgICAgICBPQ19SRVBMQUNFfE5WfFAoNzQpfCcrJywgT0NfUkVQTEFDRXxOVnxQKDc0KXwnLScsCisJT0NfUkVQTEFDRXxOVnxQKDc0KXwnKicsIE9DX1JFUExBQ0V8TlZ8UCg3NCl8Jy8nLCBPQ19SRVBMQUNFfE5WfFAoNzQpfCclJywgT0NfUkVQTEFDRXxOVnxQKDc0KXwnJicsCisJT0NfQklOQVJZfE5WfFAoMjkpfCcrJywgIE9DX0JJTkFSWXxOVnxQKDI5KXwnLScsICBPQ19SRVBMQUNFfE5WfFAoNzQpfCcmJywgT0NfQklOQVJZfE5WfFAoMTUpfCcmJywKKwlPQ19CSU5BUll8TlZ8UCgyNSl8Jy8nLCAgT0NfQklOQVJZfE5WfFAoMjUpfCclJywgIE9DX0JJTkFSWXxOVnxQKDE1KXwnJicsICBPQ19CSU5BUll8TlZ8UCgyNSl8JyonLAorCU9DX0NPTVBBUkV8VlZ8UCgzOSl8NCwgICBPQ19DT01QQVJFfFZWfFAoMzkpfDMsICAgT0NfQ09NUEFSRXxWVnxQKDM5KXwwLCAgIE9DX0NPTVBBUkV8VlZ8UCgzOSl8MSwKKwlPQ19DT01QQVJFfFZWfFAoMzkpfDIsICAgT0NfTUFUQ0h8U3h8UCg0NSl8JyEnLCAgIE9DX01BVENIfFN4fFAoNDUpfCd+JywgICBPQ19MQU5EfFZ4fFAoNTUpLAorCU9DX0xPUnxWeHxQKDU5KSwgICAgICAgICBPQ19URVJOQVJZfFZ4fFAoNjQpfCc/JywgT0NfQ09MT058eHh8UCg2Nyl8JzonLAorCU9DX0lOfFNWfFAoNDkpLCAvKiBpbiAqLworCU9DX0NPTU1BfFNTfFAoODApLAorCU9DX1BHRVRMSU5FfFNWfFAoMzcpLAorCU9DX1VOQVJZfHhWfFAoMTkpfCcrJywgICBPQ19VTkFSWXx4VnxQKDE5KXwnLScsICAgT0NfVU5BUll8eFZ8UCgxOSl8JyEnLAorCTAsIC8qIF0gKi8KKwkwLAorCTAsCisJMCwKKwkwLCAvKiBcbiAqLworCVNUX0lGLCAgICAgICAgU1RfRE8sICAgICAgICBTVF9GT1IsICAgICAgT0NfQlJFQUssCisJT0NfQ09OVElOVUUsICBPQ19ERUxFVEV8VngsIE9DX1BSSU5ULAorCU9DX1BSSU5URiwgICAgT0NfTkVYVCwgICAgICBPQ19ORVhURklMRSwKKwlPQ19SRVRVUk58VngsIE9DX0VYSVR8TngsCisJU1RfV0hJTEUsCisJMCwgLyogZWxzZSAqLworCisJT0NfQnxCX2FufFAoMHg4MyksIE9DX0J8Ql9jb3xQKDB4NDEpLCBPQ19CfEJfbHN8UCgweDgzKSwgT0NfQnxCX29yfFAoMHg4MyksCisJT0NfQnxCX3JzfFAoMHg4MyksIE9DX0J8Ql94b3xQKDB4ODMpLAorCU9DX0ZCTFRJTnxTeHxGX2NsLCBPQ19GQkxUSU58U3h8Rl9zeSwgT0NfRkJMVElOfFN4fEZfZmYsIE9DX0J8Ql9hMnxQKDB4ODMpLAorCU9DX0ZCTFRJTnxOeHxGX2NvLCBPQ19GQkxUSU58Tnh8Rl9leCwgT0NfRkJMVElOfE54fEZfaW4sIE9DX0ZCTFRJTnxOeHxGX2xnLAorCU9DX0ZCTFRJTnxGX3JuLCAgICBPQ19GQkxUSU58Tnh8Rl9zaSwgT0NfRkJMVElOfE54fEZfc3EsIE9DX0ZCTFRJTnxOeHxGX3NyLAorCU9DX0J8Ql9nZXxQKDB4ZDYpLCBPQ19CfEJfZ3N8UCgweGI2KSwgT0NfQnxCX2l4fFAoMHg5YiksIE9DX0ZCTFRJTnxTeHxGX2xlLAorCU9DX0J8Ql9tYXxQKDB4ODkpLCBPQ19CfEJfc3B8UCgweDhiKSwgT0NfU1BSSU5URiwgICAgICAgIE9DX0J8Ql9zdXxQKDB4YjYpLAorCU9DX0J8Ql9zc3xQKDB4OGYpLCBPQ19GQkxUSU58Rl90aSwgICAgT0NfQnxCX3RpfFAoMHgwYiksIE9DX0J8Ql9tdHxQKDB4MGIpLAorCU9DX0J8Ql9sb3xQKDB4NDkpLCBPQ19CfEJfdXB8UCgweDQ5KSwKKwlPQ19HRVRMSU5FfFNWfFAoMCksCisJMCwgICAgICAgICAgICAgICAgIDAsCisJMCwKKwkwIC8qIEVORCAqLworfTsKKworLyogaW50ZXJuYWwgdmFyaWFibGUgbmFtZXMgYW5kIHRoZWlyIGluaXRpYWwgdmFsdWVzICAgICAgICovCisvKiBhc3RlcmlzayBtYXJrcyBTUEVDSUFMIHZhcnM7ICQgaXMganVzdCBuby1uYW1lZCBGaWVsZDAgKi8KK2VudW0geworCUNPTlZGTVQsICAgIE9GTVQsICAgICAgIEZTLCAgICAgICAgIE9GUywKKwlPUlMsICAgICAgICBSUywgICAgICAgICBSVCwgICAgICAgICBGSUxFTkFNRSwKKwlTVUJTRVAsICAgICBGMCwgICAgICAgICBBUkdJTkQsICAgICBBUkdDLAorCUFSR1YsICAgICAgIEVSUk5PLCAgICAgIEZOUiwgICAgICAgIE5SLAorCU5GLCAgICAgICAgIElHTk9SRUNBU0UsIEVOVklST04sICAgIE5VTV9JTlRFUk5BTF9WQVJTCit9OworCitzdGF0aWMgY29uc3QgY2hhciB2TmFtZXNbXSBBTElHTjEgPQorCSJDT05WRk1UXDAiICJPRk1UXDAiICAgICJGU1wwKiIgICAgICJPRlNcMCIKKwkiT1JTXDAiICAgICAiUlNcMCoiICAgICAiUlRcMCIgICAgICAiRklMRU5BTUVcMCIKKwkiU1VCU0VQXDAiICAiJFwwKiIgICAgICAiQVJHSU5EXDAiICAiQVJHQ1wwIgorCSJBUkdWXDAiICAgICJFUlJOT1wwIiAgICJGTlJcMCIgICAgICJOUlwwIgorCSJORlwwKiIgICAgICJJR05PUkVDQVNFXDAqIiAiRU5WSVJPTlwwIiAiXDAiOworCitzdGF0aWMgY29uc3QgY2hhciB2VmFsdWVzW10gQUxJR04xID0KKwkiJS42Z1wwIiAgICAiJS42Z1wwIiAgICAiIFwwIiAgICAgICAiIFwwIgorCSJcblwwIiAgICAgICJcblwwIiAgICAgICJcMCIgICAgICAgICJcMCIKKwkiXDAzNFwwIiAgICAiXDAiICAgICAgICAiXDM3NyI7CisKKy8qIGhhc2ggc2l6ZSBtYXkgZ3JvdyB0byB0aGVzZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRklSU1RfUFJJTUUgNjEKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBQUklNRVNbXSBBTElHTjIgPSB7IDI1MSwgMTAyMSwgNDA5MywgMTYzODEsIDY1NTIxIH07CisKKworLyogR2xvYmFscy4gU3BsaXQgaW4gdHdvIHBhcnRzIHNvIHRoYXQgZmlyc3Qgb25lIGlzIGFkZHJlc3NlZAorICogd2l0aCAobW9zdGx5IHNob3J0KSBuZWdhdGl2ZSBvZmZzZXRzLgorICogTkI6IGl0J3MgdW5zYWZlIHRvIHB1dCBtZW1iZXJzIG9mIHR5cGUgImRvdWJsZSIKKyAqIGludG8gZ2xvYmFsczIgKGdjYyBtYXkgZmFpbCB0byBhbGlnbiB0aGVtKS4KKyAqLworc3RydWN0IGdsb2JhbHMgeworCWRvdWJsZSB0X2RvdWJsZTsKKwljaGFpbiBiZWdpbnNlcSwgbWFpbnNlcSwgZW5kc2VxOworCWNoYWluICpzZXE7CisJbm9kZSAqYnJlYWtfcHRyLCAqY29udGludWVfcHRyOworCXJzdHJlYW0gKmlGOworCXhoYXNoICp2aGFzaCwgKmFoYXNoLCAqZmRoYXNoLCAqZm5oYXNoOworCWNvbnN0IGNoYXIgKmdfcHJvZ25hbWU7CisJaW50IGdfbGluZW5vOworCWludCBuZmllbGRzOworCWludCBtYXhmaWVsZHM7IC8qIHVzZWQgaW4gZnNyZWFsbG9jKCkgb25seSAqLworCXZhciAqRmllbGRzOworCW52YmxvY2sgKmdfY2I7CisJY2hhciAqZ19wb3M7CisJY2hhciAqZ19idWY7CisJc21hbGxpbnQgaWNhc2U7CisJc21hbGxpbnQgZXhpdGluZzsKKwlzbWFsbGludCBuZXh0cmVjOworCXNtYWxsaW50IG5leHRmaWxlOworCXNtYWxsaW50IGlzX2YwX3NwbGl0OworfTsKK3N0cnVjdCBnbG9iYWxzMiB7CisJdWludDMyX3QgdF9pbmZvOyAvKiBvZnRlbiB1c2VkICovCisJdWludDMyX3QgdF90Y2xhc3M7CisJY2hhciAqdF9zdHJpbmc7CisJaW50IHRfbGluZW5vOworCWludCB0X3JvbGxiYWNrOworCisJdmFyICppbnR2YXJbTlVNX0lOVEVSTkFMX1ZBUlNdOyAvKiBvZnRlbiB1c2VkICovCisKKwkvKiBmb3JtZXIgc3RhdGljcyBmcm9tIHZhcmlvdXMgZnVuY3Rpb25zICovCisJY2hhciAqc3BsaXRfZjBfX2ZzdHJpbmdzOworCisJdWludDMyX3QgbmV4dF90b2tlbl9fc2F2ZV90Y2xhc3M7CisJdWludDMyX3QgbmV4dF90b2tlbl9fc2F2ZV9pbmZvOworCXVpbnQzMl90IG5leHRfdG9rZW5fX2x0Y2xhc3M7CisJc21hbGxpbnQgbmV4dF90b2tlbl9fY29uY2F0X2luc2VydGVkOworCisJc21hbGxpbnQgbmV4dF9pbnB1dF9maWxlX19maWxlc19oYXBwZW47CisJcnN0cmVhbSBuZXh0X2lucHV0X2ZpbGVfX3JzbTsKKworCXZhciAqZXZhbHVhdGVfX2ZuYXJnczsKKwl1bnNpZ25lZCBldmFsdWF0ZV9fc2VlZDsKKwlyZWdleF90IGV2YWx1YXRlX19zcmVnOworCisJdmFyIHB0ZXN0X192OworCisJdHNwbGl0dGVyIGV4ZWNfYnVpbHRpbl9fdHNwbDsKKworCS8qIGJpZ2dlc3QgYW5kIGxlYXN0IHVzZWQgbWVtYmVycyBnbyBsYXN0ICovCisJdHNwbGl0dGVyIGZzcGxpdHRlciwgcnNwbGl0dGVyOworfTsKKyNkZWZpbmUgRzEgKHB0cl90b19nbG9iYWxzWy0xXSkKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFsczIgKilwdHJfdG9fZ2xvYmFscykKKy8qIEZvciBkZWJ1Zy4gbm0gLS1zaXplLXNvcnQgYXdrLm8gfCBncmVwIC12aSAnIFt0cl0gJyAqLworLypjaGFyIEcxc2l6ZVtzaXplb2YoRzEpXTsgLSAweDc0ICovCisvKmNoYXIgR3NpemVbc2l6ZW9mKEcpXTsgLSAweDFjNCAqLworLyogVHJ5aW5nIHRvIGtlZXAgbW9zdCBvZiBtZW1iZXJzIGFjY2Vzc2libGUgd2l0aCBzaG9ydCBvZmZzZXRzOiAqLworLypjaGFyIEdvZnNfc2VlZFtvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFsczIsIGV2YWx1YXRlX19zZWVkKV07IC0gMHg5MCAqLworI2RlZmluZSB0X2RvdWJsZSAgICAgKEcxLnRfZG91YmxlICAgICkKKyNkZWZpbmUgYmVnaW5zZXEgICAgIChHMS5iZWdpbnNlcSAgICApCisjZGVmaW5lIG1haW5zZXEgICAgICAoRzEubWFpbnNlcSAgICAgKQorI2RlZmluZSBlbmRzZXEgICAgICAgKEcxLmVuZHNlcSAgICAgICkKKyNkZWZpbmUgc2VxICAgICAgICAgIChHMS5zZXEgICAgICAgICApCisjZGVmaW5lIGJyZWFrX3B0ciAgICAoRzEuYnJlYWtfcHRyICAgKQorI2RlZmluZSBjb250aW51ZV9wdHIgKEcxLmNvbnRpbnVlX3B0cikKKyNkZWZpbmUgaUYgICAgICAgICAgIChHMS5pRiAgICAgICAgICApCisjZGVmaW5lIHZoYXNoICAgICAgICAoRzEudmhhc2ggICAgICAgKQorI2RlZmluZSBhaGFzaCAgICAgICAgKEcxLmFoYXNoICAgICAgICkKKyNkZWZpbmUgZmRoYXNoICAgICAgIChHMS5mZGhhc2ggICAgICApCisjZGVmaW5lIGZuaGFzaCAgICAgICAoRzEuZm5oYXNoICAgICAgKQorI2RlZmluZSBnX3Byb2duYW1lICAgKEcxLmdfcHJvZ25hbWUgICkKKyNkZWZpbmUgZ19saW5lbm8gICAgIChHMS5nX2xpbmVubyAgICApCisjZGVmaW5lIG5maWVsZHMgICAgICAoRzEubmZpZWxkcyAgICAgKQorI2RlZmluZSBtYXhmaWVsZHMgICAgKEcxLm1heGZpZWxkcyAgICkKKyNkZWZpbmUgRmllbGRzICAgICAgIChHMS5GaWVsZHMgICAgICApCisjZGVmaW5lIGdfY2IgICAgICAgICAoRzEuZ19jYiAgICAgICAgKQorI2RlZmluZSBnX3BvcyAgICAgICAgKEcxLmdfcG9zICAgICAgICkKKyNkZWZpbmUgZ19idWYgICAgICAgIChHMS5nX2J1ZiAgICAgICApCisjZGVmaW5lIGljYXNlICAgICAgICAoRzEuaWNhc2UgICAgICAgKQorI2RlZmluZSBleGl0aW5nICAgICAgKEcxLmV4aXRpbmcgICAgICkKKyNkZWZpbmUgbmV4dHJlYyAgICAgIChHMS5uZXh0cmVjICAgICApCisjZGVmaW5lIG5leHRmaWxlICAgICAoRzEubmV4dGZpbGUgICAgKQorI2RlZmluZSBpc19mMF9zcGxpdCAgKEcxLmlzX2YwX3NwbGl0ICkKKyNkZWZpbmUgdF9pbmZvICAgICAgIChHLnRfaW5mbyAgICAgICkKKyNkZWZpbmUgdF90Y2xhc3MgICAgIChHLnRfdGNsYXNzICAgICkKKyNkZWZpbmUgdF9zdHJpbmcgICAgIChHLnRfc3RyaW5nICAgICkKKyNkZWZpbmUgdF9saW5lbm8gICAgIChHLnRfbGluZW5vICAgICkKKyNkZWZpbmUgdF9yb2xsYmFjayAgIChHLnRfcm9sbGJhY2sgICkKKyNkZWZpbmUgaW50dmFyICAgICAgIChHLmludHZhciAgICAgICkKKyNkZWZpbmUgZnNwbGl0dGVyICAgIChHLmZzcGxpdHRlciAgICkKKyNkZWZpbmUgcnNwbGl0dGVyICAgIChHLnJzcGxpdHRlciAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKChjaGFyKil4emFsbG9jKHNpemVvZihHMSkrc2l6ZW9mKEcpKSArIHNpemVvZihHMSkpOyBcCisJRy5uZXh0X3Rva2VuX19sdGNsYXNzID0gVENfT1BURVJNOyBcCisJRy5ldmFsdWF0ZV9fc2VlZCA9IDE7IFwKK30gd2hpbGUgKDApCisKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaGFuZGxlX3NwZWNpYWwodmFyICopOworc3RhdGljIG5vZGUgKnBhcnNlX2V4cHIodWludDMyX3QpOworc3RhdGljIHZvaWQgY2hhaW5fZ3JvdXAodm9pZCk7CitzdGF0aWMgdmFyICpldmFsdWF0ZShub2RlICosIHZhciAqKTsKK3N0YXRpYyByc3RyZWFtICpuZXh0X2lucHV0X2ZpbGUodm9pZCk7CitzdGF0aWMgaW50IGZtdF9udW0oY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgZG91YmxlLCBpbnQpOworc3RhdGljIGludCBhd2tfZXhpdChpbnQpIE5PUkVUVVJOOworCisvKiAtLS0tIGVycm9yIGhhbmRsaW5nIC0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19JTlRFUk5BTF9FUlJPUltdIEFMSUdOMSA9ICJJbnRlcm5hbCBlcnJvciI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1VORVhQX0VPU1tdIEFMSUdOMSA9ICJVbmV4cGVjdGVkIGVuZCBvZiBzdHJpbmciOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19VTkVYUF9UT0tFTltdIEFMSUdOMSA9ICJVbmV4cGVjdGVkIHRva2VuIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfRElWX0JZX1pFUk9bXSBBTElHTjEgPSAiRGl2aXNpb24gYnkgemVybyI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX0lOVl9GTVRbXSBBTElHTjEgPSAiSW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfVE9PX0ZFV19BUkdTW10gQUxJR04xID0gIlRvbyBmZXcgYXJndW1lbnRzIGZvciBidWlsdGluIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfTk9UX0FSUkFZW10gQUxJR04xID0gIk5vdCBhbiBhcnJheSI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1BPU1NJQkxFX0VSUk9SW10gQUxJR04xID0gIlBvc3NpYmxlIHN5bnRheCBlcnJvciI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1VOREVGX0ZVTkNbXSBBTElHTjEgPSAiQ2FsbCB0byB1bmRlZmluZWQgZnVuY3Rpb24iOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19OT19NQVRIW10gQUxJR04xID0gIk1hdGggc3VwcG9ydCBpcyBub3QgY29tcGlsZWQgaW4iOworCitzdGF0aWMgdm9pZCB6ZXJvX291dF92YXIodmFyICp2cCkKK3sKKwltZW1zZXQodnAsIDAsIHNpemVvZigqdnApKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiVpOiAlcyIsIGdfcHJvZ25hbWUsIGdfbGluZW5vLCBtZXNzYWdlKTsKK30KKworLyogLS0tLSBoYXNoIHN0dWZmIC0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGhhc2hpZHgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpZHggPSAwOworCisJd2hpbGUgKCpuYW1lKQorCQlpZHggPSAqbmFtZSsrICsgKGlkeCA8PCA2KSAtIGlkeDsKKwlyZXR1cm4gaWR4OworfQorCisvKiBjcmVhdGUgbmV3IGhhc2ggKi8KK3N0YXRpYyB4aGFzaCAqaGFzaF9pbml0KHZvaWQpCit7CisJeGhhc2ggKm5ld2hhc2g7CisKKwluZXdoYXNoID0geHphbGxvYyhzaXplb2YoKm5ld2hhc2gpKTsKKwluZXdoYXNoLT5jc2l6ZSA9IEZJUlNUX1BSSU1FOworCW5ld2hhc2gtPml0ZW1zID0geHphbGxvYyhGSVJTVF9QUklNRSAqIHNpemVvZihuZXdoYXNoLT5pdGVtc1swXSkpOworCisJcmV0dXJuIG5ld2hhc2g7Cit9CisKKy8qIGZpbmQgaXRlbSBpbiBoYXNoLCByZXR1cm4gcHRyIHRvIGRhdGEsIE5VTEwgaWYgbm90IGZvdW5kICovCitzdGF0aWMgdm9pZCAqaGFzaF9zZWFyY2goeGhhc2ggKmhhc2gsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaGFzaF9pdGVtICpoaTsKKworCWhpID0gaGFzaC0+aXRlbXNbaGFzaGlkeChuYW1lKSAlIGhhc2gtPmNzaXplXTsKKwl3aGlsZSAoaGkpIHsKKwkJaWYgKHN0cmNtcChoaS0+bmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAmaGktPmRhdGE7CisJCWhpID0gaGktPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBncm93IGhhc2ggaWYgaXQgYmVjb21lcyB0b28gYmlnICovCitzdGF0aWMgdm9pZCBoYXNoX3JlYnVpbGQoeGhhc2ggKmhhc2gpCit7CisJdW5zaWduZWQgbmV3c2l6ZSwgaSwgaWR4OworCWhhc2hfaXRlbSAqKm5ld2l0ZW1zLCAqaGksICp0aGk7CisKKwlpZiAoaGFzaC0+bnByaW1lID09IEFSUkFZX1NJWkUoUFJJTUVTKSkKKwkJcmV0dXJuOworCisJbmV3c2l6ZSA9IFBSSU1FU1toYXNoLT5ucHJpbWUrK107CisJbmV3aXRlbXMgPSB4emFsbG9jKG5ld3NpemUgKiBzaXplb2YobmV3aXRlbXNbMF0pKTsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5jc2l6ZTsgaSsrKSB7CisJCWhpID0gaGFzaC0+aXRlbXNbaV07CisJCXdoaWxlIChoaSkgeworCQkJdGhpID0gaGk7CisJCQloaSA9IHRoaS0+bmV4dDsKKwkJCWlkeCA9IGhhc2hpZHgodGhpLT5uYW1lKSAlIG5ld3NpemU7CisJCQl0aGktPm5leHQgPSBuZXdpdGVtc1tpZHhdOworCQkJbmV3aXRlbXNbaWR4XSA9IHRoaTsKKwkJfQorCX0KKworCWZyZWUoaGFzaC0+aXRlbXMpOworCWhhc2gtPmNzaXplID0gbmV3c2l6ZTsKKwloYXNoLT5pdGVtcyA9IG5ld2l0ZW1zOworfQorCisvKiBmaW5kIGl0ZW0gaW4gaGFzaCwgYWRkIGl0IGlmIG5lY2Vzc2FyeS4gUmV0dXJuIHB0ciB0byBkYXRhICovCitzdGF0aWMgdm9pZCAqaGFzaF9maW5kKHhoYXNoICpoYXNoLCBjb25zdCBjaGFyICpuYW1lKQoreworCWhhc2hfaXRlbSAqaGk7CisJdW5zaWduZWQgaWR4OworCWludCBsOworCisJaGkgPSBoYXNoX3NlYXJjaChoYXNoLCBuYW1lKTsKKwlpZiAoIWhpKSB7CisJCWlmICgrK2hhc2gtPm5lbCAvIGhhc2gtPmNzaXplID4gMTApCisJCQloYXNoX3JlYnVpbGQoaGFzaCk7CisKKwkJbCA9IHN0cmxlbihuYW1lKSArIDE7CisJCWhpID0geHphbGxvYyhzaXplb2YoKmhpKSArIGwpOworCQlzdHJjcHkoaGktPm5hbWUsIG5hbWUpOworCisJCWlkeCA9IGhhc2hpZHgobmFtZSkgJSBoYXNoLT5jc2l6ZTsKKwkJaGktPm5leHQgPSBoYXNoLT5pdGVtc1tpZHhdOworCQloYXNoLT5pdGVtc1tpZHhdID0gaGk7CisJCWhhc2gtPmdsZW4gKz0gbDsKKwl9CisJcmV0dXJuICZoaS0+ZGF0YTsKK30KKworI2RlZmluZSBmaW5kdmFyKGhhc2gsIG5hbWUpICgodmFyKikgICAgaGFzaF9maW5kKChoYXNoKSwgKG5hbWUpKSkKKyNkZWZpbmUgbmV3dmFyKG5hbWUpICAgICAgICAoKHZhciopICAgIGhhc2hfZmluZCh2aGFzaCwgKG5hbWUpKSkKKyNkZWZpbmUgbmV3ZmlsZShuYW1lKSAgICAgICAoKHJzdHJlYW0qKWhhc2hfZmluZChmZGhhc2gsIChuYW1lKSkpCisjZGVmaW5lIG5ld2Z1bmMobmFtZSkgICAgICAgKChmdW5jKikgICBoYXNoX2ZpbmQoZm5oYXNoLCAobmFtZSkpKQorCitzdGF0aWMgdm9pZCBoYXNoX3JlbW92ZSh4aGFzaCAqaGFzaCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwloYXNoX2l0ZW0gKmhpLCAqKnBoaTsKKworCXBoaSA9ICZoYXNoLT5pdGVtc1toYXNoaWR4KG5hbWUpICUgaGFzaC0+Y3NpemVdOworCXdoaWxlICgqcGhpKSB7CisJCWhpID0gKnBoaTsKKwkJaWYgKHN0cmNtcChoaS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaGFzaC0+Z2xlbiAtPSAoc3RybGVuKG5hbWUpICsgMSk7CisJCQloYXNoLT5uZWwtLTsKKwkJCSpwaGkgPSBoaS0+bmV4dDsKKwkJCWZyZWUoaGkpOworCQkJYnJlYWs7CisJCX0KKwkJcGhpID0gJmhpLT5uZXh0OworCX0KK30KKworLyogLS0tLS0tIHNvbWUgdXNlZnVsIGZ1bmN0aW9ucyAtLS0tLS0gKi8KKworc3RhdGljIGNoYXIgKnNraXBfc3BhY2VzKGNoYXIgKnApCit7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCpwID09ICdcXCcgJiYgcFsxXSA9PSAnXG4nKSB7CisJCQlwKys7CisJCQl0X2xpbmVubysrOworCQl9IGVsc2UgaWYgKCpwICE9ICcgJyAmJiAqcCAhPSAnXHQnKSB7CisJCQlicmVhazsKKwkJfQorCQlwKys7CisJfQorCXJldHVybiBwOworfQorCisvKiByZXR1cm5zIG9sZCAqcywgYWR2YW5jZXMgKnMgcGFzdCB3b3JkIGFuZCB0ZXJtaW5hdGluZyBOVUwgKi8KK3N0YXRpYyBjaGFyICpuZXh0d29yZChjaGFyICoqcykKK3sKKwljaGFyICpwID0gKnM7CisJd2hpbGUgKCooKnMpKysgIT0gJ1wwJykKKwkJY29udGludWU7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyIG5leHRjaGFyKGNoYXIgKipzKQoreworCWNoYXIgYywgKnBwczsKKworCWMgPSAqKCpzKSsrOworCXBwcyA9ICpzOworCWlmIChjID09ICdcXCcpCisJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgoY29uc3QgY2hhcioqKXMpOworCWlmIChjID09ICdcXCcgJiYgKnMgPT0gcHBzKSB7IC8qIHVucmVjb2duaXplZCBcej8gKi8KKwkJYyA9ICooKnMpOyAvKiB5ZXMsIGZldGNoIHogKi8KKwkJaWYgKGMpCisJCQkoKnMpKys7IC8qIGFkdmFuY2UgdW5sZXNzIHogPSBOVUwgKi8KKwl9CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBpc2FsbnVtXyhpbnQgYykKK3sKKwlyZXR1cm4gKGlzYWxudW0oYykgfHwgYyA9PSAnXycpOworfQorCitzdGF0aWMgZG91YmxlIG15X3N0cnRvZChjaGFyICoqcHApCit7CisJY2hhciAqY3AgPSAqcHA7CisJaWYgKEVOQUJMRV9ERVNLVE9QICYmIGNwWzBdID09ICcwJykgeworCQkvKiBNaWdodCBiZSBoZXggb3Igb2N0YWwgaW50ZWdlcjogMHgxMjNhYmMgb3IgMDc3NzcgKi8KKwkJY2hhciBjID0gKGNwWzFdIHwgMHgyMCk7CisJCWlmIChjID09ICd4JyB8fCBpc2RpZ2l0KGNwWzFdKSkgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIHVsbCA9IHN0cnRvdWxsKGNwLCBwcCwgMCk7CisJCQlpZiAoYyA9PSAneCcpCisJCQkJcmV0dXJuIHVsbDsKKwkJCWMgPSAqKnBwOworCQkJaWYgKCFpc2RpZ2l0KGMpICYmIGMgIT0gJy4nKQorCQkJCXJldHVybiB1bGw7CisJCQkvKiBlbHNlOiBpdCBtYXkgYmUgYSBmbG9hdGluZyBudW1iZXIuIEV4YW1wbGVzOgorCQkJICogMDA5LjEyMyAoKnBwIHBvaW50cyB0byAnOScpCisJCQkgKiAwMDAuMTIzICgqcHAgcG9pbnRzIHRvICcuJykKKwkJCSAqIGZhbGwgdGhyb3VnaCB0byBzdHJ0b2QuCisJCQkgKi8KKwkJfQorCX0KKwlyZXR1cm4gc3RydG9kKGNwLCBwcCk7Cit9CisKKy8qIC0tLS0tLS0tIHdvcmtpbmcgd2l0aCB2YXJpYWJsZXMgKHNldC9nZXQvY29weS9ldGMpIC0tLS0tLS0tICovCisKK3N0YXRpYyB4aGFzaCAqaWFtYXJyYXkodmFyICp2KQoreworCXZhciAqYSA9IHY7CisKKwl3aGlsZSAoYS0+dHlwZSAmIFZGX0NISUxEKQorCQlhID0gYS0+eC5wYXJlbnQ7CisKKwlpZiAoIShhLT50eXBlICYgVkZfQVJSQVkpKSB7CisJCWEtPnR5cGUgfD0gVkZfQVJSQVk7CisJCWEtPnguYXJyYXkgPSBoYXNoX2luaXQoKTsKKwl9CisJcmV0dXJuIGEtPnguYXJyYXk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2FycmF5KHhoYXNoICphcnJheSkKK3sKKwl1bnNpZ25lZCBpOworCWhhc2hfaXRlbSAqaGksICp0aGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJyYXktPmNzaXplOyBpKyspIHsKKwkJaGkgPSBhcnJheS0+aXRlbXNbaV07CisJCXdoaWxlIChoaSkgeworCQkJdGhpID0gaGk7CisJCQloaSA9IGhpLT5uZXh0OworCQkJZnJlZSh0aGktPmRhdGEudi5zdHJpbmcpOworCQkJZnJlZSh0aGkpOworCQl9CisJCWFycmF5LT5pdGVtc1tpXSA9IE5VTEw7CisJfQorCWFycmF5LT5nbGVuID0gYXJyYXktPm5lbCA9IDA7Cit9CisKKy8qIGNsZWFyIGEgdmFyaWFibGUgKi8KK3N0YXRpYyB2YXIgKmNscnZhcih2YXIgKnYpCit7CisJaWYgKCEodi0+dHlwZSAmIFZGX0ZTVFIpKQorCQlmcmVlKHYtPnN0cmluZyk7CisKKwl2LT50eXBlICY9IFZGX0RPTlRUT1VDSDsKKwl2LT50eXBlIHw9IFZGX0RJUlRZOworCXYtPnN0cmluZyA9IE5VTEw7CisJcmV0dXJuIHY7Cit9CisKKy8qIGFzc2lnbiBzdHJpbmcgdmFsdWUgdG8gdmFyaWFibGUgKi8KK3N0YXRpYyB2YXIgKnNldHZhcl9wKHZhciAqdiwgY2hhciAqdmFsdWUpCit7CisJY2xydmFyKHYpOworCXYtPnN0cmluZyA9IHZhbHVlOworCWhhbmRsZV9zcGVjaWFsKHYpOworCXJldHVybiB2OworfQorCisvKiBzYW1lIGFzIHNldHZhcl9wIGJ1dCBtYWtlIGEgY29weSBvZiBzdHJpbmcgKi8KK3N0YXRpYyB2YXIgKnNldHZhcl9zKHZhciAqdiwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJcmV0dXJuIHNldHZhcl9wKHYsICh2YWx1ZSAmJiAqdmFsdWUpID8geHN0cmR1cCh2YWx1ZSkgOiBOVUxMKTsKK30KKworLyogc2FtZSBhcyBzZXR2YXJfcyBidXQgc2V0cyBVU0VSIGZsYWcgKi8KK3N0YXRpYyB2YXIgKnNldHZhcl91KHZhciAqdiwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJdiA9IHNldHZhcl9zKHYsIHZhbHVlKTsKKwl2LT50eXBlIHw9IFZGX1VTRVI7CisJcmV0dXJuIHY7Cit9CisKKy8qIHNldCBhcnJheSBlbGVtZW50IHRvIHVzZXIgc3RyaW5nICovCitzdGF0aWMgdm9pZCBzZXRhcmlfdSh2YXIgKmEsIGludCBpZHgsIGNvbnN0IGNoYXIgKnMpCit7CisJdmFyICp2OworCisJdiA9IGZpbmR2YXIoaWFtYXJyYXkoYSksIGl0b2EoaWR4KSk7CisJc2V0dmFyX3Uodiwgcyk7Cit9CisKKy8qIGFzc2lnbiBudW1lcmljIHZhbHVlIHRvIHZhcmlhYmxlICovCitzdGF0aWMgdmFyICpzZXR2YXJfaSh2YXIgKnYsIGRvdWJsZSB2YWx1ZSkKK3sKKwljbHJ2YXIodik7CisJdi0+dHlwZSB8PSBWRl9OVU1CRVI7CisJdi0+bnVtYmVyID0gdmFsdWU7CisJaGFuZGxlX3NwZWNpYWwodik7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXR2YXJfcyh2YXIgKnYpCit7CisJLyogaWYgdiBpcyBudW1lcmljIGFuZCBoYXMgbm8gY2FjaGVkIHN0cmluZywgY29udmVydCBpdCB0byBzdHJpbmcgKi8KKwlpZiAoKHYtPnR5cGUgJiAoVkZfTlVNQkVSIHwgVkZfQ0FDSEVEKSkgPT0gVkZfTlVNQkVSKSB7CisJCWZtdF9udW0oZ19idWYsIE1BWFZBUkZNVCwgZ2V0dmFyX3MoaW50dmFyW0NPTlZGTVRdKSwgdi0+bnVtYmVyLCBUUlVFKTsKKwkJdi0+c3RyaW5nID0geHN0cmR1cChnX2J1Zik7CisJCXYtPnR5cGUgfD0gVkZfQ0FDSEVEOworCX0KKwlyZXR1cm4gKHYtPnN0cmluZyA9PSBOVUxMKSA/ICIiIDogdi0+c3RyaW5nOworfQorCitzdGF0aWMgZG91YmxlIGdldHZhcl9pKHZhciAqdikKK3sKKwljaGFyICpzOworCisJaWYgKCh2LT50eXBlICYgKFZGX05VTUJFUiB8IFZGX0NBQ0hFRCkpID09IDApIHsKKwkJdi0+bnVtYmVyID0gMDsKKwkJcyA9IHYtPnN0cmluZzsKKwkJaWYgKHMgJiYgKnMpIHsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJnZXR2YXJfaTogJyVzJy0+Iiwgcyk7CisJCQl2LT5udW1iZXIgPSBteV9zdHJ0b2QoJnMpOworCQkJZGVidWdfcHJpbnRmX2V2YWwoIiVmIChzOiclcycpXG4iLCB2LT5udW1iZXIsIHMpOworCQkJaWYgKHYtPnR5cGUgJiBWRl9VU0VSKSB7CisJCQkJcyA9IHNraXBfc3BhY2VzKHMpOworCQkJCWlmICgqcyAhPSAnXDAnKQorCQkJCQl2LT50eXBlICY9IH5WRl9VU0VSOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2V2YWwoImdldHZhcl9pOiAnJXMnLT56ZXJvXG4iLCBzKTsKKwkJCXYtPnR5cGUgJj0gflZGX1VTRVI7CisJCX0KKwkJdi0+dHlwZSB8PSBWRl9DQUNIRUQ7CisJfQorCWRlYnVnX3ByaW50Zl9ldmFsKCJnZXR2YXJfaTogJWZcbiIsIHYtPm51bWJlcik7CisJcmV0dXJuIHYtPm51bWJlcjsKK30KKworLyogVXNlZCBmb3Igb3BlcmFuZHMgb2YgYml0d2lzZSBvcHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldHZhcl9pX2ludCh2YXIgKnYpCit7CisJZG91YmxlIGQgPSBnZXR2YXJfaSh2KTsKKworCS8qIENhc3RpbmcgZG91YmxlcyB0byBsb25ncyBpcyB1bmRlZmluZWQgZm9yIHZhbHVlcyBvdXRzaWRlCisJICogb2YgdGFyZ2V0IHR5cGUgcmFuZ2UuIFRyeSB0byB3aWRlbiBpdCBhcyBtdWNoIGFzIHBvc3NpYmxlICovCisJaWYgKGQgPj0gMCkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKWQ7CisJLyogV2h5PyBUaGluayBhYm91dCBkID09IC00Mjk0OTY3Mjk1LjAgKGFzc3VtaW5nIDMyYml0IGxvbmdzKSAqLworCXJldHVybiAtIChsb25nKSAodW5zaWduZWQgbG9uZykgKC1kKTsKK30KKworc3RhdGljIHZhciAqY29weXZhcih2YXIgKmRlc3QsIGNvbnN0IHZhciAqc3JjKQoreworCWlmIChkZXN0ICE9IHNyYykgeworCQljbHJ2YXIoZGVzdCk7CisJCWRlc3QtPnR5cGUgfD0gKHNyYy0+dHlwZSAmIH4oVkZfRE9OVFRPVUNIIHwgVkZfRlNUUikpOworCQlkZWJ1Z19wcmludGZfZXZhbCgiY29weXZhcjogbnVtYmVyOiVmIHN0cmluZzonJXMnXG4iLCBzcmMtPm51bWJlciwgc3JjLT5zdHJpbmcpOworCQlkZXN0LT5udW1iZXIgPSBzcmMtPm51bWJlcjsKKwkJaWYgKHNyYy0+c3RyaW5nKQorCQkJZGVzdC0+c3RyaW5nID0geHN0cmR1cChzcmMtPnN0cmluZyk7CisJfQorCWhhbmRsZV9zcGVjaWFsKGRlc3QpOworCXJldHVybiBkZXN0OworfQorCitzdGF0aWMgdmFyICppbmN2YXIodmFyICp2KQoreworCXJldHVybiBzZXR2YXJfaSh2LCBnZXR2YXJfaSh2KSArIDEuMCk7Cit9CisKKy8qIHJldHVybiB0cnVlIGlmIHYgaXMgbnVtYmVyIG9yIG51bWVyaWMgc3RyaW5nICovCitzdGF0aWMgaW50IGlzX251bWVyaWModmFyICp2KQoreworCWdldHZhcl9pKHYpOworCXJldHVybiAoKHYtPnR5cGUgXiBWRl9ESVJUWSkgJiAoVkZfTlVNQkVSIHwgVkZfVVNFUiB8IFZGX0RJUlRZKSk7Cit9CisKKy8qIHJldHVybiAxIHdoZW4gdmFsdWUgb2YgdiBjb3JyZXNwb25kcyB0byB0cnVlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGludCBpc3RydWUodmFyICp2KQoreworCWlmIChpc19udW1lcmljKHYpKQorCQlyZXR1cm4gKHYtPm51bWJlciAhPSAwKTsKKwlyZXR1cm4gKHYtPnN0cmluZyAmJiB2LT5zdHJpbmdbMF0pOworfQorCisvKiB0ZW1wb3JhcnkgdmFyaWFibGVzIGFsbG9jYXRvci4gTGFzdCBhbGxvY2F0ZWQgc2hvdWxkIGJlIGZpcnN0IGZyZWVkICovCitzdGF0aWMgdmFyICpudmFsbG9jKGludCBuKQoreworCW52YmxvY2sgKnBiID0gTlVMTDsKKwl2YXIgKnYsICpyOworCWludCBzaXplOworCisJd2hpbGUgKGdfY2IpIHsKKwkJcGIgPSBnX2NiOworCQlpZiAoKGdfY2ItPnBvcyAtIGdfY2ItPm52KSArIG4gPD0gZ19jYi0+c2l6ZSkKKwkJCWJyZWFrOworCQlnX2NiID0gZ19jYi0+bmV4dDsKKwl9CisKKwlpZiAoIWdfY2IpIHsKKwkJc2l6ZSA9IChuIDw9IE1JTk5WQkxPQ0spID8gTUlOTlZCTE9DSyA6IG47CisJCWdfY2IgPSB4emFsbG9jKHNpemVvZihudmJsb2NrKSArIHNpemUgKiBzaXplb2YodmFyKSk7CisJCWdfY2ItPnNpemUgPSBzaXplOworCQlnX2NiLT5wb3MgPSBnX2NiLT5udjsKKwkJZ19jYi0+cHJldiA9IHBiOworCQkvKmdfY2ItPm5leHQgPSBOVUxMOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJCWlmIChwYikKKwkJCXBiLT5uZXh0ID0gZ19jYjsKKwl9CisKKwl2ID0gciA9IGdfY2ItPnBvczsKKwlnX2NiLT5wb3MgKz0gbjsKKworCXdoaWxlICh2IDwgZ19jYi0+cG9zKSB7CisJCXYtPnR5cGUgPSAwOworCQl2LT5zdHJpbmcgPSBOVUxMOworCQl2Kys7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG52ZnJlZSh2YXIgKnYpCit7CisJdmFyICpwOworCisJaWYgKHYgPCBnX2NiLT5udiB8fCB2ID49IGdfY2ItPnBvcykKKwkJc3ludGF4X2Vycm9yKEVNU0dfSU5URVJOQUxfRVJST1IpOworCisJZm9yIChwID0gdjsgcCA8IGdfY2ItPnBvczsgcCsrKSB7CisJCWlmICgocC0+dHlwZSAmIChWRl9BUlJBWSB8IFZGX0NISUxEKSkgPT0gVkZfQVJSQVkpIHsKKwkJCWNsZWFyX2FycmF5KGlhbWFycmF5KHApKTsKKwkJCWZyZWUocC0+eC5hcnJheS0+aXRlbXMpOworCQkJZnJlZShwLT54LmFycmF5KTsKKwkJfQorCQlpZiAocC0+dHlwZSAmIFZGX1dBTEspIHsKKwkJCXdhbGtlcl9saXN0ICpuOworCQkJd2Fsa2VyX2xpc3QgKncgPSBwLT54LndhbGtlcjsKKwkJCWRlYnVnX3ByaW50Zl93YWxrZXIoIm52ZnJlZTogZnJlZWluZyB3YWxrZXIgQCVwXG4iLCAmcC0+eC53YWxrZXIpOworCQkJcC0+eC53YWxrZXIgPSBOVUxMOworCQkJd2hpbGUgKHcpIHsKKwkJCQluID0gdy0+cHJldjsKKwkJCQlkZWJ1Z19wcmludGZfd2Fsa2VyKCIgZnJlZSglcClcbiIsIHcpOworCQkJCWZyZWUodyk7CisJCQkJdyA9IG47CisJCQl9CisJCX0KKwkJY2xydmFyKHApOworCX0KKworCWdfY2ItPnBvcyA9IHY7CisJd2hpbGUgKGdfY2ItPnByZXYgJiYgZ19jYi0+cG9zID09IGdfY2ItPm52KSB7CisJCWdfY2IgPSBnX2NiLT5wcmV2OworCX0KK30KKworLyogLS0tLS0tLSBhd2sgcHJvZ3JhbSB0ZXh0IHBhcnNpbmcgLS0tLS0tLSAqLworCisvKiBQYXJzZSBuZXh0IHRva2VuIHBvaW50ZWQgYnkgZ2xvYmFsIHBvcywgcGxhY2UgcmVzdWx0cyBpbnRvIGdsb2JhbCB0dHQuCisgKiBJZiB0b2tlbiBpc24ndCBleHBlY3RlZCwgZ2l2ZSBhd2F5LiBSZXR1cm4gdG9rZW4gY2xhc3MKKyAqLworc3RhdGljIHVpbnQzMl90IG5leHRfdG9rZW4odWludDMyX3QgZXhwZWN0ZWQpCit7CisjZGVmaW5lIGNvbmNhdF9pbnNlcnRlZCAoRy5uZXh0X3Rva2VuX19jb25jYXRfaW5zZXJ0ZWQpCisjZGVmaW5lIHNhdmVfdGNsYXNzICAgICAoRy5uZXh0X3Rva2VuX19zYXZlX3RjbGFzcykKKyNkZWZpbmUgc2F2ZV9pbmZvICAgICAgIChHLm5leHRfdG9rZW5fX3NhdmVfaW5mbykKKy8qIEluaXRpYWxpemVkIHRvIFRDX09QVEVSTTogKi8KKyNkZWZpbmUgbHRjbGFzcyAgICAgICAgIChHLm5leHRfdG9rZW5fX2x0Y2xhc3MpCisKKwljaGFyICpwLCAqczsKKwljb25zdCBjaGFyICp0bDsKKwl1aW50MzJfdCB0YzsKKwljb25zdCB1aW50MzJfdCAqdGk7CisKKwlpZiAodF9yb2xsYmFjaykgeworCQl0X3JvbGxiYWNrID0gRkFMU0U7CisKKwl9IGVsc2UgaWYgKGNvbmNhdF9pbnNlcnRlZCkgeworCQljb25jYXRfaW5zZXJ0ZWQgPSBGQUxTRTsKKwkJdF90Y2xhc3MgPSBzYXZlX3RjbGFzczsKKwkJdF9pbmZvID0gc2F2ZV9pbmZvOworCisJfSBlbHNlIHsKKwkJcCA9IGdfcG9zOworIHJlYWRuZXh0OgorCQlwID0gc2tpcF9zcGFjZXMocCk7CisJCWdfbGluZW5vID0gdF9saW5lbm87CisJCWlmICgqcCA9PSAnIycpCisJCQl3aGlsZSAoKnAgIT0gJ1xuJyAmJiAqcCAhPSAnXDAnKQorCQkJCXArKzsKKworCQlpZiAoKnAgPT0gJ1xuJykKKwkJCXRfbGluZW5vKys7CisKKwkJaWYgKCpwID09ICdcMCcpIHsKKwkJCXRjID0gVENfRU9GOworCisJCX0gZWxzZSBpZiAoKnAgPT0gJ1wiJykgeworCQkJLyogaXQncyBhIHN0cmluZyAqLworCQkJdF9zdHJpbmcgPSBzID0gKytwOworCQkJd2hpbGUgKCpwICE9ICdcIicpIHsKKwkJCQljaGFyICpwcDsKKwkJCQlpZiAoKnAgPT0gJ1wwJyB8fCAqcCA9PSAnXG4nKQorCQkJCQlzeW50YXhfZXJyb3IoRU1TR19VTkVYUF9FT1MpOworCQkJCXBwID0gcDsKKwkJCQkqcysrID0gbmV4dGNoYXIoJnBwKTsKKwkJCQlwID0gcHA7CisJCQl9CisJCQlwKys7CisJCQkqcyA9ICdcMCc7CisJCQl0YyA9IFRDX1NUUklORzsKKworCQl9IGVsc2UgaWYgKChleHBlY3RlZCAmIFRDX1JFR0VYUCkgJiYgKnAgPT0gJy8nKSB7CisJCQkvKiBpdCdzIHJlZ2V4cCAqLworCQkJdF9zdHJpbmcgPSBzID0gKytwOworCQkJd2hpbGUgKCpwICE9ICcvJykgeworCQkJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICdcbicpCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX1VORVhQX0VPUyk7CisJCQkJKnMgPSAqcCsrOworCQkJCWlmICgqcysrID09ICdcXCcpIHsKKwkJCQkJY2hhciAqcHAgPSBwOworCQkJCQlzWy0xXSA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKChjb25zdCBjaGFyICoqKSZwcCk7CisJCQkJCWlmICgqcCA9PSAnXFwnKQorCQkJCQkJKnMrKyA9ICdcXCc7CisJCQkJCWlmIChwcCA9PSBwKQorCQkJCQkJKnMrKyA9ICpwKys7CisJCQkJCWVsc2UKKwkJCQkJCXAgPSBwcDsKKwkJCQl9CisJCQl9CisJCQlwKys7CisJCQkqcyA9ICdcMCc7CisJCQl0YyA9IFRDX1JFR0VYUDsKKworCQl9IGVsc2UgaWYgKCpwID09ICcuJyB8fCBpc2RpZ2l0KCpwKSkgeworCQkJLyogaXQncyBhIG51bWJlciAqLworCQkJY2hhciAqcHAgPSBwOworCQkJdF9kb3VibGUgPSBteV9zdHJ0b2QoJnBwKTsKKwkJCXAgPSBwcDsKKwkJCWlmICgqcCA9PSAnLicpCisJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5FWFBfVE9LRU4pOworCQkJdGMgPSBUQ19OVU1CRVI7CisKKwkJfSBlbHNlIHsKKwkJCS8qIHNlYXJjaCBmb3Igc29tZXRoaW5nIGtub3duICovCisJCQl0bCA9IHRva2VubGlzdDsKKwkJCXRjID0gMHgwMDAwMDAwMTsKKwkJCXRpID0gdG9rZW5pbmZvOworCQkJd2hpbGUgKCp0bCkgeworCQkJCWludCBsID0gKHVuc2lnbmVkIGNoYXIpICp0bCsrOworCQkJCWlmIChsID09ICh1bnNpZ25lZCBjaGFyKSBOVENDKSB7CisJCQkJCXRjIDw8PSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogaWYgdG9rZW4gY2xhc3MgaXMgZXhwZWN0ZWQsCisJCQkJICogdG9rZW4gbWF0Y2hlcywKKwkJCQkgKiBhbmQgaXQncyBub3QgYSBsb25nZXIgd29yZCwKKwkJCQkgKi8KKwkJCQlpZiAoKHRjICYgKGV4cGVjdGVkIHwgVENfV09SRCB8IFRDX05FV0xJTkUpKQorCQkJCSAmJiBzdHJuY21wKHAsIHRsLCBsKSA9PSAwCisJCQkJICYmICEoKHRjICYgVENfV09SRCkgJiYgaXNhbG51bV8ocFtsXSkpCisJCQkJKSB7CisJCQkJCS8qIHRoZW4gdGhpcyBpcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvciAqLworCQkJCQl0X2luZm8gPSAqdGk7CisJCQkJCXAgKz0gbDsKKwkJCQkJZ290byB0b2tlbl9mb3VuZDsKKwkJCQl9CisJCQkJdGkrKzsKKwkJCQl0bCArPSBsOworCQkJfQorCQkJLyogbm90IGEga25vd24gdG9rZW4gKi8KKworCQkJLyogaXMgaXQgYSBuYW1lPyAodmFyL2FycmF5L2Z1bmN0aW9uKSAqLworCQkJaWYgKCFpc2FsbnVtXygqcCkpCisJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5FWFBfVE9LRU4pOyAvKiBubyAqLworCQkJLyogeWVzICovCisJCQl0X3N0cmluZyA9IC0tcDsKKwkJCXdoaWxlIChpc2FsbnVtXygqKytwKSkgeworCQkJCXBbLTFdID0gKnA7CisJCQl9CisJCQlwWy0xXSA9ICdcMCc7CisJCQl0YyA9IFRDX1ZBUklBQkxFOworCQkJLyogYWxzbyBjb25zdW1lIHdoaXRlc3BhY2UgYmV0d2VlbiBmdW5jdGlvbm5hbWUgYW5kIGJyYWNrZXQgKi8KKwkJCWlmICghKGV4cGVjdGVkICYgVENfVkFSSUFCTEUpIHx8IChleHBlY3RlZCAmIFRDX0FSUkFZKSkKKwkJCQlwID0gc2tpcF9zcGFjZXMocCk7CisJCQlpZiAoKnAgPT0gJygnKSB7CisJCQkJdGMgPSBUQ19GVU5DVElPTjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCpwID09ICdbJykgeworCQkJCQlwKys7CisJCQkJCXRjID0gVENfQVJSQVk7CisJCQkJfQorCQkJfQorIHRva2VuX2ZvdW5kOiA7CisJCX0KKwkJZ19wb3MgPSBwOworCisJCS8qIHNraXBwaW5nIG5ld2xpbmVzIGluIHNvbWUgY2FzZXMgKi8KKwkJaWYgKChsdGNsYXNzICYgVENfTk9URVJNKSAmJiAodGMgJiBUQ19ORVdMSU5FKSkKKwkJCWdvdG8gcmVhZG5leHQ7CisKKwkJLyogaW5zZXJ0IGNvbmNhdGVuYXRpb24gb3BlcmF0b3Igd2hlbiBuZWVkZWQgKi8KKwkJaWYgKChsdGNsYXNzICYgVENfQ09OQ0FUMSkgJiYgKHRjICYgVENfQ09OQ0FUMikgJiYgKGV4cGVjdGVkICYgVENfQklOT1ApKSB7CisJCQljb25jYXRfaW5zZXJ0ZWQgPSBUUlVFOworCQkJc2F2ZV90Y2xhc3MgPSB0YzsKKwkJCXNhdmVfaW5mbyA9IHRfaW5mbzsKKwkJCXRjID0gVENfQklOT1A7CisJCQl0X2luZm8gPSBPQ19DT05DQVQgfCBTUyB8IFAoMzUpOworCQl9CisKKwkJdF90Y2xhc3MgPSB0YzsKKwl9CisJbHRjbGFzcyA9IHRfdGNsYXNzOworCisJLyogQXJlIHdlIHJlYWR5IGZvciB0aGlzPyAqLworCWlmICghKGx0Y2xhc3MgJiBleHBlY3RlZCkpCisJCXN5bnRheF9lcnJvcigobHRjbGFzcyAmIChUQ19ORVdMSU5FIHwgVENfRU9GKSkgPworCQkJCUVNU0dfVU5FWFBfRU9TIDogRU1TR19VTkVYUF9UT0tFTik7CisKKwlyZXR1cm4gbHRjbGFzczsKKyN1bmRlZiBjb25jYXRfaW5zZXJ0ZWQKKyN1bmRlZiBzYXZlX3RjbGFzcworI3VuZGVmIHNhdmVfaW5mbworI3VuZGVmIGx0Y2xhc3MKK30KKworc3RhdGljIHZvaWQgcm9sbGJhY2tfdG9rZW4odm9pZCkKK3sKKwl0X3JvbGxiYWNrID0gVFJVRTsKK30KKworc3RhdGljIG5vZGUgKm5ld19ub2RlKHVpbnQzMl90IGluZm8pCit7CisJbm9kZSAqbjsKKworCW4gPSB4emFsbG9jKHNpemVvZihub2RlKSk7CisJbi0+aW5mbyA9IGluZm87CisJbi0+bGluZW5vID0gZ19saW5lbm87CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIG1rX3JlX25vZGUoY29uc3QgY2hhciAqcywgbm9kZSAqbiwgcmVnZXhfdCAqcmUpCit7CisJbi0+aW5mbyA9IE9DX1JFR0VYUDsKKwluLT5sLnJlID0gcmU7CisJbi0+ci5pcmUgPSByZSArIDE7CisJeHJlZ2NvbXAocmUsIHMsIFJFR19FWFRFTkRFRCk7CisJeHJlZ2NvbXAocmUgKyAxLCBzLCBSRUdfRVhURU5ERUQgfCBSRUdfSUNBU0UpOworfQorCitzdGF0aWMgbm9kZSAqY29uZGl0aW9uKHZvaWQpCit7CisJbmV4dF90b2tlbihUQ19TRVFTVEFSVCk7CisJcmV0dXJuIHBhcnNlX2V4cHIoVENfU0VRVEVSTSk7Cit9CisKKy8qIHBhcnNlIGV4cHJlc3Npb24gdGVybWluYXRlZCBieSBnaXZlbiBhcmd1bWVudCwgcmV0dXJuIHB0cgorICogdG8gYnVpbHQgc3VidHJlZS4gVGVybWluYXRvciBpcyBlYXRlbiBieSBwYXJzZV9leHByICovCitzdGF0aWMgbm9kZSAqcGFyc2VfZXhwcih1aW50MzJfdCBpZXhwKQoreworCW5vZGUgc247CisJbm9kZSAqY24gPSAmc247CisJbm9kZSAqdm4sICpnbHB0cjsKKwl1aW50MzJfdCB0YywgeHRjOworCXZhciAqdjsKKworCXNuLmluZm8gPSBQUklNQVNLOworCXNuLnIubiA9IGdscHRyID0gTlVMTDsKKwl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfUkVHRVhQIHwgaWV4cDsKKworCXdoaWxlICghKCh0YyA9IG5leHRfdG9rZW4oeHRjKSkgJiBpZXhwKSkgeworCisJCWlmIChnbHB0ciAmJiAodF9pbmZvID09IChPQ19DT01QQVJFIHwgVlYgfCBQKDM5KSB8IDIpKSkgeworCQkJLyogaW5wdXQgcmVkaXJlY3Rpb24gKDwpIGF0dGFjaGVkIHRvIGdscHRyIG5vZGUgKi8KKwkJCWNuID0gZ2xwdHItPmwubiA9IG5ld19ub2RlKE9DX0NPTkNBVCB8IFNTIHwgUCgzNykpOworCQkJY24tPmEubiA9IGdscHRyOworCQkJeHRjID0gVENfT1BFUkFORCB8IFRDX1VPUFBSRTsKKwkJCWdscHRyID0gTlVMTDsKKworCQl9IGVsc2UgaWYgKHRjICYgKFRDX0JJTk9QIHwgVENfVU9QUE9TVCkpIHsKKwkJCS8qIGZvciBiaW5hcnkgYW5kIHBvc3RmaXgtdW5hcnkgb3BlcmF0b3JzLCBqdW1wIGJhY2sgb3ZlcgorCQkJICogcHJldmlvdXMgb3BlcmF0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5ICovCisJCQl2biA9IGNuOworCQkJd2hpbGUgKCgodF9pbmZvICYgUFJJTUFTSykgPiAodm4tPmEubi0+aW5mbyAmIFBSSU1BU0syKSkKKwkJCSAgICB8fCAoKHRfaW5mbyA9PSB2bi0+aW5mbykgJiYgKCh0X2luZm8gJiBPUENMU01BU0spID09IE9DX0NPTE9OKSkKKwkJCSkgeworCQkJCXZuID0gdm4tPmEubjsKKwkJCX0KKwkJCWlmICgodF9pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19URVJOQVJZKQorCQkJCXRfaW5mbyArPSBQKDYpOworCQkJY24gPSB2bi0+YS5uLT5yLm4gPSBuZXdfbm9kZSh0X2luZm8pOworCQkJY24tPmEubiA9IHZuLT5hLm47CisJCQlpZiAodGMgJiBUQ19CSU5PUCkgeworCQkJCWNuLT5sLm4gPSB2bjsKKwkJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfUkVHRVhQOworCQkJCWlmICgodF9pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19QR0VUTElORSkgeworCQkJCQkvKiBpdCdzIGEgcGlwZSAqLworCQkJCQluZXh0X3Rva2VuKFRDX0dFVExJTkUpOworCQkJCQkvKiBnaXZlIG1heGltdW0gcHJpb3JpdHkgdG8gdGhpcyBwaXBlICovCisJCQkJCWNuLT5pbmZvICY9IH5QUklNQVNLOworCQkJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfQklOT1AgfCBpZXhwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY24tPnIubiA9IHZuOworCQkJCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19CSU5PUCB8IGlleHA7CisJCQl9CisJCQl2bi0+YS5uID0gY247CisKKwkJfSBlbHNlIHsKKwkJCS8qIGZvciBvcGVyYW5kcyBhbmQgcHJlZml4LXVuYXJ5IG9wZXJhdG9ycywgYXR0YWNoIHRoZW0KKwkJCSAqIHRvIGxhc3Qgbm9kZSAqLworCQkJdm4gPSBjbjsKKwkJCWNuID0gdm4tPnIubiA9IG5ld19ub2RlKHRfaW5mbyk7CisJCQljbi0+YS5uID0gdm47CisJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfUkVHRVhQOworCQkJaWYgKHRjICYgKFRDX09QRVJBTkQgfCBUQ19SRUdFWFApKSB7CisJCQkJeHRjID0gVENfVU9QUFJFIHwgVENfVU9QUE9TVCB8IFRDX0JJTk9QIHwgVENfT1BFUkFORCB8IGlleHA7CisJCQkJLyogb25lIHNob3VsZCBiZSB2ZXJ5IGNhcmVmdWwgd2l0aCBzd2l0Y2ggb24gdGNsYXNzIC0KKwkJCQkgKiBvbmx5IHNpbXBsZSB0Y2xhc3NlcyBzaG91bGQgYmUgdXNlZCEgKi8KKwkJCQlzd2l0Y2ggKHRjKSB7CisJCQkJY2FzZSBUQ19WQVJJQUJMRToKKwkJCQljYXNlIFRDX0FSUkFZOgorCQkJCQljbi0+aW5mbyA9IE9DX1ZBUjsKKwkJCQkJdiA9IGhhc2hfc2VhcmNoKGFoYXNoLCB0X3N0cmluZyk7CisJCQkJCWlmICh2ICE9IE5VTEwpIHsKKwkJCQkJCWNuLT5pbmZvID0gT0NfRk5BUkc7CisJCQkJCQljbi0+bC5haWR4ID0gdi0+eC5haWR4OworCQkJCQl9IGVsc2UgeworCQkJCQkJY24tPmwudiA9IG5ld3Zhcih0X3N0cmluZyk7CisJCQkJCX0KKwkJCQkJaWYgKHRjICYgVENfQVJSQVkpIHsKKwkJCQkJCWNuLT5pbmZvIHw9IHhTOworCQkJCQkJY24tPnIubiA9IHBhcnNlX2V4cHIoVENfQVJSVEVSTSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFRDX05VTUJFUjoKKwkJCQljYXNlIFRDX1NUUklORzoKKwkJCQkJY24tPmluZm8gPSBPQ19WQVI7CisJCQkJCXYgPSBjbi0+bC52ID0geHphbGxvYyhzaXplb2YodmFyKSk7CisJCQkJCWlmICh0YyAmIFRDX05VTUJFUikKKwkJCQkJCXNldHZhcl9pKHYsIHRfZG91YmxlKTsKKwkJCQkJZWxzZQorCQkJCQkJc2V0dmFyX3ModiwgdF9zdHJpbmcpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfUkVHRVhQOgorCQkJCQlta19yZV9ub2RlKHRfc3RyaW5nLCBjbiwgeHphbGxvYyhzaXplb2YocmVnZXhfdCkqMikpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfRlVOQ1RJT046CisJCQkJCWNuLT5pbmZvID0gT0NfRlVOQzsKKwkJCQkJY24tPnIuZiA9IG5ld2Z1bmModF9zdHJpbmcpOworCQkJCQljbi0+bC5uID0gY29uZGl0aW9uKCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19TRVFTVEFSVDoKKwkJCQkJY24gPSB2bi0+ci5uID0gcGFyc2VfZXhwcihUQ19TRVFURVJNKTsKKwkJCQkJY24tPmEubiA9IHZuOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfR0VUTElORToKKwkJCQkJZ2xwdHIgPSBjbjsKKwkJCQkJeHRjID0gVENfT1BFUkFORCB8IFRDX1VPUFBSRSB8IFRDX0JJTk9QIHwgaWV4cDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFRDX0JVSUxUSU46CisJCQkJCWNuLT5sLm4gPSBjb25kaXRpb24oKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBzbi5yLm47Cit9CisKKy8qIGFkZCBub2RlIHRvIGNoYWluLiBSZXR1cm4gcHRyIHRvIGFsbG9jJ2Qgbm9kZSAqLworc3RhdGljIG5vZGUgKmNoYWluX25vZGUodWludDMyX3QgaW5mbykKK3sKKwlub2RlICpuOworCisJaWYgKCFzZXEtPmZpcnN0KQorCQlzZXEtPmZpcnN0ID0gc2VxLT5sYXN0ID0gbmV3X25vZGUoMCk7CisKKwlpZiAoc2VxLT5wcm9ncmFtbmFtZSAhPSBnX3Byb2duYW1lKSB7CisJCXNlcS0+cHJvZ3JhbW5hbWUgPSBnX3Byb2duYW1lOworCQluID0gY2hhaW5fbm9kZShPQ19ORVdTT1VSQ0UpOworCQluLT5sLm5ld19wcm9nbmFtZSA9IHhzdHJkdXAoZ19wcm9nbmFtZSk7CisJfQorCisJbiA9IHNlcS0+bGFzdDsKKwluLT5pbmZvID0gaW5mbzsKKwlzZXEtPmxhc3QgPSBuLT5hLm4gPSBuZXdfbm9kZShPQ19ET05FKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBjaGFpbl9leHByKHVpbnQzMl90IGluZm8pCit7CisJbm9kZSAqbjsKKworCW4gPSBjaGFpbl9ub2RlKGluZm8pOworCW4tPmwubiA9IHBhcnNlX2V4cHIoVENfT1BURVJNIHwgVENfR1JQVEVSTSk7CisJaWYgKHRfdGNsYXNzICYgVENfR1JQVEVSTSkKKwkJcm9sbGJhY2tfdG9rZW4oKTsKK30KKworc3RhdGljIG5vZGUgKmNoYWluX2xvb3Aobm9kZSAqbm4pCit7CisJbm9kZSAqbiwgKm4yLCAqc2F2ZV9icmssICpzYXZlX2NvbnQ7CisKKwlzYXZlX2JyayA9IGJyZWFrX3B0cjsKKwlzYXZlX2NvbnQgPSBjb250aW51ZV9wdHI7CisKKwluID0gY2hhaW5fbm9kZShPQ19CUiB8IFZ4KTsKKwljb250aW51ZV9wdHIgPSBuZXdfbm9kZShPQ19FWEVDKTsKKwlicmVha19wdHIgPSBuZXdfbm9kZShPQ19FWEVDKTsKKwljaGFpbl9ncm91cCgpOworCW4yID0gY2hhaW5fbm9kZShPQ19FWEVDIHwgVngpOworCW4yLT5sLm4gPSBubjsKKwluMi0+YS5uID0gbjsKKwljb250aW51ZV9wdHItPmEubiA9IG4yOworCWJyZWFrX3B0ci0+YS5uID0gbi0+ci5uID0gc2VxLT5sYXN0OworCisJY29udGludWVfcHRyID0gc2F2ZV9jb250OworCWJyZWFrX3B0ciA9IHNhdmVfYnJrOworCisJcmV0dXJuIG47Cit9CisKKy8qIHBhcnNlIGdyb3VwIGFuZCBhdHRhY2ggaXQgdG8gY2hhaW4gKi8KK3N0YXRpYyB2b2lkIGNoYWluX2dyb3VwKHZvaWQpCit7CisJdWludDMyX3QgYzsKKwlub2RlICpuLCAqbjIsICpuMzsKKworCWRvIHsKKwkJYyA9IG5leHRfdG9rZW4oVENfR1JQU0VRKTsKKwl9IHdoaWxlIChjICYgVENfTkVXTElORSk7CisKKwlpZiAoYyAmIFRDX0dSUFNUQVJUKSB7CisJCXdoaWxlIChuZXh0X3Rva2VuKFRDX0dSUFNFUSB8IFRDX0dSUFRFUk0pICE9IFRDX0dSUFRFUk0pIHsKKwkJCWlmICh0X3RjbGFzcyAmIFRDX05FV0xJTkUpCisJCQkJY29udGludWU7CisJCQlyb2xsYmFja190b2tlbigpOworCQkJY2hhaW5fZ3JvdXAoKTsKKwkJfQorCX0gZWxzZSBpZiAoYyAmIChUQ19PUFNFUSB8IFRDX09QVEVSTSkpIHsKKwkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJY2hhaW5fZXhwcihPQ19FWEVDIHwgVngpOworCX0gZWxzZSB7CQkJCQkJLyogVENfU1RBVEVNTlQgKi8KKwkJc3dpdGNoICh0X2luZm8gJiBPUENMU01BU0spIHsKKwkJY2FzZSBTVF9JRjoKKwkJCW4gPSBjaGFpbl9ub2RlKE9DX0JSIHwgVngpOworCQkJbi0+bC5uID0gY29uZGl0aW9uKCk7CisJCQljaGFpbl9ncm91cCgpOworCQkJbjIgPSBjaGFpbl9ub2RlKE9DX0VYRUMpOworCQkJbi0+ci5uID0gc2VxLT5sYXN0OworCQkJaWYgKG5leHRfdG9rZW4oVENfR1JQU0VRIHwgVENfR1JQVEVSTSB8IFRDX0VMU0UpID09IFRDX0VMU0UpIHsKKwkJCQljaGFpbl9ncm91cCgpOworCQkJCW4yLT5hLm4gPSBzZXEtPmxhc3Q7CisJCQl9IGVsc2UgeworCQkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUX1dISUxFOgorCQkJbjIgPSBjb25kaXRpb24oKTsKKwkJCW4gPSBjaGFpbl9sb29wKE5VTEwpOworCQkJbi0+bC5uID0gbjI7CisJCQlicmVhazsKKworCQljYXNlIFNUX0RPOgorCQkJbjIgPSBjaGFpbl9ub2RlKE9DX0VYRUMpOworCQkJbiA9IGNoYWluX2xvb3AoTlVMTCk7CisJCQluMi0+YS5uID0gbi0+YS5uOworCQkJbmV4dF90b2tlbihUQ19XSElMRSk7CisJCQluLT5sLm4gPSBjb25kaXRpb24oKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RfRk9SOgorCQkJbmV4dF90b2tlbihUQ19TRVFTVEFSVCk7CisJCQluMiA9IHBhcnNlX2V4cHIoVENfU0VNSUNPTCB8IFRDX1NFUVRFUk0pOworCQkJaWYgKHRfdGNsYXNzICYgVENfU0VRVEVSTSkgewkvKiBmb3ItaW4gKi8KKwkJCQlpZiAoKG4yLT5pbmZvICYgT1BDTFNNQVNLKSAhPSBPQ19JTikKKwkJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5FWFBfVE9LRU4pOworCQkJCW4gPSBjaGFpbl9ub2RlKE9DX1dBTEtJTklUIHwgVlYpOworCQkJCW4tPmwubiA9IG4yLT5sLm47CisJCQkJbi0+ci5uID0gbjItPnIubjsKKwkJCQluID0gY2hhaW5fbG9vcChOVUxMKTsKKwkJCQluLT5pbmZvID0gT0NfV0FMS05FWFQgfCBWeDsKKwkJCQluLT5sLm4gPSBuMi0+bC5uOworCQkJfSBlbHNlIHsJCQkvKiBmb3IgKDs7KSAqLworCQkJCW4gPSBjaGFpbl9ub2RlKE9DX0VYRUMgfCBWeCk7CisJCQkJbi0+bC5uID0gbjI7CisJCQkJbjIgPSBwYXJzZV9leHByKFRDX1NFTUlDT0wpOworCQkJCW4zID0gcGFyc2VfZXhwcihUQ19TRVFURVJNKTsKKwkJCQluID0gY2hhaW5fbG9vcChuMyk7CisJCQkJbi0+bC5uID0gbjI7CisJCQkJaWYgKCFuMikKKwkJCQkJbi0+aW5mbyA9IE9DX0VYRUM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9DX1BSSU5UOgorCQljYXNlIE9DX1BSSU5URjoKKwkJCW4gPSBjaGFpbl9ub2RlKHRfaW5mbyk7CisJCQluLT5sLm4gPSBwYXJzZV9leHByKFRDX09QVEVSTSB8IFRDX09VVFJEUiB8IFRDX0dSUFRFUk0pOworCQkJaWYgKHRfdGNsYXNzICYgVENfT1VUUkRSKSB7CisJCQkJbi0+aW5mbyB8PSB0X2luZm87CisJCQkJbi0+ci5uID0gcGFyc2VfZXhwcihUQ19PUFRFUk0gfCBUQ19HUlBURVJNKTsKKwkJCX0KKwkJCWlmICh0X3RjbGFzcyAmIFRDX0dSUFRFUk0pCisJCQkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0NfQlJFQUs6CisJCQluID0gY2hhaW5fbm9kZShPQ19FWEVDKTsKKwkJCW4tPmEubiA9IGJyZWFrX3B0cjsKKwkJCWJyZWFrOworCisJCWNhc2UgT0NfQ09OVElOVUU6CisJCQluID0gY2hhaW5fbm9kZShPQ19FWEVDKTsKKwkJCW4tPmEubiA9IGNvbnRpbnVlX3B0cjsKKwkJCWJyZWFrOworCisJCS8qIGRlbGV0ZSwgbmV4dCwgbmV4dGZpbGUsIHJldHVybiwgZXhpdCAqLworCQlkZWZhdWx0OgorCQkJY2hhaW5fZXhwcih0X2luZm8pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9wcm9ncmFtKGNoYXIgKnApCit7CisJdWludDMyX3QgdGNsYXNzOworCW5vZGUgKmNuOworCWZ1bmMgKmY7CisJdmFyICp2OworCisJZ19wb3MgPSBwOworCXRfbGluZW5vID0gMTsKKwl3aGlsZSAoKHRjbGFzcyA9IG5leHRfdG9rZW4oVENfRU9GIHwgVENfT1BTRVEgfCBUQ19HUlBTVEFSVCB8CisJCQlUQ19PUFRFUk0gfCBUQ19CRUdJTiB8IFRDX0VORCB8IFRDX0ZVTkNERUNMKSkgIT0gVENfRU9GKSB7CisKKwkJaWYgKHRjbGFzcyAmIFRDX09QVEVSTSkKKwkJCWNvbnRpbnVlOworCisJCXNlcSA9ICZtYWluc2VxOworCQlpZiAodGNsYXNzICYgVENfQkVHSU4pIHsKKwkJCXNlcSA9ICZiZWdpbnNlcTsKKwkJCWNoYWluX2dyb3VwKCk7CisKKwkJfSBlbHNlIGlmICh0Y2xhc3MgJiBUQ19FTkQpIHsKKwkJCXNlcSA9ICZlbmRzZXE7CisJCQljaGFpbl9ncm91cCgpOworCisJCX0gZWxzZSBpZiAodGNsYXNzICYgVENfRlVOQ0RFQ0wpIHsKKwkJCW5leHRfdG9rZW4oVENfRlVOQ1RJT04pOworCQkJZ19wb3MrKzsKKwkJCWYgPSBuZXdmdW5jKHRfc3RyaW5nKTsKKwkJCWYtPmJvZHkuZmlyc3QgPSBOVUxMOworCQkJZi0+bmFyZ3MgPSAwOworCQkJd2hpbGUgKG5leHRfdG9rZW4oVENfVkFSSUFCTEUgfCBUQ19TRVFURVJNKSAmIFRDX1ZBUklBQkxFKSB7CisJCQkJdiA9IGZpbmR2YXIoYWhhc2gsIHRfc3RyaW5nKTsKKwkJCQl2LT54LmFpZHggPSBmLT5uYXJncysrOworCisJCQkJaWYgKG5leHRfdG9rZW4oVENfQ09NTUEgfCBUQ19TRVFURVJNKSAmIFRDX1NFUVRFUk0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJc2VxID0gJmYtPmJvZHk7CisJCQljaGFpbl9ncm91cCgpOworCQkJY2xlYXJfYXJyYXkoYWhhc2gpOworCisJCX0gZWxzZSBpZiAodGNsYXNzICYgVENfT1BTRVEpIHsKKwkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQljbiA9IGNoYWluX25vZGUoT0NfVEVTVCk7CisJCQljbi0+bC5uID0gcGFyc2VfZXhwcihUQ19PUFRFUk0gfCBUQ19FT0YgfCBUQ19HUlBTVEFSVCk7CisJCQlpZiAodF90Y2xhc3MgJiBUQ19HUlBTVEFSVCkgeworCQkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQkJY2hhaW5fZ3JvdXAoKTsKKwkJCX0gZWxzZSB7CisJCQkJY2hhaW5fbm9kZShPQ19QUklOVCk7CisJCQl9CisJCQljbi0+ci5uID0gbWFpbnNlcS5sYXN0OworCisJCX0gZWxzZSAvKiBpZiAodGNsYXNzICYgVENfR1JQU1RBUlQpICovIHsKKwkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQljaGFpbl9ncm91cCgpOworCQl9CisJfQorfQorCisKKy8qIC0tLS0tLS0tIHByb2dyYW0gZXhlY3V0aW9uIHBhcnQgLS0tLS0tLS0gKi8KKworc3RhdGljIG5vZGUgKm1rX3NwbGl0dGVyKGNvbnN0IGNoYXIgKnMsIHRzcGxpdHRlciAqc3BsKQoreworCXJlZ2V4X3QgKnJlLCAqaXJlOworCW5vZGUgKm47CisKKwlyZSA9ICZzcGwtPnJlWzBdOworCWlyZSA9ICZzcGwtPnJlWzFdOworCW4gPSAmc3BsLT5uOworCWlmICgobi0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfUkVHRVhQKSB7CisJCXJlZ2ZyZWUocmUpOworCQlyZWdmcmVlKGlyZSk7IC8vIFRPRE86IG51a2UgaXJlLCB1c2UgcmUrMT8KKwl9CisJaWYgKHNbMF0gJiYgc1sxXSkgeyAvKiBzdHJsZW4ocykgPiAxICovCisJCW1rX3JlX25vZGUocywgbiwgcmUpOworCX0gZWxzZSB7CisJCW4tPmluZm8gPSAodWludDMyX3QpIHNbMF07CisJfQorCisJcmV0dXJuIG47Cit9CisKKy8qIHVzZSBub2RlIGFzIGEgcmVndWxhciBleHByZXNzaW9uLiBTdXBwbGllZCB3aXRoIG5vZGUgcHRyIGFuZCByZWdleF90CisgKiBzdG9yYWdlIHNwYWNlLiBSZXR1cm4gcHRyIHRvIHJlZ2V4IChpZiByZXN1bHQgcG9pbnRzIHRvIHByZWcsIGl0IHNob3VsZAorICogYmUgbGF0ZXIgcmVnZnJlZSdkIG1hbnVhbGx5CisgKi8KK3N0YXRpYyByZWdleF90ICphc19yZWdleChub2RlICpvcCwgcmVnZXhfdCAqcHJlZykKK3sKKwlpbnQgY2ZsYWdzOworCXZhciAqdjsKKwljb25zdCBjaGFyICpzOworCisJaWYgKChvcC0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfUkVHRVhQKSB7CisJCXJldHVybiBpY2FzZSA/IG9wLT5yLmlyZSA6IG9wLT5sLnJlOworCX0KKwl2ID0gbnZhbGxvYygxKTsKKwlzID0gZ2V0dmFyX3MoZXZhbHVhdGUob3AsIHYpKTsKKworCWNmbGFncyA9IGljYXNlID8gUkVHX0VYVEVOREVEIHwgUkVHX0lDQVNFIDogUkVHX0VYVEVOREVEOworCS8qIFRlc3RjYXNlIHdoZXJlIFJFR19FWFRFTkRFRCBmYWlscyAodW5wYWlyZWQgJ3snKToKKwkgKiBlY2hvIEhpIHwgYXdrICdnc3ViKCJAKHNhbXB8Y29kZXxmaWxlKVx7IiwiIik7JworCSAqIGdhd2sgMy4xLjUgZWF0cyB0aGlzLiBXZSByZXZlcnQgdG8gflJFR19FWFRFTkRFRAorCSAqIChtYXliZSBnc3ViIGlzIG5vdCBzdXBwb3NlZCB0byB1c2UgUkVHX0VYVEVOREVEPykuCisJICovCisJaWYgKHJlZ2NvbXAocHJlZywgcywgY2ZsYWdzKSkgeworCQljZmxhZ3MgJj0gflJFR19FWFRFTkRFRDsKKwkJeHJlZ2NvbXAocHJlZywgcywgY2ZsYWdzKTsKKwl9CisJbnZmcmVlKHYpOworCXJldHVybiBwcmVnOworfQorCisvKiBncmFkdWFsbHkgaW5jcmVhc2luZyBidWZmZXIuCisgKiBub3RlIHRoYXQgd2UgcmVhbGxvY2F0ZSBldmVuIGlmIG4gPT0gb2xkX3NpemUsCisgKiBhbmQgdGh1cyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZXh0cmEgYWxsb2NhdGVkIGJ5dGUuCisgKi8KK3N0YXRpYyBjaGFyKiBxcmVhbGxvYyhjaGFyICpiLCBpbnQgbiwgaW50ICpzaXplKQoreworCWlmICghYiB8fCBuID49ICpzaXplKSB7CisJCSpzaXplID0gbiArIChuPj4xKSArIDgwOworCQliID0geHJlYWxsb2MoYiwgKnNpemUpOworCX0KKwlyZXR1cm4gYjsKK30KKworLyogcmVzaXplIGZpZWxkIHN0b3JhZ2Ugc3BhY2UgKi8KK3N0YXRpYyB2b2lkIGZzcmVhbGxvYyhpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWlmIChzaXplID49IG1heGZpZWxkcykgeworCQlpID0gbWF4ZmllbGRzOworCQltYXhmaWVsZHMgPSBzaXplICsgMTY7CisJCUZpZWxkcyA9IHhyZWFsbG9jKEZpZWxkcywgbWF4ZmllbGRzICogc2l6ZW9mKEZpZWxkc1swXSkpOworCQlmb3IgKDsgaSA8IG1heGZpZWxkczsgaSsrKSB7CisJCQlGaWVsZHNbaV0udHlwZSA9IFZGX1NQRUNJQUw7CisJCQlGaWVsZHNbaV0uc3RyaW5nID0gTlVMTDsKKwkJfQorCX0KKwkvKiBpZiBzaXplIDwgbmZpZWxkcywgY2xlYXIgZXh0cmEgZmllbGQgdmFyaWFibGVzICovCisJZm9yIChpID0gc2l6ZTsgaSA8IG5maWVsZHM7IGkrKykgeworCQljbHJ2YXIoRmllbGRzICsgaSk7CisJfQorCW5maWVsZHMgPSBzaXplOworfQorCitzdGF0aWMgaW50IGF3a19zcGxpdChjb25zdCBjaGFyICpzLCBub2RlICpzcGwsIGNoYXIgKipzbGlzdCkKK3sKKwlpbnQgbCwgbjsKKwljaGFyIGNbNF07CisJY2hhciAqczE7CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMl07IC8vIFRPRE86IHdoeSBbMl0/IFsxXSBpcyBlbm91Z2guLi4KKworCS8qIGluIHdvcnN0IGNhc2UsIGVhY2ggY2hhciB3b3VsZCBiZSBhIHNlcGFyYXRlIGZpZWxkICovCisJKnNsaXN0ID0gczEgPSB4emFsbG9jKHN0cmxlbihzKSAqIDIgKyAzKTsKKwlzdHJjcHkoczEsIHMpOworCisJY1swXSA9IGNbMV0gPSAoY2hhcilzcGwtPmluZm87CisJY1syXSA9IGNbM10gPSAnXDAnOworCWlmICgqZ2V0dmFyX3MoaW50dmFyW1JTXSkgPT0gJ1wwJykKKwkJY1syXSA9ICdcbic7CisKKwluID0gMDsKKwlpZiAoKHNwbC0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfUkVHRVhQKSB7ICAvKiByZWdleCBzcGxpdCAqLworCQlpZiAoISpzKQorCQkJcmV0dXJuIG47IC8qICIiOiB6ZXJvIGZpZWxkcyAqLworCQluKys7IC8qIGF0IGxlYXN0IG9uZSBmaWVsZCB3aWxsIGJlIHRoZXJlICovCisJCWRvIHsKKwkJCWwgPSBzdHJjc3BuKHMsIGMrMik7IC8qIGxlbiB0aWxsIG5leHQgTlVMIG9yIFxuICovCisJCQlpZiAocmVnZXhlYyhpY2FzZSA/IHNwbC0+ci5pcmUgOiBzcGwtPmwucmUsIHMsIDEsIHBtYXRjaCwgMCkgPT0gMAorCQkJICYmIHBtYXRjaFswXS5ybV9zbyA8PSBsCisJCQkpIHsKKwkJCQlsID0gcG1hdGNoWzBdLnJtX3NvOworCQkJCWlmIChwbWF0Y2hbMF0ucm1fZW8gPT0gMCkgeworCQkJCQlsKys7CisJCQkJCXBtYXRjaFswXS5ybV9lbysrOworCQkJCX0KKwkJCQluKys7IC8qIHdlIHNhdyB5ZXQgYW5vdGhlciBkZWxpbWl0ZXIgKi8KKwkJCX0gZWxzZSB7CisJCQkJcG1hdGNoWzBdLnJtX2VvID0gbDsKKwkJCQlpZiAoc1tsXSkKKwkJCQkJcG1hdGNoWzBdLnJtX2VvKys7CisJCQl9CisJCQltZW1jcHkoczEsIHMsIGwpOworCQkJLyogbWFrZSBzdXJlIHdlIHJlbW92ZSAqYWxsKiBvZiB0aGUgc2VwYXJhdG9yIGNoYXJzICovCisJCQlkbyB7CisJCQkJczFbbF0gPSAnXDAnOworCQkJfSB3aGlsZSAoKytsIDwgcG1hdGNoWzBdLnJtX2VvKTsKKwkJCW5leHR3b3JkKCZzMSk7CisJCQlzICs9IHBtYXRjaFswXS5ybV9lbzsKKwkJfSB3aGlsZSAoKnMpOworCQlyZXR1cm4gbjsKKwl9CisJaWYgKGNbMF0gPT0gJ1wwJykgeyAgLyogbnVsbCBzcGxpdCAqLworCQl3aGlsZSAoKnMpIHsKKwkJCSpzMSsrID0gKnMrKzsKKwkJCSpzMSsrID0gJ1wwJzsKKwkJCW4rKzsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisJaWYgKGNbMF0gIT0gJyAnKSB7ICAvKiBzaW5nbGUtY2hhcmFjdGVyIHNwbGl0ICovCisJCWlmIChpY2FzZSkgeworCQkJY1swXSA9IHRvdXBwZXIoY1swXSk7CisJCQljWzFdID0gdG9sb3dlcihjWzFdKTsKKwkJfQorCQlpZiAoKnMxKQorCQkJbisrOworCQl3aGlsZSAoKHMxID0gc3RycGJyayhzMSwgYykpICE9IE5VTEwpIHsKKwkJCSpzMSsrID0gJ1wwJzsKKwkJCW4rKzsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisJLyogc3BhY2Ugc3BsaXQgKi8KKwl3aGlsZSAoKnMpIHsKKwkJcyA9IHNraXBfd2hpdGVzcGFjZShzKTsKKwkJaWYgKCEqcykKKwkJCWJyZWFrOworCQluKys7CisJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpCisJCQkqczErKyA9ICpzKys7CisJCSpzMSsrID0gJ1wwJzsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIHNwbGl0X2YwKHZvaWQpCit7CisvKiBzdGF0aWMgY2hhciAqZnN0cmluZ3M7ICovCisjZGVmaW5lIGZzdHJpbmdzIChHLnNwbGl0X2YwX19mc3RyaW5ncykKKworCWludCBpLCBuOworCWNoYXIgKnM7CisKKwlpZiAoaXNfZjBfc3BsaXQpCisJCXJldHVybjsKKworCWlzX2YwX3NwbGl0ID0gVFJVRTsKKwlmcmVlKGZzdHJpbmdzKTsKKwlmc3JlYWxsb2MoMCk7CisJbiA9IGF3a19zcGxpdChnZXR2YXJfcyhpbnR2YXJbRjBdKSwgJmZzcGxpdHRlci5uLCAmZnN0cmluZ3MpOworCWZzcmVhbGxvYyhuKTsKKwlzID0gZnN0cmluZ3M7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlGaWVsZHNbaV0uc3RyaW5nID0gbmV4dHdvcmQoJnMpOworCQlGaWVsZHNbaV0udHlwZSB8PSAoVkZfRlNUUiB8IFZGX1VTRVIgfCBWRl9ESVJUWSk7CisJfQorCisJLyogc2V0IE5GIG1hbnVhbGx5IHRvIGF2b2lkIHNpZGUgZWZmZWN0cyAqLworCWNscnZhcihpbnR2YXJbTkZdKTsKKwlpbnR2YXJbTkZdLT50eXBlID0gVkZfTlVNQkVSIHwgVkZfU1BFQ0lBTDsKKwlpbnR2YXJbTkZdLT5udW1iZXIgPSBuZmllbGRzOworI3VuZGVmIGZzdHJpbmdzCit9CisKKy8qIHBlcmZvcm0gYWRkaXRpb25hbCBhY3Rpb25zIHdoZW4gc29tZSBpbnRlcm5hbCB2YXJpYWJsZXMgY2hhbmdlZCAqLworc3RhdGljIHZvaWQgaGFuZGxlX3NwZWNpYWwodmFyICp2KQoreworCWludCBuOworCWNoYXIgKmI7CisJY29uc3QgY2hhciAqc2VwLCAqczsKKwlpbnQgc2wsIGwsIGxlbiwgaSwgYnNpemU7CisKKwlpZiAoISh2LT50eXBlICYgVkZfU1BFQ0lBTCkpCisJCXJldHVybjsKKworCWlmICh2ID09IGludHZhcltORl0pIHsKKwkJbiA9IChpbnQpZ2V0dmFyX2kodik7CisJCWZzcmVhbGxvYyhuKTsKKworCQkvKiByZWNhbGN1bGF0ZSAkMCAqLworCQlzZXAgPSBnZXR2YXJfcyhpbnR2YXJbT0ZTXSk7CisJCXNsID0gc3RybGVuKHNlcCk7CisJCWIgPSBOVUxMOworCQlsZW4gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlzID0gZ2V0dmFyX3MoJkZpZWxkc1tpXSk7CisJCQlsID0gc3RybGVuKHMpOworCQkJaWYgKGIpIHsKKwkJCQltZW1jcHkoYitsZW4sIHNlcCwgc2wpOworCQkJCWxlbiArPSBzbDsKKwkJCX0KKwkJCWIgPSBxcmVhbGxvYyhiLCBsZW4rbCtzbCwgJmJzaXplKTsKKwkJCW1lbWNweShiK2xlbiwgcywgbCk7CisJCQlsZW4gKz0gbDsKKwkJfQorCQlpZiAoYikKKwkJCWJbbGVuXSA9ICdcMCc7CisJCXNldHZhcl9wKGludHZhcltGMF0sIGIpOworCQlpc19mMF9zcGxpdCA9IFRSVUU7CisKKwl9IGVsc2UgaWYgKHYgPT0gaW50dmFyW0YwXSkgeworCQlpc19mMF9zcGxpdCA9IEZBTFNFOworCisJfSBlbHNlIGlmICh2ID09IGludHZhcltGU10pIHsKKwkJbWtfc3BsaXR0ZXIoZ2V0dmFyX3ModiksICZmc3BsaXR0ZXIpOworCisJfSBlbHNlIGlmICh2ID09IGludHZhcltSU10pIHsKKwkJbWtfc3BsaXR0ZXIoZ2V0dmFyX3ModiksICZyc3BsaXR0ZXIpOworCisJfSBlbHNlIGlmICh2ID09IGludHZhcltJR05PUkVDQVNFXSkgeworCQlpY2FzZSA9IGlzdHJ1ZSh2KTsKKworCX0gZWxzZSB7CQkJCS8qICRuICovCisJCW4gPSBnZXR2YXJfaShpbnR2YXJbTkZdKTsKKwkJc2V0dmFyX2koaW50dmFyW05GXSwgbiA+IHYtRmllbGRzID8gbiA6IHYtRmllbGRzKzEpOworCQkvKiByaWdodCBoZXJlIHYgaXMgaW52YWxpZC4gSnVzdCB0byBub3RlLi4uICovCisJfQorfQorCisvKiBzdGVwIHRocm91Z2ggZnVuYy9idWlsdGluL2V0YyBhcmd1bWVudHMgKi8KK3N0YXRpYyBub2RlICpuZXh0YXJnKG5vZGUgKipwbikKK3sKKwlub2RlICpuOworCisJbiA9ICpwbjsKKwlpZiAobiAmJiAobi0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQ09NTUEpIHsKKwkJKnBuID0gbi0+ci5uOworCQluID0gbi0+bC5uOworCX0gZWxzZSB7CisJCSpwbiA9IE5VTEw7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBoYXNod2Fsa19pbml0KHZhciAqdiwgeGhhc2ggKmFycmF5KQoreworCWhhc2hfaXRlbSAqaGk7CisJdW5zaWduZWQgaTsKKwl3YWxrZXJfbGlzdCAqdzsKKwl3YWxrZXJfbGlzdCAqcHJldl93YWxrZXI7CisKKwlpZiAodi0+dHlwZSAmIFZGX1dBTEspIHsKKwkJcHJldl93YWxrZXIgPSB2LT54LndhbGtlcjsKKwl9IGVsc2UgeworCQl2LT50eXBlIHw9IFZGX1dBTEs7CisJCXByZXZfd2Fsa2VyID0gTlVMTDsKKwl9CisJZGVidWdfcHJpbnRmX3dhbGtlcigiaGFzaHdhbGtfaW5pdDogcHJldl93YWxrZXI6JXBcbiIsIHByZXZfd2Fsa2VyKTsKKworCXcgPSB2LT54LndhbGtlciA9IHh6YWxsb2Moc2l6ZW9mKCp3KSArIGFycmF5LT5nbGVuICsgMSk7IC8qIHdoeSArIDE/ICovCisJZGVidWdfcHJpbnRmX3dhbGtlcigiIHdhbGtlckAlcD0lcFxuIiwgJnYtPngud2Fsa2VyLCB3KTsKKwl3LT5jdXIgPSB3LT5lbmQgPSB3LT53YnVmOworCXctPnByZXYgPSBwcmV2X3dhbGtlcjsKKwlmb3IgKGkgPSAwOyBpIDwgYXJyYXktPmNzaXplOyBpKyspIHsKKwkJaGkgPSBhcnJheS0+aXRlbXNbaV07CisJCXdoaWxlIChoaSkgeworCQkJc3RyY3B5KHctPmVuZCwgaGktPm5hbWUpOworCQkJbmV4dHdvcmQoJnctPmVuZCk7CisJCQloaSA9IGhpLT5uZXh0OworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGhhc2h3YWxrX25leHQodmFyICp2KQoreworCXdhbGtlcl9saXN0ICp3ID0gdi0+eC53YWxrZXI7CisKKwlpZiAody0+Y3VyID49IHctPmVuZCkgeworCQl3YWxrZXJfbGlzdCAqcHJldl93YWxrZXIgPSB3LT5wcmV2OworCisJCWRlYnVnX3ByaW50Zl93YWxrZXIoImVuZCBvZiBpdGVyYXRpb24sIGZyZWUod2Fsa2VyQCVwOiVwKSwgcHJldl93YWxrZXI6JXBcbiIsICZ2LT54LndhbGtlciwgdywgcHJldl93YWxrZXIpOworCQlmcmVlKHcpOworCQl2LT54LndhbGtlciA9IHByZXZfd2Fsa2VyOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJc2V0dmFyX3ModiwgbmV4dHdvcmQoJnctPmN1cikpOworCXJldHVybiBUUlVFOworfQorCisvKiBldmFsdWF0ZSBub2RlLCByZXR1cm4gMSB3aGVuIHJlc3VsdCBpcyB0cnVlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGludCBwdGVzdChub2RlICpwYXR0ZXJuKQoreworCS8qIHB0ZXN0X192IGlzICJzdGF0aWMiOiB0byBzYXZlIHN0YWNrIHNwYWNlPyAqLworCXJldHVybiBpc3RydWUoZXZhbHVhdGUocGF0dGVybiwgJkcucHRlc3RfX3YpKTsKK30KKworLyogcmVhZCBuZXh0IHJlY29yZCBmcm9tIHN0cmVhbSByc20gaW50byBhIHZhcmlhYmxlIHYgKi8KK3N0YXRpYyBpbnQgYXdrX2dldGxpbmUocnN0cmVhbSAqcnNtLCB2YXIgKnYpCit7CisJY2hhciAqYjsKKwlyZWdtYXRjaF90IHBtYXRjaFsyXTsKKwlpbnQgc2l6ZSwgYSwgcCwgcHAgPSAwOworCWludCBmZCwgc28sIGVvLCByLCBycDsKKwljaGFyIGMsICptLCAqczsKKworCWRlYnVnX3ByaW50Zl9ldmFsKCJlbnRlcmVkICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHdlJ3JlIHVzaW5nIG91ciBvd24gYnVmZmVyIHNpbmNlIHdlIG5lZWQgYWNjZXNzIHRvIGFjY3VtdWxhdGluZworCSAqIGNoYXJhY3RlcnMKKwkgKi8KKwlmZCA9IGZpbGVubyhyc20tPkYpOworCW0gPSByc20tPmJ1ZmZlcjsKKwlhID0gcnNtLT5hZHY7CisJcCA9IHJzbS0+cG9zOworCXNpemUgPSByc20tPnNpemU7CisJYyA9IChjaGFyKSByc3BsaXR0ZXIubi5pbmZvOworCXJwID0gMDsKKworCWlmICghbSkKKwkJbSA9IHFyZWFsbG9jKG0sIDI1NiwgJnNpemUpOworCisJZG8geworCQliID0gbSArIGE7CisJCXNvID0gZW8gPSBwOworCQlyID0gMTsKKwkJaWYgKHAgPiAwKSB7CisJCQlpZiAoKHJzcGxpdHRlci5uLmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCkgeworCQkJCWlmIChyZWdleGVjKGljYXNlID8gcnNwbGl0dGVyLm4uci5pcmUgOiByc3BsaXR0ZXIubi5sLnJlLAorCQkJCQkJCWIsIDEsIHBtYXRjaCwgMCkgPT0gMCkgeworCQkJCQlzbyA9IHBtYXRjaFswXS5ybV9zbzsKKwkJCQkJZW8gPSBwbWF0Y2hbMF0ucm1fZW87CisJCQkJCWlmIChiW2VvXSAhPSAnXDAnKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjICE9ICdcMCcpIHsKKwkJCQlzID0gc3RyY2hyKGIrcHAsIGMpOworCQkJCWlmICghcykKKwkJCQkJcyA9IG1lbWNocihiK3BwLCAnXDAnLCBwIC0gcHApOworCQkJCWlmIChzKSB7CisJCQkJCXNvID0gZW8gPSBzLWI7CisJCQkJCWVvKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUgKGJbcnBdID09ICdcbicpCisJCQkJCXJwKys7CisJCQkJcyA9IHN0cnN0cihiK3JwLCAiXG5cbiIpOworCQkJCWlmIChzKSB7CisJCQkJCXNvID0gZW8gPSBzLWI7CisJCQkJCXdoaWxlIChiW2VvXSA9PSAnXG4nKQorCQkJCQkJZW8rKzsKKwkJCQkJaWYgKGJbZW9dICE9ICdcMCcpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoYSA+IDApIHsKKwkJCW1lbW1vdmUobSwgbSthLCBwKzEpOworCQkJYiA9IG07CisJCQlhID0gMDsKKwkJfQorCisJCW0gPSBxcmVhbGxvYyhtLCBhK3ArMTI4LCAmc2l6ZSk7CisJCWIgPSBtICsgYTsKKwkJcHAgPSBwOworCQlwICs9IHNhZmVfcmVhZChmZCwgYitwLCBzaXplLXAtMSk7CisJCWlmIChwIDwgcHApIHsKKwkJCXAgPSAwOworCQkJciA9IDA7CisJCQlzZXR2YXJfaShpbnR2YXJbRVJSTk9dLCBlcnJubyk7CisJCX0KKwkJYltwXSA9ICdcMCc7CisKKwl9IHdoaWxlIChwID4gcHApOworCisJaWYgKHAgPT0gMCkgeworCQlyLS07CisJfSBlbHNlIHsKKwkJYyA9IGJbc29dOyBiW3NvXSA9ICdcMCc7CisJCXNldHZhcl9zKHYsIGIrcnApOworCQl2LT50eXBlIHw9IFZGX1VTRVI7CisJCWJbc29dID0gYzsKKwkJYyA9IGJbZW9dOyBiW2VvXSA9ICdcMCc7CisJCXNldHZhcl9zKGludHZhcltSVF0sIGIrc28pOworCQliW2VvXSA9IGM7CisJfQorCisJcnNtLT5idWZmZXIgPSBtOworCXJzbS0+YWR2ID0gYSArIGVvOworCXJzbS0+cG9zID0gcCAtIGVvOworCXJzbS0+c2l6ZSA9IHNpemU7CisKKwlkZWJ1Z19wcmludGZfZXZhbCgicmV0dXJuaW5nIGZyb20gJXMoKTogJWRcbiIsIF9fZnVuY19fLCByKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGZtdF9udW0oY2hhciAqYiwgaW50IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgZG91YmxlIG4sIGludCBpbnRfYXNfaW50KQoreworCWludCByID0gMDsKKwljaGFyIGM7CisJY29uc3QgY2hhciAqcyA9IGZvcm1hdDsKKworCWlmIChpbnRfYXNfaW50ICYmIG4gPT0gKGludCluKSB7CisJCXIgPSBzbnByaW50ZihiLCBzaXplLCAiJWQiLCAoaW50KW4pOworCX0gZWxzZSB7CisJCWRvIHsgYyA9ICpzOyB9IHdoaWxlIChjICYmICorK3MpOworCQlpZiAoc3RyY2hyKCJkaW91eFgiLCBjKSkgeworCQkJciA9IHNucHJpbnRmKGIsIHNpemUsIGZvcm1hdCwgKGludCluKTsKKwkJfSBlbHNlIGlmIChzdHJjaHIoImVFZmdHIiwgYykpIHsKKwkJCXIgPSBzbnByaW50ZihiLCBzaXplLCBmb3JtYXQsIG4pOworCQl9IGVsc2UgeworCQkJc3ludGF4X2Vycm9yKEVNU0dfSU5WX0ZNVCk7CisJCX0KKwl9CisJcmV0dXJuIHI7Cit9CisKKy8qIGZvcm1hdHRlZCBvdXRwdXQgaW50byBhbiBhbGxvY2F0ZWQgYnVmZmVyLCByZXR1cm4gcHRyIHRvIGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKmF3a19wcmludGYobm9kZSAqbikKK3sKKwljaGFyICpiID0gTlVMTDsKKwljaGFyICpmbXQsICpzLCAqZjsKKwljb25zdCBjaGFyICpzMTsKKwlpbnQgaSwgaiwgaW5jciwgYnNpemU7CisJY2hhciBjLCBjMTsKKwl2YXIgKnYsICphcmc7CisKKwl2ID0gbnZhbGxvYygxKTsKKwlmbXQgPSBmID0geHN0cmR1cChnZXR2YXJfcyhldmFsdWF0ZShuZXh0YXJnKCZuKSwgdikpKTsKKworCWkgPSAwOworCXdoaWxlICgqZikgeworCQlzID0gZjsKKwkJd2hpbGUgKCpmICYmICgqZiAhPSAnJScgfHwgKisrZiA9PSAnJScpKQorCQkJZisrOworCQl3aGlsZSAoKmYgJiYgIWlzYWxwaGEoKmYpKSB7CisJCQlpZiAoKmYgPT0gJyonKQorCQkJCXN5bnRheF9lcnJvcigiJSp4IGZvcm1hdHMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCWYrKzsKKwkJfQorCisJCWluY3IgPSAoZiAtIHMpICsgTUFYVkFSRk1UOworCQliID0gcXJlYWxsb2MoYiwgaW5jciArIGksICZic2l6ZSk7CisJCWMgPSAqZjsKKwkJaWYgKGMgIT0gJ1wwJykKKwkJCWYrKzsKKwkJYzEgPSAqZjsKKwkJKmYgPSAnXDAnOworCQlhcmcgPSBldmFsdWF0ZShuZXh0YXJnKCZuKSwgdik7CisKKwkJaiA9IGk7CisJCWlmIChjID09ICdjJyB8fCAhYykgeworCQkJaSArPSBzcHJpbnRmKGIraSwgcywgaXNfbnVtZXJpYyhhcmcpID8KKwkJCQkJKGNoYXIpZ2V0dmFyX2koYXJnKSA6ICpnZXR2YXJfcyhhcmcpKTsKKwkJfSBlbHNlIGlmIChjID09ICdzJykgeworCQkJczEgPSBnZXR2YXJfcyhhcmcpOworCQkJYiA9IHFyZWFsbG9jKGIsIGluY3IraStzdHJsZW4oczEpLCAmYnNpemUpOworCQkJaSArPSBzcHJpbnRmKGIraSwgcywgczEpOworCQl9IGVsc2UgeworCQkJaSArPSBmbXRfbnVtKGIraSwgaW5jciwgcywgZ2V0dmFyX2koYXJnKSwgRkFMU0UpOworCQl9CisJCSpmID0gYzE7CisKKwkJLyogaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNwcmludGYsIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZSAqLworCQlpZiAoaSA8IGopCisJCQlpID0gajsKKwl9CisKKwlmcmVlKGZtdCk7CisJbnZmcmVlKHYpOworCWIgPSB4cmVhbGxvYyhiLCBpICsgMSk7CisJYltpXSA9ICdcMCc7CisJcmV0dXJuIGI7Cit9CisKKy8qIENvbW1vbiBzdWJzdGl0dXRpb24gcm91dGluZS4KKyAqIFJlcGxhY2UgKG5tKSd0aCBzdWJzdHJpbmcgb2YgKHNyYykgdGhhdCBtYXRjaGVzIChybikgd2l0aCAocmVwbCksCisgKiBzdG9yZSByZXN1bHQgaW50byAoZGVzdCksIHJldHVybiBudW1iZXIgb2Ygc3Vic3RpdHV0aW9ucy4KKyAqIElmIG5tID0gMCwgcmVwbGFjZSBhbGwgbWF0Y2hlcy4KKyAqIElmIHNyYyBvciBkc3QgaXMgTlVMTCwgdXNlICQwLgorICogSWYgc3ViZXhwICE9IDAsIGVuYWJsZSBzdWJleHByZXNzaW9uIG1hdGNoaW5nIChcMS1cOSkuCisgKi8KK3N0YXRpYyBpbnQgYXdrX3N1Yihub2RlICpybiwgY29uc3QgY2hhciAqcmVwbCwgaW50IG5tLCB2YXIgKnNyYywgdmFyICpkZXN0LCBpbnQgc3ViZXhwKQoreworCWNoYXIgKnJlc2J1ZjsKKwljb25zdCBjaGFyICpzcDsKKwlpbnQgbWF0Y2hfbm8sIHJlc2lkeCwgcmVwbGVuLCByZXNidWZzaXplOworCWludCByZWdleGVjX2ZsYWdzOworCXJlZ21hdGNoX3QgcG1hdGNoWzEwXTsKKwlyZWdleF90IHNyZWcsICpyZWdleDsKKworCXJlc2J1ZiA9IE5VTEw7CisJcmVzaWR4ID0gMDsKKwltYXRjaF9ubyA9IDA7CisJcmVnZXhlY19mbGFncyA9IDA7CisJcmVnZXggPSBhc19yZWdleChybiwgJnNyZWcpOworCXNwID0gZ2V0dmFyX3Moc3JjID8gc3JjIDogaW50dmFyW0YwXSk7CisJcmVwbGVuID0gc3RybGVuKHJlcGwpOworCXdoaWxlIChyZWdleGVjKHJlZ2V4LCBzcCwgMTAsIHBtYXRjaCwgcmVnZXhlY19mbGFncykgPT0gMCkgeworCQlpbnQgc28gPSBwbWF0Y2hbMF0ucm1fc287CisJCWludCBlbyA9IHBtYXRjaFswXS5ybV9lbzsKKworCQkvL2JiX2Vycm9yX21zZygibWF0Y2ggJXU6IFsldSwldV0gJyVzJyVwIiwgbWF0Y2hfbm8rMSwgc28sIGVvLCBzcCxzcCk7CisJCXJlc2J1ZiA9IHFyZWFsbG9jKHJlc2J1ZiwgcmVzaWR4ICsgZW8gKyByZXBsZW4sICZyZXNidWZzaXplKTsKKwkJbWVtY3B5KHJlc2J1ZiArIHJlc2lkeCwgc3AsIGVvKTsKKwkJcmVzaWR4ICs9IGVvOworCQlpZiAoKyttYXRjaF9ubyA+PSBubSkgeworCQkJY29uc3QgY2hhciAqczsKKwkJCWludCBuYnM7CisKKwkJCS8qIHJlcGxhY2UgKi8KKwkJCXJlc2lkeCAtPSAoZW8gLSBzbyk7CisJCQluYnMgPSAwOworCQkJZm9yIChzID0gcmVwbDsgKnM7IHMrKykgeworCQkJCWNoYXIgYyA9IHJlc2J1ZltyZXNpZHgrK10gPSAqczsKKwkJCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkJCW5icysrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGMgPT0gJyYnIHx8IChzdWJleHAgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpKSB7CisJCQkJCWludCBqOworCQkJCQlyZXNpZHggLT0gKChuYnMgKyAzKSA+PiAxKTsKKwkJCQkJaiA9IDA7CisJCQkJCWlmIChjICE9ICcmJykgeworCQkJCQkJaiA9IGMgLSAnMCc7CisJCQkJCQluYnMrKzsKKwkJCQkJfQorCQkJCQlpZiAobmJzICUgMikgeworCQkJCQkJcmVzYnVmW3Jlc2lkeCsrXSA9IGM7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnQgbiA9IHBtYXRjaFtqXS5ybV9lbyAtIHBtYXRjaFtqXS5ybV9zbzsKKwkJCQkJCXJlc2J1ZiA9IHFyZWFsbG9jKHJlc2J1ZiwgcmVzaWR4ICsgcmVwbGVuICsgbiwgJnJlc2J1ZnNpemUpOworCQkJCQkJbWVtY3B5KHJlc2J1ZiArIHJlc2lkeCwgc3AgKyBwbWF0Y2hbal0ucm1fc28sIG4pOworCQkJCQkJcmVzaWR4ICs9IG47CisJCQkJCX0KKwkJCQl9CisJCQkJbmJzID0gMDsKKwkJCX0KKwkJfQorCisJCXJlZ2V4ZWNfZmxhZ3MgPSBSRUdfTk9UQk9MOworCQlzcCArPSBlbzsKKwkJaWYgKG1hdGNoX25vID09IG5tKQorCQkJYnJlYWs7CisJCWlmIChlbyA9PSBzbykgeworCQkJLyogRW1wdHkgbWF0Y2ggKGUuZy4gImIqIiB3aWxsIG1hdGNoIGFueXdoZXJlKS4KKwkJCSAqIEFkdmFuY2UgYnkgb25lIGNoYXIuICovCisvL0JVRyAoYnVnIDEzMzMpOgorLy9nc3ViKC9cPGIqLywiIikgb24gImFiYyIgd2lsbCByZWFjaCB0aGlzIHBvaW50LCBhZHZhbmNlIHRvICJiYyIKKy8vLi4uIGFuZCB3aWxsIGVycm9uZW91c2x5IG1hdGNoICJiIiBldmVuIHRob3VnaCBpdCBpcyBOT1QgYXQgdGhlIHdvcmQgc3RhcnQuCisvL3dlIG5lZWQgUkVHX05PVEJPVyBidXQgaXQgZG9lcyBub3QgZXhpc3QuLi4KKy8vVE9ETzogaWYgRVhUUkFfQ09NUEFUPXksIHVzZSBHTlUgbWF0Y2hpbmcgYW5kIHJlX3NlYXJjaCwKKy8vaXQgc2hvdWxkIGJlIGFibGUgdG8gZG8gaXQgY29ycmVjdGx5LgorCQkJLyogU3VidGxlOiB0aGlzIGlzIHNhZmUgb25seSBiZWNhdXNlCisJCQkgKiBxcmVhbGxvYyBhbGxvY2F0ZWQgYXQgbGVhc3Qgb25lIGV4dHJhIGJ5dGUgKi8KKwkJCXJlc2J1ZltyZXNpZHhdID0gKnNwOworCQkJaWYgKCpzcCA9PSAnXDAnKQorCQkJCWdvdG8gcmV0OworCQkJc3ArKzsKKwkJCXJlc2lkeCsrOworCQl9CisJfQorCisJcmVzYnVmID0gcXJlYWxsb2MocmVzYnVmLCByZXNpZHggKyBzdHJsZW4oc3ApLCAmcmVzYnVmc2l6ZSk7CisJc3RyY3B5KHJlc2J1ZiArIHJlc2lkeCwgc3ApOworIHJldDoKKwkvL2JiX2Vycm9yX21zZygiZW5kIHNwOiclcyclcCIsIHNwLHNwKTsKKwlzZXR2YXJfcChkZXN0ID8gZGVzdCA6IGludHZhcltGMF0sIHJlc2J1Zik7CisJaWYgKHJlZ2V4ID09ICZzcmVnKQorCQlyZWdmcmVlKHJlZ2V4KTsKKwlyZXR1cm4gbWF0Y2hfbm87Cit9CisKK3N0YXRpYyBOT0lOTElORSBpbnQgZG9fbWt0aW1lKGNvbnN0IGNoYXIgKmRzKQoreworCXN0cnVjdCB0bSB0aGVuOworCWludCBjb3VudDsKKworCS8qbWVtc2V0KCZ0aGVuLCAwLCBzaXplb2YodGhlbikpOyAtIG5vdCBuZWVkZWQgKi8KKwl0aGVuLnRtX2lzZHN0ID0gLTE7IC8qIGRlZmF1bHQgaXMgdW5rbm93biAqLworCisJLyogbWFucGFnZSBvZiBta3RpbWUgc2F5cyB0aGVzZSBmaWVsZHMgYXJlIGludHMsCisJICogc28gd2UgY2FuIHNzY2FuZiBzdHVmZiBkaXJlY3RseSBpbnRvIHRoZW0gKi8KKwljb3VudCA9IHNzY2FuZihkcywgIiV1ICV1ICV1ICV1ICV1ICV1ICVkIiwKKwkJJnRoZW4udG1feWVhciwgJnRoZW4udG1fbW9uLCAmdGhlbi50bV9tZGF5LAorCQkmdGhlbi50bV9ob3VyLCAmdGhlbi50bV9taW4sICZ0aGVuLnRtX3NlYywKKwkJJnRoZW4udG1faXNkc3QpOworCisJaWYgKGNvdW50IDwgNgorCSB8fCAodW5zaWduZWQpdGhlbi50bV9tb24gPCAxCisJIHx8ICh1bnNpZ25lZCl0aGVuLnRtX3llYXIgPCAxOTAwCisJKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwl0aGVuLnRtX21vbiAtPSAxOworCXRoZW4udG1feWVhciAtPSAxOTAwOworCisJcmV0dXJuIG1rdGltZSgmdGhlbik7Cit9CisKK3N0YXRpYyBOT0lOTElORSB2YXIgKmV4ZWNfYnVpbHRpbihub2RlICpvcCwgdmFyICpyZXMpCit7CisjZGVmaW5lIHRzcGwgKEcuZXhlY19idWlsdGluX190c3BsKQorCisJdmFyICp0djsKKwlub2RlICphbls0XTsKKwl2YXIgKmF2WzRdOworCWNvbnN0IGNoYXIgKmFzWzRdOworCXJlZ21hdGNoX3QgcG1hdGNoWzJdOworCXJlZ2V4X3Qgc3JlZywgKnJlOworCW5vZGUgKnNwbDsKKwl1aW50MzJfdCBpc3IsIGluZm87CisJaW50IG5hcmdzOworCXRpbWVfdCB0dDsKKwlpbnQgaSwgbCwgbGwsIG47CisKKwl0diA9IG52YWxsb2MoNCk7CisJaXNyID0gaW5mbyA9IG9wLT5pbmZvOworCW9wID0gb3AtPmwubjsKKworCWF2WzJdID0gYXZbM10gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCA0ICYmIG9wOyBpKyspIHsKKwkJYW5baV0gPSBuZXh0YXJnKCZvcCk7CisJCWlmIChpc3IgJiAweDA5MDAwMDAwKQorCQkJYXZbaV0gPSBldmFsdWF0ZShhbltpXSwgJnR2W2ldKTsKKwkJaWYgKGlzciAmIDB4MDgwMDAwMDApCisJCQlhc1tpXSA9IGdldHZhcl9zKGF2W2ldKTsKKwkJaXNyID4+PSAxOworCX0KKworCW5hcmdzID0gaTsKKwlpZiAoKHVpbnQzMl90KW5hcmdzIDwgKGluZm8gPj4gMzApKQorCQlzeW50YXhfZXJyb3IoRU1TR19UT09fRkVXX0FSR1MpOworCisJaW5mbyAmPSBPUE5NQVNLOworCXN3aXRjaCAoaW5mbykgeworCisJY2FzZSBCX2EyOgorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pCisJCQlzZXR2YXJfaShyZXMsIGF0YW4yKGdldHZhcl9pKGF2WzBdKSwgZ2V0dmFyX2koYXZbMV0pKSk7CisJCWVsc2UKKwkJCXN5bnRheF9lcnJvcihFTVNHX05PX01BVEgpOworCQlicmVhazsKKworCWNhc2UgQl9zcDogeworCQljaGFyICpzLCAqczE7CisKKwkJaWYgKG5hcmdzID4gMikgeworCQkJc3BsID0gKGFuWzJdLT5pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19SRUdFWFAgPworCQkJCWFuWzJdIDogbWtfc3BsaXR0ZXIoZ2V0dmFyX3MoZXZhbHVhdGUoYW5bMl0sICZ0dlsyXSkpLCAmdHNwbCk7CisJCX0gZWxzZSB7CisJCQlzcGwgPSAmZnNwbGl0dGVyLm47CisJCX0KKworCQluID0gYXdrX3NwbGl0KGFzWzBdLCBzcGwsICZzKTsKKwkJczEgPSBzOworCQljbGVhcl9hcnJheShpYW1hcnJheShhdlsxXSkpOworCQlmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKwkJCXNldGFyaV91KGF2WzFdLCBpLCBuZXh0d29yZCgmcykpOworCQlmcmVlKHMxKTsKKwkJc2V0dmFyX2kocmVzLCBuKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBCX3NzOiB7CisJCWNoYXIgKnM7CisKKwkJbCA9IHN0cmxlbihhc1swXSk7CisJCWkgPSBnZXR2YXJfaShhdlsxXSkgLSAxOworCQlpZiAoaSA+IGwpCisJCQlpID0gbDsKKwkJaWYgKGkgPCAwKQorCQkJaSA9IDA7CisJCW4gPSAobmFyZ3MgPiAyKSA/IGdldHZhcl9pKGF2WzJdKSA6IGwtaTsKKwkJaWYgKG4gPCAwKQorCQkJbiA9IDA7CisJCXMgPSB4c3RybmR1cChhc1swXStpLCBuKTsKKwkJc2V0dmFyX3AocmVzLCBzKTsKKwkJYnJlYWs7CisJfQorCisJLyogQml0d2lzZSBvcHMgbXVzdCBhc3N1bWUgdGhhdCBvcGVyYW5kcyBhcmUgdW5zaWduZWQuIEdOVSBBd2sgMy4xLjU6CisJICogYXdrICd7IHByaW50IG9yKC0xLDEpIH0nIGdpdmVzICI0LjI5NDk3ZSswOSIsIG5vdCAiLTIueHh4ZSswOSIgKi8KKwljYXNlIEJfYW46CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSAmIGdldHZhcl9pX2ludChhdlsxXSkpOworCQlicmVhazsKKworCWNhc2UgQl9jbzoKKwkJc2V0dmFyX2kocmVzLCB+Z2V0dmFyX2lfaW50KGF2WzBdKSk7CisJCWJyZWFrOworCisJY2FzZSBCX2xzOgorCQlzZXR2YXJfaShyZXMsIGdldHZhcl9pX2ludChhdlswXSkgPDwgZ2V0dmFyX2lfaW50KGF2WzFdKSk7CisJCWJyZWFrOworCisJY2FzZSBCX29yOgorCQlzZXR2YXJfaShyZXMsIGdldHZhcl9pX2ludChhdlswXSkgfCBnZXR2YXJfaV9pbnQoYXZbMV0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfcnM6CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSA+PiBnZXR2YXJfaV9pbnQoYXZbMV0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfeG86CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSBeIGdldHZhcl9pX2ludChhdlsxXSkpOworCQlicmVhazsKKworCWNhc2UgQl9sbzoKKwljYXNlIEJfdXA6IHsKKwkJY2hhciAqcywgKnMxOworCQlzMSA9IHMgPSB4c3RyZHVwKGFzWzBdKTsKKwkJd2hpbGUgKCpzMSkgeworCQkJLy8qczEgPSAoaW5mbyA9PSBCX3VwKSA/IHRvdXBwZXIoKnMxKSA6IHRvbG93ZXIoKnMxKTsKKwkJCWlmICgodW5zaWduZWQgY2hhcikoKCpzMSB8IDB4MjApIC0gJ2EnKSA8PSAoJ3onIC0gJ2EnKSkKKwkJCQkqczEgPSAoaW5mbyA9PSBCX3VwKSA/ICgqczEgJiAweGRmKSA6ICgqczEgfCAweDIwKTsKKwkJCXMxKys7CisJCX0KKwkJc2V0dmFyX3AocmVzLCBzKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBCX2l4OgorCQluID0gMDsKKwkJbGwgPSBzdHJsZW4oYXNbMV0pOworCQlsID0gc3RybGVuKGFzWzBdKSAtIGxsOworCQlpZiAobGwgPiAwICYmIGwgPj0gMCkgeworCQkJaWYgKCFpY2FzZSkgeworCQkJCWNoYXIgKnMgPSBzdHJzdHIoYXNbMF0sIGFzWzFdKTsKKwkJCQlpZiAocykKKwkJCQkJbiA9IChzIC0gYXNbMF0pICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogdGhpcyBwaWVjZSBvZiBjb2RlIGlzIHRlcnJpYmx5IHNsb3cgYW5kCisJCQkJICogcmVhbGx5IHNob3VsZCBiZSByZXdyaXR0ZW4KKwkJCQkgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykgeworCQkJCQlpZiAoc3RybmNhc2VjbXAoYXNbMF0raSwgYXNbMV0sIGxsKSA9PSAwKSB7CisJCQkJCQluID0gaSsxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJc2V0dmFyX2kocmVzLCBuKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfdGk6CisJCWlmIChuYXJncyA+IDEpCisJCQl0dCA9IGdldHZhcl9pKGF2WzFdKTsKKwkJZWxzZQorCQkJdGltZSgmdHQpOworCQkvL3MgPSAobmFyZ3MgPiAwKSA/IGFzWzBdIDogIiVhICViICVkICVIOiVNOiVTICVaICVZIjsKKwkJaSA9IHN0cmZ0aW1lKGdfYnVmLCBNQVhWQVJGTVQsCisJCQkoKG5hcmdzID4gMCkgPyBhc1swXSA6ICIlYSAlYiAlZCAlSDolTTolUyAlWiAlWSIpLAorCQkJbG9jYWx0aW1lKCZ0dCkpOworCQlnX2J1ZltpXSA9ICdcMCc7CisJCXNldHZhcl9zKHJlcywgZ19idWYpOworCQlicmVhazsKKworCWNhc2UgQl9tdDoKKwkJc2V0dmFyX2kocmVzLCBkb19ta3RpbWUoYXNbMF0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfbWE6CisJCXJlID0gYXNfcmVnZXgoYW5bMV0sICZzcmVnKTsKKwkJbiA9IHJlZ2V4ZWMocmUsIGFzWzBdLCAxLCBwbWF0Y2gsIDApOworCQlpZiAobiA9PSAwKSB7CisJCQlwbWF0Y2hbMF0ucm1fc28rKzsKKwkJCXBtYXRjaFswXS5ybV9lbysrOworCQl9IGVsc2UgeworCQkJcG1hdGNoWzBdLnJtX3NvID0gMDsKKwkJCXBtYXRjaFswXS5ybV9lbyA9IC0xOworCQl9CisJCXNldHZhcl9pKG5ld3ZhcigiUlNUQVJUIiksIHBtYXRjaFswXS5ybV9zbyk7CisJCXNldHZhcl9pKG5ld3ZhcigiUkxFTkdUSCIpLCBwbWF0Y2hbMF0ucm1fZW8gLSBwbWF0Y2hbMF0ucm1fc28pOworCQlzZXR2YXJfaShyZXMsIHBtYXRjaFswXS5ybV9zbyk7CisJCWlmIChyZSA9PSAmc3JlZykKKwkJCXJlZ2ZyZWUocmUpOworCQlicmVhazsKKworCWNhc2UgQl9nZToKKwkJYXdrX3N1YihhblswXSwgYXNbMV0sIGdldHZhcl9pKGF2WzJdKSwgYXZbM10sIHJlcywgVFJVRSk7CisJCWJyZWFrOworCisJY2FzZSBCX2dzOgorCQlzZXR2YXJfaShyZXMsIGF3a19zdWIoYW5bMF0sIGFzWzFdLCAwLCBhdlsyXSwgYXZbMl0sIEZBTFNFKSk7CisJCWJyZWFrOworCisJY2FzZSBCX3N1OgorCQlzZXR2YXJfaShyZXMsIGF3a19zdWIoYW5bMF0sIGFzWzFdLCAxLCBhdlsyXSwgYXZbMl0sIEZBTFNFKSk7CisJCWJyZWFrOworCX0KKworCW52ZnJlZSh0dik7CisJcmV0dXJuIHJlczsKKyN1bmRlZiB0c3BsCit9CisKKy8qCisgKiBFdmFsdWF0ZSBub2RlIC0gdGhlIGhlYXJ0IG9mIHRoZSBwcm9ncmFtLiBTdXBwbGllZCB3aXRoIHN1YnRyZWUKKyAqIGFuZCBwbGFjZSB3aGVyZSB0byBzdG9yZSByZXN1bHQuIHJldHVybnMgcHRyIHRvIHJlc3VsdC4KKyAqLworI2RlZmluZSBYQyhuKSAoKG4pID4+IDgpCisKK3N0YXRpYyB2YXIgKmV2YWx1YXRlKG5vZGUgKm9wLCB2YXIgKnJlcykKK3sKKy8qIFRoaXMgcHJvY2VkdXJlIGlzIHJlY3Vyc2l2ZSBzbyB3ZSBzaG91bGQgY291bnQgZXZlcnkgYnl0ZSAqLworI2RlZmluZSBmbmFyZ3MgKEcuZXZhbHVhdGVfX2ZuYXJncykKKy8qIHNlZWQgaXMgaW5pdGlhbGl6ZWQgdG8gMSAqLworI2RlZmluZSBzZWVkICAgKEcuZXZhbHVhdGVfX3NlZWQpCisjZGVmaW5lIHNyZWcgICAoRy5ldmFsdWF0ZV9fc3JlZykKKworCXZhciAqdjE7CisKKwlpZiAoIW9wKQorCQlyZXR1cm4gc2V0dmFyX3MocmVzLCBOVUxMKTsKKworCWRlYnVnX3ByaW50Zl9ldmFsKCJlbnRlcmVkICVzKClcbiIsIF9fZnVuY19fKTsKKworCXYxID0gbnZhbGxvYygyKTsKKworCXdoaWxlIChvcCkgeworCQlzdHJ1Y3QgeworCQkJdmFyICp2OworCQkJY29uc3QgY2hhciAqczsKKwkJfSBMID0gTDsgLyogZm9yIGNvbXBpbGVyICovCisJCXN0cnVjdCB7CisJCQl2YXIgKnY7CisJCQljb25zdCBjaGFyICpzOworCQl9IFIgPSBSOworCQlkb3VibGUgTF9kID0gTF9kOworCQl1aW50MzJfdCBvcGluZm87CisJCWludCBvcG47CisJCW5vZGUgKm9wMTsKKworCQlvcGluZm8gPSBvcC0+aW5mbzsKKwkJb3BuID0gKG9waW5mbyAmIE9QTk1BU0spOworCQlnX2xpbmVubyA9IG9wLT5saW5lbm87CisJCW9wMSA9IG9wLT5sLm47CisJCWRlYnVnX3ByaW50Zl9ldmFsKCJvcGluZm86JTA4eCBvcG46JTA4eFxuIiwgb3BpbmZvLCBvcG4pOworCisJCS8qIGV4ZWN1dGUgaW5ldml0YWJsZSB0aGluZ3MgKi8KKwkJaWYgKG9waW5mbyAmIE9GX1JFUzEpCisJCQlMLnYgPSBldmFsdWF0ZShvcDEsIHYxKTsKKwkJaWYgKG9waW5mbyAmIE9GX1JFUzIpCisJCQlSLnYgPSBldmFsdWF0ZShvcC0+ci5uLCB2MSsxKTsKKwkJaWYgKG9waW5mbyAmIE9GX1NUUjEpIHsKKwkJCUwucyA9IGdldHZhcl9zKEwudik7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiTC5zOiclcydcbiIsIEwucyk7CisJCX0KKwkJaWYgKG9waW5mbyAmIE9GX1NUUjIpIHsKKwkJCVIucyA9IGdldHZhcl9zKFIudik7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiUi5zOiclcydcbiIsIFIucyk7CisJCX0KKwkJaWYgKG9waW5mbyAmIE9GX05VTTEpIHsKKwkJCUxfZCA9IGdldHZhcl9pKEwudik7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiTF9kOiVmXG4iLCBMX2QpOworCQl9CisKKwkJZGVidWdfcHJpbnRmX2V2YWwoInN3aXRjaCgweCV4KVxuIiwgWEMob3BpbmZvICYgT1BDTFNNQVNLKSk7CisJCXN3aXRjaCAoWEMob3BpbmZvICYgT1BDTFNNQVNLKSkgeworCisJCS8qIC0tIGl0ZXJhdGl2ZSBub2RlIHR5cGUgLS0gKi8KKworCQkvKiB0ZXN0IHBhdHRlcm4gKi8KKwkJY2FzZSBYQyggT0NfVEVTVCApOgorCQkJaWYgKChvcDEtPmluZm8gJiBPUENMU01BU0spID09IE9DX0NPTU1BKSB7CisJCQkJLyogaXQncyByYW5nZSBwYXR0ZXJuICovCisJCQkJaWYgKChvcGluZm8gJiBPRl9DSEVDS0VEKSB8fCBwdGVzdChvcDEtPmwubikpIHsKKwkJCQkJb3AtPmluZm8gfD0gT0ZfQ0hFQ0tFRDsKKwkJCQkJaWYgKHB0ZXN0KG9wMS0+ci5uKSkKKwkJCQkJCW9wLT5pbmZvICY9IH5PRl9DSEVDS0VEOworCQkJCQlvcCA9IG9wLT5hLm47CisJCQkJfSBlbHNlIHsKKwkJCQkJb3AgPSBvcC0+ci5uOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJb3AgPSBwdGVzdChvcDEpID8gb3AtPmEubiA6IG9wLT5yLm47CisJCQl9CisJCQlicmVhazsKKworCQkvKiBqdXN0IGV2YWx1YXRlIGFuIGV4cHJlc3Npb24sIGFsc28gdXNlZCBhcyB1bmNvbmRpdGlvbmFsIGp1bXAgKi8KKwkJY2FzZSBYQyggT0NfRVhFQyApOgorCQkJYnJlYWs7CisKKwkJLyogYnJhbmNoLCB1c2VkIGluIGlmLWVsc2UgYW5kIHZhcmlvdXMgbG9vcHMgKi8KKwkJY2FzZSBYQyggT0NfQlIgKToKKwkJCW9wID0gaXN0cnVlKEwudikgPyBvcC0+YS5uIDogb3AtPnIubjsKKwkJCWJyZWFrOworCisJCS8qIGluaXRpYWxpemUgZm9yLWluIGxvb3AgKi8KKwkJY2FzZSBYQyggT0NfV0FMS0lOSVQgKToKKwkJCWhhc2h3YWxrX2luaXQoTC52LCBpYW1hcnJheShSLnYpKTsKKwkJCWJyZWFrOworCisJCS8qIGdldCBuZXh0IGFycmF5IGl0ZW0gKi8KKwkJY2FzZSBYQyggT0NfV0FMS05FWFQgKToKKwkJCW9wID0gaGFzaHdhbGtfbmV4dChMLnYpID8gb3AtPmEubiA6IG9wLT5yLm47CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19QUklOVCApOgorCQljYXNlIFhDKCBPQ19QUklOVEYgKTogeworCQkJRklMRSAqRiA9IHN0ZG91dDsKKworCQkJaWYgKG9wLT5yLm4pIHsKKwkJCQlyc3RyZWFtICpyc20gPSBuZXdmaWxlKFIucyk7CisJCQkJaWYgKCFyc20tPkYpIHsKKwkJCQkJaWYgKG9wbiA9PSAnfCcpIHsKKwkJCQkJCXJzbS0+RiA9IHBvcGVuKFIucywgInciKTsKKwkJCQkJCWlmIChyc20tPkYgPT0gTlVMTCkKKwkJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInBvcGVuIik7CisJCQkJCQlyc20tPmlzX3BpcGUgPSAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJcnNtLT5GID0geGZvcGVuKFIucywgb3BuPT0ndycgPyAidyIgOiAiYSIpOworCQkJCQl9CisJCQkJfQorCQkJCUYgPSByc20tPkY7CisJCQl9CisKKwkJCWlmICgob3BpbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19QUklOVCkgeworCQkJCWlmICghb3AxKSB7CisJCQkJCWZwdXRzKGdldHZhcl9zKGludHZhcltGMF0pLCBGKTsKKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAob3AxKSB7CisJCQkJCQl2YXIgKnYgPSBldmFsdWF0ZShuZXh0YXJnKCZvcDEpLCB2MSk7CisJCQkJCQlpZiAodi0+dHlwZSAmIFZGX05VTUJFUikgeworCQkJCQkJCWZtdF9udW0oZ19idWYsIE1BWFZBUkZNVCwgZ2V0dmFyX3MoaW50dmFyW09GTVRdKSwKKwkJCQkJCQkJCWdldHZhcl9pKHYpLCBUUlVFKTsKKwkJCQkJCQlmcHV0cyhnX2J1ZiwgRik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWZwdXRzKGdldHZhcl9zKHYpLCBGKTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKG9wMSkKKwkJCQkJCQlmcHV0cyhnZXR2YXJfcyhpbnR2YXJbT0ZTXSksIEYpOworCQkJCQl9CisJCQkJfQorCQkJCWZwdXRzKGdldHZhcl9zKGludHZhcltPUlNdKSwgRik7CisKKwkJCX0gZWxzZSB7CS8qIE9DX1BSSU5URiAqLworCQkJCWNoYXIgKnMgPSBhd2tfcHJpbnRmKG9wMSk7CisJCQkJZnB1dHMocywgRik7CisJCQkJZnJlZShzKTsKKwkJCX0KKwkJCWZmbHVzaChGKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfREVMRVRFICk6IHsKKwkJCXVpbnQzMl90IGluZm8gPSBvcDEtPmluZm8gJiBPUENMU01BU0s7CisJCQl2YXIgKnY7CisKKwkJCWlmIChpbmZvID09IE9DX1ZBUikgeworCQkJCXYgPSBvcDEtPmwudjsKKwkJCX0gZWxzZSBpZiAoaW5mbyA9PSBPQ19GTkFSRykgeworCQkJCXYgPSAmZm5hcmdzW29wMS0+bC5haWR4XTsKKwkJCX0gZWxzZSB7CisJCQkJc3ludGF4X2Vycm9yKEVNU0dfTk9UX0FSUkFZKTsKKwkJCX0KKworCQkJaWYgKG9wMS0+ci5uKSB7CisJCQkJY29uc3QgY2hhciAqczsKKwkJCQljbHJ2YXIoTC52KTsKKwkJCQlzID0gZ2V0dmFyX3MoZXZhbHVhdGUob3AxLT5yLm4sIHYxKSk7CisJCQkJaGFzaF9yZW1vdmUoaWFtYXJyYXkodiksIHMpOworCQkJfSBlbHNlIHsKKwkJCQljbGVhcl9hcnJheShpYW1hcnJheSh2KSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgWEMoIE9DX05FV1NPVVJDRSApOgorCQkJZ19wcm9nbmFtZSA9IG9wLT5sLm5ld19wcm9nbmFtZTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1JFVFVSTiApOgorCQkJY29weXZhcihyZXMsIEwudik7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19ORVhURklMRSApOgorCQkJbmV4dGZpbGUgPSBUUlVFOworCQljYXNlIFhDKCBPQ19ORVhUICk6CisJCQluZXh0cmVjID0gVFJVRTsKKwkJY2FzZSBYQyggT0NfRE9ORSApOgorCQkJY2xydmFyKHJlcyk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19FWElUICk6CisJCQlhd2tfZXhpdChMX2QpOworCisJCS8qIC0tIHJlY3Vyc2l2ZSBub2RlIHR5cGUgLS0gKi8KKworCQljYXNlIFhDKCBPQ19WQVIgKToKKwkJCUwudiA9IG9wLT5sLnY7CisJCQlpZiAoTC52ID09IGludHZhcltORl0pCisJCQkJc3BsaXRfZjAoKTsKKwkJCWdvdG8gdl9jb250OworCisJCWNhc2UgWEMoIE9DX0ZOQVJHICk6CisJCQlMLnYgPSAmZm5hcmdzW29wLT5sLmFpZHhdOworIHZfY29udDoKKwkJCXJlcyA9IG9wLT5yLm4gPyBmaW5kdmFyKGlhbWFycmF5KEwudiksIFIucykgOiBMLnY7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19JTiApOgorCQkJc2V0dmFyX2kocmVzLCBoYXNoX3NlYXJjaChpYW1hcnJheShSLnYpLCBMLnMpID8gMSA6IDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfUkVHRVhQICk6CisJCQlvcDEgPSBvcDsKKwkJCUwucyA9IGdldHZhcl9zKGludHZhcltGMF0pOworCQkJZ290byByZV9jb250OworCisJCWNhc2UgWEMoIE9DX01BVENIICk6CisJCQlvcDEgPSBvcC0+ci5uOworIHJlX2NvbnQ6CisJCQl7CisJCQkJcmVnZXhfdCAqcmUgPSBhc19yZWdleChvcDEsICZzcmVnKTsKKwkJCQlpbnQgaSA9IHJlZ2V4ZWMocmUsIEwucywgMCwgTlVMTCwgMCk7CisJCQkJaWYgKHJlID09ICZzcmVnKQorCQkJCQlyZWdmcmVlKHJlKTsKKwkJCQlzZXR2YXJfaShyZXMsIChpID09IDApIF4gKG9wbiA9PSAnIScpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX01PVkUgKToKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJNT1ZFXG4iKTsKKwkJCS8qIGlmIHNvdXJjZSBpcyBhIHRlbXBvcmFyeSBzdHJpbmcsIGp1c2sgcmVsaW5rIGl0IHRvIGRlc3QgKi8KKy8vRGlzYWJsZWQ6IGlmIFIudiBpcyBudW1lcmljIGJ1dCBoYXBwZW5zIHRvIGhhdmUgY2FjaGVkIFIudi0+c3RyaW5nLAorLy90aGVuIEwudiBlbmRzIHVwIGJlaW5nIGEgc3RyaW5nLCB3aGljaCBpcyB3cm9uZworLy8JCQlpZiAoUi52ID09IHYxKzEgJiYgUi52LT5zdHJpbmcpIHsKKy8vCQkJCXJlcyA9IHNldHZhcl9wKEwudiwgUi52LT5zdHJpbmcpOworLy8JCQkJUi52LT5zdHJpbmcgPSBOVUxMOworLy8JCQl9IGVsc2UgeworCQkJCXJlcyA9IGNvcHl2YXIoTC52LCBSLnYpOworLy8JCQl9CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19URVJOQVJZICk6CisJCQlpZiAoKG9wLT5yLm4tPmluZm8gJiBPUENMU01BU0spICE9IE9DX0NPTE9OKQorCQkJCXN5bnRheF9lcnJvcihFTVNHX1BPU1NJQkxFX0VSUk9SKTsKKwkJCXJlcyA9IGV2YWx1YXRlKGlzdHJ1ZShMLnYpID8gb3AtPnIubi0+bC5uIDogb3AtPnIubi0+ci5uLCByZXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfRlVOQyApOiB7CisJCQl2YXIgKnZiZWcsICp2OworCQkJY29uc3QgY2hhciAqc3ZfcHJvZ25hbWU7CisKKwkJCWlmICghb3AtPnIuZi0+Ym9keS5maXJzdCkKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19VTkRFRl9GVU5DKTsKKworCQkJdmJlZyA9IHYgPSBudmFsbG9jKG9wLT5yLmYtPm5hcmdzICsgMSk7CisJCQl3aGlsZSAob3AxKSB7CisJCQkJdmFyICphcmcgPSBldmFsdWF0ZShuZXh0YXJnKCZvcDEpLCB2MSk7CisJCQkJY29weXZhcih2LCBhcmcpOworCQkJCXYtPnR5cGUgfD0gVkZfQ0hJTEQ7CisJCQkJdi0+eC5wYXJlbnQgPSBhcmc7CisJCQkJaWYgKCsrdiAtIHZiZWcgPj0gb3AtPnIuZi0+bmFyZ3MpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQl2ID0gZm5hcmdzOworCQkJZm5hcmdzID0gdmJlZzsKKwkJCXN2X3Byb2duYW1lID0gZ19wcm9nbmFtZTsKKworCQkJcmVzID0gZXZhbHVhdGUob3AtPnIuZi0+Ym9keS5maXJzdCwgcmVzKTsKKworCQkJZ19wcm9nbmFtZSA9IHN2X3Byb2duYW1lOworCQkJbnZmcmVlKGZuYXJncyk7CisJCQlmbmFyZ3MgPSB2OworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgWEMoIE9DX0dFVExJTkUgKToKKwkJY2FzZSBYQyggT0NfUEdFVExJTkUgKTogeworCQkJcnN0cmVhbSAqcnNtOworCQkJaW50IGk7CisKKwkJCWlmIChvcDEpIHsKKwkJCQlyc20gPSBuZXdmaWxlKEwucyk7CisJCQkJaWYgKCFyc20tPkYpIHsKKwkJCQkJaWYgKChvcGluZm8gJiBPUENMU01BU0spID09IE9DX1BHRVRMSU5FKSB7CisJCQkJCQlyc20tPkYgPSBwb3BlbihMLnMsICJyIik7CisJCQkJCQlyc20tPmlzX3BpcGUgPSBUUlVFOworCQkJCQl9IGVsc2UgeworCQkJCQkJcnNtLT5GID0gZm9wZW5fZm9yX3JlYWQoTC5zKTsgIC8qIG5vdCB4Zm9wZW4hICovCisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghaUYpCisJCQkJCWlGID0gbmV4dF9pbnB1dF9maWxlKCk7CisJCQkJcnNtID0gaUY7CisJCQl9CisKKwkJCWlmICghcnNtLT5GKSB7CisJCQkJc2V0dmFyX2koaW50dmFyW0VSUk5PXSwgZXJybm8pOworCQkJCXNldHZhcl9pKHJlcywgLTEpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIW9wLT5yLm4pCisJCQkJUi52ID0gaW50dmFyW0YwXTsKKworCQkJaSA9IGF3a19nZXRsaW5lKHJzbSwgUi52KTsKKwkJCWlmIChpID4gMCAmJiAhb3AxKSB7CisJCQkJaW5jdmFyKGludHZhcltGTlJdKTsKKwkJCQlpbmN2YXIoaW50dmFyW05SXSk7CisJCQl9CisJCQlzZXR2YXJfaShyZXMsIGkpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBzaW1wbGUgYnVpbHRpbnMgKi8KKwkJY2FzZSBYQyggT0NfRkJMVElOICk6IHsKKwkJCWRvdWJsZSBSX2QgPSBSX2Q7IC8qIGZvciBjb21waWxlciAqLworCisJCQlzd2l0Y2ggKG9wbikgeworCQkJY2FzZSBGX2luOgorCQkJCVJfZCA9IChpbnQpTF9kOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfcm46CisJCQkJUl9kID0gKGRvdWJsZSlyYW5kKCkgLyAoZG91YmxlKVJBTkRfTUFYOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfY286CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FXS19MSUJNKSB7CisJCQkJCVJfZCA9IGNvcyhMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRl9leDoKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pIHsKKwkJCQkJUl9kID0gZXhwKExfZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBGX2xnOgorCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkgeworCQkJCQlSX2QgPSBsb2coTF9kKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIEZfc2k6CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FXS19MSUJNKSB7CisJCQkJCVJfZCA9IHNpbihMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRl9zcToKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pIHsKKwkJCQkJUl9kID0gc3FydChMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19OT19NQVRIKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGX3NyOgorCQkJCVJfZCA9IChkb3VibGUpc2VlZDsKKwkJCQlzZWVkID0gb3AxID8gKHVuc2lnbmVkKUxfZCA6ICh1bnNpZ25lZCl0aW1lKE5VTEwpOworCQkJCXNyYW5kKHNlZWQpOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfdGk6CisJCQkJUl9kID0gdGltZShOVUxMKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGX2xlOgorCQkJCWlmICghb3AxKQorCQkJCQlMLnMgPSBnZXR2YXJfcyhpbnR2YXJbRjBdKTsKKwkJCQlSX2QgPSBzdHJsZW4oTC5zKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGX3N5OgorCQkJCWZmbHVzaF9hbGwoKTsKKwkJCQlSX2QgPSAoRU5BQkxFX0ZFQVRVUkVfQUxMT1dfRVhFQyAmJiBMLnMgJiYgKkwucykKKwkJCQkJCT8gKHN5c3RlbShMLnMpID4+IDgpIDogMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGX2ZmOgorCQkJCWlmICghb3AxKSB7CisJCQkJCWZmbHVzaChzdGRvdXQpOworCQkJCX0gZWxzZSBpZiAoTC5zICYmICpMLnMpIHsKKwkJCQkJcnN0cmVhbSAqcnNtID0gbmV3ZmlsZShMLnMpOworCQkJCQlmZmx1c2gocnNtLT5GKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmZmx1c2hfYWxsKCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEZfY2w6IHsKKwkJCQlyc3RyZWFtICpyc207CisJCQkJaW50IGVyciA9IDA7CisJCQkJcnNtID0gKHJzdHJlYW0gKiloYXNoX3NlYXJjaChmZGhhc2gsIEwucyk7CisJCQkJZGVidWdfcHJpbnRmX2V2YWwoIk9DX0ZCTFRJTiBGX2NsIHJzbTolcFxuIiwgcnNtKTsKKwkJCQlpZiAocnNtKSB7CisJCQkJCWRlYnVnX3ByaW50Zl9ldmFsKCJPQ19GQkxUSU4gRl9jbCAiCisJCQkJCQkicnNtLT5pc19waXBlOiVkLCAtPkY6JXBcbiIsCisJCQkJCQlyc20tPmlzX3BpcGUsIHJzbS0+Rik7CisJCQkJCS8qIENhbiBiZSBOVUxMIGlmIG9wZW4gZmFpbGVkLiBFeGFtcGxlOgorCQkJCQkgKiBnZXRsaW5lIGxpbmUgPCJkb2VzbnRfZXhpc3QiOworCQkJCQkgKiBjbG9zZSgiZG9lc250X2V4aXN0Iik7IDwtLS0gaGVyZSByc20tPkYgaXMgTlVMTAorCQkJCQkgKi8KKwkJCQkJaWYgKHJzbS0+RikKKwkJCQkJCWVyciA9IHJzbS0+aXNfcGlwZSA/IHBjbG9zZShyc20tPkYpIDogZmNsb3NlKHJzbS0+Rik7CisJCQkJCWZyZWUocnNtLT5idWZmZXIpOworCQkJCQloYXNoX3JlbW92ZShmZGhhc2gsIEwucyk7CisJCQkJfQorCQkJCWlmIChlcnIpCisJCQkJCXNldHZhcl9pKGludHZhcltFUlJOT10sIGVycm5vKTsKKwkJCQlSX2QgPSAoZG91YmxlKWVycjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCX0gLyogc3dpdGNoICovCisJCQlzZXR2YXJfaShyZXMsIFJfZCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgWEMoIE9DX0JVSUxUSU4gKToKKwkJCXJlcyA9IGV4ZWNfYnVpbHRpbihvcCwgcmVzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1NQUklOVEYgKToKKwkJCXNldHZhcl9wKHJlcywgYXdrX3ByaW50ZihvcDEpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1VOQVJZICk6IHsKKwkJCWRvdWJsZSBMZCwgUl9kOworCisJCQlMZCA9IFJfZCA9IGdldHZhcl9pKFIudik7CisJCQlzd2l0Y2ggKG9wbikgeworCQkJY2FzZSAnUCc6CisJCQkJTGQgPSArK1JfZDsKKwkJCQlnb3RvIHJfb3BfY2hhbmdlOworCQkJY2FzZSAncCc6CisJCQkJUl9kKys7CisJCQkJZ290byByX29wX2NoYW5nZTsKKwkJCWNhc2UgJ00nOgorCQkJCUxkID0gLS1SX2Q7CisJCQkJZ290byByX29wX2NoYW5nZTsKKwkJCWNhc2UgJ20nOgorCQkJCVJfZC0tOworIHJfb3BfY2hhbmdlOgorCQkJCXNldHZhcl9pKFIudiwgUl9kKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyEnOgorCQkJCUxkID0gIWlzdHJ1ZShSLnYpOworCQkJCWJyZWFrOworCQkJY2FzZSAnLSc6CisJCQkJTGQgPSAtUl9kOworCQkJCWJyZWFrOworCQkJfQorCQkJc2V0dmFyX2kocmVzLCBMZCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgWEMoIE9DX0ZJRUxEICk6IHsKKwkJCWludCBpID0gKGludClnZXR2YXJfaShSLnYpOworCQkJaWYgKGkgPT0gMCkgeworCQkJCXJlcyA9IGludHZhcltGMF07CisJCQl9IGVsc2UgeworCQkJCXNwbGl0X2YwKCk7CisJCQkJaWYgKGkgPiBuZmllbGRzKQorCQkJCQlmc3JlYWxsb2MoaSk7CisJCQkJcmVzID0gJkZpZWxkc1tpIC0gMV07CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGNvbmNhdGVuYXRpb24gKCIgIikgYW5kIGluZGV4IGpvaW5pbmcgKCIsIikgKi8KKwkJY2FzZSBYQyggT0NfQ09OQ0FUICk6CisJCWNhc2UgWEMoIE9DX0NPTU1BICk6IHsKKwkJCWNvbnN0IGNoYXIgKnNlcCA9ICIiOworCQkJaWYgKChvcGluZm8gJiBPUENMU01BU0spID09IE9DX0NPTU1BKQorCQkJCXNlcCA9IGdldHZhcl9zKGludHZhcltTVUJTRVBdKTsKKwkJCXNldHZhcl9wKHJlcywgeGFzcHJpbnRmKCIlcyVzJXMiLCBMLnMsIHNlcCwgUi5zKSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgWEMoIE9DX0xBTkQgKToKKwkJCXNldHZhcl9pKHJlcywgaXN0cnVlKEwudikgPyBwdGVzdChvcC0+ci5uKSA6IDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfTE9SICk6CisJCQlzZXR2YXJfaShyZXMsIGlzdHJ1ZShMLnYpID8gMSA6IHB0ZXN0KG9wLT5yLm4pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX0JJTkFSWSApOgorCQljYXNlIFhDKCBPQ19SRVBMQUNFICk6IHsKKwkJCWRvdWJsZSBSX2QgPSBnZXR2YXJfaShSLnYpOworCQkJZGVidWdfcHJpbnRmX2V2YWwoIkJJTkFSWS9SRVBMQUNFOiBSX2Q6JWYgb3BuOiVjXG4iLCBSX2QsIG9wbik7CisJCQlzd2l0Y2ggKG9wbikgeworCQkJY2FzZSAnKyc6CisJCQkJTF9kICs9IFJfZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy0nOgorCQkJCUxfZCAtPSBSX2Q7CisJCQkJYnJlYWs7CisJCQljYXNlICcqJzoKKwkJCQlMX2QgKj0gUl9kOworCQkJCWJyZWFrOworCQkJY2FzZSAnLyc6CisJCQkJaWYgKFJfZCA9PSAwKQorCQkJCQlzeW50YXhfZXJyb3IoRU1TR19ESVZfQllfWkVSTyk7CisJCQkJTF9kIC89IFJfZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyYnOgorCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkKKwkJCQkJTF9kID0gcG93KExfZCwgUl9kKTsKKwkJCQllbHNlCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX05PX01BVEgpOworCQkJCWJyZWFrOworCQkJY2FzZSAnJSc6CisJCQkJaWYgKFJfZCA9PSAwKQorCQkJCQlzeW50YXhfZXJyb3IoRU1TR19ESVZfQllfWkVSTyk7CisJCQkJTF9kIC09IChpbnQpKExfZCAvIFJfZCkgKiBSX2Q7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiQklOQVJZL1JFUExBQ0UgcmVzdWx0OiVmXG4iLCBMX2QpOworCQkJcmVzID0gc2V0dmFyX2koKChvcGluZm8gJiBPUENMU01BU0spID09IE9DX0JJTkFSWSkgPyByZXMgOiBMLnYsIExfZCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgWEMoIE9DX0NPTVBBUkUgKTogeworCQkJaW50IGkgPSBpOyAvKiBmb3IgY29tcGlsZXIgKi8KKwkJCWRvdWJsZSBMZDsKKworCQkJaWYgKGlzX251bWVyaWMoTC52KSAmJiBpc19udW1lcmljKFIudikpIHsKKwkJCQlMZCA9IGdldHZhcl9pKEwudikgLSBnZXR2YXJfaShSLnYpOworCQkJfSBlbHNlIHsKKwkJCQljb25zdCBjaGFyICpsID0gZ2V0dmFyX3MoTC52KTsKKwkJCQljb25zdCBjaGFyICpyID0gZ2V0dmFyX3MoUi52KTsKKwkJCQlMZCA9IGljYXNlID8gc3RyY2FzZWNtcChsLCByKSA6IHN0cmNtcChsLCByKTsKKwkJCX0KKwkJCXN3aXRjaCAob3BuICYgMHhmZSkgeworCQkJY2FzZSAwOgorCQkJCWkgPSAoTGQgPiAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpID0gKExkID49IDApOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWkgPSAoTGQgPT0gMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXR2YXJfaShyZXMsIChpID09IDApIF4gKG9wbiAmIDEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJCXN5bnRheF9lcnJvcihFTVNHX1BPU1NJQkxFX0VSUk9SKTsKKwkJfQorCQlpZiAoKG9waW5mbyAmIE9QQ0xTTUFTSykgPD0gU0hJRlRfVElMX1RISVMpCisJCQlvcCA9IG9wLT5hLm47CisJCWlmICgob3BpbmZvICYgT1BDTFNNQVNLKSA+PSBSRUNVUl9GUk9NX1RISVMpCisJCQlicmVhazsKKwkJaWYgKG5leHRyZWMpCisJCQlicmVhazsKKwl9IC8qIHdoaWxlIChvcCkgKi8KKworCW52ZnJlZSh2MSk7CisJZGVidWdfcHJpbnRmX2V2YWwoInJldHVybmluZyBmcm9tICVzKCk6ICVwXG4iLCBfX2Z1bmNfXywgcmVzKTsKKwlyZXR1cm4gcmVzOworI3VuZGVmIGZuYXJncworI3VuZGVmIHNlZWQKKyN1bmRlZiBzcmVnCit9CisKKworLyogLS0tLS0tLS0gbWFpbiAmIGNvLiAtLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGF3a19leGl0KGludCByKQoreworCXZhciB0djsKKwl1bnNpZ25lZCBpOworCWhhc2hfaXRlbSAqaGk7CisKKwl6ZXJvX291dF92YXIoJnR2KTsKKworCWlmICghZXhpdGluZykgeworCQlleGl0aW5nID0gVFJVRTsKKwkJbmV4dHJlYyA9IEZBTFNFOworCQlldmFsdWF0ZShlbmRzZXEuZmlyc3QsICZ0dik7CisJfQorCisJLyogd2FpdGluZyBmb3IgY2hpbGRyZW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmRoYXNoLT5jc2l6ZTsgaSsrKSB7CisJCWhpID0gZmRoYXNoLT5pdGVtc1tpXTsKKwkJd2hpbGUgKGhpKSB7CisJCQlpZiAoaGktPmRhdGEucnMuRiAmJiBoaS0+ZGF0YS5ycy5pc19waXBlKQorCQkJCXBjbG9zZShoaS0+ZGF0YS5ycy5GKTsKKwkJCWhpID0gaGktPm5leHQ7CisJCX0KKwl9CisKKwlleGl0KHIpOworfQorCisvKiBpZiBleHByIGxvb2tzIGxpa2UgInZhcj12YWx1ZSIsIHBlcmZvcm0gYXNzaWdubWVudCBhbmQgcmV0dXJuIDEsCisgKiBvdGhlcndpc2UgcmV0dXJuIDAgKi8KK3N0YXRpYyBpbnQgaXNfYXNzaWdubWVudChjb25zdCBjaGFyICpleHByKQoreworCWNoYXIgKmV4cHJjLCAqdmFsLCAqcywgKnMxOworCisJaWYgKCFpc2FsbnVtXygqZXhwcikgfHwgKHZhbCA9IHN0cmNocihleHByLCAnPScpKSA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlleHByYyA9IHhzdHJkdXAoZXhwcik7CisJdmFsID0gZXhwcmMgKyAodmFsIC0gZXhwcik7CisJKnZhbCsrID0gJ1wwJzsKKworCXMgPSBzMSA9IHZhbDsKKwl3aGlsZSAoKCpzMSA9IG5leHRjaGFyKCZzKSkgIT0gJ1wwJykKKwkJczErKzsKKworCXNldHZhcl91KG5ld3ZhcihleHByYyksIHZhbCk7CisJZnJlZShleHByYyk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIHN3aXRjaCB0byBuZXh0IGlucHV0IGZpbGUgKi8KK3N0YXRpYyByc3RyZWFtICpuZXh0X2lucHV0X2ZpbGUodm9pZCkKK3sKKyNkZWZpbmUgcnNtICAgICAgICAgIChHLm5leHRfaW5wdXRfZmlsZV9fcnNtKQorI2RlZmluZSBmaWxlc19oYXBwZW4gKEcubmV4dF9pbnB1dF9maWxlX19maWxlc19oYXBwZW4pCisKKwlGSUxFICpGID0gTlVMTDsKKwljb25zdCBjaGFyICpmbmFtZSwgKmluZDsKKworCWlmIChyc20uRikKKwkJZmNsb3NlKHJzbS5GKTsKKwlyc20uRiA9IE5VTEw7CisJcnNtLnBvcyA9IHJzbS5hZHYgPSAwOworCisJZG8geworCQlpZiAoZ2V0dmFyX2koaW50dmFyW0FSR0lORF0pKzEgPj0gZ2V0dmFyX2koaW50dmFyW0FSR0NdKSkgeworCQkJaWYgKGZpbGVzX2hhcHBlbikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWZuYW1lID0gIi0iOworCQkJRiA9IHN0ZGluOworCQl9IGVsc2UgeworCQkJaW5kID0gZ2V0dmFyX3MoaW5jdmFyKGludHZhcltBUkdJTkRdKSk7CisJCQlmbmFtZSA9IGdldHZhcl9zKGZpbmR2YXIoaWFtYXJyYXkoaW50dmFyW0FSR1ZdKSwgaW5kKSk7CisJCQlpZiAoZm5hbWUgJiYgKmZuYW1lICYmICFpc19hc3NpZ25tZW50KGZuYW1lKSkKKwkJCQlGID0geGZvcGVuX3N0ZGluKGZuYW1lKTsKKwkJfQorCX0gd2hpbGUgKCFGKTsKKworCWZpbGVzX2hhcHBlbiA9IFRSVUU7CisJc2V0dmFyX3MoaW50dmFyW0ZJTEVOQU1FXSwgZm5hbWUpOworCXJzbS5GID0gRjsKKwlyZXR1cm4gJnJzbTsKKyN1bmRlZiByc20KKyN1bmRlZiBmaWxlc19oYXBwZW4KK30KKworaW50IGF3a19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYXdrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwljaGFyICpvcHRfRiwgKm9wdF9XOworCWxsaXN0X3QgKmxpc3RfdiA9IE5VTEw7CisJbGxpc3RfdCAqbGlzdF9mID0gTlVMTDsKKwlpbnQgaSwgajsKKwl2YXIgKnY7CisJdmFyIHR2OworCWNoYXIgKiplbnZwOworCWNoYXIgKnZuYW1lcyA9IChjaGFyICopdk5hbWVzOyAvKiBjaGVhdCAqLworCWNoYXIgKnZ2YWx1ZXMgPSAoY2hhciAqKXZWYWx1ZXM7CisKKwlJTklUX0coKTsKKworCS8qIFVuZG8gYnVzeWJveC5jLCBvciBlbHNlIHN0cnRvZCBtYXkgZWF0ICcsJyEgVGhpcyBicmVha3MgcGFyc2luZzoKKwkgKiAkMSwkMiA9PSAnJDEsJyAnJDInLCBOT1QgJyQxJyAnLCcgJyQyJyAqLworCWlmIChFTkFCTEVfTE9DQUxFX1NVUFBPUlQpCisJCXNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworCisJemVyb19vdXRfdmFyKCZ0dik7CisKKwkvKiBhbGxvY2F0ZSBnbG9iYWwgYnVmZmVyICovCisJZ19idWYgPSB4bWFsbG9jKE1BWFZBUkZNVCArIDEpOworCisJdmhhc2ggPSBoYXNoX2luaXQoKTsKKwlhaGFzaCA9IGhhc2hfaW5pdCgpOworCWZkaGFzaCA9IGhhc2hfaW5pdCgpOworCWZuaGFzaCA9IGhhc2hfaW5pdCgpOworCisJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmb3IgKGkgPSAwOyAqdm5hbWVzOyBpKyspIHsKKwkJaW50dmFyW2ldID0gdiA9IG5ld3ZhcihuZXh0d29yZCgmdm5hbWVzKSk7CisJCWlmICgqdnZhbHVlcyAhPSAnXDM3NycpCisJCQlzZXR2YXJfcyh2LCBuZXh0d29yZCgmdnZhbHVlcykpOworCQllbHNlCisJCQlzZXR2YXJfaSh2LCAwKTsKKworCQlpZiAoKnZuYW1lcyA9PSAnKicpIHsKKwkJCXYtPnR5cGUgfD0gVkZfU1BFQ0lBTDsKKwkJCXZuYW1lcysrOworCQl9CisJfQorCisJaGFuZGxlX3NwZWNpYWwoaW50dmFyW0ZTXSk7CisJaGFuZGxlX3NwZWNpYWwoaW50dmFyW1JTXSk7CisKKwluZXdmaWxlKCIvZGV2L3N0ZGluIiktPkYgPSBzdGRpbjsKKwluZXdmaWxlKCIvZGV2L3N0ZG91dCIpLT5GID0gc3Rkb3V0OworCW5ld2ZpbGUoIi9kZXYvc3RkZXJyIiktPkYgPSBzdGRlcnI7CisKKwkvKiBIdWgsIHBlb3BsZSByZXBvcnQgdGhhdCBzb21ldGltZXMgZW52aXJvbiBpcyBOVUxMLiBPaCB3ZWxsLiAqLworCWlmIChlbnZpcm9uKSBmb3IgKGVudnAgPSBlbnZpcm9uOyAqZW52cDsgZW52cCsrKSB7CisJCS8qIGVudmlyb24gaXMgd3JpdGFibGUsIHRodXMgd2UgZG9uJ3Qgc3RyZHVwIGl0IG5lZWRsZXNzbHkgKi8KKwkJY2hhciAqcyA9ICplbnZwOworCQljaGFyICpzMSA9IHN0cmNocihzLCAnPScpOworCQlpZiAoczEpIHsKKwkJCSpzMSA9ICdcMCc7CisJCQkvKiBCb3RoIGZpbmR2YXIgYW5kIHNldHZhcl91IHRha2UgY29uc3QgY2hhcioKKwkJCSAqIGFzIDJuZCBhcmcgLT4gZW52aXJvbm1lbnQgaXMgbm90IHRyYXNoZWQgKi8KKwkJCXNldHZhcl91KGZpbmR2YXIoaWFtYXJyYXkoaW50dmFyW0VOVklST05dKSwgcyksIHMxICsgMSk7CisJCQkqczEgPSAnPSc7CisJCX0KKwl9CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidjo6Zjo6IjsgLyogLXYgYW5kIC1mIGNhbiBvY2N1ciBtdWx0aXBsZSB0aW1lcyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJGOnY6ZjpXOiIsICZvcHRfRiwgJmxpc3RfdiwgJmxpc3RfZiwgJm9wdF9XKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKwlpZiAob3B0ICYgMHgxKQorCQlzZXR2YXJfcyhpbnR2YXJbRlNdLCBvcHRfRik7IC8vIC1GCisJd2hpbGUgKGxpc3RfdikgeyAvKiAtdiAqLworCQlpZiAoIWlzX2Fzc2lnbm1lbnQobGxpc3RfcG9wKCZsaXN0X3YpKSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisJaWYgKGxpc3RfZikgeyAvKiAtZiAqLworCQlkbyB7CisJCQljaGFyICpzID0gTlVMTDsKKwkJCUZJTEUgKmZyb21fZmlsZTsKKworCQkJZ19wcm9nbmFtZSA9IGxsaXN0X3BvcCgmbGlzdF9mKTsKKwkJCWZyb21fZmlsZSA9IHhmb3Blbl9zdGRpbihnX3Byb2duYW1lKTsKKwkJCS8qIG9uZSBieXRlIGlzIHJlc2VydmVkIGZvciBzb21lIHRyaWNrIGluIG5leHRfdG9rZW4gKi8KKwkJCWZvciAoaSA9IGogPSAxOyBqID4gMDsgaSArPSBqKSB7CisJCQkJcyA9IHhyZWFsbG9jKHMsIGkgKyA0MDk2KTsKKwkJCQlqID0gZnJlYWQocyArIGksIDEsIDQwOTQsIGZyb21fZmlsZSk7CisJCQl9CisJCQlzW2ldID0gJ1wwJzsKKwkJCWZjbG9zZShmcm9tX2ZpbGUpOworCQkJcGFyc2VfcHJvZ3JhbShzICsgMSk7CisJCQlmcmVlKHMpOworCQl9IHdoaWxlIChsaXN0X2YpOworCQlhcmdjKys7CisJfSBlbHNlIHsgLy8gbm8gLWY6IHRha2UgcHJvZ3JhbSBmcm9tIDFzdCBwYXJhbWV0ZXIKKwkJaWYgKCFhcmdjKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlnX3Byb2duYW1lID0gImNtZC4gbGluZSI7CisJCXBhcnNlX3Byb2dyYW0oKmFyZ3YrKyk7CisJfQorCWlmIChvcHQgJiAweDgpIC8vIC1XCisJCWJiX2Vycm9yX21zZygid2FybmluZzogdW5yZWNvZ25pemVkIG9wdGlvbiAnLVcgJXMnIGlnbm9yZWQiLCBvcHRfVyk7CisKKwkvKiBmaWxsIGluIEFSR1YgYXJyYXkgKi8KKwlzZXR2YXJfaShpbnR2YXJbQVJHQ10sIGFyZ2MpOworCXNldGFyaV91KGludHZhcltBUkdWXSwgMCwgImF3ayIpOworCWkgPSAwOworCXdoaWxlICgqYXJndikKKwkJc2V0YXJpX3UoaW50dmFyW0FSR1ZdLCArK2ksICphcmd2KyspOworCisJZXZhbHVhdGUoYmVnaW5zZXEuZmlyc3QsICZ0dik7CisJaWYgKCFtYWluc2VxLmZpcnN0ICYmICFlbmRzZXEuZmlyc3QpCisJCWF3a19leGl0KEVYSVRfU1VDQ0VTUyk7CisKKwkvKiBpbnB1dCBmaWxlIGNvdWxkIGFscmVhZHkgYmUgb3BlbmVkIGluIEJFR0lOIGJsb2NrICovCisJaWYgKCFpRikKKwkJaUYgPSBuZXh0X2lucHV0X2ZpbGUoKTsKKworCS8qIHBhc3NpbmcgdGhyb3VnaCBpbnB1dCBmaWxlcyAqLworCXdoaWxlIChpRikgeworCQluZXh0ZmlsZSA9IEZBTFNFOworCQlzZXR2YXJfaShpbnR2YXJbRk5SXSwgMCk7CisKKwkJd2hpbGUgKChpID0gYXdrX2dldGxpbmUoaUYsIGludHZhcltGMF0pKSA+IDApIHsKKwkJCW5leHRyZWMgPSBGQUxTRTsKKwkJCWluY3ZhcihpbnR2YXJbTlJdKTsKKwkJCWluY3ZhcihpbnR2YXJbRk5SXSk7CisJCQlldmFsdWF0ZShtYWluc2VxLmZpcnN0LCAmdHYpOworCisJCQlpZiAobmV4dGZpbGUpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IDApCisJCQlzeW50YXhfZXJyb3Ioc3RyZXJyb3IoZXJybm8pKTsKKworCQlpRiA9IG5leHRfaW5wdXRfZmlsZSgpOworCX0KKworCWF3a19leGl0KEVYSVRfU1VDQ0VTUyk7CisJLypyZXR1cm4gMDsqLworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9jbXAuYyBiL2VkaXRvcnMvY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlNmI5NwotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvY21wLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY21wIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgYnkgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzICh2aXJ0dWFsbHkpIGNvbXBsaWFudCAtLSB1c2VzIG5pY2VyIEdOVSBmb3JtYXQgZm9yIC1sLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9jbXAuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgY21wX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxdIFstc10gRklMRTEgW0ZJTEUyIiBJRl9ERVNLVE9QKCIgW1NLSVAxIFtTS0lQMl1dIikgIl0iCisvL3VzYWdlOiNkZWZpbmUgY21wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29tcGFyZSBGSUxFMSB3aXRoIEZJTEUyIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJV3JpdGUgdGhlIGJ5dGUgbnVtYmVycyAoZGVjaW1hbCkgYW5kIHZhbHVlcyAob2N0YWwpIgorLy91c2FnZTogICAgICJcbgkJZm9yIGFsbCBkaWZmZXJpbmcgYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCVF1aWV0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZm10X2VvZltdIEFMSUdOMSA9ICJjbXA6IEVPRiBvbiAlc1xuIjsKK3N0YXRpYyBjb25zdCBjaGFyIGZtdF9kaWZmZXJbXSBBTElHTjEgPSAiJXMgJXMgZGlmZmVyOiBjaGFyICUiT0ZGX0ZNVCJ1LCBsaW5lICV1XG4iOworLy8gVGhpcyBmbXRfbF9vcHQgdXNlcyBnbnUtaXNtcy4gIFNVU3YzIHdvdWxkIGJlICIlLjBzJS4wcyUiT0ZGX0ZNVCJ1ICVvICVvXG4iCitzdGF0aWMgY29uc3QgY2hhciBmbXRfbF9vcHRbXSBBTElHTjEgPSAiJS4wcyUuMHMlIk9GRl9GTVQidSAlM28gJTNvXG4iOworCitzdGF0aWMgY29uc3QgY2hhciBvcHRfY2hhcnNbXSBBTElHTjEgPSAic2wiOworI2RlZmluZSBDTVBfT1BUX3MgKDE8PDApCisjZGVmaW5lIENNUF9PUFRfbCAoMTw8MSkKKworaW50IGNtcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY21wX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpmcDEsICpmcDIsICpvdXRmaWxlID0gc3Rkb3V0OworCWNvbnN0IGNoYXIgKmZpbGVuYW1lMSwgKmZpbGVuYW1lMiA9ICItIjsKKwlvZmZfdCBza2lwMSA9IDAsIHNraXAyID0gMCwgY2hhcl9wb3MgPSAwOworCWludCBsaW5lX3BvcyA9IDE7IC8qIEhvcGVmdWxseSB3b24ndCBvdmVyZmxvdy4uLiAqLworCWNvbnN0IGNoYXIgKmZtdDsKKwlpbnQgYzEsIGMyOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgcmV0dmFsID0gMDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIgorCQkJSUZfREVTS1RPUCgiOj80IikKKwkJCUlGX05PVF9ERVNLVE9QKCI6PzIiKQorCQkJIjpsLS1zOnMtLWwiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIG9wdF9jaGFycyk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlmaWxlbmFtZTEgPSAqYXJndjsKKwlpZiAoKisrYXJndikgeworCQlmaWxlbmFtZTIgPSAqYXJndjsKKwkJaWYgKEVOQUJMRV9ERVNLVE9QICYmICorK2FyZ3YpIHsKKwkJCXNraXAxID0gWEFUT09GRigqYXJndik7CisJCQlpZiAoKisrYXJndikgeworCQkJCXNraXAyID0gWEFUT09GRigqYXJndik7CisJCQl9CisJCX0KKwl9CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOyAgLyogbWlzc2luZyBmaWxlIHJlc3VsdHMgaW4gZXhpdGNvZGUgMiAqLworCWlmIChvcHQgJiBDTVBfT1BUX3MpCisJCWxvZ21vZGUgPSAwOyAgLyogLXMgc3VwcHJlc3NlcyBvcGVuIGVycm9yIG1lc3NhZ2VzICovCisJZnAxID0geGZvcGVuX3N0ZGluKGZpbGVuYW1lMSk7CisJZnAyID0geGZvcGVuX3N0ZGluKGZpbGVuYW1lMik7CisJaWYgKGZwMSA9PSBmcDIpIHsJCS8qIFBhcmFub2lhIGNoZWNrLi4uIHN0ZGluID09IHN0ZGluPyAqLworCQkvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHJlYWRpbmcgc3RkaW4uICBOZWl0aGVyIGRvZXMgZ251IHdjLgorCQkgKiBCdXQgcGVyaGFwcyB3ZSBzaG91bGQsIHNvIHRoYXQgb3RoZXIgYXBwcyBkb3duIHRoZSBjaGFpbiBkb24ndAorCQkgKiBnZXQgdGhlIGlucHV0LiAgQ29uc2lkZXIgJ2VjaG8gaGVsbG8gfCAoY21wIC0gLSAmJiBjYXQgLSknLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCWxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworCisJaWYgKG9wdCAmIENNUF9PUFRfbCkKKwkJZm10ID0gZm10X2xfb3B0OworCWVsc2UKKwkJZm10ID0gZm10X2RpZmZlcjsKKworCWlmIChFTkFCTEVfREVTS1RPUCkgeworCQl3aGlsZSAoc2tpcDEpIHsgZ2V0YyhmcDEpOyBza2lwMS0tOyB9CisJCXdoaWxlIChza2lwMikgeyBnZXRjKGZwMik7IHNraXAyLS07IH0KKwl9CisJZG8geworCQljMSA9IGdldGMoZnAxKTsKKwkJYzIgPSBnZXRjKGZwMik7CisJCSsrY2hhcl9wb3M7CisJCWlmIChjMSAhPSBjMikgewkJCS8qIFJlbWVtYmVyOiBhIHJlYWQgZXJyb3IgbWF5IGhhdmUgb2NjdXJyZWQuICovCisJCQlyZXR2YWwgPSAxOwkJLyogQnV0IGFzc3VtZSB0aGUgZmlsZXMgYXJlIGRpZmZlcmVudCBmb3Igbm93LiAqLworCQkJaWYgKGMyID09IEVPRikgeworCQkJCS8qIFdlIGtub3cgdGhhdCBmcDEgaXNuJ3QgYXQgRU9GIG9yIGluIGFuIGVycm9yIHN0YXRlLiAgQnV0IHRvCisJCQkJICogc2F2ZSBzcGFjZSBiZWxvdywgdGhpbmdzIGFyZSBzZXR1cCB0byBleHBlY3QgYW4gRU9GIGluIGZwMQorCQkJCSAqIGlmIGFuIEVPRiBvY2N1cnJlZC4gIFNvLCBzd2FwIHRoaW5ncyBhcm91bmQuCisJCQkJICovCisJCQkJZnAxID0gZnAyOworCQkJCWZpbGVuYW1lMSA9IGZpbGVuYW1lMjsKKwkJCQljMSA9IGMyOworCQkJfQorCQkJaWYgKGMxID09IEVPRikgeworCQkJCWRpZV9pZl9mZXJyb3IoZnAxLCBmaWxlbmFtZTEpOworCQkJCWZtdCA9IGZtdF9lb2Y7CS8qIFdlbGwsIG5vIGVycm9yLCBzbyBpdCBtdXN0IHJlYWxseSBiZSBFT0YuICovCisJCQkJb3V0ZmlsZSA9IHN0ZGVycjsKKwkJCQkvKiBUaGVyZSBtYXkgaGF2ZSBiZWVuIG91dHB1dCB0byBzdGRvdXQgKG9wdGlvbiAtbCksIHNvCisJCQkJICogbWFrZSBzdXJlIHdlIGZmbHVzaCBiZWZvcmUgd3JpdGluZyB0byBzdGRlcnIuICovCisJCQkJZmZsdXNoX2FsbCgpOworCQkJfQorCQkJaWYgKCEob3B0ICYgQ01QX09QVF9zKSkgeworCQkJCWlmIChvcHQgJiBDTVBfT1BUX2wpIHsKKwkJCQkJbGluZV9wb3MgPSBjMTsJLyogbGluZV9wb3MgaXMgdW51c2VkIGluIHRoZSAtbCBjYXNlLiAqLworCQkJCX0KKwkJCQlmcHJpbnRmKG91dGZpbGUsIGZtdCwgZmlsZW5hbWUxLCBmaWxlbmFtZTIsIGNoYXJfcG9zLCBsaW5lX3BvcywgYzIpOworCQkJCWlmIChvcHQpIHsJLyogVGhpcyBtdXN0IGJlIC1sIHNpbmNlIG5vdCAtcy4gKi8KKwkJCQkJLyogSWYgd2UgZW5jb3VudGVyZWQgYW4gRU9GLAorCQkJCQkgKiB0aGUgd2hpbGUgY2hlY2sgd2lsbCBjYXRjaCBpdC4gKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGMxID09ICdcbicpIHsKKwkJCSsrbGluZV9wb3M7CisJCX0KKwl9IHdoaWxlIChjMSAhPSBFT0YpOworCisJZGllX2lmX2ZlcnJvcihmcDEsIGZpbGVuYW1lMSk7CisJZGllX2lmX2ZlcnJvcihmcDIsIGZpbGVuYW1lMik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9lZGl0b3JzL2RpZmYuYyBiL2VkaXRvcnMvZGlmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzMzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL2RpZmYuYwpAQCAtMCwwICsxLDEwMjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZGlmZiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveCwgYWRhcHRlZCBmcm9tIE9wZW5CU0QgZGlmZi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgTWF0aGV1cyBJenZla292IDxtaXp2ZWtvdkBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgUm9iZXJ0IFN1bGxpdmFuIDxjb2dpdG8uZXJnby5jb2dpdG9AaG90bWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+CisgKgorICogU3BvbnNvcmVkIGluIHBhcnQgYnkgdGhlIERlZmVuc2UgQWR2YW5jZWQgUmVzZWFyY2ggUHJvamVjdHMKKyAqIEFnZW5jeSAoREFSUEEpIGFuZCBBaXIgRm9yY2UgUmVzZWFyY2ggTGFib3JhdG9yeSwgQWlyIEZvcmNlCisgKiBNYXRlcmllbCBDb21tYW5kLCBVU0FGLCB1bmRlciBhZ3JlZW1lbnQgbnVtYmVyIEYzOTUwMi05OS0xLTA1MTIuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIHVzZXMgYW4gYWxnb3JpdGhtIGR1ZSB0byBIYXJvbGQgU3RvbmUsCisgKiB3aGljaCBmaW5kcyBhIHBhaXIgb2YgbG9uZ2VzdCBpZGVudGljYWwgc3Vic2VxdWVuY2VzIGluCisgKiB0aGUgdHdvIGZpbGVzLgorICoKKyAqIFRoZSBtYWpvciBnb2FsIGlzIHRvIGdlbmVyYXRlIHRoZSBtYXRjaCB2ZWN0b3IgSi4KKyAqIEpbaV0gaXMgdGhlIGluZGV4IG9mIHRoZSBsaW5lIGluIGZpbGUxIGNvcnJlc3BvbmRpbmcKKyAqIHRvIGxpbmUgaSBpbiBmaWxlMC4gSltpXSA9IDAgaWYgdGhlcmUgaXMgbm8KKyAqIHN1Y2ggbGluZSBpbiBmaWxlMS4KKyAqCisgKiBMaW5lcyBhcmUgaGFzaGVkIHNvIGFzIHRvIHdvcmsgaW4gY29yZS4gQWxsIHBvdGVudGlhbAorICogbWF0Y2hlcyBhcmUgbG9jYXRlZCBieSBzb3J0aW5nIHRoZSBsaW5lcyBvZiBlYWNoIGZpbGUKKyAqIG9uIHRoZSBoYXNoIChjYWxsZWQgInZhbHVlIikuIEluIHBhcnRpY3VsYXIsIHRoaXMKKyAqIGNvbGxlY3RzIHRoZSBlcXVpdmFsZW5jZSBjbGFzc2VzIGluIGZpbGUxIHRvZ2V0aGVyLgorICogU3Vicm91dGluZSBlcXVpdiByZXBsYWNlcyB0aGUgdmFsdWUgb2YgZWFjaCBsaW5lIGluCisgKiBmaWxlMCBieSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgaXRzCisgKiBtYXRjaGluZyBlcXVpdmFsZW5jZSBpbiAodGhlIHJlb3JkZXJlZCkgZmlsZTEuCisgKiBUbyBzYXZlIHNwYWNlIGVxdWl2IHNxdWVlemVzIGZpbGUxIGludG8gYSBzaW5nbGUKKyAqIGFycmF5IG1lbWJlciBpbiB3aGljaCB0aGUgZXF1aXZhbGVuY2UgY2xhc3NlcworICogYXJlIHNpbXBseSBjb25jYXRlbmF0ZWQsIGV4Y2VwdCB0aGF0IHRoZWlyIGZpcnN0CisgKiBtZW1iZXJzIGFyZSBmbGFnZ2VkIGJ5IGNoYW5naW5nIHNpZ24uCisgKgorICogTmV4dCB0aGUgaW5kaWNlcyB0aGF0IHBvaW50IGludG8gbWVtYmVyIGFyZSB1bnNvcnRlZCBpbnRvCisgKiBhcnJheSBjbGFzcyBhY2NvcmRpbmcgdG8gdGhlIG9yaWdpbmFsIG9yZGVyIG9mIGZpbGUwLgorICoKKyAqIFRoZSBjbGV2ZXJuZXNzIGxpZXMgaW4gcm91dGluZSBzdG9uZS4gVGhpcyBtYXJjaGVzCisgKiB0aHJvdWdoIHRoZSBsaW5lcyBvZiBmaWxlMCwgZGV2ZWxvcGluZyBhIHZlY3RvciBrbGlzdAorICogb2YgImstY2FuZGlkYXRlcyIuIEF0IHN0ZXAgaSBhIGstY2FuZGlkYXRlIGlzIGEgbWF0Y2hlZAorICogcGFpciBvZiBsaW5lcyB4LHkgKHggaW4gZmlsZTAsIHkgaW4gZmlsZTEpIHN1Y2ggdGhhdAorICogdGhlcmUgaXMgYSBjb21tb24gc3Vic2VxdWVuY2Ugb2YgbGVuZ3RoIGsKKyAqIGJldHdlZW4gdGhlIGZpcnN0IGkgbGluZXMgb2YgZmlsZTAgYW5kIHRoZSBmaXJzdCB5CisgKiBsaW5lcyBvZiBmaWxlMSwgYnV0IHRoZXJlIGlzIG5vIHN1Y2ggc3Vic2VxdWVuY2UgZm9yCisgKiBhbnkgc21hbGxlciB5LiB4IGlzIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSBtYXRlIHRvIHkKKyAqIHRoYXQgb2NjdXJzIGluIHN1Y2ggYSBzdWJzZXF1ZW5jZS4KKyAqCisgKiBXaGVuZXZlciBhbnkgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGVxdWl2YWxlbmNlIGNsYXNzIG9mCisgKiBsaW5lcyBpbiBmaWxlMSBtYXRhYmxlIHRvIGEgbGluZSBpbiBmaWxlMCBoYXMgc2VyaWFsIG51bWJlcgorICogbGVzcyB0aGFuIHRoZSB5IG9mIHNvbWUgay1jYW5kaWRhdGUsIHRoYXQgay1jYW5kaWRhdGUKKyAqIHdpdGggdGhlIHNtYWxsZXN0IHN1Y2ggeSBpcyByZXBsYWNlZC4gVGhlIG5ldworICogay1jYW5kaWRhdGUgaXMgY2hhaW5lZCAodmlhIHByZWQpIHRvIHRoZSBjdXJyZW50CisgKiBrLTEgY2FuZGlkYXRlIHNvIHRoYXQgdGhlIGFjdHVhbCBzdWJzZXF1ZW5jZSBjYW4KKyAqIGJlIHJlY292ZXJlZC4gV2hlbiBhIG1lbWJlciBoYXMgc2VyaWFsIG51bWJlciBncmVhdGVyCisgKiB0aGF0IHRoZSB5IG9mIGFsbCBrLWNhbmRpZGF0ZXMsIHRoZSBrbGlzdCBpcyBleHRlbmRlZC4KKyAqIEF0IHRoZSBlbmQsIHRoZSBsb25nZXN0IHN1YnNlcXVlbmNlIGlzIHB1bGxlZCBvdXQKKyAqIGFuZCBwbGFjZWQgaW4gdGhlIGFycmF5IEogYnkgdW5yYXZlbAorICoKKyAqIFdpdGggSiBpbiBoYW5kLCB0aGUgbWF0Y2hlcyB0aGVyZSByZWNvcmRlZCBhcmUKKyAqIGNoZWNrZWQgYWdhaW5zdCByZWFsaXR5IHRvIGFzc3VyZSB0aGF0IG5vIHNwdXJpb3VzCisgKiBtYXRjaGVzIGhhdmUgY3JlcHQgaW4gZHVlIHRvIGhhc2hpbmcuIElmIHRoZXkgaGF2ZSwKKyAqIHRoZXkgYXJlIGJyb2tlbiwgYW5kICJqYWNrcG90IiBpcyByZWNvcmRlZC0tYSBoYXJtbGVzcworICogbWF0dGVyIGV4Y2VwdCB0aGF0IGEgdHJ1ZSBtYXRjaCBmb3IgYSBzcHVyaW91c2x5CisgKiBtYXRlZCBsaW5lIG1heSBub3cgYmUgdW5uZWNlc3NhcmlseSByZXBvcnRlZCBhcyBhIGNoYW5nZS4KKyAqCisgKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBwcm9ncmFtIGNvbWVzIHNpbXBseQorICogZnJvbSB0cnlpbmcgdG8gbWluaW1pemUgY29yZSB1dGlsaXphdGlvbiBhbmQKKyAqIG1heGltaXplIHRoZSByYW5nZSBvZiBkb2FibGUgcHJvYmxlbXMgYnkgZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRpbmcgd2hhdCBpcyBuZWVkZWQgYW5kIHJldXNpbmcgd2hhdCBpcyBub3QuCisgKiBUaGUgY29yZSByZXF1aXJlbWVudHMgZm9yIHByb2JsZW1zIGxhcmdlciB0aGFuIHNvbWV3aGF0CisgKiBhcmUgKGluIHdvcmRzKSAyKmxlbmd0aChmaWxlMCkgKyBsZW5ndGgoZmlsZTEpICsKKyAqIDMqKG51bWJlciBvZiBrLWNhbmRpZGF0ZXMgaW5zdGFsbGVkKSwgdHlwaWNhbGx5IGFib3V0CisgKiA2biB3b3JkcyBmb3IgZmlsZXMgb2YgbGVuZ3RoIG4uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRpZmZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYWJCZGlOcXJUc3R3XSBbLUwgTEFCRUxdIFstUyBGSUxFXSBbLVUgTElORVNdIEZJTEUxIEZJTEUyIgorLy91c2FnZTojZGVmaW5lIGRpZmZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wYXJlIGZpbGVzIGxpbmUgYnkgbGluZSBhbmQgb3V0cHV0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0uXG4iCisvL3VzYWdlOiAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB1bmlmaWVkIGRpZmZzIG9ubHkuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCVRyZWF0IGFsbCBmaWxlcyBhcyB0ZXh0IgorLy91c2FnZTogICAgICJcbgktYglJZ25vcmUgY2hhbmdlcyBpbiB0aGUgYW1vdW50IG9mIHdoaXRlc3BhY2UiCisvL3VzYWdlOiAgICAgIlxuCS1CCUlnbm9yZSBjaGFuZ2VzIHdob3NlIGxpbmVzIGFyZSBhbGwgYmxhbmsiCisvL3VzYWdlOiAgICAgIlxuCS1kCVRyeSBoYXJkIHRvIGZpbmQgYSBzbWFsbGVyIHNldCBvZiBjaGFuZ2VzIgorLy91c2FnZTogICAgICJcbgktaQlJZ25vcmUgY2FzZSBkaWZmZXJlbmNlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJVXNlIExBQkVMIGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lIGluIHRoZSB1bmlmaWVkIGhlYWRlciIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JVHJlYXQgYWJzZW50IGZpbGVzIGFzIGVtcHR5IgorLy91c2FnZTogICAgICJcbgktcQlPdXRwdXQgb25seSB3aGV0aGVyIGZpbGVzIGRpZmZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJU3RhcnQgd2l0aCBGSUxFIHdoZW4gY29tcGFyaW5nIGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbgktVAlNYWtlIHRhYnMgbGluZSB1cCBieSBwcmVmaXhpbmcgYSB0YWIgd2hlbiBuZWNlc3NhcnkiCisvL3VzYWdlOiAgICAgIlxuCS1zCVJlcG9ydCB3aGVuIHR3byBmaWxlcyBhcmUgdGhlIHNhbWUiCisvL3VzYWdlOiAgICAgIlxuCS10CUV4cGFuZCB0YWJzIHRvIHNwYWNlcyBpbiBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1VCU91dHB1dCBMSU5FUyBsaW5lcyBvZiBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktdwlJZ25vcmUgYWxsIHdoaXRlc3BhY2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgMAorIyBkZWZpbmUgZGJnX2Vycm9yX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworZW51bSB7ICAgICAgICAgICAgICAgICAgLyogcHJpbnRfc3RhdHVzKCkgYW5kIGRpZmZyZWcoKSByZXR1cm4gdmFsdWVzICovCisJU1RBVFVTX1NBTUUsICAgIC8qIGZpbGVzIGFyZSB0aGUgc2FtZSAqLworCVNUQVRVU19ESUZGRVIsICAvKiBmaWxlcyBkaWZmZXIgKi8KKwlTVEFUVVNfQklOQVJZLCAgLyogYmluYXJ5IGZpbGVzIGRpZmZlciAqLworfTsKKworZW51bSB7ICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZGxpbmUgZmxhZ3MgKi8KKwlGTEFHX2EsCisJRkxBR19iLAorCUZMQUdfZCwKKwlGTEFHX2ksCisJRkxBR19MLCAgICAgICAgIC8qIG5ldmVyIHVzZWQsIGhhbmRsZWQgYnkgZ2V0b3B0MzIgKi8KKwlGTEFHX04sCisJRkxBR19xLAorCUZMQUdfciwKKwlGTEFHX3MsCisJRkxBR19TLCAgICAgICAgIC8qIG5ldmVyIHVzZWQsIGhhbmRsZWQgYnkgZ2V0b3B0MzIgKi8KKwlGTEFHX3QsCisJRkxBR19ULAorCUZMQUdfVSwgICAgICAgICAvKiBuZXZlciB1c2VkLCBoYW5kbGVkIGJ5IGdldG9wdDMyICovCisJRkxBR193LAorCUZMQUdfdSwgICAgICAgICAvKiBpZ25vcmVkLCB0aGlzIGlzIHRoZSBkZWZhdWx0ICovCisJRkxBR19wLCAgICAgICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUZMQUdfQiwKKwlGTEFHX0UsICAgICAgICAgLyogbm90IGltcGxlbWVudGVkICovCit9OworI2RlZmluZSBGTEFHKHgpICgxIDw8IEZMQUdfIyN4KQorCisvKiBXZSBjYWNoZSBmaWxlIHBvc2l0aW9uIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBzZWVraW5nICovCit0eXBlZGVmIHN0cnVjdCBGSUxFX2FuZF9wb3NfdCB7CisJRklMRSAqZnRfZnA7CisJb2ZmX3QgZnRfcG9zOworfSBGSUxFX2FuZF9wb3NfdDsKKworc3RydWN0IGdsb2JhbHMgeworCXNtYWxsaW50IGV4aXRfc3RhdHVzOworCWludCBvcHRfVV9jb250ZXh0OworCWNvbnN0IGNoYXIgKm90aGVyX2RpcjsKKwljaGFyICpsYWJlbFsyXTsKKwlzdHJ1Y3Qgc3RhdCBzdGJbMl07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGV4aXRfc3RhdHVzICAgICAgICAoRy5leGl0X3N0YXR1cyAgICAgICApCisjZGVmaW5lIG9wdF9VX2NvbnRleHQgICAgICAoRy5vcHRfVV9jb250ZXh0ICAgICApCisjZGVmaW5lIGxhYmVsICAgICAgICAgICAgICAoRy5sYWJlbCAgICAgICAgICAgICApCisjZGVmaW5lIHN0YiAgICAgICAgICAgICAgICAoRy5zdGIgICAgICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJb3B0X1VfY29udGV4dCA9IDM7IFwKK30gd2hpbGUgKDApCisKK3R5cGVkZWYgaW50IHRva2VuX3Q7CisKK2VudW0geworCS8qIFB1YmxpYyAqLworCVRPS19FTVBUWSA9IDEgPDwgOSwgIC8qIExpbmUgZnVsbHkgcHJvY2Vzc2VkLCB5b3UgY2FuIHByb2NlZWQgdG8gdGhlIG5leHQgKi8KKwlUT0tfRU9GICAgPSAxIDw8IDEwLCAvKiBGaWxlIGVuZGVkICovCisJLyogUHJpdmF0ZSAoT25seSB0byBiZSB1c2VkIGJ5IHJlYWRfdG9rZW4oKSAqLworCVRPS19FT0wgICA9IDEgPDwgMTEsIC8qIHdlIHNhdyBFT0wgKHN0aWNreSkgKi8KKwlUT0tfU1BBQ0UgPSAxIDw8IDEyLCAvKiB1c2VkIC1iIGNvZGUsIG1lYW5zIHdlIGFyZSBza2lwcGluZyBzcGFjZXMgKi8KKwlTSElGVF9FT0YgPSAoc2l6ZW9mKHRva2VuX3QpKjggLSA4KSAtIDEsCisJQ0hBUl9NQVNLID0gMHgxZmYsICAgLyogOHRoIGJpdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIEVPRiBmcm9tIDB4ZmYgKi8KK307CisKKy8qIFJlc3RvcmVzIGZ1bGwgRU9GIGZyb20gb25lIDh0aCBiaXQ6ICovCisvLyNkZWZpbmUgVE9LMkNIQVIodCkgKCgodCkgPDwgU0hJRlRfRU9GKSA+PiBTSElGVF9FT0YpCisvKiBXZSBkb24ndCByZWFsbHkgbmVlZCB0aGUgYWJvdmUsIHdlIG9ubHkgbmVlZCB0byBoYXZlIEVPRiAhPSBhbnlfcmVhbF9jaGFyOiAqLworI2RlZmluZSBUT0syQ0hBUih0KSAoKHQpICYgQ0hBUl9NQVNLKQorCitzdGF0aWMgdm9pZCBzZWVrX2Z0KEZJTEVfYW5kX3Bvc190ICpmdCwgb2ZmX3QgcG9zKQoreworCWlmIChmdC0+ZnRfcG9zICE9IHBvcykgeworCQlmdC0+ZnRfcG9zID0gcG9zOworCQlmc2Vla28oZnQtPmZ0X2ZwLCBwb3MsIFNFRUtfU0VUKTsKKwl9Cit9CisKKy8qIFJlYWRzIHRva2VucyBmcm9tIGdpdmVuIGZwLCBoYW5kbGluZyAtYiBhbmQgLXcgZmxhZ3MKKyAqIFRoZSB1c2VyIG11c3QgcmVzZXQgdG9rIGV2ZXJ5IGxpbmUgc3RhcnQKKyAqLworc3RhdGljIGludCByZWFkX3Rva2VuKEZJTEVfYW5kX3Bvc190ICpmdCwgdG9rZW5fdCB0b2spCit7CisJdG9rIHw9IFRPS19FTVBUWTsKKwl3aGlsZSAoISh0b2sgJiBUT0tfRU9MKSkgeworCQlib29sIGlzX3NwYWNlOworCQlpbnQgdDsKKworCQl0ID0gZmdldGMoZnQtPmZ0X2ZwKTsKKwkJaWYgKHQgIT0gRU9GKQorCQkJZnQtPmZ0X3BvcysrOworCQlpc19zcGFjZSA9ICh0ID09IEVPRiB8fCBpc3NwYWNlKHQpKTsKKworCQkvKiBJZiB0ID09IEVPRiAoLTEpLCBzZXQgYm90aCBUT0tfRU9GIGFuZCBUT0tfRU9MICovCisJCXRvayB8PSAodCAmIChUT0tfRU9GICsgVE9LX0VPTCkpOworCQkvKiBPbmx5IEVPTD8gKi8KKwkJaWYgKHQgPT0gJ1xuJykKKwkJCXRvayB8PSBUT0tfRU9MOworCisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBRyhpKSkgLyogSGFuZGNvZGVkIHRvbG93ZXIoKSAqLworCQkJdCA9ICh0ID49ICdBJyAmJiB0IDw9ICdaJykgPyB0IC0gKCdBJyAtICdhJykgOiB0OworCisJCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUcodykpICYmIGlzX3NwYWNlKQorCQkJY29udGludWU7CisKKwkJLyogVHJpbSBjaGFyIHZhbHVlIHRvIGxvdyA5IGJpdHMgKi8KKwkJdCAmPSBDSEFSX01BU0s7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKGIpKSB7CisJCQkvKiBXYXMgcHJldiBjaGFyIHdoaXRlc3BhY2U/ICovCisJCQlpZiAodG9rICYgVE9LX1NQQUNFKSB7IC8qIHllcyAqLworCQkJCWlmIChpc19zcGFjZSkgLyogdGhpcyBvbmUgdG9vLCBpZ25vcmUgaXQgKi8KKwkJCQkJY29udGludWU7CisJCQkJdG9rICY9IH5UT0tfU1BBQ0U7CisJCQl9IGVsc2UgaWYgKGlzX3NwYWNlKSB7CisJCQkJLyogMXN0IHdoaXRlc3BhY2UgY2hhci4KKwkJCQkgKiBTZXQgVE9LX1NQQUNFIGFuZCByZXBsYWNlIGNoYXIgYnkgJyAnICovCisJCQkJdCA9IFRPS19TUEFDRSArICcgJzsKKwkJCX0KKwkJfQorCQkvKiBDbGVhciBFTVBUWSAqLworCQl0b2sgJj0gfihUT0tfRU1QVFkgKyBDSEFSX01BU0spOworCQkvKiBBc3NpZ24gY2hhciB2YWx1ZSAobG93IDkgYml0cykgYW5kIG1heWJlIHNldCBUT0tfU1BBQ0UgKi8KKwkJdG9rIHw9IHQ7CisJCWJyZWFrOworCX0KKyNpZiAwCisJYmJfZXJyb3JfbXNnKCJmcDolcCB0b2s6JXggJyVjJyVzJXMlcyVzIiwgZnAsIHRvaywgdG9rICYgMHhmZgorCQksIHRvayAmIFRPS19FT0YgPyAiIEVPRiIgOiAiIgorCQksIHRvayAmIFRPS19FT0wgPyAiIEVPTCIgOiAiIgorCQksIHRvayAmIFRPS19FTVBUWSA/ICIgRU1QVFkiIDogIiIKKwkJLCB0b2sgJiBUT0tfU1BBQ0UgPyAiIFNQQUNFIiA6ICIiCisJKTsKKyNlbmRpZgorCXJldHVybiB0b2s7Cit9CisKK3N0cnVjdCBjYW5kIHsKKwlpbnQgeDsKKwlpbnQgeTsKKwlpbnQgcHJlZDsKK307CisKK3N0YXRpYyBpbnQgc2VhcmNoKGNvbnN0IGludCAqYywgaW50IGssIGludCB5LCBjb25zdCBzdHJ1Y3QgY2FuZCAqbGlzdCkKK3sKKwlpbnQgaSwgajsKKworCWlmIChsaXN0W2Nba11dLnkgPCB5KSAgLyogcXVpY2sgbG9vayBmb3IgdHlwaWNhbCBjYXNlICovCisJCXJldHVybiBrICsgMTsKKworCWZvciAoaSA9IDAsIGogPSBrICsgMTs7KSB7CisJCWNvbnN0IGludCBsID0gKGkgKyBqKSA+PiAxOworCQlpZiAobCA+IGkpIHsKKwkJCWNvbnN0IGludCB0ID0gbGlzdFtjW2xdXS55OworCQkJaWYgKHQgPiB5KQorCQkJCWogPSBsOworCQkJZWxzZSBpZiAodCA8IHkpCisJCQkJaSA9IGw7CisJCQllbHNlCisJCQkJcmV0dXJuIGw7CisJCX0gZWxzZQorCQkJcmV0dXJuIGwgKyAxOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGlzcXJ0KHVuc2lnbmVkIG4pCit7CisJdW5zaWduZWQgeCA9IDE7CisJd2hpbGUgKDEpIHsKKwkJY29uc3QgdW5zaWduZWQgeSA9IHg7CisJCXggPSAoKG4gLyB4KSArIHgpID4+IDE7CisJCWlmICh4IDw9ICh5ICsgMSkgJiYgeCA+PSAoeSAtIDEpKQorCQkJcmV0dXJuIHg7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdG9uZShjb25zdCBpbnQgKmEsIGludCBuLCBjb25zdCBpbnQgKmIsIGludCAqSiwgaW50IHByZWYpCit7CisJY29uc3QgdW5zaWduZWQgaXNxID0gaXNxcnQobik7CisJY29uc3QgdW5zaWduZWQgYm91bmQgPQorCQkob3B0aW9uX21hc2szMiAmIEZMQUcoZCkpID8gVUlOVF9NQVggOiBNQVgoMjU2LCBpc3EpOworCWludCBjbGVuID0gMTsKKwlpbnQgY2xpc3RsZW4gPSAxMDA7CisJaW50IGsgPSAwOworCXN0cnVjdCBjYW5kICpjbGlzdCA9IHh6YWxsb2MoY2xpc3RsZW4gKiBzaXplb2YoY2xpc3RbMF0pKTsKKwlzdHJ1Y3QgY2FuZCBjYW5kOworCXN0cnVjdCBjYW5kICpxOworCWludCAqa2xpc3QgPSB4emFsbG9jKChuICsgMikgKiBzaXplb2Yoa2xpc3RbMF0pKTsKKwkvKmNsaXN0WzBdID0gKHN0cnVjdCBjYW5kKXswfTsgLSB4emFsbG9jIGRpZCBpdCAqLworCS8qa2xpc3RbMF0gPSAwOyAqLworCisJZm9yIChjYW5kLnggPSAxOyBjYW5kLnggPD0gbjsgY2FuZC54KyspIHsKKwkJaW50IGogPSBhW2NhbmQueF0sIG9sZGwgPSAwOworCQl1bnNpZ25lZCBudW10cmllcyA9IDA7CisJCWlmIChqID09IDApCisJCQljb250aW51ZTsKKwkJY2FuZC55ID0gLWJbal07CisJCWNhbmQucHJlZCA9IGtsaXN0WzBdOworCQlkbyB7CisJCQlpbnQgbCwgdGM7CisJCQlpZiAoY2FuZC55IDw9IGNsaXN0W2NhbmQucHJlZF0ueSkKKwkJCQljb250aW51ZTsKKwkJCWwgPSBzZWFyY2goa2xpc3QsIGssIGNhbmQueSwgY2xpc3QpOworCQkJaWYgKGwgIT0gb2xkbCArIDEpCisJCQkJY2FuZC5wcmVkID0ga2xpc3RbbCAtIDFdOworCQkJaWYgKGwgPD0gayAmJiBjbGlzdFtrbGlzdFtsXV0ueSA8PSBjYW5kLnkpCisJCQkJY29udGludWU7CisJCQlpZiAoY2xlbiA9PSBjbGlzdGxlbikgeworCQkJCWNsaXN0bGVuID0gY2xpc3RsZW4gKiAxMSAvIDEwOworCQkJCWNsaXN0ID0geHJlYWxsb2MoY2xpc3QsIGNsaXN0bGVuICogc2l6ZW9mKGNsaXN0WzBdKSk7CisJCQl9CisJCQljbGlzdFtjbGVuXSA9IGNhbmQ7CisJCQl0YyA9IGtsaXN0W2xdOworCQkJa2xpc3RbbF0gPSBjbGVuKys7CisJCQlpZiAobCA8PSBrKSB7CisJCQkJY2FuZC5wcmVkID0gdGM7CisJCQkJb2xkbCA9IGw7CisJCQkJbnVtdHJpZXMrKzsKKwkJCX0gZWxzZSB7CisJCQkJaysrOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICgoY2FuZC55ID0gYlsrK2pdKSA+IDAgJiYgbnVtdHJpZXMgPCBib3VuZCk7CisJfQorCS8qIFVucmF2ZWwgKi8KKwlmb3IgKHEgPSBjbGlzdCArIGtsaXN0W2tdOyBxLT55OyBxID0gY2xpc3QgKyBxLT5wcmVkKQorCQlKW3EtPnggKyBwcmVmXSA9IHEtPnkgKyBwcmVmOworCWZyZWUoa2xpc3QpOworCWZyZWUoY2xpc3QpOworfQorCitzdHJ1Y3QgbGluZSB7CisJLyogJ3NlcmlhbCcgaXMgbm90IHVzZWQgaW4gdGhlIGJlZ2luaW5nLCBzbyB3ZSByZXVzZSBpdAorCSAqIHRvIHN0b3JlIGxpbmUgb2Zmc2V0cywgdGh1cyByZWR1Y2luZyBtZW1vcnkgcHJlc3N1cmUKKwkgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNlcmlhbDsKKwkJb2ZmX3Qgb2Zmc2V0OworCX07CisJdW5zaWduZWQgdmFsdWU7Cit9OworCitzdGF0aWMgdm9pZCBlcXVpdihzdHJ1Y3QgbGluZSAqYSwgaW50IG4sIHN0cnVjdCBsaW5lICpiLCBpbnQgbSwgaW50ICpjKQoreworCWludCBpID0gMSwgaiA9IDE7CisKKwl3aGlsZSAoaSA8PSBuICYmIGogPD0gbSkgeworCQlpZiAoYVtpXS52YWx1ZSA8IGJbal0udmFsdWUpCisJCQlhW2krK10udmFsdWUgPSAwOworCQllbHNlIGlmIChhW2ldLnZhbHVlID09IGJbal0udmFsdWUpCisJCQlhW2krK10udmFsdWUgPSBqOworCQllbHNlCisJCQlqKys7CisJfQorCXdoaWxlIChpIDw9IG4pCisJCWFbaSsrXS52YWx1ZSA9IDA7CisJYlttICsgMV0udmFsdWUgPSAwOworCWogPSAwOworCXdoaWxlICgrK2ogPD0gbSkgeworCQljW2pdID0gLWJbal0uc2VyaWFsOworCQl3aGlsZSAoYltqICsgMV0udmFsdWUgPT0gYltqXS52YWx1ZSkgeworCQkJaisrOworCQkJY1tqXSA9IGJbal0uc2VyaWFsOworCQl9CisJfQorCWNbal0gPSAtMTsKK30KKworc3RhdGljIHZvaWQgdW5zb3J0KGNvbnN0IHN0cnVjdCBsaW5lICpmLCBpbnQgbCwgaW50ICpiKQoreworCWludCBpOworCWludCAqYSA9IHhtYWxsb2MoKGwgKyAxKSAqIHNpemVvZihhWzBdKSk7CisJZm9yIChpID0gMTsgaSA8PSBsOyBpKyspCisJCWFbZltpXS5zZXJpYWxdID0gZltpXS52YWx1ZTsKKwlmb3IgKGkgPSAxOyBpIDw9IGw7IGkrKykKKwkJYltpXSA9IGFbaV07CisJZnJlZShhKTsKK30KKworc3RhdGljIGludCBsaW5lX2NvbXBhcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworI2RlZmluZSBsMCAoKGNvbnN0IHN0cnVjdCBsaW5lKilhKQorI2RlZmluZSBsMSAoKGNvbnN0IHN0cnVjdCBsaW5lKiliKQorCWludCByID0gbDAtPnZhbHVlIC0gbDEtPnZhbHVlOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyZXR1cm4gbDAtPnNlcmlhbCAtIGwxLT5zZXJpYWw7CisjdW5kZWYgbDAKKyN1bmRlZiBsMQorfQorCitzdGF0aWMgdm9pZCBmZXRjaChGSUxFX2FuZF9wb3NfdCAqZnQsIGNvbnN0IG9mZl90ICppeCwgaW50IGEsIGludCBiLCBpbnQgY2gpCit7CisJaW50IGksIGosIGNvbDsKKwlmb3IgKGkgPSBhOyBpIDw9IGI7IGkrKykgeworCQlzZWVrX2Z0KGZ0LCBpeFtpIC0gMV0pOworCQlwdXRjaGFyKGNoKTsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKFQpKQorCQkJcHV0Y2hhcignXHQnKTsKKwkJZm9yIChqID0gMCwgY29sID0gMDsgaiA8IGl4W2ldIC0gaXhbaSAtIDFdOyBqKyspIHsKKwkJCWludCBjID0gZmdldGMoZnQtPmZ0X2ZwKTsKKwkJCWlmIChjID09IEVPRikgeworCQkJCXByaW50ZigiXG5cXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlmdC0+ZnRfcG9zKys7CisJCQlpZiAoYyA9PSAnXHQnICYmIChvcHRpb25fbWFzazMyICYgRkxBRyh0KSkpCisJCQkJZG8gcHV0Y2hhcignICcpOyB3aGlsZSAoKytjb2wgJiA3KTsKKwkJCWVsc2UgeworCQkJCXB1dGNoYXIoYyk7CisJCQkJY29sKys7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENyZWF0ZXMgdGhlIG1hdGNoIHZlY3RvciBKLCB3aGVyZSBKW2ldIGlzIHRoZSBpbmRleAorICogb2YgdGhlIGxpbmUgaW4gdGhlIG5ldyBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxpbmUgaQorICogaW4gdGhlIG9sZCBmaWxlLiBMaW5lcyBzdGFydCBhdCAxIGluc3RlYWQgb2YgMCwgdGhhdCB2YWx1ZQorICogYmVpbmcgdXNlZCBpbnN0ZWFkIHRvIGRlbm90ZSBubyBjb3JyZXNwb25kaW5nIGxpbmUuCisgKiBUaGlzIHZlY3RvciBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiAqIGZwIGlzIGFuIGlucHV0IHBhcmFtZXRlciwgd2hlcmUgZnBbMF0gYW5kIGZwWzFdIGFyZSB0aGUgb3BlbgorICogICBvbGQgZmlsZSBhbmQgbmV3IGZpbGUgcmVzcGVjdGl2ZWx5LgorICogKiBubGVuIGlzIGFuIG91dHB1dCB2YXJpYWJsZSwgd2hlcmUgbmxlblswXSBhbmQgbmxlblsxXQorICogICBnZXRzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIG9sZCBhbmQgbmV3IGZpbGUgcmVzcGVjdGl2ZWx5LgorICogKiBpeCBpcyBhbiBvdXRwdXQgdmFyaWFibGUsIHdoZXJlIGl4WzBdIGFuZCBpeFsxXSBnZXRzCisgKiAgIGFzc2lnbmVkIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB2ZWN0b3JzIG9mIHRoZSBvZmZzZXRzIG9mIHRoZSBsaW5lcworICogICBvZiB0aGUgb2xkIGFuZCBuZXcgZmlsZSByZXNwZWN0aXZlbHkuIFRoZXNlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIE5PSU5MSU5FIGludCAqY3JlYXRlX0ooRklMRV9hbmRfcG9zX3QgZnRbMl0sIGludCBubGVuWzJdLCBvZmZfdCAqaXhbMl0pCit7CisJaW50ICpKLCBzbGVuWzJdLCAqY2xhc3MsICptZW1iZXI7CisJc3RydWN0IGxpbmUgKm5maWxlWzJdLCAqc2ZpbGVbMl07CisJaW50IHByZWYgPSAwLCBzdWZmID0gMCwgaSwgaiwgZGVsdGE7CisKKwkvKiBMaW5lcyBvZiBib3RoIGZpbGVzIGFyZSBoYXNoZWQsIGFuZCBpbiB0aGUgcHJvY2VzcworCSAqIHRoZWlyIG9mZnNldHMgYXJlIHN0b3JlZCBpbiB0aGUgYXJyYXkgaXhbZmlsZW5vXQorCSAqIHdoZXJlIGZpbGVubyA9PSAwIHBvaW50cyB0byB0aGUgb2xkIGZpbGUsIGFuZAorCSAqIGZpbGVubyA9PSAxIHBvaW50cyB0byB0aGUgbmV3IG9uZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXVuc2lnbmVkIGhhc2g7CisJCXRva2VuX3QgdG9rOworCQlzaXplX3Qgc3ogPSAxMDA7CisJCW5maWxlW2ldID0geG1hbGxvYygoc3ogKyAzKSAqIHNpemVvZihuZmlsZVtpXVswXSkpOworCQkvKiBmdCBnZXRzIGhlcmUgd2l0aG91dCB0aGUgY29ycmVjdCBwb3NpdGlvbiwgY2FudCB1c2Ugc2Vla19mdCAqLworCQlmdFtpXS5mdF9wb3MgPSAwOworCQlmc2Vla28oZnRbaV0uZnRfZnAsIDAsIFNFRUtfU0VUKTsKKworCQlubGVuW2ldID0gMDsKKwkJLyogV2UgY291bGQgemFsbG9jIG5maWxlLCBidXQgdGhlbiB6YWxsb2Mgc3RhcnRzIHNob3dpbmcgaW4gZ3Byb2YgYXQgfjElICovCisJCW5maWxlW2ldWzBdLm9mZnNldCA9IDA7CisJCWdvdG8gc3RhcnQ7IC8qIHNhdmVzIGNvZGUgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCXRvayA9IHJlYWRfdG9rZW4oJmZ0W2ldLCB0b2spOworCQkJaWYgKCEodG9rICYgVE9LX0VNUFRZKSkgeworCQkJCS8qIEhhc2ggYWxnb3JpdGhtIHRha2VuIGZyb20gUm9iZXJ0IFNlZGdld2ljaywgQWxnb3JpdGhtcyBpbiBDLCAzZCBlZC4sIHAgNTc4LiAqLworCQkJCS8qaGFzaCA9IGhhc2ggKiAxMjggLSBoYXNoICsgVE9LMkNIQVIodG9rKTsKKwkJCQkgKiBnY2MgaW5zaXN0cyBvbiBvcHRpbWl6aW5nIGFib3ZlIHRvICJoYXNoICogMTI3ICsgLi4uIiwgdGh1cy4uLiAqLworCQkJCXVuc2lnbmVkIG8gPSBoYXNoIC0gVE9LMkNIQVIodG9rKTsKKwkJCQloYXNoID0gaGFzaCAqIDEyOCAtIG87IC8qIHdlIHdhbnQgU1BFRUQgaGVyZSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG5sZW5baV0rKyA9PSBzeikgeworCQkJCXN6ID0gc3ogKiAzIC8gMjsKKwkJCQluZmlsZVtpXSA9IHhyZWFsbG9jKG5maWxlW2ldLCAoc3ogKyAzKSAqIHNpemVvZihuZmlsZVtpXVswXSkpOworCQkJfQorCQkJLyogbGluZV9jb21wYXIgbmVlZHMgaGFzaGVzIGZpdCBpbnRvIHBvc2l0aXZlIGludCAqLworCQkJbmZpbGVbaV1bbmxlbltpXV0udmFsdWUgPSBoYXNoICYgSU5UX01BWDsKKwkJCS8qIGxpa2UgZnRlbGxvKGZ0W2ldLmZ0X2ZwKSBidXQgZmFzdGVyIChhdm9pZHMgbHNlZWsgc3lzY2FsbCkgKi8KKwkJCW5maWxlW2ldW25sZW5baV1dLm9mZnNldCA9IGZ0W2ldLmZ0X3BvczsKKwkJCWlmICh0b2sgJiBUT0tfRU9GKSB7CisJCQkJLyogRU9GIGNvdW50cyBhcyBhIHRva2VuLCBzbyB3ZSBoYXZlIHRvIGFkanVzdCBpdCBoZXJlICovCisJCQkJbmZpbGVbaV1bbmxlbltpXV0ub2Zmc2V0Kys7CisJCQkJYnJlYWs7CisJCQl9CitzdGFydDoKKwkJCWhhc2ggPSB0b2sgPSAwOworCQl9CisJCS8qIEV4Y2x1ZGUgbG9uZSBFT0YgbGluZSBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRvIG1ha2UgZmV0Y2goKSdzIGpvYiBlYXNpZXIgKi8KKwkJaWYgKG5maWxlW2ldW25sZW5baV1dLm9mZnNldCAtIG5maWxlW2ldW25sZW5baV0gLSAxXS5vZmZzZXQgPT0gMSkKKwkJCW5sZW5baV0tLTsKKwkJLyogTm93IHdlIGNvcHkgdGhlIGxpbmUgb2Zmc2V0cyBpbnRvIGl4ICovCisJCWl4W2ldID0geG1hbGxvYygobmxlbltpXSArIDIpICogc2l6ZW9mKGl4W2ldWzBdKSk7CisJCWZvciAoaiA9IDA7IGogPCBubGVuW2ldICsgMTsgaisrKQorCQkJaXhbaV1bal0gPSBuZmlsZVtpXVtqXS5vZmZzZXQ7CisJfQorCisJLyogbGVuZ3RoIG9mIHByZWZpeCBhbmQgc3VmZml4IGlzIGNhbGN1bGF0ZWQgKi8KKwlmb3IgKDsgcHJlZiA8IG5sZW5bMF0gJiYgcHJlZiA8IG5sZW5bMV0gJiYKKwkgICAgICAgbmZpbGVbMF1bcHJlZiArIDFdLnZhbHVlID09IG5maWxlWzFdW3ByZWYgKyAxXS52YWx1ZTsKKwkgICAgICAgcHJlZisrKTsKKwlmb3IgKDsgc3VmZiA8IG5sZW5bMF0gLSBwcmVmICYmIHN1ZmYgPCBubGVuWzFdIC0gcHJlZiAmJgorCSAgICAgICBuZmlsZVswXVtubGVuWzBdIC0gc3VmZl0udmFsdWUgPT0gbmZpbGVbMV1bbmxlblsxXSAtIHN1ZmZdLnZhbHVlOworCSAgICAgICBzdWZmKyspOworCS8qIEFycmF5cyBhcmUgcHJ1bmVkIGJ5IHRoZSBzdWZmaXggYW5kIHByZWZpeCBsZW5ndGgsCisJICogdGhlIHJlc3VsdCBiZWluZyBzb3J0ZWQgYW5kIHN0b3JlZCBpbiBzZmlsZVtmaWxlbm9dLAorCSAqIGFuZCB0aGVpciBzaXplcyBhcmUgc3RvcmVkIGluIHNsZW5bZmlsZW5vXQorCSAqLworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJc2ZpbGVbal0gPSBuZmlsZVtqXSArIHByZWY7CisJCXNsZW5bal0gPSBubGVuW2pdIC0gcHJlZiAtIHN1ZmY7CisJCWZvciAoaSA9IDA7IGkgPD0gc2xlbltqXTsgaSsrKQorCQkJc2ZpbGVbal1baV0uc2VyaWFsID0gaTsKKwkJcXNvcnQoc2ZpbGVbal0gKyAxLCBzbGVuW2pdLCBzaXplb2YoKnNmaWxlW2pdKSwgbGluZV9jb21wYXIpOworCX0KKwkvKiBuZmlsZSBhcnJheXMgYXJlIHJldXNlZCB0byByZWR1Y2UgbWVtb3J5IHByZXNzdXJlCisJICogVGhlICNpZiB6ZXJvZWQgb3V0IHNlY3Rpb24gcGVyZm9ybXMgdGhlIHNhbWUgdGFzayBhcyB0aGUKKwkgKiBvbmUgaW4gdGhlICNlbHNlIHNlY3Rpb24uCisJICogUGVhayBtZW1vcnkgdXNhZ2UgaXMgaGlnaGVyLCBidXQgb25lIGFycmF5IGNvcHkgaXMgYXZvaWRlZAorCSAqIGJ5IG5vdCB1c2luZyB1bnNvcnQoKQorCSAqLworI2lmIDAKKwltZW1iZXIgPSB4bWFsbG9jKChzbGVuWzFdICsgMikgKiBzaXplb2YobWVtYmVyWzBdKSk7CisJZXF1aXYoc2ZpbGVbMF0sIHNsZW5bMF0sIHNmaWxlWzFdLCBzbGVuWzFdLCBtZW1iZXIpOworCWZyZWUobmZpbGVbMV0pOworCisJY2xhc3MgPSB4bWFsbG9jKChzbGVuWzBdICsgMSkgKiBzaXplb2YoY2xhc3NbMF0pKTsKKwlmb3IgKGkgPSAxOyBpIDw9IHNsZW5bMF07IGkrKykgLyogVW5zb3J0aW5nICovCisJCWNsYXNzW3NmaWxlWzBdW2ldLnNlcmlhbF0gPSBzZmlsZVswXVtpXS52YWx1ZTsKKwlmcmVlKG5maWxlWzBdKTsKKyNlbHNlCisJbWVtYmVyID0gKGludCAqKW5maWxlWzFdOworCWVxdWl2KHNmaWxlWzBdLCBzbGVuWzBdLCBzZmlsZVsxXSwgc2xlblsxXSwgbWVtYmVyKTsKKwltZW1iZXIgPSB4cmVhbGxvYyhtZW1iZXIsIChzbGVuWzFdICsgMikgKiBzaXplb2YobWVtYmVyWzBdKSk7CisKKwljbGFzcyA9IChpbnQgKiluZmlsZVswXTsKKwl1bnNvcnQoc2ZpbGVbMF0sIHNsZW5bMF0sIChpbnQgKiluZmlsZVswXSk7CisJY2xhc3MgPSB4cmVhbGxvYyhjbGFzcywgKHNsZW5bMF0gKyAyKSAqIHNpemVvZihjbGFzc1swXSkpOworI2VuZGlmCisJSiA9IHhtYWxsb2MoKG5sZW5bMF0gKyAyKSAqIHNpemVvZihKWzBdKSk7CisJLyogVGhlIGVsZW1lbnRzIG9mIEogd2hpY2ggZmFsbCBpbnNpZGUgdGhlIHByZWZpeCBhbmQgc3VmZml4IHJlZ2lvbnMKKwkgKiBhcmUgbWFya2VkIGFzIHVuY2hhbmdlZCwgd2hpbGUgdGhlIG9uZXMgd2hpY2ggZmFsbCBvdXRzaWRlCisJICogYXJlIGluaXRpYWxpemVkIHdpdGggMCAobm8gbWF0Y2hlcyksIHNvIHRoYXQgZnVuY3Rpb24gc3RvbmUgY2FuCisJICogdGhlbiBhc3NpZ24gdGhlbSB0aGVpciByaWdodCB2YWx1ZXMKKwkgKi8KKwlmb3IgKGkgPSAwLCBkZWx0YSA9IG5sZW5bMV0gLSBubGVuWzBdOyBpIDw9IG5sZW5bMF07IGkrKykKKwkJSltpXSA9IGkgPD0gcHJlZiAgICAgICAgICAgID8gIGkgOgorCQkgICAgICAgaSA+IChubGVuWzBdIC0gc3VmZikgPyAoaSArIGRlbHRhKSA6IDA7CisJLyogSGVyZSB0aGUgbWFnaWMgaXMgcGVyZm9ybWVkICovCisJc3RvbmUoY2xhc3MsIHNsZW5bMF0sIG1lbWJlciwgSiwgcHJlZik7CisJSltubGVuWzBdICsgMV0gPSBubGVuWzFdICsgMTsKKworCWZyZWUoY2xhc3MpOworCWZyZWUobWVtYmVyKTsKKworCS8qIEJvdGggZmlsZXMgYXJlIHJlc2Nhbm5lZCwgaW4gYW4gZWZmb3J0IHRvIGZpbmQgYW55IGxpbmVzCisJICogd2hpY2gsIGR1ZSB0byBsaW1pdGF0aW9ucyBpbnRyaW5zaWMgdG8gYW55IGhhc2hpbmcgYWxnb3JpdGhtLAorCSAqIGFyZSBkaWZmZXJlbnQgYnV0IGVuZGVkIHVwIGNvbmZvdW5kZWQgYXMgdGhlIHNhbWUKKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IG5sZW5bMF07IGkrKykgeworCQlpZiAoIUpbaV0pCisJCQljb250aW51ZTsKKworCQlzZWVrX2Z0KCZmdFswXSwgaXhbMF1baSAtIDFdKTsKKwkJc2Vla19mdCgmZnRbMV0sIGl4WzFdW0pbaV0gLSAxXSk7CisKKwkJZm9yIChqID0gSltpXTsgaSA8PSBubGVuWzBdICYmIEpbaV0gPT0gajsgaSsrLCBqKyspIHsKKwkJCXRva2VuX3QgdG9rMCA9IDAsIHRvazEgPSAwOworCQkJZG8geworCQkJCXRvazAgPSByZWFkX3Rva2VuKCZmdFswXSwgdG9rMCk7CisJCQkJdG9rMSA9IHJlYWRfdG9rZW4oJmZ0WzFdLCB0b2sxKTsKKworCQkJCWlmICgoKHRvazAgXiB0b2sxKSAmIFRPS19FTVBUWSkgIT0gMCAvKiBvbmUgaXMgZW1wdHkgKG5vdCBib3RoKSAqLworCQkJCSB8fCAoISh0b2swICYgVE9LX0VNUFRZKSAmJiBUT0syQ0hBUih0b2swKSAhPSBUT0syQ0hBUih0b2sxKSkKKwkJCQkpIHsKKwkJCQkJSltpXSA9IDA7IC8qIEJyZWFrIHRoZSBjb3JyZXNwb25kZW5jZSAqLworCQkJCX0KKwkJCX0gd2hpbGUgKCEodG9rMCAmIHRvazEgJiBUT0tfRU1QVFkpKTsKKwkJfQorCX0KKworCXJldHVybiBKOworfQorCitzdGF0aWMgYm9vbCBkaWZmKEZJTEUqIGZwWzJdLCBjaGFyICpmaWxlWzJdKQoreworCWludCBubGVuWzJdOworCW9mZl90ICppeFsyXTsKKwlGSUxFX2FuZF9wb3NfdCBmdFsyXTsKKwl0eXBlZGVmIHN0cnVjdCB7IGludCBhLCBiOyB9IHZlY190WzJdOworCXZlY190ICp2ZWMgPSBOVUxMOworCWludCBpID0gMSwgaiwgaywgaWR4ID0gLTE7CisJYm9vbCBhbnljaGFuZ2UgPSBmYWxzZTsKKwlpbnQgKko7CisKKwlmdFswXS5mdF9mcCA9IGZwWzBdOworCWZ0WzFdLmZ0X2ZwID0gZnBbMV07CisJLyogbm90ZSB0aGF0IGZ0W2ldLmZ0X3BvcyBpcyB1bmludGl0YWxpemVkLCBjcmVhdGVfSigpCisJICogbXVzdCBub3QgYXNzdW1lIG90aGVyd2lzZSAqLworCUogPSBjcmVhdGVfSihmdCwgbmxlbiwgaXgpOworCisJZG8geworCQlib29sIG5vbmVtcHR5ID0gZmFsc2U7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXZlY190IHY7CisKKwkJCWZvciAodlswXS5hID0gaTsgdlswXS5hIDw9IG5sZW5bMF0gJiYgSlt2WzBdLmFdID09IEpbdlswXS5hIC0gMV0gKyAxOyB2WzBdLmErKykKKwkJCQljb250aW51ZTsKKwkJCXZbMV0uYSA9IEpbdlswXS5hIC0gMV0gKyAxOworCisJCQlmb3IgKHZbMF0uYiA9IHZbMF0uYSAtIDE7IHZbMF0uYiA8IG5sZW5bMF0gJiYgIUpbdlswXS5iICsgMV07IHZbMF0uYisrKQorCQkJCWNvbnRpbnVlOworCQkJdlsxXS5iID0gSlt2WzBdLmIgKyAxXSAtIDE7CisJCQkvKgorCQkJICogSW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBsaW5lcyBhIGFuZCBiIG9mIHRoZSAnZnJvbScgZmlsZQorCQkJICogdG8gZ2V0IHRvIGxpbmVzIGMgdG8gZCBvZiB0aGUgJ3RvJyBmaWxlLiBJZiBhIGlzIGdyZWF0ZXIgdGhhbiBiIHRoZW4gdGhlcmUKKwkJCSAqIGFyZSBubyBsaW5lcyBpbiB0aGUgJ2Zyb20nIGZpbGUgaW52b2x2ZWQgYW5kIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlCisJCQkgKiBsaW5lcyBhcHBlbmRlZCAoYmVnaW5uaW5nIGF0IGIpLiAgSWYgYyBpcyBncmVhdGVyIHRoYW4gZCB0aGVuIHRoZXJlIGFyZQorCQkJICogbGluZXMgbWlzc2luZyBmcm9tIHRoZSAndG8nIGZpbGUuCisJCQkgKi8KKwkJCWlmICh2WzBdLmEgPD0gdlswXS5iIHx8IHZbMV0uYSA8PSB2WzFdLmIpIHsKKwkJCQkvKgorCQkJCSAqIElmIHRoaXMgY2hhbmdlIGlzIG1vcmUgdGhhbiAnY29udGV4dCcgbGluZXMgZnJvbSB0aGUKKwkJCQkgKiBwcmV2aW91cyBjaGFuZ2UsIGR1bXAgdGhlIHJlY29yZCBhbmQgcmVzZXQgaXQuCisJCQkJICovCisJCQkJaW50IGN0ID0gKDIgKiBvcHRfVV9jb250ZXh0KSArIDE7CisJCQkJaWYgKGlkeCA+PSAwCisJCQkJICYmIHZbMF0uYSA+IHZlY1tpZHhdWzBdLmIgKyBjdAorCQkJCSAmJiB2WzFdLmEgPiB2ZWNbaWR4XVsxXS5iICsgY3QKKwkJCQkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJCQkJZm9yIChrID0gdltqXS5hOyBrIDwgdltqXS5iOyBrKyspCisJCQkJCQlub25lbXB0eSB8PSAoaXhbal1baysxXSAtIGl4W2pdW2tdICE9IDEpOworCisJCQkJdmVjID0geHJlYWxsb2NfdmVjdG9yKHZlYywgNiwgKytpZHgpOworCQkJCW1lbWNweSh2ZWNbaWR4XSwgdiwgc2l6ZW9mKHYpKTsKKwkJCX0KKworCQkJaSA9IHZbMF0uYiArIDE7CisJCQlpZiAoaSA+IG5sZW5bMF0pCisJCQkJYnJlYWs7CisJCQlKW3ZbMF0uYl0gPSB2WzFdLmI7CisJCX0KKwkJaWYgKGlkeCA8IDAgfHwgKChvcHRpb25fbWFzazMyICYgRkxBRyhCKSkgJiYgIW5vbmVtcHR5KSkKKwkJCWdvdG8gY29udDsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUcocSkpKSB7CisJCQlpbnQgbG93YTsKKwkJCXZlY190IHNwYW4sICpjdnAgPSB2ZWM7CisKKwkJCWlmICghYW55Y2hhbmdlKSB7CisJCQkJLyogUHJpbnQgdGhlIGNvbnRleHQvdW5pZGlmZiBoZWFkZXIgZmlyc3QgdGltZSB0aHJvdWdoICovCisJCQkJcHJpbnRmKCItLS0gJXNcbiIsIGxhYmVsWzBdID8gbGFiZWxbMF0gOiBmaWxlWzBdKTsKKwkJCQlwcmludGYoIisrKyAlc1xuIiwgbGFiZWxbMV0gPyBsYWJlbFsxXSA6IGZpbGVbMV0pOworCQkJfQorCisJCQlwcmludGYoIkBAIik7CisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJaW50IGEgPSBzcGFuW2pdLmEgPSBNQVgoMSwgKCpjdnApW2pdLmEgLSBvcHRfVV9jb250ZXh0KTsKKwkJCQlpbnQgYiA9IHNwYW5bal0uYiA9IE1JTihubGVuW2pdLCB2ZWNbaWR4XVtqXS5iICsgb3B0X1VfY29udGV4dCk7CisKKwkJCQlwcmludGYoIiAlYyVkIiwgaiA/ICcrJyA6ICctJywgTUlOKGEsIGIpKTsKKwkJCQlpZiAoYSA9PSBiKQorCQkJCQljb250aW51ZTsKKwkJCQlwcmludGYoIiwlZCIsIChhIDwgYikgPyBiIC0gYSArIDEgOiAwKTsKKwkJCX0KKwkJCXByaW50ZigiIEBAXG4iKTsKKwkJCS8qCisJCQkgKiBPdXRwdXQgY2hhbmdlcyBpbiAidW5pZmllZCIgZGlmZiBmb3JtYXQtLXRoZSBvbGQgYW5kIG5ldyBsaW5lcworCQkJICogYXJlIHByaW50ZWQgdG9nZXRoZXIuCisJCQkgKi8KKwkJCWZvciAobG93YSA9IHNwYW5bMF0uYTsgOyBsb3dhID0gKCpjdnArKylbMF0uYiArIDEpIHsKKwkJCQlib29sIGVuZCA9IGN2cCA+ICZ2ZWNbaWR4XTsKKwkJCQlmZXRjaCgmZnRbMF0sIGl4WzBdLCBsb3dhLCBlbmQgPyBzcGFuWzBdLmIgOiAoKmN2cClbMF0uYSAtIDEsICcgJyk7CisJCQkJaWYgKGVuZCkKKwkJCQkJYnJlYWs7CisJCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJCQkJZmV0Y2goJmZ0W2pdLCBpeFtqXSwgKCpjdnApW2pdLmEsICgqY3ZwKVtqXS5iLCBqID8gJysnIDogJy0nKTsKKwkJCX0KKwkJfQorCQlhbnljaGFuZ2UgPSB0cnVlOworIGNvbnQ6CisJCWlkeCA9IC0xOworCX0gd2hpbGUgKGkgPD0gbmxlblswXSk7CisKKwlmcmVlKHZlYyk7CisJZnJlZShpeFswXSk7CisJZnJlZShpeFsxXSk7CisJZnJlZShKKTsKKwlyZXR1cm4gYW55Y2hhbmdlOworfQorCitzdGF0aWMgaW50IGRpZmZyZWcoY2hhciAqZmlsZVsyXSkKK3sKKwlGSUxFICpmcFsyXTsKKwlib29sIGJpbmFyeSA9IGZhbHNlLCBkaWZmZXIgPSBmYWxzZTsKKwlpbnQgc3RhdHVzID0gU1RBVFVTX1NBTUUsIGk7CisKKwlmcFswXSA9IHN0ZGluOworCWZwWzFdID0gc3RkaW47CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpbnQgZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oZmlsZVtpXSk7CisJCWlmIChmZCA9PSAtMSkKKwkJCWdvdG8gb3V0OworCQkvKiBPdXIgZGlmZiBpbXBsZW1lbnRhdGlvbiBpcyB1c2luZyBzZWVrLgorCQkgKiBXaGVuIHdlIG1lZXQgbm9uLXNlZWthYmxlIGZpbGUsIHdlIG11c3QgbWFrZSBhIHRlbXAgY29weS4KKwkJICovCisJCWlmIChsc2VlayhmZCwgMCwgU0VFS19TRVQpID09IC0xICYmIGVycm5vID09IEVTUElQRSkgeworCQkJY2hhciBuYW1lW10gPSAiL3RtcC9kaWZYWFhYWFgiOworCQkJaW50IGZkX3RtcCA9IHhta3N0ZW1wKG5hbWUpOworCisJCQl1bmxpbmsobmFtZSk7CisJCQlpZiAoYmJfY29weWZkX2VvZihmZCwgZmRfdG1wKSA8IDApCisJCQkJeGZ1bmNfZGllKCk7CisJCQlpZiAoZmQpIC8qIFByZXZlbnRzIGNsb3Npbmcgb2Ygc3RkaW4gKi8KKwkJCQljbG9zZShmZCk7CisJCQlmZCA9IGZkX3RtcDsKKwkJfQorCQlmcFtpXSA9IGZkb3BlbihmZCwgInIiKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQljb25zdCBzaXplX3Qgc3ogPSBDT01NT05fQlVGU0laRSAvIDI7CisJCWNoYXIgKmNvbnN0IGJ1ZjAgPSBiYl9jb21tb25fYnVmc2l6MTsKKwkJY2hhciAqY29uc3QgYnVmMSA9IGJ1ZjAgKyBzejsKKwkJaW50IGosIGs7CisJCWkgPSBmcmVhZChidWYwLCAxLCBzeiwgZnBbMF0pOworCQlqID0gZnJlYWQoYnVmMSwgMSwgc3osIGZwWzFdKTsKKwkJaWYgKGkgIT0gaikgeworCQkJZGlmZmVyID0gdHJ1ZTsKKwkJCWkgPSBNSU4oaSwgaik7CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCWJyZWFrOworCQlmb3IgKGsgPSAwOyBrIDwgaTsgaysrKSB7CisJCQlpZiAoIWJ1ZjBba10gfHwgIWJ1ZjFba10pCisJCQkJYmluYXJ5ID0gdHJ1ZTsKKwkJCWlmIChidWYwW2tdICE9IGJ1ZjFba10pCisJCQkJZGlmZmVyID0gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoZGlmZmVyKSB7CisJCWlmIChiaW5hcnkgJiYgIShvcHRpb25fbWFzazMyICYgRkxBRyhhKSkpCisJCQlzdGF0dXMgPSBTVEFUVVNfQklOQVJZOworCQllbHNlIGlmIChkaWZmKGZwLCBmaWxlKSkKKwkJCXN0YXR1cyA9IFNUQVRVU19ESUZGRVI7CisJfQorCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NBTUUpCisJCWV4aXRfc3RhdHVzIHw9IDE7CitvdXQ6CisJZmNsb3NlX2lmX25vdF9zdGRpbihmcFswXSk7CisJZmNsb3NlX2lmX25vdF9zdGRpbihmcFsxXSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0dXMoaW50IHN0YXR1cywgY2hhciAqcGF0aFsyXSkKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgU1RBVFVTX0JJTkFSWToKKwljYXNlIFNUQVRVU19ESUZGRVI6CisJCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUcocSkpIHx8IHN0YXR1cyA9PSBTVEFUVVNfQklOQVJZKQorCQkJcHJpbnRmKCJGaWxlcyAlcyBhbmQgJXMgZGlmZmVyXG4iLCBwYXRoWzBdLCBwYXRoWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFUVVNfU0FNRToKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKHMpKQorCQkJcHJpbnRmKCJGaWxlcyAlcyBhbmQgJXMgYXJlIGlkZW50aWNhbFxuIiwgcGF0aFswXSwgcGF0aFsxXSk7CisJCWJyZWFrOworCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0RJRkZfRElSCitzdHJ1Y3QgZGxpc3QgeworCXNpemVfdCBsZW47CisJaW50IHMsIGU7CisJY2hhciAqKmRsOworfTsKKworLyogVGhpcyBmdW5jdGlvbiBhZGRzIGEgZmlsZW5hbWUgdG8gZGwsIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4gKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGFkZF90b19kaXJsaXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc2IgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyZGF0YSwgaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgZGxpc3QgKmNvbnN0IGwgPSB1c2VyZGF0YTsKKwljb25zdCBjaGFyICpmaWxlID0gZmlsZW5hbWUgKyBsLT5sZW47CisJd2hpbGUgKCpmaWxlID09ICcvJykKKwkJZmlsZSsrOworCWwtPmRsID0geHJlYWxsb2NfdmVjdG9yKGwtPmRsLCA2LCBsLT5lKTsKKwlsLT5kbFtsLT5lXSA9IHhzdHJkdXAoZmlsZSk7CisJbC0+ZSsrOworCXJldHVybiBUUlVFOworfQorCisvKiBJZiByZWN1cnNpb24gaXMgbm90IHNldCwgdGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBkaXJlY3RvcnkKKyAqIHRvIHRoZSBsaXN0IGFuZCBwcmV2ZW50cyByZWN1cnNpdmVfYWN0aW9uIGZyb20gcmVjdXJzaW5nIGludG8gaXQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHNraXBfZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc2IsIHZvaWQgKnVzZXJkYXRhLAorCQlpbnQgZGVwdGgpCit7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUcocikpICYmIGRlcHRoKSB7CisJCWFkZF90b19kaXJsaXN0KGZpbGVuYW1lLCBzYiwgdXNlcmRhdGEsIGRlcHRoKTsKKwkJcmV0dXJuIFNLSVA7CisJfQorCWlmICghKG9wdGlvbl9tYXNrMzIgJiBGTEFHKE4pKSkgeworCQkvKiAtciB3aXRob3V0IC1OOiBubyBuZWVkIHRvIHJlY3Vyc2UgaW50byBkaXJzCisJCSAqIHdoaWNoIGRvIG5vdCBleGlzdCBvbiB0aGUgIm90aGVyIHNpZGUiLgorCQkgKiBUZXN0Y2FzZTogZGlmZiAtciAvdG1wIC8KKwkJICogKGl0IHdvdWxkIHJlY3Vyc2UgZGVlcCBpbnRvIC9wcm9jIHdpdGhvdXQgdGhpcyBjb2RlKSAqLworCQlzdHJ1Y3QgZGxpc3QgKmNvbnN0IGwgPSB1c2VyZGF0YTsKKwkJZmlsZW5hbWUgKz0gbC0+bGVuOworCQlpZiAoZmlsZW5hbWVbMF0pIHsKKwkJCXN0cnVjdCBzdGF0IG9zYjsKKwkJCWNoYXIgKm90aGVybmFtZSA9IGNvbmNhdF9wYXRoX2ZpbGUoRy5vdGhlcl9kaXIsIGZpbGVuYW1lKTsKKwkJCWludCByID0gc3RhdChvdGhlcm5hbWUsICZvc2IpOworCQkJZnJlZShvdGhlcm5hbWUpOworCQkJaWYgKHIgIT0gMCB8fCAhU19JU0RJUihvc2Iuc3RfbW9kZSkpIHsKKwkJCQkvKiBvdGhlciBkaXIgZG9lc24ndCBoYXZlIHNpbWlsYXJseSBuYW1lZAorCQkJCSAqIGRpcmVjdG9yeSwgZG9uJ3QgcmVjdXJzZTsgcmV0dXJuIDEgdXBvbgorCQkJCSAqIGV4aXQsIGp1c3QgbGlrZSBkaWZmdXRpbHMnIGRpZmYgKi8KKwkJCQlleGl0X3N0YXR1cyB8PSAxOworCQkJCXJldHVybiBTS0lQOworCQkJfQorCQl9CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkaWZmZGlyKGNoYXIgKnBbMl0sIGNvbnN0IGNoYXIgKnNfc3RhcnQpCit7CisJc3RydWN0IGRsaXN0IGxpc3RbMl07CisJaW50IGk7CisKKwltZW1zZXQoJmxpc3QsIDAsIHNpemVvZihsaXN0KSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkvKmxpc3RbaV0ucyA9IGxpc3RbaV0uZSA9IDA7IC0gbWVtc2V0IGRpZCBpdCAqLworCQkvKmxpc3RbaV0uZGwgPSBOVUxMOyAqLworCisJCUcub3RoZXJfZGlyID0gcFsxIC0gaV07CisJCS8qIFdlIG5lZWQgdG8gdHJpbSByb290IGRpcmVjdG9yeSBwcmVmaXguCisJCSAqIFVzaW5nIGxpc3QubGVuIHRvIHNwZWNpZnkgaXRzIGxlbmd0aCwKKwkJICogYWRkX3RvX2Rpcmxpc3Qgd2lsbCByZW1vdmUgaXQuICovCisJCWxpc3RbaV0ubGVuID0gc3RybGVuKHBbaV0pOworCQlyZWN1cnNpdmVfYWN0aW9uKHBbaV0sIEFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX0ZPTExPV0xJTktTLAorCQkgICAgICAgICAgICAgICAgIGFkZF90b19kaXJsaXN0LCBza2lwX2RpciwgJmxpc3RbaV0sIDApOworCQkvKiBTb3J0IGRsIGFscGhhYmV0aWNhbGx5LgorCQkgKiBHTlUgZGlmZiBkb2VzIHRoaXMgaWdub3JpbmcgYW55IG51bWJlciBvZiB0cmFpbGluZyBkb3RzLgorCQkgKiBXZSBkb24ndCwgc28gZm9yIHVzIGRvdHRlZCBmaWxlcyBhbG1vc3QgYWx3YXlzIGFyZQorCQkgKiBmaXJzdCBvbiB0aGUgbGlzdC4KKwkJICovCisJCXFzb3J0X3N0cmluZ192ZWN0b3IobGlzdFtpXS5kbCwgbGlzdFtpXS5lKTsKKwkJLyogSWYgLVMgd2FzIHNldCwgZmluZCB0aGUgc3RhcnRpbmcgcG9pbnQuICovCisJCWlmICghc19zdGFydCkKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAobGlzdFtpXS5zIDwgbGlzdFtpXS5lICYmIHN0cmNtcChsaXN0W2ldLmRsW2xpc3RbaV0uc10sIHNfc3RhcnQpIDwgMCkKKwkJCWxpc3RbaV0ucysrOworCX0KKwkvKiBOb3cgdGhhdCBib3RoIGRpcmxpc3QxIGFuZCBkaXJsaXN0MiBjb250YWluIHNvcnRlZCBkaXJlY3RvcnkKKwkgKiBsaXN0aW5ncywgd2UgY2FuIHN0YXJ0IHRvIGdvIHRocm91Z2ggZGlybGlzdDEuIElmIGJvdGggbGlzdGluZ3MKKwkgKiBjb250YWluIHRoZSBzYW1lIGZpbGUsIHRoZW4gZG8gYSBub3JtYWwgZGlmZi4gT3RoZXJ3aXNlLCBiZWhhdmlvdXIKKwkgKiBpcyBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgdGhlIC1OIGZsYWcgaXMgc2V0LiAqLworCXdoaWxlICgxKSB7CisJCWNoYXIgKmRwWzJdOworCQlpbnQgcG9zOworCQlpbnQgazsKKworCQlkcFswXSA9IGxpc3RbMF0ucyA8IGxpc3RbMF0uZSA/IGxpc3RbMF0uZGxbbGlzdFswXS5zXSA6IE5VTEw7CisJCWRwWzFdID0gbGlzdFsxXS5zIDwgbGlzdFsxXS5lID8gbGlzdFsxXS5kbFtsaXN0WzFdLnNdIDogTlVMTDsKKwkJaWYgKCFkcFswXSAmJiAhZHBbMV0pCisJCQlicmVhazsKKwkJcG9zID0gIWRwWzBdID8gMSA6ICghZHBbMV0gPyAtMSA6IHN0cmNtcChkcFswXSwgZHBbMV0pKTsKKwkJayA9IHBvcyA+IDA7CisJCWlmIChwb3MgJiYgIShvcHRpb25fbWFzazMyICYgRkxBRyhOKSkpIHsKKwkJCXByaW50ZigiT25seSBpbiAlczogJXNcbiIsIHBba10sIGRwW2tdKTsKKwkJCWV4aXRfc3RhdHVzIHw9IDE7CisJCX0gZWxzZSB7CisJCQljaGFyICpmdWxscGF0aFsyXSwgKnBhdGhbMl07IC8qIGlmIC1OICovCisKKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQlpZiAocG9zID09IDAgfHwgaSA9PSBrKSB7CisJCQkJCXBhdGhbaV0gPSBmdWxscGF0aFtpXSA9IGNvbmNhdF9wYXRoX2ZpbGUocFtpXSwgZHBbaV0pOworCQkJCQlzdGF0KGZ1bGxwYXRoW2ldLCAmc3RiW2ldKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmdWxscGF0aFtpXSA9IGNvbmNhdF9wYXRoX2ZpbGUocFtpXSwgZHBbMSAtIGldKTsKKwkJCQkJcGF0aFtpXSA9IChjaGFyICopYmJfZGV2X251bGw7CisJCQkJfQorCQkJfQorCQkJaWYgKHBvcykKKwkJCQlzdGF0KGZ1bGxwYXRoW2tdLCAmc3RiWzEgLSBrXSk7CisKKwkJCWlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSAmJiBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkKKwkJCQlwcmludGYoIkNvbW1vbiBzdWJkaXJlY3RvcmllczogJXMgYW5kICVzXG4iLCBmdWxscGF0aFswXSwgZnVsbHBhdGhbMV0pOworCQkJZWxzZSBpZiAoIVNfSVNSRUcoc3RiWzBdLnN0X21vZGUpICYmICFTX0lTRElSKHN0YlswXS5zdF9tb2RlKSkKKwkJCQlwcmludGYoIkZpbGUgJXMgaXMgbm90IGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgd2FzIHNraXBwZWRcbiIsIGZ1bGxwYXRoWzBdKTsKKwkJCWVsc2UgaWYgKCFTX0lTUkVHKHN0YlsxXS5zdF9tb2RlKSAmJiAhU19JU0RJUihzdGJbMV0uc3RfbW9kZSkpCisJCQkJcHJpbnRmKCJGaWxlICVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnkgYW5kIHdhcyBza2lwcGVkXG4iLCBmdWxscGF0aFsxXSk7CisJCQllbHNlIGlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSAhPSBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkgeworCQkJCWlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSkKKwkJCQkJcHJpbnRmKCJGaWxlICVzIGlzIGEgJXMgd2hpbGUgZmlsZSAlcyBpcyBhICVzXG4iLCBmdWxscGF0aFswXSwgImRpcmVjdG9yeSIsIGZ1bGxwYXRoWzFdLCAicmVndWxhciBmaWxlIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIkZpbGUgJXMgaXMgYSAlcyB3aGlsZSBmaWxlICVzIGlzIGEgJXNcbiIsIGZ1bGxwYXRoWzBdLCAicmVndWxhciBmaWxlIiwgZnVsbHBhdGhbMV0sICJkaXJlY3RvcnkiKTsKKwkJCX0gZWxzZQorCQkJCXByaW50X3N0YXR1cyhkaWZmcmVnKHBhdGgpLCBmdWxscGF0aCk7CisKKwkJCWZyZWUoZnVsbHBhdGhbMF0pOworCQkJZnJlZShmdWxscGF0aFsxXSk7CisJCX0KKwkJZnJlZShkcFtrXSk7CisJCWxpc3Rba10ucysrOworCQlpZiAocG9zID09IDApIHsKKwkJCWZyZWUoZHBbMSAtIGtdKTsKKwkJCWxpc3RbMSAtIGtdLnMrKzsKKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShsaXN0WzBdLmRsKTsKKwkJZnJlZShsaXN0WzFdLmRsKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX2xvbmdvcHRzW10gQUxJR04xID0KKwkiaWdub3JlLWNhc2VcMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJpIgorCSJpZ25vcmUtdGFiLWV4cGFuc2lvblwwIiAgICAgTm9fYXJndW1lbnQgICAgICAgIkUiCisJImlnbm9yZS1zcGFjZS1jaGFuZ2VcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiYiIKKwkiaWdub3JlLWFsbC1zcGFjZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ3IgorCSJpZ25vcmUtYmxhbmstbGluZXNcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIkIiCisJInRleHRcMCIgICAgICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYSIKKwkidW5pZmllZFwwIiAgICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJVIgorCSJsYWJlbFwwIiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkwiCisJInNob3ctYy1mdW5jdGlvblwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicCIKKwkiYnJpZWZcMCIgICAgICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCSJleHBhbmQtdGFic1wwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisJImluaXRpYWwtdGFiXDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiVCIKKwkicmVjdXJzaXZlXDAiICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJyIgorCSJuZXctZmlsZVwwIiAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIk4iCisJInJlcG9ydC1pZGVudGljYWwtZmlsZXNcMCIgICBOb19hcmd1bWVudCAgICAgICAicyIKKwkic3RhcnRpbmctZmlsZVwwIiAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJTIgorCSJtaW5pbWFsXDAiICAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJOworI2VuZGlmCisKK2ludCBkaWZmX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkaWZmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZ290c3RkaW4gPSAwLCBpOworCWNoYXIgKmZpbGVbMl0sICpzX3N0YXJ0ID0gTlVMTDsKKwlsbGlzdF90ICpMX2FyZyA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCS8qIGV4YWN0bHkgMiBwYXJhbXM7IGNvbGxlY3QgbXVsdGlwbGUgLUwgPGxhYmVsPjsgLVUgTiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0yOkw6OlUrIjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBkaWZmX2xvbmdvcHRzOworI2VuZGlmCisJZ2V0b3B0MzIoYXJndiwgImFiZGlMOk5xcnNTOnRUVTp3dXBCRSIsCisJCQkmTF9hcmcsICZzX3N0YXJ0LCAmb3B0X1VfY29udGV4dCk7CisJYXJndiArPSBvcHRpbmQ7CisJd2hpbGUgKExfYXJnKQorCQlsYWJlbFshIWxhYmVsWzBdXSA9IGxsaXN0X3BvcCgmTF9hcmcpOworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlmaWxlW2ldID0gYXJndltpXTsKKwkJLyogQ29tcGF0OiAiZGlmZiBmaWxlIG5hbWVfd2hpY2hfZG9lc250X2V4aXN0IiBleGl0cyB3aXRoIDIgKi8KKwkJaWYgKExPTkVfREFTSChmaWxlW2ldKSkgeworCQkJZnN0YXQoU1RESU5fRklMRU5PLCAmc3RiW2ldKTsKKwkJCWdvdHN0ZGluKys7CisJCX0gZWxzZQorCQkJeHN0YXQoZmlsZVtpXSwgJnN0YltpXSk7CisJfQorCXhmdW5jX2Vycm9yX3JldHZhbCA9IDE7CisJaWYgKGdvdHN0ZGluICYmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSB8fCBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjb21wYXJlIHN0ZGluIHRvIGEgZGlyZWN0b3J5Iik7CisKKwkvKiBDb21wYXJlIG1ldGFkYXRhIHRvIGNoZWNrIGlmIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUgcGh5c2ljYWwgZmlsZS4KKwkgKgorCSAqIENvbW1lbnQgZnJvbSBkaWZmdXRpbHMgc291cmNlIHNheXM6CisJICogUE9TSVggc2F5cyB0aGF0IHR3byBmaWxlcyBhcmUgaWRlbnRpY2FsIGlmIHN0X2lubyBhbmQgc3RfZGV2IGFyZQorCSAqIHRoZSBzYW1lLCBidXQgbWFueSBmaWxlIHN5c3RlbXMgaW5jb3JyZWN0bHkgYXNzaWduIHRoZSBzYW1lIChkZXZpY2UsCisJICogaW5vZGUpIHBhaXIgdG8gdHdvIGRpc3RpbmN0IGZpbGVzLCBpbmNsdWRpbmc6CisJICogR05VL0xpbnV4IE5GUyBzZXJ2ZXJzIHRoYXQgZXhwb3J0IGFsbCBsb2NhbCBmaWxlIHN5c3RlbXMgYXMgYQorCSAqIHNpbmdsZSBORlMgZmlsZSBzeXN0ZW0sIGlmIGEgbG9jYWwgZGV2aWNlIG51bWJlciAoc3RfZGV2KSBleGNlZWRzCisJICogMjU1LCBvciBpZiBhIGxvY2FsIGlub2RlIG51bWJlciAoc3RfaW5vKSBleGNlZWRzIDE2Nzc3MjE1LgorCSAqLworCWlmIChFTkFCTEVfREVTS1RPUAorCSAmJiBzdGJbMF0uc3RfaW5vID09IHN0YlsxXS5zdF9pbm8KKwkgJiYgc3RiWzBdLnN0X2RldiA9PSBzdGJbMV0uc3RfZGV2CisJICYmIHN0YlswXS5zdF9zaXplID09IHN0YlsxXS5zdF9zaXplCisJICYmIHN0YlswXS5zdF9tdGltZSA9PSBzdGJbMV0uc3RfbXRpbWUKKwkgJiYgc3RiWzBdLnN0X2N0aW1lID09IHN0YlsxXS5zdF9jdGltZQorCSAmJiBzdGJbMF0uc3RfbW9kZSA9PSBzdGJbMV0uc3RfbW9kZQorCSAmJiBzdGJbMF0uc3RfbmxpbmsgPT0gc3RiWzFdLnN0X25saW5rCisJICYmIHN0YlswXS5zdF91aWQgPT0gc3RiWzFdLnN0X3VpZAorCSAmJiBzdGJbMF0uc3RfZ2lkID09IHN0YlsxXS5zdF9naWQKKwkpIHsKKwkJLyogZmlsZXMgYXJlIHBoeXNpY2FsbHkgdGhlIHNhbWU7IG5vIG5lZWQgdG8gY29tcGFyZSB0aGVtICovCisJCXJldHVybiBTVEFUVVNfU0FNRTsKKwl9CisKKwlpZiAoU19JU0RJUihzdGJbMF0uc3RfbW9kZSkgJiYgU19JU0RJUihzdGJbMV0uc3RfbW9kZSkpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ESUZGX0RJUgorCQlkaWZmZGlyKGZpbGUsIHNfc3RhcnQpOworI2Vsc2UKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHN1cHBvcnQgZm9yIGRpcmVjdG9yeSBjb21wYXJpc29uIik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlib29sIGRpcmZpbGUgPSBTX0lTRElSKHN0YlswXS5zdF9tb2RlKSB8fCBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKTsKKwkJYm9vbCBkaXIgPSBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKTsKKwkJaWYgKGRpcmZpbGUpIHsKKwkJCWNvbnN0IGNoYXIgKnNsYXNoID0gc3RycmNocihmaWxlWyFkaXJdLCAnLycpOworCQkJZmlsZVtkaXJdID0gY29uY2F0X3BhdGhfZmlsZShmaWxlW2Rpcl0sIHNsYXNoID8gc2xhc2ggKyAxIDogZmlsZVshZGlyXSk7CisJCQl4c3RhdChmaWxlW2Rpcl0sICZzdGJbZGlyXSk7CisJCX0KKwkJLyogZGlmZnJlZyBjYW4gZ2V0IG5vbi1yZWd1bGFyIGZpbGVzIGhlcmUgKi8KKwkJcHJpbnRfc3RhdHVzKGdvdHN0ZGluID4gMSA/IFNUQVRVU19TQU1FIDogZGlmZnJlZyhmaWxlKSwgZmlsZSk7CisKKwkJaWYgKGRpcmZpbGUpCisJCQlmcmVlKGZpbGVbZGlyXSk7CisJfQorCisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9lZC5jIGIvZWRpdG9ycy9lZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjUxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL2VkLmMKQEAgLTAsMCArMSwxMDM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgYnkgRGF2aWQgSS4gQmVsbAorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5IHRoaXMgc291cmNlLAorICogcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgcmVtYWlucyBpbnRhY3QuCisgKgorICogVGhlICJlZCIgYnVpbHQtaW4gY29tbWFuZCAobXVjaCBzaW1wbGlmaWVkKQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBlZF90cml2aWFsX3VzYWdlICIiCisvL3VzYWdlOiNkZWZpbmUgZWRfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTElORSB7CisJc3RydWN0IExJTkUgKm5leHQ7CisJc3RydWN0IExJTkUgKnByZXY7CisJaW50IGxlbjsKKwljaGFyIGRhdGFbMV07Cit9IExJTkU7CisKKworI2RlZmluZSBzZWFyY2hTdHJpbmcgYmJfY29tbW9uX2J1ZnNpejEKKworZW51bSB7CisJVVNFUlNJWkUgPSBzaXplb2Yoc2VhcmNoU3RyaW5nKSA+IDEwMjQgPyAxMDI0CisJICAgICAgICAgOiBzaXplb2Yoc2VhcmNoU3RyaW5nKSAtIDEsIC8qIG1heCBsaW5lIGxlbmd0aCB0eXBlZCBpbiBieSB1c2VyICovCisJSU5JVEJVRl9TSVpFID0gMTAyNCwgLyogaW5pdGlhbCBidWZmZXIgc2l6ZSAqLworfTsKKworc3RydWN0IGdsb2JhbHMgeworCWludCBjdXJOdW07CisJaW50IGxhc3ROdW07CisJaW50IGJ1ZlVzZWQ7CisJaW50IGJ1ZlNpemU7CisJTElORSAqY3VyTGluZTsKKwljaGFyICpidWZCYXNlOworCWNoYXIgKmJ1ZlB0cjsKKwljaGFyICpmaWxlTmFtZTsKKwlMSU5FIGxpbmVzOworCXNtYWxsaW50IGRpcnR5OworCWludCBtYXJrc1syNl07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGN1ckxpbmUgICAgICAgICAgICAoRy5jdXJMaW5lICAgICAgICAgICApCisjZGVmaW5lIGJ1ZkJhc2UgICAgICAgICAgICAoRy5idWZCYXNlICAgICAgICAgICApCisjZGVmaW5lIGJ1ZlB0ciAgICAgICAgICAgICAoRy5idWZQdHIgICAgICAgICAgICApCisjZGVmaW5lIGZpbGVOYW1lICAgICAgICAgICAoRy5maWxlTmFtZSAgICAgICAgICApCisjZGVmaW5lIGN1ck51bSAgICAgICAgICAgICAoRy5jdXJOdW0gICAgICAgICAgICApCisjZGVmaW5lIGxhc3ROdW0gICAgICAgICAgICAoRy5sYXN0TnVtICAgICAgICAgICApCisjZGVmaW5lIGJ1ZlVzZWQgICAgICAgICAgICAoRy5idWZVc2VkICAgICAgICAgICApCisjZGVmaW5lIGJ1ZlNpemUgICAgICAgICAgICAoRy5idWZTaXplICAgICAgICAgICApCisjZGVmaW5lIGRpcnR5ICAgICAgICAgICAgICAoRy5kaXJ0eSAgICAgICAgICAgICApCisjZGVmaW5lIGxpbmVzICAgICAgICAgICAgICAoRy5saW5lcyAgICAgICAgICAgICApCisjZGVmaW5lIG1hcmtzICAgICAgICAgICAgICAoRy5tYXJrcyAgICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB2b2lkIGRvQ29tbWFuZHModm9pZCk7CitzdGF0aWMgdm9pZCBzdWJDb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwgaW50IG51bTEsIGludCBudW0yKTsKK3N0YXRpYyBpbnQgZ2V0TnVtKGNvbnN0IGNoYXIgKipyZXRjcCwgc21hbGxpbnQgKnJldEhhdmVOdW0sIGludCAqcmV0TnVtKTsKK3N0YXRpYyBpbnQgc2V0Q3VyTnVtKGludCBudW0pOworc3RhdGljIHZvaWQgYWRkTGluZXMoaW50IG51bSk7CitzdGF0aWMgaW50IGluc2VydExpbmUoaW50IG51bSwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkZWxldGVMaW5lcyhpbnQgbnVtMSwgaW50IG51bTIpOworc3RhdGljIGludCBwcmludExpbmVzKGludCBudW0xLCBpbnQgbnVtMiwgaW50IGV4cGFuZEZsYWcpOworc3RhdGljIGludCB3cml0ZUxpbmVzKGNvbnN0IGNoYXIgKmZpbGUsIGludCBudW0xLCBpbnQgbnVtMik7CitzdGF0aWMgaW50IHJlYWRMaW5lcyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgc2VhcmNoTGluZXMoY29uc3QgY2hhciAqc3RyLCBpbnQgbnVtMSwgaW50IG51bTIpOworc3RhdGljIExJTkUgKmZpbmRMaW5lKGludCBudW0pOworc3RhdGljIGludCBmaW5kU3RyaW5nKGNvbnN0IExJTkUgKmxwLCBjb25zdCBjaGFyICogc3RyLCBpbnQgbGVuLCBpbnQgb2Zmc2V0KTsKKworCitzdGF0aWMgaW50IGJhZF9udW1zKGludCBudW0xLCBpbnQgbnVtMiwgY29uc3QgY2hhciAqZm9yX3doYXQpCit7CisJaWYgKChudW0xIDwgMSkgfHwgKG51bTIgPiBsYXN0TnVtKSB8fCAobnVtMSA+IG51bTIpKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGxpbmUgcmFuZ2UgZm9yICVzIiwgZm9yX3doYXQpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNoYXIgKnNraXBfYmxhbmsoY29uc3QgY2hhciAqY3ApCit7CisJd2hpbGUgKGlzYmxhbmsoKmNwKSkKKwkJY3ArKzsKKwlyZXR1cm4gKGNoYXIgKiljcDsKK30KKworCitpbnQgZWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGVkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJTklUX0coKTsKKworCWJ1ZlNpemUgPSBJTklUQlVGX1NJWkU7CisJYnVmQmFzZSA9IHhtYWxsb2MoYnVmU2l6ZSk7CisJYnVmUHRyID0gYnVmQmFzZTsKKwlsaW5lcy5uZXh0ID0gJmxpbmVzOworCWxpbmVzLnByZXYgPSAmbGluZXM7CisKKwlpZiAoYXJndlsxXSkgeworCQlmaWxlTmFtZSA9IHhzdHJkdXAoYXJndlsxXSk7CisJCWlmICghcmVhZExpbmVzKGZpbGVOYW1lLCAxKSkgeworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQlpZiAobGFzdE51bSkKKwkJCXNldEN1ck51bSgxKTsKKwkJZGlydHkgPSBGQUxTRTsKKwl9CisKKwlkb0NvbW1hbmRzKCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworLyoKKyAqIFJlYWQgY29tbWFuZHMgdW50aWwgd2UgYXJlIHRvbGQgdG8gc3RvcC4KKyAqLworc3RhdGljIHZvaWQgZG9Db21tYW5kcyh2b2lkKQoreworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmVuZGJ1ZiwgYnVmW1VTRVJTSVpFXTsKKwlpbnQgbGVuLCBudW0xLCBudW0yOworCXNtYWxsaW50IGhhdmUxLCBoYXZlMjsKKworCXdoaWxlIChUUlVFKSB7CisJCS8qIFJldHVybnM6CisJCSAqIC0xIG9uIHJlYWQgZXJyb3JzIG9yIEVPRiwgb3Igb24gYmFyZSBDdHJsLUQuCisJCSAqIDAgIG9uIGN0cmwtQywKKwkJICogPjAgbGVuZ3RoIG9mIGlucHV0IHN0cmluZywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nICdcbicKKwkJICovCisJCWxlbiA9IHJlYWRfbGluZV9pbnB1dChOVUxMLCAiOiAiLCBidWYsIHNpemVvZihidWYpLCAvKnRpbWVvdXQqLyAtMSk7CisJCWlmIChsZW4gPD0gMCkKKwkJCXJldHVybjsKKwkJZW5kYnVmID0gJmJ1ZltsZW4gLSAxXTsKKwkJd2hpbGUgKChlbmRidWYgPiBidWYpICYmIGlzYmxhbmsoZW5kYnVmWy0xXSkpCisJCQllbmRidWYtLTsKKwkJKmVuZGJ1ZiA9ICdcMCc7CisKKwkJY3AgPSBza2lwX2JsYW5rKGJ1Zik7CisJCWhhdmUxID0gRkFMU0U7CisJCWhhdmUyID0gRkFMU0U7CisKKwkJaWYgKChjdXJOdW0gPT0gMCkgJiYgKGxhc3ROdW0gPiAwKSkgeworCQkJY3VyTnVtID0gMTsKKwkJCWN1ckxpbmUgPSBsaW5lcy5uZXh0OworCQl9CisKKwkJaWYgKCFnZXROdW0oJmNwLCAmaGF2ZTEsICZudW0xKSkKKwkJCWNvbnRpbnVlOworCisJCWNwID0gc2tpcF9ibGFuayhjcCk7CisKKwkJaWYgKCpjcCA9PSAnLCcpIHsKKwkJCWNwKys7CisJCQlpZiAoIWdldE51bSgmY3AsICZoYXZlMiwgJm51bTIpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFoYXZlMSkKKwkJCQludW0xID0gMTsKKwkJCWlmICghaGF2ZTIpCisJCQkJbnVtMiA9IGxhc3ROdW07CisJCQloYXZlMSA9IFRSVUU7CisJCQloYXZlMiA9IFRSVUU7CisJCX0KKwkJaWYgKCFoYXZlMSkKKwkJCW51bTEgPSBjdXJOdW07CisJCWlmICghaGF2ZTIpCisJCQludW0yID0gbnVtMTsKKworCQlzd2l0Y2ggKCpjcCsrKSB7CisJCWNhc2UgJ2EnOgorCQkJYWRkTGluZXMobnVtMSArIDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnYyc6CisJCQlkZWxldGVMaW5lcyhudW0xLCBudW0yKTsKKwkJCWFkZExpbmVzKG51bTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnZCc6CisJCQlkZWxldGVMaW5lcyhudW0xLCBudW0yKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2YnOgorCQkJaWYgKCpjcCAmJiAhaXNibGFuaygqY3ApKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJiYWQgZmlsZSBjb21tYW5kIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljcCA9IHNraXBfYmxhbmsoY3ApOworCQkJaWYgKCpjcCA9PSAnXDAnKSB7CisJCQkJaWYgKGZpbGVOYW1lKQorCQkJCQlwcmludGYoIlwiJXNcIlxuIiwgZmlsZU5hbWUpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCJObyBmaWxlIG5hbWVcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZnJlZShmaWxlTmFtZSk7CisJCQlmaWxlTmFtZSA9IHhzdHJkdXAoY3ApOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCQlhZGRMaW5lcyhudW0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2snOgorCQkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKwkJCWlmICgoKmNwIDwgJ2EnKSB8fCAoKmNwID4gJ3onKSB8fCBjcFsxXSkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIG1hcmsgbmFtZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWFya3NbKmNwIC0gJ2EnXSA9IG51bTI7CisJCQlicmVhazsKKworCQljYXNlICdsJzoKKwkJCXByaW50TGluZXMobnVtMSwgbnVtMiwgVFJVRSk7CisJCQlicmVhazsKKworCQljYXNlICdwJzoKKwkJCXByaW50TGluZXMobnVtMSwgbnVtMiwgRkFMU0UpOworCQkJYnJlYWs7CisKKwkJY2FzZSAncSc6CisJCQljcCA9IHNraXBfYmxhbmsoY3ApOworCQkJaWYgKGhhdmUxIHx8ICpjcCkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIHF1aXQgY29tbWFuZCIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFkaXJ0eSkKKwkJCQlyZXR1cm47CisJCQlsZW4gPSByZWFkX2xpbmVfaW5wdXQoTlVMTCwgIlJlYWxseSBxdWl0PyAiLCBidWYsIDE2LCAvKnRpbWVvdXQqLyAtMSk7CisJCQkvKiByZWFkIGVycm9yL0VPRiAtIG5vIHdheSB0byBjb250aW51ZSAqLworCQkJaWYgKGxlbiA8IDApCisJCQkJcmV0dXJuOworCQkJY3AgPSBza2lwX2JsYW5rKGJ1Zik7CisJCQlpZiAoKCpjcCB8IDB4MjApID09ICd5JykgLyogWSBvciB5ICovCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSAncic6CisJCQlpZiAoKmNwICYmICFpc2JsYW5rKCpjcCkpIHsKKwkJCQliYl9lcnJvcl9tc2coImJhZCByZWFkIGNvbW1hbmQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwID0gc2tpcF9ibGFuayhjcCk7CisJCQlpZiAoKmNwID09ICdcMCcpIHsKKwkJCQliYl9lcnJvcl9tc2coIm5vIGZpbGUgbmFtZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFoYXZlMSkKKwkJCQludW0xID0gbGFzdE51bTsKKwkJCWlmIChyZWFkTGluZXMoY3AsIG51bTEgKyAxKSkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlTmFtZSA9PSBOVUxMKQorCQkJCWZpbGVOYW1lID0geHN0cmR1cChjcCk7CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCXN1YkNvbW1hbmQoY3AsIG51bTEsIG51bTIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAndyc6CisJCQlpZiAoKmNwICYmICFpc2JsYW5rKCpjcCkpIHsKKwkJCQliYl9lcnJvcl9tc2coImJhZCB3cml0ZSBjb21tYW5kIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljcCA9IHNraXBfYmxhbmsoY3ApOworCQkJaWYgKCFoYXZlMSkgeworCQkJCW51bTEgPSAxOworCQkJCW51bTIgPSBsYXN0TnVtOworCQkJfQorCQkJaWYgKCpjcCA9PSAnXDAnKQorCQkJCWNwID0gZmlsZU5hbWU7CisJCQlpZiAoY3AgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZygibm8gZmlsZSBuYW1lIHNwZWNpZmllZCIpOworCQkJCWJyZWFrOworCQkJfQorCQkJd3JpdGVMaW5lcyhjcCwgbnVtMSwgbnVtMik7CisJCQlicmVhazsKKworCQljYXNlICd6JzoKKwkJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlICctJzoKKwkJCQlwcmludExpbmVzKGN1ck51bSAtIDIxLCBjdXJOdW0sIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy4nOgorCQkJCXByaW50TGluZXMoY3VyTnVtIC0gMTEsIGN1ck51bSArIDEwLCBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50TGluZXMoY3VyTnVtLCBjdXJOdW0gKyAyMSwgRkFMU0UpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnLic6CisJCQlpZiAoaGF2ZTEpIHsKKwkJCQliYl9lcnJvcl9tc2coIm5vIGFyZ3VtZW50cyBhbGxvd2VkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmludExpbmVzKGN1ck51bSwgY3VyTnVtLCBGQUxTRSk7CisJCQlicmVhazsKKworCQljYXNlICctJzoKKwkJCWlmIChzZXRDdXJOdW0oY3VyTnVtIC0gMSkpCisJCQkJcHJpbnRMaW5lcyhjdXJOdW0sIGN1ck51bSwgRkFMU0UpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPSc6CisJCQlwcmludGYoIiVkXG4iLCBudW0xKTsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlpZiAoaGF2ZTEpIHsKKwkJCQlwcmludExpbmVzKG51bTIsIG51bTIsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzZXRDdXJOdW0oY3VyTnVtICsgMSkpCisJCQkJcHJpbnRMaW5lcyhjdXJOdW0sIGN1ck51bSwgRkFMU0UpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZygidW5pbXBsZW1lbnRlZCBjb21tYW5kIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogRG8gdGhlIHN1YnN0aXR1dGUgY29tbWFuZC4KKyAqIFRoZSBjdXJyZW50IGxpbmUgaXMgc2V0IHRvIHRoZSBsYXN0IHN1YnN0aXR1dGlvbiBkb25lLgorICovCitzdGF0aWMgdm9pZCBzdWJDb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwgaW50IG51bTEsIGludCBudW0yKQoreworCWNoYXIgKmNwLCAqb2xkU3RyLCAqbmV3U3RyLCBidWZbVVNFUlNJWkVdOworCWludCBkZWxpbSwgb2xkTGVuLCBuZXdMZW4sIGRlbHRhTGVuLCBvZmZzZXQ7CisJTElORSAqbHAsICpubHA7CisJaW50IGdsb2JhbEZsYWcsIHByaW50RmxhZywgZGlkU3ViLCBuZWVkUHJpbnQ7CisKKwlpZiAoYmFkX251bXMobnVtMSwgbnVtMiwgInN1YnN0aXR1dGUiKSkKKwkJcmV0dXJuOworCisJZ2xvYmFsRmxhZyA9IEZBTFNFOworCXByaW50RmxhZyA9IEZBTFNFOworCWRpZFN1YiA9IEZBTFNFOworCW5lZWRQcmludCA9IEZBTFNFOworCisJLyoKKwkgKiBDb3B5IHRoZSBjb21tYW5kIHNvIHdlIGNhbiBtb2RpZnkgaXQuCisJICovCisJc3RyY3B5KGJ1ZiwgY21kKTsKKwljcCA9IGJ1ZjsKKworCWlmIChpc2JsYW5rKCpjcCkgfHwgKCpjcCA9PSAnXDAnKSkgeworCQliYl9lcnJvcl9tc2coImJhZCBkZWxpbWl0ZXIgZm9yIHN1YnN0aXR1dGUiKTsKKwkJcmV0dXJuOworCX0KKworCWRlbGltID0gKmNwKys7CisJb2xkU3RyID0gY3A7CisKKwljcCA9IHN0cmNocihjcCwgZGVsaW0pOworCWlmIChjcCA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZygibWlzc2luZyAybmQgZGVsaW1pdGVyIGZvciBzdWJzdGl0dXRlIik7CisJCXJldHVybjsKKwl9CisKKwkqY3ArKyA9ICdcMCc7CisKKwluZXdTdHIgPSBjcDsKKwljcCA9IHN0cmNocihjcCwgZGVsaW0pOworCisJaWYgKGNwKQorCQkqY3ArKyA9ICdcMCc7CisJZWxzZQorCQljcCA9IChjaGFyKikiIjsKKworCXdoaWxlICgqY3ApIHN3aXRjaCAoKmNwKyspIHsKKwkJY2FzZSAnZyc6CisJCQlnbG9iYWxGbGFnID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXByaW50RmxhZyA9IFRSVUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZygidW5rbm93biBvcHRpb24gZm9yIHN1YnN0aXR1dGUiKTsKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoKm9sZFN0ciA9PSAnXDAnKSB7CisJCWlmIChzZWFyY2hTdHJpbmdbMF0gPT0gJ1wwJykgeworCQkJYmJfZXJyb3JfbXNnKCJubyBwcmV2aW91cyBzZWFyY2ggc3RyaW5nIik7CisJCQlyZXR1cm47CisJCX0KKwkJb2xkU3RyID0gc2VhcmNoU3RyaW5nOworCX0KKworCWlmIChvbGRTdHIgIT0gc2VhcmNoU3RyaW5nKQorCQlzdHJjcHkoc2VhcmNoU3RyaW5nLCBvbGRTdHIpOworCisJbHAgPSBmaW5kTGluZShudW0xKTsKKwlpZiAobHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJb2xkTGVuID0gc3RybGVuKG9sZFN0cik7CisJbmV3TGVuID0gc3RybGVuKG5ld1N0cik7CisJZGVsdGFMZW4gPSBuZXdMZW4gLSBvbGRMZW47CisJb2Zmc2V0ID0gMDsKKwlubHAgPSBOVUxMOworCisJd2hpbGUgKG51bTEgPD0gbnVtMikgeworCQlvZmZzZXQgPSBmaW5kU3RyaW5nKGxwLCBvbGRTdHIsIG9sZExlbiwgb2Zmc2V0KTsKKworCQlpZiAob2Zmc2V0IDwgMCkgeworCQkJaWYgKG5lZWRQcmludCkgeworCQkJCXByaW50TGluZXMobnVtMSwgbnVtMSwgRkFMU0UpOworCQkJCW5lZWRQcmludCA9IEZBTFNFOworCQkJfQorCQkJb2Zmc2V0ID0gMDsKKwkJCWxwID0gbHAtPm5leHQ7CisJCQludW0xKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCW5lZWRQcmludCA9IHByaW50RmxhZzsKKwkJZGlkU3ViID0gVFJVRTsKKwkJZGlydHkgPSBUUlVFOworCisJCS8qCisJCSAqIElmIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaXMgdGhlIHNhbWUgc2l6ZSBvciBzaG9ydGVyCisJCSAqIHRoYW4gdGhlIG9sZCBzdHJpbmcsIHRoZW4gdGhlIHN1YnN0aXR1dGlvbiBpcyBlYXN5LgorCQkgKi8KKwkJaWYgKGRlbHRhTGVuIDw9IDApIHsKKwkJCW1lbWNweSgmbHAtPmRhdGFbb2Zmc2V0XSwgbmV3U3RyLCBuZXdMZW4pOworCQkJaWYgKGRlbHRhTGVuKSB7CisJCQkJbWVtY3B5KCZscC0+ZGF0YVtvZmZzZXQgKyBuZXdMZW5dLAorCQkJCQkmbHAtPmRhdGFbb2Zmc2V0ICsgb2xkTGVuXSwKKwkJCQkJbHAtPmxlbiAtIG9mZnNldCAtIG9sZExlbik7CisKKwkJCQlscC0+bGVuICs9IGRlbHRhTGVuOworCQkJfQorCQkJb2Zmc2V0ICs9IG5ld0xlbjsKKwkJCWlmIChnbG9iYWxGbGFnKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5lZWRQcmludCkgeworCQkJCXByaW50TGluZXMobnVtMSwgbnVtMSwgRkFMU0UpOworCQkJCW5lZWRQcmludCA9IEZBTFNFOworCQkJfQorCQkJbHAgPSBscC0+bmV4dDsKKwkJCW51bTErKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIG5ldyBzdHJpbmcgaXMgbGFyZ2VyLCBzbyBhbGxvY2F0ZSBhIG5ldyBsaW5lCisJCSAqIHN0cnVjdHVyZSBhbmQgdXNlIHRoYXQuICBMaW5rIGl0IGluIHBsYWNlIG9mCisJCSAqIHRoZSBvbGQgbGluZSBzdHJ1Y3R1cmUuCisJCSAqLworCQlubHAgPSB4bWFsbG9jKHNpemVvZihMSU5FKSArIGxwLT5sZW4gKyBkZWx0YUxlbik7CisKKwkJbmxwLT5sZW4gPSBscC0+bGVuICsgZGVsdGFMZW47CisKKwkJbWVtY3B5KG5scC0+ZGF0YSwgbHAtPmRhdGEsIG9mZnNldCk7CisJCW1lbWNweSgmbmxwLT5kYXRhW29mZnNldF0sIG5ld1N0ciwgbmV3TGVuKTsKKwkJbWVtY3B5KCZubHAtPmRhdGFbb2Zmc2V0ICsgbmV3TGVuXSwKKwkJCSZscC0+ZGF0YVtvZmZzZXQgKyBvbGRMZW5dLAorCQkJbHAtPmxlbiAtIG9mZnNldCAtIG9sZExlbik7CisKKwkJbmxwLT5uZXh0ID0gbHAtPm5leHQ7CisJCW5scC0+cHJldiA9IGxwLT5wcmV2OworCQlubHAtPnByZXYtPm5leHQgPSBubHA7CisJCW5scC0+bmV4dC0+cHJldiA9IG5scDsKKworCQlpZiAoY3VyTGluZSA9PSBscCkKKwkJCWN1ckxpbmUgPSBubHA7CisKKwkJZnJlZShscCk7CisJCWxwID0gbmxwOworCisJCW9mZnNldCArPSBuZXdMZW47CisKKwkJaWYgKGdsb2JhbEZsYWcpCisJCQljb250aW51ZTsKKworCQlpZiAobmVlZFByaW50KSB7CisJCQlwcmludExpbmVzKG51bTEsIG51bTEsIEZBTFNFKTsKKwkJCW5lZWRQcmludCA9IEZBTFNFOworCQl9CisKKwkJbHAgPSBscC0+bmV4dDsKKwkJbnVtMSsrOworCX0KKworCWlmICghZGlkU3ViKQorCQliYl9lcnJvcl9tc2coIm5vIHN1YnN0aXR1dGlvbnMgZm91bmQgZm9yIFwiJXNcIiIsIG9sZFN0cik7Cit9CisKKworLyoKKyAqIFNlYXJjaCBhIGxpbmUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQKKyAqIG9mZnNldCBpbiB0aGUgbGluZS4gIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgZm91bmQgc3RyaW5nLCBvciAtMS4KKyAqLworc3RhdGljIGludCBmaW5kU3RyaW5nKGNvbnN0IExJTkUgKmxwLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4sIGludCBvZmZzZXQpCit7CisJaW50IGxlZnQ7CisJY29uc3QgY2hhciAqY3AsICpuY3A7CisKKwljcCA9ICZscC0+ZGF0YVtvZmZzZXRdOworCWxlZnQgPSBscC0+bGVuIC0gb2Zmc2V0OworCisJd2hpbGUgKGxlZnQgPj0gbGVuKSB7CisJCW5jcCA9IG1lbWNocihjcCwgKnN0ciwgbGVmdCk7CisJCWlmIChuY3AgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJbGVmdCAtPSAobmNwIC0gY3ApOworCQlpZiAobGVmdCA8IGxlbikKKwkJCXJldHVybiAtMTsKKwkJY3AgPSBuY3A7CisJCWlmIChtZW1jbXAoY3AsIHN0ciwgbGVuKSA9PSAwKQorCQkJcmV0dXJuIChjcCAtIGxwLT5kYXRhKTsKKwkJY3ArKzsKKwkJbGVmdC0tOworCX0KKworCXJldHVybiAtMTsKK30KKworCisvKgorICogQWRkIGxpbmVzIHdoaWNoIGFyZSB0eXBlZCBpbiBieSB0aGUgdXNlci4KKyAqIFRoZSBsaW5lcyBhcmUgaW5zZXJ0ZWQganVzdCBiZWZvcmUgdGhlIHNwZWNpZmllZCBsaW5lIG51bWJlci4KKyAqIFRoZSBsaW5lcyBhcmUgdGVybWluYXRlZCBieSBhIGxpbmUgY29udGFpbmluZyBhIHNpbmdsZSBkb3QgKHVnbHkhKSwKKyAqIG9yIGJ5IGFuIGVuZCBvZiBmaWxlLgorICovCitzdGF0aWMgdm9pZCBhZGRMaW5lcyhpbnQgbnVtKQoreworCWludCBsZW47CisJY2hhciBidWZbVVNFUlNJWkUgKyAxXTsKKworCXdoaWxlICgxKSB7CisJCS8qIFJldHVybnM6CisJCSAqIC0xIG9uIHJlYWQgZXJyb3JzIG9yIEVPRiwgb3Igb24gYmFyZSBDdHJsLUQuCisJCSAqIDAgIG9uIGN0cmwtQywKKwkJICogPjAgbGVuZ3RoIG9mIGlucHV0IHN0cmluZywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nICdcbicKKwkJICovCisJCWxlbiA9IHJlYWRfbGluZV9pbnB1dChOVUxMLCAiIiwgYnVmLCBzaXplb2YoYnVmKSwgLyp0aW1lb3V0Ki8gLTEpOworCQlpZiAobGVuIDw9IDApIHsKKwkJCS8qIFByZXZpb3VzbHksIGN0cmwtQyB3YXMgZXhpdGluZyB0byBzaGVsbC4KKwkJCSAqIE5vdyB3ZSBleGl0IHRvIGVkIHByb21wdC4gSXMgaW4gaW1wb3J0YW50PyAqLworCQkJcmV0dXJuOworCQl9CisJCWlmICgoYnVmWzBdID09ICcuJykgJiYgKGJ1ZlsxXSA9PSAnXG4nKSAmJiAoYnVmWzJdID09ICdcMCcpKQorCQkJcmV0dXJuOworCQlpZiAoIWluc2VydExpbmUobnVtKyssIGJ1ZiwgbGVuKSkKKwkJCXJldHVybjsKKwl9Cit9CisKKworLyoKKyAqIFBhcnNlIGEgbGluZSBudW1iZXIgYXJndW1lbnQgaWYgaXQgaXMgcHJlc2VudC4gIFRoaXMgaXMgYSBzdW0KKyAqIG9yIGRpZmZlcmVuY2Ugb2YgbnVtYmVycywgJy4nLCAnJCcsICd4LCBvciBhIHNlYXJjaCBzdHJpbmcuCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCAod2hldGhlciBvciBub3QgdGhlcmUgd2FzIGEgbnVtYmVyKS4KKyAqIFJldHVybnMgRkFMU0UgaWYgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvciwgd2l0aCBhIG1lc3NhZ2Ugb3V0cHV0LgorICogV2hldGhlciB0aGVyZSB3YXMgYSBudW1iZXIgaXMgcmV0dXJuZWQgaW5kaXJlY3RseSwgYXMgaXMgdGhlIG51bWJlci4KKyAqIFRoZSBjaGFyYWN0ZXIgcG9pbnRlciB3aGljaCBzdG9wcGVkIHRoZSBzY2FuIGlzIGFsc28gcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0TnVtKGNvbnN0IGNoYXIgKipyZXRjcCwgc21hbGxpbnQgKnJldEhhdmVOdW0sIGludCAqcmV0TnVtKQoreworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmVuZFN0ciwgc3RyW1VTRVJTSVpFXTsKKwlpbnQgdmFsdWUsIG51bTsKKwlzbWFsbGludCBoYXZlTnVtLCBtaW51czsKKworCWNwID0gKnJldGNwOworCXZhbHVlID0gMDsKKwloYXZlTnVtID0gRkFMU0U7CisJbWludXMgPSAwOworCisJd2hpbGUgKFRSVUUpIHsKKwkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKworCQlzd2l0Y2ggKCpjcCkgeworCQkJY2FzZSAnLic6CisJCQkJaGF2ZU51bSA9IFRSVUU7CisJCQkJbnVtID0gY3VyTnVtOworCQkJCWNwKys7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJyQnOgorCQkJCWhhdmVOdW0gPSBUUlVFOworCQkJCW51bSA9IGxhc3ROdW07CisJCQkJY3ArKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnXCcnOgorCQkJCWNwKys7CisJCQkJaWYgKCgqY3AgPCAnYScpIHx8ICgqY3AgPiAneicpKSB7CisJCQkJCWJiX2Vycm9yX21zZygiYmFkIG1hcmsgbmFtZSIpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWhhdmVOdW0gPSBUUlVFOworCQkJCW51bSA9IG1hcmtzWypjcCsrIC0gJ2EnXTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnLyc6CisJCQkJc3RyY3B5KHN0ciwgKytjcCk7CisJCQkJZW5kU3RyID0gc3RyY2hyKHN0ciwgJy8nKTsKKwkJCQlpZiAoZW5kU3RyKSB7CisJCQkJCSplbmRTdHIrKyA9ICdcMCc7CisJCQkJCWNwICs9IChlbmRTdHIgLSBzdHIpOworCQkJCX0gZWxzZQorCQkJCQljcCA9ICIiOworCQkJCW51bSA9IHNlYXJjaExpbmVzKHN0ciwgY3VyTnVtLCBsYXN0TnVtKTsKKwkJCQlpZiAobnVtID09IDApCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQloYXZlTnVtID0gVFJVRTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIWlzZGlnaXQoKmNwKSkgeworCQkJCQkqcmV0Y3AgPSBjcDsKKwkJCQkJKnJldEhhdmVOdW0gPSBoYXZlTnVtOworCQkJCQkqcmV0TnVtID0gdmFsdWU7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCQludW0gPSAwOworCQkJCXdoaWxlIChpc2RpZ2l0KCpjcCkpCisJCQkJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJCQkJaGF2ZU51bSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCX0KKworCQl2YWx1ZSArPSAobWludXMgPyAtbnVtIDogbnVtKTsKKworCQljcCA9IHNraXBfYmxhbmsoY3ApOworCisJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlICctJzoKKwkJCQltaW51cyA9IDE7CisJCQkJY3ArKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnKyc6CisJCQkJbWludXMgPSAwOworCQkJCWNwKys7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJKnJldGNwID0gY3A7CisJCQkJKnJldEhhdmVOdW0gPSBoYXZlTnVtOworCQkJCSpyZXROdW0gPSB2YWx1ZTsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KK30KKworCisvKgorICogUmVhZCBsaW5lcyBmcm9tIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIGxpbmUgbnVtYmVyLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgcmVhZC4KKyAqLworc3RhdGljIGludCByZWFkTGluZXMoY29uc3QgY2hhciAqZmlsZSwgaW50IG51bSkKK3sKKwlpbnQgZmQsIGNjOworCWludCBsZW4sIGxpbmVDb3VudCwgY2hhckNvdW50OworCWNoYXIgKmNwOworCisJaWYgKChudW0gPCAxKSB8fCAobnVtID4gbGFzdE51bSArIDEpKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGxpbmUgZm9yIHJlYWQiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWZkID0gb3BlbihmaWxlLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJYnVmUHRyID0gYnVmQmFzZTsKKwlidWZVc2VkID0gMDsKKwlsaW5lQ291bnQgPSAwOworCWNoYXJDb3VudCA9IDA7CisJY2MgPSAwOworCisJcHJpbnRmKCJcIiVzXCIsICIsIGZpbGUpOworCWZmbHVzaF9hbGwoKTsKKworCWRvIHsKKwkJY3AgPSBtZW1jaHIoYnVmUHRyLCAnXG4nLCBidWZVc2VkKTsKKworCQlpZiAoY3ApIHsKKwkJCWxlbiA9IChjcCAtIGJ1ZlB0cikgKyAxOworCQkJaWYgKCFpbnNlcnRMaW5lKG51bSwgYnVmUHRyLCBsZW4pKSB7CisJCQkJY2xvc2UoZmQpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJ1ZlB0ciArPSBsZW47CisJCQlidWZVc2VkIC09IGxlbjsKKwkJCWNoYXJDb3VudCArPSBsZW47CisJCQlsaW5lQ291bnQrKzsKKwkJCW51bSsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYnVmUHRyICE9IGJ1ZkJhc2UpIHsKKwkJCW1lbWNweShidWZCYXNlLCBidWZQdHIsIGJ1ZlVzZWQpOworCQkJYnVmUHRyID0gYnVmQmFzZSArIGJ1ZlVzZWQ7CisJCX0KKworCQlpZiAoYnVmVXNlZCA+PSBidWZTaXplKSB7CisJCQlsZW4gPSAoYnVmU2l6ZSAqIDMpIC8gMjsKKwkJCWNwID0geHJlYWxsb2MoYnVmQmFzZSwgbGVuKTsKKwkJCWJ1ZkJhc2UgPSBjcDsKKwkJCWJ1ZlB0ciA9IGJ1ZkJhc2UgKyBidWZVc2VkOworCQkJYnVmU2l6ZSA9IGxlbjsKKwkJfQorCisJCWNjID0gc2FmZV9yZWFkKGZkLCBidWZQdHIsIGJ1ZlNpemUgLSBidWZVc2VkKTsKKwkJYnVmVXNlZCArPSBjYzsKKwkJYnVmUHRyID0gYnVmQmFzZTsKKworCX0gd2hpbGUgKGNjID4gMCk7CisKKwlpZiAoY2MgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQljbG9zZShmZCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYnVmVXNlZCkgeworCQlpZiAoIWluc2VydExpbmUobnVtLCBidWZQdHIsIGJ1ZlVzZWQpKSB7CisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbGluZUNvdW50Kys7CisJCWNoYXJDb3VudCArPSBidWZVc2VkOworCX0KKworCWNsb3NlKGZkKTsKKworCXByaW50ZigiJWQgbGluZXMlcywgJWQgY2hhcnNcbiIsIGxpbmVDb3VudCwKKwkJKGJ1ZlVzZWQgPyAiIChpbmNvbXBsZXRlKSIgOiAiIiksIGNoYXJDb3VudCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorICogV3JpdGUgdGhlIHNwZWNpZmllZCBsaW5lcyBvdXQgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgorICogUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIG9yIEZBTFNFIG9uIGFuIGVycm9yIHdpdGggYSBtZXNzYWdlIG91dHB1dC4KKyAqLworc3RhdGljIGludCB3cml0ZUxpbmVzKGNvbnN0IGNoYXIgKmZpbGUsIGludCBudW0xLCBpbnQgbnVtMikKK3sKKwlMSU5FICpscDsKKwlpbnQgZmQsIGxpbmVDb3VudCwgY2hhckNvdW50OworCisJaWYgKGJhZF9udW1zKG51bTEsIG51bTIsICJ3cml0ZSIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsaW5lQ291bnQgPSAwOworCWNoYXJDb3VudCA9IDA7CisKKwlmZCA9IGNyZWF0KGZpbGUsIDA2NjYpOworCWlmIChmZCA8IDApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwcmludGYoIlwiJXNcIiwgIiwgZmlsZSk7CisJZmZsdXNoX2FsbCgpOworCisJbHAgPSBmaW5kTGluZShudW0xKTsKKwlpZiAobHAgPT0gTlVMTCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl3aGlsZSAobnVtMSsrIDw9IG51bTIpIHsKKwkJaWYgKGZ1bGxfd3JpdGUoZmQsIGxwLT5kYXRhLCBscC0+bGVuKSAhPSBscC0+bGVuKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQljaGFyQ291bnQgKz0gbHAtPmxlbjsKKwkJbGluZUNvdW50Kys7CisJCWxwID0gbHAtPm5leHQ7CisJfQorCisJaWYgKGNsb3NlKGZkKSA8IDApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwcmludGYoIiVkIGxpbmVzLCAlZCBjaGFyc1xuIiwgbGluZUNvdW50LCBjaGFyQ291bnQpOworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBQcmludCBsaW5lcyBpbiBhIHNwZWNpZmllZCByYW5nZS4KKyAqIFRoZSBsYXN0IGxpbmUgcHJpbnRlZCBiZWNvbWVzIHRoZSBjdXJyZW50IGxpbmUuCisgKiBJZiBleHBhbmRGbGFnIGlzIFRSVUUsIHRoZW4gdGhlIGxpbmUgaXMgcHJpbnRlZCBzcGVjaWFsbHkgdG8KKyAqIHNob3cgbWFnaWMgY2hhcmFjdGVycy4KKyAqLworc3RhdGljIGludCBwcmludExpbmVzKGludCBudW0xLCBpbnQgbnVtMiwgaW50IGV4cGFuZEZsYWcpCit7CisJY29uc3QgTElORSAqbHA7CisJY29uc3QgY2hhciAqY3A7CisJaW50IGNoLCBjb3VudDsKKworCWlmIChiYWRfbnVtcyhudW0xLCBudW0yLCAicHJpbnQiKSkKKwkJcmV0dXJuIEZBTFNFOworCisJbHAgPSBmaW5kTGluZShudW0xKTsKKwlpZiAobHAgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJd2hpbGUgKG51bTEgPD0gbnVtMikgeworCQlpZiAoIWV4cGFuZEZsYWcpIHsKKwkJCXdyaXRlKFNURE9VVF9GSUxFTk8sIGxwLT5kYXRhLCBscC0+bGVuKTsKKwkJCXNldEN1ck51bShudW0xKyspOworCQkJbHAgPSBscC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogU2hvdyBjb250cm9sIGNoYXJhY3RlcnMgYW5kIGNoYXJhY3RlcnMgd2l0aCB0aGUKKwkJICogaGlnaCBiaXQgc2V0IHNwZWNpYWxseS4KKwkJICovCisJCWNwID0gbHAtPmRhdGE7CisJCWNvdW50ID0gbHAtPmxlbjsKKworCQlpZiAoKGNvdW50ID4gMCkgJiYgKGNwW2NvdW50IC0gMV0gPT0gJ1xuJykpCisJCQljb3VudC0tOworCisJCXdoaWxlIChjb3VudC0tID4gMCkgeworCQkJY2ggPSAodW5zaWduZWQgY2hhcikgKmNwKys7CisJCQlmcHV0Y19wcmludGFibGUoY2ggfCBQUklOVEFCTEVfTUVUQSwgc3Rkb3V0KTsKKwkJfQorCisJCWZwdXRzKCIkXG4iLCBzdGRvdXQpOworCisJCXNldEN1ck51bShudW0xKyspOworCQlscCA9IGxwLT5uZXh0OworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBJbnNlcnQgYSBuZXcgbGluZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4KKyAqIFRoZSBsaW5lIGlzIGluc2VydGVkIHNvIGFzIHRvIGJlY29tZSB0aGUgc3BlY2lmaWVkIGxpbmUsCisgKiB0aHVzIHB1c2hpbmcgYW55IGV4aXN0aW5nIGFuZCBmdXJ0aGVyIGxpbmVzIGRvd24gb25lLgorICogVGhlIGluc2VydGVkIGxpbmUgaXMgYWxzbyBzZXQgdG8gYmVjb21lIHRoZSBjdXJyZW50IGxpbmUuCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludCBpbnNlcnRMaW5lKGludCBudW0sIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJTElORSAqbmV3THAsICpscDsKKworCWlmICgobnVtIDwgMSkgfHwgKG51bSA+IGxhc3ROdW0gKyAxKSkgeworCQliYl9lcnJvcl9tc2coImluc2VydGluZyBhdCBiYWQgbGluZSBudW1iZXIiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCW5ld0xwID0geG1hbGxvYyhzaXplb2YoTElORSkgKyBsZW4gLSAxKTsKKworCW1lbWNweShuZXdMcC0+ZGF0YSwgZGF0YSwgbGVuKTsKKwluZXdMcC0+bGVuID0gbGVuOworCisJaWYgKG51bSA+IGxhc3ROdW0pCisJCWxwID0gJmxpbmVzOworCWVsc2UgeworCQlscCA9IGZpbmRMaW5lKG51bSk7CisJCWlmIChscCA9PSBOVUxMKSB7CisJCQlmcmVlKChjaGFyICopIG5ld0xwKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCW5ld0xwLT5uZXh0ID0gbHA7CisJbmV3THAtPnByZXYgPSBscC0+cHJldjsKKwlscC0+cHJldi0+bmV4dCA9IG5ld0xwOworCWxwLT5wcmV2ID0gbmV3THA7CisKKwlsYXN0TnVtKys7CisJZGlydHkgPSBUUlVFOworCXJldHVybiBzZXRDdXJOdW0obnVtKTsKK30KKworCisvKgorICogRGVsZXRlIGxpbmVzIGZyb20gdGhlIGdpdmVuIHJhbmdlLgorICovCitzdGF0aWMgdm9pZCBkZWxldGVMaW5lcyhpbnQgbnVtMSwgaW50IG51bTIpCit7CisJTElORSAqbHAsICpubHAsICpwbHA7CisJaW50IGNvdW50OworCisJaWYgKGJhZF9udW1zKG51bTEsIG51bTIsICJkZWxldGUiKSkKKwkJcmV0dXJuOworCisJbHAgPSBmaW5kTGluZShudW0xKTsKKwlpZiAobHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChjdXJOdW0gPj0gbnVtMSkgJiYgKGN1ck51bSA8PSBudW0yKSkgeworCQlpZiAobnVtMiA8IGxhc3ROdW0pCisJCQlzZXRDdXJOdW0obnVtMiArIDEpOworCQllbHNlIGlmIChudW0xID4gMSkKKwkJCXNldEN1ck51bShudW0xIC0gMSk7CisJCWVsc2UKKwkJCWN1ck51bSA9IDA7CisJfQorCisJY291bnQgPSBudW0yIC0gbnVtMSArIDE7CisJaWYgKGN1ck51bSA+IG51bTIpCisJCWN1ck51bSAtPSBjb3VudDsKKwlsYXN0TnVtIC09IGNvdW50OworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCW5scCA9IGxwLT5uZXh0OworCQlwbHAgPSBscC0+cHJldjsKKwkJcGxwLT5uZXh0ID0gbmxwOworCQlubHAtPnByZXYgPSBwbHA7CisJCWZyZWUobHApOworCQlscCA9IG5scDsKKwl9CisKKwlkaXJ0eSA9IFRSVUU7Cit9CisKKworLyoKKyAqIFNlYXJjaCBmb3IgYSBsaW5lIHdoaWNoIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgorICogSWYgdGhlIHN0cmluZyBpcyAiIiwgdGhlbiB0aGUgcHJldmlvdXNseSBzZWFyY2hlZCBmb3Igc3RyaW5nCisgKiBpcyB1c2VkLiAgVGhlIGN1cnJlbnRseSBzZWFyY2hlZCBmb3Igc3RyaW5nIGlzIHNhdmVkIGZvciBmdXR1cmUgdXNlLgorICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIgd2hpY2ggbWF0Y2hlcywgb3IgMCBpZiB0aGVyZSB3YXMgbm8gbWF0Y2gKKyAqIHdpdGggYW4gZXJyb3IgcHJpbnRlZC4KKyAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZWFyY2hMaW5lcyhjb25zdCBjaGFyICpzdHIsIGludCBudW0xLCBpbnQgbnVtMikKK3sKKwljb25zdCBMSU5FICpscDsKKwlpbnQgbGVuOworCisJaWYgKGJhZF9udW1zKG51bTEsIG51bTIsICJzZWFyY2giKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKnN0ciA9PSAnXDAnKSB7CisJCWlmIChzZWFyY2hTdHJpbmdbMF0gPT0gJ1wwJykgeworCQkJYmJfZXJyb3JfbXNnKCJubyBwcmV2aW91cyBzZWFyY2ggc3RyaW5nIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzdHIgPSBzZWFyY2hTdHJpbmc7CisJfQorCisJaWYgKHN0ciAhPSBzZWFyY2hTdHJpbmcpCisJCXN0cmNweShzZWFyY2hTdHJpbmcsIHN0cik7CisKKwlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWxwID0gZmluZExpbmUobnVtMSk7CisJaWYgKGxwID09IE5VTEwpCisJCXJldHVybiAwOworCisJd2hpbGUgKG51bTEgPD0gbnVtMikgeworCQlpZiAoZmluZFN0cmluZyhscCwgc3RyLCBsZW4sIDApID49IDApCisJCQlyZXR1cm4gbnVtMTsKKwkJbnVtMSsrOworCQlscCA9IGxwLT5uZXh0OworCX0KKworCWJiX2Vycm9yX21zZygiY2FuJ3QgZmluZCBzdHJpbmcgXCIlc1wiIiwgc3RyKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIGxpbmUgbnVtYmVyLgorICovCitzdGF0aWMgTElORSAqZmluZExpbmUoaW50IG51bSkKK3sKKwlMSU5FICpscDsKKwlpbnQgbG51bTsKKworCWlmICgobnVtIDwgMSkgfHwgKG51bSA+IGxhc3ROdW0pKSB7CisJCWJiX2Vycm9yX21zZygibGluZSBudW1iZXIgJWQgZG9lcyBub3QgZXhpc3QiLCBudW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoY3VyTnVtIDw9IDApIHsKKwkJY3VyTnVtID0gMTsKKwkJY3VyTGluZSA9IGxpbmVzLm5leHQ7CisJfQorCisJaWYgKG51bSA9PSBjdXJOdW0pCisJCXJldHVybiBjdXJMaW5lOworCisJbHAgPSBjdXJMaW5lOworCWxudW0gPSBjdXJOdW07CisJaWYgKG51bSA8IChjdXJOdW0gLyAyKSkgeworCQlscCA9IGxpbmVzLm5leHQ7CisJCWxudW0gPSAxOworCX0gZWxzZSBpZiAobnVtID4gKChjdXJOdW0gKyBsYXN0TnVtKSAvIDIpKSB7CisJCWxwID0gbGluZXMucHJldjsKKwkJbG51bSA9IGxhc3ROdW07CisJfQorCisJd2hpbGUgKGxudW0gPCBudW0pIHsKKwkJbHAgPSBscC0+bmV4dDsKKwkJbG51bSsrOworCX0KKworCXdoaWxlIChsbnVtID4gbnVtKSB7CisJCWxwID0gbHAtPnByZXY7CisJCWxudW0tLTsKKwl9CisJcmV0dXJuIGxwOworfQorCisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludCBzZXRDdXJOdW0oaW50IG51bSkKK3sKKwlMSU5FICpscDsKKworCWxwID0gZmluZExpbmUobnVtKTsKKwlpZiAobHAgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCWN1ck51bSA9IG51bTsKKwljdXJMaW5lID0gbHA7CisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9lZGl0b3JzL3BhdGNoLmMgYi9lZGl0b3JzL3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvcGF0Y2guYwpAQCAtMCwwICsxLDU1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6CisgKgorICogQXBwbHkgYSAidW5pdmVyc2FsIiBkaWZmLgorICogQWRhcHRlZCBmcm9tIHRveWJveCdzIHBhdGNoIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogc2VlIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvcGF0Y2guaHRtbAorICogKEJ1dCBvbmx5IGRvZXMgLXUsIGJlY2F1c2Ugd2hvIHN0aWxsIGNhcmVzIGFib3V0ICJlZCI/KQorICoKKyAqIFRPRE86CisgKiAtYiBiYWNrdXAKKyAqIC1sIHRyZWF0IGFsbCB3aGl0ZXNwYWNlIGFzIGEgc2luZ2xlIHNwYWNlCisgKiAtZCBjaGRpciBmaXJzdAorICogLUQgZGVmaW5lIHdyYXAgI2lmZGVmIGFuZCAjaWZuZGVmIGFyb3VuZCBjaGFuZ2VzCisgKiAtbyBvdXRmaWxlIG91dHB1dCBoZXJlIGluc3RlYWQgb2YgaW4gcGxhY2UKKyAqIC1yIHJlamVjdGZpbGUgd3JpdGUgcmVqZWN0ZWQgaHVua3MgdG8gdGhpcyBmaWxlCisgKiAtLWRyeS1ydW4gKHJlZ3Jlc3Npb24hKQorICoKKyAqIC1mIGZvcmNlIChubyBxdWVzdGlvbnMgYXNrZWQpCisgKiAtRiBmdXp6IChudW1iZXIsIGRlZmF1bHQgMikKKyAqIFtmaWxlXSB3aGljaCBmaWxlIHRvIHBhdGNoCisgKi8KKworLy9jb25maWc6Y29uZmlnIFBBVENICisvL2NvbmZpZzoJYm9vbCAicGF0Y2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQXBwbHkgYSB1bmlmaWVkIGRpZmYgZm9ybWF0dGVkIHBhdGNoLgorCisvL2FwcGxldDpJRl9QQVRDSChBUFBMRVQocGF0Y2gsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUEFUQ0gpICs9IHBhdGNoLm8KKworLy91c2FnZTojZGVmaW5lIHBhdGNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW09SSUdGSUxFIFtQQVRDSEZJTEVdXSIKKy8vdXNhZ2U6I2RlZmluZSBwYXRjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICAgIgktcCwtLXN0cmlwIE4JCVN0cmlwIE4gbGVhZGluZyBjb21wb25lbnRzIGZyb20gZmlsZSBuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWksLS1pbnB1dCBESUZGCQlSZWFkIERJRkYgaW5zdGVhZCBvZiBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIsLS1yZXZlcnNlCQlSZXZlcnNlIHBhdGNoIgorLy91c2FnZTogICAgICJcbgktTiwtLWZvcndhcmQJCUlnbm9yZSBhbHJlYWR5IGFwcGxpZWQgcGF0Y2hlcyIKKy8qdXNhZ2U6ICAgICAiXG4JLS1kcnktcnVuCQlEb24ndCBhY3R1YWxseSBjaGFuZ2UgZmlsZXMiIC0gVE9ETyAqLworLy91c2FnZTogICAgICJcbgktRSwtLXJlbW92ZS1lbXB0eS1maWxlcwlSZW1vdmUgb3V0cHV0IGZpbGVzIGlmIHRoZXkgYmVjb21lIGVtcHR5IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAgICIJLXAgTglTdHJpcCBOIGxlYWRpbmcgY29tcG9uZW50cyBmcm9tIGZpbGUgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1pIERJRkYJUmVhZCBESUZGIGluc3RlYWQgb2Ygc3RkaW4iCisvL3VzYWdlOiAgICAgIlxuCS1SCVJldmVyc2UgcGF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS1OCUlnbm9yZSBhbHJlYWR5IGFwcGxpZWQgcGF0Y2hlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUUJUmVtb3ZlIG91dHB1dCBmaWxlcyBpZiB0aGV5IGJlY29tZSBlbXB0eSIKKy8vdXNhZ2U6CSkKKy8qIC11ICJpbnRlcnByZXQgYXMgdW5pZmllZCBkaWZmIiBpcyBzdXBwb3J0ZWQgYnV0IG5vdCBkb2N1bWVudGVkOiB0aGlzIGluZm8gaXMgbm90IHVzZWZ1bCBmb3IgLS1oZWxwICovCisvKiAteCAiZGVidWciIGlzIHN1cHBvcnRlZCBidXQgZG9lcyBub3RoaW5nICovCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBhdGNoX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHBhdGNoIC1wMSA8IGV4YW1wbGUuZGlmZlxuIgorLy91c2FnZTogICAgICAgIiQgcGF0Y2ggLXAwIC1pIGV4YW1wbGUuZGlmZiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKworLy8gbGliYmIgY2FuZGlkYXRlPworCitzdHJ1Y3QgZG91YmxlX2xpc3QgeworCXN0cnVjdCBkb3VibGVfbGlzdCAqbmV4dDsKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKnByZXY7CisJY2hhciAqZGF0YTsKK307CisKKy8vIEZyZWUgYWxsIHRoZSBlbGVtZW50cyBvZiBhIGxpbmtlZCBsaXN0CisvLyBDYWxsIGZyZWVpdCgpIG9uIGVhY2ggZWxlbWVudCBiZWZvcmUgZnJlZWluZyBpdC4KK3N0YXRpYyB2b2lkIGRsaXN0X2ZyZWUoc3RydWN0IGRvdWJsZV9saXN0ICpsaXN0LCB2b2lkICgqZnJlZWl0KSh2b2lkICpkYXRhKSkKK3sKKwl3aGlsZSAobGlzdCkgeworCQl2b2lkICpwb3AgPSBsaXN0OworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJZnJlZWl0KHBvcCk7CisJCS8vIEJhaWwgb3V0IGFsc28gaWYgbGlzdCBpcyBjaXJjdWxhci4KKwkJaWYgKGxpc3QgPT0gcG9wKSBicmVhazsKKwl9Cit9CisKKy8vIEFkZCBhbiBlbnRyeSBiZWZvcmUgImxpc3QiIGVsZW1lbnQgaW4gKGNpcmN1bGFyKSBkb3VibHkgbGlua2VkIGxpc3QKK3N0YXRpYyBzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsaXN0X2FkZChzdHJ1Y3QgZG91YmxlX2xpc3QgKipsaXN0LCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqbGxpc3Q7CisJc3RydWN0IGRvdWJsZV9saXN0ICpsaW5lID0geG1hbGxvYyhzaXplb2YoKmxpbmUpKTsKKworCWxpbmUtPmRhdGEgPSBkYXRhOworCWxsaXN0ID0gKmxpc3Q7CisJaWYgKGxsaXN0KSB7CisJCXN0cnVjdCBkb3VibGVfbGlzdCAqcDsKKwkJbGluZS0+bmV4dCA9IGxsaXN0OworCQlwID0gbGluZS0+cHJldiA9IGxsaXN0LT5wcmV2OworCQkvLyAobGlzdCBpcyBjaXJjdWxhciwgd2UgYXNzdW1lIHAgaXMgbmV2ZXIgTlVMTCkKKwkJcC0+bmV4dCA9IGxpbmU7CisJCWxsaXN0LT5wcmV2ID0gbGluZTsKKwl9IGVsc2UKKwkJKmxpc3QgPSBsaW5lLT5uZXh0ID0gbGluZS0+cHJldiA9IGxpbmU7CisKKwlyZXR1cm4gbGluZTsKK30KKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciAqaW5maWxlOworCWxvbmcgcHJlZml4OworCisJc3RydWN0IGRvdWJsZV9saXN0ICpjdXJyZW50X2h1bms7CisKKwlsb25nIG9sZGxpbmUsIG9sZGxlbiwgbmV3bGluZSwgbmV3bGVuOworCWxvbmcgbGluZW51bTsKKwlpbnQgY29udGV4dCwgc3RhdGUsIGh1bmtudW07CisJaW50IGZpbGVpbiwgZmlsZW91dDsKKwljaGFyICp0ZW1wbmFtZTsKKworCWludCBleGl0dmFsOworfTsKKyNkZWZpbmUgVFQgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9UVCgpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihUVCkpKTsgXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIEZMQUdfU1RSICJSdXA6aTpORXgiCisvKiBGTEFHX1JFVkVSU0UgbXVzdCBiZSA9PSAxISBDb2RlIHVzZXMgdGhpcyBmYWN0LiAqLworI2RlZmluZSBGTEFHX1JFVkVSU0UgKDEgPDwgMCkKKyNkZWZpbmUgRkxBR191ICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEZMQUdfUEFUSExFTiAoMSA8PCAyKQorI2RlZmluZSBGTEFHX0lOUFVUICAgKDEgPDwgMykKKyNkZWZpbmUgRkxBR19JR05PUkUgICgxIDw8IDQpCisjZGVmaW5lIEZMQUdfUk1FTVBUWSAoMSA8PCA1KQorLyogRW5hYmxlIHRoaXMgYml0IGFuZCB1c2UgLXggZm9yIGRlYnVnIG91dHB1dDogKi8KKyNkZWZpbmUgRkxBR19ERUJVRyAgICgwIDw8IDYpCisKKy8vIERpc3Bvc2Ugb2YgYSBsaW5lIG9mIGlucHV0LCBlaXRoZXIgYnkgd3JpdGluZyBpdCBvdXQgb3IgZGlzY2FyZGluZyBpdC4KKworLy8gc3RhdGUgPCAyOiBqdXN0IGZyZWUKKy8vIHN0YXRlID0gMjogd3JpdGUgd2hvbGUgbGluZSB0byBzdGRlcnIKKy8vIHN0YXRlID0gMzogd3JpdGUgd2hvbGUgbGluZSB0byBmaWxlb3V0CisvLyBzdGF0ZSA+IDM6IHdyaXRlIGxpbmUrMSB0byBmaWxlb3V0IHdoZW4gKmxpbmUgIT0gc3RhdGUKKworI2RlZmluZSBQQVRDSF9ERUJVRyAob3B0aW9uX21hc2szMiAmIEZMQUdfREVCVUcpCisKK3N0YXRpYyB2b2lkIGRvX2xpbmUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsaXN0ID0gZGF0YTsKKworCWlmIChUVC5zdGF0ZT4xICYmICpkbGlzdC0+ZGF0YSAhPSBUVC5zdGF0ZSkKKwkJZmRwcmludGYoVFQuc3RhdGUgPT0gMiA/IDIgOiBUVC5maWxlb3V0LAorCQkJIiVzXG4iLCBkbGlzdC0+ZGF0YSsoVFQuc3RhdGU+MyA/IDEgOiAwKSk7CisKKwlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJETyAlZDogJXNcbiIsIFRULnN0YXRlLCBkbGlzdC0+ZGF0YSk7CisKKwlmcmVlKGRsaXN0LT5kYXRhKTsKKwlmcmVlKGRsaXN0KTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX29sZGZpbGUodm9pZCkKK3sKKwlpZiAoVFQudGVtcG5hbWUpIHsKKwkJLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgZGF0YSBhbmQgcmVwbGFjZSB0aGUgb3JpZ2luYWwgd2l0aCB0aGUgY29weS4KKwkJY2hhciAqdGVtcDsKKworCQlpZiAoVFQuZmlsZWluICE9IC0xKSB7CisJCQliYl9jb3B5ZmRfZW9mKFRULmZpbGVpbiwgVFQuZmlsZW91dCk7CisJCQl4Y2xvc2UoVFQuZmlsZWluKTsKKwkJfQorCQl4Y2xvc2UoVFQuZmlsZW91dCk7CisKKwkJdGVtcCA9IHhzdHJkdXAoVFQudGVtcG5hbWUpOworCQl0ZW1wW3N0cmxlbih0ZW1wKSAtIDZdID0gJ1wwJzsKKwkJcmVuYW1lKFRULnRlbXBuYW1lLCB0ZW1wKTsKKwkJZnJlZSh0ZW1wKTsKKworCQlmcmVlKFRULnRlbXBuYW1lKTsKKwkJVFQudGVtcG5hbWUgPSBOVUxMOworCX0KKwlUVC5maWxlb3V0ID0gVFQuZmlsZWluID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZhaWxfaHVuayh2b2lkKQoreworCWlmICghVFQuY3VycmVudF9odW5rKSByZXR1cm47CisKKwlmZHByaW50ZigyLCAiSHVuayAlZCBGQUlMRUQgJWxkLyVsZC5cbiIsIFRULmh1bmtudW0sIFRULm9sZGxpbmUsIFRULm5ld2xpbmUpOworCVRULmV4aXR2YWwgPSAxOworCisJLy8gSWYgd2UgZ290IHRvIHRoaXMgcG9pbnQsIHdlJ3ZlIHNlZWtlZCB0byB0aGUgZW5kLiAgRGlzY2FyZCBjaGFuZ2VzIHRvCisJLy8gdGhpcyBmaWxlIGFuZCBhZHZhbmNlIHRvIG5leHQgZmlsZS4KKworCVRULnN0YXRlID0gMjsKKwlUVC5jdXJyZW50X2h1bmstPnByZXYtPm5leHQgPSBOVUxMOworCWRsaXN0X2ZyZWUoVFQuY3VycmVudF9odW5rLCBkb19saW5lKTsKKwlUVC5jdXJyZW50X2h1bmsgPSBOVUxMOworCisJLy8gQWJvcnQgdGhlIGNvcHkgYW5kIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUuCisJY2xvc2UoVFQuZmlsZWluKTsKKwljbG9zZShUVC5maWxlb3V0KTsKKwl1bmxpbmsoVFQudGVtcG5hbWUpOworCWZyZWUoVFQudGVtcG5hbWUpOworCVRULnRlbXBuYW1lID0gTlVMTDsKKworCVRULnN0YXRlID0gMDsKK30KKworLy8gR2l2ZW4gYSBodW5rIG9mIGEgdW5pZmllZCBkaWZmLCBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2UgdG8gdGhlIGZpbGUuCisvLyBUaGlzIGRvZXMgbm90IHVzZSB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBpbnN0ZWFkIHRyZWF0cyBhIGh1bmsKKy8vIGFzIGEgc29ydCBvZiByZWdleC4gIENvcGllcyBkYXRhIGZyb20gaW5wdXQgdG8gb3V0cHV0IHVudGlsIGl0IGZpbmRzCisvLyB0aGUgY2hhbmdlIHRvIGJlIG1hZGUsIHRoZW4gb3V0cHV0cyB0aGUgY2hhbmdlZCBkYXRhIGFuZCByZXR1cm5zLgorLy8gKEZpbmRpbmcgRU9GIGZpcnN0IGlzIGFuIGVycm9yLikgIFRoaXMgaXMgYSBzaW5nbGUgcGFzcyBvcGVyYXRpb24sIHNvCisvLyBtdWx0aXBsZSBodW5rcyBtdXN0IG9jY3VyIGluIG9yZGVyIGluIHRoZSBmaWxlLgorCitzdGF0aWMgaW50IGFwcGx5X29uZV9odW5rKHZvaWQpCit7CisJc3RydWN0IGRvdWJsZV9saXN0ICpwbGlzdCwgKmJ1ZiA9IE5VTEwsICpjaGVjazsKKwlpbnQgbWF0Y2hlb2YgPSAwLCByZXZlcnNlID0gb3B0aW9uX21hc2szMiAmIEZMQUdfUkVWRVJTRSwgYmFja3dhcm4gPSAwOworCS8qIERvIHdlIHRyeSAiZHVtbXkiIHJldmVydCB0byBjaGVjayB3aGV0aGVyCisJICogdG8gc2lsZW50bHkgc2tpcCB0aGlzIGh1bms/IFVzZWQgdG8gaW1wbGVtZW50IC1OLgorCSAqLworCWludCBkdW1teV9yZXZlcnQgPSAwOworCisJLy8gQnJlYWsgZG91Ymx5IGxpbmtlZCBsaXN0IHNvIHdlIGNhbiB1c2Ugc2luZ2x5IGxpbmtlZCB0cmF2ZXJzYWwgZnVuY3Rpb24uCisJVFQuY3VycmVudF9odW5rLT5wcmV2LT5uZXh0ID0gTlVMTDsKKworCS8vIE1hdGNoIEVPRiBpZiB0aGVyZSBhcmVuJ3QgYXMgbWFueSBlbmRpbmcgY29udGV4dCBsaW5lcyBhcyBiZWdpbm5pbmcKKwlmb3IgKHBsaXN0ID0gVFQuY3VycmVudF9odW5rOyBwbGlzdDsgcGxpc3QgPSBwbGlzdC0+bmV4dCkgeworCQlpZiAocGxpc3QtPmRhdGFbMF09PScgJykgbWF0Y2hlb2YrKzsKKwkJZWxzZSBtYXRjaGVvZiA9IDA7CisJCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwgIkhVTks6JXNcbiIsIHBsaXN0LT5kYXRhKTsKKwl9CisJbWF0Y2hlb2YgPSAhbWF0Y2hlb2YgfHwgbWF0Y2hlb2YgPCBUVC5jb250ZXh0OworCisJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCJNQVRDSEVPRj0lY1xuIiwgbWF0Y2hlb2YgPyAnWScgOiAnTicpOworCisJLy8gTG9vcCB0aHJvdWdoIGlucHV0IGRhdGEgc2VhcmNoaW5nIGZvciB0aGlzIGh1bmsuICBNYXRjaCBhbGwgY29udGV4dAorCS8vIGxpbmVzIGFuZCBhbGwgbGluZXMgdG8gYmUgcmVtb3ZlZCB1bnRpbCB3ZSd2ZSBmb3VuZCB0aGUgZW5kIG9mIGEKKwkvLyBjb21wbGV0ZSBodW5rLgorCXBsaXN0ID0gVFQuY3VycmVudF9odW5rOworCWJ1ZiA9IE5VTEw7CisJaWYgKHJldmVyc2UgPyBUVC5vbGRsZW4gOiBUVC5uZXdsZW4pIGZvciAoOzspIHsKKwkJY2hhciAqZGF0YSA9IHhtYWxsb2NfcmVhZHMoVFQuZmlsZWluLCBOVUxMKTsKKworCQlUVC5saW5lbnVtKys7CisKKwkJLy8gRmlndXJlIG91dCB3aGljaCBsaW5lIG9mIGh1bmsgdG8gY29tcGFyZSB3aXRoIG5leHQuICAoU2tpcCBsaW5lcworCQkvLyBvZiB0aGUgaHVuayB3ZSdkIGJlIGFkZGluZy4pCisJCXdoaWxlIChwbGlzdCAmJiAqcGxpc3QtPmRhdGEgPT0gIistIltyZXZlcnNlXSkgeworCQkJaWYgKGRhdGEgJiYgIXN0cmNtcChkYXRhLCBwbGlzdC0+ZGF0YSsxKSkgeworCQkJCWlmICghYmFja3dhcm4pIHsKKwkJCQkJYmFja3dhcm4gPSBUVC5saW5lbnVtOworCQkJCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfSUdOT1JFKSB7CisJCQkJCQlkdW1teV9yZXZlcnQgPSAxOworCQkJCQkJcmV2ZXJzZSBePSAxOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OworCQl9CisKKwkJLy8gSXMgdGhpcyBFT0Y/CisJCWlmICghZGF0YSkgeworCQkJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiSU5FT0ZcbiIpOworCisJCQkvLyBEb2VzIHRoaXMgaHVuayBuZWVkIHRvIG1hdGNoIEVPRj8KKwkJCWlmICghcGxpc3QgJiYgbWF0Y2hlb2YpIGJyZWFrOworCisJCQlpZiAoYmFja3dhcm4pCisJCQkJZmRwcmludGYoMiwiUG9zc2libHkgcmV2ZXJzZWQgaHVuayAlZCBhdCAlbGRcbiIsCisJCQkJCVRULmh1bmtudW0sIFRULmxpbmVudW0pOworCisJCQkvLyBGaWxlIGVuZGVkIGJlZm9yZSB3ZSBmb3VuZCBhIHBsYWNlIGZvciB0aGlzIGh1bmsuCisJCQlmYWlsX2h1bmsoKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwgIklOOiAlc1xuIiwgZGF0YSk7CisJCWNoZWNrID0gZGxpc3RfYWRkKCZidWYsIGRhdGEpOworCisJCS8vIENvbXBhcmUgdGhpcyBsaW5lIHdpdGggbmV4dCBleHBlY3RlZCBsaW5lIG9mIGh1bmsuCisJCS8vIHRvZG86IHRlYWNoIHRoZSBzdHJjbXAoKSB0byBpZ25vcmUgd2hpdGVzcGFjZS4KKworCQkvLyBBIG1hdGNoIGNhbiBmYWlsIGJlY2F1c2UgdGhlIG5leHQgbGluZSBkb2Vzbid0IG1hdGNoLCBvciBiZWNhdXNlCisJCS8vIHdlIGhpdCB0aGUgZW5kIG9mIGEgaHVuayB0aGF0IG5lZWRlZCBFT0YsIGFuZCB0aGlzIGlzbid0IEVPRi4KKworCQkvLyBJZiBtYXRjaCBmYWlsZWQsIGZsdXNoIGZpcnN0IGxpbmUgb2YgYnVmZmVyZWQgZGF0YSBhbmQKKwkJLy8gcmVjaGVjayBidWZmZXJlZCBkYXRhIGZvciBhIG5ldyBtYXRjaCB1bnRpbCB3ZSBmaW5kIG9uZSBvciBydW4KKwkJLy8gb3V0IG9mIGJ1ZmZlci4KKworCQlmb3IgKDs7KSB7CisJCQlpZiAoIXBsaXN0IHx8IHN0cmNtcChjaGVjay0+ZGF0YSwgcGxpc3QtPmRhdGErMSkpIHsKKwkJCQkvLyBNYXRjaCBmYWlsZWQuICBXcml0ZSBvdXQgZmlyc3QgbGluZSBvZiBidWZmZXJlZCBkYXRhIGFuZAorCQkJCS8vIHJlY2hlY2sgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgZm9yIGEgbmV3IG1hdGNoLgorCisJCQkJaWYgKFBBVENIX0RFQlVHKQorCQkJCQlmZHByaW50ZigyLCAiTk9UOiAlc1xuIiwgcGxpc3QtPmRhdGEpOworCisJCQkJVFQuc3RhdGUgPSAzOworCQkJCWNoZWNrID0gYnVmOworCQkJCWJ1ZiA9IGJ1Zi0+bmV4dDsKKwkJCQljaGVjay0+cHJldi0+bmV4dCA9IGJ1ZjsKKwkJCQlidWYtPnByZXYgPSBjaGVjay0+cHJldjsKKwkJCQlkb19saW5lKGNoZWNrKTsKKwkJCQlwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsKKworCQkJCS8vIElmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdpdGhvdXQgY29uZmlybWluZyBhCisJCQkJLy8gbWF0Y2gsIHJlYWQgbW9yZSBsaW5lcy4KKwkJCQlpZiAoY2hlY2sgPT0gYnVmKSB7CisJCQkJCWJ1ZiA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljaGVjayA9IGJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKFBBVENIX0RFQlVHKQorCQkJCQlmZHByaW50ZigyLCAiTUFZQkU6ICVzXG4iLCBwbGlzdC0+ZGF0YSk7CisJCQkJLy8gVGhpcyBsaW5lIG1hdGNoZXMuICBBZHZhbmNlIHBsaXN0LCBkZXRlY3Qgc3VjY2Vzc2Z1bCBtYXRjaC4KKwkJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OworCQkJCWlmICghcGxpc3QgJiYgIW1hdGNoZW9mKSBnb3RvIG91dDsKKwkJCQljaGVjayA9IGNoZWNrLT5uZXh0OworCQkJCWlmIChjaGVjayA9PSBidWYpIGJyZWFrOworCQkJfQorCQl9CisJfQorb3V0OgorCS8vIFdlIGhhdmUgYSBtYXRjaC4gIEVtaXQgY2hhbmdlZCBkYXRhLgorCVRULnN0YXRlID0gIi0rIltyZXZlcnNlIF4gZHVtbXlfcmV2ZXJ0XTsKKwlkbGlzdF9mcmVlKFRULmN1cnJlbnRfaHVuaywgZG9fbGluZSk7CisJVFQuY3VycmVudF9odW5rID0gTlVMTDsKKwlUVC5zdGF0ZSA9IDE7Citkb25lOgorCWlmIChidWYpIHsKKwkJYnVmLT5wcmV2LT5uZXh0ID0gTlVMTDsKKwkJZGxpc3RfZnJlZShidWYsIGRvX2xpbmUpOworCX0KKworCXJldHVybiBUVC5zdGF0ZTsKK30KKworLy8gUmVhZCBhIHBhdGNoIGZpbGUgYW5kIGZpbmQgaHVua3MsIG9wZW5pbmcvY3JlYXRpbmcvZGVsZXRpbmcgZmlsZXMuCisvLyBDYWxsIGFwcGx5X29uZV9odW5rKCkgb24gZWFjaCBodW5rLgorCisvLyBzdGF0ZSAwOiBOb3QgaW4gYSBodW5rLCBsb29rIGZvciArKysuCisvLyBzdGF0ZSAxOiBGb3VuZCArKysgZmlsZSBpbmRpY2F0b3IsIGxvb2sgZm9yIEBACisvLyBzdGF0ZSAyOiBJbiBodW5rOiBjb3VudGluZyBpbml0aWFsIGNvbnRleHQgbGluZXMKKy8vIHN0YXRlIDM6IEluIGh1bms6IGdldHRpbmcgYm9keQorCitpbnQgcGF0Y2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBhdGNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb3B0czsKKwlpbnQgcmV2ZXJzZSwgc3RhdGUgPSAwOworCWNoYXIgKm9sZG5hbWUgPSBOVUxMLCAqbmV3bmFtZSA9IE5VTEw7CisJY2hhciAqb3B0X3AsICpvcHRfaTsKKwlsb25nIG9sZGxlbiA9IG9sZGxlbjsgLyogZm9yIGNvbXBpbGVyICovCisJbG9uZyBuZXdsZW4gPSBuZXdsZW47IC8qIGZvciBjb21waWxlciAqLworCisJSU5JVF9UVCgpOworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIEZMQUdfU1RSLCAmb3B0X3AsICZvcHRfaSk7CisJYXJndiArPSBvcHRpbmQ7CisJcmV2ZXJzZSA9IG9wdHMgJiBGTEFHX1JFVkVSU0U7CisJVFQucHJlZml4ID0gKG9wdHMgJiBGTEFHX1BBVEhMRU4pID8geGF0b2kob3B0X3ApIDogMDsgLy8gY2FuIGJlIG5lZ2F0aXZlIQorCVRULmZpbGVpbiA9IFRULmZpbGVvdXQgPSAtMTsKKwlpZiAob3B0cyAmIEZMQUdfSU5QVVQpIHsKKwkJeG1vdmVfZmQoeG9wZW5fc3RkaW4ob3B0X2kpLCBTVERJTl9GSUxFTk8pOworCX0gZWxzZSB7CisJCWlmIChhcmd2WzBdICYmIGFyZ3ZbMV0pIHsKKwkJCXhtb3ZlX2ZkKHhvcGVuX3N0ZGluKGFyZ3ZbMV0pLCBTVERJTl9GSUxFTk8pOworCQl9CisJfQorCWlmIChhcmd2WzBdKSB7CisJCW9sZG5hbWUgPSB4c3RyZHVwKGFyZ3ZbMF0pOworCQluZXduYW1lID0geHN0cmR1cChhcmd2WzBdKTsKKwl9CisKKwkvLyBMb29wIHRocm91Z2ggdGhlIGxpbmVzIGluIHRoZSBwYXRjaAorCWZvcig7OykgeworCQljaGFyICpwYXRjaGxpbmU7CisKKwkJcGF0Y2hsaW5lID0geG1hbGxvY19mZ2V0bGluZShzdGRpbik7CisJCWlmICghcGF0Y2hsaW5lKSBicmVhazsKKworCQkvLyBPdGhlciB2ZXJzaW9ucyBvZiBwYXRjaCBhY2NlcHQgZGFtYWdlZCBwYXRjaGVzLAorCQkvLyBzbyB3ZSBuZWVkIHRvIGFsc28uCisJCWlmICghKnBhdGNobGluZSkgeworCQkJZnJlZShwYXRjaGxpbmUpOworCQkJcGF0Y2hsaW5lID0geHN0cmR1cCgiICIpOworCQl9CisKKwkJLy8gQXJlIHdlIGFzc2VtYmxpbmcgYSBodW5rPworCQlpZiAoc3RhdGUgPj0gMikgeworCQkJaWYgKCpwYXRjaGxpbmU9PScgJyB8fCAqcGF0Y2hsaW5lPT0nKycgfHwgKnBhdGNobGluZT09Jy0nKSB7CisJCQkJZGxpc3RfYWRkKCZUVC5jdXJyZW50X2h1bmssIHBhdGNobGluZSk7CisKKwkJCQlpZiAoKnBhdGNobGluZSAhPSAnKycpIG9sZGxlbi0tOworCQkJCWlmICgqcGF0Y2hsaW5lICE9ICctJykgbmV3bGVuLS07CisKKwkJCQkvLyBDb250ZXh0IGxpbmU/CisJCQkJaWYgKCpwYXRjaGxpbmU9PScgJyAmJiBzdGF0ZT09MikgVFQuY29udGV4dCsrOworCQkJCWVsc2Ugc3RhdGU9MzsKKworCQkJCS8vIElmIHdlJ3ZlIGNvbnN1bWVkIGFsbCBleHBlY3RlZCBodW5rIGxpbmVzLCBhcHBseSB0aGUgaHVuay4KKworCQkJCWlmICghb2xkbGVuICYmICFuZXdsZW4pIHN0YXRlID0gYXBwbHlfb25lX2h1bmsoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZhaWxfaHVuaygpOworCQkJc3RhdGUgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBPcGVuIGEgbmV3IGZpbGU/CisJCWlmICghc3RybmNtcCgiLS0tICIsIHBhdGNobGluZSwgNCkgfHwgIXN0cm5jbXAoIisrKyAiLCBwYXRjaGxpbmUsIDQpKSB7CisJCQljaGFyICpzLCAqKm5hbWUgPSByZXZlcnNlID8gJm5ld25hbWUgOiAmb2xkbmFtZTsKKwkJCWludCBpOworCisJCQlpZiAoKnBhdGNobGluZSA9PSAnKycpIHsKKwkJCQluYW1lID0gcmV2ZXJzZSA/ICZvbGRuYW1lIDogJm5ld25hbWU7CisJCQkJc3RhdGUgPSAxOworCQkJfQorCisJCQlmaW5pc2hfb2xkZmlsZSgpOworCisJCQlpZiAoIWFyZ3ZbMF0pIHsKKwkJCQlmcmVlKCpuYW1lKTsKKwkJCQkvLyBUcmltIGRhdGUgZnJvbSBlbmQgb2YgZmlsZW5hbWUgKGlmIGFueSkuICBXZSBkb24ndCBjYXJlLgorCQkJCWZvciAocyA9IHBhdGNobGluZSs0OyAqcyAmJiAqcyE9J1x0JzsgcysrKQorCQkJCQlpZiAoKnM9PSdcXCcgJiYgc1sxXSkgcysrOworCQkJCWkgPSBhdG9pKHMpOworCQkJCWlmIChpPjE5MDAgJiYgaTw9MTk3MCkKKwkJCQkJKm5hbWUgPSB4c3RyZHVwKCIvZGV2L251bGwiKTsKKwkJCQllbHNlIHsKKwkJCQkJKnMgPSAwOworCQkJCQkqbmFtZSA9IHhzdHJkdXAocGF0Y2hsaW5lKzQpOworCQkJCX0KKwkJCX0KKworCQkJLy8gV2UgZGVmZXIgYWN0dWFsbHkgb3BlbmluZyB0aGUgZmlsZSBiZWNhdXNlIHN2biBwcm9kdWNlcyBicm9rZW4KKwkJCS8vIHBhdGNoZXMgdGhhdCBkb24ndCBzaWduYWwgdGhleSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlIHRoZQorCQkJLy8gd2F5IHRoZSBwYXRjaCBtYW4gcGFnZSBzYXlzLCBzbyB5b3UgaGF2ZSB0byByZWFkIHRoZSBmaXJzdCBodW5rCisJCQkvLyBhbmQgX2d1ZXNzXy4KKworCQkvLyBTdGFydCBhIG5ldyBodW5rPyAgVXN1YWxseSBAQCAtb2xkbGluZSxvbGRsZW4gK25ld2xpbmUsbmV3bGVuIEBACisJCS8vIGJ1dCBhIG1pc3NpbmcgLHZhbHVlIG1lYW5zIHRoZSB2YWx1ZSBpcyAxLgorCQl9IGVsc2UgaWYgKHN0YXRlID09IDEgJiYgIXN0cm5jbXAoIkBAIC0iLCBwYXRjaGxpbmUsIDQpKSB7CisJCQlpbnQgaTsKKwkJCWNoYXIgKnMgPSBwYXRjaGxpbmUrNDsKKworCQkJLy8gUmVhZCBvbGRsaW5lWyxvbGRsZW5dICtuZXdsaW5lWyxuZXdsZW5dCisKKwkJCVRULm9sZGxlbiA9IG9sZGxlbiA9IFRULm5ld2xlbiA9IG5ld2xlbiA9IDE7CisJCQlUVC5vbGRsaW5lID0gc3RydG9sKHMsICZzLCAxMCk7CisJCQlpZiAoKnMgPT0gJywnKSBUVC5vbGRsZW4gPSBvbGRsZW4gPSBzdHJ0b2wocysxLCAmcywgMTApOworCQkJVFQubmV3bGluZSA9IHN0cnRvbChzKzIsICZzLCAxMCk7CisJCQlpZiAoKnMgPT0gJywnKSBUVC5uZXdsZW4gPSBuZXdsZW4gPSBzdHJ0b2wocysxLCAmcywgMTApOworCisJCQlpZiAob2xkbGVuIDwgMSAmJiBuZXdsZW4gPCAxKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJSZWFsbHk/ICVzIiwgcGF0Y2hsaW5lKTsKKworCQkJVFQuY29udGV4dCA9IDA7CisJCQlzdGF0ZSA9IDI7CisKKwkJCS8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGh1bmssIG9wZW4gdGhlIGZpbGUuCisJCQlpZiAoVFQuZmlsZWluID09IC0xKSB7CisJCQkJaW50IG9sZHN1bSwgbmV3c3VtLCBlbXB0eSA9IDA7CisJCQkJY2hhciAqbmFtZTsKKworCQkJCW9sZHN1bSA9IFRULm9sZGxpbmUgKyBvbGRsZW47CisJCQkJbmV3c3VtID0gVFQubmV3bGluZSArIG5ld2xlbjsKKworCQkJCW5hbWUgPSByZXZlcnNlID8gb2xkbmFtZSA6IG5ld25hbWU7CisKKwkJCQkvLyBXZSdyZSBkZWxldGluZyBvbGRuYW1lIGlmIG5ldyBmaWxlIGlzIC9kZXYvbnVsbCAoYmVmb3JlIC1wKQorCQkJCS8vIG9yIGlmIG5ldyBodW5rIGlzIGVtcHR5ICh6ZXJvIGNvbnRleHQpIGFmdGVyIHBhdGNoaW5nCisJCQkJaWYgKCFzdHJjbXAobmFtZSwgIi9kZXYvbnVsbCIpIHx8ICEocmV2ZXJzZSA/IG9sZHN1bSA6IG5ld3N1bSkpCisJCQkJeworCQkJCQluYW1lID0gcmV2ZXJzZSA/IG5ld25hbWUgOiBvbGRuYW1lOworCQkJCQllbXB0eSsrOworCQkJCX0KKworCQkJCS8vIGhhbmRsZSAtcCBwYXRoIHRydW5jYXRpb24uCisJCQkJZm9yIChpPTAsIHMgPSBuYW1lOyAqczspIHsKKwkJCQkJaWYgKChvcHRpb25fbWFzazMyICYgRkxBR19QQVRITEVOKSAmJiBUVC5wcmVmaXggPT0gaSkgYnJlYWs7CisJCQkJCWlmICgqKHMrKyk9PScvJykgeworCQkJCQkJbmFtZSA9IHM7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZW1wdHkpIHsKKwkJCQkJLy8gRmlsZSBpcyBlbXB0eSBhZnRlciB0aGUgcGF0Y2hlcyBoYXZlIGJlZW4gYXBwbGllZAorCQkJCQlzdGF0ZSA9IDA7CisJCQkJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19STUVNUFRZKSB7CisJCQkJCQkvLyBJZiBmbGFnIC1FIG9yIC0tcmVtb3ZlLWVtcHR5LWZpbGVzIGlzIHNldAorCQkJCQkJcHJpbnRmKCJyZW1vdmluZyAlc1xuIiwgbmFtZSk7CisJCQkJCQl4dW5saW5rKG5hbWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRmKCJwYXRjaGluZyBmaWxlICVzXG4iLCBuYW1lKTsKKwkJCQkJCXhjbG9zZSh4b3BlbihuYW1lLCBPX1dST05MWSB8IE9fVFJVTkMpKTsKKwkJCQkJfQorCQkJCS8vIElmIHdlJ3ZlIGdvdCBhIGZpbGUgdG8gb3BlbiwgZG8gc28uCisJCQkJfSBlbHNlIGlmICghKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1BBVEhMRU4pIHx8IGkgPD0gVFQucHJlZml4KSB7CisJCQkJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwkJCQkJLy8gSWYgdGhlIG9sZCBmaWxlIHdhcyBudWxsLCB3ZSdyZSBjcmVhdGluZyBhIG5ldyBvbmUuCisJCQkJCWlmICghc3RyY21wKG9sZG5hbWUsICIvZGV2L251bGwiKSB8fCAhb2xkc3VtKSB7CisJCQkJCQlwcmludGYoImNyZWF0aW5nICVzXG4iLCBuYW1lKTsKKwkJCQkJCXMgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJCQkJCQlpZiAocykgeworCQkJCQkJCSpzID0gMDsKKwkJCQkJCQliYl9tYWtlX2RpcmVjdG9yeShuYW1lLCAtMSwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJCQkJCQkqcyA9ICcvJzsKKwkJCQkJCX0KKwkJCQkJCVRULmZpbGVpbiA9IHhvcGVuKG5hbWUsIE9fQ1JFQVR8T19FWENMfE9fUkRXUik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGYoInBhdGNoaW5nIGZpbGUgJXNcbiIsIG5hbWUpOworCQkJCQkJVFQuZmlsZWluID0geG9wZW4obmFtZSwgT19SRE9OTFkpOworCQkJCQl9CisKKwkJCQkJVFQudGVtcG5hbWUgPSB4YXNwcmludGYoIiVzWFhYWFhYIiwgbmFtZSk7CisJCQkJCVRULmZpbGVvdXQgPSB4bWtzdGVtcChUVC50ZW1wbmFtZSk7CisJCQkJCS8vIFNldCBwZXJtaXNzaW9ucyBvZiBvdXRwdXQgZmlsZQorCQkJCQlmc3RhdChUVC5maWxlaW4sICZzdGF0YnVmKTsKKwkJCQkJZmNobW9kKFRULmZpbGVvdXQsIHN0YXRidWYuc3RfbW9kZSk7CisKKwkJCQkJVFQubGluZW51bSA9IDA7CisJCQkJCVRULmh1bmtudW0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJVFQuaHVua251bSsrOworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIElmIHdlIGRpZG4ndCBjb250aW51ZSBhYm92ZSwgZGlzY2FyZCB0aGlzIGxpbmUuCisJCWZyZWUocGF0Y2hsaW5lKTsKKwl9CisKKwlmaW5pc2hfb2xkZmlsZSgpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUob2xkbmFtZSk7CisJCWZyZWUobmV3bmFtZSk7CisJfQorCisJcmV0dXJuIFRULmV4aXR2YWw7Cit9CmRpZmYgLS1naXQgYS9lZGl0b3JzL3BhdGNoX2Jib3guYyBiL2VkaXRvcnMvcGF0Y2hfYmJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWE1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL3BhdGNoX2Jib3guYwpAQCAtMCwwICsxLDMwNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYnVzeWJveCBwYXRjaCBhcHBsZXQgdG8gaGFuZGxlIHRoZSB1bmlmaWVkIGRpZmYgZm9ybWF0LgorICogQ29weXJpZ2h0IChDKSAyMDAzIEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgYXBwbGV0IGlzIHdyaXR0ZW4gdG8gd29yayB3aXRoIHBhdGNoZXMgZ2VuZXJhdGVkIGJ5IEdOVSBkaWZmLAorICogd2hlcmUgdGhlcmUgaXMgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5IGJ1c3lib3ggcGF0Y2ggc2hhbGwgYmVoYXZlCisgKiBhcyBwZXIgR05VIHBhdGNoLgorICoKKyAqIFRoZXJlIGlzIGEgU1VTdjMgc3BlY2lmaWNhdGlvbiBmb3IgcGF0Y2gsIGhvd2V2ZXIgaXQgbG9va3MgdG8gYmUKKyAqIGluY29tcGxldGUsIGl0IGRvZXNudCBldmVuIG1lbnRpb24gdW5pZmllZCBkaWZmIGZvcm1hdC4KKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvcGF0Y2guaHRtbAorICoKKyAqIElzc3VlcworICogLSBOb24taW50ZXJhY3RpdmUKKyAqIC0gUGF0Y2hlcyBtdXN0IGFwcGx5IGNsZWFubHkgb3IgcGF0Y2ggKG5vdCBqdXN0IG9uZSBodW5rKSB3aWxsIGZhaWwuCisgKiAtIFJlamVjdCBmaWxlIGlzbnQgc2F2ZWQKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIHVuc2lnbmVkIGNvcHlfbGluZXMoRklMRSAqc3JjX3N0cmVhbSwgRklMRSAqZHN0X3N0cmVhbSwgdW5zaWduZWQgbGluZXNfY291bnQpCit7CisJd2hpbGUgKHNyY19zdHJlYW0gJiYgbGluZXNfY291bnQpIHsKKwkJY2hhciAqbGluZTsKKwkJbGluZSA9IHhtYWxsb2NfZmdldHMoc3JjX3N0cmVhbSk7CisJCWlmIChsaW5lID09IE5VTEwpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmcHV0cyhsaW5lLCBkc3Rfc3RyZWFtKSA9PSBFT0YpIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd3JpdGluZyB0byBuZXcgZmlsZSIpOworCQl9CisJCWZyZWUobGluZSk7CisJCWxpbmVzX2NvdW50LS07CisJfQorCXJldHVybiBsaW5lc19jb3VudDsKK30KKworLyogSWYgcGF0Y2hfbGV2ZWwgaXMgLTEgaXQgd2lsbCByZW1vdmUgYWxsIGRpcmVjdG9yeSBuYW1lcworICogY2hhciAqbGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0IGNoYXJzCisgKiByZXR1cm5zIE5VTEwgaWYgdGhlIGZpbGUgZG9lc250IGV4aXN0IG9yIGVycm9yCisgKiByZXR1cm5zIG1hbGxvYydlZCBmaWxlbmFtZQorICogTkI6IGZyZWVzIDFzdCBhcmd1bWVudCEKKyAqLworc3RhdGljIGNoYXIgKmV4dHJhY3RfZmlsZW5hbWUoY2hhciAqbGluZSwgaW50IHBhdGNoX2xldmVsLCBjb25zdCBjaGFyICpwYXQpCit7CisJY2hhciAqdGVtcCA9IE5VTEwsICpmaWxlbmFtZV9zdGFydF9wdHIgPSBsaW5lICsgNDsKKworCWlmIChzdHJuY21wKGxpbmUsIHBhdCwgNCkgPT0gMCkgeworCQkvKiBUZXJtaW5hdGUgc3RyaW5nIGF0IGVuZCBvZiBzb3VyY2UgZmlsZW5hbWUgKi8KKwkJbGluZVtzdHJjc3BuKGxpbmUsICJcdFxuXHIiKV0gPSAnXDAnOworCisJCS8qIFNraXAgb3ZlciAocGF0Y2hfbGV2ZWwpIG51bWJlciBvZiBsZWFkaW5nIGRpcmVjdG9yaWVzICovCisJCXdoaWxlIChwYXRjaF9sZXZlbC0tKSB7CisJCQl0ZW1wID0gc3RyY2hyKGZpbGVuYW1lX3N0YXJ0X3B0ciwgJy8nKTsKKwkJCWlmICghdGVtcCkKKwkJCQlicmVhazsKKwkJCWZpbGVuYW1lX3N0YXJ0X3B0ciA9IHRlbXAgKyAxOworCQl9CisJCXRlbXAgPSB4c3RyZHVwKGZpbGVuYW1lX3N0YXJ0X3B0cik7CisJfQorCWZyZWUobGluZSk7CisJcmV0dXJuIHRlbXA7Cit9CisKK2ludCBwYXRjaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGF0Y2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHNhdmVkX3N0YXQ7CisJY2hhciAqcGF0Y2hfbGluZTsKKwlGSUxFICpwYXRjaF9maWxlOworCWludCBwYXRjaF9sZXZlbDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyIHBsdXMgPSAnKyc7CisJdW5zaWduZWQgb3B0OworCWVudW0geworCQlPUFRfUiA9ICgxIDw8IDIpLAorCQlPUFRfTiA9ICgxIDw8IDMpLAorCQkvKk9QVF9mID0gKDEgPDwgNCksIGlnbm9yZWQgKi8KKwkJLypPUFRfRSA9ICgxIDw8IDUpLCBpZ25vcmVkLCB0aGlzIGlzIHRoZSBkZWZhdWx0ICovCisJCS8qT1BUX2cgPSAoMSA8PCA2KSwgaWdub3JlZCAqLworCQlPUFRfZHJ5X3J1biA9ICgxIDw8IDcpICogRU5BQkxFX0xPTkdfT1BUUywKKwl9OworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMjsKKwl7CisJCWNvbnN0IGNoYXIgKnAgPSAiLTEiOworCQljb25zdCBjaGFyICppID0gIi0iOyAvKiBjb21wYXQgKi8KKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJCXN0YXRpYyBjb25zdCBjaGFyIHBhdGNoX2xvbmdvcHRzW10gQUxJR04xID0KKwkJCSJzdHJpcFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInAiCisJCQkiaW5wdXRcMCIgICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJpIgorCQkJInJldmVyc2VcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkJCSJmb3J3YXJkXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIk4iCisJCS8qICJBc3N1bWUgdXNlciBrbm93cyB3aGF0IFtzXWhlIGlzIGRvaW5nLCBkbyBub3QgYXNrIGFueSBxdWVzdGlvbnMiOiAqLworCQkJImZvcmNlXDAiICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiZiIgLyppZ25vcmVkKi8KKyMgaWYgRU5BQkxFX0RFU0tUT1AKKwkJCSJyZW1vdmUtZW1wdHktZmlsZXNcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIkUiIC8qaWdub3JlZCovCisJCS8qICJDb250cm9scyBhY3Rpb25zIHdoZW4gYSBmaWxlIGlzIHVuZGVyIFJDUyBvciBTQ0NTIGNvbnRyb2wsCisJCSAqIGFuZCBkb2VzIG5vdCBleGlzdCBvciBpcyByZWFkLW9ubHkgYW5kIG1hdGNoZXMgdGhlIGRlZmF1bHQgdmVyc2lvbiwKKwkJICogb3Igd2hlbiBhIGZpbGUgaXMgdW5kZXIgQ2xlYXJDYXNlIGNvbnRyb2wgYW5kIGRvZXMgbm90IGV4aXN0Li4uIgorCQkgKiBJT1c6IHJhdGhlciBvYnNjdXJlIG9wdGlvbi4KKwkJICogQnV0IEdlbnRvbydzIHBvcnRhZ2UgZG9lcyB1c2UgLWcwICovCisJCQkiZ2V0XDAiICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJnIiAvKmlnbm9yZWQqLworIyBlbmRpZgorCQkJImRyeS1ydW5cMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZCIKKyMgaWYgRU5BQkxFX0RFU0tUT1AKKwkJCSJiYWNrdXAtaWYtbWlzbWF0Y2hcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmUiIC8qaWdub3JlZCovCisJCQkibm8tYmFja3VwLWlmLW1pc21hdGNoXDAiIE5vX2FyZ3VtZW50ICAgICAgICJceGZmIiAvKmlnbm9yZWQqLworIyBlbmRpZgorCQkJOworCQlhcHBsZXRfbG9uZ19vcHRpb25zID0gcGF0Y2hfbG9uZ29wdHM7CisjZW5kaWYKKwkJLyogLWYsLUUsLWcgYXJlIGlnbm9yZWQgKi8KKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInA6aTpSTiIiZkVnOiIsICZwLCAmaSwgTlVMTCk7CisJCWlmIChvcHQgJiBPUFRfUikKKwkJCXBsdXMgPSAnLSc7CisJCXBhdGNoX2xldmVsID0geGF0b2kocCk7IC8qIGNhbiBiZSBuZWdhdGl2ZSEgKi8KKwkJcGF0Y2hfZmlsZSA9IHhmb3Blbl9zdGRpbihpKTsKKwl9CisKKwlwYXRjaF9saW5lID0geG1hbGxvY19mZ2V0bGluZShwYXRjaF9maWxlKTsKKwl3aGlsZSAocGF0Y2hfbGluZSkgeworCQlGSUxFICpzcmNfc3RyZWFtOworCQlGSUxFICpkc3Rfc3RyZWFtOworCQkvL2NoYXIgKm9sZF9maWxlbmFtZTsKKwkJY2hhciAqbmV3X2ZpbGVuYW1lOworCQljaGFyICpiYWNrdXBfZmlsZW5hbWUgPSBOVUxMOworCQl1bnNpZ25lZCBzcmNfY3VyX2xpbmUgPSAxOworCQl1bnNpZ25lZCBkc3RfY3VyX2xpbmUgPSAwOworCQl1bnNpZ25lZCBkc3RfYmVnX2xpbmU7CisJCXVuc2lnbmVkIGJhZF9odW5rX2NvdW50ID0gMDsKKwkJdW5zaWduZWQgaHVua19jb3VudCA9IDA7CisJCXNtYWxsaW50IGNvcHlfdHJhaWxpbmdfbGluZXNfZmxhZyA9IDA7CisKKwkJLyogU2tpcCBldmVyeXRoaW5nIHVwdG8gdGhlICItLS0iIG1hcmtlcgorCQkgKiBObyBuZWVkIHRvIHBhcnNlIHRoZSBsaW5lcyAiT25seSBpbiA8ZGlyPiIsIGFuZCAiZGlmZiA8YXJncz4iCisJCSAqLworCQlkbyB7CisJCQkvKiBFeHRyYWN0IHRoZSBmaWxlbmFtZSB1c2VkIGJlZm9yZSB0aGUgcGF0Y2ggd2FzIGdlbmVyYXRlZCAqLworCQkJbmV3X2ZpbGVuYW1lID0gZXh0cmFjdF9maWxlbmFtZShwYXRjaF9saW5lLCBwYXRjaF9sZXZlbCwgIi0tLSAiKTsKKwkJCS8vIHdhcyBvbGRfZmlsZW5hbWUgYWJvdmUKKwkJCXBhdGNoX2xpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHBhdGNoX2ZpbGUpOworCQkJaWYgKCFwYXRjaF9saW5lKSBnb3RvIHF1aXQ7CisJCX0gd2hpbGUgKCFuZXdfZmlsZW5hbWUpOworCQlmcmVlKG5ld19maWxlbmFtZSk7IC8vICJzb3VyY2UiIGZpbGVuYW1lIGlzIGlycmVsZXZhbnQKKworCQluZXdfZmlsZW5hbWUgPSBleHRyYWN0X2ZpbGVuYW1lKHBhdGNoX2xpbmUsIHBhdGNoX2xldmVsLCAiKysrICIpOworCQlpZiAoIW5ld19maWxlbmFtZSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgcGF0Y2giKTsKKwkJfQorCisJCS8qIEdldCBhY2Nlc3MgcmlnaHRzIGZyb20gdGhlIGZpbGUgdG8gYmUgcGF0Y2hlZCAqLworCQlpZiAoc3RhdChuZXdfZmlsZW5hbWUsICZzYXZlZF9zdGF0KSAhPSAwKSB7CisJCQljaGFyICpzbGFzaCA9IHN0cnJjaHIobmV3X2ZpbGVuYW1lLCAnLycpOworCQkJaWYgKHNsYXNoKSB7CisJCQkJLyogQ3JlYXRlIGxlYWRpbmcgZGlyZWN0b3JpZXMgKi8KKwkJCQkqc2xhc2ggPSAnXDAnOworCQkJCWJiX21ha2VfZGlyZWN0b3J5KG5ld19maWxlbmFtZSwgLTEsIEZJTEVVVElMU19SRUNVUik7CisJCQkJKnNsYXNoID0gJy8nOworCQkJfQorCQkJc3JjX3N0cmVhbSA9IE5VTEw7CisJCQlzYXZlZF9zdGF0LnN0X21vZGUgPSAwNjQ0OworCQl9IGVsc2UgaWYgKCEob3B0ICYgT1BUX2RyeV9ydW4pKSB7CisJCQliYWNrdXBfZmlsZW5hbWUgPSB4YXNwcmludGYoIiVzLm9yaWciLCBuZXdfZmlsZW5hbWUpOworCQkJeHJlbmFtZShuZXdfZmlsZW5hbWUsIGJhY2t1cF9maWxlbmFtZSk7CisJCQlzcmNfc3RyZWFtID0geGZvcGVuX2Zvcl9yZWFkKGJhY2t1cF9maWxlbmFtZSk7CisJCX0gZWxzZQorCQkJc3JjX3N0cmVhbSA9IHhmb3Blbl9mb3JfcmVhZChuZXdfZmlsZW5hbWUpOworCisJCWlmIChvcHQgJiBPUFRfZHJ5X3J1bikgeworCQkJZHN0X3N0cmVhbSA9IHhmb3Blbl9mb3Jfd3JpdGUoIi9kZXYvbnVsbCIpOworCQl9IGVsc2UgeworCQkJZHN0X3N0cmVhbSA9IHhmb3Blbl9mb3Jfd3JpdGUobmV3X2ZpbGVuYW1lKTsKKwkJCWZjaG1vZChmaWxlbm8oZHN0X3N0cmVhbSksIHNhdmVkX3N0YXQuc3RfbW9kZSk7CisJCX0KKworCQlwcmludGYoInBhdGNoaW5nIGZpbGUgJXNcbiIsIG5ld19maWxlbmFtZSk7CisKKwkJLyogSGFuZGxlIGFsbCBodW5rcyBmb3IgdGhpcyBmaWxlICovCisJCXBhdGNoX2xpbmUgPSB4bWFsbG9jX2ZnZXRzKHBhdGNoX2ZpbGUpOworCQl3aGlsZSAocGF0Y2hfbGluZSkgeworCQkJdW5zaWduZWQgY291bnQ7CisJCQl1bnNpZ25lZCBzcmNfYmVnX2xpbmU7CisJCQl1bnNpZ25lZCBodW5rX29mZnNldF9zdGFydDsKKwkJCXVuc2lnbmVkIHNyY19sYXN0X2xpbmUgPSAxOworCQkJdW5zaWduZWQgZHN0X2xhc3RfbGluZSA9IDE7CisKKwkJCWlmICgoc3NjYW5mKHBhdGNoX2xpbmUsICJAQCAtJWQsJWQgKyVkLCVkIiwgJnNyY19iZWdfbGluZSwgJnNyY19sYXN0X2xpbmUsICZkc3RfYmVnX2xpbmUsICZkc3RfbGFzdF9saW5lKSA8IDMpCisJCQkgJiYgKHNzY2FuZihwYXRjaF9saW5lLCAiQEAgLSVkICslZCwlZCIsICZzcmNfYmVnX2xpbmUsICZkc3RfYmVnX2xpbmUsICZkc3RfbGFzdF9saW5lKSA8IDIpCisJCQkpIHsKKwkJCQkvKiBObyBtb3JlIGh1bmtzIGZvciB0aGlzIGZpbGUgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwbHVzICE9ICcrJykgeworCQkJCS8qIHJldmVyc2UgcGF0Y2ggKi8KKwkJCQl1bnNpZ25lZCB0bXAgPSBzcmNfbGFzdF9saW5lOworCQkJCXNyY19sYXN0X2xpbmUgPSBkc3RfbGFzdF9saW5lOworCQkJCWRzdF9sYXN0X2xpbmUgPSB0bXA7CisJCQkJdG1wID0gc3JjX2JlZ19saW5lOworCQkJCXNyY19iZWdfbGluZSA9IGRzdF9iZWdfbGluZTsKKwkJCQlkc3RfYmVnX2xpbmUgPSB0bXA7CisJCQl9CisJCQlodW5rX2NvdW50Kys7CisKKwkJCWlmIChzcmNfYmVnX2xpbmUgJiYgZHN0X2JlZ19saW5lKSB7CisJCQkJLyogQ29weSB1bm1vZGlmaWVkIGxpbmVzIHVwdG8gc3RhcnQgb2YgaHVuayAqLworCQkJCS8qIHNyY19iZWdfbGluZSB3aWxsIGJlIDAgaWYgaXQncyBhIG5ldyBmaWxlICovCisJCQkJY291bnQgPSBzcmNfYmVnX2xpbmUgLSBzcmNfY3VyX2xpbmU7CisJCQkJaWYgKGNvcHlfbGluZXMoc3JjX3N0cmVhbSwgZHN0X3N0cmVhbSwgY291bnQpKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgc3JjIGZpbGUiKTsKKwkJCQl9CisJCQkJc3JjX2N1cl9saW5lICs9IGNvdW50OworCQkJCWRzdF9jdXJfbGluZSArPSBjb3VudDsKKwkJCQljb3B5X3RyYWlsaW5nX2xpbmVzX2ZsYWcgPSAxOworCQkJfQorCQkJc3JjX2xhc3RfbGluZSArPSBodW5rX29mZnNldF9zdGFydCA9IHNyY19jdXJfbGluZTsKKwkJCWRzdF9sYXN0X2xpbmUgKz0gZHN0X2N1cl9saW5lOworCisJCQl3aGlsZSAoMSkgeworCQkJCWZyZWUocGF0Y2hfbGluZSk7CisJCQkJcGF0Y2hfbGluZSA9IHhtYWxsb2NfZmdldHMocGF0Y2hfZmlsZSk7CisJCQkJaWYgKHBhdGNoX2xpbmUgPT0gTlVMTCkKKwkJCQkJYnJlYWs7IC8qIEVPRiAqLworCQkJCWlmICghKnBhdGNoX2xpbmUpIHsKKwkJCQkJLyogd2hpdGVzcGFjZS1kYW1hZ2VkIHBhdGNoIHdpdGggIiIgbGluZXMgKi8KKwkJCQkJZnJlZShwYXRjaF9saW5lKTsKKwkJCQkJcGF0Y2hfbGluZSA9IHhzdHJkdXAoIiAiKTsKKwkJCQl9CisJCQkJaWYgKCgqcGF0Y2hfbGluZSAhPSAnLScpICYmICgqcGF0Y2hfbGluZSAhPSAnKycpCisJCQkJICYmICgqcGF0Y2hfbGluZSAhPSAnICcpCisJCQkJKSB7CisJCQkJCWJyZWFrOyAvKiBFbmQgb2YgaHVuayAqLworCQkJCX0KKwkJCQlpZiAoKnBhdGNoX2xpbmUgIT0gcGx1cykgeyAvKiAnLScgb3IgJyAnICovCisJCQkJCWNoYXIgKnNyY19saW5lID0gTlVMTDsKKwkJCQkJaWYgKHNyY19jdXJfbGluZSA9PSBzcmNfbGFzdF9saW5lKQorCQkJCQkJYnJlYWs7CisJCQkJCWlmIChzcmNfc3RyZWFtKSB7CisJCQkJCQlzcmNfbGluZSA9IHhtYWxsb2NfZmdldHMoc3JjX3N0cmVhbSk7CisJCQkJCQlpZiAoc3JjX2xpbmUpIHsKKwkJCQkJCQlpbnQgZGlmZiA9IHN0cmNtcChzcmNfbGluZSwgcGF0Y2hfbGluZSArIDEpOworCQkJCQkJCXNyY19jdXJfbGluZSsrOworCQkJCQkJCWZyZWUoc3JjX2xpbmUpOworCQkJCQkJCWlmIChkaWZmKQorCQkJCQkJCQlzcmNfbGluZSA9IE5VTEw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLyogRG8gbm90IHBhdGNoIGFuIGFscmVhZHkgcGF0Y2hlZCBodW5rIHdpdGggLU4gKi8KKwkJCQkJaWYgKHNyY19saW5lID09IDAgJiYgKG9wdCAmIE9QVF9OKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJaWYgKCFzcmNfbGluZSkgeworCQkJCQkJYmJfZXJyb3JfbXNnKCJodW5rICMldSBGQUlMRUQgYXQgJXUiLCBodW5rX2NvdW50LCBodW5rX29mZnNldF9zdGFydCk7CisJCQkJCQliYWRfaHVua19jb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCpwYXRjaF9saW5lICE9ICcgJykgeyAvKiAnLScgKi8KKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChkc3RfY3VyX2xpbmUgPT0gZHN0X2xhc3RfbGluZSkKKwkJCQkJYnJlYWs7CisJCQkJZnB1dHMocGF0Y2hfbGluZSArIDEsIGRzdF9zdHJlYW0pOworCQkJCWRzdF9jdXJfbGluZSsrOworCQkJfSAvKiBlbmQgb2Ygd2hpbGUgbG9vcCBoYW5kbGluZyBvbmUgaHVuayAqLworCQl9IC8qIGVuZCBvZiB3aGlsZSBsb29wIGhhbmRsaW5nIG9uZSBmaWxlICovCisKKwkJLyogQ2xlYW51cCBsYXN0IHBhdGNoZWQgZmlsZSAqLworCQlpZiAoY29weV90cmFpbGluZ19saW5lc19mbGFnKSB7CisJCQljb3B5X2xpbmVzKHNyY19zdHJlYW0sIGRzdF9zdHJlYW0sICh1bnNpZ25lZCkoLTEpKTsKKwkJfQorCQlpZiAoc3JjX3N0cmVhbSkgeworCQkJZmNsb3NlKHNyY19zdHJlYW0pOworCQl9CisJCWZjbG9zZShkc3Rfc3RyZWFtKTsKKwkJaWYgKGJhZF9odW5rX2NvdW50KSB7CisJCQlyZXQgPSAxOworCQkJYmJfZXJyb3JfbXNnKCIldSBvdXQgb2YgJXUgaHVuayBGQUlMRUQiLCBiYWRfaHVua19jb3VudCwgaHVua19jb3VudCk7CisJCX0gZWxzZSB7CisJCQkvKiBJdCB3b3JrZWQsIHdlIGNhbiByZW1vdmUgdGhlIGJhY2t1cCAqLworCQkJaWYgKGJhY2t1cF9maWxlbmFtZSkgeworCQkJCXVubGluayhiYWNrdXBfZmlsZW5hbWUpOworCQkJfQorCQkJaWYgKCEob3B0ICYgT1BUX2RyeV9ydW4pCisJCQkgJiYgKChkc3RfY3VyX2xpbmUgPT0gMCkgfHwgKGRzdF9iZWdfbGluZSA9PSAwKSkKKwkJCSkgeworCQkJCS8qIFRoZSBuZXcgcGF0Y2hlZCBmaWxlIGlzIGVtcHR5LCByZW1vdmUgaXQgKi8KKwkJCQl4dW5saW5rKG5ld19maWxlbmFtZSk7CisJCQkJLy8gLyogb2xkX2ZpbGVuYW1lIGFuZCBuZXdfZmlsZW5hbWUgbWF5IGJlIHRoZSBzYW1lIGZpbGUgKi8KKwkJCQkvLyB1bmxpbmsob2xkX2ZpbGVuYW1lKTsKKwkJCX0KKwkJfQorCQlmcmVlKGJhY2t1cF9maWxlbmFtZSk7CisJCS8vZnJlZShvbGRfZmlsZW5hbWUpOworCQlmcmVlKG5ld19maWxlbmFtZSk7CisJfSAvKiBlbmQgb2YgIndoaWxlIHRoZXJlIGFyZSBwYXRjaCBsaW5lcyIgKi8KKyBxdWl0OgorCS8qIDAgPSBTVUNDRVNTCisJICogMSA9IFNvbWUgaHVua3MgZmFpbGVkCisJICogMiA9IE1vcmUgc2VyaW91cyBwcm9ibGVtcyAoZXhpdGVkIGVhcmxpZXIpCisJICovCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2VkaXRvcnMvcGF0Y2hfdG95Ym94LmMgYi9lZGl0b3JzL3BhdGNoX3RveWJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MGJmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL3BhdGNoX3RveWJveC5jCkBAIC0wLDAgKzEsNTkxIEBACisvKiBBZGFwdGVkIGZyb20gdG95Ym94J3MgcGF0Y2guICovCisKKy8qIHZpOiBzZXQgc3c9NCB0cz00OgorICoKKyAqIHBhdGNoLmMgLSBBcHBseSBhICJ1bml2ZXJzYWwiIGRpZmYuCisgKgorICogQ29weXJpZ2h0IDIwMDcgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBzZWUgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy9wYXRjaC5odG1sCisgKiAoQnV0IG9ubHkgZG9lcyAtdSwgYmVjYXVzZSB3aG8gc3RpbGwgY2FyZXMgYWJvdXQgImVkIj8pCisgKgorICogVE9ETzoKKyAqIC1iIGJhY2t1cAorICogLWwgdHJlYXQgYWxsIHdoaXRlc3BhY2UgYXMgYSBzaW5nbGUgc3BhY2UKKyAqIC1OIGlnbm9yZSBhbHJlYWR5IGFwcGxpZWQKKyAqIC1kIGNoZGlyIGZpcnN0CisgKiAtRCBkZWZpbmUgd3JhcCAjaWZkZWYgYW5kICNpZm5kZWYgYXJvdW5kIGNoYW5nZXMKKyAqIC1vIG91dGZpbGUgb3V0cHV0IGhlcmUgaW5zdGVhZCBvZiBpbiBwbGFjZQorICogLXIgcmVqZWN0ZmlsZSB3cml0ZSByZWplY3RlZCBodW5rcyB0byB0aGlzIGZpbGUKKyAqCisgKiAtRSByZW1vdmUgZW1wdHkgZmlsZXMgLS1yZW1vdmUtZW1wdHktZmlsZXMKKyAqIC1mIGZvcmNlIChubyBxdWVzdGlvbnMgYXNrZWQpCisgKiAtRiBmdXp6IChudW1iZXIsIGRlZmF1bHQgMikKKyAqIFtmaWxlXSB3aGljaCBmaWxlIHRvIHBhdGNoCisKK1VTRV9QQVRDSChORVdUT1kocGF0Y2gsIFVTRV9UT1lCT1hfREVCVUcoIngiKSJ1cCNpOlIiLCBUT1lGTEFHX1VTUnxUT1lGTEFHX0JJTikpCisKK2NvbmZpZyBQQVRDSAorCWJvb2wgInBhdGNoIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVzYWdlOiBwYXRjaCBbLWkgZmlsZV0gWy1wIGRlcHRoXSBbLVJ1XQorCisJICBBcHBseSBhIHVuaWZpZWQgZGlmZiB0byBvbmUgb3IgbW9yZSBmaWxlcy4KKworCSAgLWkJSW5wdXQgZmlsZSAoZGVmYXVsdHM9c3RkaW4pCisJICAtcAludW1iZXIgb2YgJy8nIHRvIHN0cmlwIGZyb20gc3RhcnQgb2YgZmlsZSBwYXRocyAoZGVmYXVsdD1hbGwpCisJICAtUglSZXZlcnNlIHBhdGNoLgorCSAgLXUJSWdub3JlZCAob25seSBoYW5kbGVzICJ1bmlmaWVkIiBkaWZmcykKKworCSAgVGhpcyB2ZXJzaW9uIG9mIHBhdGNoIG9ubHkgaGFuZGxlcyB1bmlmaWVkIGRpZmZzLCBhbmQgb25seSBtb2RpZmllcworCSAgYSBmaWxlIHdoZW4gYWxsIGFsbCBodW5rcyB0byB0aGF0IGZpbGUgYXBwbHkuICBQYXRjaCBwcmludHMgZmFpbGVkCisJICBodW5rcyB0byBzdGRlcnIsIGFuZCBleGl0cyB3aXRoIG5vbnplcm8gc3RhdHVzIGlmIGFueSBodW5rcyBmYWlsLgorCisJICBBIGZpbGUgY29tcGFyZWQgYWdhaW5zdCAvZGV2L251bGwgKG9yIHdpdGggYSBkYXRlIDw9IHRoZSBlcG9jaCkgaXMKKwkgIGNyZWF0ZWQvZGVsZXRlZCBhcyBhcHByb3ByaWF0ZS4KKyovCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IGRvdWJsZV9saXN0IHsKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKm5leHQ7CisJc3RydWN0IGRvdWJsZV9saXN0ICpwcmV2OworCWNoYXIgKmRhdGE7Cit9OworCisvLyBSZXR1cm4gdGhlIGZpcnN0IGl0ZW0gZnJvbSB0aGUgbGlzdCwgYWR2YW5jaW5nIHRoZSBsaXN0ICh3aGljaCBtdXN0IGJlIGNhbGxlZAorLy8gYXMgJmxpc3QpCitzdGF0aWMKK3ZvaWQgKlRPWV9sbGlzdF9wb3Aodm9pZCAqbGlzdCkKK3sKKwkvLyBJJ2QgdXNlIGEgdm9pZCAqKiBmb3IgdGhlIGFyZ3VtZW50LCBhbmQgZXZlbiBhY2NlcHQgdGhlIHR5cGVjYXN0IGluIGFsbAorCS8vIGNhbGxlcnMgYXMgZG9jdW1lbnRhdGlvbiB5b3UgbmVlZCB0aGUgJiwgZXhjZXB0IHRoZSBzdHVwaWQgY29tcGlsZXIKKwkvLyB3b3VsZCB0aGVuIHNjcmVhbSBhYm91dCB0eXBlLXB1bm5lZCBwb2ludGVycy4gIFNjcmV3IGl0LgorCXZvaWQgKipsbGlzdCA9ICh2b2lkICoqKWxpc3Q7CisJdm9pZCAqKm5leHQgPSAodm9pZCAqKikqbGxpc3Q7CisJKmxsaXN0ID0gKm5leHQ7CisKKwlyZXR1cm4gKHZvaWQgKiluZXh0OworfQorCisvLyBGcmVlIGFsbCB0aGUgZWxlbWVudHMgb2YgYSBsaW5rZWQgbGlzdAorLy8gaWYgZnJlZWl0IT1OVUxMIGNhbGwgZnJlZWl0KCkgb24gZWFjaCBlbGVtZW50IGJlZm9yZSBmcmVlaW5nIGl0Lgorc3RhdGljCit2b2lkIFRPWV9sbGlzdF9mcmVlKHZvaWQgKmxpc3QsIHZvaWQgKCpmcmVlaXQpKHZvaWQgKmRhdGEpKQoreworCXdoaWxlIChsaXN0KSB7CisJCXZvaWQgKnBvcCA9IFRPWV9sbGlzdF9wb3AoJmxpc3QpOworCQlpZiAoZnJlZWl0KSBmcmVlaXQocG9wKTsKKwkJZWxzZSBmcmVlKHBvcCk7CisKKwkJLy8gRW5kIGRvdWJseSBsaW5rZWQgbGlzdCB0b28uCisJCWlmIChsaXN0PT1wb3ApIGJyZWFrOworCX0KK30KKworLy8gQWRkIGFuIGVudHJ5IHRvIHRoZSBlbmQgb2ZmIGEgZG91Ymx5IGxpbmtlZCBsaXN0CitzdGF0aWMKK3N0cnVjdCBkb3VibGVfbGlzdCAqZGxpc3RfYWRkKHN0cnVjdCBkb3VibGVfbGlzdCAqKmxpc3QsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGRvdWJsZV9saXN0ICpsaW5lID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGRvdWJsZV9saXN0KSk7CisKKwlsaW5lLT5kYXRhID0gZGF0YTsKKwlpZiAoKmxpc3QpIHsKKwkJbGluZS0+bmV4dCA9ICpsaXN0OworCQlsaW5lLT5wcmV2ID0gKCpsaXN0KS0+cHJldjsKKwkJKCpsaXN0KS0+cHJldi0+bmV4dCA9IGxpbmU7CisJCSgqbGlzdCktPnByZXYgPSBsaW5lOworCX0gZWxzZSAqbGlzdCA9IGxpbmUtPm5leHQgPSBsaW5lLT5wcmV2ID0gbGluZTsKKworCXJldHVybiBsaW5lOworfQorCisvLyBFbnN1cmUgZW50aXJlIHBhdGggZXhpc3RzLgorLy8gSWYgbW9kZSAhPSAtMSBzZXQgcGVybWlzc2lvbnMgb24gbmV3bHkgY3JlYXRlZCBkaXJzLgorLy8gUmVxdWlyZXMgdGhhdCBwYXRoIHN0cmluZyBiZSB3cml0YWJsZSAoZm9yIHRlbXBvcmFyeSBudWxsIHRlcm1pbmF0b3JzKS4KK3N0YXRpYwordm9pZCB4bWtwYXRoKGNoYXIgKnBhdGgsIGludCBtb2RlKQoreworCWNoYXIgKnAsIG9sZDsKKwltb2RlX3QgbWFzazsKKwlpbnQgcmM7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlmb3IgKHAgPSBwYXRoOyA7IHArKykgeworCQlpZiAoISpwIHx8ICpwID09ICcvJykgeworCQkJb2xkID0gKnA7CisJCQkqcCA9IHJjID0gMDsKKwkJCWlmIChzdGF0KHBhdGgsICZzdCkgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCQlpZiAobW9kZSAhPSAtMSkgeworCQkJCQltYXNrID0gdW1hc2soMCk7CisJCQkJCXJjID0gbWtkaXIocGF0aCwgbW9kZSk7CisJCQkJCXVtYXNrKG1hc2spOworCQkJCX0gZWxzZSByYyA9IG1rZGlyKHBhdGgsIDA3NzcpOworCQkJfQorCQkJKnAgPSBvbGQ7CisJCQlpZihyYykgYmJfcGVycm9yX21zZ19hbmRfZGllKCJta3BhdGggJyVzJyIsIHBhdGgpOworCQl9CisJCWlmICghKnApIGJyZWFrOworCX0KK30KKworLy8gU2xvdywgYnV0IHNtYWxsLgorc3RhdGljCitjaGFyICpnZXRfcmF3bGluZShpbnQgZmQsIGxvbmcgKnBsZW4sIGNoYXIgZW5kKQoreworCWNoYXIgYywgKmJ1ZiA9IE5VTEw7CisJbG9uZyBsZW4gPSAwOworCisJZm9yICg7OykgeworCQlpZiAoMT5yZWFkKGZkLCAmYywgMSkpIGJyZWFrOworCQlpZiAoIShsZW4gJiA2MykpIGJ1Zj14cmVhbGxvYyhidWYsIGxlbis2NSk7CisJCWlmICgoYnVmW2xlbisrXT1jKSA9PSBlbmQpIGJyZWFrOworCX0KKwlpZiAoYnVmKSBidWZbbGVuXT0wOworCWlmIChwbGVuKSAqcGxlbiA9IGxlbjsKKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYworY2hhciAqZ2V0X2xpbmUoaW50IGZkKQoreworCWxvbmcgbGVuOworCWNoYXIgKmJ1ZiA9IGdldF9yYXdsaW5lKGZkLCAmbGVuLCAnXG4nKTsKKworCWlmIChidWYgJiYgYnVmWy0tbGVuXT09J1xuJykgYnVmW2xlbl09MDsKKworCXJldHVybiBidWY7Cit9CisKKy8vIENvcHkgdGhlIHJlc3Qgb2YgaW4gdG8gb3V0IGFuZCBjbG9zZSBib3RoIGZpbGVzLgorc3RhdGljCit2b2lkIHhzZW5kZmlsZShpbnQgaW4sIGludCBvdXQpCit7CisJbG9uZyBsZW47CisJY2hhciBidWZbNDA5Nl07CisKKwlpZiAoaW48MCkgcmV0dXJuOworCWZvciAoOzspIHsKKwkJbGVuID0gc2FmZV9yZWFkKGluLCBidWYsIDQwOTYpOworCQlpZiAobGVuPDEpIGJyZWFrOworCQl4d3JpdGUob3V0LCBidWYsIGxlbik7CisJfQorfQorCisvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSBkYXRhIGFuZCByZXBsYWNlIHRoZSBvcmlnaW5hbCB3aXRoIHRoZSBjb3B5Lgorc3RhdGljCit2b2lkIHJlcGxhY2VfdGVtcGZpbGUoaW50IGZkaW4sIGludCBmZG91dCwgY2hhciAqKnRlbXBuYW1lKQoreworCWNoYXIgKnRlbXAgPSB4c3RyZHVwKCp0ZW1wbmFtZSk7CisKKwl0ZW1wW3N0cmxlbih0ZW1wKS02XT0wOworCWlmIChmZGluICE9IC0xKSB7CisJCXhzZW5kZmlsZShmZGluLCBmZG91dCk7CisJCXhjbG9zZShmZGluKTsKKwl9CisJeGNsb3NlKGZkb3V0KTsKKwlyZW5hbWUoKnRlbXBuYW1lLCB0ZW1wKTsKKwlmcmVlKCp0ZW1wbmFtZSk7CisJZnJlZSh0ZW1wKTsKKwkqdGVtcG5hbWUgPSBOVUxMOworfQorCisvLyBPcGVuIGEgdGVtcG9yYXJ5IGZpbGUgdG8gY29weSBhbiBleGlzdGluZyBmaWxlIGludG8uCitzdGF0aWMKK2ludCBjb3B5X3RlbXBmaWxlKGludCBmZGluLCBjaGFyICpuYW1lLCBjaGFyICoqdGVtcG5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlpbnQgZmQ7CisKKwkqdGVtcG5hbWUgPSB4YXNwcmludGYoIiVzWFhYWFhYIiwgbmFtZSk7CisJZmQgPSBta3N0ZW1wKCp0ZW1wbmFtZSk7CisJaWYoLTEgPT0gZmQpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibm8gdGVtcCBmaWxlIik7CisKKwkvLyBTZXQgcGVybWlzc2lvbnMgb2Ygb3V0cHV0IGZpbGUKKwlmc3RhdChmZGluLCAmc3RhdGJ1Zik7CisJZmNobW9kKGZkLCBzdGF0YnVmLnN0X21vZGUpOworCisJcmV0dXJuIGZkOworfQorCisvLyBBYm9ydCB0aGUgY29weSBhbmQgZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZS4KK3N0YXRpYwordm9pZCBkZWxldGVfdGVtcGZpbGUoaW50IGZkaW4sIGludCBmZG91dCwgY2hhciAqKnRlbXBuYW1lKQoreworCWNsb3NlKGZkaW4pOworCWNsb3NlKGZkb3V0KTsKKwl1bmxpbmsoKnRlbXBuYW1lKTsKKwlmcmVlKCp0ZW1wbmFtZSk7CisJKnRlbXBuYW1lID0gTlVMTDsKK30KKworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICppbmZpbGU7CisJbG9uZyBwcmVmaXg7CisKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmN1cnJlbnRfaHVuazsKKwlsb25nIG9sZGxpbmUsIG9sZGxlbiwgbmV3bGluZSwgbmV3bGVuLCBsaW5lbnVtOworCWludCBjb250ZXh0LCBzdGF0ZSwgZmlsZWluLCBmaWxlb3V0LCBmaWxlcGF0Y2gsIGh1bmtudW07CisJY2hhciAqdGVtcG5hbWU7CisKKwkvLyB3YXMgdG95cy5mb286CisJaW50IGV4aXR2YWw7Cit9OworI2RlZmluZSBUVCAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX1RUKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKFRUKSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8vYmJveCBoYWQ6ICJwOmk6Uk4iCisjZGVmaW5lIEZMQUdfU1RSICJSdXA6aTp4IgorLyogRkxBR19SRVZFUlNFIG11c3QgYmUgPT0gMSEgQ29kZSB1c2VzIHRoaXMgZmFjdC4gKi8KKyNkZWZpbmUgRkxBR19SRVZFUlNFICgxIDw8IDApCisjZGVmaW5lIEZMQUdfdSAgICAgICAoMSA8PCAxKQorI2RlZmluZSBGTEFHX1BBVEhMRU4gKDEgPDwgMikKKyNkZWZpbmUgRkxBR19JTlBVVCAgICgxIDw8IDMpCisvL25vbi1zdGFuZGFyZDoKKyNkZWZpbmUgRkxBR19ERUJVRyAgICgxIDw8IDQpCisKKy8vIERpc3Bvc2Ugb2YgYSBsaW5lIG9mIGlucHV0LCBlaXRoZXIgYnkgd3JpdGluZyBpdCBvdXQgb3IgZGlzY2FyZGluZyBpdC4KKworLy8gc3RhdGUgPCAyOiBqdXN0IGZyZWUKKy8vIHN0YXRlID0gMjogd3JpdGUgd2hvbGUgbGluZSB0byBzdGRlcnIKKy8vIHN0YXRlID0gMzogd3JpdGUgd2hvbGUgbGluZSB0byBmaWxlb3V0CisvLyBzdGF0ZSA+IDM6IHdyaXRlIGxpbmUrMSB0byBmaWxlb3V0IHdoZW4gKmxpbmUgIT0gc3RhdGUKKworI2RlZmluZSBQQVRDSF9ERUJVRyAob3B0aW9uX21hc2szMiAmIEZMQUdfREVCVUcpCisKK3N0YXRpYyB2b2lkIGRvX2xpbmUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmRsaXN0ID0gKHN0cnVjdCBkb3VibGVfbGlzdCAqKWRhdGE7CisKKwlpZiAoVFQuc3RhdGU+MSAmJiAqZGxpc3QtPmRhdGEgIT0gVFQuc3RhdGUpCisJCWZkcHJpbnRmKFRULnN0YXRlID09IDIgPyAyIDogVFQuZmlsZW91dCwKKwkJCSIlc1xuIiwgZGxpc3QtPmRhdGErKFRULnN0YXRlPjMgPyAxIDogMCkpOworCisJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiRE8gJWQ6ICVzXG4iLCBUVC5zdGF0ZSwgZGxpc3QtPmRhdGEpOworCisJZnJlZShkbGlzdC0+ZGF0YSk7CisJZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX29sZGZpbGUodm9pZCkKK3sKKwlpZiAoVFQudGVtcG5hbWUpIHJlcGxhY2VfdGVtcGZpbGUoVFQuZmlsZWluLCBUVC5maWxlb3V0LCAmVFQudGVtcG5hbWUpOworCVRULmZpbGVvdXQgPSBUVC5maWxlaW4gPSAtMTsKK30KKworc3RhdGljIHZvaWQgZmFpbF9odW5rKHZvaWQpCit7CisJaWYgKCFUVC5jdXJyZW50X2h1bmspIHJldHVybjsKKwlUVC5jdXJyZW50X2h1bmstPnByZXYtPm5leHQgPSAwOworCisJZmRwcmludGYoMiwgIkh1bmsgJWQgRkFJTEVEICVsZC8lbGQuXG4iLCBUVC5odW5rbnVtLCBUVC5vbGRsaW5lLCBUVC5uZXdsaW5lKTsKKwlUVC5leGl0dmFsID0gMTsKKworCS8vIElmIHdlIGdvdCB0byB0aGlzIHBvaW50LCB3ZSd2ZSBzZWVrZWQgdG8gdGhlIGVuZC4gIERpc2NhcmQgY2hhbmdlcyB0bworCS8vIHRoaXMgZmlsZSBhbmQgYWR2YW5jZSB0byBuZXh0IGZpbGUuCisKKwlUVC5zdGF0ZSA9IDI7CisJVE9ZX2xsaXN0X2ZyZWUoVFQuY3VycmVudF9odW5rLCBkb19saW5lKTsKKwlUVC5jdXJyZW50X2h1bmsgPSBOVUxMOworCWRlbGV0ZV90ZW1wZmlsZShUVC5maWxlaW4sIFRULmZpbGVvdXQsICZUVC50ZW1wbmFtZSk7CisJVFQuc3RhdGUgPSAwOworfQorCisvLyBHaXZlbiBhIGh1bmsgb2YgYSB1bmlmaWVkIGRpZmYsIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSB0byB0aGUgZmlsZS4KKy8vIFRoaXMgZG9lcyBub3QgdXNlIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IGluc3RlYWQgdHJlYXRzIGEgaHVuaworLy8gYXMgYSBzb3J0IG9mIHJlZ2V4LiAgQ29waWVzIGRhdGEgZnJvbSBpbnB1dCB0byBvdXRwdXQgdW50aWwgaXQgZmluZHMKKy8vIHRoZSBjaGFuZ2UgdG8gYmUgbWFkZSwgdGhlbiBvdXRwdXRzIHRoZSBjaGFuZ2VkIGRhdGEgYW5kIHJldHVybnMuCisvLyAoRmluZGluZyBFT0YgZmlyc3QgaXMgYW4gZXJyb3IuKSAgVGhpcyBpcyBhIHNpbmdsZSBwYXNzIG9wZXJhdGlvbiwgc28KKy8vIG11bHRpcGxlIGh1bmtzIG11c3Qgb2NjdXIgaW4gb3JkZXIgaW4gdGhlIGZpbGUuCisKK3N0YXRpYyBpbnQgYXBwbHlfb25lX2h1bmsodm9pZCkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKnBsaXN0LCAqYnVmID0gTlVMTCwgKmNoZWNrOworCWludCBtYXRjaGVvZiA9IDAsIHJldmVyc2UgPSBvcHRpb25fbWFzazMyICYgRkxBR19SRVZFUlNFLCBiYWNrd2FybiA9IDA7CisKKwkvLyBCcmVhayBkb3VibHkgbGlua2VkIGxpc3Qgc28gd2UgY2FuIHVzZSBzaW5nbHkgbGlua2VkIHRyYXZlcnNhbCBmdW5jdGlvbi4KKwlUVC5jdXJyZW50X2h1bmstPnByZXYtPm5leHQgPSBOVUxMOworCisJLy8gTWF0Y2ggRU9GIGlmIHRoZXJlIGFyZW4ndCBhcyBtYW55IGVuZGluZyBjb250ZXh0IGxpbmVzIGFzIGJlZ2lubmluZworCWZvciAocGxpc3QgPSBUVC5jdXJyZW50X2h1bms7IHBsaXN0OyBwbGlzdCA9IHBsaXN0LT5uZXh0KSB7CisJCWlmIChwbGlzdC0+ZGF0YVswXT09JyAnKSBtYXRjaGVvZisrOworCQllbHNlIG1hdGNoZW9mID0gMDsKKwkJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiSFVOSzolc1xuIiwgcGxpc3QtPmRhdGEpOworCX0KKwltYXRjaGVvZiA9IG1hdGNoZW9mIDwgVFQuY29udGV4dDsKKworCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwiTUFUQ0hFT0Y9JWNcbiIsIG1hdGNoZW9mID8gJ1knIDogJ04nKTsKKworCS8vIExvb3AgdGhyb3VnaCBpbnB1dCBkYXRhIHNlYXJjaGluZyBmb3IgdGhpcyBodW5rLiAgTWF0Y2ggYWxsIGNvbnRleHQKKwkvLyBsaW5lcyBhbmQgYWxsIGxpbmVzIHRvIGJlIHJlbW92ZWQgdW50aWwgd2UndmUgZm91bmQgdGhlIGVuZCBvZiBhCisJLy8gY29tcGxldGUgaHVuay4KKwlwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsKKwlidWYgPSBOVUxMOworCWlmIChUVC5jb250ZXh0KSBmb3IgKDs7KSB7CisJCWNoYXIgKmRhdGEgPSBnZXRfbGluZShUVC5maWxlaW4pOworCisJCVRULmxpbmVudW0rKzsKKworCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGxpbmUgb2YgaHVuayB0byBjb21wYXJlIHdpdGggbmV4dC4gIChTa2lwIGxpbmVzCisJCS8vIG9mIHRoZSBodW5rIHdlJ2QgYmUgYWRkaW5nLikKKwkJd2hpbGUgKHBsaXN0ICYmICpwbGlzdC0+ZGF0YSA9PSAiKy0iW3JldmVyc2VdKSB7CisJCQlpZiAoZGF0YSAmJiAhc3RyY21wKGRhdGEsIHBsaXN0LT5kYXRhKzEpKSB7CisJCQkJaWYgKCFiYWNrd2FybikgeworCQkJCQlmZHByaW50ZigyLCJQb3NzaWJseSByZXZlcnNlZCBodW5rICVkIGF0ICVsZFxuIiwKKwkJCQkJCVRULmh1bmtudW0sIFRULmxpbmVudW0pOworCQkJCQliYWNrd2FybisrOworCQkJCX0KKwkJCX0KKwkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CisJCX0KKworCQkvLyBJcyB0aGlzIEVPRj8KKwkJaWYgKCFkYXRhKSB7CisJCQlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJJTkVPRlxuIik7CisKKwkJCS8vIERvZXMgdGhpcyBodW5rIG5lZWQgdG8gbWF0Y2ggRU9GPworCQkJaWYgKCFwbGlzdCAmJiBtYXRjaGVvZikgYnJlYWs7CisKKwkJCS8vIEZpbGUgZW5kZWQgYmVmb3JlIHdlIGZvdW5kIGEgcGxhY2UgZm9yIHRoaXMgaHVuay4KKwkJCWZhaWxfaHVuaygpOworCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiSU46ICVzXG4iLCBkYXRhKTsKKwkJY2hlY2sgPSBkbGlzdF9hZGQoJmJ1ZiwgZGF0YSk7CisKKwkJLy8gQ29tcGFyZSB0aGlzIGxpbmUgd2l0aCBuZXh0IGV4cGVjdGVkIGxpbmUgb2YgaHVuay4KKwkJLy8gdG9kbzogdGVhY2ggdGhlIHN0cmNtcCgpIHRvIGlnbm9yZSB3aGl0ZXNwYWNlLgorCisJCS8vIEEgbWF0Y2ggY2FuIGZhaWwgYmVjYXVzZSB0aGUgbmV4dCBsaW5lIGRvZXNuJ3QgbWF0Y2gsIG9yIGJlY2F1c2UKKwkJLy8gd2UgaGl0IHRoZSBlbmQgb2YgYSBodW5rIHRoYXQgbmVlZGVkIEVPRiwgYW5kIHRoaXMgaXNuJ3QgRU9GLgorCisJCS8vIElmIG1hdGNoIGZhaWxlZCwgZmx1c2ggZmlyc3QgbGluZSBvZiBidWZmZXJlZCBkYXRhIGFuZAorCQkvLyByZWNoZWNrIGJ1ZmZlcmVkIGRhdGEgZm9yIGEgbmV3IG1hdGNoIHVudGlsIHdlIGZpbmQgb25lIG9yIHJ1bgorCQkvLyBvdXQgb2YgYnVmZmVyLgorCisJCWZvciAoOzspIHsKKwkJCWlmICghcGxpc3QgfHwgc3RyY21wKGNoZWNrLT5kYXRhLCBwbGlzdC0+ZGF0YSsxKSkgeworCQkJCS8vIE1hdGNoIGZhaWxlZC4gIFdyaXRlIG91dCBmaXJzdCBsaW5lIG9mIGJ1ZmZlcmVkIGRhdGEgYW5kCisJCQkJLy8gcmVjaGVjayByZW1haW5pbmcgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2guCisKKwkJCQlpZiAoUEFUQ0hfREVCVUcpCisJCQkJCWZkcHJpbnRmKDIsICJOT1Q6ICVzXG4iLCBwbGlzdC0+ZGF0YSk7CisKKwkJCQlUVC5zdGF0ZSA9IDM7CisJCQkJY2hlY2sgPSBUT1lfbGxpc3RfcG9wKCZidWYpOworCQkJCWNoZWNrLT5wcmV2LT5uZXh0ID0gYnVmOworCQkJCWJ1Zi0+cHJldiA9IGNoZWNrLT5wcmV2OworCQkJCWRvX2xpbmUoY2hlY2spOworCQkJCXBsaXN0ID0gVFQuY3VycmVudF9odW5rOworCisJCQkJLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2l0aG91dCBjb25maXJtaW5nIGEKKwkJCQkvLyBtYXRjaCwgcmVhZCBtb3JlIGxpbmVzLgorCQkJCWlmIChjaGVjaz09YnVmKSB7CisJCQkJCWJ1ZiA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljaGVjayA9IGJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKFBBVENIX0RFQlVHKQorCQkJCQlmZHByaW50ZigyLCAiTUFZQkU6ICVzXG4iLCBwbGlzdC0+ZGF0YSk7CisJCQkJLy8gVGhpcyBsaW5lIG1hdGNoZXMuICBBZHZhbmNlIHBsaXN0LCBkZXRlY3Qgc3VjY2Vzc2Z1bCBtYXRjaC4KKwkJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OworCQkJCWlmICghcGxpc3QgJiYgIW1hdGNoZW9mKSBnb3RvIG91dDsKKwkJCQljaGVjayA9IGNoZWNrLT5uZXh0OworCQkJCWlmIChjaGVjayA9PSBidWYpIGJyZWFrOworCQkJfQorCQl9CisJfQorb3V0OgorCS8vIFdlIGhhdmUgYSBtYXRjaC4gIEVtaXQgY2hhbmdlZCBkYXRhLgorCVRULnN0YXRlID0gIi0rIltyZXZlcnNlXTsKKwlUT1lfbGxpc3RfZnJlZShUVC5jdXJyZW50X2h1bmssIGRvX2xpbmUpOworCVRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisJVFQuc3RhdGUgPSAxOworZG9uZToKKwlpZiAoYnVmKSB7CisJCWJ1Zi0+cHJldi0+bmV4dCA9IE5VTEw7CisJCVRPWV9sbGlzdF9mcmVlKGJ1ZiwgZG9fbGluZSk7CisJfQorCisJcmV0dXJuIFRULnN0YXRlOworfQorCisvLyBSZWFkIGEgcGF0Y2ggZmlsZSBhbmQgZmluZCBodW5rcywgb3BlbmluZy9jcmVhdGluZy9kZWxldGluZyBmaWxlcy4KKy8vIENhbGwgYXBwbHlfb25lX2h1bmsoKSBvbiBlYWNoIGh1bmsuCisKKy8vIHN0YXRlIDA6IE5vdCBpbiBhIGh1bmssIGxvb2sgZm9yICsrKy4KKy8vIHN0YXRlIDE6IEZvdW5kICsrKyBmaWxlIGluZGljYXRvciwgbG9vayBmb3IgQEAKKy8vIHN0YXRlIDI6IEluIGh1bms6IGNvdW50aW5nIGluaXRpYWwgY29udGV4dCBsaW5lcworLy8gc3RhdGUgMzogSW4gaHVuazogZ2V0dGluZyBib2R5CisKK2ludCBwYXRjaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGF0Y2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBvcHRzOworCWludCByZXZlcnNlLCBzdGF0ZSA9IDA7CisJY2hhciAqb2xkbmFtZSA9IE5VTEwsICpuZXduYW1lID0gTlVMTDsKKwljaGFyICpvcHRfcCwgKm9wdF9pOworCisJSU5JVF9UVCgpOworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIEZMQUdfU1RSLCAmb3B0X3AsICZvcHRfaSk7CisJcmV2ZXJzZSA9IG9wdHMgJiBGTEFHX1JFVkVSU0U7CisJVFQucHJlZml4ID0gKG9wdHMgJiBGTEFHX1BBVEhMRU4pID8geGF0b2kob3B0X3ApIDogMDsgLy8gY2FuIGJlIG5lZ2F0aXZlIQorCWlmIChvcHRzICYgRkxBR19JTlBVVCkgVFQuZmlsZXBhdGNoID0geG9wZW4ob3B0X2ksIE9fUkRPTkxZKTsKKwlUVC5maWxlaW4gPSBUVC5maWxlb3V0ID0gLTE7CisKKwkvLyBMb29wIHRocm91Z2ggdGhlIGxpbmVzIGluIHRoZSBwYXRjaAorCWZvcig7OykgeworCQljaGFyICpwYXRjaGxpbmU7CisKKwkJcGF0Y2hsaW5lID0gZ2V0X2xpbmUoVFQuZmlsZXBhdGNoKTsKKwkJaWYgKCFwYXRjaGxpbmUpIGJyZWFrOworCisJCS8vIE90aGVyIHZlcnNpb25zIG9mIHBhdGNoIGFjY2VwdCBkYW1hZ2VkIHBhdGNoZXMsCisJCS8vIHNvIHdlIG5lZWQgdG8gYWxzby4KKwkJaWYgKCEqcGF0Y2hsaW5lKSB7CisJCQlmcmVlKHBhdGNobGluZSk7CisJCQlwYXRjaGxpbmUgPSB4c3RyZHVwKCIgIik7CisJCX0KKworCQkvLyBBcmUgd2UgYXNzZW1ibGluZyBhIGh1bms/CisJCWlmIChzdGF0ZSA+PSAyKSB7CisJCQlpZiAoKnBhdGNobGluZT09JyAnIHx8ICpwYXRjaGxpbmU9PScrJyB8fCAqcGF0Y2hsaW5lPT0nLScpIHsKKwkJCQlkbGlzdF9hZGQoJlRULmN1cnJlbnRfaHVuaywgcGF0Y2hsaW5lKTsKKworCQkJCWlmICgqcGF0Y2hsaW5lICE9ICcrJykgVFQub2xkbGVuLS07CisJCQkJaWYgKCpwYXRjaGxpbmUgIT0gJy0nKSBUVC5uZXdsZW4tLTsKKworCQkJCS8vIENvbnRleHQgbGluZT8KKwkJCQlpZiAoKnBhdGNobGluZT09JyAnICYmIHN0YXRlPT0yKSBUVC5jb250ZXh0Kys7CisJCQkJZWxzZSBzdGF0ZT0zOworCisJCQkJLy8gSWYgd2UndmUgY29uc3VtZWQgYWxsIGV4cGVjdGVkIGh1bmsgbGluZXMsIGFwcGx5IHRoZSBodW5rLgorCisJCQkJaWYgKCFUVC5vbGRsZW4gJiYgIVRULm5ld2xlbikgc3RhdGUgPSBhcHBseV9vbmVfaHVuaygpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZmFpbF9odW5rKCk7CisJCQlzdGF0ZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIE9wZW4gYSBuZXcgZmlsZT8KKwkJaWYgKCFzdHJuY21wKCItLS0gIiwgcGF0Y2hsaW5lLCA0KSB8fCAhc3RybmNtcCgiKysrICIsIHBhdGNobGluZSwgNCkpIHsKKwkJCWNoYXIgKnMsICoqbmFtZSA9IHJldmVyc2UgPyAmbmV3bmFtZSA6ICZvbGRuYW1lOworCQkJaW50IGk7CisKKwkJCWlmICgqcGF0Y2hsaW5lID09ICcrJykgeworCQkJCW5hbWUgPSByZXZlcnNlID8gJm9sZG5hbWUgOiAmbmV3bmFtZTsKKwkJCQlzdGF0ZSA9IDE7CisJCQl9CisKKwkJCWZyZWUoKm5hbWUpOworCQkJZmluaXNoX29sZGZpbGUoKTsKKworCQkJLy8gVHJpbSBkYXRlIGZyb20gZW5kIG9mIGZpbGVuYW1lIChpZiBhbnkpLiAgV2UgZG9uJ3QgY2FyZS4KKwkJCWZvciAocyA9IHBhdGNobGluZSs0OyAqcyAmJiAqcyE9J1x0JzsgcysrKQorCQkJCWlmICgqcz09J1xcJyAmJiBzWzFdKSBzKys7CisJCQlpID0gYXRvaShzKTsKKwkJCWlmIChpPjE5MDAgJiYgaTw9MTk3MCkKKwkJCQkqbmFtZSA9IHhzdHJkdXAoIi9kZXYvbnVsbCIpOworCQkJZWxzZSB7CisJCQkJKnMgPSAwOworCQkJCSpuYW1lID0geHN0cmR1cChwYXRjaGxpbmUrNCk7CisJCQl9CisKKwkJCS8vIFdlIGRlZmVyIGFjdHVhbGx5IG9wZW5pbmcgdGhlIGZpbGUgYmVjYXVzZSBzdm4gcHJvZHVjZXMgYnJva2VuCisJCQkvLyBwYXRjaGVzIHRoYXQgZG9uJ3Qgc2lnbmFsIHRoZXkgd2FudCB0byBjcmVhdGUgYSBuZXcgZmlsZSB0aGUKKwkJCS8vIHdheSB0aGUgcGF0Y2ggbWFuIHBhZ2Ugc2F5cywgc28geW91IGhhdmUgdG8gcmVhZCB0aGUgZmlyc3QgaHVuaworCQkJLy8gYW5kIF9ndWVzc18uCisKKwkJLy8gU3RhcnQgYSBuZXcgaHVuaz8KKwkJfSBlbHNlIGlmIChzdGF0ZSA9PSAxICYmICFzdHJuY21wKCJAQCAtIiwgcGF0Y2hsaW5lLCA0KSkgeworCQkJaW50IGk7CisKKwkJCWkgPSBzc2NhbmYocGF0Y2hsaW5lKzQsICIlbGQsJWxkICslbGQsJWxkIiwgJlRULm9sZGxpbmUsCisJCQkJCQkmVFQub2xkbGVuLCAmVFQubmV3bGluZSwgJlRULm5ld2xlbik7CisJCQlpZiAoaSAhPSA0KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb3JydXB0IGh1bmsgJWQgYXQgJWxkIiwgVFQuaHVua251bSwgVFQubGluZW51bSk7CisKKwkJCVRULmNvbnRleHQgPSAwOworCQkJc3RhdGUgPSAyOworCisJCQkvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBodW5rLCBvcGVuIHRoZSBmaWxlLgorCQkJaWYgKFRULmZpbGVpbiA9PSAtMSkgeworCQkJCWludCBvbGRzdW0sIG5ld3N1bSwgZGVsID0gMDsKKwkJCQljaGFyICpzLCAqbmFtZTsKKworCQkJCW9sZHN1bSA9IFRULm9sZGxpbmUgKyBUVC5vbGRsZW47CisJCQkJbmV3c3VtID0gVFQubmV3bGluZSArIFRULm5ld2xlbjsKKworCQkJCW5hbWUgPSByZXZlcnNlID8gb2xkbmFtZSA6IG5ld25hbWU7CisKKwkJCQkvLyBXZSdyZSBkZWxldGluZyBvbGRuYW1lIGlmIG5ldyBmaWxlIGlzIC9kZXYvbnVsbCAoYmVmb3JlIC1wKQorCQkJCS8vIG9yIGlmIG5ldyBodW5rIGlzIGVtcHR5ICh6ZXJvIGNvbnRleHQpIGFmdGVyIHBhdGNoaW5nCisJCQkJaWYgKCFzdHJjbXAobmFtZSwgIi9kZXYvbnVsbCIpIHx8ICEocmV2ZXJzZSA/IG9sZHN1bSA6IG5ld3N1bSkpCisJCQkJeworCQkJCQluYW1lID0gcmV2ZXJzZSA/IG5ld25hbWUgOiBvbGRuYW1lOworCQkJCQlkZWwrKzsKKwkJCQl9CisKKwkJCQkvLyBoYW5kbGUgLXAgcGF0aCB0cnVuY2F0aW9uLgorCQkJCWZvciAoaT0wLCBzID0gbmFtZTsgKnM7KSB7CisJCQkJCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUdfUEFUSExFTikgJiYgVFQucHJlZml4ID09IGkpIGJyZWFrOworCQkJCQlpZiAoKihzKyspPT0nLycpIHsKKwkJCQkJCW5hbWUgPSBzOworCQkJCQkJaSsrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGRlbCkgeworCQkJCQlwcmludGYoInJlbW92aW5nICVzXG4iLCBuYW1lKTsKKwkJCQkJeHVubGluayhuYW1lKTsKKwkJCQkJc3RhdGUgPSAwOworCQkJCS8vIElmIHdlJ3ZlIGdvdCBhIGZpbGUgdG8gb3BlbiwgZG8gc28uCisJCQkJfSBlbHNlIGlmICghKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1BBVEhMRU4pIHx8IGkgPD0gVFQucHJlZml4KSB7CisJCQkJCS8vIElmIHRoZSBvbGQgZmlsZSB3YXMgbnVsbCwgd2UncmUgY3JlYXRpbmcgYSBuZXcgb25lLgorCQkJCQlpZiAoIXN0cmNtcChvbGRuYW1lLCAiL2Rldi9udWxsIikgfHwgIW9sZHN1bSkgeworCQkJCQkJcHJpbnRmKCJjcmVhdGluZyAlc1xuIiwgbmFtZSk7CisJCQkJCQlzID0gc3RycmNocihuYW1lLCAnLycpOworCQkJCQkJaWYgKHMpIHsKKwkJCQkJCQkqcyA9IDA7CisJCQkJCQkJeG1rcGF0aChuYW1lLCAtMSk7CisJCQkJCQkJKnMgPSAnLyc7CisJCQkJCQl9CisJCQkJCQlUVC5maWxlaW4gPSB4b3BlbihuYW1lLCBPX0NSRUFUfE9fRVhDTHxPX1JEV1IpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRmKCJwYXRjaGluZyBmaWxlICVzXG4iLCBuYW1lKTsKKwkJCQkJCVRULmZpbGVpbiA9IHhvcGVuKG5hbWUsIE9fUkRXUik7CisJCQkJCX0KKwkJCQkJVFQuZmlsZW91dCA9IGNvcHlfdGVtcGZpbGUoVFQuZmlsZWluLCBuYW1lLCAmVFQudGVtcG5hbWUpOworCQkJCQlUVC5saW5lbnVtID0gMDsKKwkJCQkJVFQuaHVua251bSA9IDA7CisJCQkJfQorCQkJfQorCisJCQlUVC5odW5rbnVtKys7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gSWYgd2UgZGlkbid0IGNvbnRpbnVlIGFib3ZlLCBkaXNjYXJkIHRoaXMgbGluZS4KKwkJZnJlZShwYXRjaGxpbmUpOworCX0KKworCWZpbmlzaF9vbGRmaWxlKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoVFQuZmlsZXBhdGNoKTsKKwkJZnJlZShvbGRuYW1lKTsKKwkJZnJlZShuZXduYW1lKTsKKwl9CisKKwlyZXR1cm4gVFQuZXhpdHZhbDsKK30KZGlmZiAtLWdpdCBhL2VkaXRvcnMvc2VkLmMgYi9lZGl0b3JzL3NlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTJjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL3NlZC5jCkBAIC0wLDAgKzEsMTQ4MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2VkLmMgLSB2ZXJ5IG1pbmltYWxpc3QgdmVyc2lvbiBvZiBzZWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IExpbmVvLCBpbmMuIGFuZCBNYXJrIFdoaXRsZXkKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTWFyayBXaGl0bGV5IDxtYXJrd0Bjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIE1hdHQgS3JhYWkKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBHbGVubiBNY0dyYXRoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwNCBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIE1BSU5UQUlORVI6IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBDb2RlIG92ZXJ2aWV3LgorICoKKyAqIEZpbGVzIGFyZSBsYWlkIG91dCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuICBTbyBmb3IKKyAqIGV4YW1wbGUsIGV2ZXJ5IGZ1bmN0aW9uIGFkZF9jbWQgY2FsbHMgb2NjdXJzIGJlZm9yZSBhZGRfY21kIGluIHRoaXMgZmlsZS4KKyAqCisgKiBhZGRfY21kKCkgaXMgY2FsbGVkIG9uIGVhY2ggbGluZSBvZiBzZWQgY29tbWFuZCB0ZXh0IChmcm9tIGEgZmlsZSBvciBmcm9tCisgKiB0aGUgY29tbWFuZCBsaW5lKS4gIEl0IGNhbGxzIGdldF9hZGRyZXNzKCkgYW5kIHBhcnNlX2NtZF9hcmdzKCkuICBUaGUKKyAqIHJlc3VsdGluZyBzZWRfY21kX3Qgc3RydWN0dXJlcyBhcmUgYXBwZW5kZWQgdG8gYSBsaW5rZWQgbGlzdAorICogKEcuc2VkX2NtZF9oZWFkL0cuc2VkX2NtZF90YWlsKS4KKyAqCisgKiBhZGRfaW5wdXRfZmlsZSgpIGFkZHMgYSBGSUxFKiB0byB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcy4gIFdlIG5lZWQgdG8KKyAqIGtub3cgYWxsIGlucHV0IHNvdXJjZXMgYWhlYWQgb2YgdGltZSB0byBmaW5kIHRoZSBsYXN0IGxpbmUgZm9yIHRoZSAkIG1hdGNoLgorICoKKyAqIHByb2Nlc3NfZmlsZXMoKSBkb2VzIGFjdHVhbCBzZWRkaW5nLCByZWFkaW5nIGRhdGEgbGluZXMgZnJvbSBlYWNoIGlucHV0IEZJTEUgKgorICogKHdoaWNoIGNvdWxkIGJlIHN0ZGluKSBhbmQgYXBwbHlpbmcgdGhlIHNlZCBjb21tYW5kIGxpc3QgKHNlZF9jbWRfaGVhZCkgdG8KKyAqIGVhY2ggb2YgdGhlIHJlc3VsdGluZyBsaW5lcy4KKyAqCisgKiBzZWRfbWFpbigpIGlzIHdoZXJlIGV4dGVybmFsIGNvZGUgY2FsbHMgaW50byB0aGlzLCB3aXRoIGEgY29tbWFuZCBsaW5lLgorICovCisKKy8qIFN1cHBvcnRlZCBmZWF0dXJlcyBhbmQgY29tbWFuZHMgaW4gdGhpcyB2ZXJzaW9uIG9mIHNlZDoKKyAqCisgKiAtIGNvbW1lbnRzICgnIycpCisgKiAtIGFkZHJlc3MgbWF0Y2hpbmc6IG51bXwvbWF0Y2hzdHIvWyxudW18L21hdGNoc3RyL3wkXWNvbW1hbmQKKyAqIC0gY29tbWFuZHM6IChwKXJpbnQsIChkKWVsZXRlLCAocyl1YnN0aXR1ZSAod2l0aCBnICYgSSBmbGFncykKKyAqIC0gZWRpdCBjb21tYW5kczogKGEpcHBlbmQsIChpKW5zZXJ0LCAoYyloYW5nZQorICogLSBmaWxlIGNvbW1hbmRzOiAocillYWQKKyAqIC0gYmFja3JlZmVyZW5jZXMgaW4gc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25zIChcMCwgXDEsIFwyLi4uXDkpCisgKiAtIGdyb3VwZWQgY29tbWFuZHM6IHtjbWQxO2NtZDJ9CisgKiAtIHRyYW5zbGl0ZXJhdGlvbiAoeS9zb3VyY2UtY2hhcnMvZGVzdC1jaGFycy8pCisgKiAtIHBhdHRlcm4gc3BhY2UgaG9sZCBzcGFjZSBzdG9yaW5nIC8gc3dhcHBpbmcgKGcsIGgsIHgpCisgKiAtIGxhYmVscyAvIGJyYW5jaGluZyAoOiBsYWJlbCwgYiwgdCwgVCkKKyAqCisgKiAoTm90ZTogU3BlY2lmeWluZyBhbiBhZGRyZXNzIChyYW5nZSkgdG8gbWF0Y2ggaXMgKm9wdGlvbmFsKjsgY29tbWFuZHMKKyAqIGRlZmF1bHQgdG8gdGhlIHdob2xlIHBhdHRlcm4gc3BhY2UgaWYgbm8gc3BlY2lmaWMgYWRkcmVzcyBtYXRjaCB3YXMKKyAqIHJlcXVlc3RlZC4pCisgKgorICogVG9kbzoKKyAqIC0gQ3JlYXRlIGEgd3JhcHBlciBhcm91bmQgcmVnZXggdG8gbWFrZSBsaWJjJ3MgcmVnZXggY29uZm9ybSB3aXRoIHNlZAorICoKKyAqIFJlZmVyZW5jZSBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3NlZC5odG1sCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNlZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1lZmlucl0gU0VEX0NNRCBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2VkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1lIENNRAlBZGQgQ01EIHRvIHNlZCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlBZGQgRklMRSBjb250ZW50cyB0byBzZWQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1pCUVkaXQgZmlsZXMgaW4tcGxhY2UgKGVsc2Ugc2VuZHMgcmVzdWx0IHRvIHN0ZG91dCkiCisvL3VzYWdlOiAgICAgIlxuCS1uCVN1cHByZXNzIGF1dG9tYXRpYyBwcmludGluZyBvZiBwYXR0ZXJuIHNwYWNlIgorLy91c2FnZTogICAgICJcbgktcglVc2UgZXh0ZW5kZWQgcmVnZXggc3ludGF4IgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5JZiBubyAtZSBvciAtZiwgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQgaXMgdGhlIHNlZCBjb21tYW5kIHN0cmluZy4iCisvL3VzYWdlOiAgICAgIlxuUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgaW5wdXQgZmlsZXMgKHN0ZGluIGlmIG5vbmUpLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2VkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gXCJmb29cIiB8IHNlZCAtZSAncy9mW2EtekEtWl1vL2Jhci9nJ1xuIgorLy91c2FnZTogICAgICAgImJhclxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworI2lmIDAKKyMgZGVmaW5lIGRiZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBkYmcoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKK2VudW0geworCU9QVF9pbl9wbGFjZSA9IDEgPDwgMCwKK307CisKKy8qIEVhY2ggc2VkIGNvbW1hbmQgdHVybnMgaW50byBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcy4gKi8KK3R5cGVkZWYgc3RydWN0IHNlZF9jbWRfcyB7CisJLyogT3JkZXJlZCBieSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzOiBjdXJyZW50bHkgMzYgYnl0ZXMgb24geDg2ICovCisJc3RydWN0IHNlZF9jbWRfcyAqbmV4dDsgLyogTmV4dCBjb21tYW5kIChsaW5rZWQgbGlzdCwgTlVMTCB0ZXJtaW5hdGVkKSAqLworCisJLyogYWRkcmVzcyBzdG9yYWdlICovCisJcmVnZXhfdCAqYmVnX21hdGNoOyAgICAgLyogc2VkIC1lICcvbWF0Y2gvY21kJyAqLworCXJlZ2V4X3QgKmVuZF9tYXRjaDsgICAgIC8qIHNlZCAtZSAnL21hdGNoLywvZW5kX21hdGNoL2NtZCcgKi8KKwlyZWdleF90ICpzdWJfbWF0Y2g7ICAgICAvKiBGb3IgJ3Mvc3ViX21hdGNoL3N0cmluZy8nICovCisJaW50IGJlZ19saW5lOyAgICAgICAgICAgLyogJ3NlZCAxcCcgICAwID09IGFwcGx5IGNvbW1hbmRzIHRvIGFsbCBsaW5lcyAqLworCWludCBiZWdfbGluZV9vcmlnOyAgICAgIC8qIGNvcHkgb2YgdGhlIGFib3ZlLCBuZWVkZWQgZm9yIC1pICovCisJaW50IGVuZF9saW5lOyAgICAgICAgICAgLyogJ3NlZCAxLDNwJyAwID09IG9uZSBsaW5lIG9ubHkuIC0xID0gbGFzdCBsaW5lICgkKSAqLworCisJRklMRSAqc3dfZmlsZTsgICAgICAgICAgLyogRmlsZSAoc3cpIGNvbW1hbmQgd3JpdGVzIHRvLCAtMSBmb3Igbm9uZS4gKi8KKwljaGFyICpzdHJpbmc7ICAgICAgICAgICAvKiBEYXRhIHN0cmluZyBmb3IgKHNhaWN5dGIpIGNvbW1hbmRzLiAqLworCisJdW5zaWduZWQgd2hpY2hfbWF0Y2g7ICAgLyogKHMpIFdoaWNoIG1hdGNoIHRvIHJlcGxhY2UgKDAgZm9yIGFsbCkgKi8KKworCS8qIEJpdGZpZWxkcyAoZ2NjIHdvbid0IGdyb3VwIHRoZW0gaWYgd2UgZG9uJ3QpICovCisJdW5zaWduZWQgaW52ZXJ0OjE7ICAgICAgLyogdGhlICchJyBhZnRlciB0aGUgYWRkcmVzcyAqLworCXVuc2lnbmVkIGluX21hdGNoOjE7ICAgIC8qIE5leHQgbGluZSBhbHNvIGluY2x1ZGVkIGluIG1hdGNoPyAqLworCXVuc2lnbmVkIHN1Yl9wOjE7ICAgICAgIC8qIChzKSBwcmludCBvcHRpb24gKi8KKworCWNoYXIgc3dfbGFzdF9jaGFyOyAgICAgIC8qIExhc3QgbGluZSB3cml0dGVuIGJ5IChzdykgaGFkIG5vICdcbicgKi8KKworCS8qIEdFTkVSQUwgRklFTERTICovCisJY2hhciBjbWQ7ICAgICAgICAgICAgICAgLyogVGhlIGNvbW1hbmQgY2hhcjogYWJjZERnR2hIaWxuTnBQcXJzdHd4eTo9e30gKi8KK30gc2VkX2NtZF90OworCitzdGF0aWMgY29uc3QgY2hhciBzZW1pY29sb25fd2hpdGVzcGFjZVtdIEFMSUdOMSA9ICI7IFxuXHJcdFx2IjsKKworc3RydWN0IGdsb2JhbHMgeworCS8qIG9wdGlvbnMgKi8KKwlpbnQgYmVfcXVpZXQsIHJlZ2V4X3R5cGU7CisJRklMRSAqbm9uc3Rkb3V0OworCWNoYXIgKm91dG5hbWUsICpob2xkX3NwYWNlOworCisJLyogTGlzdCBvZiBpbnB1dCBmaWxlcyAqLworCWludCBpbnB1dF9maWxlX2NvdW50LCBjdXJyZW50X2lucHV0X2ZpbGU7CisJRklMRSAqKmlucHV0X2ZpbGVfbGlzdDsKKworCXJlZ21hdGNoX3QgcmVnbWF0Y2hbMTBdOworCXJlZ2V4X3QgKnByZXZpb3VzX3JlZ2V4X3B0cjsKKworCS8qIGxpbmtlZCBsaXN0IG9mIHNlZCBjb21tYW5kcyAqLworCXNlZF9jbWRfdCAqc2VkX2NtZF9oZWFkLCAqKnNlZF9jbWRfdGFpbDsKKworCS8qIExpbmtlZCBsaXN0IG9mIGFwcGVuZCBsaW5lcyAqLworCWxsaXN0X3QgKmFwcGVuZF9oZWFkOworCisJY2hhciAqYWRkX2NtZF9saW5lOworCisJc3RydWN0IHBpcGVsaW5lIHsKKwkJY2hhciAqYnVmOyAgLyogU3BhY2UgdG8gaG9sZCBzdHJpbmcgKi8KKwkJaW50IGlkeDsgICAgLyogU3BhY2UgdXNlZCAqLworCQlpbnQgbGVuOyAgICAvKiBTcGFjZSBhbGxvY2F0ZWQgKi8KKwl9IHBpcGVsaW5lOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK3N0cnVjdCBCVUdfR190b29fYmlnIHsKKwljaGFyIEJVR19HX3Rvb19iaWdbc2l6ZW9mKEcpIDw9IENPTU1PTl9CVUZTSVpFID8gMSA6IC0xXTsKK307CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcuc2VkX2NtZF90YWlsID0gJkcuc2VkX2NtZF9oZWFkOyBcCit9IHdoaWxlICgwKQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorc3RhdGljIHZvaWQgc2VkX2ZyZWVfYW5kX2Nsb3NlX3N0dWZmKHZvaWQpCit7CisJc2VkX2NtZF90ICpzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7CisKKwlsbGlzdF9mcmVlKEcuYXBwZW5kX2hlYWQsIGZyZWUpOworCisJd2hpbGUgKHNlZF9jbWQpIHsKKwkJc2VkX2NtZF90ICpzZWRfY21kX25leHQgPSBzZWRfY21kLT5uZXh0OworCisJCWlmIChzZWRfY21kLT5zd19maWxlKQorCQkJeHByaW50X2FuZF9jbG9zZV9maWxlKHNlZF9jbWQtPnN3X2ZpbGUpOworCisJCWlmIChzZWRfY21kLT5iZWdfbWF0Y2gpIHsKKwkJCXJlZ2ZyZWUoc2VkX2NtZC0+YmVnX21hdGNoKTsKKwkJCWZyZWUoc2VkX2NtZC0+YmVnX21hdGNoKTsKKwkJfQorCQlpZiAoc2VkX2NtZC0+ZW5kX21hdGNoKSB7CisJCQlyZWdmcmVlKHNlZF9jbWQtPmVuZF9tYXRjaCk7CisJCQlmcmVlKHNlZF9jbWQtPmVuZF9tYXRjaCk7CisJCX0KKwkJaWYgKHNlZF9jbWQtPnN1Yl9tYXRjaCkgeworCQkJcmVnZnJlZShzZWRfY21kLT5zdWJfbWF0Y2gpOworCQkJZnJlZShzZWRfY21kLT5zdWJfbWF0Y2gpOworCQl9CisJCWZyZWUoc2VkX2NtZC0+c3RyaW5nKTsKKwkJZnJlZShzZWRfY21kKTsKKwkJc2VkX2NtZCA9IHNlZF9jbWRfbmV4dDsKKwl9CisKKwlmcmVlKEcuaG9sZF9zcGFjZSk7CisKKwl3aGlsZSAoRy5jdXJyZW50X2lucHV0X2ZpbGUgPCBHLmlucHV0X2ZpbGVfY291bnQpCisJCWZjbG9zZShHLmlucHV0X2ZpbGVfbGlzdFtHLmN1cnJlbnRfaW5wdXRfZmlsZSsrXSk7Cit9CisjZWxzZQordm9pZCBzZWRfZnJlZV9hbmRfY2xvc2Vfc3R1ZmYodm9pZCk7CisjZW5kaWYKKworLyogSWYgc29tZXRoaW5nIGJhZCBoYXBwZW5zIGR1cmluZyAtaSBvcGVyYXRpb24sIGRlbGV0ZSB0ZW1wIGZpbGUgKi8KKworc3RhdGljIHZvaWQgY2xlYW51cF9vdXRuYW1lKHZvaWQpCit7CisJaWYgKEcub3V0bmFtZSkgdW5saW5rKEcub3V0bmFtZSk7Cit9CisKKy8qIHN0cmNweSwgcmVwbGFjaW5nICJcZnJvbSIgd2l0aCAndG8nLiBJZiB0byBpcyBOVUwsIHJlcGxhY2luZyAiXGFueSIgd2l0aCAnYW55JyAqLworCitzdGF0aWMgdm9pZCBwYXJzZV9lc2NhcGVzKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGxlbiwgY2hhciBmcm9tLCBjaGFyIHRvKQoreworCWludCBpID0gMDsKKworCXdoaWxlIChpIDwgbGVuKSB7CisJCWlmIChzdHJpbmdbaV0gPT0gJ1xcJykgeworCQkJaWYgKCF0byB8fCBzdHJpbmdbaSsxXSA9PSBmcm9tKSB7CisJCQkJKmRlc3QrKyA9IHRvID8gdG8gOiBzdHJpbmdbaSsxXTsKKwkJCQlpICs9IDI7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqZGVzdCsrID0gc3RyaW5nW2krK107CisJCX0KKwkJLyogVE9ETzogaXMgaXQgc2FmZSB3cnQgYSBzdHJpbmcgd2l0aCB0cmFpbGluZyAnXFwnID8gKi8KKwkJKmRlc3QrKyA9IHN0cmluZ1tpKytdOworCX0KKwkqZGVzdCA9ICdcMCc7Cit9CisKK3N0YXRpYyBjaGFyICpjb3B5X3BhcnNpbmdfZXNjYXBlcyhjb25zdCBjaGFyICpzdHJpbmcsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqczsKKwljaGFyICpkZXN0ID0geG1hbGxvYyhsZW4gKyAxKTsKKworCS8qIHNlZCByZWNvZ25pemVzIFxuICovCisJLyogR05VIHNlZCBhbHNvIHJlY29nbml6ZXMgXHQgYW5kIFxyICovCisJZm9yIChzID0gIlxublx0dFxyciI7ICpzOyBzICs9IDIpIHsKKwkJcGFyc2VfZXNjYXBlcyhkZXN0LCBzdHJpbmcsIGxlbiwgc1sxXSwgc1swXSk7CisJCXN0cmluZyA9IGRlc3Q7CisJCWxlbiA9IHN0cmxlbihkZXN0KTsKKwl9CisJcmV0dXJuIGRlc3Q7Cit9CisKKworLyoKKyAqIGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbSAtIHdhbGtzIGxlZnQgdG8gcmlnaHQgdGhyb3VnaCBhIHN0cmluZworICogYmVnaW5uaW5nIGF0IGEgc3BlY2lmaWVkIGluZGV4IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCByZWd1bGFyCisgKiBleHByZXNzaW9uIGRlbGltaXRlciAodHlwaWNhbGx5IGEgZm9yd2FyZCBzbGFzaCAoJy8nKSkgbm90IHByZWNlZGVkIGJ5CisgKiBhIGJhY2tzbGFzaCAoJ1wnKS4gIEEgbmVnYXRpdmUgZGVsaW1pdGVyIGRpc2FibGVzIHNxdWFyZSBicmFja2V0IGNoZWNraW5nLgorICovCitzdGF0aWMgaW50IGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbShpbnQgZGVsaW1pdGVyLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGJyYWNrZXQgPSAtMTsKKwlpbnQgZXNjYXBlZCA9IDA7CisJaW50IGlkeCA9IDA7CisJY2hhciBjaDsKKworCWlmIChkZWxpbWl0ZXIgPCAwKSB7CisJCWJyYWNrZXQtLTsKKwkJZGVsaW1pdGVyID0gLWRlbGltaXRlcjsKKwl9CisKKwlmb3IgKDsgKGNoID0gc3RyW2lkeF0pICE9ICdcMCc7IGlkeCsrKSB7CisJCWlmIChicmFja2V0ID49IDApIHsKKwkJCWlmIChjaCA9PSAnXScKKwkJCSAmJiAhKGJyYWNrZXQgPT0gaWR4IC0gMSB8fCAoYnJhY2tldCA9PSBpZHggLSAyICYmIHN0cltpZHggLSAxXSA9PSAnXicpKQorCQkJKSB7CisJCQkJYnJhY2tldCA9IC0xOworCQkJfQorCQl9IGVsc2UgaWYgKGVzY2FwZWQpCisJCQllc2NhcGVkID0gMDsKKwkJZWxzZSBpZiAoY2ggPT0gJ1xcJykKKwkJCWVzY2FwZWQgPSAxOworCQllbHNlIGlmIChicmFja2V0ID09IC0xICYmIGNoID09ICdbJykKKwkJCWJyYWNrZXQgPSBpZHg7CisJCWVsc2UgaWYgKGNoID09IGRlbGltaXRlcikKKwkJCXJldHVybiBpZHg7CisJfQorCisJLyogaWYgd2UgbWFrZSBpdCB0byBoZXJlLCB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVubWF0Y2hlZCAnJWMnIiwgZGVsaW1pdGVyKTsKK30KKworLyoKKyAqICBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdGhpcmQgZGVsaW1pdGVyCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcmVnZXhfZGVsaW0oY29uc3QgY2hhciAqY21kc3RyLCBjaGFyICoqbWF0Y2gsIGNoYXIgKipyZXBsYWNlKQoreworCWNvbnN0IGNoYXIgKmNtZHN0cl9wdHIgPSBjbWRzdHI7CisJY2hhciBkZWxpbWl0ZXI7CisJaW50IGlkeCA9IDA7CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgJ3MnIG9yICd5JyBpcyBmb2xsb3dlZCBieSBzb21ldGhpbmcuICBUaGF0IHNvbWV0aGluZworCSAqICh0eXBpY2FsbHkgYSAnc2xhc2gnKSBpcyBub3cgb3VyIHJlZ2V4cCBkZWxpbWl0ZXIuLi4gKi8KKwlpZiAoKmNtZHN0ciA9PSAnXDAnKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGZvcm1hdCBpbiBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbiIpOworCWRlbGltaXRlciA9ICpjbWRzdHJfcHRyKys7CisKKwkvKiBzYXZlIHRoZSBtYXRjaCBzdHJpbmcgKi8KKwlpZHggPSBpbmRleF9vZl9uZXh0X3VuZXNjYXBlZF9yZWdleHBfZGVsaW0oZGVsaW1pdGVyLCBjbWRzdHJfcHRyKTsKKwkqbWF0Y2ggPSBjb3B5X3BhcnNpbmdfZXNjYXBlcyhjbWRzdHJfcHRyLCBpZHgpOworCisJLyogc2F2ZSB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nICovCisJY21kc3RyX3B0ciArPSBpZHggKyAxOworCWlkeCA9IGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbSgtZGVsaW1pdGVyLCBjbWRzdHJfcHRyKTsKKwkqcmVwbGFjZSA9IGNvcHlfcGFyc2luZ19lc2NhcGVzKGNtZHN0cl9wdHIsIGlkeCk7CisKKwlyZXR1cm4gKChjbWRzdHJfcHRyIC0gY21kc3RyKSArIGlkeCk7Cit9CisKKy8qCisgKiByZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgc3RyaW5nIGp1c3QgcGFzdCB3aGVyZSB0aGUgYWRkcmVzcyBlbmRzLgorICovCitzdGF0aWMgaW50IGdldF9hZGRyZXNzKGNvbnN0IGNoYXIgKm15X3N0ciwgaW50ICpsaW5lbnVtLCByZWdleF90ICoqIHJlZ2V4KQoreworCWNvbnN0IGNoYXIgKnBvcyA9IG15X3N0cjsKKworCWlmIChpc2RpZ2l0KCpteV9zdHIpKSB7CisJCSpsaW5lbnVtID0gc3RydG9sKG15X3N0ciwgKGNoYXIqKikmcG9zLCAxMCk7CisJCS8qIGVuZHN0ciBzaG91bGRudCBldmVyIGVxdWFsIE5VTEwgKi8KKwl9IGVsc2UgaWYgKCpteV9zdHIgPT0gJyQnKSB7CisJCSpsaW5lbnVtID0gLTE7CisJCXBvcysrOworCX0gZWxzZSBpZiAoKm15X3N0ciA9PSAnLycgfHwgKm15X3N0ciA9PSAnXFwnKSB7CisJCWludCBuZXh0OworCQljaGFyIGRlbGltaXRlcjsKKwkJY2hhciAqdGVtcDsKKworCQlkZWxpbWl0ZXIgPSAnLyc7CisJCWlmICgqbXlfc3RyID09ICdcXCcpIGRlbGltaXRlciA9ICorK3BvczsKKwkJbmV4dCA9IGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbShkZWxpbWl0ZXIsICsrcG9zKTsKKwkJdGVtcCA9IGNvcHlfcGFyc2luZ19lc2NhcGVzKHBvcywgbmV4dCk7CisJCSpyZWdleCA9IHhtYWxsb2Moc2l6ZW9mKHJlZ2V4X3QpKTsKKwkJeHJlZ2NvbXAoKnJlZ2V4LCB0ZW1wLCBHLnJlZ2V4X3R5cGV8UkVHX05FV0xJTkUpOworCQlmcmVlKHRlbXApOworCQkvKiBNb3ZlIHBvc2l0aW9uIHRvIG5leHQgY2hhcmFjdGVyIGFmdGVyIGxhc3QgZGVsaW1pdGVyICovCisJCXBvcyArPSAobmV4dCsxKTsKKwl9CisJcmV0dXJuIHBvcyAtIG15X3N0cjsKK30KKworLyogR3JhYiBhIGZpbGVuYW1lLiAgV2hpdGVzcGFjZSBhdCBzdGFydCBpcyBza2lwcGVkLCB0aGVuIGdvZXMgdG8gRU9MLiAqLworc3RhdGljIGludCBwYXJzZV9maWxlX2NtZCgvKnNlZF9jbWRfdCAqc2VkX2NtZCwqLyBjb25zdCBjaGFyICpmaWxlY21kc3RyLCBjaGFyICoqcmV0dmFsKQoreworCWludCBzdGFydCA9IDAsIGlkeCwgaGFjayA9IDA7CisKKwkvKiBTa2lwIHdoaXRlc3BhY2UsIHRoZW4gZ3JhYiBmaWxlbmFtZSB0byBlbmQgb2YgbGluZSAqLworCXdoaWxlIChpc3NwYWNlKGZpbGVjbWRzdHJbc3RhcnRdKSkKKwkJc3RhcnQrKzsKKwlpZHggPSBzdGFydDsKKwl3aGlsZSAoZmlsZWNtZHN0cltpZHhdICYmIGZpbGVjbWRzdHJbaWR4XSAhPSAnXG4nKQorCQlpZHgrKzsKKworCS8qIElmIGxpbmVzIGdsdWVkIHRvZ2V0aGVyLCBwdXQgYmFja3NsYXNoIGJhY2suICovCisJaWYgKGZpbGVjbWRzdHJbaWR4XSA9PSAnXG4nKQorCQloYWNrID0gMTsKKwlpZiAoaWR4ID09IHN0YXJ0KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZW1wdHkgZmlsZW5hbWUiKTsKKwkqcmV0dmFsID0geHN0cm5kdXAoZmlsZWNtZHN0citzdGFydCwgaWR4LXN0YXJ0K2hhY2srMSk7CisJaWYgKGhhY2spCisJCSgqcmV0dmFsKVtpZHhdID0gJ1xcJzsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3Vic3RfY21kKHNlZF9jbWRfdCAqc2VkX2NtZCwgY29uc3QgY2hhciAqc3Vic3RyKQoreworCWludCBjZmxhZ3MgPSBHLnJlZ2V4X3R5cGU7CisJY2hhciAqbWF0Y2g7CisJaW50IGlkeDsKKworCS8qCisJICogQSBzdWJzdGl0dXRpb24gY29tbWFuZCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorCSAqICAgIHMvbWF0Y2gvcmVwbGFjZS8gI2dJcHcKKwkgKiAgICB8fCAgICAgfCAgICAgICAgfHx8CisJICogICAgbWFuZGF0b3J5ICAgICAgIG9wdGlvbmFsCisJICovCisJaWR4ID0gcGFyc2VfcmVnZXhfZGVsaW0oc3Vic3RyLCAmbWF0Y2gsICZzZWRfY21kLT5zdHJpbmcpOworCisJLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYmFjayByZWZlcmVuY2VzIGluIHRoZSBtYXRjaCBzdHJpbmcgKi8KKwkvKiBOb3RlOiB3ZSBjb21wdXRlIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZG9fc3Vic3RfY29tbWFuZCgpCisJICogZnVuY3Rpb24gdG8gc2F2ZSBwcm9jZXNzb3IgdGltZSwgYXQgdGhlIGV4cGVuc2Ugb2YgYSBsaXR0bGUgbW9yZSBtZW1vcnkKKwkgKiAoNCBiaXRzKSBwZXIgc2VkX2NtZCAqLworCisJLyogcHJvY2VzcyB0aGUgZmxhZ3MgKi8KKworCXNlZF9jbWQtPndoaWNoX21hdGNoID0gMTsKKwl3aGlsZSAoc3Vic3RyWysraWR4XSkgeworCQkvKiBQYXJzZSBtYXRjaCBudW1iZXIgKi8KKwkJaWYgKGlzZGlnaXQoc3Vic3RyW2lkeF0pKSB7CisJCQlpZiAobWF0Y2hbMF0gIT0gJ14nKSB7CisJCQkJLyogTWF0Y2ggMCB0cmVhdGVkIGFzIGFsbCwgbXVsdGlwbGUgbWF0Y2hlcyB3ZSB0YWtlIHRoZSBsYXN0IG9uZS4gKi8KKwkJCQljb25zdCBjaGFyICpwb3MgPSBzdWJzdHIgKyBpZHg7CisvKiBGSVhNRTogZXJyb3IgY2hlY2s/ICovCisJCQkJc2VkX2NtZC0+d2hpY2hfbWF0Y2ggPSAodW5zaWduZWQpc3RydG9sKHN1YnN0citpZHgsIChjaGFyKiopICZwb3MsIDEwKTsKKwkJCQlpZHggPSBwb3MgLSBzdWJzdHI7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBTa2lwIHNwYWNlcyAqLworCQlpZiAoaXNzcGFjZShzdWJzdHJbaWR4XSkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKHN1YnN0cltpZHhdKSB7CisJCS8qIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzICovCisJCWNhc2UgJ2cnOgorCQkJaWYgKG1hdGNoWzBdICE9ICdeJykKKwkJCQlzZWRfY21kLT53aGljaF9tYXRjaCA9IDA7CisJCQlicmVhazsKKwkJLyogUHJpbnQgcGF0dGVybiBzcGFjZSAqLworCQljYXNlICdwJzoKKwkJCXNlZF9jbWQtPnN1Yl9wID0gMTsKKwkJCWJyZWFrOworCQkvKiBXcml0ZSB0byBmaWxlICovCisJCWNhc2UgJ3cnOgorCQl7CisJCQljaGFyICp0ZW1wOworCQkJaWR4ICs9IHBhcnNlX2ZpbGVfY21kKC8qc2VkX2NtZCwqLyBzdWJzdHIraWR4LCAmdGVtcCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBJZ25vcmUgY2FzZSAoZ251IGV4ZW5zaW9uKSAqLworCQljYXNlICdJJzoKKwkJCWNmbGFncyB8PSBSRUdfSUNBU0U7CisJCQlicmVhazsKKwkJLyogQ29tbWVudCAqLworCQljYXNlICcjJzoKKwkJCS8vIHdoaWxlIChzdWJzdHJbKytpZHhdKSBjb250aW51ZTsKKwkJCWlkeCArPSBzdHJsZW4oc3Vic3RyICsgaWR4KTsgLy8gc2FtZQorCQkJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIEVuZCBvZiBjb21tYW5kICovCisJCWNhc2UgJzsnOgorCQljYXNlICd9JzoKKwkJCWdvdG8gb3V0OworCQlkZWZhdWx0OgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBvcHRpb24gaW4gc3Vic3RpdHV0aW9uIGV4cHJlc3Npb24iKTsKKwkJfQorCX0KKyBvdXQ6CisJLyogY29tcGlsZSB0aGUgbWF0Y2ggc3RyaW5nIGludG8gYSByZWdleCAqLworCWlmICgqbWF0Y2ggIT0gJ1wwJykgeworCQkvKiBJZiBtYXRjaCBpcyBlbXB0eSwgd2UgdXNlIGxhc3QgcmVnZXggdXNlZCBhdCBydW50aW1lICovCisJCXNlZF9jbWQtPnN1Yl9tYXRjaCA9IHhtYWxsb2Moc2l6ZW9mKHJlZ2V4X3QpKTsKKwkJeHJlZ2NvbXAoc2VkX2NtZC0+c3ViX21hdGNoLCBtYXRjaCwgY2ZsYWdzKTsKKwl9CisJZnJlZShtYXRjaCk7CisKKwlyZXR1cm4gaWR4OworfQorCisvKgorICogIFByb2Nlc3MgdGhlIGNvbW1hbmRzIGFyZ3VtZW50cworICovCitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfY21kX2FyZ3Moc2VkX2NtZF90ICpzZWRfY21kLCBjb25zdCBjaGFyICpjbWRzdHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY21kX2xldHRlcnNbXSA9ICJzYWljcnc6YnRUeWREZ0doSGxuTnBQcXg9e30iOworCWVudW0geworCQlJRFhfcyA9IDAsCisJCUlEWF9hLAorCQlJRFhfaSwKKwkJSURYX2MsCisJCUlEWF9yLAorCQlJRFhfdywKKwkJSURYX2NvbG9uLAorCQlJRFhfYiwKKwkJSURYX3QsCisJCUlEWF9ULAorCQlJRFhfeSwKKwkJSURYX2QsCisJCUlEWF9ELAorCQlJRFhfZywKKwkJSURYX0csCisJCUlEWF9oLAorCQlJRFhfSCwKKwkJSURYX2wsCisJCUlEWF9uLAorCQlJRFhfTiwKKwkJSURYX3AsCisJCUlEWF9QLAorCQlJRFhfcSwKKwkJSURYX3gsCisJCUlEWF9lcXVhbCwKKwkJSURYX2xicmFjZSwKKwkJSURYX3JicmFjZSwKKwkJSURYX251bAorCX07CisJc3RydWN0IGNoayB7IGNoYXIgY2hrW3NpemVvZihjbWRfbGV0dGVycyktMSA9PSBJRFhfbnVsID8gMSA6IC0xXTsgfTsKKworCXVuc2lnbmVkIGlkeCA9IHN0cmNocm51bChjbWRfbGV0dGVycywgc2VkX2NtZC0+Y21kKSAtIGNtZF9sZXR0ZXJzOworCisJLyogaGFuZGxlIChzKXVic3RpdHV0aW9uIGNvbW1hbmQgKi8KKwlpZiAoaWR4ID09IElEWF9zKSB7CisJCWNtZHN0ciArPSBwYXJzZV9zdWJzdF9jbWQoc2VkX2NtZCwgY21kc3RyKTsKKwl9CisJLyogaGFuZGxlIGVkaXQgY21kczogKGEpcHBlbmQsIChpKW5zZXJ0LCBhbmQgKGMpaGFuZ2UgKi8KKwllbHNlIGlmIChpZHggPD0gSURYX2MpIHsgLyogYSxpLGMgKi8KKwkJaWYgKChzZWRfY21kLT5lbmRfbGluZSB8fCBzZWRfY21kLT5lbmRfbWF0Y2gpICYmIHNlZF9jbWQtPmNtZCAhPSAnYycpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib25seSBhIGJlZ2lubmluZyBhZGRyZXNzIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVkaXQgY29tbWFuZHMiKTsKKwkJZm9yICg7OykgeworCQkJaWYgKCpjbWRzdHIgPT0gJ1xuJyB8fCAqY21kc3RyID09ICdcXCcpIHsKKwkJCQljbWRzdHIrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghaXNzcGFjZSgqY21kc3RyKSkKKwkJCQlicmVhazsKKwkJCWNtZHN0cisrOworCQl9CisJCXNlZF9jbWQtPnN0cmluZyA9IHhzdHJkdXAoY21kc3RyKTsKKwkJLyogIlxhbnljaGFyIiAtPiAiYW55Y2hhciIgKi8KKwkJcGFyc2VfZXNjYXBlcyhzZWRfY21kLT5zdHJpbmcsIHNlZF9jbWQtPnN0cmluZywgc3RybGVuKGNtZHN0ciksICdcMCcsICdcMCcpOworCQljbWRzdHIgKz0gc3RybGVuKGNtZHN0cik7CisJfQorCS8qIGhhbmRsZSBmaWxlIGNtZHM6IChyKWVhZCAqLworCWVsc2UgaWYgKGlkeCA8PSBJRFhfdykgeyAvKiByLHcgKi8KKwkJaWYgKHNlZF9jbWQtPmVuZF9saW5lIHx8IHNlZF9jbWQtPmVuZF9tYXRjaCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb21tYW5kIG9ubHkgdXNlcyBvbmUgYWRkcmVzcyIpOworCQljbWRzdHIgKz0gcGFyc2VfZmlsZV9jbWQoLypzZWRfY21kLCovIGNtZHN0ciwgJnNlZF9jbWQtPnN0cmluZyk7CisJCWlmIChzZWRfY21kLT5jbWQgPT0gJ3cnKSB7CisJCQlzZWRfY21kLT5zd19maWxlID0geGZvcGVuX2Zvcl93cml0ZShzZWRfY21kLT5zdHJpbmcpOworCQkJc2VkX2NtZC0+c3dfbGFzdF9jaGFyID0gJ1xuJzsKKwkJfQorCX0KKwkvKiBoYW5kbGUgYnJhbmNoIGNvbW1hbmRzICovCisJZWxzZSBpZiAoaWR4IDw9IElEWF9UKSB7IC8qIDosYix0LFQgKi8KKwkJaW50IGxlbmd0aDsKKworCQljbWRzdHIgPSBza2lwX3doaXRlc3BhY2UoY21kc3RyKTsKKwkJbGVuZ3RoID0gc3RyY3NwbihjbWRzdHIsIHNlbWljb2xvbl93aGl0ZXNwYWNlKTsKKwkJaWYgKGxlbmd0aCkgeworCQkJc2VkX2NtZC0+c3RyaW5nID0geHN0cm5kdXAoY21kc3RyLCBsZW5ndGgpOworCQkJY21kc3RyICs9IGxlbmd0aDsKKwkJfQorCX0KKwkvKiB0cmFuc2xhdGlvbiBjb21tYW5kICovCisJZWxzZSBpZiAoaWR4ID09IElEWF95KSB7CisJCWNoYXIgKm1hdGNoLCAqcmVwbGFjZTsKKwkJaW50IGkgPSBjbWRzdHJbMF07CisKKwkJY21kc3RyICs9IHBhcnNlX3JlZ2V4X2RlbGltKGNtZHN0ciwgJm1hdGNoLCAmcmVwbGFjZSkrMTsKKwkJLyogXG4gYWxyZWFkeSBwYXJzZWQsIGJ1dCBcZGVsaW1pdGVyIG5lZWRzIHVuZXNjYXBpbmcuICovCisJCXBhcnNlX2VzY2FwZXMobWF0Y2gsIG1hdGNoLCBzdHJsZW4obWF0Y2gpLCBpLCBpKTsKKwkJcGFyc2VfZXNjYXBlcyhyZXBsYWNlLCByZXBsYWNlLCBzdHJsZW4ocmVwbGFjZSksIGksIGkpOworCisJCXNlZF9jbWQtPnN0cmluZyA9IHh6YWxsb2MoKHN0cmxlbihtYXRjaCkgKyAxKSAqIDIpOworCQlmb3IgKGkgPSAwOyBtYXRjaFtpXSAmJiByZXBsYWNlW2ldOyBpKyspIHsKKwkJCXNlZF9jbWQtPnN0cmluZ1tpKjJdID0gbWF0Y2hbaV07CisJCQlzZWRfY21kLT5zdHJpbmdbaSoyKzFdID0gcmVwbGFjZVtpXTsKKwkJfQorCQlmcmVlKG1hdGNoKTsKKwkJZnJlZShyZXBsYWNlKTsKKwl9CisJLyogaWYgaXQgd2FzbnQgYSBzaW5nbGUtbGV0dGVyIGNvbW1hbmQgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMKKwkgKiB0aGVuIGl0IG11c3QgYmUgYW4gaW52YWxpZCBjb21tYW5kLgorCSAqLworCWVsc2UgaWYgKGlkeCA+PSBJRFhfbnVsKSB7IC8qIG5vdCBkLEQsZyxHLGgsSCxsLG4sTixwLFAscSx4LD0seyx9ICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnN1cHBvcnRlZCBjb21tYW5kICVjIiwgc2VkX2NtZC0+Y21kKTsKKwl9CisKKwkvKiBnaXZlIGJhY2sgd2hhdGV2ZXIncyBsZWZ0IG92ZXIgKi8KKwlyZXR1cm4gY21kc3RyOworfQorCisKKy8qIFBhcnNlIGFkZHJlc3MrY29tbWFuZCBzZXRzLCBza2lwcGluZyBjb21tZW50IGxpbmVzLiAqLworCitzdGF0aWMgdm9pZCBhZGRfY21kKGNvbnN0IGNoYXIgKmNtZHN0cikKK3sKKwlzZWRfY21kX3QgKnNlZF9jbWQ7CisJdW5zaWduZWQgbGVuLCBuOworCisJLyogQXBwZW5kIHRoaXMgbGluZSB0byBhbnkgdW5maW5pc2hlZCBsaW5lIGZyb20gbGFzdCB0aW1lLiAqLworCWlmIChHLmFkZF9jbWRfbGluZSkgeworCQljaGFyICp0cCA9IHhhc3ByaW50ZigiJXNcbiVzIiwgRy5hZGRfY21kX2xpbmUsIGNtZHN0cik7CisJCWZyZWUoRy5hZGRfY21kX2xpbmUpOworCQljbWRzdHIgPSBHLmFkZF9jbWRfbGluZSA9IHRwOworCX0KKworCS8qIElmIHRoaXMgbGluZSBlbmRzIHdpdGggdW5lc2NhcGVkIGJhY2tzbGFzaCwgcmVxdWVzdCBuZXh0IGxpbmUuICovCisJbiA9IGxlbiA9IHN0cmxlbihjbWRzdHIpOworCXdoaWxlIChuICYmIGNtZHN0cltuLTFdID09ICdcXCcpCisJCW4tLTsKKwlpZiAoKGxlbiAtIG4pICYgMSkgeyAvKiBpZiBvZGQgbnVtYmVyIG9mIHRyYWlsaW5nIGJhY2tzbGFzaGVzICovCisJCWlmICghRy5hZGRfY21kX2xpbmUpCisJCQlHLmFkZF9jbWRfbGluZSA9IHhzdHJkdXAoY21kc3RyKTsKKwkJRy5hZGRfY21kX2xpbmVbbGVuLTFdID0gJ1wwJzsKKwkJcmV0dXJuOworCX0KKworCS8qIExvb3AgcGFyc2luZyBhbGwgY29tbWFuZHMgaW4gdGhpcyBsaW5lLiAqLworCXdoaWxlICgqY21kc3RyKSB7CisJCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBzZW1pY29sb25zICovCisJCWNtZHN0ciArPSBzdHJzcG4oY21kc3RyLCBzZW1pY29sb25fd2hpdGVzcGFjZSk7CisKKwkJLyogSWYgbm8gbW9yZSBjb21tYW5kcywgZXhpdC4gKi8KKwkJaWYgKCEqY21kc3RyKSBicmVhazsKKworCQkvKiBpZiB0aGlzIGlzIGEgY29tbWVudCwganVtcCBwYXN0IGl0IGFuZCBrZWVwIGdvaW5nICovCisJCWlmICgqY21kc3RyID09ICcjJykgeworCQkJLyogIiNuIiBpcyB0aGUgc2FtZSBhcyB1c2luZyAtbiBvbiB0aGUgY29tbWFuZCBsaW5lICovCisJCQlpZiAoY21kc3RyWzFdID09ICduJykKKwkJCQlHLmJlX3F1aWV0Kys7CisJCQljbWRzdHIgPSBzdHJwYnJrKGNtZHN0ciwgIlxuXHIiKTsKKwkJCWlmICghY21kc3RyKSBicmVhazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcGFyc2UgdGhlIGNvbW1hbmQKKwkJICogZm9ybWF0IGlzOiBbYWRkcl1bLGFkZHJdWyFdY21kCisJCSAqICAgICAgICAgICAgfC0tLS18fC0tLS0tfHwtfAorCQkgKiAgICAgICAgICAgIHBhcnQxIHBhcnQyICBwYXJ0MworCQkgKi8KKworCQlzZWRfY21kID0geHphbGxvYyhzaXplb2Yoc2VkX2NtZF90KSk7CisKKwkJLyogZmlyc3QgcGFydCAoaWYgcHJlc2VudCkgaXMgYW4gYWRkcmVzczogZWl0aGVyIGEgJyQnLCBhIG51bWJlciBvciBhIC9yZWdleC8gKi8KKwkJY21kc3RyICs9IGdldF9hZGRyZXNzKGNtZHN0ciwgJnNlZF9jbWQtPmJlZ19saW5lLCAmc2VkX2NtZC0+YmVnX21hdGNoKTsKKwkJc2VkX2NtZC0+YmVnX2xpbmVfb3JpZyA9IHNlZF9jbWQtPmJlZ19saW5lOworCisJCS8qIHNlY29uZCBwYXJ0IChpZiBwcmVzZW50KSB3aWxsIGJlZ2luIHdpdGggYSBjb21tYSAqLworCQlpZiAoKmNtZHN0ciA9PSAnLCcpIHsKKwkJCWludCBpZHg7CisKKwkJCWNtZHN0cisrOworCQkJaWR4ID0gZ2V0X2FkZHJlc3MoY21kc3RyLCAmc2VkX2NtZC0+ZW5kX2xpbmUsICZzZWRfY21kLT5lbmRfbWF0Y2gpOworCQkJaWYgKCFpZHgpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIGFkZHJlc3MgYWZ0ZXIgY29tbWEiKTsKKwkJCWNtZHN0ciArPSBpZHg7CisJCX0KKworCQkvKiBza2lwIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb21tYW5kICovCisJCWNtZHN0ciA9IHNraXBfd2hpdGVzcGFjZShjbWRzdHIpOworCisJCS8qIENoZWNrIGZvciBpbnZlcnNpb24gZmxhZyAqLworCQlpZiAoKmNtZHN0ciA9PSAnIScpIHsKKwkJCXNlZF9jbWQtPmludmVydCA9IDE7CisJCQljbWRzdHIrKzsKKworCQkJLyogc2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgY29tbWFuZCAqLworCQkJY21kc3RyID0gc2tpcF93aGl0ZXNwYWNlKGNtZHN0cik7CisJCX0KKworCQkvKiBsYXN0IHBhcnQgKG1hbmRhdG9yeSkgd2lsbCBiZSBhIGNvbW1hbmQgKi8KKwkJaWYgKCEqY21kc3RyKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1pc3NpbmcgY29tbWFuZCIpOworCQlzZWRfY21kLT5jbWQgPSAqY21kc3RyKys7CisJCWNtZHN0ciA9IHBhcnNlX2NtZF9hcmdzKHNlZF9jbWQsIGNtZHN0cik7CisKKwkJLyogQWRkIHRoZSBjb21tYW5kIHRvIHRoZSBjb21tYW5kIGFycmF5ICovCisJCSpHLnNlZF9jbWRfdGFpbCA9IHNlZF9jbWQ7CisJCUcuc2VkX2NtZF90YWlsID0gJnNlZF9jbWQtPm5leHQ7CisJfQorCisJLyogSWYgd2UgZ2x1ZWQgbXVsdGlwbGUgbGluZXMgdG9nZXRoZXIsIGZyZWUgdGhlIG1lbW9yeS4gKi8KKwlmcmVlKEcuYWRkX2NtZF9saW5lKTsKKwlHLmFkZF9jbWRfbGluZSA9IE5VTEw7Cit9CisKKy8qIEFwcGVuZCB0byBhIHN0cmluZywgcmVhbGxvY2F0aW5nIG1lbW9yeSBhcyBuZWNlc3NhcnkuICovCisKKyNkZWZpbmUgUElQRV9HUk9XIDY0CisKK3N0YXRpYyB2b2lkIHBpcGVfcHV0YyhjaGFyIGMpCit7CisJaWYgKEcucGlwZWxpbmUuaWR4ID09IEcucGlwZWxpbmUubGVuKSB7CisJCUcucGlwZWxpbmUuYnVmID0geHJlYWxsb2MoRy5waXBlbGluZS5idWYsCisJCQkJRy5waXBlbGluZS5sZW4gKyBQSVBFX0dST1cpOworCQlHLnBpcGVsaW5lLmxlbiArPSBQSVBFX0dST1c7CisJfQorCUcucGlwZWxpbmUuYnVmW0cucGlwZWxpbmUuaWR4KytdID0gYzsKK30KKworc3RhdGljIHZvaWQgZG9fc3Vic3Rfd19iYWNrcmVmcyhjaGFyICpsaW5lLCBjaGFyICpyZXBsYWNlKQoreworCWludCBpLCBqOworCisJLyogZ28gdGhyb3VnaCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nICovCisJZm9yIChpID0gMDsgcmVwbGFjZVtpXTsgaSsrKSB7CisJCS8qIGlmIHdlIGZpbmQgYSBiYWNrcmVmZXJlbmNlIChcMSwgXDIsIGV0Yy4pIHByaW50IHRoZSBiYWNrcmVmJ2VkICogdGV4dCAqLworCQlpZiAocmVwbGFjZVtpXSA9PSAnXFwnKSB7CisJCQl1bnNpZ25lZCBiYWNrcmVmID0gcmVwbGFjZVsrK2ldIC0gJzAnOworCQkJaWYgKGJhY2tyZWYgPD0gOSkgeworCQkJCS8qIHByaW50IG91dCB0aGUgdGV4dCBoZWxkIGluIEcucmVnbWF0Y2hbYmFja3JlZl0gKi8KKwkJCQlpZiAoRy5yZWdtYXRjaFtiYWNrcmVmXS5ybV9zbyAhPSAtMSkgeworCQkJCQlqID0gRy5yZWdtYXRjaFtiYWNrcmVmXS5ybV9zbzsKKwkJCQkJd2hpbGUgKGogPCBHLnJlZ21hdGNoW2JhY2tyZWZdLnJtX2VvKQorCQkJCQkJcGlwZV9wdXRjKGxpbmVbaisrXSk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogSSBfdGhpbmtfIGl0IGlzIGltcG9zc2libGUgdG8gZ2V0ICdcJyB0byBiZQorCQkJICogdGhlIGxhc3QgY2hhciBpbiByZXBsYWNlIHN0cmluZy4gVGh1cyB3ZSBkb250IGNoZWNrCisJCQkgKiBmb3IgcmVwbGFjZVtpXSA9PSBOVUwuIChjb3VudGVyZXhhbXBsZSBhbnlvbmU/KSAqLworCQkJLyogaWYgd2UgZmluZCBhIGJhY2tzbGFzaCBlc2NhcGVkIGNoYXJhY3RlciwgcHJpbnQgdGhlIGNoYXJhY3RlciAqLworCQkJcGlwZV9wdXRjKHJlcGxhY2VbaV0pOworCQkJY29udGludWU7CisJCX0KKwkJLyogaWYgd2UgZmluZCBhbiB1bmVzY2FwZWQgJyYnIHByaW50IG91dCB0aGUgd2hvbGUgbWF0Y2hlZCB0ZXh0LiAqLworCQlpZiAocmVwbGFjZVtpXSA9PSAnJicpIHsKKwkJCWogPSBHLnJlZ21hdGNoWzBdLnJtX3NvOworCQkJd2hpbGUgKGogPCBHLnJlZ21hdGNoWzBdLnJtX2VvKQorCQkJCXBpcGVfcHV0YyhsaW5lW2orK10pOworCQkJY29udGludWU7CisJCX0KKwkJLyogT3RoZXJ3aXNlIGp1c3Qgb3V0cHV0IHRoZSBjaGFyYWN0ZXIuICovCisJCXBpcGVfcHV0YyhyZXBsYWNlW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fc3Vic3RfY29tbWFuZChzZWRfY21kX3QgKnNlZF9jbWQsIGNoYXIgKipsaW5lX3ApCit7CisJY2hhciAqbGluZSA9ICpsaW5lX3A7CisJaW50IGFsdGVyZWQgPSAwOworCXVuc2lnbmVkIG1hdGNoX2NvdW50ID0gMDsKKwlyZWdleF90ICpjdXJyZW50X3JlZ2V4OworCisJY3VycmVudF9yZWdleCA9IHNlZF9jbWQtPnN1Yl9tYXRjaDsKKwkvKiBIYW5kbGUgZW1wdHkgcmVnZXguICovCisJaWYgKCFjdXJyZW50X3JlZ2V4KSB7CisJCWN1cnJlbnRfcmVnZXggPSBHLnByZXZpb3VzX3JlZ2V4X3B0cjsKKwkJaWYgKCFjdXJyZW50X3JlZ2V4KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHByZXZpb3VzIHJlZ2V4cCIpOworCX0KKwlHLnByZXZpb3VzX3JlZ2V4X3B0ciA9IGN1cnJlbnRfcmVnZXg7CisKKwkvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCAqLworCWlmIChSRUdfTk9NQVRDSCA9PSByZWdleGVjKGN1cnJlbnRfcmVnZXgsIGxpbmUsIDEwLCBHLnJlZ21hdGNoLCAwKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJbml0aWFsaXplIHRlbXBvcmFyeSBvdXRwdXQgYnVmZmVyLiAqLworCUcucGlwZWxpbmUuYnVmID0geG1hbGxvYyhQSVBFX0dST1cpOworCUcucGlwZWxpbmUubGVuID0gUElQRV9HUk9XOworCUcucGlwZWxpbmUuaWR4ID0gMDsKKworCS8qIE5vdyBsb29wIHRocm91Z2gsIHN1YnN0aXR1dGluZyBmb3IgbWF0Y2hlcyAqLworCWRvIHsKKwkJaW50IGk7CisKKwkJLyogV29yayBhcm91bmQgYnVnIGluIGdsaWJjIHJlZ2V4ZWMsIGRlbW9uc3RyYXRlZCBieToKKwkJICAgZWNobyAiIGEuYiIgfCBidXN5Ym94IHNlZCAncyBbXiAuXSogeCBnJworCQkgICBUaGUgbWF0Y2hfY291bnQgY2hlY2sgaXMgc28gbm90IHRvIGJyZWFrCisJCSAgIGVjaG8gImhpIiB8IGJ1c3lib3ggc2VkICdzL14vIS9nJyAqLworCQlpZiAoIUcucmVnbWF0Y2hbMF0ucm1fc28gJiYgIUcucmVnbWF0Y2hbMF0ucm1fZW8gJiYgbWF0Y2hfY291bnQpIHsKKwkJCXBpcGVfcHV0YygqbGluZSsrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWF0Y2hfY291bnQrKzsKKworCQkvKiBJZiB3ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGlzIG1hdGNoLCBvdXRwdXQgb2xkIGxpbmUgdG8KKwkJICAgZW5kIG9mIG1hdGNoIGFuZCBjb250aW51ZSAqLworCQlpZiAoc2VkX2NtZC0+d2hpY2hfbWF0Y2gKKwkJICYmIChzZWRfY21kLT53aGljaF9tYXRjaCAhPSBtYXRjaF9jb3VudCkKKwkJKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgRy5yZWdtYXRjaFswXS5ybV9lbzsgaSsrKQorCQkJCXBpcGVfcHV0YygqbGluZSsrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcHJpbnQgZXZlcnl0aGluZyBiZWZvcmUgdGhlIG1hdGNoICovCisJCWZvciAoaSA9IDA7IGkgPCBHLnJlZ21hdGNoWzBdLnJtX3NvOyBpKyspCisJCQlwaXBlX3B1dGMobGluZVtpXSk7CisKKwkJLyogdGhlbiBwcmludCB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZyAqLworCQlkb19zdWJzdF93X2JhY2tyZWZzKGxpbmUsIHNlZF9jbWQtPnN0cmluZyk7CisKKwkJLyogYWR2YW5jZSBwYXN0IHRoZSBtYXRjaCAqLworCQlsaW5lICs9IEcucmVnbWF0Y2hbMF0ucm1fZW87CisJCS8qIGZsYWcgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQgKi8KKwkJYWx0ZXJlZCsrOworCisJCS8qIGlmIHdlJ3JlIG5vdCBkb2luZyB0aGlzIGdsb2JhbGx5LCBnZXQgb3V0IG5vdyAqLworCQlpZiAoc2VkX2NtZC0+d2hpY2hfbWF0Y2gpCisJCQlicmVhazsKKworLy9tYXliZSAoRy5yZWdtYXRjaFswXS5ybV9lbyA/IFJFR19OT1RCT0wgOiAwKSBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWwgUkVHX05PVEJPTD8KKwl9IHdoaWxlICgqbGluZSAmJiByZWdleGVjKGN1cnJlbnRfcmVnZXgsIGxpbmUsIDEwLCBHLnJlZ21hdGNoLCBSRUdfTk9UQk9MKSAhPSBSRUdfTk9NQVRDSCk7CisKKwkvKiBDb3B5IHJlc3Qgb2Ygc3RyaW5nIGludG8gb3V0cHV0IHBpcGVsaW5lICovCisJd2hpbGUgKDEpIHsKKwkJY2hhciBjID0gKmxpbmUrKzsKKwkJcGlwZV9wdXRjKGMpOworCQlpZiAoYyA9PSAnXDAnKQorCQkJYnJlYWs7CisJfQorCisJZnJlZSgqbGluZV9wKTsKKwkqbGluZV9wID0gRy5waXBlbGluZS5idWY7CisJcmV0dXJuIGFsdGVyZWQ7Cit9CisKKy8qIFNldCBjb21tYW5kIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhpcyBsYWJlbC4gIChEb2VzIG5vdCBoYW5kbGUgbnVsbCBsYWJlbC4pICovCitzdGF0aWMgc2VkX2NtZF90ICpicmFuY2hfdG8oY2hhciAqbGFiZWwpCit7CisJc2VkX2NtZF90ICpzZWRfY21kOworCisJZm9yIChzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7IHNlZF9jbWQ7IHNlZF9jbWQgPSBzZWRfY21kLT5uZXh0KSB7CisJCWlmIChzZWRfY21kLT5jbWQgPT0gJzonICYmIHNlZF9jbWQtPnN0cmluZyAmJiAhc3RyY21wKHNlZF9jbWQtPnN0cmluZywgbGFiZWwpKSB7CisJCQlyZXR1cm4gc2VkX2NtZDsKKwkJfQorCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBsYWJlbCBmb3IganVtcCB0byAnJXMnIiwgbGFiZWwpOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmQoY2hhciAqcykKK3sKKwlsbGlzdF9hZGRfdG9fZW5kKCZHLmFwcGVuZF9oZWFkLCB4c3RyZHVwKHMpKTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfYXBwZW5kKHZvaWQpCit7CisJY2hhciAqZGF0YTsKKworCS8qIE91dHB1dCBhcHBlbmRlZCBsaW5lcy4gKi8KKwl3aGlsZSAoKGRhdGEgPSAoY2hhciAqKWxsaXN0X3BvcCgmRy5hcHBlbmRfaGVhZCkpKSB7CisJCWZwcmludGYoRy5ub25zdGRvdXQsICIlc1xuIiwgZGF0YSk7CisJCWZyZWUoZGF0YSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfaW5wdXRfZmlsZShGSUxFICpmaWxlKQoreworCUcuaW5wdXRfZmlsZV9saXN0ID0geHJlYWxsb2NfdmVjdG9yKEcuaW5wdXRfZmlsZV9saXN0LCAyLCBHLmlucHV0X2ZpbGVfY291bnQpOworCUcuaW5wdXRfZmlsZV9saXN0W0cuaW5wdXRfZmlsZV9jb3VudCsrXSA9IGZpbGU7Cit9CisKKy8qIEdldCBuZXh0IGxpbmUgb2YgaW5wdXQgZnJvbSBHLmlucHV0X2ZpbGVfbGlzdCwgZmx1c2hpbmcgYXBwZW5kIGJ1ZmZlciBhbmQKKyAqIG5vdGluZyBpZiB3ZSByYW4gb3V0IG9mIGZpbGVzIHdpdGhvdXQgYSBuZXdsaW5lIG9uIHRoZSBsYXN0IGxpbmUgd2UgcmVhZC4KKyAqLworZW51bSB7CisJTk9fRU9MX0NIQVIgPSAxLAorCUxBU1RfSVNfTlVMID0gMiwKK307CitzdGF0aWMgY2hhciAqZ2V0X25leHRfbGluZShjaGFyICpnZXRzX2NoYXIpCit7CisJY2hhciAqdGVtcCA9IE5VTEw7CisJaW50IGxlbjsKKwljaGFyIGdjOworCisJZmx1c2hfYXBwZW5kKCk7CisKKwkvKiB3aWxsIGJlIHJldHVybmVkIGlmIGxhc3QgbGluZSBpbiB0aGUgZmlsZQorCSAqIGRvZXNuJ3QgZW5kIHdpdGggZWl0aGVyICdcbicgb3IgJ1wwJyAqLworCWdjID0gTk9fRU9MX0NIQVI7CisJd2hpbGUgKEcuY3VycmVudF9pbnB1dF9maWxlIDwgRy5pbnB1dF9maWxlX2NvdW50KSB7CisJCUZJTEUgKmZwID0gRy5pbnB1dF9maWxlX2xpc3RbRy5jdXJyZW50X2lucHV0X2ZpbGVdOworCQkvKiBSZWFkIGxpbmUgdXAgdG8gYSBuZXdsaW5lIG9yIE5VTCBieXRlLCBpbmNsdXNpdmUsCisJCSAqIHJldHVybiBtYWxsb2MnZWQgY2hhcltdLiBsZW5ndGggb2YgdGhlIGNodW5rIHJlYWQKKwkJICogaXMgc3RvcmVkIGluIGxlbi4gTlVMTCBpZiBFT0YvZXJyb3IgKi8KKwkJdGVtcCA9IGJiX2dldF9jaHVua19mcm9tX2ZpbGUoZnAsICZsZW4pOworCQlpZiAodGVtcCkgeworCQkJLyogbGVuID4gMCBoZXJlLCBpdCdzIG9rIHRvIGRvIHRlbXBbbGVuLTFdICovCisJCQljaGFyIGMgPSB0ZW1wW2xlbi0xXTsKKwkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXDAnKSB7CisJCQkJdGVtcFtsZW4tMV0gPSAnXDAnOworCQkJCWdjID0gYzsKKwkJCQlpZiAoYyA9PSAnXDAnKSB7CisJCQkJCWludCBjaCA9IGZnZXRjKGZwKTsKKwkJCQkJaWYgKGNoICE9IEVPRikKKwkJCQkJCXVuZ2V0YyhjaCwgZnApOworCQkJCQllbHNlCisJCQkJCQlnYyA9IExBU1RfSVNfTlVMOworCQkJCX0KKwkJCX0KKwkJCS8qIGVsc2Ugd2UgcHV0IE5PX0VPTF9DSEFSIGludG8gKmdldHNfY2hhciAqLworCQkJYnJlYWs7CisKKwkJLyogTkI6IEkgaGFkIHRoZSBpZGVhIG9mIHBlZWtpbmcgbmV4dCBmaWxlKHMpIGFuZCByZXR1cm5pbmcKKwkJICogTk9fRU9MX0NIQVIgb25seSBpZiBpdCBpcyB0aGUgKmxhc3QqIG5vbi1lbXB0eQorCQkgKiBpbnB1dCBmaWxlLiBCdXQgdGhlcmUgaXMgYSBjYXNlIHdoZXJlIHRoaXMgd29uJ3Qgd29yazoKKwkJICogZmlsZTE6ICJhIHdvb1xuYiB3b28iCisJCSAqIGZpbGUyOiAiYyBub1xuZCBubyIKKwkJICogc2VkIC1uZSAncy93b28vYmFuZy9wJyBpbnB1dDEgaW5wdXQyID0+ICJhIGJhbmdcbmIgYmFuZyIKKwkJICogKG5vdGU6ICpubyogbmV3bGluZSBhZnRlciAiYiBiYW5nIiEpICovCisJCX0KKwkJLyogQ2xvc2UgdGhpcyBmaWxlIGFuZCBhZHZhbmNlIHRvIG5leHQgb25lICovCisJCWZjbG9zZShmcCk7CisJCUcuY3VycmVudF9pbnB1dF9maWxlKys7CisJfQorCSpnZXRzX2NoYXIgPSBnYzsKKwlyZXR1cm4gdGVtcDsKK30KKworLyogT3V0cHV0IGxpbmUgb2YgdGV4dC4gKi8KKy8qIE5vdGU6CisgKiBUaGUgdHJpY2tzIHdpdGggTk9fRU9MX0NIQVIgYW5kIGxhc3RfcHV0c19jaGFyIGFyZSB0aGVyZSB0byBlbXVsYXRlIGdudSBzZWQuCisgKiBXaXRob3V0IHRoZW0sIHdlIGhhZCB0aGlzOgorICogZWNobyAtbiB0aGluZ3kgPnoxCisgKiBlY2hvIC1uIGFnYWluID56MgorICogPnpudWxsCisgKiBzZWQgInMvaS96LyIgejEgejIgem51bGwgfCBoZXhkdW1wIC12QworICogb3V0cHV0OgorICogZ251IHNlZCA0LjEuNToKKyAqIDAwMDAwMDAwICA3NCA2OCA3YSA2ZSA2NyA3OSAwYSA2MSAgNjcgNjEgN2EgNmUgICAgICAgICAgICAgIHx0aHpuZ3kuYWdhem58CisgKiBiYm94OgorICogMDAwMDAwMDAgIDc0IDY4IDdhIDZlIDY3IDc5IDYxIDY3ICA2MSA3YSA2ZSAgICAgICAgICAgICAgICAgfHRoem5neWFnYXpufAorICovCitzdGF0aWMgdm9pZCBwdXRzX21heWJlX25ld2xpbmUoY2hhciAqcywgRklMRSAqZmlsZSwgY2hhciAqbGFzdF9wdXRzX2NoYXIsIGNoYXIgbGFzdF9nZXRzX2NoYXIpCit7CisJY2hhciBscGMgPSAqbGFzdF9wdXRzX2NoYXI7CisKKwkvKiBOZWVkIHRvIGluc2VydCBhICdcbicgYmV0d2VlbiB0d28gZmlsZXMgYmVjYXVzZSBmaXJzdCBmaWxlJ3MKKwkgKiBsYXN0IGxpbmUgd2Fzbid0IHRlcm1pbmF0ZWQ/ICovCisJaWYgKGxwYyAhPSAnXG4nICYmIGxwYyAhPSAnXDAnKSB7CisJCWZwdXRjKCdcbicsIGZpbGUpOworCQlscGMgPSAnXG4nOworCX0KKwlmcHV0cyhzLCBmaWxlKTsKKworCS8qICd4JyAtIGp1c3Qgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCAnXG4nLCAnXDAnIG9yIE5PX0VPTF9DSEFSICovCisJaWYgKHNbMF0pCisJCWxwYyA9ICd4JzsKKworCS8qIGhhZCB0cmFpbGluZyAnXDAnIGFuZCBpdCB3YXMgbGFzdCBjaGFyIG9mIGZpbGU/ICovCisJaWYgKGxhc3RfZ2V0c19jaGFyID09IExBU1RfSVNfTlVMKSB7CisJCWZwdXRjKCdcMCcsIGZpbGUpOworCQlscGMgPSAneCc7IC8qICovCisJfSBlbHNlCisJLyogaGFkIHRyYWlsaW5nICdcbicgb3IgJ1wwJz8gKi8KKwlpZiAobGFzdF9nZXRzX2NoYXIgIT0gTk9fRU9MX0NIQVIpIHsKKwkJZnB1dGMobGFzdF9nZXRzX2NoYXIsIGZpbGUpOworCQlscGMgPSBsYXN0X2dldHNfY2hhcjsKKwl9CisKKwlpZiAoZmVycm9yKGZpbGUpKSB7CisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IDQ7ICAvKiBJdCdzIHdoYXQgZ251IHNlZCBleGl0cyB3aXRoLi4uICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ193cml0ZV9lcnJvcik7CisJfQorCSpsYXN0X3B1dHNfY2hhciA9IGxwYzsKK30KKworI2RlZmluZSBzZWRfcHV0cyhzLCBuKSAocHV0c19tYXliZV9uZXdsaW5lKHMsIEcubm9uc3Rkb3V0LCAmbGFzdF9wdXRzX2NoYXIsIG4pKQorCitzdGF0aWMgaW50IGJlZ19tYXRjaChzZWRfY21kX3QgKnNlZF9jbWQsIGNvbnN0IGNoYXIgKnBhdHRlcm5fc3BhY2UpCit7CisJaW50IHJldHZhbCA9IHNlZF9jbWQtPmJlZ19tYXRjaCAmJiAhcmVnZXhlYyhzZWRfY21kLT5iZWdfbWF0Y2gsIHBhdHRlcm5fc3BhY2UsIDAsIE5VTEwsIDApOworCWlmIChyZXR2YWwpCisJCUcucHJldmlvdXNfcmVnZXhfcHRyID0gc2VkX2NtZC0+YmVnX21hdGNoOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFByb2Nlc3MgYWxsIHRoZSBsaW5lcyBpbiBhbGwgdGhlIGZpbGVzICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZmlsZXModm9pZCkKK3sKKwljaGFyICpwYXR0ZXJuX3NwYWNlLCAqbmV4dF9saW5lOworCWludCBsaW5lbnVtID0gMDsKKwljaGFyIGxhc3RfcHV0c19jaGFyID0gJ1xuJzsKKwljaGFyIGxhc3RfZ2V0c19jaGFyLCBuZXh0X2dldHNfY2hhcjsKKwlzZWRfY21kX3QgKnNlZF9jbWQ7CisJaW50IHN1YnN0aXR1dGVkOworCisJLyogUHJpbWUgdGhlIHB1bXAgKi8KKwluZXh0X2xpbmUgPSBnZXRfbmV4dF9saW5lKCZuZXh0X2dldHNfY2hhcik7CisKKwkvKiBHbyB0aHJvdWdoIGV2ZXJ5IGxpbmUgaW4gZWFjaCBmaWxlICovCisgYWdhaW46CisJc3Vic3RpdHV0ZWQgPSAwOworCisJLyogQWR2YW5jZSB0byBuZXh0IGxpbmUuICBTdG9wIGlmIG91dCBvZiBsaW5lcy4gKi8KKwlwYXR0ZXJuX3NwYWNlID0gbmV4dF9saW5lOworCWlmICghcGF0dGVybl9zcGFjZSkKKwkJcmV0dXJuOworCWxhc3RfZ2V0c19jaGFyID0gbmV4dF9nZXRzX2NoYXI7CisKKwkvKiBSZWFkIG9uZSBsaW5lIGluIGFkdmFuY2Ugc28gd2UgY2FuIGFjdCBvbiB0aGUgbGFzdCBsaW5lLAorCSAqIHRoZSAnJCcgYWRkcmVzcyAqLworCW5leHRfbGluZSA9IGdldF9uZXh0X2xpbmUoJm5leHRfZ2V0c19jaGFyKTsKKwlsaW5lbnVtKys7CisKKwkvKiBGb3IgZXZlcnkgbGluZSwgZ28gdGhyb3VnaCBhbGwgdGhlIGNvbW1hbmRzICovCisgcmVzdGFydDoKKwlmb3IgKHNlZF9jbWQgPSBHLnNlZF9jbWRfaGVhZDsgc2VkX2NtZDsgc2VkX2NtZCA9IHNlZF9jbWQtPm5leHQpIHsKKwkJaW50IG9sZF9tYXRjaGVkLCBtYXRjaGVkOworCisJCW9sZF9tYXRjaGVkID0gc2VkX2NtZC0+aW5fbWF0Y2g7CisKKwkJLyogRGV0ZXJtaW5lIGlmIHRoaXMgY29tbWFuZCBtYXRjaGVzIHRoaXMgbGluZTogKi8KKworCQlkYmcoIm1hdGNoMTolZCIsIHNlZF9jbWQtPmluX21hdGNoKTsKKwkJZGJnKCJtYXRjaDI6JWQiLCAoIXNlZF9jbWQtPmJlZ19saW5lICYmICFzZWRfY21kLT5lbmRfbGluZQorCQkJCSYmICFzZWRfY21kLT5iZWdfbWF0Y2ggJiYgIXNlZF9jbWQtPmVuZF9tYXRjaCkpOworCQlkYmcoIm1hdGNoMzolZCIsIChzZWRfY21kLT5iZWdfbGluZSA+IDAKKwkJCSYmIChzZWRfY21kLT5lbmRfbGluZSB8fCBzZWRfY21kLT5lbmRfbWF0Y2gKKwkJCSAgICA/IChzZWRfY21kLT5iZWdfbGluZSA8PSBsaW5lbnVtKQorCQkJICAgIDogKHNlZF9jbWQtPmJlZ19saW5lID09IGxpbmVudW0pCisJCQkgICAgKQorCQkJKSk7CisJCWRiZygibWF0Y2g0OiVkIiwgKGJlZ19tYXRjaChzZWRfY21kLCBwYXR0ZXJuX3NwYWNlKSkpOworCQlkYmcoIm1hdGNoNTolZCIsIChzZWRfY21kLT5iZWdfbGluZSA9PSAtMSAmJiBuZXh0X2xpbmUgPT0gTlVMTCkpOworCisJCS8qIEFyZSB3ZSBjb250aW51aW5nIGEgcHJldmlvdXMgbXVsdGktbGluZSBtYXRjaD8gKi8KKwkJc2VkX2NtZC0+aW5fbWF0Y2ggPSBzZWRfY21kLT5pbl9tYXRjaAorCQkJLyogT3IgaXMgbm8gcmFuZ2UgbmVjZXNzYXJ5PyAqLworCQkJfHwgKCFzZWRfY21kLT5iZWdfbGluZSAmJiAhc2VkX2NtZC0+ZW5kX2xpbmUKKwkJCQkmJiAhc2VkX2NtZC0+YmVnX21hdGNoICYmICFzZWRfY21kLT5lbmRfbWF0Y2gpCisJCQkvKiBPciBkaWQgd2UgbWF0Y2ggdGhlIHN0YXJ0IG9mIGEgbnVtZXJpY2FsIHJhbmdlPyAqLworCQkJfHwgKHNlZF9jbWQtPmJlZ19saW5lID4gMAorCQkJICAgICYmIChzZWRfY21kLT5lbmRfbGluZSB8fCBzZWRfY21kLT5lbmRfbWF0Y2gKKwkJCQkgIC8qIG5vdGU6IGV2ZW4gaWYgZW5kIGlzIG51bWVyaWMgYW5kIGlzIDwgbGluZW51bSB0b28sCisJCQkJICAgKiBHTlUgc2VkIG1hdGNoZXMhIFdlIG1hdGNoIHRvbywgdGhlcmVmb3JlIHdlIGRvbid0CisJCQkJICAgKiBjaGVjayBoZXJlIHRoYXQgbGluZW51bSA8PSBlbmQuCisJCQkJICAgKiBFeGFtcGxlOgorCQkJCSAgICogcHJpbnRmICcxXG4yXG4zXG40XG4nIHwgc2VkIC1uICcxe047TjtkfTsxcDsyLDNwOzNwOzRwJworCQkJCSAgICogZmlyc3QgdGhyZWUgaW5wdXQgbGluZXMgYXJlIGRlbGV0ZWQ7CisJCQkJICAgKiA0dGggbGluZSBpcyBtYXRjaGVkIGFuZCBwcmludGVkCisJCQkJICAgKiBieSAiMiwzIiAoISkgYW5kIGJ5ICI0IiByYW5nZXMKKwkJCQkgICAqLworCQkJCT8gKHNlZF9jbWQtPmJlZ19saW5lIDw9IGxpbmVudW0pICAgIC8qIE4sZW5kICovCisJCQkJOiAoc2VkX2NtZC0+YmVnX2xpbmUgPT0gbGluZW51bSkgICAgLyogTiAqLworCQkJCSkKKwkJCSAgICApCisJCQkvKiBPciBkb2VzIHRoaXMgbGluZSBtYXRjaCBvdXIgYmVnaW4gYWRkcmVzcyByZWdleD8gKi8KKwkJCXx8IChiZWdfbWF0Y2goc2VkX2NtZCwgcGF0dGVybl9zcGFjZSkpCisJCQkvKiBPciBkaWQgd2UgbWF0Y2ggbGFzdCBsaW5lIG9mIGlucHV0PyAqLworCQkJfHwgKHNlZF9jbWQtPmJlZ19saW5lID09IC0xICYmIG5leHRfbGluZSA9PSBOVUxMKTsKKworCQkvKiBTbmFwc2hvdCB0aGUgdmFsdWUgKi8KKwkJbWF0Y2hlZCA9IHNlZF9jbWQtPmluX21hdGNoOworCisJCWRiZygiY21kOiclYycgbWF0Y2hlZDolZCBiZWdfbGluZTolZCBlbmRfbGluZTolZCBsaW5lbnVtOiVkIiwKKwkJCXNlZF9jbWQtPmNtZCwgbWF0Y2hlZCwgc2VkX2NtZC0+YmVnX2xpbmUsIHNlZF9jbWQtPmVuZF9saW5lLCBsaW5lbnVtKTsKKworCQkvKiBJcyB0aGlzIGxpbmUgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtYXRjaD8gKi8KKworCQlpZiAobWF0Y2hlZCkgeworCQkJLyogb25jZSBtYXRjaGVkLCAibix4eHgiIHJhbmdlIGlzIGRlYWQsIGRpc2FibGluZyBpdCAqLworCQkJaWYgKHNlZF9jbWQtPmJlZ19saW5lID4gMCkgeworCQkJCXNlZF9jbWQtPmJlZ19saW5lID0gLTI7CisJCQl9CisJCQlzZWRfY21kLT5pbl9tYXRjaCA9ICEoCisJCQkJLyogaGFzIHRoZSBlbmRpbmcgbGluZSBjb21lLCBvciBpcyB0aGlzIGEgc2luZ2xlIGFkZHJlc3MgY29tbWFuZD8gKi8KKwkJCQkoc2VkX2NtZC0+ZW5kX2xpbmUKKwkJCQkJPyBzZWRfY21kLT5lbmRfbGluZSA9PSAtMQorCQkJCQkJPyAhbmV4dF9saW5lCisJCQkJCQk6IChzZWRfY21kLT5lbmRfbGluZSA8PSBsaW5lbnVtKQorCQkJCQk6ICFzZWRfY21kLT5lbmRfbWF0Y2gKKwkJCQkpCisJCQkJLyogb3IgZG9lcyB0aGlzIGxpbmUgbWF0Y2hlcyBvdXIgbGFzdCBhZGRyZXNzIHJlZ2V4ICovCisJCQkJfHwgKHNlZF9jbWQtPmVuZF9tYXRjaCAmJiBvbGRfbWF0Y2hlZAorCQkJCSAgICAgJiYgKHJlZ2V4ZWMoc2VkX2NtZC0+ZW5kX21hdGNoLAorCQkJCSAgICAgICAgICAgICAgICAgcGF0dGVybl9zcGFjZSwgMCwgTlVMTCwgMCkgPT0gMCkKKwkJCQkpCisJCQkpOworCQl9CisKKwkJLyogU2tpcCBibG9ja3Mgb2YgY29tbWFuZHMgd2UgZGlkbid0IG1hdGNoICovCisJCWlmIChzZWRfY21kLT5jbWQgPT0gJ3snKSB7CisJCQlpZiAoc2VkX2NtZC0+aW52ZXJ0ID8gbWF0Y2hlZCA6ICFtYXRjaGVkKSB7CisJCQkJdW5zaWduZWQgbmVzdF9jbnQgPSAwOworCQkJCXdoaWxlICgxKSB7CisJCQkJCWlmIChzZWRfY21kLT5jbWQgPT0gJ3snKQorCQkJCQkJbmVzdF9jbnQrKzsKKwkJCQkJaWYgKHNlZF9jbWQtPmNtZCA9PSAnfScpIHsKKwkJCQkJCW5lc3RfY250LS07CisJCQkJCQlpZiAobmVzdF9jbnQgPT0gMCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlzZWRfY21kID0gc2VkX2NtZC0+bmV4dDsKKwkJCQkJaWYgKCFzZWRfY21kKQorCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVudGVybWluYXRlZCB7Iik7CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBPa2F5LCBzbyBkaWQgdGhpcyBsaW5lIG1hdGNoPyAqLworCQlpZiAoc2VkX2NtZC0+aW52ZXJ0ID8gbWF0Y2hlZCA6ICFtYXRjaGVkKQorCQkJY29udGludWU7IC8qIG5vICovCisKKwkJLyogVXBkYXRlIGxhc3QgdXNlZCByZWdleCBpbiBjYXNlIGEgYmxhbmsgc3Vic3RpdHV0ZSBCUkUgaXMgZm91bmQgKi8KKwkJaWYgKHNlZF9jbWQtPmJlZ19tYXRjaCkgeworCQkJRy5wcmV2aW91c19yZWdleF9wdHIgPSBzZWRfY21kLT5iZWdfbWF0Y2g7CisJCX0KKworCQkvKiBhY3R1YWwgc2VkZGluZyAqLworCQkvL2JiX2Vycm9yX21zZygicGF0dGVybl9zcGFjZTonJXMnIG5leHRfbGluZTonJXMnIGNtZDolYyIsCisJCS8vcGF0dGVybl9zcGFjZSwgbmV4dF9saW5lLCBzZWRfY21kLT5jbWQpOworCQlzd2l0Y2ggKHNlZF9jbWQtPmNtZCkgeworCisJCS8qIFByaW50IGxpbmUgbnVtYmVyICovCisJCWNhc2UgJz0nOgorCQkJZnByaW50ZihHLm5vbnN0ZG91dCwgIiVkXG4iLCBsaW5lbnVtKTsKKwkJCWJyZWFrOworCisJCS8qIFdyaXRlIHRoZSBjdXJyZW50IHBhdHRlcm4gc3BhY2UgdXAgdG8gdGhlIGZpcnN0IG5ld2xpbmUgKi8KKwkJY2FzZSAnUCc6CisJCXsKKwkJCWNoYXIgKnRtcCA9IHN0cmNocihwYXR0ZXJuX3NwYWNlLCAnXG4nKTsKKwkJCWlmICh0bXApIHsKKwkJCQkqdG1wID0gJ1wwJzsKKwkJCQkvKiBUT0RPOiBleHBsYWluIHdoeSAnXG4nIGJlbG93ICovCisJCQkJc2VkX3B1dHMocGF0dGVybl9zcGFjZSwgJ1xuJyk7CisJCQkJKnRtcCA9ICdcbic7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGYWxsIFRocm91Z2ggKi8KKwkJfQorCisJCS8qIFdyaXRlIHRoZSBjdXJyZW50IHBhdHRlcm4gc3BhY2UgdG8gb3V0cHV0ICovCisJCWNhc2UgJ3AnOgorCQkJLyogTkI6IHdlIHByaW50IHRoaXMgX2JlZm9yZV8gdGhlIGxhc3QgbGluZQorCQkJICogKG9mIGN1cnJlbnQgZmlsZSkgaXMgcHJpbnRlZC4gRXZlbiBpZgorCQkJICogdGhhdCBsaW5lIGlzIG5vbnRlcm1pbmF0ZWQsIHdlIHByaW50CisJCQkgKiAnXG4nIGhlcmUgKGdudSBzZWQgZG9lcyB0aGUgc2FtZSkgKi8KKwkJCXNlZF9wdXRzKHBhdHRlcm5fc3BhY2UsICdcbicpOworCQkJYnJlYWs7CisJCS8qIERlbGV0ZSB1cCB0aHJvdWdoIGZpcnN0IG5ld2xpbmUgKi8KKwkJY2FzZSAnRCc6CisJCXsKKwkJCWNoYXIgKnRtcCA9IHN0cmNocihwYXR0ZXJuX3NwYWNlLCAnXG4nKTsKKwkJCWlmICh0bXApIHsKKwkJCQlvdmVybGFwcGluZ19zdHJjcHkocGF0dGVybl9zcGFjZSwgdG1wICsgMSk7CisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQl9CisJCS8qIGRpc2NhcmQgdGhpcyBsaW5lLiAqLworCQljYXNlICdkJzoKKwkJCWdvdG8gZGlzY2FyZF9saW5lOworCisJCS8qIFN1YnN0aXR1dGUgd2l0aCByZWdleCAqLworCQljYXNlICdzJzoKKwkJCWlmICghZG9fc3Vic3RfY29tbWFuZChzZWRfY21kLCAmcGF0dGVybl9zcGFjZSkpCisJCQkJYnJlYWs7CisJCQlzdWJzdGl0dXRlZCB8PSAxOworCisJCQkvKiBoYW5kbGUgcCBvcHRpb24gKi8KKwkJCWlmIChzZWRfY21kLT5zdWJfcCkKKwkJCQlzZWRfcHV0cyhwYXR0ZXJuX3NwYWNlLCBsYXN0X2dldHNfY2hhcik7CisJCQkvKiBoYW5kbGUgdyBvcHRpb24gKi8KKwkJCWlmIChzZWRfY21kLT5zd19maWxlKQorCQkJCXB1dHNfbWF5YmVfbmV3bGluZSgKKwkJCQkJcGF0dGVybl9zcGFjZSwgc2VkX2NtZC0+c3dfZmlsZSwKKwkJCQkJJnNlZF9jbWQtPnN3X2xhc3RfY2hhciwgbGFzdF9nZXRzX2NoYXIpOworCQkJYnJlYWs7CisKKwkJLyogQXBwZW5kIGxpbmUgdG8gbGlua2VkIGxpc3QgdG8gYmUgcHJpbnRlZCBsYXRlciAqLworCQljYXNlICdhJzoKKwkJCWFwcGVuZChzZWRfY21kLT5zdHJpbmcpOworCQkJYnJlYWs7CisKKwkJLyogSW5zZXJ0IHRleHQgYmVmb3JlIHRoaXMgbGluZSAqLworCQljYXNlICdpJzoKKwkJCXNlZF9wdXRzKHNlZF9jbWQtPnN0cmluZywgJ1xuJyk7CisJCQlicmVhazsKKworCQkvKiBDdXQgYW5kIHBhc3RlIHRleHQgKHJlcGxhY2UpICovCisJCWNhc2UgJ2MnOgorCQkJLyogT25seSB0cmlnZ2VycyBvbiBsYXN0IGxpbmUgb2YgYSBtYXRjaGluZyByYW5nZS4gKi8KKwkJCWlmICghc2VkX2NtZC0+aW5fbWF0Y2gpCisJCQkJc2VkX3B1dHMoc2VkX2NtZC0+c3RyaW5nLCAnXG4nKTsKKwkJCWdvdG8gZGlzY2FyZF9saW5lOworCisJCS8qIFJlYWQgZmlsZSwgYXBwZW5kIGNvbnRlbnRzIHRvIG91dHB1dCAqLworCQljYXNlICdyJzoKKwkJeworCQkJRklMRSAqcmZpbGU7CisJCQlyZmlsZSA9IGZvcGVuX2Zvcl9yZWFkKHNlZF9jbWQtPnN0cmluZyk7CisJCQlpZiAocmZpbGUpIHsKKwkJCQljaGFyICpsaW5lOworCisJCQkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShyZmlsZSkpCisJCQkJCQkhPSBOVUxMKQorCQkJCQlhcHBlbmQobGluZSk7CisJCQkJeHByaW50X2FuZF9jbG9zZV9maWxlKHJmaWxlKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBXcml0ZSBwYXR0ZXJuIHNwYWNlIHRvIGZpbGUuICovCisJCWNhc2UgJ3cnOgorCQkJcHV0c19tYXliZV9uZXdsaW5lKAorCQkJCXBhdHRlcm5fc3BhY2UsIHNlZF9jbWQtPnN3X2ZpbGUsCisJCQkJJnNlZF9jbWQtPnN3X2xhc3RfY2hhciwgbGFzdF9nZXRzX2NoYXIpOworCQkJYnJlYWs7CisKKwkJLyogUmVhZCBuZXh0IGxpbmUgZnJvbSBpbnB1dCAqLworCQljYXNlICduJzoKKwkJCWlmICghRy5iZV9xdWlldCkKKwkJCQlzZWRfcHV0cyhwYXR0ZXJuX3NwYWNlLCBsYXN0X2dldHNfY2hhcik7CisJCQlpZiAobmV4dF9saW5lKSB7CisJCQkJZnJlZShwYXR0ZXJuX3NwYWNlKTsKKwkJCQlwYXR0ZXJuX3NwYWNlID0gbmV4dF9saW5lOworCQkJCWxhc3RfZ2V0c19jaGFyID0gbmV4dF9nZXRzX2NoYXI7CisJCQkJbmV4dF9saW5lID0gZ2V0X25leHRfbGluZSgmbmV4dF9nZXRzX2NoYXIpOworCQkJCXN1YnN0aXR1dGVkID0gMDsKKwkJCQlsaW5lbnVtKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQkvKiBRdWl0LiAgRW5kIG9mIHNjcmlwdCwgZW5kIG9mIGlucHV0LiAqLworCQljYXNlICdxJzoKKwkJCS8qIEV4aXQgdGhlIG91dGVyIHdoaWxlIGxvb3AgKi8KKwkJCWZyZWUobmV4dF9saW5lKTsKKwkJCW5leHRfbGluZSA9IE5VTEw7CisJCQlnb3RvIGRpc2NhcmRfY29tbWFuZHM7CisKKwkJLyogQXBwZW5kIHRoZSBuZXh0IGxpbmUgdG8gdGhlIGN1cnJlbnQgbGluZSAqLworCQljYXNlICdOJzoKKwkJeworCQkJaW50IGxlbjsKKwkJCS8qIElmIG5vIG5leHQgbGluZSwganVtcCB0byBlbmQgb2Ygc2NyaXB0IGFuZCBleGl0LiAqLworCQkJLyogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3NlZC9tYW51YWwvc2VkLmh0bWw6CisJCQkgKiAiTW9zdCB2ZXJzaW9ucyBvZiBzZWQgZXhpdCB3aXRob3V0IHByaW50aW5nIGFueXRoaW5nCisJCQkgKiB3aGVuIHRoZSBOIGNvbW1hbmQgaXMgaXNzdWVkIG9uIHRoZSBsYXN0IGxpbmUgb2YKKwkJCSAqIGEgZmlsZS4gR05VIHNlZCBwcmludHMgcGF0dGVybiBzcGFjZSBiZWZvcmUgZXhpdGluZworCQkJICogdW5sZXNzIG9mIGNvdXJzZSB0aGUgLW4gY29tbWFuZCBzd2l0Y2ggaGFzIGJlZW4KKwkJCSAqIHNwZWNpZmllZC4gVGhpcyBjaG9pY2UgaXMgYnkgZGVzaWduLiIKKwkJCSAqLworCQkJaWYgKG5leHRfbGluZSA9PSBOVUxMKSB7CisJCQkJLy9nb3RvIGRpc2NhcmRfbGluZTsKKwkJCQlnb3RvIGRpc2NhcmRfY29tbWFuZHM7IC8qIEdOVSBiZWhhdmlvciAqLworCQkJfQorCQkJLyogQXBwZW5kIG5leHRfbGluZSwgcmVhZCBuZXcgbmV4dF9saW5lLiAqLworCQkJbGVuID0gc3RybGVuKHBhdHRlcm5fc3BhY2UpOworCQkJcGF0dGVybl9zcGFjZSA9IHhyZWFsbG9jKHBhdHRlcm5fc3BhY2UsIGxlbiArIHN0cmxlbihuZXh0X2xpbmUpICsgMik7CisJCQlwYXR0ZXJuX3NwYWNlW2xlbl0gPSAnXG4nOworCQkJc3RyY3B5KHBhdHRlcm5fc3BhY2UgKyBsZW4rMSwgbmV4dF9saW5lKTsKKwkJCWxhc3RfZ2V0c19jaGFyID0gbmV4dF9nZXRzX2NoYXI7CisJCQluZXh0X2xpbmUgPSBnZXRfbmV4dF9saW5lKCZuZXh0X2dldHNfY2hhcik7CisJCQlsaW5lbnVtKys7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRlc3QvYnJhbmNoIGlmIHN1YnN0aXR1dGlvbiBvY2N1cnJlZCAqLworCQljYXNlICd0JzoKKwkJCWlmICghc3Vic3RpdHV0ZWQpIGJyZWFrOworCQkJc3Vic3RpdHV0ZWQgPSAwOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIFRlc3QvYnJhbmNoIGlmIHN1YnN0aXR1dGlvbiBkaWRuJ3Qgb2NjdXIgKi8KKwkJY2FzZSAnVCc6CisJCQlpZiAoc3Vic3RpdHV0ZWQpIGJyZWFrOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIEJyYW5jaCB0byBsYWJlbCAqLworCQljYXNlICdiJzoKKwkJCWlmICghc2VkX2NtZC0+c3RyaW5nKSBnb3RvIGRpc2NhcmRfY29tbWFuZHM7CisJCQllbHNlIHNlZF9jbWQgPSBicmFuY2hfdG8oc2VkX2NtZC0+c3RyaW5nKTsKKwkJCWJyZWFrOworCQkvKiBUcmFuc2xpdGVyYXRlIGNoYXJhY3RlcnMgKi8KKwkJY2FzZSAneSc6CisJCXsKKwkJCWludCBpLCBqOworCQkJZm9yIChpID0gMDsgcGF0dGVybl9zcGFjZVtpXTsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgc2VkX2NtZC0+c3RyaW5nW2pdOyBqICs9IDIpIHsKKwkJCQkJaWYgKHBhdHRlcm5fc3BhY2VbaV0gPT0gc2VkX2NtZC0+c3RyaW5nW2pdKSB7CisJCQkJCQlwYXR0ZXJuX3NwYWNlW2ldID0gc2VkX2NtZC0+c3RyaW5nW2ogKyAxXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCQljYXNlICdnJzoJLyogUmVwbGFjZSBwYXR0ZXJuIHNwYWNlIHdpdGggaG9sZCBzcGFjZSAqLworCQkJZnJlZShwYXR0ZXJuX3NwYWNlKTsKKwkJCXBhdHRlcm5fc3BhY2UgPSB4c3RyZHVwKEcuaG9sZF9zcGFjZSA/IEcuaG9sZF9zcGFjZSA6ICIiKTsKKwkJCWJyZWFrOworCQljYXNlICdHJzoJLyogQXBwZW5kIG5ld2xpbmUgYW5kIGhvbGQgc3BhY2UgdG8gcGF0dGVybiBzcGFjZSAqLworCQl7CisJCQlpbnQgcGF0dGVybl9zcGFjZV9zaXplID0gMjsKKwkJCWludCBob2xkX3NwYWNlX3NpemUgPSAwOworCisJCQlpZiAocGF0dGVybl9zcGFjZSkKKwkJCQlwYXR0ZXJuX3NwYWNlX3NpemUgKz0gc3RybGVuKHBhdHRlcm5fc3BhY2UpOworCQkJaWYgKEcuaG9sZF9zcGFjZSkKKwkJCQlob2xkX3NwYWNlX3NpemUgPSBzdHJsZW4oRy5ob2xkX3NwYWNlKTsKKwkJCXBhdHRlcm5fc3BhY2UgPSB4cmVhbGxvYyhwYXR0ZXJuX3NwYWNlLAorCQkJCQlwYXR0ZXJuX3NwYWNlX3NpemUgKyBob2xkX3NwYWNlX3NpemUpOworCQkJaWYgKHBhdHRlcm5fc3BhY2Vfc2l6ZSA9PSAyKQorCQkJCXBhdHRlcm5fc3BhY2VbMF0gPSAwOworCQkJc3RyY2F0KHBhdHRlcm5fc3BhY2UsICJcbiIpOworCQkJaWYgKEcuaG9sZF9zcGFjZSkKKwkJCQlzdHJjYXQocGF0dGVybl9zcGFjZSwgRy5ob2xkX3NwYWNlKTsKKwkJCWxhc3RfZ2V0c19jaGFyID0gJ1xuJzsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAnaCc6CS8qIFJlcGxhY2UgaG9sZCBzcGFjZSB3aXRoIHBhdHRlcm4gc3BhY2UgKi8KKwkJCWZyZWUoRy5ob2xkX3NwYWNlKTsKKwkJCUcuaG9sZF9zcGFjZSA9IHhzdHJkdXAocGF0dGVybl9zcGFjZSk7CisJCQlicmVhazsKKwkJY2FzZSAnSCc6CS8qIEFwcGVuZCBuZXdsaW5lIGFuZCBwYXR0ZXJuIHNwYWNlIHRvIGhvbGQgc3BhY2UgKi8KKwkJeworCQkJaW50IGhvbGRfc3BhY2Vfc2l6ZSA9IDI7CisJCQlpbnQgcGF0dGVybl9zcGFjZV9zaXplID0gMDsKKworCQkJaWYgKEcuaG9sZF9zcGFjZSkKKwkJCQlob2xkX3NwYWNlX3NpemUgKz0gc3RybGVuKEcuaG9sZF9zcGFjZSk7CisJCQlpZiAocGF0dGVybl9zcGFjZSkKKwkJCQlwYXR0ZXJuX3NwYWNlX3NpemUgPSBzdHJsZW4ocGF0dGVybl9zcGFjZSk7CisJCQlHLmhvbGRfc3BhY2UgPSB4cmVhbGxvYyhHLmhvbGRfc3BhY2UsCisJCQkJCWhvbGRfc3BhY2Vfc2l6ZSArIHBhdHRlcm5fc3BhY2Vfc2l6ZSk7CisKKwkJCWlmIChob2xkX3NwYWNlX3NpemUgPT0gMikKKwkJCQkqRy5ob2xkX3NwYWNlID0gMDsKKwkJCXN0cmNhdChHLmhvbGRfc3BhY2UsICJcbiIpOworCQkJaWYgKHBhdHRlcm5fc3BhY2UpCisJCQkJc3RyY2F0KEcuaG9sZF9zcGFjZSwgcGF0dGVybl9zcGFjZSk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ3gnOiAvKiBFeGNoYW5nZSBob2xkIGFuZCBwYXR0ZXJuIHNwYWNlICovCisJCXsKKwkJCWNoYXIgKnRtcCA9IHBhdHRlcm5fc3BhY2U7CisJCQlwYXR0ZXJuX3NwYWNlID0gRy5ob2xkX3NwYWNlID8gRy5ob2xkX3NwYWNlIDogeHphbGxvYygxKTsKKwkJCWxhc3RfZ2V0c19jaGFyID0gJ1xuJzsKKwkJCUcuaG9sZF9zcGFjZSA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJCX0gLyogc3dpdGNoICovCisJfSAvKiBmb3IgZWFjaCBjbWQgKi8KKworCS8qCisJICogRXhpdCBwb2ludCBmcm9tIHNlZGRpbmcuLi4KKwkgKi8KKyBkaXNjYXJkX2NvbW1hbmRzOgorCS8qIHdlIHdpbGwgcHJpbnQgdGhlIGxpbmUgdW5sZXNzIHdlIHdlcmUgdG9sZCB0byBiZSBxdWlldCAoJy1uJykKKwkgICBvciBpZiB0aGUgbGluZSB3YXMgc3VwcHJlc3NlZCAoYWxhICdkJ2VsZXRlKSAqLworCWlmICghRy5iZV9xdWlldCkKKwkJc2VkX3B1dHMocGF0dGVybl9zcGFjZSwgbGFzdF9nZXRzX2NoYXIpOworCisJLyogRGVsZXRlIGFuZCBzdWNoIGp1bXAgaGVyZS4gKi8KKyBkaXNjYXJkX2xpbmU6CisJZmx1c2hfYXBwZW5kKCk7CisJZnJlZShwYXR0ZXJuX3NwYWNlKTsKKworCWdvdG8gYWdhaW47Cit9CisKKy8qIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2l0aCBlbWJlZGRlZAorICogbmV3bGluZXMuICBUaGlzIGNvdW50cyBhcyBtdWx0aXBsZSBjb21tYW5kIGxpbmVzLgorICogSG93ZXZlciwgbmV3bGluZSBjYW4gYmUgZXNjYXBlZDogJ3MvZS96XDxuZXdsaW5lPnovJworICogV2UgY2hlY2sgZm9yIHRoaXMuCisgKi8KKworc3RhdGljIHZvaWQgYWRkX2NtZF9ibG9jayhjaGFyICpjbWRzdHIpCit7CisJY2hhciAqc3YsICplb2w7CisKKwljbWRzdHIgPSBzdiA9IHhzdHJkdXAoY21kc3RyKTsKKwlkbyB7CisJCWVvbCA9IHN0cmNocihjbWRzdHIsICdcbicpOworIG5leHQ6CisJCWlmIChlb2wpIHsKKwkJCS8qIENvdW50IHByZWNlZGluZyBzbGFzaGVzICovCisJCQlpbnQgc2xhc2hlcyA9IDA7CisJCQljaGFyICpzbCA9IGVvbDsKKworCQkJd2hpbGUgKHNsICE9IGNtZHN0ciAmJiAqLS1zbCA9PSAnXFwnKQorCQkJCXNsYXNoZXMrKzsKKwkJCS8qIE9kZCBudW1iZXIgb2YgcHJlY2VkaW5nIHNsYXNoZXMgLSBuZXdsaW5lIGlzIGVzY2FwZWQgKi8KKwkJCWlmIChzbGFzaGVzICYgMSkgeworCQkJCW92ZXJsYXBwaW5nX3N0cmNweShlb2wgLSAxLCBlb2wpOworCQkJCWVvbCA9IHN0cmNocihlb2wsICdcbicpOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCSplb2wgPSAnXDAnOworCQl9CisJCWFkZF9jbWQoY21kc3RyKTsKKwkJY21kc3RyID0gZW9sICsgMTsKKwl9IHdoaWxlIChlb2wpOworCWZyZWUoc3YpOworfQorCitpbnQgc2VkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwlsbGlzdF90ICpvcHRfZSwgKm9wdF9mOworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisKKwlJTklUX0coKTsKKworCS8qIGRlc3Ryb3kgY29tbWFuZCBzdHJpbmdzIG9uIGV4aXQgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGF0ZXhpdChzZWRfZnJlZV9hbmRfY2xvc2Vfc3R1ZmYpOworCisJLyogTGllIHRvIGF1dG9jb25mIHdoZW4gaXQgc3RhcnRzIGFza2luZyBzdHVwaWQgcXVlc3Rpb25zLiAqLworCWlmIChhcmd2WzFdICYmICFzdHJjbXAoYXJndlsxXSwgIi0tdmVyc2lvbiIpKSB7CisJCXB1dHMoIlRoaXMgaXMgbm90IEdOVSBzZWQgdmVyc2lvbiA0LjAiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZG8gbm9ybWFsIG9wdGlvbiBwYXJzaW5nICovCisJb3B0X2UgPSBvcHRfZiA9IE5VTEw7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZTo6Zjo6IiAvKiBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgKi8KKwkgICAgICAgICAgICAgICAgICAgICJubiI7IC8qIGNvdW50IC1uICovCisJLyogLWkgbXVzdCBiZSBmaXJzdCwgdG8gbWF0Y2ggT1BUX2luX3BsYWNlIGRlZmluaXRpb24gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiaXJuZTpmOiIsICZvcHRfZSwgJm9wdF9mLAorCQkJICAgICZHLmJlX3F1aWV0KTsgLyogY291bnRlciBmb3IgLW4gKi8KKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiBPUFRfaW5fcGxhY2UpIHsgLy8gLWkKKwkJYXRleGl0KGNsZWFudXBfb3V0bmFtZSk7CisJfQorCWlmIChvcHQgJiAweDIpIEcucmVnZXhfdHlwZSB8PSBSRUdfRVhURU5ERUQ7IC8vIC1yCisJLy9pZiAob3B0ICYgMHg0KSBHLmJlX3F1aWV0Kys7IC8vIC1uCisJd2hpbGUgKG9wdF9lKSB7IC8vIC1lCisJCWFkZF9jbWRfYmxvY2sobGxpc3RfcG9wKCZvcHRfZSkpOworCX0KKwl3aGlsZSAob3B0X2YpIHsgLy8gLWYKKwkJY2hhciAqbGluZTsKKwkJRklMRSAqY21kZmlsZTsKKwkJY21kZmlsZSA9IHhmb3Blbl9mb3JfcmVhZChsbGlzdF9wb3AoJm9wdF9mKSk7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoY21kZmlsZSkpICE9IE5VTEwpIHsKKwkJCWFkZF9jbWQobGluZSk7CisJCQlmcmVlKGxpbmUpOworCQl9CisJCWZjbG9zZShjbWRmaWxlKTsKKwl9CisJLyogaWYgd2UgZGlkbid0IGdldCBhIHBhdHRlcm4gZnJvbSAtZSBvciAtZiwgdXNlIGFyZ3ZbMF0gKi8KKwlpZiAoIShvcHQgJiAweDE4KSkgeworCQlpZiAoISphcmd2KQorCQkJYmJfc2hvd191c2FnZSgpOworCQlhZGRfY21kX2Jsb2NrKCphcmd2KyspOworCX0KKwkvKiBGbHVzaCBhbnkgdW5maW5pc2hlZCBjb21tYW5kcy4gKi8KKwlhZGRfY21kKCIiKTsKKworCS8qIEJ5IGRlZmF1bHQsIHdlIHdyaXRlIHRvIHN0ZG91dCAqLworCUcubm9uc3Rkb3V0ID0gc3Rkb3V0OworCisJLyogYXJndlswLi4oYXJnYy0xKV0gc2hvdWxkIGJlIG5hbWVzIG9mIGZpbGUgdG8gcHJvY2Vzcy4gSWYgbm8KKwkgKiBmaWxlcyB3ZXJlIHNwZWNpZmllZCBvciAnLScgd2FzIHNwZWNpZmllZCwgdGFrZSBpbnB1dCBmcm9tIHN0ZGluLgorCSAqIE90aGVyd2lzZSwgd2UgcHJvY2VzcyBhbGwgdGhlIGZpbGVzIHNwZWNpZmllZC4gKi8KKwlpZiAoYXJndlswXSA9PSBOVUxMKSB7CisJCWlmIChvcHQgJiBPUFRfaW5fcGxhY2UpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCAiLWkiKTsKKwkJYWRkX2lucHV0X2ZpbGUoc3RkaW4pOworCX0gZWxzZSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwkJCWludCBub25zdGRvdXRmZDsKKwkJCUZJTEUgKmZpbGU7CisJCQlzZWRfY21kX3QgKnNlZF9jbWQ7CisKKwkJCWlmIChMT05FX0RBU0goYXJndltpXSkgJiYgIShvcHQgJiBPUFRfaW5fcGxhY2UpKSB7CisJCQkJYWRkX2lucHV0X2ZpbGUoc3RkaW4pOworCQkJCXByb2Nlc3NfZmlsZXMoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZpbGUgPSBmb3Blbl9vcl93YXJuKGFyZ3ZbaV0sICJyIik7CisJCQlpZiAoIWZpbGUpIHsKKwkJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlhZGRfaW5wdXRfZmlsZShmaWxlKTsKKwkJCWlmICghKG9wdCAmIE9QVF9pbl9wbGFjZSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogLWk6IHByb2Nlc3MgZWFjaCBGSUxFIHNlcGFyYXRlbHk6ICovCisKKwkJCUcub3V0bmFtZSA9IHhhc3ByaW50ZigiJXNYWFhYWFgiLCBhcmd2W2ldKTsKKwkJCW5vbnN0ZG91dGZkID0geG1rc3RlbXAoRy5vdXRuYW1lKTsKKwkJCUcubm9uc3Rkb3V0ID0geGZkb3Blbl9mb3Jfd3JpdGUobm9uc3Rkb3V0ZmQpOworCisJCQkvKiBTZXQgcGVybWlzc2lvbnMvb3duZXIgb2Ygb3V0cHV0IGZpbGUgKi8KKwkJCWZzdGF0KGZpbGVubyhmaWxlKSwgJnN0YXRidWYpOworCQkJLyogY2htb2QnaW5nIEFGVEVSIGNob3duIHdvdWxkIHByZXNlcnZlIHN1aWQvc2dpZCBiaXRzLAorCQkJICogYnV0IEdOVSBzZWQgNC4yLjEgZG9lcyBub3QgcHJlc2VydmUgdGhlbSBlaXRoZXIgKi8KKwkJCWZjaG1vZChub25zdGRvdXRmZCwgc3RhdGJ1Zi5zdF9tb2RlKTsKKwkJCWZjaG93bihub25zdGRvdXRmZCwgc3RhdGJ1Zi5zdF91aWQsIHN0YXRidWYuc3RfZ2lkKTsKKworCQkJcHJvY2Vzc19maWxlcygpOworCQkJZmNsb3NlKEcubm9uc3Rkb3V0KTsKKwkJCUcubm9uc3Rkb3V0ID0gc3Rkb3V0OworCisJCQkvKiB1bmxpbmsoYXJndltpXSk7ICovCisJCQl4cmVuYW1lKEcub3V0bmFtZSwgYXJndltpXSk7CisJCQlmcmVlKEcub3V0bmFtZSk7CisJCQlHLm91dG5hbWUgPSBOVUxMOworCisJCQkvKiBSZS1lbmFibGUgZGlzYWJsZWQgcmFuZ2UgbWF0Y2hlcyAqLworCQkJZm9yIChzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7IHNlZF9jbWQ7IHNlZF9jbWQgPSBzZWRfY21kLT5uZXh0KSB7CisJCQkJc2VkX2NtZC0+YmVnX2xpbmUgPSBzZWRfY21kLT5iZWdfbGluZV9vcmlnOworCQkJfQorCQl9CisJCS8qIEhlcmUsIHRvIGhhbmRsZSAic2VkICdjbWRzJyBub25leGlzdGVudF9maWxlIiBjYXNlIHdlIGRpZDoKKwkJICogaWYgKEcuY3VycmVudF9pbnB1dF9maWxlID49IEcuaW5wdXRfZmlsZV9jb3VudCkKKwkJICoJcmV0dXJuIHN0YXR1czsKKwkJICogYnV0IGl0J3Mgbm90IG5lZWRlZCBzaW5jZSBwcm9jZXNzX2ZpbGVzKCkgd29ya3MgY29ycmVjdGx5CisJCSAqIGluIHRoaXMgY2FzZSB0b28uICovCisJfQorCXByb2Nlc3NfZmlsZXMoKTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9lZGl0b3JzL3NlZDFsaW5lLnR4dCBiL2VkaXRvcnMvc2VkMWxpbmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTJlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL3NlZDFsaW5lLnR4dApAQCAtMCwwICsxLDQyNSBAQAoraHR0cDovL3d3dy5zdHVkZW50Lm5vcnRocGFyay5lZHUvcGVtZW50ZS9zZWQvc2VkMWxpbmUudHh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIQU5EWSBPTkUtTElORVJTIEZPUiBTRUQgKFVuaXggc3RyZWFtIGVkaXRvcikgICAgICAgICAgICAgICBBcHIuIDI2LCAyMDA0Citjb21waWxlZCBieSBFcmljIFBlbWVudCAtIHBlbWVudGVbYXRdbm9ydGhwYXJrW2RvdF1lZHUgICAgICAgIHZlcnNpb24gNS40CitMYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgdXN1YWxseSBhdDoKKyAgIGh0dHA6Ly9zZWQuc291cmNlZm9yZ2UubmV0L3NlZDFsaW5lLnR4dAorICAgaHR0cDovL3d3dy5zdHVkZW50Lm5vcnRocGFyay5lZHUvcGVtZW50ZS9zZWQvc2VkMWxpbmUudHh0CitUaGlzIGZpbGUgaXMgYWxzbyBhdmFpbGFibGUgaW4gUG9ydHVndWVzZSBhdDoKKyAgIGh0dHA6Ly93d3cubHJ2LnVmc2MuYnIvd21ha2VyL3NlZF9wdEJSLmh0bWwKKworRklMRSBTUEFDSU5HOgorCisgIyBkb3VibGUgc3BhY2UgYSBmaWxlCisgc2VkIEcKKworICMgZG91YmxlIHNwYWNlIGEgZmlsZSB3aGljaCBhbHJlYWR5IGhhcyBibGFuayBsaW5lcyBpbiBpdC4gT3V0cHV0IGZpbGUKKyAjIHNob3VsZCBjb250YWluIG5vIG1vcmUgdGhhbiBvbmUgYmxhbmsgbGluZSBiZXR3ZWVuIGxpbmVzIG9mIHRleHQuCisgc2VkICcvXiQvZDtHJworCisgIyB0cmlwbGUgc3BhY2UgYSBmaWxlCisgc2VkICdHO0cnCisKKyAjIHVuZG8gZG91YmxlLXNwYWNpbmcgKGFzc3VtZXMgZXZlbi1udW1iZXJlZCBsaW5lcyBhcmUgYWx3YXlzIGJsYW5rKQorIHNlZCAnbjtkJworCisgIyBpbnNlcnQgYSBibGFuayBsaW5lIGFib3ZlIGV2ZXJ5IGxpbmUgd2hpY2ggbWF0Y2hlcyAicmVnZXgiCisgc2VkICcvcmVnZXgve3g7cDt4O30nCisKKyAjIGluc2VydCBhIGJsYW5rIGxpbmUgYmVsb3cgZXZlcnkgbGluZSB3aGljaCBtYXRjaGVzICJyZWdleCIKKyBzZWQgJy9yZWdleC9HJworCisgIyBpbnNlcnQgYSBibGFuayBsaW5lIGFib3ZlIGFuZCBiZWxvdyBldmVyeSBsaW5lIHdoaWNoIG1hdGNoZXMgInJlZ2V4IgorIHNlZCAnL3JlZ2V4L3t4O3A7eDtHO30nCisKK05VTUJFUklORzoKKworICMgbnVtYmVyIGVhY2ggbGluZSBvZiBhIGZpbGUgKHNpbXBsZSBsZWZ0IGFsaWdubWVudCkuIFVzaW5nIGEgdGFiIChzZWUKKyAjIG5vdGUgb24gJ1x0JyBhdCBlbmQgb2YgZmlsZSkgaW5zdGVhZCBvZiBzcGFjZSB3aWxsIHByZXNlcnZlIG1hcmdpbnMuCisgc2VkID0gZmlsZW5hbWUgfCBzZWQgJ047cy9cbi9cdC8nCisKKyAjIG51bWJlciBlYWNoIGxpbmUgb2YgYSBmaWxlIChudW1iZXIgb24gbGVmdCwgcmlnaHQtYWxpZ25lZCkKKyBzZWQgPSBmaWxlbmFtZSB8IHNlZCAnTjsgcy9eLyAgICAgLzsgcy8gKlwoLlx7NixcfVwpXG4vXDEgIC8nCisKKyAjIG51bWJlciBlYWNoIGxpbmUgb2YgZmlsZSwgYnV0IG9ubHkgcHJpbnQgbnVtYmVycyBpZiBsaW5lIGlzIG5vdCBibGFuaworIHNlZCAnLy4vPScgZmlsZW5hbWUgfCBzZWQgJy8uL047IHMvXG4vIC8nCisKKyAjIGNvdW50IGxpbmVzIChlbXVsYXRlcyAid2MgLWwiKQorIHNlZCAtbiAnJD0nCisKK1RFWFQgQ09OVkVSU0lPTiBBTkQgU1VCU1RJVFVUSU9OOgorCisgIyBJTiBVTklYIEVOVklST05NRU5UOiBjb252ZXJ0IERPUyBuZXdsaW5lcyAoQ1IvTEYpIHRvIFVuaXggZm9ybWF0Cisgc2VkICdzLy4kLy8nICAgICAgICAgICAgICAgIyBhc3N1bWVzIHRoYXQgYWxsIGxpbmVzIGVuZCB3aXRoIENSL0xGCisgc2VkICdzL15NJC8vJyAgICAgICAgICAgICAgIyBpbiBiYXNoL3Rjc2gsIHByZXNzIEN0cmwtViB0aGVuIEN0cmwtTQorIHNlZCAncy9ceDBEJC8vJyAgICAgICAgICAgICMgZ3NlZCAzLjAyLjgwLCBidXQgdG9wIHNjcmlwdCBpcyBlYXNpZXIKKworICMgSU4gVU5JWCBFTlZJUk9OTUVOVDogY29udmVydCBVbml4IG5ld2xpbmVzIChMRikgdG8gRE9TIGZvcm1hdAorIHNlZCAicy8kL2BlY2hvIC1lIFxcXHJgLyIgICAgICAgICAgICAjIGNvbW1hbmQgbGluZSB1bmRlciBrc2gKKyBzZWQgJ3MvJCciL2BlY2hvIFxcXHJgLyIgICAgICAgICAgICAgIyBjb21tYW5kIGxpbmUgdW5kZXIgYmFzaAorIHNlZCAicy8kL2BlY2hvIFxcXHJgLyIgICAgICAgICAgICAgICAjIGNvbW1hbmQgbGluZSB1bmRlciB6c2gKKyBzZWQgJ3MvJC9cci8nICAgICAgICAgICAgICAgICAgICAgICAgIyBnc2VkIDMuMDIuODAKKworICMgSU4gRE9TIEVOVklST05NRU5UOiBjb252ZXJ0IFVuaXggbmV3bGluZXMgKExGKSB0byBET1MgZm9ybWF0Cisgc2VkICJzLyQvLyIgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgLW4gcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMgorCisgIyBJTiBET1MgRU5WSVJPTk1FTlQ6IGNvbnZlcnQgRE9TIG5ld2xpbmVzIChDUi9MRikgdG8gVW5peCBmb3JtYXQKKyAjIENhbiBvbmx5IGJlIGRvbmUgd2l0aCBVbnhVdGlscyBzZWQsIHZlcnNpb24gNC4wLjcgb3IgaGlnaGVyLgorICMgQ2Fubm90IGJlIGRvbmUgd2l0aCBvdGhlciBET1MgdmVyc2lvbnMgb2Ygc2VkLiBVc2UgInRyIiBpbnN0ZWFkLgorIHNlZCAicy9cci8vIiBpbmZpbGUgPm91dGZpbGUgICAgICAgICAjIFVueFV0aWxzIHNlZCB2NC4wLjcgb3IgaGlnaGVyCisgdHIgLWQgXHIgPGluZmlsZSA+b3V0ZmlsZSAgICAgICAgICAgICMgR05VIHRyIHZlcnNpb24gMS4yMiBvciBoaWdoZXIKKworICMgZGVsZXRlIGxlYWRpbmcgd2hpdGVzcGFjZSAoc3BhY2VzLCB0YWJzKSBmcm9tIGZyb250IG9mIGVhY2ggbGluZQorICMgYWxpZ25zIGFsbCB0ZXh0IGZsdXNoIGxlZnQKKyBzZWQgJ3MvXlsgXHRdKi8vJyAgICAgICAgICAgICAgICAgICAgIyBzZWUgbm90ZSBvbiAnXHQnIGF0IGVuZCBvZiBmaWxlCisKKyAjIGRlbGV0ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIChzcGFjZXMsIHRhYnMpIGZyb20gZW5kIG9mIGVhY2ggbGluZQorIHNlZCAncy9bIFx0XSokLy8nICAgICAgICAgICAgICAgICAgICAjIHNlZSBub3RlIG9uICdcdCcgYXQgZW5kIG9mIGZpbGUKKworICMgZGVsZXRlIEJPVEggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZQorIHNlZCAncy9eWyBcdF0qLy87cy9bIFx0XSokLy8nCisKKyAjIGluc2VydCA1IGJsYW5rIHNwYWNlcyBhdCBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIChtYWtlIHBhZ2Ugb2Zmc2V0KQorIHNlZCAncy9eLyAgICAgLycKKworICMgYWxpZ24gYWxsIHRleHQgZmx1c2ggcmlnaHQgb24gYSA3OS1jb2x1bW4gd2lkdGgKKyBzZWQgLWUgOmEgLWUgJ3MvXi5cezEsNzhcfSQvICYvO3RhJyAgIyBzZXQgYXQgNzggcGx1cyAxIHNwYWNlCisKKyAjIGNlbnRlciBhbGwgdGV4dCBpbiB0aGUgbWlkZGxlIG9mIDc5LWNvbHVtbiB3aWR0aC4gSW4gbWV0aG9kIDEsCisgIyBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBhcmUgc2lnbmlmaWNhbnQsIGFuZCB0cmFpbGluZworICMgc3BhY2VzIGFyZSBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBJbiBtZXRob2QgMiwgc3BhY2VzIGF0CisgIyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGFyZSBkaXNjYXJkZWQgaW4gY2VudGVyaW5nIHRoZSBsaW5lLCBhbmQKKyAjIG5vIHRyYWlsaW5nIHNwYWNlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiBsaW5lcy4KKyBzZWQgIC1lIDphIC1lICdzL14uXHsxLDc3XH0kLyAmIC87dGEnICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAgLWUgOmEgLWUgJ3MvXi5cezEsNzdcfSQvICYvO3RhJyAtZSAncy9cKCAqXClcMS9cMS8nICAjIG1ldGhvZCAyCisKKyAjIHN1YnN0aXR1dGUgKGZpbmQgYW5kIHJlcGxhY2UpICJmb28iIHdpdGggImJhciIgb24gZWFjaCBsaW5lCisgc2VkICdzL2Zvby9iYXIvJyAgICAgICAgICAgICAjIHJlcGxhY2VzIG9ubHkgMXN0IGluc3RhbmNlIGluIGEgbGluZQorIHNlZCAncy9mb28vYmFyLzQnICAgICAgICAgICAgIyByZXBsYWNlcyBvbmx5IDR0aCBpbnN0YW5jZSBpbiBhIGxpbmUKKyBzZWQgJ3MvZm9vL2Jhci9nJyAgICAgICAgICAgICMgcmVwbGFjZXMgQUxMIGluc3RhbmNlcyBpbiBhIGxpbmUKKyBzZWQgJ3MvXCguKlwpZm9vXCguKmZvb1wpL1wxYmFyXDIvJyAjIHJlcGxhY2UgdGhlIG5leHQtdG8tbGFzdCBjYXNlCisgc2VkICdzL1woLipcKWZvby9cMWJhci8nICAgICAgICAgICAgIyByZXBsYWNlIG9ubHkgdGhlIGxhc3QgY2FzZQorCisgIyBzdWJzdGl0dXRlICJmb28iIHdpdGggImJhciIgT05MWSBmb3IgbGluZXMgd2hpY2ggY29udGFpbiAiYmF6IgorIHNlZCAnL2Jhei9zL2Zvby9iYXIvZycKKworICMgc3Vic3RpdHV0ZSAiZm9vIiB3aXRoICJiYXIiIEVYQ0VQVCBmb3IgbGluZXMgd2hpY2ggY29udGFpbiAiYmF6IgorIHNlZCAnL2Jhei8hcy9mb28vYmFyL2cnCisKKyAjIGNoYW5nZSAic2NhcmxldCIgb3IgInJ1YnkiIG9yICJwdWNlIiB0byAicmVkIgorIHNlZCAncy9zY2FybGV0L3JlZC9nO3MvcnVieS9yZWQvZztzL3B1Y2UvcmVkL2cnICAgIyBtb3N0IHNlZHMKKyBnc2VkICdzL3NjYXJsZXRcfHJ1YnlcfHB1Y2UvcmVkL2cnICAgICAgICAgICAgICAgICMgR05VIHNlZCBvbmx5CisKKyAjIHJldmVyc2Ugb3JkZXIgb2YgbGluZXMgKGVtdWxhdGVzICJ0YWMiKQorICMgYnVnL2ZlYXR1cmUgaW4gSEhzZWQgdjEuNSBjYXVzZXMgYmxhbmsgbGluZXMgdG8gYmUgZGVsZXRlZAorIHNlZCAnMSFHO2g7JCFkJyAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgLW4gJzEhRztoOyRwJyAgICAgICAgICAgICAjIG1ldGhvZCAyCisKKyAjIHJldmVyc2UgZWFjaCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUgKGVtdWxhdGVzICJyZXYiKQorIHNlZCAnL1xuLyFHO3MvXCguXClcKC4qXG5cKS8mXDJcMS87Ly9EO3MvLi8vJworCisgIyBqb2luIHBhaXJzIG9mIGxpbmVzIHNpZGUtYnktc2lkZSAobGlrZSAicGFzdGUiKQorIHNlZCAnJCFOO3MvXG4vIC8nCisKKyAjIGlmIGEgbGluZSBlbmRzIHdpdGggYSBiYWNrc2xhc2gsIGFwcGVuZCB0aGUgbmV4dCBsaW5lIHRvIGl0Cisgc2VkIC1lIDphIC1lICcvXFwkL047IHMvXFxcbi8vOyB0YScKKworICMgaWYgYSBsaW5lIGJlZ2lucyB3aXRoIGFuIGVxdWFsIHNpZ24sIGFwcGVuZCBpdCB0byB0aGUgcHJldmlvdXMgbGluZQorICMgYW5kIHJlcGxhY2UgdGhlICI9IiB3aXRoIGEgc2luZ2xlIHNwYWNlCisgc2VkIC1lIDphIC1lICckIU47cy9cbj0vIC87dGEnIC1lICdQO0QnCisKKyAjIGFkZCBjb21tYXMgdG8gbnVtZXJpYyBzdHJpbmdzLCBjaGFuZ2luZyAiMTIzNDU2NyIgdG8gIjEsMjM0LDU2NyIKKyBnc2VkICc6YTtzL1xCWzAtOV1cezNcfVw+LywmLzt0YScgICAgICAgICAgICAgICAgICAgICAjIEdOVSBzZWQKKyBzZWQgLWUgOmEgLWUgJ3MvXCguKlswLTldXClcKFswLTldXHszXH1cKS9cMSxcMi87dGEnICAjIG90aGVyIHNlZHMKKworICMgYWRkIGNvbW1hcyB0byBudW1iZXJzIHdpdGggZGVjaW1hbCBwb2ludHMgYW5kIG1pbnVzIHNpZ25zIChHTlUgc2VkKQorIGdzZWQgJzphO3MvXCheXHxbXjAtOS5dXClcKFswLTldXCtcKVwoWzAtOV1cezNcfVwpL1wxXDIsXDMvZzt0YScKKworICMgYWRkIGEgYmxhbmsgbGluZSBldmVyeSA1IGxpbmVzIChhZnRlciBsaW5lcyA1LCAxMCwgMTUsIDIwLCBldGMuKQorIGdzZWQgJzB+NUcnICAgICAgICAgICAgICAgICAgIyBHTlUgc2VkIG9ubHkKKyBzZWQgJ247bjtuO247RzsnICAgICAgICAgICAgICMgb3RoZXIgc2VkcworCitTRUxFQ1RJVkUgUFJJTlRJTkcgT0YgQ0VSVEFJTiBMSU5FUzoKKworICMgcHJpbnQgZmlyc3QgMTAgbGluZXMgb2YgZmlsZSAoZW11bGF0ZXMgYmVoYXZpb3Igb2YgImhlYWQiKQorIHNlZCAxMHEKKworICMgcHJpbnQgZmlyc3QgbGluZSBvZiBmaWxlIChlbXVsYXRlcyAiaGVhZCAtMSIpCisgc2VkIHEKKworICMgcHJpbnQgdGhlIGxhc3QgMTAgbGluZXMgb2YgYSBmaWxlIChlbXVsYXRlcyAidGFpbCIpCisgc2VkIC1lIDphIC1lICckcTtOOzExLCREO2JhJworCisgIyBwcmludCB0aGUgbGFzdCAyIGxpbmVzIG9mIGEgZmlsZSAoZW11bGF0ZXMgInRhaWwgLTIiKQorIHNlZCAnJCFOOyQhRCcKKworICMgcHJpbnQgdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgKGVtdWxhdGVzICJ0YWlsIC0xIikKKyBzZWQgJyQhZCcgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgLW4gJyRwJyAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDIKKworICMgcHJpbnQgb25seSBsaW5lcyB3aGljaCBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb24gKGVtdWxhdGVzICJncmVwIikKKyBzZWQgLW4gJy9yZWdleHAvcCcgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgJy9yZWdleHAvIWQnICAgICAgICAgICAgICMgbWV0aG9kIDIKKworICMgcHJpbnQgb25seSBsaW5lcyB3aGljaCBkbyBOT1QgbWF0Y2ggcmVnZXhwIChlbXVsYXRlcyAiZ3JlcCAtdiIpCisgc2VkIC1uICcvcmVnZXhwLyFwJyAgICAgICAgICAjIG1ldGhvZCAxLCBjb3JyZXNwb25kcyB0byBhYm92ZQorIHNlZCAnL3JlZ2V4cC9kJyAgICAgICAgICAgICAgIyBtZXRob2QgMiwgc2ltcGxlciBzeW50YXgKKworICMgcHJpbnQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVmb3JlIGEgcmVnZXhwLCBidXQgbm90IHRoZSBsaW5lCisgIyBjb250YWluaW5nIHRoZSByZWdleHAKKyBzZWQgLW4gJy9yZWdleHAve2c7MSFwO307aCcKKworICMgcHJpbnQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgYSByZWdleHAsIGJ1dCBub3QgdGhlIGxpbmUKKyAjIGNvbnRhaW5pbmcgdGhlIHJlZ2V4cAorIHNlZCAtbiAnL3JlZ2V4cC97bjtwO30nCisKKyAjIHByaW50IDEgbGluZSBvZiBjb250ZXh0IGJlZm9yZSBhbmQgYWZ0ZXIgcmVnZXhwLCB3aXRoIGxpbmUgbnVtYmVyCisgIyBpbmRpY2F0aW5nIHdoZXJlIHRoZSByZWdleHAgb2NjdXJyZWQgKHNpbWlsYXIgdG8gImdyZXAgLUExIC1CMSIpCisgc2VkIC1uIC1lICcvcmVnZXhwL3s9O3g7MSFwO2c7JCFOO3A7RDt9JyAtZSBoCisKKyAjIGdyZXAgZm9yIEFBQSBhbmQgQkJCIGFuZCBDQ0MgKGluIGFueSBvcmRlcikKKyBzZWQgJy9BQUEvIWQ7IC9CQkIvIWQ7IC9DQ0MvIWQnCisKKyAjIGdyZXAgZm9yIEFBQSBhbmQgQkJCIGFuZCBDQ0MgKGluIHRoYXQgb3JkZXIpCisgc2VkICcvQUFBLipCQkIuKkNDQy8hZCcKKworICMgZ3JlcCBmb3IgQUFBIG9yIEJCQiBvciBDQ0MgKGVtdWxhdGVzICJlZ3JlcCIpCisgc2VkIC1lICcvQUFBL2InIC1lICcvQkJCL2InIC1lICcvQ0NDL2InIC1lIGQgICAgIyBtb3N0IHNlZHMKKyBnc2VkICcvQUFBXHxCQkJcfENDQy8hZCcgICAgICAgICAgICAgICAgICAgICAgICAjIEdOVSBzZWQgb25seQorCisgIyBwcmludCBwYXJhZ3JhcGggaWYgaXQgY29udGFpbnMgQUFBIChibGFuayBsaW5lcyBzZXBhcmF0ZSBwYXJhZ3JhcGhzKQorICMgSEhzZWQgdjEuNSBtdXN0IGluc2VydCBhICdHOycgYWZ0ZXIgJ3g7JyBpbiB0aGUgbmV4dCAzIHNjcmlwdHMgYmVsb3cKKyBzZWQgLWUgJy8uL3tIOyQhZDt9JyAtZSAneDsvQUFBLyFkOycKKworICMgcHJpbnQgcGFyYWdyYXBoIGlmIGl0IGNvbnRhaW5zIEFBQSBhbmQgQkJCIGFuZCBDQ0MgKGluIGFueSBvcmRlcikKKyBzZWQgLWUgJy8uL3tIOyQhZDt9JyAtZSAneDsvQUFBLyFkOy9CQkIvIWQ7L0NDQy8hZCcKKworICMgcHJpbnQgcGFyYWdyYXBoIGlmIGl0IGNvbnRhaW5zIEFBQSBvciBCQkIgb3IgQ0NDCisgc2VkIC1lICcvLi97SDskIWQ7fScgLWUgJ3g7L0FBQS9iJyAtZSAnL0JCQi9iJyAtZSAnL0NDQy9iJyAtZSBkCisgZ3NlZCAnLy4ve0g7JCFkO307eDsvQUFBXHxCQkJcfENDQy9iO2QnICAgICAgICAgIyBHTlUgc2VkIG9ubHkKKworICMgcHJpbnQgb25seSBsaW5lcyBvZiA2NSBjaGFyYWN0ZXJzIG9yIGxvbmdlcgorIHNlZCAtbiAnL14uXHs2NVx9L3AnCisKKyAjIHByaW50IG9ubHkgbGluZXMgb2YgbGVzcyB0aGFuIDY1IGNoYXJhY3RlcnMKKyBzZWQgLW4gJy9eLlx7NjVcfS8hcCcgICAgICAgICMgbWV0aG9kIDEsIGNvcnJlc3BvbmRzIHRvIGFib3ZlCisgc2VkICcvXi5cezY1XH0vZCcgICAgICAgICAgICAjIG1ldGhvZCAyLCBzaW1wbGVyIHN5bnRheAorCisgIyBwcmludCBzZWN0aW9uIG9mIGZpbGUgZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZW5kIG9mIGZpbGUKKyBzZWQgLW4gJy9yZWdleHAvLCRwJworCisgIyBwcmludCBzZWN0aW9uIG9mIGZpbGUgYmFzZWQgb24gbGluZSBudW1iZXJzIChsaW5lcyA4LTEyLCBpbmNsdXNpdmUpCisgc2VkIC1uICc4LDEycCcgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkICc4LDEyIWQnICAgICAgICAgICAgICAgICAjIG1ldGhvZCAyCisKKyAjIHByaW50IGxpbmUgbnVtYmVyIDUyCisgc2VkIC1uICc1MnAnICAgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkICc1MiFkJyAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAyCisgc2VkICc1MnE7ZCcgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAzLCBlZmZpY2llbnQgb24gbGFyZ2UgZmlsZXMKKworICMgYmVnaW5uaW5nIGF0IGxpbmUgMywgcHJpbnQgZXZlcnkgN3RoIGxpbmUKKyBnc2VkIC1uICczfjdwJyAgICAgICAgICAgICAgICMgR05VIHNlZCBvbmx5Cisgc2VkIC1uICczLCR7cDtuO247bjtuO247bjt9JyAjIG90aGVyIHNlZHMKKworICMgcHJpbnQgc2VjdGlvbiBvZiBmaWxlIGJldHdlZW4gdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKGluY2x1c2l2ZSkKKyBzZWQgLW4gJy9Jb3dhLywvTW9udGFuYS9wJyAgICAgICAgICAgICAjIGNhc2Ugc2Vuc2l0aXZlCisKK1NFTEVDVElWRSBERUxFVElPTiBPRiBDRVJUQUlOIExJTkVTOgorCisgIyBwcmludCBhbGwgb2YgZmlsZSBFWENFUFQgc2VjdGlvbiBiZXR3ZWVuIDIgcmVndWxhciBleHByZXNzaW9ucworIHNlZCAnL0lvd2EvLC9Nb250YW5hL2QnCisKKyAjIGRlbGV0ZSBkdXBsaWNhdGUsIGNvbnNlY3V0aXZlIGxpbmVzIGZyb20gYSBmaWxlIChlbXVsYXRlcyAidW5pcSIpLgorICMgRmlyc3QgbGluZSBpbiBhIHNldCBvZiBkdXBsaWNhdGUgbGluZXMgaXMga2VwdCwgcmVzdCBhcmUgZGVsZXRlZC4KKyBzZWQgJyQhTjsgL15cKC4qXClcblwxJC8hUDsgRCcKKworICMgZGVsZXRlIGR1cGxpY2F0ZSwgbm9uY29uc2VjdXRpdmUgbGluZXMgZnJvbSBhIGZpbGUuIEJld2FyZSBub3QgdG8KKyAjIG92ZXJmbG93IHRoZSBidWZmZXIgc2l6ZSBvZiB0aGUgaG9sZCBzcGFjZSwgb3IgZWxzZSB1c2UgR05VIHNlZC4KKyBzZWQgLW4gJ0c7IHMvXG4vJiYvOyAvXlwoWyAtfl0qXG5cKS4qXG5cMS9kOyBzL1xuLy87IGg7IFAnCisKKyAjIGRlbGV0ZSBhbGwgbGluZXMgZXhjZXB0IGR1cGxpY2F0ZSBsaW5lcyAoZW11bGF0ZXMgInVuaXEgLWQiKS4KKyBzZWQgJyQhTjsgcy9eXCguKlwpXG5cMSQvXDEvOyB0OyBEJworCisgIyBkZWxldGUgdGhlIGZpcnN0IDEwIGxpbmVzIG9mIGEgZmlsZQorIHNlZCAnMSwxMGQnCisKKyAjIGRlbGV0ZSB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZQorIHNlZCAnJGQnCisKKyAjIGRlbGV0ZSB0aGUgbGFzdCAyIGxpbmVzIG9mIGEgZmlsZQorIHNlZCAnTjskIVA7JCFEOyRkJworCisgIyBkZWxldGUgdGhlIGxhc3QgMTAgbGluZXMgb2YgYSBmaWxlCisgc2VkIC1lIDphIC1lICckZDtOOzIsMTBiYScgLWUgJ1A7RCcgICAjIG1ldGhvZCAxCisgc2VkIC1uIC1lIDphIC1lICcxLDEwIXtQO047RDt9O047YmEnICAjIG1ldGhvZCAyCisKKyAjIGRlbGV0ZSBldmVyeSA4dGggbGluZQorIGdzZWQgJzB+OGQnICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHTlUgc2VkIG9ubHkKKyBzZWQgJ247bjtuO247bjtuO247ZDsnICAgICAgICAgICAgICAgICMgb3RoZXIgc2VkcworCisgIyBkZWxldGUgQUxMIGJsYW5rIGxpbmVzIGZyb20gYSBmaWxlIChzYW1lIGFzICJncmVwICcuJyAiKQorIHNlZCAnL14kL2QnICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAnLy4vIWQnICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMgorCisgIyBkZWxldGUgYWxsIENPTlNFQ1VUSVZFIGJsYW5rIGxpbmVzIGZyb20gZmlsZSBleGNlcHQgdGhlIGZpcnN0OyBhbHNvCisgIyBkZWxldGVzIGFsbCBibGFuayBsaW5lcyBmcm9tIHRvcCBhbmQgZW5kIG9mIGZpbGUgKGVtdWxhdGVzICJjYXQgLXMiKQorIHNlZCAnLy4vLC9eJC8hZCcgICAgICAgICAgIyBtZXRob2QgMSwgYWxsb3dzIDAgYmxhbmtzIGF0IHRvcCwgMSBhdCBFT0YKKyBzZWQgJy9eJC9OOy9cbiQvRCcgICAgICAgICMgbWV0aG9kIDIsIGFsbG93cyAxIGJsYW5rIGF0IHRvcCwgMCBhdCBFT0YKKworICMgZGVsZXRlIGFsbCBDT05TRUNVVElWRSBibGFuayBsaW5lcyBmcm9tIGZpbGUgZXhjZXB0IHRoZSBmaXJzdCAyOgorIHNlZCAnL14kL047L1xuJC9OOy8vRCcKKworICMgZGVsZXRlIGFsbCBsZWFkaW5nIGJsYW5rIGxpbmVzIGF0IHRvcCBvZiBmaWxlCisgc2VkICcvLi8sJCFkJworCisgIyBkZWxldGUgYWxsIHRyYWlsaW5nIGJsYW5rIGxpbmVzIGF0IGVuZCBvZiBmaWxlCisgc2VkIC1lIDphIC1lICcvXlxuKiQveyRkO047YmEnIC1lICd9JyAgIyB3b3JrcyBvbiBhbGwgc2VkcworIHNlZCAtZSA6YSAtZSAnL15cbiokL047L1xuJC9iYScgICAgICAgICMgZGl0dG8sIGV4Y2VwdCBmb3IgZ3NlZCAzLjAyKgorCisgIyBkZWxldGUgdGhlIGxhc3QgbGluZSBvZiBlYWNoIHBhcmFncmFwaAorIHNlZCAtbiAnL14kL3twO2g7fTsvLi97eDsvLi9wO30nCisKK1NQRUNJQUwgQVBQTElDQVRJT05TOgorCisgIyByZW1vdmUgbnJvZmYgb3ZlcnN0cmlrZXMgKGNoYXIsIGJhY2tzcGFjZSkgZnJvbSBtYW4gcGFnZXMuIFRoZSAnZWNobycKKyAjIGNvbW1hbmQgbWF5IG5lZWQgYW4gLWUgc3dpdGNoIGlmIHlvdSB1c2UgVW5peCBTeXN0ZW0gViBvciBiYXNoIHNoZWxsLgorIHNlZCAicy8uYGVjaG8gXFxcYmAvL2ciICAgICMgZG91YmxlIHF1b3RlcyByZXF1aXJlZCBmb3IgVW5peCBlbnZpcm9ubWVudAorIHNlZCAncy8uXkgvL2cnICAgICAgICAgICAgICMgaW4gYmFzaC90Y3NoLCBwcmVzcyBDdHJsLVYgYW5kIHRoZW4gQ3RybC1ICisgc2VkICdzLy5ceDA4Ly9nJyAgICAgICAgICAgIyBoZXggZXhwcmVzc2lvbiBmb3Igc2VkIHYxLjUKKworICMgZ2V0IFVzZW5ldC9lLW1haWwgbWVzc2FnZSBoZWFkZXIKKyBzZWQgJy9eJC9xJyAgICAgICAgICAgICAgICAjIGRlbGV0ZXMgZXZlcnl0aGluZyBhZnRlciBmaXJzdCBibGFuayBsaW5lCisKKyAjIGdldCBVc2VuZXQvZS1tYWlsIG1lc3NhZ2UgYm9keQorIHNlZCAnMSwvXiQvZCcgICAgICAgICAgICAgICMgZGVsZXRlcyBldmVyeXRoaW5nIHVwIHRvIGZpcnN0IGJsYW5rIGxpbmUKKworICMgZ2V0IFN1YmplY3QgaGVhZGVyLCBidXQgcmVtb3ZlIGluaXRpYWwgIlN1YmplY3Q6ICIgcG9ydGlvbgorIHNlZCAnL15TdWJqZWN0OiAqLyFkOyBzLy8vO3EnCisKKyAjIGdldCByZXR1cm4gYWRkcmVzcyBoZWFkZXIKKyBzZWQgJy9eUmVwbHktVG86L3E7IC9eRnJvbTovaDsgLy4vZDtnO3EnCisKKyAjIHBhcnNlIG91dCB0aGUgYWRkcmVzcyBwcm9wZXIuIFB1bGxzIG91dCB0aGUgZS1tYWlsIGFkZHJlc3MgYnkgaXRzZWxmCisgIyBmcm9tIHRoZSAxLWxpbmUgcmV0dXJuIGFkZHJlc3MgaGVhZGVyIChzZWUgcHJlY2VkaW5nIHNjcmlwdCkKKyBzZWQgJ3MvICooLiopLy87IHMvPi4qLy87IHMvLipbOjxdICovLycKKworICMgYWRkIGEgbGVhZGluZyBhbmdsZSBicmFja2V0IGFuZCBzcGFjZSB0byBlYWNoIGxpbmUgKHF1b3RlIGEgbWVzc2FnZSkKKyBzZWQgJ3MvXi8+IC8nCisKKyAjIGRlbGV0ZSBsZWFkaW5nIGFuZ2xlIGJyYWNrZXQgJiBzcGFjZSBmcm9tIGVhY2ggbGluZSAodW5xdW90ZSBhIG1lc3NhZ2UpCisgc2VkICdzL14+IC8vJworCisgIyByZW1vdmUgbW9zdCBIVE1MIHRhZ3MgKGFjY29tbW9kYXRlcyBtdWx0aXBsZS1saW5lIHRhZ3MpCisgc2VkIC1lIDphIC1lICdzLzxbXj5dKj4vL2c7LzwvTjsvL2JhJworCisgIyBleHRyYWN0IG11bHRpLXBhcnQgdXVlbmNvZGVkIGJpbmFyaWVzLCByZW1vdmluZyBleHRyYW5lb3VzIGhlYWRlcgorICMgaW5mbywgc28gdGhhdCBvbmx5IHRoZSB1dWVuY29kZWQgcG9ydGlvbiByZW1haW5zLiBGaWxlcyBwYXNzZWQgdG8KKyAjIHNlZCBtdXN0IGJlIHBhc3NlZCBpbiB0aGUgcHJvcGVyIG9yZGVyLiBWZXJzaW9uIDEgY2FuIGJlIGVudGVyZWQKKyAjIGZyb20gdGhlIGNvbW1hbmQgbGluZTsgdmVyc2lvbiAyIGNhbiBiZSBtYWRlIGludG8gYW4gZXhlY3V0YWJsZQorICMgVW5peCBzaGVsbCBzY3JpcHQuIChNb2RpZmllZCBmcm9tIGEgc2NyaXB0IGJ5IFJhaHVsIERoZXNpLikKKyBzZWQgJy9eZW5kLywvXmJlZ2luL2QnIGZpbGUxIGZpbGUyIC4uLiBmaWxlWCB8IHV1ZGVjb2RlICAgIyB2ZXJzLiAxCisgc2VkICcvXmVuZC8sL15iZWdpbi9kJyAiJEAiIHwgdXVkZWNvZGUgICAgICAgICAgICAgICAgICAgICMgdmVycy4gMgorCisgIyB6aXAgdXAgZWFjaCAuVFhUIGZpbGUgaW5kaXZpZHVhbGx5LCBkZWxldGluZyB0aGUgc291cmNlIGZpbGUgYW5kCisgIyBzZXR0aW5nIHRoZSBuYW1lIG9mIGVhY2ggLlpJUCBmaWxlIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgLlRYVCBmaWxlCisgIyAodW5kZXIgRE9TOiB0aGUgImRpciAvYiIgc3dpdGNoIHJldHVybnMgYmFyZSBmaWxlbmFtZXMgaW4gYWxsIGNhcHMpLgorIGVjaG8gQGVjaG8gb2ZmID56aXB1cC5iYXQKKyBkaXIgL2IgKi50eHQgfCBzZWQgInMvXlwoLipcKVwuVFhUL3BremlwIC1tbyBcMSBcMS5UWFQvIiA+PnppcHVwLmJhdAorCitUWVBJQ0FMIFVTRTogU2VkIHRha2VzIG9uZSBvciBtb3JlIGVkaXRpbmcgY29tbWFuZHMgYW5kIGFwcGxpZXMgYWxsIG9mCit0aGVtLCBpbiBzZXF1ZW5jZSwgdG8gZWFjaCBsaW5lIG9mIGlucHV0LiBBZnRlciBhbGwgdGhlIGNvbW1hbmRzIGhhdmUKK2JlZW4gYXBwbGllZCB0byB0aGUgZmlyc3QgaW5wdXQgbGluZSwgdGhhdCBsaW5lIGlzIG91dHB1dCBhbmQgYSBzZWNvbmQKK2lucHV0IGxpbmUgaXMgdGFrZW4gZm9yIHByb2Nlc3NpbmcsIGFuZCB0aGUgY3ljbGUgcmVwZWF0cy4gVGhlCitwcmVjZWRpbmcgZXhhbXBsZXMgYXNzdW1lIHRoYXQgaW5wdXQgY29tZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQKK2RldmljZSAoaS5lLCB0aGUgY29uc29sZSwgbm9ybWFsbHkgdGhpcyB3aWxsIGJlIHBpcGVkIGlucHV0KS4gT25lIG9yCittb3JlIGZpbGVuYW1lcyBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGNvbW1hbmQgbGluZSBpZiB0aGUgaW5wdXQgZG9lcworbm90IGNvbWUgZnJvbSBzdGRpbi4gT3V0cHV0IGlzIHNlbnQgdG8gc3Rkb3V0ICh0aGUgc2NyZWVuKS4gVGh1czoKKworIGNhdCBmaWxlbmFtZSB8IHNlZCAnMTBxJyAgICAgICAgIyB1c2VzIHBpcGVkIGlucHV0Cisgc2VkICcxMHEnIGZpbGVuYW1lICAgICAgICAgICAgICAjIHNhbWUgZWZmZWN0LCBhdm9pZHMgYSB1c2VsZXNzICJjYXQiCisgc2VkICcxMHEnIGZpbGVuYW1lID4gbmV3ZmlsZSAgICAjIHJlZGlyZWN0cyBvdXRwdXQgdG8gZGlzaworCitGb3IgYWRkaXRpb25hbCBzeW50YXggaW5zdHJ1Y3Rpb25zLCBpbmNsdWRpbmcgdGhlIHdheSB0byBhcHBseSBlZGl0aW5nCitjb21tYW5kcyBmcm9tIGEgZGlzayBmaWxlIGluc3RlYWQgb2YgdGhlIGNvbW1hbmQgbGluZSwgY29uc3VsdCAic2VkICYKK2F3aywgMm5kIEVkaXRpb24sIiBieSBEYWxlIERvdWdoZXJ0eSBhbmQgQXJub2xkIFJvYmJpbnMgKE8nUmVpbGx5LAorMTk5NzsgaHR0cDovL3d3dy5vcmEuY29tKSwgIlVOSVggVGV4dCBQcm9jZXNzaW5nLCIgYnkgRGFsZSBEb3VnaGVydHkKK2FuZCBUaW0gTydSZWlsbHkgKEhheWRlbiBCb29rcywgMTk4Nykgb3IgdGhlIHR1dG9yaWFscyBieSBNaWtlIEFyc3QKK2Rpc3RyaWJ1dGVkIGluIFUtU0VESVQyLlpJUCAobWFueSBzaXRlcykuIFRvIGZ1bGx5IGV4cGxvaXQgdGhlIHBvd2VyCitvZiBzZWQsIG9uZSBtdXN0IHVuZGVyc3RhbmQgInJlZ3VsYXIgZXhwcmVzc2lvbnMuIiBGb3IgdGhpcywgc2VlCisiTWFzdGVyaW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMiIGJ5IEplZmZyZXkgRnJpZWRsIChPJ1JlaWxseSwgMTk5NykuCitUaGUgbWFudWFsICgibWFuIikgcGFnZXMgb24gVW5peCBzeXN0ZW1zIG1heSBiZSBoZWxwZnVsICh0cnkgIm1hbgorc2VkIiwgIm1hbiByZWdleHAiLCBvciB0aGUgc3Vic2VjdGlvbiBvbiByZWd1bGFyIGV4cHJlc3Npb25zIGluICJtYW4KK2VkIiksIGJ1dCBtYW4gcGFnZXMgYXJlIG5vdG9yaW91c2x5IGRpZmZpY3VsdC4gVGhleSBhcmUgbm90IHdyaXR0ZW4gdG8KK3RlYWNoIHNlZCB1c2Ugb3IgcmVnZXhwcyB0byBmaXJzdC10aW1lIHVzZXJzLCBidXQgYXMgYSByZWZlcmVuY2UgdGV4dAorZm9yIHRob3NlIGFscmVhZHkgYWNxdWFpbnRlZCB3aXRoIHRoZXNlIHRvb2xzLgorCitRVU9USU5HIFNZTlRBWDogVGhlIHByZWNlZGluZyBleGFtcGxlcyB1c2Ugc2luZ2xlIHF1b3RlcyAoJy4uLicpCitpbnN0ZWFkIG9mIGRvdWJsZSBxdW90ZXMgKCIuLi4iKSB0byBlbmNsb3NlIGVkaXRpbmcgY29tbWFuZHMsIHNpbmNlCitzZWQgaXMgdHlwaWNhbGx5IHVzZWQgb24gYSBVbml4IHBsYXRmb3JtLiBTaW5nbGUgcXVvdGVzIHByZXZlbnQgdGhlCitVbml4IHNoZWxsIGZyb20gaW50cmVwcmV0aW5nIHRoZSBkb2xsYXIgc2lnbiAoJCkgYW5kIGJhY2txdW90ZXMKKyhgLi4uYCksIHdoaWNoIGFyZSBleHBhbmRlZCBieSB0aGUgc2hlbGwgaWYgdGhleSBhcmUgZW5jbG9zZWQgaW4KK2RvdWJsZSBxdW90ZXMuIFVzZXJzIG9mIHRoZSAiY3NoIiBzaGVsbCBhbmQgZGVyaXZhdGl2ZXMgd2lsbCBhbHNvIG5lZWQKK3RvIHF1b3RlIHRoZSBleGNsYW1hdGlvbiBtYXJrICghKSB3aXRoIHRoZSBiYWNrc2xhc2ggKGkuZS4sIFwhKSB0bworcHJvcGVybHkgcnVuIHRoZSBleGFtcGxlcyBsaXN0ZWQgYWJvdmUsIGV2ZW4gd2l0aGluIHNpbmdsZSBxdW90ZXMuCitWZXJzaW9ucyBvZiBzZWQgd3JpdHRlbiBmb3IgRE9TIGludmFyaWFibHkgcmVxdWlyZSBkb3VibGUgcXVvdGVzCisoIi4uLiIpIGluc3RlYWQgb2Ygc2luZ2xlIHF1b3RlcyB0byBlbmNsb3NlIGVkaXRpbmcgY29tbWFuZHMuCisKK1VTRSBPRiAnXHQnIElOIFNFRCBTQ1JJUFRTOiBGb3IgY2xhcml0eSBpbiBkb2N1bWVudGF0aW9uLCB3ZSBoYXZlIHVzZWQKK3RoZSBleHByZXNzaW9uICdcdCcgdG8gaW5kaWNhdGUgYSB0YWIgY2hhcmFjdGVyICgweDA5KSBpbiB0aGUgc2NyaXB0cy4KK0hvd2V2ZXIsIG1vc3QgdmVyc2lvbnMgb2Ygc2VkIGRvIG5vdCByZWNvZ25pemUgdGhlICdcdCcgYWJicmV2aWF0aW9uLAorc28gd2hlbiB0eXBpbmcgdGhlc2Ugc2NyaXB0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBzaG91bGQgcHJlc3MKK3RoZSBUQUIga2V5IGluc3RlYWQuICdcdCcgaXMgc3VwcG9ydGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uCittZXRhY2hhcmFjdGVyIGluIGF3aywgcGVybCwgYW5kIEhIc2VkLCBzZWRtb2QsIGFuZCBHTlUgc2VkIHYzLjAyLjgwLgorCitWRVJTSU9OUyBPRiBTRUQ6IFZlcnNpb25zIG9mIHNlZCBkbyBkaWZmZXIsIGFuZCBzb21lIHNsaWdodCBzeW50YXgKK3ZhcmlhdGlvbiBpcyB0byBiZSBleHBlY3RlZC4gSW4gcGFydGljdWxhciwgbW9zdCBkbyBub3Qgc3VwcG9ydCB0aGUKK3VzZSBvZiBsYWJlbHMgKDpuYW1lKSBvciBicmFuY2ggaW5zdHJ1Y3Rpb25zIChiLHQpIHdpdGhpbiBlZGl0aW5nCitjb21tYW5kcywgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhvc2UgY29tbWFuZHMuIFdlIGhhdmUgdXNlZCB0aGUgc3ludGF4Cit3aGljaCB3aWxsIGJlIHBvcnRhYmxlIHRvIG1vc3QgdXNlcnMgb2Ygc2VkLCBldmVuIHRob3VnaCB0aGUgcG9wdWxhcgorR05VIHZlcnNpb25zIG9mIHNlZCBhbGxvdyBhIG1vcmUgc3VjY2luY3Qgc3ludGF4LiBXaGVuIHRoZSByZWFkZXIgc2VlcworYSBmYWlybHkgbG9uZyBjb21tYW5kIHN1Y2ggYXMgdGhpczoKKworICAgc2VkIC1lICcvQUFBL2InIC1lICcvQkJCL2InIC1lICcvQ0NDL2InIC1lIGQKKworaXQgaXMgaGVhcnRlbmluZyB0byBrbm93IHRoYXQgR05VIHNlZCB3aWxsIGxldCB5b3UgcmVkdWNlIGl0IHRvOgorCisgICBzZWQgJy9BQUEvYjsvQkJCL2I7L0NDQy9iO2QnICAgICAgIyBvciBldmVuCisgICBzZWQgJy9BQUFcfEJCQlx8Q0NDL2I7ZCcKKworSW4gYWRkaXRpb24sIHJlbWVtYmVyIHRoYXQgd2hpbGUgbWFueSB2ZXJzaW9ucyBvZiBzZWQgYWNjZXB0IGEgY29tbWFuZAorbGlrZSAiL29uZS8gcy9SRTEvUkUyLyIsIHNvbWUgZG8gTk9UIGFsbG93ICIvb25lLyEgcy9SRTEvUkUyLyIsIHdoaWNoCitjb250YWlucyBzcGFjZSBiZWZvcmUgdGhlICdzJy4gT21pdCB0aGUgc3BhY2Ugd2hlbiB0eXBpbmcgdGhlIGNvbW1hbmQuCisKK09QVElNSVpJTkcgRk9SIFNQRUVEOiBJZiBleGVjdXRpb24gc3BlZWQgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIChkdWUgdG8KK2xhcmdlIGlucHV0IGZpbGVzIG9yIHNsb3cgcHJvY2Vzc29ycyBvciBoYXJkIGRpc2tzKSwgc3Vic3RpdHV0aW9uIHdpbGwKK2JlIGV4ZWN1dGVkIG1vcmUgcXVpY2tseSBpZiB0aGUgImZpbmQiIGV4cHJlc3Npb24gaXMgc3BlY2lmaWVkIGJlZm9yZQorZ2l2aW5nIHRoZSAicy8uLi4vLi4uLyIgaW5zdHJ1Y3Rpb24uIFRodXM6CisKKyAgIHNlZCAncy9mb28vYmFyL2cnIGZpbGVuYW1lICAgICAgICAgIyBzdGFuZGFyZCByZXBsYWNlIGNvbW1hbmQKKyAgIHNlZCAnL2Zvby8gcy9mb28vYmFyL2cnIGZpbGVuYW1lICAgIyBleGVjdXRlcyBtb3JlIHF1aWNrbHkKKyAgIHNlZCAnL2Zvby8gcy8vYmFyL2cnIGZpbGVuYW1lICAgICAgIyBzaG9ydGhhbmQgc2VkIHN5bnRheAorCitPbiBsaW5lIHNlbGVjdGlvbiBvciBkZWxldGlvbiBpbiB3aGljaCB5b3Ugb25seSBuZWVkIHRvIG91dHB1dCBsaW5lcworZnJvbSB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZmlsZSwgYSAicXVpdCIgY29tbWFuZCAocSkgaW4gdGhlIHNjcmlwdAord2lsbCBkcmFzdGljYWxseSByZWR1Y2UgcHJvY2Vzc2luZyB0aW1lIGZvciBsYXJnZSBmaWxlcy4gVGh1czoKKworICAgc2VkIC1uICc0NSw1MHAnIGZpbGVuYW1lICAgICAgICAgICAjIHByaW50IGxpbmUgbm9zLiA0NS01MCBvZiBhIGZpbGUKKyAgIHNlZCAtbiAnNTFxOzQ1LDUwcCcgZmlsZW5hbWUgICAgICAgIyBzYW1lLCBidXQgZXhlY3V0ZXMgbXVjaCBmYXN0ZXIKKworSWYgeW91IGhhdmUgYW55IGFkZGl0aW9uYWwgc2NyaXB0cyB0byBjb250cmlidXRlIG9yIGlmIHlvdSBmaW5kIGVycm9ycworaW4gdGhpcyBkb2N1bWVudCwgcGxlYXNlIHNlbmQgZS1tYWlsIHRvIHRoZSBjb21waWxlci4gSW5kaWNhdGUgdGhlCit2ZXJzaW9uIG9mIHNlZCB5b3UgdXNlZCwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXQgd2FzIGNvbXBpbGVkIGZvciwgYW5kCit0aGUgbmF0dXJlIG9mIHRoZSBwcm9ibGVtLiBWYXJpb3VzIHNjcmlwdHMgaW4gdGhpcyBmaWxlIHdlcmUgd3JpdHRlbgorb3IgY29udHJpYnV0ZWQgYnk6CisKKyBBbCBBYWIgPGFmMTM3QGZyZWVuZXQudG9yb250by5vbi5jYT4gICAjICJzZWRlcnMiIGxpc3QgbW9kZXJhdG9yCisgRWRnYXIgQWxsZW4gPGVyYUBza3kubmV0PiAgICAgICAgICAgICAgIyB2YXJpb3VzCisgWWlvcmdvcyBBZGFtb3BvdWxvcyA8YWRhbW9Ac29mdGxhYi5lY2UubnR1YS5ncj4KKyBEYWxlIERvdWdoZXJ0eSA8ZGFsZUBzb25nbGluZS5jb20+ICAgICAjIGF1dGhvciBvZiAic2VkICYgYXdrIgorIENhcmxvcyBEdWFydGUgPGNkdWFAYWxnb3MuaW5lc2MucHQ+ICAgICMgYXV0aG9yIG9mICJkbyBpdCB3aXRoIHNlZCIKKyBFcmljIFBlbWVudCA8cGVtZW50ZUBub3J0aHBhcmsuZWR1PiAgICAjIGF1dGhvciBvZiB0aGlzIGRvY3VtZW50CisgS2VuIFBpenppbmkgPGtlbkBoYWxjeW9uLmNvbT4gICAgICAgICAgIyBhdXRob3Igb2YgR05VIHNlZCB2My4wMgorIFMuRy4gUmF2ZW5oYWxsIDxzdGV3LnJhdmVuaGFsbEB0b3RhbGlzZS5jby51az4gIyBncmVhdCBkZS1odG1sIHNjcmlwdAorIEdyZWcgVWJiZW4gPGdzdUByb211bHVzLm5jc2MubWlsPiAgICAgICMgbWFueSBjb250cmlidXRpb25zICYgbXVjaCBoZWxwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9lZGl0b3JzL3NlZF9zdW1tYXJ5Lmh0bSBiL2VkaXRvcnMvc2VkX3N1bW1hcnkuaHRtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTcyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL3NlZF9zdW1tYXJ5Lmh0bQpAQCAtMCwwICsxLDIyMyBAQAorPGh0bWw+CisKKzxoZWFkPjx0aXRsZT5Db21tYW5kIFN1bW1hcnkgZm9yIHNlZCAoc2VkICYgYXdrLCBTZWNvbmQgRWRpdGlvbik8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPkNvbW1hbmQgU3VtbWFyeSBmb3Igc2VkPC9oMj4KKworPGRsPgorCis8ZHQ+PGI+OiA8L2I+IDxiPiA6PC9iPjxlbT5sYWJlbDwvZW0+PC9kdD4KKzxkZD5MYWJlbCBhIGxpbmUgaW4gdGhlIHNjcmlwdCBmb3IgdGhlIHRyYW5zZmVyIG9mIGNvbnRyb2wgYnkKKzxiPmI8L2I+IG9yIDxiPnQ8L2I+LgorPGVtPmxhYmVsPC9lbT4gbWF5IGNvbnRhaW4gdXAgdG8gc2V2ZW4gY2hhcmFjdGVycy4KKyhUaGUgUE9TSVggc3RhbmRhcmQgc2F5cyB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNhbiBhbGxvdyBsb25nZXIKK2xhYmVscyBpZiBpdCB3aXNoZXMgdG8uIEdOVSBzZWQgYWxsb3dzIGxhYmVscyB0byBiZSBvZiBhbnkgbGVuZ3RoLikKKzwvcD48L2RkPgorCisKKzxkdD48Yj49PC9iPiBbPGVtPmFkZHJlc3M8L2VtPl08Yj49PC9iPjwvZHQ+Cis8ZGQ+V3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0IHRoZSBsaW5lIG51bWJlciBvZiBhZGRyZXNzZWQgbGluZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+YTwvYj4gWzxlbT5hZGRyZXNzPC9lbT5dPGI+YVw8L2I+PC9kdD4KKzxkZD48ZW0+dGV4dDwvZW0+PC9wPgorCis8cD5BcHBlbmQgPGVtPnRleHQ8L2VtPgorZm9sbG93aW5nIGVhY2ggbGluZSBtYXRjaGVkIGJ5IDxlbT5hZGRyZXNzPC9lbT4uICBJZgorPGVtPnRleHQ8L2VtPiBnb2VzIG92ZXIgbW9yZSB0aGFuIG9uZSBsaW5lLCBuZXdsaW5lcworbXVzdCBiZSAiaGlkZGVuIiBieSBwcmVjZWRpbmcgdGhlbSB3aXRoIGEgYmFja3NsYXNoLiAgVGhlCis8ZW0+dGV4dDwvZW0+IHdpbGwgYmUgdGVybWluYXRlZCBieSB0aGUgZmlyc3QKK25ld2xpbmUgdGhhdCBpcyBub3QgaGlkZGVuIGluIHRoaXMgd2F5LiAgVGhlCis8ZW0+dGV4dDwvZW0+IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHBhdHRlcm4gc3BhY2UKK2FuZCBzdWJzZXF1ZW50IGNvbW1hbmRzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGl0LiAgVGhlIHJlc3VsdHMgb2YgdGhpcworY29tbWFuZCBhcmUgc2VudCB0byBzdGFuZGFyZCBvdXRwdXQgd2hlbiB0aGUgbGlzdCBvZiBlZGl0aW5nIGNvbW1hbmRzCitpcyBmaW5pc2hlZCwgcmVnYXJkbGVzcyBvZiB3aGF0IGhhcHBlbnMgdG8gdGhlIGN1cnJlbnQgbGluZSBpbiB0aGUKK3BhdHRlcm4gc3BhY2UuPC9wPjwvZGQ+CisKKworPGR0PjxiPmI8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPmI8L2I+WzxlbT5sYWJlbDwvZW0+XTwvZHQ+Cis8ZGQ+VHJhbnNmZXIgY29udHJvbCB1bmNvbmRpdGlvbmFsbHkgKGJyYW5jaCkgdG8KKzxiPjo8L2I+PGVtPmxhYmVsPC9lbT4gZWxzZXdoZXJlIGluCitzY3JpcHQuICBUaGF0IGlzLCB0aGUgY29tbWFuZCBmb2xsb3dpbmcgdGhlCis8ZW0+bGFiZWw8L2VtPiBpcyB0aGUgbmV4dCBjb21tYW5kIGFwcGxpZWQgdG8gdGhlCitjdXJyZW50IGxpbmUuICBJZiBubyA8ZW0+bGFiZWw8L2VtPiBpcyBzcGVjaWZpZWQsCitjb250cm9sIGZhbGxzIHRocm91Z2ggdG8gdGhlIGVuZCBvZiB0aGUgc2NyaXB0LCBzbyBubyBtb3JlIGNvbW1hbmRzCithcmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBsaW5lLjwvcD48L2RkPgorCisKKzxkdD48Yj5jPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5jXDwvYj48L2R0PgorPGRkPjxlbT50ZXh0PC9lbT48L3A+CisKKzxwPlJlcGxhY2UgKGNoYW5nZSkgdGhlIGxpbmVzIHNlbGVjdGVkIGJ5IHRoZSBhZGRyZXNzIHdpdGgKKzxlbT50ZXh0PC9lbT4uICBXaGVuIGEgcmFuZ2Ugb2YgbGluZXMgaXMgc3BlY2lmaWVkLAorYWxsIGxpbmVzIGFzIGEgZ3JvdXAgYXJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIGNvcHkgb2YKKzxlbT50ZXh0PC9lbT4uICBUaGUgbmV3bGluZSBmb2xsb3dpbmcgZWFjaCBsaW5lIG9mCis8ZW0+dGV4dDwvZW0+IG11c3QgYmUgZXNjYXBlZCBieSBhIGJhY2tzbGFzaCwgZXhjZXB0Cit0aGUgbGFzdCBsaW5lLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBwYXR0ZXJuIHNwYWNlIGFyZSwgaW4gZWZmZWN0LAorZGVsZXRlZCBhbmQgbm8gc3Vic2VxdWVudCBlZGl0aW5nIGNvbW1hbmRzIGNhbiBiZSBhcHBsaWVkIHRvIGl0IChvciB0bworPGVtPnRleHQ8L2VtPikuPC9wPjwvZGQ+CisKKworPGR0PjxiPmQ8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPmQ8L2I+PC9kdD4KKzxkZD5EZWxldGUgbGluZShzKSBmcm9tIHBhdHRlcm4gc3BhY2UuICBUaHVzLCB0aGUgbGluZSBpcyBub3QgcGFzc2VkIHRvIHN0YW5kYXJkCitvdXRwdXQuIEEgbmV3IGxpbmUgb2YgaW5wdXQgaXMgcmVhZCBhbmQgZWRpdGluZyByZXN1bWVzIHdpdGggZmlyc3QKK2NvbW1hbmQgaW4gc2NyaXB0LjwvcD48L2RkPgorCisKKzxkdD48Yj5EPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5EPC9iPjwvZHQ+Cis8ZGQ+RGVsZXRlIGZpcnN0IHBhcnQgKHVwIHRvIGVtYmVkZGVkIG5ld2xpbmUpIG9mIG11bHRpbGluZSBwYXR0ZXJuIHNwYWNlIGNyZWF0ZWQKK2J5IDxiPk48L2I+IGNvbW1hbmQgYW5kIHJlc3VtZSBlZGl0aW5nIHdpdGggZmlyc3QgY29tbWFuZCBpbgorc2NyaXB0LiAgSWYgdGhpcyBjb21tYW5kIGVtcHRpZXMgdGhlIHBhdHRlcm4gc3BhY2UsIHRoZW4gYSBuZXcgbGluZQorb2YgaW5wdXQgaXMgcmVhZCwgYXMgaWYgdGhlIDxiPmQ8L2I+IGNvbW1hbmQgaGFkIGJlZW4gZXhlY3V0ZWQuPC9wPjwvZGQ+CisKKworPGR0PjxiPmc8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPmc8L2I+PC9kdD4KKzxkZD5Db3B5IChnZXQpIGNvbnRlbnRzIG9mIGhvbGQgc3BhY2UgKHNlZSA8Yj5oPC9iPiBvcgorPGI+SDwvYj4gY29tbWFuZCkgaW50byB0aGUgcGF0dGVybiBzcGFjZSwgd2lwaW5nIG91dAorcHJldmlvdXMgY29udGVudHMuPC9wPjwvZGQ+CisKKworPGR0PjxiPkc8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPkc8L2I+PC9kdD4KKzxkZD5BcHBlbmQgbmV3bGluZSBmb2xsb3dlZCBieSBjb250ZW50cyBvZiBob2xkIHNwYWNlIChzZWUKKzxiPmg8L2I+IG9yIDxiPkg8L2I+IGNvbW1hbmQpIHRvIGNvbnRlbnRzIG9mCit0aGUgcGF0dGVybiBzcGFjZS4gIElmIGhvbGQgc3BhY2UgaXMgZW1wdHksIGEgbmV3bGluZSBpcyBzdGlsbAorYXBwZW5kZWQgdG8gdGhlIHBhdHRlcm4gc3BhY2UuPC9wPjwvZGQ+CisKKworPGR0PjxiPmg8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPmg8L2I+PC9kdD4KKzxkZD5Db3B5IHBhdHRlcm4gc3BhY2UgaW50byBob2xkIHNwYWNlLCBhIHNwZWNpYWwgdGVtcG9yYXJ5IGJ1ZmZlci4KK1ByZXZpb3VzIGNvbnRlbnRzIG9mIGhvbGQgc3BhY2UgYXJlIHdpcGVkIG91dC48L3A+PC9kZD4KKworCis8ZHQ+PGI+SDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+SDwvYj48L2R0PgorPGRkPkFwcGVuZCBuZXdsaW5lIGFuZCBjb250ZW50cyBvZiBwYXR0ZXJuIHNwYWNlIHRvIGNvbnRlbnRzIG9mIHRoZSBob2xkCitzcGFjZS4gIEV2ZW4gaWYgaG9sZCBzcGFjZSBpcyBlbXB0eSwgdGhpcyBjb21tYW5kIHN0aWxsIGFwcGVuZHMgdGhlCituZXdsaW5lIGZpcnN0LjwvcD48L2RkPgorCisKKzxkdD48Yj5pPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5dPGI+aVw8L2I+PC9kdD4KKzxkZD48ZW0+dGV4dDwvZW0+PC9wPgorCis8cD5JbnNlcnQgPGVtPnRleHQ8L2VtPiBiZWZvcmUgZWFjaCBsaW5lIG1hdGNoZWQgYnkKKzxlbT5hZGRyZXNzPC9lbT4uIChTZWUgPGI+YTwvYj4gZm9yCitkZXRhaWxzIG9uIDxlbT50ZXh0PC9lbT4uKTwvcD48L2RkPgorCisKKzxkdD48Yj5sPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5sPC9iPjwvZHQ+Cis8ZGQ+TGlzdCB0aGUgY29udGVudHMgb2YgdGhlIHBhdHRlcm4gc3BhY2UsIHNob3dpbmcgbm9ucHJpbnRpbmcgY2hhcmFjdGVycworYXMgQVNDSUkgY29kZXMuICBMb25nIGxpbmVzIGFyZSB3cmFwcGVkLjwvcD48L2RkPgorCisKKzxkdD48Yj5uPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5uPC9iPjwvZHQ+Cis8ZGQ+UmVhZCBuZXh0IGxpbmUgb2YgaW5wdXQgaW50byBwYXR0ZXJuIHNwYWNlLiAgQ3VycmVudCBsaW5lIGlzIHNlbnQgdG8KK3N0YW5kYXJkIG91dHB1dC4gIE5ldyBsaW5lIGJlY29tZXMgY3VycmVudCBsaW5lIGFuZCBpbmNyZW1lbnRzIGxpbmUKK2NvdW50ZXIuICBDb250cm9sIHBhc3NlcyB0byBjb21tYW5kIGZvbGxvd2luZyA8Yj5uPC9iPgoraW5zdGVhZCBvZiByZXN1bWluZyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JpcHQuPC9wPjwvZGQ+CisKKworPGR0PjxiPk48L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPk48L2I+PC9kdD4KKzxkZD5BcHBlbmQgbmV4dCBpbnB1dCBsaW5lIHRvIGNvbnRlbnRzIG9mIHBhdHRlcm4gc3BhY2U7IHRoZSBuZXcgbGluZSBpcworc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIGNvbnRlbnRzIG9mIHRoZSBwYXR0ZXJuIHNwYWNlIGJ5IGEgbmV3bGluZS4KKyhUaGlzIGNvbW1hbmQgaXMgZGVzaWduZWQgdG8gYWxsb3cgcGF0dGVybiBtYXRjaGVzIGFjcm9zcyB0d28KK2xpbmVzLiAgVXNpbmcgXG4gdG8gbWF0Y2ggdGhlIGVtYmVkZGVkIG5ld2xpbmUsIHlvdSBjYW4gbWF0Y2gKK3BhdHRlcm5zIGFjcm9zcyBtdWx0aXBsZSBsaW5lcy4pPC9wPjwvZGQ+CisKKworPGR0PjxiPnA8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPnA8L2I+PC9kdD4KKzxkZD5QcmludCB0aGUgYWRkcmVzc2VkIGxpbmUocykuICBOb3RlIHRoYXQgdGhpcyBjYW4gcmVzdWx0IGluIGR1cGxpY2F0ZQorb3V0cHV0IHVubGVzcyBkZWZhdWx0IG91dHB1dCBpcyBzdXBwcmVzc2VkIGJ5IHVzaW5nICIjbiIgb3IKK3RoZSA8c3BhbiBjbGFzcz0ib3B0aW9uIj4tbjwvc3Bhbj4KKworY29tbWFuZC1saW5lIG9wdGlvbi4gIFR5cGljYWxseSB1c2VkIGJlZm9yZSBjb21tYW5kcyB0aGF0IGNoYW5nZSBmbG93Citjb250cm9sICg8Yj5kPC9iPiwgPGI+bjwvYj4sCis8Yj5iPC9iPikgYW5kIG1pZ2h0IHByZXZlbnQgdGhlIGN1cnJlbnQgbGluZSBmcm9tIGJlaW5nCitvdXRwdXQuPC9wPjwvZGQ+CisKKworPGR0PjxiPlA8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPlA8L2I+PC9kdD4KKzxkZD5QcmludCBmaXJzdCBwYXJ0ICh1cCB0byBlbWJlZGRlZCBuZXdsaW5lKSBvZiBtdWx0aWxpbmUgcGF0dGVybiBzcGFjZQorY3JlYXRlZCBieSA8Yj5OPC9iPiBjb21tYW5kLiAgU2FtZSBhcyA8Yj5wPC9iPgoraWYgPGI+TjwvYj4gaGFzIG5vdCBiZWVuIGFwcGxpZWQgdG8gYSBsaW5lLjwvcD48L2RkPgorCisKKzxkdD48Yj5xPC9iPiBbPGVtPmFkZHJlc3M8L2VtPl08Yj5xPC9iPjwvZHQ+Cis8ZGQ+UXVpdCB3aGVuIDxlbT5hZGRyZXNzPC9lbT4gaXMgZW5jb3VudGVyZWQuICBUaGUKK2FkZHJlc3NlZCBsaW5lIGlzIGZpcnN0IHdyaXR0ZW4gdG8gb3V0cHV0IChpZiBkZWZhdWx0IG91dHB1dCBpcyBub3QKK3N1cHByZXNzZWQpLCBhbG9uZyB3aXRoIGFueSB0ZXh0IGFwcGVuZGVkIHRvIGl0IGJ5IHByZXZpb3VzCis8Yj5hPC9iPiBvciA8Yj5yPC9iPiBjb21tYW5kcy48L3A+PC9kZD4KKworCis8ZHQ+PGI+cjwvYj4gWzxlbT5hZGRyZXNzPC9lbT5dPGI+cjwvYj4gPGVtPmZpbGU8L2VtPjwvZHQ+Cis8ZGQ+UmVhZCBjb250ZW50cyBvZiA8ZW0+ZmlsZTwvZW0+IGFuZCBhcHBlbmQgYWZ0ZXIgdGhlCitjb250ZW50cyBvZiB0aGUgcGF0dGVybiBzcGFjZS4gIEV4YWN0bHkgb25lIHNwYWNlIG11c3QgYmUgcHV0IGJldHdlZW4KKzxiPnI8L2I+IGFuZCB0aGUgZmlsZW5hbWUuPC9wPjwvZGQ+CisKKworPGR0PjxiPnM8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPnM8L2I+LzxlbT5wYXR0ZXJuPC9lbT4vPGVtPnJlcGxhY2VtZW50PC9lbT4vWzxlbT5mbGFnczwvZW0+XTwvZHQ+Cis8ZGQ+U3Vic3RpdHV0ZSA8ZW0+cmVwbGFjZW1lbnQ8L2VtPiBmb3IKKzxlbT5wYXR0ZXJuPC9lbT4gb24gZWFjaCBhZGRyZXNzZWQgbGluZS4gIElmIHBhdHRlcm4KK2FkZHJlc3NlcyBhcmUgdXNlZCwgdGhlIHBhdHRlcm4gPGI+Ly88L2I+IHJlcHJlc2VudHMgdGhlCitsYXN0IHBhdHRlcm4gYWRkcmVzcyBzcGVjaWZpZWQuICBUaGUgZm9sbG93aW5nIGZsYWdzIGNhbiBiZSBzcGVjaWZpZWQ6PC9wPgorCisJPGRsPgorCisJPGR0PjxiPm48L2I+PC9kdD4KKwk8ZGQ+UmVwbGFjZSA8ZW0+bjwvZW0+dGggaW5zdGFuY2Ugb2YKKwkvPGVtPnBhdHRlcm48L2VtPi8gb24gZWFjaCBhZGRyZXNzZWQgbGluZS4KKwk8ZW0+bjwvZW0+IGlzIGFueSBudW1iZXIgaW4gdGhlIHJhbmdlIDEgdG8gNTEyLCBhbmQKKwl0aGUgZGVmYXVsdCBpcyAxLjwvcD48L2RkPgorCisJPGR0PjxiPmc8L2I+PC9kdD4KKwk8ZGQ+UmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIC88ZW0+cGF0dGVybjwvZW0+LyBvbiBlYWNoCisJYWRkcmVzc2VkIGxpbmUsIG5vdCBqdXN0IHRoZSBmaXJzdCBpbnN0YW5jZS48L3A+PC9kZD4KKworCTxkdD48Yj5JPC9iPjwvZHQ+CisJPGRkPk1hdGNoaW5nIGlzIGNhc2UtaW5zZW5zaXRpdmUuPHA+PC9wPjwvZGQ+CisKKwk8ZHQ+PGI+cDwvYj48L2R0PgorCTxkZD5QcmludCB0aGUgbGluZSBpZiBhIHN1Y2Nlc3NmdWwgc3Vic3RpdHV0aW9uIGlzIGRvbmUuICBJZiBzZXZlcmFsCisJc3VjY2Vzc2Z1bCBzdWJzdGl0dXRpb25zIGFyZSBkb25lLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIGxpbmUgd2lsbCBiZQorCXByaW50ZWQuPC9wPjwvZGQ+CisKKwk8ZHQ+PGI+dzwvYj4gPGVtPmZpbGU8L2VtPjwvZHQ+CisJPGRkPldyaXRlIHRoZSBsaW5lIHRvIDxlbT5maWxlPC9lbT4gaWYgYSByZXBsYWNlbWVudAorCXdhcyBkb25lLiAgQSBtYXhpbXVtIG9mIDEwIGRpZmZlcmVudCA8ZW0+ZmlsZXM8L2VtPiBjYW4gYmUgb3BlbmVkLjwvcD48L2RkPgorCisJPC9kbD4KKworPC9kZD4KKworCis8ZHQ+PGI+dDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+dCA8L2I+WzxlbT5sYWJlbDwvZW0+XTwvZHQ+Cis8ZGQ+VGVzdCBpZiBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbnMgaGF2ZSBiZWVuIG1hZGUgb24gYWRkcmVzc2VkIGxpbmVzLAorYW5kIGlmIHNvLCBicmFuY2ggdG8gbGluZSBtYXJrZWQgYnkgOjxlbT5sYWJlbDwvZW0+LgorKFNlZSA8Yj5iPC9iPiBhbmQgPGI+OjwvYj4uKSAgSWYgbGFiZWwgaXMgbm90CitzcGVjaWZpZWQsIGNvbnRyb2wgZmFsbHMgdGhyb3VnaCB0byBib3R0b20gb2Ygc2NyaXB0LjwvcD48L2RkPgorCisKKzxkdD48Yj53PC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj53PC9iPiA8ZW0+ZmlsZTwvZW0+PC9kdD4KKzxkZD5BcHBlbmQgY29udGVudHMgb2YgcGF0dGVybiBzcGFjZSB0byA8ZW0+ZmlsZTwvZW0+LgorVGhpcyBhY3Rpb24gb2NjdXJzIHdoZW4gdGhlIGNvbW1hbmQgaXMgZW5jb3VudGVyZWQgcmF0aGVyIHRoYW4gd2hlbgordGhlIHBhdHRlcm4gc3BhY2UgaXMgb3V0cHV0LiAgRXhhY3RseSBvbmUgc3BhY2UgbXVzdCBzZXBhcmF0ZSB0aGUKKzxiPnc8L2I+IGFuZCB0aGUgZmlsZW5hbWUuICBBIG1heGltdW0gb2YgMTAgZGlmZmVyZW50CitmaWxlcyBjYW4gYmUgb3BlbmVkIGluIGEgc2NyaXB0LiAgVGhpcyBjb21tYW5kIHdpbGwgY3JlYXRlIHRoZSBmaWxlIGlmCitpdCBkb2VzIG5vdCBleGlzdDsgaWYgdGhlIGZpbGUgZXhpc3RzLCBpdHMgY29udGVudHMgd2lsbCBiZQorb3ZlcndyaXR0ZW4gZWFjaCB0aW1lIHRoZSBzY3JpcHQgaXMgZXhlY3V0ZWQuICBNdWx0aXBsZSB3cml0ZSBjb21tYW5kcwordGhhdCBkaXJlY3Qgb3V0cHV0IHRvIHRoZSBzYW1lIGZpbGUgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuPC9wPjwvZGQ+CisKKworPGR0PjxiPng8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPng8L2I+PC9kdD4KKzxkZD5FeGNoYW5nZSBjb250ZW50cyBvZiB0aGUgcGF0dGVybiBzcGFjZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgaG9sZAorc3BhY2UuPC9wPjwvZGQ+CisKKworPGR0PjxiPnk8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPnk8L2I+LzxlbT5hYmM8L2VtPi88ZW0+eHl6PC9lbT4vPC9kdD4KKzxkZD5UcmFuc2Zvcm0gZWFjaCBjaGFyYWN0ZXIgYnkgcG9zaXRpb24gaW4gc3RyaW5nCis8ZW0+YWJjPC9lbT4gdG8gaXRzIGVxdWl2YWxlbnQgaW4gc3RyaW5nCis8ZW0+eHl6PC9lbT4uPC9wPjwvZGQ+CisKKworPC9kbD4KZGlmZiAtLWdpdCBhL2VkaXRvcnMvdmkuYyBiL2VkaXRvcnMvdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmEwYzhkCi0tLSAvZGV2L251bGwKKysrIGIvZWRpdG9ycy92aS5jCkBAIC0wLDAgKzEsNDE1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGlueSB2aS5jOiBBIHNtYWxsICd2aScgY2xvbmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBTdGVybGluZyBIdXhsZXkgPHN0ZXJsaW5nQGV1cm9wYS5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhpbmdzIFRvIERvOgorICoJRVhJTklUCisgKgkkSE9NRS8uZXhyYyAgYW5kICAuLy5leHJjCisgKglhZGQgbWFnaWMgdG8gc2VhcmNoCS9mb28uKmJhcgorICoJYWRkIDpoZWxwIGNvbW1hbmQKKyAqCTptYXAgbWFjcm9zCisgKglpZiBtYXJrW10gdmFsdWVzIHdlcmUgbGluZSBudW1iZXJzIHJhdGhlciB0aGFuIHBvaW50ZXJzCisgKgkgICBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gY2hhbmdlIHRoZSBtYXJrIHdoZW4gYWRkL2RlbGV0ZSBsaW5lcworICoJTW9yZSBpbnRlbGxpZ2VuY2UgaW4gcmVmcmVzaCgpCisgKgkiOnIgIWNtZCIgIGFuZCAgIiFjbWQiICB0byBmaWx0ZXIgdGV4dCB0aHJvdWdoIGFuIGV4dGVybmFsIGNvbW1hbmQKKyAqCUEgdHJ1ZSAidW5kbyIgZmFjaWxpdHkKKyAqCUFuICJleCIgbGluZSBvcmllbnRlZCBtb2RlLSBtYXliZSB1c2luZyAiY21kZWRpdCIKKyAqLworCisvL2NvbmZpZzpjb25maWcgVkkKKy8vY29uZmlnOglib29sICJ2aSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICAndmknIGlzIGEgdGV4dCBlZGl0b3IuIE1vcmUgc3BlY2lmaWNhbGx5LCBpdCBpcyB0aGUgT25lIFRydWUKKy8vY29uZmlnOgkgIHRleHQgZWRpdG9yIDxncmluPi4gSXQgZG9lcywgaG93ZXZlciwgaGF2ZSBhIHJhdGhlciBzdGVlcAorLy9jb25maWc6CSAgbGVhcm5pbmcgY3VydmUuIElmIHlvdSBhcmUgbm90IGFscmVhZHkgY29tZm9ydGFibGUgd2l0aCAndmknCisvL2NvbmZpZzoJICB5b3UgbWF5IHdpc2ggdG8gdXNlIHNvbWV0aGluZyBlbHNlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9NQVhfTEVOCisvL2NvbmZpZzoJaW50ICJNYXhpbXVtIHNjcmVlbiB3aWR0aCBpbiB2aSIKKy8vY29uZmlnOglyYW5nZSAyNTYgMTYzODQKKy8vY29uZmlnOglkZWZhdWx0IDQwOTYKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ29udHJhcnkgdG8gd2hhdCB5b3UgbWF5IHRoaW5rLCB0aGlzIGlzIG5vdCBlYXRpbmcgbXVjaC4KKy8vY29uZmlnOgkgIE1ha2UgaXQgc21hbGxlciB0aGFuIDRrIG9ubHkgaWYgeW91IGFyZSB2ZXJ5IGxpbWl0ZWQgb24gbWVtb3J5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV84QklUCisvL2NvbmZpZzoJYm9vbCAiQWxsb3cgdmkgdG8gZGlzcGxheSA4LWJpdCBjaGFycyAob3RoZXJ3aXNlIHNob3dzIGRvdHMpIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBJZiB5b3VyIHRlcm1pbmFsIGNhbiBkaXNwbGF5IGNoYXJhY3RlcnMgd2l0aCBoaWdoIGJpdCBzZXQsCisvL2NvbmZpZzoJICB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoaXMuIE5vdGU6IHZpIGlzIG5vdCBVbmljb2RlLWNhcGFibGUuCisvL2NvbmZpZzoJICBJZiB5b3VyIHRlcm1pbmFsIGNvbWJpbmVzIHNldmVyYWwgOC1iaXQgYnl0ZXMgaW50byBvbmUgY2hhcmFjdGVyCisvL2NvbmZpZzoJICAoYXMgaW4gVW5pY29kZSBtb2RlKSwgdGhpcyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9DT0xPTgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBcIjpcIiBjb2xvbiBjb21tYW5kcyAobm8gXCJleFwiIG1vZGUpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgYSBsaW1pdGVkIHNldCBvZiBjb2xvbiBjb21tYW5kcyBmb3IgdmkuIFRoaXMgZG9lcyBub3QKKy8vY29uZmlnOgkgIHByb3ZpZGUgYW4gImV4IiBtb2RlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9ZQU5LTUFSSworLy9jb25maWc6CWJvb2wgIkVuYWJsZSB5YW5rL3B1dCBjb21tYW5kcyBhbmQgbWFyayBjbWRzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIHdpbGwgZW5hYmxlIHlvdSB0byB1c2UgeWFuayBhbmQgcHV0LCBhcyB3ZWxsIGFzIG1hcmsgaW4KKy8vY29uZmlnOgkgIGJ1c3lib3ggdmkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1NFQVJDSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBzZWFyY2ggYW5kIHJlcGxhY2UgY21kcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU2VsZWN0IHRoaXMgaWYgeW91IHdpc2ggdG8gYmUgYWJsZSB0byBkbyBzZWFyY2ggYW5kIHJlcGxhY2UgaW4KKy8vY29uZmlnOgkgIGJ1c3lib3ggdmkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1JFR0VYX1NFQVJDSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSByZWdleCBpbiBzZWFyY2ggYW5kIHJlcGxhY2UiCisvL2NvbmZpZzoJZGVmYXVsdCBuICAgIyBVc2VzIEdOVSByZWdleCwgd2hpY2ggbWF5IGJlIHVuYXZhaWxhYmxlLiBGSVhNRQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9WSV9TRUFSQ0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBVc2UgZXh0ZW5kZWQgcmVnZXggc2VhcmNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworLy9jb25maWc6CWJvb2wgIkNhdGNoIHNpZ25hbHMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIG1ha2UgYnVzeWJveCB2aSBzaWduYWwgYXdhcmUuIFRoaXMgd2lsbAorLy9jb25maWc6CSAgbWFrZSBidXN5Ym94IHZpIHN1cHBvcnQgU0lHV0lOQ0ggdG8gZGVhbCB3aXRoIFdpbmRvdyBDaGFuZ2VzLCBjYXRjaAorLy9jb25maWc6CSAgQ3RybC1aIGFuZCBDdHJsLUMgYW5kIGFsYXJtcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfRE9UX0NNRAorLy9jb25maWc6CWJvb2wgIlJlbWVtYmVyIHByZXZpb3VzIGNtZCBhbmQgXCIuXCIgY21kIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBNYWtlIGJ1c3lib3ggdmkgcmVtZW1iZXIgdGhlIGxhc3QgY29tbWFuZCBhbmQgYmUgYWJsZSB0byByZXBlYXQgaXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1JFQURPTkxZCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1SIG9wdGlvbiBhbmQgXCJ2aWV3XCIgbW9kZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHRoZSByZWFkLW9ubHkgY29tbWFuZCBsaW5lIG9wdGlvbiwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCisvL2NvbmZpZzoJICBvcGVuIGEgZmlsZSBpbiByZWFkLW9ubHkgbW9kZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfU0VUT1BUUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBzZXQtYWJsZSBvcHRpb25zLCBhaSBpYyBzaG93bWF0Y2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB0aGUgZWRpdG9yIHRvIHNldCBzb21lIChhaSwgaWMsIHNob3dtYXRjaCkgb3B0aW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfU0VUCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IgOnNldCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBmb3IgIjpzZXQiLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9XSU5fUkVTSVpFCisvL2NvbmZpZzoJYm9vbCAiSGFuZGxlIHdpbmRvdyByZXNpemUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2UgYnVzeWJveCB2aSBiZWhhdmUgbmljZWx5IHdpdGggdGVybWluYWxzIHRoYXQgZ2V0IHJlc2l6ZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX0FTS19URVJNSU5BTAorLy9jb25maWc6CWJvb2wgIlVzZSAndGVsbCBtZSBjdXJzb3IgcG9zaXRpb24nIEVTQyBzZXF1ZW5jZSB0byBtZWFzdXJlIHdpbmRvdyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgdGVybWluYWwgc2l6ZSBjYW4ndCBiZSByZXRyaWV2ZWQgYW5kICRMSU5FUy8kQ09MVU1OUyBhcmUgbm90IHNldCwKKy8vY29uZmlnOgkgIHRoaXMgb3B0aW9uIG1ha2VzIHZpIHBlcmZvcm0gYSBsYXN0LWRpdGNoIGVmZm9ydCB0byBmaW5kIGl0OgorLy9jb25maWc6CSAgcG9zaXRpb24gY3Vyc29yIHRvIDk5OSw5OTkgYW5kIGFzayB0ZXJtaW5hbCB0byByZXBvcnQgcmVhbAorLy9jb25maWc6CSAgY3Vyc29yIHBvc2l0aW9uIHVzaW5nICJFU0MgWyA2IG4iIGVzY2FwZSBzZXF1ZW5jZSwgdGhlbiByZWFkIHN0ZGluLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGlzIGlzIG5vdCBjbGVhbiBidXQgaGVscHMgYSBsb3Qgb24gc2VyaWFsIGxpbmVzIGFuZCBzdWNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IKKy8vY29uZmlnOglib29sICJPcHRpbWl6ZSBjdXJzb3IgbW92ZW1lbnQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgd2lsbCBtYWtlIHRoZSBjdXJzb3IgbW92ZW1lbnQgZmFzdGVyLCBidXQgcmVxdWlyZXMgbW9yZSBtZW1vcnkKKy8vY29uZmlnOgkgIGFuZCBpdCBtYWtlcyB0aGUgYXBwbGV0IGEgdGlueSBiaXQgbGFyZ2VyLgorCisvL2FwcGxldDpJRl9WSShBUFBMRVQodmksIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19WSSkgKz0gdmkubworCisvL3VzYWdlOiNkZWZpbmUgdmlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdmlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFZGl0IEZJTEVcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVklfQ09MT04oCisvL3VzYWdlOiAgICAgIlxuCS1jCUluaXRpYWwgY29tbWFuZCB0byBydW4gKCRFWElOSVQgYWxzbyBhdmFpbGFibGUpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVhZC1vbmx5IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktSAlTaG9ydCBoZWxwIHJlZ2FyZGluZyBhdmFpbGFibGUgZmVhdHVyZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogU2hvdWxkIGJlIGFmdGVyIGxpYmJiLmg6IG9uIHNvbWUgc3lzdGVtcyByZWdleC5oIG5lZWRzIHN5cy90eXBlcy5oOiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFR0VYX1NFQVJDSAorIyBpbmNsdWRlIDxyZWdleC5oPgorI2VuZGlmCisKKy8qIHRoZSBDUkFTSE1FIGNvZGUgaXMgdW5tYWludGFpbmVkLCBhbmQgZG9lc24ndCBjdXJyZW50bHkgYnVpbGQgKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRSAwCisKKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfOEJJVAorLy9GSVhNRTogdGhpcyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGZvciBVbmljb2RlIGFueXdheQorIyBkZWZpbmUgSXNwcmludChjKSAoaXNwcmludCkoYykKKyNlbHNlCisjIGRlZmluZSBJc3ByaW50KGMpIGlzcHJpbnRfYXNjaWlvbmx5KGMpCisjZW5kaWYKKworI2Vsc2UKKworLyogMHg5YiBpcyBNZXRhLUVTQyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJXzhCSVQKKyMgZGVmaW5lIElzcHJpbnQoYykgKCh1bnNpZ25lZCBjaGFyKShjKSA+PSAnICcgJiYgKGMpICE9IDB4N2YgJiYgKHVuc2lnbmVkIGNoYXIpKGMpICE9IDB4OWIpCisjZWxzZQorIyBkZWZpbmUgSXNwcmludChjKSAoKHVuc2lnbmVkIGNoYXIpKGMpID49ICcgJyAmJiAodW5zaWduZWQgY2hhcikoYykgPCAweDdmKQorI2VuZGlmCisKKyNlbmRpZgorCisKK2VudW0geworCU1BWF9UQUJTVE9QID0gMzIsIC8vIHNhbml0eSBsaW1pdAorCS8vIFVzZXIgaW5wdXQgbGVuLiBOZWVkIG5vdCBiZSBleHRyYSBiaWcuCisJLy8gTGluZXMgaW4gZmlsZSBiZWluZyBlZGl0ZWQgKmNhbiogYmUgYmlnZ2VyIHRoYW4gdGhpcy4KKwlNQVhfSU5QVVRfTEVOID0gMTI4LAorCS8vIFNhbml0eSBsaW1pdHMuIFdlIGhhdmUgb25seSBvbmUgYnVmZmVyIG9mIHRoaXMgc2l6ZS4KKwlNQVhfU0NSX0NPTFMgPSBDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOLAorCU1BWF9TQ1JfUk9XUyA9IENPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU4sCit9OworCisvKiB2dDEwMiB0eXBpY2FsIEVTQyBzZXF1ZW5jZSAqLworLyogdGVybWluYWwgc3RhbmRvdXQgc3RhcnQvbm9ybWFsIEVTQyBzZXF1ZW5jZSAqLworI2RlZmluZSBTT3MgIlwwMzNbN20iCisjZGVmaW5lIFNPbiAiXDAzM1swbSIKKy8qIHRlcm1pbmFsIGJlbGwgc2VxdWVuY2UgKi8KKyNkZWZpbmUgYmVsbCAiXDAwNyIKKy8qIENsZWFyLWVuZC1vZi1saW5lIGFuZCBDbGVhci1lbmQtb2Ytc2NyZWVuIEVTQyBzZXF1ZW5jZSAqLworI2RlZmluZSBDZW9sICJcMDMzW0siCisjZGVmaW5lIENlb3MgIlwwMzNbSiIKKy8qIEN1cnNvciBtb3Rpb24gYXJiaXRyYXJ5IGRlc3RpbmF0aW9uIEVTQyBzZXF1ZW5jZSAqLworI2RlZmluZSBDTXJjICJcMDMzWyV1OyV1SCIKKy8qIEN1cnNvciBtb3Rpb24gdXAgYW5kIGRvd24gRVNDIHNlcXVlbmNlICovCisjZGVmaW5lIENNdXAgIlwwMzNbQSIKKyNkZWZpbmUgQ01kb3duICJcbiIKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQgfHwgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKy8vIGNtZHMgbW9kaWZ5aW5nIHRleHRbXQorLy8gdmRhOiByZW1vdmVkICJhQWlJcyIgYXMgdGhleSBzd2l0Y2ggdXMgaW50byBpbnNlcnQgbW9kZQorLy8gYW5kIHJlbWVtYmVyaW5nIGlucHV0IGZvciByZXBsYXkgYWZ0ZXIgdGhlbSBtYWtlcyBubyBzZW5zZQorc3RhdGljIGNvbnN0IGNoYXIgbW9kaWZ5aW5nX2NtZHNbXSA9ICJjQ2RESm9PcFByUnhYPD5+IjsKKyNlbmRpZgorCitlbnVtIHsKKwlZQU5LT05MWSA9IEZBTFNFLAorCVlBTktERUwgPSBUUlVFLAorCUZPUldBUkQgPSAxLAkvLyBjb2RlIGRlcGVuZHMgb24gIjEiICBmb3IgYXJyYXkgaW5kZXgKKwlCQUNLID0gLTEsCS8vIGNvZGUgZGVwZW5kcyBvbiAiLTEiIGZvciBhcnJheSBpbmRleAorCUxJTUlURUQgPSAwLAkvLyBob3cgbXVjaCBvZiB0ZXh0W10gaW4gY2hhcl9zZWFyY2gKKwlGVUxMID0gMSwJLy8gaG93IG11Y2ggb2YgdGV4dFtdIGluIGNoYXJfc2VhcmNoCisKKwlTX0JFRk9SRV9XUyA9IDEsCS8vIHVzZWQgaW4gc2tpcF90aGluZygpIGZvciBtb3ZpbmcgImRvdCIKKwlTX1RPX1dTID0gMiwJCS8vIHVzZWQgaW4gc2tpcF90aGluZygpIGZvciBtb3ZpbmcgImRvdCIKKwlTX09WRVJfV1MgPSAzLAkJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorCVNfRU5EX1BVTkNUID0gNCwJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorCVNfRU5EX0FMTlVNID0gNSwJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorfTsKKworCisvKiB2aS5jIGV4cGVjdHMgY2hhcnMgdG8gYmUgdW5zaWduZWQuICovCisvKiBidXN5Ym94IGJ1aWxkIHN5c3RlbSBwcm92aWRlcyB0aGF0LCBidXQgaXQncyBiZXR0ZXIgKi8KKy8qIHRvIGF1ZGl0IGFuZCBmaXggdGhlIHNvdXJjZSAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogbWFueSByZWZlcmVuY2VzIC0ga2VlcCBuZWFyIHRoZSB0b3Agb2YgZ2xvYmFscyAqLworCWNoYXIgKnRleHQsICplbmQ7ICAgICAgIC8vIHBvaW50ZXJzIHRvIHRoZSB1c2VyIGRhdGEgaW4gbWVtb3J5CisJY2hhciAqZG90OyAgICAgICAgICAgICAgLy8gd2hlcmUgYWxsIHRoZSBhY3Rpb24gdGFrZXMgcGxhY2UKKwlpbnQgdGV4dF9zaXplOwkJLy8gc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcgorCisJLyogdGhlIHJlc3QgKi8KKwlzbWFsbGludCB2aV9zZXRvcHM7CisjZGVmaW5lIFZJX0FVVE9JTkRFTlQgMQorI2RlZmluZSBWSV9TSE9XTUFUQ0ggIDIKKyNkZWZpbmUgVklfSUdOT1JFQ0FTRSA0CisjZGVmaW5lIFZJX0VSUl9NRVRIT0QgOAorI2RlZmluZSBhdXRvaW5kZW50ICh2aV9zZXRvcHMgJiBWSV9BVVRPSU5ERU5UKQorI2RlZmluZSBzaG93bWF0Y2ggICh2aV9zZXRvcHMgJiBWSV9TSE9XTUFUQ0ggKQorI2RlZmluZSBpZ25vcmVjYXNlICh2aV9zZXRvcHMgJiBWSV9JR05PUkVDQVNFKQorLyogaW5kaWNhdGUgZXJyb3Igd2l0aCBiZWVwIG9yIGZsYXNoICovCisjZGVmaW5lIGVycl9tZXRob2QgKHZpX3NldG9wcyAmIFZJX0VSUl9NRVRIT0QpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWQorCXNtYWxsaW50IHJlYWRvbmx5X21vZGU7CisjZGVmaW5lIFNFVF9SRUFET05MWV9GSUxFKGZsYWdzKSAgICAgICAgKChmbGFncykgfD0gMHgwMSkKKyNkZWZpbmUgU0VUX1JFQURPTkxZX01PREUoZmxhZ3MpICAgICAgICAoKGZsYWdzKSB8PSAweDAyKQorI2RlZmluZSBVTlNFVF9SRUFET05MWV9GSUxFKGZsYWdzKSAgICAgICgoZmxhZ3MpICY9IDB4ZmUpCisjZWxzZQorI2RlZmluZSBTRVRfUkVBRE9OTFlfRklMRShmbGFncykgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBTRVRfUkVBRE9OTFlfTU9ERShmbGFncykgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBVTlNFVF9SRUFET05MWV9GSUxFKGZsYWdzKSAgICAgICgodm9pZCkwKQorI2VuZGlmCisKKwlzbWFsbGludCBlZGl0aW5nOyAgICAgICAgLy8gPjAgd2hpbGUgd2UgYXJlIGVkaXRpbmcgYSBmaWxlCisJICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtjb2RlIGF1ZGl0IHNheXMgImNhbiBiZSAwLCAxIG9yIDIgb25seSJdCisJc21hbGxpbnQgY21kX21vZGU7ICAgICAgIC8vIDA9Y29tbWFuZCAgMT1pbnNlcnQgMj1yZXBsYWNlCisJaW50IGZpbGVfbW9kaWZpZWQ7ICAgICAgIC8vIGJ1ZmZlciBjb250ZW50cyBjaGFuZ2VkIChjb3VudGVyLCBub3QgZmxhZyEpCisJaW50IGxhc3RfZmlsZV9tb2RpZmllZDsgIC8vID0gLTE7CisJaW50IGZuX3N0YXJ0OyAgICAgICAgICAgIC8vIGluZGV4IG9mIGZpcnN0IGNtZCBsaW5lIGZpbGUgbmFtZQorCWludCBzYXZlX2FyZ2M7ICAgICAgICAgICAvLyBob3cgbWFueSBmaWxlIG5hbWVzIG9uIGNtZCBsaW5lCisJaW50IGNtZGNudDsgICAgICAgICAgICAgIC8vIHJlcGV0aXRpb24gY291bnQKKwl1bnNpZ25lZCByb3dzLCBjb2x1bW5zOwkgLy8gdGhlIHRlcm1pbmFsIHNjcmVlbiBpcyB0aGlzIHNpemUKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwKKwlpbnQgZ2V0X3Jvd2NvbF9lcnJvcjsKKyNlbmRpZgorCWludCBjcm93LCBjY29sOyAgICAgICAgICAvLyBjdXJzb3IgaXMgb24gQ3JvdyB4IENjb2wKKwlpbnQgb2Zmc2V0OyAgICAgICAgICAgICAgLy8gY2hhcnMgc2Nyb2xsZWQgb2ZmIHRoZSBzY3JlZW4gdG8gdGhlIGxlZnQKKwlpbnQgaGF2ZV9zdGF0dXNfbXNnOyAgICAgLy8gaXMgZGVmYXVsdCBlZGl0IHN0YXR1cyBuZWVkZWQ/CisJICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtkb24ndCBtYWtlIHNtYWxsaW50IV0KKwlpbnQgbGFzdF9zdGF0dXNfY2tzdW07ICAgLy8gaGFzaCBvZiBjdXJyZW50IHN0YXR1cyBsaW5lCisJY2hhciAqY3VycmVudF9maWxlbmFtZTsKKwljaGFyICpzY3JlZW5iZWdpbjsgICAgICAgLy8gaW5kZXggaW50byB0ZXh0W10sIG9mIHRvcCBsaW5lIG9uIHRoZSBzY3JlZW4KKwljaGFyICpzY3JlZW47ICAgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgdmlydHVhbCBzY3JlZW4gYnVmZmVyCisJaW50IHNjcmVlbnNpemU7ICAgICAgICAgIC8vICAgICAgICAgICAgYW5kIGl0cyBzaXplCisJaW50IHRhYnN0b3A7CisJaW50IGxhc3RfZm9yd2FyZF9jaGFyOyAgIC8vIGxhc3QgY2hhciBzZWFyY2hlZCBmb3Igd2l0aCAnZicgKGludCBiZWNhdXNlIG9mIFVuaWNvZGUpCisJY2hhciBlcmFzZV9jaGFyOyAgICAgICAgIC8vIHRoZSB1c2VycyBlcmFzZSBjaGFyYWN0ZXIKKwljaGFyIGxhc3RfaW5wdXRfY2hhcjsgICAgLy8gbGFzdCBjaGFyIHJlYWQgZnJvbSB1c2VyCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECisJc21hbGxpbnQgYWRkaW5nMnE7CSAvLyBhcmUgd2UgY3VycmVudGx5IGFkZGluZyB1c2VyIGlucHV0IHRvIHEKKwlpbnQgbG1jX2xlbjsgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIGxhc3RfbW9kaWZ5aW5nX2NtZAorCWNoYXIgKmlvcSwgKmlvcV9zdGFydDsgICAvLyBwb2ludGVyIHRvIHN0cmluZyBmb3IgZ2V0X29uZV9jaGFyIHRvICJyZWFkIgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SCisJaW50IGxhc3Rfcm93OwkJIC8vIHdoZXJlIHRoZSBjdXJzb3Igd2FzIGxhc3QgbW92ZWQgdG8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwlpbnQgbXlfcGlkOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJY2hhciAqbGFzdF9zZWFyY2hfcGF0dGVybjsgLy8gbGFzdCBwYXR0ZXJuIGZyb20gYSAnLycgb3IgJz8nIHNlYXJjaAorI2VuZGlmCisKKwkvKiBmb3JtZXIgc3RhdGljcyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJY2hhciAqZWRpdF9maWxlX19jdXJfbGluZTsKKyNlbmRpZgorCWludCByZWZyZXNoX19vbGRfb2Zmc2V0OworCWludCBmb3JtYXRfZWRpdF9zdGF0dXNfX3RvdDsKKworCS8qIGEgZmV3IHJlZmVyZW5jZXMgb25seSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJaW50IFlEcmVnLCBVcmVnOyAgICAgICAgLy8gZGVmYXVsdCBkZWxldGUgcmVnaXN0ZXIgYW5kIG9yaWcgbGluZSBmb3IgIlUiCisJY2hhciAqcmVnWzI4XTsgICAgICAgICAgLy8gbmFtZWQgcmVnaXN0ZXIgYS16LCAiRCIsIGFuZCAiVSIgMC0yNSwyNiwyNworCWNoYXIgKm1hcmtbMjhdOyAgICAgICAgIC8vIHVzZXIgbWFya3MgcG9pbnRzIHNvbWV3aGVyZSBpbiB0ZXh0W10tICBhLXogYW5kIHByZXZpb3VzIGNvbnRleHQgJycKKwljaGFyICpjb250ZXh0X3N0YXJ0LCAqY29udGV4dF9lbmQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworCXNpZ2ptcF9idWYgcmVzdGFydDsgICAgIC8vIGNhdGNoX3NpZygpCisjZW5kaWYKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtX29yaWcsIHRlcm1fdmk7IC8vIHJlbWVtYmVyIHdoYXQgdGhlIGNvb2tlZCBtb2RlIHdhcworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCisJY2hhciAqaW5pdGlhbF9jbWRzWzNdOyAgLy8gY3VycmVudGx5IDIgZW50cmllcywgTlVMTCB0ZXJtaW5hdGVkCisjZW5kaWYKKwkvLyBTaG91bGQgYmUganVzdCBlbm91Z2ggdG8gaG9sZCBhIGtleSBzZXF1ZW5jZSwKKwkvLyBidXQgQ1JBU0hNRSBtb2RlIHVzZXMgaXQgYXMgZ2VuZXJhdGVkIGNvbW1hbmQgYnVmZmVyIHRvbworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwljaGFyIHJlYWRidWZmZXJbMTI4XTsKKyNlbHNlCisJY2hhciByZWFkYnVmZmVyW0tFWUNPREVfQlVGRkVSX1NJWkVdOworI2VuZGlmCisjZGVmaW5lIFNUQVRVU19CVUZGRVJfTEVOICAyMDAKKwljaGFyIHN0YXR1c19idWZmZXJbU1RBVFVTX0JVRkZFUl9MRU5dOyAvLyBtZXNzYWdlcyB0byB0aGUgdXNlcgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwljaGFyIGxhc3RfbW9kaWZ5aW5nX2NtZFtNQVhfSU5QVVRfTEVOXTsJLy8gbGFzdCBtb2RpZnlpbmcgY21kIGZvciAiLiIKKyNlbmRpZgorCWNoYXIgZ2V0X2lucHV0X2xpbmVfX2J1ZltNQVhfSU5QVVRfTEVOXTsgLyogZm9ybWVyIHN0YXRpYyAqLworCisJY2hhciBzY3Jfb3V0X2J1ZltNQVhfU0NSX0NPTFMgKyBNQVhfVEFCU1RPUCAqIDJdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB0ZXh0ICAgICAgICAgICAoRy50ZXh0ICAgICAgICAgICkKKyNkZWZpbmUgdGV4dF9zaXplICAgICAgKEcudGV4dF9zaXplICAgICApCisjZGVmaW5lIGVuZCAgICAgICAgICAgIChHLmVuZCAgICAgICAgICAgKQorI2RlZmluZSBkb3QgICAgICAgICAgICAoRy5kb3QgICAgICAgICAgICkKKyNkZWZpbmUgcmVnICAgICAgICAgICAgKEcucmVnICAgICAgICAgICApCisKKyNkZWZpbmUgdmlfc2V0b3BzICAgICAgICAgICAgICAgKEcudmlfc2V0b3BzICAgICAgICAgICkKKyNkZWZpbmUgZWRpdGluZyAgICAgICAgICAgICAgICAgKEcuZWRpdGluZyAgICAgICAgICAgICkKKyNkZWZpbmUgY21kX21vZGUgICAgICAgICAgICAgICAgKEcuY21kX21vZGUgICAgICAgICAgICkKKyNkZWZpbmUgZmlsZV9tb2RpZmllZCAgICAgICAgICAgKEcuZmlsZV9tb2RpZmllZCAgICAgICkKKyNkZWZpbmUgbGFzdF9maWxlX21vZGlmaWVkICAgICAgKEcubGFzdF9maWxlX21vZGlmaWVkICkKKyNkZWZpbmUgZm5fc3RhcnQgICAgICAgICAgICAgICAgKEcuZm5fc3RhcnQgICAgICAgICAgICkKKyNkZWZpbmUgc2F2ZV9hcmdjICAgICAgICAgICAgICAgKEcuc2F2ZV9hcmdjICAgICAgICAgICkKKyNkZWZpbmUgY21kY250ICAgICAgICAgICAgICAgICAgKEcuY21kY250ICAgICAgICAgICAgICkKKyNkZWZpbmUgcm93cyAgICAgICAgICAgICAgICAgICAgKEcucm93cyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgY29sdW1ucyAgICAgICAgICAgICAgICAgKEcuY29sdW1ucyAgICAgICAgICAgICkKKyNkZWZpbmUgY3JvdyAgICAgICAgICAgICAgICAgICAgKEcuY3JvdyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgY2NvbCAgICAgICAgICAgICAgICAgICAgKEcuY2NvbCAgICAgICAgICAgICAgICkKKyNkZWZpbmUgb2Zmc2V0ICAgICAgICAgICAgICAgICAgKEcub2Zmc2V0ICAgICAgICAgICAgICkKKyNkZWZpbmUgc3RhdHVzX2J1ZmZlciAgICAgICAgICAgKEcuc3RhdHVzX2J1ZmZlciAgICAgICkKKyNkZWZpbmUgaGF2ZV9zdGF0dXNfbXNnICAgICAgICAgKEcuaGF2ZV9zdGF0dXNfbXNnICAgICkKKyNkZWZpbmUgbGFzdF9zdGF0dXNfY2tzdW0gICAgICAgKEcubGFzdF9zdGF0dXNfY2tzdW0gICkKKyNkZWZpbmUgY3VycmVudF9maWxlbmFtZSAgICAgICAgKEcuY3VycmVudF9maWxlbmFtZSAgICkKKyNkZWZpbmUgc2NyZWVuICAgICAgICAgICAgICAgICAgKEcuc2NyZWVuICAgICAgICAgICAgICkKKyNkZWZpbmUgc2NyZWVuc2l6ZSAgICAgICAgICAgICAgKEcuc2NyZWVuc2l6ZSAgICAgICAgICkKKyNkZWZpbmUgc2NyZWVuYmVnaW4gICAgICAgICAgICAgKEcuc2NyZWVuYmVnaW4gICAgICAgICkKKyNkZWZpbmUgdGFic3RvcCAgICAgICAgICAgICAgICAgKEcudGFic3RvcCAgICAgICAgICAgICkKKyNkZWZpbmUgbGFzdF9mb3J3YXJkX2NoYXIgICAgICAgKEcubGFzdF9mb3J3YXJkX2NoYXIgICkKKyNkZWZpbmUgZXJhc2VfY2hhciAgICAgICAgICAgICAgKEcuZXJhc2VfY2hhciAgICAgICAgICkKKyNkZWZpbmUgbGFzdF9pbnB1dF9jaGFyICAgICAgICAgKEcubGFzdF9pbnB1dF9jaGFyICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWQorI2RlZmluZSByZWFkb25seV9tb2RlICAgICAgICAgICAoRy5yZWFkb25seV9tb2RlICAgICAgKQorI2Vsc2UKKyNkZWZpbmUgcmVhZG9ubHlfbW9kZSAgICAgICAgICAgMAorI2VuZGlmCisjZGVmaW5lIGFkZGluZzJxICAgICAgICAgICAgICAgIChHLmFkZGluZzJxICAgICAgICAgICApCisjZGVmaW5lIGxtY19sZW4gICAgICAgICAgICAgICAgIChHLmxtY19sZW4gICAgICAgICAgICApCisjZGVmaW5lIGlvcSAgICAgICAgICAgICAgICAgICAgIChHLmlvcSAgICAgICAgICAgICAgICApCisjZGVmaW5lIGlvcV9zdGFydCAgICAgICAgICAgICAgIChHLmlvcV9zdGFydCAgICAgICAgICApCisjZGVmaW5lIGxhc3Rfcm93ICAgICAgICAgICAgICAgIChHLmxhc3Rfcm93ICAgICAgICAgICApCisjZGVmaW5lIG15X3BpZCAgICAgICAgICAgICAgICAgIChHLm15X3BpZCAgICAgICAgICAgICApCisjZGVmaW5lIGxhc3Rfc2VhcmNoX3BhdHRlcm4gICAgIChHLmxhc3Rfc2VhcmNoX3BhdHRlcm4pCisKKyNkZWZpbmUgZWRpdF9maWxlX19jdXJfbGluZSAgICAgKEcuZWRpdF9maWxlX19jdXJfbGluZSkKKyNkZWZpbmUgcmVmcmVzaF9fb2xkX29mZnNldCAgICAgKEcucmVmcmVzaF9fb2xkX29mZnNldCkKKyNkZWZpbmUgZm9ybWF0X2VkaXRfc3RhdHVzX190b3QgKEcuZm9ybWF0X2VkaXRfc3RhdHVzX190b3QpCisKKyNkZWZpbmUgWURyZWcgICAgICAgICAgKEcuWURyZWcgICAgICAgICApCisjZGVmaW5lIFVyZWcgICAgICAgICAgIChHLlVyZWcgICAgICAgICAgKQorI2RlZmluZSBtYXJrICAgICAgICAgICAoRy5tYXJrICAgICAgICAgICkKKyNkZWZpbmUgY29udGV4dF9zdGFydCAgKEcuY29udGV4dF9zdGFydCApCisjZGVmaW5lIGNvbnRleHRfZW5kICAgIChHLmNvbnRleHRfZW5kICAgKQorI2RlZmluZSByZXN0YXJ0ICAgICAgICAoRy5yZXN0YXJ0ICAgICAgICkKKyNkZWZpbmUgdGVybV9vcmlnICAgICAgKEcudGVybV9vcmlnICAgICApCisjZGVmaW5lIHRlcm1fdmkgICAgICAgIChHLnRlcm1fdmkgICAgICAgKQorI2RlZmluZSBpbml0aWFsX2NtZHMgICAoRy5pbml0aWFsX2NtZHMgICkKKyNkZWZpbmUgcmVhZGJ1ZmZlciAgICAgKEcucmVhZGJ1ZmZlciAgICApCisjZGVmaW5lIHNjcl9vdXRfYnVmICAgIChHLnNjcl9vdXRfYnVmICAgKQorI2RlZmluZSBsYXN0X21vZGlmeWluZ19jbWQgIChHLmxhc3RfbW9kaWZ5aW5nX2NtZCApCisjZGVmaW5lIGdldF9pbnB1dF9saW5lX19idWYgKEcuZ2V0X2lucHV0X2xpbmVfX2J1ZikKKworI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWxhc3RfZmlsZV9tb2RpZmllZCA9IC0xOyBcCisJLyogIiIgYnV0IGhhcyBzcGFjZSBmb3IgMiBjaGFyczogKi8gXAorCUlGX0ZFQVRVUkVfVklfU0VBUkNIKGxhc3Rfc2VhcmNoX3BhdHRlcm4gPSB4emFsbG9jKDIpOykgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgaW50IGluaXRfdGV4dF9idWZmZXIoY2hhciAqKTsgLy8gaW5pdCBmcm9tIGZpbGUgb3IgY3JlYXRlIG5ldworc3RhdGljIHZvaWQgZWRpdF9maWxlKGNoYXIgKik7CS8vIGVkaXQgb25lIGZpbGUKK3N0YXRpYyB2b2lkIGRvX2NtZChpbnQpOwkvLyBleGVjdXRlIGEgY29tbWFuZAorc3RhdGljIGludCBuZXh0X3RhYnN0b3AoaW50KTsKK3N0YXRpYyB2b2lkIHN5bmNfY3Vyc29yKGNoYXIgKiwgaW50ICosIGludCAqKTsJLy8gc3luY2hyb25pemUgdGhlIHNjcmVlbiBjdXJzb3IgdG8gZG90CitzdGF0aWMgY2hhciAqYmVnaW5fbGluZShjaGFyICopOwkvLyByZXR1cm4gcG9pbnRlciB0byBjdXIgbGluZSBCLW8tbAorc3RhdGljIGNoYXIgKmVuZF9saW5lKGNoYXIgKik7CS8vIHJldHVybiBwb2ludGVyIHRvIGN1ciBsaW5lIEUtby1sCitzdGF0aWMgY2hhciAqcHJldl9saW5lKGNoYXIgKik7CS8vIHJldHVybiBwb2ludGVyIHRvIHByZXYgbGluZSBCLW8tbAorc3RhdGljIGNoYXIgKm5leHRfbGluZShjaGFyICopOwkvLyByZXR1cm4gcG9pbnRlciB0byBuZXh0IGxpbmUgQi1vLWwKK3N0YXRpYyBjaGFyICplbmRfc2NyZWVuKHZvaWQpOwkvLyBnZXQgcG9pbnRlciB0byBsYXN0IGNoYXIgb24gc2NyZWVuCitzdGF0aWMgaW50IGNvdW50X2xpbmVzKGNoYXIgKiwgY2hhciAqKTsJLy8gY291bnQgbGluZSBmcm9tIHN0YXJ0IHRvIHN0b3AKK3N0YXRpYyBjaGFyICpmaW5kX2xpbmUoaW50KTsJLy8gZmluZCBiZWdpbmluZyBvZiBsaW5lICNsaQorc3RhdGljIGNoYXIgKm1vdmVfdG9fY29sKGNoYXIgKiwgaW50KTsJLy8gbW92ZSAicCIgdG8gY29sdW1uIGwKK3N0YXRpYyB2b2lkIGRvdF9sZWZ0KHZvaWQpOwkvLyBtb3ZlIGRvdCBsZWZ0LSBkb250IGxlYXZlIGxpbmUKK3N0YXRpYyB2b2lkIGRvdF9yaWdodCh2b2lkKTsJLy8gbW92ZSBkb3QgcmlnaHQtIGRvbnQgbGVhdmUgbGluZQorc3RhdGljIHZvaWQgZG90X2JlZ2luKHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBCLW8tbAorc3RhdGljIHZvaWQgZG90X2VuZCh2b2lkKTsJLy8gbW92ZSBkb3QgdG8gRS1vLWwKK3N0YXRpYyB2b2lkIGRvdF9uZXh0KHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBuZXh0IGxpbmUgQi1vLWwKK3N0YXRpYyB2b2lkIGRvdF9wcmV2KHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBwcmV2IGxpbmUgQi1vLWwKK3N0YXRpYyB2b2lkIGRvdF9zY3JvbGwoaW50LCBpbnQpOwkvLyBtb3ZlIHRoZSBzY3JlZW4gdXAgb3IgZG93bgorc3RhdGljIHZvaWQgZG90X3NraXBfb3Zlcl93cyh2b2lkKTsJLy8gbW92ZSBkb3QgcGF0IFdTCitzdGF0aWMgdm9pZCBkb3RfZGVsZXRlKHZvaWQpOwkvLyBkZWxldGUgdGhlIGNoYXIgYXQgJ2RvdCcKK3N0YXRpYyBjaGFyICpib3VuZF9kb3QoY2hhciAqKTsJLy8gbWFrZSBzdXJlICB0ZXh0WzBdIDw9IFAgPCAiZW5kIgorc3RhdGljIGNoYXIgKm5ld19zY3JlZW4oaW50LCBpbnQpOwkvLyBtYWxsb2MgdmlydHVhbCBzY3JlZW4gbWVtb3J5CitzdGF0aWMgY2hhciAqY2hhcl9pbnNlcnQoY2hhciAqLCBjaGFyKTsJLy8gaW5zZXJ0IHRoZSBjaGFyIGMgYXQgJ3AnCisvLyBtaWdodCByZWFsbG9jYXRlIHRleHRbXSEgdXNlIHAgKz0gc3R1cGlkX2luc2VydChwLCAuLi4pLAorLy8gYW5kIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBwb2ludGVycyBpbnRvIHBvdGVudGlhbGx5IGZyZWVkIHRleHRbXSEKK3N0YXRpYyB1aW50cHRyX3Qgc3R1cGlkX2luc2VydChjaGFyICosIGNoYXIpOwkvLyBzdHVwaWRseSBpbnNlcnQgdGhlIGNoYXIgYyBhdCAncCcKK3N0YXRpYyBpbnQgZmluZF9yYW5nZShjaGFyICoqLCBjaGFyICoqLCBjaGFyKTsJLy8gcmV0dXJuIHBvaW50ZXJzIGZvciBhbiBvYmplY3QKK3N0YXRpYyBpbnQgc3RfdGVzdChjaGFyICosIGludCwgaW50LCBjaGFyICopOwkvLyBoZWxwZXIgZm9yIHNraXBfdGhpbmcoKQorc3RhdGljIGNoYXIgKnNraXBfdGhpbmcoY2hhciAqLCBpbnQsIGludCwgaW50KTsJLy8gc2tpcCBzb21lIG9iamVjdAorc3RhdGljIGNoYXIgKmZpbmRfcGFpcihjaGFyICosIGNoYXIpOwkvLyBmaW5kIG1hdGNoaW5nIHBhaXIgKCkgIFtdICB7fQorc3RhdGljIGNoYXIgKnRleHRfaG9sZV9kZWxldGUoY2hhciAqLCBjaGFyICopOwkvLyBhdCAicCIsIGRlbGV0ZSBhICdzaXplJyBieXRlIGhvbGUKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSB0ZXh0X2hvbGVfbWFrZShwLCAuLi4pLAorLy8gYW5kIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBwb2ludGVycyBpbnRvIHBvdGVudGlhbGx5IGZyZWVkIHRleHRbXSEKK3N0YXRpYyB1aW50cHRyX3QgdGV4dF9ob2xlX21ha2UoY2hhciAqLCBpbnQpOwkvLyBhdCAicCIsIG1ha2UgYSAnc2l6ZScgYnl0ZSBob2xlCitzdGF0aWMgY2hhciAqeWFua19kZWxldGUoY2hhciAqLCBjaGFyICosIGludCwgaW50KTsJLy8geWFuayB0ZXh0W10gaW50byByZWdpc3RlciB0aGVuIGRlbGV0ZQorc3RhdGljIHZvaWQgc2hvd19oZWxwKHZvaWQpOwkvLyBkaXNwbGF5IHNvbWUgaGVscCBpbmZvCitzdGF0aWMgdm9pZCByYXdtb2RlKHZvaWQpOwkvLyBzZXQgInJhdyIgbW9kZSBvbiB0dHkKK3N0YXRpYyB2b2lkIGNvb2ttb2RlKHZvaWQpOwkvLyByZXR1cm4gdG8gImNvb2tlZCIgbW9kZSBvbiB0dHkKKy8vIHNsZWVwIGZvciAnaCcgMS8xMDAgc2Vjb25kcywgcmV0dXJuIDEvMCBpZiBzdGRpbiBpcyAocmVhZHkgZm9yIHJlYWQpLyhub3QgcmVhZHkpCitzdGF0aWMgaW50IG15c2xlZXAoaW50KTsKK3N0YXRpYyBpbnQgcmVhZGl0KHZvaWQpOwkvLyByZWFkIChtYXliZSBjdXJzb3IpIGtleSBmcm9tIHN0ZGluCitzdGF0aWMgaW50IGdldF9vbmVfY2hhcih2b2lkKTsJLy8gcmVhZCAxIGNoYXIgZnJvbSBzdGRpbgorc3RhdGljIGludCBmaWxlX3NpemUoY29uc3QgY2hhciAqKTsgICAvLyB3aGF0IGlzIHRoZSBieXRlIHNpemUgb2YgImZuIgorI2lmICFFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWQorI2RlZmluZSBmaWxlX2luc2VydChmbiwgcCwgdXBkYXRlX3JvX3N0YXR1cykgZmlsZV9pbnNlcnQoZm4sIHApCisjZW5kaWYKKy8vIGZpbGVfaW5zZXJ0IG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdIQorc3RhdGljIGludCBmaWxlX2luc2VydChjb25zdCBjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgZmlsZV93cml0ZShjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SCisjZGVmaW5lIHBsYWNlX2N1cnNvcihhLCBiLCBvcHRpbWl6ZSkgcGxhY2VfY3Vyc29yKGEsIGIpCisjZW5kaWYKK3N0YXRpYyB2b2lkIHBsYWNlX2N1cnNvcihpbnQsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHNjcmVlbl9lcmFzZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3RvX2VvbCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNsZWFyX3RvX2Vvcyh2b2lkKTsKK3N0YXRpYyB2b2lkIGdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKHZvaWQpOworc3RhdGljIHZvaWQgc3RhbmRvdXRfc3RhcnQodm9pZCk7CS8vIHNlbmQgInN0YXJ0IHJldmVyc2UgdmlkZW8iIHNlcXVlbmNlCitzdGF0aWMgdm9pZCBzdGFuZG91dF9lbmQodm9pZCk7CS8vIHNlbmQgImVuZCByZXZlcnNlIHZpZGVvIiBzZXF1ZW5jZQorc3RhdGljIHZvaWQgZmxhc2goaW50KTsJCS8vIGZsYXNoIHRoZSB0ZXJtaW5hbCBzY3JlZW4KK3N0YXRpYyB2b2lkIHNob3dfc3RhdHVzX2xpbmUodm9pZCk7CS8vIHB1dCBhIG1lc3NhZ2Ugb24gdGhlIGJvdHRvbSBsaW5lCitzdGF0aWMgdm9pZCBzdGF0dXNfbGluZShjb25zdCBjaGFyICosIC4uLik7ICAgICAvLyBwcmludCB0byBzdGF0dXMgYnVmCitzdGF0aWMgdm9pZCBzdGF0dXNfbGluZV9ib2xkKGNvbnN0IGNoYXIgKiwgLi4uKTsKK3N0YXRpYyB2b2lkIG5vdF9pbXBsZW1lbnRlZChjb25zdCBjaGFyICopOyAvLyBkaXNwbGF5ICJOb3QgaW1wbGVtZW50ZWQiIG1lc3NhZ2UKK3N0YXRpYyBpbnQgZm9ybWF0X2VkaXRfc3RhdHVzKHZvaWQpOwkvLyBmb3JtYXQgZmlsZSBzdGF0dXMgb24gc3RhdHVzIGxpbmUKK3N0YXRpYyB2b2lkIHJlZHJhdyhpbnQpOwkvLyBmb3JjZSBhIGZ1bGwgc2NyZWVuIHJlZnJlc2gKK3N0YXRpYyBjaGFyKiBmb3JtYXRfbGluZShjaGFyKiAvKiwgaW50Ki8pOworc3RhdGljIHZvaWQgcmVmcmVzaChpbnQpOwkvLyB1cGRhdGUgdGhlIHRlcm1pbmFsIGZyb20gc2NyZWVuW10KKworc3RhdGljIHZvaWQgSW5kaWNhdGVfRXJyb3Iodm9pZCk7ICAgICAgIC8vIHVzZSBmbGFzaCBvciBiZWVwIHRvIGluZGljYXRlIGVycm9yCisjZGVmaW5lIGluZGljYXRlX2Vycm9yKGMpIEluZGljYXRlX0Vycm9yKCkKK3N0YXRpYyB2b2lkIEhpdF9SZXR1cm4odm9pZCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKK3N0YXRpYyBjaGFyICpjaGFyX3NlYXJjaChjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwkvLyBzZWFyY2ggZm9yIHBhdHRlcm4gc3RhcnRpbmcgYXQgcAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KK3N0YXRpYyBjaGFyICpnZXRfb25lX2FkZHJlc3MoY2hhciAqLCBpbnQgKik7CS8vIGdldCBjb2xvbiBhZGRyLCBpZiBwcmVzZW50CitzdGF0aWMgY2hhciAqZ2V0X2FkZHJlc3MoY2hhciAqLCBpbnQgKiwgaW50ICopOwkvLyBnZXQgdHdvIGNvbG9uIGFkZHJzLCBpZiBwcmVzZW50CitzdGF0aWMgdm9pZCBjb2xvbihjaGFyICopOwkvLyBleGVjdXRlIHRoZSAiY29sb24iIG1vZGUgY21kcworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVVNFX1NJR05BTFMKK3N0YXRpYyB2b2lkIHdpbmNoX3NpZyhpbnQpOwkvLyBjYXRjaCB3aW5kb3cgc2l6ZSBjaGFuZ2VzCitzdGF0aWMgdm9pZCBzdXNwZW5kX3NpZyhpbnQpOwkvLyBjYXRjaCBjdHJsLVoKK3N0YXRpYyB2b2lkIGNhdGNoX3NpZyhpbnQpOyAgICAgLy8gY2F0Y2ggY3RybC1DIGFuZCBhbGFybSB0aW1lLW91dHMKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKK3N0YXRpYyB2b2lkIHN0YXJ0X25ld19jbWRfcShjaGFyKTsJLy8gbmV3IHF1ZXVlIGZvciBjb21tYW5kCitzdGF0aWMgdm9pZCBlbmRfY21kX3Eodm9pZCk7CS8vIHN0b3Agc2F2aW5nIGlucHV0IGNoYXJzCisjZWxzZQorI2RlZmluZSBlbmRfY21kX3EoKSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKK3N0YXRpYyB2b2lkIHNob3dtYXRjaGluZyhjaGFyICopOwkvLyBzaG93IHRoZSBtYXRjaGluZyBwYWlyICgpICBbXSAge30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLIHx8IChFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTiAmJiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gpIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSBzdHJpbmdfaW5zZXJ0KHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCBzdHJpbmdfaW5zZXJ0KGNoYXIgKiwgY29uc3QgY2hhciAqKTsJLy8gaW5zZXJ0IHRoZSBzdHJpbmcgYXQgJ3AnCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworc3RhdGljIGNoYXIgKnRleHRfeWFuayhjaGFyICosIGNoYXIgKiwgaW50KTsJLy8gc2F2ZSBjb3B5IG9mICJwIiBpbnRvIGEgcmVnaXN0ZXIKK3N0YXRpYyBjaGFyIHdoYXRfcmVnKHZvaWQpOwkJLy8gd2hhdCBpcyBsZXR0ZXIgb2YgY3VycmVudCBZRHJlZworc3RhdGljIHZvaWQgY2hlY2tfY29udGV4dChjaGFyKTsJLy8gcmVtZW1iZXIgY29udGV4dCBmb3IgJycgY29tbWFuZAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorc3RhdGljIHZvaWQgY3Jhc2hfZHVtbXkoKTsKK3N0YXRpYyB2b2lkIGNyYXNoX3Rlc3QoKTsKK3N0YXRpYyBpbnQgY3Jhc2htZSA9IDA7CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCB3cml0ZTEoY29uc3QgY2hhciAqb3V0KQoreworCWZwdXRzKG91dCwgc3Rkb3V0KTsKK30KKworaW50IHZpX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB2aV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVVNFX1NJR05BTFMgfHwgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCW15X3BpZCA9IGdldHBpZCgpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCXNyYW5kKChsb25nKSBteV9waWQpOworI2VuZGlmCisjaWZkZWYgTk9fU1VDSF9BUFBMRVRfWUVUCisJLyogSWYgd2UgYXJlbid0ICJ2aSIsIHdlIGFyZSAidmlldyIgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkgJiYgYXBwbGV0X25hbWVbMl0pIHsKKwkJU0VUX1JFQURPTkxZX01PREUocmVhZG9ubHlfbW9kZSk7CisJfQorI2VuZGlmCisKKwl2aV9zZXRvcHMgPSBWSV9BVVRPSU5ERU5UIHwgVklfU0hPV01BVENIIHwgVklfSUdOT1JFQ0FTRTsKKwkvLyAgMS0gIHByb2Nlc3MgJEhPTUUvLmV4cmMgZmlsZSAobm90IGlucGxlbWVudGVkIHlldCkKKwkvLyAgMi0gIHByb2Nlc3MgRVhJTklUIHZhcmlhYmxlIGZyb20gZW52aXJvbm1lbnQKKwkvLyAgMy0gIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3MKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorCXsKKwkJY2hhciAqcCA9IGdldGVudigiRVhJTklUIik7CisJCWlmIChwICYmICpwKQorCQkJaW5pdGlhbF9jbWRzWzBdID0geHN0cm5kdXAocCwgTUFYX0lOUFVUX0xFTik7CisJfQorI2VuZGlmCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoQ1JIIiBJRl9GRUFUVVJFX1ZJX0NPTE9OKCJjOiIpKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCQljYXNlICdDJzoKKwkJCWNyYXNobWUgPSAxOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWQorCQljYXNlICdSJzoJCS8vIFJlYWQtb25seSBmbGFnCisJCQlTRVRfUkVBRE9OTFlfTU9ERShyZWFkb25seV9tb2RlKTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KKwkJY2FzZSAnYyc6CQkvLyBjbWQgbGluZSB2aSBjb21tYW5kCisJCQlpZiAoKm9wdGFyZykKKwkJCQlpbml0aWFsX2NtZHNbaW5pdGlhbF9jbWRzWzBdICE9IDBdID0geHN0cm5kdXAob3B0YXJnLCBNQVhfSU5QVVRfTEVOKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgJ0gnOgorCQkJc2hvd19oZWxwKCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLy8gVGhlIGFyZ3YgYXJyYXkgY2FuIGJlIHVzZWQgYnkgdGhlICI6bmV4dCIgIGFuZCAiOnJld2luZCIgY29tbWFuZHMKKwkvLyBzYXZlIG9wdGluZC4KKwlmbl9zdGFydCA9IG9wdGluZDsJLy8gcmVtZW1iZXIgZmlyc3QgZmlsZSBuYW1lIGZvciA6bmV4dCBhbmQgOnJldworCXNhdmVfYXJnYyA9IGFyZ2M7CisKKwkvLy0tLS0tIFRoaXMgaXMgdGhlIG1haW4gZmlsZSBoYW5kbGluZyBsb29wIC0tLS0tLS0tLS0tLS0tCisJd2hpbGUgKDEpIHsKKwkJZWRpdF9maWxlKGFyZ3Zbb3B0aW5kXSk7IC8qIHBhcmFtIG1pZ2h0IGJlIE5VTEwgKi8KKwkJaWYgKCsrb3B0aW5kID49IGFyZ2MpCisJCQlicmVhazsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgdGV4dCBmcm9tIGZpbGUgb3IgY3JlYXRlIGFuIGVtcHR5IGJ1ZiAqLworLyogd2lsbCBhbHNvIHVwZGF0ZSBjdXJyZW50X2ZpbGVuYW1lICovCitzdGF0aWMgaW50IGluaXRfdGV4dF9idWZmZXIoY2hhciAqZm4pCit7CisJaW50IHJjOworCWludCBzaXplID0gZmlsZV9zaXplKGZuKTsJLy8gZmlsZSBzaXplLiAtMSBtZWFucyBkb2VzIG5vdCBleGlzdC4KKworCS8qIGFsbG9jYXRlL3JlYWxsb2NhdGUgdGV4dCBidWZmZXIgKi8KKwlmcmVlKHRleHQpOworCXRleHRfc2l6ZSA9IHNpemUgKyAxMDI0MDsKKwlzY3JlZW5iZWdpbiA9IGRvdCA9IGVuZCA9IHRleHQgPSB4emFsbG9jKHRleHRfc2l6ZSk7CisKKwlpZiAoZm4gIT0gY3VycmVudF9maWxlbmFtZSkgeworCQlmcmVlKGN1cnJlbnRfZmlsZW5hbWUpOworCQljdXJyZW50X2ZpbGVuYW1lID0geHN0cmR1cChmbik7CisJfQorCWlmIChzaXplIDwgMCkgeworCQkvLyBmaWxlIGRvbnQgZXhpc3QuIFN0YXJ0IGVtcHR5IGJ1ZiB3aXRoIGR1bW15IGxpbmUKKwkJY2hhcl9pbnNlcnQodGV4dCwgJ1xuJyk7CisJCXJjID0gMDsKKwl9IGVsc2UgeworCQlyYyA9IGZpbGVfaW5zZXJ0KGZuLCB0ZXh0LCAxKTsKKwl9CisJZmlsZV9tb2RpZmllZCA9IDA7CisJbGFzdF9maWxlX21vZGlmaWVkID0gLTE7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkvKiBpbml0IHRoZSBtYXJrcy4gKi8KKwltZW1zZXQobWFyaywgMCwgc2l6ZW9mKG1hcmspKTsKKyNlbmRpZgorCXJldHVybiByYzsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1dJTl9SRVNJWkUKK3N0YXRpYyBpbnQgcXVlcnlfc2NyZWVuX2RpbWVuc2lvbnModm9pZCkKK3sKKwlpbnQgZXJyID0gZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERJTl9GSUxFTk8sICZjb2x1bW5zLCAmcm93cyk7CisJaWYgKHJvd3MgPiBNQVhfU0NSX1JPV1MpCisJCXJvd3MgPSBNQVhfU0NSX1JPV1M7CisJaWYgKGNvbHVtbnMgPiBNQVhfU0NSX0NPTFMpCisJCWNvbHVtbnMgPSBNQVhfU0NSX0NPTFM7CisJcmV0dXJuIGVycjsKK30KKyNlbHNlCisjIGRlZmluZSBxdWVyeV9zY3JlZW5fZGltZW5zaW9ucygpICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGVkaXRfZmlsZShjaGFyICpmbikKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworI2RlZmluZSBjdXJfbGluZSBlZGl0X2ZpbGVfX2N1cl9saW5lCisjZW5kaWYKKwlpbnQgYzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworCWludCBzaWc7CisjZW5kaWYKKworCWVkaXRpbmcgPSAxOwkvLyAwID0gZXhpdCwgMSA9IG9uZSBmaWxlLCAyID0gbXVsdGlwbGUgZmlsZXMKKwlyYXdtb2RlKCk7CisJcm93cyA9IDI0OworCWNvbHVtbnMgPSA4MDsKKwlJRl9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTChHLmdldF9yb3djb2xfZXJyb3IgPSkgcXVlcnlfc2NyZWVuX2RpbWVuc2lvbnMoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwKKwlpZiAoRy5nZXRfcm93Y29sX2Vycm9yIC8qIFRPRE8/ICYmIG5vIGlucHV0IG9uIHN0ZGluICovKSB7CisJCXVpbnQ2NF90IGs7CisJCXdyaXRlMSgiXDAzM1s5OTk7OTk5SCIgIlwwMzNbNm4iKTsKKwkJZmZsdXNoX2FsbCgpOworCQlrID0gcmVhZF9rZXkoU1RESU5fRklMRU5PLCByZWFkYnVmZmVyLCAvKnRpbWVvdXRfbXM6Ki8gMTAwKTsKKwkJaWYgKChpbnQzMl90KWsgPT0gS0VZQ09ERV9DVVJTT1JfUE9TKSB7CisJCQl1aW50MzJfdCByYyA9IChrID4+IDMyKTsKKwkJCWNvbHVtbnMgPSAocmMgJiAweDdmZmYpOworCQkJaWYgKGNvbHVtbnMgPiBNQVhfU0NSX0NPTFMpCisJCQkJY29sdW1ucyA9IE1BWF9TQ1JfQ09MUzsKKwkJCXJvd3MgPSAoKHJjID4+IDE2KSAmIDB4N2ZmZik7CisJCQlpZiAocm93cyA+IE1BWF9TQ1JfUk9XUykKKwkJCQlyb3dzID0gTUFYX1NDUl9ST1dTOworCQl9CisJfQorI2VuZGlmCisJbmV3X3NjcmVlbihyb3dzLCBjb2x1bW5zKTsJLy8gZ2V0IG1lbW9yeSBmb3IgdmlydHVhbCBzY3JlZW4KKwlpbml0X3RleHRfYnVmZmVyKGZuKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJWURyZWcgPSAyNjsJCQkvLyBkZWZhdWx0IFlhbmsvRGVsZXRlIHJlZworCVVyZWcgPSAyNzsJCQkvLyBob2xkIG9yaWcgbGluZSBmb3IgIlUiIGNtZAorCW1hcmtbMjZdID0gbWFya1syN10gPSB0ZXh0OwkvLyBpbml0ICJwcmV2aW91cyBjb250ZXh0IgorI2VuZGlmCisKKwlsYXN0X2ZvcndhcmRfY2hhciA9IGxhc3RfaW5wdXRfY2hhciA9ICdcMCc7CisJY3JvdyA9IDA7CisJY2NvbCA9IDA7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworCXNpZ25hbChTSUdJTlQsIGNhdGNoX3NpZyk7CisJc2lnbmFsKFNJR1dJTkNILCB3aW5jaF9zaWcpOworCXNpZ25hbChTSUdUU1RQLCBzdXNwZW5kX3NpZyk7CisJc2lnID0gc2lnc2V0am1wKHJlc3RhcnQsIDEpOworCWlmIChzaWcgIT0gMCkgeworCQlzY3JlZW5iZWdpbiA9IGRvdCA9IHRleHQ7CisJfQorI2VuZGlmCisKKwljbWRfbW9kZSA9IDA7CQkvLyAwPWNvbW1hbmQgIDE9aW5zZXJ0ICAyPSdSJ2VwbGFjZQorCWNtZGNudCA9IDA7CisJdGFic3RvcCA9IDg7CisJb2Zmc2V0ID0gMDsJCQkvLyBubyBob3Jpem9udGFsIG9mZnNldAorCWMgPSAnXDAnOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwlmcmVlKGlvcV9zdGFydCk7CisJaW9xID0gaW9xX3N0YXJ0ID0gTlVMTDsKKwlsbWNfbGVuID0gMDsKKwlhZGRpbmcycSA9IDA7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCisJeworCQljaGFyICpwLCAqcTsKKwkJaW50IG4gPSAwOworCisJCXdoaWxlICgocCA9IGluaXRpYWxfY21kc1tuXSkgIT0gTlVMTCkgeworCQkJZG8geworCQkJCXEgPSBwOworCQkJCXAgPSBzdHJjaHIocSwgJ1xuJyk7CisJCQkJaWYgKHApCisJCQkJCXdoaWxlICgqcCA9PSAnXG4nKQorCQkJCQkJKnArKyA9ICdcMCc7CisJCQkJaWYgKCpxKQorCQkJCQljb2xvbihxKTsKKwkJCX0gd2hpbGUgKHApOworCQkJZnJlZShpbml0aWFsX2NtZHNbbl0pOworCQkJaW5pdGlhbF9jbWRzW25dID0gTlVMTDsKKwkJCW4rKzsKKwkJfQorCX0KKyNlbmRpZgorCXJlZHJhdyhGQUxTRSk7CQkJLy8gZG9udCBmb3JjZSBldmVyeSBjb2wgcmUtZHJhdworCS8vLS0tLS0tVGhpcyBpcyB0aGUgbWFpbiBWaSBjbWQgaGFuZGxpbmcgbG9vcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXdoaWxlIChlZGl0aW5nID4gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwkJaWYgKGNyYXNobWUgPiAwKSB7CisJCQlpZiAoKGVuZCAtIHRleHQpID4gMSkgeworCQkJCWNyYXNoX2R1bW15KCk7CS8vIGdlbmVyYXRlIGEgcmFuZG9tIGNvbW1hbmQKKwkJCX0gZWxzZSB7CisJCQkJY3Jhc2htZSA9IDA7CisJCQkJc3RyaW5nX2luc2VydCh0ZXh0LCAiXG5cbiMjIyMjICBSYW4gb3V0IG9mIHRleHQgdG8gd29yayBvbi4gICMjIyMjXG5cbiIpOyAvLyBpbnNlcnQgdGhlIHN0cmluZworCQkJCWRvdCA9IHRleHQ7CisJCQkJcmVmcmVzaChGQUxTRSk7CisJCQl9CisJCX0KKyNlbmRpZgorCQlsYXN0X2lucHV0X2NoYXIgPSBjID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCBhIGNtZCBmcm9tIHVzZXIKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCQkvLyBzYXZlIGEgY29weSBvZiB0aGUgY3VycmVudCBsaW5lLSBmb3IgdGhlICdVIiBjb21tYW5kCisJCWlmIChiZWdpbl9saW5lKGRvdCkgIT0gY3VyX2xpbmUpIHsKKwkJCWN1cl9saW5lID0gYmVnaW5fbGluZShkb3QpOworCQkJdGV4dF95YW5rKGJlZ2luX2xpbmUoZG90KSwgZW5kX2xpbmUoZG90KSwgVXJlZyk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwkJLy8gVGhlc2UgYXJlIGNvbW1hbmRzIHRoYXQgY2hhbmdlIHRleHRbXS4KKwkJLy8gUmVtZW1iZXIgdGhlIGlucHV0IGZvciB0aGUgIi4iIGNvbW1hbmQKKwkJaWYgKCFhZGRpbmcycSAmJiBpb3Ffc3RhcnQgPT0gTlVMTAorCQkgJiYgY21kX21vZGUgPT0gMCAvLyBjb21tYW5kIG1vZGUKKwkJICYmIGMgPiAnXDAnIC8vIGV4Y2x1ZGUgTlVMIGFuZCBub24tQVNDSUkgY2hhcnMKKwkJICYmIGMgPCAweDdmIC8vIChVbmljb2RlIGFuZCBzdWNoKQorCQkgJiYgc3RyY2hyKG1vZGlmeWluZ19jbWRzLCBjKQorCQkpIHsKKwkJCXN0YXJ0X25ld19jbWRfcShjKTsKKwkJfQorI2VuZGlmCisJCWRvX2NtZChjKTsJCS8vIGV4ZWN1dGUgdGhlIHVzZXIgY29tbWFuZAorCisJCS8vIHBvbGwgdG8gc2VlIGlmIHRoZXJlIGlzIGlucHV0IGFscmVhZHkgd2FpdGluZy4gaWYgd2UgYXJlCisJCS8vIG5vdCBhYmxlIHRvIGRpc3BsYXkgb3V0cHV0IGZhc3QgZW5vdWdoIHRvIGtlZXAgdXAsIHNraXAKKwkJLy8gdGhlIGRpc3BsYXkgdXBkYXRlIHVudGlsIHdlIGNhdGNoIHVwIHdpdGggaW5wdXQuCisJCWlmICghcmVhZGJ1ZmZlclswXSAmJiBteXNsZWVwKDApID09IDApIHsKKwkJCS8vIG5vIGlucHV0IHBlbmRpbmcgLSBzbyB1cGRhdGUgb3V0cHV0CisJCQlyZWZyZXNoKEZBTFNFKTsKKwkJCXNob3dfc3RhdHVzX2xpbmUoKTsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwkJaWYgKGNyYXNobWUgPiAwKQorCQkJY3Jhc2hfdGVzdCgpOwkvLyB0ZXN0IGVkaXRvciB2YXJpYWJsZXMKKyNlbmRpZgorCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJY29va21vZGUoKTsKKyN1bmRlZiBjdXJfbGluZQorfQorCisvLy0tLS0tIFRoZSBDb2xvbiBjb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KK3N0YXRpYyBjaGFyICpnZXRfb25lX2FkZHJlc3MoY2hhciAqcCwgaW50ICphZGRyKQkvLyBnZXQgY29sb24gYWRkciwgaWYgcHJlc2VudAoreworCWludCBzdDsKKwljaGFyICpxOworCUlGX0ZFQVRVUkVfVklfWUFOS01BUksoY2hhciBjOykKKwlJRl9GRUFUVVJFX1ZJX1NFQVJDSChjaGFyICpwYXQ7KQorCisJKmFkZHIgPSAtMTsJCQkvLyBhc3N1bWUgbm8gYWRkcgorCWlmICgqcCA9PSAnLicpIHsJLy8gdGhlIGN1cnJlbnQgbGluZQorCQlwKys7CisJCXEgPSBiZWdpbl9saW5lKGRvdCk7CisJCSphZGRyID0gY291bnRfbGluZXModGV4dCwgcSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJZWxzZSBpZiAoKnAgPT0gJ1wnJykgewkvLyBpcyB0aGlzIGEgbWFyayBhZGRyCisJCXArKzsKKwkJYyA9IHRvbG93ZXIoKnApOworCQlwKys7CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworCQkJLy8gd2UgaGF2ZSBhIG1hcmsKKwkJCWMgPSBjIC0gJ2EnOworCQkJcSA9IG1hcmtbKHVuc2lnbmVkIGNoYXIpIGNdOworCQkJaWYgKHEgIT0gTlVMTCkgewkvLyBpcyBtYXJrIHZhbGlkCisJCQkJKmFkZHIgPSBjb3VudF9saW5lcyh0ZXh0LCBxKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSAorCWVsc2UgaWYgKCpwID09ICcvJykgewkvLyBhIHNlYXJjaCBwYXR0ZXJuCisJCXEgPSBzdHJjaHJudWwoKytwLCAnLycpOworCQlwYXQgPSB4c3RybmR1cChwLCBxIC0gcCk7IC8vIHNhdmUgY29weSBvZiBwYXR0ZXJuCisJCXAgPSBxOworCQlpZiAoKnAgPT0gJy8nKQorCQkJcCsrOworCQlxID0gY2hhcl9zZWFyY2goZG90LCBwYXQsIEZPUldBUkQsIEZVTEwpOworCQlpZiAocSAhPSBOVUxMKSB7CisJCQkqYWRkciA9IGNvdW50X2xpbmVzKHRleHQsIHEpOworCQl9CisJCWZyZWUocGF0KTsKKwl9CisjZW5kaWYKKwllbHNlIGlmICgqcCA9PSAnJCcpIHsJLy8gdGhlIGxhc3QgbGluZSBpbiBmaWxlCisJCXArKzsKKwkJcSA9IGJlZ2luX2xpbmUoZW5kIC0gMSk7CisJCSphZGRyID0gY291bnRfbGluZXModGV4dCwgcSk7CisJfSBlbHNlIGlmIChpc2RpZ2l0KCpwKSkgewkvLyBzcGVjaWZpYyBsaW5lIG51bWJlcgorCQlzc2NhbmYocCwgIiVkJW4iLCBhZGRyLCAmc3QpOworCQlwICs9IHN0OworCX0gZWxzZSB7CisJCS8vIHVucmVjb2duaXplZCBhZGRyZXNzIC0gYXNzdW1lIC0xCisJCSphZGRyID0gLTE7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqZ2V0X2FkZHJlc3MoY2hhciAqcCwgaW50ICpiLCBpbnQgKmUpCS8vIGdldCB0d28gY29sb24gYWRkcnMsIGlmIHByZXNlbnQKK3sKKwkvLy0tLS0tIGdldCB0aGUgYWRkcmVzcycgaS5lLiwgMSwzICAgJ2EsJ2IgIC0tLS0tCisJLy8gZ2V0IEZJUlNUIGFkZHIsIGlmIHByZXNlbnQKKwl3aGlsZSAoaXNibGFuaygqcCkpCisJCXArKzsJCQkJLy8gc2tpcCBvdmVyIGxlYWRpbmcgc3BhY2VzCisJaWYgKCpwID09ICclJykgewkJCS8vIGFsaWFzIGZvciAxLCQKKwkJcCsrOworCQkqYiA9IDE7CisJCSplID0gY291bnRfbGluZXModGV4dCwgZW5kLTEpOworCQlnb3RvIGdhMDsKKwl9CisJcCA9IGdldF9vbmVfYWRkcmVzcyhwLCBiKTsKKwl3aGlsZSAoaXNibGFuaygqcCkpCisJCXArKzsKKwlpZiAoKnAgPT0gJywnKSB7CQkJLy8gaXMgdGhlcmUgYSBhZGRyZXNzIHNlcGFyYXRvcgorCQlwKys7CisJCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJCXArKzsKKwkJLy8gZ2V0IFNFQ09ORCBhZGRyLCBpZiBwcmVzZW50CisJCXAgPSBnZXRfb25lX2FkZHJlc3MocCwgZSk7CisJfQorIGdhMDoKKwl3aGlsZSAoaXNibGFuaygqcCkpCisJCXArKzsJCQkJLy8gc2tpcCBvdmVyIHRyYWlsaW5nIHNwYWNlcworCXJldHVybiBwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUICYmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKK3N0YXRpYyB2b2lkIHNldG9wcyhjb25zdCBjaGFyICphcmdzLCBjb25zdCBjaGFyICpvcG5hbWUsIGludCBmbGdfbm8sCisJCQljb25zdCBjaGFyICpzaG9ydF9vcG5hbWUsIGludCBvcHQpCit7CisJY29uc3QgY2hhciAqYSA9IGFyZ3MgKyBmbGdfbm87CisJaW50IGwgPSBzdHJsZW4ob3BuYW1lKSAtIDE7IC8qIG9wbmFtZSBoYXZlICsgJyAnICovCisKKwkvLyBtYXliZSBzdHJuY21wPyB3ZSBoYWQgdG9ucyBvZiBlcnJvbmVvdXMgc3RybmNhc2VjbXAncy4uLgorCWlmIChzdHJuY2FzZWNtcChhLCBvcG5hbWUsIGwpID09IDAKKwkgfHwgc3RybmNhc2VjbXAoYSwgc2hvcnRfb3BuYW1lLCAyKSA9PSAwCisJKSB7CisJCWlmIChmbGdfbm8pCisJCQl2aV9zZXRvcHMgJj0gfm9wdDsKKwkJZWxzZQorCQkJdmlfc2V0b3BzIHw9IG9wdDsKKwl9Cit9CisjZW5kaWYKKworLy8gYnVmIG11c3QgYmUgbm8gbG9uZ2VyIHRoYW4gTUFYX0lOUFVUX0xFTiEKK3N0YXRpYyB2b2lkIGNvbG9uKGNoYXIgKmJ1ZikKK3sKKwljaGFyIGMsICpvcmlnX2J1ZiwgKmJ1ZjEsICpxLCAqcjsKKwljaGFyICpmbiwgY21kW01BWF9JTlBVVF9MRU5dLCBhcmdzW01BWF9JTlBVVF9MRU5dOworCWludCBpLCBsLCBsaSwgY2gsIGIsIGU7CisJaW50IHVzZWZvcmNlLCBmb3JjZWQgPSBGQUxTRTsKKworCS8vIDozMTU0CS8vIGlmICgtZSBsaW5lIDMxNTQpIGdvdG8gaXQgIGVsc2Ugc3RheSBwdXQKKwkvLyA6NCwzM3chIGZvbwkvLyB3cml0ZSBhIHBvcnRpb24gb2YgYnVmZmVyIHRvIGZpbGUgImZvbyIKKwkvLyA6dwkJLy8gd3JpdGUgYWxsIG9mIGJ1ZmZlciB0byBjdXJyZW50IGZpbGUKKwkvLyA6cQkJLy8gcXVpdAorCS8vIDpxIQkJLy8gcXVpdC0gZG9udCBjYXJlIGFib3V0IG1vZGlmaWVkIGZpbGUKKwkvLyA6J2EsJ3ohc29ydCAtdSAgIC8vIGZpbHRlciBibG9jayB0aHJvdWdoIHNvcnQKKwkvLyA6J2YJCS8vIGdvdG8gbWFyayAiZiIKKwkvLyA6J2ZsCQkvLyBsaXN0IGxpdGVyYWwgdGhlIG1hcmsgImYiIGxpbmUKKwkvLyA6LnIgYmFyCS8vIHJlYWQgZmlsZSAiYmFyIiBpbnRvIGJ1ZmZlciBiZWZvcmUgZG90CisJLy8gOi8xMjMvLC9hYmMvZCAgICAvLyBkZWxldGUgbGluZXMgZnJvbSAiMTIzIiBsaW5lIHRvICJhYmMiIGxpbmUKKwkvLyA6L3h5ei8JLy8gZ290byB0aGUgInh5eiIgbGluZQorCS8vIDpzL2ZpbmQvcmVwbGFjZS8gLy8gc3Vic3RpdHV0ZSBwYXR0ZXJuICJmaW5kIiB3aXRoICJyZXBsYWNlIgorCS8vIDohPGNtZD4JLy8gcnVuIDxjbWQ+IHRoZW4gcmV0dXJuCisJLy8KKworCWlmICghYnVmWzBdKQorCQlnb3RvIHJldDsKKwlpZiAoKmJ1ZiA9PSAnOicpCisJCWJ1ZisrOwkJCS8vIG1vdmUgcGFzdCB0aGUgJzonCisKKwlsaSA9IGNoID0gaSA9IDA7CisJYiA9IGUgPSAtMTsKKwlxID0gdGV4dDsJCQkvLyBhc3N1bWUgMSwkIGZvciB0aGUgcmFuZ2UKKwlyID0gZW5kIC0gMTsKKwlsaSA9IGNvdW50X2xpbmVzKHRleHQsIGVuZCAtIDEpOworCWZuID0gY3VycmVudF9maWxlbmFtZTsKKworCS8vIGxvb2sgZm9yIG9wdGlvbmFsIGFkZHJlc3MoZXMpICA6LiAgOjEgIDoxLDkgICA6J3EsJ2EgICA6JQorCWJ1ZiA9IGdldF9hZGRyZXNzKGJ1ZiwgJmIsICZlKTsKKworCS8vIHJlbWVtYmVyIG9yaWcgY29tbWFuZCBsaW5lCisJb3JpZ19idWYgPSBidWY7CisKKwkvLyBnZXQgdGhlIENPTU1BTkQgaW50byBjbWRbXQorCWJ1ZjEgPSBjbWQ7CisJd2hpbGUgKCpidWYgIT0gJ1wwJykgeworCQlpZiAoaXNzcGFjZSgqYnVmKSkKKwkJCWJyZWFrOworCQkqYnVmMSsrID0gKmJ1ZisrOworCX0KKwkqYnVmMSA9ICdcMCc7CisJLy8gZ2V0IGFueSBBUkd1bWVudHMKKwl3aGlsZSAoaXNibGFuaygqYnVmKSkKKwkJYnVmKys7CisJc3RyY3B5KGFyZ3MsIGJ1Zik7CisJdXNlZm9yY2UgPSBGQUxTRTsKKwlidWYxID0gbGFzdF9jaGFyX2lzKGNtZCwgJyEnKTsKKwlpZiAoYnVmMSkgeworCQl1c2Vmb3JjZSA9IFRSVUU7CisJCSpidWYxID0gJ1wwJzsgICAvLyBnZXQgcmlkIG9mICEKKwl9CisJaWYgKGIgPj0gMCkgeworCQkvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBhZGRyLCB0aGVuIHRoZSBhZGRyCisJCS8vIGlzIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc2luZ2xlIGxpbmUgdGhlCisJCS8vIHVzZXIgd2FudHMuIFNvLCByZXNldCB0aGUgZW5kCisJCS8vIHBvaW50ZXIgdG8gcG9pbnQgYXQgZW5kIG9mIHRoZSAiYiIgbGluZQorCQlxID0gZmluZF9saW5lKGIpOwkvLyB3aGF0IGxpbmUgaXMgI2IKKwkJciA9IGVuZF9saW5lKHEpOworCQlsaSA9IDE7CisJfQorCWlmIChlID49IDApIHsKKwkJLy8gd2Ugd2VyZSBnaXZlbiB0d28gYWRkcnMuICBjaGFuZ2UgdGhlCisJCS8vIGVuZCBwb2ludGVyIHRvIHRoZSBhZGRyIGdpdmVuIGJ5IHVzZXIuCisJCXIgPSBmaW5kX2xpbmUoZSk7CS8vIHdoYXQgbGluZSBpcyAjZQorCQlyID0gZW5kX2xpbmUocik7CisJCWxpID0gZSAtIGIgKyAxOworCX0KKwkvLyAtLS0tLS0tLS0tLS0gbm93IGxvb2sgZm9yIHRoZSBjb21tYW5kIC0tLS0tLS0tLS0tLQorCWkgPSBzdHJsZW4oY21kKTsKKwlpZiAoaSA9PSAwKSB7CQkvLyA6MTIzQ1IgZ290byBsaW5lICMxMjMKKwkJaWYgKGIgPj0gMCkgeworCQkJZG90ID0gZmluZF9saW5lKGIpOwkvLyB3aGF0IGxpbmUgaXMgI2IKKwkJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9BTExPV19FWEVDCisJZWxzZSBpZiAoY21kWzBdID09ICchJykgewkvLyBydW4gYSBjbWQKKwkJaW50IHJldGNvZGU7CisJCS8vIDohbHMgICBydW4gdGhlIDxjbWQ+CisJCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJCWNvb2ttb2RlKCk7CisJCXJldGNvZGUgPSBzeXN0ZW0ob3JpZ19idWYgKyAxKTsJLy8gcnVuIHRoZSBjbWQKKwkJaWYgKHJldGNvZGUpCisJCQlwcmludGYoIlxuc2hlbGwgcmV0dXJuZWQgJWlcblxuIiwgcmV0Y29kZSk7CisJCXJhd21vZGUoKTsKKwkJSGl0X1JldHVybigpOwkJCS8vIGxldCB1c2VyIHNlZSByZXN1bHRzCisJfQorI2VuZGlmCisJZWxzZSBpZiAoY21kWzBdID09ICc9JyAmJiAhY21kWzFdKSB7CS8vIHdoZXJlIGlzIHRoZSBhZGRyZXNzCisJCWlmIChiIDwgMCkgewkvLyBubyBhZGRyIGdpdmVuLSB1c2UgZGVmYXVsdHMKKwkJCWIgPSBlID0gY291bnRfbGluZXModGV4dCwgZG90KTsKKwkJfQorCQlzdGF0dXNfbGluZSgiJWQiLCBiKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAiZGVsZXRlIiwgaSkgPT0gMCkgewkvLyBkZWxldGUgbGluZXMKKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJcSA9IGJlZ2luX2xpbmUoZG90KTsJLy8gYXNzdW1lIC4sLiBmb3IgdGhlIHJhbmdlCisJCQlyID0gZW5kX2xpbmUoZG90KTsKKwkJfQorCQlkb3QgPSB5YW5rX2RlbGV0ZShxLCByLCAxLCBZQU5LREVMKTsJLy8gc2F2ZSwgdGhlbiBkZWxldGUgbGluZXMKKwkJZG90X3NraXBfb3Zlcl93cygpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJlZGl0IiwgaSkgPT0gMCkgewkvLyBFZGl0IGEgZmlsZQorCQkvLyBkb24ndCBlZGl0LCBpZiB0aGUgY3VycmVudCBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkCisJCWlmIChmaWxlX21vZGlmaWVkICYmICF1c2Vmb3JjZSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKDplZGl0ISBvdmVycmlkZXMpIik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAoYXJnc1swXSkgeworCQkJLy8gdGhlIHVzZXIgc3VwcGxpZWQgYSBmaWxlIG5hbWUKKwkJCWZuID0gYXJnczsKKwkJfSBlbHNlIGlmIChjdXJyZW50X2ZpbGVuYW1lICYmIGN1cnJlbnRfZmlsZW5hbWVbMF0pIHsKKwkJCS8vIG5vIHVzZXIgc3VwcGxpZWQgbmFtZS0gdXNlIHRoZSBjdXJyZW50IGZpbGVuYW1lCisJCQkvLyBmbiA9IGN1cnJlbnRfZmlsZW5hbWU7ICB3YXMgc2V0IGJ5IGRlZmF1bHQKKwkJfSBlbHNlIHsKKwkJCS8vIG5vIHVzZXIgZmlsZSBuYW1lLCBubyBjdXJyZW50IG5hbWUtIHB1bnQKKwkJCXN0YXR1c19saW5lX2JvbGQoIk5vIGN1cnJlbnQgZmlsZW5hbWUiKTsKKwkJCWdvdG8gcmV0OworCQl9CisKKwkJaWYgKGluaXRfdGV4dF9idWZmZXIoZm4pIDwgMCkKKwkJCWdvdG8gcmV0OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkJaWYgKFVyZWcgPj0gMCAmJiBVcmVnIDwgMjggJiYgcmVnW1VyZWddICE9IDApIHsKKwkJCWZyZWUocmVnW1VyZWddKTsJLy8gICBmcmVlIG9yaWcgbGluZSByZWctIGZvciAnVScKKwkJCXJlZ1tVcmVnXT0gMDsKKwkJfQorCQlpZiAoWURyZWcgPj0gMCAmJiBZRHJlZyA8IDI4ICYmIHJlZ1tZRHJlZ10gIT0gMCkgeworCQkJZnJlZShyZWdbWURyZWddKTsJLy8gICBmcmVlIGRlZmF1bHQgeWFuay9kZWxldGUgcmVnaXN0ZXIKKwkJCXJlZ1tZRHJlZ109IDA7CisJCX0KKyNlbmRpZgorCQkvLyBob3cgbWFueSBsaW5lcyBpbiB0ZXh0W10/CisJCWxpID0gY291bnRfbGluZXModGV4dCwgZW5kIC0gMSk7CisJCXN0YXR1c19saW5lKCJcIiVzXCIlcyIKKwkJCUlGX0ZFQVRVUkVfVklfUkVBRE9OTFkoIiVzIikKKwkJCSIgJWRMLCAlZEMiLCBjdXJyZW50X2ZpbGVuYW1lLAorCQkJKGZpbGVfc2l6ZShmbikgPCAwID8gIiBbTmV3IGZpbGVdIiA6ICIiKSwKKwkJCUlGX0ZFQVRVUkVfVklfUkVBRE9OTFkoCisJCQkJKChyZWFkb25seV9tb2RlKSA/ICIgW1JlYWRvbmx5XSIgOiAiIiksCisJCQkpCisJCQlsaSwgY2gpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJmaWxlIiwgaSkgPT0gMCkgewkvLyB3aGF0IEZpbGUgaXMgdGhpcworCQlpZiAoYiAhPSAtMSB8fCBlICE9IC0xKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyBhZGRyZXNzIGFsbG93ZWQgb24gdGhpcyBjb21tYW5kIik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAoYXJnc1swXSkgeworCQkJLy8gdXNlciB3YW50cyBhIG5ldyBmaWxlbmFtZQorCQkJZnJlZShjdXJyZW50X2ZpbGVuYW1lKTsKKwkJCWN1cnJlbnRfZmlsZW5hbWUgPSB4c3RyZHVwKGFyZ3MpOworCQl9IGVsc2UgeworCQkJLy8gdXNlciB3YW50cyBmaWxlIHN0YXR1cyBpbmZvCisJCQlsYXN0X3N0YXR1c19ja3N1bSA9IDA7CS8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwkJfQorCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJmZWF0dXJlcyIsIGkpID09IDApIHsJLy8gd2hhdCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlCisJCS8vIHByaW50IG91dCB2YWx1ZXMgb2YgYWxsIGZlYXR1cmVzCisJCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJCWNvb2ttb2RlKCk7CisJCXNob3dfaGVscCgpOworCQlyYXdtb2RlKCk7CisJCUhpdF9SZXR1cm4oKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAibGlzdCIsIGkpID09IDApIHsJLy8gbGl0ZXJhbCBwcmludCBsaW5lCisJCWlmIChiIDwgMCkgewkvLyBubyBhZGRyIGdpdmVuLSB1c2UgZGVmYXVsdHMKKwkJCXEgPSBiZWdpbl9saW5lKGRvdCk7CS8vIGFzc3VtZSAuLC4gZm9yIHRoZSByYW5nZQorCQkJciA9IGVuZF9saW5lKGRvdCk7CisJCX0KKwkJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwkJcHV0cygiXHIiKTsKKwkJZm9yICg7IHEgPD0gcjsgcSsrKSB7CisJCQlpbnQgY19pc19ub19wcmludDsKKworCQkJYyA9ICpxOworCQkJY19pc19ub19wcmludCA9IChjICYgMHg4MCkgJiYgIUlzcHJpbnQoYyk7CisJCQlpZiAoY19pc19ub19wcmludCkgeworCQkJCWMgPSAnLic7CisJCQkJc3RhbmRvdXRfc3RhcnQoKTsKKwkJCX0KKwkJCWlmIChjID09ICdcbicpIHsKKwkJCQl3cml0ZTEoIiRcciIpOworCQkJfSBlbHNlIGlmIChjIDwgJyAnIHx8IGMgPT0gMTI3KSB7CisJCQkJYmJfcHV0Y2hhcignXicpOworCQkJCWlmIChjID09IDEyNykKKwkJCQkJYyA9ICc/JzsKKwkJCQllbHNlCisJCQkJCWMgKz0gJ0AnOworCQkJfQorCQkJYmJfcHV0Y2hhcihjKTsKKwkJCWlmIChjX2lzX25vX3ByaW50KQorCQkJCXN0YW5kb3V0X2VuZCgpOworCQl9CisJCUhpdF9SZXR1cm4oKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAicXVpdCIsIGkpID09IDAgLy8gcXVpdAorCSAgICAgICAgfHwgc3RybmNtcChjbWQsICJuZXh0IiwgaSkgPT0gMCAvLyBlZGl0IG5leHQgZmlsZQorCSkgeworCQlpbnQgbjsKKwkJaWYgKHVzZWZvcmNlKSB7CisJCQkvLyBmb3JjZSBlbmQgb2YgYXJndiBsaXN0CisJCQlpZiAoKmNtZCA9PSAncScpIHsKKwkJCQlvcHRpbmQgPSBzYXZlX2FyZ2M7CisJCQl9CisJCQllZGl0aW5nID0gMDsKKwkJCWdvdG8gcmV0OworCQl9CisJCS8vIGRvbid0IGV4aXQgaWYgdGhlIGZpbGUgYmVlbiBtb2RpZmllZAorCQlpZiAoZmlsZV9tb2RpZmllZCkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKDolcyEgb3ZlcnJpZGVzKSIsCisJCQkJICgqY21kID09ICdxJyA/ICJxdWl0IiA6ICJuZXh0IikpOworCQkJZ290byByZXQ7CisJCX0KKwkJLy8gYXJlIHRoZXJlIG90aGVyIGZpbGUgdG8gZWRpdAorCQluID0gc2F2ZV9hcmdjIC0gb3B0aW5kIC0gMTsKKwkJaWYgKCpjbWQgPT0gJ3EnICYmIG4gPiAwKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCIlZCBtb3JlIGZpbGUocykgdG8gZWRpdCIsIG4pOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKCpjbWQgPT0gJ24nICYmIG4gPD0gMCkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gbW9yZSBmaWxlcyB0byBlZGl0Iik7CisJCQlnb3RvIHJldDsKKwkJfQorCQllZGl0aW5nID0gMDsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAicmVhZCIsIGkpID09IDApIHsJLy8gcmVhZCBmaWxlIGludG8gdGV4dFtdCisJCWZuID0gYXJnczsKKwkJaWYgKCFmblswXSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gZmlsZW5hbWUgZ2l2ZW4iKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChiIDwgMCkgewkvLyBubyBhZGRyIGdpdmVuLSB1c2UgZGVmYXVsdHMKKwkJCXEgPSBiZWdpbl9saW5lKGRvdCk7CS8vIGFzc3VtZSAiZG90IgorCQl9CisJCS8vIHJlYWQgYWZ0ZXIgY3VycmVudCBsaW5lLSB1bmxlc3MgdXNlciBzYWlkICI6MHIgZm9vIgorCQlpZiAoYiAhPSAwKQorCQkJcSA9IG5leHRfbGluZShxKTsKKwkJeyAvLyBkYW5jZSBhcm91bmQgcG90ZW50aWFsbHktcmVhbGxvY2F0ZWQgdGV4dFtdCisJCQl1aW50cHRyX3Qgb2ZzID0gcSAtIHRleHQ7CisJCQljaCA9IGZpbGVfaW5zZXJ0KGZuLCBxLCAwKTsKKwkJCXEgPSB0ZXh0ICsgb2ZzOworCQl9CisJCWlmIChjaCA8IDApCisJCQlnb3RvIHJldDsJLy8gbm90aGluZyB3YXMgaW5zZXJ0ZWQKKwkJLy8gaG93IG1hbnkgbGluZXMgaW4gdGV4dFtdPworCQlsaSA9IGNvdW50X2xpbmVzKHEsIHEgKyBjaCAtIDEpOworCQlzdGF0dXNfbGluZSgiXCIlc1wiIgorCQkJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgiJXMiKQorCQkJIiAlZEwsICVkQyIsIGZuLAorCQkJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgocmVhZG9ubHlfbW9kZSA/ICIgW1JlYWRvbmx5XSIgOiAiIiksKQorCQkJbGksIGNoKTsKKwkJaWYgKGNoID4gMCkgeworCQkJLy8gaWYgdGhlIGluc2VydCBpcyBiZWZvcmUgImRvdCIgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZQorCQkJaWYgKHEgPD0gZG90KQorCQkJCWRvdCArPSBjaDsKKwkJCS8qZmlsZV9tb2RpZmllZCsrOyAtIGRvbmUgYnkgZmlsZV9pbnNlcnQgKi8KKwkJfQorCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJyZXdpbmQiLCBpKSA9PSAwKSB7CS8vIHJld2luZCBjbWQgbGluZSBhcmdzCisJCWlmIChmaWxlX21vZGlmaWVkICYmICF1c2Vmb3JjZSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKDpyZXdpbmQhIG92ZXJyaWRlcykiKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHJlc2V0IHRoZSBmaWxlbmFtZXMgdG8gZWRpdAorCQkJb3B0aW5kID0gZm5fc3RhcnQgLSAxOworCQkJZWRpdGluZyA9IDA7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVQKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAic2V0IiwgaSkgPT0gMCkgewkvLyBzZXQgb3IgY2xlYXIgZmVhdHVyZXMKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJCWNoYXIgKmFyZ3A7CisjZW5kaWYKKwkJaSA9IDA7CQkJLy8gb2Zmc2V0IGludG8gYXJncworCQkvLyBvbmx5IGJsYW5rIGlzIHJlZ2FyZGVkIGFzIGFyZ3MgZGVsbWl0ZXIuIFdoYXQgYWJvdXQgdGFiICdcdCcgPworCQlpZiAoIWFyZ3NbMF0gfHwgc3RyY2FzZWNtcChhcmdzLCAiYWxsIikgPT0gMCkgeworCQkJLy8gcHJpbnQgb3V0IHZhbHVlcyBvZiBhbGwgb3B0aW9ucworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKKwkJCXN0YXR1c19saW5lX2JvbGQoCisJCQkJIiVzYXV0b2luZGVudCAiCisJCQkJIiVzZmxhc2ggIgorCQkJCSIlc2lnbm9yZWNhc2UgIgorCQkJCSIlc3Nob3dtYXRjaCAiCisJCQkJInRhYnN0b3A9JXUiLAorCQkJCWF1dG9pbmRlbnQgPyAiIiA6ICJubyIsCisJCQkJZXJyX21ldGhvZCA/ICIiIDogIm5vIiwKKwkJCQlpZ25vcmVjYXNlID8gIiIgOiAibm8iLAorCQkJCXNob3dtYXRjaCA/ICIiIDogIm5vIiwKKwkJCQl0YWJzdG9wCisJCQkpOworI2VuZGlmCisJCQlnb3RvIHJldDsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKKwkJYXJncCA9IGFyZ3M7CisJCXdoaWxlICgqYXJncCkgeworCQkJaWYgKHN0cm5jbXAoYXJncCwgIm5vIiwgMikgPT0gMCkKKwkJCQlpID0gMjsJCS8vICI6c2V0IG5vYXV0b2luZGVudCIKKwkJCXNldG9wcyhhcmdwLCAiYXV0b2luZGVudCAiLCBpLCAiYWkiLCBWSV9BVVRPSU5ERU5UKTsKKwkJCXNldG9wcyhhcmdwLCAiZmxhc2ggIiAgICAgLCBpLCAiZmwiLCBWSV9FUlJfTUVUSE9EKTsKKwkJCXNldG9wcyhhcmdwLCAiaWdub3JlY2FzZSAiLCBpLCAiaWMiLCBWSV9JR05PUkVDQVNFKTsKKwkJCXNldG9wcyhhcmdwLCAic2hvd21hdGNoICIgLCBpLCAic20iLCBWSV9TSE9XTUFUQ0ggKTsKKwkJCWlmIChzdHJuY21wKGFyZ3AgKyBpLCAidGFic3RvcD0iLCA4KSA9PSAwKSB7CisJCQkJaW50IHQgPSAwOworCQkJCXNzY2FuZihhcmdwICsgaSs4LCAiJXUiLCAmdCk7CisJCQkJaWYgKHQgPiAwICYmIHQgPD0gTUFYX1RBQlNUT1ApCisJCQkJCXRhYnN0b3AgPSB0OworCQkJfQorCQkJYXJncCA9IHNraXBfbm9uX3doaXRlc3BhY2UoYXJncCk7CisJCQlhcmdwID0gc2tpcF93aGl0ZXNwYWNlKGFyZ3ApOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRVRPUFRTICovCisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRVQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKwl9IGVsc2UgaWYgKGNtZFswXSA9PSAncycpIHsJLy8gc3Vic3RpdHV0ZSBhIHBhdHRlcm4gd2l0aCBhIHJlcGxhY2VtZW50IHBhdHRlcm4KKwkJY2hhciAqbHMsICpGLCAqUjsKKwkJaW50IGdmbGFnOworCisJCS8vIEYgcG9pbnRzIHRvIHRoZSAiZmluZCIgcGF0dGVybgorCQkvLyBSIHBvaW50cyB0byB0aGUgInJlcGxhY2UiIHBhdHRlcm4KKwkJLy8gcmVwbGFjZSB0aGUgY21kIGxpbmUgZGVsaW1pdGVycyAiLyIgd2l0aCBOVUxMcworCQlnZmxhZyA9IDA7CQkvLyBnbG9iYWwgcmVwbGFjZSBmbGFnCisJCWMgPSBvcmlnX2J1ZlsxXTsJLy8gd2hhdCBpcyB0aGUgZGVsaW1pdGVyCisJCUYgPSBvcmlnX2J1ZiArIDI7CS8vIHN0YXJ0IG9mICJmaW5kIgorCQlSID0gc3RyY2hyKEYsIGMpOwkvLyBtaWRkbGUgZGVsaW1pdGVyCisJCWlmICghUikKKwkJCWdvdG8gY29sb25fc19mYWlsOworCQkqUisrID0gJ1wwJzsJLy8gdGVybWluYXRlICJmaW5kIgorCQlidWYxID0gc3RyY2hyKFIsIGMpOworCQlpZiAoIWJ1ZjEpCisJCQlnb3RvIGNvbG9uX3NfZmFpbDsKKwkJKmJ1ZjErKyA9ICdcMCc7CS8vIHRlcm1pbmF0ZSAicmVwbGFjZSIKKwkJaWYgKCpidWYxID09ICdnJykgewkvLyA6cy9mb28vYmFyL2cKKwkJCWJ1ZjErKzsKKwkJCWdmbGFnKys7CS8vIHR1cm4gb24gZ2ZsYWcKKwkJfQorCQlxID0gYmVnaW5fbGluZShxKTsKKwkJaWYgKGIgPCAwKSB7CS8vIG1heWJlIDpzL2Zvby9iYXIvCisJCQlxID0gYmVnaW5fbGluZShkb3QpOwkvLyBzdGFydCB3aXRoIGN1ciBsaW5lCisJCQliID0gY291bnRfbGluZXModGV4dCwgcSk7CS8vIGN1ciBsaW5lIG51bWJlcgorCQl9CisJCWlmIChlIDwgMCkKKwkJCWUgPSBiOwkJLy8gbWF5YmUgOi5zL2Zvby9iYXIvCisJCWZvciAoaSA9IGI7IGkgPD0gZTsgaSsrKSB7CS8vIHNvLCA6MjAsMjMgcyBcMCBmaW5kIFwwIHJlcGxhY2UgXDAKKwkJCWxzID0gcTsJCS8vIG9yaWcgbGluZSBzdGFydAorIHZjNDoKKwkJCWJ1ZjEgPSBjaGFyX3NlYXJjaChxLCBGLCBGT1JXQVJELCBMSU1JVEVEKTsJLy8gc2VhcmNoIGN1ciBsaW5lIG9ubHkgZm9yICJmaW5kIgorCQkJaWYgKGJ1ZjEpIHsKKwkJCQl1aW50cHRyX3QgYmlhczsKKwkJCQkvLyB3ZSBmb3VuZCB0aGUgImZpbmQiIHBhdHRlcm4gLSBkZWxldGUgaXQKKwkJCQl0ZXh0X2hvbGVfZGVsZXRlKGJ1ZjEsIGJ1ZjEgKyBzdHJsZW4oRikgLSAxKTsKKwkJCQkvLyBpbnNldCB0aGUgInJlcGxhY2UiIHBhdGVybgorCQkJCWJpYXMgPSBzdHJpbmdfaW5zZXJ0KGJ1ZjEsIFIpOwkvLyBpbnNlcnQgdGhlIHN0cmluZworCQkJCWJ1ZjEgKz0gYmlhczsKKwkJCQlscyArPSBiaWFzOworCQkJCS8qcSArPSBiaWFzOyAtIHJlY2FsY3VsYXRlZCBhbnl3YXkgKi8KKwkJCQkvLyBjaGVjayBmb3IgImdsb2JhbCIgIDpzL2Zvby9iYXIvZworCQkJCWlmIChnZmxhZyA9PSAxKSB7CisJCQkJCWlmICgoYnVmMSArIHN0cmxlbihSKSkgPCBlbmRfbGluZShscykpIHsKKwkJCQkJCXEgPSBidWYxICsgc3RybGVuKFIpOworCQkJCQkJZ290byB2YzQ7CS8vIGRvbid0IGxldCBxIG1vdmUgcGFzdCBjdXIgbGluZQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcSA9IG5leHRfbGluZShscyk7CisJCX0KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFQVJDSCAqLworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJ2ZXJzaW9uIiwgaSkgPT0gMCkgeyAgLy8gc2hvdyBzb2Z0d2FyZSB2ZXJzaW9uCisJCXN0YXR1c19saW5lKEJCX1ZFUiAiICIgQkJfQlQpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJ3cml0ZSIsIGkpID09IDAgIC8vIHdyaXRlIHRleHQgdG8gZmlsZQorCSAgICAgICAgfHwgc3RybmNtcChjbWQsICJ3cSIsIGkpID09IDAKKwkgICAgICAgIHx8IHN0cm5jbXAoY21kLCAid24iLCBpKSA9PSAwCisJICAgICAgICB8fCAoY21kWzBdID09ICd4JyAmJiAhY21kWzFdKQorCSkgeworCQkvLyBpcyB0aGVyZSBhIGZpbGUgbmFtZSB0byB3cml0ZSB0bz8KKwkJaWYgKGFyZ3NbMF0pIHsKKwkJCWZuID0gYXJnczsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCWlmIChyZWFkb25seV9tb2RlICYmICF1c2Vmb3JjZSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiXCIlc1wiIEZpbGUgaXMgcmVhZCBvbmx5IiwgZm4pOworCQkJZ290byByZXQ7CisJCX0KKyNlbmRpZgorCQkvLyBob3cgbWFueSBsaW5lcyBpbiB0ZXh0W10/CisJCWxpID0gY291bnRfbGluZXMocSwgcik7CisJCWNoID0gciAtIHEgKyAxOworCQkvLyBzZWUgaWYgZmlsZSBleGlzdHMtIGlmIG5vdCwgaXRzIGp1c3QgYSBuZXcgZmlsZSByZXF1ZXN0CisJCWlmICh1c2Vmb3JjZSkgeworCQkJLy8gaWYgImZuIiBpcyBub3Qgd3JpdGUtYWJsZSwgY2htb2QgdSt3CisJCQkvLyBzcHJpbnRmKHN5c2NtZCwgImNobW9kIHUrdyAlcyIsIGZuKTsKKwkJCS8vIHN5c3RlbShzeXNjbWQpOworCQkJZm9yY2VkID0gVFJVRTsKKwkJfQorCQlsID0gZmlsZV93cml0ZShmbiwgcSwgcik7CisJCWlmICh1c2Vmb3JjZSAmJiBmb3JjZWQpIHsKKwkJCS8vIGNobW9kIHUtdworCQkJLy8gc3ByaW50ZihzeXNjbWQsICJjaG1vZCB1LXcgJXMiLCBmbik7CisJCQkvLyBzeXN0ZW0oc3lzY21kKTsKKwkJCWZvcmNlZCA9IEZBTFNFOworCQl9CisJCWlmIChsIDwgMCkgeworCQkJaWYgKGwgPT0gLTEpCisJCQkJc3RhdHVzX2xpbmVfYm9sZCgiXCIlc1wiICVzIiwgZm4sIHN0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXNfbGluZSgiXCIlc1wiICVkTCwgJWRDIiwgZm4sIGxpLCBsKTsKKwkJCWlmIChxID09IHRleHQgJiYgciA9PSBlbmQgLSAxICYmIGwgPT0gY2gpIHsKKwkJCQlmaWxlX21vZGlmaWVkID0gMDsKKwkJCQlsYXN0X2ZpbGVfbW9kaWZpZWQgPSAtMTsKKwkJCX0KKwkJCWlmICgoY21kWzBdID09ICd4JyB8fCBjbWRbMV0gPT0gJ3EnIHx8IGNtZFsxXSA9PSAnbicKKwkJCSAgICB8fCBjbWRbMF0gPT0gJ1gnIHx8IGNtZFsxXSA9PSAnUScgfHwgY21kWzFdID09ICdOJworCQkJICAgICkKKwkJCSAmJiBsID09IGNoCisJCQkpIHsKKwkJCQllZGl0aW5nID0gMDsKKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgInlhbmsiLCBpKSA9PSAwKSB7CS8vIHlhbmsgbGluZXMKKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJcSA9IGJlZ2luX2xpbmUoZG90KTsJLy8gYXNzdW1lIC4sLiBmb3IgdGhlIHJhbmdlCisJCQlyID0gZW5kX2xpbmUoZG90KTsKKwkJfQorCQl0ZXh0X3lhbmsocSwgciwgWURyZWcpOworCQlsaSA9IGNvdW50X2xpbmVzKHEsIHIpOworCQlzdGF0dXNfbGluZSgiWWFuayAlZCBsaW5lcyAoJWQgY2hhcnMpIGludG8gWyVjXSIsCisJCQkJbGksIHN0cmxlbihyZWdbWURyZWddKSwgd2hhdF9yZWcoKSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQkvLyBjbWQgdW5rbm93bgorCQlub3RfaW1wbGVtZW50ZWQoY21kKTsKKwl9CisgcmV0OgorCWRvdCA9IGJvdW5kX2RvdChkb3QpOwkvLyBtYWtlIHN1cmUgImRvdCIgaXMgdmFsaWQKKwlyZXR1cm47CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisgY29sb25fc19mYWlsOgorCXN0YXR1c19saW5lKCI6cyBleHByZXNzaW9uIG1pc3NpbmcgZGVsaW1pdGVycyIpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX0NPTE9OICovCisKK3N0YXRpYyB2b2lkIEhpdF9SZXR1cm4odm9pZCkKK3sKKwlpbnQgYzsKKworCXN0YW5kb3V0X3N0YXJ0KCk7CisJd3JpdGUxKCJbSGl0IHJldHVybiB0byBjb250aW51ZV0iKTsKKwlzdGFuZG91dF9lbmQoKTsKKwl3aGlsZSAoKGMgPSBnZXRfb25lX2NoYXIoKSkgIT0gJ1xuJyAmJiBjICE9ICdccicpCisJCWNvbnRpbnVlOworCXJlZHJhdyhUUlVFKTsJCS8vIGZvcmNlIHJlZHJhdyBhbGwKK30KKworc3RhdGljIGludCBuZXh0X3RhYnN0b3AoaW50IGNvbCkKK3sKKwlyZXR1cm4gY29sICsgKCh0YWJzdG9wIC0gMSkgLSAoY29sICUgdGFic3RvcCkpOworfQorCisvLy0tLS0tIFN5bmNocm9uaXplIHRoZSBjdXJzb3IgdG8gRG90IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzeW5jX2N1cnNvcihjaGFyICpkLCBpbnQgKnJvdywgaW50ICpjb2wpCit7CisJY2hhciAqYmVnX2N1cjsJLy8gYmVnaW4gYW5kIGVuZCBvZiAiZCIgbGluZQorCWNoYXIgKnRwOworCWludCBjbnQsIHJvLCBjbzsKKworCWJlZ19jdXIgPSBiZWdpbl9saW5lKGQpOwkvLyBmaXJzdCBjaGFyIG9mIGN1ciBsaW5lCisKKwlpZiAoYmVnX2N1ciA8IHNjcmVlbmJlZ2luKSB7CisJCS8vICJkIiBpcyBiZWZvcmUgdG9wIGxpbmUgb24gc2NyZWVuCisJCS8vIGhvdyBtYW55IGxpbmVzIGRvIHdlIGhhdmUgdG8gbW92ZQorCQljbnQgPSBjb3VudF9saW5lcyhiZWdfY3VyLCBzY3JlZW5iZWdpbik7Cisgc2MxOgorCQlzY3JlZW5iZWdpbiA9IGJlZ19jdXI7CisJCWlmIChjbnQgPiAocm93cyAtIDEpIC8gMikgeworCQkJLy8gd2UgbW92ZWQgdG9vIG1hbnkgbGluZXMuIHB1dCAiZG90IiBpbiBtaWRkbGUgb2Ygc2NyZWVuCisJCQlmb3IgKGNudCA9IDA7IGNudCA8IChyb3dzIC0gMSkgLyAyOyBjbnQrKykgeworCQkJCXNjcmVlbmJlZ2luID0gcHJldl9saW5lKHNjcmVlbmJlZ2luKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNoYXIgKmVuZF9zY3I7CS8vIGJlZ2luIGFuZCBlbmQgb2Ygc2NyZWVuCisJCWVuZF9zY3IgPSBlbmRfc2NyZWVuKCk7CS8vIGxhc3QgY2hhciBvZiBzY3JlZW4KKwkJaWYgKGJlZ19jdXIgPiBlbmRfc2NyKSB7CisJCQkvLyAiZCIgaXMgYWZ0ZXIgYm90dG9tIGxpbmUgb24gc2NyZWVuCisJCQkvLyBob3cgbWFueSBsaW5lcyBkbyB3ZSBoYXZlIHRvIG1vdmUKKwkJCWNudCA9IGNvdW50X2xpbmVzKGVuZF9zY3IsIGJlZ19jdXIpOworCQkJaWYgKGNudCA+IChyb3dzIC0gMSkgLyAyKQorCQkJCWdvdG8gc2MxOwkvLyB0b28gbWFueSBsaW5lcworCQkJZm9yIChybyA9IDA7IHJvIDwgY250IC0gMTsgcm8rKykgeworCQkJCS8vIG1vdmUgc2NyZWVuIGJlZ2luIHRoZSBzYW1lIGFtb3VudAorCQkJCXNjcmVlbmJlZ2luID0gbmV4dF9saW5lKHNjcmVlbmJlZ2luKTsKKwkJCQkvLyBub3csIG1vdmUgdGhlIGVuZCBvZiBzY3JlZW4KKwkJCQllbmRfc2NyID0gbmV4dF9saW5lKGVuZF9zY3IpOworCQkJCWVuZF9zY3IgPSBlbmRfbGluZShlbmRfc2NyKTsKKwkJCX0KKwkJfQorCX0KKwkvLyAiZCIgaXMgb24gc2NyZWVuLSBmaW5kIG91dCB3aGljaCByb3cKKwl0cCA9IHNjcmVlbmJlZ2luOworCWZvciAocm8gPSAwOyBybyA8IHJvd3MgLSAxOyBybysrKSB7CS8vIGRyaXZlICJybyIgdG8gY29ycmVjdCByb3cKKwkJaWYgKHRwID09IGJlZ19jdXIpCisJCQlicmVhazsKKwkJdHAgPSBuZXh0X2xpbmUodHApOworCX0KKworCS8vIGZpbmQgb3V0IHdoYXQgY29sICJkIiBpcyBvbgorCWNvID0gMDsKKwl3aGlsZSAodHAgPCBkKSB7IC8vIGRyaXZlICJjbyIgdG8gY29ycmVjdCBjb2x1bW4KKwkJaWYgKCp0cCA9PSAnXG4nKSAvL3ZkYSB8fCAqdHAgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlpZiAoKnRwID09ICdcdCcpIHsKKwkJCS8vIGhhbmRsZSB0YWJzIGxpa2UgcmVhbCB2aQorCQkJaWYgKGQgPT0gdHAgJiYgY21kX21vZGUpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvID0gbmV4dF90YWJzdG9wKGNvKTsKKwkJfSBlbHNlIGlmICgodW5zaWduZWQgY2hhcikqdHAgPCAnICcgfHwgKnRwID09IDB4N2YpIHsKKwkJCWNvKys7IC8vIGRpc3BsYXkgYXMgXlgsIHVzZSAyIGNvbHVtbnMKKwkJfQorCQljbysrOworCQl0cCsrOworCX0KKworCS8vICJjbyIgaXMgdGhlIGNvbHVtbiB3aGVyZSAiZG90IiBpcy4KKwkvLyBUaGUgc2NyZWVuIGhhcyAiY29sdW1ucyIgY29sdW1ucy4KKwkvLyBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBjb2x1bW5zIGFyZSAgMCtvZmZzZXQgLS0gY29sdW1ucytvZnNldAorCS8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCS8vICAgICAgICAgICAgICAgXiBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisJLy8gICAgICAgIG9mZnNldCB8IHwtLS0tLS0tIGNvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLXwKKwkvLworCS8vIElmICJjbyIgaXMgYWxyZWFkeSBpbiB0aGlzIHJhbmdlIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gYWRqdXN0IG9mZnNldAorCS8vICAgICAgYnV0LCB3ZSBkbyBoYXZlIHRvIHN1YnRyYWN0IHRoZSAib2Zmc2V0IiBiaWFzIGZyb20gImNvIi4KKwkvLyBJZiAiY28iIGlzIG91dHNpZGUgdGhpcyByYW5nZSB0aGVuIHdlIGhhdmUgdG8gY2hhbmdlICJvZmZzZXQiLgorCS8vIElmIHRoZSBmaXJzdCBjaGFyIG9mIGEgbGluZSBpcyBhIHRhYiB0aGUgY3Vyc29yIHdpbGwgdHJ5IHRvIHN0YXkKKwkvLyAgaW4gY29sdW1uIDcsIGJ1dCB3ZSBoYXZlIHRvIHNldCBvZmZzZXQgdG8gMC4KKworCWlmIChjbyA8IDAgKyBvZmZzZXQpIHsKKwkJb2Zmc2V0ID0gY287CisJfQorCWlmIChjbyA+PSBjb2x1bW5zICsgb2Zmc2V0KSB7CisJCW9mZnNldCA9IGNvIC0gY29sdW1ucyArIDE7CisJfQorCS8vIGlmIHRoZSBmaXJzdCBjaGFyIG9mIHRoZSBsaW5lIGlzIGEgdGFiLCBhbmQgImRvdCIgaXMgc2l0dGluZyBvbiBpdAorCS8vICBmb3JjZSBvZmZzZXQgdG8gMC4KKwlpZiAoZCA9PSBiZWdfY3VyICYmICpkID09ICdcdCcpIHsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJY28gLT0gb2Zmc2V0OworCisJKnJvdyA9IHJvOworCSpjb2wgPSBjbzsKK30KKworLy8tLS0tLSBUZXh0IE1vdmVtZW50IFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGNoYXIgKmJlZ2luX2xpbmUoY2hhciAqcCkgLy8gcmV0dXJuIHBvaW50ZXIgdG8gZmlyc3QgY2hhciBjdXIgbGluZQoreworCWlmIChwID4gdGV4dCkgeworCQlwID0gbWVtcmNocih0ZXh0LCAnXG4nLCBwIC0gdGV4dCk7CisJCWlmICghcCkKKwkJCXJldHVybiB0ZXh0OworCQlyZXR1cm4gcCArIDE7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqZW5kX2xpbmUoY2hhciAqcCkgLy8gcmV0dXJuIHBvaW50ZXIgdG8gTkwgb2YgY3VyIGxpbmUKK3sKKwlpZiAocCA8IGVuZCAtIDEpIHsKKwkJcCA9IG1lbWNocihwLCAnXG4nLCBlbmQgLSBwIC0gMSk7CisJCWlmICghcCkKKwkJCXJldHVybiBlbmQgLSAxOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKmRvbGxhcl9saW5lKGNoYXIgKnApIC8vIHJldHVybiBwb2ludGVyIHRvIGp1c3QgYmVmb3JlIE5MIGxpbmUKK3sKKwlwID0gZW5kX2xpbmUocCk7CisJLy8gVHJ5IHRvIHN0YXkgb2ZmIG9mIHRoZSBOZXdsaW5lCisJaWYgKCpwID09ICdcbicgJiYgKHAgLSBiZWdpbl9saW5lKHApKSA+IDApCisJCXAtLTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKnByZXZfbGluZShjaGFyICpwKSAvLyByZXR1cm4gcG9pbnRlciBmaXJzdCBjaGFyIHByZXYgbGluZQoreworCXAgPSBiZWdpbl9saW5lKHApOwkvLyBnb3RvIGJlZ2luaW5nIG9mIGN1ciBsaW5lCisJaWYgKHAgPiB0ZXh0ICYmIHBbLTFdID09ICdcbicpCisJCXAtLTsJCQkvLyBzdGVwIHRvIHByZXYgbGluZQorCXAgPSBiZWdpbl9saW5lKHApOwkvLyBnb3RvIGJlZ2luaW5nIG9mIHByZXYgbGluZQorCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqbmV4dF9saW5lKGNoYXIgKnApIC8vIHJldHVybiBwb2ludGVyIGZpcnN0IGNoYXIgbmV4dCBsaW5lCit7CisJcCA9IGVuZF9saW5lKHApOworCWlmIChwIDwgZW5kIC0gMSAmJiAqcCA9PSAnXG4nKQorCQlwKys7CQkJLy8gc3RlcCB0byBuZXh0IGxpbmUKKwlyZXR1cm4gcDsKK30KKworLy8tLS0tLSBUZXh0IEluZm9ybWF0aW9uIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGNoYXIgKmVuZF9zY3JlZW4odm9pZCkKK3sKKwljaGFyICpxOworCWludCBjbnQ7CisKKwkvLyBmaW5kIG5ldyBib3R0b20gbGluZQorCXEgPSBzY3JlZW5iZWdpbjsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHJvd3MgLSAyOyBjbnQrKykKKwkJcSA9IG5leHRfbGluZShxKTsKKwlxID0gZW5kX2xpbmUocSk7CisJcmV0dXJuIHE7Cit9CisKKy8vIGNvdW50IGxpbmUgZnJvbSBzdGFydCB0byBzdG9wCitzdGF0aWMgaW50IGNvdW50X2xpbmVzKGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wKQoreworCWNoYXIgKnE7CisJaW50IGNudDsKKworCWlmIChzdG9wIDwgc3RhcnQpIHsgLy8gc3RhcnQgYW5kIHN0b3AgYXJlIGJhY2t3YXJkcy0gcmV2ZXJzZSB0aGVtCisJCXEgPSBzdGFydDsKKwkJc3RhcnQgPSBzdG9wOworCQlzdG9wID0gcTsKKwl9CisJY250ID0gMDsKKwlzdG9wID0gZW5kX2xpbmUoc3RvcCk7CisJd2hpbGUgKHN0YXJ0IDw9IHN0b3AgJiYgc3RhcnQgPD0gZW5kIC0gMSkgeworCQlzdGFydCA9IGVuZF9saW5lKHN0YXJ0KTsKKwkJaWYgKCpzdGFydCA9PSAnXG4nKQorCQkJY250Kys7CisJCXN0YXJ0Kys7CisJfQorCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBjaGFyICpmaW5kX2xpbmUoaW50IGxpKQkvLyBmaW5kIGJlZ2luaW5nIG9mIGxpbmUgI2xpCit7CisJY2hhciAqcTsKKworCWZvciAocSA9IHRleHQ7IGxpID4gMTsgbGktLSkgeworCQlxID0gbmV4dF9saW5lKHEpOworCX0KKwlyZXR1cm4gcTsKK30KKworLy8tLS0tLSBEb3QgTW92ZW1lbnQgUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgZG90X2xlZnQodm9pZCkKK3sKKwlpZiAoZG90ID4gdGV4dCAmJiBkb3RbLTFdICE9ICdcbicpCisJCWRvdC0tOworfQorCitzdGF0aWMgdm9pZCBkb3RfcmlnaHQodm9pZCkKK3sKKwlpZiAoZG90IDwgZW5kIC0gMSAmJiAqZG90ICE9ICdcbicpCisJCWRvdCsrOworfQorCitzdGF0aWMgdm9pZCBkb3RfYmVnaW4odm9pZCkKK3sKKwlkb3QgPSBiZWdpbl9saW5lKGRvdCk7CS8vIHJldHVybiBwb2ludGVyIHRvIGZpcnN0IGNoYXIgY3VyIGxpbmUKK30KKworc3RhdGljIHZvaWQgZG90X2VuZCh2b2lkKQoreworCWRvdCA9IGVuZF9saW5lKGRvdCk7CS8vIHJldHVybiBwb2ludGVyIHRvIGxhc3QgY2hhciBjdXIgbGluZQorfQorCitzdGF0aWMgY2hhciAqbW92ZV90b19jb2woY2hhciAqcCwgaW50IGwpCit7CisJaW50IGNvOworCisJcCA9IGJlZ2luX2xpbmUocCk7CisJY28gPSAwOworCXdoaWxlIChjbyA8IGwgJiYgcCA8IGVuZCkgeworCQlpZiAoKnAgPT0gJ1xuJykgLy92ZGEgfHwgKnAgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlpZiAoKnAgPT0gJ1x0JykgeworCQkJY28gPSBuZXh0X3RhYnN0b3AoY28pOworCQl9IGVsc2UgaWYgKCpwIDwgJyAnIHx8ICpwID09IDEyNykgeworCQkJY28rKzsgLy8gZGlzcGxheSBhcyBeWCwgdXNlIDIgY29sdW1ucworCQl9CisJCWNvKys7CisJCXArKzsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9uZXh0KHZvaWQpCit7CisJZG90ID0gbmV4dF9saW5lKGRvdCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9wcmV2KHZvaWQpCit7CisJZG90ID0gcHJldl9saW5lKGRvdCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9zY3JvbGwoaW50IGNudCwgaW50IGRpcikKK3sKKwljaGFyICpxOworCisJZm9yICg7IGNudCA+IDA7IGNudC0tKSB7CisJCWlmIChkaXIgPCAwKSB7CisJCQkvLyBzY3JvbGwgQmFja3dhcmRzCisJCQkvLyBjdHJsLVkgc2Nyb2xsIHVwIG9uZSBsaW5lCisJCQlzY3JlZW5iZWdpbiA9IHByZXZfbGluZShzY3JlZW5iZWdpbik7CisJCX0gZWxzZSB7CisJCQkvLyBzY3JvbGwgRm9yd2FyZHMKKwkJCS8vIGN0cmwtRSBzY3JvbGwgZG93biBvbmUgbGluZQorCQkJc2NyZWVuYmVnaW4gPSBuZXh0X2xpbmUoc2NyZWVuYmVnaW4pOworCQl9CisJfQorCS8vIG1ha2Ugc3VyZSAiZG90IiBzdGF5cyBvbiB0aGUgc2NyZWVuIHNvIHdlIGRvbnQgc2Nyb2xsIG9mZgorCWlmIChkb3QgPCBzY3JlZW5iZWdpbikKKwkJZG90ID0gc2NyZWVuYmVnaW47CisJcSA9IGVuZF9zY3JlZW4oKTsJLy8gZmluZCBuZXcgYm90dG9tIGxpbmUKKwlpZiAoZG90ID4gcSkKKwkJZG90ID0gYmVnaW5fbGluZShxKTsJLy8gaXMgZG90IGlzIGJlbG93IGJvdHRvbSBsaW5lPworCWRvdF9za2lwX292ZXJfd3MoKTsKK30KKworc3RhdGljIHZvaWQgZG90X3NraXBfb3Zlcl93cyh2b2lkKQoreworCS8vIHNraXAgV1MKKwl3aGlsZSAoaXNzcGFjZSgqZG90KSAmJiAqZG90ICE9ICdcbicgJiYgZG90IDwgZW5kIC0gMSkKKwkJZG90Kys7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9kZWxldGUodm9pZCkJLy8gZGVsZXRlIHRoZSBjaGFyIGF0ICdkb3QnCit7CisJdGV4dF9ob2xlX2RlbGV0ZShkb3QsIGRvdCk7Cit9CisKK3N0YXRpYyBjaGFyICpib3VuZF9kb3QoY2hhciAqcCkgLy8gbWFrZSBzdXJlICB0ZXh0WzBdIDw9IFAgPCAiZW5kIgoreworCWlmIChwID49IGVuZCAmJiBlbmQgPiB0ZXh0KSB7CisJCXAgPSBlbmQgLSAxOworCQlpbmRpY2F0ZV9lcnJvcignMScpOworCX0KKwlpZiAocCA8IHRleHQpIHsKKwkJcCA9IHRleHQ7CisJCWluZGljYXRlX2Vycm9yKCcyJyk7CisJfQorCXJldHVybiBwOworfQorCisvLy0tLS0tIEhlbHBlciBVdGlsaXR5IFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLSBDaGFyIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBDaGFycyB0aGF0IGFyZSBwYXJ0IG9mIGEgd29yZC0KKyAqICAgIDAxMjM0NTY3ODlfQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorICogQ2hhcnMgdGhhdCBhcmUgTm90IHBhcnQgb2YgYSB3b3JkIChzdG9wcGVycykKKyAqICAgICEiIyQlJicoKSorLC0uLzo7PD0+P0BbXF1eYHt8fX4KKyAqIENoYXJzIHRoYXQgYXJlIFdoaXRlU3BhY2UKKyAqICAgIFRBQiBORVdMSU5FIFZUIEZGIFJFVFVSTiBTUEFDRQorICogRE8gTk9UIENPVU5UIE5FV0xJTkUgQVMgV0hJVEVTUEFDRQorICovCisKK3N0YXRpYyBjaGFyICpuZXdfc2NyZWVuKGludCBybywgaW50IGNvKQoreworCWludCBsaTsKKworCWZyZWUoc2NyZWVuKTsKKwlzY3JlZW5zaXplID0gcm8gKiBjbyArIDg7CisJc2NyZWVuID0geG1hbGxvYyhzY3JlZW5zaXplKTsKKwkvLyBpbml0aWFsaXplIHRoZSBuZXcgc2NyZWVuLiBhc3N1bWUgdGhpcyB3aWxsIGJlIGEgZW1wdHkgZmlsZS4KKwlzY3JlZW5fZXJhc2UoKTsKKwkvLyAgIG5vbi1leGlzdGVudCB0ZXh0W10gbGluZXMgc3RhcnQgd2l0aCBhIHRpbGRlICh+KS4KKwlmb3IgKGxpID0gMTsgbGkgPCBybyAtIDE7IGxpKyspIHsKKwkJc2NyZWVuWyhsaSAqIGNvKSArIDBdID0gJ34nOworCX0KKwlyZXR1cm4gc2NyZWVuOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNICisKKy8vIHNlYXJjaCBmb3IgcGF0dGVybiBzdGFydGluZyBhdCBwCitzdGF0aWMgY2hhciAqY2hhcl9zZWFyY2goY2hhciAqcCwgY29uc3QgY2hhciAqcGF0LCBpbnQgZGlyLCBpbnQgcmFuZ2UpCit7CisJY2hhciAqcTsKKwlzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgcHJlZzsKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCXJlX3N5bnRheF9vcHRpb25zID0gUkVfU1lOVEFYX1BPU0lYX0VYVEVOREVEOworCXByZWcudHJhbnNsYXRlID0gMDsKKwlwcmVnLmZhc3RtYXAgPSAwOworCXByZWcuYnVmZmVyID0gMDsKKwlwcmVnLmFsbG9jYXRlZCA9IDA7CisKKwkvLyBhc3N1bWUgYSBMSU1JVEVEIGZvcndhcmQgc2VhcmNoCisJcSA9IG5leHRfbGluZShwKTsKKwlxID0gZW5kX2xpbmUocSk7CisJcSA9IGVuZCAtIDE7CisJaWYgKGRpciA9PSBCQUNLKSB7CisJCXEgPSBwcmV2X2xpbmUocCk7CisJCXEgPSB0ZXh0OworCX0KKwkvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJzIHRvIHNlYXJjaCBvdmVyLCBmb3J3YXJkIG9yIGJhY2t3YXJkCisJc2l6ZSA9IHEgLSBwOworCWlmIChzaXplIDwgMCkKKwkJc2l6ZSA9IHAgLSBxOworCS8vIFJBTkdFIGNvdWxkIGJlIG5lZ2F0aXZlIGlmIHdlIGFyZSBzZWFyY2hpbmcgYmFja3dhcmRzCisJcmFuZ2UgPSBxIC0gcDsKKworCXEgPSAoY2hhciAqKXJlX2NvbXBpbGVfcGF0dGVybihwYXQsIHN0cmxlbihwYXQpLCAoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICopJnByZWcpOworCWlmIChxICE9IDApIHsKKwkJLy8gVGhlIHBhdHRlcm4gd2FzIG5vdCBjb21waWxlZAorCQlzdGF0dXNfbGluZV9ib2xkKCJiYWQgc2VhcmNoIHBhdHRlcm46IFwiJXNcIjogJXMiLCBwYXQsIHEpOworCQlpID0gMDsJCQkvLyByZXR1cm4gcCBpZiBwYXR0ZXJuIG5vdCBjb21waWxlZAorCQlnb3RvIGNzMTsKKwl9CisKKwlxID0gcDsKKwlpZiAocmFuZ2UgPCAwKSB7CisJCXEgPSBwIC0gc2l6ZTsKKwkJaWYgKHEgPCB0ZXh0KQorCQkJcSA9IHRleHQ7CisJfQorCS8vIHNlYXJjaCBmb3IgdGhlIGNvbXBpbGVkIHBhdHRlcm4sIHByZWcsIGluIHBbXQorCS8vIHJhbmdlIDwgMC0gIHNlYXJjaCBiYWNrd2FyZAorCS8vIHJhbmdlID4gMC0gIHNlYXJjaCBmb3J3YXJkCisJLy8gMCA8IHN0YXJ0IDwgc2l6ZQorCS8vIHJlX3NlYXJjaCgpIDwgMCAgbm90IGZvdW5kIG9yIGVycm9yCisJLy8gcmVfc2VhcmNoKCkgPiAwICBpbmRleCBvZiBmb3VuZCBwYXR0ZXJuCisJLy8gICAgICAgICAgICBzdHJ1Y3QgcGF0dGVybiAgICBjaGFyICAgICBpbnQgICAgaW50ICAgIGludCAgICAgc3RydWN0IHJlZworCS8vIHJlX3NlYXJjaCAoKnBhdHRlcm5fYnVmZmVyLCAgKnN0cmluZywgc2l6ZSwgIHN0YXJ0LCByYW5nZSwgICpyZWdzKQorCWkgPSByZV9zZWFyY2goJnByZWcsIHEsIHNpemUsIDAsIHJhbmdlLCAwKTsKKwlpZiAoaSA9PSAtMSkgeworCQlwID0gMDsKKwkJaSA9IDA7CQkJLy8gcmV0dXJuIE5VTEwgaWYgcGF0dGVybiBub3QgZm91bmQKKwl9CisgY3MxOgorCWlmIChkaXIgPT0gRk9SV0FSRCkgeworCQlwID0gcCArIGk7CisJfSBlbHNlIHsKKwkJcCA9IHAgLSBpOworCX0KKwlyZXR1cm4gcDsKK30KKworIyBlbHNlCisKKyMgIGlmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKK3N0YXRpYyBpbnQgbXljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbGVuKQoreworCWlmIChpZ25vcmVjYXNlKSB7CisJCXJldHVybiBzdHJuY2FzZWNtcChzMSwgczIsIGxlbik7CisJfQorCXJldHVybiBzdHJuY21wKHMxLCBzMiwgbGVuKTsKK30KKyMgIGVsc2UKKyMgICBkZWZpbmUgbXljbXAgc3RybmNtcAorIyAgZW5kaWYKKworc3RhdGljIGNoYXIgKmNoYXJfc2VhcmNoKGNoYXIgKnAsIGNvbnN0IGNoYXIgKnBhdCwgaW50IGRpciwgaW50IHJhbmdlKQoreworCWNoYXIgKnN0YXJ0LCAqc3RvcDsKKwlpbnQgbGVuOworCisJbGVuID0gc3RybGVuKHBhdCk7CisJaWYgKGRpciA9PSBGT1JXQVJEKSB7CisJCXN0b3AgPSBlbmQgLSAxOwkvLyBhc3N1bWUgcmFuZ2UgaXMgcCAtIGVuZC0xCisJCWlmIChyYW5nZSA9PSBMSU1JVEVEKQorCQkJc3RvcCA9IG5leHRfbGluZShwKTsJLy8gcmFuZ2UgaXMgdG8gbmV4dCBsaW5lCisJCWZvciAoc3RhcnQgPSBwOyBzdGFydCA8IHN0b3A7IHN0YXJ0KyspIHsKKwkJCWlmIChteWNtcChzdGFydCwgcGF0LCBsZW4pID09IDApIHsKKwkJCQlyZXR1cm4gc3RhcnQ7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRpciA9PSBCQUNLKSB7CisJCXN0b3AgPSB0ZXh0OwkvLyBhc3N1bWUgcmFuZ2UgaXMgdGV4dCAtIHAKKwkJaWYgKHJhbmdlID09IExJTUlURUQpCisJCQlzdG9wID0gcHJldl9saW5lKHApOwkvLyByYW5nZSBpcyB0byBwcmV2IGxpbmUKKwkJZm9yIChzdGFydCA9IHAgLSBsZW47IHN0YXJ0ID49IHN0b3A7IHN0YXJ0LS0pIHsKKwkJCWlmIChteWNtcChzdGFydCwgcGF0LCBsZW4pID09IDApIHsKKwkJCQlyZXR1cm4gc3RhcnQ7CisJCQl9CisJCX0KKwl9CisJLy8gcGF0dGVybiBub3QgZm91bmQKKwlyZXR1cm4gTlVMTDsKK30KKworIyBlbmRpZgorCisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRUFSQ0ggKi8KKworc3RhdGljIGNoYXIgKmNoYXJfaW5zZXJ0KGNoYXIgKnAsIGNoYXIgYykgLy8gaW5zZXJ0IHRoZSBjaGFyIGMgYXQgJ3AnCit7CisJaWYgKGMgPT0gMjIpIHsJCS8vIElzIHRoaXMgYW4gY3RybC1WPworCQlwICs9IHN0dXBpZF9pbnNlcnQocCwgJ14nKTsJLy8gdXNlIF4gdG8gaW5kaWNhdGUgbGl0ZXJhbCBuZXh0CisJCXJlZnJlc2goRkFMU0UpOwkvLyBzaG93IHRoZSBeCisJCWMgPSBnZXRfb25lX2NoYXIoKTsKKwkJKnAgPSBjOworCQlwKys7CisJCWZpbGVfbW9kaWZpZWQrKzsKKwl9IGVsc2UgaWYgKGMgPT0gMjcpIHsJLy8gSXMgdGhpcyBhbiBFU0M/CisJCWNtZF9tb2RlID0gMDsKKwkJY21kY250ID0gMDsKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJCWlmICgocFstMV0gIT0gJ1xuJykgJiYgKGRvdCA+IHRleHQpKSB7CisJCQlwLS07CisJCX0KKwl9IGVsc2UgaWYgKGMgPT0gZXJhc2VfY2hhciB8fCBjID09IDggfHwgYyA9PSAxMjcpIHsgLy8gSXMgdGhpcyBhIEJTCisJCS8vICAgICAxMjM0NTY3ODkKKwkJaWYgKChwWy0xXSAhPSAnXG4nKSAmJiAoZG90PnRleHQpKSB7CisJCQlwLS07CisJCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwLCBwKTsJLy8gc2hyaW5rIGJ1ZmZlciAxIGNoYXIKKwkJfQorCX0gZWxzZSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQkvLyBpbnNlcnQgYSBjaGFyIGludG8gdGV4dFtdCisJCWNoYXIgKnNwOwkJLy8gInNhdmUgcCIKKyNlbmRpZgorCisJCWlmIChjID09IDEzKQorCQkJYyA9ICdcbic7CS8vIHRyYW5zbGF0ZSBcciB0byBcbgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKKwkJc3AgPSBwOwkJCS8vIHJlbWVtYmVyIGFkZHIgb2YgaW5zZXJ0CisjZW5kaWYKKwkJcCArPSAxICsgc3R1cGlkX2luc2VydChwLCBjKTsJLy8gaW5zZXJ0IHRoZSBjaGFyCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQlpZiAoc2hvd21hdGNoICYmIHN0cmNocigiKV19IiwgKnNwKSAhPSBOVUxMKSB7CisJCQlzaG93bWF0Y2hpbmcoc3ApOworCQl9CisJCWlmIChhdXRvaW5kZW50ICYmIGMgPT0gJ1xuJykgewkvLyBhdXRvIGluZGVudCB0aGUgbmV3IGxpbmUKKwkJCWNoYXIgKnE7CisJCQlzaXplX3QgbGVuOworCQkJcSA9IHByZXZfbGluZShwKTsJLy8gdXNlIHByZXYgbGluZSBhcyB0ZW1wbGF0ZQorCQkJbGVuID0gc3Ryc3BuKHEsICIgXHQiKTsgLy8gc3BhY2Ugb3IgdGFiCisJCQlpZiAobGVuKSB7CisJCQkJdWludHB0cl90IGJpYXM7CisJCQkJYmlhcyA9IHRleHRfaG9sZV9tYWtlKHAsIGxlbik7CisJCQkJcCArPSBiaWFzOworCQkJCXEgKz0gYmlhczsKKwkJCQltZW1jcHkocCwgcSwgbGVuKTsKKwkJCQlwICs9IGxlbjsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCXJldHVybiBwOworfQorCisvLyBtaWdodCByZWFsbG9jYXRlIHRleHRbXSEgdXNlIHAgKz0gc3R1cGlkX2luc2VydChwLCAuLi4pLAorLy8gYW5kIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBwb2ludGVycyBpbnRvIHBvdGVudGlhbGx5IGZyZWVkIHRleHRbXSEKK3N0YXRpYyB1aW50cHRyX3Qgc3R1cGlkX2luc2VydChjaGFyICpwLCBjaGFyIGMpIC8vIHN0dXBpZGx5IGluc2VydCB0aGUgY2hhciBjIGF0ICdwJworeworCXVpbnRwdHJfdCBiaWFzOworCWJpYXMgPSB0ZXh0X2hvbGVfbWFrZShwLCAxKTsKKwlwICs9IGJpYXM7CisJKnAgPSBjOworCS8vZmlsZV9tb2RpZmllZCsrOyAtIGRvbmUgYnkgdGV4dF9ob2xlX21ha2UoKQorCXJldHVybiBiaWFzOworfQorCitzdGF0aWMgaW50IGZpbmRfcmFuZ2UoY2hhciAqKnN0YXJ0LCBjaGFyICoqc3RvcCwgY2hhciBjKQoreworCWNoYXIgKnNhdmVfZG90LCAqcCwgKnEsICp0OworCWludCBjbnQsIG11bHRpbGluZSA9IDA7CisKKwlzYXZlX2RvdCA9IGRvdDsKKwlwID0gcSA9IGRvdDsKKworCWlmIChzdHJjaHIoImNkeT48IiwgYykpIHsKKwkJLy8gdGhlc2UgY21kcyBvcGVyYXRlIG9uIHdob2xlIGxpbmVzCisJCXAgPSBxID0gYmVnaW5fbGluZShwKTsKKwkJZm9yIChjbnQgPSAxOyBjbnQgPCBjbWRjbnQ7IGNudCsrKSB7CisJCQlxID0gbmV4dF9saW5lKHEpOworCQl9CisJCXEgPSBlbmRfbGluZShxKTsKKwl9IGVsc2UgaWYgKHN0cmNocigiXiUkMGJCZUVmdGhcYlwxNzciLCBjKSkgeworCQkvLyBUaGVzZSBjbWRzIG9wZXJhdGUgb24gY2hhciBwb3NpdGlvbnMKKwkJZG9fY21kKGMpOwkJLy8gZXhlY3V0ZSBtb3ZlbWVudCBjbWQKKwkJcSA9IGRvdDsKKwl9IGVsc2UgaWYgKHN0cmNocigid1ciLCBjKSkgeworCQlkb19jbWQoYyk7CQkvLyBleGVjdXRlIG1vdmVtZW50IGNtZAorCQkvLyBpZiB3ZSBhcmUgYXQgdGhlIG5leHQgd29yZCdzIGZpcnN0IGNoYXIKKwkJLy8gc3RlcCBiYWNrIG9uZSBjaGFyCisJCS8vIGJ1dCBjaGVjayB0aGUgcG9zc2liaWxpdGllcyB3aGVuIGl0IGlzIHRydWUKKwkJaWYgKGRvdCA+IHRleHQgJiYgKChpc3NwYWNlKGRvdFstMV0pICYmICFpc3NwYWNlKGRvdFswXSkpCisJCQkJfHwgKGlzcHVuY3QoZG90Wy0xXSkgJiYgIWlzcHVuY3QoZG90WzBdKSkKKwkJCQl8fCAoaXNhbG51bShkb3RbLTFdKSAmJiAhaXNhbG51bShkb3RbMF0pKSkpCisJCQlkb3QtLTsJCS8vIG1vdmUgYmFjayBvZmYgb2YgbmV4dCB3b3JkCisJCWlmIChkb3QgPiB0ZXh0ICYmICpkb3QgPT0gJ1xuJykKKwkJCWRvdC0tOwkJLy8gc3RheSBvZmYgTkwKKwkJcSA9IGRvdDsKKwl9IGVsc2UgaWYgKHN0cmNocigiSC1reyIsIGMpKSB7CisJCS8vIHRoZXNlIG9wZXJhdGUgb24gbXVsdGktbGluZXMgYmFja3dhcmRzCisJCXEgPSBlbmRfbGluZShkb3QpOwkvLyBmaW5kIE5MCisJCWRvX2NtZChjKTsJCS8vIGV4ZWN1dGUgbW92ZW1lbnQgY21kCisJCWRvdF9iZWdpbigpOworCQlwID0gZG90OworCX0gZWxzZSBpZiAoc3RyY2hyKCJMK2p9XHJcbiIsIGMpKSB7CisJCS8vIHRoZXNlIG9wZXJhdGUgb24gbXVsdGktbGluZXMgZm9yd2FyZHMKKwkJcCA9IGJlZ2luX2xpbmUoZG90KTsKKwkJZG9fY21kKGMpOwkJLy8gZXhlY3V0ZSBtb3ZlbWVudCBjbWQKKwkJZG90X2VuZCgpOwkJLy8gZmluZCBOTAorCQlxID0gZG90OworCX0gZWxzZSB7CisJICAgIC8vIG5vdGhpbmcgLS0gdGhpcyBjYXVzZXMgYW55IG90aGVyIHZhbHVlcyBvZiBjIHRvCisJICAgIC8vIHJlcHJlc2VudCB0aGUgb25lLWNoYXJhY3RlciByYW5nZSB1bmRlciB0aGUKKwkgICAgLy8gY3Vyc29yLiAgdGhpcyBpcyBjb3JyZWN0IGZvciAnICcgYW5kICdsJywgYnV0CisJICAgIC8vIHBlcmhhcHMgbm8gb3RoZXJzLgorCSAgICAvLworCX0KKwlpZiAocSA8IHApIHsKKwkJdCA9IHE7CisJCXEgPSBwOworCQlwID0gdDsKKwl9CisKKwkvLyBiYWNrd2FyZCBjaGFyIG1vdmVtZW50cyBkb24ndCBpbmNsdWRlIHN0YXJ0IHBvc2l0aW9uCisJaWYgKHEgPiBwICYmIHN0cmNocigiXjBiQmhcYlwxNzciLCBjKSkgcS0tOworCisJbXVsdGlsaW5lID0gMDsKKwlmb3IgKHQgPSBwOyB0IDw9IHE7IHQrKykgeworCQlpZiAoKnQgPT0gJ1xuJykgeworCQkJbXVsdGlsaW5lID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJKnN0YXJ0ID0gcDsKKwkqc3RvcCA9IHE7CisJZG90ID0gc2F2ZV9kb3Q7CisJcmV0dXJuIG11bHRpbGluZTsKK30KKworc3RhdGljIGludCBzdF90ZXN0KGNoYXIgKnAsIGludCB0eXBlLCBpbnQgZGlyLCBjaGFyICp0ZXN0ZWQpCit7CisJY2hhciBjLCBjMCwgY2k7CisJaW50IHRlc3QsIGluYzsKKworCWluYyA9IGRpcjsKKwljID0gYzAgPSBwWzBdOworCWNpID0gcFtpbmNdOworCXRlc3QgPSAwOworCisJaWYgKHR5cGUgPT0gU19CRUZPUkVfV1MpIHsKKwkJYyA9IGNpOworCQl0ZXN0ID0gKCFpc3NwYWNlKGMpIHx8IGMgPT0gJ1xuJyk7CisJfQorCWlmICh0eXBlID09IFNfVE9fV1MpIHsKKwkJYyA9IGMwOworCQl0ZXN0ID0gKCFpc3NwYWNlKGMpIHx8IGMgPT0gJ1xuJyk7CisJfQorCWlmICh0eXBlID09IFNfT1ZFUl9XUykgeworCQljID0gYzA7CisJCXRlc3QgPSBpc3NwYWNlKGMpOworCX0KKwlpZiAodHlwZSA9PSBTX0VORF9QVU5DVCkgeworCQljID0gY2k7CisJCXRlc3QgPSBpc3B1bmN0KGMpOworCX0KKwlpZiAodHlwZSA9PSBTX0VORF9BTE5VTSkgeworCQljID0gY2k7CisJCXRlc3QgPSAoaXNhbG51bShjKSB8fCBjID09ICdfJyk7CisJfQorCSp0ZXN0ZWQgPSBjOworCXJldHVybiB0ZXN0OworfQorCitzdGF0aWMgY2hhciAqc2tpcF90aGluZyhjaGFyICpwLCBpbnQgbGluZWNudCwgaW50IGRpciwgaW50IHR5cGUpCit7CisJY2hhciBjOworCisJd2hpbGUgKHN0X3Rlc3QocCwgdHlwZSwgZGlyLCAmYykpIHsKKwkJLy8gbWFrZSBzdXJlIHdlIGxpbWl0IHNlYXJjaCB0byBjb3JyZWN0IG51bWJlciBvZiBsaW5lcworCQlpZiAoYyA9PSAnXG4nICYmIC0tbGluZWNudCA8IDEpCisJCQlicmVhazsKKwkJaWYgKGRpciA+PSAwICYmIHAgPj0gZW5kIC0gMSkKKwkJCWJyZWFrOworCQlpZiAoZGlyIDwgMCAmJiBwIDw9IHRleHQpCisJCQlicmVhazsKKwkJcCArPSBkaXI7CQkvLyBtb3ZlIHRvIG5leHQgY2hhcgorCX0KKwlyZXR1cm4gcDsKK30KKworLy8gZmluZCBtYXRjaGluZyBjaGFyIG9mIHBhaXIgICgpICBbXSAge30KK3N0YXRpYyBjaGFyICpmaW5kX3BhaXIoY2hhciAqcCwgY29uc3QgY2hhciBjKQoreworCWNoYXIgbWF0Y2gsICpxOworCWludCBkaXIsIGxldmVsOworCisJbWF0Y2ggPSAnKSc7CisJbGV2ZWwgPSAxOworCWRpciA9IDE7CQkJLy8gYXNzdW1lIGZvcndhcmQKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcoJzogbWF0Y2ggPSAnKSc7IGJyZWFrOworCWNhc2UgJ1snOiBtYXRjaCA9ICddJzsgYnJlYWs7CisJY2FzZSAneyc6IG1hdGNoID0gJ30nOyBicmVhazsKKwljYXNlICcpJzogbWF0Y2ggPSAnKCc7IGRpciA9IC0xOyBicmVhazsKKwljYXNlICddJzogbWF0Y2ggPSAnWyc7IGRpciA9IC0xOyBicmVhazsKKwljYXNlICd9JzogbWF0Y2ggPSAneyc7IGRpciA9IC0xOyBicmVhazsKKwl9CisJZm9yIChxID0gcCArIGRpcjsgdGV4dCA8PSBxICYmIHEgPCBlbmQ7IHEgKz0gZGlyKSB7CisJCS8vIGxvb2sgZm9yIG1hdGNoLCBjb3VudCBsZXZlbHMgb2YgcGFpcnMgICgoICkpCisJCWlmICgqcSA9PSBjKQorCQkJbGV2ZWwrKzsJLy8gaW5jcmVhc2UgcGFpciBsZXZlbHMKKwkJaWYgKCpxID09IG1hdGNoKQorCQkJbGV2ZWwtLTsJLy8gcmVkdWNlIHBhaXIgbGV2ZWwKKwkJaWYgKGxldmVsID09IDApCisJCQlicmVhazsJCS8vIGZvdW5kIG1hdGNoaW5nIHBhaXIKKwl9CisJaWYgKGxldmVsICE9IDApCisJCXEgPSBOVUxMOwkJLy8gaW5kaWNhdGUgbm8gbWF0Y2gKKwlyZXR1cm4gcTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVE9QVFMKKy8vIHNob3cgdGhlIG1hdGNoaW5nIGNoYXIgb2YgYSBwYWlyLCAgKCkgIFtdICB7fQorc3RhdGljIHZvaWQgc2hvd21hdGNoaW5nKGNoYXIgKnApCit7CisJY2hhciAqcSwgKnNhdmVfZG90OworCisJLy8gd2UgZm91bmQgaGFsZiBvZiBhIHBhaXIKKwlxID0gZmluZF9wYWlyKHAsICpwKTsJLy8gZ2V0IGxvYyBvZiBtYXRjaGluZyBjaGFyCisJaWYgKHEgPT0gTlVMTCkgeworCQlpbmRpY2F0ZV9lcnJvcignMycpOwkvLyBubyBtYXRjaGluZyBjaGFyCisJfSBlbHNlIHsKKwkJLy8gInEiIG5vdyBwb2ludHMgdG8gbWF0Y2hpbmcgcGFpcgorCQlzYXZlX2RvdCA9IGRvdDsJLy8gcmVtZW1iZXIgd2hlcmUgd2UgYXJlCisJCWRvdCA9IHE7CQkvLyBnbyB0byBuZXcgbG9jCisJCXJlZnJlc2goRkFMU0UpOwkvLyBsZXQgdGhlIHVzZXIgc2VlIGl0CisJCW15c2xlZXAoNDApOwkvLyBnaXZlIHVzZXIgc29tZSB0aW1lCisJCWRvdCA9IHNhdmVfZG90OwkvLyBnbyBiYWNrIHRvIG9sZCBsb2MKKwkJcmVmcmVzaChGQUxTRSk7CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfVklfU0VUT1BUUyAqLworCisvLyBvcGVuIGEgaG9sZSBpbiB0ZXh0W10KKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSB0ZXh0X2hvbGVfbWFrZShwLCAuLi4pLAorLy8gYW5kIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBwb2ludGVycyBpbnRvIHBvdGVudGlhbGx5IGZyZWVkIHRleHRbXSEKK3N0YXRpYyB1aW50cHRyX3QgdGV4dF9ob2xlX21ha2UoY2hhciAqcCwgaW50IHNpemUpCS8vIGF0ICJwIiwgbWFrZSBhICdzaXplJyBieXRlIGhvbGUKK3sKKwl1aW50cHRyX3QgYmlhcyA9IDA7CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gYmlhczsKKwllbmQgKz0gc2l6ZTsJCS8vIGFkanVzdCB0aGUgbmV3IEVORAorCWlmIChlbmQgPj0gKHRleHQgKyB0ZXh0X3NpemUpKSB7CisJCWNoYXIgKm5ld190ZXh0OworCQl0ZXh0X3NpemUgKz0gZW5kIC0gKHRleHQgKyB0ZXh0X3NpemUpICsgMTAyNDA7CisJCW5ld190ZXh0ID0geHJlYWxsb2ModGV4dCwgdGV4dF9zaXplKTsKKwkJYmlhcyA9IChuZXdfdGV4dCAtIHRleHQpOworCQlzY3JlZW5iZWdpbiArPSBiaWFzOworCQlkb3QgICAgICAgICArPSBiaWFzOworCQllbmQgICAgICAgICArPSBiaWFzOworCQlwICAgICAgICAgICArPSBiaWFzOworCQl0ZXh0ID0gbmV3X3RleHQ7CisJfQorCW1lbW1vdmUocCArIHNpemUsIHAsIGVuZCAtIHNpemUgLSBwKTsKKwltZW1zZXQocCwgJyAnLCBzaXplKTsJLy8gY2xlYXIgbmV3IGhvbGUKKwlmaWxlX21vZGlmaWVkKys7CisJcmV0dXJuIGJpYXM7Cit9CisKKy8vICBjbG9zZSBhIGhvbGUgaW4gdGV4dFtdCitzdGF0aWMgY2hhciAqdGV4dF9ob2xlX2RlbGV0ZShjaGFyICpwLCBjaGFyICpxKSAvLyBkZWxldGUgInAiIHRocm91Z2ggInEiLCBpbmNsdXNpdmUKK3sKKwljaGFyICpzcmMsICpkZXN0OworCWludCBjbnQsIGhvbGVfc2l6ZTsKKworCS8vIG1vdmUgZm9yd2FyZHMsIGZyb20gYmVnaW5uaW5nCisJLy8gYXNzdW1lIHAgPD0gcQorCXNyYyA9IHEgKyAxOworCWRlc3QgPSBwOworCWlmIChxIDwgcCkgewkJLy8gdGhleSBhcmUgYmFja3dhcmQtIHN3YXAgdGhlbQorCQlzcmMgPSBwICsgMTsKKwkJZGVzdCA9IHE7CisJfQorCWhvbGVfc2l6ZSA9IHEgLSBwICsgMTsKKwljbnQgPSBlbmQgLSBzcmM7CisJaWYgKHNyYyA8IHRleHQgfHwgc3JjID4gZW5kKQorCQlnb3RvIHRoZDA7CisJaWYgKGRlc3QgPCB0ZXh0IHx8IGRlc3QgPj0gZW5kKQorCQlnb3RvIHRoZDA7CisJaWYgKHNyYyA+PSBlbmQpCisJCWdvdG8gdGhkX2F0ZW5kOwkvLyBqdXN0IGRlbGV0ZSB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKwltZW1tb3ZlKGRlc3QsIHNyYywgY250KTsKKyB0aGRfYXRlbmQ6CisJZW5kID0gZW5kIC0gaG9sZV9zaXplOwkvLyBhZGp1c3QgdGhlIG5ldyBFTkQKKwlpZiAoZGVzdCA+PSBlbmQpCisJCWRlc3QgPSBlbmQgLSAxOwkvLyBtYWtlIHN1cmUgZGVzdCBpbiBiZWxvdyBlbmQtMQorCWlmIChlbmQgPD0gdGV4dCkKKwkJZGVzdCA9IGVuZCA9IHRleHQ7CS8vIGtlZXAgcG9pbnRlcnMgdmFsaWQKKwlmaWxlX21vZGlmaWVkKys7CisgdGhkMDoKKwlyZXR1cm4gZGVzdDsKK30KKworLy8gY29weSB0ZXh0IGludG8gcmVnaXN0ZXIsIHRoZW4gZGVsZXRlIHRleHQuCisvLyBpZiBkaXN0IDw9IDAsIGRvIG5vdCBpbmNsdWRlLCBvciBnbyBwYXN0LCBhIE5ld0xpbmUKKy8vCitzdGF0aWMgY2hhciAqeWFua19kZWxldGUoY2hhciAqc3RhcnQsIGNoYXIgKnN0b3AsIGludCBkaXN0LCBpbnQgeWYpCit7CisJY2hhciAqcDsKKworCS8vIG1ha2Ugc3VyZSBzdGFydCA8PSBzdG9wCisJaWYgKHN0YXJ0ID4gc3RvcCkgeworCQkvLyB0aGV5IGFyZSBiYWNrd2FyZHMsIHJldmVyc2UgdGhlbQorCQlwID0gc3RhcnQ7CisJCXN0YXJ0ID0gc3RvcDsKKwkJc3RvcCA9IHA7CisJfQorCWlmIChkaXN0IDw9IDApIHsKKwkJLy8gd2UgY2Fubm90IGNyb3NzIE5MIGJvdW5kYXJpZXMKKwkJcCA9IHN0YXJ0OworCQlpZiAoKnAgPT0gJ1xuJykKKwkJCXJldHVybiBwOworCQkvLyBkb250IGdvIHBhc3QgYSBOZXdMaW5lCisJCWZvciAoOyBwICsgMSA8PSBzdG9wOyBwKyspIHsKKwkJCWlmIChwWzFdID09ICdcbicpIHsKKwkJCQlzdG9wID0gcDsJLy8gInN0b3AiIGp1c3QgYmVmb3JlIE5ld0xpbmUKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlwID0gc3RhcnQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwl0ZXh0X3lhbmsoc3RhcnQsIHN0b3AsIFlEcmVnKTsKKyNlbmRpZgorCWlmICh5ZiA9PSBZQU5LREVMKSB7CisJCXAgPSB0ZXh0X2hvbGVfZGVsZXRlKHN0YXJ0LCBzdG9wKTsKKwl9CQkJCQkvLyBkZWxldGUgbGluZXMKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgc2hvd19oZWxwKHZvaWQpCit7CisJcHV0cygiVGhlc2UgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZToiCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJIlxuXHRQYXR0ZXJuIHNlYXJjaGVzIHdpdGggLyBhbmQgPyIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwkiXG5cdExhc3QgY29tbWFuZCByZXBlYXQgd2l0aCBcJy5cJyIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJIlxuXHRMaW5lIG1hcmtpbmcgd2l0aCAneCIKKwkiXG5cdE5hbWVkIGJ1ZmZlcnMgd2l0aCBcIngiCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWQorCS8vbm90IGltcGxlbWVudGVkOiAiXG5cdFJlYWRvbmx5IGlmIHZpIGlzIGNhbGxlZCBhcyBcInZpZXdcIiIKKwkvL3JlZHVuZGFudDogdXNhZ2UgdGV4dCBzYXlzIHRoaXMgdG9vOiAiXG5cdFJlYWRvbmx5IHdpdGggLVIgY29tbWFuZCBsaW5lIGFyZyIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFVAorCSJcblx0U29tZSBjb2xvbiBtb2RlIGNvbW1hbmRzIHdpdGggXCc6XCciCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJIlxuXHRTZXR0YWJsZSBvcHRpb25zIHdpdGggXCI6c2V0XCIiCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworCSJcblx0U2lnbmFsIGNhdGNoaW5nLSBeQyIKKwkiXG5cdEpvYiBzdXNwZW5kIGFuZCByZXN1bWUgd2l0aCBeWiIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1dJTl9SRVNJWkUKKwkiXG5cdEFkYXB0IHRvIHdpbmRvdyByZS1zaXplcyIKKyNlbmRpZgorCSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECitzdGF0aWMgdm9pZCBzdGFydF9uZXdfY21kX3EoY2hhciBjKQoreworCS8vIGdldCBidWZmZXIgZm9yIG5ldyBjbWQKKwkvLyBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgY21kIGNvdW50IHB1dCBpdCBpbiB0aGUgYnVmZmVyIGZpcnN0CisJaWYgKGNtZGNudCA+IDApIHsKKwkJbG1jX2xlbiA9IHNwcmludGYobGFzdF9tb2RpZnlpbmdfY21kLCAiJWQlYyIsIGNtZGNudCwgYyk7CisJfSBlbHNlIHsgLy8ganVzdCBzYXZlIGNoYXIgYyBvbnRvIHF1ZXVlCisJCWxhc3RfbW9kaWZ5aW5nX2NtZFswXSA9IGM7CisJCWxtY19sZW4gPSAxOworCX0KKwlhZGRpbmcycSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9jbWRfcSh2b2lkKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJWURyZWcgPSAyNjsJCQkvLyBnbyBiYWNrIHRvIGRlZmF1bHQgWWFuay9EZWxldGUgcmVnCisjZW5kaWYKKwlhZGRpbmcycSA9IDA7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9ET1RfQ01EICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSyBcCisgfHwgKEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OICYmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSCkgXAorIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSBzdHJpbmdfaW5zZXJ0KHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCBzdHJpbmdfaW5zZXJ0KGNoYXIgKnAsIGNvbnN0IGNoYXIgKnMpIC8vIGluc2VydCB0aGUgc3RyaW5nIGF0ICdwJworeworCXVpbnRwdHJfdCBiaWFzOworCWludCBpOworCisJaSA9IHN0cmxlbihzKTsKKwliaWFzID0gdGV4dF9ob2xlX21ha2UocCwgaSk7CisJcCArPSBiaWFzOworCW1lbWNweShwLCBzLCBpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCXsKKwkJaW50IGNudDsKKwkJZm9yIChjbnQgPSAwOyAqcyAhPSAnXDAnOyBzKyspIHsKKwkJCWlmICgqcyA9PSAnXG4nKQorCQkJCWNudCsrOworCQl9CisJCXN0YXR1c19saW5lKCJQdXQgJWQgbGluZXMgKCVkIGNoYXJzKSBmcm9tIFslY10iLCBjbnQsIGksIHdoYXRfcmVnKCkpOworCX0KKyNlbmRpZgorCXJldHVybiBiaWFzOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworc3RhdGljIGNoYXIgKnRleHRfeWFuayhjaGFyICpwLCBjaGFyICpxLCBpbnQgZGVzdCkJLy8gY29weSB0ZXh0IGludG8gYSByZWdpc3RlcgoreworCWludCBjbnQgPSBxIC0gcDsKKwlpZiAoY250IDwgMCkgewkJLy8gdGhleSBhcmUgYmFja3dhcmRzLSByZXZlcnNlIHRoZW0KKwkJcCA9IHE7CisJCWNudCA9IC1jbnQ7CisJfQorCWZyZWUocmVnW2Rlc3RdKTsJLy8gIGlmIGFscmVhZHkgYSB5YW5rIHJlZ2lzdGVyLCBmcmVlIGl0CisJcmVnW2Rlc3RdID0geHN0cm5kdXAocCwgY250ICsgMSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyIHdoYXRfcmVnKHZvaWQpCit7CisJY2hhciBjOworCisJYyA9ICdEJzsJCQkvLyBkZWZhdWx0IHRvIEQtcmVnCisJaWYgKDAgPD0gWURyZWcgJiYgWURyZWcgPD0gMjUpCisJCWMgPSAnYScgKyAoY2hhcikgWURyZWc7CisJaWYgKFlEcmVnID09IDI2KQorCQljID0gJ0QnOworCWlmIChZRHJlZyA9PSAyNykKKwkJYyA9ICdVJzsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfY29udGV4dChjaGFyIGNtZCkKK3sKKwkvLyBBIGNvbnRleHQgaXMgZGVmaW5lZCB0byBiZSAibW9kaWZ5aW5nIHRleHQiCisJLy8gQW55IG1vZGlmeWluZyBjb21tYW5kIGVzdGFibGlzaGVzIGEgbmV3IGNvbnRleHQuCisKKwlpZiAoZG90IDwgY29udGV4dF9zdGFydCB8fCBkb3QgPiBjb250ZXh0X2VuZCkgeworCQlpZiAoc3RyY2hyKG1vZGlmeWluZ19jbWRzLCBjbWQpICE9IE5VTEwpIHsKKwkJCS8vIHdlIGFyZSB0cnlpbmcgdG8gbW9kaWZ5IHRleHRbXS0gbWFrZSB0aGlzIHRoZSBjdXJyZW50IGNvbnRleHQKKwkJCW1hcmtbMjddID0gbWFya1syNl07CS8vIG1vdmUgY3VyIHRvIHByZXYKKwkJCW1hcmtbMjZdID0gZG90OwkvLyBtb3ZlIGxvY2FsIHRvIGN1cgorCQkJY29udGV4dF9zdGFydCA9IHByZXZfbGluZShwcmV2X2xpbmUoZG90KSk7CisJCQljb250ZXh0X2VuZCA9IG5leHRfbGluZShuZXh0X2xpbmUoZG90KSk7CisJCQkvL2xvaXRlcj0gc3RhcnRfbG9pdGVyPSBub3c7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjaGFyICpzd2FwX2NvbnRleHQoY2hhciAqcCkgLy8gZ290byBuZXcgY29udGV4dCBmb3IgJycgY29tbWFuZCBtYWtlIHRoaXMgdGhlIGN1cnJlbnQgY29udGV4dAoreworCWNoYXIgKnRtcDsKKworCS8vIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgaW4gbWFya1syNl0KKwkvLyB0aGUgcHJldmlvdXMgY29udGV4dCBpcyBpbiBtYXJrWzI3XQorCS8vIG9ubHkgc3dhcCBjb250ZXh0IGlmIG90aGVyIGNvbnRleHQgaXMgdmFsaWQKKwlpZiAodGV4dCA8PSBtYXJrWzI3XSAmJiBtYXJrWzI3XSA8PSBlbmQgLSAxKSB7CisJCXRtcCA9IG1hcmtbMjddOworCQltYXJrWzI3XSA9IG1hcmtbMjZdOworCQltYXJrWzI2XSA9IHRtcDsKKwkJcCA9IG1hcmtbMjZdOwkvLyB3aGVyZSB3ZSBhcmUgZ29pbmctIHByZXZpb3VzIGNvbnRleHQKKwkJY29udGV4dF9zdGFydCA9IHByZXZfbGluZShwcmV2X2xpbmUocHJldl9saW5lKHApKSk7CisJCWNvbnRleHRfZW5kID0gbmV4dF9saW5lKG5leHRfbGluZShuZXh0X2xpbmUocCkpKTsKKwl9CisJcmV0dXJuIHA7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9ZQU5LTUFSSyAqLworCisvLy0tLS0tIFNldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCByYXdtb2RlKHZvaWQpCit7CisJdGNnZXRhdHRyKDAsICZ0ZXJtX29yaWcpOworCXRlcm1fdmkgPSB0ZXJtX29yaWc7CisJdGVybV92aS5jX2xmbGFnICY9ICh+SUNBTk9OICYgfkVDSE8pOwkvLyBsZWF2ZSBJU0lHIE9OLSBhbGxvdyBpbnRyJ3MKKwl0ZXJtX3ZpLmNfaWZsYWcgJj0gKH5JWE9OICYgfklDUk5MKTsKKwl0ZXJtX3ZpLmNfb2ZsYWcgJj0gKH5PTkxDUik7CisJdGVybV92aS5jX2NjW1ZNSU5dID0gMTsKKwl0ZXJtX3ZpLmNfY2NbVlRJTUVdID0gMDsKKwllcmFzZV9jaGFyID0gdGVybV92aS5jX2NjW1ZFUkFTRV07CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRlcm1fdmkpOworfQorCitzdGF0aWMgdm9pZCBjb29rbW9kZSh2b2lkKQoreworCWZmbHVzaF9hbGwoKTsKKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdGVybV9vcmlnKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisvLy0tLS0tIENvbWUgaGVyZSB3aGVuIHdlIGdldCBhIHdpbmRvdyByZXNpemUgc2lnbmFsIC0tLS0tLS0tLQorc3RhdGljIHZvaWQgd2luY2hfc2lnKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisJLy8gRklYTUU6IGRvIGl0IGluIG1haW4gbG9vcCEhIQorCXNpZ25hbChTSUdXSU5DSCwgd2luY2hfc2lnKTsKKwlxdWVyeV9zY3JlZW5fZGltZW5zaW9ucygpOworCW5ld19zY3JlZW4ocm93cywgY29sdW1ucyk7CS8vIGdldCBtZW1vcnkgZm9yIHZpcnR1YWwgc2NyZWVuCisJcmVkcmF3KFRSVUUpOwkJLy8gcmUtZHJhdyB0aGUgc2NyZWVuCisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCisvLy0tLS0tIENvbWUgaGVyZSB3aGVuIHdlIGdldCBhIGNvbnRpbnVlIHNpZ25hbCAtLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBjb250X3NpZyhpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCXJhd21vZGUoKTsgLy8gdGVybWluYWwgdG8gInJhdyIKKwlsYXN0X3N0YXR1c19ja3N1bSA9IDA7IC8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwlyZWRyYXcoVFJVRSk7IC8vIHJlLWRyYXcgdGhlIHNjcmVlbgorCisJc2lnbmFsKFNJR1RTVFAsIHN1c3BlbmRfc2lnKTsKKwlzaWduYWwoU0lHQ09OVCwgU0lHX0RGTCk7CisJLy9raWxsKG15X3BpZCwgU0lHQ09OVCk7IC8vIGh1aD8gd2h5PyB3ZSBhcmUgYWxyZWFkeSAiY29udGludWVkIi4uLgorCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworLy8tLS0tLSBDb21lIGhlcmUgd2hlbiB3ZSBnZXQgYSBTdXNwZW5kIHNpZ25hbCAtLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBzdXNwZW5kX3NpZyhpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJY29va21vZGUoKTsgLy8gdGVybWluYWwgdG8gImNvb2tlZCIKKworCXNpZ25hbChTSUdDT05ULCBjb250X3NpZyk7CisJc2lnbmFsKFNJR1RTVFAsIFNJR19ERkwpOworCWtpbGwobXlfcGlkLCBTSUdUU1RQKTsKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8vLS0tLS0gQ29tZSBoZXJlIHdoZW4gd2UgZ2V0IGEgc2lnbmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgY2F0Y2hfc2lnKGludCBzaWcpCit7CisJc2lnbmFsKFNJR0lOVCwgY2F0Y2hfc2lnKTsKKwlzaWdsb25nam1wKHJlc3RhcnQsIHNpZyk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9VU0VfU0lHTkFMUyAqLworCitzdGF0aWMgaW50IG15c2xlZXAoaW50IGh1bmQpCS8vIHNsZWVwIGZvciAnaHVuZCcgMS8xMDAgc2Vjb25kcyBvciBzdGRpbiByZWFkeQoreworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCisJcGZkWzBdLmZkID0gU1RESU5fRklMRU5POworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJcmV0dXJuIHNhZmVfcG9sbChwZmQsIDEsIGh1bmQqMTApID4gMDsKK30KKworLy8tLS0tLSBJTyBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGludCByZWFkaXQodm9pZCkgLy8gcmVhZCAobWF5YmUgY3Vyc29yKSBrZXkgZnJvbSBzdGRpbgoreworCWludCBjOworCisJZmZsdXNoX2FsbCgpOworCWMgPSByZWFkX2tleShTVERJTl9GSUxFTk8sIHJlYWRidWZmZXIsIC8qdGltZW91dCBvZmY6Ki8gLTIpOworCWlmIChjID09IC0xKSB7IC8vIEVPRi9lcnJvcgorCQlnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCgpOworCQljb29rbW9kZSgpOyAvLyB0ZXJtaW5hbCB0byAiY29va2VkIgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVhZCB1c2VyIGlucHV0Iik7CisJfQorCXJldHVybiBjOworfQorCisvLy0tLS0tIElPIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW50IGdldF9vbmVfY2hhcih2b2lkKQoreworCWludCBjOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCWlmICghYWRkaW5nMnEpIHsKKwkJLy8gd2UgYXJlIG5vdCBhZGRpbmcgdG8gdGhlIHEuCisJCS8vIGJ1dCwgd2UgbWF5IGJlIHJlYWRpbmcgZnJvbSBhIHEKKwkJaWYgKGlvcSA9PSAwKSB7CisJCQkvLyB0aGVyZSBpcyBubyBjdXJyZW50IHEsIHJlYWQgZnJvbSBTVERJTgorCQkJYyA9IHJlYWRpdCgpOwkvLyBnZXQgdGhlIHVzZXJzIGlucHV0CisJCX0gZWxzZSB7CisJCQkvLyB0aGVyZSBpcyBhIHF1ZXVlIHRvIGdldCBjaGFycyBmcm9tIGZpcnN0CisJCQkvLyBjYXJlZnVsIHdpdGggY29ycmVjdCBzaWduIGV4cGFuc2lvbiEKKwkJCWMgPSAodW5zaWduZWQgY2hhcikqaW9xKys7CisJCQlpZiAoYyA9PSAnXDAnKSB7CisJCQkJLy8gdGhlIGVuZCBvZiB0aGUgcSwgcmVhZCBmcm9tIFNURElOCisJCQkJZnJlZShpb3Ffc3RhcnQpOworCQkJCWlvcV9zdGFydCA9IGlvcSA9IDA7CisJCQkJYyA9IHJlYWRpdCgpOwkvLyBnZXQgdGhlIHVzZXJzIGlucHV0CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvLyBhZGRpbmcgU1RESU4gY2hhcnMgdG8gcQorCQljID0gcmVhZGl0KCk7CS8vIGdldCB0aGUgdXNlcnMgaW5wdXQKKwkJaWYgKGxtY19sZW4gPj0gTUFYX0lOUFVUX0xFTiAtIDEpIHsKKwkJCXN0YXR1c19saW5lX2JvbGQoImxhc3RfbW9kaWZ5aW5nX2NtZCBvdmVycnVuIik7CisJCX0gZWxzZSB7CisJCQkvLyBhZGQgbmV3IGNoYXIgdG8gcQorCQkJbGFzdF9tb2RpZnlpbmdfY21kW2xtY19sZW4rK10gPSBjOworCQl9CisJfQorI2Vsc2UKKwljID0gcmVhZGl0KCk7CQkvLyBnZXQgdGhlIHVzZXJzIGlucHV0CisjZW5kaWYgLyogRkVBVFVSRV9WSV9ET1RfQ01EICovCisJcmV0dXJuIGM7Cit9CisKKy8vIEdldCBpbnB1dCBsaW5lICh1c2VzICJzdGF0dXMgbGluZSIgYXJlYSkKK3N0YXRpYyBjaGFyICpnZXRfaW5wdXRfbGluZShjb25zdCBjaGFyICpwcm9tcHQpCit7CisJLy8gY2hhciBbTUFYX0lOUFVUX0xFTl0KKyNkZWZpbmUgYnVmIGdldF9pbnB1dF9saW5lX19idWYKKworCWludCBjOworCWludCBpOworCisJc3RyY3B5KGJ1ZiwgcHJvbXB0KTsKKwlsYXN0X3N0YXR1c19ja3N1bSA9IDA7CS8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwlnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCgpOworCXdyaXRlMShwcm9tcHQpOyAgICAgIC8vIHdyaXRlIG91dCB0aGUgOiwgLywgb3IgPyBwcm9tcHQKKworCWkgPSBzdHJsZW4oYnVmKTsKKwl3aGlsZSAoaSA8IE1BWF9JTlBVVF9MRU4pIHsKKwkJYyA9IGdldF9vbmVfY2hhcigpOworCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09IDI3KQorCQkJYnJlYWs7CQkvLyB0aGlzIGlzIGVuZCBvZiBpbnB1dAorCQlpZiAoYyA9PSBlcmFzZV9jaGFyIHx8IGMgPT0gOCB8fCBjID09IDEyNykgeworCQkJLy8gdXNlciB3YW50cyB0byBlcmFzZSBwcmV2IGNoYXIKKwkJCWJ1ZlstLWldID0gJ1wwJzsKKwkJCXdyaXRlMSgiXGIgXGIiKTsgLy8gZXJhc2UgY2hhciBvbiBzY3JlZW4KKwkJCWlmIChpIDw9IDApIC8vIHVzZXIgYmFja3MgdXAgYmVmb3JlIGItby1sLCBleGl0CisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYyA+IDAgJiYgYyA8IDI1NikgeyAvLyBleGNsdWRlIFVuaWNvZGUKKwkJCS8vIChUT0RPOiBuZWVkIHRvIGhhbmRsZSBVbmljb2RlKQorCQkJYnVmW2ldID0gYzsKKwkJCWJ1ZlsrK2ldID0gJ1wwJzsKKwkJCWJiX3B1dGNoYXIoYyk7CisJCX0KKwl9CisJcmVmcmVzaChGQUxTRSk7CisJcmV0dXJuIGJ1ZjsKKyN1bmRlZiBidWYKK30KKworc3RhdGljIGludCBmaWxlX3NpemUoY29uc3QgY2hhciAqZm4pIC8vIHdoYXQgaXMgdGhlIGJ5dGUgc2l6ZSBvZiAiZm4iCit7CisJc3RydWN0IHN0YXQgc3RfYnVmOworCWludCBjbnQ7CisKKwljbnQgPSAtMTsKKwlpZiAoZm4gJiYgc3RhdChmbiwgJnN0X2J1ZikgPT0gMCkJLy8gc2VlIGlmIGZpbGUgZXhpc3RzCisJCWNudCA9IChpbnQpIHN0X2J1Zi5zdF9zaXplOworCXJldHVybiBjbnQ7Cit9CisKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdIQorc3RhdGljIGludCBmaWxlX2luc2VydChjb25zdCBjaGFyICpmbiwgY2hhciAqcCwgaW50IHVwZGF0ZV9yb19zdGF0dXMpCit7CisJaW50IGNudCA9IC0xOworCWludCBmZCwgc2l6ZTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisJLyogVmFsaWRhdGUgZmlsZSAqLworCWlmIChzdGF0KGZuLCAmc3RhdGJ1ZikgPCAwKSB7CisJCXN0YXR1c19saW5lX2JvbGQoIlwiJXNcIiAlcyIsIGZuLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGZpMDsKKwl9CisJaWYgKCFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJLy8gVGhpcyBpcyBub3QgYSByZWd1bGFyIGZpbGUKKwkJc3RhdHVzX2xpbmVfYm9sZCgiXCIlc1wiIE5vdCBhIHJlZ3VsYXIgZmlsZSIsIGZuKTsKKwkJZ290byBmaTA7CisJfQorCWlmIChwIDwgdGV4dCB8fCBwID4gZW5kKSB7CisJCXN0YXR1c19saW5lX2JvbGQoIlRyeWluZyB0byBpbnNlcnQgZmlsZSBvdXRzaWRlIG9mIG1lbW9yeSIpOworCQlnb3RvIGZpMDsKKwl9CisKKwkvLyByZWFkIGZpbGUgdG8gYnVmZmVyCisJZmQgPSBvcGVuKGZuLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlzdGF0dXNfbGluZV9ib2xkKCJcIiVzXCIgJXMiLCBmbiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmaTA7CisJfQorCXNpemUgPSBzdGF0YnVmLnN0X3NpemU7CisJcCArPSB0ZXh0X2hvbGVfbWFrZShwLCBzaXplKTsKKwljbnQgPSBzYWZlX3JlYWQoZmQsIHAsIHNpemUpOworCWlmIChjbnQgPCAwKSB7CisJCXN0YXR1c19saW5lX2JvbGQoIlwiJXNcIiAlcyIsIGZuLCBzdHJlcnJvcihlcnJubykpOworCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwLCBwICsgc2l6ZSAtIDEpOwkvLyB1bi1kbyBidWZmZXIgaW5zZXJ0CisJfSBlbHNlIGlmIChjbnQgPCBzaXplKSB7CisJCS8vIFRoZXJlIHdhcyBhIHBhcnRpYWwgcmVhZCwgc2hyaW5rIHVudXNlZCBzcGFjZSB0ZXh0W10KKwkJcCA9IHRleHRfaG9sZV9kZWxldGUocCArIGNudCwgcCArIChzaXplIC0gY250KSAtIDEpOwkvLyB1bi1kbyBidWZmZXIgaW5zZXJ0CisJCXN0YXR1c19saW5lX2JvbGQoImNhbid0IHJlYWQgYWxsIG9mIGZpbGUgXCIlc1wiIiwgZm4pOworCX0KKwlpZiAoY250ID49IHNpemUpCisJCWZpbGVfbW9kaWZpZWQrKzsKKwljbG9zZShmZCk7CisgZmkwOgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJaWYgKHVwZGF0ZV9yb19zdGF0dXMKKwkgJiYgKChhY2Nlc3MoZm4sIFdfT0spIDwgMCkgfHwKKwkJLyogcm9vdCB3aWxsIGFsd2F5cyBoYXZlIGFjY2VzcygpCisJCSAqIHNvIHdlIGNoZWNrIGZpbGVwZXJtcyB0b28gKi8KKwkJIShzdGF0YnVmLnN0X21vZGUgJiAoU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIKSkKKwkgICAgKQorCSkgeworCQlTRVRfUkVBRE9OTFlfRklMRShyZWFkb25seV9tb2RlKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IGZpbGVfd3JpdGUoY2hhciAqZm4sIGNoYXIgKmZpcnN0LCBjaGFyICpsYXN0KQoreworCWludCBmZCwgY250LCBjaGFyY250OworCisJaWYgKGZuID09IDApIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gY3VycmVudCBmaWxlbmFtZSIpOworCQlyZXR1cm4gLTI7CisJfQorCS8qIEJ5IHBvcHVsYXIgcmVxdWVzdCB3ZSBkbyBub3Qgb3BlbiBmaWxlIHdpdGggT19UUlVOQywKKwkgKiBidXQgaW5zdGVhZCBmdHJ1bmNhdGUoKSBpdCBfYWZ0ZXJfIHN1Y2Nlc3NmdWwgd3JpdGUuCisJICogTWlnaHQgcmVkdWNlIGFtb3VudCBvZiBkYXRhIGxvc3Qgb24gcG93ZXIgZmFpbCBldGMuCisJICovCisJZmQgPSBvcGVuKGZuLCAoT19XUk9OTFkgfCBPX0NSRUFUKSwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWNudCA9IGxhc3QgLSBmaXJzdCArIDE7CisJY2hhcmNudCA9IGZ1bGxfd3JpdGUoZmQsIGZpcnN0LCBjbnQpOworCWZ0cnVuY2F0ZShmZCwgY2hhcmNudCk7CisJaWYgKGNoYXJjbnQgPT0gY250KSB7CisJCS8vIGdvb2Qgd3JpdGUKKwkJLy9maWxlX21vZGlmaWVkID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJY2hhcmNudCA9IDA7CisJfQorCWNsb3NlKGZkKTsKKwlyZXR1cm4gY2hhcmNudDsKK30KKworLy8tLS0tLSBUZXJtaW5hbCBEcmF3aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIHRlcm1pbmFsIGlzIG1hZGUgdXAgb2YgJ3Jvd3MnIGxpbmUgb2YgJ2NvbHVtbnMnIGNvbHVtbnMuCisvLyBjbGFzc2ljYWxseSB0aGlzIHdvdWxkIGJlIDI0IHggODAuCisvLyAgc2NyZWVuIGNvb3JkaW5hdGVzCisvLyAgMCwwICAgICAuLi4gICAgIDAsNzkKKy8vICAxLDAgICAgIC4uLiAgICAgMSw3OQorLy8gIC4gICAgICAgLi4uICAgICAuCisvLyAgLiAgICAgICAuLi4gICAgIC4KKy8vICAyMiwwICAgIC4uLiAgICAgMjIsNzkKKy8vICAyMywwICAgIC4uLiAgICAgMjMsNzkgICA8LSBzdGF0dXMgbGluZQorCisvLy0tLS0tIE1vdmUgdGhlIGN1cnNvciB0byByb3cgeCBjb2wgKGNvdW50IGZyb20gMCwgbm90IDEpIC0tLS0tLS0KK3N0YXRpYyB2b2lkIHBsYWNlX2N1cnNvcihpbnQgcm93LCBpbnQgY29sLCBpbnQgb3B0aW1pemUpCit7CisJY2hhciBjbTFbc2l6ZW9mKENNcmMpICsgc2l6ZW9mKGludCkqMyAqIDJdOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX09QVElNSVpFX0NVUlNPUgorCWVudW0geworCQlTWl9VUCA9IHNpemVvZihDTXVwKSwKKwkJU1pfRE4gPSBzaXplb2YoQ01kb3duKSwKKwkJU0VRX1NJWkUgPSBTWl9VUCA+IFNaX0ROID8gU1pfVVAgOiBTWl9ETiwKKwl9OworCWNoYXIgY20yW1NFUV9TSVpFICogNSArIDMyXTsgLy8gYmlnZ2VyIHRoYW4gd29yc3QgY2FzZSBzaXplCisjZW5kaWYKKwljaGFyICpjbTsKKworCWlmIChyb3cgPCAwKSByb3cgPSAwOworCWlmIChyb3cgPj0gcm93cykgcm93ID0gcm93cyAtIDE7CisJaWYgKGNvbCA8IDApIGNvbCA9IDA7CisJaWYgKGNvbCA+PSBjb2x1bW5zKSBjb2wgPSBjb2x1bW5zIC0gMTsKKworCS8vLS0tLS0gMS4gIFRyeSB0aGUgc3RhbmRhcmQgdGVybWluYWwgRVNDIHNlcXVlbmNlCisJc3ByaW50ZihjbTEsIENNcmMsIHJvdyArIDEsIGNvbCArIDEpOworCWNtID0gY20xOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfT1BUSU1JWkVfQ1VSU09SCisJaWYgKG9wdGltaXplICYmIGNvbCA8IDE2KSB7CisJCWNoYXIgKnNjcmVlbnA7CisJCWludCBScm93ID0gbGFzdF9yb3c7CisJCWludCBkaWZmID0gUnJvdyAtIHJvdzsKKworCQlpZiAoZGlmZiA8IC01IHx8IGRpZmYgPiA1KQorCQkJZ290byBza2lwOworCisJCS8vLS0tLS0gZmluZCB0aGUgbWluaW11bSAjIG9mIGNoYXJzIHRvIG1vdmUgY3Vyc29yIC0tLS0tLS0tLS0tLS0KKwkJLy8tLS0tLSAyLiAgVHJ5IG1vdmluZyB3aXRoIGRpc2NyZWV0IGNoYXJzIChOZXdsaW5lLCBbYmFja11zcGFjZSwgLi4uKQorCQljbTJbMF0gPSAnXDAnOworCisJCS8vIG1vdmUgdG8gdGhlIGNvcnJlY3Qgcm93CisJCXdoaWxlIChyb3cgPCBScm93KSB7CisJCQkvLyB0aGUgY3Vyc29yIGhhcyB0byBtb3ZlIHVwCisJCQlzdHJjYXQoY20yLCBDTXVwKTsKKwkJCVJyb3ctLTsKKwkJfQorCQl3aGlsZSAocm93ID4gUnJvdykgeworCQkJLy8gdGhlIGN1cnNvciBoYXMgdG8gbW92ZSBkb3duCisJCQlzdHJjYXQoY20yLCBDTWRvd24pOworCQkJUnJvdysrOworCQl9CisKKwkJLy8gbm93IG1vdmUgdG8gdGhlIGNvcnJlY3QgY29sdW1uCisJCXN0cmNhdChjbTIsICJcciIpOwkJCS8vIHN0YXJ0IGF0IGNvbCAwCisJCS8vIGp1c3Qgc2VuZCBvdXQgb3JpZ25hbCBzb3VyY2UgY2hhciB0byBnZXQgdG8gY29ycmVjdCBwbGFjZQorCQlzY3JlZW5wID0gJnNjcmVlbltyb3cgKiBjb2x1bW5zXTsJLy8gc3RhcnQgb2Ygc2NyZWVuIGxpbmUKKwkJc3RybmNhdChjbTIsIHNjcmVlbnAsIGNvbCk7CisKKwkJLy8gcGljayB0aGUgc2hvcnRlc3QgY3Vyc29yIG1vdGlvbiB0byBzZW5kIG91dAorCQlpZiAoc3RybGVuKGNtMikgPCBzdHJsZW4oY20pKSB7CisJCQljbSA9IGNtMjsKKwkJfQorIHNraXA6IDsKKwl9CisJbGFzdF9yb3cgPSByb3c7CisjZW5kaWYgLyogRkVBVFVSRV9WSV9PUFRJTUlaRV9DVVJTT1IgKi8KKwl3cml0ZTEoY20pOworfQorCisvLy0tLS0tIEVyYXNlIGZyb20gY3Vyc29yIHRvIGVuZCBvZiBsaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBjbGVhcl90b19lb2wodm9pZCkKK3sKKwl3cml0ZTEoQ2VvbCk7ICAgLy8gRXJhc2UgZnJvbSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUKK30KKworc3RhdGljIHZvaWQgZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2wodm9pZCkKK3sKKwlwbGFjZV9jdXJzb3Iocm93cyAtIDEsIDAsIEZBTFNFKTsgLy8gZ28gdG8gYm90dG9tIG9mIHNjcmVlbgorCWNsZWFyX3RvX2VvbCgpOyAvLyBlcmFzZSB0byBlbmQgb2YgbGluZQorfQorCisvLy0tLS0tIEVyYXNlIGZyb20gY3Vyc29yIHRvIGVuZCBvZiBzY3JlZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIGNsZWFyX3RvX2Vvcyh2b2lkKQoreworCXdyaXRlMShDZW9zKTsgICAvLyBFcmFzZSBmcm9tIGN1cnNvciB0byBlbmQgb2Ygc2NyZWVuCit9CisKKy8vLS0tLS0gU3RhcnQgc3RhbmRvdXQgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHN0YW5kb3V0X3N0YXJ0KHZvaWQpIC8vIHNlbmQgInN0YXJ0IHJldmVyc2UgdmlkZW8iIHNlcXVlbmNlCit7CisJd3JpdGUxKFNPcyk7ICAgICAvLyBTdGFydCByZXZlcnNlIHZpZGVvIG1vZGUKK30KKworLy8tLS0tLSBFbmQgc3RhbmRvdXQgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgc3RhbmRvdXRfZW5kKHZvaWQpIC8vIHNlbmQgImVuZCByZXZlcnNlIHZpZGVvIiBzZXF1ZW5jZQoreworCXdyaXRlMShTT24pOyAgICAgLy8gRW5kIHJldmVyc2UgdmlkZW8gbW9kZQorfQorCisvLy0tLS0tIEZsYXNoIHRoZSBzY3JlZW4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBmbGFzaChpbnQgaCkKK3sKKwlzdGFuZG91dF9zdGFydCgpOwkvLyBzZW5kICJzdGFydCByZXZlcnNlIHZpZGVvIiBzZXF1ZW5jZQorCXJlZHJhdyhUUlVFKTsKKwlteXNsZWVwKGgpOworCXN0YW5kb3V0X2VuZCgpOwkJLy8gc2VuZCAiZW5kIHJldmVyc2UgdmlkZW8iIHNlcXVlbmNlCisJcmVkcmF3KFRSVUUpOworfQorCitzdGF0aWMgdm9pZCBJbmRpY2F0ZV9FcnJvcih2b2lkKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwlpZiAoY3Jhc2htZSA+IDApCisJCXJldHVybjsJCQkvLyBnZW5lcmF0ZSBhIHJhbmRvbSBjb21tYW5kCisjZW5kaWYKKwlpZiAoIWVycl9tZXRob2QpIHsKKwkJd3JpdGUxKGJlbGwpOyAgIC8vIHNlbmQgb3V0IGEgYmVsbCBjaGFyYWN0ZXIKKwl9IGVsc2UgeworCQlmbGFzaCgxMCk7CisJfQorfQorCisvLy0tLS0tIFNjcmVlbltdIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tIEVyYXNlIHRoZSBTY3JlZW5bXSBtZW1vcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBzY3JlZW5fZXJhc2Uodm9pZCkKK3sKKwltZW1zZXQoc2NyZWVuLCAnICcsIHNjcmVlbnNpemUpOwkvLyBjbGVhciBuZXcgc2NyZWVuCit9CisKK3N0YXRpYyBpbnQgYnVmc3VtKGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBzdW0gPSAwOworCWNoYXIgKmUgPSBidWYgKyBjb3VudDsKKworCXdoaWxlIChidWYgPCBlKQorCQlzdW0gKz0gKHVuc2lnbmVkIGNoYXIpICpidWYrKzsKKwlyZXR1cm4gc3VtOworfQorCisvLy0tLS0tIERyYXcgdGhlIHN0YXR1cyBsaW5lIGF0IGJvdHRvbSBvZiB0aGUgc2NyZWVuIC0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHNob3dfc3RhdHVzX2xpbmUodm9pZCkKK3sKKwlpbnQgY250ID0gMCwgY2tzdW0gPSAwOworCisJLy8gZWl0aGVyIHdlIGFscmVhZHkgaGF2ZSBhbiBlcnJvciBvciBzdGF0dXMgbWVzc2FnZSwgb3Igd2UKKwkvLyBjcmVhdGUgb25lLgorCWlmICghaGF2ZV9zdGF0dXNfbXNnKSB7CisJCWNudCA9IGZvcm1hdF9lZGl0X3N0YXR1cygpOworCQlja3N1bSA9IGJ1ZnN1bShzdGF0dXNfYnVmZmVyLCBjbnQpOworCX0KKwlpZiAoaGF2ZV9zdGF0dXNfbXNnIHx8ICgoY250ID4gMCAmJiBsYXN0X3N0YXR1c19ja3N1bSAhPSBja3N1bSkpKSB7CisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gY2tzdW07CQkvLyByZW1lbWJlciBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBsaW5lCisJCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJCXdyaXRlMShzdGF0dXNfYnVmZmVyKTsKKwkJaWYgKGhhdmVfc3RhdHVzX21zZykgeworCQkJaWYgKCgoaW50KXN0cmxlbihzdGF0dXNfYnVmZmVyKSAtIChoYXZlX3N0YXR1c19tc2cgLSAxKSkgPgorCQkJCQkoY29sdW1ucyAtIDEpICkgeworCQkJCWhhdmVfc3RhdHVzX21zZyA9IDA7CisJCQkJSGl0X1JldHVybigpOworCQkJfQorCQkJaGF2ZV9zdGF0dXNfbXNnID0gMDsKKwkJfQorCQlwbGFjZV9jdXJzb3IoY3JvdywgY2NvbCwgRkFMU0UpOwkvLyBwdXQgY3Vyc29yIGJhY2sgaW4gY29ycmVjdCBwbGFjZQorCX0KKwlmZmx1c2hfYWxsKCk7Cit9CisKKy8vLS0tLS0gZm9ybWF0IHRoZSBzdGF0dXMgYnVmZmVyLCB0aGUgYm90dG9tIGxpbmUgb2Ygc2NyZWVuIC0tLS0tLQorLy8gZm9ybWF0IHN0YXR1cyBidWZmZXIsIHdpdGggU1RBTkRPVVQgbW9kZQorc3RhdGljIHZvaWQgc3RhdHVzX2xpbmVfYm9sZChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXN0cmNweShzdGF0dXNfYnVmZmVyLCBTT3MpOwkvLyBUZXJtaW5hbCBzdGFuZG91dCBtb2RlIG9uCisJdnNwcmludGYoc3RhdHVzX2J1ZmZlciArIHNpemVvZihTT3MpLTEsIGZvcm1hdCwgYXJncyk7CisJc3RyY2F0KHN0YXR1c19idWZmZXIsIFNPbik7CS8vIFRlcm1pbmFsIHN0YW5kb3V0IG1vZGUgb2ZmCisJdmFfZW5kKGFyZ3MpOworCisJaGF2ZV9zdGF0dXNfbXNnID0gMSArIHNpemVvZihTT3MpICsgc2l6ZW9mKFNPbikgLSAyOworfQorCisvLyBmb3JtYXQgc3RhdHVzIGJ1ZmZlcgorc3RhdGljIHZvaWQgc3RhdHVzX2xpbmUoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwl2c3ByaW50ZihzdGF0dXNfYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWhhdmVfc3RhdHVzX21zZyA9IDE7Cit9CisKKy8vIGNvcHkgcyB0byBidWYsIGNvbnZlcnQgdW5wcmludGFibGUKK3N0YXRpYyB2b2lkIHByaW50X2xpdGVyYWwoY2hhciAqYnVmLCBjb25zdCBjaGFyICpzKQoreworCWNoYXIgKmQ7CisJdW5zaWduZWQgY2hhciBjOworCisJYnVmWzBdID0gJ1wwJzsKKwlpZiAoIXNbMF0pCisJCXMgPSAiKE5VTEwpIjsKKworCWQgPSBidWY7CisJZm9yICg7ICpzOyBzKyspIHsKKwkJaW50IGNfaXNfbm9fcHJpbnQ7CisKKwkJYyA9ICpzOworCQljX2lzX25vX3ByaW50ID0gKGMgJiAweDgwKSAmJiAhSXNwcmludChjKTsKKwkJaWYgKGNfaXNfbm9fcHJpbnQpIHsKKwkJCXN0cmNweShkLCBTT24pOworCQkJZCArPSBzaXplb2YoU09uKS0xOworCQkJYyA9ICcuJzsKKwkJfQorCQlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKKwkJCSpkKysgPSAnXic7CisJCQljIHw9ICdAJzsgLyogMHg0MCAqLworCQkJaWYgKGMgPT0gMHg3ZikKKwkJCQljID0gJz8nOworCQl9CisJCSpkKysgPSBjOworCQkqZCA9ICdcMCc7CisJCWlmIChjX2lzX25vX3ByaW50KSB7CisJCQlzdHJjcHkoZCwgU09zKTsKKwkJCWQgKz0gc2l6ZW9mKFNPcyktMTsKKwkJfQorCQlpZiAoKnMgPT0gJ1xuJykgeworCQkJKmQrKyA9ICckJzsKKwkJCSpkID0gJ1wwJzsKKwkJfQorCQlpZiAoZCAtIGJ1ZiA+IE1BWF9JTlBVVF9MRU4gLSAxMCkgLy8gcGFyYW5vaWEKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbm90X2ltcGxlbWVudGVkKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciBidWZbTUFYX0lOUFVUX0xFTl07CisKKwlwcmludF9saXRlcmFsKGJ1Ziwgcyk7CisJc3RhdHVzX2xpbmVfYm9sZCgiXCclc1wnIGlzIG5vdCBpbXBsZW1lbnRlZCIsIGJ1Zik7Cit9CisKKy8vIHNob3cgZmlsZSBzdGF0dXMgb24gc3RhdHVzIGxpbmUKK3N0YXRpYyBpbnQgZm9ybWF0X2VkaXRfc3RhdHVzKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY21kX21vZGVfaW5kaWNhdG9yW10gQUxJR04xID0gIi1JUi0iOworCisjZGVmaW5lIHRvdCBmb3JtYXRfZWRpdF9zdGF0dXNfX3RvdAorCisJaW50IGN1ciwgcGVyY2VudCwgcmV0LCB0cnVuY19hdDsKKworCS8vIGZpbGVfbW9kaWZpZWQgaXMgbm93IGEgY291bnRlciByYXRoZXIgdGhhbiBhIGZsYWcuICB0aGlzCisJLy8gaGVscHMgcmVkdWNlIHRoZSBhbW91bnQgb2YgbGluZSBjb3VudGluZyB3ZSBuZWVkIHRvIGRvLgorCS8vICh0aGlzIHdpbGwgY2F1c2UgYSBtaXMtcmVwb3J0aW5nIG9mIG1vZGlmaWVkIHN0YXR1cworCS8vIG9uY2UgZXZlcnkgTUFYSU5UIGVkaXRpbmcgb3BlcmF0aW9ucy4pCisKKwkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIGRvIGEgc2ltaWxhciBvcHRpbWl6YXRpb24gaGVyZSAtLSBpZgorCS8vIHdlIGhhdmVuJ3QgZG9uZSBhIG1vdGlvbiB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZCB3aGljaCBsaW5lCisJLy8gd2UncmUgb24sIHRoZW4gd2Ugc2hvdWxkbid0IGhhdmUgdG8gZG8gdGhpcyBjb3VudF9saW5lcygpCisJY3VyID0gY291bnRfbGluZXModGV4dCwgZG90KTsKKworCS8vIHJlZHVjZSBjb3VudGluZyAtLSB0aGUgdG90YWwgbGluZXMgY2FuJ3QgaGF2ZQorCS8vIGNoYW5nZWQgaWYgd2UgaGF2ZW4ndCBkb25lIGFueSBlZGl0cy4KKwlpZiAoZmlsZV9tb2RpZmllZCAhPSBsYXN0X2ZpbGVfbW9kaWZpZWQpIHsKKwkJdG90ID0gY3VyICsgY291bnRfbGluZXMoZG90LCBlbmQgLSAxKSAtIDE7CisJCWxhc3RfZmlsZV9tb2RpZmllZCA9IGZpbGVfbW9kaWZpZWQ7CisJfQorCisJLy8gICAgY3VycmVudCBsaW5lICAgICAgICAgcGVyY2VudAorCS8vICAgLS0tLS0tLS0tLS0tLSAgICB+fiAtLS0tLS0tLS0tCisJLy8gICAgdG90YWwgbGluZXMgICAgICAgICAgICAxMDAKKwlpZiAodG90ID4gMCkgeworCQlwZXJjZW50ID0gKDEwMCAqIGN1cikgLyB0b3Q7CisJfSBlbHNlIHsKKwkJY3VyID0gdG90ID0gMDsKKwkJcGVyY2VudCA9IDEwMDsKKwl9CisKKwl0cnVuY19hdCA9IGNvbHVtbnMgPCBTVEFUVVNfQlVGRkVSX0xFTi0xID8KKwkJY29sdW1ucyA6IFNUQVRVU19CVUZGRVJfTEVOLTE7CisKKwlyZXQgPSBzbnByaW50ZihzdGF0dXNfYnVmZmVyLCB0cnVuY19hdCsxLAorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCSIlYyAlcyVzJXMgJWQvJWQgJWQlJSIsCisjZWxzZQorCQkiJWMgJXMlcyAlZC8lZCAlZCUlIiwKKyNlbmRpZgorCQljbWRfbW9kZV9pbmRpY2F0b3JbY21kX21vZGUgJiAzXSwKKwkJKGN1cnJlbnRfZmlsZW5hbWUgIT0gTlVMTCA/IGN1cnJlbnRfZmlsZW5hbWUgOiAiTm8gZmlsZSIpLAorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCShyZWFkb25seV9tb2RlID8gIiBbUmVhZG9ubHldIiA6ICIiKSwKKyNlbmRpZgorCQkoZmlsZV9tb2RpZmllZCA/ICIgW01vZGlmaWVkXSIgOiAiIiksCisJCWN1ciwgdG90LCBwZXJjZW50KTsKKworCWlmIChyZXQgPj0gMCAmJiByZXQgPCB0cnVuY19hdCkKKwkJcmV0dXJuIHJldDsgIC8qIGl0IGFsbCBmaXQgKi8KKworCXJldHVybiB0cnVuY19hdDsgIC8qIGhhZCB0byB0cnVuY2F0ZSAqLworI3VuZGVmIHRvdAorfQorCisvLy0tLS0tIEZvcmNlIHJlZnJlc2ggb2YgYWxsIExpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCByZWRyYXcoaW50IGZ1bGxfc2NyZWVuKQoreworCXBsYWNlX2N1cnNvcigwLCAwLCBGQUxTRSk7CS8vIHB1dCBjdXJzb3IgaW4gY29ycmVjdCBwbGFjZQorCWNsZWFyX3RvX2VvcygpOwkJLy8gdGVsbCB0ZXJtaW5hbCB0byBlcmFzZSBkaXNwbGF5CisJc2NyZWVuX2VyYXNlKCk7CQkvLyBlcmFzZSB0aGUgaW50ZXJuYWwgc2NyZWVuIGJ1ZmZlcgorCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCXJlZnJlc2goZnVsbF9zY3JlZW4pOwkvLyB0aGlzIHdpbGwgcmVkcmF3IHRoZSBlbnRpcmUgZGlzcGxheQorCXNob3dfc3RhdHVzX2xpbmUoKTsKK30KKworLy8tLS0tLSBGb3JtYXQgYSB0ZXh0W10gbGluZSBpbnRvIGEgYnVmZmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGNoYXIqIGZvcm1hdF9saW5lKGNoYXIgKnNyYyAvKiwgaW50IGxpKi8pCit7CisJdW5zaWduZWQgY2hhciBjOworCWludCBjbzsKKwlpbnQgb2ZzID0gb2Zmc2V0OworCWNoYXIgKmRlc3QgPSBzY3Jfb3V0X2J1ZjsgLy8gW01BWF9TQ1JfQ09MUyArIE1BWF9UQUJTVE9QICogMl0KKworCWMgPSAnfic7IC8vIGNoYXIgaW4gY29sIDAgaW4gbm9uLWV4aXN0ZW50IGxpbmVzIGlzICd+JworCWNvID0gMDsKKwl3aGlsZSAoY28gPCBjb2x1bW5zICsgdGFic3RvcCkgeworCQkvLyBoYXZlIHdlIGdvbmUgcGFzdCB0aGUgZW5kPworCQlpZiAoc3JjIDwgZW5kKSB7CisJCQljID0gKnNyYysrOworCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJCWlmICgoYyAmIDB4ODApICYmICFJc3ByaW50KGMpKSB7CisJCQkJYyA9ICcuJzsKKwkJCX0KKwkJCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQkJCWlmIChjID09ICdcdCcpIHsKKwkJCQkJYyA9ICcgJzsKKwkJCQkJLy8gICAgICBjbyAlICAgIDggICAgICE9ICAgICA3CisJCQkJCXdoaWxlICgoY28gJSB0YWJzdG9wKSAhPSAodGFic3RvcCAtIDEpKSB7CisJCQkJCQlkZXN0W2NvKytdID0gYzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWRlc3RbY28rK10gPSAnXic7CisJCQkJCWlmIChjID09IDB4N2YpCisJCQkJCQljID0gJz8nOworCQkJCQllbHNlCisJCQkJCQljICs9ICdAJzsgLy8gQ3RybC1YIC0+ICdYJworCQkJCX0KKwkJCX0KKwkJfQorCQlkZXN0W2NvKytdID0gYzsKKwkJLy8gZGlzY2FyZCBzY3JvbGxlZC1vZmYtdG8tdGhlLWxlZnQgcG9ydGlvbiwKKwkJLy8gaW4gdGFic3RvcC1zaXplZCBwaWVjZXMKKwkJaWYgKG9mcyA+PSB0YWJzdG9wICYmIGNvID49IHRhYnN0b3ApIHsKKwkJCW1lbW1vdmUoZGVzdCwgZGVzdCArIHRhYnN0b3AsIGNvKTsKKwkJCWNvIC09IHRhYnN0b3A7CisJCQlvZnMgLT0gdGFic3RvcDsKKwkJfQorCQlpZiAoc3JjID49IGVuZCkKKwkJCWJyZWFrOworCX0KKwkvLyBjaGVjayAic2hvcnQgbGluZSwgZ2lnYW50aWMgb2Zmc2V0IiBjYXNlCisJaWYgKGNvIDwgb2ZzKQorCQlvZnMgPSBjbzsKKwkvLyBkaXNjYXJkIGxhc3Qgc2Nyb2xsZWQgb2ZmIHBhcnQKKwljbyAtPSBvZnM7CisJZGVzdCArPSBvZnM7CisJLy8gZmlsbCB0aGUgcmVzdCB3aXRoIHNwYWNlcworCWlmIChjbyA8IGNvbHVtbnMpCisJCW1lbXNldCgmZGVzdFtjb10sICcgJywgY29sdW1ucyAtIGNvKTsKKwlyZXR1cm4gZGVzdDsKK30KKworLy8tLS0tLSBSZWZyZXNoIHRoZSBjaGFuZ2VkIHNjcmVlbiBsaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29weSB0aGUgc291cmNlIGxpbmUgZnJvbSB0ZXh0W10gaW50byB0aGUgYnVmZmVyIGFuZCBub3RlCisvLyBpZiB0aGUgY3VycmVudCBzY3JlZW5saW5lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuZXcgYnVmZmVyLgorLy8gSWYgdGhleSBkaWZmZXIgdGhlbiB0aGF0IGxpbmUgbmVlZHMgcmVkcmF3aW5nIG9uIHRoZSB0ZXJtaW5hbC4KKy8vCitzdGF0aWMgdm9pZCByZWZyZXNoKGludCBmdWxsX3NjcmVlbikKK3sKKyNkZWZpbmUgb2xkX29mZnNldCByZWZyZXNoX19vbGRfb2Zmc2V0CisKKwlpbnQgbGksIGNoYW5nZWQ7CisJY2hhciAqdHAsICpzcDsJCS8vIHBvaW50ZXIgaW50byB0ZXh0W10gYW5kIHNjcmVlbltdCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVklfV0lOX1JFU0laRSBJRl9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTCgmJiAhRy5nZXRfcm93Y29sX2Vycm9yKSApIHsKKwkJdW5zaWduZWQgYyA9IGNvbHVtbnMsIHIgPSByb3dzOworCQlxdWVyeV9zY3JlZW5fZGltZW5zaW9ucygpOworCQlmdWxsX3NjcmVlbiB8PSAoYyAtIGNvbHVtbnMpIHwgKHIgLSByb3dzKTsKKwl9CisJc3luY19jdXJzb3IoZG90LCAmY3JvdywgJmNjb2wpOwkvLyB3aGVyZSBjdXJzb3Igd2lsbCBiZSAob24gImRvdCIpCisJdHAgPSBzY3JlZW5iZWdpbjsJLy8gaW5kZXggaW50byB0ZXh0W10gb2YgdG9wIGxpbmUKKworCS8vIGNvbXBhcmUgdGV4dFtdIHRvIHNjcmVlbltdIGFuZCBtYXJrIHNjcmVlbltdIGxpbmVzIHRoYXQgbmVlZCB1cGRhdGluZworCWZvciAobGkgPSAwOyBsaSA8IHJvd3MgLSAxOyBsaSsrKSB7CisJCWludCBjcywgY2U7CQkJCS8vIGNvbHVtbiBzdGFydCAmIGVuZAorCQljaGFyICpvdXRfYnVmOworCQkvLyBmb3JtYXQgY3VycmVudCB0ZXh0IGxpbmUKKwkJb3V0X2J1ZiA9IGZvcm1hdF9saW5lKHRwIC8qLCBsaSovKTsKKworCQkvLyBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGV4dFtdIGxpbmUKKwkJaWYgKHRwIDwgZW5kKSB7CisJCQljaGFyICp0ID0gbWVtY2hyKHRwLCAnXG4nLCBlbmQgLSB0cCk7CisJCQlpZiAoIXQpIHQgPSBlbmQgLSAxOworCQkJdHAgPSB0ICsgMTsKKwkJfQorCisJCS8vIHNlZSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgYmV0d2VlbiB2aXR1YWwgc2NyZWVuIGFuZCBvdXRfYnVmCisJCWNoYW5nZWQgPSBGQUxTRTsJLy8gYXNzdW1lIG5vIGNoYW5nZQorCQljcyA9IDA7CisJCWNlID0gY29sdW1ucyAtIDE7CisJCXNwID0gJnNjcmVlbltsaSAqIGNvbHVtbnNdOwkvLyBzdGFydCBvZiBzY3JlZW4gbGluZQorCQlpZiAoZnVsbF9zY3JlZW4pIHsKKwkJCS8vIGZvcmNlIHJlLWRyYXcgb2YgZXZlcnkgc2luZ2xlIGNvbHVtbiBmcm9tIDAgLSBjb2x1bW5zLTEKKwkJCWdvdG8gcmUwOworCQl9CisJCS8vIGNvbXBhcmUgbmV3bHkgZm9ybWF0dGVkIGJ1ZmZlciB3aXRoIHZpcnR1YWwgc2NyZWVuCisJCS8vIGxvb2sgZm9yd2FyZCBmb3IgZmlyc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIGJ1ZiBhbmQgc2NyZWVuCisJCWZvciAoOyBjcyA8PSBjZTsgY3MrKykgeworCQkJaWYgKG91dF9idWZbY3NdICE9IHNwW2NzXSkgeworCQkJCWNoYW5nZWQgPSBUUlVFOwkvLyBtYXJrIGZvciByZWRyYXcKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIGxvb2sgYmFja3dhcmQgZm9yIGxhc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIG91dF9idWYgYW5kIHNjcmVlbgorCQlmb3IgKDsgY2UgPj0gY3M7IGNlLS0pIHsKKwkJCWlmIChvdXRfYnVmW2NlXSAhPSBzcFtjZV0pIHsKKwkJCQljaGFuZ2VkID0gVFJVRTsJLy8gbWFyayBmb3IgcmVkcmF3CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLy8gbm93LCBjcyBpcyBpbmRleCBvZiBmaXJzdCBkaWZmLCBhbmQgY2UgaXMgaW5kZXggb2YgbGFzdCBkaWZmCisKKwkJLy8gaWYgaG9yeiBvZmZzZXQgaGFzIGNoYW5nZWQsIGZvcmNlIGEgcmVkcmF3CisJCWlmIChvZmZzZXQgIT0gb2xkX29mZnNldCkgeworIHJlMDoKKwkJCWNoYW5nZWQgPSBUUlVFOworCQl9CisKKwkJLy8gbWFrZSBhIHNhbml0eSBjaGVjayBvZiBjb2x1bW5zIGluZGV4ZXMKKwkJaWYgKGNzIDwgMCkgY3MgPSAwOworCQlpZiAoY2UgPiBjb2x1bW5zIC0gMSkgY2UgPSBjb2x1bW5zIC0gMTsKKwkJaWYgKGNzID4gY2UpIHsgY3MgPSAwOyBjZSA9IGNvbHVtbnMgLSAxOyB9CisJCS8vIGlzIHRoZXJlIGEgY2hhbmdlIGJldHdlZW4gdml0dWFsIHNjcmVlbiBhbmQgb3V0X2J1ZgorCQlpZiAoY2hhbmdlZCkgeworCQkJLy8gY29weSBjaGFuZ2VkIHBhcnQgb2YgYnVmZmVyIHRvIHZpcnR1YWwgc2NyZWVuCisJCQltZW1jcHkoc3ArY3MsIG91dF9idWYrY3MsIGNlLWNzKzEpOworCisJCQkvLyBtb3ZlIGN1cnNvciB0byBjb2x1bW4gb2YgZmlyc3QgY2hhbmdlCisJCQkvL2lmIChvZmZzZXQgIT0gb2xkX29mZnNldCkgeworCQkJLy8JLy8gcGxhY2VfY3Vyc29yIGlzIHN0aWxsIHRvbyBzdHVwaWQKKwkJCS8vCS8vIHRvIGhhbmRsZSBvZmZzZXRzIGNvcnJlY3RseQorCQkJLy8JcGxhY2VfY3Vyc29yKGxpLCBjcywgRkFMU0UpOworCQkJLy99IGVsc2UgeworCQkJCXBsYWNlX2N1cnNvcihsaSwgY3MsIFRSVUUpOworCQkJLy99CisKKwkJCS8vIHdyaXRlIGxpbmUgb3V0IHRvIHRlcm1pbmFsCisJCQlmd3JpdGUoJnNwW2NzXSwgY2UgLSBjcyArIDEsIDEsIHN0ZG91dCk7CisJCX0KKwl9CisKKwlwbGFjZV9jdXJzb3IoY3JvdywgY2NvbCwgVFJVRSk7CisKKwlvbGRfb2Zmc2V0ID0gb2Zmc2V0OworI3VuZGVmIG9sZF9vZmZzZXQKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0gdGhlIEFzY2lpIENoYXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIDAwIG51bCAgIDAxIHNvaCAgIDAyIHN0eCAgIDAzIGV0eCAgIDA0IGVvdCAgIDA1IGVucSAgIDA2IGFjayAgIDA3IGJlbAorLy8gIDA4IGJzICAgIDA5IGh0ICAgIDBhIG5sICAgIDBiIHZ0ICAgIDBjIG5wICAgIDBkIGNyICAgIDBlIHNvICAgIDBmIHNpCisvLyAgMTAgZGxlICAgMTEgZGMxICAgMTIgZGMyICAgMTMgZGMzICAgMTQgZGM0ICAgMTUgbmFrICAgMTYgc3luICAgMTcgZXRiCisvLyAgMTggY2FuICAgMTkgZW0gICAgMWEgc3ViICAgMWIgZXNjICAgMWMgZnMgICAgMWQgZ3MgICAgMWUgcnMgICAgMWYgdXMKKy8vICAyMCBzcCAgICAyMSAhICAgICAyMiAiICAgICAyMyAjICAgICAyNCAkICAgICAyNSAlICAgICAyNiAmICAgICAyNyAnCisvLyAgMjggKCAgICAgMjkgKSAgICAgMmEgKiAgICAgMmIgKyAgICAgMmMgLCAgICAgMmQgLSAgICAgMmUgLiAgICAgMmYgLworLy8gIDMwIDAgICAgIDMxIDEgICAgIDMyIDIgICAgIDMzIDMgICAgIDM0IDQgICAgIDM1IDUgICAgIDM2IDYgICAgIDM3IDcKKy8vICAzOCA4ICAgICAzOSA5ICAgICAzYSA6ICAgICAzYiA7ICAgICAzYyA8ICAgICAzZCA9ICAgICAzZSA+ICAgICAzZiA/CisvLyAgNDAgQCAgICAgNDEgQSAgICAgNDIgQiAgICAgNDMgQyAgICAgNDQgRCAgICAgNDUgRSAgICAgNDYgRiAgICAgNDcgRworLy8gIDQ4IEggICAgIDQ5IEkgICAgIDRhIEogICAgIDRiIEsgICAgIDRjIEwgICAgIDRkIE0gICAgIDRlIE4gICAgIDRmIE8KKy8vICA1MCBQICAgICA1MSBRICAgICA1MiBSICAgICA1MyBTICAgICA1NCBUICAgICA1NSBVICAgICA1NiBWICAgICA1NyBXCisvLyAgNTggWCAgICAgNTkgWSAgICAgNWEgWiAgICAgNWIgWyAgICAgNWMgXCAgICAgNWQgXSAgICAgNWUgXiAgICAgNWYgXworLy8gIDYwIGAgICAgIDYxIGEgICAgIDYyIGIgICAgIDYzIGMgICAgIDY0IGQgICAgIDY1IGUgICAgIDY2IGYgICAgIDY3IGcKKy8vICA2OCBoICAgICA2OSBpICAgICA2YSBqICAgICA2YiBrICAgICA2YyBsICAgICA2ZCBtICAgICA2ZSBuICAgICA2ZiBvCisvLyAgNzAgcCAgICAgNzEgcSAgICAgNzIgciAgICAgNzMgcyAgICAgNzQgdCAgICAgNzUgdSAgICAgNzYgdiAgICAgNzcgdworLy8gIDc4IHggICAgIDc5IHkgICAgIDdhIHogICAgIDdiIHsgICAgIDdjIHwgICAgIDdkIH0gICAgIDdlIH4gICAgIDdmIGRlbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLSBFeGVjdXRlIGEgVmkgQ29tbWFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgZG9fY21kKGludCBjKQoreworCWNvbnN0IGNoYXIgKm1zZyA9IG1zZzsgLy8gZm9yIGNvbXBpbGVyCisJY2hhciAqcCwgKnEsICpzYXZlX2RvdDsKKwljaGFyIGJ1ZlsxMl07CisJaW50IGRpcjsKKwlpbnQgY250LCBpLCBqOworCWludCBjMTsKKworLy8JYzEgPSBjOyAvLyBxdWlldCB0aGUgY29tcGlsZXIKKy8vCWNudCA9IHlmID0gMDsgLy8gcXVpZXQgdGhlIGNvbXBpbGVyCisvLwltc2cgPSBwID0gcSA9IHNhdmVfZG90ID0gYnVmOyAvLyBxdWlldCB0aGUgY29tcGlsZXIKKwltZW1zZXQoYnVmLCAnXDAnLCAxMik7CisKKwlzaG93X3N0YXR1c19saW5lKCk7CisKKwkvKiBpZiB0aGlzIGlzIGEgY3Vyc29yIGtleSwgc2tpcCB0aGVzZSBjaGVja3MgKi8KKwlzd2l0Y2ggKGMpIHsKKwkJY2FzZSBLRVlDT0RFX1VQOgorCQljYXNlIEtFWUNPREVfRE9XTjoKKwkJY2FzZSBLRVlDT0RFX0xFRlQ6CisJCWNhc2UgS0VZQ09ERV9SSUdIVDoKKwkJY2FzZSBLRVlDT0RFX0hPTUU6CisJCWNhc2UgS0VZQ09ERV9FTkQ6CisJCWNhc2UgS0VZQ09ERV9QQUdFVVA6CisJCWNhc2UgS0VZQ09ERV9QQUdFRE9XTjoKKwkJY2FzZSBLRVlDT0RFX0RFTEVURToKKwkJCWdvdG8ga2V5X2NtZF9tb2RlOworCX0KKworCWlmIChjbWRfbW9kZSA9PSAyKSB7CisJCS8vICBmbGlwLWZsb3AgSW5zZXJ0L1JlcGxhY2UgbW9kZQorCQlpZiAoYyA9PSBLRVlDT0RFX0lOU0VSVCkKKwkJCWdvdG8gZGNfaTsKKwkJLy8gd2UgYXJlICdSJ2VwbGFjaW5nIHRoZSBjdXJyZW50ICpkb3Qgd2l0aCBuZXcgY2hhcgorCQlpZiAoKmRvdCA9PSAnXG4nKSB7CisJCQkvLyBkb24ndCBSZXBsYWNlIHBhc3QgRS1vLWwKKwkJCWNtZF9tb2RlID0gMTsJLy8gY29udmVydCB0byBpbnNlcnQKKwkJfSBlbHNlIHsKKwkJCWlmICgxIDw9IGMgfHwgSXNwcmludChjKSkgeworCQkJCWlmIChjICE9IDI3KQorCQkJCQlkb3QgPSB5YW5rX2RlbGV0ZShkb3QsIGRvdCwgMCwgWUFOS0RFTCk7CS8vIGRlbGV0ZSBjaGFyCisJCQkJZG90ID0gY2hhcl9pbnNlcnQoZG90LCBjKTsJLy8gaW5zZXJ0IG5ldyBjaGFyCisJCQl9CisJCQlnb3RvIGRjMTsKKwkJfQorCX0KKwlpZiAoY21kX21vZGUgPT0gMSkgeworCQkvLyAgaGl0dGluZyAiSW5zZXJ0IiB0d2ljZSBtZWFucyAiUiIgcmVwbGFjZSBtb2RlCisJCWlmIChjID09IEtFWUNPREVfSU5TRVJUKSBnb3RvIGRjNTsKKwkJLy8gaW5zZXJ0IHRoZSBjaGFyIGMgYXQgImRvdCIKKwkJaWYgKDEgPD0gYyB8fCBJc3ByaW50KGMpKSB7CisJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsIGMpOworCQl9CisJCWdvdG8gZGMxOworCX0KKworIGtleV9jbWRfbW9kZToKKwlzd2l0Y2ggKGMpIHsKKwkJLy9jYXNlIDB4MDE6CS8vIHNvaAorCQkvL2Nhc2UgMHgwOToJLy8gaHQKKwkJLy9jYXNlIDB4MGI6CS8vIHZ0CisJCS8vY2FzZSAweDBlOgkvLyBzbworCQkvL2Nhc2UgMHgwZjoJLy8gc2kKKwkJLy9jYXNlIDB4MTA6CS8vIGRsZQorCQkvL2Nhc2UgMHgxMToJLy8gZGMxCisJCS8vY2FzZSAweDEzOgkvLyBkYzMKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisJY2FzZSAweDE0OgkJCS8vIGRjNCAgY3RybC1UCisJCWNyYXNobWUgPSAoY3Jhc2htZSA9PSAwKSA/IDEgOiAwOworCQlicmVhazsKKyNlbmRpZgorCQkvL2Nhc2UgMHgxNjoJLy8gc3luCisJCS8vY2FzZSAweDE3OgkvLyBldGIKKwkJLy9jYXNlIDB4MTg6CS8vIGNhbgorCQkvL2Nhc2UgMHgxYzoJLy8gZnMKKwkJLy9jYXNlIDB4MWQ6CS8vIGdzCisJCS8vY2FzZSAweDFlOgkvLyBycworCQkvL2Nhc2UgMHgxZjoJLy8gdXMKKwkJLy9jYXNlICchJzoJLy8gIS0KKwkJLy9jYXNlICcjJzoJLy8gIy0KKwkJLy9jYXNlICcmJzoJLy8gJi0KKwkJLy9jYXNlICcoJzoJLy8gKC0KKwkJLy9jYXNlICcpJzoJLy8gKS0KKwkJLy9jYXNlICcqJzoJLy8gKi0KKwkJLy9jYXNlICc9JzoJLy8gPS0KKwkJLy9jYXNlICdAJzoJLy8gQC0KKwkJLy9jYXNlICdGJzoJLy8gRi0KKwkJLy9jYXNlICdLJzoJLy8gSy0KKwkJLy9jYXNlICdRJzoJLy8gUS0KKwkJLy9jYXNlICdTJzoJLy8gUy0KKwkJLy9jYXNlICdUJzoJLy8gVC0KKwkJLy9jYXNlICdWJzoJLy8gVi0KKwkJLy9jYXNlICdbJzoJLy8gWy0KKwkJLy9jYXNlICdcXCc6CS8vIFwtCisJCS8vY2FzZSAnXSc6CS8vIF0tCisJCS8vY2FzZSAnXyc6CS8vIF8tCisJCS8vY2FzZSAnYCc6CS8vIGAtCisJCS8vY2FzZSAndSc6CS8vIHUtIEZJWE1FLSB0aGVyZSBpcyBubyB1bmRvCisJCS8vY2FzZSAndic6CS8vIHYtCisJZGVmYXVsdDoJCQkvLyB1bnJlY29nbml6ZWQgY29tbWFuZAorCQlidWZbMF0gPSBjOworCQlidWZbMV0gPSAnXDAnOworCQlub3RfaW1wbGVtZW50ZWQoYnVmKTsKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwljYXNlIDB4MDA6CQkJLy8gbnVsLSBpZ25vcmUKKwkJYnJlYWs7CisJY2FzZSAyOgkJCS8vIGN0cmwtQiAgc2Nyb2xsIHVwICAgZnVsbCBzY3JlZW4KKwljYXNlIEtFWUNPREVfUEFHRVVQOgkvLyBDdXJzb3IgS2V5IFBhZ2UgVXAKKwkJZG90X3Njcm9sbChyb3dzIC0gMiwgLTEpOworCQlicmVhazsKKwljYXNlIDQ6CQkJLy8gY3RybC1EICBzY3JvbGwgZG93biBoYWxmIHNjcmVlbgorCQlkb3Rfc2Nyb2xsKChyb3dzIC0gMikgLyAyLCAxKTsKKwkJYnJlYWs7CisJY2FzZSA1OgkJCS8vIGN0cmwtRSAgc2Nyb2xsIGRvd24gb25lIGxpbmUKKwkJZG90X3Njcm9sbCgxLCAxKTsKKwkJYnJlYWs7CisJY2FzZSA2OgkJCS8vIGN0cmwtRiAgc2Nyb2xsIGRvd24gZnVsbCBzY3JlZW4KKwljYXNlIEtFWUNPREVfUEFHRURPV046CS8vIEN1cnNvciBLZXkgUGFnZSBEb3duCisJCWRvdF9zY3JvbGwocm93cyAtIDIsIDEpOworCQlicmVhazsKKwljYXNlIDc6CQkJLy8gY3RybC1HICBzaG93IGN1cnJlbnQgc3RhdHVzCisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQlicmVhazsKKwljYXNlICdoJzoJCQkvLyBoLSBtb3ZlIGxlZnQKKwljYXNlIEtFWUNPREVfTEVGVDoJLy8gY3Vyc29yIGtleSBMZWZ0CisJY2FzZSA4OgkJLy8gY3RybC1ILSBtb3ZlIGxlZnQgICAgKFRoaXMgbWF5IGJlIEVSQVNFIGNoYXIpCisJY2FzZSAweDdmOgkvLyBERUwtIG1vdmUgbGVmdCAgIChUaGlzIG1heSBiZSBFUkFTRSBjaGFyKQorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZG90X2xlZnQoKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoJCQkvLyBOZXdsaW5lIF5KCisJY2FzZSAnaic6CQkJLy8gai0gZ290byBuZXh0IGxpbmUsIHNhbWUgY29sCisJY2FzZSBLRVlDT0RFX0RPV046CS8vIGN1cnNvciBrZXkgRG93bgorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZG90X25leHQoKTsJCS8vIGdvIHRvIG5leHQgQi1vLWwKKwkJZG90ID0gbW92ZV90b19jb2woZG90LCBjY29sICsgb2Zmc2V0KTsJLy8gdHJ5IHN0YXkgaW4gc2FtZSBjb2wKKwkJYnJlYWs7CisJY2FzZSAxMjoJCQkvLyBjdHJsLUwgIGZvcmNlIHJlZHJhdyB3aG9sZSBzY3JlZW4KKwljYXNlIDE4OgkJCS8vIGN0cmwtUiAgZm9yY2UgcmVkcmF3CisJCXBsYWNlX2N1cnNvcigwLCAwLCBGQUxTRSk7CS8vIHB1dCBjdXJzb3IgaW4gY29ycmVjdCBwbGFjZQorCQljbGVhcl90b19lb3MoKTsJLy8gdGVsIHRlcm1pbmFsIHRvIGVyYXNlIGRpc3BsYXkKKwkJbXlzbGVlcCgxMCk7CisJCXNjcmVlbl9lcmFzZSgpOwkvLyBlcmFzZSB0aGUgaW50ZXJuYWwgc2NyZWVuIGJ1ZmZlcgorCQlsYXN0X3N0YXR1c19ja3N1bSA9IDA7CS8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwkJcmVmcmVzaChUUlVFKTsJLy8gdGhpcyB3aWxsIHJlZHJhdyB0aGUgZW50aXJlIGRpc3BsYXkKKwkJYnJlYWs7CisJY2FzZSAxMzoJCQkvLyBDYXJyaWFnZSBSZXR1cm4gXk0KKwljYXNlICcrJzoJCQkvLyArLSBnb3RvIG5leHQgbGluZQorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZG90X25leHQoKTsKKwkJZG90X3NraXBfb3Zlcl93cygpOworCQlicmVhazsKKwljYXNlIDIxOgkJCS8vIGN0cmwtVSAgc2Nyb2xsIHVwICAgaGFsZiBzY3JlZW4KKwkJZG90X3Njcm9sbCgocm93cyAtIDIpIC8gMiwgLTEpOworCQlicmVhazsKKwljYXNlIDI1OgkJCS8vIGN0cmwtWSAgc2Nyb2xsIHVwIG9uZSBsaW5lCisJCWRvdF9zY3JvbGwoMSwgLTEpOworCQlicmVhazsKKwljYXNlIDI3OgkJCS8vIGVzYworCQlpZiAoY21kX21vZGUgPT0gMCkKKwkJCWluZGljYXRlX2Vycm9yKGMpOworCQljbWRfbW9kZSA9IDA7CS8vIHN0b3AgaW5zcnRpbmcKKwkJZW5kX2NtZF9xKCk7CisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQlicmVhazsKKwljYXNlICcgJzoJCQkvLyBtb3ZlIHJpZ2h0CisJY2FzZSAnbCc6CQkJLy8gbW92ZSByaWdodAorCWNhc2UgS0VZQ09ERV9SSUdIVDoJLy8gQ3Vyc29yIEtleSBSaWdodAorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZG90X3JpZ2h0KCk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJY2FzZSAnIic6CQkJLy8gIi0gbmFtZSBhIHJlZ2lzdGVyIHRvIHVzZSBmb3IgRGVsZXRlL1lhbmsKKwkJYzEgPSAoZ2V0X29uZV9jaGFyKCkgfCAweDIwKSAtICdhJzsgLy8gfCAweDIwIGlzIHRvbG93ZXIoKQorCQlpZiAoKHVuc2lnbmVkKWMxIDw9IDI1KSB7IC8vIGEtej8KKwkJCVlEcmVnID0gYzE7CisJCX0gZWxzZSB7CisJCQlpbmRpY2F0ZV9lcnJvcihjKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdcJyc6CQkJLy8gJy0gZ290byBhIHNwZWNpZmljIG1hcmsKKwkJYzEgPSAoZ2V0X29uZV9jaGFyKCkgfCAweDIwKSAtICdhJzsKKwkJaWYgKCh1bnNpZ25lZCljMSA8PSAyNSkgeyAvLyBhLXo/CisJCQkvLyBnZXQgdGhlIGItby1sCisJCQlxID0gbWFya1tjMV07CisJCQlpZiAodGV4dCA8PSBxICYmIHEgPCBlbmQpIHsKKwkJCQlkb3QgPSBxOworCQkJCWRvdF9iZWdpbigpOwkvLyBnbyB0byBCLW8tbAorCQkJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjMSA9PSAnXCcnKSB7CS8vIGdvdG8gcHJldmlvdXMgY29udGV4dAorCQkJZG90ID0gc3dhcF9jb250ZXh0KGRvdCk7CS8vIHN3YXAgY3VycmVudCBhbmQgcHJldmlvdXMgY29udGV4dAorCQkJZG90X2JlZ2luKCk7CS8vIGdvIHRvIEItby1sCisJCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCX0gZWxzZSB7CisJCQlpbmRpY2F0ZV9lcnJvcihjKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdtJzoJCQkvLyBtLSBNYXJrIGEgbGluZQorCQkvLyB0aGlzIGlzIHJlYWxseSBzdHVwaWQuICBJZiB0aGVyZSBhcmUgYW55IGluc2VydHMgb3IgZGVsZXRlcworCQkvLyBiZXR3ZWVuIHRleHRbMF0gYW5kIGRvdCB0aGVuIHRoaXMgbWFyayB3aWxsIG5vdCBwb2ludCB0byB0aGUKKwkJLy8gY29ycmVjdCBsb2NhdGlvbiEgSXQgY291bGQgYmUgb2ZmIGJ5IG1hbnkgbGluZXMhCisJCS8vIFdlbGwuLi4sIGF0IGxlYXN0IGl0cyBxdWljayBhbmQgZGlydHkuCisJCWMxID0gKGdldF9vbmVfY2hhcigpIHwgMHgyMCkgLSAnYSc7CisJCWlmICgodW5zaWduZWQpYzEgPD0gMjUpIHsgLy8gYS16PworCQkJLy8gcmVtZW1iZXIgdGhlIGxpbmUKKwkJCW1hcmtbYzFdID0gZG90OworCQl9IGVsc2UgeworCQkJaW5kaWNhdGVfZXJyb3IoYyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnUCc6CQkJLy8gUC0gUHV0IHJlZ2lzdGVyIGJlZm9yZQorCWNhc2UgJ3AnOgkJCS8vIHAtIHB1dCByZWdpc3RlciBhZnRlcgorCQlwID0gcmVnW1lEcmVnXTsKKwkJaWYgKHAgPT0gTlVMTCkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm90aGluZyBpbiByZWdpc3RlciAlYyIsIHdoYXRfcmVnKCkpOworCQkJYnJlYWs7CisJCX0KKwkJLy8gYXJlIHdlIHB1dHRpbmcgd2hvbGUgbGluZXMgb3Igc3RyaW5ncworCQlpZiAoc3RyY2hyKHAsICdcbicpICE9IE5VTEwpIHsKKwkJCWlmIChjID09ICdQJykgeworCQkJCWRvdF9iZWdpbigpOwkvLyBwdXR0aW5nIGxpbmVzLSBQdXQgYWJvdmUKKwkJCX0KKwkJCWlmIChjID09ICdwJykgeworCQkJCS8vIGFyZSB3ZSBwdXR0aW5nIGFmdGVyIHZlcnkgbGFzdCBsaW5lPworCQkJCWlmIChlbmRfbGluZShkb3QpID09IChlbmQgLSAxKSkgeworCQkJCQlkb3QgPSBlbmQ7CS8vIGZvcmNlIGRvdCB0byBlbmQgb2YgdGV4dFtdCisJCQkJfSBlbHNlIHsKKwkJCQkJZG90X25leHQoKTsJLy8gbmV4dCBsaW5lLCB0aGVuIHB1dCBiZWZvcmUKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYyA9PSAncCcpCisJCQkJZG90X3JpZ2h0KCk7CS8vIG1vdmUgdG8gcmlnaHQsIGNhbiBtb3ZlIHRvIE5MCisJCX0KKwkJc3RyaW5nX2luc2VydChkb3QsIHApOwkvLyBpbnNlcnQgdGhlIHN0cmluZworCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQlicmVhazsKKwljYXNlICdVJzoJCQkvLyBVLSBVbmRvOyByZXBsYWNlIGN1cnJlbnQgbGluZSB3aXRoIG9yaWdpbmFsIHZlcnNpb24KKwkJaWYgKHJlZ1tVcmVnXSAhPSAwKSB7CisJCQlwID0gYmVnaW5fbGluZShkb3QpOworCQkJcSA9IGVuZF9saW5lKGRvdCk7CisJCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwLCBxKTsJLy8gZGVsZXRlIGN1ciBsaW5lCisJCQlwICs9IHN0cmluZ19pbnNlcnQocCwgcmVnW1VyZWddKTsJLy8gaW5zZXJ0IG9yaWcgbGluZQorCQkJZG90ID0gcDsKKwkJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1lBTktNQVJLICovCisJY2FzZSAnJCc6CQkJLy8gJC0gZ290byBlbmQgb2YgbGluZQorCWNhc2UgS0VZQ09ERV9FTkQ6CQkvLyBDdXJzb3IgS2V5IEVuZAorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb3RfbmV4dCgpOworCQkJZG9fY21kKGMpOworCQl9CisJCWRvdCA9IGVuZF9saW5lKGRvdCk7CisJCWJyZWFrOworCWNhc2UgJyUnOgkJCS8vICUtIGZpbmQgbWF0Y2hpbmcgY2hhciBvZiBwYWlyICgpIFtdIHt9CisJCWZvciAocSA9IGRvdDsgcSA8IGVuZCAmJiAqcSAhPSAnXG4nOyBxKyspIHsKKwkJCWlmIChzdHJjaHIoIigpW117fSIsICpxKSAhPSBOVUxMKSB7CisJCQkJLy8gd2UgZm91bmQgaGFsZiBvZiBhIHBhaXIKKwkJCQlwID0gZmluZF9wYWlyKHEsICpxKTsKKwkJCQlpZiAocCA9PSBOVUxMKSB7CisJCQkJCWluZGljYXRlX2Vycm9yKGMpOworCQkJCX0gZWxzZSB7CisJCQkJCWRvdCA9IHA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICgqcSA9PSAnXG4nKQorCQkJaW5kaWNhdGVfZXJyb3IoYyk7CisJCWJyZWFrOworCWNhc2UgJ2YnOgkJCS8vIGYtIGZvcndhcmQgdG8gYSB1c2VyIHNwZWNpZmllZCBjaGFyCisJCWxhc3RfZm9yd2FyZF9jaGFyID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCB0aGUgc2VhcmNoIGNoYXIKKwkJLy8KKwkJLy8gZG9udCBzZXBhcmF0ZSB0aGVzZSB0d28gY29tbWFuZHMuICdmJyBkZXBlbmRzIG9uICc7JworCQkvLworCQkvLyoqKiogZmFsbCB0aHJvdWdoIHRvIC4uLiAnOycKKwljYXNlICc7JzoJCQkvLyA7LSBsb29rIGF0IHJlc3Qgb2YgbGluZSBmb3IgbGFzdCBmb3J3YXJkIGNoYXIKKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKCc7Jyk7CisJCX0KKwkJaWYgKGxhc3RfZm9yd2FyZF9jaGFyID09IDApCisJCQlicmVhazsKKwkJcSA9IGRvdCArIDE7CisJCXdoaWxlIChxIDwgZW5kIC0gMSAmJiAqcSAhPSAnXG4nICYmICpxICE9IGxhc3RfZm9yd2FyZF9jaGFyKSB7CisJCQlxKys7CisJCX0KKwkJaWYgKCpxID09IGxhc3RfZm9yd2FyZF9jaGFyKQorCQkJZG90ID0gcTsKKwkJYnJlYWs7CisJY2FzZSAnLCc6ICAgICAgICAgICAvLyByZXBlYXQgbGF0ZXN0ICdmJyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb24KKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKCcsJyk7CisJCX0KKwkJaWYgKGxhc3RfZm9yd2FyZF9jaGFyID09IDApCisJCQlicmVhazsKKwkJcSA9IGRvdCAtIDE7CisJCXdoaWxlIChxID49IHRleHQgJiYgKnEgIT0gJ1xuJyAmJiAqcSAhPSBsYXN0X2ZvcndhcmRfY2hhcikgeworCQkJcS0tOworCQl9CisJCWlmIChxID49IHRleHQgJiYgKnEgPT0gbGFzdF9mb3J3YXJkX2NoYXIpCisJCQlkb3QgPSBxOworCQlicmVhazsKKworCWNhc2UgJy0nOgkJCS8vIC0tIGdvdG8gcHJldiBsaW5lCisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfcHJldigpOworCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwljYXNlICcuJzoJCQkvLyAuLSByZXBlYXQgdGhlIGxhc3QgbW9kaWZ5aW5nIGNvbW1hbmQKKwkJLy8gU3R1ZmYgdGhlIGxhc3RfbW9kaWZ5aW5nX2NtZCBiYWNrIGludG8gc3RkaW4KKwkJLy8gYW5kIGxldCBpdCBiZSByZS1leGVjdXRlZC4KKwkJaWYgKGxtY19sZW4gPiAwKSB7CisJCQlsYXN0X21vZGlmeWluZ19jbWRbbG1jX2xlbl0gPSAwOworCQkJaW9xID0gaW9xX3N0YXJ0ID0geHN0cmR1cChsYXN0X21vZGlmeWluZ19jbWQpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJY2FzZSAnPyc6CQkJLy8gLy0gc2VhcmNoIGZvciBhIHBhdHRlcm4KKwljYXNlICcvJzoJCQkvLyAvLSBzZWFyY2ggZm9yIGEgcGF0dGVybgorCQlidWZbMF0gPSBjOworCQlidWZbMV0gPSAnXDAnOworCQlxID0gZ2V0X2lucHV0X2xpbmUoYnVmKTsJLy8gZ2V0IGlucHV0IGxpbmUtIHVzZSAic3RhdHVzIGxpbmUiCisJCWlmIChxWzBdICYmICFxWzFdKSB7CisJCQlpZiAobGFzdF9zZWFyY2hfcGF0dGVyblswXSkKKwkJCQlsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdID0gYzsKKwkJCWdvdG8gZGMzOyAvLyBpZiBubyBwYXQgcmUtdXNlIG9sZCBwYXQKKwkJfQorCQlpZiAocVswXSkgeyAgICAgICAvLyBzdHJsZW4ocSkgPiAxOiBuZXcgcGF0LSBzYXZlIGl0IGFuZCBmaW5kCisJCQkvLyB0aGVyZSBpcyBhIG5ldyBwYXQKKwkJCWZyZWUobGFzdF9zZWFyY2hfcGF0dGVybik7CisJCQlsYXN0X3NlYXJjaF9wYXR0ZXJuID0geHN0cmR1cChxKTsKKwkJCWdvdG8gZGMzOwkvLyBub3cgZmluZCB0aGUgcGF0dGVybgorCQl9CisJCS8vIHVzZXIgY2hhbmdlZCBtaW5kIGFuZCBlcmFzZWQgdGhlICIvIi0gIGRvIG5vdGhpbmcKKwkJYnJlYWs7CisJY2FzZSAnTic6CQkJLy8gTi0gYmFja3dhcmQgc2VhcmNoIGZvciBsYXN0IHBhdHRlcm4KKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKGMpOworCQl9CisJCWRpciA9IEJBQ0s7CQkvLyBhc3N1bWUgQkFDS1dBUkQgc2VhcmNoCisJCXAgPSBkb3QgLSAxOworCQlpZiAobGFzdF9zZWFyY2hfcGF0dGVyblswXSA9PSAnPycpIHsKKwkJCWRpciA9IEZPUldBUkQ7CisJCQlwID0gZG90ICsgMTsKKwkJfQorCQlnb3RvIGRjNDsJCS8vIG5vdyBzZWFyY2ggZm9yIHBhdHRlcm4KKwkJYnJlYWs7CisJY2FzZSAnbic6CQkJLy8gbi0gcmVwZWF0IHNlYXJjaCBmb3IgbGFzdCBwYXR0ZXJuCisJCS8vIHNlYXJjaCByZXN0IG9mIHRleHRbXSBzdGFydGluZyBhdCBuZXh0IGNoYXIKKwkJLy8gaWYgc2VhcmNoIGZhaWxzIHJldHVybiBvcmlnbmFsICJwIiBub3QgdGhlICJwKzEiIGFkZHJlc3MKKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKGMpOworCQl9CisgZGMzOgorCQlkaXIgPSBGT1JXQVJEOwkvLyBhc3N1bWUgRk9SV0FSRCBzZWFyY2gKKwkJcCA9IGRvdCArIDE7CisJCWlmIChsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdID09ICc/JykgeworCQkJZGlyID0gQkFDSzsKKwkJCXAgPSBkb3QgLSAxOworCQl9CisgZGM0OgorCQlxID0gY2hhcl9zZWFyY2gocCwgbGFzdF9zZWFyY2hfcGF0dGVybiArIDEsIGRpciwgRlVMTCk7CisJCWlmIChxICE9IE5VTEwpIHsKKwkJCWRvdCA9IHE7CS8vIGdvb2Qgc2VhcmNoLCB1cGRhdGUgImRvdCIKKwkJCW1zZyA9ICIiOworCQkJZ290byBkYzI7CisJCX0KKwkJLy8gbm8gcGF0dGVybiBmb3VuZCBiZXR3ZWVuICJkb3QiIGFuZCAiZW5kIi0gY29udGludWUgYXQgdG9wCisJCXAgPSB0ZXh0OworCQlpZiAoZGlyID09IEJBQ0spIHsKKwkJCXAgPSBlbmQgLSAxOworCQl9CisJCXEgPSBjaGFyX3NlYXJjaChwLCBsYXN0X3NlYXJjaF9wYXR0ZXJuICsgMSwgZGlyLCBGVUxMKTsKKwkJaWYgKHEgIT0gTlVMTCkgewkvLyBmb3VuZCBzb21ldGhpbmcKKwkJCWRvdCA9IHE7CS8vIGZvdW5kIG5ldyBwYXR0ZXJuLSBnb3RvIGl0CisJCQltc2cgPSAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIjsKKwkJCWlmIChkaXIgPT0gQkFDSykgeworCQkJCW1zZyA9ICJzZWFyY2ggaGl0IFRPUCwgY29udGludWluZyBhdCBCT1RUT00iOworCQkJfQorCQl9IGVsc2UgeworCQkJbXNnID0gIlBhdHRlcm4gbm90IGZvdW5kIjsKKwkJfQorIGRjMjoKKwkJaWYgKCptc2cpCisJCQlzdGF0dXNfbGluZV9ib2xkKCIlcyIsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgJ3snOgkJCS8vIHstIG1vdmUgYmFja3dhcmQgcGFyYWdyYXBoCisJCXEgPSBjaGFyX3NlYXJjaChkb3QsICJcblxuIiwgQkFDSywgRlVMTCk7CisJCWlmIChxICE9IE5VTEwpIHsJLy8gZm91bmQgYmxhbmsgbGluZQorCQkJZG90ID0gbmV4dF9saW5lKHEpOwkvLyBtb3ZlIHRvIG5leHQgYmxhbmsgbGluZQorCQl9CisJCWJyZWFrOworCWNhc2UgJ30nOgkJCS8vIH0tIG1vdmUgZm9yd2FyZCBwYXJhZ3JhcGgKKwkJcSA9IGNoYXJfc2VhcmNoKGRvdCwgIlxuXG4iLCBGT1JXQVJELCBGVUxMKTsKKwkJaWYgKHEgIT0gTlVMTCkgewkvLyBmb3VuZCBibGFuayBsaW5lCisJCQlkb3QgPSBuZXh0X2xpbmUocSk7CS8vIG1vdmUgdG8gbmV4dCBibGFuayBsaW5lCisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRUFSQ0ggKi8KKwljYXNlICcwJzoJCQkvLyAwLSBnb3RvIGJlZ2luaW5nIG9mIGxpbmUKKwljYXNlICcxJzoJCQkvLyAxLQorCWNhc2UgJzInOgkJCS8vIDItCisJY2FzZSAnMyc6CQkJLy8gMy0KKwljYXNlICc0JzoJCQkvLyA0LQorCWNhc2UgJzUnOgkJCS8vIDUtCisJY2FzZSAnNic6CQkJLy8gNi0KKwljYXNlICc3JzoJCQkvLyA3LQorCWNhc2UgJzgnOgkJCS8vIDgtCisJY2FzZSAnOSc6CQkJLy8gOS0KKwkJaWYgKGMgPT0gJzAnICYmIGNtZGNudCA8IDEpIHsKKwkJCWRvdF9iZWdpbigpOwkvLyB0aGlzIHdhcyBhIHN0YW5kYWxvbmUgemVybworCQl9IGVsc2UgeworCQkJY21kY250ID0gY21kY250ICogMTAgKyAoYyAtICcwJyk7CS8vIHRoaXMgMCBpcyBwYXJ0IG9mIGEgbnVtYmVyCisJCX0KKwkJYnJlYWs7CisJY2FzZSAnOic6CQkJLy8gOi0gdGhlIGNvbG9uIG1vZGUgY29tbWFuZHMKKwkJcCA9IGdldF9pbnB1dF9saW5lKCI6Iik7CS8vIGdldCBpbnB1dCBsaW5lLSB1c2UgInN0YXR1cyBsaW5lIgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCisJCWNvbG9uKHApOwkJLy8gZXhlY3V0ZSB0aGUgY29tbWFuZAorI2Vsc2UKKwkJaWYgKCpwID09ICc6JykKKwkJCXArKzsJCQkJLy8gbW92ZSBwYXN0IHRoZSAnOicKKwkJY250ID0gc3RybGVuKHApOworCQlpZiAoY250IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHN0cm5jbXAocCwgInF1aXQiLCBjbnQpID09IDAKKwkJIHx8IHN0cm5jbXAocCwgInEhIiwgY250KSA9PSAwICAgLy8gZGVsZXRlIGxpbmVzCisJCSkgeworCQkJaWYgKGZpbGVfbW9kaWZpZWQgJiYgcFsxXSAhPSAnIScpIHsKKwkJCQlzdGF0dXNfbGluZV9ib2xkKCJObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoOnF1aXQhIG92ZXJyaWRlcykiKTsKKwkJCX0gZWxzZSB7CisJCQkJZWRpdGluZyA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAid3JpdGUiLCBjbnQpID09IDAKKwkJICAgICAgICB8fCBzdHJuY21wKHAsICJ3cSIsIGNudCkgPT0gMAorCQkgICAgICAgIHx8IHN0cm5jbXAocCwgInduIiwgY250KSA9PSAwCisJCSAgICAgICAgfHwgKHBbMF0gPT0gJ3gnICYmICFwWzFdKQorCQkpIHsKKwkJCWNudCA9IGZpbGVfd3JpdGUoY3VycmVudF9maWxlbmFtZSwgdGV4dCwgZW5kIC0gMSk7CisJCQlpZiAoY250IDwgMCkgeworCQkJCWlmIChjbnQgPT0gLTEpCisJCQkJCXN0YXR1c19saW5lX2JvbGQoIldyaXRlIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgeworCQkJCWZpbGVfbW9kaWZpZWQgPSAwOworCQkJCWxhc3RfZmlsZV9tb2RpZmllZCA9IC0xOworCQkJCXN0YXR1c19saW5lKCJcIiVzXCIgJWRMLCAlZEMiLCBjdXJyZW50X2ZpbGVuYW1lLCBjb3VudF9saW5lcyh0ZXh0LCBlbmQgLSAxKSwgY250KTsKKwkJCQlpZiAocFswXSA9PSAneCcgfHwgcFsxXSA9PSAncScgfHwgcFsxXSA9PSAnbicKKwkJCQkgfHwgcFswXSA9PSAnWCcgfHwgcFsxXSA9PSAnUScgfHwgcFsxXSA9PSAnTicKKwkJCQkpIHsKKwkJCQkJZWRpdGluZyA9IDA7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgImZpbGUiLCBjbnQpID09IDApIHsKKwkJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQl9IGVsc2UgaWYgKHNzY2FuZihwLCAiJWQiLCAmaikgPiAwKSB7CisJCQlkb3QgPSBmaW5kX2xpbmUoaik7CQkvLyBnbyB0byBsaW5lICMgagorCQkJZG90X3NraXBfb3Zlcl93cygpOworCQl9IGVsc2UgewkJLy8gdW5yZWNvZ25pemVkIGNtZAorCQkJbm90X2ltcGxlbWVudGVkKHApOworCQl9CisjZW5kaWYgLyogIUZFQVRVUkVfVklfQ09MT04gKi8KKwkJYnJlYWs7CisJY2FzZSAnPCc6CQkJLy8gPC0gTGVmdCAgc2hpZnQgc29tZXRoaW5nCisJY2FzZSAnPic6CQkJLy8gPi0gUmlnaHQgc2hpZnQgc29tZXRoaW5nCisJCWNudCA9IGNvdW50X2xpbmVzKHRleHQsIGRvdCk7CS8vIHJlbWVtYmVyIHdoYXQgbGluZSB3ZSBhcmUgb24KKwkJYzEgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IHRoZSB0eXBlIG9mIHRoaW5nIHRvIGRlbGV0ZQorCQlmaW5kX3JhbmdlKCZwLCAmcSwgYzEpOworCQl5YW5rX2RlbGV0ZShwLCBxLCAxLCBZQU5LT05MWSk7CS8vIHNhdmUgY29weSBiZWZvcmUgY2hhbmdlCisJCXAgPSBiZWdpbl9saW5lKHApOworCQlxID0gZW5kX2xpbmUocSk7CisJCWkgPSBjb3VudF9saW5lcyhwLCBxKTsJLy8gIyBvZiBsaW5lcyB3ZSBhcmUgc2hpZnRpbmcKKwkJZm9yICggOyBpID4gMDsgaS0tLCBwID0gbmV4dF9saW5lKHApKSB7CisJCQlpZiAoYyA9PSAnPCcpIHsKKwkJCQkvLyBzaGlmdCBsZWZ0LSByZW1vdmUgdGFiIG9yIDggc3BhY2VzCisJCQkJaWYgKCpwID09ICdcdCcpIHsKKwkJCQkJLy8gc2hyaW5rIGJ1ZmZlciAxIGNoYXIKKwkJCQkJdGV4dF9ob2xlX2RlbGV0ZShwLCBwKTsKKwkJCQl9IGVsc2UgaWYgKCpwID09ICcgJykgeworCQkJCQkvLyB3ZSBzaG91bGQgYmUgY2FsY3VsYXRpbmcgY29sdW1ucywgbm90IGp1c3QgU1BBQ0UKKwkJCQkJZm9yIChqID0gMDsgKnAgPT0gJyAnICYmIGogPCB0YWJzdG9wOyBqKyspIHsKKwkJCQkJCXRleHRfaG9sZV9kZWxldGUocCwgcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKGMgPT0gJz4nKSB7CisJCQkJLy8gc2hpZnQgcmlnaHQgLS0gYWRkIHRhYiBvciA4IHNwYWNlcworCQkJCWNoYXJfaW5zZXJ0KHAsICdcdCcpOworCQkJfQorCQl9CisJCWRvdCA9IGZpbmRfbGluZShjbnQpOwkvLyB3aGF0IGxpbmUgd2VyZSB3ZSBvbgorCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ0EnOgkJCS8vIEEtIGFwcGVuZCBhdCBlLW8tbAorCQlkb3RfZW5kKCk7CQkvLyBnbyB0byBlLW8tbAorCQkvLyoqKiogZmFsbCB0aHJvdWdoIHRvIC4uLiAnYScKKwljYXNlICdhJzoJCQkvLyBhLSBhcHBlbmQgYWZ0ZXIgY3VycmVudCBjaGFyCisJCWlmICgqZG90ICE9ICdcbicpCisJCQlkb3QrKzsKKwkJZ290byBkY19pOworCQlicmVhazsKKwljYXNlICdCJzoJCQkvLyBCLSBiYWNrIGEgYmxhbmstZGVsaW1pdGVkIFdvcmQKKwljYXNlICdFJzoJCQkvLyBFLSBlbmQgb2YgYSBibGFuay1kZWxpbWl0ZWQgd29yZAorCWNhc2UgJ1cnOgkJCS8vIFctIGZvcndhcmQgYSBibGFuay1kZWxpbWl0ZWQgd29yZAorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZGlyID0gRk9SV0FSRDsKKwkJaWYgKGMgPT0gJ0InKQorCQkJZGlyID0gQkFDSzsKKwkJaWYgKGMgPT0gJ1cnIHx8IGlzc3BhY2UoZG90W2Rpcl0pKSB7CisJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgZGlyLCBTX1RPX1dTKTsKKwkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAyLCBkaXIsIFNfT1ZFUl9XUyk7CisJCX0KKwkJaWYgKGMgIT0gJ1cnKQorCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDEsIGRpciwgU19CRUZPUkVfV1MpOworCQlicmVhazsKKwljYXNlICdDJzoJCQkvLyBDLSBDaGFuZ2UgdG8gZS1vLWwKKwljYXNlICdEJzoJCQkvLyBELSBkZWxldGUgdG8gZS1vLWwKKwkJc2F2ZV9kb3QgPSBkb3Q7CisJCWRvdCA9IGRvbGxhcl9saW5lKGRvdCk7CS8vIG1vdmUgdG8gYmVmb3JlIE5MCisJCS8vIGNvcHkgdGV4dCBpbnRvIGEgcmVnaXN0ZXIgYW5kIGRlbGV0ZQorCQlkb3QgPSB5YW5rX2RlbGV0ZShzYXZlX2RvdCwgZG90LCAwLCBZQU5LREVMKTsJLy8gZGVsZXRlIHRvIGUtby1sCisJCWlmIChjID09ICdDJykKKwkJCWdvdG8gZGNfaTsJLy8gc3RhcnQgaW5zZXJ0aW5nCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCQlpZiAoYyA9PSAnRCcpCisJCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorI2VuZGlmCisJCWJyZWFrOworCWNhc2UgJ2cnOiAvLyAnZ2cnIGdvdG8gYSBsaW5lIG51bWJlciAodmltKSAoZGVmYXVsdDogdmVyeSBmaXJzdCBsaW5lKQorCQljMSA9IGdldF9vbmVfY2hhcigpOworCQlpZiAoYzEgIT0gJ2cnKSB7CisJCQlidWZbMF0gPSAnZyc7CisJCQlidWZbMV0gPSBjMTsgLy8gVE9ETzogaWYgVW5pY29kZT8KKwkJCWJ1ZlsyXSA9ICdcMCc7CisJCQlub3RfaW1wbGVtZW50ZWQoYnVmKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjbWRjbnQgPT0gMCkKKwkJCWNtZGNudCA9IDE7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgJ0cnOgkJLy8gRy0gZ290byB0byBhIGxpbmUgbnVtYmVyIChkZWZhdWx0PSBFLU8tRikKKwkJZG90ID0gZW5kIC0gMTsJCQkJLy8gYXNzdW1lIEUtTy1GCisJCWlmIChjbWRjbnQgPiAwKSB7CisJCQlkb3QgPSBmaW5kX2xpbmUoY21kY250KTsJLy8gd2hhdCBsaW5lIGlzICNjbWRjbnQKKwkJfQorCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCWJyZWFrOworCWNhc2UgJ0gnOgkJCS8vIEgtIGdvdG8gdG9wIGxpbmUgb24gc2NyZWVuCisJCWRvdCA9IHNjcmVlbmJlZ2luOworCQlpZiAoY21kY250ID4gKHJvd3MgLSAxKSkgeworCQkJY21kY250ID0gKHJvd3MgLSAxKTsKKwkJfQorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoJysnKTsKKwkJfQorCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCWJyZWFrOworCWNhc2UgJ0knOgkJCS8vIEktIGluc2VydCBiZWZvcmUgZmlyc3Qgbm9uLWJsYW5rCisJCWRvdF9iZWdpbigpOwkvLyAwCisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJLy8qKioqIGZhbGwgdGhyb3VnaCB0byAuLi4gJ2knCisJY2FzZSAnaSc6CQkJLy8gaS0gaW5zZXJ0IGJlZm9yZSBjdXJyZW50IGNoYXIKKwljYXNlIEtFWUNPREVfSU5TRVJUOgkvLyBDdXJzb3IgS2V5IEluc2VydAorIGRjX2k6CisJCWNtZF9tb2RlID0gMTsJLy8gc3RhcnQgaW5zcnRpbmcKKwkJYnJlYWs7CisJY2FzZSAnSic6CQkJLy8gSi0gam9pbiBjdXJyZW50IGFuZCBuZXh0IGxpbmVzIHRvZ2V0aGVyCisJCWlmICgtLWNtZGNudCA+IDEpIHsKKwkJCWRvX2NtZChjKTsKKwkJfQorCQlkb3RfZW5kKCk7CQkvLyBtb3ZlIHRvIE5MCisJCWlmIChkb3QgPCBlbmQgLSAxKSB7CS8vIG1ha2Ugc3VyZSBub3QgbGFzdCBjaGFyIGluIHRleHRbXQorCQkJKmRvdCsrID0gJyAnOwkvLyByZXBsYWNlIE5MIHdpdGggc3BhY2UKKwkJCWZpbGVfbW9kaWZpZWQrKzsKKwkJCXdoaWxlIChpc2JsYW5rKCpkb3QpKSB7CS8vIGRlbGV0ZSBsZWFkaW5nIFdTCisJCQkJZG90X2RlbGV0ZSgpOworCQkJfQorCQl9CisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ0wnOgkJCS8vIEwtIGdvdG8gYm90dG9tIGxpbmUgb24gc2NyZWVuCisJCWRvdCA9IGVuZF9zY3JlZW4oKTsKKwkJaWYgKGNtZGNudCA+IChyb3dzIC0gMSkpIHsKKwkJCWNtZGNudCA9IChyb3dzIC0gMSk7CisJCX0KKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKCctJyk7CisJCX0KKwkJZG90X2JlZ2luKCk7CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CQkJLy8gTS0gZ290byBtaWRkbGUgbGluZSBvbiBzY3JlZW4KKwkJZG90ID0gc2NyZWVuYmVnaW47CisJCWZvciAoY250ID0gMDsgY250IDwgKHJvd3MtMSkgLyAyOyBjbnQrKykKKwkJCWRvdCA9IG5leHRfbGluZShkb3QpOworCQlicmVhazsKKwljYXNlICdPJzoJCQkvLyBPLSBvcGVuIGEgZW1wdHkgbGluZSBhYm92ZQorCQkvLyAgICAwaVxuIEVTQyAtaQorCQlwID0gYmVnaW5fbGluZShkb3QpOworCQlpZiAocFstMV0gPT0gJ1xuJykgeworCQkJZG90X3ByZXYoKTsKKwljYXNlICdvJzoJCQkvLyBvLSBvcGVuIGEgZW1wdHkgbGluZSBiZWxvdzsgWWVzLCBJIGtub3cgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgImlmICguLi4iCisJCQlkb3RfZW5kKCk7CisJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsICdcbicpOworCQl9IGVsc2UgeworCQkJZG90X2JlZ2luKCk7CS8vIDAKKwkJCWRvdCA9IGNoYXJfaW5zZXJ0KGRvdCwgJ1xuJyk7CS8vIGlcbiBFU0MKKwkJCWRvdF9wcmV2KCk7CS8vIC0KKwkJfQorCQlnb3RvIGRjX2k7CisJCWJyZWFrOworCWNhc2UgJ1InOgkJCS8vIFItIGNvbnRpbnVvdXMgUmVwbGFjZSBjaGFyCisgZGM1OgorCQljbWRfbW9kZSA9IDI7CisJCWJyZWFrOworCWNhc2UgS0VZQ09ERV9ERUxFVEU6CisJCWMgPSAneCc7CisJCS8vIGZhbGwgdGhyb3VnaAorCWNhc2UgJ1gnOgkJCS8vIFgtIGRlbGV0ZSBjaGFyIGJlZm9yZSBkb3QKKwljYXNlICd4JzoJCQkvLyB4LSBkZWxldGUgdGhlIGN1cnJlbnQgY2hhcgorCWNhc2UgJ3MnOgkJCS8vIHMtIHN1YnN0aXR1dGUgdGhlIGN1cnJlbnQgY2hhcgorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZGlyID0gMDsKKwkJaWYgKGMgPT0gJ1gnKQorCQkJZGlyID0gLTE7CisJCWlmIChkb3RbZGlyXSAhPSAnXG4nKSB7CisJCQlpZiAoYyA9PSAnWCcpCisJCQkJZG90LS07CS8vIGRlbGV0ZSBwcmV2IGNoYXIKKwkJCWRvdCA9IHlhbmtfZGVsZXRlKGRvdCwgZG90LCAwLCBZQU5LREVMKTsJLy8gZGVsZXRlIGNoYXIKKwkJfQorCQlpZiAoYyA9PSAncycpCisJCQlnb3RvIGRjX2k7CS8vIHN0YXJ0IGluc3J0aW5nCisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ1onOgkJCS8vIFotIGlmIG1vZGlmaWVkLCB7d3JpdGV9OyBleGl0CisJCS8vIFpaIG1lYW5zIHRvIHNhdmUgZmlsZSAoaWYgbmVjZXNzYXJ5KSwgdGhlbiBleGl0CisJCWMxID0gZ2V0X29uZV9jaGFyKCk7CisJCWlmIChjMSAhPSAnWicpIHsKKwkJCWluZGljYXRlX2Vycm9yKGMpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZpbGVfbW9kaWZpZWQpIHsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWSAmJiByZWFkb25seV9tb2RlKSB7CisJCQkJc3RhdHVzX2xpbmVfYm9sZCgiXCIlc1wiIEZpbGUgaXMgcmVhZCBvbmx5IiwgY3VycmVudF9maWxlbmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljbnQgPSBmaWxlX3dyaXRlKGN1cnJlbnRfZmlsZW5hbWUsIHRleHQsIGVuZCAtIDEpOworCQkJaWYgKGNudCA8IDApIHsKKwkJCQlpZiAoY250ID09IC0xKQorCQkJCQlzdGF0dXNfbGluZV9ib2xkKCJXcml0ZSBlcnJvcjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIGlmIChjbnQgPT0gKGVuZCAtIDEgLSB0ZXh0ICsgMSkpIHsKKwkJCQllZGl0aW5nID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVkaXRpbmcgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgJ14nOgkJCS8vIF4tIG1vdmUgdG8gZmlyc3Qgbm9uLWJsYW5rIG9uIGxpbmUKKwkJZG90X2JlZ2luKCk7CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnYic6CQkJLy8gYi0gYmFjayBhIHdvcmQKKwljYXNlICdlJzoJCQkvLyBlLSBlbmQgb2Ygd29yZAorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZGlyID0gRk9SV0FSRDsKKwkJaWYgKGMgPT0gJ2InKQorCQkJZGlyID0gQkFDSzsKKwkJaWYgKChkb3QgKyBkaXIpIDwgdGV4dCB8fCAoZG90ICsgZGlyKSA+IGVuZCAtIDEpCisJCQlicmVhazsKKwkJZG90ICs9IGRpcjsKKwkJaWYgKGlzc3BhY2UoKmRvdCkpIHsKKwkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAoYyA9PSAnZScpID8gMiA6IDEsIGRpciwgU19PVkVSX1dTKTsKKwkJfQorCQlpZiAoaXNhbG51bSgqZG90KSB8fCAqZG90ID09ICdfJykgeworCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDEsIGRpciwgU19FTkRfQUxOVU0pOworCQl9IGVsc2UgaWYgKGlzcHVuY3QoKmRvdCkpIHsKKwkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAxLCBkaXIsIFNfRU5EX1BVTkNUKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdjJzoJCQkvLyBjLSBjaGFuZ2Ugc29tZXRoaW5nCisJY2FzZSAnZCc6CQkJLy8gZC0gZGVsZXRlIHNvbWV0aGluZworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJY2FzZSAneSc6CQkJLy8geS0geWFuayAgIHNvbWV0aGluZworCWNhc2UgJ1knOgkJCS8vIFktIFlhbmsgYSBsaW5lCisjZW5kaWYKKwl7CisJCWludCB5ZiwgbWwsIHdob2xlID0gMDsKKwkJeWYgPSBZQU5LREVMOwkvLyBhc3N1bWUgZWl0aGVyICJjIiBvciAiZCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCQlpZiAoYyA9PSAneScgfHwgYyA9PSAnWScpCisJCQl5ZiA9IFlBTktPTkxZOworI2VuZGlmCisJCWMxID0gJ3knOworCQlpZiAoYyAhPSAnWScpCisJCQljMSA9IGdldF9vbmVfY2hhcigpOwkvLyBnZXQgdGhlIHR5cGUgb2YgdGhpbmcgdG8gZGVsZXRlCisJCS8vIGRldGVybWluZSByYW5nZSwgYW5kIHdoZXRoZXIgaXQgc3BhbnMgbGluZXMKKwkJbWwgPSBmaW5kX3JhbmdlKCZwLCAmcSwgYzEpOworCQlpZiAoYzEgPT0gMjcpIHsJLy8gRVNDLSB1c2VyIGNoYW5nZWQgbWluZCBhbmQgd2FudHMgb3V0CisJCQljID0gYzEgPSAyNzsJLy8gRXNjYXBlLSBkbyBub3RoaW5nCisJCX0gZWxzZSBpZiAoc3RyY2hyKCJ3VyIsIGMxKSkgeworCQkJaWYgKGMgPT0gJ2MnKSB7CisJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0cmFpbGluZyBXUyBhcyBwYXJ0IG9mIHdvcmQKKwkJCQl3aGlsZSAoaXNibGFuaygqcSkpIHsKKwkJCQkJaWYgKHEgPD0gdGV4dCB8fCBxWy0xXSA9PSAnXG4nKQorCQkJCQkJYnJlYWs7CisJCQkJCXEtLTsKKwkJCQl9CisJCQl9CisJCQlkb3QgPSB5YW5rX2RlbGV0ZShwLCBxLCBtbCwgeWYpOwkvLyBkZWxldGUgd29yZAorCQl9IGVsc2UgaWYgKHN0cmNocigiXjBiQmVFZnQlJCBsaFxiXDE3NyIsIGMxKSkgeworCQkJLy8gcGFydGlhbCBsaW5lIGNvcHkgdGV4dCBpbnRvIGEgcmVnaXN0ZXIgYW5kIGRlbGV0ZQorCQkJZG90ID0geWFua19kZWxldGUocCwgcSwgbWwsIHlmKTsJLy8gZGVsZXRlIHdvcmQKKwkJfSBlbHNlIGlmIChzdHJjaHIoImNkeWtqSEwrLXt9XHJcbiIsIGMxKSkgeworCQkJLy8gd2hvbGUgbGluZSBjb3B5IHRleHQgaW50byBhIHJlZ2lzdGVyIGFuZCBkZWxldGUKKwkJCWRvdCA9IHlhbmtfZGVsZXRlKHAsIHEsIG1sLCB5Zik7CS8vIGRlbGV0ZSBsaW5lcworCQkJd2hvbGUgPSAxOworCQl9IGVsc2UgeworCQkJLy8gY291bGQgbm90IHJlY29nbml6ZSBvYmplY3QKKwkJCWMgPSBjMSA9IDI3OwkvLyBlcnJvci0KKwkJCW1sID0gMDsKKwkJCWluZGljYXRlX2Vycm9yKGMpOworCQl9CisJCWlmIChtbCAmJiB3aG9sZSkgeworCQkJaWYgKGMgPT0gJ2MnKSB7CisJCQkJZG90ID0gY2hhcl9pbnNlcnQoZG90LCAnXG4nKTsKKwkJCQkvLyBvbiB0aGUgbGFzdCBsaW5lIG9mIGZpbGUgZG9uJ3QgbW92ZSB0byBwcmV2IGxpbmUKKwkJCQlpZiAod2hvbGUgJiYgZG90ICE9IChlbmQtMSkpIHsKKwkJCQkJZG90X3ByZXYoKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGMgPT0gJ2QnKSB7CisJCQkJZG90X2JlZ2luKCk7CisJCQkJZG90X3NraXBfb3Zlcl93cygpOworCQkJfQorCQl9CisJCWlmIChjMSAhPSAyNykgeworCQkJLy8gaWYgQ0hBTkdJTkcsIG5vdCBkZWxldGluZywgc3RhcnQgaW5zZXJ0aW5nIGFmdGVyIHRoZSBkZWxldGUKKwkJCWlmIChjID09ICdjJykgeworCQkJCXN0cmNweShidWYsICJDaGFuZ2UiKTsKKwkJCQlnb3RvIGRjX2k7CS8vIHN0YXJ0IGluc2VydGluZworCQkJfQorCQkJaWYgKGMgPT0gJ2QnKSB7CisJCQkJc3RyY3B5KGJ1ZiwgIkRlbGV0ZSIpOworCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJCQlpZiAoYyA9PSAneScgfHwgYyA9PSAnWScpIHsKKwkJCQlzdHJjcHkoYnVmLCAiWWFuayIpOworCQkJfQorCQkJcCA9IHJlZ1tZRHJlZ107CisJCQlxID0gcCArIHN0cmxlbihwKTsKKwkJCWZvciAoY250ID0gMDsgcCA8PSBxOyBwKyspIHsKKwkJCQlpZiAoKnAgPT0gJ1xuJykKKwkJCQkJY250Kys7CisJCQl9CisJCQlzdGF0dXNfbGluZSgiJXMgJWQgbGluZXMgKCVkIGNoYXJzKSB1c2luZyBbJWNdIiwKKwkJCQlidWYsIGNudCwgc3RybGVuKHJlZ1tZRHJlZ10pLCB3aGF0X3JlZygpKTsKKyNlbmRpZgorCQkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSAnayc6CQkJLy8gay0gZ290byBwcmV2IGxpbmUsIHNhbWUgY29sCisJY2FzZSBLRVlDT0RFX1VQOgkJLy8gY3Vyc29yIGtleSBVcAorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJZG90X3ByZXYoKTsKKwkJZG90ID0gbW92ZV90b19jb2woZG90LCBjY29sICsgb2Zmc2V0KTsJLy8gdHJ5IHN0YXkgaW4gc2FtZSBjb2wKKwkJYnJlYWs7CisJY2FzZSAncic6CQkJLy8gci0gcmVwbGFjZSB0aGUgY3VycmVudCBjaGFyIHdpdGggdXNlciBpbnB1dAorCQljMSA9IGdldF9vbmVfY2hhcigpOwkvLyBnZXQgdGhlIHJlcGxhY2VtZW50IGNoYXIKKwkJaWYgKCpkb3QgIT0gJ1xuJykgeworCQkJKmRvdCA9IGMxOworCQkJZmlsZV9tb2RpZmllZCsrOworCQl9CisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ3QnOgkJCS8vIHQtIG1vdmUgdG8gY2hhciBwcmlvciB0byBuZXh0IHgKKwkJbGFzdF9mb3J3YXJkX2NoYXIgPSBnZXRfb25lX2NoYXIoKTsKKwkJZG9fY21kKCc7Jyk7CisJCWlmICgqZG90ID09IGxhc3RfZm9yd2FyZF9jaGFyKQorCQkJZG90X2xlZnQoKTsKKwkJbGFzdF9mb3J3YXJkX2NoYXIgPSAwOworCQlicmVhazsKKwljYXNlICd3JzoJCQkvLyB3LSBmb3J3YXJkIGEgd29yZAorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJaWYgKGlzYWxudW0oKmRvdCkgfHwgKmRvdCA9PSAnXycpIHsJLy8gd2UgYXJlIG9uIEFMTlVNCisJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgRk9SV0FSRCwgU19FTkRfQUxOVU0pOworCQl9IGVsc2UgaWYgKGlzcHVuY3QoKmRvdCkpIHsJLy8gd2UgYXJlIG9uIFBVTkNUCisJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgRk9SV0FSRCwgU19FTkRfUFVOQ1QpOworCQl9CisJCWlmIChkb3QgPCBlbmQgLSAxKQorCQkJZG90Kys7CQkvLyBtb3ZlIG92ZXIgd29yZAorCQlpZiAoaXNzcGFjZSgqZG90KSkgeworCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDIsIEZPUldBUkQsIFNfT1ZFUl9XUyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAneic6CQkJLy8gei0KKwkJYzEgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IHRoZSByZXBsYWNlbWVudCBjaGFyCisJCWNudCA9IDA7CisJCWlmIChjMSA9PSAnLicpCisJCQljbnQgPSAocm93cyAtIDIpIC8gMjsJLy8gcHV0IGRvdCBhdCBjZW50ZXIKKwkJaWYgKGMxID09ICctJykKKwkJCWNudCA9IHJvd3MgLSAyOwkvLyBwdXQgZG90IGF0IGJvdHRvbQorCQlzY3JlZW5iZWdpbiA9IGJlZ2luX2xpbmUoZG90KTsJLy8gc3RhcnQgZG90IGF0IHRvcAorCQlkb3Rfc2Nyb2xsKGNudCwgLTEpOworCQlicmVhazsKKwljYXNlICd8JzoJCQkvLyB8LSBtb3ZlIHRvIGNvbHVtbiAiY21kY250IgorCQlkb3QgPSBtb3ZlX3RvX2NvbChkb3QsIGNtZGNudCAtIDEpOwkvLyB0cnkgdG8gbW92ZSB0byBjb2x1bW4KKwkJYnJlYWs7CisJY2FzZSAnfic6CQkJLy8gfi0gZmxpcCB0aGUgY2FzZSBvZiBsZXR0ZXJzICAgYS16IC0+IEEtWgorCQlpZiAoLS1jbWRjbnQgPiAwKSB7CisJCQlkb19jbWQoYyk7CisJCX0KKwkJaWYgKGlzbG93ZXIoKmRvdCkpIHsKKwkJCSpkb3QgPSB0b3VwcGVyKCpkb3QpOworCQkJZmlsZV9tb2RpZmllZCsrOworCQl9IGVsc2UgaWYgKGlzdXBwZXIoKmRvdCkpIHsKKwkJCSpkb3QgPSB0b2xvd2VyKCpkb3QpOworCQkJZmlsZV9tb2RpZmllZCsrOworCQl9CisJCWRvdF9yaWdodCgpOworCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQlicmVhazsKKwkJLy8tLS0tLSBUaGUgQ3Vyc29yIGFuZCBGdW5jdGlvbiBLZXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBLRVlDT0RFX0hPTUU6CS8vIEN1cnNvciBLZXkgSG9tZQorCQlkb3RfYmVnaW4oKTsKKwkJYnJlYWs7CisJCS8vIFRoZSBGbiBrZXlzIGNvdWxkIHBvaW50IHRvIGRvX21hY3JvIHdoaWNoIGNvdWxkIHRyYW5zbGF0ZSB0aGVtCisjaWYgMAorCWNhc2UgS0VZQ09ERV9GVU4xOgkvLyBGdW5jdGlvbiBLZXkgRjEKKwljYXNlIEtFWUNPREVfRlVOMjoJLy8gRnVuY3Rpb24gS2V5IEYyCisJY2FzZSBLRVlDT0RFX0ZVTjM6CS8vIEZ1bmN0aW9uIEtleSBGMworCWNhc2UgS0VZQ09ERV9GVU40OgkvLyBGdW5jdGlvbiBLZXkgRjQKKwljYXNlIEtFWUNPREVfRlVONToJLy8gRnVuY3Rpb24gS2V5IEY1CisJY2FzZSBLRVlDT0RFX0ZVTjY6CS8vIEZ1bmN0aW9uIEtleSBGNgorCWNhc2UgS0VZQ09ERV9GVU43OgkvLyBGdW5jdGlvbiBLZXkgRjcKKwljYXNlIEtFWUNPREVfRlVOODoJLy8gRnVuY3Rpb24gS2V5IEY4CisJY2FzZSBLRVlDT0RFX0ZVTjk6CS8vIEZ1bmN0aW9uIEtleSBGOQorCWNhc2UgS0VZQ09ERV9GVU4xMDoJLy8gRnVuY3Rpb24gS2V5IEYxMAorCWNhc2UgS0VZQ09ERV9GVU4xMToJLy8gRnVuY3Rpb24gS2V5IEYxMQorCWNhc2UgS0VZQ09ERV9GVU4xMjoJLy8gRnVuY3Rpb24gS2V5IEYxMgorCQlicmVhazsKKyNlbmRpZgorCX0KKworIGRjMToKKwkvLyBpZiB0ZXh0W10ganVzdCBiZWNhbWUgZW1wdHksIGFkZCBiYWNrIGFuIGVtcHR5IGxpbmUKKwlpZiAoZW5kID09IHRleHQpIHsKKwkJY2hhcl9pbnNlcnQodGV4dCwgJ1xuJyk7CS8vIHN0YXJ0IGVtcHR5IGJ1ZiB3aXRoIGR1bW15IGxpbmUKKwkJZG90ID0gdGV4dDsKKwl9CisJLy8gaXQgaXMgT0sgZm9yIGRvdCB0byBleGFjdGx5IGVxdWFsIHRvIGVuZCwgb3RoZXJ3aXNlIGNoZWNrIGRvdCB2YWxpZGl0eQorCWlmIChkb3QgIT0gZW5kKSB7CisJCWRvdCA9IGJvdW5kX2RvdChkb3QpOwkvLyBtYWtlIHN1cmUgImRvdCIgaXMgdmFsaWQKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwljaGVja19jb250ZXh0KGMpOwkvLyB1cGRhdGUgdGhlIGN1cnJlbnQgY29udGV4dAorI2VuZGlmCisKKwlpZiAoIWlzZGlnaXQoYykpCisJCWNtZGNudCA9IDA7CQkvLyBjbWQgd2FzIG5vdCBhIG51bWJlciwgcmVzZXQgY21kY250CisJY250ID0gZG90IC0gYmVnaW5fbGluZShkb3QpOworCS8vIFRyeSB0byBzdGF5IG9mZiBvZiB0aGUgTmV3bGluZQorCWlmICgqZG90ID09ICdcbicgJiYgY250ID4gMCAmJiBjbWRfbW9kZSA9PSAwKQorCQlkb3QtLTsKK30KKworLyogTkIhICB0aGUgQ1JBU0hNRSBjb2RlIGlzIHVubWFpbnRhaW5lZCwgYW5kIGRvZXNuJ3QgY3VycmVudGx5IGJ1aWxkICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorc3RhdGljIGludCB0b3RhbGNtZHMgPSAwOworc3RhdGljIGludCBNcCA9IDg1OyAgICAgICAgICAgICAvLyBNb3ZlbWVudCBjb21tYW5kIFByb2JhYmlsaXR5CitzdGF0aWMgaW50IE5wID0gOTA7ICAgICAgICAgICAgIC8vIE5vbi1tb3ZlbWVudCBjb21tYW5kIFByb2JhYmlsaXR5CitzdGF0aWMgaW50IERwID0gOTY7ICAgICAgICAgICAgIC8vIERlbGV0ZSBjb21tYW5kIFByb2JhYmlsaXR5CitzdGF0aWMgaW50IElwID0gOTc7ICAgICAgICAgICAgIC8vIEluc2VydCBjb21tYW5kIFByb2JhYmlsaXR5CitzdGF0aWMgaW50IFlwID0gOTg7ICAgICAgICAgICAgIC8vIFlhbmsgY29tbWFuZCBQcm9iYWJpbGl0eQorc3RhdGljIGludCBQcCA9IDk5OyAgICAgICAgICAgICAvLyBQdXQgY29tbWFuZCBQcm9iYWJpbGl0eQorc3RhdGljIGludCBNID0gMCwgTiA9IDAsIEkgPSAwLCBEID0gMCwgWSA9IDAsIFAgPSAwLCBVID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyIGNoYXJzWzIwXSA9ICJcdDAxMjM0NSBhYmNkQUJDRC09LiQiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHdvcmRzWzIwXSA9IHsKKwkidGhpcyIsICJpcyIsICJhIiwgInRlc3QiLAorCSJicm9hZGNhc3QiLCAidGhlIiwgImVtZXJnZW5jeSIsICJvZiIsCisJInN5c3RlbSIsICJxdWljayIsICJicm93biIsICJmb3giLAorCSJqdW1wZWQiLCAib3ZlciIsICJsYXp5IiwgImRvZ3MiLAorCSJiYWNrIiwgIkphbnVhcnkiLCAiRmVidWFyeSIsICJNYXJjaCIKK307CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbGluZXNbMjBdID0geworCSJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIiwKKwkiY2hhciBjLCBjbSwgKmNtZCwgKmNtZDE7XG4iLAorCSJnZW5lcmF0ZSBhIGNvbW1hbmQgYnkgcGVyY2VudGFnZXNcbiIsCisJIk51bWJlcnMgbWF5IGJlIHR5cGVkIGFzIGEgcHJlZml4IHRvIHNvbWUgY29tbWFuZHMuXG4iLAorCSJRdWl0LCBkaXNjYXJkaW5nIGNoYW5nZXMhXG4iLAorCSJGb3JjZWQgd3JpdGUsIGlmIHBlcm1pc3Npb24gb3JpZ2luYWxseSBub3QgdmFsaWQuXG4iLAorCSJJbiBnZW5lcmFsLCBhbnkgZXggb3IgZWQgY29tbWFuZCAoc3VjaCBhcyBzdWJzdGl0dXRlIG9yIGRlbGV0ZSkuXG4iLAorCSJJIGhhdmUgdGlja2V0cyBhdmFpbGFibGUgZm9yIHRoZSBCbGF6ZXJzIHZzIExBIENsaXBwZXJzIGZvciBNb25kYXksIEphbnVyYXJ5IDEgYXQgMTowMHBtLlxuIiwKKwkiUGxlYXNlIGdldCB3LyBtZSBhbmQgSSB3aWxsIGdvIG92ZXIgaXQgd2l0aCB5b3UuXG4iLAorCSJUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzY2hlZHVsZWQsIGNvbW1pdHRlZCBjaGFuZ2VzLlxuIiwKKwkiMS4gICBMYXVuY2ggTm9ydG9uIEFudGl2aXJ1cyAoU3RhcnQsIFByb2dyYW1zLCBOb3J0b24gQW50aXZpcnVzKVxuIiwKKwkiUmVtaW5kZXIuLi4uVG93biBNZWV0aW5nIGluIENlbnRyYWwgUGVyayBjYWZlIHRvZGF5IGF0IDM6MDBwbS5cbiIsCisJIkFueSBxdWVzdGlvbiBhYm91dCB0cmFuc2FjdGlvbnMgcGxlYXNlIGNvbnRhY3QgU3RlcmxpbmcgSHV4bGV5LlxuIiwKKwkiSSB3aWxsIHRyeSB0byBnZXQgYmFjayB0byB5b3UgYnkgRnJpZGF5LCBEZWNlbWJlciAzMS5cbiIsCisJIlRoaXMgQ2hhbmdlIHdpbGwgYmUgaW1wbGVtZW50ZWQgb24gRnJpZGF5LlxuIiwKKwkiTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgcHJvYmxlbXMgYWNjZXNzaW5nIHRoaXM7XG4iLAorCSJTdGVybGluZyBIdXhsZXkgcmVjZW50bHkgYWRkZWQgeW91IHRvIHRoZSBhY2Nlc3MgbGlzdC5cbiIsCisJIldvdWxkIHlvdSBsaWtlIHRvIGdvIHRvIGx1bmNoP1xuIiwKKwkiVGhlIGxhc3QgY29tbWFuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcnVuLlxuIiwKKwkiVGhpcyBpcyB0b28gbXVjaCBlbmdsaXNoIGZvciBhIGNvbXB1dGVyIGdlZWsuXG4iLAorfTsKK3N0YXRpYyBjaGFyICptdWx0aWxpbmVzWzIwXSA9IHsKKwkiWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiIsCisJImNoYXIgYywgY20sICpjbWQsICpjbWQxO1xuIiwKKwkiZ2VuZXJhdGUgYSBjb21tYW5kIGJ5IHBlcmNlbnRhZ2VzXG4iLAorCSJOdW1iZXJzIG1heSBiZSB0eXBlZCBhcyBhIHByZWZpeCB0byBzb21lIGNvbW1hbmRzLlxuIiwKKwkiUXVpdCwgZGlzY2FyZGluZyBjaGFuZ2VzIVxuIiwKKwkiRm9yY2VkIHdyaXRlLCBpZiBwZXJtaXNzaW9uIG9yaWdpbmFsbHkgbm90IHZhbGlkLlxuIiwKKwkiSW4gZ2VuZXJhbCwgYW55IGV4IG9yIGVkIGNvbW1hbmQgKHN1Y2ggYXMgc3Vic3RpdHV0ZSBvciBkZWxldGUpLlxuIiwKKwkiSSBoYXZlIHRpY2tldHMgYXZhaWxhYmxlIGZvciB0aGUgQmxhemVycyB2cyBMQSBDbGlwcGVycyBmb3IgTW9uZGF5LCBKYW51cmFyeSAxIGF0IDE6MDBwbS5cbiIsCisJIlBsZWFzZSBnZXQgdy8gbWUgYW5kIEkgd2lsbCBnbyBvdmVyIGl0IHdpdGggeW91LlxuIiwKKwkiVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2Ygc2NoZWR1bGVkLCBjb21taXR0ZWQgY2hhbmdlcy5cbiIsCisJIjEuICAgTGF1bmNoIE5vcnRvbiBBbnRpdmlydXMgKFN0YXJ0LCBQcm9ncmFtcywgTm9ydG9uIEFudGl2aXJ1cylcbiIsCisJIlJlbWluZGVyLi4uLlRvd24gTWVldGluZyBpbiBDZW50cmFsIFBlcmsgY2FmZSB0b2RheSBhdCAzOjAwcG0uXG4iLAorCSJBbnkgcXVlc3Rpb24gYWJvdXQgdHJhbnNhY3Rpb25zIHBsZWFzZSBjb250YWN0IFN0ZXJsaW5nIEh1eGxleS5cbiIsCisJIkkgd2lsbCB0cnkgdG8gZ2V0IGJhY2sgdG8geW91IGJ5IEZyaWRheSwgRGVjZW1iZXIgMzEuXG4iLAorCSJUaGlzIENoYW5nZSB3aWxsIGJlIGltcGxlbWVudGVkIG9uIEZyaWRheS5cbiIsCisJIkxldCBtZSBrbm93IGlmIHlvdSBoYXZlIHByb2JsZW1zIGFjY2Vzc2luZyB0aGlzO1xuIiwKKwkiU3RlcmxpbmcgSHV4bGV5IHJlY2VudGx5IGFkZGVkIHlvdSB0byB0aGUgYWNjZXNzIGxpc3QuXG4iLAorCSJXb3VsZCB5b3UgbGlrZSB0byBnbyB0byBsdW5jaD9cbiIsCisJIlRoZSBsYXN0IGNvbW1hbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJ1bi5cbiIsCisJIlRoaXMgaXMgdG9vIG11Y2ggZW5nbGlzaCBmb3IgYSBjb21wdXRlciBnZWVrLlxuIiwKK307CisKKy8vIGNyZWF0ZSBhIHJhbmRvbSBjb21tYW5kIHRvIGV4ZWN1dGUKK3N0YXRpYyB2b2lkIGNyYXNoX2R1bW15KCkKK3sKKwlzdGF0aWMgaW50IHNsZWVwdGltZTsgICAvLyBob3cgbG9uZyB0byBwYXVzZSBiZXR3ZWVuIGNvbW1hbmRzCisJY2hhciBjLCBjbSwgKmNtZCwgKmNtZDE7CisJaW50IGksIGNudCwgdGhpbmcsIHJiaSwgc3RhcnRyYmksIHBlcmNlbnQ7CisKKwkvLyAiZG90IiBtb3ZlbWVudCBjb21tYW5kcworCWNtZDEgPSAiIFxuXHJcMDAyXDAwNFwwMDVcMDA2XDAyNVwwMzEwXiQtK3dXZUViQmhqa2xITCI7CisKKwkvLyBpcyB0aGVyZSBhbHJlYWR5IGEgY29tbWFuZCBydW5uaW5nPworCWlmIChyZWFkYnVmZmVyWzBdID4gMCkKKwkJZ290byBjZDE7CisgY2QwOgorCXJlYWRidWZmZXJbMF0gPSAnWCc7CisJc3RhcnRyYmkgPSByYmkgPSAxOworCXNsZWVwdGltZSA9IDA7ICAgICAgICAgIC8vIGhvdyBsb25nIHRvIHBhdXNlIGJldHdlZW4gY29tbWFuZHMKKwltZW1zZXQocmVhZGJ1ZmZlciwgJ1wwJywgc2l6ZW9mKHJlYWRidWZmZXIpKTsKKwkvLyBnZW5lcmF0ZSBhIGNvbW1hbmQgYnkgcGVyY2VudGFnZXMKKwlwZXJjZW50ID0gKGludCkgbHJhbmQ0OCgpICUgMTAwOyAgICAgICAgLy8gZ2V0IGEgbnVtYmVyIGZyb20gMC05OQorCWlmIChwZXJjZW50IDwgTXApIHsgICAgIC8vICBNb3ZlbWVudCBjb21tYW5kcworCQkvLyBhdmFpbGFibGUgY29tbWFuZHMKKwkJY21kID0gY21kMTsKKwkJTSsrOworCX0gZWxzZSBpZiAocGVyY2VudCA8IE5wKSB7ICAgICAgLy8gIG5vbi1tb3ZlbWVudCBjb21tYW5kcworCQljbWQgPSAibXo8PlwnXCIiOyAgICAgICAvLyBhdmFpbGFibGUgY29tbWFuZHMKKwkJTisrOworCX0gZWxzZSBpZiAocGVyY2VudCA8IERwKSB7ICAgICAgLy8gIERlbGV0ZSBjb21tYW5kcworCQljbWQgPSAiZHgiOyAgICAgICAgICAgICAvLyBhdmFpbGFibGUgY29tbWFuZHMKKwkJRCsrOworCX0gZWxzZSBpZiAocGVyY2VudCA8IElwKSB7ICAgICAgLy8gIEluc2V0IGNvbW1hbmRzCisJCWNtZCA9ICJpSWFBc3JKIjsgICAgICAgIC8vIGF2YWlsYWJsZSBjb21tYW5kcworCQlJKys7CisJfSBlbHNlIGlmIChwZXJjZW50IDwgWXApIHsgICAgICAvLyAgWWFuayBjb21tYW5kcworCQljbWQgPSAieVkiOyAgICAgICAgICAgICAvLyBhdmFpbGFibGUgY29tbWFuZHMKKwkJWSsrOworCX0gZWxzZSBpZiAocGVyY2VudCA8IFBwKSB7ICAgICAgLy8gIFB1dCBjb21tYW5kcworCQljbWQgPSAicFAiOyAgICAgICAgICAgICAvLyBhdmFpbGFibGUgY29tbWFuZHMKKwkJUCsrOworCX0gZWxzZSB7CisJCS8vIFdlIGRvIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyBjb21tYW5kLCB0cnkgYWdhaW4KKwkJVSsrOworCQlnb3RvIGNkMDsKKwl9CisJLy8gcmFuZG9tbHkgcGljayBvbmUgb2YgdGhlIGF2YWlsYWJsZSBjbWRzIGZyb20gImNtZFtdIgorCWkgPSAoaW50KSBscmFuZDQ4KCkgJSBzdHJsZW4oY21kKTsKKwljbSA9IGNtZFtpXTsKKwlpZiAoc3RyY2hyKCI6XDAyNCIsIGNtKSkKKwkJZ290byBjZDA7ICAgICAgICAgICAgICAgLy8gZG9udCBhbGxvdyBjb2xvbiBvciBjdHJsLVQgY29tbWFuZHMKKwlyZWFkYnVmZmVyW3JiaSsrXSA9IGNtOyAvLyBwdXQgY21kIGludG8gaW5wdXQgYnVmZmVyCisKKwkvLyBub3cgd2UgaGF2ZSB0aGUgY29tbWFuZC0KKwkvLyB0aGVyZSBhcmUgMSwgMiwgYW5kIG11bHRpIGNoYXIgY29tbWFuZHMKKwkvLyBmaW5kIG91dCB3aGljaCBhbmQgZ2VuZXJhdGUgdGhlIHJlc3Qgb2YgY29tbWFuZCBhcyBuZWNlc3NhcnkKKwlpZiAoc3RyY2hyKCJkbXJ5ejw+XCdcIiIsIGNtKSkgeyAgICAgICAgLy8gMi1jaGFyIGNvbW1hbmRzCisJCWNtZDEgPSAiIFxuXHIwJF4tK3dXZUViQmhqa2xITCI7CisJCWlmIChjbSA9PSAnbScgfHwgY20gPT0gJ1wnJyB8fCBjbSA9PSAnXCInKSB7ICAgIC8vIHBpY2sgYSByZWdbXQorCQkJY21kMSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisJCX0KKwkJdGhpbmcgPSAoaW50KSBscmFuZDQ4KCkgJSBzdHJsZW4oY21kMSk7IC8vIHBpY2sgYSBtb3ZlbWVudCBjb21tYW5kCisJCWMgPSBjbWQxW3RoaW5nXTsKKwkJcmVhZGJ1ZmZlcltyYmkrK10gPSBjOyAgLy8gYWRkIG1vdmVtZW50IHRvIGlucHV0IGJ1ZmZlcgorCX0KKwlpZiAoc3RyY2hyKCJpSWFBc2MiLCBjbSkpIHsgICAgIC8vIG11bHRpLWNoYXIgY29tbWFuZHMKKwkJaWYgKGNtID09ICdjJykgeworCQkJLy8gY2hhbmdlIHNvbWUgdGhpbmcKKwkJCXRoaW5nID0gKGludCkgbHJhbmQ0OCgpICUgc3RybGVuKGNtZDEpOyAvLyBwaWNrIGEgbW92ZW1lbnQgY29tbWFuZAorCQkJYyA9IGNtZDFbdGhpbmddOworCQkJcmVhZGJ1ZmZlcltyYmkrK10gPSBjOyAgLy8gYWRkIG1vdmVtZW50IHRvIGlucHV0IGJ1ZmZlcgorCQl9CisJCXRoaW5nID0gKGludCkgbHJhbmQ0OCgpICUgNDsgICAgLy8gd2hhdCB0aGluZyB0byBpbnNlcnQKKwkJY250ID0gKGludCkgbHJhbmQ0OCgpICUgMTA7ICAgICAvLyBob3cgbWFueSB0byBpbnNlcnQKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCQlpZiAodGhpbmcgPT0gMCkgeyAgICAgICAvLyBpbnNlcnQgY2hhcnMKKwkJCQlyZWFkYnVmZmVyW3JiaSsrXSA9IGNoYXJzWygoaW50KSBscmFuZDQ4KCkgJSBzdHJsZW4oY2hhcnMpKV07CisJCQl9IGVsc2UgaWYgKHRoaW5nID09IDEpIHsgICAgICAgIC8vIGluc2VydCB3b3JkcworCQkJCXN0cmNhdChyZWFkYnVmZmVyLCB3b3Jkc1soaW50KSBscmFuZDQ4KCkgJSAyMF0pOworCQkJCXN0cmNhdChyZWFkYnVmZmVyLCAiICIpOworCQkJCXNsZWVwdGltZSA9IDA7ICAvLyBob3cgZmFzdCB0byB0eXBlCisJCQl9IGVsc2UgaWYgKHRoaW5nID09IDIpIHsgICAgICAgIC8vIGluc2VydCBsaW5lcworCQkJCXN0cmNhdChyZWFkYnVmZmVyLCBsaW5lc1soaW50KSBscmFuZDQ4KCkgJSAyMF0pOworCQkJCXNsZWVwdGltZSA9IDA7ICAvLyBob3cgZmFzdCB0byB0eXBlCisJCQl9IGVsc2UgeyAgICAgICAgLy8gaW5zZXJ0IG11bHRpLWxpbmVzCisJCQkJc3RyY2F0KHJlYWRidWZmZXIsIG11bHRpbGluZXNbKGludCkgbHJhbmQ0OCgpICUgMjBdKTsKKwkJCQlzbGVlcHRpbWUgPSAwOyAgLy8gaG93IGZhc3QgdG8gdHlwZQorCQkJfQorCQl9CisJCXN0cmNhdChyZWFkYnVmZmVyLCAiXDAzMyIpOworCX0KKwlyZWFkYnVmZmVyWzBdID0gc3RybGVuKHJlYWRidWZmZXIgKyAxKTsKKyBjZDE6CisJdG90YWxjbWRzKys7CisJaWYgKHNsZWVwdGltZSA+IDApCisJCW15c2xlZXAoc2xlZXB0aW1lKTsgICAgICAvLyBzbGVlcCAxLzEwMCBzZWMKK30KKworLy8gdGVzdCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMKK3N0YXRpYyB2b2lkIGNyYXNoX3Rlc3QoKQoreworCXN0YXRpYyB0aW1lX3Qgb2xkdGltOworCisJdGltZV90IHRpbTsKKwljaGFyIGRbMl0sIG1zZ1s4MF07CisKKwltc2dbMF0gPSAnXDAnOworCWlmIChlbmQgPCB0ZXh0KSB7CisJCXN0cmNhdChtc2csICJlbmQ8dGV4dCAiKTsKKwl9CisJaWYgKGVuZCA+IHRleHRlbmQpIHsKKwkJc3RyY2F0KG1zZywgImVuZD50ZXh0ZW5kICIpOworCX0KKwlpZiAoZG90IDwgdGV4dCkgeworCQlzdHJjYXQobXNnLCAiZG90PHRleHQgIik7CisJfQorCWlmIChkb3QgPiBlbmQpIHsKKwkJc3RyY2F0KG1zZywgImRvdD5lbmQgIik7CisJfQorCWlmIChzY3JlZW5iZWdpbiA8IHRleHQpIHsKKwkJc3RyY2F0KG1zZywgInNjcmVlbmJlZ2luPHRleHQgIik7CisJfQorCWlmIChzY3JlZW5iZWdpbiA+IGVuZCAtIDEpIHsKKwkJc3RyY2F0KG1zZywgInNjcmVlbmJlZ2luPmVuZC0xICIpOworCX0KKworCWlmIChtc2dbMF0pIHsKKwkJcHJpbnRmKCJcblxuJWQ6IFwnJWNcJyAlc1xuXG5cbiVzW0hpdCByZXR1cm4gdG8gY29udGludWVdJXMiLAorCQkJdG90YWxjbWRzLCBsYXN0X2lucHV0X2NoYXIsIG1zZywgU09zLCBTT24pOworCQlmZmx1c2hfYWxsKCk7CisJCXdoaWxlIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBkLCAxKSA+IDApIHsKKwkJCWlmIChkWzBdID09ICdcbicgfHwgZFswXSA9PSAnXHInKQorCQkJCWJyZWFrOworCQl9CisJfQorCXRpbSA9IHRpbWUoTlVMTCk7CisJaWYgKHRpbSA+PSAob2xkdGltICsgMykpIHsKKwkJc3ByaW50ZihzdGF0dXNfYnVmZmVyLAorCQkJCSJUb3Q9JWQ6IE09JWQgTj0lZCBJPSVkIEQ9JWQgWT0lZCBQPSVkIFU9JWQgc2l6ZT0lZCIsCisJCQkJdG90YWxjbWRzLCBNLCBOLCBJLCBELCBZLCBQLCBVLCBlbmQgLSB0ZXh0ICsgMSk7CisJCW9sZHRpbSA9IHRpbTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2FuZHJvaWQtYnVpbGQgYi9leGFtcGxlcy9hbmRyb2lkLWJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1ZmU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9hbmRyb2lkLWJ1aWxkCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBCdWlsZCBCdXN5Ym94IGFnYWluc3QgQW5kcm9pZCdzIGJpb25pYworIyBPcmlnaW5hbGx5IGJ5IERhbiBGYW5kcmljaAorIworIyBDb25maWd1cmUgd2l0aCBhbmRyb2lkX2RlZmNvbmZpZworIyBUaGlzIGZpbGUgaGFzIGJlZW4gdGVzdGVkIG9uIEFuZHJvaWQgRnJveW8gKHRoZSBsYWNrIG9mIHR0eW5hbWVfciBpbgorIyB0aGUgbXVzdCBiZSBwYXRjaGVkIGFyb3VuZCkgYW5kIEdpbmdlcmJyZWFkLgorCisjIFBvaW50IHRoaXMgdG8gdGhlIEFuZHJvaWQgcm9vdCBkaXJlY3Rvcnk7IGl0J3MgdXNlZCBpbiB0aGUgZGVmY29uZmlnIENGTEFHUworZXhwb3J0IEE9IiRIT01FL2FuZHJvaWQiCisKKyMgQW5kcm9pZCBwcm9kdWN0IGJlaW5nIGJ1aWx0CitQPXpvb20yCisKKyMgVG9vbGNoYWluIHZlcnNpb24gaW4gdXNlIGJ5IHRoaXMgdmVyc2lvbiBvZiBBbmRyb2lkCitHQ0NWRVI9NC40LjMKKworZXhwb3J0IFBBVEg9IiRBL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktJEdDQ1ZFUi9iaW46JFBBVEgiCisKKyMgU2V0IHRoZSBsaW5rZXIgZmxhZ3M7IGNvbXBpbGVyIGZsYWdzIGFyZSBpbiB0aGUgZGVmY29uZmlnIGZpbGUKK2lmIGdyZXAgIl5DT05GSUdfU1RBVElDPXkiIC5jb25maWcgPi9kZXYvbnVsbCA7IHRoZW4KKwkjIFN0YXRpYyBsaW5raW5nCisJTERGTEFHUz0iLXN0YXRpYyAtWGxpbmtlciAteiAtWGxpbmtlciBtdWxkZWZzIC1ub3N0ZGxpYiAkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYi9jcnRiZWdpbl9zdGF0aWMubyAkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYi9jcnRlbmRfYW5kcm9pZC5vIC1MJEEvb3V0L3RhcmdldC9wcm9kdWN0LyRQL29iai9saWIgLUwkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGlibV9pbnRlcm1lZGlhdGVzIC1MJEEvb3V0L3RhcmdldC9wcm9kdWN0LyRQL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYmNfaW50ZXJtZWRpYXRlcyIKKwlMRExJQlM9Im0gYyBnY2MiCitlbHNlCisJIyBEeW5hbWljIGxpbmtpbmcKKwlMREZMQUdTPSItWGxpbmtlciAteiAtWGxpbmtlciBtdWxkZWZzIC1ub3N0ZGxpYiAtQmR5bmFtaWMgLVhsaW5rZXIgLVQkQS9idWlsZC9jb3JlL2FybWVsZi54IC1YbGlua2VyIC1keW5hbWljLWxpbmtlciAtWGxpbmtlciAvc3lzdGVtL2Jpbi9saW5rZXIgLVhsaW5rZXIgLXogLVhsaW5rZXIgbm9jb3B5cmVsb2MgLVhsaW5rZXIgLS1uby11bmRlZmluZWQgJEEvb3V0L3RhcmdldC9wcm9kdWN0LyRQL29iai9saWIvY3J0YmVnaW5fZHluYW1pYy5vICRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliL2NydGVuZF9hbmRyb2lkLm8gLUwkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYiIKKwlMRExJQlM9ImRsIG0gYyBnY2MiCitmaQorCittYWtlIEVYVFJBX0xERkxBR1M9IiRMREZMQUdTIiBMRExJQlM9IiRMRExJQlMiICIkQCIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvYm9vdGZsb3BweS50eHQgYi9leGFtcGxlcy9ib290ZmxvcHB5L2Jvb3RmbG9wcHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMmNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L2Jvb3RmbG9wcHkudHh0CkBAIC0wLDAgKzEsMTgwIEBACitCdWlsZGluZyBhIEJ1c3lib3ggQm9vdCBGbG9wcHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gYnVpZCBhIGJvb3QgZmxvcHB5IHVzaW5nIHRoZSBmb2xsb3dpbmcKK2NvbXBvbmVudHM6CisKKyAtIExpbnV4IEtlcm5lbCAoaHR0cDovL3d3dy5rZXJuZWwub3JnKQorIC0gdUNsaWJjOiBDIGxpYnJhcnkgKGh0dHA6Ly93d3cudWNsaWJjLm9yZy8pCisgLSBCdXN5Ym94OiBVbml4IHV0aWxpdGllcyAoaHR0cDovL2J1c3lib3gubmV0LykKKyAtIFN5c2xpbnV4OiBib290bG9hZGVyIChodHRwOi8vc3lzbGludXguenl0b3IuY29tKQorCitJdCBpcyBiYXNlZCBoZWF2aWx5IG9uIGEgcGFwZXIgcHJlc2VudGVkIGJ5IEVyaWsgQW5kZXJzZW4gYXQgdGhlIDIwMDEgRW1iZWRkZWQKK1N5c3RlbXMgQ29uZmVyZW5jZS4KKworCisKK0J1aWxkaW5nIFRoZSBTb2Z0d2FyZSBDb21wb25lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGJ1aWxkIEJ1c3lib3gsIHVDbGliYywgb3IgYSB3b3JraW5nIExpbnV4CitrZXJuZWwgYXJlIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4gVGhlIGZvbGxvd2luZyBndWlkZWxpbmVzIHdpbGwKK2hlbHAgdGhvdWdoOgorCisJLSBTdG9jayBCdXN5Ym94IGZyb20gQ1ZTIG9yIGEgdGFyYmFsbCB3aWxsIHdvcmsgd2l0aCBubyBtb2RpZmljYXRpb25zIHRvCisJICBhbnkgZmlsZXMuIEp1c3QgZXh0cmFjdCBhbmQgZ28uCisJLSBEaXR0byB1Q2xpYmMuCisJLSBZb3VyIExpbnV4IGtlcm5lbCBtdXN0IGluY2x1ZGUgc3VwcG9ydCBmb3IgaW5pdHJkIG9yIGVsc2UgdGhlIGZsb3BweQorCSAgd29uJ3QgYmUgYWJsZSB0byBtb3VudCBpdCdzIHJvb3QgZmlsZSBzeXN0ZW0uCisKK0lmIHlvdSByZXF1aXJlIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgQnVzeWJveCB1Q2xpYmMgb3IgTGludXgsIHBsZWFzZQorcmVmZXIgdG8gdGhlIHdlYiBwYWdlcyBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhvc2UgaW5kaXZpZHVhbCBwcm9ncmFtcy4KKworCisKK01ha2luZyBhIFJvb3QgRmlsZSBTeXN0ZW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBzdGVwcyB3aWxsIGNyZWF0ZSBhIHJvb3QgZmlsZSBzeXN0ZW0uCisKKyAtIENyZWF0ZSBhbiBlbXB0eSBmaWxlIHRoYXQgeW91IGNhbiBmb3JtYXQgYXMgYSBmaWxlc3lzdGVtOgorCisJZGQgaWY9L2Rldi96ZXJvIG9mPXJvb3RmcyBicz0xayBjb3VudD00MDAwCisKKyAtIFNldCB1cCB0aGUgcm9vdGZzIGZpbGUgd2UganVzdCBjcmVhdGVkIHRvIGJlIHVzZWQgYXMgYSBsb29wIGRldmljZSAobWF5IG5vdAorICAgYmUgbmVjZXNzYXJ5KQorCisJbG9zZXR1cCAvZGV2L2xvb3AwIHJvb3RmcworCisgLSBGb3JtYXQgdGhlIHJvb3RmcyBmaWxlIHdpdGggYSBmaWxlc3lzdGVtOgorCisJbWtmcy5leHQyIC1GIC1pIDIwMDAgcm9vdGZzCisKKyAtIE1vdW50IHRoZSBmaWxlIG9uIGEgbW91bnRwb2ludCBzbyB3ZSBjYW4gcGxhY2UgZmlsZXMgaW4gaXQ6CisKKwlta2RpciBsb29wCisJbW91bnQgLW8gbG9vcCByb290ZnMgbG9vcC8KKworCSh5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGJlIHJvb3QgdG8gZG8gdGhpcykKKworIC0gQ29weSBvbiB0aGUgQyBsaWJyYXJ5LCB0aGUgZHluYW1pYyBsaW5raW5nIGxpYnJhcnksIGFuZCBvdGhlciBuZWNlc3NhcnkKKyAgIGxpYnJhcmllcy4gRm9yIHRoaXMgZXhhbXBsZSwgd2UgY29weSB0aGUgZm9sbG93aW5nIGZpbGVzIGZyb20gdGhlIHVDbGliYworICAgdHJlZToKKworCW1rZGlyIGxvb3AvbGliCisJKGNoZGlyIHRvIHVDbGliYyBkaXJlY3RvcnkpCisJY3AgLWEgbGliYy5zbyogdUNsaWJjKi5zbyBcCisJCWxkLnNvLTEvZC1saW5rL2xkLWxpbnV4LXVjbGliYy5zbyogXAorCQlsZC5zby0xL2xpYmRsL2xpYmRsLnNvKiBcCisJCWNyeXB0L2xpYmNyeXB0LnNvKiBcCisJCShwYXRoIHRvKWxvb3AvbGliCisKKyAtIEluc3RhbGwgdGhlIEJ1c3lib3ggYmluYXJ5IGFuZCBhY2NvbXBhbnlpbmcgc3ltbGlua3M6CisKKwkoY2hkaXIgdG8gYnVzeWJveCBkaXJlY3RvcnkpCisJbWFrZSBDT05GSUdfUFJFRklYPShwYXRoIHRvKWxvb3AvIGluc3RhbGwKKworIC0gTWFrZSBkZXZpY2UgZmlsZXMgaW4gL2RldjoKKworCVRoaXMgY2FuIGJlIGRvbmUgYnkgcnVubmluZyB0aGUgJ21rZGV2cy5zaCcgc2NyaXB0LiBJZiB5b3Ugd2FudCB0aGUgZ29yeQorCWRldGFpbHMsIHlvdSBjYW4gcmVhZCB0aGUgc2NyaXB0LgorCisgLSBNYWtlIG5lY2Vzc2FyeSBmaWxlcyBpbiAvZXRjOgorCisJRm9yIHRoaXMsIGp1c3QgY3AgLWEgdGhlIGV0Yy8gZGlyZWN0b3J5IG9udG8gcm9vdGZzLiBBZ2FpbiwgaWYgeW91IHdhbnQKKwlhbGwgdGhlIGRldGFpbHMsIHlvdSBjYW4ganVzdCBsb29rIGF0IHRoZSBmaWxlcyBpbiB0aGUgZGlyLgorCisgLSBVbm1vdW50IHRoZSByb290ZnMgZnJvbSB0aGUgbW91bnRwb2ludDoKKworCXVtb3VudCBsb29wCisKKyAtIENvbXByZXNzIGl0OgorCisJZ3ppcCAtOSByb290ZnMKKworCitNYWtpbmcgYSBTWVNMSU5VWCBib290IGZsb3BweQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBzdGVwcyB3aWxsIGNyZWF0ZSB0aGUgYm9vdCBmbG9wcHkuCisKK05vdGU6IFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgbXRvb2xzIHBhY2thZ2UgaW5zdGFsbGVkIGJlZm9yZWhhbmQuCisKKyAtIEluc2VydCBhIGZsb3BweSBpbiB0aGUgZHJpdmUgYW5kIGZvcm1hdCBpdCB3aXRoIGFuIE1TRE9TIGZpbGVzeXN0ZW06CisKKwltZm9ybWF0IGE6CisKKwkoaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGtub3cgd2hhdCBkZXZpY2UgJ2E6JyBpcywgbG9vayBhdCAvZXRjL210b29scy5jb25mKQorCisgLSBSdW4gc3lzbGludXggb24gdGhlIGZsb3BweToKKworCXN5c2xpbnV4IC1zIC9kZXYvZmQwCisKKwkodGhlIC1zIHN0YW5kcyBmb3IgInNhZmUsIHNsb3csIGFuZCBzdHVwaWQiIGFuZCBzaG91bGQgd29yayBiZXR0ZXIgd2l0aAorCWJ1Z2d5IEJJT1NlczsgaXQgY2FuIGJlIG9taXR0ZWQpCisKKyAtIFB1dCBvbiBhIHN5c2xpbnV4LmNmZyBmaWxlOgorCisJbWNvcHkgc3lzbGludXguY2ZnIGE6CisKKwkobW9yZSBvbiBzeXNsaW51eC5jZmcgYmVsb3cpCisKKyAtIENvcHkgdGhlIHJvb3QgZmlsZSBzeXN0ZW0geW91IG1hZGUgb250byB0aGUgTVNET1MgZm9ybWF0dGVkIGZsb3BweQorCisJbWNvcHkgcm9vdGZzLmd6IGE6CisKKyAtIEJ1aWxkIGEgbGludXgga2VybmVsIGFuZCBjb3B5IGl0IG9udG8gdGhlIGRpc2sgd2l0aCB0aGUgZmlsZW5hbWUgJ2xpbnV4JworCisJbWNvcHkgYnpJbWFnZSBhOmxpbnV4CisKKworU2FtcGxlIHN5c2xpbnV4LmNmZworfn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgZm9sbG93aW5nIHNpbXBsZSBzeXNsaW51eC5jZmcgZmlsZSBzaG91bGQgd29yay4gWW91IGNhbiB0d2VhayBpdCBpZiB5b3UKK2xpa2UuCisKKy0tLS1iZWdpbi1zeXNsaW51eC5jZmctLS0tLS0tLS0tLS0tLS0KK0RFRkFVTFQgbGludXgKK0FQUEVORCBpbml0cmQ9cm9vdGZzLmd6IHJvb3Q9L2Rldi9yYW0wCitUSU1FT1VUIDEwCitQUk9NUFQgMQorLS0tLWVuZC1zeXNsaW51eC5jZmctLS0tLS0tLS0tLS0tLS0KKworU29tZSBjaGFuZ2VzIHlvdSBjb3VsZCBtYWtlIHRvIHN5c2xpbnV4LmNmZzoKKworIC0gVGhpcyB2YWx1ZSBpcyB0aGUgbnVtYmVyIHNlY29uZHMgaXQgd2lsbCB3YWl0IGJlZm9yZSBib290aW5nLiBZb3UgY2FuIHNldAorICAgdGhlIHRpbWVvdXQgdG8gMCAob3Igb21pdCkgdG8gYm9vdCBpbnN0YW50bHksIG9yIHlvdSBjYW4gc2V0IGl0IGFzIGhpZ2ggYXMKKyAgIDEwIHRvIHdhaXQgYXdoaWxlLgorCisgLSBQUk9NUFQgY2FuIGJlIHNldCB0byAwIHRvIGRpc2FibGUgdGhlICdib290OicgcHJvbXB0LgorCisgLSB5b3UgY2FuIGFkZCB0aGlzIGxpbmUgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YgYSBmaWxlIGFzIGEgd2VsY29tZQorICAgbWVzc2FnZToKKworCURJU1BMQVkgZGlzcGxheS50eHQKKworCisKK0FkZGl0aW9uYWwgUmVzb3VyY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPdGhlciB1c2VmdWwgaW5mb3JtYXRpb24gb24gbWFraW5nIGEgTGludXggYm9vdGZsb3BweSBpcyBhdmFpbGFibGUgYXQgdGhlCitmb2xsb3dpbmcgVVJMczoKKworaHR0cDovL3d3dy5saW51eGRvYy5vcmcvSE9XVE8vQm9vdGRpc2stSE9XVE8vaW5kZXguaHRtbAoraHR0cDovL3d3dy5saW51eC1lbWJlZGRlZC5jb20vaG93dG8vRW1iZWRkZWQtTGludXgtSG93dG8uaHRtbAoraHR0cDovL2xpbnV4LWVtYmVkZGVkLm9yZy9ob3d0by9MRlMtSE9XVE8uaHRtbAoraHR0cDovL2xpbnV4LWVtYmVkZGVkLm9yZy9wbWhvd3RvLmh0bWwKK2h0dHA6Ly9yZWN5Y2xlLmxibC5nb3Yvfmxkb29saXR0L2VtYmVkZGVkLyAoTGFycnkgRG9vbGl0dGxlJ3Mgc3R1ZmYpCisKKworCitQb3NzaWJsZSBUT0RPcworLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBmZWF0dXJlcyB0aGF0IHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGxhdGVyOgorCisgLSBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGZpbGVzeXN0ZW1zIGJlc2lkZXMgZXh0MiwgaS5lLiBtaW5peAorIC0gZGlmZmVyZW50IGxpYmMsIHN0YXRpYyB2cyBkeW5hbWljIGxvYWRpbmcKKyAtIG1heWJlIHVzaW5nIGFuIGFsdGVybmF0ZSBib290bG9hZGVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L2Rpc3BsYXkudHh0IGIvZXhhbXBsZXMvYm9vdGZsb3BweS9kaXNwbGF5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2FlNDhiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9kaXNwbGF5LnR4dApAQCAtMCwwICsxLDMgQEAKKworVGhpcyBib290IGZsb3BweSBpcyBtYWRlIHdpdGggQnVzeWJveCwgdUNsaWJjLCBhbmQgdGhlIExpbnV4IGtlcm5lbC4KK0hpdCBSRVRVUk4gdG8gYm9vdCBvciBlbnRlciBib290IHBhcmFtZXRlcnMgYXQgdGhlIHByb21wdCBiZWxvdy4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL2ZzdGFiIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvZnN0YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxZjYwMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL2ZzdGFiCkBAIC0wLDAgKzEgQEAKK3Byb2MJCS9wcm9jCXByb2MJZGVmYXVsdHMgICAgMAkwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0LmQvcmNTIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdC5kL3JjUwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjI5YjkyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdC5kL3JjUwpAQCAtMCwwICsxLDMgQEAKKyMhIC9iaW4vc2gKKworL2Jpbi9tb3VudCAtYQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdHRhYiBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL2luaXR0YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjOWY2OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL2luaXR0YWIKQEAgLTAsMCArMSw0IEBACis6OnN5c2luaXQ6L2V0Yy9pbml0LmQvcmNTCis6OnJlc3Bhd246LS9iaW4vc2gKK3R0eTI6OmFza2ZpcnN0Oi0vYmluL3NoCis6OmN0cmxhbHRkZWw6L2Jpbi91bW91bnQgLWEgLXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL3Byb2ZpbGUgYi9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjhkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9wcm9maWxlCkBAIC0wLDAgKzEsNyBAQAorIyAvZXRjL3Byb2ZpbGU6IHN5c3RlbS13aWRlIC5wcm9maWxlIGZpbGUgZm9yIHRoZSBCb3VybmUgc2hlbGxzCisKK2VjaG8KK2VjaG8gLW4gIlByb2Nlc3NpbmcgL2V0Yy9wcm9maWxlLi4uICIKKyMgbm8tb3AKK2VjaG8gIkRvbmUiCitlY2hvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L21rZGV2cy5zaCBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtkZXZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlOTUxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L21rZGV2cy5zaApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMKKyMgbWFrZWRldi5zaCAtIGNyZWF0ZXMgZGV2aWNlIGZpbGVzIGZvciBhIGJ1c3lib3ggYm9vdCBmbG9wcHkgaW1hZ2UKKworCisjIHdlIGRvIG91ciB3b3JrIGluIHRoZSBkZXYvIGRpcmVjdG9yeQoraWYgWyAteiAiJDEiIF07IHRoZW4KKwllY2hvICJ1c2FnZTogYGJhc2VuYW1lICQwYCBwYXRoL3RvL2Rldi9kaXIiCisJZXhpdCAxCitmaQorCitjZCAkMQorCisKKyMgbWlzY2VsbGFuZW91cyBvbmUtb2YtYS1raW5kIHN0dWZmCitta25vZCBjb25zb2xlIGMgNSAxCitta25vZCBmdWxsIGMgMSA3Citta25vZCBrbWVtIGMgMSAyCitta25vZCBtZW0gYyAxIDEKK21rbm9kIG51bGwgYyAxIDMKK21rbm9kIHBvcnQgYyAxIDQKK21rbm9kIHJhbmRvbSBjIDEgOAorbWtub2QgdXJhbmRvbSBjIDEgOQorbWtub2QgemVybyBjIDEgNQorbG4gLXMgL3Byb2Mva2NvcmUgY29yZQorCisjIElERSBIRCBkZXZzCisjIG5vdGU6IG5vdCBnb2luZyB0byBib3RoZXIgY3JlYXRpbmcgYWxsIGNvbmNpZXZhYmxlIHBhcnRpdGlvbnM7IHlvdSBjYW4gZG8KKyMgdGhhdCB5b3Vyc2VsZiBhcyB5b3UgbmVlZCAnZW0uCitta25vZCBoZGEgYiAzIDAKK21rbm9kIGhkYiBiIDMgNjQKK21rbm9kIGhkYyBiIDIyIDAKK21rbm9kIGhkZCBiIDIyIDY0CisKKyMgbG9vcCBkZXZzCitmb3IgaSBpbiBgc2VxIDAgN2A7IGRvCisJbWtub2QgbG9vcCRpIGIgNyAkaQorZG9uZQorCisjIHJhbSBkZXZzCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgcmFtJGkgYiAxICRpCitkb25lCitsbiAtcyByYW0xIHJhbQorCisjIHR0eXMKK21rbm9kIHR0eSBjIDUgMAorZm9yIGkgaW4gYHNlcSAwIDlgOyBkbworCW1rbm9kIHR0eSRpIGMgNCAkaQorZG9uZQorCisjIHZpcnR1YWwgY29uc29sZSBzY3JlZW4gZGV2cworZm9yIGkgaW4gYHNlcSAwIDlgOyBkbworCW1rbm9kIHZjcyRpIGIgNyAkaQorZG9uZQorbG4gLXMgdmNzMCB2Y3MKKworIyB2aXJ0dWFsIGNvbnNvbGUgc2NyZWVuIHcvIGF0dHJpYnV0ZXMgZGV2cworZm9yIGkgaW4gYHNlcSAwIDlgOyBkbworCW1rbm9kIHZjc2EkaSBiIDcgJCgoMTI4ICsgaSkpCitkb25lCitsbiAtcyB2Y3NhMCB2Y3NhCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L21rcm9vdGZzLnNoIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ta3Jvb3Rmcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2ZjNDhiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ta3Jvb3Rmcy5zaApAQCAtMCwwICsxLDEwNCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgbWtyb290ZnMuc2ggLSBjcmVhdGVzIGEgcm9vdCBmaWxlIHN5c3RlbQorIworCisjIFRPRE86IG5lZWQgdG8gYWRkIGNoZWNrcyBoZXJlIHRvIHZlcmlmeSB0aGF0IGJ1c3lib3gsIHVDbGliYyBhbmQgYnpJbWFnZQorIyBleGlzdAorCisKKyMgY29tbWFuZC1saW5lIHNldHRhYmxlIHZhcmlhYmxlcworQlVTWUJPWF9ESVI9Li4KK1VDTElCQ19ESVI9Li4vLi4vdUNsaWJjCitUQVJHRVRfRElSPS4vbG9vcAorRlNTSVpFPTQwMDAKK0NMRUFOVVA9MQorTUtGUz0nbWtmcy5leHQyIC1GJworCisjIGRvbid0LXRvdWNoIHZhcmlhYmxlcworQkFTRV9ESVI9YHB3ZGAKKworCit3aGlsZSBnZXRvcHRzICdiOnU6czp0OkNtJyBvcHQKK2RvCisJY2FzZSAkb3B0IGluCisJCWIpIEJVU1lCT1hfRElSPSRPUFRBUkcgOzsKKwkJdSkgVUNMSUJDX0RJUj0kT1BUQVJHIDs7CisJCXQpIFRBUkdFVF9ESVI9JE9QVEFSRyA7OworCQlzKSBGU1NJWkU9JE9QVEFSRyA7OworCQlDKSBDTEVBTlVQPTAgOzsKKwkJbSkgTUtGUz0nbWtmcy5taW5peCcgOzsKKwkJKikKKwkJCWVjaG8gInVzYWdlOiBgYmFzZW5hbWUgJDBgIFstYnVdIgorCQkJZWNobyAiICAtYiBESVIgIHBhdGggdG8gYnVzeWJveCBkaXJlY29yeSAoZGVmYXVsdCAuLikiCisJCQllY2hvICIgIC11IERJUiAgcGF0aCB0byB1Q2xpYmMgZGlyZWNvcnkgKGRlZmF1bHQgLi4vLi4vdUNsaWJjKSIKKwkJCWVjaG8gIiAgLXQgRElSICBwYXRoIHRvIHRhcmdldCBkaXJlY29yeSAoZGVmYXVsdCAuL2xvb3ApIgorCQkJZWNobyAiICAtcyBTSVpFIHNpemUgb2Ygcm9vdCBmaWxlc3lzdGVtIGluIEtieXRlcyAoZGVmYXVsdCA0MDAwKSIKKwkJCWVjaG8gIiAgLUMgICAgICBkb24ndCBwZXJmb3JtIGNsZWFudXAgKHVtb3VudCB0YXJnZXQgZGlyLCBnemlwIHJvb3RmcywgZXRjLikiCisJCQllY2hvICIgICAgICAgICAgKHRoaXMgYWxsb3dzIHlvdSB0byAnY2hyb290IGxvb3AvIC9iaW4vc2gnIHRvIHRlc3QgaXQpIgorCQkJZWNobyAiICAtbSAgICAgIHVzZSBtaW5peCBmaWxlc3lzdGVtIChkZWZhdWx0IGlzIGV4dDIpIgorCQkJZXhpdCAxCisJCQk7OworCWVzYWMKK2RvbmUKKworCisKKworIyBjbGVhbiB1cCBmcm9tIGFueSBwcmV2aW91cyB3b3JrCittb3VudCB8IGdyZXAgLXEgbG9vcAorWyAkPyAtZXEgMCBdICYmIHVtb3VudCAkVEFSR0VUX0RJUgorWyAtZCAkVEFSR0VUX0RJUiBdICYmIHJtIC1yZiAkVEFSR0VUX0RJUi8KK1sgLWYgcm9vdGZzIF0gJiYgcm0gLWYgcm9vdGZzCitbIC1mIHJvb3Rmcy5neiBdICYmIHJtIC1mIHJvb3Rmcy5negorCisKKyMgcHJlcGFyZSByb290IGZpbGUgc3lzdGVtIGFuZCBtb3VudCBhcyBsb29wYmFjaworZGQgaWY9L2Rldi96ZXJvIG9mPXJvb3RmcyBicz0xayBjb3VudD0kRlNTSVpFCiskTUtGUyAtaSAyMDAwIHJvb3RmcworbWtkaXIgJFRBUkdFVF9ESVIKK21vdW50IC1vIGxvb3AsZXhlYyByb290ZnMgJFRBUkdFVF9ESVIgIyBtdXN0IGJlIHJvb3QKKworCisjIGluc3RhbGwgdUNsaWJjCitta2RpciAtcCAkVEFSR0VUX0RJUi9saWIKK2NkICRVQ0xJQkNfRElSCittYWtlIElOU1RBTExfRElSPQorY3AgLWEgbGliYy5zbyogJEJBU0VfRElSLyRUQVJHRVRfRElSL2xpYgorY3AgLWEgdUNsaWJjKi5zbyAkQkFTRV9ESVIvJFRBUkdFVF9ESVIvbGliCitjcCAtYSBsZC5zby0xL2QtbGluay9sZC1saW51eC11Y2xpYmMuc28qICRCQVNFX0RJUi8kVEFSR0VUX0RJUi9saWIKK2NwIC1hIGxkLnNvLTEvbGliZGwvbGliZGwuc28qICRCQVNFX0RJUi8kVEFSR0VUX0RJUi9saWIKK2NwIC1hIGNyeXB0L2xpYmNyeXB0LnNvKiAkQkFTRV9ESVIvJFRBUkdFVF9ESVIvbGliCitjZCAkQkFTRV9ESVIKKworCisjIGluc3RhbGwgYnVzeWJveCBhbmQgY29tcG9uZW50cworY2QgJEJVU1lCT1hfRElSCittYWtlIGRpc3RjbGVhbgorbWFrZSBDQz0kQkFTRV9ESVIvJFVDTElCQ19ESVIvZXh0cmEvZ2NjLXVDbGliYy9pMzg2LXVjbGliYy1nY2MKK21ha2UgQ09ORklHX1BSRUZJWD0kQkFTRV9ESVIvJFRBUkdFVF9ESVIgaW5zdGFsbAorY2QgJEJBU0VfRElSCisKKworIyBtYWtlIGZpbGVzIGluIC9kZXYKK21rZGlyICRUQVJHRVRfRElSL2RldgorLi9ta2RldnMuc2ggJFRBUkdFVF9ESVIvZGV2CisKKworIyBtYWtlIGZpbGVzIGluIC9ldGMKK2NwIC1hIGV0YyAkVEFSR0VUX0RJUgorbG4gLXMgL3Byb2MvbW91bnRzICRUQVJHRVRfRElSL2V0Yy9tdGFiCisKKworIyBvdGhlciBtaXNjZWxsYW5lb3VzIHNldHVwCitta2RpciAkVEFSR0VUX0RJUi9pbml0cmQKK21rZGlyICRUQVJHRVRfRElSL3Byb2MKKworCisjIERvbmUuIE1heWJlIGRvIGNsZWFudXAuCitpZiBbICRDTEVBTlVQIC1lcSAxIF0KK3RoZW4KKwl1bW91bnQgJFRBUkdFVF9ESVIKKwlybWRpciAkVEFSR0VUX0RJUgorCWd6aXAgLTkgcm9vdGZzCitmaQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9vdGZsb3BweS9ta3N5c2xpbnV4LnNoIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ta3N5c2xpbnV4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyNTQxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L21rc3lzbGludXguc2gKQEAgLTAsMCArMSw0OCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgRm9ybWF0cyBhIGZsb3BweSB0byB1c2UgU3lzbGludXgKKworZHVtbXk9IiIKKworCisjIG5lZWQgdG8gaGF2ZSBtdG9vbHMgaW5zdGFsbGVkCitpZiBbIC16IGB3aGljaCBtZm9ybWF0YCAtbyAteiBgd2hpY2ggbWNvcHlgIF07IHRoZW4KKwllY2hvICJZb3UgbXVzdCBoYXZlIHRoZSBtdG9vbHMgcGFja2FnZSBpbnN0YWxsZWQgdG8gcnVuIHRoaXMgc2NyaXB0IgorCWV4aXQgMQorZmkKKworCisjIG5lZWQgYW4gYXJnIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlIGtlcm5lbAoraWYgWyAteiAiJDEiIF07IHRoZW4KKwllY2hvICJ1c2FnZTogYGJhc2VuYW1lICQwYCBwYXRoL3RvL2xpbnV4L2tlcm5lbCIKKwlleGl0IDEKK2ZpCisKKworIyBuZWVkIHRvIGhhdmUgYSByb290IGZpbGUgc3lzdGVtIGJ1aWx0CitpZiBbICEgLWYgcm9vdGZzLmd6IF07IHRoZW4KKwllY2hvICJZb3UgbmVlZCB0byBoYXZlIGEgcm9vdGZzIGJ1aWx0IGZpcnN0LiIKKwllY2hvICJIaXQgUkVUVVJOIHRvIG1ha2Ugb25lIG5vdyBvciBDb250cm9sLUMgdG8gcXVpdC4iCisJcmVhZCBkdW1teQorCS4vbWtyb290ZnMuc2gKK2ZpCisKKworIyBwcmVwYXJlIHRoZSBmbG9wcHkKK2VjaG8gIlBsZWFzZSBpbnNlcnQgYSBibGFuayBmbG9wcHkgaW4gdGhlIGRyaXZlIGFuZCBwcmVzcyBSRVRVUk4gdG8gZm9ybWF0IgorZWNobyAiKFdBUk5JTkc6IEFsbCBkYXRhIHdpbGwgYmUgZXJhc2VkISBIaXQgQ29udHJvbC1DIHRvIGFib3J0KSIKK3JlYWQgZHVtbXkKKworZWNobyAiRm9ybWF0dGluZyB0aGUgZmxvcHB5Li4uIgorbWZvcm1hdCBhOgorZWNobyAiTWFraW5nIGl0IGJvb3RhYmxlIHdpdGggU3lzbGludXguLi4iCitzeXNsaW51eCAtcyAvZGV2L2ZkMAorZWNobyAiQ29weWluZyBTeXNsaW51eCBjb25maWd1cmF0aW9uIGZpbGVzLi4uIgorbWNvcHkgc3lzbGludXguY2ZnIGRpc3BsYXkudHh0IGE6CitlY2hvICJDb3B5aW5nIHJvb3QgZmlsZXN5c3RlbSBmaWxlLi4uIgorbWNvcHkgcm9vdGZzLmd6IGE6CisjIFhYWDogbWF5YmUgY2hlY2sgZm9yICJubyBzcGFjZSBvbiBkZXZpY2UiIGVycm9ycyBoZXJlCitlY2hvICJDb3B5aW5nIGxpbnV4IGtlcm5lbC4uLiIKK21jb3B5ICQxIGE6bGludXgKKyMgWFhYOiBtYXliZSBjaGVjayBmb3IgIm5vIHNwYWNlIG9uIGRldmljZSIgZXJyb3JzIGhlcmUgdG9vCitlY2hvICJGaW5pc2hlZDogYm9vdCBmbG9wcHkgY3JlYXRlZCIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvcXVpY2tzdGFydC50eHQgYi9leGFtcGxlcy9ib290ZmxvcHB5L3F1aWNrc3RhcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODA5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L3F1aWNrc3RhcnQudHh0CkBAIC0wLDAgKzEsMTUgQEAKK1F1aWNrc3RhcnQgb24gbWFraW5nIHRoZSBCdXN5Ym94IGJvb3QtZmxvcHB5OgorCisgIDEpIERvd25sb2FkIEJ1c3lib3ggYW5kIHVDbGliYyBmcm9tIENWUyBvciB0YXJiYWxscy4gTWFrZSBzdXJlIHRoZXkgc2hhcmUgYQorICAgICBjb21tb24gcGFyZW50IGRpcmVjdG9yeS4gKGkuZS4gYnVzeWJveC8gYW5kIHVjbGliYy8gYXJlIGJvdGggcmlnaHQgb2ZmIG9mCisJIC90bXAsIG9yIHdoZXJldmVyLikKKworICAyKSBCdWlsZCBhIExpbnV4IGtlcm5lbC4gTWFrZSBzdXJlIHlvdSBpbmNsdWRlIHN1cHBvcnQgZm9yIGluaXRyZC4KKworICAzKSBQdXQgYSBmbG9wcHkgaW4gdGhlIGRyaXZlLiBNYWtlIHN1cmUgaXQgaXMgYSBmbG9wcHkgeW91IGRvbid0IGNhcmUgYWJvdXQKKyAgICAgYmVjYXVzZSB0aGUgY29udGVudHMgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKworICA0KSBBcyByb290LCB0eXBlIC4vbWtzeXNsaW51eC5zaCBwYXRoL3RvL2xpbnV4L2tlcm5lbCBmcm9tIHRoaXMgZGlyZWN0b3J5LgorICAgICBXYWl0IHBhdGllbnRseSB3aGlsZSB0aGUgbWFnaWMgaGFwcGVucy4KKworICA1KSBCb290IHVwIG9uIHRoZSBmbG9wcHkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L3N5c2xpbnV4LmNmZyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvc3lzbGludXguY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjY3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L3N5c2xpbnV4LmNmZwpAQCAtMCwwICsxLDcgQEAKK2Rpc3BsYXkgZGlzcGxheS50eHQKK2RlZmF1bHQgbGludXgKK3RpbWVvdXQgMTAKK3Byb21wdCAxCitsYWJlbCBsaW51eAorCWtlcm5lbCBsaW51eAorCWFwcGVuZCBpbml0cmQ9cm9vdGZzLmd6IHJvb3Q9L2Rldi9yYW0wCmRpZmYgLS1naXQgYS9leGFtcGxlcy9idXN5Ym94LnNwZWMgYi9leGFtcGxlcy9idXN5Ym94LnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkMDA1MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2J1c3lib3guc3BlYwpAQCAtMCwwICsxLDEyMCBAQAorU3VtbWFyeTogU3RhdGljYWxseSBsaW5rZWQgYmluYXJ5IHByb3ZpZGluZyBzaW1wbGlmaWVkIHZlcnNpb25zIG9mIHN5c3RlbSBjb21tYW5kcworTmFtZTogYnVzeWJveAorVmVyc2lvbjogMS4xNS4xCitSZWxlYXNlOiAxJXs/ZGlzdH0KK0Vwb2NoOiAxCitMaWNlbnNlOiBHUEx2MgorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9TaGVsbHMKK1NvdXJjZTogaHR0cDovL3d3dy5idXN5Ym94Lm5ldC9kb3dubG9hZHMvJXtuYW1lfS0le3ZlcnNpb259LnRhci5iejIKK1NvdXJjZTE6IGJ1c3lib3gtc3RhdGljLmNvbmZpZworU291cmNlMjogYnVzeWJveC1wZXRpdGJvb3QuY29uZmlnCitTb3VyY2UzOiBodHRwOi8vd3d3LnVjbGliYy5vcmcvZG93bmxvYWRzL3VDbGliYy0wLjkuMzAuMS50YXIuYnoyCitTb3VyY2U0OiB1Q2xpYmMuY29uZmlnCitQYXRjaDE2OiBidXN5Ym94LTEuMTAuMS1od2Nsb2NrLnBhdGNoCisjIHBhdGNoIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGdldGxpbmUoKSBmcm9tIHN0ZGlvLmgsIGFscmVhZHkgcHJlc2VudCBpbiB1cHN0cmVhbSBWQ1MKK1BhdGNoMjI6IHVDbGliYy0wLjkuMzAuMS1nZXRsaW5lLnBhdGNoCitPYnNvbGV0ZXM6IGJ1c3lib3gtYW5hY29uZGEKK1VSTDogaHR0cDovL3d3dy5idXN5Ym94Lm5ldAorQnVpbGRSb290OiAle190bXBwYXRofS8le25hbWV9LSV7dmVyc2lvbn0tJXtyZWxlYXNlfS1yb290LSUoJXtfX2lkX3V9IC1uKQorQnVpbGRSZXF1aXJlczogbGlic2VsaW51eC1kZXZlbCA+PSAxLjI3LjctMgorQnVpbGRSZXF1aXJlczogbGlic2Vwb2wtZGV2ZWwKK0J1aWxkUmVxdWlyZXM6IGxpYnNlbGludXgtc3RhdGljCitCdWlsZFJlcXVpcmVzOiBsaWJzZXBvbC1zdGF0aWMKK0J1aWxkUmVxdWlyZXM6IGdsaWJjLXN0YXRpYworCislZGVmaW5lIGRlYnVnX3BhY2thZ2UgJXtuaWx9CisKKyVwYWNrYWdlIHBldGl0Ym9vdAorR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9TaGVsbHMKK1N1bW1hcnk6IFZlcnNpb24gb2YgYnVzeWJveCBjb25maWd1cmVkIGZvciB1c2Ugd2l0aCBwZXRpdGJvb3QKKworJWRlc2NyaXB0aW9uCitCdXN5Ym94IGlzIGEgc2luZ2xlIGJpbmFyeSB3aGljaCBpbmNsdWRlcyB2ZXJzaW9ucyBvZiBhIGxhcmdlIG51bWJlcgorb2Ygc3lzdGVtIGNvbW1hbmRzLCBpbmNsdWRpbmcgYSBzaGVsbC4gIFRoaXMgcGFja2FnZSBjYW4gYmUgdmVyeQordXNlZnVsIGZvciByZWNvdmVyaW5nIGZyb20gY2VydGFpbiB0eXBlcyBvZiBzeXN0ZW0gZmFpbHVyZXMsCitwYXJ0aWN1bGFybHkgdGhvc2UgaW52b2x2aW5nIGJyb2tlbiBzaGFyZWQgbGlicmFyaWVzLgorCislZGVzY3JpcHRpb24gcGV0aXRib290CitCdXN5Ym94IGlzIGEgc2luZ2xlIGJpbmFyeSB3aGljaCBpbmNsdWRlcyB2ZXJzaW9ucyBvZiBhIGxhcmdlIG51bWJlcgorb2Ygc3lzdGVtIGNvbW1hbmRzLCBpbmNsdWRpbmcgYSBzaGVsbC4gIFRoZSB2ZXJzaW9uIGNvbnRhaW5lZCBpbiB0aGlzCitwYWNrYWdlIGlzIGEgbWluaW1hbCBjb25maWd1cmF0aW9uIGludGVuZGVkIGZvciB1c2Ugd2l0aCB0aGUgUGV0aXRib290Citib290bG9hZGVyIHVzZWQgb24gUGxheVN0YXRpb24gMy4gVGhlIGJ1c3lib3ggcGFja2FnZSBwcm92aWRlcyBhIGJpbmFyeQorYmV0dGVyIHN1aXRlZCB0byBub3JtYWwgdXNlLgorCislcHJlcAorJXNldHVwIC1xIC1hMworJXBhdGNoMTYgLWIgLmlhNjQgLXAxCitjYXQgJXtTT1VSQ0U0fSA+dUNsaWJjLTAuOS4zMC4xLy5jb25maWcxCislcGF0Y2gyMiAtYiAuZ2V0bGluZSAtcDEKKworJWJ1aWxkCisjIGNyZWF0ZSBzdGF0aWMgYnVzeWJveCAtIHRoZSBleGVjdXRhYmxlIGlzIGtlcHQgYXMgYnVzeWJveC1zdGF0aWMKKyMgV2UgdXNlIHVjbGliYyBpbnN0ZWFkIG9mIHN5c3RlbSBnbGliYywgdWNsaWJjIGlzIHNldmVyYWwgdGltZXMKKyMgc21hbGxlciwgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIHN0YXRpYyBidWlsZC4KKyMgQnVpbGQgdWNsaWJjIGZpcnN0LgorY2QgdUNsaWJjLTAuOS4zMC4xCisjIGZpeG1lOgorbWtkaXIga2VybmVsLWluY2x1ZGUKK2NwIC1hIC91c3IvaW5jbHVkZS9hc20ga2VybmVsLWluY2x1ZGUKK2NwIC1hIC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYyBrZXJuZWwtaW5jbHVkZQorY3AgLWEgL3Vzci9pbmNsdWRlL2xpbnV4IGtlcm5lbC1pbmNsdWRlCisjIHVjbGliYyBjYW4ndCBiZSBidWlsdCBvbiBwcGM2NCxzMzkwLGlhNjQsIHdlIHNldCAkYXJjaCB0byAiIiBpbiB0aGlzIGNhc2UKK2FyY2g9YHVuYW1lIC1tIHwgc2VkIC1lICdzL2kuODYvaTM4Ni8nIC1lICdzL3BwYy9wb3dlcnBjLycgLWUgJ3MvcHBjNjQvLycgLWUgJ3MvcG93ZXJwYzY0Ly8nIC1lICdzL2lhNjQvLycgLWUgJ3MvczM5MC4qLy8nYAorZWNobyAiVEFSR0VUXyRhcmNoPXkiID4uY29uZmlnCitlY2hvICJUQVJHRVRfQVJDSD1cIiRhcmNoXCIiID4+LmNvbmZpZworY2F0IC5jb25maWcxID4+LmNvbmZpZworaWYgdGVzdCAiJGFyY2giOyB0aGVuIHllcyAiIiB8IG1ha2Ugb2xkY29uZmlnOyBmaQoraWYgdGVzdCAiJGFyY2giOyB0aGVuIGNhdCAuY29uZmlnOyBmaQoraWYgdGVzdCAiJGFyY2giOyB0aGVuIG1ha2UgVj0xOyBmaQoraWYgdGVzdCAiJGFyY2giOyB0aGVuIG1ha2UgaW5zdGFsbDsgZmkKK2lmIHRlc3QgIiRhcmNoIjsgdGhlbiBtYWtlIGluc3RhbGxfa2VybmVsX2hlYWRlcnM7IGZpCitjZCAuLgorIyB3ZSBhcmUgYmFjayBpbiBidXN5Ym94LU5OLk1NIGRpciBub3cKK2NwICV7U09VUkNFMX0gLmNvbmZpZworIyBzZXQgYWxsIG5ldyBvcHRpb25zIHRvIGRlZmF1bHRzCit5ZXMgIiIgfCBtYWtlIG9sZGNvbmZpZworIyBnY2MgbmVlZHMgdG8gYmUgY29udmluY2VkIHRvIHVzZSBuZWl0aGVyIHN5c3RlbSBoZWFkZXJzLCBub3IgbGlicywKKyMgbm9yIHN0YXJ0ZmlsZXMgKGkuZS4gY3J0WFhYLm8gZmlsZXMpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gXAorICAgIG12IC5jb25maWcgLmNvbmZpZzEgJiYgXAorICAgIGdyZXAgLXYgXkNPTkZJR19TRUxJTlVYIC5jb25maWcxID4uY29uZmlnICYmIFwKKyAgICB5ZXMgIiIgfCBtYWtlIG9sZGNvbmZpZyAmJiBcCisgICAgY2F0IC5jb25maWcgJiYgXAorICAgIG1ha2UgVj0xIFwKKyAgICAgICAgRVhUUkFfQ0ZMQUdTPSItaXN5c3RlbSB1Q2xpYmMtMC45LjMwLjEvaW5zdGFsbGVkL2luY2x1ZGUiIFwKKyAgICAgICAgQ0ZMQUdTX2J1c3lib3g9Ii1zdGF0aWMgLW5vc3RhcnRmaWxlcyAtTHVDbGliYy0wLjkuMzAuMS9pbnN0YWxsZWQvbGliIHVDbGliYy0wLjkuMzAuMS9pbnN0YWxsZWQvbGliL2NydDEubyB1Q2xpYmMtMC45LjMwLjEvaW5zdGFsbGVkL2xpYi9jcnRpLm8gdUNsaWJjLTAuOS4zMC4xL2luc3RhbGxlZC9saWIvY3J0bi5vIjsgXAorZWxzZSBcCisgICAgY2F0IC5jb25maWcgJiYgXAorICAgIG1ha2UgVj0xIENDPSJnY2MgJFJQTV9PUFRfRkxBR1MiOyBcCitmaQorY3AgYnVzeWJveCBidXN5Ym94LnN0YXRpYworCisjIGNyZWF0ZSBidXN5Ym94IG9wdGltaXplZCBmb3IgcGV0aXRib290CittYWtlIGNsZWFuCisjIGNvcHkgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQorY3AgJXtTT1VSQ0UyfSAuY29uZmlnCisjIHNldCBhbGwgbmV3IG9wdGlvbnMgdG8gZGVmYXVsdHMKK3llcyAiIiB8IG1ha2Ugb2xkY29uZmlnCittYWtlIFY9MSBDQz0iJV9fY2MgJFJQTV9PUFRfRkxBR1MiCitjcCBidXN5Ym94IGJ1c3lib3gucGV0aXRib290CisKKyVpbnN0YWxsCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCitta2RpciAtcCAkUlBNX0JVSUxEX1JPT1Qvc2JpbgoraW5zdGFsbCAtbSA3NTUgYnVzeWJveC5zdGF0aWMgJFJQTV9CVUlMRF9ST09UL3NiaW4vYnVzeWJveAoraW5zdGFsbCAtbSA3NTUgYnVzeWJveC5wZXRpdGJvb3QgJFJQTV9CVUlMRF9ST09UL3NiaW4vYnVzeWJveC5wZXRpdGJvb3QKKworJWNsZWFuCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKKyVmaWxlcworJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKKyVkb2MgTElDRU5TRSBkb2NzL2J1c3lib3gubmV0LyouaHRtbAorL3NiaW4vYnVzeWJveAorCislZmlsZXMgcGV0aXRib290CislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJWRvYyBMSUNFTlNFCisvc2Jpbi9idXN5Ym94LnBldGl0Ym9vdAorCislY2hhbmdlbG9nCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kZXBtb2QgYi9leGFtcGxlcy9kZXBtb2QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDc2OTU5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RlcG1vZApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKyMKKyMgU2ltcGxlIGRlcG1vZCwgdXNlIHRvIGdlbmVyYXRlIG1vZHByb2JlLmNvbmYKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyMKKworbG9jYWwgQkFTRT0iJHsxOi0vdXNyL2xpYi9tb2R1bGVzfSIKKworZmluZCAiJEJBU0UiIC1uYW1lICcqLmtvLmd6JyB8IHdoaWxlIHJlYWQgSSA7IGRvCisJTj1gYmFzZW5hbWUgIiRJIiAnLmtvLmd6J2AKKwllY2hvIC1uICJAJE4iCisJemNhdCAiJEkiIHwgc3RyaW5ncyB8IGdyZXAgJ15kZXBlbmRzPScgfCBzZWQgLWUgJ3MvXmRlcGVuZHM9JC8vJyAtZSAncy9eZGVwZW5kcz0vLC8nIC1lICdzLywvIEAvZycKK2RvbmUgfCBhd2sgJworeworCSMgbW9kdWxlcyB3aGljaCBoYXMgbm8gZGVwZW5kZW5jaWVzIGFyZSByZXNvbHZlZAorCWlmICggTkYgPT0gMSApIHsgcmVzWyQxXSA9ICIiOyBuZXh0IH0KKwkjIG90aGVycyBoYXZlIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRob3NlIHdoaWNoIGFscmVhZHkgcmVzb2x2ZWQKKwlpID0gJDE7ICQxID0gIiI7IGRlcHNbaV0gPSAkMDsgKytuZGVwcworfQorRU5EIHsKKwkjIHJlc29sdmUgaW1wbGljaXQgZGVwZW5kZW5jaWVzCisJd2hpbGUgKCBuZGVwcyApIGZvciAobW9kIGluIGRlcHMpIHsKKwkJaWYgKCBpbmRleChkZXBzW21vZF0sICJAIikgPiAwICkgeworCQkJJDAgPSBkZXBzW21vZF0KKwkJCWZvciAoIGk9MTsgaTw9TkY7ICsraSApIHsKKwkJCQlpZiAoIHN1YnN0cigkaSwxLDEpID09ICJAIiApIHsKKwkJCQkJaWYgKCAkaSBpbiByZXMgKSB7CisJCQkJCQkkaSA9IHJlc1skaV0gIiAiIHN1YnN0cigkaSwyKQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZGVwc1ttb2RdID0gJDAKKwkJfSBlbHNlIHsKKwkJCXJlc1ttb2RdID0gZGVwc1ttb2RdCisJCQlkZWxldGUgZGVwc1ttb2RdCisJCQktLW5kZXBzCisJCX0KKwl9CisKKwkjIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gbW9kdWxlcy5kZXAgZm9ybWF0CisJZm9yICggbW9kIGluIHJlcyApIHsKKwkJJDAgPSByZXNbbW9kXQorCQlzID0gIiIKKwkJZGVsZXRlIGEKKwkJZm9yICggaT0xOyBpPD1ORjsgKytpICkgeworCQkJaWYgKCAhICgkaSBpbiBhKSApIHsKKwkJCQlhWyRpXSA9ICRpCisJCQkJcyA9ICIgLCIgJGkgcworCQkJfQorCQl9CisJCXByaW50ICIsIiBzdWJzdHIobW9kLDIpICI6IiBzCisJfQorfQorJyB8IHNvcnQgfCBzZWQgLXIgLWUgInMhLChbXiw6IF0qKSEvdXNyL2xpYi9tb2R1bGVzL1xcMS5rby5neiFnIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGVwbW9kLnBsIGIvZXhhbXBsZXMvZGVwbW9kLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYzMjRiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9kZXBtb2QucGwKQEAgLTAsMCArMSwzNTMgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIyB2aTogc2V0IHN3PTQgdHM9NDoKKyMgQ29weXJpZ2h0IChjKSAyMDAxIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDEgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDEgU3R1YXJ0IEh1Z2hlcyA8c2VoQHplZTIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMDIgU3RldmVuIEouIEhpbGwgPHNoaWxsQGJyb2FkY29tLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMgPHN0dWFydGhAZnJlZXNjYWxlLmNvbT4KKyMKKyMgSGlzdG9yeToKKyMgTWFyY2ggMjAwNjogU3R1YXJ0IEh1Z2hlcyA8c3R1YXJ0aEBmcmVlc2NhbGUuY29tPi4KKyMgICAgICAgICAgICAgU2lnbmlmaWNhbnQgdXBkYXRlcywgaW5jbHVkaW5nIGltcGxlbWVudGluZyB0aGUgJy1GJyBvcHRpb24KKyMgICAgICAgICAgICAgYW5kIGFkZGluZyBzdXBwb3J0IGZvciAyLjYga2VybmVscy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KK3VzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldiBub19pZ25vcmVfY2FzZSk7Cit1c2UgRmlsZTo6RmluZDsKK3VzZSBzdHJpY3Q7CisKKyMgU2V0IHVwIHNvbWUgZGVmYXVsdCB2YWx1ZXMKK215ICRrZGlyPSIiOworbXkgJGJhc2VkaXI9IiI7CitteSAka2VybmVsPSIiOworbXkgJGtlcm5lbHN5bXM9IiI7CitteSAkc3ltcHJlZml4PSIiOworbXkgJGFsbD0wOworbXkgJHF1aWNrPTA7CitteSAkZXJyc3ltcz0wOworbXkgJHN0ZG91dD0wOworbXkgJHZlcmJvc2U9MDsKK215ICRoZWxwPTA7CitteSAkbm0gPSAkRU5WeydOTSd9IHx8ICJubSI7CisKKyMgbW9yZSBnbG9iYWxzCitteSAoQGxpYmxpc3QpID0gKCk7CitteSAkZXhwID0ge307CitteSAkZGVwID0ge307CitteSAkbW9kID0ge307CisKK215ICR1c2FnZSA9IDw8VFhUOworJDAgLWIgYmFzZWRpciB7IC1rIDx2bWxpbnV4PiB8IC1GIDxTeXN0ZW0ubWFwPiB9IFtvcHRpb25zXS4uLgorICBXaGVyZToKKyAgIC1oIC0taGVscCAgICAgICAgICA6IFNob3cgdGhpcyBoZWxwIHNjcmVlbgorICAgLWIgLS1iYXNlZGlyICAgICAgIDogTW9kdWxlcyBiYXNlIGRpcmVjdG9yeSAoZS5nIC9saWIvbW9kdWxlcy88Mi54Lnk+KQorICAgLWsgLS1rZXJuZWwgICAgICAgIDogS2VybmVsIGJpbmFyeSBmb3IgdGhlIHRhcmdldCAoZS5nLiB2bWxpbnV4KQorICAgLUYgLS1rZXJuZWxzeW1zICAgIDogS2VybmVsIHN5bWJvbCBmaWxlIChlLmcuIFN5c3RlbS5tYXApCisgICAtbiAtLXN0ZG91dCAgICAgICAgOiBXcml0ZSB0byBzdGRvdXQgaW5zdGVhZCBvZiA8YmFzZWRpcj4vbW9kdWxlcy5kZXAKKyAgIC12IC0tdmVyYm9zZSAgICAgICA6IFByaW50IG91dCBsb3RzIG9mIGRlYnVnZ2luZyBzdHVmZgorICAgLVAgLS1zeW1ib2wtcHJlZml4IDogU3ltYm9sIHByZWZpeAorICAgLWEgLS1hbGwgICAgICAgICAgIDogUHJvYmUgYWxsIG1vZHVsZXMgKGRlZmF1bHQvb25seSB0aGluZyBzdXBwb3J0ZWQpCisgICAtZSAtLWVycnN5bXMgICAgICAgOiBSZXBvcnQgYW55IHN5bWJvbHMgbm90IHN1cHBsaWVkIGJ5IG1vZHVsZXMva2VybmVsCitUWFQKKworIyBnZXQgY29tbWFuZC1saW5lIG9wdGlvbnMKK0dldE9wdGlvbnMoCisJImhlbHB8aCIgICAgICAgICAgICA9PiBcJGhlbHAsCisJImJhc2VkaXJ8Yj1zIiAgICAgICA9PiBcJGJhc2VkaXIsCisJImtlcm5lbHxrPXMiICAgICAgICA9PiBcJGtlcm5lbCwKKwkia2VybmVsc3ltc3xGPXMiICAgID0+IFwka2VybmVsc3ltcywKKwkic3Rkb3V0fG4iICAgICAgICAgID0+IFwkc3Rkb3V0LAorCSJ2ZXJib3NlfHYiICAgICAgICAgPT4gXCR2ZXJib3NlLAorCSJzeW1ib2wtcHJlZml4fFA9cyIgPT4gXCRzeW1wcmVmaXgsCisJImFsbHxhIiAgICAgICAgICAgICA9PiBcJGFsbCwKKwkjIHVuc3VwcG9ydGVkIG9wdGlvbnMKKwkicXVpY2t8QSIgICAgICAgICAgID0+IFwkcXVpY2ssCisJIyBpZ25vcmVkIG9wdGlvbnMgKGZvciBoaXN0b3JpY2FsIHVzYWdlKQorCSJxdWlldHxxIiwKKwkicm9vdHxyIiwKKwkidW5yZXNvbHZlZC1lcnJvcnx1IgorKTsKKworZGllICR1c2FnZSBpZiAkaGVscDsKK2RpZSAkdXNhZ2UgdW5sZXNzICRiYXNlZGlyICYmICggJGtlcm5lbCB8fCAka2VybmVsc3ltcyApOworZGllICJjYW4ndCB1c2UgYm90aCAtayBhbmQgLUZcblxuJHVzYWdlIiBpZiAka2VybmVsICYmICRrZXJuZWxzeW1zOworZGllICJzb3JyeSwgLUEvLS1xdWljayBpcyBub3Qgc3VwcG9ydGVkIiBpZiAkcXVpY2s7CitkaWUgIi0tZXJyc3ltcyByZXF1aXJlcyAtLWtlcm5lbHN5bXMiIGlmICRlcnJzeW1zICYmICEka2VybmVsc3ltczsKKworIyBTdHJpcCBhbnkgdHJhaWxpbmcgb3IgbXVsdGlwbGUgc2xhc2hlcyBmcm9tIGJhc2VkaXIKKyRiYXNlZGlyID1+IHMtLyskLS1nOworCisjIFRoZSBiYXNlIGRpcmVjdG9yeSBzaG91bGQgY29udGFpbiAvbGliL21vZHVsZXMgc29tZXdoZXJlCitpZigkYmFzZWRpciAhfiBtLS9saWIvbW9kdWxlcy0pIHsKKyAgICB3YXJuICJXQVJOSU5HOiBiYXNlIGRpcmVjdG9yeSBkb2VzIG5vdCBtYXRjaCAuLi4uL2xpYi9tb2R1bGVzXG4iOworfQorCisjIGlmIG5vIGtlcm5lbCB2ZXJzaW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgYmFzZWRpciwgdHJ5IHRvIGZpbmQgb25lCitpZigkYmFzZWRpciAhfiBtLS9saWIvbW9kdWxlcy9cZFwuXGQtKSB7CisgICAgb3BlbmRpcihCRCwgJGJhc2VkaXIpIG9yIGRpZSAiY2FuJ3Qgb3BlbiBiYXNlZGlyICRiYXNlZGlyIDogJCFcbiI7CisgICAgZm9yZWFjaCAoIHJlYWRkaXIoQkQpICkgeworICAgICAgICBuZXh0IGlmIC9eXC5cLj8kLzsKKyAgICAgICAgbmV4dCB1bmxlc3MgLWQgIiRiYXNlZGlyLyRfIjsKKyAgICAgICAgd2FybiAiZGlyID0gJF9cbiIgaWYgJHZlcmJvc2U7CisgICAgICAgIGlmKCAvXlxkXC5cZC8gKSB7CisgICAgICAgICAgICAka2RpciA9ICRfOworICAgICAgICAgICAgd2FybigiR3Vlc3NlZCBtb2R1bGUgZGlyZWN0b3J5IGFzICRiYXNlZGlyLyRrZGlyXG4iKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2VkaXIoQkQpOworICAgIGRpZSAiQ2Fubm90IGZpbmQgYSBrZXJuZWwgdmVyc2lvbiB1bmRlciAkYmFzZWRpclxuIiB1bmxlc3MgJGtkaXI7CisgICAgJGJhc2VkaXIgPSAiJGJhc2VkaXIvJGtkaXIiOworfQorCisjIEZpbmQgdGhlIGxpc3Qgb2YgLm8gb3IgLmtvIGZpbGVzIGxpdmluZyB1bmRlciAkYmFzZWRpcgord2FybiAiKioqKiBMb2NhdGluZyBhbGwgbW9kdWxlc1xuIiBpZiAkdmVyYm9zZTsKK2ZpbmQgc3ViIHsKKyAgICBteSAkZmlsZTsKKwlpZiAoIC1mICRfICAmJiAhIC1kICRfICkgeworCQkkZmlsZSA9ICRGaWxlOjpGaW5kOjpuYW1lOworCQlpZiAoICRmaWxlID1+IC9cLms/byQvICkgeworCQkJcHVzaChAbGlibGlzdCwgJGZpbGUpOworCQkJd2FybiAiJGZpbGVcbiIgaWYgJHZlcmJvc2U7CisJCX0KKwl9Cit9LCAkYmFzZWRpcjsKK3dhcm4gIioqKiogRmluaXNoZWQgbG9jYXRpbmcgbW9kdWxlc1xuIiBpZiAkdmVyYm9zZTsKKworZm9yZWFjaCBteSAkb2JqICggQGxpYmxpc3QgKXsKKyAgICAjIHR1cm4gdGhlIGlucHV0IGZpbGUgbmFtZSBpbnRvIGEgdGFyZ2V0IHRhZyBuYW1lCisgICAgbXkgKCR0Z3RuYW1lKSA9ICRvYmogPX4gbS0oL2xpYi9tb2R1bGVzLy4qKSQtOworCisgICAgd2FybiAiXG5NT0RVTEUgPSAkdGd0bmFtZVxuIiBpZiAkdmVyYm9zZTsKKworICAgICMgZ2V0IGEgbGlzdCBvZiBzeW1ib2xzCisJbXkgQG91dHB1dD1gJG5tICRvYmpgOworCisgICAgYnVpbGRfcmVmX3RhYmxlcygkdGd0bmFtZSwgXEBvdXRwdXQsICRleHAsICRkZXApOworfQorCisKKyMgdm1saW51eCBpcyBhIHNwZWNpYWwgbmFtZSB0aGF0IGlzIG9ubHkgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMKK215ICR0Z3RuYW1lID0gJ3ZtbGludXgnOworbXkgQG91dHB1dCA9ICRrZXJuZWxzeW1zID8gYGNhdCAka2VybmVsc3ltc2AgOiBgJG5tICRrZXJuZWxgOword2FybiAiXG5NT0RVTEUgPSAkdGd0bmFtZVxuIiBpZiAkdmVyYm9zZTsKK2J1aWxkX3JlZl90YWJsZXMoJHRndG5hbWUsIFxAb3V0cHV0LCAkZXhwLCAkZGVwKTsKKworIyByZXNvbHZlIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggbW9kdWxlCisjIHJlZHVjZSBkZXBlbmRlbmNpZXM6IHJlbW92ZSB1bnJlc29sdmFibGUgYW5kIHJlc29sdmVkIGZyb20gdm1saW51eC9TeXN0ZW0ubWFwCisjIHJlbW92ZSBkdXBsaWNhdGVzCitmb3JlYWNoIG15ICRtb2R1bGUgKGtleXMgJSRkZXApIHsKKyAgICB3YXJuICJyZWR1Y2luZyBtb2R1bGU6ICRtb2R1bGVcbiIgaWYgJHZlcmJvc2U7CisgICAgJG1vZC0+eyRtb2R1bGV9ID0ge307CisgICAgZm9yZWFjaCAoQHskZGVwLT57JG1vZHVsZX19KSB7CisgICAgICAgIGlmKCAkZXhwLT57JF99ICkgeworICAgICAgICAgICAgd2FybiAicmVzb2x2ZWQgc3ltYm9sICRfIGluIGZpbGUgJGV4cC0+eyRffVxuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgICAgIG5leHQgaWYgJGV4cC0+eyRffSA9fiAvdm1saW51eC87CisgICAgICAgICAgICAkbW9kLT57JG1vZHVsZX17JGV4cC0+eyRffX0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FybiAidW5yZXNvbHZlZCBzeW1ib2wgJF8gaW4gZmlsZSAkbW9kdWxlXG4iOworICAgICAgICB9CisgICAgfQorfQorCisjIGJ1aWxkIGEgY29tcGxldGUgZGVwZW5kZW5jeSBsaXN0IGZvciBlYWNoIG1vZHVsZSBhbmQgbWFrZSBzdXJlIGl0CisjIGlzIGtlcHQgaW4gb3JkZXIgcHJvcGVyIG9yZGVyCitteSAkbW9kMiA9IHt9Oworc3ViIG1heWJlX3Vuc2hpZnQKK3sKKwlteSAoJGFycmF5LCAkZWxlKSA9IEBfOworCSMgY2hvcCBvZmYgdGhlIGxlYWRpbmcgcGF0aCAvbGliL21vZHVsZXMvPGt2ZXI+LyBhcyBtb2Rwcm9iZQorCSMgd2lsbCBoYW5kbGUgcmVsYXRpdmUgcGF0aHMganVzdCBmaW5lCisJJGVsZSA9fiBzOl4vbGliL21vZHVsZXMvW14vXSovOjo7CisJZm9yZWFjaCAoQHskYXJyYXl9KSB7CisJCWlmICgkXyBlcSAkZWxlKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdW5zaGlmdCAoQHskYXJyYXl9LCAkZWxlKTsKK30KK3N1YiBhZGRfbW9kX2RlcHMKK3sKKwlteSAoJGRlcHRoLCAkbW9kLCAkbW9kMiwgJG1vZHVsZSwgJHRoaXNfbW9kdWxlKSA9IEBfOworCisJJGRlcHRoIC49ICIgIjsKKwl3YXJuICIke2RlcHRofWxvYWRpbmcgZGVwcyBvZiBtb2R1bGU6ICR0aGlzX21vZHVsZVxuIiBpZiAkdmVyYm9zZTsKKwlpZiAobGVuZ3RoKCRkZXB0aCkgPiA1MCkgeworCQlkaWUgInRvbyBtdWNoIHJlY3Vyc2lvbiAoY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGluIG1vZHVsZXM/KSI7CisJfQorCisJZm9yZWFjaCBteSAkbWQgKGtleXMgJXskbW9kLT57JHRoaXNfbW9kdWxlfX0pIHsKKwkJYWRkX21vZF9kZXBzICgkZGVwdGgsICRtb2QsICRtb2QyLCAkbW9kdWxlLCAkbWQpOworCQl3YXJuICIke2RlcHRofSBvdXRwdXR0aW5nICRtZFxuIiBpZiAkdmVyYm9zZTsKKwkJbWF5YmVfdW5zaGlmdCAoXEB7JCRtb2QyLT57JG1vZHVsZX19LCAkbWQpOworCX0KKworCWlmICghJXskbW9kLT57JHRoaXNfbW9kdWxlfX0pIHsKKwkJd2FybiAiJHtkZXB0aH0gbm8gZGVwc1xuIiBpZiAkdmVyYm9zZTsKKwl9Cit9Citmb3JlYWNoIG15ICRtb2R1bGUgKGtleXMgJSRtb2QpIHsKKwl3YXJuICJmaWxsaW5nIG91dCBtb2R1bGU6ICRtb2R1bGVcbiIgaWYgJHZlcmJvc2U7CisJQHskbW9kMi0+eyRtb2R1bGV9fSA9ICgpOworCWFkZF9tb2RfZGVwcyAoIiIsICRtb2QsIFwkbW9kMiwgJG1vZHVsZSwgJG1vZHVsZSk7Cit9CisKKyMgZmlndXJlIG91dCB3aGVyZSB0aGUgb3V0cHV0IHNob3VsZCBnbworaWYgKCRzdGRvdXQgPT0gMCkgeworCXdhcm4gIndyaXRpbmcgJGJhc2VkaXIvbW9kdWxlcy5kZXBcbiIgaWYgJHZlcmJvc2U7CisgICAgb3BlbihTVERPVVQsICI+JGJhc2VkaXIvbW9kdWxlcy5kZXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkaWUgImNhbm5vdCBvcGVuICRiYXNlZGlyL21vZHVsZXMuZGVwOiAkISI7Cit9CitteSAka3NlcmllcyA9ICRiYXNlZGlyID1+IG0sLzJcLjZcLlteL10qLCA/ICcyLjYnIDogJzIuNCc7CisKK2ZvcmVhY2ggbXkgJG1vZHVsZSAoIGtleXMgJSRtb2QgKSB7CisgICAgaWYoJGtzZXJpZXMgZXEgJzIuNCcpIHsKKwkgICAgcHJpbnQgIiRtb2R1bGU6XHQiOworCSAgICBteSBAc29ydGVkID0gc29ydCBieWRlcCBrZXlzICV7JG1vZC0+eyRtb2R1bGV9fTsKKwkgICAgcHJpbnQgam9pbigiIFxcXG5cdCIsQHNvcnRlZCk7CisJICAgIHByaW50ICJcblxuIjsKKyAgICB9IGVsc2UgeworCSAgICBteSAkc2hvcnRtb2QgPSAkbW9kdWxlOworCSAgICAkc2hvcnRtb2QgPX4gczpeL2xpYi9tb2R1bGVzL1teL10qLzo6OworCSAgICBwcmludCAiJHNob3J0bW9kOiI7CisJICAgIG15IEBzb3J0ZWQgPSBAeyRtb2QyLT57JG1vZHVsZX19OworCSAgICBwcmludGYgIiAiIGlmIEBzb3J0ZWQ7CisJICAgIHByaW50IGpvaW4oIiAiLEBzb3J0ZWQpOworCSAgICBwcmludCAiXG4iOworICAgIH0KK30KKworCitzdWIgYnVpbGRfcmVmX3RhYmxlcworeworICAgIG15ICgkbmFtZSwgJHN5bV9hciwgJGV4cCwgJGRlcCkgPSBAXzsKKworCW15ICRrc3ltdGFiID0gZ3JlcCBtLyAke3N5bXByZWZpeH1fX2tzeW10YWIvLCBAJHN5bV9hcjsKKworICAgICMgZ2F0aGVyIHRoZSBleHBvcnRlZCBzeW1ib2xzCisJaWYoJGtzeW10YWIpeworICAgICAgICAjIGV4cGxpY2l0bHkgZXhwb3J0ZWQKKyAgICAgICAgZm9yZWFjaCAoIEAkc3ltX2FyICkgeworICAgICAgICAgICAgLyAke3N5bXByZWZpeH1fX2tzeW10YWJfKC4qKSQvIGFuZCBkbyB7CisgICAgICAgICAgICAgICAgbXkgJHN5bSA9ICR7c3ltcHJlZml4fSAuICQxOworICAgICAgICAgICAgICAgIHdhcm4gInN5bSA9ICRzeW1cbiIgaWYgJHZlcmJvc2U7CisgICAgICAgICAgICAgICAgJGV4cC0+eyRzeW19ID0gJG5hbWU7CisgICAgICAgICAgICB9OworICAgICAgICB9CisJfSBlbHNlIHsKKyAgICAgICAgIyBleHBvcnRpbmcgYWxsIHN5bWJvbHMKKyAgICAgICAgZm9yZWFjaCAoIEAkc3ltX2FyICkgeworICAgICAgICAgICAgLyBbQUJDREdSU1RXXSAoLiopJC8gYW5kIGRvIHsKKyAgICAgICAgICAgICAgICB3YXJuICJzeW1hID0gJDFcbiIgaWYgJHZlcmJvc2U7CisgICAgICAgICAgICAgICAgJGV4cC0+eyQxfSA9ICRuYW1lOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCX0KKworICAgICMgdGhpcyB0YWtlcyBtYWtlcyBzdXJlIG1vZHVsZXMgd2l0aCBubyBkZXBlbmRlbmNpZXMgZ2V0IGxpc3RlZAorICAgIHB1c2ggQHskZGVwLT57JG5hbWV9fSwgJHN5bXByZWZpeCAuICdwcmludGsnIHVubGVzcyAkbmFtZSBlcSAndm1saW51eCc7CisKKyAgICAjIGdhdGhlciB0aGUgdW5yZXNvbHZlZCBzeW1ib2xzCisgICAgZm9yZWFjaCAoIEAkc3ltX2FyICkgeworICAgICAgICAhLyAke3N5bXByZWZpeH1fX3RoaXNfbW9kdWxlLyAmJiAvIFUgKC4qKSQvIGFuZCBkbyB7CisgICAgICAgICAgICB3YXJuICJ1bmQgPSAkMVxuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgICAgIHB1c2ggQHskZGVwLT57JG5hbWV9fSwgJDE7CisgICAgICAgIH07CisgICAgfQorfQorCitzdWIgYnlkZXAKK3sKKyAgICBmb3JlYWNoIG15ICRmICgga2V5cyAleyRtb2QtPnskYn19ICkgeworICAgICAgICBpZigkZiBlcSAkYSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKKworX19FTkRfXworCis9aGVhZDEgTkFNRQorCitkZXBtb2QucGwgLSBhIGNyb3NzIHBsYXRmb3JtIHNjcmlwdCB0byBnZW5lcmF0ZSBrZXJuZWwgbW9kdWxlCitkZXBlbmRlbmN5IGxpc3RzIChtb2R1bGVzLmNvbmYpIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgYnkgbW9kcHJvYmUKK29uIHRoZSB0YXJnZXQgcGxhdGZvcm0uCisKK0l0IHN1cHBvcnRzIExpbnV4IDIuNCBhbmQgMi42IHN0eWxlcyBvZiBtb2R1bGVzLmNvbmYgKGF1dG8tZGV0ZWN0ZWQpCisKKz1oZWFkMSBTWU5PUFNJUworCitkZXBtb2QucGwgW09QVElPTl0uLi4gW2Jhc2VkaXJdLi4uCisKK0V4YW1wbGU6CisKKwlkZXBtb2QucGwgLUYgbGludXgvU3lzdGVtLm1hcCAtYiB0YXJnZXQvbGliL21vZHVsZXMvMi42LjExCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgcHVycG9zZSBvZiB0aGlzIHNjcmlwdCBpcyB0byBhdXRvbWFnaWNhbGx5IGdlbmVyYXRlIGEgbGlzdCBvZiBvZiBrZXJuZWwKK21vZHVsZSBkZXBlbmRlbmNpZXMuICBUaGlzIHNjcmlwdCBwcm9kdWNlcyBkZXBlbmRlbmN5IGxpc3RzIHRoYXQgc2hvdWxkIGJlCitpZGVudGljYWwgdG8gdGhlIGRlcG1vZCBwcm9ncmFtIGZyb20gdGhlIG1vZHV0aWxzIHBhY2thZ2UuICBVbmxpa2UgdGhlIGRlcG1vZAorYmluYXJ5LCBob3dldmVyLCBkZXBtb2QucGwgaXMgZGVzaWduZWQgdG8gYmUgcnVuIG9uIHlvdXIgaG9zdCBzeXN0ZW0sIG5vdAorb24geW91ciB0YXJnZXQgc3lzdGVtLgorCitUaGlzIHNjcmlwdCB3YXMgd3JpdHRlbiBieSBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4gdG8gYmUgdXNlZCBpbgorY29uanVuY3Rpb24gd2l0aCB0aGUgQnVzeUJveCBtb2Rwcm9iZSBhcHBsZXQuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyIDQKKworPWl0ZW0gQjwtaCAtLWhlbHA+CisKK1RoaXMgZGlzcGxheXMgdGhlIGhlbHAgbWVzc2FnZS4KKworPWl0ZW0gQjwtYiAtLWJhc2VkaXI+CisKK1RoZSBiYXNlIGRpcmVjdG9yeSB1bmVyIHdoaWNoIHRoZSB0YXJnZXQncyBtb2R1bGVzIHdpbGwgYmUgZm91bmQuICBUaGlzCitkZWZhdWx0cyB0byB0aGUgL2xpYi9tb2R1bGVzIGRpcmVjdG9yeS4KKworSWYgeW91IGRvbid0IHNwZWNpZnkgdGhlIGtlcm5lbCB2ZXJzaW9uLCB0aGlzIHNjcmlwdCB3aWxsIHNlYXJjaCBmb3IKK29uZSB1bmRlciB0aGUgc3BlY2lmaWVkIGJhc2VkIGRpcmVjdG9yeSBhbmQgdXNlIHRoZSBmaXJzdCB0aGluZyB0aGF0Citsb29rcyBsaWtlIGEga2VybmVsIHZlcnNpb24uCisKKz1pdGVtIEI8LWsgLS1rZXJuZWw+CisKK0tlcm5lbCBiaW5hcnkgZm9yIHRoZSB0YXJnZXQgKHZtbGludXgpLiAgWW91IG11c3QgZWl0aGVyIHN1cHBseSBhIGtlcm5lbCBiaW5hcnkKK29yIGEga2VybmVsIHN5bWJvbCBmaWxlICh1c2luZyB0aGUgLUYgb3B0aW9uKS4KKworPWl0ZW0gQjwtRiAtLWtlcm5lbHN5bXM+CisKK0tlcm5lbCBzeW1ib2wgZmlsZSBmb3IgdGhlIHRhcmdldCAoU3lzdGVtLm1hcCkuCisKKz1pdGVtIEI8LW4gLS1zdGRvdXQ+CisKK1dyaXRlIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIG1vZHVsZXMuZGVwCitrZXJuZWwgYmluYXJ5IGZvciB0aGUgdGFyZ2V0ICh1c2luZyB0aGUgLWsgb3B0aW9uKS4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK1ZlcmJvc2UgKGRlYnVnKSBvdXRwdXQKKworPWJhY2sKKworPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQorCisgQ29weXJpZ2h0IChjKSAyMDAxIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorIENvcHlyaWdodCAoYykgMjAwMSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgQ29weXJpZ2h0IChjKSAyMDAxIFN0dWFydCBIdWdoZXMgPHNlaEB6ZWUyLmNvbT4KKyBDb3B5cmlnaHQgKGMpIDIwMDIgU3RldmVuIEouIEhpbGwgPHNoaWxsQGJyb2FkY29tLmNvbT4KKyBDb3B5cmlnaHQgKGMpIDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYyA8c3R1YXJ0aEBmcmVlc2NhbGUuY29tPgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKz1oZWFkMSBBVVRIT1IKKworRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKz1jdXQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RldmZzZC5jb25mIGIvZXhhbXBsZXMvZGV2ZnNkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmMWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RldmZzZC5jb25mCkBAIC0wLDAgKzEsMTMzIEBACisjIFNhbXBsZSAvZXRjL2RldmZzZC5jb25mIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyMgUmljaGFyZCBHb29jaCAgPHJnb29jaEBhdG5mLmNzaXJvLmF1PgkJMTctRkVCLTIwMDIKKyMKKyMgYWRhcHRlZCBmb3IgYnVzeWJveCBkZXZmc2QgaW1wbGVtZW50YXRpb24gYnkgVGl0byA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisjCisjIEVuYWJsZSBmdWxsIGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igb2xkIGRldmljZSBuYW1lcy4gWW91IG1heSBjb21tZW50IHRoZXNlCisjIG91dCBpZiB5b3UgZG9uJ3QgdXNlIHRoZSBvbGQgZGV2aWNlIG5hbWVzLiBNYWtlIHN1cmUgeW91IGtub3cgd2hhdCB5b3UncmUKKyMgZG9pbmchCitSRUdJU1RFUgkuKgkJTUtPTERDT01QQVQKK1VOUkVHSVNURVIJLioJCVJNT0xEQ09NUEFUCisKKyMgWW91IG1heSBjb21tZW50IG91dCB0aGUgYWJvdmUgYW5kIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSd2ZQorIyBjb25maWd1cmVkIHlvdXIgc3lzdGVtIHRvIHVzZSB0aGUgb3JpZ2luYWwgIm5ldyIgZGV2ZnMgbmFtZXMgb3IgdGhlIHJlYWxseQorIyBuZXcgbmFtZXMKKyNSRUdJU1RFUgledmMvCQlNS09MRENPTVBBVAorI1VOUkVHSVNURVIJXnZjLwkJUk1PTERDT01QQVQKKyNSRUdJU1RFUglecHR5LwkJTUtPTERDT01QQVQKKyNVTlJFR0lTVEVSCV5wdHkvCQlSTU9MRENPTVBBVAorI1JFR0lTVEVSCV5taXNjLwkJTUtPTERDT01QQVQKKyNVTlJFR0lTVEVSCV5taXNjLwkJUk1PTERDT01QQVQKKworIyBZb3UgbWF5IGNvbW1lbnQgdGhlc2Ugb3V0IGlmIHlvdSBkb24ndCB1c2UgdGhlIG9yaWdpbmFsICJuZXciIG5hbWVzCitSRUdJU1RFUgkuKgkJTUtORVdDT01QQVQKK1VOUkVHSVNURVIJLioJCVJNTkVXQ09NUEFUCisKKyMgRW5hYmxlIG1vZHVsZSBhdXRvbG9hZGluZy4gWW91IG1heSBjb21tZW50IHRoaXMgb3V0IGlmIHlvdSBkb24ndCB1c2UKKyMgYXV0b2xvYWRpbmcKKyMgU3VwcG9ydGVkIGJ5IGJ1c3lib3ggd2hlbiBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgc2V0LgorIyBUaGlzIGFjdHVhbGx5IGRvZXNuJ3Qgd29yayB3aXRoIGJ1c3lib3ggIG1vZHV0aWxzIGJ1dCBuZWVkcworIyB0aGUgcmVhbCBtb2R1dGlscycgbW9kcHJvYmUKK0xPT0tVUAkJLioJCU1PRExPQUQKKworIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudCB0byBzZXQgdGhlIGdyb3VwIHRvICJ0dHkiIGZvciB0aGUKKyMgcHNldWRvLXR0eSBkZXZpY2VzLiBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IG1lc2coMSkgY2FuIGxhdGVyIGJlIHVzZWQgdG8KKyMgZW5hYmxlL2Rpc2FibGUgdGFsayByZXF1ZXN0cyBhbmQgd2FsbCgxKSBtZXNzYWdlcy4KK1JFR0lTVEVSCV5wdHkvcy4qCVBFUk1JU1NJT05TCS0xLnR0eQkwNjAwCisjUkVHSVNURVIJXnB0cy8uKgkJUEVSTUlTU0lPTlMJLTEudHR5CTA2MDAKKworIyBSZXN0b3JpbmcgL2Rldi9sb2cgb24gc3RhcnR1cCB3b3VsZCB0cmlnZ2VyIHRoZSBtaW5pbG9nZC9pbml0bG9nIGRlYWRsb2NrCisjIChtaW5pbG9nZCBmYWxzZWx5IGFzc3VtaW5nIHN5c2xvZ2QgaGFzIGJlZW4gc3RhcnRlZCkuCitSRUdJU1RFUglebG9nJAkJSUdOT1JFCitDUkVBVEUJCV5sb2ckCQlJR05PUkUKK0NIQU5HRQkJXmxvZyQJCUlHTk9SRQorREVMRVRFCQlebG9nJAkJSUdOT1JFCisKKyMKKyMgVW5jb21tZW50IHRoaXMgaWYgeW91IHdhbnQgcGVybWlzc2lvbnMgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkCisjIERvIG5vdCBkbyB0aGlzIGZvciBwc2V1ZG8tdGVybWluYWwgZGV2aWNlcworUkVHSVNURVIJXnB0W3N5XQkJSUdOT1JFCitDUkVBVEUJCV5wdFtzeV0JCUlHTk9SRQorQ0hBTkdFCQlecHRbc3ldCQlJR05PUkUKK0RFTEVURQkJXnB0W3N5XQkJSUdOT1JFCitSRUdJU1RFUgkuKgkJQ09QWQkvbGliL2Rldi1zdGF0ZS8kZGV2bmFtZSAkZGV2cGF0aAorQ1JFQVRFCQkuKgkJQ09QWQkkZGV2cGF0aCAvbGliL2Rldi1zdGF0ZS8kZGV2bmFtZQorQ0hBTkdFCQkuKgkJQ09QWQkkZGV2cGF0aCAvbGliL2Rldi1zdGF0ZS8kZGV2bmFtZQorI0RFTEVURQkJLioJCUNGVU5DVElPTiBHTE9CQUwgdW5saW5rIC9saWIvZGV2LXN0YXRlLyRkZXZuYW1lCisjIEJ1c3lib3gKK0RFTEVURQkJLioJCUVYRUNVVEUgL2Jpbi9ybSAtZgkJL2xpYi9kZXYtc3RhdGUvJGRldm5hbWUKKworUkVTVE9SRQkJL2xpYi9kZXYtc3RhdGUKKworIworIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB0aGUgb2xkIC9kZXYvY2Ryb20gc3ltbGluaworI1JFR0lTVEVSCV5jZHJvbXMvY2Ryb20wJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayAkZGV2bmFtZSBjZHJvbQorI1VOUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUNGVU5DVElPTiBHTE9CQUwgdW5saW5rIGNkcm9tCisjIGJ1c3lib3gKK1JFR0lTVEVSCV5jZHJvbXMvY2Ryb20wJAlFWEVDVVRFIC9iaW4vbG4gLXNmICRkZXZuYW1lIGNkcm9tCitVTlJFR0lTVEVSCV5jZHJvbXMvY2Ryb20wJAlFWEVDVVRFIC9iaW4vcm0gLWYgY2Ryb20KKworI1JFR0lTVEVSCV52NGwvdmlkZW8wJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayB2NGwvdmlkZW8wIHZpZGVvCisjVU5SRUdJU1RFUgledjRsL3ZpZGVvMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgdmlkZW8KKyNSRUdJU1RFUglecmFkaW8wJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayByYWRpbzAgcmFkaW8KKyNVTlJFR0lTVEVSCV5yYWRpbzAkCUNGVU5DVElPTiBHTE9CQUwgdW5saW5rIHJhZGlvCisjIEJ1c3lib3gKK1JFR0lTVEVSCV52NGwvdmlkZW8wJAlFWEVDVVRFIC9iaW4vbG4gLXNmIHY0bC92aWRlbzAgdmlkZW8KK1VOUkVHSVNURVIJXnY0bC92aWRlbzAkCUVYRUNVVEUgL2Jpbi9ybSAtZiB2aWRlbworUkVHSVNURVIJXnJhZGlvMCQJCUVYRUNVVEUgL2Jpbi9sbiAtc2YgIHJhZGlvMCByYWRpbworVU5SRUdJU1RFUglecmFkaW8wJAkJRVhFQ1VURSAvYmluL3JtIC1mIHJhZGlvCisKKyMgQUxTQSBzdHVmZgorI0xPT0tVUAkJc25kCQlNT0RMT0FEIEFDVElPTiBzbmQKKworIyBVbmNvbW1lbnQgdGhpcyB0byBsZXQgUEFNIG1hbmFnZSBkZXZmcworIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgkuKgkJQ0ZVTkNUSU9OIC9saWIvc2VjdXJpdHkvcGFtX2NvbnNvbGVfYXBwbHlfZGV2ZnNkLnNvIHBhbV9jb25zb2xlX2FwcGx5X3NpbmdsZSAkZGV2cGF0aAorCisjIFVuY29tbWVudCB0aGlzIHRvIG1hbmFnZSBVU0IgbW91c2UKKyMgTm90IHN1cHBvcnRlZCBieSBidXN5Ym94CisjUkVHSVNURVIJXmlucHV0L21vdXNlMCQJQ0ZVTkNUSU9OIEdMT0JBTCBta3N5bWxpbmsgJGRldm5hbWUgdXNibW91c2UKKyNVTlJFR0lTVEVSCV5pbnB1dC9tb3VzZTAkCUNGVU5DVElPTiBHTE9CQUwgdW5saW5rIHVzYm1vdXNlCisjIEJ1c3lib3gKKyNSRUdJU1RFUgleaW5wdXQvbW91c2UwJAlFWEVDVVRFIC9iaW4vbG4gLXNmICRkZXZuYW1lIHVzYm1vdXNlCisjVU5SRUdJU1RFUgleaW5wdXQvbW91c2UwJAlFWEVDVVRFIC9iaW4vcm0gLWYgdXNibW91c2UKKyMgTm90IHN1cHBvcnRlZCBieSBidXN5Ym94CisjUkVHSVNURVIJXmlucHV0L21pY2UkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rICRkZXZuYW1lIHVzYm1vdXNlCisjVU5SRUdJU1RFUgleaW5wdXQvbWljZSQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgdXNibW91c2UKKyMgQnVzeWJveAorUkVHSVNURVIJXmlucHV0L21pY2UkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgJGRldm5hbWUgdXNibW91c2UKK1VOUkVHSVNURVIJXmlucHV0L21pY2UkCUVYRUNVVEUgL2Jpbi9ybSAtZiB1c2Jtb3VzZQorCisjIElmIHlvdSBoYXZlIHJlbW92YWJsZSBtZWRpYSBhbmQgd2FudCB0byBmb3JjZSBtZWRpYSByZXZhbGlkYXRpb24gd2hlbiBsb29raW5nCisjIHVwIG5ldyBvciBvbGQgY29tcGF0aWJpbGl0eSBuYW1lcywgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMKKyMgU0NTSSBORVdDT01QQVQgIC9kZXYvc2QvKiBuYW1lcworTE9PS1VQCQleKHNkL2NbMC05XStiWzAtOV0rdFswLTldK3VbMC05XSspcFswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKyMgU0NTSSBPTERDT01QQVQgIC9kZXYvc2Q/PyBuYW1lcworTE9PS1VQCQleKHNkW2Etel0rKVswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKyMgSURFIE5FV0NPTVBBVCAgIC9kZXYvaWRlL2hkLyogbmFtZXMKK0xPT0tVUAkJXihpZGUvaGQvY1swLTldK2JbMC05XSt0WzAtOV0rdVswLTldKylwWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorIyBJREUgT0xEQ09NUEFUICAgL2Rldi9oZD8/IG5hbWVzCitMT09LVVAJCV4oaGRbYS16XSlbMC05XSskCUVYRUNVVEUgL2Jpbi9kZCBpZj0kbW50cG50L1wxIG9mPS9kZXYvbnVsbCBjb3VudD0xCisjIElERS1TQ1NJIE5FV0NPTVBBVCAgL2Rldi9zZC8qIG5hbWVzCisjTE9PS1VQCQleKHNkL2NbMC05XStiWzAtOV0rdFswLTldK3VbMC05XSspcFswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKyNTQ1NJIE9MRENPTVBBVCAgL2Rldi9zY2Q/IG5hbWVzCitMT09LVVAJCV4oc2NkKylbMC05XSskCUVYRUNVVEUgL2Jpbi9kZCBpZj0kbW50cG50L1wxIG9mPS9kZXYvbnVsbCBjb3VudD0xCisKKworUkVHSVNURVIgXmR2Yi9jYXJkWzAtOV0rL1teL10rJCBQRVJNSVNTSU9OUyByb290LnZpZGVvIDA2NjAKKyMgTm90IHN1cHBvcnRlZCBieSBidXN5Ym94CisjUkVHSVNURVIJXmR2Yi9jYXJkKFswLTldKykvKFteLzAtOV0qKVswLTldKyQJQ0ZVTkNUSU9OIEdMT0JBTCBta3N5bWxpbmsgL2Rldi8kZGV2bmFtZSBvc3QvXDJcMQorI1VOUkVHSVNURVIJXmR2Yi9jYXJkKFswLTldKykvKFteLzAtOV0qKVswLTldKyQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgb3N0L1wyXDEKKyMgQnVzeWJveAorUkVHSVNURVIJXmR2Yi9jYXJkKFswLTldKykvKFteLzAtOV0qKVswLTldKyQJRVhFQ1VURSAvYmluL2xuIC1zZiAvZGV2LyRkZXZuYW1lIG9zdC9cMlwxCitVTlJFR0lTVEVSCV5kdmIvY2FyZChbMC05XSspLyhbXi8wLTldKilbMC05XSskCUVYRUNVVEUgL2Jpbi9ybSAtZiBvc3QvXDJcMQorCisjIEluY2x1ZGUgcGFja2FnZS1nZW5lcmF0ZWQgZmlsZXMgZnJvbSAvZXRjL2RldmZzL2NvbmYuZAorIyBTdXBwb3J0ZWQgYnkgYnVzeWJveAorIyBJTkNMVURFICAgL2V0Yy9kZXZmcy9jb25mLmQvCitJTkNMVURFICAgL2V0Yy9kZXZmcy9idXN5Ym94LworIyBCdXN5Ym94OiBqdXN0IGZvciB0ZXN0aW5nCisjSU5DTFVERQkJCS9ldGMvZGV2ZnMvbm90aGluZy8KKyNJTkNMVURFCQkJL2V0Yy9kZXZmcy9ub3RoaW5nL25vdGhpbmcKKyNPUFRJT05BTF9JTkNMVURFCS9ldGMvZGV2ZnMvbm90aGluZy8KKyNPUFRJT05BTF9JTkNMVURFCS9ldGMvZGV2ZnMvbm90aGluZy9ub3RoaW5nCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kbnNkLmNvbmYgYi9leGFtcGxlcy9kbnNkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmNjIyYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Ruc2QuY29uZgpAQCAtMCwwICsxIEBACit0aGVib3ggMTkyLjE2OC4xLjUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2luZXRkLmNvbmYgYi9leGFtcGxlcy9pbmV0ZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2UzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9pbmV0ZC5jb25mCkBAIC0wLDAgKzEsNzMgQEAKKyMgL2V0Yy9pbmV0ZC5jb25mOiAgc2VlIGluZXRkKDgpIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9ucy4KKyMKKyMgSW50ZXJuZXQgc2VydmVyIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UKKyMKKyMKKyMgSWYgeW91IHdhbnQgdG8gZGlzYWJsZSBhbiBlbnRyeSBzbyBpdCBpc24ndCB0b3VjaGVkIGR1cmluZworIyBwYWNrYWdlIHVwZGF0ZXMganVzdCBjb21tZW50IGl0IG91dCB3aXRoIGEgc2luZ2xlICcjJyBjaGFyYWN0ZXIuCisjCisjIElmIHlvdSBtYWtlIGNoYW5nZXMgdG8gdGhpcyBmaWxlLCBlaXRoZXIgcmVib290IHlvdXIgbWFjaGluZSBvcgorIyBzZW5kIHRoZSBpbmV0ZCBwcm9jZXNzIGEgSFVQIHNpZ25hbDoKKyMgRG8gYSAicHMgeCIgYXMgcm9vdCBhbmQgbG9vayB1cCB0aGUgcGlkIG9mIGluZXRkLiBUaGVuIGRvIGEKKyMgICAgIGtpbGwgLUhVUCA8cGlkIG9mIGluZXRkPgorIyBpbmV0ZCB3aWxsIHJlLXJlYWQgdGhpcyBmaWxlIHdoZW5ldmVyIGl0IGdldHMgdGhhdCBzaWduYWwuCisjIDxzZXJ2aWNlX25hbWU+IDxzb2NrX3R5cGU+IDxwcm90bz4gPGZsYWdzPiA8dXNlcj4gPHNlcnZlcl9wYXRoPiA8YXJncz4KKyMKKyM6SU5URVJOQUw6IEludGVybmFsIHNlcnZpY2VzCisjIEl0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIHNhZmVyIHRvIGtlZXAgdGhlc2Ugb2ZmLgorZWNobyAgICAgc3RyZWFtICB0Y3AJbm93YWl0CXJvb3QJaW50ZXJuYWwKK2VjaG8gICAgIGRncmFtICAgdWRwCXdhaXQJcm9vdAlpbnRlcm5hbAorI2Rpc2NhcmQgIHN0cmVhbSAgdGNwCW5vd2FpdAlyb290CWludGVybmFsCisjZGlzY2FyZCAgZGdyYW0gICB1ZHAJd2FpdAlyb290CWludGVybmFsCitkYXl0aW1lICBzdHJlYW0gIHRjcAlub3dhaXQJcm9vdAlpbnRlcm5hbAorZGF5dGltZSAgZGdyYW0gICB1ZHAJd2FpdAlyb290CWludGVybmFsCisjY2hhcmdlbiAgc3RyZWFtICB0Y3AJbm93YWl0CXJvb3QJaW50ZXJuYWwKKyNjaGFyZ2VuICBkZ3JhbSAgIHVkcAl3YWl0CXJvb3QJaW50ZXJuYWwKK3RpbWUgICAgIHN0cmVhbSAgdGNwCW5vd2FpdAlyb290CWludGVybmFsCit0aW1lICAgICBkZ3JhbSAgIHVkcAl3YWl0CXJvb3QJaW50ZXJuYWwKKworIyBUaGVzZSBhcmUgc3RhbmRhcmQgc2VydmljZXMuCisjCisjZnRwCXN0cmVhbQl0Y3AJbm93YWl0CXJvb3QJL3Vzci9zYmluL3RjcGQJaW4uZnRwZAorI3RlbG5ldAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS9zYmluL3RlbG5ldGQJL3NiaW4vdGVsbmV0ZAorI25udHAJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAl0Y3BkCWluLm5udHBkCisjc210cCAgc3RyZWFtICB0Y3AgICAgIG5vd2FpdCAgcm9vdCAgICB0Y3BkICAgIHNlbmRtYWlsIC12CisjCisjIFNoZWxsLCBsb2dpbiwgZXhlYyBhbmQgdGFsayBhcmUgQlNEIHByb3RvY29scy4KKyMKKyMgSWYgeW91IHJ1biBhbiBudGFsayBkYWVtb24gKHN1Y2ggYXMgbmV0a2l0LW50YWxrKSBvbiB0aGUgb2xkIHRhbGsKKyMgcG9ydCwgdGhhdCBpcywgInRhbGsiIGFzIG9wcG9zZWQgdG8gIm50YWxrIiwgaXQgd29uJ3Qgd29yayBhbmQgbWF5CisjIGNhdXNlIGNlcnRhaW4gYnJva2VuIHRhbGsgY2xpZW50cyB0byBtYWxmdW5jdGlvbi4KKyMKKyMgVGhlIHRhbGtkIGZyb20gbmV0a2l0LW50YWxrIDAuMTIgYW5kIGhpZ2hlciwgaG93ZXZlciwgY2FuIHNwZWFrIHRoZQorIyBvbGQgdGFsayBwcm90b2NvbCBhbmQgY2FuIGJlIHVzZWQgc2FmZWx5LgorIworI3NoZWxsCXN0cmVhbQl0Y3AJbm93YWl0CXJvb3QJL3Vzci9zYmluL3RjcGQJaW4ucnNoZCAtTAorI2xvZ2luCXN0cmVhbQl0Y3AJbm93YWl0CXJvb3QJL3Vzci9zYmluL3RjcGQJaW4ucmxvZ2luZCAtTAorI2V4ZWMJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5yZXhlY2QKKyN0YWxrCWRncmFtCXVkcAl3YWl0CXJvb3QJL3Vzci9zYmluL3RjcGQJaW4udGFsa2QKKyNudGFsawlkZ3JhbQl1ZHAJd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnRhbGtkCisjCisjIFBvcCBldCBhbAorIyBMZWF2ZSB0aGVzZSBvZmYgdW5sZXNzIHlvdSdyZSB1c2luZyB0aGVtLgorI3BvcDIJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5wb3AyZAorI3BvcDMJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5wb3AzZAorIworIyBUaGUgSW50ZXJuZXQgVVVDUCBzZXJ2aWNlLgorIyB1dWNwCXN0cmVhbQl0Y3AJbm93YWl0CXV1Y3AJL3Vzci9zYmluL3RjcGQJL3Vzci9saWIvdXVjcC91dWNpY28JLWwKKyMKKyMgVGZ0cCBzZXJ2aWNlIGlzIHByb3ZpZGVkIHByaW1hcmlseSBmb3IgYm9vdGluZy4gIE1vc3Qgc2l0ZXMKKyMgcnVuIHRoaXMgb25seSBvbiBtYWNoaW5lcyBhY3RpbmcgYXMgImJvb3Qgc2VydmVycy4iIElmIHlvdSBkb24ndAorIyBuZWVkIGl0LCBkb24ndCB1c2UgaXQuCisjCisjdGZ0cAlkZ3JhbQl1ZHAJd2FpdAlub2JvZHkJL3Vzci9zYmluL3RjcGQJaW4udGZ0cGQKKyNib290cHMJZGdyYW0JdWRwCXdhaXQJcm9vdAkvdXNyL3NiaW4vaW4uYm9vdHBkCWluLmJvb3RwZAorIworIyBGaW5nZXIsIHN5c3RhdCBhbmQgbmV0c3RhdCBnaXZlIG91dCB1c2VyIGluZm9ybWF0aW9uIHdoaWNoIG1heSBiZQorIyB2YWx1YWJsZSB0byBwb3RlbnRpYWwgInN5c3RlbSBjcmFja2Vycy4iICBNYW55IHNpdGVzIGNob29zZSB0byBkaXNhYmxlCisjIHNvbWUgb3IgYWxsIG9mIHRoZXNlIHNlcnZpY2VzIHRvIGltcHJvdmUgc2VjdXJpdHkuCisjCisjZmluZ2VyCXN0cmVhbQl0Y3AJbm93YWl0CW5vYm9keQkvdXNyL3NiaW4vdGNwZAlpbi5maW5nZXJkIC13Cisjc3lzdGF0CXN0cmVhbQl0Y3AJbm93YWl0CW5vYm9keQkvdXNyL3NiaW4vdGNwZAkvYmluL3BzCS1hdXd3eAorI25ldHN0YXQJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvYmluL25ldHN0YXQJL2Jpbi9uZXRzdGF0CS1hCisjaWRlbnQJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vaW4uaWRlbnRkCWluLmlkZW50ZApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5pdHRhYiBiL2V4YW1wbGVzL2luaXR0YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlMGFmNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2luaXR0YWIKQEAgLTAsMCArMSw4OSBAQAorIyAvZXRjL2luaXR0YWIgaW5pdCg4KSBjb25maWd1cmF0aW9uIGZvciBCdXN5Qm94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMKKyMgTm90ZSwgQnVzeUJveCBpbml0IGRvZXNuJ3Qgc3VwcG9ydCBydW5sZXZlbHMuICBUaGUgcnVubGV2ZWxzIGZpZWxkIGlzCisjIGNvbXBsZXRlbHkgaWdub3JlZCBieSBCdXN5Qm94IGluaXQuIElmIHlvdSB3YW50IHJ1bmxldmVscywgdXNlIHN5c3Zpbml0LgorIworIworIyBGb3JtYXQgZm9yIGVhY2ggZW50cnk6IDxpZD46PHJ1bmxldmVscz46PGFjdGlvbj46PHByb2Nlc3M+CisjCisjIDxpZD46IFdBUk5JTkc6IFRoaXMgZmllbGQgaGFzIGEgbm9uLXRyYWRpdGlvbmFsIG1lYW5pbmcgZm9yIEJ1c3lCb3ggaW5pdCEKKyMKKyMJVGhlIGlkIGZpZWxkIGlzIHVzZWQgYnkgQnVzeUJveCBpbml0IHRvIHNwZWNpZnkgdGhlIGNvbnRyb2xsaW5nIHR0eSBmb3IKKyMJdGhlIHNwZWNpZmllZCBwcm9jZXNzIHRvIHJ1biBvbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpZWxkIGFyZQorIwlhcHBlbmRlZCB0byAiL2Rldi8iIGFuZCB1c2VkIGFzLWlzLiAgVGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhpcyBmaWVsZCB0bworIwliZSB1bmlxdWUsIGFsdGhvdWdoIGlmIGl0IGlzbid0IHlvdSBtYXkgaGF2ZSBzdHJhbmdlIHJlc3VsdHMuICBJZiB0aGlzCisjCWZpZWxkIGlzIGxlZnQgYmxhbmssIGl0IGlzIGNvbXBsZXRlbHkgaWdub3JlZC4gIEFsc28gbm90ZSB0aGF0IGlmCisjCUJ1c3lCb3ggZGV0ZWN0cyB0aGF0IGEgc2VyaWFsIGNvbnNvbGUgaXMgaW4gdXNlLCB0aGVuIGFsbCBlbnRyaWVzCisjCWNvbnRhaW5pbmcgbm9uLWVtcHR5IGlkIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQuICBCdXN5Qm94IGluaXQgZG9lcworIwlub3RoaW5nIHdpdGggdXRtcC4gIFdlIGRvbid0IG5lZWQgbm8gc3RpbmtpbicgdXRtcC4KKyMKKyMgPHJ1bmxldmVscz46IFRoZSBydW5sZXZlbHMgZmllbGQgaXMgY29tcGxldGVseSBpZ25vcmVkLgorIworIyA8YWN0aW9uPjogVmFsaWQgYWN0aW9ucyBpbmNsdWRlOiBzeXNpbml0LCByZXNwYXduLCBhc2tmaXJzdCwgd2FpdCwgb25jZSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydCwgY3RybGFsdGRlbCwgYW5kIHNodXRkb3duLgorIworIyAgICAgICBOb3RlOiBhc2tmaXJzdCBhY3RzIGp1c3QgbGlrZSByZXNwYXduLCBidXQgYmVmb3JlIHJ1bm5pbmcgdGhlIHNwZWNpZmllZAorIyAgICAgICBwcm9jZXNzIGl0IGRpc3BsYXlzIHRoZSBsaW5lICJQbGVhc2UgcHJlc3MgRW50ZXIgdG8gYWN0aXZhdGUgdGhpcworIyAgICAgICBjb25zb2xlLiIgYW5kIHRoZW4gd2FpdHMgZm9yIHRoZSB1c2VyIHRvIHByZXNzIGVudGVyIGJlZm9yZSBzdGFydGluZworIyAgICAgICB0aGUgc3BlY2lmaWVkIHByb2Nlc3MuCisjCisjICAgICAgIE5vdGU6IHVucmVjb2duaXplZCBhY3Rpb25zIChsaWtlIGluaXRkZWZhdWx0KSB3aWxsIGNhdXNlIGluaXQgdG8gZW1pdAorIyAgICAgICBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlbiBnbyBhbG9uZyB3aXRoIGl0cyBidXNpbmVzcy4KKyMKKyMgPHByb2Nlc3M+OiBTcGVjaWZpZXMgdGhlIHByb2Nlc3MgdG8gYmUgZXhlY3V0ZWQgYW5kIGl0J3MgY29tbWFuZCBsaW5lLgorIworIyBOb3RlOiBCdXN5Qm94IGluaXQgd29ya3MganVzdCBmaW5lIHdpdGhvdXQgYW4gaW5pdHRhYi4gSWYgbm8gaW5pdHRhYiBpcworIyBmb3VuZCwgaXQgaGFzIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBiZWhhdmlvcjoKKyMgICAgICAgICA6OnN5c2luaXQ6L2V0Yy9pbml0LmQvcmNTCisjICAgICAgICAgOjphc2tmaXJzdDovYmluL3NoCisjICAgICAgICAgOjpjdHJsYWx0ZGVsOi9zYmluL3JlYm9vdAorIyAgICAgICAgIDo6c2h1dGRvd246L3NiaW4vc3dhcG9mZiAtYQorIyAgICAgICAgIDo6c2h1dGRvd246L2Jpbi91bW91bnQgLWEgLXIKKyMgICAgICAgICA6OnJlc3RhcnQ6L3NiaW4vaW5pdAorIworIyBpZiBpdCBkZXRlY3RzIHRoYXQgL2Rldi9jb25zb2xlIGlzIF9ub3RfIGEgc2VyaWFsIGNvbnNvbGUsIGl0IHdpbGwKKyMgYWxzbyBydW46CisjICAgICAgICAgdHR5Mjo6YXNrZmlyc3Q6L2Jpbi9zaAorIyAgICAgICAgIHR0eTM6OmFza2ZpcnN0Oi9iaW4vc2gKKyMgICAgICAgICB0dHk0Ojphc2tmaXJzdDovYmluL3NoCisjCisjIEJvb3QtdGltZSBzeXN0ZW0gY29uZmlndXJhdGlvbi9pbml0aWFsaXphdGlvbiBzY3JpcHQuCisjIFRoaXMgaXMgcnVuIGZpcnN0IGV4Y2VwdCB3aGVuIGJvb3RpbmcgaW4gc2luZ2xlLXVzZXIgbW9kZS4KKyMKKzo6c3lzaW5pdDovZXRjL2luaXQuZC9yY1MKKworIyAvYmluL3NoIGludm9jYXRpb25zIG9uIHNlbGVjdGVkIHR0eXMKKyMKKyMgTm90ZSBiZWxvdyB0aGF0IHdlIHByZWZpeCB0aGUgc2hlbGwgY29tbWFuZHMgd2l0aCBhICItIiB0byBpbmRpY2F0ZSB0byB0aGUKKyMgc2hlbGwgdGhhdCBpdCBpcyBzdXBwb3NlZCB0byBiZSBhIGxvZ2luIHNoZWxsLiAgTm9ybWFsbHkgdGhpcyBpcyBoYW5kbGVkIGJ5CisjIGxvZ2luLCBidXQgc2luY2Ugd2UgYXJlIGJ5cGFzc2luZyBsb2dpbiBpbiB0aGlzIGNhc2UsIEJ1c3lCb3ggbGV0cyB5b3UgZG8KKyMgdGhpcyB5b3Vyc2VsZi4uLgorIworIyBTdGFydCBhbiAiYXNrZmlyc3QiIHNoZWxsIG9uIHRoZSBjb25zb2xlICh3aGF0ZXZlciB0aGF0IG1heSBiZSkKKzo6YXNrZmlyc3Q6LS9iaW4vc2gKKyMgU3RhcnQgYW4gImFza2ZpcnN0IiBzaGVsbCBvbiAvZGV2L3R0eTItNAordHR5Mjo6YXNrZmlyc3Q6LS9iaW4vc2gKK3R0eTM6OmFza2ZpcnN0Oi0vYmluL3NoCit0dHk0Ojphc2tmaXJzdDotL2Jpbi9zaAorCisjIC9zYmluL2dldHR5IGludm9jYXRpb25zIGZvciBzZWxlY3RlZCB0dHlzCit0dHk0OjpyZXNwYXduOi9zYmluL2dldHR5IDM4NDAwIHR0eTUKK3R0eTU6OnJlc3Bhd246L3NiaW4vZ2V0dHkgMzg0MDAgdHR5NgorCisjIEV4YW1wbGUgb2YgaG93IHRvIHB1dCBhIGdldHR5IG9uIGEgc2VyaWFsIGxpbmUgKGZvciBhIHRlcm1pbmFsKQorIzo6cmVzcGF3bjovc2Jpbi9nZXR0eSAtTCB0dHlTMCA5NjAwIHZ0MTAwCisjOjpyZXNwYXduOi9zYmluL2dldHR5IC1MIHR0eVMxIDk2MDAgdnQxMDAKKyMKKyMgRXhhbXBsZSBob3cgdG8gcHV0IGEgZ2V0dHkgb24gYSBtb2RlbSBsaW5lLgorIzo6cmVzcGF3bjovc2Jpbi9nZXR0eSA1NzYwMCB0dHlTMgorCisjIFN0dWZmIHRvIGRvIHdoZW4gcmVzdGFydGluZyB0aGUgaW5pdCBwcm9jZXNzCis6OnJlc3RhcnQ6L3NiaW4vaW5pdAorCisjIFN0dWZmIHRvIGRvIGJlZm9yZSByZWJvb3RpbmcKKzo6Y3RybGFsdGRlbDovc2Jpbi9yZWJvb3QKKzo6c2h1dGRvd246L2Jpbi91bW91bnQgLWEgLXIKKzo6c2h1dGRvd246L3NiaW4vc3dhcG9mZiAtYQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbGludXgtMi42LjMwX3Byb2Nfc2VsZl9leGUucGF0Y2ggYi9leGFtcGxlcy9saW51eC0yLjYuMzBfcHJvY19zZWxmX2V4ZS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzY1ODFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbGludXgtMi42LjMwX3Byb2Nfc2VsZl9leGUucGF0Y2gKQEAgLTAsMCArMSwzNCBAQAorVGhpcyBwYXRjaCBtYWtlcyAvcHJvYy9zZWxmL2V4ZSBleGVjdXRhYmxlIGV2ZW4gaWYgcHJvYworaXMgbm90IG1vdW50ZWQuIEl0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIG9uIE5PTU1VIGFyY2hlcy4KKworZGlmZiAtdXJwIC4uL2xpbnV4LTIuNi4zMC5vcmcvZnMvZXhlYy5jIGxpbnV4LTIuNi4zMC9mcy9leGVjLmMKKy0tLSAuLi9saW51eC0yLjYuMzAub3JnL2ZzL2V4ZWMuYwkyMDA5LTA2LTEwIDA1OjA1OjI3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4zMC9mcy9leGVjLmMJMjAwOS0wNi0yNSAwMDoyMDoxMy4wMDAwMDAwMDAgKzAyMDAKK0BAIC02NTIsOSArNjUyLDI1IEBAIHN0cnVjdCBmaWxlICpvcGVuX2V4ZWMoY29uc3QgY2hhciAqbmFtZSkKKyAJZmlsZSA9IGRvX2ZpbHBfb3BlbihBVF9GRENXRCwgbmFtZSwKKyAJCQkJT19MQVJHRUZJTEUgfCBPX1JET05MWSB8IEZNT0RFX0VYRUMsIDAsCisgCQkJCU1BWV9FWEVDIHwgTUFZX09QRU4pOworLQlpZiAoSVNfRVJSKGZpbGUpKQorLQkJZ290byBvdXQ7CisrCWlmIChJU19FUlIoZmlsZSkpIHsKKysJCWlmICgoUFRSX0VSUihmaWxlKSA9PSAtRU5PRU5UIHx8IFBUUl9FUlIoZmlsZSkgPT0gLUVBQ0NFUykKKysJCSAmJiBzdHJjbXAobmFtZSwgIi9wcm9jL3NlbGYvZXhlIikgPT0gMAorKwkJKSB7CisrCQkJc3RydWN0IGZpbGUgKnN2ID0gZmlsZTsKKysJCQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKyAKKysJCQltbSA9IGdldF90YXNrX21tKGN1cnJlbnQpOworKwkJCWlmICghbW0pCisrCQkJCWdvdG8gb3V0OworKwkJCWZpbGUgPSBnZXRfbW1fZXhlX2ZpbGUobW0pOworKwkJCW1tcHV0KG1tKTsKKysJCQlpZiAoZmlsZSkKKysJCQkJZ290byBvazsKKysJCQlmaWxlID0gc3Y7CisrCQl9CisrCQlnb3RvIG91dDsKKysJfQorK29rOgorIAllcnIgPSAtRUFDQ0VTOworIAlpZiAoIVNfSVNSRUcoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKyAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21kZXYuY29uZiBiL2V4YW1wbGVzL21kZXYuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJiNGZjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWRldi5jb25mCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgVGhpcyBpcyBhIHNhbXBsZSBtZGV2LmNvbmYKKyMKKworIyBQcm92aWRlIHVzZXIsIGdyb3VwLCBhbmQgbW9kZSBpbmZvcm1hdGlvbiBmb3IgZGV2aWNlcy4gIElmIGEgcmVnZXggbWF0Y2hlcworIyB0aGUgZGV2aWNlIG5hbWUgcHJvdmlkZWQgYnkgc3lzZnMsIHVzZSB0aGUgYXBwcm9wcmlhdGUgdXNlcjpncm91cCBhbmQgbW9kZQorIyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDA6MCA2NjAuCisjCisjIFN5bnRheDoKKyMgJXMgJWQ6JWQgJXMKKyMgZGV2aWNlbmFtZV9yZWdleCB1c2VyOmdyb3VwIG1vZGUKKworbnVsbAkJMDowIDY2NgoremVybwkJMDowIDY2NgordXJhbmRvbQkJMDowIDQ0NAorCitrbWVtCQkwOjkgMDAwCittZW0JCTA6OSA2NDAKK3BvcnQJCTA6OSA2NDAKKworY29uc29sZQkJMDo1IDYwMAorcHRteAkJMDo1IDY2MAordHR5WzAtOV0qCTA6NSA2NjAKKwordHR5U1swLTldKgkwOjIwIDY0MAorCitmZFswLTldKgkwOjExIDY2MAorCitzZFthLXpdKgkwOjYgNjYwCitoZFthLXpdKgkwOjYgNjYwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9tZGV2X2ZhdC5jb25mIGIvZXhhbXBsZXMvbWRldl9mYXQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjMyOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWRldl9mYXQuY29uZgpAQCAtMCwwICsxLDExMCBAQAorIworIyBUaGlzIGlzIGEgc2FtcGxlIG1kZXYuY29uZgorIworCisjIFByb3ZpZGUgdXNlciwgZ3JvdXAsIGFuZCBtb2RlIGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLiAgSWYgYSByZWdleCBtYXRjaGVzCisjIHRoZSBkZXZpY2UgbmFtZSBwcm92aWRlZCBieSBzeXNmcywgdXNlIHRoZSBhcHByb3ByaWF0ZSB1c2VyOmdyb3VwIGFuZCBtb2RlCisjIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMDowIDY2MC4KKyMKKyMgU3ludGF4OgorIyBbLV1kZXZpY2VuYW1lX3JlZ2V4IHVzZXI6Z3JvdXAgbW9kZSBbPnw9cGF0aF0gW0B8JHwqY21kIGFyZ3MuLi5dCisjCisjID06IG1vdmUsID46IG1vdmUgYW5kIGNyZWF0ZSBhIHN5bWxpbmsKKyMgQHwkfCo6IHJ1biAkY21kIG9uIGRlbGV0ZSwgQGNtZCBvbiBjcmVhdGUsICpjbWQgb24gYm90aAorCisjIHN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgb24gaG90cGx1ZworJE1PREFMSUFTPS4qCXJvb3Q6cm9vdCA2NjAgQG1vZHByb2JlICIkTU9EQUxJQVMiCisKKyMgbnVsbCBtYXkgYWxyZWFkeSBleGlzdDsgdGhlcmVmb3JlIG93bmVyc2hpcCBoYXMgdG8gYmUgY2hhbmdlZCB3aXRoIGNvbW1hbmQKK251bGwJCXJvb3Q6cm9vdCA2NjYgQGNobW9kIDY2NiAkTURFVgoremVybwkJcm9vdDpyb290IDY2NgorZnVsbAkJcm9vdDpyb290IDY2NgorcmFuZG9tCQlyb290OnJvb3QgNDQ0Cit1cmFuZG9tCQlyb290OnJvb3QgNDQ0Citod3JhbmRvbQlyb290OnJvb3QgNDQ0CitncnNlYwkJcm9vdDpyb290IDY2MAorCitrbWVtCQlyb290OnJvb3QgNjQwCittZW0JCXJvb3Q6cm9vdCA2NDAKK3BvcnQJCXJvb3Q6cm9vdCA2NDAKKyMgY29uc29sZSBtYXkgYWxyZWFkeSBleGlzdDsgdGhlcmVmb3JlIG93bmVyc2hpcCBoYXMgdG8gYmUgY2hhbmdlZCB3aXRoIGNvbW1hbmQKK2NvbnNvbGUJCXJvb3Q6dHR5IDYwMCBAY2htb2QgNjAwICRNREVWCitwdG14CQlyb290OnR0eSA2NjYKK3B0eS4qCQlyb290OnR0eSA2NjAKKworIyBUeXBpY2FsIGRldmljZXMKKwordHR5CQlyb290OnR0eSA2NjYKK3R0eVswLTldKglyb290OnR0eSA2NjAKK3Zjc2EqWzAtOV0qCXJvb3Q6dHR5IDY2MAordHR5U1swLTldKglyb290OnV1Y3AgNjYwCisKKyMgYmxvY2sgZGV2aWNlcworcmFtKFswLTldKikJcm9vdDpkaXNrIDY2MCA+cmQvJTEKK2xvb3AoWzAtOV0rKQlyb290OmRpc2sgNjYwID5sb29wLyUxCitzZFthLXpdLioJcm9vdDpkaXNrIDY2MCAqL2xpYi9tZGV2L3VzYmRpc2tfbGluaworaGRbYS16XVswLTldKglyb290OmRpc2sgNjYwICovbGliL21kZXYvaWRlX2xpbmtzCittZFswLTldKglyb290OmRpc2sgNjYwCitzclswLTldKglyb290OmNkcm9tIDY2MCBAbG4gLXNmICRNREVWIGNkcm9tCitmZFswLTldKglyb290OmZsb3BweSA2NjAKKworIyBuZXQgZGV2aWNlcworLW5ldC8uKgkJcm9vdDpyb290IDYwMCBAbmFtZWlmCit0dW5bMC05XSoJcm9vdDpyb290IDYwMCA9bmV0LwordGFwWzAtOV0qCXJvb3Q6cm9vdCA2MDAgPW5ldC8KKworIyBhbHNhIHNvdW5kIGRldmljZXMgYW5kIGF1ZGlvIHN0dWZmCitwY20uKgkJcm9vdDphdWRpbyA2NjAgPXNuZC8KK2NvbnRyb2wuKglyb290OmF1ZGlvIDY2MCA9c25kLworbWlkaS4qCQlyb290OmF1ZGlvIDY2MCA9c25kLworc2VxCQlyb290OmF1ZGlvIDY2MCA9c25kLwordGltZXIJCXJvb3Q6YXVkaW8gNjYwID1zbmQvCisKK2Fkc3AJCXJvb3Q6YXVkaW8gNjYwID5zb3VuZC8KK2F1ZGlvCQlyb290OmF1ZGlvIDY2MCA+c291bmQvCitkc3AJCXJvb3Q6YXVkaW8gNjYwID5zb3VuZC8KK21peGVyCQlyb290OmF1ZGlvIDY2MCA+c291bmQvCitzZXF1ZW5jZXIuKglyb290OmF1ZGlvIDY2MCA+c291bmQvCisKKyMgTGVzcyB0eXBpY2FsIGRldmljZXMKKworIyByYWlkIGNvbnRyb2xsZXJzCitjY2lzcyEoLiopCXJvb3Q6ZGlzayA2NjAgPWNjaXNzLyUxCitpZGEhKC4qKQlyb290OmRpc2sgNjYwID1pZGEvJTEKK3JkISguKikJCXJvb3Q6ZGlzayA2NjAgPXJkLyUxCisKK3R0eUxUTVswLTldCXJvb3Q6ZGlhbG91dCA2NjAgQGxuIC1zZiAkTURFViBtb2RlbQordHR5U0hTRlswLTldCXJvb3Q6ZGlhbG91dCA2NjAgQGxuIC1zZiAkTURFViBtb2RlbQorc2xhbXIJCXJvb3Q6ZGlhbG91dCA2NjAgQGxuIC1zZiAkTURFViBzbGFtcjAKK3NsdXNiCQlyb290OmRpYWxvdXQgNjYwIEBsbiAtc2YgJE1ERVYgc2x1c2IwCisKK2Z1c2UJCXJvb3Q6cm9vdCA2NjYKKworIyBkcmkgZGV2aWNlCitjYXJkWzAtOV0Jcm9vdDp2aWRlbyA2NjAgPWRyaS8KKworIyBtaXNjIHN0dWZmCithZ3BnYXJ0CQlyb290OnJvb3QgNjYwID5taXNjLworcHNhdXgJCXJvb3Q6cm9vdCA2NjAgPm1pc2MvCitydGMJCXJvb3Q6cm9vdCA2NjQgPm1pc2MvCisKKyMgaW5wdXQgc3R1ZmYKK2V2ZW50WzAtOV0rCXJvb3Q6cm9vdCA2NDAgPWlucHV0LworbWljZQkJcm9vdDpyb290IDY0MCA9aW5wdXQvCittb3VzZVswLTldCXJvb3Q6cm9vdCA2NDAgPWlucHV0LwordHNbMC05XQkJcm9vdDpyb290IDYwMCA9aW5wdXQvCisKKyMgdjRsIHN0dWZmCit2YmlbMC05XQlyb290OnZpZGVvIDY2MCA+djRsLwordmlkZW9bMC05XQlyb290OnZpZGVvIDY2MCA+djRsLworCisjIGR2YiBzdHVmZgorZHZiLioJCXJvb3Q6dmlkZW8gNjYwICovbGliL21kZXYvZHZiZGV2CisKKyMgbG9hZCBkcml2ZXJzIGZvciB1c2IgZGV2aWNlcwordXNiZGV2WzAtOV0uWzAtOV0Jcm9vdDpyb290IDY2MCAqL2xpYi9tZGV2L3VzYmRldgordXNiZGV2WzAtOV0uWzAtOV1fLioJcm9vdDpyb290IDY2MAorCisjIHphcHRlbCBkZXZpY2VzCit6YXAoLiopCQlyb290OmRpYWxvdXQgNjYwID16YXAvJTEKK2RhaGRpISguKikJcm9vdDpkaWFsb3V0IDY2MCA9ZGFoZGkvJTEKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21rMmtuci5wbCBiL2V4YW1wbGVzL21rMmtuci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjU5Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWsya25yLnBsCkBAIC0wLDAgKzEsODQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBAKCMpIG1rMmtuci5wbCAtIGdlbmVyYXRlcyBhIHBlcmwgc2NyaXB0IHRoYXQgY29udmVydHMgbGV4ZW1lcyB0byBLJlItc3R5bGUKKyMKKyMgSG93IHRvIHVzZSB0aGlzIHNjcmlwdDoKKyMgIC0gSW4gdGhlIGJ1c3lib3ggZGlyZWN0b3J5IHR5cGUgJ2V4YW1wbGVzL21rMmtuci5wbCBmaWxlcy10by1jb252ZXJ0JworIyAgLSBSZXZpZXcgdGhlICdjb252ZXJ0bWUucGwnIHNjcmlwdCBnZW5lcmF0ZWQgYW5kIHJlbW92ZSAvIGVkaXQgYW55IG9mIHRoZQorIyAgICBzdWJzdGl0dXRpb25zIGluIHRoZXJlIChwbGVhc2UgZXNwZWNpYWxseSBjaGVjayBmb3IgZmFsc2UgcG9zaXRpdmVzKQorIyAgLSBUeXBlICcuL2NvbnZlcnRtZS5wbCBzYW1lLWZpbGVzLWFzLWJlZm9yZScKKyMgIC0gQ29tcGlsZSBhbmQgc2VlIGlmIGl0IHdvcmtzCisjCisjIEJVR1M6IFRoaXMgc2NyaXB0IGRvZXMgbm90IGlnbm9yZSBzdHJpbmdzIGluc2lkZSBjb21tZW50cyBvciBzdHJpbmdzIGluc2lkZQorIyBxdW90ZXMgKGl0IHByb2JhYmx5IHNob3VsZCkuCisKKyMgc2V0IHRoaXMgdG8gc29tZXRoaW5nIGVsc2UgaWYgeW91IHdhbnQKKyRjb252ZXJ0bWUgPSAnY29udmVydG1lLnBsJzsKKworIyBpbnRlcm5hbC11c2UgdmFyaWFibGVzIChkb24ndCB0b3VjaCkKKyRjb252ZXJ0ID0gMDsKKyVjb252ZXJ0ZWQgPSAoKTsKKworIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgcHJpbnQgdXNhZ2UKK2RpZSAidXNhZ2U6ICQwIGZpbGUuYyB8IGZpbGUuaFxuIiBpZiBzY2FsYXIoQEFSR1YpID09IDA7CisKKyMgcHJlcGFyZSB0aGUgImNvbnZlcnQgbWUiIGZpbGUKK29wZW4oQ00sICI+JGNvbnZlcnRtZSIpIG9yIGRpZSAiY29udmVydG1lLnBsICQhIjsKK3ByaW50IENNICIjIS91c3IvYmluL3BlcmwgLXAgLWlcblxuIjsKKworIyBwcm9jZXNzIGVhY2ggZmlsZSBwYXNzZWQgb24gdGhlIGNtZCBsaW5lCit3aGlsZSAoPD4pIHsKKworCSMgaWYgdGhlIGxpbmUgc2F5cyAiZ2V0b3B0IiBpbiBpdCBhbnl3aGVyZSwgd2UgZG9uJ3Qgd2FudCB0byBtdWNrIHdpdGggaXQKKwkjIGJlY2F1c2Ugb3B0aW9uIGxpc3RzIHRlbmQgdG8gaW5jbHVkZSBzdHJpbmdzIGxpa2UgImN4dHp2T2Y6IiB3aGljaCBnZXQKKwkjIG1hdGNoZWQgYnkgdGhlICJjaGVjayBmb3IgbWl4ZWQgY2FzZSIgcmVnZXhwcyBiZWxvdworCW5leHQgaWYgL2dldG9wdC87CisKKwkjIHRva2VuaXplIHRoZSBzdHJpbmcgaW50byBqdXN0IHRoZSB2YXJpYWJsZXMKKwl3aGlsZSAoLyhbYS16QS1aX11bYS16QS1aMC05X10qKS9nKSB7CisJCSR2YXIgPSAkMTsKKworCQkjIGlnbm9yZSB0aGUgd29yZCAiQnVzeUJveCIKKwkJbmV4dCBpZiAoJHZhciA9fiAvQnVzeUJveC8pOworCisJCSMgdGhpcyBjaGVja3MgZm9yIGphdmFTdHlsZSBvciBzekh1bmdhcmlhbk5vdGF0aW9uCisJCSRjb252ZXJ0KysgaWYgKCR2YXIgPX4gL15bYS16XStbQS1aXVthLXpdKy8pOworCisJCSMgdGhpcyBjaGVja3MgZm9yIFBhc2NhbFN0eWxlCisJCSRjb252ZXJ0KysgaWYgKCR2YXIgPX4gL15bQS1aXVthLXpdK1tBLVpdW2Etel0rLyk7CisKKwkJIyBpZiB3ZSB3YW50IHRvIGFkZCBtb3JlIGNoZWNrcywgd2UgY2FuIGFkZCAnZW0gaGVyZSwgYnV0IHRoZSBhYm92ZQorCQkjIGNoZWNrcyBjYXRjaCAianVzdCBlbm91Z2giIGFuZCBub3QgdG9vIG11Y2gsIHNvIHByb2xseSBub3QuCisKKwkJaWYgKCRjb252ZXJ0KSB7CisJCQkkY29udmVydCA9IDA7CisKKwkJCSMgc2tpcCBhaGVhZCBpZiB3ZSd2ZSBhbHJlYWR5IGRlYWx0IHdpdGggdGhpcyBvbmUKKwkJCW5leHQgaWYgKCRjb252ZXJ0ZWR7JHZhcn0pOworCisJCQkjIHJlY29yZCB0aGF0IHdlJ3ZlIGRlYWx0IHdpdGggdGhpcyB2YXIKKwkJCSRjb252ZXJ0ZWR7JHZhcn0gPSAxOworCisJCQlwcmludCBDTSAicy9cXGIkdmFyXFxiLyI7ICMgbW9yZSB0byBjb21lIGluIGp1c3QgYSBtaW51dGUKKworCQkJIyBjaGFuZ2UgdGhlIGZpcnN0IGxldHRlciB0byBsb3dlci1jYXNlCisJCQkkdmFyID0gbGNmaXJzdCgkdmFyKTsKKworCQkJIyBwdXQgdW5kZXJzY29yZXMgYmVmb3JlIGFsbCByZW1haW5pbmcgdXBwZXItY2FzZSBsZXR0ZXJzCisJCQkkdmFyID1+IHMvKFtBLVpdKS9fJDEvZzsKKworCQkJIyBub3cgY2hhbmdlIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyB0byBsb3dlci1jYXNlCisJCQkkdmFyID0gbGMoJHZhcik7CisKKwkJCXByaW50IENNICIkdmFyL2c7XG4iOworCQl9CisJfQorfQorCisjIHRpZHkgdXAgYW5kIG1ha2UgdGhlICRjb252ZXJ0bWUgc2NyaXB0IGV4ZWN1dGFibGUKK2Nsb3NlKENNKTsKK2NobW9kIDA3NTUsICRjb252ZXJ0bWU7CisKKyMgcHJpbnQgYSBoZWxwZnVsIGhlbHAgbWVzc2FnZQorcHJpbnQgIkRvbmUuIFNjaGVkdWxlZCBuYW1lIGNoYW5nZXMgYXJlIGluICRjb252ZXJ0bWUuXG4iOworcHJpbnQgIlBsZWFzZSByZXZpZXcvbW9kaWZ5IGl0IGFuZCB0aGVuIHR5cGUgLi8kY29udmVydG1lIHRvIGRvIHRoZSBzZWFyY2ggJiByZXBsYWNlLlxuIjsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5ib3VuZCBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5ib3VuZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDM1NjljCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmJvdW5kCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBTYW1wbGUgdWRoY3BjIHJlbmV3IHNjcmlwdAorCitSRVNPTFZfQ09ORj0iL2V0Yy91ZGhjcGMvcmVzb2x2LmNvbmYiCisKK1sgLW4gIiRicm9hZGNhc3QiIF0gJiYgQlJPQURDQVNUPSJicm9hZGNhc3QgJGJyb2FkY2FzdCIKK1sgLW4gIiRzdWJuZXQiIF0gJiYgTkVUTUFTSz0ibmV0bWFzayAkc3VibmV0IgorCisvc2Jpbi9pZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkQlJPQURDQVNUICRORVRNQVNLCisKK2lmIFsgLW4gIiRyb3V0ZXIiIF0KK3RoZW4KKwllY2hvICJkZWxldGluZyByb3V0ZXJzIgorCXdoaWxlIC9zYmluL3JvdXRlIGRlbCBkZWZhdWx0IGd3IDAuMC4wLjAgZGV2ICRpbnRlcmZhY2UKKwlkbyA6CisJZG9uZQorCisJbWV0cmljPTAKKwlmb3IgaSBpbiAkcm91dGVyCisJZG8KKwkJL3NiaW4vcm91dGUgYWRkIGRlZmF1bHQgZ3cgJGkgZGV2ICRpbnRlcmZhY2UgbWV0cmljICQoKG1ldHJpYysrKSkKKwlkb25lCitmaQorCitlY2hvIC1uID4gJFJFU09MVl9DT05GCitbIC1uICIkZG9tYWluIiBdICYmIGVjaG8gZG9tYWluICRkb21haW4gPj4gJFJFU09MVl9DT05GCitmb3IgaSBpbiAkZG5zCitkbworCWVjaG8gYWRkaW5nIGRucyAkaQorCWVjaG8gbmFtZXNlcnZlciAkaSA+PiAkUkVTT0xWX0NPTkYKK2RvbmUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5kZWNvbmZpZyBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5kZWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjIxYmNmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmRlY29uZmlnCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisjIFNhbXBsZSB1ZGhjcGMgZGVjb25maWcgc2NyaXB0CisKKy9zYmluL2lmY29uZmlnICRpbnRlcmZhY2UgMC4wLjAuMApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLm5hayBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5uYWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRkMDhlNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5uYWsKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKyMgU2FtcGxlIHVkaGNwYyBuYWsgc2NyaXB0CisKK2VjaG8gUmVjZWl2ZWQgYSBOQUs6ICRtZXNzYWdlCmRpZmYgLS1naXQgYS9leGFtcGxlcy91ZGhjcC9zYW1wbGUucmVuZXcgYi9leGFtcGxlcy91ZGhjcC9zYW1wbGUucmVuZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWEzNjhmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5yZW5ldwpAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vc2gKKyMgU2FtcGxlIHVkaGNwYyBib3VuZCBzY3JpcHQKKworUkVTT0xWX0NPTkY9Ii9ldGMvdWRoY3BjL3Jlc29sdi5jb25mIgorCitbIC1uICIkYnJvYWRjYXN0IiBdICYmIEJST0FEQ0FTVD0iYnJvYWRjYXN0ICRicm9hZGNhc3QiCitbIC1uICIkc3VibmV0IiBdICYmIE5FVE1BU0s9Im5ldG1hc2sgJHN1Ym5ldCIKKworL3NiaW4vaWZjb25maWcgJGludGVyZmFjZSAkaXAgJEJST0FEQ0FTVCAkTkVUTUFTSworCitpZiBbIC1uICIkcm91dGVyIiBdCit0aGVuCisJZWNobyAiZGVsZXRpbmcgcm91dGVycyIKKwl3aGlsZSAvc2Jpbi9yb3V0ZSBkZWwgZGVmYXVsdCBndyAwLjAuMC4wIGRldiAkaW50ZXJmYWNlCisJZG8gOgorCWRvbmUKKworCW1ldHJpYz0wCisJZm9yIGkgaW4gJHJvdXRlcgorCWRvCisJCS9zYmluL3JvdXRlIGFkZCBkZWZhdWx0IGd3ICRpIGRldiAkaW50ZXJmYWNlIG1ldHJpYyAkKChtZXRyaWMrKykpCisJZG9uZQorZmkKKworZWNobyAtbiA+ICRSRVNPTFZfQ09ORgorWyAtbiAiJGRvbWFpbiIgXSAmJiBlY2hvIGRvbWFpbiAkZG9tYWluID4+ICRSRVNPTFZfQ09ORgorZm9yIGkgaW4gJGRucworZG8KKwllY2hvIGFkZGluZyBkbnMgJGkKKwllY2hvIG5hbWVzZXJ2ZXIgJGkgPj4gJFJFU09MVl9DT05GCitkb25lCmRpZmYgLS1naXQgYS9leGFtcGxlcy91ZGhjcC9zYW1wbGUuc2NyaXB0IGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjcxN2FjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLnNjcmlwdApAQCAtMCwwICsxLDcgQEAKKyMhL2Jpbi9zaAorIyBDdXJyZW50bHksIHdlIG9ubHkgZGlzcGF0Y2ggYWNjb3JkaW5nIHRvIGNvbW1hbmQuICBIb3dldmVyLCBhIG1vcmUKKyMgZWxhYm9yYXRlIHN5c3RlbSBtaWdodCBkaXNwYXRjaCBieSBjb21tYW5kIGFuZCBpbnRlcmZhY2Ugb3IgZG8gc29tZQorIyBjb21tb24gaW5pdGlhbGl6YXRpb24gZmlyc3QsIGVzcGVjaWFsbHkgaWYgbW9yZSBkaGNwIGV2ZW50IG5vdGlmaWNhdGlvbnMKKyMgYXJlIGFkZGVkLgorCitleGVjIC91c3Ivc2hhcmUvdWRoY3BjL3NhbXBsZS4kMQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdWRoY3Avc2ltcGxlLnNjcmlwdCBiL2V4YW1wbGVzL3VkaGNwL3NpbXBsZS5zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBlZTczOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3VkaGNwL3NpbXBsZS5zY3JpcHQKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisjIHVkaGNwYyBzY3JpcHQgZWRpdGVkIGJ5IFRpbSBSaWtlciA8VGltQFJpa2Vycy5vcmc+CisKK1JFU09MVl9DT05GPSIvZXRjL3Jlc29sdi5jb25mIgorCitbIC1uICIkMSIgXSB8fCB7IGVjaG8gIkVycm9yOiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdWRoY3BjIjsgZXhpdCAxOyB9CisKK05FVE1BU0s9IiIKK1sgLW4gIiRzdWJuZXQiIF0gJiYgTkVUTUFTSz0ibmV0bWFzayAkc3VibmV0IgorQlJPQURDQVNUPSJicm9hZGNhc3QgKyIKK1sgLW4gIiRicm9hZGNhc3QiIF0gJiYgQlJPQURDQVNUPSJicm9hZGNhc3QgJGJyb2FkY2FzdCIKKworY2FzZSAiJDEiIGluCisJZGVjb25maWcpCisJCWVjaG8gIlNldHRpbmcgSVAgYWRkcmVzcyAwLjAuMC4wIG9uICRpbnRlcmZhY2UiCisJCWlmY29uZmlnICRpbnRlcmZhY2UgMC4wLjAuMAorCQk7OworCisJcmVuZXd8Ym91bmQpCisJCWVjaG8gIlNldHRpbmcgSVAgYWRkcmVzcyAkaXAgb24gJGludGVyZmFjZSIKKwkJaWZjb25maWcgJGludGVyZmFjZSAkaXAgJE5FVE1BU0sgJEJST0FEQ0FTVAorCisJCWlmIFsgLW4gIiRyb3V0ZXIiIF0gOyB0aGVuCisJCQllY2hvICJEZWxldGluZyByb3V0ZXJzIgorCQkJd2hpbGUgcm91dGUgZGVsIGRlZmF1bHQgZ3cgMC4wLjAuMCBkZXYgJGludGVyZmFjZSA7IGRvCisJCQkJOgorCQkJZG9uZQorCisJCQltZXRyaWM9MAorCQkJZm9yIGkgaW4gJHJvdXRlciA7IGRvCisJCQkJZWNobyAiQWRkaW5nIHJvdXRlciAkaSIKKwkJCQlyb3V0ZSBhZGQgZGVmYXVsdCBndyAkaSBkZXYgJGludGVyZmFjZSBtZXRyaWMgJCgobWV0cmljKyspKQorCQkJZG9uZQorCQlmaQorCisJCWVjaG8gIlJlY3JlYXRpbmcgJFJFU09MVl9DT05GIgorCQllY2hvIC1uID4gJFJFU09MVl9DT05GLSQkCisJCVsgLW4gIiRkb21haW4iIF0gJiYgZWNobyAic2VhcmNoICRkb21haW4iID4+ICRSRVNPTFZfQ09ORi0kJAorCQlmb3IgaSBpbiAkZG5zIDsgZG8KKwkJCWVjaG8gIiBBZGRpbmcgRE5TIHNlcnZlciAkaSIKKwkJCWVjaG8gIm5hbWVzZXJ2ZXIgJGkiID4+ICRSRVNPTFZfQ09ORi0kJAorCQlkb25lCisJCW12ICRSRVNPTFZfQ09ORi0kJCAkUkVTT0xWX0NPTkYKKwkJOzsKK2VzYWMKKworZXhpdCAwCmRpZmYgLS1naXQgYS9leGFtcGxlcy91ZGhjcC91ZGhjcGQuY29uZiBiL2V4YW1wbGVzL3VkaGNwL3VkaGNwZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjk1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy91ZGhjcC91ZGhjcGQuY29uZgpAQCAtMCwwICsxLDExMyBAQAorIyBTYW1wbGUgdWRoY3BkIGNvbmZpZ3VyYXRpb24gZmlsZSAoL2V0Yy91ZGhjcGQuY29uZikKKyMgVmFsdWVzIHNob3duIGFyZSBkZWZhdWx0cworCisjIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBJUCBsZWFzZSBibG9jaworc3RhcnQJCTE5Mi4xNjguMC4yMAorZW5kCQkxOTIuMTY4LjAuMjU0CisKKyMgVGhlIGludGVyZmFjZSB0aGF0IHVkaGNwZCB3aWxsIHVzZQoraW50ZXJmYWNlCWV0aDAKKworIyBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGVhc2VzIChpbmNsdWRlcyBhZGRyZXNzZXMgcmVzZXJ2ZWQKKyMgYnkgT0ZGRVIncywgREVDTElORSdzLCBhbmQgQVJQIGNvbmZsaWN0cykuIFdpbGwgYmUgY29ycmVjdGVkCisjIGlmIGl0J3MgYmlnZ2VyIHRoYW4gSVAgbGVhc2UgYmxvY2ssIGJ1dCBpdCBvayB0byBtYWtlIGl0CisjIHNtYWxsZXIgdGhhbiBsZWFzZSBibG9jay4KKyNtYXhfbGVhc2VzCTI1NAorCisjIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IGFuIElQIHdpbGwgYmUgcmVzZXJ2ZWQgKGxlYXNlZCB0byBub2JvZHkpCisjIGlmIGEgREhDUCBkZWNsaW5lIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgKHNlY29uZHMpCisjZGVjbGluZV90aW1lCTM2MDAKKworIyBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCBhbiBJUCB3aWxsIGJlIHJlc2VydmVkCisjIGlmIGFuIEFSUCBjb25mbGljdCBvY2N1cnMgKHNlY29uZHMpCisjY29uZmxpY3RfdGltZQkzNjAwCisKKyMgSG93IGxvbmcgYW4gb2ZmZXJlZCBhZGRyZXNzIGlzIHJlc2VydmVkIChzZWNvbmRzKQorI29mZmVyX3RpbWUJNjAKKworIyBJZiBjbGllbnQgYXNrcyBmb3IgbGVhc2UgYmVsb3cgdGhpcyB2YWx1ZSwgaXQgd2lsbCBiZSByb3VuZGVkIHVwCisjIHRvIHRoaXMgdmFsdWUgKHNlY29uZHMpCisjbWluX2xlYXNlCTYwCisKKyMgVGhlIGxvY2F0aW9uIG9mIHRoZSBwaWQgZmlsZQorI3BpZGZpbGUJL3Zhci9ydW4vdWRoY3BkLnBpZAorCisjIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGVhc2VzIGZpbGUKKyNsZWFzZV9maWxlCS92YXIvbGliL21pc2MvdWRoY3BkLmxlYXNlcworCisjIFRoZSB0aW1lIHBlcmlvZCBhdCB3aGljaCB1ZGhjcGQgd2lsbCB3cml0ZSBvdXQgbGVhc2VzIGZpbGUuCisjIElmIHRoaXMgaXMgMCwgdWRoY3BkIHdpbGwgbmV2ZXIgYXV0b21hdGljYWxseSB3cml0ZSBsZWFzZXMgZmlsZS4KKyMgU3BlY2lmaWVkIGluIHNlY29uZHMuCisjYXV0b190aW1lCTcyMDAKKworIyBFdmVyeSB0aW1lIHVkaGNwZCB3cml0ZXMgYSBsZWFzZXMgZmlsZSwgdGhlIGJlbG93IHNjcmlwdCB3aWxsIGJlIGNhbGxlZAorI25vdGlmeV9maWxlCQkJIyBkZWZhdWx0OiBubyBzY3JpcHQKKyNub3RpZnlfZmlsZQlkdW1wbGVhc2VzCSMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKworIyBUaGUgZm9sbG93aW5nIGFyZSBib290cCBzcGVjaWZpYyBvcHRpb25zCisjIG5leHQgc2VydmVyIHRvIHVzZSBpbiBib290c3RyYXAKKyNzaWFkZHIJCTE5Mi4xNjguMC4yMgkjIGRlZmF1bHQ6IDAuMC4wLjAgKG5vbmUpCisjIHRmdHAgc2VydmVyIG5hbWUKKyNzbmFtZQkJem9yYWsJCSMgZGVmYXVsdDogbm9uZQorIyB0ZnRwIGZpbGUgdG8gZG93bmxvYWQgKGUuZy4ga2VybmVsIGltYWdlKQorI2Jvb3RfZmlsZQkvdmFyL25mc19yb290CSMgZGVmYXVsdDogbm9uZQorCisjIFN0YXRpYyBsZWFzZXMgbWFwCisjc3RhdGljX2xlYXNlIDAwOjYwOjA4OjExOkNFOjRFIDE5Mi4xNjguMC41NAorI3N0YXRpY19sZWFzZSAwMDo2MDowODoxMTpDRTozRSAxOTIuMTY4LjAuNDQKKworIyBUaGUgcmVtYWluZGVyIG9mIG9wdGlvbnMgYXJlIERIQ1Agb3B0aW9ucyBhbmQgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZQorIyBrZXl3b3JkICdvcHQnIG9yICdvcHRpb24nLiBJZiBhbiBvcHRpb24gY2FuIHRha2UgbXVsdGlwbGUgaXRlbXMsIHN1Y2gKKyMgYXMgdGhlIGRucyBvcHRpb24sIHRoZXkgY2FuIGJlIGxpc3RlZCBvbiB0aGUgc2FtZSBsaW5lLCBvciBtdWx0aXBsZQorIyBsaW5lcy4KKyMgRXhhbXBsZXM6CitvcHQJZG5zCTE5Mi4xNjguMTAuMiAxOTIuMTY4LjEwLjEwCitvcHRpb24Jc3VibmV0CTI1NS4yNTUuMjU1LjAKK29wdAlyb3V0ZXIJMTkyLjE2OC4xMC4yCitvcHQJd2lucwkxOTIuMTY4LjEwLjEwCitvcHRpb24JZG5zCTEyOS4yMTkuMTMuODEJIyBhcHBlbmRlZCB0byBhYm92ZSBETlMgc2VydmVycyBmb3IgYSB0b3RhbCBvZiAzCitvcHRpb24JZG9tYWluCWxvY2FsCitvcHRpb24JbGVhc2UJODY0MDAwCQkjIGRlZmF1bHQ6IDEwIGRheXMKKyMgQXJiaXRyYXJ5IG9wdGlvbiBpbiBoZXggZm9ybToKK29wdGlvbgkweDA4CTAxMDIwMzA0CSMgb3B0aW9uIDg6ICJjb29raWUgc2VydmVyIElQIGFkZHI6IDEuMi4zLjQiCisKKyMgQ3VycmVudGx5IHN1cHBvcnRlZCBvcHRpb25zIChmb3IgbW9yZSBpbmZvLCBzZWUgb3B0aW9ucy5jKToKKyNvcHQgbGVhc2UgICAgICBOVU0KKyNvcHQgc3VibmV0ICAgICBJUAorI29wdCBicm9hZGNhc3QgIElQCisjb3B0IHJvdXRlciAgICAgSVBfTElTVAorI29wdCBpcHR0bCAgICAgIE5VTQorI29wdCBtdHUgICAgICAgIE5VTQorI29wdCBob3N0bmFtZSAgIFNUUklORwkJIyBjbGllbnQncyBob3N0bmFtZQorI29wdCBkb21haW4gICAgIFNUUklORwkJIyBjbGllbnQncyBkb21haW4gc3VmZml4Cisjb3B0IHNlYXJjaCAgICAgU1RSSU5HX0xJU1QJIyBzZWFyY2ggZG9tYWlucworI29wdCBuaXNkb21haW4gIFNUUklORworI29wdCB0aW1lem9uZSAgIE5VTQkJIyAobG9jYWx0aW1lIC0gVVRDX3RpbWUpIGluIHNlY29uZHMuIHNpZ25lZAorI29wdCB0ZnRwICAgICAgIFNUUklORwkJIyB0ZnRwIHNlcnZlciBuYW1lCisjb3B0IGJvb3RmaWxlICAgU1RSSU5HCQkjIHRmdHAgZmlsZSB0byBkb3dubG9hZCAoZS5nLiBrZXJuZWwgaW1hZ2UpCisjb3B0IGJvb3RzaXplICAgTlVNCQkjIHNpemUgb2YgdGhhdCBmaWxlCisjb3B0IHJvb3RwYXRoICAgU1RSSU5HCQkjIChORlMpIHBhdGggdG8gbW91bnQgYXMgcm9vdCBmcworI29wdCB3cGFkICAgICAgIFNUUklORworI29wdCBzZXJ2ZXJpZCAgIElQCQkjIGRlZmF1bHQ6IHNlcnZlcidzIElQCisjb3B0IG1lc3NhZ2UgICAgU1RSSU5HCQkjIGVycm9yIG1lc3NhZ2UgKHVkaGNwZCBzZW5kcyBpdCBvbiBzdWNjZXNzIHRvbykKKyNvcHQgdmxhbmlkICAgICBOVU0JCSMgODAyLjFQIFZMQU4gSUQKKyNvcHQgdmxhbnByaW9yaXR5IE5VTQkJIyA4MDIuMVEgVkxBTiBwcmlvcml0eQorIyBPcHRpb25zIHNwZWNpZnlpbmcgc2VydmVyKHMpCisjb3B0IGRucyAgICAgICAgSVBfTElTVAorI29wdCB3aW5zICAgICAgIElQX0xJU1QKKyNvcHQgbmlzc3J2ICAgICBJUF9MSVNUCisjb3B0IG50cHNydiAgICAgSVBfTElTVAorI29wdCBscHJzcnYgICAgIElQX0xJU1QKKyNvcHQgc3dhcHNydiAgICBJUAorIyBPcHRpb25zIHNwZWNpZnlpbmcgcm91dGVzCisjb3B0IHJvdXRlcyAgICAgSVBfUEFJUl9MSVNUCisjIE9ic29sZXRlIG9wdGlvbnMsIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyNvcHQgbG9nc3J2ICAgICBJUF9MSVNUCSMgNzA0L1VEUCBsb2cgc2VydmVyIChub3Qgc3lzbG9nISkKKyNvcHQgbmFtZXNydiAgICBJUF9MSVNUCSMgSUVOIDExNiBuYW1lIHNlcnZlciwgb2Jzb2xldGUgKEF1Z3VzdCAxOTc5ISEhKQorI29wdCBjb29raWVzcnYgIElQX0xJU1QJIyBSRkMgODY1ICJxdW90ZSBvZiB0aGUgZGF5IiBzZXJ2ZXIsIHJhcmVseSAobmV2ZXI/KSB1c2VkCisjb3B0IHRpbWVzcnYgICAgSVBfTElTVAkjIFJGQyA4NjggdGltZSBzZXJ2ZXIsIHJhcmVseSAobmV2ZXI/KSB1c2VkCisjIFRPRE86IGluIGRldmVsb3BtZW50Cisjb3B0IHVzZXJjbGFzcyAgU1RSSU5HCQkjIFJGQyAzMDA0LiBzZXQgb2YgTEFTQ0lJIHN0cmluZ3MuICJJIGFtIGEgcHJpbnRlciIgZXRjCisjb3B0IHNpcHNlcnYgICAgU1RSSU5HIExJU1QJIyBSRkMgMzM2MS4gZmxhZyBieXRlLCB0aGVuOiAwOiBkb21haW4gbmFtZXMsIDE6IElQIGFkZHJzCisjb3B0IHN0YXRpY3JvdXRlcyAgIFNUQVRJQ19ST1VURVMKKyNvcHQgbXNzdGF0aWNyb3V0ZXMgU1RBVElDX1JPVVRFUwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdW5kZWIgYi9leGFtcGxlcy91bmRlYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzEwNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdW5kZWIKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCB0aGUgR05VIHZlcnNpb24gb2YgdGFyIGFuZCBnemlwIQorIyBUaGlzIHNob3VsZCB3b3JrIHdpdGggdGhlIGJhc2ggb3IgYXNoIHNoZWxsIQorIyBSZXF1aXJlcyB0aGUgcHJvZ3JhbXMgKGFyLCB0YXIsIGd6aXAsIGFuZCB0aGUgcGFnZXIgbW9yZSBvciBsZXNzKS4KKyMKK3VzYWdlKCkgeworZWNobyAiVXNhZ2U6IHVuZGViIC1jIHBhY2thZ2UuZGViICAgICAgICAgICAgPFByaW50IGNvbnRyb2wgZmlsZSBpbmZvPiIKK2VjaG8gIiAgICAgICB1bmRlYiAtbCBwYWNrYWdlLmRlYiAgICAgICAgICAgIDxMaXN0IGNvbnRlbnRzIG9mIGRlYiBwYWNrYWdlPiIKK2VjaG8gIiAgICAgICB1bmRlYiAteCBwYWNrYWdlLmRlYiAvZm9vL2JvbyAgIDxFeHRyYWN0IGRlYiBwYWNrYWdlIHRvIHRoaXMgZGlyZWN0b3J5LCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQgLiBmb3IgY3VycmVudCBkaXJlY3Rvcnk+IgorZXhpdAorfQorCitkZWI9JDIKKworZXhpc3QoKSB7CitpZiBbICIkZGViIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtcyAiJGRlYiIgXTsgdGhlbgorZWNobyAiQ2FuJ3QgZmluZCAkZGViISIKK2V4aXQKK2ZpCit9CisKK2lmIFsgIiQxIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgIiQxIiA9ICItbCIgXTsgdGhlbgorZXhpc3QKK3R5cGUgbW9yZSA+L2Rldi9udWxsIDI+JjEgJiYgcGFnZXI9bW9yZQordHlwZSBsZXNzID4vZGV2L251bGwgMj4mMSAmJiBwYWdlcj1sZXNzCitbICIkcGFnZXIiID0gIiIgXSAmJiBlY2hvICJObyBwYWdlciBmb3VuZCEiICYmIGV4aXQKKyhhciAtcCAkZGViIGNvbnRyb2wudGFyLmd6IHwgdGFyIC14ek8gKmNvbnRyb2wgOyBlY2hvIC1lICJcblByZXNzIGVudGVyIHRvIHNjcm9sbCwgcSB0byBRdWl0IVxuIiA7IGFyIC1wICRkZWIgZGF0YS50YXIuZ3ogfCB0YXIgLXR6dikgfCAkcGFnZXIKK2V4aXQKK2VsaWYgWyAiJDEiID0gIi1jIiBdOyB0aGVuCitleGlzdAorYXIgLXAgJGRlYiBjb250cm9sLnRhci5neiB8IHRhciAteHpPICpjb250cm9sCitleGl0CitlbGlmIFsgIiQxIiA9ICIteCIgXTsgdGhlbgorZXhpc3QKK2lmIFsgIiQzIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtZCAiJDMiIF07IHRoZW4KK2VjaG8gIk5vIHN1Y2ggZGlyZWN0b3J5ICQzISIKK2V4aXQKK2ZpCithciAtcCAkZGViIGRhdGEudGFyLmd6IHwgdGFyIC14enZwZiAtIC1DICQzIHx8IGV4aXQKK2VjaG8KK2VjaG8gIkV4dHJhY3RlZCAkZGViIHRvICQzISIKK2V4aXQKK2Vsc2UKK3VzYWdlCitmaQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdW5ycG0gYi9leGFtcGxlcy91bnJwbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZmQzNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdW5ycG0KQEAgLTAsMCArMSw0OCBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCB0aGUgR05VIHZlcnNpb24gb2YgY3BpbyBhbmQgZ3ppcCEKKyMgVGhpcyBzaG91bGQgd29yayB3aXRoIHRoZSBiYXNoIG9yIGFzaCBzaGVsbCEKKyMgUmVxdWlyZXMgdGhlIHByb2dyYW1zIChjcGlvLCBnemlwLCBhbmQgdGhlIHBhZ2VyIG1vcmUgb3IgbGVzcykuCisjCit1c2FnZSgpIHsKK2VjaG8gIlVzYWdlOiB1bnJwbSAtbCBwYWNrYWdlLnJwbSAgICAgICAgICAgIDxMaXN0IGNvbnRlbnRzIG9mIHJwbSBwYWNrYWdlPiIKK2VjaG8gIiAgICAgICB1bnJwbSAteCBwYWNrYWdlLnJwbSAvZm9vL2JvbyAgIDxFeHRyYWN0IHJwbSBwYWNrYWdlIHRvIHRoaXMgZGlyZWN0b3J5LCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQgLiBmb3IgY3VycmVudCBkaXJlY3Rvcnk+IgorZXhpdAorfQorCitycG09JDIKKworZXhpc3QoKSB7CitpZiBbICIkcnBtIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtcyAiJHJwbSIgXTsgdGhlbgorZWNobyAiQ2FuJ3QgZmluZCAkcnBtISIKK2V4aXQKK2ZpCit9CisKK2lmIFsgIiQxIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgIiQxIiA9ICItbCIgXTsgdGhlbgorZXhpc3QKK3R5cGUgbW9yZSA+L2Rldi9udWxsIDI+JjEgJiYgcGFnZXI9bW9yZQordHlwZSBsZXNzID4vZGV2L251bGwgMj4mMSAmJiBwYWdlcj1sZXNzCitbICIkcGFnZXIiID0gIiIgXSAmJiBlY2hvICJObyBwYWdlciBmb3VuZCEiICYmIGV4aXQKKyhlY2hvIC1lICJcblByZXNzIGVudGVyIHRvIHNjcm9sbCwgcSB0byBRdWl0IVxuIiA7IHJwbTJjcGlvICRycG0gfCBjcGlvIC10diAtLXF1aWV0KSB8ICRwYWdlcgorZXhpdAorZWxpZiBbICIkMSIgPSAiLXgiIF07IHRoZW4KK2V4aXN0CitpZiBbICIkMyIgPSAiIiBdOyB0aGVuCit1c2FnZQorZWxpZiBbICEgLWQgIiQzIiBdOyB0aGVuCitlY2hvICJObyBzdWNoIGRpcmVjdG9yeSAkMyEiCitleGl0CitmaQorcnBtMmNwaW8gJHJwbSB8ICh1bWFzayAwIDsgY2QgJDMgOyBjcGlvIC1pZG11dikgfHwgZXhpdAorZWNobworZWNobyAiRXh0cmFjdGVkICRycG0gdG8gJDMhIgorZXhpdAorZWxzZQordXNhZ2UKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9SRUFETUUgYi9leGFtcGxlcy92YXJfc2VydmljZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4MTdjOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL1JFQURNRQpAQCAtMCwwICsxLDU5IEBACitJbiBtYW55IGNhc2VzLCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gbWFrZXMgaXQgbmVjZXNzYXJ5IHRvIHJ1biBzZXZlcmFsIGRhZW1vbnM6CitkaGNwLCB6ZXJvY29uZiwgcHBwLCBvcGVudnBuIGFuZCBzdWNoLiBUaGV5IG5lZWQgdG8gYmUgY29udHJvbGxlZCwKK2FuZCBpbiBtYW55IGNhc2VzIHlvdSBhbHNvIHdhbnQgdG8gYmFieXNpdCB0aGVtLiBydW5zdmRpciBpcyBhIGdvb2QgdG9vbCBmb3IgdGhpcy4KK2V4YW1wbGVzL3Zhcl9zZXJ2aWNlIGRpcmVjdG9yeSBwcm92aWRlcyBhIGZldyBleGFtcGxlcy4gSXQgaXMgbWVhbnQgdG8gYmUgdXNlZAordGhpcyB3YXk6IGNvcHkgaXQgc29tZXdoZXJlIChzYXksIC92YXIvc2VydmljZSkgYW5kIHJ1biBzb21ldGhpbmcgbGlrZQorCitlbnYgLSBQQVRIPS4uLiA8b3RoZXIgdmFycz0uLi4+IHJ1bnN2ZGlyIC92YXIvc2VydmljZSAmCisKK2Zyb20gb25lIG9mIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMuIChHb29nbGUgIm1hbiBydW5zdmRpciIgYW5kICJtYW4gcnVuc3YiCitmb3IgbW9yZSBpbmZvIGFib3V0IHRoZXNlIHRvb2xzKS4KKworU29tZSBleGlzdGluZyBleGFtcGxlczoKKwordmFyX3NlcnZpY2UvZGhjcF9pZiAtCitjb250cm9scyBhIHVkaGNwYyBpbnN0YW5jZSB3aGljaCBwcm92aWRlcyBkaHBjLWFzc2lnbmVkIElQCithZGRyZXNzIG9uIGludGVyZmFjZSBuYW1lZCAiaWYiLiBDb3B5L3JlbmFtZSB0aGlzIGRpcmVjdG9yeSBhcyBuZWVkZWQgdG8gcnVuCit1ZGhjcGMgb24gb3RoZXIgaW50ZXJmYWNlcyAodmFyX3NlcnZpY2UvZGhjcF9pZi9ydW4gc2NyaXB0IHVzZXMgX2ZvbyBzdWZmaXgKK29mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFzIGludGVyZmFjZSBuYW1lKS4gV2hlbiBJUCBhZGRyZXNzIGlzIG9idGFpbmVkIG9yIGxvc3QsCit2YXJfc2VydmljZS9kaGNwX2lmL2RoY3BfaGFuZGxlciBpcyBydW4uIEl0IHNhdmVzIG5ldyBjb25maWcgZGF0YSB0bworL3Zhci9ydW4vc2VydmljZS9mdy9kaGNwX2lmLmlwY29uZiBhbmQgKHJlKXN0YXJ0cyAvdmFyL3NlcnZpY2UvZncgc2VydmljZS4KK1RoaXMgZXhhbXBsZSBjYW4gYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBvdGhlciBkeW5hbWljIG5ldHdvcmsgbGluayBzZXJ2aWNlcworKHBwcC92cG4vemNpcCkuCisKK3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYgLQord2F0Y2hlcyBsaW5rIHN0YXR1cyBvZiBpbnRlcmZhY2UgaWYuIERvd25zIGFuZCB1cHMgL3Zhci9zZXJ2aWNlL2RoY3BfaWYKK3NlcnZpY2UgYWNjb3JkaW5nbHkuIEluIGVmZmVjdCwgaXQgYWxsb3dzIHlvdSB0byB1bnBsdWcvcGx1Zy10by1kaWZmZXJlbnQtbmV0d29yaworYW5kIGhhdmUgeW91ciBJUCBwcm9wZXJseSByZS1uZWdvdGlhdGVkIGF0IG9uY2UuCisKK3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyIC0KK1VzZXMgdmFyX3NlcnZpY2UvZGhjcF9pZidzIGRhdGEgKC92YXIvc2VydmljZS9kaGNwX2lmL2RoY3BfaWYub3V0IGZpbGUpCit0byBkZXRlcm1pbmUgcm91dGVyIElQLiBQaW5ncyBpdC4gSWYgcGluZyBmYWlscywgcmVzdGFydHMgL3Zhci9zZXJ2aWNlL2RoY3BfaWYKK3NlcnZpY2UuIEJhc2ljYWxseSwgYW4gZXhhbXBsZSBvZiB3YXRjaGRvZyBzZXJ2aWNlIGZvciBuZXR3b3Jrcword2hpY2ggYXJlIG5vdCByZWxpYWJsZSBhbmQgbmVlZCBiYWJ5c2l0dGluZy4KKwordmFyX3NlcnZpY2UvZncgLQorQSAqb25lLXNob3QqIHNlcnZpY2Ugd2hpY2ggcmVjb25maWd1cmVzIG5ldHdvcmsgYmFzZWQgb24gY3VycmVudCBrbm93biBzdGF0ZQorb2YgQUxMIGludGVyZmFjZXMuIFVzZXMgY29uZi8qLmlwY29uZiAoc3RhdGljIGNvbmZpZykgYW5kIC92YXIvcnVuL3NlcnZpY2UvZncvKi5pcGNvbmYKKyhkeW5hbWljIGNvbmZpZyBmcm9tIGRoY3AvcHBwL3Zwbi9ldGMpIHRvIGRldGVybWluZSB3aGF0IHRvIGRvLgorT25lLXNob3QtbmVzcyBvZiB0aGlzIHNlcnZpY2UgbWVhbnMgdGhhdCBpdCBzaHV0cyBpdHNlbGYgb2ZmIGFmdGVyIHNpbmdsZSBydW4uCitJT1c6IGl0IGlzIG5vdCBhIGNvbnN0YW50bHkgcnVubmluZyBkYWVtb24gc29ydCBvZiB0aGluZy4KK0l0IHN0YXJ0cywgaXQgY29uZmlndXJlcyB0aGUgbmV0d29yaywgaXQgc2h1dHMgZG93biwgYWxsIGRvbmUKKyh1bmxpa2UgaW5mYW1vdXMgTmV0d29ya01hbmFnZXJzIHdoaWNoIHNpdCBpbiBSQU0gZm9yZXZlciwgZG9pbmcgaGVsbCBrbm93cyB3aGF0KS4KKworSG93ZXZlciwgYW55IGRoY3AvcHBwL3ZwbiBvciBzaW1pbGFyIHNlcnZpY2UgY2FuIHJlc3RhcnQgaXQgYW55dGltZQord2hlbiBpdCBzZW5zZXMgdGhlIGNoYW5nZSBpbiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uCitUaGlzIGV2ZW4gd29ya3Mgd2hpbGUgZncgc2VydmljZSBydW5zOiBpZiBkaGNwIHNpZ25hbHMgZncgdG8gKHJlKXN0YXJ0Cit3aGlsZSBmdyBydW5zLCBmdyB3aWxsIG5vdCBzdG9wIGFmdGVyIGl0cyBleGVjdXRpb24sIGJ1dCB3aWxsIHJlLWV4ZWN1dGUgb25jZSwKK3BpY2tpbmcgdXAgZGhjcCdzIG5ldyBjb25maWd1cmF0aW9uLgorVGhpcyBpcyBhY2hpZXZlZCB2ZXJ5IHNpbXBseSBieSBoYXZpbmcKKyMgTWFrZSBvdXJzZWxmIG9uZS1zaG90CitzdiBvIC4KK2F0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBmdy9ydW4gc2NyaXB0LCBub3QgYXQgdGhlIGVuZC4KK1RoZXJlZm9yZSwgYW55ICJzdiB1IC92YXIvcnVuL3NlcnZpY2UvZnciIGNvbW1hbmQgYnkgYW55IG90aGVyCitzY3JpcHQgInVuZG9lcyIgbyhuZS1zaG90KSBjb21tYW5kIGlmIGZ3IHN0aWxsIHJ1bnMsIHRodXMKK3J1bnN2IHdpbGwgcmVydW4gaXQ7IG9yIHN0YXJ0IGl0IGluIGEgbm9ybWFsIHdheSBpZiBmdyBpcyBub3QgcnVubmluZy4KKworU3lzdGVtIGFkbWluaXN0cmF0b3JzIGFyZSBleHBlY3RlZCB0byBlZGl0IGZ3L3J1biBzY3JpcHQsIHNpbmNlCituZXR3b3JrIGNvbmZpZ3VyYXRpb24gbmVlZHMgYXJlIGxpa2VseSB0byBiZSB2ZXJ5IGNvbXBsZXggYW5kIGRpZmZlcmVudAorZm9yIG5vbi10cml2aWFsIGluc3RhbGxhdGlvbnMuCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQyaXBjb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0MmlwY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MmEyODhlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0MmlwY29uZgpAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKyMgY29udmVydDoKKworIyBkaGNwdHlwZT01CisjIHNlcnZlcmlkPTE3Mi4xNi40Mi4xMDIKKyMgbGVhc2U9OTcyMDAKKyMgaW50ZXJmYWNlPWV0aDAKKyMgaXA9MTcyLjE2LjQyLjE3NworIyBzdWJuZXQ9MjU1LjI1NS4yNTUuMAorIyBtYXNrPTI0CisjIGJyb2FkY2FzdD0xNzIuMTYuMjIuMjU1CisjIHJvdXRlcj0xNzIuMTYuNDIuOTgKKyMgZG5zPTEwLjM0LjMyLjEyNSAxMC4zMi42My41IDEwLjM0LjI1NS43IDEwLjExLjI1NS4yNworIyBkb21haW49bGFiLmV4YW1wbGUuY29tIGV4YW1wbGUuY29tCisjIG50cHNydj0xMC4zNC4zMi4xMjUgMTAuMzQuMjU1LjcKKworIyBpbnRvOgorCisjbGV0IGNmZz1jZmcrMQorI2lmWyRjZmddPS4uLjsgaXBbJGNmZ109Li4uOyBpcG1hc2tbJGNmZ109Li4uLy4uLjsgZ3dbJGNmZ109Li4uOyBuZXRbJGNmZ109Li4uIGRuc1skY2ZnXT0uLi4KKworZXhlYyA+L2Rldi9udWxsCisjZXhlYyA+IiQwLm91dCIgICMgZGVidWcKK2V4ZWMgMj4mMQorCit0ZXN0ICIkaW50ZXJmYWNlIiB8fCBleGl0IDEKK3Rlc3QgIiRpcCIgfHwgZXhpdCAxCisKK3sKK2VjaG8gImxldCBjZmc9Y2ZnKzEiCit0ZXN0ICIkaW50ZXJmYWNlIgkmJiBlY2hvICJpZltcJGNmZ109JyRpbnRlcmZhY2UnIgordGVzdCAiJGlwIgkJJiYgZWNobyAiaXBbXCRjZmddPSckaXAnIgordGVzdCAiJGlwIiAmJiB0ZXN0ICIkbWFzayIgXAorCQkJJiYgZWNobyAiaXBtYXNrW1wkY2ZnXT0nJGlwLyRtYXNrJyIKK3Rlc3QgIiRyb3V0ZXIiCQkmJiBlY2hvICJnd1tcJGNmZ109JyRyb3V0ZXInIgordGVzdCAiJGRucyIJCSYmIGVjaG8gImRuc1tcJGNmZ109JyRkbnMnIgorIyBUT0RPOiBJIG5ldmVyIHNhdyBhIGRoY3Agc2VydmVyIHdoaWNoIGNvcnJlY3RseSBhbm5vdW5jZXMKKyMgd2hpY2ggc3VibmV0KHMpIGlzL2FyZSBhdmFpbGFibGUgdGhydSBhZHZlcnRpc2VkIHJvdXRlcgorIyBBc3N1bWUgMC8wCitlY2hvICJuZXRbXCRjZmddPScwLzAnIgorfSA+IiQxIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0Mm50cGNvbmYgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQybnRwY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZWJmMWViCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0Mm50cGNvbmYKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIGNvbnZlcnQ6CisKKyMgZGhjcHR5cGU9NQorIyBzZXJ2ZXJpZD0xNzIuMTYuNDIuMTAyCisjIGxlYXNlPTk3MjAwCisjIGludGVyZmFjZT1ldGgwCisjIGlwPTE3Mi4xNi40Mi4xNzcKKyMgc3VibmV0PTI1NS4yNTUuMjU1LjAKKyMgbWFzaz0yNAorIyBicm9hZGNhc3Q9MTcyLjE2LjIyLjI1NQorIyByb3V0ZXI9MTcyLjE2LjQyLjk4CisjIGRucz0xMC4zNC4zMi4xMjUgMTAuMzIuNjMuNSAxMC4zNC4yNTUuNyAxMC4xMS4yNTUuMjcKKyMgZG9tYWluPWxhYi5leGFtcGxlLmNvbSBleGFtcGxlLmNvbQorIyBudHBzcnY9MTAuMzQuMzIuMTI1IDEwLjM0LjI1NS43CisKKyMgaW50bzoKKworI2xldCBjZmc9Y2ZnKzEKKyNudHBpcFskY2ZnXT0uLi4KKworZXhlYyA+L2Rldi9udWxsCisjZXhlYyA+IiQwLm91dCIgICMgZGVidWcKK2V4ZWMgMj4mMQorCit0ZXN0ICIkaW50ZXJmYWNlIiB8fCBleGl0IDEKK3Rlc3QgIiRpcCIgfHwgZXhpdCAxCisKK3sKK2ZvciBuIGluICRudHBzcnY7IGRvCisJZWNobyAibGV0IGNmZz1jZmcrMSIKKwllY2hvICJudHBpcFtcJGNmZ109JyRuJyI7Citkb25lCit9ID4iJDEiCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2RoY3BfaGFuZGxlciBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvZGhjcF9oYW5kbGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyN2UwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2RoY3BfaGFuZGxlcgpAQCAtMCwwICsxLDgzIEBACisjIS9iaW4vc2gKKyMgZXhlY3V0ZWQgYnkgdWRoY3BjCisjIHBhcmFtZXRlcnM6ICQxIGFuZCBlbnZpcm9ubWVudAorIyAkMSBpczoKKyMKKyMgZGVjb25maWc6IHVkaGNwYyBzdGFydHMsIG9yIGxlYXNlIGlzIGxvc3QuCisjIEVudmlyb25tZW50IGV4YW1wbGU6IGludGVyZmFjZT1ldGgwCisjCisjIGJvdW5kOiBsZWFzZSBpcyBvYnRhaW5lZC4gRW52aXJvbm1lbnQgZXhhbXBsZToKKyMgZGhjcHR5cGU9NQorIyBzZXJ2ZXJpZD0xNzIuMTYuNDIuMTAyCisjIGxlYXNlPTk3MjAwCisjIGludGVyZmFjZT1ldGgwCisjIGlwPTE3Mi4xNi40Mi4xNzcKKyMgc3VibmV0PTI1NS4yNTUuMjU1LjAKKyMgbWFzaz0yNAorIyBicm9hZGNhc3Q9MTcyLjE2LjIyLjI1NQorIyByb3V0ZXI9MTcyLjE2LjQyLjk4CisjIGRucz0xMC4zNC4zMi4xMjUgMTAuMzIuNjMuNSAxMC4zNC4yNTUuNyAxMC4xMS4yNTUuMjcKKyMgZG9tYWluPWxhYi5leGFtcGxlLmNvbSBleGFtcGxlLmNvbQorIyBudHBzcnY9MTAuMzQuMzIuMTI1IDEwLjM0LjI1NS43CisjCisjIHJlbmV3OiBsZWFzZSBpcyByZW5ld2VkLiBFbnZpcm9ubWVudCBpcyBzaW1pbGFyIHRvICJib3VuZCIuCisjIFRoZSBJUCBhZGRyZXNzIGRvZXMgbm90IGNoYW5nZSwgaG93ZXZlciwgdGhlIG90aGVyIERIQ1AgcGFyYW1hdGVycywKKyMgc3VjaCBhcyB0aGUgZGVmYXVsdCBnYXRld2F5LCBzdWJuZXQgbWFzaywgYW5kIGRucyBzZXJ2ZXIgbWF5IGNoYW5nZS4KKyMKKyMgbmFrOiB1ZGhjcGMgcmVjZWl2ZWQgYSBOQUsgbWVzc2FnZS4KKyMgRW52aXJvbm1lbnQgZXhhbXBsZTogaW50ZXJmYWNlPWV0aDAKKyMKKyMgbGVhc2VmYWlsOiB1ZGhjcGMgY2Fubm90IG9idGFpbiBhIGxlYXNlIChESENQIHNlcnZlciBub3QgcmVzcG9uZGluZywgZXRjKS4KKyMgRW52aXJvbm1lbnQgZXhhbXBsZTogaW50ZXJmYWNlPWV0aDAKKworIyBUT0RPOiBwdXQgJGRvbWFpbiBpbnRvIC9ldGMvcmVzb2x2LmNvbmYgKHRocnUgL3Zhci9zZXJ2aWNlL2Z3KQorCitzZXJ2aWNlPSR7UFdEIyMqL30KK2ZpbGVfaXBjb25mPSIkc2VydmljZS5pcGNvbmYiCitmaWxlX250cGNvbmY9IiRzZXJ2aWNlLm50cGNvbmYiCitkaXJfaXBjb25mPSIvdmFyL3J1bi9zZXJ2aWNlL2Z3IgorZGlyX250cGNvbmY9Ii92YXIvcnVuL3NlcnZpY2UvbnRwIgorCitleGVjID4vZGV2L251bGwKKyNleGVjID4+IiQwLm91dCIgICNkZWJ1ZworZXhlYyAyPiYxCisKK2VjaG8gImBkYXRlYDogUGFyYW1zOiAkKiIKKworaWYgdGVzdCB4IiQxIiAhPSB4ImJvdW5kIiAmJiB0ZXN0IHgiJDEiICE9IHgicmVuZXciIDsgdGhlbgorCSMgUmVjb25maWd1cmUgbmV0d29yayB3aXRoIHRoaXMgaW50ZXJmYWNlIGRpc2FibGVkCisJZWNobyAiRGVjb25maWd1cmluZyIKKwlybSAiJHNlcnZpY2Uub3V0IgorCXJtICIkZmlsZV9pcGNvbmYiCisJcm0gIiRmaWxlX250cGNvbmYiCisJcm0gIiRkaXJfaXBjb25mLyRmaWxlX2lwY29uZiIKKwlybSAiJGRpcl9udHBjb25mLyRmaWxlX250cGNvbmYiCisJc3YgdSAvdmFyL3NlcnZpY2UvZncKKwlleGl0CitmaQorCisjIEJvdW5kOiB3ZSd2ZSBnb3QgdGhlIGxlYXNlCisjZW52ID4iJHNlcnZpY2Uub3V0IiAgIyBkZWJ1ZworCisuL2NvbnZlcnQyaXBjb25mICIkZmlsZV9pcGNvbmYiCisjIFJlY29uZmlndXJlIHJvdXRpbmcgYW5kIGZpcmV3YWxsIGlmIG5lZWRlZAorZGlmZiAtLWJyaWVmICIkZmlsZV9pcGNvbmYiICIkZGlyX2lwY29uZi8kZmlsZV9pcGNvbmYiID4vZGV2L251bGwgMj4mMQoraWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJZWNobyAiUmVjb25maWd1cmluZyBmdyIKKwlta2RpciAtcCAiJGRpcl9pcGNvbmYiIDI+L2Rldi9udWxsCisJY3AgIiRmaWxlX2lwY29uZiIgIiRkaXJfaXBjb25mLyRmaWxlX2lwY29uZiIKKwlzdiB1IC92YXIvc2VydmljZS9mdworZmkKKworaWYgdGVzdCAtZCAvdmFyL3NlcnZpY2UvbnRwOyB0aGVuCisJLi9jb252ZXJ0Mm50cGNvbmYgIiRmaWxlX250cGNvbmYiCisJIyBSZWNvbmZpZ3VyZSBudHAgc2VydmVyIGFkZHJlc3NlcyBpZiBuZWVkZWQKKwlkaWZmIC0tYnJpZWYgIiRmaWxlX250cGNvbmYiICIkZGlyX250cGNvbmYvJGZpbGVfbnRwY29uZiIgPi9kZXYvbnVsbCAyPiYxCisJaWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJCWVjaG8gIlJlY29uZmlndXJpbmcgbnRwIgorCQlta2RpciAtcCAiJGRpcl9udHBjb25mIiAyPi9kZXYvbnVsbAorCQljcCAiJGZpbGVfbnRwY29uZiIgIiRkaXJfbnRwY29uZi8kZmlsZV9udHBjb25mIgorCQlzdiB0IC92YXIvc2VydmljZS9udHAKKwkJc3YgdSAvdmFyL3NlcnZpY2UvbnRwCisJZmkKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2xvZy9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2xvZy9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYwZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvbG9nL3J1bgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKwordXNlcj1sb2dnZXIKKworbG9nZGlyPSIvdmFyL2xvZy9zZXJ2aWNlL2AoY2QgLi47YmFzZW5hbWUgJFBXRClgIgorbWtkaXIgLXAgIiRsb2dkaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXIiOiAiJGxvZ2RpciIKK2NobW9kIC1SIGdvLXJ3eHN0LHUrcndYICIkbG9nZGlyIgorcm0gbG9nZGlyCitsbiAtcyAiJGxvZ2RpciIgbG9nZGlyCisKKyMgbWFrZSB0aGlzIGRpciBhY2Nlc3NpYmxlIHRvIGxvZ2dlcgorY2htb2QgYStyWCAuCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorc3Zsb2dkIC10dCAiJGxvZ2RpciIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvcF9sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZWM3OWUwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9ydW4KQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3B3ZD0iJFBXRCIKKworaWY9IiR7UFdEIyMqL2RoY3BffSIKKworZWNobyAiKiBVcHBpbmcgaWZhY2UgJGlmIgoraXAgbGluayBzZXQgZGV2ICIkaWYiIHVwCisKK2VjaG8gIiogU3RhcnRpbmcgdWRoY3BjIgorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCByb290IFwKK3VkaGNwYyAtdnYgXAorLS1ob3N0bmFtZT1udWxsIFwKKy0tZm9yZWdyb3VuZCBcCistLWludGVyZmFjZT0iJGlmIiBcCistLXBpZGZpbGU9IiRwd2QvdWRoY3BjLnBpZCIgXAorLS1zY3JpcHQ9IiRwd2QvZGhjcF9oYW5kbGVyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi93X2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGIyZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZl9waW5nZXIvcnVuCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorCitkZWxheT02NworCitpZj0ke1BXRCMjKi9kaGNwX30KK2lmPSR7aWYlJV9waW5nZXJ9CisKK2lmIHRlc3QgLWYgIiQwLmxvZyI7IHRoZW4KKwl0YWlsIC05OTkgIiQwLmxvZyIgPiIkMC5sb2cubmV3IgorCW12ICIkMC5sb2cubmV3IiAiJDAubG9nIgorZmkKKwordGVzdCAtZiAiL3Zhci9zZXJ2aWNlL2RoY3BfJGlmL2RoY3BfJGlmLm91dCIgfHwgZXhlYyBlbnYgLSBzbGVlcCAiJGRlbGF5IgorLiAiL3Zhci9zZXJ2aWNlL2RoY3BfJGlmL2RoY3BfJGlmLm91dCIKK3Rlc3QgeCIkcm91dGVyIiAhPSB4IiIgfHwgZXhlYyBlbnYgLSBzbGVlcCAiJGRlbGF5IgorCisjZWNobyAiYGRhdGUgJyslWS0lbS0lZCAlSDolTTolUydgIFRlc3RpbmcgcGluZyAtYzMgJHJvdXRlciIgPj4iJDAubG9nIgorcGluZyAtYzMgIiRyb3V0ZXIiICYmIGV4ZWMgZW52IC0gc2xlZXAgIiRkZWxheSIKKworZWNobyAiYGRhdGUgJyslWS0lbS0lZCAlSDolTTolUydgIFJlc3RhcnRpbmcgL3Zhci9zZXJ2aWNlL2RoY3BfJGlmIiA+PiIkMC5sb2ciCitzdiB0ICIvdmFyL3NlcnZpY2UvZGhjcF8kaWYiCisKK2V4ZWMgZW52IC0gc2xlZXAgIiRkZWxheSIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvbG9nL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9wX2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3YjdkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3J1bgpAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj13d3cKK3VzZXI9cm9vdAorCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAordGNwc3ZkIFwKKyAgLXZFIC1sIDAgLWMgNDAgXAorICAwLjAuMC4wIDIxIFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK2Z0cGQgLXZ2IC10MTAgL3B1Yi9mdHBkX3Jvb3QKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvd19sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3dfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3dfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCit3YXRjaCAtbjIgJ3c9YHR0eXNpemUgd2A7IGg9YHR0eXNpemUgaGA7IHRhaWwgLSQoKGgtMykpIGN1cnJlbnQgMj4mMSB8IGN1dCAtYjEtJCgody0yKSknCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9mdy9jb25mLzExLjIyLjMzLjQ0LmlwY29uZi0tIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xMS4yMi4zMy40NC5pcGNvbmYtLQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQ0ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xMS4yMi4zMy40NC5pcGNvbmYtLQpAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKyMgSWYgd2UgaGF2ZSBzaW1wbGUgc3RhdGljIGFkZHJlc3MuLi4KKyMKK2xldCBjZmc9Y2ZnKzEKK2lmWyRjZmddPWlmCitpcFskY2ZnXT0xMS4yMi4zMy40NAoraXBtYXNrWyRjZmddPTExLjIyLjMzLjQ0LzI0Citnd1skY2ZnXT0xMS4yMi4zMy4xCituZXRbJGNmZ109MC8wCitkbnNbJGNmZ109JzExLjIyLjMzLjIgMTEuMjIuMzMuMycKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvMTkyLjE2OC4wLjEuaXBjb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xOTIuMTY4LjAuMS5pcGNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmNTVkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvMTkyLjE2OC4wLjEuaXBjb25mCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorIyBBIHNtYWxsIG5ldHdvcmsgd2l0aCBubyByb3V0ZXJzCisjIChtYXliZSAqd2UqIGFyZSB0aGVpciByb3V0ZXIpCisjCitsZXQgY2ZnPWNmZysxCitpZlskY2ZnXT1pZgoraXBbJGNmZ109MTkyLjE2OC4wLjEKK2lwbWFza1skY2ZnXT0xOTIuMTY4LjAuMS8yNAorIyMjIGd3WyRjZmddPQorIyMjIG5ldFskY2ZnXT0wLzAKKyMjIyBkbnNbJGNmZ109JycKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvbG8uaXBjb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi9sby5pcGNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiZTVmMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvbG8uaXBjb25mCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9iYXNoCisjIE1vc3RseSByZWR1bmRhbnQgZXhjZXB0IHdoZW4geW91IG5lZWQgZG5zW109eW91cl9zdGF0aWNfZG5zX3NydgorIworbGV0IGNmZz1jZmcrMQoraWZbJGNmZ109bG8KK2lwWyRjZmddPTEyNy4wLjAuMQoraXBtYXNrWyRjZmddPTEyNy4wLjAuMS84Citnd1skY2ZnXT0nJworbmV0WyRjZmddPScnCisjZG5zWyRjZmddPTEyNy4wLjAuMQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL2hvc3RzIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL2hvc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvaG9zdHMKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCitlY2hvICJcCisjIFRoaXMgZmlsZSBpcyBhdXRvbWFnaWNhbGx5IHJlZ2VuZXJhdGVkCisjIE5vdGUhIC9ldGMvbnNzd2l0Y2guY29uZiBtYXkgb3ZlcnJpZGUgdGhpcyEKKworIyBGb3IgbG9vcGJhY2tpbmcKKzEyNy4wLjAuMSBsb2NhbGhvc3QKKworIyBPdXIgbG9jYWwgSVBzIgorCitob3N0bmFtZT1gaG9zdG5hbWVgCit0ZXN0ICIkaG9zdG5hbWUiIHx8IGhvc3RuYW1lPWxvY2FsaG9zdAorZG9tYWluPWAoLiAvYm9vdC5jb25mOyBlY2hvICIkRE5TRE9NQUlOTkFNRSIpYAordGVzdCAiJGRvbWFpbiIgJiYgaG9zdG5hbWU9IiRob3N0bmFtZSAkaG9zdG5hbWUuJGRvbWFpbiIKKworaXAgLW8gYSBsIFwKK3wgZ3JlcCAtRiAnaW5ldCAnIFwKK3wgc2VkIC1lICdzL14uKmluZXQgLy8nIC1lICdzOlsgL10uKiQ6ICciJGhvc3RuYW1lIic6JworCitlY2hvCitlY2hvICIjIEVuZCBvZiAvZXRjL2hvc3RzIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL3Jlc29sdi5jb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL3Jlc29sdi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjE5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvcmVzb2x2LmNvbmYKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL2Jhc2gKKworZG9tYWluPWAoLiAvYm9vdC5jb25mOyBlY2hvICIkRE5TRE9NQUlOTkFNRSIpIDI+L2Rldi9udWxsYAorCitlY2hvICIjIFRoaXMgZmlsZSBpcyBhdXRvbWFnaWNhbGx5IHJlZ2VuZXJhdGVkIHdpdGggZWFjaCBib290IgorZWNobwordGVzdCAiJGRvbWFpbiIgJiYgZWNobyAiZG9tYWluICRkb21haW4iCit0ZXN0ICIkZG9tYWluIiAmJiBlY2hvICJzZWFyY2ggJGRvbWFpbiIKK2VjaG8KK2VjaG8gIiMgTm90ZSB0aGF0IG5zbG9va3VwIGNhbiBjaG9rZSBvbiBETlMgc2VydmVyIHdoaWNoIGl0c2VsZiIKK2VjaG8gIiMgZG9lcyBOT1QgaGF2ZSBkb21haW4gbmFtZS4gT3RoZXIgdGhpbmdzIGNhbiB3b3JrIGZpbmUuIgorZWNobworIyAjIElmIHdlIHJ1biBETlMgY2FjaGU6CisjIGVjaG8gIm5hbWVzZXJ2ZXIgMTI3LjAuMC4xIgorIyBleGl0CisKK3ByaW89MAoraT0wOyB3aGlsZSB0ZXN0ICIke2lmWyRpXX0iOyBkbworCXRlc3QgeCIke2Ruc19wcmlvWyRpXX0iICE9IHgiIiBcCisJJiYgdGVzdCAiJHtkbnNfcHJpb1skaV19IiAtZ3QgIiRwcmlvIiBcCisJJiYgcHJpbz0iJHtkbnNfcHJpb1skaV19IgorbGV0IGkrKzsgZG9uZQorCitpPTA7IHdoaWxlIHRlc3QgIiR7aWZbJGldfSI7IGRvCisJZm9yIGQgaW4gJHtkbnNbJGldfTsgZG8KKwkJcD0iJHtkbnNfcHJpb1skaV19IgorCQl0ZXN0IHgiJHAiID09IHgiIiAmJiBwPTAKKwkJdGVzdCB4IiRwIiA9PSB4IiRwcmlvIiB8fCBjb250aW51ZQorCQllY2hvICJuYW1lc2VydmVyICRkIgorCWRvbmUKK2xldCBpKys7IGRvbmUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTZiNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvcnVuCkBAIC0wLDAgKzEsMjExIEBACisjIS9iaW4vYmFzaAorIyAodXNpbmcgYmFzaGlzbTogYXJyYXlzKQorCitzZXJ2aWNlPSIke1BXRCMjKi99IgorcnVuZGlyPSIvdmFyL3J1bi9zZXJ2aWNlLyRzZXJ2aWNlIgorCit1c2VyPXJvb3QKK2V4dGlmPWlmCitleHRfb3Blbl90Y3A9IjIxIDIyIDgwIiAjIHNwYWNlLXNlcGFyYXRlZAorCisjIE1ha2Ugb3Vyc2VsZiBvbmUtc2hvdAorc3YgbyAuCisjIERlYnVnCisjZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJyA+PiIkMC5sb2ciCisKKyMjIyBmaWx0ZXIgVGhpcyBpcyB0aGUgZGVmYXVsdCB0YWJsZSAoaWYgbm8gLXQgb3B0aW9uIGlzIHBhc3NlZCkuICBJdCBjb250YWlucworIyMjICAgICAgICB0aGUgIGJ1aWx0LWluIGNoYWlucyBJTlBVVCAoZm9yIHBhY2tldHMgY29taW5nIGludG8gdGhlIGJveCBpdHNlbGYpLAorIyMjICAgICAgICBGT1JXQVJEIChmb3IgcGFja2V0cyBiZWluZyByb3V0ZWQgdGhyb3VnaCB0aGUgYm94KSwgYW5kIE9VVFBVVCAoZm9yCisjIyMgICAgICAgIGxvY2FsbHktZ2VuZXJhdGVkIHBhY2tldHMpLgorIyMjCisjIyMgbmF0ICAgIFRoaXMgdGFibGUgaXMgY29uc3VsdGVkIHdoZW4gYSBwYWNrZXQgdGhhdCBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24KKyMjIyAgICAgICAgaXMgZW5jb3VudGVyZWQuICBJdCBjb25zaXN0cyBvZiB0aHJlZSBidWlsdC1pbnM6IFBSRVJPVVRJTkcgKGZvcgorIyMjICAgICAgICBhbHRlcmluZyBwYWNrZXRzIGFzIHNvb24gYXMgdGhleSBjb21lIGluKSwgT1VUUFVUIChmb3IgYWx0ZXJpbmcKKyMjIyAgICAgICAgbG9jYWxseS1nZW5lcmF0ZWQgcGFja2V0cyBiZWZvcmUgcm91dGluZyksIGFuZCBQT1NUUk9VVElORyAoZm9yCisjIyMgICAgICAgIGFsdGVyaW5nIHBhY2tldHMgYXMgdGhleSBhcmUgYWJvdXQgdG8gZ28gb3V0KS4KKyMjIworIyMjIG1hbmdsZSBJdCBoYWQgdHdvIGJ1aWx0LWluIGNoYWluczogUFJFUk9VVElORyAoZm9yIGFsdGVyaW5nIGluY29taW5nCisjIyMgICAgICAgIHBhY2tldHMgYmVmb3JlIHJvdXRpbmcpIGFuZCBPVVRQVVQgKGZvciBhbHRlcmluZyBsb2NhbGx5LWdlbmVyYXRlZAorIyMjICAgICAgICBwYWNrZXRzIGJlZm9yZSByb3V0aW5nKS4gIFJlY2VudGx5IHRocmVlIG90aGVyIGJ1aWx0LWluCisjIyMgICAgICAgIGNoYWlucyBhcmUgYWRkZWQ6IElOUFVUIChmb3IgcGFja2V0cyBjb21pbmcgaW50byB0aGUgYm94CisjIyMgICAgICAgIGl0c2VsZiksIEZPUldBUkQgKGZvciBhbHRlcmluZyBwYWNrZXRzIGJlaW5nIHJvdXRlZCB0aHJvdWdoIHRoZQorIyMjICAgICAgICBib3gpLCBhbmQgUE9TVFJPVVRJTkcgKGZvciBhbHRlcmluZyBwYWNrZXRzIGFzIHRoZXkgYXJlIGFib3V0IHRvIGdvCisjIyMgICAgICAgIG91dCkuCisjIyMKKyMjIyAgICAgICAuLi5pZmFjZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmlmYWNlLi4uCisjIyMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisjIyMgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjIyMgLW1hbmdsZSxOQVQtICAgICAgICAgICAgICAgLW1hbmdsZSxmaWx0ZXItICAgLW1hbmdsZSxOQVQtLQorIyMjIHxQUkVST1VUSU5HfC0tPltSb3V0aW5nXS0tPnxGT1JXQVJEICAgICAgfC0tPnxQT1NUUk9VVElOR3wKKyMjIyAtLS0tLS0tLS0tLS0gICAgfCAgICBeICAgICAtLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tCisjIyMgICAgICAgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyMjIyAgICAgICAgICAgICAgICAgfCAgICArLS1pZiBOQVRlZC0tLS0tLS0tLS0tLSsgICAgfAorIyMjICAgICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisjIyMgICAgICAtbWFuZ2xlLGZpbHRlci0gICAgICAgICAgICAgICAgLW1hbmdsZSxOQVQsZmlsdGVyLQorIyMjICAgICAgfElOUFVUICAgICAgICB8ICArLT5bUm91dGluZ10tPnxPVVRQVVQgICAgICAgICAgIHwKKyMjIyAgICAgIC0tLS0tLS0tLS0tLS0tLSAgfCAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIyMgICAgICAgICAgICAgICAgIHwgICAgIHwKKyMjIyAgICAgICAgICAgICAgICAgdiAgICAgfAorIyMjICAgICAgICAgLi4uIExvY2FsIFByb2Nlc3MuLi4KKworZG9pdCgpIHsKKwllY2hvICIjICQqIgorCSIkQCIKK30KKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyA+IiQwLm91dCIKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3VtYXNrIDA3NworCisjIE1ha2Ugc3VyZSBydW5kaXIvIGV4aXN0cworbWtkaXIgLXAgIiRydW5kaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXI6IiAiJHJ1bmRpciIKK2NobW9kIC1SIGE9clggIiRydW5kaXIiCitybSAtcmYgcnVuZGlyIDI+L2Rldi9udWxsCitsbiAtcyAiJHJ1bmRpciIgcnVuZGlyCisKKyMgVGltZXN0YW1waW5nCitkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnCisKKworZWNobzsgZWNobyAiKiBSZWFkaW5nIElQIGNvbmZpZyIKK2NmZz0tMQorIyAgICAgICAgICAgICBzdGF0aWMgY2ZnICAgIGRoY3AsemVyb2NvbmYgZXRjCitmb3IgaXBjb25mIGluIGNvbmYvKi5pcGNvbmYgIiRydW5kaXIiLyouaXBjb25mOyBkbworCWlmIHRlc3QgLWYgIiRpcGNvbmYiOyB0aGVuCisJCWVjaG8gIisgJGlwY29uZiIKKwkJLiAiJGlwY29uZiIKKwlmaQorZG9uZQorCitlY2hvOyBlY2hvICIqIENvbmZpZ3VyaW5nIGhhcmR3YXJlIgorI2RvaXQgZXRodG9vbCAtcyBpZiBhdXRvbmVnIG9mZiBzcGVlZCAxMDAgZHVwbGV4IGZ1bGwKKyNkb2l0IGV0aHRvb2wgLUsgaWYgcnggb2ZmIHR4IG9mZiBzZyBvZmYgdHNvIG9mZgorCitlY2hvOyBlY2hvICIqIFJlc2V0dGluZyBhZGRyZXNzIGFuZCByb3V0aW5nIGluZm8iCitkb2l0IGlwIGEgZiBkZXYgbG8KK2k9MDsgd2hpbGUgdGVzdCAiJHtpZlskaV19IjsgZG8KKwlkb2l0IGlwIGEgZiBkZXYgIiR7aWZbJGldfSIKKwlkb2l0IGlwIHIgZiBkZXYgIiR7aWZbJGldfSIgcm9vdCAwLzAKK2xldCBpKys7IGRvbmUKKworZWNobzsgZWNobyAiKiBDb25maWd1cmluZyBhZGRyZXNzZXMiCitkb2l0IGlwIGEgYSBkZXYgbG8gMTI3LjAuMC4xLzggc2NvcGUgaG9zdAorZG9pdCBpcCBhIGEgZGV2IGxvIDo6MS8xMjggc2NvcGUgaG9zdAoraT0wOyB3aGlsZSB0ZXN0ICIke2lmWyRpXX0iOyBkbworCWlmIHRlc3QgIiR7aXBtYXNrWyRpXX0iOyB0aGVuCisJCWRvaXQgaXAgYSBhIGRldiAiJHtpZlskaV19IiAiJHtpcG1hc2tbJGldfSIgYnJkICsKKwkJZG9pdCBpcCBsIHNldCBkZXYgIiR7aWZbJGldfSIgdXAKKwlmaQorbGV0IGkrKzsgZG9uZQorCitlY2hvOyBlY2hvICIqIENvbmZpZ3VyaW5nIHJvdXRlcyIKK2k9MDsgd2hpbGUgdGVzdCAiJHtpZlskaV19IjsgZG8KKwlpZiB0ZXN0ICIke25ldFskaV19IiAmJiB0ZXN0ICIke2d3WyRpXX0iOyB0aGVuCisJCWRvaXQgaXAgciBhICIke25ldFskaV19IiB2aWEgIiR7Z3dbJGldfSIKKwlmaQorbGV0IGkrKzsgZG9uZQorCitlY2hvOyBlY2hvICIqIFJlY3JlYXRpbmcgL2V0Yy8qIGZpbGVzIHJlZmxlY3RpbmcgbmV3IG5ldHdvcmsgY29uZmlndXJhdGlvbjoiCitmb3IgaSBpbiBldGMvKjsgZG8KKwluPWBiYXNlbmFtZSAiJGkiYAorCWVjaG8gIisgJG4iCisJKC4gIiRpIikgPiIvZXRjLyRuIgorCWNobW9kIDY0NCAiL2V0Yy8kbiIKK2RvbmUKKworCisjIFVzYWdlOiBuZXdfY2hhaW4gPGNoYWluPiBbPHRhYmxlPl0KK25ld19jaGFpbigpIHsKKwlsb2NhbCB0PSIiCisJdGVzdCB4IiQyIiAhPSB4IiIgJiYgdD0iLXQgJDIiCisJZG9pdCBpcHRhYmxlcyAkdCAtTiAkMQorCWlwdD0iaXB0YWJsZXMgJHQgLUEgJDEiCit9CisKK2VjaG87IGVjaG8gIiogUmVzZXQgaXB0YWJsZXMiCitkb2l0IGlwdGFibGVzICAgICAgICAgICAtLWZsdXNoCitkb2l0IGlwdGFibGVzICAgICAgICAgICAtLWRlbGV0ZS1jaGFpbgorZG9pdCBpcHRhYmxlcyAgICAgICAgICAgLS16ZXJvCitkb2l0IGlwdGFibGVzIC10IG5hdCAgICAtLWZsdXNoCitkb2l0IGlwdGFibGVzIC10IG5hdCAgICAtLWRlbGV0ZS1jaGFpbgorZG9pdCBpcHRhYmxlcyAtdCBuYXQgICAgLS16ZXJvCitkb2l0IGlwdGFibGVzIC10IG1hbmdsZSAtLWZsdXNoCitkb2l0IGlwdGFibGVzIC10IG1hbmdsZSAtLWRlbGV0ZS1jaGFpbgorZG9pdCBpcHRhYmxlcyAtdCBtYW5nbGUgLS16ZXJvCisKK2VjaG87IGVjaG8gIiogQ29uZmlndXJlIGlwdGFibGVzIgorZG9pdCBtb2Rwcm9iZSBuZl9uYXRfZnRwCitkb2l0IG1vZHByb2JlIG5mX25hdF90ZnRwCitkb2l0IG1vZHByb2JlIG5mX2Nvbm50cmFja19mdHAKK2RvaXQgbW9kcHJvYmUgbmZfY29ubnRyYWNrX3RmdHAKKworIyAgICAgICAqKiogbmF0ICoqKgorIyAgICAgICBJTkNPTUlORyBUUkFGRklDCitpcHQ9ImlwdGFibGVzIC10IG5hdCAtQSBQUkVST1VUSU5HIgorIyBub3RoaW5nIGhlcmUKKworIyAgICAgICBMT0NBTExZIE9SSUdJTkFURUQgVFJBRkZJQworaXB0PSJpcHRhYmxlcyAtdCBuYXQgLUEgT1VUUFVUIgorIyBub3RoaW5nIGhlcmUKKworIyAgICAgICBPVVRHT0lORyBUUkFGRklDCitpcHQ9ImlwdGFibGVzIC10IG5hdCAtQSBQT1NUUk9VVElORyIKKyMgTWFzcXVlcmFkZSBib3hlcyBvbiBteSBwcml2YXRlIG5ldAorZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1vICRleHRpZiAtaiBNQVNRVUVSQURFCisKKyMgICAgICAgKioqIG1hbmdsZSAqKioKKyMjIyBERUJVRworIyMjIGlwdD0iaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBSRVJPVVRJTkciCisjIyMgZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1qIFJFVFVSTgorIyMjIGlwdD0iaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIEZPUldBUkQiCisjIyMgZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1qIFJFVFVSTgorIyMjIGlwdD0iaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBPU1RST1VUSU5HIgorIyMjIGRvaXQgJGlwdCAtcyAxOTIuMTY4LjAuMC8yNCAtaiBSRVRVUk4KKyMgbm90aGluZyBoZXJlCisKKyMgICAgICAgKioqIGZpbHRlciAqKioKKyMKK25ld19jaGFpbiBpZXh0IGZpbHRlcgorI2RvaXQgJGlwdCAtcyAyMDMuMTc3LjEwNC43MiAtaiBEUk9QCSMgU29tZSBpZGlvdCBwcm9iZXMgbXkgc3NoCisjZG9pdCAkaXB0IC1kIDIwMy4xNzcuMTA0LjcyIC1qIERST1AJIyBTb21lIGlkaW90IHByb2JlcyBteSBzc2gKK2RvaXQgJGlwdCAtbSBzdGF0ZSAtLXN0YXRlIEVTVEFCTElTSEVELFJFTEFURUQgLWogUkVUVVJOICAjIEZUUCBkYXRhIGV0YyBpcyBvaworaWYgdGVzdCAiJGV4dF9vcGVuX3RjcCI7IHRoZW4KKwlwb3J0bGlzdD0iJHtleHRfb3Blbl90Y3AvLyAvLH0iCisJZG9pdCAkaXB0IC1wIHRjcCAtbSBtdWx0aXBvcnQgLS1kcG9ydHMgJHBvcnRsaXN0IC1qIFJFVFVSTgorZmkKK2RvaXQgJGlwdCAtcCB0Y3AgLWogUkVKRUNUCSMgQW55dGhpbmcgZWxzZSBpc24ndCBvay4gUkVKRUNUID0gaXJjIG9wZW5zIGZhc3RlcgorCQkJCSMgKGl0IHByb2JlcyBwcm94eSBwb3J0cywgRFJPUCB3aWxsIGluY3VyIHRpbWVvdXQgZGVsYXlzKQoraXB0PSJpcHRhYmxlcyAtdCBmaWx0ZXIgLUEgSU5QVVQiCitkb2l0ICRpcHQgLWkgJGV4dGlmIC1qIGlleHQKKworCitlY2hvOyBlY2hvICIqIEVuYWJsaW5nIGZvcndhcmRpbmciCitlY2hvIDEgPi9wcm9jL3N5cy9uZXQvaXB2NC9pcF9mb3J3YXJkCitlY2hvICIvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZDogYGNhdCAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZGAiCisKKworIyBTaWduYWwgZXZlcnlib2R5IHRoYXQgZmlyZXdhbGwgaXMgdXAKK2RhdGUgJyslWS0lbS0lZCAlSDolTTolUycgPiIkcnVuZGlyL3VwIgorCisjIE9rLCBzcGV3IG91dCBnb2JzIG9mIGluZm8gYW5kIGRpc2FibGUgb3Vyc2VsZgorZWNobzsgZWNobyAiKiBJUDoiCitpcCBhIGwKK2VjaG87IGVjaG8gIiogUm91dGluZzoiCitpcCByIGwKK2VjaG87IGVjaG8gIiogRmlyZXdhbGw6IgoreworZWNobyAnLS0tRklMVEVSLS0nOworaXB0YWJsZXMgLXYgLUwgLXggLW47CitlY2hvICctLS1OQVQtLS0tLSc7CitpcHRhYmxlcyAtdCBuYXQgLXYgLUwgLXggLW47CitlY2hvICctLS1NQU5HTEUtLSc7CitpcHRhYmxlcyAtdCBtYW5nbGUgLXYgLUwgLXggLW47Cit9IFwKK3wgZ3JlcCAtdiAnXiQnIHwgZ3JlcCAtRnYgJ2J5dGVzIHRhcmdldCcKK2VjaG8KKworZWNobyAiKiBFbmQgb2YgZmlyZXdhbGwgY29uZmlndXJhdGlvbiIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3N0YXQgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9zdGF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA4NzM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9zdGF0CkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCitlY2hvOyBlY2hvICIqIEZpcmV3YWxsOiIKK3sKK2VjaG8gJy0tLUZJTFRFUi0tJzsKK2lwdGFibGVzIC12IC1MIC14IC1uOworZWNobyAnLS0tTkFULS0tLS0nOworaXB0YWJsZXMgLXQgbmF0IC12IC1MIC14IC1uOworZWNobyAnLS0tTUFOR0xFLS0nOworaXB0YWJsZXMgLXQgbWFuZ2xlIC12IC1MIC14IC1uOworfSBcCit8IGdyZXAgLXYgJ14kJyB8IGdyZXAgLUZ2ICdieXRlcyB0YXJnZXQnIHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2FsdDA4eDE2K3VuaW1hcC5mbnQgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2FsdDA4eDE2K3VuaW1hcC5mbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjYzQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvYWx0MDh4MTYrdW5pbWFwLmZudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2NmZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmNjNlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2NmZwpAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vc2gKKworaWYgdGVzdCB4IiRURVJNIiA9IHgiIiAtbyB4IiRURVJNIiA9IHgidW5rbm93biI7IHRoZW4KKwlURVJNPSJsaW51eCIKKwllY2hvICIqIFNldHRpbmcgVEVSTT0nJFRFUk0nIgorZmkKK2V4cG9ydCBURVJNCisKK3R0eW5hbWU9YHR0eWAKK3R0eWJhc2U9IiR7dHR5bmFtZSUlWzAxMjM0NTY3ODldKn0iICAgICAjIHN0cmlwIG51bWVyaWMgdGFpbAorCitpZiB0ZXN0IHgiJHR0eWJhc2UiID0geCIvZGV2L3ZjLyIgLW8geCIkdHR5YmFzZSIgPSB4Ii9kZXYvdHR5IjsgdGhlbgorCWVjaG8gIiogQWN0aXZhdGluZyBDeXJpbGxpYyBLT0k4LVIgLT4gQ1A4NjYgZm9udCBtYXAiCisJZWNobyAtbmUgIlwwMzMoSyIgPiIkdHR5bmFtZSIKKworCWVjaG8gIiogTG9hZGluZyBzY3JlZW4gZm9udCIKKwlzZXRmb250IFwKKwkJLUMgIiR0dHluYW1lIiBcCisJCS1tICIkUFdEL2tvaThyX3RvX3VuaS50cmFucyIgXAorCQkiJFBXRC9hbHQwOHgxNit1bmltYXAuZm50IiBcCisJfHwgZWNobyAiISBzZXRmb250IGZhaWx1cmUiCisKKwllY2hvICIqIExvYWRpbmcga2V5bWFwIgorCWxvYWRrZXlzICIkUFdEL3J1X2tvaThyLmtleW1hcCIgXAorCXx8IGVjaG8gIiEgbG9hZGtleXMgZmFpbHVyZSIKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2tvaThyX3RvX3VuaS50cmFucyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEva29pOHJfdG9fdW5pLnRyYW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmJkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2tvaThyX3RvX3VuaS50cmFucwpAQCAtMCwwICsxLDI1NiBAQAorMHgwMCBVKzAwMDAgICMgIE5VTEwgKE5VTCkKKzB4MDEgVSswMDAxICAjICBTVEFSVCBPRiBIRUFESU5HIChTT0gpCisweDAyIFUrMDAwMiAgIyAgU1RBUlQgT0YgVEVYVCAoU1RYKQorMHgwMyBVKzAwMDMgICMgIEVORCBPRiBURVhUIChFVFgpCisweDA0IFUrMDAwNCAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiAoRU9UKQorMHgwNSBVKzAwMDUgICMgIEVOUVVJUlkgKEVOUSkKKzB4MDYgVSswMDA2ICAjICBBQ0tOT1dMRURHRSAoQUNLKQorMHgwNyBVKzAwMDcgICMgIEJFTEwgKEJFTCkKKzB4MDggVSswMDA4ICAjICBCQUNLU1BBQ0UgKEJTKQorMHgwOSBVKzAwMDkgICMgIENIQVJBQ1RFUiBUQUJVTEFUSU9OIChIVCkKKzB4MGEgVSswMDBBICAjICBMSU5FIEZFRUQgKExGKQorMHgwYiBVKzAwMEIgICMgIExJTkUgVEFCVUxBVElPTiAoVlQpCisweDBjIFUrMDAwQyAgIyAgRk9STSBGRUVEIChGRikKKzB4MGQgVSswMDBEICAjICBDQVJSSUFHRSBSRVRVUk4gKENSKQorMHgwZSBVKzAwMEUgICMgIFNISUZUIE9VVCAoU08pCisweDBmIFUrMDAwRiAgIyAgU0hJRlQgSU4gKFNJKQorMHgxMCBVKzAwMTAgICMgIERBVEFMSU5LIEVTQ0FQRSAoRExFKQorMHgxMSBVKzAwMTEgICMgIERFVklDRSBDT05UUk9MIE9ORSAoREMxKQorMHgxMiBVKzAwMTIgICMgIERFVklDRSBDT05UUk9MIFRXTyAoREMyKQorMHgxMyBVKzAwMTMgICMgIERFVklDRSBDT05UUk9MIFRIUkVFIChEQzMpCisweDE0IFUrMDAxNCAgIyAgREVWSUNFIENPTlRST0wgRk9VUiAoREM0KQorMHgxNSBVKzAwMTUgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFIChOQUspCisweDE2IFUrMDAxNiAgIyAgU1lOQ0hST05PVVMgSURMRSAoU1lOKQorMHgxNyBVKzAwMTcgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sgKEVUQikKKzB4MTggVSswMDE4ICAjICBDQU5DRUwgKENBTikKKzB4MTkgVSswMDE5ICAjICBFTkQgT0YgTUVESVVNIChFTSkKKzB4MWEgVSswMDFBICAjICBTVUJTVElUVVRFIChTVUIpCisweDFiIFUrMDAxQiAgIyAgRVNDQVBFIChFU0MpCisweDFjIFUrMDAxQyAgIyAgRklMRSBTRVBBUkFUT1IgKElTNCkKKzB4MWQgVSswMDFEICAjICBHUk9VUCBTRVBBUkFUT1IgKElTMykKKzB4MWUgVSswMDFFICAjICBSRUNPUkQgU0VQQVJBVE9SIChJUzIpCisweDFmIFUrMDAxRiAgIyAgVU5JVCBTRVBBUkFUT1IgKElTMSkKKzB4MjAgVSswMDIwICAjICBTUEFDRQorMHgyMSBVKzAwMjEgICMgIEVYQ0xBTUFUSU9OIE1BUksKKzB4MjIgVSswMDIyICAjICBRVU9UQVRJT04gTUFSSworMHgyMyBVKzAwMjMgICMgIE5VTUJFUiBTSUdOCisweDI0IFUrMDAyNCAgIyAgRE9MTEFSIFNJR04KKzB4MjUgVSswMDI1ICAjICBQRVJDRU5UIFNJR04KKzB4MjYgVSswMDI2ICAjICBBTVBFUlNBTkQKKzB4MjcgVSswMDI3ICAjICBBUE9TVFJPUEhFCisweDI4IFUrMDAyOCAgIyAgTEVGVCBQQVJFTlRIRVNJUworMHgyOSBVKzAwMjkgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisweDJhIFUrMDAyQSAgIyAgQVNURVJJU0sKKzB4MmIgVSswMDJCICAjICBQTFVTIFNJR04KKzB4MmMgVSswMDJDICAjICBDT01NQQorMHgyZCBVKzAwMkQgICMgIEhZUEhFTi1NSU5VUworMHgyZSBVKzAwMkUgICMgIEZVTEwgU1RPUAorMHgyZiBVKzAwMkYgICMgIFNPTElEVVMKKzB4MzAgVSswMDMwICAjICBESUdJVCBaRVJPCisweDMxIFUrMDAzMSAgIyAgRElHSVQgT05FCisweDMyIFUrMDAzMiAgIyAgRElHSVQgVFdPCisweDMzIFUrMDAzMyAgIyAgRElHSVQgVEhSRUUKKzB4MzQgVSswMDM0ICAjICBESUdJVCBGT1VSCisweDM1IFUrMDAzNSAgIyAgRElHSVQgRklWRQorMHgzNiBVKzAwMzYgICMgIERJR0lUIFNJWAorMHgzNyBVKzAwMzcgICMgIERJR0lUIFNFVkVOCisweDM4IFUrMDAzOCAgIyAgRElHSVQgRUlHSFQKKzB4MzkgVSswMDM5ICAjICBESUdJVCBOSU5FCisweDNhIFUrMDAzQSAgIyAgQ09MT04KKzB4M2IgVSswMDNCICAjICBTRU1JQ09MT04KKzB4M2MgVSswMDNDICAjICBMRVNTLVRIQU4gU0lHTgorMHgzZCBVKzAwM0QgICMgIEVRVUFMUyBTSUdOCisweDNlIFUrMDAzRSAgIyAgR1JFQVRFUi1USEFOIFNJR04KKzB4M2YgVSswMDNGICAjICBRVUVTVElPTiBNQVJLCisweDQwIFUrMDA0MCAgIyAgQ09NTUVSQ0lBTCBBVAorMHg0MSBVKzAwNDEgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIgVSswMDQyICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzIFUrMDA0MyAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NCBVKzAwNDQgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUgVSswMDQ1ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2IFUrMDA0NiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NyBVKzAwNDcgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDggVSswMDQ4ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5IFUrMDA0OSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0YSBVKzAwNEEgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NGIgVSswMDRCICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRjIFUrMDA0QyAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0ZCBVKzAwNEQgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NGUgVSswMDRFICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRmIFUrMDA0RiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MCBVKzAwNTAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEgVSswMDUxICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyIFUrMDA1MiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MyBVKzAwNTMgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQgVSswMDU0ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1IFUrMDA1NSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NiBVKzAwNTYgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcgVSswMDU3ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4IFUrMDA1OCAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OSBVKzAwNTkgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NWEgVSswMDVBICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDViIFUrMDA1QiAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1YyBVKzAwNUMgICMgIFJFVkVSU0UgU09MSURVUworMHg1ZCBVKzAwNUQgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVlIFUrMDA1RSAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NWYgVSswMDVGICAjICBMT1cgTElORQorMHg2MCBVKzAwNjAgICMgIEdSQVZFIEFDQ0VOVAorMHg2MSBVKzAwNjEgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisweDYyIFUrMDA2MiAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMgVSswMDYzICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NCBVKzAwNjQgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisweDY1IFUrMDA2NSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYgVSswMDY2ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NyBVKzAwNjcgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisweDY4IFUrMDA2OCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkgVSswMDY5ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2YSBVKzAwNkEgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisweDZiIFUrMDA2QiAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NmMgVSswMDZDICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2ZCBVKzAwNkQgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisweDZlIFUrMDA2RSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NmYgVSswMDZGICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MCBVKzAwNzAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisweDcxIFUrMDA3MSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIgVSswMDcyICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MyBVKzAwNzMgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisweDc0IFUrMDA3NCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUgVSswMDc1ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NiBVKzAwNzYgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisweDc3IFUrMDA3NyAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzggVSswMDc4ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OSBVKzAwNzkgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisweDdhIFUrMDA3QSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N2IgVSswMDdCICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKzB4N2MgVSswMDdDICAjICBWRVJUSUNBTCBMSU5FCisweDdkIFUrMDA3RCAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3ZSBVKzAwN0UgICMgIFRJTERFCisweDdmIFUrMDA3RiAgIyAgREVMRVRFIChERUwpCisweDgwIFUrMjUwMCAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKzB4ODEgVSsyNTAyICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKzB4ODIgVSsyNTBDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ODMgVSsyNTEwICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHg4NCBVKzI1MTQgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4ODUgVSsyNTE4ICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ODYgVSsyNTFDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweDg3IFUrMjUyNCAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisweDg4IFUrMjUyQyAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKzB4ODkgVSsyNTM0ICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4OGEgVSsyNTNDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4OGIgVSsyNTgwICAjICBVUFBFUiBIQUxGIEJMT0NLCisweDhjIFUrMjU4NCAgIyAgTE9XRVIgSEFMRiBCTE9DSworMHg4ZCBVKzI1ODggICMgIEZVTEwgQkxPQ0sKKzB4OGUgVSsyNThDICAjICBMRUZUIEhBTEYgQkxPQ0sKKzB4OGYgVSsyNTkwICAjICBSSUdIVCBIQUxGIEJMT0NLCisweDkwIFUrMjU5MSAgIyAgTElHSFQgU0hBREUKKzB4OTEgVSsyNTkyICAjICBNRURJVU0gU0hBREUKKzB4OTIgVSsyNTkzICAjICBEQVJLIFNIQURFCisweDkzIFUrMjMyMCAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKzB4OTQgVSsyNUEwICAjICBCTEFDSyBTUVVBUkUKKzB4OTUgVSsyMjE5ICAjICBCVUxMRVQgT1BFUkFUT1IKKzB4OTYgVSsyMjFBICAjICBTUVVBUkUgUk9PVAorMHg5NyBVKzIyNDggICMgIEFMTU9TVCBFUVVBTCBUTworMHg5OCBVKzIyNjQgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworMHg5OSBVKzIyNjUgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworMHg5YSBVKzAwQTAgICMgIE5PLUJSRUFLIFNQQUNFCisweDliIFUrMjMyMSAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKzB4OWMgVSswMEIwICAjICBERUdSRUUgU0lHTgorMHg5ZCBVKzAwQjIgICMgIFNVUEVSU0NSSVBUIFRXTworMHg5ZSBVKzAwQjcgICMgIE1JRERMRSBET1QKKzB4OWYgVSswMEY3ICAjICBESVZJU0lPTiBTSUdOCisweGEwIFUrMjU1MCAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisweGExIFUrMjU1MSAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhhMiBVKzI1NTIgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGEzIFUrMDQ1MSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisweGE0IFUrMjU1MyAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YTUgVSsyNTU0ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisweGE2IFUrMjU1NSAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhhNyBVKzI1NTYgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YTggVSsyNTU3ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKzB4YTkgVSsyNTU4ICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4YWEgVSsyNTU5ICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YWIgVSsyNTVBICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorMHhhYyBVKzI1NUIgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGFkIFUrMjU1QyAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YWUgVSsyNTVEICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisweGFmIFUrMjU1RSAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGIwIFUrMjU1RiAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGIxIFUrMjU2MCAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YjIgVSsyNTYxICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiMyBVKzA0MDEgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisweGI0IFUrMjU2MiAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjUgVSsyNTYzICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGI2IFUrMjU2NCAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhiNyBVKzI1NjUgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4YjggVSsyNTY2ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4YjkgVSsyNTY3ICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhiYSBVKzI1NjggICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGJiIFUrMjU2OSAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorMHhiYyBVKzI1NkEgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGJkIFUrMjU2QiAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4YmUgVSsyNTZDICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGJmIFUrMDBBOSAgIyAgQ09QWVJJR0hUIFNJR04KKzB4YzAgVSswNDRFICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKzB4YzEgVSswNDMwICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorMHhjMiBVKzA0MzEgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorMHhjMyBVKzA0NDYgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKzB4YzQgVSswNDM0ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKzB4YzUgVSswNDM1ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKzB4YzYgVSswNDQ0ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKzB4YzcgVSswNDMzICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisweGM4IFUrMDQ0NSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisweGM5IFUrMDQzOCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKzB4Y2EgVSswNDM5ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorMHhjYiBVKzA0M0EgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorMHhjYyBVKzA0M0IgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorMHhjZCBVKzA0M0MgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorMHhjZSBVKzA0M0QgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorMHhjZiBVKzA0M0UgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBPCisweGQwIFUrMDQzRiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisweGQxIFUrMDQ0RiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisweGQyIFUrMDQ0MCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisweGQzIFUrMDQ0MSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisweGQ0IFUrMDQ0MiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisweGQ1IFUrMDQ0MyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKzB4ZDYgVSswNDM2ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisweGQ3IFUrMDQzMiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisweGQ4IFUrMDQ0QyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorMHhkOSBVKzA0NEIgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisweGRhIFUrMDQzNyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisweGRiIFUrMDQ0OCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorMHhkYyBVKzA0NEQgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFCisweGRkIFUrMDQ0OSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisweGRlIFUrMDQ0NyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorMHhkZiBVKzA0NEEgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKzB4ZTAgVSswNDJFICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorMHhlMSBVKzA0MTAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKzB4ZTIgVSswNDExICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorMHhlMyBVKzA0MjYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorMHhlNCBVKzA0MTQgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisweGU1IFUrMDQxNSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKzB4ZTYgVSswNDI0ICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorMHhlNyBVKzA0MTMgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorMHhlOCBVKzA0MjUgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisweGU5IFUrMDQxOCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorMHhlYSBVKzA0MTkgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKzB4ZWIgVSswNDFBICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorMHhlYyBVKzA0MUIgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisweGVkIFUrMDQxQyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKzB4ZWUgVSswNDFEICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorMHhlZiBVKzA0MUUgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKzB4ZjAgVSswNDFGICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorMHhmMSBVKzA0MkYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisweGYyIFUrMDQyMCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKzB4ZjMgVSswNDIxICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworMHhmNCBVKzA0MjIgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisweGY1IFUrMDQyMyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorMHhmNiBVKzA0MTYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorMHhmNyBVKzA0MTIgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisweGY4IFUrMDQyQyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisweGY5IFUrMDQyQiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorMHhmYSBVKzA0MTcgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisweGZiIFUrMDQyOCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisweGZjIFUrMDQyRCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorMHhmZCBVKzA0MjkgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisweGZlIFUrMDQyNyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisweGZmIFUrMDQyQSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2xvZ2luLnNoIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9sb2dpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjliNmZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9sb2dpbi5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKwordHR5bmFtZT1gdHR5YAordHR5YmFzZT0iJHt0dHluYW1lJSVbMDEyMzQ1Njc4OV0qfSIgICAgICMgc3RyaXAgbnVtZXJpYyB0YWlsCisKK2lmIHRlc3QgIiR0dHliYXNlIiA9ICIvZGV2L3R0eSI7IHRoZW4KKwl0YWlsPSIke3R0eW5hbWU6OH0iCisJZWNobyAiKiBTZXR0aW5nIHRlcm1pbmFsIGRldmljZSdzIG93bmVyIHRvICRMT0dJTl9VSUQ6JExPR0lOX0dJRCIKKwljaG93biAiJExPR0lOX1VJRDokTE9HSU5fR0lEIiAiL2Rldi92Y3MkdGFpbCIgIi9kZXYvdmNzYSR0YWlsIgorZmkKKyMgV2UgY2FuIGRvIHRoaXMgYWxzbywgYnV0IGxvZ2luIGRvZXMgaXQgaXRzZWxmCisjIGNob3duICIkTE9HSU5fVUlEOiRMT0dJTl9HSUQiICIkdHR5bmFtZSIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvcnVfa29pOHIua2V5bWFwIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydV9rb2k4ci5rZXltYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MTE1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvcnVfa29pOHIua2V5bWFwCkBAIC0wLDAgKzEsMTgzIEBACitrZXltYXBzIDAsMSwgMiwzLCA0LDYsIDgsMTAsIDEyLDE0CisjCisjIFRoaXMgb25lIGlzIGZvciBnZW5lcmF0aW5nIGtvaThyIFJ1c3NpYW4gY2hhcnMKKyMgQ3lyL0xhdCBzd2l0Y2hlczogIFJpZ2h0QWx0LCBTaGlmdCtDdHJsLCBDdHJsK1NoaWZ0CisjIChsYXN0IG9uZSBkb2VzIG5vdCB3b3JrIGZvciBkYXJrIGFuZCBvYnNjdXJlIHJlYXNvbnMgOCggKQorIworIyBwbGFpbixzaGlmdCwgcGxhaW4sc2hpZnQsIGN0cmwsY3RybCBhbHQsYWx0IGN0cmxhbHQsY3RybGFsdAorIyBsYXQtLS0tLS0tLSAgY3lyLS0tLS0tLS0gIGxhdCAgY3lyICBsYXQgY3lyIGxhdCAgICAgY3lyCisjCisjU2hpZnQgICAgICAgICAgICAgICAgICAgICAxCisjQWx0R3IgKGN5cikgICAgICAgICAgICAgICAyCisjQ29udHJvbCAgICAgICAgICAgICAgICAgICA0CisjQWx0ICAgICAgICAgICAgICAgICAgICAgICA4CisjU2hpZnRMICAgICAgICAgICAgICAgICAgIDE2CisjU2hpZnRSICAgICAgICAgICAgICAgICAgIDMyCisjQ3RybEwgICAgICAgICAgICAgICAgICAgIDY0CisjQ3RybFIgICAgICAgICAgICAgICAgICAgMTI4CisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICAgMSA9ICAgRXNjYXBlICAgICAgICAgIEVzY2FwZSAgICAgICAgICBFc2NhcGUgICAgICAgICAgRXNjYXBlICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIE1ldGFfRXNjYXBlICAgICAgICAgICAgIE1ldGFfRXNjYXBlICAgICAgICAgICAgIFNBSyAgICAgICAgICAgICAgICAgICAgIFNBSwora2V5Y29kZSAgIDIgPSAgIG9uZSAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgb25lICAgICAgICAgICAgIGV4Y2xhbSAgICAgICAgICBleGNsYW0gICAgICAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgICAgICAgICBNZXRhX29uZSAgICAgICAgICAgICAgICBNZXRhX29uZQora2V5Y29kZSAgIDMgPSAgIHR3byAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgdHdvICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBNZXRhX3R3byAgICAgICAgICAgICAgICBNZXRhX3R3bwora2V5Y29kZSAgIDQgPSAgIHRocmVlICAgICAgICAgICBudW1iZXJzaWduICAgICAgdGhyZWUgICAgICAgICAgIG51bWJlcnNpZ24gICAgICB0aHJlZSAgICAgICAgICAgICAgICAgICB0aHJlZSAgICAgICAgICAgICAgICAgICBNZXRhX3RocmVlICAgICAgICAgICAgICBNZXRhX3RocmVlCitrZXljb2RlICAgNSA9ICAgZm91ciAgICAgICAgICAgIGRvbGxhciAgICAgICAgICBmb3VyICAgICAgICAgICAgZG9sbGFyICAgICAgICAgIENvbnRyb2xfYmFja3NsYXNoICAgICAgIENvbnRyb2xfYmFja3NsYXNoICAgICAgIE1ldGFfZm91ciAgICAgICAgICAgICAgIE1ldGFfZm91cgora2V5Y29kZSAgIDYgPSAgIGZpdmUgICAgICAgICAgICBwZXJjZW50ICAgICAgICAgZml2ZSAgICAgICAgICAgIHBlcmNlbnQgICAgICAgICBDb250cm9sX2JyYWNrZXRyaWdodCAgICBDb250cm9sX2JyYWNrZXRyaWdodCAgICBNZXRhX2ZpdmUgICAgICAgICAgICAgICBNZXRhX2ZpdmUKK2tleWNvZGUgICA3ID0gICBzaXggICAgICAgICAgICAgYXNjaWljaXJjdW0gICAgIHNpeCAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgQ29udHJvbF9hc2NpaWNpcmN1bSAgICAgQ29udHJvbF9hc2NpaWNpcmN1bSAgICAgTWV0YV9zaXggICAgICAgICAgICAgICAgTWV0YV9zaXgKK2tleWNvZGUgICA4ID0gICBzZXZlbiAgICAgICAgICAgYW1wZXJzYW5kICAgICAgIHNldmVuICAgICAgICAgICBhbXBlcnNhbmQgICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgTWV0YV9zZXZlbiAgICAgICAgICAgICAgTWV0YV9zZXZlbgora2V5Y29kZSAgIDkgPSAgIGVpZ2h0ICAgICAgICAgICBhc3RlcmlzayAgICAgICAgZWlnaHQgICAgICAgICAgIGFzdGVyaXNrICAgICAgICBlaWdodCAgICAgICAgICAgICAgICAgICBlaWdodCAgICAgICAgICAgICAgICAgICBNZXRhX2VpZ2h0ICAgICAgICAgICAgICBNZXRhX2VpZ2h0CitrZXljb2RlICAxMCA9ICAgbmluZSAgICAgICAgICAgIHBhcmVubGVmdCAgICAgICBuaW5lICAgICAgICAgICAgcGFyZW5sZWZ0ICAgICAgIG5pbmUgICAgICAgICAgICAgICAgICAgIG5pbmUgICAgICAgICAgICAgICAgICAgIE1ldGFfbmluZSAgICAgICAgICAgICAgIE1ldGFfbmluZQora2V5Y29kZSAgMTEgPSAgIHplcm8gICAgICAgICAgICBwYXJlbnJpZ2h0ICAgICAgemVybyAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICB6ZXJvICAgICAgICAgICAgICAgICAgICB6ZXJvICAgICAgICAgICAgICAgICAgICBNZXRhX3plcm8gICAgICAgICAgICAgICBNZXRhX3plcm8KK2tleWNvZGUgIDEyID0gICBtaW51cyAgICAgICAgICAgdW5kZXJzY29yZSAgICAgIG1pbnVzICAgICAgICAgICB1bmRlcnNjb3JlICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgTWV0YV9taW51cyAgICAgICAgICAgICAgTWV0YV9taW51cwora2V5Y29kZSAgMTMgPSAgIGVxdWFsICAgICAgICAgICBwbHVzICAgICAgICAgICAgZXF1YWwgICAgICAgICAgIHBsdXMgICAgICAgICAgICBlcXVhbCAgICAgICAgICAgICAgICAgICBlcXVhbCAgICAgICAgICAgICAgICAgICBNZXRhX2VxdWFsICAgICAgICAgICAgICBNZXRhX2VxdWFsCitrZXljb2RlICAxNCA9ICAgRGVsZXRlICAgICAgICAgIERlbGV0ZSAgICAgICAgICBEZWxldGUgICAgICAgICAgRGVsZXRlICAgICAgICAgIEJhY2tTcGFjZSAgICAgICAgICAgICAgIEJhY2tTcGFjZSAgICAgICAgICAgICAgIE1ldGFfRGVsZXRlICAgICAgICAgICAgIE1ldGFfRGVsZXRlCitrZXljb2RlICAxNSA9ICAgVGFiICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICBUYWIgICAgICAgICAgICAgVGFiICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAgICAgICAgIE1ldGFfVGFiICAgICAgICAgICAgICAgIE1ldGFfVGFiCitrZXljb2RlICAxNiA9ICAgcSAgICAgICAgICAgICAgIFEgICAgICAgICAgICAgICAyMDIgICAgICAgICAgICAgMjM0ICAgICAgICAgICAgIENvbnRyb2xfcSAgICAgICAgICAgICAgIENvbnRyb2xfcSAgICAgICAgICAgICAgIE1ldGFfcSAgICAgICAgICAgICAgICAgIE1ldGFfcSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9xICAgICAgICAgIE1ldGFfQ29udHJvbF9xCitrZXljb2RlICAxNyA9ICAgdyAgICAgICAgICAgICAgIFcgICAgICAgICAgICAgICAxOTUgICAgICAgICAgICAgMjI3ICAgICAgICAgICAgIENvbnRyb2xfdyAgICAgICAgICAgICAgIENvbnRyb2xfdyAgICAgICAgICAgICAgIE1ldGFfdyAgICAgICAgICAgICAgICAgIE1ldGFfdyAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF93ICAgICAgICAgIE1ldGFfQ29udHJvbF93CitrZXljb2RlICAxOCA9ICAgZSAgICAgICAgICAgICAgIEUgICAgICAgICAgICAgICAyMTMgICAgICAgICAgICAgMjQ1ICAgICAgICAgICAgIENvbnRyb2xfZSAgICAgICAgICAgICAgIENvbnRyb2xfZSAgICAgICAgICAgICAgIE1ldGFfZSAgICAgICAgICAgICAgICAgIE1ldGFfZSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9lICAgICAgICAgIE1ldGFfQ29udHJvbF9lCitrZXljb2RlICAxOSA9ICAgciAgICAgICAgICAgICAgIFIgICAgICAgICAgICAgICAyMDMgICAgICAgICAgICAgMjM1ICAgICAgICAgICAgIENvbnRyb2xfciAgICAgICAgICAgICAgIENvbnRyb2xfciAgICAgICAgICAgICAgIE1ldGFfciAgICAgICAgICAgICAgICAgIE1ldGFfciAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9yICAgICAgICAgIE1ldGFfQ29udHJvbF9yCitrZXljb2RlICAyMCA9ICAgdCAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAxOTcgICAgICAgICAgICAgMjI5ICAgICAgICAgICAgIENvbnRyb2xfdCAgICAgICAgICAgICAgIENvbnRyb2xfdCAgICAgICAgICAgICAgIE1ldGFfdCAgICAgICAgICAgICAgICAgIE1ldGFfdCAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF90ICAgICAgICAgIE1ldGFfQ29udHJvbF90CisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICAyMSA9ICAgeSAgICAgICAgICAgICAgIFkgICAgICAgICAgICAgICAyMDYgICAgICAgICAgICAgMjM4ICAgICAgICAgICAgIENvbnRyb2xfeSAgICAgICAgICAgICAgIENvbnRyb2xfeSAgICAgICAgICAgICAgIE1ldGFfeSAgICAgICAgICAgICAgICAgIE1ldGFfeSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF95ICAgICAgICAgIE1ldGFfQ29udHJvbF95CitrZXljb2RlICAyMiA9ICAgdSAgICAgICAgICAgICAgIFUgICAgICAgICAgICAgICAxOTkgICAgICAgICAgICAgMjMxICAgICAgICAgICAgIENvbnRyb2xfdSAgICAgICAgICAgICAgIENvbnRyb2xfdSAgICAgICAgICAgICAgIE1ldGFfdSAgICAgICAgICAgICAgICAgIE1ldGFfdSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF91ICAgICAgICAgIE1ldGFfQ29udHJvbF91CitrZXljb2RlICAyMyA9ICAgaSAgICAgICAgICAgICAgIEkgICAgICAgICAgICAgICAyMTkgICAgICAgICAgICAgMjUxICAgICAgICAgICAgIENvbnRyb2xfaSAgICAgICAgICAgICAgIENvbnRyb2xfaSAgICAgICAgICAgICAgIE1ldGFfaSAgICAgICAgICAgICAgICAgIE1ldGFfaSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9pICAgICAgICAgIE1ldGFfQ29udHJvbF9pCitrZXljb2RlICAyNCA9ICAgbyAgICAgICAgICAgICAgIE8gICAgICAgICAgICAgICAyMjEgICAgICAgICAgICAgMjUzICAgICAgICAgICAgIENvbnRyb2xfbyAgICAgICAgICAgICAgIENvbnRyb2xfbyAgICAgICAgICAgICAgIE1ldGFfbyAgICAgICAgICAgICAgICAgIE1ldGFfbyAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9vICAgICAgICAgIE1ldGFfQ29udHJvbF9vCitrZXljb2RlICAyNSA9ICAgcCAgICAgICAgICAgICAgIFAgICAgICAgICAgICAgICAyMTggICAgICAgICAgICAgMjUwICAgICAgICAgICAgIENvbnRyb2xfcCAgICAgICAgICAgICAgIENvbnRyb2xfcCAgICAgICAgICAgICAgIE1ldGFfcCAgICAgICAgICAgICAgICAgIE1ldGFfcCAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9wICAgICAgICAgIE1ldGFfQ29udHJvbF9wCitrZXljb2RlICAyNiA9ICAgYnJhY2tldGxlZnQgICAgIGJyYWNlbGVmdCAgICAgICAyMDAgICAgICAgICAgICAgMjMyICAgICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIE1ldGFfYnJhY2tldGxlZnQgICAgICAgIE1ldGFfYnJhY2tldGxlZnQKK2tleWNvZGUgIDI3ID0gICBicmFja2V0cmlnaHQgICAgYnJhY2VyaWdodCAgICAgIDIyMyAgICAgICAgICAgICAyNTUgICAgICAgICAgICAgQ29udHJvbF9icmFja2V0cmlnaHQgICAgQ29udHJvbF9icmFja2V0cmlnaHQKK2tleWNvZGUgIDI4ID0gICBSZXR1cm4KKyMgU2hpZnQrQ3RybCAtIEN5cmlsbGljCitrZXljb2RlICAyOSA9ICAgQ29udHJvbAkJQWx0R3JfTG9jayAgICAgIENvbnRyb2wgICAgICAgICBBbHRHcl9Mb2NrICAgICAgQ29udHJvbAkJICAgICAgICBDb250cm9sCQkgICAgICAgIENvbnRyb2wJCSAgICAgICAgQ29udHJvbAkJICAgICAgICBDb250cm9sCQkgICAgICAgIENvbnRyb2wKK2tleWNvZGUgIDMwID0gICBhICAgICAgICAgICAgICAgQSAgICAgICAgICAgICAgIDE5OCAgICAgICAgICAgICAyMzAgICAgICAgICAgICAgQ29udHJvbF9hICAgICAgICAgICAgICAgQ29udHJvbF9hICAgICAgICAgICAgICAgTWV0YV9hICAgICAgICAgICAgICAgICAgTWV0YV9hICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2EgICAgICAgICAgTWV0YV9Db250cm9sX2EKK2tleWNvZGUgIDMxID0gICBzICAgICAgICAgICAgICAgUyAgICAgICAgICAgICAgIDIxNyAgICAgICAgICAgICAyNDkgICAgICAgICAgICAgQ29udHJvbF9zICAgICAgICAgICAgICAgQ29udHJvbF9zICAgICAgICAgICAgICAgTWV0YV9zICAgICAgICAgICAgICAgICAgTWV0YV9zICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3MgICAgICAgICAgTWV0YV9Db250cm9sX3MKK2tleWNvZGUgIDMyID0gICBkICAgICAgICAgICAgICAgRCAgICAgICAgICAgICAgIDIxNSAgICAgICAgICAgICAyNDcgICAgICAgICAgICAgQ29udHJvbF9kICAgICAgICAgICAgICAgQ29udHJvbF9kICAgICAgICAgICAgICAgTWV0YV9kICAgICAgICAgICAgICAgICAgTWV0YV9kICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2QgICAgICAgICAgTWV0YV9Db250cm9sX2QKK2tleWNvZGUgIDMzID0gICBmICAgICAgICAgICAgICAgRiAgICAgICAgICAgICAgIDE5MyAgICAgICAgICAgICAyMjUgICAgICAgICAgICAgQ29udHJvbF9mICAgICAgICAgICAgICAgQ29udHJvbF9mICAgICAgICAgICAgICAgTWV0YV9mICAgICAgICAgICAgICAgICAgTWV0YV9mICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2YgICAgICAgICAgTWV0YV9Db250cm9sX2YKK2tleWNvZGUgIDM0ID0gICBnICAgICAgICAgICAgICAgRyAgICAgICAgICAgICAgIDIwOCAgICAgICAgICAgICAyNDAgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgTWV0YV9nICAgICAgICAgICAgICAgICAgTWV0YV9nICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2cgICAgICAgICAgTWV0YV9Db250cm9sX2cKK2tleWNvZGUgIDM1ID0gICBoICAgICAgICAgICAgICAgSCAgICAgICAgICAgICAgIDIxMCAgICAgICAgICAgICAyNDIgICAgICAgICAgICAgQ29udHJvbF9oICAgICAgICAgICAgICAgQ29udHJvbF9oICAgICAgICAgICAgICAgTWV0YV9oICAgICAgICAgICAgICAgICAgTWV0YV9oICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2ggICAgICAgICAgTWV0YV9Db250cm9sX2gKK2tleWNvZGUgIDM2ID0gICBqICAgICAgICAgICAgICAgSiAgICAgICAgICAgICAgIDIwNyAgICAgICAgICAgICAyMzkgICAgICAgICAgICAgQ29udHJvbF9qICAgICAgICAgICAgICAgQ29udHJvbF9qICAgICAgICAgICAgICAgTWV0YV9qICAgICAgICAgICAgICAgICAgTWV0YV9qICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2ogICAgICAgICAgTWV0YV9Db250cm9sX2oKK2tleWNvZGUgIDM3ID0gICBrICAgICAgICAgICAgICAgSyAgICAgICAgICAgICAgIDIwNCAgICAgICAgICAgICAyMzYgICAgICAgICAgICAgQ29udHJvbF9rICAgICAgICAgICAgICAgQ29udHJvbF9rICAgICAgICAgICAgICAgTWV0YV9rICAgICAgICAgICAgICAgICAgTWV0YV9rICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2sgICAgICAgICAgTWV0YV9Db250cm9sX2sKK2tleWNvZGUgIDM4ID0gICBsICAgICAgICAgICAgICAgTCAgICAgICAgICAgICAgIDE5NiAgICAgICAgICAgICAyMjggICAgICAgICAgICAgQ29udHJvbF9sICAgICAgICAgICAgICAgQ29udHJvbF9sICAgICAgICAgICAgICAgTWV0YV9sICAgICAgICAgICAgICAgICAgTWV0YV9sICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2wgICAgICAgICAgTWV0YV9Db250cm9sX2wKK2tleWNvZGUgIDM5ID0gICBzZW1pY29sb24gICAgICAgY29sb24gICAgICAgICAgIDIxNCAgICAgICAgICAgICAyNDYgICAgICAgICAgICAgc2VtaWNvbG9uICAgICAgICAgICAgICAgc2VtaWNvbG9uICAgICAgICAgICAgICAgTWV0YV9zZW1pY29sb24gICAgICAgICAgTWV0YV9zZW1pY29sb24KK2tleWNvZGUgIDQwID0gICBhcG9zdHJvcGhlICAgICAgcXVvdGVkYmwgICAgICAgIDIyMCAgICAgICAgICAgICAyNTIgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgTWV0YV9hcG9zdHJvcGhlICAgICAgICAgTWV0YV9hcG9zdHJvcGhlCisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICA0MSA9ICAgZ3JhdmUgICAgICAgICAgIGFzY2lpdGlsZGUgICAgICBncmF2ZSAgICAgICAgICAgYXNjaWl0aWxkZSAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIE1ldGFfZ3JhdmUgICAgICAgICAgICAgIE1ldGFfZ3JhdmUKK2tleWNvZGUgIDQyID0gICBTaGlmdAora2V5Y29kZSAgNDMgPSAgIGJhY2tzbGFzaCAgICAgICBiYXIgICAgICAgICAgICAgYmFja3NsYXNoICAgICAgIGJhciAgICAgICAgICAgICBDb250cm9sX2JhY2tzbGFzaCAgICAgICBDb250cm9sX2JhY2tzbGFzaCAgICAgICBNZXRhX2JhY2tzbGFzaCAgICAgICAgICBNZXRhX2JhY2tzbGFzaAora2V5Y29kZSAgNDQgPSAgIHogICAgICAgICAgICAgICBaICAgICAgICAgICAgICAgMjA5ICAgICAgICAgICAgIDI0MSAgICAgICAgICAgICBDb250cm9sX3ogICAgICAgICAgICAgICBDb250cm9sX3ogICAgICAgICAgICAgICBNZXRhX3ogICAgICAgICAgICAgICAgICBNZXRhX3ogICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfeiAgICAgICAgICBNZXRhX0NvbnRyb2xfegora2V5Y29kZSAgNDUgPSAgIHggICAgICAgICAgICAgICBYICAgICAgICAgICAgICAgMjIyICAgICAgICAgICAgIDI1NCAgICAgICAgICAgICBDb250cm9sX3ggICAgICAgICAgICAgICBDb250cm9sX3ggICAgICAgICAgICAgICBNZXRhX3ggICAgICAgICAgICAgICAgICBNZXRhX3ggICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfeCAgICAgICAgICBNZXRhX0NvbnRyb2xfeAora2V5Y29kZSAgNDYgPSAgIGMgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgMjExICAgICAgICAgICAgIDI0MyAgICAgICAgICAgICBDb250cm9sX2MgICAgICAgICAgICAgICBDb250cm9sX2MgICAgICAgICAgICAgICBNZXRhX2MgICAgICAgICAgICAgICAgICBNZXRhX2MgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfYyAgICAgICAgICBNZXRhX0NvbnRyb2xfYwora2V5Y29kZSAgNDcgPSAgIHYgICAgICAgICAgICAgICBWICAgICAgICAgICAgICAgMjA1ICAgICAgICAgICAgIDIzNyAgICAgICAgICAgICBDb250cm9sX3YgICAgICAgICAgICAgICBDb250cm9sX3YgICAgICAgICAgICAgICBNZXRhX3YgICAgICAgICAgICAgICAgICBNZXRhX3YgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfdiAgICAgICAgICBNZXRhX0NvbnRyb2xfdgora2V5Y29kZSAgNDggPSAgIGIgICAgICAgICAgICAgICBCICAgICAgICAgICAgICAgMjAxICAgICAgICAgICAgIDIzMyAgICAgICAgICAgICBDb250cm9sX2IgICAgICAgICAgICAgICBDb250cm9sX2IgICAgICAgICAgICAgICBNZXRhX2IgICAgICAgICAgICAgICAgICBNZXRhX2IgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfYiAgICAgICAgICBNZXRhX0NvbnRyb2xfYgora2V5Y29kZSAgNDkgPSAgIG4gICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgMjEyICAgICAgICAgICAgIDI0NCAgICAgICAgICAgICBDb250cm9sX24gICAgICAgICAgICAgICBDb250cm9sX24gICAgICAgICAgICAgICBNZXRhX24gICAgICAgICAgICAgICAgICBNZXRhX24gICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfbiAgICAgICAgICBNZXRhX0NvbnRyb2xfbgora2V5Y29kZSAgNTAgPSAgIG0gICAgICAgICAgICAgICBNICAgICAgICAgICAgICAgMjE2ICAgICAgICAgICAgIDI0OCAgICAgICAgICAgICBDb250cm9sX20gICAgICAgICAgICAgICBDb250cm9sX20gICAgICAgICAgICAgICBNZXRhX20gICAgICAgICAgICAgICAgICBNZXRhX20gICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfbSAgICAgICAgICBNZXRhX0NvbnRyb2xfbQora2V5Y29kZSAgNTEgPSAgIGNvbW1hICAgICAgICAgICBsZXNzICAgICAgICAgICAgMTk0ICAgICAgICAgICAgIDIyNiAgICAgICAgICAgICBjb21tYSAgICAgICAgICAgICAgICAgICBjb21tYSAgICAgICAgICAgICAgICAgICBNZXRhX2NvbW1hICAgICAgICAgICAgICBNZXRhX2NvbW1hCitrZXljb2RlICA1MiA9ICAgcGVyaW9kICAgICAgICAgIGdyZWF0ZXIgICAgICAgICAxOTIgICAgICAgICAgICAgMjI0ICAgICAgICAgICAgIENvbXBvc2UgICAgICAgICAgICAgICAgIENvbXBvc2UgICAgICAgICAgICAgICAgIE1ldGFfcGVyaW9kICAgICAgICAgICAgIE1ldGFfcGVyaW9kCitrZXljb2RlICA1MyA9ICAgc2xhc2ggICAgICAgICAgIHF1ZXN0aW9uICAgICAgICBzbGFzaCAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIERlbGV0ZSAgICAgICAgICAgICAgICAgIERlbGV0ZSAgICAgICAgICAgICAgICAgIE1ldGFfc2xhc2ggICAgICAgICAgICAgIE1ldGFfc2xhc2ggICAgICAgICAgICAgIE1ldGFfcXVlc3Rpb24gICAgICAgICAgIE1ldGFfcXVlc3Rpb24KKyMgQ3RybCtTaGlmdCAtIEN5cmlsbGljIChub3Qgd29ya2luZz8/PykKK2tleWNvZGUgIDU0ID0gICBTaGlmdCAgICAgICAgICAgU2hpZnQgICAgICAgICAgIFNoaWZ0ICAgICAgICAgICBTaGlmdCAgICAgICAgICAgQWx0R3JfTG9jayAgICAgICAgICAgICAgQWx0R3JfTG9jayAgICAgICAgICAgICAgU2hpZnQgICAgICAgICAgICAgICAgICAgU2hpZnQgICAgICAgICAgICAgICAgICAgU2hpZnQgICAgICAgICAgICAgICAgICAgU2hpZnQKK2tleWNvZGUgIDU1ID0gICBLUF9NdWx0aXBseQora2V5Y29kZSAgNTYgPSAgIEFsdAora2V5Y29kZSAgNTcgPSAgIHNwYWNlICAgICAgICAgICBzcGFjZSAgICAgICAgICAgc3BhY2UgICAgICAgICAgIHNwYWNlICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBNZXRhX3NwYWNlICAgICAgICAgICAgICBNZXRhX3NwYWNlCitrZXljb2RlICA1OCA9ICAgQ2Fwc19Mb2NrCitrZXljb2RlICA1OSA9ICAgRjEgICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICBGMSAgICAgICAgICAgICAgRjExICAgICAgICAgICAgIEYxICAgICAgICAgICAgICAgICAgICAgIEYxICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfMSAgICAgICAgICAgICAgIENvbnNvbGVfMSAgICAgICAgICAgICAgIENvbnNvbGVfMSAgICAgICAgICAgICAgIENvbnNvbGVfMQora2V5Y29kZSAgNjAgPSAgIEYyICAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgRjIgICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICBGMiAgICAgICAgICAgICAgICAgICAgICBGMiAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzIgICAgICAgICAgICAgICBDb25zb2xlXzIgICAgICAgICAgICAgICBDb25zb2xlXzIgICAgICAgICAgICAgICBDb25zb2xlXzIKKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgIDYxID0gICBGMyAgICAgICAgICAgICAgRjEzICAgICAgICAgICAgIEYzICAgICAgICAgICAgICBGMTMgICAgICAgICAgICAgRjMgICAgICAgICAgICAgICAgICAgICAgRjMgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV8zICAgICAgICAgICAgICAgQ29uc29sZV8zICAgICAgICAgICAgICAgQ29uc29sZV8zICAgICAgICAgICAgICAgQ29uc29sZV8zCitrZXljb2RlICA2MiA9ICAgRjQgICAgICAgICAgICAgIEYxNCAgICAgICAgICAgICBGNCAgICAgICAgICAgICAgRjE0ICAgICAgICAgICAgIEY0ICAgICAgICAgICAgICAgICAgICAgIEY0ICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfNCAgICAgICAgICAgICAgIENvbnNvbGVfNCAgICAgICAgICAgICAgIENvbnNvbGVfNCAgICAgICAgICAgICAgIENvbnNvbGVfNAora2V5Y29kZSAgNjMgPSAgIEY1ICAgICAgICAgICAgICBGMTUgICAgICAgICAgICAgRjUgICAgICAgICAgICAgIEYxNSAgICAgICAgICAgICBGNSAgICAgICAgICAgICAgICAgICAgICBGNSAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzUgICAgICAgICAgICAgICBDb25zb2xlXzUgICAgICAgICAgICAgICBDb25zb2xlXzUgICAgICAgICAgICAgICBDb25zb2xlXzUKK2tleWNvZGUgIDY0ID0gICBGNiAgICAgICAgICAgICAgRjE2ICAgICAgICAgICAgIEY2ICAgICAgICAgICAgICBGMTYgICAgICAgICAgICAgRjYgICAgICAgICAgICAgICAgICAgICAgRjYgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV82ICAgICAgICAgICAgICAgQ29uc29sZV82ICAgICAgICAgICAgICAgQ29uc29sZV82ICAgICAgICAgICAgICAgQ29uc29sZV82CitrZXljb2RlICA2NSA9ICAgRjcgICAgICAgICAgICAgIEYxNyAgICAgICAgICAgICBGNyAgICAgICAgICAgICAgRjE3ICAgICAgICAgICAgIEY3ICAgICAgICAgICAgICAgICAgICAgIEY3ICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfNyAgICAgICAgICAgICAgIENvbnNvbGVfNyAgICAgICAgICAgICAgIENvbnNvbGVfNyAgICAgICAgICAgICAgIENvbnNvbGVfNwora2V5Y29kZSAgNjYgPSAgIEY4ICAgICAgICAgICAgICBGMTggICAgICAgICAgICAgRjggICAgICAgICAgICAgIEYxOCAgICAgICAgICAgICBGOCAgICAgICAgICAgICAgICAgICAgICBGOCAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzggICAgICAgICAgICAgICBDb25zb2xlXzggICAgICAgICAgICAgICBDb25zb2xlXzggICAgICAgICAgICAgICBDb25zb2xlXzgKK2tleWNvZGUgIDY3ID0gICBGOSAgICAgICAgICAgICAgRjE5ICAgICAgICAgICAgIEY5ICAgICAgICAgICAgICBGMTkgICAgICAgICAgICAgRjkgICAgICAgICAgICAgICAgICAgICAgRjkgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV85ICAgICAgICAgICAgICAgQ29uc29sZV85ICAgICAgICAgICAgICAgQ29uc29sZV85ICAgICAgICAgICAgICAgQ29uc29sZV85CitrZXljb2RlICA2OCA9ICAgRjEwICAgICAgICAgICAgIEYyMCAgICAgICAgICAgICBGMTAgICAgICAgICAgICAgRjIwICAgICAgICAgICAgIEYxMCAgICAgICAgICAgICAgICAgICAgIEYxMCAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfMTAgICAgICAgICAgICAgIENvbnNvbGVfMTAgICAgICAgICAgICAgIENvbnNvbGVfMTAgICAgICAgICAgICAgIENvbnNvbGVfMTAKK2tleWNvZGUgIDY5ID0gICBOdW1fTG9jayAgICAgICAgQmFyZV9OdW1fTG9jayAgIE51bV9Mb2NrICAgICAgICBCYXJlX051bV9Mb2NrCitrZXljb2RlICA3MCA9ICAgU2Nyb2xsX0xvY2sgICAgIFNob3dfTWVtb3J5ICAgICBTY3JvbGxfTG9jayAgICAgU2hvd19NZW1vcnkgICAgIFNob3dfU3RhdGUgICAgICAgICAgICAgIFNob3dfU3RhdGUKK2tleWNvZGUgIDcxID0gICBLUF83ICAgICAgICAgICAgS1BfNyAgICAgICAgICAgIEtQXzcgICAgICAgICAgICBLUF83ICAgICAgICAgICAgS1BfNyAgICAgICAgICAgICAgICAgICAgS1BfNyAgICAgICAgICAgICAgICAgICAgQXNjaWlfNyAgICAgICAgICAgICAgICAgQXNjaWlfNwora2V5Y29kZSAgNzIgPSAgIEtQXzggICAgICAgICAgICBLUF84ICAgICAgICAgICAgS1BfOCAgICAgICAgICAgIEtQXzggICAgICAgICAgICBLUF84ICAgICAgICAgICAgICAgICAgICBLUF84ICAgICAgICAgICAgICAgICAgICBBc2NpaV84ICAgICAgICAgICAgICAgICBBc2NpaV84CitrZXljb2RlICA3MyA9ICAgS1BfOSAgICAgICAgICAgIEtQXzkgICAgICAgICAgICBLUF85ICAgICAgICAgICAgS1BfOSAgICAgICAgICAgIEtQXzkgICAgICAgICAgICAgICAgICAgIEtQXzkgICAgICAgICAgICAgICAgICAgIEFzY2lpXzkgICAgICAgICAgICAgICAgIEFzY2lpXzkKK2tleWNvZGUgIDc0ID0gICBLUF9TdWJ0cmFjdCAgICAgS1BfU3VidHJhY3QgICAgIEtQX1N1YnRyYWN0ICAgICBLUF9TdWJ0cmFjdCAgICAgS1BfU3VidHJhY3QgICAgICAgICAgICAgS1BfU3VidHJhY3QgICAgICAgICAgICAgS1BfU3VidHJhY3QgICAgICAgICAgICAgS1BfU3VidHJhY3QKK2tleWNvZGUgIDc1ID0gICBLUF80ICAgICAgICAgICAgS1BfNCAgICAgICAgICAgIEtQXzQgICAgICAgICAgICBLUF80ICAgICAgICAgICAgS1BfNCAgICAgICAgICAgICAgICAgICAgS1BfNCAgICAgICAgICAgICAgICAgICAgQXNjaWlfNCAgICAgICAgICAgICAgICAgQXNjaWlfNAora2V5Y29kZSAgNzYgPSAgIEtQXzUgICAgICAgICAgICBLUF81ICAgICAgICAgICAgS1BfNSAgICAgICAgICAgIEtQXzUgICAgICAgICAgICBLUF81ICAgICAgICAgICAgICAgICAgICBLUF81ICAgICAgICAgICAgICAgICAgICBBc2NpaV81ICAgICAgICAgICAgICAgICBBc2NpaV81CitrZXljb2RlICA3NyA9ICAgS1BfNiAgICAgICAgICAgIEtQXzYgICAgICAgICAgICBLUF82ICAgICAgICAgICAgS1BfNiAgICAgICAgICAgIEtQXzYgICAgICAgICAgICAgICAgICAgIEtQXzYgICAgICAgICAgICAgICAgICAgIEFzY2lpXzYgICAgICAgICAgICAgICAgIEFzY2lpXzYKK2tleWNvZGUgIDc4ID0gICBLUF9BZGQgICAgICAgICAgS1BfQWRkICAgICAgICAgIEtQX0FkZCAgICAgICAgICBLUF9BZGQgICAgICAgICAgS1BfQWRkICAgICAgICAgICAgICAgICAgS1BfQWRkICAgICAgICAgICAgICAgICAgS1BfQWRkICAgICAgICAgICAgICAgICAgS1BfQWRkCitrZXljb2RlICA3OSA9ICAgS1BfMSAgICAgICAgICAgIEtQXzEgICAgICAgICAgICBLUF8xICAgICAgICAgICAgS1BfMSAgICAgICAgICAgIEtQXzEgICAgICAgICAgICAgICAgICAgIEtQXzEgICAgICAgICAgICAgICAgICAgIEFzY2lpXzEgICAgICAgICAgICAgICAgIEFzY2lpXzEKK2tleWNvZGUgIDgwID0gICBLUF8yICAgICAgICAgICAgS1BfMiAgICAgICAgICAgIEtQXzIgICAgICAgICAgICBLUF8yICAgICAgICAgICAgS1BfMiAgICAgICAgICAgICAgICAgICAgS1BfMiAgICAgICAgICAgICAgICAgICAgQXNjaWlfMiAgICAgICAgICAgICAgICAgQXNjaWlfMgorIz09PT09PT09PT09PT09IHBsYWluID09PT09PT09PSBzaGlmdD09PT09PT09PT0gcGxhaW4gY3lyID09PT09IHNoaWZ0IGN5ciA9PT09PSBjdHJsID09PT09PT09PT09PT09PT09PSBjdHJsIGN5ciA9PT09PT09PT09PT09PSBhbHQgPT09PT09PT09PT09PT09PT09PSBhbHQgY3lyID09PT09PT09PT09PT09PSBjdHJsYWx0ID09PT09PT09PT09PT09PSBjdHJsYWx0IGN5ciA9PT09PT09PT09PQora2V5Y29kZSAgODEgPSAgIEtQXzMgICAgICAgICAgICBLUF8zICAgICAgICAgICAgS1BfMyAgICAgICAgICAgIEtQXzMgICAgICAgICAgICBLUF8zICAgICAgICAgICAgICAgICAgICBLUF8zICAgICAgICAgICAgICAgICAgICBBc2NpaV8zICAgICAgICAgICAgICAgICBBc2NpaV8zCitrZXljb2RlICA4MiA9ICAgS1BfMCAgICAgICAgICAgIEtQXzAgICAgICAgICAgICBLUF8wICAgICAgICAgICAgS1BfMCAgICAgICAgICAgIEtQXzAgICAgICAgICAgICAgICAgICAgIEtQXzAgICAgICAgICAgICAgICAgICAgIEFzY2lpXzAgICAgICAgICAgICAgICAgIEFzY2lpXzAKK2tleWNvZGUgIDgzID0gICBLUF9QZXJpb2QgICAgICAgS1BfUGVyaW9kICAgICAgIEtQX1BlcmlvZCAgICAgICBLUF9QZXJpb2QgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgQm9vdCAgICAgICAgICAgICAgICAgICAgQm9vdAora2V5Y29kZSAgODQgPSAgIExhc3RfQ29uc29sZQora2V5Y29kZSAgODUgPQora2V5Y29kZSAgODYgPSAgIGxlc3MgICAgICAgICAgICBncmVhdGVyICAgICAgICAgbGVzcyAgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICBNZXRhX2xlc3MgICAgICAgICAgICAgICBNZXRhX2xlc3MKK2tleWNvZGUgIDg3ID0gICBGMTEgICAgICAgICAgICAgRjExICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgRjExICAgICAgICAgICAgICAgICAgICAgRjExICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV8xMSAgICAgICAgICAgICAgQ29uc29sZV8xMSAgICAgICAgICAgICAgQ29uc29sZV8xMSAgICAgICAgICAgICAgQ29uc29sZV8xMQora2V5Y29kZSAgODggPSAgIEYxMiAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgRjEyICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzEyICAgICAgICAgICAgICBDb25zb2xlXzEyICAgICAgICAgICAgICBDb25zb2xlXzEyICAgICAgICAgICAgICBDb25zb2xlXzEyCitrZXljb2RlICA4OSA9CitrZXljb2RlICA5MCA9CitrZXljb2RlICA5MSA9CitrZXljb2RlICA5MiA9CitrZXljb2RlICA5MyA9CitrZXljb2RlICA5NCA9CitrZXljb2RlICA5NSA9CitrZXljb2RlICA5NiA9ICAgS1BfRW50ZXIKK2tleWNvZGUgIDk3ID0gICBDb250cm9sCitrZXljb2RlICA5OCA9ICAgS1BfRGl2aWRlCitrZXljb2RlICA5OSA9ICAgQ29udHJvbF9iYWNrc2xhc2gKKyMgUmlnaHQgQWx0IC0gQ3lyaWxsaWMKK2tleWNvZGUgMTAwID0gICBBbHRHcl9Mb2NrCisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlIDEwMSA9ICAgQnJlYWsKK2tleWNvZGUgMTAyID0gICBGaW5kCitrZXljb2RlIDEwMyA9ICAgVXAKK2tleWNvZGUgMTA0ID0gICBQcmlvciAgICAgICAgICAgU2Nyb2xsX0JhY2t3YXJkIFByaW9yICAgICAgICAgICBTY3JvbGxfQmFja3dhcmQgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IKK2tleWNvZGUgMTA1ID0gICBMZWZ0ICAgICAgICAgICAgTGVmdCAgICAgICAgICAgIExlZnQgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgRGVjcl9Db25zb2xlICAgICAgICAgICAgRGVjcl9Db25zb2xlCitrZXljb2RlIDEwNiA9ICAgUmlnaHQgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICBSaWdodCAgICAgICAgICAgUmlnaHQgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIEluY3JfQ29uc29sZSAgICAgICAgICAgIEluY3JfQ29uc29sZQora2V5Y29kZSAxMDcgPSAgIFNlbGVjdAora2V5Y29kZSAxMDggPSAgIERvd24KK2tleWNvZGUgMTA5ID0gICBOZXh0ICAgICAgICAgICAgU2Nyb2xsX0ZvcndhcmQgIE5leHQgICAgICAgICAgICBTY3JvbGxfRm9yd2FyZCAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dAora2V5Y29kZSAxMTAgPSAgIEluc2VydAora2V5Y29kZSAxMTEgPSAgIFJlbW92ZSAgICAgICAgICBSZW1vdmUgICAgICAgICAgUmVtb3ZlICAgICAgICAgIFJlbW92ZSAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBCb290ICAgICAgICAgICAgICAgICAgICBCb290CitrZXljb2RlIDExMiA9ICAgTWFjcm8KK2tleWNvZGUgMTEzID0gICBGMTMKK2tleWNvZGUgMTE0ID0gICBGMTQKK2tleWNvZGUgMTE1ID0gICBIZWxwCitrZXljb2RlIDExNiA9ICAgRG8KK2tleWNvZGUgMTE3ID0gICBGMTcKK2tleWNvZGUgMTE4ID0gICBLUF9NaW5QbHVzCitrZXljb2RlIDExOSA9ICAgUGF1c2UKK2tleWNvZGUgMTIwID0KKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgMTIxID0KK2tleWNvZGUgMTIyID0KK2tleWNvZGUgMTIzID0KK2tleWNvZGUgMTI0ID0KK2tleWNvZGUgMTI1ID0KK2tleWNvZGUgMTI2ID0KK2tleWNvZGUgMTI3ID0KKworc3RyaW5nIEYxID0gIlwwMzNbW0EiCitzdHJpbmcgRjIgPSAiXDAzM1tbQiIKK3N0cmluZyBGMyA9ICJcMDMzW1tDIgorc3RyaW5nIEY0ID0gIlwwMzNbW0QiCitzdHJpbmcgRjUgPSAiXDAzM1tbRSIKK3N0cmluZyBGNiA9ICJcMDMzWzE3fiIKK3N0cmluZyBGNyA9ICJcMDMzWzE4fiIKK3N0cmluZyBGOCA9ICJcMDMzWzE5fiIKK3N0cmluZyBGOSA9ICJcMDMzWzIwfiIKK3N0cmluZyBGMTAgPSAiXDAzM1syMX4iCitzdHJpbmcgRjExID0gIlwwMzNbMjN+Igorc3RyaW5nIEYxMiA9ICJcMDMzWzI0fiIKK3N0cmluZyBGMTMgPSAiXDAzM1syNX4iCitzdHJpbmcgRjE0ID0gIlwwMzNbMjZ+Igorc3RyaW5nIEYxNSA9ICJcMDMzWzI4fiIKK3N0cmluZyBGMTYgPSAiXDAzM1syOX4iCitzdHJpbmcgRjE3ID0gIlwwMzNbMzF+Igorc3RyaW5nIEYxOCA9ICJcMDMzWzMyfiIKK3N0cmluZyBGMTkgPSAiXDAzM1szM34iCitzdHJpbmcgRjIwID0gIlwwMzNbMzR+Igorc3RyaW5nIEZpbmQgPSAiXDAzM1sxfiIKK3N0cmluZyBJbnNlcnQgPSAiXDAzM1syfiIKK3N0cmluZyBSZW1vdmUgPSAiXDAzM1szfiIKK3N0cmluZyBTZWxlY3QgPSAiXDAzM1s0fiIKK3N0cmluZyBQcmlvciA9ICJcMDMzWzV+Igorc3RyaW5nIE5leHQgPSAiXDAzM1s2fiIKK3N0cmluZyBNYWNybyA9ICJcMDMzW00iCitzdHJpbmcgUGF1c2UgPSAiXDAzM1tQIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2M0MTNiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydW4KQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL3NoCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj1yb290CitiYXVkPTM4NDAwCitkZWxheT0zCitleHBvcnQgVEVSTT1saW51eAorCit0dHk9Ii9kZXYvJHtQV0QjIyovZ2V0dHlffSIKKworaWYgISB0ZXN0IC1lICIkdHR5IjsgdGhlbgorCWV4ZWMgZW52IC0gc2xlZXAgMzIwMDAKK2ZpCisKK3NsZWVwICIkZGVsYXkiCisKK2Nob3duICIkdXNlciIgIiR0dHkiICMgLSBkZXZmcyBtYWRlIGhhcHB5CisKK2V4ZWMgPCIkdHR5IiA+IiR0dHkiIDI+JjEKKyMgdXNpbmcgLiBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNldCBlbnYgKFRFUk0gZXRjKSBpbiBjZmcKK3Rlc3QgLXggLi9jZmcgJiYgLiAuL2NmZworCitleGVjIFwKK2VudiAtICJURVJNPSRURVJNIiBQQVRIPSIkUEFUSCIgTE9HSU5fUFJFX1NVSURfU0NSSVBUPSIkUFdEL2xvZ2luLnNoIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorZ2V0dHkgIiRiYXVkIiAiJHR0eSIgIiRURVJNIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ3BtL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dwbS9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTEzZmRjZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dwbS9ydW4KQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL3NoCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj1yb290CitvcHRpb25zPSItRCAtMiAtbSAvZGV2L3BzYXV4IC10IHBzMiIKKyNvcHRpb25zPSItRCAtMiAtbSAvZGV2L3R0eVMwIC10IGJhcmUiCisKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitncG0gJG9wdGlvbnMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL2xvZy9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvcF9sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9wX2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjUyMWJlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmY4ODY5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3J1bgpAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj13d3cKK3VzZXI9cm9vdAorCitlY2hvICIqIFN0YXJ0aW5nIHRjcHN2ZCBmb3IgaHR0cGQgWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCit0Y3BzdmQgXAorICAtdiAtRSAtbCBsb2NhbGhvc3QgLWMgNSBcCisgIDAgODggXAorc2V0dWlkZ2lkICIkdXNlciIgXAoraHR0cGQgLXZ2diAtaSAtaCAvcHViL2h0dHBkX3Jvb3QKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3dfbG9nIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3dfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCit3YXRjaCAtbjIgJ3c9YHR0eXNpemUgd2A7IGg9YHR0eXNpemUgaGA7IHRhaWwgLSQoKGgtMykpIGN1cnJlbnQgMj4mMSB8IGN1dCAtYjEtJCgody0yKSknCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL2lmcGx1Z2RfaGFuZGxlciBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvaWZwbHVnZF9oYW5kbGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5NjJmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL2lmcGx1Z2RfaGFuZGxlcgpAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMgcGFyYW1ldGVyczoKKyMgJDE6IGludGVyZmFjZQorIyAkMjogc3RhdGUKKworaWYgdGVzdCAtZCAiL3Zhci9zZXJ2aWNlL2RoY3BfJDEiOyB0aGVuCisJaWYgdGVzdCB4IiQyIiA9IHgiZG93biI7IHRoZW4KKwkJZWNobyAiRG93bmluZyAvdmFyL3NlcnZpY2UvZGhjcF8kMSIKKwkJc3YgZCAiL3Zhci9zZXJ2aWNlL2RoY3BfJDEiCisJZmkKKwlpZiB0ZXN0IHgiJDIiID0geCJ1cCI7IHRoZW4KKwkJZWNobyAiVXBwaW5nIC92YXIvc2VydmljZS9kaGNwXyQxIgorCQlzdiB1ICIvdmFyL3NlcnZpY2UvZGhjcF8kMSIKKwlmaQorZmkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvbG9nL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9wX2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3ODFjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL3J1bgpAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKworcHdkPSIkUFdEIgorCitpZj0iJHtQV0QjIyovaWZwbHVnZF99IgorCitlY2hvICIqIFN0YXJ0aW5nIGlmcGx1Z2Qgb24gJGlmIFskJF0iCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkIHJvb3QgXAoraWZwbHVnZCAtYXBxbnMgLXQzIC11OCAtZDggLWkgIiRpZiIgLXIgIiRwd2QvaWZwbHVnZF9oYW5kbGVyIgorCisjIFdlIHVzZSAtdDMgdG8gd2FrZSBpZnBsdWdkIHVwIGxlc3Mgb2Z0ZW4uCisjIElmIGFmdGVyIHRocmVlIHRlc3RzICgzKjM9OSA+IDgpIGxpbmsgc3RhdGUgc2VlbiB0byBiZSBkaWZmZXJlbnQsCisjIHRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkLgorIyBJT1c6IHNob3J0IGxpbmsgbG9zc2VzIHdpbGwgYmUgaWdub3JlZCwgbG9uZ2VyIG9uZXMKKyMgd2lsbCB0cmlnZ2VyIERIQ1AgcmVjb25maWd1cmF0aW9uIGFuZCBzdWNoIChzZWUgaGFuZGxlciBjb2RlKS4KKworIy1hICAgICAgIERvIG5vdCB1cCBpbnRlcmZhY2UgYXV0b21hdGljYWxseQorIy1wICAgICAgIERvbnQgcnVuIHNjcmlwdCBvbiBkYWVtb24gc3RhcnR1cAorIy1xICAgICAgIERvbnQgcnVuIHNjcmlwdCBvbiBkYWVtb24gcXVpdAorIy1uICAgICAgIERvIG5vdCBkYWVtb25pemUKKyMtcyAgICAgICBEbyBub3QgbG9nIHRvIHN5c2xvZworIy10IFNFQ1MgIFBvbGwgdGltZSBpbiBzZWNvbmRzCisjLXUgU0VDUyAgRGVsYXkgYmVmb3JlIHJ1bm5pbmcgc2NyaXB0IGFmdGVyIGxpbmsgdXAKKyMtZCBTRUNTICBEZWxheSBhZnRlciBsaW5rIGRvd24KKyMtaSBJRkFDRSBJbnRlcmZhY2UKKyMtciBQUk9HICBTY3JpcHQgdG8gcnVuCisjLWYvLUYgICAgVHJlYXQgbGluayBkZXRlY3Rpb24gZXJyb3IgYXMgbGluayBkb3duL2xpbmsgdXAgKG90aGVyd2lzZSBleGl0IG9uIGVycm9yKQorIy1NICAgICAgIE1vbml0b3IgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gb2YgaW50ZXJmYWNlIChvdGhlcndpc2UgaXQgbXVzdCBleGlzdCkKKyMteCBBUkcgICBFeHRyYSBhcmd1bWVudCBmb3Igc2NyaXB0CisjLUkgICAgICAgRG9udCBleGl0IG9uIG5vbnplcm8gZXhpdCBjb2RlIGZyb20gc2NyaXB0CisjLWwgICAgICAgUnVuIHNjcmlwdCBvbiBzdGFydHVwIGV2ZW4gaWYgbm8gY2FibGUgaXMgZGV0ZWN0ZWQKKyMtbSBNT0RFICBBUEkgbW9kZSAobWlpLCBwcml2LCBldGh0b29sLCB3bGFuLCBhdXRvKQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi93X2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL2luZXRkLmNvbmYgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9pbmV0ZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjE1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9pbmV0ZC5jb25mCkBAIC0wLDAgKzEsMTggQEAKKyMgW0FERFI6XXNlcnZpY2VfbmFtZSAgICAgICAgICAgbXVzdCBiZSBpbiAvZXRjL3NlcnZpY2VzLCBvciBwb3J0IG51bWJlcgorIyBzb2NrZXRfdHlwZSAgICAgICAgICAgICAgICAgICBzdHJlYW0vZGdyYW0vcmF3L3JkbS9zZXFwYWNrZXQKKyMgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgdGNwL3VkcAorIyB3YWl0L25vd2FpdFsubWF4XSAgICAgICAgICAgICB3YWl0IGlzIHVzdWFsbHkgZm9yIHVkcCwgbm93YWl0IGZvciB0Y3AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiBtYXggY29waWVzIHRvIHJ1bgorIyB1c2VyWy5ncm91cF0gb3IgdXNlcls6Z3JvdXBdICB1c2VyIGFuZCBncm91cCB0byBydW4gdW5kZXIKKyMgYmluYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSB0byBydW4KKyMgYXJnMCBhcmcxIGFyZzIuLi4gICAgICAgICAgICAgYXJndW1lbnRzLCBJTkNMVURJTkcgcHJvZ3JhbSBuYW1lIChhcmcwKQorCisjIHNlcnYJc29ja2V0IHBybyAgdy9udyAgIHVzZXIgYmluYXJ5IGFyZ3MKKworIyBJUHY2Cis1NTUJZGdyYW0gIHVkcDYgd2FpdCAgIHJvb3QgZWNobyBlY2hvIEhlbGxvIElQdjYgdWRwIHdvcmxkCisjIC4uLndpdGggQUREUiBwcmVmaXg6Cis6OjE6NDQ0CXN0cmVhbSB0Y3A2IG5vd2FpdCByb290IGVjaG8gZWNobyBIZWxsbyBJUHY2IGxvY2FsaG9zdAorCisjIFJhcmVseSBzZWVuIGNhc2U6IHRjcCAqd2FpdCogc2VydmljZQordGVsbmV0CXN0cmVhbSB0Y3AgIHdhaXQgICByb290IHRlbG5ldGQgdGVsbmV0ZCAtdzEwCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9sb2cvcnVuIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvbG9nL3J1bgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKwordXNlcj1sb2dnZXIKKworbG9nZGlyPSIvdmFyL2xvZy9zZXJ2aWNlL2AoY2QgLi47YmFzZW5hbWUgJFBXRClgIgorbWtkaXIgLXAgIiRsb2dkaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXIiOiAiJGxvZ2RpciIKK2NobW9kIC1SIGdvLXJ3eHN0LHUrcndYICIkbG9nZGlyIgorcm0gbG9nZGlyCitsbiAtcyAiJGxvZ2RpciIgbG9nZGlyCisKKyMgbWFrZSB0aGlzIGRpciBhY2Nlc3NpYmxlIHRvIGxvZ2dlcgorY2htb2QgYStyWCAuCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorc3Zsb2dkIC10dCAiJGxvZ2RpciIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3BfbG9nIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcnVuIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxMGMxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9ydW4KQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKKyNleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK2VjaG8gIiogU3RhcnRpbmcgaW5ldGQgWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitpbmV0ZCAtZiAtZSAiJFBXRC9pbmV0ZC5jb25mIgorCisjIGluZXRkIFstZl0gWy1xIGxlbl0gW2NvbmZdCisjIC1mICAgICAgUnVuIGluIGZvcmVncm91bmQKKyMgLWUgICAgICBMb2cgdG8gc3RkZXJyIChkZWZhdWx0IGlzIHN5c2xvZykKKyMgLXEgTiAgICBTZXQgdGhlIHNpemUgb2YgdGhlIHNvY2tldCBsaXN0ZW4gcXVldWUgdG8gTgorIyAgICAgICAgIChkZWZhdWx0OiAxMjgpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC93X2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3dfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2Uvbm1ldGVyL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL25tZXRlci9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2U1MTEyNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL25tZXRlci9ydW4KQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKworIyBTaW5jZSBwZXItcHJvY2VzcyAvcHJvYy9uZXQvICgtPiAvcHJvYy9zZWxmL25ldC8pIGFwcGVhcmVkLAorIyB3ZSBuZWVkIHRvIGJlIHJvb3QKK3VzZXI9InJvb3QiCit0dHk9Ii9kZXYvdHR5OSIKK2NtZD0ibm1ldGVyICcldCAlYyB4ICV4IHAlcCBmICVmIGIgJWIgbSAlbSBpZiVbbmlmXSciCisKK2NobW9kIC1SIGErWCAuICMgb3IgZWxzZSBlbnYgd2lsbCBtb2FuCitjaG93biAiJHVzZXIiOiAiJHR0eSIgIyBkZXZmcyBtYWRlIGhhcHB5CisKK2V2YWwgZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorPCIkdHR5IiA+IiR0dHkiIDI+JjEgXAorJGNtZApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9sb2cvcnVuIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL250cC5zY3JpcHQgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL250cC5zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzZjMzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvbnRwLnNjcmlwdApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKworIyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gcHJvdmlzaW9uIHRvIHByZXZlbnQgc2V2ZXJhbCBjb3BpZXMgb2YgdGhlIHNjcmlwdAorIyB0byBiZSBydW4gaW4gcXVpY2sgc3VjY2Vzc2lvbi4gSW4gZmFjdCwgaXQgaGFwcGVucyByYXRoZXIgb2Z0ZW4KKyMgaWYgaW5pdGlhbCBzeW5jcm9uaXphdGlvbiByZXN1bHRzIGluIGEgc3RlcC4KKyMgWW91IHdpbGwgc2VlICJzdGVwIiBhbmQgdGhlbiAic3RyYXR1bSIgc2NyaXB0IHJ1bnMsIHNvbWV0aW1lcworIyBhcyBjbG9zZSBhcyBvbmx5IDAuMDAyIHNlY29uZHMgYXBhcnQuCisjCisjIFNjcmlwdCBzaG91bGQgYmUgcmVhZHkgdG8gZGVhbCB3aXRoIHRoaXMuCisKK2R0PWBkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnYAorCitpZiB0ZXN0IHgiJHN0cmF0dW0iICE9IHgiIiBcCismJiB0ZXN0IHgiJHBvbGxfaW50ZXJ2YWwiICE9IHgiIiBcCismJiB0ZXN0IDQgLWdlICIkc3RyYXR1bSIgXAorJiYgdGVzdCAxMjggLWxlICIkcG9sbF9pbnRlcnZhbCIgXAorOyB0aGVuCisJZWNobyAiYHRhaWwgLW4gMTk5IC0tICIkMC5sb2ciIDI+L2Rldi9udWxsYCIgPiIkMC5sb2cuJCQiCisJZWNobyAiJGR0OiAkMSJcCisJCSJmcmVxX2RyaWZ0X3BwbT0kZnJlcV9kcmlmdF9wcG0iXAorCQkib2Zmc2V0PSRvZmZzZXQiXAorCQkic3RyYXR1bT0kc3RyYXR1bSJcCisJCSJwb2xsX2ludGVydmFsPSRwb2xsX2ludGVydmFsLCJcCisJCSJzZXR0aW5nIGhhcmR3YXJlIGNsb2NrIlwKKwkJPj4iJDAubG9nLiQkIgorCW12IC0tICIkMC5sb2cuJCQiICIkMC5sb2ciCisJZXhlYyBod2Nsb2NrIC0tc3lzdG9oYworZmkKKworZWNobyAiYHRhaWwgLW4gMTk5IC0tICIkMC5sb2ciIDI+L2Rldi9udWxsYCIgPiIkMC5sb2cuJCQiCitlY2hvICIkZHQ6ICQxIlwKKwkiZnJlcV9kcmlmdF9wcG09JGZyZXFfZHJpZnRfcHBtIlwKKwkib2Zmc2V0PSRvZmZzZXQiXAorCSJzdHJhdHVtPSRzdHJhdHVtIlwKKwkicG9sbF9pbnRlcnZhbD0kcG9sbF9pbnRlcnZhbCJcCisJPj4iJDAubG9nLiQkIgorbXYgLS0gIiQwLmxvZy4kJCIgIiQwLmxvZyIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvcF9sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODFkMjMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9ydW4KQEAgLTAsMCArMSw2MCBAQAorIyEvYmluL2Jhc2gKKyMgKHVzaW5nIGJhc2hpc20gKGFycmF5cykgaW4gZGhjcCBjb25maWcpCisKKyNleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3VzZXI9cm9vdAorcG9vbD0idXMucG9vbC5udHAub3JnIiAjIHJlcGxhY2UgInVzIiB3aXRoIHlvdXIgY291bnRyeSBjb2RlCisKK3NlcnZpY2U9IiR7UFdEIyMqL30iCitydW5kaXI9Ii92YXIvcnVuL3NlcnZpY2UvJHNlcnZpY2UiCitkZWZhdWx0X3Bfb3B0PSItcCAwLiRwb29sIC1wIDEuJHBvb2wgLXAgMi4kcG9vbCAtcCAzLiRwb29sIgorCisKKyMgTWFrZSBzdXJlIHJ1bmRpci8gZXhpc3RzCitta2RpciAtcCAiJHJ1bmRpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlcjoiICIkcnVuZGlyIgorY2htb2QgLVIgYT1yWCAiJHJ1bmRpciIKK3JtIC1yZiBydW5kaXIgMj4vZGV2L251bGwKK2xuIC1zICIkcnVuZGlyIiBydW5kaXIKKworCitlY2hvICIqIENoZWNraW5nIG5ldHdvcmsiCit0ZXN0IC1mIC92YXIvcnVuL3NlcnZpY2UvZncvdXAgfHwgZXhlYyBzbGVlcCA3CitzbGVlcCA1ICAjIHRvIGxldCBpdCBzZXR0bGUKKworIyBHcmFiIGNvbmZpZyBmcm9tIGRoY3AKK2NmZz0tMQorZm9yIGYgaW4gcnVuZGlyLyoubnRwY29uZjsgZG8KKyAgICAgICAgdGVzdCAtZiAiJGYiIHx8IGNvbnRpbnVlCisgICAgICAgIC4gIiRmIgorZG9uZQorCisjIFNlbGVjdCBwZWVycworcF9vcHQ9IiIKK2NmZz0wCit3aGlsZSB0ZXN0IHgiJHtudHBpcFskY2ZnXX0iICE9IHgiIjsgZG8KKyAgICAgICAgcF9vcHQ9IiRwX29wdCAtcCAke250cGlwWyRjZmddfSIKKyAgICAgICAgbGV0IGNmZz1jZmcrMQorZG9uZQordGVzdCB4IiRwX29wdCIgPT0geCIiICYmIHBfb3B0PSIkZGVmYXVsdF9wX29wdCIKKworaWYgdGVzdCB4IiRwX29wdCIgPT0geCIiOyB0aGVuCisJZWNobyAiKiBObyBOVFAgcGVlcnMgY29uZmlndXJlZCwgc3RvcHBpbmciCisJc3YgbyAuCisJZXhlYyBzbGVlcCAxCitmaQorCisKKyMgTGV0IG90aGVycyBrbm93IHRoYXQgd2UgYXJlIHVwCitkYXRlICcrJVktJW0tJWQgJUg6JU06JVMgJVonID5ydW5kaXIvdXAKKworIyBHbyBnbyBnbworZWNobyAiKiBTdGFydGluZyBudHBkWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitudHBkIC1kZG5ObCAtUyAuL250cC5zY3JpcHQgJHBfb3B0CmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3dfbG9nIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvbG9nL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL2xvZy9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYwZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9wX2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9wX2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQorY2F0IEAqIGN1cnJlbnQgfCAkUEFHRVIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDkyZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvcnVuCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9zaAorCisjZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCit1c2VyPXJvb3QgIyBmb3IgYmluZCB0byBwb3J0IDY5CisKK2V4ZWMgXAorZW52IC0gXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3VkcHN2ZCAtdiAtYyAxMCAtbCBsb2NhbGhvc3QgXAorICAwIDY5IFwKK3RmdHBkIC9wdWIvdGZ0cGRfcm9vdApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvd19sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3pjaXAuc2NyaXB0IGIvZXhhbXBsZXMvemNpcC5zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU0M2MzMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3pjaXAuc2NyaXB0CkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCisjIG9ubHkgZm9yIHVzZSBhcyBhICJ6Y2lwIiBjYWxsYmFjayBzY3JpcHQKK2lmIFsgIngkaW50ZXJmYWNlIiA9IHggXQordGhlbgorCWV4aXQgMQorZmkKKworIyB6Y2lwIHNob3VsZCBzdGFydCBvbiBib290L3Jlc3VtZSBhbmQgdmFyaW91cyBtZWRpYSBjaGFuZ2VzCitjYXNlICIkMSIgaW4KK2luaXQpCisJIyBmb3Igbm93LCB6Y2lwIHJlcXVpcmVzIHRoZSBsaW5rIHRvIGJlIGFscmVhZHkgdXAsCisJIyBhbmQgaXQgZHJvcHMgbGlua3Mgd2hlbiB0aGV5IGdvIGRvd24uICB0aGF0IGlzbid0CisJIyB0aGUgbW9zdCByb2J1c3QgbW9kZWwuLi4KKwlleGl0IDAKKwk7OworY29uZmlnKQorCWlmIFsgIngkaXAiID0geCBdCisJdGhlbgorCQlleGl0IDEKKwlmaQorCSMgcmVtZW1iZXIgJGlwIGZvciAkaW50ZXJmYWNlLCB0byB1c2Ugb24gcmVzdGFydAorCWlmIFsgIngkaXAiICE9IHggLWEgLXcgIiRpcC4kaW50ZXJmYWNlIiBdCisJdGhlbgorCQllY2hvICRpcCA+ICIkaXAuJGludGVyZmFjZSIKKwlmaQorCWV4ZWMgaXAgYWRkcmVzcyBhZGQgZGV2ICRpbnRlcmZhY2UgXAorCQlzY29wZSBsaW5rIGxvY2FsICIkaXAvMTYiIGJyb2FkY2FzdCArCisJOzsKK2RlY29uZmlnKQorCWlmIFsgeCRpcCA9IHggXQorCXRoZW4KKwkJZXhpdCAxCisJZmkKKwlleGVjIGlwIGFkZHJlc3MgZGVsIGRldiAkaW50ZXJmYWNlIGxvY2FsICRpcAorCTs7Citlc2FjCitleGl0IDEKZGlmZiAtLWdpdCBhL2ZpbmR1dGlscy9Db25maWcuaW4gYi9maW5kdXRpbHMvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDBiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5kdXRpbHMvQ29uZmlnLmluCkBAIC0wLDAgKzEsMjUyIEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiRmluZGluZyBVdGlsaXRpZXMiCisKK2NvbmZpZyBGSU5ECisJYm9vbCAiZmluZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBmaW5kIGlzIHVzZWQgdG8gc2VhcmNoIHlvdXIgc3lzdGVtIHRvIGZpbmQgc3BlY2lmaWVkIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9GSU5EX1BSSU5UMAorCWJvb2wgIkVuYWJsZSAtcHJpbnQwOiBOVUwtdGVybWluYXRlZCBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgQ2F1c2VzIG91dHB1dCBuYW1lcyB0byBiZSBzZXBhcmF0ZWQgYnkgYSBOVUwgY2hhcmFjdGVyCisJICByYXRoZXIgdGhhbiBhIG5ld2xpbmUuIFRoaXMgYWxsb3dzIG5hbWVzIHRoYXQgY29udGFpbgorCSAgbmV3bGluZXMgYW5kIG90aGVyIHdoaXRlc3BhY2UgdG8gYmUgbW9yZSBlYXNpbHkKKwkgIGludGVycHJldGVkIGJ5IG90aGVyIHByb2dyYW1zLgorCitjb25maWcgRkVBVFVSRV9GSU5EX01USU1FCisJYm9vbCAiRW5hYmxlIC1tdGltZTogbW9kaWZpZWQgdGltZSBtYXRjaGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBBbGxvdyBzZWFyY2hpbmcgYmFzZWQgb24gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mCisJICBmaWxlcywgaW4gZGF5cy4KKworY29uZmlnIEZFQVRVUkVfRklORF9NTUlOCisJYm9vbCAiRW5hYmxlIC1tbWluOiBtb2RpZmllZCB0aW1lIG1hdGNoaW5nIGJ5IG1pbnV0ZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgQWxsb3cgc2VhcmNoaW5nIGJhc2VkIG9uIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZgorCSAgZmlsZXMsIGluIG1pbnV0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0ZJTkRfUEVSTQorCWJvb2wgIkVuYWJsZSAtcGVybTogcGVybWlzc2lvbnMgbWF0Y2hpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgRW5hYmxlIHNlYXJjaGluZyBiYXNlZCBvbiBmaWxlIHBlcm1pc3Npb25zLgorCitjb25maWcgRkVBVFVSRV9GSU5EX1RZUEUKKwlib29sICJFbmFibGUgLXR5cGU6IGZpbGUgdHlwZSBtYXRjaGluZyAoZmlsZS9kaXIvbGluay8uLi4pIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRklORAorCWhlbHAKKwkgIEVuYWJsZSBzZWFyY2hpbmcgYmFzZWQgb24gZmlsZSB0eXBlIChmaWxlLAorCSAgZGlyZWN0b3J5LCBzb2NrZXQsIGRldmljZSwgZXRjLikuCisKK2NvbmZpZyBGRUFUVVJFX0ZJTkRfWERFVgorCWJvb2wgIkVuYWJsZSAteGRldjogJ3N0YXkgaW4gZmlsZXN5c3RlbSciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIGZpbmQgdG8gcmVzdHJpY3Qgc2VhcmNoZXMgdG8gYSBzaW5nbGUgZmlsZXN5c3RlbS4KKworY29uZmlnIEZFQVRVUkVfRklORF9NQVhERVBUSAorCWJvb2wgIkVuYWJsZSAtbWluZGVwdGggTiBhbmQgLW1heGRlcHRoIE4iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyAtbWluZGVwdGggTiBhbmQgLW1heGRlcHRoIE4gb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9GSU5EX05FV0VSCisJYm9vbCAiRW5hYmxlIC1uZXdlcjogY29tcGFyZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBTdXBwb3J0IHRoZSAnZmluZCAtbmV3ZXInIG9wdGlvbiBmb3IgZmluZGluZyBhbnkgZmlsZXMgd2hpY2ggaGF2ZQorCSAgbW9kaWZpY2F0aW9uIHRpbWUgdGhhdCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBzcGVjaWZpZWQgRklMRS4KKworY29uZmlnIEZFQVRVUkVfRklORF9JTlVNCisJYm9vbCAiRW5hYmxlIC1pbnVtOiBpbm9kZSBudW1iZXIgbWF0Y2hpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgU3VwcG9ydCB0aGUgJ2ZpbmQgLWludW0nIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IGlub2RlIG51bWJlci4KKworY29uZmlnIEZFQVRVUkVfRklORF9FWEVDCisJYm9vbCAiRW5hYmxlIC1leGVjOiBleGVjdXRlIGNvbW1hbmRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRklORAorCWhlbHAKKwkgIFN1cHBvcnQgdGhlICdmaW5kIC1leGVjJyBvcHRpb24gZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBiYXNlZCB1cG9uCisJICB0aGUgZmlsZXMgbWF0Y2hlZC4KKworY29uZmlnIEZFQVRVUkVfRklORF9VU0VSCisJYm9vbCAiRW5hYmxlIC11c2VyOiB1c2VybmFtZS91aWQgbWF0Y2hpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgU3VwcG9ydCB0aGUgJ2ZpbmQgLXVzZXInIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IHVzZXJuYW1lIG9yIHVpZC4KKworY29uZmlnIEZFQVRVUkVfRklORF9HUk9VUAorCWJvb2wgIkVuYWJsZSAtZ3JvdXA6IGdyb3VwL2dpZCBtYXRjaGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBTdXBwb3J0IHRoZSAnZmluZCAtZ3JvdXAnIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IGdyb3VwIG5hbWUgb3IgZ2lkLgorCitjb25maWcgRkVBVFVSRV9GSU5EX05PVAorCWJvb2wgIkVuYWJsZSB0aGUgJ25vdCcgKCEpIG9wZXJhdG9yIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRklORAorCWhlbHAKKwkgIFN1cHBvcnQgdGhlICchJyBvcGVyYXRvciB0byBpbnZlcnQgdGhlIHRlc3QgcmVzdWx0cy4KKwkgIElmICdFbmFibGUgZnVsbC1ibG93biBkZXNrdG9wJyBpcyBlbmFibGVkLCB0aGVuIHdpbGwgYWxzbyBzdXBwb3J0CisJICB0aGUgbm9uLVBPU0lYIG5vdGF0aW9uICctbm90Jy4KKworY29uZmlnIEZFQVRVUkVfRklORF9ERVBUSAorCWJvb2wgIkVuYWJsZSAtZGVwdGgiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGSU5ECisJaGVscAorCSAgUHJvY2VzcyBlYWNoIGRpcmVjdG9yeSdzIGNvbnRlbnRzIGJlZm9yZSB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KKworY29uZmlnIEZFQVRVUkVfRklORF9QQVJFTgorCWJvb2wgIkVuYWJsZSBwYXJlbnMgaW4gb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBFbmFibGUgdXNhZ2Ugb2YgcGFyZW5zICcoJyB0byBzcGVjaWZ5IGxvZ2ljYWwgb3JkZXIgb2YgYXJndW1lbnRzLgorCitjb25maWcgRkVBVFVSRV9GSU5EX1NJWkUKKwlib29sICJFbmFibGUgLXNpemU6IGZpbGUgc2l6ZSBtYXRjaGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBTdXBwb3J0IHRoZSAnZmluZCAtc2l6ZScgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgZmlsZSBzaXplLgorCitjb25maWcgRkVBVFVSRV9GSU5EX1BSVU5FCisJYm9vbCAiRW5hYmxlIC1wcnVuZTogZXhjbHVkZSBzdWJkaXJlY3RvcmllcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgZG9udCBkZXNjZW5kIGludG8gaXQuIFVzZWZ1bCBmb3IKKwkgIGV4Y2x1c2lvbiAuc3ZuIGFuZCBDVlMgZGlyZWN0b3JpZXMuCisKK2NvbmZpZyBGRUFUVVJFX0ZJTkRfREVMRVRFCisJYm9vbCAiRW5hYmxlIC1kZWxldGU6IGRlbGV0ZSBmaWxlcy9kaXJzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRklORCAmJiBGRUFUVVJFX0ZJTkRfREVQVEgKKwloZWxwCisJICBTdXBwb3J0IHRoZSAnZmluZCAtZGVsZXRlJyBvcHRpb24gZm9yIGRlbGV0aW5nIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKwkgIFdBUk5JTkc6IFRoaXMgb3B0aW9uIGNhbiBkbyBtdWNoIGhhcm0gaWYgdXNlZCB3cm9uZy4gQnVzeWJveCB3aWxsIG5vdAorCSAgdHJ5IHRvIHByb3RlY3QgdGhlIHVzZXIgZnJvbSBkb2luZyBzdHVwaWQgdGhpbmdzLiBVc2Ugd2l0aCBjYXJlLgorCitjb25maWcgRkVBVFVSRV9GSU5EX1BBVEgKKwlib29sICJFbmFibGUgLXBhdGg6IG1hdGNoIHBhdGhuYW1lIHdpdGggc2hlbGwgcGF0dGVybiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBUaGUgLXBhdGggb3B0aW9uIG1hdGNoZXMgd2hvbGUgcGF0aG5hbWUgaW5zdGVhZCBvZiBqdXN0IGZpbGVuYW1lLgorCitjb25maWcgRkVBVFVSRV9GSU5EX1JFR0VYCisJYm9vbCAiRW5hYmxlIC1yZWdleDogbWF0Y2ggcGF0aG5hbWUgd2l0aCByZWdleCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBUaGUgLXJlZ2V4IG9wdGlvbiBtYXRjaGVzIHdob2xlIHBhdGhuYW1lIGFnYWluc3QgcmVndWxhciBleHByZXNzaW9uLgorCitjb25maWcgRkVBVFVSRV9GSU5EX0NPTlRFWFQKKwlib29sICJFbmFibGUgLWNvbnRleHQ6IHNlY3VyaXR5IGNvbnRleHQgbWF0Y2hpbmciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGSU5EICYmIFNFTElOVVgKKwloZWxwCisJICBTdXBwb3J0IHRoZSAnZmluZCAtY29udGV4dCcgb3B0aW9uIGZvciBtYXRjaGluZyBzZWN1cml0eSBjb250ZXh0LgorCitjb25maWcgRkVBVFVSRV9GSU5EX0xJTktTCisJYm9vbCAiRW5hYmxlIC1saW5rczogbGluayBjb3VudCBtYXRjaGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZJTkQKKwloZWxwCisJICBTdXBwb3J0IHRoZSAnZmluZCAtbGlua3MnIG9wdGlvbiBmb3IgbWF0Y2hpbmcgbnVtYmVyIG9mIGxpbmtzLgorY29uZmlnIEdSRVAKKwlib29sICJncmVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGdyZXAgaXMgdXNlZCB0byBzZWFyY2ggZmlsZXMgZm9yIGEgc3BlY2lmaWVkIHBhdHRlcm4uCisKK2NvbmZpZyBGRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMKKwlib29sICJFbmFibGUgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyAoZWdyZXAgJiBncmVwIC1FKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEdSRVAKKwloZWxwCisJICBFbmFibGVkIHN1cHBvcnQgZm9yIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIEV4dGVuZGVkCisJICByZWd1bGFyIGV4cHJlc3Npb25zIGFsbG93IGZvciBhbHRlcm5hdGlvbiAoZm9vfGJhciksIGdyb3VwaW5nLAorCSAgYW5kIHZhcmlvdXMgcmVwZXRpdGlvbiBvcGVyYXRvcnMuCisKK2NvbmZpZyBGRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVMKKwlib29sICJBbGlhcyBmZ3JlcCB0byBncmVwIC1GIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gR1JFUAorCWhlbHAKKwkgIGZncmVwIHNlZXMgdGhlIHNlYXJjaCBwYXR0ZXJuIGFzIGEgbm9ybWFsIHN0cmluZyByYXRoZXIgdGhhbgorCSAgcmVndWxhciBleHByZXNzaW9ucy4KKwkgIGdyZXAgLUYgYWx3YXlzIHdvcmtzLCB0aGlzIGp1c3QgY3JlYXRlcyB0aGUgZmdyZXAgYWxpYXMuCisKK2NvbmZpZyBGRUFUVVJFX0dSRVBfQ09OVEVYVAorCWJvb2wgIkVuYWJsZSBiZWZvcmUgYW5kIGFmdGVyIGNvbnRleHQgZmxhZ3MgKC1BLCAtQiBhbmQgLUMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gR1JFUAorCWhlbHAKKwkgIFByaW50IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGxlYWRpbmcgKC1CKSBhbmQvb3IgdHJhaWxpbmcgKC1BKQorCSAgY29udGV4dCBzdXJyb3VuZGluZyBvdXIgbWF0Y2hpbmcgbGluZXMuCisJICBQcmludCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjb250ZXh0IGxpbmVzICgtQykuCitjb25maWcgWEFSR1MKKwlib29sICJ4YXJncyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB4YXJncyBpcyB1c2VkIHRvIGV4ZWN1dGUgYSBzcGVjaWZpZWQgY29tbWFuZCBmb3IKKwkgIGV2ZXJ5IGl0ZW0gZnJvbSBzdGFuZGFyZCBpbnB1dC4KKworY29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04KKwlib29sICJFbmFibGUgLXA6IHByb21wdCBhbmQgY29uZmlybWF0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gWEFSR1MKKwloZWxwCisJICBTdXBwb3J0IC1wOiBwcm9tcHQgdGhlIHVzZXIgd2hldGhlciB0byBydW4gZWFjaCBjb21tYW5kCisJICBsaW5lIGFuZCByZWFkIGEgbGluZSBmcm9tIHRoZSB0ZXJtaW5hbC4KKworY29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVMKKwlib29sICJFbmFibGUgc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzIGFuZCBiYWNrc2xhc2giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBYQVJHUworCWhlbHAKKwkgIFN1cHBvcnQgcXVvdGluZyBpbiB0aGUgaW5wdXQuCisKK2NvbmZpZyBGRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVAorCWJvb2wgIkVuYWJsZSAteDogZXhpdCBpZiAtcyBvciAtbiBpcyBleGNlZWRlZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFhBUkdTCisJaGVscAorCSAgU3VwcG9ydCAteDogZXhpdCBpZiB0aGUgY29tbWFuZCBzaXplIChzZWUgdGhlIC1zIG9yIC1uIG9wdGlvbikKKwkgIGlzIGV4Y2VlZGVkLgorCitjb25maWcgRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTQorCWJvb2wgIkVuYWJsZSAtMDogTlVMLXRlcm1pbmF0ZWQgaW5wdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBYQVJHUworCWhlbHAKKwkgIFN1cHBvcnQgLTA6IGlucHV0IGl0ZW1zIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgTlVMIGNoYXJhY3RlcgorCSAgaW5zdGVhZCBvZiB3aGl0ZXNwYWNlLCBhbmQgdGhlIHF1b3RlcyBhbmQgYmFja3NsYXNoCisJICBhcmUgbm90IHNwZWNpYWwuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2ZpbmR1dGlscy9Db25maWcuc3JjIGIvZmluZHV0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzFhOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmR1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkZpbmRpbmcgVXRpbGl0aWVzIgorCitJTlNFUlQKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZmluZHV0aWxzL0tidWlsZC5zcmMgYi9maW5kdXRpbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRmYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluZHV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKZGlmZiAtLWdpdCBhL2ZpbmR1dGlscy9maW5kLmMgYi9maW5kdXRpbHMvZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGZjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5kdXRpbHMvZmluZC5jCkBAIC0wLDAgKzEsMTI5MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmaW5kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIFJld29ya2VkIGJ5IERhdmlkIERvdXRoaXR0IDxuOXViaEBjYWxsc2lnbi5uZXQ+IGFuZAorICogIE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogZmluZHV0aWxzLTQuMS4yMDoKKyAqCisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8ge30nICd7fSAge30nICc7JworICogZmluZDogZWNobyBmaWxlLnR4dDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICogIyBmaW5kIGZpbGUudHh0IC1leGVjICdlY2hvJyAne30gIHt9JyAnOyAnCisgKiBmaW5kOiBtaXNzaW5nIGFyZ3VtZW50IHRvIGAtZXhlYycKKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobyB7fScgJ3t9ICB7fScgJzsnIGp1bmsKKyAqIGZpbmQ6IHBhdGhzIG11c3QgcHJlY2VkZSBleHByZXNzaW9uCisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8ge30nICd7fSAge30nICc7JyBqdW5rICc7JworICogZmluZDogcGF0aHMgbXVzdCBwcmVjZWRlIGV4cHJlc3Npb24KKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobycgJ3t9ICB7fScgJzsnCisgKiBmaWxlLnR4dCAgZmlsZS50eHQKKyAqIChzdHJhY2U6IGV4ZWN2ZSgiL2Jpbi9lY2hvIiwgWyJlY2hvIiwgImZpbGUudHh0ICBmaWxlLnR4dCJdLCBbIDMwIHZhcnMgXSkpCisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8nICd7fSAge30nICc7JyAtcHJpbnQgLWV4ZWMgcHdkICc7JworICogZmlsZS50eHQgIGZpbGUudHh0CisgKiBmaWxlLnR4dAorICogL3RtcAorICogIyBmaW5kIC1uYW1lICcqLmMnIC1vIC1uYW1lICcqLmgnCisgKiBbc2hvd3MgZmlsZXMsICouYyBhbmQgKi5oIGludGVybWl4ZWRdCisgKiAjIGZpbmQgZmlsZS50eHQgLW5hbWUgJypmKicgLW8gLW5hbWUgJyp0KicKKyAqIGZpbGUudHh0CisgKiAjIGZpbmQgZmlsZS50eHQgLW5hbWUgJyp6KicgLW8gLW5hbWUgJyp0KicKKyAqIGZpbGUudHh0CisgKiAjIGZpbmQgZmlsZS50eHQgLW5hbWUgJypmKicgLW8gLW5hbWUgJyp6KicKKyAqIGZpbGUudHh0CisgKgorICogIyBmaW5kIHQgeiAtbmFtZSAnKnQqJyAtcHJpbnQgLW8gLW5hbWUgJyp6KicKKyAqIHQKKyAqICMgZmluZCB0IHogdCB6IC1uYW1lICcqdConIC1vIC1uYW1lICcqeionIC1wcmludAorICogegorICogegorICogIyBmaW5kIHQgeiB0IHogJygnIC1uYW1lICcqdConIC1vIC1uYW1lICcqeionICcpJyAtbyAtcHJpbnQKKyAqIChubyBvdXRwdXQpCisgKi8KKworLyogVGVzdGluZyBzY3JpcHQKKyAqIC4vYnVzeWJveCBmaW5kICIkQCIgfCB0ZWUgL3RtcC9iYl9maW5kCisgKiBlY2hvID09PT09PT09PT09PT09PT09PQorICogL3BhdGgvdG8vZ251L2ZpbmQgIiRAIiB8IHRlZSAvdG1wL3N0ZF9maW5kCisgKiBlY2hvID09PT09PT09PT09PT09PT09PQorICogZGlmZiAtdSAvdG1wL3N0ZF9maW5kIC90bXAvYmJfZmluZCAmJiBlY2hvIElkZW50aWNhbAorICovCisKKy8vY29uZmlnOmNvbmZpZyBGSU5ECisvL2NvbmZpZzoJYm9vbCAiZmluZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBmaW5kIGlzIHVzZWQgdG8gc2VhcmNoIHlvdXIgc3lzdGVtIHRvIGZpbmQgc3BlY2lmaWVkIGZpbGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1BSSU5UMAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcHJpbnQwOiBOVUwtdGVybWluYXRlZCBvdXRwdXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ2F1c2VzIG91dHB1dCBuYW1lcyB0byBiZSBzZXBhcmF0ZWQgYnkgYSBOVUwgY2hhcmFjdGVyCisvL2NvbmZpZzoJICByYXRoZXIgdGhhbiBhIG5ld2xpbmUuIFRoaXMgYWxsb3dzIG5hbWVzIHRoYXQgY29udGFpbgorLy9jb25maWc6CSAgbmV3bGluZXMgYW5kIG90aGVyIHdoaXRlc3BhY2UgdG8gYmUgbW9yZSBlYXNpbHkKKy8vY29uZmlnOgkgIGludGVycHJldGVkIGJ5IG90aGVyIHByb2dyYW1zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX01USU1FCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1tdGltZTogbW9kaWZpZWQgdGltZSBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyBzZWFyY2hpbmcgYmFzZWQgb24gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mCisvL2NvbmZpZzoJICBmaWxlcywgaW4gZGF5cy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9NTUlOCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1tbWluOiBtb2RpZmllZCB0aW1lIG1hdGNoaW5nIGJ5IG1pbnV0ZXMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWxsb3cgc2VhcmNoaW5nIGJhc2VkIG9uIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZgorLy9jb25maWc6CSAgZmlsZXMsIGluIG1pbnV0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUEVSTQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcGVybTogcGVybWlzc2lvbnMgbWF0Y2hpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHNlYXJjaGluZyBiYXNlZCBvbiBmaWxlIHBlcm1pc3Npb25zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1RZUEUKKy8vY29uZmlnOglib29sICJFbmFibGUgLXR5cGU6IGZpbGUgdHlwZSBtYXRjaGluZyAoZmlsZS9kaXIvbGluay8uLi4pIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzZWFyY2hpbmcgYmFzZWQgb24gZmlsZSB0eXBlIChmaWxlLAorLy9jb25maWc6CSAgZGlyZWN0b3J5LCBzb2NrZXQsIGRldmljZSwgZXRjLikuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfWERFVgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAteGRldjogJ3N0YXkgaW4gZmlsZXN5c3RlbSciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gYWxsb3dzIGZpbmQgdG8gcmVzdHJpY3Qgc2VhcmNoZXMgdG8gYSBzaW5nbGUgZmlsZXN5c3RlbS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9NQVhERVBUSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtbWluZGVwdGggTiBhbmQgLW1heGRlcHRoIE4iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gZW5hYmxlcyAtbWluZGVwdGggTiBhbmQgLW1heGRlcHRoIE4gb3B0aW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX05FV0VSCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1uZXdlcjogY29tcGFyZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtbmV3ZXInIG9wdGlvbiBmb3IgZmluZGluZyBhbnkgZmlsZXMgd2hpY2ggaGF2ZQorLy9jb25maWc6CSAgbW9kaWZpY2F0aW9uIHRpbWUgdGhhdCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBzcGVjaWZpZWQgRklMRS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9JTlVNCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1pbnVtOiBpbm9kZSBudW1iZXIgbWF0Y2hpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJ2ZpbmQgLWludW0nIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IGlub2RlIG51bWJlci4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9FWEVDCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1leGVjOiBleGVjdXRlIGNvbW1hbmRzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1leGVjJyBvcHRpb24gZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBiYXNlZCB1cG9uCisvL2NvbmZpZzoJICB0aGUgZmlsZXMgbWF0Y2hlZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9VU0VSCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC11c2VyOiB1c2VybmFtZS91aWQgbWF0Y2hpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJ2ZpbmQgLXVzZXInIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IHVzZXJuYW1lIG9yIHVpZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9HUk9VUAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtZ3JvdXA6IGdyb3VwL2dpZCBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtZ3JvdXAnIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IGdyb3VwIG5hbWUgb3IgZ2lkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX05PVAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSB0aGUgJ25vdCcgKCEpIG9wZXJhdG9yIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICchJyBvcGVyYXRvciB0byBpbnZlcnQgdGhlIHRlc3QgcmVzdWx0cy4KKy8vY29uZmlnOgkgIElmICdFbmFibGUgZnVsbC1ibG93biBkZXNrdG9wJyBpcyBlbmFibGVkLCB0aGVuIHdpbGwgYWxzbyBzdXBwb3J0CisvL2NvbmZpZzoJICB0aGUgbm9uLVBPU0lYIG5vdGF0aW9uICctbm90Jy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9ERVBUSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtZGVwdGgiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUHJvY2VzcyBlYWNoIGRpcmVjdG9yeSdzIGNvbnRlbnRzIGJlZm9yZSB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9QQVJFTgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBwYXJlbnMgaW4gb3B0aW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgdXNhZ2Ugb2YgcGFyZW5zICcoJyB0byBzcGVjaWZ5IGxvZ2ljYWwgb3JkZXIgb2YgYXJndW1lbnRzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1NJWkUKKy8vY29uZmlnOglib29sICJFbmFibGUgLXNpemU6IGZpbGUgc2l6ZSBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtc2l6ZScgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgZmlsZSBzaXplLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1BSVU5FCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1wcnVuZTogZXhjbHVkZSBzdWJkaXJlY3RvcmllcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgZG9udCBkZXNjZW5kIGludG8gaXQuIFVzZWZ1bCBmb3IKKy8vY29uZmlnOgkgIGV4Y2x1c2lvbiAuc3ZuIGFuZCBDVlMgZGlyZWN0b3JpZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfREVMRVRFCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1kZWxldGU6IGRlbGV0ZSBmaWxlcy9kaXJzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORCAmJiBGRUFUVVJFX0ZJTkRfREVQVEgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtZGVsZXRlJyBvcHRpb24gZm9yIGRlbGV0aW5nIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKy8vY29uZmlnOgkgIFdBUk5JTkc6IFRoaXMgb3B0aW9uIGNhbiBkbyBtdWNoIGhhcm0gaWYgdXNlZCB3cm9uZy4gQnVzeWJveCB3aWxsIG5vdAorLy9jb25maWc6CSAgdHJ5IHRvIHByb3RlY3QgdGhlIHVzZXIgZnJvbSBkb2luZyBzdHVwaWQgdGhpbmdzLiBVc2Ugd2l0aCBjYXJlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1BBVEgKKy8vY29uZmlnOglib29sICJFbmFibGUgLXBhdGg6IG1hdGNoIHBhdGhuYW1lIHdpdGggc2hlbGwgcGF0dGVybiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgLXBhdGggb3B0aW9uIG1hdGNoZXMgd2hvbGUgcGF0aG5hbWUgaW5zdGVhZCBvZiBqdXN0IGZpbGVuYW1lLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1JFR0VYCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1yZWdleDogbWF0Y2ggcGF0aG5hbWUgd2l0aCByZWdleCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgLXJlZ2V4IG9wdGlvbiBtYXRjaGVzIHdob2xlIHBhdGhuYW1lIGFnYWluc3QgcmVndWxhciBleHByZXNzaW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0NPTlRFWFQKKy8vY29uZmlnOglib29sICJFbmFibGUgLWNvbnRleHQ6IHNlY3VyaXR5IGNvbnRleHQgbWF0Y2hpbmciCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5EICYmIFNFTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtY29udGV4dCcgb3B0aW9uIGZvciBtYXRjaGluZyBzZWN1cml0eSBjb250ZXh0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0xJTktTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1saW5rczogbGluayBjb3VudCBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtbGlua3MnIG9wdGlvbiBmb3IgbWF0Y2hpbmcgbnVtYmVyIG9mIGxpbmtzLgorCisvL2FwcGxldDpJRl9GSU5EKEFQUExFVF9OT0VYRUMoZmluZCwgZmluZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZmluZCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GSU5EKSArPSBmaW5kLm8KKworLy91c2FnZTojZGVmaW5lIGZpbmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltQQVRIXS4uLiBbT1BUSU9OU10gW0FDVElPTlNdIgorLy91c2FnZTojZGVmaW5lIGZpbmRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZWFyY2ggZm9yIGZpbGVzIGFuZCBwZXJmb3JtIGFjdGlvbnMgb24gdGhlbS5cbiIKKy8vdXNhZ2U6ICAgICAgICJGaXJzdCBmYWlsZWQgYWN0aW9uIHN0b3BzIHByb2Nlc3Npbmcgb2YgY3VycmVudCBmaWxlLlxuIgorLy91c2FnZTogICAgICAgIkRlZmF1bHRzOiBQQVRIIGlzIGN1cnJlbnQgZGlyZWN0b3J5LCBhY3Rpb24gaXMgJy1wcmludCdcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWZvbGxvdwkJRm9sbG93IHN5bWxpbmtzIgorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1hERVYoCisvL3VzYWdlOiAgICAgIlxuCS14ZGV2CQlEb24ndCBkZXNjZW5kIGRpcmVjdG9yaWVzIG9uIG90aGVyIGZpbGVzeXN0ZW1zIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX01BWERFUFRIKAorLy91c2FnZTogICAgICJcbgktbWF4ZGVwdGggTglEZXNjZW5kIGF0IG1vc3QgTiBsZXZlbHMuIC1tYXhkZXB0aCAwIGFwcGxpZXMiCisvL3VzYWdlOiAgICAgIlxuCQkJYWN0aW9ucyB0byBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1taW5kZXB0aCBOCURvbid0IGFjdCBvbiBmaXJzdCBOIGxldmVscyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9ERVBUSCgKKy8vdXNhZ2U6ICAgICAiXG4JLWRlcHRoCQlBY3Qgb24gZGlyZWN0b3J5ICphZnRlciogdHJhdmVyc2luZyBpdCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQWN0aW9uczoiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfUEFSRU4oCisvL3VzYWdlOiAgICAgIlxuCSggQUNUSU9OUyApCUdyb3VwIGFjdGlvbnMgZm9yIC1vIC8gLWEiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTk9UKAorLy91c2FnZTogICAgICJcbgkhIEFDVAkJSW52ZXJ0IEFDVCdzIHN1Y2Nlc3MvZmFpbHVyZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JQUNUMSBbLWFdIEFDVDIJSWYgQUNUMSBmYWlscywgc3RvcCwgZWxzZSBkbyBBQ1QyIgorLy91c2FnZTogICAgICJcbglBQ1QxIC1vIEFDVDIJSWYgQUNUMSBzdWNjZWVkcywgc3RvcCwgZWxzZSBkbyBBQ1QyIgorLy91c2FnZTogICAgICJcbgkJCU5vdGU6IC1hIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiAtbyIKKy8vdXNhZ2U6ICAgICAiXG4JLW5hbWUgUEFUVEVSTglNYXRjaCBmaWxlIG5hbWUgKHcvbyBkaXJlY3RvcnkgbmFtZSkgdG8gUEFUVEVSTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWluYW1lIFBBVFRFUk4JQ2FzZSBpbnNlbnNpdGl2ZSAtbmFtZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9QQVRIKAorLy91c2FnZTogICAgICJcbgktcGF0aCBQQVRURVJOCU1hdGNoIHBhdGggdG8gUEFUVEVSTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWlwYXRoIFBBVFRFUk4JQ2FzZSBpbnNlbnNpdGl2ZSAtcGF0aCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9SRUdFWCgKKy8vdXNhZ2U6ICAgICAiXG4JLXJlZ2V4IFBBVFRFUk4JTWF0Y2ggcGF0aCB0byByZWdleCBQQVRURVJOIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1RZUEUoCisvL3VzYWdlOiAgICAgIlxuCS10eXBlIFgJCUZpbGUgdHlwZSBpcyBYIChvbmUgb2Y6IGYsZCxsLGIsYywuLi4pIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1BFUk0oCisvL3VzYWdlOiAgICAgIlxuCS1wZXJtIE1BU0sJQXQgbGVhc3Qgb25lIG1hc2sgYml0ICgrTUFTSyksIGFsbCBiaXRzICgtTUFTSyksIgorLy91c2FnZTogICAgICJcbgkJCW9yIGV4YWN0bHkgTUFTSyBiaXRzIGFyZSBzZXQgaW4gZmlsZSdzIG1vZGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTVRJTUUoCisvL3VzYWdlOiAgICAgIlxuCS1tdGltZSBEQVlTCW10aW1lIGlzIGdyZWF0ZXIgdGhhbiAoK04pLCBsZXNzIHRoYW4gKC1OKSwiCisvL3VzYWdlOiAgICAgIlxuCQkJb3IgZXhhY3RseSBOIGRheXMgaW4gdGhlIHBhc3QiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTU1JTigKKy8vdXNhZ2U6ICAgICAiXG4JLW1taW4gTUlOUwltdGltZSBpcyBncmVhdGVyIHRoYW4gKCtOKSwgbGVzcyB0aGFuICgtTiksIgorLy91c2FnZTogICAgICJcbgkJCW9yIGV4YWN0bHkgTiBtaW51dGVzIGluIHRoZSBwYXN0IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX05FV0VSKAorLy91c2FnZTogICAgICJcbgktbmV3ZXIgRklMRQltdGltZSBpcyBtb3JlIHJlY2VudCB0aGFuIEZJTEUncyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9JTlVNKAorLy91c2FnZTogICAgICJcbgktaW51bSBOCQlGaWxlIGhhcyBpbm9kZSBudW1iZXIgTiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9VU0VSKAorLy91c2FnZTogICAgICJcbgktdXNlciBOQU1FL0lECUZpbGUgaXMgb3duZWQgYnkgZ2l2ZW4gdXNlciIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9HUk9VUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWdyb3VwIE5BTUUvSUQJRmlsZSBpcyBvd25lZCBieSBnaXZlbiBncm91cCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9TSVpFKAorLy91c2FnZTogICAgICJcbgktc2l6ZSBOW2Jja10JRmlsZSBzaXplIGlzIE4gKGM6Ynl0ZXMsazprYnl0ZXMsYjo1MTIgYnl0ZXMoZGVmLikpIgorLy91c2FnZTogICAgICJcbgkJCSsvLU46IGZpbGUgc2l6ZSBpcyBiaWdnZXIvc21hbGxlciB0aGFuIE4iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTElOS1MoCisvL3VzYWdlOiAgICAgIlxuCS1saW5rcyBOCU51bWJlciBvZiBsaW5rcyBpcyBncmVhdGVyIHRoYW4gKCtOKSwgbGVzcyB0aGFuICgtTiksIgorLy91c2FnZTogICAgICJcbgkJCW9yIGV4YWN0bHkgTiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9DT05URVhUKAorLy91c2FnZTogICAgICJcbgktY29udGV4dCBDVFgJRmlsZSBoYXMgc3BlY2lmaWVkIHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfUFJVTkUoCisvL3VzYWdlOiAgICAgIlxuCS1wcnVuZQkJSWYgY3VycmVudCBmaWxlIGlzIGRpcmVjdG9yeSwgZG9uJ3QgZGVzY2VuZCBpbnRvIGl0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbklmIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGlzIHNwZWNpZmllZCwgLXByaW50IGlzIGFzc3VtZWQiCisvL3VzYWdlOiAgICAgIlxuCS1wcmludAkJUHJpbnQgZmlsZSBuYW1lIgorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1BSSU5UMCgKKy8vdXNhZ2U6ICAgICAiXG4JLXByaW50MAkJUHJpbnQgZmlsZSBuYW1lLCBOVUwgdGVybWluYXRlZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9FWEVDKAorLy91c2FnZTogICAgICJcbgktZXhlYyBDTUQgQVJHIDsJUnVuIENNRCB3aXRoIGFsbCBpbnN0YW5jZXMgb2Yge30gcmVwbGFjZWQgYnkiCisvL3VzYWdlOiAgICAgIlxuCQkJZmlsZSBuYW1lLiBGYWlscyBpZiBDTUQgZXhpdHMgd2l0aCBub256ZXJvIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0RFTEVURSgKKy8vdXNhZ2U6ICAgICAiXG4JLWRlbGV0ZQkJRGVsZXRlIGN1cnJlbnQgZmlsZS9kaXJlY3RvcnkuIFR1cm5zIG9uIC1kZXB0aCBvcHRpb24iCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZpbmRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZmluZCAvIC1uYW1lIHBhc3N3ZFxuIgorLy91c2FnZTogICAgICAgIi9ldGMvcGFzc3dkXG4iCisKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1JFR0VYCisjIGluY2x1ZGUgInhyZWdleC5oIgorI2VuZGlmCisvKiBHTlVpc206ICovCisjaWZuZGVmIEZOTV9DQVNFRk9MRAorIyBkZWZpbmUgRk5NX0NBU0VGT0xEIDAKKyNlbmRpZgorCisjZGVmaW5lIGRiZyguLi4pICgodm9pZCkwKQorLyogI2RlZmluZSBkYmcoLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pICovCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKwordHlwZWRlZiBpbnQgKCphY3Rpb25fZnApKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1Ziwgdm9pZCAqKSBGQVNUX0ZVTkM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlhY3Rpb25fZnAgZjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05PVAorCWJvb2wgaW52ZXJ0OworI2VuZGlmCit9IGFjdGlvbjsKKworI2RlZmluZSBBQ1RTKG5hbWUsIC4uLikgdHlwZWRlZiBzdHJ1Y3QgeyBhY3Rpb24gYTsgX19WQV9BUkdTX18gfSBhY3Rpb25fIyNuYW1lOworI2RlZmluZSBBQ1RGKG5hbWUpIFwKKwlzdGF0aWMgaW50IEZBU1RfRlVOQyBmdW5jXyMjbmFtZShjb25zdCBjaGFyICpmaWxlTmFtZSBVTlVTRURfUEFSQU0sIFwKKwkJY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLCBcCisJCWFjdGlvbl8jI25hbWUqIGFwIFVOVVNFRF9QQVJBTSkKKworICAgICAgICAgICAgICAgICAgICAgICAgQUNUUyhwcmludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDVFMobmFtZSwgIGNvbnN0IGNoYXIgKnBhdHRlcm47IGJvb2wgaW5hbWU7KQorSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgQUNUUyhwYXRoLCAgY29uc3QgY2hhciAqcGF0dGVybjsgYm9vbCBpcGF0aDspKQorSUZfRkVBVFVSRV9GSU5EX1JFR0VYKCAgQUNUUyhyZWdleCwgcmVnZXhfdCBjb21waWxlZF9wYXR0ZXJuOykpCitJRl9GRUFUVVJFX0ZJTkRfUFJJTlQwKCBBQ1RTKHByaW50MCkpCitJRl9GRUFUVVJFX0ZJTkRfVFlQRSggICBBQ1RTKHR5cGUsICBpbnQgdHlwZV9tYXNrOykpCitJRl9GRUFUVVJFX0ZJTkRfUEVSTSggICBBQ1RTKHBlcm0sICBjaGFyIHBlcm1fY2hhcjsgbW9kZV90IHBlcm1fbWFzazspKQorSUZfRkVBVFVSRV9GSU5EX01USU1FKCAgQUNUUyhtdGltZSwgY2hhciBtdGltZV9jaGFyOyB1bnNpZ25lZCBtdGltZV9kYXlzOykpCitJRl9GRUFUVVJFX0ZJTkRfTU1JTiggICBBQ1RTKG1taW4sICBjaGFyIG1taW5fY2hhcjsgdW5zaWduZWQgbW1pbl9taW5zOykpCitJRl9GRUFUVVJFX0ZJTkRfTkVXRVIoICBBQ1RTKG5ld2VyLCB0aW1lX3QgbmV3ZXJfbXRpbWU7KSkKK0lGX0ZFQVRVUkVfRklORF9JTlVNKCAgIEFDVFMoaW51bSwgIGlub190IGlub2RlX251bTspKQorSUZfRkVBVFVSRV9GSU5EX1VTRVIoICAgQUNUUyh1c2VyLCAgdWlkX3QgdWlkOykpCitJRl9GRUFUVVJFX0ZJTkRfU0laRSggICBBQ1RTKHNpemUsICBjaGFyIHNpemVfY2hhcjsgb2ZmX3Qgc2l6ZTspKQorSUZfRkVBVFVSRV9GSU5EX0NPTlRFWFQoQUNUUyhjb250ZXh0LCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dDspKQorSUZfRkVBVFVSRV9GSU5EX1BBUkVOKCAgQUNUUyhwYXJlbiwgYWN0aW9uICoqKnN1YmV4cHI7KSkKK0lGX0ZFQVRVUkVfRklORF9QUlVORSggIEFDVFMocHJ1bmUpKQorSUZfRkVBVFVSRV9GSU5EX0RFTEVURSggQUNUUyhkZWxldGUpKQorSUZfRkVBVFVSRV9GSU5EX0VYRUMoICAgQUNUUyhleGVjLCAgY2hhciAqKmV4ZWNfYXJndjsgdW5zaWduZWQgKnN1YnN0X2NvdW50OyBpbnQgZXhlY19hcmdjOykpCitJRl9GRUFUVVJFX0ZJTkRfR1JPVVAoICBBQ1RTKGdyb3VwLCBnaWRfdCBnaWQ7KSkKK0lGX0ZFQVRVUkVfRklORF9MSU5LUyggIEFDVFMobGlua3MsIGNoYXIgbGlua3NfY2hhcjsgaW50IGxpbmtzX2NvdW50OykpCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlJRl9GRUFUVVJFX0ZJTkRfWERFVihkZXZfdCAqeGRldl9kZXY7KQorCUlGX0ZFQVRVUkVfRklORF9YREVWKGludCB4ZGV2X2NvdW50OykKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01BWERFUFRICisJaW50IG1pbm1heGRlcHRoWzJdOworI2VuZGlmCisJYWN0aW9uICoqKmFjdGlvbnM7CisJc21hbGxpbnQgbmVlZF9wcmludDsKKwlzbWFsbGludCB4ZGV2X29uOworCXJlY3Vyc2VfZmxhZ3NfdCByZWN1cnNlX2ZsYWdzOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJc3RydWN0IEdfc2l6ZWNoZWNrIHsgXAorCQljaGFyIEdfc2l6ZWNoZWNrW3NpemVvZihHKSA+IENPTU1PTl9CVUZTSVpFID8gLTEgOiAxXTsgXAorCX07IFwKKwkvKiB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlY2F1c2Ugb2YgTk9FWEVDICovIFwKKwltZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IFwKKwlJRl9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoRy5taW5tYXhkZXB0aFsxXSA9IElOVF9NQVg7KSBcCisJRy5uZWVkX3ByaW50ID0gMTsgXAorCUcucmVjdXJzZV9mbGFncyA9IEFDVElPTl9SRUNVUlNFOyBcCit9IHdoaWxlICgwKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9FWEVDCitzdGF0aWMgdW5zaWduZWQgY291bnRfc3Vic3QoY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGNvdW50ID0gMDsKKwl3aGlsZSAoKHN0ciA9IHN0cnN0cihzdHIsICJ7fSIpKSAhPSBOVUxMKSB7CisJCWNvdW50Kys7CisJCXN0cisrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIGNoYXIqIHN1YnN0KGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQoreworCWNoYXIgKmJ1ZiwgKmRzdCwgKmVuZDsKKwlzaXplX3QgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisJLyogd2UgcmVwbGFjZSBlYWNoICd7fScgd2l0aCBmaWxlbmFtZTogZ3Jvd3RoIGJ5IHN0cmxlbi0yICovCisJYnVmID0gZHN0ID0geG1hbGxvYyhzdHJsZW4oc3JjKSArIGNvdW50KihmbGVuLTIpICsgMSk7CisJd2hpbGUgKChlbmQgPSBzdHJzdHIoc3JjLCAie30iKSkpIHsKKwkJbWVtY3B5KGRzdCwgc3JjLCBlbmQgLSBzcmMpOworCQlkc3QgKz0gZW5kIC0gc3JjOworCQlzcmMgPSBlbmQgKyAyOworCQltZW1jcHkoZHN0LCBmaWxlbmFtZSwgZmxlbik7CisJCWRzdCArPSBmbGVuOworCX0KKwlzdHJjcHkoZHN0LCBzcmMpOworCXJldHVybiBidWY7Cit9CisjZW5kaWYKKworLyogUmV0dXJuIHZhbHVlcyBvZiBBQ1RGcyAoJ2FjdGlvbiBmdW5jdGlvbnMnKSBhcmUgYSBiaXQgbWFzazoKKyAqIGJpdCAxPTE6IHBydW5lICh1c2UgU0tJUCBjb25zdGFudCBmb3Igc2V0dGluZyBpdCkKKyAqIGJpdCAwPTE6IG1hdGNoZWQgc3VjY2Vzc2Z1bGx5IChUUlVFKQorICovCisKK3N0YXRpYyBpbnQgZXhlY19hY3Rpb25zKGFjdGlvbiAqKiphcHBwLCBjb25zdCBjaGFyICpmaWxlTmFtZSwgY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYpCit7CisJaW50IGN1cl9ncm91cDsKKwlpbnQgY3VyX2FjdGlvbjsKKwlpbnQgcmMgPSAwOworCWFjdGlvbiAqKmFwcCwgKmFwOworCisJLyogImFjdGlvbiBncm91cCIgaXMgYSBzZXQgb2YgYWN0aW9ucyBBTkRlZCB0b2dldGhlci4KKwkgKiBncm91cHMgYXJlIE9SZWQgdG9nZXRoZXIuCisJICogV2Ugc2ltcGx5IGV2YWx1YXRlIGVhY2ggZ3JvdXAgdW50aWwgd2UgZmluZCBvbmUgaW4gd2hpY2ggYWxsIGFjdGlvbnMKKwkgKiBzdWNjZWVkLiAqLworCisJLyogLXBydW5lIGlzIHNwZWNpYWw6IGlmIGl0IGlzIGVuY291bnRlcmVkLCB0aGVuIHdlIHdvbid0CisJICogZGVzY2VuZCBpbnRvIGN1cnJlbnQgZGlyZWN0b3J5LiBJdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyCisJICogYWN0aW9uIGdyb3VwIChpbiB3aGljaCAtcHJ1bmUgc2l0cykgd2lsbCBzdWNjZWVkIG9yIG5vdDoKKwkgKiBmaW5kICogLXBydW5lIC1uYW1lICdmKicgLW8gLW5hbWUgJ20qJyAtLSBwcnVuZXMgZXZlcnkgZGlyCisJICogZmluZCAqIC1uYW1lICdmKicgLW8gLXBydW5lIC1uYW1lICdtKicgLS0gcHJ1bmVzIGFsbCBkaXJzCisJICogICAgIG5vdCBzdGFydGluZyB3aXRoICdmJyAqLworCisJLyogV2UgaW52ZXJ0IFRSVUUgYml0IChiaXQgMCkuIE5vdyAxIHRoZXJlIG1lYW5zICdmYWlsdXJlJy4KKwkgKiBhbmQgYml0d2lzZSBPUiBpbiAicmMgfD0gVFJVRSBeIGFwLT5mKCkiIHdpbGw6CisJICogKDEpIG1ha2UgU0tJUCAoLXBydW5lKSBiaXQgc3RpY2s7IGFuZCAoMikgZGV0ZWN0ICdmYWlsdXJlJy4KKwkgKiBPbiByZXR1cm4sIGJpdCBpcyByZXN0b3JlZC4gICovCisKKwljdXJfZ3JvdXAgPSAtMTsKKwl3aGlsZSAoKGFwcCA9IGFwcHBbKytjdXJfZ3JvdXBdKSAhPSBOVUxMKSB7CisJCXJjICY9IH5UUlVFOyAvKiAnc3VjY2Vzcycgc28gZmFyLCBjbGVhciBUUlVFIGJpdCAqLworCQljdXJfYWN0aW9uID0gLTE7CisJCXdoaWxlICgxKSB7CisJCQlhcCA9IGFwcFsrK2N1cl9hY3Rpb25dOworCQkJaWYgKCFhcCkgLyogYWxsIGFjdGlvbnMgaW4gZ3JvdXAgd2VyZSBzdWNjZXNzZnVsICovCisJCQkJcmV0dXJuIHJjIF4gVFJVRTsgLyogcmVzdG9yZSBUUlVFIGJpdCAqLworCQkJcmMgfD0gVFJVRSBeIGFwLT5mKGZpbGVOYW1lLCBzdGF0YnVmLCBhcCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9OT1QKKwkJCWlmIChhcC0+aW52ZXJ0KSByYyBePSBUUlVFOworI2VuZGlmCisJCQlkYmcoImdycCAlZCBhY3Rpb24gJWQgcmM6MHgleCIsIGN1cl9ncm91cCwgY3VyX2FjdGlvbiwgcmMpOworCQkJaWYgKHJjICYgVFJVRSkgLyogY3VycmVudCBncm91cCBmYWlsZWQsIHRyeSBuZXh0ICovCisJCQkJYnJlYWs7CisJCX0KKwl9CisJZGJnKCJyZXR1cm5pbmc6MHgleCIsIHJjIF4gVFJVRSk7CisJcmV0dXJuIHJjIF4gVFJVRTsgLyogcmVzdG9yZSBUUlVFIGJpdCAqLworfQorCisKKyNpZiAhRk5NX0NBU0VGT0xECitzdGF0aWMgY2hhciAqc3RyY3B5X3VwY2FzZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICpkID0gZHN0OworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGNoYXIgY2ggPSAqc3JjKys7CisJCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKQorCQkJY2ggLT0gKCdhJyAtICdBJyk7CisJCSpkKysgPSBjaDsKKwkJaWYgKGNoID09ICdcMCcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGRzdDsKK30KKyNlbmRpZgorCitBQ1RGKG5hbWUpCit7CisJY29uc3QgY2hhciAqdG1wID0gYmJfYmFzZW5hbWUoZmlsZU5hbWUpOworCWlmICh0bXAgIT0gZmlsZU5hbWUgJiYgKnRtcCA9PSAnXDAnKSB7CisJCS8qICJmb28vYmFyLyIuIE9oIG5vLi4uIGdvIGJhY2sgdG8gJ2InICovCisJCXRtcC0tOworCQl3aGlsZSAodG1wICE9IGZpbGVOYW1lICYmICotLXRtcCAhPSAnLycpCisJCQljb250aW51ZTsKKwkJaWYgKCp0bXAgPT0gJy8nKQorCQkJdG1wKys7CisJfQorCS8qIFdhcyB1c2luZyBGTk1fUEVSSU9EIGZsYWcgdG9vLAorCSAqIGJ1dCBzb21ld2hlcmUgYmV0d2VlbiA0LjEuMjAgYW5kIDQuNC4wIEdOVSBmaW5kIHN0b3BwZWQgdXNpbmcgaXQuCisJICogZmluZCAtbmFtZSAnKmZvbycgc2hvdWxkIG1hdGNoIC5mb28gdG9vOgorCSAqLworI2lmIEZOTV9DQVNFRk9MRAorCXJldHVybiBmbm1hdGNoKGFwLT5wYXR0ZXJuLCB0bXAsIChhcC0+aW5hbWUgPyBGTk1fQ0FTRUZPTEQgOiAwKSkgPT0gMDsKKyNlbHNlCisJaWYgKGFwLT5pbmFtZSkKKwkJdG1wID0gc3RyY3B5X3VwY2FzZShhbGxvY2Eoc3RybGVuKHRtcCkgKyAxKSwgdG1wKTsKKwlyZXR1cm4gZm5tYXRjaChhcC0+cGF0dGVybiwgdG1wLCAwKSA9PSAwOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BBVEgKK0FDVEYocGF0aCkKK3sKKyMgaWYgRk5NX0NBU0VGT0xECisJcmV0dXJuIGZubWF0Y2goYXAtPnBhdHRlcm4sIGZpbGVOYW1lLCAoYXAtPmlwYXRoID8gRk5NX0NBU0VGT0xEIDogMCkpID09IDA7CisjIGVsc2UKKwlpZiAoYXAtPmlwYXRoKQorCQlmaWxlTmFtZSA9IHN0cmNweV91cGNhc2UoYWxsb2NhKHN0cmxlbihmaWxlTmFtZSkgKyAxKSwgZmlsZU5hbWUpOworCXJldHVybiBmbm1hdGNoKGFwLT5wYXR0ZXJuLCBmaWxlTmFtZSwgMCkgPT0gMDsKKyMgZW5kaWYKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUkVHRVgKK0FDVEYocmVnZXgpCit7CisJcmVnbWF0Y2hfdCBtYXRjaDsKKwlpZiAocmVnZXhlYygmYXAtPmNvbXBpbGVkX3BhdHRlcm4sIGZpbGVOYW1lLCAxLCAmbWF0Y2gsIDAgLyplZmxhZ3MqLykpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCWlmIChtYXRjaC5ybV9zbykKKwkJcmV0dXJuIDA7IC8qIG1hdGNoIGRvZXNuJ3Qgc3RhcnQgYXQgcG9zIDAgKi8KKwlpZiAoZmlsZU5hbWVbbWF0Y2gucm1fZW9dKQorCQlyZXR1cm4gMDsgLyogbWF0Y2ggZG9lc24ndCBlbmQgZXhhY3RseSBhdCBlbmQgb2YgcGF0aG5hbWUgKi8KKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfVFlQRQorQUNURih0eXBlKQoreworCXJldHVybiAoKHN0YXRidWYtPnN0X21vZGUgJiBTX0lGTVQpID09IGFwLT50eXBlX21hc2spOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QRVJNCitBQ1RGKHBlcm0pCit7CisJLyogLXBlcm0gK21vZGU6IGF0IGxlYXN0IG9uZSBvZiBwZXJtX21hc2sgYml0cyBhcmUgc2V0ICovCisJaWYgKGFwLT5wZXJtX2NoYXIgPT0gJysnKQorCQlyZXR1cm4gKHN0YXRidWYtPnN0X21vZGUgJiBhcC0+cGVybV9tYXNrKSAhPSAwOworCS8qIC1wZXJtIC1tb2RlOiBhbGwgb2YgcGVybV9tYXNrIGFyZSBzZXQgKi8KKwlpZiAoYXAtPnBlcm1fY2hhciA9PSAnLScpCisJCXJldHVybiAoc3RhdGJ1Zi0+c3RfbW9kZSAmIGFwLT5wZXJtX21hc2spID09IGFwLT5wZXJtX21hc2s7CisJLyogLXBlcm0gbW9kZTogZmlsZSBtb2RlIG11c3QgbWF0Y2ggcGVybV9tYXNrICovCisJcmV0dXJuIChzdGF0YnVmLT5zdF9tb2RlICYgMDc3NzcpID09IGFwLT5wZXJtX21hc2s7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01USU1FCitBQ1RGKG10aW1lKQoreworCXRpbWVfdCBmaWxlX2FnZSA9IHRpbWUoTlVMTCkgLSBzdGF0YnVmLT5zdF9tdGltZTsKKwl0aW1lX3QgbXRpbWVfc2VjcyA9IGFwLT5tdGltZV9kYXlzICogMjQqNjAqNjA7CisJaWYgKGFwLT5tdGltZV9jaGFyID09ICcrJykKKwkJcmV0dXJuIGZpbGVfYWdlID49IG10aW1lX3NlY3MgKyAyNCo2MCo2MDsKKwlpZiAoYXAtPm10aW1lX2NoYXIgPT0gJy0nKQorCQlyZXR1cm4gZmlsZV9hZ2UgPCBtdGltZV9zZWNzOworCS8qIGp1c3QgbnVtZXJpYyBtdGltZSAqLworCXJldHVybiBmaWxlX2FnZSA+PSBtdGltZV9zZWNzICYmIGZpbGVfYWdlIDwgKG10aW1lX3NlY3MgKyAyNCo2MCo2MCk7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01NSU4KK0FDVEYobW1pbikKK3sKKwl0aW1lX3QgZmlsZV9hZ2UgPSB0aW1lKE5VTEwpIC0gc3RhdGJ1Zi0+c3RfbXRpbWU7CisJdGltZV90IG1taW5fc2VjcyA9IGFwLT5tbWluX21pbnMgKiA2MDsKKwlpZiAoYXAtPm1taW5fY2hhciA9PSAnKycpCisJCXJldHVybiBmaWxlX2FnZSA+PSBtbWluX3NlY3MgKyA2MDsKKwlpZiAoYXAtPm1taW5fY2hhciA9PSAnLScpCisJCXJldHVybiBmaWxlX2FnZSA8IG1taW5fc2VjczsKKwkvKiBqdXN0IG51bWVyaWMgbW1pbiAqLworCXJldHVybiBmaWxlX2FnZSA+PSBtbWluX3NlY3MgJiYgZmlsZV9hZ2UgPCAobW1pbl9zZWNzICsgNjApOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9ORVdFUgorQUNURihuZXdlcikKK3sKKwlyZXR1cm4gKGFwLT5uZXdlcl9tdGltZSA8IHN0YXRidWYtPnN0X210aW1lKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfSU5VTQorQUNURihpbnVtKQoreworCXJldHVybiAoc3RhdGJ1Zi0+c3RfaW5vID09IGFwLT5pbm9kZV9udW0pOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9FWEVDCitBQ1RGKGV4ZWMpCit7CisJaW50IGksIHJjOworI2lmIEVOQUJMRV9VU0VfUE9SVEFCTEVfQ09ERQorCWNoYXIgKiphcmd2ID0gYWxsb2NhKHNpemVvZihjaGFyKikgKiAoYXAtPmV4ZWNfYXJnYyArIDEpKTsKKyNlbHNlIC8qIGdjYyA0LjMuMSBnZW5lcmF0ZXMgc21hbGxlciBjb2RlOiAqLworCWNoYXIgKmFyZ3ZbYXAtPmV4ZWNfYXJnYyArIDFdOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGFwLT5leGVjX2FyZ2M7IGkrKykKKwkJYXJndltpXSA9IHN1YnN0KGFwLT5leGVjX2FyZ3ZbaV0sIGFwLT5zdWJzdF9jb3VudFtpXSwgZmlsZU5hbWUpOworCWFyZ3ZbaV0gPSBOVUxMOyAvKiB0ZXJtaW5hdGUgdGhlIGxpc3QgKi8KKworCXJjID0gc3Bhd25fYW5kX3dhaXQoYXJndik7CisJaWYgKHJjIDwgMCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coYXJndlswXSk7CisKKwlpID0gMDsKKwl3aGlsZSAoYXJndltpXSkKKwkJZnJlZShhcmd2W2krK10pOworCXJldHVybiByYyA9PSAwOyAvKiByZXR1cm4gMSBpZiBleGl0Y29kZSAwICovCit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1VTRVIKK0FDVEYodXNlcikKK3sKKwlyZXR1cm4gKHN0YXRidWYtPnN0X3VpZCA9PSBhcC0+dWlkKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfR1JPVVAKK0FDVEYoZ3JvdXApCit7CisJcmV0dXJuIChzdGF0YnVmLT5zdF9naWQgPT0gYXAtPmdpZCk7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BSSU5UMAorQUNURihwcmludDApCit7CisJcHJpbnRmKCIlcyVjIiwgZmlsZU5hbWUsICdcMCcpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmCitBQ1RGKHByaW50KQoreworCXB1dHMoZmlsZU5hbWUpOworCXJldHVybiBUUlVFOworfQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFSRU4KK0FDVEYocGFyZW4pCit7CisJcmV0dXJuIGV4ZWNfYWN0aW9ucyhhcC0+c3ViZXhwciwgZmlsZU5hbWUsIHN0YXRidWYpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9TSVpFCitBQ1RGKHNpemUpCit7CisJaWYgKGFwLT5zaXplX2NoYXIgPT0gJysnKQorCQlyZXR1cm4gc3RhdGJ1Zi0+c3Rfc2l6ZSA+IGFwLT5zaXplOworCWlmIChhcC0+c2l6ZV9jaGFyID09ICctJykKKwkJcmV0dXJuIHN0YXRidWYtPnN0X3NpemUgPCBhcC0+c2l6ZTsKKwlyZXR1cm4gc3RhdGJ1Zi0+c3Rfc2l6ZSA9PSBhcC0+c2l6ZTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUFJVTkUKKy8qCisgKiAtcHJ1bmU6IGlmIC1kZXB0aCBpcyBub3QgZ2l2ZW4sIHJldHVybiB0cnVlIGFuZCBkbyBub3QgZGVzY2VuZAorICogY3VycmVudCBkaXI7IGlmIC1kZXB0aCBpcyBnaXZlbiwgcmV0dXJuIGZhbHNlIHdpdGggbm8gZWZmZWN0LgorICogRXhhbXBsZToKKyAqIGZpbmQgZGlyIC1uYW1lICdhc20tKicgLXBydW5lIC1vIC1uYW1lICcqLltjaFNdJyAtcHJpbnQKKyAqLworQUNURihwcnVuZSkKK3sKKwlyZXR1cm4gU0tJUCArIFRSVUU7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0RFTEVURQorQUNURihkZWxldGUpCit7CisJaW50IHJjOworCWlmIChTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCXJjID0gcm1kaXIoZmlsZU5hbWUpOworCX0gZWxzZSB7CisJCXJjID0gdW5saW5rKGZpbGVOYW1lKTsKKwl9CisJaWYgKHJjIDwgMCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZU5hbWUpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9DT05URVhUCitBQ1RGKGNvbnRleHQpCit7CisJc2VjdXJpdHlfY29udGV4dF90IGNvbjsKKwlpbnQgcmM7CisKKwlpZiAoRy5yZWN1cnNlX2ZsYWdzICYgQUNUSU9OX0ZPTExPV0xJTktTKSB7CisJCXJjID0gZ2V0ZmlsZWNvbihmaWxlTmFtZSwgJmNvbik7CisJfSBlbHNlIHsKKwkJcmMgPSBsZ2V0ZmlsZWNvbihmaWxlTmFtZSwgJmNvbik7CisJfQorCWlmIChyYyA8IDApCisJCXJldHVybiBGQUxTRTsKKwlyYyA9IHN0cmNtcChhcC0+Y29udGV4dCwgY29uKTsKKwlmcmVlY29uKGNvbik7CisJcmV0dXJuIHJjID09IDA7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0xJTktTCitBQ1RGKGxpbmtzKQoreworCXN3aXRjaChhcC0+bGlua3NfY2hhcikgeworCWNhc2UgJy0nIDogcmV0dXJuIChzdGF0YnVmLT5zdF9ubGluayA8ICBhcC0+bGlua3NfY291bnQpOworCWNhc2UgJysnIDogcmV0dXJuIChzdGF0YnVmLT5zdF9ubGluayA+ICBhcC0+bGlua3NfY291bnQpOworCWRlZmF1bHQ6ICAgcmV0dXJuIChzdGF0YnVmLT5zdF9ubGluayA9PSBhcC0+bGlua3NfY291bnQpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlQWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggSUZfTk9UX0ZFQVRVUkVfRklORF9NQVhERVBUSChVTlVTRURfUEFSQU0pKQoreworCWludCByOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NQVhERVBUSAorCWlmIChkZXB0aCA8IEcubWlubWF4ZGVwdGhbMF0pCisJCXJldHVybiBUUlVFOyAvKiBza2lwIHRoaXMsIGNvbnRpbnVlIHJlY3Vyc2luZyAqLworCWlmIChkZXB0aCA+IEcubWlubWF4ZGVwdGhbMV0pCisJCXJldHVybiBTS0lQOyAvKiBzdG9wIHJlY3Vyc2luZyAqLworI2VuZGlmCisKKwlyID0gZXhlY19hY3Rpb25zKEcuYWN0aW9ucywgZmlsZU5hbWUsIHN0YXRidWYpOworCS8qIEhhZCBubyBleHBsaWNpdCAtcHJpbnRbMF0gb3IgLWV4ZWM/IHRoZW4gcHJpbnQgKi8KKwlpZiAoKHIgJiBUUlVFKSAmJiBHLm5lZWRfcHJpbnQpCisJCXB1dHMoZmlsZU5hbWUpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NQVhERVBUSAorCWlmIChTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWlmIChkZXB0aCA9PSBHLm1pbm1heGRlcHRoWzFdKQorCQkJcmV0dXJuIFNLSVA7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9YREVWCisJLyogLXhkZXYgc3RvcHMgb24gbW91bnRwb2ludHMsIGJ1dCBBRlRFUiBtb3VudHBvaXQgaXRzZWxmCisJICogaXMgcHJvY2Vzc2VkIGFzIHVzdWFsICovCisJaWYgKFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJaWYgKEcueGRldl9jb3VudCkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgRy54ZGV2X2NvdW50OyBpKyspIHsKKwkJCQlpZiAoRy54ZGV2X2RldltpXSA9PSBzdGF0YnVmLT5zdF9kZXYpCisJCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCQlyZXR1cm4gU0tJUDsKKyBmb3VuZDogOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBDYW5ub3QgcmV0dXJuIDA6IG91ciBjYWxsZXIsIHJlY3Vyc2l2ZV9hY3Rpb24oKSwKKwkgKiB3aWxsIHBlcnJvcigpIGFuZCBza2lwIGRpcnMgKGlmIGNhbGxlZCBvbiBkaXIpICovCisJcmV0dXJuIChyICYgU0tJUCkgPyBTS0lQIDogVFJVRTsKK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9UWVBFCitzdGF0aWMgaW50IGZpbmRfdHlwZShjb25zdCBjaGFyICp0eXBlKQoreworCWludCBtYXNrID0gMDsKKworCWlmICgqdHlwZSA9PSAnYicpCisJCW1hc2sgPSBTX0lGQkxLOworCWVsc2UgaWYgKCp0eXBlID09ICdjJykKKwkJbWFzayA9IFNfSUZDSFI7CisJZWxzZSBpZiAoKnR5cGUgPT0gJ2QnKQorCQltYXNrID0gU19JRkRJUjsKKwllbHNlIGlmICgqdHlwZSA9PSAncCcpCisJCW1hc2sgPSBTX0lGSUZPOworCWVsc2UgaWYgKCp0eXBlID09ICdmJykKKwkJbWFzayA9IFNfSUZSRUc7CisJZWxzZSBpZiAoKnR5cGUgPT0gJ2wnKQorCQltYXNrID0gU19JRkxOSzsKKwllbHNlIGlmICgqdHlwZSA9PSAncycpCisJCW1hc2sgPSBTX0lGU09DSzsKKworCWlmIChtYXNrID09IDAgfHwgdHlwZVsxXSAhPSAnXDAnKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsIHR5cGUsICItdHlwZSIpOworCisJcmV0dXJuIG1hc2s7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEVSTSBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfRklORF9NVElNRSB8fCBFTkFCTEVfRkVBVFVSRV9GSU5EX01NSU4gXAorIHx8IEVOQUJMRV9GRUFUVVJFX0ZJTkRfU0laRSAgfHwgRU5BQkxFX0ZFQVRVUkVfRklORF9MSU5LUworc3RhdGljIGNvbnN0IGNoYXIqIHBsdXNfbWludXNfbnVtKGNvbnN0IGNoYXIqIHN0cikKK3sKKwlpZiAoKnN0ciA9PSAnLScgfHwgKnN0ciA9PSAnKycpCisJCXN0cisrOworCXJldHVybiBzdHI7Cit9CisjZW5kaWYKKworc3RhdGljIGFjdGlvbioqKiBwYXJzZV9wYXJhbXMoY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0ZPTExPVyAgICAgLAorCUlGX0ZFQVRVUkVfRklORF9YREVWKCAgIE9QVF9YREVWICAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0RFUFRIKCAgT1BUX0RFUFRIICAgICAgLCkKKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX2EgICAgICAgICAsCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9vICAgICAgICAgLAorCUlGX0ZFQVRVUkVfRklORF9OT1QoCVBBUk1fY2hhcl9ub3QgICwpCisjaWYgRU5BQkxFX0RFU0tUT1AKKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX2FuZCAgICAgICAsCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9vciAgICAgICAgLAorCUlGX0ZFQVRVUkVfRklORF9OT1QoICAgIFBBUk1fbm90ICAgICAgICwpCisjZW5kaWYKKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX3ByaW50ICAgICAsCisJSUZfRkVBVFVSRV9GSU5EX1BSSU5UMCggUEFSTV9wcmludDAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfUFJVTkUoICBQQVJNX3BydW5lICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9ERUxFVEUoIFBBUk1fZGVsZXRlICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0VYRUMoICAgUEFSTV9leGVjICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfUEFSRU4oICBQQVJNX2NoYXJfYnJhY2UsKQorCS8qIEFsbCBvcHRpb25zL2FjdGlvbnMgc3RhcnRpbmcgZnJvbSBoZXJlIHJlcXVpcmUgYXJndW1lbnQgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICBQQVJNX25hbWUgICAgICAsCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9pbmFtZSAgICAgLAorCUlGX0ZFQVRVUkVfRklORF9QQVRIKCAgIFBBUk1fcGF0aCAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgUEFSTV9pcGF0aCAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfUkVHRVgoICBQQVJNX3JlZ2V4ICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9UWVBFKCAgIFBBUk1fdHlwZSAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1BFUk0oICAgUEFSTV9wZXJtICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfTVRJTUUoICBQQVJNX210aW1lICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9NTUlOKCAgIFBBUk1fbW1pbiAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX05FV0VSKCAgUEFSTV9uZXdlciAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfSU5VTSggICBQQVJNX2ludW0gICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9VU0VSKCAgIFBBUk1fdXNlciAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0dST1VQKCAgUEFSTV9ncm91cCAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfU0laRSggICBQQVJNX3NpemUgICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9DT05URVhUKFBBUk1fY29udGV4dCAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0xJTktTKCAgUEFSTV9saW5rcyAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoT1BUX01JTkRFUFRILE9QVF9NQVhERVBUSCwpCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyIHBhcmFtc1tdIEFMSUdOMSA9CisJICAgICAgICAgICAgICAgICAgICAgICAgIi1mb2xsb3dcMCIKKwlJRl9GRUFUVVJFX0ZJTkRfWERFViggICAiLXhkZXZcMCIgICAgICAgICAgICAgICAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfREVQVEgoICAiLWRlcHRoXDAiICAgICAgICAgICAgICAgICkKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLWFcMCIKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLW9cMCIKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCAgICAiIVwwIiAgICAgICApCisjaWYgRU5BQkxFX0RFU0tUT1AKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLWFuZFwwIgorCSAgICAgICAgICAgICAgICAgICAgICAgICItb3JcMCIKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKAkiLW5vdFwwIiAgICApCisjZW5kaWYKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLXByaW50XDAiCisJSUZfRkVBVFVSRV9GSU5EX1BSSU5UMCggIi1wcmludDBcMCIgKQorCUlGX0ZFQVRVUkVfRklORF9QUlVORSggICItcHJ1bmVcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfREVMRVRFKCAiLWRlbGV0ZVwwIiApCisJSUZfRkVBVFVSRV9GSU5EX0VYRUMoICAgIi1leGVjXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9QQVJFTiggICIoXDAiICAgICAgICkKKwkvKiBBbGwgb3B0aW9ucy9hY3Rpb25zIHN0YXJ0aW5nIGZyb20gaGVyZSByZXF1aXJlIGFyZ3VtZW50ICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICItbmFtZVwwIgorCSAgICAgICAgICAgICAgICAgICAgICAgICAiLWluYW1lXDAiCisJSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgIi1wYXRoXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9QQVRIKCAgICItaXBhdGhcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfUkVHRVgoICAiLXJlZ2V4XDAiICApCisJSUZfRkVBVFVSRV9GSU5EX1RZUEUoICAgIi10eXBlXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9QRVJNKCAgICItcGVybVwwIiAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfTVRJTUUoICAiLW10aW1lXDAiICApCisJSUZfRkVBVFVSRV9GSU5EX01NSU4oICAgIi1tbWluXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9ORVdFUiggICItbmV3ZXJcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfSU5VTSggICAiLWludW1cMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX1VTRVIoICAgIi11c2VyXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9HUk9VUCggICItZ3JvdXBcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfU0laRSggICAiLXNpemVcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX0NPTlRFWFQoIi1jb250ZXh0XDAiKQorCUlGX0ZFQVRVUkVfRklORF9MSU5LUyggICItbGlua3NcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoIi1taW5kZXB0aFwwIiItbWF4ZGVwdGhcMCIpCisJOworCisJYWN0aW9uKioqIGFwcHA7CisJdW5zaWduZWQgY3VyX2dyb3VwID0gMDsKKwl1bnNpZ25lZCBjdXJfYWN0aW9uID0gMDsKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCBib29sIGludmVydF9mbGFnID0gMDsgKQorCisJLyogVGhpcyBpcyB0aGUgb25seSBwbGFjZSBpbiBidXN5Ym94IHdoZXJlIHdlIHVzZSBuZXN0ZWQgZnVuY3Rpb24uCisJICogU28gZmFyIG1vcmUgc3RhbmRhcmQgYWx0ZXJuYXRpdmVzIHdlcmUgYmlnZ2VyLiAqLworCS8qIEF1dG8gZGVjbCBzdXBwcmVzc2VzICJmdW5jIHdpdGhvdXQgYSBwcm90b3R5cGUiIHdhcm5pbmc6ICovCisJYXV0byBhY3Rpb24qIGFsbG9jX2FjdGlvbihpbnQgc2l6ZW9mX3N0cnVjdCwgYWN0aW9uX2ZwIGYpOworCWFjdGlvbiogYWxsb2NfYWN0aW9uKGludCBzaXplb2Zfc3RydWN0LCBhY3Rpb25fZnAgZikKKwl7CisJCWFjdGlvbiAqYXA7CisJCWFwcHBbY3VyX2dyb3VwXSA9IHhyZWFsbG9jKGFwcHBbY3VyX2dyb3VwXSwgKGN1cl9hY3Rpb24rMikgKiBzaXplb2YoKmFwcHApKTsKKwkJYXBwcFtjdXJfZ3JvdXBdW2N1cl9hY3Rpb24rK10gPSBhcCA9IHh6YWxsb2Moc2l6ZW9mX3N0cnVjdCk7CisJCWFwcHBbY3VyX2dyb3VwXVtjdXJfYWN0aW9uXSA9IE5VTEw7CisJCWFwLT5mID0gZjsKKwkJSUZfRkVBVFVSRV9GSU5EX05PVCggYXAtPmludmVydCA9IGludmVydF9mbGFnOyApCisJCUlGX0ZFQVRVUkVfRklORF9OT1QoIGludmVydF9mbGFnID0gMDsgKQorCQlyZXR1cm4gYXA7CisJfQorCisjZGVmaW5lIEFMTE9DX0FDVElPTihuYW1lKSAoYWN0aW9uXyMjbmFtZSopYWxsb2NfYWN0aW9uKHNpemVvZihhY3Rpb25fIyNuYW1lKSwgKGFjdGlvbl9mcCkgZnVuY18jI25hbWUpCisKKwlhcHBwID0geHphbGxvYygyICogc2l6ZW9mKGFwcHBbMF0pKTsgLyogYXBwcFswXSxbMV0gPT0gTlVMTCAqLworCisJd2hpbGUgKCphcmd2KSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMF07CisJCWludCBwYXJtID0gaW5kZXhfaW5fc3RyaW5ncyhwYXJhbXMsIGFyZyk7CisJCWNvbnN0IGNoYXIgKmFyZzEgPSBhcmd2WzFdOworCisJCWRiZygiYXJnOiclcycgYXJnMTonJXMnIHBhcm06JWQgUEFSTV90eXBlOiVkIiwgYXJnLCBhcmcxLCBwYXJtLCBQQVJNX3R5cGUpOworCisJCWlmIChwYXJtID49IFBBUk1fbmFtZSkgeworCQkJLyogQWxsIG9wdGlvbnMvYWN0aW9ucyBzdGFydGluZyBmcm9tIC1uYW1lIHJlcXVpcmUgYXJndW1lbnQgKi8KKwkJCWlmICghYXJnMSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCBhcmcpOworCQkJYXJndisrOworCQl9CisKKwkJLyogV2UgY2FuIHVzZSBiaWcgc3dpdGNoKCkgaGVyZSwgYnV0IG9uIGkzODYKKwkJICogaXQgZG9lc24ndCBnaXZlIHNtYWxsZXIgY29kZS4gT3RoZXIgYXJjaGVzPyAqLworCisvKiBPcHRpb25zIGFsd2F5cyByZXR1cm4gdHJ1ZS4gVGhleSBhbHdheXMgdGFrZSBlZmZlY3QKKyAqIHJhdGhlciB0aGFuIGJlaW5nIHByb2Nlc3NlZCBvbmx5IHdoZW4gdGhlaXIgcGxhY2UgaW4gdGhlCisgKiBleHByZXNzaW9uIGlzIHJlYWNoZWQuCisgKi8KKwkJLyogT3B0aW9ucyAqLworCQlpZiAocGFybSA9PSBPUFRfRk9MTE9XKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYmcoImZvbGxvdyBlbmFibGVkOiAlZCIsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEcucmVjdXJzZV9mbGFncyB8PSBBQ1RJT05fRk9MTE9XTElOS1MgfCBBQ1RJT05fREFOR0xJTkdfT0s7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1hERVYKKwkJZWxzZSBpZiAocGFybSA9PSBPUFRfWERFVikgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCUcueGRldl9vbiA9IDE7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTUFYREVQVEgKKwkJZWxzZSBpZiAocGFybSA9PSBPUFRfTUlOREVQVEggfHwgcGFybSA9PSBPUFRfTUlOREVQVEggKyAxKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5taW5tYXhkZXB0aFtwYXJtIC0gT1BUX01JTkRFUFRIXSA9IHhhdG9pX3Bvc2l0aXZlKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0RFUFRICisJCWVsc2UgaWYgKHBhcm0gPT0gT1BUX0RFUFRIKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5yZWN1cnNlX2ZsYWdzIHw9IEFDVElPTl9ERVBUSEZJUlNUOworCQl9CisjZW5kaWYKKy8qIEFjdGlvbnMgYXJlIGdyb3VwZWQgYnkgb3BlcmF0b3JzCisgKiAoIGV4cHIgKSAgICAgICAgICAgICAgRm9yY2UgcHJlY2VkZW5jZQorICogISBleHByICAgICAgICAgICAgICAgIFRydWUgaWYgZXhwciBpcyBmYWxzZQorICogLW5vdCBleHByICAgICAgICAgICAgIFNhbWUgYXMgISBleHByCisgKiBleHByMSBbLWFbbmRdXSBleHByMiAgQW5kOyBleHByMiBpcyBub3QgZXZhbHVhdGVkIGlmIGV4cHIxIGlzIGZhbHNlCisgKiBleHByMSAtb1tyXSBleHByMiAgICAgT3I7IGV4cHIyIGlzIG5vdCBldmFsdWF0ZWQgaWYgZXhwcjEgaXMgdHJ1ZQorICogZXhwcjEgLCBleHByMiAgICAgICAgIExpc3Q7IGJvdGggZXhwcjEgYW5kIGV4cHIyIGFyZSBhbHdheXMgZXZhbHVhdGVkCisgKiBXZSBpbXBsZW1lbnQ6ICgpLCAtYSwgLW8KKyAqLworCQkvKiBPcGVyYXRvcnMgKi8KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2EgSUZfREVTS1RPUCh8fCBwYXJtID09IFBBUk1fYW5kKSkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCS8qIG5vIGZ1cnRoZXIgc3BlY2lhbCBoYW5kbGluZyByZXF1aXJlZCAqLworCQl9CisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9vIElGX0RFU0tUT1AofHwgcGFybSA9PSBQQVJNX29yKSkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCS8qIHN0YXJ0IG5ldyBPUiBncm91cCAqLworCQkJY3VyX2dyb3VwKys7CisJCQlhcHBwID0geHJlYWxsb2MoYXBwcCwgKGN1cl9ncm91cCsyKSAqIHNpemVvZigqYXBwcCkpOworCQkJLyphcHBwW2N1cl9ncm91cF0gPSBOVUxMOyAtIGFscmVhZHkgTlVMTCAqLworCQkJYXBwcFtjdXJfZ3JvdXArMV0gPSBOVUxMOworCQkJY3VyX2FjdGlvbiA9IDA7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05PVAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fY2hhcl9ub3QgSUZfREVTS1RPUCh8fCBwYXJtID09IFBBUk1fbm90KSkgeworCQkJLyogYWxzbyBoYW5kbGVzICJmaW5kICEgISAtbmFtZSAnZm9vKiciICovCisJCQlpbnZlcnRfZmxhZyBePSAxOworCQkJZGJnKCJpbnZlcnRfZmxhZzolZCIsIGludmVydF9mbGFnKTsKKwkJfQorI2VuZGlmCisJCS8qIEFjdGlvbnMgKi8KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3ByaW50KSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5uZWVkX3ByaW50ID0gMDsKKwkJCSh2b2lkKSBBTExPQ19BQ1RJT04ocHJpbnQpOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QUklOVDAKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3ByaW50MCkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCUcubmVlZF9wcmludCA9IDA7CisJCQkodm9pZCkgQUxMT0NfQUNUSU9OKHByaW50MCk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUFJVTkUKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3BydW5lKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJKHZvaWQpIEFMTE9DX0FDVElPTihwcnVuZSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfREVMRVRFCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9kZWxldGUpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlHLm5lZWRfcHJpbnQgPSAwOworCQkJRy5yZWN1cnNlX2ZsYWdzIHw9IEFDVElPTl9ERVBUSEZJUlNUOworCQkJKHZvaWQpIEFMTE9DX0FDVElPTihkZWxldGUpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0VYRUMKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2V4ZWMpIHsKKwkJCWludCBpOworCQkJYWN0aW9uX2V4ZWMgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCUcubmVlZF9wcmludCA9IDA7CisJCQlhcCA9IEFMTE9DX0FDVElPTihleGVjKTsKKwkJCWFwLT5leGVjX2FyZ3YgPSArK2FyZ3Y7IC8qIGZpcnN0IGFyZyBhZnRlciAtZXhlYyAqLworCQkJLyphcC0+ZXhlY19hcmdjID0gMDsgLSBBTExPQ19BQ1RJT04gZGlkIGl0ICovCisJCQl3aGlsZSAoMSkgeworCQkJCWlmICghKmFyZ3YpIC8qIGRpZCBub3Qgc2VlICc7JyBvciAnKycgdW50aWwgZW5kICovCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICItZXhlYyIpOworCQkJCS8vIGZpbmQgLWV4ZWMgZWNobyBGb28gIj57fTwiICI7IgorCQkJCS8vIGV4ZWN1dGVzICJlY2hvIEZvbyA+RklMRU5BTUU8IiwKKwkJCQkvLyBmaW5kIC1leGVjIGVjaG8gRm9vICI+e308IiAiKyIKKwkJCQkvLyBleGVjdXRlcyAiZWNobyBGb28gRklMRU5BTUUxIEZJTEVOQU1FMiBGSUxFTkFNRTMuLi4iLgorCQkJCS8vIFRPRE8gKHNvIGZhciB3ZSB0cmVhdCAiKyIganVzdCBsaWtlICI7IikKKwkJCQlpZiAoKGFyZ3ZbMF1bMF0gPT0gJzsnIHx8IGFyZ3ZbMF1bMF0gPT0gJysnKQorCQkJCSAmJiBhcmd2WzBdWzFdID09ICdcMCcKKwkJCQkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWFyZ3YrKzsKKwkJCQlhcC0+ZXhlY19hcmdjKys7CisJCQl9CisJCQlpZiAoYXAtPmV4ZWNfYXJnYyA9PSAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsIGFyZyk7CisJCQlhcC0+c3Vic3RfY291bnQgPSB4bWFsbG9jKGFwLT5leGVjX2FyZ2MgKiBzaXplb2YoaW50KSk7CisJCQlpID0gYXAtPmV4ZWNfYXJnYzsKKwkJCXdoaWxlIChpLS0pCisJCQkJYXAtPnN1YnN0X2NvdW50W2ldID0gY291bnRfc3Vic3QoYXAtPmV4ZWNfYXJndltpXSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFSRU4KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2NoYXJfYnJhY2UpIHsKKwkJCWFjdGlvbl9wYXJlbiAqYXA7CisJCQljaGFyICoqZW5kYXJnOworCQkJdW5zaWduZWQgbmVzdGVkID0gMTsKKworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWVuZGFyZyA9IGFyZ3Y7CisJCQl3aGlsZSAoMSkgeworCQkJCWlmICghKisrZW5kYXJnKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5wYWlyZWQgJygnIik7CisJCQkJaWYgKExPTkVfQ0hBUigqZW5kYXJnLCAnKCcpKQorCQkJCQluZXN0ZWQrKzsKKwkJCQllbHNlIGlmIChMT05FX0NIQVIoKmVuZGFyZywgJyknKSAmJiAhLS1uZXN0ZWQpIHsKKwkJCQkJKmVuZGFyZyA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWFwID0gQUxMT0NfQUNUSU9OKHBhcmVuKTsKKwkJCWFwLT5zdWJleHByID0gcGFyc2VfcGFyYW1zKGFyZ3YgKyAxKTsKKwkJCSplbmRhcmcgPSAoY2hhciopICIpIjsgLyogcmVzdG9yZSBOVUxMZWQgcGFyYW1ldGVyICovCisJCQlhcmd2ID0gZW5kYXJnOworCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX25hbWUgfHwgcGFybSA9PSBQQVJNX2luYW1lKSB7CisJCQlhY3Rpb25fbmFtZSAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04obmFtZSk7CisJCQlhcC0+cGF0dGVybiA9IGFyZzE7CisJCQlhcC0+aW5hbWUgPSAocGFybSA9PSBQQVJNX2luYW1lKTsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFUSAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fcGF0aCB8fCBwYXJtID09IFBBUk1faXBhdGgpIHsKKwkJCWFjdGlvbl9wYXRoICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihwYXRoKTsKKwkJCWFwLT5wYXR0ZXJuID0gYXJnMTsKKwkJCWFwLT5pcGF0aCA9IChwYXJtID09IFBBUk1faXBhdGgpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1JFR0VYCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9yZWdleCkgeworCQkJYWN0aW9uX3JlZ2V4ICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihyZWdleCk7CisJCQl4cmVnY29tcCgmYXAtPmNvbXBpbGVkX3BhdHRlcm4sIGFyZzEsIDAgLypjZmxhZ3MqLyk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfVFlQRQorCQllbHNlIGlmIChwYXJtID09IFBBUk1fdHlwZSkgeworCQkJYWN0aW9uX3R5cGUgKmFwOworCQkJYXAgPSBBTExPQ19BQ1RJT04odHlwZSk7CisJCQlhcC0+dHlwZV9tYXNrID0gZmluZF90eXBlKGFyZzEpOworCQkJZGJnKCJjcmVhdGVkOnR5cGUgbWFzazoleCIsIGFwLT50eXBlX21hc2spOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BFUk0KKy8qIC1wZXJtIEJJVFMgICBGaWxlJ3MgbW9kZSBiaXRzIGFyZSBleGFjdGx5IEJJVFMgKG9jdGFsIG9yIHN5bWJvbGljKS4KKyAqICAgICAgICAgICAgICBTeW1ib2xpYyBtb2RlcyB1c2UgbW9kZSAwIGFzIGEgcG9pbnQgb2YgZGVwYXJ0dXJlLgorICogLXBlcm0gLUJJVFMgIEFsbCBvZiB0aGUgQklUUyBhcmUgc2V0IGluIGZpbGUncyBtb2RlLgorICogLXBlcm0gK0JJVFMgIEF0IGxlYXN0IG9uZSBvZiB0aGUgQklUUyBpcyBzZXQgaW4gZmlsZSdzIG1vZGUuCisgKi8KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3Blcm0pIHsKKwkJCWFjdGlvbl9wZXJtICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihwZXJtKTsKKwkJCWFwLT5wZXJtX2NoYXIgPSBhcmcxWzBdOworCQkJYXJnMSA9IHBsdXNfbWludXNfbnVtKGFyZzEpOworCQkJLyphcC0+cGVybV9tYXNrID0gMDsgLSBBTExPQ19BQ1RJT04gZGlkIGl0ICovCisJCQlpZiAoIWJiX3BhcnNlX21vZGUoYXJnMSwgJmFwLT5wZXJtX21hc2spKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIG1vZGUgJyVzJyIsIGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01USU1FCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9tdGltZSkgeworCQkJYWN0aW9uX210aW1lICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihtdGltZSk7CisJCQlhcC0+bXRpbWVfY2hhciA9IGFyZzFbMF07CisJCQlhcC0+bXRpbWVfZGF5cyA9IHhhdG91bChwbHVzX21pbnVzX251bShhcmcxKSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTU1JTgorCQllbHNlIGlmIChwYXJtID09IFBBUk1fbW1pbikgeworCQkJYWN0aW9uX21taW4gKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKG1taW4pOworCQkJYXAtPm1taW5fY2hhciA9IGFyZzFbMF07CisJCQlhcC0+bW1pbl9taW5zID0geGF0b3VsKHBsdXNfbWludXNfbnVtKGFyZzEpKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9ORVdFUgorCQllbHNlIGlmIChwYXJtID09IFBBUk1fbmV3ZXIpIHsKKwkJCXN0cnVjdCBzdGF0IHN0YXRfbmV3ZXI7CisJCQlhY3Rpb25fbmV3ZXIgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKG5ld2VyKTsKKwkJCXhzdGF0KGFyZzEsICZzdGF0X25ld2VyKTsKKwkJCWFwLT5uZXdlcl9tdGltZSA9IHN0YXRfbmV3ZXIuc3RfbXRpbWU7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfSU5VTQorCQllbHNlIGlmIChwYXJtID09IFBBUk1faW51bSkgeworCQkJYWN0aW9uX2ludW0gKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKGludW0pOworCQkJYXAtPmlub2RlX251bSA9IHhhdG91bChhcmcxKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9VU0VSCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV91c2VyKSB7CisJCQlhY3Rpb25fdXNlciAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04odXNlcik7CisJCQlhcC0+dWlkID0gYmJfc3RydG91KGFyZzEsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubykKKwkJCQlhcC0+dWlkID0geHVuYW1lMnVpZChhcmcxKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9HUk9VUAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fZ3JvdXApIHsKKwkJCWFjdGlvbl9ncm91cCAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04oZ3JvdXApOworCQkJYXAtPmdpZCA9IGJiX3N0cnRvdShhcmcxLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8pCisJCQkJYXAtPmdpZCA9IHhncm91cDJnaWQoYXJnMSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfU0laRQorCQllbHNlIGlmIChwYXJtID09IFBBUk1fc2l6ZSkgeworLyogLXNpemUgbltiY2t3XTogZmlsZSB1c2VzIG4gdW5pdHMgb2Ygc3BhY2UKKyAqIGIgKGRlZmF1bHQpOiB1bml0cyBhcmUgNTEyLWJ5dGUgYmxvY2tzCisgKiBjOiAxIGJ5dGUKKyAqIGs6IGtpbG9ieXRlcworICogdzogMi1ieXRlIHdvcmRzCisgKi8KKyNpZiBFTkFCTEVfTEZTCisjZGVmaW5lIFhBVE9VX1NGWCB4YXRvdWxsX3NmeAorI2Vsc2UKKyNkZWZpbmUgWEFUT1VfU0ZYIHhhdG91bF9zZngKKyNlbmRpZgorCQkJc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBmaW5kX3N1ZmZpeGVzW10gPSB7CisJCQkJeyAiYyIsIDEgfSwKKwkJCQl7ICJ3IiwgMiB9LAorCQkJCXsgIiIsIDUxMiB9LAorCQkJCXsgImIiLCA1MTIgfSwKKwkJCQl7ICJrIiwgMTAyNCB9LAorCQkJCXsgIiIsIDAgfQorCQkJfTsKKwkJCWFjdGlvbl9zaXplICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihzaXplKTsKKwkJCWFwLT5zaXplX2NoYXIgPSBhcmcxWzBdOworCQkJYXAtPnNpemUgPSBYQVRPVV9TRlgocGx1c19taW51c19udW0oYXJnMSksIGZpbmRfc3VmZml4ZXMpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0NPTlRFWFQKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2NvbnRleHQpIHsKKwkJCWFjdGlvbl9jb250ZXh0ICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihjb250ZXh0KTsKKwkJCS8qYXAtPmNvbnRleHQgPSBOVUxMOyAtIEFMTE9DX0FDVElPTiBkaWQgaXQgKi8KKwkJCS8qIFNFTGludXggaGVhZGVycyBlcnJvbmVvdXNseSBkZWNsYXJlIG5vbi1jb25zdCBwYXJhbWV0ZXIgKi8KKwkJCWlmIChzZWxpbnV4X3Jhd190b190cmFuc19jb250ZXh0KChjaGFyKilhcmcxLCAmYXAtPmNvbnRleHQpKQorCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0xJTktTCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9saW5rcykgeworCQkJYWN0aW9uX2xpbmtzICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihsaW5rcyk7CisJCQlhcC0+bGlua3NfY2hhciA9IGFyZzFbMF07CisJCQlhcC0+bGlua3NfY291bnQgPSB4YXRvdWwocGx1c19taW51c19udW0oYXJnMSkpOworCQl9CisjZW5kaWYKKwkJZWxzZSB7CisJCQliYl9lcnJvcl9tc2coInVucmVjb2duaXplZDogJXMiLCBhcmcpOworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJCWFyZ3YrKzsKKwl9CisJZGJnKCJleGl0aW5nICVzIiwgX19mdW5jX18pOworCXJldHVybiBhcHBwOworI3VuZGVmIEFMTE9DX0FDVElPTgorfQorCitpbnQgZmluZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmluZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGZpcnN0b3B0LCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisKKwlJTklUX0coKTsKKworCWFyZ3YrKzsKKwlmb3IgKGZpcnN0b3B0ID0gMDsgYXJndltmaXJzdG9wdF07IGZpcnN0b3B0KyspIHsKKwkJaWYgKGFyZ3ZbZmlyc3RvcHRdWzBdID09ICctJykKKwkJCWJyZWFrOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfRklORF9OT1QgJiYgTE9ORV9DSEFSKGFyZ3ZbZmlyc3RvcHRdLCAnIScpKQorCQkJYnJlYWs7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9GSU5EX1BBUkVOICYmIExPTkVfQ0hBUihhcmd2W2ZpcnN0b3B0XSwgJygnKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoZmlyc3RvcHQgPT0gMCkgeworCQkqLS1hcmd2ID0gKGNoYXIqKSIuIjsKKwkJZmlyc3RvcHQrKzsKKwl9CisKKwlHLmFjdGlvbnMgPSBwYXJzZV9wYXJhbXMoJmFyZ3ZbZmlyc3RvcHRdKTsKKwlhcmd2W2ZpcnN0b3B0XSA9IE5VTEw7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1hERVYKKwlpZiAoRy54ZGV2X29uKSB7CisJCXN0cnVjdCBzdGF0IHN0YnVmOworCisJCUcueGRldl9jb3VudCA9IGZpcnN0b3B0OworCQlHLnhkZXZfZGV2ID0geHphbGxvYyhHLnhkZXZfY291bnQgKiBzaXplb2YoRy54ZGV2X2RldlswXSkpOworCQlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspIHsKKwkJCS8qIG5vdCB4c3RhdCgpOiBzaG91bGRuJ3QgYm9tYiBvdXQgb24KKwkJCSAqICJmaW5kIG5vdF9leGlzdCBleGlzdCAteGRldiIgKi8KKwkJCWlmIChzdGF0KGFyZ3ZbaV0sICZzdGJ1ZikgPT0gMCkKKwkJCQlHLnhkZXZfZGV2W2ldID0gc3RidWYuc3RfZGV2OworCQkJLyogZWxzZSBHLnhkZXZfZGV2W2ldIHN0YXlzIDAgYW5kCisJCQkgKiB3b24ndCBtYXRjaCBhbnkgcmVhbCBkZXZpY2UgZGV2X3QKKwkJCSAqLworCQl9CisJfQorI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspIHsKKwkJaWYgKCFyZWN1cnNpdmVfYWN0aW9uKGFyZ3ZbaV0sCisJCQkJRy5yZWN1cnNlX2ZsYWdzLC8qIGZsYWdzICovCisJCQkJZmlsZUFjdGlvbiwgICAgIC8qIGZpbGUgYWN0aW9uICovCisJCQkJZmlsZUFjdGlvbiwgICAgIC8qIGRpciBhY3Rpb24gKi8KKwkJCQlOVUxMLCAgICAgICAgICAgLyogdXNlciBkYXRhICovCisJCQkJMCkgICAgICAgICAgICAgIC8qIGRlcHRoICovCisJCSkgeworCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2ZpbmR1dGlscy9ncmVwLmMgYi9maW5kdXRpbHMvZ3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDIyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5kdXRpbHMvZ3JlcC5jCkBAIC0wLDAgKzEsNzgxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGdyZXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3ggdXNpbmcgbGliYyByZWdleC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IExpbmVvLCBpbmMuIGFuZCBNYXJrIFdoaXRsZXkKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTWFyayBXaGl0bGV5IDxtYXJrd0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyogQkJfQVVESVQgU1VTdjMgZGVmZWN0cyAtIHVuc3VwcG9ydGVkIG9wdGlvbiAteCAibWF0Y2ggd2hvbGUgbGluZSBvbmx5Ii4gKi8KKy8qIEJCX0FVRElUIEdOVSBkZWZlY3RzIC0gYWx3YXlzIGFjdHMgYXMgLWEuICAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ncmVwLmh0bWwgKi8KKy8qCisgKiAyMDA0LDIwMDYgKEMpIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gLQorICogY29ycmVjdGlvbiAiLWUgcGF0dGVybjEgLWUgcGF0dGVybjIiIGxvZ2ljIGFuZCBtb3JlIG9wdGltaXphdGlvbnMuCisgKiBwcmVjb21waWxlZCByZWdleAorICoKKyAqIChDKSAyMDA2IEphYyBHb3Vkc21pdCBhZGRlZCAtbyBvcHRpb24KKyAqLworCisvL2FwcGxldDpJRl9HUkVQKEFQUExFVChncmVwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKEFQUExFVF9PREROQU1FKGVncmVwLCBncmVwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGVncmVwKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUyhBUFBMRVRfT0RETkFNRShmZ3JlcCwgZ3JlcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBmZ3JlcCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19HUkVQKSArPSBncmVwLm8KKworLy9jb25maWc6Y29uZmlnIEdSRVAKKy8vY29uZmlnOglib29sICJncmVwIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGdyZXAgaXMgdXNlZCB0byBzZWFyY2ggZmlsZXMgZm9yIGEgc3BlY2lmaWVkIHBhdHRlcm4uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMKKy8vY29uZmlnOglib29sICJFbmFibGUgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyAoZWdyZXAgJiBncmVwIC1FKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEdSRVAKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGVkIHN1cHBvcnQgZm9yIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIEV4dGVuZGVkCisvL2NvbmZpZzoJICByZWd1bGFyIGV4cHJlc3Npb25zIGFsbG93IGZvciBhbHRlcm5hdGlvbiAoZm9vfGJhciksIGdyb3VwaW5nLAorLy9jb25maWc6CSAgYW5kIHZhcmlvdXMgcmVwZXRpdGlvbiBvcGVyYXRvcnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVMKKy8vY29uZmlnOglib29sICJBbGlhcyBmZ3JlcCB0byBncmVwIC1GIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gR1JFUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGZncmVwIHNlZXMgdGhlIHNlYXJjaCBwYXR0ZXJuIGFzIGEgbm9ybWFsIHN0cmluZyByYXRoZXIgdGhhbgorLy9jb25maWc6CSAgcmVndWxhciBleHByZXNzaW9ucy4KKy8vY29uZmlnOgkgIGdyZXAgLUYgYWx3YXlzIHdvcmtzLCB0aGlzIGp1c3QgY3JlYXRlcyB0aGUgZmdyZXAgYWxpYXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0dSRVBfQ09OVEVYVAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBiZWZvcmUgYW5kIGFmdGVyIGNvbnRleHQgZmxhZ3MgKC1BLCAtQiBhbmQgLUMpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gR1JFUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFByaW50IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGxlYWRpbmcgKC1CKSBhbmQvb3IgdHJhaWxpbmcgKC1BKQorLy9jb25maWc6CSAgY29udGV4dCBzdXJyb3VuZGluZyBvdXIgbWF0Y2hpbmcgbGluZXMuCisvL2NvbmZpZzoJICBQcmludCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjb250ZXh0IGxpbmVzICgtQykuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorCisKKy8qIG9wdGlvbnMgKi8KKy8vdXNhZ2U6I2RlZmluZSBncmVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUhobmxMb3F2c3JpdyIKKy8vdXNhZ2U6ICAgICAgICJGIgorLy91c2FnZToJSUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKCJFIikKKy8vdXNhZ2U6CUlGX0VYVFJBX0NPTVBBVCgieiIpCisvL3VzYWdlOiAgICAgICAiXSBbLW0gTl0gIgorLy91c2FnZToJSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoIlstQS9CL0MgTl0gIikKKy8vdXNhZ2U6ICAgICAgICJQQVRURVJOLy1lIFBBVFRFUk4uLi4vLWYgRklMRSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZ3JlcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlYXJjaCBmb3IgUEFUVEVSTiBpbiBGSUxFcyAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1ICUFkZCAnZmlsZW5hbWU6JyBwcmVmaXgiCisvL3VzYWdlOiAgICAgIlxuCS1oCURvIG5vdCBhZGQgJ2ZpbGVuYW1lOicgcHJlZml4IgorLy91c2FnZTogICAgICJcbgktbglBZGQgJ2xpbmVfbm86JyBwcmVmaXgiCisvL3VzYWdlOiAgICAgIlxuCS1sCVNob3cgb25seSBuYW1lcyBvZiBmaWxlcyB0aGF0IG1hdGNoIgorLy91c2FnZTogICAgICJcbgktTAlTaG93IG9ubHkgbmFtZXMgb2YgZmlsZXMgdGhhdCBkb24ndCBtYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJU2hvdyBvbmx5IGNvdW50IG9mIG1hdGNoaW5nIGxpbmVzIgorLy91c2FnZTogICAgICJcbgktbwlTaG93IG9ubHkgdGhlIG1hdGNoaW5nIHBhcnQgb2YgbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJUXVpZXQuIFJldHVybiAwIGlmIFBBVFRFUk4gaXMgZm91bmQsIDEgb3RoZXJ3aXNlIgorLy91c2FnZTogICAgICJcbgktdglTZWxlY3Qgbm9uLW1hdGNoaW5nIGxpbmVzIgorLy91c2FnZTogICAgICJcbgktcwlTdXBwcmVzcyBvcGVuIGFuZCByZWFkIGVycm9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSWdub3JlIGNhc2UiCisvL3VzYWdlOiAgICAgIlxuCS13CU1hdGNoIHdob2xlIHdvcmRzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1GCVBBVFRFUk4gaXMgYSBsaXRlcmFsIChub3QgcmVnZXhwKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUygKKy8vdXNhZ2U6ICAgICAiXG4JLUUJUEFUVEVSTiBpcyBhbiBleHRlbmRlZCByZWdleHAiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9FWFRSQV9DT01QQVQoCisvL3VzYWdlOiAgICAgIlxuCS16CUlucHV0IGlzIE5VTCB0ZXJtaW5hdGVkIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbSBOCU1hdGNoIHVwIHRvIE4gdGltZXMgcGVyIGZpbGUiCisvL3VzYWdlOglJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCgKKy8vdXNhZ2U6ICAgICAiXG4JLUEgTglQcmludCBOIGxpbmVzIG9mIHRyYWlsaW5nIGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1CIE4JUHJpbnQgTiBsaW5lcyBvZiBsZWFkaW5nIGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1DIE4JU2FtZSBhcyAnLUEgTiAtQiBOJyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWUgUFRSTglQYXR0ZXJuIHRvIG1hdGNoIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCVJlYWQgcGF0dGVybiBmcm9tIGZpbGUiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGdyZXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZ3JlcCByb290IC9ldGMvcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAicm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaFxuIgorLy91c2FnZTogICAgICAgIiQgZ3JlcCBeW3JSXW9vLiAvZXRjL3Bhc3N3ZFxuIgorLy91c2FnZTogICAgICAgInJvb3Q6eDowOjA6cm9vdDovcm9vdDovYmluL2Jhc2hcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZWdyZXBfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGVncmVwX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6I2RlZmluZSBmZ3JlcF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZmdyZXBfZnVsbF91c2FnZSAiIgorCisjZGVmaW5lIE9QVFNUUl9HUkVQIFwKKwkibG5xdnNjRmlIaGU6ZjpMb3JtOnciIFwKKwlJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCgiQTpCOkM6IikgXAorCUlGX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUygiRSIpIFwKKwlJRl9FWFRSQV9DT01QQVQoInoiKSBcCisJImFJIgorLyogaWdub3JlZDogLWEgImFzc3VtZSBhbGwgZmlsZXMgdG8gYmUgdGV4dCIgKi8KKy8qIGlnbm9yZWQ6IC1JICJhc3N1bWUgYmluYXJ5IGZpbGVzIGhhdmUgbm8gbWF0Y2hlcyIgKi8KK2VudW0geworCU9QVEJJVF9sLCAvKiBsaXN0IG1hdGNoZWQgZmlsZSBuYW1lcyBvbmx5ICovCisJT1BUQklUX24sIC8qIHByaW50IGxpbmUjICovCisJT1BUQklUX3EsIC8qIHF1aWV0IC0gZXhpdChFWElUX1NVQ0NFU1MpIG9mIGZpcnN0IG1hdGNoICovCisJT1BUQklUX3YsIC8qIGludmVydCB0aGUgbWF0Y2gsIHRvIHNlbGVjdCBub24tbWF0Y2hpbmcgbGluZXMgKi8KKwlPUFRCSVRfcywgLyogc3VwcHJlc3MgZXJyb3JzIGFib3V0IGZpbGUgb3BlbiBlcnJvcnMgKi8KKwlPUFRCSVRfYywgLyogY291bnQgbWF0Y2hlcyBwZXIgZmlsZSAoc3VwcHJlc3NlcyBub3JtYWwgb3V0cHV0KSAqLworCU9QVEJJVF9GLCAvKiBsaXRlcmFsIG1hdGNoICovCisJT1BUQklUX2ksIC8qIGNhc2UtaW5zZW5zaXRpdmUgKi8KKwlPUFRCSVRfSCwgLyogZm9yY2UgZmlsZW5hbWUgZGlzcGxheSAqLworCU9QVEJJVF9oLCAvKiBpbmhpYml0IGZpbGVuYW1lIGRpc3BsYXkgKi8KKwlPUFRCSVRfZSwgLyogLWUgUEFUVEVSTiAqLworCU9QVEJJVF9mLCAvKiAtZiBGSUxFX1dJVEhfUEFUVEVSTlMgKi8KKwlPUFRCSVRfTCwgLyogbGlzdCB1bm1hdGNoZWQgZmlsZSBuYW1lcyBvbmx5ICovCisJT1BUQklUX28sIC8qIHNob3cgb25seSBtYXRjaGluZyBwYXJ0cyBvZiBsaW5lcyAqLworCU9QVEJJVF9yLCAvKiByZWN1cnNlIGRpcnMgKi8KKwlPUFRCSVRfbSwgLyogLW0gTUFYX01BVENIRVMgKi8KKwlPUFRCSVRfdywgLyogLXcgd2hvbGUgd29yZCBtYXRjaCAqLworCUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKCAgICBPUFRCSVRfQSAsKSAvKiAtQSBOVU06IGFmdGVyLW1hdGNoIGNvbnRleHQgKi8KKwlJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgT1BUQklUX0IgLCkgLyogLUIgTlVNOiBiZWZvcmUtbWF0Y2ggY29udGV4dCAqLworCUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKCAgICBPUFRCSVRfQyAsKSAvKiAtQyBOVU06IC1BIGFuZCAtQiBjb21iaW5lZCAqLworCUlGX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUyhPUFRCSVRfRSAsKSAvKiBleHRlbmRlZCByZWdleHAgKi8KKwlJRl9FWFRSQV9DT01QQVQoICAgICAgICAgICAgT1BUQklUX3ogLCkgLyogaW5wdXQgaXMgTlVMIHRlcm1pbmF0ZWQgKi8KKwlPUFRfbCA9IDEgPDwgT1BUQklUX2wsCisJT1BUX24gPSAxIDw8IE9QVEJJVF9uLAorCU9QVF9xID0gMSA8PCBPUFRCSVRfcSwKKwlPUFRfdiA9IDEgPDwgT1BUQklUX3YsCisJT1BUX3MgPSAxIDw8IE9QVEJJVF9zLAorCU9QVF9jID0gMSA8PCBPUFRCSVRfYywKKwlPUFRfRiA9IDEgPDwgT1BUQklUX0YsCisJT1BUX2kgPSAxIDw8IE9QVEJJVF9pLAorCU9QVF9IID0gMSA8PCBPUFRCSVRfSCwKKwlPUFRfaCA9IDEgPDwgT1BUQklUX2gsCisJT1BUX2UgPSAxIDw8IE9QVEJJVF9lLAorCU9QVF9mID0gMSA8PCBPUFRCSVRfZiwKKwlPUFRfTCA9IDEgPDwgT1BUQklUX0wsCisJT1BUX28gPSAxIDw8IE9QVEJJVF9vLAorCU9QVF9yID0gMSA8PCBPUFRCSVRfciwKKwlPUFRfbSA9IDEgPDwgT1BUQklUX20sCisJT1BUX3cgPSAxIDw8IE9QVEJJVF93LAorCU9QVF9BID0gSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoICAgICgxIDw8IE9QVEJJVF9BKSkgKyAwLAorCU9QVF9CID0gSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoICAgICgxIDw8IE9QVEJJVF9CKSkgKyAwLAorCU9QVF9DID0gSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoICAgICgxIDw8IE9QVEJJVF9DKSkgKyAwLAorCU9QVF9FID0gSUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKCgxIDw8IE9QVEJJVF9FKSkgKyAwLAorCU9QVF96ID0gSUZfRVhUUkFfQ09NUEFUKCAgICAgICAgICAgICgxIDw8IE9QVEJJVF96KSkgKyAwLAorfTsKKworI2RlZmluZSBQUklOVF9GSUxFU19XSVRIX01BVENIRVMgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbCkKKyNkZWZpbmUgUFJJTlRfTElORV9OVU0gICAgICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX24pCisjZGVmaW5lIEJFX1FVSUVUICAgICAgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9xKQorI2RlZmluZSBTVVBQUkVTU19FUlJfTVNHUyAgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcykKKyNkZWZpbmUgUFJJTlRfTUFUQ0hfQ09VTlRTICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX2MpCisjZGVmaW5lIEZHUkVQX0ZMQUcgICAgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9GKQorI2RlZmluZSBQUklOVF9GSUxFU19XSVRIT1VUX01BVENIRVMgKG9wdGlvbl9tYXNrMzIgJiBPUFRfTCkKKyNkZWZpbmUgTlVMX0RFTElNSVRFRCAgICAgICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX3opCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgbWF4X21hdGNoZXM7CisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwlpbnQgcmVmbGFnczsKKyNlbHNlCisJUkVfVFJBTlNMQVRFX1RZUEUgY2FzZV9mb2xkOyAvKiBSRV9UUkFOU0xBVEVfVFlQRSBpcyBbW3VuXXNpZ25lZF0gY2hhciogKi8KKyNlbmRpZgorCXNtYWxsdWludCBpbnZlcnRfc2VhcmNoOworCXNtYWxsdWludCBwcmludF9maWxlbmFtZTsKKwlzbWFsbHVpbnQgb3Blbl9lcnJvcnM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUCisJc21hbGx1aW50IGRpZF9wcmludF9saW5lOworCWludCBsaW5lc19iZWZvcmU7CisJaW50IGxpbmVzX2FmdGVyOworCWNoYXIgKipiZWZvcmVfYnVmOworCUlGX0VYVFJBX0NPTVBBVChzaXplX3QgKmJlZm9yZV9idWZfc2l6ZTspCisJaW50IGxhc3RfbGluZV9wcmludGVkOworI2VuZGlmCisJLyogZ2xvYmFscyB1c2VkIGludGVybmFsbHkgKi8KKwlsbGlzdF90ICpwYXR0ZXJuX2hlYWQ7ICAgLyogZ3Jvd2FibGUgbGlzdCBvZiBwYXR0ZXJucyB0byBtYXRjaCAqLworCWNvbnN0IGNoYXIgKmN1cl9maWxlOyAgICAvKiB0aGUgY3VycmVudCBmaWxlIHdlIGFyZSByZWFkaW5nICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlzdHJ1Y3QgR19zaXplY2hlY2sgeyBcCisJCWNoYXIgR19zaXplY2hlY2tbc2l6ZW9mKEcpID4gQ09NTU9OX0JVRlNJWkUgPyAtMSA6IDFdOyBcCisJfTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgbWF4X21hdGNoZXMgICAgICAgKEcubWF4X21hdGNoZXMgICAgICAgICApCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKyMgZGVmaW5lIHJlZmxhZ3MgICAgICAgICAgKEcucmVmbGFncyAgICAgICAgICAgICApCisjZWxzZQorIyBkZWZpbmUgY2FzZV9mb2xkICAgICAgICAoRy5jYXNlX2ZvbGQgICAgICAgICAgICkKKy8qIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvcmVnZXgvcmVnZXhfNDYuaHRtbCAqLworIyBkZWZpbmUgcmVmbGFncyAgICAgICAgICAgcmVfc3ludGF4X29wdGlvbnMKKyMgdW5kZWYgUkVHX05PU1VCCisjIHVuZGVmIFJFR19FWFRFTkRFRAorIyB1bmRlZiBSRUdfSUNBU0UKKyMgZGVmaW5lIFJFR19OT1NVQiAgICBidWc6aXM6aGVyZSAvKiBzaG91bGQgbm90IGJlIHVzZWQgKi8KKy8qIEp1c3QgUkVfU1lOVEFYX0VHUkVQIGlzIG5vdCBlbm91Z2gsIG5lZWQgdG8gZW5hYmxlIHtuWyxbbV1dfSB0b28gKi8KKyMgZGVmaW5lIFJFR19FWFRFTkRFRCAoUkVfU1lOVEFYX0VHUkVQIHwgUkVfSU5URVJWQUxTIHwgUkVfTk9fQktfQlJBQ0VTKQorIyBkZWZpbmUgUkVHX0lDQVNFICAgIGJ1ZzppczpoZXJlIC8qIHNob3VsZCBub3QgYmUgdXNlZCAqLworI2VuZGlmCisjZGVmaW5lIGludmVydF9zZWFyY2ggICAgIChHLmludmVydF9zZWFyY2ggICAgICAgKQorI2RlZmluZSBwcmludF9maWxlbmFtZSAgICAoRy5wcmludF9maWxlbmFtZSAgICAgICkKKyNkZWZpbmUgb3Blbl9lcnJvcnMgICAgICAgKEcub3Blbl9lcnJvcnMgICAgICAgICApCisjZGVmaW5lIGRpZF9wcmludF9saW5lICAgIChHLmRpZF9wcmludF9saW5lICAgICAgKQorI2RlZmluZSBsaW5lc19iZWZvcmUgICAgICAoRy5saW5lc19iZWZvcmUgICAgICAgICkKKyNkZWZpbmUgbGluZXNfYWZ0ZXIgICAgICAgKEcubGluZXNfYWZ0ZXIgICAgICAgICApCisjZGVmaW5lIGJlZm9yZV9idWYgICAgICAgIChHLmJlZm9yZV9idWYgICAgICAgICAgKQorI2RlZmluZSBiZWZvcmVfYnVmX3NpemUgICAoRy5iZWZvcmVfYnVmX3NpemUgICAgICkKKyNkZWZpbmUgbGFzdF9saW5lX3ByaW50ZWQgKEcubGFzdF9saW5lX3ByaW50ZWQgICApCisjZGVmaW5lIHBhdHRlcm5faGVhZCAgICAgIChHLnBhdHRlcm5faGVhZCAgICAgICAgKQorI2RlZmluZSBjdXJfZmlsZSAgICAgICAgICAoRy5jdXJfZmlsZSAgICAgICAgICAgICkKKworCit0eXBlZGVmIHN0cnVjdCBncmVwX2xpc3RfZGF0YV90IHsKKwljaGFyICpwYXR0ZXJuOworLyogZm9yIEdOVSByZWdleCwgbWF0Y2hlZF9yYW5nZSBtdXN0IGJlIHBlcnNpc3RlbnQgYWNyb3NzIGdyZXBfZmlsZSgpIGNhbGxzICovCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwlyZWdleF90IGNvbXBpbGVkX3JlZ2V4OworCXJlZ21hdGNoX3QgbWF0Y2hlZF9yYW5nZTsKKyNlbHNlCisJc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyIGNvbXBpbGVkX3JlZ2V4OworCXN0cnVjdCByZV9yZWdpc3RlcnMgbWF0Y2hlZF9yYW5nZTsKKyNlbmRpZgorI2RlZmluZSBBTExPQ0FURUQgMQorI2RlZmluZSBDT01QSUxFRCAyCisJaW50IGZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQ7Cit9IGdyZXBfbGlzdF9kYXRhX3Q7CisKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorI2RlZmluZSBwcmludF9saW5lKGxpbmUsIGxpbmVfbGVuLCBsaW5lbnVtLCBkZWNvcmF0aW9uKSBcCisJcHJpbnRfbGluZShsaW5lLCBsaW5lbnVtLCBkZWNvcmF0aW9uKQorI2VuZGlmCitzdGF0aWMgdm9pZCBwcmludF9saW5lKGNvbnN0IGNoYXIgKmxpbmUsIHNpemVfdCBsaW5lX2xlbiwgaW50IGxpbmVudW0sIGNoYXIgZGVjb3JhdGlvbikKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwkvKiBIYXBwZW5zIHdoZW4gd2UgZ28gdG8gbmV4dCBmaWxlLCBpbW1lZGlhdGVseSBoaXQgbWF0Y2gKKwkgKiBhbmQgdHJ5IHRvIHByaW50IHByZXYgY29udGV4dC4uLiBmcm9tIHByZXYgZmlsZSEgRG9uJ3QgZG8gaXQgKi8KKwlpZiAobGluZW51bSA8IDEpCisJCXJldHVybjsKKwkvKiBwb3NzaWJseSBwcmludCB0aGUgbGl0dGxlICctLScgc2VwYXJhdG9yICovCisJaWYgKChsaW5lc19iZWZvcmUgfHwgbGluZXNfYWZ0ZXIpICYmIGRpZF9wcmludF9saW5lCisJICYmIGxhc3RfbGluZV9wcmludGVkICE9IGxpbmVudW0gLSAxCisJKSB7CisJCXB1dHMoIi0tIik7CisJfQorCS8qIGd1YXJkIGFnYWluc3QgcHJpbnRpbmcgIi0tIiBiZWZvcmUgZmlyc3QgbGluZSBvZiBmaXJzdCBmaWxlICovCisJZGlkX3ByaW50X2xpbmUgPSAxOworCWxhc3RfbGluZV9wcmludGVkID0gbGluZW51bTsKKyNlbmRpZgorCWlmIChwcmludF9maWxlbmFtZSkKKwkJcHJpbnRmKCIlcyVjIiwgY3VyX2ZpbGUsIGRlY29yYXRpb24pOworCWlmIChQUklOVF9MSU5FX05VTSkKKwkJcHJpbnRmKCIlaSVjIiwgbGluZW51bSwgZGVjb3JhdGlvbik7CisJLyogRW11bGF0ZSB3ZWlyZCBHTlUgZ3JlcCBiZWhhdmlvciB3aXRoIC1vdiAqLworCWlmICgob3B0aW9uX21hc2szMiAmIChPUFRfdnxPUFRfbykpICE9IChPUFRfdnxPUFRfbykpIHsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQlwdXRzKGxpbmUpOworI2Vsc2UKKwkJZndyaXRlKGxpbmUsIDEsIGxpbmVfbGVuLCBzdGRvdXQpOworCQlwdXRjaGFyKE5VTF9ERUxJTUlURUQgPyAnXDAnIDogJ1xuJyk7CisjZW5kaWYKKwl9Cit9CisKKyNpZiBFTkFCTEVfRVhUUkFfQ09NUEFUCisvKiBVbmxpa2UgZ2V0bGluZSwgdGhpcyBvbmUgcmVtb3ZlcyB0cmFpbGluZyAnXG4nICovCitzdGF0aWMgc3NpemVfdCBGQVNUX0ZVTkMgYmJfZ2V0bGluZShjaGFyICoqbGluZV9wdHIsIHNpemVfdCAqbGluZV9hbGxvY19sZW4sIEZJTEUgKmZpbGUpCit7CisJc3NpemVfdCByZXNfc3o7CisJY2hhciAqbGluZTsKKwlpbnQgZGVsaW0gPSAoTlVMX0RFTElNSVRFRCA/ICdcMCcgOiAnXG4nKTsKKworCXJlc19zeiA9IGdldGRlbGltKGxpbmVfcHRyLCBsaW5lX2FsbG9jX2xlbiwgZGVsaW0sIGZpbGUpOworCWxpbmUgPSAqbGluZV9wdHI7CisKKwlpZiAocmVzX3N6ID4gMCkgeworCQlpZiAobGluZVtyZXNfc3ogLSAxXSA9PSBkZWxpbSkKKwkJCWxpbmVbLS1yZXNfc3pdID0gJ1wwJzsKKwl9IGVsc2UgeworCQlmcmVlKGxpbmUpOyAvKiB1Y2xpYmMgYWxsb2NhdGVzIGEgYnVmZmVyIGV2ZW4gb24gRU9GLiBXVEY/ICovCisJfQorCXJldHVybiByZXNfc3o7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBncmVwX2ZpbGUoRklMRSAqZmlsZSkKK3sKKwlzbWFsbHVpbnQgZm91bmQ7CisJaW50IGxpbmVudW0gPSAwOworCWludCBubWF0Y2hlcyA9IDA7CisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwljaGFyICpsaW5lOworI2Vsc2UKKwljaGFyICpsaW5lID0gTlVMTDsKKwlzc2l6ZV90IGxpbmVfbGVuOworCXNpemVfdCBsaW5lX2FsbG9jX2xlbjsKKyMgZGVmaW5lIHJtX3NvIHN0YXJ0WzBdCisjIGRlZmluZSBybV9lbyBlbmRbMF0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCWludCBwcmludF9uX2xpbmVzX2FmdGVyID0gMDsKKwlpbnQgY3VycG9zID0gMDsgLyogdHJhY2sgd2hlcmUgd2UgYXJlIGluIHRoZSBjaXJjdWxhciAnYmVmb3JlJyBidWZmZXIgKi8KKwlpbnQgaWR4ID0gMDsgLyogdXNlZCBmb3IgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNpcmN1bGFyIGJ1ZmZlciAqLworI2Vsc2UKKwllbnVtIHsgcHJpbnRfbl9saW5lc19hZnRlciA9IDAgfTsKKyNlbmRpZgorCisJd2hpbGUgKAorI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCShsaW5lID0geG1hbGxvY19mZ2V0bGluZShmaWxlKSkgIT0gTlVMTAorI2Vsc2UKKwkJKGxpbmVfbGVuID0gYmJfZ2V0bGluZSgmbGluZSwgJmxpbmVfYWxsb2NfbGVuLCBmaWxlKSkgPj0gMAorI2VuZGlmCisJKSB7CisJCWxsaXN0X3QgKnBhdHRlcm5fcHRyID0gcGF0dGVybl9oZWFkOworCQlncmVwX2xpc3RfZGF0YV90ICpnbCA9IGdsOyAvKiBmb3IgZ2NjICovCisKKwkJbGluZW51bSsrOworCQlmb3VuZCA9IDA7CisJCXdoaWxlIChwYXR0ZXJuX3B0cikgeworCQkJZ2wgPSAoZ3JlcF9saXN0X2RhdGFfdCAqKXBhdHRlcm5fcHRyLT5kYXRhOworCQkJaWYgKEZHUkVQX0ZMQUcpIHsKKwkJCQlmb3VuZCB8PSAoKChvcHRpb25fbWFzazMyICYgT1BUX2kpCisJCQkJCT8gc3RyY2FzZXN0cihsaW5lLCBnbC0+cGF0dGVybikKKwkJCQkJOiBzdHJzdHIobGluZSwgZ2wtPnBhdHRlcm4pCisJCQkJCSkgIT0gTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghKGdsLT5mbGdfbWVtX2Fsb2NhdGVkX2NvbXBpbGVkICYgQ09NUElMRUQpKSB7CisJCQkJCWdsLT5mbGdfbWVtX2Fsb2NhdGVkX2NvbXBpbGVkIHw9IENPTVBJTEVEOworI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCQkJCXhyZWdjb21wKCZnbC0+Y29tcGlsZWRfcmVnZXgsIGdsLT5wYXR0ZXJuLCByZWZsYWdzKTsKKyNlbHNlCisJCQkJCW1lbXNldCgmZ2wtPmNvbXBpbGVkX3JlZ2V4LCAwLCBzaXplb2YoZ2wtPmNvbXBpbGVkX3JlZ2V4KSk7CisJCQkJCWdsLT5jb21waWxlZF9yZWdleC50cmFuc2xhdGUgPSBjYXNlX2ZvbGQ7IC8qIGZvciAtaSAqLworCQkJCQlpZiAocmVfY29tcGlsZV9wYXR0ZXJuKGdsLT5wYXR0ZXJuLCBzdHJsZW4oZ2wtPnBhdHRlcm4pLCAmZ2wtPmNvbXBpbGVkX3JlZ2V4KSkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgcmVnZXggJyVzJyIsIGdsLT5wYXR0ZXJuKTsKKyNlbmRpZgorCQkJCX0KKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQkJCWdsLT5tYXRjaGVkX3JhbmdlLnJtX3NvID0gMDsKKwkJCQlnbC0+bWF0Y2hlZF9yYW5nZS5ybV9lbyA9IDA7CisjZW5kaWYKKwkJCQlpZiAoCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJCQkJcmVnZXhlYygmZ2wtPmNvbXBpbGVkX3JlZ2V4LCBsaW5lLCAxLCAmZ2wtPm1hdGNoZWRfcmFuZ2UsIDApID09IDAKKyNlbHNlCisJCQkJCXJlX3NlYXJjaCgmZ2wtPmNvbXBpbGVkX3JlZ2V4LCBsaW5lLCBsaW5lX2xlbiwKKwkJCQkJCQkvKnN0YXJ0OiovIDAsIC8qcmFuZ2U6Ki8gbGluZV9sZW4sCisJCQkJCQkJJmdsLT5tYXRjaGVkX3JhbmdlKSA+PSAwCisjZW5kaWYKKwkJCQkpIHsKKwkJCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF93KSkKKwkJCQkJCWZvdW5kID0gMTsKKwkJCQkJZWxzZSB7CisJCQkJCQljaGFyIGMgPSAnICc7CisJCQkJCQlpZiAoZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28pCisJCQkJCQkJYyA9IGxpbmVbZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28gLSAxXTsKKwkJCQkJCWlmICghaXNhbG51bShjKSAmJiBjICE9ICdfJykgeworCQkJCQkJCWMgPSBsaW5lW2dsLT5tYXRjaGVkX3JhbmdlLnJtX2VvXTsKKwkJCQkJCQlpZiAoIWMgfHwgKCFpc2FsbnVtKGMpICYmIGMgIT0gJ18nKSkKKwkJCQkJCQkJZm91bmQgPSAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyogSWYgaXQncyBub24taW52ZXJ0ZWQgc2VhcmNoLCB3ZSBjYW4gc3RvcAorCQkJICogYXQgZmlyc3QgbWF0Y2ggKi8KKwkJCWlmIChmb3VuZCAmJiAhaW52ZXJ0X3NlYXJjaCkKKwkJCQlnb3RvIGRvX2ZvdW5kOworCQkJcGF0dGVybl9wdHIgPSBwYXR0ZXJuX3B0ci0+bGluazsKKwkJfSAvKiB3aGlsZSAocGF0dGVybl9wdHIpICovCisKKwkJaWYgKGZvdW5kIF4gaW52ZXJ0X3NlYXJjaCkgeworIGRvX2ZvdW5kOgorCQkJLyoga2VlcCB0cmFjayBvZiBtYXRjaGVzICovCisJCQlubWF0Y2hlcysrOworCisJCQkvKiBxdWlldC9wcmludCAobm9uKW1hdGNoaW5nIGZpbGUgbmFtZXMgb25seT8gKi8KKwkJCWlmIChvcHRpb25fbWFzazMyICYgKE9QVF9xfE9QVF9sfE9QVF9MKSkgeworCQkJCWZyZWUobGluZSk7IC8qIHdlIGRvbid0IG5lZWQgbGluZSBhbnltb3JlICovCisJCQkJaWYgKEJFX1FVSUVUKSB7CisJCQkJCS8qIG1hbnBhZ2Ugc2F5cyBhYm91dCAtcToKKwkJCQkJICogImV4aXQgaW1tZWRpYXRlbHkgd2l0aCB6ZXJvIHN0YXR1cworCQkJCQkgKiBpZiBhbnkgbWF0Y2ggaXMgZm91bmQsCisJCQkJCSAqIGV2ZW4gaWYgZXJyb3JzIHdlcmUgZGV0ZWN0ZWQiICovCisJCQkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJCQl9CisJCQkJLyogaWYgd2UncmUganVzdCBwcmludGluZyBmaWxlbmFtZXMsIHdlIHN0b3AgYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoICovCisJCQkJaWYgKFBSSU5UX0ZJTEVTX1dJVEhfTUFUQ0hFUykgeworCQkJCQlwdXRzKGN1cl9maWxlKTsKKwkJCQkJLyogZmFsbCB0aHJvdWdoIHRvICJyZXR1cm4gMSIgKi8KKwkJCQl9CisJCQkJLyogT1BUX0wgYWthIFBSSU5UX0ZJTEVTX1dJVEhPVVRfTUFUQ0hFUzogcmV0dXJuIGVhcmx5ICovCisJCQkJcmV0dXJuIDE7IC8qIG9uZSBtYXRjaCAqLworCQkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUCisJCQkvKiBXZXJlIHdlIHByaW50aW5nIGNvbnRleHQgYW5kIHNhdyBuZXh0ICh1bndhbnRlZCkgbWF0Y2g/ICovCisJCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfbSkgJiYgbm1hdGNoZXMgPiBtYXhfbWF0Y2hlcykKKwkJCQlicmVhazsKKyNlbmRpZgorCisJCQkvKiBwcmludCB0aGUgbWF0Y2hlZCBsaW5lICovCisJCQlpZiAoUFJJTlRfTUFUQ0hfQ09VTlRTID09IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwkJCQlpbnQgcHJldnBvcyA9IChjdXJwb3MgPT0gMCkgPyBsaW5lc19iZWZvcmUgLSAxIDogY3VycG9zIC0gMTsKKworCQkJCS8qIGlmIHdlIHdlcmUgdG9sZCB0byBwcmludCAnYmVmb3JlJyBsaW5lcyBhbmQgdGhlcmUgaXMgYXQgbGVhc3QKKwkJCQkgKiBvbmUgbGluZSBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyLCBwcmludCB0aGVtICovCisJCQkJaWYgKGxpbmVzX2JlZm9yZSAmJiBiZWZvcmVfYnVmW3ByZXZwb3NdICE9IE5VTEwpIHsKKwkJCQkJaW50IGZpcnN0X2J1Zl9lbnRyeV9saW5lX251bSA9IGxpbmVudW0gLSBsaW5lc19iZWZvcmU7CisKKwkJCQkJLyogYWR2YW5jZSB0byB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlciwgYW5kCisJCQkJCSAqIGZpZ3VyZSBvdXQgdGhlIGxpbmUgbnVtYmVyIGlzIG9mIHRoZSBmaXJzdCBsaW5lIGluIHRoZQorCQkJCQkgKiBidWZmZXIgKi8KKwkJCQkJaWR4ID0gY3VycG9zOworCQkJCQl3aGlsZSAoYmVmb3JlX2J1ZltpZHhdID09IE5VTEwpIHsKKwkJCQkJCWlkeCA9IChpZHggKyAxKSAlIGxpbmVzX2JlZm9yZTsKKwkJCQkJCWZpcnN0X2J1Zl9lbnRyeV9saW5lX251bSsrOworCQkJCQl9CisKKwkJCQkJLyogbm93IHByaW50IGVhY2ggbGluZSBpbiB0aGUgYnVmZmVyLCBjbGVhcmluZyB0aGVtIGFzIHdlIGdvICovCisJCQkJCXdoaWxlIChiZWZvcmVfYnVmW2lkeF0gIT0gTlVMTCkgeworCQkJCQkJcHJpbnRfbGluZShiZWZvcmVfYnVmW2lkeF0sIGJlZm9yZV9idWZfc2l6ZVtpZHhdLCBmaXJzdF9idWZfZW50cnlfbGluZV9udW0sICctJyk7CisJCQkJCQlmcmVlKGJlZm9yZV9idWZbaWR4XSk7CisJCQkJCQliZWZvcmVfYnVmW2lkeF0gPSBOVUxMOworCQkJCQkJaWR4ID0gKGlkeCArIDEpICUgbGluZXNfYmVmb3JlOworCQkJCQkJZmlyc3RfYnVmX2VudHJ5X2xpbmVfbnVtKys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBtYWtlIGEgbm90ZSB0aGF0IHdlIG5lZWQgdG8gcHJpbnQgJ2FmdGVyJyBsaW5lcyAqLworCQkJCXByaW50X25fbGluZXNfYWZ0ZXIgPSBsaW5lc19hZnRlcjsKKyNlbmRpZgorCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX28pIHsKKwkJCQkJaWYgKEZHUkVQX0ZMQUcpIHsKKwkJCQkJCS8qIC1GbyBqdXN0IHByaW50cyB0aGUgcGF0dGVybgorCQkJCQkJICogKHVubGVzcyAtdjogLUZvdiBkb2VzbnQgcHJpbnQgYW55dGhpbmcgYXQgYWxsKSAqLworCQkJCQkJaWYgKGZvdW5kKQorCQkJCQkJCXByaW50X2xpbmUoZ2wtPnBhdHRlcm4sIHN0cmxlbihnbC0+cGF0dGVybiksIGxpbmVudW0sICc6Jyk7CisJCQkJCX0gZWxzZSB3aGlsZSAoMSkgeworCQkJCQkJdW5zaWduZWQgc3RhcnQgPSBnbC0+bWF0Y2hlZF9yYW5nZS5ybV9zbzsKKwkJCQkJCXVuc2lnbmVkIGVuZCA9IGdsLT5tYXRjaGVkX3JhbmdlLnJtX2VvOworCQkJCQkJdW5zaWduZWQgbGVuID0gZW5kIC0gc3RhcnQ7CisJCQkJCQljaGFyIG9sZCA9IGxpbmVbZW5kXTsKKwkJCQkJCWxpbmVbZW5kXSA9ICdcMCc7CisJCQkJCQkvKiBFbXB0eSBtYXRjaCBpcyBub3QgcHJpbnRlZDogdHJ5ICJlY2hvIHRlc3QgfCBncmVwIC1vICcnIiAqLworCQkJCQkJaWYgKGxlbiAhPSAwKQorCQkJCQkJCXByaW50X2xpbmUobGluZSArIHN0YXJ0LCBsZW4sIGxpbmVudW0sICc6Jyk7CisJCQkJCQlpZiAob2xkID09ICdcMCcpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlsaW5lW2VuZF0gPSBvbGQ7CisJCQkJCQlpZiAobGVuID09IDApCisJCQkJCQkJZW5kKys7CisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJCQkJCWlmIChyZWdleGVjKCZnbC0+Y29tcGlsZWRfcmVnZXgsIGxpbmUgKyBlbmQsCisJCQkJCQkJCTEsICZnbC0+bWF0Y2hlZF9yYW5nZSwgUkVHX05PVEJPTCkgIT0gMCkKKwkJCQkJCQlicmVhazsKKwkJCQkJCWdsLT5tYXRjaGVkX3JhbmdlLnJtX3NvICs9IGVuZDsKKwkJCQkJCWdsLT5tYXRjaGVkX3JhbmdlLnJtX2VvICs9IGVuZDsKKyNlbHNlCisJCQkJCQlpZiAocmVfc2VhcmNoKCZnbC0+Y29tcGlsZWRfcmVnZXgsIGxpbmUsIGxpbmVfbGVuLAorCQkJCQkJCQllbmQsIGxpbmVfbGVuIC0gZW5kLAorCQkJCQkJCQkmZ2wtPm1hdGNoZWRfcmFuZ2UpIDwgMCkKKwkJCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRfbGluZShsaW5lLCBsaW5lX2xlbiwgbGluZW51bSwgJzonKTsKKwkJCQl9CisJCQl9CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwkJZWxzZSB7IC8qIG5vIG1hdGNoICovCisJCQkvKiBpZiB3ZSBuZWVkIHRvIHByaW50IHNvbWUgY29udGV4dCBsaW5lcyBhZnRlciB0aGUgbGFzdCBtYXRjaCwgZG8gc28gKi8KKwkJCWlmIChwcmludF9uX2xpbmVzX2FmdGVyKSB7CisJCQkJcHJpbnRfbGluZShsaW5lLCBzdHJsZW4obGluZSksIGxpbmVudW0sICctJyk7CisJCQkJcHJpbnRfbl9saW5lc19hZnRlci0tOworCQkJfSBlbHNlIGlmIChsaW5lc19iZWZvcmUpIHsKKwkJCQkvKiBBZGQgdGhlIGxpbmUgdG8gdGhlIGNpcmN1bGFyICdiZWZvcmUnIGJ1ZmZlciAqLworCQkJCWZyZWUoYmVmb3JlX2J1ZltjdXJwb3NdKTsKKwkJCQliZWZvcmVfYnVmW2N1cnBvc10gPSBsaW5lOworCQkJCUlGX0VYVFJBX0NPTVBBVChiZWZvcmVfYnVmX3NpemVbY3VycG9zXSA9IGxpbmVfbGVuOykKKwkJCQljdXJwb3MgPSAoY3VycG9zICsgMSkgJSBsaW5lc19iZWZvcmU7CisJCQkJLyogYXZvaWQgZnJlZShsaW5lKSAtIHdlIHRvb2sgdGhlIGxpbmUgKi8KKwkJCQlsaW5lID0gTlVMTDsKKwkJCX0KKwkJfQorCisjZW5kaWYgLyogRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUICovCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJZnJlZShsaW5lKTsKKyNlbmRpZgorCQkvKiBEaWQgd2UgcHJpbnQgYWxsIGNvbnRleHQgYWZ0ZXIgbGFzdCByZXF1ZXN0ZWQgbWF0Y2g/ICovCisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9tKQorCQkgJiYgIXByaW50X25fbGluZXNfYWZ0ZXIKKwkJICYmIG5tYXRjaGVzID09IG1heF9tYXRjaGVzCisJCSkgeworCQkJYnJlYWs7CisJCX0KKwl9IC8qIHdoaWxlIChyZWFkIGxpbmUpICovCisKKwkvKiBzcGVjaWFsLWNhc2UgZmlsZSBwb3N0LXByb2Nlc3NpbmcgZm9yIG9wdGlvbnMgd2hlcmUgd2UgZG9uJ3QgcHJpbnQgbGluZQorCSAqIG1hdGNoZXMsIGp1c3QgZmlsZW5hbWVzIGFuZCBwb3NzaWJseSBtYXRjaCBjb3VudHMgKi8KKworCS8qIGdyZXAgLWM6IHByaW50IFtmaWxlbmFtZTpdY291bnQsIGV2ZW4gaWYgY291bnQgaXMgemVybyAqLworCWlmIChQUklOVF9NQVRDSF9DT1VOVFMpIHsKKwkJaWYgKHByaW50X2ZpbGVuYW1lKQorCQkJcHJpbnRmKCIlczoiLCBjdXJfZmlsZSk7CisJCXByaW50ZigiJWRcbiIsIG5tYXRjaGVzKTsKKwl9CisKKwkvKiBncmVwIC1MOiBwcmludCBqdXN0IHRoZSBmaWxlbmFtZSAqLworCWlmIChQUklOVF9GSUxFU19XSVRIT1VUX01BVENIRVMpIHsKKwkJLyogbm1hdGNoZXMgaXMgemVybywgbm8gbmVlZCB0byBjaGVjayBpdDoKKwkJICogd2UgcmV0dXJuIDEgZWFybHkgaWYgd2UgZGV0ZWN0ZWQgYSBtYXRjaAorCQkgKiBhbmQgUFJJTlRfRklMRVNfV0lUSE9VVF9NQVRDSEVTIGlzIHNldCAqLworCQlwdXRzKGN1cl9maWxlKTsKKwl9CisKKwlyZXR1cm4gbm1hdGNoZXM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorI2RlZmluZSBuZXdfZ3JlcF9saXN0X2RhdGEocCwgbSkgYWRkX2dyZXBfbGlzdF9kYXRhKHAsIG0pCitzdGF0aWMgY2hhciAqYWRkX2dyZXBfbGlzdF9kYXRhKGNoYXIgKnBhdHRlcm4sIGludCBmbGdfdXNlZF9tZW0pCisjZWxzZQorI2RlZmluZSBuZXdfZ3JlcF9saXN0X2RhdGEocCwgbSkgYWRkX2dyZXBfbGlzdF9kYXRhKHApCitzdGF0aWMgY2hhciAqYWRkX2dyZXBfbGlzdF9kYXRhKGNoYXIgKnBhdHRlcm4pCisjZW5kaWYKK3sKKwlncmVwX2xpc3RfZGF0YV90ICpnbCA9IHh6YWxsb2Moc2l6ZW9mKCpnbCkpOworCWdsLT5wYXR0ZXJuID0gcGF0dGVybjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCWdsLT5mbGdfbWVtX2Fsb2NhdGVkX2NvbXBpbGVkID0gZmxnX3VzZWRfbWVtOworI2Vsc2UKKwkvKmdsLT5mbGdfbWVtX2Fsb2NhdGVkX2NvbXBpbGVkID0gMDsqLworI2VuZGlmCisJcmV0dXJuIChjaGFyICopZ2w7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfcmVnZXhlc19mcm9tX2ZpbGUobGxpc3RfdCAqZm9wdCkKK3sKKwl3aGlsZSAoZm9wdCkgeworCQljaGFyICpsaW5lOworCQlGSUxFICpmcDsKKwkJbGxpc3RfdCAqY3VyID0gZm9wdDsKKwkJY2hhciAqZmZpbGUgPSBjdXItPmRhdGE7CisKKwkJZm9wdCA9IGN1ci0+bGluazsKKwkJZnJlZShjdXIpOworCQlmcCA9IHhmb3Blbl9zdGRpbihmZmlsZSk7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCQlsbGlzdF9hZGRfdG8oJnBhdHRlcm5faGVhZCwKKwkJCQluZXdfZ3JlcF9saXN0X2RhdGEobGluZSwgQUxMT0NBVEVEKSk7CisJCX0KKwkJZmNsb3NlX2lmX25vdF9zdGRpbihmcCk7CisJfQorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlX2FjdGlvbl9ncmVwKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQkJdm9pZCogbWF0Y2hlZCwKKwkJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJRklMRSAqZmlsZSA9IGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKwlpZiAoZmlsZSA9PSBOVUxMKSB7CisJCWlmICghU1VQUFJFU1NfRVJSX01TR1MpCisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlbmFtZSk7CisJCW9wZW5fZXJyb3JzID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCWN1cl9maWxlID0gZmlsZW5hbWU7CisJKihpbnQqKW1hdGNoZWQgKz0gZ3JlcF9maWxlKGZpbGUpOworCWZjbG9zZShmaWxlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBncmVwX2Rpcihjb25zdCBjaGFyICpkaXIpCit7CisJaW50IG1hdGNoZWQgPSAwOworCXJlY3Vyc2l2ZV9hY3Rpb24oZGlyLAorCQkvKiByZWN1cnNlPXllcyAqLyBBQ1RJT05fUkVDVVJTRSB8CisJCS8qIGZvbGxvd0xpbmtzPW5vICovCisJCS8qIGRlcHRoRmlyc3Q9eWVzICovIEFDVElPTl9ERVBUSEZJUlNULAorCQkvKiBmaWxlQWN0aW9uPSAqLyBmaWxlX2FjdGlvbl9ncmVwLAorCQkvKiBkaXJBY3Rpb249ICovIE5VTEwsCisJCS8qIHVzZXJEYXRhPSAqLyAmbWF0Y2hlZCwKKwkJLyogZGVwdGg9ICovIDApOworCXJldHVybiBtYXRjaGVkOworfQorCitpbnQgZ3JlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ3JlcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqZmlsZTsKKwlpbnQgbWF0Y2hlZDsKKwlsbGlzdF90ICpmb3B0ID0gTlVMTDsKKworCS8qIGRvIG5vcm1hbCBvcHRpb24gcGFyc2luZyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCWludCBDb3B0LCBvcHRzOworCisJLyogLUggdW5zZXRzIC1oOyAtQyB1bnNldHMgLUEsLUI7IC1lLC1mIGFyZSBsaXN0czsKKwkgKiAtbSwtQSwtQiwtQyBoYXZlIG51bWVyaWMgcGFyYW0gKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJILWg6Qy1BQjplOjpmOjptKzpBKzpCKzpDKyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCU9QVFNUUl9HUkVQLAorCQkmcGF0dGVybl9oZWFkLCAmZm9wdCwgJm1heF9tYXRjaGVzLAorCQkmbGluZXNfYWZ0ZXIsICZsaW5lc19iZWZvcmUsICZDb3B0KTsKKworCWlmIChvcHRzICYgT1BUX0MpIHsKKwkJLyogLUMgdW5zZXRzIHByZXYgLUEgYW5kIC1CLCBidXQgZm9sbG93aW5nIC1BIG9yIC1CCisJCSAgIG1heSBvdmVycmlkZSBpdCAqLworCQlpZiAoIShvcHRzICYgT1BUX0EpKSAvKiBub3Qgb3ZlcnJpZGRlbiAqLworCQkJbGluZXNfYWZ0ZXIgPSBDb3B0OworCQlpZiAoIShvcHRzICYgT1BUX0IpKSAvKiBub3Qgb3ZlcnJpZGRlbiAqLworCQkJbGluZXNfYmVmb3JlID0gQ29wdDsKKwl9CisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmIChvcHRzICYgKE9QVF9jfE9QVF9xfE9QVF9sfE9QVF9MKSkgeworCQlvcHRpb25fbWFzazMyICY9IH5PUFRfbjsKKwkJbGluZXNfYmVmb3JlID0gMDsKKwkJbGluZXNfYWZ0ZXIgPSAwOworCX0gZWxzZSBpZiAobGluZXNfYmVmb3JlID4gMCkgeworCQlpZiAobGluZXNfYmVmb3JlID4gSU5UX01BWCAvIHNpemVvZihsb25nIGxvbmcpKQorCQkJbGluZXNfYmVmb3JlID0gSU5UX01BWCAvIHNpemVvZihsb25nIGxvbmcpOworCQkvKiBvdmVyZmxvdyBpbiAobGluZXNfYmVmb3JlICogc2l6ZW9mKHgpKSBpcyBwcmV2ZW50ZWQgKGFib3ZlKSAqLworCQliZWZvcmVfYnVmID0geHphbGxvYyhsaW5lc19iZWZvcmUgKiBzaXplb2YoYmVmb3JlX2J1ZlswXSkpOworCQlJRl9FWFRSQV9DT01QQVQoYmVmb3JlX2J1Zl9zaXplID0geHphbGxvYyhsaW5lc19iZWZvcmUgKiBzaXplb2YoYmVmb3JlX2J1Zl9zaXplWzBdKSk7KQorCX0KKyNlbHNlCisJLyogd2l0aCBhdXRvIHNhbml0eSBjaGVja3MgKi8KKwkvKiAtSCB1bnNldHMgLWg7IC1jLC1xIG9yIC1sIHVuc2V0IC1uOyAtZSwtZiBhcmUgbGlzdHM7IC1tIE4gKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJILWg6Yy1uOnEtbjpsLW46ZTo6Zjo6bSsiOworCWdldG9wdDMyKGFyZ3YsIE9QVFNUUl9HUkVQLAorCQkmcGF0dGVybl9oZWFkLCAmZm9wdCwgJm1heF9tYXRjaGVzKTsKKyNlbmRpZgorCWludmVydF9zZWFyY2ggPSAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikgIT0gMCk7IC8qIDAgfCAxICovCisKKwl7CS8qIGNvbnZlcnQgY2hhciAqKmFyZ3YgdG8gZ3JlcF9saXN0X2RhdGFfdCAqLworCQlsbGlzdF90ICpjdXI7CisJCWZvciAoY3VyID0gcGF0dGVybl9oZWFkOyBjdXI7IGN1ciA9IGN1ci0+bGluaykKKwkJCWN1ci0+ZGF0YSA9IG5ld19ncmVwX2xpc3RfZGF0YShjdXItPmRhdGEsIDApOworCX0KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9mKSB7CisJCWxvYWRfcmVnZXhlc19mcm9tX2ZpbGUoZm9wdCk7CisJCWlmICghcGF0dGVybl9oZWFkKSB7IC8qIC1mIEVNUFRZX0ZJTEU/ICovCisJCQkvKiBHTlUgZ3JlcCB0cmVhdHMgaXQgYXMgIm5vdGhpbmcgbWF0Y2hlcyIgKi8KKwkJCWxsaXN0X2FkZF90bygmcGF0dGVybl9oZWFkLCBuZXdfZ3JlcF9saXN0X2RhdGEoKGNoYXIqKSAiIiwgMCkpOworCQkJaW52ZXJ0X3NlYXJjaCBePSAxOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVMgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2YnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9GOworCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwlpZiAoIShvcHRpb25fbWFzazMyICYgKE9QVF9vIHwgT1BUX3cpKSkKKwkJcmVmbGFncyA9IFJFR19OT1NVQjsKKyNlbmRpZgorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMKKwkgJiYgKGFwcGxldF9uYW1lWzBdID09ICdlJyB8fCAob3B0aW9uX21hc2szMiAmIE9QVF9FKSkKKwkpIHsKKwkJcmVmbGFncyB8PSBSRUdfRVhURU5ERUQ7CisJfQorI2lmIEVOQUJMRV9FWFRSQV9DT01QQVQKKwllbHNlIHsKKwkJcmVmbGFncyA9IFJFX1NZTlRBWF9HUkVQOworCX0KKyNlbmRpZgorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfaSkgeworI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCXJlZmxhZ3MgfD0gUkVHX0lDQVNFOworI2Vsc2UKKwkJaW50IGk7CisJCWNhc2VfZm9sZCA9IHhtYWxsb2MoMjU2KTsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJY2FzZV9mb2xkW2ldID0gKHVuc2lnbmVkIGNoYXIpaTsKKwkJZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQorCQkJY2FzZV9mb2xkW2ldID0gKHVuc2lnbmVkIGNoYXIpKGkgLSAoJ2EnIC0gJ0EnKSk7CisjZW5kaWYKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGlmIHdlIGRpZG4ndCBnZXQgYSBwYXR0ZXJuIGZyb20gLWUgYW5kIG5vIGNvbW1hbmQgZmlsZSB3YXMgc3BlY2lmaWVkLAorCSAqIGZpcnN0IHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHBhdHRlcm4uIG5vIHBhdHRlcm4sIG5vIHdvcmt5ICovCisJaWYgKHBhdHRlcm5faGVhZCA9PSBOVUxMKSB7CisJCWNoYXIgKnBhdHRlcm47CisJCWlmICgqYXJndiA9PSBOVUxMKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlwYXR0ZXJuID0gbmV3X2dyZXBfbGlzdF9kYXRhKCphcmd2KyssIDApOworCQlsbGlzdF9hZGRfdG8oJnBhdHRlcm5faGVhZCwgcGF0dGVybik7CisJfQorCisJLyogYXJndlswLi4oYXJnYy0xKV0gc2hvdWxkIGJlIG5hbWVzIG9mIGZpbGUgdG8gZ3JlcCB0aHJvdWdoLiBJZgorCSAqIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsZSB0byBncmVwLCB3ZSB3aWxsIHByaW50IHRoZSBmaWxlbmFtZXMuICovCisJaWYgKGFyZ3ZbMF0gJiYgYXJndlsxXSkKKwkJcHJpbnRfZmlsZW5hbWUgPSAxOworCS8qIC1IIC8gLWggb2YgY291cnNlIG92ZXJyaWRlICovCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfSCkKKwkJcHJpbnRfZmlsZW5hbWUgPSAxOworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2gpCisJCXByaW50X2ZpbGVuYW1lID0gMDsKKworCS8qIElmIG5vIGZpbGVzIHdlcmUgc3BlY2lmaWVkLCBvciAnLScgd2FzIHNwZWNpZmllZCwgdGFrZSBpbnB1dCBmcm9tCisJICogc3RkaW4uIE90aGVyd2lzZSwgd2UgZ3JlcCB0aHJvdWdoIGFsbCB0aGUgZmlsZXMgc3BlY2lmaWVkLiAqLworCW1hdGNoZWQgPSAwOworCWRvIHsKKwkJY3VyX2ZpbGUgPSAqYXJndjsKKwkJZmlsZSA9IHN0ZGluOworCQlpZiAoIWN1cl9maWxlIHx8IExPTkVfREFTSChjdXJfZmlsZSkpIHsKKwkJCWN1cl9maWxlID0gIihzdGFuZGFyZCBpbnB1dCkiOworCQl9IGVsc2UgeworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWlmIChzdGF0KGN1cl9maWxlLCAmc3QpID09IDAgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2gpKQorCQkJCQkJcHJpbnRfZmlsZW5hbWUgPSAxOworCQkJCQltYXRjaGVkICs9IGdyZXBfZGlyKGN1cl9maWxlKTsKKwkJCQkJZ290byBncmVwX2RvbmU7CisJCQkJfQorCQkJfQorCQkJLyogZWxzZTogZm9wZW4oZGlyKSB3aWxsIHN1Y2NlZWQsIGJ1dCByZWFkaW5nIHdvbid0ICovCisJCQlmaWxlID0gZm9wZW5fZm9yX3JlYWQoY3VyX2ZpbGUpOworCQkJaWYgKGZpbGUgPT0gTlVMTCkgeworCQkJCWlmICghU1VQUFJFU1NfRVJSX01TR1MpCisJCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGN1cl9maWxlKTsKKwkJCQlvcGVuX2Vycm9ycyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJbWF0Y2hlZCArPSBncmVwX2ZpbGUoZmlsZSk7CisJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZmlsZSk7CisgZ3JlcF9kb25lOiA7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisKKwkvKiBkZXN0cm95IGFsbCB0aGUgZWxtZW50cyBpbiB0aGUgcGF0dGVybiBsaXN0ICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXdoaWxlIChwYXR0ZXJuX2hlYWQpIHsKKwkJCWxsaXN0X3QgKnBhdHRlcm5faGVhZF9wdHIgPSBwYXR0ZXJuX2hlYWQ7CisJCQlncmVwX2xpc3RfZGF0YV90ICpnbCA9IChncmVwX2xpc3RfZGF0YV90ICopcGF0dGVybl9oZWFkX3B0ci0+ZGF0YTsKKworCQkJcGF0dGVybl9oZWFkID0gcGF0dGVybl9oZWFkLT5saW5rOworCQkJaWYgKGdsLT5mbGdfbWVtX2Fsb2NhdGVkX2NvbXBpbGVkICYgQUxMT0NBVEVEKQorCQkJCWZyZWUoZ2wtPnBhdHRlcm4pOworCQkJaWYgKGdsLT5mbGdfbWVtX2Fsb2NhdGVkX2NvbXBpbGVkICYgQ09NUElMRUQpCisJCQkJcmVnZnJlZSgmZ2wtPmNvbXBpbGVkX3JlZ2V4KTsKKwkJCWZyZWUoZ2wpOworCQkJZnJlZShwYXR0ZXJuX2hlYWRfcHRyKTsKKwkJfQorCX0KKwkvKiAwID0gc3VjY2VzcywgMSA9IGZhaWxlZCwgMiA9IGVycm9yICovCisJaWYgKG9wZW5fZXJyb3JzKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gIW1hdGNoZWQ7IC8qIGludmVydCByZXR1cm4gdmFsdWU6IDAgPSBzdWNjZXNzLCAxID0gZmFpbGVkICovCit9CmRpZmYgLS1naXQgYS9maW5kdXRpbHMveGFyZ3MuYyBiL2ZpbmR1dGlscy94YXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWJiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5kdXRpbHMveGFyZ3MuYwpAQCAtMCwwICsxLDU2NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB4YXJncyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIChDKSAyMDAyLDIwMDMgYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIFNwZWNpYWwgdGhhbmtzCisgKiAtIE1hcmsgV2hpdGxleSBhbmQgR2xlbm4gTWNHcmF0aCBmb3Igc3RpbXVsdXMgdG8gcmV3cml0ZSA6KQorICogLSBNaWtlIFJlbmRlbGwgPG1pY2hhZWxAY3MubXVuLmNhPgorICogYW5kIERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1Pi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIHhhcmdzIGlzIGRlc2NyaWJlZCBpbiB0aGUgU2luZ2xlIFVuaXggU3BlY2lmaWNhdGlvbiB2MyBhdAorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy94YXJncy5odG1sCisgKi8KKworLy9jb25maWc6Y29uZmlnIFhBUkdTCisvL2NvbmZpZzoJYm9vbCAieGFyZ3MiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgeGFyZ3MgaXMgdXNlZCB0byBleGVjdXRlIGEgc3BlY2lmaWVkIGNvbW1hbmQgZm9yCisvL2NvbmZpZzoJICBldmVyeSBpdGVtIGZyb20gc3RhbmRhcmQgaW5wdXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1wOiBwcm9tcHQgYW5kIGNvbmZpcm1hdGlvbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFhBUkdTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCAtcDogcHJvbXB0IHRoZSB1c2VyIHdoZXRoZXIgdG8gcnVuIGVhY2ggY29tbWFuZAorLy9jb25maWc6CSAgbGluZSBhbmQgcmVhZCBhIGxpbmUgZnJvbSB0aGUgdGVybWluYWwuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBhbmQgYmFja3NsYXNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gWEFSR1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHF1b3RpbmcgaW4gdGhlIGlucHV0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQKKy8vY29uZmlnOglib29sICJFbmFibGUgLXg6IGV4aXQgaWYgLXMgb3IgLW4gaXMgZXhjZWVkZWQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBYQVJHUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgLXg6IGV4aXQgaWYgdGhlIGNvbW1hbmQgc2l6ZSAoc2VlIHRoZSAtcyBvciAtbiBvcHRpb24pCisvL2NvbmZpZzoJICBpcyBleGNlZWRlZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0KKy8vY29uZmlnOglib29sICJFbmFibGUgLTA6IE5VTC10ZXJtaW5hdGVkIGlucHV0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gWEFSR1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IC0wOiBpbnB1dCBpdGVtcyBhcmUgdGVybWluYXRlZCBieSBhIE5VTCBjaGFyYWN0ZXIKKy8vY29uZmlnOgkgIGluc3RlYWQgb2Ygd2hpdGVzcGFjZSwgYW5kIHRoZSBxdW90ZXMgYW5kIGJhY2tzbGFzaAorLy9jb25maWc6CSAgYXJlIG5vdCBzcGVjaWFsLgorCisvL2FwcGxldDpJRl9YQVJHUyhBUFBMRVRfTk9FWEVDKHhhcmdzLCB4YXJncywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgeGFyZ3MpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfWEFSR1MpICs9IHhhcmdzLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworLy8jZGVmaW5lIGRiZ19tc2coLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZGVmaW5lIGRiZ19tc2coLi4uKSAoKHZvaWQpMCkKKworCisjaWZkZWYgVEVTVAorIyBpZm5kZWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04KKyMgIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTiAxCisjIGVuZGlmCisjIGlmbmRlZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUworIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTIDEKKyMgZW5kaWYKKyMgaWZuZGVmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVAorIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCAxCisjIGVuZGlmCisjIGlmbmRlZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTQorIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNIDEKKyMgZW5kaWYKKyNlbmRpZgorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICoqYXJnczsKKwljb25zdCBjaGFyICplb2Zfc3RyOworCWludCBpZHg7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlHLmVvZl9zdHIgPSBOVUxMOyAvKiBuZWVkIHRvIGNsZWFyIGJ5IGhhbmQgYmVjYXVzZSB3ZSBhcmUgTk9FWEVDIGFwcGxldCAqLyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGhhcyBzcGVjaWFsIGFsZ29yaXRobS4KKyAqIERvbid0IHVzZSBmb3JrIGFuZCBpbmNsdWRlIHRvIG1haW4hCisgKi8KK3N0YXRpYyBpbnQgeGFyZ3NfZXhlYyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBzcGF3bl9hbmRfd2FpdChHLmFyZ3MpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKEcuYXJnc1swXSk7CisJCXJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAxMjcgOiAxMjY7CisJfQorCWlmIChzdGF0dXMgPT0gMjU1KSB7CisJCWJiX2Vycm9yX21zZygiJXM6IGV4aXRlZCB3aXRoIHN0YXR1cyAyNTU7IGFib3J0aW5nIiwgRy5hcmdzWzBdKTsKKwkJcmV0dXJuIDEyNDsKKwl9CisJaWYgKHN0YXR1cyA+PSAweDE4MCkgeworCQliYl9lcnJvcl9tc2coIiVzOiB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAlZCIsCisJCQlHLmFyZ3NbMF0sIHN0YXR1cyAtIDB4MTgwKTsKKwkJcmV0dXJuIDEyNTsKKwl9CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIDEyMzsKKwlyZXR1cm4gMDsKK30KKworLyogSW4gUE9TSVgvQyBsb2NhbGUgaXNzcGFjZSBpcyBvbmx5IHRoZXNlIGNoYXJzOiAiXHRcblx2XGZcciIgYW5kIHNwYWNlLgorICogIlx0XG5cdlxmXHIiIGhhcHBlbiB0byBoYXZlIEFTQ0lJIGNvZGVzIDksMTAsMTEsMTIsMTMuCisgKi8KKyNkZWZpbmUgSVNTUEFDRShhKSAoeyB1bnNpZ25lZCBjaGFyIHhhcmdzX19pc3NwYWNlID0gKGEpIC0gOTsgeGFyZ3NfX2lzc3BhY2UgPT0gKCcgJyAtIDkpIHx8IHhhcmdzX19pc3NwYWNlIDw9ICgxMyAtIDkpOyB9KQorCitzdGF0aWMgdm9pZCBzdG9yZV9wYXJhbShjaGFyICpzKQoreworCS8qIEdyb3cgYnkgMjU2IGVsZW1lbnRzIGF0IG9uY2UgKi8KKwlpZiAoIShHLmlkeCAmIDB4ZmYpKSB7IC8qIEcuaWR4ID09IE4qMjU2ICovCisJCS8qIEVubGFyZ2UsIG1ha2UgRy5hcmdzWyhOKzEpKjI1NiAtIDFdIGxhc3QgdmFsaWQgaWR4ICovCisJCUcuYXJncyA9IHhyZWFsbG9jKEcuYXJncywgc2l6ZW9mKEcuYXJnc1swXSkgKiAoRy5pZHggKyAweDEwMCkpOworCX0KKwlHLmFyZ3NbRy5pZHgrK10gPSBzOworfQorCisvKiBwcm9jZXNzWzBdX3N0ZGluOgorICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYnVmW25fbWF4X2NoYXJzKzFdLCBhbmQgd2hlbiBwYXJhbWV0ZXIgZGVsaW1pdGVyCisgKiBpcyBzZWVuLCBzdG9yZSB0aGUgYWRkcmVzcyBvZiBhIG5ldyBwYXJhbWV0ZXIgdG8gYXJnc1tdLgorICogSWYgcmVhZGluZyBkaXNjb3ZlcnMgdGhhdCBsYXN0IGNoYXJzIGRvIG5vdCBmb3JtIHRoZSBjb21wbGV0ZQorICogcGFyYW1ldGVyLCB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3Qgc3VjaCAidGFpbCBjaGFyYWN0ZXIiIGlzIHJldHVybmVkLgorICogKGJ1ZiBoYXMgZXh0cmEgYnl0ZSBhdCB0aGUgZW5kIHRvIGFjY29tb2RhdGUgdGVybWluYXRpbmcgTlVMCisgKiBvZiAidGFpbCBjaGFyYWN0ZXJzIiBzdHJpbmcpLgorICogT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgcG9pbnRlciBwb2ludHMgdG8gTlVMIGJ5dGUuCisgKiBPbiBlbnRyeSwgYnVmW10gbWF5IGNvbnRhaW4gc29tZSAic2VlZCBjaGFycyIgd2hpY2ggYXJlIHRvIGJlY29tZQorICogdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyLgorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUworc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBwcm9jZXNzX3N0ZGluKGludCBuX21heF9jaGFycywgaW50IG5fbWF4X2FyZywgY2hhciAqYnVmKQoreworI2RlZmluZSBOT1JNICAgICAgMAorI2RlZmluZSBRVU9URSAgICAgMQorI2RlZmluZSBCQUNLU0xBU0ggMgorI2RlZmluZSBTUEFDRSAgICAgNAorCWNoYXIgcSA9ICdcMCc7ICAgICAgICAgICAgIC8qIHF1b3RlIGNoYXIgKi8KKwljaGFyIHN0YXRlID0gTk9STTsKKwljaGFyICpzID0gYnVmOyAgICAgICAgICAgICAvKiBzdGFydCBvZiB0aGUgd29yZCAqLworCWNoYXIgKnAgPSBzICsgc3RybGVuKGJ1Zik7IC8qIGVuZCBvZiB0aGUgd29yZCAqLworCisJYnVmICs9IG5fbWF4X2NoYXJzOyAgICAgICAgLyogcGFzdCBidWZmZXIncyBlbmQgKi8KKworCS8qICJnb3RvIHJldCIgaXMgdXNlZCBpbnN0ZWFkIG9mICJicmVhayIgdG8gbWFrZSBjb250cm9sIGZsb3cKKwkgKiBtb3JlIG9idmlvdXM6ICovCisKKwl3aGlsZSAoMSkgeworCQlpbnQgYyA9IGdldGNoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQlpZiAocCAhPSBzKQorCQkJCWdvdG8gY2xvc2Vfd29yZDsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChzdGF0ZSA9PSBCQUNLU0xBU0gpIHsKKwkJCXN0YXRlID0gTk9STTsKKwkJCWdvdG8gc2V0OworCQl9CisJCWlmIChzdGF0ZSA9PSBRVU9URSkgeworCQkJaWYgKGMgIT0gcSkKKwkJCQlnb3RvIHNldDsKKwkJCXEgPSAnXDAnOworCQkJc3RhdGUgPSBOT1JNOworCQl9IGVsc2UgeyAvKiBpZiAoc3RhdGUgPT0gTk9STSkgKi8KKwkJCWlmIChJU1NQQUNFKGMpKSB7CisJCQkJaWYgKHAgIT0gcykgeworIGNsb3NlX3dvcmQ6CisJCQkJCXN0YXRlID0gU1BBQ0U7CisJCQkJCWMgPSAnXDAnOworCQkJCQlnb3RvIHNldDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjID09ICdcXCcpIHsKKwkJCQkJc3RhdGUgPSBCQUNLU0xBU0g7CisJCQkJfSBlbHNlIGlmIChjID09ICdcJycgfHwgYyA9PSAnIicpIHsKKwkJCQkJcSA9IGM7CisJCQkJCXN0YXRlID0gUVVPVEU7CisJCQkJfSBlbHNlIHsKKyBzZXQ6CisJCQkJCSpwKysgPSBjOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc3RhdGUgPT0gU1BBQ0UpIHsgICAvKiB3b3JkJ3MgZGVsaW1pdGVyIG9yIEVPRiBkZXRlY3RlZCAqLworCQkJaWYgKHEpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5tYXRjaGVkICVzIHF1b3RlIiwKKwkJCQkJcSA9PSAnXCcnID8gInNpbmdsZSIgOiAiZG91YmxlIik7CisJCQl9CisJCQkvKiBBIGZ1bGwgd29yZCBpcyBsb2FkZWQgKi8KKwkJCWlmIChHLmVvZl9zdHIpIHsKKwkJCQlpZiAoc3RyY21wKHMsIEcuZW9mX3N0cikgPT0gMCkgeworCQkJCQl3aGlsZSAoZ2V0Y2hhcigpICE9IEVPRikKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlwID0gczsKKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJfQorCQkJc3RvcmVfcGFyYW0ocyk7CisJCQlkYmdfbXNnKCJhcmdzW106JyVzJyIsIHMpOworCQkJcyA9IHA7CisJCQluX21heF9hcmctLTsKKwkJCWlmIChuX21heF9hcmcgPT0gMCkgeworCQkJCWdvdG8gcmV0OworCQkJfQorCQkJc3RhdGUgPSBOT1JNOworCQl9CisJCWlmIChwID09IGJ1ZikgeworCQkJZ290byByZXQ7CisJCX0KKwl9CisgcmV0OgorCSpwID0gJ1wwJzsKKwkvKiBzdG9yZV9wYXJhbShOVUxMKSAtIGNhbGxlciB3aWxsIGRvIGl0ICovCisJZGJnX21zZygicmV0dXJuOiclcyciLCBzKTsKKwlyZXR1cm4gczsKK30KKyNlbHNlCisvKiBUaGUgdmFyaWFudCBkb2VzIG5vdCBzdXBwb3J0IHNpbmdsZSBxdW90ZXMsIGRvdWJsZSBxdW90ZXMgb3IgYmFja3NsYXNoICovCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHByb2Nlc3Nfc3RkaW4oaW50IG5fbWF4X2NoYXJzLCBpbnQgbl9tYXhfYXJnLCBjaGFyICpidWYpCit7CisJY2hhciAqcyA9IGJ1ZjsgICAgICAgICAgICAgLyogc3RhcnQgb2YgdGhlIHdvcmQgKi8KKwljaGFyICpwID0gcyArIHN0cmxlbihidWYpOyAvKiBlbmQgb2YgdGhlIHdvcmQgKi8KKworCWJ1ZiArPSBuX21heF9jaGFyczsgICAgICAgIC8qIHBhc3QgYnVmZmVyJ3MgZW5kICovCisKKwl3aGlsZSAoMSkgeworCQlpbnQgYyA9IGdldGNoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQlpZiAocCA9PSBzKQorCQkJCWdvdG8gcmV0OworCQl9CisJCWlmIChjID09IEVPRiB8fCBJU1NQQUNFKGMpKSB7CisJCQlpZiAocCA9PSBzKQorCQkJCWNvbnRpbnVlOworCQkJYyA9IEVPRjsKKwkJfQorCQkqcCsrID0gKGMgPT0gRU9GID8gJ1wwJyA6IGMpOworCQlpZiAoYyA9PSBFT0YpIHsgLyogd29yZCdzIGRlbGltaXRlciBvciBFT0YgZGV0ZWN0ZWQgKi8KKwkJCS8qIEEgZnVsbCB3b3JkIGlzIGxvYWRlZCAqLworCQkJaWYgKEcuZW9mX3N0cikgeworCQkJCWlmIChzdHJjbXAocywgRy5lb2Zfc3RyKSA9PSAwKSB7CisJCQkJCXdoaWxlIChnZXRjaGFyKCkgIT0gRU9GKQorCQkJCQkJY29udGludWU7CisJCQkJCXAgPSBzOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQl9CisJCQlzdG9yZV9wYXJhbShzKTsKKwkJCWRiZ19tc2coImFyZ3NbXTonJXMnIiwgcyk7CisJCQlzID0gcDsKKwkJCW5fbWF4X2FyZy0tOworCQkJaWYgKG5fbWF4X2FyZyA9PSAwKSB7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKwkJaWYgKHAgPT0gYnVmKSB7CisJCQlnb3RvIHJldDsKKwkJfQorCX0KKyByZXQ6CisJKnAgPSAnXDAnOworCS8qIHN0b3JlX3BhcmFtKE5VTEwpIC0gY2FsbGVyIHdpbGwgZG8gaXQgKi8KKwlkYmdfbXNnKCJyZXR1cm46JyVzJyIsIHMpOworCXJldHVybiBzOworfQorI2VuZGlmIC8qIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVMgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHByb2Nlc3MwX3N0ZGluKGludCBuX21heF9jaGFycywgaW50IG5fbWF4X2FyZywgY2hhciAqYnVmKQoreworCWNoYXIgKnMgPSBidWY7ICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHRoZSB3b3JkICovCisJY2hhciAqcCA9IHMgKyBzdHJsZW4oYnVmKTsgLyogZW5kIG9mIHRoZSB3b3JkICovCisKKwlidWYgKz0gbl9tYXhfY2hhcnM7ICAgICAgICAvKiBwYXN0IGJ1ZmZlcidzIGVuZCAqLworCisJd2hpbGUgKDEpIHsKKwkJaW50IGMgPSBnZXRjaGFyKCk7CisJCWlmIChjID09IEVPRikgeworCQkJaWYgKHAgPT0gcykKKwkJCQlnb3RvIHJldDsKKwkJCWMgPSAnXDAnOworCQl9CisJCSpwKysgPSBjOworCQlpZiAoYyA9PSAnXDAnKSB7ICAgLyogd29yZCdzIGRlbGltaXRlciBvciBFT0YgZGV0ZWN0ZWQgKi8KKwkJCS8qIEEgZnVsbCB3b3JkIGlzIGxvYWRlZCAqLworCQkJc3RvcmVfcGFyYW0ocyk7CisJCQlkYmdfbXNnKCJhcmdzW106JyVzJyIsIHMpOworCQkJcyA9IHA7CisJCQluX21heF9hcmctLTsKKwkJCWlmIChuX21heF9hcmcgPT0gMCkgeworCQkJCWdvdG8gcmV0OworCQkJfQorCQl9CisJCWlmIChwID09IGJ1ZikgeworCQkJZ290byByZXQ7CisJCX0KKwl9CisgcmV0OgorCSpwID0gJ1wwJzsKKwkvKiBzdG9yZV9wYXJhbShOVUxMKSAtIGNhbGxlciB3aWxsIGRvIGl0ICovCisJZGJnX21zZygicmV0dXJuOiclcyciLCBzKTsKKwlyZXR1cm4gczsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTgorLyogUHJvbXB0IHRoZSB1c2VyIGZvciBhIHJlc3BvbnNlLCBhbmQKKyAgIGlmIHRoZSB1c2VyIHJlc3BvbmRzIGFmZmlybWF0aXZlbHksIHJldHVybiB0cnVlOworICAgb3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UuIFVzZXMgIi9kZXYvdHR5Iiwgbm90IHN0ZGluLiAqLworc3RhdGljIGludCB4YXJnc19hc2tfY29uZmlybWF0aW9uKHZvaWQpCit7CisJRklMRSAqdHR5X3N0cmVhbTsKKwlpbnQgYywgc2F2ZWM7CisKKwl0dHlfc3RyZWFtID0geGZvcGVuX2Zvcl9yZWFkKENVUlJFTlRfVFRZKTsKKwlmcHV0cygiID8uLi4iLCBzdGRlcnIpOworCWZmbHVzaF9hbGwoKTsKKwljID0gc2F2ZWMgPSBnZXRjKHR0eV9zdHJlYW0pOworCXdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCisJCWMgPSBnZXRjKHR0eV9zdHJlYW0pOworCWZjbG9zZSh0dHlfc3RyZWFtKTsKKwlyZXR1cm4gKHNhdmVjID09ICd5JyB8fCBzYXZlYyA9PSAnWScpOworfQorI2Vsc2UKKyMgZGVmaW5lIHhhcmdzX2Fza19jb25maXJtYXRpb24oKSAxCisjZW5kaWYKKworLy91c2FnZTojZGVmaW5lIHhhcmdzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW1BST0cgQVJHU10iCisvL3VzYWdlOiNkZWZpbmUgeGFyZ3NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBvbiBldmVyeSBpdGVtIGdpdmVuIGJ5IHN0ZGluXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OKAorLy91c2FnZTogICAgICJcbgktcAlBc2sgdXNlciB3aGV0aGVyIHRvIHJ1biBlYWNoIGNvbW1hbmQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1yCURvbid0IHJ1biBjb21tYW5kIGlmIGlucHV0IGlzIGVtcHR5IgorLy91c2FnZToJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTSgKKy8vdXNhZ2U6ICAgICAiXG4JLTAJSW5wdXQgaXMgc2VwYXJhdGVkIGJ5IE5VTCBjaGFyYWN0ZXJzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktdAlQcmludCB0aGUgY29tbWFuZCBvbiBzdGRlcnIgYmVmb3JlIGV4ZWN1dGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWVbU1RSXQlTVFIgc3RvcHMgaW5wdXQgcHJvY2Vzc2luZyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTglQYXNzIG5vIG1vcmUgdGhhbiBOIGFyZ3MgdG8gUFJPRyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgTglQYXNzIGNvbW1hbmQgbGluZSBvZiBubyBtb3JlIHRoYW4gTiBieXRlcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUKAorLy91c2FnZTogICAgICJcbgkteAlFeGl0IGlmIHNpemUgaXMgZXhjZWVkZWQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiNkZWZpbmUgeGFyZ3NfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgfCB4YXJncyBnemlwXG4iCisvL3VzYWdlOiAgICAgICAiJCBmaW5kIC4gLW5hbWUgJyouYycgLXByaW50IHwgeGFyZ3Mgcm1cbiIKKworLyogQ29ycmVjdCByZWdhcmRsZXNzIG9mIGNvbWJpbmF0aW9uIG9mIENPTkZJR194eHggKi8KK2VudW0geworCU9QVEJJVF9WRVJCT1NFID0gMCwKKwlPUFRCSVRfTk9fRU1QVFksCisJT1BUQklUX1VQVE9fTlVNQkVSLAorCU9QVEJJVF9VUFRPX1NJWkUsCisJT1BUQklUX0VPRl9TVFJJTkcsCisJT1BUQklUX0VPRl9TVFJJTkcxLAorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04oT1BUQklUX0lOVEVSQUNUSVZFLCkKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCggICAgIE9QVEJJVF9URVJNSU5BVEUgICwpCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTSggICBPUFRCSVRfWkVST1RFUk0gICAsKQorCisJT1BUX1ZFUkJPU0UgICAgID0gMSA8PCBPUFRCSVRfVkVSQk9TRSAgICAsCisJT1BUX05PX0VNUFRZICAgID0gMSA8PCBPUFRCSVRfTk9fRU1QVFkgICAsCisJT1BUX1VQVE9fTlVNQkVSID0gMSA8PCBPUFRCSVRfVVBUT19OVU1CRVIsCisJT1BUX1VQVE9fU0laRSAgID0gMSA8PCBPUFRCSVRfVVBUT19TSVpFICAsCisJT1BUX0VPRl9TVFJJTkcgID0gMSA8PCBPUFRCSVRfRU9GX1NUUklORyAsIC8qIEdOVTogLWVbPHBhcmFtPl0gKi8KKwlPUFRfRU9GX1NUUklORzEgPSAxIDw8IE9QVEJJVF9FT0ZfU1RSSU5HMSwgLyogU1VTOiAtRTxwYXJhbT4gKi8KKwlPUFRfSU5URVJBQ1RJVkUgPSBJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OKCgxIDw8IE9QVEJJVF9JTlRFUkFDVElWRSkpICsgMCwKKwlPUFRfVEVSTUlOQVRFICAgPSBJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCggICAgICgxIDw8IE9QVEJJVF9URVJNSU5BVEUgICkpICsgMCwKKwlPUFRfWkVST1RFUk0gICAgPSBJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNKCAgICgxIDw8IE9QVEJJVF9aRVJPVEVSTSAgICkpICsgMCwKK307CisjZGVmaW5lIE9QVElPTl9TVFIgIit0cm46czplOjpFOiIgXAorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04oInAiKSBcCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQoICAgICAieCIpIFwKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNKCAgICIwIikKKworaW50IHhhcmdzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB4YXJnc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlpbnQgY2hpbGRfZXJyb3IgPSAwOworCWNoYXIgKm1heF9hcmdzOworCWNoYXIgKm1heF9jaGFyczsKKwljaGFyICpidWY7CisJdW5zaWduZWQgb3B0OworCWludCBuX21heF9jaGFyczsKKwlpbnQgbl9tYXhfYXJnOworI2lmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNCisJY2hhciogRkFTVF9GVU5DICgqcmVhZF9hcmdzKShpbnQsIGludCwgY2hhciopID0gcHJvY2Vzc19zdGRpbjsKKyNlbHNlCisjZGVmaW5lIHJlYWRfYXJncyBwcm9jZXNzX3N0ZGluCisjZW5kaWYKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0RFU0tUT1AgJiYgRU5BQkxFX0xPTkdfT1BUUworCS8qIEZvciBleGFtcGxlLCBGZWRvcmEncyBidWlsZCBzeXN0ZW0gdXNlcyAtLW5vLXJ1bi1pZi1lbXB0eSAqLworCWFwcGxldF9sb25nX29wdGlvbnMgPQorCQkibm8tcnVuLWlmLWVtcHR5XDAiIE5vX2FyZ3VtZW50ICJyIgorCQk7CisjZW5kaWYKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSLCAmbWF4X2FyZ3MsICZtYXhfY2hhcnMsICZHLmVvZl9zdHIsICZHLmVvZl9zdHIpOworCisJLyogLUUgIiI/IFlvdSBtYXkgd29uZGVyIHdoeSBub3QganVzdCBvbWl0IC1FPworCSAqIFRoaXMgaXMgdXNlZCBmb3IgcG9ydGFiaWxpdHk6CisJICogb2xkIHhhcmdzIHdhcyB1c2luZyAiXyIgYXMgZGVmYXVsdCBmb3IgLUUgLyAtZSAqLworCWlmICgob3B0ICYgT1BUX0VPRl9TVFJJTkcxKSAmJiBHLmVvZl9zdHJbMF0gPT0gJ1wwJykKKwkJRy5lb2Zfc3RyID0gTlVMTDsKKworCWlmIChvcHQgJiBPUFRfWkVST1RFUk0pCisJCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0ocmVhZF9hcmdzID0gcHJvY2VzczBfc3RkaW4pOworCisJYXJndiArPSBvcHRpbmQ7CisJYXJnYyAtPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKSB7CisJCS8qIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZWNobyBhbGwgdGhlIGZpbGVuYW1lcyAqLworCQkqLS1hcmd2ID0gKGNoYXIqKSJlY2hvIjsKKwkJYXJnYysrOworCX0KKworCS8qIC1zIE5VTSBkZWZhdWx0LiBmaWxldXRpbHMtNC40LjIgdXNlcyAxMjhrLCBidXQgSSBoZWFzaXRhdGUKKwkgKiB0byB1c2Ugc3VjaCBhIGJpZyB2YWx1ZSAtIGZpcnN0IG5lZWQgdG8gY2hhbmdlIGNvZGUgdG8gdXNlCisJICogZ3Jvd2FibGUgYnVmZmVyIGluc3RlYWQgb2YgZml4ZWQgb25lLgorCSAqLworCW5fbWF4X2NoYXJzID0gMzIgKiAxMDI0OworCS8qIE1ha2Ugc21hbGxlciBpZiBzeXN0ZW0gZG9lcyBub3QgYWxsb3cgb3VyIGRlZmF1bHQgdmFsdWUuCisJICogVGhlIE9wZW4gR3JvdXAgQmFzZSBTcGVjaWZpY2F0aW9ucyBJc3N1ZSA2OgorCSAqICJUaGUgeGFyZ3MgdXRpbGl0eSBzaGFsbCBsaW1pdCB0aGUgY29tbWFuZCBsaW5lIGxlbmd0aCBzdWNoIHRoYXQKKwkgKiB3aGVuIHRoZSBjb21tYW5kIGxpbmUgaXMgaW52b2tlZCwgdGhlIGNvbWJpbmVkIGFyZ3VtZW50CisJICogYW5kIGVudmlyb25tZW50IGxpc3RzIChzZWUgdGhlIGV4ZWMgZmFtaWx5IG9mIGZ1bmN0aW9ucworCSAqIGluIHRoZSBTeXN0ZW0gSW50ZXJmYWNlcyB2b2x1bWUgb2YgSUVFRSBTdGQgMTAwMy4xLTIwMDEpCisJICogc2hhbGwgbm90IGV4Y2VlZCB7QVJHX01BWH0tMjA0OCBieXRlcyIuCisJICovCisJeworCQlsb25nIGFyZ19tYXggPSAwOworI2lmIGRlZmluZWQgX1NDX0FSR19NQVgKKwkJYXJnX21heCA9IHN5c2NvbmYoX1NDX0FSR19NQVgpIC0gMjA0ODsKKyNlbGlmIGRlZmluZWQgQVJHX01BWAorCQlhcmdfbWF4ID0gQVJHX01BWCAtIDIwNDg7CisjZW5kaWYKKwkJaWYgKGFyZ19tYXggPiAwICYmIG5fbWF4X2NoYXJzID4gYXJnX21heCkKKwkJCW5fbWF4X2NoYXJzID0gYXJnX21heDsKKwl9CisJaWYgKG9wdCAmIE9QVF9VUFRPX1NJWkUpIHsKKwkJbl9tYXhfY2hhcnMgPSB4YXRvdV9yYW5nZShtYXhfY2hhcnMsIDEsIElOVF9NQVgpOworCX0KKwkvKiBBY2NvdW50IGZvciBwcmVwZW5kZWQgZml4ZWQgYXJndW1lbnRzICovCisJeworCQlzaXplX3Qgbl9jaGFycyA9IDA7CisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQkJbl9jaGFycyArPSBzdHJsZW4oYXJndltpXSkgKyAxOworCQl9CisJCW5fbWF4X2NoYXJzIC09IG5fY2hhcnM7CisJfQorCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChuX21heF9jaGFycyA8PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaXQgc2luZ2xlIGFyZ3VtZW50IHdpdGhpbiBhcmd1bWVudCBsaXN0IHNpemUgbGltaXQiKTsKKwl9CisKKwlidWYgPSB4emFsbG9jKG5fbWF4X2NoYXJzICsgMSk7CisKKwluX21heF9hcmcgPSBuX21heF9jaGFyczsKKwlpZiAob3B0ICYgT1BUX1VQVE9fTlVNQkVSKSB7CisJCW5fbWF4X2FyZyA9IHhhdG91X3JhbmdlKG1heF9hcmdzLCAxLCBJTlRfTUFYKTsKKwkJLyogTm90IG5lY2Vzc2FyeSwgd2UgdXNlIGdyb3dhYmxlIGFyZ3NbXTogKi8KKwkJLyogaWYgKG5fbWF4X2FyZyA+IG5fbWF4X2NoYXJzKSBuX21heF9hcmcgPSBuX21heF9jaGFycyAqLworCX0KKworCS8qIEFsbG9jYXRlIHBvaW50ZXJzIGZvciBleGVjdnAgKi8KKwkvKiBXZSBjYW4gc3RhdGljYWxseSBhbGxvY2F0ZSAoYXJnYyArIG5fbWF4X2FyZyArIDEpIGVsZW1lbnRzCisJICogYW5kIGRvIG5vdCBib3RoZXIgd2l0aCByZXNpemluZyBhcmdzW10sIGJ1dCBvbiA2NC1iaXQgbWFjaGluZXMKKwkgKiB0aGlzIHJlc3VsdHMgaW4gYXJnc1tdIHZlY3RvciB3aGljaCBpcyB+OCB0aW1lcyBiaWdnZXIKKwkgKiB0aGFuIG5fbWF4X2NoYXJzISBUaGF0IGlzLCB3aXRoIG5fbWF4X2NoYXJzID09IDIwaywKKwkgKiBhcmdzW10gd2lsbCB0YWtlIDE2MGsgKCEpLCB3aGljaCB3aWxsIG1vc3QgbGlrZWx5IGJlCisJICogYWxtb3N0IGVudGlyZWx5IHVudXNlZC4KKwkgKi8KKwkvKiBTZWUgc3RvcmVfcGFyYW0oKSBmb3IgbWF0Y2hpbmcgMjU2LXN0ZXAgZ3Jvd3RoIGxvZ2ljICovCisJRy5hcmdzID0geG1hbGxvYyhzaXplb2YoRy5hcmdzWzBdKSAqICgoYXJnYyArIDB4ZmYpICYgfjB4ZmYpKTsKKworCS8qIFN0b3JlIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLCBwYXJ0IDEgKi8KKwlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspCisJCUcuYXJnc1tpXSA9IGFyZ3ZbaV07CisKKwl3aGlsZSAoMSkgeworCQljaGFyICpyZW07CisKKwkJRy5pZHggPSBhcmdjOworCQlyZW0gPSByZWFkX2FyZ3Mobl9tYXhfY2hhcnMsIG5fbWF4X2FyZywgYnVmKTsKKwkJc3RvcmVfcGFyYW0oTlVMTCk7CisKKwkJaWYgKCFHLmFyZ3NbYXJnY10pIHsKKwkJCWlmICgqcmVtICE9ICdcMCcpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFyZ3VtZW50IGxpbmUgdG9vIGxvbmciKTsKKwkJCWlmIChvcHQgJiBPUFRfTk9fRU1QVFkpCisJCQkJYnJlYWs7CisJCX0KKwkJb3B0IHw9IE9QVF9OT19FTVBUWTsKKworCQlpZiAob3B0ICYgKE9QVF9JTlRFUkFDVElWRSB8IE9QVF9WRVJCT1NFKSkgeworCQkJY29uc3QgY2hhciAqZm10ID0gIiAlcyIgKyAxOworCQkJY2hhciAqKmFyZ3MgPSBHLmFyZ3M7CisJCQlmb3IgKGkgPSAwOyBhcmdzW2ldOyBpKyspIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzW2ldKTsKKwkJCQlmbXQgPSAiICVzIjsKKwkJCX0KKwkJCWlmICghKG9wdCAmIE9QVF9JTlRFUkFDVElWRSkpCisJCQkJYmJfcHV0Y2hhcl9zdGRlcnIoJ1xuJyk7CisJCX0KKworCQlpZiAoIShvcHQgJiBPUFRfSU5URVJBQ1RJVkUpIHx8IHhhcmdzX2Fza19jb25maXJtYXRpb24oKSkgeworCQkJY2hpbGRfZXJyb3IgPSB4YXJnc19leGVjKCk7CisJCX0KKworCQlpZiAoY2hpbGRfZXJyb3IgPiAwICYmIGNoaWxkX2Vycm9yICE9IDEyMykgeworCQkJYnJlYWs7CisJCX0KKworCQlvdmVybGFwcGluZ19zdHJjcHkoYnVmLCByZW0pOworCX0gLyogd2hpbGUgKi8KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKEcuYXJncyk7CisJCWZyZWUoYnVmKTsKKwl9CisKKwlyZXR1cm4gY2hpbGRfZXJyb3I7Cit9CisKKworI2lmZGVmIFRFU1QKKworY29uc3QgY2hhciAqYXBwbGV0X25hbWUgPSAiZGVidWcgc3R1ZmYgdXNhZ2UiOworCit2b2lkIGJiX3Nob3dfdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLXBdIFstcl0gWy10XSAtW3hdIFstbiBtYXhfYXJnXSBbLXMgbWF4X2NoYXJzXVxuIiwKKwkJYXBwbGV0X25hbWUpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJldHVybiB4YXJnc19tYWluKGFyZ2MsIGFyZ3YpOworfQorI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXBwbGV0X21ldGFkYXRhLmggYi9pbmNsdWRlL2FwcGxldF9tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmVmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FwcGxldF9tZXRhZGF0YS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgQVBQTEVUX01FVEFEQVRBX0gKKyNkZWZpbmUgQVBQTEVUX01FVEFEQVRBX0ggMQorCisvKiBOb3RlOiBjYW4gYmUgaW5jbHVkZWQgYnkgYm90aCBob3N0IGFuZCB0YXJnZXQgYnVpbGRzISAqLworCisvKiBvcmRlciBtYXR0ZXJzOiB1c2VkIGFzIGluZGV4IGludG8gImluc3RhbGxfZGlyW10iIGluIGFwcGxldGxpYi5jICovCit0eXBlZGVmIGVudW0gYmJfaW5zdGFsbF9sb2NfdCB7CisJQkJfRElSX1JPT1QgPSAwLAorCUJCX0RJUl9CSU4sCisJQkJfRElSX1NCSU4sCisjaWYgRU5BQkxFX0lOU1RBTExfTk9fVVNSCisJQkJfRElSX1VTUl9CSU4gID0gQkJfRElSX0JJTiwKKwlCQl9ESVJfVVNSX1NCSU4gPSBCQl9ESVJfU0JJTiwKKyNlbHNlCisJQkJfRElSX1VTUl9CSU4sCisJQkJfRElSX1VTUl9TQklOLAorI2VuZGlmCit9IGJiX2luc3RhbGxfbG9jX3Q7CisKK3R5cGVkZWYgZW51bSBiYl9zdWlkX3QgeworCUJCX1NVSURfRFJPUCA9IDAsCisJQkJfU1VJRF9NQVlCRSwKKwlCQl9TVUlEX1JFUVVJUkUKK30gYmJfc3VpZF90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXBwbGV0cy5zcmMuaCBiL2luY2x1ZGUvYXBwbGV0cy5zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJiOWJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hcHBsZXRzLnNyYy5oCkBAIC0wLDAgKzEsNDI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhcHBsZXRzLmggLSBhIGxpc3Rpbmcgb2YgYWxsIGJ1c3lib3ggYXBwbGV0cy4KKyAqCisgKiBJZiB5b3Ugd3JpdGUgYSBuZXcgYXBwbGV0LCB5b3UgbmVlZCB0byBhZGQgYW4gZW50cnkgdG8gdGhpcyBsaXN0IHRvIG1ha2UKKyAqIGJ1c3lib3ggYXdhcmUgb2YgaXQuCisgKi8KKworLyoKK25hbWUgIC0gYXBwbGV0IG5hbWUgYXMgaXQgaXMgdHlwZWQgb24gY29tbWFuZCBsaW5lCituYW1lMiAtIGFwcGxldCBuYW1lLCBjb252ZXJ0ZWQgdG8gQyAoZXRoZXItd2FrZTogbmFtZTIgPSBldGhlcl93YWtlKQorbWFpbiAgLSBjb3JyZXNwb25kaW5nIDxhcHBsZXQ+X21haW4gdG8gY2FsbCAoYnpjYXQ6IG1haW4gPSBidW56aXAyKQorbCAgICAgLSBsb2NhdGlvbiB0byBpbnN0YWxsIGxpbmsgdG86IFsvdXNyXS9bc11iaW4KK3MgICAgIC0gc3VpZCB0eXBlOgorICAgICAgICBCQl9TVUlEX1JFUVVJUkU6IHdpbGwgY29tcGxhaW4gaWYgYnVzeWJveCBpc24ndCBzdWlkCisgICAgICAgIGFuZCBpcyBydW4gYnkgbm9uLXJvb3QgKGFwcGxldF9tYWluKCkgd2lsbCBub3QgYmUgY2FsbGVkIGF0IGFsbCkKKyAgICAgICAgQkJfU1VJRF9EUk9QOiB3aWxsIGRyb3Agc3VpZCBwcmlvciB0byBhcHBsZXRfbWFpbigpCisgICAgICAgIEJCX1NVSURfTUFZQkU6IG5laXRoZXIgb2YgdGhlIGFib3ZlCisgICAgICAgIChldmVyeSBpbnN0YW5jZSBvZiBCQl9TVUlEX1JFUVVJUkUgYW5kIEJCX1NVSURfTUFZQkUKKyAgICAgICAgbmVlZHMgdG8gYmUganVzdGlmaWVkIGluIGNvbW1lbnQpCisgICAgICAgIE5COiBwbGVhc2UgdXBkYXRlIEZFQVRVUkVfU1VJRCBoZWxwIHRleHQgd2hlbmV2ZXIgeW91IGFkZC9yZW1vdmUKKyAgICAgICAgQkJfU1VJRF9SRVFVSVJFIG9yIEJCX1NVSURfTUFZQkUgYXBwbGV0LgorKi8KKworI2lmIGRlZmluZWQoUFJPVE9UWVBFUykKKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIGludCBuYW1lIyNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxuYW1lMikgaW50IG1haW4jI19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisjIGRlZmluZSBBUFBMRVRfTk9FWEVDKG5hbWUsbWFpbixsLHMsbmFtZTIpICBpbnQgbWFpbiMjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyMgZGVmaW5lIEFQUExFVF9OT0ZPUksobmFtZSxtYWluLGwscyxuYW1lMikgIGludCBtYWluIyNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworCisjZWxpZiBkZWZpbmVkKE5BTUVfTUFJTl9DTkFNRSkKKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIG5hbWUgbmFtZSMjX21haW4gbmFtZQorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxuYW1lMikgbmFtZSBtYWluIyNfbWFpbiBuYW1lMgorIyBkZWZpbmUgQVBQTEVUX05PRVhFQyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgbmFtZSBtYWluIyNfbWFpbiBuYW1lMgorIyBkZWZpbmUgQVBQTEVUX05PRk9SSyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgbmFtZSBtYWluIyNfbWFpbiBuYW1lMgorCisjZWxpZiBkZWZpbmVkKE1BS0VfVVNBR0UpICYmIEVOQUJMRV9GRUFUVVJFX1ZFUkJPU0VfVVNBR0UKKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUjI190cml2aWFsX3VzYWdlIG5hbWUjI19mdWxsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxuYW1lMikgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZTIjI190cml2aWFsX3VzYWdlIG5hbWUyIyNfZnVsbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxuYW1lMikgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUyIyNfdHJpdmlhbF91c2FnZSBuYW1lMiMjX2Z1bGxfdXNhZ2UpCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsbmFtZTIpICBNQUtFX1VTQUdFKCNuYW1lLCBuYW1lMiMjX3RyaXZpYWxfdXNhZ2UgbmFtZTIjI19mdWxsX3VzYWdlKQorCisjZWxpZiBkZWZpbmVkKE1BS0VfVVNBR0UpICYmICFFTkFCTEVfRkVBVFVSRV9WRVJCT1NFX1VTQUdFCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLHMpICAgICAgICAgICAgICAgICAgICBNQUtFX1VTQUdFKCNuYW1lLCBuYW1lIyNfdHJpdmlhbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9PREROQU1FKG5hbWUsbWFpbixsLHMsbmFtZTIpIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUyIyNfdHJpdmlhbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxuYW1lMikgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUyIyNfdHJpdmlhbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9OT0ZPUksobmFtZSxtYWluLGwscyxuYW1lMikgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUyIyNfdHJpdmlhbF91c2FnZSkKKworI2VsaWYgZGVmaW5lZChNQUtFX0xJTktTKQorIyBkZWZpbmUgQVBQTEVUKG5hbWUsbCxjKSAgICAgICAgICAgICAgICAgICAgTElOSyBsIG5hbWUKKyMgZGVmaW5lIEFQUExFVF9PREROQU1FKG5hbWUsbWFpbixsLHMsbmFtZTIpIExJTksgbCBuYW1lCisjIGRlZmluZSBBUFBMRVRfTk9FWEVDKG5hbWUsbWFpbixsLHMsbmFtZTIpICBMSU5LIGwgbmFtZQorIyBkZWZpbmUgQVBQTEVUX05PRk9SSyhuYW1lLG1haW4sbCxzLG5hbWUyKSAgTElOSyBsIG5hbWUKKworI2Vsc2UKKyAgc3RhdGljIHN0cnVjdCBiYl9hcHBsZXQgYXBwbGV0c1tdID0geyAvKiAgICBuYW1lLCBtYWluLCBsb2NhdGlvbiwgbmVlZF9zdWlkICovCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLHMpICAgICAgICAgICAgICAgICAgICB7ICNuYW1lLCAjbmFtZSwgbCwgcyB9LAorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxuYW1lMikgeyAjbmFtZSwgI21haW4sIGwsIHMgfSwKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxuYW1lMikgIHsgI25hbWUsICNtYWluLCBsLCBzLCAxIH0sCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsbmFtZTIpICB7ICNuYW1lLCAjbWFpbiwgbCwgcywgMSwgMSB9LAorI2VuZGlmCisKKyNpZiBFTkFCTEVfSU5TVEFMTF9OT19VU1IKKyMgZGVmaW5lIEJCX0RJUl9VU1JfQklOIEJCX0RJUl9CSU4KKyMgZGVmaW5lIEJCX0RJUl9VU1JfU0JJTiBCQl9ESVJfU0JJTgorI2VuZGlmCisKKworSU5TRVJUCitJRl9URVNUKEFQUExFVF9OT0ZPUksoWywgIHRlc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRlc3QpKQorSUZfVEVTVChBUFBMRVRfTk9GT1JLKFtbLCB0ZXN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB0ZXN0KSkKK0lGX0FDUElEKEFQUExFVChhY3BpZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BRERHUk9VUChBUFBMRVQoYWRkZ3JvdXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BRERVU0VSKEFQUExFVChhZGR1c2VyLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQURKVElNRVgoQVBQTEVUKGFkanRpbWV4LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FSKEFQUExFVChhciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BUlAoQVBQTEVUKGFycCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BUlBJTkcoQVBQTEVUKGFycGluZywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BV0soQVBQTEVUX05PRVhFQyhhd2ssIGF3aywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgYXdrKSkKK0lGX0JBU0VOQU1FKEFQUExFVF9OT0ZPUksoYmFzZW5hbWUsIGJhc2VuYW1lLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBiYXNlbmFtZSkpCitJRl9CQkNPTkZJRyhBUFBMRVQoYmJjb25maWcsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9CRUVQKEFQUExFVChiZWVwLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JMS0lEKEFQUExFVChibGtpZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9CUkNUTChBUFBMRVQoYnJjdGwsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JaSVAyKEFQUExFVChiemlwMiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DQUwoQVBQTEVUKGNhbCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DQVQoQVBQTEVUX05PRk9SSyhjYXQsIGNhdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjYXQpKQorSUZfQ0FUVihBUFBMRVQoY2F0diwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NIQVQoQVBQTEVUKGNoYXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hBVFRSKEFQUExFVChjaGF0dHIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSENPTihBUFBMRVQoY2hjb24sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hHUlAoQVBQTEVUX05PRVhFQyhjaGdycCwgY2hncnAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgY2hncnApKQorSUZfQ0hNT0QoQVBQTEVUX05PRVhFQyhjaG1vZCwgY2htb2QsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgY2htb2QpKQorSUZfQ0hPV04oQVBQTEVUX05PRVhFQyhjaG93biwgY2hvd24sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgY2hvd24pKQorSUZfQ0hQQVNTV0QoQVBQTEVUKGNocGFzc3dkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSFBTVChBUFBMRVQoY2hwc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hST09UKEFQUExFVChjaHJvb3QsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NIUlQoQVBQTEVUKGNocnQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hWVChBUFBMRVQoY2h2dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DS1NVTShBUFBMRVRfTk9FWEVDKGNrc3VtLCBja3N1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgY2tzdW0pKQorSUZfQ0xFQVIoQVBQTEVUKGNsZWFyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NNUChBUFBMRVQoY21wLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NPTU0oQVBQTEVUKGNvbW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ1AoQVBQTEVUX05PRVhFQyhjcCwgY3AsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgY3ApKQorSUZfQ1BJTyhBUFBMRVQoY3BpbywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NST05EKEFQUExFVChjcm9uZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgdG8gYmUgcnVuIGJ5IHJvb3Qgb3IgYmUgc3VpZCByb290IC0gbmVlZHMgdG8gY2hhbmdlIC92YXIvc3Bvb2wvY3JvbiogZmlsZXM6ICovCitJRl9DUk9OVEFCKEFQUExFVChjcm9udGFiLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX0NSWVBUUFcoQVBQTEVUKGNyeXB0cHcsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ1VUKEFQUExFVF9OT0VYRUMoY3V0LCBjdXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGN1dCkpCitJRl9EQyhBUFBMRVQoZGMsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfREQoQVBQTEVUX05PRVhFQyhkZCwgZGQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZGQpKQorSUZfREVBTExPQ1ZUKEFQUExFVChkZWFsbG9jdnQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfREVMR1JPVVAoQVBQTEVUX09ERE5BTUUoZGVsZ3JvdXAsIGRlbHVzZXIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZGVsZ3JvdXApKQorSUZfREVMVVNFUihBUFBMRVQoZGVsdXNlciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RFVkZTRChBUFBMRVQoZGV2ZnNkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RFVk1FTShBUFBMRVQoZGV2bWVtLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RGKEFQUExFVChkZiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RIQ1BSRUxBWShBUFBMRVQoZGhjcHJlbGF5LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ESUZGKEFQUExFVChkaWZmLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RJUk5BTUUoQVBQTEVUX05PRk9SSyhkaXJuYW1lLCBkaXJuYW1lLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBkaXJuYW1lKSkKK0lGX0RNRVNHKEFQUExFVChkbWVzZywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ROU0QoQVBQTEVUKGRuc2QsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0hPU1ROQU1FKEFQUExFVF9PREROQU1FKGRuc2RvbWFpbm5hbWUsIGhvc3RuYW1lLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGRuc2RvbWFpbm5hbWUpKQorSUZfRE9TMlVOSVgoQVBQTEVUX05PRVhFQyhkb3MydW5peCwgZG9zMnVuaXgsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGRvczJ1bml4KSkKK0lGX0RQS0coQVBQTEVUKGRwa2csIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRFBLR19ERUIoQVBQTEVUX09ERE5BTUUoZHBrZy1kZWIsIGRwa2dfZGViLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBkcGtnX2RlYikpCitJRl9EVShBUFBMRVQoZHUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRFVNUEtNQVAoQVBQTEVUKGR1bXBrbWFwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRFVNUExFQVNFUyhBUFBMRVQoZHVtcGxlYXNlcywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL0lGX0UyRlNDSyhBUFBMRVQoZTJmc2NrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vSUZfRTJMQUJFTChBUFBMRVRfT0RETkFNRShlMmxhYmVsLCB0dW5lMmZzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBlMmxhYmVsKSkKK0lGX0VDSE8oQVBQTEVUX05PRk9SSyhlY2hvLCBlY2hvLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGVjaG8pKQorSUZfRUQoQVBQTEVUKGVkLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRUpFQ1QoQVBQTEVUKGVqZWN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0VOVihBUFBMRVRfTk9FWEVDKGVudiwgZW52LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBlbnYpKQorSUZfRU5WRElSKEFQUExFVF9PREROQU1FKGVudmRpciwgY2hwc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGVudmRpcikpCitJRl9FTlZVSURHSUQoQVBQTEVUX09ERE5BTUUoZW52dWlkZ2lkLCBjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZW52dWlkZ2lkKSkKK0lGX0VUSEVSX1dBS0UoQVBQTEVUX09ERE5BTUUoZXRoZXItd2FrZSwgZXRoZXJfd2FrZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZXRoZXJfd2FrZSkpCitJRl9FWFBBTkQoQVBQTEVUKGV4cGFuZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9FWFBSKEFQUExFVChleHByLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZBS0VJREVOVEQoQVBQTEVUKGZha2VpZGVudGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZBTFNFKEFQUExFVF9OT0ZPUksoZmFsc2UsIGZhbHNlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGZhbHNlKSkKK0lGX0ZCU0VUKEFQUExFVChmYnNldCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkJTUExBU0goQVBQTEVUKGZic3BsYXNoLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZERkxVU0goQVBQTEVUX09ERE5BTUUoZmRmbHVzaCwgZnJlZXJhbWRpc2ssIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZmRmbHVzaCkpCitJRl9GREZPUk1BVChBUFBMRVQoZmRmb3JtYXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkRJU0soQVBQTEVUKGZkaXNrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZHQ09OU09MRShBUFBMRVQoZmdjb25zb2xlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIEJlbmVmaXRzIGZyb20gc3VpZCByb290OiBiZXR0ZXIgYWNjZXNzIHRvIC9kZXYvQkxPQ0tERVZzOiAqLworSUZfRklOREZTKEFQUExFVChmaW5kZnMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX01BWUJFKSkKK0lGX0ZMQVNIX0VSQVNFQUxMKEFQUExFVChmbGFzaF9lcmFzZWFsbCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkxBU0hfTE9DSyhBUFBMRVRfT0RETkFNRShmbGFzaF9sb2NrLCBmbGFzaF9sb2NrX3VubG9jaywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIGZsYXNoX2xvY2spKQorSUZfRkxBU0hfVU5MT0NLKEFQUExFVF9PREROQU1FKGZsYXNoX3VubG9jaywgZmxhc2hfbG9ja191bmxvY2ssIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCBmbGFzaF91bmxvY2spKQorSUZfRkxBU0hDUChBUFBMRVQoZmxhc2hjcCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkxPQ0soQVBQTEVUKGZsb2NrLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZPTEQoQVBQTEVUX05PRVhFQyhmb2xkLCBmb2xkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBmb2xkKSkKK0lGX0ZSRUUoQVBQTEVUKGZyZWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRlJFRVJBTURJU0soQVBQTEVUKGZyZWVyYW1kaXNrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZTQ0soQVBQTEVUKGZzY2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLy9JRl9FMkZTQ0soQVBQTEVUX09ERE5BTUUoZnNjay5leHQyLCBlMmZzY2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIGZzY2tfZXh0MikpCisvL0lGX0UyRlNDSyhBUFBMRVRfT0RETkFNRShmc2NrLmV4dDMsIGUyZnNjaywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgZnNja19leHQzKSkKK0lGX0ZTQ0tfTUlOSVgoQVBQTEVUX09ERE5BTUUoZnNjay5taW5peCwgZnNja19taW5peCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgZnNja19taW5peCkpCitJRl9GU1lOQyhBUFBMRVRfTk9GT1JLKGZzeW5jLCBmc3luYywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBmc3luYykpCitJRl9GVFBEKEFQUExFVChmdHBkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GVFBHRVQoQVBQTEVUX09ERE5BTUUoZnRwZ2V0LCBmdHBnZXRwdXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGZ0cGdldCkpCitJRl9GVFBQVVQoQVBQTEVUX09ERE5BTUUoZnRwcHV0LCBmdHBnZXRwdXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGZ0cHB1dCkpCitJRl9GVVNFUihBUFBMRVQoZnVzZXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfR0VURU5GT1JDRShBUFBMRVQoZ2V0ZW5mb3JjZSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfR0VUT1BUKEFQUExFVChnZXRvcHQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRTRUJPT0woQVBQTEVUKGdldHNlYm9vbCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfR0VUVFkoQVBQTEVUKGdldHR5LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0dVTlpJUChBUFBMRVQoZ3VuemlwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfR1pJUChBUFBMRVQoZ3ppcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0hEKEFQUExFVF9OT0VYRUMoaGQsIGhleGR1bXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhkKSkKK0lGX0hEUEFSTShBUFBMRVQoaGRwYXJtLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0hFQUQoQVBQTEVUX05PRVhFQyhoZWFkLCBoZWFkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBoZWFkKSkKK0lGX0hFWERVTVAoQVBQTEVUX05PRVhFQyhoZXhkdW1wLCBoZXhkdW1wLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBoZXhkdW1wKSkKK0lGX0hPU1RJRChBUFBMRVRfTk9GT1JLKGhvc3RpZCwgaG9zdGlkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBob3N0aWQpKQorSUZfSE9TVE5BTUUoQVBQTEVUKGhvc3RuYW1lLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSFRUUEQoQVBQTEVUKGh0dHBkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9IV0NMT0NLKEFQUExFVChod2Nsb2NrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lGQ09ORklHKEFQUExFVChpZmNvbmZpZywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JRlVQRE9XTihBUFBMRVRfT0RETkFNRShpZmRvd24sIGlmdXBkb3duLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBpZmRvd24pKQorSUZfSUZFTlNMQVZFKEFQUExFVChpZmVuc2xhdmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSUZQTFVHRChBUFBMRVQoaWZwbHVnZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JRlVQRE9XTihBUFBMRVRfT0RETkFNRShpZnVwLCBpZnVwZG93biwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgaWZ1cCkpCitJRl9JTkVURChBUFBMRVQoaW5ldGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lOT1RJRllEKEFQUExFVChpbm90aWZ5ZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JTlNUQUxMKEFQUExFVChpbnN0YWxsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lPTklDRShBUFBMRVQoaW9uaWNlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX0FERFJFU1MgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX1JPVVRFIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JUF9MSU5LIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JUF9UVU5ORUwgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX1JVTEUKK0lGX0lQKEFQUExFVChpcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKyNlbmRpZgorSUZfSVBBRERSKEFQUExFVChpcGFkZHIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JUENBTEMoQVBQTEVUKGlwY2FsYywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQQ1JNKEFQUExFVChpcGNybSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JUENTKEFQUExFVChpcGNzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQTElOSyhBUFBMRVQoaXBsaW5rLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBST1VURShBUFBMRVQoaXByb3V0ZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQUlVMRShBUFBMRVQoaXBydWxlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBUVU5ORUwoQVBQTEVUKGlwdHVubmVsLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfS0JEX01PREUoQVBQTEVUKGtiZF9tb2RlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0tJTEwoQVBQTEVUKGtpbGwsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9LSUxMQUxMKEFQUExFVF9PREROQU1FKGtpbGxhbGwsIGtpbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGtpbGxhbGwpKQorSUZfS0lMTEFMTDUoQVBQTEVUX09ERE5BTUUoa2lsbGFsbDUsIGtpbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGtpbGxhbGw1KSkKK0lGX0tMT0dEKEFQUExFVChrbG9nZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MQVNUKEFQUExFVChsYXN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vSUZfTEVOR1RIKEFQUExFVF9OT0ZPUksobGVuZ3RoLCBsZW5ndGgsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGxlbmd0aCkpCitJRl9MRVNTKEFQUExFVChsZXNzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVEFSQ0goQVBQTEVUX09ERE5BTUUobGludXgzMiwgc2V0YXJjaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBsaW51eDMyKSkKK0lGX1NFVEFSQ0goQVBQTEVUX09ERE5BTUUobGludXg2NCwgc2V0YXJjaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBsaW51eDY0KSkKK0lGX0xOKEFQUExFVF9OT0VYRUMobG4sIGxuLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGxuKSkKK0lGX0xPQURfUE9MSUNZKEFQUExFVChsb2FkX3BvbGljeSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTE9BREtNQVAoQVBQTEVUKGxvYWRrbWFwLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xPR0dFUihBUFBMRVQobG9nZ2VyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE5lZWRzIHRvIGJlIHJ1biBieSByb290IG9yIGJlIHN1aWQgcm9vdCAtIG5lZWRzIHRvIGNoYW5nZSB1aWQgYW5kIGdpZDogKi8KK0lGX0xPR0lOKEFQUExFVChsb2dpbiwgQkJfRElSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX0xPR05BTUUoQVBQTEVUX05PRk9SSyhsb2duYW1lLCBsb2duYW1lLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsb2duYW1lKSkKK0lGX0xPR1JFQUQoQVBQTEVUKGxvZ3JlYWQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTE9TRVRVUChBUFBMRVQobG9zZXR1cCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MUEQoQVBQTEVUKGxwZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTFBRKEFQUExFVF9PREROQU1FKGxwcSwgbHBxciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbHBxKSkKK0lGX0xQUihBUFBMRVRfT0RETkFNRShscHIsIGxwcXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGxwcikpCitJRl9MUyhBUFBMRVRfTk9FWEVDKGxzLCBscywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBscykpCitJRl9MU0FUVFIoQVBQTEVUKGxzYXR0ciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xTUENJKEFQUExFVChsc3BjaSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MU1VTQihBUFBMRVQobHN1c2IsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5MWk1BKEFQUExFVF9PREROQU1FKGx6Y2F0LCB1bmx6bWEsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGx6Y2F0KSkKK0lGX0xaTUEoQVBQTEVUX09ERE5BTUUobHptYSwgdW5sem1hLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsem1hKSkKK0lGX0xaT1AoQVBQTEVUKGx6b3AsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MWk9QKEFQUExFVF9PREROQU1FKGx6b3BjYXQsIGx6b3AsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGx6b3BjYXQpKQorSUZfTUFLRURFVlMoQVBQTEVUKG1ha2VkZXZzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01BS0VNSU1FKEFQUExFVChtYWtlbWltZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01BTihBUFBMRVQobWFuLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01BVENIUEFUSENPTihBUFBMRVQobWF0Y2hwYXRoY29uLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NRDVTVU0oQVBQTEVUX05PRVhFQyhtZDVzdW0sIG1kNV9zaGExX3N1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbWQ1c3VtKSkKK0lGX01ERVYoQVBQTEVUKG1kZXYsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTUlDUk9DT00oQVBQTEVUKG1pY3JvY29tLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01LRElSKEFQUExFVF9OT0ZPUksobWtkaXIsIG1rZGlyLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIG1rZGlyKSkKK0lGX01LRlNfVkZBVChBUFBMRVRfT0RETkFNRShta2Rvc2ZzLCBta2ZzX3ZmYXQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1rZnNfdmZhdCkpCitJRl9NS0ZTX0VYVDIoQVBQTEVUX09ERE5BTUUobWtlMmZzLCBta2ZzX2V4dDIsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1rZnNfZXh0MikpCitJRl9NS0ZJRk8oQVBQTEVUX05PRVhFQyhta2ZpZm8sIG1rZmlmbywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbWtmaWZvKSkKK0lGX01LRlNfRVhUMihBUFBMRVRfT0RETkFNRShta2ZzLmV4dDIsIG1rZnNfZXh0MiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc19leHQyKSkKKy8vSUZfTUtFMkZTKEFQUExFVF9PREROQU1FKG1rZnMuZXh0MywgbWtlMmZzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX2V4dDMpKQorSUZfTUtGU19NSU5JWChBUFBMRVRfT0RETkFNRShta2ZzLm1pbml4LCBta2ZzX21pbml4LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX21pbml4KSkKK0lGX01LRlNfUkVJU0VSKEFQUExFVF9PREROQU1FKG1rZnMucmVpc2VyLCBta2ZzX3JlaXNlciwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc19yZWlzZXIpKQorSUZfTUtGU19WRkFUKEFQUExFVF9PREROQU1FKG1rZnMudmZhdCwgbWtmc192ZmF0LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX3ZmYXQpKQorSUZfTUtOT0QoQVBQTEVUX05PRVhFQyhta25vZCwgbWtub2QsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgbWtub2QpKQorSUZfQ1JZUFRQVyhBUFBMRVRfT0RETkFNRShta3Bhc3N3ZCwgY3J5cHRwdywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbWtwYXNzd2QpKQorSUZfTUtTV0FQKEFQUExFVChta3N3YXAsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTUtURU1QKEFQUExFVChta3RlbXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NT1JFKEFQUExFVChtb3JlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLyogT24gZnVsbC1ibG93biBzeXN0ZW1zLCByZXF1aXJlcyBzdWlkIGZvciB1c2VyIG1vdW50cy4KKyAqIEJ1dCBpdCdzIG5vdCB1bnRoaW5rYWJsZSB0byBoYXZlIGl0IGF2YWlsYWJsZSBpbiBub24tc3VpZCBmbGF2b3Igb24gc29tZSBzeXN0ZW1zLAorICogZm9yIHZpZXdpbmcgbW91bnQgdGFibGUuCisgKiBUaGVyZWZvcmUgd2UgdXNlIEJCX1NVSURfTUFZQkUgaW5zdGVhZCBvZiBCQl9TVUlEX1JFUVVJUkU6ICovCitJRl9NT1VOVChBUFBMRVQobW91bnQsIEJCX0RJUl9CSU4sIElGX0RFU0tUT1AoQkJfU1VJRF9NQVlCRSkgSUZfTk9UX0RFU0tUT1AoQkJfU1VJRF9EUk9QKSkpCitJRl9NT1VOVFBPSU5UKEFQUExFVChtb3VudHBvaW50LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTVQoQVBQTEVUKG10LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTVYoQVBQTEVUKG12LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTkFNRUlGKEFQUExFVChuYW1laWYsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTkFORERVTVAoQVBQTEVUKG5hbmRkdW1wLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9OQU5EV1JJVEUoQVBQTEVUKG5hbmR3cml0ZSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTkMoQVBQTEVUKG5jLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05FVFNUQVQoQVBQTEVUKG5ldHN0YXQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9OSUNFKEFQUExFVChuaWNlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTk9IVVAoQVBQTEVUKG5vaHVwLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05TTE9PS1VQKEFQUExFVChuc2xvb2t1cCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9OVFBEKEFQUExFVChudHBkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9PRChBUFBMRVQob2QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfT1BFTlZUKEFQUExFVChvcGVudnQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLy9JRl9QQVJTRShBUFBMRVQocGFyc2UsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgdG8gYmUgcnVuIGJ5IHJvb3Qgb3IgYmUgc3VpZCByb290IC0gbmVlZHMgdG8gY2hhbmdlIC9ldGMve3Bhc3N3ZCxzaGFkb3d9OiAqLworSUZfUEFTU1dEKEFQUExFVChwYXNzd2QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfUEdSRVAoQVBQTEVUKHBncmVwLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BJRE9GKEFQUExFVChwaWRvZiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BJUEVfUFJPR1JFU1MoQVBQTEVUKHBpcGVfcHJvZ3Jlc3MsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QSVZPVF9ST09UKEFQUExFVChwaXZvdF9yb290LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BLSUxMKEFQUExFVF9PREROQU1FKHBraWxsLCBwZ3JlcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgcGtpbGwpKQorSUZfUE9QTUFJTERJUihBUFBMRVQocG9wbWFpbGRpciwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUFJJTlRFTlYoQVBQTEVUX05PRk9SSyhwcmludGVudiwgcHJpbnRlbnYsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcHJpbnRlbnYpKQorSUZfUFJJTlRGKEFQUExFVF9OT0ZPUksocHJpbnRmLCBwcmludGYsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHByaW50ZikpCitJRl9QUyhBUFBMRVQocHMsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QU0NBTihBUFBMRVQocHNjYW4sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUFdEKEFQUExFVF9OT0ZPUksocHdkLCBwd2QsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcHdkKSkKK0lGX1JBSURBVVRPUlVOKEFQUExFVChyYWlkYXV0b3J1biwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SREFURShBUFBMRVQocmRhdGUsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JERVYoQVBQTEVUKHJkZXYsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFQURBSEVBRChBUFBMRVQocmVhZGFoZWFkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFQURMSU5LKEFQUExFVChyZWFkbGluaywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRUFEUFJPRklMRShBUFBMRVQocmVhZHByb2ZpbGUsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFQUxQQVRIKEFQUExFVChyZWFscGF0aCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRUZPUk1JTUUoQVBQTEVUKHJlZm9ybWltZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFTklDRShBUFBMRVQocmVuaWNlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFU0VUKEFQUExFVChyZXNldCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRVNJWkUoQVBQTEVUKHJlc2l6ZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRVNUT1JFQ09OKEFQUExFVF9PREROQU1FKHJlc3RvcmVjb24sIHNldGZpbGVzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCByZXN0b3JlY29uKSkKK0lGX1JGS0lMTChBUFBMRVQocmZraWxsLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9STShBUFBMRVRfTk9GT1JLKHJtLCBybSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBybSkpCitJRl9STURJUihBUFBMRVRfTk9GT1JLKHJtZGlyLCBybWRpciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBybWRpcikpCitJRl9ST1VURShBUFBMRVQocm91dGUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlBNKEFQUExFVChycG0sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SUE0yQ1BJTyhBUFBMRVQocnBtMmNwaW8sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlRDV0FLRShBUFBMRVQocnRjd2FrZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SVU5fUEFSVFMoQVBQTEVUX09ERE5BTUUocnVuLXBhcnRzLCBydW5fcGFydHMsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcnVuX3BhcnRzKSkKK0lGX1JVTkNPTihBUFBMRVQocnVuY29uLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JVTkxFVkVMKEFQUExFVChydW5sZXZlbCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SVU5TVihBUFBMRVQocnVuc3YsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlVOU1ZESVIoQVBQTEVUKHJ1bnN2ZGlyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JYKEFQUExFVChyeCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TQ1JJUFQoQVBQTEVUKHNjcmlwdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TQ1JJUFRSRVBMQVkoQVBQTEVUKHNjcmlwdHJlcGxheSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFRChBUFBMRVQoc2VkLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VMSU5VWEVOQUJMRUQoQVBQTEVUKHNlbGludXhlbmFibGVkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRU5ETUFJTChBUFBMRVQoc2VuZG1haWwsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFUShBUFBMRVRfTk9GT1JLKHNlcSwgc2VxLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzZXEpKQorSUZfU0VTVEFUVVMoQVBQTEVUKHNlc3RhdHVzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRBUkNIKEFQUExFVChzZXRhcmNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUQ09OU09MRShBUFBMRVQoc2V0Y29uc29sZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRFTkZPUkNFKEFQUExFVChzZXRlbmZvcmNlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRGSUxFUyhBUFBMRVQoc2V0ZmlsZXMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VURk9OVChBUFBMRVQoc2V0Zm9udCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUS0VZQ09ERVMoQVBQTEVUKHNldGtleWNvZGVzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVExPR0NPTlMoQVBQTEVUKHNldGxvZ2NvbnMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVFNFQk9PTChBUFBMRVQoc2V0c2Vib29sLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRTSUQoQVBQTEVUKHNldHNpZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRVSURHSUQoQVBQTEVUX09ERE5BTUUoc2V0dWlkZ2lkLCBjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc2V0dWlkZ2lkKSkKK0lGX1NIQTFTVU0oQVBQTEVUX05PRVhFQyhzaGExc3VtLCBtZDVfc2hhMV9zdW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNoYTFzdW0pKQorSUZfU0hBMjU2U1VNKEFQUExFVF9OT0VYRUMoc2hhMjU2c3VtLCBtZDVfc2hhMV9zdW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNoYTI1NnN1bSkpCitJRl9TSEE1MTJTVU0oQVBQTEVUX05PRVhFQyhzaGE1MTJzdW0sIG1kNV9zaGExX3N1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc2hhNTEyc3VtKSkKK0lGX1NIT1dLRVkoQVBQTEVUKHNob3drZXksIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0xBVFRBQ0goQVBQTEVUKHNsYXR0YWNoLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIERvIG5vdCBtYWtlIHRoaXMgYXBwbGV0IE5PRk9SSy4gSXQgYnJlYWtzIF5DLWluZyBvZiBwYXVzZXMgaW4gc2hlbGxzOiAqLworSUZfU0xFRVAoQVBQTEVUKHNsZWVwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU09GVExJTUlUKEFQUExFVF9PREROQU1FKHNvZnRsaW1pdCwgY2hwc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNvZnRsaW1pdCkpCitJRl9TT1JUKEFQUExFVF9OT0VYRUMoc29ydCwgc29ydCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc29ydCkpCitJRl9TUExJVChBUFBMRVQoc3BsaXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1RBUlRfU1RPUF9EQUVNT04oQVBQTEVUX09ERE5BTUUoc3RhcnQtc3RvcC1kYWVtb24sIHN0YXJ0X3N0b3BfZGFlbW9uLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBzdGFydF9zdG9wX2RhZW1vbikpCitJRl9TVEFUKEFQUExFVChzdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1RSSU5HUyhBUFBMRVQoc3RyaW5ncywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TVFRZKEFQUExFVChzdHR5LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgdG8gYmUgcnVuIGJ5IHJvb3Qgb3IgYmUgc3VpZCByb290IC0gbmVlZHMgdG8gY2hhbmdlIHVpZCBhbmQgZ2lkOiAqLworSUZfU1UoQVBQTEVUKHN1LCBCQl9ESVJfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfU1VMT0dJTihBUFBMRVQoc3Vsb2dpbiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TVU0oQVBQTEVUKHN1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TVihBUFBMRVQoc3YsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1ZMT0dEKEFQUExFVChzdmxvZ2QsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NXQVBPTk9GRihBUFBMRVRfT0RETkFNRShzd2Fwb2ZmLCBzd2FwX29uX29mZiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgc3dhcG9mZikpCitJRl9TV0FQT05PRkYoQVBQTEVUX09ERE5BTUUoc3dhcG9uLCBzd2FwX29uX29mZiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgc3dhcG9uKSkKK0lGX1NXSVRDSF9ST09UKEFQUExFVChzd2l0Y2hfcm9vdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TWU5DKEFQUExFVF9OT0ZPUksoc3luYywgc3luYywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBzeW5jKSkKK0lGX0JCX1NZU0NUTChBUFBMRVQoc3lzY3RsLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NZU0xPR0QoQVBQTEVUKHN5c2xvZ2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEFDKEFQUExFVF9OT0VYRUModGFjLCB0YWMsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRhYykpCitJRl9UQUlMKEFQUExFVCh0YWlsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RBUihBUFBMRVQodGFyLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEFTS1NFVChBUFBMRVQodGFza3NldCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvKiBJRl9UQyhBUFBMRVQodGMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKSAqLworSUZfVENQU1ZEKEFQUExFVF9PREROQU1FKHRjcHN2ZCwgdGNwdWRwc3ZkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB0Y3BzdmQpKQorSUZfVEVFKEFQUExFVCh0ZWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEVMTkVUKEFQUExFVCh0ZWxuZXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEVMTkVURChBUFBMRVQodGVsbmV0ZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEVTVChBUFBMRVRfTk9GT1JLKHRlc3QsIHRlc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRlc3QpKQorI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfR0VUIHx8IEVOQUJMRV9GRUFUVVJFX1RGVFBfUFVUCitJRl9URlRQKEFQUExFVCh0ZnRwLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RGVFBEKEFQUExFVCh0ZnRwZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisjZW5kaWYKK0lGX1RJTUUoQVBQTEVUKHRpbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVElNRU9VVChBUFBMRVQodGltZW91dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UT1AoQVBQTEVUKHRvcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UUihBUFBMRVQodHIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApLCB0aGVyZWZvcmUgQkJfU1VJRF9NQVlCRTogKi8KK0lGX1RSQUNFUk9VVEUoQVBQTEVUKHRyYWNlcm91dGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX01BWUJFKSkKK0lGX1RSQUNFUk9VVEU2KEFQUExFVCh0cmFjZXJvdXRlNiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfTUFZQkUpKQorSUZfVFJVRShBUFBMRVRfTk9GT1JLKHRydWUsIHRydWUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgdHJ1ZSkpCitJRl9UVFkoQVBQTEVUKHR0eSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UVFlTSVpFKEFQUExFVCh0dHlzaXplLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RVTkNUTChBUFBMRVQodHVuY3RsLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RVTkUyRlMoQVBQTEVUKHR1bmUyZnMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVURIQ1BDKEFQUExFVCh1ZGhjcGMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVURIQ1BEKEFQUExFVCh1ZGhjcGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VEUFNWRChBUFBMRVRfT0RETkFNRSh1ZHBzdmQsIHRjcHVkcHN2ZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdWRwc3ZkKSkKK0lGX1VNT1VOVChBUFBMRVQodW1vdW50LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5BTUUoQVBQTEVUKHVuYW1lLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5DT01QUkVTUyhBUFBMRVQodW5jb21wcmVzcywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VORVhQQU5EKEFQUExFVF9PREROQU1FKHVuZXhwYW5kLCBleHBhbmQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHVuZXhwYW5kKSkKK0lGX1VOSVEoQVBQTEVUKHVuaXEsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5JWDJET1MoQVBQTEVUX05PRVhFQyh1bml4MmRvcywgZG9zMnVuaXgsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHVuaXgyZG9zKSkKK0lGX1VOWFooQVBQTEVUKHVueHosIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5MWk1BKEFQUExFVCh1bmx6bWEsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTFpPUChBUFBMRVRfT0RETkFNRSh1bmx6b3AsIGx6b3AsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHVubHpvcCkpCitJRl9VTlpJUChBUFBMRVQodW56aXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVVBUSU1FKEFQUExFVCh1cHRpbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVVNMRUVQKEFQUExFVF9OT0ZPUksodXNsZWVwLCB1c2xlZXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgdXNsZWVwKSkKK0lGX1VVREVDT0RFKEFQUExFVCh1dWRlY29kZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9VVUVOQ09ERShBUFBMRVQodXVlbmNvZGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVkNPTkZJRyhBUFBMRVQodmNvbmZpZywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byBjaGFuZ2UgdWlkIGFuZCBnaWQ6ICovCitJRl9WTE9DSyhBUFBMRVQodmxvY2ssIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfVk9MTkFNRShBUFBMRVQodm9sbmFtZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byB3cml0ZSB0byAvZGV2L1RUWTogKi8KK0lGX1dBTEwoQVBQTEVUKHdhbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfV0FUQ0goQVBQTEVUKHdhdGNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfV0FUQ0hET0coQVBQTEVUKHdhdGNoZG9nLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1dDKEFQUExFVCh3YywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XR0VUKEFQUExFVCh3Z2V0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1dISUNIKEFQUExFVCh3aGljaCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XSE9BTUkoQVBQTEVUX05PRk9SSyh3aG9hbWksIHdob2FtaSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgd2hvYW1pKSkKK0lGX1VOWFooQVBQTEVUX09ERE5BTUUoeHpjYXQsIHVueHosIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHh6Y2F0KSkKK0lGX1haKEFQUExFVF9PREROQU1FKHh6LCB1bnh6LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB4eikpCitJRl9ZRVMoQVBQTEVUX05PRk9SSyh5ZXMsIHllcywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgeWVzKSkKK0lGX0dVTlpJUChBUFBMRVRfT0RETkFNRSh6Y2F0LCBndW56aXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgemNhdCkpCitJRl9aQ0lQKEFQUExFVCh6Y2lwLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworI2lmICFkZWZpbmVkKFBST1RPVFlQRVMpICYmICFkZWZpbmVkKE5BTUVfTUFJTl9DTkFNRSkgJiYgIWRlZmluZWQoTUFLRV9VU0FHRSkKK307CisjZW5kaWYKKworI3VuZGVmIEFQUExFVAorI3VuZGVmIEFQUExFVF9PREROQU1FCisjdW5kZWYgQVBQTEVUX05PRVhFQworI3VuZGVmIEFQUExFVF9OT0ZPUksKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXIuaCBiL2luY2x1ZGUvYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODZmZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBidXN5Ym94IGFyIGFyY2hpdmUgZGF0YSBzdHJ1Y3R1cmVzCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIEFSX0gKKyNkZWZpbmUgQVJfSAorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworc3RydWN0IGFyX2hlYWRlciB7CisJY2hhciBuYW1lWzE2XTsKKwljaGFyIGRhdGVbMTJdOworCWNoYXIgdWlkWzZdOworCWNoYXIgZ2lkWzZdOworCWNoYXIgbW9kZVs4XTsKKwljaGFyIHNpemVbMTBdOworCWNoYXIgbWFnaWNbMl07Cit9OworCisjZGVmaW5lIEFSX0hFQURFUl9MRU4gc2l6ZW9mKHN0cnVjdCBhcl9oZWFkZXIpCisjZGVmaW5lIEFSX01BR0lDICAgICAgIiE8YXJjaD4iCisjZGVmaW5lIEFSX01BR0lDX0xFTiAgNworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJjaGl2ZS5oIGIvaW5jbHVkZS9hcmNoaXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxNzZkMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXJjaGl2ZS5oCkBAIC0wLDAgKzEsMjQxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgVU5BUkNISVZFX0gKKyNkZWZpbmUgVU5BUkNISVZFX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZW51bSB7CisjaWYgQkJfQklHX0VORElBTgorCUNPTVBSRVNTX01BR0lDID0gMHgxZjlkLAorCUdaSVBfTUFHSUMgID0gMHgxZjhiLAorCUJaSVAyX01BR0lDID0gMjU2ICogJ0InICsgJ1onLAorCS8qIC54eiBzaWduYXR1cmU6IDB4ZmQsICc3JywgJ3onLCAnWCcsICdaJywgMHgwMCAqLworCS8qIE1vcmUgaW5mbyBhdDogaHR0cDovL3R1a2Fhbmkub3JnL3h6L3h6LWZpbGUtZm9ybWF0LnR4dCAqLworCVhaX01BR0lDMSAgID0gMjU2ICogMHhmZCArICc3JywKKwlYWl9NQUdJQzIgICA9IDI1NiAqICgyNTYgKiAoMjU2ICogJ3onICsgJ1gnKSArICdaJykgKyAwLAorCS8qIERpZmZlcmVudCBmb3JtOiAzMiBiaXRzLCB0aGVuIDE2IGJpdHM6ICovCisJWFpfTUFHSUMxYSAgPSAyNTYgKiAoMjU2ICogKDI1NiAqIDB4ZmQgKyAnNycpICsgJ3onKSArICdYJywKKwlYWl9NQUdJQzJhICA9IDI1NiAqICdaJyArIDAsCisjZWxzZQorCUNPTVBSRVNTX01BR0lDID0gMHg5ZDFmLAorCUdaSVBfTUFHSUMgID0gMHg4YjFmLAorCUJaSVAyX01BR0lDID0gJ0InICsgJ1onICogMjU2LAorCVhaX01BR0lDMSAgID0gMHhmZCArICc3JyAqIDI1NiwKKwlYWl9NQUdJQzIgICA9ICd6JyArICgnWCcgKyAoJ1onICsgMCAqIDI1NikgKiAyNTYpICogMjU2LAorCVhaX01BR0lDMWEgID0gMHhmZCArICgnNycgKyAoJ3onICsgJ1gnICogMjU2KSAqIDI1NikgKiAyNTYsCisJWFpfTUFHSUMyYSAgPSAnWicgKyAwICogMjU2LAorI2VuZGlmCit9OworCit0eXBlZGVmIHN0cnVjdCBmaWxlX2hlYWRlcl90IHsKKwljaGFyICpuYW1lOworCWNoYXIgKmxpbmtfdGFyZ2V0OworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCWNoYXIgKnRhcl9fdW5hbWU7CisJY2hhciAqdGFyX19nbmFtZTsKKyNlbmRpZgorCW9mZl90IHNpemU7CisJdWlkX3QgdWlkOworCWdpZF90IGdpZDsKKwltb2RlX3QgbW9kZTsKKwl0aW1lX3QgbXRpbWU7CisJZGV2X3QgZGV2aWNlOworfSBmaWxlX2hlYWRlcl90OworCitzdHJ1Y3QgaGFyZGxpbmtzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgeworCS8qIEZsYWdzLiAxc3Qgc2luY2UgaXQgaXMgbW9zdCB1c2VkIG1lbWJlciAqLworCXVuc2lnbmVkIGFoX2ZsYWdzOworCisJLyogVGhlIHJhdyBzdHJlYW0gYXMgcmVhZCBmcm9tIGRpc2sgb3Igc3RkaW4gKi8KKwlpbnQgc3JjX2ZkOworCisJLyogRGVmaW5lIGlmIHRoZSBoZWFkZXIgYW5kIGRhdGEgY29tcG9uZW50IHNob3VsZCBiZSBwcm9jZXNzZWQgKi8KKwljaGFyIEZBU1RfRlVOQyAoKmZpbHRlcikoc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgKik7CisJLyogTGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBhY2NlcHRlZCAqLworCWxsaXN0X3QgKmFjY2VwdDsKKwkvKiBMaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHJlamVjdGVkICovCisJbGxpc3RfdCAqcmVqZWN0OworCS8qIExpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIHN1Y2Nlc3NmdWxseSBiZWVuIHdvcmtlZCBvbiAqLworCWxsaXN0X3QgKnBhc3NlZDsKKworCS8qIEN1cnJlbnRseSBwcm9jZXNzZWQgZmlsZSdzIGhlYWRlciAqLworCWZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyOworCisJLyogUHJvY2VzcyB0aGUgaGVhZGVyIGNvbXBvbmVudCwgZS5nLiB0YXIgLXQgKi8KKwl2b2lkIEZBU1RfRlVOQyAoKmFjdGlvbl9oZWFkZXIpKGNvbnN0IGZpbGVfaGVhZGVyX3QgKik7CisKKwkvKiBQcm9jZXNzIHRoZSBkYXRhIGNvbXBvbmVudCwgZS5nLiBleHRyYWN0IHRvIGZpbGVzeXN0ZW0gKi8KKwl2b2lkIEZBU1RfRlVOQyAoKmFjdGlvbl9kYXRhKShzdHJ1Y3QgYXJjaGl2ZV9oYW5kbGVfdCAqKTsKKworCS8qIEZ1bmN0aW9uIHRoYXQgc2tpcHMgZGF0YSAqLworCXZvaWQgRkFTVF9GVU5DICgqc2VlaykoaW50IGZkLCBvZmZfdCBhbW91bnQpOworCisJLyogQ291bnQgcHJvY2Vzc2VkIGJ5dGVzICovCisJb2ZmX3Qgb2Zmc2V0OworCisJLyogQXJjaGl2ZXIgc3BlY2lmaWMuIENhbiBtYWtlIGl0IGEgdW5pb24gaWYgaXQgZXZlciBnZXRzIGJpZyAqLworI2lmIEVOQUJMRV9UQVIgfHwgRU5BQkxFX0RQS0cgfHwgRU5BQkxFX0RQS0dfREVCCisJc21hbGxpbnQgdGFyX19lbmQ7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCWNoYXIqIHRhcl9fbG9uZ25hbWU7CisJY2hhciogdGFyX19saW5rbmFtZTsKKyMgZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVE9fQ09NTUFORAorCWNoYXIqIHRhcl9fdG9fY29tbWFuZDsKKwljb25zdCBjaGFyKiB0YXJfX3RvX2NvbW1hbmRfc2hlbGw7CisjZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1NFTElOVVgKKwljaGFyKiB0YXJfX2dsb2JhbF9zY3R4OworCWNoYXIqIHRhcl9fbmV4dF9maWxlX3NjdHg7CisjIGVuZGlmCisjZW5kaWYKKyNpZiBFTkFCTEVfQ1BJTyB8fCBFTkFCTEVfUlBNMkNQSU8gfHwgRU5BQkxFX1JQTQorCXVvZmZfdCBjcGlvX19ibG9ja3M7CisJc3RydWN0IGhhcmRsaW5rc190ICpjcGlvX19oYXJkbGlua3NfdG9fY3JlYXRlOworCXN0cnVjdCBoYXJkbGlua3NfdCAqY3Bpb19fY3JlYXRlZF9oYXJkbGlua3M7CisjZW5kaWYKKyNpZiBFTkFCTEVfRFBLRyB8fCBFTkFCTEVfRFBLR19ERUIKKwkvKiBUZW1wb3Jhcnkgc3RvcmFnZSAqLworCWNoYXIgKmRwa2dfX2J1ZmZlcjsKKwkvKiBIb3cgdG8gcHJvY2VzcyBhbnkgc3ViIGFyY2hpdmUsIGUuZy4gZ2V0X2hlYWRlcl90YXJfZ3ogKi8KKwljaGFyIEZBU1RfRlVOQyAoKmRwa2dfX2FjdGlvbl9kYXRhX3N1YmFyY2hpdmUpKHN0cnVjdCBhcmNoaXZlX2hhbmRsZV90ICopOworCS8qIENvbnRhaW5zIHRoZSBoYW5kbGUgdG8gYSBzdWIgYXJjaGl2ZSAqLworCXN0cnVjdCBhcmNoaXZlX2hhbmRsZV90ICpkcGtnX19zdWJfYXJjaGl2ZTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0NSRUFURQorCWNvbnN0IGNoYXIgKmFyX19uYW1lOworCXN0cnVjdCBhcmNoaXZlX2hhbmRsZV90ICphcl9fb3V0OworI2VuZGlmCit9IGFyY2hpdmVfaGFuZGxlX3Q7CisvKiBiaXRzIGluIGFoX2ZsYWdzICovCisjZGVmaW5lIEFSQ0hJVkVfUkVTVE9SRV9EQVRFICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBBUkNISVZFX0NSRUFURV9MRUFESU5HX0RJUlMgKDEgPDwgMSkKKyNkZWZpbmUgQVJDSElWRV9VTkxJTktfT0xEICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFSQ0hJVkVfRVhUUkFDVF9RVUlFVCAgICAgICAoMSA8PCAzKQorI2RlZmluZSBBUkNISVZFX0VYVFJBQ1RfTkVXRVIgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQVJDSElWRV9ET05UX1JFU1RPUkVfT1dORVIgICgxIDw8IDUpCisjZGVmaW5lIEFSQ0hJVkVfRE9OVF9SRVNUT1JFX1BFUk0gICAoMSA8PCA2KQorI2RlZmluZSBBUkNISVZFX05VTUVSSUNfT1dORVIgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgQVJDSElWRV9PX1RSVU5DICAgICAgICAgICAgICgxIDw8IDgpCisKKworLyogUE9TSVggdGFyIEhlYWRlciBCbG9jaywgZnJvbSBQT1NJWCAxMDAzLjEtMTk5MCAgKi8KKyNkZWZpbmUgVEFSX0JMT0NLX1NJWkUgNTEyCisjZGVmaW5lIE5BTUVfU0laRSAgICAgIDEwMAorI2RlZmluZSBOQU1FX1NJWkVfU1RSICIxMDAiCit0eXBlZGVmIHN0cnVjdCB0YXJfaGVhZGVyX3QgeyAgICAgLyogYnl0ZSBvZmZzZXQgKi8KKwljaGFyIG5hbWVbTkFNRV9TSVpFXTsgICAgIC8qICAgMC05OSAqLworCWNoYXIgbW9kZVs4XTsgICAgICAgICAgICAgLyogMTAwLTEwNyAqLworCWNoYXIgdWlkWzhdOyAgICAgICAgICAgICAgLyogMTA4LTExNSAqLworCWNoYXIgZ2lkWzhdOyAgICAgICAgICAgICAgLyogMTE2LTEyMyAqLworCWNoYXIgc2l6ZVsxMl07ICAgICAgICAgICAgLyogMTI0LTEzNSAqLworCWNoYXIgbXRpbWVbMTJdOyAgICAgICAgICAgLyogMTM2LTE0NyAqLworCWNoYXIgY2hrc3VtWzhdOyAgICAgICAgICAgLyogMTQ4LTE1NSAqLworCWNoYXIgdHlwZWZsYWc7ICAgICAgICAgICAgLyogMTU2LTE1NiAqLworCWNoYXIgbGlua25hbWVbTkFNRV9TSVpFXTsgLyogMTU3LTI1NiAqLworCS8qIFBPU0lYOiAgICJ1c3RhciIgTlVMICIwMCIgKi8KKwkvKiBHTlUgdGFyOiAidXN0YXIgICIgTlVMICovCisJLyogTm9ybWFsbHkgaXQncyBkZWZpbmVkIGFzIG1hZ2ljWzZdIGZvbGxvd2VkIGJ5CisJICogdmVyc2lvblsyXSwgYnV0IHdlIHB1dCB0aGVtIHRvZ2V0aGVyIHRvIHNhdmUgY29kZS4KKwkgKi8KKwljaGFyIG1hZ2ljWzhdOyAgICAgICAgICAgIC8qIDI1Ny0yNjQgKi8KKwljaGFyIHVuYW1lWzMyXTsgICAgICAgICAgIC8qIDI2NS0yOTYgKi8KKwljaGFyIGduYW1lWzMyXTsgICAgICAgICAgIC8qIDI5Ny0zMjggKi8KKwljaGFyIGRldm1ham9yWzhdOyAgICAgICAgIC8qIDMyOS0zMzYgKi8KKwljaGFyIGRldm1pbm9yWzhdOyAgICAgICAgIC8qIDMzNy0zNDQgKi8KKwljaGFyIHByZWZpeFsxNTVdOyAgICAgICAgIC8qIDM0NS00OTkgKi8KKwljaGFyIHBhZGRpbmdbMTJdOyAgICAgICAgIC8qIDUwMC01MTIgKHBhZCB0byBleGFjdGx5IFRBUl9CTE9DS19TSVpFKSAqLworfSB0YXJfaGVhZGVyX3Q7CitzdHJ1Y3QgQlVHX3Rhcl9oZWFkZXIgeworCWNoYXIgY1tzaXplb2YodGFyX2hlYWRlcl90KSA9PSBUQVJfQkxPQ0tfU0laRSA/IDEgOiAtMV07Cit9OworCisKKworLyogSW5mbyBzdHJ1Y3QgdW5wYWNrZXJzIGNhbiBmaWxsIG91dCB0byBpbmZvcm0gdXNlcnMgb2YgdGhpbmcgbGlrZQorICogdGltZXN0YW1wcyBvZiB1bnBhY2tlZCBmaWxlcyAqLwordHlwZWRlZiBzdHJ1Y3QgdW5wYWNrX2luZm9fdCB7CisJdGltZV90IG10aW1lOworfSB1bnBhY2tfaW5mb190OworCithcmNoaXZlX2hhbmRsZV90ICppbml0X2hhbmRsZSh2b2lkKSBGQVNUX0ZVTkM7CisKK2NoYXIgZmlsdGVyX2FjY2VwdF9hbGwoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZmlsdGVyX2FjY2VwdF9saXN0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworY2hhciBmaWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CisKK3ZvaWQgdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGVfdCAqYXJfYXJjaGl2ZSkgRkFTVF9GVU5DOworCit2b2lkIGRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOwordm9pZCBkYXRhX2V4dHJhY3RfYWxsKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7Cit2b2lkIGRhdGFfZXh0cmFjdF90b19zdGRvdXQoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK3ZvaWQgZGF0YV9leHRyYWN0X3RvX2NvbW1hbmQoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKKwordm9pZCBoZWFkZXJfc2tpcChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikgRkFTVF9GVU5DOwordm9pZCBoZWFkZXJfbGlzdChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikgRkFTVF9GVU5DOwordm9pZCBoZWFkZXJfdmVyYm9zZV9saXN0KGNvbnN0IGZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyKSBGQVNUX0ZVTkM7CisKK2NoYXIgZ2V0X2hlYWRlcl9hcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworY2hhciBnZXRfaGVhZGVyX2NwaW8oYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXJfZ3ooYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXJfYnoyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGdldF9oZWFkZXJfdGFyX2x6bWEoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKKwordm9pZCBzZWVrX2J5X2p1bXAoaW50IGZkLCBvZmZfdCBhbW91bnQpIEZBU1RfRlVOQzsKK3ZvaWQgc2Vla19ieV9yZWFkKGludCBmZCwgb2ZmX3QgYW1vdW50KSBGQVNUX0ZVTkM7CisKK2NvbnN0IGNoYXIgKnN0cmlwX3Vuc2FmZV9wcmVmaXgoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7CisKK3ZvaWQgZGF0YV9hbGlnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSwgdW5zaWduZWQgYm91bmRhcnkpIEZBU1RfRlVOQzsKK2NvbnN0IGxsaXN0X3QgKmZpbmRfbGlzdF9lbnRyeShjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworY29uc3QgbGxpc3RfdCAqZmluZF9saXN0X2VudHJ5Mihjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworCisvKiBBIGJpdCBvZiBidW56aXAyIGludGVybmFscyBhcmUgZXhwb3NlZCBmb3IgY29tcHJlc3NlZCBoZWxwIHN1cHBvcnQ6ICovCit0eXBlZGVmIHN0cnVjdCBidW56aXBfZGF0YSBidW56aXBfZGF0YTsKK2ludCBzdGFydF9idW56aXAoYnVuemlwX2RhdGEgKipiZHAsIGludCBpbl9mZCwgY29uc3Qgdm9pZCAqaW5idWYsIGludCBsZW4pIEZBU1RfRlVOQzsKKy8qIE5COiByZWFkX2J1bnppcCByZXR1cm5zIDwgMCBvbiBlcnJvciwgb3IgdGhlIG51bWJlciBvZiAqdW5maWxsZWQqIGJ5dGVzCisgKiBpbiBvdXRidWYuIElPVzogb24gRU9GIHJldHVybnMgbGVuICgiYWxsIGJ5dGVzIGFyZSBub3QgZmlsbGVkIiksIG5vdCAwOiAqLworaW50IHJlYWRfYnVuemlwKGJ1bnppcF9kYXRhICpiZCwgY2hhciAqb3V0YnVmLCBpbnQgbGVuKSBGQVNUX0ZVTkM7Cit2b2lkIGRlYWxsb2NfYnVuemlwKGJ1bnppcF9kYXRhICpiZCkgRkFTVF9GVU5DOworCit0eXBlZGVmIHN0cnVjdCBpbmZsYXRlX3VuemlwX3Jlc3VsdCB7CisJb2ZmX3QgYnl0ZXNfb3V0OworCXVpbnQzMl90IGNyYzsKK30gaW5mbGF0ZV91bnppcF9yZXN1bHQ7CisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgaW5mbGF0ZV91bnppcChpbmZsYXRlX3VuemlwX3Jlc3VsdCAqcmVzLCBvZmZfdCBjb21wcl9zaXplLCBpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CisvKiB4eiB1bnBhY2tlciB0YWtlcyAueHogc3RyZWFtIGZyb20gb2Zmc2V0IDYgKi8KK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgdW5wYWNrX3h6X3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CisvKiBsem1hIHVucGFja2VyIHRha2VzIC5sem1hIHN0cmVhbSBmcm9tIG9mZnNldCAwICovCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja19sem1hX3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CisvKiB0aGUgcmVzdCB3YW50cyAyIGZpcnN0IGJ5dGVzIGFscmVhZHkgc2tpcHBlZCBieSB0aGUgY2FsbGVyICovCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja19iejJfc3RyZWFtKGludCBzcmNfZmQsIGludCBkc3RfZmQpIEZBU1RfRlVOQzsKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgdW5wYWNrX2d6X3N0cmVhbShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSBGQVNUX0ZVTkM7CitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja19nel9zdHJlYW1fd2l0aF9pbmZvKGludCBzcmNfZmQsIGludCBkc3RfZmQsIHVucGFja19pbmZvX3QgKmluZm8pIEZBU1RfRlVOQzsKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgdW5wYWNrX1pfc3RyZWFtKGludCBzcmNfZmQsIGludCBkc3RfZmQpIEZBU1RfRlVOQzsKKy8qIHdyYXBwZXIgd2hpY2ggY2hlY2tzIGZpcnN0IHR3byBieXRlcyB0byBiZSAiQloiICovCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHVucGFja19iejJfc3RyZWFtX3ByaW1lKGludCBzcmNfZmQsIGludCBkc3RfZmQpIEZBU1RfRlVOQzsKKworY2hhciogYXBwZW5kX2V4dChjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0KSBGQVNUX0ZVTkM7CitpbnQgYmJ1bnBhY2soY2hhciAqKmFyZ3YsCisJICAgIElGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DICgqdW5wYWNrZXIpKHVucGFja19pbmZvX3QgKmluZm8pLAorCSAgICBjaGFyKiBGQVNUX0ZVTkMgKCptYWtlX25ld19uYW1lKShjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0KSwKKwkgICAgY29uc3QgY2hhciAqZXhwZWN0ZWRfZXh0CispIEZBU1RfRlVOQzsKKworI2lmIEJCX01NVQordm9pZCBvcGVuX3RyYW5zZm9ybWVyKGludCBmZCwKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnRyYW5zZm9ybWVyKShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKSkgRkFTVF9GVU5DOworI2RlZmluZSBvcGVuX3RyYW5zZm9ybWVyKGZkLCB0cmFuc2Zvcm1lciwgdHJhbnNmb3JtX3Byb2cpIG9wZW5fdHJhbnNmb3JtZXIoZmQsIHRyYW5zZm9ybWVyKQorI2Vsc2UKK3ZvaWQgb3Blbl90cmFuc2Zvcm1lcihpbnQgc3JjX2ZkLCBjb25zdCBjaGFyICp0cmFuc2Zvcm1fcHJvZykgRkFTVF9GVU5DOworI2RlZmluZSBvcGVuX3RyYW5zZm9ybWVyKGZkLCB0cmFuc2Zvcm1lciwgdHJhbnNmb3JtX3Byb2cpIG9wZW5fdHJhbnNmb3JtZXIoZmQsIHRyYW5zZm9ybV9wcm9nKQorI2VuZGlmCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9idXN5Ym94LmggYi9pbmNsdWRlL2J1c3lib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTVlZjhmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9idXN5Ym94LmgKQEAgLTAsMCArMSw2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBCVVNZQk9YX0gKKyNkZWZpbmUgQlVTWUJPWF9IIDEKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBCQl9ESVJfZm9vIGFuZCBCQl9TVUlEX2JhciBjb25zdGFudHM6ICovCisjaW5jbHVkZSAiYXBwbGV0X21ldGFkYXRhLmgiCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBEZWZpbmVkIGluIGFwcGxldGxpYi5jIChieSBpbmNsdWRpbmcgZ2VuZXJhdGVkIGFwcGxldF90YWJsZXMuaCkgKi8KKy8qIEtlZXAgaW4gc3luYyB3aXRoIGFwcGxldHMvYXBwbGV0X3RhYmxlcy5jISAqLworZXh0ZXJuIGNvbnN0IGNoYXIgYXBwbGV0X25hbWVzW107CitleHRlcm4gaW50ICgqY29uc3QgYXBwbGV0X21haW5bXSkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBhcHBsZXRfbmFtZW9mc1tdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgYXBwbGV0X2luc3RhbGxfbG9jW107CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVUlEIHx8IEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisjIGRlZmluZSBBUFBMRVRfTkFNRShpKSAoYXBwbGV0X25hbWVzICsgKGFwcGxldF9uYW1lb2ZzW2ldICYgMHgwZmZmKSkKKyNlbHNlCisjIGRlZmluZSBBUFBMRVRfTkFNRShpKSAoYXBwbGV0X25hbWVzICsgYXBwbGV0X25hbWVvZnNbaV0pCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisjIGRlZmluZSBBUFBMRVRfSVNfTk9GT1JLKGkpIChhcHBsZXRfbmFtZW9mc1tpXSAmICgxIDw8IDEyKSkKKyMgZGVmaW5lIEFQUExFVF9JU19OT0VYRUMoaSkgKGFwcGxldF9uYW1lb2ZzW2ldICYgKDEgPDwgMTMpKQorI2Vsc2UKKyMgZGVmaW5lIEFQUExFVF9JU19OT0ZPUksoaSkgMAorIyBkZWZpbmUgQVBQTEVUX0lTX05PRVhFQyhpKSAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NVSUQKKyMgZGVmaW5lIEFQUExFVF9TVUlEKGkpICgoYXBwbGV0X25hbWVvZnNbaV0gPj4gMTQpICYgMHgzKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNUQUxMRVIKKyNkZWZpbmUgQVBQTEVUX0lOU1RBTExfTE9DKGkpICh7IFwKKwl1bnNpZ25lZCB2ID0gKGkpOyBcCisJaWYgKHYgJiAxKSB2ID0gYXBwbGV0X2luc3RhbGxfbG9jW3YvMl0gPj4gNDsgXAorCWVsc2UgdiA9IGFwcGxldF9pbnN0YWxsX2xvY1t2LzJdICYgMHhmOyBcCisJdjsgfSkKKyNlbmRpZgorCisKKy8qIExlbmd0aCBvZiB0aGVzZSBuYW1lcyBoYXMgZWZmZWN0IG9uIHNpemUgb2YgbGliYnVzeWJveAorICogYW5kICJpbmRpdmlkdWFsIiBiaW5hcmllcy4gS2VlcCB0aGVtIHNob3J0LgorICovCisjaWYgRU5BQkxFX0JVSUxEX0xJQkJVU1lCT1gKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFSRURfQlVTWUJPWAoraW50IGxiYl9tYWluKGNoYXIgKiphcmd2KSBFWFRFUk5BTExZX1ZJU0lCTEU7CisjZWxzZQoraW50IGxiYl9tYWluKGNoYXIgKiphcmd2KTsKKyNlbmRpZgorI2VuZGlmCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdW1wLmggYi9pbmNsdWRlL2R1bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzIzN2VmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdW1wLmgKQEAgLTAsMCArMSw1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisjZGVmaW5lCUZfSUdOT1JFCTB4MDEJCS8qICVfQSAqLworI2RlZmluZQlGX1NFVFJFUAkweDAyCQkvKiByZXAgY291bnQgc2V0LCBub3QgZGVmYXVsdCAqLworI2RlZmluZQlGX0FERFJFU1MJMHgwMDEJCS8qIHByaW50IG9mZnNldCAqLworI2RlZmluZQlGX0JQQUQJCTB4MDAyCQkvKiBibGFuayBwYWQgKi8KKyNkZWZpbmUJRl9DCQkweDAwNAkJLyogJV9jICovCisjZGVmaW5lCUZfQ0hBUgkJMHgwMDgJCS8qICVjICovCisjZGVmaW5lCUZfREJMCQkweDAxMAkJLyogJVtFZWZHZl0gKi8KKyNkZWZpbmUJRl9JTlQJCTB4MDIwCQkvKiAlW2RpXSAqLworI2RlZmluZQlGX1AJCTB4MDQwCQkvKiAlX3AgKi8KKyNkZWZpbmUJRl9TVFIJCTB4MDgwCQkvKiAlcyAqLworI2RlZmluZQlGX1UJCTB4MTAwCQkvKiAlX3UgKi8KKyNkZWZpbmUJRl9VSU5UCQkweDIwMAkJLyogJVtvdVh4XSAqLworI2RlZmluZQlGX1RFWFQJCTB4NDAwCQkvKiBubyBjb252ZXJzaW9ucyAqLworCitlbnVtIGR1bXBfdmZsYWdfdCB7IEFMTCwgRFVQLCBGSVJTVCwgV0FJVCB9OwkvKiAtdiB2YWx1ZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUFIgeworCXN0cnVjdCBQUiAqbmV4dHByOwkJLyogbmV4dCBwcmludCB1bml0ICovCisJdW5zaWduZWQgZmxhZ3M7CQkJLyogZmxhZyB2YWx1ZXMgKi8KKwlpbnQgYmNudDsJCQkvKiBieXRlIGNvdW50ICovCisJY2hhciAqY2NoYXI7CQkJLyogY29udmVyc2lvbiBjaGFyYWN0ZXIgKi8KKwljaGFyICpmbXQ7CQkJLyogcHJpbnRmIGZvcm1hdCAqLworCWNoYXIgKm5vc3BhY2U7CQkJLyogbm8gd2hpdGVzcGFjZSB2ZXJzaW9uICovCit9IFBSOworCit0eXBlZGVmIHN0cnVjdCBGVSB7CisJc3RydWN0IEZVICpuZXh0ZnU7CQkvKiBuZXh0IGZvcm1hdCB1bml0ICovCisJc3RydWN0IFBSICpuZXh0cHI7CQkvKiBuZXh0IHByaW50IHVuaXQgKi8KKwl1bnNpZ25lZCBmbGFnczsJCQkvKiBmbGFnIHZhbHVlcyAqLworCWludCByZXBzOwkJCS8qIHJlcGV0aXRpb24gY291bnQgKi8KKwlpbnQgYmNudDsJCQkvKiBieXRlIGNvdW50ICovCisJY2hhciAqZm10OwkJCS8qIGZvcm1hdCBzdHJpbmcgKi8KK30gRlU7CisKK3R5cGVkZWYgc3RydWN0IEZTIHsJCQkvKiBmb3JtYXQgc3RyaW5ncyAqLworCXN0cnVjdCBGUyAqbmV4dGZzOwkJLyogbGlua2VkIGxpc3Qgb2YgZm9ybWF0IHN0cmluZ3MgKi8KKwlzdHJ1Y3QgRlUgKm5leHRmdTsJCS8qIGxpbmtlZCBsaXN0IG9mIGZvcm1hdCB1bml0cyAqLworCWludCBiY250OworfSBGUzsKKwordHlwZWRlZiBzdHJ1Y3QgZHVtcGVyX3QgeworCW9mZl90IGR1bXBfc2tpcDsgICAgICAgICAgICAgICAgLyogYnl0ZXMgdG8gc2tpcCAqLworCWludCBkdW1wX2xlbmd0aDsgICAgICAgICAgICAgICAgLyogbWF4IGJ5dGVzIHRvIHJlYWQgKi8KKwlzbWFsbGludCBkdW1wX3ZmbGFnOyAgICAgICAgICAgIC8qZW51bSBkdW1wX3ZmbGFnX3QqLworCUZTICpmc2hlYWQ7Cit9IGR1bXBlcl90OworCitkdW1wZXJfdCogYWxsb2NfZHVtcGVyKHZvaWQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2R1bXBfYWRkKGR1bXBlcl90ICpkdW1wZXIsIGNvbnN0IGNoYXIgKmZtdCkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBiYl9kdW1wX2R1bXAoZHVtcGVyX3QgKmR1bXBlciwgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZml4X3UzMi5oIGIvaW5jbHVkZS9maXhfdTMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiYTZkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZml4X3UzMi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgaGVhZGVyIG1ha2VzIGl0IGVhc2llciB0byBpbmNsdWRlIGtlcm5lbCBoZWFkZXJzCisgKiB3aGljaCB1c2UgdTMyIGFuZCBzdWNoLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgRklYX1UzMl9ICisjZGVmaW5lIEZJWF9VMzJfSCAxCisKKy8qIFRyeSBoYXJkIHRvIHB1bGwgaW4gdTMyIHR5cGVzIGFuZCBzdWNoLgorICogT3RoZXJ3aXNlLCAjaW5jbHVkZSAiZml4X3UzMi5oIiArICNpbmNsdWRlIDxsaW51eC9mb28uaD4KKyAqIG1heSBlbmQgdXAgdHlwZWRlZidpbmcgYmJfaGFja191MzIgaW5zaWRlIGZvby5oLAorICogYW5kIHJlcGVhdGVkIHR5cGVkZWZzIGFyZW4ndCBhbGxvd2VkIGluIEMvQysrLgorICovCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSW4gY2FzZSBhYm92ZSBpbmNsdWRlcyBzdGlsbCBmYWlsZWQgdG8gcHJvdmlkZSB0aGUgdHlwZXMsCisgKiBwcm92aWRlIHRoZW0gb3Vyc2VsZgorICovCisjdW5kZWYgX191NjQKKyN1bmRlZiB1NjQKKyN1bmRlZiB1MzIKKyN1bmRlZiB1MTYKKyN1bmRlZiB1OAorI3VuZGVmIF9fczY0CisjdW5kZWYgczY0CisjdW5kZWYgczMyCisjdW5kZWYgczE2CisjdW5kZWYgczgKKworI2RlZmluZSBfX3U2NCBiYl9oYWNrX19fdTY0CisjZGVmaW5lIHU2NCAgIGJiX2hhY2tfdTY0CisjZGVmaW5lIHUzMiAgIGJiX2hhY2tfdTMyCisjZGVmaW5lIHUxNiAgIGJiX2hhY2tfdTE2CisjZGVmaW5lIHU4ICAgIGJiX2hhY2tfdTgKKyNkZWZpbmUgX19zNjQgYmJfaGFja19fX3M2NAorI2RlZmluZSBzNjQgICBiYl9oYWNrX3M2NAorI2RlZmluZSBzMzIgICBiYl9oYWNrX3MzMgorI2RlZmluZSBzMTYgICBiYl9oYWNrX3MxNgorI2RlZmluZSBzOCAgICBiYl9oYWNrX3M4CisKK3R5cGVkZWYgdWludDY0X3QgX191NjQ7Cit0eXBlZGVmIHVpbnQ2NF90IHU2NDsKK3R5cGVkZWYgdWludDMyX3QgdTMyOwordHlwZWRlZiB1aW50MTZfdCB1MTY7Cit0eXBlZGVmIHVpbnQ4X3QgdTg7Cit0eXBlZGVmIGludDY0X3QgX19zNjQ7Cit0eXBlZGVmIGludDY0X3QgczY0OwordHlwZWRlZiBpbnQzMl90IHMzMjsKK3R5cGVkZWYgaW50MTZfdCBzMTY7Cit0eXBlZGVmIGludDhfdCBzODsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dycF8uaCBiL2luY2x1ZGUvZ3JwXy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjRkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dycF8uaApAQCAtMCwwICsxLDExOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTUsOTYsOTcsOTgsOTksMjAwMCwwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLgorICovCisvKgorICogUE9TSVggU3RhbmRhcmQ6IDkuMi4xIEdyb3VwIERhdGFiYXNlIEFjY2Vzcwk8Z3JwLmg+CisgKi8KKyNpZm5kZWYgQkJfR1JQX0gKKyNkZWZpbmUgQkJfR1JQX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogVGhpcyBmaWxlIGlzICNpbmNsdWRlZCBhZnRlciAjaW5jbHVkZSA8Z3JwLmg+CisgKiBXZSB3aWxsIHVzZSBsaWJjLWRlZmluZWQgc3RydWN0dXJlcywgYnV0IHdpbGwgI2RlZmluZSBmdW5jdGlvbiBuYW1lcworICogc28gdGhhdCBmdW5jdGlvbiBjYWxscyBhcmUgZGlyZWN0ZWQgdG8gYmJfaW50ZXJuYWxfWFhYIHJlcGxhY2VtZW50cworICovCisKKyNkZWZpbmUgc2V0Z3JlbnQgICAgIGJiX2ludGVybmFsX3NldGdyZW50CisjZGVmaW5lIGVuZGdyZW50ICAgICBiYl9pbnRlcm5hbF9lbmRncmVudAorI2RlZmluZSBnZXRncmVudCAgICAgYmJfaW50ZXJuYWxfZ2V0Z3JlbnQKKyNkZWZpbmUgZmdldGdyZW50ICAgIGJiX2ludGVybmFsX2ZnZXRncmVudAorI2RlZmluZSBwdXRncmVudCAgICAgYmJfaW50ZXJuYWxfcHV0Z3JlbnQKKyNkZWZpbmUgZ2V0Z3JnaWQgICAgIGJiX2ludGVybmFsX2dldGdyZ2lkCisjZGVmaW5lIGdldGdybmFtICAgICBiYl9pbnRlcm5hbF9nZXRncm5hbQorI2RlZmluZSBnZXRncmVudF9yICAgYmJfaW50ZXJuYWxfZ2V0Z3JlbnRfcgorI2RlZmluZSBnZXRncmdpZF9yICAgYmJfaW50ZXJuYWxfZ2V0Z3JnaWRfcgorI2RlZmluZSBnZXRncm5hbV9yICAgYmJfaW50ZXJuYWxfZ2V0Z3JuYW1fcgorI2RlZmluZSBmZ2V0Z3JlbnRfciAgYmJfaW50ZXJuYWxfZmdldGdyZW50X3IKKyNkZWZpbmUgZ2V0Z3JvdXBsaXN0IGJiX2ludGVybmFsX2dldGdyb3VwbGlzdAorI2RlZmluZSBpbml0Z3JvdXBzICAgYmJfaW50ZXJuYWxfaW5pdGdyb3VwcworCisKKy8qIEFsbCBmdW5jdGlvbiBuYW1lcyBiZWxvdyBzaG91bGQgYmUgcmVtYXBwZWQgYnkgI2RlZmluZXMgYWJvdmUKKyAqIGluIG9yZGVyIHRvIG5vdCBjb2xsaWRlIHdpdGggbGliYyBuYW1lcy4gKi8KKworCisvKiBSZXdpbmQgdGhlIGdyb3VwLWZpbGUgc3RyZWFtLiAgKi8KK2V4dGVybiB2b2lkIHNldGdyZW50KHZvaWQpOworCisvKiBDbG9zZSB0aGUgZ3JvdXAtZmlsZSBzdHJlYW0uICAqLworZXh0ZXJuIHZvaWQgZW5kZ3JlbnQodm9pZCk7CisKKyNpZmRlZiBVTlVTRURfU0lOQ0VfV0VfQVZPSURfU1RBVElDX0JVRlMKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSB0aGUgZ3JvdXAtZmlsZSBzdHJlYW0sIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmdldGdyZW50KHZvaWQpOworCisvKiBSZWFkIGEgZ3JvdXAgZW50cnkgZnJvbSBTVFJFQU0uICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZmdldGdyZW50KEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgdGhlIGdpdmVuIGVudHJ5IG9udG8gdGhlIGdpdmVuIHN0cmVhbS4gICovCitleHRlcm4gaW50IHB1dGdyZW50KGNvbnN0IHN0cnVjdCBncm91cCAqX19yZXN0cmljdCBfX3AsCisJCSAgICAgRklMRSAqX19yZXN0cmljdCBfX2YpOworI2VuZGlmCisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIElELiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmdldGdyZ2lkKGdpZF90IF9fZ2lkKTsKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgZ3JvdXAgbmFtZS4gICovCitleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncm5hbShjb25zdCBjaGFyICpfX25hbWUpOworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBQTEVBU0UgTk9URTogdGhlIGBnZXRncmVudF9yJyBmdW5jdGlvbiBpcyBub3QgKHlldCkgc3RhbmRhcmRpemVkLgorICAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoaXMgbGlicmFyeS4gIEJ1dAorICAgdGhlIGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb2xsb3dpbmcgdGhlIHByaW5jaXBhbHMgdXNlZCBmb3IgdGhlCisgICBvdGhlciByZWVudHJhbnQgZnVuY3Rpb25zIHNvIHRoZSBjaGFuY2VzIGFyZSBnb29kIHRoaXMgaXMgd2hhdCB0aGUKKyAgIFBPU0lYIHBlb3BsZSB3b3VsZCBjaG9vc2UuICAqLworCitleHRlcm4gaW50IGdldGdyZW50X3Ioc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIElELiAgKi8KK2V4dGVybiBpbnQgZ2V0Z3JnaWRfcihnaWRfdCBfX2dpZCwgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIG5hbWUuICAqLworZXh0ZXJuIGludCBnZXRncm5hbV9yKGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgICAgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFJlYWQgYSBncm91cCBlbnRyeSBmcm9tIFNUUkVBTS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN0YW5kYXJkaXplZAorICAgYW4gcHJvYmFibHkgbmV2ZXIgd2lsbC4gICovCitleHRlcm4gaW50IGZnZXRncmVudF9yKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQlzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworLyogU3RvcmUgYXQgbW9zdCAqTkdST1VQUyBtZW1iZXJzIG9mIHRoZSBncm91cCBzZXQgZm9yIFVTRVIgaW50bworICAgKkdST1VQUy4gIEFsc28gaW5jbHVkZSBHUk9VUC4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGdyb3VwcyBmb3VuZCBpcworICAgcmV0dXJuZWQgaW4gKk5HUk9VUFMuICBSZXR1cm4gLTEgaWYgdGhlIGlmICpOR1JPVVBTIGlzIHRvbyBzbWFsbC4gICovCitleHRlcm4gaW50IGdldGdyb3VwbGlzdChjb25zdCBjaGFyICpfX3VzZXIsIGdpZF90IF9fZ3JvdXAsCisJCQkgZ2lkX3QgKl9fZ3JvdXBzLCBpbnQgKl9fbmdyb3Vwcyk7CisKKy8qIEluaXRpYWxpemUgdGhlIGdyb3VwIHNldCBmb3IgdGhlIGN1cnJlbnQgdXNlcgorICAgYnkgcmVhZGluZyB0aGUgZ3JvdXAgZGF0YWJhc2UgYW5kIHVzaW5nIGFsbCBncm91cHMKKyAgIG9mIHdoaWNoIFVTRVIgaXMgYSBtZW1iZXIuICBBbHNvIGluY2x1ZGUgR1JPVVAuICAqLworZXh0ZXJuIGludCBpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKl9fdXNlciwgZ2lkX3QgX19ncm91cCk7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbmV0X2NvbW1vbi5oIGIvaW5jbHVkZS9pbmV0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzhhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2luZXRfY29tbW9uLmgKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3RvbGVuIGZyb20gbmV0LXRvb2xzLTEuNTkgYW5kIHN0cmlwcGVkIGRvd24gZm9yIGJ1c3lib3ggYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgICAgICAgTWFyIDEyLCAyMDAxCisgKgorICovCisjaWZuZGVmIElORVRfQ09NTU9OX0gKKyNkZWZpbmUgSU5FVF9DT01NT05fSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBob3N0Zmlyc3QhPTAgSWYgd2UgZXhwZWN0IHRoaXMgdG8gYmUgYSBob3N0bmFtZSwKKyAgIHRyeSBob3N0bmFtZSBkYXRhYmFzZSBmaXJzdAorICovCitpbnQgSU5FVF9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc19pbiwgaW50IGhvc3RmaXJzdCkgRkFTVF9GVU5DOworCisvKiBudW1lcmljOiAmIDB4ODAwMDogImRlZmF1bHQiIGluc3RlYWQgb2YgIioiLAorICogICAgICAgICAgJiAweDQwMDA6IGhvc3QgaW5zdGVhZCBvZiBuZXQsCisgKiAgICAgICAgICAmIDB4MGZmZjogZG9uJ3QgcmVzb2x2ZQorICovCisKK2ludCBJTkVUNl9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYpIEZBU1RfRlVOQzsKKworLyogVGhlc2UgcmV0dXJuIG1hbGxvY2VkIHN0cmluZyAqLworY2hhciAqSU5FVF9ycmVzb2x2ZShzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNfaW4sIGludCBudW1lcmljLCB1aW50MzJfdCBuZXRtYXNrKSBGQVNUX0ZVTkM7CitjaGFyICpJTkVUNl9ycmVzb2x2ZShzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42LCBpbnQgbnVtZXJpYykgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliYmIuaCBiL2luY2x1ZGUvbGliYmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2QwNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saWJiYi5oCkBAIC0wLDAgKzEsMTg2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQnVzeWJveCBtYWluIGludGVybmFsIGhlYWRlciBmaWxlCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gc2FzaCwgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqIFBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCB0byByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIHVuZGVyIEdQTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIExJQkJCX0gKKyNkZWZpbmUgTElCQkJfSCAxCisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmIGRlZmluZWQgX19VQ0xJQkNfXyAvKiBUT0RPOiBhbmQgZ2xpYmM/ICovCisvKiB1c2UgaW5saW5lZCB2ZXJzaW9ucyBvZiB0aGVzZTogKi8KKyMgZGVmaW5lIHNpZ2ZpbGxzZXQocykgICAgX19zaWdmaWxsc2V0KHMpCisjIGRlZmluZSBzaWdlbXB0eXNldChzKSAgIF9fc2lnZW1wdHlzZXQocykKKyMgZGVmaW5lIHNpZ2lzZW1wdHlzZXQocykgX19zaWdpc2VtcHR5c2V0KHMpCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmbmRlZiBtYWpvcgorIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWZkZWYgSEFWRV9NTlRFTlRfSAorIyBpbmNsdWRlIDxtbnRlbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICisjIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNlbmRpZgorLyogRG9uJ3QgZG8gdGhpcyBoZXJlOgorICogI2luY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisgKiBTb21lIGxpbnV4LyBpbmNsdWRlcyBwdWxsIGluIGNvbmZsaWN0aW5nIGRlZmluaXRpb24KKyAqIG9mIHN0cnVjdCBzeXNpbmZvIChvbmx5IGluIHNvbWUgdG9vbGNoYW5pbnMpLCB3aGljaCBicmVha3MgYnVpbGQuCisgKiBJbmNsdWRlIHN5cy9zeXNpbmZvLmggb25seSBpbiB0aG9zZSBmaWxlcyB3aGljaCBuZWVkIGl0LgorICovCisjaWYgRU5BQkxFX1NFTElOVVgKKyMgaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjIGluY2x1ZGUgPHNlbGludXgvY29udGV4dC5oPgorIyBpbmNsdWRlIDxzZWxpbnV4L2ZsYXNrLmg+CisjIGluY2x1ZGUgPHNlbGludXgvYXZfcGVybWlzc2lvbnMuaD4KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1VUTVAKKyMgaW5jbHVkZSA8dXRtcC5oPgorI2VuZGlmCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2Vsc2UKKyMgZGVmaW5lIHNldGxvY2FsZSh4LHkpICgodm9pZCkwKQorI2VuZGlmCisjaWZkZWYgRE1BTExPQworIyBpbmNsdWRlIDxkbWFsbG9jLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisjIGlmICFFTkFCTEVfVVNFX0JCX1NIQURPVworLyogSWYgdXNpbmcgYnVzeWJveCdzIHNoYWRvdyBpbXBsZW1lbnRhdGlvbiwgZG8gbm90IGluY2x1ZGUgdGhlIHNoYWRvdy5oCisgKiBoZWFkZXIgYXMgdGhlIHRvb2xjaGFpbiBtYXkgbm90IHByb3ZpZGUgaXQgYXQgYWxsLgorICovCisjICBpbmNsdWRlIDxzaGFkb3cuaD4KKyMgZW5kaWYKKyNlbmRpZgorLyogSnVzdCBpbiBjYXNlIGxpYmMgZG9lc24ndCBkZWZpbmUgc29tZSBvZiB0aGVzZS4uLiAqLworI2lmbmRlZiBfUEFUSF9QQVNTV0QKKyNkZWZpbmUgX1BBVEhfUEFTU1dEICAiL2V0Yy9wYXNzd2QiCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfR1JPVVAKKyNkZWZpbmUgX1BBVEhfR1JPVVAgICAiL2V0Yy9ncm91cCIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9TSEFET1cKKyNkZWZpbmUgX1BBVEhfU0hBRE9XICAiL2V0Yy9zaGFkb3ciCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfR1NIQURPVworI2RlZmluZSBfUEFUSF9HU0hBRE9XICIvZXRjL2dzaGFkb3ciCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19PcGVuQlNEX18KKyMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyBpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbGlmIGRlZmluZWQgX19BUFBMRV9fCisjIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyBpZiAhZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSAmJiAhZGVmaW5lZChfU09DS0xFTl9UX0RFQ0xBUkVEKQorLyogV2UgI2RlZmluZSBzb2NrbGVuX3QgKmFmdGVyKiBpbmNsdWRlcywgb3RoZXJ3aXNlIHdlIGdldAorICogdHlwZWRlZiByZWRlZmluaXRpb24gZXJyb3JzIGZyb20gc3lzdGVtIGhlYWRlcnMKKyAqIChpbiBjYXNlICJpcyBpdCBkZWZpbmVkIGFscmVhZHkiIGRldGVjdGlvbiBhYm92ZSBmYWlsZWQpCisgKi8KKyMgIGRlZmluZSBzb2NrbGVuX3QgYmJfc29ja2xlbl90CisgICB0eXBlZGVmIHVuc2lnbmVkIHNvY2tsZW5fdDsKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBIQVZFX0NMRUFSRU5WCisjIGRlZmluZSBjbGVhcmVudigpIGRvIHsgaWYgKGVudmlyb24pIGVudmlyb25bMF0gPSBOVUxMOyB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIEhBVkVfRkRBVEFTWU5DCisjIGRlZmluZSBmZGF0YXN5bmMgZnN5bmMKKyNlbmRpZgorI2lmbmRlZiBIQVZFX1hUQUJTCisjIGRlZmluZSBYVEFCUyBUQUIzCisjZW5kaWYKKworCisvKiBTb21lIGxpYmMncyBmb3JnZXQgdG8gZGVjbGFyZSB0aGVzZSwgZG8gaXQgb3Vyc2VsZiAqLworCitleHRlcm4gY2hhciAqKmVudmlyb247CisjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIF9fR0xJQkNfXyA8IDIKK2ludCB2ZHByaW50ZihpbnQgZCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKKyNlbmRpZgorLyoga2xvZ2N0bCBpcyBpbiBsaWJjJ3Mga2xvZy5oLCBidXQgd2UgY2hlYXQgYW5kIG5vdCAjaW5jbHVkZSB0aGF0ICovCitpbnQga2xvZ2N0bChpbnQgdHlwZSwgY2hhciAqYiwgaW50IGxlbik7CisvKiBUaGlzIGlzIGRlY2xhcmVkIGhlcmUgcmF0aGVyIHRoYW4gI2luY2x1ZGluZyA8bGliZ2VuLmg+IGluIG9yZGVyIHRvIGF2b2lkCisgKiBjb25mdXNpbmcgdGhlIHR3byB2ZXJzaW9ucyBvZiBiYXNlbmFtZS4gIFNlZSB0aGUgZGlybmFtZS9iYXNlbmFtZSBtYW4gcGFnZQorICogZm9yIGRldGFpbHMuICovCisjaWYgIWRlZmluZWQgX19GcmVlQlNEX18KK2NoYXIgKmRpcm5hbWUoY2hhciAqcGF0aCk7CisjZW5kaWYKKyNpZm5kZWYgUEFUSF9NQVgKKyMgZGVmaW5lIFBBVEhfTUFYIDI1NgorI2VuZGlmCisjaWZuZGVmIEJVRlNJWgorIyBkZWZpbmUgQlVGU0laIDQwOTYKKyNlbmRpZgorCisKKy8qIEJ1c3lib3ggZG9lcyBub3QgdXNlIHRocmVhZHMsIHdlIGNhbiBzcGVlZCB1cCBzdGRpby4gKi8KKyNpZmRlZiBIQVZFX1VOTE9DS0VEX1NURElPCisjIHVuZGVmICBnZXRjCisjIGRlZmluZSBnZXRjKHN0cmVhbSkgZ2V0Y191bmxvY2tlZChzdHJlYW0pCisjIHVuZGVmICBnZXRjaGFyCisjIGRlZmluZSBnZXRjaGFyKCkgZ2V0Y2hhcl91bmxvY2tlZCgpCisjIHVuZGVmICBwdXRjCisjIGRlZmluZSBwdXRjKGMsIHN0cmVhbSkgcHV0Y191bmxvY2tlZChjLCBzdHJlYW0pCisjIHVuZGVmICBwdXRjaGFyCisjIGRlZmluZSBwdXRjaGFyKGMpIHB1dGNoYXJfdW5sb2NrZWQoYykKKyMgdW5kZWYgIGZnZXRjCisjIGRlZmluZSBmZ2V0YyhzdHJlYW0pIGdldGNfdW5sb2NrZWQoc3RyZWFtKQorIyB1bmRlZiAgZnB1dGMKKyMgZGVmaW5lIGZwdXRjKGMsIHN0cmVhbSkgcHV0Y191bmxvY2tlZChjLCBzdHJlYW0pCisjZW5kaWYKKy8qIEFib3ZlIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgYnkgUE9TSVguMS0yMDA4LCBiZWxvdyBvbmVzIGFyZSBleHRlbnNpb25zICovCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9MSU5FX09QUworIyB1bmRlZiAgZmdldHMKKyMgZGVmaW5lIGZnZXRzKHMsIG4sIHN0cmVhbSkgZmdldHNfdW5sb2NrZWQocywgbiwgc3RyZWFtKQorIyB1bmRlZiAgZnB1dHMKKyMgZGVmaW5lIGZwdXRzKHMsIHN0cmVhbSkgZnB1dHNfdW5sb2NrZWQocywgc3RyZWFtKQorI2VuZGlmCisKKworLyogTWFrZSBhbGwgZGVjbGFyYXRpb25zIGhpZGRlbiAoLWZ2aXNpYmlsaXR5IGZsYWcgb25seSBhZmZlY3RzIGRlZmluaXRpb25zKSAqLworLyogKGRvbid0IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgYWZ0ZXIgdGhpcyB1bnRpbCBjb3JyZXNwb25kaW5nIHBvcCEpICovCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworCisjaWYgRU5BQkxFX1VTRV9CQl9QV0RfR1JQCisjIGluY2x1ZGUgInB3ZF8uaCIKKyMgaW5jbHVkZSAiZ3JwXy5oIgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworIyBpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworIyAgaW5jbHVkZSAic2hhZG93Xy5oIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRlc3RlZCB0byB3b3JrIGNvcnJlY3RseSB3aXRoIGFsbCBpbnQgdHlwZXMgKElJUkMgOl0pICovCisjZGVmaW5lIE1BWElOVChUKSAoVCkoIFwKKwkoKFQpLTEpID4gMCBcCisJPyAoVCktMSBcCisJOiAoVCl+KChUKTEgPDwgKHNpemVvZihUKSo4LTEpKSBcCisJKQorCisjZGVmaW5lIE1JTklOVChUKSAoVCkoIFwKKwkoKFQpLTEpID4gMCBcCisJPyAoVCkwIFwKKwk6ICgoVCkxIDw8IChzaXplb2YoVCkqOC0xKSkgXAorCSkKKworLyogTGFyZ2UgZmlsZSBzdXBwb3J0ICovCisvKiBOb3RlIHRoYXQgQ09ORklHX0xGUz15IGZvcmNlcyBiYm94IHRvIGJlIGJ1aWx0IHdpdGggYWxsIGNvbW1vbiBvcHMKKyAqIChzdGF0LCBsc2VlayBldGMpIG1hcHBlZCB0byAibGFyZ2VmaWxlIiB2YXJpYW50cyBieSBsaWJjLgorICogUHJhY3RpY2FsbHkgaXQgbWVhbnMgdGhhdCBvcGVuKCkgYXV0b21hdGljYWxseSBoYXMgT19MQVJHRUZJTEUgYWRkZWQKKyAqIGFuZCBhbGwgZmlsZXNpemUvZmlsZV9vZmZzZXQgcGFyYW1ldGVycyBhbmQgc3RydWN0IG1lbWJlcnMgYXJlICJsYXJnZSIKKyAqIChpbiB0b2RheSdzIHdvcmxkIC0gc2lnbmVkIDY0Yml0KS4gRm9yIGZ1bGwgc3VwcG9ydCBvZiBsYXJnZSBmaWxlcywKKyAqIHdlIG5lZWQgYSBmZXcgaGVscGVyICNkZWZpbmVzIChiZWxvdykgYW5kIGNhcmVmdWwgdXNlIG9mIG9mZl90CisgKiBpbnN0ZWFkIG9mIGludC9zc2l6ZV90LiBObyBsc2VlazY0KCksIE9fTEFSR0VGSUxFIGV0YyBuZWNlc3NhcnkgKi8KKyNpZiBFTkFCTEVfTEZTCisvKiBDT05GSUdfTEZTIGlzIG9uICovCisjIGlmIFVMT05HX01BWCA+IDB4ZmZmZmZmZmYKKy8qICJsb25nIiBpcyBsb25nIGVub3VnaCBvbiB0aGlzIHN5c3RlbSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG91bF9yYW5nZShhLCAwLCBMT05HX01BWCkKKy8qIHVzYWdlOiBzeiA9IEJCX1NUUlRPT0ZGKHMsIE5VTEwsIDEwKTsgaWYgKGVycm5vIHx8IHN6IDwgMCkgZGllKCk7ICovCisjICBkZWZpbmUgQkJfU1RSVE9PRkYgYmJfc3RydG91bAorIyAgZGVmaW5lIFNUUlRPT0ZGIHN0cnRvdWwKKy8qIHVzYWdlOiBwcmludGYoInNpemU6ICUiT0ZGX0ZNVCJkICglIk9GRl9GTVQieClcbiIsIHN6LCBzeik7ICovCisjICBkZWZpbmUgT0ZGX0ZNVCAibCIKKyMgZWxzZQorLyogImxvbmciIGlzIHRvbyBzaG9ydCwgbmVlZCAibG9uZyBsb25nIiAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdW9mZl90OworIyAgZGVmaW5lIFhBVE9PRkYoYSkgeGF0b3VsbF9yYW5nZShhLCAwLCBMTE9OR19NQVgpCisjICBkZWZpbmUgQkJfU1RSVE9PRkYgYmJfc3RydG91bGwKKyMgIGRlZmluZSBTVFJUT09GRiBzdHJ0b3VsbAorIyAgZGVmaW5lIE9GRl9GTVQgImxsIgorIyBlbmRpZgorI2Vsc2UKKy8qIENPTkZJR19MRlMgaXMgb2ZmICovCisjIGlmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKKy8qIFdoaWxlIHNpemVvZihvZmZfdCkgPT0gc2l6ZW9mKGludCksIG9mZl90IGlzIHR5cGVkZWYnZWQgdG8gbG9uZyBhbnl3YXkuCisgKiBnY2Mgd2lsbCB0aHJvdyB3YXJuaW5ncyBvbiBwcmludGYoIiVkIiwgb2ZmX3QpLiBDcmFwLi4uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdW9mZl90OworIyAgZGVmaW5lIFhBVE9PRkYoYSkgeGF0b2lfcG9zaXRpdmUoYSkKKyMgIGRlZmluZSBCQl9TVFJUT09GRiBiYl9zdHJ0b3UKKyMgIGRlZmluZSBTVFJUT09GRiBzdHJ0b2wKKyMgIGRlZmluZSBPRkZfRk1UICJsIgorIyBlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdW9mZl90OworIyAgZGVmaW5lIFhBVE9PRkYoYSkgeGF0b3VsX3JhbmdlKGEsIDAsIExPTkdfTUFYKQorIyAgZGVmaW5lIEJCX1NUUlRPT0ZGIGJiX3N0cnRvdWwKKyMgIGRlZmluZSBTVFJUT09GRiBzdHJ0b2wKKyMgIGRlZmluZSBPRkZfRk1UICJsIgorIyBlbmRpZgorI2VuZGlmCisvKiBzY2FyeS4gYmV0dGVyIGlkZWFzPyAoYnV0IGRvICp0ZXN0KiB0aGVtIGZpcnN0ISkgKi8KKyNkZWZpbmUgT0ZGX1RfTUFYICAoKG9mZl90KX4oKG9mZl90KTEgPDwgKHNpemVvZihvZmZfdCkqOC0xKSkpCisKKy8qIFNvbWUgdXNlZnVsIGRlZmluaXRpb25zICovCisjdW5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgICAoKGludCkgMCkKKyN1bmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgKChpbnQpIDEpCisjdW5kZWYgU0tJUAorI2RlZmluZSBTS0lQCSgoaW50KSAyKQorCisvKiBmb3IgbXRhYi5jICovCisjZGVmaW5lIE1UQUJfR0VUTU9VTlRQVCAnMScKKyNkZWZpbmUgTVRBQl9HRVRERVZJQ0UgICcyJworCisjZGVmaW5lIEJVRl9TSVpFICAgICAgICA4MTkyCisjZGVmaW5lIEVYUEFORF9BTExPQyAgICAxMDI0CisKKy8qIE1hY3JvcyBmb3IgbWluL21heC4gICovCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKTwoYikpPyhhKTooYikpCisjZW5kaWYKKworI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikgKCgoYSk+KGIpKT8oYSk6KGIpKQorI2VuZGlmCisKKy8qIGJ1ZmZlciBhbGxvY2F0aW9uIHNjaGVtZXMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLCisjZGVmaW5lIFJFU0VSVkVfQ09ORklHX0JVRkZFUihidWZmZXIsbGVuKSAgY2hhciBidWZmZXJbbGVuXQorI2RlZmluZSBSRVNFUlZFX0NPTkZJR19VQlVGRkVSKGJ1ZmZlcixsZW4pIHVuc2lnbmVkIGNoYXIgYnVmZmVyW2xlbl0KKyNkZWZpbmUgUkVMRUFTRV9DT05GSUdfQlVGRkVSKGJ1ZmZlcikgICAgICAoKHZvaWQpMCkKKyNlbHNlCisjaWYgRU5BQkxFX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MKKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfQlVGRkVSKGJ1ZmZlcixsZW4pICBzdGF0aWMgICAgICAgICAgY2hhciBidWZmZXJbbGVuXQorI2RlZmluZSBSRVNFUlZFX0NPTkZJR19VQlVGRkVSKGJ1ZmZlcixsZW4pIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltsZW5dCisjZGVmaW5lIFJFTEVBU0VfQ09ORklHX0JVRkZFUihidWZmZXIpICAgICAgKCh2b2lkKTApCisjZWxzZQorI2RlZmluZSBSRVNFUlZFX0NPTkZJR19CVUZGRVIoYnVmZmVyLGxlbikgIGNoYXIgKmJ1ZmZlciA9IHhtYWxsb2MobGVuKQorI2RlZmluZSBSRVNFUlZFX0NPTkZJR19VQlVGRkVSKGJ1ZmZlcixsZW4pIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IHhtYWxsb2MobGVuKQorI2RlZmluZSBSRUxFQVNFX0NPTkZJR19CVUZGRVIoYnVmZmVyKSAgICAgIGZyZWUoYnVmZmVyKQorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTElCQ19fKQorLyogZ2xpYmMgdXNlcyBfX2Vycm5vX2xvY2F0aW9uKCkgdG8gZ2V0IGEgcHRyIHRvIGVycm5vICovCisvKiBXZSBjYW4ganVzdCBtZW1vcml6ZSBpdCBvbmNlIC0gbm8gbXVsdGl0aHJlYWRpbmcgaW4gYnVzeWJveCA6KSAqLworZXh0ZXJuIGludCAqY29uc3QgYmJfZXJybm87CisjdW5kZWYgZXJybm8KKyNkZWZpbmUgZXJybm8gKCpiYl9lcnJubykKKyNlbmRpZgorCisjaWYgIShVTE9OR19NQVggPiAweGZmZmZmZmZmKQorLyogT25seSAzMi1iaXQgQ1BVcyBuZWVkIHRoaXMsIDY0LWJpdCBvbmVzIHVzZSBpbmxpbmVkIHZlcnNpb24gKi8KK3VpbnQ2NF90IGJiX2Jzd2FwXzY0KHVpbnQ2NF90IHgpIEZBU1RfRlVOQzsKKyNlbmRpZgorCit1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX25zKHZvaWQpIEZBU1RfRlVOQzsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfdXModm9pZCkgRkFTVF9GVU5DOwordW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19tcyh2b2lkKSBGQVNUX0ZVTkM7Cit1bnNpZ25lZCBtb25vdG9uaWNfc2VjKHZvaWQpIEZBU1RfRlVOQzsKKworZXh0ZXJuIHZvaWQgY2hvbXAoY2hhciAqcykgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgdHJpbShjaGFyICpzKSBGQVNUX0ZVTkM7CitleHRlcm4gY2hhciAqc2tpcF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworZXh0ZXJuIGNoYXIgKnNraXBfbm9uX3doaXRlc3BhY2UoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7CitleHRlcm4gY2hhciAqc2tpcF9kZXZfcGZ4KGNvbnN0IGNoYXIgKnR0eV9uYW1lKSBGQVNUX0ZVTkM7CisKK2V4dGVybiBjaGFyICpzdHJyc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpIEZBU1RfRlVOQzsKKworLy9UT0RPOiBzdXBwbHkgYSBwb2ludGVyIHRvIGNoYXJbMTFdIGJ1ZmZlciAoYXZvaWQgc3RhdGljcyk/CitleHRlcm4gY29uc3QgY2hhciAqYmJfbW9kZV9zdHJpbmcobW9kZV90IG1vZGUpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBmb2xsb3dMaW5rcywgc3RydWN0IHN0YXQgKnN0YXRCdWYpIEZBU1RfRlVOQzsKK2VudW0gewkvKiBETyBOT1QgQ0hBTkdFIFRIRVNFIFZBTFVFUyEgIGNwLmMsIG12LmMsIGluc3RhbGwuYyBkZXBlbmQgb24gdGhlbS4gKi8KKwlGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTID0gMSA8PCAwLCAvKiAtcCAqLworCUZJTEVVVElMU19ERVJFRkVSRU5DRSAgICAgPSAxIDw8IDEsIC8qICEtZCAqLworCUZJTEVVVElMU19SRUNVUiAgICAgICAgICAgPSAxIDw8IDIsIC8qIC1SICovCisJRklMRVVUSUxTX0ZPUkNFICAgICAgICAgICA9IDEgPDwgMywgLyogLWYgKi8KKwlGSUxFVVRJTFNfSU5URVJBQ1RJVkUgICAgID0gMSA8PCA0LCAvKiAtaSAqLworCUZJTEVVVElMU19NQUtFX0hBUkRMSU5LICAgPSAxIDw8IDUsIC8qIC1sICovCisJRklMRVVUSUxTX01BS0VfU09GVExJTksgICA9IDEgPDwgNiwgLyogLXMgKi8KKwlGSUxFVVRJTFNfREVSRUZfU09GVExJTksgID0gMSA8PCA3LCAvKiAtTCAqLworCUZJTEVVVElMU19ERVJFRkVSRU5DRV9MMCAgPSAxIDw8IDgsIC8qIC1IICovCisjaWYgRU5BQkxFX1NFTElOVVgKKwlGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCA9IDEgPDwgOSwgLyogLWMgKi8KKwlGSUxFVVRJTFNfU0VUX1NFQ1VSSVRZX0NPTlRFWFQgPSAxIDw8IDEwLAorI2VuZGlmCit9OworI2RlZmluZSBGSUxFVVRJTFNfQ1BfT1BUU1RSICJwZFJmaWxzTEgiIElGX1NFTElOVVgoImMiKQorZXh0ZXJuIGludCByZW1vdmVfZmlsZShjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKy8qIE5COiB3aXRob3V0IEZJTEVVVElMU19SRUNVUiBpbiBmbGFncywgaXQgd2lsbCBiYXNpY2FsbHkgImNhdCIKKyAqIHRoZSBzb3VyY2UsIG5vdCBjb3B5ICh1bmxlc3MgInNvdXJjZSIgaXMgYSBkaXJlY3RvcnkpLgorICogVGhpcyBtYWtlcyAiY3AgL2Rldi9udWxsIGZpbGUiIGFuZCAiaW5zdGFsbCAvZGV2L251bGwgZmlsZSIgKCEhISkKKyAqIHdvcmsgY29yZXV0aWxzLWNvbXBhdGlibHkuICovCitleHRlcm4gaW50IGNvcHlfZmlsZShjb25zdCBjaGFyICpzb3VyY2UsIGNvbnN0IGNoYXIgKmRlc3QsIGludCBmbGFncykgRkFTVF9GVU5DOworCitlbnVtIHsKKwlBQ1RJT05fUkVDVVJTRSAgICAgICAgPSAoMSA8PCAwKSwKKwlBQ1RJT05fRk9MTE9XTElOS1MgICAgPSAoMSA8PCAxKSwKKwlBQ1RJT05fRk9MTE9XTElOS1NfTDAgPSAoMSA8PCAyKSwKKwlBQ1RJT05fREVQVEhGSVJTVCAgICAgPSAoMSA8PCAzKSwKKwkvKkFDVElPTl9SRVZFUlNFICAgICAgPSAoMSA8PCA0KSwgLSB1bnVzZWQgKi8KKwlBQ1RJT05fUVVJRVQgICAgICAgICAgPSAoMSA8PCA1KSwKKwlBQ1RJT05fREFOR0xJTkdfT0sgICAgPSAoMSA8PCA2KSwKK307Cit0eXBlZGVmIHVpbnQ4X3QgcmVjdXJzZV9mbGFnc190OworZXh0ZXJuIGludCByZWN1cnNpdmVfYWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCB1bnNpZ25lZCBmbGFncywKKwlpbnQgRkFTVF9GVU5DICgqZmlsZUFjdGlvbikoY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0KiBzdGF0YnVmLCB2b2lkKiB1c2VyRGF0YSwgaW50IGRlcHRoKSwKKwlpbnQgRkFTVF9GVU5DICgqZGlyQWN0aW9uKShjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQqIHN0YXRidWYsIHZvaWQqIHVzZXJEYXRhLCBpbnQgZGVwdGgpLAorCXZvaWQqIHVzZXJEYXRhLCB1bnNpZ25lZCBkZXB0aCkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBkZXZpY2Vfb3Blbihjb25zdCBjaGFyICpkZXZpY2UsIGludCBtb2RlKSBGQVNUX0ZVTkM7CitlbnVtIHsgR0VUUFRZX0JVRlNJWkUgPSAxNiB9OyAvKiBtb3JlIHRoYW4gZW5vdWdoIGZvciAiL2Rldi90dHlYWFgiICovCitleHRlcm4gaW50IHhnZXRwdHkoY2hhciAqbGluZSkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBnZXRfY29uc29sZV9mZF9vcl9kaWUodm9pZCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgY29uc29sZV9tYWtlX2FjdGl2ZShpbnQgZmQsIGNvbnN0IGludCB2dF9udW0pIEZBU1RfRlVOQzsKK2V4dGVybiBjaGFyICpmaW5kX2Jsb2NrX2RldmljZShjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisvKiBiYl9jb3B5ZmRfWFggcHJpbnQgcmVhZC93cml0ZSBlcnJvcnMgYW5kIHJldHVybiAtMSBpZiB0aGV5IG9jY3VyICovCitleHRlcm4gb2ZmX3QgYmJfY29weWZkX2VvZihpbnQgZmQxLCBpbnQgZmQyKSBGQVNUX0ZVTkM7CitleHRlcm4gb2ZmX3QgYmJfY29weWZkX3NpemUoaW50IGZkMSwgaW50IGZkMiwgb2ZmX3Qgc2l6ZSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfY29weWZkX2V4YWN0X3NpemUoaW50IGZkMSwgaW50IGZkMiwgb2ZmX3Qgc2l6ZSkgRkFTVF9GVU5DOworLyogInNob3J0IiBjb3B5IGNhbiBiZSBkZXRlY3RlZCBieSByZXR1cm4gdmFsdWUgPCBzaXplICovCisvKiB0aGlzIGhlbHBlciB5ZWxscyAic2hvcnQgcmVhZCEiIGlmIHBhcmFtIGlzIG5vdCAtMSAqLworZXh0ZXJuIHZvaWQgY29tcGxhaW5fY29weWZkX2FuZF9kaWUob2ZmX3Qgc3opIE5PUkVUVVJOIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNoYXIgYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoY29uc3QgY2hhciAqKnB0cikgRkFTVF9GVU5DOworY2hhciogc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXMoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpIEZBU1RfRlVOQzsKKy8qIHh4eHhfc3RyaXAgdmVyc2lvbiBjYW4gbW9kaWZ5IGl0cyBwYXJhbWV0ZXI6CisgKiAiLyIgICAgICAgIC0+ICIvIgorICogImFiYyIgICAgICAtPiAiYWJjIgorICogImFiYy9kZWYiICAtPiAiZGVmIgorICogImFiYy9kZWYvIiAtPiAiZGVmIiAhIQorICovCitjaGFyICpiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcChjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisvKiAiYWJjL2RlZi8iIC0+ICIiIGFuZCBpdCBuZXZlciBtb2RpZmllcyAncGF0aCcgKi8KK2NoYXIgKmJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworLyogU2ltcGxlciB2ZXJzaW9uOiBkb2VzIG5vdCBzcGVjaWFsIGNhc2UgIi8iIHN0cmluZyAqLworY29uc3QgY2hhciAqYmJfYmFzZW5hbWUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworLyogTkI6IGNhbiB2aW9sYXRlIGNvbnN0LW5lc3MgKHNpbWlsYXJseSB0byBzdHJjaHIpICovCitjaGFyICpsYXN0X2NoYXJfaXMoY29uc3QgY2hhciAqcywgaW50IGMpIEZBU1RfRlVOQzsKKwordm9pZCBuZGVsYXlfb24oaW50IGZkKSBGQVNUX0ZVTkM7Cit2b2lkIG5kZWxheV9vZmYoaW50IGZkKSBGQVNUX0ZVTkM7Cit2b2lkIGNsb3NlX29uX2V4ZWNfb24oaW50IGZkKSBGQVNUX0ZVTkM7Cit2b2lkIHhkdXAyKGludCwgaW50KSBGQVNUX0ZVTkM7Cit2b2lkIHhtb3ZlX2ZkKGludCwgaW50KSBGQVNUX0ZVTkM7CisKKworRElSICp4b3BlbmRpcihjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CitESVIgKndhcm5fb3BlbmRpcihjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnhtYWxsb2NfcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworY2hhciAqeG1hbGxvY19yZWFkbGluayhjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitjaGFyICp4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogIVJFVFVSTlNfTUFMTE9DOiBpdCdzIGEgcmVhbGxvYy1saWtlIGZ1bmN0aW9uICovCitjaGFyICp4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihjaGFyICpjd2QpIEZBU1RfRlVOQzsKKworY2hhciAqeG1hbGxvY19mb2xsb3dfc3ltbGlua3MoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworCisKK2VudW0geworCS8qIGJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgaGFuZGxlcikgY2F0Y2hlcyBhbGwgc2lnbmFscyB3aGljaAorCSAqIG90aGVyd2lzZSB3b3VsZCBraWxsIHVzLCBleGNlcHQgZm9yIHRob3NlIHJlc3VsdGluZyBmcm9tIGJ1Z3M6CisJICogU0lHU0VHViwgU0lHSUxMLCBTSUdGUEUuCisJICogT3RoZXIgZmF0YWwgc2lnbmFscyBub3QgaW5jbHVkZWQgKFRPRE8/KToKKwkgKiBTSUdCVVMgICBCdXMgZXJyb3IgKGJhZCBtZW1vcnkgYWNjZXNzKQorCSAqIFNJR1BPTEwgIFBvbGxhYmxlIGV2ZW50LiBTeW5vbnltIG9mIFNJR0lPCisJICogU0lHUFJPRiAgUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQKKwkgKiBTSUdTWVMgICBCYWQgYXJndW1lbnQgdG8gcm91dGluZQorCSAqIFNJR1RSQVAgIFRyYWNlL2JyZWFrcG9pbnQgdHJhcAorCSAqCisJICogVGhlIG9ubHkga25vd24gYXJjaCB3aXRoIHNvbWUgb2YgdGhlc2Ugc2lncyBub3QgZml0dGluZworCSAqIGludG8gMzIgYml0cyBpcyBwYXJpc2MgKFNJR1hDUFU9MzMsIFNJR1hGU1o9MzQsIFNJR1NUS0ZMVD0zNikuCisJICogRGFuY2UgYXJvdW5kIHdpdGggbG9uZyBsb25nIHRvIGd1YXJkIGFnYWluc3QgdGhhdC4uLgorCSAqLworCUJCX0ZBVEFMX1NJR1MgPSAoaW50KSgwCisJCSsgKDFMTCA8PCBTSUdIVVApCisJCSsgKDFMTCA8PCBTSUdJTlQpCisJCSsgKDFMTCA8PCBTSUdURVJNKQorCQkrICgxTEwgPDwgU0lHUElQRSkgICAvLyBXcml0ZSB0byBwaXBlIHdpdGggbm8gcmVhZGVycworCQkrICgxTEwgPDwgU0lHUVVJVCkgICAvLyBRdWl0IGZyb20ga2V5Ym9hcmQKKwkJKyAoMUxMIDw8IFNJR0FCUlQpICAgLy8gQWJvcnQgc2lnbmFsIGZyb20gYWJvcnQoMykKKwkJKyAoMUxMIDw8IFNJR0FMUk0pICAgLy8gVGltZXIgc2lnbmFsIGZyb20gYWxhcm0oMikKKwkJKyAoMUxMIDw8IFNJR1ZUQUxSTSkgLy8gVmlydHVhbCBhbGFybSBjbG9jaworCQkrICgxTEwgPDwgU0lHWENQVSkgICAvLyBDUFUgdGltZSBsaW1pdCBleGNlZWRlZAorCQkrICgxTEwgPDwgU0lHWEZTWikgICAvLyBGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQKKwkJKyAoMUxMIDw8IFNJR1VTUjEpICAgLy8gWWVzIGtpZHMsIHRoZXNlIGFyZSBhbHNvIGZhdGFsIQorCQkrICgxTEwgPDwgU0lHVVNSMikKKwkJKyAwKSwKK307Cit2b2lkIGJiX3NpZ25hbHMoaW50IHNpZ3MsIHZvaWQgKCpmKShpbnQpKSBGQVNUX0ZVTkM7CisvKiBVbmxpa2Ugc2lnbmFsKCkgYW5kIGJiX3NpZ25hbHMsIHNldHMgaGFuZGxlciB3aXRoIHNpZ2FjdGlvbigpCisgKiBhbmQgaW4gYSB3YXkgdGhhdCB3aGlsZSBzaWduYWwgaGFuZGxlciBpcyBydW4sIG5vIG90aGVyIHNpZ25hbHMKKyAqIHdpbGwgYmUgYmxvY2tlZDsgc3lzY2FsbHMgd2lsbCBub3QgYmUgcmVzdGFydGVkOiAqLwordm9pZCBiYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoaW50IHNpZ3MsIHZvaWQgKCpmKShpbnQpKSBGQVNUX0ZVTkM7CisvKiBzeXNjYWxscyBsaWtlIHJlYWQoKSB3aWxsIGJlIGludGVycnVwdGVkIHdpdGggRUlOVFI6ICovCit2b2lkIHNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpIEZBU1RfRlVOQzsKKy8qIHN5c2NhbGxzIGxpa2UgcmVhZCgpIHdvbid0IGJlIGludGVycnVwdGVkICh0aG91Z2ggc2VsZWN0L3BvbGwgd2lsbCBiZSk6ICovCit2b2lkIHNpZ25hbF9TQV9SRVNUQVJUX2VtcHR5X21hc2soaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpIEZBU1RfRlVOQzsKK3ZvaWQgd2FpdF9mb3JfYW55X3NpZyh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIGtpbGxfbXlzZWxmX3dpdGhfc2lnKGludCBzaWcpIE5PUkVUVVJOIEZBU1RfRlVOQzsKK3ZvaWQgc2lnX2Jsb2NrKGludCBzaWcpIEZBU1RfRlVOQzsKK3ZvaWQgc2lnX3VuYmxvY2soaW50IHNpZykgRkFTVF9GVU5DOworLyogV2lsbCBkbyBzaWdhY3Rpb24oc2lnbnVtLCBhY3QsIE5VTEwpOiAqLworaW50IHNpZ2FjdGlvbl9zZXQoaW50IHNpZywgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0KSBGQVNUX0ZVTkM7CisvKiBTSUdfQkxPQ0svU0lHX1VOQkxPQ0sgYWxsIHNpZ25hbHM6ICovCitpbnQgc2lncHJvY21hc2tfYWxsc2lncyhpbnQgaG93KSBGQVNUX0ZVTkM7CisvKiBTdGFuZGFyZCBoYW5kbGVyIHdoaWNoIGp1c3QgcmVjb3JkcyBzaWdubyAqLworZXh0ZXJuIHNtYWxsaW50IGJiX2dvdF9zaWduYWw7Cit2b2lkIHJlY29yZF9zaWdubyhpbnQgc2lnbm8pOyAvKiBub3QgRkFTVF9GVU5DISAqLworCisKK3ZvaWQgeHNldGdpZChnaWRfdCBnaWQpIEZBU1RfRlVOQzsKK3ZvaWQgeHNldHVpZCh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK3ZvaWQgeGNoZGlyKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK3ZvaWQgeGNocm9vdChjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7Cit2b2lkIHhzZXRlbnYoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgRkFTVF9GVU5DOwordm9pZCBiYl91bnNldGVudihjb25zdCBjaGFyICprZXkpIEZBU1RfRlVOQzsKK3ZvaWQgYmJfdW5zZXRlbnZfYW5kX2ZyZWUoY2hhciAqa2V5KSBGQVNUX0ZVTkM7Cit2b2lkIHh1bmxpbmsoY29uc3QgY2hhciAqcGF0aG5hbWUpIEZBU1RfRlVOQzsKK3ZvaWQgeHN0YXQoY29uc3QgY2hhciAqcGF0aG5hbWUsIHN0cnVjdCBzdGF0ICpidWYpIEZBU1RfRlVOQzsKK3ZvaWQgeGZzdGF0KGludCBmZCwgc3RydWN0IHN0YXQgKmJ1ZiwgY29uc3QgY2hhciAqZXJybXNnKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncykgRkFTVF9GVU5DOworaW50IHhvcGVuX25vbmJsb2NraW5nKGNvbnN0IGNoYXIgKnBhdGhuYW1lKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW4zKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKSBGQVNUX0ZVTkM7CitpbnQgb3Blbl9vcl93YXJuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKK2ludCBvcGVuM19vcl93YXJuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKSBGQVNUX0ZVTkM7CitpbnQgb3Blbl9vcl93YXJuX3N0ZGluKGNvbnN0IGNoYXIgKnBhdGhuYW1lKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW5fc3RkaW4oY29uc3QgY2hhciAqcGF0aG5hbWUpIEZBU1RfRlVOQzsKK3ZvaWQgeHJlbmFtZShjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKSBGQVNUX0ZVTkM7CitpbnQgcmVuYW1lX29yX3dhcm4oY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkgRkFTVF9GVU5DOworb2ZmX3QgeGxzZWVrKGludCBmZCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSBGQVNUX0ZVTkM7CitpbnQgeG1rc3RlbXAoY2hhciAqdGVtcGxhdGUpIEZBU1RfRlVOQzsKK29mZl90IGZkbGVuZ3RoKGludCBmZCkgRkFTVF9GVU5DOworCit1b2ZmX3QgRkFTVF9GVU5DIGdldF92b2x1bWVfc2l6ZV9pbl9ieXRlcyhpbnQgZmQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3ZlcnJpZGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgb3ZlcnJpZGVfdW5pdHMsCisgICAgICAgICAgICAgICAgaW50IGV4dGVuZCk7CisKK3ZvaWQgeHBpcGUoaW50IGZpbGVkZXNbMl0pIEZBU1RfRlVOQzsKKy8qIEluIHRoaXMgZm9ybSBjb2RlIHdpdGggcGlwZXMgaXMgbXVjaCBtb3JlIHJlYWRhYmxlICovCitzdHJ1Y3QgZmRfcGFpciB7IGludCByZDsgaW50IHdyOyB9OworI2RlZmluZSBwaXBlZF9wYWlyKHBhaXIpICBwaXBlKCYoKHBhaXIpLnJkKSkKKyNkZWZpbmUgeHBpcGVkX3BhaXIocGFpcikgeHBpcGUoJigocGFpcikucmQpKQorCisvKiBVc2VmdWwgZm9yIGhhdmluZyBzbWFsbCBzdHJ1Y3R1cmUgbWVtYmVycy9nbG9iYWwgdmFyaWFibGVzICovCit0eXBlZGVmIGludDhfdCBzb2NrdHlwZV90OwordHlwZWRlZiBpbnQ4X3QgZmFtaWx5X3Q7CitzdHJ1Y3QgQlVHX3Rvb19zbWFsbCB7CisJY2hhciBCVUdfc29ja3R5cGVfdF90b29fc21hbGxbKDAKKwkJCXwgU09DS19TVFJFQU0KKwkJCXwgU09DS19ER1JBTQorCQkJfCBTT0NLX1JETQorCQkJfCBTT0NLX1NFUVBBQ0tFVAorCQkJfCBTT0NLX1JBVworCQkJKSA8PSAxMjcgPyAxIDogLTFdOworCWNoYXIgQlVHX2ZhbWlseV90X3Rvb19zbWFsbFsoMAorCQkJfCBBRl9VTlNQRUMKKwkJCXwgQUZfSU5FVAorCQkJfCBBRl9JTkVUNgorCQkJfCBBRl9VTklYCisjaWZkZWYgQUZfUEFDS0VUCisJCQl8IEFGX1BBQ0tFVAorI2VuZGlmCisjaWZkZWYgQUZfTkVUTElOSworCQkJfCBBRl9ORVRMSU5LCisjZW5kaWYKKwkJCS8qIHwgQUZfREVDbmV0ICovCisJCQkvKiB8IEFGX0lQWCAqLworCQkJKSA8PSAxMjcgPyAxIDogLTFdOworfTsKKworCit2b2lkIHBhcnNlX2RhdGVzdHIoY29uc3QgY2hhciAqZGF0ZV9zdHIsIHN0cnVjdCB0bSAqcHRtKSBGQVNUX0ZVTkM7Cit0aW1lX3QgdmFsaWRhdGVfdG1fdGltZShjb25zdCBjaGFyICpkYXRlX3N0ciwgc3RydWN0IHRtICpwdG0pIEZBU1RfRlVOQzsKKworCitpbnQgeHNvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKSBGQVNUX0ZVTkM7Cit2b2lkIHhiaW5kKGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqbXlfYWRkciwgc29ja2xlbl90IGFkZHJsZW4pIEZBU1RfRlVOQzsKK3ZvaWQgeGxpc3RlbihpbnQgcywgaW50IGJhY2tsb2cpIEZBU1RfRlVOQzsKK3ZvaWQgeGNvbm5lY3QoaW50IHMsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc19hZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikgRkFTVF9GVU5DOworc3NpemVfdCB4c2VuZHRvKGludCBzLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sCisJCQkJc29ja2xlbl90IHRvbGVuKSBGQVNUX0ZVTkM7CisvKiBTT19SRVVTRUFERFIgYWxsb3dzIGEgc2VydmVyIHRvIHJlYmluZCB0byBhbiBhZGRyZXNzIHRoYXQgaXMgYWxyZWFkeQorICogImluIHVzZSIgYnkgb2xkIGNvbm5lY3Rpb25zIHRvIGUuZy4gcHJldmlvdXMgc2VydmVyIGluc3RhbmNlIHdoaWNoIGlzCisgKiBraWxsZWQgb3IgY3Jhc2hlZC4gV2l0aG91dCBpdCBiaW5kIHdpbGwgZmFpbCB1bnRpbCBhbGwgc3VjaCBjb25uZWN0aW9ucworICogdGltZSBvdXQuIExpbnV4IGRvZXMgbm90IGFsbG93IG11bHRpcGxlIGxpdmUgYmluZHMgb24gc2FtZSBpcDpwb3J0CisgKiByZWdhcmRsZXNzIG9mIFNPX1JFVVNFQUREUiAodW5saWtlIHNvbWUgb3RoZXIgZmxhdm9ycyBvZiBVbml4KS4KKyAqIFR1cm4gaXQgb24gYmVmb3JlIHlvdSBjYWxsIGJpbmQoKS4gKi8KK3ZvaWQgc2V0c29ja29wdF9yZXVzZWFkZHIoaW50IGZkKSBGQVNUX0ZVTkM7IC8qIE9uIExpbnV4IHRoaXMgbmV2ZXIgZmFpbHMuICovCitpbnQgc2V0c29ja29wdF9icm9hZGNhc3QoaW50IGZkKSBGQVNUX0ZVTkM7CitpbnQgc2V0c29ja29wdF9iaW5kdG9kZXZpY2UoaW50IGZkLCBjb25zdCBjaGFyICppZmFjZSkgRkFTVF9GVU5DOworLyogTkI6IHJldHVybnMgcG9ydCBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KK3Vuc2lnbmVkIGJiX2xvb2t1cF9wb3J0KGNvbnN0IGNoYXIgKnBvcnQsIGNvbnN0IGNoYXIgKnByb3RvY29sLCB1bnNpZ25lZCBkZWZhdWx0X3BvcnQpIEZBU1RfRlVOQzsKK3R5cGVkZWYgc3RydWN0IGxlbl9hbmRfc29ja2FkZHIgeworCXNvY2tsZW5fdCBsZW47CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7CisjZW5kaWYKKwl9IHU7Cit9IGxlbl9hbmRfc29ja2FkZHI7CitlbnVtIHsKKwlMU0FfTEVOX1NJWkUgPSBvZmZzZXRvZihsZW5fYW5kX3NvY2thZGRyLCB1KSwKKwlMU0FfU0laRU9GX1NBID0gc2l6ZW9mKAorCQl1bmlvbiB7CisJCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKKyNlbmRpZgorCQl9CisJKQorfTsKKy8qIENyZWF0ZSBzdHJlYW0gc29ja2V0LCBhbmQgYWxsb2NhdGUgc3VpdGFibGUgbHNhLgorICogKGxzYSBvZiBjb3JyZWN0IHNpemUgYW5kIGxzYS0+c2Euc2FfZmFtaWx5IChBRl9JTkVUL0FGX0lORVQ2KSkKKyAqIGFmID09IEFGX1VOU1BFQyB3aWxsIHJlc3VsdCBpbiB0cnlpbmcgdG8gY3JlYXRlIElQdjYgc29ja2V0LAorICogYW5kIGlmIGtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgaXQsIGZhbGwgYmFjayB0byBJUHY0LgorICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IHBsYW4gdG8gYmluZCB0byByZXN1bHRpbmcgbG9jYWwgbHNhLgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgoraW50IHhzb2NrZXRfdHlwZShsZW5fYW5kX3NvY2thZGRyICoqbHNhcCwgaW50IGFmLCBpbnQgc29ja190eXBlKSBGQVNUX0ZVTkM7CisjZWxzZQoraW50IHhzb2NrZXRfdHlwZShsZW5fYW5kX3NvY2thZGRyICoqbHNhcCwgaW50IHNvY2tfdHlwZSkgRkFTVF9GVU5DOworI2RlZmluZSB4c29ja2V0X3R5cGUobHNhcCwgYWYsIHNvY2tfdHlwZSkgeHNvY2tldF90eXBlKChsc2FwKSwgKHNvY2tfdHlwZSkpCisjZW5kaWYKK2ludCB4c29ja2V0X3N0cmVhbShsZW5fYW5kX3NvY2thZGRyICoqbHNhcCkgRkFTVF9GVU5DOworLyogQ3JlYXRlIHNlcnZlciBzb2NrZXQgYm91bmQgdG8gYmluZGFkZHI6cG9ydC4gYmluZGFkZHIgY2FuIGJlIE5VTEwsCisgKiBudW1lcmljIElQICgiTi5OLk4uTiIpIG9yIG51bWVyaWMgSVB2NiBhZGRyZXNzLAorICogYW5kIGNhbiBoYXZlICI6UE9SVCIgc3VmZml4IChmb3IgSVB2NiB1c2UgIltYOlg6Li4uOlhdOlBPUlQiKS4KKyAqIE9ubHkgaWYgdGhlcmUgaXMgbm8gc3VmZml4LCBwb3J0IGFyZ3VtZW50IGlzIHVzZWQgKi8KKy8qIE5COiB0aGVzZSBzZXQgU09fUkVVU0VBRERSIGJlZm9yZSBiaW5kICovCitpbnQgY3JlYXRlX2FuZF9iaW5kX3N0cmVhbV9vcl9kaWUoY29uc3QgY2hhciAqYmluZGFkZHIsIGludCBwb3J0KSBGQVNUX0ZVTkM7CitpbnQgY3JlYXRlX2FuZF9iaW5kX2RncmFtX29yX2RpZShjb25zdCBjaGFyICpiaW5kYWRkciwgaW50IHBvcnQpIEZBU1RfRlVOQzsKKy8qIENyZWF0ZSBjbGllbnQgVENQIHNvY2tldCBjb25uZWN0ZWQgdG8gcGVlcjpwb3J0LiBQZWVyIGNhbm5vdCBiZSBOVUxMLgorICogUGVlciBjYW4gYmUgbnVtZXJpYyBJUCAoIk4uTi5OLk4iKSwgbnVtZXJpYyBJUHY2IGFkZHJlc3Mgb3IgaG9zdG5hbWUsCisgKiBhbmQgY2FuIGhhdmUgIjpQT1JUIiBzdWZmaXggKGZvciBJUHY2IHVzZSAiW1g6WDouLi46WF06UE9SVCIpLgorICogSWYgdGhlcmUgaXMgbm8gc3VmZml4LCBwb3J0IGFyZ3VtZW50IGlzIHVzZWQgKi8KK2ludCBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShjb25zdCBjaGFyICpwZWVyLCBpbnQgcG9ydCkgRkFTVF9GVU5DOworLyogQ29ubmVjdCB0byBwZWVyIGlkZW50aWZpZWQgYnkgbHNhICovCitpbnQgeGNvbm5lY3Rfc3RyZWFtKGNvbnN0IGxlbl9hbmRfc29ja2FkZHIgKmxzYSkgRkFTVF9GVU5DOworLyogR2V0IGxvY2FsIGFkZHJlc3Mgb2YgYm91bmQgb3IgYWNjZXB0ZWQgc29ja2V0ICovCitsZW5fYW5kX3NvY2thZGRyICpnZXRfc29ja19sc2EoaW50IGZkKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBHZXQgcmVtb3RlIGFkZHJlc3Mgb2YgY29ubmVjdGVkIG9yIGFjY2VwdGVkIHNvY2tldCAqLworbGVuX2FuZF9zb2NrYWRkciAqZ2V0X3BlZXJfbHNhKGludCBmZCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogUmV0dXJuIG1hbGxvYydlZCBsZW5fYW5kX3NvY2thZGRyIHdpdGggc29ja2V0IGFkZHJlc3Mgb2YgaG9zdDpwb3J0CisgKiBDdXJyZW50bHkgd2lsbCByZXR1cm4gSVB2NCBvciBJUHY2IHNvY2thZGRycyBvbmx5CisgKiAoZGVwZW5kaW5nIG9uIGhvc3QpLCBidXQgaW4gdGhlb3J5IG5vdGhpbmcgcHJldmVudHMgZS5nLgorICogVU5JWCBzb2NrZXQgYWRkcmVzcyBiZWluZyByZXR1cm5lZCwgSVBYIHNvY2thZGRyIGV0Yy4uLgorICogT24gZXJyb3IgZG9lcyBiYl9lcnJvcl9tc2cgYW5kIHJldHVybnMgTlVMTCAqLworbGVuX2FuZF9zb2NrYWRkciogaG9zdDJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogVmVyc2lvbiB3aGljaCBkaWVzIG9uIGVycm9yICovCitsZW5fYW5kX3NvY2thZGRyKiB4aG9zdDJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworbGVuX2FuZF9zb2NrYWRkciogeGRvdHRlZDJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogU2FtZSwgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZvcmNlIGZhbWlseSAoZS5nLiBJUHY2KSAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9JUFY2CisjZGVmaW5lIGhvc3RfYW5kX2FmMnNvY2thZGRyKGhvc3QsIHBvcnQsIGFmKSBob3N0MnNvY2thZGRyKChob3N0KSwgKHBvcnQpKQorI2RlZmluZSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWYpIHhob3N0MnNvY2thZGRyKChob3N0KSwgKHBvcnQpKQorI2Vsc2UKK2xlbl9hbmRfc29ja2FkZHIqIGhvc3RfYW5kX2FmMnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBzYV9mYW1pbHlfdCBhZikgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworbGVuX2FuZF9zb2NrYWRkciogeGhvc3RfYW5kX2FmMnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBzYV9mYW1pbHlfdCBhZikgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworI2VuZGlmCisvKiBBc3NpZ24gc2luWzZdX3BvcnQgbWVtYmVyIGlmIHRoZSBzb2NrZXQgaXMgYW4gQUZfSU5FVFs2XSBvbmUsCisgKiBvdGhlcndpc2Ugbm8tb3AuIFVzZWZ1bCBmb3IgZnRwLgorICogTkI6IGRvZXMgTk9UIGRvIGh0b25zKCkgaW50ZXJuYWxseSwganVzdCBkaXJlY3QgYXNzaWdubWVudC4gKi8KK3ZvaWQgc2V0X25wb3J0KHN0cnVjdCBzb2NrYWRkciAqc2EsIHVuc2lnbmVkIHBvcnQpIEZBU1RfRlVOQzsKKy8qIFJldHJpZXZlIHNpbls2XV9wb3J0IG9yIHJldHVybiAtMSBmb3Igbm9uLUlORVRbNl0gbHNhJ3MgKi8KK2ludCBnZXRfbnBvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkgRkFTVF9GVU5DOworLyogUmV2ZXJzZSBETlMuIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAqLworY2hhciogeG1hbGxvY19zb2NrYWRkcjJob3N0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFRoaXMgb25lIGRvZXNuJ3QgYXBwZW5kIDpQT1JUTlVNICovCitjaGFyKiB4bWFsbG9jX3NvY2thZGRyMmhvc3Rfbm9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFRoaXMgb25lIGFsc28gZG9lc24ndCBmYWxsIGJhY2sgdG8gZG90dGVkIElQIChyZXR1cm5zIE5VTEwpICovCitjaGFyKiB4bWFsbG9jX3NvY2thZGRyMmhvc3Rvbmx5X25vcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBpbmV0X1thcF10b24gb24gc3Rlcm9pZHMgKi8KK2NoYXIqIHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK2NoYXIqIHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvLyAib2xkIiAoaXB2NCBvbmx5KSBBUEkKKy8vIHVzZXJzOiB0cmFjZXJvdXRlLmMgaG9zdG5hbWUuYyAtIHVzZSBfbGlzdF8gb2YgYWxsIElQcworc3RydWN0IGhvc3RlbnQgKnhnZXRob3N0YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKKy8vIEFsc28gbW91bnQuYyBhbmQgaW5ldGQuYyBhcmUgdXNpbmcgZ2V0aG9zdGJ5bmFtZSgpLAorLy8gKyBpbmV0X2NvbW1vbi5jIGhhcyBhZGRpdGlvbmFsIElQdjQtb25seSBzdHVmZgorCisKK3ZvaWQgc29ja2V0X3dhbnRfcGt0aW5mbyhpbnQgZmQpIEZBU1RfRlVOQzsKK3NzaXplX3Qgc2VuZF90b19mcm9tKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MsCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSwKKwkJc29ja2xlbl90IHRvbGVuKSBGQVNUX0ZVTkM7Citzc2l6ZV90IHJlY3ZfZnJvbV90byhpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sCisJCXN0cnVjdCBzb2NrYWRkciAqdG8sCisJCXNvY2tsZW5fdCBzYV9zaXplKSBGQVNUX0ZVTkM7CisKKworY2hhciAqeHN0cmR1cChjb25zdCBjaGFyICpzKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitjaGFyICp4c3RybmR1cChjb25zdCBjaGFyICpzLCBpbnQgbikgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOwordm9pZCBvdmVybGFwcGluZ19zdHJjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpIEZBU1RfRlVOQzsKK2NoYXIgKnNhZmVfc3RybmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpIEZBU1RfRlVOQzsKK2NoYXIgKnN0cm5jcHlfSUZOQU1TSVooY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpIEZBU1RfRlVOQzsKKy8qIEd1YXJhbnRlZWQgdG8gTk9UIGJlIGEgbWFjcm8gKHNtYWxsZXN0IGNvZGUpLiBTYXZlcyBuZWFybHkgMmsgb24gdWNsaWJjLgorICogQnV0IHBvdGVudGlhbGx5IHNsb3csIGRvbid0IHVzZSBpbiBvbmUtYmlsbGlvbi10aW1lcyBsb29wcyAqLworaW50IGJiX3B1dGNoYXIoaW50IGNoKSBGQVNUX0ZVTkM7CisvKiBOb3RlOiBkb2VzIG5vdCB1c2Ugc3RkaW8sIHdyaXRlcyB0byBmZCAyIGRpcmVjdGx5ICovCitpbnQgYmJfcHV0Y2hhcl9zdGRlcnIoY2hhciBjaCkgRkFTVF9GVU5DOworY2hhciAqeGFzcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMSwgMikpKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvLyBnY2MtNC4xLjEgc3RpbGwgaXNuJ3QgZ29vZCBlbm91Z2ggYXQgb3B0aW1pemluZyBpdAorLy8gKCsyMDAgYnl0ZXMgY29tcGFyZWQgdG8gbWFjcm8pCisvL3N0YXRpYyBBTFdBWVNfSU5MSU5FCisvL2ludCBMT05FX0RBU0goY29uc3QgY2hhciAqcykgeyByZXR1cm4gc1swXSA9PSAnLScgJiYgIXNbMV07IH0KKy8vc3RhdGljIEFMV0FZU19JTkxJTkUKKy8vaW50IE5PVF9MT05FX0RBU0goY29uc3QgY2hhciAqcykgeyByZXR1cm4gc1swXSAhPSAnLScgfHwgc1sxXTsgfQorI2RlZmluZSBMT05FX0RBU0gocykgICAgICgocylbMF0gPT0gJy0nICYmICEocylbMV0pCisjZGVmaW5lIE5PVF9MT05FX0RBU0gocykgKChzKVswXSAhPSAnLScgfHwgKHMpWzFdKQorI2RlZmluZSBMT05FX0NIQVIocyxjKSAgICAgKChzKVswXSA9PSAoYykgJiYgIShzKVsxXSkKKyNkZWZpbmUgTk9UX0xPTkVfQ0hBUihzLGMpICgocylbMF0gIT0gKGMpIHx8IChzKVsxXSkKKyNkZWZpbmUgRE9UX09SX0RPVERPVChzKSAoKHMpWzBdID09ICcuJyAmJiAoIShzKVsxXSB8fCAoKHMpWzFdID09ICcuJyAmJiAhKHMpWzJdKSkpCisKK3R5cGVkZWYgc3RydWN0IHVuaV9zdGF0X3QgeworCXVuc2lnbmVkIGJ5dGVfY291bnQ7CisJdW5zaWduZWQgdW5pY29kZV9jb3VudDsKKwl1bnNpZ25lZCB1bmljb2RlX3dpZHRoOworfSB1bmlfc3RhdF90OworLyogUmV0dXJucyBhIHN0cmluZyB3aXRoIHVucHJpbnRhYmxlIGNoYXJzIHJlcGxhY2VkIGJ5ICc/JyBvcgorICogU1VCU1RfV0NIQVIuIFRoaXMgZnVuY3Rpb24gaXMgdW5pY29kZS1hd2FyZS4gKi8KK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBwcmludGFibGVfc3RyaW5nKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzdHIpOworLyogUHJpbnRzIHVucHJpbnRhYmxlIGNoYXIgY2ggYXMgXkMgb3IgTS1jIHRvIGZpbGUKKyAqIChNLWMgaXMgdXNlZCBvbmx5IGlmIGNoIGlzIE9SZWQgd2l0aCBQUklOVEFCTEVfTUVUQSksCisgKiBlbHNlIGl0IGlzIHByaW50ZWQgYXMtaXMgKGV4Y2VwdCBmb3IgY2ggPSAweDliKSAqLworZW51bSB7IFBSSU5UQUJMRV9NRVRBID0gMHgxMDAgfTsKK3ZvaWQgZnB1dGNfcHJpbnRhYmxlKGludCBjaCwgRklMRSAqZmlsZSkgRkFTVF9GVU5DOworCisvKiBkbWFsbG9jIHdpbGwgcmVkZWZpbmUgdGhlc2UgdG8gaXQncyBvd24gaW1wbGVtZW50YXRpb24uIEl0IGlzIHNhZmUKKyAqIHRvIGhhdmUgdGhlIHByb3RvdHlwZXMgaGVyZSB1bmNvbmRpdGlvbmFsbHkuICAqLwordm9pZCAqbWFsbG9jX29yX3dhcm4oc2l6ZV90IHNpemUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgKnh6YWxsb2Moc2l6ZV90IHNpemUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgKnhyZWFsbG9jKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpIEZBU1RfRlVOQzsKKy8qIEFmdGVyIHhyZWFsbG9jX3ZlY3Rvcih2LCA0LCBpZHgpIGl0J3Mgb2sgdG8gdXNlCisgKiBhdCBsZWFzdCB2W2lkeF0gYW5kIHZbaWR4KzFdLCBmb3IgYWxsIGlkeCB2YWx1ZXMuCisgKiBzaGlmdCBzcGVjaWZpZXMgaG93IG1hbnkgbmV3IGVsZW1lbnRzIGFyZSBhZGRlZCAoMTogMiwgMjogNC4uLiA4OiAyNTYuLi4pCisgKiB3aGVuIGFsbCBlbGVtZW50cyBhcmUgdXNlZCB1cC4gTmV3IGVsZW1lbnRzIGFyZSB6ZXJvZWQgb3V0LiAqLworI2RlZmluZSB4cmVhbGxvY192ZWN0b3IodmVjdG9yLCBzaGlmdCwgaWR4KSBcCisJeHJlYWxsb2NfdmVjdG9yX2hlbHBlcigodmVjdG9yKSwgKHNpemVvZigodmVjdG9yKVswXSkgPDwgOCkgKyAoc2hpZnQpLCAoaWR4KSkKK3ZvaWQqIHhyZWFsbG9jX3ZlY3Rvcl9oZWxwZXIodm9pZCAqdmVjdG9yLCB1bnNpZ25lZCBzaXplb2ZfYW5kX3NoaWZ0LCBpbnQgaWR4KSBGQVNUX0ZVTkM7CisKKworZXh0ZXJuIHNzaXplX3Qgc2FmZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpIEZBU1RfRlVOQzsKK2V4dGVybiBzc2l6ZV90IG5vbmJsb2NrX2ltbXVuZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGludCBsb29wX29uX0VJTlRSKSBGQVNUX0ZVTkM7CisvLyBOQjogd2lsbCByZXR1cm4gc2hvcnQgcmVhZCBvbiBlcnJvciwgbm90IC0xLAorLy8gaWYgc29tZSBkYXRhIHdhcyByZWFkIGJlZm9yZSBlcnJvciBvY2N1cnJlZAorZXh0ZXJuIHNzaXplX3QgZnVsbF9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHhyZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpIEZBU1RfRlVOQzsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHhyZWFkX2NoYXIoaW50IGZkKSBGQVNUX0ZVTkM7CitleHRlcm4gc3NpemVfdCByZWFkX2Nsb3NlKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbWF4c3opIEZBU1RfRlVOQzsKK2V4dGVybiBzc2l6ZV90IG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBzaXplX3QgbWF4c3opIEZBU1RfRlVOQzsKKy8vIFJlYWRzIG9uZSBsaW5lIGEtbGEgZmdldHMgKGJ1dCBkb2Vzbid0IHNhdmUgdGVybWluYXRpbmcgJ1xuJykuCisvLyBSZWFkcyBieXRlLWJ5LWJ5dGUuIFVzZWZ1bCB3aGVuIGl0IGlzIGltcG9ydGFudCB0byBub3QgcmVhZCBhaGVhZC4KKy8vIEJ5dGVzIGFyZSBhcHBlbmRlZCB0byBwZnggKHdoaWNoIG11c3QgYmUgbWFsbG9jZWQsIG9yIE5VTEwpLgorZXh0ZXJuIGNoYXIgKnhtYWxsb2NfcmVhZHMoaW50IGZkLCBzaXplX3QgKm1heHN6X3ApIEZBU1RfRlVOQzsKKy8qIFJlYWRzIGJsb2NrIHVwIHRvICptYXhzel9wIChkZWZhdWx0OiBJTlRfTUFYIC0gNDA5NSkgKi8KK2V4dGVybiB2b2lkICp4bWFsbG9jX3JlYWQoaW50IGZkLCBzaXplX3QgKm1heHN6X3ApIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFJldHVybnMgTlVMTCBpZiBmaWxlIGNhbid0IGJlIG9wZW5lZCAoZGVmYXVsdCBtYXggc2l6ZTogSU5UX01BWCAtIDQwOTUpICovCitleHRlcm4gdm9pZCAqeG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoY29uc3QgY2hhciAqZmlsZW5hbWUsIHNpemVfdCAqbWF4c3pfcCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogTmV2ZXIgcmV0dXJucyBOVUxMICovCitleHRlcm4gdm9pZCAqeG1hbGxvY194b3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKm1heHN6X3ApIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIEF1dG9kZXRlY3RzIGd6aXAvYnppcDIgZm9ybWF0cy4gZmQgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZpbGUhICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQSBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiBcCisgLyogfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWiAqLworZXh0ZXJuIHZvaWQgc2V0dXBfdW56aXBfb25fZmQoaW50IGZkIC8qLCBpbnQgZmFpbF9pZl9ub3RfZGV0ZWN0ZWQqLykgRkFTVF9GVU5DOworI2Vsc2UKKyMgZGVmaW5lIHNldHVwX3VuemlwX29uX2ZkKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKy8qIEF1dG9kZXRlY3RzIC5neiBldGMgKi8KK2V4dGVybiBpbnQgb3Blbl96aXBwZWQoY29uc3QgY2hhciAqZm5hbWUpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkICp4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCAqbWF4c3pfcCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworCitleHRlcm4gc3NpemVfdCBzYWZlX3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpIEZBU1RfRlVOQzsKKy8vIE5COiB3aWxsIHJldHVybiBzaG9ydCB3cml0ZSBvbiBlcnJvciwgbm90IC0xLAorLy8gaWYgc29tZSBkYXRhIHdhcyB3cml0dGVuIGJlZm9yZSBlcnJvciBvY2N1cnJlZAorZXh0ZXJuIHNzaXplX3QgZnVsbF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCB4d3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgeHdyaXRlX3N0cihpbnQgZmQsIGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOworZXh0ZXJuIHNzaXplX3QgZnVsbF93cml0ZTFfc3RyKGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOworZXh0ZXJuIHNzaXplX3QgZnVsbF93cml0ZTJfc3RyKGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgeG9wZW5feHdyaXRlX2Nsb3NlKGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOworCisvKiBDbG9zZSBmZCwgYnV0IGNoZWNrIGZvciBmYWlsdXJlcyAoc29tZSB0eXBlcyBvZiB3cml0ZSBlcnJvcnMpICovCitleHRlcm4gdm9pZCB4Y2xvc2UoaW50IGZkKSBGQVNUX0ZVTkM7CisKKy8qIFJlYWRzIGFuZCBwcmludHMgdG8gc3Rkb3V0IHRpbGwgZW9mLCB0aGVuIGNsb3NlcyBGSUxFLiBFeGl0cyBvbiBlcnJvcjogKi8KK2V4dGVybiB2b2lkIHhwcmludF9hbmRfY2xvc2VfZmlsZShGSUxFICpmaWxlKSBGQVNUX0ZVTkM7CisKKy8qIFJlYWRzIGEgbGluZSBmcm9tIGEgdGV4dCBmaWxlLCB1cCB0byBhIG5ld2xpbmUgb3IgTlVMIGJ5dGUsIGluY2x1c2l2ZS4KKyAqIFJldHVybnMgbWFsbG9jJ2VkIGNoYXIqLiBJZiBlbmQgaXMgTlVMTCAnXG4nIGlzbid0IGNvbnNpZGVyZWQKKyAqIGVuZCBvZiBsaW5lLiBJZiBlbmQgaXNuJ3QgTlVMTCwgbGVuZ3RoIG9mIHRoZSBjaHVuayBpcyBzdG9yZWQgaW4gaXQuCisgKiBSZXR1cm5zIE5VTEwgaWYgRU9GL2Vycm9yLgorICovCitleHRlcm4gY2hhciAqYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShGSUxFICpmaWxlLCBpbnQgKmVuZCkgRkFTVF9GVU5DOworLyogUmVhZHMgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIFRFUk1JTkFUSU5HX1NUUklORzogKi8KK2V4dGVybiBjaGFyICp4bWFsbG9jX2ZnZXRzX3N0cihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFNhbWUsIHdpdGggbGltaXRlZCBtYXggc2l6ZSwgYW5kIHJldHVybnMgdGhlIGxlbmd0aCAoZXhjbHVkaW5nIE5VTCk6ICovCitleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0c19zdHJfbGVuKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnRlcm1pbmF0aW5nX3N0cmluZywgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBDaG9wcyBvZmYgVEVSTUlOQVRJTkdfU1RSSU5HIGZyb20gdGhlIGVuZDogKi8KK2V4dGVybiBjaGFyICp4bWFsbG9jX2ZnZXRsaW5lX3N0cihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIFJlYWRzIHVwIHRvIChhbmQgaW5jbHVkaW5nKSAiXG4iIG9yIE5VTCBieXRlOiAqLworZXh0ZXJuIGNoYXIgKnhtYWxsb2NfZmdldHMoRklMRSAqZmlsZSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogQ2hvcHMgb2ZmICdcbicgZnJvbSB0aGUgZW5kLCB1bmxpa2UgZmdldHM6ICovCitleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0bGluZShGSUxFICpmaWxlKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBTYW1lLCBidXQgZG9lc24ndCB0cnkgdG8gY29uc2VydmUgc3BhY2UgKG1heSBoYXZlIHNvbWUgc2xhY2sgYWZ0ZXIgdGhlIGVuZCkgKi8KKy8qIGV4dGVybiBjaGFyICp4bWFsbG9jX2ZnZXRsaW5lX2Zhc3QoRklMRSAqZmlsZSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOyAqLworCit2b2lkIGRpZV9pZl9mZXJyb3IoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqbXNnKSBGQVNUX0ZVTkM7Cit2b2lkIGRpZV9pZl9mZXJyb3Jfc3Rkb3V0KHZvaWQpIEZBU1RfRlVOQzsKK2ludCBmZmx1c2hfYWxsKHZvaWQpIEZBU1RfRlVOQzsKK3ZvaWQgZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChpbnQgcmV0dmFsKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CitpbnQgZmNsb3NlX2lmX25vdF9zdGRpbihGSUxFICpmaWxlKSBGQVNUX0ZVTkM7CitGSUxFKiB4Zm9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIEZBU1RfRlVOQzsKKy8qIFByaW50cyB3YXJuaW5nIHRvIHN0ZGVyciBhbmQgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmU6ICovCitGSUxFKiBmb3Blbl9vcl93YXJuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKSBGQVNUX0ZVTkM7CisvKiAiT3BlbnMiIHN0ZGluIGlmIGZpbGVuYW1lIGlzIHNwZWNpYWwsIGVsc2UganVzdCBvcGVucyBmaWxlOiAqLworRklMRSogeGZvcGVuX3N0ZGluKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CitGSUxFKiBmb3Blbl9vcl93YXJuX3N0ZGluKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CitGSUxFKiBmb3Blbl9mb3JfcmVhZChjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CitGSUxFKiB4Zm9wZW5fZm9yX3JlYWQoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworRklMRSogZm9wZW5fZm9yX3dyaXRlKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK0ZJTEUqIHhmb3Blbl9mb3Jfd3JpdGUoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworRklMRSogeGZkb3Blbl9mb3JfcmVhZChpbnQgZmQpIEZBU1RfRlVOQzsKK0ZJTEUqIHhmZG9wZW5fZm9yX3dyaXRlKGludCBmZCkgRkFTVF9GVU5DOworCitpbnQgYmJfcHN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSAvKiBub3QgRkFTVF9GVU5DISAqLzsKK3ZvaWQgcXNvcnRfc3RyaW5nX3ZlY3RvcihjaGFyICoqc3YsIHVuc2lnbmVkIGNvdW50KSBGQVNUX0ZVTkM7CisKKy8qIFdyYXBwZXIgd2hpY2ggcmVzdGFydHMgcG9sbCBvbiBFSU5UUiBvciBFTk9NRU0uCisgKiBPbiBvdGhlciBlcnJvcnMgY29tcGxhaW5zIFtwZXJyb3IoInBvbGwiKV0gYW5kIHJldHVybnMuCisgKiBXYXJuaW5nISBNYXkgdGFrZSAobXVjaCkgbG9uZ2VyIHRoYW4gdGltZW91dF9tcyB0byByZXR1cm4hCisgKiBJZiB0aGlzIGlzIGEgcHJvYmxlbSwgdXNlIGJhcmUgcG9sbCBhbmQgb3Blbi1jb2RlIEVJTlRSL0VOT01FTSBoYW5kbGluZyAqLworaW50IHNhZmVfcG9sbChzdHJ1Y3QgcG9sbGZkICp1ZmRzLCBuZmRzX3QgbmZkcywgaW50IHRpbWVvdXRfbXMpIEZBU1RfRlVOQzsKKworY2hhciAqc2FmZV9nZXRob3N0bmFtZSh2b2lkKSBGQVNUX0ZVTkM7CitjaGFyICpzYWZlX2dldGRvbWFpbm5hbWUodm9pZCkgRkFTVF9GVU5DOworCisvKiBDb252ZXJ0IGVhY2ggYWxwaGEgY2hhciBpbiBzdHIgdG8gbG93ZXItY2FzZSAqLworY2hhciogc3RyX3RvbG93ZXIoY2hhciAqc3RyKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnV0b2EodW5zaWduZWQgbikgRkFTVF9GVU5DOworY2hhciAqaXRvYShpbnQgbikgRkFTVF9GVU5DOworLyogUmV0dXJucyBhIHBvaW50ZXIgcGFzdCB0aGUgZm9ybWF0dGVkIG51bWJlciwgZG9lcyBOT1QgbnVsbC10ZXJtaW5hdGUgKi8KK2NoYXIgKnV0b2FfdG9fYnVmKHVuc2lnbmVkIG4sIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmbGVuKSBGQVNUX0ZVTkM7CitjaGFyICppdG9hX3RvX2J1ZihpbnQgbiwgY2hhciAqYnVmLCB1bnNpZ25lZCBidWZsZW4pIEZBU1RfRlVOQzsKKy8qIEludGVsbGlnZW50IGZvcm1hdHRlcnMgb2YgYmlnbnVtcyAqLwordm9pZCBzbWFydF91bGx0b2E0KHVuc2lnbmVkIGxvbmcgbG9uZyB1bCwgY2hhciBidWZbNF0sIGNvbnN0IGNoYXIgKnNjYWxlKSBGQVNUX0ZVTkM7Cit2b2lkIHNtYXJ0X3VsbHRvYTUodW5zaWduZWQgbG9uZyBsb25nIHVsLCBjaGFyIGJ1Zls1XSwgY29uc3QgY2hhciAqc2NhbGUpIEZBU1RfRlVOQzsKKy8qIElmIGJsb2NrX3NpemUgPT0gMCwgZGlzcGxheSBzaXplIHdpdGhvdXQgZnJhY3Rpb25hbCBwYXJ0LAorICogZWxzZSBkaXNwbGF5IChzaXplICogYmxvY2tfc2l6ZSkgd2l0aCBvbmUgZGVjaW1hbCBkaWdpdC4KKyAqIElmIGRpc3BsYXlfdW5pdCA9PSAwLCBzaG93IHZhbHVlIG5vIGJpZ2dlciB0aGFuIDEwMjQgd2l0aCBzdWZmaXggKEssTSxHLi4uKSwKKyAqIGVsc2UgZGl2aWRlIGJ5IGRpc3BsYXlfdW5pdCBhbmQgZG8gbm90IHVzZSBzdWZmaXguICovCisjZGVmaW5lIEhVTUFOX1JFQURBQkxFX01BWF9XSURUSCAgICAgIDcgIC8qICIxMDI0LjBHIiAqLworI2RlZmluZSBIVU1BTl9SRUFEQUJMRV9NQVhfV0lEVEhfU1RSICI3IgorLy9UT0RPOiBwcm92aWRlIHBvaW50ZXIgdG8gYnVmIChhdm9pZCBzdGF0aWNzKT8KK2NvbnN0IGNoYXIgKm1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLAorCQl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHVuc2lnbmVkIGxvbmcgZGlzcGxheV91bml0KSBGQVNUX0ZVTkM7CisvKiBQdXQgYSBzdHJpbmcgb2YgaGV4IGJ5dGVzICgiMWIyZTY2ZmUiLi4uKSwgcmV0dXJuIGFkdmFuY2VkIHBvaW50ZXIgKi8KK2NoYXIgKmJpbjJoZXgoY2hhciAqYnVmLCBjb25zdCBjaGFyICpjcCwgaW50IGNvdW50KSBGQVNUX0ZVTkM7CisvKiBSZXZlcnNlICovCitjaGFyKiBoZXgyYmluKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3RyLCBpbnQgY291bnQpIEZBU1RfRlVOQzsKKworLyogR2VuZXJhdGUgYSBVVUlEICovCit2b2lkIGdlbmVyYXRlX3V1aWQodWludDhfdCAqYnVmKSBGQVNUX0ZVTkM7CisKKy8qIExhc3QgZWxlbWVudCBpcyBtYXJrZWQgYnkgbXVsdCA9PSAwICovCitzdHJ1Y3Qgc3VmZml4X211bHQgeworCWNoYXIgc3VmZml4WzRdOworCXVuc2lnbmVkIG11bHQ7Cit9OworI2luY2x1ZGUgInhhdG9udW0uaCIKKy8qIFNwZWNpYWxpemVkOiAqLworCisvKiBVc2luZyB4YXRvaSgpIGluc3RlYWQgb2YgbmFpdmUgYXRvaSgpIGlzIG5vdCBhbHdheXMgY29udmVuaWVudCAtCisgKiBpbiBtYW55IHBsYWNlcyBwZW9wbGUgd2FudCAqbm9uLW5lZ2F0aXZlKiB2YWx1ZXMsIGJ1dCBzdG9yZSB0aGVtCisgKiBpbiBzaWduZWQgaW50LiBUaGVyZWZvcmUgd2UgbmVlZCB0aGlzIG9uZToKKyAqIGRpZXMgaWYgaW5wdXQgaXMgbm90IGluIFswLCBJTlRfTUFYXSByYW5nZS4gQWxzbyB3aWxsIHJlamVjdCAnLTAnIGV0Yy4KKyAqIEl0IHNob3VsZCByZWFsbHkgYmUgbmFtZWQgeGF0b2lfbm9ubmVnYXRpdmUgKHNpbmNlIGl0IGFsbG93cyAwKSwKKyAqIGJ1dCB0aGF0IHdvdWxkIGJlIHRvbyBsb25nLgorICovCitpbnQgeGF0b2lfcG9zaXRpdmUoY29uc3QgY2hhciAqbnVtc3RyKSBGQVNUX0ZVTkM7CisKKy8qIFVzZWZ1bCBmb3IgcmVhZGluZyBwb3J0IG51bWJlcnMgKi8KK3VpbnQxNl90IHhhdG91MTYoY29uc3QgY2hhciAqbnVtc3RyKSBGQVNUX0ZVTkM7CisKKworLyogVGhlc2UgcGFyc2UgZW50cmllcyBpbiAvZXRjL3Bhc3N3ZCBhbmQgL2V0Yy9ncm91cC4gIFRoaXMgaXMgZGVzaXJhYmxlCisgKiBmb3IgQnVzeUJveCBzaW5jZSB3ZSB3YW50IHRvIGF2b2lkIHVzaW5nIHRoZSBnbGliYyBOU1Mgc3R1ZmYsIHdoaWNoCisgKiBpbmNyZWFzZXMgdGFyZ2V0IHNpemUgYW5kIGlzIG9mdGVuIG5vdCBuZWVkZWQgb24gZW1iZWRkZWQgc3lzdGVtcy4gICovCitsb25nIHh1bmFtZTJ1aWQoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworbG9uZyB4Z3JvdXAyZ2lkKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKKy8qIHdyYXBwZXI6IGFsbG93cyBzdHJpbmcgdG8gY29udGFpbiBudW1lcmljIHVpZCBvciBnaWQgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3VnX2lkKGNvbnN0IGNoYXIgKnMsIGxvbmcgRkFTVF9GVU5DICgqeG5hbWUyaWQpKGNvbnN0IGNoYXIgKikpIEZBU1RfRlVOQzsKKy8qIGZyb20gY2hwc3QuIERvZXMgbm90IGRpZSwgcmV0dXJucyAwIG9uIGZhaWx1cmUgKi8KK3N0cnVjdCBiYl91aWRnaWRfdCB7CisJdWlkX3QgdWlkOworCWdpZF90IGdpZDsKK307CisvKiBhbHdheXMgc2V0cyB1aWQgYW5kIGdpZCAqLworaW50IGdldF91aWRnaWQoc3RydWN0IGJiX3VpZGdpZF90KiwgY29uc3QgY2hhciosIGludCBudW1lcmljX29rKSBGQVNUX0ZVTkM7CisvKiBhbHdheXMgc2V0cyB1aWQgYW5kIGdpZCwgYWxsb3dzIG51bWVyaWM7IGV4aXRzIG9uIGZhaWx1cmUgKi8KK3ZvaWQgeGdldF91aWRnaWQoc3RydWN0IGJiX3VpZGdpZF90KiwgY29uc3QgY2hhciopIEZBU1RfRlVOQzsKKy8qIGNob3duLWxpa2UgaGFuZGxpbmcgb2YgInVzZXJbOltncm91cF0iICovCit2b2lkIHBhcnNlX2Nob3duX3VzZXJncm91cF9vcl9kaWUoc3RydWN0IGJiX3VpZGdpZF90ICp1LCBjaGFyICp1c2VyX2dyb3VwKSBGQVNUX0ZVTkM7CitzdHJ1Y3QgcGFzc3dkKiB4Z2V0cHduYW0oY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworc3RydWN0IGdyb3VwKiB4Z2V0Z3JuYW0oY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworc3RydWN0IHBhc3N3ZCogeGdldHB3dWlkKHVpZF90IHVpZCkgRkFTVF9GVU5DOworc3RydWN0IGdyb3VwKiB4Z2V0Z3JnaWQoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7CitjaGFyKiB4dWlkMnVuYW1lKHVpZF90IHVpZCkgRkFTVF9GVU5DOworY2hhciogeGdpZDJncm91cChnaWRfdCBnaWQpIEZBU1RfRlVOQzsKK2NoYXIqIHVpZDJ1bmFtZSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NoYXIqIGdpZDJncm91cChnaWRfdCBnaWQpIEZBU1RfRlVOQzsKK2NoYXIqIHVpZDJ1bmFtZV91dG9hKHVpZF90IHVpZCkgRkFTVF9GVU5DOworY2hhciogZ2lkMmdyb3VwX3V0b2EoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7CisvKiB2ZXJzaW9ucyB3aGljaCBjYWNoZSByZXN1bHRzICh1c2VmdWwgZm9yIHBzLCBscyBldGMpICovCitjb25zdCBjaGFyKiBnZXRfY2FjaGVkX3VzZXJuYW1lKHVpZF90IHVpZCkgRkFTVF9GVU5DOworY29uc3QgY2hhciogZ2V0X2NhY2hlZF9ncm91cG5hbWUoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7Cit2b2lkIGNsZWFyX3VzZXJuYW1lX2NhY2hlKHZvaWQpIEZBU1RfRlVOQzsKKy8qIGludGVybmFsbHkgdXNlcm5hbWVzIGFyZSBzYXZlZCBpbiBmaXhlZC1zaXplZCBjaGFyW10gYnVmZmVycyAqLworZW51bSB7IFVTRVJOQU1FX01BWF9TSVpFID0gMzIgLSBzaXplb2YodWlkX3QpIH07CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMKK3ZvaWQgZGllX2lmX2JhZF91c2VybmFtZShjb25zdCBjaGFyKiBuYW1lKSBGQVNUX0ZVTkM7CisjZWxzZQorI2RlZmluZSBkaWVfaWZfYmFkX3VzZXJuYW1lKG5hbWUpICgodm9pZCkobmFtZSkpCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VUTVAKK3ZvaWQgRkFTVF9GVU5DIHdyaXRlX25ld191dG1wKHBpZF90IHBpZCwgaW50IG5ld190eXBlLCBjb25zdCBjaGFyICp0dHlfbmFtZSwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKTsKK3ZvaWQgRkFTVF9GVU5DIHVwZGF0ZV91dG1wKHBpZF90IHBpZCwgaW50IG5ld190eXBlLCBjb25zdCBjaGFyICp0dHlfbmFtZSwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKTsKKyNlbHNlCisjIGRlZmluZSB3cml0ZV9uZXdfdXRtcChwaWQsIG5ld190eXBlLCB0dHlfbmFtZSwgdXNlcm5hbWUsIGhvc3RuYW1lKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHVwZGF0ZV91dG1wKHBpZCwgbmV3X3R5cGUsIHR0eV9uYW1lLCB1c2VybmFtZSwgaG9zdG5hbWUpICgodm9pZCkwKQorI2VuZGlmCisKKworaW50IGV4ZWNhYmxlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY2hhciAqZmluZF9leGVjYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKlBBVEhwKSBGQVNUX0ZVTkM7CitpbnQgZXhpc3RzX2V4ZWNhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CisKKy8qIEJCX0VYRUN4eCBhbHdheXMgZXhlY3MgKGl0J3Mgbm90IGRvaW5nIE5PRk9SSy9OT0VYRUMgc3R1ZmYpLAorICogYnV0IGl0IG1heSBleGVjIGJ1c3lib3ggYW5kIGNhbGwgYXBwbGV0IGluc3RlYWQgb2Ygc2VhcmNoaW5nIFBBVEguCisgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworaW50IEJCX0VYRUNWUChjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pIEZBU1RfRlVOQzsKKyNkZWZpbmUgQkJfRVhFQ0xQKHByb2csY21kLC4uLikgXAorCWRvIHsgXAorCQlpZiAoZmluZF9hcHBsZXRfYnlfbmFtZShwcm9nKSA+PSAwKSBcCisJCQlleGVjbHAoYmJfYnVzeWJveF9leGVjX3BhdGgsIGNtZCwgX19WQV9BUkdTX18pOyBcCisJCWV4ZWNscChwcm9nLCBjbWQsIF9fVkFfQVJHU19fKTsgXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBCQl9FWEVDVlAocHJvZyxjbWQpICAgICBleGVjdnAocHJvZyxjbWQpCisjZGVmaW5lIEJCX0VYRUNMUChwcm9nLGNtZCwuLi4pIGV4ZWNscChwcm9nLGNtZCxfX1ZBX0FSR1NfXykKKyNlbmRpZgoraW50IEJCX0VYRUNWUF9vcl9kaWUoY2hhciAqKmFyZ3YpIE5PUkVUVVJOIEZBU1RfRlVOQzsKKworLyogeHZmb3JrKCkgY2FuJ3QgYmUgYSBfZnVuY3Rpb25fLCByZXR1cm4gYWZ0ZXIgdmZvcmsgbWFuZ2xlcyBzdGFjaworICogaW4gdGhlIHBhcmVudC4gSXQgbXVzdCBiZSBhIG1hY3JvLiAqLworI2RlZmluZSB4dmZvcmsoKSBcCisoeyBcCisJcGlkX3QgYmJfX3h2Zm9ya19waWQgPSB2Zm9yaygpOyBcCisJaWYgKGJiX194dmZvcmtfcGlkIDwgMCkgXAorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInZmb3JrIik7IFwKKwliYl9feHZmb3JrX3BpZDsgXAorfSkKKyNpZiBCQl9NTVUKK3BpZF90IHhmb3JrKHZvaWQpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisvKiBOT01NVSBmcmllbmR5IGZvcmsrZXhlYzogKi8KK3BpZF90IHNwYXduKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitwaWRfdCB4c3Bhd24oY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKworcGlkX3Qgc2FmZV93YWl0cGlkKHBpZF90IHBpZCwgaW50ICp3c3RhdCwgaW50IG9wdGlvbnMpIEZBU1RfRlVOQzsKK3BpZF90IHdhaXRfYW55X25vaGFuZyhpbnQgKndzdGF0KSBGQVNUX0ZVTkM7CisvKiB3YWl0NHBpZDogdW5saWtlIHdhaXRwaWQsIHdhaXRzIE9OTFkgZm9yIG9uZSBwcm9jZXNzLgorICogUmV0dXJucyBzaWcgKyAweDE4MCBpZiBjaGlsZCBpcyBraWxsZWQgYnkgc2lnbmFsLgorICogSXQncyBzYWZlIHRvIHBhc3MgbmVnYXRpdmUgJ3BpZHMnIGZyb20gZmFpbGVkIFt2XWZvcmsgLQorICogd2FpdDRwaWQgd2lsbCByZXR1cm4gLTEgKGFuZCB3aWxsIG5vdCBjbG9iYmVyIFt2XWZvcmsncyBlcnJubykuCisgKiBJT1c6IHJjID0gd2FpdDRwaWQoc3Bhd24oYXJndikpOworICogICAgICBpZiAocmMgPCAwKSBiYl9wZXJyb3JfbXNnKCIlcyIsIGFyZ3ZbMF0pOworICogICAgICBpZiAocmMgPiAwKSBiYl9lcnJvcl9tc2coImV4aXQgY29kZTogJWQiLCByYyAmIDB4ZmYpOworICovCitpbnQgd2FpdDRwaWQocGlkX3QgcGlkKSBGQVNUX0ZVTkM7CisvKiBTYW1lIGFzIHdhaXQ0cGlkKHNwYXduKGFyZ3YpKSwgYnV0IHdpdGggTk9GT1JLL05PRVhFQyBpZiBjb25maWd1cmVkOiAqLworaW50IHNwYXduX2FuZF93YWl0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisvKiBEb2VzIE5PVCBjaGVjayB0aGF0IGFwcGxldCBpcyBOT0ZPUkssIGp1c3QgYmxpbmRseSBydW5zIGl0ICovCitpbnQgcnVuX25vZm9ya19hcHBsZXQoaW50IGFwcGxldF9ubywgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKworLyogSGVscGVycyBmb3IgZGFlbW9uaXphdGlvbi4KKyAqCisgKiBiYl9kYWVtb25pemUoZmxhZ3MpID0gZGFlbW9uaXplLCBkb2VzIG5vdCBjb21waWxlIG9uIE5PTU1VCisgKgorICogYmJfZGFlbW9uaXplX29yX3JleGVjKGZsYWdzLCBhcmd2KSA9IGRhZW1vbml6ZXMgb24gTU1VIChhbmQgaWdub3JlcyBhcmd2KSwKKyAqICAgICAgcmV4ZWMncyBpdHNlbGYgb24gTk9NTVUgd2l0aCBhcmd2IHBhc3NlZCBhcyBjb21tYW5kIGxpbmUuCisgKiBUaHVzIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyBtYXkgY2F1c2UgeW91ciA8YXBwbGV0Pl9tYWluKCkgdG8gYmUgcmUtZXhlY3V0ZWQKKyAqIGZyb20gdGhlIHN0YXJ0LiAoSXQgd2lsbCBkZXRlY3QgaXQgYW5kIG5vdCByZWV4ZWMgYWdhaW4gc2Vjb25kIHRpbWUpLgorICogWW91IGhhdmUgdG8gYXVkaXQgY2FyZWZ1bGx5IHRoYXQgeW91IGRvbid0IGRvIHNvbWV0aGluZyB0d2ljZSBhcyBhIHJlc3VsdAorICogKG9wZW5pbmcgZmlsZXMvc29ja2V0cywgcGFyc2luZyBjb25maWcgZmlsZXMgZXRjLi4uKSEKKyAqCisgKiBCb3RoIG9mIHRoZSBhYm92ZSB3aWxsIHJlZGlyZWN0IGZkIDAsMSwyIHRvIC9kZXYvbnVsbCBhbmQgZHJvcCBjdHR5CisgKiAod2lsbCBkbyBzZXRzaWQoKSkuCisgKgorICogZm9ya19vcl9yZXhlYyhhcmd2KSA9IGJhcmUtYm9uZXMgZm9yayBvbiBNTVUsCisgKiAgICAgICJ2Zm9yayArIHJlLWV4ZWMgb3Vyc2VsZiIgb24gTk9NTVUuIE5vIGZkIHJlZGlyZWN0aW9uLCBubyBzZXRzaWQoKS4KKyAqICAgICAgT24gTU1VIGlnbm9yZXMgYXJndi4KKyAqCisgKiBIZWxwZXIgZm9yIG5ldHdvcmsgZGFlbW9ucyBpbiBmb3JlZ3JvdW5kIG1vZGU6CisgKgorICogYmJfc2FuaXRpemVfc3RkaW8oKSA9IG1ha2Ugc3VyZSB0aGF0IGZkIDAsMSwyIGFyZSBvcGVuZWQgYnkgb3BlbmluZyB0aGVtCisgKiB0byAvZGV2L251bGwgaWYgdGhleSBhcmUgbm90LgorICovCitlbnVtIHsKKwlEQUVNT05fQ0hESVJfUk9PVCA9IDEsCisJREFFTU9OX0RFVk5VTExfU1RESU8gPSAyLAorCURBRU1PTl9DTE9TRV9FWFRSQV9GRFMgPSA0LAorCURBRU1PTl9PTkxZX1NBTklUSVpFID0gOCwgLyogaW50ZXJuYWwgdXNlICovCit9OworI2lmIEJCX01NVQorICBlbnVtIHsgcmVfZXhlY2VkID0gMCB9OworIyBkZWZpbmUgZm9ya19vcl9yZXhlYyhhcmd2KSAgICAgICAgICAgICAgICB4Zm9yaygpCisjIGRlZmluZSBiYl9kYWVtb25pemVfb3JfcmV4ZWMoZmxhZ3MsIGFyZ3YpIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyhmbGFncykKKyMgZGVmaW5lIGJiX2RhZW1vbml6ZShmbGFncykgICAgICAgICAgICAgICAgYmJfZGFlbW9uaXplX29yX3JleGVjKGZsYWdzLCBib2d1cykKKyNlbHNlCisgIGV4dGVybiBib29sIHJlX2V4ZWNlZDsKKyAgdm9pZCByZV9leGVjKGNoYXIgKiphcmd2KSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisgIHBpZF90IGZvcmtfb3JfcmV4ZWMoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyAgaW50ICBCVUdfZm9ya19pc191bmF2YWlsYWJsZV9vbl9ub21tdSh2b2lkKSBGQVNUX0ZVTkM7CisgIGludCAgQlVHX2RhZW1vbl9pc191bmF2YWlsYWJsZV9vbl9ub21tdSh2b2lkKSBGQVNUX0ZVTkM7CisgIHZvaWQgQlVHX2JiX2RhZW1vbml6ZV9pc191bmF2YWlsYWJsZV9vbl9ub21tdSh2b2lkKSBGQVNUX0ZVTkM7CisjIGRlZmluZSBmb3JrKCkgICAgICAgICAgQlVHX2ZvcmtfaXNfdW5hdmFpbGFibGVfb25fbm9tbXUoKQorIyBkZWZpbmUgeGZvcmsoKSAgICAgICAgIEJVR19mb3JrX2lzX3VuYXZhaWxhYmxlX29uX25vbW11KCkKKyMgZGVmaW5lIGRhZW1vbihhLGIpICAgICBCVUdfZGFlbW9uX2lzX3VuYXZhaWxhYmxlX29uX25vbW11KCkKKyMgZGVmaW5lIGJiX2RhZW1vbml6ZShhKSBCVUdfYmJfZGFlbW9uaXplX2lzX3VuYXZhaWxhYmxlX29uX25vbW11KCkKKyNlbmRpZgordm9pZCBiYl9kYWVtb25pemVfb3JfcmV4ZWMoaW50IGZsYWdzLCBjaGFyICoqYXJndikgRkFTVF9GVU5DOwordm9pZCBiYl9zYW5pdGl6ZV9zdGRpbyh2b2lkKSBGQVNUX0ZVTkM7CisvKiBDbGVhciBkYW5nZXJvdXMgc3R1ZmYsIHNldCBQQVRILiBSZXR1cm4gMSBpZiB3YXMgcnVuIGJ5IGRpZmZlcmVudCB1c2VyLiAqLworaW50IHNhbml0aXplX2Vudl9pZl9zdWlkKHZvaWQpIEZBU1RfRlVOQzsKKworCitjaGFyKiBzaW5nbGVfYXJndihjaGFyICoqYXJndikgRkFTVF9GVU5DOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IGJiX2FyZ3ZfZGFzaFtdOyAvKiAiLSIsIE5VTEwgKi8KK2V4dGVybiBjb25zdCBjaGFyICpvcHRfY29tcGxlbWVudGFyeTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTIHx8IEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisjZGVmaW5lIE5vX2FyZ3VtZW50ICJcMCIKKyNkZWZpbmUgUmVxdWlyZWRfYXJndW1lbnQgIlwwMDEiCisjZGVmaW5lIE9wdGlvbmFsX2FyZ3VtZW50ICJcMDAyIgorZXh0ZXJuIGNvbnN0IGNoYXIgKmFwcGxldF9sb25nX29wdGlvbnM7CisjZW5kaWYKK2V4dGVybiB1aW50MzJfdCBvcHRpb25fbWFzazMyOworZXh0ZXJuIHVpbnQzMl90IGdldG9wdDMyKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICphcHBsZXRfb3B0cywgLi4uKSBGQVNUX0ZVTkM7CisKKworLyogSGF2aW5nIG5leHQgcG9pbnRlciBhcyBhIGZpcnN0IG1lbWJlciBhbGxvd3MgZWFzeSBjcmVhdGlvbgorICogb2YgImxsaXN0LWNvbXBhdGlibGUiIHN0cnVjdHMsIGFuZCB1c2luZyBsbGlzdF9GT08gZnVuY3Rpb25zCisgKiBvbiB0aGVtLgorICovCit0eXBlZGVmIHN0cnVjdCBsbGlzdF90IHsKKwlzdHJ1Y3QgbGxpc3RfdCAqbGluazsKKwljaGFyICpkYXRhOworfSBsbGlzdF90Owordm9pZCBsbGlzdF9hZGRfdG8obGxpc3RfdCAqKm9sZF9oZWFkLCB2b2lkICpkYXRhKSBGQVNUX0ZVTkM7Cit2b2lkIGxsaXN0X2FkZF90b19lbmQobGxpc3RfdCAqKmxpc3RfaGVhZCwgdm9pZCAqZGF0YSkgRkFTVF9GVU5DOwordm9pZCAqbGxpc3RfcG9wKGxsaXN0X3QgKiplbG0pIEZBU1RfRlVOQzsKK3ZvaWQgbGxpc3RfdW5saW5rKGxsaXN0X3QgKipoZWFkLCBsbGlzdF90ICplbG0pIEZBU1RfRlVOQzsKK3ZvaWQgbGxpc3RfZnJlZShsbGlzdF90ICplbG0sIHZvaWQgKCpmcmVlaXQpKHZvaWQgKmRhdGEpKSBGQVNUX0ZVTkM7CitsbGlzdF90ICpsbGlzdF9yZXYobGxpc3RfdCAqbGlzdCkgRkFTVF9GVU5DOworbGxpc3RfdCAqbGxpc3RfZmluZF9zdHIobGxpc3RfdCAqZmlyc3QsIGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOworLyogQlRXLCBzdXJwcmlzaW5nbHksIGNoYW5naW5nIEFQSSB0bworICogICBsbGlzdF90ICpsbGlzdF9hZGRfdG8obGxpc3RfdCAqb2xkX2hlYWQsIHZvaWQgKmRhdGEpCisgKiBldGMgZG9lcyBub3QgcmVzdWx0IGluIHNtYWxsZXIgY29kZS4uLiAqLworCisvKiBzdGFydF9zdG9wX2RhZW1vbiBhbmQgdWRoY3BjIGFyZSBzcGVjaWFsIC0gdGhleSB3YW50CisgKiB0byBjcmVhdGUgcGlkZmlsZXMgcmVnYXJkbGVzcyBvZiBGRUFUVVJFX1BJREZJTEUgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFIHx8IGRlZmluZWQoV0FOVF9QSURGSUxFKQorLyogVHJ1ZSBvbmx5IGlmIHdlIGNyZWF0ZWQgcGlkZmlsZSB3aGljaCBpcyAqZmlsZSosIG5vdCAvZGV2L251bGwgZXRjICovCitleHRlcm4gc21hbGxpbnQgd3JvdGVfcGlkZmlsZTsKK3ZvaWQgd3JpdGVfcGlkZmlsZShjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisjZGVmaW5lIHJlbW92ZV9waWRmaWxlKHBhdGgpIGRvIHsgaWYgKHdyb3RlX3BpZGZpbGUpIHVubGluayhwYXRoKTsgfSB3aGlsZSAoMCkKKyNlbHNlCitlbnVtIHsgd3JvdGVfcGlkZmlsZSA9IDAgfTsKKyNkZWZpbmUgd3JpdGVfcGlkZmlsZShwYXRoKSAgKCh2b2lkKTApCisjZGVmaW5lIHJlbW92ZV9waWRmaWxlKHBhdGgpICgodm9pZCkwKQorI2VuZGlmCisKK2VudW0geworCUxPR01PREVfTk9ORSA9IDAsCisJTE9HTU9ERV9TVERJTyA9ICgxIDw8IDApLAorCUxPR01PREVfU1lTTE9HID0gKDEgPDwgMSkgKiBFTkFCTEVfRkVBVFVSRV9TWVNMT0csCisJTE9HTU9ERV9CT1RIID0gTE9HTU9ERV9TWVNMT0cgKyBMT0dNT0RFX1NURElPLAorfTsKK2V4dGVybiBjb25zdCBjaGFyICptc2dfZW9sOworZXh0ZXJuIHNtYWxsaW50IGxvZ21vZGU7CitleHRlcm4gaW50IGRpZV9zbGVlcDsKK2V4dGVybiB1aW50OF90IHhmdW5jX2Vycm9yX3JldHZhbDsKK2V4dGVybiBqbXBfYnVmIGRpZV9qbXA7CitleHRlcm4gdm9pZCB4ZnVuY19kaWUodm9pZCkgTk9SRVRVUk4gRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfc2hvd191c2FnZSh2b2lkKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9lcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4sIGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3BlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfc2ltcGxlX3BlcnJvcl9tc2coY29uc3QgY2hhciAqcykgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfcGVycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMpIE5PUkVUVVJOIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2hlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfaGVycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSh2b2lkKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9wZXJyb3Jfbm9tc2codm9pZCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfaW5mb19tc2coY29uc3QgY2hhciAqcywgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfdmVycm9yX21zZyhjb25zdCBjaGFyICpzLCB2YV9saXN0IHAsIGNvbnN0IGNoYXIgKnN0cmVycikgRkFTVF9GVU5DOworCisvKiBXZSBuZWVkIHRvIGV4cG9ydCBYWFhfbWFpbiBmcm9tIGxpYmJ1c3lib3gKKyAqIG9ubHkgaWYgd2UgYnVpbGQgImluZGl2aWR1YWwiIGJpbmFyaWVzCisgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMCisjZGVmaW5lIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFIEVYVEVSTkFMTFlfVklTSUJMRQorI2Vsc2UKKyNkZWZpbmUgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUKKyNlbmRpZgorCisKKy8qIEFwcGxldHMgd2hpY2ggYXJlIHVzZWZ1bCBmcm9tIGFub3RoZXIgYXBwbGV0cyAqLworaW50IGJiX2NhdChjaGFyKiogYXJndik7CisvKiBJZiBzaGVsbCBuZWVkcyB0aGVtLCB0aGV5IGV4aXN0IGV2ZW4gaWYgbm90IGVuYWJsZWQgYXMgYXBwbGV0cyAqLworaW50IGVjaG9fbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIElGX0VDSE8oTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUpOworaW50IHByaW50Zl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgSUZfUFJJTlRGKE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFKTsKK2ludCB0ZXN0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBJRl9URVNUKE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFKTsKK2ludCBraWxsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBJRl9LSUxMKE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFKTsKKy8qIFNpbWlsYXIsIGJ1dCB1c2VkIGJ5IGNoZ3JwLCBub3Qgc2hlbGwgKi8KK2ludCBjaG93bl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgSUZfQ0hPV04oTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUpOworLyogVXNlZCBieSBmdHBkICovCitpbnQgbHNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIElGX0xTKE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFKTsKKy8qIERvbid0IG5lZWQgSUZfeHh4KCkgZ3VhcmQgZm9yIHRoZXNlICovCitpbnQgZ3VuemlwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBidW56aXAyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKworI2lmIEVOQUJMRV9ST1VURQordm9pZCBiYl9kaXNwbGF5cm91dGVzKGludCBub3Jlc29sdmUsIGludCBuZXRzdGF0Zm10KSBGQVNUX0ZVTkM7CisjZW5kaWYKKworCisvKiBOZXR3b3JraW5nICovCitpbnQgY3JlYXRlX2ljbXBfc29ja2V0KHZvaWQpIEZBU1RfRlVOQzsKK2ludCBjcmVhdGVfaWNtcDZfc29ja2V0KHZvaWQpIEZBU1RfRlVOQzsKKy8qIGludGVyZmFjZS5jICovCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHByb3RvY29sIGZhbWlsaWVzIGFuZCB0aGVpciBoYW5kbGVycy4gKi8KK3N0cnVjdCBhZnR5cGUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqdGl0bGU7CisJaW50IGFmOworCWludCBhbGVuOworCWNoYXIqICAgICAgIEZBU1RfRlVOQyAoKnByaW50KSh1bnNpZ25lZCBjaGFyICopOworCWNvbnN0IGNoYXIqIEZBU1RfRlVOQyAoKnNwcmludCkoc3RydWN0IHNvY2thZGRyICosIGludCBudW1lcmljKTsKKwlpbnQgICAgICAgICBGQVNUX0ZVTkMgKCppbnB1dCkoLyppbnQgdHlwZSwqLyBjb25zdCBjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKik7CisJdm9pZCAgICAgICAgRkFTVF9GVU5DICgqaGVycm9yKShjaGFyICp0ZXh0KTsKKwlpbnQgICAgICAgICBGQVNUX0ZVTkMgKCpycHJpbnQpKGludCBvcHRpb25zKTsKKwlpbnQgICAgICAgICBGQVNUX0ZVTkMgKCpyaW5wdXQpKGludCB0eXAsIGludCBleHQsIGNoYXIgKiphcmd2KTsKKwkvKiBtYXkgbW9kaWZ5IHNyYyAqLworCWludCAgICAgICAgIEZBU1RfRlVOQyAoKmdldG1hc2spKGNoYXIgKnNyYywgc3RydWN0IHNvY2thZGRyICptYXNrLCBjaGFyICpuYW1lKTsKK307CisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGhhcmR3YXJlIHByb3RvY29scyBhbmQgdGhlaXIgaGFuZGxlcnMuICovCitzdHJ1Y3QgaHd0eXBlIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnRpdGxlOworCWludCB0eXBlOworCWludCBhbGVuOworCWNoYXIqIEZBU1RfRlVOQyAoKnByaW50KSh1bnNpZ25lZCBjaGFyICopOworCWludCAgIEZBU1RfRlVOQyAoKmlucHV0KShjb25zdCBjaGFyICosIHN0cnVjdCBzb2NrYWRkciAqKTsKKwlpbnQgICBGQVNUX0ZVTkMgKCphY3RpdmF0ZSkoaW50IGZkKTsKKwlpbnQgc3VwcHJlc3NfbnVsbF9hZGRyOworfTsKK2V4dGVybiBzbWFsbGludCBpbnRlcmZhY2Vfb3B0X2E7CitpbnQgZGlzcGxheV9pbnRlcmZhY2VzKGNoYXIgKmlmbmFtZSkgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9GRUFUVVJFX0hXSUIKK2ludCBpbl9pYihjb25zdCBjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkgRkFTVF9GVU5DOworI2Vsc2UKKyNkZWZpbmUgaW5faWIoYSwgYikgMSAvKiBmYWlsICovCisjZW5kaWYKK2NvbnN0IHN0cnVjdCBhZnR5cGUgKmdldF9hZnR5cGUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY29uc3Qgc3RydWN0IGh3dHlwZSAqZ2V0X2h3dHlwZShjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7Citjb25zdCBzdHJ1Y3QgaHd0eXBlICpnZXRfaHdudHlwZShpbnQgdHlwZSkgRkFTVF9GVU5DOworCisKKyNpZm5kZWYgQlVJTERfSU5ESVZJRFVBTAorZXh0ZXJuIGludCBmaW5kX2FwcGxldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKKy8qIFJldHVybnMgb25seSBpZiBhcHBsZXQgaXMgbm90IGZvdW5kLiAqLworZXh0ZXJuIHZvaWQgcnVuX2FwcGxldF9hbmRfZXhpdChjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqYXJndikgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgcnVuX2FwcGxldF9ub19hbmRfZXhpdChpbnQgYSwgY2hhciAqKmFyZ3YpIE5PUkVUVVJOIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9NTlRFTlRfSAorZXh0ZXJuIGludCBtYXRjaF9mc3R5cGUoY29uc3Qgc3RydWN0IG1udGVudCAqbXQsIGNvbnN0IGNoYXIgKmZzdHlwZXMpIEZBU1RfRlVOQzsKK2V4dGVybiBzdHJ1Y3QgbW50ZW50ICpmaW5kX21vdW50X3BvaW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdWJkaXJfdG9vKSBGQVNUX0ZVTkM7CisjZW5kaWYKK2V4dGVybiB2b2lkIGVyYXNlX210YWIoY29uc3QgY2hhciAqIG5hbWUpIEZBU1RfRlVOQzsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdHR5X2JhdWRfdG9fdmFsdWUoc3BlZWRfdCBzcGVlZCkgRkFTVF9GVU5DOworZXh0ZXJuIHNwZWVkX3QgdHR5X3ZhbHVlX3RvX2JhdWQodW5zaWduZWQgaW50IHZhbHVlKSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0RFU0tUT1AKK2V4dGVybiB2b2lkIGJiX3dhcm5faWdub3JpbmdfYXJncyhjaGFyICphcmcpIEZBU1RfRlVOQzsKKyNlbHNlCisjIGRlZmluZSBiYl93YXJuX2lnbm9yaW5nX2FyZ3MoYXJnKSAoKHZvaWQpMCkKKyNlbmRpZgorCitleHRlcm4gaW50IGdldF9saW51eF92ZXJzaW9uX2NvZGUodm9pZCkgRkFTVF9GVU5DOworCitleHRlcm4gY2hhciAqcXVlcnlfbG9vcChjb25zdCBjaGFyICpkZXZpY2UpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgZGVsX2xvb3AoY29uc3QgY2hhciAqZGV2aWNlKSBGQVNUX0ZVTkM7CisvKiBJZiAqZGV2bmFtZSBpcyBub3QgTlVMTCwgdXNlIHRoYXQgbmFtZSwgb3RoZXJ3aXNlIHRyeSB0byBmaW5kIGZyZWUgb25lLAorICogbWFsbG9jIGFuZCByZXR1cm4gaXQgaW4gKmRldm5hbWUuCisgKiByZXR1cm4gdmFsdWU6IDE6IHJlYWQtb25seSBsb29wZGV2IHdhcyBzZXR1cCwgMDogcncsIDwgMDogZXJyb3IgKi8KK2V4dGVybiBpbnQgc2V0X2xvb3AoY2hhciAqKmRldm5hbWUsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpIEZBU1RfRlVOQzsKKworLyogTGlrZSBiYl9hc2sgYmVsb3csIGJ1dCBhc2tzIG9uIHN0ZGluIHdpdGggbm8gdGltZW91dC4gICovCitjaGFyICpiYl9hc2tfc3RkaW4oY29uc3QgY2hhciAqIHByb21wdCkgRkFTVF9GVU5DOworLy9UT0RPOiBwYXNzIGJ1ZiBwb2ludGVyIG9yIHJldHVybiBhbGxvY2F0ZWQgYnVmIChhdm9pZCBzdGF0aWNzKT8KK2NoYXIgKmJiX2Fzayhjb25zdCBpbnQgZmQsIGludCB0aW1lb3V0LCBjb25zdCBjaGFyICogcHJvbXB0KSBGQVNUX0ZVTkM7CitpbnQgYmJfYXNrX2NvbmZpcm1hdGlvbih2b2lkKSBGQVNUX0ZVTkM7CisKK2ludCBiYl9wYXJzZV9tb2RlKGNvbnN0IGNoYXIqIHMsIG1vZGVfdCogdGhlTW9kZSkgRkFTVF9GVU5DOworCisvKgorICogQ29uZmlnIGZpbGUgcGFyc2VyCisgKi8KK2VudW0geworCVBBUlNFX0NPTExBUFNFICA9IDB4MDAwMTAwMDAsIC8vIHRyZWF0IGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXMgb25lCisJUEFSU0VfVFJJTSAgICAgID0gMHgwMDAyMDAwMCwgLy8gdHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBkZWxpbWl0ZXJzCisvLyBUT0RPOiBDT0xMQVBTRSBhbmQgVFJJTSBzZWVtIHRvIGFsd2F5cyBnbyBpbiBwYWlyCisJUEFSU0VfR1JFRURZICAgID0gMHgwMDA0MDAwMCwgLy8gbGFzdCB0b2tlbiB0YWtlcyBlbnRpcmUgcmVtYWluZGVyIG9mIHRoZSBsaW5lCisJUEFSU0VfTUlOX0RJRSAgID0gMHgwMDEwMDAwMCwgLy8gZGllIGlmIDwgbWluIHRva2VucyBmb3VuZAorCS8vIGtlZXAgYSBjb3B5IG9mIGN1cnJlbnQgbGluZQorCVBBUlNFX0tFRVBfQ09QWSA9IDB4MDAyMDAwMDAgKiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9ELAorLy8JUEFSU0VfRVNDQVBFICAgID0gMHgwMDQwMDAwMCwgLy8gcHJvY2VzcyBlc2NhcGUgc2VxdWVuY2VzIGluIHRva2VucworCS8vIE5PUk1BTCBpczoKKwkvLyAqIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBkZWxpbWl0ZXJzIGFuZCBjb2xsYXBzZQorCS8vICAgbXVsdGlwbGUgZGVsaW1pdGVycyBpbnRvIG9uZQorCS8vICogd2FybiBhbmQgY29udGludWUgaWYgbGVzcyB0aGFuIG1pbnRva2VucyBkZWxpbWl0ZXJzIGZvdW5kCisJLy8gKiBncmFiIGV2ZXJ5dGhpbmcgaW50byBsYXN0IHRva2VuCisJUEFSU0VfTk9STUFMICAgID0gUEFSU0VfQ09MTEFQU0UgfCBQQVJTRV9UUklNIHwgUEFSU0VfR1JFRURZLAorfTsKK3R5cGVkZWYgc3RydWN0IHBhcnNlcl90IHsKKwlGSUxFICpmcDsKKwljaGFyICpkYXRhOworCWNoYXIgKmxpbmUsICpubGluZTsKKwlzaXplX3QgbGluZV9hbGxvYywgbmxpbmVfYWxsb2M7CisJaW50IGxpbmVubzsKK30gcGFyc2VyX3Q7CitwYXJzZXJfdCogY29uZmlnX29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKK3BhcnNlcl90KiBjb25maWdfb3BlbjIoY29uc3QgY2hhciAqZmlsZW5hbWUsIEZJTEUqIEZBU1RfRlVOQyAoKmZvcGVuX2Z1bmMpKGNvbnN0IGNoYXIgKnBhdGgpKSBGQVNUX0ZVTkM7CisvKiBkZWxpbXNbMF0gaXMgYSBjb21tZW50IGNoYXIgKHVzZSAnXDAnIHRvIGRpc2FibGUpLCB0aGUgcmVzdCBhcmUgdG9rZW4gZGVsaW1pdGVycyAqLworaW50IGNvbmZpZ19yZWFkKHBhcnNlcl90ICpwYXJzZXIsIGNoYXIgKip0b2tlbnMsIHVuc2lnbmVkIGZsYWdzLCBjb25zdCBjaGFyICpkZWxpbXMpIEZBU1RfRlVOQzsKKyNkZWZpbmUgY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIG1heCwgbWluLCBzdHIsIGZsYWdzKSBcCisJY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsICgoZmxhZ3MpIHwgKCgobWluKSAmIDB4RkYpIDw8IDgpIHwgKChtYXgpICYgMHhGRikpLCBzdHIpCit2b2lkIGNvbmZpZ19jbG9zZShwYXJzZXJfdCAqcGFyc2VyKSBGQVNUX0ZVTkM7CisKKy8qIENvbmNhdGVuYXRlIHBhdGggYW5kIGZpbGVuYW1lIHRvIG5ldyBhbGxvY2F0ZWQgYnVmZmVyLgorICogQWRkICIvIiBvbmx5IGFzIG5lZWRlZCAobm8gZHVwbGljYXRlICIvLyIgYXJlIHByb2R1Y2VkKS4KKyAqIElmIHBhdGggaXMgTlVMTCwgaXQgaXMgYXNzdW1lZCB0byBiZSAiLyIuCisgKiBmaWxlbmFtZSBzaG91bGQgbm90IGJlIE5VTEwuICovCitjaGFyICpjb25jYXRfcGF0aF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CisvKiBSZXR1cm5zIE5VTEwgb24gLiBhbmQgLi4gKi8KK2NoYXIgKmNvbmNhdF9zdWJwYXRoX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKKworCitpbnQgYmJfbWFrZV9kaXJlY3RvcnkoY2hhciAqcGF0aCwgbG9uZyBtb2RlLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKworaW50IGdldF9zaWdudW0oY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY29uc3QgY2hhciAqZ2V0X3NpZ25hbWUoaW50IG51bWJlcikgRkFTVF9GVU5DOwordm9pZCBwcmludF9zaWduYW1lcyh2b2lkKSBGQVNUX0ZVTkM7CisKK2NoYXIgKmJiX3NpbXBsaWZ5X3BhdGgoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworLyogUmV0dXJucyBwdHIgdG8gTlVMICovCitjaGFyICpiYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKKworI2RlZmluZSBMT0dJTl9GQUlMX0RFTEFZIDMKK2V4dGVybiB2b2lkIGJiX2RvX2RlbGF5KGludCBzZWNvbmRzKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBjaGFuZ2VfaWRlbnRpdHkoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHJ1bl9zaGVsbChjb25zdCBjaGFyICpzaGVsbCwgaW50IGxvZ2luc2hlbGwsIGNvbnN0IGNoYXIgKmNvbW1hbmQsIGNvbnN0IGNoYXIgKiphZGRpdGlvbmFsX2FyZ3MpIE5PUkVUVVJOIEZBU1RfRlVOQzsKKworLyogUmV0dXJucyAkU0hFTEwsIGdldHB3dWlkKGdldHVpZCgpKS0+cHdfc2hlbGwsIG9yIERFRkFVTFRfU0hFTEwuCisgKiBOb3RlIHRoYXQgZ2V0cHd1aWQgcmVzdWx0IG1pZ2h0IG5lZWQgeHN0cmR1cCdpbmcKKyAqIGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2YgaW50ZXJ2ZW5pbmcgZ2V0cHd4eHgoKSBjYWxscy4KKyAqLworY29uc3QgY2hhciAqZ2V0X3NoZWxsX25hbWUodm9pZCk7CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorZXh0ZXJuIHZvaWQgcmVuZXdfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KHZvaWQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHNldF9jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQoc2VjdXJpdHlfY29udGV4dF90IHNpZCkgRkFTVF9GVU5DOworZXh0ZXJuIGNvbnRleHRfdCBzZXRfc2VjdXJpdHlfY29udGV4dF9jb21wb25lbnQoc2VjdXJpdHlfY29udGV4dF90IGN1cl9jb250ZXh0LAorCQkJCQkJY2hhciAqdXNlciwgY2hhciAqcm9sZSwgY2hhciAqdHlwZSwgY2hhciAqcmFuZ2UpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHNldGZzY3JlYXRlY29uX29yX2RpZShzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHNlbGludXhfcHJlc2VydmVfZmNvbnRleHQoaW50IGZkZXNjKSBGQVNUX0ZVTkM7CisjZWxzZQorI2RlZmluZSBzZWxpbnV4X3ByZXNlcnZlX2Zjb250ZXh0KGZkZXNjKSAoKHZvaWQpMCkKKyNlbmRpZgorZXh0ZXJuIHZvaWQgc2VsaW51eF9vcl9kaWUodm9pZCkgRkFTVF9GVU5DOworCisKKy8qIHN5c3RlbWQgc3VwcG9ydCAqLworI2RlZmluZSBTRF9MSVNURU5fRkRTX1NUQVJUIDMKK2ludCBzZF9saXN0ZW5fZmRzKHZvaWQpOworCisKKy8qIHNldHVwX2Vudmlyb25tZW50OgorICogaWYgY2hkaXIgcHctPnB3X2Rpcjogb2s6IGVsc2UgaWYgdG9fdG1wID09IDE6IGdvdG8gL3RtcCBlbHNlOiBnb3RvIC8gb3IgZGllCisgKiBpZiBjbGVhcl9lbnYgPSAxOiBjZChwdy0+cHdfZGlyKSwgY2xlYXIgZW52aXJvbm1lbnQsIHRoZW4gc2V0CisgKiAgIFRFUk09KG9sZCB2YWx1ZSkKKyAqICAgVVNFUj1wdy0+cHdfbmFtZSwgTE9HTkFNRT1wdy0+cHdfbmFtZQorICogICBQQVRIPWJiX2RlZmF1bHRfW3Jvb3RfXXBhdGgKKyAqICAgSE9NRT1wdy0+cHdfZGlyCisgKiAgIFNIRUxMPXNoZWxsCisgKiBlbHNlIGlmIGNoYW5nZV9lbnYgPSAxOgorICogICBpZiBub3Qgcm9vdCAoaWYgcHctPnB3X3VpZCAhPSAwKToKKyAqICAgICBVU0VSPXB3LT5wd19uYW1lLCBMT0dOQU1FPXB3LT5wd19uYW1lCisgKiAgIEhPTUU9cHctPnB3X2RpcgorICogICBTSEVMTD1zaGVsbAorICogZWxzZSBkb2VzIG5vdGhpbmcKKyAqLworI2RlZmluZSBTRVRVUF9FTlZfQ0hBTkdFRU5WICgxIDw8IDApCisjZGVmaW5lIFNFVFVQX0VOVl9DTEVBUkVOViAgKDEgPDwgMSkKKyNkZWZpbmUgU0VUVVBfRU5WX1RPX1RNUCAgICAoMSA8PCAyKQorZXh0ZXJuIHZvaWQgc2V0dXBfZW52aXJvbm1lbnQoY29uc3QgY2hhciAqc2hlbGwsIGludCBmbGFncywgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgY29ycmVjdF9wYXNzd29yZChjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdykgRkFTVF9GVU5DOworLyogUmV0dXJucyBhIG1hbGxvY2VkIHN0cmluZyAqLworI2lmICFFTkFCTEVfVVNFX0JCX0NSWVBUCisjZGVmaW5lIHB3X2VuY3J5cHQoY2xlYXIsIHNhbHQsIGNsZWFudXApIHB3X2VuY3J5cHQoY2xlYXIsIHNhbHQpCisjZW5kaWYKK2V4dGVybiBjaGFyICpwd19lbmNyeXB0KGNvbnN0IGNoYXIgKmNsZWFyLCBjb25zdCBjaGFyICpzYWx0LCBpbnQgY2xlYW51cCkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBvYnNjdXJlKGNvbnN0IGNoYXIgKm9sZCwgY29uc3QgY2hhciAqbmV3dmFsLCBjb25zdCBzdHJ1Y3QgcGFzc3dkICpwd2RwKSBGQVNUX0ZVTkM7CisvKgorICogcm5kIGlzIGFkZGl0aW9uYWwgcmFuZG9tIGlucHV0LiBOZXcgb25lIGlzIHJldHVybmVkLgorICogVXNlZnVsIGlmIHlvdSBjYWxsIGNyeXB0X21ha2Vfc2FsdCBtYW55IHRpbWVzIGluIGEgcm93OgorICogcm5kID0gY3J5cHRfbWFrZV9zYWx0KGJ1ZjEsIDQsIDApOworICogcm5kID0gY3J5cHRfbWFrZV9zYWx0KGJ1ZjIsIDQsIHJuZCk7CisgKiBybmQgPSBjcnlwdF9tYWtlX3NhbHQoYnVmMywgNCwgcm5kKTsKKyAqIChvdGhlcndpc2Ugd2UgcmlzayBoYXZpbmcgc2FtZSBzYWx0IGdlbmVyYXRlZCkKKyAqLworZXh0ZXJuIGludCBjcnlwdF9tYWtlX3NhbHQoY2hhciAqcCwgaW50IGNudCAvKiwgaW50IHJuZCovKSBGQVNUX0ZVTkM7CisvKiAiJE4kIiArIHNoYV9zYWx0XzE2X2J5dGVzICsgTlVMICovCisjZGVmaW5lIE1BWF9QV19TQUxUX0xFTiAoMyArIDE2ICsgMSkKK2V4dGVybiBjaGFyKiBjcnlwdF9tYWtlX3B3X3NhbHQoY2hhciBwW01BWF9QV19TQUxUX0xFTl0sIGNvbnN0IGNoYXIgKmFsZ28pIEZBU1RfRlVOQzsKKworCisvKiBSZXR1cm5zIG51bWJlciBvZiBsaW5lcyBjaGFuZ2VkLCBvciAtMSBvbiBlcnJvciAqLworI2lmICEoRU5BQkxFX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCB8fCBFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQKQorI2RlZmluZSB1cGRhdGVfcGFzc3dkKGZpbGVuYW1lLCB1c2VybmFtZSwgZGF0YSwgbWVtYmVyKSBcCisJdXBkYXRlX3Bhc3N3ZChmaWxlbmFtZSwgdXNlcm5hbWUsIGRhdGEpCisjZW5kaWYKK2V4dGVybiBpbnQgdXBkYXRlX3Bhc3N3ZChjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJY29uc3QgY2hhciAqdXNlcm5hbWUsCisJCWNvbnN0IGNoYXIgKmRhdGEsCisJCWNvbnN0IGNoYXIgKm1lbWJlcikgRkFTVF9GVU5DOworCitpbnQgaW5kZXhfaW5fc3RyX2FycmF5KGNvbnN0IGNoYXIgKmNvbnN0IHN0cmluZ19hcnJheVtdLCBjb25zdCBjaGFyICprZXkpIEZBU1RfRlVOQzsKK2ludCBpbmRleF9pbl9zdHJpbmdzKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGNvbnN0IGNoYXIgKmtleSkgRkFTVF9GVU5DOworaW50IGluZGV4X2luX3N1YnN0cl9hcnJheShjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7CitpbnQgaW5kZXhfaW5fc3Vic3RyaW5ncyhjb25zdCBjaGFyICpzdHJpbmdzLCBjb25zdCBjaGFyICprZXkpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIgKm50aF9zdHJpbmcoY29uc3QgY2hhciAqc3RyaW5ncywgaW50IG4pIEZBU1RfRlVOQzsKKworZXh0ZXJuIHZvaWQgcHJpbnRfbG9naW5faXNzdWUoY29uc3QgY2hhciAqaXNzdWVfZmlsZSwgY29uc3QgY2hhciAqdHR5KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBwcmludF9sb2dpbl9wcm9tcHQodm9pZCkgRkFTVF9GVU5DOworCitjaGFyICp4bWFsbG9jX3R0eW5hbWUoaW50IGZkKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBOQjogdHlwaWNhbGx5IHlvdSB3YW50IHRvIHBhc3MgZmQgMCwgbm90IDEuIFRoaW5rICdhcHBsZXQgfCBncmVwIHNvbWV0aGluZycgKi8KK2ludCBnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KGludCBmZCwgdW5zaWduZWQgKndpZHRoLCB1bnNpZ25lZCAqaGVpZ2h0KSBGQVNUX0ZVTkM7CisKK2ludCB0Y3NldGF0dHJfc3RkaW5fVENTQU5PVyhjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdHApIEZBU1RfRlVOQzsKKworLyogTkI6ICJ1bnNpZ25lZCByZXF1ZXN0IiBpcyBjcnVjaWFsISAiaW50IHJlcXVlc3QiIHdpbGwgYnJlYWsgc29tZSBhcmNoZXMhICovCitpbnQgaW9jdGxfb3JfcGVycm9yKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqZm10LC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpIEZBU1RfRlVOQzsKK2ludCBpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmZtdCwuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0lPQ1RMX0hFWDJTVFJfRVJST1IKK2ludCBiYl9pb2N0bF9vcl93YXJuKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqaW9jdGxfbmFtZSkgRkFTVF9GVU5DOworaW50IGJiX3hpb2N0bChpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmlvY3RsX25hbWUpIEZBU1RfRlVOQzsKKyNkZWZpbmUgaW9jdGxfb3Jfd2FybihmZCxyZXF1ZXN0LGFyZ3ApIGJiX2lvY3RsX29yX3dhcm4oZmQscmVxdWVzdCxhcmdwLCNyZXF1ZXN0KQorI2RlZmluZSB4aW9jdGwoZmQscmVxdWVzdCxhcmdwKSAgICAgICAgYmJfeGlvY3RsKGZkLHJlcXVlc3QsYXJncCwjcmVxdWVzdCkKKyNlbHNlCitpbnQgYmJfaW9jdGxfb3Jfd2FybihpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3ApIEZBU1RfRlVOQzsKK2ludCBiYl94aW9jdGwoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwKSBGQVNUX0ZVTkM7CisjZGVmaW5lIGlvY3RsX29yX3dhcm4oZmQscmVxdWVzdCxhcmdwKSBiYl9pb2N0bF9vcl93YXJuKGZkLHJlcXVlc3QsYXJncCkKKyNkZWZpbmUgeGlvY3RsKGZkLHJlcXVlc3QsYXJncCkgICAgICAgIGJiX3hpb2N0bChmZCxyZXF1ZXN0LGFyZ3ApCisjZW5kaWYKKworY2hhciAqaXNfaW5faW5vX2Rldl9oYXNodGFibGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYpIEZBU1RfRlVOQzsKK3ZvaWQgYWRkX3RvX2lub19kZXZfaGFzaHRhYmxlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmLCBjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7Cit2b2lkIHJlc2V0X2lub19kZXZfaGFzaHRhYmxlKHZvaWQpIEZBU1RfRlVOQzsKKyNpZmRlZiBfX0dMSUJDX18KKy8qIEF0IGxlYXN0IGdsaWJjIGhhcyBob3JyZW5kb3VzbHkgbGFyZ2UgaW5saW5lIGZvciB0aGlzLCBzbyB3cmFwIGl0ICovCit1bnNpZ25lZCBsb25nIGxvbmcgYmJfbWFrZWRldih1bnNpZ25lZCBtYWpvciwgdW5zaWduZWQgbWlub3IpIEZBU1RfRlVOQzsKKyN1bmRlZiBtYWtlZGV2CisjZGVmaW5lIG1ha2VkZXYoYSxiKSBiYl9tYWtlZGV2KGEsYikKKyNlbmRpZgorCisKKy8qICJLZXljb2RlcyIgdGhhdCByZXBvcnQgYW4gZXNjYXBlIHNlcXVlbmNlLgorICogV2UgdXNlIHNvbWV0aGluZyB3aGljaCBmaXRzIGludG8gc2lnbmVkIGNoYXIsCisgKiB5ZXQgZG9lc24ndCByZXByZXNlbnQgYW55IHZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyLgorICogQWxzbywgLTEgaXMgcmVzZXJ2ZWQgZm9yIGVycm9yIGluZGljYXRpb24gYW5kIHdlIGRvbid0IHVzZSBpdC4gKi8KK2VudW0geworCUtFWUNPREVfVVAgICAgICAgPSAgLTIsCisJS0VZQ09ERV9ET1dOICAgICA9ICAtMywKKwlLRVlDT0RFX1JJR0hUICAgID0gIC00LAorCUtFWUNPREVfTEVGVCAgICAgPSAgLTUsCisJS0VZQ09ERV9IT01FICAgICA9ICAtNiwKKwlLRVlDT0RFX0VORCAgICAgID0gIC03LAorCUtFWUNPREVfSU5TRVJUICAgPSAgLTgsCisJS0VZQ09ERV9ERUxFVEUgICA9ICAtOSwKKwlLRVlDT0RFX1BBR0VVUCAgID0gLTEwLAorCUtFWUNPREVfUEFHRURPV04gPSAtMTEsCisKKwlLRVlDT0RFX0NUUkxfVVAgICAgPSBLRVlDT0RFX1VQICAgICYgfjB4NDAsCisJS0VZQ09ERV9DVFJMX0RPV04gID0gS0VZQ09ERV9ET1dOICAmIH4weDQwLAorCUtFWUNPREVfQ1RSTF9SSUdIVCA9IEtFWUNPREVfUklHSFQgJiB+MHg0MCwKKwlLRVlDT0RFX0NUUkxfTEVGVCAgPSBLRVlDT0RFX0xFRlQgICYgfjB4NDAsCisjaWYgMAorCUtFWUNPREVfRlVOMSAgICAgPSAtMTIsCisJS0VZQ09ERV9GVU4yICAgICA9IC0xMywKKwlLRVlDT0RFX0ZVTjMgICAgID0gLTE0LAorCUtFWUNPREVfRlVONCAgICAgPSAtMTUsCisJS0VZQ09ERV9GVU41ICAgICA9IC0xNiwKKwlLRVlDT0RFX0ZVTjYgICAgID0gLTE3LAorCUtFWUNPREVfRlVONyAgICAgPSAtMTgsCisJS0VZQ09ERV9GVU44ICAgICA9IC0xOSwKKwlLRVlDT0RFX0ZVTjkgICAgID0gLTIwLAorCUtFWUNPREVfRlVOMTAgICAgPSAtMjEsCisJS0VZQ09ERV9GVU4xMSAgICA9IC0yMiwKKwlLRVlDT0RFX0ZVTjEyICAgID0gLTIzLAorI2VuZGlmCisJS0VZQ09ERV9DVVJTT1JfUE9TID0gLTB4MTAwLCAvKiAweGZmZi4uZmZmMDAgKi8KKwkvKiBIb3cgbG9uZyBpcyB0aGUgbG9uZ2VzdCBFU0Mgc2VxdWVuY2Ugd2Uga25vdz8KKwkgKiBXZSB3YW50IGl0IGJpZyBlbm91Z2ggdG8gYmUgYWJsZSB0byBjb250YWluCisJICogY3Vyc29yIHBvc2l0aW9uIHNlcXVlbmNlICJFU0MgWyA5OTk5IDsgOTk5OSBSIgorCSAqLworCUtFWUNPREVfQlVGRkVSX1NJWkUgPSAxNgorfTsKKy8qIE5vdGU6IGZkIG1heSBiZSBpbiBibG9ja2luZyBvciBub24tYmxvY2tpbmcgbW9kZSwgYm90aCBtYWtlIHNlbnNlLgorICogRm9yIG9uZSwgbGVzcyB1c2VzIG5vbi1ibG9ja2luZyBtb2RlLgorICogT25seSB0aGUgZmlyc3QgcmVhZCBzeXNjYWxsIGluc2lkZSByZWFkX2tleSBtYXkgYmxvY2sgaW5kZWZpbml0ZWx5CisgKiAodW5sZXNzIGZkIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlKSwKKyAqIHN1YnNlcXVlbnQgcmVhZHMgd2lsbCB0aW1lIG91dCBhZnRlciBhIGZldyBtaWxsaXNlY29uZHMuCisgKiBSZXR1cm4gb2YgLTEgbWVhbnMgRU9GIG9yIGVycm9yIChlcnJubyA9PSAwIG9uIEVPRikuCisgKiBidWZmZXJbMF0gaXMgdXNlZCBhcyBhIGNvdW50ZXIgb2YgYnVmZmVyZWQgY2hhcnMgYW5kIG11c3QgYmUgMAorICogb24gZmlyc3QgY2FsbC4KKyAqIHRpbWVvdXQ6CisgKiAtMjogZG8gbm90IHBvbGwgZm9yIGlucHV0OworICogLTE6IHBvbGwoLTEpIChpLmUuIGJsb2NrKTsKKyAqID49MDogcG9sbCBmb3IgVElNRU9VVCBtaWxsaXNlY29uZHMsIHJldHVybiAtMS9FQUdBSU4gb24gdGltZW91dAorICovCitpbnQ2NF90IHJlYWRfa2V5KGludCBmZCwgY2hhciAqYnVmZmVyLCBpbnQgdGltZW91dCkgRkFTVF9GVU5DOwordm9pZCByZWFkX2tleV91bmdldHMoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxlbikgRkFTVF9GVU5DOworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisvKiBJdCdzIE5PVCBqdXN0IEVOQUJMRWQgb3IgZGlzYWJsZWQuIEl0J3MgYSBudW1iZXI6ICovCisjIGlmIGRlZmluZWQgQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZICYmIENPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWSA+IDAKKyMgIGRlZmluZSBNQVhfSElTVE9SWSAoQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZICsgMCkKK3Vuc2lnbmVkIHNpemVfZnJvbV9ISVNURklMRVNJWkUoY29uc3QgY2hhciAqaHApOworIyBlbHNlCisjICBkZWZpbmUgTUFYX0hJU1RPUlkgMAorIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgbGluZV9pbnB1dF90IHsKKwlpbnQgZmxhZ3M7CisJY29uc3QgY2hhciAqcGF0aF9sb29rdXA7CisjIGlmIE1BWF9ISVNUT1JZCisJaW50IGNudF9oaXN0b3J5OworCWludCBjdXJfaGlzdG9yeTsKKwlpbnQgbWF4X2hpc3Rvcnk7IC8qIG11c3QgbmV2ZXIgYmUgPD0gMCAqLworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCXVuc2lnbmVkIGNudF9oaXN0b3J5X2luX2ZpbGU7CisJY29uc3QgY2hhciAqaGlzdF9maWxlOworIyAgZW5kaWYKKwljaGFyICpoaXN0b3J5W01BWF9ISVNUT1JZICsgMV07CisjIGVuZGlmCit9IGxpbmVfaW5wdXRfdDsKK2VudW0geworCURPX0hJU1RPUlkgPSAxICogKE1BWF9ISVNUT1JZID4gMCksCisJU0FWRV9ISVNUT1JZID0gMiAqIChNQVhfSElTVE9SWSA+IDApICogRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWSwKKwlUQUJfQ09NUExFVElPTiA9IDQgKiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTiwKKwlVU0VSTkFNRV9DT01QTEVUSU9OID0gOCAqIEVOQUJMRV9GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04sCisJVklfTU9ERSA9IDB4MTAgKiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJLAorCVdJVEhfUEFUSF9MT09LVVAgPSAweDIwLAorCUZPUl9TSEVMTCA9IERPX0hJU1RPUlkgfCBTQVZFX0hJU1RPUlkgfCBUQUJfQ09NUExFVElPTiB8IFVTRVJOQU1FX0NPTVBMRVRJT04sCit9OworbGluZV9pbnB1dF90ICpuZXdfbGluZV9pbnB1dF90KGludCBmbGFncykgRkFTVF9GVU5DOworLyogU28gZmFyIHN0YXRpYzogdm9pZCBmcmVlX2xpbmVfaW5wdXRfdChsaW5lX2lucHV0X3QgKm4pIEZBU1RfRlVOQzsgKi8KKy8qCisgKiBtYXhzaXplIG11c3QgYmUgPj0gMi4KKyAqIFJldHVybnM6CisgKiAtMSBvbiByZWFkIGVycm9ycyBvciBFT0YsIG9yIG9uIGJhcmUgQ3RybC1ELAorICogMCAgb24gY3RybC1DICh0aGUgbGluZSBlbnRlcmVkIGlzIHN0aWxsIHJldHVybmVkIGluICdjb21tYW5kJyksCisgKiA+MCBsZW5ndGggb2YgaW5wdXQgc3RyaW5nLCBpbmNsdWRpbmcgdGVybWluYXRpbmcgJ1xuJworICovCitpbnQgcmVhZF9saW5lX2lucHV0KGxpbmVfaW5wdXRfdCAqc3QsIGNvbnN0IGNoYXIgKnByb21wdCwgY2hhciAqY29tbWFuZCwgaW50IG1heHNpemUsIGludCB0aW1lb3V0KSBGQVNUX0ZVTkM7CisjZWxzZQorI2RlZmluZSBNQVhfSElTVE9SWSAwCitpbnQgcmVhZF9saW5lX2lucHV0KGNvbnN0IGNoYXIqIHByb21wdCwgY2hhciogY29tbWFuZCwgaW50IG1heHNpemUpIEZBU1RfRlVOQzsKKyNkZWZpbmUgcmVhZF9saW5lX2lucHV0KHN0YXRlLCBwcm9tcHQsIGNvbW1hbmQsIG1heHNpemUsIHRpbWVvdXQpIFwKKwlyZWFkX2xpbmVfaW5wdXQocHJvbXB0LCBjb21tYW5kLCBtYXhzaXplKQorI2VuZGlmCisKKworI2lmbmRlZiBDT01NX0xFTgorIyBpZmRlZiBUQVNLX0NPTU1fTEVOCitlbnVtIHsgQ09NTV9MRU4gPSBUQVNLX0NPTU1fTEVOIH07CisjIGVsc2UKKy8qIHN5bmNocm9uaXplIHdpdGggc2l6ZW9mKHRhc2tfc3RydWN0LmNvbW0pIGluIC91c3IvaW5jbHVkZS9saW51eC9zY2hlZC5oICovCitlbnVtIHsgQ09NTV9MRU4gPSAxNiB9OworIyBlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBzbWFwcmVjIHsKKwl1bnNpZ25lZCBsb25nIG1hcHBlZF9ydzsKKwl1bnNpZ25lZCBsb25nIG1hcHBlZF9ybzsKKwl1bnNpZ25lZCBsb25nIHNoYXJlZF9jbGVhbjsKKwl1bnNpZ25lZCBsb25nIHNoYXJlZF9kaXJ0eTsKKwl1bnNpZ25lZCBsb25nIHByaXZhdGVfY2xlYW47CisJdW5zaWduZWQgbG9uZyBwcml2YXRlX2RpcnR5OworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisJdW5zaWduZWQgbG9uZyBzbWFwX3Bzcywgc21hcF9zd2FwOworCXVuc2lnbmVkIGxvbmcgc21hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgc21hcF9zdGFydDsKKwljaGFyIHNtYXBfbW9kZVs1XTsKKwljaGFyICpzbWFwX25hbWU7Cit9OworCisjaWYgIUVOQUJMRV9QTUFQCisjZGVmaW5lIHByb2Nwc19yZWFkX3NtYXBzKHBpZCwgdG90YWwsIGNiLCBkYXRhKSBcCisJcHJvY3BzX3JlYWRfc21hcHMocGlkLCB0b3RhbCkKKyNlbmRpZgoraW50IEZBU1RfRlVOQyBwcm9jcHNfcmVhZF9zbWFwcyhwaWRfdCBwaWQsIHN0cnVjdCBzbWFwcmVjICp0b3RhbCwKKwkJICAgICAgdm9pZCAoKmNiKShzdHJ1Y3Qgc21hcHJlYyAqLCB2b2lkICopLCB2b2lkICpkYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgcHJvY3BzX3N0YXR1c190IHsKKwlESVIgKmRpcjsKKwlJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUyhESVIgKnRhc2tfZGlyOykKKwl1aW50OF90IHNoaWZ0X3BhZ2VzX3RvX2J5dGVzOworCXVpbnQ4X3Qgc2hpZnRfcGFnZXNfdG9fa2I7CisvKiBGaWVsZHMgYXJlIHNldCB0byAwL05VTEwgaWYgZmFpbGVkIHRvIGRldGVybWluZSAob3Igbm90IHJlcXVlc3RlZCkgKi8KKwl1aW50MTZfdCBhcmd2X2xlbjsKKwljaGFyICphcmd2MDsKKwljaGFyICpleGU7CisJSUZfU0VMSU5VWChjaGFyICpjb250ZXh0OykKKwlJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUyh1bnNpZ25lZCBtYWluX3RocmVhZF9waWQ7KQorCS8qIEV2ZXJ5dGhpbmcgYmVsb3cgbXVzdCBjb250YWluIG5vIHB0cnMgdG8gbWFsbG9jJ2VkIGRhdGE6CisJICogaXQgaXMgbWVtc2V0KDApIGZvciBlYWNoIHByb2Nlc3MgaW4gcHJvY3BzX3NjYW4oKSAqLworCXVuc2lnbmVkIGxvbmcgdnN6LCByc3M7IC8qIHdlIHJvdW5kIGl0IHRvIGtieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgc3RpbWUsIHV0aW1lOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBwaWQ7CisJdW5zaWduZWQgcHBpZDsKKwl1bnNpZ25lZCBwZ2lkOworCXVuc2lnbmVkIHNpZDsKKwl1bnNpZ25lZCB1aWQ7CisJdW5zaWduZWQgZ2lkOworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUworCXVuc2lnbmVkIHJ1aWQ7CisJdW5zaWduZWQgcmdpZDsKKwlpbnQgbmljZW5lc3M7CisjZW5kaWYKKwl1bnNpZ25lZCB0dHlfbWFqb3IsdHR5X21pbm9yOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCXN0cnVjdCBzbWFwcmVjIHNtYXBzOworI2VuZGlmCisJY2hhciBzdGF0ZVs0XTsKKwkvKiBiYXNlbmFtZSBvZiBleGVjdXRhYmxlIGluIGV4ZWMoMiksIHJlYWQgZnJvbSAvcHJvYy9OL3N0YXQKKwkgKiAoaWYgZXhlY3V0YWJsZSBpcyBzeW1saW5rIG9yIHNjcmlwdCwgaXQgaXMgTk9UIHJlcGxhY2VkCisJICogYnkgbGluayB0YXJnZXQgb3IgaW50ZXJwcmV0ZXIgbmFtZSkgKi8KKwljaGFyIGNvbW1bQ09NTV9MRU5dOworCS8qIHVzZXIvZ3JvdXA/IC0gdXNlIHBhc3N3ZC9ncm91cCBwYXJzaW5nIGZ1bmN0aW9ucyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCWludCBsYXN0X3NlZW5fb25fY3B1OworI2VuZGlmCit9IHByb2Nwc19zdGF0dXNfdDsKKy8qIGZsYWcgYml0cyBmb3IgcHJvY3BzX3NjYW4oeHgsIGZsYWdzKSBjYWxscyAqLworZW51bSB7CisJUFNTQ0FOX1BJRCAgICAgID0gMSA8PCAwLAorCVBTU0NBTl9QUElEICAgICA9IDEgPDwgMSwKKwlQU1NDQU5fUEdJRCAgICAgPSAxIDw8IDIsCisJUFNTQ0FOX1NJRCAgICAgID0gMSA8PCAzLAorCVBTU0NBTl9VSURHSUQgICA9IDEgPDwgNCwKKwlQU1NDQU5fQ09NTSAgICAgPSAxIDw8IDUsCisJLyogUFNTQ0FOX0NNRCAgICAgID0gMSA8PCA2LCAtIHVzZSByZWFkX2NtZGxpbmUgaW5zdGVhZCAqLworCVBTU0NBTl9BUkdWMCAgICA9IDEgPDwgNywKKwlQU1NDQU5fRVhFICAgICAgPSAxIDw8IDgsCisJUFNTQ0FOX1NUQVRFICAgID0gMSA8PCA5LAorCVBTU0NBTl9WU1ogICAgICA9IDEgPDwgMTAsCisJUFNTQ0FOX1JTUyAgICAgID0gMSA8PCAxMSwKKwlQU1NDQU5fU1RJTUUgICAgPSAxIDw8IDEyLAorCVBTU0NBTl9VVElNRSAgICA9IDEgPDwgMTMsCisJUFNTQ0FOX1RUWSAgICAgID0gMSA8PCAxNCwKKwlQU1NDQU5fU01BUFMJPSAoMSA8PCAxNSkgKiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0sCisJLyogTkI6IHVzZWQgYnkgZmluZF9waWRfYnlfbmFtZSgpLiBBbnkgYXBwbGV0IHVzaW5nIGl0CisJICogbmVlZHMgdG8gYmUgbWVudGlvbmVkIGhlcmUuICovCisJUFNTQ0FOX0FSR1ZOICAgID0gKDEgPDwgMTYpICogKEVOQUJMRV9LSUxMQUxMCisJCQkJfHwgRU5BQkxFX1BHUkVQIHx8IEVOQUJMRV9QS0lMTAorCQkJCXx8IEVOQUJMRV9QSURPRgorCQkJCXx8IEVOQUJMRV9TRVNUQVRVUworCQkJCSksCisJUFNTQ0FOX0NPTlRFWFQgID0gKDEgPDwgMTcpICogRU5BQkxFX1NFTElOVVgsCisJUFNTQ0FOX1NUQVJUX1RJTUUgPSAxIDw8IDE4LAorCVBTU0NBTl9DUFUgICAgICA9ICgxIDw8IDE5KSAqIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUywKKwlQU1NDQU5fTklDRSAgICAgPSAoMSA8PCAyMCkgKiBFTkFCTEVfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMsCisJUFNTQ0FOX1JVSURHSUQgID0gKDEgPDwgMjEpICogRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TLAorCVBTU0NBTl9UQVNLUwk9ICgxIDw8IDIyKSAqIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUywKK307CisvL3Byb2Nwc19zdGF0dXNfdCogYWxsb2NfcHJvY3BzX3NjYW4odm9pZCkgRkFTVF9GVU5DOwordm9pZCBmcmVlX3Byb2Nwc19zY2FuKHByb2Nwc19zdGF0dXNfdCogc3ApIEZBU1RfRlVOQzsKK3Byb2Nwc19zdGF0dXNfdCogcHJvY3BzX3NjYW4ocHJvY3BzX3N0YXR1c190KiBzcCwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CisvKiBGb3JtYXQgY21kbGluZSAodXAgdG8gY29sIGNoYXJzKSBpbnRvIGNoYXIgYnVmW3NpemVdICovCisvKiBQdXRzIFtjb21tXSBpZiBjbWRsaW5lIGlzIGVtcHR5ICgtPiBwcm9jZXNzIGlzIGEga2VybmVsIHRocmVhZCkgKi8KK3ZvaWQgcmVhZF9jbWRsaW5lKGNoYXIgKmJ1ZiwgaW50IHNpemUsIHVuc2lnbmVkIHBpZCwgY29uc3QgY2hhciAqY29tbSkgRkFTVF9GVU5DOworcGlkX3QgKmZpbmRfcGlkX2J5X25hbWUoY29uc3QgY2hhciogcHJvY05hbWUpIEZBU1RfRlVOQzsKK3BpZF90ICpwaWRsaXN0X3JldmVyc2UocGlkX3QgKnBpZExpc3QpIEZBU1RfRlVOQzsKK2ludCBzdGFydHNfd2l0aF9jcHUoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7Cit1bnNpZ25lZCBnZXRfY3B1X2NvdW50KHZvaWQpIEZBU1RfRlVOQzsKKworCitleHRlcm4gY29uc3QgY2hhciBiYl91dWVuY190YmxfYmFzZTY0W107CitleHRlcm4gY29uc3QgY2hhciBiYl91dWVuY190Ymxfc3RkW107Cit2b2lkIGJiX3V1ZW5jb2RlKGNoYXIgKnN0b3JlLCBjb25zdCB2b2lkICpzLCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyICp0YmwpIEZBU1RfRlVOQzsKK2VudW0geworCUJBU0U2NF9GTEFHX1VVX1NUT1AgPSAweDEwMCwKKwkvKiBTaWduLWV4dGVuZHMgdG8gYSB2YWx1ZSB3aGljaCBuZXZlciBtYXRjaGVzIGZnZXRjIHJlc3VsdDogKi8KKwlCQVNFNjRfRkxBR19OT19TVE9QX0NIQVIgPSAweDgwLAorfTsKK3ZvaWQgRkFTVF9GVU5DIHJlYWRfYmFzZTY0KEZJTEUgKnNyY19zdHJlYW0sIEZJTEUgKmRzdF9zdHJlYW0sIGludCBmbGFncyk7CisKK3R5cGVkZWYgc3RydWN0IG1kNV9jdHhfdCB7CisJdWludDhfdCB3YnVmZmVyWzY0XTsgLyogYWx3YXlzIGNvcnJlY3RseSBhbGlnbmVkIGZvciB1aW50NjRfdCAqLworCXZvaWQgKCpwcm9jZXNzX2Jsb2NrKShzdHJ1Y3QgbWQ1X2N0eF90KikgRkFTVF9GVU5DOworCXVpbnQ2NF90IHRvdGFsNjQ7ICAgIC8qIG11c3QgYmUgZGlyZWN0bHkgYmVmb3JlIGhhc2hbXSAqLworCXVpbnQzMl90IGhhc2hbOF07ICAgIC8qIDQgZWxlbWVudHMgZm9yIG1kNSwgNSBmb3Igc2hhMSwgOCBmb3Igc2hhMjU2ICovCit9IG1kNV9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IG1kNV9jdHhfdCBzaGExX2N0eF90OwordHlwZWRlZiBzdHJ1Y3QgbWQ1X2N0eF90IHNoYTI1Nl9jdHhfdDsKK3R5cGVkZWYgc3RydWN0IHNoYTUxMl9jdHhfdCB7CisJdWludDY0X3QgdG90YWw2NFsyXTsgIC8qIG11c3QgYmUgZGlyZWN0bHkgYmVmb3JlIGhhc2hbXSAqLworCXVpbnQ2NF90IGhhc2hbOF07CisJdWludDhfdCB3YnVmZmVyWzEyOF07IC8qIGFsd2F5cyBjb3JyZWN0bHkgYWxpZ25lZCBmb3IgdWludDY0X3QgKi8KK30gc2hhNTEyX2N0eF90Owordm9pZCBtZDVfYmVnaW4obWQ1X2N0eF90ICpjdHgpIEZBU1RfRlVOQzsKK3ZvaWQgbWQ1X2hhc2gobWQ1X2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpIEZBU1RfRlVOQzsKK3ZvaWQgbWQ1X2VuZChtZDVfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKSBGQVNUX0ZVTkM7Cit2b2lkIHNoYTFfYmVnaW4oc2hhMV9jdHhfdCAqY3R4KSBGQVNUX0ZVTkM7CisjZGVmaW5lIHNoYTFfaGFzaCBtZDVfaGFzaAordm9pZCBzaGExX2VuZChzaGExX2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikgRkFTVF9GVU5DOwordm9pZCBzaGEyNTZfYmVnaW4oc2hhMjU2X2N0eF90ICpjdHgpIEZBU1RfRlVOQzsKKyNkZWZpbmUgc2hhMjU2X2hhc2ggbWQ1X2hhc2gKKyNkZWZpbmUgc2hhMjU2X2VuZCAgc2hhMV9lbmQKK3ZvaWQgc2hhNTEyX2JlZ2luKHNoYTUxMl9jdHhfdCAqY3R4KSBGQVNUX0ZVTkM7Cit2b2lkIHNoYTUxMl9oYXNoKHNoYTUxMl9jdHhfdCAqY3R4LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pIEZBU1RfRlVOQzsKK3ZvaWQgc2hhNTEyX2VuZChzaGE1MTJfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKSBGQVNUX0ZVTkM7CisKK2V4dGVybiB1aW50MzJfdCAqZ2xvYmFsX2NyYzMyX3RhYmxlOwordWludDMyX3QgKmNyYzMyX2ZpbGx0YWJsZSh1aW50MzJfdCAqdGJsMjU2LCBpbnQgZW5kaWFuKSBGQVNUX0ZVTkM7Cit1aW50MzJfdCBjcmMzMl9ibG9ja19lbmRpYW4xKHVpbnQzMl90IHZhbCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sIHVpbnQzMl90ICpjcmNfdGFibGUpIEZBU1RfRlVOQzsKK3VpbnQzMl90IGNyYzMyX2Jsb2NrX2VuZGlhbjAodWludDMyX3QgdmFsLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwgdWludDMyX3QgKmNyY190YWJsZSkgRkFTVF9GVU5DOworCit0eXBlZGVmIHN0cnVjdCBtYXNrc19sYWJlbHNfdCB7CisJY29uc3QgY2hhciAqbGFiZWxzOworCWNvbnN0IGludCBtYXNrc1tdOworfSBtYXNrc19sYWJlbHNfdDsKK2ludCBwcmludF9mbGFnc19zZXBhcmF0ZWQoY29uc3QgaW50ICptYXNrcywgY29uc3QgY2hhciAqbGFiZWxzLAorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnNlcGFyYXRvcikgRkFTVF9GVU5DOworaW50IHByaW50X2ZsYWdzKGNvbnN0IG1hc2tzX2xhYmVsc190ICptbCwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CisKK3R5cGVkZWYgc3RydWN0IGJiX3Byb2dyZXNzX3QgeworCXVuc2lnbmVkIGxhc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsYXN0X3VwZGF0ZV9zZWM7CisJdW5zaWduZWQgbGFzdF9jaGFuZ2Vfc2VjOworCXVuc2lnbmVkIHN0YXJ0X3NlYzsKKwljb25zdCBjaGFyICpjdXJmaWxlOworfSBiYl9wcm9ncmVzc190OworCisjZGVmaW5lIGlzX2JiX3Byb2dyZXNzX2luaXRlZChwKSAoKHApLT5jdXJmaWxlICE9IE5VTEwpCisjZGVmaW5lIGJiX3Byb2dyZXNzX2ZyZWUocCkgZG8geyBcCisJaWYgKEVOQUJMRV9VTklDT0RFX1NVUFBPUlQpIGZyZWUoKGNoYXIqKSgocCktPmN1cmZpbGUpKTsgXAorCShwKS0+Y3VyZmlsZSA9IE5VTEw7IFwKK30gd2hpbGUgKDApCit2b2lkIGJiX3Byb2dyZXNzX2luaXQoYmJfcHJvZ3Jlc3NfdCAqcCwgY29uc3QgY2hhciAqY3VyZmlsZSkgRkFTVF9GVU5DOwordm9pZCBiYl9wcm9ncmVzc191cGRhdGUoYmJfcHJvZ3Jlc3NfdCAqcCwKKwkJCXVvZmZfdCBiZWdfcmFuZ2UsCisJCQl1b2ZmX3QgdHJhbnNmZXJyZWQsCisJCQl1b2ZmX3QgdG90YWxzaXplKSBGQVNUX0ZVTkM7CisKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmFwcGxldF9uYW1lOworCisvKiBTb21lIG9sZGVyIGxpbmtlcnMgZG9uJ3QgcGVyZm9ybSBzdHJpbmcgbWVyZ2luZywgd2UgdXNlZCB0byBoYXZlIGNvbW1vbiBzdHJpbmdzCisgKiBhcyBnbG9iYWwgYXJyYXlzIHRvIGRvIGl0IGJ5IGhhbmQuIEJ1dDoKKyAqICgxKSBuZXdlciBsaW5rZXJzIGRvIGl0IHRoZW1zZWx2ZXMsCisgKiAoMikgaG93ZXZlciwgdGhleSBET05UIG1lcmdlIHN0cmluZyBjb25zdGFudHMgd2l0aCBnbG9iYWwgYXJyYXlzLAorICogZXZlbiBpZiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUgKCEpLiBUaHVzIGdsb2JhbCBhcnJheXMgYWN0dWFsbHkKKyAqIGluY3JlYXNlZCBzaXplIGEgYml0OiBmb3IgZXhhbXBsZSwgIi9ldGMvcGFzc3dkIiBzdHJpbmcgZnJvbSBsaWJjCisgKiB3YXNuJ3QgbWVyZ2VkIHdpdGggYmJfcGF0aF9wYXNzd2RfZmlsZVtdIGFycmF5IQorICogVGhlcmVmb3JlIG5vdyB3ZSB1c2UgI2RlZmluZXMuCisgKi8KKy8qICJCdXN5Qm94IHZOLk4uTiAodGltZXN0YW1wIG9yIGV4dHJhX3ZlcnNpb24pIiAqLworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfYmFubmVyW107CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX2ludmFsaWRfZGF0ZVtdOworI2RlZmluZSBiYl9tc2dfcmVhZF9lcnJvciAicmVhZCBlcnJvciIKKyNkZWZpbmUgYmJfbXNnX3dyaXRlX2Vycm9yICJ3cml0ZSBlcnJvciIKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ191bmtub3duW107CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfY2FuX25vdF9jcmVhdGVfcmF3X3NvY2tldFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3RbXTsKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ19yZXF1aXJlc19hcmdbXTsKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ19pbnZhbGlkX2FyZ1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3N0YW5kYXJkX2lucHV0W107CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfc3RhbmRhcmRfb3V0cHV0W107CisKKy8qIE5COiAoYmJfaGV4ZGlnaXRzX3VwY2FzZVtpXSB8IDB4MjApIC0+IGxvd2VyY2FzZSBoZXggZGlnaXQgKi8KK2V4dGVybiBjb25zdCBjaGFyIGJiX2hleGRpZ2l0c191cGNhc2VbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfcGF0aF93dG1wX2ZpbGVbXTsKKworLyogQnVzeWJveCBtb3VudCB1c2VzIGVpdGhlciAvcHJvYy9tb3VudHMgb3IgL2V0Yy9tdGFiIHRvCisgKiBnZXQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IG1vdW50ZWQgZmlsZXN5c3RlbXMgKi8KKyNkZWZpbmUgYmJfcGF0aF9tdGFiX2ZpbGUgSUZfRkVBVFVSRV9NVEFCX1NVUFBPUlQoIi9ldGMvbXRhYiIpSUZfTk9UX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKCIvcHJvYy9tb3VudHMiKQorCisjZGVmaW5lIGJiX3BhdGhfcGFzc3dkX2ZpbGUgIF9QQVRIX1BBU1NXRAorI2RlZmluZSBiYl9wYXRoX2dyb3VwX2ZpbGUgICBfUEFUSF9HUk9VUAorI2RlZmluZSBiYl9wYXRoX3NoYWRvd19maWxlICBfUEFUSF9TSEFET1cKKyNkZWZpbmUgYmJfcGF0aF9nc2hhZG93X2ZpbGUgX1BBVEhfR1NIQURPVworCisjZGVmaW5lIGJiX3BhdGhfbW90ZF9maWxlICIvZXRjL21vdGQiCisKKyNkZWZpbmUgYmJfZGV2X251bGwgIi9kZXYvbnVsbCIKK2V4dGVybiBjb25zdCBjaGFyIGJiX2J1c3lib3hfZXhlY19wYXRoW107CisvKiB1dGlsLWxpbnV4IG1hbnBhZ2Ugc2F5cyAvc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiwKKyAqIGJ1dCBJIHdhbnQgdG8gc2F2ZSBhIGZldyBieXRlcyBoZXJlICovCitleHRlcm4gY29uc3QgY2hhciBiYl9QQVRIX3Jvb3RfcGF0aFtdOyAvKiAiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIgKi8KKyNkZWZpbmUgYmJfZGVmYXVsdF9yb290X3BhdGggKGJiX1BBVEhfcm9vdF9wYXRoICsgc2l6ZW9mKCJQQVRIIikpCisjZGVmaW5lIGJiX2RlZmF1bHRfcGF0aCAgICAgIChiYl9QQVRIX3Jvb3RfcGF0aCArIHNpemVvZigiUEFUSD0vc2JpbjovdXNyL3NiaW4iKSkKKworZXh0ZXJuIGNvbnN0IGludCBjb25zdF9pbnRfMDsKK2V4dGVybiBjb25zdCBpbnQgY29uc3RfaW50XzE7CisKKworLyogUHJvdmlkaW5nIGhhcmQgZ3VhcmFudGVlIG9uIG1pbmltdW0gc2l6ZSAodGhpbmsgb2YgQlVGU0laID09IDEyOCkgKi8KK2VudW0geyBDT01NT05fQlVGU0laRSA9IChCVUZTSVogPj0gMjU2KnNpemVvZih2b2lkKikgPyBCVUZTSVorMSA6IDI1NipzaXplb2Yodm9pZCopKSB9OworZXh0ZXJuIGNoYXIgYmJfY29tbW9uX2J1ZnNpejFbQ09NTU9OX0JVRlNJWkVdOworLyogVGhpcyBzdHJ1Y3QgaXMgZGVsaWJlcmF0ZWx5IG5vdCBkZWZpbmVkLiAqLworLyogU2VlIGRvY3Mva2VlcF9kYXRhX3NtYWxsLnR4dCAqLworc3RydWN0IGdsb2JhbHM7CisvKiAnKmNvbnN0JyBwdHIgbWFrZXMgZ2NjIG9wdGltaXplIGNvZGUgbXVjaCBiZXR0ZXIuCisgKiBNYWdpYyBwcmV2ZW50cyBwdHJfdG9fZ2xvYmFscyBmcm9tIGdvaW5nIGludG8gcm9kYXRhLgorICogSWYgeW91IHdhbnQgdG8gYXNzaWduIGEgdmFsdWUsIHVzZSBTRVRfUFRSX1RPX0dMT0JBTFMoeCkgKi8KK2V4dGVybiBzdHJ1Y3QgZ2xvYmFscyAqY29uc3QgcHRyX3RvX2dsb2JhbHM7CisvKiBBdCBsZWFzdCBnY2MgMy40LjYgb24gbWlwc2VsIHN5c3RlbSBuZWVkcyBvcHRpbWl6YXRpb24gYmFycmllciAqLworI2RlZmluZSBiYXJyaWVyKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6OjoibWVtb3J5IikKKyNkZWZpbmUgU0VUX1BUUl9UT19HTE9CQUxTKHgpIGRvIHsgXAorCSgqKHN0cnVjdCBnbG9iYWxzKiopJnB0cl90b19nbG9iYWxzKSA9ICh2b2lkKikoeCk7IFwKKwliYXJyaWVyKCk7IFwKK30gd2hpbGUgKDApCisKKy8qIFlvdSBjYW4gY2hhbmdlIExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwsIGJ1dCBkb24ndCB1c2UgaXQsCisgKiB1c2UgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCBhbmQgZm9sbG93aW5nIGRlZmluZXMuCisgKiBJZiB5b3UgY2hhbmdlIExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwsCisgKiBkb24ndCBmb3JnZXQgdG8gY2hhbmdlIGluY3JlbWVudCBjb25zdGFudC4gKi8KKyNkZWZpbmUgTElCQkJfREVGQVVMVF9MT0dJTl9TSEVMTCAgIi0vYmluL3NoIgorZXh0ZXJuIGNvbnN0IGNoYXIgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbFtdOworLyogIi9iaW4vc2giICovCisjZGVmaW5lIERFRkFVTFRfU0hFTEwgICAgICAgICAgICAgIChiYl9kZWZhdWx0X2xvZ2luX3NoZWxsKzEpCisvKiAic2giICovCisjZGVmaW5lIERFRkFVTFRfU0hFTExfU0hPUlRfTkFNRSAgIChiYl9kZWZhdWx0X2xvZ2luX3NoZWxsKzYpCisKKy8qIFRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhcmUgdGhlIHNhbWUgb24gYWxsIHN5c3RlbXMuICAqLworI2RlZmluZSBDVVJSRU5UX1RUWSAiL2Rldi90dHkiCisjZGVmaW5lIERFVl9DT05TT0xFICIvZGV2L2NvbnNvbGUiCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyMgZGVmaW5lIENVUlJFTlRfVkMgQ1VSUkVOVF9UVFkKKyMgZGVmaW5lIFZDXzEgIi9kZXYvdHR5djAiCisjIGRlZmluZSBWQ18yICIvZGV2L3R0eXYxIgorIyBkZWZpbmUgVkNfMyAiL2Rldi90dHl2MiIKKyMgZGVmaW5lIFZDXzQgIi9kZXYvdHR5djMiCisjIGRlZmluZSBWQ181ICIvZGV2L3R0eXY0IgorIyBkZWZpbmUgVkNfRk9STUFUICIvZGV2L3R0eXYlZCIKKyNlbGlmIGRlZmluZWQoX19HTlVfXykKKyMgZGVmaW5lIENVUlJFTlRfVkMgQ1VSUkVOVF9UVFkKKyMgZGVmaW5lIFZDXzEgIi9kZXYvdHR5MSIKKyMgZGVmaW5lIFZDXzIgIi9kZXYvdHR5MiIKKyMgZGVmaW5lIFZDXzMgIi9kZXYvdHR5MyIKKyMgZGVmaW5lIFZDXzQgIi9kZXYvdHR5NCIKKyMgZGVmaW5lIFZDXzUgIi9kZXYvdHR5NSIKKyMgZGVmaW5lIFZDX0ZPUk1BVCAiL2Rldi90dHklZCIKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX0RFVkZTCisvKkxpbnV4LCBvYnNvbGV0ZSBkZXZmcyBuYW1lcyAqLworIyBkZWZpbmUgQ1VSUkVOVF9WQyAiL2Rldi92Yy8wIgorIyBkZWZpbmUgVkNfMSAiL2Rldi92Yy8xIgorIyBkZWZpbmUgVkNfMiAiL2Rldi92Yy8yIgorIyBkZWZpbmUgVkNfMyAiL2Rldi92Yy8zIgorIyBkZWZpbmUgVkNfNCAiL2Rldi92Yy80IgorIyBkZWZpbmUgVkNfNSAiL2Rldi92Yy81IgorIyBkZWZpbmUgVkNfRk9STUFUICIvZGV2L3ZjLyVkIgorIyBkZWZpbmUgTE9PUF9GT1JNQVQgIi9kZXYvbG9vcC8lZCIKKyMgZGVmaW5lIExPT1BfTkFNRVNJWkUgKHNpemVvZigiL2Rldi9sb29wLyIpICsgc2l6ZW9mKGludCkqMyArIDEpCisjIGRlZmluZSBMT09QX05BTUUgIi9kZXYvbG9vcC8iCisjIGRlZmluZSBGQl8wICIvZGV2L2ZiLzAiCisjZWxzZQorLypMaW51eCwgbm9ybWFsIG5hbWVzICovCisjIGRlZmluZSBDVVJSRU5UX1ZDICIvZGV2L3R0eTAiCisjIGRlZmluZSBWQ18xICIvZGV2L3R0eTEiCisjIGRlZmluZSBWQ18yICIvZGV2L3R0eTIiCisjIGRlZmluZSBWQ18zICIvZGV2L3R0eTMiCisjIGRlZmluZSBWQ180ICIvZGV2L3R0eTQiCisjIGRlZmluZSBWQ181ICIvZGV2L3R0eTUiCisjIGRlZmluZSBWQ19GT1JNQVQgIi9kZXYvdHR5JWQiCisjIGRlZmluZSBMT09QX0ZPUk1BVCAiL2Rldi9sb29wJWQiCisjIGRlZmluZSBMT09QX05BTUVTSVpFIChzaXplb2YoIi9kZXYvbG9vcCIpICsgc2l6ZW9mKGludCkqMyArIDEpCisjIGRlZmluZSBMT09QX05BTUUgIi9kZXYvbG9vcCIKKyMgZGVmaW5lIEZCXzAgIi9kZXYvZmIwIgorI2VuZGlmCisKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpICgodW5zaWduZWQpKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKSkKKworCisvKiBXZSByZWRlZmluZSBjdHlwZSBtYWNyb3MuIFVuaWNvZGUtY29ycmVjdCBoYW5kbGluZyBvZiBjaGFyIHR5cGVzCisgKiBjYW4ndCBiZSBkb25lIHdpdGggc3VjaCBieXRlLW9yaWVudGVkIG9wZXJhdGlvbnMgYW55d2F5LAorICogd2UgZG9uJ3QgbG9zZSBhbnl0aGluZy4KKyAqLworI3VuZGVmIGlzYWxudW0KKyN1bmRlZiBpc2FscGhhCisjdW5kZWYgaXNhc2NpaQorI3VuZGVmIGlzYmxhbmsKKyN1bmRlZiBpc2NudHJsCisjdW5kZWYgaXNkaWdpdAorI3VuZGVmIGlzZ3JhcGgKKyN1bmRlZiBpc2xvd2VyCisjdW5kZWYgaXNwcmludAorI3VuZGVmIGlzcHVuY3QKKyN1bmRlZiBpc3NwYWNlCisjdW5kZWYgaXN1cHBlcgorI3VuZGVmIGlzeGRpZ2l0CisjdW5kZWYgdG91cHBlcgorI3VuZGVmIHRvbG93ZXIKKworLyogV2Ugc2F2ZSB+NTAwIGJ5dGVzIG9uIGlzZGlnaXQgYWxvbmUuCisgKiBCVFcsIHg4NiBsaWtlcyAodW5zaWduZWQgY2hhcikgY2FzdCBtb3JlIHRoYW4gKHVuc2lnbmVkKS4gKi8KKworLyogVGhlc2Ugd29yayB0aGUgc2FtZSBmb3IgQVNDSUkgYW5kIFVuaWNvZGUsCisgKiBhc3N1bWluZyBubyBvbmUgYXNrcyAiaXMgdGhpcyBhICpVbmljb2RlKiBsZXR0ZXI/IiB1c2luZyBpc2FscGhhKGxldHRlcikgKi8KKyNkZWZpbmUgaXNhc2NpaShhKSAoKHVuc2lnbmVkIGNoYXIpKGEpIDw9IDB4N2YpCisjZGVmaW5lIGlzZGlnaXQoYSkgKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSAnMCcpIDw9IDkpCisjZGVmaW5lIGlzdXBwZXIoYSkgKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSAnQScpIDw9ICgnWicgLSAnQScpKQorI2RlZmluZSBpc2xvd2VyKGEpICgodW5zaWduZWQgY2hhcikoKGEpIC0gJ2EnKSA8PSAoJ3onIC0gJ2EnKSkKKyNkZWZpbmUgaXNhbHBoYShhKSAoKHVuc2lnbmVkIGNoYXIpKCgoYSl8MHgyMCkgLSAnYScpIDw9ICgneicgLSAnYScpKQorI2RlZmluZSBpc2JsYW5rKGEpICh7IHVuc2lnbmVkIGNoYXIgYmJfX2lzYmxhbmsgPSAoYSk7IGJiX19pc2JsYW5rID09ICcgJyB8fCBiYl9faXNibGFuayA9PSAnXHQnOyB9KQorI2RlZmluZSBpc2NudHJsKGEpICh7IHVuc2lnbmVkIGNoYXIgYmJfX2lzY250cmwgPSAoYSk7IGJiX19pc2NudHJsIDwgJyAnIHx8IGJiX19pc2NudHJsID09IDB4N2Y7IH0pCisvKiBJbiBQT1NJWC9DIGxvY2FsZSBpc3NwYWNlIGlzIG9ubHkgdGhlc2UgY2hhcnM6ICJcdFxuXHZcZlxyIiBhbmQgc3BhY2UuCisgKiAiXHRcblx2XGZcciIgaGFwcGVuIHRvIGhhdmUgQVNDSUkgY29kZXMgOSwxMCwxMSwxMiwxMy4KKyAqLworI2RlZmluZSBpc3NwYWNlKGEpICh7IHVuc2lnbmVkIGNoYXIgYmJfX2lzc3BhY2UgPSAoYSkgLSA5OyBiYl9faXNzcGFjZSA9PSAoJyAnIC0gOSkgfHwgYmJfX2lzc3BhY2UgPD0gKDEzIC0gOSk7IH0pCisvLyBVbnNhZmUgd3J0IE5VTDogI2RlZmluZSBpc3B1bmN0KGEpIChzdHJjaHIoIiFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX4iLCAoYSkpICE9IE5VTEwpCisjZGVmaW5lIGlzcHVuY3QoYSkgKHN0cmNocm51bCgiIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxdXl9ge3x9fiIsIChhKSlbMF0pCisvLyBCaWdnZXIgY29kZTogI2RlZmluZSBpc2FsbnVtKGEpICh7IHVuc2lnbmVkIGNoYXIgYmJfX2lzYWxudW0gPSAoYSkgLSAnMCc7IGJiX19pc2FsbnVtIDw9IDkgfHwgKChiYl9faXNhbG51bSAtICgnQScgLSAnMCcpKSAmIDB4ZGYpIDw9IDI1OyB9KQorI2RlZmluZSBpc2FsbnVtKGEpIGJiX2FzY2lpX2lzYWxudW0oYSkKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBiYl9hc2NpaV9pc2FsbnVtKHVuc2lnbmVkIGNoYXIgYSkKK3sKKwl1bnNpZ25lZCBjaGFyIGIgPSBhIC0gJzAnOworCWlmIChiIDw9IDkpCisJCXJldHVybiAoYiA8PSA5KTsKKwliID0gKGF8MHgyMCkgLSAnYSc7CisJcmV0dXJuIGIgPD0gJ3onIC0gJ2EnOworfQorI2RlZmluZSBpc3hkaWdpdChhKSBiYl9hc2NpaV9pc3hkaWdpdChhKQorc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGJiX2FzY2lpX2lzeGRpZ2l0KHVuc2lnbmVkIGNoYXIgYSkKK3sKKwl1bnNpZ25lZCBjaGFyIGIgPSBhIC0gJzAnOworCWlmIChiIDw9IDkpCisJCXJldHVybiAoYiA8PSA5KTsKKwliID0gKGF8MHgyMCkgLSAnYSc7CisJcmV0dXJuIGIgPD0gJ2YnIC0gJ2EnOworfQorI2RlZmluZSB0b3VwcGVyKGEpIGJiX2FzY2lpX3RvdXBwZXIoYSkKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGNoYXIgYmJfYXNjaWlfdG91cHBlcih1bnNpZ25lZCBjaGFyIGEpCit7CisJdW5zaWduZWQgY2hhciBiID0gYSAtICdhJzsKKwlpZiAoYiA8PSAoJ3onIC0gJ2EnKSkKKwkJYSAtPSAnYScgLSAnQSc7CisJcmV0dXJuIGE7Cit9CisjZGVmaW5lIHRvbG93ZXIoYSkgYmJfYXNjaWlfdG9sb3dlcihhKQorc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgY2hhciBiYl9hc2NpaV90b2xvd2VyKHVuc2lnbmVkIGNoYXIgYSkKK3sKKwl1bnNpZ25lZCBjaGFyIGIgPSBhIC0gJ0EnOworCWlmIChiIDw9ICgnWicgLSAnQScpKQorCQlhICs9ICdhJyAtICdBJzsKKwlyZXR1cm4gYTsKK30KKworLyogSW4gQVNDSUkgYW5kIFVuaWNvZGUsIHRoZXNlIGFyZSBsaWtlbHkgdG8gYmUgdmVyeSBkaWZmZXJlbnQuCisgKiBMZXQncyBwcmV2ZW50IGFtYmlndW91cyB1c2FnZSBmcm9tIHRoZSBzdGFydCAqLworI2RlZmluZSBpc2dyYXBoKGEpIGlzZ3JhcGhfaXNfYW1iaWd1b3VzX2RvbnRfdXNlKGEpCisjZGVmaW5lIGlzcHJpbnQoYSkgaXNwcmludF9pc19hbWJpZ3VvdXNfZG9udF91c2UoYSkKKy8qIE5COiBtdXN0IG5vdCB0cmVhdCBFT0YgYXMgaXNncmFwaCBvciBpc3ByaW50ICovCisjZGVmaW5lIGlzZ3JhcGhfYXNjaWlvbmx5KGEpICgodW5zaWduZWQpKChhKSAtIDB4MjEpIDw9IDB4N2UgLSAweDIxKQorI2RlZmluZSBpc3ByaW50X2FzY2lpb25seShhKSAoKHVuc2lnbmVkKSgoYSkgLSAweDIwKSA8PSAweDdlIC0gMHgyMCkKKworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlibHpvX2ludGVyZmFjZS5oIGIvaW5jbHVkZS9saWJsem9faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4NGMwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGlibHpvX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni4uMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjZGVmaW5lIExaTzFYCisjdW5kZWYgTFpPMVkKKworI3VuZGVmIGFzc2VydAorLyoKK3N0YXRpYyB2b2lkIGRpZV9hdChpbnQgbGluZSkKK3sKKyAgICAgICAgYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yIGF0ICVkIiwgbGluZSk7Cit9CisjZGVmaW5lIGFzc2VydCh2KSBpZiAoISh2KSkgZGllX2F0KF9fTElORV9fKQorKi8KKyNkZWZpbmUgYXNzZXJ0KHYpICgodm9pZCkwKQorCitpbnQgbHpvMXhfMV9jb21wcmVzcyhjb25zdCB1aW50OF90KiBzcmMsIHVuc2lnbmVkIHNyY19sZW4sCisJCXVpbnQ4X3QqIGRzdCwgdW5zaWduZWQqIGRzdF9sZW4sCisJCXZvaWQqIHdya21lbSk7CitpbnQgbHpvMXhfMV8xNV9jb21wcmVzcyhjb25zdCB1aW50OF90KiBzcmMsIHVuc2lnbmVkIHNyY19sZW4sCisJCXVpbnQ4X3QqIGRzdCwgdW5zaWduZWQqIGRzdF9sZW4sCisJCXZvaWQqIHdya21lbSk7CitpbnQgbHpvMXhfOTk5X2NvbXByZXNzX2xldmVsKGNvbnN0IHVpbnQ4X3QqIGluLCB1bnNpZ25lZCBpbl9sZW4sCisJCXVpbnQ4X3QqIG91dCwgdW5zaWduZWQqIG91dF9sZW4sCisJCXZvaWQqIHdya21lbSwKKwkJaW50IGNvbXByZXNzaW9uX2xldmVsKTsKKworLyogZGVjb21wcmVzc2lvbiAqLworLy9pbnQgbHpvMXhfZGVjb21wcmVzcyhjb25zdCB1aW50OF90KiBzcmMsIHVuc2lnbmVkIHNyY19sZW4sCisvLwkJdWludDhfdCogZHN0LCB1bnNpZ25lZCogZHN0X2xlbiwKKy8vCQl2b2lkKiB3cmttZW0gLyogTk9UIFVTRUQgKi8pOworLyogc2FmZSBkZWNvbXByZXNzaW9uIHdpdGggb3ZlcnJ1biB0ZXN0aW5nICovCitpbnQgbHpvMXhfZGVjb21wcmVzc19zYWZlKGNvbnN0IHVpbnQ4X3QqIHNyYywgdW5zaWduZWQgc3JjX2xlbiwKKwkJdWludDhfdCogZHN0LCB1bnNpZ25lZCogZHN0X2xlbiwKKwkJdm9pZCogd3JrbWVtIC8qIE5PVCBVU0VEICovKTsKKworI2RlZmluZSBMWk9fRV9PSyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMWk9fRV9FUlJPUiAgICAgICAgICAgICAgICAgKC0xKQorI2RlZmluZSBMWk9fRV9PVVRfT0ZfTUVNT1JZICAgICAgICAgKC0yKSAgICAvKiBbbm90IHVzZWQgcmlnaHQgbm93XSAqLworI2RlZmluZSBMWk9fRV9OT1RfQ09NUFJFU1NJQkxFICAgICAgKC0zKSAgICAvKiBbbm90IHVzZWQgcmlnaHQgbm93XSAqLworI2RlZmluZSBMWk9fRV9JTlBVVF9PVkVSUlVOICAgICAgICAgKC00KQorI2RlZmluZSBMWk9fRV9PVVRQVVRfT1ZFUlJVTiAgICAgICAgKC01KQorI2RlZmluZSBMWk9fRV9MT09LQkVISU5EX09WRVJSVU4gICAgKC02KQorI2RlZmluZSBMWk9fRV9FT0ZfTk9UX0ZPVU5EICAgICAgICAgKC03KQorI2RlZmluZSBMWk9fRV9JTlBVVF9OT1RfQ09OU1VNRUQgICAgKC04KQorI2RlZmluZSBMWk9fRV9OT1RfWUVUX0lNUExFTUVOVEVEICAgKC05KSAgICAvKiBbbm90IHVzZWQgcmlnaHQgbm93XSAqLworCisvKiBsem8tMi4wMy9pbmNsdWRlL2x6by9sem9jb25mLmggKi8KKyNkZWZpbmUgTFpPX1ZFUlNJT04gICAweDIwMzAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGxhdGZvcm0uaCBiL2luY2x1ZGUvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFiYzMzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsNTAzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwNiwgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBCQl9QTEFURk9STV9ICisjZGVmaW5lIEJCX1BMQVRGT1JNX0ggMQorCisKKy8qIENvbnZlbmllbmNlIG1hY3JvcyB0byB0ZXN0IHRoZSB2ZXJzaW9uIG9mIGdjYy4gKi8KKyN1bmRlZiBfX0dOVUNfUFJFUkVRCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fR05VQ19NSU5PUl9fCisjIGRlZmluZSBfX0dOVUNfUFJFUkVRKG1haiwgbWluKSBcCisJCSgoX19HTlVDX18gPDwgMTYpICsgX19HTlVDX01JTk9SX18gPj0gKChtYWopIDw8IDE2KSArIChtaW4pKQorI2Vsc2UKKyMgZGVmaW5lIF9fR05VQ19QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisvKiBfX3Jlc3RyaWN0IGlzIGtub3duIGluIEVHQ1MgMS4yIGFuZCBhYm92ZS4gKi8KKyNpZiAhX19HTlVDX1BSRVJFUSgyLDkyKQorIyBpZm5kZWYgX19yZXN0cmljdAorIyAgZGVmaW5lIF9fcmVzdHJpY3QKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIV9fR05VQ19QUkVSRVEoMiw3KQorIyBpZm5kZWYgX19hdHRyaWJ1dGVfXworIyAgZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKKyMgZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgaW5saW5lCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID4gMTk5OTAxTAorLyogaXQncyBhIGtleXdvcmQgKi8KKyNlbGlmIF9fR05VQ19QUkVSRVEoMiw3KQorIyBkZWZpbmUgaW5saW5lIF9faW5saW5lX18KKyNlbHNlCisjIGRlZmluZSBpbmxpbmUKKyNlbmRpZgorCisjaWZuZGVmIF9fY29uc3QKKyMgZGVmaW5lIF9fY29uc3QgY29uc3QKKyNlbmRpZgorCisjZGVmaW5lIFVOVVNFRF9QQVJBTSBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjZGVmaW5lIE5PUkVUVVJOIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorLyogIlRoZSBtYWxsb2MgYXR0cmlidXRlIGlzIHVzZWQgdG8gdGVsbCB0aGUgY29tcGlsZXIgdGhhdCBhIGZ1bmN0aW9uCisgKiBtYXkgYmUgdHJlYXRlZCBhcyBpZiBhbnkgbm9uLU5VTEwgcG9pbnRlciBpdCByZXR1cm5zIGNhbm5vdCBhbGlhcworICogYW55IG90aGVyIHBvaW50ZXIgdmFsaWQgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucy4gVGhpcyB3aWxsIG9mdGVuCisgKiBpbXByb3ZlIG9wdGltaXphdGlvbi4gU3RhbmRhcmQgZnVuY3Rpb25zIHdpdGggdGhpcyBwcm9wZXJ0eSBpbmNsdWRlCisgKiBtYWxsb2MgYW5kIGNhbGxvYy4gcmVhbGxvYy1saWtlIGZ1bmN0aW9ucyBoYXZlIHRoaXMgcHJvcGVydHkgYXMgbG9uZworICogYXMgdGhlIG9sZCBwb2ludGVyIGlzIG5ldmVyIHJlZmVycmVkIHRvIChpbmNsdWRpbmcgY29tcGFyaW5nIGl0CisgKiB0byB0aGUgbmV3IHBvaW50ZXIpIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLU5VTEwgdmFsdWUuIgorICovCisjZGVmaW5lIFJFVFVSTlNfTUFMTE9DIF9fYXR0cmlidXRlX18gKChtYWxsb2MpKQorI2RlZmluZSBQQUNLRUQgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorI2RlZmluZSBBTElHTkVEKG0pIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhtKSkpCisKKy8qIF9fTk9fSU5MSU5FX186IHNvbWUgZ2NjJ3MgZG8gbm90IGhvbm9yIGlubGluaW5nISA6KCAqLworI2lmIF9fR05VQ19QUkVSRVEoMywwKSAmJiAhZGVmaW5lZChfX05PX0lOTElORV9fKQorIyBkZWZpbmUgQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fICgoYWx3YXlzX2lubGluZSkpIGlubGluZQorLyogSSd2ZSBzZWVuIGEgdG9vbGNoYWluIHdoZXJlIEkgbmVlZGVkIF9fbm9pbmxpbmVfXyBpbnN0ZWFkIG9mIG5vaW5saW5lICovCisjIGRlZmluZSBOT0lOTElORSAgICAgIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCisjIGlmICFFTkFCTEVfV0VSUk9SCisjICBkZWZpbmUgREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fICgoX19kZXByZWNhdGVkX18pKQorIyAgZGVmaW5lIFVOVVNFRF9QQVJBTV9SRVNVTFQgX19hdHRyaWJ1dGVfXyAoKHdhcm5fdW51c2VkX3Jlc3VsdCkpCisjIGVsc2UKKyMgIGRlZmluZSBERVBSRUNBVEVECisjICBkZWZpbmUgVU5VU0VEX1BBUkFNX1JFU1VMVAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEFMV0FZU19JTkxJTkUgaW5saW5lCisjIGRlZmluZSBOT0lOTElORQorIyBkZWZpbmUgREVQUkVDQVRFRAorIyBkZWZpbmUgVU5VU0VEX1BBUkFNX1JFU1VMVAorI2VuZGlmCisKKy8qIC1md2hvbGUtcHJvZ3JhbSBtYWtlcyBhbGwgc3ltYm9scyBsb2NhbC4gVGhlIGF0dHJpYnV0ZSBleHRlcm5hbGx5X3Zpc2libGUKKyAqIGZvcmNlcyBhIHN5bWJvbCBnbG9iYWwuICAqLworI2lmIF9fR05VQ19QUkVSRVEoNCwxKQorIyBkZWZpbmUgRVhURVJOQUxMWV9WSVNJQkxFIF9fYXR0cmlidXRlX18oKCB2aXNpYmlsaXR5KCJkZWZhdWx0IikgKSkKKy8vX19hdHRyaWJ1dGVfXyAoKF9fZXh0ZXJuYWxseV92aXNpYmxlX18pKQorI2Vsc2UKKyMgZGVmaW5lIEVYVEVSTkFMTFlfVklTSUJMRQorI2VuZGlmCisKKy8qIEF0IDQuNCBnY2MgYmVjb21lIG11Y2ggbW9yZSBhbmFsIGFib3V0IHRoaXMsIG5lZWQgdG8gdXNlICJhbGlhc2VkIiB0eXBlcyAqLworI2lmIF9fR05VQ19QUkVSRVEoNCw0KQorIyBkZWZpbmUgRklYX0FMSUFTSU5HIF9fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKQorI2Vsc2UKKyMgZGVmaW5lIEZJWF9BTElBU0lORworI2VuZGlmCisKKy8qIFdlIHVzZSBfX2V4dGVuc2lvbl9fIGluIHNvbWUgcGxhY2VzIHRvIHN1cHByZXNzIC1wZWRhbnRpYyB3YXJuaW5ncworICogYWJvdXQgR0NDIGV4dGVuc2lvbnMuICBUaGlzIGZlYXR1cmUgZGlkbid0IHdvcmsgcHJvcGVybHkgYmVmb3JlCisgKiBnY2MgMi44LiAgKi8KKyNpZiAhX19HTlVDX1BSRVJFUSgyLDgpCisjIGlmbmRlZiBfX2V4dGVuc2lvbl9fCisjICBkZWZpbmUgX19leHRlbnNpb25fXworIyBlbmRpZgorI2VuZGlmCisKKy8qIEZBU1RfRlVOQyBpcyBhIHF1YWxpZmllciB3aGljaCAocG9zc2libHkpIG1ha2VzIGZ1bmN0aW9uIGNhbGwgZmFzdGVyCisgKiBhbmQvb3Igc21hbGxlciBieSB1c2luZyBtb2RpZmllZCBBQkkuIEl0IGlzIHVzdWFsbHkgb25seSBuZWVkZWQKKyAqIG9uIG5vbi1zdGF0aWMsIGJ1c3lib3ggaW50ZXJuYWwgZnVuY3Rpb25zLiBSZWNlbnQgdmVyc2lvbnMgb2YgZ2NjCisgKiBvcHRpbWl6ZSBzdGF0aWNzIGF1dG9tYXRpY2FsbHkuIEZBU1RfRlVOQyBvbiBzdGF0aWMgaXMgcmVxdWlyZWQKKyAqIG9ubHkgaWYgeW91IG5lZWQgdG8gbWF0Y2ggYSBmdW5jdGlvbiBwb2ludGVyJ3MgdHlwZSAqLworI2lmIF9fR05VQ19QUkVSRVEoMywwKSAmJiBkZWZpbmVkKGkzODYpIC8qIHx8IGRlZmluZWQoX194ODZfNjRfXyk/ICovCisvKiBzdGRjYWxsIG1ha2VzIGNhbGxlZSB0byBwb3AgYXJndW1lbnRzIGZyb20gc3RhY2ssIG5vdCBjYWxsZXIgKi8KKyMgZGVmaW5lIEZBU1RfRlVOQyBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpLHN0ZGNhbGwpKQorLyogI2VsaWYgLi4uIC0gYWRkIHlvdXIgZmF2b3JpdGUgYXJjaCB0b2RheSEgKi8KKyNlbHNlCisjIGRlZmluZSBGQVNUX0ZVTkMKKyNlbmRpZgorCisvKiBNYWtlIGFsbCBkZWNsYXJhdGlvbnMgaGlkZGVuICgtZnZpc2liaWxpdHkgZmxhZyBvbmx5IGFmZmVjdHMgZGVmaW5pdGlvbnMpICovCisvKiAoZG9uJ3QgaW5jbHVkZSBzeXN0ZW0gaGVhZGVycyBhZnRlciB0aGlzIHVudGlsIGNvcnJlc3BvbmRpbmcgcG9wISkgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDQsMSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIFBVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTiBfUHJhZ21hKCJHQ0MgdmlzaWJpbGl0eSBwdXNoKGhpZGRlbikiKQorIyBkZWZpbmUgUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkgICAgICAgICAgICAgIF9QcmFnbWEoIkdDQyB2aXNpYmlsaXR5IHBvcCIpCisjZWxzZQorIyBkZWZpbmUgUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisjIGRlZmluZSBQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorI2VuZGlmCisKKy8qIGdjYy0yLjk1IGhhZCBubyB2YV9jb3B5IGJ1dCBvbmx5IF9fdmFfY29weS4gKi8KKyNpZiAhX19HTlVDX1BSRVJFUSgzLDApCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorIyBpZiAhZGVmaW5lZCB2YV9jb3B5ICYmIGRlZmluZWQgX192YV9jb3B5CisjICBkZWZpbmUgdmFfY29weShkLHMpIF9fdmFfY29weSgoZCksKHMpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogLS0tLSBFbmRpYW4gRGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWYgZGVmaW5lZChfX2RpZ2l0YWxfXykgJiYgZGVmaW5lZChfX3VuaXhfXykKKyMgaW5jbHVkZSA8c2V4Lmg+CisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIFwKKyAgIHx8IGRlZmluZWQoX19BUFBMRV9fKQorIyBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gIC8qIHJsaW1pdCAqLworIyBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorIyBkZWZpbmUgYnN3YXBfNjQgX19ic3dhcDY0CisjIGRlZmluZSBic3dhcF8zMiBfX2Jzd2FwMzIKKyMgZGVmaW5lIGJzd2FwXzE2IF9fYnN3YXAxNgorI2Vsc2UKKyMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19CWVRFX09SREVSKSAmJiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDEKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMAorI2VsaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMAorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9CWVRFX09SREVSKSAmJiBfQllURV9PUkRFUiA9PSBfQklHX0VORElBTgorIyBkZWZpbmUgQkJfQklHX0VORElBTiAxCisjIGRlZmluZSBCQl9MSVRUTEVfRU5ESUFOIDAKKyNlbGlmIGRlZmluZWQoX0JZVEVfT1JERVIpICYmIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDAKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMQorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAwCisjZWxpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorIyBkZWZpbmUgQkJfQklHX0VORElBTiAwCisjIGRlZmluZSBCQl9MSVRUTEVfRU5ESUFOIDEKKyNlbGlmIGRlZmluZWQoX18zODZfXykKKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMAorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAxCisjZWxzZQorIyBlcnJvciAiQ2FuJ3QgZGV0ZXJtaW5lIGVuZGlhbm5lc3MiCisjZW5kaWYKKworI2lmIFVMT05HX01BWCA+IDB4ZmZmZmZmZmYKKyMgZGVmaW5lIGJiX2Jzd2FwXzY0KHgpIGJzd2FwXzY0KHgpCisjZW5kaWYKKworLyogU1dBUF9MRW5uIG1lYW5zICJjb252ZXJ0IENQVTwtPmxpdHRsZV9lbmRpYW4gYnkgc3dhcHBpbmcgYnl0ZXMiICovCisjaWYgQkJfQklHX0VORElBTgorIyBkZWZpbmUgU1dBUF9CRTE2KHgpICh4KQorIyBkZWZpbmUgU1dBUF9CRTMyKHgpICh4KQorIyBkZWZpbmUgU1dBUF9CRTY0KHgpICh4KQorIyBkZWZpbmUgU1dBUF9MRTE2KHgpIGJzd2FwXzE2KHgpCisjIGRlZmluZSBTV0FQX0xFMzIoeCkgYnN3YXBfMzIoeCkKKyMgZGVmaW5lIFNXQVBfTEU2NCh4KSBiYl9ic3dhcF82NCh4KQorIyBkZWZpbmUgSUZfQklHX0VORElBTiguLi4pIF9fVkFfQVJHU19fCisjIGRlZmluZSBJRl9MSVRUTEVfRU5ESUFOKC4uLikKKyNlbHNlCisjIGRlZmluZSBTV0FQX0JFMTYoeCkgYnN3YXBfMTYoeCkKKyMgZGVmaW5lIFNXQVBfQkUzMih4KSBic3dhcF8zMih4KQorIyBkZWZpbmUgU1dBUF9CRTY0KHgpIGJiX2Jzd2FwXzY0KHgpCisjIGRlZmluZSBTV0FQX0xFMTYoeCkgKHgpCisjIGRlZmluZSBTV0FQX0xFMzIoeCkgKHgpCisjIGRlZmluZSBTV0FQX0xFNjQoeCkgKHgpCisjIGRlZmluZSBJRl9CSUdfRU5ESUFOKC4uLikKKyMgZGVmaW5lIElGX0xJVFRMRV9FTkRJQU4oLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKworLyogLS0tLSBVbmFsaWduZWQgYWNjZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludCAgICAgIGJiX19hbGlhc2VkX2ludCAgICAgIEZJWF9BTElBU0lORzsKK3R5cGVkZWYgdWludDE2X3QgYmJfX2FsaWFzZWRfdWludDE2X3QgRklYX0FMSUFTSU5HOwordHlwZWRlZiB1aW50MzJfdCBiYl9fYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7CisKKy8qIE5COiB1bmFsaWduZWQgcGFyYW1ldGVyIHNob3VsZCBiZSBhIHBvaW50ZXIsIGFsaWduZWQgb25lIC0KKyAqIGEgbHZhbHVlLiBUaGlzIG1ha2VzIGl0IG1vcmUgbGlrZWx5IHRvIG5vdCBzd2FwIHRoZW0gYnkgbWlzdGFrZQorICovCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pCisjIGRlZmluZSBtb3ZlX2Zyb21fdW5hbGlnbmVkX2ludCh2LCBpbnRwKSAoKHYpID0gKihiYl9fYWxpYXNlZF9pbnQqKShpbnRwKSkKKyMgZGVmaW5lIG1vdmVfZnJvbV91bmFsaWduZWQxNih2LCB1MTZwKSAoKHYpID0gKihiYl9fYWxpYXNlZF91aW50MTZfdCopKHUxNnApKQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHYsIHUzMnApICgodikgPSAqKGJiX19hbGlhc2VkX3VpbnQzMl90KikodTMycCkpCisjIGRlZmluZSBtb3ZlX3RvX3VuYWxpZ25lZDE2KHUxNnAsIHYpICAgKCooYmJfX2FsaWFzZWRfdWludDE2X3QqKSh1MTZwKSA9ICh2KSkKKyMgZGVmaW5lIG1vdmVfdG9fdW5hbGlnbmVkMzIodTMycCwgdikgICAoKihiYl9fYWxpYXNlZF91aW50MzJfdCopKHUzMnApID0gKHYpKQorLyogI2VsaWYgLi4uIC0gYWRkIHlvdXIgZmF2b3JpdGUgYXJjaCB0b2RheSEgKi8KKyNlbHNlCisvKiBwZXJmb3JtcyByZWFzb25hYmx5IHdlbGwgKGdjYyB1c3VhbGx5IGlubGluZXMgbWVtY3B5IGhlcmUpICovCisjIGRlZmluZSBtb3ZlX2Zyb21fdW5hbGlnbmVkX2ludCh2LCBpbnRwKSAobWVtY3B5KCYodiksIChpbnRwKSwgc2l6ZW9mKGludCkpKQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHYsIHUxNnApIChtZW1jcHkoJih2KSwgKHUxNnApLCAyKSkKKyMgZGVmaW5lIG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCB1MzJwKSAobWVtY3B5KCYodiksICh1MzJwKSwgNCkpCisjIGRlZmluZSBtb3ZlX3RvX3VuYWxpZ25lZDE2KHUxNnAsIHYpIGRvIHsgXAorCXVpbnQxNl90IF9fdCA9ICh2KTsgXAorCW1lbWNweSgodTE2cCksICZfX3QsIDQpOyBcCit9IHdoaWxlICgwKQorIyBkZWZpbmUgbW92ZV90b191bmFsaWduZWQzMih1MzJwLCB2KSBkbyB7IFwKKwl1aW50MzJfdCBfX3QgPSAodik7IFwKKwltZW1jcHkoKHUzMnApLCAmX190LCA0KTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIC0tLS0gU2l6ZS1zYXZpbmcgInNtYWxsIiBpbnRzIChhcmNoLWRlcGVuZGVudCkgLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fY3Jpc19fKQorLyogYWRkIG90aGVyIGFyY2hlcyB3aGljaCBiZW5lZml0IGZyb20gdGhpcy4uLiAqLwordHlwZWRlZiBzaWduZWQgY2hhciBzbWFsbGludDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzbWFsbHVpbnQ7CisjZWxzZQorLyogZm9yIGFyY2hlcyB3aGVyZSBieXRlIGFjY2Vzc2VzIGdlbmVyYXRlIGxhcmdlciBjb2RlOiAqLwordHlwZWRlZiBpbnQgc21hbGxpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIHNtYWxsdWludDsKKyNlbmRpZgorCisvKiBJU08gQyBTdGFuZGFyZDogIDcuMTYgIEJvb2xlYW4gdHlwZSBhbmQgdmFsdWVzICA8c3RkYm9vbC5oPiAqLworI2lmIChkZWZpbmVkIF9fZGlnaXRhbF9fICYmIGRlZmluZWQgX191bml4X18pCisvKiBvbGQgc3lzdGVtIHdpdGhvdXQgKHByb3BlcikgQzk5IHN1cHBvcnQgKi8KKyMgZGVmaW5lIGJvb2wgc21hbGx1aW50CisjZWxzZQorLyogbW9kZXJuIHN5c3RlbSwgc28gdXNlIGl0ICovCisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCisKKy8qLS0tLS0gS2VybmVsIHZlcnNpb25pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKKworCisvKiAtLS0tIE1pc2NlbGxhbmVvdXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkIF9fR0xJQkNfXyBcCisgfHwgZGVmaW5lZCBfX1VDTElCQ19fIFwKKyB8fCBkZWZpbmVkIF9fZGlldGxpYmNfXyBcCisgfHwgZGVmaW5lZCBfX0JJT05JQ19fIFwKKyB8fCBkZWZpbmVkIF9ORVdMSUJfVkVSU0lPTgorIyBpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2VuZGlmCisKKy8qIERlZmluZSBiYl9zZXRwZ3JwICovCisjaWYgZGVmaW5lZChfX2RpZ2l0YWxfXykgJiYgZGVmaW5lZChfX3VuaXhfXykKKy8qIHVzZSBsZWdhY3kgc2V0cGdycChwaWRfdCwgcGlkX3QpIGZvciBub3cuICBtb3ZlIHRvIHBsYXRmb3JtLmMgKi8KKyMgZGVmaW5lIGJiX3NldHBncnAoKSBkbyB7IHBpZF90IF9fbWUgPSBnZXRwaWQoKTsgc2V0cGdycChfX21lLCBfX21lKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBiYl9zZXRwZ3JwKCkgc2V0cGdycCgpCisjZW5kaWYKKworLyogZmRwcmludGYgaXMgbW9yZSByZWFkYWJsZSwgd2UgdXNlZCBpdCBiZWZvcmUgZHByaW50ZiB3YXMgc3RhbmRhcmRpemVkICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIGZkcHJpbnRmIGRwcmludGYKKworLyogVXNlZnVsIGZvciBkZWZlYXRpbmcgZ2NjJ3MgYWxpZ25tZW50IG9mICJjaGFyIG1lc3NhZ2VbXSItbGlrZSBkYXRhICovCisjaWYgMSAvKiBpZiBuZWVkZWQ6ICFkZWZpbmVkKGFyY2gxKSAmJiAhZGVmaW5lZChhcmNoMikgKi8KKyMgZGVmaW5lIEFMSUdOMSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEpKSkKKyMgZGVmaW5lIEFMSUdOMiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDIpKSkKKyMgZGVmaW5lIEFMSUdONCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNlbHNlCisvKiBBcmNoZXMgd2hpY2ggTVVTVCBoYXZlIDIgb3IgNCBieXRlIGFsaWdubWVudCBmb3IgZXZlcnl0aGluZyBhcmUgaGVyZSAqLworIyBkZWZpbmUgQUxJR04xCisjIGRlZmluZSBBTElHTjIKKyMgZGVmaW5lIEFMSUdONAorI2VuZGlmCisKKy8qCisgKiBGb3IgMC45LjI5IGFuZCBzdm4sIF9fQVJDSF9VU0VfTU1VX18gaW5kaWNhdGVzIG5vLW1tdSByZWxpYWJseS4KKyAqIEZvciBlYXJsaWVyIHZlcnNpb25zIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBjaGVjayBpZiB3ZSBhcmUgYnVpbGRpbmcKKyAqIGZvciBhIG1tdS1sZXNzIHN5c3RlbS4KKyAqLworI2lmIEVOQUJMRV9OT01NVSB8fCBcCisgICAgKGRlZmluZWQgX19VQ0xJQkNfXyAmJiBfX1VDTElCQ19NQUpPUl9fID49IDAgJiYgX19VQ0xJQkNfTUlOT1JfXyA+PSA5ICYmIFwKKyAgICBfX1VDTElCQ19TVUJMRVZFTF9fID4gMjggJiYgIWRlZmluZWQgX19BUkNIX1VTRV9NTVVfXykKKyMgZGVmaW5lIEJCX01NVSAwCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikKKyNlbHNlCisjIGRlZmluZSBCQl9NTVUgMQorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCisjIGluY2x1ZGUgPHN0YW5kYXJkcy5oPgorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorIyBkZWZpbmUgUFJJdTMyICJ1IgorIyBpZiAhZGVmaW5lZCBBREpfT0ZGU0VUX1NJTkdMRVNIT1QgJiYgZGVmaW5lZCBNT0RfQ0xLQSAmJiBkZWZpbmVkIE1PRF9PRkZTRVQKKyMgIGRlZmluZSBBREpfT0ZGU0VUX1NJTkdMRVNIT1QgKE1PRF9DTEtBIHwgTU9EX09GRlNFVCkKKyMgZW5kaWYKKyMgaWYgIWRlZmluZWQgQURKX0ZSRVFVRU5DWSAmJiBkZWZpbmVkIE1PRF9GUkVRVUVOQ1kKKyMgIGRlZmluZSBBREpfRlJFUVVFTkNZIE1PRF9GUkVRVUVOQ1kKKyMgZW5kaWYKKyMgaWYgIWRlZmluZWQgQURKX1RJTUVDT05TVCAmJiBkZWZpbmVkIE1PRF9USU1FQ09OU1QKKyMgIGRlZmluZSBBREpfVElNRUNPTlNUIE1PRF9USU1FQ09OU1QKKyMgZW5kaWYKKyMgaWYgIWRlZmluZWQgQURKX1RJQ0sgJiYgZGVmaW5lZCBNT0RfQ0xLQgorIyAgZGVmaW5lIEFESl9USUNLIE1PRF9DTEtCCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgZGVmaW5lIE1BWFNZTUxJTktTIFNZTUxPT1BfTUFYCisjZW5kaWYKKworCisvKiAtLS0tIFdobyBtaXNzZXMgd2hhdD8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEFzc3VtZSBhbGwgdGhlc2UgZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgZXhpc3QgYnkgZGVmYXVsdC4KKyAqIFBsYXRmb3JtcyB3aGVyZSBpdCBpcyBub3QgdHJ1ZSB3aWxsICN1bmRlZiB0aGVtIGJlbG93LgorICovCisjZGVmaW5lIEhBVkVfQ0xFQVJFTlYgMQorI2RlZmluZSBIQVZFX0ZEQVRBU1lOQyAxCisjZGVmaW5lIEhBVkVfRFBSSU5URiAxCisjZGVmaW5lIEhBVkVfTUVNUkNIUiAxCisjZGVmaW5lIEhBVkVfTUtEVEVNUCAxCisjZGVmaW5lIEhBVkVfUFRTTkFNRV9SIDEKKyNkZWZpbmUgSEFWRV9TRVRCSVQgMQorI2RlZmluZSBIQVZFX1NJR0hBTkRMRVJfVCAxCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKKyNkZWZpbmUgSEFWRV9TVFJDQVNFU1RSIDEKKyNkZWZpbmUgSEFWRV9TVFJDSFJOVUwgMQorI2RlZmluZSBIQVZFX1NUUlNFUCAxCisjZGVmaW5lIEhBVkVfU1RSU0lHTkFMIDEKKyNkZWZpbmUgSEFWRV9TVFJWRVJTQ01QIDEKKyNkZWZpbmUgSEFWRV9WQVNQUklOVEYgMQorI2RlZmluZSBIQVZFX1VOTE9DS0VEX1NURElPIDEKKyNkZWZpbmUgSEFWRV9VTkxPQ0tFRF9MSU5FX09QUyAxCisjZGVmaW5lIEhBVkVfR0VUTElORSAxCisjZGVmaW5lIEhBVkVfWFRBQlMgMQorI2RlZmluZSBIQVZFX01OVEVOVF9IIDEKKyNkZWZpbmUgSEFWRV9ORVRfRVRIRVJORVRfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRGU19IIDEKKworI2lmIGRlZmluZWQoX19VQ0xJQkNfTUFKT1JfXykKKyMgaWYgX19VQ0xJQkNfTUFKT1JfXyA9PSAwIFwKKyAgJiYgKCAgIF9fVUNMSUJDX01JTk9SX18gPCA5IFwKKyAgICAgfHwgKF9fVUNMSUJDX01JTk9SX18gPT0gOSAmJiBfX1VDTElCQ19TVUJMRVZFTF9fIDwgMzEpIFwKKyAgICAgKQorIyAgdW5kZWYgSEFWRV9TVFJWRVJTQ01QCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19kaWV0bGliY19fKQorIyB1bmRlZiBIQVZFX1NUUkNIUk5VTAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorIyB1bmRlZiBIQVZFX0RQUklOVEYKKyMgdW5kZWYgSEFWRV9HRVRMSU5FCisjIHVuZGVmIEhBVkVfTUVNUkNIUgorIyB1bmRlZiBIQVZFX01LRFRFTVAKKyMgdW5kZWYgSEFWRV9TRVRCSVQKKyMgdW5kZWYgSEFWRV9TVFBDUFkKKyMgdW5kZWYgSEFWRV9TVFJDQVNFU1RSCisjIHVuZGVmIEhBVkVfU1RSQ0hSTlVMCisjIHVuZGVmIEhBVkVfU1RSU0VQCisjIHVuZGVmIEhBVkVfU1RSU0lHTkFMCisjIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyB1bmRlZiBIQVZFX1ZBU1BSSU5URgorIyB1bmRlZiBIQVZFX1VOTE9DS0VEX1NURElPCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyMgdW5kZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIHVuZGVmIEhBVkVfQ0xFQVJFTlYKKyMgdW5kZWYgSEFWRV9GRFBSSU5URgorIyB1bmRlZiBIQVZFX01FTVJDSFIKKyMgdW5kZWYgSEFWRV9QVFNOQU1FX1IKKyMgdW5kZWYgSEFWRV9TVFJWRVJTQ01QCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyNlbmRpZgorCisvKiBUaGVzZSBCU0QtZGVyaXZlZCBPU2VzIHNoYXJlIG1hbnkgc2ltaWxhcml0aWVzICovCisjaWYgKGRlZmluZWQgX19kaWdpdGFsX18gJiYgZGVmaW5lZCBfX3VuaXhfXykgXAorIHx8IGRlZmluZWQgX19BUFBMRV9fIFwKKyB8fCBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19PcGVuQlNEX18gfHwgZGVmaW5lZCBfX05ldEJTRF9fCisjIHVuZGVmIEhBVkVfQ0xFQVJFTlYKKyMgdW5kZWYgSEFWRV9GREFUQVNZTkMKKyMgdW5kZWYgSEFWRV9HRVRMSU5FCisjIHVuZGVmIEhBVkVfTU5URU5UX0gKKyMgdW5kZWYgSEFWRV9QVFNOQU1FX1IKKyMgdW5kZWYgSEFWRV9TWVNfU1RBVEZTX0gKKyMgdW5kZWYgSEFWRV9TSUdIQU5ETEVSX1QKKyMgdW5kZWYgSEFWRV9TVFJWRVJTQ01QCisjIHVuZGVmIEhBVkVfWFRBQlMKKyMgdW5kZWYgSEFWRV9EUFJJTlRGCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfU1RESU8KKyMgdW5kZWYgSEFWRV9VTkxPQ0tFRF9MSU5FX09QUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyB1bmRlZiBIQVZFX1NUUkNIUk5VTAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisjIGRlZmluZSBIQVZFX0dFVExJTkUgMSAgLyogUmVjZW50IE5ldEJTRCB2ZXJzaW9ucyBoYXZlIGdldGxpbmUoKSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fZGlnaXRhbF9fKSAmJiBkZWZpbmVkKF9fdW5peF9fKQorIyB1bmRlZiBIQVZFX1NUUENQWQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFORFJPSUQpIHx8IGRlZmluZWQoX19BTkRST0lEX18pCisjIHVuZGVmIEhBVkVfRFBSSU5URgorIyB1bmRlZiBIQVZFX0dFVExJTkUKKyMgdW5kZWYgSEFWRV9TVFBDUFkKKyMgdW5kZWYgSEFWRV9TVFJDSFJOVUwKKyMgdW5kZWYgSEFWRV9TVFJWRVJTQ01QCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyMgdW5kZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorI2VuZGlmCisKKy8qCisgKiBOb3csIGRlZmluZSBwcm90b3R5cGVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBsYXRmb3JtLmMKKyAqIFRoZXNlIG11c3QgY29tZSBhZnRlciBhbGwgdGhlIEhBVkVfKiBtYWNyb3MgYXJlIGRlZmluZWQgKG9yIG5vdCkKKyAqLworCisjaWZuZGVmIEhBVkVfRFBSSU5URgorZXh0ZXJuIGludCBkcHJpbnRmKGludCBmZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NRU1SQ0hSCitleHRlcm4gdm9pZCAqbWVtcmNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUtEVEVNUAorZXh0ZXJuIGNoYXIgKm1rZHRlbXAoY2hhciAqdGVtcGxhdGUpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU0VUQklUCisjIGRlZmluZSBzZXRiaXQoYSwgYikgICgoYSlbKGIpID4+IDNdIHw9IDEgPDwgKChiKSAmIDcpKQorIyBkZWZpbmUgY2xyYml0KGEsIGIpICAoKGEpWyhiKSA+PiAzXSAmPSB+KDEgPDwgKChiKSAmIDcpKSkKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU0lHSEFORExFUl9UCit0eXBlZGVmIHZvaWQgKCpzaWdoYW5kbGVyX3QpKGludCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUENQWQorZXh0ZXJuIGNoYXIgKnN0cGNweShjaGFyICpwLCBjb25zdCBjaGFyICp0b19hZGQpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0FTRVNUUgorZXh0ZXJuIGNoYXIgKnN0cmNhc2VzdHIoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcGF0dGVybikgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJDSFJOVUwKK2V4dGVybiBjaGFyICpzdHJjaHJudWwoY29uc3QgY2hhciAqcywgaW50IGMpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSU0VQCitleHRlcm4gY2hhciAqc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSkgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKKy8qIE5vdCBleGFjdGx5IHRoZSBzYW1lOiBpbnN0ZWFkIG9mICJTdG9wcGVkIiBpdCBzaG93cyAiU1RPUCIgZXRjICovCisjIGRlZmluZSBzdHJzaWduYWwoc2lnKSBnZXRfc2lnbmFtZShzaWcpCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1ZBU1BSSU5URgorZXh0ZXJuIGludCB2YXNwcmludGYoY2hhciAqKnN0cmluZ19wdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBwKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVExJTkUKKyMgaW5jbHVkZSA8c3RkaW8uaD4gLyogZm9yIEZJTEUgKi8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIHNpemVfdCAqLworZXh0ZXJuIHNzaXplX3QgZ2V0bGluZShjaGFyICoqbGluZXB0ciwgc2l6ZV90ICpuLCBGSUxFICpzdHJlYW0pIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHdkXy5oIGIvaW5jbHVkZS9wd2RfLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwYjcxZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHdkXy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIENvcHlyaWdodCAoQykgMTk5MSw5Miw5NSw5Niw5Nyw5OCw5OSwyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogUE9TSVggU3RhbmRhcmQ6IDkuMi4yIFVzZXIgRGF0YWJhc2UgQWNjZXNzCTxwd2QuaD4KKyAqLworCisjaWZuZGVmIEJCX1BXRF9ICisjZGVmaW5lIEJCX1BXRF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgI2luY2x1ZGUgPHB3ZC5oPgorICogV2Ugd2lsbCB1c2UgbGliYy1kZWZpbmVkIHN0cnVjdHVyZXMsIGJ1dCB3aWxsICNkZWZpbmUgZnVuY3Rpb24gbmFtZXMKKyAqIHNvIHRoYXQgZnVuY3Rpb24gY2FsbHMgYXJlIGRpcmVjdGVkIHRvIGJiX2ludGVybmFsX1hYWCByZXBsYWNlbWVudHMKKyAqLworCisjZGVmaW5lIHNldHB3ZW50ICAgIGJiX2ludGVybmFsX3NldHB3ZW50CisjZGVmaW5lIGVuZHB3ZW50ICAgIGJiX2ludGVybmFsX2VuZHB3ZW50CisjZGVmaW5lIGdldHB3ZW50ICAgIGJiX2ludGVybmFsX2dldHB3ZW50CisjZGVmaW5lIGZnZXRwd2VudCAgIGJiX2ludGVybmFsX2ZnZXRwd2VudAorI2RlZmluZSBwdXRwd2VudCAgICBiYl9pbnRlcm5hbF9wdXRwd2VudAorI2RlZmluZSBnZXRwd3VpZCAgICBiYl9pbnRlcm5hbF9nZXRwd3VpZAorI2RlZmluZSBnZXRwd25hbSAgICBiYl9pbnRlcm5hbF9nZXRwd25hbQorI2RlZmluZSBnZXRwd2VudF9yICBiYl9pbnRlcm5hbF9nZXRwd2VudF9yCisjZGVmaW5lIGdldHB3dWlkX3IgIGJiX2ludGVybmFsX2dldHB3dWlkX3IKKyNkZWZpbmUgZ2V0cHduYW1fciAgYmJfaW50ZXJuYWxfZ2V0cHduYW1fcgorI2RlZmluZSBmZ2V0cHdlbnRfciBiYl9pbnRlcm5hbF9mZ2V0cHdlbnRfcgorCisKKy8qIEFsbCBmdW5jdGlvbiBuYW1lcyBiZWxvdyBzaG91bGQgYmUgcmVtYXBwZWQgYnkgI2RlZmluZXMgYWJvdmUKKyAqIGluIG9yZGVyIHRvIG5vdCBjb2xsaWRlIHdpdGggbGliYyBuYW1lcy4gKi8KKworCisvKiBSZXdpbmQgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLiAgKi8KK2V4dGVybiB2b2lkIHNldHB3ZW50KHZvaWQpOworCisvKiBDbG9zZSB0aGUgcGFzc3dvcmQtZmlsZSBzdHJlYW0uICAqLworZXh0ZXJuIHZvaWQgZW5kcHdlbnQodm9pZCk7CisKKyNpZmRlZiBVTlVTRURfU0lOQ0VfV0VfQVZPSURfU1RBVElDX0JVRlMKKy8qIFJlYWQgYW4gZW50cnkgZnJvbSB0aGUgcGFzc3dvcmQtZmlsZSBzdHJlYW0sIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd2VudCh2b2lkKTsKKworLyogUmVhZCBhbiBlbnRyeSBmcm9tIFNUUkVBTS4gICovCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZmdldHB3ZW50KEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgdGhlIGdpdmVuIGVudHJ5IG9udG8gdGhlIGdpdmVuIHN0cmVhbS4gICovCitleHRlcm4gaW50IHB1dHB3ZW50KGNvbnN0IHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19wLAorCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19mKTsKKyNlbmRpZgorCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyB1c2VyIElELiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd3VpZCh1aWRfdCBfX3VpZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIHVzZXJuYW1lLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbShjb25zdCBjaGFyICpfX25hbWUpOworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBQTEVBU0UgTk9URTogdGhlIGBnZXRwd2VudF9yJyBmdW5jdGlvbiBpcyBub3QgKHlldCkgc3RhbmRhcmRpemVkLgorICAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoaXMgbGlicmFyeS4gIEJ1dAorICAgdGhlIGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb2xsb3dpbmcgdGhlIHByaW5jaXBhbHMgdXNlZCBmb3IgdGhlCisgICBvdGhlciByZWVudHJhbnQgZnVuY3Rpb25zIHNvIHRoZSBjaGFuY2VzIGFyZSBnb29kIHRoaXMgaXMgd2hhdCB0aGUKKyAgIFBPU0lYIHBlb3BsZSB3b3VsZCBjaG9vc2UuICAqLworCitleHRlcm4gaW50IGdldHB3ZW50X3Ioc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRwd3VpZF9yKHVpZF90IF9fdWlkLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRwd25hbV9yKGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworLyogUmVhZCBhbiBlbnRyeSBmcm9tIFNUUkVBTS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN0YW5kYXJkaXplZCBhbmQKKyAgIHByb2JhYmx5IG5ldmVyIHdpbGwuICAqLworZXh0ZXJuIGludCBmZ2V0cHdlbnRfcihGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBfX3Jlc3VsdGJ1ZiwKKwkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J0Y18uaCBiL2luY2x1ZGUvcnRjXy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGZjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3J0Y18uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29tbW9uIGRlZmluZXMvc3RydWN0dXJlcy9ldGMuLi4gZm9yIGFwcGxldHMgdGhhdCBuZWVkIHRvIHdvcmsgd2l0aCB0aGUgUlRDLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBCQl9SVENfSAorI2RlZmluZSBCQl9SVENfSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworaW50IHJ0Y19hZGp0aW1lX2lzX3V0Yyh2b2lkKSBGQVNUX0ZVTkM7CitpbnQgcnRjX3hvcGVuKGNvbnN0IGNoYXIgKipkZWZhdWx0X3J0YywgaW50IGZsYWdzKSBGQVNUX0ZVTkM7Cit2b2lkIHJ0Y19yZWFkX3RtKHN0cnVjdCB0bSAqcHRtLCBpbnQgZmQpIEZBU1RfRlVOQzsKK3RpbWVfdCBydGNfdG0ydGltZShzdHJ1Y3QgdG0gKnB0bSwgaW50IHV0YykgRkFTVF9GVU5DOworCisKKy8qCisgKiBFdmVyeXRoaW5nIGJlbG93IHRoaXMgcG9pbnQgaGFzIGJlZW4gY29waWVkIGZyb20gbGludXgvcnRjLmgKKyAqIHRvIGVsaW1pbmF0ZSB0aGUga2VybmVsIGhlYWRlciBkZXBlbmRlbmN5CisgKi8KKworc3RydWN0IGxpbnV4X3J0Y190aW1lIHsKKwlpbnQgdG1fc2VjOworCWludCB0bV9taW47CisJaW50IHRtX2hvdXI7CisJaW50IHRtX21kYXk7CisJaW50IHRtX21vbjsKKwlpbnQgdG1feWVhcjsKKwlpbnQgdG1fd2RheTsKKwlpbnQgdG1feWRheTsKKwlpbnQgdG1faXNkc3Q7Cit9OworCitzdHJ1Y3QgbGludXhfcnRjX3drYWxybSB7CisJdW5zaWduZWQgY2hhciBlbmFibGVkOyAgLyogMCA9IGFsYXJtIGRpc2FibGVkLCAxID0gYWxhcm0gZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgcGVuZGluZzsgIC8qIDAgPSBhbGFybSBub3QgcGVuZGluZywgMSA9IGFsYXJtIHBlbmRpbmcgKi8KKwlzdHJ1Y3QgbGludXhfcnRjX3RpbWUgdGltZTsgIC8qIHRpbWUgdGhlIGFsYXJtIGlzIHNldCB0byAqLworfTsKKworLyoKKyAqIGlvY3RsIGNhbGxzIHRoYXQgYXJlIHBlcm1pdHRlZCB0byB0aGUgL2Rldi9ydGMgaW50ZXJmYWNlLCBpZgorICogYW55IG9mIHRoZSBSVEMgZHJpdmVycyBhcmUgZW5hYmxlZC4KKyAqLworI2RlZmluZSBSVENfQUlFX09OICAgICAgX0lPKCdwJywgMHgwMSkgIC8qIEFsYXJtIGludC4gZW5hYmxlIG9uICAgICAgICAgKi8KKyNkZWZpbmUgUlRDX0FJRV9PRkYgICAgIF9JTygncCcsIDB4MDIpICAvKiAuLi4gb2ZmICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJUQ19VSUVfT04gICAgICBfSU8oJ3AnLCAweDAzKSAgLyogVXBkYXRlIGludC4gZW5hYmxlIG9uICAgICAgICAqLworI2RlZmluZSBSVENfVUlFX09GRiAgICAgX0lPKCdwJywgMHgwNCkgIC8qIC4uLiBvZmYgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlRDX1BJRV9PTiAgICAgIF9JTygncCcsIDB4MDUpICAvKiBQZXJpb2RpYyBpbnQuIGVuYWJsZSBvbiAgICAgICovCisjZGVmaW5lIFJUQ19QSUVfT0ZGICAgICBfSU8oJ3AnLCAweDA2KSAgLyogLi4uIG9mZiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSVENfV0lFX09OICAgICAgX0lPKCdwJywgMHgwZikgIC8qIFdhdGNoZG9nIGludC4gZW5hYmxlIG9uICAgICAgKi8KKyNkZWZpbmUgUlRDX1dJRV9PRkYgICAgIF9JTygncCcsIDB4MTApICAvKiAuLi4gb2ZmICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUlRDX0FMTV9TRVQgICAgIF9JT1coJ3AnLCAweDA3LCBzdHJ1Y3QgbGludXhfcnRjX3RpbWUpIC8qIFNldCBhbGFybSB0aW1lICAqLworI2RlZmluZSBSVENfQUxNX1JFQUQgICAgX0lPUigncCcsIDB4MDgsIHN0cnVjdCBsaW51eF9ydGNfdGltZSkgLyogUmVhZCBhbGFybSB0aW1lICovCisjZGVmaW5lIFJUQ19SRF9USU1FICAgICBfSU9SKCdwJywgMHgwOSwgc3RydWN0IGxpbnV4X3J0Y190aW1lKSAvKiBSZWFkIFJUQyB0aW1lICAgKi8KKyNkZWZpbmUgUlRDX1NFVF9USU1FICAgIF9JT1coJ3AnLCAweDBhLCBzdHJ1Y3QgbGludXhfcnRjX3RpbWUpIC8qIFNldCBSVEMgdGltZSAgICAqLworI2RlZmluZSBSVENfSVJRUF9SRUFEICAgX0lPUigncCcsIDB4MGIsIHVuc2lnbmVkIGxvbmcpICAgLyogUmVhZCBJUlEgcmF0ZSAgICovCisjZGVmaW5lIFJUQ19JUlFQX1NFVCAgICBfSU9XKCdwJywgMHgwYywgdW5zaWduZWQgbG9uZykgICAvKiBTZXQgSVJRIHJhdGUgICAgKi8KKyNkZWZpbmUgUlRDX0VQT0NIX1JFQUQgIF9JT1IoJ3AnLCAweDBkLCB1bnNpZ25lZCBsb25nKSAgIC8qIFJlYWQgZXBvY2ggICAgICAqLworI2RlZmluZSBSVENfRVBPQ0hfU0VUICAgX0lPVygncCcsIDB4MGUsIHVuc2lnbmVkIGxvbmcpICAgLyogU2V0IGVwb2NoICAgICAgICovCisKKyNkZWZpbmUgUlRDX1dLQUxNX1NFVCAgIF9JT1coJ3AnLCAweDBmLCBzdHJ1Y3QgbGludXhfcnRjX3drYWxybSkvKiBTZXQgd2FrZXVwIGFsYXJtKi8KKyNkZWZpbmUgUlRDX1dLQUxNX1JEICAgIF9JT1IoJ3AnLCAweDEwLCBzdHJ1Y3QgbGludXhfcnRjX3drYWxybSkvKiBHZXQgd2FrZXVwIGFsYXJtKi8KKworLyogaW50ZXJydXB0IGZsYWdzICovCisjZGVmaW5lIFJUQ19JUlFGIDB4ODAgLyogYW55IG9mIHRoZSBmb2xsb3dpbmcgaXMgYWN0aXZlICovCisjZGVmaW5lIFJUQ19QRiAweDQwCisjZGVmaW5lIFJUQ19BRiAweDIwCisjZGVmaW5lIFJUQ19VRiAweDEwCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGFkb3dfLmggYi9pbmNsdWRlL3NoYWRvd18uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhhNjJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zaGFkb3dfLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBEZWNsYXJhdGlvbiBvZiB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBzaGFkb3cgcGFzc3dvcmQgc3VpdGUgKi8KKworI2lmbmRlZiBCQl9TSEFET1dfSAorI2RlZmluZSBCQl9TSEFET1dfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBTdHJ1Y3R1cmUgb2YgdGhlIHBhc3N3b3JkIGZpbGUgKi8KK3N0cnVjdCBzcHdkIHsKKwljaGFyICpzcF9uYW1wOyAgICAgICAgICAvKiBMb2dpbiBuYW1lICovCisJY2hhciAqc3BfcHdkcDsgICAgICAgICAgLyogRW5jcnlwdGVkIHBhc3N3b3JkICovCisJbG9uZyBzcF9sc3RjaGc7ICAgICAgICAgLyogRGF0ZSBvZiBsYXN0IGNoYW5nZSAqLworCWxvbmcgc3BfbWluOyAgICAgICAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBjaGFuZ2VzICovCisJbG9uZyBzcF9tYXg7ICAgICAgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGNoYW5nZXMgKi8KKwlsb25nIHNwX3dhcm47ICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGF5cyB0byB3YXJuIHVzZXIgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCAqLworCWxvbmcgc3BfaW5hY3Q7ICAgICAgICAgIC8qIE51bWJlciBvZiBkYXlzIHRoZSBhY2NvdW50IG1heSBiZSBpbmFjdGl2ZSAqLworCWxvbmcgc3BfZXhwaXJlOyAgICAgICAgIC8qIE51bWJlciBvZiBkYXlzIHNpbmNlIDE5NzAtMDEtMDEgdW50aWwgYWNjb3VudCBleHBpcmVzICovCisJdW5zaWduZWQgbG9uZyBzcF9mbGFnOyAgLyogUmVzZXJ2ZWQgKi8KK307CisKKyNkZWZpbmUgc2V0c3BlbnQgICAgYmJfaW50ZXJuYWxfc2V0c3BlbnQKKyNkZWZpbmUgZW5kc3BlbnQgICAgYmJfaW50ZXJuYWxfZW5kc3BlbnQKKyNkZWZpbmUgZ2V0c3BlbnQgICAgYmJfaW50ZXJuYWxfZ2V0c3BlbnQKKyNkZWZpbmUgZ2V0c3BuYW0gICAgYmJfaW50ZXJuYWxfZ2V0c3BuYW0KKyNkZWZpbmUgc2dldHNwZW50ICAgYmJfaW50ZXJuYWxfc2dldHNwZW50CisjZGVmaW5lIGZnZXRzcGVudCAgIGJiX2ludGVybmFsX2ZnZXRzcGVudAorI2RlZmluZSBwdXRzcGVudCAgICBiYl9pbnRlcm5hbF9wdXRzcGVudAorI2RlZmluZSBnZXRzcGVudF9yICBiYl9pbnRlcm5hbF9nZXRzcGVudF9yCisjZGVmaW5lIGdldHNwbmFtX3IgIGJiX2ludGVybmFsX2dldHNwbmFtX3IKKyNkZWZpbmUgc2dldHNwZW50X3IgYmJfaW50ZXJuYWxfc2dldHNwZW50X3IKKyNkZWZpbmUgZmdldHNwZW50X3IgYmJfaW50ZXJuYWxfZmdldHNwZW50X3IKKyNkZWZpbmUgbGNrcHdkZiAgICAgYmJfaW50ZXJuYWxfbGNrcHdkZgorI2RlZmluZSB1bGNrcHdkZiAgICBiYl9pbnRlcm5hbF91bGNrcHdkZgorCisKKy8qIEFsbCBmdW5jdGlvbiBuYW1lcyBiZWxvdyBzaG91bGQgYmUgcmVtYXBwZWQgYnkgI2RlZmluZXMgYWJvdmUKKyAqIGluIG9yZGVyIHRvIG5vdCBjb2xsaWRlIHdpdGggbGliYyBuYW1lcy4gKi8KKworI2lmZGVmIFVOVVNFRF9GT1JfTk9XCisvKiBPcGVuIGRhdGFiYXNlIGZvciByZWFkaW5nICovCitleHRlcm4gdm9pZCBzZXRzcGVudCh2b2lkKTsKKworLyogQ2xvc2UgZGF0YWJhc2UgKi8KK2V4dGVybiB2b2lkIGVuZHNwZW50KHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIGRhdGFiYXNlLCBwZXJoYXBzIGFmdGVyIG9wZW5pbmcgdGhlIGZpbGUgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqZ2V0c3BlbnQodm9pZCk7CisKKy8qIEdldCBzaGFkb3cgZW50cnkgbWF0Y2hpbmcgTkFNRSAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpnZXRzcG5hbShjb25zdCBjaGFyICpfX25hbWUpOworCisvKiBSZWFkIHNoYWRvdyBlbnRyeSBmcm9tIFNUUklORyAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpzZ2V0c3BlbnQoY29uc3QgY2hhciAqX19zdHJpbmcpOworCisvKiBSZWFkIG5leHQgc2hhZG93IGVudHJ5IGZyb20gU1RSRUFNICovCitleHRlcm4gc3RydWN0IHNwd2QgKmZnZXRzcGVudChGSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGxpbmUgY29udGFpbmluZyBzaGFkb3cgcGFzc3dvcmQgZW50cnkgdG8gc3RyZWFtICovCitleHRlcm4gaW50IHB1dHNwZW50KGNvbnN0IHN0cnVjdCBzcHdkICpfX3AsIEZJTEUgKl9fc3RyZWFtKTsKKworLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSAqLworZXh0ZXJuIGludCBnZXRzcGVudF9yKHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsIGNoYXIgKl9fYnVmZmVyLAorCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuLCBzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdWx0KTsKKyNlbmRpZgorCitleHRlcm4gaW50IGdldHNwbmFtX3IoY29uc3QgY2hhciAqX19uYW1lLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLAorCQkgICAgICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworCisjaWZkZWYgVU5VU0VEX0ZPUl9OT1cKK2V4dGVybiBpbnQgc2dldHNwZW50X3IoY29uc3QgY2hhciAqX19zdHJpbmcsIHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsCisJCQljaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZmdldHNwZW50X3IoRklMRSAqX19zdHJlYW0sIHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsCisJCQljaGFyICpfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisvKiBQcm90ZWN0IHBhc3N3b3JkIGZpbGUgYWdhaW5zdCBtdWx0aSB3cml0ZXJzICovCitleHRlcm4gaW50IGxja3B3ZGYodm9pZCk7CisKKy8qIFVubG9jayBwYXNzd29yZCBmaWxlICovCitleHRlcm4gaW50IHVsY2twd2RmKHZvaWQpOworI2VuZGlmCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZiAvKiBzaGFkb3cuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91bmljb2RlLmggYi9pbmNsdWRlL3VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE3YTIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91bmljb2RlLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVU5JQ09ERV9ICisjZGVmaW5lIFVOSUNPREVfSCAxCisKKyNpZiBFTkFCTEVfVU5JQ09ERV9VU0lOR19MT0NBTEUKKyMgaW5jbHVkZSA8d2NoYXIuaD4KKyMgaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2VudW0geworCVVOSUNPREVfVU5LTk9XTiA9IDAsCisJVU5JQ09ERV9PRkYgPSAxLAorCVVOSUNPREVfT04gPSAyLAorfTsKKworI2RlZmluZSB1bmljb2RlX2JpZGlfaXNydGwod2MpIDAKKyNkZWZpbmUgdW5pY29kZV9iaWRpX2lzX25ldXRyYWxfd2NoYXIod2MpICh3YyA8PSAxMjYgJiYgIWlzYWxwaGEod2MpKQorCisjaWYgIUVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKworIyBkZWZpbmUgdW5pY29kZV9zdHJsZW4oc3RyaW5nKSAgIHN0cmxlbihzdHJpbmcpCisjIGRlZmluZSB1bmljb2RlX3N0cndpZHRoKHN0cmluZykgc3RybGVuKHN0cmluZykKKyMgZGVmaW5lIHVuaWNvZGVfc3RhdHVzIFVOSUNPREVfT0ZGCisjIGRlZmluZSBpbml0X3VuaWNvZGUoKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHJlaW5pdF91bmljb2RlKExBTkcpICgodm9pZCkwKQorCisjZWxzZQorCisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDEyNiB8fCBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgzMDAwMAorIyAgdW5kZWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSCisjICBkZWZpbmUgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIDB4MmZmZmYKKyMgZW5kaWYKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPCAweDMwMAorIyAgdW5kZWYgRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUworIyAgZGVmaW5lIEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgMAorIyBlbmRpZgorCisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDB4MTEwMAorIyAgdW5kZWYgRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMKKyMgIGRlZmluZSBFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUyAwCisjIGVuZGlmCisKKyMgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIDwgMHg1OTAKKyMgIHVuZGVmICBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQKKyMgIGRlZmluZSBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQgMAorIyBlbmRpZgorCisvKiBOdW1iZXIgb2YgdW5pY29kZSBjaGFycy4gRmFsbHMgYmFjayB0byBzdHJsZW4oKSBvbiBpbnZhbGlkIHVuaWNvZGUgKi8KK3NpemVfdCBGQVNUX0ZVTkMgdW5pY29kZV9zdHJsZW4oY29uc3QgY2hhciAqc3RyaW5nKTsKKy8qIFdpZHRoIG9uIHRlcm1pbmFsICovCitzaXplX3QgRkFTVF9GVU5DIHVuaWNvZGVfc3Ryd2lkdGgoY29uc3QgY2hhciAqc3RyaW5nKTsKK2VudW0geworCVVOSV9GTEFHX1BBRCA9ICgxIDw8IDApLAorfTsKKy8vVU5VU0VEOiB1bnNpZ25lZCBGQVNUX0ZVTkMgdW5pY29kZV9wYWRkaW5nX3RvX3dpZHRoKHVuc2lnbmVkIHdpZHRoLCBjb25zdCBjaGFyICpzcmMpOworLy9VTlVTRUQ6IGNoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlMih1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCB3aWR0aCwgaW50IGZsYWdzKTsKK2NoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzcmMpOworLy9VTlVTRUQ6IGNoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlX21heHdpZHRoKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIG1heHdpZHRoKTsKK2NoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlX2ZpeGVkd2lkdGgoLyp1bmlfc3RhdF90ICpzdGF0cywqLyBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIHdpZHRoKTsKKworIyBpZiBFTkFCTEVfVU5JQ09ERV9VU0lOR19MT0NBTEUKKworZXh0ZXJuIHVpbnQ4X3QgdW5pY29kZV9zdGF0dXM7Cit2b2lkIGluaXRfdW5pY29kZSh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIHJlaW5pdF91bmljb2RlKGNvbnN0IGNoYXIgKkxBTkcpIEZBU1RfRlVOQzsKKworIyBlbHNlCisKKy8qIEhvbWVncm93biBVbmljb2RlIHN1cHBvcnQuIEl0IGtub3dzIG9ubHkgQyBhbmQgVW5pY29kZSBsb2NhbGVzLiAqLworCisjICBpZiAhRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYKKyMgICBkZWZpbmUgdW5pY29kZV9zdGF0dXMgVU5JQ09ERV9PTgorIyAgIGRlZmluZSBpbml0X3VuaWNvZGUoKSAoKHZvaWQpMCkKKyMgICBkZWZpbmUgcmVpbml0X3VuaWNvZGUoTEFORykgKCh2b2lkKTApCisjICBlbHNlCitleHRlcm4gdWludDhfdCB1bmljb2RlX3N0YXR1czsKK3ZvaWQgaW5pdF91bmljb2RlKHZvaWQpIEZBU1RfRlVOQzsKK3ZvaWQgcmVpbml0X3VuaWNvZGUoY29uc3QgY2hhciAqTEFORykgRkFTVF9GVU5DOworIyAgZW5kaWYKKworIyAgdW5kZWYgTUJfQ1VSX01BWAorIyAgZGVmaW5lIE1CX0NVUl9NQVggNgorCisvKiBQcmV2ZW50IG5hbWUgY29sbGlzaW9ucyAqLworIyAgZGVmaW5lIHdpbnRfdCAgICBiYl93aW50X3QKKyMgIGRlZmluZSBtYnN0YXRlX3QgYmJfbWJzdGF0ZV90CisjICBkZWZpbmUgbWJzdG93Y3MgIGJiX21ic3Rvd2NzCisjICBkZWZpbmUgd2NzdG9tYnMgIGJiX3djc3RvbWJzCisjICBkZWZpbmUgd2NydG9tYiAgIGJiX3djcnRvbWIKKyMgIGRlZmluZSBpc3dzcGFjZSAgYmJfaXN3c3BhY2UKKyMgIGRlZmluZSBpc3dhbG51bSAgYmJfaXN3YWxudW0KKyMgIGRlZmluZSBpc3dwdW5jdCAgYmJfaXN3cHVuY3QKKyMgIGRlZmluZSB3Y3dpZHRoICAgYmJfd2N3aWR0aAorCit0eXBlZGVmIGludDMyX3Qgd2ludF90OwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgYm9ndXM7Cit9IG1ic3RhdGVfdDsKKworc2l6ZV90IG1ic3Rvd2NzKHdjaGFyX3QgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4pIEZBU1RfRlVOQzsKK3NpemVfdCB3Y3N0b21icyhjaGFyICpkZXN0LCBjb25zdCB3Y2hhcl90ICpzcmMsIHNpemVfdCBuKSBGQVNUX0ZVTkM7CitzaXplX3Qgd2NydG9tYihjaGFyICpzLCB3Y2hhcl90IHdjLCBtYnN0YXRlX3QgKnBzKSBGQVNUX0ZVTkM7CitpbnQgaXN3c3BhY2Uod2ludF90IHdjKSBGQVNUX0ZVTkM7CitpbnQgaXN3YWxudW0od2ludF90IHdjKSBGQVNUX0ZVTkM7CitpbnQgaXN3cHVuY3Qod2ludF90IHdjKSBGQVNUX0ZVTkM7CitpbnQgd2N3aWR0aCh1bnNpZ25lZCB1Y3MpIEZBU1RfRlVOQzsKKyMgIGlmIEVOQUJMRV9VTklDT0RFX0JJRElfU1VQUE9SVAorIyAgIHVuZGVmIHVuaWNvZGVfYmlkaV9pc3J0bAoraW50IHVuaWNvZGVfYmlkaV9pc3J0bCh3aW50X3Qgd2MpIEZBU1RfRlVOQzsKKyMgICBpZiBFTkFCTEVfVU5JQ09ERV9ORVVUUkFMX1RBQkxFCisjICAgIHVuZGVmIHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyCitpbnQgdW5pY29kZV9iaWRpX2lzX25ldXRyYWxfd2NoYXIod2ludF90IHdjKSBGQVNUX0ZVTkM7CisjICAgZW5kaWYKKyMgIGVuZGlmCisKKworIyBlbmRpZiAvKiAhVU5JQ09ERV9VU0lOR19MT0NBTEUgKi8KKworI2VuZGlmIC8qIFVOSUNPREVfU1VQUE9SVCAqLworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNhZ2Uuc3JjLmggYi9pbmNsdWRlL3VzYWdlLnNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiY2E5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VzYWdlLnNyYy5oCkBAIC0wLDAgKzEsMTM4IEBACisvKiB2aTogc2V0IHN3PTggdHM9ODogKi8KKy8qCisgKiBUaGlzIGZpbGUgc3VmZmVycyBmcm9tIGNocm9uaWNhbGx5IGluY29ycmVjdCB0YWJpZmljYXRpb24KKyAqIG9mIG1lc3NhZ2VzLiBCZWZvcmUgZWRpdGluZyB0aGlzIGZpbGU6CisgKiAxLiBTd2l0Y2ggeW91IGVkaXRvciB0byA4LXNwYWNlIHRhYiBtb2RlLgorICogMi4gRG8gbm90IHVzZSBcdCBpbiBtZXNzYWdlcywgdXNlIHJlYWwgdGFiIGNoYXJhY3Rlci4KKyAqIDMuIFN0YXJ0IGVhY2ggc291cmNlIGxpbmUgd2l0aCBtZXNzYWdlIGFzIGZvbGxvd3M6CisgKiAgICB8PDcgc3BhY2VzPiJ0ZXh0IHdpdGggdGFicyIuLi4uCisgKiBvcgorICogICAgfDw1IHNwYWNlcz4iXG50ZXh0IHdpdGggdGFicyIuLi4uCisgKi8KKyNpZm5kZWYgQkJfVVNBR0VfSAorI2RlZmluZSBCQl9VU0FHRV9IIDEKKworI2RlZmluZSBOT1VTQUdFX1NUUiAiXGIiCisKK0lOU0VSVAorCisjZGVmaW5lIGJ1c3lib3hfbm90ZXNfdXNhZ2UgXAorICAgICAgICJIZWxsbyB3b3JsZCFcbiIKKworI2RlZmluZSBhbWJhX2RlYnVnX3RyaXZpYWxfdXNhZ2UgXAorCSJcbiIKKyNkZWZpbmUgYW1iYV9kZWJ1Z19mdWxsX3VzYWdlIFwKKwkiXHRQbGVhc2UgcHJvbXB0IGFtYmFfZGVidWcgZGlyZWN0bHkgdG8gZ2V0IGhlbHAgb24gaXRzIHVzYWdlXG4iCisKKyNkZWZpbmUgZHNwbG9nX3RyaXZpYWxfdXNhZ2UgXAorCSIiCisjZGVmaW5lIGRzcGxvZ19mdWxsX3VzYWdlIFwKKwkiIgorCisjZGVmaW5lIGRzcGxvZzJfdHJpdmlhbF91c2FnZSBcCisJIiIKKyNkZWZpbmUgZHNwbG9nMl9mdWxsX3VzYWdlIFwKKwkiIgorI2RlZmluZSBuYW5kZHVtcF90cml2aWFsX3VzYWdlIFwKKyAgICAgICAibmFuZGR1bXAgW09QVElPTlNdIE1URC1kZXZpY2UiCisjZGVmaW5lIG5hbmRkdW1wX2Z1bGxfdXNhZ2UgIlxuXG4iIFwKKyAgICAgICAiRHVtcHMgdGhlIGNvbnRlbnRzIG9mIGEgbmFuZCBtdGQgcGFydGl0aW9uLlxuIiBcCisgICAgICJcbk9wdGlvbnM6IiBcCisJSUZfTE9OR19PUFRTKCBcCisgICAgICJcbgkgICAgLS1oZWxwCSAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQiIFwKKyAgICAgIlxuCSAgICAtLXZlcnNpb24JICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIgXAorICAgICAiXG4JLWYgZmlsZSAgICAtLWZpbGU9ZmlsZSAgICAgICAgICBkdW1wIHRvIGZpbGUiIFwKKyAgICAgIlxuCS1pICAgICAgICAgLS1pZ25vcmVlcnJvcnMgICAgICAgaWdub3JlIGVycm9ycyIgXAorICAgICAiXG4JLWwgbGVuZ3RoICAtLWxlbmd0aD1sZW5ndGggICAgICBsZW5ndGgiIFwKKyAgICAgIlxuCS1uICAgICAgICAgLS1ub2VjYyAgICAgICAgICAgICAgcmVhZCB3aXRob3V0IGVycm9yIGNvcnJlY3Rpb24iIFwKKyAgICAgIlxuCS1vICAgICAgICAgLS1vbWl0b29iICAgICAgICAgICAgb21pdCBvb2IgZGF0YSIgXAorICAgICAiXG4JLWIgICAgICAgICAtLW9taXRiYWQgICAgICAgICAgICBvbWl0IGJhZCBibG9ja3MgZnJvbSB0aGUgZHVtcCIgXAorICAgICAiXG4JLXAgICAgICAgICAtLXByZXR0eXByaW50ICAgICAgICBwcmludCBuaWNlIChoZXhkdW1wKSIgXAorICAgICAiXG4JLXMgYWRkciAgICAtLXN0YXJ0YWRkcmVzcz1hZGRyICBzdGFydCBhZGRyZXNzIiBcCisJKSBcCisJSUZfTk9UX0xPTkdfT1BUUyggXAorICAgICAiXG4JLWYgZmlsZSAgICAgICAgIGR1bXAgdG8gZmlsZSIgXAorICAgICAiXG4JLWkJCWlnbm9yZSBlcnJvcnMiIFwKKyAgICAgIlxuCS1sIGxlbmd0aAlsZW5ndGgiIFwKKyAgICAgIlxuCS1uCQlyZWFkIHdpdGhvdXQgZXJyb3IgY29ycmVjdGlvbiIgXAorICAgICAiXG4JLW8JCW9taXQgb29iIGRhdGEiIFwKKyAgICAgIlxuCS1iCQlvbWl0IGJhZCBibG9ja3MgZnJvbSB0aGUgZHVtcCIgXAorICAgICAiXG4JLXAJCXByaW50IG5pY2UgKGhleGR1bXApIiBcCisgICAgICJcbgktcyBhZGRyCQlzdGFydCBhZGRyZXNzIiBcCisJKQorCisjZGVmaW5lIG5hbmR3cml0ZV90cml2aWFsX3VzYWdlIFwKKyAgICAgICAibmFuZHdyaXRlIFtPUFRJT05dIE1URF9ERVZJQ0UgSU5QVVRGSUxFIgorI2RlZmluZSBuYW5kd3JpdGVfZnVsbF91c2FnZSAiXG5cbiIgXAorICAgICAgICJXcml0ZXMgdG8gdGhlIHNwZWNpZmllZCBNVEQgZGV2aWNlLlxuIiBcCisgICAgICJcbk9wdGlvbnM6IiBcCisJSUZfTE9OR19PUFRTKCBcCisgICAgICJcbgktYSwgLS1hdXRvcGxhY2UJVXNlIGF1dG8gb29iIGxheW91dCIgXAorICAgICAiXG4JLWosIC0tamZmczIJCWZvcmNlIGpmZnMyIG9vYiBsYXlvdXQgKGxlZ2FjeSBzdXBwb3J0KSIgXAorICAgICAiXG4JLXksIC0teWFmZnMJCWZvcmNlIHlhZmZzIG9vYiBsYXlvdXQgKGxlZ2FjeSBzdXBwb3J0KSIgXAorICAgICAiXG4JLWYsIC0tZm9yY2VsZWdhY3kJZm9yY2UgbGVnYWN5IHN1cHBvcnQgb24gYXV0b3BsYWNlbWVudCBlbmFibGVkIG10ZCBkZXZpY2UiIFwKKyAgICAgIlxuCS1uLCAtLW5vZWNjCQl3cml0ZSB3aXRob3V0IGVjYyIgXAorICAgICAiXG4JLW8sIC0tb29iCQlpbWFnZSBjb250YWlucyBvb2IgZGF0YSIgXAorICAgICAiXG4JLXMgYWRkciwgLS1zdGFydD1hZGRyCXNldCBzdGFydCBhZGRyZXNzIChkZWZhdWx0IGlzIDApIiBcCisgICAgICJcbgktcCwgLS1wYWQJCXBhZCB0byBwYWdlIHNpemUiIFwKKyAgICAgIlxuCS1iLCAtLWJsb2NrYWxpZ249MXwyfDQJc2V0IG11bHRpcGxlIG9mIGVyYXNlYmxvY2tzIHRvIGFsaWduIHRvIiBcCisgICAgICJcbgktcSwgLS1xdWlldAkJZG9uJ3QgZGlzcGxheSBwcm9ncmVzcyBtZXNzYWdlcyIgXAorICAgICAiXG4JICAgIC0taGVscAkJZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQiIFwKKyAgICAgIlxuCSAgICAtLXZlcnNpb24JCW91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IiBcCisgICAgICJcbgktRywgLS1ibGQJICAgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBCTEQgUGFydGl0aW9uIlwKKyAgICAgIlxuCS1ILCAtLWhhbAkgICAgICAgCVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIEhBTCBQYXJ0aXRpb24iXAorICAgICAiXG4JLVEsIC0tcGJhCSAgICAgCVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBCQSBQYXJ0aXRpb24iXAorICAgICAiXG4JLUksIC0tc2VjCSAgICAgICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgU0VDIFBhcnRpdGlvbiJcCisgICAgICJcbgktVSwgLS1kc3AJICAgICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgRFNQIFBhcnRpdGlvbiJcCisgICAgICJcbgktVywgLS1sbngJICAgICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgTE5YIFBhcnRpdGlvbiJcCisgICAgICJcbgktWCwgLS1zd3AJICAgICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgU1dQIFBhcnRpdGlvbiJcCisgICAgICJcbgktWSwgLS1hZGQJICAgICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQUREIFBhcnRpdGlvbiJcCisgICAgICJcbgktWiwgLS1hZGMJICAgICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQURDIFBhcnRpdGlvbiJcCisgICAgICJcbgktSywgLS1wcmkJICAgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBQUkkgUGFydGl0aW9uIlwKKyAgICAgIlxuCS1NLCAtLXJtZAkgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBSTUQgUGFydGl0aW9uIlwKKyAgICAgIlxuCS1SLCAtLXJvbQkgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBST00gUGFydGl0aW9uIlwKKyAgICAgIlxuCS1CLCAtLWJhawkgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBCQUsgUGFydGl0aW9uIlwKKyAgICAgIlxuCS1DLCAtLWNtZAkgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBDTUQgbGluZSIgXAorICAgICAiXG4JLUYgaGV4LCAtLWZsYWc9aGV4CVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBhcnRpdGlvbiBsb2FkIGZsYWciIFwKKyAgICAgIlxuCS1TIGhleCwgLS1zYWZlPWhleAlmb3JjZSBBTUJPT1QgYm9vdCBmb3JtIFBUQiwgc2FmZSByZWNvdmVyeSJcCisgICAgICJcbgktTCBoZXgsIC0tbG9hZD1oZXgJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUGFydGl0aW9uIGxvYWQgYWRkcmVzcyIgXAorICAgICAiXG4JLUQgaGV4LCAtLWRhdGU9aGV4CVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBhcnRpdGlvbiBkYXRlIiBcCisgICAgICJcbgktViBoZXgsIC0tdmVyPWhleAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBQYXJ0aXRpb24gdmVyc2lvbiIgXAorICAgICAiXG4JLUUgTUFDLCAtLWV0aG1hYz1NQUMJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgTUFDIiBcCisgICAgICJcbgktTiBzbiwgLS1zbj1zbglVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBTTiIgXAorCSkgXAorCUlGX05PVF9MT05HX09QVFMoIFwKKyAgICAgIlxuCS1hLAkJVXNlIGF1dG8gb29iIGxheW91dCIgXAorICAgICAiXG4JLWosCQlmb3JjZSBqZmZzMiBvb2IgbGF5b3V0IChsZWdhY3kgc3VwcG9ydCkiIFwKKyAgICAgIlxuCS15LAkJZm9yY2UgeWFmZnMgb29iIGxheW91dCAobGVnYWN5IHN1cHBvcnQpIiBcCisgICAgICJcbgktZiwJCWZvcmNlIGxlZ2FjeSBzdXBwb3J0IG9uIGF1dG9wbGFjZW1lbnQgZW5hYmxlZCBtdGQgZGV2aWNlIiBcCisgICAgICJcbgktbiwJCXdyaXRlIHdpdGhvdXQgZWNjIiBcCisgICAgICJcbgktbywJCWltYWdlIGNvbnRhaW5zIG9vYiBkYXRhIiBcCisgICAgICJcbgktcyBhZGRyCQlzZXQgc3RhcnQgYWRkcmVzcyAoZGVmYXVsdCBpcyAwKSIgXAorICAgICAiXG4JLXAsCQlwYWQgdG8gcGFnZSBzaXplIiBcCisgICAgICJcbgktYiAxfDJ8NAlzZXQgbXVsdGlwbGUgb2YgZXJhc2VibG9ja3MgdG8gYWxpZ24gdG8iIFwKKyAgICAgIlxuCS1xCQlkb24ndCBkaXNwbGF5IHByb2dyZXNzIG1lc3NhZ2VzIiBcCisgICAgICJcbiAgICAgLUcJCVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIEJMRCBQYXJ0aXRpb24iXAorICAgICAiXG4gICAgIC1ICSAgICAgICBVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBIQUwgUGFydGl0aW9uIlwKKyAgICAgIlxuICAgICAtUQkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUEJBIFBhcnRpdGlvbiJcCisgICAgICJcbiAgICAgLUkgICAgIAlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBTRUMgUGFydGl0aW9uIlwKKyAgICAgIlxuICAgICAtVQkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgRFNQIFBhcnRpdGlvbiJcCisgICAgICJcbiAgICAgLVcJCVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIExOWCBQYXJ0aXRpb24iXAorICAgICAiXG4gICAgIC1YCQlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBTV1AgUGFydGl0aW9uIlwKKyAgICAgIlxuICAgICAtWQkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQUREIFBhcnRpdGlvbiJcCisgICAgICJcbiAgICAgLVogICAJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQURDIFBhcnRpdGlvbiJcCisgICAgICJcbiAgICAgLUsgICAgICAgICAgVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUFJJIFBhcnRpdGlvbiJcCisgICAgICJcbiAgICAgLU0gICAgCVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFJNRCBQYXJ0aXRpb24iXAorICAgICAiXG4gICAgIC1SCQlVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBST00gUGFydGl0aW9uIlwKKyAgICAgIlxuICAgICAtQgkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQkFLIFBhcnRpdGlvbiJcCisgICAgICJcbgktQwkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQ01EIGxpbmUiIFwKKyAgICAgIlxuCS1GIGhleAkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUGFydGl0aW9uIGxvYWQgZmxhZyIgXAorICAgICAiXG4JLVMgaGV4CQlmb3JjZSBBTUJPT1QgYm9vdCBmb3JtIFBUQiwgc2FmZSByZWNvdmVyeSJcCisgICAgICJcbgktTCBoZXgJCVVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBhcnRpdGlvbiBsb2FkIGFkZHJlc3MiIFwKKyAgICAgIlxuCS1EIGhleAkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUGFydGl0aW9uIGRhdGUiIFwKKyAgICAgIlxuCS1WIGhleAkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUGFydGl0aW9uIHZlcnNpb24iIFwKKyAgICAgIlxuCS1FIE1BQwkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgTUFDIiBcCisgICAgICJcbgktTiBzbgkJVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgU04iIFwKKwkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92b2x1bWVfaWQuaCBiL2luY2x1ZGUvdm9sdW1lX2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3OGNkMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdm9sdW1lX2lkLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK2NoYXIgKmdldF9kZXZuYW1lX2Zyb21fbGFiZWwoY29uc3QgY2hhciAqc3BlYyk7CitjaGFyICpnZXRfZGV2bmFtZV9mcm9tX3V1aWQoY29uc3QgY2hhciAqc3BlYyk7Cit2b2lkIGRpc3BsYXlfdXVpZF9jYWNoZSh2b2lkKTsKKworLyogUmV0dXJuczoKKyAqIDA6IG5vIFVVSUQ9IG9yIExBQkVMPSBwcmVmaXggZm91bmQKKyAqIDE6IFVVSUQ9IG9yIExBQkVMPSBwcmVmaXggZm91bmQuIEluIHRoaXMgY2FzZSwKKyAqICAgICpmc25hbWUgaXMgcmVwbGFjZWQgaWYgZGV2aWNlIHdpdGggc3VjaCBVVUlEIG9yIExBQkVMIGlzIGZvdW5kCisgKi8KK2ludCByZXNvbHZlX21vdW50X3NwZWMoY2hhciAqKmZzbmFtZSk7CitpbnQgYWRkX3RvX3V1aWRfY2FjaGUoY29uc3QgY2hhciAqZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGF0b251bS5oIGIvaW5jbHVkZS94YXRvbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3NmEzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveGF0b251bS5oCkBAIC0wLDAgKzEsMTc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhc2NpaS10by1udW1iZXJzIGltcGxlbWVudGF0aW9ucyBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIFByb3ZpZGVzIGV4dGVybiBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zICovCisjZGVmaW5lIERFQ0xBUkVfU1RSX0NPTlYodHlwZSwgVCwgVVQpIFwKK1wKK3Vuc2lnbmVkIHR5cGUgeHN0cnRvIyNVVCMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIGludCBiLCB1bnNpZ25lZCB0eXBlIGwsIHVuc2lnbmVkIHR5cGUgdSwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4c3RydG8jI1VUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgdW5zaWduZWQgdHlwZSBsLCB1bnNpZ25lZCB0eXBlIHUpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4c3RydG8jI1VUIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBGQVNUX0ZVTkM7IFwKK3Vuc2lnbmVkIHR5cGUgeHN0cnRvIyNVVChjb25zdCBjaGFyICpzdHIsIGludCBiKSBGQVNUX0ZVTkM7IFwKK3Vuc2lnbmVkIHR5cGUgeGF0byMjVVQjI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCB0eXBlIGwsIHVuc2lnbmVkIHR5cGUgdSwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4YXRvIyNVVCMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgdHlwZSBsLCB1bnNpZ25lZCB0eXBlIHUpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4YXRvIyNVVCMjX3NmeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBGQVNUX0ZVTkM7IFwKK3Vuc2lnbmVkIHR5cGUgeGF0byMjVVQoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7IFwKK3R5cGUgeHN0cnRvIyNUIyNfcmFuZ2Vfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIHR5cGUgbCwgdHlwZSB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit0eXBlIHhzdHJ0byMjVCMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIHR5cGUgbCwgdHlwZSB1KSBGQVNUX0ZVTkM7IFwKK3R5cGUgeHN0cnRvIyNUKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIpIEZBU1RfRlVOQzsgXAordHlwZSB4YXRvIyNUIyNfcmFuZ2Vfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgdHlwZSBsLCB0eXBlIHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBGQVNUX0ZVTkM7IFwKK3R5cGUgeGF0byMjVCMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgdHlwZSBsLCB0eXBlIHUpIEZBU1RfRlVOQzsgXAordHlwZSB4YXRvIyNUIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordHlwZSB4YXRvIyNUKGNvbnN0IGNoYXIgKnN0cikgRkFTVF9GVU5DOyBcCisKKy8qIFVuc2lnbmVkIGxvbmcgbG9uZyBmdW5jdGlvbnMgYWx3YXlzIGV4aXN0ICovCitERUNMQVJFX1NUUl9DT05WKGxvbmcgbG9uZywgbGwsIHVsbCkKKworCisvKiBQcm92aWRlcyBpbmxpbmUgZGVmaW5pdGlvbnMgb2YgZnVuY3Rpb25zICovCisvKiAodXNlZnVsIGZvciBtYXBwaW5nIHRoZW0gdG8gdGhlIHR5cGUgb2YgdGhlIHNhbWUgd2lkdGgpICovCisjZGVmaW5lIERFRklORV9FUVVJVl9TVFJfQ09OVihuYXJyb3csIE4sIFcsIFVOLCBVVykgXAorXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhzdHJ0byMjVU4jI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgdW5zaWduZWQgbmFycm93IGwsIHVuc2lnbmVkIG5hcnJvdyB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgXAoreyByZXR1cm4geHN0cnRvIyNVVyMjX3JhbmdlX3NmeChzdHIsIGIsIGwsIHUsIHNmeCk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhzdHJ0byMjVU4jI19yYW5nZShjb25zdCBjaGFyICpzdHIsIGludCBiLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVVcjI19yYW5nZShzdHIsIGIsIGwsIHUpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK3Vuc2lnbmVkIG5hcnJvdyB4c3RydG8jI1VOIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4c3RydG8jI1VXIyNfc2Z4KHN0ciwgYiwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeHN0cnRvIyNVTihjb25zdCBjaGFyICpzdHIsIGludCBiKSBcCit7IHJldHVybiB4c3RydG8jI1VXKHN0ciwgYik7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhhdG8jI1VOIyNfcmFuZ2Vfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbmFycm93IGwsIHVuc2lnbmVkIG5hcnJvdyB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgXAoreyByZXR1cm4geGF0byMjVVcjI19yYW5nZV9zZngoc3RyLCBsLCB1LCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK3Vuc2lnbmVkIG5hcnJvdyB4YXRvIyNVTiMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbmFycm93IGwsIHVuc2lnbmVkIG5hcnJvdyB1KSBcCit7IHJldHVybiB4YXRvIyNVVyMjX3JhbmdlKHN0ciwgbCwgdSk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhhdG8jI1VOIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhhdG8jI1VXIyNfc2Z4KHN0ciwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeGF0byMjVU4oY29uc3QgY2hhciAqc3RyKSBcCit7IHJldHVybiB4YXRvIyNVVyhzdHIpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4c3RydG8jI04jI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgbmFycm93IGwsIG5hcnJvdyB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgXAoreyByZXR1cm4geHN0cnRvIyNXIyNfcmFuZ2Vfc2Z4KHN0ciwgYiwgbCwgdSwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCituYXJyb3cgeHN0cnRvIyNOIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgbmFycm93IGwsIG5hcnJvdyB1KSBcCit7IHJldHVybiB4c3RydG8jI1cjI19yYW5nZShzdHIsIGIsIGwsIHUpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4c3RydG8jI04oY29uc3QgY2hhciAqc3RyLCBpbnQgYikgXAoreyByZXR1cm4geHN0cnRvIyNXKHN0ciwgYik7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAorbmFycm93IHhhdG8jI04jI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCBuYXJyb3cgbCwgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4YXRvIyNXIyNfcmFuZ2Vfc2Z4KHN0ciwgbCwgdSwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCituYXJyb3cgeGF0byMjTiMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgbmFycm93IGwsIG5hcnJvdyB1KSBcCit7IHJldHVybiB4YXRvIyNXIyNfcmFuZ2Uoc3RyLCBsLCB1KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCituYXJyb3cgeGF0byMjTiMjX3NmeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4YXRvIyNXIyNfc2Z4KHN0ciwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCituYXJyb3cgeGF0byMjTihjb25zdCBjaGFyICpzdHIpIFwKK3sgcmV0dXJuIHhhdG8jI1coc3RyKTsgfSBcCisKKy8qIElmIGxvbmcgPT0gbG9uZyBsb25nLCB0aGVuIGp1c3QgbWFwIHRoZW0gb25lLXRvLW9uZSAqLworI2lmIFVMT05HX01BWCA9PSBVTExPTkdfTUFYCitERUZJTkVfRVFVSVZfU1RSX0NPTlYobG9uZywgbCwgbGwsIHVsLCB1bGwpCisjZWxzZQorLyogRWxzZSBwcm92aWRlIGV4dGVybiBkZWZzICovCitERUNMQVJFX1NUUl9DT05WKGxvbmcsIGwsIHVsKQorI2VuZGlmCisKKy8qIFNhbWUgZm9yIGludCAtPiBbbG9uZ10gbG9uZyAqLworI2lmIFVJTlRfTUFYID09IFVMTE9OR19NQVgKK0RFRklORV9FUVVJVl9TVFJfQ09OVihpbnQsIGksIGxsLCB1LCB1bGwpCisjZWxpZiBVSU5UX01BWCA9PSBVTE9OR19NQVgKK0RFRklORV9FUVVJVl9TVFJfQ09OVihpbnQsIGksIGwsIHUsIHVsKQorI2Vsc2UKK0RFQ0xBUkVfU1RSX0NPTlYoaW50LCBpLCB1KQorI2VuZGlmCisKKy8qIFNwZWNpYWxpemVkICovCisKK3VpbnQzMl90IEJVR194YXRvdTMyX3VuaW1wbGVtZW50ZWQodm9pZCk7CitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCB4YXRvdTMyKGNvbnN0IGNoYXIgKm51bXN0cikKK3sKKwlpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuIHhhdG91KG51bXN0cik7CisJaWYgKFVMT05HX01BWCA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4geGF0b3VsKG51bXN0cik7CisJcmV0dXJuIEJVR194YXRvdTMyX3VuaW1wbGVtZW50ZWQoKTsKK30KKworLyogTm9uLWFib3J0aW5nIGtpbmQgb2YgY29udmVydG9yczogYmJfc3RydG9bdV1bbF1sICovCisKKy8qIE9uIGV4aXQ6IGVycm5vID0gMCBvbmx5IGlmIHRoZXJlIHdhcyBub24tZW1wdHksICdcMCcgdGVybWluYXRlZCB2YWx1ZQorICogZXJybm8gPSBFSU5WQUwgaWYgdmFsdWUgd2FzIG5vdCAnXDAnIHRlcm1pbmF0ZWQsIGJ1dCBvdGhlcndpc2Ugb2sKKyAqICAgIFJldHVybiB2YWx1ZSBpcyBzdGlsbCB2YWxpZCwgY2FsbGVyIHNob3VsZCBqdXN0IGNoZWNrIHdoZXRoZXIgZW5kWzBdCisgKiAgICBpcyBhIHZhbGlkIHRlcm1pbmF0aW5nIGNoYXIgZm9yIHBhcnRpY3VsYXIgY2FzZS4gT1RPSCwgaWYgY2FsbGVyCisgKiAgICByZXF1aXJlcyAnXDAnIHRlcm1pbmF0ZWQgaW5wdXQsIFtzXWhlIGNhbiBqdXN0IGNoZWNrIGVycm5vID09IDAuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBoYWQgYWxwaGFudW1lcmljIHRlcm1pbmF0aW5nIGNoYXIgKCIxMjM0YWJjZyIpLgorICogZXJybm8gPSBFUkFOR0UgaWYgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLCBtaXNzaW5nLCBldGMuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBoYWQgbWludXMgc2lnbiBmb3Igc3RydG91WFggKGV2ZW4gIi0wIiBpcyBub3Qgb2sgKQorICogICAgcmV0dXJuIHZhbHVlIGlzIGFsbC1vbmVzIGluIHRoaXMgY2FzZS4KKyAqLworCit1bnNpZ25lZCBsb25nIGxvbmcgYmJfc3RydG91bGwoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpIEZBU1RfRlVOQzsKK2xvbmcgbG9uZyBiYl9zdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKSBGQVNUX0ZVTkM7CisKKyNpZiBVTE9OR19NQVggPT0gVUxMT05HX01BWAorc3RhdGljIEFMV0FZU19JTkxJTkUKK3Vuc2lnbmVkIGxvbmcgYmJfc3RydG91bChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sgcmV0dXJuIGJiX3N0cnRvdWxsKGFyZywgZW5kcCwgYmFzZSk7IH0KK3N0YXRpYyBBTFdBWVNfSU5MSU5FCitsb25nIGJiX3N0cnRvbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sgcmV0dXJuIGJiX3N0cnRvbGwoYXJnLCBlbmRwLCBiYXNlKTsgfQorI2Vsc2UKK3Vuc2lnbmVkIGxvbmcgYmJfc3RydG91bChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworbG9uZyBiYl9zdHJ0b2woY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWYgVUlOVF9NQVggPT0gVUxMT05HX01BWAorc3RhdGljIEFMV0FZU19JTkxJTkUKK3Vuc2lnbmVkIGJiX3N0cnRvdShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sgcmV0dXJuIGJiX3N0cnRvdWxsKGFyZywgZW5kcCwgYmFzZSk7IH0KK3N0YXRpYyBBTFdBWVNfSU5MSU5FCitpbnQgYmJfc3RydG9pKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG9sbChhcmcsIGVuZHAsIGJhc2UpOyB9CisjZWxpZiBVSU5UX01BWCA9PSBVTE9OR19NQVgKK3N0YXRpYyBBTFdBWVNfSU5MSU5FCit1bnNpZ25lZCBiYl9zdHJ0b3UoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7IHJldHVybiBiYl9zdHJ0b3VsKGFyZywgZW5kcCwgYmFzZSk7IH0KK3N0YXRpYyBBTFdBWVNfSU5MSU5FCitpbnQgYmJfc3RydG9pKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG9sKGFyZywgZW5kcCwgYmFzZSk7IH0KKyNlbHNlCit1bnNpZ25lZCBiYl9zdHJ0b3UoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpIEZBU1RfRlVOQzsKK2ludCBiYl9zdHJ0b2koY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpIEZBU1RfRlVOQzsKKyNlbmRpZgorCit1aW50MzJfdCBCVUdfYmJfc3RydG91MzJfdW5pbXBsZW1lbnRlZCh2b2lkKTsKK3N0YXRpYyBBTFdBWVNfSU5MSU5FCit1aW50MzJfdCBiYl9zdHJ0b3UzMihjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwlpZiAoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YodW5zaWduZWQpKQorCQlyZXR1cm4gYmJfc3RydG91KGFyZywgZW5kcCwgYmFzZSk7CisJaWYgKHNpemVvZih1aW50MzJfdCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlyZXR1cm4gYmJfc3RydG91bChhcmcsIGVuZHAsIGJhc2UpOworCXJldHVybiBCVUdfYmJfc3RydG91MzJfdW5pbXBsZW1lbnRlZCgpOworfQorCisvKiBGbG9hdGluZyBwb2ludCAqLworCitkb3VibGUgYmJfc3RydG9kKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHApIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL2luY2x1ZGUveHJlZ2V4LmggYi9pbmNsdWRlL3hyZWdleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWU2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hyZWdleC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEJ1c3lib3ggeHJlZ2NvbXAgdXRpbGl0eSByb3V0aW5lLiAgVGhpcyBpc24ndCBpbiBsaWJiYi5oIGJlY2F1c2UgdGhlCisgKiBDIGxpYnJhcnkgd2UncmUgbGlua2luZyBhZ2FpbnN0IG1heSBub3Qgc3VwcG9ydCByZWdleC5oLgorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIHNhc2gsIENvcHlyaWdodCAoYykgMTk5OSBieSBEYXZpZCBJLiBCZWxsCisgKiBQZXJtaXNzaW9uIGhhcyBiZWVuIGdyYW50ZWQgdG8gcmVkaXN0cmlidXRlIHRoaXMgY29kZSB1bmRlciBHUEwuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBCQl9SRUdFWF9ICisjZGVmaW5lIEJCX1JFR0VYX0ggMQorCisjaW5jbHVkZSA8cmVnZXguaD4KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2NoYXIqIHJlZ2NvbXBfb3JfZXJybXNnKHJlZ2V4X3QgKnByZWcsIGNvbnN0IGNoYXIgKnJlZ2V4LCBpbnQgY2ZsYWdzKSBGQVNUX0ZVTkM7Cit2b2lkIHhyZWdjb21wKHJlZ2V4X3QgKnByZWcsIGNvbnN0IGNoYXIgKnJlZ2V4LCBpbnQgY2ZsYWdzKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5pdC9Db25maWcuaW4gYi9pbml0L0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI2ZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9Db25maWcuaW4KQEAgLTAsMCArMSwxODQgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJJbml0IFV0aWxpdGllcyIKKworY29uZmlnIEJPT1RDSEFSVEQKKwlib29sICJib290Y2hhcnRkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGJvb3RjaGFydGQgaXMgY29tbW9ubHkgdXNlZCB0byBwcm9maWxlIHRoZSBib290IHByb2Nlc3MKKwkgIGZvciB0aGUgcHVycG9zZSBvZiBzcGVlZGluZyBpdCB1cC4gSW4gdGhpcyBjYXNlLCBpdCBpcyBzdGFydGVkCisJICBieSB0aGUga2VybmVsIGFzIHRoZSBpbml0IHByb2Nlc3MuIFRoaXMgaXMgY29uZmlndXJlZCBieSBhZGRpbmcKKwkgIHRoZSBpbml0PS9zYmluL2Jvb3RjaGFydGQgb3B0aW9uIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCisJICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIHJlc291cmNlIHVzYWdlIG9mIGEgc3BlY2lmaWMKKwkgIGFwcGxpY2F0aW9uIG9yIHRoZSBydW5uaW5nIHN5c3RlbSBpbiBnZW5lcmFsLiBJbiB0aGlzIGNhc2UsCisJICBib290Y2hhcnRkIGlzIHN0YXJ0ZWQgaW50ZXJhY3RpdmVseSBieSBydW5uaW5nIGJvb3RjaGFydGQgc3RhcnQKKwkgIGFuZCBzdG9wcGVkIHVzaW5nIGJvb3RjaGFydGQgc3RvcC4KKworY29uZmlnIEZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUgorCWJvb2wgIkNvbXBhdGlibGUsIGJsb2F0ZWQgaGVhZGVyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQk9PVENIQVJURAorCWhlbHAKKwkgIENyZWF0ZSBleHRlbmRlZCBoZWFkZXIgZmlsZSBjb21wYXRpYmxlIHdpdGggImJpZyIgYm9vdGNoYXJ0ZC4KKwkgICJCaWciIGJvb3RjaGFydGQgaXMgYSBzaGVsbCBzY3JpcHQgYW5kIGl0IGR1bXBzIHNvbWUKKwkgICJjb252ZW5pZW50IiBpbmZvIGludCB0aGUgaGVhZGVyLCBzdWNoIGFzOgorCSAgICB0aXRsZSA9IEJvb3QgY2hhcnQgZm9yIGBob3N0bmFtZWAgKGBkYXRlYCkKKwkgICAgc3lzdGVtLnVuYW1lID0gYHVuYW1lIC1zcnZtYAorCSAgICBzeXN0ZW0ucmVsZWFzZSA9IGBjYXQgL2V0Yy9ESVNUUk8tcmVsZWFzZWAKKwkgICAgc3lzdGVtLmNwdSA9IGBncmVwICdebW9kZWwgbmFtZScgL3Byb2MvY3B1aW5mbyB8IGhlYWQgLTFgICgkY3B1Y291bnQpCisJICAgIHN5c3RlbS5rZXJuZWwub3B0aW9ucyA9IGBjYXQgL3Byb2MvY21kbGluZWAKKwkgIFRoaXMgZGF0YSBpcyBub3QgbWFuZGF0b3J5IGZvciBib290Y2hhcnQgZ3JhcGggZ2VuZXJhdGlvbiwKKwkgIGFuZCBpcyBjb25zaWRlcmVkIGJsb2F0LiBOZXZlcnRoZWxlc3MsIHRoaXMgb3B0aW9uCisJICBtYWtlcyBib290Y2hhcnRkIGFwcGxldCB0byBkdW1wIGEgc3Vic2V0IG9mIGl0LgorCitjb25maWcgRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFCisJYm9vbCAiU3VwcG9ydCBib290Y2hhcnRkLmNvbmYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCT09UQ0hBUlRECisJaGVscAorCSAgRW5hYmxlIHJlYWRpbmcgYW5kIHBhcnNpbmcgb2YgJFBXRC9ib290Y2hhcnRkLmNvbmYKKwkgIGFuZCAvZXRjL2Jvb3RjaGFydGQuY29uZiBmaWxlcy4KK2NvbmZpZyBIQUxUCisJYm9vbCAicG93ZXJvZmYsIGhhbHQsIGFuZCByZWJvb3QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3RvcCBhbGwgcHJvY2Vzc2VzIGFuZCBlaXRoZXIgaGFsdCwgcmVib290LCBvciBwb3dlciBvZmYgdGhlIHN5c3RlbS4KKworY29uZmlnIEZFQVRVUkVfQ0FMTF9URUxJTklUCisJYm9vbCAiQ2FsbCB0ZWxpbml0IG9uIHNodXRkb3duIGFuZCByZWJvb3QiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIQUxUICYmICFJTklUCisJaGVscAorCSAgQ2FsbCBhbiBleHRlcm5hbCBwcm9ncmFtIChub3JtYWxseSB0ZWxpbml0KSB0byBmYWNpbGl0YXRlCisJICBhIHN3aXRjaCB0byBhIHByb3BlciBydW5sZXZlbC4KKworCSAgVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdGVkIGhhbHQgYW5kIGZyaWVuZHMsCisJICBidXQgZGlkIG5vdCBzZWxlY3QgaW5pdC4KKworY29uZmlnIFRFTElOSVRfUEFUSAorCXN0cmluZyAiUGF0aCB0byB0ZWxpbml0IGV4ZWN1dGFibGUiCisJZGVmYXVsdCAiL3NiaW4vdGVsaW5pdCIKKwlkZXBlbmRzIG9uIEZFQVRVUkVfQ0FMTF9URUxJTklUCisJaGVscAorCSAgV2hlbiBidXN5Ym94IGhhbHQgYW5kIGZyaWVuZHMgaGF2ZSB0byBjYWxsIGV4dGVybmFsIHRlbGluaXQKKwkgIHRvIGZhY2lsaXRhdGUgcHJvcGVyIHNodXRkb3duLCB0aGlzIHBhdGggaXMgdG8gYmUgdXNlZCB3aGVuCisJICBsb2NhdGluZyB0ZWxpbml0IGV4ZWN1dGFibGUuCitjb25maWcgSU5JVAorCWJvb2wgImluaXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgaW5pdCBpcyB0aGUgZmlyc3QgcHJvZ3JhbSBydW4gd2hlbiB0aGUgc3lzdGVtIGJvb3RzLgorCitjb25maWcgRkVBVFVSRV9VU0VfSU5JVFRBQgorCWJvb2wgIlN1cHBvcnQgcmVhZGluZyBhbiBpbml0dGFiIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTklUCisJaGVscAorCSAgQWxsb3cgaW5pdCB0byByZWFkIGFuIGluaXR0YWIgZmlsZSB3aGVuIHRoZSBzeXN0ZW0gYm9vdC4KKworY29uZmlnIEZFQVRVUkVfS0lMTF9SRU1PVkVECisJYm9vbCAiU3VwcG9ydCBraWxsaW5nIHByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gaW5pdHRhYiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfVVNFX0lOSVRUQUIKKwloZWxwCisJICBXaGVuIHJlc3Bhd24gZW50cmllcyBhcmUgcmVtb3ZlZCBmcm9tIGluaXR0YWIgYW5kIGEgU0lHSFVQIGlzCisJICBzZW50IHRvIGluaXQsIHRoaXMgb3B0aW9uIHdpbGwgbWFrZSBpbml0IGtpbGwgdGhlIHByb2Nlc3NlcworCSAgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4KKworY29uZmlnIEZFQVRVUkVfS0lMTF9ERUxBWQorCWludCAiSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIFRFUk0gYW5kIEtJTEwgKDAgLSBzZW5kIFRFUk0gb25seSkiIGlmIEZFQVRVUkVfS0lMTF9SRU1PVkVECisJcmFuZ2UgMCAxMDI0CisJZGVmYXVsdCAwCisJZGVwZW5kcyBvbiBGRUFUVVJFX0tJTExfUkVNT1ZFRAorCWhlbHAKKwkgIFdpdGggbm9uemVybyBzZXR0aW5nLCBpbml0IHNlbmRzIFRFUk0sIGZvcmtzLCBjaGlsZCB3YWl0cyBOCisJICBzZWNvbmRzLCBzZW5kcyBLSUxMIGFuZCBleGl0cy4gU2V0dGluZyBpdCB0b28gaGlnaCBpcyB1bndpc2UKKwkgIChjaGlsZCB3aWxsIGhhbmcgYXJvdW5kIGZvciB0b28gbG9uZyBhbmQgY291bGQgYWN0dWFsbHkga2lsbAorCSAgdGhlIHdyb25nIHByb2Nlc3MhKQorCitjb25maWcgRkVBVFVSRV9JTklUX1NDVFRZCisJYm9vbCAiUnVuIGNvbW1hbmRzIHdpdGggbGVhZGluZyBkYXNoIHdpdGggY29udHJvbGxpbmcgdHR5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5JVAorCWhlbHAKKwkgIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGluaXQgd2lsbCB0cnkgdG8gZ2l2ZSBhIGNvbnRyb2xsaW5nCisJICB0dHkgdG8gYW55IGNvbW1hbmQgd2hpY2ggaGFzIGxlYWRpbmcgaHlwaGVuIChvZnRlbiBpdCdzICItL2Jpbi9zaCIpLgorCSAgTW9yZSBwcmVjaXNlbHksIGluaXQgd2lsbCBkbyAiaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksIDApIi4KKwkgIElmIGRldmljZSBhdHRhY2hlZCB0byBTVERJTl9GSUxFTk8gY2FuIGJlIGEgY3R0eSBidXQgaXMgbm90IHlldAorCSAgYSBjdHR5IGZvciBvdGhlciBzZXNzaW9uLCBpdCB3aWxsIGJlY29tZSB0aGlzIHByb2Nlc3MnIGN0dHkuCisJICBUaGlzIGlzIG5vdCB0aGUgdHJhZGl0aW9uYWwgaW5pdCBiZWhhdm91ciwgYnV0IGlzIG9mdGVuIHdoYXQgeW91IHdhbnQKKwkgIGluIGFuIGVtYmVkZGVkIHN5c3RlbSB3aGVyZSB0aGUgY29uc29sZSBpcyBvbmx5IGFjY2Vzc2VkIGR1cmluZworCSAgZGV2ZWxvcG1lbnQgb3IgZm9yIG1haW50ZW5hbmNlLgorCSAgTkI6IHVzaW5nIGN0dHloYWNrIGFwcGxldCBtYXkgd29yayBiZXR0ZXIuCisKK2NvbmZpZyBGRUFUVVJFX0lOSVRfU1lTTE9HCisJYm9vbCAiRW5hYmxlIGluaXQgdG8gd3JpdGUgdG8gc3lzbG9nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5JVAorCitjb25maWcgRkVBVFVSRV9FWFRSQV9RVUlFVAorCWJvb2wgIkJlIF9leHRyYV8gcXVpZXQgb24gYm9vdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElOSVQKKwloZWxwCisJICBQcmV2ZW50IGluaXQgZnJvbSBsb2dnaW5nIHNvbWUgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgZHVyaW5nIGJvb3QuCisKK2NvbmZpZyBGRUFUVVJFX0lOSVRfQ09SRURVTVBTCisJYm9vbCAiU3VwcG9ydCBkdW1waW5nIGNvcmUgZm9yIGNoaWxkIHByb2Nlc3NlcyAoZGVidWdnaW5nIG9ubHkpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5JVAorCWhlbHAKKwkgIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHRoZSBmaWxlIC8uaW5pdF9lbmFibGVfY29yZQorCSAgZXhpc3RzLCB0aGVuIGluaXQgd2lsbCBjYWxsIHNldHJsaW1pdCgpIHRvIGFsbG93IHVubGltaXRlZAorCSAgY29yZSBmaWxlIHNpemVzLiBJZiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZCwgcHJvY2Vzc2VzCisJICB3aWxsIG5vdCBnZW5lcmF0ZSBhbnkgY29yZSBmaWxlcy4KKworY29uZmlnIEZFQVRVUkVfSU5JVFJECisJYm9vbCAiU3VwcG9ydCBydW5uaW5nIGluaXQgZnJvbSB3aXRoaW4gYW4gaW5pdHJkIChub3QgaW5pdHJhbWZzKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElOSVQKKwloZWxwCisJICBMZWdhY3kgc3VwcG9ydCBmb3IgcnVubmluZyBpbml0IHVuZGVyIHRoZSBvbGQtc3R5bGUgaW5pdHJkLiBBbGxvd3MKKwkgIHRoZSBuYW1lIGxpbnV4cmMgdG8gYWN0IGFzIGluaXQsIGFuZCBpdCBkb2Vzbid0IGFzc3VtZSBpbml0IGlzIFBJRCAxLgorCisJICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGluaXRyYW1mcywgd2hpY2ggcnVucyAvaW5pdCBhcyBQSUQgMSBhbmQKKwkgIHJlcXVpcmVzIG5vIHNwZWNpYWwgc3VwcG9ydC4KKworY29uZmlnIElOSVRfVEVSTUlOQUxfVFlQRQorCXN0cmluZyAiSW5pdGlhbCB0ZXJtaW5hbCB0eXBlIgorCWRlZmF1bHQgImxpbnV4IgorCWRlcGVuZHMgb24gSU5JVAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGluaXRpYWwgdmFsdWUgc2V0IGJ5IGluaXQgZm9yIHRoZSBURVJNIGVudmlyb25tZW50CisJICB2YXJpYWJsZS4gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHByb2dyYW1zIHdoaWNoIG1ha2UgdXNlIG9mCisJICBleHRlbmRlZCB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMuCisKKwkgIE5vdGUgdGhhdCBvbiBMaW51eCwgaW5pdCBhdHRlbXB0cyB0byBkZXRlY3Qgc2VyaWFsIHRlcm1pbmFsIGFuZAorCSAgc2V0cyBURVJNIHRvICJ2dDEwMiIgaWYgb25lIGlzIGZvdW5kLgorY29uZmlnIE1FU0cKKwlib29sICJtZXNnIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1lc2cgY29udHJvbHMgYWNjZXNzIHRvIHlvdXIgdGVybWluYWwgYnkgb3RoZXJzLiBJdCBpcyB0eXBpY2FsbHkKKwkgIHVzZWQgdG8gYWxsb3cgb3IgZGlzYWxsb3cgb3RoZXIgdXNlcnMgdG8gd3JpdGUgdG8geW91ciB0ZXJtaW5hbAorCitjb25maWcgRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQCisJYm9vbCAiRW5hYmxlIHdyaXRpbmcgdG8gdHR5IG9ubHkgYnkgZ3JvdXAsIG5vdCBieSBldmVyeWJvZHkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNRVNHCisJaGVscAorCSAgVXN1YWxseSwgdHR5cyBhcmUgb3duZWQgYnkgZ3JvdXAgInR0eSIsIGFuZCAid3JpdGUiIHRvb2wgaXMKKwkgIHNldGdpZCB0byB0aGlzIGdyb3VwLiBUaGlzIHdheSwgIm1lc2cgeSIgb25seSBuZWVkcyB0byBlbmFibGUKKwkgICJ3cml0ZSBieSBvd25pbmcgZ3JvdXAiIGJpdCBpbiB0dHkgbW9kZS4KKworCSAgSWYgeW91IHNldCB0aGlzIG9wdGlvbiB0byBOLCAibWVzZyB5IiB3aWxsIGVuYWJsZSB3cml0aW5nCisJICBieSBhbnlib2R5IGF0IGFsbC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2luaXQvQ29uZmlnLnNyYyBiL2luaXQvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY3YzkzCi0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkluaXQgVXRpbGl0aWVzIgorCitJTlNFUlQKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvaW5pdC9LYnVpbGQuc3JjIGIvaW5pdC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGZiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKZGlmZiAtLWdpdCBhL2luaXQvYm9vdGNoYXJ0ZC5jIGIvaW5pdC9ib290Y2hhcnRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2MTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2luaXQvYm9vdGNoYXJ0ZC5jCkBAIC0wLDAgKzEsNDUxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0JPT1RDSEFSVEQoQVBQTEVUKGJvb3RjaGFydGQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQk9PVENIQVJURCkgKz0gYm9vdGNoYXJ0ZC5vCisKKy8vY29uZmlnOmNvbmZpZyBCT09UQ0hBUlRECisvL2NvbmZpZzoJYm9vbCAiYm9vdGNoYXJ0ZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBib290Y2hhcnRkIGlzIGNvbW1vbmx5IHVzZWQgdG8gcHJvZmlsZSB0aGUgYm9vdCBwcm9jZXNzCisvL2NvbmZpZzoJICBmb3IgdGhlIHB1cnBvc2Ugb2Ygc3BlZWRpbmcgaXQgdXAuIEluIHRoaXMgY2FzZSwgaXQgaXMgc3RhcnRlZAorLy9jb25maWc6CSAgYnkgdGhlIGtlcm5lbCBhcyB0aGUgaW5pdCBwcm9jZXNzLiBUaGlzIGlzIGNvbmZpZ3VyZWQgYnkgYWRkaW5nCisvL2NvbmZpZzoJICB0aGUgaW5pdD0vc2Jpbi9ib290Y2hhcnRkIG9wdGlvbiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBtb25pdG9yIHRoZSByZXNvdXJjZSB1c2FnZSBvZiBhIHNwZWNpZmljCisvL2NvbmZpZzoJICBhcHBsaWNhdGlvbiBvciB0aGUgcnVubmluZyBzeXN0ZW0gaW4gZ2VuZXJhbC4gSW4gdGhpcyBjYXNlLAorLy9jb25maWc6CSAgYm9vdGNoYXJ0ZCBpcyBzdGFydGVkIGludGVyYWN0aXZlbHkgYnkgcnVubmluZyBib290Y2hhcnRkIHN0YXJ0CisvL2NvbmZpZzoJICBhbmQgc3RvcHBlZCB1c2luZyBib290Y2hhcnRkIHN0b3AuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIKKy8vY29uZmlnOglib29sICJDb21wYXRpYmxlLCBibG9hdGVkIGhlYWRlciIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEJPT1RDSEFSVEQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDcmVhdGUgZXh0ZW5kZWQgaGVhZGVyIGZpbGUgY29tcGF0aWJsZSB3aXRoICJiaWciIGJvb3RjaGFydGQuCisvL2NvbmZpZzoJICAiQmlnIiBib290Y2hhcnRkIGlzIGEgc2hlbGwgc2NyaXB0IGFuZCBpdCBkdW1wcyBzb21lCisvL2NvbmZpZzoJICAiY29udmVuaWVudCIgaW5mbyBpbnQgdGhlIGhlYWRlciwgc3VjaCBhczoKKy8vY29uZmlnOgkgICAgdGl0bGUgPSBCb290IGNoYXJ0IGZvciBgaG9zdG5hbWVgIChgZGF0ZWApCisvL2NvbmZpZzoJICAgIHN5c3RlbS51bmFtZSA9IGB1bmFtZSAtc3J2bWAKKy8vY29uZmlnOgkgICAgc3lzdGVtLnJlbGVhc2UgPSBgY2F0IC9ldGMvRElTVFJPLXJlbGVhc2VgCisvL2NvbmZpZzoJICAgIHN5c3RlbS5jcHUgPSBgZ3JlcCAnXm1vZGVsIG5hbWUnIC9wcm9jL2NwdWluZm8gfCBoZWFkIC0xYCAoJGNwdWNvdW50KQorLy9jb25maWc6CSAgICBzeXN0ZW0ua2VybmVsLm9wdGlvbnMgPSBgY2F0IC9wcm9jL2NtZGxpbmVgCisvL2NvbmZpZzoJICBUaGlzIGRhdGEgaXMgbm90IG1hbmRhdG9yeSBmb3IgYm9vdGNoYXJ0IGdyYXBoIGdlbmVyYXRpb24sCisvL2NvbmZpZzoJICBhbmQgaXMgY29uc2lkZXJlZCBibG9hdC4gTmV2ZXJ0aGVsZXNzLCB0aGlzIG9wdGlvbgorLy9jb25maWc6CSAgbWFrZXMgYm9vdGNoYXJ0ZCBhcHBsZXQgdG8gZHVtcCBhIHN1YnNldCBvZiBpdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRQorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgYm9vdGNoYXJ0ZC5jb25mIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQk9PVENIQVJURAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSByZWFkaW5nIGFuZCBwYXJzaW5nIG9mICRQV0QvYm9vdGNoYXJ0ZC5jb25mCisvL2NvbmZpZzoJICBhbmQgL2V0Yy9ib290Y2hhcnRkLmNvbmYgZmlsZXMuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyMgaWZuZGVmIE1TX1NJTEVOVAorIyAgZGVmaW5lIE1TX1NJTEVOVCAgICAgICgxIDw8IDE1KQorIyBlbmRpZgorIyBpZm5kZWYgTU5UX0RFVEFDSAorIyAgZGVmaW5lIE1OVF9ERVRBQ0ggMHgwMDAwMDAwMgorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQkNfVkVSU0lPTl9TVFIgIjAuOCIKKworLyogRm9yIGRlYnVnZ2luZywgc2V0IHRvIDA6CisgKiBzdHJhY2Ugd29uJ3Qgd29yayB3aXRoIERPX1NJR05BTF9TWU5DIHNldCB0byAxLgorICovCisjZGVmaW5lIERPX1NJR05BTF9TWU5DIDEKKworCisvLyRQV0QvYm9vdGNoYXJ0ZC5jb25mIGFuZCAvZXRjL2Jvb3RjaGFydGQuY29uZjoKKy8vc3VwcG9ydGVkIG9wdGlvbnM6CisvLyMgU2FtcGxpbmcgcGVyaW9kIChpbiBzZWNvbmRzKQorLy9TQU1QTEVfUEVSSU9EPTAuMgorLy8KKy8vbm90IHlldCBzdXBwb3J0ZWQ6CisvLyMgdG1wZnMgc2l6ZQorLy8jICgzMiBNQiBzaG91bGQgc3VmZmljZSBmb3IgfjIwIG1pbnV0ZXMgd29ydGggb2YgbG9nIGRhdGEsIGJ1dCBZTU1WKQorLy9UTVBGU19TSVpFPTMybQorLy8KKy8vIyBXaGV0aGVyIHRvIGVuYWJsZSBhbmQgc3RvcmUgQlNEIHByb2Nlc3MgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gIFRoZQorLy8jIGtlcm5lbCBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGVuYWJsZSB2MyBhY2NvdW50aW5nCisvLyMgKENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzKS4gYWNjdG9uIGZyb20gdGhlIEdOVSBhY2NvdW50aW5nIHV0aWxpdGllcworLy8jIGlzIGFsc28gcmVxdWlyZWQuCisvL1BST0NFU1NfQUNDT1VOVElORz0ibm8iCisvLworLy8jIFRhcmJhbGwgZm9yIHRoZSB2YXJpb3VzIGJvb3QgbG9nIGZpbGVzCisvL0JPT1RMT0dfREVTVD0vdmFyL2xvZy9ib290Y2hhcnQudGd6CisvLworLy8jIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdG9wIGxvZ2dpbmcgYXMgdGhlIGJvb3QgcHJvY2VzcyBjb21wbGV0ZXMuCisvLyMgVGhlIGxvZ2dlciB3aWxsIGxvb2sgZm9yIGtub3duIHByb2Nlc3NlcyB0aGF0IGluZGljYXRlIGJvb3R1cCBjb21wbGV0aW9uCisvLyMgYXQgYSBzcGVjaWZpYyBydW5sZXZlbCAoZS5nLiBnZG0tYmluYXJ5LCBtaW5nZXR0eSwgZXRjLikuCisvL0FVVE9fU1RPUF9MT0dHRVI9InllcyIKKy8vCisvLyMgV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBib290IGNoYXJ0IG9uY2UgdGhlIGJvb3QgbG9nZ2VyCisvLyMgY29tcGxldGVzLiAgVGhlIGJvb3QgY2hhcnQgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gJEFVVE9fUkVOREVSX0RJUi4KKy8vIyBOb3RlIHRoYXQgdGhlIGJvb3RjaGFydCBwYWNrYWdlIG11c3QgYmUgaW5zdGFsbGVkLgorLy9BVVRPX1JFTkRFUj0ibm8iCisvLworLy8jIEltYWdlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBib290IGNoYXJ0CisvLyMgKGNob29zZSBiZXR3ZWVuIHBuZywgc3ZnIGFuZCBlcHMpLgorLy9BVVRPX1JFTkRFUl9GT1JNQVQ9InBuZyIKKy8vCisvLyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgYXV0by1nZW5lcmF0ZWQgYm9vdCBjaGFydHMKKy8vQVVUT19SRU5ERVJfRElSPSIvdmFyL2xvZyIKKworCisvKiBHbG9iYWxzICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciBqaWZmeV9saW5lW0NPTU1PTl9CVUZTSVpFXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZHVtcF9maWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJZnB1dHMoRy5qaWZmeV9saW5lLCBmcCk7CisJCWZmbHVzaChmcCk7CisJCWJiX2NvcHlmZF9lb2YoZmQsIGZpbGVubyhmcCkpOworCQljbG9zZShmZCk7CisJCWZwdXRjKCdcbicsIGZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9wcm9jcyhGSUxFICpmcCwgaW50IGxvb2tfZm9yX2xvZ2luX3Byb2Nlc3MpCit7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJRElSICpkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOworCWludCBmb3VuZF9sb2dpbl9wcm9jZXNzID0gMDsKKworCWZwdXRzKEcuamlmZnlfbGluZSwgZnApOworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciBuYW1lW3NpemVvZigiL3Byb2MvJXUvY21kbGluZSIpICsgc2l6ZW9mKGludCkqM107CisJCWludCBzdGF0X2ZkOworCQl1bnNpZ25lZCBwaWQgPSBiYl9zdHJ0b3UoZW50cnktPmRfbmFtZSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8pCisJCQljb250aW51ZTsKKworCQkvKiBBbmRyb2lkJ3MgdmVyc2lvbiByZWFkcyAvcHJvYy9QSUQvY21kbGluZSBhbmQgZXh0cmFjdHMKKwkJICogbm9uLXRydW5jYXRlZCBwcm9jZXNzIG5hbWUuIERvIHdlIHdhbnQgdG8gZG8gdGhhdD8gKi8KKworCQlzcHJpbnRmKG5hbWUsICIvcHJvYy8ldS9zdGF0IiwgcGlkKTsKKwkJc3RhdF9mZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOworCQlpZiAoc3RhdF9mZCA+PSAwKSB7CisJCQljaGFyICpwOworCQkJY2hhciBzdGF0X2xpbmVbNCoxMDI0XTsKKwkJCWludCByZCA9IHNhZmVfcmVhZChzdGF0X2ZkLCBzdGF0X2xpbmUsIHNpemVvZihzdGF0X2xpbmUpLTIpOworCisJCQljbG9zZShzdGF0X2ZkKTsKKwkJCWlmIChyZCA8IDApCisJCQkJY29udGludWU7CisJCQlzdGF0X2xpbmVbcmRdID0gJ1wwJzsKKwkJCXAgPSBzdHJjaHJudWwoc3RhdF9saW5lLCAnXG4nKTsKKwkJCSpwKysgPSAnXG4nOworCQkJKnAgPSAnXDAnOworCQkJZnB1dHMoc3RhdF9saW5lLCBmcCk7CisJCQlpZiAoIWxvb2tfZm9yX2xvZ2luX3Byb2Nlc3MpCisJCQkJY29udGludWU7CisJCQlwID0gc3RyY2hyKHN0YXRfbGluZSwgJygnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCXArKzsKKwkJCXN0cmNocm51bChwLCAnKScpWzBdID0gJ1wwJzsKKwkJCS8qIElzIGl0IGdkbSwga2RtIG9yIGEgZ2V0dHk/ICovCisJCQlpZiAoKChwWzBdID09ICdnJyB8fCBwWzBdID09ICdrJyB8fCBwWzBdID09ICd4JykgJiYgcFsxXSA9PSAnZCcgJiYgcFsyXSA9PSAnbScpCisJCQkgfHwgc3Ryc3RyKHAsICJnZXR0eSIpCisJCQkpIHsKKwkJCQlmb3VuZF9sb2dpbl9wcm9jZXNzID0gMTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZWRpcihkaXIpOworCWZwdXRjKCdcbicsIGZwKTsKKwlyZXR1cm4gZm91bmRfbG9naW5fcHJvY2VzczsKK30KKworc3RhdGljIGNoYXIgKm1ha2VfdGVtcGRpcih2b2lkKQoreworCWNoYXIgdGVtcGxhdGVbXSA9ICIvdG1wL2Jvb3RjaGFydC5YWFhYWFgiOworCWNoYXIgKnRlbXBkaXIgPSB4c3RyZHVwKG1rZHRlbXAodGVtcGxhdGUpKTsKKwlpZiAoIXRlbXBkaXIpIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJLyogL3RtcCBpcyBub3Qgd3JpdGFibGUgKGhhcHBlbnMgd2hlbiB3ZSBhcmUgdXNlZCBhcyBpbml0KS4KKwkJICogVHJ5IHRvIG1vdW50IGEgdG1wZnMsIHRoZW0gY2QgYW5kIGxhemlseSB1bm1vdW50IGl0LgorCQkgKiBTaW5jZSB3ZSB1bm1vdW50IGl0IGF0IG9uY2UsIHdlIGNhbiBtb3VudCBpdCBhbnl3aGVyZS4KKwkJICogVHJ5IGEgZmV3IGxvY2F0aW9ucyB3aGljaCBhcmUgbGlrZWx5IHRpIGV4aXN0LgorCQkgKi8KKwkJc3RhdGljIGNvbnN0IGNoYXIgZGlyc1tdID0gIi9tbnRcMCIiL3RtcFwwIiIvYm9vdFwwIiIvcHJvY1wwIjsKKwkJY29uc3QgY2hhciAqdHJ5X2RpciA9IGRpcnM7CisJCXdoaWxlIChtb3VudCgibm9uZSIsIHRyeV9kaXIsICJ0bXBmcyIsIE1TX1NJTEVOVCwgInNpemU9MTZtIikgIT0gMCkgeworCQkJdHJ5X2RpciArPSBzdHJsZW4odHJ5X2RpcikgKyAxOworCQkJaWYgKCF0cnlfZGlyWzBdKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJXNtb3VudCB0bXBmcyIsICIiKTsKKwkJfQorCQkvL2JiX2Vycm9yX21zZygibW91bnRlZCB0bXBmcyBvbiAlcyIsIHRyeV9kaXIpOworCQl4Y2hkaXIodHJ5X2Rpcik7CisJCWlmICh1bW91bnQyKHRyeV9kaXIsIE1OVF9ERVRBQ0gpICE9IDApIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJXNtb3VudCB0bXBmcyIsICJ1biIpOworCQl9CisjZWxzZQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5Iik7CisjZW5kaWYKKwl9IGVsc2UgeworCQl4Y2hkaXIodGVtcGRpcik7CisJfQorCXJldHVybiB0ZW1wZGlyOworfQorCitzdGF0aWMgdm9pZCBkb19sb2dnaW5nKHVuc2lnbmVkIHNhbXBsZV9wZXJpb2RfdXMpCit7CisJLy8jIEVuYWJsZSBwcm9jZXNzIGFjY291bnRpbmcgaWYgY29uZmlndXJlZAorCS8vaWYgWyAiJFBST0NFU1NfQUNDT1VOVElORyIgPSAieWVzIiBdOyB0aGVuCisJLy8JWyAtZSBrZXJuZWxfcGFjY3QgXSB8fCA6ID4ga2VybmVsX3BhY2N0CisJLy8JYWNjdG9uIGtlcm5lbF9wYWNjdAorCS8vZmkKKworCUZJTEUgKnByb2Nfc3RhdCA9IHhmb3BlbigicHJvY19zdGF0LmxvZyIsICJ3Iik7CisJRklMRSAqcHJvY19kaXNrc3RhdHMgPSB4Zm9wZW4oInByb2NfZGlza3N0YXRzLmxvZyIsICJ3Iik7CisJLy9GSUxFICpwcm9jX25ldGRldiA9IHhmb3BlbigicHJvY19uZXRkZXYubG9nIiwgInciKTsKKwlGSUxFICpwcm9jX3BzID0geGZvcGVuKCJwcm9jX3BzLmxvZyIsICJ3Iik7CisJaW50IGxvb2tfZm9yX2xvZ2luX3Byb2Nlc3MgPSAoZ2V0cHBpZCgpID09IDEpOworCXVuc2lnbmVkIGNvdW50ID0gNjAqMTAwMCoxMDAwIC8gc2FtcGxlX3BlcmlvZF91czsgLyogfjEgbWludXRlICovCisKKwl3aGlsZSAoLS1jb3VudCAmJiAhYmJfZ290X3NpZ25hbCkgeworCQljaGFyICpwOworCQlpbnQgbGVuID0gb3Blbl9yZWFkX2Nsb3NlKCIvcHJvYy91cHRpbWUiLCBHLmppZmZ5X2xpbmUsIHNpemVvZihHLmppZmZ5X2xpbmUpLTIpOworCQlpZiAobGVuIDwgMCkKKwkJCWdvdG8gd2FpdF9tb3JlOworCQkvKiAvcHJvYy91cHRpbWUgaGFzIGZvcm1hdCAiTk5OTk5OLk1NIE5OTk5OTk4uTU0iICovCisJCS8qIHdlIGNvbnZlcnQgaXQgdG8gIk5OTk5OTk1NXG4iICh1c2luZyBmaXJzdCB2YWx1ZSkgKi8KKwkJRy5qaWZmeV9saW5lW2xlbl0gPSAnXDAnOworCQlwID0gc3RyY2hyKEcuamlmZnlfbGluZSwgJy4nKTsKKwkJaWYgKCFwKQorCQkJZ290byB3YWl0X21vcmU7CisJCXdoaWxlIChpc2RpZ2l0KCorK3ApKQorCQkJcFstMV0gPSAqcDsKKwkJcFstMV0gPSAnXG4nOworCQlwWzBdID0gJ1wwJzsKKworCQlkdW1wX2ZpbGUocHJvY19zdGF0LCAiL3Byb2Mvc3RhdCIpOworCQlkdW1wX2ZpbGUocHJvY19kaXNrc3RhdHMsICIvcHJvYy9kaXNrc3RhdHMiKTsKKwkJLy9kdW1wX2ZpbGUocHJvY19uZXRkZXYsICIvcHJvYy9uZXQvZGV2Iik7CisJCWlmIChkdW1wX3Byb2NzKHByb2NfcHMsIGxvb2tfZm9yX2xvZ2luX3Byb2Nlc3MpKSB7CisJCQkvKiBkdW1wX3Byb2NzIHNhdyBhIGdldHR5IG9yIHtnLGsseH1kbQorCQkJICogc3RvcCBsb2dnaW5nIGluIDIgc2Vjb25kczoKKwkJCSAqLworCQkJaWYgKGNvdW50ID4gMioxMDAwKjEwMDAgLyBzYW1wbGVfcGVyaW9kX3VzKQorCQkJCWNvdW50ID0gMioxMDAwKjEwMDAgLyBzYW1wbGVfcGVyaW9kX3VzOworCQl9CisJCWZmbHVzaF9hbGwoKTsKKyB3YWl0X21vcmU6CisJCXVzbGVlcChzYW1wbGVfcGVyaW9kX3VzKTsKKwl9CisKKwkvLyBbIC1lIGtlcm5lbF9wYWNjdCBdICYmIGFjY3RvbiBvZmYKK30KKworc3RhdGljIHZvaWQgZmluYWxpemUoY2hhciAqdGVtcGRpciwgY29uc3QgY2hhciAqcHJvZykKK3sKKwkvLyMgU3RvcCBwcm9jZXNzIGFjY291bnRpbmcgaWYgY29uZmlndXJlZAorCS8vbG9jYWwgcGFjY3Q9CisJLy9bIC1lIGtlcm5lbF9wYWNjdCBdICYmIHBhY2N0PWtlcm5lbF9wYWNjdAorCisJRklMRSAqaGVhZGVyX2ZwID0geGZvcGVuKCJoZWFkZXIiLCAidyIpOworCisJaWYgKHByb2cpCisJCWZwcmludGYoaGVhZGVyX2ZwLCAicHJvZmlsZS5wcm9jZXNzID0gJXNcbiIsIHByb2cpOworCisJZnB1dHMoInZlcnNpb24gPSAiQkNfVkVSU0lPTl9TVFIiXG4iLCBoZWFkZXJfZnApOworCWlmIChFTkFCTEVfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSKSB7CisJCWNoYXIgKmhvc3RuYW1lOworCQljaGFyICprY21kbGluZTsKKwkJdGltZV90IHQ7CisJCXN0cnVjdCB0bSB0bV90aW1lOworCQkvKiB4MiBmb3IgcG9zc2libGUgbG9jYWxpemVkIHdlZWtkYXkvbW9udGggbmFtZXMgKi8KKwkJY2hhciBkYXRlX2J1ZltzaXplb2YoIk1vbiBKdW4gMjEgMDU6Mjk6MDMgQ0VTVCAyMDEwIikgKiAyXTsKKwkJc3RydWN0IHV0c25hbWUgdW5hbWVidWY7CisKKwkJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisJCXRpbWUoJnQpOworCQlsb2NhbHRpbWVfcigmdCwgJnRtX3RpbWUpOworCQlzdHJmdGltZShkYXRlX2J1Ziwgc2l6ZW9mKGRhdGVfYnVmKSwgIiVhICViICVlICVIOiVNOiVTICVaICVZIiwgJnRtX3RpbWUpOworCQlmcHJpbnRmKGhlYWRlcl9mcCwgInRpdGxlID0gQm9vdCBjaGFydCBmb3IgJXMgKCVzKVxuIiwgaG9zdG5hbWUsIGRhdGVfYnVmKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShob3N0bmFtZSk7CisKKwkJdW5hbWUoJnVuYW1lYnVmKTsgLyogbmV2ZXIgZmFpbHMgKi8KKwkJLyogc2FtZSBhcyB1bmFtZSAtc3J2bSAqLworCQlmcHJpbnRmKGhlYWRlcl9mcCwgInN5c3RlbS51bmFtZSA9ICVzICVzICVzICVzXG4iLAorCQkJCXVuYW1lYnVmLnN5c25hbWUsCisJCQkJdW5hbWVidWYucmVsZWFzZSwKKwkJCQl1bmFtZWJ1Zi52ZXJzaW9uLAorCQkJCXVuYW1lYnVmLm1hY2hpbmUKKwkJKTsKKworCQkvL3N5c3RlbS5yZWxlYXNlID0gYGNhdCAvZXRjL0RJU1RSTy1yZWxlYXNlYAorCQkvL3N5c3RlbS5jcHUgPSBgZ3JlcCAnXm1vZGVsIG5hbWUnIC9wcm9jL2NwdWluZm8gfCBoZWFkIC0xYCAoJGNwdWNvdW50KQorCisJCWtjbWRsaW5lID0geG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoIi9wcm9jL2NtZGxpbmUiLCBOVUxMKTsKKwkJLyoga2NtZGxpbmUgaW5jbHVkZXMgdHJhaWxpbmcgIlxuIiAqLworCQlmcHJpbnRmKGhlYWRlcl9mcCwgInN5c3RlbS5rZXJuZWwub3B0aW9ucyA9ICVzIiwga2NtZGxpbmUpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGtjbWRsaW5lKTsKKwl9CisJZmNsb3NlKGhlYWRlcl9mcCk7CisKKwkvKiBQYWNrYWdlIGxvZyBmaWxlcyAqLworCXN5c3RlbSgidGFyIC16Y2YgL3Zhci9sb2cvYm9vdGNoYXJ0LnRneiBoZWFkZXIgKi5sb2ciKTsgLy8gKyAkcGFjY3QKKwkvKiBDbGVhbiB1cCAoaWYgd2UgYXJlIG5vdCBpbiBkZXRhY2hlZCB0bXBmcykgKi8KKwlpZiAodGVtcGRpcikgeworCQl1bmxpbmsoImhlYWRlciIpOworCQl1bmxpbmsoInByb2Nfc3RhdC5sb2ciKTsKKwkJdW5saW5rKCJwcm9jX2Rpc2tzdGF0cy5sb2ciKTsKKwkJLy91bmxpbmsoInByb2NfbmV0ZGV2LmxvZyIpOworCQl1bmxpbmsoInByb2NfcHMubG9nIik7CisJCXJtZGlyKHRlbXBkaXIpOworCX0KKworCS8qIHNoZWxsLWJhc2VkIGJvb3RjaGFydGQgdHJpZXMgdG8gcnVuIC91c3IvYmluL2Jvb3RjaGFydCBpZiAkQVVUT19SRU5ERVI9eWVzOgorCSAqIC91c3IvYmluL2Jvb3RjaGFydCAtbyAiJEFVVE9fUkVOREVSX0RJUiIgLWYgJEFVVE9fUkVOREVSX0ZPUk1BVCAiJEJPT1RMT0dfREVTVCIKKwkgKi8KK30KKworLy91c2FnZTojZGVmaW5lIGJvb3RjaGFydGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInN0YXJ0IFtQUk9HIEFSR1NdfHN0b3B8aW5pdCIKKy8vdXNhZ2U6I2RlZmluZSBib290Y2hhcnRkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIC92YXIvbG9nL2Jvb3RjaGFydC50Z3ogd2l0aCBib290IGNoYXJ0IGRhdGFcbiIKKy8vdXNhZ2U6ICAgICAiXG5zdGFydDogc3RhcnQgYmFja2dyb3VuZCBsb2dnaW5nOyB3aXRoIFBST0csIHJ1biBQUk9HLCB0aGVuIGtpbGwgbG9nZ2luZyB3aXRoIFVTUjEiCisvL3VzYWdlOiAgICAgIlxuc3RvcDogc2VuZCBVU1IxIHRvIGFsbCBib290Y2hhcnRkIHByb2Nlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG5pbml0OiBzdGFydCBiYWNrZ3JvdW5kIGxvZ2dpbmc7IHN0b3Agd2hlbiBnZXR0eS94ZG0gaXMgc2VlbiAoZm9yIGluaXQgc2NyaXB0cykiCisvL3VzYWdlOiAgICAgIlxuVW5kZXIgUElEIDE6IGFzIGluaXQsIHRoZW4gZXhlYyAkYm9vdGNoYXJ0X2luaXQsIC9pbml0LCAvc2Jpbi9pbml0IgorCitpbnQgYm9vdGNoYXJ0ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYm9vdGNoYXJ0ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgc2FtcGxlX3BlcmlvZF91czsKKwlwaWRfdCBwYXJlbnRfcGlkLCBsb2dnZXJfcGlkOworCXNtYWxsaW50IGNtZDsKKwllbnVtIHsKKwkJQ01EX1NUT1AgPSAwLAorCQlDTURfU1RBUlQsCisJCUNNRF9JTklULAorCQlDTURfUElEMSwgLyogdXNlZCB0byBtYXJrIHBpZCAxIGNhc2UgKi8KKwl9OworCisJSU5JVF9HKCk7CisKKwlwYXJlbnRfcGlkID0gZ2V0cGlkKCk7CisJaWYgKGFyZ3ZbMV0pIHsKKwkJY21kID0gaW5kZXhfaW5fc3RyaW5ncygic3RvcFwwIiJzdGFydFwwIiJpbml0XDAiLCBhcmd2WzFdKTsKKwkJaWYgKGNtZCA8IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChjbWQgPT0gQ01EX1NUT1ApIHsKKwkJCXBpZF90ICpwaWRMaXN0ID0gZmluZF9waWRfYnlfbmFtZSgiYm9vdGNoYXJ0ZCIpOworCQkJd2hpbGUgKCpwaWRMaXN0ICE9IDApIHsKKwkJCQlpZiAoKnBpZExpc3QgIT0gcGFyZW50X3BpZCkKKwkJCQkJa2lsbCgqcGlkTGlzdCwgU0lHVVNSMSk7CisJCQkJcGlkTGlzdCsrOworCQkJfQorCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwYXJlbnRfcGlkICE9IDEpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWNtZCA9IENNRF9QSUQxOworCX0KKworCS8qIEhlcmUgd2UgYXJlIGluIFNUQVJULCBJTklUIG9yIENNRF9QSUQxIHN0YXRlICovCisKKwkvKiBSZWFkIGNvbmZpZyBmaWxlOiAqLworCXNhbXBsZV9wZXJpb2RfdXMgPSAyMDAgKiAxMDAwOworCWlmIChFTkFCTEVfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFKSB7CisJCWNoYXIqIHRva2VuWzJdOworCQlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL2Jvb3RjaGFydGQuY29uZiIgKyA1LCBmb3Blbl9mb3JfcmVhZCk7CisJCWlmICghcGFyc2VyKQorCQkJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL2Jvb3RjaGFydGQuY29uZiIsIGZvcGVuX2Zvcl9yZWFkKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDAsICIjPSIsIFBBUlNFX05PUk1BTCAmIH5QQVJTRV9DT0xMQVBTRSkpIHsKKwkJCWlmIChzdHJjbXAodG9rZW5bMF0sICJTQU1QTEVfUEVSSU9EIikgPT0gMCAmJiB0b2tlblsxXSkKKwkJCQlzYW1wbGVfcGVyaW9kX3VzID0gYXRvZih0b2tlblsxXSkgKiAxMDAwMDAwOworCQl9CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0KKwlpZiAoKGludClzYW1wbGVfcGVyaW9kX3VzIDw9IDApCisJCXNhbXBsZV9wZXJpb2RfdXMgPSAxOyAvKiBwcmV2ZW50IGRpdmlzaW9uIGJ5IDAgKi8KKworCS8qIENyZWF0ZSBsb2dnZXIgY2hpbGQ6ICovCisJbG9nZ2VyX3BpZCA9IGZvcmtfb3JfcmV4ZWMoYXJndik7CisKKwlpZiAobG9nZ2VyX3BpZCA9PSAwKSB7IC8qIGNoaWxkICovCisJCWNoYXIgKnRlbXBkaXI7CisKKwkJYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR1VTUjEpCisJCQkrICgxIDw8IFNJR1VTUjIpCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQkrICgxIDw8IFNJR1FVSVQpCisJCQkrICgxIDw8IFNJR0lOVCkKKwkJCSsgKDEgPDwgU0lHSFVQKQorCQkJLCByZWNvcmRfc2lnbm8pOworCisJCWlmIChET19TSUdOQUxfU1lOQykKKwkJCS8qIEluZm9ybSBwYXJlbnQgdGhhdCB3ZSBhcmUgcmVhZHkgKi8KKwkJCXJhaXNlKFNJR1NUT1ApOworCisJCS8qIElmIHdlIGFyZSBzdGFydGVkIGJ5IGtlcm5lbCwgUEFUSCBtaWdodCBiZSB1bnNldC4KKwkJICogSW4gb3JkZXIgdG8gZmluZCAidGFyIiwgbGV0J3Mgc2V0IHNvbWUgc2FuZSBQQVRIOgorCQkgKi8KKwkJaWYgKGNtZCA9PSBDTURfUElEMSAmJiAhZ2V0ZW52KCJQQVRIIikpCisJCQlwdXRlbnYoKGNoYXIqKWJiX1BBVEhfcm9vdF9wYXRoKTsKKworCQl0ZW1wZGlyID0gbWFrZV90ZW1wZGlyKCk7CisJCWRvX2xvZ2dpbmcoc2FtcGxlX3BlcmlvZF91cyk7CisJCWZpbmFsaXplKHRlbXBkaXIsIGNtZCA9PSBDTURfU1RBUlQgPyBhcmd2WzJdIDogTlVMTCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogcGFyZW50ICovCisKKwlpZiAoRE9fU0lHTkFMX1NZTkMpIHsKKwkJLyogV2FpdCBmb3IgbG9nZ2VyIGNoaWxkIHRvIHNldCBoYW5kbGVycywgdGhlbiB1bnBhdXNlIGl0LgorCQkgKiBPdGhlcndpc2Ugd2l0aCBzaG9ydC1saXZlZCBQUk9HIChlLmcuICJib290Y2hhcnRkIHN0YXJ0IHRydWUiKQorCQkgKiB3ZSBtaWdodCBzZW5kIFNJR1VTUjEgYmVmb3JlIGxvZ2dlciBzZXRzIGl0cyBoYW5kbGVyLgorCQkgKi8KKwkJd2FpdHBpZChsb2dnZXJfcGlkLCBOVUxMLCBXVU5UUkFDRUQpOworCQlraWxsKGxvZ2dlcl9waWQsIFNJR0NPTlQpOworCX0KKworCWlmIChjbWQgPT0gQ01EX1BJRDEpIHsKKwkJY2hhciAqYm9vdGNoYXJ0X2luaXQgPSBnZXRlbnYoImJvb3RjaGFydF9pbml0Iik7CisJCWlmIChib290Y2hhcnRfaW5pdCkKKwkJCWV4ZWNsKGJvb3RjaGFydF9pbml0LCBib290Y2hhcnRfaW5pdCwgTlVMTCk7CisJCWV4ZWNsKCIvaW5pdCIsICJpbml0IiwgTlVMTCk7CisJCWV4ZWNsKCIvc2Jpbi9pbml0IiwgImluaXQiLCBOVUxMKTsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCAiL3NiaW4vaW5pdCIpOworCX0KKworCWlmIChjbWQgPT0gQ01EX1NUQVJUICYmIGFyZ3ZbMl0pIHsgLyogInN0YXJ0IFBST0cgQVJHUyIgKi8KKwkJcGlkX3QgcGlkID0geHZmb3JrKCk7CisJCWlmIChwaWQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQkJYXJndiArPSAyOworCQkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwkJfQorCQkvKiBwYXJlbnQgKi8KKwkJd2FpdHBpZChwaWQsIE5VTEwsIDApOworCQlraWxsKGxvZ2dlcl9waWQsIFNJR1VTUjEpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9pbml0L2hhbHQuYyBiL2luaXQvaGFsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzRhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L2hhbHQuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUG93ZXJvZmYgcmVib290IGFuZCBoYWx0LCBvaCBteS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfSEFMVChBUFBMRVQoaGFsdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9IQUxUKEFQUExFVF9PREROQU1FKHBvd2Vyb2ZmLCBoYWx0LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBwb3dlcm9mZikpCisvL2FwcGxldDpJRl9IQUxUKEFQUExFVF9PREROQU1FKHJlYm9vdCwgaGFsdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgcmVib290KSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0hBTFQpICs9IGhhbHQubworCisvL2NvbmZpZzpjb25maWcgSEFMVAorLy9jb25maWc6CWJvb2wgInBvd2Vyb2ZmLCBoYWx0LCBhbmQgcmVib290IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN0b3AgYWxsIHByb2Nlc3NlcyBhbmQgZWl0aGVyIGhhbHQsIHJlYm9vdCwgb3IgcG93ZXIgb2ZmIHRoZSBzeXN0ZW0uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0NBTExfVEVMSU5JVAorLy9jb25maWc6CWJvb2wgIkNhbGwgdGVsaW5pdCBvbiBzaHV0ZG93biBhbmQgcmVib290IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSEFMVCAmJiAhSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIENhbGwgYW4gZXh0ZXJuYWwgcHJvZ3JhbSAobm9ybWFsbHkgdGVsaW5pdCkgdG8gZmFjaWxpdGF0ZQorLy9jb25maWc6CSAgYSBzd2l0Y2ggdG8gYSBwcm9wZXIgcnVubGV2ZWwuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3RlZCBoYWx0IGFuZCBmcmllbmRzLAorLy9jb25maWc6CSAgYnV0IGRpZCBub3Qgc2VsZWN0IGluaXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBURUxJTklUX1BBVEgKKy8vY29uZmlnOglzdHJpbmcgIlBhdGggdG8gdGVsaW5pdCBleGVjdXRhYmxlIgorLy9jb25maWc6CWRlZmF1bHQgIi9zYmluL3RlbGluaXQiCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0NBTExfVEVMSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdoZW4gYnVzeWJveCBoYWx0IGFuZCBmcmllbmRzIGhhdmUgdG8gY2FsbCBleHRlcm5hbCB0ZWxpbml0CisvL2NvbmZpZzoJICB0byBmYWNpbGl0YXRlIHByb3BlciBzaHV0ZG93biwgdGhpcyBwYXRoIGlzIHRvIGJlIHVzZWQgd2hlbgorLy9jb25maWc6CSAgbG9jYXRpbmcgdGVsaW5pdCBleGVjdXRhYmxlLgorCisvL3VzYWdlOiNkZWZpbmUgaGFsdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIERFTEFZXSBbLW5dIFstZl0iIElGX0ZFQVRVUkVfV1RNUCgiIFstd10iKQorLy91c2FnZTojZGVmaW5lIGhhbHRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJIYWx0IHRoZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDCURlbGF5IGludGVydmFsIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3Qgc3luYyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgKGRvbid0IGdvIHRocm91Z2ggaW5pdCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX1dUTVAoCisvL3VzYWdlOiAgICAgIlxuCS13CU9ubHkgd3JpdGUgYSB3dG1wIHJlY29yZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcG93ZXJvZmZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZCBERUxBWV0gWy1uXSBbLWZdIgorLy91c2FnZTojZGVmaW5lIHBvd2Vyb2ZmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSGFsdCBhbmQgc2h1dCBvZmYgcG93ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDCURlbGF5IGludGVydmFsIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3Qgc3luYyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgKGRvbid0IGdvIHRocm91Z2ggaW5pdCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJlYm9vdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIERFTEFZXSBbLW5dIFstZl0iCisvL3VzYWdlOiNkZWZpbmUgcmVib290X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVib290IHRoZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDCURlbGF5IGludGVydmFsIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3Qgc3luYyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgKGRvbid0IGdvIHRocm91Z2ggaW5pdCkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJlYm9vdC5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV1RNUAorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK3N0YXRpYyB2b2lkIHdyaXRlX3d0bXAodm9pZCkKK3sKKwlzdHJ1Y3QgdXRtcCB1dG1wOworCXN0cnVjdCB1dHNuYW1lIHV0czsKKwkvKiAibWFuIHV0bXAiIHNheXMgd3RtcCBmaWxlIHNob3VsZCAqbm90KiBiZSBjcmVhdGVkIGF1dG9tYWdpY2FsbHkgKi8KKwkvKmlmIChhY2Nlc3MoYmJfcGF0aF93dG1wX2ZpbGUsIFJfT0t8V19PSykgPT0gLTEpIHsKKwkJY2xvc2UoY3JlYXQoYmJfcGF0aF93dG1wX2ZpbGUsIDA2NjQpKTsKKwl9Ki8KKwltZW1zZXQoJnV0bXAsIDAsIHNpemVvZih1dG1wKSk7CisJdXRtcC51dF90di50dl9zZWMgPSB0aW1lKE5VTEwpOworCXN0cmNweSh1dG1wLnV0X3VzZXIsICJzaHV0ZG93biIpOyAvKiBpdCBpcyB3aWRlIGVub3VnaCAqLworCXV0bXAudXRfdHlwZSA9IFJVTl9MVkw7CisJdXRtcC51dF9pZFswXSA9ICd+JzsgdXRtcC51dF9pZFsxXSA9ICd+JzsgLyogPSBzdHJjcHkodXRtcC51dF9pZCwgIn5+Iik7ICovCisJdXRtcC51dF9saW5lWzBdID0gJ34nOyB1dG1wLnV0X2xpbmVbMV0gPSAnfic7IC8qID0gc3RyY3B5KHV0bXAudXRfbGluZSwgIn5+Iik7ICovCisJdW5hbWUoJnV0cyk7CisJc2FmZV9zdHJuY3B5KHV0bXAudXRfaG9zdCwgdXRzLnJlbGVhc2UsIHNpemVvZih1dG1wLnV0X2hvc3QpKTsKKwl1cGR3dG1wKGJiX3BhdGhfd3RtcF9maWxlLCAmdXRtcCk7Cit9CisjZWxzZQorI2RlZmluZSB3cml0ZV93dG1wKCkgKCh2b2lkKTApCisjZW5kaWYKKworCitpbnQgaGFsdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaGFsdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGludCBtYWdpY1tdID0geworCQlSQl9IQUxUX1NZU1RFTSwKKwkJUkJfUE9XRVJfT0ZGLAorCQlSQl9BVVRPQk9PVAorCX07CisJc3RhdGljIGNvbnN0IHNtYWxsaW50IHNpZ25hbHNbXSA9IHsgU0lHVVNSMSwgU0lHVVNSMiwgU0lHVEVSTSB9OworCisJaW50IGRlbGF5ID0gMDsKKwlpbnQgd2hpY2gsIGZsYWdzLCByYzsKKworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYXBwbGV0IHdlJ3JlIHJ1bm5pbmcgKi8KKwlmb3IgKHdoaWNoID0gMDsgImhwciJbd2hpY2hdICE9IGFwcGxldF9uYW1lWzBdOyB3aGljaCsrKQorCQljb250aW51ZTsKKworCS8qIFBhcnNlIGFuZCBoYW5kbGUgYXJndW1lbnRzICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZCsiOyAvKiAtZCBOICovCisJLyogV2Ugc3VwcG9ydCAtdyBldmVuIGlmICFFTkFCTEVfRkVBVFVSRV9XVE1QLAorCSAqIGluIG9yZGVyIHRvIG5vdCBicmVhayBzY3JpcHRzLgorCSAqIC1pIChzaHV0IGRvd24gbmV0d29yayBpbnRlcmZhY2VzKSBpcyBpZ25vcmVkLgorCSAqLworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImQ6bmZ3aSIsICZkZWxheSk7CisKKwlzbGVlcChkZWxheSk7CisKKwl3cml0ZV93dG1wKCk7CisKKwlpZiAoZmxhZ3MgJiA4KSAvKiAtdyAqLworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCisJaWYgKCEoZmxhZ3MgJiAyKSkgLyogbm8gLW4gKi8KKwkJc3luYygpOworCisJLyogUGVyZm9ybSBhY3Rpb24uICovCisJcmMgPSAxOworCWlmICghKGZsYWdzICYgNCkpIHsgLyogbm8gLWYgKi8KKy8vVE9ETzogSSB0ZW5kIHRvIHRoaW5rIHRoYXQgc2lnbmFsbGluZyBsaW51eHJjIGlzIHdyb25nCisvLyBwaXR5IG9yaWdpbmFsIGF1dGhvciBkaWRuJ3QgY29tbWVudCBvbiBpdC4uLgorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSU5JVFJEKSB7CisJCQkvKiB0YWxrIHRvIGxpbnV4cmMgKi8KKwkJCS8qIGJib3ggaW5pdC9saW51eHJjIGFzc3VtZWQgKi8KKwkJCXBpZF90ICpwaWRsaXN0ID0gZmluZF9waWRfYnlfbmFtZSgibGludXhyYyIpOworCQkJaWYgKHBpZGxpc3RbMF0gPiAwKQorCQkJCXJjID0ga2lsbChwaWRsaXN0WzBdLCBzaWduYWxzW3doaWNoXSk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShwaWRsaXN0KTsKKwkJfQorCQlpZiAocmMpIHsKKwkJCS8qIHRhbGsgdG8gaW5pdCAqLworCQkJaWYgKCFFTkFCTEVfRkVBVFVSRV9DQUxMX1RFTElOSVQpIHsKKwkJCQkvKiBiYm94IGluaXQgYXNzdW1lZCAqLworCQkJCXJjID0ga2lsbCgxLCBzaWduYWxzW3doaWNoXSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFN5c1Ygc3R5bGUgaW5pdCBhc3N1bWVkICovCisJCQkJLyogcnVubGV2ZWxzOgorCQkJCSAqIDAgPT0gc2h1dGRvd24KKwkJCQkgKiA2ID09IHJlYm9vdCAqLworCQkJCWV4ZWNscChDT05GSUdfVEVMSU5JVF9QQVRILAorCQkJCQkJQ09ORklHX1RFTElOSVRfUEFUSCwKKwkJCQkJCXdoaWNoID09IDIgPyAiNiIgOiAiMCIsCisJCQkJCQkoY2hhciAqKU5VTEwKKwkJCQkpOworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwKKwkJCQkJCUNPTkZJR19URUxJTklUX1BBVEgpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmMgPSByZWJvb3QobWFnaWNbd2hpY2hdKTsKKwl9CisKKwlpZiAocmMpCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaW5pdC9pbml0LmMgYi9pbml0L2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDVmNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9pbml0LmMKQEAgLTAsMCArMSwxMjkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGluaXQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQWRqdXN0ZWQgYnkgc28gbWFueSBmb2xrcywgaXQncyBpbXBvc3NpYmxlIHRvIGtlZXAgdHJhY2suCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9JTklUKEFQUExFVChpbml0LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfSU5JVFJEKEFQUExFVF9PREROQU1FKGxpbnV4cmMsIGluaXQsIEJCX0RJUl9ST09ULCBCQl9TVUlEX0RST1AsIGxpbnV4cmMpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfSU5JVCkgKz0gaW5pdC5vCisKKy8vY29uZmlnOmNvbmZpZyBJTklUCisvL2NvbmZpZzoJYm9vbCAiaW5pdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBpbml0IGlzIHRoZSBmaXJzdCBwcm9ncmFtIHJ1biB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1VTRV9JTklUVEFCCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCByZWFkaW5nIGFuIGluaXR0YWIgZmlsZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIElOSVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyBpbml0IHRvIHJlYWQgYW4gaW5pdHRhYiBmaWxlIHdoZW4gdGhlIHN5c3RlbSBib290LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9LSUxMX1JFTU9WRUQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGtpbGxpbmcgcHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSBpbml0dGFiIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9VU0VfSU5JVFRBQgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdoZW4gcmVzcGF3biBlbnRyaWVzIGFyZSByZW1vdmVkIGZyb20gaW5pdHRhYiBhbmQgYSBTSUdIVVAgaXMKKy8vY29uZmlnOgkgIHNlbnQgdG8gaW5pdCwgdGhpcyBvcHRpb24gd2lsbCBtYWtlIGluaXQga2lsbCB0aGUgcHJvY2Vzc2VzCisvL2NvbmZpZzoJICB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9LSUxMX0RFTEFZCisvL2NvbmZpZzoJaW50ICJIb3cgbG9uZyB0byB3YWl0IGJldHdlZW4gVEVSTSBhbmQgS0lMTCAoMCAtIHNlbmQgVEVSTSBvbmx5KSIgaWYgRkVBVFVSRV9LSUxMX1JFTU9WRUQKKy8vY29uZmlnOglyYW5nZSAwIDEwMjQKKy8vY29uZmlnOglkZWZhdWx0IDAKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfS0lMTF9SRU1PVkVECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgV2l0aCBub256ZXJvIHNldHRpbmcsIGluaXQgc2VuZHMgVEVSTSwgZm9ya3MsIGNoaWxkIHdhaXRzIE4KKy8vY29uZmlnOgkgIHNlY29uZHMsIHNlbmRzIEtJTEwgYW5kIGV4aXRzLiBTZXR0aW5nIGl0IHRvbyBoaWdoIGlzIHVud2lzZQorLy9jb25maWc6CSAgKGNoaWxkIHdpbGwgaGFuZyBhcm91bmQgZm9yIHRvbyBsb25nIGFuZCBjb3VsZCBhY3R1YWxseSBraWxsCisvL2NvbmZpZzoJICB0aGUgd3JvbmcgcHJvY2VzcyEpCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0lOSVRfU0NUVFkKKy8vY29uZmlnOglib29sICJSdW4gY29tbWFuZHMgd2l0aCBsZWFkaW5nIGRhc2ggd2l0aCBjb250cm9sbGluZyB0dHkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgaW5pdCB3aWxsIHRyeSB0byBnaXZlIGEgY29udHJvbGxpbmcKKy8vY29uZmlnOgkgIHR0eSB0byBhbnkgY29tbWFuZCB3aGljaCBoYXMgbGVhZGluZyBoeXBoZW4gKG9mdGVuIGl0J3MgIi0vYmluL3NoIikuCisvL2NvbmZpZzoJICBNb3JlIHByZWNpc2VseSwgaW5pdCB3aWxsIGRvICJpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NTQ1RUWSwgMCkiLgorLy9jb25maWc6CSAgSWYgZGV2aWNlIGF0dGFjaGVkIHRvIFNURElOX0ZJTEVOTyBjYW4gYmUgYSBjdHR5IGJ1dCBpcyBub3QgeWV0CisvL2NvbmZpZzoJICBhIGN0dHkgZm9yIG90aGVyIHNlc3Npb24sIGl0IHdpbGwgYmVjb21lIHRoaXMgcHJvY2VzcycgY3R0eS4KKy8vY29uZmlnOgkgIFRoaXMgaXMgbm90IHRoZSB0cmFkaXRpb25hbCBpbml0IGJlaGF2b3VyLCBidXQgaXMgb2Z0ZW4gd2hhdCB5b3Ugd2FudAorLy9jb25maWc6CSAgaW4gYW4gZW1iZWRkZWQgc3lzdGVtIHdoZXJlIHRoZSBjb25zb2xlIGlzIG9ubHkgYWNjZXNzZWQgZHVyaW5nCisvL2NvbmZpZzoJICBkZXZlbG9wbWVudCBvciBmb3IgbWFpbnRlbmFuY2UuCisvL2NvbmZpZzoJICBOQjogdXNpbmcgY3R0eWhhY2sgYXBwbGV0IG1heSB3b3JrIGJldHRlci4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfSU5JVF9TWVNMT0cKKy8vY29uZmlnOglib29sICJFbmFibGUgaW5pdCB0byB3cml0ZSB0byBzeXNsb2ciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0VYVFJBX1FVSUVUCisvL2NvbmZpZzoJYm9vbCAiQmUgX2V4dHJhXyBxdWlldCBvbiBib290IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFByZXZlbnQgaW5pdCBmcm9tIGxvZ2dpbmcgc29tZSBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBkdXJpbmcgYm9vdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfSU5JVF9DT1JFRFVNUFMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGR1bXBpbmcgY29yZSBmb3IgY2hpbGQgcHJvY2Vzc2VzIChkZWJ1Z2dpbmcgb25seSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgdGhlIGZpbGUgLy5pbml0X2VuYWJsZV9jb3JlCisvL2NvbmZpZzoJICBleGlzdHMsIHRoZW4gaW5pdCB3aWxsIGNhbGwgc2V0cmxpbWl0KCkgdG8gYWxsb3cgdW5saW1pdGVkCisvL2NvbmZpZzoJICBjb3JlIGZpbGUgc2l6ZXMuIElmIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLCBwcm9jZXNzZXMKKy8vY29uZmlnOgkgIHdpbGwgbm90IGdlbmVyYXRlIGFueSBjb3JlIGZpbGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9JTklUUkQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IHJ1bm5pbmcgaW5pdCBmcm9tIHdpdGhpbiBhbiBpbml0cmQgKG5vdCBpbml0cmFtZnMpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIExlZ2FjeSBzdXBwb3J0IGZvciBydW5uaW5nIGluaXQgdW5kZXIgdGhlIG9sZC1zdHlsZSBpbml0cmQuIEFsbG93cworLy9jb25maWc6CSAgdGhlIG5hbWUgbGludXhyYyB0byBhY3QgYXMgaW5pdCwgYW5kIGl0IGRvZXNuJ3QgYXNzdW1lIGluaXQgaXMgUElEIDEuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gaW5pdHJhbWZzLCB3aGljaCBydW5zIC9pbml0IGFzIFBJRCAxIGFuZAorLy9jb25maWc6CSAgcmVxdWlyZXMgbm8gc3BlY2lhbCBzdXBwb3J0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSU5JVF9URVJNSU5BTF9UWVBFCisvL2NvbmZpZzoJc3RyaW5nICJJbml0aWFsIHRlcm1pbmFsIHR5cGUiCisvL2NvbmZpZzoJZGVmYXVsdCAibGludXgiCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgYnkgaW5pdCBmb3IgdGhlIFRFUk0gZW52aXJvbm1lbnQKKy8vY29uZmlnOgkgIHZhcmlhYmxlLiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcHJvZ3JhbXMgd2hpY2ggbWFrZSB1c2Ugb2YKKy8vY29uZmlnOgkgIGV4dGVuZGVkIHRlcm1pbmFsIGNhcGFiaWxpdGllcy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgTm90ZSB0aGF0IG9uIExpbnV4LCBpbml0IGF0dGVtcHRzIHRvIGRldGVjdCBzZXJpYWwgdGVybWluYWwgYW5kCisvL2NvbmZpZzoJICBzZXRzIFRFUk0gdG8gInZ0MTAyIiBpZiBvbmUgaXMgZm91bmQuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaWZkZWYgX19saW51eF9fCisjIGluY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjZW5kaWYKKyNpbmNsdWRlICJyZWJvb3QuaCIgLyogcmVib290KCkgY29uc3RhbnRzICovCisKKy8qIFVzZWQgb25seSBmb3Igc2FuaXRpemluZyBwdXJwb3NlcyBpbiBzZXRfc2FuZV90ZXJtKCkgYmVsb3cuIE9uIHN5c3RlbXMgd2hlcmUKKyAqIHRoZSBiYXVkIHJhdGUgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgZmllbGQsIHdlIGNhbiBzYWZlbHkgZGlzYWJsZSB0aGVtLiAqLworI2lmbmRlZiBDQkFVRAorIyBkZWZpbmUgQ0JBVUQgMAorIyBkZWZpbmUgQ0JBVURFWCAwCisjZW5kaWYKKworLyogV2FzIGEgQ09ORklHX3h4eCBvcHRpb24uIEEgbG90IG9mIHBlb3BsZSB3ZXJlIGJ1aWxkaW5nCisgKiBub3QgZnVsbHkgZnVuY3Rpb25hbCBpbml0IGJ5IHN3aXRjaGluZyBpdCBvbiEgKi8KKyNkZWZpbmUgREVCVUdfSU5JVCAwCisKKyNkZWZpbmUgQ09NTUFORF9TSVpFICAgICAgMjU2CisjZGVmaW5lIENPTlNPTEVfTkFNRV9TSVpFIDMyCisKKy8qIERlZmF1bHQgc3lzaW5pdCBzY3JpcHQuICovCisjaWZuZGVmIElOSVRfU0NSSVBUCisjZGVmaW5lIElOSVRfU0NSSVBUICAiL2V0Yy9pbml0LmQvcmNTIgorI2VuZGlmCisKKy8qIEVhY2ggdHlwZSBvZiBhY3Rpb25zIGNhbiBhcHBlYXIgbWFueSB0aW1lcy4gVGhleSB3aWxsIGJlCisgKiBoYW5kbGVkIGluIG9yZGVyLiBSRVNUQVJUIGlzIGFuIGV4Y2VwdGlvbiwgb25seSAxc3QgaXMgdXNlZC4KKyAqLworLyogU3RhcnQgdGhlc2UgYWN0aW9ucyBmaXJzdCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiAqLworI2RlZmluZSBTWVNJTklUICAgICAweDAxCisvKiBTdGFydCB0aGVzZSBhZnRlciBTWVNJTklUIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uICovCisjZGVmaW5lIFdBSVQgICAgICAgIDB4MDIKKy8qIFN0YXJ0IHRoZXNlIGFmdGVyIFdBSVQgYW5kICpkb250KiB3YWl0IGZvciBjb21wbGV0aW9uICovCisjZGVmaW5lIE9OQ0UgICAgICAgIDB4MDQKKy8qCisgKiBOQjogd2hpbGUgU1lTSU5JVC9XQUlUL09OQ0UgYXJlIGJlaW5nIHByb2Nlc3NlZCwKKyAqIFNJR0hVUCAoInJlcmVhZCAvZXRjL2luaXR0YWIiKSB3aWxsIGJlIHByb2Nlc3NlZCBvbmx5IGFmdGVyCisgKiBlYWNoIGdyb3VwIG9mIGFjdGlvbnMuIElmIG5ldyBpbml0dGFiIGFkZHMsIHNheSwgYSBTWVNJTklUIGFjdGlvbiwKKyAqIGl0IHdpbGwgbm90IGJlIHJ1biwgc2luY2UgaW5pdCBpcyBhbHJlYWR5ICJwYXN0IFNZU0lOSVQgc3RhZ2UiLgorICovCisvKiBTdGFydCB0aGVzZSBhZnRlciBPTkNFIGFyZSBzdGFydGVkLCByZXN0YXJ0IG9uIGV4aXQgKi8KKyNkZWZpbmUgUkVTUEFXTiAgICAgMHgwOAorLyogTGlrZSBSRVNQQVdOLCBidXQgd2FpdCBmb3IgPEVudGVyPiB0byBiZSBwcmVzc2VkIG9uIHR0eSAqLworI2RlZmluZSBBU0tGSVJTVCAgICAweDEwCisvKgorICogU3RhcnQgdGhlc2Ugb24gU0lHSU5ULCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4KKyAqIFRoZW4gZ28gYmFjayB0byByZXNwYXduaW5nIFJFU1BBV04gYW5kIEFTS0ZJUlNUIGFjdGlvbnMuCisgKiBOQjoga2VybmVsIHNlbmRzIFNJR0lOVCB0byB1cyBpZiBDdHJsLUFsdC1EZWwgd2FzIHByZXNzZWQuCisgKi8KKyNkZWZpbmUgQ1RSTEFMVERFTCAgMHgyMAorLyoKKyAqIFN0YXJ0IHRoZXNlIGJlZm9yZSBraWxsaW5nIGFsbCBwcm9jZXNzZXMgaW4gcHJlcGFyYXRpb24gZm9yCisgKiBydW5uaW5nIFJFU1RBUlQgYWN0aW9ucyBvciBkb2luZyBsb3ctbGV2ZWwgaGFsdC9yZWJvb3QvcG93ZXJvZmYKKyAqIChpbml0aWF0ZWQgYnkgU0lHVVNSMS9TSUdURVJNL1NJR1VTUjIpLgorICogV2FpdCBmb3IgY29tcGxldGlvbiBiZWZvcmUgcHJvY2VlZGluZy4KKyAqLworI2RlZmluZSBTSFVURE9XTiAgICAweDQwCisvKgorICogZXhlYygpIG9uIFNJR1FVSVQuIFNIVVRET1dOIGFjdGlvbnMgYXJlIHN0YXJ0ZWQgYW5kIHdhaXRlZCBmb3IsCisgKiB0aGVuIGFsbCBwcm9jZXNzZXMgYXJlIGtpbGxlZCwgdGhlbiBpbml0IGV4ZWMncyAxc3QgUkVTVEFSVCBhY3Rpb24sCisgKiByZXBsYWNpbmcgaXRzZWxmIGJ5IGl0LiBJZiBubyBSRVNUQVJUIGFjdGlvbiBzcGVjaWZpZWQsCisgKiBTSUdRVUlUIGhhcyBubyBlZmZlY3QuCisgKi8KKyNkZWZpbmUgUkVTVEFSVCAgICAgMHg4MAorCisKKy8qIEEgbGlua2VkIGxpc3Qgb2YgaW5pdF9hY3Rpb25zLCB0byBiZSByZWFkIGZyb20gaW5pdHRhYiAqLworc3RydWN0IGluaXRfYWN0aW9uIHsKKwlzdHJ1Y3QgaW5pdF9hY3Rpb24gKm5leHQ7CisJcGlkX3QgcGlkOworCXVpbnQ4X3QgYWN0aW9uX3R5cGU7CisJY2hhciB0ZXJtaW5hbFtDT05TT0xFX05BTUVfU0laRV07CisJY2hhciBjb21tYW5kW0NPTU1BTkRfU0laRV07Cit9OworCitzdGF0aWMgc3RydWN0IGluaXRfYWN0aW9uICppbml0X2FjdGlvbl9saXN0ID0gTlVMTDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19jb25zb2xlID0gVkNfNTsKKworZW51bSB7CisJTF9MT0cgPSAweDEsCisJTF9DT05TT0xFID0gMHgyLAorfTsKKworLyogUHJpbnQgYSBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICogIndoZXJlIiBtYXkgYmUgYml0d2lzZS1vcidkIGZyb20gTF9MT0cgfCBMX0NPTlNPTEUKKyAqIE5COiBjYXJlZnVsLCB3ZSBjYW4gYmUgY2FsbGVkIGFmdGVyIHZmb3JrIQorICovCisjZGVmaW5lIGRiZ19tZXNzYWdlKC4uLikgZG8geyBpZiAoREVCVUdfSU5JVCkgbWVzc2FnZShfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCitzdGF0aWMgdm9pZCBtZXNzYWdlKGludCB3aGVyZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgdm9pZCBtZXNzYWdlKGludCB3aGVyZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmd1bWVudHM7CisJdW5zaWduZWQgbDsKKwljaGFyIG1zZ1sxMjhdOworCisJbXNnWzBdID0gJ1xyJzsKKwl2YV9zdGFydChhcmd1bWVudHMsIGZtdCk7CisJbCA9IDEgKyB2c25wcmludGYobXNnICsgMSwgc2l6ZW9mKG1zZykgLSAyLCBmbXQsIGFyZ3VtZW50cyk7CisJaWYgKGwgPiBzaXplb2YobXNnKSAtIDEpCisJCWwgPSBzaXplb2YobXNnKSAtIDE7CisJdmFfZW5kKGFyZ3VtZW50cyk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTklUX1NZU0xPRworCW1zZ1tsXSA9ICdcMCc7CisJaWYgKHdoZXJlICYgTF9MT0cpIHsKKwkJLyogTG9nIHRoZSBtZXNzYWdlIHRvIHN5c2xvZ2QgKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0RBRU1PTik7CisJCS8qIGRvbid0IHByaW50ICJcciIgKi8KKwkJc3lzbG9nKExPR19JTkZPLCAiJXMiLCBtc2cgKyAxKTsKKwkJY2xvc2Vsb2coKTsKKwl9CisJbXNnW2wrK10gPSAnXG4nOworCW1zZ1tsXSA9ICdcMCc7CisjZWxzZQorCXsKKwkJc3RhdGljIGludCBsb2dfZmQgPSAtMTsKKworCQltc2dbbCsrXSA9ICdcbic7CisJCW1zZ1tsXSA9ICdcMCc7CisJCS8qIFRha2UgZnVsbCBjb250cm9sIG9mIHRoZSBsb2cgdHR5LCBhbmQgbmV2ZXIgY2xvc2UgaXQuCisJCSAqIEl0J3MgbWluZSwgYWxsIG1pbmUhICBNdWhhaGFoYWhhISAqLworCQlpZiAobG9nX2ZkIDwgMCkgeworCQkJaWYgKCFsb2dfY29uc29sZSkgeworCQkJCWxvZ19mZCA9IFNUREVSUl9GSUxFTk87CisJCQl9IGVsc2UgeworCQkJCWxvZ19mZCA9IGRldmljZV9vcGVuKGxvZ19jb25zb2xlLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX05PQ1RUWSk7CisJCQkJaWYgKGxvZ19mZCA8IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBsb2cgdG8gJXMiLCBsb2dfY29uc29sZSk7CisJCQkJCXdoZXJlID0gTF9DT05TT0xFOworCQkJCX0gZWxzZSB7CisJCQkJCWNsb3NlX29uX2V4ZWNfb24obG9nX2ZkKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHdoZXJlICYgTF9MT0cpIHsKKwkJCWZ1bGxfd3JpdGUobG9nX2ZkLCBtc2csIGwpOworCQkJaWYgKGxvZ19mZCA9PSBTVERFUlJfRklMRU5PKQorCQkJCXJldHVybjsgLyogZG9uJ3QgcHJpbnQgZHVwIG1lc3NhZ2VzICovCisJCX0KKwl9CisjZW5kaWYKKworCWlmICh3aGVyZSAmIExfQ09OU09MRSkgeworCQkvKiBTZW5kIGNvbnNvbGUgbWVzc2FnZXMgdG8gY29uc29sZSBzbyBwZW9wbGUgd2lsbCBzZWUgdGhlbS4gKi8KKwkJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBtc2csIGwpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uc29sZV9pbml0KHZvaWQpCit7CisjaWZkZWYgVlRfT1BFTlFSWQorCWludCB2dG5vOworI2VuZGlmCisJY2hhciAqczsKKworCXMgPSBnZXRlbnYoIkNPTlNPTEUiKTsKKwlpZiAoIXMpCisJCXMgPSBnZXRlbnYoImNvbnNvbGUiKTsKKwlpZiAocykgeworCQlpbnQgZmQgPSBvcGVuKHMsIE9fUkRXUiB8IE9fTk9OQkxPQ0sgfCBPX05PQ1RUWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlkdXAyKGZkLCBTVERJTl9GSUxFTk8pOworCQkJZHVwMihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCQl4bW92ZV9mZChmZCwgU1RERVJSX0ZJTEVOTyk7CisJCX0KKwkJZGJnX21lc3NhZ2UoTF9MT0csICJjb25zb2xlPSclcyciLCBzKTsKKwl9IGVsc2UgeworCQkvKiBNYWtlIHN1cmUgZmQgMCwxLDIgYXJlIG5vdCBjbG9zZWQKKwkJICogKHNvIHRoYXQgdGhleSB3b24ndCBiZSB1c2VkIGJ5IGZ1dHVyZSBvcGVucykgKi8KKwkJYmJfc2FuaXRpemVfc3RkaW8oKTsKKy8vIFVzZXJzIHJlcG9ydCBwcm9ibGVtcworLy8JCS8qIE1ha2Ugc3VyZSBpbml0IGNhbid0IGJlIGJsb2NrZWQgYnkgd3JpdGluZyB0byBzdGRlcnIgKi8KKy8vCQlmY250bChTVERFUlJfRklMRU5PLCBGX1NFVEZMLCBmY250bChTVERFUlJfRklMRU5PLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworCX0KKworCXMgPSBnZXRlbnYoIlRFUk0iKTsKKyNpZmRlZiBWVF9PUEVOUVJZCisJaWYgKGlvY3RsKFNURElOX0ZJTEVOTywgVlRfT1BFTlFSWSwgJnZ0bm8pICE9IDApIHsKKwkJLyogTm90IGEgbGludXggdGVybWluYWwsIHByb2JhYmx5IHNlcmlhbCBjb25zb2xlLgorCQkgKiBGb3JjZSB0aGUgVEVSTSBzZXR0aW5nIHRvIHZ0MTAyCisJCSAqIGlmIFRFUk0gaXMgc2V0IHRvIGxpbnV4ICh0aGUgZGVmYXVsdCkgKi8KKwkJaWYgKCFzIHx8IHN0cmNtcChzLCAibGludXgiKSA9PSAwKQorCQkJcHV0ZW52KChjaGFyKikiVEVSTT12dDEwMiIpOworCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0lOSVRfU1lTTE9HKQorCQkJbG9nX2NvbnNvbGUgPSBOVUxMOworCX0gZWxzZQorI2VuZGlmCisJaWYgKCFzKQorCQlwdXRlbnYoKGNoYXIqKSJURVJNPSIgQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRSk7Cit9CisKKy8qIFNldCB0ZXJtaW5hbCBzZXR0aW5ncyB0byByZWFzb25hYmxlIGRlZmF1bHRzLgorICogTkI6IGNhcmVmdWwsIHdlIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdmZvcmshICovCitzdGF0aWMgdm9pZCBzZXRfc2FuZV90ZXJtKHZvaWQpCit7CisJc3RydWN0IHRlcm1pb3MgdHR5OworCisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJnR0eSk7CisKKwkvKiBzZXQgY29udHJvbCBjaGFycyAqLworCXR0eS5jX2NjW1ZJTlRSXSA9IDM7CS8qIEMtYyAqLworCXR0eS5jX2NjW1ZRVUlUXSA9IDI4OwkvKiBDLVwgKi8KKwl0dHkuY19jY1tWRVJBU0VdID0gMTI3OwkvKiBDLT8gKi8KKwl0dHkuY19jY1tWS0lMTF0gPSAyMTsJLyogQy11ICovCisJdHR5LmNfY2NbVkVPRl0gPSA0OwkvKiBDLWQgKi8KKwl0dHkuY19jY1tWU1RBUlRdID0gMTc7CS8qIEMtcSAqLworCXR0eS5jX2NjW1ZTVE9QXSA9IDE5OwkvKiBDLXMgKi8KKwl0dHkuY19jY1tWU1VTUF0gPSAyNjsJLyogQy16ICovCisKKyNpZmRlZiBfX2xpbnV4X18KKwkvKiB1c2UgbGluZSBkaXNjaXBsaW5lIDAgKi8KKwl0dHkuY19saW5lID0gMDsKKyNlbmRpZgorCisJLyogTWFrZSBpdCBiZSBzYW5lICovCisjaWZuZGVmIENSVFNDVFMKKyMgZGVmaW5lIENSVFNDVFMgMAorI2VuZGlmCisJLyogYWRkZWQgQ1JUU0NUUyB0byBmaXggRGViaWFuIGJ1ZyA1Mjg1NjAgKi8KKwl0dHkuY19jZmxhZyAmPSBDQkFVRCB8IENCQVVERVggfCBDU0laRSB8IENTVE9QQiB8IFBBUkVOQiB8IFBBUk9ERCB8IENSVFNDVFM7CisJdHR5LmNfY2ZsYWcgfD0gQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKworCS8qIGlucHV0IG1vZGVzICovCisJdHR5LmNfaWZsYWcgPSBJQ1JOTCB8IElYT04gfCBJWE9GRjsKKworCS8qIG91dHB1dCBtb2RlcyAqLworCXR0eS5jX29mbGFnID0gT1BPU1QgfCBPTkxDUjsKKworCS8qIGxvY2FsIG1vZGVzICovCisJdHR5LmNfbGZsYWcgPSBJU0lHIHwgSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgRUNIT0sgfCBFQ0hPQ1RMIHwgRUNIT0tFIHwgSUVYVEVOOworCisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnR0eSk7Cit9CisKKy8qIE9wZW4gdGhlIG5ldyB0ZXJtaW5hbCBkZXZpY2UuCisgKiBOQjogY2FyZWZ1bCwgd2UgY2FuIGJlIGNhbGxlZCBhZnRlciB2Zm9yayEgKi8KK3N0YXRpYyBpbnQgb3Blbl9zdGRpb190b190dHkoY29uc3QgY2hhciogdHR5X25hbWUpCit7CisJLyogZW1wdHkgdHR5X25hbWUgbWVhbnMgInVzZSBpbml0J3MgdHR5IiwgZWxzZS4uLiAqLworCWlmICh0dHlfbmFtZVswXSkgeworCQlpbnQgZmQ7CisKKwkJY2xvc2UoU1RESU5fRklMRU5PKTsKKwkJLyogZmQgY2FuIGJlIG9ubHkgPCAwIG9yIDA6ICovCisJCWZkID0gZGV2aWNlX29wZW4odHR5X25hbWUsIE9fUkRXUik7CisJCWlmIChmZCkgeworCQkJbWVzc2FnZShMX0xPRyB8IExfQ09OU09MRSwgImNhbid0IG9wZW4gJXM6ICVzIiwKKwkJCQl0dHlfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAwOyAvKiBmYWlsdXJlICovCisJCX0KKwkJZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCQlkdXAyKFNURElOX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7CisJfQorCXNldF9zYW5lX3Rlcm0oKTsKKwlyZXR1cm4gMTsgLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgdm9pZCByZXNldF9zaWdoYW5kbGVyc19hbmRfdW5ibG9ja19zaWdzKHZvaWQpCit7CisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHVVNSMSkKKwkJKyAoMSA8PCBTSUdVU1IyKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHUVVJVCkKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHSFVQKQorCQkrICgxIDw8IFNJR1RTVFApCisJCSsgKDEgPDwgU0lHU1RPUCkKKwkJLCBTSUdfREZMKTsKKwlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19VTkJMT0NLKTsKK30KKworLyogV3JhcHBlciBhcm91bmQgZXhlYzoKKyAqIFRha2VzIHN0cmluZyAobWF4IENPTU1BTkRfU0laRSBjaGFycykuCisgKiBJZiBjaGFycyBsaWtlICc+JyBkZXRlY3RlZCwgZXhlY3MgJ1stXS9iaW4vc2ggLWMgImV4ZWMgLi4uLi4uLiInLgorICogT3RoZXJ3aXNlIHNwbGl0cyB3b3JkcyBvbiB3aGl0ZXNwYWNlLCBkZWFscyB3aXRoIGxlYWRpbmcgZGFzaCwKKyAqIGFuZCB1c2VzIHBsYWluIGV4ZWMoKS4KKyAqIE5COiBjYXJlZnVsLCB3ZSBjYW4gYmUgY2FsbGVkIGFmdGVyIHZmb3JrIQorICovCitzdGF0aWMgdm9pZCBpbml0X2V4ZWMoY29uc3QgY2hhciAqY29tbWFuZCkKK3sKKwljaGFyICpjbWRbQ09NTUFORF9TSVpFIC8gMl07CisJY2hhciBidWZbQ09NTUFORF9TSVpFICsgNl07ICAvKiBDT01NQU5EX1NJWkUrc3RybGVuKCJleGVjICIpKzEgKi8KKwlpbnQgZGFzaCA9IChjb21tYW5kWzBdID09ICctJyAvKiBtYXliZT8gJiYgY29tbWFuZFsxXSA9PSAnLycgKi8pOworCisJY29tbWFuZCArPSBkYXNoOworCisJLyogU2VlIGlmIGFueSBzcGVjaWFsIC9iaW4vc2ggcmVxdWlyaW5nIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQgKi8KKwlpZiAoc3RycGJyayhjb21tYW5kLCAifmAhJF4mKigpPXxcXHt9W107XCInPD4/IikgIT0gTlVMTCkgeworCQlzcHJpbnRmKGJ1ZiwgImV4ZWMgJXMiLCBjb21tYW5kKTsgLyogZXhjbHVkaW5nICItIiAqLworCQkvKiBOQjogTElCQkJfREVGQVVMVF9MT0dJTl9TSEVMTCBkZWZpbmUgaGFzIGxlYWRpbmcgZGFzaCAqLworCQljbWRbMF0gPSAoY2hhciopKExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwgKyAhZGFzaCk7CisJCWNtZFsxXSA9IChjaGFyKikiLWMiOworCQljbWRbMl0gPSBidWY7CisJCWNtZFszXSA9IE5VTEw7CisJCWNvbW1hbmQgPSBMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMICsgMTsKKwl9IGVsc2UgeworCQkvKiBDb252ZXJ0IGNvbW1hbmQgKGNoYXIqKSBpbnRvIGNtZCAoY2hhcioqLCBvbmUgd29yZCBwZXIgc3RyaW5nKSAqLworCQljaGFyICp3b3JkLCAqbmV4dDsKKwkJaW50IGkgPSAwOworCQluZXh0ID0gc3RyY3B5KGJ1ZiwgY29tbWFuZCAtIGRhc2gpOyAvKiBjb21tYW5kIGluY2x1ZGluZyAiLSIgKi8KKwkJY29tbWFuZCA9IG5leHQgKyBkYXNoOworCQl3aGlsZSAoKHdvcmQgPSBzdHJzZXAoJm5leHQsICIgXHQiKSkgIT0gTlVMTCkgeworCQkJaWYgKCp3b3JkICE9ICdcMCcpIHsgLyogbm90IHR3byBzcGFjZXMvdGFicyB0b2dldGhlcj8gKi8KKwkJCQljbWRbaV0gPSB3b3JkOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCQljbWRbaV0gPSBOVUxMOworCX0KKwkvKiBJZiB3ZSBzYXcgbGVhZGluZyAiLSIsIGl0IGlzIGludGVyYWN0aXZlIHNoZWxsLgorCSAqIFRyeSBoYXJkZXIgdG8gZ2l2ZSBpdCBhIGNvbnRyb2xsaW5nIHR0eS4KKwkgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSU5JVF9TQ1RUWSAmJiBkYXNoKSB7CisJCS8qIF9BdHRlbXB0XyB0byBtYWtlIHN0ZGluIGEgY29udHJvbGxpbmcgdHR5LiAqLworCQlpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NTQ1RUWSwgMCAvKm9ubHkgdHJ5LCBkb24ndCBzdGVhbCovKTsKKwl9CisJLyogSGVyZSBjb21tYW5kIG5ldmVyIGNvbnRhaW5zIHRoZSBkYXNoLCBjbWRbMF0gbWlnaHQgKi8KKwlCQl9FWEVDVlAoY29tbWFuZCwgY21kKTsKKwltZXNzYWdlKExfTE9HIHwgTF9DT05TT0xFLCAiY2FuJ3QgcnVuICclcyc6ICVzIiwgY29tbWFuZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkvKiByZXR1cm5zIGlmIGV4ZWN2cCBmYWlscyAqLworfQorCisvKiBVc2VkIG9ubHkgYnkgcnVuX2FjdGlvbnMgKi8KK3N0YXRpYyBwaWRfdCBydW4oY29uc3Qgc3RydWN0IGluaXRfYWN0aW9uICphKQoreworCXBpZF90IHBpZDsKKworCS8qIENhcmVmdWw6IGRvbid0IGJlIGFmZmVjdGVkIGJ5IGEgc2lnbmFsIGluIHZmb3JrZWQgY2hpbGQgKi8KKwlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19CTE9DSyk7CisJaWYgKEJCX01NVSAmJiAoYS0+YWN0aW9uX3R5cGUgJiBBU0tGSVJTVCkpCisJCXBpZCA9IGZvcmsoKTsKKwllbHNlCisJCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCW1lc3NhZ2UoTF9MT0cgfCBMX0NPTlNPTEUsICJjYW4ndCBmb3JrIik7CisJaWYgKHBpZCkgeworCQlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19VTkJMT0NLKTsKKwkJcmV0dXJuIHBpZDsgLyogUGFyZW50IG9yIGVycm9yICovCisJfQorCisJLyogQ2hpbGQgKi8KKworCS8qIFJlc2V0IHNpZ25hbCBoYW5kbGVycyB0aGF0IHdlcmUgc2V0IGJ5IHRoZSBwYXJlbnQgcHJvY2VzcyAqLworCXJlc2V0X3NpZ2hhbmRsZXJzX2FuZF91bmJsb2NrX3NpZ3MoKTsKKworCS8qIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGFuZCBtYWtlIG91cnNlbGYgdGhlIHByb2Nlc3MgZ3JvdXAgbGVhZGVyICovCisJc2V0c2lkKCk7CisKKwkvKiBPcGVuIHRoZSBuZXcgdGVybWluYWwgZGV2aWNlICovCisJaWYgKCFvcGVuX3N0ZGlvX3RvX3R0eShhLT50ZXJtaW5hbCkpCisJCV9leGl0KEVYSVRfRkFJTFVSRSk7CisKKwkvKiBOQjogb24gTk9NTVUgd2UgY2FuJ3Qgd2FpdCBmb3IgaW5wdXQgaW4gY2hpbGQsIHNvCisJICogImFza2ZpcnN0IiB3aWxsIHdvcmsgdGhlIHNhbWUgYXMgInJlc3Bhd24iLiAqLworCWlmIChCQl9NTVUgJiYgKGEtPmFjdGlvbl90eXBlICYgQVNLRklSU1QpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIHByZXNzX2VudGVyW10gQUxJR04xID0KKyNpZmRlZiBDVVNUT01JWkVEX0JBTk5FUgorI2luY2x1ZGUgQ1VTVE9NSVpFRF9CQU5ORVIKKyNlbmRpZgorCQkJIlxuUGxlYXNlIHByZXNzIEVudGVyIHRvIGFjdGl2YXRlIHRoaXMgY29uc29sZS4gIjsKKwkJY2hhciBjOworCQkvKgorCQkgKiBTYXZlIG1lbW9yeSBieSBub3QgZXhlYy1pbmcgYW55dGhpbmcgbGFyZ2UgKGxpa2UgYSBzaGVsbCkKKwkJICogYmVmb3JlIHRoZSB1c2VyIHdhbnRzIGl0LiBUaGlzIGlzIGNyaXRpY2FsIGlmIHN3YXAgaXMgbm90CisJCSAqIGVuYWJsZWQgYW5kIHRoZSBzeXN0ZW0gaGFzIGxvdyBtZW1vcnkuIEdlbmVyYWxseSB0aGlzIHdpbGwKKwkJICogYmUgcnVuIG9uIHRoZSBzZWNvbmQgdmlydHVhbCBjb25zb2xlLCBhbmQgdGhlIGZpcnN0IHdpbGwKKwkJICogYmUgYWxsb3dlZCB0byBzdGFydCBhIHNoZWxsIG9yIHdoYXRldmVyIGFuIGluaXQgc2NyaXB0CisJCSAqIHNwZWNpZmllcy4KKwkJICovCisJCWRiZ19tZXNzYWdlKExfTE9HLCAid2FpdGluZyBmb3IgZW50ZXIgdG8gc3RhcnQgJyVzJyIKKwkJCQkJIihwaWQgJWQsIHR0eSAnJXMnKVxuIiwKKwkJCQlhLT5jb21tYW5kLCBnZXRwaWQoKSwgYS0+dGVybWluYWwpOworCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIHByZXNzX2VudGVyLCBzaXplb2YocHJlc3NfZW50ZXIpIC0gMSk7CisJCXdoaWxlIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCAmYywgMSkgPT0gMSAmJiBjICE9ICdcbicpCisJCQljb250aW51ZTsKKwl9CisKKwkvKgorCSAqIFdoZW4gYSBmaWxlIG5hbWVkIC8uaW5pdF9lbmFibGVfY29yZSBleGlzdHMsIHNldHJsaW1pdCBpcyBjYWxsZWQKKwkgKiBiZWZvcmUgcHJvY2Vzc2VzIGFyZSBzcGF3bmVkIHRvIHNldCBjb3JlIGZpbGUgc2l6ZSBhcyB1bmxpbWl0ZWQuCisJICogVGhpcyBpcyBmb3IgZGVidWdnaW5nIG9ubHkuICBEb24ndCB1c2UgdGhpcyBpcyBwcm9kdWN0aW9uLCB1bmxlc3MKKwkgKiB5b3Ugd2FudCBjb3JlIGR1bXBzIGx5aW5nIGFib3V0Li4uLgorCSAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9JTklUX0NPUkVEVU1QUykgeworCQlpZiAoYWNjZXNzKCIvLmluaXRfZW5hYmxlX2NvcmUiLCBGX09LKSA9PSAwKSB7CisJCQlzdHJ1Y3QgcmxpbWl0IGxpbWl0OworCQkJbGltaXQucmxpbV9jdXIgPSBSTElNX0lORklOSVRZOworCQkJbGltaXQucmxpbV9tYXggPSBSTElNX0lORklOSVRZOworCQkJc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmbGltaXQpOworCQl9CisJfQorCisJLyogTG9nIHRoZSBwcm9jZXNzIG5hbWUgYW5kIGFyZ3MgKi8KKwltZXNzYWdlKExfTE9HLCAic3RhcnRpbmcgcGlkICVkLCB0dHkgJyVzJzogJyVzJyIsCisJCQkgIGdldHBpZCgpLCBhLT50ZXJtaW5hbCwgYS0+Y29tbWFuZCk7CisKKwkvKiBOb3cgcnVuIGl0LiAgVGhlIG5ldyBwcm9ncmFtIHdpbGwgdGFrZSBvdmVyIHRoaXMgUElELAorCSAqIHNvIG5vdGhpbmcgZnVydGhlciBpbiBpbml0LmMgc2hvdWxkIGJlIHJ1bi4gKi8KKwlpbml0X2V4ZWMoYS0+Y29tbWFuZCk7CisJLyogV2UncmUgc3RpbGwgaGVyZT8gIFNvbWUgZXJyb3IgaGFwcGVuZWQuICovCisJX2V4aXQoLTEpOworfQorCitzdGF0aWMgc3RydWN0IGluaXRfYWN0aW9uICptYXJrX3Rlcm1pbmF0ZWQocGlkX3QgcGlkKQoreworCXN0cnVjdCBpbml0X2FjdGlvbiAqYTsKKworCWlmIChwaWQgPiAwKSB7CisJCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KSB7CisJCQlpZiAoYS0+cGlkID09IHBpZCkgeworCQkJCWEtPnBpZCA9IDA7CisJCQkJcmV0dXJuIGE7CisJCQl9CisJCX0KKwkJdXBkYXRlX3V0bXAocGlkLCBERUFEX1BST0NFU1MsIC8qdHR5X25hbWU6Ki8gTlVMTCwKKwkJCQkvKnVzZXJuYW1lOiovIE5VTEwsCisJCQkJLypob3N0bmFtZToqLyBOVUxMKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRmb3IocGlkX3QgcGlkKQoreworCS8qIHdhaXRmb3IocnVuKHgpKTogcHJvdGVjdCBhZ2FpbnN0IGZhaWxlZCBmb3JrIGluc2lkZSBydW4oKSAqLworCWlmIChwaWQgPD0gMCkKKwkJcmV0dXJuOworCisJLyogV2FpdCBmb3IgYW55IGNoaWxkIChwcmV2ZW50IHpvbWJpZXMgZnJvbSBleGl0aW5nIG9ycGhhbmVkIHByb2Nlc3NlcykKKwkgKiBidXQgZXhpdCB0aGUgbG9vcCBvbmx5IHdoZW4gc3BlY2lmaWVkIG9uZSBoYXMgZXhpdGVkLiAqLworCXdoaWxlICgxKSB7CisJCXBpZF90IHdwaWQgPSB3YWl0KE5VTEwpOworCQltYXJrX3Rlcm1pbmF0ZWQod3BpZCk7CisJCS8qIFVuc2FmZS4gU0lHVFNUUCBoYW5kbGVyIG1pZ2h0IGhhdmUgd2FpdCdlZCBpdCBhbHJlYWR5ICovCisJCS8qaWYgKHdwaWQgPT0gcGlkKSBicmVhazsqLworCQkvKiBNb3JlIHJlbGlhYmxlOiAqLworCQlpZiAoa2lsbChwaWQsIDApKQorCQkJYnJlYWs7CisJfQorfQorCisvKiBSdW4gYWxsIGNvbW1hbmRzIG9mIGEgcGFydGljdWxhciB0eXBlICovCitzdGF0aWMgdm9pZCBydW5fYWN0aW9ucyhpbnQgYWN0aW9uX3R5cGUpCit7CisJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpIHsKKwkJaWYgKCEoYS0+YWN0aW9uX3R5cGUgJiBhY3Rpb25fdHlwZSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYS0+YWN0aW9uX3R5cGUgJiAoU1lTSU5JVCB8IFdBSVQgfCBPTkNFIHwgQ1RSTEFMVERFTCB8IFNIVVRET1dOKSkgeworCQkJcGlkX3QgcGlkID0gcnVuKGEpOworCQkJaWYgKGEtPmFjdGlvbl90eXBlICYgKFNZU0lOSVQgfCBXQUlUIHwgQ1RSTEFMVERFTCB8IFNIVVRET1dOKSkKKwkJCQl3YWl0Zm9yKHBpZCk7CisJCX0KKwkJaWYgKGEtPmFjdGlvbl90eXBlICYgKFJFU1BBV04gfCBBU0tGSVJTVCkpIHsKKwkJCS8qIE9ubHkgcnVuIHN0dWZmIHdpdGggcGlkID09IDAuIElmIHBpZCAhPSAwLAorCQkJICogaXQgaXMgYWxyZWFkeSBydW5uaW5nCisJCQkgKi8KKwkJCWlmIChhLT5waWQgPT0gMCkKKwkJCQlhLT5waWQgPSBydW4oYSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ld19pbml0X2FjdGlvbih1aW50OF90IGFjdGlvbl90eXBlLCBjb25zdCBjaGFyICpjb21tYW5kLCBjb25zdCBjaGFyICpjb25zKQoreworCXN0cnVjdCBpbml0X2FjdGlvbiAqYSwgKipuZXh0cDsKKworCS8qIFNjZW5hcmlvOgorCSAqIG9sZCBpbml0dGFiOgorCSAqIDo6c2h1dGRvd246dW1vdW50IC1hIC1yCisJICogOjpzaHV0ZG93bjpzd2Fwb2ZmIC1hCisJICogbmV3IGluaXR0YWI6CisJICogOjpzaHV0ZG93bjpzd2Fwb2ZmIC1hCisJICogOjpzaHV0ZG93bjp1bW91bnQgLWEgLXIKKwkgKiBPbiByZWxvYWQsIHdlIG11c3QgZW5zdXJlIGVudHJpZXMgZW5kIHVwIGluIGNvcnJlY3Qgb3JkZXIuCisJICogVG8gYWNoaWV2ZSB0aGF0LCBpZiB3ZSBmaW5kIGEgbWF0Y2hpbmcgZW50cnksIHdlIG1vdmUgaXQKKwkgKiB0byB0aGUgZW5kLgorCSAqLworCW5leHRwID0gJmluaXRfYWN0aW9uX2xpc3Q7CisJd2hpbGUgKChhID0gKm5leHRwKSAhPSBOVUxMKSB7CisJCS8qIERvbid0IGVudGVyIGFjdGlvbiBpZiBpdCdzIGFscmVhZHkgaW4gdGhlIGxpc3QsCisJCSAqIFRoaXMgcHJldmVudHMgbG9zaW5nIHJ1bm5pbmcgUkVTUEFXTnMuCisJCSAqLworCQlpZiAoc3RyY21wKGEtPmNvbW1hbmQsIGNvbW1hbmQpID09IDAKKwkJICYmIHN0cmNtcChhLT50ZXJtaW5hbCwgY29ucykgPT0gMAorCQkpIHsKKwkJCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KKwkJCSpuZXh0cCA9IGEtPm5leHQ7CisJCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwkJCXdoaWxlICgqbmV4dHAgIT0gTlVMTCkKKwkJCQluZXh0cCA9ICYoKm5leHRwKS0+bmV4dDsKKwkJCWEtPm5leHQgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dHAgPSAmYS0+bmV4dDsKKwl9CisKKwlpZiAoIWEpCisJCWEgPSB4emFsbG9jKHNpemVvZigqYSkpOworCS8qIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJKm5leHRwID0gYTsKKwlhLT5hY3Rpb25fdHlwZSA9IGFjdGlvbl90eXBlOworCXNhZmVfc3RybmNweShhLT5jb21tYW5kLCBjb21tYW5kLCBzaXplb2YoYS0+Y29tbWFuZCkpOworCXNhZmVfc3RybmNweShhLT50ZXJtaW5hbCwgY29ucywgc2l6ZW9mKGEtPnRlcm1pbmFsKSk7CisJZGJnX21lc3NhZ2UoTF9MT0cgfCBMX0NPTlNPTEUsICJjb21tYW5kPSclcycgYWN0aW9uPSVkIHR0eT0nJXMnXG4iLAorCQlhLT5jb21tYW5kLCBhLT5hY3Rpb25fdHlwZSwgYS0+dGVybWluYWwpOworfQorCisvKiBOT1RFIHRoYXQgaWYgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIgaXMgTk9UIGRlZmluZWQsCisgKiB0aGVuIHBhcnNlX2luaXR0YWIoKSBzaW1wbHkgYWRkcyBpbiBzb21lIGRlZmF1bHQKKyAqIGFjdGlvbnMoaS5lLiwgcnVucyBJTklUX1NDUklQVCBhbmQgdGhlbiBzdGFydHMgYSBwYWlyCisgKiBvZiAiYXNrZmlyc3QiIHNoZWxscykuICBJZiBDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQgorICogX2lzXyBkZWZpbmVkLCBidXQgL2V0Yy9pbml0dGFiIGlzIG1pc3NpbmcsIHRoaXMKKyAqIHJlc3VsdHMgaW4gdGhlIHNhbWUgc2V0IG9mIGRlZmF1bHQgYmVoYXZpb3JzLgorICovCitzdGF0aWMgdm9pZCBwYXJzZV9pbml0dGFiKHZvaWQpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX0lOSVRUQUIKKwljaGFyICp0b2tlbls0XTsKKwlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL2luaXR0YWIiLCBmb3Blbl9mb3JfcmVhZCk7CisKKwlpZiAocGFyc2VyID09IE5VTEwpCisjZW5kaWYKKwl7CisJCS8qIE5vIGluaXR0YWIgZmlsZSAtIHNldCB1cCBzb21lIGRlZmF1bHQgYmVoYXZpb3IgKi8KKwkJLyogUmVib290IG9uIEN0cmwtQWx0LURlbCAqLworCQluZXdfaW5pdF9hY3Rpb24oQ1RSTEFMVERFTCwgInJlYm9vdCIsICIiKTsKKwkJLyogVW1vdW50IGFsbCBmaWxlc3lzdGVtcyBvbiBoYWx0L3JlYm9vdCAqLworCQluZXdfaW5pdF9hY3Rpb24oU0hVVERPV04sICJ1bW91bnQgLWEgLXIiLCAiIik7CisJCS8qIFN3YXBvZmYgb24gaGFsdC9yZWJvb3QgKi8KKwkJaWYgKEVOQUJMRV9TV0FQT05PRkYpCisJCQluZXdfaW5pdF9hY3Rpb24oU0hVVERPV04sICJzd2Fwb2ZmIC1hIiwgIiIpOworCQkvKiBQcmVwYXJlIHRvIHJlc3RhcnQgaW5pdCB3aGVuIGEgUVVJVCBpcyByZWNlaXZlZCAqLworCQluZXdfaW5pdF9hY3Rpb24oUkVTVEFSVCwgImluaXQiLCAiIik7CisJCS8qIEFza2ZpcnN0IHNoZWxsIG9uIHR0eTEtNCAqLworCQluZXdfaW5pdF9hY3Rpb24oQVNLRklSU1QsIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwsICIiKTsKKy8vVE9ETzogVkNfMSBpbnN0ZWFkIG9mICIiPyAiIiBpcyBjb25zb2xlIC0+IGN0dHkgcHJvYmxlbXMgLT4gYW5ncnkgdXNlcnMKKwkJbmV3X2luaXRfYWN0aW9uKEFTS0ZJUlNULCBiYl9kZWZhdWx0X2xvZ2luX3NoZWxsLCBWQ18yKTsKKwkJbmV3X2luaXRfYWN0aW9uKEFTS0ZJUlNULCBiYl9kZWZhdWx0X2xvZ2luX3NoZWxsLCBWQ18zKTsKKwkJbmV3X2luaXRfYWN0aW9uKEFTS0ZJUlNULCBiYl9kZWZhdWx0X2xvZ2luX3NoZWxsLCBWQ180KTsKKwkJLyogc3lzaW5pdCAqLworCQluZXdfaW5pdF9hY3Rpb24oU1lTSU5JVCwgSU5JVF9TQ1JJUFQsICIiKTsKKwkJcmV0dXJuOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9JTklUVEFCCisJLyogb3B0aW9uYWxfdHR5Omlnbm9yZWRfcnVubGV2ZWw6YWN0aW9uOmNvbW1hbmQKKwkgKiBEZWxpbXMgYXJlIG5vdCB0byBiZSBjb2xsYXBzZWQgYW5kIG5lZWQgZXhhY3RseSA0IHRva2VucworCSAqLworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCA0LCAwLCAiIzoiLAorCQkJCVBBUlNFX05PUk1BTCAmIH4oUEFSU0VfVFJJTSB8IFBBUlNFX0NPTExBUFNFKSkpIHsKKwkJLyogb3JkZXIgbXVzdCBjb3JyZXNwb25kIHRvIFNZU0lOSVQuLlJFU1RBUlQgY29uc3RhbnRzICovCisJCXN0YXRpYyBjb25zdCBjaGFyIGFjdGlvbnNbXSBBTElHTjEgPQorCQkJInN5c2luaXRcMCIid2FpdFwwIiJvbmNlXDAiInJlc3Bhd25cMCIiYXNrZmlyc3RcMCIKKwkJCSJjdHJsYWx0ZGVsXDAiInNodXRkb3duXDAiInJlc3RhcnRcMCI7CisJCWludCBhY3Rpb247CisJCWNoYXIgKnR0eSA9IHRva2VuWzBdOworCisJCWlmICghdG9rZW5bM10pIC8qIGxlc3MgdGhhbiA0IHRva2VucyAqLworCQkJZ290byBiYWRfZW50cnk7CisJCWFjdGlvbiA9IGluZGV4X2luX3N0cmluZ3MoYWN0aW9ucywgdG9rZW5bMl0pOworCQlpZiAoYWN0aW9uIDwgMCB8fCAhdG9rZW5bM11bMF0pIC8qIHRva2VuWzNdOiBjb21tYW5kICovCisJCQlnb3RvIGJhZF9lbnRyeTsKKwkJLyogdHVybiAuKlRUWSAtPiAvZGV2L1RUWSAqLworCQlpZiAodHR5WzBdKSB7CisJCQl0dHkgPSBjb25jYXRfcGF0aF9maWxlKCIvZGV2LyIsIHNraXBfZGV2X3BmeCh0dHkpKTsKKwkJfQorCQluZXdfaW5pdF9hY3Rpb24oMSA8PCBhY3Rpb24sIHRva2VuWzNdLCB0dHkpOworCQlpZiAodHR5WzBdKQorCQkJZnJlZSh0dHkpOworCQljb250aW51ZTsKKyBiYWRfZW50cnk6CisJCW1lc3NhZ2UoTF9MT0cgfCBMX0NPTlNPTEUsICJCYWQgaW5pdHRhYiBlbnRyeSBhdCBsaW5lICVkIiwKKwkJCQlwYXJzZXItPmxpbmVubyk7CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHBhdXNlX2FuZF9sb3dfbGV2ZWxfcmVib290KHVuc2lnbmVkIG1hZ2ljKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHBhdXNlX2FuZF9sb3dfbGV2ZWxfcmVib290KHVuc2lnbmVkIG1hZ2ljKQoreworCXBpZF90IHBpZDsKKworCS8qIEFsbG93IHRpbWUgZm9yIGxhc3QgbWVzc2FnZSB0byByZWFjaCBzZXJpYWwgY29uc29sZSwgZXRjICovCisJc2xlZXAoMSk7CisKKwkvKiBXZSBoYXZlIHRvIGZvcmsgaGVyZSwgc2luY2UgdGhlIGtlcm5lbCBjYWxscyBkb19leGl0KEVYSVRfU1VDQ0VTUykKKwkgKiBpbiBsaW51eC9rZXJuZWwvc3lzLmMsIHdoaWNoIGNhbiBjYXVzZSB0aGUgbWFjaGluZSB0byBwYW5pYyB3aGVuCisJICogdGhlIGluaXQgcHJvY2VzcyBleGl0cy4uLiAqLworCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7IC8qIGNoaWxkICovCisJCXJlYm9vdChtYWdpYyk7CisJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCXdoaWxlICgxKQorCQlzbGVlcCgxKTsKK30KKworc3RhdGljIHZvaWQgcnVuX3NodXRkb3duX2FuZF9raWxsX3Byb2Nlc3Nlcyh2b2lkKQoreworCS8qIFJ1biBldmVyeXRoaW5nIHRvIGJlIHJ1biBhdCAic2h1dGRvd24iLiAgVGhpcyBpcyBkb25lIF9wcmlvcl8KKwkgKiB0byBraWxsaW5nIGV2ZXJ5dGhpbmcsIGluIGNhc2UgcGVvcGxlIHdpc2ggdG8gdXNlIHNjcmlwdHMgdG8KKwkgKiBzaHV0IHRoaW5ncyBkb3duIGdyYWNlZnVsbHkuLi4gKi8KKwlydW5fYWN0aW9ucyhTSFVURE9XTik7CisKKwltZXNzYWdlKExfQ09OU09MRSB8IExfTE9HLCAiVGhlIHN5c3RlbSBpcyBnb2luZyBkb3duIE5PVyEiKTsKKworCS8qIFNlbmQgc2lnbmFscyB0byBldmVyeSBwcm9jZXNzIF9leGNlcHRfIHBpZCAxICovCisJa2lsbCgtMSwgU0lHVEVSTSk7CisJbWVzc2FnZShMX0NPTlNPTEUgfCBMX0xPRywgIlNlbnQgU0lHJXMgdG8gYWxsIHByb2Nlc3NlcyIsICJURVJNIik7CisJc3luYygpOworCXNsZWVwKDEpOworCisJa2lsbCgtMSwgU0lHS0lMTCk7CisJbWVzc2FnZShMX0NPTlNPTEUsICJTZW50IFNJRyVzIHRvIGFsbCBwcm9jZXNzZXMiLCAiS0lMTCIpOworCXN5bmMoKTsKKwkvKnNsZWVwKDEpOyAtIGNhbGxlcnMgdGFrZSBjYXJlIGFib3V0IG1ha2luZyBhIHBhdXNlICovCit9CisKKy8qIFNpZ25hbCBoYW5kbGluZyBieSBpbml0OgorICoKKyAqIEZvciBwcm9jZXNzIHdpdGggUElEPT0xLCBvbiBlbnRyeSBrZXJuZWwgc2V0cyBhbGwgc2lnbmFscyB0byBTSUdfREZMCisgKiBhbmQgdW5tYXNrcyBhbGwgc2lnbmFscy4gSG93ZXZlciwgZm9yIHByb2Nlc3Mgd2l0aCBQSUQ9PTEsCisgKiBkZWZhdWx0IGFjdGlvbiAoU0lHX0RGTCkgb24gYW55IHNpZ25hbCBpcyB0byBpZ25vcmUgaXQsCisgKiBldmVuIGZvciBzcGVjaWFsIHNpZ25hbHMgU0lHS0lMTCBhbmQgU0lHQ09OVC4KKyAqIEFsc28sIGFueSBzaWduYWwgY2FuIGJlIGNhdWdodCBvciBibG9ja2VkLgorICogKGJ1dCBTSUdTVE9QIGlzIHN0aWxsIGhhbmRsZWQgc3BlY2lhbGx5LCBhdCBsZWFzdCBpbiAyLjYuMjApCisgKgorICogV2UgaW5zdGFsbCB0d28ga2luZHMgb2YgaGFuZGxlcnMsICJpbW1lZGlhdGUiIGFuZCAiZGVsYXllZCIuCisgKgorICogSW1tZWRpYXRlIGhhbmRsZXJzIGV4ZWN1dGUgYXQgYW55IHRpbWUsIGV2ZW4gd2hpbGUsIHNheSwgc3lzaW5pdAorICogaXMgcnVubmluZy4KKyAqCisgKiBEZWxheWVkIGhhbmRsZXJzIGp1c3Qgc2V0IGEgZmxhZyB2YXJpYWJsZS4gVGhlIHZhcmlhYmxlIGlzIGNoZWNrZWQKKyAqIGluIHRoZSBtYWluIGxvb3AgYW5kIGFjdGVkIHVwb24uCisgKgorICogaGFsdC9wb3dlcm9mZi9yZWJvb3QgYW5kIHJlc3RhcnQgaGF2ZSBpbW1lZGlhdGUgaGFuZGxlcnMuCisgKiBUaGV5IG9ubHkgdHJhdmVyc2UgbGlua2VkIGxpc3Qgb2Ygc3RydWN0IGFjdGlvbidzLCBuZXZlciBtb2RpZnkgaXQsCisgKiB0aGlzIHNob3VsZCBiZSBzYWZlIHRvIGRvIGV2ZW4gaW4gc2lnbmFsIGhhbmRsZXIuIEFsc28gdGhleQorICogbmV2ZXIgcmV0dXJuLgorICoKKyAqIFNJR1NUT1AgYW5kIFNJR1RTVFAgaGF2ZSBpbW1lZGlhdGUgaGFuZGxlcnMuIFRoZXkganVzdCB3YWl0CisgKiBmb3IgU0lHQ09OVCB0byBoYXBwZW4uCisgKgorICogU0lHSFVQIGhhcyBhIGRlbGF5ZWQgaGFuZGxlciwgYmVjYXVzZSBtb2RpZnlpbmcgbGlua2VkIGxpc3QKKyAqIG9mIHN0cnVjdCBhY3Rpb24ncyBmcm9tIGEgc2lnbmFsIGhhbmRsZXIgd2hpbGUgaXQgaXMgbWFuaXB1bGF0ZWQKKyAqIGJ5IHRoZSBwcm9ncmFtIG1heSBiZSBkaXNhc3Ryb3VzLgorICoKKyAqIEN0cmwtQWx0LURlbCBoYXMgYSBkZWxheWVkIGhhbmRsZXIuIE5vdCBhIG11c3QsIGJ1dCBhbGxvd2luZworICogaXQgdG8gaGFwcGVuIGV2ZW4gc29tZXdoZXJlIGluc2lkZSAic3lzaW5pdCIgd291bGQgYmUgYSBiaXQgYXdrd2FyZC4KKyAqCisgKiBUaGVyZSBpcyBhIHRpbnkgcHJvYmFiaWxpdHkgdGhhdCBTSUdIVVAgYW5kIEN0cmwtQWx0LURlbCB3aWxsIGNvbGxpZGUKKyAqIGFuZCBvbmx5IG9uZSB3aWxsIGJlIHJlbWVtYmVyZWQgYW5kIGFjdGVkIHVwb24uCisgKi8KKworLyogVGhlIFNJR1VTUlsxMl0vU0lHVEVSTSBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBoYWx0X3JlYm9vdF9wd29mZihpbnQgc2lnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGhhbHRfcmVib290X3B3b2ZmKGludCBzaWcpCit7CisJY29uc3QgY2hhciAqbTsKKwl1bnNpZ25lZCByYjsKKworCS8qIFdlIG1heSBjYWxsIHJ1bigpIGFuZCBpdCB1bm1hc2tzIHNpZ25hbHMsCisJICogaW5jbHVkaW5nIHRoZSBvbmUgbWFza2VkIGluc2lkZSB0aGlzIHNpZ25hbCBoYW5kbGVyLgorCSAqIFRlc3RjYXNlIHdoaWNoIHdvdWxkIHN0YXJ0IG11bHRpcGxlIHJlYm9vdCBzY3JpcHRzOgorCSAqICB3aGlsZSB0cnVlOyBkbyByZWJvb3Q7IGRvbmUKKwkgKiBQcmV2ZW50aW5nIGl0OgorCSAqLworCXJlc2V0X3NpZ2hhbmRsZXJzX2FuZF91bmJsb2NrX3NpZ3MoKTsKKworCXJ1bl9zaHV0ZG93bl9hbmRfa2lsbF9wcm9jZXNzZXMoKTsKKworCW0gPSAiaGFsdCI7CisJcmIgPSBSQl9IQUxUX1NZU1RFTTsKKwlpZiAoc2lnID09IFNJR1RFUk0pIHsKKwkJbSA9ICJyZWJvb3QiOworCQlyYiA9IFJCX0FVVE9CT09UOworCX0gZWxzZSBpZiAoc2lnID09IFNJR1VTUjIpIHsKKwkJbSA9ICJwb3dlcm9mZiI7CisJCXJiID0gUkJfUE9XRVJfT0ZGOworCX0KKwltZXNzYWdlKExfQ09OU09MRSwgIlJlcXVlc3Rpbmcgc3lzdGVtICVzIiwgbSk7CisJcGF1c2VfYW5kX2xvd19sZXZlbF9yZWJvb3QocmIpOworCS8qIG5vdCByZWFjaGVkICovCit9CisKKy8qIEhhbmRsZXIgZm9yIFFVSVQgLSBleGVjICJyZXN0YXJ0IiBhY3Rpb24sCisgKiBlbHNlIChubyBzdWNoIGFjdGlvbiBkZWZpbmVkKSBkbyBub3RoaW5nICovCitzdGF0aWMgdm9pZCByZXN0YXJ0X2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpIHsKKwkJaWYgKCEoYS0+YWN0aW9uX3R5cGUgJiBSRVNUQVJUKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFN0YXJ0aW5nIGZyb20gaGVyZSwgd2Ugd29uJ3QgcmV0dXJuLgorCQkgKiBUaHVzIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgcHJlc2VydmluZyBlcnJubworCQkgKiBhbmQgc3VjaC4KKwkJICovCisKKwkJcmVzZXRfc2lnaGFuZGxlcnNfYW5kX3VuYmxvY2tfc2lncygpOworCisJCXJ1bl9zaHV0ZG93bl9hbmRfa2lsbF9wcm9jZXNzZXMoKTsKKworI2lmZGVmIFJCX0VOQUJMRV9DQUQKKwkJLyogQWxsb3cgQ3RybC1BbHQtRGVsIHRvIHJlYm9vdCB0aGUgc3lzdGVtLgorCQkgKiBUaGlzIGlzIGhvdyBrZXJuZWwgc2V0cyBpdCB1cCBmb3IgaW5pdCwgd2UgZm9sbG93IHN1aXQuCisJCSAqLworCQlyZWJvb3QoUkJfRU5BQkxFX0NBRCk7IC8qIG1pc25vbWVyICovCisjZW5kaWYKKworCQlpZiAob3Blbl9zdGRpb190b190dHkoYS0+dGVybWluYWwpKSB7CisJCQlkYmdfbWVzc2FnZShMX0NPTlNPTEUsICJUcnlpbmcgdG8gcmUtZXhlYyAlcyIsIGEtPmNvbW1hbmQpOworCQkJLyogVGhlb3JldGljYWxseSBzaG91bGQgYmUgc2FmZS4KKwkJCSAqIEJ1dCBpbiBwcmFjdGljZSwga2VybmVsIGJ1Z3MgbWF5IGxlYXZlCisJCQkgKiB1bmtpbGxhYmxlIHByb2Nlc3NlcywgYW5kIHdhaXQoKSBtYXkgYmxvY2sgZm9yZXZlci4KKwkJCSAqIE9oIHdlbGwuIEhvcGluZyAibmV3IiBpbml0IHdvbid0IGJlIHRvbyBzdXJwcmlzZWQKKwkJCSAqIGJ5IGhhdmluZyBjaGlsZHJlbiBpdCBkaWRuJ3QgY3JlYXRlLgorCQkJICovCisJCQkvL3doaWxlICh3YWl0KE5VTEwpID4gMCkKKwkJCS8vCWNvbnRpbnVlOworCQkJaW5pdF9leGVjKGEtPmNvbW1hbmQpOworCQl9CisJCS8qIE9wZW4gb3IgZXhlYyBmYWlsZWQgKi8KKwkJcGF1c2VfYW5kX2xvd19sZXZlbF9yZWJvb3QoUkJfSEFMVF9TWVNURU0pOworCQkvKiBub3QgcmVhY2hlZCAqLworCX0KK30KKworLyogVGhlIFNJR1NUT1AvU0lHVFNUUCBoYW5kbGVyCisgKiBOQjogaW5zaWRlIGl0LCBhbGwgc2lnbmFscyBleGNlcHQgU0lHQ09OVCBhcmUgbWFza2VkCisgKiB2aWEgYXBwcm9wcmlhdGUgc2V0dXAgaW4gc2lnYWN0aW9uKCkuCisgKi8KK3N0YXRpYyB2b2lkIHN0b3BfaGFuZGxlcihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzbWFsbGludCBzYXZlZF9iYl9nb3Rfc2lnbmFsOworCWludCBzYXZlZF9lcnJubzsKKworCXNhdmVkX2JiX2dvdF9zaWduYWwgPSBiYl9nb3Rfc2lnbmFsOworCXNhdmVkX2Vycm5vID0gZXJybm87CisJc2lnbmFsKFNJR0NPTlQsIHJlY29yZF9zaWdubyk7CisKKwl3aGlsZSAoMSkgeworCQlwaWRfdCB3cGlkOworCisJCWlmIChiYl9nb3Rfc2lnbmFsID09IFNJR0NPTlQpCisJCQlicmVhazsKKwkJLyogTkI6IHRoaXMgY2FuIGFjY2lkZW50YWxseSB3YWl0KCkgZm9yIGEgcHJvY2VzcworCQkgKiB3aGljaCB3ZSB3YWl0Zm9yKCkgZWxzZXdoZXJlISB3YWl0Zm9yKCkgbXVzdCBoYXZlCisJCSAqIGNvZGUgd2hpY2ggaXMgcmVzaWxpZW50IGFnYWluc3QgdGhpcy4KKwkJICovCisJCXdwaWQgPSB3YWl0X2FueV9ub2hhbmcoTlVMTCk7CisJCW1hcmtfdGVybWluYXRlZCh3cGlkKTsKKwkJc2xlZXAoMSk7CisJfQorCisJc2lnbmFsKFNJR0NPTlQsIFNJR19ERkwpOworCWVycm5vID0gc2F2ZWRfZXJybm87CisJYmJfZ290X3NpZ25hbCA9IHNhdmVkX2JiX2dvdF9zaWduYWw7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfSU5JVFRBQgorc3RhdGljIHZvaWQgcmVsb2FkX2luaXR0YWIodm9pZCkKK3sKKwlzdHJ1Y3QgaW5pdF9hY3Rpb24gKmEsICoqbmV4dHA7CisKKwltZXNzYWdlKExfTE9HLCAicmVsb2FkaW5nIC9ldGMvaW5pdHRhYiIpOworCisJLyogRGlzYWJsZSBvbGQgZW50cmllcyAqLworCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KQorCQlhLT5hY3Rpb25fdHlwZSA9IDA7CisKKwkvKiBBcHBlbmQgbmV3IGVudHJpZXMsIG9yIG1vZGlmeSBleGlzdGluZyBlbnRyaWVzCisJICogKGluY2wuIHNldHRpbmcgYS0+YWN0aW9uX3R5cGUpIGlmIGNtZCBhbmQgZGV2aWNlIG5hbWUKKwkgKiBtYXRjaCBuZXcgb25lcy4gRW5kIHJlc3VsdDogb25seSBlbnRyaWVzIHdpdGgKKwkgKiBhLT5hY3Rpb25fdHlwZSA9PSAwIGFyZSBzdGFsZS4KKwkgKi8KKwlwYXJzZV9pbml0dGFiKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9LSUxMX1JFTU9WRUQKKwkvKiBLaWxsIHN0YWxlIGVudHJpZXMgKi8KKwkvKiBCZSBuaWNlIGFuZCBzZW5kIFNJR1RFUk0gZmlyc3QgKi8KKwlmb3IgKGEgPSBpbml0X2FjdGlvbl9saXN0OyBhOyBhID0gYS0+bmV4dCkKKwkJaWYgKGEtPmFjdGlvbl90eXBlID09IDAgJiYgYS0+cGlkICE9IDApCisJCQlraWxsKGEtPnBpZCwgU0lHVEVSTSk7CisJaWYgKENPTkZJR19GRUFUVVJFX0tJTExfREVMQVkpIHsKKwkJLyogTkI6IHBhcmVudCB3aWxsIHdhaXQgaW4gTk9NTVUgY2FzZSAqLworCQlpZiAoKEJCX01NVSA/IGZvcmsoKSA6IHZmb3JrKCkpID09IDApIHsgLyogY2hpbGQgKi8KKwkJCXNsZWVwKENPTkZJR19GRUFUVVJFX0tJTExfREVMQVkpOworCQkJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpCisJCQkJaWYgKGEtPmFjdGlvbl90eXBlID09IDAgJiYgYS0+cGlkICE9IDApCisJCQkJCWtpbGwoYS0+cGlkLCBTSUdLSUxMKTsKKwkJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFJlbW92ZSBzdGFsZSBlbnRyaWVzIGFuZCBTWVNJTklUIGVudHJpZXMuCisJICogV2UgbmV2ZXIgcmVydW4gU1lTSU5JVCBlbnRyaWVzIGFueXdheSwKKwkgKiByZW1vdmluZyB0aGVtIHRvbyBzYXZlcyBhIGZldyBieXRlcyAqLworCW5leHRwID0gJmluaXRfYWN0aW9uX2xpc3Q7CisJd2hpbGUgKChhID0gKm5leHRwKSAhPSBOVUxMKSB7CisJCWlmICgoYS0+YWN0aW9uX3R5cGUgJiB+U1lTSU5JVCkgPT0gMCkgeworCQkJKm5leHRwID0gYS0+bmV4dDsKKwkJCWZyZWUoYSk7CisJCX0gZWxzZSB7CisJCQluZXh0cCA9ICZhLT5uZXh0OworCQl9CisJfQorCisJLyogTm90IG5lZWRlZDogKi8KKwkvKiBydW5fYWN0aW9ucyhSRVNQQVdOIHwgQVNLRklSU1QpOyAqLworCS8qIC0gd2UgcmV0dXJuIHRvIG1haW4gbG9vcCwgd2hpY2ggZG9lcyB0aGlzIGF1dG9tYWdpY2FsbHkgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNoZWNrX2RlbGF5ZWRfc2lncyh2b2lkKQoreworCWludCBzaWdzX3NlZW4gPSAwOworCisJd2hpbGUgKDEpIHsKKwkJc21hbGxpbnQgc2lnID0gYmJfZ290X3NpZ25hbDsKKworCQlpZiAoIXNpZykKKwkJCXJldHVybiBzaWdzX3NlZW47CisJCWJiX2dvdF9zaWduYWwgPSAwOworCQlzaWdzX3NlZW4gPSAxOworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9JTklUVEFCCisJCWlmIChzaWcgPT0gU0lHSFVQKQorCQkJcmVsb2FkX2luaXR0YWIoKTsKKyNlbmRpZgorCQlpZiAoc2lnID09IFNJR0lOVCkKKwkJCXJ1bl9hY3Rpb25zKENUUkxBTFRERUwpOworCX0KK30KKworaW50IGluaXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGluaXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWlmIChhcmd2WzFdICYmIHN0cmNtcChhcmd2WzFdLCAiLXEiKSA9PSAwKSB7CisJCXJldHVybiBraWxsKDEsIFNJR0hVUCk7CisJfQorCisJaWYgKCFERUJVR19JTklUKSB7CisJCS8qIEV4cGVjdCB0byBiZSBpbnZva2VkIGFzIGluaXQgd2l0aCBQSUQ9MSBvciBiZSBpbnZva2VkIGFzIGxpbnV4cmMgKi8KKwkJaWYgKGdldHBpZCgpICE9IDEKKwkJICYmICghRU5BQkxFX0ZFQVRVUkVfSU5JVFJEIHx8IGFwcGxldF9uYW1lWzBdICE9ICdsJykgLyogbm90IGxpbnV4cmM/ICovCisJCSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm11c3QgYmUgcnVuIGFzIFBJRCAxIik7CisJCX0KKyNpZmRlZiBSQl9ESVNBQkxFX0NBRAorCQkvKiBUdXJuIG9mZiByZWJvb3RpbmcgdmlhIENUTC1BTFQtREVMIC0gd2UgZ2V0IGEKKwkJICogU0lHSU5UIG9uIENBRCBzbyB3ZSBjYW4gc2h1dCB0aGluZ3MgZG93biBncmFjZWZ1bGx5Li4uICovCisJCXJlYm9vdChSQl9ESVNBQkxFX0NBRCk7IC8qIG1pc25vbWVyICovCisjZW5kaWYKKwl9CisKKwkvKiBJZiwgc2F5LCB4bWFsbG9jIHdvdWxkIGV2ZXIgZGllLCB3ZSBkb24ndCB3YW50IHRvIG9vcHMga2VybmVsCisJICogYnkgZXhpdGluZy4KKwkgKiBOQjogd2Ugc2V0IGRpZV9zbGVlcCAqYWZ0ZXIqIFBJRCAxIGNoZWNrIGFuZCBiYl9zaG93X3VzYWdlLgorCSAqIE90aGVyd2lzZSwgZm9yIGV4YW1wbGUsICJpbml0IHUiICgicGxlYXNlIHJleGVjIHlvdXJzZWxmIgorCSAqIGNvbW1hbmQgZm9yIHN5c3Zpbml0KSB3aWxsIHNob3cgaGVscCB0ZXh0ICh3aGljaCBpc24ndCB0b28gYmFkKSwKKwkgKiAqYW5kIHNsZWVwIGZvcmV2ZXIqICh3aGljaCBpcyBiYWQhKQorCSAqLworCWRpZV9zbGVlcCA9IDMwICogMjQqNjAqNjA7CisKKwkvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBkZWZhdWx0IGNvbnNvbGUgc2hvdWxkIGJlICovCisJY29uc29sZV9pbml0KCk7CisJc2V0X3NhbmVfdGVybSgpOworCXhjaGRpcigiLyIpOworCXNldHNpZCgpOworCisJLyogTWFrZSBzdXJlIGVudmlyb25zIGlzIHNldCB0byBzb21ldGhpbmcgc2FuZSAqLworCXB1dGVudigoY2hhciAqKSAiSE9NRT0vIik7CisJcHV0ZW52KChjaGFyICopIGJiX1BBVEhfcm9vdF9wYXRoKTsKKwlwdXRlbnYoKGNoYXIgKikgIlNIRUxMPS9iaW4vc2giKTsKKwlwdXRlbnYoKGNoYXIgKikgIlVTRVI9cm9vdCIpOyAvKiBuZWVkZWQ/IHdoeT8gKi8KKworCWlmIChhcmd2WzFdKQorCQl4c2V0ZW52KCJSVU5MRVZFTCIsIGFyZ3ZbMV0pOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX0VYVFJBX1FVSUVUCisJLyogSGVsbG8gd29ybGQgKi8KKwltZXNzYWdlKExfQ09OU09MRSB8IExfTE9HLCAiaW5pdCBzdGFydGVkOiAlcyIsIGJiX2Jhbm5lcik7CisjZW5kaWYKKworLyogc3RydWN0IHN5c2luZm8gaXMgbGludXgtc3BlY2lmaWMgKi8KKyNpZmRlZiBfX2xpbnV4X18KKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSB0byBkbyBzb21ldGhpbmcgdXNlZnVsLiAqLworCWlmIChFTkFCTEVfU1dBUE9OT0ZGKSB7CisJCXN0cnVjdCBzeXNpbmZvIGluZm87CisKKwkJaWYgKHN5c2luZm8oJmluZm8pID09IDAKKwkJICYmIChpbmZvLm1lbV91bml0ID8gaW5mby5tZW1fdW5pdCA6IDEpICogKGxvbmcgbG9uZylpbmZvLnRvdGFscmFtIDwgMTAyNCoxMDI0CisJCSkgeworCQkJbWVzc2FnZShMX0NPTlNPTEUsICJMb3cgbWVtb3J5LCBmb3JjaW5nIHN3YXBvbiIpOworCQkJLyogc3dhcG9uIC1hIHJlcXVpcmVzIC9wcm9jIHR5cGljYWxseSAqLworCQkJbmV3X2luaXRfYWN0aW9uKFNZU0lOSVQsICJtb3VudCAtdCBwcm9jIHByb2MgL3Byb2MiLCAiIik7CisJCQkvKiBUcnkgdG8gdHVybiBvbiBzd2FwICovCisJCQluZXdfaW5pdF9hY3Rpb24oU1lTSU5JVCwgInN3YXBvbiAtYSIsICIiKTsKKwkJCXJ1bl9hY3Rpb25zKFNZU0lOSVQpOyAgIC8qIHdhaXQgYW5kIHJlbW92aW5nICovCisJCX0KKwl9CisjZW5kaWYKKworCS8qIENoZWNrIGlmIHdlIGFyZSBzdXBwb3NlZCB0byBiZSBpbiBzaW5nbGUgdXNlciBtb2RlICovCisJaWYgKGFyZ3ZbMV0KKwkgJiYgKHN0cmNtcChhcmd2WzFdLCAic2luZ2xlIikgPT0gMCB8fCBzdHJjbXAoYXJndlsxXSwgIi1zIikgPT0gMCB8fCBMT05FX0NIQVIoYXJndlsxXSwgJzEnKSkKKwkpIHsKKwkJLyogPz8/IHNob3VsZG4ndCB3ZSBzZXQgUlVOTEVWRUw9ImIiIGhlcmU/ICovCisJCS8qIFN0YXJ0IGEgc2hlbGwgb24gY29uc29sZSAqLworCQluZXdfaW5pdF9hY3Rpb24oUkVTUEFXTiwgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCwgIiIpOworCX0gZWxzZSB7CisJCS8qIE5vdCBpbiBzaW5nbGUgdXNlciBtb2RlIC0gc2VlIHdoYXQgaW5pdHRhYiBzYXlzICovCisKKwkJLyogTk9URSB0aGF0IGlmIENPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCIGlzIE5PVCBkZWZpbmVkLAorCQkgKiB0aGVuIHBhcnNlX2luaXR0YWIoKSBzaW1wbHkgYWRkcyBpbiBzb21lIGRlZmF1bHQKKwkJICogYWN0aW9ucyhpLmUuLCBJTklUX1NDUklQVCBhbmQgYSBwYWlyCisJCSAqIG9mICJhc2tmaXJzdCIgc2hlbGxzICovCisJCXBhcnNlX2luaXR0YWIoKTsKKwl9CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChnZXRlbnYoIlNFTElOVVhfSU5JVCIpID09IE5VTEwpIHsKKwkJaW50IGVuZm9yY2UgPSAwOworCisJCXB1dGVudigoY2hhciopIlNFTElOVVhfSU5JVD1ZRVMiKTsKKwkJaWYgKHNlbGludXhfaW5pdF9sb2FkX3BvbGljeSgmZW5mb3JjZSkgPT0gMCkgeworCQkJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCQl9IGVsc2UgaWYgKGVuZm9yY2UgPiAwKSB7CisJCQkvKiBTRUxpbnV4IGluIGVuZm9yY2luZyBtb2RlIGJ1dCBsb2FkX3BvbGljeSBmYWlsZWQgKi8KKwkJCW1lc3NhZ2UoTF9DT05TT0xFLCAiY2FuJ3QgbG9hZCBTRUxpbnV4IFBvbGljeS4gIgorCQkJCSJNYWNoaW5lIGlzIGluIGVuZm9yY2luZyBtb2RlLiBIYWx0aW5nIG5vdy4iKTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIE1ha2UgdGhlIGNvbW1hbmQgbGluZSBqdXN0IHNheSAiaW5pdCIgIC0gdGhhdHMgYWxsLCBub3RoaW5nIGVsc2UgKi8KKwlzdHJuY3B5KGFyZ3ZbMF0sICJpbml0Iiwgc3RybGVuKGFyZ3ZbMF0pKTsKKwkvKiBXaXBlIGFyZ3ZbMV0tYXJndltOXSBzbyB0aGV5IGRvbid0IGNsdXR0ZXIgdGhlIHBzIGxpc3RpbmcgKi8KKwl3aGlsZSAoKisrYXJndikKKwkJbWVtc2V0KCphcmd2LCAwLCBzdHJsZW4oKmFyZ3YpKTsKKworCS8qIFNldCB1cCBzaWduYWwgaGFuZGxlcnMgKi8KKwlpZiAoIURFQlVHX0lOSVQpIHsKKwkJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCQliYl9zaWduYWxzKDAKKwkJCSsgKDEgPDwgU0lHVVNSMSkgLyogaGFsdCAqLworCQkJKyAoMSA8PCBTSUdURVJNKSAvKiByZWJvb3QgKi8KKwkJCSsgKDEgPDwgU0lHVVNSMikgLyogcG93ZXJvZmYgKi8KKwkJCSwgaGFsdF9yZWJvb3RfcHdvZmYpOworCQlzaWduYWwoU0lHUVVJVCwgcmVzdGFydF9oYW5kbGVyKTsgLyogcmUtZXhlYyBhbm90aGVyIGluaXQgKi8KKworCQkvKiBTdG9wIGhhbmRsZXIgbXVzdCBhbGxvdyBvbmx5IFNJR0NPTlQgaW5zaWRlIGl0c2VsZiAqLworCQltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkJc2lnZmlsbHNldCgmc2Euc2FfbWFzayk7CisJCXNpZ2RlbHNldCgmc2Euc2FfbWFzaywgU0lHQ09OVCk7CisJCXNhLnNhX2hhbmRsZXIgPSBzdG9wX2hhbmRsZXI7CisJCS8qIE5COiBzYV9mbGFncyBkb2Vzbid0IGhhdmUgU0FfUkVTVEFSVC4KKwkJICogSXQgbXVzdCBiZSBhYmxlIHRvIGludGVycnVwdCB3YWl0KCkuCisJCSAqLworCQlzaWdhY3Rpb25fc2V0KFNJR1RTVFAsICZzYSk7IC8qIHBhdXNlICovCisJCS8qIERvZXMgbm90IHdvcmsgYXMgaW50ZW5kZWQsIGF0IGxlYXN0IGluIDIuNi4yMC4KKwkJICogU0lHU1RPUCBpcyBzaW1wbHkgaWdub3JlZCBieSBpbml0OgorCQkgKi8KKwkJc2lnYWN0aW9uX3NldChTSUdTVE9QLCAmc2EpOyAvKiBwYXVzZSAqLworCisJCS8qIFNJR0lOVCAoQ3RybC1BbHQtRGVsKSBtdXN0IGludGVycnVwdCB3YWl0KCksCisJCSAqIHNldHRpbmcgaGFuZGxlciB3aXRob3V0IFNBX1JFU1RBUlQgZmxhZy4KKwkJICovCisJCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgoMSA8PCBTSUdJTlQpLCByZWNvcmRfc2lnbm8pOworCX0KKworCS8qIFNldCB1cCAicmVyZWFkIC9ldGMvaW5pdHRhYiIgaGFuZGxlci4KKwkgKiBIYW5kbGVyIGlzIHNldCB1cCB3aXRob3V0IFNBX1JFU1RBUlQsIGl0IHdpbGwgaW50ZXJydXB0IHN5c2NhbGxzLgorCSAqLworCWlmICghREVCVUdfSU5JVCAmJiBFTkFCTEVfRkVBVFVSRV9VU0VfSU5JVFRBQikKKwkJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KCgxIDw8IFNJR0hVUCksIHJlY29yZF9zaWdubyk7CisKKwkvKiBOb3cgcnVuIGV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyB0byBiZSBydW4gKi8KKwkvKiBGaXJzdCBydW4gdGhlIHN5c2luaXQgY29tbWFuZCAqLworCXJ1bl9hY3Rpb25zKFNZU0lOSVQpOworCWNoZWNrX2RlbGF5ZWRfc2lncygpOworCS8qIE5leHQgcnVuIGFueXRoaW5nIHRoYXQgd2FudHMgdG8gYmxvY2sgKi8KKwlydW5fYWN0aW9ucyhXQUlUKTsKKwljaGVja19kZWxheWVkX3NpZ3MoKTsKKwkvKiBOZXh0IHJ1biBhbnl0aGluZyB0byBiZSBydW4gb25seSBvbmNlICovCisJcnVuX2FjdGlvbnMoT05DRSk7CisKKwkvKiBOb3cgcnVuIHRoZSBsb29waW5nIHN0dWZmIGZvciB0aGUgcmVzdCBvZiBmb3JldmVyLgorCSAqLworCXdoaWxlICgxKSB7CisJCWludCBtYXliZV9XTk9IQU5HOworCisJCW1heWJlX1dOT0hBTkcgPSBjaGVja19kZWxheWVkX3NpZ3MoKTsKKworCQkvKiAoUmUpcnVuIHRoZSByZXNwYXduL2Fza2ZpcnN0IHN0dWZmICovCisJCXJ1bl9hY3Rpb25zKFJFU1BBV04gfCBBU0tGSVJTVCk7CisJCW1heWJlX1dOT0hBTkcgfD0gY2hlY2tfZGVsYXllZF9zaWdzKCk7CisKKwkJLyogRG9uJ3QgY29uc3VtZSBhbGwgQ1BVIHRpbWUgLSBzbGVlcCBhIGJpdCAqLworCQlzbGVlcCgxKTsKKwkJbWF5YmVfV05PSEFORyB8PSBjaGVja19kZWxheWVkX3NpZ3MoKTsKKworCQkvKiBXYWl0IGZvciBhbnkgY2hpbGQgcHJvY2VzcyhlcykgdG8gZXhpdC4KKwkJICoKKwkJICogSWYgY2hlY2tfZGVsYXllZF9zaWdzIGFib3ZlIHJlcG9ydGVkIHRoYXQgYSBzaWduYWwKKwkJICogd2FzIGNhdWdodCwgd2FpdCB3aWxsIGJlIG5vbmJsb2NraW5nLiBUaGlzIGVuc3VyZXMKKwkJICogdGhhdCBpZiBTSUdIVVAgaGFzIHJlbG9hZGVkIGluaXR0YWIsIHJlc3Bhd24gYW5kIGFza2ZpcnN0CisJCSAqIGFjdGlvbnMgd2lsbCBub3QgYmUgZGVsYXllZCB1bnRpbCBuZXh0IGNoaWxkIGRlYXRoLgorCQkgKi8KKwkJaWYgKG1heWJlX1dOT0hBTkcpCisJCQltYXliZV9XTk9IQU5HID0gV05PSEFORzsKKwkJd2hpbGUgKDEpIHsKKwkJCXBpZF90IHdwaWQ7CisJCQlzdHJ1Y3QgaW5pdF9hY3Rpb24gKmE7CisKKwkJCS8qIElmIHNpZ25hbHMgaGFwcGVuIF9pbl8gdGhlIHdhaXQsIHRoZXkgaW50ZXJydXB0IGl0LAorCQkJICogYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0IHNldCB0aGVtIHVwIHRoYXQgd2F5CisJCQkgKi8KKwkJCXdwaWQgPSB3YWl0cGlkKC0xLCBOVUxMLCBtYXliZV9XTk9IQU5HKTsKKwkJCWlmICh3cGlkIDw9IDApCisJCQkJYnJlYWs7CisKKwkJCWEgPSBtYXJrX3Rlcm1pbmF0ZWQod3BpZCk7CisJCQlpZiAoYSkgeworCQkJCW1lc3NhZ2UoTF9MT0csICJwcm9jZXNzICclcycgKHBpZCAlZCkgZXhpdGVkLiAiCisJCQkJCQkiU2NoZWR1bGluZyBmb3IgcmVzdGFydC4iLAorCQkJCQkJYS0+Y29tbWFuZCwgd3BpZCk7CisJCQl9CisJCQkvKiBTZWUgaWYgYW55b25lIGVsc2UgaXMgd2FpdGluZyB0byBiZSByZWFwZWQgKi8KKwkJCW1heWJlX1dOT0hBTkcgPSBXTk9IQU5HOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KK30KKworLy91c2FnZTojZGVmaW5lIGxpbnV4cmNfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGxpbnV4cmNfZnVsbF91c2FnZSAiIgorCisvL3VzYWdlOiNkZWZpbmUgaW5pdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGluaXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJJbml0IGlzIHRoZSBwYXJlbnQgb2YgYWxsIHByb2Nlc3NlcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaW5pdF9ub3Rlc191c2FnZQorLy91c2FnZToJIlRoaXMgdmVyc2lvbiBvZiBpbml0IGlzIGRlc2lnbmVkIHRvIGJlIHJ1biBvbmx5IGJ5IHRoZSBrZXJuZWwuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiQnVzeUJveCBpbml0IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBydW5sZXZlbHMuIFRoZSBydW5sZXZlbHMgZmllbGQgb2ZcbiIKKy8vdXNhZ2U6CSJ0aGUgL2V0Yy9pbml0dGFiIGZpbGUgaXMgY29tcGxldGVseSBpZ25vcmVkIGJ5IEJ1c3lCb3ggaW5pdC4gSWYgeW91IHdhbnRcbiIKKy8vdXNhZ2U6CSJydW5sZXZlbHMsIHVzZSBzeXN2aW5pdC5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJCdXN5Qm94IGluaXQgd29ya3MganVzdCBmaW5lIHdpdGhvdXQgYW4gaW5pdHRhYi4gSWYgbm8gaW5pdHRhYiBpcyBmb3VuZCxcbiIKKy8vdXNhZ2U6CSJpdCBoYXMgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGJlaGF2aW9yOlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgk6OnN5c2luaXQ6L2V0Yy9pbml0LmQvcmNTXG4iCisvL3VzYWdlOgkiCTo6YXNrZmlyc3Q6L2Jpbi9zaFxuIgorLy91c2FnZToJIgk6OmN0cmxhbHRkZWw6L3NiaW4vcmVib290XG4iCisvL3VzYWdlOgkiCTo6c2h1dGRvd246L3NiaW4vc3dhcG9mZiAtYVxuIgorLy91c2FnZToJIgk6OnNodXRkb3duOi9iaW4vdW1vdW50IC1hIC1yXG4iCisvL3VzYWdlOgkiCTo6cmVzdGFydDovc2Jpbi9pbml0XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiaWYgaXQgZGV0ZWN0cyB0aGF0IC9kZXYvY29uc29sZSBpcyBfbm90XyBhIHNlcmlhbCBjb25zb2xlLCBpdCB3aWxsIGFsc28gcnVuOlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgl0dHkyOjphc2tmaXJzdDovYmluL3NoXG4iCisvL3VzYWdlOgkiCXR0eTM6OmFza2ZpcnN0Oi9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJdHR5NDo6YXNrZmlyc3Q6L2Jpbi9zaFxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIklmIHlvdSBjaG9vc2UgdG8gdXNlIGFuIC9ldGMvaW5pdHRhYiBmaWxlLCB0aGUgaW5pdHRhYiBlbnRyeSBmb3JtYXQgaXMgYXMgZm9sbG93czpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPGlkPjo8cnVubGV2ZWxzPjo8YWN0aW9uPjo8cHJvY2Vzcz5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPGlkPjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVdBUk5JTkc6IFRoaXMgZmllbGQgaGFzIGEgbm9uLXRyYWRpdGlvbmFsIG1lYW5pbmcgZm9yIEJ1c3lCb3ggaW5pdCFcbiIKKy8vdXNhZ2U6CSIJCVRoZSBpZCBmaWVsZCBpcyB1c2VkIGJ5IEJ1c3lCb3ggaW5pdCB0byBzcGVjaWZ5IHRoZSBjb250cm9sbGluZyB0dHkgZm9yXG4iCisvL3VzYWdlOgkiCQl0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gcnVuIG9uLiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBhcmVcbiIKKy8vdXNhZ2U6CSIJCWFwcGVuZGVkIHRvIFwiL2Rldi9cIiBhbmQgdXNlZCBhcy1pcy4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhpcyBmaWVsZCB0b1xuIgorLy91c2FnZToJIgkJYmUgdW5pcXVlLCBhbHRob3VnaCBpZiBpdCBpc24ndCB5b3UgbWF5IGhhdmUgc3RyYW5nZSByZXN1bHRzLiBJZiB0aGlzXG4iCisvL3VzYWdlOgkiCQlmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGUgY29udHJvbGxpbmcgdHR5IGlzIHNldCB0byB0aGUgY29uc29sZS4gQWxzb1xuIgorLy91c2FnZToJIgkJbm90ZSB0aGF0IGlmIEJ1c3lCb3ggZGV0ZWN0cyB0aGF0IGEgc2VyaWFsIGNvbnNvbGUgaXMgaW4gdXNlLCB0aGVuIG9ubHlcbiIKKy8vdXNhZ2U6CSIJCWVudHJpZXMgd2hvc2UgY29udHJvbGxpbmcgdHR5IGlzIGVpdGhlciB0aGUgc2VyaWFsIGNvbnNvbGUgb3IgL2Rldi9udWxsXG4iCisvL3VzYWdlOgkiCQl3aWxsIGJlIHJ1bi4gQnVzeUJveCBpbml0IGRvZXMgbm90aGluZyB3aXRoIHV0bXAuIFdlIGRvbid0IG5lZWQgbm9cbiIKKy8vdXNhZ2U6CSIJCXN0aW5raW4nIHV0bXAuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCTxydW5sZXZlbHM+OlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJVGhlIHJ1bmxldmVscyBmaWVsZCBpcyBjb21wbGV0ZWx5IGlnbm9yZWQuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCTxhY3Rpb24+OlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJVmFsaWQgYWN0aW9ucyBpbmNsdWRlOiBzeXNpbml0LCByZXNwYXduLCBhc2tmaXJzdCwgd2FpdCxcbiIKKy8vdXNhZ2U6CSIJCW9uY2UsIHJlc3RhcnQsIGN0cmxhbHRkZWwsIGFuZCBzaHV0ZG93bi5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVRoZSBhdmFpbGFibGUgYWN0aW9ucyBjYW4gYmUgY2xhc3NpZmllZCBpbnRvIHR3byBncm91cHM6IGFjdGlvbnNcbiIKKy8vdXNhZ2U6CSIJCXRoYXQgYXJlIHJ1biBvbmx5IG9uY2UsIGFuZCBhY3Rpb25zIHRoYXQgYXJlIHJlLXJ1biB3aGVuIHRoZSBzcGVjaWZpZWRcbiIKKy8vdXNhZ2U6CSIJCXByb2Nlc3MgZXhpdHMuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlSdW4gb25seS1vbmNlIGFjdGlvbnM6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQkJJ3N5c2luaXQnIGlzIHRoZSBmaXJzdCBpdGVtIHJ1biBvbiBib290LiBpbml0IHdhaXRzIHVudGlsIGFsbFxuIgorLy91c2FnZToJIgkJCXN5c2luaXQgYWN0aW9ucyBhcmUgY29tcGxldGVkIGJlZm9yZSBjb250aW51aW5nLiBGb2xsb3dpbmcgdGhlXG4iCisvL3VzYWdlOgkiCQkJY29tcGxldGlvbiBvZiBhbGwgc3lzaW5pdCBhY3Rpb25zLCBhbGwgJ3dhaXQnIGFjdGlvbnMgYXJlIHJ1bi5cbiIKKy8vdXNhZ2U6CSIJCQknd2FpdCcgYWN0aW9ucywgbGlrZSAnc3lzaW5pdCcgYWN0aW9ucywgY2F1c2UgaW5pdCB0byB3YWl0IHVudGlsXG4iCisvL3VzYWdlOgkiCQkJdGhlIHNwZWNpZmllZCB0YXNrIGNvbXBsZXRlcy4gJ29uY2UnIGFjdGlvbnMgYXJlIGFzeW5jaHJvbm91cyxcbiIKKy8vdXNhZ2U6CSIJCQl0aGVyZWZvcmUsIGluaXQgZG9lcyBub3Qgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZS4gJ3Jlc3RhcnQnIGlzXG4iCisvL3VzYWdlOgkiCQkJdGhlIGFjdGlvbiB0YWtlbiB0byByZXN0YXJ0IHRoZSBpbml0IHByb2Nlc3MuIEJ5IGRlZmF1bHQgdGhpcyBzaG91bGRcbiIKKy8vdXNhZ2U6CSIJCQlzaW1wbHkgcnVuIC9zYmluL2luaXQsIGJ1dCBjYW4gYmUgYSBzY3JpcHQgd2hpY2ggcnVucyBwaXZvdF9yb290IG9yIGl0XG4iCisvL3VzYWdlOgkiCQkJY2FuIGRvIGFsbCBzb3J0cyBvZiBvdGhlciBpbnRlcmVzdGluZyB0aGluZ3MuIFRoZSAnY3RybGFsdGRlbCcgaW5pdFxuIgorLy91c2FnZToJIgkJCWFjdGlvbnMgYXJlIHJ1biB3aGVuIHRoZSBzeXN0ZW0gZGV0ZWN0cyB0aGF0IHNvbWVvbmUgb24gdGhlIHN5c3RlbVxuIgorLy91c2FnZToJIgkJCWNvbnNvbGUgaGFzIHByZXNzZWQgdGhlIENUUkwtQUxULURFTCBrZXkgY29tYmluYXRpb24uIFR5cGljYWxseSBvbmVcbiIKKy8vdXNhZ2U6CSIJCQl3YW50cyB0byBydW4gJ3JlYm9vdCcgYXQgdGhpcyBwb2ludCB0byBjYXVzZSB0aGUgc3lzdGVtIHRvIHJlYm9vdC5cbiIKKy8vdXNhZ2U6CSIJCQlGaW5hbGx5IHRoZSAnc2h1dGRvd24nIGFjdGlvbiBzcGVjaWZpZXMgdGhlIGFjdGlvbnMgdG8gdGFrZW4gd2hlblxuIgorLy91c2FnZToJIgkJCWluaXQgaXMgdG9sZCB0byByZWJvb3QuIFVubW91bnRpbmcgZmlsZXN5c3RlbXMgYW5kIGRpc2FibGluZyBzd2FwXG4iCisvL3VzYWdlOgkiCQkJaXMgYSB2ZXJ5IGdvb2QgaGVyZS5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVJ1biByZXBlYXRlZGx5IGFjdGlvbnM6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQkJJ3Jlc3Bhd24nIGFjdGlvbnMgYXJlIHJ1biBhZnRlciB0aGUgJ29uY2UnIGFjdGlvbnMuIFdoZW4gYSBwcm9jZXNzXG4iCisvL3VzYWdlOgkiCQkJc3RhcnRlZCB3aXRoIGEgJ3Jlc3Bhd24nIGFjdGlvbiBleGl0cywgaW5pdCBhdXRvbWF0aWNhbGx5IHJlc3RhcnRzXG4iCisvL3VzYWdlOgkiCQkJaXQuIFVubGlrZSBzeXN2aW5pdCwgQnVzeUJveCBpbml0IGRvZXMgbm90IHN0b3AgcHJvY2Vzc2VzIGZyb21cbiIKKy8vdXNhZ2U6CSIJCQlyZXNwYXduaW5nIG91dCBvZiBjb250cm9sLiBUaGUgJ2Fza2ZpcnN0JyBhY3Rpb25zIGFjdHMganVzdCBsaWtlXG4iCisvL3VzYWdlOgkiCQkJcmVzcGF3biwgZXhjZXB0IHRoYXQgYmVmb3JlIHJ1bm5pbmcgdGhlIHNwZWNpZmllZCBwcm9jZXNzIGl0XG4iCisvL3VzYWdlOgkiCQkJZGlzcGxheXMgdGhlIGxpbmUgXCJQbGVhc2UgcHJlc3MgRW50ZXIgdG8gYWN0aXZhdGUgdGhpcyBjb25zb2xlLlwiXG4iCisvL3VzYWdlOgkiCQkJYW5kIHRoZW4gd2FpdHMgZm9yIHRoZSB1c2VyIHRvIHByZXNzIGVudGVyIGJlZm9yZSBzdGFydGluZyB0aGVcbiIKKy8vdXNhZ2U6CSIJCQlzcGVjaWZpZWQgcHJvY2Vzcy5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVVucmVjb2duaXplZCBhY3Rpb25zIChsaWtlIGluaXRkZWZhdWx0KSB3aWxsIGNhdXNlIGluaXQgdG8gZW1pdCBhblxuIgorLy91c2FnZToJIgkJZXJyb3IgbWVzc2FnZSwgYW5kIHRoZW4gZ28gYWxvbmcgd2l0aCBpdHMgYnVzaW5lc3MuIEFsbCBhY3Rpb25zIGFyZVxuIgorLy91c2FnZToJIgkJcnVuIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiAvZXRjL2luaXR0YWIuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCTxwcm9jZXNzPjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVNwZWNpZmllcyB0aGUgcHJvY2VzcyB0byBiZSBleGVjdXRlZCBhbmQgaXRzIGNvbW1hbmQgbGluZS5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJFeGFtcGxlIC9ldGMvaW5pdHRhYiBmaWxlOlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkjIFRoaXMgaXMgcnVuIGZpcnN0IGV4Y2VwdCB3aGVuIGJvb3RpbmcgaW4gc2luZ2xlLXVzZXIgbW9kZVxuIgorLy91c2FnZToJIgkjXG4iCisvL3VzYWdlOgkiCTo6c3lzaW5pdDovZXRjL2luaXQuZC9yY1NcbiIKKy8vdXNhZ2U6CSIJXG4iCisvL3VzYWdlOgkiCSMgL2Jpbi9zaCBpbnZvY2F0aW9ucyBvbiBzZWxlY3RlZCB0dHlzXG4iCisvL3VzYWdlOgkiCSNcbiIKKy8vdXNhZ2U6CSIJIyBTdGFydCBhbiBcImFza2ZpcnN0XCIgc2hlbGwgb24gdGhlIGNvbnNvbGUgKHdoYXRldmVyIHRoYXQgbWF5IGJlKVxuIgorLy91c2FnZToJIgk6OmFza2ZpcnN0Oi0vYmluL3NoXG4iCisvL3VzYWdlOgkiCSMgU3RhcnQgYW4gXCJhc2tmaXJzdFwiIHNoZWxsIG9uIC9kZXYvdHR5Mi00XG4iCisvL3VzYWdlOgkiCXR0eTI6OmFza2ZpcnN0Oi0vYmluL3NoXG4iCisvL3VzYWdlOgkiCXR0eTM6OmFza2ZpcnN0Oi0vYmluL3NoXG4iCisvL3VzYWdlOgkiCXR0eTQ6OmFza2ZpcnN0Oi0vYmluL3NoXG4iCisvL3VzYWdlOgkiCVxuIgorLy91c2FnZToJIgkjIC9zYmluL2dldHR5IGludm9jYXRpb25zIGZvciBzZWxlY3RlZCB0dHlzXG4iCisvL3VzYWdlOgkiCSNcbiIKKy8vdXNhZ2U6CSIJdHR5NDo6cmVzcGF3bjovc2Jpbi9nZXR0eSAzODQwMCB0dHk0XG4iCisvL3VzYWdlOgkiCXR0eTU6OnJlc3Bhd246L3NiaW4vZ2V0dHkgMzg0MDAgdHR5NVxuIgorLy91c2FnZToJIglcbiIKKy8vdXNhZ2U6CSIJXG4iCisvL3VzYWdlOgkiCSMgRXhhbXBsZSBvZiBob3cgdG8gcHV0IGEgZ2V0dHkgb24gYSBzZXJpYWwgbGluZSAoZm9yIGEgdGVybWluYWwpXG4iCisvL3VzYWdlOgkiCSNcbiIKKy8vdXNhZ2U6CSIJIzo6cmVzcGF3bjovc2Jpbi9nZXR0eSAtTCB0dHlTMCA5NjAwIHZ0MTAwXG4iCisvL3VzYWdlOgkiCSM6OnJlc3Bhd246L3NiaW4vZ2V0dHkgLUwgdHR5UzEgOTYwMCB2dDEwMFxuIgorLy91c2FnZToJIgkjXG4iCisvL3VzYWdlOgkiCSMgRXhhbXBsZSBob3cgdG8gcHV0IGEgZ2V0dHkgb24gYSBtb2RlbSBsaW5lXG4iCisvL3VzYWdlOgkiCSM6OnJlc3Bhd246L3NiaW4vZ2V0dHkgNTc2MDAgdHR5UzJcbiIKKy8vdXNhZ2U6CSIJXG4iCisvL3VzYWdlOgkiCSMgU3R1ZmYgdG8gZG8gd2hlbiByZXN0YXJ0aW5nIHRoZSBpbml0IHByb2Nlc3NcbiIKKy8vdXNhZ2U6CSIJOjpyZXN0YXJ0Oi9zYmluL2luaXRcbiIKKy8vdXNhZ2U6CSIJXG4iCisvL3VzYWdlOgkiCSMgU3R1ZmYgdG8gZG8gYmVmb3JlIHJlYm9vdGluZ1xuIgorLy91c2FnZToJIgk6OmN0cmxhbHRkZWw6L3NiaW4vcmVib290XG4iCisvL3VzYWdlOgkiCTo6c2h1dGRvd246L2Jpbi91bW91bnQgLWEgLXJcbiIKKy8vdXNhZ2U6CSIJOjpzaHV0ZG93bjovc2Jpbi9zd2Fwb2ZmIC1hXG4iCmRpZmYgLS1naXQgYS9pbml0L21lc2cuYyBiL2luaXQvbWVzZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzEzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L21lc2cuYwpAQCAtMCwwICsxLDc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtZXNnIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBNRVNHCisvL2NvbmZpZzoJYm9vbCAibWVzZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBNZXNnIGNvbnRyb2xzIGFjY2VzcyB0byB5b3VyIHRlcm1pbmFsIGJ5IG90aGVycy4gSXQgaXMgdHlwaWNhbGx5CisvL2NvbmZpZzoJICB1c2VkIHRvIGFsbG93IG9yIGRpc2FsbG93IG90aGVyIHVzZXJzIHRvIHdyaXRlIHRvIHlvdXIgdGVybWluYWwKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTUVTR19FTkFCTEVfT05MWV9HUk9VUAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSB3cml0aW5nIHRvIHR0eSBvbmx5IGJ5IGdyb3VwLCBub3QgYnkgZXZlcnlib2R5IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTUVTRworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFVzdWFsbHksIHR0eXMgYXJlIG93bmVkIGJ5IGdyb3VwICJ0dHkiLCBhbmQgIndyaXRlIiB0b29sIGlzCisvL2NvbmZpZzoJICBzZXRnaWQgdG8gdGhpcyBncm91cC4gVGhpcyB3YXksICJtZXNnIHkiIG9ubHkgbmVlZHMgdG8gZW5hYmxlCisvL2NvbmZpZzoJICAid3JpdGUgYnkgb3duaW5nIGdyb3VwIiBiaXQgaW4gdHR5IG1vZGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIElmIHlvdSBzZXQgdGhpcyBvcHRpb24gdG8gTiwgIm1lc2cgeSIgd2lsbCBlbmFibGUgd3JpdGluZworLy9jb25maWc6CSAgYnkgYW55Ym9keSBhdCBhbGwuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLgorCisvL2FwcGxldDpJRl9NRVNHKEFQUExFVChtZXNnLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX01FU0cpICs9IG1lc2cubworCisvL3VzYWdlOiNkZWZpbmUgbWVzZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW3l8bl0iCisvL3VzYWdlOiNkZWZpbmUgbWVzZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnRyb2wgd3JpdGUgYWNjZXNzIHRvIHlvdXIgdGVybWluYWxcbiIKKy8vdXNhZ2U6ICAgICAgICIJeQlBbGxvdyB3cml0ZSBhY2Nlc3MgdG8geW91ciB0ZXJtaW5hbFxuIgorLy91c2FnZTogICAgICAgIgluCURpc2FsbG93IHdyaXRlIGFjY2VzcyB0byB5b3VyIHRlcm1pbmFsIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVAKKyNkZWZpbmUgU19JV0dSUF9PUl9TX0lXT1RIICBTX0lXR1JQCisjZWxzZQorI2RlZmluZSBTX0lXR1JQX09SX1NfSVdPVEggIChTX0lXR1JQIHwgU19JV09USCkKKyNlbmRpZgorCitpbnQgbWVzZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWVzZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc2I7CisJbW9kZV90IG07CisJY2hhciBjID0gMDsKKworCWFyZ3YrKzsKKworCWlmIChhcmd2WzBdCisJICYmIChhcmd2WzFdIHx8ICgoYyA9IGFyZ3ZbMF1bMF0pICE9ICd5JyAmJiBjICE9ICduJykpCisJKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAoIWlzYXR0eShTVERJTl9GSUxFTk8pKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGEgdHR5Iik7CisKKwl4ZnN0YXQoU1RESU5fRklMRU5PLCAmc2IsICJzdGRlcnIiKTsKKwlpZiAoYyA9PSAwKSB7CisJCXB1dHMoKHNiLnN0X21vZGUgJiAoU19JV0dSUHxTX0lXT1RIKSkgPyAiaXMgeSIgOiAiaXMgbiIpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwltID0gKGMgPT0gJ3knKSA/IHNiLnN0X21vZGUgfCBTX0lXR1JQX09SX1NfSVdPVEgKKwkgICAgICAgICAgICAgICA6IHNiLnN0X21vZGUgJiB+KFNfSVdHUlB8U19JV09USCk7CisJaWYgKGZjaG1vZChTVERJTl9GSUxFTk8sIG0pICE9IDApCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2luaXQvcmVib290LmggYi9pbml0L3JlYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTc2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L3JlYm9vdC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBEZWZpbml0aW9ucyByZWxhdGVkIHRvIHRoZSByZWJvb3QoKSBzeXN0ZW0gY2FsbCwKKyAqIHNoYXJlZCBiZXR3ZWVuIGluaXQuYyBhbmQgaGFsdC5jLgorICovCisKKyNpbmNsdWRlIDxzeXMvcmVib290Lmg+CisKKyNpZm5kZWYgUkJfSEFMVF9TWVNURU0KKyMgaWYgZGVmaW5lZChfX2xpbnV4X18pCisjICBkZWZpbmUgUkJfSEFMVF9TWVNURU0gIDB4Y2RlZjAxMjMKKyMgIGRlZmluZSBSQl9FTkFCTEVfQ0FEICAgMHg4OWFiY2RlZgorIyAgZGVmaW5lIFJCX0RJU0FCTEVfQ0FEICAwCisjICBkZWZpbmUgUkJfUE9XRVJfT0ZGICAgIDB4NDMyMWZlZGMKKyMgIGRlZmluZSBSQl9BVVRPQk9PVCAgICAgMHgwMTIzNDU2NworIyBlbGlmIGRlZmluZWQoUkJfSEFMVCkKKyMgIGRlZmluZSBSQl9IQUxUX1NZU1RFTSAgUkJfSEFMVAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFN0b3Agc3lzdGVtIGFuZCBzd2l0Y2ggcG93ZXIgb2ZmIGlmIHBvc3NpYmxlLiAgKi8KKyNpZm5kZWYgUkJfUE9XRVJfT0ZGCisjIGlmIGRlZmluZWQoUkJfUE9XRVJET1dOKQorIyAgZGVmaW5lIFJCX1BPV0VSX09GRiAgUkJfUE9XRVJET1dOCisjIGVsaWYgZGVmaW5lZChfX2xpbnV4X18pCisjICBkZWZpbmUgUkJfUE9XRVJfT0ZGICAweDQzMjFmZWRjCisjIGVsc2UKKyMgIHdhcm5pbmcgInBvd2Vyb2ZmIHVuc3VwcG9ydGVkLCB1c2luZyBoYWx0IGFzIGZhbGxiYWNrIgorIyAgZGVmaW5lIFJCX1BPV0VSX09GRiAgUkJfSEFMVF9TWVNURU0KKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvQ29uZmlnLmluIGIvbGliYmIvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2VkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9Db25maWcuaW4KQEAgLTAsMCArMSwyMzIgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJCdXN5Ym94IExpYnJhcnkgVHVuaW5nIgorCitjb25maWcgRkVBVFVSRV9TWVNURU1ECisJYm9vbCAiRW5hYmxlIHN5c3RlbWQgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3UgcGxhbiB0byB1c2UgYnVzeWJveCBkYWVtb25zIG9uIGEgc3lzdGVtIHdoZXJlIGRhZW1vbnMKKwkgIGFyZSBjb250cm9sbGVkIGJ5IHN5c3RlbWQsIGVuYWJsZSB0aGlzIG9wdGlvbi4KKwkgIElmIHlvdSBkb24ndCB1c2Ugc3lzdGVtZCwgaXQgaXMgc3RpbGwgc2FmZSB0byBlbmFibGUgaXQsCisJICBidXQgdGhlIGRvd25zaWRlIGlzIGluY3JlYXNlZCBjb2RlIHNpemUuCitjb25maWcgRkVBVFVSRV9SVE1JTk1BWAorCWJvb2wgIlN1cHBvcnQgUlRNSU5bK25dIGFuZCBSVE1BWFstbl0gc2lnbmFsIG5hbWVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgUlRNSU5bK25dIGFuZCBSVE1BWFstbl0gc2lnbmFsIG5hbWVzCisJICBpbiBraWxsLCBraWxsYWxsIGV0Yy4gVGhpcyBjb3N0cyB+MjUwIGJ5dGVzLgorCitjb25maWcgUEFTU1dPUkRfTUlOTEVOCisJaW50ICJNaW5pbXVtIHBhc3N3b3JkIGxlbmd0aCIKKwlkZWZhdWx0IDYKKwlyYW5nZSA1IDMyCisJaGVscAorCSAgTWluaW11bSBhbGxvd2FibGUgcGFzc3dvcmQgbGVuZ3RoLgorCitjb25maWcgTUQ1X1NJWkVfVlNfU1BFRUQKKwlpbnQgIk1ENTogVHJhZGUgYnl0ZXMgZm9yIHNwZWVkICgwOmZhc3QsIDM6c2xvdykiCisJZGVmYXVsdCAyCisJcmFuZ2UgMCAzCisJaGVscAorCSAgVHJhZGUgYmluYXJ5IHNpemUgdmVyc3VzIHNwZWVkIGZvciB0aGUgbWQ1c3VtIGFsZ29yaXRobS4KKwkgIEFwcHJveGltYXRlIHZhbHVlcyBydW5uaW5nIHVDbGliYyBhbmQgaGFzaGluZworCSAgbGludXgtMi40LjQudGFyLmJ6MiB3ZXJlOgorCSAgICAgICAgICAgICAgICAgICAgdXNlciB0aW1lcyAoc2VjKSAgdGV4dCBzaXplICgzODYpCisJICAwIChmYXN0ZXN0KSAgICAgICAgIDEuMSAgICAgICAgICAgICAgICA2MTQ0CisJICAxICAgICAgICAgICAgICAgICAgIDEuNCAgICAgICAgICAgICAgICA1MzkyCisJICAyICAgICAgICAgICAgICAgICAgIDMuMCAgICAgICAgICAgICAgICA1MDg4CisJICAzIChzbWFsbGVzdCkgICAgICAgIDUuMSAgICAgICAgICAgICAgICA0OTEyCisKK2NvbmZpZyBGRUFUVVJFX0ZBU1RfVE9QCisJYm9vbCAiRmFzdGVyIC9wcm9jIHNjYW5uaW5nIGNvZGUgKCsxMDAgYnl0ZXMpIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIHRvcCAoYW5kIHBzKSB+MjAlIGZhc3RlciAob3IgMjAlIGxlc3MgQ1BVIGh1bmdyeSksCisJICBidXQgY29kZSBzaXplIGlzIHNsaWdodGx5IGJpZ2dlci4KKworY29uZmlnIEZFQVRVUkVfRVRDX05FVFdPUktTCisJYm9vbCAiU3VwcG9ydCBmb3IgL2V0Yy9uZXR3b3JrcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgbmV0d29yayBuYW1lcyBpbiAvZXRjL25ldHdvcmtzLiBUaGlzIGlzCisJICBhIHJhcmVseSB1c2VkIGZlYXR1cmUgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgbmFtZXMKKwkgIGluc3RlYWQgb2YgSVAvbWFzayBwYWlycyBpbiByb3V0ZSBjb21tYW5kLgorCitjb25maWcgRkVBVFVSRV9VU0VfVEVSTUlPUworCWJvb2wgIlVzZSB0ZXJtaW9zIHRvIG1hbmlwdWxhdGUgdGhlIHNjcmVlbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PUkUgfHwgVE9QIHx8IFBPV0VSVE9QCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHV0aWxpdGllcyBzdWNoIGFzICdtb3JlJyBhbmQgJ3RvcCcgdG8gZGV0ZXJtaW5lCisJICB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuLiBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgeW91ciB1dGlsaXRpZXMKKwkgIHRoYXQgZGlzcGxheSB0aGluZ3Mgb24gdGhlIHNjcmVlbiB3aWxsIGJlIGVzcGVjaWFsbHkgcHJpbWl0aXZlIGFuZAorCSAgd2lsbCBiZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLCBhbmQgd2lsbCBiZQorCSAgdW5hYmxlIHRvIG1vdmUgdGhlIGN1cnNvci4KKworY29uZmlnIEZFQVRVUkVfRURJVElORworCWJvb2wgIkNvbW1hbmQgbGluZSBlZGl0aW5nIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBsaW5lIGVkaXRpbmcgKG1haW5seSBmb3Igc2hlbGwgY29tbWFuZCBsaW5lKS4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19NQVhfTEVOCisJaW50ICJNYXhpbXVtIGxlbmd0aCBvZiBpbnB1dCIKKwlyYW5nZSAxMjggODE5MgorCWRlZmF1bHQgMTAyNAorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgTGluZSBlZGl0aW5nIGNvZGUgdXNlcyBvbi1zdGFjayBidWZmZXJzIGZvciBzdG9yYWdlLgorCSAgWW91IG1heSB3YW50IHRvIGRlY3JlYXNlIHRoaXMgcGFyYW1ldGVyIGlmIHlvdXIgdGFyZ2V0IG1hY2hpbmUKKwkgIGJlbmVmaXRzIGZyb20gc21hbGxlciBzdGFjayB1c2FnZS4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19WSQorCWJvb2wgInZpLXN0eWxlIGxpbmUgZWRpdGluZyBjb21tYW5kcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEVuYWJsZSB2aS1zdHlsZSBsaW5lIGVkaXRpbmcuIEluIHNoZWxscywgdGhpcyBtb2RlIGNhbiBiZQorCSAgdHVybmVkIG9uIGFuZCBvZmYgd2l0aCAic2V0IC1vIHZpIiBhbmQgInNldCArbyB2aSIuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfSElTVE9SWQorCWludCAiSGlzdG9yeSBzaXplIgorCSMgRG9uJ3QgYWxsb3cgd2F5IHRvbyBiaWcgdmFsdWVzIGhlcmUsIGNvZGUgdXNlcyBmaXhlZCAiY2hhciAqaGlzdG9yeVtOXSIgc3RydWN0IG1lbWJlcgorCXJhbmdlIDAgOTk5OQorCWRlZmF1bHQgMjU1CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBTcGVjaWZ5IGNvbW1hbmQgaGlzdG9yeSBzaXplICgwIC0gZGlzYWJsZSkuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwlib29sICJIaXN0b3J5IHNhdmluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEVuYWJsZSBoaXN0b3J5IHNhdmluZyBpbiBzaGVsbHMuCisKK2NvbmZpZyBGRUFUVVJFX1JFVkVSU0VfU0VBUkNICisJYm9vbCAiUmV2ZXJzZSBoaXN0b3J5IHNlYXJjaCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCWhlbHAKKwkgIEVuYWJsZSByZWFkbGluZS1saWtlIEN0cmwtUiBjb21iaW5hdGlvbiBmb3IgcmV2ZXJzZSBoaXN0b3J5IHNlYXJjaC4KKwkgIEluY3JlYXNlcyBjb2RlIGJ5IGFib3V0IDAuNWsuCisKK2NvbmZpZyBGRUFUVVJFX1RBQl9DT01QTEVUSU9OCisJYm9vbCAiVGFiIGNvbXBsZXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBFbmFibGUgdGFiIGNvbXBsZXRpb24uCisKK2NvbmZpZyBGRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04KKwlib29sICJVc2VybmFtZSBjb21wbGV0aW9uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCWhlbHAKKwkgIEVuYWJsZSB1c2VybmFtZSBjb21wbGV0aW9uLgorCitjb25maWcgRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorCWJvb2wgIkZhbmN5IHNoZWxsIHByb21wdHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBTZXR0aW5nIHRoaXMgb3B0aW9uIGFsbG93cyBmb3IgcHJvbXB0cyB0byB1c2UgdGhpbmdzIGxpa2UgXHcgYW5kCisJICBcJCBhbmQgZXNjYXBlIGNvZGVzLgorCitjb25maWcgRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorCWJvb2wgIlF1ZXJ5IGN1cnNvciBwb3NpdGlvbiBmcm9tIHRlcm1pbmFsIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgQWxsb3cgdXNhZ2Ugb2YgIkVTQyBbIDYgbiIgc2VxdWVuY2UuIFRlcm1pbmFsIGFuc3dlcnMgYmFjayB3aXRoCisJICBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIG1ha2UgbGluZQorCSAgZWRpdGluZyBtb3JlIHJvYnVzdCBpbiBzb21lIGNhc2VzLgorCSAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdXIgdGVybWluYWxzIHJlc3BvbmQgdG8gdGhpcyBjb2RlCisJICBjb3JyZWN0bHksIG9yIHdhbnQgdG8gc2F2ZSBvbiBjb2RlIHNpemUgKGFib3V0IDQwMCBieXRlcyksCisJICB0aGVuIGRvIG5vdCB0dXJuIHRoaXMgb3B0aW9uIG9uLgorCitjb25maWcgRkVBVFVSRV9OT05fUE9TSVhfQ1AKKwlib29sICJOb24tUE9TSVgsIGJ1dCBzYWZlciwgY29weWluZyB0byBzcGVjaWFsIG5vZGVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24sICJjcCBmaWxlIHN5bWxpbmsiIHdpbGwgZGVsZXRlIHN5bWxpbmsKKwkgIGFuZCBjcmVhdGUgYSByZWd1bGFyIGZpbGUuIFRoaXMgZG9lcyBub3QgY29uZm9ybSB0byBQT1NJWCwKKwkgIGJ1dCBwcmV2ZW50cyBhIHN5bWxpbmsgYXR0YWNrLgorCSAgU2ltaWxhcmx5LCAiY3AgZmlsZSBkZXZpY2UiIHdpbGwgbm90IHNlbmQgZmlsZSdzIGRhdGEKKwkgIHRvIHRoZSBkZXZpY2UuIChUbyBkbyB0aGF0LCB1c2UgImNhdCBmaWxlID5kZXZpY2UiKQorCitjb25maWcgRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0UKKwlib29sICJHaXZlIG1vcmUgcHJlY2lzZSBtZXNzYWdlcyB3aGVuIGNvcHkgZmFpbHMgKGNwLCBtdiBldGMpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVycm9yIG1lc3NhZ2VzIHdpdGggdGhpcyBmZWF0dXJlIGVuYWJsZWQ6CisJICAgICQgY3AgZmlsZSAvZG9lc19ub3RfZXhpc3QvZmlsZQorCSAgICBjcDogY2Fubm90IGNyZWF0ZSAnL2RvZXNfbm90X2V4aXN0L2ZpbGUnOiBQYXRoIGRvZXMgbm90IGV4aXN0CisJICAgICQgY3AgZmlsZSAvdm1saW51ei9maWxlCisJICAgIGNwOiBjYW5ub3Qgc3RhdCAnL3ZtbGludXovZmlsZSc6IFBhdGggaGFzIG5vbi1kaXJlY3RvcnkgY29tcG9uZW50CisJICBJZiB0aGlzIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIHRoZXkgd2lsbCBiZSwgcmVzcGVjdGl2ZWx5OgorCSAgICBjcDogY2Fubm90IGNyZWF0ZSAnL2RvZXNfbm90X2V4aXN0L2ZpbGUnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisJICAgIGNwOiBjYW5ub3Qgc3RhdCAnL3ZtbGludXovZmlsZSc6IE5vdCBhIGRpcmVjdG9yeQorCSAgVGhpcyB3aWxsIGNvc3QgeW91IH42MCBieXRlcy4KKworY29uZmlnIEZFQVRVUkVfQ09QWUJVRl9LQgorCWludCAiQ29weSBidWZmZXIgc2l6ZSwgaW4ga2lsb2J5dGVzIgorCXJhbmdlIDEgMTAyNAorCWRlZmF1bHQgNAorCWhlbHAKKwkgIFNpemUgb2YgYnVmZmVyIHVzZWQgYnkgY3AsIG12LCBpbnN0YWxsLCB3Z2V0IGV0Yy4KKwkgIEJ1ZmZlcnMgd2hpY2ggYXJlIDQga2Igb3IgbGVzcyB3aWxsIGJlIGFsbG9jYXRlZCBvbiBzdGFjay4KKwkgIEJpZ2dlciBidWZmZXJzIHdpbGwgYmUgYWxsb2NhdGVkIHdpdGggbW1hcCwgd2l0aCBmYWxsYmFjayB0byA0IGtiCisJICBzdGFjayBidWZmZXIgaWYgbW1hcCBmYWlscy4KKworY29uZmlnIEZFQVRVUkVfU0tJUF9ST09URlMKKwlib29sICJTa2lwIHJvb3RmcyBpbiBtb3VudCB0YWJsZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZ25vcmUgcm9vdGZzIGVudHJ5IGluIG1vdW50IHRhYmxlLgorCisJICBJbiBMaW51eCwga2VybmVsIGhhcyBhIHNwZWNpYWwgZmlsZXN5c3RlbSwgcm9vdGZzLCB3aGljaCBpcyBpbml0aWFsbHkKKwkgIG1vdW50ZWQgb24gLy4gSXQgY29udGFpbnMgaW5pdHJhbWZzIGRhdGEsIGlmIGtlcm5lbCBpcyBjb25maWd1cmVkCisJICB0byBoYXZlIG9uZS4gVXN1YWxseSwgYW5vdGhlciBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIG92ZXIgLyBlYXJseQorCSAgaW4gYm9vdCBwcm9jZXNzLCBhbmQgdGhlcmVmb3JlIG1vc3QgdG9vbHMgd2hpY2ggbWFuaXB1bGF0ZQorCSAgbW91bnQgdGFibGUsIHN1Y2ggYXMgZGYsIHdpbGwgc2tpcCByb290ZnMgZW50cnkuCisKKwkgIEhvd2V2ZXIsIHNvbWUgc3lzdGVtcyBkbyBub3QgbW91bnQgYW55dGhpbmcgb24gLy4KKwkgIElmIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSBidXN5Ym94IGZvciBvbmUgb2YgdGhlc2Ugc3lzdGVtcywKKwkgIHlvdSBtYXkgZmluZCB1c2VmdWwgdG8gdHVybiB0aGlzIG9wdGlvbiBvZmYgdG8gbWFrZSBkZiBzaG93CisJICBpbml0cmFtZnMgc3RhdGlzdGljLgorCisJICBPdGhlcndpc2UsIGNob29zZSBZLgorCitjb25maWcgTU9OT1RPTklDX1NZU0NBTEwKKwlib29sICJVc2UgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIHN5c2NhbGwiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXNlIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBzeXNjYWxsIGZvciBtZWFzdXJpbmcKKwkgIHRpbWUgaW50ZXJ2YWxzICh0aW1lLCBwaW5nLCB0cmFjZXJvdXRlIGV0YyBuZWVkIHRoaXMpLgorCSAgUHJvYmFibHkgcmVxdWlyZXMgTGludXggMi42Ky4gSWYgbm90IHNlbGVjdGVkLCBnZXR0aW1lb2ZkYXkKKwkgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkICh3aGljaCBnaXZlcyB3cm9uZyByZXN1bHRzIGlmIGRhdGUvdGltZQorCSAgaXMgcmVzZXQpLgorCitjb25maWcgSU9DVExfSEVYMlNUUl9FUlJPUgorCWJvb2wgIlVzZSBpb2N0bCBuYW1lcyByYXRoZXIgdGhhbiBoZXggdmFsdWVzIGluIGVycm9yIG1lc3NhZ2VzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFVzZSBpb2N0bCBuYW1lcyByYXRoZXIgdGhhbiBoZXggdmFsdWVzIGluIGVycm9yIG1lc3NhZ2VzCisJICAoZS5nLiBWVF9ESVNBTExPQ0FURSByYXRoZXIgdGhhbiAweDU2MDgpLiBJZiBkaXNhYmxlZCB0aGlzCisJICBzYXZlcyBhYm91dCAxNDAwIGJ5dGVzLgorCitjb25maWcgRkVBVFVSRV9IV0lCCisJYm9vbCAiU3VwcG9ydCBpbmZpbmliYW5kIEhXIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHByaW50aW5nIGluZmluaWJhbmQgYWRkcmVzc2VzIGluCisJICBuZXR3b3JrIGFwcGxldHMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2xpYmJiL0NvbmZpZy5zcmMgYi9saWJiYi9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDQyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjE4IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJCdXN5Ym94IExpYnJhcnkgVHVuaW5nIgorCitJTlNFUlQKKworY29uZmlnIFBBU1NXT1JEX01JTkxFTgorCWludCAiTWluaW11bSBwYXNzd29yZCBsZW5ndGgiCisJZGVmYXVsdCA2CisJcmFuZ2UgNSAzMgorCWhlbHAKKwkgIE1pbmltdW0gYWxsb3dhYmxlIHBhc3N3b3JkIGxlbmd0aC4KKworY29uZmlnIE1ENV9TSVpFX1ZTX1NQRUVECisJaW50ICJNRDU6IFRyYWRlIGJ5dGVzIGZvciBzcGVlZCAoMDpmYXN0LCAzOnNsb3cpIgorCWRlZmF1bHQgMgorCXJhbmdlIDAgMworCWhlbHAKKwkgIFRyYWRlIGJpbmFyeSBzaXplIHZlcnN1cyBzcGVlZCBmb3IgdGhlIG1kNXN1bSBhbGdvcml0aG0uCisJICBBcHByb3hpbWF0ZSB2YWx1ZXMgcnVubmluZyB1Q2xpYmMgYW5kIGhhc2hpbmcKKwkgIGxpbnV4LTIuNC40LnRhci5iejIgd2VyZToKKwkgICAgICAgICAgICAgICAgICAgIHVzZXIgdGltZXMgKHNlYykgIHRleHQgc2l6ZSAoMzg2KQorCSAgMCAoZmFzdGVzdCkgICAgICAgICAxLjEgICAgICAgICAgICAgICAgNjE0NAorCSAgMSAgICAgICAgICAgICAgICAgICAxLjQgICAgICAgICAgICAgICAgNTM5MgorCSAgMiAgICAgICAgICAgICAgICAgICAzLjAgICAgICAgICAgICAgICAgNTA4OAorCSAgMyAoc21hbGxlc3QpICAgICAgICA1LjEgICAgICAgICAgICAgICAgNDkxMgorCitjb25maWcgRkVBVFVSRV9GQVNUX1RPUAorCWJvb2wgIkZhc3RlciAvcHJvYyBzY2FubmluZyBjb2RlICgrMTAwIGJ5dGVzKSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBtYWtlcyB0b3AgKGFuZCBwcykgfjIwJSBmYXN0ZXIgKG9yIDIwJSBsZXNzIENQVSBodW5ncnkpLAorCSAgYnV0IGNvZGUgc2l6ZSBpcyBzbGlnaHRseSBiaWdnZXIuCisKK2NvbmZpZyBGRUFUVVJFX0VUQ19ORVRXT1JLUworCWJvb2wgIlN1cHBvcnQgZm9yIC9ldGMvbmV0d29ya3MiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIG5ldHdvcmsgbmFtZXMgaW4gL2V0Yy9uZXR3b3Jrcy4gVGhpcyBpcworCSAgYSByYXJlbHkgdXNlZCBmZWF0dXJlIHdoaWNoIGFsbG93cyB5b3UgdG8gdXNlIG5hbWVzCisJICBpbnN0ZWFkIG9mIElQL21hc2sgcGFpcnMgaW4gcm91dGUgY29tbWFuZC4KKworY29uZmlnIEZFQVRVUkVfVVNFX1RFUk1JT1MKKwlib29sICJVc2UgdGVybWlvcyB0byBtYW5pcHVsYXRlIHRoZSBzY3JlZW4iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1JFIHx8IFRPUCB8fCBQT1dFUlRPUAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB1dGlsaXRpZXMgc3VjaCBhcyAnbW9yZScgYW5kICd0b3AnIHRvIGRldGVybWluZQorCSAgdGhlIHNpemUgb2YgdGhlIHNjcmVlbi4gSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIHlvdXIgdXRpbGl0aWVzCisJICB0aGF0IGRpc3BsYXkgdGhpbmdzIG9uIHRoZSBzY3JlZW4gd2lsbCBiZSBlc3BlY2lhbGx5IHByaW1pdGl2ZSBhbmQKKwkgIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZSwgYW5kIHdpbGwgYmUKKwkgIHVuYWJsZSB0byBtb3ZlIHRoZSBjdXJzb3IuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkcKKwlib29sICJDb21tYW5kIGxpbmUgZWRpdGluZyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgbGluZSBlZGl0aW5nIChtYWlubHkgZm9yIHNoZWxsIGNvbW1hbmQgbGluZSkuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfTUFYX0xFTgorCWludCAiTWF4aW11bSBsZW5ndGggb2YgaW5wdXQiCisJcmFuZ2UgMTI4IDgxOTIKKwlkZWZhdWx0IDEwMjQKKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIExpbmUgZWRpdGluZyBjb2RlIHVzZXMgb24tc3RhY2sgYnVmZmVycyBmb3Igc3RvcmFnZS4KKwkgIFlvdSBtYXkgd2FudCB0byBkZWNyZWFzZSB0aGlzIHBhcmFtZXRlciBpZiB5b3VyIHRhcmdldCBtYWNoaW5lCisJICBiZW5lZml0cyBmcm9tIHNtYWxsZXIgc3RhY2sgdXNhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfVkkKKwlib29sICJ2aS1zdHlsZSBsaW5lIGVkaXRpbmcgY29tbWFuZHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBFbmFibGUgdmktc3R5bGUgbGluZSBlZGl0aW5nLiBJbiBzaGVsbHMsIHRoaXMgbW9kZSBjYW4gYmUKKwkgIHR1cm5lZCBvbiBhbmQgb2ZmIHdpdGggInNldCAtbyB2aSIgYW5kICJzZXQgK28gdmkiLgorCitjb25maWcgRkVBVFVSRV9FRElUSU5HX0hJU1RPUlkKKwlpbnQgIkhpc3Rvcnkgc2l6ZSIKKwkjIERvbid0IGFsbG93IHdheSB0b28gYmlnIHZhbHVlcyBoZXJlLCBjb2RlIHVzZXMgZml4ZWQgImNoYXIgKmhpc3RvcnlbTl0iIHN0cnVjdCBtZW1iZXIKKwlyYW5nZSAwIDk5OTkKKwlkZWZhdWx0IDI1NQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgU3BlY2lmeSBjb21tYW5kIGhpc3Rvcnkgc2l6ZSAoMCAtIGRpc2FibGUpLgorCitjb25maWcgRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJYm9vbCAiSGlzdG9yeSBzYXZpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBFbmFibGUgaGlzdG9yeSBzYXZpbmcgaW4gc2hlbGxzLgorCitjb25maWcgRkVBVFVSRV9SRVZFUlNFX1NFQVJDSAorCWJvb2wgIlJldmVyc2UgaGlzdG9yeSBzZWFyY2giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwloZWxwCisJICBFbmFibGUgcmVhZGxpbmUtbGlrZSBDdHJsLVIgY29tYmluYXRpb24gZm9yIHJldmVyc2UgaGlzdG9yeSBzZWFyY2guCisJICBJbmNyZWFzZXMgY29kZSBieSBhYm91dCAwLjVrLgorCitjb25maWcgRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCWJvb2wgIlRhYiBjb21wbGV0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgRW5hYmxlIHRhYiBjb21wbGV0aW9uLgorCitjb25maWcgRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJYm9vbCAiVXNlcm5hbWUgY29tcGxldGlvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwloZWxwCisJICBFbmFibGUgdXNlcm5hbWUgY29tcGxldGlvbi4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwlib29sICJGYW5jeSBzaGVsbCBwcm9tcHRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgZm9yIHByb21wdHMgdG8gdXNlIHRoaW5ncyBsaWtlIFx3IGFuZAorCSAgXCQgYW5kIGVzY2FwZSBjb2Rlcy4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwlib29sICJRdWVyeSBjdXJzb3IgcG9zaXRpb24gZnJvbSB0ZXJtaW5hbCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEFsbG93IHVzYWdlIG9mICJFU0MgWyA2IG4iIHNlcXVlbmNlLiBUZXJtaW5hbCBhbnN3ZXJzIGJhY2sgd2l0aAorCSAgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBtYWtlIGxpbmUKKwkgIGVkaXRpbmcgbW9yZSByb2J1c3QgaW4gc29tZSBjYXNlcy4KKwkgIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3VyIHRlcm1pbmFscyByZXNwb25kIHRvIHRoaXMgY29kZQorCSAgY29ycmVjdGx5LCBvciB3YW50IHRvIHNhdmUgb24gY29kZSBzaXplIChhYm91dCA0MDAgYnl0ZXMpLAorCSAgdGhlbiBkbyBub3QgdHVybiB0aGlzIG9wdGlvbiBvbi4KKworY29uZmlnIEZFQVRVUkVfTk9OX1BPU0lYX0NQCisJYm9vbCAiTm9uLVBPU0lYLCBidXQgc2FmZXIsIGNvcHlpbmcgdG8gc3BlY2lhbCBub2RlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uLCAiY3AgZmlsZSBzeW1saW5rIiB3aWxsIGRlbGV0ZSBzeW1saW5rCisJICBhbmQgY3JlYXRlIGEgcmVndWxhciBmaWxlLiBUaGlzIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCisJICBidXQgcHJldmVudHMgYSBzeW1saW5rIGF0dGFjay4KKwkgIFNpbWlsYXJseSwgImNwIGZpbGUgZGV2aWNlIiB3aWxsIG5vdCBzZW5kIGZpbGUncyBkYXRhCisJICB0byB0aGUgZGV2aWNlLiAoVG8gZG8gdGhhdCwgdXNlICJjYXQgZmlsZSA+ZGV2aWNlIikKKworY29uZmlnIEZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJYm9vbCAiR2l2ZSBtb3JlIHByZWNpc2UgbWVzc2FnZXMgd2hlbiBjb3B5IGZhaWxzIChjcCwgbXYgZXRjKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFcnJvciBtZXNzYWdlcyB3aXRoIHRoaXMgZmVhdHVyZSBlbmFibGVkOgorCSAgICAkIGNwIGZpbGUgL2RvZXNfbm90X2V4aXN0L2ZpbGUKKwkgICAgY3A6IGNhbm5vdCBjcmVhdGUgJy9kb2VzX25vdF9leGlzdC9maWxlJzogUGF0aCBkb2VzIG5vdCBleGlzdAorCSAgICAkIGNwIGZpbGUgL3ZtbGludXovZmlsZQorCSAgICBjcDogY2Fubm90IHN0YXQgJy92bWxpbnV6L2ZpbGUnOiBQYXRoIGhhcyBub24tZGlyZWN0b3J5IGNvbXBvbmVudAorCSAgSWYgdGhpcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGV5IHdpbGwgYmUsIHJlc3BlY3RpdmVseToKKwkgICAgY3A6IGNhbm5vdCBjcmVhdGUgJy9kb2VzX25vdF9leGlzdC9maWxlJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorCSAgICBjcDogY2Fubm90IHN0YXQgJy92bWxpbnV6L2ZpbGUnOiBOb3QgYSBkaXJlY3RvcnkKKwkgIFRoaXMgd2lsbCBjb3N0IHlvdSB+NjAgYnl0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0NPUFlCVUZfS0IKKwlpbnQgIkNvcHkgYnVmZmVyIHNpemUsIGluIGtpbG9ieXRlcyIKKwlyYW5nZSAxIDEwMjQKKwlkZWZhdWx0IDQKKwloZWxwCisJICBTaXplIG9mIGJ1ZmZlciB1c2VkIGJ5IGNwLCBtdiwgaW5zdGFsbCwgd2dldCBldGMuCisJICBCdWZmZXJzIHdoaWNoIGFyZSA0IGtiIG9yIGxlc3Mgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc3RhY2suCisJICBCaWdnZXIgYnVmZmVycyB3aWxsIGJlIGFsbG9jYXRlZCB3aXRoIG1tYXAsIHdpdGggZmFsbGJhY2sgdG8gNCBrYgorCSAgc3RhY2sgYnVmZmVyIGlmIG1tYXAgZmFpbHMuCisKK2NvbmZpZyBGRUFUVVJFX1NLSVBfUk9PVEZTCisJYm9vbCAiU2tpcCByb290ZnMgaW4gbW91bnQgdGFibGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWdub3JlIHJvb3RmcyBlbnRyeSBpbiBtb3VudCB0YWJsZS4KKworCSAgSW4gTGludXgsIGtlcm5lbCBoYXMgYSBzcGVjaWFsIGZpbGVzeXN0ZW0sIHJvb3Rmcywgd2hpY2ggaXMgaW5pdGlhbGx5CisJICBtb3VudGVkIG9uIC8uIEl0IGNvbnRhaW5zIGluaXRyYW1mcyBkYXRhLCBpZiBrZXJuZWwgaXMgY29uZmlndXJlZAorCSAgdG8gaGF2ZSBvbmUuIFVzdWFsbHksIGFub3RoZXIgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCBvdmVyIC8gZWFybHkKKwkgIGluIGJvb3QgcHJvY2VzcywgYW5kIHRoZXJlZm9yZSBtb3N0IHRvb2xzIHdoaWNoIG1hbmlwdWxhdGUKKwkgIG1vdW50IHRhYmxlLCBzdWNoIGFzIGRmLCB3aWxsIHNraXAgcm9vdGZzIGVudHJ5LgorCisJICBIb3dldmVyLCBzb21lIHN5c3RlbXMgZG8gbm90IG1vdW50IGFueXRoaW5nIG9uIC8uCisJICBJZiB5b3UgbmVlZCB0byBjb25maWd1cmUgYnVzeWJveCBmb3Igb25lIG9mIHRoZXNlIHN5c3RlbXMsCisJICB5b3UgbWF5IGZpbmQgdXNlZnVsIHRvIHR1cm4gdGhpcyBvcHRpb24gb2ZmIHRvIG1ha2UgZGYgc2hvdworCSAgaW5pdHJhbWZzIHN0YXRpc3RpYy4KKworCSAgT3RoZXJ3aXNlLCBjaG9vc2UgWS4KKworY29uZmlnIE1PTk9UT05JQ19TWVNDQUxMCisJYm9vbCAiVXNlIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBzeXNjYWxsIgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFVzZSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykgc3lzY2FsbCBmb3IgbWVhc3VyaW5nCisJICB0aW1lIGludGVydmFscyAodGltZSwgcGluZywgdHJhY2Vyb3V0ZSBldGMgbmVlZCB0aGlzKS4KKwkgIFByb2JhYmx5IHJlcXVpcmVzIExpbnV4IDIuNisuIElmIG5vdCBzZWxlY3RlZCwgZ2V0dGltZW9mZGF5CisJICB3aWxsIGJlIHVzZWQgaW5zdGVhZCAod2hpY2ggZ2l2ZXMgd3JvbmcgcmVzdWx0cyBpZiBkYXRlL3RpbWUKKwkgIGlzIHJlc2V0KS4KKworY29uZmlnIElPQ1RMX0hFWDJTVFJfRVJST1IKKwlib29sICJVc2UgaW9jdGwgbmFtZXMgcmF0aGVyIHRoYW4gaGV4IHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVc2UgaW9jdGwgbmFtZXMgcmF0aGVyIHRoYW4gaGV4IHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlcworCSAgKGUuZy4gVlRfRElTQUxMT0NBVEUgcmF0aGVyIHRoYW4gMHg1NjA4KS4gSWYgZGlzYWJsZWQgdGhpcworCSAgc2F2ZXMgYWJvdXQgMTQwMCBieXRlcy4KKworY29uZmlnIEZFQVRVUkVfSFdJQgorCWJvb2wgIlN1cHBvcnQgaW5maW5pYmFuZCBIVyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTdXBwb3J0IGZvciBwcmludGluZyBpbmZpbmliYW5kIGFkZHJlc3NlcyBpbgorCSAgbmV0d29yayBhcHBsZXRzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9saWJiYi9LYnVpbGQuc3JjIGIvbGliYmIvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVkMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE4MiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYmJiL2FwcGxldGxpYi5vOiBpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaAorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWIteSArPSBhcHBsZXRsaWIubworbGliLXkgKz0gYXNrX2NvbmZpcm1hdGlvbi5vCitsaWIteSArPSBiYl9hc2twYXNzLm8KK2xpYi15ICs9IGJiX2Jzd2FwXzY0Lm8KK2xpYi15ICs9IGJiX2RvX2RlbGF5Lm8KK2xpYi15ICs9IGJiX3B3ZC5vCitsaWIteSArPSBiYl9xc29ydC5vCisjbGliLXkgKz0gYmJfc3RydG9kLm8KK2xpYi15ICs9IGJiX3N0cnRvbnVtLm8KK2xpYi15ICs9IGNoYW5nZV9pZGVudGl0eS5vCitsaWIteSArPSBjaG9tcC5vCitsaWIteSArPSBjb21wYXJlX3N0cmluZ19hcnJheS5vCitsaWIteSArPSBjb25jYXRfcGF0aF9maWxlLm8KK2xpYi15ICs9IGNvbmNhdF9zdWJwYXRoX2ZpbGUubworbGliLXkgKz0gY29weV9maWxlLm8KK2xpYi15ICs9IGNvcHlmZC5vCitsaWIteSArPSBjcmMzMi5vCitsaWIteSArPSBjcmVhdGVfaWNtcDZfc29ja2V0Lm8KK2xpYi15ICs9IGNyZWF0ZV9pY21wX3NvY2tldC5vCitsaWIteSArPSBkZWZhdWx0X2Vycm9yX3JldHZhbC5vCitsaWIteSArPSBkZXZpY2Vfb3Blbi5vCitsaWIteSArPSBkdW1wLm8KK2xpYi15ICs9IGV4ZWNhYmxlLm8KK2xpYi15ICs9IGZjbG9zZV9ub25zdGRpbi5vCitsaWIteSArPSBmZmx1c2hfc3Rkb3V0X2FuZF9leGl0Lm8KK2xpYi15ICs9IGZnZXRzX3N0ci5vCitsaWIteSArPSBmaW5kX3BpZF9ieV9uYW1lLm8KK2xpYi15ICs9IGZpbmRfcm9vdF9kZXZpY2UubworbGliLXkgKz0gZnVsbF93cml0ZS5vCitsaWIteSArPSBnZXRfY29uc29sZS5vCitsaWIteSArPSBnZXRfbGFzdF9wYXRoX2NvbXBvbmVudC5vCitsaWIteSArPSBnZXRfbGluZV9mcm9tX2ZpbGUubworbGliLXkgKz0gZ2V0b3B0MzIubworbGliLXkgKz0gZ2V0cHR5Lm8KK2xpYi15ICs9IGdldF92b2xzaXplLm8KK2xpYi15ICs9IGhlcnJvcl9tc2cubworbGliLXkgKz0gaHVtYW5fcmVhZGFibGUubworbGliLXkgKz0gaW5ldF9jb21tb24ubworbGliLXkgKz0gaW5mb19tc2cubworbGliLXkgKz0gaW5vZGVfaGFzaC5vCitsaWIteSArPSBpc2RpcmVjdG9yeS5vCitsaWIteSArPSBrZXJuZWxfdmVyc2lvbi5vCitsaWIteSArPSBsYXN0X2NoYXJfaXMubworbGliLXkgKz0gbGluZWVkaXQubyBsaW5lZWRpdF9wdHJfaGFjay5vCitsaWIteSArPSBsbGlzdC5vCitsaWIteSArPSBsb2dpbi5vCitsaWIteSArPSBtYWtlX2RpcmVjdG9yeS5vCitsaWIteSArPSBtYWtlZGV2Lm8KK2xpYi15ICs9IGhhc2hfbWQ1X3NoYS5vCisjIEFsdGVybmF0aXZlIChkaXNhYmxlZCkgTUQ1IGltcGxlbWVudGF0aW9uCisjbGliLXkgKz0gaGFzaF9tZDVwcmltZS5vCitsaWIteSArPSBtZXNzYWdlcy5vCitsaWIteSArPSBtb2RlX3N0cmluZy5vCitsaWIteSArPSBwYXJzZV9tb2RlLm8KK2xpYi15ICs9IHBlcnJvcl9tc2cubworbGliLXkgKz0gcGVycm9yX25vbXNnLm8KK2xpYi15ICs9IHBlcnJvcl9ub21zZ19hbmRfZGllLm8KK2xpYi15ICs9IHBpZGZpbGUubworbGliLXkgKz0gcGxhdGZvcm0ubworbGliLXkgKz0gcHJpbnRhYmxlLm8KK2xpYi15ICs9IHByaW50YWJsZV9zdHJpbmcubworbGliLXkgKz0gcHJpbnRfZmxhZ3MubworbGliLXkgKz0gcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UubworbGliLXkgKz0gcHJvY3BzLm8KK2xpYi15ICs9IHByb2dyZXNzLm8KK2xpYi15ICs9IHB0cl90b19nbG9iYWxzLm8KK2xpYi15ICs9IHJlYWQubworbGliLXkgKz0gcmVhZF9wcmludGYubworbGliLXkgKz0gcmVhZF9rZXkubworbGliLXkgKz0gcmVjdXJzaXZlX2FjdGlvbi5vCitsaWIteSArPSByZW1vdmVfZmlsZS5vCitsaWIteSArPSBydW5fc2hlbGwubworbGliLXkgKz0gc2FmZV9nZXRob3N0bmFtZS5vCitsaWIteSArPSBzYWZlX3BvbGwubworbGliLXkgKz0gc2FmZV9zdHJuY3B5Lm8KK2xpYi15ICs9IHNhZmVfd3JpdGUubworbGliLXkgKz0gc2V0dXBfZW52aXJvbm1lbnQubworbGliLXkgKz0gc2lnbmFscy5vCitsaWIteSArPSBzaW1wbGlmeV9wYXRoLm8KK2xpYi15ICs9IHNpbmdsZV9hcmd2Lm8KK2xpYi15ICs9IHNraXBfd2hpdGVzcGFjZS5vCitsaWIteSArPSBzcGVlZF90YWJsZS5vCitsaWIteSArPSBzdHJfdG9sb3dlci5vCitsaWIteSArPSBzdHJyc3RyLm8KK2xpYi15ICs9IHRpbWUubworbGliLXkgKz0gdHJpbS5vCitsaWIteSArPSB1X3NpZ25hbF9uYW1lcy5vCitsaWIteSArPSB1dWVuY29kZS5vCitsaWIteSArPSB2ZHByaW50Zi5vCitsaWIteSArPSB2ZXJyb3JfbXNnLm8KK2xpYi15ICs9IHZmb3JrX2RhZW1vbl9yZXhlYy5vCitsaWIteSArPSB3YXJuX2lnbm9yaW5nX2FyZ3MubworbGliLXkgKz0gd2ZvcGVuLm8KK2xpYi15ICs9IHdmb3Blbl9pbnB1dC5vCitsaWIteSArPSB3cml0ZS5vCitsaWIteSArPSB4YXRvbnVtLm8KK2xpYi15ICs9IHhjb25uZWN0Lm8KK2xpYi15ICs9IHhmdW5jcy5vCitsaWIteSArPSB4ZnVuY3NfcHJpbnRmLm8KK2xpYi15ICs9IHhmdW5jX2RpZS5vCitsaWIteSArPSB4Z2V0Y3dkLm8KK2xpYi15ICs9IHhnZXRob3N0YnluYW1lLm8KK2xpYi15ICs9IHhyZWFkbGluay5vCitsaWIteSArPSB4cmVhbGxvY192ZWN0b3IubworCitsaWItJChDT05GSUdfUExBVEZPUk1fTElOVVgpICs9IG1hdGNoX2ZzdHlwZS5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX1VUTVApICs9IHV0bXAubworCisjIEEgbWl4IG9mIG9wdGltaXphdGlvbnMgKHdoeSBidWlsZCBzdHVmZiB3ZSBrbm93IHdvbid0IGJlIHVzZWQpCisjIGFuZCBvYmplY3RzIHdoaWNoIG1heSBmYWlsIHRvIGJ1aWxkIChTRUxpbnV4IG9uIHNlbGludXgtbGVzcyBzeXN0ZW0pCitsaWItJChDT05GSUdfU0VMSU5VWCkgKz0gc2VsaW51eF9jb21tb24ubworbGliLSQoQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKSArPSBtdGFiLm8KK2xpYi0kKENPTkZJR19VTklDT0RFX1NVUFBPUlQpICs9IHVuaWNvZGUubworbGliLSQoQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMpICs9IGRpZV9pZl9iYWRfdXNlcm5hbWUubworCitsaWItJChDT05GSUdfTkMpICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfRE5TRCkgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19OVFBEKSArPSB1ZHBfaW8ubworbGliLSQoQ09ORklHX1RGVFApICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfVEZUUEQpICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfVENQU1ZEKSArPSB1ZHBfaW8ubworbGliLSQoQ09ORklHX1VEUFNWRCkgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19UUkFDRVJPVVRFKSArPSB1ZHBfaW8ubworCitsaWItJChDT05GSUdfTE9TRVRVUCkgKz0gbG9vcC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QKSArPSBsb29wLm8KKworbGliLSQoQ09ORklHX0FEREdST1VQKSArPSB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19BRERVU0VSKSArPSB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19ERUxHUk9VUCkgKz0gdXBkYXRlX3Bhc3N3ZC5vCitsaWItJChDT05GSUdfREVMVVNFUikgKz0gdXBkYXRlX3Bhc3N3ZC5vCisKK2xpYi0kKENPTkZJR19QQVNTV0QpICs9IHB3X2VuY3J5cHQubyB1cGRhdGVfcGFzc3dkLm8gb2JzY3VyZS5vCitsaWItJChDT05GSUdfQ0hQQVNTV0QpICs9IHB3X2VuY3J5cHQubyB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19DUllQVFBXKSArPSBwd19lbmNyeXB0Lm8KK2xpYi0kKENPTkZJR19TVUxPR0lOKSArPSBwd19lbmNyeXB0Lm8KK2xpYi0kKENPTkZJR19WTE9DSykgKz0gcHdfZW5jcnlwdC5vIGNvcnJlY3RfcGFzc3dvcmQubworbGliLSQoQ09ORklHX1NVKSArPSBwd19lbmNyeXB0Lm8gY29ycmVjdF9wYXNzd29yZC5vCitsaWItJChDT05GSUdfTE9HSU4pICs9IHB3X2VuY3J5cHQubyBjb3JyZWN0X3Bhc3N3b3JkLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KSArPSBwd19lbmNyeXB0Lm8KKworbGliLSQoQ09ORklHX0RGKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NS0ZTX01JTklYKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NS0ZTX0VYVDIpICs9IGZpbmRfbW91bnRfcG9pbnQubworbGliLSQoQ09ORklHX01LRlNfUkVJU0VSKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19GU0NLX01JTklYKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NT1VOVCkgKz0gZmluZF9tb3VudF9wb2ludC5vCisKK2xpYi0kKENPTkZJR19IV0NMT0NLKSArPSBydGMubworbGliLSQoQ09ORklHX1JUQ1dBS0UpICs9IHJ0Yy5vCisKK2xpYi0kKENPTkZJR19JT1NUQVQpICs9IGdldF9jcHVfY291bnQubworbGliLSQoQ09ORklHX01QU1RBVCkgKz0gZ2V0X2NwdV9jb3VudC5vCitsaWItJChDT05GSUdfUE9XRVJUT1ApICs9IGdldF9jcHVfY291bnQubworCisjIFdlIHNob3VsZG4ndCBidWlsZCB4cmVnY29tcC5jIGlmIHdlIGRvbid0IG5lZWQgaXQgLSB0aGlzIGVuc3VyZXMgd2UgZG9uJ3QKKyMgcmVxdWlyZSByZWdleC5oIHRvIGJlIGluIHRoZSBpbmNsdWRlIGRpciBldmVuIGlmIHdlIGRvbid0IG5lZWQgaXQgdGhlcmVieQorIyBhbGxvd2luZyB1cyB0byBidWlsZCBidXN5Ym94IGV2ZW4gaWYgdWNsaWJjIHJlZ2V4IHN1cHBvcnQgaXMgZGlzYWJsZWQuCisKK2xpYi0kKENPTkZJR19BV0spICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19TRUQpICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19HUkVQKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfRVhQUikgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX01ERVYpICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19MRVNTKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfUEdSRVApICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19QS0lMTCkgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX0RFVkZTRCkgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWCkgKz0geHJlZ2NvbXAubwpkaWZmIC0tZ2l0IGEvbGliYmIvUkVBRE1FIGIvbGliYmIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjNkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9SRUFETUUKQEAgLTAsMCArMSwxMCBAQAorUGxlYXNlIHNlZSB0aGUgTElDRU5TRSBmaWxlIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gKEdQTHYyKQorCitsaWJiYiBpcyBCdXN5Qm94J3MgdXRpbGl0eSBsaWJyYXJ5LiAgQWxsIG9mIHRoaXMgc3R1ZmYgdXNlZCB0byBiZSBzdHVmZmVkIGludG8KK2Egc2luZ2xlIGZpbGUgbmFtZWQgdXRpbGl0eS5jLiAgV2hlbiBJIHNwbGl0IHV0aWxpdHkuYyB0byBjcmVhdGUgbGliYmIsIHNvbWUgb2YKK3RoZSB2ZXJ5IG9sZGVzdCBzdHVmZiBlbmRlZCB1cCB3aXRob3V0IHRoZWlyIG9yaWdpbmFsIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nCitpbmZvcm1hdGlvbiAod2hpY2ggaXMgbm93IGxvc3QgaW4gdGhlIG1pc3RzIG9mIHRpbWUpLiAgSWYgeW91IHNlZSBzb21ldGhpbmcKK3RoYXQgeW91IHdyb3RlIHRoYXQgaXMgbWlzLWF0dHJpYnV0ZWQsIGRvIGxldCBtZSBrbm93IHNvIHdlIGNhbiBmaXggdGhhdCB1cC4KKworCUVyaWsgQW5kZXJzZW4KKwk8YW5kZXJzZW5AY29kZXBvZXQub3JnPgpkaWZmIC0tZ2l0IGEvbGliYmIvYXBwbGV0bGliLmMgYi9saWJiYi9hcHBsZXRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU3YjRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYXBwbGV0bGliLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSB0b25zIG9mIGZvbGtzLiAgVHJhY2tpbmcgZG93biB3aG8gd3JvdGUgd2hhdAorICogaXNuJ3Qgc29tZXRoaW5nIEknbSBnb2luZyB0byB3b3JyeSBhYm91dC4uLiAgSWYgeW91IHdyb3RlIHNvbWV0aGluZworICogaGVyZSwgcGxlYXNlIGZlZWwgZnJlZSB0byBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gc2FzaCwgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqIFBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCB0byByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIHVuZGVyIEdQTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFdlIGFyZSB0cnlpbmcgdG8gbm90IHVzZSBwcmludGYsIHRoaXMgYmVuZWZpdHMgdGhlIGNhc2Ugd2hlbiBzZWxlY3RlZAorICogYXBwbGV0cyBhcmUgcmVhbGx5IHNpbXBsZS4gRXhhbXBsZToKKyAqCisgKiAkIC4vYnVzeWJveAorICogLi4uCisgKiBDdXJyZW50bHkgZGVmaW5lZCBmdW5jdGlvbnM6CisgKiAgICAgICAgIGJhc2VuYW1lLCBmYWxzZSwgdHJ1ZQorICoKKyAqICQgc2l6ZSBidXN5Ym94CisgKiAgICB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXggZmlsZW5hbWUKKyAqICAgIDQ0NzMgICAgICA1MiAgICAgIDcyICAgIDQ1OTcgICAgMTFmNSBidXN5Ym94CisgKgorICogRkVBVFVSRV9JTlNUQUxMRVIgb3IgRkVBVFVSRV9TVUlEIHdpbGwgc3RpbGwgbGluayBwcmludGYgcm91dGluZXMgaW4uIDooCisgKi8KKyNpbmNsdWRlICJidXN5Ym94LmgiCisKKyNpZiAhKGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAorICAgICAgICB8fCBkZWZpbmVkKF9fQVBQTEVfXykgXAorICAgICkKKyMgaW5jbHVkZSA8bWFsbG9jLmg+IC8qIGZvciBtYWxsb3B0ICovCisjZW5kaWYKKworCisvKiBEZWNsYXJlIDxhcHBsZXQ+X21haW4oKSAqLworI2RlZmluZSBQUk9UT1RZUEVTCisjaW5jbHVkZSAiYXBwbGV0cy5oIgorI3VuZGVmIFBST1RPVFlQRVMKKworLyogSW5jbHVkZSBnZW5lcmF0ZWQgYXBwbGV0IG5hbWVzLCBwb2ludGVycyB0byA8YXBwbGV0Pl9tYWluLCBldGMgKi8KKyNpbmNsdWRlICJhcHBsZXRfdGFibGVzLmgiCisvKiAuLi5hbmQgaWYgYXBwbGV0X3RhYmxlcyBnZW5lcmF0b3Igc2F5cyB3ZSBoYXZlIG9ubHkgb25lIGFwcGxldC4uLiAqLworI2lmZGVmIFNJTkdMRV9BUFBMRVRfTUFJTgorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMIDEKKyMgdW5kZWYgSUZfRkVBVFVSRV9JTkRJVklEVUFMCisjIGRlZmluZSBJRl9GRUFUVVJFX0lORElWSURVQUwoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKyNpbmNsdWRlICJ1c2FnZV9jb21wcmVzc2VkLmgiCisKKworI2lmIEVOQUJMRV9TSE9XX1VTQUdFICYmICFFTkFCTEVfRkVBVFVSRV9DT01QUkVTU19VU0FHRQorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfbWVzc2FnZXNbXSBBTElHTjEgPSBVTlBBQ0tFRF9VU0FHRTsKKyNlbHNlCisjIGRlZmluZSB1c2FnZV9tZXNzYWdlcyAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NPTVBSRVNTX1VTQUdFCisKK3N0YXRpYyBjb25zdCBjaGFyIHBhY2tlZF91c2FnZVtdIEFMSUdOMSA9IHsgUEFDS0VEX1VTQUdFIH07CisjIGluY2x1ZGUgImFyY2hpdmUuaCIKK3N0YXRpYyBjb25zdCBjaGFyICp1bnBhY2tfdXNhZ2VfbWVzc2FnZXModm9pZCkKK3sKKwljaGFyICpvdXRidWYgPSBOVUxMOworCWJ1bnppcF9kYXRhICpiZDsKKwlpbnQgaTsKKworCWkgPSBzdGFydF9idW56aXAoJmJkLAorCQkJLyogc3JjX2ZkOiAqLyAtMSwKKwkJCS8qIGluYnVmOiAgKi8gcGFja2VkX3VzYWdlLAorCQkJLyogbGVuOiAgICAqLyBzaXplb2YocGFja2VkX3VzYWdlKSk7CisJLyogcmVhZF9idW56aXAgY2FuIGxvbmdqbXAgdG8gc3RhcnRfYnVuemlwLCBhbmQgdWx0aW1hdGVseQorCSAqIGVuZCB1cCBoZXJlIHdpdGggaSAhPSAwIG9uIHJlYWQgZGF0YSBlcnJvcnMhIE5vdCB0cml2aWFsICovCisJaWYgKCFpKSB7CisJCS8qIENhbm5vdCB1c2UgeG1hbGxvYzogd2lsbCBsZWFrIGJkIGluIE5PRk9SSyBjYXNlISAqLworCQlvdXRidWYgPSBtYWxsb2Nfb3Jfd2FybihzaXplb2YoVU5QQUNLRURfVVNBR0UpKTsKKwkJaWYgKG91dGJ1ZikKKwkJCXJlYWRfYnVuemlwKGJkLCBvdXRidWYsIHNpemVvZihVTlBBQ0tFRF9VU0FHRSkpOworCX0KKwlkZWFsbG9jX2J1bnppcChiZCk7CisJcmV0dXJuIG91dGJ1ZjsKK30KKyMgZGVmaW5lIGRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMocykgZnJlZShzKQorCisjZWxzZQorCisjIGRlZmluZSB1bnBhY2tfdXNhZ2VfbWVzc2FnZXMoKSB1c2FnZV9tZXNzYWdlcworIyBkZWZpbmUgZGVhbGxvY191c2FnZV9tZXNzYWdlcyhzKSAoKHZvaWQpKHMpKQorCisjZW5kaWYgLyogRkVBVFVSRV9DT01QUkVTU19VU0FHRSAqLworCisKK3ZvaWQgRkFTVF9GVU5DIGJiX3Nob3dfdXNhZ2Uodm9pZCkKK3sKKwlpZiAoRU5BQkxFX1NIT1dfVVNBR0UpIHsKKyNpZmRlZiBTSU5HTEVfQVBQTEVUX1NUUgorCQkvKiBJbWFnaW5lIHRoYXQgdGhpcyBhcHBsZXQgaXMgInRydWUiLiBEb250IHN1Y2sgaW4gcHJpbnRmISAqLworCQljb25zdCBjaGFyICp1c2FnZV9zdHJpbmcgPSB1bnBhY2tfdXNhZ2VfbWVzc2FnZXMoKTsKKworCQlpZiAoKnVzYWdlX3N0cmluZyA9PSAnXGInKSB7CisJCQlmdWxsX3dyaXRlMl9zdHIoIk5vIGhlbHAgYXZhaWxhYmxlLlxuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiVXNhZ2U6ICJTSU5HTEVfQVBQTEVUX1NUUiIgIik7CisJCQlmdWxsX3dyaXRlMl9zdHIodXNhZ2Vfc3RyaW5nKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5cbiIpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMoKGNoYXIqKXVzYWdlX3N0cmluZyk7CisjZWxzZQorCQljb25zdCBjaGFyICpwOworCQljb25zdCBjaGFyICp1c2FnZV9zdHJpbmcgPSBwID0gdW5wYWNrX3VzYWdlX21lc3NhZ2VzKCk7CisJCWludCBhcCA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXBwbGV0X25hbWUpOworCisJCWlmIChhcCA8IDApIC8qIG5ldmVyIGhhcHBlbnMsIHBhcmFub2lhICovCisJCQl4ZnVuY19kaWUoKTsKKwkJd2hpbGUgKGFwKSB7CisJCQl3aGlsZSAoKnArKykgY29udGludWU7CisJCQlhcC0tOworCQl9CisJCWZ1bGxfd3JpdGUyX3N0cihiYl9iYW5uZXIpOworCQlmdWxsX3dyaXRlMl9zdHIoIiBtdWx0aS1jYWxsIGJpbmFyeS5cbiIpOworCQlpZiAoKnAgPT0gJ1xiJykKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5ObyBoZWxwIGF2YWlsYWJsZS5cblxuIik7CisJCWVsc2UgeworCQkJZnVsbF93cml0ZTJfc3RyKCJcblVzYWdlOiAiKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cihhcHBsZXRfbmFtZSk7CisJCQlmdWxsX3dyaXRlMl9zdHIoIiAiKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cihwKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5cbiIpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMoKGNoYXIqKXVzYWdlX3N0cmluZyk7CisjZW5kaWYKKwl9CisJeGZ1bmNfZGllKCk7Cit9CisKKyNpZiBOVU1fQVBQTEVUUyA+IDgKKy8qIE5COiBhbnkgY2hhciBwb2ludGVyIHdpbGwgd29yayBhcyB3ZWxsLCBub3QgbmVjZXNzYXJpbHkgYXBwbGV0X25hbWVzICovCitzdGF0aWMgaW50IGFwcGxldF9uYW1lX2NvbXBhcmUoY29uc3Qgdm9pZCAqbmFtZSwgY29uc3Qgdm9pZCAqdikKK3sKKwlpbnQgaSA9IChjb25zdCBjaGFyICopdiAtIGFwcGxldF9uYW1lczsKKwlyZXR1cm4gc3RyY21wKG5hbWUsIEFQUExFVF9OQU1FKGkpKTsKK30KKyNlbmRpZgoraW50IEZBU1RfRlVOQyBmaW5kX2FwcGxldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisjaWYgTlVNX0FQUExFVFMgPiA4CisJLyogRG8gYSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGFwcGxldCBlbnRyeSBnaXZlbiB0aGUgbmFtZS4gKi8KKwljb25zdCBjaGFyICpwOworCXAgPSBic2VhcmNoKG5hbWUsIGFwcGxldF9uYW1lcywgQVJSQVlfU0laRShhcHBsZXRfbWFpbiksIDEsIGFwcGxldF9uYW1lX2NvbXBhcmUpOworCWlmICghcCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwIC0gYXBwbGV0X25hbWVzOworI2Vsc2UKKwkvKiBBIHZlcnNpb24gd2hpY2ggZG9lcyBub3QgcHVsbCBpbiBic2VhcmNoICovCisJaW50IGkgPSAwOworCWNvbnN0IGNoYXIgKnAgPSBhcHBsZXRfbmFtZXM7CisJd2hpbGUgKGkgPCBOVU1fQVBQTEVUUykgeworCQlpZiAoc3RyY21wKG5hbWUsIHApID09IDApCisJCQlyZXR1cm4gaTsKKwkJcCArPSBzdHJsZW4ocCkgKyAxOworCQlpKys7CisJfQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisKK3ZvaWQgbGJiX3ByZXBhcmUoY29uc3QgY2hhciAqYXBwbGV0CisJCUlGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGNoYXIgKiphcmd2KSkKKwkJCQlNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK3ZvaWQgbGJiX3ByZXBhcmUoY29uc3QgY2hhciAqYXBwbGV0CisJCUlGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGNoYXIgKiphcmd2KSkKK3sKKyNpZmRlZiBfX0dMSUJDX18KKwkoKihpbnQgKiopJmJiX2Vycm5vKSA9IF9fZXJybm9fbG9jYXRpb24oKTsKKwliYXJyaWVyKCk7CisjZW5kaWYKKwlhcHBsZXRfbmFtZSA9IGFwcGxldDsKKworCS8qIFNldCBsb2NhbGUgZm9yIGV2ZXJ5Ym9keSBleGNlcHQgJ2luaXQnICovCisJaWYgKEVOQUJMRV9MT0NBTEVfU1VQUE9SVCAmJiBnZXRwaWQoKSAhPSAxKQorCQlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkRJVklEVUFMCisJLyogUmVkdW5kYW50IGZvciBidXN5Ym94IChydW5fYXBwbGV0X2FuZF9leGl0IGNvdmVycyB0aGF0IGNhc2UpCisJICogYnV0IG5lZWRlZCBmb3IgImluZGl2aWR1YWwgYXBwbGV0IiBtb2RlICovCisJaWYgKGFyZ3ZbMV0KKwkgJiYgIWFyZ3ZbMl0KKwkgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwCisJICYmIHN0cm5jbXAoYXBwbGV0LCAiYnVzeWJveCIsIDcpICE9IDAKKwkpIHsKKwkJLyogU3BlY2lhbCBjYXNlLiBQT1NJWCBzYXlzICJ0ZXN0IC0taGVscCIKKwkJICogc2hvdWxkIGJlIG5vIGRpZmZlcmVudCBmcm9tIGUuZy4gInRlc3QgLS1mb28iLiAgKi8KKwkJaWYgKCFFTkFCTEVfVEVTVCB8fCBzdHJjbXAoYXBwbGV0X25hbWUsICJ0ZXN0IikgIT0gMCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisjZW5kaWYKK30KKworLyogVGhlIGNvZGUgYmVsb3cgY2FuIHdlbGwgYmUgaW4gYXBwbGV0cy9hcHBsZXRzLmMsIGFzIGl0IGlzIHVzZWQgb25seQorICogZm9yIGJ1c3lib3ggYmluYXJ5LCBub3QgImluZGl2aWR1YWwiIGJpbmFyaWVzLgorICogSG93ZXZlciwga2VlcGluZyBpdCBoZXJlIGFuZCBsaW5raW5nIGl0IGludG8gbGliYnVzeWJveC5zbworICogKHRvZ2V0aGVyIHdpdGggcmVtYWluaW5nIHRpbnkgYXBwbGV0cy9hcHBsZXRzLm8pCisgKiBtYWtlcyBpdCBwb3NzaWJsZSB0byBhdm9pZCAtLXdob2xlLWFyY2hpdmUgYXQgbGluayB0aW1lLgorICogVGhpcyBtYWtlcyAoc2hhcmVkIGJ1c3lib3gpICsgbGliYnVzeWJveCBzbWFsbGVyLgorICogKC0tZ2Mtc2VjdGlvbnMgd291bGQgYmUgZXZlbiBiZXR0ZXIuLi4uKQorICovCisKK2NvbnN0IGNoYXIgKmFwcGxldF9uYW1lOworI2lmICFCQl9NTVUKK2Jvb2wgcmVfZXhlY2VkOworI2VuZGlmCisKKworLyogSWYgbm90IGJ1aWx0IGFzIGEgc2luZ2xlLWFwcGxldCBleGVjdXRhYmxlLi4uICovCisjaWYgIWRlZmluZWQoU0lOR0xFX0FQUExFVF9NQUlOKQorCitJRl9GRUFUVVJFX1NVSUQoc3RhdGljIHVpZF90IHJ1aWQ7KSAgLyogcmVhbCB1aWQgKi8KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJRworCitzdGF0aWMgc3RydWN0IHN1aWRfY29uZmlnX3QgeworCS8qIG5leHQgcHRyIG11c3QgYmUgZmlyc3Q6IHRoaXMgc3RydWN0IG5lZWRzIHRvIGJlIGxsaXN0LWNvbXBhdGlibGUgKi8KKwlzdHJ1Y3Qgc3VpZF9jb25maWdfdCAqbV9uZXh0OworCXN0cnVjdCBiYl91aWRnaWRfdCBtX3VnaWQ7CisJaW50IG1fYXBwbGV0OworCW1vZGVfdCBtX21vZGU7Cit9ICpzdWlkX2NvbmZpZzsKKworc3RhdGljIGJvb2wgc3VpZF9jZmdfcmVhZGFibGU7CisKKy8qIGNoZWNrIGlmIHUgaXMgbWVtYmVyIG9mIGdyb3VwIGcgKi8KK3N0YXRpYyBpbnQgaW5ncm91cCh1aWRfdCB1LCBnaWRfdCBnKQoreworCXN0cnVjdCBncm91cCAqZ3JwID0gZ2V0Z3JnaWQoZyk7CisJaWYgKGdycCkgeworCQljaGFyICoqbWVtOworCQlmb3IgKG1lbSA9IGdycC0+Z3JfbWVtOyAqbWVtOyBtZW0rKykgeworCQkJc3RydWN0IHBhc3N3ZCAqcHdkID0gZ2V0cHduYW0oKm1lbSk7CisJCQlpZiAocHdkICYmIChwd2QtPnB3X3VpZCA9PSB1KSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogbGliYmIgY2FuZGlkYXRlICovCitzdGF0aWMgY2hhciAqZ2V0X3RyaW1tZWRfc2xpY2UoY2hhciAqcywgY2hhciAqZSkKK3sKKwkvKiBGaXJzdCwgY29uc2lkZXIgdGhlIHZhbHVlIGF0IGUgdG8gYmUgbnVsIGFuZCBiYWNrIHVwIHVudGlsIHdlCisJICogcmVhY2ggYSBub24tc3BhY2UgY2hhci4gIFNldCB0aGUgY2hhciBhZnRlciB0aGF0IChwb3NzaWJseSBhdAorCSAqIHRoZSBvcmlnaW5hbCBlKSB0byBudWwuICovCisJd2hpbGUgKGUtLSA+IHMpIHsKKwkJaWYgKCFpc3NwYWNlKCplKSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJZVsxXSA9ICdcMCc7CisKKwkvKiBOZXh0LCBhZHZhbmNlIHBhc3QgYWxsIGxlYWRpbmcgc3BhY2UgYW5kIHJldHVybiBhIHB0ciB0byB0aGUKKwkgKiBmaXJzdCBub24tc3BhY2UgY2hhcjsgcG9zc2libHkgdGhlIHRlcm1pbmF0aW5nIG51bC4gKi8KKwlyZXR1cm4gc2tpcF93aGl0ZXNwYWNlKHMpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jb25maWdfZmlsZSh2b2lkKQoreworCS8qIERvbid0IGRlcGVuZCBvbiB0aGUgdG9vbHMgdG8gY29tYmluZSBzdHJpbmdzLiAqLworCXN0YXRpYyBjb25zdCBjaGFyIGNvbmZpZ19maWxlW10gQUxJR04xID0gIi9ldGMvYnVzeWJveC5jb25mIjsKKworCXN0cnVjdCBzdWlkX2NvbmZpZ190ICpzY3RfaGVhZDsKKwlpbnQgYXBwbGV0X25vOworCUZJTEUgKmY7CisJY29uc3QgY2hhciAqZXJybXNnOworCXVuc2lnbmVkIGxjOworCXNtYWxsaW50IHNlY3Rpb247CisJc3RydWN0IHN0YXQgc3Q7CisKKwlydWlkID0gZ2V0dWlkKCk7CisJaWYgKHJ1aWQgPT0gMCkgLyogcnVuIGJ5IHJvb3QgLSBkb24ndCBuZWVkIHRvIGV2ZW4gcmVhZCBjb25maWcgZmlsZSAqLworCQlyZXR1cm47CisKKwlpZiAoKHN0YXQoY29uZmlnX2ZpbGUsICZzdCkgIT0gMCkgICAgICAgLyogTm8gY29uZmlnIGZpbGU/ICovCisJIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpICAgICAgICAgICAgICAgIC8qIE5vdCBhIHJlZ3VsYXIgZmlsZT8gKi8KKwkgfHwgKHN0LnN0X3VpZCAhPSAwKSAgICAgICAgICAgICAgICAgICAgLyogTm90IG93bmVkIGJ5IHJvb3Q/ICovCisJIHx8IChzdC5zdF9tb2RlICYgKFNfSVdHUlAgfCBTX0lXT1RIKSkgIC8qIFdyaXRhYmxlIGJ5IG5vbi1yb290PyAqLworCSB8fCAhKGYgPSBmb3Blbl9mb3JfcmVhZChjb25maWdfZmlsZSkpICAvKiBDYW5ub3Qgb3Blbj8gKi8KKwkpIHsKKwkJcmV0dXJuOworCX0KKworCXN1aWRfY2ZnX3JlYWRhYmxlID0gMTsKKwlzY3RfaGVhZCA9IE5VTEw7CisJc2VjdGlvbiA9IGxjID0gMDsKKworCXdoaWxlICgxKSB7CisJCWNoYXIgYnVmZmVyWzI1Nl07CisJCWNoYXIgKnM7CisKKwkJaWYgKCFmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmKSkgeyAvKiBBcmUgd2UgZG9uZT8gKi8KKwkJCS8vIExvb2tzIGxpa2UgYmxvYXQKKwkJCS8vaWYgKGZlcnJvcihmKSkgeyAgIC8qIE1ha2Ugc3VyZSBpdCB3YXNuJ3QgYSByZWFkIGVycm9yLiAqLworCQkJLy8JZXJybXNnID0gInJlYWRpbmciOworCQkJLy8JZ290byBwZV9sYWJlbDsKKwkJCS8vfQorCQkJZmNsb3NlKGYpOworCQkJc3VpZF9jb25maWcgPSBzY3RfaGVhZDsJLyogU3VjY2Vzcywgc28gc2V0IHRoZSBwb2ludGVyLiAqLworCQkJcmV0dXJuOworCQl9CisKKwkJcyA9IGJ1ZmZlcjsKKwkJbGMrKzsJCQkJCS8qIEdvdCBhIChwYXJ0aWFsKSBsaW5lLiAqLworCisJCS8qIElmIGEgbGluZSBpcyB0b28gbG9uZyBmb3Igb3VyIGJ1ZmZlciwgd2UgY29uc2lkZXIgaXQgYW4gZXJyb3IuCisJCSAqIFRoZSBmb2xsb3dpbmcgdGVzdCBkb2VzIG1pc3RyZWF0IG9uZSBjb3JuZXIgY2FzZSB0aG91Z2guCisJCSAqIElmIHRoZSBmaW5hbCBsaW5lIG9mIHRoZSBmaWxlIGRvZXMgbm90IGVuZCB3aXRoIGEgbmV3bGluZSBhbmQKKwkJICogeWV0IGV4YWN0bHkgZmlsbHMgdGhlIGJ1ZmZlciwgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHRvbyBsb25nCisJCSAqIGV2ZW4gdGhvdWdoIHRoZXJlIGlzbid0IHJlYWxseSBhIHByb2JsZW0uICBCdXQgaXQgaXNuJ3QgcmVhbGx5CisJCSAqIHdvcnRoIGFkZGluZyBjb2RlIHRvIGRlYWwgd2l0aCBzdWNoIGFuIHVubGlrZWx5IHNpdHVhdGlvbiwgYW5kCisJCSAqIHdlIGRvIGVyciBvbiB0aGUgc2lkZSBvZiBjYXV0aW9uLiAgQmVzaWRlcywgdGhlIGxpbmUgd291bGQgYmUKKwkJICogdG9vIGxvbmcgaWYgaXQgZGlkIGVuZCB3aXRoIGEgbmV3bGluZS4gKi8KKwkJaWYgKCFzdHJjaHIocywgJ1xuJykgJiYgIWZlb2YoZikpIHsKKwkJCWVycm1zZyA9ICJsaW5lIHRvbyBsb25nIjsKKwkJCWdvdG8gcGVfbGFiZWw7CisJCX0KKworCQkvKiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGlnbm9yaW5nIGNvbW1lbnRzLCBhbmQKKwkJICogY2hlY2sgaWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgZW1wdHkuICovCisJCXMgPSBnZXRfdHJpbW1lZF9zbGljZShzLCBzdHJjaHJudWwocywgJyMnKSk7CisJCWlmICghKnMpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIGEgc2VjdGlvbiBoZWFkZXIuICovCisKKwkJaWYgKCpzID09ICdbJykgeworCQkJLyogVW5saWtlIHRoZSBvbGQgY29kZSwgd2UgaWdub3JlIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisJCQkgKiB3aGl0ZXNwYWNlIGZvciB0aGUgc2VjdGlvbiBuYW1lLiAgV2UgYWxzbyByZXF1aXJlIHRoYXQKKwkJCSAqIHRoZXJlIGFyZSBubyBzdHJheSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBjbG9zaW5nIGJyYWNrZXQuICovCisJCQljaGFyICplID0gc3RyY2hyKHMsICddJyk7CisJCQlpZiAoIWUgICAvKiBNaXNzaW5nIHJpZ2h0IGJyYWNrZXQ/ICovCisJCQkgfHwgZVsxXSAvKiBUcmFpbGluZyBjaGFyYWN0ZXJzPyAqLworCQkJIHx8ICEqKHMgPSBnZXRfdHJpbW1lZF9zbGljZShzKzEsIGUpKSAvKiBNaXNzaW5nIG5hbWU/ICovCisJCQkpIHsKKwkJCQllcnJtc2cgPSAic2VjdGlvbiBoZWFkZXIiOworCQkJCWdvdG8gcGVfbGFiZWw7CisJCQl9CisJCQkvKiBSaWdodCBub3cgd2Ugb25seSBoYXZlIG9uZSBzZWN0aW9uIHNvIGp1c3QgY2hlY2sgaXQuCisJCQkgKiBJZiBtb3JlIHNlY3Rpb25zIGFyZSBhZGRlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgZG9uJ3QKKwkJCSAqIHJlc29ydCB0byBjYXNjYWRpbmcgaWZzIHdpdGggbXVsdGlwbGUgc3RyY2FzZWNtcCBjYWxscy4KKwkJCSAqIFRoYXQga2luZCBvZiBibG9hdGVkIGNvZGUgaXMgYWxsIHRvbyBjb21tb24uICBBIGxvb3AKKwkJCSAqIGFuZCBhIHN0cmluZyB0YWJsZSB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2UgdW5sZXNzIHRoZQorCQkJICogbnVtYmVyIG9mIHNlY3Rpb25zIGlzIHZlcnkgc21hbGwuICovCisJCQlpZiAoc3RyY2FzZWNtcChzLCAiU1VJRCIpID09IDApIHsKKwkJCQlzZWN0aW9uID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNlY3Rpb24gPSAtMTsJLyogVW5rbm93biBzZWN0aW9uIHNvIHNldCB0byBza2lwLiAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcm9jZXNzIHNlY3Rpb25zLiAqLworCisJCWlmIChzZWN0aW9uID09IDEpIHsJCS8qIFNVSUQgKi8KKwkJCS8qIFNpbmNlIHdlIHRyaW1tZWQgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgYWJvdmUsIHdlJ3JlCisJCQkgKiBub3cgbG9va2luZyBmb3Igc3RyaW5ncyBvZiB0aGUgZm9ybQorCQkJICogICAgPGtleT5bOjpzcGFjZTo6XSo9Wzo6c3BhY2U6Ol0qPHZhbHVlPgorCQkJICogd2hlcmUgYm90aCBrZXkgYW5kIHZhbHVlIGNvdWxkIGNvbnRhaW4gaW5uZXIgd2hpdGVzcGFjZS4gKi8KKworCQkJLyogRmlyc3QgZ2V0IHRoZSBrZXkgKGFuIGFwcGxldCBuYW1lIGluIG91ciBjYXNlKS4gKi8KKwkJCWNoYXIgKmUgPSBzdHJjaHIocywgJz0nKTsKKwkJCWlmIChlKSB7CisJCQkJcyA9IGdldF90cmltbWVkX3NsaWNlKHMsIGUpOworCQkJfQorCQkJaWYgKCFlIHx8ICEqcykgewkvKiBNaXNzaW5nICc9JyBvciBlbXB0eSBrZXkuICovCisJCQkJZXJybXNnID0gImtleXdvcmQiOworCQkJCWdvdG8gcGVfbGFiZWw7CisJCQl9CisKKwkJCS8qIE9rLCB3ZSBoYXZlIGFuIGFwcGxldCBuYW1lLiAgUHJvY2VzcyB0aGUgcmhzIGlmIHRoaXMKKwkJCSAqIGFwcGxldCBpcyBjdXJyZW50bHkgYnVpbHQgaW4gYW5kIGlnbm9yZSBpdCBvdGhlcndpc2UuCisJCQkgKiBOb3RlOiB0aGlzIGNhbiBoaWRlIGNvbmZpZyBmaWxlIGJ1Z3Mgd2hpY2ggb25seSBwb3AKKwkJCSAqIHVwIHdoZW4gdGhlIGJ1c3lib3ggY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkLiAqLworCQkJYXBwbGV0X25vID0gZmluZF9hcHBsZXRfYnlfbmFtZShzKTsKKwkJCWlmIChhcHBsZXRfbm8gPj0gMCkgeworCQkJCXVuc2lnbmVkIGk7CisJCQkJc3RydWN0IHN1aWRfY29uZmlnX3QgKnNjdDsKKworCQkJCS8qIE5vdGU6IFdlIGN1cnJlbnRseSBkb24ndCBjaGVjayBmb3IgZHVwbGljYXRlcyEKKwkJCQkgKiBUaGUgbGFzdCBjb25maWcgbGluZSBmb3IgZWFjaCBhcHBsZXQgd2lsbCBiZSB0aGUKKwkJCQkgKiBvbmUgdXNlZCBzaW5jZSB3ZSBpbnNlcnQgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJCQkJICogSSBzdXBwb3NlIHRoaXMgY291bGQgYmUgY29uc2lkZXJlZCBhIGZlYXR1cmUuICovCisJCQkJc2N0ID0geHphbGxvYyhzaXplb2YoKnNjdCkpOworCQkJCXNjdC0+bV9hcHBsZXQgPSBhcHBsZXRfbm87CisJCQkJLypzY3QtPm1fbW9kZSA9IDA7Ki8KKwkJCQlzY3QtPm1fbmV4dCA9IHNjdF9oZWFkOworCQkJCXNjdF9oZWFkID0gc2N0OworCisJCQkJLyogR2V0IHRoZSBzcGVjaWZpZWQgbW9kZS4gKi8KKworCQkJCWUgPSBza2lwX3doaXRlc3BhY2UoZSsxKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQkJLyogVGhlcmUgYXJlIDQgY2hhcnMgZm9yIGVhY2ggb2YgdXNlci9ncm91cC9vdGhlci4KKwkJCQkJICogIngteHgiIGluc3RlYWQgb2YgIngtIiBhcmUgdG8gbWFrZQorCQkJCQkgKiAiaWR4ID4gMyIgY2hlY2sgY2F0Y2ggaW52YWxpZCBjaGFycy4KKwkJCQkJICovCisJCQkJCXN0YXRpYyBjb25zdCBjaGFyIG1vZGVfY2hhcnNbXSBBTElHTjEgPSAiU3N4LSIgIlNzeC0iICJ4LXh4IjsKKwkJCQkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG1vZGVfbWFza1tdIEFMSUdOMiA9IHsKKwkJCQkJCVNfSVNVSUQsIFNfSVNVSUR8U19JWFVTUiwgU19JWFVTUiwgMCwgLyogU3N4LSAqLworCQkJCQkJU19JU0dJRCwgU19JU0dJRHxTX0lYR1JQLCBTX0lYR1JQLCAwLCAvKiBTc3gtICovCisJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVhPVEgsIDAgIC8qICAgeC0gKi8KKwkJCQkJfTsKKwkJCQkJY29uc3QgY2hhciAqcSA9IHN0cmNocm51bChtb2RlX2NoYXJzICsgNCppLCAqZSk7CisJCQkJCXVuc2lnbmVkIGlkeCA9IHEgLSAobW9kZV9jaGFycyArIDQqaSk7CisJCQkJCWlmIChpZHggPiAzKSB7CisJCQkJCQllcnJtc2cgPSAibW9kZSI7CisJCQkJCQlnb3RvIHBlX2xhYmVsOworCQkJCQl9CisJCQkJCXNjdC0+bV9tb2RlIHw9IG1vZGVfbWFza1txIC0gbW9kZV9jaGFyc107CisJCQkJCWUrKzsKKwkJCQl9CisKKwkJCQkvKiBOb3cgZ2V0IHRoZSB1c2VyL2dyb3VwIGluZm8uICovCisKKwkJCQlzID0gc2tpcF93aGl0ZXNwYWNlKGUpOworCQkJCS8qIERlZmF1bHQgaXMgMC4wLCBlbHNlIHBhcnNlIFVTRVIuR1JPVVA6ICovCisJCQkJaWYgKCpzKSB7CisJCQkJCS8qIFdlIHJlcXVpcmUgd2hpdGVzcGFjZSBiZXR3ZWVuIG1vZGUgYW5kIFVTRVIuR1JPVVAgKi8KKwkJCQkJaWYgKChzID09IGUpIHx8ICEoZSA9IHN0cmNocihzLCAnLicpKSkgeworCQkJCQkJZXJybXNnID0gInVpZC5naWQiOworCQkJCQkJZ290byBwZV9sYWJlbDsKKwkJCQkJfQorCQkJCQkqZSA9ICc6JzsgLyogZ2V0X3VpZGdpZCBuZWVkcyBVU0VSOkdST1VQIHN5bnRheCAqLworCQkJCQlpZiAoZ2V0X3VpZGdpZCgmc2N0LT5tX3VnaWQsIHMsIC8qYWxsb3dfbnVtZXJpYzoqLyAxKSA9PSAwKSB7CisJCQkJCQllcnJtc2cgPSAidW5rbm93biB1c2VyL2dyb3VwIjsKKwkJCQkJCWdvdG8gcGVfbGFiZWw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFVua25vd24gc2VjdGlvbnMgYXJlIGlnbm9yZWQuICovCisKKwkJLyogRW5jb3VudGVyaW5nIGNvbmZpZ3VyYXRpb24gbGluZXMgcHJpb3IgdG8gc2VlaW5nIGEKKwkJICogc2VjdGlvbiBoZWFkZXIgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci4gIFRoaXMgaXMgaG93CisJCSAqIHRoZSBvbGQgY29kZSB3b3JrZWQsIGJ1dCBpdCBtYXkgbm90IGJlIGRlc2lyYWJsZS4KKwkJICogV2UgbWF5IHdhbnQgdG8gc2ltcGx5IGlnbm9yZSBzdWNoIGxpbmVzIGluIGNhc2UgdGhleQorCQkgKiBhcmUgdXNlZCBpbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIG9mIGJ1c3lib3guICovCisJCWlmICghc2VjdGlvbikgeworCQkJZXJybXNnID0gImtleXdvcmQgb3V0c2lkZSBzZWN0aW9uIjsKKwkJCWdvdG8gcGVfbGFiZWw7CisJCX0KKworCX0gLyogd2hpbGUgKDEpICovCisKKyBwZV9sYWJlbDoKKwlmY2xvc2UoZik7CisJYmJfZXJyb3JfbXNnKCJwYXJzZSBlcnJvciBpbiAlcywgbGluZSAldTogJXMiLCBjb25maWdfZmlsZSwgbGMsIGVycm1zZyk7CisKKwkvKiBSZWxlYXNlIGFueSBhbGxvY2F0ZWQgbWVtb3J5IGJlZm9yZSByZXR1cm5pbmcuICovCisJbGxpc3RfZnJlZSgobGxpc3RfdCopc2N0X2hlYWQsIE5VTEwpOworfQorIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUodm9pZCkKK3sKKwlJRl9GRUFUVVJFX1NVSUQocnVpZCA9IGdldHVpZCgpOykKK30KKyMgZW5kaWYgLyogRkVBVFVSRV9TVUlEX0NPTkZJRyAqLworCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRAorc3RhdGljIHZvaWQgY2hlY2tfc3VpZChpbnQgYXBwbGV0X25vKQoreworCWdpZF90IHJnaWQ7ICAvKiByZWFsIGdpZCAqLworCisJaWYgKHJ1aWQgPT0gMCkgLyogc2V0IGJ5IHBhcnNlX2NvbmZpZ19maWxlKCkgKi8KKwkJcmV0dXJuOyAvKiBydW4gYnkgcm9vdCAtIG5vIG5lZWQgdG8gY2hlY2sgbW9yZSAqLworCXJnaWQgPSBnZXRnaWQoKTsKKworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRF9DT05GSUcKKwlpZiAoc3VpZF9jZmdfcmVhZGFibGUpIHsKKwkJdWlkX3QgdWlkOworCQlzdHJ1Y3Qgc3VpZF9jb25maWdfdCAqc2N0OworCQltb2RlX3QgbTsKKworCQlmb3IgKHNjdCA9IHN1aWRfY29uZmlnOyBzY3Q7IHNjdCA9IHNjdC0+bV9uZXh0KSB7CisJCQlpZiAoc2N0LT5tX2FwcGxldCA9PSBhcHBsZXRfbm8pCisJCQkJZ290byBmb3VuZDsKKwkJfQorCQlnb3RvIGNoZWNrX25lZWRfc3VpZDsKKyBmb3VuZDoKKwkJLyogSXMgdGhpcyB1c2VyIGFsbG93ZWQgdG8gcnVuIHRoaXMgYXBwbGV0PyAqLworCQltID0gc2N0LT5tX21vZGU7CisJCWlmIChzY3QtPm1fdWdpZC51aWQgPT0gcnVpZCkKKwkJCS8qIHNhbWUgdWlkICovCisJCQltID4+PSA2OworCQllbHNlIGlmICgoc2N0LT5tX3VnaWQuZ2lkID09IHJnaWQpIHx8IGluZ3JvdXAocnVpZCwgc2N0LT5tX3VnaWQuZ2lkKSkKKwkJCS8qIHNhbWUgZ3JvdXAgLyBpbiBncm91cCAqLworCQkJbSA+Pj0gMzsKKwkJaWYgKCEobSAmIFNfSVhPVEgpKSAvKiBpcyB4IGJpdCBub3Qgc2V0PyAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInlvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gcnVuIHRoaXMgYXBwbGV0Iik7CisKKwkJLyogV2Ugc2V0IGVmZmVjdGl2ZSBBTkQgc2F2ZWQgaWRzLiBJZiBzYXZlZC1pZCBpcyBub3Qgc2V0CisJCSAqIGxpa2Ugd2UgZG8gYmVsb3csIHNldGV1aWQoMCkgY2FuIHN0aWxsIGxhdGVyIHN1Y2NlZWQhICovCisKKwkJLyogQXJlIHdlIGRpcmVjdGVkIHRvIGNoYW5nZSBnaWQKKwkJICogKEFQUExFVCA9ICpzKiBVU0VSLkdST1VQIG9yIEFQUExFVCA9ICpTKiBVU0VSLkdST1VQKT8KKwkJICovCisJCWlmIChzY3QtPm1fbW9kZSAmIFNfSVNHSUQpCisJCQlyZ2lkID0gc2N0LT5tX3VnaWQuZ2lkOworCQkvKiBlbHNlOiB3ZSB3aWxsIHNldCBlZ2lkID0gcmdpZCwgdGh1cyBkcm9wcGluZyBzZ2lkIGVmZmVjdCAqLworCQlpZiAoc2V0cmVzZ2lkKC0xLCByZ2lkLCByZ2lkKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cmVzZ2lkIik7CisKKwkJLyogQXJlIHdlIGRpcmVjdGVkIHRvIGNoYW5nZSB1aWQKKwkJICogKEFQUExFVCA9IHMqKiBVU0VSLkdST1VQIG9yIEFQUExFVCA9IFMqKiBVU0VSLkdST1VQKT8KKwkJICovCisJCXVpZCA9IHJ1aWQ7CisJCWlmIChzY3QtPm1fbW9kZSAmIFNfSVNVSUQpCisJCQl1aWQgPSBzY3QtPm1fdWdpZC51aWQ7CisJCS8qIGVsc2U6IHdlIHdpbGwgc2V0IGV1aWQgPSBydWlkLCB0aHVzIGRyb3BwaW5nIHN1aWQgZWZmZWN0ICovCisJCWlmIChzZXRyZXN1aWQoLTEsIHVpZCwgdWlkKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cmVzdWlkIik7CisKKwkJZ290byByZXQ7CisJfQorIyAgIGlmICFFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVAorCXsKKwkJc3RhdGljIGJvb2wgb25ldGltZSA9IDA7CisKKwkJaWYgKCFvbmV0aW1lKSB7CisJCQlvbmV0aW1lID0gMTsKKwkJCWJiX2Vycm9yX21zZygidXNpbmcgZmFsbGJhY2sgc3VpZCBtZXRob2QiKTsKKwkJfQorCX0KKyMgICBlbmRpZgorIGNoZWNrX25lZWRfc3VpZDoKKyMgIGVuZGlmCisJaWYgKEFQUExFVF9TVUlEKGFwcGxldF9ubykgPT0gQkJfU1VJRF9SRVFVSVJFKSB7CisJCS8qIFJlYWwgdWlkIGlzIG5vdCAwLiBJZiBldWlkIGlzbid0IDAgdG9vLCBzdWlkIGJpdAorCQkgKiBpcyBtb3N0IHByb2JhYmx5IG5vdCBzZXQgb24gb3VyIGV4ZWN1dGFibGUgKi8KKwkJaWYgKGdldGV1aWQoKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IGJlIHN1aWQgdG8gd29yayBwcm9wZXJseSIpOworCX0gZWxzZSBpZiAoQVBQTEVUX1NVSUQoYXBwbGV0X25vKSA9PSBCQl9TVUlEX0RST1ApIHsKKwkJeHNldGdpZChyZ2lkKTsgIC8qIGRyb3AgYWxsIHByaXZpbGVnZXMgKi8KKwkJeHNldHVpZChydWlkKTsKKwl9CisjICBpZiBFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJRworIHJldDogOworCWxsaXN0X2ZyZWUoKGxsaXN0X3QqKXN1aWRfY29uZmlnLCBOVUxMKTsKKyMgIGVuZGlmCit9CisjIGVsc2UKKyMgIGRlZmluZSBjaGVja19zdWlkKHgpICgodm9pZCkwKQorIyBlbmRpZiAvKiBGRUFUVVJFX1NVSUQgKi8KKworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUgorc3RhdGljIGNvbnN0IGNoYXIgdXNyX2JpbiBbXSBBTElHTjEgPSAiL3Vzci9iaW4vIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVzcl9zYmluW10gQUxJR04xID0gIi91c3Ivc2Jpbi8iOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGluc3RhbGxfZGlyW10gPSB7CisJJnVzcl9iaW4gWzhdLCAvKiAiLyIgKi8KKwkmdXNyX2JpbiBbNF0sIC8qICIvYmluLyIgKi8KKwkmdXNyX3NiaW5bNF0gIC8qICIvc2Jpbi8iICovCisjICBpZiAhRU5BQkxFX0lOU1RBTExfTk9fVVNSCisJLHVzcl9iaW4KKwksdXNyX3NiaW4KKyMgIGVuZGlmCit9OworCisvKiBjcmVhdGUgKHN5bSlsaW5rcyBmb3IgZWFjaCBhcHBsZXQgKi8KK3N0YXRpYyB2b2lkIGluc3RhbGxfbGlua3MoY29uc3QgY2hhciAqYnVzeWJveCwgaW50IHVzZV9zeW1ib2xpY19saW5rcywKKwkJY2hhciAqY3VzdG9tX2luc3RhbGxfZGlyKQoreworCS8qIGRpcmVjdG9yeSB0YWJsZQorCSAqIHRoaXMgc2hvdWxkIGJlIGNvbnNpc3RlbnQgdy8gdGhlIGVudW0sCisJICogYnVzeWJveC5oOjpiYl9pbnN0YWxsX2xvY190LCBvciBlbHNlLi4uICovCisJaW50ICgqbGYpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKwljaGFyICpmcGM7CisJdW5zaWduZWQgaTsKKwlpbnQgcmM7CisKKwlsZiA9IGxpbms7CisJaWYgKHVzZV9zeW1ib2xpY19saW5rcykKKwkJbGYgPSBzeW1saW5rOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXBwbGV0X21haW4pOyBpKyspIHsKKwkJZnBjID0gY29uY2F0X3BhdGhfZmlsZSgKKwkJCQljdXN0b21faW5zdGFsbF9kaXIgPyBjdXN0b21faW5zdGFsbF9kaXIgOiBpbnN0YWxsX2RpcltBUFBMRVRfSU5TVEFMTF9MT0MoaSldLAorCQkJCUFQUExFVF9OQU1FKGkpKTsKKwkJLy8gZGVidWc6IGJiX2Vycm9yX21zZygiJXNsaW5raW5nICVzIHRvIGJ1c3lib3giLAorCQkvLwkJdXNlX3N5bWJvbGljX2xpbmtzID8gInN5bSIgOiAiIiwgZnBjKTsKKwkJcmMgPSBsZihidXN5Ym94LCBmcGMpOworCQlpZiAocmMgIT0gMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZwYyk7CisJCX0KKwkJZnJlZShmcGMpOworCX0KK30KKyMgZWxzZQorIyAgZGVmaW5lIGluc3RhbGxfbGlua3MoeCx5LHopICgodm9pZCkwKQorIyBlbmRpZgorCisvKiBJZiB3ZSB3ZXJlIGNhbGxlZCBhcyAiYnVzeWJveC4uLiIgKi8KK3N0YXRpYyBpbnQgYnVzeWJveF9tYWluKGNoYXIgKiphcmd2KQoreworCWlmICghYXJndlsxXSkgeworCQkvKiBDYWxsZWQgd2l0aG91dCBhcmd1bWVudHMgKi8KKwkJY29uc3QgY2hhciAqYTsKKwkJaW50IGNvbDsKKwkJdW5zaWduZWQgb3V0cHV0X3dpZHRoOworIGhlbHA6CisJCW91dHB1dF93aWR0aCA9IDgwOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRIKSB7CisJCQkvKiBPYnRhaW4gdGhlIHRlcm1pbmFsIHdpZHRoICovCisJCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZvdXRwdXRfd2lkdGgsIE5VTEwpOworCQl9CisKKwkJZHVwMigxLCAyKTsKKwkJZnVsbF93cml0ZTJfc3RyKGJiX2Jhbm5lcik7IC8qIHJldXNlIGNvbnN0IHN0cmluZyAqLworCQlmdWxsX3dyaXRlMl9zdHIoIiBtdWx0aS1jYWxsIGJpbmFyeS5cbiIpOyAvKiByZXVzZSAqLworCQlmdWxsX3dyaXRlMl9zdHIoCisJCQkiQ29weXJpZ2h0IChDKSAxOTk4LTIwMTEgRXJpayBBbmRlcnNlbiwgUm9iIExhbmRsZXksIERlbnlzIFZsYXNlbmtvXG4iCisJCQkiYW5kIG90aGVycy4gTGljZW5zZWQgdW5kZXIgR1BMdjIuXG4iCisJCQkiU2VlIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIGZ1bGwgbm90aWNlLlxuIgorCQkJIlxuIgorCQkJIlVzYWdlOiBidXN5Ym94IFtmdW5jdGlvbl0gW2FyZ3VtZW50c10uLi5cbiIKKwkJCSIgICBvcjogYnVzeWJveCAtLWxpc3RbLWZ1bGxdXG4iCisJCQkiICAgb3I6IGZ1bmN0aW9uIFthcmd1bWVudHNdLi4uXG4iCisJCQkiXG4iCisJCQkiXHRCdXN5Qm94IGlzIGEgbXVsdGktY2FsbCBiaW5hcnkgdGhhdCBjb21iaW5lcyBtYW55IGNvbW1vbiBVbml4XG4iCisJCQkiXHR1dGlsaXRpZXMgaW50byBhIHNpbmdsZSBleGVjdXRhYmxlLiAgTW9zdCBwZW9wbGUgd2lsbCBjcmVhdGUgYVxuIgorCQkJIlx0bGluayB0byBidXN5Ym94IGZvciBlYWNoIGZ1bmN0aW9uIHRoZXkgd2lzaCB0byB1c2UgYW5kIEJ1c3lCb3hcbiIKKwkJCSJcdHdpbGwgYWN0IGxpa2Ugd2hhdGV2ZXIgaXQgd2FzIGludm9rZWQgYXMuXG4iCisJCQkiXG4iCisJCQkiQ3VycmVudGx5IGRlZmluZWQgZnVuY3Rpb25zOlxuIgorCQkpOworCQljb2wgPSAwOworCQlhID0gYXBwbGV0X25hbWVzOworCQkvKiBwcmV2ZW50IGxhc3QgY29tbWEgdG8gYmUgaW4gdGhlIHZlcnkgbGFzdCBwb3MgKi8KKwkJb3V0cHV0X3dpZHRoLS07CisJCXdoaWxlICgqYSkgeworCQkJaW50IGxlbjIgPSBzdHJsZW4oYSkgKyAyOworCQkJaWYgKGNvbCA+PSAoaW50KW91dHB1dF93aWR0aCAtIGxlbjIpIHsKKwkJCQlmdWxsX3dyaXRlMl9zdHIoIixcbiIpOworCQkJCWNvbCA9IDA7CisJCQl9CisJCQlpZiAoY29sID09IDApIHsKKwkJCQljb2wgPSA2OworCQkJCWZ1bGxfd3JpdGUyX3N0cigiXHQiKTsKKwkJCX0gZWxzZSB7CisJCQkJZnVsbF93cml0ZTJfc3RyKCIsICIpOworCQkJfQorCQkJZnVsbF93cml0ZTJfc3RyKGEpOworCQkJY29sICs9IGxlbjI7CisJCQlhICs9IGxlbjIgLSAxOworCQl9CisJCWZ1bGxfd3JpdGUyX3N0cigiXG5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmNtcChhcmd2WzFdLCAiLS1saXN0IiwgNikgPT0gMCkgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJY29uc3QgY2hhciAqYSA9IGFwcGxldF9uYW1lczsKKwkJZHVwMigxLCAyKTsKKwkJd2hpbGUgKCphKSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUgorCQkJaWYgKGFyZ3ZbMV1bNl0pIC8qIC0tbGlzdC1wYXRoPyAqLworCQkJCWZ1bGxfd3JpdGUyX3N0cihpbnN0YWxsX2RpcltBUFBMRVRfSU5TVEFMTF9MT0MoaSldICsgMSk7CisjIGVuZGlmCisJCQlmdWxsX3dyaXRlMl9zdHIoYSk7CisJCQlmdWxsX3dyaXRlMl9zdHIoIlxuIik7CisJCQlpKys7CisJCQlhICs9IHN0cmxlbihhKSArIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUiAmJiBzdHJjbXAoYXJndlsxXSwgIi0taW5zdGFsbCIpID09IDApIHsKKwkJaW50IHVzZV9zeW1ib2xpY19saW5rczsKKwkJY29uc3QgY2hhciAqYnVzeWJveDsKKworCQlidXN5Ym94ID0geG1hbGxvY19yZWFkbGluayhiYl9idXN5Ym94X2V4ZWNfcGF0aCk7CisJCWlmICghYnVzeWJveCkgeworCQkJLyogYmJfYnVzeWJveF9leGVjX3BhdGggaXMgdXN1YWxseSAiL3Byb2Mvc2VsZi9leGUiLgorCQkJICogSW4gY2hyb290LCByZWFkbGluaygiL3Byb2Mvc2VsZi9leGUiKSB1c3VhbGx5IGZhaWxzLgorCQkJICogSW4gc3VjaCBjYXNlLCBiZXR0ZXIgdXNlIGFyZ3ZbMF0gYXMgc3ltbGluayB0YXJnZXQKKwkJCSAqIGlmIGl0IGlzIGEgZnVsbCBwYXRoIG5hbWUuCisJCQkgKi8KKwkJCWlmIChhcmd2WzBdWzBdICE9ICcvJykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCIsIGFyZ3ZbMF0pOworCQkJYnVzeWJveCA9IGFyZ3ZbMF07CisJCX0KKwkJLyogYnVzeWJveCAtLWluc3RhbGwgWy1zXSBbRElSXToKKwkJICogLXM6IG1ha2Ugc3ltbGlua3MKKwkJICogRElSOiBkaXJlY3RvcnkgdG8gaW5zdGFsbCBsaW5rcyB0bworCQkgKi8KKwkJdXNlX3N5bWJvbGljX2xpbmtzID0gKGFyZ3ZbMl0gJiYgc3RyY21wKGFyZ3ZbMl0sICItcyIpID09IDAgJiYgYXJndisrKTsKKwkJaW5zdGFsbF9saW5rcyhidXN5Ym94LCB1c2Vfc3ltYm9saWNfbGlua3MsIGFyZ3ZbMl0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwKSB7CisJCS8qICJidXN5Ym94IC0taGVscCBbPGFwcGxldD5dIiAqLworCQlpZiAoIWFyZ3ZbMl0pCisJCQlnb3RvIGhlbHA7CisJCS8qIGNvbnZlcnQgdG8gIjxhcHBsZXQ+IC0taGVscCIgKi8KKwkJYXJndlswXSA9IGFyZ3ZbMl07CisJCWFyZ3ZbMl0gPSBOVUxMOworCX0gZWxzZSB7CisJCS8qICJidXN5Ym94IDxhcHBsZXQ+IGFyZzEgYXJnMiAuLi4iICovCisJCWFyZ3YrKzsKKwl9CisJLyogV2Ugc3VwcG9ydCAiYnVzeWJveCAvYS9wYXRoL3RvL2FwcGxldCBhcmdzLi4uIiB0b28uIEFsbG93cyBmb3IKKwkgKiAiIyEvYmluL2J1c3lib3giLXN0eWxlIHdyYXBwZXJzICovCisJYXBwbGV0X25hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGFyZ3ZbMF0pOworCXJ1bl9hcHBsZXRfYW5kX2V4aXQoYXBwbGV0X25hbWUsIGFyZ3YpOworCisJLypiYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXBwbGV0IG5vdCBmb3VuZCIpOyAtIHN1Y2tzIGluIHByaW50ZiAqLworCWZ1bGxfd3JpdGUyX3N0cihhcHBsZXRfbmFtZSk7CisJZnVsbF93cml0ZTJfc3RyKCI6IGFwcGxldCBub3QgZm91bmRcbiIpOworCXhmdW5jX2RpZSgpOworfQorCit2b2lkIEZBU1RfRlVOQyBydW5fYXBwbGV0X25vX2FuZF9leGl0KGludCBhcHBsZXRfbm8sIGNoYXIgKiphcmd2KQoreworCWludCBhcmdjID0gMTsKKworCXdoaWxlIChhcmd2W2FyZ2NdKQorCQlhcmdjKys7CisKKwkvKiBSZWluaXQgc29tZSBzaGFyZWQgZ2xvYmFsIGRhdGEgKi8KKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisKKwlhcHBsZXRfbmFtZSA9IEFQUExFVF9OQU1FKGFwcGxldF9ubyk7CisJaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApIHsKKwkJLyogU3BlY2lhbCBjYXNlLiBQT1NJWCBzYXlzICJ0ZXN0IC0taGVscCIKKwkJICogc2hvdWxkIGJlIG5vIGRpZmZlcmVudCBmcm9tIGUuZy4gInRlc3QgLS1mb28iLiAgKi8KKy8vVE9ETzoganVzdCBjb21wYXJlIGFwcGxldF9ubyB3aXRoIEFQUExFVF9OT190ZXN0CisJCWlmICghRU5BQkxFX1RFU1QgfHwgc3RyY21wKGFwcGxldF9uYW1lLCAidGVzdCIpICE9IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9TVUlEKQorCQljaGVja19zdWlkKGFwcGxldF9ubyk7CisJZXhpdChhcHBsZXRfbWFpblthcHBsZXRfbm9dKGFyZ2MsIGFyZ3YpKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcnVuX2FwcGxldF9hbmRfZXhpdChjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYXBwbGV0ID0gZmluZF9hcHBsZXRfYnlfbmFtZShuYW1lKTsKKwlpZiAoYXBwbGV0ID49IDApCisJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYXBwbGV0LCBhcmd2KTsKKwlpZiAoc3RybmNtcChuYW1lLCAiYnVzeWJveCIsIDcpID09IDApCisJCWV4aXQoYnVzeWJveF9tYWluKGFyZ3YpKTsKK30KKworI2VuZGlmIC8qICFkZWZpbmVkKFNJTkdMRV9BUFBMRVRfTUFJTikgKi8KKworCisKKyNpZiBFTkFCTEVfQlVJTERfTElCQlVTWUJPWAoraW50IGxiYl9tYWluKGNoYXIgKiphcmd2KQorI2Vsc2UKK2ludCBtYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCisjZW5kaWYKK3sKKwkvKiBUd2VhayBtYWxsb2MgZm9yIHJlZHVjZWQgbWVtb3J5IGNvbnN1bXB0aW9uICovCisjaWZkZWYgTV9UUklNX1RIUkVTSE9MRAorCS8qIE1fVFJJTV9USFJFU0hPTEQgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGZyZWVkIHRvcC1tb3N0IG1lbW9yeQorCSAqIHRvIGtlZXAgYmVmb3JlIHJlbGVhc2luZyB0byB0aGUgT1MKKwkgKiBEZWZhdWx0IGlzIHdheSB0b28gYmlnOiAyNTZrCisJICovCisJbWFsbG9wdChNX1RSSU1fVEhSRVNIT0xELCA4ICogMTAyNCk7CisjZW5kaWYKKyNpZmRlZiBNX01NQVBfVEhSRVNIT0xECisJLyogTV9NTUFQX1RIUkVTSE9MRCBpcyB0aGUgcmVxdWVzdCBzaXplIHRocmVzaG9sZCBmb3IgdXNpbmcgbW1hcCgpCisJICogRGVmYXVsdCBpcyB0b28gYmlnOiAyNTZrCisJICovCisJbWFsbG9wdChNX01NQVBfVEhSRVNIT0xELCAzMiAqIDEwMjQgLSAyNTYpOworI2VuZGlmCisKKyNpZiAhQkJfTU1VCisJLyogTk9NTVUgcmUtZXhlYyB0cmljayBzZXRzIGhpZ2gtb3JkZXIgYml0IGluIGZpcnN0IGJ5dGUgb2YgbmFtZSAqLworCWlmIChhcmd2WzBdWzBdICYgMHg4MCkgeworCQlyZV9leGVjZWQgPSAxOworCQlhcmd2WzBdWzBdICY9IDB4N2Y7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNJTkdMRV9BUFBMRVRfTUFJTikKKwkvKiBPbmx5IG9uZSBhcHBsZXQgaXMgc2VsZWN0ZWQgaW4gLmNvbmZpZyAqLworCWlmIChhcmd2WzFdICYmIHN0cm5jbXAoYXJndlswXSwgImJ1c3lib3giLCA3KSA9PSAwKSB7CisJCS8qICJidXN5Ym94IDxhcHBsZXQ+IDxwYXJhbXM+IiBzaG91bGQgc3RpbGwgd29yayBhcyBleHBlY3RlZCAqLworCQlhcmd2Kys7CisJfQorCS8qIGFwcGxldF9uYW1lcyBpbiB0aGlzIGNhc2UgaXMganVzdCAiYXBwbGV0XDBcMCIgKi8KKwlsYmJfcHJlcGFyZShhcHBsZXRfbmFtZXMgSUZfRkVBVFVSRV9JTkRJVklEVUFMKCwgYXJndikpOworCXJldHVybiBTSU5HTEVfQVBQTEVUX01BSU4oYXJnYywgYXJndik7CisjZWxzZQorCWxiYl9wcmVwYXJlKCJidXN5Ym94IiBJRl9GRUFUVVJFX0lORElWSURVQUwoLCBhcmd2KSk7CisKKwlhcHBsZXRfbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGFwcGxldF9uYW1lWzBdID09ICctJykKKwkJYXBwbGV0X25hbWUrKzsKKwlhcHBsZXRfbmFtZSA9IGJiX2Jhc2VuYW1lKGFwcGxldF9uYW1lKTsKKworCXBhcnNlX2NvbmZpZ19maWxlKCk7IC8qIC4uLm1heWJlLCBpZiBGRUFUVVJFX1NVSURfQ09ORklHICovCisKKwlydW5fYXBwbGV0X2FuZF9leGl0KGFwcGxldF9uYW1lLCBhcmd2KTsKKworCS8qYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFwcGxldCBub3QgZm91bmQiKTsgLSBzdWNrcyBpbiBwcmludGYgKi8KKwlmdWxsX3dyaXRlMl9zdHIoYXBwbGV0X25hbWUpOworCWZ1bGxfd3JpdGUyX3N0cigiOiBhcHBsZXQgbm90IGZvdW5kXG4iKTsKKwl4ZnVuY19kaWUoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYmIvYXNrX2NvbmZpcm1hdGlvbi5jIGIvbGliYmIvYXNrX2NvbmZpcm1hdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTcyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9hc2tfY29uZmlybWF0aW9uLmMKQEAgLTAsMCArMSwyNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfYXNrX2NvbmZpcm1hdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogUmVhZCBhIGxpbmUgZnJvbSBzdGRpbi4gIElmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyIGlzICd5JyBvciAnWScsCisgKiByZXR1cm4gMS4gIE90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBGQVNUX0ZVTkMgYmJfYXNrX2NvbmZpcm1hdGlvbih2b2lkKQoreworCWNoYXIgZmlyc3QgPSAwOworCWludCBjOworCisJd2hpbGUgKCgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKSAmJiAoYyAhPSAnXG4nKSkgeworCQlpZiAoZmlyc3QgPT0gMCAmJiAhaXNibGFuayhjKSkgeworCQkJZmlyc3QgPSBjfDB4MjA7CisJCX0KKwl9CisKKwlyZXR1cm4gZmlyc3QgPT0gJ3knOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvYmJfYXNrcGFzcy5jIGIvbGliYmIvYmJfYXNrcGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDE4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9iYl9hc2twYXNzLmMKQEAgLTAsMCArMSw4NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQXNrIGZvciBhIHBhc3N3b3JkCisgKiBJIHVzZSBhIHN0YXRpYyBidWZmZXIgaW4gdGhpcyBmdW5jdGlvbi4gIFBsYW4gYWNjb3JkaW5nbHkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIGRvIG5vdGhpbmcgc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGFza3Bhc3NfdGltZW91dChpbnQgVU5VU0VEX1BBUkFNIGlnbm9yZSkKK3sKK30KKworY2hhciogRkFTVF9GVU5DIGJiX2Fza19zdGRpbihjb25zdCBjaGFyICpwcm9tcHQpCit7CisJcmV0dXJuIGJiX2FzayhTVERJTl9GSUxFTk8sIDAsIHByb21wdCk7Cit9CitjaGFyKiBGQVNUX0ZVTkMgYmJfYXNrKGNvbnN0IGludCBmZCwgaW50IHRpbWVvdXQsIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwkvKiBXYXMgc3RhdGljIGNoYXJbQklHTlVNXSAqLworCWVudW0geyBzaXplb2ZfcGFzc3dkID0gMTI4IH07CisJc3RhdGljIGNoYXIgKnBhc3N3ZDsKKworCWNoYXIgKnJldDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvbGRzYTsKKwlzdHJ1Y3QgdGVybWlvcyB0aW8sIG9sZHRpbzsKKworCXRjZ2V0YXR0cihmZCwgJm9sZHRpbyk7CisJdGNmbHVzaChmZCwgVENJRkxVU0gpOworCXRpbyA9IG9sZHRpbzsKKyNpZm5kZWYgSVVDTEMKKyMgZGVmaW5lIElVQ0xDIDAKKyNlbmRpZgorCXRpby5jX2lmbGFnICY9IH4oSVVDTEN8SVhPTnxJWE9GRnxJWEFOWSk7CisJdGlvLmNfbGZsYWcgJj0gfihFQ0hPfEVDSE9FfEVDSE9LfEVDSE9OTHxUT1NUT1ApOworCXRjc2V0YXR0cihmZCwgVENTQU5PVywgJnRpbyk7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkvKiBzYS5zYV9mbGFncyA9IDA7IC0gbm8gU0FfUkVTVEFSVCEgKi8KKwkvKiBTSUdJTlQgYW5kIFNJR0FMUk0gd2lsbCBpbnRlcnJ1cHQgcmVhZHMgYmVsb3cgKi8KKwlzYS5zYV9oYW5kbGVyID0gYXNrcGFzc190aW1lb3V0OworCXNpZ2FjdGlvbihTSUdJTlQsICZzYSwgJm9sZHNhKTsKKwlpZiAodGltZW91dCkgeworCQlzaWdhY3Rpb25fc2V0KFNJR0FMUk0sICZzYSk7CisJCWFsYXJtKHRpbWVvdXQpOworCX0KKworCWZwdXRzKHByb21wdCwgc3Rkb3V0KTsKKwlmZmx1c2hfYWxsKCk7CisKKwlpZiAoIXBhc3N3ZCkKKwkJcGFzc3dkID0geG1hbGxvYyhzaXplb2ZfcGFzc3dkKTsKKwlyZXQgPSBwYXNzd2Q7CisJaSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IHIgPSByZWFkKGZkLCAmcmV0W2ldLCAxKTsKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiByZWFkIGlzIGludGVycnVwdGVkIGJ5IHRpbWVvdXQgb3IgXkMgKi8KKwkJCXJldCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAociA9PSAwIC8qIEVPRiAqLworCQkgfHwgcmV0W2ldID09ICdccicgfHwgcmV0W2ldID09ICdcbicgLyogRU9MICovCisJCSB8fCArK2kgPT0gc2l6ZW9mX3Bhc3N3ZC0xIC8qIGxpbmUgbGltaXQgKi8KKwkJKSB7CisJCQlyZXRbaV0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodGltZW91dCkgeworCQlhbGFybSgwKTsKKwl9CisJc2lnYWN0aW9uX3NldChTSUdJTlQsICZvbGRzYSk7CisJdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmb2xkdGlvKTsKKwliYl9wdXRjaGFyKCdcbicpOworCWZmbHVzaF9hbGwoKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYmIvYmJfYnN3YXBfNjQuYyBiL2xpYmJiL2JiX2Jzd2FwXzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZDUzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2JiX2Jzd2FwXzY0LmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmICEoVUxPTkdfTUFYID4gMHhmZmZmZmZmZikKK3VpbnQ2NF90IEZBU1RfRlVOQyBiYl9ic3dhcF82NCh1aW50NjRfdCB4KQoreworCXJldHVybiBic3dhcF82NCh4KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvYmJfZG9fZGVsYXkuYyBiL2xpYmJiL2JiX2RvX2RlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2JiX2RvX2RlbGF5LmMKQEAgLTAsMCArMSwyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQnVzeWJveCB1dGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBUaXRvIFJhZ3VzYSA8dGl0by13b2xpdEB0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGJiX2RvX2RlbGF5KGludCBzZWNvbmRzKQoreworCXRpbWVfdCBzdGFydCwgbm93OworCisJc3RhcnQgPSB0aW1lKE5VTEwpOworCWRvIHsKKwkJc2xlZXAoc2Vjb25kcyk7CisJCW5vdyA9IHRpbWUoTlVMTCk7CisJfSB3aGlsZSAoKG5vdyAtIHN0YXJ0KSA8IHNlY29uZHMpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvYmJfcHdkLmMgYi9saWJiYi9iYl9wd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI5YjcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYmJfcHdkLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBhc3N3b3JkIHV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUT0RPOiBtYXliZSBjaGFuZ2UgQVBJIHRvIHJldHVybiBtYWxsb2NlZCBkYXRhPworICogVGhpcyB3aWxsIGFsbG93IHRvIHN0b3AgdXNpbmcgbGliYyBmdW5jdGlvbnMgcmV0dXJuaW5nCisgKiBwb2ludGVycyB0byBzdGF0aWMgZGF0YSAoZ2V0cHd1aWQpCisgKi8KKworc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIHhnZXRwd25hbShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHduYW0obmFtZSk7CisJaWYgKCFwdykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gdXNlciAlcyIsIG5hbWUpOworCXJldHVybiBwdzsKK30KKworc3RydWN0IGdyb3VwKiBGQVNUX0ZVTkMgeGdldGdybmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdyb3VwICpnciA9IGdldGdybmFtKG5hbWUpOworCWlmICghZ3IpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIGdyb3VwICVzIiwgbmFtZSk7CisJcmV0dXJuIGdyOworfQorCisKK3N0cnVjdCBwYXNzd2QqIEZBU1RfRlVOQyB4Z2V0cHd1aWQodWlkX3QgdWlkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKKwlpZiAoIXB3KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB1aWQgJXUiLCAodW5zaWduZWQpdWlkKTsKKwlyZXR1cm4gcHc7Cit9CisKK3N0cnVjdCBncm91cCogRkFTVF9GVU5DIHhnZXRncmdpZChnaWRfdCBnaWQpCit7CisJc3RydWN0IGdyb3VwICpnciA9IGdldGdyZ2lkKGdpZCk7CisJaWYgKCFncikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gZ2lkICV1IiwgKHVuc2lnbmVkKWdpZCk7CisJcmV0dXJuIGdyOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeHVpZDJ1bmFtZSh1aWRfdCB1aWQpCit7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSB4Z2V0cHd1aWQodWlkKTsKKwlyZXR1cm4gcHctPnB3X25hbWU7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4Z2lkMmdyb3VwKGdpZF90IGdpZCkKK3sKKwlzdHJ1Y3QgZ3JvdXAgKmdyID0geGdldGdyZ2lkKGdpZCk7CisJcmV0dXJuIGdyLT5ncl9uYW1lOworfQorCitjaGFyKiBGQVNUX0ZVTkMgdWlkMnVuYW1lKHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisJcmV0dXJuIChwdykgPyBwdy0+cHdfbmFtZSA6IE5VTEw7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBnaWQyZ3JvdXAoZ2lkX3QgZ2lkKQoreworCXN0cnVjdCBncm91cCAqZ3IgPSBnZXRncmdpZChnaWQpOworCXJldHVybiAoZ3IpID8gZ3ItPmdyX25hbWUgOiBOVUxMOworfQorCitjaGFyKiBGQVNUX0ZVTkMgdWlkMnVuYW1lX3V0b2EodWlkX3QgdWlkKQoreworCWNoYXIgKm5hbWUgPSB1aWQydW5hbWUodWlkKTsKKwlyZXR1cm4gKG5hbWUpID8gbmFtZSA6IHV0b2EodWlkKTsKK30KKworY2hhciogRkFTVF9GVU5DIGdpZDJncm91cF91dG9hKGdpZF90IGdpZCkKK3sKKwljaGFyICpuYW1lID0gZ2lkMmdyb3VwKGdpZCk7CisJcmV0dXJuIChuYW1lKSA/IG5hbWUgOiB1dG9hKGdpZCk7Cit9CisKK2xvbmcgRkFTVF9GVU5DIHh1bmFtZTJ1aWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpteXVzZXI7CisKKwlteXVzZXIgPSB4Z2V0cHduYW0obmFtZSk7CisJcmV0dXJuIG15dXNlci0+cHdfdWlkOworfQorCitsb25nIEZBU1RfRlVOQyB4Z3JvdXAyZ2lkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdyb3VwICpteWdyb3VwOworCisJbXlncm91cCA9IHhnZXRncm5hbShuYW1lKTsKKwlyZXR1cm4gbXlncm91cC0+Z3JfZ2lkOworfQorCit1bnNpZ25lZCBsb25nIEZBU1RfRlVOQyBnZXRfdWdfaWQoY29uc3QgY2hhciAqcywKKwkJbG9uZyBGQVNUX0ZVTkMgKCp4bmFtZTJpZCkoY29uc3QgY2hhciAqKSkKK3sKKwl1bnNpZ25lZCBsb25nIHI7CisKKwlyID0gYmJfc3RydG91bChzLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vKQorCQlyZXR1cm4geG5hbWUyaWQocyk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9iYl9xc29ydC5jIGIvbGliYmIvYmJfcXNvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRlNzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYmJfcXNvcnQuYwpAQCAtMCwwICsxLDIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBXcmFwcGVyIGZvciBjb21tb24gc3RyaW5nIHZlY3RvciBzb3J0aW5nIG9wZXJhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCAvKiBub3QgRkFTVF9GVU5DISAqLyBiYl9wc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHN0cmNtcCgqKGNoYXIqKilhLCAqKGNoYXIqKiliKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcXNvcnRfc3RyaW5nX3ZlY3RvcihjaGFyICoqc3YsIHVuc2lnbmVkIGNvdW50KQoreworCXFzb3J0KHN2LCBjb3VudCwgc2l6ZW9mKGNoYXIqKSwgYmJfcHN0cmNtcCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9iYl9zdHJ0b2QuYyBiL2xpYmJiL2JiX3N0cnRvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGU3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9iYl9zdHJ0b2QuYwpAQCAtMCwwICsxLDg4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG1hdGguaD4gIC8qIGp1c3QgZm9yIEhVR0VfVkFMICovCisKKyNkZWZpbmUgTk9UX0RJR0lUKGEpICgoKHVuc2lnbmVkIGNoYXIpKGEtJzAnKSkgPiA5KQorCisjaWYgMCAvLyBVTlVTRUQKK2RvdWJsZSBGQVNUX0ZVTkMgYmJfc3RydG9kKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHApCit7CisJZG91YmxlIHY7CisJY2hhciAqZW5kcHRyOworCisJLyogQWxsb3cgLk5OIGZvcm0uIFBlb3BsZSB3YW50IHRvIHVzZSAic2xlZXAgLjE1IiBldGMgKi8KKwlpZiAoYXJnWzBdICE9ICctJyAmJiBhcmdbMF0gIT0gJy4nICYmIE5PVF9ESUdJVChhcmdbMF0pKQorCQlnb3RvIGVycjsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvZChhcmcsICZlbmRwdHIpOworCWlmIChlbmRwKQorCQkqZW5kcCA9IGVuZHB0cjsKKwlpZiAoZW5kcHRyWzBdKSB7CisJCS8qICIxMjM0YWJjZyIgb3Igb3V0LW9mLXJhbmdlPyAqLworCQlpZiAoaXNhbG51bShlbmRwdHJbMF0pIHx8IGVycm5vKSB7CisgZXJyOgorCQkJZXJybm8gPSBFUkFOR0U7CisJCQlyZXR1cm4gSFVHRV9WQUw7CisJCX0KKwkJLyogZ29vZCBudW1iZXIsIGp1c3Qgc3VzcGljaW91cyB0ZXJtaW5hdG9yICovCisJCWVycm5vID0gRUlOVkFMOworCX0KKwlyZXR1cm4gdjsKK30KKyNlbmRpZgorCisjaWYgMAorLyogU3RyaW5nIHRvIHRpbWVzcGVjOiAiTk5OTlsuTk5OTk5dIiAtPiBzdHJ1Y3QgdGltZXNwZWMuCisgKiBDYW4gYmUgdXNlZCBmb3Igb3RoZXIgZml4ZWQtcG9pbnQgbmVlZHMuCisgKiBSZXR1cm5zIHBvaW50ZXIgcGFzdCBsYXN0IGNvbnZlcnRlZCBjaGFyLAorICogYW5kIHJldHVybnMgZXJybm8gc2ltaWxhciB0byBiYl9zdHJ0b1hYIGZ1bmN0aW9ucy4KKyAqLworY2hhciogRkFTVF9GVU5DIGJiX3N0cl90b190cyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCBjb25zdCBjaGFyICphcmcpCit7CisJaWYgKHNpemVvZih0cy0+dHZfc2VjKSA8PSBzaXplb2YoaW50KSkKKwkJdHMtPnR2X3NlYyA9IGJiX3N0cnRvdShhcmcsICZhcmcsIDEwKTsKKwllbHNlIGlmIChzaXplb2YodHMtPnR2X3NlYykgPD0gc2l6ZW9mKGxvbmcpKQorCQl0cy0+dHZfc2VjID0gYmJfc3RydG91bChhcmcsICZhcmcsIDEwKTsKKwllbHNlCisJCXRzLT50dl9zZWMgPSBiYl9zdHJ0b3VsbChhcmcsICZhcmcsIDEwKTsKKwl0cy0+dHZfbnNlYyA9IDA7CisKKwlpZiAoKmFyZyAhPSAnLicpCisJCXJldHVybiBhcmc7CisKKwkvKiAhRUlOVkFMOiBudW1iZXIgaXMgbm90IG9rIChhbHBoYW51bWVyaWMgZW5kaW5nLCBvdmVyZmxvdyBldGMpICovCisJaWYgKGVycm5vICE9IEVJTlZBTCkKKwkJcmV0dXJuIGFyZzsKKworCWlmICghKisrYXJnKSAvKiAiTk5OLiIgKi8KKwkJcmV0dXJuIGFyZzsKKworCXsgLyogIk5OTi54eHgiIC0gcGFyc2UgeHh4ICovCisJCWludCBuZGlnaXRzOworCQljaGFyICpwOworCQljaGFyIGJ1ZlsxMF07IC8qIHdlIG5ldmVyIHVzZSBtb3JlIHRoYW4gOSBkaWdpdHMgKi8KKworCQkvKiBOZWVkIHRvIG1ha2UgYSBjb3B5IHRvIGF2b2lkIGZhbHNlIG92ZXJmbG93ICovCisJCXNhZmVfc3RybmNweShidWYsIGFyZywgMTApOworCQl0cy0+dHZfbnNlYyA9IGJiX3N0cnRvdShidWYsICZwLCAxMCk7CisJCW5kaWdpdHMgPSBwIC0gYnVmOworCQlhcmcgKz0gbmRpZ2l0czsKKwkJLyogbm9ybWFsaXplIHRvIG5zZWMgKi8KKwkJd2hpbGUgKG5kaWdpdHMgPCA5KSB7CisJCQluZGlnaXRzKys7CisJCQl0cy0+dHZfbnNlYyAqPSAxMDsKKwkJfQorCQl3aGlsZSAoaXNkaWdpdCgqYXJnKSkgLyogc2tpcCBwb3NzaWJsZSAxMHRoIHBsdXMgZGlnaXRzICovCisJCQlhcmcrKzsKKwl9CisJcmV0dXJuIGFyZzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvYmJfc3RydG9udW0uYyBiL2xpYmJiL2JiX3N0cnRvbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2Yzc3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2JiX3N0cnRvbnVtLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE9uIGV4aXQ6IGVycm5vID0gMCBvbmx5IGlmIHRoZXJlIHdhcyBub24tZW1wdHksICdcMCcgdGVybWluYXRlZCB2YWx1ZQorICogZXJybm8gPSBFSU5WQUwgaWYgdmFsdWUgd2FzIG5vdCAnXDAnIHRlcm1pbmF0ZWQsIGJ1dCBvdGhlcndpc2Ugb2sKKyAqICAgIFJldHVybiB2YWx1ZSBpcyBzdGlsbCB2YWxpZCwgY2FsbGVyIHNob3VsZCBqdXN0IGNoZWNrIHdoZXRoZXIgZW5kWzBdCisgKiAgICBpcyBhIHZhbGlkIHRlcm1pbmF0aW5nIGNoYXIgZm9yIHBhcnRpY3VsYXIgY2FzZS4gT1RPSCwgaWYgY2FsbGVyCisgKiAgICByZXF1aXJlcyAnXDAnIHRlcm1pbmF0ZWQgaW5wdXQsIFtzXWhlIGNhbiBqdXN0IGNoZWNrIGVycm5vID09IDAuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBoYWQgYWxwaGFudW1lcmljIHRlcm1pbmF0aW5nIGNoYXIgKCIxMjM0YWJjZyIpLgorICogZXJybm8gPSBFUkFOR0UgaWYgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLCBtaXNzaW5nLCBldGMuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBoYWQgbWludXMgc2lnbiBmb3Igc3RydG91WFggKGV2ZW4gIi0wIiBpcyBub3Qgb2sgKQorICogICAgcmV0dXJuIHZhbHVlIGlzIGFsbC1vbmVzIGluIHRoaXMgY2FzZS4KKyAqCisgKiBUZXN0IGNvZGU6CisgKiBjaGFyICplbmRwdHI7CisgKiBjb25zdCBjaGFyICptaW51cyA9ICItIjsKKyAqIGVycm5vID0gMDsKKyAqIGJiX3N0cnRvaShtaW51cywgJmVuZHB0ciwgMCk7IC8vIG11c3Qgc2V0IEVSQU5HRQorICogcHJpbnRmKCJtaW51czolcCBlbmRwdHI6JXAgZXJybm86JWQgRUlOVkFMOiVkXG4iLCBtaW51cywgZW5kcHRyLCBlcnJubywgRUlOVkFMKTsKKyAqIGVycm5vID0gMDsKKyAqIGJiX3N0cnRvaSgiLTAtIiwgJmVuZHB0ciwgMCk7IC8vIG11c3Qgc2V0IEVJTlZBTCBhbmQgcG9pbnQgdG8gc2Vjb25kICctJworICogcHJpbnRmKCJlbmRwdHJbMF06JWMgZXJybm86JWQgRUlOVkFMOiVkXG4iLCBlbmRwdHJbMF0sIGVycm5vLCBFSU5WQUwpOworICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcmV0X0VSQU5HRSh2b2lkKQoreworCWVycm5vID0gRVJBTkdFOyAvKiB0aGlzIGFpbid0IGFzIHNtYWxsIGFzIGl0IGxvb2tzIChvbiBnbGliYykgKi8KKwlyZXR1cm4gVUxMT05HX01BWDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBoYW5kbGVfZXJyb3JzKHVuc2lnbmVkIGxvbmcgbG9uZyB2LCBjaGFyICoqZW5kcCwgY2hhciAqZW5kcHRyKQoreworCWlmIChlbmRwKSAqZW5kcCA9IGVuZHB0cjsKKworCS8qIGVycm5vIGlzIGFscmVhZHkgc2V0IHRvIEVSQU5HRSBieSBzdHJ0b1hYWCBpZiB2YWx1ZSBvdmVyZmxvd2VkICovCisJaWYgKGVuZHB0clswXSkgeworCQkvKiAiMTIzNGFiY2ciIG9yIG91dC1vZi1yYW5nZT8gKi8KKwkJaWYgKGlzYWxudW0oZW5kcHRyWzBdKSB8fCBlcnJubykKKwkJCXJldHVybiByZXRfRVJBTkdFKCk7CisJCS8qIGdvb2QgbnVtYmVyLCBqdXN0IHN1c3BpY2lvdXMgdGVybWluYXRvciAqLworCQllcnJubyA9IEVJTlZBTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKKwordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b3VsbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwkvKiBzdHJ0b3VsKCIgIC00MjAwMDAwMDAwIikgcmV0dXJucyA5NDk2NzI5NiwgZXJybm8gMCAoISkgKi8KKwkvKiBJIGRvbid0IHRoaW5rIHRoYXQgdGhpcyBpcyByaWdodC4gUHJldmVudGluZyB0aGlzLi4uICovCisJaWYgKCFpc2FsbnVtKGFyZ1swXSkpIHJldHVybiByZXRfRVJBTkdFKCk7CisKKwkvKiBub3QgMTAwJSBjb3JyZWN0IGZvciBsaWIgZnVuYywgYnV0IGNvbnZlbmllbnQgZm9yIHRoZSBjYWxsZXIgKi8KKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWxsKGFyZywgJmVuZHB0ciwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKworbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCWNoYXIgKmVuZHB0cjsKKworCS8qIENoZWNrIGZvciB0aGUgd2VpcmQgImZlYXR1cmUiOgorCSAqIGEgIi0iIHN0cmluZyBpcyBhcHBhcmVudGx5IGEgdmFsaWQgIm51bWJlciIgZm9yIHN0cnRvW3VdbFtsXSEKKwkgKiBJdCByZXR1cm5zIHplcm8gYW5kIGVycm5vIGlzIDAhIDooICovCisJY2hhciBmaXJzdCA9IChhcmdbMF0gIT0gJy0nID8gYXJnWzBdIDogYXJnWzFdKTsKKwlpZiAoIWlzYWxudW0oZmlyc3QpKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCisJZXJybm8gPSAwOworCXYgPSBzdHJ0b2xsKGFyZywgJmVuZHB0ciwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKworI2lmIFVMT05HX01BWCAhPSBVTExPTkdfTUFYCit1bnNpZ25lZCBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b3VsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwlpZiAoIWlzYWxudW0oYXJnWzBdKSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWwoYXJnLCAmZW5kcHRyLCBiYXNlKTsKKwlyZXR1cm4gaGFuZGxlX2Vycm9ycyh2LCBlbmRwLCBlbmRwdHIpOworfQorCitsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b2woY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7CisJbG9uZyB2OworCWNoYXIgKmVuZHB0cjsKKworCWNoYXIgZmlyc3QgPSAoYXJnWzBdICE9ICctJyA/IGFyZ1swXSA6IGFyZ1sxXSk7CisJaWYgKCFpc2FsbnVtKGZpcnN0KSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKworCWVycm5vID0gMDsKKwl2ID0gc3RydG9sKGFyZywgJmVuZHB0ciwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKyNlbmRpZgorCisjaWYgVUlOVF9NQVggIT0gVUxPTkdfTUFYCit1bnNpZ25lZCBGQVNUX0ZVTkMgYmJfc3RydG91KGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwlpZiAoIWlzYWxudW0oYXJnWzBdKSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWwoYXJnLCAmZW5kcHRyLCBiYXNlKTsKKwlpZiAodiA+IFVJTlRfTUFYKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCXJldHVybiBoYW5kbGVfZXJyb3JzKHYsIGVuZHAsIGVuZHB0cik7Cit9CisKK2ludCBGQVNUX0ZVTkMgYmJfc3RydG9pKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCWxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwljaGFyIGZpcnN0ID0gKGFyZ1swXSAhPSAnLScgPyBhcmdbMF0gOiBhcmdbMV0pOworCWlmICghaXNhbG51bShmaXJzdCkpIHJldHVybiByZXRfRVJBTkdFKCk7CisKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvbChhcmcsICZlbmRwdHIsIGJhc2UpOworCWlmICh2ID4gSU5UX01BWCkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwlpZiAodiA8IElOVF9NSU4pIHJldHVybiByZXRfRVJBTkdFKCk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCwgZW5kcHRyKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvY2hhbmdlX2lkZW50aXR5LmMgYi9saWJiYi9jaGFuZ2VfaWRlbnRpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTlkYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvY2hhbmdlX2lkZW50aXR5LmMKQEAgLTAsMCArMSw0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDE5ODkgLSAxOTkxLCBKdWxpYW5uZSBGcmFuY2VzIEhhdWdoIDxqb2NrZ3JybEBhdXN0aW4ucnIuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSnVsaWFubmUgRi4gSGF1Z2ggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSlVMSUUgSEFVR0ggQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEpVTElFIEhBVUdIIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEJlY29tZSB0aGUgdXNlciBhbmQgZ3JvdXAocykgc3BlY2lmaWVkIGJ5IFBXLiAgKi8KK3ZvaWQgRkFTVF9GVU5DIGNoYW5nZV9pZGVudGl0eShjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwlpZiAoaW5pdGdyb3Vwcyhwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCkgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IGdyb3VwcyIpOworCWVuZGdyZW50KCk7IC8qIGhlbHBzIHRvIGNsb3NlIGEgZmQgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYmMgKi8KKwl4c2V0Z2lkKHB3LT5wd19naWQpOworCXhzZXR1aWQocHctPnB3X3VpZCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jaG9tcC5jIGIvbGliYmIvY2hvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkyYmVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvY2hvbXAuYwpAQCAtMCwwICsxLDE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgY2hvbXAoY2hhciAqcykKK3sKKwljaGFyICpsYyA9IGxhc3RfY2hhcl9pcyhzLCAnXG4nKTsKKworCWlmIChsYykKKwkJKmxjID0gJ1wwJzsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2NvbXBhcmVfc3RyaW5nX2FycmF5LmMgYi9saWJiYi9jb21wYXJlX3N0cmluZ19hcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTBjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9jb21wYXJlX3N0cmluZ19hcnJheS5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIHJldHVybnMgdGhlIGFycmF5IGluZGV4IG9mIHRoZSBzdHJpbmcgKi8KKy8qIChpbmRleCBvZiBmaXJzdCBtYXRjaCBpcyByZXR1cm5lZCwgb3IgLTEpICovCitpbnQgRkFTVF9GVU5DIGluZGV4X2luX3N0cl9hcnJheShjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgc3RyaW5nX2FycmF5W2ldICE9IDA7IGkrKykgeworCQlpZiAoc3RyY21wKHN0cmluZ19hcnJheVtpXSwga2V5KSA9PSAwKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBGQVNUX0ZVTkMgaW5kZXhfaW5fc3RyaW5ncyhjb25zdCBjaGFyICpzdHJpbmdzLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGlkeCA9IDA7CisKKwl3aGlsZSAoKnN0cmluZ3MpIHsKKwkJaWYgKHN0cmNtcChzdHJpbmdzLCBrZXkpID09IDApIHsKKwkJCXJldHVybiBpZHg7CisJCX0KKwkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOyAvKiBza2lwIE5VTCAqLworCQlpZHgrKzsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKiByZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgc3RyaW5nLCBldmVuIGlmIGl0IG1hdGNoZXMgb25seSBhIGJlZ2lubmluZyAqLworLyogKGluZGV4IG9mIGZpcnN0IG1hdGNoIGlzIHJldHVybmVkLCBvciAtMSkgKi8KKyNpZmRlZiBVTlVTRUQKK2ludCBGQVNUX0ZVTkMgaW5kZXhfaW5fc3Vic3RyX2FycmF5KGNvbnN0IGNoYXIgKmNvbnN0IHN0cmluZ19hcnJheVtdLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGk7CisJaW50IGxlbiA9IHN0cmxlbihrZXkpOworCWlmIChsZW4pIHsKKwkJZm9yIChpID0gMDsgc3RyaW5nX2FycmF5W2ldICE9IDA7IGkrKykgeworCQkJaWYgKHN0cm5jbXAoc3RyaW5nX2FycmF5W2ldLCBrZXksIGxlbikgPT0gMCkgeworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJfQorCXJldHVybiAtMTsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGluZGV4X2luX3N1YnN0cmluZ3MoY29uc3QgY2hhciAqc3RyaW5ncywgY29uc3QgY2hhciAqa2V5KQoreworCWludCBtYXRjaGVkX2lkeCA9IC0xOworCWNvbnN0IGludCBsZW4gPSBzdHJsZW4oa2V5KTsKKworCWlmIChsZW4pIHsKKwkJaW50IGlkeCA9IDA7CisJCXdoaWxlICgqc3RyaW5ncykgeworCQkJaWYgKHN0cm5jbXAoc3RyaW5ncywga2V5LCBsZW4pID09IDApIHsKKwkJCQlpZiAoc3RyaW5nc1tsZW5dID09ICdcMCcpCisJCQkJCXJldHVybiBpZHg7IC8qIGV4YWN0IG1hdGNoICovCisJCQkJaWYgKG1hdGNoZWRfaWR4ID49IDApCisJCQkJCXJldHVybiAtMTsgLyogYW1iaWd1b3VzIG1hdGNoICovCisJCQkJbWF0Y2hlZF9pZHggPSBpZHg7CisJCQl9CisJCQlzdHJpbmdzICs9IHN0cmxlbihzdHJpbmdzKSArIDE7IC8qIHNraXAgTlVMICovCisJCQlpZHgrKzsKKwkJfQorCX0KKwlyZXR1cm4gbWF0Y2hlZF9pZHg7Cit9CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBudGhfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGludCBuKQoreworCXdoaWxlIChuKSB7CisJCW4tLTsKKwkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOworCX0KKwlyZXR1cm4gc3RyaW5nczsKK30KKworI2lmZGVmIFVOVVNFRF9TT19GQVIgLyogb25seSBicmN0bC5jIG5lZWRzIGl0IHlldCAqLworLyogUmV0dXJucyAwIGZvciBubywgMSBmb3IgeWVzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuICAqLworc21hbGxpbnQgRkFTVF9GVU5DIHllc25vKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBub195ZXNbXSBBTElHTjEgPQorCQkiMFwwIiAib2ZmXDAiICJub1wwIgorCQkiMVwwIiAib25cMCIgInllc1wwIjsKKwlpbnQgcmV0ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhub195ZXMsIHN0cik7CisJcmV0dXJuIHJldCAvIDM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL2NvbmNhdF9wYXRoX2ZpbGUuYyBiL2xpYmJiL2NvbmNhdF9wYXRoX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQyOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvY29uY2F0X3BhdGhfZmlsZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSBtYW55IGRpZmZlcmVudCBwZW9wbGUuCisgKiBJZiB5b3Ugd3JvdGUgdGhpcywgcGxlYXNlIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIENvbmNhdGVuYXRlIHBhdGggYW5kIGZpbGVuYW1lIHRvIG5ldyBhbGxvY2F0ZWQgYnVmZmVyLgorICogQWRkICcvJyBvbmx5IGFzIG5lZWRlZCAobm8gZHVwbGljYXRlIC8vIGFyZSBwcm9kdWNlZCkuCisgKiBJZiBwYXRoIGlzIE5VTEwsIGl0IGlzIGFzc3VtZWQgdG8gYmUgIi8iLgorICogZmlsZW5hbWUgc2hvdWxkIG5vdCBiZSBOVUxMLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgY29uY2F0X3BhdGhfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpsYzsKKworCWlmICghcGF0aCkKKwkJcGF0aCA9ICIiOworCWxjID0gbGFzdF9jaGFyX2lzKHBhdGgsICcvJyk7CisJd2hpbGUgKCpmaWxlbmFtZSA9PSAnLycpCisJCWZpbGVuYW1lKys7CisJcmV0dXJuIHhhc3ByaW50ZigiJXMlcyVzIiwgcGF0aCwgKGxjPT1OVUxMID8gIi8iIDogIiIpLCBmaWxlbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jb25jYXRfc3VicGF0aF9maWxlLmMgYi9saWJiYi9jb25jYXRfc3VicGF0aF9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxNjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NvbmNhdF9zdWJwYXRoX2ZpbGUuYwpAQCAtMCwwICsxLDIzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgKEMpIDIwMDMgIFZsYWRpbWlyIE9sZXluaWsgIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICAgVGhpcyBmdW5jdGlvbiBtYWtlIHNwZWNpYWwgZm9yIHJlY3Vyc2l2ZSBhY3Rpb25zIHdpdGggdXNhZ2UKKyAgIGNvbmNhdF9wYXRoX2ZpbGUocGF0aCwgZmlsZW5hbWUpCisgICBhbmQgc2tpcHBpbmcgIi4iIGFuZCAiLi4iIGRpcmVjdG9yeSBlbnRyaWVzCisqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIGNvbmNhdF9zdWJwYXRoX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZikKK3sKKwlpZiAoZiAmJiBET1RfT1JfRE9URE9UKGYpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29uY2F0X3BhdGhfZmlsZShwYXRoLCBmKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2NvcHlfZmlsZS5jIGIvbGliYmIvY29weV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzM2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NvcHlfZmlsZS5jCkBAIC0wLDAgKzEsMzkzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNvcHlfZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICogU0VMaW51eCBzdXBwb3J0IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvLyBGRUFUVVJFX05PTl9QT1NJWF9DUDoKKy8vCisvLyBQT1NJWDogaWYgZXhpc3RzIGFuZCAtaSwgYXNrICh3L28gLWkgYXNzdW1lIHllcykuCisvLyBUaGVuIG9wZW4gdy9vIEVYQ0wgKHllcywgbm90IHVubGluayEpLgorLy8gSWYgb3BlbiBzdGlsbCBmYWlscyBhbmQgLWYsIHRyeSB1bmxpbmssIHRoZW4gdHJ5IG9wZW4gYWdhaW4uCisvLyBSZXN1bHQ6IGEgbWVzczoKKy8vIElmIGRlc3QgaXMgYSAoc3ltKWxpbmssIHdlIG92ZXJ3cml0ZSBsaW5rIGRlc3RpbmF0aW9uIQorLy8gKG9yIGZhaWwsIGlmIGl0IHBvaW50cyB0byBkaXIvbm9uZXhpc3RlbnQgbG9jYXRpb24vZXRjKS4KKy8vIFRoaXMgaXMgc3RyYW5nZSwgYnV0IFBPU0lYLWNvcnJlY3QuCisvLyBjb3JldXRpbHMgY3AgaGFzIC0tcmVtb3ZlLWRlc3RpbmF0aW9uIHRvIG92ZXJyaWRlIHRoaXMuLi4KKworLyogQ2FsbGVkIGlmIG9wZW4gb2YgZGVzdGluYXRpb24sIGxpbmsgY3JlYXRpb24gZXRjIGZhaWxzLgorICogZXJybm8gbXVzdCBiZSBzZXQgdG8gcmVsZXZhbnQgdmFsdWUgKCJ3aHkgd2UgY2Fubm90IGNyZWF0ZSBkZXN0PyIpCisgKiB0byBnaXZlIHJlYXNvbmFibGUgZXJyb3IgbWVzc2FnZSAqLworc3RhdGljIGludCBhc2tfYW5kX3VubGluayhjb25zdCBjaGFyICpkZXN0LCBpbnQgZmxhZ3MpCit7CisJaW50IGUgPSBlcnJubzsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9OT05fUE9TSVhfQ1AKKwlpZiAoIShmbGFncyAmIChGSUxFVVRJTFNfRk9SQ0V8RklMRVVUSUxTX0lOVEVSQUNUSVZFKSkpIHsKKwkJLyogRWl0aGVyIGl0IGV4aXN0cywgb3IgdGhlICpwYXRoKiBkb2VzbnQgZXhpc3QgKi8KKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBkZXN0KTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCS8vIGVsc2U6IGFjdCBhcyBpZiAtZiBpcyBhbHdheXMgaW4gZWZmZWN0LgorCS8vIFdlIGRvbid0IHdhbnQgImNhbid0IGNyZWF0ZSIgbXNnLCB3ZSB3YW50IHVubGluayB0byBiZSBkb25lCisJLy8gKHNpbGVudGx5IHVubGVzcyAtaSkuIFdoeT8gUE9TSVggY3AgdXN1YWxseSBzdWNjZWVkcyB3aXRoCisJLy8gT19UUlVOQyBvcGVuIG9mIGV4aXN0aW5nIGZpbGUsIGFuZCB1c2VyIGlzIGxlZnQgaWdub3JhbnRseSBoYXBweS4KKwkvLyBXaXRoIGFib3ZlIGJsb2NrIHVuY29uZGl0aW9uYWxseSBlbmFibGVkLCBub24tUE9TSVggY3AKKwkvLyB3aWxsIGNvbXBsYWluIGEgbG90IG1vcmUgdGhhbiBQT1NJWCBvbmUuCisKKwkvKiBUT0RPOiBtYXliZSB3ZSBzaG91bGQgZG8gaXQgb25seSBpZiBjdHR5IGlzIHByZXNlbnQ/ICovCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX0lOVEVSQUNUSVZFKSB7CisJCS8vIFdlIHdvdWxkIG5vdCBkbyBQT1NJWCBpbnNhbml0eS4gLWkgYXNrcywKKwkJLy8gdGhlbiBfdW5saW5rc18gdGhlIG9mZmVuZGVyLiBQcmVzdG8uCisJCS8vIChObyAib3BlbmluZyB3aXRob3V0IE9fRVhDTCIsIG5vICJ1bmxpbmsgb25seSBpZiAtZiIpCisJCS8vIE9yIGVsc2Ugd2Ugd2lsbCBlbmQgdXAgaGF2aW5nIDMgb3BlbigpcyEKKwkJZnByaW50ZihzdGRlcnIsICIlczogb3ZlcndyaXRlICclcyc/ICIsIGFwcGxldF9uYW1lLCBkZXN0KTsKKwkJaWYgKCFiYl9hc2tfY29uZmlybWF0aW9uKCkpCisJCQlyZXR1cm4gMDsgLyogbm90IGFsbG93ZWQgdG8gb3ZlcndyaXRlICovCisJfQorCWlmICh1bmxpbmsoZGVzdCkgPCAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJCWlmIChlID09IGVycm5vICYmIGUgPT0gRU5PRU5UKSB7CisJCQkvKiBlID09IEVOT1RESVIgaXMgc2ltaWxhcjogcGF0aCBoYXMgbm9uLWRpciBjb21wb25lbnQsCisJCQkgKiBidXQgaW4gdGhpcyBjYXNlIHdlIGRvbid0IGV2ZW4gcmVhY2ggY29weV9maWxlKCkgKi8KKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyc6IFBhdGggZG9lcyBub3QgZXhpc3QiLCBkZXN0KTsKKwkJCXJldHVybiAtMTsgLyogZXJyb3IgKi8KKwkJfQorI2VuZGlmCisJCWVycm5vID0gZTsgLyogZG8gbm90IHVzZSBlcnJubyBmcm9tIHVubGluayAqLworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIGRlc3QpOworCQlyZXR1cm4gLTE7IC8qIGVycm9yICovCisJfQorCXJldHVybiAxOyAvKiBvayAodG8gdHJ5IGFnYWluKSAqLworfQorCisvKiBSZXR1cm46CisgKiAtMSBlcnJvciwgY29weSBub3QgbWFkZQorICogIDAgY29weSBpcyBtYWRlIG9yIHVzZXIgYW5zd2VyZWQgIm5vIiBpbiBpbnRlcmFjdGl2ZSBtb2RlCisgKiAgICAoZmFpbHVyZXMgdG8gcHJlc2VydmUgbW9kZS9vd25lci90aW1lcyBhcmUgbm90IHJlcG9ydGVkIGluIGV4aXQgY29kZSkKKyAqLworaW50IEZBU1RfRlVOQyBjb3B5X2ZpbGUoY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICpkZXN0LCBpbnQgZmxhZ3MpCit7CisJLyogVGhpcyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiwgdHJ5IHRvIG1pbmltaXplIHN0YWNrIHVzYWdlICovCisJLyogTkI6IGVhY2ggc3RydWN0IHN0YXQgaXMgfjEwMCBieXRlcyAqLworCXN0cnVjdCBzdGF0IHNvdXJjZV9zdGF0OworCXN0cnVjdCBzdGF0IGRlc3Rfc3RhdDsKKwlzbWFsbGludCByZXR2YWwgPSAwOworCXNtYWxsaW50IGRlc3RfZXhpc3RzID0gMDsKKwlzbWFsbGludCBvdnI7CisKKy8qIEludmVyc2Ugb2YgY3AgLWQgKCJjcCB3aXRob3V0IC1kIikgKi8KKyNkZWZpbmUgRkxBR1NfREVSRUYgKGZsYWdzICYgKEZJTEVVVElMU19ERVJFRkVSRU5DRSArIEZJTEVVVElMU19ERVJFRkVSRU5DRV9MMCkpCisKKwlpZiAoKEZMQUdTX0RFUkVGID8gc3RhdCA6IGxzdGF0KShzb3VyY2UsICZzb3VyY2Vfc3RhdCkgPCAwKSB7CisJCS8qIFRoaXMgbWF5IGJlIGEgZGFuZ2xpbmcgc3ltbGluay4KKwkJICogTWFraW5nIFtzeW1dbGlua3MgdG8gZGFuZ2xpbmcgc3ltbGlua3Mgd29ya3MsIHNvLi4uICovCisJCWlmIChmbGFncyAmIChGSUxFVVRJTFNfTUFLRV9TT0ZUTElOS3xGSUxFVVRJTFNfTUFLRV9IQVJETElOSykpCisJCQlnb3RvIG1ha2VfbGlua3M7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIHNvdXJjZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobHN0YXQoZGVzdCwgJmRlc3Rfc3RhdCkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGRlc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNvdXJjZV9zdGF0LnN0X2RldiA9PSBkZXN0X3N0YXQuc3RfZGV2CisJCSAmJiBzb3VyY2Vfc3RhdC5zdF9pbm8gPT0gZGVzdF9zdGF0LnN0X2lubworCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiJyVzJyBhbmQgJyVzJyBhcmUgdGhlIHNhbWUgZmlsZSIsIHNvdXJjZSwgZGVzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZGVzdF9leGlzdHMgPSAxOworCX0KKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKChmbGFncyAmIEZJTEVVVElMU19QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUKSAmJiBpc19zZWxpbnV4X2VuYWJsZWQoKSA+IDApIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IGNvbjsKKwkJaWYgKGxnZXRmaWxlY29uKHNvdXJjZSwgJmNvbikgPj0gMCkgeworCQkJaWYgKHNldGZzY3JlYXRlY29uKGNvbikgPCAwKSB7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc2V0IHNldGZzY3JlYXRlY29uICVzIiwgY29uKTsKKwkJCQlmcmVlY29uKGNvbik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT1RTVVAgfHwgZXJybm8gPT0gRU5PREFUQSkgeworCQkJc2V0ZnNjcmVhdGVjb25fb3JfZGllKE5VTEwpOworCQl9IGVsc2UgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgbGdldGZpbGVjb24gJXMiLCBzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoU19JU0RJUihzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgeworCQlESVIgKmRwOworCQljb25zdCBjaGFyICp0cDsKKwkJc3RydWN0IGRpcmVudCAqZDsKKwkJbW9kZV90IHNhdmVkX3VtYXNrID0gMDsKKworCQlpZiAoIShmbGFncyAmIEZJTEVVVElMU19SRUNVUikpIHsKKwkJCWJiX2Vycm9yX21zZygib21pdHRpbmcgZGlyZWN0b3J5ICclcyciLCBzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogRGlkIHdlIGV2ZXIgY3JlYXRlIHNvdXJjZSBvdXJzZWxmIGJlZm9yZT8gKi8KKwkJdHAgPSBpc19pbl9pbm9fZGV2X2hhc2h0YWJsZSgmc291cmNlX3N0YXQpOworCQlpZiAodHApIHsKKwkJCS8qIFdlIGRpZCEgaXQncyBhIHJlY3Vyc2lvbiEgbWFuIHRoZSBsaWZlYm9hdHMuLi4gKi8KKwkJCWJiX2Vycm9yX21zZygicmVjdXJzaW9uIGRldGVjdGVkLCBvbWl0dGluZyBkaXJlY3RvcnkgJyVzJyIsCisJCQkJCXNvdXJjZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoZGVzdF9leGlzdHMpIHsKKwkJCWlmICghU19JU0RJUihkZXN0X3N0YXQuc3RfbW9kZSkpIHsKKwkJCQliYl9lcnJvcl9tc2coInRhcmdldCAnJXMnIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGRlc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCS8qIHJhY2UgaGVyZTogdXNlciBjYW4gc3Vic3RpdHV0ZSBhIHN5bWxpbmsgYmV0d2VlbgorCQkJICogdGhpcyBjaGVjayBhbmQgYWN0dWFsIGNyZWF0aW9uIG9mIGZpbGVzIGluc2lkZSBkZXN0ICovCisJCX0gZWxzZSB7CisJCQkvKiBDcmVhdGUgREVTVCAqLworCQkJbW9kZV90IG1vZGU7CisJCQlzYXZlZF91bWFzayA9IHVtYXNrKDApOworCisJCQltb2RlID0gc291cmNlX3N0YXQuc3RfbW9kZTsKKwkJCWlmICghKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUykpCisJCQkJbW9kZSA9IHNvdXJjZV9zdGF0LnN0X21vZGUgJiB+c2F2ZWRfdW1hc2s7CisJCQkvKiBBbGxvdyBvd25lciB0byBhY2Nlc3MgbmV3IGRpciAoYXQgbGVhc3QgZm9yIG5vdykgKi8KKwkJCW1vZGUgfD0gU19JUldYVTsKKwkJCWlmIChta2RpcihkZXN0LCBtb2RlKSA8IDApIHsKKwkJCQl1bWFzayhzYXZlZF91bWFzayk7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlIGRpcmVjdG9yeSAnJXMnIiwgZGVzdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJdW1hc2soc2F2ZWRfdW1hc2spOworCQkJLyogbmVlZCBzdGF0IGluZm8gZm9yIGFkZF90b19pbm9fZGV2X2hhc2h0YWJsZSAqLworCQkJaWYgKGxzdGF0KGRlc3QsICZkZXN0X3N0YXQpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGRlc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQkvKiByZW1lbWJlciAoZGV2LGlub2RlKSBvZiBlYWNoIGNyZWF0ZWQgZGlyLgorCQkgKiBOVUxMOiBuYW1lIGlzIG5vdCByZW1lbWJlcmVkICovCisJCWFkZF90b19pbm9fZGV2X2hhc2h0YWJsZSgmZGVzdF9zdGF0LCBOVUxMKTsKKworCQkvKiBSZWN1cnNpdmVseSBjb3B5IGZpbGVzIGluIFNPVVJDRSAqLworCQlkcCA9IG9wZW5kaXIoc291cmNlKTsKKwkJaWYgKGRwID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC0xOworCQkJZ290byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZTsKKwkJfQorCisJCXdoaWxlICgoZCA9IHJlYWRkaXIoZHApKSAhPSBOVUxMKSB7CisJCQljaGFyICpuZXdfc291cmNlLCAqbmV3X2Rlc3Q7CisKKwkJCW5ld19zb3VyY2UgPSBjb25jYXRfc3VicGF0aF9maWxlKHNvdXJjZSwgZC0+ZF9uYW1lKTsKKwkJCWlmIChuZXdfc291cmNlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQluZXdfZGVzdCA9IGNvbmNhdF9wYXRoX2ZpbGUoZGVzdCwgZC0+ZF9uYW1lKTsKKwkJCWlmIChjb3B5X2ZpbGUobmV3X3NvdXJjZSwgbmV3X2Rlc3QsIGZsYWdzICYgfkZJTEVVVElMU19ERVJFRkVSRU5DRV9MMCkgPCAwKQorCQkJCXJldHZhbCA9IC0xOworCQkJZnJlZShuZXdfc291cmNlKTsKKwkJCWZyZWUobmV3X2Rlc3QpOworCQl9CisJCWNsb3NlZGlyKGRwKTsKKworCQlpZiAoIWRlc3RfZXhpc3RzCisJCSAmJiBjaG1vZChkZXN0LCBzb3VyY2Vfc3RhdC5zdF9tb2RlICYgfnNhdmVkX3VtYXNrKSA8IDAKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgInBlcm1pc3Npb25zIiwgZGVzdCk7CisJCQkvKiByZXR2YWwgPSAtMTsgLSBXUk9ORyEgY29weSAqV0FTKiBtYWRlICovCisJCX0KKwkJZ290byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZTsKKwl9CisKKwlpZiAoZmxhZ3MgJiAoRklMRVVUSUxTX01BS0VfU09GVExJTkt8RklMRVVUSUxTX01BS0VfSEFSRExJTkspKSB7CisJCWludCAoKmxmKShjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKTsKKyBtYWtlX2xpbmtzOgorCQkvKiBIbW0uLi4gbWF5YmUKKwkJICogaWYgKERFUkVGICYmIE1BS0VfU09GVExJTkspIHNvdXJjZSA9IHJlYWxwYXRoKHNvdXJjZSkgPworCQkgKiAoYnV0IHJlYWxwYXRoIHJldHVybnMgTlVMTCBvbiBkYW5nbGluZyBzeW1saW5rcy4uLikgKi8KKwkJbGYgPSAoZmxhZ3MgJiBGSUxFVVRJTFNfTUFLRV9TT0ZUTElOSykgPyBzeW1saW5rIDogbGluazsKKwkJaWYgKGxmKHNvdXJjZSwgZGVzdCkgPCAwKSB7CisJCQlvdnIgPSBhc2tfYW5kX3VubGluayhkZXN0LCBmbGFncyk7CisJCQlpZiAob3ZyIDw9IDApCisJCQkJcmV0dXJuIG92cjsKKwkJCWlmIChsZihzb3VyY2UsIGRlc3QpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBsaW5rICclcyciLCBkZXN0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJLyogX05vdF8ganVtcGluZyB0byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZToKKwkJICogKHN5bSlsaW5rcyBkb24ndCBoYXZlIHRob3NlICovCisJCXJldHVybiAwOworCX0KKworCWlmICgvKiAiY3AgdGhpbmcxIHRoaW5nMiIgd2l0aG91dCAtUjoganVzdCBvcGVuIGFuZCByZWFkKCkgZnJvbSB0aGluZzEgKi8KKwkgICAgIShmbGFncyAmIEZJTEVVVElMU19SRUNVUikKKwkgICAgLyogImNwIFstb3B0c10gcmVndWxhcl9maWxlIHRoaW5nMiIgKi8KKwkgfHwgU19JU1JFRyhzb3VyY2Vfc3RhdC5zdF9tb2RlKQorCSAvKiBERVJFRiB1c2VzIHN0YXQsIHdoaWNoIG5ldmVyIHJldHVybnMgU19JU0xOSygpID09IHRydWUuCisJICAqIFNvIHRoZSBiZWxvdyBpcyBuZXZlciB0cnVlOiAqLworCSAvKiB8fCAoRkxBR1NfREVSRUYgJiYgU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgKi8KKwkpIHsKKwkJaW50IHNyY19mZDsKKwkJaW50IGRzdF9mZDsKKwkJbW9kZV90IG5ld19tb2RlOworCisJCWlmICghRkxBR1NfREVSRUYgJiYgU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgeworCQkJLyogImNwIC1kIHN5bWxpbmsgZHN0IjogY3JlYXRlIGEgbGluayAqLworCQkJZ290byBkb250X2NhdDsKKwkJfQorCisJCWlmIChFTkFCTEVfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1MgJiYgIUZMQUdTX0RFUkVGKSB7CisJCQljb25zdCBjaGFyICpsaW5rX3RhcmdldDsKKwkJCWxpbmtfdGFyZ2V0ID0gaXNfaW5faW5vX2Rldl9oYXNodGFibGUoJnNvdXJjZV9zdGF0KTsKKwkJCWlmIChsaW5rX3RhcmdldCkgeworCQkJCWlmIChsaW5rKGxpbmtfdGFyZ2V0LCBkZXN0KSA8IDApIHsKKwkJCQkJb3ZyID0gYXNrX2FuZF91bmxpbmsoZGVzdCwgZmxhZ3MpOworCQkJCQlpZiAob3ZyIDw9IDApCisJCQkJCQlyZXR1cm4gb3ZyOworCQkJCQlpZiAobGluayhsaW5rX3RhcmdldCwgZGVzdCkgPCAwKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgbGluayAnJXMnIiwgZGVzdCk7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlhZGRfdG9faW5vX2Rldl9oYXNodGFibGUoJnNvdXJjZV9zdGF0LCBkZXN0KTsKKwkJfQorCisJCXNyY19mZCA9IG9wZW5fb3Jfd2Fybihzb3VyY2UsIE9fUkRPTkxZKTsKKwkJaWYgKHNyY19mZCA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJLyogRG8gbm90IHRyeSB0byBvcGVuIHdpdGggd2VpcmQgbW9kZSBmaWVsZHMgKi8KKwkJbmV3X21vZGUgPSBzb3VyY2Vfc3RhdC5zdF9tb2RlOworCQlpZiAoIVNfSVNSRUcoc291cmNlX3N0YXQuc3RfbW9kZSkpCisJCQluZXdfbW9kZSA9IDA2NjY7CisKKwkJLy8gUE9TSVggd2F5IGlzIGEgc2VjdXJpdHkgcHJvYmxlbSB2ZXJzdXMgKHN5bSlsaW5rIGF0dGFja3MKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9OT05fUE9TSVhfQ1ApIHsKKwkJCWRzdF9mZCA9IG9wZW4oZGVzdCwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCBuZXdfbW9kZSk7CisJCX0gZWxzZSB7IC8qIHNhZmUgd2F5OiAqLworCQkJZHN0X2ZkID0gb3BlbihkZXN0LCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgbmV3X21vZGUpOworCQl9CisJCWlmIChkc3RfZmQgPT0gLTEpIHsKKwkJCW92ciA9IGFza19hbmRfdW5saW5rKGRlc3QsIGZsYWdzKTsKKwkJCWlmIChvdnIgPD0gMCkgeworCQkJCWNsb3NlKHNyY19mZCk7CisJCQkJcmV0dXJuIG92cjsKKwkJCX0KKwkJCS8qIEl0IHNob3VsZG4ndCBleGlzdC4gSWYgaXQgZXhpc3RzLCBkbyBub3Qgb3BlbiAoc3ltbGluayBhdHRhY2s/KSAqLworCQkJZHN0X2ZkID0gb3BlbjNfb3Jfd2FybihkZXN0LCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgbmV3X21vZGUpOworCQkJaWYgKGRzdF9mZCA8IDApIHsKKwkJCQljbG9zZShzcmNfZmQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKChmbGFncyAmIChGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVHxGSUxFVVRJTFNfU0VUX1NFQ1VSSVRZX0NPTlRFWFQpKQorCQkgJiYgaXNfc2VsaW51eF9lbmFibGVkKCkgPiAwCisJCSkgeworCQkJc2VjdXJpdHlfY29udGV4dF90IGNvbjsKKwkJCWlmIChnZXRmc2NyZWF0ZWNvbigmY29uKSA9PSAtMSkgeworCQkJCWJiX3BlcnJvcl9tc2coImdldGZzY3JlYXRlY29uIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGNvbikgeworCQkJCWlmIChzZXRmaWxlY29uKGRlc3QsIGNvbikgPT0gLTEpIHsKKwkJCQkJYmJfcGVycm9yX21zZygic2V0ZmlsZWNvbjolcywlcyIsIGRlc3QsIGNvbik7CisJCQkJCWZyZWVjb24oY29uKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlmcmVlY29uKGNvbik7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAoYmJfY29weWZkX2VvZihzcmNfZmQsIGRzdF9mZCkgPT0gLTEpCisJCQlyZXR2YWwgPSAtMTsKKwkJLyogQ2FyZWZ1bCB3aXRoIHdyaXRpbmcuLi4gKi8KKwkJaWYgKGNsb3NlKGRzdF9mZCkgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJlcnJvciB3cml0aW5nIHRvICclcyciLCBkZXN0KTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisJCS8qIC4uLmJ1dCByZWFkIHNpemUgaXMgYWxyZWFkeSBjaGVja2VkIGJ5IGJiX2NvcHlmZF9lb2YgKi8KKwkJY2xvc2Uoc3JjX2ZkKTsKKwkJLyogImNwIC9kZXYvc29tZXRoaW5nIG5ld19maWxlIiBzaG91bGQgbm90CisJCSAqIGNvcHkgbW9kZSBvZiAvZGV2L3NvbWV0aGluZyAqLworCQlpZiAoIVNfSVNSRUcoc291cmNlX3N0YXQuc3RfbW9kZSkpCisJCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIHByZXNlcnZlX21vZGVfdWdpZF90aW1lOworCX0KKyBkb250X2NhdDoKKworCS8qIFNvdXJjZSBpcyBhIHN5bWxpbmsgb3IgYSBzcGVjaWFsIGZpbGUgKi8KKwkvKiBXZSBhcmUgbGF6eSBoZXJlLCBhIGJpdCBsYXggd2l0aCByYWNlcy4uLiAqLworCWlmIChkZXN0X2V4aXN0cykgeworCQllcnJubyA9IEVFWElTVDsKKwkJb3ZyID0gYXNrX2FuZF91bmxpbmsoZGVzdCwgZmxhZ3MpOworCQlpZiAob3ZyIDw9IDApCisJCQlyZXR1cm4gb3ZyOworCX0KKwlpZiAoU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSkgeworCQljaGFyICpscGF0aCA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2Fybihzb3VyY2UpOworCQlpZiAobHBhdGgpIHsKKwkJCWludCByID0gc3ltbGluayhscGF0aCwgZGVzdCk7CisJCQlmcmVlKGxwYXRoKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBzeW1saW5rICclcyciLCBkZXN0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTKQorCQkJCWlmIChsY2hvd24oZGVzdCwgc291cmNlX3N0YXQuc3RfdWlkLCBzb3VyY2Vfc3RhdC5zdF9naWQpIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcHJlc2VydmUgJXMgb2YgJyVzJyIsICJvd25lcnNoaXAiLCBkZXN0KTsKKwkJfQorCQkvKiBfTm90XyBqdW1waW5nIHRvIHByZXNlcnZlX21vZGVfdWdpZF90aW1lOgorCQkgKiBzeW1saW5rcyBkb24ndCBoYXZlIHRob3NlICovCisJCXJldHVybiAwOworCX0KKwlpZiAoU19JU0JMSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSB8fCBTX0lTQ0hSKHNvdXJjZV9zdGF0LnN0X21vZGUpCisJIHx8IFNfSVNTT0NLKHNvdXJjZV9zdGF0LnN0X21vZGUpIHx8IFNfSVNGSUZPKHNvdXJjZV9zdGF0LnN0X21vZGUpCisJKSB7CisJCWlmIChta25vZChkZXN0LCBzb3VyY2Vfc3RhdC5zdF9tb2RlLCBzb3VyY2Vfc3RhdC5zdF9yZGV2KSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSAnJXMnIiwgZGVzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQliYl9lcnJvcl9tc2coInVucmVjb2duaXplZCBmaWxlICclcycgd2l0aCBtb2RlICV4Iiwgc291cmNlLCBzb3VyY2Vfc3RhdC5zdF9tb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworIHByZXNlcnZlX21vZGVfdWdpZF90aW1lOgorCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUworCS8qIENhbm5vdCBoYXBwZW46ICovCisJLyogJiYgIShmbGFncyAmIChGSUxFVVRJTFNfTUFLRV9TT0ZUTElOS3xGSUxFVVRJTFNfTUFLRV9IQVJETElOSykpICovCisJKSB7CisJCXN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdOworCisJCXRpbWVzWzFdLnR2X3NlYyA9IHRpbWVzWzBdLnR2X3NlYyA9IHNvdXJjZV9zdGF0LnN0X210aW1lOworCQl0aW1lc1sxXS50dl91c2VjID0gdGltZXNbMF0udHZfdXNlYyA9IDA7CisJCS8qIEJUVywgdXRpbWVzIHNldHMgdXNlYy1wcmVjaXNpb24gdGltZSAtIGp1c3QgRllJICovCisJCWlmICh1dGltZXMoZGVzdCwgdGltZXMpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHByZXNlcnZlICVzIG9mICclcyciLCAidGltZXMiLCBkZXN0KTsKKwkJaWYgKGNob3duKGRlc3QsIHNvdXJjZV9zdGF0LnN0X3VpZCwgc291cmNlX3N0YXQuc3RfZ2lkKSA8IDApIHsKKwkJCXNvdXJjZV9zdGF0LnN0X21vZGUgJj0gfihTX0lTVUlEIHwgU19JU0dJRCk7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgIm93bmVyc2hpcCIsIGRlc3QpOworCQl9CisJCWlmIChjaG1vZChkZXN0LCBzb3VyY2Vfc3RhdC5zdF9tb2RlKSA8IDApCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgInBlcm1pc3Npb25zIiwgZGVzdCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2NvcHlmZC5jIGIvbGliYmIvY29weWZkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhMjc0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NvcHlmZC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBVc2VkIGJ5IE5PRk9SSyBhcHBsZXRzIChlLmcuIGNhdCkgLSBtdXN0IG5vdCB1c2UgeG1hbGxvYy4KKyAqIHNpemUgPCAwIG1lYW5zICJpZ25vcmUgd3JpdGUgZXJyb3JzIiwgdXNlZCBieSB0YXIgLS10by1jb21tYW5kCisgKiBzaXplID0gMCBtZWFucyAiY29weSB0aWxsIEVPRiIKKyAqLworc3RhdGljIG9mZl90IGJiX2Z1bGxfZmRfYWN0aW9uKGludCBzcmNfZmQsIGludCBkc3RfZmQsIG9mZl90IHNpemUpCit7CisJaW50IHN0YXR1cyA9IC0xOworCW9mZl90IHRvdGFsID0gMDsKKwlib29sIGNvbnRpbnVlX29uX3dyaXRlX2Vycm9yID0gMDsKKyNpZiBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCIDw9IDQKKwljaGFyIGJ1ZmZlcltDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCICogMTAyNF07CisJZW51bSB7IGJ1ZmZlcl9zaXplID0gc2l6ZW9mKGJ1ZmZlcikgfTsKKyNlbHNlCisJY2hhciAqYnVmZmVyOworCWludCBidWZmZXJfc2l6ZTsKKyNlbmRpZgorCisJaWYgKHNpemUgPCAwKSB7CisJCXNpemUgPSAtc2l6ZTsKKwkJY29udGludWVfb25fd3JpdGVfZXJyb3IgPSAxOworCX0KKworI2lmIENPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0IgPiA0CisJaWYgKHNpemUgPiAwICYmIHNpemUgPD0gNCAqIDEwMjQpCisJCWdvdG8gdXNlX3NtYWxsX2J1ZjsKKwkvKiBXZSB3YW50IHBhZ2UtYWxpZ25lZCBidWZmZXIsIGp1c3QgaW4gY2FzZSBrZXJuZWwgaXMgY2xldmVyCisJICogYW5kIGNhbiBkbyBwYWdlLWFsaWduZWQgaW8gbW9yZSBlZmZpY2llbnRseSAqLworCWJ1ZmZlciA9IG1tYXAoTlVMTCwgQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQiAqIDEwMjQsCisJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKKwkJCS8qIGlnbm9yZWQ6ICovIC0xLCAwKTsKKwlidWZmZXJfc2l6ZSA9IENPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0IgKiAxMDI0OworCWlmIChidWZmZXIgPT0gTUFQX0ZBSUxFRCkgeworIHVzZV9zbWFsbF9idWY6CisJCWJ1ZmZlciA9IGFsbG9jYSg0ICogMTAyNCk7CisJCWJ1ZmZlcl9zaXplID0gNCAqIDEwMjQ7CisJfQorI2VuZGlmCisKKwlpZiAoc3JjX2ZkIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXNpemUpIHsKKwkJc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQlzdGF0dXMgPSAxOyAvKiBjb3B5IHVudGlsIGVvZiAqLworCX0KKworCXdoaWxlICgxKSB7CisJCXNzaXplX3QgcmQ7CisKKwkJcmQgPSBzYWZlX3JlYWQoc3JjX2ZkLCBidWZmZXIsIHNpemUgPiBidWZmZXJfc2l6ZSA/IGJ1ZmZlcl9zaXplIDogc2l6ZSk7CisKKwkJaWYgKCFyZCkgeyAvKiBlb2YgLSBhbGwgZG9uZSAqLworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZCA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJYnJlYWs7CisJCX0KKwkJLyogZHN0X2ZkID09IC0xIGlzIGEgZmFrZSwgZWxzZS4uLiAqLworCQlpZiAoZHN0X2ZkID49IDApIHsKKwkJCXNzaXplX3Qgd3IgPSBmdWxsX3dyaXRlKGRzdF9mZCwgYnVmZmVyLCByZCk7CisJCQlpZiAod3IgPCByZCkgeworCQkJCWlmICghY29udGludWVfb25fd3JpdGVfZXJyb3IpIHsKKwkJCQkJYmJfcGVycm9yX21zZyhiYl9tc2dfd3JpdGVfZXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZHN0X2ZkID0gLTE7CisJCQl9CisJCX0KKwkJdG90YWwgKz0gcmQ7CisJCWlmIChzdGF0dXMgPCAwKSB7IC8qIGlmIHdlIGFyZW4ndCBjb3B5aW5nIHRpbGwgRU9GLi4uICovCisJCQlzaXplIC09IHJkOworCQkJaWYgKCFzaXplKSB7CisJCQkJLyogJ3NpemUnIGJ5dGVzIGNvcGllZCAtIGFsbCBkb25lICovCisJCQkJc3RhdHVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyBvdXQ6CisKKyNpZiBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCID4gNAorCWlmIChidWZmZXJfc2l6ZSAhPSA0ICogMTAyNCkKKwkJbXVubWFwKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworI2VuZGlmCisJcmV0dXJuIHN0YXR1cyA/IC0xIDogdG90YWw7Cit9CisKKworI2lmIDAKK3ZvaWQgRkFTVF9GVU5DIGNvbXBsYWluX2NvcHlmZF9hbmRfZGllKG9mZl90IHN6KQoreworCWlmIChzeiAhPSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkvKiBpZiBzeiA9PSAtMSwgYmJfY29weWZkX1hYIGFscmVhZHkgY29tcGxhaW5lZCAqLworCXhmdW5jX2RpZSgpOworfQorI2VuZGlmCisKK29mZl90IEZBU1RfRlVOQyBiYl9jb3B5ZmRfc2l6ZShpbnQgZmQxLCBpbnQgZmQyLCBvZmZfdCBzaXplKQoreworCWlmIChzaXplKSB7CisJCXJldHVybiBiYl9mdWxsX2ZkX2FjdGlvbihmZDEsIGZkMiwgc2l6ZSk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9jb3B5ZmRfZXhhY3Rfc2l6ZShpbnQgZmQxLCBpbnQgZmQyLCBvZmZfdCBzaXplKQoreworCW9mZl90IHN6ID0gYmJfY29weWZkX3NpemUoZmQxLCBmZDIsIHNpemUpOworCWlmIChzeiA9PSAoc2l6ZSA+PSAwID8gc2l6ZSA6IC1zaXplKSkKKwkJcmV0dXJuOworCWlmIChzeiAhPSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkvKiBpZiBzeiA9PSAtMSwgYmJfY29weWZkX1hYIGFscmVhZHkgY29tcGxhaW5lZCAqLworCXhmdW5jX2RpZSgpOworfQorCitvZmZfdCBGQVNUX0ZVTkMgYmJfY29weWZkX2VvZihpbnQgZmQxLCBpbnQgZmQyKQoreworCXJldHVybiBiYl9mdWxsX2ZkX2FjdGlvbihmZDEsIGZkMiwgMCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jb3JyZWN0X3Bhc3N3b3JkLmMgYi9saWJiYi9jb3JyZWN0X3Bhc3N3b3JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NvcnJlY3RfcGFzc3dvcmQuYwpAQCAtMCwwICsxLDgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk4OSAtIDE5OTEsIEp1bGlhbm5lIEZyYW5jZXMgSGF1Z2ggPGpvY2tncnJsQGF1c3Rpbi5yci5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBKdWxpYW5uZSBGLiBIYXVnaCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBKVUxJRSBIQVVHSCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSlVMSUUgSEFVR0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQXNrIHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgorICogUmV0dXJuIDEgaWYgdGhlIHVzZXIgZ2l2ZXMgdGhlIGNvcnJlY3QgcGFzc3dvcmQgZm9yIGVudHJ5IFBXLAorICogMCBpZiBub3QuICBSZXR1cm4gMSB3aXRob3V0IGFza2luZyBpZiBQVyBoYXMgYW4gZW1wdHkgcGFzc3dvcmQuCisgKgorICogTlVMTCBwdyBtZWFucyAianVzdCBmYWtlIGl0IGZvciBsb2dpbiB3aXRoIGJhZCB1c2VybmFtZSIgKi8KKworaW50IEZBU1RfRlVOQyBjb3JyZWN0X3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWNoYXIgKnVuZW5jcnlwdGVkLCAqZW5jcnlwdGVkOworCWNvbnN0IGNoYXIgKmNvcnJlY3Q7CisJaW50IHI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCS8qIFVzaW5nIF9yIGZ1bmN0aW9uIHRvIGF2b2lkIHB1bGxpbmcgaW4gc3RhdGljIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3Qgc3B3ZCBzcHc7CisJY2hhciBidWZmZXJbMjU2XTsKKyNlbmRpZgorCisJLyogZmFrZSBzYWx0LiBjcnlwdCgpIGNhbiBjaG9rZSBvdGhlcndpc2UuICovCisJY29ycmVjdCA9ICJhYSI7CisJaWYgKCFwdykgeworCQkvKiAiYWEiIHdpbGwgbmV2ZXIgbWF0Y2ggKi8KKwkJZ290byBmYWtlX2l0OworCX0KKwljb3JyZWN0ID0gcHctPnB3X3Bhc3N3ZDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJaWYgKChjb3JyZWN0WzBdID09ICd4JyB8fCBjb3JyZWN0WzBdID09ICcqJykgJiYgIWNvcnJlY3RbMV0pIHsKKwkJLyogZ2V0c3BuYW1fciBtYXkgcmV0dXJuIDAgeWV0IHNldCByZXN1bHQgdG8gTlVMTC4KKwkJICogQXQgbGVhc3QgZ2xpYmMgMi40IGRvZXMgdGhpcy4gQmUgZXh0cmEgcGFyYW5vaWQgaGVyZS4gKi8KKwkJc3RydWN0IHNwd2QgKnJlc3VsdCA9IE5VTEw7CisJCXIgPSBnZXRzcG5hbV9yKHB3LT5wd19uYW1lLCAmc3B3LCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmcmVzdWx0KTsKKwkJY29ycmVjdCA9IChyIHx8ICFyZXN1bHQpID8gImFhIiA6IHJlc3VsdC0+c3BfcHdkcDsKKwl9CisjZW5kaWYKKworCWlmICghY29ycmVjdFswXSkgLyogZW1wdHkgcGFzc3dvcmQgZmllbGQ/ICovCisJCXJldHVybiAxOworCisgZmFrZV9pdDoKKwl1bmVuY3J5cHRlZCA9IGJiX2Fza19zdGRpbigiUGFzc3dvcmQ6ICIpOworCWlmICghdW5lbmNyeXB0ZWQpIHsKKwkJcmV0dXJuIDA7CisJfQorCWVuY3J5cHRlZCA9IHB3X2VuY3J5cHQodW5lbmNyeXB0ZWQsIGNvcnJlY3QsIDEpOworCXIgPSAoc3RyY21wKGVuY3J5cHRlZCwgY29ycmVjdCkgPT0gMCk7CisJZnJlZShlbmNyeXB0ZWQpOworCW1lbXNldCh1bmVuY3J5cHRlZCwgMCwgc3RybGVuKHVuZW5jcnlwdGVkKSk7CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jcmMzMi5jIGIvbGliYmIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk4MzZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvY3JjMzIuYwpAQCAtMCwwICsxLDY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDUkMzMiB0YWJsZSBmaWxsIGZ1bmN0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgUm9iIFN1bGxpdmFuIDxjb2dpdG8uZXJnby5jb2dpdG9AZ21haWwuY29tPgorICogKEkgY2FuJ3QgcmVhbGx5IGNsYWltIG11Y2ggY3JlZGl0IGhvd2V2ZXIsIGFzIHRoZSBhbGdvcml0aG0gaXMKKyAqIHZlcnkgd2VsbC1rbm93bikKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNyZWF0ZXMgYSBDUkMzMiB0YWJsZSBkZXBlbmRpbmcgb24gd2hldGhlcgorICogYSBiaWctZW5kaWFuICgweDA0YzExZGI3KSBvciBsaXR0bGUtZW5kaWFuICgweGVkYjg4MzIwKSBDUkMzMiBpcworICogcmVxdWlyZWQuIEFkbWl0dGVkbHksIHRoZXJlIGFyZSBvdGhlciBDUkMzMiBwb2x5bm9taWFscyBmbG9hdGluZworICogYXJvdW5kLCBidXQgQnVzeWJveCBkb2Vzbid0IHVzZSB0aGVtLgorICoKKyAqIGVuZGlhbiA9IDE6IGJpZy1lbmRpYW4KKyAqIGVuZGlhbiA9IDA6IGxpdHRsZS1lbmRpYW4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit1aW50MzJfdCAqZ2xvYmFsX2NyYzMyX3RhYmxlOworCit1aW50MzJfdCogRkFTVF9GVU5DIGNyYzMyX2ZpbGx0YWJsZSh1aW50MzJfdCAqY3JjX3RhYmxlLCBpbnQgZW5kaWFuKQoreworCXVpbnQzMl90IHBvbHlub21pYWwgPSBlbmRpYW4gPyAweDA0YzExZGI3IDogMHhlZGI4ODMyMDsKKwl1aW50MzJfdCBjOworCWludCBpLCBqOworCisJaWYgKCFjcmNfdGFibGUpCisJCWNyY190YWJsZSA9IHhtYWxsb2MoMjU2ICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJYyA9IGVuZGlhbiA/IChpIDw8IDI0KSA6IGk7CisJCWZvciAoaiA9IDg7IGo7IGotLSkgeworCQkJaWYgKGVuZGlhbikKKwkJCQljID0gKGMmMHg4MDAwMDAwMCkgPyAoKGMgPDwgMSkgXiBwb2x5bm9taWFsKSA6IChjIDw8IDEpOworCQkJZWxzZQorCQkJCWMgPSAoYyYxKSA/ICgoYyA+PiAxKSBeIHBvbHlub21pYWwpIDogKGMgPj4gMSk7CisJCX0KKwkJKmNyY190YWJsZSsrID0gYzsKKwl9CisKKwlyZXR1cm4gY3JjX3RhYmxlIC0gMjU2OworfQorCit1aW50MzJfdCBGQVNUX0ZVTkMgY3JjMzJfYmxvY2tfZW5kaWFuMSh1aW50MzJfdCB2YWwsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLCB1aW50MzJfdCAqY3JjX3RhYmxlKQoreworCWNvbnN0IHZvaWQgKmVuZCA9ICh1aW50OF90KilidWYgKyBsZW47CisKKwl3aGlsZSAoYnVmICE9IGVuZCkgeworCQl2YWwgPSAodmFsIDw8IDgpIF4gY3JjX3RhYmxlWyh2YWwgPj4gMjQpIF4gKih1aW50OF90KilidWZdOworCQlidWYgPSAodWludDhfdCopYnVmICsgMTsKKwl9CisJcmV0dXJuIHZhbDsKK30KKwordWludDMyX3QgRkFTVF9GVU5DIGNyYzMyX2Jsb2NrX2VuZGlhbjAodWludDMyX3QgdmFsLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwgdWludDMyX3QgKmNyY190YWJsZSkKK3sKKwljb25zdCB2b2lkICplbmQgPSAodWludDhfdCopYnVmICsgbGVuOworCisJd2hpbGUgKGJ1ZiAhPSBlbmQpIHsKKwkJdmFsID0gY3JjX3RhYmxlWyh1aW50OF90KXZhbCBeICoodWludDhfdCopYnVmXSBeICh2YWwgPj4gOCk7CisJCWJ1ZiA9ICh1aW50OF90KilidWYgKyAxOworCX0KKwlyZXR1cm4gdmFsOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvY3JlYXRlX2ljbXA2X3NvY2tldC5jIGIvbGliYmIvY3JlYXRlX2ljbXA2X3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGM2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9jcmVhdGVfaWNtcDZfc29ja2V0LmMKQEAgLTAsMCArMSwzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBjcmVhdGUgcmF3IHNvY2tldCBmb3IgaWNtcCAoSVB2NiB2ZXJzaW9uKSBwcm90b2NvbAorICogYW5kIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGlmIHJ1bm5pbmcgc2V0dWlkCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK2ludCBGQVNUX0ZVTkMgY3JlYXRlX2ljbXA2X3NvY2tldCh2b2lkKQoreworCWludCBzb2NrOworI2lmIDAKKwlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOworCXByb3RvID0gZ2V0cHJvdG9ieW5hbWUoImlwdjYtaWNtcCIpOworCS8qIGlmIGdldHByb3RvYnluYW1lIGZhaWxlZCwganVzdCBzaWxlbnRseSBmb3JjZQorCSAqIHByb3RvLT5wX3Byb3RvIHRvIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yICJpcHY2LWljbXAiICovCisJc29jayA9IHNvY2tldChBRl9JTkVUNiwgU09DS19SQVcsCisJCQkocHJvdG8gPyBwcm90by0+cF9wcm90byA6IElQUFJPVE9fSUNNUFY2KSk7CisjZWxzZQorCXNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVBWNik7CisjZW5kaWYKKwlpZiAoc29jayA8IDApIHsKKwkJaWYgKGVycm5vID09IEVQRVJNKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfY2FuX25vdF9jcmVhdGVfcmF3X3NvY2tldCk7CisJfQorCisJLyogZHJvcCByb290IHByaXZzIGlmIHJ1bm5pbmcgc2V0dWlkICovCisJeHNldHVpZChnZXR1aWQoKSk7CisKKwlyZXR1cm4gc29jazsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvY3JlYXRlX2ljbXBfc29ja2V0LmMgYi9saWJiYi9jcmVhdGVfaWNtcF9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU2MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvY3JlYXRlX2ljbXBfc29ja2V0LmMKQEAgLTAsMCArMSwzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBjcmVhdGUgcmF3IHNvY2tldCBmb3IgaWNtcCBwcm90b2NvbAorICogYW5kIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGlmIHJ1bm5pbmcgc2V0dWlkCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IEZBU1RfRlVOQyBjcmVhdGVfaWNtcF9zb2NrZXQodm9pZCkKK3sKKwlpbnQgc29jazsKKyNpZiAwCisJc3RydWN0IHByb3RvZW50ICpwcm90bzsKKwlwcm90byA9IGdldHByb3RvYnluYW1lKCJpY21wIik7CisJLyogaWYgZ2V0cHJvdG9ieW5hbWUgZmFpbGVkLCBqdXN0IHNpbGVudGx5IGZvcmNlCisJICogcHJvdG8tPnBfcHJvdG8gdG8gaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgImljbXAiICovCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywKKwkJCShwcm90byA/IHByb3RvLT5wX3Byb3RvIDogMSkpOyAvKiAxID09IElDTVAgKi8KKyNlbHNlCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgMSk7IC8qIDEgPT0gSUNNUCAqLworI2VuZGlmCisJaWYgKHNvY2sgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXQpOworCX0KKworCS8qIGRyb3Agcm9vdCBwcml2cyBpZiBydW5uaW5nIHNldHVpZCAqLworCXhzZXR1aWQoZ2V0dWlkKCkpOworCisJcmV0dXJuIHNvY2s7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9kZWZhdWx0X2Vycm9yX3JldHZhbC5jIGIvbGliYmIvZGVmYXVsdF9lcnJvcl9yZXR2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjYzOTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZGVmYXVsdF9lcnJvcl9yZXR2YWwuYwpAQCAtMCwwICsxLDE4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFNlZW1zIHNpbGx5IHRvIGNvcHlyaWdodCBhIGdsb2JhbCB2YXJpYWJsZS4gIDstKSAgT2ggd2VsbC4KKyAqCisgKiBBdCBsZWFzdCBvbmUgYXBwbGV0IChjbXApIHJldHVybnMgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSB0aGUgdHlwaWNhbAorICogRVhJVF9GQUlMVVJFIHZhbHVlcyAoMSkgd2hlbiBhbiBlcnJvciBvY2N1cnMuICBTbywgbWFrZSBpdCBjb25maWd1cmFibGUKKyAqIGJ5IHRoZSBhcHBsZXQuICBJIHN1cHBvc2Ugd2UgY291bGQgdXNlIGEgd3JhcHBlciBmdW5jdGlvbiB0byBzZXQgaXQsIGJ1dAorICogdGhhdCB0b28gc2VlbXMgc2lsbHkuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3VpbnQ4X3QgeGZ1bmNfZXJyb3JfcmV0dmFsID0gRVhJVF9GQUlMVVJFOwpkaWZmIC0tZ2l0IGEvbGliYmIvZGV2aWNlX29wZW4uYyBiL2xpYmJiL2RldmljZV9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmZTJmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2RldmljZV9vcGVuLmMKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogdHJ5IHRvIG9wZW4gdXAgdGhlIHNwZWNpZmllZCBkZXZpY2UgKi8KK2ludCBGQVNUX0ZVTkMgZGV2aWNlX29wZW4oY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgbW9kZSkKK3sKKwlpbnQgbSwgZiwgZmQ7CisKKwltID0gbW9kZSB8IE9fTk9OQkxPQ0s7CisKKwkvKiBSZXRyeSB1cCB0byA1IHRpbWVzICovCisJLyogVE9ETzogZXhwbGFpbiB3aHkgaXQgY2FuJ3QgYmUgY29uc2lkZXJlZCBpbnNhbmUgKi8KKwlmb3IgKGYgPSAwOyBmIDwgNTsgZisrKSB7CisJCWZkID0gb3BlbihkZXZpY2UsIG0sIDA2MDApOworCQlpZiAoZmQgPj0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisJLyogUmVzZXQgb3JpZ2luYWwgZmxhZ3MuICovCisJaWYgKG0gIT0gbW9kZSkKKwkJZmNudGwoZmQsIEZfU0VURkwsIG1vZGUpOworCXJldHVybiBmZDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2RpZV9pZl9iYWRfdXNlcm5hbWUuYyBiL2xpYmJiL2RpZV9pZl9iYWRfdXNlcm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjEyOTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZGllX2lmX2JhZF91c2VybmFtZS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENoZWNrIHVzZXIgYW5kIGdyb3VwIG5hbWVzIGZvciBpbGxlZ2FsIGNoYXJhY3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRvIGF2b2lkIHByb2JsZW1zLCB0aGUgdXNlcm5hbWUgc2hvdWxkIGNvbnNpc3Qgb25seSBvZgorICogbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYXQgc2lnbnMgYW5kIGRhc2hlcywKKyAqIGFuZCBub3Qgc3RhcnQgd2l0aCBhIGRhc2ggKGFzIGRlZmluZWQgYnkgSUVFRSBTdGQgMTAwMy4xLTIwMDEpLgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTYW1iYSBtYWNoaW5lIGFjY291bnRzICQgaXMgYWxzbyBzdXBwb3J0ZWQKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIHVzZXJuYW1lLgorICovCisKK3ZvaWQgRkFTVF9GVU5DIGRpZV9pZl9iYWRfdXNlcm5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyICpzdGFydCA9IG5hbWU7CisKKwkvKiAxc3QgY2hhciBiZWluZyBkYXNoIG9yIGRvdCBpc24ndCB2YWxpZDoKKwkgKiBmb3IgZXhhbXBsZSwgbmFtZSBsaWtlICIuLiIgY2FuIG1ha2UgYWRkdXNlcgorCSAqIGNob3duICIvaG9tZS8uLiIgcmVjdXJzaXZlbHkgLSBOT1QgR09PRC4KKwkgKiBOYW1lIG9mIGp1c3QgYSBzaW5nbGUgIiQiIGlzIGFsc28gcmVqZWN0ZWQuCisJICovCisJZ290byBza2lwOworCisJZG8geworCQl1bnNpZ25lZCBjaGFyIGNoOworCisJCS8qIFRoZXNlIGNoYXJzIGFyZSB2YWxpZCB1bmxlc3MgdGhleSBhcmUgYXQgdGhlIDFzdCBwb3M6ICovCisJCWlmICgqbmFtZSA9PSAnLScKKwkJIHx8ICpuYW1lID09ICcuJworCQkvKiAkIGlzIGFsbG93ZWQgaWYgaXQncyB0aGUgbGFzdCBjaGFyOiAqLworCQkgfHwgKCpuYW1lID09ICckJyAmJiAhbmFtZVsxXSkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorIHNraXA6CisJCWNoID0gKm5hbWU7CisJCWlmIChjaCA9PSAnXycKKwkJLyogfHwgY2ggPT0gJ0AnIC0tIHdlIGRpc2FsbG93IHRoaXMgdG9vLiBUaGluayBhYm91dCAidXNlckBob3N0IiAqLworCQkvKiBvcGVuLWNvZGVkIGlzYWxudW06ICovCisJCSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwkJIHx8ICgoY2h8MHgyMCkgPj0gJ2EnICYmIChjaHwweDIwKSA8PSAneicpCisJCSkgeworCQkJY29udGludWU7CisJCX0KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlsbGVnYWwgY2hhcmFjdGVyIHdpdGggY29kZSAldSBhdCBwb3NpdGlvbiAldSIsCisJCQkJKHVuc2lnbmVkKWNoLCAodW5zaWduZWQpKG5hbWUgLSBzdGFydCkpOworCX0gd2hpbGUgKCorK25hbWUpOworCisJLyogVGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbG9naW4gbmFtZSBpcyBvbmUgY2hhciBvciB0d28gaWYKKwkgKiBsYXN0IGNoYXIgaXMgdGhlICckJy4gVmlvbGF0aW9ucyBvZiB0aGlzIGFyZSBjYXVnaHQgYWJvdmUuCisJICogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbG9naW4gbmFtZSBpcyBMT0dJTl9OQU1FX01BWAorCSAqIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlLgorCSAqLworCWlmIChuYW1lIC0gc3RhcnQgPj0gTE9HSU5fTkFNRV9NQVgpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuYW1lIGlzIHRvbyBsb25nIik7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9kdW1wLmMgYi9saWJiYi9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5ZmUxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2R1bXAuYwpAQCAtMCwwICsxLDgzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VwcG9ydCBjb2RlIGZvciB0aGUgaGV4ZHVtcCBhbmQgb2QgYXBwbGV0cywKKyAqIGJhc2VkIG9uIGNvZGUgZnJvbSB1dGlsLWxpbnV4IHYgMi4xMWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJkdW1wLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGluZGV4X3N0cltdIEFMSUdOMSA9ICIuIy0rIDAxMjM0NTY3ODkiOworCitzdGF0aWMgY29uc3QgY2hhciBzaXplX2NvbnZfc3RyW10gQUxJR04xID0KKyJceDFceDRceDRceDRceDRceDRceDRceDhceDhceDhceDhcMDEwY2Rpb3V4WGVFZmdHIjsKKworc3RhdGljIGNvbnN0IGNoYXIgbGNjW10gQUxJR04xID0gImRpb3V4WCI7CisKKwordHlwZWRlZiBzdHJ1Y3QgcHJpdl9kdW1wZXJfdCB7CisJZHVtcGVyX3QgcHViOworCisJY2hhciAqKmFyZ3Y7CisJRlUgKmVuZGZ1OworCW9mZl90IHNhdmFkZHJlc3M7ICAgICAgICAvKiBzYXZlZCBhZGRyZXNzL29mZnNldCBpbiBzdHJlYW0gKi8KKwlvZmZfdCBlYWRkcmVzczsgICAgICAgICAgLyogZW5kIGFkZHJlc3MgKi8KKwlvZmZfdCBhZGRyZXNzOyAgICAgICAgICAgLyogYWRkcmVzcy9vZmZzZXQgaW4gc3RyZWFtICovCisJaW50IGJsb2Nrc2l6ZTsKKwlzbWFsbGludCBleGl0dmFsOyAgICAgICAgLyogZmluYWwgZXhpdCB2YWx1ZSAqLworCisJLyogZm9ybWVyIHN0YXRpY3MgKi8KKwlzbWFsbGludCBuZXh0X19kb25lOworCXNtYWxsaW50IGdldF9fYXRlb2Y7IC8vID0gMTsKKwl1bnNpZ25lZCBjaGFyICpnZXRfX2N1cnA7CisJdW5zaWduZWQgY2hhciAqZ2V0X19zYXZwOworfSBwcml2X2R1bXBlcl90OworCitkdW1wZXJfdCogRkFTVF9GVU5DIGFsbG9jX2R1bXBlcih2b2lkKQoreworCXByaXZfZHVtcGVyX3QgKmR1bXBlciA9IHh6YWxsb2Moc2l6ZW9mKCpkdW1wZXIpKTsKKwlkdW1wZXItPnB1Yi5kdW1wX2xlbmd0aCA9IC0xOworCWR1bXBlci0+cHViLmR1bXBfdmZsYWcgPSBGSVJTVDsKKwlkdW1wZXItPmdldF9fYXRlb2YgPSAxOworCXJldHVybiAmZHVtcGVyLT5wdWI7Cit9CisKKworc3RhdGljIE5PSU5MSU5FIGludCBiYl9kdW1wX3NpemUoRlMgKmZzKQoreworCUZVICpmdTsKKwlpbnQgYmNudCwgY3VyX3NpemU7CisJY2hhciAqZm10OworCWNvbnN0IGNoYXIgKnA7CisJaW50IHByZWM7CisKKwkvKiBmaWd1cmUgb3V0IHRoZSBkYXRhIGJsb2NrIGJiX2R1bXBfc2l6ZSBuZWVkZWQgZm9yIGVhY2ggZm9ybWF0IHVuaXQgKi8KKwlmb3IgKGN1cl9zaXplID0gMCwgZnUgPSBmcy0+bmV4dGZ1OyBmdTsgZnUgPSBmdS0+bmV4dGZ1KSB7CisJCWlmIChmdS0+YmNudCkgeworCQkJY3VyX3NpemUgKz0gZnUtPmJjbnQgKiBmdS0+cmVwczsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoYmNudCA9IHByZWMgPSAwLCBmbXQgPSBmdS0+Zm10OyAqZm10OyArK2ZtdCkgeworCQkJaWYgKCpmbXQgIT0gJyUnKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIHNraXAgYW55IHNwZWNpYWwgY2hhcnMgLS0gc2F2ZSBwcmVjaXNpb24gaW4KKwkJCSAqIGNhc2UgaXQncyBhICVzIGZvcm1hdC4KKwkJCSAqLworCQkJd2hpbGUgKHN0cmNocihpbmRleF9zdHIgKyAxLCAqKytmbXQpKTsKKwkJCWlmICgqZm10ID09ICcuJyAmJiBpc2RpZ2l0KCorK2ZtdCkpIHsKKwkJCQlwcmVjID0gYXRvaShmbXQpOworCQkJCXdoaWxlIChpc2RpZ2l0KCorK2ZtdCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcCA9IHN0cmNocihzaXplX2NvbnZfc3RyICsgMTIsICpmbXQpOworCQkJaWYgKCFwKSB7CisJCQkJaWYgKCpmbXQgPT0gJ3MnKSB7CisJCQkJCWJjbnQgKz0gcHJlYzsKKwkJCQl9IGVsc2UgaWYgKCpmbXQgPT0gJ18nKSB7CisJCQkJCSsrZm10OworCQkJCQlpZiAoKCpmbXQgPT0gJ2MnKSB8fCAoKmZtdCA9PSAncCcpIHx8ICgqZm10ID09ICd1JykpIHsKKwkJCQkJCWJjbnQgKz0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYmNudCArPSBzaXplX2NvbnZfc3RyW3AgLSAoc2l6ZV9jb252X3N0ciArIDEyKV07CisJCQl9CisJCX0KKwkJY3VyX3NpemUgKz0gYmNudCAqIGZ1LT5yZXBzOworCX0KKwlyZXR1cm4gY3VyX3NpemU7Cit9CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIHJld3JpdGUocHJpdl9kdW1wZXJfdCAqZHVtcGVyLCBGUyAqZnMpCit7CisJZW51bSB7IE5PVE9LQVksIFVTRUJDTlQsIFVTRVBSRUMgfSBzb2theTsKKwlQUiAqcHI7CisJRlUgKmZ1OworCWNoYXIgKnAxLCAqcDIsICpwMzsKKwljaGFyIHNhdmVjaCwgKmZtdHA7CisJY29uc3QgY2hhciAqYnl0ZV9jb3VudF9zdHI7CisJaW50IG5jb252LCBwcmVjID0gMDsKKworCWZvciAoZnUgPSBmcy0+bmV4dGZ1OyBmdTsgZnUgPSBmdS0+bmV4dGZ1KSB7CisJCS8qCisJCSAqIGJyZWFrIGVhY2ggZm9ybWF0IHVuaXQgaW50byBwcmludCB1bml0czsgZWFjaAorCQkgKiBjb252ZXJzaW9uIGNoYXJhY3RlciBnZXRzIGl0cyBvd24uCisJCSAqLworCQlmb3IgKG5jb252ID0gMCwgZm10cCA9IGZ1LT5mbXQ7ICpmbXRwOyApIHsKKwkJCS8qIE5PU1RSSUNUICovCisJCQkvKiBEQlU6W2R2YWVAY3JheS5jb21dIHphbGxvYyBzbyB0aGF0IGZvcndhcmQgcHRycyBzdGFydCBvdXQgTlVMTCovCisJCQlwciA9IHh6YWxsb2Moc2l6ZW9mKFBSKSk7CisJCQlpZiAoIWZ1LT5uZXh0cHIpCisJCQkJZnUtPm5leHRwciA9IHByOworCisJCQkvKiBza2lwIHByZWNlZGluZyB0ZXh0IGFuZCB1cCB0byB0aGUgbmV4dCAlIHNpZ24gKi8KKwkJCWZvciAocDEgPSBmbXRwOyAqcDEgJiYgKnAxICE9ICclJzsgKytwMSkKKwkJCQljb250aW51ZTsKKworCQkJLyogb25seSB0ZXh0IGluIHRoZSBzdHJpbmcgKi8KKwkJCWlmICghKnAxKSB7CisJCQkJcHItPmZtdCA9IGZtdHA7CisJCQkJcHItPmZsYWdzID0gRl9URVhUOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogZ2V0IHByZWNpc2lvbiBmb3IgJXMgLS0gaWYgaGF2ZSBhIGJ5dGUgY291bnQsIGRvbid0CisJCQkgKiBuZWVkIGl0LgorCQkJICovCisJCQlpZiAoZnUtPmJjbnQpIHsKKwkJCQlzb2theSA9IFVTRUJDTlQ7CisJCQkJLyogc2tpcCB0byBjb252ZXJzaW9uIGNoYXJhY3RlciAqLworCQkJCWZvciAoKytwMTsgc3RyY2hyKGluZGV4X3N0ciwgKnAxKTsgKytwMSkKKwkJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCS8qIHNraXAgYW55IHNwZWNpYWwgY2hhcnMsIGZpZWxkIHdpZHRoICovCisJCQkJd2hpbGUgKHN0cmNocihpbmRleF9zdHIgKyAxLCAqKytwMSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgqcDEgPT0gJy4nICYmIGlzZGlnaXQoKisrcDEpKSB7CisJCQkJCXNva2F5ID0gVVNFUFJFQzsKKwkJCQkJcHJlYyA9IGF0b2kocDEpOworCQkJCQl3aGlsZSAoaXNkaWdpdCgqKytwMSkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UKKwkJCQkJc29rYXkgPSBOT1RPS0FZOworCQkJfQorCisJCQlwMiA9IHAxICsgMTsgLyogc2V0IGVuZCBwb2ludGVyICovCisKKwkJCS8qCisJCQkgKiBmaWd1cmUgb3V0IHRoZSBieXRlIGNvdW50IGZvciBlYWNoIGNvbnZlcnNpb247CisJCQkgKiByZXdyaXRlIHRoZSBmb3JtYXQgYXMgbmVjZXNzYXJ5LCBzZXQgdXAgYmxhbmstCisJCQkgKiBwYmJfZHVtcF9hZGRpbmcgZm9yIGVuZCBvZiBkYXRhLgorCQkJICovCisJCQlpZiAoKnAxID09ICdjJykgeworCQkJCXByLT5mbGFncyA9IEZfQ0hBUjsKKyBET19CWVRFX0NPVU5UXzE6CisJCQkJYnl0ZV9jb3VudF9zdHIgPSAiXDAwMSI7CisgRE9fQllURV9DT1VOVDoKKwkJCQlpZiAoZnUtPmJjbnQpIHsKKwkJCQkJZG8geworCQkJCQkJaWYgKGZ1LT5iY250ID09ICpieXRlX2NvdW50X3N0cikgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9IHdoaWxlICgqKytieXRlX2NvdW50X3N0cik7CisJCQkJfQorCQkJCS8qIFVubGlrZSB0aGUgb3JpZ2luYWwsIG91dHB1dCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmb3JtYXQgc3RyaW5nLiAqLworCQkJCWlmICghKmJ5dGVfY291bnRfc3RyKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgYnl0ZSBjb3VudCBmb3IgY29udmVyc2lvbiBjaGFyYWN0ZXIgJXMiLCBwMSk7CisJCQkJfQorCQkJCXByLT5iY250ID0gKmJ5dGVfY291bnRfc3RyOworCQkJfSBlbHNlIGlmICgqcDEgPT0gJ2wnKSB7CisJCQkJKytwMjsKKwkJCQkrK3AxOworIERPX0lOVF9DT05WOgorCQkJCXsKKwkJCQkJY29uc3QgY2hhciAqZTsKKwkJCQkJZSA9IHN0cmNocihsY2MsICpwMSk7CisJCQkJCWlmICghZSkgeworCQkJCQkJZ290byBET19CQURfQ09OVl9DSEFSOworCQkJCQl9CisJCQkJCXByLT5mbGFncyA9IEZfSU5UOworCQkJCQlpZiAoZSA+IGxjYyArIDEpIHsKKwkJCQkJCXByLT5mbGFncyA9IEZfVUlOVDsKKwkJCQkJfQorCQkJCQlieXRlX2NvdW50X3N0ciA9ICJcMDA0XDAwMlwwMDEiOworCQkJCQlnb3RvIERPX0JZVEVfQ09VTlQ7CisJCQkJfQorCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCX0gZWxzZSBpZiAoc3RyY2hyKGxjYywgKnAxKSkgeworCQkJCWdvdG8gRE9fSU5UX0NPTlY7CisJCQl9IGVsc2UgaWYgKHN0cmNocigiZUVmZ0ciLCAqcDEpKSB7CisJCQkJcHItPmZsYWdzID0gRl9EQkw7CisJCQkJYnl0ZV9jb3VudF9zdHIgPSAiXDAxMFwwMDQiOworCQkJCWdvdG8gRE9fQllURV9DT1VOVDsKKwkJCX0gZWxzZSBpZiAoKnAxID09ICdzJykgeworCQkJCXByLT5mbGFncyA9IEZfU1RSOworCQkJCWlmIChzb2theSA9PSBVU0VCQ05UKSB7CisJCQkJCXByLT5iY250ID0gZnUtPmJjbnQ7CisJCQkJfSBlbHNlIGlmIChzb2theSA9PSBVU0VQUkVDKSB7CisJCQkJCXByLT5iY250ID0gcHJlYzsKKwkJCQl9IGVsc2UgeyAgIC8qIE5PVE9LQVkgKi8KKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiUlcyByZXF1aXJlcyBhIHByZWNpc2lvbiBvciBhIGJ5dGUgY291bnQiKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCpwMSA9PSAnXycpIHsKKwkJCQkrK3AyOworCQkJCXN3aXRjaCAocDFbMV0pIHsKKwkJCQljYXNlICdBJzoKKwkJCQkJZHVtcGVyLT5lbmRmdSA9IGZ1OworCQkJCQlmdS0+ZmxhZ3MgfD0gRl9JR05PUkU7CisJCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkJY2FzZSAnYSc6CisJCQkJCXByLT5mbGFncyA9IEZfQUREUkVTUzsKKwkJCQkJKytwMjsKKwkJCQkJaWYgKChwMVsyXSAhPSAnZCcpICYmIChwMVsyXSAhPSAnbycpICYmIChwMVsyXSAhPSAneCcpKSB7CisJCQkJCQlnb3RvIERPX0JBRF9DT05WX0NIQVI7CisJCQkJCX0KKwkJCQkJKnAxID0gcDFbMl07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2MnOgorCQkJCQlwci0+ZmxhZ3MgPSBGX0M7CisJCQkJCS8qICpwMSA9ICdjJzsgICBzZXQgaW4gY29udl9jICovCisJCQkJCWdvdG8gRE9fQllURV9DT1VOVF8xOworCQkJCWNhc2UgJ3AnOgorCQkJCQlwci0+ZmxhZ3MgPSBGX1A7CisJCQkJCSpwMSA9ICdjJzsKKwkJCQkJZ290byBET19CWVRFX0NPVU5UXzE7CisJCQkJY2FzZSAndSc6CisJCQkJCXByLT5mbGFncyA9IEZfVTsKKwkJCQkJLyogKnAxID0gJ2MnOyAgIHNldCBpbiBjb252X3UgKi8KKwkJCQkJZ290byBET19CWVRFX0NPVU5UXzE7CisJCQkJZGVmYXVsdDoKKwkJCQkJZ290byBET19CQURfQ09OVl9DSEFSOworCQkJCX0KKwkJCX0gZWxzZSB7CisgRE9fQkFEX0NPTlZfQ0hBUjoKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGNvbnZlcnNpb24gY2hhcmFjdGVyICUlJXMiLCBwMSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBjb3B5IHRvIFBSIGZvcm1hdCBzdHJpbmcsIHNldCBjb252ZXJzaW9uIGNoYXJhY3RlcgorCQkJICogcG9pbnRlciwgdXBkYXRlIG9yaWdpbmFsLgorCQkJICovCisJCQlzYXZlY2ggPSAqcDI7CisJCQlwMVsxXSA9ICdcMCc7CisJCQlwci0+Zm10ID0geHN0cmR1cChmbXRwKTsKKwkJCSpwMiA9IHNhdmVjaDsKKwkJCS8vVG9vIGVhcmx5ISB4cmVhbGxvYyBjYW4gbW92ZSBwci0+Zm10IQorCQkJLy9wci0+Y2NoYXIgPSBwci0+Zm10ICsgKHAxIC0gZm10cCk7CisKKwkJCS8qIERCVTpbZGF2ZUBjcmF5LmNvbV0gdy9vIHRoaXMsIHRyYWlsaW5nIGZtdCB0ZXh0LCBzcGFjZSBpcyBsb3N0LgorCQkJICogU2tpcCBzdWJzZXF1ZW50IHRleHQgYW5kIHVwIHRvIHRoZSBuZXh0ICUgc2lnbiBhbmQgdGFjayB0aGUKKwkJCSAqIGFkZGl0aW9uYWwgdGV4dCBvbnRvIGZtdDogZWcuIGlmIGZtdCBpcyAiJXggaXMgYSBIRVggbnVtYmVyIiwKKwkJCSAqIHdlIGxvc2UgdGhlICIgaXMgYSBIRVggbnVtYmVyIiBwYXJ0IG9mIGZtdC4KKwkJCSAqLworCQkJZm9yIChwMyA9IHAyOyAqcDMgJiYgKnAzICE9ICclJzsgcDMrKykKKwkJCQljb250aW51ZTsKKwkJCWlmIChwMyA+IHAyKSB7CisJCQkJc2F2ZWNoID0gKnAzOworCQkJCSpwMyA9ICdcMCc7CisJCQkJcHItPmZtdCA9IHhyZWFsbG9jKHByLT5mbXQsIHN0cmxlbihwci0+Zm10KSArIChwMy1wMikgKyAxKTsKKwkJCQlzdHJjYXQocHItPmZtdCwgcDIpOworCQkJCSpwMyA9IHNhdmVjaDsKKwkJCQlwMiA9IHAzOworCQkJfQorCisJCQlwci0+Y2NoYXIgPSBwci0+Zm10ICsgKHAxIC0gZm10cCk7CisJCQlmbXRwID0gcDI7CisKKwkJCS8qIG9ubHkgb25lIGNvbnZlcnNpb24gY2hhcmFjdGVyIGlmIGJ5dGUgY291bnQgKi8KKwkJCWlmICghKHByLT5mbGFncyAmIEZfQUREUkVTUykgJiYgZnUtPmJjbnQgJiYgbmNvbnYrKykgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJieXRlIGNvdW50IHdpdGggbXVsdGlwbGUgY29udmVyc2lvbiBjaGFyYWN0ZXJzIik7CisJCQl9CisJCX0KKwkJLyoKKwkJICogaWYgZm9ybWF0IHVuaXQgYnl0ZSBjb3VudCBub3Qgc3BlY2lmaWVkLCBmaWd1cmUgaXQgb3V0CisJCSAqIHNvIGNhbiBhZGp1c3QgcmVwIGNvdW50IGxhdGVyLgorCQkgKi8KKwkJaWYgKCFmdS0+YmNudCkKKwkJCWZvciAocHIgPSBmdS0+bmV4dHByOyBwcjsgcHIgPSBwci0+bmV4dHByKQorCQkJCWZ1LT5iY250ICs9IHByLT5iY250OworCX0KKwkvKgorCSAqIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGludGVycHJldHMgYW55IGRhdGEgYXQgYWxsLCBhbmQgaXQncworCSAqIG5vdCB0aGUgc2FtZSBhcyB0aGUgYmxvY2tzaXplLCBhbmQgaXRzIGxhc3QgZm9ybWF0IHVuaXQKKwkgKiBpbnRlcnByZXRzIGFueSBkYXRhIGF0IGFsbCwgYW5kIGhhcyBubyBpdGVyYXRpb24gY291bnQsCisJICogcmVwZWF0IGl0IGFzIG5lY2Vzc2FyeS4KKwkgKgorCSAqIGlmLCByZXAgY291bnQgaXMgZ3JlYXRlciB0aGFuIDEsIG5vIHRyYWlsaW5nIHdoaXRlc3BhY2UKKwkgKiBnZXRzIG91dHB1dCBmcm9tIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgZm9ybWF0IHVuaXQuCisJICovCisJZm9yIChmdSA9IGZzLT5uZXh0ZnU7IGZ1OyBmdSA9IGZ1LT5uZXh0ZnUpIHsKKwkJaWYgKCFmdS0+bmV4dGZ1ICYmIGZzLT5iY250IDwgZHVtcGVyLT5ibG9ja3NpemUKKwkJICYmICEoZnUtPmZsYWdzICYgRl9TRVRSRVApICYmIGZ1LT5iY250CisJCSkgeworCQkJZnUtPnJlcHMgKz0gKGR1bXBlci0+YmxvY2tzaXplIC0gZnMtPmJjbnQpIC8gZnUtPmJjbnQ7CisJCX0KKwkJaWYgKGZ1LT5yZXBzID4gMSkgeworCQkJZm9yIChwciA9IGZ1LT5uZXh0cHI7OyBwciA9IHByLT5uZXh0cHIpCisJCQkJaWYgKCFwci0+bmV4dHByKQorCQkJCQlicmVhazsKKwkJCWZvciAocDEgPSBwci0+Zm10LCBwMiA9IE5VTEw7ICpwMTsgKytwMSkKKwkJCQlwMiA9IGlzc3BhY2UoKnAxKSA/IHAxIDogTlVMTDsKKwkJCWlmIChwMikKKwkJCQlwci0+bm9zcGFjZSA9IHAyOworCQl9CisJCWlmICghZnUtPm5leHRmdSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZG9fc2tpcChwcml2X2R1bXBlcl90ICpkdW1wZXIsIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgc3RhdG9rKQoreworCXN0cnVjdCBzdGF0IHNidWY7CisKKwlpZiAoc3RhdG9rKSB7CisJCXhmc3RhdChTVERJTl9GSUxFTk8sICZzYnVmLCBmbmFtZSk7CisJCWlmICghKFNfSVNDSFIoc2J1Zi5zdF9tb2RlKSB8fCBTX0lTQkxLKHNidWYuc3RfbW9kZSkgfHwgU19JU0ZJRk8oc2J1Zi5zdF9tb2RlKSkKKwkJICYmIGR1bXBlci0+cHViLmR1bXBfc2tpcCA+PSBzYnVmLnN0X3NpemUKKwkJKSB7CisJCQkvKiBJZiBiYl9kdW1wX3NpemUgdmFsaWQgYW5kIHB1Yi5kdW1wX3NraXAgPj0gc2l6ZSAqLworCQkJZHVtcGVyLT5wdWIuZHVtcF9za2lwIC09IHNidWYuc3Rfc2l6ZTsKKwkJCWR1bXBlci0+YWRkcmVzcyArPSBzYnVmLnN0X3NpemU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGZzZWVrKHN0ZGluLCBkdW1wZXItPnB1Yi5kdW1wX3NraXAsIFNFRUtfU0VUKSkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGZuYW1lKTsKKwl9CisJZHVtcGVyLT5hZGRyZXNzICs9IGR1bXBlci0+cHViLmR1bXBfc2tpcDsKKwlkdW1wZXItPnNhdmFkZHJlc3MgPSBkdW1wZXItPmFkZHJlc3M7CisJZHVtcGVyLT5wdWIuZHVtcF9za2lwID0gMDsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCBuZXh0KHByaXZfZHVtcGVyX3QgKmR1bXBlcikKK3sKKwlpbnQgc3RhdG9rOworCisJZm9yICg7OykgeworCQlpZiAoKmR1bXBlci0+YXJndikgeworCQkJZHVtcGVyLT5uZXh0X19kb25lID0gc3RhdG9rID0gMTsKKwkJCWlmICghKGZyZW9wZW4oKmR1bXBlci0+YXJndiwgInIiLCBzdGRpbikpKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmR1bXBlci0+YXJndik7CisJCQkJZHVtcGVyLT5leGl0dmFsID0gMTsKKwkJCQkrK2R1bXBlci0+YXJndjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChkdW1wZXItPm5leHRfX2RvbmUpCisJCQkJcmV0dXJuIDA7IC8qIG5vIG5leHQgZmlsZSAqLworCQkJZHVtcGVyLT5uZXh0X19kb25lID0gMTsKKwkJCXN0YXRvayA9IDA7CisJCX0KKwkJaWYgKGR1bXBlci0+cHViLmR1bXBfc2tpcCkKKwkJCWRvX3NraXAoZHVtcGVyLCBzdGF0b2sgPyAqZHVtcGVyLT5hcmd2IDogInN0ZGluIiwgc3RhdG9rKTsKKwkJaWYgKCpkdW1wZXItPmFyZ3YpCisJCQkrK2R1bXBlci0+YXJndjsKKwkJaWYgKCFkdW1wZXItPnB1Yi5kdW1wX3NraXApCisJCQlyZXR1cm4gMTsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZ2V0KHByaXZfZHVtcGVyX3QgKmR1bXBlcikKK3sKKwlpbnQgbjsKKwlpbnQgbmVlZCwgbnJlYWQ7CisJaW50IGJsb2Nrc2l6ZSA9IGR1bXBlci0+YmxvY2tzaXplOworCisJaWYgKCFkdW1wZXItPmdldF9fY3VycCkgeworCQlkdW1wZXItPmFkZHJlc3MgPSAob2ZmX3QpMDsgLypEQlU6W2RhdmVAY3JheS5jb21dIGluaXRpYWxpemUsaW5pdGlhbGl6ZS4uKi8KKwkJZHVtcGVyLT5nZXRfX2N1cnAgPSB4bWFsbG9jKGJsb2Nrc2l6ZSk7CisJCWR1bXBlci0+Z2V0X19zYXZwID0geHphbGxvYyhibG9ja3NpemUpOyAvKiBuZWVkIHRvIGJlIGluaXRpYWxpemVkICovCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgY2hhciAqdG1wID0gZHVtcGVyLT5nZXRfX2N1cnA7CisJCWR1bXBlci0+Z2V0X19jdXJwID0gZHVtcGVyLT5nZXRfX3NhdnA7CisJCWR1bXBlci0+Z2V0X19zYXZwID0gdG1wOworCQlkdW1wZXItPnNhdmFkZHJlc3MgKz0gYmxvY2tzaXplOworCQlkdW1wZXItPmFkZHJlc3MgPSBkdW1wZXItPnNhdmFkZHJlc3M7CisJfQorCW5lZWQgPSBibG9ja3NpemU7CisJbnJlYWQgPSAwOworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIGlmIHJlYWQgdGhlIHJpZ2h0IG51bWJlciBvZiBieXRlcywgb3IgYXQgRU9GIGZvciBvbmUgZmlsZSwKKwkJICogYW5kIG5vIG90aGVyIGZpbGVzIGFyZSBhdmFpbGFibGUsIHplcm8tcGFkIHRoZSByZXN0IG9mIHRoZQorCQkgKiBibG9jayBhbmQgc2V0IHRoZSBlbmQgZmxhZy4KKwkJICovCisJCWlmICghZHVtcGVyLT5wdWIuZHVtcF9sZW5ndGggfHwgKGR1bXBlci0+Z2V0X19hdGVvZiAmJiAhbmV4dChkdW1wZXIpKSkgeworCQkJaWYgKG5lZWQgPT0gYmxvY2tzaXplKSB7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyAhPSBBTEwgJiYgIW1lbWNtcChkdW1wZXItPmdldF9fY3VycCwgZHVtcGVyLT5nZXRfX3NhdnAsIG5yZWFkKSkgeworCQkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnICE9IERVUCkgeworCQkJCQlwdXRzKCIqIik7CisJCQkJfQorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJbWVtc2V0KGR1bXBlci0+Z2V0X19jdXJwICsgbnJlYWQsIDAsIG5lZWQpOworCQkJZHVtcGVyLT5lYWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzcyArIG5yZWFkOworCQkJcmV0dXJuIGR1bXBlci0+Z2V0X19jdXJwOworCQl9CisJCW4gPSBmcmVhZChkdW1wZXItPmdldF9fY3VycCArIG5yZWFkLCBzaXplb2YodW5zaWduZWQgY2hhciksCisJCQkJZHVtcGVyLT5wdWIuZHVtcF9sZW5ndGggPT0gLTEgPyBuZWVkIDogTUlOKGR1bXBlci0+cHViLmR1bXBfbGVuZ3RoLCBuZWVkKSwgc3RkaW4pOworCQlpZiAoIW4pIHsKKwkJCWlmIChmZXJyb3Ioc3RkaW4pKSB7CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZHVtcGVyLT5hcmd2Wy0xXSk7CisJCQl9CisJCQlkdW1wZXItPmdldF9fYXRlb2YgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZHVtcGVyLT5nZXRfX2F0ZW9mID0gMDsKKwkJaWYgKGR1bXBlci0+cHViLmR1bXBfbGVuZ3RoICE9IC0xKSB7CisJCQlkdW1wZXItPnB1Yi5kdW1wX2xlbmd0aCAtPSBuOworCQl9CisJCW5lZWQgLT0gbjsKKwkJaWYgKCFuZWVkKSB7CisJCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9PSBBTEwgfHwgZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9PSBGSVJTVAorCQkJIHx8IG1lbWNtcChkdW1wZXItPmdldF9fY3VycCwgZHVtcGVyLT5nZXRfX3NhdnAsIGJsb2Nrc2l6ZSkKKwkJCSkgeworCQkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IERVUCB8fCBkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IEZJUlNUKSB7CisJCQkJCWR1bXBlci0+cHViLmR1bXBfdmZsYWcgPSBXQUlUOworCQkJCX0KKwkJCQlyZXR1cm4gZHVtcGVyLT5nZXRfX2N1cnA7CisJCQl9CisJCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9PSBXQUlUKSB7CisJCQkJcHV0cygiKiIpOworCQkJfQorCQkJZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9IERVUDsKKwkJCWR1bXBlci0+c2F2YWRkcmVzcyArPSBibG9ja3NpemU7CisJCQlkdW1wZXItPmFkZHJlc3MgPSBkdW1wZXItPnNhdmFkZHJlc3M7CisJCQluZWVkID0gYmxvY2tzaXplOworCQkJbnJlYWQgPSAwOworCQl9IGVsc2UgeworCQkJbnJlYWQgKz0gbjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnBhZChQUiAqcHIpCit7CisJY2hhciAqcDEsICpwMjsKKworCS8qCisJICogcmVtb3ZlIGFsbCBjb252ZXJzaW9uIGZsYWdzOyAnLScgaXMgdGhlIG9ubHkgb25lIHZhbGlkCisJICogd2l0aCAlcywgYW5kIGl0J3Mgbm90IHVzZWZ1bCBoZXJlLgorCSAqLworCXByLT5mbGFncyA9IEZfQlBBRDsKKwkqcHItPmNjaGFyID0gJ3MnOworCWZvciAocDEgPSBwci0+Zm10OyAqcDEgIT0gJyUnOyArK3AxKQorCQljb250aW51ZTsKKwlmb3IgKHAyID0gKytwMTsgKnAxICYmIHN0cmNocigiIC0wKyMiLCAqcDEpOyArK3AxKQorCQlpZiAocHItPm5vc3BhY2UpCisJCQlwci0+bm9zcGFjZS0tOworCXdoaWxlICgoKnAyKysgPSAqcDErKykgIT0gMCkKKwkJY29udGludWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbnZfc3RyW10gQUxJR04xID0KKwkiXDBcXDBcMCIKKwkiXDAwN1xcYVwwIiAgLyogXGEgKi8KKwkiXGJcXGJcMCIKKwkiXGZcXGJcMCIKKwkiXG5cXG5cMCIKKwkiXHJcXHJcMCIKKwkiXHRcXHRcMCIKKwkiXHZcXHZcMCIKKwk7CisKKworc3RhdGljIHZvaWQgY29udl9jKFBSICpwciwgdW5zaWduZWQgY2hhciAqcCkKK3sKKwljb25zdCBjaGFyICpzdHIgPSBjb252X3N0cjsKKwljaGFyIGJ1ZlsxMF07CisKKwlkbyB7CisJCWlmICgqcCA9PSAqc3RyKSB7CisJCQkrK3N0cjsKKwkJCWdvdG8gc3RycHI7CisJCX0KKwkJc3RyICs9IDQ7CisJfSB3aGlsZSAoKnN0cik7CisKKwlpZiAoaXNwcmludF9hc2NpaW9ubHkoKnApKSB7CisJCSpwci0+Y2NoYXIgPSAnYyc7CisJCXByaW50Zihwci0+Zm10LCAqcCk7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihidWYsICIlMDNvIiwgKGludCkgKnApOworCQlzdHIgPSBidWY7Cisgc3RycHI6CisJCSpwci0+Y2NoYXIgPSAncyc7CisJCXByaW50Zihwci0+Zm10LCBzdHIpOworCX0KK30KKworc3RhdGljIHZvaWQgY29udl91KFBSICpwciwgdW5zaWduZWQgY2hhciAqcCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBsaXN0W10gQUxJR04xID0KKwkJIm51bFwwc29oXDBzdHhcMGV0eFwwZW90XDBlbnFcMGFja1wwYmVsXDAiCisJCSJic1wwX2h0XDBfbGZcMF92dFwwX2ZmXDBfY3JcMF9zb1wwX3NpXDBfIgorCQkiZGxlXDBkY2xcMGRjMlwwZGMzXDBkYzRcMG5ha1wwc3luXDBldGJcMCIKKwkJImNhblwwZW1cMF9zdWJcMGVzY1wwZnNcMF9nc1wwX3JzXDBfdXMiOworCisJLyogb2QgdXNlZCBubCwgbm90IGxmICovCisJaWYgKCpwIDw9IDB4MWYpIHsKKwkJKnByLT5jY2hhciA9ICdzJzsKKwkJcHJpbnRmKHByLT5mbXQsIGxpc3QgKyAoNCAqIChpbnQpKnApKTsKKwl9IGVsc2UgaWYgKCpwID09IDB4N2YpIHsKKwkJKnByLT5jY2hhciA9ICdzJzsKKwkJcHJpbnRmKHByLT5mbXQsICJkZWwiKTsKKwl9IGVsc2UgaWYgKCpwIDwgMHg3ZikgeyAvKiBpc3ByaW50KCkgKi8KKwkJKnByLT5jY2hhciA9ICdjJzsKKwkJcHJpbnRmKHByLT5mbXQsICpwKTsKKwl9IGVsc2UgeworCQkqcHItPmNjaGFyID0gJ3gnOworCQlwcmludGYocHItPmZtdCwgKGludCkgKnApOworCX0KK30KKworc3RhdGljIHZvaWQgZGlzcGxheShwcml2X2R1bXBlcl90KiBkdW1wZXIpCit7CisJRlMgKmZzOworCUZVICpmdTsKKwlQUiAqcHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBjaGFyICpicCwgKnNhdmVicDsKKwlvZmZfdCBzYXZlYWRkcmVzczsKKwl1bnNpZ25lZCBjaGFyIHNhdmVjaCA9ICdcMCc7CisKKwl3aGlsZSAoKGJwID0gZ2V0KGR1bXBlcikpICE9IE5VTEwpIHsKKwkJZnMgPSBkdW1wZXItPnB1Yi5mc2hlYWQ7CisJCXNhdmVicCA9IGJwOworCQlzYXZlYWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzczsKKwkJZm9yICg7IGZzOyBmcyA9IGZzLT5uZXh0ZnMsIGJwID0gc2F2ZWJwLCBkdW1wZXItPmFkZHJlc3MgPSBzYXZlYWRkcmVzcykgeworCQkJZm9yIChmdSA9IGZzLT5uZXh0ZnU7IGZ1OyBmdSA9IGZ1LT5uZXh0ZnUpIHsKKwkJCQlpZiAoZnUtPmZsYWdzICYgRl9JR05PUkUpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWZvciAoY250ID0gZnUtPnJlcHM7IGNudDsgLS1jbnQpIHsKKwkJCQkJZm9yIChwciA9IGZ1LT5uZXh0cHI7IHByOyBkdW1wZXItPmFkZHJlc3MgKz0gcHItPmJjbnQsCisJCQkJCQkJCWJwICs9IHByLT5iY250LCBwciA9IHByLT5uZXh0cHIpIHsKKwkJCQkJCWlmIChkdW1wZXItPmVhZGRyZXNzICYmIGR1bXBlci0+YWRkcmVzcyA+PSBkdW1wZXItPmVhZGRyZXNzCisJCQkJCQkgJiYgIShwci0+ZmxhZ3MgJiAoRl9URVhUIHwgRl9CUEFEKSkKKwkJCQkJCSkgeworCQkJCQkJCWJwYWQocHIpOworCQkJCQkJfQorCQkJCQkJaWYgKGNudCA9PSAxICYmIHByLT5ub3NwYWNlKSB7CisJCQkJCQkJc2F2ZWNoID0gKnByLT5ub3NwYWNlOworCQkJCQkJCSpwci0+bm9zcGFjZSA9ICdcMCc7CisJCQkJCQl9CisvKiAgICAgICAgICAgICAgICAgICAgICBQUklOVDsgKi8KKwkJCQkJCXN3aXRjaCAocHItPmZsYWdzKSB7CisJCQkJCQljYXNlIEZfQUREUkVTUzoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgKHVuc2lnbmVkKSBkdW1wZXItPmFkZHJlc3MpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX0JQQUQ6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQsICIiKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRl9DOgorCQkJCQkJCWNvbnZfYyhwciwgYnApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX0NIQVI6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQsICpicCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfREJMOiB7CisJCQkJCQkJZG91YmxlIGR2YWw7CisJCQkJCQkJZmxvYXQgZnZhbDsKKworCQkJCQkJCXN3aXRjaCAocHItPmJjbnQpIHsKKwkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCW1lbWNweSgmZnZhbCwgYnAsIHNpemVvZihmdmFsKSk7CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCBmdmFsKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA4OgorCQkJCQkJCQltZW1jcHkoJmR2YWwsIGJwLCBzaXplb2YoZHZhbCkpOworCQkJCQkJCQlwcmludGYocHItPmZtdCwgZHZhbCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWNhc2UgRl9JTlQ6IHsKKwkJCQkJCQlpbnQgaXZhbDsKKwkJCQkJCQlzaG9ydCBzdmFsOworCisJCQkJCQkJc3dpdGNoIChwci0+YmNudCkgeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIChpbnQpICpicCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJbWVtY3B5KCZzdmFsLCBicCwgc2l6ZW9mKHN2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIChpbnQpIHN2YWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDQ6CisJCQkJCQkJCW1lbWNweSgmaXZhbCwgYnAsIHNpemVvZihpdmFsKSk7CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCBpdmFsKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJY2FzZSBGX1A6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQsIGlzcHJpbnRfYXNjaWlvbmx5KCpicCkgPyAqYnAgOiAnLicpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX1NUUjoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgKGNoYXIgKikgYnApOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX1RFWFQ6CisJCQkJCQkJcHJpbnRmKHByLT5mbXQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX1U6CisJCQkJCQkJY29udl91KHByLCBicCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfVUlOVDogeworCQkJCQkJCXVuc2lnbmVkIGl2YWw7CisJCQkJCQkJdW5zaWduZWQgc2hvcnQgc3ZhbDsKKworCQkJCQkJCXN3aXRjaCAocHItPmJjbnQpIHsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCAodW5zaWduZWQpICpicCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJbWVtY3B5KCZzdmFsLCBicCwgc2l6ZW9mKHN2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsICh1bnNpZ25lZCkgc3ZhbCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJbWVtY3B5KCZpdmFsLCBicCwgc2l6ZW9mKGl2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIGl2YWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoY250ID09IDEgJiYgcHItPm5vc3BhY2UpIHsKKwkJCQkJCQkqcHItPm5vc3BhY2UgPSBzYXZlY2g7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGR1bXBlci0+ZW5kZnUpIHsKKwkJLyoKKwkJICogaWYgZWFkZHJlc3Mgbm90IHNldCwgZXJyb3Igb3IgZmlsZSBzaXplIHdhcyBtdWx0aXBsZQorCQkgKiBvZiBibG9ja3NpemUsIGFuZCBubyBwYXJ0aWFsIGJsb2NrIGV2ZXIgZm91bmQuCisJCSAqLworCQlpZiAoIWR1bXBlci0+ZWFkZHJlc3MpIHsKKwkJCWlmICghZHVtcGVyLT5hZGRyZXNzKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZHVtcGVyLT5lYWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzczsKKwkJfQorCQlmb3IgKHByID0gZHVtcGVyLT5lbmRmdS0+bmV4dHByOyBwcjsgcHIgPSBwci0+bmV4dHByKSB7CisJCQlzd2l0Y2ggKHByLT5mbGFncykgeworCQkJY2FzZSBGX0FERFJFU1M6CisJCQkJcHJpbnRmKHByLT5mbXQsICh1bnNpZ25lZCkgZHVtcGVyLT5lYWRkcmVzcyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZfVEVYVDoKKwkJCQlwcmludGYocHItPmZtdCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgZHVtcGVyICgocHJpdl9kdW1wZXJfdCopcHViX2R1bXBlcikKK2ludCBGQVNUX0ZVTkMgYmJfZHVtcF9kdW1wKGR1bXBlcl90ICpwdWJfZHVtcGVyLCBjaGFyICoqYXJndikKK3sKKwlGUyAqdGZzOworCWludCBibG9ja3NpemU7CisKKwkvKiBmaWd1cmUgb3V0IHRoZSBkYXRhIGJsb2NrIGJiX2R1bXBfc2l6ZSAqLworCWJsb2Nrc2l6ZSA9IDA7CisJdGZzID0gZHVtcGVyLT5wdWIuZnNoZWFkOworCXdoaWxlICh0ZnMpIHsKKwkJdGZzLT5iY250ID0gYmJfZHVtcF9zaXplKHRmcyk7CisJCWlmIChibG9ja3NpemUgPCB0ZnMtPmJjbnQpIHsKKwkJCWJsb2Nrc2l6ZSA9IHRmcy0+YmNudDsKKwkJfQorCQl0ZnMgPSB0ZnMtPm5leHRmczsKKwl9CisJZHVtcGVyLT5ibG9ja3NpemUgPSBibG9ja3NpemU7CisKKwkvKiByZXdyaXRlIHRoZSBydWxlcywgZG8gc3ludGF4IGNoZWNraW5nICovCisJZm9yICh0ZnMgPSBkdW1wZXItPnB1Yi5mc2hlYWQ7IHRmczsgdGZzID0gdGZzLT5uZXh0ZnMpIHsKKwkJcmV3cml0ZShkdW1wZXIsIHRmcyk7CisJfQorCisJZHVtcGVyLT5hcmd2ID0gYXJndjsKKwlkaXNwbGF5KGR1bXBlcik7CisKKwlyZXR1cm4gZHVtcGVyLT5leGl0dmFsOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9kdW1wX2FkZChkdW1wZXJfdCogcHViX2R1bXBlciwgY29uc3QgY2hhciAqZm10KQoreworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqcDE7CisJY2hhciAqcDI7CisJRlMgKnRmczsKKwlGVSAqdGZ1LCAqKm5leHRmdXBwOworCWNvbnN0IGNoYXIgKnNhdmVwOworCisJLyogc3RhcnQgbmV3IGxpbmtlZCBsaXN0IG9mIGZvcm1hdCB1bml0cyAqLworCXRmcyA9IHh6YWxsb2Moc2l6ZW9mKEZTKSk7IC8qREJVOltkYXZlQGNyYXkuY29tXSBzdGFydCBvdXQgTlVMTCAqLworCWlmICghZHVtcGVyLT5wdWIuZnNoZWFkKSB7CisJCWR1bXBlci0+cHViLmZzaGVhZCA9IHRmczsKKwl9IGVsc2UgeworCQlGUyAqZnNsYXN0ID0gZHVtcGVyLT5wdWIuZnNoZWFkOworCQl3aGlsZSAoZnNsYXN0LT5uZXh0ZnMpCisJCQlmc2xhc3QgPSBmc2xhc3QtPm5leHRmczsKKwkJZnNsYXN0LT5uZXh0ZnMgPSB0ZnM7CisJfQorCW5leHRmdXBwID0gJnRmcy0+bmV4dGZ1OworCisJLyogdGFrZSB0aGUgZm9ybWF0IHN0cmluZyBhbmQgYnJlYWsgaXQgdXAgaW50byBmb3JtYXQgdW5pdHMgKi8KKwlwID0gZm10OworCWZvciAoOzspIHsKKwkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKwkJaWYgKCEqcCkgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiBhbGxvY2F0ZSBhIG5ldyBmb3JtYXQgdW5pdCBhbmQgbGluayBpdCBpbiAqLworCQkvKiBOT1NUUklDVCAqLworCQkvKiBEQlU6W2RhdmVAY3JheS5jb21dIHphbGxvYyBzbyB0aGF0IGZvcndhcmQgcG9pbnRlcnMgc3RhcnQgb3V0IE5VTEwgKi8KKwkJdGZ1ID0geHphbGxvYyhzaXplb2YoRlUpKTsKKwkJKm5leHRmdXBwID0gdGZ1OworCQluZXh0ZnVwcCA9ICZ0ZnUtPm5leHRmdTsKKwkJdGZ1LT5yZXBzID0gMTsKKworCQkvKiBpZiBsZWFkaW5nIGRpZ2l0LCByZXBldGl0aW9uIGNvdW50ICovCisJCWlmIChpc2RpZ2l0KCpwKSkgeworCQkJZm9yIChzYXZlcCA9IHA7IGlzZGlnaXQoKnApOyArK3ApCisJCQkJY29udGludWU7CisJCQlpZiAoIWlzc3BhY2UoKnApICYmICpwICE9ICcvJykgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQkJLyogbWF5IG92ZXJ3cml0ZSBlaXRoZXIgd2hpdGUgc3BhY2Ugb3Igc2xhc2ggKi8KKwkJCXRmdS0+cmVwcyA9IGF0b2koc2F2ZXApOworCQkJdGZ1LT5mbGFncyA9IEZfU0VUUkVQOworCQkJLyogc2tpcCB0cmFpbGluZyB3aGl0ZSBzcGFjZSAqLworCQkJcCA9IHNraXBfd2hpdGVzcGFjZSgrK3ApOworCQl9CisKKwkJLyogc2tpcCBzbGFzaCBhbmQgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KKwkJaWYgKCpwID09ICcvJykgeworCQkJcCA9IHNraXBfd2hpdGVzcGFjZSgrK3ApOworCQl9CisKKwkJLyogYnl0ZSBjb3VudCAqLworCQlpZiAoaXNkaWdpdCgqcCkpIHsKKy8vIFRPRE86IHVzZSBiYl9zdHJ0b3UKKwkJCXNhdmVwID0gcDsKKwkJCXdoaWxlIChpc2RpZ2l0KCorK3ApKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpc3NwYWNlKCpwKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQkJdGZ1LT5iY250ID0gYXRvaShzYXZlcCk7CisJCQkvKiBza2lwIHRyYWlsaW5nIHdoaXRlIHNwYWNlICovCisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKCsrcCk7CisJCX0KKworCQkvKiBmb3JtYXQgKi8KKwkJaWYgKCpwICE9ICciJykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBmb3JtYXQgeyVzfSIsIGZtdCk7CisJCX0KKwkJZm9yIChzYXZlcCA9ICsrcDsgKnAgIT0gJyInOykgeworCQkJaWYgKCpwKysgPT0gMCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQl9CisJCXRmdS0+Zm10ID0geHN0cm5kdXAoc2F2ZXAsIHAgLSBzYXZlcCk7CisvKiAgICAgIGVzY2FwZSh0ZnUtPmZtdCk7ICovCisKKwkJcDEgPSB0ZnUtPmZtdDsKKworCQkvKiBhbHBoYWJldGljIGVzY2FwZSBzZXF1ZW5jZXMgaGF2ZSB0byBiZSBkb25lIGluIHBsYWNlICovCisJCWZvciAocDIgPSBwMTs7ICsrcDEsICsrcDIpIHsKKwkJCWlmICghKnAxKSB7CisJCQkJKnAyID0gKnAxOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCpwMSA9PSAnXFwnKSB7CisJCQkJY29uc3QgY2hhciAqY3MgPSBjb252X3N0ciArIDQ7CisJCQkJKytwMTsKKwkJCQkqcDIgPSAqcDE7CisJCQkJZG8geworCQkJCQlpZiAoKnAxID09IGNzWzJdKSB7CisJCQkJCQkqcDIgPSBjc1swXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNzICs9IDQ7CisJCQkJfSB3aGlsZSAoKmNzKTsKKwkJCX0KKwkJfQorCisJCXArKzsKKwl9Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCmRpZmYgLS1naXQgYS9saWJiYi9leGVjYWJsZS5jIGIvbGliYmIvZXhlY2FibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhhMDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZXhlY2FibGUuYwpAQCAtMCwwICsxLDg2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBHYWJyaWVsIFNvbWxvIDxzb21sbyBhdCBjbXUuZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIGNoZWNrIGlmIHBhdGggcG9pbnRzIHRvIGFuIGV4ZWN1dGFibGUgZmlsZTsKKyAqIHJldHVybiAxIGlmIGZvdW5kOworICogcmV0dXJuIDAgb3RoZXJ3aXNlOworICovCitpbnQgRkFTVF9GVU5DIGV4ZWNhYmxlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXJldHVybiAoIWFjY2VzcyhuYW1lLCBYX09LKSAmJiAhc3RhdChuYW1lLCAmcykgJiYgU19JU1JFRyhzLnN0X21vZGUpKTsKK30KKworLyogc2VhcmNoICgqUEFUSHApIGZvciBhbiBleGVjdXRhYmxlIGZpbGU7CisgKiByZXR1cm4gYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGZ1bGwgcGF0aCBpZiBmb3VuZDsKKyAqICBQQVRIcCBwb2ludHMgdG8gdGhlIGNvbXBvbmVudCBhZnRlciB0aGUgb25lIHdoZXJlIGl0IHdhcyBmb3VuZAorICogIChvciBOVUxMKSwKKyAqICB5b3UgbWF5IGNhbGwgZmluZF9leGVjYWJsZSBhZ2FpbiB3aXRoIHRoaXMgUEFUSHAgdG8gY29udGludWUKKyAqICAoaWYgaXQncyBub3QgTlVMTCkuCisgKiByZXR1cm4gTlVMTCBvdGhlcndpc2U7IChQQVRIcCBpcyB1bmRlZmluZWQpCisgKiBpbiBhbGwgY2FzZXMgKCpQQVRIcCkgY29udGVudHMgd2lsbCBiZSB0cmFzaGVkIChzLzovTlVMLykuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBmaW5kX2V4ZWNhYmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqUEFUSHApCit7CisJY2hhciAqcCwgKm47CisKKwlwID0gKlBBVEhwOworCXdoaWxlIChwKSB7CisJCW4gPSBzdHJjaHIocCwgJzonKTsKKwkJaWYgKG4pCisJCQkqbisrID0gJ1wwJzsKKwkJaWYgKCpwICE9ICdcMCcpIHsgLyogaXQncyBub3QgYSBQQVRIPSJmb286OmJhciIgc2l0dWF0aW9uICovCisJCQlwID0gY29uY2F0X3BhdGhfZmlsZShwLCBmaWxlbmFtZSk7CisJCQlpZiAoZXhlY2FibGVfZmlsZShwKSkgeworCQkJCSpQQVRIcCA9IG47CisJCQkJcmV0dXJuIHA7CisJCQl9CisJCQlmcmVlKHApOworCQl9CisJCXAgPSBuOworCX0gLyogb24gbG9vcCBleGl0IHAgPT0gTlVMTCAqLworCXJldHVybiBwOworfQorCisvKiBzZWFyY2ggJFBBVEggZm9yIGFuIGV4ZWN1dGFibGUgZmlsZTsKKyAqIHJldHVybiAxIGlmIGZvdW5kOworICogcmV0dXJuIDAgb3RoZXJ3aXNlOworICovCitpbnQgRkFTVF9GVU5DIGV4aXN0c19leGVjYWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpwYXRoID0geHN0cmR1cChnZXRlbnYoIlBBVEgiKSk7CisJY2hhciAqdG1wID0gcGF0aDsKKwljaGFyICpyZXQgPSBmaW5kX2V4ZWNhYmxlKGZpbGVuYW1lLCAmdG1wKTsKKwlmcmVlKHBhdGgpOworCWlmIChyZXQpIHsKKwkJZnJlZShyZXQpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworLyoganVzdCBsaWtlIHRoZSByZWFsIGV4ZWN2cCwgYnV0IHRyeSB0byBsYXVuY2ggYW4gYXBwbGV0IG5hbWVkICdmaWxlJyBmaXJzdCAqLworaW50IEZBU1RfRlVOQyBCQl9FWEVDVlAoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqY29uc3QgYXJndltdKQoreworCWlmIChmaW5kX2FwcGxldF9ieV9uYW1lKGZpbGUpID49IDApCisJCWV4ZWN2cChiYl9idXN5Ym94X2V4ZWNfcGF0aCwgYXJndik7CisJcmV0dXJuIGV4ZWN2cChmaWxlLCBhcmd2KTsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIEJCX0VYRUNWUF9vcl9kaWUoY2hhciAqKmFyZ3YpCit7CisJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCS8qIFNVU3YzLW1hbmRhdGVkIGV4aXQgY29kZXMgKi8KKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAoZXJybm8gPT0gRU5PRU5UKSA/IDEyNyA6IDEyNjsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZmNsb3NlX25vbnN0ZGluLmMgYi9saWJiYi9mY2xvc2Vfbm9uc3RkaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U5ZDViCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZmNsb3NlX25vbnN0ZGluLmMKQEAgLTAsMCArMSwyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmNsb3NlX25vbnN0ZGluIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBIG51bWJlciBvZiBzdGFuZGFyZCB1dGlsaXRpZXMgY2FuIGFjY2VwdCBtdWx0aXBsZSBjb21tYW5kIGxpbmUgYXJncworICogb2YgJy0nIGZvciBzdGRpbiwgYWNjb3JkaW5nIHRvIFNVU3YzLiAgU28gd2UgZW5jYXBzdWxhdGUgdGhlIGNoZWNrCisgKiBoZXJlIHRvIHNhdmUgYSBsaXR0bGUgc3BhY2UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBGQVNUX0ZVTkMgZmNsb3NlX2lmX25vdF9zdGRpbihGSUxFICpmKQoreworCS8qIFNvbWUgbW9yZSBwYXJhbm9pZCBhcHBsZXRzIHdhbnQgZmVycm9yKCkgY2hlY2sgdG9vICovCisJaW50IHIgPSBmZXJyb3IoZik7IC8qIE5COiBkb2VzIE5PVCBzZXQgZXJybm8hICovCisJaWYgKHIpIGVycm5vID0gRUlPOyAvKiBzbyB3ZSdsbCBoZWxwIGl0ICovCisJaWYgKGYgIT0gc3RkaW4pCisJCXJldHVybiAociB8IGZjbG9zZShmKSk7IC8qIGZjbG9zZSBkb2VzIHNldCBlcnJubyBvbiBlcnJvciAqLworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZmZsdXNoX3N0ZG91dF9hbmRfZXhpdC5jIGIvbGliYmIvZmZsdXNoX3N0ZG91dF9hbmRfZXhpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDVkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0LmMKQEAgLTAsMCArMSwyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQXR0ZW1wdCB0byBmZmx1c2goc3Rkb3V0KSwgYW5kIGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlIGlmIHN0ZG91dCBpcworICogaW4gYW4gZXJyb3Igc3RhdGUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoaW50IHJldHZhbCkKK3sKKwlpZiAoZmZsdXNoKHN0ZG91dCkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfc3RhbmRhcmRfb3V0cHV0KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyAmJiBkaWVfc2xlZXAgPCAwKSB7CisJCS8qIFdlIGFyZSBpbiBOT0ZPUksgYXBwbGV0LiBEbyBub3QgZXhpdCgpIGRpcmVjdGx5LAorCQkgKiBidXQgdXNlIHhmdW5jX2RpZSgpICovCisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IHJldHZhbDsKKwkJeGZ1bmNfZGllKCk7CisJfQorCisJZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZmdldHNfc3RyLmMgYi9saWJiYi9mZ2V0c19zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIxMGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZmdldHNfc3RyLmMKQEAgLTAsMCArMSw4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4KKyAqIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UgYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBjaGFyICp4bWFsbG9jX2ZnZXRzX2ludGVybmFsKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnRlcm1pbmF0aW5nX3N0cmluZywgaW50IGNob3Bfb2ZmLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqbGluZWJ1ZiA9IE5VTEw7CisJY29uc3QgaW50IHRlcm1fbGVuZ3RoID0gc3RybGVuKHRlcm1pbmF0aW5nX3N0cmluZyk7CisJaW50IGVuZF9zdHJpbmdfb2Zmc2V0OworCWludCBsaW5lYnVmc3ogPSAwOworCWludCBpZHggPSAwOworCWludCBjaDsKKwlzaXplX3QgbWF4c3ogPSAqbWF4c3pfcDsKKworCXdoaWxlICgxKSB7CisJCWNoID0gZmdldGMoZmlsZSk7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCWlmIChpZHggPT0gMCkKKwkJCQlyZXR1cm4gbGluZWJ1ZjsgLyogTlVMTCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaWR4ID49IGxpbmVidWZzeikgeworCQkJbGluZWJ1ZnN6ICs9IDIwMDsKKwkJCWxpbmVidWYgPSB4cmVhbGxvYyhsaW5lYnVmLCBsaW5lYnVmc3opOworCQkJaWYgKGlkeCA+PSBtYXhzeikgeworCQkJCWxpbmVidWZbaWR4XSA9IGNoOworCQkJCWlkeCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJbGluZWJ1ZltpZHhdID0gY2g7CisJCWlkeCsrOworCisJCS8qIENoZWNrIGZvciB0ZXJtaW5hdGluZyBzdHJpbmcgKi8KKwkJZW5kX3N0cmluZ19vZmZzZXQgPSBpZHggLSB0ZXJtX2xlbmd0aDsKKwkJaWYgKGVuZF9zdHJpbmdfb2Zmc2V0ID49IDAKKwkJICYmIG1lbWNtcCgmbGluZWJ1ZltlbmRfc3RyaW5nX29mZnNldF0sIHRlcm1pbmF0aW5nX3N0cmluZywgdGVybV9sZW5ndGgpID09IDAKKwkJKSB7CisJCQlpZiAoY2hvcF9vZmYpCisJCQkJaWR4IC09IHRlcm1fbGVuZ3RoOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogR3Jvdy9zaHJpbmsgKmZpcnN0KiwgdGhlbiBzdG9yZSBOVUwgKi8KKwlsaW5lYnVmID0geHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMSk7CisJbGluZWJ1ZltpZHhdID0gJ1wwJzsKKwkqbWF4c3pfcCA9IGlkeDsKKwlyZXR1cm4gbGluZWJ1ZjsKK30KKworLyogUmVhZCB1cCB0byBURVJNSU5BVElOR19TVFJJTkcgZnJvbSBGSUxFIGFuZCByZXR1cm4gaXQsCisgKiBpbmNsdWRpbmcgdGVybWluYXRpbmcgc3RyaW5nLgorICogTm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGNhbiBiZSByZXR1cm5lZCBpZiBFT0YgaXMgcmVhY2hlZC4KKyAqIFJldHVybiBOVUxMIGlmIEVPRiBpcyByZWFjaGVkIGltbWVkaWF0ZWx5LiAgKi8KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX2ZnZXRzX3N0cihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcpCit7CisJc2l6ZV90IG1heHN6ID0gSU5UX01BWCAtIDQwOTU7CisJcmV0dXJuIHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgdGVybWluYXRpbmdfc3RyaW5nLCAwLCAmbWF4c3opOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0c19zdHJfbGVuKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnRlcm1pbmF0aW5nX3N0cmluZywgc2l6ZV90ICptYXhzel9wKQoreworCXNpemVfdCBtYXhzejsKKworCWlmICghbWF4c3pfcCkgeworCQltYXhzeiA9IElOVF9NQVggLSA0MDk1OworCQltYXhzel9wID0gJm1heHN6OworCX0KKwlyZXR1cm4geG1hbGxvY19mZ2V0c19pbnRlcm5hbChmaWxlLCB0ZXJtaW5hdGluZ19zdHJpbmcsIDAsIG1heHN6X3ApOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZV9zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKQoreworCXNpemVfdCBtYXhzeiA9IElOVF9NQVggLSA0MDk1OworCXJldHVybiB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsIHRlcm1pbmF0aW5nX3N0cmluZywgMSwgJm1heHN6KTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2ZpbmRfbW91bnRfcG9pbnQuYyBiL2xpYmJiL2ZpbmRfbW91bnRfcG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYzN2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZmluZF9tb3VudF9wb2ludC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bW50ZW50Lmg+CisKKy8qCisgKiBHaXZlbiBhIGJsb2NrIGRldmljZSwgZmluZCB0aGUgbW91bnQgdGFibGUgZW50cnkgaWYgdGhhdCBibG9jayBkZXZpY2UKKyAqIGlzIG1vdW50ZWQuCisgKgorICogR2l2ZW4gYW55IG90aGVyIGZpbGUgKG9yIGRpcmVjdG9yeSksIGZpbmQgdGhlIG1vdW50IHRhYmxlIGVudHJ5IGZvciBpdHMKKyAqIGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBtbnRlbnQqIEZBU1RfRlVOQyBmaW5kX21vdW50X3BvaW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdWJkaXJfdG9vKQoreworCXN0cnVjdCBzdGF0IHM7CisJRklMRSAqbXRhYl9mcDsKKwlzdHJ1Y3QgbW50ZW50ICptb3VudEVudHJ5OworCWRldl90IGRldm5vX29mX25hbWU7CisJYm9vbCBibG9ja19kZXY7CisKKwlpZiAoc3RhdChuYW1lLCAmcykgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZub19vZl9uYW1lID0gcy5zdF9kZXY7CisJYmxvY2tfZGV2ID0gMDsKKwlpZiAoU19JU0JMSyhzLnN0X21vZGUpKSB7CisJCWRldm5vX29mX25hbWUgPSBzLnN0X3JkZXY7CisJCWJsb2NrX2RldiA9IDE7CisJfQorCisJbXRhYl9mcCA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKwlpZiAoIW10YWJfZnApCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKChtb3VudEVudHJ5ID0gZ2V0bW50ZW50KG10YWJfZnApKSAhPSBOVUxMKSB7CisJCS8qIHJvb3RmcyBtb3VudCBpbiBMaW51eCAyLjYgZXhpc3RzIGFsd2F5cywKKwkJICogYW5kIGl0IG1ha2VzIHNlbnNlIHRvIGFsd2F5cyBpZ25vcmUgaXQuCisJCSAqIE90aGVyd2lzZSBwZW9wbGUgY2FuJ3QgcmVmZXJlbmNlIHRoZWlyICJyZWFsIiByb290ISAqLworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0tJUF9ST09URlMgJiYgc3RyY21wKG1vdW50RW50cnktPm1udF9mc25hbWUsICJyb290ZnMiKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lLCBtb3VudEVudHJ5LT5tbnRfZGlyKSA9PSAwCisJCSB8fCBzdHJjbXAobmFtZSwgbW91bnRFbnRyeS0+bW50X2ZzbmFtZSkgPT0gMAorCQkpIHsgLyogU3RyaW5nIG1hdGNoLiAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdWJkaXJfdG9vIHx8IGJsb2NrX2RldikpCisJCQljb250aW51ZTsKKworCQkvKiBJcyBkZXZpY2UncyBkZXZfdCA9PSBuYW1lJ3MgZGV2X3Q/ICovCisJCWlmIChzdGF0KG1vdW50RW50cnktPm1udF9mc25hbWUsICZzKSA9PSAwICYmIHMuc3RfcmRldiA9PSBkZXZub19vZl9uYW1lKQorCQkJYnJlYWs7CisJCS8qIE1hdGNoIHRoZSBkaXJlY3RvcnkncyBtb3VudCBwb2ludC4gKi8KKwkJaWYgKHN0YXQobW91bnRFbnRyeS0+bW50X2RpciwgJnMpID09IDAgJiYgcy5zdF9kZXYgPT0gZGV2bm9fb2ZfbmFtZSkKKwkJCWJyZWFrOworCX0KKwllbmRtbnRlbnQobXRhYl9mcCk7CisKKwlyZXR1cm4gbW91bnRFbnRyeTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2ZpbmRfcGlkX2J5X25hbWUuYyBiL2xpYmJiL2ZpbmRfcGlkX2J5X25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjgyM2QwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZmluZF9waWRfYnlfbmFtZS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorSW4gTGludXggd2UgaGF2ZSB0aHJlZSB3YXlzIHRvIGRldGVybWluZSAicHJvY2VzcyBuYW1lIjoKKzEuIC9wcm9jL1BJRC9zdGF0IGhhcyAiLi4uKG5hbWUpLi4uIiwgYW1vbmcgb3RoZXIgdGhpbmdzLiBJdCdzIHNvLWNhbGxlZCAiY29tbSIgZmllbGQuCisyLiAvcHJvYy9QSUQvY21kbGluZSdzIGZpcnN0IE5VTC10ZXJtaW5hdGVkIHN0cmluZy4gSXQncyBhcmd2WzBdIGZyb20gZXhlYyBzeXNjYWxsLgorMy4gL3Byb2MvUElEL2V4ZSBzeW1saW5rLiBQb2ludHMgdG8gdGhlIHJ1bm5pbmcgZXhlY3V0YWJsZSBmaWxlLgorCitrZXJuZWwgdGhyZWFkczoKKyBjb21tOiB0aHJlYWQgbmFtZQorIGNtZGxpbmU6IGVtcHR5CisgZXhlOiA8cmVhZGxpbmsgZmFpbHM+CisKK2V4ZWN1dGFibGUKKyBjb21tOiBmaXJzdCAxNSBjaGFycyBvZiBiYXNlIG5hbWUKKyAoaWYgZXhlY3V0YWJsZSBpcyBhIHN5bWxpbmssIHRoZW4gZmlyc3QgMTUgY2hhcnMgb2Ygc3ltbGluayBuYW1lIGFyZSB1c2VkKQorIGNtZGxpbmU6IGFyZ3ZbMF0gZnJvbSBleGVjIHN5c2NhbGwKKyBleGU6IHBvaW50cyB0byBleGVjdXRhYmxlIChyZXNvbHZlcyBzeW1saW5rLCB1bmxpa2UgY29tbSkKKworc2NyaXB0IChhbiBleGVjdXRhYmxlIHdpdGggIyEvcGF0aC90by9pbnRlcnByZXRlcik6CisgY29tbTogZmlyc3QgMTUgY2hhcnMgb2Ygc2NyaXB0J3MgYmFzZSBuYW1lIChzeW1saW5rcyBhcmUgbm90IHJlc29sdmVkKQorIGNtZGxpbmU6IC9wYXRoL3RvL2ludGVycHJldGVyIChzeW1saW5rcyBhcmUgbm90IHJlc29sdmVkKQorIChzY3JpcHQgbmFtZSBpcyBpbiBhcmd2WzFdLCBhcmdzIGFyZSBwdXNoZWQgaW50byBhcmd2WzJdIGV0YykKKyBleGU6IHBvaW50cyB0byBpbnRlcnByZXRlcidzIGV4ZWN1dGFibGUgKHN5bWxpbmtzIGFyZSByZXNvbHZlZCkKKworSWYgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUz15IChhbmQgbW9yZSBzbyBpZiBGRUFUVVJFX1NIX1NUQU5EQUxPTkU9eSksCitzb21lIGNvbW1hbmRzIHN0YXJ0ZWQgZnJvbSBidXN5Ym94IHNoZWxsLCB4YXJncyBvciBmaW5kIGFyZSBzdGFydGVkIGJ5CitleGVjWFhYKCIvcHJvYy9zZWxmL2V4ZSIsIGFwcGxldF9uYW1lLCBwYXJhbXMuLi4uKQorYW5kIHRoZXJlZm9yZSBjb21tIGZpZWxkIGNvbnRhaW5zICJleGUiLgorKi8KKworc3RhdGljIGludCBjb21tX21hdGNoKHByb2Nwc19zdGF0dXNfdCAqcCwgY29uc3QgY2hhciAqcHJvY05hbWUpCit7CisJaW50IGFyZ3YxaWR4OworCWNvbnN0IGNoYXIgKmFyZ3YxOworCisJaWYgKHN0cm5jbXAocC0+Y29tbSwgcHJvY05hbWUsIDE1KSAhPSAwKQorCQlyZXR1cm4gMDsgLyogY29tbSBkb2VzIG5vdCBtYXRjaCAqLworCisJLyogSW4gTGludXgsIGlmIGNvbW0gaXMgMTUgY2hhcnMsIGl0IGlzIHRydW5jYXRlZC4KKwkgKiAob3IgbWF5YmUgdGhlIG5hbWUgd2FzIGV4YWN0bHkgMTUgY2hhcnMsIGJ1dCB0aGVyZSBpcworCSAqIG5vIHdheSB0byBrbm93IHRoYXQpICovCisJaWYgKHAtPmNvbW1bMTRdID09ICdcMCcpCisJCXJldHVybiAxOyAvKiBjb21tIGlzIG5vdCB0cnVuY2F0ZWQgLSBtYXRjaGVzICovCisKKwkvKiBjb21tIGlzIHRydW5jYXRlZCwgYnV0IGZpcnN0IDE1IGNoYXJzIG1hdGNoLgorCSAqIFRoaXMgY2FuIGJlIGNyYXppbHlfbG9uZ19zY3JpcHRfbmFtZS5zaCEKKwkgKiBUaGUgdGVsbHRhbGUgc2lnbiBpcyBiYXNlbmFtZShhcmd2WzFdKSA9PSBwcm9jTmFtZSAqLworCisJaWYgKCFwLT5hcmd2MCkKKwkJcmV0dXJuIDA7CisKKwlhcmd2MWlkeCA9IHN0cmxlbihwLT5hcmd2MCkgKyAxOworCWlmIChhcmd2MWlkeCA+PSBwLT5hcmd2X2xlbikKKwkJcmV0dXJuIDA7CisJYXJndjEgPSBwLT5hcmd2MCArIGFyZ3YxaWR4OworCisJaWYgKHN0cmNtcChiYl9iYXNlbmFtZShhcmd2MSksIHByb2NOYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBUaGlzIGZpbmRzIHRoZSBwaWQgb2YgdGhlIHNwZWNpZmllZCBwcm9jZXNzLgorICogQ3VycmVudGx5LCBpdCdzIGltcGxlbWVudGVkIGJ5IHJ1bW1hZ2luZyB0aHJvdWdoCisgKiB0aGUgcHJvYyBmaWxlc3lzdGVtLgorICoKKyAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtYXRjaGluZyBQSURzCisgKiBJdCBpcyB0aGUgY2FsbGVyJ3MgZHV0eSB0byBmcmVlIHRoZSByZXR1cm5lZCBwaWRsaXN0LgorICoKKyAqIE1vZGlmaWVkIGJ5IFZsYWRpbWlyIE9sZXluaWsgZm9yIHVzZSB3aXRoIGxpYmJiL3Byb2Nwcy5jCisgKi8KK3BpZF90KiBGQVNUX0ZVTkMgZmluZF9waWRfYnlfbmFtZShjb25zdCBjaGFyICpwcm9jTmFtZSkKK3sKKwlwaWRfdCogcGlkTGlzdDsKKwlpbnQgaSA9IDA7CisJcHJvY3BzX3N0YXR1c190KiBwID0gTlVMTDsKKworCXBpZExpc3QgPSB4emFsbG9jKHNpemVvZigqcGlkTGlzdCkpOworCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIFBTU0NBTl9QSUR8UFNTQ0FOX0NPTU18UFNTQ0FOX0FSR1ZOfFBTU0NBTl9FWEUpKSkgeworCQlpZiAoY29tbV9tYXRjaChwLCBwcm9jTmFtZSkKKwkJLyogb3Igd2UgcmVxdWlyZSBhcmd2MCB0byBtYXRjaCAoZXNzZW50aWFsIGZvciBtYXRjaGluZyByZWV4ZWNlZCAvcHJvYy9zZWxmL2V4ZSkqLworCQkgfHwgKHAtPmFyZ3YwICYmIHN0cmNtcChiYl9iYXNlbmFtZShwLT5hcmd2MCksIHByb2NOYW1lKSA9PSAwKQorCQkvKiBvciB3ZSByZXF1aXJlIC9wcm9jL1BJRC9leGUgbGluayB0byBtYXRjaCAqLworCQkgfHwgKHAtPmV4ZSAmJiBzdHJjbXAoYmJfYmFzZW5hbWUocC0+ZXhlKSwgcHJvY05hbWUpID09IDApCisJCSkgeworCQkJcGlkTGlzdCA9IHhyZWFsbG9jX3ZlY3RvcihwaWRMaXN0LCAyLCBpKTsKKwkJCXBpZExpc3RbaSsrXSA9IHAtPnBpZDsKKwkJfQorCX0KKworCXBpZExpc3RbaV0gPSAwOworCXJldHVybiBwaWRMaXN0OworfQorCitwaWRfdCogRkFTVF9GVU5DIHBpZGxpc3RfcmV2ZXJzZShwaWRfdCAqcGlkTGlzdCkKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKHBpZExpc3RbaV0pCisJCWkrKzsKKwlpZiAoLS1pID49IDApIHsKKwkJcGlkX3QgazsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGkgPiBqOyBpLS0sIGorKykgeworCQkJayA9IHBpZExpc3RbaV07CisJCQlwaWRMaXN0W2ldID0gcGlkTGlzdFtqXTsKKwkJCXBpZExpc3Rbal0gPSBrOworCQl9CisJfQorCXJldHVybiBwaWRMaXN0OworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZmluZF9yb290X2RldmljZS5jIGIvbGliYmIvZmluZF9yb290X2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzZjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9maW5kX3Jvb3RfZGV2aWNlLmMKQEAgLTAsMCArMSw3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRmluZCBibG9jayBkZXZpY2UgL2Rldi9YWFggd2hpY2ggY29udGFpbnMgc3BlY2lmaWVkIGZpbGUKKyAqIFdlIGhhbmRsZSAvZGV2L2Rpci9kaXIvZGlyIHRvbywgYXQgYSBjb3N0IG9mIH44MCBtb3JlIGJ5dGVzIGNvZGUgKi8KKworLyogRG8gbm90IHJlYWxsb2NhdGUgYWxsIHRoaXMgc3R1ZmYgb24gZWFjaCByZWN1cnNpb24gKi8KK2VudW0geyBERVZOQU1FX01BWCA9IDI1NiB9Oworc3RydWN0IGFyZW5hIHsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlkZXZfdCBkZXY7CisJLyogV2FzIFBBVEhfTUFYLCBidXQgd2UgcmVjdXJzZSBfL2Rldl8uIFdlIGNhbiBhc3N1bWUKKwkgKiBwZW9wbGUgYXJlIG5vdCBjcmF6eSBlbm91Z2ggdG8gaGF2ZSBtZWdhLWRlZXAgdHJlZSB0aGVyZSAqLworCWNoYXIgZGV2cGF0aFtERVZOQU1FX01BWF07Cit9OworCitzdGF0aWMgY2hhciAqZmluZF9ibG9ja19kZXZpY2VfaW5fZGlyKHN0cnVjdCBhcmVuYSAqYXApCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJY2hhciAqcmV0cGF0aCA9IE5VTEw7CisJaW50IGxlbiwgcmVtOworCisJbGVuID0gc3RybGVuKGFwLT5kZXZwYXRoKTsKKwlyZW0gPSBERVZOQU1FX01BWC0yIC0gbGVuOworCWlmIChyZW0gPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkaXIgPSBvcGVuZGlyKGFwLT5kZXZwYXRoKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuIE5VTEw7CisKKwlhcC0+ZGV2cGF0aFtsZW4rK10gPSAnLyc7CisKKwl3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCXNhZmVfc3RybmNweShhcC0+ZGV2cGF0aCArIGxlbiwgZW50cnktPmRfbmFtZSwgcmVtKTsKKwkJLyogbHN0YXQ6IGRvIG5vdCBmb2xsb3cgbGlua3MgKi8KKwkJaWYgKGxzdGF0KGFwLT5kZXZwYXRoLCAmYXAtPnN0KSAhPSAwKQorCQkJY29udGludWU7CisJCWlmIChTX0lTQkxLKGFwLT5zdC5zdF9tb2RlKSAmJiBhcC0+c3Quc3RfcmRldiA9PSBhcC0+ZGV2KSB7CisJCQlyZXRwYXRoID0geHN0cmR1cChhcC0+ZGV2cGF0aCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoU19JU0RJUihhcC0+c3Quc3RfbW9kZSkpIHsKKwkJCS8qIERvIG5vdCByZWN1cnNlIGZvciAnLicgYW5kICcuLicgKi8KKwkJCWlmIChET1RfT1JfRE9URE9UKGVudHJ5LT5kX25hbWUpKQorCQkJCWNvbnRpbnVlOworCQkJcmV0cGF0aCA9IGZpbmRfYmxvY2tfZGV2aWNlX2luX2RpcihhcCk7CisJCQlpZiAocmV0cGF0aCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwljbG9zZWRpcihkaXIpOworCisJcmV0dXJuIHJldHBhdGg7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBmaW5kX2Jsb2NrX2RldmljZShjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBhcmVuYSBhOworCisJaWYgKHN0YXQocGF0aCwgJmEuc3QpICE9IDApCisJCXJldHVybiBOVUxMOworCWEuZGV2ID0gU19JU0JMSyhhLnN0LnN0X21vZGUpID8gYS5zdC5zdF9yZGV2IDogYS5zdC5zdF9kZXY7CisJc3RyY3B5KGEuZGV2cGF0aCwgIi9kZXYiKTsKKwlyZXR1cm4gZmluZF9ibG9ja19kZXZpY2VfaW5fZGlyKCZhKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2Z1bGxfd3JpdGUuYyBiL2xpYmJiL2Z1bGxfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdmYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZnVsbF93cml0ZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qCisgKiBXcml0ZSBhbGwgb2YgdGhlIHN1cHBsaWVkIGJ1ZmZlciBvdXQgdG8gYSBmaWxlLgorICogVGhpcyBkb2VzIG11bHRpcGxlIHdyaXRlcyBhcyBuZWNlc3NhcnkuCisgKiBSZXR1cm5zIHRoZSBhbW91bnQgd3JpdHRlbiwgb3IgLTEgb24gYW4gZXJyb3IuCisgKi8KK3NzaXplX3QgRkFTVF9GVU5DIGZ1bGxfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBjYzsKKwlzc2l6ZV90IHRvdGFsOworCisJdG90YWwgPSAwOworCisJd2hpbGUgKGxlbikgeworCQljYyA9IHNhZmVfd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKworCQlpZiAoY2MgPCAwKSB7CisJCQlpZiAodG90YWwpIHsKKwkJCQkvKiB3ZSBhbHJlYWR5IHdyb3RlIHNvbWUhICovCisJCQkJLyogdXNlciBjYW4gZG8gYW5vdGhlciB3cml0ZSB0byBrbm93IHRoZSBlcnJvciBjb2RlICovCisJCQkJcmV0dXJuIHRvdGFsOworCQkJfQorCQkJcmV0dXJuIGNjOyAgLyogd3JpdGUoKSByZXR1cm5zIC0xIG9uIGZhaWx1cmUuICovCisJCX0KKworCQl0b3RhbCArPSBjYzsKKwkJYnVmID0gKChjb25zdCBjaGFyICopYnVmKSArIGNjOworCQlsZW4gLT0gY2M7CisJfQorCisJcmV0dXJuIHRvdGFsOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZ2V0X2NvbnNvbGUuYyBiL2xpYmJiL2dldF9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2NDA3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldF9jb25zb2xlLmMKQEAgLTAsMCArMSw4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4gIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UKKyAqIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGcm9tIDxsaW51eC9rZC5oPiAqLworZW51bSB7IEtER0tCVFlQRSA9IDB4NEIzMyB9OyAgLyogZ2V0IGtleWJvYXJkIHR5cGUgKi8KKworc3RhdGljIGludCBvcGVuX2FfY29uc29sZShjb25zdCBjaGFyICpmbmFtKQoreworCWludCBmZDsKKworCS8qIHRyeSByZWFkLXdyaXRlICovCisJZmQgPSBvcGVuKGZuYW0sIE9fUkRXUik7CisKKwkvKiBpZiBmYWlsZWQsIHRyeSByZWFkLW9ubHkgKi8KKwlpZiAoZmQgPCAwICYmIGVycm5vID09IEVBQ0NFUykKKwkJZmQgPSBvcGVuKGZuYW0sIE9fUkRPTkxZKTsKKworCS8qIGlmIGZhaWxlZCwgdHJ5IHdyaXRlLW9ubHkgKi8KKwlpZiAoZmQgPCAwICYmIGVycm5vID09IEVBQ0NFUykKKwkJZmQgPSBvcGVuKGZuYW0sIE9fV1JPTkxZKTsKKworCXJldHVybiBmZDsKK30KKworLyoKKyAqIEdldCBhbiBmZCBmb3IgdXNlIHdpdGgga2JkL2NvbnNvbGUgaW9jdGxzLgorICogV2UgdHJ5IHNldmVyYWwgdGhpbmdzIGJlY2F1c2Ugb3BlbmluZyAvZGV2L2NvbnNvbGUgd2lsbCBmYWlsCisgKiBpZiBzb21lb25lIGVsc2UgdXNlZCBYICh3aGljaCBkb2VzIGEgY2hvd24gb24gL2Rldi9jb25zb2xlKS4KKyAqLworaW50IEZBU1RfRlVOQyBnZXRfY29uc29sZV9mZF9vcl9kaWUodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29uc29sZV9uYW1lc1tdID0geworCQlERVZfQ09OU09MRSwgQ1VSUkVOVF9WQywgQ1VSUkVOVF9UVFkKKwl9OworCisJaW50IGZkOworCisJZm9yIChmZCA9IDI7IGZkID49IDA7IGZkLS0pIHsKKwkJaW50IGZkNG5hbWU7CisJCWludCBjaG9pY2VfZmQ7CisJCWNoYXIgYXJnOworCisJCWZkNG5hbWUgPSBvcGVuX2FfY29uc29sZShjb25zb2xlX25hbWVzW2ZkXSk7CisgY2hrX3N0ZDoKKwkJY2hvaWNlX2ZkID0gKGZkNG5hbWUgPj0gMCA/IGZkNG5hbWUgOiBmZCk7CisKKwkJYXJnID0gMDsKKwkJaWYgKGlvY3RsKGNob2ljZV9mZCwgS0RHS0JUWVBFLCAmYXJnKSA9PSAwKQorCQkJcmV0dXJuIGNob2ljZV9mZDsKKwkJaWYgKGZkNG5hbWUgPj0gMCkgeworCQkJY2xvc2UoZmQ0bmFtZSk7CisJCQlmZDRuYW1lID0gLTE7CisJCQlnb3RvIGNoa19zdGQ7CisJCX0KKwl9CisKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiBjb25zb2xlIik7CisJLypyZXR1cm4gZmQ7IC0gdG90YWwgZmFpbHVyZSAqLworfQorCisvKiBGcm9tIDxsaW51eC92dC5oPiAqLworZW51bSB7CisJVlRfQUNUSVZBVEUgPSAweDU2MDYsICAgLyogbWFrZSB2dCBhY3RpdmUgKi8KKwlWVF9XQUlUQUNUSVZFID0gMHg1NjA3ICAvKiB3YWl0IGZvciB2dCBhY3RpdmUgKi8KK307CisKK3ZvaWQgRkFTVF9GVU5DIGNvbnNvbGVfbWFrZV9hY3RpdmUoaW50IGZkLCBjb25zdCBpbnQgdnRfbnVtKQoreworCXhpb2N0bChmZCwgVlRfQUNUSVZBVEUsICh2b2lkICopKHB0cmRpZmZfdCl2dF9udW0pOworCXhpb2N0bChmZCwgVlRfV0FJVEFDVElWRSwgKHZvaWQgKikocHRyZGlmZl90KXZ0X251bSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9nZXRfY3B1X2NvdW50LmMgYi9saWJiYi9nZXRfY3B1X2NvdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0NjhhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldF9jcHVfY291bnQuYwpAQCAtMCwwICsxLDQ3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBGYWN0b3JlZCBvdXQgb2YgbXBzdGF0L2lvc3RhdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRG9lcyBzdHIgc3RhcnQgd2l0aCAiY3B1Ij8gKi8KK2ludCBGQVNUX0ZVTkMgc3RhcnRzX3dpdGhfY3B1KGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gKChzdHJbMF0gLSAnYycpIHwgKHN0clsxXSAtICdwJykgfCAoc3RyWzJdIC0gJ3UnKSkgPT0gMDsKK30KKworLyoKKyAqIEdldCBudW1iZXIgb2YgcHJvY2Vzc29ycy4gVXNlcyAvcHJvYy9zdGF0LgorICogUmV0dXJuIHZhbHVlIDAgbWVhbnMgb25lIENQVSBhbmQgbm9uIFNNUCBrZXJuZWwuCisgKiBPdGhlcndpc2UgTiBtZWFucyBOIHByb2Nlc3NvcihzKSBhbmQgU01QIGtlcm5lbC4KKyAqLwordW5zaWduZWQgRkFTVF9GVU5DIGdldF9jcHVfY291bnQodm9pZCkKK3sKKwlGSUxFICpmcDsKKwljaGFyIGxpbmVbMjU2XTsKKwlpbnQgcHJvY19uciA9IC0xOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL3N0YXQiKTsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHsKKwkJaWYgKCFzdGFydHNfd2l0aF9jcHUobGluZSkpIHsKKwkJCWlmIChwcm9jX25yID49IDApCisJCQkJYnJlYWs7IC8qIHdlIGFyZSBwYXN0ICJjcHVOLi4uIiBsaW5lcyAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxpbmVbM10gIT0gJyAnKSB7IC8qICJjcHVOIiAqLworCQkJaW50IG51bV9wcm9jOworCQkJaWYgKHNzY2FuZihsaW5lICsgMywgIiV1IiwgJm51bV9wcm9jKSA9PSAxCisJCQkgJiYgbnVtX3Byb2MgPiBwcm9jX25yCisJCQkpIHsKKwkJCQlwcm9jX25yID0gbnVtX3Byb2M7CisJCQl9CisJCX0KKwl9CisKKwlmY2xvc2UoZnApOworCXJldHVybiBwcm9jX25yICsgMTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldF9sYXN0X3BhdGhfY29tcG9uZW50LmMgYi9saWJiYi9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZmRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBiYl9iYXNlbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKmNwID0gc3RycmNocihuYW1lLCAnLycpOworCWlmIChjcCkKKwkJcmV0dXJuIGNwICsgMTsKKwlyZXR1cm4gbmFtZTsKK30KKworLyoKKyAqICIvIiAgICAgICAgLT4gIi8iCisgKiAiYWJjIiAgICAgIC0+ICJhYmMiCisgKiAiYWJjL2RlZiIgIC0+ICJkZWYiCisgKiAiYWJjL2RlZi8iIC0+ICIiCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciAqc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CisKKwlpZiAoIXNsYXNoIHx8IChzbGFzaCA9PSBwYXRoICYmICFzbGFzaFsxXSkpCisJCXJldHVybiAoY2hhciopcGF0aDsKKworCXJldHVybiBzbGFzaCArIDE7Cit9CisKKy8qCisgKiAiLyIgICAgICAgIC0+ICIvIgorICogImFiYyIgICAgICAtPiAiYWJjIgorICogImFiYy9kZWYiICAtPiAiZGVmIgorICogImFiYy9kZWYvIiAtPiAiZGVmIiAhIQorICovCitjaGFyKiBGQVNUX0ZVTkMgYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoY2hhciAqcGF0aCkKK3sKKwljaGFyICpzbGFzaCA9IGxhc3RfY2hhcl9pcyhwYXRoLCAnLycpOworCisJaWYgKHNsYXNoKQorCQl3aGlsZSAoKnNsYXNoID09ICcvJyAmJiBzbGFzaCAhPSBwYXRoKQorCQkJKnNsYXNoLS0gPSAnXDAnOworCisJcmV0dXJuIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAocGF0aCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9nZXRfbGluZV9mcm9tX2ZpbGUuYyBiL2xpYmJiL2dldF9saW5lX2Zyb21fZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGRkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9nZXRfbGluZV9mcm9tX2ZpbGUuYwpAQCAtMCwwICsxLDE4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWF0dCBLcmFpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIGJiX2dldF9jaHVua19mcm9tX2ZpbGUoRklMRSAqZmlsZSwgaW50ICplbmQpCit7CisJaW50IGNoOworCXVuc2lnbmVkIGlkeCA9IDA7CisJY2hhciAqbGluZWJ1ZiA9IE5VTEw7CisKKwl3aGlsZSAoKGNoID0gZ2V0YyhmaWxlKSkgIT0gRU9GKSB7CisJCS8qIGdyb3cgdGhlIGxpbmUgYnVmZmVyIGFzIG5lY2Vzc2FyeSAqLworCQlpZiAoIShpZHggJiAweGZmKSkKKwkJCWxpbmVidWYgPSB4cmVhbGxvYyhsaW5lYnVmLCBpZHggKyAweDEwMCk7CisJCWxpbmVidWZbaWR4KytdID0gKGNoYXIpIGNoOworCQlpZiAoY2ggPT0gJ1wwJykKKwkJCWJyZWFrOworCQlpZiAoZW5kICYmIGNoID09ICdcbicpCisJCQlicmVhazsKKwl9CisJaWYgKGVuZCkKKwkJKmVuZCA9IGlkeDsKKwlpZiAobGluZWJ1ZikgeworCQkvLyBodWgsIGRvZXMgZmdldHMgZGlzY2FyZCBwcmlvciBkYXRhIG9uIGVycm9yIGxpa2UgdGhpcz8KKwkJLy8gSSBkb24ndCB0aGluayBzby4uLi4KKwkJLy9pZiAoZmVycm9yKGZpbGUpKSB7CisJCS8vCWZyZWUobGluZWJ1Zik7CisJCS8vCXJldHVybiBOVUxMOworCQkvL30KKwkJbGluZWJ1ZiA9IHhyZWFsbG9jKGxpbmVidWYsIGlkeCArIDEpOworCQlsaW5lYnVmW2lkeF0gPSAnXDAnOworCX0KKwlyZXR1cm4gbGluZWJ1ZjsKK30KKworLyogR2V0IGxpbmUsIGluY2x1ZGluZyB0cmFpbGluZyBcbiBpZiBhbnkgKi8KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX2ZnZXRzKEZJTEUgKmZpbGUpCit7CisJaW50IGk7CisKKwlyZXR1cm4gYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShmaWxlLCAmaSk7Cit9CisvKiBHZXQgbGluZS4gIFJlbW92ZSB0cmFpbGluZyBcbiAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldGxpbmUoRklMRSAqZmlsZSkKK3sKKwlpbnQgaTsKKwljaGFyICpjID0gYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShmaWxlLCAmaSk7CisKKwlpZiAoaSAmJiBjWy0taV0gPT0gJ1xuJykKKwkJY1tpXSA9ICdcMCc7CisKKwlyZXR1cm4gYzsKK30KKworI2lmIDAKKy8qIEdOVWlzbSBnZXRsaW5lKCkgc2hvdWxkIGJlIGZhc3RlciAobm90IHRlc3RlZCkgdGhhbiBhIGxvb3Agd2l0aCBmZ2V0YyAqLworCisvKiBHZXQgbGluZSwgaW5jbHVkaW5nIHRyYWlsaW5nIFxuIGlmIGFueSAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldHMoRklMRSAqZmlsZSkKK3sKKwljaGFyICpyZXNfYnVmID0gTlVMTDsKKwlzaXplX3QgcmVzX3N6OworCisJaWYgKGdldGxpbmUoJnJlc19idWYsICZyZXNfc3osIGZpbGUpID09IC0xKSB7CisJCWZyZWUocmVzX2J1Zik7IC8qIHVjbGliYyBhbGxvY2F0ZXMgYSBidWZmZXIgZXZlbiBvbiBFT0YuIFdURj8gKi8KKwkJcmVzX2J1ZiA9IE5VTEw7CisJfQorLy9UT0RPOiB0cmltbWluZyB0byByZXNfc3o/CisJcmV0dXJuIHJlc19idWY7Cit9CisvKiBHZXQgbGluZS4gIFJlbW92ZSB0cmFpbGluZyBcbiAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldGxpbmUoRklMRSAqZmlsZSkKK3sKKwljaGFyICpyZXNfYnVmID0gTlVMTDsKKwlzaXplX3QgcmVzX3N6OworCisJcmVzX3N6ID0gZ2V0bGluZSgmcmVzX2J1ZiwgJnJlc19zeiwgZmlsZSk7CisKKwlpZiAoKHNzaXplX3QpcmVzX3N6ICE9IC0xKSB7CisJCWlmIChyZXNfYnVmW3Jlc19zeiAtIDFdID09ICdcbicpCisJCQlyZXNfYnVmWy0tcmVzX3N6XSA9ICdcMCc7CisvL1RPRE86IHRyaW1taW5nIHRvIHJlc19zej8KKwl9IGVsc2UgeworCQlmcmVlKHJlc19idWYpOyAvKiB1Y2xpYmMgYWxsb2NhdGVzIGEgYnVmZmVyIGV2ZW4gb24gRU9GLiBXVEY/ICovCisJCXJlc19idWYgPSBOVUxMOworCX0KKwlyZXR1cm4gcmVzX2J1ZjsKK30KKworI2VuZGlmCisKKyNpZiAwCisvKiBGYXN0ZXIgcm91dGluZXMgKH50d2ljZSBhcyBmYXN0KS4gKzE3MCBieXRlcy4gVW51c2VkIGFzIG9mIDIwMDgtMDcuCisgKgorICogTkI6IHRoZXkgc3RvcCBhdCBOVUwgYnl0ZSB0b28uCisgKiBQZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQgaGVyZS4gVGhpbmsgImdyZXAgNTBnaWdhYnl0ZV9maWxlIi4uLgorICogSXJvbmljYWxseSwgZ3JlcCBjYW4ndCB1c2UgaXQgYmVjYXVzZSBvZiBOVUwgaXNzdWUuCisgKiBXZSBzb3JlbHkgbmVlZCBDIGxpYiB0byBwcm92aWRlIGZnZXRzIHdoaWNoIHJlcG9ydHMgc2l6ZSEKKyAqCisgKiBVcGRhdGU6CisgKiBBY3R1YWxseSwgdWNsaWJjIGFuZCBnbGliYyBoYXZlIGl0LiBtYW4gZ2V0bGluZS4gSXQncyBHTlVpc20sCisgKiAgIGJ1dCB2ZXJ5IHVzZWZ1bCBvbmUgKGlmIGl0J3MgYXMgZmFzdCBhcyB0aGlzIGNvZGUpLgorICogVE9ETzoKKyAqIC0gY3VycmVudGx5LCBzZWQgYW5kIHNvcnQgdXNlIGJiX2dldF9jaHVua19mcm9tX2ZpbGUgYW5kIGhlYXZpbHkKKyAqICAgZGVwZW5kIG9uIGl0cyAic3RvcCBvbiBcbiBvciBcMCIgYmVoYXZpb3IsIGFuZCBTVElMTCB0aGV5IGZhaWwKKyAqICAgdG8gaGFuZGxlIGFsbCBjYXNlcyB3aXRoIGVtYmVkZGVkIE5VTHMgY29ycmVjdGx5LiBTbzoKKyAqIC0gYXVkaXQgc2VkIGFuZCBzb3J0OyBjb252ZXJ0IHRoZW0gdG8gZ2V0bGluZSBGSVJTVC4KKyAqIC0gVEhFTiBkaXRjaCBiYl9nZXRfY2h1bmtfZnJvbV9maWxlLCByZXBsYWNlIGl0IHdpdGggZ2V0bGluZS4KKyAqIC0gcHJvdmlkZSBnZXRsaW5lIGltcGxlbWVudGF0aW9uIGZvciBub24tR05VIHN5c3RlbXMuCisgKi8KKworc3RhdGljIGNoYXIqIHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoRklMRSAqZmlsZSwgaW50ICpzaXplcCkKK3sKKwlpbnQgbGVuOworCWludCBpZHggPSAwOworCWNoYXIgKmxpbmVidWYgPSBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqcjsKKworCQlsaW5lYnVmID0geHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMHgxMDApOworCQlyID0gZmdldHMoJmxpbmVidWZbaWR4XSwgMHgxMDAsIGZpbGUpOworCQlpZiAoIXIpIHsKKwkJCS8qIG5lZWQgdG8gdGVybWluYXRlIGluIGNhc2UgdGhpcyBpcyBlcnJvcgorCQkJICogKEVPRiBwdXRzIE5VTCBpdHNlbGYpICovCisJCQlsaW5lYnVmW2lkeF0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwkJLyogc3R1cGlkLiBmZ2V0cyBrbm93cyB0aGUgbGVuLCBpdCBzaG91bGQgcmVwb3J0IGl0IHNvbWVob3cgKi8KKwkJbGVuID0gc3RybGVuKCZsaW5lYnVmW2lkeF0pOworCQlpZHggKz0gbGVuOworCQlpZiAobGVuICE9IDB4ZmYgfHwgbGluZWJ1ZltpZHggLSAxXSA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCSpzaXplcCA9IGlkeDsKKwlpZiAoaWR4KSB7CisJCS8qIHhyZWFsbG9jKGxpbmVidWYsIGlkeCArIDEpIGlzIHVwIHRvIGNhbGxlciAqLworCQlyZXR1cm4gbGluZWJ1ZjsKKwl9CisJZnJlZShsaW5lYnVmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogR2V0IGxpbmUsIHJlbW92ZSB0cmFpbGluZyBcbiAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldGxpbmVfZmFzdChGSUxFICpmaWxlKQoreworCWludCBzejsKKwljaGFyICpyID0geG1hbGxvY19mZ2V0c19pbnRlcm5hbChmaWxlLCAmc3opOworCWlmIChyICYmIHJbc3ogLSAxXSA9PSAnXG4nKQorCQlyWy0tc3pdID0gJ1wwJzsKKwlyZXR1cm4gcjsgLyogbm90IHhyZWFsbG9jKHIsIHN6ICsgMSkhICovCit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX2ZnZXRzKEZJTEUgKmZpbGUpCit7CisJaW50IHN6OworCXJldHVybiB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsICZzeik7Cit9CisKKy8qIEdldCBsaW5lLCByZW1vdmUgdHJhaWxpbmcgXG4gKi8KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX2ZnZXRsaW5lKEZJTEUgKmZpbGUpCit7CisJaW50IHN6OworCWNoYXIgKnIgPSB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsICZzeik7CisJaWYgKCFyKQorCQlyZXR1cm4gcjsKKwlpZiAocltzeiAtIDFdID09ICdcbicpCisJCXJbLS1zel0gPSAnXDAnOworCXJldHVybiB4cmVhbGxvYyhyLCBzeiArIDEpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9nZXRfc2hlbGxfbmFtZS5jIGIvbGliYmIvZ2V0X3NoZWxsX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTMwYWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZ2V0X3NoZWxsX25hbWUuYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEsIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWIteSArPSBnZXRfc2hlbGxfbmFtZS5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitjb25zdCBjaGFyICpnZXRfc2hlbGxfbmFtZSh2b2lkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNoYXIgKnNoZWxsOworCisJc2hlbGwgPSBnZXRlbnYoIlNIRUxMIik7CisJaWYgKHNoZWxsICYmIHNoZWxsWzBdKQorCQlyZXR1cm4gc2hlbGw7CisKKwlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwlpZiAocHcgJiYgcHctPnB3X3NoZWxsICYmIHB3LT5wd19zaGVsbFswXSkKKwkJcmV0dXJuIHB3LT5wd19zaGVsbDsKKworCXJldHVybiBERUZBVUxUX1NIRUxMOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZ2V0X3ZvbHNpemUuYyBiL2xpYmJiL2dldF92b2xzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxY2VkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldF92b2xzaXplLmMKQEAgLTAsMCArMSw0OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKwordW9mZl90IEZBU1RfRlVOQyBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoaW50IGZkLAorCQljb25zdCBjaGFyICpvdmVycmlkZSwKKwkJdW5zaWduZWQgb3ZlcnJpZGVfdW5pdHMsCisJCWludCBleHRlbmQpCit7CisJdW9mZl90IHJlc3VsdDsKKworCWlmIChvdmVycmlkZSkgeworCQlyZXN1bHQgPSBYQVRPT0ZGKG92ZXJyaWRlKTsKKwkJaWYgKHJlc3VsdCA+PSAodW9mZl90KShNQVhJTlQob2ZmX3QpKSAvIG92ZXJyaWRlX3VuaXRzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImltYWdlIHNpemUgaXMgdG9vIGJpZyIpOworCQlyZXN1bHQgKj0gb3ZlcnJpZGVfdW5pdHM7CisJCS8qIHNlZWsgcGFzdCBlbmQgZmFpbHMgb24gYmxvY2sgZGV2aWNlcyBidXQgd29ya3Mgb24gZmlsZXMgKi8KKwkJaWYgKGxzZWVrKGZkLCByZXN1bHQgLSAxLCBTRUVLX1NFVCkgIT0gKG9mZl90KS0xKSB7CisJCQlpZiAoZXh0ZW5kKQorCQkJCXh3cml0ZShmZCwgIiIsIDEpOyAvKiBmaWxlIGdyb3dzIGlmIG5lZWRlZCAqLworCQl9CisJCS8vZWxzZSB7CisJCS8vCWJiX2Vycm9yX21zZygid2FybmluZywgYmxvY2sgZGV2aWNlIGlzIHNtYWxsZXIiKTsKKwkJLy99CisJfSBlbHNlIHsKKwkJLyogbW9yZSBwb3J0YWJsZSB0aGFuIEJMS0dFVFNJWkVbNjRdICovCisJCXJlc3VsdCA9IHhsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCX0KKworCXhsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCisJLyogUHJldmVudCB0aGluZ3MgbGlrZSB0aGlzOgorCSAqICQgZGQgaWY9L2Rldi96ZXJvIG9mPWZvbyBjb3VudD0xIGJzPTEwMjQKKwkgKiAkIG1rc3dhcCBmb28KKwkgKiBTZXR0aW5nIHVwIHN3YXBzcGFjZSB2ZXJzaW9uIDEsIHNpemUgPSAxODQ0Njc0NDA3MzcwOTU0ODU0NCBieXRlcworCSAqCisJICogUGlja2VkIDE2ayBhcmJpdHJhcmlseTogKi8KKwlpZiAocmVzdWx0IDwgMTYqMTAyNCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImltYWdlIGlzIHRvbyBzbWFsbCIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldG9wdDMyLmMgYi9saWJiYi9nZXRvcHQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTgzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9nZXRvcHQzMi5jCkBAIC0wLDAgKzEsNjE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bml2ZXJzYWwgZ2V0b3B0MzIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgVmxhZGltaXIgT2xleW5payAgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZiBFTkFCTEVfTE9OR19PUFRTIHx8IEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisjIGluY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogICAgICBEb2N1bWVudGF0aW9uCisKK3VpbnQzMl90CitnZXRvcHQzMihjaGFyICoqYXJndiwgY29uc3QgY2hhciAqYXBwbGV0X29wdHMsIC4uLikKKworICAgICAgICBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgbXVzdCBiZSBkZWNsYXJlZCBpbiBjb25zdCBjaGFyCisgICAgICAgICphcHBsZXRfb3B0cyBhcyBhIHN0cmluZyBvZiBjaGFycywgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAicm51ZyIpOworCisgICAgICAgIElmIG9uZSBvZiB0aGUgZ2l2ZW4gb3B0aW9ucyBpcyBmb3VuZCwgYSBmbGFnIHZhbHVlIGlzIGFkZGVkIHRvCisgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgKGFuIHVuc2lnbmVkIGxvbmcpLgorCisgICAgICAgIFRoZSBmbGFnIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyIGluCisgICAgICAgIGFwcGxldF9vcHRzIHN0cmluZy4gIEZvciBleGFtcGxlLCBpbiB0aGUgYWJvdmUgY2FzZToKKworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJybnVnIik7CisKKyAgICAgICAgInIiIHdpbGwgYWRkIDEgICAgKGJpdCAwKQorICAgICAgICAibiIgd2lsbCBhZGQgMiAgICAoYml0IDEpCisgICAgICAgICJ1IiB3aWxsIGFkZCA0ICAgIChiaXQgMikKKyAgICAgICAgImciIHdpbGwgYWRkIDggICAgKGJpdCAzKQorCisgICAgICAgIGFuZCBzbyBvbi4gIFlvdSBjYW4gYWxzbyBsb29rIGF0IHRoZSByZXR1cm4gdmFsdWUgYXMgYSBiaXQKKyAgICAgICAgZmllbGQgYW5kIGVhY2ggb3B0aW9uIHNldHMgb25lIGJpdC4KKworICAgICAgICBPbiBleGl0LCBnbG9iYWwgdmFyaWFibGUgb3B0aW5kIGlzIHNldCBzbyB0aGF0IGlmIHlvdQorICAgICAgICB3aWxsIGRvIGFyZ2MgLT0gb3B0aW5kOyBhcmd2ICs9IG9wdGluZDsgdGhlbgorICAgICAgICBhcmdjIHdpbGwgYmUgZXF1YWwgdG8gbnVtYmVyIG9mIHJlbWFpbmluZyBub24tb3B0aW9uCisgICAgICAgIGFyZ3VtZW50cywgZmlyc3Qgb25lIHdvdWxkIGJlIGluIGFyZ3ZbMF0sIG5leHQgaW4gYXJndlsxXSBhbmQgc28gb24KKyAgICAgICAgKG9wdGlvbnMgYW5kIHRoZWlyIHBhcmFtZXRlcnMgd2lsbCBiZSBtb3ZlZCBpbnRvIGFyZ3ZbXQorICAgICAgICBwb3NpdGlvbnMgcHJpb3IgdG8gYXJndltvcHRpbmRdKS4KKworICI6IiAgICBJZiBvbmUgb2YgdGhlIG9wdGlvbnMgcmVxdWlyZXMgYW4gYXJndW1lbnQsIHRoZW4gYWRkIGEgIjoiCisgICAgICAgIGFmdGVyIHRoZSBjaGFyIGluIGFwcGxldF9vcHRzIGFuZCBwcm92aWRlIGEgcG9pbnRlciB0byBzdG9yZQorICAgICAgICB0aGUgYXJndW1lbnQuICBGb3IgZXhhbXBsZToKKworICAgICAgICBjaGFyICpwb2ludGVyX3RvX2FyZ19mb3JfYTsKKyAgICAgICAgY2hhciAqcG9pbnRlcl90b19hcmdfZm9yX2I7CisgICAgICAgIGNoYXIgKnBvaW50ZXJfdG9fYXJnX2Zvcl9jOworICAgICAgICBjaGFyICpwb2ludGVyX3RvX2FyZ19mb3JfZDsKKworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJhOmI6YzpkOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRlcl90b19hcmdfZm9yX2EsICZwb2ludGVyX3RvX2FyZ19mb3JfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyX3RvX2FyZ19mb3JfYywgJnBvaW50ZXJfdG9fYXJnX2Zvcl9kKTsKKworICAgICAgICBUaGUgdHlwZSBvZiB0aGUgcG9pbnRlciAoY2hhciogb3IgbGxpc3RfdCopIG1heSBiZSBjb250cm9sbGVkCisgICAgICAgIGJ5IHRoZSAiOjoiIHNwZWNpYWwgc2VwYXJhdG9yIHRoYXQgaXMgc2V0IGluIHRoZSBleHRlcm5hbCBzdHJpbmcKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgKHNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvKS4KKworICI6OiIgICBJZiBvcHRpb24gY2FuIGhhdmUgYW4gKm9wdGlvbmFsKiBhcmd1bWVudCwgdGhlbiBhZGQgYSAiOjoiCisgICAgICAgIGFmdGVyIGl0cyBjaGFyIGluIGFwcGxldF9vcHRzIGFuZCBwcm92aWRlIGEgcG9pbnRlciB0byBzdG9yZQorICAgICAgICB0aGUgYXJndW1lbnQuICBOb3RlIHRoYXQgb3B0aW9uYWwgYXJndW1lbnRzIF9tdXN0XworICAgICAgICBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbjogLW9wYXJhbSwgbm90IC1vIHBhcmFtLgorCisgIisiICAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGFwcGxldF9vcHRzIHN0cmluZyBpcyBhIHBsdXMsCisgICAgICAgIHRoZW4gb3B0aW9uIHByb2Nlc3Npbmcgd2lsbCBzdG9wIGFzIHNvb24gYXMgYSBub24tb3B0aW9uIGlzCisgICAgICAgIGVuY291bnRlcmVkIGluIHRoZSBhcmd2IGFycmF5LiAgVXNlZnVsIGZvciBhcHBsZXRzIGxpa2UgZW52CisgICAgICAgIHdoaWNoIHNob3VsZCBub3QgcHJvY2VzcyBhcmd1bWVudHMgdG8gc3VicHJvZ3JhbXM6CisgICAgICAgIGVudiAtaSBscyAtZCAvCisgICAgICAgIEhlcmUgd2Ugd2FudCBlbnYgdG8gcHJvY2VzcyBqdXN0IHRoZSAnLWknLCBub3QgdGhlICctZCcuCisKKyAiISIgICAgUmVwb3J0IGJhZCBvcHRpb24sIG1pc3NpbmcgcmVxdWlyZWQgb3B0aW9ucywKKyAgICAgICAgaW5jb25zaXN0ZW50IG9wdGlvbnMgd2l0aCBhbGwtb25lcyByZXR1cm4gdmFsdWUgKGluc3RlYWQgb2YgYWJvcnQpLgorCitjb25zdCBjaGFyICphcHBsZXRfbG9uZ19vcHRpb25zCisKKyAgICAgICAgVGhpcyBzdHJ1Y3QgYWxsb3dzIHlvdSB0byBkZWZpbmUgbG9uZyBvcHRpb25zOgorCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGFwcGxldF9sb25nb3B0c1tdIEFMSUdOMSA9CisgICAgICAgICAgICAgICAgLy8ibmFtZVwwIiBoYXNfYXJnIHZhbAorICAgICAgICAgICAgICAgICJ2ZXJib3NlXDAiIE5vX2FyZ3VtZW50ICJ2IgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGFwcGxldF9sb25nb3B0czsKKworICAgICAgICBUaGUgbGFzdCBtZW1iZXIgb2Ygc3RydWN0IG9wdGlvbiAodmFsKSB0eXBpY2FsbHkgaXMgc2V0IHRvCisgICAgICAgIG1hdGNoaW5nIHNob3J0IG9wdGlvbiBmcm9tIGFwcGxldF9vcHRzLiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZworICAgICAgICBjaGFyIGluIGFwcGxldF9vcHRzLCB0aGVuOgorICAgICAgICAtIHJldHVybiBiaXQgaGF2ZSBuZXh0IHBvc2l0aW9uIGFmdGVyIHNob3J0IG9wdGlvbnMKKyAgICAgICAgLSBpZiBoYXNfYXJnIGlzIG5vdCAiTm9fYXJndW1lbnQiLCB1c2UgcHRyIGZvciBhcmcgYWxzbworICAgICAgICAtIG9wdF9jb21wbGVtZW50YXJ5IGFmZmVjdHMgaXQgdG9vCisKKyAgICAgICAgTm90ZTogYSBnb29kIGFwcGxldCB3aWxsIG1ha2UgbG9uZyBvcHRpb25zIGNvbmZpZ3VyYWJsZSB2aWEgdGhlCisgICAgICAgIGNvbmZpZyBwcm9jZXNzIGFuZCBub3QgYSByZXF1aXJlZCBmZWF0dXJlLiAgVGhlIGN1cnJlbnQgc3RhbmRhcmQKKyAgICAgICAgaXMgdG8gbmFtZSB0aGUgY29uZmlnIG9wdGlvbiBDT05GSUdfRkVBVFVSRV88YXBwbGV0Pl9MT05HX09QVElPTlMuCisKK2NvbnN0IGNoYXIgKm9wdF9jb21wbGVtZW50YXJ5CisKKyAiOiIgICAgVGhlIGNvbG9uICgiOiIpIGlzIHVzZWQgdG8gc2VwYXJhdGUgZ3JvdXBzIG9mIHR3byBvciBtb3JlIGNoYXJzCisgICAgICAgIGFuZC9vciBncm91cHMgb2YgY2hhcnMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyAoc3RhdGluZyBzb21lCisgICAgICAgIGNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCkuCisKKyAiYWJjIiAgSWYgZ3JvdXBzIG9mIHR3byBvciBtb3JlIGNoYXJzIGFyZSBzcGVjaWZpZWQsIHRoZSBmaXJzdCBjaGFyCisgICAgICAgIGlzIHRoZSBtYWluIG9wdGlvbiBhbmQgdGhlIG90aGVyIGNoYXJzIGFyZSBzZWNvbmRhcnkgb3B0aW9ucy4KKyAgICAgICAgVGhlaXIgZmxhZ3Mgd2lsbCBiZSB0dXJuZWQgb24gaWYgdGhlIG1haW4gb3B0aW9uIGlzIGZvdW5kIGV2ZW4KKyAgICAgICAgaWYgdGhleSBhcmUgbm90IHNwZWNpZmVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJhYmMiOworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJhYmNkIikKKworICAgICAgICBJZiBnZXRvcHQoKSBmaW5kcyAiLWEiIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4KKyAgICAgICAgZ2V0b3B0MzIncyByZXR1cm4gdmFsdWUgd2lsbCBiZSBhcyBpZiAiLWEgLWIgLWMiIHdlcmUKKyAgICAgICAgZm91bmQuCisKKyAid3ciICAgQWRqYWNlbnQgZG91YmxlIG9wdGlvbnMgaGF2ZSBhIGNvdW50ZXIgYXNzb2NpYXRlZCB3aGljaCBpbmRpY2F0ZXMKKyAgICAgICAgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgb3B0aW9uLgorICAgICAgICBGb3IgZXhhbXBsZSB0aGUgcHMgYXBwbGV0IG5lZWRzOgorICAgICAgICBpZiB3IGlzIGdpdmVuIG9uY2UsIEdOVSBwcyBzZXRzIHRoZSB3aWR0aCB0byAxMzIsCisgICAgICAgIGlmIHcgaXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGl0IGlzICJ1bmxpbWl0ZWQiCisKKyAgICAgICAgaW50IHdfY291bnRlciA9IDA7IC8vIG11c3QgYmUgaW5pdGlhbGl6ZWQhCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gInd3IjsKKyAgICAgICAgZ2V0b3B0MzIoYXJndiwgInciLCAmd19jb3VudGVyKTsKKyAgICAgICAgaWYgKHdfY291bnRlcikKKyAgICAgICAgICAgICAgICB3aWR0aCA9ICh3X2NvdW50ZXIgPT0gMSkgPyAxMzIgOiBJTlRfTUFYOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2V0X3Rlcm1pbmFsX3dpZHRoKC4uLiZ3aWR0aC4uLik7CisKKyAgICAgICAgd19jb3VudGVyIGlzIGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyLiBJdCBoYXMgdG8gYmUgcGFzc2VkIHRvCisgICAgICAgIGdldG9wdDMyKCkgYWZ0ZXIgYWxsIG90aGVyIG9wdGlvbiBhcmd1bWVudCBzaW5rcy4KKworICAgICAgICBGb3IgZXhhbXBsZTogYWNjZXB0IG11bHRpcGxlIC12IHRvIGluZGljYXRlIHRoZSBsZXZlbCBvZiB2ZXJib3NpdHkKKyAgICAgICAgYW5kIGZvciBlYWNoIC1iIG9wdGFyZywgYWRkIG9wdGFyZyB0byBteV9iLiBGaW5hbGx5LCBpZiBiIGlzIGdpdmVuLAorICAgICAgICB0dXJuIG9mZiBjIGFuZCB2aWNlIHZlcnNhOgorCisgICAgICAgIGxsaXN0X3QgKm15X2IgPSBOVUxMOworICAgICAgICBpbnQgdmVyYm9zZV9sZXZlbCA9IDA7CisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gInZ2OmI6OmItYzpjLWIiOworICAgICAgICBmID0gZ2V0b3B0MzIoYXJndiwgInZiOmMiLCAmbXlfYiwgJnZlcmJvc2VfbGV2ZWwpOworICAgICAgICBpZiAoZiAmIDIpICAgICAgIC8vIC1jIGFmdGVyIC1iIHVuc2V0cyAtYiBmbGFnCisgICAgICAgICAgICAgICAgd2hpbGUgKG15X2IpIGRvc29tZXRoaW5nX3dpdGgobGxpc3RfcG9wKCZteV9iKSk7CisgICAgICAgIGlmIChteV9iKSAgICAgICAgLy8gYnV0IGxsaXN0IGlzIHN0b3JlZCBpZiAtYiBpcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICBmcmVlX2xsaXN0KG15X2IpOworICAgICAgICBpZiAodmVyYm9zZV9sZXZlbCkgcHJpbnRmKCJ2ZXJib3NlIGxldmVsIGlzICVkXG4iLCB2ZXJib3NlX2xldmVsKTsKKworU3BlY2lhbCBjaGFyYWN0ZXJzOgorCisgIi0iICAgIEEgZ3JvdXAgY29uc2lzdGluZyBvZiBqdXN0IGEgZGFzaCBmb3JjZXMgYWxsIGFyZ3VtZW50cworICAgICAgICB0byBiZSB0cmVhdGVkIGFzIG9wdGlvbnMsIGV2ZW4gaWYgdGhleSBoYXZlIG5vIGxlYWRpbmcgZGFzaGVzLgorICAgICAgICBOZXh0IGNoYXIgaW4gdGhpcyBjYXNlIGNhbid0IGJlIGEgZGlnaXQgKDAtOSksIHVzZSAnOicgb3IgZW5kIG9mIGxpbmUuCisgICAgICAgIEV4YW1wbGU6CisKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTp3LXg6eC13IjsgLy8gIi13LXg6eC13IiB3b3VsZCBhbHNvIHdvcmssCisgICAgICAgIGdldG9wdDMyKGFyZ3YsICJ3eCIpOyAgICAgICAgICAgIC8vIGJ1dCBpcyBsZXNzIHJlYWRhYmxlCisKKyAgICAgICAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2Ugb3B0aW9ucyB3aXRob3V0IGEgZGFzaCAoLi9wcm9ncmFtIHcgeCkKKyAgICAgICAgYXMgd2VsbCBhcyB3aXRoIGEgZGFzaCAoLi9wcm9ncmFtIC14KS4KKworICAgICAgICBOQjogZ2V0b3B0MzIoKSB3aWxsIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGlmIHlvdSB1c2UKKyAgICAgICAgdGhpcyBvcHRpb24hIERvIG5vdCB1c2UgaXQgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZiByZWN1cnNpdmUKKyAgICAgICAgZ2V0b3B0MzIoKSBjYWxscy4KKworICItLSIgICBBIGRvdWJsZSBkYXNoIGF0IHRoZSBiZWdpbm5pbmcgb2Ygb3B0X2NvbXBsZW1lbnRhcnkgbWVhbnMgdGhlCisgICAgICAgIGFyZ3ZbMV0gc3RyaW5nIHNob3VsZCBhbHdheXMgYmUgdHJlYXRlZCBhcyBvcHRpb25zLCBldmVuIGlmIGl0IGlzbid0CisgICAgICAgIHByZWZpeGVkIHdpdGggYSAiLSIuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lhbCBzeW50YXggaW4gYXBwbGV0cworICAgICAgICBzdWNoIGFzICJhciIgYW5kICJ0YXIiOgorICAgICAgICB0YXIgeHZmIGZvby50YXIKKworICAgICAgICBOQjogZ2V0b3B0MzIoKSB3aWxsIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGlmIHlvdSB1c2UKKyAgICAgICAgdGhpcyBvcHRpb24hIERvIG5vdCB1c2UgaXQgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZiByZWN1cnNpdmUKKyAgICAgICAgZ2V0b3B0MzIoKSBjYWxscy4KKworICItTiIgICBBIGRhc2ggYXMgdGhlIGZpcnN0IGNoYXIgaW4gYSBvcHRfY29tcGxlbWVudGFyeSBncm91cCBmb2xsb3dlZAorICAgICAgICBieSBhIHNpbmdsZSBkaWdpdCAoMC05KSBtZWFucyB0aGF0IGF0IGxlYXN0IE4gbm9uLW9wdGlvbgorICAgICAgICBhcmd1bWVudHMgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmUKKworICI9TiIgICBBbiBlcXVhbCBzaWduIGFzIHRoZSBmaXJzdCBjaGFyIGluIGEgb3B0X2NvbXBsZW1lbnRhcnkgZ3JvdXAgZm9sbG93ZWQKKyAgICAgICAgYnkgYSBzaW5nbGUgZGlnaXQgKDAtOSkgbWVhbnMgdGhhdCBleGFjdGx5IE4gbm9uLW9wdGlvbgorICAgICAgICBhcmd1bWVudHMgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmUKKworICI/TiIgICBBICI/IiBhcyB0aGUgZmlyc3QgY2hhciBpbiBhIG9wdF9jb21wbGVtZW50YXJ5IGdyb3VwIGZvbGxvd2VkCisgICAgICAgIGJ5IGEgc2luZ2xlIGRpZ2l0ICgwLTkpIG1lYW5zIHRoYXQgYXQgbW9zdCBOIGFyZ3VtZW50cyBtdXN0IGJlIHByZXNlbnQKKyAgICAgICAgb24gdGhlIGNvbW1hbmQgbGluZS4KKworICJWLSIgICBBbiBvcHRpb24gd2l0aCBkYXNoIGJlZm9yZSBjb2xvbiBvciBlbmQtb2YtbGluZSByZXN1bHRzIGluCisgICAgICAgIGJiX3Nob3dfdXNhZ2UoKSBiZWluZyBjYWxsZWQgaWYgdGhpcyBvcHRpb24gaXMgZW5jb3VudGVyZWQuCisgICAgICAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gaW1wbGVtZW50ICJwcmludCB2ZXJib3NlIHVzYWdlIG1lc3NhZ2UKKyAgICAgICAgYW5kIGV4aXQiIG9wdGlvbi4KKworICJhLWIiICBBIGRhc2ggYmV0d2VlbiB0d28gb3B0aW9ucyBjYXVzZXMgdGhlIHNlY29uZCBvZiB0aGUgdHdvCisgICAgICAgIHRvIGJlIHVuc2V0IChhbmQgaWdub3JlZCkgaWYgaXQgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworICAgICAgICBbRklYTUU6IHdoYXQgaWYgdGhleSBhcmUgdGhlIHNhbWU/IGxpa2UgIngteCI/IElzIGl0IGV2ZXIgdXNlZnVsP10KKworICAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgVGhlIGR1IGFwcGxldCBoYXMgdGhlIG9wdGlvbnMgIi1zIiBhbmQgIi1kIGRlcHRoIi4gIElmCisgICAgICAgIGdldG9wdDMyIGZpbmRzIC1zLCB0aGVuIC1kIGlzIHVuc2V0IG9yIGlmIGl0IGZpbmRzIC1kCisgICAgICAgIHRoZW4gLXMgaXMgdW5zZXQuICAoTm90ZTogIGJ1c3lib3ggaW1wbGVtZW50cyB0aGUgR05VCisgICAgICAgICItLW1heC1kZXB0aCIgb3B0aW9uIGFzICItZCIuKSAgVG8gb2J0YWluIHRoaXMgYmVoYXZpb3IsIHlvdQorICAgICAgICBzZXQgb3B0X2NvbXBsZW1lbnRhcnkgPSAicy1kOmQtcyIuICBPbmx5IG9uZSBmbGFnIHZhbHVlIGlzCisgICAgICAgIGFkZGVkIHRvIGdldG9wdDMyJ3MgcmV0dXJuIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgcG9zaXRpb24gb2YgdGhlIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIG9uZSBvZiB0aGUKKyAgICAgICAgdHdvIG9wdGlvbnMgcmVxdWlyZXMgYW4gYXJndW1lbnQgcG9pbnRlciAoIjoiIGluIGFwcGxldF9vcHRzCisgICAgICAgIGFzIGluICJkOiIpIG9wdGFyZyBpcyBzZXQgYWNjb3JkaW5nbHkuCisKKyAgICAgICAgY2hhciAqc21heF9wcmludF9kZXB0aDsKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJzLWQ6ZC1zOngteCI7CisgICAgICAgIG9wdCA9IGdldG9wdDMyKGFyZ3YsICJzZDp4IiwgJnNtYXhfcHJpbnRfZGVwdGgpOworCisgICAgICAgIGlmIChvcHQgJiAyKQorICAgICAgICAgICAgICAgIG1heF9wcmludF9kZXB0aCA9IGF0b2koc21heF9wcmludF9kZXB0aCk7CisgICAgICAgIGlmIChvcHQgJiA0KQorICAgICAgICAgICAgICAgIHByaW50ZigiRGV0ZWN0ZWQgb2RkIC14IHVzYWdlXG4iKTsKKworICJhLS1iIiBBIGRvdWJsZSBkYXNoIGJldHdlZW4gdHdvIG9wdGlvbnMsIG9yIGJldHdlZW4gYW4gb3B0aW9uIGFuZCBhIGdyb3VwCisgICAgICAgIG9mIG9wdGlvbnMsIG1lYW5zIHRoYXQgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgVW5saWtlCisgICAgICAgIHRoZSAiLSIgY2FzZSBhYm92ZSwgYW4gZXJyb3Igd2lsbCBiZSBmb3JjZWQgaWYgdGhlIG9wdGlvbnMKKyAgICAgICAgYXJlIHVzZWQgdG9nZXRoZXIuCisKKyAgICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgIFRoZSBjdXQgYXBwbGV0IG11c3QgaGF2ZSBvbmx5IG9uZSB0eXBlIG9mIGxpc3Qgc3BlY2lmaWVkLCBzbworICAgICAgICAtYiwgLWMgYW5kIC1mIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kIHNob3VsZCByYWlzZSBhbiBlcnJvcgorICAgICAgICBpZiBzcGVjaWZpZWQgdG9nZXRoZXIuICBJbiB0aGlzIGNhc2UgeW91IG11c3Qgc2V0CisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gImItLWNmOmMtLWJmOmYtLWJjIi4gIElmIHR3byBvZiB0aGUKKyAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMgYXJlIGZvdW5kLCBnZXRvcHQzMiB3aWxsIGNhbGwKKyAgICAgICAgYmJfc2hvd191c2FnZSgpIGFuZCBkaWUuCisKKyAieC0teCIgVmFyaWF0aW9uIG9mIHRoZSBhYm92ZSwgaXQgbWVhbnMgdGhhdCAteCBvcHRpb24gc2hvdWxkIG9jY3VyCisgICAgICAgIGF0IG1vc3Qgb25jZS4KKworICJhKyIgICBBIHBsdXMgYWZ0ZXIgYSBjaGFyIGluIG9wdF9jb21wbGVtZW50YXJ5IG1lYW5zIHRoYXQgdGhlIHBhcmFtZXRlcgorICAgICAgICBmb3IgdGhpcyBvcHRpb24gaXMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyLiBJdCB3aWxsIGJlIHByb2Nlc3NlZAorICAgICAgICB3aXRoIHhhdG9pX3Bvc2l0aXZlKCkgLSBhbGxvd2VkIHJhbmdlIGlzIDAuLklOVF9NQVguCisKKyAgICAgICAgaW50IHBhcmFtOyAgLy8gInVuc2lnbmVkIHBhcmFtOyIgd2lsbCBhbHNvIHdvcmsKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAicCsiOworICAgICAgICBnZXRvcHQzMihhcmd2LCAicDoiLCAmcGFyYW0pOworCisgImE6OiIgIEEgZG91YmxlIGNvbG9uIGFmdGVyIGEgY2hhciBpbiBvcHRfY29tcGxlbWVudGFyeSBtZWFucyB0aGF0IHRoZQorICAgICAgICBvcHRpb24gY2FuIG9jY3VyIG11bHRpcGxlIHRpbWVzLiBFYWNoIG9jY3VycmVuY2Ugd2lsbCBiZSBzYXZlZCBhcworICAgICAgICBhIGxsaXN0X3QgZWxlbWVudCBpbnN0ZWFkIG9mIGNoYXIqLgorCisgICAgICAgIEZvciBleGFtcGxlOgorICAgICAgICBUaGUgZ3JlcCBhcHBsZXQgY2FuIGhhdmUgb25lIG9yIG1vcmUgIi1lIHBhdHRlcm4iIGFyZ3VtZW50cy4KKyAgICAgICAgSW4gdGhpcyBjYXNlIHlvdSBzaG91bGQgdXNlIGdldG9wdDMyKCkgYXMgZm9sbG93czoKKworICAgICAgICBsbGlzdF90ICpwYXR0ZXJucyA9IE5VTEw7CisKKyAgICAgICAgKHRoaXMgcG9pbnRlciBtdXN0IGJlIGluaXRpYWxpemF0ZWQgdG8gTlVMTCBpZiB0aGUgbGlzdCBpcyBlbXB0eQorICAgICAgICBhcyByZXF1aXJlZCBieSBsbGlzdF9hZGRfdG9fZW5kKGxsaXN0X3QgKipvbGRfaGVhZCwgY2hhciAqbmV3X2l0ZW0pLikKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJlOjoiOworCisgICAgICAgIGdldG9wdDMyKGFyZ3YsICJlOiIsICZwYXR0ZXJucyk7CisgICAgICAgICQgZ3JlcCAtZSB1c2VyIC1lIHJvb3QgL2V0Yy9wYXNzd2QKKyAgICAgICAgcm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaAorICAgICAgICB1c2VyOng6NTAwOjUwMDo6L2hvbWUvdXNlcjovYmluL2Jhc2gKKworICJhP2IiICBBICI/IiBiZXR3ZWVuIGFuIG9wdGlvbiBhbmQgYSBncm91cCBvZiBvcHRpb25zIG1lYW5zIHRoYXQKKyAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgcmVxdWlyZWQgdG8gb2NjdXIgaWYgdGhlIGZpcnN0IG9wdGlvbgorICAgICAgICBvY2N1cnMgaW4gcHJlY2VkaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKKyAgICAgICAgRm9yIGV4YW1wbGUgZnJvbSAiaWQiIGFwcGxldDoKKworICAgICAgICAvLyBEb24ndCBhbGxvdyAtbiAtciAtcm4gLXVnIC1ydWcgLW51ZyAtcm51ZworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJyP3VnOm4/dWc6dS0tZzpnLS11IjsKKyAgICAgICAgZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAicm51ZyIpOworCisgICAgICAgIFRoaXMgZXhhbXBsZSBhbGxvd2VkIG9ubHk6CisgICAgICAgICQgaWQ7IGlkIC11OyBpZCAtZzsgaWQgLXJ1OyBpZCAtbnU7IGlkIC1yZzsgaWQgLW5nOyBpZCAtcm51OyBpZCAtcm5nCisKKyAiWCIgICAgQSBvcHRfY29tcGxlbWVudGFyeSBncm91cCB3aXRoIGp1c3QgYSBzaW5nbGUgbGV0dGVyIG1lYW5zCisgICAgICAgIHRoYXQgdGhpcyBvcHRpb24gaXMgcmVxdWlyZWQuIElmIG1vcmUgdGhhbiBvbmUgc3VjaCBncm91cCBleGlzdHMsCisgICAgICAgIGF0IGxlYXN0IG9uZSBvcHRpb24gaXMgcmVxdWlyZWQgdG8gb2NjdXIgKG5vdCBhbGwgb2YgdGhlbSkuCisgICAgICAgIEZvciBleGFtcGxlIGZyb20gInN0YXJ0LXN0b3AtZGFlbW9uIiBhcHBsZXQ6CisKKyAgICAgICAgLy8gRG9uJ3QgYWxsb3cgLUtTIC1TSywgYnV0IC1TIG9yIC1LIGlzIHJlcXVpcmVkCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gIks6UzpLLS1TOlMtLUsiOworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJLUy4uLik7CisKKworICAgICAgICBEb24ndCBmb3JnZXQgdG8gdXNlICc6Jy4gRm9yIGV4YW1wbGUsICI/MzIyLTIyLTIzWC14LWEiCisgICAgICAgIGlzIGludGVycHJldGVkIGFzICI/MzoyMjotMjoyLTI6Mi0zWGE6Mi0teCIgLQorICAgICAgICBtYXggMyBhcmdzOyBjb3VudCB1c2VzIG9mICctMic7IG1pbiAyIGFyZ3M7IGlmIHRoZXJlIGlzCisgICAgICAgIGEgJy0yJyBvcHRpb24gdGhlbiB1bnNldCAnLTMnLCAnLVgnIGFuZCAnLWEnOyBpZiB0aGVyZSBpcworICAgICAgICBhICctMicgYW5kIGFmdGVyIGl0IGEgJy14JyB0aGVuIGVycm9yIG91dC4KKyAgICAgICAgQnV0IGl0J3MgZmFyIHRvbyBvYmZ1c2NhdGVkLiBVc2UgJzonIHRvIHNlcGFyYXRlIGdyb3Vwcy4KKyovCisKKy8qIENvZGUgaGVyZSBhc3N1bWVzIHRoYXQgJ3Vuc2lnbmVkJyBpcyBhdCBsZWFzdCAzMiBiaXRzIHdpZGUgKi8KKworY29uc3QgY2hhciAqY29uc3QgYmJfYXJndl9kYXNoW10gPSB7ICItIiwgTlVMTCB9OworCitjb25zdCBjaGFyICpvcHRfY29tcGxlbWVudGFyeTsKKworZW51bSB7CisJUEFSQU1fU1RSSU5HLAorCVBBUkFNX0xJU1QsCisJUEFSQU1fSU5ULAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgb3B0X2NoYXI7CisJc21hbGxpbnQgcGFyYW1fdHlwZTsKKwl1bnNpZ25lZCBzd2l0Y2hfb247CisJdW5zaWduZWQgc3dpdGNoX29mZjsKKwl1bnNpZ25lZCBpbmNvbmdydW91c2x5OworCXVuc2lnbmVkIHJlcXVpcmVzOworCXZvaWQgKipvcHRhcmc7ICAvKiBjaGFyKiosIGxsaXN0X3QqKiBvciBpbnQgKi4gKi8KKwlpbnQgKmNvdW50ZXI7Cit9IHRfY29tcGxlbWVudGFyeTsKKworLyogWW91IGNhbiBzZXQgYXBwbGV0X2xvbmdfb3B0aW9ucyBmb3IgcGFyc2UgY2FsbGVkIGxvbmcgb3B0aW9ucyAqLworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGJiX251bGxfbG9uZ19vcHRpb25zWzFdID0geworCXsgMCwgMCwgMCwgMCB9Cit9OworY29uc3QgY2hhciAqYXBwbGV0X2xvbmdfb3B0aW9uczsKKyNlbmRpZgorCit1aW50MzJfdCBvcHRpb25fbWFzazMyOworCit1aW50MzJfdCBGQVNUX0ZVTkMKK2dldG9wdDMyKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICphcHBsZXRfb3B0cywgLi4uKQoreworCWludCBhcmdjOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwl1bnNpZ25lZCByZXF1aXJlcyA9IDA7CisJdF9jb21wbGVtZW50YXJ5IGNvbXBsZW1lbnRhcnlbMzNdOyAvKiBsYXN0IHN0YXlzIHplcm8tZmlsbGVkICovCisJY2hhciBmaXJzdF9jaGFyOworCWludCBjOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisJdF9jb21wbGVtZW50YXJ5ICpvbl9vZmY7CisJdmFfbGlzdCBwOworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uICpsX287CisJc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zID0gKHN0cnVjdCBvcHRpb24gKikgJmJiX251bGxfbG9uZ19vcHRpb25zOworI2VuZGlmCisJdW5zaWduZWQgdHJpZ2dlcjsKKwljaGFyICoqcGFyZ3Y7CisJaW50IG1pbl9hcmcgPSAwOworCWludCBtYXhfYXJnID0gLTE7CisKKyNkZWZpbmUgU0hPV19VU0FHRV9JRl9FUlJPUiAgICAgMQorI2RlZmluZSBBTExfQVJHVl9JU19PUFRTICAgICAgICAyCisjZGVmaW5lIEZJUlNUX0FSR1ZfSVNfT1BUICAgICAgIDQKKworCWludCBzcGVjX2ZsZ3MgPSAwOworCisJLyogc2tpcCAwOiBzb21lIGFwcGxldHMgY2hlYXQ6IHRoZXkgZG8gbm90IGFjdHVhbGx5IEhBVkUgYXJndlswXSAqLworCWFyZ2MgPSAxOworCXdoaWxlIChhcmd2W2FyZ2NdKQorCQlhcmdjKys7CisKKwl2YV9zdGFydChwLCBhcHBsZXRfb3B0cyk7CisKKwljID0gMDsKKwlvbl9vZmYgPSBjb21wbGVtZW50YXJ5OworCW1lbXNldChvbl9vZmYsIDAsIHNpemVvZihjb21wbGVtZW50YXJ5KSk7CisKKwkvKiBza2lwIGJib3ggZXh0ZW5zaW9uICovCisJZmlyc3RfY2hhciA9IGFwcGxldF9vcHRzWzBdOworCWlmIChmaXJzdF9jaGFyID09ICchJykKKwkJYXBwbGV0X29wdHMrKzsKKworCS8qIHNraXAgR05VIGV4dGVuc2lvbiAqLworCXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWFwcGxldF9vcHRzOworCWlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKQorCQlzKys7CisJd2hpbGUgKCpzKSB7CisJCWlmIChjID49IDMyKQorCQkJYnJlYWs7CisJCW9uX29mZi0+b3B0X2NoYXIgPSAqczsKKwkJb25fb2ZmLT5zd2l0Y2hfb24gPSAoMSA8PCBjKTsKKwkJaWYgKCorK3MgPT0gJzonKSB7CisJCQlvbl9vZmYtPm9wdGFyZyA9IHZhX2FyZyhwLCB2b2lkICoqKTsKKwkJCXdoaWxlICgqKytzID09ICc6JykKKwkJCQljb250aW51ZTsKKwkJfQorCQlvbl9vZmYrKzsKKwkJYysrOworCX0KKworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlpZiAoYXBwbGV0X2xvbmdfb3B0aW9ucykgeworCQljb25zdCBjaGFyICpvcHRzdHI7CisJCXVuc2lnbmVkIGksIGNvdW50OworCisJCWNvdW50ID0gMTsKKwkJb3B0c3RyID0gYXBwbGV0X2xvbmdfb3B0aW9uczsKKwkJd2hpbGUgKG9wdHN0clswXSkgeworCQkJb3B0c3RyICs9IHN0cmxlbihvcHRzdHIpICsgMzsgLyogc2tpcCBOVUwsIGhhc19hcmcsIHZhbCAqLworCQkJY291bnQrKzsKKwkJfQorCQkvKiBjb3VudCA9PSBuby4gb2YgbG9uZ29wdHMgKyAxICovCisJCWxvbmdfb3B0aW9ucyA9IGFsbG9jYShjb3VudCAqIHNpemVvZigqbG9uZ19vcHRpb25zKSk7CisJCW1lbXNldChsb25nX29wdGlvbnMsIDAsIGNvdW50ICogc2l6ZW9mKCpsb25nX29wdGlvbnMpKTsKKwkJaSA9IDA7CisJCW9wdHN0ciA9IGFwcGxldF9sb25nX29wdGlvbnM7CisJCXdoaWxlICgtLWNvdW50KSB7CisJCQlsb25nX29wdGlvbnNbaV0ubmFtZSA9IG9wdHN0cjsKKwkJCW9wdHN0ciArPSBzdHJsZW4ob3B0c3RyKSArIDE7CisJCQlsb25nX29wdGlvbnNbaV0uaGFzX2FyZyA9ICh1bnNpZ25lZCBjaGFyKSgqb3B0c3RyKyspOworCQkJLyogbG9uZ19vcHRpb25zW2ldLmZsYWcgPSBOVUxMOyAqLworCQkJbG9uZ19vcHRpb25zW2ldLnZhbCA9ICh1bnNpZ25lZCBjaGFyKSgqb3B0c3RyKyspOworCQkJaSsrOworCQl9CisJCWZvciAobF9vID0gbG9uZ19vcHRpb25zOyBsX28tPm5hbWU7IGxfbysrKSB7CisJCQlpZiAobF9vLT5mbGFnKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyOyBvbl9vZmYrKykKKwkJCQlpZiAob25fb2ZmLT5vcHRfY2hhciA9PSBsX28tPnZhbCkKKwkJCQkJZ290byBuZXh0X2xvbmc7CisJCQlpZiAoYyA+PSAzMikKKwkJCQlicmVhazsKKwkJCW9uX29mZi0+b3B0X2NoYXIgPSBsX28tPnZhbDsKKwkJCW9uX29mZi0+c3dpdGNoX29uID0gKDEgPDwgYyk7CisJCQlpZiAobF9vLT5oYXNfYXJnICE9IG5vX2FyZ3VtZW50KQorCQkJCW9uX29mZi0+b3B0YXJnID0gdmFfYXJnKHAsIHZvaWQgKiopOworCQkJYysrOworIG5leHRfbG9uZzogOworCQl9CisJCS8qIE1ha2UgaXQgdW5uZWNlc3NhcnkgdG8gY2xlYXIgYXBwbGV0X2xvbmdfb3B0aW9ucworCQkgKiBieSBoYW5kIGFmdGVyIGVhY2ggY2FsbCB0byBnZXRvcHQzMgorCQkgKi8KKwkJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IE5VTEw7CisJfQorI2VuZGlmIC8qIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcgKi8KKwlmb3IgKHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKW9wdF9jb21wbGVtZW50YXJ5OyBzICYmICpzOyBzKyspIHsKKwkJdF9jb21wbGVtZW50YXJ5ICpwYWlyOworCQl1bnNpZ25lZCAqcGFpcl9zd2l0Y2g7CisKKwkJaWYgKCpzID09ICc6JykKKwkJCWNvbnRpbnVlOworCQljID0gc1sxXTsKKwkJaWYgKCpzID09ICc/JykgeworCQkJaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykgeworCQkJCXNwZWNfZmxncyB8PSBTSE9XX1VTQUdFX0lGX0VSUk9SOworCQkJfSBlbHNlIHsKKwkJCQltYXhfYXJnID0gYyAtICcwJzsKKwkJCQlzKys7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnMgPT0gJy0nKSB7CisJCQlpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CisJCQkJaWYgKGMgPT0gJy0nKSB7CisJCQkJCXNwZWNfZmxncyB8PSBGSVJTVF9BUkdWX0lTX09QVDsKKwkJCQkJcysrOworCQkJCX0gZWxzZQorCQkJCQlzcGVjX2ZsZ3MgfD0gQUxMX0FSR1ZfSVNfT1BUUzsKKwkJCX0gZWxzZSB7CisJCQkJbWluX2FyZyA9IGMgLSAnMCc7CisJCQkJcysrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpzID09ICc9JykgeworCQkJbWluX2FyZyA9IG1heF9hcmcgPSBjIC0gJzAnOworCQkJcysrOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyOyBvbl9vZmYrKykKKwkJCWlmIChvbl9vZmYtPm9wdF9jaGFyID09ICpzKQorCQkJCWdvdG8gZm91bmRfb3B0OworCQkvKiBXaXRob3V0IHRoaXMsIGRpYWdub3N0aWMgb2Ygc3VjaCBidWdzIGlzIG5vdCBlYXN5ICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJOTyBPUFQgJWMhIiwgKnMpOworIGZvdW5kX29wdDoKKwkJaWYgKGMgPT0gJzonICYmIHNbMl0gPT0gJzonKSB7CisJCQlvbl9vZmYtPnBhcmFtX3R5cGUgPSBQQVJBTV9MSVNUOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gJysnICYmIChzWzJdID09ICc6JyB8fCBzWzJdID09ICdcMCcpKSB7CisJCQlvbl9vZmYtPnBhcmFtX3R5cGUgPSBQQVJBTV9JTlQ7CisJCQlzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnOicgfHwgYyA9PSAnXDAnKSB7CisJCQlyZXF1aXJlcyB8PSBvbl9vZmYtPnN3aXRjaF9vbjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICctJyAmJiAoc1syXSA9PSAnOicgfHwgc1syXSA9PSAnXDAnKSkgeworCQkJZmxhZ3MgfD0gb25fb2ZmLT5zd2l0Y2hfb247CisJCQlvbl9vZmYtPmluY29uZ3J1b3VzbHkgfD0gb25fb2ZmLT5zd2l0Y2hfb247CisJCQlzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAqcykgeworCQkJb25fb2ZmLT5jb3VudGVyID0gdmFfYXJnKHAsIGludCAqKTsKKwkJCXMrKzsKKwkJfQorCQlwYWlyID0gb25fb2ZmOworCQlwYWlyX3N3aXRjaCA9ICZwYWlyLT5zd2l0Y2hfb247CisJCWZvciAocysrOyAqcyAmJiAqcyAhPSAnOic7IHMrKykgeworCQkJaWYgKCpzID09ICc/JykgeworCQkJCXBhaXJfc3dpdGNoID0gJnBhaXItPnJlcXVpcmVzOworCQkJfSBlbHNlIGlmICgqcyA9PSAnLScpIHsKKwkJCQlpZiAocGFpcl9zd2l0Y2ggPT0gJnBhaXItPnN3aXRjaF9vZmYpCisJCQkJCXBhaXJfc3dpdGNoID0gJnBhaXItPmluY29uZ3J1b3VzbHk7CisJCQkJZWxzZQorCQkJCQlwYWlyX3N3aXRjaCA9ICZwYWlyLT5zd2l0Y2hfb2ZmOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKG9uX29mZiA9IGNvbXBsZW1lbnRhcnk7IG9uX29mZi0+b3B0X2NoYXI7IG9uX29mZisrKQorCQkJCQlpZiAob25fb2ZmLT5vcHRfY2hhciA9PSAqcykgeworCQkJCQkJKnBhaXJfc3dpdGNoIHw9IG9uX29mZi0+c3dpdGNoX29uOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCX0KKwkJfQorCQlzLS07CisJfQorCW9wdF9jb21wbGVtZW50YXJ5ID0gTlVMTDsKKwl2YV9lbmQocCk7CisKKwlpZiAoc3BlY19mbGdzICYgKEZJUlNUX0FSR1ZfSVNfT1BUIHwgQUxMX0FSR1ZfSVNfT1BUUykpIHsKKwkJcGFyZ3YgPSBhcmd2ICsgMTsKKwkJd2hpbGUgKCpwYXJndikgeworCQkJaWYgKHBhcmd2WzBdWzBdICE9ICctJyAmJiBwYXJndlswXVswXSAhPSAnXDAnKSB7CisJCQkJLyogQ2FuJ3QgdXNlIGFsbG9jYTogb3B0cyB3aXRoIHBhcmFtcyB3aWxsCisJCQkJICogcmV0dXJuIHBvaW50ZXJzIHRvIHN0YWNrIQorCQkJCSAqIE5COiB3ZSBsZWFrIHRoZXNlIGFsbG9jYXRpb25zLi4uICovCisJCQkJY2hhciAqcHAgPSB4bWFsbG9jKHN0cmxlbigqcGFyZ3YpICsgMik7CisJCQkJKnBwID0gJy0nOworCQkJCXN0cmNweShwcCArIDEsICpwYXJndik7CisJCQkJKnBhcmd2ID0gcHA7CisJCQl9CisJCQlpZiAoIShzcGVjX2ZsZ3MgJiBBTExfQVJHVl9JU19PUFRTKSkKKwkJCQlicmVhazsKKwkJCXBhcmd2Kys7CisJCX0KKwl9CisKKwkvKiBJbiBjYXNlIGdldG9wdDMyIHdhcyBhbHJlYWR5IGNhbGxlZDoKKwkgKiByZXNldCB0aGUgbGliYyBnZXRvcHQoKSBmdW5jdGlvbiwgd2hpY2gga2VlcHMgaW50ZXJuYWwgc3RhdGUuCisJICogcnVuX25vZm9ya19hcHBsZXQoKSBkb2VzIHRoaXMsIGJ1dCB3ZSBtaWdodCBlbmQgdXAgaGVyZQorCSAqIGFsc28gdmlhIGd1bnppcF9tYWluKCkgLT4gZ3ppcF9tYWluKCkuIFBsYXkgc2FmZS4KKwkgKi8KKyNpZmRlZiBfX0dMSUJDX18KKwlvcHRpbmQgPSAwOworI2Vsc2UgLyogQlNEIHN0eWxlICovCisJb3B0aW5kID0gMTsKKwkvKiBvcHRyZXNldCA9IDE7ICovCisjZW5kaWYKKwkvKiBvcHRhcmcgPSBOVUxMOyBvcHRlcnIgPSAwOyBvcHRvcHQgPSAwOyAtIGRvIHdlIG5lZWQgdGhpcz8/ICovCisKKwkvKiBOb3RlOiBqdXN0ICJnZXRvcHQoKSA8PSAwIiB3aWxsIG5vdCB3b3JrIHdlbGwgZm9yCisJICogImZha2UiIHNob3J0IG9wdGlvbnMsIGxpa2UgdGhpcyBvbmU6CisJICogd2dldCAkJy1cMjAzJyAiVGVzdDogdGVzdCIgaHR0cDovL2tlcm5lbC5vcmcvCisJICogKHN1cHBvc2VkIHRvIGFjdCBhcyAtLWhlYWRlciwgYnV0IGRvZXNuJ3QpICovCisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIGFwcGxldF9vcHRzLAorCQkJbG9uZ19vcHRpb25zLCBOVUxMKSkgIT0gLTEpIHsKKyNlbHNlCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIGFwcGxldF9vcHRzKSkgIT0gLTEpIHsKKyNlbmRpZgorCQkvKiBnZXRvcHQgcHJpbnRzICJvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gWCIKKwkJICogYW5kIHJldHVybnMgJz8nIGlmIGFuIG9wdGlvbiBoYXMgbm8gYXJnLCBidXQgb25lIGlzIHJlcWQgKi8KKwkJYyAmPSAweGZmOyAvKiBmaWdodCBsaWJjJ3Mgc2lnbiBleHRlbnNpb24gKi8KKwkJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyICE9IGM7IG9uX29mZisrKSB7CisJCQkvKiBjIGNhbiBiZSBOVUwgaWYgbG9uZyBvcHQgaGFzIG5vbi1OVUxMIC0+ZmxhZywKKwkJCSAqIGJ1dCB3ZSBjb25zdHJ1Y3QgbG9uZyBvcHRzIHNvIHRoYXQgZmxhZworCQkJICogaXMgYWx3YXlzIE5VTEwgKHNlZSBhYm92ZSkgKi8KKwkJCWlmIChvbl9vZmYtPm9wdF9jaGFyID09ICdcMCcgLyogJiYgYyAhPSAnXDAnICovKSB7CisJCQkJLyogYyBpcyBwcm9iYWJseSAnPycgLSAiYmFkIG9wdGlvbiIgKi8KKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCWlmIChmbGFncyAmIG9uX29mZi0+aW5jb25ncnVvdXNseSkKKwkJCWdvdG8gZXJyb3I7CisJCXRyaWdnZXIgPSBvbl9vZmYtPnN3aXRjaF9vbiAmIG9uX29mZi0+c3dpdGNoX29mZjsKKwkJZmxhZ3MgJj0gfihvbl9vZmYtPnN3aXRjaF9vZmYgXiB0cmlnZ2VyKTsKKwkJZmxhZ3MgfD0gb25fb2ZmLT5zd2l0Y2hfb24gXiB0cmlnZ2VyOworCQlmbGFncyBePSB0cmlnZ2VyOworCQlpZiAob25fb2ZmLT5jb3VudGVyKQorCQkJKCoob25fb2ZmLT5jb3VudGVyKSkrKzsKKwkJaWYgKG9wdGFyZykgeworCQkJaWYgKG9uX29mZi0+cGFyYW1fdHlwZSA9PSBQQVJBTV9MSVNUKSB7CisJCQkJbGxpc3RfYWRkX3RvX2VuZCgobGxpc3RfdCAqKikob25fb2ZmLT5vcHRhcmcpLCBvcHRhcmcpOworCQkJfSBlbHNlIGlmIChvbl9vZmYtPnBhcmFtX3R5cGUgPT0gUEFSQU1fSU5UKSB7CisvL1RPRE86IHhhdG9pX3Bvc2l0aXZlIGluZGlyZWN0bHkgcHVsbHMgaW4gcHJpbnRmIG1hY2hpbmVyeQorCQkJCSoodW5zaWduZWQqKShvbl9vZmYtPm9wdGFyZykgPSB4YXRvaV9wb3NpdGl2ZShvcHRhcmcpOworCQkJfSBlbHNlIGlmIChvbl9vZmYtPm9wdGFyZykgeworCQkJCSooY2hhciAqKikob25fb2ZmLT5vcHRhcmcpID0gb3B0YXJnOworCQkJfQorCQl9CisJfQorCisJLyogY2hlY2sgZGVwZW5kaW5nIHJlcXVpcmVzIGZvciBnaXZlbiBvcHRpb25zICovCisJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyOyBvbl9vZmYrKykgeworCQlpZiAob25fb2ZmLT5yZXF1aXJlcworCQkgJiYgKGZsYWdzICYgb25fb2ZmLT5zd2l0Y2hfb24pCisJCSAmJiAoZmxhZ3MgJiBvbl9vZmYtPnJlcXVpcmVzKSA9PSAwCisJCSkgeworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlpZiAocmVxdWlyZXMgJiYgKGZsYWdzICYgcmVxdWlyZXMpID09IDApCisJCWdvdG8gZXJyb3I7CisJYXJnYyAtPSBvcHRpbmQ7CisJaWYgKGFyZ2MgPCBtaW5fYXJnIHx8IChtYXhfYXJnID49IDAgJiYgYXJnYyA+IG1heF9hcmcpKQorCQlnb3RvIGVycm9yOworCisJb3B0aW9uX21hc2szMiA9IGZsYWdzOworCXJldHVybiBmbGFnczsKKworIGVycm9yOgorCWlmIChmaXJzdF9jaGFyICE9ICchJykKKwkJYmJfc2hvd191c2FnZSgpOworCXJldHVybiAoaW50MzJfdCktMTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldHB0eS5jIGIvbGliYmIvZ2V0cHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1ZTRkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldHB0eS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZ2V0cHR5IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBCam9ybiBXZXNlbiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiAoYmpvcm53QGF4aXMuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgREVCVUcgMAorCitpbnQgRkFTVF9GVU5DIHhnZXRwdHkoY2hhciAqbGluZSkKK3sKKwlpbnQgcDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0RFVlBUUworCXAgPSBvcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1IpOworCWlmIChwID4gMCkgeworCQlncmFudHB0KHApOyAvKiBjaG1vZCtjaG93biBjb3JyZXNwb25kaW5nIHNsYXZlIHB0eSAqLworCQl1bmxvY2twdChwKTsgLyogKHdoYXQgZG9lcyB0aGlzIGRvPykgKi8KKyMgaWZuZGVmIEhBVkVfUFRTTkFNRV9SCisJCXsKKwkJCWNvbnN0IGNoYXIgKm5hbWU7CisJCQluYW1lID0gcHRzbmFtZShwKTsgLyogZmluZCBvdXQgdGhlIG5hbWUgb2Ygc2xhdmUgcHR5ICovCisJCQlpZiAoIW5hbWUpIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInB0c25hbWUgZXJyb3IgKGlzIC9kZXYvcHRzIG1vdW50ZWQ/KSIpOworCQkJfQorCQkJc2FmZV9zdHJuY3B5KGxpbmUsIG5hbWUsIEdFVFBUWV9CVUZTSVpFKTsKKwkJfQorIyBlbHNlCisJCS8qIGZpbmQgb3V0IHRoZSBuYW1lIG9mIHNsYXZlIHB0eSAqLworCQlpZiAocHRzbmFtZV9yKHAsIGxpbmUsIEdFVFBUWV9CVUZTSVpFLTEpICE9IDApIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicHRzbmFtZSBlcnJvciAoaXMgL2Rldi9wdHMgbW91bnRlZD8pIik7CisJCX0KKwkJbGluZVtHRVRQVFlfQlVGU0laRS0xXSA9ICdcMCc7CisjIGVuZGlmCisJCXJldHVybiBwOworCX0KKyNlbHNlCisJc3RydWN0IHN0YXQgc3RiOworCWludCBpOworCWludCBqOworCisJc3RyY3B5KGxpbmUsICIvZGV2L3B0eVhYIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlsaW5lWzhdID0gInBxcnN0dXZ3eHl6YWJjZGUiW2ldOworCQlsaW5lWzldID0gJzAnOworCQlpZiAoc3RhdChsaW5lLCAmc3RiKSA8IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlsaW5lWzldID0gaiA8IDEwID8gaiArICcwJyA6IGogLSAxMCArICdhJzsKKwkJCWlmIChERUJVRykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyB0byBvcGVuIGRldmljZTogJXNcbiIsIGxpbmUpOworCQkJcCA9IG9wZW4obGluZSwgT19SRFdSIHwgT19OT0NUVFkpOworCQkJaWYgKHAgPj0gMCkgeworCQkJCWxpbmVbNV0gPSAndCc7CisJCQkJcmV0dXJuIHA7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogRkVBVFVSRV9ERVZQVFMgKi8KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBmcmVlIHB0eSIpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvaGFzaF9tZDVfc2hhLmMgYi9saWJiYi9oYXNoX21kNV9zaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODdkMWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvaGFzaF9tZDVfc2hhLmMKQEAgLTAsMCArMSw4OTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogZ2NjIDQuMi4xIG9wdGltaXplcyByb3RyNjQgYmV0dGVyIHdpdGggaW5saW5lIHRoYW4gd2l0aCBtYWNybworICogKGZvciByb3RYMzIsIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UpLiBXaHk/IE15IGd1ZXNzIGlzIHRoYXQKKyAqIG1hY3JvIHJlcXVpcmVzIGNsZXZlciBjb21tb24gc3ViZXhwcmVzc2lvbiBlbGltaW5hdGlvbiBoZXVyaXN0aWNzCisgKiBpbiBnY2MsIHdoaWxlIGlubGluZSBiYXNpY2FsbHkgZm9yY2VzIGl0IHRvIGhhcHBlbi4KKyAqLworLy8jZGVmaW5lIHJvdGwzMih4LG4pICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMiAtIChuKSkpKQorc3RhdGljIEFMV0FZU19JTkxJTkUgdWludDMyX3Qgcm90bDMyKHVpbnQzMl90IHgsIHVuc2lnbmVkIG4pCit7CisJcmV0dXJuICh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpOworfQorLy8jZGVmaW5lIHJvdHIzMih4LG4pICgoKHgpID4+IChuKSkgfCAoKHgpIDw8ICgzMiAtIChuKSkpKQorc3RhdGljIEFMV0FZU19JTkxJTkUgdWludDMyX3Qgcm90cjMyKHVpbnQzMl90IHgsIHVuc2lnbmVkIG4pCit7CisJcmV0dXJuICh4ID4+IG4pIHwgKHggPDwgKDMyIC0gbikpOworfQorLyogcm90cjY0IGluIG5lZWRlZCBmb3Igc2hhNTEyIG9ubHk6ICovCisvLyNkZWZpbmUgcm90cjY0KHgsbikgKCgoeCkgPj4gKG4pKSB8ICgoeCkgPDwgKDY0IC0gKG4pKSkpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50NjRfdCByb3RyNjQodWludDY0X3QgeCwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHggPj4gbikgfCAoeCA8PCAoNjQgLSBuKSk7Cit9CisKKworLyogRmVlZCBkYXRhIHRocm91Z2ggYSB0ZW1wb3JhcnkgYnVmZmVyLgorICogVGhlIGludGVybmFsIGJ1ZmZlciByZW1lbWJlcnMgcHJldmlvdXMgZGF0YSB1bnRpbCBpdCBoYXMgNjQKKyAqIGJ5dGVzIHdvcnRoIHRvIHBhc3Mgb24uCisgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb21tb242NF9oYXNoKG1kNV9jdHhfdCAqY3R4LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgYnVmcG9zID0gY3R4LT50b3RhbDY0ICYgNjM7CisKKwljdHgtPnRvdGFsNjQgKz0gbGVuOworCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtYWluaW5nID0gNjQgLSBidWZwb3M7CisJCWlmIChyZW1haW5pbmcgPiBsZW4pCisJCQlyZW1haW5pbmcgPSBsZW47CisJCS8qIENvcHkgZGF0YSBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCW1lbWNweShjdHgtPndidWZmZXIgKyBidWZwb3MsIGJ1ZmZlciwgcmVtYWluaW5nKTsKKwkJbGVuIC09IHJlbWFpbmluZzsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyByZW1haW5pbmc7CisJCWJ1ZnBvcyArPSByZW1haW5pbmc7CisJCS8qIGNsZXZlciB3YXkgdG8gZG8gImlmIChidWZwb3MgIT0gNjQpIGJyZWFrOyAuLi4gOyBidWZwb3MgPSAwOyIgKi8KKwkJYnVmcG9zIC09IDY0OworCQlpZiAoYnVmcG9zICE9IDApCisJCQlicmVhazsKKwkJLyogQnVmZmVyIGlzIGZpbGxlZCB1cCwgcHJvY2VzcyBpdCAqLworCQljdHgtPnByb2Nlc3NfYmxvY2soY3R4KTsKKwkJLypidWZwb3MgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwl9Cit9CisKKy8qIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29tbW9uNjRfZW5kKG1kNV9jdHhfdCAqY3R4LCBpbnQgc3dhcF9uZWVkZWQpCit7CisJdW5zaWduZWQgYnVmcG9zID0gY3R4LT50b3RhbDY0ICYgNjM7CisJLyogUGFkIHRoZSBidWZmZXIgdG8gdGhlIG5leHQgNjQtYnl0ZSBib3VuZGFyeSB3aXRoIDB4ODAsMCwwLDAuLi4gKi8KKwljdHgtPndidWZmZXJbYnVmcG9zKytdID0gMHg4MDsKKworCS8qIFRoaXMgbG9vcCBpdGVyYXRlcyBlaXRoZXIgb25jZSBvciB0d2ljZSwgbm8gbW9yZSwgbm8gbGVzcyAqLworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHJlbWFpbmluZyA9IDY0IC0gYnVmcG9zOworCQltZW1zZXQoY3R4LT53YnVmZmVyICsgYnVmcG9zLCAwLCByZW1haW5pbmcpOworCQkvKiBEbyB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGxlbmd0aCBjb3VudD8gKi8KKwkJaWYgKHJlbWFpbmluZyA+PSA4KSB7CisJCQkvKiBTdG9yZSB0aGUgNjQtYml0IGNvdW50ZXIgb2YgYml0cyBpbiB0aGUgYnVmZmVyICovCisJCQl1aW50NjRfdCB0ID0gY3R4LT50b3RhbDY0IDw8IDM7CisJCQlpZiAoc3dhcF9uZWVkZWQpCisJCQkJdCA9IGJiX2Jzd2FwXzY0KHQpOworCQkJLyogd2J1ZmZlciBpcyBzdWl0YWJseSBhbGlnbmVkIGZvciB0aGlzICovCisJCQkqKHVpbnQ2NF90ICopICgmY3R4LT53YnVmZmVyWzY0IC0gOF0pID0gdDsKKwkJfQorCQljdHgtPnByb2Nlc3NfYmxvY2soY3R4KTsKKwkJaWYgKHJlbWFpbmluZyA+PSA4KQorCQkJYnJlYWs7CisJCWJ1ZnBvcyA9IDA7CisJfQorfQorCisKKy8qCisgKiBDb21wdXRlIE1ENSBjaGVja3N1bSBvZiBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUKKyAqIGRlZmluaXRpb24gb2YgTUQ1IGluIFJGQyAxMzIxIGZyb20gQXByaWwgMTk5Mi4KKyAqCisgKiBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYW51ZWwgTm92b2EgSUlJCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTC4gTWNHcmF0aAorICogQ29weXJpZ2h0IChDKSAyMDAzIEVyaWsgQW5kZXJzZW4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIDA6IGZhc3Rlc3QsIDM6IHNtYWxsZXN0ICovCisjaWYgQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEIDwgMAorIyBkZWZpbmUgTUQ1X1NJWkVfVlNfU1BFRUQgMAorI2VsaWYgQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEID4gMworIyBkZWZpbmUgTUQ1X1NJWkVfVlNfU1BFRUQgMworI2Vsc2UKKyMgZGVmaW5lIE1ENV9TSVpFX1ZTX1NQRUVEIENPTkZJR19NRDVfU0laRV9WU19TUEVFRAorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSB0aGUgZm91ciBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgZm91ciBzdGVwcyBvZiB0aGUgTUQ1IGFsZ29yaXRobQorICogYW5kIGRlZmluZWQgaW4gdGhlIFJGQyAxMzIxLiAgVGhlIGZpcnN0IGZ1bmN0aW9uIGlzIGEgbGl0dGxlIGJpdCBvcHRpbWl6ZWQKKyAqIChhcyBmb3VuZCBpbiBDb2xpbiBQbHVtYnMgcHVibGljIGRvbWFpbiBpbXBsZW1lbnRhdGlvbikuCisgKiAjZGVmaW5lIEZGKGIsIGMsIGQpICgoYiAmIGMpIHwgKH5iICYgZCkpCisgKi8KKyN1bmRlZiBGRgorI3VuZGVmIEZHCisjdW5kZWYgRkgKKyN1bmRlZiBGSQorI2RlZmluZSBGRihiLCBjLCBkKSAoZCBeIChiICYgKGMgXiBkKSkpCisjZGVmaW5lIEZHKGIsIGMsIGQpIEZGKGQsIGIsIGMpCisjZGVmaW5lIEZIKGIsIGMsIGQpIChiIF4gYyBeIGQpCisjZGVmaW5lIEZJKGIsIGMsIGQpIChjIF4gKGIgfCB+ZCkpCisKKy8qIEhhc2ggYSBzaW5nbGUgYmxvY2ssIDY0IGJ5dGVzIGxvbmcgYW5kIDQtYnl0ZSBhbGlnbmVkICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgbWQ1X3Byb2Nlc3NfYmxvY2s2NChtZDVfY3R4X3QgKmN0eCkKK3sKKyNpZiBNRDVfU0laRV9WU19TUEVFRCA+IDAKKwkvKiBCZWZvcmUgd2Ugc3RhcnQsIG9uZSB3b3JkIHRvIHRoZSBzdHJhbmdlIGNvbnN0YW50cy4KKwkgICBUaGV5IGFyZSBkZWZpbmVkIGluIFJGQyAxMzIxIGFzCisJICAgVFtpXSA9IChpbnQpKDQyOTQ5NjcyOTYuMCAqIGZhYnMoc2luKGkpKSksIGk9MS4uNjQKKwkgKi8KKwlzdGF0aWMgY29uc3QgdWludDMyX3QgQ19hcnJheVtdID0geworCQkvKiByb3VuZCAxICovCisJCTB4ZDc2YWE0NzgsIDB4ZThjN2I3NTYsIDB4MjQyMDcwZGIsIDB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsIDB4NDc4N2M2MmEsIDB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsIDB4OGI0NGY3YWYsIDB4ZmZmZjViYjEsIDB4ODk1Y2Q3YmUsCisJCTB4NmI5MDExMjIsIDB4ZmQ5ODcxOTMsIDB4YTY3OTQzOGUsIDB4NDliNDA4MjEsCisJCS8qIHJvdW5kIDIgKi8KKwkJMHhmNjFlMjU2MiwgMHhjMDQwYjM0MCwgMHgyNjVlNWE1MSwgMHhlOWI2YzdhYSwKKwkJMHhkNjJmMTA1ZCwgMHgwMjQ0MTQ1MywgMHhkOGExZTY4MSwgMHhlN2QzZmJjOCwKKwkJMHgyMWUxY2RlNiwgMHhjMzM3MDdkNiwgMHhmNGQ1MGQ4NywgMHg0NTVhMTRlZCwKKwkJMHhhOWUzZTkwNSwgMHhmY2VmYTNmOCwgMHg2NzZmMDJkOSwgMHg4ZDJhNGM4YSwKKwkJLyogcm91bmQgMyAqLworCQkweGZmZmEzOTQyLCAweDg3NzFmNjgxLCAweDZkOWQ2MTIyLCAweGZkZTUzODBjLAorCQkweGE0YmVlYTQ0LCAweDRiZGVjZmE5LCAweGY2YmI0YjYwLCAweGJlYmZiYzcwLAorCQkweDI4OWI3ZWM2LCAweGVhYTEyN2ZhLCAweGQ0ZWYzMDg1LCAweDQ4ODFkMDUsCisJCTB4ZDlkNGQwMzksIDB4ZTZkYjk5ZTUsIDB4MWZhMjdjZjgsIDB4YzRhYzU2NjUsCisJCS8qIHJvdW5kIDQgKi8KKwkJMHhmNDI5MjI0NCwgMHg0MzJhZmY5NywgMHhhYjk0MjNhNywgMHhmYzkzYTAzOSwKKwkJMHg2NTViNTljMywgMHg4ZjBjY2M5MiwgMHhmZmVmZjQ3ZCwgMHg4NTg0NWRkMSwKKwkJMHg2ZmE4N2U0ZiwgMHhmZTJjZTZlMCwgMHhhMzAxNDMxNCwgMHg0ZTA4MTFhMSwKKwkJMHhmNzUzN2U4MiwgMHhiZDNhZjIzNSwgMHgyYWQ3ZDJiYiwgMHhlYjg2ZDM5MQorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgUF9hcnJheVtdIEFMSUdOMSA9IHsKKyMgaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPiAxCisJCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC8qIDEgKi8KKyMgZW5kaWYKKwkJMSwgNiwgMTEsIDAsIDUsIDEwLCAxNSwgNCwgOSwgMTQsIDMsIDgsIDEzLCAyLCA3LCAxMiwgLyogMiAqLworCQk1LCA4LCAxMSwgMTQsIDEsIDQsIDcsIDEwLCAxMywgMCwgMywgNiwgOSwgMTIsIDE1LCAyLCAvKiAzICovCisJCTAsIDcsIDE0LCA1LCAxMiwgMywgMTAsIDEsIDgsIDE1LCA2LCAxMywgNCwgMTEsIDIsIDkgIC8qIDQgKi8KKwl9OworI2VuZGlmCisJdWludDMyX3QgKndvcmRzID0gKHZvaWQqKSBjdHgtPndidWZmZXI7CisJdWludDMyX3QgQSA9IGN0eC0+aGFzaFswXTsKKwl1aW50MzJfdCBCID0gY3R4LT5oYXNoWzFdOworCXVpbnQzMl90IEMgPSBjdHgtPmhhc2hbMl07CisJdWludDMyX3QgRCA9IGN0eC0+aGFzaFszXTsKKworI2lmIE1ENV9TSVpFX1ZTX1NQRUVEID49IDIgIC8qIDIgb3IgMyAqLworCisJc3RhdGljIGNvbnN0IGNoYXIgU19hcnJheVtdIEFMSUdOMSA9IHsKKwkJNywgMTIsIDE3LCAyMiwKKwkJNSwgOSwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorCQk2LCAxMCwgMTUsIDIxCisJfTsKKwljb25zdCB1aW50MzJfdCAqcGM7CisJY29uc3QgY2hhciAqcHA7CisJY29uc3QgY2hhciAqcHM7CisJaW50IGk7CisJdWludDMyX3QgdGVtcDsKKworIyBpZiBCQl9CSUdfRU5ESUFOCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXdvcmRzW2ldID0gU1dBUF9MRTMyKHdvcmRzW2ldKTsKKyMgZW5kaWYKKworIyBpZiBNRDVfU0laRV9WU19TUEVFRCA9PSAzCisJcGMgPSBDX2FycmF5OworCXBwID0gUF9hcnJheTsKKwlwcyA9IFNfYXJyYXkgLSA0OworCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJaWYgKChpICYgMHgwZikgPT0gMCkKKwkJCXBzICs9IDQ7CisJCXRlbXAgPSBBOworCQlzd2l0Y2ggKGkgPj4gNCkgeworCQljYXNlIDA6CisJCQl0ZW1wICs9IEZGKEIsIEMsIEQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXRlbXAgKz0gRkcoQiwgQywgRCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdGVtcCArPSBGSChCLCBDLCBEKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl0ZW1wICs9IEZJKEIsIEMsIEQpOworCQl9CisJCXRlbXAgKz0gd29yZHNbKGludCkgKCpwcCsrKV0gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IEI7CisJCUEgPSBEOworCQlEID0gQzsKKwkJQyA9IEI7CisJCUIgPSB0ZW1wOworCX0KKyMgZWxzZSAgLyogTUQ1X1NJWkVfVlNfU1BFRUQgPT0gMiAqLworCXBjID0gQ19hcnJheTsKKwlwcCA9IFBfYXJyYXk7CisJcHMgPSBTX2FycmF5OworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdGVtcCA9IEEgKyBGRihCLCBDLCBEKSArIHdvcmRzWyhpbnQpICgqcHArKyldICsgKnBjKys7CisJCXRlbXAgPSByb3RsMzIodGVtcCwgcHNbaSAmIDNdKTsKKwkJdGVtcCArPSBCOworCQlBID0gRDsKKwkJRCA9IEM7CisJCUMgPSBCOworCQlCID0gdGVtcDsKKwl9CisJcHMgKz0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl0ZW1wID0gQSArIEZHKEIsIEMsIEQpICsgd29yZHNbKGludCkgKCpwcCsrKV0gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IEI7CisJCUEgPSBEOworCQlEID0gQzsKKwkJQyA9IEI7CisJCUIgPSB0ZW1wOworCX0KKwlwcyArPSA0OworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXRlbXAgPSBBICsgRkgoQiwgQywgRCkgKyB3b3Jkc1soaW50KSAoKnBwKyspXSArICpwYysrOworCQl0ZW1wID0gcm90bDMyKHRlbXAsIHBzW2kgJiAzXSk7CisJCXRlbXAgKz0gQjsKKwkJQSA9IEQ7CisJCUQgPSBDOworCQlDID0gQjsKKwkJQiA9IHRlbXA7CisJfQorCXBzICs9IDQ7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdGVtcCA9IEEgKyBGSShCLCBDLCBEKSArIHdvcmRzWyhpbnQpICgqcHArKyldICsgKnBjKys7CisJCXRlbXAgPSByb3RsMzIodGVtcCwgcHNbaSAmIDNdKTsKKwkJdGVtcCArPSBCOworCQlBID0gRDsKKwkJRCA9IEM7CisJCUMgPSBCOworCQlCID0gdGVtcDsKKwl9CisjIGVuZGlmCisJLyogQWRkIGNoZWNrc3VtIHRvIHRoZSBzdGFydGluZyB2YWx1ZXMgKi8KKwljdHgtPmhhc2hbMF0gKz0gQTsKKwljdHgtPmhhc2hbMV0gKz0gQjsKKwljdHgtPmhhc2hbMl0gKz0gQzsKKwljdHgtPmhhc2hbM10gKz0gRDsKKworI2Vsc2UgIC8qIE1ENV9TSVpFX1ZTX1NQRUVEID09IDAgb3IgMSAqLworCisJdWludDMyX3QgQV9zYXZlID0gQTsKKwl1aW50MzJfdCBCX3NhdmUgPSBCOworCXVpbnQzMl90IENfc2F2ZSA9IEM7CisJdWludDMyX3QgRF9zYXZlID0gRDsKKyMgaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPT0gMQorCWNvbnN0IHVpbnQzMl90ICpwYzsKKwljb25zdCBjaGFyICpwcDsKKwlpbnQgaTsKKyMgZW5kaWYKKworCS8qIEZpcnN0IHJvdW5kOiB1c2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24sIHRoZSBjb250ZXh0IGFuZCBhIGNvbnN0YW50CisJICAgdGhlIG5leHQgY29udGV4dCBpcyBjb21wdXRlZC4gIEJlY2F1c2UgdGhlIGFsZ29yaXRobSdzIHByb2Nlc3NpbmcKKwkgICB1bml0IGlzIGEgMzItYml0IHdvcmQgYW5kIGl0IGlzIGRldGVybWluZWQgdG8gd29yayBvbiB3b3JkcyBpbgorCSAgIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciB3ZSBwZXJoYXBzIGhhdmUgdG8gY2hhbmdlIHRoZSBieXRlIG9yZGVyCisJICAgYmVmb3JlIHRoZSBjb21wdXRhdGlvbi4gIFRvIHJlZHVjZSB0aGUgd29yayBmb3IgdGhlIG5leHQgc3RlcHMKKwkgICB3ZSBzYXZlIHN3YXBwZWQgd29yZHMgaW4gV09SRFMgYXJyYXkuICAqLworIyB1bmRlZiBPUAorIyBkZWZpbmUgT1AoYSwgYiwgYywgZCwgcywgVCkgXAorCWRvIHsgXAorCQlhICs9IEZGKGIsIGMsIGQpICsgKCp3b3JkcyBJRl9CSUdfRU5ESUFOKD0gU1dBUF9MRTMyKCp3b3JkcykpKSArIFQ7IFwKKwkJd29yZHMrKzsgXAorCQlhID0gcm90bDMyKGEsIHMpOyBcCisJCWEgKz0gYjsgXAorCX0gd2hpbGUgKDApCisKKwkvKiBSb3VuZCAxICovCisjIGlmIE1ENV9TSVpFX1ZTX1NQRUVEID09IDEKKwlwYyA9IENfYXJyYXk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlPUChBLCBCLCBDLCBELCA3LCAqcGMrKyk7CisJCU9QKEQsIEEsIEIsIEMsIDEyLCAqcGMrKyk7CisJCU9QKEMsIEQsIEEsIEIsIDE3LCAqcGMrKyk7CisJCU9QKEIsIEMsIEQsIEEsIDIyLCAqcGMrKyk7CisJfQorIyBlbHNlCisJT1AoQSwgQiwgQywgRCwgNywgMHhkNzZhYTQ3OCk7CisJT1AoRCwgQSwgQiwgQywgMTIsIDB4ZThjN2I3NTYpOworCU9QKEMsIEQsIEEsIEIsIDE3LCAweDI0MjA3MGRiKTsKKwlPUChCLCBDLCBELCBBLCAyMiwgMHhjMWJkY2VlZSk7CisJT1AoQSwgQiwgQywgRCwgNywgMHhmNTdjMGZhZik7CisJT1AoRCwgQSwgQiwgQywgMTIsIDB4NDc4N2M2MmEpOworCU9QKEMsIEQsIEEsIEIsIDE3LCAweGE4MzA0NjEzKTsKKwlPUChCLCBDLCBELCBBLCAyMiwgMHhmZDQ2OTUwMSk7CisJT1AoQSwgQiwgQywgRCwgNywgMHg2OTgwOThkOCk7CisJT1AoRCwgQSwgQiwgQywgMTIsIDB4OGI0NGY3YWYpOworCU9QKEMsIEQsIEEsIEIsIDE3LCAweGZmZmY1YmIxKTsKKwlPUChCLCBDLCBELCBBLCAyMiwgMHg4OTVjZDdiZSk7CisJT1AoQSwgQiwgQywgRCwgNywgMHg2YjkwMTEyMik7CisJT1AoRCwgQSwgQiwgQywgMTIsIDB4ZmQ5ODcxOTMpOworCU9QKEMsIEQsIEEsIEIsIDE3LCAweGE2Nzk0MzhlKTsKKwlPUChCLCBDLCBELCBBLCAyMiwgMHg0OWI0MDgyMSk7CisjIGVuZGlmCisJd29yZHMgLT0gMTY7CisKKwkvKiBGb3IgdGhlIHNlY29uZCB0byBmb3VydGggcm91bmQgd2UgaGF2ZSB0aGUgcG9zc2libHkgc3dhcHBlZCB3b3JkcworCSAgIGluIFdPUkRTLiAgUmVkZWZpbmUgdGhlIG1hY3JvIHRvIHRha2UgYW4gYWRkaXRpb25hbCBmaXJzdAorCSAgIGFyZ3VtZW50IHNwZWNpZnlpbmcgdGhlIGZ1bmN0aW9uIHRvIHVzZS4gICovCisjIHVuZGVmIE9QCisjIGRlZmluZSBPUChmLCBhLCBiLCBjLCBkLCBrLCBzLCBUKSBcCisJZG8geyBcCisJCWEgKz0gZihiLCBjLCBkKSArIHdvcmRzW2tdICsgVDsgXAorCQlhID0gcm90bDMyKGEsIHMpOyBcCisJCWEgKz0gYjsgXAorCX0gd2hpbGUgKDApCisKKwkvKiBSb3VuZCAyICovCisjIGlmIE1ENV9TSVpFX1ZTX1NQRUVEID09IDEKKwlwcCA9IFBfYXJyYXk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlPUChGRywgQSwgQiwgQywgRCwgKGludCkgKCpwcCsrKSwgNSwgKnBjKyspOworCQlPUChGRywgRCwgQSwgQiwgQywgKGludCkgKCpwcCsrKSwgOSwgKnBjKyspOworCQlPUChGRywgQywgRCwgQSwgQiwgKGludCkgKCpwcCsrKSwgMTQsICpwYysrKTsKKwkJT1AoRkcsIEIsIEMsIEQsIEEsIChpbnQpICgqcHArKyksIDIwLCAqcGMrKyk7CisJfQorIyBlbHNlCisJT1AoRkcsIEEsIEIsIEMsIEQsIDEsIDUsIDB4ZjYxZTI1NjIpOworCU9QKEZHLCBELCBBLCBCLCBDLCA2LCA5LCAweGMwNDBiMzQwKTsKKwlPUChGRywgQywgRCwgQSwgQiwgMTEsIDE0LCAweDI2NWU1YTUxKTsKKwlPUChGRywgQiwgQywgRCwgQSwgMCwgMjAsIDB4ZTliNmM3YWEpOworCU9QKEZHLCBBLCBCLCBDLCBELCA1LCA1LCAweGQ2MmYxMDVkKTsKKwlPUChGRywgRCwgQSwgQiwgQywgMTAsIDksIDB4MDI0NDE0NTMpOworCU9QKEZHLCBDLCBELCBBLCBCLCAxNSwgMTQsIDB4ZDhhMWU2ODEpOworCU9QKEZHLCBCLCBDLCBELCBBLCA0LCAyMCwgMHhlN2QzZmJjOCk7CisJT1AoRkcsIEEsIEIsIEMsIEQsIDksIDUsIDB4MjFlMWNkZTYpOworCU9QKEZHLCBELCBBLCBCLCBDLCAxNCwgOSwgMHhjMzM3MDdkNik7CisJT1AoRkcsIEMsIEQsIEEsIEIsIDMsIDE0LCAweGY0ZDUwZDg3KTsKKwlPUChGRywgQiwgQywgRCwgQSwgOCwgMjAsIDB4NDU1YTE0ZWQpOworCU9QKEZHLCBBLCBCLCBDLCBELCAxMywgNSwgMHhhOWUzZTkwNSk7CisJT1AoRkcsIEQsIEEsIEIsIEMsIDIsIDksIDB4ZmNlZmEzZjgpOworCU9QKEZHLCBDLCBELCBBLCBCLCA3LCAxNCwgMHg2NzZmMDJkOSk7CisJT1AoRkcsIEIsIEMsIEQsIEEsIDEyLCAyMCwgMHg4ZDJhNGM4YSk7CisjIGVuZGlmCisKKwkvKiBSb3VuZCAzICovCisjIGlmIE1ENV9TSVpFX1ZTX1NQRUVEID09IDEKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCU9QKEZILCBBLCBCLCBDLCBELCAoaW50KSAoKnBwKyspLCA0LCAqcGMrKyk7CisJCU9QKEZILCBELCBBLCBCLCBDLCAoaW50KSAoKnBwKyspLCAxMSwgKnBjKyspOworCQlPUChGSCwgQywgRCwgQSwgQiwgKGludCkgKCpwcCsrKSwgMTYsICpwYysrKTsKKwkJT1AoRkgsIEIsIEMsIEQsIEEsIChpbnQpICgqcHArKyksIDIzLCAqcGMrKyk7CisJfQorIyBlbHNlCisJT1AoRkgsIEEsIEIsIEMsIEQsIDUsIDQsIDB4ZmZmYTM5NDIpOworCU9QKEZILCBELCBBLCBCLCBDLCA4LCAxMSwgMHg4NzcxZjY4MSk7CisJT1AoRkgsIEMsIEQsIEEsIEIsIDExLCAxNiwgMHg2ZDlkNjEyMik7CisJT1AoRkgsIEIsIEMsIEQsIEEsIDE0LCAyMywgMHhmZGU1MzgwYyk7CisJT1AoRkgsIEEsIEIsIEMsIEQsIDEsIDQsIDB4YTRiZWVhNDQpOworCU9QKEZILCBELCBBLCBCLCBDLCA0LCAxMSwgMHg0YmRlY2ZhOSk7CisJT1AoRkgsIEMsIEQsIEEsIEIsIDcsIDE2LCAweGY2YmI0YjYwKTsKKwlPUChGSCwgQiwgQywgRCwgQSwgMTAsIDIzLCAweGJlYmZiYzcwKTsKKwlPUChGSCwgQSwgQiwgQywgRCwgMTMsIDQsIDB4Mjg5YjdlYzYpOworCU9QKEZILCBELCBBLCBCLCBDLCAwLCAxMSwgMHhlYWExMjdmYSk7CisJT1AoRkgsIEMsIEQsIEEsIEIsIDMsIDE2LCAweGQ0ZWYzMDg1KTsKKwlPUChGSCwgQiwgQywgRCwgQSwgNiwgMjMsIDB4MDQ4ODFkMDUpOworCU9QKEZILCBBLCBCLCBDLCBELCA5LCA0LCAweGQ5ZDRkMDM5KTsKKwlPUChGSCwgRCwgQSwgQiwgQywgMTIsIDExLCAweGU2ZGI5OWU1KTsKKwlPUChGSCwgQywgRCwgQSwgQiwgMTUsIDE2LCAweDFmYTI3Y2Y4KTsKKwlPUChGSCwgQiwgQywgRCwgQSwgMiwgMjMsIDB4YzRhYzU2NjUpOworIyBlbmRpZgorCisJLyogUm91bmQgNCAqLworIyBpZiBNRDVfU0laRV9WU19TUEVFRCA9PSAxCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlPUChGSSwgQSwgQiwgQywgRCwgKGludCkgKCpwcCsrKSwgNiwgKnBjKyspOworCQlPUChGSSwgRCwgQSwgQiwgQywgKGludCkgKCpwcCsrKSwgMTAsICpwYysrKTsKKwkJT1AoRkksIEMsIEQsIEEsIEIsIChpbnQpICgqcHArKyksIDE1LCAqcGMrKyk7CisJCU9QKEZJLCBCLCBDLCBELCBBLCAoaW50KSAoKnBwKyspLCAyMSwgKnBjKyspOworCX0KKyMgZWxzZQorCU9QKEZJLCBBLCBCLCBDLCBELCAwLCA2LCAweGY0MjkyMjQ0KTsKKwlPUChGSSwgRCwgQSwgQiwgQywgNywgMTAsIDB4NDMyYWZmOTcpOworCU9QKEZJLCBDLCBELCBBLCBCLCAxNCwgMTUsIDB4YWI5NDIzYTcpOworCU9QKEZJLCBCLCBDLCBELCBBLCA1LCAyMSwgMHhmYzkzYTAzOSk7CisJT1AoRkksIEEsIEIsIEMsIEQsIDEyLCA2LCAweDY1NWI1OWMzKTsKKwlPUChGSSwgRCwgQSwgQiwgQywgMywgMTAsIDB4OGYwY2NjOTIpOworCU9QKEZJLCBDLCBELCBBLCBCLCAxMCwgMTUsIDB4ZmZlZmY0N2QpOworCU9QKEZJLCBCLCBDLCBELCBBLCAxLCAyMSwgMHg4NTg0NWRkMSk7CisJT1AoRkksIEEsIEIsIEMsIEQsIDgsIDYsIDB4NmZhODdlNGYpOworCU9QKEZJLCBELCBBLCBCLCBDLCAxNSwgMTAsIDB4ZmUyY2U2ZTApOworCU9QKEZJLCBDLCBELCBBLCBCLCA2LCAxNSwgMHhhMzAxNDMxNCk7CisJT1AoRkksIEIsIEMsIEQsIEEsIDEzLCAyMSwgMHg0ZTA4MTFhMSk7CisJT1AoRkksIEEsIEIsIEMsIEQsIDQsIDYsIDB4Zjc1MzdlODIpOworCU9QKEZJLCBELCBBLCBCLCBDLCAxMSwgMTAsIDB4YmQzYWYyMzUpOworCU9QKEZJLCBDLCBELCBBLCBCLCAyLCAxNSwgMHgyYWQ3ZDJiYik7CisJT1AoRkksIEIsIEMsIEQsIEEsIDksIDIxLCAweGViODZkMzkxKTsKKyMgdW5kZWYgT1AKKyMgZW5kaWYKKwkvKiBBZGQgY2hlY2tzdW0gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlcyAqLworCWN0eC0+aGFzaFswXSA9IEFfc2F2ZSArIEE7CisJY3R4LT5oYXNoWzFdID0gQl9zYXZlICsgQjsKKwljdHgtPmhhc2hbMl0gPSBDX3NhdmUgKyBDOworCWN0eC0+aGFzaFszXSA9IERfc2F2ZSArIEQ7CisjZW5kaWYKK30KKyN1bmRlZiBGRgorI3VuZGVmIEZHCisjdW5kZWYgRkgKKyN1bmRlZiBGSQorCisvKiBJbml0aWFsaXplIHN0cnVjdHVyZSBjb250YWluaW5nIHN0YXRlIG9mIGNvbXB1dGF0aW9uLgorICogKFJGQyAxMzIxLCAzLjM6IFN0ZXAgMykKKyAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2JlZ2luKG1kNV9jdHhfdCAqY3R4KQoreworCWN0eC0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKKwljdHgtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCWN0eC0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJY3R4LT50b3RhbDY0ID0gMDsKKwljdHgtPnByb2Nlc3NfYmxvY2sgPSBtZDVfcHJvY2Vzc19ibG9jazY0OworfQorCisvKiBVc2VkIGFsc28gZm9yIHNoYTEgYW5kIHNoYTI1NiAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2hhc2gobWQ1X2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwljb21tb242NF9oYXNoKGN0eCwgYnVmZmVyLCBsZW4pOworfQorCisvKiBQcm9jZXNzIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBhbmQgcHV0IHJlc3VsdCBmcm9tIENUWAorICogaW4gZmlyc3QgMTYgYnl0ZXMgZm9sbG93aW5nIFJFU0JVRi4gIFRoZSByZXN1bHQgaXMgYWx3YXlzIGluIGxpdHRsZQorICogZW5kaWFuIGJ5dGUgb3JkZXIsIHNvIHRoYXQgYSBieXRlLXdpc2Ugb3V0cHV0IHlpZWxkcyB0byB0aGUgd2FudGVkCisgKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBkaWdlc3QuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIG1kNV9lbmQobWQ1X2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikKK3sKKwkvKiBNRDUgc3RvcmVzIHRvdGFsIGluIExFLCBuZWVkIHRvIHN3YXAgb24gQkUgYXJjaGVzOiAqLworCWNvbW1vbjY0X2VuZChjdHgsIC8qc3dhcF9uZWVkZWQ6Ki8gQkJfQklHX0VORElBTik7CisKKwkvKiBUaGUgTUQ1IHJlc3VsdCBpcyBpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KKyNpZiBCQl9CSUdfRU5ESUFOCisJY3R4LT5oYXNoWzBdID0gU1dBUF9MRTMyKGN0eC0+aGFzaFswXSk7CisJY3R4LT5oYXNoWzFdID0gU1dBUF9MRTMyKGN0eC0+aGFzaFsxXSk7CisJY3R4LT5oYXNoWzJdID0gU1dBUF9MRTMyKGN0eC0+aGFzaFsyXSk7CisJY3R4LT5oYXNoWzNdID0gU1dBUF9MRTMyKGN0eC0+aGFzaFszXSk7CisjZW5kaWYKKwltZW1jcHkocmVzYnVmLCBjdHgtPmhhc2gsIHNpemVvZihjdHgtPmhhc2hbMF0pICogNCk7Cit9CisKKworLyoKKyAqIFNIQTEgcGFydCBpczoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogQmFzZWQgb24gdGhlIHB1YmxpYyBkb21haW4gU0hBLTEgaW4gQyBieSBTdGV2ZSBSZWlkIDxzdGV2ZUBlZG13ZWIuY29tPgorICogZnJvbSBodHRwOi8vd3d3Lm1pcnJvcnMud2lyZXRhcHBlZC5uZXQvc2VjdXJpdHkvY3J5cHRvZ3JhcGh5L2hhc2hlcy9zaGExLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU0hBMjU2IGFuZCBTSEE1MTIgcGFydHMgYXJlOgorICogUmVsZWFzZWQgaW50byB0aGUgUHVibGljIERvbWFpbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPi4KKyAqIFNocmFuayBieSBEZW55cyBWbGFzZW5rby4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgYmVzdCB3YXkgdG8gdGVzdCByYW5kb20gYmxvY2tzaXplcyBpcyB0byBnbyB0byBjb3JldXRpbHMvbWQ1X3NoYTFfc3VtLmMKKyAqIGFuZCByZXBsYWNlICI0MDk2IiB3aXRoIHNvbWV0aGluZyBsaWtlICIyMDAwICsgdGltZShOVUxMKSAlIDIwOTciLAorICogdGhlbiByZWJ1aWxkIGFuZCBjb21wYXJlICJzaGFOTk5zdW0gYmlnZmlsZSIgcmVzdWx0cy4KKyAqLworCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgc2hhMV9wcm9jZXNzX2Jsb2NrNjQoc2hhMV9jdHhfdCAqY3R4KQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCByY29uc3RzW10gPSB7CisJCTB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsIDB4OEYxQkJDREMsIDB4Q0E2MkMxRDYKKwl9OworCWludCBpLCBqOworCWludCBjbnQ7CisJdWludDMyX3QgV1sxNisxNl07CisJdWludDMyX3QgYSwgYiwgYywgZCwgZTsKKworCS8qIE9uLXN0YWNrIHdvcmsgYnVmZmVyIGZyZWVzIHVwIG9uZSByZWdpc3RlciBpbiB0aGUgbWFpbiBsb29wCisJICogd2hpY2ggb3RoZXJ3aXNlIHdpbGwgYmUgbmVlZGVkIHRvIGhvbGQgY3R4IHBvaW50ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJV1tpXSA9IFdbaSsxNl0gPSBTV0FQX0JFMzIoKCh1aW50MzJfdCopY3R4LT53YnVmZmVyKVtpXSk7CisKKwlhID0gY3R4LT5oYXNoWzBdOworCWIgPSBjdHgtPmhhc2hbMV07CisJYyA9IGN0eC0+aGFzaFsyXTsKKwlkID0gY3R4LT5oYXNoWzNdOworCWUgPSBjdHgtPmhhc2hbNF07CisKKwkvKiA0IHJvdW5kcyBvZiAyMCBvcGVyYXRpb25zIGVhY2ggKi8KKwljbnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaiA9IDE5OworCQlkbyB7CisJCQl1aW50MzJfdCB3b3JrOworCisJCQl3b3JrID0gYyBeIGQ7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJd29yayA9ICh3b3JrICYgYikgXiBkOworCQkJCWlmIChqIDw9IDMpCisJCQkJCWdvdG8gZ2UxNjsKKwkJCQkvKiBVc2VkIHRvIGRvIFNXQVBfQkUzMiBoZXJlLCBidXQgdGhpcworCQkJCSAqIHJlcXVpcmVzIGN0eCAoc2VlIGNvbW1lbnQgYWJvdmUpICovCisJCQkJd29yayArPSBXW2NudF07CisJCQl9IGVsc2UgeworCQkJCWlmIChpID09IDIpCisJCQkJCXdvcmsgPSAoKGIgfCBjKSAmIGQpIHwgKGIgJiBjKTsKKwkJCQllbHNlIC8qIGkgPSAxIG9yIDMgKi8KKwkJCQkJd29yayBePSBiOworIGdlMTY6CisJCQkJV1tjbnRdID0gV1tjbnQrMTZdID0gcm90bDMyKFdbY250KzEzXSBeIFdbY250KzhdIF4gV1tjbnQrMl0gXiBXW2NudF0sIDEpOworCQkJCXdvcmsgKz0gV1tjbnRdOworCQkJfQorCQkJd29yayArPSBlICsgcm90bDMyKGEsIDUpICsgcmNvbnN0c1tpXTsKKworCQkJLyogUm90YXRlIGJ5IG9uZSBmb3IgbmV4dCB0aW1lICovCisJCQllID0gZDsKKwkJCWQgPSBjOworCQkJYyA9IC8qIGIgPSAqLyByb3RsMzIoYiwgMzApOworCQkJYiA9IGE7CisJCQlhID0gd29yazsKKwkJCWNudCA9IChjbnQgKyAxKSAmIDE1OworCQl9IHdoaWxlICgtLWogPj0gMCk7CisJfQorCisJY3R4LT5oYXNoWzBdICs9IGE7CisJY3R4LT5oYXNoWzFdICs9IGI7CisJY3R4LT5oYXNoWzJdICs9IGM7CisJY3R4LT5oYXNoWzNdICs9IGQ7CisJY3R4LT5oYXNoWzRdICs9IGU7Cit9CisKKy8qIENvbnN0YW50cyBmb3IgU0hBNTEyIGZyb20gRklQUyAxODAtMjo0LjIuMy4KKyAqIFNIQTI1NiBjb25zdGFudHMgZnJvbSBGSVBTIDE4MC0yOjQuMi4yCisgKiBhcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaGFsZiBvZiBmaXJzdCA2NCBlbGVtZW50cworICogb2YgdGhlIHNhbWUgYXJyYXkuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50NjRfdCBzaGFfS1s4MF0gPSB7CisJMHg0MjhhMmY5OGQ3MjhhZTIyVUxMLCAweDcxMzc0NDkxMjNlZjY1Y2RVTEwsCisJMHhiNWMwZmJjZmVjNGQzYjJmVUxMLCAweGU5YjVkYmE1ODE4OWRiYmNVTEwsCisJMHgzOTU2YzI1YmYzNDhiNTM4VUxMLCAweDU5ZjExMWYxYjYwNWQwMTlVTEwsCisJMHg5MjNmODJhNGFmMTk0ZjliVUxMLCAweGFiMWM1ZWQ1ZGE2ZDgxMThVTEwsCisJMHhkODA3YWE5OGEzMDMwMjQyVUxMLCAweDEyODM1YjAxNDU3MDZmYmVVTEwsCisJMHgyNDMxODViZTRlZTRiMjhjVUxMLCAweDU1MGM3ZGMzZDVmZmI0ZTJVTEwsCisJMHg3MmJlNWQ3NGYyN2I4OTZmVUxMLCAweDgwZGViMWZlM2IxNjk2YjFVTEwsCisJMHg5YmRjMDZhNzI1YzcxMjM1VUxMLCAweGMxOWJmMTc0Y2Y2OTI2OTRVTEwsCisJMHhlNDliNjljMTllZjE0YWQyVUxMLCAweGVmYmU0Nzg2Mzg0ZjI1ZTNVTEwsCisJMHgwZmMxOWRjNjhiOGNkNWI1VUxMLCAweDI0MGNhMWNjNzdhYzljNjVVTEwsCisJMHgyZGU5MmM2ZjU5MmIwMjc1VUxMLCAweDRhNzQ4NGFhNmVhNmU0ODNVTEwsCisJMHg1Y2IwYTlkY2JkNDFmYmQ0VUxMLCAweDc2Zjk4OGRhODMxMTUzYjVVTEwsCisJMHg5ODNlNTE1MmVlNjZkZmFiVUxMLCAweGE4MzFjNjZkMmRiNDMyMTBVTEwsCisJMHhiMDAzMjdjODk4ZmIyMTNmVUxMLCAweGJmNTk3ZmM3YmVlZjBlZTRVTEwsCisJMHhjNmUwMGJmMzNkYTg4ZmMyVUxMLCAweGQ1YTc5MTQ3OTMwYWE3MjVVTEwsCisJMHgwNmNhNjM1MWUwMDM4MjZmVUxMLCAweDE0MjkyOTY3MGEwZTZlNzBVTEwsCisJMHgyN2I3MGE4NTQ2ZDIyZmZjVUxMLCAweDJlMWIyMTM4NWMyNmM5MjZVTEwsCisJMHg0ZDJjNmRmYzVhYzQyYWVkVUxMLCAweDUzMzgwZDEzOWQ5NWIzZGZVTEwsCisJMHg2NTBhNzM1NDhiYWY2M2RlVUxMLCAweDc2NmEwYWJiM2M3N2IyYThVTEwsCisJMHg4MWMyYzkyZTQ3ZWRhZWU2VUxMLCAweDkyNzIyYzg1MTQ4MjM1M2JVTEwsCisJMHhhMmJmZThhMTRjZjEwMzY0VUxMLCAweGE4MWE2NjRiYmM0MjMwMDFVTEwsCisJMHhjMjRiOGI3MGQwZjg5NzkxVUxMLCAweGM3NmM1MWEzMDY1NGJlMzBVTEwsCisJMHhkMTkyZTgxOWQ2ZWY1MjE4VUxMLCAweGQ2OTkwNjI0NTU2NWE5MTBVTEwsCisJMHhmNDBlMzU4NTU3NzEyMDJhVUxMLCAweDEwNmFhMDcwMzJiYmQxYjhVTEwsCisJMHgxOWE0YzExNmI4ZDJkMGM4VUxMLCAweDFlMzc2YzA4NTE0MWFiNTNVTEwsCisJMHgyNzQ4Nzc0Y2RmOGVlYjk5VUxMLCAweDM0YjBiY2I1ZTE5YjQ4YThVTEwsCisJMHgzOTFjMGNiM2M1Yzk1YTYzVUxMLCAweDRlZDhhYTRhZTM0MThhY2JVTEwsCisJMHg1YjljY2E0Zjc3NjNlMzczVUxMLCAweDY4MmU2ZmYzZDZiMmI4YTNVTEwsCisJMHg3NDhmODJlZTVkZWZiMmZjVUxMLCAweDc4YTU2MzZmNDMxNzJmNjBVTEwsCisJMHg4NGM4NzgxNGExZjBhYjcyVUxMLCAweDhjYzcwMjA4MWE2NDM5ZWNVTEwsCisJMHg5MGJlZmZmYTIzNjMxZTI4VUxMLCAweGE0NTA2Y2ViZGU4MmJkZTlVTEwsCisJMHhiZWY5YTNmN2IyYzY3OTE1VUxMLCAweGM2NzE3OGYyZTM3MjUzMmJVTEwsCisJMHhjYTI3M2VjZWVhMjY2MTljVUxMLCAweGQxODZiOGM3MjFjMGMyMDdVTEwsIC8qIFs2NF0rIGFyZSB1c2VkIGZvciBzaGE1MTIgb25seSAqLworCTB4ZWFkYTdkZDZjZGUwZWIxZVVMTCwgMHhmNTdkNGY3ZmVlNmVkMTc4VUxMLAorCTB4MDZmMDY3YWE3MjE3NmZiYVVMTCwgMHgwYTYzN2RjNWEyYzg5OGE2VUxMLAorCTB4MTEzZjk4MDRiZWY5MGRhZVVMTCwgMHgxYjcxMGIzNTEzMWM0NzFiVUxMLAorCTB4MjhkYjc3ZjUyMzA0N2Q4NFVMTCwgMHgzMmNhYWI3YjQwYzcyNDkzVUxMLAorCTB4M2M5ZWJlMGExNWM5YmViY1VMTCwgMHg0MzFkNjdjNDljMTAwZDRjVUxMLAorCTB4NGNjNWQ0YmVjYjNlNDJiNlVMTCwgMHg1OTdmMjk5Y2ZjNjU3ZTJhVUxMLAorCTB4NWZjYjZmYWIzYWQ2ZmFlY1VMTCwgMHg2YzQ0MTk4YzRhNDc1ODE3VUxMCit9OworCisjdW5kZWYgQ2gKKyN1bmRlZiBNYWoKKyN1bmRlZiBTMAorI3VuZGVmIFMxCisjdW5kZWYgUjAKKyN1bmRlZiBSMQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgc2hhMjU2X3Byb2Nlc3NfYmxvY2s2NChzaGEyNTZfY3R4X3QgKmN0eCkKK3sKKwl1bnNpZ25lZCB0OworCXVpbnQzMl90IFdbNjRdLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoOworCWNvbnN0IHVpbnQzMl90ICp3b3JkcyA9ICh1aW50MzJfdCopIGN0eC0+d2J1ZmZlcjsKKworCS8qIE9wZXJhdG9ycyBkZWZpbmVkIGluIEZJUFMgMTgwLTI6NC4xLjIuICAqLworI2RlZmluZSBDaCh4LCB5LCB6KSAoKHggJiB5KSBeICh+eCAmIHopKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSkKKyNkZWZpbmUgUzAoeCkgKHJvdHIzMih4LCAyKSBeIHJvdHIzMih4LCAxMykgXiByb3RyMzIoeCwgMjIpKQorI2RlZmluZSBTMSh4KSAocm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSkpCisjZGVmaW5lIFIwKHgpIChyb3RyMzIoeCwgNykgXiByb3RyMzIoeCwgMTgpIF4gKHggPj4gMykpCisjZGVmaW5lIFIxKHgpIChyb3RyMzIoeCwgMTcpIF4gcm90cjMyKHgsIDE5KSBeICh4ID4+IDEwKSkKKworCS8qIENvbXB1dGUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4yLjIgc3RlcCAyLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgMTY7ICsrdCkKKwkJV1t0XSA9IFNXQVBfQkUzMih3b3Jkc1t0XSk7CisJZm9yICgvKnQgPSAxNiovOyB0IDwgNjQ7ICsrdCkKKwkJV1t0XSA9IFIxKFdbdCAtIDJdKSArIFdbdCAtIDddICsgUjAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XTsKKworCWEgPSBjdHgtPmhhc2hbMF07CisJYiA9IGN0eC0+aGFzaFsxXTsKKwljID0gY3R4LT5oYXNoWzJdOworCWQgPSBjdHgtPmhhc2hbM107CisJZSA9IGN0eC0+aGFzaFs0XTsKKwlmID0gY3R4LT5oYXNoWzVdOworCWcgPSBjdHgtPmhhc2hbNl07CisJaCA9IGN0eC0+aGFzaFs3XTsKKworCS8qIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4yLjIgc3RlcCAzLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgNjQ7ICsrdCkgeworCQkvKiBOZWVkIHRvIGZldGNoIHVwcGVyIGhhbGYgb2Ygc2hhX0tbdF0KKwkJICogKEkgaG9wZSBjb21waWxlciBpcyBjbGV2ZXIgZW5vdWdoIHRvIGp1c3QgZmV0Y2gKKwkJICogdXBwZXIgaGFsZikKKwkJICovCisJCXVpbnQzMl90IEtfdCA9IHNoYV9LW3RdID4+IDMyOworCQl1aW50MzJfdCBUMSA9IGggKyBTMShlKSArIENoKGUsIGYsIGcpICsgS190ICsgV1t0XTsKKwkJdWludDMyX3QgVDIgPSBTMChhKSArIE1haihhLCBiLCBjKTsKKwkJaCA9IGc7CisJCWcgPSBmOworCQlmID0gZTsKKwkJZSA9IGQgKyBUMTsKKwkJZCA9IGM7CisJCWMgPSBiOworCQliID0gYTsKKwkJYSA9IFQxICsgVDI7CisJfQorI3VuZGVmIENoCisjdW5kZWYgTWFqCisjdW5kZWYgUzAKKyN1bmRlZiBTMQorI3VuZGVmIFIwCisjdW5kZWYgUjEKKwkvKiBBZGQgdGhlIHN0YXJ0aW5nIHZhbHVlcyBvZiB0aGUgY29udGV4dCBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjIuMgorCSAgIHN0ZXAgNC4gICovCisJY3R4LT5oYXNoWzBdICs9IGE7CisJY3R4LT5oYXNoWzFdICs9IGI7CisJY3R4LT5oYXNoWzJdICs9IGM7CisJY3R4LT5oYXNoWzNdICs9IGQ7CisJY3R4LT5oYXNoWzRdICs9IGU7CisJY3R4LT5oYXNoWzVdICs9IGY7CisJY3R4LT5oYXNoWzZdICs9IGc7CisJY3R4LT5oYXNoWzddICs9IGg7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBzaGE1MTJfcHJvY2Vzc19ibG9jazEyOChzaGE1MTJfY3R4X3QgKmN0eCkKK3sKKwl1bnNpZ25lZCB0OworCXVpbnQ2NF90IFdbODBdOworCS8qIE9uIGkzODYsIGhhdmluZyBhc3NpZ25tZW50cyBoZXJlIChub3QgbGF0ZXIgYXMgc2hhMjU2IGRvZXMpCisJICogcHJvZHVjZXMgOTkgYnl0ZXMgc21hbGxlciBjb2RlIHdpdGggZ2NjIDQuMy4xCisJICovCisJdWludDY0X3QgYSA9IGN0eC0+aGFzaFswXTsKKwl1aW50NjRfdCBiID0gY3R4LT5oYXNoWzFdOworCXVpbnQ2NF90IGMgPSBjdHgtPmhhc2hbMl07CisJdWludDY0X3QgZCA9IGN0eC0+aGFzaFszXTsKKwl1aW50NjRfdCBlID0gY3R4LT5oYXNoWzRdOworCXVpbnQ2NF90IGYgPSBjdHgtPmhhc2hbNV07CisJdWludDY0X3QgZyA9IGN0eC0+aGFzaFs2XTsKKwl1aW50NjRfdCBoID0gY3R4LT5oYXNoWzddOworCWNvbnN0IHVpbnQ2NF90ICp3b3JkcyA9ICh1aW50NjRfdCopIGN0eC0+d2J1ZmZlcjsKKworCS8qIE9wZXJhdG9ycyBkZWZpbmVkIGluIEZJUFMgMTgwLTI6NC4xLjIuICAqLworI2RlZmluZSBDaCh4LCB5LCB6KSAoKHggJiB5KSBeICh+eCAmIHopKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSkKKyNkZWZpbmUgUzAoeCkgKHJvdHI2NCh4LCAyOCkgXiByb3RyNjQoeCwgMzQpIF4gcm90cjY0KHgsIDM5KSkKKyNkZWZpbmUgUzEoeCkgKHJvdHI2NCh4LCAxNCkgXiByb3RyNjQoeCwgMTgpIF4gcm90cjY0KHgsIDQxKSkKKyNkZWZpbmUgUjAoeCkgKHJvdHI2NCh4LCAxKSBeIHJvdHI2NCh4LCA4KSBeICh4ID4+IDcpKQorI2RlZmluZSBSMSh4KSAocm90cjY0KHgsIDE5KSBeIHJvdHI2NCh4LCA2MSkgXiAoeCA+PiA2KSkKKworCS8qIENvbXB1dGUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4zLjIgc3RlcCAyLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgMTY7ICsrdCkKKwkJV1t0XSA9IFNXQVBfQkU2NCh3b3Jkc1t0XSk7CisJZm9yICgvKnQgPSAxNiovOyB0IDwgODA7ICsrdCkKKwkJV1t0XSA9IFIxKFdbdCAtIDJdKSArIFdbdCAtIDddICsgUjAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XTsKKworCS8qIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4zLjIgc3RlcCAzLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgODA7ICsrdCkgeworCQl1aW50NjRfdCBUMSA9IGggKyBTMShlKSArIENoKGUsIGYsIGcpICsgc2hhX0tbdF0gKyBXW3RdOworCQl1aW50NjRfdCBUMiA9IFMwKGEpICsgTWFqKGEsIGIsIGMpOworCQloID0gZzsKKwkJZyA9IGY7CisJCWYgPSBlOworCQllID0gZCArIFQxOworCQlkID0gYzsKKwkJYyA9IGI7CisJCWIgPSBhOworCQlhID0gVDEgKyBUMjsKKwl9CisjdW5kZWYgQ2gKKyN1bmRlZiBNYWoKKyN1bmRlZiBTMAorI3VuZGVmIFMxCisjdW5kZWYgUjAKKyN1bmRlZiBSMQorCS8qIEFkZCB0aGUgc3RhcnRpbmcgdmFsdWVzIG9mIHRoZSBjb250ZXh0IGFjY29yZGluZyB0byBGSVBTIDE4MC0yOjYuMy4yCisJICAgc3RlcCA0LiAgKi8KKwljdHgtPmhhc2hbMF0gKz0gYTsKKwljdHgtPmhhc2hbMV0gKz0gYjsKKwljdHgtPmhhc2hbMl0gKz0gYzsKKwljdHgtPmhhc2hbM10gKz0gZDsKKwljdHgtPmhhc2hbNF0gKz0gZTsKKwljdHgtPmhhc2hbNV0gKz0gZjsKKwljdHgtPmhhc2hbNl0gKz0gZzsKKwljdHgtPmhhc2hbN10gKz0gaDsKK30KKworCit2b2lkIEZBU1RfRlVOQyBzaGExX2JlZ2luKHNoYTFfY3R4X3QgKmN0eCkKK3sKKwljdHgtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCWN0eC0+aGFzaFsxXSA9IDB4ZWZjZGFiODk7CisJY3R4LT5oYXNoWzJdID0gMHg5OGJhZGNmZTsKKwljdHgtPmhhc2hbM10gPSAweDEwMzI1NDc2OworCWN0eC0+aGFzaFs0XSA9IDB4YzNkMmUxZjA7CisJY3R4LT50b3RhbDY0ID0gMDsKKwljdHgtPnByb2Nlc3NfYmxvY2sgPSBzaGExX3Byb2Nlc3NfYmxvY2s2NDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGluaXQyNTZbXSA9IHsKKwkwLAorCTAsCisJMHg2YTA5ZTY2NywKKwkweGJiNjdhZTg1LAorCTB4M2M2ZWYzNzIsCisJMHhhNTRmZjUzYSwKKwkweDUxMGU1MjdmLAorCTB4OWIwNTY4OGMsCisJMHgxZjgzZDlhYiwKKwkweDViZTBjZDE5LAorfTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBpbml0NTEyX2xvW10gPSB7CisJMCwKKwkwLAorCTB4ZjNiY2M5MDgsCisJMHg4NGNhYTczYiwKKwkweGZlOTRmODJiLAorCTB4NWYxZDM2ZjEsCisJMHhhZGU2ODJkMSwKKwkweDJiM2U2YzFmLAorCTB4ZmI0MWJkNmIsCisJMHgxMzdlMjE3OSwKK307CisKKy8qIEluaXRpYWxpemUgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdGUgb2YgY29tcHV0YXRpb24uCisgICAoRklQUyAxODAtMjo1LjMuMikgICovCit2b2lkIEZBU1RfRlVOQyBzaGEyNTZfYmVnaW4oc2hhMjU2X2N0eF90ICpjdHgpCit7CisJbWVtY3B5KCZjdHgtPnRvdGFsNjQsIGluaXQyNTYsIHNpemVvZihpbml0MjU2KSk7CisJLypjdHgtPnRvdGFsNjQgPSAwOyAtIGRvbmUgYnkgcHJlcGVuZGluZyB0d28gMzItYml0IHplcm9zIHRvIGluaXQyNTYgKi8KKwljdHgtPnByb2Nlc3NfYmxvY2sgPSBzaGEyNTZfcHJvY2Vzc19ibG9jazY0OworfQorCisvKiBJbml0aWFsaXplIHN0cnVjdHVyZSBjb250YWluaW5nIHN0YXRlIG9mIGNvbXB1dGF0aW9uLgorICAgKEZJUFMgMTgwLTI6NS4zLjMpICAqLwordm9pZCBGQVNUX0ZVTkMgc2hhNTEyX2JlZ2luKHNoYTUxMl9jdHhfdCAqY3R4KQoreworCWludCBpOworCS8qIFR3byBleHRyYSBpdGVyYXRpb25zIHplcm8gb3V0IGN0eC0+dG90YWw2NFsyXSAqLworCXVpbnQ2NF90ICp0cCA9IGN0eC0+dG90YWw2NDsKKwlmb3IgKGkgPSAwOyBpIDwgMis4OyBpKyspCisJCXRwW2ldID0gKCh1aW50NjRfdCkoaW5pdDI1NltpXSkgPDwgMzIpICsgaW5pdDUxMl9sb1tpXTsKKwkvKmN0eC0+dG90YWw2NFswXSA9IGN0eC0+dG90YWw2NFsxXSA9IDA7IC0gYWxyZWFkeSBkb25lICovCit9CisKK3ZvaWQgRkFTVF9GVU5DIHNoYTUxMl9oYXNoKHNoYTUxMl9jdHhfdCAqY3R4LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgYnVmcG9zID0gY3R4LT50b3RhbDY0WzBdICYgMTI3OworCXVuc2lnbmVkIHJlbWFpbmluZzsKKworCS8qIEZpcnN0IGluY3JlbWVudCB0aGUgYnl0ZSBjb3VudC4gIEZJUFMgMTgwLTIgc3BlY2lmaWVzIHRoZSBwb3NzaWJsZQorCSAgIGxlbmd0aCBvZiB0aGUgZmlsZSB1cCB0byAyXjEyOCBfYml0c18uCisJICAgV2UgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIF9ieXRlc18gYW5kIGNvbnZlcnQgdG8gYml0cyBsYXRlci4gICovCisJY3R4LT50b3RhbDY0WzBdICs9IGxlbjsKKwlpZiAoY3R4LT50b3RhbDY0WzBdIDwgbGVuKQorCQljdHgtPnRvdGFsNjRbMV0rKzsKKyNpZiAwCisJcmVtYWluaW5nID0gMTI4IC0gYnVmcG9zOworCisJLyogSGFzaCB3aG9sZSBibG9ja3MgKi8KKwl3aGlsZSAobGVuID49IHJlbWFpbmluZykgeworCQltZW1jcHkoY3R4LT53YnVmZmVyICsgYnVmcG9zLCBidWZmZXIsIHJlbWFpbmluZyk7CisJCWJ1ZmZlciA9IChjb25zdCBjaGFyICopYnVmZmVyICsgcmVtYWluaW5nOworCQlsZW4gLT0gcmVtYWluaW5nOworCQlyZW1haW5pbmcgPSAxMjg7CisJCWJ1ZnBvcyA9IDA7CisJCXNoYTUxMl9wcm9jZXNzX2Jsb2NrMTI4KGN0eCk7CisJfQorCisJLyogU2F2ZSBsYXN0LCBwYXJ0aWFsIGJsb3NrICovCisJbWVtY3B5KGN0eC0+d2J1ZmZlciArIGJ1ZnBvcywgYnVmZmVyLCBsZW4pOworI2Vsc2UKKwl3aGlsZSAoMSkgeworCQlyZW1haW5pbmcgPSAxMjggLSBidWZwb3M7CisJCWlmIChyZW1haW5pbmcgPiBsZW4pCisJCQlyZW1haW5pbmcgPSBsZW47CisJCS8qIENvcHkgZGF0YSBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCW1lbWNweShjdHgtPndidWZmZXIgKyBidWZwb3MsIGJ1ZmZlciwgcmVtYWluaW5nKTsKKwkJbGVuIC09IHJlbWFpbmluZzsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyByZW1haW5pbmc7CisJCWJ1ZnBvcyArPSByZW1haW5pbmc7CisJCS8qIGNsZXZlciB3YXkgdG8gZG8gImlmIChidWZwb3MgIT0gMTI4KSBicmVhazsgLi4uIDsgYnVmcG9zID0gMDsiICovCisJCWJ1ZnBvcyAtPSAxMjg7CisJCWlmIChidWZwb3MgIT0gMCkKKwkJCWJyZWFrOworCQkvKiBCdWZmZXIgaXMgZmlsbGVkIHVwLCBwcm9jZXNzIGl0ICovCisJCXNoYTUxMl9wcm9jZXNzX2Jsb2NrMTI4KGN0eCk7CisJCS8qYnVmcG9zID0gMDsgLSBhbHJlYWR5IGlzICovCisJfQorI2VuZGlmCit9CisKKy8qIFVzZWQgYWxzbyBmb3Igc2hhMjU2ICovCit2b2lkIEZBU1RfRlVOQyBzaGExX2VuZChzaGExX2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikKK3sKKwl1bnNpZ25lZCBoYXNoX3NpemU7CisKKwkvKiBTSEEgc3RvcmVzIHRvdGFsIGluIEJFLCBuZWVkIHRvIHN3YXAgb24gTEUgYXJjaGVzOiAqLworCWNvbW1vbjY0X2VuZChjdHgsIC8qc3dhcF9uZWVkZWQ6Ki8gQkJfTElUVExFX0VORElBTik7CisKKwloYXNoX3NpemUgPSAoY3R4LT5wcm9jZXNzX2Jsb2NrID09IHNoYTFfcHJvY2Vzc19ibG9jazY0KSA/IDUgOiA4OworCS8qIFRoaXMgd2F5IHdlIGRvIG5vdCBpbXBvc2UgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHJlc2J1ZjogKi8KKwlpZiAoQkJfTElUVExFX0VORElBTikgeworCQl1bnNpZ25lZCBpOworCQlmb3IgKGkgPSAwOyBpIDwgaGFzaF9zaXplOyArK2kpCisJCQljdHgtPmhhc2hbaV0gPSBTV0FQX0JFMzIoY3R4LT5oYXNoW2ldKTsKKwl9CisJbWVtY3B5KHJlc2J1ZiwgY3R4LT5oYXNoLCBzaXplb2YoY3R4LT5oYXNoWzBdKSAqIGhhc2hfc2l6ZSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNoYTUxMl9lbmQoc2hhNTEyX2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikKK3sKKwl1bnNpZ25lZCBidWZwb3MgPSBjdHgtPnRvdGFsNjRbMF0gJiAxMjc7CisKKwkvKiBQYWQgdGhlIGJ1ZmZlciB0byB0aGUgbmV4dCAxMjgtYnl0ZSBib3VuZGFyeSB3aXRoIDB4ODAsMCwwLDAuLi4gKi8KKwljdHgtPndidWZmZXJbYnVmcG9zKytdID0gMHg4MDsKKworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHJlbWFpbmluZyA9IDEyOCAtIGJ1ZnBvczsKKwkJbWVtc2V0KGN0eC0+d2J1ZmZlciArIGJ1ZnBvcywgMCwgcmVtYWluaW5nKTsKKwkJaWYgKHJlbWFpbmluZyA+PSAxNikgeworCQkJLyogU3RvcmUgdGhlIDEyOC1iaXQgY291bnRlciBvZiBiaXRzIGluIHRoZSBidWZmZXIgaW4gQkUgZm9ybWF0ICovCisJCQl1aW50NjRfdCB0OworCQkJdCA9IGN0eC0+dG90YWw2NFswXSA8PCAzOworCQkJdCA9IFNXQVBfQkU2NCh0KTsKKwkJCSoodWludDY0X3QgKikgKCZjdHgtPndidWZmZXJbMTI4IC0gOF0pID0gdDsKKwkJCXQgPSAoY3R4LT50b3RhbDY0WzFdIDw8IDMpIHwgKGN0eC0+dG90YWw2NFswXSA+PiA2MSk7CisJCQl0ID0gU1dBUF9CRTY0KHQpOworCQkJKih1aW50NjRfdCAqKSAoJmN0eC0+d2J1ZmZlclsxMjggLSAxNl0pID0gdDsKKwkJfQorCQlzaGE1MTJfcHJvY2Vzc19ibG9jazEyOChjdHgpOworCQlpZiAocmVtYWluaW5nID49IDE2KQorCQkJYnJlYWs7CisJCWJ1ZnBvcyA9IDA7CisJfQorCisJaWYgKEJCX0xJVFRMRV9FTkRJQU4pIHsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4LT5oYXNoKTsgKytpKQorCQkJY3R4LT5oYXNoW2ldID0gU1dBUF9CRTY0KGN0eC0+aGFzaFtpXSk7CisJfQorCW1lbWNweShyZXNidWYsIGN0eC0+aGFzaCwgc2l6ZW9mKGN0eC0+aGFzaCkpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvaGFzaF9tZDVwcmltZS5jIGIvbGliYmIvaGFzaF9tZDVwcmltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODZmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9oYXNoX21kNXByaW1lLmMKQEAgLTAsMCArMSw0NjAgQEAKKy8qIFRoaXMgZmlsZSBpcyBub3QgdXNlZCBieSBidXN5Ym94IHJpZ2h0IG5vdy4KKyAqIEhvd2V2ZXIsIHRoZSBjb2RlIGhlcmUgc2VlbXMgdG8gYmUgYSB0aW55IGJpdCBzbWFsbGVyCisgKiB0aGFuIG9uZSBpbiBtZDUuYy4gTmVlZCB0byBpbnZlc3RpZ2F0ZSB3aGljaCBvbmUKKyAqIGlzIGJldHRlciBvdmVyYWxsLi4uCisgKiBIaW50OiBncmVwIGZvciBtZDVwcmltZSB0byBmaW5kIHBsYWNlcyB3aGVyZSB5b3UgY2FuIHN3aXRjaAorICogbWQ1LmMvbWQ1cHJpbWUuYworICovCisKKy8qCisgKiBNRDVDLkMgLSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgTUQ1IG1lc3NhZ2UtZGlnZXN0IGFsZ29yaXRobQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0yLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBDcmVhdGVkIDE5OTEuIEFsbAorICogcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0CisgKiBpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0CisgKiBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKKyAqIG9yIHRoaXMgZnVuY3Rpb24uCisgKgorICogTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKKyAqIHRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQorICogU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCisgKiBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCisgKgorICogUlNBIERhdGEgU2VjdXJpdHksIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGNvbmNlcm5pbmcgZWl0aGVyCisgKiB0aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4KKyAqCisgKiBUaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJtZC9tZDVjLmMsdiAxLjkuMi4xIDE5OTkvMDgvMjkgMTQ6NTc6MTIgcGV0ZXIgRXhwICQKKyAqCisgKiBUaGlzIGNvZGUgaXMgdGhlIHNhbWUgYXMgdGhlIGNvZGUgcHVibGlzaGVkIGJ5IFJTQSBJbmMuICBJdCBoYXMgYmVlbgorICogZWRpdGVkIGZvciBjbGFyaXR5IGFuZCBzdHlsZSBvbmx5LgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBtZDVfY3J5cHQoKSBmdW5jdGlvbiB3YXMgdGFrZW4gZnJvbSBmcmVlQlNEJ3MgbGliY3J5cHQgYW5kIGNvbnRhaW5zCisgKiB0aGlzIGxpY2Vuc2U6CisgKiAgICAiVEhFIEJFRVItV0FSRSBMSUNFTlNFIiAoUmV2aXNpb24gNDIpOgorICogICAgIDxwaGtAbG9naW4uZGtuZXQuZGs+IHdyb3RlIHRoaXMgZmlsZS4gIEFzIGxvbmcgYXMgeW91IHJldGFpbiB0aGlzIG5vdGljZSB5b3UKKyAqICAgICBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIHN0dWZmLiBJZiB3ZSBtZWV0IHNvbWUgZGF5LCBhbmQgeW91IHRoaW5rCisgKiAgICAgdGhpcyBzdHVmZiBpcyB3b3J0aCBpdCwgeW91IGNhbiBidXkgbWUgYSBiZWVyIGluIHJldHVybi4gICBQb3VsLUhlbm5pbmcgS2FtcAorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmNyeXB0L2NyeXB0LmMsdiAxLjcuMi4xIDE5OTkvMDgvMjkgMTQ6NTY6MzMgcGV0ZXIgRXhwICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPbiBBcHJpbCAxOXRoLCAyMDAxIG1kNV9jcnlwdCgpIHdhcyBtb2RpZmllZCB0byBtYWtlIGl0IHJlZW50cmFudAorICogYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AdWNsaWJjLm9yZz4KKyAqCisgKiBKdW5lIDI4LCAyMDAxICAgICAgICAgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiAiVW4taW5saW5lZCIgY29kZSB1c2luZyBsb29wcyBhbmQgc3RhdGljIGNvbnN0IHRhYmxlcyBpbiBvcmRlciB0bworICogcmVkdWNlIGdlbmVyYXRlZCBjb2RlIHNpemUgKG9uIGkzODYgZnJvbSBhcHByb3ggNGsgdG8gYXBwcm94IDIuNWspLgorICoKKyAqIEp1bmUgMjksIDIwMDEgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIENvbXBsZXRlbHkgcmVtb3ZlZCBzdGF0aWMgUEFERElORyBhcnJheS4KKyAqCisgKiBSZWludHJvZHVjZWQgdGhlIGxvb3AgdW5yb2xsaW5nIGluIG1kNV90cmFuc2Zvcm0gYW5kIGFkZGVkIHRoZQorICogTUQ1X1NJWkVfVlNfU1BFRUQgb3B0aW9uIGZvciBjb25maWd1cmFiaWxpdHkuICBEZWZpbmUgYmVsb3cgYXM6CisgKiAgICAgICAwICAgIGZ1bGx5IHVucm9sbGVkIGxvb3BzCisgKiAgICAgICAxICAgIHBhcnRpYWxseSB1bnJvbGxlZCAoNCBvcHMgcGVyIGxvb3ApCisgKiAgICAgICAyICAgIG5vIHVucm9sbGluZyAtLSBpbnRyb2R1Y2VzIHRoZSBuZWVkIHRvIHN3YXAgNCB2YXJpYWJsZXMgKHNsb3cpCisgKiAgICAgICAzICAgIG5vIHVucm9sbGluZyBhbmQgYWxsIDQgbG9vcHMgbWVyZ2VkIGludG8gb25lIHdpdGggc3dpdGNoCisgKiAgICAgICAgICAgICAgIGluIGVhY2ggbG9vcCAoZ2xhY2lhbCkKKyAqIE9uIGkzODYsIHNpemVzIGFyZSByb3VnaGx5ICgtT3MgLWZuby1idWlsdGluKToKKyAqICAgICAwOiAzayAgICAgMTogMi41ayAgICAgMjogMi4yayAgICAgMzogMmsKKyAqCisgKiBTaW5jZSBTdVN2MyBkb2VzIG5vdCByZXF1aXJlIGNyeXB0X3IsIG1vZGlmaWVkIGFnYWluIEF1Z3VzdCA3LCAyMDAyCisgKiBieSBFcmlrIEFuZGVyc2VuIHRvIHJlbW92ZSByZWVudHJhbmNlIHN0dWZmLi4uCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIDE6IGZhc3Rlc3QsIDM6IHNtYWxsZXN0ICovCisjaWYgQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEIDwgMQorIyBkZWZpbmUgTUQ1X1NJWkVfVlNfU1BFRUQgMQorI2VsaWYgQ09ORklHX01ENV9TSVpFX1ZTX1NQRUVEID4gMworIyBkZWZpbmUgTUQ1X1NJWkVfVlNfU1BFRUQgMworI2Vsc2UKKyMgZGVmaW5lIE1ENV9TSVpFX1ZTX1NQRUVEIENPTkZJR19NRDVfU0laRV9WU19TUEVFRAorI2VuZGlmCisKKyNpZiBCQl9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIG1lbWNweTMyX2NwdTJsZSBtZW1jcHkKKyNkZWZpbmUgbWVtY3B5MzJfbGUyY3B1IG1lbWNweQorI2Vsc2UKKy8qIEVuY29kZXMgaW5wdXQgKHVpbnQzMl90KSBpbnRvIG91dHB1dCAodW5zaWduZWQgY2hhcikuCisgKiBBc3N1bWVzIGxlbiBpcyBhIG11bHRpcGxlIG9mIDQuICovCitzdGF0aWMgdm9pZAorbWVtY3B5MzJfY3B1MmxlKHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgdWludDMyX3QgKmlucHV0LCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgaSwgajsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaiA8IGxlbjsgaSsrLCBqICs9IDQpIHsKKwkJb3V0cHV0W2pdID0gaW5wdXRbaV07CisJCW91dHB1dFtqKzFdID0gKGlucHV0W2ldID4+IDgpOworCQlvdXRwdXRbaisyXSA9IChpbnB1dFtpXSA+PiAxNik7CisJCW91dHB1dFtqKzNdID0gKGlucHV0W2ldID4+IDI0KTsKKwl9Cit9CisvKiBEZWNvZGVzIGlucHV0ICh1bnNpZ25lZCBjaGFyKSBpbnRvIG91dHB1dCAodWludDMyX3QpLgorICogQXNzdW1lcyBsZW4gaXMgYSBtdWx0aXBsZSBvZiA0LiAqLworc3RhdGljIHZvaWQKK21lbWNweTMyX2xlMmNwdSh1aW50MzJfdCAqb3V0cHV0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIGksIGo7CisJZm9yIChpID0gMCwgaiA9IDA7IGogPCBsZW47IGkrKywgaiArPSA0KQorCQlvdXRwdXRbaV0gPSAoKHVpbnQzMl90KWlucHV0W2pdKQorCQkJfCAoKCh1aW50MzJfdClpbnB1dFtqKzFdKSA8PCA4KQorCQkJfCAoKCh1aW50MzJfdClpbnB1dFtqKzJdKSA8PCAxNikKKwkJCXwgKCgodWludDMyX3QpaW5wdXRbaiszXSkgPDwgMjQpOworfQorI2VuZGlmIC8qIGkzODYgKi8KKworLyogRiwgRywgSCBhbmQgSSBhcmUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4gKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkpCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQorI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCB+KHopKSkKKworLyogcm90bDMyIHJvdGF0ZXMgeCBsZWZ0IG4gYml0cy4gKi8KKyNkZWZpbmUgcm90bDMyKHgsIG4pICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMiAtIChuKSkpKQorCisvKgorICogRkYsIEdHLCBISCwgYW5kIElJIHRyYW5zZm9ybWF0aW9ucyBmb3Igcm91bmRzIDEsIDIsIDMsIGFuZCA0LgorICogUm90YXRpb24gaXMgc2VwYXJhdGUgZnJvbSBhZGRpdGlvbiB0byBwcmV2ZW50IHJlY29tcHV0YXRpb24uCisgKi8KKyNkZWZpbmUgRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAorCShhKSArPSBGKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHVpbnQzMl90KShhYyk7IFwKKwkoYSkgPSByb3RsMzIoKGEpLCAocykpOyBcCisJKGEpICs9IChiKTsgXAorCX0KKyNkZWZpbmUgR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAorCShhKSArPSBHKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHVpbnQzMl90KShhYyk7IFwKKwkoYSkgPSByb3RsMzIoKGEpLCAocykpOyBcCisJKGEpICs9IChiKTsgXAorCX0KKyNkZWZpbmUgSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAorCShhKSArPSBIKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHVpbnQzMl90KShhYyk7IFwKKwkoYSkgPSByb3RsMzIoKGEpLCAocykpOyBcCisJKGEpICs9IChiKTsgXAorCX0KKyNkZWZpbmUgSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAorCShhKSArPSBJKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKHVpbnQzMl90KShhYyk7IFwKKwkoYSkgPSByb3RsMzIoKGEpLCAocykpOyBcCisJKGEpICs9IChiKTsgXAorCX0KKworLyogTUQ1IGJhc2ljIHRyYW5zZm9ybWF0aW9uLiBUcmFuc2Zvcm1zIHN0YXRlIGJhc2VkIG9uIGJsb2NrLiAqLworc3RhdGljIHZvaWQgbWQ1X3RyYW5zZm9ybSh1aW50MzJfdCBzdGF0ZVs0XSwgY29uc3QgdW5zaWduZWQgY2hhciBibG9ja1s2NF0pCit7CisJdWludDMyX3QgYSwgYiwgYywgZCwgeFsxNl07CisjaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPiAxCisJdWludDMyX3QgdGVtcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwczsKKworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFNbXSA9IHsKKwkJNywgMTIsIDE3LCAyMiwKKwkJNSwgOSwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorCQk2LCAxMCwgMTUsIDIxCisJfTsKKyNlbmRpZiAvKiBNRDVfU0laRV9WU19TUEVFRCA+IDEgKi8KKworI2lmIE1ENV9TSVpFX1ZTX1NQRUVEID4gMAorCWNvbnN0IHVpbnQzMl90ICpwYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwcDsKKwlpbnQgaTsKKworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBDW10gPSB7CisJCS8qIHJvdW5kIDEgKi8KKwkJMHhkNzZhYTQ3OCwgMHhlOGM3Yjc1NiwgMHgyNDIwNzBkYiwgMHhjMWJkY2VlZSwKKwkJMHhmNTdjMGZhZiwgMHg0Nzg3YzYyYSwgMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKKwkJMHg2OTgwOThkOCwgMHg4YjQ0ZjdhZiwgMHhmZmZmNWJiMSwgMHg4OTVjZDdiZSwKKwkJMHg2YjkwMTEyMiwgMHhmZDk4NzE5MywgMHhhNjc5NDM4ZSwgMHg0OWI0MDgyMSwKKwkJLyogcm91bmQgMiAqLworCQkweGY2MWUyNTYyLCAweGMwNDBiMzQwLCAweDI2NWU1YTUxLCAweGU5YjZjN2FhLAorCQkweGQ2MmYxMDVkLCAweDI0NDE0NTMsICAweGQ4YTFlNjgxLCAweGU3ZDNmYmM4LAorCQkweDIxZTFjZGU2LCAweGMzMzcwN2Q2LCAweGY0ZDUwZDg3LCAweDQ1NWExNGVkLAorCQkweGE5ZTNlOTA1LCAweGZjZWZhM2Y4LCAweDY3NmYwMmQ5LCAweDhkMmE0YzhhLAorCQkvKiByb3VuZCAzICovCisJCTB4ZmZmYTM5NDIsIDB4ODc3MWY2ODEsIDB4NmQ5ZDYxMjIsIDB4ZmRlNTM4MGMsCisJCTB4YTRiZWVhNDQsIDB4NGJkZWNmYTksIDB4ZjZiYjRiNjAsIDB4YmViZmJjNzAsCisJCTB4Mjg5YjdlYzYsIDB4ZWFhMTI3ZmEsIDB4ZDRlZjMwODUsIDB4NDg4MWQwNSwKKwkJMHhkOWQ0ZDAzOSwgMHhlNmRiOTllNSwgMHgxZmEyN2NmOCwgMHhjNGFjNTY2NSwKKwkJLyogcm91bmQgNCAqLworCQkweGY0MjkyMjQ0LCAweDQzMmFmZjk3LCAweGFiOTQyM2E3LCAweGZjOTNhMDM5LAorCQkweDY1NWI1OWMzLCAweDhmMGNjYzkyLCAweGZmZWZmNDdkLCAweDg1ODQ1ZGQxLAorCQkweDZmYTg3ZTRmLCAweGZlMmNlNmUwLCAweGEzMDE0MzE0LCAweDRlMDgxMWExLAorCQkweGY3NTM3ZTgyLCAweGJkM2FmMjM1LCAweDJhZDdkMmJiLCAweGViODZkMzkxCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBQW10gPSB7CisJCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC8qIDEgKi8KKwkJMSwgNiwgMTEsIDAsIDUsIDEwLCAxNSwgNCwgOSwgMTQsIDMsIDgsIDEzLCAyLCA3LCAxMiwgLyogMiAqLworCQk1LCA4LCAxMSwgMTQsIDEsIDQsIDcsIDEwLCAxMywgMCwgMywgNiwgOSwgMTIsIDE1LCAyLCAvKiAzICovCisJCTAsIDcsIDE0LCA1LCAxMiwgMywgMTAsIDEsIDgsIDE1LCA2LCAxMywgNCwgMTEsIDIsIDkgIC8qIDQgKi8KKwl9OworCisjZW5kaWYgLyogTUQ1X1NJWkVfVlNfU1BFRUQgPiAwICovCisKKwltZW1jcHkzMl9sZTJjcHUoeCwgYmxvY2ssIDY0KTsKKworCWEgPSBzdGF0ZVswXTsKKwliID0gc3RhdGVbMV07CisJYyA9IHN0YXRlWzJdOworCWQgPSBzdGF0ZVszXTsKKworI2lmIE1ENV9TSVpFX1ZTX1NQRUVEID4gMgorCXBjID0gQzsKKwlwcCA9IFA7CisJcHMgPSBTIC0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAoKGkgJiAweDBmKSA9PSAwKSBwcyArPSA0OworCQl0ZW1wID0gYTsKKwkJc3dpdGNoIChpPj40KSB7CisJCQljYXNlIDA6CisJCQkJdGVtcCArPSBGKGIsIGMsIGQpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRlbXAgKz0gRyhiLCBjLCBkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl0ZW1wICs9IEgoYiwgYywgZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJdGVtcCArPSBJKGIsIGMsIGQpOworCQkJCWJyZWFrOworCQl9CisJCXRlbXAgKz0geFsqcHArK10gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IGI7CisJCWEgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSB0ZW1wOworCX0KKyNlbGlmIE1ENV9TSVpFX1ZTX1NQRUVEID4gMQorCXBjID0gQzsKKwlwcCA9IFA7CisJcHMgPSBTOworCS8qIFJvdW5kIDEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlGRihhLCBiLCBjLCBkLCB4WypwcF0sIHBzW2kgJiAweDNdLCAqcGMpOyBwcCsrOyBwYysrOworCQl0ZW1wID0gZDsgZCA9IGM7IGMgPSBiOyBiID0gYTsgYSA9IHRlbXA7CisJfQorCS8qIFJvdW5kIDIgKi8KKwlwcyArPSA0OworCWZvciAoOyBpIDwgMzI7IGkrKykgeworCQlHRyhhLCBiLCBjLCBkLCB4WypwcF0sIHBzW2kgJiAweDNdLCAqcGMpOyBwcCsrOyBwYysrOworCQl0ZW1wID0gZDsgZCA9IGM7IGMgPSBiOyBiID0gYTsgYSA9IHRlbXA7CisJfQorCS8qIFJvdW5kIDMgKi8KKwlwcyArPSA0OworCWZvciAoOyBpIDwgNDg7IGkrKykgeworCQlISChhLCBiLCBjLCBkLCB4WypwcF0sIHBzW2kgJiAweDNdLCAqcGMpOyBwcCsrOyBwYysrOworCQl0ZW1wID0gZDsgZCA9IGM7IGMgPSBiOyBiID0gYTsgYSA9IHRlbXA7CisJfQorCS8qIFJvdW5kIDQgKi8KKwlwcyArPSA0OworCWZvciAoOyBpIDwgNjQ7IGkrKykgeworCQlJSShhLCBiLCBjLCBkLCB4WypwcF0sIHBzW2kgJiAweDNdLCAqcGMpOyBwcCsrOyBwYysrOworCQl0ZW1wID0gZDsgZCA9IGM7IGMgPSBiOyBiID0gYTsgYSA9IHRlbXA7CisJfQorI2VsaWYgTUQ1X1NJWkVfVlNfU1BFRUQgPiAwCisJcGMgPSBDOworCXBwID0gUDsKKwkvKiBSb3VuZCAxICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlGRihhLCBiLCBjLCBkLCB4WypwcF0sICA3LCAqcGMpOyBwcCsrOyBwYysrOworCQlGRihkLCBhLCBiLCBjLCB4WypwcF0sIDEyLCAqcGMpOyBwcCsrOyBwYysrOworCQlGRihjLCBkLCBhLCBiLCB4WypwcF0sIDE3LCAqcGMpOyBwcCsrOyBwYysrOworCQlGRihiLCBjLCBkLCBhLCB4WypwcF0sIDIyLCAqcGMpOyBwcCsrOyBwYysrOworCX0KKwkvKiBSb3VuZCAyICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlHRyhhLCBiLCBjLCBkLCB4WypwcF0sICA1LCAqcGMpOyBwcCsrOyBwYysrOworCQlHRyhkLCBhLCBiLCBjLCB4WypwcF0sICA5LCAqcGMpOyBwcCsrOyBwYysrOworCQlHRyhjLCBkLCBhLCBiLCB4WypwcF0sIDE0LCAqcGMpOyBwcCsrOyBwYysrOworCQlHRyhiLCBjLCBkLCBhLCB4WypwcF0sIDIwLCAqcGMpOyBwcCsrOyBwYysrOworCX0KKwkvKiBSb3VuZCAzICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlISChhLCBiLCBjLCBkLCB4WypwcF0sICA0LCAqcGMpOyBwcCsrOyBwYysrOworCQlISChkLCBhLCBiLCBjLCB4WypwcF0sIDExLCAqcGMpOyBwcCsrOyBwYysrOworCQlISChjLCBkLCBhLCBiLCB4WypwcF0sIDE2LCAqcGMpOyBwcCsrOyBwYysrOworCQlISChiLCBjLCBkLCBhLCB4WypwcF0sIDIzLCAqcGMpOyBwcCsrOyBwYysrOworCX0KKwkvKiBSb3VuZCA0ICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlJSShhLCBiLCBjLCBkLCB4WypwcF0sICA2LCAqcGMpOyBwcCsrOyBwYysrOworCQlJSShkLCBhLCBiLCBjLCB4WypwcF0sIDEwLCAqcGMpOyBwcCsrOyBwYysrOworCQlJSShjLCBkLCBhLCBiLCB4WypwcF0sIDE1LCAqcGMpOyBwcCsrOyBwYysrOworCQlJSShiLCBjLCBkLCBhLCB4WypwcF0sIDIxLCAqcGMpOyBwcCsrOyBwYysrOworCX0KKyNlbHNlCisJLyogUm91bmQgMSAqLworI2RlZmluZSBTMTEgNworI2RlZmluZSBTMTIgMTIKKyNkZWZpbmUgUzEzIDE3CisjZGVmaW5lIFMxNCAyMgorCUZGKGEsIGIsIGMsIGQsIHhbIDBdLCBTMTEsIDB4ZDc2YWE0NzgpOyAvKiAxICovCisJRkYoZCwgYSwgYiwgYywgeFsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7IC8qIDIgKi8KKwlGRihjLCBkLCBhLCBiLCB4WyAyXSwgUzEzLCAweDI0MjA3MGRiKTsgLyogMyAqLworCUZGKGIsIGMsIGQsIGEsIHhbIDNdLCBTMTQsIDB4YzFiZGNlZWUpOyAvKiA0ICovCisJRkYoYSwgYiwgYywgZCwgeFsgNF0sIFMxMSwgMHhmNTdjMGZhZik7IC8qIDUgKi8KKwlGRihkLCBhLCBiLCBjLCB4WyA1XSwgUzEyLCAweDQ3ODdjNjJhKTsgLyogNiAqLworCUZGKGMsIGQsIGEsIGIsIHhbIDZdLCBTMTMsIDB4YTgzMDQ2MTMpOyAvKiA3ICovCisJRkYoYiwgYywgZCwgYSwgeFsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7IC8qIDggKi8KKwlGRihhLCBiLCBjLCBkLCB4WyA4XSwgUzExLCAweDY5ODA5OGQ4KTsgLyogOSAqLworCUZGKGQsIGEsIGIsIGMsIHhbIDldLCBTMTIsIDB4OGI0NGY3YWYpOyAvKiAxMCAqLworCUZGKGMsIGQsIGEsIGIsIHhbMTBdLCBTMTMsIDB4ZmZmZjViYjEpOyAvKiAxMSAqLworCUZGKGIsIGMsIGQsIGEsIHhbMTFdLCBTMTQsIDB4ODk1Y2Q3YmUpOyAvKiAxMiAqLworCUZGKGEsIGIsIGMsIGQsIHhbMTJdLCBTMTEsIDB4NmI5MDExMjIpOyAvKiAxMyAqLworCUZGKGQsIGEsIGIsIGMsIHhbMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpOyAvKiAxNCAqLworCUZGKGMsIGQsIGEsIGIsIHhbMTRdLCBTMTMsIDB4YTY3OTQzOGUpOyAvKiAxNSAqLworCUZGKGIsIGMsIGQsIGEsIHhbMTVdLCBTMTQsIDB4NDliNDA4MjEpOyAvKiAxNiAqLworCS8qIFJvdW5kIDIgKi8KKyNkZWZpbmUgUzIxIDUKKyNkZWZpbmUgUzIyIDkKKyNkZWZpbmUgUzIzIDE0CisjZGVmaW5lIFMyNCAyMAorCUdHKGEsIGIsIGMsIGQsIHhbIDFdLCBTMjEsIDB4ZjYxZTI1NjIpOyAvKiAxNyAqLworCUdHKGQsIGEsIGIsIGMsIHhbIDZdLCBTMjIsIDB4YzA0MGIzNDApOyAvKiAxOCAqLworCUdHKGMsIGQsIGEsIGIsIHhbMTFdLCBTMjMsIDB4MjY1ZTVhNTEpOyAvKiAxOSAqLworCUdHKGIsIGMsIGQsIGEsIHhbIDBdLCBTMjQsIDB4ZTliNmM3YWEpOyAvKiAyMCAqLworCUdHKGEsIGIsIGMsIGQsIHhbIDVdLCBTMjEsIDB4ZDYyZjEwNWQpOyAvKiAyMSAqLworCUdHKGQsIGEsIGIsIGMsIHhbMTBdLCBTMjIsICAweDI0NDE0NTMpOyAvKiAyMiAqLworCUdHKGMsIGQsIGEsIGIsIHhbMTVdLCBTMjMsIDB4ZDhhMWU2ODEpOyAvKiAyMyAqLworCUdHKGIsIGMsIGQsIGEsIHhbIDRdLCBTMjQsIDB4ZTdkM2ZiYzgpOyAvKiAyNCAqLworCUdHKGEsIGIsIGMsIGQsIHhbIDldLCBTMjEsIDB4MjFlMWNkZTYpOyAvKiAyNSAqLworCUdHKGQsIGEsIGIsIGMsIHhbMTRdLCBTMjIsIDB4YzMzNzA3ZDYpOyAvKiAyNiAqLworCUdHKGMsIGQsIGEsIGIsIHhbIDNdLCBTMjMsIDB4ZjRkNTBkODcpOyAvKiAyNyAqLworCUdHKGIsIGMsIGQsIGEsIHhbIDhdLCBTMjQsIDB4NDU1YTE0ZWQpOyAvKiAyOCAqLworCUdHKGEsIGIsIGMsIGQsIHhbMTNdLCBTMjEsIDB4YTllM2U5MDUpOyAvKiAyOSAqLworCUdHKGQsIGEsIGIsIGMsIHhbIDJdLCBTMjIsIDB4ZmNlZmEzZjgpOyAvKiAzMCAqLworCUdHKGMsIGQsIGEsIGIsIHhbIDddLCBTMjMsIDB4Njc2ZjAyZDkpOyAvKiAzMSAqLworCUdHKGIsIGMsIGQsIGEsIHhbMTJdLCBTMjQsIDB4OGQyYTRjOGEpOyAvKiAzMiAqLworCS8qIFJvdW5kIDMgKi8KKyNkZWZpbmUgUzMxIDQKKyNkZWZpbmUgUzMyIDExCisjZGVmaW5lIFMzMyAxNgorI2RlZmluZSBTMzQgMjMKKwlISChhLCBiLCBjLCBkLCB4WyA1XSwgUzMxLCAweGZmZmEzOTQyKTsgLyogMzMgKi8KKwlISChkLCBhLCBiLCBjLCB4WyA4XSwgUzMyLCAweDg3NzFmNjgxKTsgLyogMzQgKi8KKwlISChjLCBkLCBhLCBiLCB4WzExXSwgUzMzLCAweDZkOWQ2MTIyKTsgLyogMzUgKi8KKwlISChiLCBjLCBkLCBhLCB4WzE0XSwgUzM0LCAweGZkZTUzODBjKTsgLyogMzYgKi8KKwlISChhLCBiLCBjLCBkLCB4WyAxXSwgUzMxLCAweGE0YmVlYTQ0KTsgLyogMzcgKi8KKwlISChkLCBhLCBiLCBjLCB4WyA0XSwgUzMyLCAweDRiZGVjZmE5KTsgLyogMzggKi8KKwlISChjLCBkLCBhLCBiLCB4WyA3XSwgUzMzLCAweGY2YmI0YjYwKTsgLyogMzkgKi8KKwlISChiLCBjLCBkLCBhLCB4WzEwXSwgUzM0LCAweGJlYmZiYzcwKTsgLyogNDAgKi8KKwlISChhLCBiLCBjLCBkLCB4WzEzXSwgUzMxLCAweDI4OWI3ZWM2KTsgLyogNDEgKi8KKwlISChkLCBhLCBiLCBjLCB4WyAwXSwgUzMyLCAweGVhYTEyN2ZhKTsgLyogNDIgKi8KKwlISChjLCBkLCBhLCBiLCB4WyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTsgLyogNDMgKi8KKwlISChiLCBjLCBkLCBhLCB4WyA2XSwgUzM0LCAgMHg0ODgxZDA1KTsgLyogNDQgKi8KKwlISChhLCBiLCBjLCBkLCB4WyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTsgLyogNDUgKi8KKwlISChkLCBhLCBiLCBjLCB4WzEyXSwgUzMyLCAweGU2ZGI5OWU1KTsgLyogNDYgKi8KKwlISChjLCBkLCBhLCBiLCB4WzE1XSwgUzMzLCAweDFmYTI3Y2Y4KTsgLyogNDcgKi8KKwlISChiLCBjLCBkLCBhLCB4WyAyXSwgUzM0LCAweGM0YWM1NjY1KTsgLyogNDggKi8KKwkvKiBSb3VuZCA0ICovCisjZGVmaW5lIFM0MSA2CisjZGVmaW5lIFM0MiAxMAorI2RlZmluZSBTNDMgMTUKKyNkZWZpbmUgUzQ0IDIxCisJSUkoYSwgYiwgYywgZCwgeFsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7IC8qIDQ5ICovCisJSUkoZCwgYSwgYiwgYywgeFsgN10sIFM0MiwgMHg0MzJhZmY5Nyk7IC8qIDUwICovCisJSUkoYywgZCwgYSwgYiwgeFsxNF0sIFM0MywgMHhhYjk0MjNhNyk7IC8qIDUxICovCisJSUkoYiwgYywgZCwgYSwgeFsgNV0sIFM0NCwgMHhmYzkzYTAzOSk7IC8qIDUyICovCisJSUkoYSwgYiwgYywgZCwgeFsxMl0sIFM0MSwgMHg2NTViNTljMyk7IC8qIDUzICovCisJSUkoZCwgYSwgYiwgYywgeFsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7IC8qIDU0ICovCisJSUkoYywgZCwgYSwgYiwgeFsxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7IC8qIDU1ICovCisJSUkoYiwgYywgZCwgYSwgeFsgMV0sIFM0NCwgMHg4NTg0NWRkMSk7IC8qIDU2ICovCisJSUkoYSwgYiwgYywgZCwgeFsgOF0sIFM0MSwgMHg2ZmE4N2U0Zik7IC8qIDU3ICovCisJSUkoZCwgYSwgYiwgYywgeFsxNV0sIFM0MiwgMHhmZTJjZTZlMCk7IC8qIDU4ICovCisJSUkoYywgZCwgYSwgYiwgeFsgNl0sIFM0MywgMHhhMzAxNDMxNCk7IC8qIDU5ICovCisJSUkoYiwgYywgZCwgYSwgeFsxM10sIFM0NCwgMHg0ZTA4MTFhMSk7IC8qIDYwICovCisJSUkoYSwgYiwgYywgZCwgeFsgNF0sIFM0MSwgMHhmNzUzN2U4Mik7IC8qIDYxICovCisJSUkoZCwgYSwgYiwgYywgeFsxMV0sIFM0MiwgMHhiZDNhZjIzNSk7IC8qIDYyICovCisJSUkoYywgZCwgYSwgYiwgeFsgMl0sIFM0MywgMHgyYWQ3ZDJiYik7IC8qIDYzICovCisJSUkoYiwgYywgZCwgYSwgeFsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7IC8qIDY0ICovCisjZW5kaWYKKworCXN0YXRlWzBdICs9IGE7CisJc3RhdGVbMV0gKz0gYjsKKwlzdGF0ZVsyXSArPSBjOworCXN0YXRlWzNdICs9IGQ7CisKKwkvKiBaZXJvaXplIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gKi8KKwltZW1zZXQoeCwgMCwgc2l6ZW9mKHgpKTsKK30KKworCisvKiBNRDUgaW5pdGlhbGl6YXRpb24uICovCit2b2lkIEZBU1RfRlVOQyBtZDVfYmVnaW4obWQ1X2N0eF90ICpjb250ZXh0KQoreworCWNvbnRleHQtPmNvdW50WzBdID0gY29udGV4dC0+Y291bnRbMV0gPSAwOworCS8qIExvYWQgbWFnaWMgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzLiAgKi8KKwljb250ZXh0LT5zdGF0ZVswXSA9IDB4Njc0NTIzMDE7CisJY29udGV4dC0+c3RhdGVbMV0gPSAweGVmY2RhYjg5OworCWNvbnRleHQtPnN0YXRlWzJdID0gMHg5OGJhZGNmZTsKKwljb250ZXh0LT5zdGF0ZVszXSA9IDB4MTAzMjU0NzY7Cit9CisKKy8qCisgKiBNRDUgYmxvY2sgdXBkYXRlIG9wZXJhdGlvbi4gQ29udGludWVzIGFuIE1ENSBtZXNzYWdlLWRpZ2VzdAorICogb3BlcmF0aW9uLCBwcm9jZXNzaW5nIGFub3RoZXIgbWVzc2FnZSBibG9jaywgYW5kIHVwZGF0aW5nCisgKiB0aGUgY29udGV4dC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2hhc2goY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgaW5wdXRMZW4sIG1kNV9jdHhfdCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpLCBpZHgsIHBhcnRMZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQgPSBidWZmZXI7CisKKwkvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8KKwlpZHggPSAoY29udGV4dC0+Y291bnRbMF0gPj4gMykgJiAweDNGOworCisJLyogVXBkYXRlIG51bWJlciBvZiBiaXRzICovCisJY29udGV4dC0+Y291bnRbMF0gKz0gKGlucHV0TGVuIDw8IDMpOworCWlmIChjb250ZXh0LT5jb3VudFswXSA8IChpbnB1dExlbiA8PCAzKSkKKwkJY29udGV4dC0+Y291bnRbMV0rKzsKKwljb250ZXh0LT5jb3VudFsxXSArPSAoaW5wdXRMZW4gPj4gMjkpOworCisJLyogVHJhbnNmb3JtIGFzIG1hbnkgdGltZXMgYXMgcG9zc2libGUuICovCisJaSA9IDA7CisJcGFydExlbiA9IDY0IC0gaWR4OworCWlmIChpbnB1dExlbiA+PSBwYXJ0TGVuKSB7CisJCW1lbWNweSgmY29udGV4dC0+YnVmZmVyW2lkeF0sIGlucHV0LCBwYXJ0TGVuKTsKKwkJbWQ1X3RyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKwkJZm9yIChpID0gcGFydExlbjsgaSArIDYzIDwgaW5wdXRMZW47IGkgKz0gNjQpCisJCQltZDVfdHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCAmaW5wdXRbaV0pOworCQlpZHggPSAwOworCX0KKworCS8qIEJ1ZmZlciByZW1haW5pbmcgaW5wdXQgKi8KKwltZW1jcHkoJmNvbnRleHQtPmJ1ZmZlcltpZHhdLCAmaW5wdXRbaV0sIGlucHV0TGVuIC0gaSk7Cit9CisKKy8qCisgKiBNRDUgZmluYWxpemF0aW9uLiBFbmRzIGFuIE1ENSBtZXNzYWdlLWRpZ2VzdCBvcGVyYXRpb24sCisgKiB3cml0aW5nIHRoZSBtZXNzYWdlIGRpZ2VzdC4KKyAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2VuZCh2b2lkICpkaWdlc3QsIG1kNV9jdHhfdCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpZHgsIHBhZExlbjsKKwl1bnNpZ25lZCBjaGFyIGJpdHNbOF07CisJdW5zaWduZWQgY2hhciBwYWRkaW5nWzY0XTsKKworCS8qIEFkZCBwYWRkaW5nIGZvbGxvd2VkIGJ5IG9yaWdpbmFsIGxlbmd0aC4gKi8KKwltZW1zZXQocGFkZGluZywgMCwgc2l6ZW9mKHBhZGRpbmcpKTsKKwlwYWRkaW5nWzBdID0gMHg4MDsKKwkvKiBzYXZlIG51bWJlciBvZiBiaXRzICovCisJbWVtY3B5MzJfY3B1MmxlKGJpdHMsIGNvbnRleHQtPmNvdW50LCA4KTsKKwkvKiBwYWQgb3V0IHRvIDU2IG1vZCA2NCAqLworCWlkeCA9IChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M2Y7CisJcGFkTGVuID0gKGlkeCA8IDU2KSA/ICg1NiAtIGlkeCkgOiAoMTIwIC0gaWR4KTsKKwltZDVfaGFzaChwYWRkaW5nLCBwYWRMZW4sIGNvbnRleHQpOworCS8qIGFwcGVuZCBsZW5ndGggKGJlZm9yZSBwYWRkaW5nKSAqLworCW1kNV9oYXNoKGJpdHMsIDgsIGNvbnRleHQpOworCisJLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCisJbWVtY3B5MzJfY3B1MmxlKGRpZ2VzdCwgY29udGV4dC0+c3RhdGUsIDE2KTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2hlcnJvcl9tc2cuYyBiL2xpYmJiL2hlcnJvcl9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQxMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvaGVycm9yX21zZy5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyBiYl9oZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKwl2YV9saXN0IHA7CisKKwl2YV9zdGFydChwLCBzKTsKKwliYl92ZXJyb3JfbXNnKHMsIHAsIGhzdHJlcnJvcihoX2Vycm5vKSk7CisJdmFfZW5kKHApOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9oZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgaHN0cmVycm9yKGhfZXJybm8pKTsKKwl2YV9lbmQocCk7CisJeGZ1bmNfZGllKCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9odW1hbl9yZWFkYWJsZS5jIGIvbGliYmIvaHVtYW5fcmVhZGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIyYjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvaHVtYW5fcmVhZGFibGUuYwpAQCAtMCwwICsxLDE5NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogSnVuZSAzMCwgMjAwMSAgICAgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIEFsbC1pbnRlZ2VyIHZlcnNpb24gKGhleSwgbm90IGV2ZXJ5b25lIGhhcyBmbG9hdGluZyBwb2ludCkgb2YKKyAqIG1ha2VfaHVtYW5fcmVhZGFibGVfc3RyLCBtb2RpZmllZCBmcm9tIHNpbWlsYXIgY29kZSBJIGhhZCB3cml0dGVuCisgKiBmb3IgYnVzeWJveCBzZXZlcmFsIG1vbnRocyBhZ28uCisgKgorICogTm90ZXM6CisgKiAgIDEpIEknbSB1c2luZyBhbiB1bnNpZ25lZCBsb25nIGxvbmcgdG8gaG9sZCB0aGUgcHJvZHVjdCBzaXplICogYmxvY2tfc2l6ZSwKKyAqICAgICAgYXMgZGYgKHdoaWNoIGNhbGxzIHRoaXMgcm91dGluZSkgY291bGQgcmVxdWVzdCBhIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAqICAgICAgcGFydGl0aW9uIHNpemUgaW4gYnl0ZXMgPiBtYXggb2YgdW5zaWduZWQgbG9uZy4gIElmIGxvbmcgbG9uZ3MgYXJlbid0CisgKiAgICAgIGF2YWlsYWJsZSwgaXQgd291bGQgYmUgcG9zc2libGUgdG8gZG8gd2hhdCdzIG5lZWRlZCB1c2luZyBwb2x5bm9taWFsCisgKiAgICAgIHJlcHJlc2VudGF0aW9ucyAoc2F5LCBwb3dlcnMgb2YgMTAyNCkgYW5kIG1hbmlwdWxhdGluZyBjb2VmZmljaWVudHMuCisgKiAgICAgIFRoZSBiYXNlIHRlbiAiYnl0ZXMiIG91dHB1dCBjb3VsZCBiZSBoYW5kbGVkIHNpbWlsYXJseS4KKyAqCisgKiAgIDIpIFRoaXMgcm91dGluZSBhbHdheXMgb3V0cHV0cyBhIGRlY2ltYWwgcG9pbnQgYW5kIGEgdGVudGhzIGRpZ2l0IHdoZW4KKyAqICAgICAgZGlzcGxheV91bml0ICE9IDAuICBIZW5jZSwgaXQgaXNuJ3QgdW5jb21tb24gZm9yIHRoZSByZXR1cm5lZCBzdHJpbmcKKyAqICAgICAgdG8gaGF2ZSBhIGxlbmd0aCBvZiA1IG9yIDYuCisgKgorICogICAgICBJdCBtaWdodCBiZSBuaWNlIHRvIGFkZCBhIGZsYWcgdG8gaW5kaWNhdGUgbm8gZGVjaW1hbCBkaWdpdHMgaW4KKyAqICAgICAgdGhhdCBjYXNlLiAgVGhpcyBjb3VsZCBiZSBlaXRoZXIgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIsIG9yIGEKKyAqICAgICAgc3BlY2lhbCB2YWx1ZSBvZiBkaXNwbGF5X3VuaXQuICBTdWNoIGEgZmxhZyB3b3VsZCBhbHNvIGJlIG5pY2UgZm9yIGR1LgorICoKKyAqICAgICAgU29tZSBjb2RlIHRvIG9taXQgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIHRlbnRocyBkaWdpdCBpcyBza2V0Y2hlZCBvdXQKKyAqICAgICAgYW5kICIjaWYgMCInZCBiZWxvdy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIodW5zaWduZWQgbG9uZyBsb25nIHZhbCwKKwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHVuc2lnbmVkIGxvbmcgZGlzcGxheV91bml0KQoreworCXN0YXRpYyBjb25zdCBjaGFyIHVuaXRfY2hhcnNbXSBBTElHTjEgPSB7CisJCSdcMCcsICdLJywgJ00nLCAnRycsICdUJywgJ1AnLCAnRScsICdaJywgJ1knCisJfTsKKworCXN0YXRpYyBjaGFyICpzdHI7CisKKwl1bnNpZ25lZCBmcmFjOyAvKiAwLi45IC0gdGhlIGZyYWN0aW9uYWwgZGlnaXQgKi8KKwljb25zdCBjaGFyICp1OworCWNvbnN0IGNoYXIgKmZtdDsKKworCWlmICh2YWwgPT0gMCkKKwkJcmV0dXJuICIwIjsKKworCWZtdCA9ICIlbGx1IjsKKwlpZiAoYmxvY2tfc2l6ZSA+IDEpCisJCXZhbCAqPSBibG9ja19zaXplOworCWZyYWMgPSAwOworCXUgPSB1bml0X2NoYXJzOworCisJaWYgKGRpc3BsYXlfdW5pdCkgeworCQl2YWwgKz0gZGlzcGxheV91bml0LzI7ICAvKiBEZWFsIHdpdGggcm91bmRpbmcgKi8KKwkJdmFsIC89IGRpc3BsYXlfdW5pdDsgICAgLyogRG9uJ3QgY29tYmluZSB3aXRoIHRoZSBsaW5lIGFib3ZlISAqLworCQkvKiB3aWxsIGp1c3QgcHJpbnQgaXQgYXMgdWxvbmdsb25nIChiZWxvdykgKi8KKwl9IGVsc2UgeworCQl3aGlsZSAoKHZhbCA+PSAxMDI0KQorCQkgLyogJiYgKHUgPCB1bml0X2NoYXJzICsgc2l6ZW9mKHVuaXRfY2hhcnMpIC0gMSkgLSBhbHdheXMgdHJ1ZSAqLworCQkpIHsKKwkJCWZtdCA9ICIlbGx1LiV1JWMiOworCQkJdSsrOworCQkJZnJhYyA9ICgoKHVuc2lnbmVkKXZhbCAlIDEwMjQpICogMTAgKyAxMDI0LzIpIC8gMTAyNDsKKwkJCXZhbCAvPSAxMDI0OworCQl9CisJCWlmIChmcmFjID49IDEwKSB7IC8qIHdlIG5lZWQgdG8gcm91bmQgdXAgaGVyZSAqLworCQkJKyt2YWw7CisJCQlmcmFjID0gMDsKKwkJfQorI2lmIDEKKwkJLyogSWYgYmxvY2tfc2l6ZSBpcyAwLCBkb250IHByaW50IGZyYWN0aW9uYWwgcGFydCAqLworCQlpZiAoYmxvY2tfc2l6ZSA9PSAwKSB7CisJCQlpZiAoZnJhYyA+PSA1KSB7CisJCQkJKyt2YWw7CisJCQl9CisJCQlmbXQgPSAiJWxsdSUqYyI7CisJCQlmcmFjID0gMTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKCFzdHIpIHsKKwkJLyogc3VmZmljaWVudCBmb3IgYW55IHdpZHRoIG9mIHZhbCAqLworCQlzdHIgPSB4bWFsbG9jKHNpemVvZih2YWwpKjMgKyAyICsgMyk7CisJfQorCXNwcmludGYoc3RyLCBmbXQsIHZhbCwgZnJhYywgKnUpOworCXJldHVybiBzdHI7Cit9CisKKworLyogdmRhJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzaW1pbGFyIGlkZWEgKi8KKworLyogQ29udmVydCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgaW50byBjb21wYWN0IDUtY2hhciByZXByZXNlbnRhdGlvbi4KKyAqIFN0cmluZyBpcyBub3QgdGVybWluYXRlZCAoYnVmWzVdIGlzIHVudG91Y2hlZCkgKi8KK3ZvaWQgRkFTVF9GVU5DIHNtYXJ0X3VsbHRvYTUodW5zaWduZWQgbG9uZyBsb25nIHVsLCBjaGFyIGJ1Zls1XSwgY29uc3QgY2hhciAqc2NhbGUpCit7CisJY29uc3QgY2hhciAqZm10OworCWNoYXIgYzsKKwl1bnNpZ25lZCB2LCB1LCBpZHggPSAwOworCisJaWYgKHVsID4gOTk5OTkpIHsgLy8gZG8gbm90IHNjYWxlIGlmIDk5OTk5IG9yIGxlc3MKKwkJdWwgKj0gMTA7CisJCWRvIHsKKwkJCXVsIC89IDEwMjQ7CisJCQlpZHgrKzsKKwkJfSB3aGlsZSAodWwgPj0gMTAwMDAwKTsKKwl9CisJdiA9IHVsOyAvLyB1bGxvbmcgZGl2aXNpb25zIGFyZSBleHBlbnNpdmUsIGF2b2lkIHRoZW0KKworCWZtdCA9ICIgMTIzNDU2Nzg5IjsKKwl1ID0gdiAvIDEwOworCXYgPSB2ICUgMTA7CisJaWYgKCFpZHgpIHsKKwkJLy8gOTk5OTkgb3IgbGVzczogdXNlICIxMjM0NSIgZm9ybWF0CisJCS8vIHUgaXMgdmFsdWUvMTAsIHYgaXMgbGFzdCBkaWdpdAorCQljID0gYnVmWzBdID0gIiAxMjM0NTY3ODkiW3UvMTAwMF07CisJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQljID0gYnVmWzFdID0gZm10W3UvMTAwJTEwXTsKKwkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCWMgPSBidWZbMl0gPSBmbXRbdS8xMCUxMF07CisJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQlidWZbM10gPSBmbXRbdSUxMF07CisJCWJ1Zls0XSA9ICIwMTIzNDU2Nzg5Ilt2XTsKKwl9IGVsc2UgeworCQkvLyB2YWx1ZSBoYXMgYmVlbiBzY2FsZWQgaW50byAwLi45OTk5LjkgcmFuZ2UKKwkJLy8gdSBpcyB2YWx1ZSwgdiBpcyAxLzEwdGhzIChhbGxvd3MgZm9yIDkyLjFNIGZvcm1hdCkKKwkJaWYgKHUgPj0gMTAwKSB7CisJCQkvLyB2YWx1ZSBpcyA+PSAxMDA6IHVzZSAiMTIzNE0nLCAiIDEyM00iIGZvcm1hdHMKKwkJCWMgPSBidWZbMF0gPSAiIDEyMzQ1Njc4OSJbdS8xMDAwXTsKKwkJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQkJYyA9IGJ1ZlsxXSA9IGZtdFt1LzEwMCUxMF07CisJCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJCXYgPSB1ICUgMTA7CisJCQl1ID0gdSAvIDEwOworCQkJYnVmWzJdID0gZm10W3UlMTBdOworCQl9IGVsc2UgeworCQkJLy8gdmFsdWUgaXMgPCAxMDA6IHVzZSAiOTIuMU0iIGZvcm1hdAorCQkJYyA9IGJ1ZlswXSA9ICIgMTIzNDU2Nzg5Ilt1LzEwXTsKKwkJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQkJYnVmWzFdID0gZm10W3UlMTBdOworCQkJYnVmWzJdID0gJy4nOworCQl9CisJCWJ1ZlszXSA9ICIwMTIzNDU2Nzg5Ilt2XTsKKwkJYnVmWzRdID0gc2NhbGVbaWR4XTsgLyogdHlwaWNhbGx5IHNjYWxlID0gIiBrbWd0Li4uIiAqLworCX0KK30KKworLyogQ29udmVydCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgaW50byBjb21wYWN0IDQtY2hhcgorICogcmVwcmVzZW50YXRpb24uIEV4YW1wbGVzOiAiMTIzNCIsICIxLjJrIiwgIiAyN00iLCAiMTIzVCIKKyAqIFN0cmluZyBpcyBub3QgdGVybWluYXRlZCAoYnVmWzRdIGlzIHVudG91Y2hlZCkgKi8KK3ZvaWQgRkFTVF9GVU5DIHNtYXJ0X3VsbHRvYTQodW5zaWduZWQgbG9uZyBsb25nIHVsLCBjaGFyIGJ1Zls0XSwgY29uc3QgY2hhciAqc2NhbGUpCit7CisJY29uc3QgY2hhciAqZm10OworCWNoYXIgYzsKKwl1bnNpZ25lZCB2LCB1LCBpZHggPSAwOworCisJaWYgKHVsID4gOTk5OSkgeyAvLyBkbyBub3Qgc2NhbGUgaWYgOTk5OSBvciBsZXNzCisJCXVsICo9IDEwOworCQlkbyB7CisJCQl1bCAvPSAxMDI0OworCQkJaWR4Kys7CisJCX0gd2hpbGUgKHVsID49IDEwMDAwKTsKKwl9CisJdiA9IHVsOyAvLyB1bGxvbmcgZGl2aXNpb25zIGFyZSBleHBlbnNpdmUsIGF2b2lkIHRoZW0KKworCWZtdCA9ICIgMTIzNDU2Nzg5IjsKKwl1ID0gdiAvIDEwOworCXYgPSB2ICUgMTA7CisJaWYgKCFpZHgpIHsKKwkJLy8gOTk5OSBvciBsZXNzOiB1c2UgIjEyMzQiIGZvcm1hdAorCQkvLyB1IGlzIHZhbHVlLzEwLCB2IGlzIGxhc3QgZGlnaXQKKwkJYyA9IGJ1ZlswXSA9ICIgMTIzNDU2Nzg5Ilt1LzEwMF07CisJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQljID0gYnVmWzFdID0gZm10W3UvMTAlMTBdOworCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJYnVmWzJdID0gZm10W3UlMTBdOworCQlidWZbM10gPSAiMDEyMzQ1Njc4OSJbdl07CisJfSBlbHNlIHsKKwkJLy8gdSBpcyB2YWx1ZSwgdiBpcyAxLzEwdGhzIChhbGxvd3MgZm9yIDkuMk0gZm9ybWF0KQorCQlpZiAodSA+PSAxMCkgeworCQkJLy8gdmFsdWUgaXMgPj0gMTA6IHVzZSAiMTIzTScsICIgMTJNIiBmb3JtYXRzCisJCQljID0gYnVmWzBdID0gIiAxMjM0NTY3ODkiW3UvMTAwXTsKKwkJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQkJdiA9IHUgJSAxMDsKKwkJCXUgPSB1IC8gMTA7CisJCQlidWZbMV0gPSBmbXRbdSUxMF07CisJCX0gZWxzZSB7CisJCQkvLyB2YWx1ZSBpcyA8IDEwOiB1c2UgIjkuMk0iIGZvcm1hdAorCQkJYnVmWzBdID0gIjAxMjM0NTY3ODkiW3VdOworCQkJYnVmWzFdID0gJy4nOworCQl9CisJCWJ1ZlsyXSA9ICIwMTIzNDU2Nzg5Ilt2XTsKKwkJYnVmWzNdID0gc2NhbGVbaWR4XTsgLyogdHlwaWNhbGx5IHNjYWxlID0gIiBrbWd0Li4uIiAqLworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL2luZXRfY29tbW9uLmMgYi9saWJiYi9pbmV0X2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDhkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9pbmV0X2NvbW1vbi5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzdG9sZW4gZnJvbSBuZXQtdG9vbHMtMS41OSBhbmQgc3RyaXBwZWQgZG93biBmb3IgYnVzeWJveCBieQorICogICAgICAgICAgICAgICAgICAgICAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIEhlYXZpbHkgbW9kaWZpZWQgYnkgTWFudWVsIE5vdm9hIElJSSAgICAgICBNYXIgMTIsIDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKK2ludCBGQVNUX0ZVTkMgSU5FVF9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc19pbiwgaW50IGhvc3RmaXJzdCkKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRVRDX05FVFdPUktTCisJc3RydWN0IG5ldGVudCAqbnA7CisjZW5kaWYKKworCS8qIEdybXBmLiAtRnZLICovCisJc19pbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc19pbi0+c2luX3BvcnQgPSAwOworCisJLyogRGVmYXVsdCBpcyBzcGVjaWFsLCBtZWFuaW5nIDAuMC4wLjAuICovCisJaWYgKHN0cmNtcChuYW1lLCAiZGVmYXVsdCIpID09IDApIHsKKwkJc19pbi0+c2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIExvb2sgdG8gc2VlIGlmIGl0J3MgYSBkb3R0ZWQgcXVhZC4gKi8KKwlpZiAoaW5ldF9hdG9uKG5hbWUsICZzX2luLT5zaW5fYWRkcikpIHsKKwkJcmV0dXJuIDA7CisJfQorCS8qIElmIHdlIGV4cGVjdCB0aGlzIHRvIGJlIGEgaG9zdG5hbWUsIHRyeSBob3N0bmFtZSBkYXRhYmFzZSBmaXJzdCAqLworI2lmZGVmIERFQlVHCisJaWYgKGhvc3RmaXJzdCkgeworCQliYl9lcnJvcl9tc2coImdldGhvc3RieW5hbWUoJXMpIiwgbmFtZSk7CisJfQorI2VuZGlmCisJaWYgKGhvc3RmaXJzdCkgeworCQlocCA9IGdldGhvc3RieW5hbWUobmFtZSk7CisJCWlmIChocCAhPSBOVUxMKSB7CisJCQltZW1jcHkoJnNfaW4tPnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9FVENfTkVUV09SS1MKKwkvKiBUcnkgdGhlIE5FVFdPUktTIGRhdGFiYXNlIHRvIHNlZSBpZiB0aGlzIGlzIGEga25vd24gbmV0d29yay4gKi8KKyNpZmRlZiBERUJVRworCWJiX2Vycm9yX21zZygiZ2V0bmV0YnluYW1lKCVzKSIsIG5hbWUpOworI2VuZGlmCisJbnAgPSBnZXRuZXRieW5hbWUobmFtZSk7CisJaWYgKG5wICE9IE5VTEwpIHsKKwkJc19pbi0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwobnAtPm5fbmV0KTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKGhvc3RmaXJzdCkgeworCQkvKiBEb24ndCB0cnkgYWdhaW4gKi8KKwkJcmV0dXJuIC0xOworCX0KKyNpZmRlZiBERUJVRworCXJlc19pbml0KCk7CisJX3Jlcy5vcHRpb25zIHw9IFJFU19ERUJVRzsKKwliYl9lcnJvcl9tc2coImdldGhvc3RieW5hbWUoJXMpIiwgbmFtZSk7CisjZW5kaWYKKwlocCA9IGdldGhvc3RieW5hbWUobmFtZSk7CisJaWYgKGhwID09IE5VTEwpIHsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoJnNfaW4tPnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCXJldHVybiAwOworfQorCisKKy8qIG51bWVyaWM6ICYgMHg4MDAwOiBkZWZhdWx0IGluc3RlYWQgb2YgKiwKKyAqICAgICAgICAgICYgMHg0MDAwOiBob3N0IGluc3RlYWQgb2YgbmV0LAorICogICAgICAgICAgJiAweDBmZmY6IGRvbid0IHJlc29sdmUKKyAqLworY2hhciogRkFTVF9GVU5DIElORVRfcnJlc29sdmUoc3RydWN0IHNvY2thZGRyX2luICpzX2luLCBpbnQgbnVtZXJpYywgdWludDMyX3QgbmV0bWFzaykKK3sKKwkvKiBhZGRyLXRvLW5hbWUgY2FjaGUgKi8KKwlzdHJ1Y3QgYWRkciB7CisJCXN0cnVjdCBhZGRyICpuZXh0OworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwkJaW50IGhvc3Q7CisJCWNoYXIgbmFtZVsxXTsKKwl9OworCXN0YXRpYyBzdHJ1Y3QgYWRkciAqY2FjaGUgPSBOVUxMOworCisJc3RydWN0IGFkZHIgKnBuOworCWNoYXIgKm5hbWU7CisJdWludDMyX3QgYWQsIGhvc3RfYWQ7CisJaW50IGhvc3QgPSAwOworCisJaWYgKHNfaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworI2lmZGVmIERFQlVHCisJCWJiX2Vycm9yX21zZygicnJlc29sdmU6IHVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5ICVkISIsCisJCQkJICBzX2luLT5zaW5fZmFtaWx5KTsKKyNlbmRpZgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWFkID0gc19pbi0+c2luX2FkZHIuc19hZGRyOworI2lmZGVmIERFQlVHCisJYmJfZXJyb3JfbXNnKCJycmVzb2x2ZTogJTA4eCwgbWFzayAlMDh4LCBudW0gJTA4eCIsICh1bnNpZ25lZClhZCwgbmV0bWFzaywgbnVtZXJpYyk7CisjZW5kaWYKKwlpZiAoYWQgPT0gSU5BRERSX0FOWSkgeworCQlpZiAoKG51bWVyaWMgJiAweDBGRkYpID09IDApIHsKKwkJCWlmIChudW1lcmljICYgMHg4MDAwKQorCQkJCXJldHVybiB4c3RyZHVwKCJkZWZhdWx0Iik7CisJCQlyZXR1cm4geHN0cmR1cCgiKiIpOworCQl9CisJfQorCWlmIChudW1lcmljICYgMHgwRkZGKQorCQlyZXR1cm4geHN0cmR1cChpbmV0X250b2Eoc19pbi0+c2luX2FkZHIpKTsKKworCWlmICgoYWQgJiAofm5ldG1hc2spKSAhPSAwIHx8IChudW1lcmljICYgMHg0MDAwKSkKKwkJaG9zdCA9IDE7CisJcG4gPSBjYWNoZTsKKwl3aGlsZSAocG4pIHsKKwkJaWYgKHBuLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBhZCAmJiBwbi0+aG9zdCA9PSBob3N0KSB7CisjaWZkZWYgREVCVUcKKwkJCWJiX2Vycm9yX21zZygicnJlc29sdmU6IGZvdW5kICVzICUwOHggaW4gY2FjaGUiLAorCQkJCQkgIChob3N0ID8gImhvc3QiIDogIm5ldCIpLCAodW5zaWduZWQpYWQpOworI2VuZGlmCisJCQlyZXR1cm4geHN0cmR1cChwbi0+bmFtZSk7CisJCX0KKwkJcG4gPSBwbi0+bmV4dDsKKwl9CisKKwlob3N0X2FkID0gbnRvaGwoYWQpOworCW5hbWUgPSBOVUxMOworCWlmIChob3N0KSB7CisJCXN0cnVjdCBob3N0ZW50ICplbnQ7CisjaWZkZWYgREVCVUcKKwkJYmJfZXJyb3JfbXNnKCJnZXRob3N0YnlhZGRyICglMDh4KSIsICh1bnNpZ25lZClhZCk7CisjZW5kaWYKKwkJZW50ID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmYWQsIDQsIEFGX0lORVQpOworCQlpZiAoZW50KQorCQkJbmFtZSA9IHhzdHJkdXAoZW50LT5oX25hbWUpOworCX0gZWxzZSBpZiAoRU5BQkxFX0ZFQVRVUkVfRVRDX05FVFdPUktTKSB7CisJCXN0cnVjdCBuZXRlbnQgKm5wOworI2lmZGVmIERFQlVHCisJCWJiX2Vycm9yX21zZygiZ2V0bmV0YnlhZGRyICglMDh4KSIsICh1bnNpZ25lZClob3N0X2FkKTsKKyNlbmRpZgorCQlucCA9IGdldG5ldGJ5YWRkcihob3N0X2FkLCBBRl9JTkVUKTsKKwkJaWYgKG5wKQorCQkJbmFtZSA9IHhzdHJkdXAobnAtPm5fbmFtZSk7CisJfQorCWlmICghbmFtZSkKKwkJbmFtZSA9IHhzdHJkdXAoaW5ldF9udG9hKHNfaW4tPnNpbl9hZGRyKSk7CisJcG4gPSB4bWFsbG9jKHNpemVvZigqcG4pICsgc3RybGVuKG5hbWUpKTsgLyogbm8gJysgMScsIGl0J3MgYWxyZWFkeSBhY2NvdW50ZWQgZm9yICovCisJcG4tPm5leHQgPSBjYWNoZTsKKwlwbi0+YWRkciA9ICpzX2luOworCXBuLT5ob3N0ID0gaG9zdDsKKwlzdHJjcHkocG4tPm5hbWUsIG5hbWUpOworCWNhY2hlID0gcG47CisJcmV0dXJuIG5hbWU7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisKK2ludCBGQVNUX0ZVTkMgSU5FVDZfcmVzb2x2ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42KQoreworCXN0cnVjdCBhZGRyaW5mbyByZXEsICphaSA9IE5VTEw7CisJaW50IHM7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCXJlcS5haV9mYW1pbHkgPSBBRl9JTkVUNjsKKwlzID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJnJlcSwgJmFpKTsKKwlpZiAocyAhPSAwKSB7CisJCWJiX2Vycm9yX21zZygiZ2V0YWRkcmluZm86ICVzOiAlZCIsIG5hbWUsIHMpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweShzaW42LCBhaS0+YWlfYWRkciwgc2l6ZW9mKCpzaW42KSk7CisJaWYgKGFpKQorCQlmcmVlYWRkcmluZm8oYWkpOworCXJldHVybiAwOworfQorCisjaWZuZGVmIElONl9JU19BRERSX1VOU1BFQ0lGSUVECisjIGRlZmluZSBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChhKSBcCisJKCgodWludDMyX3QgKikgKGEpKVswXSA9PSAwICYmICgodWludDMyX3QgKikgKGEpKVsxXSA9PSAwICYmIFwKKwkgKCh1aW50MzJfdCAqKSAoYSkpWzJdID09IDAgJiYgKCh1aW50MzJfdCAqKSAoYSkpWzNdID09IDApCisjZW5kaWYKKworCitjaGFyKiBGQVNUX0ZVTkMgSU5FVDZfcnJlc29sdmUoc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiwgaW50IG51bWVyaWMpCit7CisJY2hhciBuYW1lWzEyOF07CisJaW50IHM7CisKKwlpZiAoc2luNi0+c2luNl9mYW1pbHkgIT0gQUZfSU5FVDYpIHsKKyNpZmRlZiBERUJVRworCQliYl9lcnJvcl9tc2coInJyZXNvbHZlOiB1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSAlZCEiLAorCQkJCSAgc2luNi0+c2luNl9mYW1pbHkpOworI2VuZGlmCisJCWVycm5vID0gRUFGTk9TVVBQT1JUOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG51bWVyaWMgJiAweDdGRkYpIHsKKwkJaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luNi0+c2luNl9hZGRyLCBuYW1lLCBzaXplb2YobmFtZSkpOworCQlyZXR1cm4geHN0cmR1cChuYW1lKTsKKwl9CisJaWYgKElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZzaW42LT5zaW42X2FkZHIpKSB7CisJCWlmIChudW1lcmljICYgMHg4MDAwKQorCQkJcmV0dXJuIHhzdHJkdXAoImRlZmF1bHQiKTsKKwkJcmV0dXJuIHhzdHJkdXAoIioiKTsKKwl9CisKKwlzID0gZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSBzaW42LCBzaXplb2YoKnNpbjYpLAorCQkJCW5hbWUsIHNpemVvZihuYW1lKSwKKwkJCQkvKnNlcnYsc2VydmxlbjoqLyBOVUxMLCAwLAorCQkJCTApOworCWlmIChzICE9IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJnZXRuYW1laW5mbyBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB4c3RyZHVwKG5hbWUpOworfQorCisjZW5kaWYgIC8qIENPTkZJR19GRUFUVVJFX0lQVjYgKi8KZGlmZiAtLWdpdCBhL2xpYmJiL2luZm9fbXNnLmMgYi9saWJiYi9pbmZvX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2EyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9pbmZvX21zZy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HCisjIGluY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmCisKK3ZvaWQgRkFTVF9GVU5DIGJiX2luZm9fbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKyNpZmRlZiBUSElTX09ORV9ET0VTTlRfRE9fU0lOR0xFX1dSSVRFCisJdmFfbGlzdCBwOworCS8qIHZhX2NvcHkgaXMgdXNlZCBiZWNhdXNlIGl0IGlzIG5vdCBwb3J0YWJsZQorCSAqIHRvIHVzZSB2YV9saXN0IHAgdHdpY2UgKi8KKwl2YV9saXN0IHAyOworCisJdmFfc3RhcnQocCwgcyk7CisJdmFfY29weShwMiwgcCk7CisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NURElPKSB7CisJCXZwcmludGYocywgcCk7CisJCWZwdXRzKG1zZ19lb2wsIHN0ZG91dCk7CisJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1lTTE9HKQorCQl2c3lzbG9nKExPR19JTkZPLCBzLCBwMik7CisjIGVuZGlmCisJdmFfZW5kKHAyKTsKKwl2YV9lbmQocCk7CisjZWxzZQorCWludCB1c2VkOworCWNoYXIgKm1zZzsKKwl2YV9saXN0IHA7CisKKwlpZiAobG9nbW9kZSA9PSAwKQorCQlyZXR1cm47CisKKwl2YV9zdGFydChwLCBzKTsKKwl1c2VkID0gdmFzcHJpbnRmKCZtc2csIHMsIHApOworCXZhX2VuZChwKTsKKwlpZiAodXNlZCA8IDApCisJCXJldHVybjsKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1lTTE9HKQorCQlzeXNsb2coTE9HX0lORk8sICIlcyIsIG1zZyk7CisjIGVuZGlmCisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NURElPKSB7CisJCWZmbHVzaF9hbGwoKTsKKwkJLyogdXNlZCA9IHN0cmxlbihtc2cpOyAtIG11c3QgYmUgdHJ1ZSBhbHJlYWR5ICovCisJCW1zZ1t1c2VkKytdID0gJ1xuJzsKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBtc2csIHVzZWQpOworCX0KKworCWZyZWUobXNnKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYmIvaW5vZGVfaGFzaC5jIGIvbGliYmIvaW5vZGVfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTUzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9pbm9kZV9oYXNoLmMKQEAgLTAsMCArMSw4NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4KKyAqIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UgYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3R5cGVkZWYgc3RydWN0IGlub19kZXZfaGFzaF9idWNrZXRfc3RydWN0IHsKKwlzdHJ1Y3QgaW5vX2Rldl9oYXNoX2J1Y2tldF9zdHJ1Y3QgKm5leHQ7CisJaW5vX3QgaW5vOworCWRldl90IGRldjsKKwljaGFyIG5hbWVbMV07Cit9IGlub19kZXZfaGFzaHRhYmxlX2J1Y2tldF90OworCisjZGVmaW5lIEhBU0hfU0laRSAgICAgIDMxMSAgIC8qIFNob3VsZCBiZSBwcmltZSAqLworI2RlZmluZSBoYXNoX2lub2RlKGkpICAoKGkpICUgSEFTSF9TSVpFKQorCisvKiBhcnJheSBvZiBbSEFTSF9TSVpFXSBlbGVtZW50cyAqLworc3RhdGljIGlub19kZXZfaGFzaHRhYmxlX2J1Y2tldF90ICoqaW5vX2Rldl9oYXNodGFibGU7CisKKy8qCisgKiBSZXR1cm4gbmFtZSBpZiBzdGF0YnVmLT5zdF9pbm8gJiYgc3RhdGJ1Zi0+c3RfZGV2IGFyZSByZWNvcmRlZCBpbgorICogaW5vX2Rldl9oYXNodGFibGUsIGVsc2UgcmV0dXJuIE5VTEwKKyAqLworY2hhciogRkFTVF9GVU5DIGlzX2luX2lub19kZXZfaGFzaHRhYmxlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmKQoreworCWlub19kZXZfaGFzaHRhYmxlX2J1Y2tldF90ICpidWNrZXQ7CisKKwlpZiAoIWlub19kZXZfaGFzaHRhYmxlKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1Y2tldCA9IGlub19kZXZfaGFzaHRhYmxlW2hhc2hfaW5vZGUoc3RhdGJ1Zi0+c3RfaW5vKV07CisJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7CisJCWlmICgoYnVja2V0LT5pbm8gPT0gc3RhdGJ1Zi0+c3RfaW5vKQorCQkgJiYgKGJ1Y2tldC0+ZGV2ID09IHN0YXRidWYtPnN0X2RldikKKwkJKSB7CisJCQlyZXR1cm4gYnVja2V0LT5uYW1lOworCQl9CisJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFkZCBzdGF0YnVmIHRvIHN0YXRidWYgaGFzaCB0YWJsZSAqLwordm9pZCBGQVNUX0ZVTkMgYWRkX3RvX2lub19kZXZfaGFzaHRhYmxlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCWlub19kZXZfaGFzaHRhYmxlX2J1Y2tldF90ICpidWNrZXQ7CisKKwlpID0gaGFzaF9pbm9kZShzdGF0YnVmLT5zdF9pbm8pOworCWlmICghbmFtZSkKKwkJbmFtZSA9ICIiOworCWJ1Y2tldCA9IHhtYWxsb2Moc2l6ZW9mKGlub19kZXZfaGFzaHRhYmxlX2J1Y2tldF90KSArIHN0cmxlbihuYW1lKSk7CisJYnVja2V0LT5pbm8gPSBzdGF0YnVmLT5zdF9pbm87CisJYnVja2V0LT5kZXYgPSBzdGF0YnVmLT5zdF9kZXY7CisJc3RyY3B5KGJ1Y2tldC0+bmFtZSwgbmFtZSk7CisKKwlpZiAoIWlub19kZXZfaGFzaHRhYmxlKQorCQlpbm9fZGV2X2hhc2h0YWJsZSA9IHh6YWxsb2MoSEFTSF9TSVpFICogc2l6ZW9mKCppbm9fZGV2X2hhc2h0YWJsZSkpOworCisJYnVja2V0LT5uZXh0ID0gaW5vX2Rldl9oYXNodGFibGVbaV07CisJaW5vX2Rldl9oYXNodGFibGVbaV0gPSBidWNrZXQ7Cit9CisKKyNpZiBFTkFCTEVfRFUgfHwgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKy8qIENsZWFyIHN0YXRidWYgaGFzaCB0YWJsZSAqLwordm9pZCBGQVNUX0ZVTkMgcmVzZXRfaW5vX2Rldl9oYXNodGFibGUodm9pZCkKK3sKKwlpbnQgaTsKKwlpbm9fZGV2X2hhc2h0YWJsZV9idWNrZXRfdCAqYnVja2V0OworCisJZm9yIChpID0gMDsgaW5vX2Rldl9oYXNodGFibGUgJiYgaSA8IEhBU0hfU0laRTsgaSsrKSB7CisJCXdoaWxlIChpbm9fZGV2X2hhc2h0YWJsZVtpXSAhPSBOVUxMKSB7CisJCQlidWNrZXQgPSBpbm9fZGV2X2hhc2h0YWJsZVtpXS0+bmV4dDsKKwkJCWZyZWUoaW5vX2Rldl9oYXNodGFibGVbaV0pOworCQkJaW5vX2Rldl9oYXNodGFibGVbaV0gPSBidWNrZXQ7CisJCX0KKwl9CisJZnJlZShpbm9fZGV2X2hhc2h0YWJsZSk7CisJaW5vX2Rldl9oYXNodGFibGUgPSBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9pc2RpcmVjdG9yeS5jIGIvbGliYmIvaXNkaXJlY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODYxYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvaXNkaXJlY3RvcnkuYwpAQCAtMCwwICsxLDM2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIHNhc2gsIENvcHlyaWdodCAoYykgMTk5OSBieSBEYXZpZCBJLiBCZWxsCisgKiBQZXJtaXNzaW9uIGhhcyBiZWVuIGdyYW50ZWQgdG8gcmVkaXN0cmlidXRlIHRoaXMgY29kZSB1bmRlciBHUEwuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorICogUmV0dXJuIFRSVUUgaWYgZmlsZU5hbWUgaXMgYSBkaXJlY3RvcnkuCisgKiBOb25leGlzdGVudCBmaWxlcyByZXR1cm4gRkFMU0UuCisgKi8KK2ludCBGQVNUX0ZVTkMgaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBpbnQgZm9sbG93TGlua3MsIHN0cnVjdCBzdGF0ICpzdGF0QnVmKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IHN0YXQgYXN0YXRCdWY7CisKKwlpZiAoc3RhdEJ1ZiA9PSBOVUxMKSB7CisJCS8qIHVzZSBhdXRvIHN0YWNrIGJ1ZmZlciAqLworCQlzdGF0QnVmID0gJmFzdGF0QnVmOworCX0KKworCWlmIChmb2xsb3dMaW5rcykKKwkJc3RhdHVzID0gc3RhdChmaWxlTmFtZSwgc3RhdEJ1Zik7CisJZWxzZQorCQlzdGF0dXMgPSBsc3RhdChmaWxlTmFtZSwgc3RhdEJ1Zik7CisKKwlzdGF0dXMgPSAoc3RhdHVzID09IDAgJiYgU19JU0RJUihzdGF0QnVmLT5zdF9tb2RlKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbGliYmIva2VybmVsX3ZlcnNpb24uYyBiL2xpYmJiL2tlcm5lbF92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2OGExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2tlcm5lbF92ZXJzaW9uLmMKQEAgLTAsMCArMSwzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIHNpbmNlIGl0IG5lZWRzIHN5cy90eXBlcy5oIG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+ICAvKiBmb3IgdW5hbWUoMikgKi8KKworCisvKiBSZXR1cm5zIGN1cnJlbnQga2VybmVsIHZlcnNpb24gZW5jb2RlZCBhcyBtYWpvcio2NTUzNiArIG1pbm9yKjI1NiArIHBhdGNoLAorICogc28sIGZvciBleGFtcGxlLCAgdG8gY2hlY2sgaWYgdGhlIGtlcm5lbCBpcyBncmVhdGVyIHRoYW4gMi4yLjExOgorICoKKyAqICAgICBpZiAoZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpID4gS0VSTkVMX1ZFUlNJT04oMiwyLDExKSkgeyA8c3R1ZmY+IH0KKyAqLworaW50IEZBU1RfRlVOQyBnZXRfbGludXhfdmVyc2lvbl9jb2RlKHZvaWQpCit7CisJc3RydWN0IHV0c25hbWUgbmFtZTsKKwljaGFyICpzOworCWludCBpLCByOworCisJaWYgKHVuYW1lKCZuYW1lKSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBnZXQgc3lzdGVtIGluZm9ybWF0aW9uIik7CisJCXJldHVybiAwOworCX0KKworCXMgPSBuYW1lLnJlbGVhc2U7CisJciA9IDA7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyID0gciAqIDI1NiArIGF0b2koc3RydG9rKHMsICIuIikpOworCQlzID0gTlVMTDsKKwl9CisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9sYXN0X2NoYXJfaXMuYyBiL2xpYmJiL2xhc3RfY2hhcl9pcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTZjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9sYXN0X2NoYXJfaXMuYwpAQCAtMCwwICsxLDI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBidXN5Ym94IGxpYnJhcnkgZVh0ZW5kZWQgZnVuY3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTGFycnkgRG9vbGl0dGxlLCA8bGRvb2xpdHRAcmVjeWNsZS5sYmwuZ292PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZpbmQgb3V0IGlmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIHN0cmluZyBtYXRjaGVzIHRoZSBvbmUgZ2l2ZW4uCisgKiBEb24ndCB1bmRlcnJ1biB0aGUgYnVmZmVyIGlmIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIDAuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBsYXN0X2NoYXJfaXMoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisJaWYgKHMgJiYgKnMpIHsKKwkJc2l6ZV90IHN6ID0gc3RybGVuKHMpIC0gMTsKKwkJcyArPSBzejsKKwkJaWYgKCAodW5zaWduZWQgY2hhcikqcyA9PSBjKQorCQkJcmV0dXJuIChjaGFyKilzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2xpbmVlZGl0LmMgYi9saWJiYi9saW5lZWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTM3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9saW5lZWRpdC5jCkBAIC0wLDAgKzEsMjY3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29tbWFuZCBsaW5lIGVkaXRpbmcuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg2LTIwMDMgbWF5IHNhZmVseSBiZSBjb25zdW1lZCBieSBhIEJTRCBvciBHUEwgbGljZW5zZS4KKyAqIFdyaXR0ZW4gYnk6ICAgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIFVzZWQgaWRlYXM6CisgKiAgICAgIEFkYW0gUm9nb3lza2kgICAgPHJvZ295c2tpQGNzLnV0ZXhhcy5lZHU+CisgKiAgICAgIERhdmUgQ2luZWdlICAgICAgPGRjaW5lZ2VAcHN5Y2hvc2lzLmNvbT4KKyAqICAgICAgSmFrdWIgSmVsaW5layAoYykgMTk5NQorICogICAgICBFcmlrIEFuZGVyc2VuICAgIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+IChNYWpvcmx5IGFkanVzdGVkIGZvciBidXN5Ym94KQorICoKKyAqIFRoaXMgY29kZSBpcyAnYXMgaXMnIHdpdGggbm8gd2FycmFudHkuCisgKi8KKworLyoKKyAqIFVzYWdlIGFuZCBrbm93biBidWdzOgorICogVGVybWluYWwga2V5IGNvZGVzIGFyZSBub3QgZXh0ZW5zaXZlLCBtb3JlIG5lZWRzIHRvIGJlIGFkZGVkLgorICogVGhpcyB2ZXJzaW9uIHdhcyBjcmVhdGVkIG9uIERlYmlhbiBHTlUvTGludXggMi54LgorICogRGVsZXRlLCBCYWNrc3BhY2UsIEhvbWUsIEVuZCwgYW5kIHRoZSBhcnJvdyBrZXlzIHdlcmUgdGVzdGVkCisgKiB0byB3b3JrIGluIGFuIFh0ZXJtIGFuZCBjb25zb2xlLiBDdHJsLUEgYWxzbyB3b3JrcyBhcyBIb21lLgorICogQ3RybC1FIGFsc28gd29ya3MgYXMgRW5kLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgcmVhZGxpbmUtbGlrZSBjb21tYW5kcyBhcmUgbm90IGltcGxlbWVudGVkOgorICogRVNDLWIgLS0gTW92ZSBiYWNrIG9uZSB3b3JkCisgKiBFU0MtZiAtLSBNb3ZlIGZvcndhcmQgb25lIHdvcmQKKyAqIEVTQy1kIC0tIERlbGV0ZSBmb3J3YXJkIG9uZSB3b3JkCisgKiBDVEwtdCAtLSBUcmFuc3Bvc2UgdHdvIGNoYXJhY3RlcnMKKyAqCisgKiBsaW5lZWRpdCBkb2VzIG5vdCBrbm93IHRoYXQgdGhlIHRlcm1pbmFsIGVzY2FwZSBzZXF1ZW5jZXMgZG8gbm90CisgKiB0YWtlIHVwIHNwYWNlIG9uIHRoZSBzY3JlZW4uIFRoZSByZWRpc3BsYXkgY29kZSBhc3N1bWVzLCB1bmxlc3MKKyAqIHRvbGQgb3RoZXJ3aXNlLCB0aGF0IGVhY2ggY2hhcmFjdGVyIGluIHRoZSBwcm9tcHQgaXMgYSBwcmludGFibGUKKyAqIGNoYXJhY3RlciB0aGF0IHRha2VzIHVwIG9uZSBjaGFyYWN0ZXIgcG9zaXRpb24gb24gdGhlIHNjcmVlbi4KKyAqIFlvdSBuZWVkIHRvIHRlbGwgbGluZWVkaXQgdGhhdCBzb21lIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzCisgKiBpbiB0aGUgcHJvbXB0IHRha2UgdXAgbm8gc2NyZWVuIHNwYWNlLiBDb21wYXRpYmx5IHdpdGggcmVhZGxpbmUsCisgKiB1c2UgdGhlIFxbIGVzY2FwZSB0byBiZWdpbiBhIHNlcXVlbmNlIG9mIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzLAorICogYW5kIHRoZSBcXSBlc2NhcGUgdG8gc2lnbmFsIHRoZSBlbmQgb2Ygc3VjaCBhIHNlcXVlbmNlLiBFeGFtcGxlOgorICoKKyAqIFBTMT0nXFtcMDMzWzAxOzMybVxdXHVAXGhcW1wwMzNbMDE7MzRtXF0gXHcgXCRcW1wwMzNbMDBtXF0gJworICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisjaWZuZGVmIF9QT1NJWF9WRElTQUJMRQorIyBkZWZpbmUgX1BPU0lYX1ZESVNBQkxFICdcMCcKKyNlbmRpZgorCisKKyNpZmRlZiBURVNUCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9FRElUSU5HIDAKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OIDAKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04gMAorI2VuZGlmCisKKworLyogRW50aXJlIGZpbGUgKGV4Y2VwdCBURVNUaW5nIHBhcnQpIHNpdHMgaW5zaWRlIHRoaXMgI2lmICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworCisKKyNkZWZpbmUgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIgXAorCShFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIHx8IEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUKQorI2RlZmluZSBJRl9VU0VSTkFNRV9PUl9IT01FRElSKC4uLikKKyNpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorIyB1bmRlZiBJRl9VU0VSTkFNRV9PUl9IT01FRElSCisjIGRlZmluZSBJRl9VU0VSTkFNRV9PUl9IT01FRElSKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisKKyN1bmRlZiBDSEFSX1QKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisjIGRlZmluZSBCQl9OVUwgKCh3Y2hhcl90KTApCisjIGRlZmluZSBDSEFSX1Qgd2NoYXJfdAorc3RhdGljIGJvb2wgQkJfaXNzcGFjZShDSEFSX1QgYykgeyByZXR1cm4gKCh1bnNpZ25lZCljIDwgMjU2ICYmIGlzc3BhY2UoYykpOyB9CisjIGlmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKK3N0YXRpYyBib29sIEJCX2lzYWxudW0oQ0hBUl9UIGMpIHsgcmV0dXJuICgodW5zaWduZWQpYyA8IDI1NiAmJiBpc2FsbnVtKGMpKTsgfQorIyBlbmRpZgorc3RhdGljIGJvb2wgQkJfaXNwdW5jdChDSEFSX1QgYykgeyByZXR1cm4gKCh1bnNpZ25lZCljIDwgMjU2ICYmIGlzcHVuY3QoYykpOyB9CisjIHVuZGVmIGlzc3BhY2UKKyMgdW5kZWYgaXNhbG51bQorIyB1bmRlZiBpc3B1bmN0CisjIHVuZGVmIGlzcHJpbnQKKyMgZGVmaW5lIGlzc3BhY2UgaXNzcGFjZV9tdXN0X25vdF9iZV91c2VkCisjIGRlZmluZSBpc2FsbnVtIGlzYWxudW1fbXVzdF9ub3RfYmVfdXNlZAorIyBkZWZpbmUgaXNwdW5jdCBpc3B1bmN0X211c3Rfbm90X2JlX3VzZWQKKyMgZGVmaW5lIGlzcHJpbnQgaXNwcmludF9tdXN0X25vdF9iZV91c2VkCisjZWxzZQorIyBkZWZpbmUgQkJfTlVMICdcMCcKKyMgZGVmaW5lIENIQVJfVCBjaGFyCisjIGRlZmluZSBCQl9pc3NwYWNlKGMpIGlzc3BhY2UoYykKKyMgZGVmaW5lIEJCX2lzYWxudW0oYykgaXNhbG51bShjKQorIyBkZWZpbmUgQkJfaXNwdW5jdChjKSBpc3B1bmN0KGMpCisjZW5kaWYKKyNpZiBFTkFCTEVfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4KKyMgZGVmaW5lIHVuaWNvZGVfbWFya19yYXdfYnl0ZSh3YykgICAoKHdjKSB8IDB4MjAwMDAwMDApCisjIGRlZmluZSB1bmljb2RlX2lzX3Jhd19ieXRlKHdjKSAgICAgKCh3YykgJiAweDIwMDAwMDAwKQorI2Vsc2UKKyMgZGVmaW5lIHVuaWNvZGVfaXNfcmF3X2J5dGUod2MpICAgICAwCisjZW5kaWYKKworCisjZGVmaW5lIEVTQyAiXDAzMyIKKworI2RlZmluZSBTRVFfQ0xFQVJfVElMTF9FTkRfT0ZfU0NSRUVOICBFU0MiW0oiCisvLyNkZWZpbmUgU0VRX0NMRUFSX1RJTExfRU5EX09GX0xJTkUgIEVTQyJbSyIKKworCitlbnVtIHsKKwlNQVhfTElORUxFTiA9IENPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTiA8IDB4N2ZmMAorCSAgICAgICAgICAgICAgPyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU4KKwkgICAgICAgICAgICAgIDogMHg3ZmYwCit9OworCisjaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKK3N0YXRpYyBjb25zdCBjaGFyIG51bGxfc3RyW10gQUxJR04xID0gIiI7CisjZW5kaWYKKworLyogV2UgdHJ5IHRvIG1pbmltaXplIGJvdGggc3RhdGljIGFuZCBzdGFjayB1c2FnZS4gKi8KK3N0cnVjdCBsaW5lZWRpdF9zdGF0aWNzIHsKKwlsaW5lX2lucHV0X3QgKnN0YXRlOworCisJdm9sYXRpbGUgdW5zaWduZWQgY21kZWRpdF90ZXJtdzsgLyogPSA4MDsgKi8gLyogYWN0dWFsIHRlcm1pbmFsIHdpZHRoICovCisJc2lnaGFuZGxlcl90IHByZXZpb3VzX1NJR1dJTkNIX2hhbmRsZXI7CisKKwl1bnNpZ25lZCBjbWRlZGl0X3g7ICAgICAgICAvKiByZWFsIHggKGNvbCkgdGVybWluYWwgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBjbWRlZGl0X3k7ICAgICAgICAvKiBwc2V1ZG9yZWFsIHkgKHJvdykgdGVybWluYWwgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBjbWRlZGl0X3BybXRfbGVuOyAvKiBsZW5ndGggb2YgcHJvbXB0ICh3aXRob3V0IGNvbG9ycyBldGMpICovCisKKwl1bnNpZ25lZCBjdXJzb3I7CisJaW50IGNvbW1hbmRfbGVuOyAvKiBtdXN0IGJlIHNpZ25lZCAqLworCS8qIHNpZ25lZCBtYXhzaXplOiB3ZSB3YW50IHggaW4gImlmICh4ID4gUy5tYXhzaXplKSIKKwkgKiB0byBfbm90XyBiZSBwcm9tb3RlZCB0byB1bnNpZ25lZCAqLworCWludCBtYXhzaXplOworCUNIQVJfVCAqY29tbWFuZF9wczsKKworCWNvbnN0IGNoYXIgKmNtZGVkaXRfcHJvbXB0OworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUCisJaW50IG51bV9va19saW5lczsgLyogPSAxOyAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorCWNoYXIgKnVzZXJfYnVmOworCWNoYXIgKmhvbWVfcHdkX2J1ZjsgLyogPSAoY2hhciopbnVsbF9zdHI7ICovCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OCisJY2hhciAqKm1hdGNoZXM7CisJdW5zaWduZWQgbnVtX21hdGNoZXM7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKKyMgZGVmaW5lIERFTEJVRlNJWiAxMjgKKwlDSEFSX1QgKmRlbHB0cjsKKwlzbWFsbGludCBuZXdkZWxmbGFnOyAgICAgLyogd2hldGhlciBkZWxidWYgc2hvdWxkIGJlIHJldXNlZCB5ZXQgKi8KKwlDSEFSX1QgZGVsYnVmW0RFTEJVRlNJWl07ICAvKiBhIHBsYWNlIHRvIHN0b3JlIGRlbGV0ZWQgY2hhcmFjdGVycyAqLworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwlzbWFsbGludCBzZW50X0VTQ19icjZuOworI2VuZGlmCit9OworCisvKiBTZWUgbGluZWVkaXRfcHRyX2hhY2suYyAqLworZXh0ZXJuIHN0cnVjdCBsaW5lZWRpdF9zdGF0aWNzICpjb25zdCBsaW5lZWRpdF9wdHJfdG9fc3RhdGljczsKKworI2RlZmluZSBTICgqbGluZWVkaXRfcHRyX3RvX3N0YXRpY3MpCisjZGVmaW5lIHN0YXRlICAgICAgICAgICAgKFMuc3RhdGUgICAgICAgICAgICkKKyNkZWZpbmUgY21kZWRpdF90ZXJtdyAgICAoUy5jbWRlZGl0X3Rlcm13ICAgKQorI2RlZmluZSBwcmV2aW91c19TSUdXSU5DSF9oYW5kbGVyIChTLnByZXZpb3VzX1NJR1dJTkNIX2hhbmRsZXIpCisjZGVmaW5lIGNtZGVkaXRfeCAgICAgICAgKFMuY21kZWRpdF94ICAgICAgICkKKyNkZWZpbmUgY21kZWRpdF95ICAgICAgICAoUy5jbWRlZGl0X3kgICAgICAgKQorI2RlZmluZSBjbWRlZGl0X3BybXRfbGVuIChTLmNtZGVkaXRfcHJtdF9sZW4pCisjZGVmaW5lIGN1cnNvciAgICAgICAgICAgKFMuY3Vyc29yICAgICAgICAgICkKKyNkZWZpbmUgY29tbWFuZF9sZW4gICAgICAoUy5jb21tYW5kX2xlbiAgICAgKQorI2RlZmluZSBjb21tYW5kX3BzICAgICAgIChTLmNvbW1hbmRfcHMgICAgICApCisjZGVmaW5lIGNtZGVkaXRfcHJvbXB0ICAgKFMuY21kZWRpdF9wcm9tcHQgICkKKyNkZWZpbmUgbnVtX29rX2xpbmVzICAgICAoUy5udW1fb2tfbGluZXMgICAgKQorI2RlZmluZSB1c2VyX2J1ZiAgICAgICAgIChTLnVzZXJfYnVmICAgICAgICApCisjZGVmaW5lIGhvbWVfcHdkX2J1ZiAgICAgKFMuaG9tZV9wd2RfYnVmICAgICkKKyNkZWZpbmUgbWF0Y2hlcyAgICAgICAgICAoUy5tYXRjaGVzICAgICAgICAgKQorI2RlZmluZSBudW1fbWF0Y2hlcyAgICAgIChTLm51bV9tYXRjaGVzICAgICApCisjZGVmaW5lIGRlbHB0ciAgICAgICAgICAgKFMuZGVscHRyICAgICAgICAgICkKKyNkZWZpbmUgbmV3ZGVsZmxhZyAgICAgICAoUy5uZXdkZWxmbGFnICAgICAgKQorI2RlZmluZSBkZWxidWYgICAgICAgICAgIChTLmRlbGJ1ZiAgICAgICAgICApCisKKyNkZWZpbmUgSU5JVF9TKCkgZG8geyBcCisJKCooc3RydWN0IGxpbmVlZGl0X3N0YXRpY3MqKikmbGluZWVkaXRfcHRyX3RvX3N0YXRpY3MpID0geHphbGxvYyhzaXplb2YoUykpOyBcCisJYmFycmllcigpOyBcCisJY21kZWRpdF90ZXJtdyA9IDgwOyBcCisJSUZfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVChudW1fb2tfbGluZXMgPSAxOykgXAorCUlGX1VTRVJOQU1FX09SX0hPTUVESVIoaG9tZV9wd2RfYnVmID0gKGNoYXIqKW51bGxfc3RyOykgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZGVpbml0X1Modm9pZCkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorCS8qIFRoaXMgb25lIGlzIGFsbG9jYXRlZCBvbmx5IGlmIEZBTkNZX1BST01QVCBpcyBvbgorCSAqIChvdGhlcndpc2UgaXQgcG9pbnRzIHRvIHZlcmJhdGltIHByb21wdCAoTk9UIG1hbGxvY2VkKSkgKi8KKwlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7CisjZW5kaWYKKyNpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorCWZyZWUodXNlcl9idWYpOworCWlmIChob21lX3B3ZF9idWYgIT0gbnVsbF9zdHIpCisJCWZyZWUoaG9tZV9wd2RfYnVmKTsKKyNlbmRpZgorCWZyZWUobGluZWVkaXRfcHRyX3RvX3N0YXRpY3MpOworfQorI2RlZmluZSBERUlOSVRfUygpIGRlaW5pdF9TKCkKKworCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorc3RhdGljIHNpemVfdCBsb2FkX3N0cmluZyhjb25zdCBjaGFyICpzcmMpCit7CisJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJc3NpemVfdCBsZW4gPSBtYnN0b3djcyhjb21tYW5kX3BzLCBzcmMsIFMubWF4c2l6ZSAtIDEpOworCQlpZiAobGVuIDwgMCkKKwkJCWxlbiA9IDA7CisJCWNvbW1hbmRfcHNbbGVuXSA9IEJCX05VTDsKKwkJcmV0dXJuIGxlbjsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJd2hpbGUgKHNyY1tpXSAmJiBpIDwgUy5tYXhzaXplIC0gMSkgeworCQkJY29tbWFuZF9wc1tpXSA9IHNyY1tpXTsKKwkJCWkrKzsKKwkJfQorCQljb21tYW5kX3BzW2ldID0gQkJfTlVMOworCQlyZXR1cm4gaTsKKwl9Cit9CitzdGF0aWMgdW5zaWduZWQgc2F2ZV9zdHJpbmcoY2hhciAqZHN0LCB1bnNpZ25lZCBtYXhzaXplKQoreworCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisjIGlmICFFTkFCTEVfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4KKwkJc3NpemVfdCBsZW4gPSB3Y3N0b21icyhkc3QsIGNvbW1hbmRfcHMsIG1heHNpemUgLSAxKTsKKwkJaWYgKGxlbiA8IDApCisJCQlsZW4gPSAwOworCQlkc3RbbGVuXSA9ICdcMCc7CisJCXJldHVybiBsZW47CisjIGVsc2UKKwkJdW5zaWduZWQgZHN0cG9zID0gMDsKKwkJdW5zaWduZWQgc3JjcG9zID0gMDsKKworCQltYXhzaXplLS07CisJCXdoaWxlIChkc3Rwb3MgPCBtYXhzaXplKSB7CisJCQl3Y2hhcl90IHdjOworCQkJaW50IG4gPSBzcmNwb3M7CisKKwkJCS8qIENvbnZlcnQgdXAgdG8gMXN0IGludmFsaWQgYnl0ZSAob3IgdXAgdG8gZW5kKSAqLworCQkJd2hpbGUgKCh3YyA9IGNvbW1hbmRfcHNbc3JjcG9zXSkgIT0gQkJfTlVMCisJCQkgICAgJiYgIXVuaWNvZGVfaXNfcmF3X2J5dGUod2MpCisJCQkpIHsKKwkJCQlzcmNwb3MrKzsKKwkJCX0KKwkJCWNvbW1hbmRfcHNbc3JjcG9zXSA9IEJCX05VTDsKKwkJCW4gPSB3Y3N0b21icyhkc3QgKyBkc3Rwb3MsIGNvbW1hbmRfcHMgKyBuLCBtYXhzaXplIC0gZHN0cG9zKTsKKwkJCWlmIChuIDwgMCkgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCQlicmVhazsKKwkJCWRzdHBvcyArPSBuOworCQkJaWYgKHdjID09IEJCX05VTCkgLyogdXN1YWxseSBpcyAqLworCQkJCWJyZWFrOworCisJCQkvKiBXZSBkbyBoYXZlIGludmFsaWQgYnl0ZSBoZXJlISAqLworCQkJY29tbWFuZF9wc1tzcmNwb3NdID0gd2M7IC8qIHJlc3RvcmUgaXQgKi8KKwkJCXNyY3BvcysrOworCQkJaWYgKGRzdHBvcyA9PSBtYXhzaXplKQorCQkJCWJyZWFrOworCQkJZHN0W2RzdHBvcysrXSA9IChjaGFyKSB3YzsKKwkJfQorCQlkc3RbZHN0cG9zXSA9ICdcMCc7CisJCXJldHVybiBkc3Rwb3M7CisjIGVuZGlmCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXdoaWxlICgoZHN0W2ldID0gY29tbWFuZF9wc1tpXSkgIT0gMCkKKwkJCWkrKzsKKwkJcmV0dXJuIGk7CisJfQorfQorLyogSSB0aG91Z2h0IGp1c3QgZnB1dHdjKGMsIHN0ZG91dCkgd291bGQgd29yay4gQnV0IG5vLi4uICovCitzdGF0aWMgdm9pZCBCQl9QVVRDSEFSKHdjaGFyX3QgYykKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworCQljaGFyIGJ1ZltNQl9DVVJfTUFYICsgMV07CisJCW1ic3RhdGVfdCBtYnN0ID0geyAwIH07CisJCXNzaXplX3QgbGVuID0gd2NydG9tYihidWYsIGMsICZtYnN0KTsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEluIHRoaXMgY2FzZSwgYyBpcyBhbHdheXMgb25lIGJ5dGUgKi8KKwkJcHV0Y2hhcihjKTsKKwl9Cit9CisjIGlmIEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgfHwgRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMKK3N0YXRpYyB3Y2hhcl90IGFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2ModW5zaWduZWQgKndpZHRoX2Fkaiwgd2NoYXJfdCB3YykKKyMgZWxzZQorc3RhdGljIHdjaGFyX3QgYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93Yyh3Y2hhcl90IHdjKQorIyAgZGVmaW5lIGFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2Mod2lkdGhfYWRqLCB3YykgXAorCSgoKih3aWR0aF9hZGopKSsrLCBhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKHdjKSkKKyMgZW5kaWYKK3sKKwlpbnQgdyA9IDE7CisKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworCQlpZiAod2MgPiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIpIHsKKwkJCS8qIG5vdGU6IGFsc28gdHJ1ZSBmb3IgdW5pY29kZV9pc19yYXdfYnl0ZSh3YykgKi8KKwkJCWdvdG8gc3Vic3Q7CisJCX0KKwkJdyA9IHdjd2lkdGgod2MpOworCQlpZiAoKEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgJiYgdyA8IDApCisJCSB8fCAoIUVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgJiYgdyA8PSAwKQorCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUyAmJiB3ID4gMSkKKwkJKSB7Cisgc3Vic3Q6CisJCQl3ID0gMTsKKwkJCXdjID0gQ09ORklHX1NVQlNUX1dDSEFSOworCQl9CisJfQorCisjIGlmIEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgfHwgRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMKKwkqd2lkdGhfYWRqICs9IHc7CisjZW5kaWYKKwlyZXR1cm4gd2M7Cit9CisjZWxzZSAvKiAhVU5JQ09ERSAqLworc3RhdGljIHNpemVfdCBsb2FkX3N0cmluZyhjb25zdCBjaGFyICpzcmMpCit7CisJc2FmZV9zdHJuY3B5KGNvbW1hbmRfcHMsIHNyYywgUy5tYXhzaXplKTsKKwlyZXR1cm4gc3RybGVuKGNvbW1hbmRfcHMpOworfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorc3RhdGljIHZvaWQgc2F2ZV9zdHJpbmcoY2hhciAqZHN0LCB1bnNpZ25lZCBtYXhzaXplKQoreworCXNhZmVfc3RybmNweShkc3QsIGNvbW1hbmRfcHMsIG1heHNpemUpOworfQorIyBlbmRpZgorIyBkZWZpbmUgQkJfUFVUQ0hBUihjKSBiYl9wdXRjaGFyKGMpCisvKiBTaG91bGQgbmV2ZXIgYmUgY2FsbGVkOiAqLworaW50IGFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2ModW5zaWduZWQgKndpZHRoX2FkaiwgaW50IHdjKTsKKyNlbmRpZgorCisKKy8qIFB1dCAnY29tbWFuZF9wc1tjdXJzb3JdJywgY3Vyc29yKysuCisgKiBBZHZhbmNlIGN1cnNvciBvbiBzY3JlZW4uIElmIHdlIHJlYWNoZWQgcmlnaHQgbWFyZ2luLCBzY3JvbGwgdGV4dCB1cAorICogYW5kIHJlbW92ZSB0ZXJtaW5hbCBtYXJnaW4gZWZmZWN0IGJ5IHByaW50aW5nICduZXh0X2NoYXInICovCisjZGVmaW5lIEhBQ0tfRk9SX1dST05HX1dJRFRIIDEKK3N0YXRpYyB2b2lkIHB1dF9jdXJfZ2x5cGhfYW5kX2luY19jdXJzb3Iodm9pZCkKK3sKKwlDSEFSX1QgYyA9IGNvbW1hbmRfcHNbY3Vyc29yXTsKKwl1bnNpZ25lZCB3aWR0aCA9IDA7CisJaW50IG9mc190b19yaWdodDsKKworCWlmIChjID09IEJCX05VTCkgeworCQkvKiBlcmFzZSBjaGFyYWN0ZXIgYWZ0ZXIgZW5kIG9mIGlucHV0IHN0cmluZyAqLworCQljID0gJyAnOworCX0gZWxzZSB7CisJCS8qIGFkdmFuY2UgY3Vyc29yIG9ubHkgaWYgd2UgYXJlbid0IGF0IHRoZSBlbmQgeWV0ICovCisJCWN1cnNvcisrOworCQlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworCQkJSUZfVU5JQ09ERV9XSURFX1dDSEFSUyh3aWR0aCA9IGNtZGVkaXRfeDspCisJCQljID0gYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93YygmY21kZWRpdF94LCBjKTsKKwkJCUlGX1VOSUNPREVfV0lERV9XQ0hBUlMod2lkdGggPSBjbWRlZGl0X3ggLSB3aWR0aDspCisJCX0gZWxzZSB7CisJCQljbWRlZGl0X3grKzsKKwkJfQorCX0KKworCW9mc190b19yaWdodCA9IGNtZGVkaXRfeCAtIGNtZGVkaXRfdGVybXc7CisJaWYgKCFFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUyB8fCBvZnNfdG9fcmlnaHQgPD0gMCkgeworCQkvKiBjIGZpdHMgb24gdGhpcyBsaW5lICovCisJCUJCX1BVVENIQVIoYyk7CisJfQorCisJaWYgKG9mc190b19yaWdodCA+PSAwKSB7CisJCS8qIHdlIGdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyNpZiBIQUNLX0ZPUl9XUk9OR19XSURUSAorCQkvKiBUaGlzIHdvcmtzIGJldHRlciBpZiBvdXIgaWRlYSBvZiB0ZXJtIHdpZHRoIGlzIHdyb25nCisJCSAqIGFuZCBpdCBpcyBhY3R1YWxseSB3aWRlciAob2Z0ZW4gaGFwcGVucyBvbiBzZXJpYWwgbGluZXMpLgorCQkgKiBQcmludGluZyBDUixMRiAqZm9yY2VzKiBjdXJzb3IgdG8gbmV4dCBsaW5lLgorCQkgKiBPVE9IIGlmIHRlcm1pbmFsIHdpZHRoIGlzIGNvcnJlY3QgQU5EIHRlcm1pbmFsIGRvZXMgTk9UCisJCSAqIGhhdmUgYXV0b21hcmdpbiAoSU9XOiBpdCBpcyBtb3ZpbmcgY3Vyc29yIHRvIG5leHQgbGluZQorCQkgKiBieSBpdHNlbGYgKHdoaWNoIGlzIHdyb25nIGZvciBWVC0xMHggdGVybWluYWxzKSksCisJCSAqIHRoaXMgd2lsbCBicmVhayB0aGluZ3M6IHRoZXJlIHdpbGwgYmUgb25lIGV4dHJhIGVtcHR5IGxpbmUgKi8KKwkJcHV0cygiXHIiKTsgLyogKyBpbXBsaWNpdCAnXG4nICovCisjZWxzZQorCQkvKiBWVC0xMHggdGVybWluYWxzIGRvbid0IHdyYXAgY3Vyc29yIHRvIG5leHQgbGluZSB3aGVuIGxhc3QgY2hhcgorCQkgKiBvbiB0aGUgbGluZSBpcyBwcmludGVkIC0gY3Vyc29yIHN0YXlzICJvdmVyIiB0aGlzIGNoYXIuCisJCSAqIE5lZWQgdG8gcHJpbnQgX25leHRfIGNoYXIgdG9vIChmaXJzdCBvbmUgdG8gYXBwZWFyIG9uIG5leHQgbGluZSkKKwkJICogdG8gbWFrZSBjdXJzb3IgbW92ZSBkb3duIHRvIG5leHQgbGluZS4KKwkJICovCisJCS8qIFdvcmtzIG9rIG9ubHkgaWYgY21kZWRpdF90ZXJtdyBpcyBjb3JyZWN0LiAqLworCQljID0gY29tbWFuZF9wc1tjdXJzb3JdOworCQlpZiAoYyA9PSBCQl9OVUwpCisJCQljID0gJyAnOworCQlCQl9QVVRDSEFSKGMpOworCQliYl9wdXRjaGFyKCdcYicpOworI2VuZGlmCisJCWNtZGVkaXRfeSsrOworCQlpZiAoIUVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTIHx8IG9mc190b19yaWdodCA9PSAwKSB7CisJCQl3aWR0aCA9IDA7CisJCX0gZWxzZSB7IC8qIG9mc190b19yaWdodCA+IDAgKi8KKwkJCS8qIHdpZGUgY2hhciBjIGRpZG4ndCBmaXQgb24gcHJldiBsaW5lICovCisJCQlCQl9QVVRDSEFSKGMpOworCQl9CisJCWNtZGVkaXRfeCA9IHdpZHRoOworCX0KK30KKworLyogTW92ZSB0byBlbmQgb2YgbGluZSAoYnkgcHJpbnRpbmcgYWxsIGNoYXJzIHRpbGwgdGhlIGVuZCkgKi8KK3N0YXRpYyB2b2lkIHB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcih2b2lkKQoreworCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbikKKwkJcHV0X2N1cl9nbHlwaF9hbmRfaW5jX2N1cnNvcigpOworfQorCisvKiBHbyB0byB0aGUgbmV4dCBsaW5lICovCitzdGF0aWMgdm9pZCBnb3RvX25ld19saW5lKHZvaWQpCit7CisJcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKCk7CisJaWYgKGNtZGVkaXRfeCAhPSAwKQorCQliYl9wdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgdm9pZCBiZWVwKHZvaWQpCit7CisJYmJfcHV0Y2hhcignXDAwNycpOworfQorCitzdGF0aWMgdm9pZCBwdXRfcHJvbXB0KHZvaWQpCit7CisJdW5zaWduZWQgdzsKKworCWZwdXRzKGNtZGVkaXRfcHJvbXB0LCBzdGRvdXQpOworCWZmbHVzaF9hbGwoKTsKKwljdXJzb3IgPSAwOworCXcgPSBjbWRlZGl0X3Rlcm13OyAvKiByZWFkIHZvbGF0aWxlIHZhciBvbmNlICovCisJY21kZWRpdF95ID0gY21kZWRpdF9wcm10X2xlbiAvIHc7IC8qIG5ldyBxdWFzaXJlYWwgeSAqLworCWNtZGVkaXRfeCA9IGNtZGVkaXRfcHJtdF9sZW4gJSB3OworfQorCisvKiBNb3ZlIGJhY2sgb25lIGNoYXJhY3RlciAqLworLyogKG9wdGltaXplZCBmb3Igc2xvdyB0ZXJtaW5hbHMpICovCitzdGF0aWMgdm9pZCBpbnB1dF9iYWNrd2FyZCh1bnNpZ25lZCBudW0pCit7CisJaWYgKG51bSA+IGN1cnNvcikKKwkJbnVtID0gY3Vyc29yOworCWlmIChudW0gPT0gMCkKKwkJcmV0dXJuOworCWN1cnNvciAtPSBudW07CisKKwlpZiAoKEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgfHwgRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMpCisJICYmIHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04KKwkpIHsKKwkJLyogY29ycmVjdCBOVU0gdG8gYmUgZXF1YWwgdG8gX3NjcmVlbl8gd2lkdGggKi8KKwkJaW50IG4gPSBudW07CisJCW51bSA9IDA7CisJCXdoaWxlICgtLW4gPj0gMCkKKwkJCWFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2MoJm51bSwgY29tbWFuZF9wc1tjdXJzb3IgKyBuXSk7CisJCWlmIChudW0gPT0gMCkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoY21kZWRpdF94ID49IG51bSkgeworCQljbWRlZGl0X3ggLT0gbnVtOworCQlpZiAobnVtIDw9IDQpIHsKKwkJCS8qIFRoaXMgaXMgbG9uZ2VyIGJ5IDUgYnl0ZXMgb24geDg2LgorCQkJICogQWxzbyBnZXRzIG1pc2NvbXBpbGVkIGZvciBBUk0gdXNlcnMKKwkJCSAqIChidXN5Ym94Lm5ldC9idWdzL3ZpZXcucGhwP2lkPTIyNzQpLgorCQkJICogcHJpbnRmKCgiXGJcYlxiXGIiICsgNCkgLSBudW0pOworCQkJICogcmV0dXJuOworCQkJICovCisJCQlkbyB7CisJCQkJYmJfcHV0Y2hhcignXGInKTsKKwkJCX0gd2hpbGUgKC0tbnVtKTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmludGYoRVNDIlsldUQiLCBudW0pOworCQlyZXR1cm47CisJfQorCisJLyogTmVlZCB0byBnbyBvbmUgb3IgbW9yZSBsaW5lcyB1cCAqLworCWlmIChFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUykgeworCQkvKiBXaXRoIHdpZGUgY2hhcnMsIGl0IGlzIGhhcmQgdG8gImJhY2t0cmFjayIKKwkJICogYW5kIHJlbGlhYmx5IGZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IGN1cnNvci4KKwkJICogRXhhbXBsZSAoPD4gaXMgYSB3aWRlIGNoYXI7ICMgaXMgYW4gb3JkaW5hcnkgY2hhciwgXyBjdXJzb3IpOgorCQkgKiB8cHJvbXB0OiA8Pjw+IHwKKwkJICogfDw+PD48Pjw+PD48PiB8CisJCSAqIHxfICAgICAgICAgICAgfAorCQkgKiBhbmQgdXNlciBwcmVzc2VzIGxlZnQgYXJyb3cuIG51bSA9IDEsIGNtZGVkaXRfeCA9IDAsCisJCSAqIFdlIG5lZWQgdG8gZ28gdXAgb25lIGxpbmUsIGFuZCB0aGVuIC0gaG93IGRvIHdlIGtub3cgdGhhdAorCQkgKiB3ZSBuZWVkIHRvIGdvICoxMCogcG9zaXRpb25zIHRvIHRoZSByaWdodD8gQmVjYXVzZQorCQkgKiB8cHJvbXB0OiA8PiM8PnwKKwkJICogfDw+PD48PiM8Pjw+PD58CisJCSAqIHxfICAgICAgICAgICAgfAorCQkgKiBpbiB0aGlzIHNpdHVhdGlvbiB3ZSBuZWVkIHRvIGdvICoxMSogcG9zaXRpb25zIHRvIHRoZSByaWdodC4KKwkJICoKKwkJICogQSBzaW1wbGVyIHRoaW5nIHRvIGRvIGlzIHRvIHJlZHJhdyBldmVyeXRoaW5nIGZyb20gdGhlIHN0YXJ0CisJCSAqIHVwIHRvIG5ldyBjdXJzb3IgcG9zaXRpb24gKHdoaWNoIGlzIGFscmVhZHkga25vd24pOgorCQkgKi8KKwkJdW5zaWduZWQgc3ZfY3Vyc29yOworCQkvKiBnbyB0byAxc3QgY29sdW1uOyBnbyB1cCB0byBmaXJzdCBsaW5lICovCisJCXByaW50ZigiXHIiIEVTQyJbJXVBIiwgY21kZWRpdF95KTsKKwkJY21kZWRpdF95ID0gMDsKKwkJc3ZfY3Vyc29yID0gY3Vyc29yOworCQlwdXRfcHJvbXB0KCk7IC8qIHNldHMgY3Vyc29yIHRvIDAgKi8KKwkJd2hpbGUgKGN1cnNvciA8IHN2X2N1cnNvcikKKwkJCXB1dF9jdXJfZ2x5cGhfYW5kX2luY19jdXJzb3IoKTsKKwl9IGVsc2UgeworCQlpbnQgbGluZXNfdXA7CisJCXVuc2lnbmVkIHdpZHRoOworCQkvKiBudW0gPSBjaGFycyB0byBnbyBiYWNrIGZyb20gdGhlIGJlZ2lubmluZyBvZiBjdXJyZW50IGxpbmU6ICovCisJCW51bSAtPSBjbWRlZGl0X3g7CisJCXdpZHRoID0gY21kZWRpdF90ZXJtdzsgLyogcmVhZCB2b2xhdGlsZSB2YXIgb25jZSAqLworCQkvKiBudW09MS4uLnc6IG9uZSBsaW5lIHVwLCB3KzEuLi4ydzogdHdvLCBldGM6ICovCisJCWxpbmVzX3VwID0gMSArIChudW0gLSAxKSAvIHdpZHRoOworCQljbWRlZGl0X3ggPSAod2lkdGggKiBjbWRlZGl0X3kgLSBudW0pICUgd2lkdGg7CisJCWNtZGVkaXRfeSAtPSBsaW5lc191cDsKKwkJLyogZ28gdG8gMXN0IGNvbHVtbjsgZ28gdXAgKi8KKwkJcHJpbnRmKCJcciIgRVNDIlsldUEiLCBsaW5lc191cCk7CisJCS8qIGdvIHRvIGNvcnJlY3QgY29sdW1uLgorCQkgKiB4dGVybSwga29uc29sZSwgTGludXggVlQgaW50ZXJwcmV0IDAgYXMgMSBiZWxvdyEgd293LgorCQkgKiBuZWVkIHRvICptYWtlIHN1cmUqIHdlIHNraXAgaXQgaWYgY21kZWRpdF94ID09IDAgKi8KKwkJaWYgKGNtZGVkaXRfeCkKKwkJCXByaW50ZihFU0MiWyV1QyIsIGNtZGVkaXRfeCk7CisJfQorfQorCisvKiBkcmF3IHByb21wdCwgZWRpdG9yIGxpbmUsIGFuZCBjbGVhciB0YWlsICovCitzdGF0aWMgdm9pZCByZWRyYXcoaW50IHksIGludCBiYWNrX2N1cnNvcikKK3sKKwlpZiAoeSA+IDApIC8qIHVwIHkgbGluZXMgKi8KKwkJcHJpbnRmKEVTQyJbJXVBIiwgeSk7CisJYmJfcHV0Y2hhcignXHInKTsKKwlwdXRfcHJvbXB0KCk7CisJcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKCk7CisJcHJpbnRmKFNFUV9DTEVBUl9USUxMX0VORF9PRl9TQ1JFRU4pOworCWlucHV0X2JhY2t3YXJkKGJhY2tfY3Vyc29yKTsKK30KKworLyogRGVsZXRlIHRoZSBjaGFyIGluIGZyb250IG9mIHRoZSBjdXJzb3IsIG9wdGlvbmFsbHkgc2F2aW5nIGl0CisgKiBmb3IgbGF0ZXIgcHV0YmFjayAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCitzdGF0aWMgdm9pZCBpbnB1dF9kZWxldGUodm9pZCkKKyNkZWZpbmUgaW5wdXRfZGVsZXRlKHNhdmUpIGlucHV0X2RlbGV0ZSgpCisjZWxzZQorc3RhdGljIHZvaWQgaW5wdXRfZGVsZXRlKGludCBzYXZlKQorI2VuZGlmCit7CisJaW50IGogPSBjdXJzb3I7CisKKwlpZiAoaiA9PSAoaW50KWNvbW1hbmRfbGVuKQorCQlyZXR1cm47CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJaWYgKHNhdmUpIHsKKwkJaWYgKG5ld2RlbGZsYWcpIHsKKwkJCWRlbHB0ciA9IGRlbGJ1ZjsKKwkJCW5ld2RlbGZsYWcgPSAwOworCQl9CisJCWlmICgoZGVscHRyIC0gZGVsYnVmKSA8IERFTEJVRlNJWikKKwkJCSpkZWxwdHIrKyA9IGNvbW1hbmRfcHNbal07CisJfQorI2VuZGlmCisKKwltZW1tb3ZlKGNvbW1hbmRfcHMgKyBqLCBjb21tYW5kX3BzICsgaiArIDEsCisJCQkvKiAoY29tbWFuZF9sZW4gKyAxIFtiZWNhdXNlIG9mIE5VTF0pIC0gKGogKyAxKQorCQkJICogc2ltcGxpZmllZCBpbnRvIChjb21tYW5kX2xlbiAtIGopICovCisJCQkoY29tbWFuZF9sZW4gLSBqKSAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisJY29tbWFuZF9sZW4tLTsKKwlwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3IoKTsKKwkvKiBMYXN0IGNoYXIgaXMgc3RpbGwgdmlzaWJsZSwgZXJhc2UgaXQgKGFuZCBtb3JlKSAqLworCXByaW50ZihTRVFfQ0xFQVJfVElMTF9FTkRfT0ZfU0NSRUVOKTsKKwlpbnB1dF9iYWNrd2FyZChjdXJzb3IgLSBqKTsgICAgIC8qIGJhY2sgdG8gb2xkIHBvcyBjdXJzb3IgKi8KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKK3N0YXRpYyB2b2lkIHB1dCh2b2lkKQoreworCWludCBvY3Vyc29yOworCWludCBqID0gZGVscHRyIC0gZGVsYnVmOworCisJaWYgKGogPT0gMCkKKwkJcmV0dXJuOworCW9jdXJzb3IgPSBjdXJzb3I7CisJLyogb3BlbiBob2xlIGFuZCB0aGVuIGZpbGwgaXQgKi8KKwltZW1tb3ZlKGNvbW1hbmRfcHMgKyBjdXJzb3IgKyBqLCBjb21tYW5kX3BzICsgY3Vyc29yLAorCQkJKGNvbW1hbmRfbGVuIC0gY3Vyc29yICsgMSkgKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworCW1lbWNweShjb21tYW5kX3BzICsgY3Vyc29yLCBkZWxidWYsIGogKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworCWNvbW1hbmRfbGVuICs9IGo7CisJcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKCk7CisJaW5wdXRfYmFja3dhcmQoY3Vyc29yIC0gb2N1cnNvciAtIGogKyAxKTsgLyogYXQgZW5kIG9mIG5ldyB0ZXh0ICovCit9CisjZW5kaWYKKworLyogRGVsZXRlIHRoZSBjaGFyIGluIGJhY2sgb2YgdGhlIGN1cnNvciAqLworc3RhdGljIHZvaWQgaW5wdXRfYmFja3NwYWNlKHZvaWQpCit7CisJaWYgKGN1cnNvciA+IDApIHsKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJCWlucHV0X2RlbGV0ZSgwKTsKKwl9Cit9CisKKy8qIE1vdmUgZm9yd2FyZCBvbmUgY2hhcmFjdGVyICovCitzdGF0aWMgdm9pZCBpbnB1dF9mb3J3YXJkKHZvaWQpCit7CisJaWYgKGN1cnNvciA8IGNvbW1hbmRfbGVuKQorCQlwdXRfY3VyX2dseXBoX2FuZF9pbmNfY3Vyc29yKCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCisvL0ZJWE1FOgorLy9uZWVkcyB0byBiZSBtb3JlIGNsZXZlcjogY3VycmVudGx5IGl0IHRoaW5rcyB0aGF0ICJmb29cIGI8VEFCPgorLy9tYXRjaGVzIHRoZSBmaWxlIG5hbWVkICJmb28gYmFyIiwgd2hpY2ggaXMgdW50cnVlLgorLy9BbHNvLCBwZXJoYXBzICJmb28gYjxUQUI+IG5lZWRzIHRvIGNvbXBsZXRlIHRvICJmb28gYmFyIiA8Y3Vyc29yPiwKKy8vbm90ICJmb28gYmFyIDxjdXJzb3I+Li4uCisKK3N0YXRpYyB2b2lkIGZyZWVfdGFiX2NvbXBsZXRpb25fZGF0YSh2b2lkKQoreworCWlmIChtYXRjaGVzKSB7CisJCXdoaWxlIChudW1fbWF0Y2hlcykKKwkJCWZyZWUobWF0Y2hlc1stLW51bV9tYXRjaGVzXSk7CisJCWZyZWUobWF0Y2hlcyk7CisJCW1hdGNoZXMgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgYWRkX21hdGNoKGNoYXIgKm1hdGNoZWQpCit7CisJbWF0Y2hlcyA9IHhyZWFsbG9jX3ZlY3RvcihtYXRjaGVzLCA0LCBudW1fbWF0Y2hlcyk7CisJbWF0Y2hlc1tudW1fbWF0Y2hlc10gPSBtYXRjaGVkOworCW51bV9tYXRjaGVzKys7Cit9CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTgorLyogUmVwbGFjZSAifnVzZXIvLi4uIiB3aXRoICIvaG9tZWRpci8uLi4iLgorICogVGhlIHBhcmFtZXRlciBpcyBtYWxsb2NlZCwgZnJlZSBpdCBvciByZXR1cm4gaXQKKyAqIHVuY2hhbmdlZCBpZiBubyB1c2VyIGlzIG1hdGNoZWQuCisgKi8KK3N0YXRpYyBjaGFyICp1c2VybmFtZV9wYXRoX2NvbXBsZXRpb24oY2hhciAqdWQpCit7CisJc3RydWN0IHBhc3N3ZCAqZW50cnk7CisJY2hhciAqdGlsZGVfbmFtZSA9IHVkOworCWNoYXIgKmhvbWUgPSBOVUxMOworCisJdWQrKzsgLyogc2tpcCB+ICovCisJaWYgKCp1ZCA9PSAnLycpIHsgICAgICAgLyogIn4vLi4uIiAqLworCQlob21lID0gaG9tZV9wd2RfYnVmOworCX0gZWxzZSB7CisJCS8qICJ+dXNlci8uLi4iICovCisJCXVkID0gc3RyY2hyKHVkLCAnLycpOworCQkqdWQgPSAnXDAnOyAgICAgICAgICAgLyogIn51c2VyIiAqLworCQllbnRyeSA9IGdldHB3bmFtKHRpbGRlX25hbWUgKyAxKTsKKwkJKnVkID0gJy8nOyAgICAgICAgICAgIC8qIHJlc3RvcmUgIn51c2VyLy4uLiIgKi8KKwkJaWYgKGVudHJ5KQorCQkJaG9tZSA9IGVudHJ5LT5wd19kaXI7CisJfQorCWlmIChob21lKSB7CisJCXVkID0gY29uY2F0X3BhdGhfZmlsZShob21lLCB1ZCk7CisJCWZyZWUodGlsZGVfbmFtZSk7CisJCXRpbGRlX25hbWUgPSB1ZDsKKwl9CisJcmV0dXJuIHRpbGRlX25hbWU7Cit9CisKKy8qIH51c2U8dGFiPiAtIGZpbmQgYWxsIHVzZXJzIHdpdGggdGhpcyBwcmVmaXguCisgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IHVzZWQgZm9yIG1hdGNoaW5nLgorICovCitzdGF0aWMgTk9JTkxJTkUgdW5zaWduZWQgY29tcGxldGVfdXNlcm5hbWUoY29uc3QgY2hhciAqdWQpCit7CisJLyogVXNpbmcgX3IgZnVuY3Rpb24gdG8gYXZvaWQgcHVsbGluZyBpbiBzdGF0aWMgYnVmZmVycyAqLworCWNoYXIgbGluZV9idWZmWzI1Nl07CisJc3RydWN0IHBhc3N3ZCBwd2Q7CisJc3RydWN0IHBhc3N3ZCAqcmVzdWx0OworCXVuc2lnbmVkIHVzZXJsZW47CisKKwl1ZCsrOyAvKiBza2lwIH4gKi8KKwl1c2VybGVuID0gc3RybGVuKHVkKTsKKworCXNldHB3ZW50KCk7CisJd2hpbGUgKCFnZXRwd2VudF9yKCZwd2QsIGxpbmVfYnVmZiwgc2l6ZW9mKGxpbmVfYnVmZiksICZyZXN1bHQpKSB7CisJCS8qIE51bGwgdXNlcm5hbWVzIHNob3VsZCByZXN1bHQgaW4gYWxsIHVzZXJzIGFzIHBvc3NpYmxlIGNvbXBsZXRpb25zLiAqLworCQlpZiAoLyohdXNlcmxlbiB8fCAqLyBzdHJuY21wKHVkLCBwd2QucHdfbmFtZSwgdXNlcmxlbikgPT0gMCkgeworCQkJYWRkX21hdGNoKHhhc3ByaW50ZigifiVzLyIsIHB3ZC5wd19uYW1lKSk7CisJCX0KKwl9CisJZW5kcHdlbnQoKTsKKworCXJldHVybiAxICsgdXNlcmxlbjsKK30KKyMgZW5kaWYgIC8qIEZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiAqLworCitlbnVtIHsKKwlGSU5EX0VYRV9PTkxZID0gMCwKKwlGSU5EX0RJUl9PTkxZID0gMSwKKwlGSU5EX0ZJTEVfT05MWSA9IDIsCit9OworCitzdGF0aWMgaW50IHBhdGhfcGFyc2UoY2hhciAqKipwKQoreworCWludCBucHRoOworCWNvbnN0IGNoYXIgKnB0aDsKKwljaGFyICp0bXA7CisJY2hhciAqKnJlczsKKworCWlmIChzdGF0ZS0+ZmxhZ3MgJiBXSVRIX1BBVEhfTE9PS1VQKQorCQlwdGggPSBzdGF0ZS0+cGF0aF9sb29rdXA7CisJZWxzZQorCQlwdGggPSBnZXRlbnYoIlBBVEgiKTsKKworCS8qIFBBVEg9IiIgb3IgUEFUSD0iOiI/ICovCisJaWYgKCFwdGggfHwgIXB0aFswXSB8fCBMT05FX0NIQVIocHRoLCAnOicpKQorCQlyZXR1cm4gMTsKKworCXRtcCA9IChjaGFyKilwdGg7CisJbnB0aCA9IDE7IC8qIHBhdGggY29tcG9uZW50IGNvdW50ICovCisJd2hpbGUgKDEpIHsKKwkJdG1wID0gc3RyY2hyKHRtcCwgJzonKTsKKwkJaWYgKCF0bXApCisJCQlicmVhazsKKwkJdG1wKys7CisJCWlmICgqdG1wID09ICdcMCcpCisJCQlicmVhazsgIC8qIDo8ZW1wdHk+ICovCisJCW5wdGgrKzsKKwl9CisKKwkqcCA9IHJlcyA9IHhtYWxsb2MobnB0aCAqIHNpemVvZihyZXNbMF0pKTsKKwlyZXNbMF0gPSB0bXAgPSB4c3RyZHVwKHB0aCk7CisJbnB0aCA9IDE7CisJd2hpbGUgKDEpIHsKKwkJdG1wID0gc3RyY2hyKHRtcCwgJzonKTsKKwkJaWYgKCF0bXApCisJCQlicmVhazsKKwkJKnRtcCsrID0gJ1wwJzsgLyogJzonIC0+ICdcMCcgKi8KKwkJaWYgKCp0bXAgPT0gJ1wwJykKKwkJCWJyZWFrOyAvKiA6PGVtcHR5PiAqLworCQlyZXNbbnB0aCsrXSA9IHRtcDsKKwl9CisJcmV0dXJuIG5wdGg7Cit9CisKKy8qIENvbXBsZXRlIGNvbW1hbmQsIGRpcmVjdG9yeSBvciBmaWxlIG5hbWUuCisgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IHVzZWQgZm9yIG1hdGNoaW5nLgorICovCitzdGF0aWMgTk9JTkxJTkUgdW5zaWduZWQgY29tcGxldGVfY21kX2Rpcl9maWxlKGNvbnN0IGNoYXIgKmNvbW1hbmQsIGludCB0eXBlKQoreworCWNoYXIgKnBhdGgxWzFdOworCWNoYXIgKipwYXRocyA9IHBhdGgxOworCWludCBucGF0aHM7CisJaW50IGk7CisJdW5zaWduZWQgcGZfbGVuOworCWNvbnN0IGNoYXIgKnBmaW5kOworCWNoYXIgKmRpcmJ1ZiA9IE5VTEw7CisKKwlucGF0aHMgPSAxOworCXBhdGgxWzBdID0gKGNoYXIqKSIuIjsKKworCXBmaW5kID0gc3RycmNocihjb21tYW5kLCAnLycpOworCWlmICghcGZpbmQpIHsKKwkJaWYgKHR5cGUgPT0gRklORF9FWEVfT05MWSkKKwkJCW5wYXRocyA9IHBhdGhfcGFyc2UoJnBhdGhzKTsKKwkJcGZpbmQgPSBjb21tYW5kOworCX0gZWxzZSB7CisJCS8qIHBvaW50IHRvICdsJyBpbiAiLi4uLi9sYXN0X2NvbXBvbmVudCIgKi8KKwkJcGZpbmQrKzsKKwkJLyogZGlyYnVmID0gIi4uLi8uLi4vLi4uLyIgKi8KKwkJZGlyYnVmID0geHN0cm5kdXAoY29tbWFuZCwgcGZpbmQgLSBjb21tYW5kKTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTgorCQlpZiAoZGlyYnVmWzBdID09ICd+JykgICAvKiB+Ly4uLiBvciB+dXNlci8uLi4gKi8KKwkJCWRpcmJ1ZiA9IHVzZXJuYW1lX3BhdGhfY29tcGxldGlvbihkaXJidWYpOworIyBlbmRpZgorCQlwYXRoMVswXSA9IGRpcmJ1ZjsKKwl9CisJcGZfbGVuID0gc3RybGVuKHBmaW5kKTsKKworCWZvciAoaSA9IDA7IGkgPCBucGF0aHM7IGkrKykgeworCQlESVIgKmRpcjsKKwkJc3RydWN0IGRpcmVudCAqbmV4dDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIgKmZvdW5kOworCisJCWRpciA9IG9wZW5kaXIocGF0aHNbaV0pOworCQlpZiAoIWRpcikKKwkJCWNvbnRpbnVlOyAvKiBkb24ndCBwcmludCBhbiBlcnJvciAqLworCisJCXdoaWxlICgobmV4dCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgbGVuOworCQkJY29uc3QgY2hhciAqbmFtZV9mb3VuZCA9IG5leHQtPmRfbmFtZTsKKworCQkJLyogLi4uLzx0YWI+OiBiYXNoIDMuMi4wIHNob3dzIGRvdGZpbGVzLCBidXQgbm90IC4gYW5kIC4uICovCisJCQlpZiAoIXBmaW5kWzBdICYmIERPVF9PUl9ET1RET1QobmFtZV9mb3VuZCkpCisJCQkJY29udGludWU7CisJCQkvKiBtYXRjaD8gKi8KKwkJCWlmIChzdHJuY21wKG5hbWVfZm91bmQsIHBmaW5kLCBwZl9sZW4pICE9IDApCisJCQkJY29udGludWU7IC8qIG5vICovCisKKwkJCWZvdW5kID0gY29uY2F0X3BhdGhfZmlsZShwYXRoc1tpXSwgbmFtZV9mb3VuZCk7CisJCQkvKiBOQjogc3RhdCgpIGZpcnN0IHNvIHRoYXQgd2Ugc2VlIGlzIGl0IGEgZGlyZWN0b3J5OworCQkJICogYnV0IGlmIHRoYXQgZmFpbHMsIHVzZSBsc3RhdCgpIHNvIHRoYXQKKwkJCSAqIHdlIHN0aWxsIG1hdGNoIGRhbmdsaW5nIGxpbmtzICovCisJCQlpZiAoc3RhdChmb3VuZCwgJnN0KSAmJiBsc3RhdChmb3VuZCwgJnN0KSkKKwkJCQlnb3RvIGNvbnQ7IC8qIGhtbSwgcmVtb3ZlIGluIHByb2dyZXNzPyAqLworCisJCQkvKiBTYXZlIG9ubHkgbmFtZSAqLworCQkJbGVuID0gc3RybGVuKG5hbWVfZm91bmQpOworCQkJZm91bmQgPSB4cmVhbGxvYyhmb3VuZCwgbGVuICsgMik7IC8qICsyOiBmb3Igc2xhc2ggYW5kIE5VTCAqLworCQkJc3RyY3B5KGZvdW5kLCBuYW1lX2ZvdW5kKTsKKworCQkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCQkvKiBuYW1lIGlzIGEgZGlyZWN0b3J5LCBhZGQgc2xhc2ggKi8KKwkJCQlmb3VuZFtsZW5dID0gJy8nOworCQkJCWZvdW5kW2xlbiArIDFdID0gJ1wwJzsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2tpcCBmaWxlcyBpZiBsb29raW5nIGZvciBkaXJzIG9ubHkgKGV4YW1wbGU6IGNkKSAqLworCQkJCWlmICh0eXBlID09IEZJTkRfRElSX09OTFkpCisJCQkJCWdvdG8gY29udDsKKwkJCX0KKwkJCS8qIGFkZCBpdCB0byB0aGUgbGlzdCAqLworCQkJYWRkX21hdGNoKGZvdW5kKTsKKwkJCWNvbnRpbnVlOworIGNvbnQ6CisJCQlmcmVlKGZvdW5kKTsKKwkJfQorCQljbG9zZWRpcihkaXIpOworCX0gLyogZm9yIGV2ZXJ5IHBhdGggKi8KKworCWlmIChwYXRocyAhPSBwYXRoMSkgeworCQlmcmVlKHBhdGhzWzBdKTsgLyogYWxsb2NhdGVkIG1lbW9yeSBpcyBvbmx5IGluIGZpcnN0IG1lbWJlciAqLworCQlmcmVlKHBhdGhzKTsKKwl9CisJZnJlZShkaXJidWYpOworCisJcmV0dXJuIHBmX2xlbjsKK30KKworLyogYnVpbGRfbWF0Y2hfcHJlZml4OgorICogT24gZW50cnksIG1hdGNoX2J1ZiBjb250YWlucyBldmVyeXRoaW5nIHVwIHRvIGN1cnNvciBhdCB0aGUgbW9tZW50IDx0YWI+CisgKiB3YXMgcHJlc3NlZC4gVGhpcyBmdW5jdGlvbiBsb29rcyBhdCBpdCwgZmlndXJlcyBvdXQgd2hhdCBwYXJ0IG9mIGl0CisgKiBjb25zdGl0dXRlcyB0aGUgY29tbWFuZC9maWxlL2RpcmVjdG9yeSBwcmVmaXggdG8gdXNlIGZvciBjb21wbGV0aW9uLAorICogYW5kIHJld3JpdGVzIG1hdGNoX2J1ZiB0byBjb250YWluIG9ubHkgdGhhdCBwYXJ0LgorICovCisjZGVmaW5lIGRiZ19ibXAgMAorLyogSGVscGVyczogKi8KKy8qIFFVT1QgaXMgdXNlZCBvbiBlbGVtZW50cyBvZiBpbnRfYnVmW10sIHdoaWNoIGFyZSBieXRlcywKKyAqIG5vdCBVbmljb2RlIGNoYXJzLiBUaGVyZWZvcmUgaXQgd29ya3MgY29ycmVjdGx5IGV2ZW4gaW4gVW5pY29kZSBtb2RlLgorICovCisjZGVmaW5lIFFVT1QgKFVDSEFSX01BWCsxKQorc3RhdGljIHZvaWQgcmVtb3ZlX2NodW5rKGludDE2X3QgKmludF9idWYsIGludCBiZWcsIGludCBlbmQpCit7CisJLyogYmVnIG11c3QgYmUgPD0gZW5kICovCisJaWYgKGJlZyA9PSBlbmQpCisJCXJldHVybjsKKworCXdoaWxlICgoaW50X2J1ZltiZWddID0gaW50X2J1ZltlbmRdKSAhPSAwKQorCQliZWcrKywgZW5kKys7CisKKwlpZiAoZGJnX2JtcCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKQorCQkJYmJfcHV0Y2hhcigodW5zaWduZWQgY2hhcilpbnRfYnVmW2ldKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9Cit9CisvKiBDYWxsZXIgZW5zdXJlcyB0aGF0IG1hdGNoX2J1ZiBwb2ludHMgdG8gYSBtYWxsb2NlZCBidWZmZXIKKyAqIGJpZyBlbm91Z2ggdG8gaG9sZCBzdHJsZW4obWF0Y2hfYnVmKSoyICsgMgorICovCitzdGF0aWMgTk9JTkxJTkUgaW50IGJ1aWxkX21hdGNoX3ByZWZpeChjaGFyICptYXRjaF9idWYpCit7CisJaW50IGksIGo7CisJaW50IGNvbW1hbmRfbW9kZTsKKwlpbnQxNl90ICppbnRfYnVmID0gKGludDE2X3QqKW1hdGNoX2J1ZjsKKworCWlmIChkYmdfYm1wKSBwcmludGYoIlxuJXNcbiIsIG1hdGNoX2J1Zik7CisKKwkvKiBDb3B5IGluIHJldmVyc2Ugb3JkZXIsIHNpbmNlIHRoZXkgb3ZlcmxhcCAqLworCWkgPSBzdHJsZW4obWF0Y2hfYnVmKTsKKwlkbyB7CisJCWludF9idWZbaV0gPSAodW5zaWduZWQgY2hhciltYXRjaF9idWZbaV07CisJCWktLTsKKwl9IHdoaWxlIChpID49IDApOworCisJLyogTWFyayBldmVyeSBcYyBhcyAicXVvdGVkIGMiICovCisJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKSB7CisJCWlmIChpbnRfYnVmW2ldID09ICdcXCcpIHsKKwkJCXJlbW92ZV9jaHVuayhpbnRfYnVmLCBpLCBpICsgMSk7CisJCQlpbnRfYnVmW2ldIHw9IFFVT1Q7CisJCX0KKwl9CisJLyogUXVvdGUtbWFyayAiY2hhcnMiIGFuZCAnY2hhcnMnLCBkcm9wIGRlbGltaXRlcnMgKi8KKwl7CisJCWludCBpbl9xdW90ZSA9IDA7CisJCWkgPSAwOworCQl3aGlsZSAoaW50X2J1ZltpXSkgeworCQkJaW50IGN1ciA9IGludF9idWZbaV07CisJCQlpZiAoIWN1cikKKwkJCQlicmVhazsKKwkJCWlmIChjdXIgPT0gJ1wnJyB8fCBjdXIgPT0gJyInKSB7CisJCQkJaWYgKCFpbl9xdW90ZSB8fCAoY3VyID09IGluX3F1b3RlKSkgeworCQkJCQlpbl9xdW90ZSBePSBjdXI7CisJCQkJCXJlbW92ZV9jaHVuayhpbnRfYnVmLCBpLCBpICsgMSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWlmIChpbl9xdW90ZSkKKwkJCQlpbnRfYnVmW2ldID0gY3VyIHwgUVVPVDsKKwkJCWkrKzsKKwkJfQorCX0KKworCS8qIFJlbW92ZSBldmVyeXRoaW5nIHVwIHRvIGNvbW1hbmQgZGVsaW1pdGVyczoKKwkgKiAnOycgJzs7JyAnJicgJ3wnICcmJicgJ3x8JywKKwkgKiBidXQgY2FyZWZ1bCB3aXRoICc+JicgJzwmJyAnPnwnCisJICovCisJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKSB7CisJCWludCBjdXIgPSBpbnRfYnVmW2ldOworCQlpZiAoY3VyID09ICc7JyB8fCBjdXIgPT0gJyYnIHx8IGN1ciA9PSAnfCcpIHsKKwkJCWludCBwcmV2ID0gaSA/IGludF9idWZbaSAtIDFdIDogMDsKKwkJCWlmIChjdXIgPT0gJyYnICYmIChwcmV2ID09ICc+JyB8fCBwcmV2ID09ICc8JykpIHsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoY3VyID09ICd8JyAmJiBwcmV2ID09ICc+JykgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkgKyAxICsgKGN1ciA9PSBpbnRfYnVmW2kgKyAxXSkpOworCQkJaSA9IC0xOyAgLyogYmFjayB0byBzcXVhcmUgMSAqLworCQl9CisJfQorCS8qIFJlbW92ZSBhbGwgYGNtZGAgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJ2AnKSB7CisJCQlmb3IgKGogPSBpICsgMTsgaW50X2J1ZltqXTsgaisrKSB7CisJCQkJaWYgKGludF9idWZbal0gPT0gJ2AnKSB7CisJCQkJCS8qIGBjbWRgIHNob3VsZCBjb3VudCBhcyBhIHdvcmQ6CisJCQkJCSAqIGBjbWRgIGM8dGFiPiBzaG91bGQgc2VhcmNoIGZvciBmaWxlcyBjKiwKKwkJCQkJICogbm90IGNvbW1hbmRzIGMqLiBUaGVyZWZvcmUgd2UgZG9uJ3QgZHJvcAorCQkJCQkgKiBgY21kYCBlbnRpcmVseSwgd2UgcmVwbGFjZSBpdCB3aXRoIHNpbmdsZSBgLgorCQkJCQkgKi8KKwkJCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIGksIGopOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJLyogTm8gY2xvc2luZyBgIC0gY29tbWFuZCBtb2RlLCByZW1vdmUgYWxsIHVwIHRvIGAgKi8KKwkJCXJlbW92ZV9jaHVuayhpbnRfYnVmLCAwLCBpICsgMSk7CisJCQlicmVhazsKKyBuZXh0OiA7CisJCX0KKwl9CisKKwkvKiBSZW1vdmUgImNtZCAoIiBhbmQgImNtZCB7IgorCSAqIEV4YW1wbGU6ICJpZiB7IGM8dGFiPiIKKwkgKiBJbiB0aGlzIGV4YW1wbGUsIGMgc2hvdWxkIGJlIG1hdGNoZWQgYXMgY29tbWFuZCBwZnguCisJICovCisJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKSB7CisJCWlmIChpbnRfYnVmW2ldID09ICcoJyB8fCBpbnRfYnVmW2ldID09ICd7JykgeworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkgKyAxKTsKKwkJCWkgPSAtMTsgIC8qIGJhY2sgdG8gc3F1YXJlIDEgKi8KKwkJfQorCX0KKworCS8qIFJlbW92ZSBsZWFkaW5nIHVucXVvdGVkIHNwYWNlcyAqLworCWZvciAoaSA9IDA7IGludF9idWZbaV07IGkrKykKKwkJaWYgKGludF9idWZbaV0gIT0gJyAnKQorCQkJYnJlYWs7CisJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkpOworCisJLyogRGV0ZXJtaW5lIGNvbXBsZXRpb24gbW9kZSAqLworCWNvbW1hbmRfbW9kZSA9IEZJTkRfRVhFX09OTFk7CisJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKSB7CisJCWlmIChpbnRfYnVmW2ldID09ICcgJyB8fCBpbnRfYnVmW2ldID09ICc8JyB8fCBpbnRfYnVmW2ldID09ICc+JykgeworCQkJaWYgKGludF9idWZbaV0gPT0gJyAnCisJCQkgJiYgY29tbWFuZF9tb2RlID09IEZJTkRfRVhFX09OTFkKKwkJCSAmJiAoY2hhcilpbnRfYnVmWzBdID09ICdjJworCQkJICYmIChjaGFyKWludF9idWZbMV0gPT0gJ2QnCisJCQkgJiYgaSA9PSAyIC8qIC0+IGludF9idWZbMl0gPT0gJyAnICovCisJCQkpIHsKKwkJCQljb21tYW5kX21vZGUgPSBGSU5EX0RJUl9PTkxZOworCQkJfSBlbHNlIHsKKwkJCQljb21tYW5kX21vZGUgPSBGSU5EX0ZJTEVfT05MWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZGJnX2JtcCkgcHJpbnRmKCJjb21tYW5kX21vZGUoMDpleGUvMTpkaXIvMjpmaWxlKTolZFxuIiwgY29tbWFuZF9tb2RlKTsKKworCS8qIFJlbW92ZSBldmVyeXRoaW5nIGV4Y2VwdCBsYXN0IHdvcmQgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIC8qIHF1YXNpLXN0cmxlbihpbnRfYnVmKSAqLworCQljb250aW51ZTsKKwlmb3IgKC0taTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGN1ciA9IGludF9idWZbaV07CisJCWlmIChjdXIgPT0gJyAnIHx8IGN1ciA9PSAnPCcgfHwgY3VyID09ICc+JyB8fCBjdXIgPT0gJ3wnIHx8IGN1ciA9PSAnJicpIHsKKwkJCXJlbW92ZV9jaHVuayhpbnRfYnVmLCAwLCBpICsgMSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENvbnZlcnQgYmFjayB0byBzdHJpbmcgb2YgX2NoYXJzXyAqLworCWkgPSAwOworCXdoaWxlICgobWF0Y2hfYnVmW2ldID0gaW50X2J1ZltpXSkgIT0gJ1wwJykKKwkJaSsrOworCisJaWYgKGRiZ19ibXApIHByaW50ZigiZmluYWwgbWF0Y2hfYnVmOiclcydcbiIsIG1hdGNoX2J1Zik7CisKKwlyZXR1cm4gY29tbWFuZF9tb2RlOworfQorCisvKgorICogRGlzcGxheSBieSBjb2x1bW4gKG9yaWdpbmFsIGlkZWEgZnJvbSBscyBhcHBsZXQsCisgKiB2ZXJ5IG9wdGltaXplZCBieSBtZSBbVmxhZGltaXJdIDopCisgKi8KK3N0YXRpYyB2b2lkIHNob3dmaWxlcyh2b2lkKQoreworCWludCBuY29scywgcm93OworCWludCBjb2x1bW5fd2lkdGggPSAwOworCWludCBuZmlsZXMgPSBudW1fbWF0Y2hlczsKKwlpbnQgbnJvd3MgPSBuZmlsZXM7CisJaW50IGw7CisKKwkvKiBmaW5kIHRoZSBsb25nZXN0IGZpbGUgbmFtZSAtIHVzZSB0aGF0IGFzIHRoZSBjb2x1bW4gd2lkdGggKi8KKwlmb3IgKHJvdyA9IDA7IHJvdyA8IG5yb3dzOyByb3crKykgeworCQlsID0gdW5pY29kZV9zdHJ3aWR0aChtYXRjaGVzW3Jvd10pOworCQlpZiAoY29sdW1uX3dpZHRoIDwgbCkKKwkJCWNvbHVtbl93aWR0aCA9IGw7CisJfQorCWNvbHVtbl93aWR0aCArPSAyOyAgICAgICAgICAgICAgLyogbWluIHNwYWNlIGZvciBjb2x1bW5zICovCisJbmNvbHMgPSBjbWRlZGl0X3Rlcm13IC8gY29sdW1uX3dpZHRoOworCisJaWYgKG5jb2xzID4gMSkgeworCQlucm93cyAvPSBuY29sczsKKwkJaWYgKG5maWxlcyAlIG5jb2xzKQorCQkJbnJvd3MrKzsgICAgICAgIC8qIHJvdW5kIHVwIGZyYWN0aW9uYWxzICovCisJfSBlbHNlIHsKKwkJbmNvbHMgPSAxOworCX0KKwlmb3IgKHJvdyA9IDA7IHJvdyA8IG5yb3dzOyByb3crKykgeworCQlpbnQgbiA9IHJvdzsKKwkJaW50IG5jOworCisJCWZvciAobmMgPSAxOyBuYyA8IG5jb2xzICYmIG4rbnJvd3MgPCBuZmlsZXM7IG4gKz0gbnJvd3MsIG5jKyspIHsKKwkJCXByaW50ZigiJXMlLSpzIiwgbWF0Y2hlc1tuXSwKKwkJCQkoaW50KShjb2x1bW5fd2lkdGggLSB1bmljb2RlX3N0cndpZHRoKG1hdGNoZXNbbl0pKSwgIiIKKwkJCSk7CisJCX0KKwkJaWYgKEVOQUJMRV9VTklDT0RFX1NVUFBPUlQpCisJCQlwdXRzKHByaW50YWJsZV9zdHJpbmcoTlVMTCwgbWF0Y2hlc1tuXSkpOworCQllbHNlCisJCQlwdXRzKG1hdGNoZXNbbl0pOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlzX3NwZWNpYWxfY2hhcihjaGFyIGMpCit7CisJcmV0dXJuIHN0cmNocigiIGBcIiMkJV4mKigpPSt7fVtdOjsnfFxcPD4iLCBjKTsKK30KKworc3RhdGljIGNoYXIgKnF1b3RlX3NwZWNpYWxfY2hhcnMoY2hhciAqZm91bmQpCit7CisJaW50IGwgPSAwOworCWNoYXIgKnMgPSB4emFsbG9jKChzdHJsZW4oZm91bmQpICsgMSkgKiAyKTsKKworCXdoaWxlICgqZm91bmQpIHsKKwkJaWYgKGlzX3NwZWNpYWxfY2hhcigqZm91bmQpKQorCQkJc1tsKytdID0gJ1xcJzsKKwkJc1tsKytdID0gKmZvdW5kKys7CisJfQorCS8qIHNbbF0gPSAnXDAnOyAtIGFscmVhZHkgaXMgKi8KKwlyZXR1cm4gczsKK30KKworLyogRG8gVEFCIGNvbXBsZXRpb24gKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIGlucHV0X3RhYihzbWFsbGludCAqbGFzdFdhc1RhYikKK3sKKwljaGFyICpjaG9zZW5fbWF0Y2g7CisJY2hhciAqbWF0Y2hfYnVmOworCXNpemVfdCBsZW5fZm91bmQ7CisJLyogTGVuZ3RoIG9mIHN0cmluZyB1c2VkIGZvciBtYXRjaGluZyAqLworCXVuc2lnbmVkIG1hdGNoX3BmeF9sZW4gPSBtYXRjaF9wZnhfbGVuOworCWludCBmaW5kX3R5cGU7CisjIGlmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkvKiBjdXJzb3IgcG9zIGluIGNvbW1hbmQgY29udmVydGVkIHRvIG11bHRpYnl0ZSBmb3JtICovCisJaW50IGN1cnNvcl9tYjsKKyMgZW5kaWYKKwlpZiAoIShzdGF0ZS0+ZmxhZ3MgJiBUQUJfQ09NUExFVElPTikpCisJCXJldHVybjsKKworCWlmICgqbGFzdFdhc1RhYikgeworCQkvKiBUaGUgbGFzdCBjaGFyIHdhcyBhIFRBQiB0b28uCisJCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBjaG9pY2VzLgorCQkgKi8KKwkJaWYgKG51bV9tYXRjaGVzID4gMCkgeworCQkJLyogY3Vyc29yIHdpbGwgYmUgY2hhbmdlZCBieSBnb3RvX25ld19saW5lKCkgKi8KKwkJCWludCBzYXZfY3Vyc29yID0gY3Vyc29yOworCQkJZ290b19uZXdfbGluZSgpOworCQkJc2hvd2ZpbGVzKCk7CisJCQlyZWRyYXcoMCwgY29tbWFuZF9sZW4gLSBzYXZfY3Vyc29yKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJKmxhc3RXYXNUYWIgPSAxOworCWNob3Nlbl9tYXRjaCA9IE5VTEw7CisKKwkvKiBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgc3RyaW5nIHVwIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLgorCSAqIGJ1aWxkX21hdGNoX3ByZWZpeCB3aWxsIGV4cGFuZCBpdCBpbnRvIGludDE2X3QncywgbmVlZCB0byBhbGxvY2F0ZQorCSAqIHR3aWNlIGFzIG11Y2ggYXMgdGhlIHN0cmluZ19sZW4rMS4KKwkgKiAod2UgdGhlbiBhbHNvIChhYil1c2UgdGhpcyBleHRyYSBzcGFjZSBsYXRlciAtIHNlZSAoKiopKQorCSAqLworCW1hdGNoX2J1ZiA9IHhtYWxsb2MoTUFYX0xJTkVMRU4gKiBzaXplb2YoaW50MTZfdCkpOworIyBpZiAhRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCXNhdmVfc3RyaW5nKG1hdGNoX2J1ZiwgY3Vyc29yICsgMSk7IC8qICsxIGZvciBOVUwgKi8KKyMgZWxzZQorCXsKKwkJQ0hBUl9UIHdjID0gY29tbWFuZF9wc1tjdXJzb3JdOworCQljb21tYW5kX3BzW2N1cnNvcl0gPSBCQl9OVUw7CisJCXNhdmVfc3RyaW5nKG1hdGNoX2J1ZiwgTUFYX0xJTkVMRU4pOworCQljb21tYW5kX3BzW2N1cnNvcl0gPSB3YzsKKwkJY3Vyc29yX21iID0gc3RybGVuKG1hdGNoX2J1Zik7CisJfQorIyBlbmRpZgorCWZpbmRfdHlwZSA9IGJ1aWxkX21hdGNoX3ByZWZpeChtYXRjaF9idWYpOworCisJLyogRnJlZSB1cCBhbnkgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkICovCisJZnJlZV90YWJfY29tcGxldGlvbl9kYXRhKCk7CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTgorCS8qIElmIHRoZSB3b3JkIHN0YXJ0cyB3aXRoIH4gYW5kIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSB3b3JkLAorCSAqIHRoZW4gdHJ5IGNvbXBsZXRpbmcgdGhpcyB3b3JkIGFzIGEgdXNlcm5hbWUuICovCisJaWYgKHN0YXRlLT5mbGFncyAmIFVTRVJOQU1FX0NPTVBMRVRJT04pCisJCWlmIChtYXRjaF9idWZbMF0gPT0gJ34nICYmIHN0cmNocihtYXRjaF9idWYsICcvJykgPT0gTlVMTCkKKwkJCW1hdGNoX3BmeF9sZW4gPSBjb21wbGV0ZV91c2VybmFtZShtYXRjaF9idWYpOworIyBlbmRpZgorCS8qIElmIGNvbXBsZXRlX3VzZXJuYW1lKCkgZGlkIG5vdCBtYXRjaCwKKwkgKiB0cnkgdG8gbWF0Y2ggYSBjb21tYW5kIGluICRQQVRILCBvciBhIGRpcmVjdG9yeSwgb3IgYSBmaWxlICovCisJaWYgKCFtYXRjaGVzKQorCQltYXRjaF9wZnhfbGVuID0gY29tcGxldGVfY21kX2Rpcl9maWxlKG1hdGNoX2J1ZiwgZmluZF90eXBlKTsKKworCS8qIEFjY291bnQgZm9yIGJhY2tzbGFzaGVzIHdoaWNoIHdpbGwgYmUgaW5zZXJ0ZWQKKwkgKiBieSBxdW90ZV9zcGVjaWFsX2NoYXJzKCkgbGF0ZXIgKi8KKwl7CisJCWNvbnN0IGNoYXIgKmUgPSBtYXRjaF9idWYgKyBzdHJsZW4obWF0Y2hfYnVmKTsKKwkJY29uc3QgY2hhciAqcyA9IGUgLSBtYXRjaF9wZnhfbGVuOworCQl3aGlsZSAocyA8IGUpCisJCQlpZiAoaXNfc3BlY2lhbF9jaGFyKCpzKyspKQorCQkJCW1hdGNoX3BmeF9sZW4rKzsKKwl9CisKKwkvKiBSZW1vdmUgZHVwbGljYXRlcyAqLworCWlmIChtYXRjaGVzKSB7CisJCXVuc2lnbmVkIGksIG4gPSAwOworCQlxc29ydF9zdHJpbmdfdmVjdG9yKG1hdGNoZXMsIG51bV9tYXRjaGVzKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9tYXRjaGVzIC0gMTsgKytpKSB7CisJCQkvL2lmIChtYXRjaGVzW2ldICYmIG1hdGNoZXNbaSsxXSkgeyAvKiBwYXJhbm9pYSAqLworCQkJCWlmIChzdHJjbXAobWF0Y2hlc1tpXSwgbWF0Y2hlc1tpKzFdKSA9PSAwKSB7CisJCQkJCWZyZWUobWF0Y2hlc1tpXSk7CisJCQkJCS8vbWF0Y2hlc1tpXSA9IE5VTEw7IC8qIHBhcmFub2lhICovCisJCQkJfSBlbHNlIHsKKwkJCQkJbWF0Y2hlc1tuKytdID0gbWF0Y2hlc1tpXTsKKwkJCQl9CisJCQkvL30KKwkJfQorCQltYXRjaGVzW24rK10gPSBtYXRjaGVzW2ldOworCQludW1fbWF0Y2hlcyA9IG47CisJfQorCisJLyogRGlkIHdlIGZpbmQgZXhhY3RseSBvbmUgbWF0Y2g/ICovCisJaWYgKG51bV9tYXRjaGVzICE9IDEpIHsgLyogbm8gKi8KKwkJY2hhciAqY3A7CisJCWJlZXAoKTsKKwkJaWYgKCFtYXRjaGVzKQorCQkJZ290byByZXQ7IC8qIG5vIG1hdGNoZXMgYXQgYWxsICovCisJCS8qIEZpbmQgY29tbW9uIHByZWZpeCAqLworCQljaG9zZW5fbWF0Y2ggPSB4c3RyZHVwKG1hdGNoZXNbMF0pOworCQlmb3IgKGNwID0gY2hvc2VuX21hdGNoOyAqY3A7IGNwKyspIHsKKwkJCXVuc2lnbmVkIG47CisJCQlmb3IgKG4gPSAxOyBuIDwgbnVtX21hdGNoZXM7IG4rKykgeworCQkJCWlmIChtYXRjaGVzW25dW2NwIC0gY2hvc2VuX21hdGNoXSAhPSAqY3ApIHsKKwkJCQkJZ290byBzdG9wOworCQkJCX0KKwkJCX0KKwkJfQorIHN0b3A6CisJCWlmIChjcCA9PSBjaG9zZW5fbWF0Y2gpIHsgLyogaGF2ZSB1bmlxdWUgcHJlZml4PyAqLworCQkJZ290byByZXQ7IC8qIG5vICovCisJCX0KKwkJKmNwID0gJ1wwJzsKKwkJY3AgPSBxdW90ZV9zcGVjaWFsX2NoYXJzKGNob3Nlbl9tYXRjaCk7CisJCWZyZWUoY2hvc2VuX21hdGNoKTsKKwkJY2hvc2VuX21hdGNoID0gY3A7CisJCWxlbl9mb3VuZCA9IHN0cmxlbihjaG9zZW5fbWF0Y2gpOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhhY3RseSBvbmUgbWF0Y2ggKi8KKwkJLyogTmV4dCA8dGFiPiBpcyBub3QgYSBkb3VibGUtdGFiICovCisJCSpsYXN0V2FzVGFiID0gMDsKKworCQljaG9zZW5fbWF0Y2ggPSBxdW90ZV9zcGVjaWFsX2NoYXJzKG1hdGNoZXNbMF0pOworCQlsZW5fZm91bmQgPSBzdHJsZW4oY2hvc2VuX21hdGNoKTsKKwkJaWYgKGNob3Nlbl9tYXRjaFtsZW5fZm91bmQtMV0gIT0gJy8nKSB7CisJCQljaG9zZW5fbWF0Y2hbbGVuX2ZvdW5kXSA9ICcgJzsKKwkJCWNob3Nlbl9tYXRjaFsrK2xlbl9mb3VuZF0gPSAnXDAnOworCQl9CisJfQorCisjIGlmICFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJLyogSGF2ZSBzcGFjZSB0byBwbGFjZSB0aGUgbWF0Y2g/ICovCisJLyogVGhlIHJlc3VsdCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyB3aXRoIHRoZXNlIGxlbmd0aHM6ICovCisJLyogY3Vyc29yICsgKGxlbl9mb3VuZCAtIG1hdGNoX3BmeF9sZW4pICsgKGNvbW1hbmRfbGVuIC0gY3Vyc29yKSAqLworCS8qIGl0IHNpbXBsaWZpZXMgaW50bzogKi8KKwlpZiAoKGludCkobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbiArIGNvbW1hbmRfbGVuKSA8IFMubWF4c2l6ZSkgeworCQlpbnQgcG9zOworCQkvKiBzYXZlIHRhaWwgKi8KKwkJc3RyY3B5KG1hdGNoX2J1ZiwgJmNvbW1hbmRfcHNbY3Vyc29yXSk7CisJCS8qIGFkZCBtYXRjaCBhbmQgdGFpbCAqLworCQlzcHJpbnRmKCZjb21tYW5kX3BzW2N1cnNvcl0sICIlcyVzIiwgY2hvc2VuX21hdGNoICsgbWF0Y2hfcGZ4X2xlbiwgbWF0Y2hfYnVmKTsKKwkJY29tbWFuZF9sZW4gPSBzdHJsZW4oY29tbWFuZF9wcyk7CisJCS8qIG5ldyBwb3MgKi8KKwkJcG9zID0gY3Vyc29yICsgbGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbjsKKwkJLyogd3JpdGUgb3V0IHRoZSBtYXRjaGVkIGNvbW1hbmQgKi8KKwkJcmVkcmF3KGNtZGVkaXRfeSwgY29tbWFuZF9sZW4gLSBwb3MpOworCX0KKyMgZWxzZQorCXsKKwkJLyogVXNlIDJuZCBoYWxmIG9mIG1hdGNoX2J1ZiBhcyBzY3JhdGNoIHNwYWNlIC0gc2VlICgqKikgKi8KKwkJY2hhciAqY29tbWFuZCA9IG1hdGNoX2J1ZiArIE1BWF9MSU5FTEVOOworCQlpbnQgbGVuID0gc2F2ZV9zdHJpbmcoY29tbWFuZCwgTUFYX0xJTkVMRU4pOworCQkvKiBIYXZlIHNwYWNlIHRvIHBsYWNlIHRoZSBtYXRjaD8gKi8KKwkJLyogY3Vyc29yX21iICsgKGxlbl9mb3VuZCAtIG1hdGNoX3BmeF9sZW4pICsgKGxlbiAtIGN1cnNvcl9tYikgKi8KKwkJaWYgKChpbnQpKGxlbl9mb3VuZCAtIG1hdGNoX3BmeF9sZW4gKyBsZW4pIDwgTUFYX0xJTkVMRU4pIHsKKwkJCWludCBwb3M7CisJCQkvKiBzYXZlIHRhaWwgKi8KKwkJCXN0cmNweShtYXRjaF9idWYsICZjb21tYW5kW2N1cnNvcl9tYl0pOworCQkJLyogd2hlcmUgZG8gd2Ugd2FudCB0byBoYXZlIGN1cnNvciBhZnRlciBhbGw/ICovCisJCQlzdHJjcHkoJmNvbW1hbmRbY3Vyc29yX21iXSwgY2hvc2VuX21hdGNoICsgbWF0Y2hfcGZ4X2xlbik7CisJCQlsZW4gPSBsb2FkX3N0cmluZyhjb21tYW5kKTsKKwkJCS8qIGFkZCBtYXRjaCBhbmQgdGFpbCAqLworCQkJc3ByaW50ZigmY29tbWFuZFtjdXJzb3JfbWJdLCAiJXMlcyIsIGNob3Nlbl9tYXRjaCArIG1hdGNoX3BmeF9sZW4sIG1hdGNoX2J1Zik7CisJCQljb21tYW5kX2xlbiA9IGxvYWRfc3RyaW5nKGNvbW1hbmQpOworCQkJLyogd3JpdGUgb3V0IHRoZSBtYXRjaGVkIGNvbW1hbmQgKi8KKwkJCS8qIHBhcmFub2lhOiBsb2FkX3N0cmluZyBjYW4gcmV0dXJuIDAgb24gY29udiBlcnJvciwKKwkJCSAqIHByZXZlbnQgcGFzc2luZyBwb3MgPSAoMCAtIDEyKSB0byByZWRyYXcgKi8KKwkJCXBvcyA9IGNvbW1hbmRfbGVuIC0gbGVuOworCQkJcmVkcmF3KGNtZGVkaXRfeSwgcG9zID49IDAgPyBwb3MgOiAwKTsKKwkJfQorCX0KKyMgZW5kaWYKKyByZXQ6CisJZnJlZShjaG9zZW5fbWF0Y2gpOworCWZyZWUobWF0Y2hfYnVmKTsKK30KKworI2VuZGlmICAvKiBGRUFUVVJFX1RBQl9DT01QTEVUSU9OICovCisKKworbGluZV9pbnB1dF90KiBGQVNUX0ZVTkMgbmV3X2xpbmVfaW5wdXRfdChpbnQgZmxhZ3MpCit7CisJbGluZV9pbnB1dF90ICpuID0geHphbGxvYyhzaXplb2YoKm4pKTsKKwluLT5mbGFncyA9IGZsYWdzOworCW4tPm1heF9oaXN0b3J5ID0gTUFYX0hJU1RPUlk7CisJcmV0dXJuIG47Cit9CisKKworI2lmIE1BWF9ISVNUT1JZID4gMAorCit1bnNpZ25lZCBzaXplX2Zyb21fSElTVEZJTEVTSVpFKGNvbnN0IGNoYXIgKmhwKQoreworCWludCBzaXplID0gTUFYX0hJU1RPUlk7CisJaWYgKGhwKSB7CisJCXNpemUgPSBhdG9pKGhwKTsKKwkJaWYgKHNpemUgPD0gMCkKKwkJCXJldHVybiAxOworCQlpZiAoc2l6ZSA+IE1BWF9ISVNUT1JZKQorCQkJcmV0dXJuIE1BWF9ISVNUT1JZOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgc2F2ZV9jb21tYW5kX3BzX2F0X2N1cl9oaXN0b3J5KHZvaWQpCit7CisJaWYgKGNvbW1hbmRfcHNbMF0gIT0gQkJfTlVMKSB7CisJCWludCBjdXIgPSBzdGF0ZS0+Y3VyX2hpc3Rvcnk7CisJCWZyZWUoc3RhdGUtPmhpc3RvcnlbY3VyXSk7CisKKyMgaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQl7CisJCQljaGFyIHRidWZbTUFYX0xJTkVMRU5dOworCQkJc2F2ZV9zdHJpbmcodGJ1Ziwgc2l6ZW9mKHRidWYpKTsKKwkJCXN0YXRlLT5oaXN0b3J5W2N1cl0gPSB4c3RyZHVwKHRidWYpOworCQl9CisjIGVsc2UKKwkJc3RhdGUtPmhpc3RvcnlbY3VyXSA9IHhzdHJkdXAoY29tbWFuZF9wcyk7CisjIGVuZGlmCisJfQorfQorCisvKiBzdGF0ZS0+ZmxhZ3MgaXMgYWxyZWFkeSBjaGVja2VkIHRvIGJlIG5vbnplcm8gKi8KK3N0YXRpYyBpbnQgZ2V0X3ByZXZpb3VzX2hpc3Rvcnkodm9pZCkKK3sKKwlpZiAoKHN0YXRlLT5mbGFncyAmIERPX0hJU1RPUlkpICYmIHN0YXRlLT5jdXJfaGlzdG9yeSkgeworCQlzYXZlX2NvbW1hbmRfcHNfYXRfY3VyX2hpc3RvcnkoKTsKKwkJc3RhdGUtPmN1cl9oaXN0b3J5LS07CisJCXJldHVybiAxOworCX0KKwliZWVwKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25leHRfaGlzdG9yeSh2b2lkKQoreworCWlmIChzdGF0ZS0+ZmxhZ3MgJiBET19ISVNUT1JZKSB7CisJCWlmIChzdGF0ZS0+Y3VyX2hpc3RvcnkgPCBzdGF0ZS0+Y250X2hpc3RvcnkpIHsKKwkJCXNhdmVfY29tbWFuZF9wc19hdF9jdXJfaGlzdG9yeSgpOyAvKiBzYXZlIHRoZSBjdXJyZW50IGhpc3RvcnkgbGluZSAqLworCQkJcmV0dXJuICsrc3RhdGUtPmN1cl9oaXN0b3J5OworCQl9CisJfQorCWJlZXAoKTsKKwlyZXR1cm4gMDsKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisvKiBXZSB0cnkgdG8gZW5zdXJlIHRoYXQgY29uY3VycmVudCBhZGRpdGlvbnMgdG8gdGhlIGhpc3RvcnkKKyAqIGRvIG5vdCBvdmVyd3JpdGUgZWFjaCBvdGhlci4KKyAqIE90aGVyd2lzZSBzaGVsbCB1c2VycyBnZXQgdW5oYXBweS4KKyAqCisgKiBIaXN0b3J5IGZpbGUgaXMgdHJpbW1lZCBsYXppbHksIHdoZW4gaXQgZ3Jvd3Mgc2V2ZXJhbCB0aW1lcyBsb25nZXIKKyAqIHRoYW4gY29uZmlndXJlZCBNQVhfSElTVE9SWSBsaW5lcy4KKyAqLworCitzdGF0aWMgdm9pZCBmcmVlX2xpbmVfaW5wdXRfdChsaW5lX2lucHV0X3QgKm4pCit7CisJaW50IGkgPSBuLT5jbnRfaGlzdG9yeTsKKwl3aGlsZSAoaSA+IDApCisJCWZyZWUobi0+aGlzdG9yeVstLWldKTsKKwlmcmVlKG4pOworfQorCisvKiBzdGF0ZS0+ZmxhZ3MgaXMgYWxyZWFkeSBjaGVja2VkIHRvIGJlIG5vbnplcm8gKi8KK3N0YXRpYyB2b2lkIGxvYWRfaGlzdG9yeShsaW5lX2lucHV0X3QgKnN0X3Bhcm0pCit7CisJY2hhciAqdGVtcF9oW01BWF9ISVNUT1JZXTsKKwljaGFyICpsaW5lOworCUZJTEUgKmZwOworCXVuc2lnbmVkIGlkeCwgaSwgbGluZV9sZW47CisKKwkvKiBOQjogZG8gbm90IHRyYXNoIG9sZCBoaXN0b3J5IGlmIGZpbGUgY2FuJ3QgYmUgb3BlbmVkICovCisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKHN0X3Bhcm0tPmhpc3RfZmlsZSk7CisJaWYgKGZwKSB7CisJCS8qIGNsZWFuIHVwIG9sZCBoaXN0b3J5ICovCisJCWZvciAoaWR4ID0gc3RfcGFybS0+Y250X2hpc3Rvcnk7IGlkeCA+IDA7KSB7CisJCQlpZHgtLTsKKwkJCWZyZWUoc3RfcGFybS0+aGlzdG9yeVtpZHhdKTsKKwkJCXN0X3Bhcm0tPmhpc3RvcnlbaWR4XSA9IE5VTEw7CisJCX0KKworCQkvKiBmaWxsIHRlbXBfaFtdLCByZXRhaW5pbmcgb25seSBsYXN0IE1BWF9ISVNUT1JZIGxpbmVzICovCisJCW1lbXNldCh0ZW1wX2gsIDAsIHNpemVvZih0ZW1wX2gpKTsKKwkJc3RfcGFybS0+Y250X2hpc3RvcnlfaW5fZmlsZSA9IGlkeCA9IDA7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCQlpZiAobGluZVswXSA9PSAnXDAnKSB7CisJCQkJZnJlZShsaW5lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZyZWUodGVtcF9oW2lkeF0pOworCQkJdGVtcF9oW2lkeF0gPSBsaW5lOworCQkJc3RfcGFybS0+Y250X2hpc3RvcnlfaW5fZmlsZSsrOworCQkJaWR4Kys7CisJCQlpZiAoaWR4ID09IHN0X3Bhcm0tPm1heF9oaXN0b3J5KQorCQkJCWlkeCA9IDA7CisJCX0KKwkJZmNsb3NlKGZwKTsKKworCQkvKiBmaW5kIGZpcnN0IG5vbi1OVUxMIHRlbXBfaFtdLCBpZiBhbnkgKi8KKwkJaWYgKHN0X3Bhcm0tPmNudF9oaXN0b3J5X2luX2ZpbGUpIHsKKwkJCXdoaWxlICh0ZW1wX2hbaWR4XSA9PSBOVUxMKSB7CisJCQkJaWR4Kys7CisJCQkJaWYgKGlkeCA9PSBzdF9wYXJtLT5tYXhfaGlzdG9yeSkKKwkJCQkJaWR4ID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIGNvcHkgdGVtcF9oW10gdG8gc3RfcGFybS0+aGlzdG9yeVtdICovCisJCWZvciAoaSA9IDA7IGkgPCBzdF9wYXJtLT5tYXhfaGlzdG9yeTspIHsKKwkJCWxpbmUgPSB0ZW1wX2hbaWR4XTsKKwkJCWlmICghbGluZSkKKwkJCQlicmVhazsKKwkJCWlkeCsrOworCQkJaWYgKGlkeCA9PSBzdF9wYXJtLT5tYXhfaGlzdG9yeSkKKwkJCQlpZHggPSAwOworCQkJbGluZV9sZW4gPSBzdHJsZW4obGluZSk7CisJCQlpZiAobGluZV9sZW4gPj0gTUFYX0xJTkVMRU4pCisJCQkJbGluZVtNQVhfTElORUxFTi0xXSA9ICdcMCc7CisJCQlzdF9wYXJtLT5oaXN0b3J5W2krK10gPSBsaW5lOworCQl9CisJCXN0X3Bhcm0tPmNudF9oaXN0b3J5ID0gaTsKKwl9Cit9CisKKy8qIHN0YXRlLT5mbGFncyBpcyBhbHJlYWR5IGNoZWNrZWQgdG8gYmUgbm9uemVybyAqLworc3RhdGljIHZvaWQgc2F2ZV9oaXN0b3J5KGNoYXIgKnN0cikKK3sKKwlpbnQgZmQ7CisJaW50IGxlbiwgbGVuMjsKKworCWZkID0gb3BlbihzdGF0ZS0+aGlzdF9maWxlLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0FQUEVORCwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCXhsc2VlayhmZCwgMCwgU0VFS19FTkQpOyAvKiBwYXJhbm9pYSAqLworCWxlbiA9IHN0cmxlbihzdHIpOworCXN0cltsZW5dID0gJ1xuJzsgLyogd2UgKHRyeSB0bykgZG8gYXRvbWljIHdyaXRlICovCisJbGVuMiA9IGZ1bGxfd3JpdGUoZmQsIHN0ciwgbGVuICsgMSk7CisJc3RyW2xlbl0gPSAnXDAnOworCWNsb3NlKGZkKTsKKwlpZiAobGVuMiAhPSBsZW4gKyAxKQorCQlyZXR1cm47IC8qICJ3dGY/IiAqLworCisJLyogZGlkIHdlIHdyaXRlIHNvIG11Y2ggdGhhdCBoaXN0b3J5IGZpbGUgbmVlZHMgdHJpbW1pbmc/ICovCisJc3RhdGUtPmNudF9oaXN0b3J5X2luX2ZpbGUrKzsKKwlpZiAoc3RhdGUtPmNudF9oaXN0b3J5X2luX2ZpbGUgPiBzdGF0ZS0+bWF4X2hpc3RvcnkgKiA0KSB7CisJCWNoYXIgKm5ld19uYW1lOworCQlsaW5lX2lucHV0X3QgKnN0X3RlbXA7CisKKwkJLyogd2UgbWF5IGhhdmUgY29uY3VycmVudGx5IHdyaXR0ZW4gZW50cmllcyBmcm9tIG90aGVycy4KKwkJICogbG9hZCB0aGVtICovCisJCXN0X3RlbXAgPSBuZXdfbGluZV9pbnB1dF90KHN0YXRlLT5mbGFncyk7CisJCXN0X3RlbXAtPmhpc3RfZmlsZSA9IHN0YXRlLT5oaXN0X2ZpbGU7CisJCXN0X3RlbXAtPm1heF9oaXN0b3J5ID0gc3RhdGUtPm1heF9oaXN0b3J5OworCQlsb2FkX2hpc3Rvcnkoc3RfdGVtcCk7CisKKwkJLyogd3JpdGUgb3V0IHRlbXAgZmlsZSBhbmQgcmVwbGFjZSBoaXN0X2ZpbGUgYXRvbWljYWxseSAqLworCQluZXdfbmFtZSA9IHhhc3ByaW50ZigiJXMuJXUubmV3Iiwgc3RhdGUtPmhpc3RfZmlsZSwgKGludCkgZ2V0cGlkKCkpOworCQlmZCA9IG9wZW4obmV3X25hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2MDApOworCQlpZiAoZmQgPj0gMCkgeworCQkJRklMRSAqZnA7CisJCQlpbnQgaTsKKworCQkJZnAgPSB4ZmRvcGVuX2Zvcl93cml0ZShmZCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3RfdGVtcC0+Y250X2hpc3Rvcnk7IGkrKykKKwkJCQlmcHJpbnRmKGZwLCAiJXNcbiIsIHN0X3RlbXAtPmhpc3RvcnlbaV0pOworCQkJZmNsb3NlKGZwKTsKKwkJCWlmIChyZW5hbWUobmV3X25hbWUsIHN0YXRlLT5oaXN0X2ZpbGUpID09IDApCisJCQkJc3RhdGUtPmNudF9oaXN0b3J5X2luX2ZpbGUgPSBzdF90ZW1wLT5jbnRfaGlzdG9yeTsKKwkJfQorCQlmcmVlKG5ld19uYW1lKTsKKwkJZnJlZV9saW5lX2lucHV0X3Qoc3RfdGVtcCk7CisJfQorfQorIyBlbHNlCisjICBkZWZpbmUgbG9hZF9oaXN0b3J5KGEpICgodm9pZCkwKQorIyAgZGVmaW5lIHNhdmVfaGlzdG9yeShhKSAoKHZvaWQpMCkKKyMgZW5kaWYgLyogRkVBVFVSRV9DT01NQU5EX1NBVkVISVNUT1JZICovCisKK3N0YXRpYyB2b2lkIHJlbWVtYmVyX2luX2hpc3RvcnkoY2hhciAqc3RyKQoreworCWludCBpOworCisJaWYgKCEoc3RhdGUtPmZsYWdzICYgRE9fSElTVE9SWSkpCisJCXJldHVybjsKKwlpZiAoc3RyWzBdID09ICdcMCcpCisJCXJldHVybjsKKwlpID0gc3RhdGUtPmNudF9oaXN0b3J5OworCS8qIERvbid0IHNhdmUgZHVwZXMgKi8KKwlpZiAoaSAmJiBzdHJjbXAoc3RhdGUtPmhpc3RvcnlbaS0xXSwgc3RyKSA9PSAwKQorCQlyZXR1cm47CisKKwlmcmVlKHN0YXRlLT5oaXN0b3J5W3N0YXRlLT5tYXhfaGlzdG9yeV0pOyAvKiByZWR1bmRhbnQsIHBhcmFub2lhICovCisJc3RhdGUtPmhpc3Rvcnlbc3RhdGUtPm1heF9oaXN0b3J5XSA9IE5VTEw7IC8qIHJlZHVuZGFudCwgcGFyYW5vaWEgKi8KKworCS8qIElmIGhpc3RvcnlbXSBpcyBmdWxsLCByZW1vdmUgdGhlIG9sZGVzdCBjb21tYW5kICovCisJLyogd2UgbmVlZCB0byBrZWVwIGhpc3Rvcnlbc3RhdGUtPm1heF9oaXN0b3J5XSBlbXB0eSwgaGVuY2UgPj0sIG5vdCA+ICovCisJaWYgKGkgPj0gc3RhdGUtPm1heF9oaXN0b3J5KSB7CisJCWZyZWUoc3RhdGUtPmhpc3RvcnlbMF0pOworCQlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm1heF9oaXN0b3J5LTE7IGkrKykKKwkJCXN0YXRlLT5oaXN0b3J5W2ldID0gc3RhdGUtPmhpc3RvcnlbaSsxXTsKKwkJLyogaSA9PSBzdGF0ZS0+bWF4X2hpc3RvcnktMSAqLworCX0KKwkvKiBpIDw9IHN0YXRlLT5tYXhfaGlzdG9yeS0xICovCisJc3RhdGUtPmhpc3RvcnlbaSsrXSA9IHhzdHJkdXAoc3RyKTsKKwkvKiBpIDw9IHN0YXRlLT5tYXhfaGlzdG9yeSAqLworCXN0YXRlLT5jdXJfaGlzdG9yeSA9IGk7CisJc3RhdGUtPmNudF9oaXN0b3J5ID0gaTsKKyMgaWYgTUFYX0hJU1RPUlkgPiAwICYmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwlpZiAoKHN0YXRlLT5mbGFncyAmIFNBVkVfSElTVE9SWSkgJiYgc3RhdGUtPmhpc3RfZmlsZSkKKwkJc2F2ZV9oaXN0b3J5KHN0cik7CisjIGVuZGlmCisJSUZfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVChudW1fb2tfbGluZXMrKzspCit9CisKKyNlbHNlIC8qIE1BWF9ISVNUT1JZID09IDAgKi8KKyMgZGVmaW5lIHJlbWVtYmVyX2luX2hpc3RvcnkoYSkgKCh2b2lkKTApCisjZW5kaWYgLyogTUFYX0hJU1RPUlkgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorLyoKKyAqIHZpIG1vZGUgaW1wbGVtZW50ZWQgMjAwNSBieSBQYXVsIEZveCA8cGdmQGZveGhhcnAuYm9zdG9uLm1hLnVzPgorICovCitzdGF0aWMgdm9pZAordmlfV29yZF9tb3Rpb24oaW50IGVhdCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuICYmICFCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKKwlpZiAoZWF0KSB3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4gJiYgQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvcl0pKQorCQlpbnB1dF9mb3J3YXJkKCk7Cit9CisKK3N0YXRpYyB2b2lkCit2aV93b3JkX21vdGlvbihpbnQgZWF0KQoreworCUNIQVJfVCAqY29tbWFuZCA9IGNvbW1hbmRfcHM7CisKKwlpZiAoQkJfaXNhbG51bShjb21tYW5kW2N1cnNvcl0pIHx8IGNvbW1hbmRbY3Vyc29yXSA9PSAnXycpIHsKKwkJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuCisJCSAmJiAoQkJfaXNhbG51bShjb21tYW5kW2N1cnNvcisxXSkgfHwgY29tbWFuZFtjdXJzb3IrMV0gPT0gJ18nKQorCQkpIHsKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwkJfQorCX0gZWxzZSBpZiAoQkJfaXNwdW5jdChjb21tYW5kW2N1cnNvcl0pKSB7CisJCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbiAmJiBCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yKzFdKSkKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwl9CisKKwlpZiAoY3Vyc29yIDwgY29tbWFuZF9sZW4pCisJCWlucHV0X2ZvcndhcmQoKTsKKworCWlmIChlYXQpIHsKKwkJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuICYmIEJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit2aV9FbmRfbW90aW9uKHZvaWQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCWlucHV0X2ZvcndhcmQoKTsKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4gJiYgQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvcl0pKQorCQlpbnB1dF9mb3J3YXJkKCk7CisJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuLTEgJiYgIUJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3IrMV0pKQorCQlpbnB1dF9mb3J3YXJkKCk7Cit9CisKK3N0YXRpYyB2b2lkCit2aV9lbmRfbW90aW9uKHZvaWQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCWlmIChjdXJzb3IgPj0gY29tbWFuZF9sZW4tMSkKKwkJcmV0dXJuOworCWlucHV0X2ZvcndhcmQoKTsKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMSAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKKwlpZiAoY3Vyc29yID49IGNvbW1hbmRfbGVuLTEpCisJCXJldHVybjsKKwlpZiAoQkJfaXNhbG51bShjb21tYW5kW2N1cnNvcl0pIHx8IGNvbW1hbmRbY3Vyc29yXSA9PSAnXycpIHsKKwkJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuLTEKKwkJICYmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yKzFdKSB8fCBjb21tYW5kW2N1cnNvcisxXSA9PSAnXycpCisJCSkgeworCQkJaW5wdXRfZm9yd2FyZCgpOworCQl9CisJfSBlbHNlIGlmIChCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yXSkpIHsKKwkJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuLTEgJiYgQkJfaXNwdW5jdChjb21tYW5kW2N1cnNvcisxXSkpCisJCQlpbnB1dF9mb3J3YXJkKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAordmlfQmFja19tb3Rpb24odm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJd2hpbGUgKGN1cnNvciA+IDAgJiYgQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvci0xXSkpCisJCWlucHV0X2JhY2t3YXJkKDEpOworCXdoaWxlIChjdXJzb3IgPiAwICYmICFCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yLTFdKSkKKwkJaW5wdXRfYmFja3dhcmQoMSk7Cit9CisKK3N0YXRpYyB2b2lkCit2aV9iYWNrX21vdGlvbih2b2lkKQoreworCUNIQVJfVCAqY29tbWFuZCA9IGNvbW1hbmRfcHM7CisKKwlpZiAoY3Vyc29yIDw9IDApCisJCXJldHVybjsKKwlpbnB1dF9iYWNrd2FyZCgxKTsKKwl3aGlsZSAoY3Vyc29yID4gMCAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2JhY2t3YXJkKDEpOworCWlmIChjdXJzb3IgPD0gMCkKKwkJcmV0dXJuOworCWlmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yXSkgfHwgY29tbWFuZFtjdXJzb3JdID09ICdfJykgeworCQl3aGlsZSAoY3Vyc29yID4gMAorCQkgJiYgKEJCX2lzYWxudW0oY29tbWFuZFtjdXJzb3ItMV0pIHx8IGNvbW1hbmRbY3Vyc29yLTFdID09ICdfJykKKwkJKSB7CisJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJfQorCX0gZWxzZSBpZiAoQkJfaXNwdW5jdChjb21tYW5kW2N1cnNvcl0pKSB7CisJCXdoaWxlIChjdXJzb3IgPiAwICYmIEJCX2lzcHVuY3QoY29tbWFuZFtjdXJzb3ItMV0pKQorCQkJaW5wdXRfYmFja3dhcmQoMSk7CisJfQorfQorI2VuZGlmCisKKy8qIE1vZGVsbGVkIGFmdGVyIGJhc2ggNC4wIGJlaGF2aW9yIG9mIEN0cmwtPGFycm93PiAqLworc3RhdGljIHZvaWQgY3RybF9sZWZ0KHZvaWQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCXdoaWxlICgxKSB7CisJCUNIQVJfVCBjOworCisJCWlucHV0X2JhY2t3YXJkKDEpOworCQlpZiAoY3Vyc29yID09IDApCisJCQlicmVhazsKKwkJYyA9IGNvbW1hbmRbY3Vyc29yXTsKKwkJaWYgKGMgIT0gJyAnICYmICFCQl9pc3B1bmN0KGMpKSB7CisJCQkvKiB3ZSByZWFjaGVkIGEgIndvcmQiIGRlbGltaXRlZCBieSBzcGFjZXMvcHVuY3QuCisJCQkgKiBnbyB0byBpdHMgYmVnaW5uaW5nICovCisJCQl3aGlsZSAoMSkgeworCQkJCWMgPSBjb21tYW5kW2N1cnNvciAtIDFdOworCQkJCWlmIChjID09ICcgJyB8fCBCQl9pc3B1bmN0KGMpKQorCQkJCQlicmVhazsKKwkJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJCQlpZiAoY3Vyc29yID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBjdHJsX3JpZ2h0KHZvaWQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCXdoaWxlICgxKSB7CisJCUNIQVJfVCBjOworCisJCWMgPSBjb21tYW5kW2N1cnNvcl07CisJCWlmIChjID09IEJCX05VTCkKKwkJCWJyZWFrOworCQlpZiAoYyAhPSAnICcgJiYgIUJCX2lzcHVuY3QoYykpIHsKKwkJCS8qIHdlIHJlYWNoZWQgYSAid29yZCIgZGVsaW1pdGVkIGJ5IHNwYWNlcy9wdW5jdC4KKwkJCSAqIGdvIHRvIGl0cyBlbmQgKyAxICovCisJCQl3aGlsZSAoMSkgeworCQkJCWlucHV0X2ZvcndhcmQoKTsKKwkJCQljID0gY29tbWFuZFtjdXJzb3JdOworCQkJCWlmIChjID09IEJCX05VTCB8fCBjID09ICcgJyB8fCBCQl9pc3B1bmN0KGMpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlucHV0X2ZvcndhcmQoKTsKKwl9Cit9CisKKworLyoKKyAqIHJlYWRfbGluZV9pbnB1dCBhbmQgaXRzIGhlbHBlcnMKKyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKK3N0YXRpYyB2b2lkIGFza190ZXJtaW5hbCh2b2lkKQoreworCS8qIEFzayB0ZXJtaW5hbCB3aGVyZSBpcyB0aGUgY3Vyc29yIG5vdy4KKwkgKiBsaW5lZWRpdF9yZWFkX2tleSBoYW5kbGVzIHJlc3BvbnNlIGFuZCBjb3JyZWN0cworCSAqIG91ciBpZGVhIG9mIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgorCSAqIFRlc3RjYXNlOiBydW4gImVjaG8gLW4gbG9uZ19saW5lX2xvbmdfbGluZV9sb25nX2xpbmUiLAorCSAqIHRoZW4gdHlwZSBpbiBhIGxvbmcsIHdyYXBwaW5nIGNvbW1hbmQgYW5kIHRyeSB0bworCSAqIGRlbGV0ZSBpdCB1c2luZyBiYWNrc3BhY2Uga2V5LgorCSAqIE5vdGU6IHdlIHByaW50IGl0IF9hZnRlcl8gcHJvbXB0LCBiZWNhdXNlCisJICogcHJvbXB0IG1heSBjb250YWluIENSLiBFeGFtcGxlOiBQUzE9J1xbXHJcblxdXHcgJworCSAqLworCS8qIFByb2JsZW06IGlmIHRoZXJlIGlzIGJ1ZmZlcmVkIGlucHV0IG9uIHN0ZGluLAorCSAqIHRoZSByZXNwb25zZSB3aWxsIGJlIGRlbGl2ZXJlZCBsYXRlciwKKwkgKiBwb3NzaWJseSB0byBhbiB1bnN1c3BlY3RpbmcgYXBwbGljYXRpb24uCisJICogVGVzdGNhc2U6ICJzbGVlcCAxOyBidXN5Ym94IGFzaCIgKyBwcmVzcyBhbmQgaG9sZCBbRW50ZXJdLgorCSAqIFJlc3VsdDoKKwkgKiB+L3NyY2RldmVsL2Jib3gvZml4L2J1c3lib3gudDQgIworCSAqIH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjCisJICogXltbNTk7MzR+L3NyY2RldmVsL2Jib3gvZml4L2J1c3lib3gudDQgIyAgPC0tIGdhcmJhZ2UKKwkgKiB+L3NyY2RldmVsL2Jib3gvZml4L2J1c3lib3gudDQgIworCSAqCisJICogQ2hlY2tpbmcgZm9yIGlucHV0IHdpdGggcG9sbCBvbmx5IG1ha2VzIHRoZSByYWNlIG5hcnJvd2VyLAorCSAqIEkgc3RpbGwgY2FuIHRyaWdnZXIgaXQuIFN0cmFjZToKKwkgKgorCSAqIHdyaXRlKDEsICJ+L3NyY2RldmVsL2Jib3gvZml4L2J1c3lib3gudDQgIyAiLCAzMykgPSAzMworCSAqIHBvbGwoW3tmZD0wLCBldmVudHM9UE9MTElOfV0sIDEsIDApID0gMCAoVGltZW91dCkgIDwtLSBubyBpbnB1dCBleGlzdHMKKwkgKiB3cml0ZSgxLCAiXDMzWzZuIiwgNCkgPSA0ICA8LS0gc2VuZCB0aGUgRVNDIHNlcXVlbmNlLCBxdWljayEKKwkgKiBwb2xsKFt7ZmQ9MCwgZXZlbnRzPVBPTExJTn1dLCAxLCAtMSkgPSAxIChbe2ZkPTAsIHJldmVudHM9UE9MTElOfV0pCisJICogcmVhZCgwLCAiXG4iLCAxKSAgICAgID0gMSAgPC0tIG9oIGNyYXAsIHVzZXIncyBpbnB1dCBnb3QgaW4gZmlyc3QKKwkgKi8KKwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKworCXBmZC5mZCA9IFNURElOX0ZJTEVOTzsKKwlwZmQuZXZlbnRzID0gUE9MTElOOworCWlmIChzYWZlX3BvbGwoJnBmZCwgMSwgMCkgPT0gMCkgeworCQlTLnNlbnRfRVNDX2JyNm4gPSAxOworCQlmcHV0cyhFU0MiWzZuIiwgc3Rkb3V0KTsKKwkJZmZsdXNoX2FsbCgpOyAvKiBtYWtlIHRlcm1pbmFsIHNlZSBpdCBBU0FQISAqLworCX0KK30KKyNlbHNlCisjZGVmaW5lIGFza190ZXJtaW5hbCgpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKK3N0YXRpYyB2b2lkIHBhcnNlX2FuZF9wdXRfcHJvbXB0KGNvbnN0IGNoYXIgKnBybXRfcHRyKQoreworCWNtZGVkaXRfcHJvbXB0ID0gcHJtdF9wdHI7CisJY21kZWRpdF9wcm10X2xlbiA9IHN0cmxlbihwcm10X3B0cik7CisJcHV0X3Byb21wdCgpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHBhcnNlX2FuZF9wdXRfcHJvbXB0KGNvbnN0IGNoYXIgKnBybXRfcHRyKQoreworCWludCBwcm10X2xlbiA9IDA7CisJc2l6ZV90IGN1cl9wcm10X2xlbiA9IDA7CisJY2hhciBmbGdfbm90X2xlbmd0aCA9ICdbJzsKKwljaGFyICpwcm10X21lbV9wdHIgPSB4emFsbG9jKDEpOworCWNoYXIgKmN3ZF9idWYgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKwljaGFyIGNidWZbMl07CisJY2hhciBjOworCWNoYXIgKnBidWY7CisKKwljbWRlZGl0X3BybXRfbGVuID0gMDsKKworCWlmICghY3dkX2J1ZikgeworCQljd2RfYnVmID0gKGNoYXIgKiliYl9tc2dfdW5rbm93bjsKKwl9CisKKwljYnVmWzFdID0gJ1wwJzsgLyogbmV2ZXIgY2hhbmdlcyAqLworCisJd2hpbGUgKCpwcm10X3B0cikgeworCQljaGFyICpmcmVlX21lID0gTlVMTDsKKworCQlwYnVmID0gY2J1ZjsKKwkJYyA9ICpwcm10X3B0cisrOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQljb25zdCBjaGFyICpjcCA9IHBybXRfcHRyOworCQkJaW50IGw7CisKKwkJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgmcHJtdF9wdHIpOworCQkJaWYgKHBybXRfcHRyID09IGNwKSB7CisJCQkJaWYgKCpjcCA9PSAnXDAnKQorCQkJCQlicmVhazsKKwkJCQljID0gKnBybXRfcHRyKys7CisKKwkJCQlzd2l0Y2ggKGMpIHsKKyMgaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKKwkJCQljYXNlICd1JzoKKwkJCQkJcGJ1ZiA9IHVzZXJfYnVmID8gdXNlcl9idWYgOiAoY2hhciopIiI7CisJCQkJCWJyZWFrOworIyBlbmRpZgorCQkJCWNhc2UgJ2gnOgorCQkJCQlwYnVmID0gZnJlZV9tZSA9IHNhZmVfZ2V0aG9zdG5hbWUoKTsKKwkJCQkJKnN0cmNocm51bChwYnVmLCAnLicpID0gJ1wwJzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnJCc6CisJCQkJCWMgPSAoZ2V0ZXVpZCgpID09IDAgPyAnIycgOiAnJCcpOworCQkJCQlicmVhazsKKyMgaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKKwkJCQljYXNlICd3JzoKKwkJCQkJLyogL2hvbWUvdXNlclsvc29tZXRoaW5nXSAtPiB+Wy9zb21ldGhpbmddICovCisJCQkJCXBidWYgPSBjd2RfYnVmOworCQkJCQlsID0gc3RybGVuKGhvbWVfcHdkX2J1Zik7CisJCQkJCWlmIChsICE9IDAKKwkJCQkJICYmIHN0cm5jbXAoaG9tZV9wd2RfYnVmLCBjd2RfYnVmLCBsKSA9PSAwCisJCQkJCSAmJiAoY3dkX2J1ZltsXT09Jy8nIHx8IGN3ZF9idWZbbF09PSdcMCcpCisJCQkJCSAmJiBzdHJsZW4oY3dkX2J1ZiArIGwpIDwgUEFUSF9NQVgKKwkJCQkJKSB7CisJCQkJCQlwYnVmID0gZnJlZV9tZSA9IHhhc3ByaW50ZigifiVzIiwgY3dkX2J1ZiArIGwpOworCQkJCQl9CisJCQkJCWJyZWFrOworIyBlbmRpZgorCQkJCWNhc2UgJ1cnOgorCQkJCQlwYnVmID0gY3dkX2J1ZjsKKwkJCQkJY3AgPSBzdHJyY2hyKHBidWYsICcvJyk7CisJCQkJCWlmIChjcCAhPSBOVUxMICYmIGNwICE9IHBidWYpCisJCQkJCQlwYnVmICs9IChjcC1wYnVmKSArIDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyEnOgorCQkJCQlwYnVmID0gZnJlZV9tZSA9IHhhc3ByaW50ZigiJWQiLCBudW1fb2tfbGluZXMpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdlJzogY2FzZSAnRSc6ICAgICAvKiBcZSBcRSA9IFwwMzMgKi8KKwkJCQkJYyA9ICdcMDMzJzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAneCc6IGNhc2UgJ1gnOiB7CisJCQkJCWNoYXIgYnVmMls0XTsKKwkJCQkJZm9yIChsID0gMDsgbCA8IDM7KSB7CisJCQkJCQl1bnNpZ25lZCBoOworCQkJCQkJYnVmMltsKytdID0gKnBybXRfcHRyOworCQkJCQkJYnVmMltsXSA9ICdcMCc7CisJCQkJCQloID0gc3RydG91bChidWYyLCAmcGJ1ZiwgMTYpOworCQkJCQkJaWYgKGggPiBVQ0hBUl9NQVggfHwgKHBidWYgLSBidWYyKSA8IGwpIHsKKwkJCQkJCQlidWYyWy0tbF0gPSAnXDAnOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcHJtdF9wdHIrKzsKKwkJCQkJfQorCQkJCQljID0gKGNoYXIpc3RydG91bChidWYyLCBOVUxMLCAxNik7CisJCQkJCWlmIChjID09IDApCisJCQkJCQljID0gJz8nOworCQkJCQlwYnVmID0gY2J1ZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ1snOiBjYXNlICddJzoKKwkJCQkJaWYgKGMgPT0gZmxnX25vdF9sZW5ndGgpIHsKKwkJCQkJCWZsZ19ub3RfbGVuZ3RoID0gKGZsZ19ub3RfbGVuZ3RoID09ICdbJyA/ICddJyA6ICdbJyk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9IC8qIHN3aXRjaCAqLworCQkJfSAvKiBpZiAqLworCQl9IC8qIGlmICovCisJCWNidWZbMF0gPSBjOworCQljdXJfcHJtdF9sZW4gPSBzdHJsZW4ocGJ1Zik7CisJCXBybXRfbGVuICs9IGN1cl9wcm10X2xlbjsKKwkJaWYgKGZsZ19ub3RfbGVuZ3RoICE9ICddJykKKwkJCWNtZGVkaXRfcHJtdF9sZW4gKz0gY3VyX3BybXRfbGVuOworCQlwcm10X21lbV9wdHIgPSBzdHJjYXQoeHJlYWxsb2MocHJtdF9tZW1fcHRyLCBwcm10X2xlbisxKSwgcGJ1Zik7CisJCWZyZWUoZnJlZV9tZSk7CisJfSAvKiB3aGlsZSAqLworCisJaWYgKGN3ZF9idWYgIT0gKGNoYXIgKiliYl9tc2dfdW5rbm93bikKKwkJZnJlZShjd2RfYnVmKTsKKwljbWRlZGl0X3Byb21wdCA9IHBybXRfbWVtX3B0cjsKKwlwdXRfcHJvbXB0KCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY21kZWRpdF9zZXR3aWR0aCh1bnNpZ25lZCB3LCBpbnQgcmVkcmF3X2ZsZykKK3sKKwljbWRlZGl0X3Rlcm13ID0gdzsKKwlpZiAocmVkcmF3X2ZsZykgeworCQkvKiBuZXcgeSBmb3IgY3VycmVudCBjdXJzb3IgKi8KKwkJaW50IG5ld195ID0gKGN1cnNvciArIGNtZGVkaXRfcHJtdF9sZW4pIC8gdzsKKwkJLyogcmVkcmF3ICovCisJCXJlZHJhdygobmV3X3kgPj0gY21kZWRpdF95ID8gbmV3X3kgOiBjbWRlZGl0X3kpLCBjb21tYW5kX2xlbiAtIGN1cnNvcik7CisJCWZmbHVzaF9hbGwoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdpbl9jaGFuZ2VkKGludCBuc2lnKQoreworCWludCBzdl9lcnJubyA9IGVycm5vOworCXVuc2lnbmVkIHdpZHRoOworCisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmd2lkdGgsIE5VTEwpOworLy9GSVhNRTogY21kZWRpdF9zZXR3aWR0aCgpIC0+IHJlZHJhdygpIC0+IHByaW50ZigpIC0+IEtBQk9PTSEgKHdlIGFyZSBpbiBzaWduYWwgaGFuZGxlciEpCisJY21kZWRpdF9zZXR3aWR0aCh3aWR0aCwgLypyZWRyYXdfZmxnOiovIG5zaWcpOworCisJZXJybm8gPSBzdl9lcnJubzsKK30KKworc3RhdGljIGludCBsaW5lZWRpdF9yZWFkX2tleShjaGFyICpyZWFkX2tleV9idWZmZXIsIGludCB0aW1lb3V0KQoreworCWludDY0X3QgaWM7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCWNoYXIgdW5pY29kZV9idWZbTUJfQ1VSX01BWCArIDFdOworCWludCB1bmljb2RlX2lkeCA9IDA7CisjZW5kaWYKKworCXdoaWxlICgxKSB7CisJCS8qIFdhaXQgZm9yIGlucHV0LiBUSU1FT1VUID0gLTEgbWFrZXMgcmVhZF9rZXkgd2FpdCBldmVuCisJCSAqIG9uIG5vbmJsb2NraW5nIHN0ZGluLCBUSU1FT1VUID0gNTAgbWFrZXMgc3VyZSB3ZSB3b24ndAorCQkgKiBpbnNpc3Qgb24gZnVsbCBNQl9DVVJfTUFYIGJ1ZmZlciB0byBkZWNsYXJlIGlucHV0IGxpa2UKKwkJICogIlx4ZmZcbiIscGF1c2UsImxzXG4iIGludmFsaWQgYW5kIHRodXMgd29uJ3QgbG9zZSAibHMiLgorCQkgKgorCQkgKiBOb3RlOiByZWFkX2tleSBzZXRzIGVycm5vIHRvIDAgb24gc3VjY2Vzcy4KKwkJICovCisJCWljID0gcmVhZF9rZXkoU1RESU5fRklMRU5PLCByZWFkX2tleV9idWZmZXIsIHRpbWVvdXQpOworCQlpZiAoZXJybm8pIHsKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQlpZiAoZXJybm8gPT0gRUFHQUlOICYmIHVuaWNvZGVfaWR4ICE9IDApCisJCQkJZ290byBwdXNoYmFjazsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMCisJCWlmICgoaW50MzJfdClpYyA9PSBLRVlDT0RFX0NVUlNPUl9QT1MKKwkJICYmIFMuc2VudF9FU0NfYnI2bgorCQkpIHsKKwkJCVMuc2VudF9FU0NfYnI2biA9IDA7CisJCQlpZiAoY3Vyc29yID09IDApIHsgLyogb3RoZXJ3aXNlIGl0IG1heSBiZSBib2d1cyAqLworCQkJCWludCBjb2wgPSAoKGljID4+IDMyKSAmIDB4N2ZmZikgLSAxOworCQkJCWlmIChjb2wgPiBjbWRlZGl0X3BybXRfbGVuKSB7CisJCQkJCWNtZGVkaXRfeCArPSAoY29sIC0gY21kZWRpdF9wcm10X2xlbik7CisJCQkJCXdoaWxlIChjbWRlZGl0X3ggPj0gY21kZWRpdF90ZXJtdykgeworCQkJCQkJY21kZWRpdF94IC09IGNtZGVkaXRfdGVybXc7CisJCQkJCQljbWRlZGl0X3krKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJCXdjaGFyX3Qgd2M7CisKKwkJCWlmICgoaW50MzJfdClpYyA8IDApIC8qIEtFWUNPREVfeHh4ICovCisJCQkJYnJlYWs7CisJCQkvLyBUT0RPOiBpbWFnaW5lIHNlcXVlbmNlIGxpa2U6IDB4ZmYsPGxlZnQtYXJyb3c+OiB3ZSBhcmUgY3VycmVudGx5IGxvc2luZyAweGZmLi4uCisKKwkJCXVuaWNvZGVfYnVmW3VuaWNvZGVfaWR4KytdID0gaWM7CisJCQl1bmljb2RlX2J1Zlt1bmljb2RlX2lkeF0gPSAnXDAnOworCQkJaWYgKG1ic3Rvd2NzKCZ3YywgdW5pY29kZV9idWYsIDEpICE9IDEpIHsKKwkJCQkvKiBOb3QgKHlldD8pIGEgdmFsaWQgdW5pY29kZSBjaGFyICovCisJCQkJaWYgKHVuaWNvZGVfaWR4IDwgTUJfQ1VSX01BWCkgeworCQkJCQl0aW1lb3V0ID0gNTA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyBwdXNoYmFjazoKKwkJCQkvKiBJbnZhbGlkIHNlcXVlbmNlLiBTYXZlIGFsbCAiYmFkIGJ5dGVzIiBleGNlcHQgZmlyc3QgKi8KKwkJCQlyZWFkX2tleV91bmdldHMocmVhZF9rZXlfYnVmZmVyLCB1bmljb2RlX2J1ZiArIDEsIHVuaWNvZGVfaWR4IC0gMSk7CisjIGlmICFFTkFCTEVfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4KKwkJCQlpYyA9IENPTkZJR19TVUJTVF9XQ0hBUjsKKyMgZWxzZQorCQkJCWljID0gdW5pY29kZV9tYXJrX3Jhd19ieXRlKHVuaWNvZGVfYnVmWzBdKTsKKyMgZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJLyogVmFsaWQgdW5pY29kZSBjaGFyLCByZXR1cm4gaXRzIGNvZGUgKi8KKwkJCQlpYyA9IHdjOworCQkJfQorCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGljOworfQorCisjaWYgRU5BQkxFX1VOSUNPREVfQklESV9TVVBQT1JUCitzdGF0aWMgaW50IGlzcnRsX3N0cih2b2lkKQoreworCWludCBpZHggPSBjdXJzb3I7CisKKwl3aGlsZSAoaWR4IDwgY29tbWFuZF9sZW4gJiYgdW5pY29kZV9iaWRpX2lzX25ldXRyYWxfd2NoYXIoY29tbWFuZF9wc1tpZHhdKSkKKwkJaWR4Kys7CisJcmV0dXJuIHVuaWNvZGVfYmlkaV9pc3J0bChjb21tYW5kX3BzW2lkeF0pOworfQorI2Vsc2UKKyMgZGVmaW5lIGlzcnRsX3N0cigpIDAKKyNlbmRpZgorCisvKiBsZWF2ZSBvdXQgdGhlICJ2aS1tb2RlIi1vbmx5IGNhc2UgbGFiZWxzIGlmIHZpIGVkaXRpbmcgaXNuJ3QKKyAqIGNvbmZpZ3VyZWQuICovCisjZGVmaW5lIHZpX2Nhc2UoY2FzZWxhYmVsKSBJRl9GRUFUVVJFX0VESVRJTkdfVkkoY2FzZSBjYXNlbGFiZWwpCisKKy8qIGNvbnZlcnQgdXBwZXJjYXNlIGFzY2lpIHRvIGVxdWl2YWxlbnQgY29udHJvbCBjaGFyLCBmb3IgcmVhZGFiaWxpdHkgKi8KKyN1bmRlZiBDVFJMCisjZGVmaW5lIENUUkwoYSkgKChhKSAmIH4weDQwKQorCitlbnVtIHsKKwlWSV9DTURNT0RFX0JJVCA9IDB4NDAwMDAwMDAsCisJLyogMHg4MDAwMDAwMCBiaXQgZmxhZ3MgS0VZQ09ERV94eHggKi8KK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRVZFUlNFX1NFQVJDSAorLyogTWltaWMgcmVhZGxpbmUgQ3RybC1SIHJldmVyc2UgaGlzdG9yeSBzZWFyY2guCisgKiBXaGVuIGludm9rZWQsIGl0IHNob3dzIHRoZSBmb2xsb3dpbmcgcHJvbXB0OgorICogKHJldmVyc2UtaS1zZWFyY2gpJyc6IHVzZXJfaW5wdXQgW2N1cnNvciBwb3MgdW5jaGFuZ2VkIGJ5IEN0cmwtUl0KKyAqIGFuZCB0eXBpbmcgcmVzdWx0cyBpbiBzZWFyY2ggYmVpbmcgcGVyZm9ybWVkOgorICogKHJldmVyc2UtaS1zZWFyY2gpJ3RtcCc6IGNkIC90bXAgW2N1cnNvciB1bmRlciB0IGluIC90bXBdCisgKiBTZWFyY2ggaXMgcGVyZm9ybWVkIGJ5IGxvb2tpbmcgYXQgcHJvZ3Jlc3NpdmVseSBvbGRlciBsaW5lcyBpbiBoaXN0b3J5LgorICogQ3RybC1SIGFnYWluIHNlYXJjaGVzIGZvciB0aGUgbmV4dCBtYXRjaCBpbiBoaXN0b3J5LgorICogQmFja3NwYWNlIGRlbGV0ZXMgbGFzdCBtYXRjaGVkIGNoYXIuCisgKiBDb250cm9sIGtleXMgZXhpdCBzZWFyY2ggYW5kIHJldHVybiB0byBub3JtYWwgZWRpdGluZyAoYXQgY3VycmVudCBoaXN0b3J5IGxpbmUpLgorICovCitzdGF0aWMgaW50MzJfdCByZXZlcnNlX2lfc2VhcmNoKHZvaWQpCit7CisJY2hhciBtYXRjaF9idWZbMTI4XTsgLyogZm9yIHVzZXIgaW5wdXQgKi8KKwljaGFyIHJlYWRfa2V5X2J1ZmZlcltLRVlDT0RFX0JVRkZFUl9TSVpFXTsKKwljb25zdCBjaGFyICptYXRjaGVkX2hpc3RvcnlfbGluZTsKKwljb25zdCBjaGFyICpzYXZlZF9wcm9tcHQ7CisJaW50MzJfdCBpYzsKKworCW1hdGNoZWRfaGlzdG9yeV9saW5lID0gTlVMTDsKKwlyZWFkX2tleV9idWZmZXJbMF0gPSAwOworCW1hdGNoX2J1ZlswXSA9ICdcMCc7CisKKwkvKiBTYXZlIGFuZCByZXBsYWNlIHRoZSBwcm9tcHQgKi8KKwlzYXZlZF9wcm9tcHQgPSBjbWRlZGl0X3Byb21wdDsKKwlnb3RvIHNldF9wcm9tcHQ7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgaDsKKwkJdW5zaWduZWQgbWF0Y2hfYnVmX2xlbiA9IHN0cmxlbihtYXRjaF9idWYpOworCisJCWZmbHVzaF9hbGwoKTsKKy8vRklYTUU6IGNvcnJlY3QgdGltZW91dD8KKwkJaWMgPSBsaW5lZWRpdF9yZWFkX2tleShyZWFkX2tleV9idWZmZXIsIC0xKTsKKworCQlzd2l0Y2ggKGljKSB7CisJCWNhc2UgQ1RSTCgnUicpOiAvKiBzZWFyY2hpbmcgZm9yIHRoZSBuZXh0IG1hdGNoICovCisJCQlicmVhazsKKworCQljYXNlICdcYic6CisJCWNhc2UgJ1x4N2YnOgorCQkJLyogQmFja3NwYWNlICovCisJCQlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworCQkJCXdoaWxlIChtYXRjaF9idWZfbGVuICE9IDApIHsKKwkJCQkJdWludDhfdCBjID0gbWF0Y2hfYnVmWy0tbWF0Y2hfYnVmX2xlbl07CisJCQkJCWlmICgoYyAmIDB4YzApICE9IDB4ODApIC8qIHN0YXJ0IG9mIFVURi04IGNoYXI/ICovCisJCQkJCQlicmVhazsgLyogeWVzICovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAobWF0Y2hfYnVmX2xlbiAhPSAwKQorCQkJCQltYXRjaF9idWZfbGVuLS07CisJCQl9CisJCQltYXRjaF9idWZbbWF0Y2hfYnVmX2xlbl0gPSAnXDAnOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpYyA8ICcgJworCQkJIHx8ICghRU5BQkxFX1VOSUNPREVfU1VQUE9SVCAmJiBpYyA+PSAyNTYpCisJCQkgfHwgKEVOQUJMRV9VTklDT0RFX1NVUFBPUlQgJiYgaWMgPj0gVklfQ01ETU9ERV9CSVQpCisJCQkpIHsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKworCQkJLyogQXBwZW5kIHRoaXMgY2hhciAqLworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCQkJbWJzdGF0ZV90IG1ic3RhdGUgPSB7IDAgfTsKKwkJCQljaGFyIGJ1ZltNQl9DVVJfTUFYICsgMV07CisJCQkJaW50IGxlbiA9IHdjcnRvbWIoYnVmLCBpYywgJm1ic3RhdGUpOworCQkJCWlmIChsZW4gPiAwKSB7CisJCQkJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJCQkJaWYgKG1hdGNoX2J1Zl9sZW4gKyBsZW4gPCBzaXplb2YobWF0Y2hfYnVmKSkKKwkJCQkJCXN0cmNweShtYXRjaF9idWYgKyBtYXRjaF9idWZfbGVuLCBidWYpOworCQkJCX0KKwkJCX0gZWxzZQorI2VuZGlmCisJCQlpZiAobWF0Y2hfYnVmX2xlbiA8IHNpemVvZihtYXRjaF9idWYpIC0gMSkgeworCQkJCW1hdGNoX2J1ZlttYXRjaF9idWZfbGVuXSA9IGljOworCQkJCW1hdGNoX2J1ZlttYXRjaF9idWZfbGVuICsgMV0gPSAnXDAnOworCQkJfQorCQkJYnJlYWs7CisJCX0gLyogc3dpdGNoIChpYykgKi8KKworCQkvKiBTZWFyY2ggaW4gaGlzdG9yeSBmb3IgbWF0Y2hfYnVmICovCisJCWggPSBzdGF0ZS0+Y3VyX2hpc3Rvcnk7CisJCWlmIChpYyA9PSBDVFJMKCdSJykpCisJCQloLS07CisJCXdoaWxlIChoID49IDApIHsKKwkJCWlmIChzdGF0ZS0+aGlzdG9yeVtoXSkgeworCQkJCWNoYXIgKm1hdGNoID0gc3Ryc3RyKHN0YXRlLT5oaXN0b3J5W2hdLCBtYXRjaF9idWYpOworCQkJCWlmIChtYXRjaCkgeworCQkJCQlzdGF0ZS0+Y3VyX2hpc3RvcnkgPSBoOworCQkJCQltYXRjaGVkX2hpc3RvcnlfbGluZSA9IHN0YXRlLT5oaXN0b3J5W2hdOworCQkJCQljb21tYW5kX2xlbiA9IGxvYWRfc3RyaW5nKG1hdGNoZWRfaGlzdG9yeV9saW5lKTsKKwkJCQkJY3Vyc29yID0gbWF0Y2ggLSBtYXRjaGVkX2hpc3RvcnlfbGluZTsKKy8vRklYTUU6IGN1cnNvciBwb3NpdGlvbiBmb3IgVW5pY29kZSBjYXNlCisKKwkJCQkJZnJlZSgoY2hhciopY21kZWRpdF9wcm9tcHQpOworIHNldF9wcm9tcHQ6CisJCQkJCWNtZGVkaXRfcHJvbXB0ID0geGFzcHJpbnRmKCIocmV2ZXJzZS1pLXNlYXJjaCknJXMnOiAiLCBtYXRjaF9idWYpOworCQkJCQljbWRlZGl0X3BybXRfbGVuID0gc3RybGVuKGNtZGVkaXRfcHJvbXB0KTsKKwkJCQkJZ290byBkb19yZWRyYXc7CisJCQkJfQorCQkJfQorCQkJaC0tOworCQl9CisKKwkJLyogTm90IGZvdW5kICovCisJCW1hdGNoX2J1ZlttYXRjaF9idWZfbGVuXSA9ICdcMCc7CisJCWJlZXAoKTsKKwkJY29udGludWU7CisKKyBkb19yZWRyYXc6CisJCXJlZHJhdyhjbWRlZGl0X3ksIGNvbW1hbmRfbGVuIC0gY3Vyc29yKTsKKwl9IC8qIHdoaWxlICgxKSAqLworCisgcmV0OgorCWlmIChtYXRjaGVkX2hpc3RvcnlfbGluZSkKKwkJY29tbWFuZF9sZW4gPSBsb2FkX3N0cmluZyhtYXRjaGVkX2hpc3RvcnlfbGluZSk7CisKKwlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7CisJY21kZWRpdF9wcm9tcHQgPSBzYXZlZF9wcm9tcHQ7CisJY21kZWRpdF9wcm10X2xlbiA9IHN0cmxlbihjbWRlZGl0X3Byb21wdCk7CisJcmVkcmF3KGNtZGVkaXRfeSwgY29tbWFuZF9sZW4gLSBjdXJzb3IpOworCisJcmV0dXJuIGljOworfQorI2VuZGlmCisKKy8qIG1heHNpemUgbXVzdCBiZSA+PSAyLgorICogUmV0dXJuczoKKyAqIC0xIG9uIHJlYWQgZXJyb3JzIG9yIEVPRiwgb3Igb24gYmFyZSBDdHJsLUQsCisgKiAwICBvbiBjdHJsLUMgKHRoZSBsaW5lIGVudGVyZWQgaXMgc3RpbGwgcmV0dXJuZWQgaW4gJ2NvbW1hbmQnKSwKKyAqID4wIGxlbmd0aCBvZiBpbnB1dCBzdHJpbmcsIGluY2x1ZGluZyB0ZXJtaW5hdGluZyAnXG4nCisgKi8KK2ludCBGQVNUX0ZVTkMgcmVhZF9saW5lX2lucHV0KGxpbmVfaW5wdXRfdCAqc3QsIGNvbnN0IGNoYXIgKnByb21wdCwgY2hhciAqY29tbWFuZCwgaW50IG1heHNpemUsIGludCB0aW1lb3V0KQoreworCWludCBsZW47CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwlzbWFsbGludCBsYXN0V2FzVGFiID0gMDsKKyNlbmRpZgorCXNtYWxsaW50IGJyZWFrX291dCA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorCXNtYWxsaW50IHZpX2NtZG1vZGUgPSAwOworI2VuZGlmCisJc3RydWN0IHRlcm1pb3MgaW5pdGlhbF9zZXR0aW5nczsKKwlzdHJ1Y3QgdGVybWlvcyBuZXdfc2V0dGluZ3M7CisJY2hhciByZWFkX2tleV9idWZmZXJbS0VZQ09ERV9CVUZGRVJfU0laRV07CisKKwlJTklUX1MoKTsKKworCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmaW5pdGlhbF9zZXR0aW5ncykgPCAwCisJIHx8ICEoaW5pdGlhbF9zZXR0aW5ncy5jX2xmbGFnICYgRUNITykKKwkpIHsKKwkJLyogSGFwcGVucyB3aGVuIGUuZy4gc3R0eSAtZWNobyB3YXMgcnVuIGJlZm9yZSAqLworCQlwYXJzZV9hbmRfcHV0X3Byb21wdChwcm9tcHQpOworCQkvKiBmZmx1c2hfYWxsKCk7IC0gZG9uZSBieSBwYXJzZV9hbmRfcHV0X3Byb21wdCAqLworCQlpZiAoZmdldHMoY29tbWFuZCwgbWF4c2l6ZSwgc3RkaW4pID09IE5VTEwpCisJCQlsZW4gPSAtMTsgLyogRU9GIG9yIGVycm9yICovCisJCWVsc2UKKwkJCWxlbiA9IHN0cmxlbihjb21tYW5kKTsKKwkJREVJTklUX1MoKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpbml0X3VuaWNvZGUoKTsKKworLy8gRklYTUU6IGF1ZGl0ICYgaW1wcm92ZSB0aGlzCisJaWYgKG1heHNpemUgPiBNQVhfTElORUxFTikKKwkJbWF4c2l6ZSA9IE1BWF9MSU5FTEVOOworCVMubWF4c2l6ZSA9IG1heHNpemU7CisKKwkvKiBXaXRoIHplcm8gZmxhZ3MsIG5vIG90aGVyIGZpZWxkcyBhcmUgZXZlciB1c2VkICovCisJc3RhdGUgPSBzdCA/IHN0IDogKGxpbmVfaW5wdXRfdCopICZjb25zdF9pbnRfMDsKKyNpZiBNQVhfSElTVE9SWSA+IDAKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCWlmICgoc3RhdGUtPmZsYWdzICYgU0FWRV9ISVNUT1JZKSAmJiBzdGF0ZS0+aGlzdF9maWxlKQorCQlpZiAoc3RhdGUtPmNudF9oaXN0b3J5ID09IDApCisJCQlsb2FkX2hpc3Rvcnkoc3RhdGUpOworIyBlbmRpZgorCWlmIChzdGF0ZS0+ZmxhZ3MgJiBET19ISVNUT1JZKQorCQlzdGF0ZS0+Y3VyX2hpc3RvcnkgPSBzdGF0ZS0+Y250X2hpc3Rvcnk7CisjZW5kaWYKKworCS8qIHByZXBhcmUgYmVmb3JlIGluaXQgaGFuZGxlcnMgKi8KKwljbWRlZGl0X3kgPSAwOyAgLyogcXVhc2lyZWFsIHksIG5vdCB0cnVlIGlmIGxpbmUgPiB4dCp5dCAqLworCWNvbW1hbmRfbGVuID0gMDsKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJY29tbWFuZF9wcyA9IHh6YWxsb2MobWF4c2l6ZSAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisjZWxzZQorCWNvbW1hbmRfcHMgPSBjb21tYW5kOworCWNvbW1hbmRbMF0gPSAnXDAnOworI2VuZGlmCisjZGVmaW5lIGNvbW1hbmQgY29tbWFuZF9tdXN0X25vdF9iZV91c2VkCisKKwluZXdfc2V0dGluZ3MgPSBpbml0aWFsX3NldHRpbmdzOworCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH5JQ0FOT047ICAgICAgICAvKiB1bmJ1ZmZlcmVkIGlucHV0ICovCisJLyogVHVybiBvZmYgZWNob2luZyBhbmQgQ1RSTC1DLCBzbyB3ZSBjYW4gdHJhcCBpdCAqLworCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9OTCB8IElTSUcpOworCS8qIEhtbSwgaW4gbGludXggY19jY1tdIGlzIG5vdCBwYXJzZWQgaWYgSUNBTk9OIGlzIG9mZiAqLworCW5ld19zZXR0aW5ncy5jX2NjW1ZNSU5dID0gMTsKKwluZXdfc2V0dGluZ3MuY19jY1tWVElNRV0gPSAwOworCS8qIFR1cm4gb2ZmIENUUkwtQywgc28gd2UgY2FuIHRyYXAgaXQgKi8KKwluZXdfc2V0dGluZ3MuY19jY1tWSU5UUl0gPSBfUE9TSVhfVkRJU0FCTEU7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJm5ld19zZXR0aW5ncyk7CisKKyNpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorCXsKKwkJc3RydWN0IHBhc3N3ZCAqZW50cnk7CisKKwkJZW50cnkgPSBnZXRwd3VpZChnZXRldWlkKCkpOworCQlpZiAoZW50cnkpIHsKKwkJCXVzZXJfYnVmID0geHN0cmR1cChlbnRyeS0+cHdfbmFtZSk7CisJCQlob21lX3B3ZF9idWYgPSB4c3RyZHVwKGVudHJ5LT5wd19kaXIpOworCQl9CisJfQorI2VuZGlmCisKKyNpZiAwCisJZm9yIChpID0gMDsgaSA8PSBzdGF0ZS0+bWF4X2hpc3Rvcnk7IGkrKykKKwkJYmJfZXJyb3JfbXNnKCJoaXN0b3J5WyVkXTonJXMnIiwgaSwgc3RhdGUtPmhpc3RvcnlbaV0pOworCWJiX2Vycm9yX21zZygiY3VyX2hpc3Rvcnk6JWQgY250X2hpc3Rvcnk6JWQiLCBzdGF0ZS0+Y3VyX2hpc3RvcnksIHN0YXRlLT5jbnRfaGlzdG9yeSk7CisjZW5kaWYKKworCS8qIFByaW50IG91dCB0aGUgY29tbWFuZCBwcm9tcHQsIG9wdGlvbmFsbHkgYXNrIHdoZXJlIGN1cnNvciBpcyAqLworCXBhcnNlX2FuZF9wdXRfcHJvbXB0KHByb21wdCk7CisJYXNrX3Rlcm1pbmFsKCk7CisKKwkvKiBJbnN0YWxsIHdpbmRvdyByZXNpemUgaGFuZGxlciAoTkI6IGFmdGVyICphbGwqIGluaXQgaXMgY29tcGxldGUpICovCisvL0ZJWE1FOiBzYXZlIGVudGlyZSBzaWdhY3Rpb24hCisJcHJldmlvdXNfU0lHV0lOQ0hfaGFuZGxlciA9IHNpZ25hbChTSUdXSU5DSCwgd2luX2NoYW5nZWQpOworCXdpbl9jaGFuZ2VkKDApOyAvKiBnZXQgaW5pdGlhbCB3aW5kb3cgc2l6ZSAqLworCisJcmVhZF9rZXlfYnVmZmVyWzBdID0gMDsKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBUaGUgZW1hY3MgYW5kIHZpIG1vZGVzIHNoYXJlIG11Y2ggb2YgdGhlIGNvZGUgaW4gdGhlIGJpZworCQkgKiBjb21tYW5kIGxvb3AuICBDb21tYW5kcyBlbnRlcmVkIHdoZW4gaW4gdmkncyBjb21tYW5kIG1vZGUKKwkJICogKGFrYSAiZXNjYXBlIG1vZGUiKSBnZXQgYW4gZXh0cmEgYml0IGFkZGVkIHRvIGRpc3Rpbmd1aXNoCisJCSAqIHRoZW0gLSB0aGlzIGtlZXBzIHRoZW0gZnJvbSBiZWluZyBzZWxmLWluc2VydGVkLiBUaGlzCisJCSAqIGNsdXR0ZXJzIHRoZSBiaWcgc3dpdGNoIGEgYml0LCBidXQga2VlcHMgYWxsIHRoZSBjb2RlCisJCSAqIGluIG9uZSBwbGFjZS4KKwkJICovCisJCWludDMyX3QgaWMsIGljX3JhdzsKKworCQlmZmx1c2hfYWxsKCk7CisJCWljID0gaWNfcmF3ID0gbGluZWVkaXRfcmVhZF9rZXkocmVhZF9rZXlfYnVmZmVyLCB0aW1lb3V0KTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFVkVSU0VfU0VBUkNICisgYWdhaW46CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJCW5ld2RlbGZsYWcgPSAxOworCQlpZiAodmlfY21kbW9kZSkgeworCQkJLyogYnR3LCBzaW5jZSBLRVlDT0RFX3h4eCBhcmUgYWxsIDwgMCwgdGhpcyBkb2Vzbid0CisJCQkgKiBjaGFuZ2UgaWMgaWYgaXQgY29udGFpbnMgb25lIG9mIHRoZW06ICovCisJCQlpYyB8PSBWSV9DTURNT0RFX0JJVDsKKwkJfQorI2VuZGlmCisKKwkJc3dpdGNoIChpYykgeworCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJdmlfY2FzZSgnXG4nfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnXHInfFZJX0NNRE1PREVfQklUOikKKwkJCS8qIEVudGVyICovCisJCQlnb3RvX25ld19saW5lKCk7CisJCQlicmVha19vdXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnQScpOgorCQl2aV9jYXNlKCcwJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLWEgLS0gQmVnaW5uaW5nIG9mIGxpbmUgKi8KKwkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQlicmVhazsKKwkJY2FzZSBDVFJMKCdCJyk6CisJCXZpX2Nhc2UoJ2gnfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnXGInfFZJX0NNRE1PREVfQklUOikgLyogXkggKi8KKwkJdmlfY2FzZSgnXHg3Zid8VklfQ01ETU9ERV9CSVQ6KSAvKiBERUwgKi8KKwkJCWlucHV0X2JhY2t3YXJkKDEpOyAvKiBNb3ZlIGJhY2sgb25lIGNoYXJhY3RlciAqLworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnRScpOgorCQl2aV9jYXNlKCckJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLWUgLS0gRW5kIG9mIGxpbmUgKi8KKwkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnRicpOgorCQl2aV9jYXNlKCdsJ3xWSV9DTURNT0RFX0JJVDopCisJCXZpX2Nhc2UoJyAnfFZJX0NNRE1PREVfQklUOikKKwkJCWlucHV0X2ZvcndhcmQoKTsgLyogTW92ZSBmb3J3YXJkIG9uZSBjaGFyYWN0ZXIgKi8KKwkJCWJyZWFrOworCQljYXNlICdcYic6ICAgLyogXkggKi8KKwkJY2FzZSAnXHg3Zic6IC8qIERFTCAqLworCQkJaWYgKCFpc3J0bF9zdHIoKSkKKwkJCQlpbnB1dF9iYWNrc3BhY2UoKTsKKwkJCWVsc2UKKwkJCQlpbnB1dF9kZWxldGUoMCk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0RFTEVURToKKwkJCWlmICghaXNydGxfc3RyKCkpCisJCQkJaW5wdXRfZGVsZXRlKDApOworCQkJZWxzZQorCQkJCWlucHV0X2JhY2tzcGFjZSgpOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwkJY2FzZSAnXHQnOgorCQkJaW5wdXRfdGFiKCZsYXN0V2FzVGFiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQ1RSTCgnSycpOgorCQkJLyogQ29udHJvbC1rIC0tIGNsZWFyIHRvIGVuZCBvZiBsaW5lICovCisJCQljb21tYW5kX3BzW2N1cnNvcl0gPSBCQl9OVUw7CisJCQljb21tYW5kX2xlbiA9IGN1cnNvcjsKKwkJCXByaW50ZihTRVFfQ0xFQVJfVElMTF9FTkRfT0ZfU0NSRUVOKTsKKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ0wnKToKKwkJdmlfY2FzZShDVFJMKCdMJyl8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogQ29udHJvbC1sIC0tIGNsZWFyIHNjcmVlbiAqLworCQkJcHJpbnRmKEVTQyJbSCIpOyAvKiBjdXJzb3IgdG8gdG9wLGxlZnQgKi8KKwkJCXJlZHJhdygwLCBjb21tYW5kX2xlbiAtIGN1cnNvcik7CisJCQlicmVhazsKKyNpZiBNQVhfSElTVE9SWSA+IDAKKwkJY2FzZSBDVFJMKCdOJyk6CisJCXZpX2Nhc2UoQ1RSTCgnTicpfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnaid8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogQ29udHJvbC1uIC0tIEdldCBuZXh0IGNvbW1hbmQgaW4gaGlzdG9yeSAqLworCQkJaWYgKGdldF9uZXh0X2hpc3RvcnkoKSkKKwkJCQlnb3RvIHJld3JpdGVfbGluZTsKKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ1AnKToKKwkJdmlfY2FzZShDVFJMKCdQJyl8VklfQ01ETU9ERV9CSVQ6KQorCQl2aV9jYXNlKCdrJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLXAgLS0gR2V0IHByZXZpb3VzIGNvbW1hbmQgZnJvbSBoaXN0b3J5ICovCisJCQlpZiAoZ2V0X3ByZXZpb3VzX2hpc3RvcnkoKSkKKwkJCQlnb3RvIHJld3JpdGVfbGluZTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQ1RSTCgnVScpOgorCQl2aV9jYXNlKENUUkwoJ1UnKXxWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLVUgLS0gQ2xlYXIgbGluZSBiZWZvcmUgY3Vyc29yICovCisJCQlpZiAoY3Vyc29yKSB7CisJCQkJY29tbWFuZF9sZW4gLT0gY3Vyc29yOworCQkJCW1lbW1vdmUoY29tbWFuZF9wcywgY29tbWFuZF9wcyArIGN1cnNvciwKKwkJCQkJKGNvbW1hbmRfbGVuICsgMSkgKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworCQkJCXJlZHJhdyhjbWRlZGl0X3ksIGNvbW1hbmRfbGVuKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ1cnKToKKwkJdmlfY2FzZShDVFJMKCdXJyl8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogQ29udHJvbC1XIC0tIFJlbW92ZSB0aGUgbGFzdCB3b3JkICovCisJCQl3aGlsZSAoY3Vyc29yID4gMCAmJiBCQl9pc3NwYWNlKGNvbW1hbmRfcHNbY3Vyc29yLTFdKSkKKwkJCQlpbnB1dF9iYWNrc3BhY2UoKTsKKwkJCXdoaWxlIChjdXJzb3IgPiAwICYmICFCQl9pc3NwYWNlKGNvbW1hbmRfcHNbY3Vyc29yLTFdKSkKKwkJCQlpbnB1dF9iYWNrc3BhY2UoKTsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1JFVkVSU0VfU0VBUkNICisJCWNhc2UgQ1RSTCgnUicpOgorCQkJaWMgPSBpY19yYXcgPSByZXZlcnNlX2lfc2VhcmNoKCk7CisJCQlnb3RvIGFnYWluOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJCWNhc2UgJ2knfFZJX0NNRE1PREVfQklUOgorCQkJdmlfY21kbW9kZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnSSd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9iYWNrd2FyZChjdXJzb3IpOworCQkJdmlfY21kbW9kZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnYSd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdBJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJdmlfY21kbW9kZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAneCd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9kZWxldGUoMSk7CisJCQlicmVhazsKKwkJY2FzZSAnWCd8VklfQ01ETU9ERV9CSVQ6CisJCQlpZiAoY3Vyc29yID4gMCkgeworCQkJCWlucHV0X2JhY2t3YXJkKDEpOworCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdXJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX1dvcmRfbW90aW9uKDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnfFZJX0NNRE1PREVfQklUOgorCQkJdmlfd29yZF9tb3Rpb24oMSk7CisJCQlicmVhazsKKwkJY2FzZSAnRSd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9FbmRfbW90aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAnZSd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9lbmRfbW90aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAnQid8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9CYWNrX21vdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InfFZJX0NNRE1PREVfQklUOgorCQkJdmlfYmFja19tb3Rpb24oKTsKKwkJCWJyZWFrOworCQljYXNlICdDJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX2NtZG1vZGUgPSAwOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ0QnfFZJX0NNRE1PREVfQklUOgorCQkJZ290byBjbGVhcl90b19lb2w7CisKKwkJY2FzZSAnYyd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlICdkJ3xWSV9DTURNT0RFX0JJVDogeworCQkJaW50IG5jLCBzYzsKKworCQkJaWMgPSBsaW5lZWRpdF9yZWFkX2tleShyZWFkX2tleV9idWZmZXIsIHRpbWVvdXQpOworCQkJaWYgKGVycm5vKSAvKiBlcnJvciAqLworCQkJCWdvdG8gcmV0dXJuX2Vycm9yX2luZGljYXRvcjsKKwkJCWlmIChpYyA9PSBpY19yYXcpIHsgLyogImNjIiwgImRkIiAqLworCQkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQkJZ290byBjbGVhcl90b19lb2w7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNjID0gY3Vyc29yOworCQkJc3dpdGNoIChpYykgeworCQkJY2FzZSAndyc6CisJCQljYXNlICdXJzoKKwkJCWNhc2UgJ2UnOgorCQkJY2FzZSAnRSc6CisJCQkJc3dpdGNoIChpYykgeworCQkJCWNhc2UgJ3cnOiAgIC8qICJkdyIsICJjdyIgKi8KKwkJCQkJdmlfd29yZF9tb3Rpb24odmlfY21kbW9kZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1cnOiAgIC8qICdkVycsICdjVycgKi8KKwkJCQkJdmlfV29yZF9tb3Rpb24odmlfY21kbW9kZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2UnOiAgIC8qICdkZScsICdjZScgKi8KKwkJCQkJdmlfZW5kX21vdGlvbigpOworCQkJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0UnOiAgIC8qICdkRScsICdjRScgKi8KKwkJCQkJdmlfRW5kX21vdGlvbigpOworCQkJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQluYyA9IGN1cnNvcjsKKwkJCQlpbnB1dF9iYWNrd2FyZChjdXJzb3IgLSBzYyk7CisJCQkJd2hpbGUgKG5jLS0gPiBjdXJzb3IpCisJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOiAgLyogImRiIiwgImNiIiAqLworCQkJY2FzZSAnQic6ICAvKiBpbXBsZW1lbnRlZCBhcyBCICovCisJCQkJaWYgKGljID09ICdiJykKKwkJCQkJdmlfYmFja19tb3Rpb24oKTsKKwkJCQllbHNlCisJCQkJCXZpX0JhY2tfbW90aW9uKCk7CisJCQkJd2hpbGUgKHNjLS0gPiBjdXJzb3IpCisJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyAnOiAgLyogImQgIiwgImMgIiAqLworCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyQnOiAgLyogImQkIiwgImMkIiAqLworIGNsZWFyX3RvX2VvbDoKKwkJCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4pCisJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ3AnfFZJX0NNRE1PREVfQklUOgorCQkJaW5wdXRfZm9yd2FyZCgpOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAnUCd8VklfQ01ETU9ERV9CSVQ6CisJCQlwdXQoKTsKKwkJCWJyZWFrOworCQljYXNlICdyJ3xWSV9DTURNT0RFX0JJVDoKKy8vRklYTUU6IHVuaWNvZGUgY2FzZT8KKwkJCWljID0gbGluZWVkaXRfcmVhZF9rZXkocmVhZF9rZXlfYnVmZmVyLCB0aW1lb3V0KTsKKwkJCWlmIChlcnJubykgLyogZXJyb3IgKi8KKwkJCQlnb3RvIHJldHVybl9lcnJvcl9pbmRpY2F0b3I7CisJCQlpZiAoaWMgPCAnICcgfHwgaWMgPiAyNTUpIHsKKwkJCQliZWVwKCk7CisJCQl9IGVsc2UgeworCQkJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IGljOworCQkJCWJiX3B1dGNoYXIoaWMpOworCQkJCWJiX3B1dGNoYXIoJ1xiJyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXHgxYic6IC8qIEVTQyAqLworCQkJaWYgKHN0YXRlLT5mbGFncyAmIFZJX01PREUpIHsKKwkJCQkvKiBpbnNlcnQgbW9kZSAtLT4gY29tbWFuZCBtb2RlICovCisJCQkJdmlfY21kbW9kZSA9IDE7CisJCQkJaW5wdXRfYmFja3dhcmQoMSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvKiBGRUFUVVJFX0NPTU1BTkRfRURJVElOR19WSSAqLworCisjaWYgTUFYX0hJU1RPUlkgPiAwCisJCWNhc2UgS0VZQ09ERV9VUDoKKwkJCWlmIChnZXRfcHJldmlvdXNfaGlzdG9yeSgpKQorCQkJCWdvdG8gcmV3cml0ZV9saW5lOworCQkJYmVlcCgpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZQ09ERV9ET1dOOgorCQkJaWYgKCFnZXRfbmV4dF9oaXN0b3J5KCkpCisJCQkJYnJlYWs7CisgcmV3cml0ZV9saW5lOgorCQkJLyogUmV3cml0ZSB0aGUgbGluZSB3aXRoIHRoZSBzZWxlY3RlZCBoaXN0b3J5IGl0ZW0gKi8KKwkJCS8qIGNoYW5nZSBjb21tYW5kICovCisJCQljb21tYW5kX2xlbiA9IGxvYWRfc3RyaW5nKHN0YXRlLT5oaXN0b3J5W3N0YXRlLT5jdXJfaGlzdG9yeV0gPworCQkJCQlzdGF0ZS0+aGlzdG9yeVtzdGF0ZS0+Y3VyX2hpc3RvcnldIDogIiIpOworCQkJLyogcmVkcmF3IGFuZCBnbyB0byBlb2wgKGJvbCwgaW4gdmkpICovCisJCQlyZWRyYXcoY21kZWRpdF95LCAoc3RhdGUtPmZsYWdzICYgVklfTU9ERSkgPyA5OTk5IDogMCk7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIEtFWUNPREVfUklHSFQ6CisJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0xFRlQ6CisJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfQ1RSTF9MRUZUOgorCQkJY3RybF9sZWZ0KCk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0NUUkxfUklHSFQ6CisJCQljdHJsX3JpZ2h0KCk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0hPTUU6CisJCQlpbnB1dF9iYWNrd2FyZChjdXJzb3IpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZQ09ERV9FTkQ6CisJCQlwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3IoKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZJTlRSXSAhPSAwCisJCQkgJiYgaWNfcmF3ID09IGluaXRpYWxfc2V0dGluZ3MuY19jY1tWSU5UUl0KKwkJCSkgeworCQkJCS8qIEN0cmwtQyAodXN1YWxseSkgLSBzdG9wIGdhdGhlcmluZyBpbnB1dCAqLworCQkJCWdvdG9fbmV3X2xpbmUoKTsKKwkJCQljb21tYW5kX2xlbiA9IDA7CisJCQkJYnJlYWtfb3V0ID0gLTE7IC8qICJkbyBub3QgYXBwZW5kICdcbiciICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZFT0ZdICE9IDAKKwkJCSAmJiBpY19yYXcgPT0gaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZFT0ZdCisJCQkpIHsKKwkJCQkvKiBDdHJsLUQgKHVzdWFsbHkpIC0gZGVsZXRlIG9uZSBjaGFyYWN0ZXIsCisJCQkJICogb3IgZXhpdCBpZiBsZW49MCBhbmQgbm8gY2hhcnMgdG8gZGVsZXRlICovCisJCQkJaWYgKGNvbW1hbmRfbGVuID09IDApIHsKKwkJCQkJZXJybm8gPSAwOworCisJCWNhc2UgLTE6IC8qIGVycm9yIChlLmcuIEVJTyB3aGVuIHR0eSBpcyBkZXN0cm95ZWQpICovCisgSUZfRkVBVFVSRV9FRElUSU5HX1ZJKHJldHVybl9lcnJvcl9pbmRpY2F0b3I6KQorCQkJCQlicmVha19vdXQgPSBjb21tYW5kX2xlbiA9IC0xOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaW5wdXRfZGVsZXRlKDApOworCQkJCWJyZWFrOworCQkJfQorLy8JCQkvKiBDb250cm9sLVYgLS0gZm9yY2UgaW5zZXJ0IG9mIG5leHQgY2hhciAqLworLy8JCQlpZiAoYyA9PSBDVFJMKCdWJykpIHsKKy8vCQkJCWlmIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCAmYywgMSkgPCAxKQorLy8JCQkJCWdvdG8gcmV0dXJuX2Vycm9yX2luZGljYXRvcjsKKy8vCQkJCWlmIChjID09IDApIHsKKy8vCQkJCQliZWVwKCk7CisvLwkJCQkJYnJlYWs7CisvLwkJCQl9CisvLwkJCX0KKwkJCWlmIChpYyA8ICcgJworCQkJIHx8ICghRU5BQkxFX1VOSUNPREVfU1VQUE9SVCAmJiBpYyA+PSAyNTYpCisJCQkgfHwgKEVOQUJMRV9VTklDT0RFX1NVUFBPUlQgJiYgaWMgPj0gVklfQ01ETU9ERV9CSVQpCisJCQkpIHsKKwkJCQkvKiBJZiBWSV9DTURNT0RFX0JJVCBpcyBzZXQsIGljIGlzID49IDI1NgorCQkJCSAqIGFuZCB2aSBtb2RlIGlnbm9yZXMgdW5leHBlY3RlZCBjaGFycy4KKwkJCQkgKiBPdGhlcndpc2UsIHdlIGFyZSBoZXJlIGlmIGljIGlzIGEKKwkJCQkgKiBjb250cm9sIGNoYXIgb3IgYW4gdW5oYW5kbGVkIEVTQyBzZXF1ZW5jZSwKKwkJCQkgKiB3aGljaCBpcyBhbHNvIGlnbm9yZWQuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKGludCljb21tYW5kX2xlbiA+PSAobWF4c2l6ZSAtIDIpKSB7CisJCQkJLyogTm90IGVub3VnaCBzcGFjZSBmb3IgdGhlIGNoYXIgYW5kIEVPTCAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQljb21tYW5kX2xlbisrOworCQkJaWYgKGN1cnNvciA9PSAoY29tbWFuZF9sZW4gLSAxKSkgeworCQkJCS8qIFdlIGFyZSBhdCB0aGUgZW5kLCBhcHBlbmQgKi8KKwkJCQljb21tYW5kX3BzW2N1cnNvcl0gPSBpYzsKKwkJCQljb21tYW5kX3BzW2N1cnNvciArIDFdID0gQkJfTlVMOworCQkJCXB1dF9jdXJfZ2x5cGhfYW5kX2luY19jdXJzb3IoKTsKKwkJCQlpZiAodW5pY29kZV9iaWRpX2lzcnRsKGljKSkKKwkJCQkJaW5wdXRfYmFja3dhcmQoMSk7CisJCQl9IGVsc2UgeworCQkJCS8qIEluIHRoZSBtaWRkbGUsIGluc2VydCAqLworCQkJCWludCBzYyA9IGN1cnNvcjsKKworCQkJCW1lbW1vdmUoY29tbWFuZF9wcyArIHNjICsgMSwgY29tbWFuZF9wcyArIHNjLAorCQkJCQkoY29tbWFuZF9sZW4gLSBzYykgKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworCQkJCWNvbW1hbmRfcHNbc2NdID0gaWM7CisJCQkJLyogaXMgcmlnaHQtdG8tbGVmdCBjaGFyLCBvciBuZXV0cmFsIG9uZSAoZS5nLiBjb21tYSkgd2FzIGp1c3QgYWRkZWQgdG8gcnRsIHRleHQ/ICovCisJCQkJaWYgKCFpc3J0bF9zdHIoKSkKKwkJCQkJc2MrKzsgLyogbm8gKi8KKwkJCQlwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3IoKTsKKwkJCQkvKiB0byBwcmV2IHggcG9zICsgMSAqLworCQkJCWlucHV0X2JhY2t3YXJkKGN1cnNvciAtIHNjKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IC8qIHN3aXRjaCAoaWMpICovCisKKwkJaWYgKGJyZWFrX291dCkKKwkJCWJyZWFrOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwkJaWYgKGljX3JhdyAhPSAnXHQnKQorCQkJbGFzdFdhc1RhYiA9IDA7CisjZW5kaWYKKwl9IC8qIHdoaWxlICgxKSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwlpZiAoUy5zZW50X0VTQ19icjZuKSB7CisJCS8qICJzbGVlcCAxOyBidXN5Ym94IGFzaCIgKyBob2xkIFtFbnRlcl0gdG8gdHJpZ2dlci4KKwkJICogV2Ugc2VudCAiRVNDIFsgNiBuIiwgYnV0IGdvdCAnXG4nIGZpcnN0LCBhbmQKKwkJICogS0VZQ09ERV9DVVJTT1JfUE9TIHJlc3BvbnNlIGlzIG5vdyBidWZmZXJlZCBmcm9tIHRlcm1pbmFsLgorCQkgKiBJdCdzIGJhZCBhbHJlYWR5IGFuZCBub3QgbXVjaCBjYW4gYmUgZG9uZSB3aXRoIGl0CisJCSAqIChpdCBfd2lsbF8gYmUgdmlzaWJsZSBmb3IgdGhlIG5leHQgcHJvY2VzcyB0byByZWFkIHN0ZGluKSwKKwkJICogYnV0IHdpdGhvdXQgdGhpcyBkZWxheSBpdCBldmVuIHNob3dzIHVwIG9uIHRoZSBzY3JlZW4KKwkJICogYXMgZ2FyYmFnZSBiZWNhdXNlIHdlIHJlc3RvcmUgZWNobyBzZXR0aW5ncyB3aXRoIHRjc2V0YXR0cgorCQkgKiBiZWZvcmUgaXQgY29tZXMgaW4uIFVHTFkhCisJCSAqLworCQl1c2xlZXAoMjAqMTAwMCk7CisJfQorI2VuZGlmCisKKy8qIEVuZCBvZiBidWctY2F0Y2hpbmcgImNvbW1hbmRfbXVzdF9ub3RfYmVfdXNlZCIgdHJpY2sgKi8KKyN1bmRlZiBjb21tYW5kCisKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJY29tbWFuZFswXSA9ICdcMCc7CisJaWYgKGNvbW1hbmRfbGVuID4gMCkKKwkJY29tbWFuZF9sZW4gPSBzYXZlX3N0cmluZyhjb21tYW5kLCBtYXhzaXplIC0gMSk7CisJZnJlZShjb21tYW5kX3BzKTsKKyNlbmRpZgorCisJaWYgKGNvbW1hbmRfbGVuID4gMCkKKwkJcmVtZW1iZXJfaW5faGlzdG9yeShjb21tYW5kKTsKKworCWlmIChicmVha19vdXQgPiAwKSB7CisJCWNvbW1hbmRbY29tbWFuZF9sZW4rK10gPSAnXG4nOworCQljb21tYW5kW2NvbW1hbmRfbGVuXSA9ICdcMCc7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwlmcmVlX3RhYl9jb21wbGV0aW9uX2RhdGEoKTsKKyNlbmRpZgorCisJLyogcmVzdG9yZSBpbml0aWFsX3NldHRpbmdzICovCisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJmluaXRpYWxfc2V0dGluZ3MpOworCS8qIHJlc3RvcmUgU0lHV0lOQ0ggaGFuZGxlciAqLworCXNpZ25hbChTSUdXSU5DSCwgcHJldmlvdXNfU0lHV0lOQ0hfaGFuZGxlcik7CisJZmZsdXNoX2FsbCgpOworCisJbGVuID0gY29tbWFuZF9sZW47CisJREVJTklUX1MoKTsKKworCXJldHVybiBsZW47IC8qIGNhbid0IHJldHVybiBjb21tYW5kX2xlbiwgREVJTklUX1MoKSBkZXN0cm95cyBpdCAqLworfQorCisjZWxzZSAgLyogIUZFQVRVUkVfRURJVElORyAqLworCisjdW5kZWYgcmVhZF9saW5lX2lucHV0CitpbnQgRkFTVF9GVU5DIHJlYWRfbGluZV9pbnB1dChjb25zdCBjaGFyKiBwcm9tcHQsIGNoYXIqIGNvbW1hbmQsIGludCBtYXhzaXplKQoreworCWZwdXRzKHByb21wdCwgc3Rkb3V0KTsKKwlmZmx1c2hfYWxsKCk7CisJZmdldHMoY29tbWFuZCwgbWF4c2l6ZSwgc3RkaW4pOworCXJldHVybiBzdHJsZW4oY29tbWFuZCk7Cit9CisKKyNlbmRpZiAgLyogIUZFQVRVUkVfRURJVElORyAqLworCisKKy8qCisgKiBUZXN0aW5nCisgKi8KKworI2lmZGVmIFRFU1QKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCitjb25zdCBjaGFyICphcHBsZXRfbmFtZSA9ICJkZWJ1ZyBzdHVmZiB1c2FnZSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGJ1ZmZbTUFYX0xJTkVMRU5dOworCWNoYXIgKnByb21wdCA9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwkJIlxcW1xcMDMzWzMyOzFtXFxdXFx1QFxcW1xceDFiWzMzOzFtXFxdXFxoOiIKKwkJIlxcW1xcMDMzWzM0OzFtXFxdXFx3XFxbXFwwMzNbMzU7MW1cXF0gIgorCQkiXFwhXFxbXFxlWzM2OzFtXFxdXFwkIFxcW1xcRVswbVxcXSI7CisjZWxzZQorCQkiJSAiOworI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQlpbnQgbDsKKwkJbCA9IHJlYWRfbGluZV9pbnB1dChwcm9tcHQsIGJ1ZmYpOworCQlpZiAobCA8PSAwIHx8IGJ1ZmZbbC0xXSAhPSAnXG4nKQorCQkJYnJlYWs7CisJCWJ1ZmZbbC0xXSA9ICdcMCc7CisJCXByaW50ZigiKioqIHJlYWRfbGluZV9pbnB1dCgpIHJldHVybmVkIGxpbmUgPSVzPVxuIiwgYnVmZik7CisJfQorCXByaW50ZigiKioqIHJlYWRfbGluZV9pbnB1dCgpIGRldGVjdCBeRFxuIik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYmIvbGluZWVkaXRfcHRyX2hhY2suYyBiL2xpYmJiL2xpbmVlZGl0X3B0cl9oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NTg1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2xpbmVlZGl0X3B0cl9oYWNrLmMKQEAgLTAsMCArMSwyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljczsKKworI2lmbmRlZiBHQ0NfQ09NQklORQorCisvKiBXZSBjaGVhdCBoZXJlLiBJdCBpcyBkZWNsYXJlZCBhcyBjb25zdCBwdHIgaW4gbGliYmIuaCwKKyAqIGJ1dCBoZXJlIHdlIG1ha2UgaXQgbGl2ZSBpbiBSL1cgbWVtb3J5ICovCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljcyAqbGluZWVkaXRfcHRyX3RvX3N0YXRpY3M7CisKKyNlbHNlCisKKy8qIGdjYyAtY29tYmluZSB3aWxsIHNlZSB0aHJvdWdoIGFuZCBjb21wbGFpbiAqLworLyogVXNpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kIHdoaWNoIGlzIG1vcmUgbGlrZWx5IHRvIGJyZWFrCisgKiBvbiB3ZWlyZCBhcmNoaXRlY3R1cmVzLCBjb21waWxlcnMsIGxpbmtlcnMgYW5kIHNvIG9uICovCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljcyAqY29uc3QgbGluZWVkaXRfcHRyX3RvX3N0YXRpY3MgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvbGxpc3QuYyBiL2xpYmJiL2xsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyZTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2xsaXN0LmMKQEAgLTAsMCArMSw5OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGlua2VkIGxpc3QgaGVscGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTWNHcmF0aAorICogQ29weXJpZ2h0IChDKSAyMDA1IFZsYWRpbWlyIE9sZXluaWsKKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEFkZCBkYXRhIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlua2VkIGxpc3QuICAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfYWRkX3RvKGxsaXN0X3QgKipvbGRfaGVhZCwgdm9pZCAqZGF0YSkKK3sKKwlsbGlzdF90ICpuZXdfaGVhZCA9IHhtYWxsb2Moc2l6ZW9mKGxsaXN0X3QpKTsKKworCW5ld19oZWFkLT5kYXRhID0gZGF0YTsKKwluZXdfaGVhZC0+bGluayA9ICpvbGRfaGVhZDsKKwkqb2xkX2hlYWQgPSBuZXdfaGVhZDsKK30KKworLyogQWRkIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgbGlua2VkIGxpc3QuICAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfYWRkX3RvX2VuZChsbGlzdF90ICoqbGlzdF9oZWFkLCB2b2lkICpkYXRhKQoreworCXdoaWxlICgqbGlzdF9oZWFkKQorCQlsaXN0X2hlYWQgPSAmKCpsaXN0X2hlYWQpLT5saW5rOworCSpsaXN0X2hlYWQgPSB4emFsbG9jKHNpemVvZihsbGlzdF90KSk7CisJKCpsaXN0X2hlYWQpLT5kYXRhID0gZGF0YTsKKwkvKigqbGlzdF9oZWFkKS0+bGluayA9IE5VTEw7Ki8KK30KKworLyogUmVtb3ZlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJuIGl0ICovCit2b2lkKiBGQVNUX0ZVTkMgbGxpc3RfcG9wKGxsaXN0X3QgKipoZWFkKQoreworCXZvaWQgKmRhdGEgPSBOVUxMOworCWxsaXN0X3QgKnRlbXAgPSAqaGVhZDsKKworCWlmICh0ZW1wKSB7CisJCWRhdGEgPSB0ZW1wLT5kYXRhOworCQkqaGVhZCA9IHRlbXAtPmxpbms7CisJCWZyZWUodGVtcCk7CisJfQorCXJldHVybiBkYXRhOworfQorCisvKiBVbmxpbmsgYXJiaXRyYXJ5IGdpdmVuIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfdW5saW5rKGxsaXN0X3QgKipoZWFkLCBsbGlzdF90ICplbG0pCit7CisJaWYgKCFlbG0pCisJCXJldHVybjsKKwl3aGlsZSAoKmhlYWQpIHsKKwkJaWYgKCpoZWFkID09IGVsbSkgeworCQkJKmhlYWQgPSAoKmhlYWQpLT5saW5rOworCQkJYnJlYWs7CisJCX0KKwkJaGVhZCA9ICYoKmhlYWQpLT5saW5rOworCX0KK30KKworLyogUmVjdXJzaXZlbHkgZnJlZSBhbGwgZWxlbWVudHMgaW4gdGhlIGxpbmtlZCBsaXN0LiAgSWYgZnJlZWl0ICE9IE5VTEwKKyAqIGNhbGwgaXQgb24gZWFjaCBkYXR1bSBpbiB0aGUgbGlzdCAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfZnJlZShsbGlzdF90ICplbG0sIHZvaWQgKCpmcmVlaXQpKHZvaWQgKmRhdGEpKQoreworCXdoaWxlIChlbG0pIHsKKwkJdm9pZCAqZGF0YSA9IGxsaXN0X3BvcCgmZWxtKTsKKworCQlpZiAoZnJlZWl0KQorCQkJZnJlZWl0KGRhdGEpOworCX0KK30KKworLyogUmV2ZXJzZSBsaXN0IG9yZGVyLiAqLworbGxpc3RfdCogRkFTVF9GVU5DIGxsaXN0X3JldihsbGlzdF90ICpsaXN0KQoreworCWxsaXN0X3QgKnJldiA9IE5VTEw7CisKKwl3aGlsZSAobGlzdCkgeworCQlsbGlzdF90ICpuZXh0ID0gbGlzdC0+bGluazsKKworCQlsaXN0LT5saW5rID0gcmV2OworCQlyZXYgPSBsaXN0OworCQlsaXN0ID0gbmV4dDsKKwl9CisJcmV0dXJuIHJldjsKK30KKworbGxpc3RfdCogRkFTVF9GVU5DIGxsaXN0X2ZpbmRfc3RyKGxsaXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAoc3RyY21wKGxpc3QtPmRhdGEsIHN0cikgPT0gMCkKKwkJCWJyZWFrOworCQlsaXN0ID0gbGlzdC0+bGluazsKKwl9CisJcmV0dXJuIGxpc3Q7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9sb2dpbi5jIGIvbGliYmIvbG9naW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgyYzZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbG9naW4uYwpAQCAtMCwwICsxLDEzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaXNzdWUuYzogaXNzdWUgcHJpbnRpbmcgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBCYXN0aWFuIEJsYW5rIDx3YWxkaUB0dXhib3gub3JnPgorICoKKyAqIE9wdGltaXplIGFuZCBjb3JyZWN0aW5nIE9DUk5MIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSBMT0dJTiAiIGxvZ2luOiAiCisKK3N0YXRpYyBjb25zdCBjaGFyIGZtdHN0cl9kW10gQUxJR04xID0gIiVBLCAlZCAlQiAlWSI7CitzdGF0aWMgY29uc3QgY2hhciBmbXRzdHJfdFtdIEFMSUdOMSA9ICIlSDolTTolUyI7CisKK3ZvaWQgRkFTVF9GVU5DIHByaW50X2xvZ2luX2lzc3VlKGNvbnN0IGNoYXIgKmlzc3VlX2ZpbGUsIGNvbnN0IGNoYXIgKnR0eSkKK3sKKwlGSUxFICpmcDsKKwlpbnQgYzsKKwljaGFyIGJ1ZlsyNTYrMV07CisJY29uc3QgY2hhciAqb3V0YnVmOworCXRpbWVfdCB0OworCXN0cnVjdCB1dHNuYW1lIHV0czsKKworCXRpbWUoJnQpOworCXVuYW1lKCZ1dHMpOworCisJcHV0cygiXHIiKTsgIC8qIHN0YXJ0IGEgbmV3IGxpbmUgKi8KKworCWZwID0gZm9wZW5fZm9yX3JlYWQoaXNzdWVfZmlsZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCXdoaWxlICgoYyA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCW91dGJ1ZiA9IGJ1ZjsKKwkJYnVmWzBdID0gYzsKKwkJYnVmWzFdID0gJ1wwJzsKKwkJaWYgKGMgPT0gJ1xuJykgeworCQkJYnVmWzFdID0gJ1xyJzsKKwkJCWJ1ZlsyXSA9ICdcMCc7CisJCX0KKwkJaWYgKGMgPT0gJ1xcJyB8fCBjID09ICclJykgeworCQkJYyA9IGZnZXRjKGZwKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAncyc6CisJCQkJb3V0YnVmID0gdXRzLnN5c25hbWU7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCWNhc2UgJ2gnOgorCQkJCW91dGJ1ZiA9IHV0cy5ub2RlbmFtZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJCW91dGJ1ZiA9IHV0cy5yZWxlYXNlOworCQkJCWJyZWFrOworCQkJY2FzZSAndic6CisJCQkJb3V0YnVmID0gdXRzLnZlcnNpb247CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQlvdXRidWYgPSB1dHMubWFjaGluZTsKKwkJCQlicmVhazsKKy8qIFRoZSBmaWVsZCBkb21haW5uYW1lIG9mIHN0cnVjdCB1dHNuYW1lIGlzIExpbnV4IHNwZWNpZmljLiAqLworI2lmIGRlZmluZWQoX19saW51eF9fKQorCQkJY2FzZSAnRCc6CisJCQljYXNlICdvJzoKKwkJCQlvdXRidWYgPSB1dHMuZG9tYWlubmFtZTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSAnZCc6CisJCQkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgZm10c3RyX2QsIGxvY2FsdGltZSgmdCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgZm10c3RyX3QsIGxvY2FsdGltZSgmdCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnbCc6CisJCQkJb3V0YnVmID0gdHR5OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlidWZbMF0gPSBjOworCQkJfQorCQl9CisJCWZwdXRzKG91dGJ1Ziwgc3Rkb3V0KTsKKwl9CisJZmNsb3NlKGZwKTsKKwlmZmx1c2hfYWxsKCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHByaW50X2xvZ2luX3Byb21wdCh2b2lkKQoreworCWNoYXIgKmhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCisJZnB1dHMoaG9zdG5hbWUsIHN0ZG91dCk7CisJZnB1dHMoTE9HSU4sIHN0ZG91dCk7CisJZmZsdXNoX2FsbCgpOworCWZyZWUoaG9zdG5hbWUpOworfQorCisvKiBDbGVhciBkYW5nZXJvdXMgc3R1ZmYsIHNldCBQQVRIICovCitzdGF0aWMgY29uc3QgY2hhciBmb3JiaWRbXSBBTElHTjEgPQorCSJFTlYiICJcMCIKKwkiQkFTSF9FTlYiICJcMCIKKwkiSE9NRSIgIlwwIgorCSJJRlMiICJcMCIKKwkiU0hFTEwiICJcMCIKKwkiTERfTElCUkFSWV9QQVRIIiAiXDAiCisJIkxEX1BSRUxPQUQiICJcMCIKKwkiTERfVFJBQ0VfTE9BREVEX09CSkVDVFMiICJcMCIKKwkiTERfQklORF9OT1ciICJcMCIKKwkiTERfQU9VVF9MSUJSQVJZX1BBVEgiICJcMCIKKwkiTERfQU9VVF9QUkVMT0FEIiAiXDAiCisJIkxEX05PV0FSTiIgIlwwIgorCSJMRF9LRUVQRElSIiAiXDAiOworCitpbnQgRkFTVF9GVU5DIHNhbml0aXplX2Vudl9pZl9zdWlkKHZvaWQpCit7CisJY29uc3QgY2hhciAqcDsKKworCWlmIChnZXR1aWQoKSA9PSBnZXRldWlkKCkpCisJCXJldHVybiAwOworCisJcCA9IGZvcmJpZDsKKwlkbyB7CisJCXVuc2V0ZW52KHApOworCQlwICs9IHN0cmxlbihwKSArIDE7CisJfSB3aGlsZSAoKnApOworCXB1dGVudigoY2hhciopYmJfUEFUSF9yb290X3BhdGgpOworCisJcmV0dXJuIDE7IC8qIHdlIGluZGVlZCB3ZXJlIHJ1biBieSBkaWZmZXJlbnQgdXNlciEgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmJiL2xvb3AuYyBiL2xpYmJiL2xvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk4OTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbG9vcC5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKworLyogRm9yIDIuNiwgdXNlIHRoZSBjbGVhbmVkIHVwIGhlYWRlciB0byBnZXQgdGhlIDY0IGJpdCBBUEkuICovCisvLyBDb21tZW50ZWQgb3V0IHBlciBSb2IncyByZXF1ZXN0CisvLyMgaW5jbHVkZSAiZml4X3UzMi5oIiAvKiBzb21lIG9sZCB0b29sY2hhaW5zIG5lZWQgX191NjQgZm9yIGxpbnV4L2xvb3AuaCAqLworIyBpbmNsdWRlIDxsaW51eC9sb29wLmg+Cit0eXBlZGVmIHN0cnVjdCBsb29wX2luZm82NCBiYl9sb29wX2luZm87CisjIGRlZmluZSBCQl9MT09QX1NFVF9TVEFUVVMgTE9PUF9TRVRfU1RBVFVTNjQKKyMgZGVmaW5lIEJCX0xPT1BfR0VUX1NUQVRVUyBMT09QX0dFVF9TVEFUVVM2NAorCisjZWxzZQorCisvKiBGb3IgMi40IGFuZCBlYXJsaWVyLCB1c2UgdGhlIDMyIGJpdCBBUEkgKGFuZCBkb24ndCB0cnVzdCB0aGUgaGVhZGVycykgKi8KKy8qIFN0dWZmIHN0b2xlbiBmcm9tIGxpbnV4L2xvb3AuaCBmb3IgMi40IGFuZCBlYXJsaWVyIGtlcm5lbHMgKi8KKyMgaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KKyMgZGVmaW5lIExPX05BTUVfU0laRSAgICAgICAgNjQKKyMgZGVmaW5lIExPX0tFWV9TSVpFICAgICAgICAgMzIKKyMgZGVmaW5lIExPT1BfU0VUX0ZEICAgICAgICAgMHg0QzAwCisjIGRlZmluZSBMT09QX0NMUl9GRCAgICAgICAgIDB4NEMwMQorIyBkZWZpbmUgQkJfTE9PUF9TRVRfU1RBVFVTICAweDRDMDIKKyMgZGVmaW5lIEJCX0xPT1BfR0VUX1NUQVRVUyAgMHg0QzAzCit0eXBlZGVmIHN0cnVjdCB7CisJaW50ICAgICAgICAgICAgICAgIGxvX251bWJlcjsKKwlfX2tlcm5lbF9kZXZfdCAgICAgbG9fZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgICAgICBsb19pbm9kZTsKKwlfX2tlcm5lbF9kZXZfdCAgICAgbG9fcmRldmljZTsKKwlpbnQgICAgICAgICAgICAgICAgbG9fb2Zmc2V0OworCWludCAgICAgICAgICAgICAgICBsb19lbmNyeXB0X3R5cGU7CisJaW50ICAgICAgICAgICAgICAgIGxvX2VuY3J5cHRfa2V5X3NpemU7CisJaW50ICAgICAgICAgICAgICAgIGxvX2ZsYWdzOworCWNoYXIgICAgICAgICAgICAgICBsb19maWxlX25hbWVbTE9fTkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyICAgICAgbG9fZW5jcnlwdF9rZXlbTE9fS0VZX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgICAgICBsb19pbml0WzJdOworCWNoYXIgICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKK30gYmJfbG9vcF9pbmZvOworI2VuZGlmCisKK2NoYXIqIEZBU1RfRlVOQyBxdWVyeV9sb29wKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlpbnQgZmQ7CisJYmJfbG9vcF9pbmZvIGxvb3BpbmZvOworCWNoYXIgKmRldiA9IE5VTEw7CisKKwlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJaWYgKGlvY3RsKGZkLCBCQl9MT09QX0dFVF9TVEFUVVMsICZsb29waW5mbykgPT0gMCkgeworCQkJZGV2ID0geGFzcHJpbnRmKCIlIk9GRl9GTVQidSAlcyIsIChvZmZfdCkgbG9vcGluZm8ubG9fb2Zmc2V0LAorCQkJCQkoY2hhciAqKWxvb3BpbmZvLmxvX2ZpbGVfbmFtZSk7CisJCX0KKwkJY2xvc2UoZmQpOworCX0KKworCXJldHVybiBkZXY7Cit9CisKK2ludCBGQVNUX0ZVTkMgZGVsX2xvb3AoY29uc3QgY2hhciAqZGV2aWNlKQoreworCWludCBmZCwgcmM7CisKKwlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDE7CisJcmMgPSBpb2N0bChmZCwgTE9PUF9DTFJfRkQsIDApOworCWNsb3NlKGZkKTsKKworCXJldHVybiByYzsKK30KKworLyogUmV0dXJucyAwIGlmIG1vdW50ZWQgUlcsIDEgaWYgbW91bnRlZCByZWFkLW9ubHksIDwwIGZvciBlcnJvci4KKyAgICpkZXZpY2UgaXMgbG9vcCBkZXZpY2UgdG8gdXNlLCBvciBpZiAqZGV2aWNlPT1OVUxMIGZpbmRzIGEgbG9vcCBkZXZpY2UgdG8KKyAgIG1vdW50IGl0IG9uIGFuZCBzZXRzICpkZXZpY2UgdG8gYSBzdHJkdXAgb2YgdGhhdCBsb29wIGRldmljZSBuYW1lLiAgVGhpcworICAgc2VhcmNoIHdpbGwgcmUtdXNlIGFuIGV4aXN0aW5nIGxvb3AgZGV2aWNlIGFscmVhZHkgYm91bmQgdG8gdGhhdAorICAgZmlsZS9vZmZzZXQgaWYgaXQgZmluZHMgb25lLgorICovCitpbnQgRkFTVF9GVU5DIHNldF9sb29wKGNoYXIgKipkZXZpY2UsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpCit7CisJY2hhciBkZXZbTE9PUF9OQU1FU0laRV07CisJY2hhciAqdHJ5OworCWJiX2xvb3BfaW5mbyBsb29waW5mbzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBpLCBkZmQsIGZmZCwgbW9kZSwgcmMgPSAtMTsKKworCS8qIE9wZW4gdGhlIGZpbGUuICBCYXJmIGlmIHRoaXMgZG9lc24ndCB3b3JrLiAgKi8KKwltb2RlID0gT19SRFdSOworCWZmZCA9IG9wZW4oZmlsZSwgbW9kZSk7CisJaWYgKGZmZCA8IDApIHsKKwkJbW9kZSA9IE9fUkRPTkxZOworCQlmZmQgPSBvcGVuKGZpbGUsIG1vZGUpOworCQlpZiAoZmZkIDwgMCkKKwkJCXJldHVybiAtZXJybm87CisJfQorCisJLyogRmluZCBhIGxvb3AgZGV2aWNlLiAgKi8KKwl0cnkgPSAqZGV2aWNlID8gKmRldmljZSA6IGRldjsKKwkvKiAxMDQ4NTc1IGlzIGEgbWF4IHBvc3NpYmxlIG1pbm9yIG51bWJlciBpbiBMaW51eCBjaXJjYSAyMDEwICovCisJZm9yIChpID0gMDsgcmMgJiYgaSA8IDEwNDg1NzY7IGkrKykgeworCQlzcHJpbnRmKGRldiwgTE9PUF9GT1JNQVQsIGkpOworCisJCUlGX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUoZXJybm8gPSAwOykKKwkJaWYgKHN0YXQodHJ5LCAmc3RhdGJ1ZikgIT0gMCB8fCAhU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpKSB7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUKKwkJCSAmJiBlcnJubyA9PSBFTk9FTlQKKwkJCSAmJiB0cnkgPT0gZGV2CisJCQkpIHsKKwkJCQkvKiBOb2RlIGRvZXNuJ3QgZXhpc3QsIHRyeSB0byBjcmVhdGUgaXQuICAqLworCQkJCWlmIChta25vZChkZXYsIFNfSUZCTEt8MDY0NCwgbWFrZWRldig3LCBpKSkgPT0gMCkKKwkJCQkJZ290byB0cnlfdG9fb3BlbjsKKwkJCX0KKwkJCS8qIFJhbiBvdXQgb2YgYmxvY2sgZGV2aWNlcywgcmV0dXJuIGZhaWx1cmUuICAqLworCQkJcmMgPSAtRU5PRU5UOworCQkJYnJlYWs7CisJCX0KKyB0cnlfdG9fb3BlbjoKKwkJLyogT3BlbiB0aGUgc3Vja2VyIGFuZCBjaGVjayBpdHMgbG9vcGluZXNzLiAgKi8KKwkJZGZkID0gb3Blbih0cnksIG1vZGUpOworCQlpZiAoZGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykgeworCQkJbW9kZSA9IE9fUkRPTkxZOworCQkJZGZkID0gb3Blbih0cnksIG1vZGUpOworCQl9CisJCWlmIChkZmQgPCAwKQorCQkJZ290byB0cnlfYWdhaW47CisKKwkJcmMgPSBpb2N0bChkZmQsIEJCX0xPT1BfR0VUX1NUQVRVUywgJmxvb3BpbmZvKTsKKworCQkvKiBJZiBkZXZpY2UgaXMgZnJlZSwgY2xhaW0gaXQuICAqLworCQlpZiAocmMgJiYgZXJybm8gPT0gRU5YSU8pIHsKKwkJCW1lbXNldCgmbG9vcGluZm8sIDAsIHNpemVvZihsb29waW5mbykpOworCQkJc2FmZV9zdHJuY3B5KChjaGFyICopbG9vcGluZm8ubG9fZmlsZV9uYW1lLCBmaWxlLCBMT19OQU1FX1NJWkUpOworCQkJbG9vcGluZm8ubG9fb2Zmc2V0ID0gb2Zmc2V0OworCQkJLyogQXNzb2NpYXRlIGZyZWUgbG9vcCBkZXZpY2Ugd2l0aCBmaWxlLiAgKi8KKwkJCWlmIChpb2N0bChkZmQsIExPT1BfU0VUX0ZELCBmZmQpID09IDApIHsKKwkJCQlpZiAoaW9jdGwoZGZkLCBCQl9MT09QX1NFVF9TVEFUVVMsICZsb29waW5mbykgPT0gMCkKKwkJCQkJcmMgPSAwOworCQkJCWVsc2UKKwkJCQkJaW9jdGwoZGZkLCBMT09QX0NMUl9GRCwgMCk7CisJCQl9CisKKwkJLyogSWYgdGhpcyBibG9jayBkZXZpY2UgYWxyZWFkeSBzZXQgdXAgcmlnaHQsIHJlLXVzZSBpdC4KKwkJICAgKFllcyB0aGlzIGlzIHJhY3ksIGJ1dCBhc3NvY2lhdGluZyB0d28gbG9vcCBkZXZpY2VzIHdpdGggdGhlIHNhbWUKKwkJICAgZmlsZSBpc24ndCBwcmV0dHkgZWl0aGVyLiAgSW4gZ2VuZXJhbCwgbW91bnRpbmcgdGhlIHNhbWUgZmlsZSB0d2ljZQorCQkgICB3aXRob3V0IHVzaW5nIGxvc2V0dXAgbWFudWFsbHkgaXMgcHJvYmxlbWF0aWMuKQorCQkgKi8KKwkJfSBlbHNlCisJCWlmIChzdHJjbXAoZmlsZSwgKGNoYXIgKilsb29waW5mby5sb19maWxlX25hbWUpICE9IDAKKwkJIHx8IG9mZnNldCAhPSBsb29waW5mby5sb19vZmZzZXQKKwkJKSB7CisJCQlyYyA9IC0xOworCQl9CisJCWNsb3NlKGRmZCk7CisgdHJ5X2FnYWluOgorCQlpZiAoKmRldmljZSkgYnJlYWs7CisJfQorCWNsb3NlKGZmZCk7CisJaWYgKHJjID09IDApIHsKKwkJaWYgKCEqZGV2aWNlKQorCQkJKmRldmljZSA9IHhzdHJkdXAoZGV2KTsKKwkJcmV0dXJuIChtb2RlID09IE9fUkRPTkxZKTsgLyogMTpybywgMDpydyAqLworCX0KKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9tYWtlX2RpcmVjdG9yeS5jIGIvbGliYmIvbWFrZV9kaXJlY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjMwM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbWFrZV9kaXJlY3RvcnkuYwpAQCAtMCwwICsxLDEyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGFyc2VfbW9kZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogTWFyIDUsIDIwMDMgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gd29yayBmdW5jdGlvbiBmb3IgdGhlICdta2RpcicgYXBwbGV0LiAgQXMgc3VjaCwgaXQKKyAqIHN0cml2ZXMgdG8gYmUgU1VTdjMgY29tcGxpYW50IGluIGl0J3MgYmVoYXZpb3VyIHdoZW4gcmVjdXJzaXZlbHkKKyAqIG1ha2luZyBtaXNzaW5nIHBhcmVudCBkaXJzLCBhbmQgaW4gaXQncyBtb2RlIHNldHRpbmcgb2YgdGhlIGZpbmFsCisgKiBkaXJlY3RvcnkgJ3BhdGgnLgorICoKKyAqIFRvIHJlY3Vyc2l2ZWx5IGJ1aWxkIGFsbCBtaXNzaW5nIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcywgbWFrZQorICogc3VyZSB0aGF0IChmbGFncyAmIEZJTEVVVElMU19SRUNVUikgaXMgbm9uLXplcm8uICBOZXdseSBjcmVhdGVkCisgKiBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgd2lsbCBoYXZlIGF0IGxlYXN0IHUrd3ggcGVybXMuCisgKgorICogVG8gc2V0IHNwZWNpZmljIHBlcm1pc3Npb25zIG9uICdwYXRoJywgcGFzcyB0aGUgYXBwcm9wcmlhdGUgJ21vZGUnCisgKiB2YWwuICBPdGhlcndpc2UsIHBhc3MgLTEgdG8gZ2V0IGRlZmF1bHQgcGVybWlzc2lvbnMuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIE5PRk9SSyBhcHBsZXRzLiBJdCBtdXN0IG5vdCBhbGxvY2F0ZSBhbnl0aGluZyAqLworCitpbnQgRkFTVF9GVU5DIGJiX21ha2VfZGlyZWN0b3J5KGNoYXIgKnBhdGgsIGxvbmcgbW9kZSwgaW50IGZsYWdzKQoreworCW1vZGVfdCBjdXJfbWFzazsKKwltb2RlX3Qgb3JnX21hc2s7CisJY29uc3QgY2hhciAqZmFpbF9tc2c7CisJY2hhciAqczsKKwljaGFyIGM7CisJc3RydWN0IHN0YXQgc3Q7CisKKwkvKiBIYXBwZW5zIG9uIGJiX21ha2VfZGlyZWN0b3J5KGRpcm5hbWUoIm5vX3NsYXNoZXMiKSwuLi4pICovCisJaWYgKExPTkVfQ0hBUihwYXRoLCAnLicpKQorCQlyZXR1cm4gMDsKKworCW9yZ19tYXNrID0gY3VyX21hc2sgPSAobW9kZV90KS0xTDsKKwlzID0gcGF0aDsKKwl3aGlsZSAoMSkgeworCQljID0gJ1wwJzsKKworCQlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpIHsgIC8qIEdldCB0aGUgcGFyZW50ICovCisJCQkvKiBCeXBhc3MgbGVhZGluZyBub24tJy8ncyBhbmQgdGhlbiBzdWJzZXF1ZW50ICcvJ3MgKi8KKwkJCXdoaWxlICgqcykgeworCQkJCWlmICgqcyA9PSAnLycpIHsKKwkJCQkJZG8geworCQkJCQkJKytzOworCQkJCQl9IHdoaWxlICgqcyA9PSAnLycpOworCQkJCQljID0gKnM7IC8qIFNhdmUgdGhlIGN1cnJlbnQgY2hhciAqLworCQkJCQkqcyA9ICdcMCc7IC8qIGFuZCByZXBsYWNlIGl0IHdpdGggbnVsICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkrK3M7CisJCQl9CisJCX0KKworCQlpZiAoYyAhPSAnXDAnKSB7CisJCQkvKiBJbnRlcm1lZGlhdGUgZGlyczogbXVzdCBoYXZlIHd4IGZvciB1c2VyICovCisJCQlpZiAoY3VyX21hc2sgPT0gKG1vZGVfdCktMUwpIHsgLyogd2Fzbid0IGRvbmUgeWV0PyAqLworCQkJCW1vZGVfdCBuZXdfbWFzazsKKwkJCQlvcmdfbWFzayA9IHVtYXNrKDApOworCQkJCWN1cl9tYXNrID0gMDsKKwkJCQkvKiBDbGVhciB1PXd4IGluIHVtYXNrIC0gdGhpcyBlbnN1cmVzCisJCQkJICogdGhleSB3b24ndCBiZSBjbGVhcmVkIG9uIG1rZGlyICovCisJCQkJbmV3X21hc2sgPSAob3JnX21hc2sgJiB+KG1vZGVfdCkwMzAwKTsKKwkJCQkvL2JiX2Vycm9yX21zZygib3JnX21hc2s6JW8gY3VyX21hc2s6JW8iLCBvcmdfbWFzaywgbmV3X21hc2spOworCQkJCWlmIChuZXdfbWFzayAhPSBjdXJfbWFzaykgeworCQkJCQljdXJfbWFzayA9IG5ld19tYXNrOworCQkJCQl1bWFzayhuZXdfbWFzayk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogTGFzdCBjb21wb25lbnQ6IHVzZXMgb3JpZ2luYWwgdW1hc2sgKi8KKwkJCS8vYmJfZXJyb3JfbXNnKCIxIG9yZ19tYXNrOiVvIiwgb3JnX21hc2spOworCQkJaWYgKG9yZ19tYXNrICE9IGN1cl9tYXNrKSB7CisJCQkJY3VyX21hc2sgPSBvcmdfbWFzazsKKwkJCQl1bWFzayhvcmdfbWFzayk7CisJCQl9CisJCX0KKworCQlpZiAobWtkaXIocGF0aCwgMDc3NykgPCAwKSB7CisJCQkvKiBJZiB3ZSBmYWlsZWQgZm9yIGFueSBvdGhlciByZWFzb24gdGhhbiB0aGUgZGlyZWN0b3J5CisJCQkgKiBhbHJlYWR5IGV4aXN0cywgb3V0cHV0IGEgZGlhZ25vc3RpYyBhbmQgcmV0dXJuIC0xICovCisJCQlpZiAoKGVycm5vICE9IEVFWElTVCAmJiBlcnJubyAhPSBFSVNESVIpCisJCQkgfHwgIShmbGFncyAmIEZJTEVVVElMU19SRUNVUikKKwkJCSB8fCAoKHN0YXQocGF0aCwgJnN0KSA8IDApIHx8ICFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJKSB7CisJCQkJZmFpbF9tc2cgPSAiY3JlYXRlIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFNpbmNlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLCBkb24ndCBhdHRlbXB0IHRvIGNoYW5nZQorCQkJICogcGVybWlzc2lvbnMgaWYgaXQgd2FzIHRoZSBmdWxsIHRhcmdldC4gIE5vdGUgdGhhdAorCQkJICogdGhpcyBpcyBub3QgYW4gZXJyb3IgY29uZGl0aW9uLiAqLworCQkJaWYgKCFjKSB7CisJCQkJZ290byByZXQwOworCQkJfQorCQl9CisKKwkJaWYgKCFjKSB7CisJCQkvKiBEb25lLiAgSWYgbmVjZXNzYXJ5LCB1cGRhdGUgcGVybXMgb24gdGhlIG5ld2x5CisJCQkgKiBjcmVhdGVkIGRpcmVjdG9yeS4gIEZhaWx1cmUgdG8gdXBkYXRlIGhlcmUgX2lzXworCQkJICogYW4gZXJyb3IuICovCisJCQlpZiAoKG1vZGUgIT0gLTEpICYmIChjaG1vZChwYXRoLCBtb2RlKSA8IDApKSB7CisJCQkJZmFpbF9tc2cgPSAic2V0IHBlcm1pc3Npb25zIG9mIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gcmV0MDsKKwkJfQorCisJCS8qIFJlbW92ZSBhbnkgaW5zZXJ0ZWQgbnVsIGZyb20gdGhlIHBhdGggKHJlY3Vyc2l2ZSBtb2RlKSAqLworCQkqcyA9IGM7CisJfSAvKiB3aGlsZSAoMSkgKi8KKworCWJiX3BlcnJvcl9tc2coImNhbid0ICVzIGRpcmVjdG9yeSAnJXMnIiwgZmFpbF9tc2csIHBhdGgpOworCWZsYWdzID0gLTE7CisJZ290byByZXQ7CisgcmV0MDoKKwlmbGFncyA9IDA7CisgcmV0OgorCS8vYmJfZXJyb3JfbXNnKCIyIG9yZ19tYXNrOiVvIiwgb3JnX21hc2spOworCWlmIChvcmdfbWFzayAhPSBjdXJfbWFzaykKKwkJdW1hc2sob3JnX21hc2spOworCXJldHVybiBmbGFnczsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL21ha2VkZXYuYyBiL2xpYmJiL21ha2VkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM0MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbWFrZWRldi5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogV2UgZG8gbm90IGluY2x1ZGUgbGliYmIuaCAtICNkZWZpbmUgbWFrZWRldigpIGlzIHRoZXJlISAqLworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qIERpZmZlcmVudCBVbml4ZXMgd2FudCBkaWZmZXJlbnQgaGVhZGVycyBmb3IgbWFrZWRldiAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAorIHx8IGRlZmluZWQoX19BUFBMRV9fKQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZgorCisjaWZkZWYgX19HTElCQ19fCisvKiBBdCBsZWFzdCBnbGliYyBoYXMgaG9ycmVuZG91c2x5IGxhcmdlIGlubGluZSBmb3IgdGhpcywgc28gd3JhcCBpdC4gKi8KKy8qIHVjbGliYyBwZW9wbGUgcGxlYXNlIGNoZWNrIC0gZG8gd2UgbmVlZCAiJiYgIV9fVUNMSUJDX18iIGFib3ZlPyAqLworCisvKiBTdXBwcmVzcyBnY2MgIm5vIHByZXZpb3VzIHByb3RvdHlwZSIgd2FybmluZyAqLwordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9tYWtlZGV2KHVuc2lnbmVkIG1ham9yLCB1bnNpZ25lZCBtaW5vcik7Cit1bnNpZ25lZCBsb25nIGxvbmcgRkFTVF9GVU5DIGJiX21ha2VkZXYodW5zaWduZWQgbWFqb3IsIHVuc2lnbmVkIG1pbm9yKQoreworCXJldHVybiBtYWtlZGV2KG1ham9yLCBtaW5vcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL21hdGNoX2ZzdHlwZS5jIGIvbGliYmIvbWF0Y2hfZnN0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjM2Q3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL21hdGNoX2ZzdHlwZS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1hdGNoIGZzdHlwZXMgZm9yIHVzZSBpbiBtb3VudCB1bm1vdW50CisgKiBXZSBhY2NlcHQgbm90bXBmcyxuZnMgYnV0IG5vdCBub3RtcGZzLG5vbmZzCisgKiBUaGlzIGFsbG93cyB1cyB0byBtYXRjaCBmc3R5cGVzIHRoYXQgc3RhcnQgd2l0aCBubyBsaWtlIHNvCisgKiAgIG1vdW50IC1hdCAsbm9kZHkKKyAqCisgKiBSZXR1cm5zIDEgZm9yIGEgbWF0Y2gsIG90aGVyd2lzZSAwCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIEhBVkVfTU5URU5UX0gKKworaW50IEZBU1RfRlVOQyBtYXRjaF9mc3R5cGUoY29uc3Qgc3RydWN0IG1udGVudCAqbXQsIGNvbnN0IGNoYXIgKnRfZnN0eXBlKQoreworCWludCBtYXRjaCA9IDE7CisJaW50IGxlbjsKKworCWlmICghdF9mc3R5cGUpCisJCXJldHVybiBtYXRjaDsKKworCWlmICh0X2ZzdHlwZVswXSA9PSAnbicgJiYgdF9mc3R5cGVbMV0gPT0gJ28nKSB7CisJCW1hdGNoLS07CisJCXRfZnN0eXBlICs9IDI7CisJfQorCisJbGVuID0gc3RybGVuKG10LT5tbnRfdHlwZSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHN0cm5jbXAobXQtPm1udF90eXBlLCB0X2ZzdHlwZSwgbGVuKSA9PSAwCisJCSAmJiAodF9mc3R5cGVbbGVuXSA9PSAnXDAnIHx8IHRfZnN0eXBlW2xlbl0gPT0gJywnKQorCQkpIHsKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCQl0X2ZzdHlwZSA9IHN0cmNocih0X2ZzdHlwZSwgJywnKTsKKwkJaWYgKCF0X2ZzdHlwZSkKKwkJCWJyZWFrOworCQl0X2ZzdHlwZSsrOworCX0KKworCXJldHVybiAhbWF0Y2g7Cit9CisKKyNlbmRpZiAvKiBIQVZFX01OVEVOVF9IICovCmRpZmYgLS1naXQgYS9saWJiYi9tZXNzYWdlcy5jIGIvbGliYmIvbWVzc2FnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQ4MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbWVzc2FnZXMuYwpAQCAtMCwwICsxLDY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogYWxsb3cgZGVmYXVsdCBzeXN0ZW0gUEFUSCB0byBiZSBleHRlbmRlZCB2aWEgQ0ZMQUdTICovCisjaWZuZGVmIEJCX0FERElUSU9OQUxfUEFUSAorI2RlZmluZSBCQl9BRERJVElPTkFMX1BBVEggIiIKKyNlbmRpZgorCisvKiBhbGxvdyB2ZXJzaW9uIHRvIGJlIGV4dGVuZGVkLCB2aWEgQ0ZMQUdTICovCisjaWZuZGVmIEJCX0VYVFJBX1ZFUlNJT04KKyNkZWZpbmUgQkJfRVhUUkFfVkVSU0lPTiBCQl9CVAorI2VuZGlmCisKKyNkZWZpbmUgQkFOTkVSICJCdXN5Qm94IHYiIEJCX1ZFUiAiICgiIEJCX0VYVFJBX1ZFUlNJT04gIikiCisKK2NvbnN0IGNoYXIgYmJfYmFubmVyW10gQUxJR04xID0gQkFOTkVSOworCisKK2NvbnN0IGNoYXIgYmJfbXNnX21lbW9yeV9leGhhdXN0ZWRbXSBBTElHTjEgPSAib3V0IG9mIG1lbW9yeSI7Citjb25zdCBjaGFyIGJiX21zZ19pbnZhbGlkX2RhdGVbXSBBTElHTjEgPSAiaW52YWxpZCBkYXRlICclcyciOworY29uc3QgY2hhciBiYl9tc2dfdW5rbm93bltdIEFMSUdOMSA9ICIodW5rbm93bikiOworY29uc3QgY2hhciBiYl9tc2dfY2FuX25vdF9jcmVhdGVfcmF3X3NvY2tldFtdIEFMSUdOMSA9ICJjYW4ndCBjcmVhdGUgcmF3IHNvY2tldCI7Citjb25zdCBjaGFyIGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3RbXSBBTElHTjEgPSAicGVybWlzc2lvbiBkZW5pZWQgKGFyZSB5b3Ugcm9vdD8pIjsKK2NvbnN0IGNoYXIgYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3RbXSBBTElHTjEgPSAieW91IG11c3QgYmUgcm9vdCI7Citjb25zdCBjaGFyIGJiX21zZ19yZXF1aXJlc19hcmdbXSBBTElHTjEgPSAiJXMgcmVxdWlyZXMgYW4gYXJndW1lbnQiOworY29uc3QgY2hhciBiYl9tc2dfaW52YWxpZF9hcmdbXSBBTElHTjEgPSAiaW52YWxpZCBhcmd1bWVudCAnJXMnIHRvICclcyciOworY29uc3QgY2hhciBiYl9tc2dfc3RhbmRhcmRfaW5wdXRbXSBBTElHTjEgPSAic3RhbmRhcmQgaW5wdXQiOworY29uc3QgY2hhciBiYl9tc2dfc3RhbmRhcmRfb3V0cHV0W10gQUxJR04xID0gInN0YW5kYXJkIG91dHB1dCI7CisKK2NvbnN0IGNoYXIgYmJfaGV4ZGlnaXRzX3VwY2FzZVtdIEFMSUdOMSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworY29uc3QgY2hhciBiYl9idXN5Ym94X2V4ZWNfcGF0aFtdIEFMSUdOMSA9IENPTkZJR19CVVNZQk9YX0VYRUNfUEFUSDsKK2NvbnN0IGNoYXIgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbFtdIEFMSUdOMSA9IExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEw7CisvKiB1dGlsLWxpbnV4IG1hbnBhZ2Ugc2F5cyAvc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiwKKyAqIGJ1dCBJIHdhbnQgdG8gc2F2ZSBhIGZldyBieXRlcyBoZXJlLiBDaGVjayBsaWJiYi5oIGJlZm9yZSBjaGFuZ2luZyEgKi8KK2NvbnN0IGNoYXIgYmJfUEFUSF9yb290X3BhdGhbXSBBTElHTjEgPQorCSJQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluIiBCQl9BRERJVElPTkFMX1BBVEg7CisKKworY29uc3QgaW50IGNvbnN0X2ludF8xID0gMTsKKy8qIGV4cGxpY2l0bHkgPSAwLCBvdGhlcndpc2UgZ2NjIG1heSBtYWtlIGl0IGEgY29tbW9uIHZhcmlhYmxlCisgKiBhbmQgaXQgd2lsbCBlbmQgdXAgaW4gYnNzICovCitjb25zdCBpbnQgY29uc3RfaW50XzAgPSAwOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV1RNUAorLyogVGhpcyBpcyB1c3VhbGx5IHNvbWV0aGluZyBsaWtlICIvdmFyL2FkbS93dG1wIiBvciAiL3Zhci9sb2cvd3RtcCIgKi8KK2NvbnN0IGNoYXIgYmJfcGF0aF93dG1wX2ZpbGVbXSBBTElHTjEgPQorIyBpZiBkZWZpbmVkIF9QQVRIX1dUTVAKKwlfUEFUSF9XVE1QOworIyBlbGlmIGRlZmluZWQgV1RNUF9GSUxFCisJV1RNUF9GSUxFOworIyBlbHNlCisjICBlcnJvciB1bmtub3duIHBhdGggdG8gd3RtcCBmaWxlCisjIGVuZGlmCisjZW5kaWYKKworLyogV2UgdXNlIGl0IGZvciAiZ2xvYmFsIiBkYXRhIHZpYSAqKHN0cnVjdCBnbG9iYWwqKSZiYl9jb21tb25fYnVmc2l6MS4KKyAqIFNpbmNlIGdjYyBpbnNpc3RzIG9uIGFsaWduaW5nIHN0cnVjdCBnbG9iYWwncyBtZW1iZXJzLCBpdCB3b3VsZCBiZSBhIHBpdHkKKyAqIChhbmQgYW4gYWxpZ25tZW50IGZhdWx0IG9uIHNvbWUgQ1BVcykgdG8gbWVzcyBpdCB1cC4gKi8KK2NoYXIgYmJfY29tbW9uX2J1ZnNpejFbQ09NTU9OX0JVRlNJWkVdIEFMSUdORUQoc2l6ZW9mKGxvbmcgbG9uZykpOwpkaWZmIC0tZ2l0IGEvbGliYmIvbW9kZV9zdHJpbmcuYyBiL2xpYmJiL21vZGVfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhZmU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL21vZGVfc3RyaW5nLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1vZGVfc3RyaW5nIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBdWcgMTMsIDIwMDMKKyAqIEZpeCBhIGJ1ZyByZXBvcnRlZCBieSBqdW5raW9AY294Lm5ldCBpbnZvbHZpbmcgdGhlIG1vZGVfY2hhcnMgaW5kZXguCisgKi8KKworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiAoIFNfSVNVSUQgIT0gMDQwMDAgKSB8fCAoIFNfSVNHSUQgIT0gMDIwMDAgKSB8fCAoIFNfSVNWVFggIT0gMDEwMDAgKSBcCisgfHwgKCBTX0lSVVNSICE9IDAwNDAwICkgfHwgKCBTX0lXVVNSICE9IDAwMjAwICkgfHwgKCBTX0lYVVNSICE9IDAwMTAwICkgXAorIHx8ICggU19JUkdSUCAhPSAwMDA0MCApIHx8ICggU19JV0dSUCAhPSAwMDAyMCApIHx8ICggU19JWEdSUCAhPSAwMDAxMCApIFwKKyB8fCAoIFNfSVJPVEggIT0gMDAwMDQgKSB8fCAoIFNfSVdPVEggIT0gMDAwMDIgKSB8fCAoIFNfSVhPVEggIT0gMDAwMDEgKQorI2Vycm9yIHBlcm1pc3Npb24gYml0ZmxhZyB2YWx1ZSBhc3N1bXB0aW9uKHMpIHZpb2xhdGVkIQorI2VuZGlmCisKKyNpZiAoIFNfSUZTT0NLIT0gMDE0MDAwMCApIHx8ICggU19JRkxOSyAhPSAwMTIwMDAwICkgXAorIHx8ICggU19JRlJFRyAhPSAwMTAwMDAwICkgfHwgKCBTX0lGQkxLICE9IDAwNjAwMDAgKSBcCisgfHwgKCBTX0lGRElSICE9IDAwNDAwMDAgKSB8fCAoIFNfSUZDSFIgIT0gMDAyMDAwMCApIFwKKyB8fCAoIFNfSUZJRk8gIT0gMDAxMDAwMCApCisjd2FybmluZyBtb2RlIHR5cGUgYml0ZmxhZyB2YWx1ZSBhc3N1bXB0aW9uKHMpIHZpb2xhdGVkISBmYWxsaW5nIGJhY2sgdG8gbGFyZ2VyIHZlcnNpb24KKworI2lmIChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8gfCBTX0lTVUlEIHwgU19JU0dJRCB8IFNfSVNWVFgpID09IDA3Nzc3CisjdW5kZWYgbW9kZV90CisjZGVmaW5lIG1vZGVfdCB1bnNpZ25lZCBzaG9ydAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBtb2RlX3QgbW9kZV9mbGFnc1tdID0geworCVNfSVJVU1IsIFNfSVdVU1IsIFNfSVhVU1IsIFNfSVNVSUQsCisJU19JUkdSUCwgU19JV0dSUCwgU19JWEdSUCwgU19JU0dJRCwKKwlTX0lST1RILCBTX0lXT1RILCBTX0lYT1RILCBTX0lTVlRYCit9OworCisvKiBUaGUgc3RhdGljIGNvbnN0IGNoYXIgYXJyYXlzIGJlbG93IGFyZSBkdXBsaWNhdGVkIGZvciB0aGUgdHdvIGNhc2VzCisgKiBiZWNhdXNlIG1vdmluZyB0aGVtIGFoZWFkIG9mIHRoZSBtb2RlX2ZsYWdzIGRlY2xhcmF0aW9uIGNhdXNlIGEgdGV4dAorICogc2l6ZSBpbmNyZWFzZSB3aXRoIHRoZSBnY2MgdmVyc2lvbiBJJ20gdXNpbmcuICovCisKKy8qIFRoZSBwcmV2aW91cyB2ZXJzaW9uIHVzZWQgIjBwY0NkP2JCLT9sP3M/Pz8iLiAgSG93ZXZlciwgdGhlICcwJywgJ0MnLAorICogYW5kICdCJyB0eXBlcyBkb24ndCBhcHBlYXIgdG8gYmUgYXZhaWxhYmxlIG9uIGxpbnV4LiAgU28gSSByZW1vdmVkIHRoZW0uICovCitzdGF0aWMgY29uc3QgY2hhciB0eXBlX2NoYXJzWzE2XSBBTElHTjEgPSAiP3BjP2Q/Yj8tP2w/cz8/PyI7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogMDEyMzQ1Njc4OWFiY2RlZiAqLworc3RhdGljIGNvbnN0IGNoYXIgbW9kZV9jaGFyc1s3XSBBTElHTjEgPSAicnd4U1RzdCI7CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBiYl9tb2RlX3N0cmluZyhtb2RlX3QgbW9kZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTJdOworCWNoYXIgKnAgPSBidWY7CisKKwlpbnQgaSwgaiwgazsKKworCSpwID0gdHlwZV9jaGFyc1sgKG1vZGUgPj4gMTIpICYgMHhmIF07CisJaSA9IDA7CisJZG8geworCQlqID0gayA9IDA7CisJCWRvIHsKKwkJCSorK3AgPSAnLSc7CisJCQlpZiAobW9kZSAmIG1vZGVfZmxhZ3NbaStqXSkgeworCQkJCSpwID0gbW9kZV9jaGFyc1tqXTsKKwkJCQlrID0gajsKKwkJCX0KKwkJfSB3aGlsZSAoKytqIDwgMyk7CisJCWlmIChtb2RlICYgbW9kZV9mbGFnc1tpK2pdKSB7CisJCQkqcCA9IG1vZGVfY2hhcnNbMyArIChrICYgMikgKyAoKGkmOCkgPj4gMyldOworCQl9CisJCWkgKz0gNDsKKwl9IHdoaWxlIChpIDwgMTIpOworCisJLyogTm90ZTogV2UgZG9uJ3QgYm90aGVyIHdpdGggbnVsIHRlcm1pbmF0aW9uIGJlY2F1c2UgYnNzIGluaXRpYWxpemF0aW9uCisJICogc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0aGF0IGZvciB1cy4gIElmIHRoZSB1c2VyIHNjcmliYmxlZCBpbiBidWYKKwkgKiBtZW1vcnksIHRoZXkgZGVzZXJ2ZSB3aGF0ZXZlciBoYXBwZW5zLiAgQnV0IHdlJ2xsIGF0IGxlYXN0IGFzc2VydC4gKi8KKwlhc3NlcnQoYnVmWzEwXSA9PSAwKTsKKworCXJldHVybiBidWY7Cit9CisKKyNlbHNlCisKKy8qIFRoZSBwcmV2aW91cyB2ZXJzaW9uIHVzZWQgIjBwY0NkP2JCLT9sP3M/Pz8iLiAgSG93ZXZlciwgdGhlICcwJywgJ0MnLAorICogYW5kICdCJyB0eXBlcyBkb24ndCBhcHBlYXIgdG8gYmUgYXZhaWxhYmxlIG9uIGxpbnV4LiAgU28gSSByZW1vdmVkIHRoZW0uICovCitzdGF0aWMgY29uc3QgY2hhciB0eXBlX2NoYXJzWzE2XSA9ICI/cGM/ZD9iPy0/bD9zPz8/IjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIDAxMjM0NTY3ODlhYmNkZWYgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG1vZGVfY2hhcnNbN10gPSAicnd4U1RzdCI7CisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBiYl9tb2RlX3N0cmluZyhtb2RlX3QgbW9kZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTJdOworCWNoYXIgKnAgPSBidWY7CisKKwlpbnQgaSwgaiwgaywgbTsKKworCSpwID0gdHlwZV9jaGFyc1sgKG1vZGUgPj4gMTIpICYgMHhmIF07CisJaSA9IDA7CisJbSA9IDA0MDA7CisJZG8geworCQlqID0gayA9IDA7CisJCWRvIHsKKwkJCSorK3AgPSAnLSc7CisJCQlpZiAobW9kZSAmIG0pIHsKKwkJCQkqcCA9IG1vZGVfY2hhcnNbal07CisJCQkJayA9IGo7CisJCQl9CisJCQltID4+PSAxOworCQl9IHdoaWxlICgrK2ogPCAzKTsKKwkJKytpOworCQlpZiAobW9kZSAmICgwMTAwMDAgPj4gaSkpIHsKKwkJCSpwID0gbW9kZV9jaGFyc1szICsgKGsgJiAyKSArIChpID09IDMpXTsKKwkJfQorCX0gd2hpbGUgKGkgPCAzKTsKKworCS8qIE5vdGU6IFdlIGRvbid0IGJvdGhlciB3aXRoIG51bCB0ZXJtaW5hdGlvbiBiZWNhdXNlIGJzcyBpbml0aWFsaXphdGlvbgorCSAqIHNob3VsZCBoYXZlIHRha2VuIGNhcmUgb2YgdGhhdCBmb3IgdXMuICBJZiB0aGUgdXNlciBzY3JpYmJsZWQgaW4gYnVmCisJICogbWVtb3J5LCB0aGV5IGRlc2VydmUgd2hhdGV2ZXIgaGFwcGVucy4gIEJ1dCB3ZSdsbCBhdCBsZWFzdCBhc3NlcnQuICovCisJYXNzZXJ0KGJ1ZlsxMF0gPT0gMCk7CisKKwlyZXR1cm4gYnVmOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL210YWIuYyBiL2xpYmJiL210YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJmZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbXRhYi5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQKK3ZvaWQgRkFTVF9GVU5DIGVyYXNlX210YWIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbW50ZW50ICplbnRyaWVzOworCWludCBpLCBjb3VudDsKKwlGSUxFICptb3VudFRhYmxlOworCXN0cnVjdCBtbnRlbnQgKm07CisKKwltb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAiciIpOworCS8qIEJ1bW1lci4gRmFsbCBiYWNrIG9uIHRyeWluZyB0aGUgL3Byb2MgZmlsZXN5c3RlbSAqLworCWlmICghbW91bnRUYWJsZSkgbW91bnRUYWJsZSA9IHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInIiKTsKKwlpZiAoIW1vdW50VGFibGUpIHsKKwkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7CisJCXJldHVybjsKKwl9CisKKwllbnRyaWVzID0gTlVMTDsKKwljb3VudCA9IDA7CisJd2hpbGUgKChtID0gZ2V0bW50ZW50KG1vdW50VGFibGUpKSAhPSAwKSB7CisJCWVudHJpZXMgPSB4cmVhbGxvY192ZWN0b3IoZW50cmllcywgMywgY291bnQpOworCQllbnRyaWVzW2NvdW50XS5tbnRfZnNuYW1lID0geHN0cmR1cChtLT5tbnRfZnNuYW1lKTsKKwkJZW50cmllc1tjb3VudF0ubW50X2RpciA9IHhzdHJkdXAobS0+bW50X2Rpcik7CisJCWVudHJpZXNbY291bnRdLm1udF90eXBlID0geHN0cmR1cChtLT5tbnRfdHlwZSk7CisJCWVudHJpZXNbY291bnRdLm1udF9vcHRzID0geHN0cmR1cChtLT5tbnRfb3B0cyk7CisJCWVudHJpZXNbY291bnRdLm1udF9mcmVxID0gbS0+bW50X2ZyZXE7CisJCWVudHJpZXNbY291bnRdLm1udF9wYXNzbm8gPSBtLT5tbnRfcGFzc25vOworCQljb3VudCsrOworCX0KKwllbmRtbnRlbnQobW91bnRUYWJsZSk7CisKKy8vVE9ETzogbWFrZSB1cGRhdGUgYXRvbWljCisJbW91bnRUYWJsZSA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInciKTsKKwlpZiAobW91bnRUYWJsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaWYgKHN0cmNtcChlbnRyaWVzW2ldLm1udF9mc25hbWUsIG5hbWUpICE9IDAKKwkJCSAmJiBzdHJjbXAoZW50cmllc1tpXS5tbnRfZGlyLCBuYW1lKSAhPSAwKQorCQkJCWFkZG1udGVudChtb3VudFRhYmxlLCAmZW50cmllc1tpXSk7CisJCX0KKwkJZW5kbW50ZW50KG1vdW50VGFibGUpOworCX0gZWxzZSBpZiAoZXJybm8gIT0gRVJPRlMpCisJCWJiX3BlcnJvcl9tc2coYmJfcGF0aF9tdGFiX2ZpbGUpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9vYnNjdXJlLmMgYi9saWJiYi9vYnNjdXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYzFmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL29ic2N1cmUuYwpAQCAtMCwwICsxLDE4NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB3ZWFrIHBhc3N3b3JkIGNoZWNrZXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoJQSBnb29kIHBhc3N3b3JkOgorCTEpCXNob3VsZCBjb250YWluIGF0IGxlYXN0IHNpeCBjaGFyYWN0ZXJzIChtYW4gcGFzc3dkKTsKKwkyKQllbXB0eSBwYXNzd29yZHMgYXJlIG5vdCBwZXJtaXR0ZWQ7CisJMykJc2hvdWxkIGNvbnRhaW4gYSBtaXggb2YgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YgY2hhcmFjdGVycworCQl1cHBlciBjYXNlIGxldHRlcnMsCisJCWxvd2VyIGNhc2UgbGV0dGVycywKKwkJbnVtYmVycywKKwkJc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgIUAjJCVeJiosOyIuCisJVGhpcyBwYXNzd29yZCB0eXBlcyBzaG91bGQgbm90ICBiZSBwZXJtaXR0ZWQ6CisJYSkJcHVyZSBudW1iZXJzOiBiaXJ0aGRhdGVzLCBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLCBsaWNlbnNlIHBsYXRlLCBwaG9uZSBudW1iZXJzOworCWIpCXdvcmRzIGFuZCBhbGwgbGV0dGVycyBvbmx5IHBhc3N3b3JkcyAodXBwZXJjYXNlLCBsb3dlcmNhc2Ugb3IgbWl4ZWQpCisJCWFzIHBhbGluZHJvbWVzLCBjb25zZWN1dGl2ZSBvciByZXBldGl0aXZlIGxldHRlcnMKKwkJb3IgYWRqYWNlbnQgbGV0dGVycyBvbiB5b3VyIGtleWJvYXJkOworCWMpCXVzZXJuYW1lLCByZWFsIG5hbWUsIGNvbXBhbnkgbmFtZSBvciAoZS1tYWlsPykgYWRkcmVzcworCQlpbiBhbnkgZm9ybSAoYXMtaXMsIHJldmVyc2VkLCBjYXBpdGFsaXplZCwgZG91YmxlZCwgZXRjLikuCisJCSh3ZSBjYW4gY2hlY2sgb25seSBhZ2FpbnN0IHVzZXJuYW1lLCBnZWNvcyBhbmQgaG9zdG5hbWUpCisJZCkJY29tbW9uIGFuZCBvYnZpb3VzIGxldHRlci1udW1iZXIgcmVwbGFjZW1lbnRzCisJCShlLmcuIHJlcGxhY2UgdGhlIGxldHRlciBPIHdpdGggbnVtYmVyIDApCisJCXN1Y2ggYXMgIk0xY3IwJDBmdCIgb3IgIlBAc3N3MHJkIiAoQ0FWRUFUOiB3ZSBjYW5ub3QgY2hlY2sgZm9yIHRoZW0KKwkJd2l0aG91dCB0aGUgdXNlIG9mIGEgZGljdGlvbmFyeSkuCisKKwlGb3IgZWFjaCBtaXNzaW5nIHR5cGUgb2YgY2hhcmFjdGVycyBhbiBpbmNyZWFzZSBvZiBwYXNzd29yZCBsZW5ndGggaXMKKwlyZXF1ZXN0ZWQuCisKKwlJZiB1c2VyIGlzIHJvb3Qgd2Ugd2FybiBvbmx5LgorCisJQ0FWRUFUOiBzb21lIG9sZGVyIHZlcnNpb25zIG9mIGNyeXB0KCkgdHJ1bmNhdGVzIHBhc3N3b3JkcyB0byA4IGNoYXJzLAorCXNvIHRoYXQgYWFhYWFhYWExUSQgaXMgZXF1YWwgdG8gYWFhYWFhYWEgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGZvb2wKKwlzb21lIG9mIG91ciBjaGVja3MuIFdlIGRvbid0IHRlc3QgZm9yIHRoaXMgc3BlY2lhbCBjYXNlIGFzIG5ld2VyIHZlcnNpb25zCisJb2YgY3J5cHQgZG8gbm90IHRydW5jYXRlIHBhc3N3b3Jkcy4KKyovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgaW50IHN0cmluZ19jaGVja2VyX2hlbHBlcihjb25zdCBjaGFyICpwMSwgY29uc3QgY2hhciAqcDIpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCitzdGF0aWMgaW50IHN0cmluZ19jaGVja2VyX2hlbHBlcihjb25zdCBjaGFyICpwMSwgY29uc3QgY2hhciAqcDIpCit7CisJLyogYXMgc3ViLXN0cmluZyAqLworCWlmIChzdHJjYXNlc3RyKHAyLCBwMSkgIT0gTlVMTAorCS8qIGludmVydCBpbiBjYXNlIGhheXN0YWNrIGlzIHNob3J0ZXIgdGhhbiBuZWVkbGUgKi8KKwkgfHwgc3RyY2FzZXN0cihwMSwgcDIpICE9IE5VTEwKKwkvKiBhcy1pcyBvciBjYXBpdGFsaXplZCAqLworCS8qIHx8IHN0cmNhc2VjbXAocDEsIHAyKSA9PSAwIC0gMXN0IHN0cmNhc2VzdHIgc2hvdWxkIGNhdGNoIHRoaXMgdG9vICovCisJKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHJpbmdfY2hlY2tlcihjb25zdCBjaGFyICpwMSwgY29uc3QgY2hhciAqcDIpCit7CisJaW50IHNpemUsIGk7CisJLyogY2hlY2sgc3RyaW5nICovCisJaW50IHJldCA9IHN0cmluZ19jaGVja2VyX2hlbHBlcihwMSwgcDIpOworCS8qIG1ha2Ugb3VyIG93biBjb3B5ICovCisJY2hhciAqcCA9IHhzdHJkdXAocDEpOworCisJLyogcmV2ZXJzZSBzdHJpbmcgKi8KKwlpID0gc2l6ZSA9IHN0cmxlbihwMSk7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCSpwKysgPSBwMVtpXTsKKwl9CisJcCAtPSBzaXplOyAvKiByZXN0b3JlIHBvaW50ZXIgKi8KKworCS8qIGNoZWNrIHJldmVyc2VkIHN0cmluZyAqLworCXJldCB8PSBzdHJpbmdfY2hlY2tlcl9oZWxwZXIocCwgcDIpOworCisJLyogY2xlYW4gdXAgKi8KKwltZW1zZXQocCwgMCwgc2l6ZSk7CisJZnJlZShwKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQ0FURUdPUklFUyAgNAorCisjZGVmaW5lIExPV0VSQ0FTRSAgIDEKKyNkZWZpbmUgVVBQRVJDQVNFICAgMgorI2RlZmluZSBOVU1CRVJTICAgICA0CisjZGVmaW5lIFNQRUNJQUwgICAgIDgKKworI2RlZmluZSBMQVNUX0NBVCAgICA4CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYnNjdXJlX21zZyhjb25zdCBjaGFyICpvbGRfcCwgY29uc3QgY2hhciAqbmV3X3AsIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCXVuc2lnbmVkIGxlbmd0aDsKKwl1bnNpZ25lZCBzaXplOworCXVuc2lnbmVkIG1peGVkOworCXVuc2lnbmVkIGM7CisJdW5zaWduZWQgaTsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKmhvc3RuYW1lOworCisJLyogc2l6ZSAqLworCWlmICghbmV3X3AgfHwgKGxlbmd0aCA9IHN0cmxlbihuZXdfcCkpIDwgQ09ORklHX1BBU1NXT1JEX01JTkxFTikKKwkJcmV0dXJuICJ0b28gc2hvcnQiOworCisJLyogbm8gdXNlcm5hbWUgYXMtaXMsIGFzIHN1Yi1zdHJpbmcsIHJldmVyc2VkLCBjYXBpdGFsaXplZCwgZG91YmxlZCAqLworCWlmIChzdHJpbmdfY2hlY2tlcihuZXdfcCwgcHctPnB3X25hbWUpKSB7CisJCXJldHVybiAic2ltaWxhciB0byB1c2VybmFtZSI7CisJfQorI2lmbmRlZiBfX0JJT05JQ19fCisJLyogbm8gZ2Vjb3MgYXMtaXMsIGFzIHN1Yi1zdHJpbmcsIHJldmVyc2VkLCBjYXBpdGFsaXplZCwgZG91YmxlZCAqLworCWlmIChwdy0+cHdfZ2Vjb3NbMF0gJiYgc3RyaW5nX2NoZWNrZXIobmV3X3AsIHB3LT5wd19nZWNvcykpIHsKKwkJcmV0dXJuICJzaW1pbGFyIHRvIGdlY29zIjsKKwl9CisjZW5kaWYKKwkvKiBob3N0bmFtZSBhcy1pcywgYXMgc3ViLXN0cmluZywgcmV2ZXJzZWQsIGNhcGl0YWxpemVkLCBkb3VibGVkICovCisJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisJaSA9IHN0cmluZ19jaGVja2VyKG5ld19wLCBob3N0bmFtZSk7CisJZnJlZShob3N0bmFtZSk7CisJaWYgKGkpCisJCXJldHVybiAic2ltaWxhciB0byBob3N0bmFtZSI7CisKKwkvKiBTaG91bGQgLyBNdXN0IGNvbnRhaW4gYSBtaXggb2Y6ICovCisJbWl4ZWQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAoaXNsb3dlcihuZXdfcFtpXSkpIHsgICAgICAgIC8qIGEteiAqLworCQkJbWl4ZWQgfD0gTE9XRVJDQVNFOworCQl9IGVsc2UgaWYgKGlzdXBwZXIobmV3X3BbaV0pKSB7IC8qIEEtWiAqLworCQkJbWl4ZWQgfD0gVVBQRVJDQVNFOworCQl9IGVsc2UgaWYgKGlzZGlnaXQobmV3X3BbaV0pKSB7IC8qIDAtOSAqLworCQkJbWl4ZWQgfD0gTlVNQkVSUzsKKwkJfSBlbHNlICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNoYXJhY3RlcnMgKi8KKwkJCW1peGVkIHw9IFNQRUNJQUw7CisJCX0KKwkJLyogQ291bnQgaSd0aCBjaGFyICovCisJCWMgPSAwOworCQlwID0gbmV3X3A7CisJCXdoaWxlICgxKSB7CisJCQlwID0gc3RyY2hyKHAsIG5ld19wW2ldKTsKKwkJCWlmIChwID09IE5VTEwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWMrKzsKKwkJCXArKzsKKwkJCWlmICghKnApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBNb3JlIHRoYW4gNTAlIHNpbWlsYXIgY2hhcmFjdGVycyA/ICovCisJCWlmIChjKjIgPj0gbGVuZ3RoKSB7CisJCQlyZXR1cm4gInRvbyBtYW55IHNpbWlsYXIgY2hhcmFjdGVycyI7CisJCX0KKwl9CisKKwlzaXplID0gQ09ORklHX1BBU1NXT1JEX01JTkxFTiArIDIqQ0FURUdPUklFUzsKKwlmb3IgKGkgPSAxOyBpIDw9IExBU1RfQ0FUOyBpIDw8PSAxKQorCQlpZiAobWl4ZWQgJiBpKQorCQkJc2l6ZSAtPSAyOworCWlmIChsZW5ndGggPCBzaXplKQorCQlyZXR1cm4gInRvbyB3ZWFrIjsKKworCWlmIChvbGRfcCAmJiBvbGRfcFswXSkgeworCQkvKiBjaGVjayB2cy4gb2xkIHBhc3N3b3JkICovCisJCWlmIChzdHJpbmdfY2hlY2tlcihuZXdfcCwgb2xkX3ApKSB7CisJCQlyZXR1cm4gInNpbWlsYXIgdG8gb2xkIHBhc3N3b3JkIjsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgRkFTVF9GVU5DIG9ic2N1cmUoY29uc3QgY2hhciAqb2xkLCBjb25zdCBjaGFyICpuZXd2YWwsIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWNvbnN0IGNoYXIgKm1zZzsKKworCW1zZyA9IG9ic2N1cmVfbXNnKG9sZCwgbmV3dmFsLCBwdyk7CisJaWYgKG1zZykgeworCQlwcmludGYoIkJhZCBwYXNzd29yZDogJXNcbiIsIG1zZyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3BhcnNlX2NvbmZpZy5jIGIvbGliYmIvcGFyc2VfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1YmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3BhcnNlX2NvbmZpZy5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjb25maWcgZmlsZSBwYXJzZXIgaGVscGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICogQWxzbyBmb3IgdXNlIGluIHVDbGliYyAoaHR0cDovL3VjbGliYy5vcmcvKSBsaWNlbnNlZCB1bmRlciBMR1BMdjIuMSBvciBsYXRlci4KKyAqLworCisvKiBVbmNvbW1lbnQgdG8gZW5hYmxlIHRlc3QgYXBwbGV0ICovCisvLy8vY29uZmlnOmNvbmZpZyBQQVJTRQorLy8vL2NvbmZpZzoJYm9vbCAiVW5pZm9ybSBjb25maWcgZmlsZSBwYXJzZXIgZGVidWdnaW5nIGFwcGxldDogcGFyc2UiCisvLy8vY29uZmlnOglkZWZhdWx0IG4KKy8vLy9jb25maWc6CWhlbHAKKy8vLy9jb25maWc6CSAgVHlwaWNhbCB1c2FnZSBvZiBwYXJzZSBBUEk6CisvLy8vY29uZmlnOgkJY2hhciAqdFszXTsKKy8vLy9jb25maWc6CQlwYXJzZXJfdCAqcCA9IGNvbmZpZ19vcGVuKGZpbGVuYW1lKTsKKy8vLy9jb25maWc6CQl3aGlsZSAoY29uZmlnX3JlYWQocCwgdCwgMywgMCwgZGVsaW1pdGVycywgZmxhZ3MpKSB7IC8vIDEuLjMgdG9rZW5zCisvLy8vY29uZmlnOgkJCWJiX2Vycm9yX21zZygiVE9LRU5TOiAnJXMnJyVzJyclcyciLCB0WzBdLCB0WzFdLCB0WzJdKTsKKy8vLy9jb25maWc6CQl9CisvLy8vY29uZmlnOgkJY29uZmlnX2Nsb3NlKHApOworCisvLy8vYXBwbGV0OklGX1BBUlNFKEFQUExFVChwYXJzZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi15ICs9IHBhcnNlX2NvbmZpZy5vCisKKy8vdXNhZ2U6I2RlZmluZSBwYXJzZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy14XSBbLW4gTUFYVE9LRU5TXSBbLW0gTUlOVE9LRU5TXSBbLWQgREVMSU1TXSBbLWYgRkxBR1NdIEZJTEUuLi4iCisvL3VzYWdlOiNkZWZpbmUgcGFyc2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXgJU3VwcHJlc3Mgb3V0cHV0IChmb3IgYmVuY2htYXJraW5nKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBkZWZpbmVkIEVOQUJMRV9QQVJTRSAmJiBFTkFCTEVfUEFSU0UKK2ludCBwYXJzZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGFyc2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmRlbGltcyA9ICIjIFx0IjsKKwljaGFyICoqdDsKKwl1bnNpZ25lZCBmbGFncyA9IFBBUlNFX05PUk1BTDsKKwlpbnQgbWludG9rZW5zID0gMCwgbnRva2VucyA9IDEyODsKKwl1bnNpZ25lZCBub291dDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOm4rOm0rOmYrIjsKKwlub291dCA9IDEgJiBnZXRvcHQzMihhcmd2LCAieG46bTpkOmY6IiwgJm50b2tlbnMsICZtaW50b2tlbnMsICZkZWxpbXMsICZmbGFncyk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCXQgPSB4bWFsbG9jKHNpemVvZih0WzBdKSAqIG50b2tlbnMpOworCXdoaWxlICgqYXJndikgeworCQlpbnQgbjsKKwkJcGFyc2VyX3QgKnAgPSBjb25maWdfb3BlbigqYXJndik7CisJCXdoaWxlICgobiA9IGNvbmZpZ19yZWFkKHAsIHQsIG50b2tlbnMsIG1pbnRva2VucywgZGVsaW1zLCBmbGFncykpICE9IDApIHsKKwkJCWlmICghbm9vdXQpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKwkJCQkJcHJpbnRmKCJbJXNdIiwgdFtpXSk7CisJCQkJcHV0cygiIik7CisJCQl9CisJCX0KKwkJY29uZmlnX2Nsb3NlKHApOworCQlhcmd2Kys7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworcGFyc2VyX3QqIEZBU1RfRlVOQyBjb25maWdfb3BlbjIoY29uc3QgY2hhciAqZmlsZW5hbWUsIEZJTEUqIEZBU1RfRlVOQyAoKmZvcGVuX2Z1bmMpKGNvbnN0IGNoYXIgKnBhdGgpKQoreworCUZJTEUqIGZwOworCXBhcnNlcl90ICpwYXJzZXI7CisKKwlmcCA9IGZvcGVuX2Z1bmMoZmlsZW5hbWUpOworCWlmICghZnApCisJCXJldHVybiBOVUxMOworCXBhcnNlciA9IHh6YWxsb2Moc2l6ZW9mKCpwYXJzZXIpKTsKKwlwYXJzZXItPmZwID0gZnA7CisJcmV0dXJuIHBhcnNlcjsKK30KKworcGFyc2VyX3QqIEZBU1RfRlVOQyBjb25maWdfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlyZXR1cm4gY29uZmlnX29wZW4yKGZpbGVuYW1lLCBmb3Blbl9vcl93YXJuX3N0ZGluKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgY29uZmlnX2Nsb3NlKHBhcnNlcl90ICpwYXJzZXIpCit7CisJaWYgKHBhcnNlcikgeworCQlpZiAoUEFSU0VfS0VFUF9DT1BZKSAvKiBjb21waWxlLXRpbWUgY29uc3RhbnQgKi8KKwkJCWZyZWUocGFyc2VyLT5kYXRhKTsKKwkJZmNsb3NlKHBhcnNlci0+ZnApOworCQlmcmVlKHBhcnNlci0+bGluZSk7CisJCWZyZWUocGFyc2VyLT5ubGluZSk7CisJCWZyZWUocGFyc2VyKTsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVhZHMgYW4gZW50aXJlIGxpbmUgZnJvbSBhIHRleHQgZmlsZSwKKyAqIHVwIHRvIGEgbmV3bGluZSwgZXhjbHVzaXZlLgorICogVHJhaWxpbmcgJ1wnIGlzIHJlY29nbml6ZWQgYXMgbGluZSBjb250aW51YXRpb24uCisgKiBSZXR1cm5zIC0xIGlmIEVPRi9lcnJvci4KKyAqLworc3RhdGljIGludCBnZXRfbGluZV93aXRoX2NvbnRpbnVhdGlvbihwYXJzZXJfdCAqcGFyc2VyKQoreworCXNzaXplX3QgbGVuLCBubGVuOworCWNoYXIgKmxpbmU7CisKKwlsZW4gPSBnZXRsaW5lKCZwYXJzZXItPmxpbmUsICZwYXJzZXItPmxpbmVfYWxsb2MsIHBhcnNlci0+ZnApOworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIGxlbjsKKworCWxpbmUgPSBwYXJzZXItPmxpbmU7CisJZm9yICg7OykgeworCQlwYXJzZXItPmxpbmVubysrOworCQlpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKQorCQkJbGVuLS07CisJCWlmIChsZW4gPT0gMCB8fCBsaW5lW2xlbiAtIDFdICE9ICdcXCcpCisJCQlicmVhazsKKwkJbGVuLS07CisKKwkJbmxlbiA9IGdldGxpbmUoJnBhcnNlci0+bmxpbmUsICZwYXJzZXItPm5saW5lX2FsbG9jLCBwYXJzZXItPmZwKTsKKwkJaWYgKG5sZW4gPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChwYXJzZXItPmxpbmVfYWxsb2MgPCBsZW4gKyBubGVuICsgMSkgeworCQkJcGFyc2VyLT5saW5lX2FsbG9jID0gbGVuICsgbmxlbiArIDE7CisJCQlsaW5lID0gcGFyc2VyLT5saW5lID0geHJlYWxsb2MobGluZSwgcGFyc2VyLT5saW5lX2FsbG9jKTsKKwkJfQorCQltZW1jcHkoJmxpbmVbbGVuXSwgcGFyc2VyLT5ubGluZSwgbmxlbik7CisJCWxlbiArPSBubGVuOworCX0KKworCWxpbmVbbGVuXSA9ICdcMCc7CisJcmV0dXJuIGxlbjsKK30KKworCisvKgorMC4gSWYgcGFyc2VyIGlzIE5VTEwgcmV0dXJuIDAuCisxLiBSZWFkIGEgbGluZSBmcm9tIGNvbmZpZyBmaWxlLiBJZiBub3RoaW5nIHRvIHJlYWQgdGhlbiByZXR1cm4gMC4KKyAgIEhhbmRsZSBjb250aW51YXRpb24gY2hhcmFjdGVyLiBBZHZhbmNlIGxpbmVubyBmb3IgZWFjaCBwaHlzaWNhbCBsaW5lLgorICAgRGlzY2FyZCBldmVyeXRoaW5nIHBhc3QgY29tbWVudCBjaGFyYWN0ZXIuCisyLiBpZiBQQVJTRV9UUklNIGlzIHNldCAoZGVmYXVsdCksIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBkZWxpbWl0ZXJzLgorMy4gSWYgcmVzdWx0aW5nIGxpbmUgaXMgZW1wdHkgZ290byAxLgorNC4gTG9vayBmb3IgZmlyc3QgZGVsaW1pdGVyLiBJZiAhUEFSU0VfQ09MTEFQU0Ugb3IgIVBBUlNFX1RSSU0gaXMgc2V0IHRoZW4KKyAgIHJlbWVtYmVyIHRoZSB0b2tlbiBhcyBlbXB0eS4KKzUuIEVsc2UgKGRlZmF1bHQpIGlmIG51bWJlciBvZiBzZWVuIHRva2VucyBpcyBlcXVhbCB0byBtYXggbnVtYmVyIG9mIHRva2VucworICAgKHRva2VuIGlzIHRoZSBsYXN0IG9uZSkgYW5kIFBBUlNFX0dSRUVEWSBpcyBzZXQgdGhlbiB0aGUgcmVtYWluZGVyCisgICBvZiB0aGUgbGluZSBpcyB0aGUgbGFzdCB0b2tlbi4KKyAgIEVsc2UgKHRva2VuIGlzIG5vdCBsYXN0IG9yIFBBUlNFX0dSRUVEWSBpcyBub3Qgc2V0KSBqdXN0IHJlcGxhY2UKKyAgIGZpcnN0IGRlbGltaXRlciB3aXRoICdcMCcgdGh1cyBkZWxpbWl0aW5nIHRoZSB0b2tlbi4KKzYuIEFkdmFuY2UgbGluZSBwb2ludGVyIHBhc3QgdGhlIGVuZCBvZiB0b2tlbi4gSWYgbnVtYmVyIG9mIHNlZW4gdG9rZW5zCisgICBpcyBsZXNzIHRoYW4gcmVxdWlyZWQgbnVtYmVyIG9mIHRva2VucyB0aGVuIGdvdG8gNC4KKzcuIENoZWNrIHRoZSBudW1iZXIgb2Ygc2VlbiB0b2tlbnMgaXMgbm90IGxlc3MgdGhlIG1pbiBudW1iZXIgb2YgdG9rZW5zLgorICAgQ29tcGxhaW4gb3IgZGllIG90aGVyd2lzZSBkZXBlbmRpbmcgb24gUEFSU0VfTUlOX0RJRS4KKzguIFJldHVybiB0aGUgbnVtYmVyIG9mIHNlZW4gdG9rZW5zLgorCittaW50b2tlbnMgPiAwIG1ha2UgY29uZmlnX3JlYWQoKSBwcmludCBlcnJvciBtZXNzYWdlIGlmIGxlc3MgdGhhbiBtaW50b2tlbnMKKyhidXQgbW9yZSB0aGFuIDApIGFyZSBmb3VuZC4gRW1wdHkgbGluZXMgYXJlIGFsd2F5cyBza2lwcGVkIChub3Qgd2FybmVkIGFib3V0KS4KKyovCisjdW5kZWYgY29uZmlnX3JlYWQKK2ludCBGQVNUX0ZVTkMgY29uZmlnX3JlYWQocGFyc2VyX3QgKnBhcnNlciwgY2hhciAqKnRva2VucywgdW5zaWduZWQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRlbGltcykKK3sKKwljaGFyICpsaW5lOworCWludCBudG9rZW5zLCBtaW50b2tlbnM7CisJaW50IHQ7CisKKwlpZiAoIXBhcnNlcikKKwkJcmV0dXJuIDA7CisKKwludG9rZW5zID0gKHVpbnQ4X3QpZmxhZ3M7CisJbWludG9rZW5zID0gKHVpbnQ4X3QpKGZsYWdzID4+IDgpOworCisgYWdhaW46CisJbWVtc2V0KHRva2VucywgMCwgc2l6ZW9mKHRva2Vuc1swXSkgKiBudG9rZW5zKTsKKworCS8qIFJlYWQgb25lIGxpbmUgKGhhbmRsaW5nIGNvbnRpbnVhdGlvbnMgd2l0aCBiYWNrc2xhc2gpICovCisJaWYgKGdldF9saW5lX3dpdGhfY29udGludWF0aW9uKHBhcnNlcikgPCAwKQorCQlyZXR1cm4gMDsKKworCWxpbmUgPSBwYXJzZXItPmxpbmU7CisKKwkvKiBTa2lwIHRva2VuIGluIHRoZSBzdGFydCBvZiBsaW5lPyAqLworCWlmIChmbGFncyAmIFBBUlNFX1RSSU0pCisJCWxpbmUgKz0gc3Ryc3BuKGxpbmUsIGRlbGltcyArIDEpOworCisJaWYgKGxpbmVbMF0gPT0gJ1wwJyB8fCBsaW5lWzBdID09IGRlbGltc1swXSkKKwkJZ290byBhZ2FpbjsKKworCWlmIChmbGFncyAmIFBBUlNFX0tFRVBfQ09QWSkgeworCQlmcmVlKHBhcnNlci0+ZGF0YSk7CisJCXBhcnNlci0+ZGF0YSA9IHhzdHJkdXAobGluZSk7CisJfQorCisJLyogVG9rZW5pemUgdGhlIGxpbmUgKi8KKwl0ID0gMDsKKwlkbyB7CisJCS8qIFBpbiB0b2tlbiAqLworCQl0b2tlbnNbdF0gPSBsaW5lOworCisJCS8qIENvbWJpbmUgcmVtYWluaW5nIGFyZ3VtZW50cz8gKi8KKwkJaWYgKCh0ICE9IChudG9rZW5zLTEpKSB8fCAhKGZsYWdzICYgUEFSU0VfR1JFRURZKSkgeworCQkJLyogVmFuaWxsYSB0b2tlbiwgZmluZCBuZXh0IGRlbGltaXRlciAqLworCQkJbGluZSArPSBzdHJjc3BuKGxpbmUsIGRlbGltc1swXSA/IGRlbGltcyA6IGRlbGltcyArIDEpOworCQl9IGVsc2UgeworCQkJLyogQ29tYmluaW5nLCBmaW5kIGNvbW1lbnQgY2hhciBpZiBhbnkgKi8KKwkJCWxpbmUgPSBzdHJjaHJudWwobGluZSwgZGVsaW1zWzBdKTsKKworCQkJLyogVHJpbSBhbnkgZXh0cmEgZGVsaW1pdGVycyBmcm9tIHRoZSBlbmQgKi8KKwkJCWlmIChmbGFncyAmIFBBUlNFX1RSSU0pIHsKKwkJCQl3aGlsZSAoc3RyY2hyKGRlbGltcyArIDEsIGxpbmVbLTFdKSAhPSBOVUxMKQorCQkJCQlsaW5lLS07CisJCQl9CisJCX0KKworCQkvKiBUb2tlbiBub3QgdGVybWluYXRlZD8gKi8KKwkJaWYgKCpsaW5lID09IGRlbGltc1swXSkKKwkJCSpsaW5lID0gJ1wwJzsKKwkJZWxzZSBpZiAoKmxpbmUgIT0gJ1wwJykKKwkJCSpsaW5lKysgPSAnXDAnOworCisjaWYgMCAvKiB1bnVzZWQgc28gZmFyICovCisJCWlmIChmbGFncyAmIFBBUlNFX0VTQ0FQRSkgeworCQkJc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXModG9rZW5zW3RdLCB0b2tlbnNbdF0pOworCQl9CisjZW5kaWYKKwkJLyogU2tpcCBwb3NzaWJsZSBkZWxpbWl0ZXJzICovCisJCWlmIChmbGFncyAmIFBBUlNFX0NPTExBUFNFKQorCQkJbGluZSArPSBzdHJzcG4obGluZSwgZGVsaW1zICsgMSk7CisKKwkJdCsrOworCX0gd2hpbGUgKCpsaW5lICYmICpsaW5lICE9IGRlbGltc1swXSAmJiB0IDwgbnRva2Vucyk7CisKKwlpZiAodCA8IG1pbnRva2VucykgeworCQliYl9lcnJvcl9tc2coImJhZCBsaW5lICV1OiAlZCB0b2tlbnMgZm91bmQsICVkIG5lZWRlZCIsCisJCQkJcGFyc2VyLT5saW5lbm8sIHQsIG1pbnRva2Vucyk7CisJCWlmIChmbGFncyAmIFBBUlNFX01JTl9ESUUpCisJCQl4ZnVuY19kaWUoKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlyZXR1cm4gdDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3BhcnNlX21vZGUuYyBiL2xpYmJiL3BhcnNlX21vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTRlMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGFyc2VfbW9kZS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwYXJzZV9tb2RlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NobW9kLmh0bWwgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIE5PRk9SSyBhcHBsZXRzLiBJdCBtdXN0IG5vdCBhbGxvY2F0ZSBhbnl0aGluZyAqLworCisjZGVmaW5lIEZJTEVNT0RFQklUUyAoU19JU1VJRCB8IFNfSVNHSUQgfCBTX0lTVlRYIHwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKQorCitpbnQgRkFTVF9GVU5DIGJiX3BhcnNlX21vZGUoY29uc3QgY2hhciAqcywgbW9kZV90ICpjdXJyZW50X21vZGUpCit7CisJc3RhdGljIGNvbnN0IG1vZGVfdCB3aG9fbWFza1tdID0geworCQlTX0lTVUlEIHwgU19JU0dJRCB8IFNfSVNWVFggfCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8sIC8qIGEgKi8KKwkJU19JU1VJRCB8IFNfSVJXWFUsICAgICAgICAgICAvKiB1ICovCisJCVNfSVNHSUQgfCBTX0lSV1hHLCAgICAgICAgICAgLyogZyAqLworCQlTX0lSV1hPICAgICAgICAgICAgICAgICAgICAgIC8qIG8gKi8KKwl9OworCXN0YXRpYyBjb25zdCBtb2RlX3QgcGVybV9tYXNrW10gPSB7CisJCVNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwgLyogciAqLworCQlTX0lXVVNSIHwgU19JV0dSUCB8IFNfSVdPVEgsIC8qIHcgKi8KKwkJU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RILCAvKiB4ICovCisJCVNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCwgLyogWCAtLSBzcGVjaWFsIC0tIHNlZSBiZWxvdyAqLworCQlTX0lTVUlEIHwgU19JU0dJRCwgICAgICAgICAgIC8qIHMgKi8KKwkJU19JU1ZUWCAgICAgICAgICAgICAgICAgICAgICAvKiB0ICovCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciB3aG9fY2hhcnNbXSBBTElHTjEgPSAiYXVnbyI7CisJc3RhdGljIGNvbnN0IGNoYXIgcGVybV9jaGFyc1tdIEFMSUdOMSA9ICJyd3hYc3QiOworCisJY29uc3QgY2hhciAqcDsKKwltb2RlX3Qgd2hvbGlzdDsKKwltb2RlX3QgcGVybWxpc3Q7CisJbW9kZV90IG5ld19tb2RlOworCWNoYXIgb3A7CisKKwlpZiAoKHVuc2lnbmVkIGNoYXIpKCpzIC0gJzAnKSA8IDgpIHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWNoYXIgKmU7CisKKwkJdG1wID0gc3RydG91bChzLCAmZSwgOCk7CisJCWlmICgqZSB8fCAodG1wID4gMDc3NzdVKSkgeyAvKiBDaGVjayByYW5nZSBhbmQgdHJhaWxpbmcgY2hhcnMuICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkqY3VycmVudF9tb2RlID0gdG1wOworCQlyZXR1cm4gMTsKKwl9CisKKwluZXdfbW9kZSA9ICpjdXJyZW50X21vZGU7CisKKwkvKiBOb3RlOiB3ZSBhbGxvdyBlbXB0eSBjbGF1c2VzLCBhbmQgaGVuY2UgZW1wdHkgbW9kZXMuCisJICogV2UgdHJlYXQgYW4gZW1wdHkgbW9kZSBhcyBubyBjaGFuZ2UgdG8gcGVybXMuICovCisKKwl3aGlsZSAoKnMpIHsgIC8qIFByb2Nlc3MgY2xhdXNlcy4gKi8KKwkJaWYgKCpzID09ICcsJykgeyAgLyogV2UgYWxsb3cgZW1wdHkgY2xhdXNlcy4gKi8KKwkJCSsrczsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogR2V0IGEgd2hvbGlzdC4gKi8KKwkJd2hvbGlzdCA9IDA7CisgV0hPX0xJU1Q6CisJCXAgPSB3aG9fY2hhcnM7CisJCWRvIHsKKwkJCWlmICgqcCA9PSAqcykgeworCQkJCXdob2xpc3QgfD0gd2hvX21hc2tbKGludCkocC13aG9fY2hhcnMpXTsKKwkJCQlpZiAoISorK3MpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWdvdG8gV0hPX0xJU1Q7CisJCQl9CisJCX0gd2hpbGUgKCorK3ApOworCisJCWRvIHsgICAgLyogUHJvY2VzcyBhY3Rpb24gbGlzdC4gKi8KKwkJCWlmICgoKnMgIT0gJysnKSAmJiAoKnMgIT0gJy0nKSkgeworCQkJCWlmICgqcyAhPSAnPScpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCS8qIFNpbmNlIG9wIGlzICc9JywgY2xlYXIgYWxsIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUKKwkJCQkgKiB3aG9saXN0LCBvciBhbGwgZmlsZSBiaXRzIGlmIHdob2xpc3QgaXMgZW1wdHkuICovCisJCQkJcGVybWxpc3QgPSB+RklMRU1PREVCSVRTOworCQkJCWlmICh3aG9saXN0KSB7CisJCQkJCXBlcm1saXN0ID0gfndob2xpc3Q7CisJCQkJfQorCQkJCW5ld19tb2RlICY9IHBlcm1saXN0OworCQkJfQorCQkJb3AgPSAqcysrOworCisJCQkvKiBDaGVjayBmb3IgcGVybWNvcHkuICovCisJCQlwID0gd2hvX2NoYXJzICsgMTsgIC8qIFNraXAgJ2EnIGVudHJ5LiAqLworCQkJZG8geworCQkJCWlmICgqcCA9PSAqcykgeworCQkJCQlpbnQgaSA9IDA7CisJCQkJCXBlcm1saXN0ID0gd2hvX21hc2tbKGludCkocC13aG9fY2hhcnMpXQorCQkJCQkJCSAmIChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pCisJCQkJCQkJICYgbmV3X21vZGU7CisJCQkJCWRvIHsKKwkJCQkJCWlmIChwZXJtbGlzdCAmIHBlcm1fbWFza1tpXSkgeworCQkJCQkJCXBlcm1saXN0IHw9IHBlcm1fbWFza1tpXTsKKwkJCQkJCX0KKwkJCQkJfSB3aGlsZSAoKytpIDwgMyk7CisJCQkJCSsrczsKKwkJCQkJZ290byBHT1RfQUNUSU9OOworCQkJCX0KKwkJCX0gd2hpbGUgKCorK3ApOworCisJCQkvKiBJdCB3YXMgbm90IGEgcGVybWNvcHksIHNvIGdldCBhIHBlcm1saXN0LiAqLworCQkJcGVybWxpc3QgPSAwOworIFBFUk1fTElTVDoKKwkJCXAgPSBwZXJtX2NoYXJzOworCQkJZG8geworCQkJCWlmICgqcCA9PSAqcykgeworCQkJCQlpZiAoKCpwICE9ICdYJykKKwkJCQkJIHx8IChuZXdfbW9kZSAmIChTX0lGRElSIHwgU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkKKwkJCQkJKSB7CisJCQkJCQlwZXJtbGlzdCB8PSBwZXJtX21hc2tbKGludCkocC1wZXJtX2NoYXJzKV07CisJCQkJCX0KKwkJCQkJaWYgKCEqKytzKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlnb3RvIFBFUk1fTElTVDsKKwkJCQl9CisJCQl9IHdoaWxlICgqKytwKTsKKyBHT1RfQUNUSU9OOgorCQkJaWYgKHBlcm1saXN0KSB7IC8qIFRoZSBwZXJtbGlzdCB3YXMgbm9uZW1wdHkuICovCisJCQkJbW9kZV90IHRtcCA9IHdob2xpc3Q7CisJCQkJaWYgKCF3aG9saXN0KSB7CisJCQkJCW1vZGVfdCB1X21hc2sgPSB1bWFzaygwKTsKKwkJCQkJdW1hc2sodV9tYXNrKTsKKwkJCQkJdG1wID0gfnVfbWFzazsKKwkJCQl9CisJCQkJcGVybWxpc3QgJj0gdG1wOworCQkJCWlmIChvcCA9PSAnLScpIHsKKwkJCQkJbmV3X21vZGUgJj0gfnBlcm1saXN0OworCQkJCX0gZWxzZSB7CisJCQkJCW5ld19tb2RlIHw9IHBlcm1saXN0OworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoKnMgJiYgKCpzICE9ICcsJykpOworCX0KKworCSpjdXJyZW50X21vZGUgPSBuZXdfbW9kZTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3BlcnJvcl9tc2cuYyBiL2xpYmJiL3BlcnJvcl9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFmMGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGVycm9yX21zZy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKwl2YV9saXN0IHA7CisKKwl2YV9zdGFydChwLCBzKTsKKwkvKiBHdWFyZCBhZ2FpbnN0ICI8ZXJyb3IgbWVzc2FnZT46IFN1Y2Nlc3MiICovCisJYmJfdmVycm9yX21zZyhzLCBwLCBlcnJubyA/IHN0cmVycm9yKGVycm5vKSA6IE5VTEwpOworCXZhX2VuZChwKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfcGVycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKwl2YV9saXN0IHA7CisKKwl2YV9zdGFydChwLCBzKTsKKwkvKiBHdWFyZCBhZ2FpbnN0ICI8ZXJyb3IgbWVzc2FnZT46IFN1Y2Nlc3MiICovCisJYmJfdmVycm9yX21zZyhzLCBwLCBlcnJubyA/IHN0cmVycm9yKGVycm5vKSA6IE5VTEwpOworCXZhX2VuZChwKTsKKwl4ZnVuY19kaWUoKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfc2ltcGxlX3BlcnJvcl9tc2coY29uc3QgY2hhciAqcykKK3sKKwliYl9wZXJyb3JfbXNnKCIlcyIsIHMpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCIlcyIsIHMpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcGVycm9yX25vbXNnLmMgYi9saWJiYi9wZXJyb3Jfbm9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmExMWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGVycm9yX25vbXNnLmMKQEAgLTAsMCArMSwyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfcGVycm9yX25vbXNnIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBnY2Mgd2FybnMgYWJvdXQgYSBudWxsIGZvcm1hdCBzdHJpbmcsIHRoZXJlZm9yZSB3ZSBwcm92aWRlCisgKiBtb2RpZmllZCBkZWZpbml0aW9uIHdpdGhvdXQgImF0dHJpYnV0ZSAoZm9ybWF0KSIKKyAqIGluc3RlYWQgb2YgaW5jbHVkaW5nIGxpYmJiLmggKi8KKy8vI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKK2V4dGVybiB2b2lkIGJiX3BlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKSBGQVNUX0ZVTkM7CisKKy8qIHN1cHByZXNzIGdjYyAibm8gcHJldmlvdXMgcHJvdG90eXBlIiB3YXJuaW5nICovCit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3Jfbm9tc2codm9pZCk7Cit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3Jfbm9tc2codm9pZCkKK3sKKwliYl9wZXJyb3JfbXNnKDApOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcGVycm9yX25vbXNnX2FuZF9kaWUuYyBiL2xpYmJiL3BlcnJvcl9ub21zZ19hbmRfZGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZmY1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3BlcnJvcl9ub21zZ19hbmRfZGllLmMKQEAgLTAsMCArMSwyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfcGVycm9yX25vbXNnX2FuZF9kaWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGdjYyB3YXJucyBhYm91dCBhIG51bGwgZm9ybWF0IHN0cmluZywgdGhlcmVmb3JlIHdlIHByb3ZpZGUKKyAqIG1vZGlmaWVkIGRlZmluaXRpb24gd2l0aG91dCAiYXR0cmlidXRlIChmb3JtYXQpIgorICogaW5zdGVhZCBvZiBpbmNsdWRpbmcgbGliYmIuaCAqLworLy8jaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorZXh0ZXJuIHZvaWQgYmJfcGVycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikgRkFTVF9GVU5DOworCisvKiBzdXBwcmVzcyBnY2MgIm5vIHByZXZpb3VzIHByb3RvdHlwZSIgd2FybmluZyAqLwordm9pZCBGQVNUX0ZVTkMgYmJfcGVycm9yX25vbXNnX2FuZF9kaWUodm9pZCk7Cit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSh2b2lkKQoreworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3BpZGZpbGUuYyBiL2xpYmJiL3BpZGZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDhkZmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGlkZmlsZS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBpZCBmaWxlIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IGJ5IFN0ZXBoYW5lIEJpbGxpYXJ0IDxzdGVwaGFuZS5iaWxsaWFydEBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBPdmVycmlkZSBFTkFCTEVfRkVBVFVSRV9QSURGSUxFICovCisjZGVmaW5lIFdBTlRfUElERklMRSAxCisjaW5jbHVkZSAibGliYmIuaCIKKworc21hbGxpbnQgd3JvdGVfcGlkZmlsZTsKKwordm9pZCBGQVNUX0ZVTkMgd3JpdGVfcGlkZmlsZShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwaWRfZmQ7CisJY2hhciAqZW5kOworCWNoYXIgYnVmW3NpemVvZihpbnQpKjMgKyAyXTsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKworCWlmICghcGF0aCkKKwkJcmV0dXJuOworCS8qIHdlIHdpbGwgb3ZlcndyaXRlIHN0YWxlIHBpZGZpbGUgKi8KKwlwaWRfZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CisJaWYgKHBpZF9mZCA8IDApCisJCXJldHVybjsKKworCS8qIHBhdGggY2FuIGJlICIvZGV2L251bGwiISBUZXN0IGZvciBzdWNoIGNhc2VzICovCisJd3JvdGVfcGlkZmlsZSA9IChmc3RhdChwaWRfZmQsICZzYikgPT0gMCkgJiYgU19JU1JFRyhzYi5zdF9tb2RlKTsKKworCWlmICh3cm90ZV9waWRmaWxlKSB7CisJCS8qIGZldyBieXRlcyBsYXJnZXIsIGJ1dCBkb2Vzbid0IHVzZSBzdGRpbyAqLworCQllbmQgPSB1dG9hX3RvX2J1ZihnZXRwaWQoKSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCSplbmQgPSAnXG4nOworCQlmdWxsX3dyaXRlKHBpZF9mZCwgYnVmLCBlbmQgLSBidWYgKyAxKTsKKwl9CisJY2xvc2UocGlkX2ZkKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3BsYXRmb3JtLmMgYi9saWJiYi9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjM0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogUmVwbGFjZW1lbnRzIGZvciBjb21tb24gYnV0IHVzdWFsbHkgbm9uc3RhbmRhcmQgZnVuY3Rpb25zIHRoYXQgYXJlbid0CisgKiBzdXBwbGllZCBieSBhbGwgcGxhdGZvcm1zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBieSBEYW4gRmFuZHJpY2ggPGRhbkBjb25laGFydmVzdGVycy5jb20+LCBldC4gYWwuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZm5kZWYgSEFWRV9TVFJDSFJOVUwKK2NoYXIqIEZBU1RfRlVOQyBzdHJjaHJudWwoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisJd2hpbGUgKCpzICE9ICdcMCcgJiYgKnMgIT0gYykKKwkJcysrOworCXJldHVybiAoY2hhciopczsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCitpbnQgRkFTVF9GVU5DIHZhc3ByaW50ZihjaGFyICoqc3RyaW5nX3B0ciwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHApCit7CisJaW50IHI7CisJdmFfbGlzdCBwMjsKKwljaGFyIGJ1ZlsxMjhdOworCisJdmFfY29weShwMiwgcCk7CisJciA9IHZzbnByaW50ZihidWYsIDEyOCwgZm9ybWF0LCBwKTsKKwl2YV9lbmQocCk7CisKKwlpZiAociA8IDEyOCkgeworCQl2YV9lbmQocDIpOworCQkqc3RyaW5nX3B0ciA9IHhzdHJkdXAoYnVmKTsKKwkJcmV0dXJuIHI7CisJfQorCisJKnN0cmluZ19wdHIgPSB4bWFsbG9jKHIrMSk7CisJciA9IHZzbnByaW50Zigqc3RyaW5nX3B0ciwgcisxLCBmb3JtYXQsIHAyKTsKKwl2YV9lbmQocDIpOworCisJcmV0dXJuIHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0RQUklOVEYKKy8qIGRwcmludGYgaXMgbm93IHBhcnQgb2YgUE9TSVguMSwgYnV0IHdhcyBvbmx5IGFkZGVkIGluIDIwMDggKi8KK2ludCBkcHJpbnRmKGludCBmZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwOworCWludCByOworCWNoYXIgKnN0cmluZ19wdHI7CisKKwl2YV9zdGFydChwLCBmb3JtYXQpOworCXIgPSB2YXNwcmludGYoJnN0cmluZ19wdHIsIGZvcm1hdCwgcCk7CisJdmFfZW5kKHApOworCWlmIChyID49IDApIHsKKwkJciA9IGZ1bGxfd3JpdGUoZmQsIHN0cmluZ19wdHIsIHIpOworCQlmcmVlKHN0cmluZ19wdHIpOworCX0KKwlyZXR1cm4gcjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUVNUkNIUgorLyogQ29weXJpZ2h0IChDKSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogbWVtcmNocigpIGlzIGEgR05VIGZ1bmN0aW9uIHRoYXQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBldmVyeXdoZXJlLgorICogSXQncyBiYXNpY2FsbHkgdGhlIGludmVyc2Ugb2YgbWVtY2hyKCkgLSBzZWFyY2ggYmFja3dhcmRzIGluIGEKKyAqIG1lbW9yeSBibG9jayBmb3IgYSBwYXJ0aWN1bGFyIGNoYXJhY3Rlci4KKyAqLwordm9pZCogRkFTVF9GVU5DIG1lbXJjaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWNvbnN0IGNoYXIgKnN0YXJ0ID0gcywgKmVuZCA9IHM7CisKKwllbmQgKz0gbiAtIDE7CisKKwl3aGlsZSAoZW5kID49IHN0YXJ0KSB7CisJCWlmICgqZW5kID09IChjaGFyKWMpCisJCQlyZXR1cm4gKHZvaWQgKikgZW5kOworCQllbmQtLTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUtEVEVNUAorLyogVGhpcyBpcyBub3cgYWN0dWFsbHkgcGFydCBvZiBQT1NJWC4xLCBidXQgd2FzIG9ubHkgYWRkZWQgaW4gMjAwOCAqLworY2hhciogRkFTVF9GVU5DIG1rZHRlbXAoY2hhciAqdGVtcGxhdGUpCit7CisJaWYgKG1rdGVtcCh0ZW1wbGF0ZSkgPT0gTlVMTCB8fCBta2Rpcih0ZW1wbGF0ZSwgMDcwMCkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHRlbXBsYXRlOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJDQVNFU1RSCisvKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIGh0Oi8vRGlnIEdyb3VwICovCitjaGFyKiBGQVNUX0ZVTkMgc3RyY2FzZXN0cihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWludCBsZW5ndGggPSBzdHJsZW4ocGF0dGVybik7CisKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKHN0cm5jYXNlY21wKHMsIHBhdHRlcm4sIGxlbmd0aCkgPT0gMCkKKwkJCXJldHVybiAoY2hhciAqKXM7CisJCXMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlNFUAorLyogQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAqLworY2hhciogRkFTVF9GVU5DIHN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCit7CisJY2hhciAqc3RhcnQgPSAqc3RyaW5ncDsKKwljaGFyICpwdHI7CisKKwlpZiAoIXN0YXJ0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKmRlbGltKQorCQlwdHIgPSBzdGFydCArIHN0cmxlbihzdGFydCk7CisJZWxzZSB7CisJCXB0ciA9IHN0cnBicmsoc3RhcnQsIGRlbGltKTsKKwkJaWYgKCFwdHIpIHsKKwkJCSpzdHJpbmdwID0gTlVMTDsKKwkJCXJldHVybiBzdGFydDsKKwkJfQorCX0KKworCSpwdHIgPSAnXDAnOworCSpzdHJpbmdwID0gcHRyICsgMTsKKworCXJldHVybiBzdGFydDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RQQ1BZCitjaGFyKiBGQVNUX0ZVTkMgc3RwY3B5KGNoYXIgKnAsIGNvbnN0IGNoYXIgKnRvX2FkZCkKK3sKKwl3aGlsZSAoKCpwID0gKnRvX2FkZCkgIT0gJ1wwJykgeworCQlwKys7CisJCXRvX2FkZCsrOworCX0KKwlyZXR1cm4gcDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUTElORQorc3NpemVfdCBGQVNUX0ZVTkMgZ2V0bGluZShjaGFyICoqbGluZXB0ciwgc2l6ZV90ICpuLCBGSUxFICpzdHJlYW0pCit7CisJaW50IGNoOworCWNoYXIgKmxpbmUgPSAqbGluZXB0cjsKKwlzaXplX3QgYWxsb2NlZCA9ICpuOworCXNpemVfdCBsZW4gPSAwOworCisJZG8geworCQljaCA9IGZnZXRjKHN0cmVhbSk7CisJCWlmIChjaCA9PSBFT0YpCisJCQlicmVhazsKKwkJaWYgKGxlbiArIDEgPj0gYWxsb2NlZCkgeworCQkJYWxsb2NlZCArPSBhbGxvY2VkLzQgKyA2NDsKKwkJCWxpbmUgPSB4cmVhbGxvYyhsaW5lLCBhbGxvY2VkKTsKKwkJfQorCQlsaW5lW2xlbisrXSA9IGNoOworCX0gd2hpbGUgKGNoICE9ICdcbicpOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlsaW5lW2xlbl0gPSAnXDAnOworCSpsaW5lcHRyID0gbGluZTsKKwkqbiA9IGFsbG9jZWQ7CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvcHJpbnRfZmxhZ3MuYyBiL2xpYmJiL3ByaW50X2ZsYWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlYzczMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3ByaW50X2ZsYWdzLmMKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBQcmludCBzdHJpbmcgdGhhdCBtYXRjaGVzIGJpdCBtYXNrZWQgZmxhZ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTmF0YW5hZWwgQ29wYSA8bmF0YW5hZWwuY29wYUBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIHJldHVybnMgYSBzZXQgd2l0aCB0aGUgZmxhZ3Mgbm90IHByaW50ZWQgKi8KK2ludCBGQVNUX0ZVTkMgcHJpbnRfZmxhZ3Nfc2VwYXJhdGVkKGNvbnN0IGludCAqbWFza3MsIGNvbnN0IGNoYXIgKmxhYmVscywgaW50IGZsYWdzLCBjb25zdCBjaGFyICpzZXBhcmF0b3IpCit7CisJY29uc3QgY2hhciAqbmVlZF9zZXBhcmF0b3IgPSBOVUxMOworCXdoaWxlICgqbGFiZWxzKSB7CisJCWlmIChmbGFncyAmICptYXNrcykgeworCQkJcHJpbnRmKCIlcyVzIiwKKwkJCQluZWVkX3NlcGFyYXRvciA/IG5lZWRfc2VwYXJhdG9yIDogIiIsCisJCQkJbGFiZWxzKTsKKwkJCW5lZWRfc2VwYXJhdG9yID0gc2VwYXJhdG9yOworCQkJZmxhZ3MgJj0gfiAqbWFza3M7CisJCX0KKwkJbWFza3MrKzsKKwkJbGFiZWxzICs9IHN0cmxlbihsYWJlbHMpICsgMTsKKwl9CisJcmV0dXJuIGZsYWdzOworfQorCitpbnQgRkFTVF9GVU5DIHByaW50X2ZsYWdzKGNvbnN0IG1hc2tzX2xhYmVsc190ICptbCwgaW50IGZsYWdzKQoreworCXJldHVybiBwcmludF9mbGFnc19zZXBhcmF0ZWQobWwtPm1hc2tzLCBtbC0+bGFiZWxzLCBmbGFncywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wcmludGFibGUuYyBiL2xpYmJiL3ByaW50YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWRhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wcmludGFibGUuYwpAQCAtMCwwICsxLDM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGZwdXRjX3ByaW50YWJsZShpbnQgY2gsIEZJTEUgKmZpbGUpCit7CisJaWYgKChjaCAmICgweDgwICsgUFJJTlRBQkxFX01FVEEpKSA9PSAoMHg4MCArIFBSSU5UQUJMRV9NRVRBKSkgeworCQlmcHV0cygiTS0iLCBmaWxlKTsKKwkJY2ggJj0gMHg3ZjsKKwl9CisJY2ggPSAodW5zaWduZWQgY2hhcikgY2g7CisJaWYgKGNoID09IDB4OWIpIHsKKwkJLyogVlQxMDAncyBDU0ksIGFrYSBNZXRhLUVTQywgaXMgbm90IHByaW50YWJsZSBvbiB2dC0xMDAgKi8KKwkJY2ggPSAneyc7CisJCWdvdG8gcHJpbnRfY2FyZXQ7CisJfQorCWlmIChjaCA8ICcgJykgeworCQljaCArPSAnQCc7CisJCWdvdG8gcHJpbnRfY2FyZXQ7CisJfQorCWlmIChjaCA9PSAweDdmKSB7CisJCWNoID0gJz8nOworIHByaW50X2NhcmV0OgorCQlmcHV0YygnXicsIGZpbGUpOworCX0KKwlmcHV0YyhjaCwgZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wcmludGFibGVfc3RyaW5nLmMgYi9saWJiYi9wcmludGFibGVfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxNmY2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3ByaW50YWJsZV9zdHJpbmcuYwpAQCAtMCwwICsxLDY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVbmljb2RlIHN1cHBvcnQgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcHJpbnRhYmxlX3N0cmluZyh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3RyKQoreworCXN0YXRpYyBjaGFyICpzYXZlZFs0XTsKKwlzdGF0aWMgdW5zaWduZWQgY3VyX3NhdmVkOyAvKiA9IDAgKi8KKworCWNoYXIgKmRzdDsKKwljb25zdCBjaGFyICpzOworCisJcyA9IHN0cjsKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqczsKKwkJaWYgKGMgPT0gJ1wwJykgeworCQkJLyogOTkrJSBvZiBpbnB1dHMgZG8gbm90IG5lZWQgY29udmVyc2lvbiAqLworCQkJaWYgKHN0YXRzKSB7CisJCQkJc3RhdHMtPmJ5dGVfY291bnQgPSAocyAtIHN0cik7CisJCQkJc3RhdHMtPnVuaWNvZGVfY291bnQgPSAocyAtIHN0cik7CisJCQkJc3RhdHMtPnVuaWNvZGVfd2lkdGggPSAocyAtIHN0cik7CisJCQl9CisJCQlyZXR1cm4gc3RyOworCQl9CisJCWlmIChjIDwgJyAnKQorCQkJYnJlYWs7CisJCWlmIChjID49IDB4N2YpCisJCQlicmVhazsKKwkJcysrOworCX0KKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwlkc3QgPSB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlKHN0YXRzLCBzdHIpOworI2Vsc2UKKwl7CisJCWNoYXIgKmQgPSBkc3QgPSB4c3RyZHVwKHN0cik7CisJCXdoaWxlICgxKSB7CisJCQl1bnNpZ25lZCBjaGFyIGMgPSAqZDsKKwkJCWlmIChjID09ICdcMCcpCisJCQkJYnJlYWs7CisJCQlpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpCisJCQkJKmQgPSAnPyc7CisJCQlkKys7CisJCX0KKwkJaWYgKHN0YXRzKSB7CisJCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChkIC0gZHN0KTsKKwkJCXN0YXRzLT51bmljb2RlX2NvdW50ID0gKGQgLSBkc3QpOworCQkJc3RhdHMtPnVuaWNvZGVfd2lkdGggPSAoZCAtIGRzdCk7CisJCX0KKwl9CisjZW5kaWYKKworCWZyZWUoc2F2ZWRbY3VyX3NhdmVkXSk7CisJc2F2ZWRbY3VyX3NhdmVkXSA9IGRzdDsKKwljdXJfc2F2ZWQgPSAoY3VyX3NhdmVkICsgMSkgJiAoQVJSQVlfU0laRShzYXZlZCktMSk7CisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UuYyBiL2xpYmJiL3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2ZWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSBNYW51ZWwgTm92b2EgSUlJIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqIGFuZCBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBXQU5UX0hFWF9FU0NBUEVTIDEKKworLyogVXN1YWwgInRoaXMgb25seSB3b3JrcyBmb3IgYXNjaWkgY29tcGF0aWJsZSBlbmNvZGluZ3MiIGRpc2NsYWltZXIuICovCisjdW5kZWYgX3RvbG93ZXIKKyNkZWZpbmUgX3RvbG93ZXIoWCkgKChYKXwoKGNoYXIpIDB4MjApKQorCitjaGFyIEZBU1RfRlVOQyBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZShjb25zdCBjaGFyICoqcHRyKQoreworCWNvbnN0IGNoYXIgKnE7CisJdW5zaWduZWQgbnVtX2RpZ2l0czsKKwl1bnNpZ25lZCBuOworCXVuc2lnbmVkIGJhc2U7CisKKwludW1fZGlnaXRzID0gbiA9IDA7CisJYmFzZSA9IDg7CisJcSA9ICpwdHI7CisKKwlpZiAoV0FOVF9IRVhfRVNDQVBFUyAmJiAqcSA9PSAneCcpIHsKKwkJKytxOworCQliYXNlID0gMTY7CisJCSsrbnVtX2RpZ2l0czsKKwl9CisKKwkvKiBiYXNoIHJlcXVpcmVzIGxlYWRpbmcgMCBpbiBvY3RhbCBlc2NhcGVzOgorCSAqIFwwMiB3b3JrcywgXDIgZG9lcyBub3QgKHByaW50cyBcIGFuZCAyKS4KKwkgKiBXZSB0cmVhdCBcMiBhcyBhIHZhbGlkIG9jdGFsIGVzY2FwZSBzZXF1ZW5jZS4gKi8KKwlkbyB7CisJCXVuc2lnbmVkIHI7CisjaWYgIVdBTlRfSEVYX0VTQ0FQRVMKKwkJdW5zaWduZWQgZCA9ICh1bnNpZ25lZCBjaGFyKSgqcSkgLSAnMCc7CisjZWxzZQorCQl1bnNpZ25lZCBkID0gKHVuc2lnbmVkIGNoYXIpX3RvbG93ZXIoKnEpIC0gJzAnOworCQlpZiAoZCA+PSAxMCkKKwkJCWQgKz0gKCcwJyAtICdhJyArIDEwKTsKKyNlbmRpZgorCQlpZiAoZCA+PSBiYXNlKSB7CisJCQlpZiAoV0FOVF9IRVhfRVNDQVBFUyAmJiBiYXNlID09IDE2KSB7CisJCQkJLS1udW1fZGlnaXRzOworCQkJCWlmIChudW1fZGlnaXRzID09IDApIHsKKwkJCQkJLyogXHg8YmFkX2NoYXI+OiByZXR1cm4gJ1wnLAorCQkJCQkgKiBsZWF2ZSBwdHIgcG9pbnRpbmcgdG8geCAqLworCQkJCQlyZXR1cm4gJ1xcJzsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXIgPSBuICogYmFzZSArIGQ7CisJCWlmIChyID4gVUNIQVJfTUFYKSB7CisJCQlicmVhazsKKwkJfQorCisJCW4gPSByOworCQkrK3E7CisJfSB3aGlsZSAoKytudW1fZGlnaXRzIDwgMyk7CisKKwlpZiAobnVtX2RpZ2l0cyA9PSAwKSB7CisJCS8qIE5vdCBvY3RhbCBvciBoZXggZXNjYXBlIHNlcXVlbmNlLgorCQkgKiBJcyBpdCBvbmUtbGV0dGVyIG9uZT8gKi8KKworCQkvKiBiYXNoIGJ1aWx0aW4gImVjaG8gLWUgJ1xlYyciIGludGVycHJldHMgXGUgYXMgRVNDLAorCQkgKiBidXQgY29yZXV0aWxzICIvYmluL2VjaG8gLWUgJ1xlYyciIGRvZXMgbm90LgorCQkgKiBNYW5wYWdlcyB0ZW5kIHRvIHN1cHBvcnQgY29yZXV0aWxzIHdheS4KKwkJICogVXBkYXRlOiBjb3JldXRpbHMgYWRkZWQgc3VwcG9ydCBmb3IgXGUgb24gMjggT2N0IDIwMDkuICovCisJCXN0YXRpYyBjb25zdCBjaGFyIGNoYXJtYXBbXSBBTElHTjEgPSB7CisJCQknYScsICAnYicsICdlJywgJ2YnLCAgJ24nLCAgJ3InLCAgJ3QnLCAgJ3YnLCAgJ1xcJywgJ1wwJywKKwkJCSdcYScsICdcYicsIDI3LCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLCAnXHYnLCAnXFwnLCAnXFwnLAorCQl9OworCQljb25zdCBjaGFyICpwID0gY2hhcm1hcDsKKwkJZG8geworCQkJaWYgKCpwID09ICpxKSB7CisJCQkJcSsrOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICgqKytwICE9ICdcMCcpOworCQkvKiBwIHBvaW50cyB0byBmb3VuZCBlc2NhcGUgY2hhciBvciBOVUwsCisJCSAqIGFkdmFuY2UgaXQgYW5kIGZpbmQgd2hhdCBpdCB0cmFuc2xhdGVzIHRvLgorCQkgKiBOb3RlIHRoYXQgXE5VTCBhbmQgdW5yZWNvZ25pemVkIHNlcXVlbmNlIFx6IHJldHVybiAnXCcKKwkJICogYW5kIGxlYXZlIHB0ciBwb2ludGluZyB0byBOVUwgb3Igei4gKi8KKwkJbiA9IHBbc2l6ZW9mKGNoYXJtYXApIC8gMl07CisJfQorCisJKnB0ciA9IHE7CisKKwlyZXR1cm4gKGNoYXIpIG47Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBzdHJjcHlfYW5kX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlcyhjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwl3aGlsZSAoMSkgeworCQljaGFyIGMsIGMxOworCQljID0gYzEgPSAqc3JjKys7CisJCWlmIChjMSA9PSAnXFwnKQorCQkJYzEgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgmc3JjKTsKKwkJKmRzdCA9IGMxOworCQlpZiAoYyA9PSAnXDAnKQorCQkJcmV0dXJuIGRzdDsKKwkJZHN0Kys7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliYmIvcHJvY3BzLmMgYi9saWJiYi9wcm9jcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTVkZGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHJvY3BzLmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IDE5OTggYnkgQWxiZXJ0IENhaGFsYW47IGFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICogU0VMaW51eCBzdXBwb3J0OiAoYykgMjAwNyBieSBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKK3R5cGVkZWYgc3RydWN0IGlkX3RvX25hbWVfbWFwX3QgeworCXVpZF90IGlkOworCWNoYXIgbmFtZVtVU0VSTkFNRV9NQVhfU0laRV07Cit9IGlkX3RvX25hbWVfbWFwX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhY2hlX3QgeworCWlkX3RvX25hbWVfbWFwX3QgKmNhY2hlOworCWludCBzaXplOworfSBjYWNoZV90OworCitzdGF0aWMgY2FjaGVfdCB1c2VybmFtZSwgZ3JvdXBuYW1lOworCitzdGF0aWMgdm9pZCBjbGVhcl9jYWNoZShjYWNoZV90ICpjcCkKK3sKKwlmcmVlKGNwLT5jYWNoZSk7CisJY3AtPmNhY2hlID0gTlVMTDsKKwljcC0+c2l6ZSA9IDA7Cit9Cit2b2lkIEZBU1RfRlVOQyBjbGVhcl91c2VybmFtZV9jYWNoZSh2b2lkKQoreworCWNsZWFyX2NhY2hlKCZ1c2VybmFtZSk7CisJY2xlYXJfY2FjaGUoJmdyb3VwbmFtZSk7Cit9CisKKyNpZiAwIC8qIG1vcmUgZ2VuZXJpYywgYnV0IHdlIGRvbid0IG5lZWQgdGhhdCB5ZXQgKi8KKy8qIFJldHVybnMgLU4tMSBpZiBub3QgZm91bmQuICovCisvKiBjcC0+Y2FjaGVbTl0gaXMgYWxsb2NhdGVkIGFuZCBtdXN0IGJlIGZpbGxlZCBpbiB0aGlzIGNhc2UgKi8KK3N0YXRpYyBpbnQgZ2V0X2NhY2hlZChjYWNoZV90ICpjcCwgdWlkX3QgaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNwLT5zaXplOyBpKyspCisJCWlmIChjcC0+Y2FjaGVbaV0uaWQgPT0gaWQpCisJCQlyZXR1cm4gaTsKKwlpID0gY3AtPnNpemUrKzsKKwljcC0+Y2FjaGUgPSB4cmVhbGxvY192ZWN0b3IoY3AtPmNhY2hlLCAyLCBpKTsKKwljcC0+Y2FjaGVbaSsrXS5pZCA9IGlkOworCXJldHVybiAtaTsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhciogZ2V0X2NhY2hlZChjYWNoZV90ICpjcCwgdWlkX3QgaWQsCisJCQljaGFyKiBGQVNUX0ZVTkMgeDJ4X3V0b2EodWlkX3QgaWQpKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBjcC0+c2l6ZTsgaSsrKQorCQlpZiAoY3AtPmNhY2hlW2ldLmlkID09IGlkKQorCQkJcmV0dXJuIGNwLT5jYWNoZVtpXS5uYW1lOworCWkgPSBjcC0+c2l6ZSsrOworCWNwLT5jYWNoZSA9IHhyZWFsbG9jX3ZlY3RvcihjcC0+Y2FjaGUsIDIsIGkpOworCWNwLT5jYWNoZVtpXS5pZCA9IGlkOworCS8qIE5ldmVyIGZhaWxzLiBHZW5lcmF0ZXMgbnVtZXJpYyBzdHJpbmcgaWYgbmFtZSBpc24ndCBmb3VuZCAqLworCXNhZmVfc3RybmNweShjcC0+Y2FjaGVbaV0ubmFtZSwgeDJ4X3V0b2EoaWQpLCBzaXplb2YoY3AtPmNhY2hlW2ldLm5hbWUpKTsKKwlyZXR1cm4gY3AtPmNhY2hlW2ldLm5hbWU7Cit9Citjb25zdCBjaGFyKiBGQVNUX0ZVTkMgZ2V0X2NhY2hlZF91c2VybmFtZSh1aWRfdCB1aWQpCit7CisJcmV0dXJuIGdldF9jYWNoZWQoJnVzZXJuYW1lLCB1aWQsIHVpZDJ1bmFtZV91dG9hKTsKK30KK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfY2FjaGVkX2dyb3VwbmFtZShnaWRfdCBnaWQpCit7CisJcmV0dXJuIGdldF9jYWNoZWQoJmdyb3VwbmFtZSwgZ2lkLCBnaWQyZ3JvdXBfdXRvYSk7Cit9CisKKworI2RlZmluZSBQUk9DUFNfQlVGU0laRSAxMDI0CisKK3N0YXRpYyBpbnQgcmVhZF90b19idWYoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZikKK3sKKwlpbnQgZmQ7CisJLyogb3Blbl9yZWFkX2Nsb3NlKCkgd291bGQgZG8gdHdvIHJlYWRzLCBjaGVja2luZyBmb3IgRU9GLgorCSAqIFdoZW4geW91IGhhdmUgMTAwMDAgL3Byb2MvJE5VTS9zdGF0IHRvIHJlYWQsIGl0IGlzbid0IGRlc2lyYWJsZSAqLworCXNzaXplX3QgcmV0ID0gLTE7CisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJcmV0ID0gcmVhZChmZCwgYnVmLCBQUk9DUFNfQlVGU0laRS0xKTsKKwkJY2xvc2UoZmQpOworCX0KKwkoKGNoYXIgKilidWYpW3JldCA+IDAgPyByZXQgOiAwXSA9ICdcMCc7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHByb2Nwc19zdGF0dXNfdCogRkFTVF9GVU5DIGFsbG9jX3Byb2Nwc19zY2FuKHZvaWQpCit7CisJdW5zaWduZWQgbiA9IGdldHBhZ2VzaXplKCk7CisJcHJvY3BzX3N0YXR1c190KiBzcCA9IHh6YWxsb2Moc2l6ZW9mKHByb2Nwc19zdGF0dXNfdCkpOworCXNwLT5kaXIgPSB4b3BlbmRpcigiL3Byb2MiKTsKKwl3aGlsZSAoMSkgeworCQluID4+PSAxOworCQlpZiAoIW4pIGJyZWFrOworCQlzcC0+c2hpZnRfcGFnZXNfdG9fYnl0ZXMrKzsKKwl9CisJc3AtPnNoaWZ0X3BhZ2VzX3RvX2tiID0gc3AtPnNoaWZ0X3BhZ2VzX3RvX2J5dGVzIC0gMTA7CisJcmV0dXJuIHNwOworfQorCit2b2lkIEZBU1RfRlVOQyBmcmVlX3Byb2Nwc19zY2FuKHByb2Nwc19zdGF0dXNfdCogc3ApCit7CisJY2xvc2VkaXIoc3AtPmRpcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJaWYgKHNwLT50YXNrX2RpcikKKwkJY2xvc2VkaXIoc3AtPnRhc2tfZGlyKTsKKyNlbmRpZgorCWZyZWUoc3AtPmFyZ3YwKTsKKwlmcmVlKHNwLT5leGUpOworCUlGX1NFTElOVVgoZnJlZShzcC0+Y29udGV4dCk7KQorCWZyZWUoc3ApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNIHx8IEVOQUJMRV9QTUFQCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmYXN0X3N0cnRvdWxfMTYoY2hhciAqKmVuZHB0cikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJY2hhciAqc3RyID0gKmVuZHB0cjsKKwl1bnNpZ25lZCBsb25nIG4gPSAwOworCisJd2hpbGUgKChjID0gKnN0cisrKSAhPSAnICcpIHsKKwkJYyA9ICgoY3wweDIwKSAtICcwJyk7CisJCWlmIChjID4gOSkKKwkJCS8vIGMgPSBjICsgJzAnIC0gJ2EnICsgMTA6CisJCQljID0gYyAtICgnYScgLSAnMCcgLSAxMCk7CisJCW4gPSBuKjE2ICsgYzsKKwl9CisJKmVuZHB0ciA9IHN0cjsgLyogV2Ugc2tpcCB0cmFpbGluZyBzcGFjZSEgKi8KKwlyZXR1cm4gbjsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFTVF9UT1AgfHwgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNIHx8IEVOQUJMRV9QTUFQCisvKiBXZSBjdXQgYSBsb3Qgb2YgY29ybmVycyBoZXJlIGZvciBzcGVlZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmFzdF9zdHJ0b3VsXzEwKGNoYXIgKiplbmRwdHIpCit7CisJY2hhciBjOworCWNoYXIgKnN0ciA9ICplbmRwdHI7CisJdW5zaWduZWQgbG9uZyBuID0gKnN0ciAtICcwJzsKKworCXdoaWxlICgoYyA9ICorK3N0cikgIT0gJyAnKQorCQluID0gbioxMCArIChjIC0gJzAnKTsKKworCSplbmRwdHIgPSBzdHIgKyAxOyAvKiBXZSBza2lwIHRyYWlsaW5nIHNwYWNlISAqLworCXJldHVybiBuOworfQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX0ZBU1RfVE9QCitzdGF0aWMgbG9uZyBmYXN0X3N0cnRvbF8xMChjaGFyICoqZW5kcHRyKQoreworCWlmICgqKmVuZHB0ciAhPSAnLScpCisJCXJldHVybiBmYXN0X3N0cnRvdWxfMTAoZW5kcHRyKTsKKworCSgqZW5kcHRyKSsrOworCXJldHVybiAtIChsb25nKWZhc3Rfc3RydG91bF8xMChlbmRwdHIpOworfQorIyBlbmRpZgorCitzdGF0aWMgY2hhciAqc2tpcF9maWVsZHMoY2hhciAqc3RyLCBpbnQgY291bnQpCit7CisJZG8geworCQl3aGlsZSAoKnN0cisrICE9ICcgJykKKwkJCWNvbnRpbnVlOworCQkvKiB3ZSBmb3VuZCBhIHNwYWNlIGNoYXIsIHN0ciBwb2ludHMgYWZ0ZXIgaXQgKi8KKwl9IHdoaWxlICgtLWNvdW50KTsKKwlyZXR1cm4gc3RyOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0gfHwgRU5BQkxFX1BNQVAKK2ludCBGQVNUX0ZVTkMgcHJvY3BzX3JlYWRfc21hcHMocGlkX3QgcGlkLCBzdHJ1Y3Qgc21hcHJlYyAqdG90YWwsCisJCSAgICAgIHZvaWQgKCpjYikoc3RydWN0IHNtYXByZWMgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlGSUxFICpmaWxlOworCXN0cnVjdCBzbWFwcmVjIGN1cnJlYzsKKwljaGFyIGZpbGVuYW1lW3NpemVvZigiL3Byb2MvJXUvc21hcHMiKSArIHNpemVvZihpbnQpKjNdOworCWNoYXIgYnVmW1BST0NQU19CVUZTSVpFXTsKKyNpZiAhRU5BQkxFX1BNQVAKKwl2b2lkICgqY2IpKHN0cnVjdCBzbWFwcmVjICosIHZvaWQgKikgPSBOVUxMOworCXZvaWQgKmRhdGEgPSBOVUxMOworI2VuZGlmCisKKwlzcHJpbnRmKGZpbGVuYW1lLCAiL3Byb2MvJXUvc21hcHMiLCAoaW50KXBpZCk7CisKKwlmaWxlID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCWlmICghZmlsZSkKKwkJcmV0dXJuIDE7CisKKwltZW1zZXQoJmN1cnJlYywgMCwgc2l6ZW9mKGN1cnJlYykpOworCXdoaWxlIChmZ2V0cyhidWYsIFBST0NQU19CVUZTSVpFLCBmaWxlKSkgeworCQkvLyBFYWNoIG1hcHBpbmcgZGF0dW0gaGFzIHRoaXMgZm9ybToKKwkJLy8gZjdkMjkwMDAtZjdkMzkwMDAgcnctcyBBRFIgTTptIE9GUyBGSUxFCisJCS8vIFNpemU6ICAgICAgICAgICAgICAgIG5ubiBrQgorCQkvLyBSc3M6ICAgICAgICAgICAgICAgICBubm4ga0IKKwkJLy8gLi4uLi4KKworCQljaGFyICp0cCA9IGJ1ZiwgKnA7CisKKyNkZWZpbmUgU0NBTihTLCBYKSBcCisJCWlmIChzdHJuY21wKHRwLCBTLCBzaXplb2YoUyktMSkgPT0gMCkgeyAgICAgICAgICAgICAgXAorCQkJdHAgPSBza2lwX3doaXRlc3BhY2UodHAgKyBzaXplb2YoUyktMSk7ICAgICAgXAorCQkJdG90YWwtPlggKz0gY3VycmVjLlggPSBmYXN0X3N0cnRvdWxfMTAoJnRwKTsgXAorCQkJY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9CisJCWlmIChjYikgeworCQkJU0NBTigiUHNzOiIgICwgc21hcF9wc3MgICAgICk7CisJCQlTQ0FOKCJTd2FwOiIgLCBzbWFwX3N3YXAgICAgKTsKKwkJfQorCQlTQ0FOKCJQcml2YXRlX0RpcnR5OiIsIHByaXZhdGVfZGlydHkpOworCQlTQ0FOKCJQcml2YXRlX0NsZWFuOiIsIHByaXZhdGVfY2xlYW4pOworCQlTQ0FOKCJTaGFyZWRfRGlydHk6IiAsIHNoYXJlZF9kaXJ0eSApOworCQlTQ0FOKCJTaGFyZWRfQ2xlYW46IiAsIHNoYXJlZF9jbGVhbiApOworI3VuZGVmIFNDQU4KKwkJdHAgPSBzdHJjaHIoYnVmLCAnLScpOworCQlpZiAodHApIHsKKwkJCS8vIFdlIHJlYWNoZWQgbmV4dCBtYXBwaW5nIC0gdGhlIGxpbmUgb2YgdGhpcyBmb3JtOgorCQkJLy8gZjdkMjkwMDAtZjdkMzkwMDAgcnctcyBBRFIgTTptIE9GUyBGSUxFCisKKwkJCWlmIChjYikgeworCQkJCS8qIElmIHdlIGhhdmUgYSBwcmV2aW91cyByZWNvcmQsIHRoZXJlJ3Mgbm90aGluZyBtb3JlCisJCQkJICogZm9yIGl0LCBjYWxsIHRoZSBjYWxsYmFjayBhbmQgY2xlYXIgY3VycmVjCisJCQkJICovCisJCQkJaWYgKGN1cnJlYy5zbWFwX3NpemUpCisJCQkJCWNiKCZjdXJyZWMsIGRhdGEpOworCQkJCWZyZWUoY3VycmVjLnNtYXBfbmFtZSk7CisJCQl9CisJCQltZW1zZXQoJmN1cnJlYywgMCwgc2l6ZW9mKGN1cnJlYykpOworCisJCQkqdHAgPSAnICc7CisJCQl0cCA9IGJ1ZjsKKwkJCWN1cnJlYy5zbWFwX3N0YXJ0ID0gZmFzdF9zdHJ0b3VsXzE2KCZ0cCk7CisJCQljdXJyZWMuc21hcF9zaXplID0gKGZhc3Rfc3RydG91bF8xNigmdHApIC0gY3VycmVjLnNtYXBfc3RhcnQpID4+IDEwOworCisJCQlzdHJuY3B5KGN1cnJlYy5zbWFwX21vZGUsIHRwLCBzaXplb2YoY3VycmVjLnNtYXBfbW9kZSktMSk7CisKKwkJCS8vIHNraXBwaW5nICJydy1zIEFEUiBNOm0gT0ZTICIKKwkJCXRwID0gc2tpcF93aGl0ZXNwYWNlKHNraXBfZmllbGRzKHRwLCA0KSk7CisJCQkvLyBmaWx0ZXIgb3V0IC9kZXYvc29tZXRoaW5nIChzb21ldGhpbmcgIT0gemVybykKKwkJCWlmIChzdHJuY21wKHRwLCAiL2Rldi8iLCA1KSAhPSAwIHx8IHN0cmNtcCh0cCwgIi9kZXYvemVyb1xuIikgPT0gMCkgeworCQkJCWlmIChjdXJyZWMuc21hcF9tb2RlWzFdID09ICd3JykgeworCQkJCQljdXJyZWMubWFwcGVkX3J3ID0gY3VycmVjLnNtYXBfc2l6ZTsKKwkJCQkJdG90YWwtPm1hcHBlZF9ydyArPSBjdXJyZWMuc21hcF9zaXplOworCQkJCX0gZWxzZSBpZiAoY3VycmVjLnNtYXBfbW9kZVsxXSA9PSAnLScpIHsKKwkJCQkJY3VycmVjLm1hcHBlZF9ybyA9IGN1cnJlYy5zbWFwX3NpemU7CisJCQkJCXRvdGFsLT5tYXBwZWRfcm8gKz0gY3VycmVjLnNtYXBfc2l6ZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChzdHJjbXAodHAsICJbc3RhY2tdXG4iKSA9PSAwKQorCQkJCXRvdGFsLT5zdGFjayArPSBjdXJyZWMuc21hcF9zaXplOworCQkJaWYgKGNiKSB7CisJCQkJcCA9IHNraXBfbm9uX3doaXRlc3BhY2UodHApOworCQkJCWlmIChwID09IHRwKSB7CisJCQkJCWN1cnJlYy5zbWFwX25hbWUgPSB4c3RyZHVwKCIgIFsgYW5vbiBdIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJKnAgPSAnXDAnOworCQkJCQljdXJyZWMuc21hcF9uYW1lID0geHN0cmR1cCh0cCk7CisJCQkJfQorCQkJfQorCQkJdG90YWwtPnNtYXBfc2l6ZSArPSBjdXJyZWMuc21hcF9zaXplOworCQl9CisJfQorCWZjbG9zZShmaWxlKTsKKworCWlmIChjYikgeworCQlpZiAoY3VycmVjLnNtYXBfc2l6ZSkKKwkJCWNiKCZjdXJyZWMsIGRhdGEpOworCQlmcmVlKGN1cnJlYy5zbWFwX25hbWUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3ZvaWQgQlVHX2NvbW1fc2l6ZSh2b2lkKTsKK3Byb2Nwc19zdGF0dXNfdCogRkFTVF9GVU5DIHByb2Nwc19zY2FuKHByb2Nwc19zdGF0dXNfdCogc3AsIGludCBmbGFncykKK3sKKwlpZiAoIXNwKQorCQlzcCA9IGFsbG9jX3Byb2Nwc19zY2FuKCk7CisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCQljaGFyIGJ1ZltQUk9DUFNfQlVGU0laRV07CisJCWxvbmcgdGFza25pY2U7CisJCXVuc2lnbmVkIHBpZDsKKwkJaW50IG47CisJCWNoYXIgZmlsZW5hbWVbc2l6ZW9mKCIvcHJvYy8ldS90YXNrLyV1L2NtZGxpbmUiKSArIHNpemVvZihpbnQpKjMgKiAyXTsKKwkJY2hhciAqZmlsZW5hbWVfdGFpbDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCQlpZiAoc3AtPnRhc2tfZGlyKSB7CisJCQllbnRyeSA9IHJlYWRkaXIoc3AtPnRhc2tfZGlyKTsKKwkJCWlmIChlbnRyeSkKKwkJCQlnb3RvIGdvdF9lbnRyeTsKKwkJCWNsb3NlZGlyKHNwLT50YXNrX2Rpcik7CisJCQlzcC0+dGFza19kaXIgPSBOVUxMOworCQl9CisjZW5kaWYKKwkJZW50cnkgPSByZWFkZGlyKHNwLT5kaXIpOworCQlpZiAoZW50cnkgPT0gTlVMTCkgeworCQkJZnJlZV9wcm9jcHNfc2NhbihzcCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorIElGX0ZFQVRVUkVfU0hPV19USFJFQURTKGdvdF9lbnRyeTopCisJCXBpZCA9IGJiX3N0cnRvdShlbnRyeS0+ZF9uYW1lLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubykKKwkJCWNvbnRpbnVlOworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCQlpZiAoKGZsYWdzICYgUFNTQ0FOX1RBU0tTKSAmJiAhc3AtPnRhc2tfZGlyKSB7CisJCQkvKiBXZSBmb3VuZCBhbm90aGVyIC9wcm9jL1BJRC4gRG8gbm90IHVzZSBpdCwKKwkJCSAqIHRoZXJlIHdpbGwgYmUgL3Byb2MvUElEL3Rhc2svUElEIChzYW1lIFBJRCEpLAorCQkJICogc28ganVzdCBnbyBhaGVhZCBhbmQgZGl2ZSBpbnRvIC9wcm9jL1BJRC90YXNrLiAqLworCQkJc3ByaW50ZihmaWxlbmFtZSwgIi9wcm9jLyV1L3Rhc2siLCBwaWQpOworCQkJLyogTm90ZTogaWYgb3BlbmRpciBmYWlscywgd2UganVzdCBnbyB0byBuZXh0IC9wcm9jL1hYWCAqLworCQkJc3AtPnRhc2tfZGlyID0gb3BlbmRpcihmaWxlbmFtZSk7CisJCQlzcC0+bWFpbl90aHJlYWRfcGlkID0gcGlkOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisJCS8qIEFmdGVyIHRoaXMgcG9pbnQgd2UgY2FuOgorCQkgKiAiYnJlYWsiOiBzdG9wIHBhcnNpbmcsIHJldHVybiB0aGUgZGF0YQorCQkgKiAiY29udGludWUiOiB0cnkgbmV4dCAvcHJvYy9YWFgKKwkJICovCisKKwkJbWVtc2V0KCZzcC0+dnN6LCAwLCBzaXplb2YoKnNwKSAtIG9mZnNldG9mKHByb2Nwc19zdGF0dXNfdCwgdnN6KSk7CisKKwkJc3AtPnBpZCA9IHBpZDsKKwkJaWYgKCEoZmxhZ3MgJiB+UFNTQ0FOX1BJRCkpCisJCQlicmVhazsgLyogd2UgbmVlZGVkIG9ubHkgcGlkLCB3ZSBnb3QgaXQgKi8KKworI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmIChmbGFncyAmIFBTU0NBTl9DT05URVhUKSB7CisJCQlpZiAoZ2V0cGlkY29uKHNwLT5waWQsICZzcC0+Y29udGV4dCkgPCAwKQorCQkJCXNwLT5jb250ZXh0ID0gTlVMTDsKKwkJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwkJaWYgKHNwLT50YXNrX2RpcikKKwkJCWZpbGVuYW1lX3RhaWwgPSBmaWxlbmFtZSArIHNwcmludGYoZmlsZW5hbWUsICIvcHJvYy8ldS90YXNrLyV1LyIsIHNwLT5tYWluX3RocmVhZF9waWQsIHBpZCk7CisJCWVsc2UKKyNlbmRpZgorCQkJZmlsZW5hbWVfdGFpbCA9IGZpbGVuYW1lICsgc3ByaW50ZihmaWxlbmFtZSwgIi9wcm9jLyV1LyIsIHBpZCk7CisKKwkJaWYgKGZsYWdzICYgUFNTQ0FOX1VJREdJRCkgeworCQkJc3RydWN0IHN0YXQgc2I7CisJCQlpZiAoc3RhdChmaWxlbmFtZSwgJnNiKSkKKwkJCQljb250aW51ZTsgLyogcHJvY2VzcyBwcm9iYWJseSBleGl0ZWQgKi8KKwkJCS8qIEVmZmVjdGl2ZSBVSUQvR0lELCBub3QgcmVhbCAqLworCQkJc3AtPnVpZCA9IHNiLnN0X3VpZDsKKwkJCXNwLT5naWQgPSBzYi5zdF9naWQ7CisJCX0KKworCQkvKiBUaGVzZSBhcmUgYWxsIHJldHJpZXZlZCBmcm9tIHByb2MvTk4vc3RhdCBpbiBvbmUgZ286ICovCisJCWlmIChmbGFncyAmIChQU1NDQU5fUFBJRCB8IFBTU0NBTl9QR0lEIHwgUFNTQ0FOX1NJRAorCQkJfCBQU1NDQU5fQ09NTSB8IFBTU0NBTl9TVEFURQorCQkJfCBQU1NDQU5fVlNaIHwgUFNTQ0FOX1JTUworCQkJfCBQU1NDQU5fU1RJTUUgfCBQU1NDQU5fVVRJTUUgfCBQU1NDQU5fU1RBUlRfVElNRQorCQkJfCBQU1NDQU5fVFRZIHwgUFNTQ0FOX05JQ0UKKwkJCXwgUFNTQ0FOX0NQVSkKKwkJKSB7CisJCQljaGFyICpjcCwgKmNvbW0xOworCQkJaW50IHR0eTsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFTVF9UT1AKKwkJCXVuc2lnbmVkIGxvbmcgdnN6LCByc3M7CisjZW5kaWYKKwkJCS8qIHNlZSBwcm9jKDUpIGZvciBzb21lIGRldGFpbHMgb24gdGhpcyAqLworCQkJc3RyY3B5KGZpbGVuYW1lX3RhaWwsICJzdGF0Iik7CisJCQluID0gcmVhZF90b19idWYoZmlsZW5hbWUsIGJ1Zik7CisJCQlpZiAobiA8IDApCisJCQkJY29udGludWU7IC8qIHByb2Nlc3MgcHJvYmFibHkgZXhpdGVkICovCisJCQljcCA9IHN0cnJjaHIoYnVmLCAnKScpOyAvKiBzcGxpdCBpbnRvICJQSUQgKGNtZCIgYW5kICI8cmVzdD4iICovCisJCQkvKmlmICghY3AgfHwgY3BbMV0gIT0gJyAnKQorCQkJCWNvbnRpbnVlOyovCisJCQljcFswXSA9ICdcMCc7CisJCQlpZiAoc2l6ZW9mKHNwLT5jb21tKSA8IDE2KQorCQkJCUJVR19jb21tX3NpemUoKTsKKwkJCWNvbW0xID0gc3RyY2hyKGJ1ZiwgJygnKTsKKwkJCS8qaWYgKGNvbW0xKSovCisJCQkJc2FmZV9zdHJuY3B5KHNwLT5jb21tLCBjb21tMSArIDEsIHNpemVvZihzcC0+Y29tbSkpOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBU1RfVE9QCisJCQluID0gc3NjYW5mKGNwKzIsCisJCQkJIiVjICV1ICIgICAgICAgICAgICAgICAvKiBzdGF0ZSwgcHBpZCAqLworCQkJCSIldSAldSAlZCAlKnMgIiAgICAgICAgLyogcGdpZCwgc2lkLCB0dHksIHRwZ2lkICovCisJCQkJIiUqcyAlKnMgJSpzICUqcyAlKnMgIiAvKiBmbGFncywgbWluX2ZsdCwgY21pbl9mbHQsIG1hal9mbHQsIGNtYWpfZmx0ICovCisJCQkJIiVsdSAlbHUgIiAgICAgICAgICAgICAvKiB1dGltZSwgc3RpbWUgKi8KKwkJCQkiJSpzICUqcyAlKnMgIiAgICAgICAgIC8qIGN1dGltZSwgY3N0aW1lLCBwcmlvcml0eSAqLworCQkJCSIlbGQgIiAgICAgICAgICAgICAgICAgLyogbmljZSAqLworCQkJCSIlKnMgJSpzICIgICAgICAgICAgICAgLyogdGltZW91dCwgaXRfcmVhbF92YWx1ZSAqLworCQkJCSIlbHUgIiAgICAgICAgICAgICAgICAgLyogc3RhcnRfdGltZSAqLworCQkJCSIlbHUgIiAgICAgICAgICAgICAgICAgLyogdnNpemUgKi8KKwkJCQkiJWx1ICIgICAgICAgICAgICAgICAgIC8qIHJzcyAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwkJCQkiJSpzICUqcyAlKnMgJSpzICUqcyAlKnMgIiAvKnJzc19ybGltLCBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfc3RhY2ssIGtzdGtfZXNwLCBrc3RrX2VpcCAqLworCQkJCSIlKnMgJSpzICUqcyAlKnMgIiAgICAgICAgIC8qc2lnbmFsLCBibG9ja2VkLCBzaWdpZ25vcmUsIHNpZ2NhdGNoICovCisJCQkJIiUqcyAlKnMgJSpzICUqcyAiICAgICAgICAgLyp3Y2hhbiwgbnN3YXAsIGNuc3dhcCwgZXhpdF9zaWduYWwgKi8KKwkJCQkiJWQiICAgICAgICAgICAgICAgICAgICAgICAvKmNwdSBsYXN0IHNlZW4gb24qLworIyBlbmRpZgorCQkJCSwKKwkJCQlzcC0+c3RhdGUsICZzcC0+cHBpZCwKKwkJCQkmc3AtPnBnaWQsICZzcC0+c2lkLCAmdHR5LAorCQkJCSZzcC0+dXRpbWUsICZzcC0+c3RpbWUsCisJCQkJJnRhc2tuaWNlLAorCQkJCSZzcC0+c3RhcnRfdGltZSwKKwkJCQkmdnN6LAorCQkJCSZyc3MKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJCQkJLCAmc3AtPmxhc3Rfc2Vlbl9vbl9jcHUKKyMgZW5kaWYKKwkJCQkpOworCisJCQlpZiAobiA8IDExKQorCQkJCWNvbnRpbnVlOyAvKiBib2d1cyBkYXRhLCBnZXQgbmV4dCAvcHJvYy9YWFggKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJCQlpZiAobiA8IDExKzE1KQorCQkJCXNwLT5sYXN0X3NlZW5fb25fY3B1ID0gMDsKKyMgZW5kaWYKKworCQkJLyogdnN6IGlzIGluIGJ5dGVzIGFuZCB3ZSB3YW50IGtiICovCisJCQlzcC0+dnN6ID0gdnN6ID4+IDEwOworCQkJLyogdnN6IGlzIGluIGJ5dGVzIGJ1dCByc3MgaXMgaW4gKlBBR0VTKiEgQ2FuIHlvdSBiZWxpZXZlIHRoYXQ/ICovCisJCQlzcC0+cnNzID0gcnNzIDw8IHNwLT5zaGlmdF9wYWdlc190b19rYjsKKwkJCXNwLT50dHlfbWFqb3IgPSAodHR5ID4+IDgpICYgMHhmZmY7CisJCQlzcC0+dHR5X21pbm9yID0gKHR0eSAmIDB4ZmYpIHwgKCh0dHkgPj4gMTIpICYgMHhmZmYwMCk7CisjZWxzZQorLyogVGhpcyBjb3N0cyB+MTAwIGJ5dGVzIG1vcmUgYnV0IG1ha2VzIHRvcCBmYXN0ZXIgYnkgMjAlCisgKiBJZiB5b3UgcnVuIDEwMDAwIHByb2Nlc3NlcywgdGhpcyBtYXkgYmUgaW1wb3J0YW50IGZvciB5b3UgKi8KKwkJCXNwLT5zdGF0ZVswXSA9IGNwWzJdOworCQkJY3AgKz0gNDsKKwkJCXNwLT5wcGlkID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQlzcC0+cGdpZCA9IGZhc3Rfc3RydG91bF8xMCgmY3ApOworCQkJc3AtPnNpZCA9IGZhc3Rfc3RydG91bF8xMCgmY3ApOworCQkJdHR5ID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQlzcC0+dHR5X21ham9yID0gKHR0eSA+PiA4KSAmIDB4ZmZmOworCQkJc3AtPnR0eV9taW5vciA9ICh0dHkgJiAweGZmKSB8ICgodHR5ID4+IDEyKSAmIDB4ZmZmMDApOworCQkJY3AgPSBza2lwX2ZpZWxkcyhjcCwgNik7IC8qIHRwZ2lkLCBmbGFncywgbWluX2ZsdCwgY21pbl9mbHQsIG1hal9mbHQsIGNtYWpfZmx0ICovCisJCQlzcC0+dXRpbWUgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCXNwLT5zdGltZSA9IGZhc3Rfc3RydG91bF8xMCgmY3ApOworCQkJY3AgPSBza2lwX2ZpZWxkcyhjcCwgMyk7IC8qIGN1dGltZSwgY3N0aW1lLCBwcmlvcml0eSAqLworCQkJdGFza25pY2UgPSBmYXN0X3N0cnRvbF8xMCgmY3ApOworCQkJY3AgPSBza2lwX2ZpZWxkcyhjcCwgMik7IC8qIHRpbWVvdXQsIGl0X3JlYWxfdmFsdWUgKi8KKwkJCXNwLT5zdGFydF90aW1lID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQkvKiB2c3ogaXMgaW4gYnl0ZXMgYW5kIHdlIHdhbnQga2IgKi8KKwkJCXNwLT52c3ogPSBmYXN0X3N0cnRvdWxfMTAoJmNwKSA+PiAxMDsKKwkJCS8qIHZzeiBpcyBpbiBieXRlcyBidXQgcnNzIGlzIGluICpQQUdFUyohIENhbiB5b3UgYmVsaWV2ZSB0aGF0PyAqLworCQkJc3AtPnJzcyA9IGZhc3Rfc3RydG91bF8xMCgmY3ApIDw8IHNwLT5zaGlmdF9wYWdlc190b19rYjsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJCQkvKiAoNik6IHJzc19ybGltLCBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfc3RhY2ssIGtzdGtfZXNwLCBrc3RrX2VpcCAqLworCQkJLyogKDQpOiBzaWduYWwsIGJsb2NrZWQsIHNpZ2lnbm9yZSwgc2lnY2F0Y2ggKi8KKwkJCS8qICg0KTogd2NoYW4sIG5zd2FwLCBjbnN3YXAsIGV4aXRfc2lnbmFsICovCisJCQljcCA9IHNraXBfZmllbGRzKGNwLCAxNCk7CisvL0ZJWE1FOiBpcyBpdCBzYWZlIHRvIGFzc3VtZSB0aGlzIGZpZWxkIGV4aXN0cz8KKwkJCXNwLT5sYXN0X3NlZW5fb25fY3B1ID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisjIGVuZGlmCisjZW5kaWYgLyogRkVBVFVSRV9GQVNUX1RPUCAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJCQlzcC0+bmljZW5lc3MgPSB0YXNrbmljZTsKKyNlbmRpZgorCisJCQlpZiAoc3AtPnZzeiA9PSAwICYmIHNwLT5zdGF0ZVswXSAhPSAnWicpCisJCQkJc3AtPnN0YXRlWzFdID0gJ1cnOworCQkJZWxzZQorCQkJCXNwLT5zdGF0ZVsxXSA9ICcgJzsKKwkJCWlmICh0YXNrbmljZSA8IDApCisJCQkJc3AtPnN0YXRlWzJdID0gJzwnOworCQkJZWxzZSBpZiAodGFza25pY2UpIC8qID4gMCAqLworCQkJCXNwLT5zdGF0ZVsyXSA9ICdOJzsKKwkJCWVsc2UKKwkJCQlzcC0+c3RhdGVbMl0gPSAnICc7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCQlpZiAoZmxhZ3MgJiBQU1NDQU5fU01BUFMpCisJCQlwcm9jcHNfcmVhZF9zbWFwcyhwaWQsICZzcC0+c21hcHMsIE5VTEwsIE5VTEwpOworI2VuZGlmIC8qIFRPUE1FTSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUworCQlpZiAoZmxhZ3MgJiBQU1NDQU5fUlVJREdJRCkgeworCQkJRklMRSAqZmlsZTsKKworCQkJc3RyY3B5KGZpbGVuYW1lX3RhaWwsICJzdGF0dXMiKTsKKwkJCWZpbGUgPSBmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJCQlpZiAoZmlsZSkgeworCQkJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmaWxlKSkgeworCQkJCQljaGFyICp0cDsKKyNkZWZpbmUgU0NBTl9UV08oc3RyLCBuYW1lLCBzdGF0ZW1lbnQpIFwKKwlpZiAoc3RybmNtcChidWYsIHN0ciwgc2l6ZW9mKHN0ciktMSkgPT0gMCkgeyBcCisJCXRwID0gc2tpcF93aGl0ZXNwYWNlKGJ1ZiArIHNpemVvZihzdHIpLTEpOyBcCisJCXNzY2FuZih0cCwgIiV1IiwgJnNwLT5uYW1lKTsgXAorCQlzdGF0ZW1lbnQ7IFwKKwl9CisJCQkJCVNDQU5fVFdPKCJVaWQ6IiwgcnVpZCwgY29udGludWUpOworCQkJCQlTQ0FOX1RXTygiR2lkOiIsIHJnaWQsIGJyZWFrKTsKKyN1bmRlZiBTQ0FOX1RXTworCQkJCX0KKwkJCQlmY2xvc2UoZmlsZSk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBQU19BRERJVElPTkFMX0NPTFVNTlMgKi8KKwkJaWYgKGZsYWdzICYgUFNTQ0FOX0VYRSkgeworCQkJc3RyY3B5KGZpbGVuYW1lX3RhaWwsICJleGUiKTsKKwkJCWZyZWUoc3AtPmV4ZSk7CisJCQlzcC0+ZXhlID0geG1hbGxvY19yZWFkbGluayhmaWxlbmFtZSk7CisJCX0KKwkJLyogTm90ZTogaWYgL3Byb2MvUElEL2NtZGxpbmUgaXMgZW1wdHksCisJCSAqIGNvZGUgYmVsb3cgImJyZWFrcyIuIFRoZXJlZm9yZSBpdCBtdXN0IGJlCisJCSAqIHRoZSBsYXN0IGNvZGUgdG8gcGFyc2UgL3Byb2MvUElEL3h4eCBkYXRhCisJCSAqICh3ZSB1c2VkIHRvIGhhdmUgL3Byb2MvUElEL2V4ZSBwYXJzaW5nIGFmdGVyIGl0CisJCSAqIGFuZCB3ZXJlIGdldHRpbmcgc3RhbGUgc3AtPmV4ZSkuCisJCSAqLworI2lmIDAgLyogUFNTQ0FOX0NNRCBpcyBub3QgdXNlZCAqLworCQlpZiAoZmxhZ3MgJiAoUFNTQ0FOX0NNRHxQU1NDQU5fQVJHVjApKSB7CisJCQlmcmVlKHNwLT5hcmd2MCk7CisJCQlzcC0+YXJndjAgPSBOVUxMOworCQkJZnJlZShzcC0+Y21kKTsKKwkJCXNwLT5jbWQgPSBOVUxMOworCQkJc3RyY3B5KGZpbGVuYW1lX3RhaWwsICJjbWRsaW5lIik7CisJCQkvKiBUT0RPOiB0byBnZXQgcmlkIG9mIHNpemUgbGltaXRzLCByZWFkIGludG8gbWFsbG9jIGJ1ZiwKKwkJCSAqIHRoZW4gcmVhbGxvYyBpdCBkb3duIHRvIHJlYWwgc2l6ZS4gKi8KKwkJCW4gPSByZWFkX3RvX2J1ZihmaWxlbmFtZSwgYnVmKTsKKwkJCWlmIChuIDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZmxhZ3MgJiBQU1NDQU5fQVJHVjApCisJCQkJc3AtPmFyZ3YwID0geHN0cmR1cChidWYpOworCQkJaWYgKGZsYWdzICYgUFNTQ0FOX0NNRCkgeworCQkJCWRvIHsKKwkJCQkJbi0tOworCQkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGJ1ZltuXSkgPCAnICcpCisJCQkJCQlidWZbbl0gPSAnICc7CisJCQkJfSB3aGlsZSAobik7CisJCQkJc3AtPmNtZCA9IHhzdHJkdXAoYnVmKTsKKwkJCX0KKwkJfQorI2Vsc2UKKwkJaWYgKGZsYWdzICYgKFBTU0NBTl9BUkdWMHxQU1NDQU5fQVJHVk4pKSB7CisJCQlmcmVlKHNwLT5hcmd2MCk7CisJCQlzcC0+YXJndjAgPSBOVUxMOworCQkJc3RyY3B5KGZpbGVuYW1lX3RhaWwsICJjbWRsaW5lIik7CisJCQluID0gcmVhZF90b19idWYoZmlsZW5hbWUsIGJ1Zik7CisJCQlpZiAobiA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGZsYWdzICYgUFNTQ0FOX0FSR1ZOKSB7CisJCQkJc3AtPmFyZ3ZfbGVuID0gbjsKKwkJCQlzcC0+YXJndjAgPSB4bWFsbG9jKG4gKyAxKTsKKwkJCQltZW1jcHkoc3AtPmFyZ3YwLCBidWYsIG4gKyAxKTsKKwkJCQkvKiBzcC0+YXJndjBbbl0gPSAnXDAnOyAtIGJ1ZiBoYXMgaXQgKi8KKwkJCX0gZWxzZSB7CisJCQkJc3AtPmFyZ3ZfbGVuID0gMDsKKwkJCQlzcC0+YXJndjAgPSB4c3RyZHVwKGJ1Zik7CisJCQl9CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwl9IC8qIGZvciAoOzspICovCisKKwlyZXR1cm4gc3A7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHJlYWRfY21kbGluZShjaGFyICpidWYsIGludCBjb2wsIHVuc2lnbmVkIHBpZCwgY29uc3QgY2hhciAqY29tbSkKK3sKKwlpbnQgc3o7CisJY2hhciBmaWxlbmFtZVtzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihpbnQpKjNdOworCisJc3ByaW50ZihmaWxlbmFtZSwgIi9wcm9jLyV1L2NtZGxpbmUiLCBwaWQpOworCXN6ID0gb3Blbl9yZWFkX2Nsb3NlKGZpbGVuYW1lLCBidWYsIGNvbCAtIDEpOworCWlmIChzeiA+IDApIHsKKwkJY29uc3QgY2hhciAqYmFzZTsKKwkJaW50IGNvbW1fbGVuOworCisJCWJ1Zltzel0gPSAnXDAnOworCQl3aGlsZSAoLS1zeiA+PSAwICYmIGJ1Zltzel0gPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQliYXNlID0gYmJfYmFzZW5hbWUoYnVmKTsgLyogYmVmb3JlIHdlIHJlcGxhY2UgYXJndjAncyBOVUwgd2l0aCBzcGFjZSAqLworCQl3aGlsZSAoc3ogPj0gMCkgeworCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShidWZbc3pdKSA8ICcgJykKKwkJCQlidWZbc3pdID0gJyAnOworCQkJc3otLTsKKwkJfQorCisJCS8qIElmIGNvbW0gZGlmZmVycyBmcm9tIGFyZ3YwLCBwcmVwZW5kICJ7Y29tbX0gIi4KKwkJICogSXQgYWxsb3dzIHRvIHNlZSB0aHJlYWQgbmFtZXMgc2V0IGJ5IHByY3RsKFBSX1NFVF9OQU1FKS4KKwkJICovCisJCWlmIChiYXNlWzBdID09ICctJykgLyogIi1zaCIgKGxvZ2luIHNoZWxsKT8gKi8KKwkJCWJhc2UrKzsKKwkJY29tbV9sZW4gPSBzdHJsZW4oY29tbSk7CisJCS8qIFdoeSBjb21wYXJlIHVwIHRvIGNvbW1fbGVuLCBub3QgQ09NTV9MRU4tMT8KKwkJICogV2VsbCwgc29tZSBwcm9jZXNzZXMgcmV3cml0ZSBhcmd2LCBhbmQgdXNlIF9zcGFjZXNfIHRoZXJlCisJCSAqIHdoaWxlIHJld3JpdGluZy4gKEtERSBpcyBvYnNlcnZlZCB0byBkbyBpdCkuCisJCSAqIEkgcHJlZmVyIHRvIHN0aWxsIHRyZWF0IGFyZ3YwICJwcm9jZXNzIGZvbyBiYXIiCisJCSAqIGFzICdlcXVhbCcgdG8gY29tbSAicHJvY2VzcyIuCisJCSAqLworCQlpZiAoc3RybmNtcChiYXNlLCBjb21tLCBjb21tX2xlbikgIT0gMCkgeworCQkJY29tbV9sZW4gKz0gMzsKKwkJCWlmIChjb2wgPiBjb21tX2xlbikKKwkJCQltZW1tb3ZlKGJ1ZiArIGNvbW1fbGVuLCBidWYsIGNvbCAtIGNvbW1fbGVuKTsKKwkJCXNucHJpbnRmKGJ1ZiwgY29sLCAieyVzfSIsIGNvbW0pOworCQkJaWYgKGNvbCA8PSBjb21tX2xlbikKKwkJCQlyZXR1cm47CisJCQlidWZbY29tbV9sZW4gLSAxXSA9ICcgJzsKKwkJCWJ1Zltjb2wgLSAxXSA9ICdcMCc7CisJCX0KKworCX0gZWxzZSB7CisJCXNucHJpbnRmKGJ1ZiwgY29sLCAiWyVzXSIsIGNvbW0pOworCX0KK30KKworLyogZnJvbSBrZXJuZWw6CisJLy8gICAgICAgICAgICAgcGlkIGNvbW0gUyBwcGlkIHBnaWQgc2lkIHR0eV9uciB0dHlfcGdycCBmbGcKKwlzcHJpbnRmKGJ1ZmZlciwiJWQgKCVzKSAlYyAlZCAgJWQgICAlZCAgJWQgICAgICVkICAgICAgICVsdSAlbHUgXAorJWx1ICVsdSAlbHUgJWx1ICVsdSAlbGQgJWxkICVsZCAlbGQgJWQgMCAlbGx1ICVsdSAlbGQgJWx1ICVsdSAlbHUgJWx1ICVsdSBcCislbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVkICVkICVsdSAlbHUgJWxsdVxuIiwKKwkJdGFzay0+cGlkLAorCQl0Y29tbSwKKwkJc3RhdGUsCisJCXBwaWQsCisJCXBnaWQsCisJCXNpZCwKKwkJdHR5X25yLAorCQl0dHlfcGdycCwKKwkJdGFzay0+ZmxhZ3MsCisJCW1pbl9mbHQsCisJCWNtaW5fZmx0LAorCQltYWpfZmx0LAorCQljbWFqX2ZsdCwKKwkJY3B1dGltZV90b19jbG9ja190KHV0aW1lKSwKKwkJY3B1dGltZV90b19jbG9ja190KHN0aW1lKSwKKwkJY3B1dGltZV90b19jbG9ja190KGN1dGltZSksCisJCWNwdXRpbWVfdG9fY2xvY2tfdChjc3RpbWUpLAorCQlwcmlvcml0eSwKKwkJbmljZSwKKwkJbnVtX3RocmVhZHMsCisJCS8vIDAsCisJCXN0YXJ0X3RpbWUsCisJCXZzaXplLAorCQltbSA/IGdldF9tbV9yc3MobW0pIDogMCwKKwkJcnNzbGltLAorCQltbSA/IG1tLT5zdGFydF9jb2RlIDogMCwKKwkJbW0gPyBtbS0+ZW5kX2NvZGUgOiAwLAorCQltbSA/IG1tLT5zdGFydF9zdGFjayA6IDAsCisJCWVzcCwKKwkJZWlwLAordGhlIHJlc3QgaXMgc29tZSBvYnNvbGV0ZSBjcnVmdAorKi8KZGlmZiAtLWdpdCBhL2xpYmJiL3Byb2dyZXNzLmMgYi9saWJiYi9wcm9ncmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MmZlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wcm9ncmVzcy5jCkBAIC0wLDAgKzEsMjA3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBQcm9ncmVzcyBiYXIgY29kZS4KKyAqLworLyogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSB3aGljaCBhcHBsaWVzIHRvIHRoZSBDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiBzdHVmZiwKKyAqIG11Y2ggb2Ygd2hpY2ggd2FzIGJsYXRhbnRseSBzdG9sZW4gZnJvbSBvcGVuc3NoLgorICovCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQlNEIEFkdmVydGlzaW5nIENsYXVzZSBvbWl0dGVkIHBlciB0aGUgSnVseSAyMiwgMTk5OSBsaWNlbnNpbmcgY2hhbmdlCisgKiAgICBmdHA6Ly9mdHAuY3MuYmVya2VsZXkuZWR1L3B1Yi80YnNkL1JFQURNRS5JbXB0LkxpY2Vuc2UuQ2hhbmdlCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCitlbnVtIHsKKwkvKiBTZWNvbmRzIHdoZW4geGZlciBjb25zaWRlcmVkICJzdGFsbGVkIiAqLworCVNUQUxMVElNRSA9IDUKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3R0eTJfd2lkdGgodm9pZCkKK3sKKwl1bnNpZ25lZCB3aWR0aDsKKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDIsICZ3aWR0aCwgTlVMTCk7CisJcmV0dXJuIHdpZHRoOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9wcm9ncmVzc19pbml0KGJiX3Byb2dyZXNzX3QgKnAsIGNvbnN0IGNoYXIgKmN1cmZpbGUpCit7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCWluaXRfdW5pY29kZSgpOworCXAtPmN1cmZpbGUgPSB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlX2ZpeGVkd2lkdGgoLypOVUxMLCovIGN1cmZpbGUsIDIwKTsKKyNlbHNlCisJcC0+Y3VyZmlsZSA9IGN1cmZpbGU7CisjZW5kaWYKKwlwLT5zdGFydF9zZWMgPSBtb25vdG9uaWNfc2VjKCk7CisJcC0+bGFzdF91cGRhdGVfc2VjID0gcC0+c3RhcnRfc2VjOworCXAtPmxhc3RfY2hhbmdlX3NlYyA9IHAtPnN0YXJ0X3NlYzsKKwlwLT5sYXN0X3NpemUgPSAwOworfQorCisvKiBGaWxlIGFscmVhZHkgaGFkIGJlZ19zaXplIGJ5dGVzLgorICogVGhlbiB3ZSBzdGFydGVkIGRvd25sb2FkaW5nLgorICogV2UgZG93bmxvYWRlZCAidHJhbnNmZXJyZWQiIGJ5dGVzIHNvIGZhci4KKyAqIERvd25sb2FkIGlzIGV4cGVjdGVkIHRvIHN0b3Agd2hlbiB0b3RhbCBzaXplIChiZWdfc2l6ZSArIHRyYW5zZmVycmVkKQorICogd2lsbCBiZSAidG90YWxzaXplIiBieXRlcy4KKyAqIElmIHRvdGFsc2l6ZSA9PSAwLCB0aGVuIGl0IGlzIHVua25vd24uCisgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX3Byb2dyZXNzX3VwZGF0ZShiYl9wcm9ncmVzc190ICpwLAorCQl1b2ZmX3QgYmVnX3NpemUsCisJCXVvZmZfdCB0cmFuc2ZlcnJlZCwKKwkJdW9mZl90IHRvdGFsc2l6ZSkKK3sKKwl1b2ZmX3QgYmVnX2FuZF90cmFuc2ZlcnJlZDsKKwl1bnNpZ25lZCBzaW5jZV9sYXN0X3VwZGF0ZSwgZWxhcHNlZDsKKwlpbnQgYmFybGVuZ3RoOworCWludCBraWxvc2NhbGU7CisKKwkvL3RyYW5zZmVycmVkID0gMTIzNDsgLyogdXNlIGZvciBzdGFsbCBkZXRlY3Rpb24gdGVzdGluZyAqLworCS8vdG90YWxzaXplID0gMDsgLyogdXNlIGZvciB1bmtub3duIHNpemUgZG93bmxvYWQgdGVzdGluZyAqLworCisJZWxhcHNlZCA9IG1vbm90b25pY19zZWMoKTsKKwlzaW5jZV9sYXN0X3VwZGF0ZSA9IGVsYXBzZWQgLSBwLT5sYXN0X3VwZGF0ZV9zZWM7CisJcC0+bGFzdF91cGRhdGVfc2VjID0gZWxhcHNlZDsKKworCWlmICh0b3RhbHNpemUgIT0gMCAmJiB0cmFuc2ZlcnJlZCA+PSB0b3RhbHNpemUgLSBiZWdfc2l6ZSkgeworCQkvKiBMYXN0IGNhbGwuIERvIG5vdCBza2lwIHRoaXMgdXBkYXRlICovCisJCXRyYW5zZmVycmVkID0gdG90YWxzaXplIC0gYmVnX3NpemU7IC8qIHNhbml0aXplIGp1c3QgaW4gY2FzZSAqLworCX0KKwllbHNlIGlmIChzaW5jZV9sYXN0X3VwZGF0ZSA9PSAwKSB7CisJCS8qCisJCSAqIERvIG5vdCB1cGRhdGUgb24gZXZlcnkgY2FsbAorCQkgKiAod2UgY2FuIGJlIGNhbGxlZCBvbiBldmVyeSBuZXR3b3JrIHJlYWQhKQorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCWtpbG9zY2FsZSA9IDA7CisJLyoKKwkgKiBTY2FsZSBzaXplcyBkb3duIGlmIHRoZXkgYXJlIGNsb3NlIHRvIG92ZXJmbG93aW5nLgorCSAqIFRoaXMgYWxsb3dzIGNhbGN1bGF0aW9ucyBsaWtlICgxMDAgKiB0cmFuc2ZlcnJlZCAvIHRvdGFsc2l6ZSkKKwkgKiB3aXRob3V0IHJpc2tpbmcgb3ZlcmZsb3c6IHdlIGd1YXJhbnRlZSAxMCBoaWdoZXN0IGJpdHMgdG8gYmUgMC4KKwkgKiBJbnRyb2R1Y2VkIGVycm9yIGlzIGxlc3MgdGhhbiAxIC8gMl4xMiB+PSAwLjAyNSUKKwkgKi8KKwlpZiAoVUxPTkdfTUFYID4gMHhmZmZmZmZmZiB8fCBzaXplb2Yob2ZmX3QpID09IDQgfHwgc2l6ZW9mKG9mZl90KSAhPSA4KSB7CisJCS8qCisJCSAqIDY0LWJpdCBDUFUgfHwgc21hbGwgb2ZmX3Q6IGluIGVpdGhlciBjYXNlLAorCQkgKiA+PiBpcyBjaGVhcCwgc2luZ2xlLXdvcmQgb3BlcmF0aW9uLgorCQkgKiAuLi4gfHwgc3RyYW5nZSBvZmZfdDogYWxzbyB1c2UgdGhpcyBjb2RlCisJCSAqIChpdCBpcyBzYWZlLCBqdXN0IHN1Ym9wdGltYWwgd3J0IGNvZGUgc2l6ZSksCisJCSAqIGJlY2F1c2UgMzIvNjQgb3B0aW1pemVkIG9uZSB3b3JrcyBvbmx5IGZvciA2NC1iaXQgb2ZmX3QuCisJCSAqLworCQlpZiAodG90YWxzaXplID49ICgxIDw8IDIyKSkgeworCQkJdG90YWxzaXplID4+PSAxMDsKKwkJCWJlZ19zaXplID4+PSAxMDsKKwkJCXRyYW5zZmVycmVkID4+PSAxMDsKKwkJCWtpbG9zY2FsZSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiAzMi1iaXQgQ1BVIGFuZCA2NC1iaXQgb2ZmX3QuCisJCSAqIFVzZSBhIDQwLWJpdCBzaGlmdCwgaXQgaXMgZWFzaWVyIHRvIGRvIG9uIDMyLWJpdCBDUFUuCisJCSAqLworLyogT05FIHN1cHByZXNzZXMgIndhcm5pbmc6IHNoaWZ0IGNvdW50ID49IHdpZHRoIG9mIHR5cGUiICovCisjZGVmaW5lIE9ORSAoc2l6ZW9mKG9mZl90KSA+IDQpCisJCWlmICh0b3RhbHNpemUgPj0gKHVvZmZfdCkoMVVMTCA8PCA1NCpPTkUpKSB7CisJCQl0b3RhbHNpemUgPSAodWludDMyX3QpKHRvdGFsc2l6ZSA+PiAzMipPTkUpID4+IDg7CisJCQliZWdfc2l6ZSA9ICh1aW50MzJfdCkoYmVnX3NpemUgPj4gMzIqT05FKSA+PiA4OworCQkJdHJhbnNmZXJyZWQgPSAodWludDMyX3QpKHRyYW5zZmVycmVkID4+IDMyKk9ORSkgPj4gODsKKwkJCWtpbG9zY2FsZSA9IDQ7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCkKKwkJZnByaW50ZihzdGRlcnIsICJcciVzIiwgcC0+Y3VyZmlsZSk7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIlxyJS0yMC4yMHMiLCBwLT5jdXJmaWxlKTsKKworCWJlZ19hbmRfdHJhbnNmZXJyZWQgPSBiZWdfc2l6ZSArIHRyYW5zZmVycmVkOworCisJaWYgKHRvdGFsc2l6ZSAhPSAwKSB7CisJCXVuc2lnbmVkIHJhdGlvID0gMTAwICogYmVnX2FuZF90cmFuc2ZlcnJlZCAvIHRvdGFsc2l6ZTsKKwkJZnByaW50ZihzdGRlcnIsICIlNHUlJSIsIHJhdGlvKTsKKworCQliYXJsZW5ndGggPSBnZXRfdHR5Ml93aWR0aCgpIC0gNDk7CisJCWlmIChiYXJsZW5ndGggPiAwKSB7CisJCQkvKiBnb2QgYmxlc3MgZ2NjIGZvciB2YXJpYWJsZSBhcnJheXMgOikgKi8KKwkJCWNoYXIgYnVmW2Jhcmxlbmd0aCArIDFdOworCQkJdW5zaWduZWQgc3RhcnMgPSAodW5zaWduZWQpYmFybGVuZ3RoICogYmVnX2FuZF90cmFuc2ZlcnJlZCAvIHRvdGFsc2l6ZTsKKwkJCW1lbXNldChidWYsICcgJywgYmFybGVuZ3RoKTsKKwkJCWJ1ZltiYXJsZW5ndGhdID0gJ1wwJzsKKwkJCW1lbXNldChidWYsICcqJywgc3RhcnMpOworCQkJZnByaW50ZihzdGRlcnIsICIgfCVzfCIsIGJ1Zik7CisJCX0KKwl9CisKKwl3aGlsZSAoYmVnX2FuZF90cmFuc2ZlcnJlZCA+PSAxMDAwMDApIHsKKwkJYmVnX2FuZF90cmFuc2ZlcnJlZCA+Pj0gMTA7CisJCWtpbG9zY2FsZSsrOworCX0KKwkvKiBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UZXJhICovCisJZnByaW50ZihzdGRlcnIsICIlNnUlYyIsICh1bnNpZ25lZCliZWdfYW5kX3RyYW5zZmVycmVkLCAiIGtNR1RQRVpZIltraWxvc2NhbGVdKTsKKyNkZWZpbmUgYmVnX2FuZF90cmFuc2ZlcnJlZCBkb250X3VzZV9iZWdfYW5kX3RyYW5zZmVycmVkX2JlbG93KCkKKworCXNpbmNlX2xhc3RfdXBkYXRlID0gZWxhcHNlZCAtIHAtPmxhc3RfY2hhbmdlX3NlYzsKKwlpZiAoKHVuc2lnbmVkKXRyYW5zZmVycmVkICE9IHAtPmxhc3Rfc2l6ZSkgeworCQlwLT5sYXN0X2NoYW5nZV9zZWMgPSBlbGFwc2VkOworCQlwLT5sYXN0X3NpemUgPSAodW5zaWduZWQpdHJhbnNmZXJyZWQ7CisJCWlmIChzaW5jZV9sYXN0X3VwZGF0ZSA+PSBTVEFMTFRJTUUpIHsKKwkJCS8qIFdlICJjdXQgb3V0IiB0aGVzZSBzZWNvbmRzIGZyb20gZWxhcHNlZCB0aW1lCisJCQkgKiBieSBhZGp1c3Rpbmcgc3RhcnQgdGltZSAqLworCQkJcC0+c3RhcnRfc2VjICs9IHNpbmNlX2xhc3RfdXBkYXRlOworCQl9CisJCXNpbmNlX2xhc3RfdXBkYXRlID0gMDsgLyogd2UgYXJlIHVuLXN0YWxsZWQgbm93ICovCisJfQorCisJZWxhcHNlZCAtPSBwLT5zdGFydF9zZWM7IC8qIG5vdyBpdCdzICJlbGFwc2VkIHNpbmNlIHN0YXJ0IiAqLworCisJaWYgKHNpbmNlX2xhc3RfdXBkYXRlID49IFNUQUxMVElNRSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAgLSBzdGFsbGVkIC0iKTsKKwl9IGVsc2UgaWYgKCF0b3RhbHNpemUgfHwgIXRyYW5zZmVycmVkIHx8IChpbnQpZWxhcHNlZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIgLS06LS06LS0gRVRBIik7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgZXRhLCBzZWNzLCBob3VyczsKKworCQl0b3RhbHNpemUgLT0gYmVnX3NpemU7IC8qIG5vdyBpdCdzICJ0b3RhbCB0byB1cGxvYWQiICovCisKKwkJLyogRXN0aW1hdGVkIHJlbWFpbmluZyB0aW1lID0KKwkJICogZXN0aW1hdGVkX3NlY190b19kbF90b3RhbHNpemVfYnl0ZXMgLSBlbGFwc2VkX3NlYyA9CisJCSAqIHRvdGFsc2l6ZSAvIGF2ZXJhZ2VfYnl0ZXNfc2VjX3NvX2ZhciAtIGVsYXBzZWQgPQorCQkgKiB0b3RhbHNpemUgLyAodHJhbnNmZXJyZWQvZWxhcHNlZCkgLSBlbGFwc2VkID0KKwkJICogdG90YWxzaXplICogZWxhcHNlZCAvIHRyYW5zZmVycmVkIC0gZWxhcHNlZAorCQkgKi8KKwkJZXRhID0gdG90YWxzaXplICogZWxhcHNlZCAvIHRyYW5zZmVycmVkIC0gZWxhcHNlZDsKKwkJaWYgKGV0YSA+PSAxMDAwKjYwKjYwKQorCQkJZXRhID0gMTAwMCo2MCo2MCAtIDE7CisJCXNlY3MgPSBldGEgJSAzNjAwOworCQlob3VycyA9IGV0YSAvIDM2MDA7CisJCWZwcmludGYoc3RkZXJyLCAiJTN1OiUwMnU6JTAydSBFVEEiLCBob3Vycywgc2VjcyAvIDYwLCBzZWNzICUgNjApOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3B0cl90b19nbG9iYWxzLmMgYi9saWJiYi9wdHJfdG9fZ2xvYmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzQ1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wdHJfdG9fZ2xvYmFscy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKK3N0cnVjdCBnbG9iYWxzOworCisjaWZuZGVmIEdDQ19DT01CSU5FCisKKy8qIFdlIGNoZWF0IGhlcmUuIEl0IGlzIGRlY2xhcmVkIGFzIGNvbnN0IHB0ciBpbiBsaWJiYi5oLAorICogYnV0IGhlcmUgd2UgbWFrZSBpdCBsaXZlIGluIFIvVyBtZW1vcnkgKi8KK3N0cnVjdCBnbG9iYWxzICpwdHJfdG9fZ2xvYmFsczsKKworI2lmZGVmIF9fR0xJQkNfXworaW50ICpiYl9lcnJubzsKKyNlbmRpZgorCisKKyNlbHNlCisKKworLyogZ2NjIC1jb21iaW5lIHdpbGwgc2VlIHRocm91Z2ggYW5kIGNvbXBsYWluICovCisvKiBVc2luZyBhbHRlcm5hdGl2ZSBtZXRob2Qgd2hpY2ggaXMgbW9yZSBsaWtlbHkgdG8gYnJlYWsKKyAqIG9uIHdlaXJkIGFyY2hpdGVjdHVyZXMsIGNvbXBpbGVycywgbGlua2VycyBhbmQgc28gb24gKi8KK3N0cnVjdCBnbG9iYWxzICpjb25zdCBwdHJfdG9fZ2xvYmFscyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKKworI2lmZGVmIF9fR0xJQkNfXworaW50ICpjb25zdCBiYl9lcnJubyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3B3X2VuY3J5cHQuYyBiL2xpYmJiL3B3X2VuY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZmYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHdfZW5jcnlwdC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBzdGF0aWMgY29uc3QgdWludDhfdCBhc2NpaTY0W10gPQorICogIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICovCisKK3N0YXRpYyBpbnQgaTY0YyhpbnQgaSkKK3sKKwlpICY9IDB4M2Y7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuICcuJzsKKwlpZiAoaSA9PSAxKQorCQlyZXR1cm4gJy8nOworCWlmIChpIDwgMTIpCisJCXJldHVybiAoJzAnIC0gMiArIGkpOworCWlmIChpIDwgMzgpCisJCXJldHVybiAoJ0EnIC0gMTIgKyBpKTsKKwlyZXR1cm4gKCdhJyAtIDM4ICsgaSk7Cit9CisKK2ludCBGQVNUX0ZVTkMgY3J5cHRfbWFrZV9zYWx0KGNoYXIgKnAsIGludCBjbnQgLyosIGludCB4ICovKQoreworCS8qIHdhczogeCArPSAuLi4gKi8KKwlpbnQgeCA9IGdldHBpZCgpICsgbW9ub3RvbmljX3VzKCk7CisJZG8geworCQkvKiB4ID0gKHgqMTY2NDUyNSArIDEwMTM5MDQyMjMpICUgMl4zMiBnZW5lcmF0b3IgaXMgbGFtZQorCQkgKiAobG93LW9yZGVyIGJpdCBpcyBub3QgInJhbmRvbSIsIGV0Yy4uLiksCisJCSAqIGJ1dCBmb3Igb3VyIHB1cnBvc2VzIGl0IGlzIGdvb2QgZW5vdWdoICovCisJCXggPSB4KjE2NjQ1MjUgKyAxMDEzOTA0MjIzOworCQkvKiBCVFcsIFBhcmsgYW5kIE1pbGxlcidzICJtaW5pbWFsIHN0YW5kYXJkIGdlbmVyYXRvciIgaXMKKwkJICogeCA9IHgqMTY4MDcgJSAoKDJeMzEpLTEpCisJCSAqIEl0IGhhcyBubyBwcm9ibGVtIHdpdGggdmlzaWJseSBhbHRlcm5hdGluZyBsb3dlc3QgYml0CisJCSAqIGJ1dCBpcyBhbHNvIHdlYWsgaW4gY3J5cHRvZ3JhcGhpYyBzZW5zZSArIG5lZWRzIGRpdiwKKwkJICogd2hpY2ggbmVlZHMgbW9yZSBjb2RlIChhbmQgc2xvd2VyKSBvbiBtYW55IENQVXMgKi8KKwkJKnArKyA9IGk2NGMoeCA+PiAxNik7CisJCSpwKysgPSBpNjRjKHggPj4gMjIpOworCX0gd2hpbGUgKC0tY250KTsKKwkqcCA9ICdcMCc7CisJcmV0dXJuIHg7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBjcnlwdF9tYWtlX3B3X3NhbHQoY2hhciBzYWx0W01BWF9QV19TQUxUX0xFTl0sIGNvbnN0IGNoYXIgKmFsZ28pCit7CisJaW50IGxlbiA9IDIvMjsKKwljaGFyICpzYWx0X3B0ciA9IHNhbHQ7CisJaWYgKGFsZ29bMF0gIT0gJ2QnKSB7IC8qIG5vdCBkZXMgKi8KKwkJbGVuID0gOC8yOyAvKiBzbyBmYXIgYXNzdW1pbmcgbWQ1ICovCisJCSpzYWx0X3B0cisrID0gJyQnOworCQkqc2FsdF9wdHIrKyA9ICcxJzsKKwkJKnNhbHRfcHRyKysgPSAnJCc7CisjaWYgIUVOQUJMRV9VU0VfQkJfQ1JZUFQgfHwgRU5BQkxFX1VTRV9CQl9DUllQVF9TSEEKKwkJaWYgKGFsZ29bMF0gPT0gJ3MnKSB7IC8qIHNoYSAqLworCQkJc2FsdFsxXSA9ICc1JyArIChzdHJjbXAoYWxnbywgInNoYTUxMiIpID09IDApOworCQkJbGVuID0gMTYvMjsKKwkJfQorI2VuZGlmCisJfQorCWNyeXB0X21ha2Vfc2FsdChzYWx0X3B0ciwgbGVuKTsKKwlyZXR1cm4gc2FsdF9wdHI7Cit9CisKKyNpZiBFTkFCTEVfVVNFX0JCX0NSWVBUCisKK3N0YXRpYyBjaGFyKgordG82NChjaGFyICpzLCB1bnNpZ25lZCB2LCBpbnQgbikKK3sKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJLyogKnMrKyA9IGFzY2lpNjRbdiAmIDB4M2ZdOyAqLworCQkqcysrID0gaTY0Yyh2KTsKKwkJdiA+Pj0gNjsKKwl9CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBERVMgYW5kIE1ENSBjcnlwdCBpbXBsZW1lbnRhdGlvbnMgYXJlIHRha2VuIGZyb20gdWNsaWJjLgorICogVGhleSB3ZXJlIG1vZGlmaWVkIHRvIG5vdCB1c2Ugc3RhdGljIGJ1ZmZlcnMuCisgKi8KKworI2luY2x1ZGUgInB3X2VuY3J5cHRfZGVzLmMiCisjaW5jbHVkZSAicHdfZW5jcnlwdF9tZDUuYyIKKyNpZiBFTkFCTEVfVVNFX0JCX0NSWVBUX1NIQQorI2luY2x1ZGUgInB3X2VuY3J5cHRfc2hhLmMiCisjZW5kaWYKKworLyogT3RoZXIgYWR2YW5jZWQgY3J5cHQgaWRzIChUT0RPPyk6ICovCisvKiAkMiQgb3IgJDJhJDogQmxvd2Zpc2ggKi8KKworc3RhdGljIHN0cnVjdCBjb25zdF9kZXNfY3R4ICpkZXNfY2N0eDsKK3N0YXRpYyBzdHJ1Y3QgZGVzX2N0eCAqZGVzX2N0eDsKKworLyogbXlfY3J5cHQgcmV0dXJucyBtYWxsb2MnZWQgZGF0YSAqLworc3RhdGljIGNoYXIgKm15X2NyeXB0KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqc2FsdCkKK3sKKwkvKiBNRDUgb3IgU0hBPyAqLworCWlmIChzYWx0WzBdID09ICckJyAmJiBzYWx0WzFdICYmIHNhbHRbMl0gPT0gJyQnKSB7CisJCWlmIChzYWx0WzFdID09ICcxJykKKwkJCXJldHVybiBtZDVfY3J5cHQoeHphbGxvYyhNRDVfT1VUX0JVRlNJWkUpLCAodW5zaWduZWQgY2hhciopa2V5LCAodW5zaWduZWQgY2hhciopc2FsdCk7CisjaWYgRU5BQkxFX1VTRV9CQl9DUllQVF9TSEEKKwkJaWYgKHNhbHRbMV0gPT0gJzUnIHx8IHNhbHRbMV0gPT0gJzYnKQorCQkJcmV0dXJuIHNoYV9jcnlwdCgoY2hhciopa2V5LCAoY2hhciopc2FsdCk7CisjZW5kaWYKKwl9CisKKwlpZiAoIWRlc19jY3R4KQorCQlkZXNfY2N0eCA9IGNvbnN0X2Rlc19pbml0KCk7CisJZGVzX2N0eCA9IGRlc19pbml0KGRlc19jdHgsIGRlc19jY3R4KTsKKwlyZXR1cm4gZGVzX2NyeXB0KGRlc19jdHgsIHh6YWxsb2MoREVTX09VVF9CVUZTSVpFKSwgKHVuc2lnbmVkIGNoYXIqKWtleSwgKHVuc2lnbmVkIGNoYXIqKXNhbHQpOworfQorCisvKiBTbyBmYXIgbm9ib2R5IHdhbnRzIHRvIGhhdmUgaXQgcHVibGljICovCitzdGF0aWMgdm9pZCBteV9jcnlwdF9jbGVhbnVwKHZvaWQpCit7CisJZnJlZShkZXNfY2N0eCk7CisJZnJlZShkZXNfY3R4KTsKKwlkZXNfY2N0eCA9IE5VTEw7CisJZGVzX2N0eCA9IE5VTEw7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBwd19lbmNyeXB0KGNvbnN0IGNoYXIgKmNsZWFyLCBjb25zdCBjaGFyICpzYWx0LCBpbnQgY2xlYW51cCkKK3sKKwljaGFyICplbmNyeXB0ZWQ7CisKKwllbmNyeXB0ZWQgPSBteV9jcnlwdChjbGVhciwgc2FsdCk7CisKKwlpZiAoY2xlYW51cCkKKwkJbXlfY3J5cHRfY2xlYW51cCgpOworCisJcmV0dXJuIGVuY3J5cHRlZDsKK30KKworI2Vsc2UgLyogaWYgIUVOQUJMRV9VU0VfQkJfQ1JZUFQgKi8KKworY2hhciogRkFTVF9GVU5DIHB3X2VuY3J5cHQoY29uc3QgY2hhciAqY2xlYXIsIGNvbnN0IGNoYXIgKnNhbHQsIGludCBjbGVhbnVwKQoreworCXJldHVybiB4c3RyZHVwKGNyeXB0KGNsZWFyLCBzYWx0KSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvcHdfZW5jcnlwdF9kZXMuYyBiL2xpYmJiL3B3X2VuY3J5cHRfZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMDJkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3B3X2VuY3J5cHRfZGVzLmMKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiBGcmVlU2VjOiBsaWJjcnlwdCBmb3IgTmV0QlNECisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IERhdmlkIEJ1cnJlbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBZGFwdGVkIGZvciBGcmVlQlNELTIuMCBieSBHZW9mZnJleSBNLiBSZWhtZXQKKyAqCXRoaXMgZmlsZSBzaG91bGQgbm93ICpvbmx5KiBleHBvcnQgY3J5cHQoKSwgaW4gb3JkZXIgdG8gbWFrZQorICoJYmluYXJpZXMgb2YgbGliY3J5cHQgZXhwb3J0YWJsZSBmcm9tIHRoZSBVU0EKKyAqCisgKiBBZGFwdGVkIGZvciBGcmVlQlNELTQuMCBieSBNYXJrIFIgViBNdXJyYXkKKyAqCXRoaXMgZmlsZSBzaG91bGQgbm93ICpvbmx5KiBleHBvcnQgY3J5cHRfZGVzKCksIGluIG9yZGVyIHRvIG1ha2UKKyAqCWEgbW9kdWxlIHRoYXQgY2FuIGJlIG9wdGlvbmFsbHkgaW5jbHVkZWQgaW4gbGliY3J5cHQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBvdGhlciBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBpcyBhbiBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVTIGFuZCB0aGUgY3J5cHQoMykgaW50ZXJmYWNlcworICogYnkgRGF2aWQgQnVycmVuIDxkYXZpZGJAd2Vyai5jb20uYXU+LgorICoKKyAqIEFuIGV4Y2VsbGVudCByZWZlcmVuY2Ugb24gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIChhbmQgcmVsYXRlZAorICogYWxnb3JpdGhtcykgaXM6CisgKgorICoJQi4gU2NobmVpZXIsIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5OiBwcm90b2NvbHMsIGFsZ29yaXRobXMsCisgKglhbmQgc291cmNlIGNvZGUgaW4gQywgSm9obiBXaWxleSAmIFNvbnMsIDE5OTQuCisgKgorICogTm90ZSB0aGF0IGluIHRoYXQgYm9vaydzIGRlc2NyaXB0aW9uIG9mIERFUyB0aGUgbG9va3VwcyBmb3IgdGhlIGluaXRpYWwsCisgKiBwYm94LCBhbmQgZmluYWwgcGVybXV0YXRpb25zIGFyZSBpbnZlcnRlZCAodGhpcyBoYXMgYmVlbiBicm91Z2h0IHRvIHRoZQorICogYXR0ZW50aW9uIG9mIHRoZSBhdXRob3IpLiAgQSBsaXN0IG9mIGVycmF0YSBmb3IgdGhpcyBib29rIGhhcyBiZWVuCisgKiBwb3N0ZWQgdG8gdGhlIHNjaS5jcnlwdCBuZXdzZ3JvdXAgYnkgdGhlIGF1dGhvciBhbmQgaXMgYXZhaWxhYmxlIGZvciBGVFAuCisgKgorICogQVJDSElURUNUVVJFIEFTU1VNUFRJT05TOgorICoJSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSA4LWJ5dGUgYXJyYXlzIHBhc3NlZCBieSByZWZlcmVuY2UgY2FuIGJlCisgKglhZGRyZXNzZWQgYXMgYXJyYXlzIG9mIHVpbnQzMl90J3MgKGllLiB0aGUgQ1BVIGlzIG5vdCBwaWNreSBhYm91dAorICoJYWxpZ25tZW50KS4KKyAqLworCisKKy8qIFBhcnRzIGJ1c3lib3ggZG9lc24ndCBuZWVkIG9yIGhhZCBvcHRpbWl6ZWQgKi8KKyNkZWZpbmUgVVNFX1BSRUNPTVBVVEVEX3Vfc2JveCAxCisjZGVmaW5lIFVTRV9SRVBFVElUSVZFX1NQRUVEVVAgMAorI2RlZmluZSBVU0VfaXBfbWFzayAwCisjZGVmaW5lIFVTRV9kZV9rZXlzIDAKKworCisvKiBBIHBpbGUgb2YgZGF0YSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgSVBbNjRdID0geworCTU4LCA1MCwgNDIsIDM0LCAyNiwgMTgsIDEwLCAgMiwgNjAsIDUyLCA0NCwgMzYsIDI4LCAyMCwgMTIsICA0LAorCTYyLCA1NCwgNDYsIDM4LCAzMCwgMjIsIDE0LCAgNiwgNjQsIDU2LCA0OCwgNDAsIDMyLCAyNCwgMTYsICA4LAorCTU3LCA0OSwgNDEsIDMzLCAyNSwgMTcsICA5LCAgMSwgNTksIDUxLCA0MywgMzUsIDI3LCAxOSwgMTEsICAzLAorCTYxLCA1MywgNDUsIDM3LCAyOSwgMjEsIDEzLCAgNSwgNjMsIDU1LCA0NywgMzksIDMxLCAyMywgMTUsICA3Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrZXlfcGVybVs1Nl0gPSB7CisJNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgIDksICAxLCA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LAorCTEwLCAgMiwgNTksIDUxLCA0MywgMzUsIDI3LCAxOSwgMTEsICAzLCA2MCwgNTIsIDQ0LCAzNiwKKwk2MywgNTUsIDQ3LCAzOSwgMzEsIDIzLCAxNSwgIDcsIDYyLCA1NCwgNDYsIDM4LCAzMCwgMjIsCisJMTQsICA2LCA2MSwgNTMsIDQ1LCAzNywgMjksIDIxLCAxMywgIDUsIDI4LCAyMCwgMTIsICA0Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrZXlfc2hpZnRzWzE2XSA9IHsKKwkxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjb21wX3Blcm1bNDhdID0geworCTE0LCAxNywgMTEsIDI0LCAgMSwgIDUsICAzLCAyOCwgMTUsICA2LCAyMSwgMTAsCisJMjMsIDE5LCAxMiwgIDQsIDI2LCAgOCwgMTYsICA3LCAyNywgMjAsIDEzLCAgMiwKKwk0MSwgNTIsIDMxLCAzNywgNDcsIDU1LCAzMCwgNDAsIDUxLCA0NSwgMzMsIDQ4LAorCTQ0LCA0OSwgMzksIDU2LCAzNCwgNTMsIDQ2LCA0MiwgNTAsIDM2LCAyOSwgMzIKK307CisKKy8qCisgKiBObyBFIGJveCBpcyB1c2VkLCBhcyBpdCdzIHJlcGxhY2VkIGJ5IHNvbWUgQU5Ecywgc2hpZnRzLCBhbmQgT1JzLgorICovCisjaWYgIVVTRV9QUkVDT01QVVRFRF91X3Nib3gKK3N0YXRpYyBjb25zdCB1aW50OF90IHNib3hbOF1bNjRdID0geworCXsJMTQsICA0LCAxMywgIDEsICAyLCAxNSwgMTEsICA4LCAgMywgMTAsICA2LCAxMiwgIDUsICA5LCAgMCwgIDcsCisJCSAwLCAxNSwgIDcsICA0LCAxNCwgIDIsIDEzLCAgMSwgMTAsICA2LCAxMiwgMTEsICA5LCAgNSwgIDMsICA4LAorCQkgNCwgIDEsIDE0LCAgOCwgMTMsICA2LCAgMiwgMTEsIDE1LCAxMiwgIDksICA3LCAgMywgMTAsICA1LCAgMCwKKwkJMTUsIDEyLCAgOCwgIDIsICA0LCAgOSwgIDEsICA3LCAgNSwgMTEsICAzLCAxNCwgMTAsICAwLCAgNiwgMTMKKwl9LAorCXsJMTUsICAxLCAgOCwgMTQsICA2LCAxMSwgIDMsICA0LCAgOSwgIDcsICAyLCAxMywgMTIsICAwLCAgNSwgMTAsCisJCSAzLCAxMywgIDQsICA3LCAxNSwgIDIsICA4LCAxNCwgMTIsICAwLCAgMSwgMTAsICA2LCAgOSwgMTEsICA1LAorCQkgMCwgMTQsICA3LCAxMSwgMTAsICA0LCAxMywgIDEsICA1LCAgOCwgMTIsICA2LCAgOSwgIDMsICAyLCAxNSwKKwkJMTMsICA4LCAxMCwgIDEsICAzLCAxNSwgIDQsICAyLCAxMSwgIDYsICA3LCAxMiwgIDAsICA1LCAxNCwgIDkKKwl9LAorCXsJMTAsICAwLCAgOSwgMTQsICA2LCAgMywgMTUsICA1LCAgMSwgMTMsIDEyLCAgNywgMTEsICA0LCAgMiwgIDgsCisJCTEzLCAgNywgIDAsICA5LCAgMywgIDQsICA2LCAxMCwgIDIsICA4LCAgNSwgMTQsIDEyLCAxMSwgMTUsICAxLAorCQkxMywgIDYsICA0LCAgOSwgIDgsIDE1LCAgMywgIDAsIDExLCAgMSwgIDIsIDEyLCAgNSwgMTAsIDE0LCAgNywKKwkJIDEsIDEwLCAxMywgIDAsICA2LCAgOSwgIDgsICA3LCAgNCwgMTUsIDE0LCAgMywgMTEsICA1LCAgMiwgMTIKKwl9LAorCXsJIDcsIDEzLCAxNCwgIDMsICAwLCAgNiwgIDksIDEwLCAgMSwgIDIsICA4LCAgNSwgMTEsIDEyLCAgNCwgMTUsCisJCTEzLCAgOCwgMTEsICA1LCAgNiwgMTUsICAwLCAgMywgIDQsICA3LCAgMiwgMTIsICAxLCAxMCwgMTQsICA5LAorCQkxMCwgIDYsICA5LCAgMCwgMTIsIDExLCAgNywgMTMsIDE1LCAgMSwgIDMsIDE0LCAgNSwgIDIsICA4LCAgNCwKKwkJIDMsIDE1LCAgMCwgIDYsIDEwLCAgMSwgMTMsICA4LCAgOSwgIDQsICA1LCAxMSwgMTIsICA3LCAgMiwgMTQKKwl9LAorCXsJIDIsIDEyLCAgNCwgIDEsICA3LCAxMCwgMTEsICA2LCAgOCwgIDUsICAzLCAxNSwgMTMsICAwLCAxNCwgIDksCisJCTE0LCAxMSwgIDIsIDEyLCAgNCwgIDcsIDEzLCAgMSwgIDUsICAwLCAxNSwgMTAsICAzLCAgOSwgIDgsICA2LAorCQkgNCwgIDIsICAxLCAxMSwgMTAsIDEzLCAgNywgIDgsIDE1LCAgOSwgMTIsICA1LCAgNiwgIDMsICAwLCAxNCwKKwkJMTEsICA4LCAxMiwgIDcsICAxLCAxNCwgIDIsIDEzLCAgNiwgMTUsICAwLCAgOSwgMTAsICA0LCAgNSwgIDMKKwl9LAorCXsJMTIsICAxLCAxMCwgMTUsICA5LCAgMiwgIDYsICA4LCAgMCwgMTMsICAzLCAgNCwgMTQsICA3LCAgNSwgMTEsCisJCTEwLCAxNSwgIDQsICAyLCAgNywgMTIsICA5LCAgNSwgIDYsICAxLCAxMywgMTQsICAwLCAxMSwgIDMsICA4LAorCQkgOSwgMTQsIDE1LCAgNSwgIDIsICA4LCAxMiwgIDMsICA3LCAgMCwgIDQsIDEwLCAgMSwgMTMsIDExLCAgNiwKKwkJIDQsICAzLCAgMiwgMTIsICA5LCAgNSwgMTUsIDEwLCAxMSwgMTQsICAxLCAgNywgIDYsICAwLCAgOCwgMTMKKwl9LAorCXsJIDQsIDExLCAgMiwgMTQsIDE1LCAgMCwgIDgsIDEzLCAgMywgMTIsICA5LCAgNywgIDUsIDEwLCAgNiwgIDEsCisJCTEzLCAgMCwgMTEsICA3LCAgNCwgIDksICAxLCAxMCwgMTQsICAzLCAgNSwgMTIsICAyLCAxNSwgIDgsICA2LAorCQkgMSwgIDQsIDExLCAxMywgMTIsICAzLCAgNywgMTQsIDEwLCAxNSwgIDYsICA4LCAgMCwgIDUsICA5LCAgMiwKKwkJIDYsIDExLCAxMywgIDgsICAxLCAgNCwgMTAsICA3LCAgOSwgIDUsICAwLCAxNSwgMTQsICAyLCAgMywgMTIKKwl9LAorCXsJMTMsICAyLCAgOCwgIDQsICA2LCAxNSwgMTEsICAxLCAxMCwgIDksICAzLCAxNCwgIDUsICAwLCAxMiwgIDcsCisJCSAxLCAxNSwgMTMsICA4LCAxMCwgIDMsICA3LCAgNCwgMTIsICA1LCAgNiwgMTEsICAwLCAxNCwgIDksICAyLAorCQkgNywgMTEsICA0LCAgMSwgIDksIDEyLCAxNCwgIDIsICAwLCAgNiwgMTAsIDEzLCAxNSwgIDMsICA1LCAgOCwKKwkJIDIsICAxLCAxNCwgIDcsICA0LCAxMCwgIDgsIDEzLCAxNSwgMTIsICA5LCAgMCwgIDMsICA1LCAgNiwgMTEKKwl9Cit9OworI2Vsc2UgLyogcHJlY29tcHV0ZWQsIHdpdGggaGFsZi1ieXRlcyBwYWNrZWQgaW50byBvbmUgYnl0ZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdV9zYm94WzhdWzMyXSA9IHsKKwl7CTB4MGUsIDB4ZjQsIDB4N2QsIDB4NDEsIDB4ZTIsIDB4MmYsIDB4ZGIsIDB4MTgsCisJCTB4YTMsIDB4NmEsIDB4YzYsIDB4YmMsIDB4OTUsIDB4NTksIDB4MzAsIDB4ODcsCisJCTB4ZjQsIDB4YzEsIDB4OGUsIDB4MjgsIDB4NGQsIDB4OTYsIDB4MTIsIDB4N2IsCisJCTB4NWYsIDB4YmMsIDB4MzksIDB4ZTcsIDB4YTMsIDB4MGEsIDB4NjUsIDB4ZDAsCisJfSwKKwl7CTB4M2YsIDB4ZDEsIDB4NDgsIDB4N2UsIDB4ZjYsIDB4MmIsIDB4ODMsIDB4ZTQsCisJCTB4YzksIDB4MDcsIDB4MTIsIDB4YWQsIDB4NmMsIDB4OTAsIDB4YjUsIDB4NWEsCisJCTB4ZDAsIDB4OGUsIDB4YTcsIDB4MWIsIDB4M2EsIDB4ZjQsIDB4NGQsIDB4MjEsCisJCTB4YjUsIDB4NjgsIDB4N2MsIDB4YzYsIDB4MDksIDB4NTMsIDB4ZTIsIDB4OWYsCisJfSwKKwl7CTB4ZGEsIDB4NzAsIDB4MDksIDB4OWUsIDB4MzYsIDB4NDMsIDB4NmYsIDB4YTUsCisJCTB4MjEsIDB4OGQsIDB4NWMsIDB4ZTcsIDB4Y2IsIDB4YjQsIDB4ZjIsIDB4MTgsCisJCTB4MWQsIDB4YTYsIDB4ZDQsIDB4MDksIDB4NjgsIDB4OWYsIDB4ODMsIDB4NzAsCisJCTB4NGIsIDB4ZjEsIDB4ZTIsIDB4M2MsIDB4YjUsIDB4NWEsIDB4MmUsIDB4YzcsCisJfSwKKwl7CTB4ZDcsIDB4OGQsIDB4YmUsIDB4NTMsIDB4NjAsIDB4ZjYsIDB4MDksIDB4M2EsCisJCTB4NDEsIDB4NzIsIDB4MjgsIDB4YzUsIDB4MWIsIDB4YWMsIDB4ZTQsIDB4OWYsCisJCTB4M2EsIDB4ZjYsIDB4MDksIDB4NjAsIDB4YWMsIDB4MWIsIDB4ZDcsIDB4OGQsCisJCTB4OWYsIDB4NDEsIDB4NTMsIDB4YmUsIDB4YzUsIDB4NzIsIDB4MjgsIDB4ZTQsCisJfSwKKwl7CTB4ZTIsIDB4YmMsIDB4MjQsIDB4YzEsIDB4NDcsIDB4N2EsIDB4ZGIsIDB4MTYsCisJCTB4NTgsIDB4MDUsIDB4ZjMsIDB4YWYsIDB4M2QsIDB4OTAsIDB4OGUsIDB4NjksCisJCTB4YjQsIDB4ODIsIDB4YzEsIDB4N2IsIDB4MWEsIDB4ZWQsIDB4MjcsIDB4ZDgsCisJCTB4NmYsIDB4ZjksIDB4MGMsIDB4OTUsIDB4YTYsIDB4NDMsIDB4NTAsIDB4M2UsCisJfSwKKwl7CTB4YWMsIDB4ZjEsIDB4NGEsIDB4MmYsIDB4NzksIDB4YzIsIDB4OTYsIDB4NTgsCisJCTB4NjAsIDB4MWQsIDB4ZDMsIDB4ZTQsIDB4MGUsIDB4YjcsIDB4MzUsIDB4OGIsCisJCTB4NDksIDB4M2UsIDB4MmYsIDB4YzUsIDB4OTIsIDB4NTgsIDB4ZmMsIDB4YTMsCisJCTB4YjcsIDB4ZTAsIDB4MTQsIDB4N2EsIDB4NjEsIDB4MGQsIDB4OGIsIDB4ZDYsCisJfSwKKwl7CTB4ZDQsIDB4MGIsIDB4YjIsIDB4N2UsIDB4NGYsIDB4OTAsIDB4MTgsIDB4YWQsCisJCTB4ZTMsIDB4M2MsIDB4NTksIDB4YzcsIDB4MjUsIDB4ZmEsIDB4ODYsIDB4NjEsCisJCTB4NjEsIDB4YjQsIDB4ZGIsIDB4OGQsIDB4MWMsIDB4NDMsIDB4YTcsIDB4N2UsCisJCTB4OWEsIDB4NWYsIDB4MDYsIDB4ZjgsIDB4ZTAsIDB4MjUsIDB4MzksIDB4YzIsCisJfSwKKwl7CTB4MWQsIDB4ZjIsIDB4ZDgsIDB4ODQsIDB4YTYsIDB4M2YsIDB4N2IsIDB4NDEsCisJCTB4Y2EsIDB4NTksIDB4NjMsIDB4YmUsIDB4MDUsIDB4ZTAsIDB4OWMsIDB4MjcsCisJCTB4MjcsIDB4MWIsIDB4ZTQsIDB4NzEsIDB4NDksIDB4YWMsIDB4OGUsIDB4ZDIsCisJCTB4ZjAsIDB4YzYsIDB4OWEsIDB4MGQsIDB4M2YsIDB4NTMsIDB4NjUsIDB4YjgsCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGJveFszMl0gPSB7CisJMTYsICA3LCAyMCwgMjEsIDI5LCAxMiwgMjgsIDE3LCAgMSwgMTUsIDIzLCAyNiwgIDUsIDE4LCAzMSwgMTAsCisJIDIsICA4LCAyNCwgMTQsIDMyLCAyNywgIDMsICA5LCAxOSwgMTMsIDMwLCAgNiwgMjIsIDExLCAgNCwgMjUKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBiaXRzMzJbMzJdID0KK3sKKwkweDgwMDAwMDAwLCAweDQwMDAwMDAwLCAweDIwMDAwMDAwLCAweDEwMDAwMDAwLAorCTB4MDgwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDEwMDAwMDAsCisJMHgwMDgwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDIwMDAwMCwgMHgwMDEwMDAwMCwKKwkweDAwMDgwMDAwLCAweDAwMDQwMDAwLCAweDAwMDIwMDAwLCAweDAwMDEwMDAwLAorCTB4MDAwMDgwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDEwMDAsCisJMHgwMDAwMDgwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDEwMCwKKwkweDAwMDAwMDgwLCAweDAwMDAwMDQwLCAweDAwMDAwMDIwLCAweDAwMDAwMDEwLAorCTB4MDAwMDAwMDgsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDEKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdHM4WzhdID0geyAweDgwLCAweDQwLCAweDIwLCAweDEwLCAweDA4LCAweDA0LCAweDAyLCAweDAxIH07CisKKworc3RhdGljIGludAorYXNjaWlfdG9fYmluKGNoYXIgY2gpCit7CisJaWYgKGNoID4gJ3onKQorCQlyZXR1cm4gMDsKKwlpZiAoY2ggPj0gJ2EnKQorCQlyZXR1cm4gKGNoIC0gJ2EnICsgMzgpOworCWlmIChjaCA+ICdaJykKKwkJcmV0dXJuIDA7CisJaWYgKGNoID49ICdBJykKKwkJcmV0dXJuIChjaCAtICdBJyArIDEyKTsKKwlpZiAoY2ggPiAnOScpCisJCXJldHVybiAwOworCWlmIChjaCA+PSAnLicpCisJCXJldHVybiAoY2ggLSAnLicpOworCXJldHVybiAwOworfQorCisKKy8qIFN0YXRpYyBzdHVmZiB0aGF0IHN0YXlzIHJlc2lkZW50IGFuZCBkb2Vzbid0IGNoYW5nZSBhZnRlcgorICogYmVpbmcgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBuZWVkIHRvIGJlIG1hZGUKKyAqIHJlZW50cmFudC4gKi8KK3N0cnVjdCBjb25zdF9kZXNfY3R4IHsKKyNpZiBVU0VfaXBfbWFzaworCXVpbnQ4X3QJaW5pdF9wZXJtWzY0XTsgLyogcmVmZXJlbmNlZCAyIHRpbWVzICovCisjZW5kaWYKKwl1aW50OF90CWZpbmFsX3Blcm1bNjRdOyAvKiAyIHRpbWVzICovCisJdWludDhfdAltX3Nib3hbNF1bNDA5Nl07IC8qIDUgdGltZXMgKi8KK307CisjZGVmaW5lIEMgKCpjY3R4KQorI2RlZmluZSBpbml0X3Blcm0gIChDLmluaXRfcGVybSApCisjZGVmaW5lIGZpbmFsX3Blcm0gKEMuZmluYWxfcGVybSkKKyNkZWZpbmUgbV9zYm94ICAgICAoQy5tX3Nib3ggICAgKQorCitzdGF0aWMgc3RydWN0IGNvbnN0X2Rlc19jdHgqCitjb25zdF9kZXNfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGksIGosIGI7CisJc3RydWN0IGNvbnN0X2Rlc19jdHggKmNjdHg7CisKKyNpZiAhVVNFX1BSRUNPTVBVVEVEX3Vfc2JveAorCXVpbnQ4X3QJdV9zYm94WzhdWzY0XTsKKworCWNjdHggPSB4bWFsbG9jKHNpemVvZigqY2N0eCkpOworCisJLyogSW52ZXJ0IHRoZSBTLWJveGVzLCByZW9yZGVyaW5nIHRoZSBpbnB1dCBiaXRzLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKwkJCWIgPSAoaiAmIDB4MjApIHwgKChqICYgMSkgPDwgNCkgfCAoKGogPj4gMSkgJiAweGYpOworCQkJdV9zYm94W2ldW2pdID0gc2JveFtpXVtiXTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXHR7XHQiKTsKKwkJZm9yIChqID0gMDsgaiA8IDY0OyBqKz0yKQorCQkJZnByaW50ZihzdGRlcnIsICIgMHglMDJ4LCIsIHVfc2JveFtpXVtqXSArIHVfc2JveFtpXVtqKzFdKjE2KTsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0fSxcbiIpOworCX0KKwkvKgorCSAqIENvbnZlcnQgdGhlIGludmVydGVkIFMtYm94ZXMgaW50byA0IGFycmF5cyBvZiA4IGJpdHMuCisJICogRWFjaCB3aWxsIGhhbmRsZSAxMiBiaXRzIG9mIHRoZSBTLWJveCBpbnB1dC4KKwkgKi8KKwlmb3IgKGIgPSAwOyBiIDwgNDsgYisrKQorCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJCWZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorCQkJCW1fc2JveFtiXVsoaSA8PCA2KSB8IGpdID0KKwkJCQkJKHVpbnQ4X3QpKCh1X3Nib3hbKGIgPDwgMSldW2ldIDw8IDQpIHwKKwkJCQkJCXVfc2JveFsoYiA8PCAxKSArIDFdW2pdKTsKKyNlbHNlCisJY2N0eCA9IHhtYWxsb2Moc2l6ZW9mKCpjY3R4KSk7CisKKwkvKgorCSAqIENvbnZlcnQgdGhlIGludmVydGVkIFMtYm94ZXMgaW50byA0IGFycmF5cyBvZiA4IGJpdHMuCisJICogRWFjaCB3aWxsIGhhbmRsZSAxMiBiaXRzIG9mIHRoZSBTLWJveCBpbnB1dC4KKwkgKi8KKwlmb3IgKGIgPSAwOyBiIDwgNDsgYisrKQorCSBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisJCXVpbnQ4X3QgbG8sIGhpOworCQloaSA9IHVfc2JveFsoYiA8PCAxKV1baSAvIDJdOworCQlpZiAoIShpICYgMSkpCisJCQloaSA8PD0gNDsKKwkJbG8gPSB1X3Nib3hbKGIgPDwgMSkgKyAxXVtqIC8gMl07CisJCWlmIChqICYgMSkKKwkJCWxvID4+PSA0OworCQltX3Nib3hbYl1bKGkgPDwgNikgfCBqXSA9IChoaSAmIDB4ZjApIHwgKGxvICYgMHgwZik7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFNldCB1cCB0aGUgaW5pdGlhbCAmIGZpbmFsIHBlcm11dGF0aW9ucyBpbnRvIGEgdXNlZnVsIGZvcm0uCisJICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJZmluYWxfcGVybVtpXSA9IElQW2ldIC0gMTsKKyNpZiBVU0VfaXBfbWFzaworCQlpbml0X3Blcm1bZmluYWxfcGVybVtpXV0gPSAodWludDhfdClpOworI2VuZGlmCisJfQorCisJcmV0dXJuIGNjdHg7Cit9CisKKworc3RydWN0IGRlc19jdHggeworCWNvbnN0IHN0cnVjdCBjb25zdF9kZXNfY3R4ICpjb25zdF9jdHg7CisJdWludDMyX3Qgc2FsdGJpdHM7IC8qIHJlZmVyZW5jZWQgNSB0aW1lcyAqLworI2lmIFVTRV9SRVBFVElUSVZFX1NQRUVEVVAKKwl1aW50MzJfdCBvbGRfc2FsdDsgLyogMyB0aW1lcyAqLworCXVpbnQzMl90IG9sZF9yYXdrZXkwLCBvbGRfcmF3a2V5MTsgLyogMyB0aW1lcyBlYWNoICovCisjZW5kaWYKKwl1aW50OF90CXVuX3Bib3hbMzJdOyAvKiAyIHRpbWVzICovCisJdWludDhfdAlpbnZfY29tcF9wZXJtWzU2XTsgLyogMyB0aW1lcyAqLworCXVpbnQ4X3QJaW52X2tleV9wZXJtWzY0XTsgLyogMyB0aW1lcyAqLworCXVpbnQzMl90IGVuX2tleXNsWzE2XSwgZW5fa2V5c3JbMTZdOyAvKiAyIHRpbWVzIGVhY2ggKi8KKyNpZiBVU0VfZGVfa2V5cworCXVpbnQzMl90IGRlX2tleXNsWzE2XSwgZGVfa2V5c3JbMTZdOyAvKiAyIHRpbWVzIGVhY2ggKi8KKyNlbmRpZgorI2lmIFVTRV9pcF9tYXNrCisJdWludDMyX3QgaXBfbWFza2xbOF1bMjU2XSwgaXBfbWFza3JbOF1bMjU2XTsgLyogOSB0aW1lcyBlYWNoICovCisjZW5kaWYKKwl1aW50MzJfdCBmcF9tYXNrbFs4XVsyNTZdLCBmcF9tYXNrcls4XVsyNTZdOyAvKiA5IHRpbWVzIGVhY2ggKi8KKwl1aW50MzJfdCBrZXlfcGVybV9tYXNrbFs4XVsxMjhdLCBrZXlfcGVybV9tYXNrcls4XVsxMjhdOyAvKiA5IHRpbWVzICovCisJdWludDMyX3QgY29tcF9tYXNrbFs4XVsxMjhdLCBjb21wX21hc2tyWzhdWzEyOF07IC8qIDkgdGltZXMgZWFjaCAqLworCXVpbnQzMl90IHBzYm94WzRdWzI1Nl07IC8qIDUgdGltZXMgKi8KK307CisjZGVmaW5lIEQgKCpjdHgpCisjZGVmaW5lIGNvbnN0X2N0eCAgICAgICAoRC5jb25zdF9jdHggICAgICApCisjZGVmaW5lIHNhbHRiaXRzICAgICAgICAoRC5zYWx0Yml0cyAgICAgICApCisjZGVmaW5lIG9sZF9zYWx0ICAgICAgICAoRC5vbGRfc2FsdCAgICAgICApCisjZGVmaW5lIG9sZF9yYXdrZXkwICAgICAoRC5vbGRfcmF3a2V5MCAgICApCisjZGVmaW5lIG9sZF9yYXdrZXkxICAgICAoRC5vbGRfcmF3a2V5MSAgICApCisjZGVmaW5lIHVuX3Bib3ggICAgICAgICAoRC51bl9wYm94ICAgICAgICApCisjZGVmaW5lIGludl9jb21wX3Blcm0gICAoRC5pbnZfY29tcF9wZXJtICApCisjZGVmaW5lIGludl9rZXlfcGVybSAgICAoRC5pbnZfa2V5X3Blcm0gICApCisjZGVmaW5lIGVuX2tleXNsICAgICAgICAoRC5lbl9rZXlzbCAgICAgICApCisjZGVmaW5lIGVuX2tleXNyICAgICAgICAoRC5lbl9rZXlzciAgICAgICApCisjZGVmaW5lIGRlX2tleXNsICAgICAgICAoRC5kZV9rZXlzbCAgICAgICApCisjZGVmaW5lIGRlX2tleXNyICAgICAgICAoRC5kZV9rZXlzciAgICAgICApCisjZGVmaW5lIGlwX21hc2tsICAgICAgICAoRC5pcF9tYXNrbCAgICAgICApCisjZGVmaW5lIGlwX21hc2tyICAgICAgICAoRC5pcF9tYXNrciAgICAgICApCisjZGVmaW5lIGZwX21hc2tsICAgICAgICAoRC5mcF9tYXNrbCAgICAgICApCisjZGVmaW5lIGZwX21hc2tyICAgICAgICAoRC5mcF9tYXNrciAgICAgICApCisjZGVmaW5lIGtleV9wZXJtX21hc2tsICAoRC5rZXlfcGVybV9tYXNrbCApCisjZGVmaW5lIGtleV9wZXJtX21hc2tyICAoRC5rZXlfcGVybV9tYXNrciApCisjZGVmaW5lIGNvbXBfbWFza2wgICAgICAoRC5jb21wX21hc2tsICAgICApCisjZGVmaW5lIGNvbXBfbWFza3IgICAgICAoRC5jb21wX21hc2tyICAgICApCisjZGVmaW5lIHBzYm94ICAgICAgICAgICAoRC5wc2JveCAgICAgICAgICApCisKK3N0YXRpYyBzdHJ1Y3QgZGVzX2N0eCoKK2Rlc19pbml0KHN0cnVjdCBkZXNfY3R4ICpjdHgsIGNvbnN0IHN0cnVjdCBjb25zdF9kZXNfY3R4ICpjY3R4KQoreworCWludCBpLCBqLCBiLCBrLCBpbmJpdCwgb2JpdDsKKwl1aW50MzJfdCBwOworCWNvbnN0IHVpbnQzMl90ICpiaXRzMjgsICpiaXRzMjQ7CisKKwlpZiAoIWN0eCkKKwkJY3R4ID0geG1hbGxvYyhzaXplb2YoKmN0eCkpOworCWNvbnN0X2N0eCA9IGNjdHg7CisKKyNpZiBVU0VfUkVQRVRJVElWRV9TUEVFRFVQCisJb2xkX3Jhd2tleTAgPSBvbGRfcmF3a2V5MSA9IDA7CisJb2xkX3NhbHQgPSAwOworI2VuZGlmCisJc2FsdGJpdHMgPSAwOworCWJpdHMyOCA9IGJpdHMzMiArIDQ7CisJYml0czI0ID0gYml0czI4ICsgNDsKKworCS8qIEluaXRpYWxpc2UgdGhlIGludmVydGVkIGtleSBwZXJtdXRhdGlvbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpbnZfa2V5X3Blcm1baV0gPSAyNTU7CisJfQorCisJLyoKKwkgKiBJbnZlcnQgdGhlIGtleSBwZXJtdXRhdGlvbiBhbmQgaW5pdGlhbGlzZSB0aGUgaW52ZXJ0ZWQga2V5CisJICogY29tcHJlc3Npb24gcGVybXV0YXRpb24uCisJICovCisJZm9yIChpID0gMDsgaSA8IDU2OyBpKyspIHsKKwkJaW52X2tleV9wZXJtW2tleV9wZXJtW2ldIC0gMV0gPSAodWludDhfdClpOworCQlpbnZfY29tcF9wZXJtW2ldID0gMjU1OworCX0KKworCS8qIEludmVydCB0aGUga2V5IGNvbXByZXNzaW9uIHBlcm11dGF0aW9uLiAqLworCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CisJCWludl9jb21wX3Blcm1bY29tcF9wZXJtW2ldIC0gMV0gPSAodWludDhfdClpOworCX0KKworCS8qCisJICogU2V0IHVwIHRoZSBPUi1tYXNrIGFycmF5cyBmb3IgdGhlIGluaXRpYWwgYW5kIGZpbmFsIHBlcm11dGF0aW9ucywKKwkgKiBhbmQgZm9yIHRoZSBrZXkgaW5pdGlhbCBhbmQgY29tcHJlc3Npb24gcGVybXV0YXRpb25zLgorCSAqLworCWZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwkJdWludDMyX3QgaWwsIGlyOworCQl1aW50MzJfdCBmbCwgZnI7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworI2lmIFVTRV9pcF9tYXNrCisJCQlpbCA9IDA7CisJCQlpciA9IDA7CisjZW5kaWYKKwkJCWZsID0gMDsKKwkJCWZyID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQlpbmJpdCA9IDggKiBrICsgajsKKwkJCQlpZiAoaSAmIGJpdHM4W2pdKSB7CisjaWYgVVNFX2lwX21hc2sKKwkJCQkJb2JpdCA9IGluaXRfcGVybVtpbmJpdF07CisJCQkJCWlmIChvYml0IDwgMzIpCisJCQkJCQlpbCB8PSBiaXRzMzJbb2JpdF07CisJCQkJCWVsc2UKKwkJCQkJCWlyIHw9IGJpdHMzMltvYml0IC0gMzJdOworI2VuZGlmCisJCQkJCW9iaXQgPSBmaW5hbF9wZXJtW2luYml0XTsKKwkJCQkJaWYgKG9iaXQgPCAzMikKKwkJCQkJCWZsIHw9IGJpdHMzMltvYml0XTsKKwkJCQkJZWxzZQorCQkJCQkJZnIgfD0gYml0czMyW29iaXQgLSAzMl07CisJCQkJfQorCQkJfQorI2lmIFVTRV9pcF9tYXNrCisJCQlpcF9tYXNrbFtrXVtpXSA9IGlsOworCQkJaXBfbWFza3Jba11baV0gPSBpcjsKKyNlbmRpZgorCQkJZnBfbWFza2xba11baV0gPSBmbDsKKwkJCWZwX21hc2tyW2tdW2ldID0gZnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCQlpbCA9IDA7CisJCQlpciA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgNzsgaisrKSB7CisJCQkJaW5iaXQgPSA4ICogayArIGo7CisJCQkJaWYgKGkgJiBiaXRzOFtqICsgMV0pIHsKKwkJCQkJb2JpdCA9IGludl9rZXlfcGVybVtpbmJpdF07CisJCQkJCWlmIChvYml0ID09IDI1NSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAob2JpdCA8IDI4KQorCQkJCQkJaWwgfD0gYml0czI4W29iaXRdOworCQkJCQllbHNlCisJCQkJCQlpciB8PSBiaXRzMjhbb2JpdCAtIDI4XTsKKwkJCQl9CisJCQl9CisJCQlrZXlfcGVybV9tYXNrbFtrXVtpXSA9IGlsOworCQkJa2V5X3Blcm1fbWFza3Jba11baV0gPSBpcjsKKwkJCWlsID0gMDsKKwkJCWlyID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA3OyBqKyspIHsKKwkJCQlpbmJpdCA9IDcgKiBrICsgajsKKwkJCQlpZiAoaSAmIGJpdHM4W2ogKyAxXSkgeworCQkJCQlvYml0ID0gaW52X2NvbXBfcGVybVtpbmJpdF07CisJCQkJCWlmIChvYml0ID09IDI1NSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAob2JpdCA8IDI0KQorCQkJCQkJaWwgfD0gYml0czI0W29iaXRdOworCQkJCQllbHNlCisJCQkJCQlpciB8PSBiaXRzMjRbb2JpdCAtIDI0XTsKKwkJCQl9CisJCQl9CisJCQljb21wX21hc2tsW2tdW2ldID0gaWw7CisJCQljb21wX21hc2tyW2tdW2ldID0gaXI7CisJCX0KKwl9CisKKwkvKgorCSAqIEludmVydCB0aGUgUC1ib3ggcGVybXV0YXRpb24sIGFuZCBjb252ZXJ0IGludG8gT1ItbWFza3MgZm9yCisJICogaGFuZGxpbmcgdGhlIG91dHB1dCBvZiB0aGUgUy1ib3ggYXJyYXlzIHNldHVwIGFib3ZlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQl1bl9wYm94W3Bib3hbaV0gLSAxXSA9ICh1aW50OF90KWk7CisKKwlmb3IgKGIgPSAwOyBiIDwgNDsgYisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJcCA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkJaWYgKGkgJiBiaXRzOFtqXSkKKwkJCQkJcCB8PSBiaXRzMzJbdW5fcGJveFs4ICogYiArIGpdXTsKKwkJCX0KKwkJCXBzYm94W2JdW2ldID0gcDsKKwkJfQorCX0KKworCXJldHVybiBjdHg7Cit9CisKKworc3RhdGljIHZvaWQKK3NldHVwX3NhbHQoc3RydWN0IGRlc19jdHggKmN0eCwgdWludDMyX3Qgc2FsdCkKK3sKKwl1aW50MzJfdCBvYml0LCBzYWx0Yml0OworCWludCBpOworCisjaWYgVVNFX1JFUEVUSVRJVkVfU1BFRURVUAorCWlmIChzYWx0ID09IG9sZF9zYWx0KQorCQlyZXR1cm47CisJb2xkX3NhbHQgPSBzYWx0OworI2VuZGlmCisKKwlzYWx0Yml0cyA9IDA7CisJc2FsdGJpdCA9IDE7CisJb2JpdCA9IDB4ODAwMDAwOworCWZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKSB7CisJCWlmIChzYWx0ICYgc2FsdGJpdCkKKwkJCXNhbHRiaXRzIHw9IG9iaXQ7CisJCXNhbHRiaXQgPDw9IDE7CisJCW9iaXQgPj49IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAorZGVzX3NldGtleShzdHJ1Y3QgZGVzX2N0eCAqY3R4LCBjb25zdCBjaGFyICprZXkpCit7CisJdWludDMyX3QgazAsIGsxLCByYXdrZXkwLCByYXdrZXkxOworCWludCBzaGlmdHMsIHJvdW5kOworCisJcmF3a2V5MCA9IG50b2hsKCooY29uc3QgdWludDMyX3QgKikga2V5KTsKKwlyYXdrZXkxID0gbnRvaGwoKihjb25zdCB1aW50MzJfdCAqKSAoa2V5ICsgNCkpOworCisjaWYgVVNFX1JFUEVUSVRJVkVfU1BFRURVUAorCWlmICgocmF3a2V5MCB8IHJhd2tleTEpCisJICYmIHJhd2tleTAgPT0gb2xkX3Jhd2tleTAKKwkgJiYgcmF3a2V5MSA9PSBvbGRfcmF3a2V5MQorCSkgeworCQkvKgorCQkgKiBBbHJlYWR5IHNldHVwIGZvciB0aGlzIGtleS4KKwkJICogVGhpcyBvcHRpbWlzYXRpb24gZmFpbHMgb24gYSB6ZXJvIGtleSAod2hpY2ggaXMgd2VhayBhbmQKKwkJICogaGFzIGJhZCBwYXJpdHkgYW55d2F5KSBpbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgc3RhcnRpbmcKKwkJICogY29uZGl0aW9ucy4KKwkJICovCisJCXJldHVybjsKKwl9CisJb2xkX3Jhd2tleTAgPSByYXdrZXkwOworCW9sZF9yYXdrZXkxID0gcmF3a2V5MTsKKyNlbmRpZgorCisJLyoKKwkgKiBEbyBrZXkgcGVybXV0YXRpb24gYW5kIHNwbGl0IGludG8gdHdvIDI4LWJpdCBzdWJrZXlzLgorCSAqLworCWswID0ga2V5X3Blcm1fbWFza2xbMF1bcmF3a2V5MCA+PiAyNV0KKwkgICB8IGtleV9wZXJtX21hc2tsWzFdWyhyYXdrZXkwID4+IDE3KSAmIDB4N2ZdCisJICAgfCBrZXlfcGVybV9tYXNrbFsyXVsocmF3a2V5MCA+PiA5KSAmIDB4N2ZdCisJICAgfCBrZXlfcGVybV9tYXNrbFszXVsocmF3a2V5MCA+PiAxKSAmIDB4N2ZdCisJICAgfCBrZXlfcGVybV9tYXNrbFs0XVtyYXdrZXkxID4+IDI1XQorCSAgIHwga2V5X3Blcm1fbWFza2xbNV1bKHJhd2tleTEgPj4gMTcpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tsWzZdWyhyYXdrZXkxID4+IDkpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tsWzddWyhyYXdrZXkxID4+IDEpICYgMHg3Zl07CisJazEgPSBrZXlfcGVybV9tYXNrclswXVtyYXdrZXkwID4+IDI1XQorCSAgIHwga2V5X3Blcm1fbWFza3JbMV1bKHJhd2tleTAgPj4gMTcpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tyWzJdWyhyYXdrZXkwID4+IDkpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tyWzNdWyhyYXdrZXkwID4+IDEpICYgMHg3Zl0KKwkgICB8IGtleV9wZXJtX21hc2tyWzRdW3Jhd2tleTEgPj4gMjVdCisJICAgfCBrZXlfcGVybV9tYXNrcls1XVsocmF3a2V5MSA+PiAxNykgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza3JbNl1bKHJhd2tleTEgPj4gOSkgJiAweDdmXQorCSAgIHwga2V5X3Blcm1fbWFza3JbN11bKHJhd2tleTEgPj4gMSkgJiAweDdmXTsKKwkvKgorCSAqIFJvdGF0ZSBzdWJrZXlzIGFuZCBkbyBjb21wcmVzc2lvbiBwZXJtdXRhdGlvbi4KKwkgKi8KKwlzaGlmdHMgPSAwOworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDE2OyByb3VuZCsrKSB7CisJCXVpbnQzMl90IHQwLCB0MTsKKworCQlzaGlmdHMgKz0ga2V5X3NoaWZ0c1tyb3VuZF07CisKKwkJdDAgPSAoazAgPDwgc2hpZnRzKSB8IChrMCA+PiAoMjggLSBzaGlmdHMpKTsKKwkJdDEgPSAoazEgPDwgc2hpZnRzKSB8IChrMSA+PiAoMjggLSBzaGlmdHMpKTsKKworI2lmIFVTRV9kZV9rZXlzCisJCWRlX2tleXNsWzE1IC0gcm91bmRdID0KKyNlbmRpZgorCQllbl9rZXlzbFtyb3VuZF0gPSBjb21wX21hc2tsWzBdWyh0MCA+PiAyMSkgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrbFsxXVsodDAgPj4gMTQpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza2xbMl1bKHQwID4+IDcpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza2xbM11bdDAgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrbFs0XVsodDEgPj4gMjEpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza2xbNV1bKHQxID4+IDE0KSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tsWzZdWyh0MSA+PiA3KSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tsWzddW3QxICYgMHg3Zl07CisKKyNpZiBVU0VfZGVfa2V5cworCQlkZV9rZXlzclsxNSAtIHJvdW5kXSA9CisjZW5kaWYKKwkJZW5fa2V5c3Jbcm91bmRdID0gY29tcF9tYXNrclswXVsodDAgPj4gMjEpICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza3JbMV1bKHQwID4+IDE0KSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tyWzJdWyh0MCA+PiA3KSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tyWzNdW3QwICYgMHg3Zl0KKwkJCQl8IGNvbXBfbWFza3JbNF1bKHQxID4+IDIxKSAmIDB4N2ZdCisJCQkJfCBjb21wX21hc2tyWzVdWyh0MSA+PiAxNCkgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrcls2XVsodDEgPj4gNykgJiAweDdmXQorCQkJCXwgY29tcF9tYXNrcls3XVt0MSAmIDB4N2ZdOworCX0KK30KKworCitzdGF0aWMgdm9pZAorZG9fZGVzKHN0cnVjdCBkZXNfY3R4ICpjdHgsIC8qdWludDMyX3QgbF9pbiwgdWludDMyX3Qgcl9pbiwqLyB1aW50MzJfdCAqbF9vdXQsIHVpbnQzMl90ICpyX291dCwgaW50IGNvdW50KQoreworCWNvbnN0IHN0cnVjdCBjb25zdF9kZXNfY3R4ICpjY3R4ID0gY29uc3RfY3R4OworCS8qCisJICogbF9pbiwgcl9pbiwgbF9vdXQsIGFuZCByX291dCBhcmUgaW4gcHNldWRvLSJiaWctZW5kaWFuIiBmb3JtYXQuCisJICovCisJdWludDMyX3QgbCwgciwgKmtsLCAqa3I7CisJdWludDMyX3QgZiA9IGY7IC8qIHNpbGVuY2UgZ2NjICovCisJdWludDMyX3QgcjQ4bCwgcjQ4cjsKKwlpbnQgcm91bmQ7CisKKwkvKiBEbyBpbml0aWFsIHBlcm11dGF0aW9uIChJUCkuICovCisjaWYgVVNFX2lwX21hc2sKKwl1aW50MzJfdCBsX2luID0gMDsKKwl1aW50MzJfdCByX2luID0gMDsKKwlsID0gaXBfbWFza2xbMF1bbF9pbiA+PiAyNF0KKwkgIHwgaXBfbWFza2xbMV1bKGxfaW4gPj4gMTYpICYgMHhmZl0KKwkgIHwgaXBfbWFza2xbMl1bKGxfaW4gPj4gOCkgJiAweGZmXQorCSAgfCBpcF9tYXNrbFszXVtsX2luICYgMHhmZl0KKwkgIHwgaXBfbWFza2xbNF1bcl9pbiA+PiAyNF0KKwkgIHwgaXBfbWFza2xbNV1bKHJfaW4gPj4gMTYpICYgMHhmZl0KKwkgIHwgaXBfbWFza2xbNl1bKHJfaW4gPj4gOCkgJiAweGZmXQorCSAgfCBpcF9tYXNrbFs3XVtyX2luICYgMHhmZl07CisJciA9IGlwX21hc2tyWzBdW2xfaW4gPj4gMjRdCisJICB8IGlwX21hc2tyWzFdWyhsX2luID4+IDE2KSAmIDB4ZmZdCisJICB8IGlwX21hc2tyWzJdWyhsX2luID4+IDgpICYgMHhmZl0KKwkgIHwgaXBfbWFza3JbM11bbF9pbiAmIDB4ZmZdCisJICB8IGlwX21hc2tyWzRdW3JfaW4gPj4gMjRdCisJICB8IGlwX21hc2tyWzVdWyhyX2luID4+IDE2KSAmIDB4ZmZdCisJICB8IGlwX21hc2tyWzZdWyhyX2luID4+IDgpICYgMHhmZl0KKwkgIHwgaXBfbWFza3JbN11bcl9pbiAmIDB4ZmZdOworI2VsaWYgMCAvKiAtNjUgYnl0ZXMgKHVzaW5nIHRoZSBmYWN0IHRoYXQgbF9pbiA9PSByX2luID09IDApICovCisJbCA9IHIgPSAwOworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDg7IHJvdW5kKyspIHsKKwkJbCB8PSBpcF9tYXNrbFtyb3VuZF1bMF07CisJCXIgfD0gaXBfbWFza3Jbcm91bmRdWzBdOworCX0KKwliYl9lcnJvcl9tc2coImw6JXggcjoleCIsIGwsIHIpOyAvKiByZXBvcnRzIDAsIDAgYWx3YXlzISAqLworI2Vsc2UgLyogdXNpbmcgdGhlIGZhY3QgdGhhdCBpcF9tYXNrWFtdIGlzIGNvbnN0YW50ICh3cml0dGVuIHRvIGJ5IGRlc19pbml0KSAqLworCWwgPSByID0gMDsKKyNlbmRpZgorCisJZG8geworCQkvKiBEbyBlYWNoIHJvdW5kLiAqLworCQlrbCA9IGVuX2tleXNsOworCQlrciA9IGVuX2tleXNyOworCQlyb3VuZCA9IDE2OworCQlkbyB7CisJCQkvKiBFeHBhbmQgUiB0byA0OCBiaXRzIChzaW11bGF0ZSB0aGUgRS1ib3gpLiAqLworCQkJcjQ4bAk9ICgociAmIDB4MDAwMDAwMDEpIDw8IDIzKQorCQkJCXwgKChyICYgMHhmODAwMDAwMCkgPj4gOSkKKwkJCQl8ICgociAmIDB4MWY4MDAwMDApID4+IDExKQorCQkJCXwgKChyICYgMHgwMWY4MDAwMCkgPj4gMTMpCisJCQkJfCAoKHIgJiAweDAwMWY4MDAwKSA+PiAxNSk7CisKKwkJCXI0OHIJPSAoKHIgJiAweDAwMDFmODAwKSA8PCA3KQorCQkJCXwgKChyICYgMHgwMDAwMWY4MCkgPDwgNSkKKwkJCQl8ICgociAmIDB4MDAwMDAxZjgpIDw8IDMpCisJCQkJfCAoKHIgJiAweDAwMDAwMDFmKSA8PCAxKQorCQkJCXwgKChyICYgMHg4MDAwMDAwMCkgPj4gMzEpOworCQkJLyoKKwkJCSAqIERvIHNhbHRpbmcgZm9yIGNyeXB0KCkgYW5kIGZyaWVuZHMsIGFuZAorCQkJICogWE9SIHdpdGggdGhlIHBlcm11dGVkIGtleS4KKwkJCSAqLworCQkJZiA9IChyNDhsIF4gcjQ4cikgJiBzYWx0Yml0czsKKwkJCXI0OGwgXj0gZiBeICprbCsrOworCQkJcjQ4ciBePSBmIF4gKmtyKys7CisJCQkvKgorCQkJICogRG8gc2JveCBsb29rdXBzICh3aGljaCBzaHJpbmsgaXQgYmFjayB0byAzMiBiaXRzKQorCQkJICogYW5kIGRvIHRoZSBwYm94IHBlcm11dGF0aW9uIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkgKi8KKwkJCWYgPSBwc2JveFswXVttX3Nib3hbMF1bcjQ4bCA+PiAxMl1dCisJCQkgIHwgcHNib3hbMV1bbV9zYm94WzFdW3I0OGwgJiAweGZmZl1dCisJCQkgIHwgcHNib3hbMl1bbV9zYm94WzJdW3I0OHIgPj4gMTJdXQorCQkJICB8IHBzYm94WzNdW21fc2JveFszXVtyNDhyICYgMHhmZmZdXTsKKwkJCS8qIE5vdyB0aGF0IHdlJ3ZlIHBlcm11dGVkIHRoaW5ncywgY29tcGxldGUgZigpLiAqLworCQkJZiBePSBsOworCQkJbCA9IHI7CisJCQlyID0gZjsKKwkJfSB3aGlsZSAoLS1yb3VuZCk7CisJCXIgPSBsOworCQlsID0gZjsKKwl9IHdoaWxlICgtLWNvdW50KTsKKworCS8qIERvIGZpbmFsIHBlcm11dGF0aW9uIChpbnZlcnNlIG9mIElQKS4gKi8KKwkqbF9vdXQJPSBmcF9tYXNrbFswXVtsID4+IDI0XQorCQl8IGZwX21hc2tsWzFdWyhsID4+IDE2KSAmIDB4ZmZdCisJCXwgZnBfbWFza2xbMl1bKGwgPj4gOCkgJiAweGZmXQorCQl8IGZwX21hc2tsWzNdW2wgJiAweGZmXQorCQl8IGZwX21hc2tsWzRdW3IgPj4gMjRdCisJCXwgZnBfbWFza2xbNV1bKHIgPj4gMTYpICYgMHhmZl0KKwkJfCBmcF9tYXNrbFs2XVsociA+PiA4KSAmIDB4ZmZdCisJCXwgZnBfbWFza2xbN11bciAmIDB4ZmZdOworCSpyX291dAk9IGZwX21hc2tyWzBdW2wgPj4gMjRdCisJCXwgZnBfbWFza3JbMV1bKGwgPj4gMTYpICYgMHhmZl0KKwkJfCBmcF9tYXNrclsyXVsobCA+PiA4KSAmIDB4ZmZdCisJCXwgZnBfbWFza3JbM11bbCAmIDB4ZmZdCisJCXwgZnBfbWFza3JbNF1bciA+PiAyNF0KKwkJfCBmcF9tYXNrcls1XVsociA+PiAxNikgJiAweGZmXQorCQl8IGZwX21hc2tyWzZdWyhyID4+IDgpICYgMHhmZl0KKwkJfCBmcF9tYXNrcls3XVtyICYgMHhmZl07Cit9CisKKyNkZWZpbmUgREVTX09VVF9CVUZTSVpFIDIxCisKK3N0YXRpYyB2b2lkCit0bzY0X21zYl9maXJzdChjaGFyICpzLCB1bnNpZ25lZCB2KQoreworI2lmIDAKKwkqcysrID0gYXNjaWk2NFsodiA+PiAxOCkgJiAweDNmXTsgLyogYml0cyAyMy4uMTggKi8KKwkqcysrID0gYXNjaWk2NFsodiA+PiAxMikgJiAweDNmXTsgLyogYml0cyAxNy4uMTIgKi8KKwkqcysrID0gYXNjaWk2NFsodiA+PiA2KSAmIDB4M2ZdOyAvKiBiaXRzIDExLi42ICovCisJKnMgICA9IGFzY2lpNjRbdiAmIDB4M2ZdOyAvKiBiaXRzIDUuLjAgKi8KKyNlbmRpZgorCSpzKysgPSBpNjRjKHYgPj4gMTgpOyAvKiBiaXRzIDIzLi4xOCAqLworCSpzKysgPSBpNjRjKHYgPj4gMTIpOyAvKiBiaXRzIDE3Li4xMiAqLworCSpzKysgPSBpNjRjKHYgPj4gNik7IC8qIGJpdHMgMTEuLjYgKi8KKwkqcyAgID0gaTY0Yyh2KTsgLyogYml0cyA1Li4wICovCit9CisKK3N0YXRpYyBjaGFyICoKK05PSU5MSU5FCitkZXNfY3J5cHQoc3RydWN0IGRlc19jdHggKmN0eCwgY2hhciBvdXRwdXRbREVTX09VVF9CVUZTSVpFXSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXR0aW5nKQoreworCXVpbnQzMl90IHNhbHQsIHIwLCByMSwga2V5YnVmWzJdOworCXVpbnQ4X3QgKnE7CisKKwkvKgorCSAqIENvcHkgdGhlIGtleSwgc2hpZnRpbmcgZWFjaCBjaGFyYWN0ZXIgdXAgYnkgb25lIGJpdAorCSAqIGFuZCBwYWRkaW5nIHdpdGggemVyb3MuCisJICovCisJcSA9ICh1aW50OF90ICopa2V5YnVmOworCXdoaWxlIChxIC0gKHVpbnQ4X3QgKilrZXlidWYgIT0gOCkgeworCQkqcSA9ICprZXkgPDwgMTsKKwkJaWYgKCpxKQorCQkJa2V5Kys7CisJCXErKzsKKwl9CisJZGVzX3NldGtleShjdHgsIChjaGFyICopa2V5YnVmKTsKKworCS8qCisJICogc2V0dGluZyAtIDIgYnl0ZXMgb2Ygc2FsdAorCSAqIGtleSAtIHVwIHRvIDggY2hhcmFjdGVycworCSAqLworCXNhbHQgPSAoYXNjaWlfdG9fYmluKHNldHRpbmdbMV0pIDw8IDYpCisJICAgICB8ICBhc2NpaV90b19iaW4oc2V0dGluZ1swXSk7CisKKwlvdXRwdXRbMF0gPSBzZXR0aW5nWzBdOworCS8qCisJICogSWYgdGhlIGVuY3J5cHRlZCBwYXNzd29yZCB0aGF0IHRoZSBzYWx0IHdhcyBleHRyYWN0ZWQgZnJvbQorCSAqIGlzIG9ubHkgMSBjaGFyYWN0ZXIgbG9uZywgdGhlIHNhbHQgd2lsbCBiZSBjb3JydXB0ZWQuICBXZQorCSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBzdHJpbmcgZG9lc24ndCBoYXZlIGFuIGV4dHJhCisJICogTlVMIGluIGl0IQorCSAqLworCW91dHB1dFsxXSA9IHNldHRpbmdbMV0gPyBzZXR0aW5nWzFdIDogb3V0cHV0WzBdOworCisJc2V0dXBfc2FsdChjdHgsIHNhbHQpOworCS8qIERvIGl0LiAqLworCWRvX2RlcyhjdHgsIC8qMCwgMCwqLyAmcjAsICZyMSwgMjUgLyogY291bnQgKi8pOworCisJLyogTm93IGVuY29kZSB0aGUgcmVzdWx0LiAqLworI2lmIDAKK3sKKwl1aW50MzJfdCBsID0gKHIwID4+IDgpOworCXEgPSAodWludDhfdCAqKW91dHB1dCArIDI7CisJKnErKyA9IGFzY2lpNjRbKGwgPj4gMTgpICYgMHgzZl07IC8qIGJpdHMgMzEuLjI2IG9mIHIwICovCisJKnErKyA9IGFzY2lpNjRbKGwgPj4gMTIpICYgMHgzZl07IC8qIGJpdHMgMjUuLjIwIG9mIHIwICovCisJKnErKyA9IGFzY2lpNjRbKGwgPj4gNikgJiAweDNmXTsgLyogYml0cyAxOS4uMTQgb2YgcjAgKi8KKwkqcSsrID0gYXNjaWk2NFtsICYgMHgzZl07IC8qIGJpdHMgMTMuLjggb2YgcjAgKi8KKwlsID0gKChyMCA8PCAxNikgfCAocjEgPj4gMTYpKTsKKwkqcSsrID0gYXNjaWk2NFsobCA+PiAxOCkgJiAweDNmXTsgLyogYml0cyA3Li4yIG9mIHIwICovCisJKnErKyA9IGFzY2lpNjRbKGwgPj4gMTIpICYgMHgzZl07IC8qIGJpdHMgMS4uMiBvZiByMCBhbmQgMzEuLjI4IG9mIHIxICovCisJKnErKyA9IGFzY2lpNjRbKGwgPj4gNikgJiAweDNmXTsgLyogYml0cyAyNy4uMjIgb2YgcjEgKi8KKwkqcSsrID0gYXNjaWk2NFtsICYgMHgzZl07IC8qIGJpdHMgMjEuLjE2IG9mIHIxICovCisJbCA9IHIxIDw8IDI7CisJKnErKyA9IGFzY2lpNjRbKGwgPj4gMTIpICYgMHgzZl07IC8qIGJpdHMgMTUuLjEwIG9mIHIxICovCisJKnErKyA9IGFzY2lpNjRbKGwgPj4gNikgJiAweDNmXTsgLyogYml0cyA5Li40IG9mIHIxICovCisJKnErKyA9IGFzY2lpNjRbbCAmIDB4M2ZdOyAvKiBiaXRzIDMuLjAgb2YgcjEgKyAwMCAqLworCSpxID0gMDsKK30KKyNlbHNlCisJLyogRWFjaCBjYWxsIHRha2VzIGxvdy1vcmRlciAyNCBiaXRzIGFuZCBzdG9yZXMgNCBjaGFycyAqLworCS8qIGJpdHMgMzEuLjggb2YgcjAgKi8KKwl0bzY0X21zYl9maXJzdChvdXRwdXQgKyAyLCAocjAgPj4gOCkpOworCS8qIGJpdHMgNy4uMCBvZiByMCBhbmQgMzEuLjE2IG9mIHIxICovCisJdG82NF9tc2JfZmlyc3Qob3V0cHV0ICsgNiwgKHIwIDw8IDE2KSB8IChyMSA+PiAxNikpOworCS8qIGJpdHMgMTUuLjAgb2YgcjEgYW5kIHR3byB6ZXJvIGJpdHMgKHBsdXMgZXh0cmEgemVybyBieXRlKSAqLworCXRvNjRfbXNiX2ZpcnN0KG91dHB1dCArIDEwLCAocjEgPDwgOCkpOworCS8qIGV4dHJhIHplcm8gYnl0ZSBpcyBlbmNvZGVkIGFzICcuJywgZml4aW5nIGl0ICovCisJb3V0cHV0WzEzXSA9ICdcMCc7CisjZW5kaWYKKworCXJldHVybiBvdXRwdXQ7Cit9CisKKyN1bmRlZiBVU0VfUFJFQ09NUFVURURfdV9zYm94CisjdW5kZWYgVVNFX1JFUEVUSVRJVkVfU1BFRURVUAorI3VuZGVmIFVTRV9pcF9tYXNrCisjdW5kZWYgVVNFX2RlX2tleXMKKworI3VuZGVmIEMKKyN1bmRlZiBpbml0X3Blcm0KKyN1bmRlZiBmaW5hbF9wZXJtCisjdW5kZWYgbV9zYm94CisjdW5kZWYgRAorI3VuZGVmIGNvbnN0X2N0eAorI3VuZGVmIHNhbHRiaXRzCisjdW5kZWYgb2xkX3NhbHQKKyN1bmRlZiBvbGRfcmF3a2V5MAorI3VuZGVmIG9sZF9yYXdrZXkxCisjdW5kZWYgdW5fcGJveAorI3VuZGVmIGludl9jb21wX3Blcm0KKyN1bmRlZiBpbnZfa2V5X3Blcm0KKyN1bmRlZiBlbl9rZXlzbAorI3VuZGVmIGVuX2tleXNyCisjdW5kZWYgZGVfa2V5c2wKKyN1bmRlZiBkZV9rZXlzcgorI3VuZGVmIGlwX21hc2tsCisjdW5kZWYgaXBfbWFza3IKKyN1bmRlZiBmcF9tYXNrbAorI3VuZGVmIGZwX21hc2tyCisjdW5kZWYga2V5X3Blcm1fbWFza2wKKyN1bmRlZiBrZXlfcGVybV9tYXNrcgorI3VuZGVmIGNvbXBfbWFza2wKKyN1bmRlZiBjb21wX21hc2tyCisjdW5kZWYgcHNib3gKZGlmZiAtLWdpdCBhL2xpYmJiL3B3X2VuY3J5cHRfbWQ1LmMgYi9saWJiYi9wd19lbmNyeXB0X21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWUwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wd19lbmNyeXB0X21kNS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTUQ1Qy5DIC0gUlNBIERhdGEgU2VjdXJpdHksIEluYy4sIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKKyAqIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCBpdAorICogaXMgaWRlbnRpZmllZCBhcyB0aGUgIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdAorICogQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGlzIHNvZnR3YXJlCisgKiBvciB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIExpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzIHByb3ZpZGVkCisgKiB0aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBIERhdGEKKyAqIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbAorICogbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLgorICoKKyAqIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nIGVpdGhlcgorICogdGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuCisgKgorICogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcworICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igc29mdHdhcmUuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGlibWQvbWQ1Yy5jLHYgMS45LjIuMSAxOTk5LzA4LzI5IDE0OjU3OjEyIHBldGVyIEV4cCAkCisgKgorICogVGhpcyBjb2RlIGlzIHRoZSBzYW1lIGFzIHRoZSBjb2RlIHB1Ymxpc2hlZCBieSBSU0EgSW5jLiAgSXQgaGFzIGJlZW4KKyAqIGVkaXRlZCBmb3IgY2xhcml0eSBhbmQgc3R5bGUgb25seS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgbWQ1X2NyeXB0KCkgZnVuY3Rpb24gd2FzIHRha2VuIGZyb20gZnJlZUJTRCdzIGxpYmNyeXB0IGFuZCBjb250YWlucworICogdGhpcyBsaWNlbnNlOgorICogICAgIlRIRSBCRUVSLVdBUkUgTElDRU5TRSIgKFJldmlzaW9uIDQyKToKKyAqICAgICA8cGhrQGxvZ2luLmRrbmV0LmRrPiB3cm90ZSB0aGlzIGZpbGUuICBBcyBsb25nIGFzIHlvdSByZXRhaW4gdGhpcyBub3RpY2UgeW91CisgKiAgICAgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBzdHVmZi4gSWYgd2UgbWVldCBzb21lIGRheSwgYW5kIHlvdSB0aGluaworICogICAgIHRoaXMgc3R1ZmYgaXMgd29ydGggaXQsIHlvdSBjYW4gYnV5IG1lIGEgYmVlciBpbiByZXR1cm4uICAgUG91bC1IZW5uaW5nIEthbXAKKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjcnlwdC9jcnlwdC5jLHYgMS43LjIuMSAxOTk5LzA4LzI5IDE0OjU2OjMzIHBldGVyIEV4cCAkCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT24gQXByaWwgMTl0aCwgMjAwMSBtZDVfY3J5cHQoKSB3YXMgbW9kaWZpZWQgdG8gbWFrZSBpdCByZWVudHJhbnQKKyAqIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQHVjbGliYy5vcmc+CisgKgorICoKKyAqIEp1bmUgMjgsIDIwMDEgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqICJVbi1pbmxpbmVkIiBjb2RlIHVzaW5nIGxvb3BzIGFuZCBzdGF0aWMgY29uc3QgdGFibGVzIGluIG9yZGVyIHRvCisgKiByZWR1Y2UgZ2VuZXJhdGVkIGNvZGUgc2l6ZSAob24gaTM4NiBmcm9tIGFwcHJveCA0ayB0byBhcHByb3ggMi41aykuCisgKgorICogSnVuZSAyOSwgMjAwMSAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogQ29tcGxldGVseSByZW1vdmVkIHN0YXRpYyBQQURESU5HIGFycmF5LgorICoKKyAqIFJlaW50cm9kdWNlZCB0aGUgbG9vcCB1bnJvbGxpbmcgaW4gTUQ1X1RyYW5zZm9ybSBhbmQgYWRkZWQgdGhlCisgKiBNRDVfU0laRV9PVkVSX1NQRUVEIG9wdGlvbiBmb3IgY29uZmlndXJhYmlsaXR5LiAgRGVmaW5lIGJlbG93IGFzOgorICogICAgICAgMCAgICBmdWxseSB1bnJvbGxlZCBsb29wcworICogICAgICAgMSAgICBwYXJ0aWFsbHkgdW5yb2xsZWQgKDQgb3BzIHBlciBsb29wKQorICogICAgICAgMiAgICBubyB1bnJvbGxpbmcgLS0gaW50cm9kdWNlcyB0aGUgbmVlZCB0byBzd2FwIDQgdmFyaWFibGVzIChzbG93KQorICogICAgICAgMyAgICBubyB1bnJvbGxpbmcgYW5kIGFsbCA0IGxvb3BzIG1lcmdlZCBpbnRvIG9uZSB3aXRoIHN3aXRjaAorICogICAgICAgICAgICAgICBpbiBlYWNoIGxvb3AgKGdsYWNpYWwpCisgKiBPbiBpMzg2LCBzaXplcyBhcmUgcm91Z2hseSAoLU9zIC1mbm8tYnVpbHRpbik6CisgKiAgICAgMDogM2sgICAgIDE6IDIuNWsgICAgIDI6IDIuMmsgICAgIDM6IDJrCisgKgorICogU2luY2UgU3VTdjMgZG9lcyBub3QgcmVxdWlyZSBjcnlwdF9yLCBtb2RpZmllZCBhZ2FpbiBBdWd1c3QgNywgMjAwMgorICogYnkgRXJpayBBbmRlcnNlbiB0byByZW1vdmUgcmVlbnRyYW5jZSBzdHVmZi4uLgorICovCisKKy8qCisgKiBVTklYIHBhc3N3b3JkCisgKgorICogVXNlIE1ENSBmb3Igd2hhdCBpdCBpcyBiZXN0IGF0Li4uCisgKi8KKyNkZWZpbmUgTUQ1X09VVF9CVUZTSVpFIDM2CitzdGF0aWMgY2hhciAqCitOT0lOTElORQorbWQ1X2NyeXB0KGNoYXIgcmVzdWx0W01ENV9PVVRfQlVGU0laRV0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB3LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0KQoreworCWNoYXIgKnA7CisJdW5zaWduZWQgY2hhciBmaW5hbFsxN107IC8qIGZpbmFsWzE2XSBleGlzdHMgb25seSB0byBhaWQgaW4gbG9vcGluZyAqLworCWludCBzbCwgcGwsIGksIHB3X2xlbjsKKwltZDVfY3R4X3QgY3R4LCBjdHgxOworCisJLyogTkI6IGluIGJ1c3lib3gsICIkMSQiIGluIHNhbHQgaXMgYWx3YXlzIHByZXNlbnQgKi8KKworCS8qIFJlZmluZSB0aGUgU2FsdCBmaXJzdCAqLworCisJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIHNhbHQgaW5jbHVkaW5nICIkMSQiICovCisJc2wgPSAzOworCXdoaWxlIChzYWx0W3NsXSAmJiBzYWx0W3NsXSAhPSAnJCcgJiYgc2wgPCAoMyArIDgpKQorCQlzbCsrOworCisJLyogSGFzaC4gdGhlIHBhc3N3b3JkIGZpcnN0LCBzaW5jZSB0aGF0IGlzIHdoYXQgaXMgbW9zdCB1bmtub3duICovCisJbWQ1X2JlZ2luKCZjdHgpOworCXB3X2xlbiA9IHN0cmxlbigoY2hhciopcHcpOworCW1kNV9oYXNoKCZjdHgsIHB3LCBwd19sZW4pOworCisJLyogVGhlbiB0aGUgc2FsdCBpbmNsdWRpbmcgIiQxJCIgKi8KKwltZDVfaGFzaCgmY3R4LCBzYWx0LCBzbCk7CisKKwkvKiBDb3B5IHNhbHQgdG8gcmVzdWx0OyBza2lwICIkMSQiICovCisJbWVtY3B5KHJlc3VsdCwgc2FsdCwgc2wpOworCXJlc3VsdFtzbF0gPSAnJCc7CisJc2FsdCArPSAzOworCXNsIC09IDM7CisKKwkvKiBUaGVuIGp1c3QgYXMgbWFueSBjaGFyYWN0ZXJzIG9mIHRoZSBNRDUocHcsIHNhbHQsIHB3KSAqLworCW1kNV9iZWdpbigmY3R4MSk7CisJbWQ1X2hhc2goJmN0eDEsIHB3LCBwd19sZW4pOworCW1kNV9oYXNoKCZjdHgxLCBzYWx0LCBzbCk7CisJbWQ1X2hhc2goJmN0eDEsIHB3LCBwd19sZW4pOworCW1kNV9lbmQoJmN0eDEsIGZpbmFsKTsKKwlmb3IgKHBsID0gcHdfbGVuOyBwbCA+IDA7IHBsIC09IDE2KQorCQltZDVfaGFzaCgmY3R4LCBmaW5hbCwgcGwgPiAxNiA/IDE2IDogcGwpOworCisJLyogVGhlbiBzb21ldGhpbmcgcmVhbGx5IHdlaXJkLi4uICovCisJbWVtc2V0KGZpbmFsLCAwLCBzaXplb2YoZmluYWwpKTsKKwlmb3IgKGkgPSBwd19sZW47IGk7IGkgPj49IDEpIHsKKwkJbWQ1X2hhc2goJmN0eCwgKChpICYgMSkgPyBmaW5hbCA6IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHB3KSwgMSk7CisJfQorCW1kNV9lbmQoJmN0eCwgZmluYWwpOworCisJLyogQW5kIG5vdywganVzdCB0byBtYWtlIHN1cmUgdGhpbmdzIGRvbid0IHJ1biB0b28gZmFzdC4KKwkgKiBPbiBhIDYwIE1oeiBQZW50aXVtIHRoaXMgdGFrZXMgMzQgbXNlYywgc28geW91IHdvdWxkCisJICogbmVlZCAzMCBzZWNvbmRzIHRvIGJ1aWxkIGEgMTAwMCBlbnRyeSBkaWN0aW9uYXJ5Li4uCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQltZDVfYmVnaW4oJmN0eDEpOworCQlpZiAoaSAmIDEpCisJCQltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisJCWVsc2UKKwkJCW1kNV9oYXNoKCZjdHgxLCBmaW5hbCwgMTYpOworCisJCWlmIChpICUgMykKKwkJCW1kNV9oYXNoKCZjdHgxLCBzYWx0LCBzbCk7CisKKwkJaWYgKGkgJSA3KQorCQkJbWQ1X2hhc2goJmN0eDEsIHB3LCBwd19sZW4pOworCisJCWlmIChpICYgMSkKKwkJCW1kNV9oYXNoKCZjdHgxLCBmaW5hbCwgMTYpOworCQllbHNlCisJCQltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisJCW1kNV9lbmQoJmN0eDEsIGZpbmFsKTsKKwl9CisKKwlwID0gcmVzdWx0ICsgc2wgKyA0OyAvKiAxMiBieXRlcyBtYXggKHNsIGlzIHVwIHRvIDggYnl0ZXMpICovCisKKwkvKiBBZGQgNSo0KzIgPSAyMiBieXRlcyBvZiBoYXNoLCArIE5VTCBieXRlLiAqLworCWZpbmFsWzE2XSA9IGZpbmFsWzVdOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdW5zaWduZWQgbCA9IChmaW5hbFtpXSA8PCAxNikgfCAoZmluYWxbaSs2XSA8PCA4KSB8IGZpbmFsW2krMTJdOworCQlwID0gdG82NChwLCBsLCA0KTsKKwl9CisJcCA9IHRvNjQocCwgZmluYWxbMTFdLCAyKTsKKwkqcCA9ICdcMCc7CisKKwkvKiBEb24ndCBsZWF2ZSBhbnl0aGluZyBhcm91bmQgaW4gdm0gdGhleSBjb3VsZCB1c2UuICovCisJbWVtc2V0KGZpbmFsLCAwLCBzaXplb2YoZmluYWwpKTsKKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wd19lbmNyeXB0X3NoYS5jIGIvbGliYmIvcHdfZW5jcnlwdF9zaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVhYWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHdfZW5jcnlwdF9zaGEuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogU0hBMjU2IGFuZCBTSEE1MTItYmFzZWQgVW5peCBjcnlwdCBpbXBsZW1lbnRhdGlvbi4KKyAqIFJlbGVhc2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4uCisgKi8KKworLyogUHJlZml4IGZvciBvcHRpb25hbCByb3VuZHMgc3BlY2lmaWNhdGlvbi4gICovCitzdGF0aWMgY29uc3QgY2hhciBzdHJfcm91bmRzW10gQUxJR04xID0gInJvdW5kcz0ldSQiOworCisvKiBNYXhpbXVtIHNhbHQgc3RyaW5nIGxlbmd0aC4gICovCisjZGVmaW5lIFNBTFRfTEVOX01BWCAxNgorLyogRGVmYXVsdCBudW1iZXIgb2Ygcm91bmRzIGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC4gICovCisjZGVmaW5lIFJPVU5EU19ERUZBVUxUIDUwMDAKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHJvdW5kcy4gICovCisjZGVmaW5lIFJPVU5EU19NSU4gMTAwMAorLyogTWF4aW11bSBudW1iZXIgb2Ygcm91bmRzLiAgKi8KKyNkZWZpbmUgUk9VTkRTX01BWCA5OTk5OTk5OTkKKworc3RhdGljIGNoYXIgKgorTk9JTkxJTkUKK3NoYV9jcnlwdCgvKmNvbnN0Ki8gY2hhciAqa2V5X2RhdGEsIC8qY29uc3QqLyBjaGFyICpzYWx0X2RhdGEpCit7CisJdm9pZCAoKnNoYV9iZWdpbikodm9pZCAqY3R4KSBGQVNUX0ZVTkM7CisJdm9pZCAoKnNoYV9oYXNoKSh2b2lkICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikgRkFTVF9GVU5DOworCXZvaWQgKCpzaGFfZW5kKSh2b2lkICpjdHgsIHZvaWQgKnJlc2J1ZikgRkFTVF9GVU5DOworCWludCBfMzJvcjY0OworCisJY2hhciAqcmVzdWx0LCAqcmVzcHRyOworCisJLyogYnR3LCBzaGEyNTYgbmVlZHMgWzMyXSBhbmQgdWludDMyX3Qgb25seSAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgYWx0X3Jlc3VsdFs2NF07CisJCXVuc2lnbmVkIGNoYXIgdGVtcF9yZXN1bHRbNjRdOworCQl1bmlvbiB7CisJCQlzaGEyNTZfY3R4X3QgeDsKKwkJCXNoYTUxMl9jdHhfdCB5OworCQl9IGN0eDsKKwkJdW5pb24geworCQkJc2hhMjU2X2N0eF90IHg7CisJCQlzaGE1MTJfY3R4X3QgeTsKKwkJfSBhbHRfY3R4OworCX0gTCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhfX2FsaWdub2ZfXyh1aW50NjRfdCkpKSk7CisjZGVmaW5lIGFsdF9yZXN1bHQgIChMLmFsdF9yZXN1bHQgKQorI2RlZmluZSB0ZW1wX3Jlc3VsdCAoTC50ZW1wX3Jlc3VsdCkKKyNkZWZpbmUgY3R4ICAgICAgICAgKEwuY3R4ICAgICAgICApCisjZGVmaW5lIGFsdF9jdHggICAgIChMLmFsdF9jdHggICAgKQorCXVuc2lnbmVkIHNhbHRfbGVuOworCXVuc2lnbmVkIGtleV9sZW47CisJdW5zaWduZWQgY250OworCXVuc2lnbmVkIHJvdW5kczsKKwljaGFyICpjcDsKKwljaGFyIGlzX3NoYTUxMjsKKworCS8qIEFuYWx5emUgc2FsdCwgY29uc3RydWN0IGFscmVhZHkga25vd24gcGFydCBvZiByZXN1bHQgKi8KKwljbnQgPSBzdHJsZW4oc2FsdF9kYXRhKSArIDEgKyA0MyArIDE7CisJaXNfc2hhNTEyID0gc2FsdF9kYXRhWzFdOworCWlmIChpc19zaGE1MTIgPT0gJzYnKQorCQljbnQgKz0gNDM7CisJcmVzdWx0ID0gcmVzcHRyID0geHphbGxvYyhjbnQpOyAvKiB3aWxsIHByb3ZpZGUgTlVMIHRlcm1pbmF0b3IgKi8KKwkqcmVzcHRyKysgPSAnJCc7CisJKnJlc3B0cisrID0gaXNfc2hhNTEyOworCSpyZXNwdHIrKyA9ICckJzsKKwlyb3VuZHMgPSBST1VORFNfREVGQVVMVDsKKwlzYWx0X2RhdGEgKz0gMzsKKwlpZiAoc3RybmNtcChzYWx0X2RhdGEsIHN0cl9yb3VuZHMsIDcpID09IDApIHsKKwkJLyogNyA9PSBzdHJsZW4oInJvdW5kcz0iKSAqLworCQljaGFyICplbmRwOworCQljbnQgPSBiYl9zdHJ0b3Uoc2FsdF9kYXRhICsgNywgJmVuZHAsIDEwKTsKKwkJaWYgKCplbmRwID09ICckJykgeworCQkJc2FsdF9kYXRhID0gZW5kcCArIDE7CisJCQlyb3VuZHMgPSBjbnQ7CisJCQlpZiAocm91bmRzIDwgUk9VTkRTX01JTikKKwkJCQlyb3VuZHMgPSBST1VORFNfTUlOOworCQkJaWYgKHJvdW5kcyA+IFJPVU5EU19NQVgpCisJCQkJcm91bmRzID0gUk9VTkRTX01BWDsKKwkJCS8qIGFkZCAicm91bmRzPU5OTk5OJCIgdG8gcmVzdWx0ICovCisJCQlyZXNwdHIgKz0gc3ByaW50ZihyZXNwdHIsIHN0cl9yb3VuZHMsIHJvdW5kcyk7CisJCX0KKwl9CisJc2FsdF9sZW4gPSBzdHJjaHJudWwoc2FsdF9kYXRhLCAnJCcpIC0gc2FsdF9kYXRhOworCWlmIChzYWx0X2xlbiA+IFNBTFRfTEVOX01BWCkKKwkJc2FsdF9sZW4gPSBTQUxUX0xFTl9NQVg7CisJLyogeHN0cmR1cCBhc3N1cmVzIHN1aXRhYmxlIGFsaWdubWVudDsgYWxzbyB3ZSB3aWxsIHVzZSBpdAorCSAgIGFzIGEgc2NyYXRjaCBzcGFjZSBsYXRlci4gKi8KKwlzYWx0X2RhdGEgPSB4c3RybmR1cChzYWx0X2RhdGEsIHNhbHRfbGVuKTsKKwkvKiBhZGQgInNhbHQkIiB0byByZXN1bHQgKi8KKwlzdHJjcHkocmVzcHRyLCBzYWx0X2RhdGEpOworCXJlc3B0ciArPSBzYWx0X2xlbjsKKwkqcmVzcHRyKysgPSAnJCc7CisJLyoga2V5IGRhdGEgZG9lc24ndCBuZWVkIG11Y2ggcHJvY2Vzc2luZyAqLworCWtleV9sZW4gPSBzdHJsZW4oa2V5X2RhdGEpOworCWtleV9kYXRhID0geHN0cmR1cChrZXlfZGF0YSk7CisKKwkvKiBXaGljaCBmbGF2b3Igb2YgU0hBbm5uIG9wcyB0byB1c2U/ICovCisJc2hhX2JlZ2luID0gKHZvaWQqKXNoYTI1Nl9iZWdpbjsKKwlzaGFfaGFzaCA9ICh2b2lkKilzaGEyNTZfaGFzaDsKKwlzaGFfZW5kID0gKHZvaWQqKXNoYTI1Nl9lbmQ7CisJXzMyb3I2NCA9IDMyOworCWlmIChpc19zaGE1MTIgPT0gJzYnKSB7CisJCXNoYV9iZWdpbiA9ICh2b2lkKilzaGE1MTJfYmVnaW47CisJCXNoYV9oYXNoID0gKHZvaWQqKXNoYTUxMl9oYXNoOworCQlzaGFfZW5kID0gKHZvaWQqKXNoYTUxMl9lbmQ7CisJCV8zMm9yNjQgPSA2NDsKKwl9CisKKwkvKiBBZGQgS0VZLCBTQUxULiAgKi8KKwlzaGFfYmVnaW4oJmN0eCk7CisJc2hhX2hhc2goJmN0eCwga2V5X2RhdGEsIGtleV9sZW4pOworCXNoYV9oYXNoKCZjdHgsIHNhbHRfZGF0YSwgc2FsdF9sZW4pOworCisJLyogQ29tcHV0ZSBhbHRlcm5hdGUgU0hBIHN1bSB3aXRoIGlucHV0IEtFWSwgU0FMVCwgYW5kIEtFWS4KKwkgICBUaGUgZmluYWwgcmVzdWx0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpcnN0IGNvbnRleHQuICAqLworCXNoYV9iZWdpbigmYWx0X2N0eCk7CisJc2hhX2hhc2goJmFsdF9jdHgsIGtleV9kYXRhLCBrZXlfbGVuKTsKKwlzaGFfaGFzaCgmYWx0X2N0eCwgc2FsdF9kYXRhLCBzYWx0X2xlbik7CisJc2hhX2hhc2goJmFsdF9jdHgsIGtleV9kYXRhLCBrZXlfbGVuKTsKKwlzaGFfZW5kKCZhbHRfY3R4LCBhbHRfcmVzdWx0KTsKKworCS8qIEFkZCByZXN1bHQgb2YgdGhpcyB0byB0aGUgb3RoZXIgY29udGV4dC4gICovCisJLyogQWRkIGZvciBhbnkgY2hhcmFjdGVyIGluIHRoZSBrZXkgb25lIGJ5dGUgb2YgdGhlIGFsdGVybmF0ZSBzdW0uICAqLworCWZvciAoY250ID0ga2V5X2xlbjsgY250ID4gXzMyb3I2NDsgY250IC09IF8zMm9yNjQpCisJCXNoYV9oYXNoKCZjdHgsIGFsdF9yZXN1bHQsIF8zMm9yNjQpOworCXNoYV9oYXNoKCZjdHgsIGFsdF9yZXN1bHQsIGNudCk7CisKKwkvKiBUYWtlIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGFuZCBmb3IgZXZlcnkKKwkgICAxIGFkZCB0aGUgYWx0ZXJuYXRlIHN1bSwgZm9yIGV2ZXJ5IDAgdGhlIGtleS4gICovCisJZm9yIChjbnQgPSBrZXlfbGVuOyBjbnQgIT0gMDsgY250ID4+PSAxKQorCQlpZiAoKGNudCAmIDEpICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBhbHRfcmVzdWx0LCBfMzJvcjY0KTsKKwkJZWxzZQorCQkJc2hhX2hhc2goJmN0eCwga2V5X2RhdGEsIGtleV9sZW4pOworCisJLyogQ3JlYXRlIGludGVybWVkaWF0ZSByZXN1bHQuICAqLworCXNoYV9lbmQoJmN0eCwgYWx0X3Jlc3VsdCk7CisKKwkvKiBTdGFydCBjb21wdXRhdGlvbiBvZiBQIGJ5dGUgc2VxdWVuY2UuICAqLworCS8qIEZvciBldmVyeSBjaGFyYWN0ZXIgaW4gdGhlIHBhc3N3b3JkIGFkZCB0aGUgZW50aXJlIHBhc3N3b3JkLiAgKi8KKwlzaGFfYmVnaW4oJmFsdF9jdHgpOworCWZvciAoY250ID0gMDsgY250IDwga2V5X2xlbjsgKytjbnQpCisJCXNoYV9oYXNoKCZhbHRfY3R4LCBrZXlfZGF0YSwga2V5X2xlbik7CisJc2hhX2VuZCgmYWx0X2N0eCwgdGVtcF9yZXN1bHQpOworCisJLyogTkI6IHBhc3QgdGhpcyBwb2ludCwgcmF3IGtleV9kYXRhIGlzIG5vdCB1c2VkIGFueW1vcmUgKi8KKworCS8qIENyZWF0ZSBieXRlIHNlcXVlbmNlIFAuICAqLworI2RlZmluZSBwX2J5dGVzIGtleV9kYXRhIC8qIHJldXNlIHRoZSBidWZmZXIgYXMgaXQgaXMgb2YgdGhlIGtleV9sZW4gc2l6ZSAqLworCWNwID0gcF9ieXRlczsgLyogd2FzOiAuLi4gPSBhbGxvY2Eoa2V5X2xlbik7ICovCisJZm9yIChjbnQgPSBrZXlfbGVuOyBjbnQgPj0gXzMyb3I2NDsgY250IC09IF8zMm9yNjQpIHsKKwkJY3AgPSBtZW1jcHkoY3AsIHRlbXBfcmVzdWx0LCBfMzJvcjY0KTsKKwkJY3AgKz0gXzMyb3I2NDsKKwl9CisJbWVtY3B5KGNwLCB0ZW1wX3Jlc3VsdCwgY250KTsKKworCS8qIFN0YXJ0IGNvbXB1dGF0aW9uIG9mIFMgYnl0ZSBzZXF1ZW5jZS4gICovCisJLyogRm9yIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgcGFzc3dvcmQgYWRkIHRoZSBlbnRpcmUgcGFzc3dvcmQuICAqLworCXNoYV9iZWdpbigmYWx0X2N0eCk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAxNiArIGFsdF9yZXN1bHRbMF07ICsrY250KQorCQlzaGFfaGFzaCgmYWx0X2N0eCwgc2FsdF9kYXRhLCBzYWx0X2xlbik7CisJc2hhX2VuZCgmYWx0X2N0eCwgdGVtcF9yZXN1bHQpOworCisJLyogTkI6IHBhc3QgdGhpcyBwb2ludCwgcmF3IHNhbHRfZGF0YSBpcyBub3QgdXNlZCBhbnltb3JlICovCisKKwkvKiBDcmVhdGUgYnl0ZSBzZXF1ZW5jZSBTLiAgKi8KKyNkZWZpbmUgc19ieXRlcyBzYWx0X2RhdGEgLyogcmV1c2UgdGhlIGJ1ZmZlciBhcyBpdCBpcyBvZiB0aGUgc2FsdF9sZW4gc2l6ZSAqLworCWNwID0gc19ieXRlczsgLyogd2FzOiAuLi4gPSBhbGxvY2Eoc2FsdF9sZW4pOyAqLworCWZvciAoY250ID0gc2FsdF9sZW47IGNudCA+PSBfMzJvcjY0OyBjbnQgLT0gXzMyb3I2NCkgeworCQljcCA9IG1lbWNweShjcCwgdGVtcF9yZXN1bHQsIF8zMm9yNjQpOworCQljcCArPSBfMzJvcjY0OworCX0KKwltZW1jcHkoY3AsIHRlbXBfcmVzdWx0LCBjbnQpOworCisJLyogUmVwZWF0ZWRseSBydW4gdGhlIGNvbGxlY3RlZCBoYXNoIHZhbHVlIHRocm91Z2ggU0hBIHRvIGJ1cm4KKwkgICBDUFUgY3ljbGVzLiAgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IHJvdW5kczsgKytjbnQpIHsKKwkJc2hhX2JlZ2luKCZjdHgpOworCisJCS8qIEFkZCBrZXkgb3IgbGFzdCByZXN1bHQuICAqLworCQlpZiAoKGNudCAmIDEpICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBwX2J5dGVzLCBrZXlfbGVuKTsKKwkJZWxzZQorCQkJc2hhX2hhc2goJmN0eCwgYWx0X3Jlc3VsdCwgXzMyb3I2NCk7CisJCS8qIEFkZCBzYWx0IGZvciBudW1iZXJzIG5vdCBkaXZpc2libGUgYnkgMy4gICovCisJCWlmIChjbnQgJSAzICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBzX2J5dGVzLCBzYWx0X2xlbik7CisJCS8qIEFkZCBrZXkgZm9yIG51bWJlcnMgbm90IGRpdmlzaWJsZSBieSA3LiAgKi8KKwkJaWYgKGNudCAlIDcgIT0gMCkKKwkJCXNoYV9oYXNoKCZjdHgsIHBfYnl0ZXMsIGtleV9sZW4pOworCQkvKiBBZGQga2V5IG9yIGxhc3QgcmVzdWx0LiAgKi8KKwkJaWYgKChjbnQgJiAxKSAhPSAwKQorCQkJc2hhX2hhc2goJmN0eCwgYWx0X3Jlc3VsdCwgXzMyb3I2NCk7CisJCWVsc2UKKwkJCXNoYV9oYXNoKCZjdHgsIHBfYnl0ZXMsIGtleV9sZW4pOworCisJCXNoYV9lbmQoJmN0eCwgYWx0X3Jlc3VsdCk7CisJfQorCisJLyogQXBwZW5kIGVuY3J5cHRlZCBwYXNzd29yZCB0byByZXN1bHQgYnVmZmVyICovCisvL1RPRE86IHJlcGxhY2Ugd2l0aCBzb21ldGhpbmcgbGlrZQorLy8JYmJfdXVlbmNvZGUoY3AsIHNyYywgbGVuZ3RoLCBiYl91dWVuY190YmxfWFhYYmFzZTY0KTsKKyNkZWZpbmUgYjY0X2Zyb21fMjRiaXQoQjIsIEIxLCBCMCwgTikgXAorZG8geyBcCisJdW5zaWduZWQgdyA9ICgoQjIpIDw8IDE2KSB8ICgoQjEpIDw8IDgpIHwgKEIwKTsgXAorCXJlc3B0ciA9IHRvNjQocmVzcHRyLCB3LCBOKTsgXAorfSB3aGlsZSAoMCkKKwlpZiAoaXNfc2hhNTEyID09ICc1JykgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCXVuc2lnbmVkIGogPSBpICsgMTA7CisJCQl1bnNpZ25lZCBrID0gaSArIDIwOworCQkJaWYgKGogPj0gMzApIGogLT0gMzA7CisJCQlpZiAoayA+PSAzMCkgayAtPSAzMDsKKwkJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbaV0sIGFsdF9yZXN1bHRbal0sIGFsdF9yZXN1bHRba10sIDQpOworCQkJaWYgKGsgPT0gMjkpCisJCQkJYnJlYWs7CisJCQlpID0gayArIDE7CisJCX0KKwkJYjY0X2Zyb21fMjRiaXQoMCwgYWx0X3Jlc3VsdFszMV0sIGFsdF9yZXN1bHRbMzBdLCAzKTsKKwkJLyogd2FzOgorCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzBdLCBhbHRfcmVzdWx0WzEwXSwgYWx0X3Jlc3VsdFsyMF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzIxXSwgYWx0X3Jlc3VsdFsxXSwgYWx0X3Jlc3VsdFsxMV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzEyXSwgYWx0X3Jlc3VsdFsyMl0sIGFsdF9yZXN1bHRbMl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzNdLCBhbHRfcmVzdWx0WzEzXSwgYWx0X3Jlc3VsdFsyM10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI0XSwgYWx0X3Jlc3VsdFs0XSwgYWx0X3Jlc3VsdFsxNF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE1XSwgYWx0X3Jlc3VsdFsyNV0sIGFsdF9yZXN1bHRbNV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzZdLCBhbHRfcmVzdWx0WzE2XSwgYWx0X3Jlc3VsdFsyNl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI3XSwgYWx0X3Jlc3VsdFs3XSwgYWx0X3Jlc3VsdFsxN10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE4XSwgYWx0X3Jlc3VsdFsyOF0sIGFsdF9yZXN1bHRbOF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzldLCBhbHRfcmVzdWx0WzE5XSwgYWx0X3Jlc3VsdFsyOV0sIDQpOworCQliNjRfZnJvbV8yNGJpdCgwLCBhbHRfcmVzdWx0WzMxXSwgYWx0X3Jlc3VsdFszMF0sIDMpOworCQkqLworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgaiA9IGkgKyAyMTsKKwkJCXVuc2lnbmVkIGsgPSBpICsgNDI7CisJCQlpZiAoaiA+PSA2MykgaiAtPSA2MzsKKwkJCWlmIChrID49IDYzKSBrIC09IDYzOworCQkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFtpXSwgYWx0X3Jlc3VsdFtqXSwgYWx0X3Jlc3VsdFtrXSwgNCk7CisJCQlpZiAoaiA9PSAyMCkKKwkJCQlicmVhazsKKwkJCWkgPSBqICsgMTsKKwkJfQorCQliNjRfZnJvbV8yNGJpdCgwLCAwLCBhbHRfcmVzdWx0WzYzXSwgMik7CisJCS8qIHdhczoKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFswXSwgYWx0X3Jlc3VsdFsyMV0sIGFsdF9yZXN1bHRbNDJdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFsyMl0sIGFsdF9yZXN1bHRbNDNdLCBhbHRfcmVzdWx0WzFdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0NF0sIGFsdF9yZXN1bHRbMl0sIGFsdF9yZXN1bHRbMjNdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszXSwgYWx0X3Jlc3VsdFsyNF0sIGFsdF9yZXN1bHRbNDVdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFsyNV0sIGFsdF9yZXN1bHRbNDZdLCBhbHRfcmVzdWx0WzRdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0N10sIGFsdF9yZXN1bHRbNV0sIGFsdF9yZXN1bHRbMjZdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs2XSwgYWx0X3Jlc3VsdFsyN10sIGFsdF9yZXN1bHRbNDhdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFsyOF0sIGFsdF9yZXN1bHRbNDldLCBhbHRfcmVzdWx0WzddLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs1MF0sIGFsdF9yZXN1bHRbOF0sIGFsdF9yZXN1bHRbMjldLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs5XSwgYWx0X3Jlc3VsdFszMF0sIGFsdF9yZXN1bHRbNTFdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszMV0sIGFsdF9yZXN1bHRbNTJdLCBhbHRfcmVzdWx0WzEwXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTNdLCBhbHRfcmVzdWx0WzExXSwgYWx0X3Jlc3VsdFszMl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzEyXSwgYWx0X3Jlc3VsdFszM10sIGFsdF9yZXN1bHRbNTRdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszNF0sIGFsdF9yZXN1bHRbNTVdLCBhbHRfcmVzdWx0WzEzXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTZdLCBhbHRfcmVzdWx0WzE0XSwgYWx0X3Jlc3VsdFszNV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE1XSwgYWx0X3Jlc3VsdFszNl0sIGFsdF9yZXN1bHRbNTddLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszN10sIGFsdF9yZXN1bHRbNThdLCBhbHRfcmVzdWx0WzE2XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTldLCBhbHRfcmVzdWx0WzE3XSwgYWx0X3Jlc3VsdFszOF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE4XSwgYWx0X3Jlc3VsdFszOV0sIGFsdF9yZXN1bHRbNjBdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0MF0sIGFsdF9yZXN1bHRbNjFdLCBhbHRfcmVzdWx0WzE5XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNjJdLCBhbHRfcmVzdWx0WzIwXSwgYWx0X3Jlc3VsdFs0MV0sIDQpOworCQliNjRfZnJvbV8yNGJpdCgwLCAwLCBhbHRfcmVzdWx0WzYzXSwgMik7CisJCSovCisJfQorCS8qICpyZXNwdHIgPSAnXDAnOyAtIHh6YWxsb2MgZGlkIGl0ICovCisjdW5kZWYgYjY0X2Zyb21fMjRiaXQKKworCS8qIENsZWFyIHRoZSBidWZmZXIgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IHNvIHRoYXQgcGVvcGxlCisJICAgYXR0YWNoaW5nIHRvIHByb2Nlc3NlcyBvciByZWFkaW5nIGNvcmUgZHVtcHMgY2Fubm90IGdldCBhbnkKKwkgICBpbmZvcm1hdGlvbi4gICovCisJbWVtc2V0KCZMLCAwLCBzaXplb2YoTCkpOyAvKiBbYWx0XV9jdHggYW5kIFhYWF9yZXN1bHQgYnVmZmVycyAqLworCW1lbXNldChrZXlfZGF0YSwgMCwga2V5X2xlbik7IC8qIGFsc28gcF9ieXRlcyAqLworCW1lbXNldChzYWx0X2RhdGEsIDAsIHNhbHRfbGVuKTsgLyogYWxzbyBzX2J5dGVzICovCisJZnJlZShrZXlfZGF0YSk7CisJZnJlZShzYWx0X2RhdGEpOworI3VuZGVmIHBfYnl0ZXMKKyN1bmRlZiBzX2J5dGVzCisKKwlyZXR1cm4gcmVzdWx0OworI3VuZGVmIGFsdF9yZXN1bHQKKyN1bmRlZiB0ZW1wX3Jlc3VsdAorI3VuZGVmIGN0eAorI3VuZGVmIGFsdF9jdHgKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3JlYWQuYyBiL2xpYmJiL3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA2YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcmVhZC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzc2l6ZV90IEZBU1RfRlVOQyBzYWZlX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IG47CisKKwlkbyB7CisJCW4gPSByZWFkKGZkLCBidWYsIGNvdW50KTsKKwl9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIFJlYWQgYWxsIG9mIHRoZSBzdXBwbGllZCBidWZmZXIgZnJvbSBhIGZpbGUuCisgKiBUaGlzIGRvZXMgbXVsdGlwbGUgcmVhZHMgYXMgbmVjZXNzYXJ5LgorICogUmV0dXJucyB0aGUgYW1vdW50IHJlYWQsIG9yIC0xIG9uIGFuIGVycm9yLgorICogQSBzaG9ydCByZWFkIGlzIHJldHVybmVkIG9uIGFuIGVuZCBvZiBmaWxlLgorICovCitzc2l6ZV90IEZBU1RfRlVOQyBmdWxsX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBjYzsKKwlzc2l6ZV90IHRvdGFsOworCisJdG90YWwgPSAwOworCisJd2hpbGUgKGxlbikgeworCQljYyA9IHNhZmVfcmVhZChmZCwgYnVmLCBsZW4pOworCisJCWlmIChjYyA8IDApIHsKKwkJCWlmICh0b3RhbCkgeworCQkJCS8qIHdlIGFscmVhZHkgaGF2ZSBzb21lISAqLworCQkJCS8qIHVzZXIgY2FuIGRvIGFub3RoZXIgcmVhZCB0byBrbm93IHRoZSBlcnJvciBjb2RlICovCisJCQkJcmV0dXJuIHRvdGFsOworCQkJfQorCQkJcmV0dXJuIGNjOyAvKiByZWFkKCkgcmV0dXJucyAtMSBvbiBmYWlsdXJlLiAqLworCQl9CisJCWlmIChjYyA9PSAwKQorCQkJYnJlYWs7CisJCWJ1ZiA9ICgoY2hhciAqKWJ1ZikgKyBjYzsKKwkJdG90YWwgKz0gY2M7CisJCWxlbiAtPSBjYzsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIHJlYWRfY2xvc2UoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCS8qaW50IGU7Ki8KKwlzaXplID0gZnVsbF9yZWFkKGZkLCBidWYsIHNpemUpOworCS8qZSA9IGVycm5vOyovCisJY2xvc2UoZmQpOworCS8qZXJybm8gPSBlOyovCisJcmV0dXJuIHNpemU7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCXJldHVybiByZWFkX2Nsb3NlKGZkLCBidWYsIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVhZF9rZXkuYyBiL2xpYmJiL3JlYWRfa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjZDE5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3JlYWRfa2V5LmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50NjRfdCBGQVNUX0ZVTkMgcmVhZF9rZXkoaW50IGZkLCBjaGFyICpidWZmZXIsIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBwb2xsZmQgcGZkOworCWNvbnN0IGNoYXIgKnNlcTsKKwlpbnQgbjsKKworCS8qIEtub3duIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIGN1cnNvciBhbmQgZnVuY3Rpb24ga2V5cyAqLworCXN0YXRpYyBjb25zdCBjaGFyIGVzY2NtZHNbXSBBTElHTjEgPSB7CisJCSdPJywnQScgICAgICAgIHwweDgwLEtFWUNPREVfVVAgICAgICAsCisJCSdPJywnQicgICAgICAgIHwweDgwLEtFWUNPREVfRE9XTiAgICAsCisJCSdPJywnQycgICAgICAgIHwweDgwLEtFWUNPREVfUklHSFQgICAsCisJCSdPJywnRCcgICAgICAgIHwweDgwLEtFWUNPREVfTEVGVCAgICAsCisJCSdPJywnSCcgICAgICAgIHwweDgwLEtFWUNPREVfSE9NRSAgICAsCisJCSdPJywnRicgICAgICAgIHwweDgwLEtFWUNPREVfRU5EICAgICAsCisjaWYgMAorCQknTycsJ1AnICAgICAgICB8MHg4MCxLRVlDT0RFX0ZVTjEgICAgLAorCQkvKiBbRVNDXSBFU0MgTyBbMl0gUCAtIFtBbHQtXVtTaGlmdC1dRjEgKi8KKwkJLyogRVNDIFsgTyAxIDsgMiBQIC0gU2hpZnQtRjEgKi8KKwkJLyogRVNDIFsgTyAxIDsgMyBQIC0gQWx0LUYxICovCisJCS8qIEVTQyBbIE8gMSA7IDQgUCAtIEFsdC1TaGlmdC1GMSAqLworCQkvKiBFU0MgWyBPIDEgOyA1IFAgLSBDdHJsLUYxICovCisJCS8qIEVTQyBbIE8gMSA7IDYgUCAtIEN0cmwtU2hpZnQtRjEgKi8KKwkJJ08nLCdRJyAgICAgICAgfDB4ODAsS0VZQ09ERV9GVU4yICAgICwKKwkJJ08nLCdSJyAgICAgICAgfDB4ODAsS0VZQ09ERV9GVU4zICAgICwKKwkJJ08nLCdTJyAgICAgICAgfDB4ODAsS0VZQ09ERV9GVU40ICAgICwKKyNlbmRpZgorCQknWycsJ0EnICAgICAgICB8MHg4MCxLRVlDT0RFX1VQICAgICAgLAorCQknWycsJ0InICAgICAgICB8MHg4MCxLRVlDT0RFX0RPV04gICAgLAorCQknWycsJ0MnICAgICAgICB8MHg4MCxLRVlDT0RFX1JJR0hUICAgLAorCQknWycsJ0QnICAgICAgICB8MHg4MCxLRVlDT0RFX0xFRlQgICAgLAorCQkvKiBFU0MgWyAxIDsgMiB4LCB3aGVyZSB4ID0gQS9CL0MvRDogU2hpZnQtPGFycm93PiAqLworCQkvKiBFU0MgWyAxIDsgMyB4LCB3aGVyZSB4ID0gQS9CL0MvRDogQWx0LTxhcnJvdz4gKi8KKwkJLyogRVNDIFsgMSA7IDQgeCwgd2hlcmUgeCA9IEEvQi9DL0Q6IEFsdC1TaGlmdC08YXJyb3c+ICovCisJCS8qIEVTQyBbIDEgOyA1IHgsIHdoZXJlIHggPSBBL0IvQy9EOiBDdHJsLTxhcnJvdz4gLSBpbXBsZW1lbnRlZCBiZWxvdyAqLworCQkvKiBFU0MgWyAxIDsgNiB4LCB3aGVyZSB4ID0gQS9CL0MvRDogQ3RybC1TaGlmdC08YXJyb3c+ICovCisJCSdbJywnSCcgICAgICAgIHwweDgwLEtFWUNPREVfSE9NRSAgICAsIC8qIHh0ZXJtICovCisJCS8qIFtFU0NdIEVTQyBbIFsyXSBIIC0gW0FsdC1dW1NoaWZ0LV1Ib21lICovCisJCSdbJywnRicgICAgICAgIHwweDgwLEtFWUNPREVfRU5EICAgICAsIC8qIHh0ZXJtICovCisJCSdbJywnMScsJ34nICAgIHwweDgwLEtFWUNPREVfSE9NRSAgICAsIC8qIHZ0MTAwPyBsaW51eCB2dD8gb3Igd2hhdD8gKi8KKwkJJ1snLCcyJywnficgICAgfDB4ODAsS0VZQ09ERV9JTlNFUlQgICwKKwkJLyogRVNDIFsgMiA7IDMgfiAtIEFsdC1JbnNlcnQgKi8KKwkJJ1snLCczJywnficgICAgfDB4ODAsS0VZQ09ERV9ERUxFVEUgICwKKwkJLyogW0VTQ10gRVNDIFsgMyBbOzJdIH4gLSBbQWx0LV1bU2hpZnQtXURlbGV0ZSAqLworCQkvKiBFU0MgWyAzIDsgMyB+IC0gQWx0LURlbGV0ZSAqLworCQkvKiBFU0MgWyAzIDsgNSB+IC0gQ3RybC1EZWxldGUgKi8KKwkJJ1snLCc0JywnficgICAgfDB4ODAsS0VZQ09ERV9FTkQgICAgICwgLyogdnQxMDA/IGxpbnV4IHZ0PyBvciB3aGF0PyAqLworCQknWycsJzUnLCd+JyAgICB8MHg4MCxLRVlDT0RFX1BBR0VVUCAgLAorCQkvKiBFU0MgWyA1IDsgMyB+IC0gQWx0LVBnVXAgKi8KKwkJLyogRVNDIFsgNSA7IDUgfiAtIEN0cmwtUGdVcCAqLworCQkvKiBFU0MgWyA1IDsgNyB+IC0gQ3RybC1BbHQtUGdVcCAqLworCQknWycsJzYnLCd+JyAgICB8MHg4MCxLRVlDT0RFX1BBR0VET1dOLAorCQknWycsJzcnLCd+JyAgICB8MHg4MCxLRVlDT0RFX0hPTUUgICAgLCAvKiB2dDEwMD8gbGludXggdnQ/IG9yIHdoYXQ/ICovCisJCSdbJywnOCcsJ34nICAgIHwweDgwLEtFWUNPREVfRU5EICAgICAsIC8qIHZ0MTAwPyBsaW51eCB2dD8gb3Igd2hhdD8gKi8KKyNpZiAwCisJCSdbJywnMScsJzEnLCd+J3wweDgwLEtFWUNPREVfRlVOMSAgICAsCisJCSdbJywnMScsJzInLCd+J3wweDgwLEtFWUNPREVfRlVOMiAgICAsCisJCSdbJywnMScsJzMnLCd+J3wweDgwLEtFWUNPREVfRlVOMyAgICAsCisJCSdbJywnMScsJzQnLCd+J3wweDgwLEtFWUNPREVfRlVONCAgICAsCisJCSdbJywnMScsJzUnLCd+J3wweDgwLEtFWUNPREVfRlVONSAgICAsCisJCS8qIFtFU0NdIEVTQyBbIDEgNSBbOzJdIH4gLSBbQWx0LV1bU2hpZnQtXUY1ICovCisJCSdbJywnMScsJzcnLCd+J3wweDgwLEtFWUNPREVfRlVONiAgICAsCisJCSdbJywnMScsJzgnLCd+J3wweDgwLEtFWUNPREVfRlVONyAgICAsCisJCSdbJywnMScsJzknLCd+J3wweDgwLEtFWUNPREVfRlVOOCAgICAsCisJCSdbJywnMicsJzAnLCd+J3wweDgwLEtFWUNPREVfRlVOOSAgICAsCisJCSdbJywnMicsJzEnLCd+J3wweDgwLEtFWUNPREVfRlVOMTAgICAsCisJCSdbJywnMicsJzMnLCd+J3wweDgwLEtFWUNPREVfRlVOMTEgICAsCisJCSdbJywnMicsJzQnLCd+J3wweDgwLEtFWUNPREVfRlVOMTIgICAsCisJCS8qIEVTQyBbIDIgNCA7IDIgfiAtIFNoaWZ0LUYxMiAqLworCQkvKiBFU0MgWyAyIDQgOyAzIH4gLSBBbHQtRjEyICovCisJCS8qIEVTQyBbIDIgNCA7IDQgfiAtIEFsdC1TaGlmdC1GMTIgKi8KKwkJLyogRVNDIFsgMiA0IDsgNSB+IC0gQ3RybC1GMTIgKi8KKwkJLyogRVNDIFsgMiA0IDsgNiB+IC0gQ3RybC1TaGlmdC1GMTIgKi8KKyNlbmRpZgorCQkvKiAnWycsJzEnLCc7JywnNScsJ0EnIHwweDgwLEtFWUNPREVfQ1RSTF9VUCAgICwgLSB1bnVzZWQgKi8KKwkJLyogJ1snLCcxJywnOycsJzUnLCdCJyB8MHg4MCxLRVlDT0RFX0NUUkxfRE9XTiAsIC0gdW51c2VkICovCisJCSdbJywnMScsJzsnLCc1JywnQycgfDB4ODAsS0VZQ09ERV9DVFJMX1JJR0hULAorCQknWycsJzEnLCc7JywnNScsJ0QnIHwweDgwLEtFWUNPREVfQ1RSTF9MRUZUICwKKwkJMAorCQkvKiBFU0MgWyBaIC0gU2hpZnQtVGFiICovCisJfTsKKworCXBmZC5mZCA9IGZkOworCXBmZC5ldmVudHMgPSBQT0xMSU47CisKKwlidWZmZXIrKzsgLyogc2F2ZWQgY2hhcnMgY291bnRlciBpcyBpbiBidWZmZXJbLTFdIG5vdyAqLworCisgc3RhcnRfb3ZlcjoKKwllcnJubyA9IDA7CisJbiA9ICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclstMV07CisJaWYgKG4gPT0gMCkgeworCQkvKiBJZiBubyBkYXRhLCB3YWl0IGZvciBpbnB1dC4KKwkJICogSWYgcmVxdWVzdGVkLCB3YWl0IFRJTUVPVVQgbXMuIFRJTUVPVVQgPSAtMSBpcyB1c2VmdWwKKwkJICogaWYgZmQgY2FuIGJlIGluIG5vbi1ibG9ja2luZyBtb2RlLgorCQkgKi8KKwkJaWYgKHRpbWVvdXQgPj0gLTEpIHsKKwkJCWlmIChzYWZlX3BvbGwoJnBmZCwgMSwgdGltZW91dCkgPT0gMCkgeworCQkJCS8qIFRpbWVkIG91dCAqLworCQkJCWVycm5vID0gRUFHQUlOOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQkvKiBJdCBpcyB0ZW1wdGluZyB0byByZWFkIG1vcmUgdGhhbiBvbmUgYnl0ZSBoZXJlLAorCQkgKiBidXQgaXQgYnJlYWtzIHBhc3RpbmcuIEV4YW1wbGU6IGF0IHNoZWxsIHByb21wdCwKKwkJICogdXNlciBwcmVzc2VzICJjIiwiYSIsInQiIGFuZCB0aGVuIHBhc3RlcyAiXG5saW5lXG4iLgorCQkgKiBXaGVuIHdlIHdlcmUgcmVhZGluZyAzIGJ5dGVzIGhlcmUsIHdlIHdlcmUgZWF0aW5nCisJCSAqICJsaSIgdG9vLCBhbmQgY2F0IHdhcyBnZXR0aW5nIHdyb25nIGlucHV0LgorCQkgKi8KKwkJbiA9IHNhZmVfcmVhZChmZCwgYnVmZmVyLCAxKTsKKwkJaWYgKG4gPD0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwl7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGJ1ZmZlclswXTsKKwkJbi0tOworCQlpZiAobikKKwkJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyAxLCBuKTsKKwkJLyogT25seSBFU0Mgc3RhcnRzIEVTQyBzZXF1ZW5jZXMgKi8KKwkJaWYgKGMgIT0gMjcpIHsKKwkJCWJ1ZmZlclstMV0gPSBuOworCQkJcmV0dXJuIGM7CisJCX0KKwl9CisKKwkvKiBMb29wIHRocm91Z2gga25vd24gRVNDIHNlcXVlbmNlcyAqLworCXNlcSA9IGVzY2NtZHM7CisJd2hpbGUgKCpzZXEgIT0gJ1wwJykgeworCQkvKiBuIC0gcG9zaXRpb24gaW4gc2VxdWVuY2Ugd2UgZGlkIG5vdCByZWFkIHlldCAqLworCQlpbnQgaSA9IDA7IC8qIHBvc2l0aW9uIGluIHNlcXVlbmNlIHRvIGNvbXBhcmUgKi8KKworCQkvKiBMb29wIHRocm91Z2ggY2hhcnMgaW4gdGhpcyBzZXF1ZW5jZSAqLworCQl3aGlsZSAoMSkgeworCQkJLyogU28gZmFyIGVzY2FwZSBzZXF1ZW5jZSBtYXRjaGVkIHVwIHRvIFtpLTFdICovCisJCQlpZiAobiA8PSBpKSB7CisJCQkJLyogTmVlZCBtb3JlIGNoYXJzLCByZWFkIGFub3RoZXIgb25lIGlmIGl0IHdvdWxkbid0IGJsb2NrLgorCQkJCSAqIE5vdGUgdGhhdCBlc2NhcGUgc2VxdWVuY2VzIGNvbWUgaW4gYXMgYSB1bml0LAorCQkJCSAqIHNvIGlmIHdlIGJsb2NrIGZvciBsb25nIGl0J3Mgbm90IHJlYWxseSBhbiBlc2NhcGUgc2VxdWVuY2UuCisJCQkJICogVGltZW91dCBpcyBuZWVkZWQgdG8gcmVjb25uZWN0IGVzY2FwZSBzZXF1ZW5jZXMKKwkJCQkgKiBzcGxpdCB1cCBieSB0cmFuc21pc3Npb24gb3ZlciBhIHNlcmlhbCBjb25zb2xlLiAqLworCQkJCWlmIChzYWZlX3BvbGwoJnBmZCwgMSwgNTApID09IDApIHsKKwkJCQkJLyogTm8gbW9yZSBkYXRhIQorCQkJCQkgKiBBcnJheSBpcyBzb3J0ZWQgZnJvbSBzaG9ydGVzdCB0byBsb25nZXN0LAorCQkJCQkgKiB3ZSBjYW4ndCBtYXRjaCBhbnl0aGluZyBsYXRlciBpbiBhcnJheSAtCisJCQkJCSAqIGFueXRoaW5nIGxhdGVyIGlzIGxvbmdlciB0aGFuIHRoaXMgc2VxLgorCQkJCQkgKiBCcmVhayBvdXQgb2YgYm90aCBsb29wcy4gKi8KKwkJCQkJZ290byBnb3RfYWxsOworCQkJCX0KKwkJCQllcnJubyA9IDA7CisJCQkJaWYgKHNhZmVfcmVhZChmZCwgYnVmZmVyICsgbiwgMSkgPD0gMCkgeworCQkJCQkvKiBJZiBFQUdBSU4sIHRoZW4gZmQgaXMgT19OT05CTE9DSyBhbmQgcG9sbCBsaWVkOgorCQkJCQkgKiBpbiBmYWN0LCB0aGVyZSBpcyBubyBkYXRhLiAqLworCQkJCQlpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisJCQkJCQkvKiBvdGhlcndpc2U6IGl0J3MgRU9GL2Vycm9yICovCisJCQkJCQlidWZmZXJbLTFdID0gMDsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCQlnb3RvIGdvdF9hbGw7CisJCQkJfQorCQkJCW4rKzsKKwkJCX0KKwkJCWlmIChidWZmZXJbaV0gIT0gKHNlcVtpXSAmIDB4N2YpKSB7CisJCQkJLyogVGhpcyBzZXEgZG9lc24ndCBtYXRjaCwgZ28gdG8gbmV4dCAqLworCQkJCXNlcSArPSBpOworCQkJCS8qIEZvcndhcmQgdG8gbGFzdCBjaGFyICovCisJCQkJd2hpbGUgKCEoKnNlcSAmIDB4ODApKQorCQkJCQlzZXErKzsKKwkJCQkvKiBTa2lwIGl0IGFuZCB0aGUga2V5Y29kZSB3aGljaCBmb2xsb3dzICovCisJCQkJc2VxICs9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2VxW2ldICYgMHg4MCkgeworCQkJCS8qIEVudGlyZSBzZXEgbWF0Y2hlZCAqLworCQkJCW4gPSAwOworCQkJCS8qIG4gLT0gaTsgbWVtbW92ZSguLi4pOworCQkJCSAqIHdvdWxkIGJlIG1vcmUgY29ycmVjdCwKKwkJCQkgKiBidXQgd2UgbmV2ZXIgcmVhZCBhaGVhZCB0aGF0IG11Y2gsCisJCQkJICogYW5kIG4gPT0gaSBoZXJlLiAqLworCQkJCWJ1ZmZlclstMV0gPSAwOworCQkJCXJldHVybiAoc2lnbmVkIGNoYXIpc2VxW2krMV07CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisJLyogV2UgZGlkIG5vdCBmaW5kIG1hdGNoaW5nIHNlcXVlbmNlLgorCSAqIFdlIHBvc3NpYmx5IHJlYWQgYW5kIHN0b3JlZCBtb3JlIGlucHV0IGluIGJ1ZmZlcltdIGJ5IG5vdy4KKwkgKiBuID0gYnl0ZXMgcmVhZC4gVHJ5IHRvIHJlYWQgbW9yZSB1bnRpbCB3ZSB0aW1lIG91dC4KKwkgKi8KKwl3aGlsZSAobiA8IEtFWUNPREVfQlVGRkVSX1NJWkUtMSkgeyAvKiAxIGZvciBjb3VudCBieXRlIGF0IGJ1ZmZlclstMV0gKi8KKwkJaWYgKHNhZmVfcG9sbCgmcGZkLCAxLCA1MCkgPT0gMCkgeworCQkJLyogTm8gbW9yZSBkYXRhISAqLworCQkJYnJlYWs7CisJCX0KKwkJZXJybm8gPSAwOworCQlpZiAoc2FmZV9yZWFkKGZkLCBidWZmZXIgKyBuLCAxKSA8PSAwKSB7CisJCQkvKiBJZiBFQUdBSU4sIHRoZW4gZmQgaXMgT19OT05CTE9DSyBhbmQgcG9sbCBsaWVkOgorCQkJICogaW4gZmFjdCwgdGhlcmUgaXMgbm8gZGF0YS4gKi8KKwkJCWlmIChlcnJubyAhPSBFQUdBSU4pIHsKKwkJCQkvKiBvdGhlcndpc2U6IGl0J3MgRU9GL2Vycm9yICovCisJCQkJYnVmZmVyWy0xXSA9IDA7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJbisrOworCQkvKiBUcnkgdG8gZGVjaXBoZXIgIkVTQyBbIE5OTiA7IE5OTiBSIiBzZXF1ZW5jZSAqLworCQlpZiAoKEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMCisJCSAgICB8fCBFTkFCTEVfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwKKwkJICAgIHx8IEVOQUJMRV9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisJCSAgICApCisJCSAmJiBuID49IDUKKwkJICYmIGJ1ZmZlclswXSA9PSAnWycKKwkJICYmIGJ1ZmZlcltuLTFdID09ICdSJworCQkgJiYgaXNkaWdpdChidWZmZXJbMV0pCisJCSkgeworCQkJY2hhciAqZW5kOworCQkJdW5zaWduZWQgbG9uZyByb3csIGNvbDsKKworCQkJcm93ID0gc3RydG91bChidWZmZXIgKyAxLCAmZW5kLCAxMCk7CisJCQlpZiAoKmVuZCAhPSAnOycgfHwgIWlzZGlnaXQoZW5kWzFdKSkKKwkJCQljb250aW51ZTsKKwkJCWNvbCA9IHN0cnRvdWwoZW5kICsgMSwgJmVuZCwgMTApOworCQkJaWYgKCplbmQgIT0gJ1InKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJvdyA8IDEgfHwgY29sIDwgMSB8fCAocm93IHwgY29sKSA+IDB4N2ZmZikKKwkJCQljb250aW51ZTsKKworCQkJYnVmZmVyWy0xXSA9IDA7CisJCQkvKiBQYWNrIGludG8gIjEgPHJvdzE1Yml0cz4gPGNvbDE2Yml0cz4iIDMyLWJpdCBzZXF1ZW5jZSAqLworCQkJY29sIHw9ICgoKC0xIDw8IDE1KSB8IHJvdykgPDwgMTYpOworCQkJLyogUmV0dXJuIGl0IGluIGhpZ2gtb3JkZXIgd29yZCAqLworCQkJcmV0dXJuICgoaW50NjRfdCkgY29sIDw8IDMyKSB8ICh1aW50MzJfdClLRVlDT0RFX0NVUlNPUl9QT1M7CisJCX0KKwl9CisgZ290X2FsbDoKKworCWlmIChuIDw9IDEpIHsKKwkJLyogQWx0LXggaXMgdXN1YWxseSByZXR1cm5lZCBhcyBFU0MgeC4KKwkJICogUmVwb3J0IEVTQywgeCBpcyByZW1lbWJlcmVkIGZvciB0aGUgbmV4dCBjYWxsLgorCQkgKi8KKwkJYnVmZmVyWy0xXSA9IG47CisJCXJldHVybiAyNzsKKwl9CisKKwkvKiBXZSB3ZXJlIGRvaW5nICJidWZmZXJbLTFdID0gbjsgcmV0dXJuIGM7IiBoZXJlLCBidXQgdGhpcyByZXN1bHRzCisJICogaW4gdW5rbm93biBrZXkgc2VxdWVuY2VzIGJlaW5nIGludGVycHJldGVkIGFzIEVTQyArIGdhcmJhZ2UuCisJICogVGhpcyB3YXMgbm90IHVzZWZ1bC4gUHJldGVuZCB0aGVyZSB3YXMgbm8ga2V5IHByZXNzZWQsCisJICogZ28gYW5kIHdhaXQgZm9yIGEgbmV3IGtleXByZXNzOgorCSAqLworCWJ1ZmZlclstMV0gPSAwOworCWdvdG8gc3RhcnRfb3ZlcjsKK30KKwordm9pZCBGQVNUX0ZVTkMgcmVhZF9rZXlfdW5nZXRzKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgY3VyX2xlbiA9ICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclswXTsKKwlpZiAobGVuID4gS0VZQ09ERV9CVUZGRVJfU0laRS0xIC0gY3VyX2xlbikKKwkJbGVuID0gS0VZQ09ERV9CVUZGRVJfU0laRS0xIC0gY3VyX2xlbjsKKwltZW1jcHkoYnVmZmVyICsgMSArIGN1cl9sZW4sIHN0ciwgbGVuKTsKKwlidWZmZXJbMF0gKz0gbGVuOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVhZF9wcmludGYuYyBiL2xpYmJiL3JlYWRfcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyZjgzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3JlYWRfcHJpbnRmLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFpJUFBFRCAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQSBcCisJfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyIFwKKwl8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiBcCisJLyogfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWiAqLyBcCispCisKKyNpZiBaSVBQRUQKKyMgaW5jbHVkZSAiYXJjaGl2ZS5oIgorI2VuZGlmCisKKworLyogU3VwcG9zZSB0aGF0IHlvdSBhcmUgYSBzaGVsbC4gWW91IHN0YXJ0IGNoaWxkIHByb2Nlc3Nlcy4KKyAqIFRoZXkgd29yayBhbmQgZXZlbnR1YWxseSBleGl0LiBZb3Ugd2FudCB0byBnZXQgdXNlciBpbnB1dC4KKyAqIFlvdSByZWFkIHN0ZGluLiBCdXQgd2hhdCBoYXBwZW5zIGlmIGxhc3QgY2hpbGQgc3dpdGNoZWQKKyAqIGl0cyBzdGRpbiBpbnRvIE9fTk9OQkxPQ0sgbW9kZT8KKyAqCisgKiAqKiogU1VSUFJJU0UhIEl0IHdpbGwgYWZmZWN0IHRoZSBwYXJlbnQgdG9vISAqKioKKyAqICoqKiBCSUcgU1VSUFJJU0UhIEl0IHN0YXlzIGV2ZW4gYWZ0ZXIgY2hpbGQgZXhpdHMhICoqKgorICoKKyAqIFRoaXMgaXMgYSBkZXNpZ24gYnVnIGluIFVOSVggQVBJLgorICogICAgICBmY250bCgwLCBGX1NFVEZMLCBmY250bCgwLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworICogd2lsbCBzZXQgbm9uYmxvY2tpbmcgbW9kZSBub3Qgb25seSBvbiBfeW91cl8gc3RkaW4sIGJ1dAorICogYWxzbyBvbiBzdGRpbiBvZiB5b3VyIHBhcmVudCwgZXRjLgorICoKKyAqIEluIGdlbmVyYWwsCisgKiAgICAgIGZkMiA9IGR1cChmZDEpOworICogICAgICBmY250bChmZDIsIEZfU0VURkwsIGZjbnRsKGZkMiwgRl9HRVRGTCkgfCBPX05PTkJMT0NLKTsKKyAqIHNldHMgYm90aCBmZDEgYW5kIGZkMiB0byBPX05PTkJMT0NLLiBUaGlzIGluY2x1ZGVzIGNhc2VzCisgKiB3aGVyZSBkdXBpbmcgaXMgZG9uZSBpbXBsaWNpdGx5IGJ5IGZvcmsoKSBldGMuCisgKgorICogV2UgbmVlZAorICogICAgICBmY250bChmZDIsIEZfU0VURkQsIGZjbnRsKGZkMiwgRl9HRVRGRCkgfCBPX05PTkJMT0NLKTsKKyAqIChub3RlIFNFVEZELCBub3QgU0VURkwhKSBidXQgc3VjaCB0aGluZyBkb2Vzbid0IGV4aXN0LgorICoKKyAqIEFsdGVybmF0aXZlbHksIHdlIG5lZWQgbm9uYmxvY2tpbmdfcmVhZChmZCwgLi4uKSB3aGljaCBkb2Vzbid0CisgKiByZXF1aXJlIE9fTk9OQkxPQ0sgZGFuY2UgYXQgYWxsLiBBY3R1YWxseSwgaXQgZXhpc3RzOgorICogICAgICBuID0gcmVjdihmZCwgYnVmLCBsZW4sIE1TR19ET05UV0FJVCk7CisgKiAgICAgICJNU0dfRE9OVFdBSVQ6CisgKiAgICAgIEVuYWJsZXMgbm9uLWJsb2NraW5nIG9wZXJhdGlvbjsgaWYgdGhlIG9wZXJhdGlvbgorICogICAgICB3b3VsZCBibG9jaywgRUFHQUlOIGlzIHJldHVybmVkLiIKKyAqIGJ1dCByZWN2KCkgd29ya3Mgb25seSBmb3Igc29ja2V0cyEKKyAqCisgKiBTbyBmYXIgSSBkb24ndCBzZWUgYW55IGdvb2Qgc29sdXRpb24sIEkgY2FuIG9ubHkgcHJvcG9zZQorICogdGhhdCBhZmZlY3RlZCByZWFkZXJzIHNob3VsZCBiZSBjYXJlZnVsIGFuZCB1c2UgdGhpcyByb3V0aW5lLAorICogd2hpY2ggZGV0ZWN0cyBFQUdBSU4gYW5kIHVzZXMgcG9sbCgpIHRvIHdhaXQgb24gdGhlIGZkLgorICogVGhhbmtmdWxseSwgcG9sbCgpIGRvZXNuJ3QgY2FyZSBhYm91dCBPX05PTkJMT0NLIGZsYWcuCisgKi8KK3NzaXplX3QgRkFTVF9GVU5DIG5vbmJsb2NrX2ltbXVuZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGludCBsb29wX29uX0VJTlRSKQoreworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCXNzaXplX3QgbjsKKworCXdoaWxlICgxKSB7CisJCW4gPSBsb29wX29uX0VJTlRSID8gc2FmZV9yZWFkKGZkLCBidWYsIGNvdW50KSA6IHJlYWQoZmQsIGJ1ZiwgY291bnQpOworCQlpZiAobiA+PSAwIHx8IGVycm5vICE9IEVBR0FJTikKKwkJCXJldHVybiBuOworCQkvKiBmZCBpcyBpbiBPX05PTkJMT0NLIG1vZGUuIFdhaXQgdXNpbmcgcG9sbCBhbmQgcmVwZWF0ICovCisJCXBmZFswXS5mZCA9IGZkOworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQkvKiBub3RlOiBzYWZlX3BvbGwgcHVsbHMgaW4gcHJpbnRmICovCisJCWxvb3Bfb25fRUlOVFIgPyBzYWZlX3BvbGwocGZkLCAxLCAtMSkgOiBwb2xsKHBmZCwgMSwgLTEpOworCX0KK30KKworLy8gUmVhZHMgb25lIGxpbmUgYS1sYSBmZ2V0cyAoYnV0IGRvZXNuJ3Qgc2F2ZSB0ZXJtaW5hdGluZyAnXG4nKS4KKy8vIFJlYWRzIGJ5dGUtYnktYnl0ZS4gVXNlZnVsIHdoZW4gaXQgaXMgaW1wb3J0YW50IHRvIG5vdCByZWFkIGFoZWFkLgorLy8gQnl0ZXMgYXJlIGFwcGVuZGVkIHRvIHBmeCAod2hpY2ggbXVzdCBiZSBtYWxsb2NlZCwgb3IgTlVMTCkuCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19yZWFkcyhpbnQgZmQsIHNpemVfdCAqbWF4c3pfcCkKK3sKKwljaGFyICpwOworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJc2l6ZV90IHN6ID0gMDsKKwlzaXplX3QgbWF4c3ogPSBtYXhzel9wID8gKm1heHN6X3AgOiAoSU5UX01BWCAtIDQwOTUpOworCisJZ290byBqdW1wX2luOworCisJd2hpbGUgKHN6IDwgbWF4c3opIHsKKwkJaWYgKChzaXplX3QpKHAgLSBidWYpID09IHN6KSB7CisganVtcF9pbjoKKwkJCWJ1ZiA9IHhyZWFsbG9jKGJ1Ziwgc3ogKyAxMjgpOworCQkJcCA9IGJ1ZiArIHN6OworCQkJc3ogKz0gMTI4OworCQl9CisJCWlmIChub25ibG9ja19pbW11bmVfcmVhZChmZCwgcCwgMSwgLypsb29wX29uX0VJTlRSOiovIDEpICE9IDEpIHsKKwkJCS8qIEVPRi9lcnJvciAqLworCQkJaWYgKHAgPT0gYnVmKSB7IC8qIHdlIHJlYWQgbm90aGluZyAqLworCQkJCWZyZWUoYnVmKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgqcCA9PSAnXG4nKQorCQkJYnJlYWs7CisJCXArKzsKKwl9CisJKnAgPSAnXDAnOworCWlmIChtYXhzel9wKQorCQkqbWF4c3pfcCAgPSBwIC0gYnVmOworCXArKzsKKwlyZXR1cm4geHJlYWxsb2MoYnVmLCBwIC0gYnVmKTsKK30KKworLy8gUmVhZCAocG90ZW50aWFsbHkgYmlnKSBmaWxlcyBpbiBvbmUgZ28uIEZpbGUgc2l6ZSBpcyBlc3RpbWF0ZWQKKy8vIGJ5IHN0YXQuIEV4dHJhICdcMCcgYnl0ZSBpcyBhcHBlbmRlZC4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX3JlYWQoaW50IGZkLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplLCByZF9zaXplLCB0b3RhbDsKKwlzaXplX3QgdG9fcmVhZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXRvX3JlYWQgPSBtYXhzel9wID8gKm1heHN6X3AgOiAoSU5UX01BWCAtIDQwOTUpOyAvKiBtYXggdG8gcmVhZCAqLworCisJLyogRXN0aW1hdGUgZmlsZSBzaXplICovCisJc3Quc3Rfc2l6ZSA9IDA7IC8qIGluIGNhc2UgZnN0YXQgZmFpbHMsIGFzc3VtZSAwICovCisJZnN0YXQoZmQsICZzdCk7CisJLyogL3Byb2MvTi9zdGF0IGZpbGVzIHJlcG9ydCBzdF9zaXplIDAgKi8KKwkvKiBJbiBvcmRlciB0byBtYWtlIHN1Y2ggZmlsZXMgcmVhZGFibGUsIHdlIGFkZCBzbWFsbCBjb25zdCAqLworCXNpemUgPSAoc3Quc3Rfc2l6ZSB8IDB4M2ZmKSArIDE7CisKKwl0b3RhbCA9IDA7CisJYnVmID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQlpZiAodG9fcmVhZCA8IHNpemUpCisJCQlzaXplID0gdG9fcmVhZDsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCB0b3RhbCArIHNpemUgKyAxKTsKKwkJcmRfc2l6ZSA9IGZ1bGxfcmVhZChmZCwgYnVmICsgdG90YWwsIHNpemUpOworCQlpZiAoKHNzaXplX3QpcmRfc2l6ZSA9PSAoc3NpemVfdCkoLTEpKSB7IC8qIGVycm9yICovCisJCQlmcmVlKGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0b3RhbCArPSByZF9zaXplOworCQlpZiAocmRfc2l6ZSA8IHNpemUpIC8qIEVPRiAqLworCQkJYnJlYWs7CisJCWlmICh0b19yZWFkIDw9IHJkX3NpemUpCisJCQlicmVhazsKKwkJdG9fcmVhZCAtPSByZF9zaXplOworCQkvKiBncm93IGJ5IDEvOCwgYnV0IGluIFsxay4uNjRrXSBib3VuZHMgKi8KKwkJc2l6ZSA9ICgodG90YWwgLyA4KSB8IDB4M2ZmKSArIDE7CisJCWlmIChzaXplID4gNjQqMTAyNCkKKwkJCXNpemUgPSA2NCoxMDI0OworCX0KKwlidWYgPSB4cmVhbGxvYyhidWYsIHRvdGFsICsgMSk7CisJYnVmW3RvdGFsXSA9ICdcMCc7CisKKwlpZiAobWF4c3pfcCkKKwkJKm1heHN6X3AgPSB0b3RhbDsKKwlyZXR1cm4gYnVmOworfQorCisjaWZkZWYgVVNJTkdfTFNFRUtfVE9fR0VUX1NJWkUKKy8qIEFsdGVybmF0aXZlbHksIGZpbGUgc2l6ZSBjYW4gYmUgb2J0YWluZWQgYnkgbHNlZWsgdG8gdGhlIGVuZC4KKyAqIFRoZSBjb2RlIGlzIHNsaWdodGx5IGJpZ2dlci4gUmV0YWluZWQgaW4gY2FzZSBmc3RhdCBhcHByb2FjaAorICogd2lsbCBub3Qgd29yayBmb3Igc29tZSB3ZWlyZCBjYXNlcyAoL3Byb2MsIGJsb2NrIGRldmljZXMsIGV0YykuCisgKiAoTkI6IGxzZWVrIGFsc28gY2FuIGZhaWwgdG8gd29yayBmb3Igc29tZSB3ZWlyZCBmaWxlcykgKi8KKworLy8gUmVhZCAocG90ZW50aWFsbHkgYmlnKSBmaWxlcyBpbiBvbmUgZ28uIEZpbGUgc2l6ZSBpcyBlc3RpbWF0ZWQgYnkKKy8vIGxzZWVrIHRvIGVuZC4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKQoreworCWNoYXIgKmJ1ZjsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZmQ7CisJb2ZmX3QgbGVuOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiAvcHJvYy9OL3N0YXQgZmlsZXMgcmVwb3J0IGxlbiAwIGhlcmUgKi8KKwkvKiBJbiBvcmRlciB0byBtYWtlIHN1Y2ggZmlsZXMgcmVhZGFibGUsIHdlIGFkZCBzbWFsbCBjb25zdCAqLworCXNpemUgPSAweDNmZjsgLyogcmVhZCBvbmx5IDFrIG9uIHVuc2Vla2FibGUgZmlsZXMgKi8KKwlsZW4gPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpIHwgMHgzZmY7IC8qICsgdXAgdG8gMWsgKi8KKwlpZiAobGVuICE9IChvZmZfdCktMSkgeworCQl4bHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwkJc2l6ZSA9IG1heHN6X3AgPyAqbWF4c3pfcCA6IChJTlRfTUFYIC0gNDA5NSk7CisJCWlmIChsZW4gPCBzaXplKQorCQkJc2l6ZSA9IGxlbjsKKwl9CisKKwlidWYgPSB4bWFsbG9jKHNpemUgKyAxKTsKKwlzaXplID0gcmVhZF9jbG9zZShmZCwgYnVmLCBzaXplKTsKKwlpZiAoKHNzaXplX3Qpc2l6ZSA8IDApIHsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmID0geHJlYWxsb2MoYnVmLCBzaXplICsgMSk7CisJYnVmW3NpemVdID0gJ1wwJzsKKworCWlmIChtYXhzel9wKQorCQkqbWF4c3pfcCA9IHNpemU7CisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgorCisvLyBSZWFkIChwb3RlbnRpYWxseSBiaWcpIGZpbGVzIGluIG9uZSBnby4gRmlsZSBzaXplIGlzIGVzdGltYXRlZAorLy8gYnkgc3RhdC4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKQoreworCWNoYXIgKmJ1ZjsKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1ZiA9IHhtYWxsb2NfcmVhZChmZCwgbWF4c3pfcCk7CisJY2xvc2UoZmQpOworCXJldHVybiBidWY7Cit9CisKKy8qIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlci4gKi8KK3ZvaWQgRkFTVF9GVU5DIHhyZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXNzaXplX3Qgc2l6ZSA9IGZ1bGxfcmVhZChmZCwgYnVmLCBjb3VudCk7CisJCWlmICgoc2l6ZV90KXNpemUgIT0gY291bnQpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCIpOworCX0KK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCByZWFkIG9uZSBjaGFyYWN0ZXIuICovCit1bnNpZ25lZCBjaGFyIEZBU1RfRlVOQyB4cmVhZF9jaGFyKGludCBmZCkKK3sKKwljaGFyIHRtcDsKKwl4cmVhZChmZCwgJnRtcCwgMSk7CisJcmV0dXJuIHRtcDsKK30KKwordm9pZCogRkFTVF9GVU5DIHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKQoreworCXZvaWQgKmJ1ZiA9IHhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKGZpbGVuYW1lLCBtYXhzel9wKTsKKwlpZiAoIWJ1ZikKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkICclcyciLCBmaWxlbmFtZSk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogVXNlZCBieSBlLmcuIHJwbSB3aGljaCBnaXZlcyB1cyBhIGZkIHdpdGhvdXQgZmlsZW5hbWUsCisgKiB0aHVzIHdlIGNhbid0IGd1ZXNzIHRoZSBmb3JtYXQgZnJvbSBmaWxlbmFtZSdzIGV4dGVuc2lvbi4KKyAqLworI2lmIFpJUFBFRAordm9pZCBGQVNUX0ZVTkMgc2V0dXBfdW56aXBfb25fZmQoaW50IGZkIC8qLCBpbnQgZmFpbF9pZl9ub3RfZGV0ZWN0ZWQqLykKK3sKKwljb25zdCBpbnQgZmFpbF9pZl9ub3RfZGV0ZWN0ZWQgPSAxOworCXVuaW9uIHsKKwkJdWludDhfdCBiWzRdOworCQl1aW50MTZfdCBiMTZbMl07CisJCXVpbnQzMl90IGIzMlsxXTsKKwl9IG1hZ2ljOworCWludCBvZmZzZXQgPSAtMjsKKyMgaWYgQkJfTU1VCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp4Zm9ybWVyKShpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkKTsKKwllbnVtIHsgeGZvcm1lcl9wcm9nID0gMCB9OworIyBlbHNlCisJZW51bSB7IHhmb3JtZXIgPSAwIH07CisJY29uc3QgY2hhciAqeGZvcm1lcl9wcm9nOworIyBlbmRpZgorCisJLyogLmd6IGFuZCAuYnoyIGJvdGggaGF2ZSAyLWJ5dGUgc2lnbmF0dXJlLCBhbmQgdGhlaXIKKwkgKiB1bnBhY2tfWFhYX3N0cmVhbSB3YW50cyB0aGlzIGhlYWRlciBza2lwcGVkLiAqLworCXhyZWFkKGZkLCBtYWdpYy5iMTYsIHNpemVvZihtYWdpYy5iMTZbMF0pKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwkgJiYgbWFnaWMuYjE2WzBdID09IEdaSVBfTUFHSUMKKwkpIHsKKyMgaWYgQkJfTU1VCisJCXhmb3JtZXIgPSB1bnBhY2tfZ3pfc3RyZWFtOworIyBlbHNlCisJCXhmb3JtZXJfcHJvZyA9ICJndW56aXAiOworIyBlbmRpZgorCQlnb3RvIGZvdW5kX21hZ2ljOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJICYmIG1hZ2ljLmIxNlswXSA9PSBCWklQMl9NQUdJQworCSkgeworIyBpZiBCQl9NTVUKKwkJeGZvcm1lciA9IHVucGFja19iejJfc3RyZWFtOworIyBlbHNlCisJCXhmb3JtZXJfcHJvZyA9ICJidW56aXAyIjsKKyMgZW5kaWYKKwkJZ290byBmb3VuZF9tYWdpYzsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1haCisJICYmIG1hZ2ljLmIxNlswXSA9PSBYWl9NQUdJQzEKKwkpIHsKKwkJb2Zmc2V0ID0gLTY7CisJCXhyZWFkKGZkLCBtYWdpYy5iMzIsIHNpemVvZihtYWdpYy5iMzJbMF0pKTsKKwkJaWYgKG1hZ2ljLmIzMlswXSA9PSBYWl9NQUdJQzIpIHsKKyMgaWYgQkJfTU1VCisJCQl4Zm9ybWVyID0gdW5wYWNrX3h6X3N0cmVhbTsKKwkJCS8qIHVucGFja194el9zdHJlYW0gd2FudHMgZmQgYXQgcG9zaXRpb24gNiwgbm8gbmVlZCB0byBzZWVrICovCisJCQkvL3hsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX0NVUik7CisjIGVsc2UKKwkJCXhmb3JtZXJfcHJvZyA9ICJ1bnh6IjsKKyMgZW5kaWYKKwkJCWdvdG8gZm91bmRfbWFnaWM7CisJCX0KKwl9CisKKwkvKiBObyBrbm93biBtYWdpYyBzZWVuICovCisJaWYgKGZhaWxfaWZfbm90X2RldGVjdGVkKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gZ3ppcCIKKwkJCUlGX0ZFQVRVUkVfU0VBTUxFU1NfQloyKCIvYnppcDIiKQorCQkJSUZfRkVBVFVSRV9TRUFNTEVTU19YWigiL3h6IikKKwkJCSIgbWFnaWMiKTsKKwl4bHNlZWsoZmQsIG9mZnNldCwgU0VFS19DVVIpOworCXJldHVybjsKKworIGZvdW5kX21hZ2ljOgorIyBpZiAhQkJfTU1VCisJLyogTk9NTVUgdmVyc2lvbiBvZiBvcGVuX3RyYW5zZm9ybWVyIGV4ZWNzCisJICogYW4gZXh0ZXJuYWwgdW56aXBwZXIgdGhhdCB3YW50cworCSAqIGZpbGUgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCisJeGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfQ1VSKTsKKyMgZW5kaWYKKwlvcGVuX3RyYW5zZm9ybWVyKGZkLCB4Zm9ybWVyLCB4Zm9ybWVyX3Byb2cpOworfQorI2VuZGlmIC8qIFpJUFBFRCAqLworCitpbnQgRkFTVF9GVU5DIG9wZW5femlwcGVkKGNvbnN0IGNoYXIgKmZuYW1lKQoreworI2lmICFaSVBQRUQKKwlyZXR1cm4gb3BlbihmbmFtZSwgT19SRE9OTFkpOworI2Vsc2UKKwljaGFyICpzZng7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJc2Z4ID0gc3RycmNocihmbmFtZSwgJy4nKTsKKwlpZiAoc2Z4KSB7CisJCXNmeCsrOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQSAmJiBzdHJjbXAoc2Z4LCAibHptYSIpID09IDApCisJCQkvKiAubHptYSBoYXMgbm8gaGVhZGVyL3NpZ25hdHVyZSwganVzdCB0cnVzdCBpdCAqLworCQkJb3Blbl90cmFuc2Zvcm1lcihmZCwgdW5wYWNrX2x6bWFfc3RyZWFtLCAidW5sem1hIik7CisJCWVsc2UKKwkJaWYgKChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWiAmJiBzdHJjbXAoc2Z4LCAiZ3oiKSA9PSAwKQorCQkgfHwgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMiAmJiBzdHJjbXAoc2Z4LCAiYnoyIikgPT0gMCkKKwkJIHx8IChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19YWiAmJiBzdHJjbXAoc2Z4LCAieHoiKSA9PSAwKQorCQkpIHsKKwkJCXNldHVwX3VuemlwX29uX2ZkKGZkIC8qLCBmYWlsX2lmX25vdF9kZXRlY3RlZDogMSovKTsKKwkJfQorCX0KKworCXJldHVybiBmZDsKKyNlbmRpZgorfQorCit2b2lkKiBGQVNUX0ZVTkMgeG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZuYW1lLCBzaXplX3QgKm1heHN6X3ApCit7CisJaW50IGZkOworCWNoYXIgKmltYWdlOworCisJZmQgPSBvcGVuX3ppcHBlZChmbmFtZSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbWFnZSA9IHhtYWxsb2NfcmVhZChmZCwgbWF4c3pfcCk7CisJaWYgKCFpbWFnZSkKKwkJYmJfcGVycm9yX21zZygicmVhZCBlcnJvciBmcm9tICclcyciLCBmbmFtZSk7CisJY2xvc2UoZmQpOworCisJcmV0dXJuIGltYWdlOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVjdXJzaXZlX2FjdGlvbi5jIGIvbGliYmIvcmVjdXJzaXZlX2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2Y3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9yZWN1cnNpdmVfYWN0aW9uLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyN1bmRlZiBERUJVR19SRUNVUlNfQUNUSU9OCisKKy8qCisgKiBXYWxrIGRvd24gYWxsIHRoZSBkaXJlY3RvcmllcyB1bmRlciB0aGUgc3BlY2lmaWVkCisgKiBsb2NhdGlvbiwgYW5kIGRvIHNvbWV0aGluZyAoc29tZXRoaW5nIHNwZWNpZmllZAorICogYnkgdGhlIGZpbGVBY3Rpb24gYW5kIGRpckFjdGlvbiBmdW5jdGlvbiBwb2ludGVycykuCisgKgorICogVW5mb3J0dW5hdGVseSwgd2hpbGUgbmZ0dygzKSBjb3VsZCByZXBsYWNlIHRoaXMgYW5kIHJlZHVjZQorICogY29kZSBzaXplIGEgYml0LCBuZnR3KCkgd2Fzbid0IHN1cHBvcnRlZCBiZWZvcmUgR05VIGxpYmMgMi4xLAorICogYW5kIHNvIGlzbid0IHN1ZmZpY2llbnRseSBwb3J0YWJsZSB0byB0YWtlIG92ZXIgc2luY2UgZ2xpYmMyLjEKKyAqIGlzIHNvIHN0aW5raW5nIGh1Z2UuCisgKi8KKworc3RhdGljIGludCBGQVNUX0ZVTkMgdHJ1ZV9hY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUgVU5VU0VEX1BBUkFNLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCXZvaWQqIHVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gVFJVRTsKK30KKworLyogZmlsZUFjdGlvbiByZXR1cm4gdmFsdWUgb2YgMCBvbiBhbnkgZmlsZSBpbiBkaXJlY3Rvcnkgd2lsbCBtYWtlCisgKiByZWN1cnNpdmVfYWN0aW9uKCkgcmV0dXJuIDAsIGJ1dCBpdCBkb2Vzbid0IHN0b3AgZGlyZWN0b3J5IHRyYXZlcnNhbAorICogKGZpbGVBY3Rpb24vZGlyQWN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggZmlsZSkuCisgKgorICogSWYgIUFDVElPTl9SRUNVUlNFLCBkaXJBY3Rpb24gaXMgY2FsbGVkIG9uIHRoZSBkaXJlY3RvcnkgYW5kIGl0cworICogcmV0dXJuIHZhbHVlIGlzIHJldHVybmVkIGZyb20gcmVjdXJzaXZlX2FjdGlvbigpLiBObyByZWN1cnNpb24uCisgKgorICogSWYgQUNUSU9OX1JFQ1VSU0UsIHJlY3Vyc2l2ZV9hY3Rpb24oKSBpcyBjYWxsZWQgb24gZWFjaCBkaXJlY3RvcnkuCisgKiBJZiBhbnkgb25lIG9mIHRoZXNlIGNhbGxzIHJldHVybnMgMCwgY3VycmVudCByZWN1cnNpdmVfYWN0aW9uKCkgcmV0dXJucyAwLgorICoKKyAqIElmIEFDVElPTl9ERVBUSEZJUlNULCBkaXJBY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHJlY3Vyc2UuCisgKiBJZiBpdCByZXR1cm5zIDAsIHRoZSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIHJlY3Vyc2l2ZV9hY3Rpb24oKSByZXR1cm5zIDAuCisgKgorICogSWYgIUFDVElPTl9ERVBUSEZJUlNULCBkaXJBY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB3ZSByZWN1cnNlLgorICogUmV0dXJuIHZhbHVlIG9mIDAgKEZBTFNFKSBvciAyIChTS0lQKSBwcmV2ZW50cyByZWN1cnNpb24KKyAqIGludG8gdGhhdCBkaXJlY3RvcnksIGluc3RlYWQgcmVjdXJzaXZlX2FjdGlvbigpIHJldHVybnMgMCAoaWYgRkFMU0UpCisgKiBvciAxIChpZiBTS0lQKQorICoKKyAqIEFDVElPTl9GT0xMT1dMSU5LUyBtYWlubHkgY29udHJvbHMgaGFuZGxpbmcgb2YgbGlua3MgdG8gZGlycy4KKyAqIDA6IGxzdGF0KHN0YXRidWYpLiBDYWxscyBmaWxlQWN0aW9uIG9uIGxpbmsgbmFtZSBldmVuIGlmIHBvaW50cyB0byBkaXIuCisgKiAxOiBzdGF0KHN0YXRidWYpLiBDYWxscyBkaXJBY3Rpb24gYW5kIG9wdGlvbmFsbHkgcmVjdXJzZSBvbiBsaW5rIHRvIGRpci4KKyAqLworCitpbnQgRkFTVF9GVU5DIHJlY3Vyc2l2ZV9hY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXVuc2lnbmVkIGZsYWdzLAorCQlpbnQgRkFTVF9GVU5DICgqZmlsZUFjdGlvbikoY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmLCB2b2lkKiB1c2VyRGF0YSwgaW50IGRlcHRoKSwKKwkJaW50IEZBU1RfRlVOQyAoKmRpckFjdGlvbikoY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmLCB2b2lkKiB1c2VyRGF0YSwgaW50IGRlcHRoKSwKKwkJdm9pZCogdXNlckRhdGEsCisJCXVuc2lnbmVkIGRlcHRoKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJdW5zaWduZWQgZm9sbG93OworCWludCBzdGF0dXM7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqbmV4dDsKKworCWlmICghZmlsZUFjdGlvbikgZmlsZUFjdGlvbiA9IHRydWVfYWN0aW9uOworCWlmICghZGlyQWN0aW9uKSBkaXJBY3Rpb24gPSB0cnVlX2FjdGlvbjsKKworCWZvbGxvdyA9IEFDVElPTl9GT0xMT1dMSU5LUzsKKwlpZiAoZGVwdGggPT0gMCkKKwkJZm9sbG93ID0gQUNUSU9OX0ZPTExPV0xJTktTIHwgQUNUSU9OX0ZPTExPV0xJTktTX0wwOworCWZvbGxvdyAmPSBmbGFnczsKKwlzdGF0dXMgPSAoZm9sbG93ID8gc3RhdCA6IGxzdGF0KShmaWxlTmFtZSwgJnN0YXRidWYpOworCWlmIChzdGF0dXMgPCAwKSB7CisjaWZkZWYgREVCVUdfUkVDVVJTX0FDVElPTgorCQliYl9lcnJvcl9tc2coInN0YXR1cz0lZCBmbGFncz0leCIsIHN0YXR1cywgZmxhZ3MpOworI2VuZGlmCisJCWlmICgoZmxhZ3MgJiBBQ1RJT05fREFOR0xJTkdfT0spCisJCSAmJiBlcnJubyA9PSBFTk9FTlQKKwkJICYmIGxzdGF0KGZpbGVOYW1lLCAmc3RhdGJ1ZikgPT0gMAorCQkpIHsKKwkJCS8qIERhbmdsaW5nIGxpbmsgKi8KKwkJCXJldHVybiBmaWxlQWN0aW9uKGZpbGVOYW1lLCAmc3RhdGJ1ZiwgdXNlckRhdGEsIGRlcHRoKTsKKwkJfQorCQlnb3RvIGRvbmVfbmFrX3dhcm47CisJfQorCisJLyogSWYgU19JU0xOSyhtKSwgdGhlbiB3ZSBrbm93IHRoYXQgIVNfSVNESVIobSkuCisJICogVGhlbiB3ZSBjYW4gc2tpcCBjaGVja2luZyBmaXJzdCBwYXJ0OiBpZiBpdCBpcyB0cnVlLCB0aGVuCisJICogKCFkaXIpIGlzIGFsc28gdHJ1ZSEgKi8KKwlpZiAoIC8qICghKGZsYWdzICYgQUNUSU9OX0ZPTExPV0xJTktTKSAmJiBTX0lTTE5LKHN0YXRidWYuc3RfbW9kZSkpIHx8ICovCisJICFTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkKKwkpIHsKKwkJcmV0dXJuIGZpbGVBY3Rpb24oZmlsZU5hbWUsICZzdGF0YnVmLCB1c2VyRGF0YSwgZGVwdGgpOworCX0KKworCS8qIEl0J3MgYSBkaXJlY3RvcnkgKG9yIGEgbGluayB0byBvbmUsIGFuZCBmb2xsb3dMaW5rcyBpcyBzZXQpICovCisKKwlpZiAoIShmbGFncyAmIEFDVElPTl9SRUNVUlNFKSkgeworCQlyZXR1cm4gZGlyQWN0aW9uKGZpbGVOYW1lLCAmc3RhdGJ1ZiwgdXNlckRhdGEsIGRlcHRoKTsKKwl9CisKKwlpZiAoIShmbGFncyAmIEFDVElPTl9ERVBUSEZJUlNUKSkgeworCQlzdGF0dXMgPSBkaXJBY3Rpb24oZmlsZU5hbWUsICZzdGF0YnVmLCB1c2VyRGF0YSwgZGVwdGgpOworCQlpZiAoIXN0YXR1cykKKwkJCWdvdG8gZG9uZV9uYWtfd2FybjsKKwkJaWYgKHN0YXR1cyA9PSBTS0lQKQorCQkJcmV0dXJuIFRSVUU7CisJfQorCisJZGlyID0gb3BlbmRpcihmaWxlTmFtZSk7CisJaWYgKCFkaXIpIHsKKwkJLyogZmluZHV0aWxzLTQuMS4yMCByZXBvcnRzIHRoaXMgKi8KKwkJLyogKGkuZS4gaXQgZG9lc24ndCBzaWxlbnRseSByZXR1cm4gd2l0aCBleGl0IGNvZGUgMSkgKi8KKwkJLyogVG8gdHJpZ2dlcjogImZpbmQgLWV4ZWMgcm0gLXJmIHt9IFw7IiAqLworCQlnb3RvIGRvbmVfbmFrX3dhcm47CisJfQorCXN0YXR1cyA9IFRSVUU7CisJd2hpbGUgKChuZXh0ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWNoYXIgKm5leHRGaWxlOworCisJCW5leHRGaWxlID0gY29uY2F0X3N1YnBhdGhfZmlsZShmaWxlTmFtZSwgbmV4dC0+ZF9uYW1lKTsKKwkJaWYgKG5leHRGaWxlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJLyogcHJvY2VzcyBldmVyeSBmaWxlIChOQjogQUNUSU9OX1JFQ1VSU0UgaXMgc2V0IGluIGZsYWdzKSAqLworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24obmV4dEZpbGUsIGZsYWdzLCBmaWxlQWN0aW9uLCBkaXJBY3Rpb24sCisJCQkJCQl1c2VyRGF0YSwgZGVwdGggKyAxKSkKKwkJCXN0YXR1cyA9IEZBTFNFOworLy8JCXMgPSByZWN1cnNpdmVfYWN0aW9uKG5leHRGaWxlLCBmbGFncywgZmlsZUFjdGlvbiwgZGlyQWN0aW9uLAorLy8JCQkJCQl1c2VyRGF0YSwgZGVwdGggKyAxKTsKKwkJZnJlZShuZXh0RmlsZSk7CisvLyNkZWZpbmUgUkVDVVJTRV9SRVNVTFRfQUJPUlQgMworLy8JCWlmIChzID09IFJFQ1VSU0VfUkVTVUxUX0FCT1JUKSB7CisvLwkJCWNsb3NlZGlyKGRpcik7CisvLwkJCXJldHVybiBzOworLy8JCX0KKy8vCQlpZiAocyA9PSBGQUxTRSkKKy8vCQkJc3RhdHVzID0gRkFMU0U7CisJfQorCWNsb3NlZGlyKGRpcik7CisKKwlpZiAoZmxhZ3MgJiBBQ1RJT05fREVQVEhGSVJTVCkgeworCQlpZiAoIWRpckFjdGlvbihmaWxlTmFtZSwgJnN0YXRidWYsIHVzZXJEYXRhLCBkZXB0aCkpCisJCQlnb3RvIGRvbmVfbmFrX3dhcm47CisJfQorCisJcmV0dXJuIHN0YXR1czsKKworIGRvbmVfbmFrX3dhcm46CisJaWYgKCEoZmxhZ3MgJiBBQ1RJT05fUVVJRVQpKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlTmFtZSk7CisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVtb3ZlX2ZpbGUuYyBiL2xpYmJiL3JlbW92ZV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1MzFhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3JlbW92ZV9maWxlLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcmVtb3ZlX2ZpbGUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBVc2VkIGZyb20gTk9GT1JLIGFwcGxldHMuIE11c3Qgbm90IGFsbG9jYXRlIGFueXRoaW5nICovCisKK2ludCBGQVNUX0ZVTkMgcmVtb3ZlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzdGF0IHBhdGhfc3RhdDsKKworCWlmIChsc3RhdChwYXRoLCAmcGF0aF9zdGF0KSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc3RhdCAnJXMnIiwgcGF0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCEoZmxhZ3MgJiBGSUxFVVRJTFNfRk9SQ0UpKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZW1vdmUgJyVzJyIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChTX0lTRElSKHBhdGhfc3RhdC5zdF9tb2RlKSkgeworCQlESVIgKmRwOworCQlzdHJ1Y3QgZGlyZW50ICpkOworCQlpbnQgc3RhdHVzID0gMDsKKworCQlpZiAoIShmbGFncyAmIEZJTEVVVElMU19SRUNVUikpIHsKKwkJCWJiX2Vycm9yX21zZygiJXM6IGlzIGEgZGlyZWN0b3J5IiwgcGF0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoKCEoZmxhZ3MgJiBGSUxFVVRJTFNfRk9SQ0UpICYmIGFjY2VzcyhwYXRoLCBXX09LKSA8IDAgJiYgaXNhdHR5KDApKQorCQkgfHwgKGZsYWdzICYgRklMRVVUSUxTX0lOVEVSQUNUSVZFKQorCQkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGRlc2NlbmQgaW50byBkaXJlY3RvcnkgJyVzJz8gIiwgYXBwbGV0X25hbWUsCisJCQkJCXBhdGgpOworCQkJaWYgKCFiYl9hc2tfY29uZmlybWF0aW9uKCkpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlkcCA9IG9wZW5kaXIocGF0aCk7CisJCWlmIChkcCA9PSBOVUxMKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3aGlsZSAoKGQgPSByZWFkZGlyKGRwKSkgIT0gTlVMTCkgeworCQkJY2hhciAqbmV3X3BhdGg7CisKKwkJCW5ld19wYXRoID0gY29uY2F0X3N1YnBhdGhfZmlsZShwYXRoLCBkLT5kX25hbWUpOworCQkJaWYgKG5ld19wYXRoID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlpZiAocmVtb3ZlX2ZpbGUobmV3X3BhdGgsIGZsYWdzKSA8IDApCisJCQkJc3RhdHVzID0gLTE7CisJCQlmcmVlKG5ld19wYXRoKTsKKwkJfQorCisJCWlmIChjbG9zZWRpcihkcCkgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjbG9zZSAnJXMnIiwgcGF0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfSU5URVJBQ1RJVkUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHJlbW92ZSBkaXJlY3RvcnkgJyVzJz8gIiwgYXBwbGV0X25hbWUsIHBhdGgpOworCQkJaWYgKCFiYl9hc2tfY29uZmlybWF0aW9uKCkpCisJCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCWlmIChybWRpcihwYXRoKSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlbW92ZSAnJXMnIiwgcGF0aCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qICFJU0RJUiAqLworCWlmICgoIShmbGFncyAmIEZJTEVVVElMU19GT1JDRSkKKwkgICAgICYmIGFjY2VzcyhwYXRoLCBXX09LKSA8IDAKKwkgICAgICYmICFTX0lTTE5LKHBhdGhfc3RhdC5zdF9tb2RlKQorCSAgICAgJiYgaXNhdHR5KDApKQorCSB8fCAoZmxhZ3MgJiBGSUxFVVRJTFNfSU5URVJBQ1RJVkUpCisJKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHJlbW92ZSAnJXMnPyAiLCBhcHBsZXRfbmFtZSwgcGF0aCk7CisJCWlmICghYmJfYXNrX2NvbmZpcm1hdGlvbigpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVubGluayhwYXRoKSA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlICclcyciLCBwYXRoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcnRjLmMgYi9saWJiYi9ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQ1NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcnRjLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvbW1vbiBSVEMgZnVuY3Rpb25zCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydGNfLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTCisjIGRlZmluZSBBREpUSU1FX1BBVEggIi92YXIvbGliL2h3Y2xvY2svYWRqdGltZSIKKyNlbHNlCisjIGRlZmluZSBBREpUSU1FX1BBVEggIi9ldGMvYWRqdGltZSIKKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIHJ0Y19hZGp0aW1lX2lzX3V0Yyh2b2lkKQoreworCWludCB1dGMgPSAwOworCUZJTEUgKmYgPSBmb3Blbl9mb3JfcmVhZChBREpUSU1FX1BBVEgpOworCisJaWYgKGYpIHsKKwkJY2hhciBidWZmZXJbMTI4XTsKKworCQl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZikpIHsKKwkJCWlmIChzdHJuY21wKGJ1ZmZlciwgIlVUQyIsIDMpID09IDApIHsKKwkJCQl1dGMgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZjbG9zZShmKTsKKwl9CisKKwlyZXR1cm4gdXRjOworfQorCitpbnQgRkFTVF9GVU5DIHJ0Y194b3Blbihjb25zdCBjaGFyICoqZGVmYXVsdF9ydGMsIGludCBmbGFncykKK3sKKwlpbnQgcnRjOworCisJaWYgKCEqZGVmYXVsdF9ydGMpIHsKKwkJKmRlZmF1bHRfcnRjID0gIi9kZXYvcnRjIjsKKwkJcnRjID0gb3BlbigqZGVmYXVsdF9ydGMsIGZsYWdzKTsKKwkJaWYgKHJ0YyA+PSAwKQorCQkJcmV0dXJuIHJ0YzsKKwkJKmRlZmF1bHRfcnRjID0gIi9kZXYvcnRjMCI7CisJCXJ0YyA9IG9wZW4oKmRlZmF1bHRfcnRjLCBmbGFncyk7CisJCWlmIChydGMgPj0gMCkKKwkJCXJldHVybiBydGM7CisJCSpkZWZhdWx0X3J0YyA9ICIvZGV2L21pc2MvcnRjIjsKKwl9CisKKwlyZXR1cm4geG9wZW4oKmRlZmF1bHRfcnRjLCBmbGFncyk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHJ0Y19yZWFkX3RtKHN0cnVjdCB0bSAqcHRtLCBpbnQgZmQpCit7CisJbWVtc2V0KHB0bSwgMCwgc2l6ZW9mKCpwdG0pKTsKKwl4aW9jdGwoZmQsIFJUQ19SRF9USU1FLCBwdG0pOworCXB0bS0+dG1faXNkc3QgPSAtMTsgLyogIm5vdCBrbm93biIgKi8KK30KKwordGltZV90IEZBU1RfRlVOQyBydGNfdG0ydGltZShzdHJ1Y3QgdG0gKnB0bSwgaW50IHV0YykKK3sKKwljaGFyICpvbGR0eiA9IG9sZHR6OyAvKiBmb3IgY29tcGlsZXIgKi8KKwl0aW1lX3QgdDsKKworCWlmICh1dGMpIHsKKwkJb2xkdHogPSBnZXRlbnYoIlRaIik7CisJCXB1dGVudigoY2hhciopIlRaPVVUQzAiKTsKKwkJdHpzZXQoKTsKKwl9CisKKwl0ID0gbWt0aW1lKHB0bSk7CisKKwlpZiAodXRjKSB7CisJCXVuc2V0ZW52KCJUWiIpOworCQlpZiAob2xkdHopCisJCQlwdXRlbnYob2xkdHogLSAzKTsKKwkJdHpzZXQoKTsKKwl9CisKKwlyZXR1cm4gdDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3J1bl9zaGVsbC5jIGIvbGliYmIvcnVuX3NoZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MmMzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3J1bl9zaGVsbC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAxOTg5IC0gMTk5MSwgSnVsaWFubmUgRnJhbmNlcyBIYXVnaCA8am9ja2dycmxAYXVzdGluLnJyLmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEp1bGlhbm5lIEYuIEhhdWdoIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEpVTElFIEhBVUdIIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBKVUxJRSBIQVVHSCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmIEVOQUJMRV9TRUxJTlVYCisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+ICAvKiBmb3Igc2V0ZXhlY2NvbiAgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX1NFTElOVVgKK3N0YXRpYyBzZWN1cml0eV9jb250ZXh0X3QgY3VycmVudF9zaWQ7CisKK3ZvaWQgRkFTVF9GVU5DIHJlbmV3X2N1cnJlbnRfc2VjdXJpdHlfY29udGV4dCh2b2lkKQoreworCWZyZWVjb24oY3VycmVudF9zaWQpOyAgLyogUmVsZWFzZSBvbGQgY29udGV4dCAgKi8KKwlnZXRjb24oJmN1cnJlbnRfc2lkKTsgIC8qIHVwZGF0ZSAqLworfQordm9pZCBGQVNUX0ZVTkMgc2V0X2N1cnJlbnRfc2VjdXJpdHlfY29udGV4dChzZWN1cml0eV9jb250ZXh0X3Qgc2lkKQoreworCWZyZWVjb24oY3VycmVudF9zaWQpOyAgLyogUmVsZWFzZSBvbGQgY29udGV4dCAgKi8KKwljdXJyZW50X3NpZCA9IHNpZDsKK30KKworI2VuZGlmCisKKy8qIFJ1biBTSEVMTCwgb3IgREVGQVVMVF9TSEVMTCBpZiBTSEVMTCBpcyAiIiBvciBOVUxMLgorICogSWYgQ09NTUFORCBpcyBub256ZXJvLCBwYXNzIGl0IHRvIHRoZSBzaGVsbCB3aXRoIHRoZSAtYyBvcHRpb24uCisgKiBJZiBBRERJVElPTkFMX0FSR1MgaXMgbm9uemVybywgcGFzcyBpdCB0byB0aGUgc2hlbGwgYXMgbW9yZQorICogYXJndW1lbnRzLiAgKi8KK3ZvaWQgRkFTVF9GVU5DIHJ1bl9zaGVsbChjb25zdCBjaGFyICpzaGVsbCwgaW50IGxvZ2luc2hlbGwsIGNvbnN0IGNoYXIgKmNvbW1hbmQsIGNvbnN0IGNoYXIgKiphZGRpdGlvbmFsX2FyZ3MpCit7CisJY29uc3QgY2hhciAqKmFyZ3M7CisJaW50IGFyZ25vOworCWludCBhZGRpdGlvbmFsX2FyZ3NfY250ID0gMDsKKworCWZvciAoYXJncyA9IGFkZGl0aW9uYWxfYXJnczsgYXJncyAmJiAqYXJnczsgYXJncysrKQorCQlhZGRpdGlvbmFsX2FyZ3NfY250Kys7CisKKwlhcmdzID0geG1hbGxvYyhzaXplb2YoY2hhciopICogKDQgKyBhZGRpdGlvbmFsX2FyZ3NfY250KSk7CisKKwlpZiAoIXNoZWxsIHx8ICFzaGVsbFswXSkKKwkJc2hlbGwgPSBERUZBVUxUX1NIRUxMOworCisJYXJnc1swXSA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoc2hlbGwpOworCWlmIChsb2dpbnNoZWxsKQorCQlhcmdzWzBdID0geGFzcHJpbnRmKCItJXMiLCBhcmdzWzBdKTsKKwlhcmdubyA9IDE7CisJaWYgKGNvbW1hbmQpIHsKKwkJYXJnc1thcmdubysrXSA9ICItYyI7CisJCWFyZ3NbYXJnbm8rK10gPSBjb21tYW5kOworCX0KKwlpZiAoYWRkaXRpb25hbF9hcmdzKSB7CisJCWZvciAoOyAqYWRkaXRpb25hbF9hcmdzOyArK2FkZGl0aW9uYWxfYXJncykKKwkJCWFyZ3NbYXJnbm8rK10gPSAqYWRkaXRpb25hbF9hcmdzOworCX0KKwlhcmdzW2FyZ25vXSA9IE5VTEw7CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChjdXJyZW50X3NpZCkKKwkJc2V0ZXhlY2NvbihjdXJyZW50X3NpZCk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlY29uKGN1cnJlbnRfc2lkKTsKKyNlbmRpZgorCWV4ZWN2KHNoZWxsLCAoY2hhciAqKikgYXJncyk7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBzaGVsbCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zYWZlX2dldGhvc3RuYW1lLmMgYi9saWJiYi9zYWZlX2dldGhvc3RuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiOTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NhZmVfZ2V0aG9zdG5hbWUuYwpAQCAtMCwwICsxLDc0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTYWZlIGdldGhvc3RuYW1lIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBTVVN2MiBndWFyYW50ZWVzIHRoYXQgIkhvc3QgbmFtZXMgYXJlIGxpbWl0ZWQgdG8gMjU1IGJ5dGVzIgorICogUE9TSVguMS0yMDAxIGd1YXJhbnRlZXMgdGhhdCAiSG9zdCBuYW1lcyAobm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcKKyAqIG51bGwgYnl0ZSkgYXJlIGxpbWl0ZWQgdG8gSE9TVF9OQU1FX01BWCBieXRlcyIgKDY0IGJ5dGVzIG9uIG15IGJveCkuCisgKgorICogUkZDMTEyMyBzYXlzOgorICoKKyAqIFRoZSBzeW50YXggb2YgYSBsZWdhbCBJbnRlcm5ldCBob3N0IG5hbWUgd2FzIHNwZWNpZmllZCBpbiBSRkMtOTUyCisgKiBbRE5TOjRdLiAgT25lIGFzcGVjdCBvZiBob3N0IG5hbWUgc3ludGF4IGlzIGhlcmVieSBjaGFuZ2VkOiB0aGUKKyAqIHJlc3RyaWN0aW9uIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgcmVsYXhlZCB0byBhbGxvdyBlaXRoZXIgYQorICogbGV0dGVyIG9yIGEgZGlnaXQuICBIb3N0IHNvZnR3YXJlIE1VU1Qgc3VwcG9ydCB0aGlzIG1vcmUgbGliZXJhbAorICogc3ludGF4LgorICoKKyAqIEhvc3Qgc29mdHdhcmUgTVVTVCBoYW5kbGUgaG9zdCBuYW1lcyBvZiB1cCB0byA2MyBjaGFyYWN0ZXJzIGFuZAorICogU0hPVUxEIGhhbmRsZSBob3N0IG5hbWVzIG9mIHVwIHRvIDI1NSBjaGFyYWN0ZXJzLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKy8qCisgKiBPbiBzdWNjZXNzIHJldHVybiB0aGUgY3VycmVudCBtYWxsb2NlZCBhbmQgTlVMIHRlcm1pbmF0ZWQgaG9zdG5hbWUuCisgKiBPbiBlcnJvciByZXR1cm4gbWFsbG9jZWQgYW5kIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyAiPyIuCisgKiBUaGlzIGlzIGFuIGlsbGVnYWwgZmlyc3QgY2hhcmFjdGVyIGZvciBhIGhvc3RuYW1lLgorICogVGhlIHJldHVybmVkIG1hbGxvY2VkIHN0cmluZyBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBzYWZlX2dldGhvc3RuYW1lKHZvaWQpCit7CisJc3RydWN0IHV0c25hbWUgdXRzOworCisJLyogVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXlzIGluIGEgc3RydWN0IHV0c25hbWUgaXMgdW5zcGVjaWZpZWQ7CisJICogdGhlIGZpZWxkcyBhcmUgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZS4KKwkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc3RhbmRhcmQgdGhhdCBzYXlzIHRoYXQgdGhlIGhvc3RuYW1lCisJICogc2V0IGJ5IHNldGhvc3RuYW1lKDIpIGlzIHRoZSBzYW1lIHN0cmluZyBhcyB0aGUgbm9kZW5hbWUgZmllbGQgb2YgdGhlCisJICogc3RydWN0IHJldHVybmVkIGJ5IHVuYW1lIChpbmRlZWQsIHNvbWUgc3lzdGVtcyBhbGxvdyBhIDI1Ni1ieXRlIGhvc3QtCisJICogbmFtZSBhbmQgYW4gOC1ieXRlIG5vZGVuYW1lKSwgYnV0IHRoaXMgaXMgdHJ1ZSBvbiBMaW51eC4gVGhlIHNhbWUgaG9sZHMKKwkgKiBmb3Igc2V0ZG9tYWlubmFtZSgyKSBhbmQgdGhlIGRvbWFpbm5hbWUgZmllbGQuCisJICovCisKKwkvKiBVbmFtZSBjYW4gZmFpbCBvbmx5IGlmIHlvdSBwYXNzIGEgYmFkIHBvaW50ZXIgdG8gaXQuICovCisJdW5hbWUoJnV0cyk7CisJcmV0dXJuIHhzdHJuZHVwKCF1dHMubm9kZW5hbWVbMF0gPyAiPyIgOiB1dHMubm9kZW5hbWUsIHNpemVvZih1dHMubm9kZW5hbWUpKTsKK30KKworLyoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIHRoZSBjdXJyZW50IG1hbGxvY2VkIGFuZCBOVUwgdGVybWluYXRlZCBkb21haW5uYW1lLgorICogT24gZXJyb3IgcmV0dXJuIG1hbGxvY2VkIGFuZCBOVUwgdGVybWluYXRlZCBzdHJpbmcgIj8iLgorICogVGhpcyBpcyBhbiBpbGxlZ2FsIGZpcnN0IGNoYXJhY3RlciBmb3IgYSBkb21haW5uYW1lLgorICogVGhlIHJldHVybmVkIG1hbGxvY2VkIHN0cmluZyBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBzYWZlX2dldGRvbWFpbm5hbWUodm9pZCkKK3sKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKy8qIFRoZSBmaWVsZCBkb21haW5uYW1lIG9mIHN0cnVjdCB1dHNuYW1lIGlzIExpbnV4IHNwZWNpZmljLiAqLworCXN0cnVjdCB1dHNuYW1lIHV0czsKKwl1bmFtZSgmdXRzKTsKKwlyZXR1cm4geHN0cm5kdXAoIXV0cy5kb21haW5uYW1lWzBdID8gIj8iIDogdXRzLmRvbWFpbm5hbWUsIHNpemVvZih1dHMuZG9tYWlubmFtZSkpOworI2Vsc2UKKwkvKiBXZSByZWFsbHkgZG9uJ3QgY2FyZSBhYm91dCBwZW9wbGUgd2l0aCBkb21haW4gbmFtZXMgd2lkZXIgdGhhbiBtb3N0IHNjcmVlbnMgKi8KKwljaGFyIGJ1ZlsyNTZdOworCWludCByID0gZ2V0ZG9tYWlubmFtZShidWYsIHNpemVvZihidWYpKTsKKwlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCXJldHVybiB4c3RyZHVwKHIgPCAwID8gIj8iIDogYnVmKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2FmZV9wb2xsLmMgYi9saWJiYi9zYWZlX3BvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDkyYTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc2FmZV9wb2xsLmMKQEAgLTAsMCArMSwzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBXcmFwcGVyIHdoaWNoIHJlc3RhcnRzIHBvbGwgb24gRUlOVFIgb3IgRU5PTUVNLgorICogT24gb3RoZXIgZXJyb3JzIGRvZXMgcGVycm9yKCJwb2xsIikgYW5kIHJldHVybnMuCisgKiBXYXJuaW5nISBNYXkgdGFrZSBsb25nZXIgdGhhbiB0aW1lb3V0X21zIHRvIHJldHVybiEgKi8KK2ludCBGQVNUX0ZVTkMgc2FmZV9wb2xsKHN0cnVjdCBwb2xsZmQgKnVmZHMsIG5mZHNfdCBuZmRzLCBpbnQgdGltZW91dCkKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgbiA9IHBvbGwodWZkcywgbmZkcywgdGltZW91dCk7CisJCWlmIChuID49IDApCisJCQlyZXR1cm4gbjsKKwkJLyogTWFrZSBzdXJlIHdlIGluY2ggdG93YXJkcyBjb21wbGV0aW9uICovCisJCWlmICh0aW1lb3V0ID4gMCkKKwkJCXRpbWVvdXQtLTsKKwkJLyogRS5nLiBzdHJhY2UgY2F1c2VzIHBvbGwgdG8gcmV0dXJuIHRoaXMgKi8KKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJCS8qIEtlcm5lbCBpcyB2ZXJ5IGxvdyBvbiBtZW1vcnkuIFJldHJ5LiAqLworCQkvKiBJIGRvdWJ0IG1hbnkgY2FsbGVycyB3b3VsZCBoYW5kbGUgdGhpcyBjb3JyZWN0bHkhICovCisJCWlmIChlcnJubyA9PSBFTk9NRU0pCisJCQljb250aW51ZTsKKwkJYmJfcGVycm9yX21zZygicG9sbCIpOworCQlyZXR1cm4gbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zYWZlX3N0cm5jcHkuYyBiL2xpYmJiL3NhZmVfc3RybmNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjBkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zYWZlX3N0cm5jcHkuYwpAQCAtMCwwICsxLDMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBMaWtlIHN0cm5jcHkgYnV0IG1ha2Ugc3VyZSB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBhbHdheXMgMCB0ZXJtaW5hdGVkLiAqLworY2hhciogRkFTVF9GVU5DIHNhZmVfc3RybmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJaWYgKCFzaXplKSByZXR1cm4gZHN0OworCWRzdFstLXNpemVdID0gJ1wwJzsKKwlyZXR1cm4gc3RybmNweShkc3QsIHNyYywgc2l6ZSk7Cit9CisKKy8qIExpa2Ugc3RyY3B5IGJ1dCBjYW4gY29weSBvdmVybGFwcGluZyBzdHJpbmdzLiAqLwordm9pZCBGQVNUX0ZVTkMgb3ZlcmxhcHBpbmdfc3RyY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCS8qIENoZWFwIG9wdGltaXphdGlvbiBmb3IgZHN0ID09IHNyYyBjYXNlIC0KKwkgKiBiZXR0ZXIgdG8gaGF2ZSBpdCBoZXJlIHRoYW4gaW4gbWFueSBjYWxsZXJzLgorCSAqLworCWlmIChkc3QgIT0gc3JjKSB7CisJCXdoaWxlICgoKmRzdCA9ICpzcmMpICE9ICdcMCcpIHsKKwkJCWRzdCsrOworCQkJc3JjKys7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zYWZlX3dyaXRlLmMgYi9saWJiYi9zYWZlX3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3NjI4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NhZmVfd3JpdGUuYwpAQCAtMCwwICsxLDIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzc2l6ZV90IEZBU1RfRlVOQyBzYWZlX3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCBuOworCisJZG8geworCQluID0gd3JpdGUoZmQsIGJ1ZiwgY291bnQpOworCX0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2VsaW51eF9jb21tb24uYyBiL2xpYmJiL3NlbGludXhfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5MTBlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NlbGludXhfY29tbW9uLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGxpYmJiL3NlbGludXhfY29tbW9uLmMKKyAqICAgLS0gY29tbW9uIFNFTGludXggdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBLYWlHYWkgS29oZWkgPGthaWdhaUBrYWlnYWkuZ3IuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c2VsaW51eC9jb250ZXh0Lmg+CisKK2NvbnRleHRfdCBGQVNUX0ZVTkMgc2V0X3NlY3VyaXR5X2NvbnRleHRfY29tcG9uZW50KHNlY3VyaXR5X2NvbnRleHRfdCBjdXJfY29udGV4dCwKKwkJCQkJIGNoYXIgKnVzZXIsIGNoYXIgKnJvbGUsIGNoYXIgKnR5cGUsIGNoYXIgKnJhbmdlKQoreworCWNvbnRleHRfdCBjb24gPSBjb250ZXh0X25ldyhjdXJfY29udGV4dCk7CisJaWYgKCFjb24pCisJCXJldHVybiBOVUxMOworCisJaWYgKHVzZXIgJiYgY29udGV4dF91c2VyX3NldChjb24sIHVzZXIpKQorCQlnb3RvIGVycm9yOworCWlmICh0eXBlICYmIGNvbnRleHRfdHlwZV9zZXQoY29uLCB0eXBlKSkKKwkJZ290byBlcnJvcjsKKwlpZiAocmFuZ2UgJiYgY29udGV4dF9yYW5nZV9zZXQoY29uLCByYW5nZSkpCisJCWdvdG8gZXJyb3I7CisJaWYgKHJvbGUgJiYgY29udGV4dF9yb2xlX3NldChjb24sIHJvbGUpKQorCQlnb3RvIGVycm9yOworCXJldHVybiBjb247CisKK2Vycm9yOgorCWNvbnRleHRfZnJlZShjb24pOworCXJldHVybiBOVUxMOworfQorCit2b2lkIEZBU1RfRlVOQyBzZXRmc2NyZWF0ZWNvbl9vcl9kaWUoc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0KQoreworCWlmIChzZXRmc2NyZWF0ZWNvbihzY29udGV4dCkgPCAwKSB7CisJCS8qIENhbiBiZSBOVUxMLiBBbGwga25vd24gcHJpbnRmIGltcGxlbWVudGF0aW9ucworCQkgKiBkaXNwbGF5ICIobnVsbCkiLCAiPG51bGw+IiBldGMgKi8KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgZGVmYXVsdCAiCisJCQkJImZpbGUgY3JlYXRpb24gY29udGV4dCB0byAlcyIsIHNjb250ZXh0KTsKKwl9Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNlbGludXhfcHJlc2VydmVfZmNvbnRleHQoaW50IGZkZXNjKQoreworCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0OworCisJaWYgKGZnZXRmaWxlY29uKGZkZXNjLCAmY29udGV4dCkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9EQVRBIHx8IGVycm5vID09IEVOT1RTVVApCisJCQlyZXR1cm47CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZmdldGZpbGVjb24gZmFpbGVkIik7CisJfQorCXNldGZzY3JlYXRlY29uX29yX2RpZShjb250ZXh0KTsKKwlmcmVlY29uKGNvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2V0dXBfZW52aXJvbm1lbnQuYyBiL2xpYmJiL3NldHVwX2Vudmlyb25tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyMjljYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NldHVwX2Vudmlyb25tZW50LmMKQEAgLTAsMCArMSw3MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDE5ODkgLSAxOTkxLCBKdWxpYW5uZSBGcmFuY2VzIEhhdWdoIDxqb2NrZ3JybEBhdXN0aW4ucnIuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSnVsaWFubmUgRi4gSGF1Z2ggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSlVMSUUgSEFVR0ggQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEpVTElFIEhBVUdIIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIHNldHVwX2Vudmlyb25tZW50KGNvbnN0IGNoYXIgKnNoZWxsLCBpbnQgZmxhZ3MsIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCWlmICghc2hlbGwgfHwgIXNoZWxsWzBdKQorCQlzaGVsbCA9IERFRkFVTFRfU0hFTEw7CisKKwkvKiBDaGFuZ2UgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgdGhlIGhvbWUgZGlyZWN0b3J5CisJICogb2YgdGhlIHVzZXIgKi8KKwlpZiAoY2hkaXIocHctPnB3X2RpcikpIHsKKwkJeGNoZGlyKChmbGFncyAmIFNFVFVQX0VOVl9UT19UTVApID8gIi90bXAiIDogIi8iKTsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjaGRpciB0byBob21lIGRpcmVjdG9yeSAnJXMnIiwgcHctPnB3X2Rpcik7CisJfQorCisJaWYgKGZsYWdzICYgU0VUVVBfRU5WX0NMRUFSRU5WKSB7CisJCWNvbnN0IGNoYXIgKnRlcm07CisKKwkJLyogTGVhdmUgVEVSTSB1bmNoYW5nZWQuIFNldCBIT01FLCBTSEVMTCwgVVNFUiwgTE9HTkFNRSwgUEFUSC4KKwkJICogVW5zZXQgYWxsIG90aGVyIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCisJCXRlcm0gPSBnZXRlbnYoIlRFUk0iKTsKKwkJY2xlYXJlbnYoKTsKKwkJaWYgKHRlcm0pCisJCQl4c2V0ZW52KCJURVJNIiwgdGVybSk7CisJCXhzZXRlbnYoIlBBVEgiLCAocHctPnB3X3VpZCA/IGJiX2RlZmF1bHRfcGF0aCA6IGJiX2RlZmF1bHRfcm9vdF9wYXRoKSk7CisJCWdvdG8gc2hvcnRjdXQ7CisJCS8vIE5vLCBnY2MgKDQuMi4xKSBpcyBub3QgY2xldmVyIGVub3VnbiB0byBkbyBpdCBpdHNlbGYuCisJCS8veHNldGVudigiVVNFUiIsICAgIHB3LT5wd19uYW1lKTsKKwkJLy94c2V0ZW52KCJMT0dOQU1FIiwgcHctPnB3X25hbWUpOworCQkvL3hzZXRlbnYoIkhPTUUiLCAgICBwdy0+cHdfZGlyKTsKKwkJLy94c2V0ZW52KCJTSEVMTCIsICAgc2hlbGwpOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBTRVRVUF9FTlZfQ0hBTkdFRU5WKSB7CisJCS8qIFNldCBIT01FLCBTSEVMTCwgYW5kIGlmIG5vdCBiZWNvbWluZyBhIHN1cGVyLXVzZXIsCisJCSAqIFVTRVIgYW5kIExPR05BTUUuICAqLworCQlpZiAocHctPnB3X3VpZCkgeworIHNob3J0Y3V0OgorCQkJeHNldGVudigiVVNFUiIsICAgIHB3LT5wd19uYW1lKTsKKwkJCXhzZXRlbnYoIkxPR05BTUUiLCBwdy0+cHdfbmFtZSk7CisJCX0KKwkJeHNldGVudigiSE9NRSIsICAgIHB3LT5wd19kaXIpOworCQl4c2V0ZW52KCJTSEVMTCIsICAgc2hlbGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3NpZ25hbHMuYyBiL2xpYmJiL3NpZ25hbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMzN2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc2lnbmFscy5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSb2IgTGFuZGxleQorICogQ29weXJpZ2h0IChDKSAyMDA2IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQWxsIGtub3duIGFyY2hlcyB1c2Ugc21hbGwgaW50cyBmb3Igc2lnbmFscyAqLworc21hbGxpbnQgYmJfZ290X3NpZ25hbDsKKwordm9pZCByZWNvcmRfc2lnbm8oaW50IHNpZ25vKQoreworCWJiX2dvdF9zaWduYWwgPSBzaWdubzsKK30KKworLyogU2F2ZXMgMiBieXRlcyBvbiB4ODYhIE9oIG15Li4uICovCitpbnQgRkFTVF9GVU5DIHNpZ2FjdGlvbl9zZXQoaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0KQoreworCXJldHVybiBzaWdhY3Rpb24oc2lnbnVtLCBhY3QsIE5VTEwpOworfQorCitpbnQgRkFTVF9GVU5DIHNpZ3Byb2NtYXNrX2FsbHNpZ3MoaW50IGhvdykKK3sKKwlzaWdzZXRfdCBzZXQ7CisJc2lnZmlsbHNldCgmc2V0KTsKKwlyZXR1cm4gc2lncHJvY21hc2soaG93LCAmc2V0LCBOVUxMKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfc2lnbmFscyhpbnQgc2lncywgdm9pZCAoKmYpKGludCkpCit7CisJaW50IHNpZ19ubyA9IDA7CisJaW50IGJpdCA9IDE7CisKKwl3aGlsZSAoc2lncykgeworCQlpZiAoc2lncyAmIGJpdCkgeworCQkJc2lncyAmPSB+Yml0OworCQkJc2lnbmFsKHNpZ19ubywgZik7CisJCX0KKwkJc2lnX25vKys7CisJCWJpdCA8PD0gMTsKKwl9Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydChpbnQgc2lncywgdm9pZCAoKmYpKGludCkpCit7CisJaW50IHNpZ19ubyA9IDA7CisJaW50IGJpdCA9IDE7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCXNhLnNhX2hhbmRsZXIgPSBmOworCS8qc2Euc2FfZmxhZ3MgPSAwOyovCisJLypzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7IC0gaG9wZSBtZW1zZXQgZGlkIGl0Ki8KKworCXdoaWxlIChzaWdzKSB7CisJCWlmIChzaWdzICYgYml0KSB7CisJCQlzaWdzICY9IH5iaXQ7CisJCQlzaWdhY3Rpb25fc2V0KHNpZ19ubywgJnNhKTsKKwkJfQorCQlzaWdfbm8rKzsKKwkJYml0IDw8PSAxOworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgc2lnX2Jsb2NrKGludCBzaWcpCit7CisJc2lnc2V0X3Qgc3M7CisJc2lnZW1wdHlzZXQoJnNzKTsKKwlzaWdhZGRzZXQoJnNzLCBzaWcpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNzLCBOVUxMKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgc2lnX3VuYmxvY2soaW50IHNpZykKK3sKKwlzaWdzZXRfdCBzczsKKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ2FkZHNldCgmc3MsIHNpZyk7CisJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzcywgTlVMTCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHdhaXRfZm9yX2FueV9zaWcodm9pZCkKK3sKKwlzaWdzZXRfdCBzczsKKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ3N1c3BlbmQoJnNzKTsKK30KKworLyogQXNzdW1pbmcgdGhlIHNpZyBpcyBmYXRhbCAqLwordm9pZCBGQVNUX0ZVTkMga2lsbF9teXNlbGZfd2l0aF9zaWcoaW50IHNpZykKK3sKKwlzaWduYWwoc2lnLCBTSUdfREZMKTsKKwlzaWdfdW5ibG9jayhzaWcpOworCXJhaXNlKHNpZyk7CisJX2V4aXQoRVhJVF9GQUlMVVJFKTsgLyogU2hvdWxkIG5vdCByZWFjaCBpdCAqLworfQorCit2b2lkIEZBU1RfRlVOQyBzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJLypzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7Ki8KKwlzYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CisJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJc2lnYWN0aW9uX3NldChzaWcsICZzYSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkvKnNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsqLworCS8qc2Euc2FfZmxhZ3MgPSAwOyovCisJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJc2lnYWN0aW9uX3NldChzaWcsICZzYSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zaW1wbGlmeV9wYXRoLmMgYi9saWJiYi9zaW1wbGlmeV9wYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkYzViZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NpbXBsaWZ5X3BhdGguYwpAQCAtMCwwICsxLDU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9zaW1wbGlmeV9wYXRoIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NoYXIqIEZBU1RfRlVOQyBiYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKGNoYXIgKnN0YXJ0KQoreworCWNoYXIgKnMsICpwOworCisJcCA9IHMgPSBzdGFydDsKKwlkbyB7CisJCWlmICgqcCA9PSAnLycpIHsKKwkJCWlmICgqcyA9PSAnLycpIHsgIC8qIHNraXAgZHVwbGljYXRlIChvciBpbml0aWFsKSBzbGFzaCAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCpzID09ICcuJykgeworCQkJCWlmIChzWzFdID09ICcvJyB8fCAhc1sxXSkgeyAgLyogcmVtb3ZlIGV4dHJhICcuJyAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKChzWzFdID09ICcuJykgJiYgKHNbMl0gPT0gJy8nIHx8ICFzWzJdKSkgeworCQkJCQkrK3M7CisJCQkJCWlmIChwID4gc3RhcnQpIHsKKwkJCQkJCXdoaWxlICgqLS1wICE9ICcvJykgIC8qIG9taXQgcHJldmlvdXMgZGlyICovCisJCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJCSorK3AgPSAqczsKKwl9IHdoaWxlICgqKytzKTsKKworCWlmICgocCA9PSBzdGFydCkgfHwgKCpwICE9ICcvJykpIHsgIC8qIG5vdCBhIHRyYWlsaW5nIHNsYXNoICovCisJCSsrcDsgIC8qIHNvIGtlZXAgbGFzdCBjaGFyYWN0ZXIgKi8KKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBwOworfQorCitjaGFyKiBGQVNUX0ZVTkMgYmJfc2ltcGxpZnlfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgKnMsICpwOworCisJaWYgKHBhdGhbMF0gPT0gJy8nKQorCQlzID0geHN0cmR1cChwYXRoKTsKKwllbHNlIHsKKwkJcCA9IHhyZWFsbG9jX2dldGN3ZF9vcl93YXJuKE5VTEwpOworCQlzID0gY29uY2F0X3BhdGhfZmlsZShwLCBwYXRoKTsKKwkJZnJlZShwKTsKKwl9CisKKwliYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKHMpOworCXJldHVybiBzOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2luZ2xlX2FyZ3YuYyBiL2xpYmJiL3NpbmdsZV9hcmd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NDRkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NpbmdsZV9hcmd2LmMKQEAgLTAsMCArMSwxOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIHNpbmdsZV9hcmd2KGNoYXIgKiphcmd2KQoreworCWlmIChhcmd2WzFdICYmIHN0cmNtcChhcmd2WzFdLCAiLS0iKSA9PSAwKQorCQlhcmd2Kys7CisJaWYgKCFhcmd2WzFdIHx8IGFyZ3ZbMl0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlyZXR1cm4gYXJndlsxXTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3NraXBfd2hpdGVzcGFjZS5jIGIvbGliYmIvc2tpcF93aGl0ZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3YjY3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NraXBfd2hpdGVzcGFjZS5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNraXBfd2hpdGVzcGFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NoYXIqIEZBU1RfRlVOQyBza2lwX3doaXRlc3BhY2UoY29uc3QgY2hhciAqcykKK3sKKwkvKiBJbiBQT1NJWC9DIGxvY2FsZSAodGhlIG9ubHkgbG9jYWxlIHdlIGNhcmUgYWJvdXQ6IGRvIHdlIFJFQUxMWSB3YW50CisJICogdG8gYWxsb3cgVW5pY29kZSB3aGl0ZXNwYWNlIGluLCBzYXksIC5jb25mIGZpbGVzPyBudXRzISkKKwkgKiBpc3NwYWNlIGlzIG9ubHkgdGhlc2UgY2hhcnM6ICJcdFxuXHZcZlxyIiBhbmQgc3BhY2UuCisJICogIlx0XG5cdlxmXHIiIGhhcHBlbiB0byBoYXZlIEFTQ0lJIGNvZGVzIDksMTAsMTEsMTIsMTMuCisJICogVXNlIHRoYXQuCisJICovCisJd2hpbGUgKCpzID09ICcgJyB8fCAodW5zaWduZWQgY2hhcikoKnMgLSA5KSA8PSAoMTMgLSA5KSkKKwkJcysrOworCisJcmV0dXJuIChjaGFyICopIHM7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBza2lwX25vbl93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzICE9ICdcMCcgJiYgKnMgIT0gJyAnICYmICh1bnNpZ25lZCBjaGFyKSgqcyAtIDkpID4gKDEzIC0gOSkpCisJCXMrKzsKKworCXJldHVybiAoY2hhciAqKSBzOworfQorCitjaGFyKiBGQVNUX0ZVTkMgc2tpcF9kZXZfcGZ4KGNvbnN0IGNoYXIgKnR0eV9uYW1lKQoreworCWlmIChzdHJuY21wKHR0eV9uYW1lLCAiL2Rldi8iLCA1KSA9PSAwKQorCQl0dHlfbmFtZSArPSA1OworCXJldHVybiAoY2hhciopdHR5X25hbWU7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zcGVlZF90YWJsZS5jIGIvbGliYmIvc3BlZWRfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTE1OWYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc3BlZWRfdGFibGUuYwpAQCAtMCwwICsxLDExOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY29tcGFjdCBzcGVlZF90IDwtPiBzcGVlZCBmdW5jdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3Qgc3BlZWRfbWFwIHsKKwl1bnNpZ25lZCBzaG9ydCBzcGVlZDsKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BlZWRfbWFwIHNwZWVkc1tdID0geworCXtCMCwgMH0sCisJe0I1MCwgNTB9LAorCXtCNzUsIDc1fSwKKwl7QjExMCwgMTEwfSwKKwl7QjEzNCwgMTM0fSwKKwl7QjE1MCwgMTUwfSwKKwl7QjIwMCwgMjAwfSwKKwl7QjMwMCwgMzAwfSwKKwl7QjYwMCwgNjAwfSwKKwl7QjEyMDAsIDEyMDB9LAorCXtCMTgwMCwgMTgwMH0sCisJe0IyNDAwLCAyNDAwfSwKKwl7QjQ4MDAsIDQ4MDB9LAorCXtCOTYwMCwgOTYwMH0sCisjaWZkZWYgQjE5MjAwCisJe0IxOTIwMCwgMTkyMDB9LAorI2VsaWYgZGVmaW5lZChFWFRBKQorCXtFWFRBLCAxOTIwMH0sCisjZW5kaWYKKyNpZmRlZiBCMzg0MDAKKwl7QjM4NDAwLCAzODQwMC8yNTYgKyAweDgwMDBVfSwKKyNlbGlmIGRlZmluZWQoRVhUQikKKwl7RVhUQiwgMzg0MDAvMjU2ICsgMHg4MDAwVX0sCisjZW5kaWYKKyNpZmRlZiBCNTc2MDAKKwl7QjU3NjAwLCA1NzYwMC8yNTYgKyAweDgwMDBVfSwKKyNlbmRpZgorI2lmZGVmIEIxMTUyMDAKKwl7QjExNTIwMCwgMTE1MjAwLzI1NiArIDB4ODAwMFV9LAorI2VuZGlmCisjaWZkZWYgQjIzMDQwMAorCXtCMjMwNDAwLCAyMzA0MDAvMjU2ICsgMHg4MDAwVX0sCisjZW5kaWYKKyNpZmRlZiBCNDYwODAwCisJe0I0NjA4MDAsIDQ2MDgwMC8yNTYgKyAweDgwMDBVfSwKKyNlbmRpZgorI2lmZGVmIEI5MjE2MDAKKwl7QjkyMTYwMCwgOTIxNjAwLzI1NiArIDB4ODAwMFV9LAorI2VuZGlmCit9OworCitlbnVtIHsgTlVNX1NQRUVEUyA9IEFSUkFZX1NJWkUoc3BlZWRzKSB9OworCit1bnNpZ25lZCBGQVNUX0ZVTkMgdHR5X2JhdWRfdG9fdmFsdWUoc3BlZWRfdCBzcGVlZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWlmIChzcGVlZCA9PSBzcGVlZHNbaV0uc3BlZWQpIHsKKwkJCWlmIChzcGVlZHNbaV0udmFsdWUgJiAweDgwMDBVKSB7CisJCQkJcmV0dXJuICgodW5zaWduZWQgbG9uZykgKHNwZWVkc1tpXS52YWx1ZSkgJiAweDdmZmZVKSAqIDI1NjsKKwkJCX0KKwkJCXJldHVybiBzcGVlZHNbaV0udmFsdWU7CisJCX0KKwl9IHdoaWxlICgrK2kgPCBOVU1fU1BFRURTKTsKKworCXJldHVybiAwOworfQorCitzcGVlZF90IEZBU1RfRlVOQyB0dHlfdmFsdWVfdG9fYmF1ZCh1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaW50IGkgPSAwOworCisJZG8geworCQlpZiAodmFsdWUgPT0gdHR5X2JhdWRfdG9fdmFsdWUoc3BlZWRzW2ldLnNwZWVkKSkgeworCQkJcmV0dXJuIHNwZWVkc1tpXS5zcGVlZDsKKwkJfQorCX0gd2hpbGUgKCsraSA8IE5VTV9TUEVFRFMpOworCisJcmV0dXJuIChzcGVlZF90KSAtIDE7Cit9CisKKyNpZiAwCisvKiB0ZXN0aW5nIGNvZGUgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwlzcGVlZF90IHM7CisKKwlmb3IgKHYgPSAwIDsgdiA8IDEwMDAwMDA7IHYrKykgeworCQlzID0gdHR5X3ZhbHVlX3RvX2JhdWQodik7CisJCWlmIChzID09IChzcGVlZF90KSAtMSkgeworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJ2ID0gJWx1IC0tIHMgPSAlMGxvXG4iLCB2LCAodW5zaWduZWQgbG9uZykgcyk7CisJfQorCisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCWZvciAocyA9IDAgOyBzIDwgMDEwMDE3KzE7IHMrKykgeworCQl2ID0gdHR5X2JhdWRfdG9fdmFsdWUocyk7CisJCWlmICghdikgeworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJ2ID0gJWx1IC0tIHMgPSAlMGxvXG4iLCB2LCAodW5zaWduZWQgbG9uZykgcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3N0cl90b2xvd2VyLmMgYi9saWJiYi9zdHJfdG9sb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDU2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zdHJfdG9sb3dlci5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIHZpIHNldDogc3c9NCB0cz00OiAqLworLyogQ29udmVydCBzdHJpbmcgc3RyIHRvIGxvd2VyY2FzZSwgcmV0dXJuIHN0ci4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIHN0cl90b2xvd2VyKGNoYXIgKnN0cikKK3sKKwljaGFyICpjOworCWZvciAoYyA9IHN0cjsgKmM7ICsrYykKKwkJKmMgPSB0b2xvd2VyKCpjKTsKKwlyZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc3RycnN0ci5jIGIvbGliYmIvc3RycnN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zdHJyc3RyLmMKQEAgLTAsMCArMSw3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZkZWYgX19ET19TVFJSU1RSX1RFU1QKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2Vsc2UKKyNpbmNsdWRlICJsaWJiYi5oIgorI2VuZGlmCisKKy8qCisgKiBUaGUgc3RycnN0cigpIGZ1bmN0aW9uIGZpbmRzIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHN1YnN0cmluZyBuZWVkbGUKKyAqIGluIHRoZSBzdHJpbmcgaGF5c3RhY2suIFRoZSB0ZXJtaW5hdGluZyBudWwgY2hhcmFjdGVycyBhcmUgbm90IGNvbXBhcmVkLgorICovCitjaGFyKiBGQVNUX0ZVTkMgc3RycnN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQoreworCWNoYXIgKnIgPSBOVUxMOworCisJaWYgKCFuZWVkbGVbMF0pCisJCXJldHVybiAoY2hhciopaGF5c3RhY2sgKyBzdHJsZW4oaGF5c3RhY2spOworCXdoaWxlICgxKSB7CisJCWNoYXIgKnAgPSBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSk7CisJCWlmICghcCkKKwkJCXJldHVybiByOworCQlyID0gcDsKKwkJaGF5c3RhY2sgPSBwICsgMTsKKwl9Cit9CisKKyNpZmRlZiBfX0RPX1NUUlJTVFJfVEVTVAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpoLCAqbjsKKwkJaW50IHBvczsKKwl9IHRlc3RfYXJyYXlbXSA9IHsKKwkJLyogMDEyMzQ1Njc4OSAqLworCQl7ICJiYWFhYmFhYWIiLCAgImFhYSIsIDUgIH0sCisJCXsgImJhYWFiYWFhYWIiLCAiYWFhIiwgNiAgfSwKKwkJeyAiYmFhYWJhYWIiLCAgICJhYWEiLCAxICB9LAorCQl7ICJhYWEiLCAgICAgICAgImFhYSIsIDAgIH0sCisJCXsgImFhYSIsICAgICAgICAiYSIsICAgMiAgfSwKKwkJeyAiYWFhIiwgICAgICAgICJiYmIiLCAtMSB9LAorCQl7ICJhIiwgICAgICAgICAgImFhYSIsIC0xIH0sCisJCXsgImFhYSIsICAgICAgICAiIiwgICAgMyAgfSwKKwkJeyAiIiwgICAgICAgICAgICJhYWEiLCAtMSB9LAorCQl7ICIiLCAgICAgICAgICAgIiIsICAgIDAgIH0sCisJfTsKKworCWludCBpOworCisJaSA9IDA7CisJd2hpbGUgKGkgPCBzaXplb2YodGVzdF9hcnJheSkgLyBzaXplb2YodGVzdF9hcnJheVswXSkpIHsKKwkJY29uc3QgY2hhciAqciA9IHN0cnJzdHIodGVzdF9hcnJheVtpXS5oLCB0ZXN0X2FycmF5W2ldLm4pOworCQlwcmludGYoIiclcycgdnMuICclcyc6ICclcycgLSAiLCB0ZXN0X2FycmF5W2ldLmgsIHRlc3RfYXJyYXlbaV0ubiwgcik7CisJCWlmIChyID09IE5VTEwpCisJCQlyID0gdGVzdF9hcnJheVtpXS5oIC0gMTsKKwkJcHJpbnRmKCIlc1xuIiwgciA9PSB0ZXN0X2FycmF5W2ldLmggKyB0ZXN0X2FycmF5W2ldLnBvcyA/ICJQQVNTRUQiIDogIkZBSUxFRCIpOworCQlpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3N5c3RlbWRfc3VwcG9ydC5jIGIvbGliYmIvc3lzdGVtZF9zdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyYTNlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3N5c3RlbWRfc3VwcG9ydC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgRGF2aWRlIENhdmFsY2EgPGRhdmlkZUBnZWV4Ym94Lm9yZz4KKyAqCisgKiBCYXNlZCBvbiBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvc3lzdGVtZC90cmVlL3NyYy9zZC1kYWVtb24uYworICogQ29weXJpZ2h0IDIwMTAgTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9TWVNURU1ECisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHN5c3RlbWQgc3VwcG9ydCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBJZiB5b3UgcGxhbiB0byB1c2UgYnVzeWJveCBkYWVtb25zIG9uIGEgc3lzdGVtIHdoZXJlIGRhZW1vbnMKKy8vY29uZmlnOgkgIGFyZSBjb250cm9sbGVkIGJ5IHN5c3RlbWQsIGVuYWJsZSB0aGlzIG9wdGlvbi4KKy8vY29uZmlnOgkgIElmIHlvdSBkb24ndCB1c2Ugc3lzdGVtZCwgaXQgaXMgc3RpbGwgc2FmZSB0byBlbmFibGUgaXQsCisvL2NvbmZpZzoJICBidXQgdGhlIGRvd25zaWRlIGlzIGluY3JlYXNlZCBjb2RlIHNpemUuCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1NZU1RFTUQpICs9IHN5c3RlbWRfc3VwcG9ydC5vCisKK2ludCBzZF9saXN0ZW5fZmRzKHZvaWQpCit7CisJY29uc3QgY2hhciAqZTsKKwlpbnQgbjsKKwlpbnQgZmQ7CisKKwllID0gZ2V0ZW52KCJMSVNURU5fUElEIik7CisJaWYgKCFlKQorCQlyZXR1cm4gMDsKKwluID0geGF0b2lfcG9zaXRpdmUoZSk7CisJLyogSXMgdGhpcyBmb3IgdXM/ICovCisJaWYgKGdldHBpZCgpICE9IChwaWRfdCkgbikKKwkJcmV0dXJuIDA7CisKKwllID0gZ2V0ZW52KCJMSVNURU5fRkRTIik7CisJaWYgKCFlKQorCQlyZXR1cm4gMDsKKwluID0geGF0b2lfcG9zaXRpdmUoZSk7CisJZm9yIChmZCA9IFNEX0xJU1RFTl9GRFNfU1RBUlQ7IGZkIDwgU0RfTElTVEVOX0ZEU19TVEFSVCArIG47IGZkKyspCisJCWNsb3NlX29uX2V4ZWNfb24oZmQpOworCisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9saWJiYi90aW1lLmMgYi9saWJiYi90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiOTM4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3RpbWUuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgcGFyc2VfZGF0ZXN0cihjb25zdCBjaGFyICpkYXRlX3N0ciwgc3RydWN0IHRtICpwdG0pCit7CisJY2hhciBlbmQgPSAnXDAnOworCWNvbnN0IGNoYXIgKmxhc3RfY29sb24gPSBzdHJyY2hyKGRhdGVfc3RyLCAnOicpOworCisJaWYgKGxhc3RfY29sb24gIT0gTlVMTCkgeworCQkvKiBQYXJzZSBpbnB1dCBhbmQgYXNzaWduIGFwcHJvcHJpYXRlbHkgdG8gcHRtICovCisjaWYgRU5BQkxFX0RFU0tUT1AKKwkJY29uc3QgY2hhciAqZW5kcDsKKyNlbmRpZgorCisJCS8qIEhIOk1NICovCisJCWlmIChzc2NhbmYoZGF0ZV9zdHIsICIldToldSVjIiwKKwkJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSAyKSB7CisJCQkvKiBubyBhZGp1c3RtZW50cyBuZWVkZWQgKi8KKwkJfSBlbHNlCisJCS8qIG1tLmRkLUhIOk1NICovCisJCWlmIChzc2NhbmYoZGF0ZV9zdHIsICIldS4ldS0ldToldSVjIiwKKwkJCQkJJnB0bS0+dG1fbW9uLCAmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLCAmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDQpIHsKKwkJCS8qIEFkanVzdCBtb250aCBmcm9tIDEtMTIgdG8gMC0xMSAqLworCQkJcHRtLT50bV9tb24gLT0gMTsKKwkJfSBlbHNlCisJCS8qIHl5eXkubW0uZGQtSEg6TU0gKi8KKwkJaWYgKHNzY2FuZihkYXRlX3N0ciwgIiV1LiV1LiV1LSV1OiV1JWMiLCAmcHRtLT50bV95ZWFyLAorCQkJCQkmcHRtLT50bV9tb24sICZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsICZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gNSkgeworCQkJcHRtLT50bV95ZWFyIC09IDE5MDA7IC8qIEFkanVzdCB5ZWFycyAqLworCQkJcHRtLT50bV9tb24gLT0gMTsgLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCX0gZWxzZQorCQkvKiB5eXl5LW1tLWRkIEhIOk1NICovCisJCWlmIChzc2NhbmYoZGF0ZV9zdHIsICIldS0ldS0ldSAldToldSVjIiwgJnB0bS0+dG1feWVhciwKKwkJCQkJJnB0bS0+dG1fbW9uLCAmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLCAmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDUpIHsKKwkJCXB0bS0+dG1feWVhciAtPSAxOTAwOyAvKiBBZGp1c3QgeWVhcnMgKi8KKwkJCXB0bS0+dG1fbW9uIC09IDE7IC8qIEFkanVzdCBtb250aCBmcm9tIDEtMTIgdG8gMC0xMSAqLworCQl9IGVsc2UKKyNpZiBFTkFCTEVfREVTS1RPUCAgLyogc3RycHRpbWUgaXMgQklHOiB+MWsgaW4gdWNsaWJjLCB+MTBrIGluIGdsaWJjICovCisJCS8qIG1vbnRoX25hbWUgZCBISDpNTTpTUyBZWVlZLiBTdXBwb3J0ZWQgYnkgR05VIGRhdGUgKi8KKwkJaWYgKChlbmRwID0gc3RycHRpbWUoZGF0ZV9zdHIsICIlYiAlZCAlVCAlWSIsIHB0bSkpICE9IE5VTEwKKwkJICYmICplbmRwID09ICdcMCcKKwkJKSB7CisJCQlyZXR1cm47IC8qIGRvbid0IGZhbGwgdGhyb3VnaCB0byBlbmQgPT0gIjoiIGNoZWNrICovCisJCX0gZWxzZQorI2VuZGlmCisvL1RPRE86IGNvcmV1dGlscyA2LjkgYWxzbyBhY2NlcHRzICJ5eXl5LW1tLWRkIEhIIiAobm8gbWludXRlcykKKwkJeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCQl9CisJCWlmIChlbmQgPT0gJzonKSB7CisJCQkvKiB4eHg6U1MgKi8KKwkJCWlmIChzc2NhbmYobGFzdF9jb2xvbiArIDEsICIldSVjIiwgJnB0bS0+dG1fc2VjLCAmZW5kKSA9PSAxKQorCQkJCWVuZCA9ICdcMCc7CisJCQkvKiBlbHNlIGVuZCAhPSBOVUwgYW5kIHdlIGVycm9yIG91dCAqLworCQl9CisJfSBlbHNlIGlmIChkYXRlX3N0clswXSA9PSAnQCcpIHsKKwkJdGltZV90IHQgPSBiYl9zdHJ0b2woZGF0ZV9zdHIgKyAxLCBOVUxMLCAxMCk7CisJCWlmICghZXJybm8pIHsKKwkJCXN0cnVjdCB0bSAqbHQgPSBsb2NhbHRpbWUoJnQpOworCQkJaWYgKGx0KSB7CisJCQkJKnB0bSA9ICpsdDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZW5kID0gJzEnOworCX0gZWxzZSB7CisJCS8qIEdvb2dsZWQgdGhlIGZvbGxvd2luZyBvbiBhbiBvbGQgZGF0ZSBtYW5wYWdlOgorCQkgKgorCQkgKiBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBzZXR0aW5nIHRoZSBkYXRlL3RpbWUgaXM6CisJCSAqIGNjICAgQ2VudHVyeSAoZWl0aGVyIDE5IG9yIDIwKQorCQkgKiB5eSAgIFllYXIgaW4gYWJicmV2aWF0ZWQgZm9ybSAoZS5nLiA4OSwgMDYpCisJCSAqIG1tICAgTnVtZXJpYyBtb250aCwgYSBudW1iZXIgZnJvbSAxIHRvIDEyCisJCSAqIGRkICAgRGF5LCBhIG51bWJlciBmcm9tIDEgdG8gMzEKKwkJICogSEggICBIb3VyLCBhIG51bWJlciBmcm9tIDAgdG8gMjMKKwkJICogTU0gICBNaW51dGVzLCBhIG51bWJlciBmcm9tIDAgdG8gNTkKKwkJICogLlNTICBTZWNvbmRzLCBhIG51bWJlciBmcm9tIDAgdG8gNjEgKHdpdGggbGVhcCBzZWNvbmRzKQorCQkgKiBFdmVyeXRoaW5nIGJ1dCB0aGUgbWludXRlcyBpcyBvcHRpb25hbAorCQkgKgorCQkgKiAidG91Y2ggLXQgREFURVRJTUUiIGZvcm1hdDogW1tbW1tZWV1ZWV1NTV1ERF1oaF1tbVsuc3NdCisJCSAqIFNvbWUsIGJ1dCBub3QgYWxsLCBVbml4ICJkYXRlIERBVEVUSU1FIiBjb21tYW5kcworCQkgKiBtb3ZlIFtbWVldWVldIHBhc3QgbWludXRlcyBtbSBmaWVsZCAoISkuCisJCSAqIENvcmV1dGlscyBkYXRlIGRvZXMgaXQsIGFuZCBTVVMgbWFuZGF0ZXMgaXQuCisJCSAqIChkYXRlIC1zIERBVEVUSU1FIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmb3JtYXQuIGxvdmVseSEpCisJCSAqIEluIGJib3gsIHRoaXMgZm9ybWF0IGlzIHNwZWNpYWwtY2FzZWQgaW4gZGF0ZSBhcHBsZXQKKwkJICogKElPVzogdGhpcyBmdW5jdGlvbiBhc3N1bWVzICJ0b3VjaCAtdCIgZm9ybWF0KS4KKwkJICovCisJCXVuc2lnbmVkIGN1cl95ZWFyID0gcHRtLT50bV95ZWFyOworCQlpbnQgbGVuID0gc3RyY2hybnVsKGRhdGVfc3RyLCAnLicpIC0gZGF0ZV9zdHI7CisKKwkJLyogTU1bLlNTXSAqLworCQlpZiAobGVuID09IDIgJiYgc3NjYW5mKGRhdGVfc3RyLCAiJTJ1JTJ1JTJ1JTJ1IiIlMnUlYyIgKyAxMiwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSAxKSB7CisJCX0gZWxzZQorCQkvKiBISE1NWy5TU10gKi8KKwkJaWYgKGxlbiA9PSA0ICYmIHNzY2FuZihkYXRlX3N0ciwgIiUydSUydSUydSIiJTJ1JTJ1JWMiICsgOSwKKwkJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSAyKSB7CisJCX0gZWxzZQorCQkvKiBkZEhITU1bLlNTXSAqLworCQlpZiAobGVuID09IDYgJiYgc3NjYW5mKGRhdGVfc3RyLCAiJTJ1JTJ1IiIlMnUlMnUlMnUlYyIgKyA2LAorCQkJCQkmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDMpIHsKKwkJfSBlbHNlCisJCS8qIG1tZGRISE1NWy5TU10gKi8KKwkJaWYgKGxlbiA9PSA4ICYmIHNzY2FuZihkYXRlX3N0ciwgIiUydSIiJTJ1JTJ1JTJ1JTJ1JWMiICsgMywKKwkJCQkJJnB0bS0+dG1fbW9uLAorCQkJCQkmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDQpIHsKKwkJCS8qIEFkanVzdCBtb250aCBmcm9tIDEtMTIgdG8gMC0xMSAqLworCQkJcHRtLT50bV9tb24gLT0gMTsKKwkJfSBlbHNlCisJCS8qIHl5bW1kZEhITU1bLlNTXSAqLworCQlpZiAobGVuID09IDEwICYmIHNzY2FuZihkYXRlX3N0ciwgIiUydSUydSUydSUydSUydSVjIiwKKwkJCQkJJnB0bS0+dG1feWVhciwKKwkJCQkJJnB0bS0+dG1fbW9uLAorCQkJCQkmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDUpIHsKKwkJCS8qIEFkanVzdCBtb250aCBmcm9tIDEtMTIgdG8gMC0xMSAqLworCQkJcHRtLT50bV9tb24gLT0gMTsKKwkJCWlmICgoaW50KWN1cl95ZWFyID49IDUwKSB7IC8qID49IDE5NTAgKi8KKwkJCQkvKiBBZGp1c3QgeWVhcjogKi8KKwkJCQkvKiAxLiBQdXQgaXQgaW4gdGhlIGN1cnJlbnQgY2VudHVyeSAqLworCQkJCXB0bS0+dG1feWVhciArPSAoY3VyX3llYXIgLyAxMDApICogMTAwOworCQkJCS8qIDIuIElmIHRvbyBmYXIgaW4gdGhlIHBhc3QsICsxMDAgeWVhcnMgKi8KKwkJCQlpZiAocHRtLT50bV95ZWFyIDwgY3VyX3llYXIgLSA1MCkKKwkJCQkJcHRtLT50bV95ZWFyICs9IDEwMDsKKwkJCQkvKiAzLiBJZiB0b28gZmFyIGluIHRoZSBmdXR1cmUsIC0xMDAgeWVhcnMgKi8KKwkJCQlpZiAocHRtLT50bV95ZWFyID4gY3VyX3llYXIgKyA1MCkKKwkJCQkJcHRtLT50bV95ZWFyIC09IDEwMDsKKwkJCX0KKwkJfSBlbHNlCisJCS8qIGNjeXltbWRkSEhNTVsuU1NdICovCisJCWlmIChsZW4gPT0gMTIgJiYgc3NjYW5mKGRhdGVfc3RyLCAiJTR1JTJ1JTJ1JTJ1JTJ1JWMiLAorCQkJCQkmcHRtLT50bV95ZWFyLAorCQkJCQkmcHRtLT50bV9tb24sCisJCQkJCSZwdG0tPnRtX21kYXksCisJCQkJCSZwdG0tPnRtX2hvdXIsCisJCQkJCSZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gNSkgeworCQkJcHRtLT50bV95ZWFyIC09IDE5MDA7IC8qIEFkanVzdCB5ZWFycyAqLworCQkJcHRtLT50bV9tb24gLT0gMTsgLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCX0gZWxzZSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9kYXRlLCBkYXRlX3N0cik7CisJCX0KKwkJaWYgKGVuZCA9PSAnLicpIHsKKwkJCS8qIHh4eC5TUyAqLworCQkJaWYgKHNzY2FuZihzdHJjaHIoZGF0ZV9zdHIsICcuJykgKyAxLCAiJXUlYyIsCisJCQkJCSZwdG0tPnRtX3NlYywgJmVuZCkgPT0gMSkKKwkJCQllbmQgPSAnXDAnOworCQkJLyogZWxzZSBlbmQgIT0gTlVMIGFuZCB3ZSBlcnJvciBvdXQgKi8KKwkJfQorCX0KKwlpZiAoZW5kICE9ICdcMCcpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCX0KK30KKwordGltZV90IEZBU1RfRlVOQyB2YWxpZGF0ZV90bV90aW1lKGNvbnN0IGNoYXIgKmRhdGVfc3RyLCBzdHJ1Y3QgdG0gKnB0bSkKK3sKKwl0aW1lX3QgdCA9IG1rdGltZShwdG0pOworCWlmICh0ID09ICh0aW1lX3QpIC0xTCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9kYXRlLCBkYXRlX3N0cik7CisJfQorCXJldHVybiB0OworfQorCisjaWYgRU5BQkxFX01PTk9UT05JQ19TWVNDQUxMCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorLyogT2xkIGdsaWJjICg8IDIuMy40KSBkb2VzIG5vdCBwcm92aWRlIHRoaXMgY29uc3RhbnQuIFdlIHVzZSBzeXNjYWxsCisgKiBkaXJlY3RseSBzbyB0aGlzIGRlZmluaXRpb24gaXMgc2FmZS4gKi8KKyNpZm5kZWYgQ0xPQ0tfTU9OT1RPTklDCisjZGVmaW5lIENMT0NLX01PTk9UT05JQyAxCisjZW5kaWYKKworLyogbGliYyBoYXMgaW5jcmVkaWJseSBtZXNzeSB3YXkgb2YgZG9pbmcgdGhpcywKKyAqIHR5cGljYWxseSByZXF1aXJpbmcgLWxydC4gV2UganVzdCBza2lwIGFsbCB0aGlzIG1lc3MgKi8KK3N0YXRpYyB2b2lkIGdldF9tb25vKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJaWYgKHN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lLCBDTE9DS19NT05PVE9OSUMsIHRzKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNsb2NrX2dldHRpbWUoTU9OT1RPTklDKSBmYWlsZWQiKTsKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX25zKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWdldF9tb25vKCZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0cy50dl9uc2VjOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfdXModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJZ2V0X21vbm8oJnRzKTsKKwlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMFVMTCArIHRzLnR2X25zZWMvMTAwMDsKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX21zKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWdldF9tb25vKCZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDBVTEwgKyB0cy50dl9uc2VjLzEwMDAwMDA7Cit9Cit1bnNpZ25lZCBGQVNUX0ZVTkMgbW9ub3RvbmljX3NlYyh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlnZXRfbW9ubygmdHMpOworCXJldHVybiB0cy50dl9zZWM7Cit9CisKKyNlbHNlCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX25zKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0di50dl91c2VjICogMTAwMDsKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX3VzKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBVTEwgKyB0di50dl91c2VjOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfbXModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMTCArIHR2LnR2X3VzZWMgLyAxMDAwOworfQordW5zaWduZWQgRkFTVF9GVU5DIG1vbm90b25pY19zZWModm9pZCkKK3sKKwlyZXR1cm4gdGltZShOVUxMKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi90cmltLmMgYi9saWJiYi90cmltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjYjRmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3RyaW0uYwpAQCAtMCwwICsxLDMwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgdHJpbShjaGFyICpzKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4ocyk7CisKKwkvKiB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAobGVuICYmIGlzc3BhY2Uoc1tsZW4tMV0pKQorCQktLWxlbjsKKworCS8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlICovCisJaWYgKGxlbikgeworCQljaGFyICpud3MgPSBza2lwX3doaXRlc3BhY2Uocyk7CisJCWlmICgobndzIC0gcykgIT0gMCkgeworCQkJbGVuIC09IChud3MgLSBzKTsKKwkJCW1lbW1vdmUocywgbndzLCBsZW4pOworCQl9CisJfQorCXNbbGVuXSA9ICdcMCc7Cit9CmRpZmYgLS1naXQgYS9saWJiYi91X3NpZ25hbF9uYW1lcy5jIGIvbGliYmIvdV9zaWduYWxfbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdV9zaWduYWxfbmFtZXMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2lnbmFsIG5hbWUvbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1JUTUlOTUFYCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBSVE1JTlsrbl0gYW5kIFJUTUFYWy1uXSBzaWduYWwgbmFtZXMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBSVE1JTlsrbl0gYW5kIFJUTUFYWy1uXSBzaWduYWwgbmFtZXMKKy8vY29uZmlnOgkgIGluIGtpbGwsIGtpbGxhbGwgZXRjLiBUaGlzIGNvc3RzIH4yNTAgYnl0ZXMuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IHNvbWUgYXJjaGVzIGhhdmUgbW9yZSB0aGFuIDMyIFNJR3MhCisgKiBIUFBBOiBTSUdTVEtGTFQgPT0gMzYuICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHNpZ25hbHNbXVs3XSA9IHsKKwkvLyBTVVN2MyBzYXlzIGtpbGwgbXVzdCBzdXBwb3J0IHRoZXNlLCBhbmQgc3BlY2lmaWVzIHRoZSBudW1lcmljYWwgdmFsdWVzLAorCS8vIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMva2lsbC5odG1sCisJLy8gezAsICJFWElUIn0sIHsxLCAiSFVQIn0sIHsyLCAiSU5UIn0sIHszLCAiUVVJVCJ9LAorCS8vIHs2LCAiQUJSVCJ9LCB7OSwgIktJTEwifSwgezE0LCAiQUxSTSJ9LCB7MTUsICJURVJNIn0KKwkvLyBBbmQgUG9zaXggYWRkcyB0aGUgZm9sbG93aW5nOgorCS8vIHtTSUdJTEwsICJJTEwifSwge1NJR1RSQVAsICJUUkFQIn0sIHtTSUdGUEUsICJGUEUifSwge1NJR1VTUjEsICJVU1IxIn0sCisJLy8ge1NJR1NFR1YsICJTRUdWIn0sIHtTSUdVU1IyLCAiVVNSMiJ9LCB7U0lHUElQRSwgIlBJUEUifSwge1NJR0NITEQsICJDSExEIn0sCisJLy8ge1NJR0NPTlQsICJDT05UIn0sIHtTSUdTVE9QLCAiU1RPUCJ9LCB7U0lHVFNUUCwgIlRTVFAifSwge1NJR1RUSU4sICJUVElOIn0sCisJLy8ge1NJR1RUT1UsICJUVE9VIn0KKworCVswXSA9ICJFWElUIiwKKyNpZmRlZiBTSUdIVVAKKwlbU0lHSFVQICAgXSA9ICJIVVAiLAorI2VuZGlmCisjaWZkZWYgU0lHSU5UCisJW1NJR0lOVCAgIF0gPSAiSU5UIiwKKyNlbmRpZgorI2lmZGVmIFNJR1FVSVQKKwlbU0lHUVVJVCAgXSA9ICJRVUlUIiwKKyNlbmRpZgorI2lmZGVmIFNJR0lMTAorCVtTSUdJTEwgICBdID0gIklMTCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUUkFQCisJW1NJR1RSQVAgIF0gPSAiVFJBUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdBQlJUCisJW1NJR0FCUlQgIF0gPSAiQUJSVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdCVVMKKwlbU0lHQlVTICAgXSA9ICJCVVMiLAorI2VuZGlmCisjaWZkZWYgU0lHRlBFCisJW1NJR0ZQRSAgIF0gPSAiRlBFIiwKKyNlbmRpZgorI2lmZGVmIFNJR0tJTEwKKwlbU0lHS0lMTCAgXSA9ICJLSUxMIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjEKKwlbU0lHVVNSMSAgXSA9ICJVU1IxIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NFR1YKKwlbU0lHU0VHViAgXSA9ICJTRUdWIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjIKKwlbU0lHVVNSMiAgXSA9ICJVU1IyIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BJUEUKKwlbU0lHUElQRSAgXSA9ICJQSVBFIiwKKyNlbmRpZgorI2lmZGVmIFNJR0FMUk0KKwlbU0lHQUxSTSAgXSA9ICJBTFJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0KKwlbU0lHVEVSTSAgXSA9ICJURVJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NUS0ZMVAorCVtTSUdTVEtGTFRdID0gIlNUS0ZMVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdDSExECisJW1NJR0NITEQgIF0gPSAiQ0hMRCIsCisjZW5kaWYKKyNpZmRlZiBTSUdDT05UCisJW1NJR0NPTlQgIF0gPSAiQ09OVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdTVE9QCisJW1NJR1NUT1AgIF0gPSAiU1RPUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUU1RQCisJW1NJR1RTVFAgIF0gPSAiVFNUUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUVElOCisJW1NJR1RUSU4gIF0gPSAiVFRJTiIsCisjZW5kaWYKKyNpZmRlZiBTSUdUVE9VCisJW1NJR1RUT1UgIF0gPSAiVFRPVSIsCisjZW5kaWYKKyNpZmRlZiBTSUdVUkcKKwlbU0lHVVJHICAgXSA9ICJVUkciLAorI2VuZGlmCisjaWZkZWYgU0lHWENQVQorCVtTSUdYQ1BVICBdID0gIlhDUFUiLAorI2VuZGlmCisjaWZkZWYgU0lHWEZTWgorCVtTSUdYRlNaICBdID0gIlhGU1oiLAorI2VuZGlmCisjaWZkZWYgU0lHVlRBTFJNCisJW1NJR1ZUQUxSTV0gPSAiVlRBTFJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKwlbU0lHUFJPRiAgXSA9ICJQUk9GIiwKKyNlbmRpZgorI2lmZGVmIFNJR1dJTkNICisJW1NJR1dJTkNIIF0gPSAiV0lOQ0giLAorI2VuZGlmCisjaWZkZWYgU0lHUE9MTAorCVtTSUdQT0xMICBdID0gIlBPTEwiLAorI2VuZGlmCisjaWZkZWYgU0lHUFdSCisJW1NJR1BXUiAgIF0gPSAiUFdSIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NZUworCVtTSUdTWVMgICBdID0gIlNZUyIsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVE1JTk1BWAorIyBpZmRlZiBfX1NJR1JUTUlOCisJW19fU0lHUlRNSU5dID0gIlJUTUlOIiwKKyMgZW5kaWYKKy8vIFRoaXMgbWFrZXMgYXJyYXkgYWJvdXQgeDIgYmlnZ2VyLgorLy8gTW9yZSBjb21wYWN0IGFwcHJvYWNoIGlzIHRvIHNwZWNpYWwtY2FzZSBTSUdSVE1BWCBpbiBwcmludF9zaWduYW1lcygpCisvLyMgaWZkZWYgX19TSUdSVE1BWAorLy8JW19fU0lHUlRNQVhdID0gIlJUTUFYIiwKKy8vIyBlbmRpZgorI2VuZGlmCit9OworCisvLyBDb252ZXJ0IHNpZ25hbCBuYW1lIHRvIG51bWJlci4KKworaW50IEZBU1RfRlVOQyBnZXRfc2lnbnVtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaTsKKworCWkgPSBiYl9zdHJ0b3UobmFtZSwgTlVMTCwgMTApOworCWlmICghZXJybm8pCisJCXJldHVybiBpOworCWlmIChzdHJuY2FzZWNtcChuYW1lLCAiU0lHIiwgMykgPT0gMCkKKwkJbmFtZSArPSAzOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpZ25hbHMpOyBpKyspCisJCWlmIChzdHJjYXNlY21wKG5hbWUsIHNpZ25hbHNbaV0pID09IDApCisJCQlyZXR1cm4gaTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisjIGlmIGRlZmluZWQoU0lHSU9UKSB8fCBkZWZpbmVkKFNJR0lPKQorCS8qIFNJR0lPW1RdIGFyZSBhbGlhc2VkIHRvIG90aGVyIG5hbWVzLAorCSAqIHRodXMgY2Fubm90IGJlIHN0b3JlZCBpbiB0aGUgc2lnbmFsc1tdIGFycmF5LgorCSAqIE5lZWQgc3BlY2lhbCBjb2RlIHRvIHJlY29nbml6ZSB0aGVtICovCisJaWYgKChuYW1lWzBdIHwgMHgyMCkgPT0gJ2knICYmIChuYW1lWzFdIHwgMHgyMCkgPT0gJ28nKSB7CisjICBpZmRlZiBTSUdJTworCQlpZiAoIW5hbWVbMl0pCisJCQlyZXR1cm4gU0lHSU87CisjICBlbmRpZgorIyAgaWZkZWYgU0lHSU9UCisJCWlmICgobmFtZVsyXSB8IDB4MjApID09ICd0JyAmJiAhbmFtZVszXSkKKwkJCXJldHVybiBTSUdJT1Q7CisjICBlbmRpZgorCX0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlRNSU5NQVgKKyMgaWYgZGVmaW5lZChTSUdSVE1JTikgJiYgZGVmaW5lZChTSUdSVE1BWCkKKy8qIGxpYmMgbWF5IHVzZSBzb21lIHJ0IHNpZ3MgZm9yIHB0aHJlYWRzIGFuZCB0aGVyZWZvcmUgInJlbWFwIiBTSUdSVE1JTi9NQVgsCisgKiBidXQgd2Ugd2FudCB0byB1c2UgInJhdyIgU0lHUlRNSU4vTUFYLiBVbmRlcnNjb3JlZCBuYW1lcywgaWYgZXhpc3QsIHByb3ZpZGUKKyAqIHRoZW0uIElmIHRoZXkgZG9uJ3QgZXhpc3QsIGZhbGwgYmFjayB0byBub24tdW5kZXJzY29yZWQgb25lczogKi8KKyMgIGlmICFkZWZpbmVkKF9fU0lHUlRNSU4pCisjICAgZGVmaW5lIF9fU0lHUlRNSU4gU0lHUlRNSU4KKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChfX1NJR1JUTUFYKQorIyAgIGRlZmluZSBfX1NJR1JUTUFYIFNJR1JUTUFYCisjICBlbmRpZgorCWlmIChzdHJuY2FzZWNtcChuYW1lLCAiUlRNSU4iLCA1KSA9PSAwKSB7CisJCWlmICghbmFtZVs1XSkKKwkJCXJldHVybiBfX1NJR1JUTUlOOworCQlpZiAobmFtZVs1XSA9PSAnKycpIHsKKwkJCWkgPSBiYl9zdHJ0b3UobmFtZSArIDYsIE5VTEwsIDEwKTsKKwkJCWlmICghZXJybm8gJiYgaSA8PSBfX1NJR1JUTUFYIC0gX19TSUdSVE1JTikKKwkJCQlyZXR1cm4gX19TSUdSVE1JTiArIGk7CisJCX0KKwl9CisJZWxzZSBpZiAoc3RybmNhc2VjbXAobmFtZSwgIlJUTUFYIiwgNSkgPT0gMCkgeworCQlpZiAoIW5hbWVbNV0pCisJCQlyZXR1cm4gX19TSUdSVE1BWDsKKwkJaWYgKG5hbWVbNV0gPT0gJy0nKSB7CisJCQlpID0gYmJfc3RydG91KG5hbWUgKyA2LCBOVUxMLCAxMCk7CisJCQlpZiAoIWVycm5vICYmIGkgPD0gX19TSUdSVE1BWCAtIF9fU0lHUlRNSU4pCisJCQkJcmV0dXJuIF9fU0lHUlRNQVggLSBpOworCQl9CisJfQorIyBlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gLTE7Cit9CisKKy8vIENvbnZlcnQgc2lnbmFsIG51bWJlciB0byBuYW1lCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfc2lnbmFtZShpbnQgbnVtYmVyKQoreworCWlmICgodW5zaWduZWQpbnVtYmVyIDwgQVJSQVlfU0laRShzaWduYWxzKSkgeworCQlpZiAoc2lnbmFsc1tudW1iZXJdWzBdKSAvKiBpZiBpdCdzIG5vdCBhbiBlbXB0eSBzdHIgKi8KKwkJCXJldHVybiBzaWduYWxzW251bWJlcl07CisJfQorCisJcmV0dXJuIGl0b2EobnVtYmVyKTsKK30KKworCisvLyBQcmludCB0aGUgd2hvbGUgc2lnbmFsIGxpc3QKKwordm9pZCBGQVNUX0ZVTkMgcHJpbnRfc2lnbmFtZXModm9pZCkKK3sKKwl1bnNpZ25lZCBzaWdubzsKKworCWZvciAoc2lnbm8gPSAxOyBzaWdubyA8IEFSUkFZX1NJWkUoc2lnbmFscyk7IHNpZ25vKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHNpZ25hbHNbc2lnbm9dOworCQlpZiAobmFtZVswXSkKKwkJCXByaW50ZigiJTJ1KSAlc1xuIiwgc2lnbm8sIG5hbWUpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9SVE1JTk1BWAorIyBpZmRlZiBfX1NJR1JUTUFYCisJcHJpbnRmKCIlMnUpICVzXG4iLCBfX1NJR1JUTUFYLCAiUlRNQVgiKTsKKyMgZW5kaWYKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYmIvdWRwX2lvLmMgYi9saWJiYi91ZHBfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTg1YTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdWRwX2lvLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qCisgKiBUaGlzIGFza3Mga2VybmVsIHRvIGxldCB1cyBrbm93IGRzdCBhZGRyL3BvcnQgb2YgaW5jb21pbmcgcGFja2V0cworICogV2UgZG9uJ3QgY2hlY2sgZm9yIGVycm9ycyBoZXJlLiBOb3Qgc3VwcG9ydGVkID09IHdvbid0IGJlIHVzZWQKKyAqLwordm9pZCBGQVNUX0ZVTkMKK3NvY2tldF93YW50X3BrdGluZm8oaW50IGZkIFVOVVNFRF9QQVJBTSkKK3sKKyNpZmRlZiBJUF9QS1RJTkZPCisJc2V0c29ja29wdChmZCwgSVBQUk9UT19JUCwgSVBfUEtUSU5GTywgJmNvbnN0X2ludF8xLCBzaXplb2YoaW50KSk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9QS1RJTkZPKQorCXNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9QS1RJTkZPLCAmY29uc3RfaW50XzEsIHNpemVvZihpbnQpKTsKKyNlbmRpZgorfQorCisKK3NzaXplX3QgRkFTVF9GVU5DCitzZW5kX3RvX2Zyb20oaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncywKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bywKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tLAorCQlzb2NrbGVuX3QgdG9sZW4pCit7CisjaWZuZGVmIElQX1BLVElORk8KKwkodm9pZClmcm9tOyAvKiBzdXBwcmVzcyAidW51c2VkIGZyb20iIHdhcm5pbmcgKi8KKwlyZXR1cm4gc2VuZHRvKGZkLCBidWYsIGxlbiwgZmxhZ3MsIHRvLCB0b2xlbik7CisjZWxzZQorCXN0cnVjdCBpb3ZlYyBpb3ZbMV07CisJc3RydWN0IG1zZ2hkciBtc2c7CisJdW5pb24geworCQljaGFyIGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pKV07CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgZGVmaW5lZChJUFY2X1BLVElORk8pCisJCWNoYXIgY21zZzZbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSldOworIyBlbmRpZgorCX0gdTsKKwlzdHJ1Y3QgY21zZ2hkciogY21zZ3B0cjsKKworCWlmIChmcm9tLT5zYV9mYW1pbHkgIT0gQUZfSU5FVAorIyBpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJICYmIGZyb20tPnNhX2ZhbWlseSAhPSBBRl9JTkVUNgorIyBlbmRpZgorCSkgeworCQkvKiBBTlkgbG9jYWwgYWRkcmVzcyAqLworCQlyZXR1cm4gc2VuZHRvKGZkLCBidWYsIGxlbiwgZmxhZ3MsIHRvLCB0b2xlbik7CisJfQorCisJLyogbWFuIHJlY3Ztc2cgYW5kIG1hbiBjbXNnIGlzIG5lZWRlZCB0byBtYWtlIHNlbnNlIG9mIGNvZGUgYmVsb3cgKi8KKworCWlvdlswXS5pb3ZfYmFzZSA9IGJ1ZjsKKwlpb3ZbMF0uaW92X2xlbiA9IGxlbjsKKworCW1lbXNldCgmdSwgMCwgc2l6ZW9mKHUpKTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLm1zZ19uYW1lID0gKHZvaWQgKikoc3RydWN0IHNvY2thZGRyICopdG87IC8qIG9yIGNvbXBpbGVyIHdpbGwgYW5ub3kgdXMgKi8KKwltc2cubXNnX25hbWVsZW4gPSB0b2xlbjsKKwltc2cubXNnX2lvdiA9IGlvdjsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19jb250cm9sID0gJnU7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKHUpOworCW1zZy5tc2dfZmxhZ3MgPSBmbGFnczsKKworCWNtc2dwdHIgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOworCWlmICh0by0+c2FfZmFtaWx5ID09IEFGX0lORVQgJiYgZnJvbS0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3RydWN0IGluX3BrdGluZm8gKnBrdHB0cjsKKwkJY21zZ3B0ci0+Y21zZ19sZXZlbCA9IElQUFJPVE9fSVA7CisJCWNtc2dwdHItPmNtc2dfdHlwZSA9IElQX1BLVElORk87CisJCWNtc2dwdHItPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpbl9wa3RpbmZvKSk7CisJCXBrdHB0ciA9IChzdHJ1Y3QgaW5fcGt0aW5mbyAqKShDTVNHX0RBVEEoY21zZ3B0cikpOworCQkvKnBrdHB0ci0+aXBpX2lmaW5kZXggPSAwOyAtLSBhbHJlYWR5IGRvbmUgYnkgbWVtc2V0KHUuLi4pICovCisJCS8qIEluIGdlbmVyYWwsIENNU0dfREFUQSgpIGNhbiBiZSB1bmFsaWduZWQsIGJ1dCBpbiB0aGlzIGNhc2UKKwkJICogd2Uga25vdyBmb3Igc3VyZSBpdCBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZDoKKwkJICogQ01TR19GSVJTVEhEUiBzaW1wbHkgcmV0dXJucyAmdSBhYm92ZSwKKwkJICogYW5kIENNU0dfREFUQSByZXR1cm5zICZ1ICsgc2l6ZV90ICsgaW50ICsgaW50LgorCQkgKiBUaHVzIGRpcmVjdCBhc3NpZ25tZW50IGlzIG9rOgorCQkgKi8KKwkJcGt0cHRyLT5pcGlfc3BlY19kc3QgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopZnJvbSktPnNpbl9hZGRyOworCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiBkZWZpbmVkKElQVjZfUEtUSU5GTykKKwllbHNlIGlmICh0by0+c2FfZmFtaWx5ID09IEFGX0lORVQ2ICYmIGZyb20tPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3QgaW42X3BrdGluZm8gKnBrdHB0cjsKKwkJY21zZ3B0ci0+Y21zZ19sZXZlbCA9IElQUFJPVE9fSVBWNjsKKwkJY21zZ3B0ci0+Y21zZ190eXBlID0gSVBWNl9QS1RJTkZPOworCQljbXNncHRyLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgaW42X3BrdGluZm8pKTsKKwkJcGt0cHRyID0gKHN0cnVjdCBpbjZfcGt0aW5mbyAqKShDTVNHX0RBVEEoY21zZ3B0cikpOworCQkvKiBwa3RwdHItPmlwaTZfaWZpbmRleCA9IDA7IC0tIGFscmVhZHkgZG9uZSBieSBtZW1zZXQodS4uLikgKi8KKwkJcGt0cHRyLT5pcGk2X2FkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWZyb20pLT5zaW42X2FkZHI7CisJfQorIyBlbmRpZgorCW1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2dwdHItPmNtc2dfbGVuOworCisJcmV0dXJuIHNlbmRtc2coZmQsICZtc2csIGZsYWdzKTsKKyNlbmRpZgorfQorCisvKiBOQjogdGhpcyB3aWxsIG5ldmVyIHNldCBwb3J0IyBpbiAndG8nIQorICogX09ubHlfIElQL0lQdjYgYWRkcmVzcyBwYXJ0IG9mICd0bycgaXMgX21heWJlXyBtb2RpZmllZC4KKyAqIFR5cGljYWwgdXNhZ2UgaXMgdG8gcHJlaW5pdCAndG8nIHdpdGggImRlZmF1bHQiIHZhbHVlCisgKiBiZWZvcmUgY2FsbGluZyByZWN2X2Zyb21fdG8oKS4gKi8KK3NzaXplX3QgRkFTVF9GVU5DCityZWN2X2Zyb21fdG8oaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncywKKwkJc3RydWN0IHNvY2thZGRyICpmcm9tLCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQlzb2NrbGVuX3Qgc2Ffc2l6ZSkKK3sKKyNpZm5kZWYgSVBfUEtUSU5GTworCSh2b2lkKXRvOyAvKiBzdXBwcmVzcyAidW51c2VkIHRvIiB3YXJuaW5nICovCisJcmV0dXJuIHJlY3Zmcm9tKGZkLCBidWYsIGxlbiwgZmxhZ3MsIGZyb20sICZzYV9zaXplKTsKKyNlbHNlCisJLyogbWFuIHJlY3Ztc2cgYW5kIG1hbiBjbXNnIGlzIG5lZWRlZCB0byBtYWtlIHNlbnNlIG9mIGNvZGUgYmVsb3cgKi8KKwlzdHJ1Y3QgaW92ZWMgaW92WzFdOworCXVuaW9uIHsKKwkJY2hhciBjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpbl9wa3RpbmZvKSldOworIyBpZiBFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9QS1RJTkZPKQorCQljaGFyIGNtc2c2W0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpbjZfcGt0aW5mbykpXTsKKyMgZW5kaWYKKwl9IHU7CisJc3RydWN0IGNtc2doZHIgKmNtc2dwdHI7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3NpemVfdCByZWN2X2xlbmd0aDsKKworCWlvdlswXS5pb3ZfYmFzZSA9IGJ1ZjsKKwlpb3ZbMF0uaW92X2xlbiA9IGxlbjsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLm1zZ19uYW1lID0gKHN0cnVjdCBzb2NrYWRkciAqKWZyb207CisJbXNnLm1zZ19uYW1lbGVuID0gc2Ffc2l6ZTsKKwltc2cubXNnX2lvdiA9IGlvdjsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19jb250cm9sID0gJnU7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKHUpOworCisJcmVjdl9sZW5ndGggPSByZWN2bXNnKGZkLCAmbXNnLCBmbGFncyk7CisJaWYgKHJlY3ZfbGVuZ3RoIDwgMCkKKwkJcmV0dXJuIHJlY3ZfbGVuZ3RoOworCisjIGRlZmluZSB0bzQgKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKXRvKQorIyBkZWZpbmUgdG82ICgoc3RydWN0IHNvY2thZGRyX2luNiopdG8pCisJLyogSGVyZSB3ZSB0cnkgdG8gcmV0cmlldmUgZGVzdGluYXRpb24gSVAgYW5kIG1lbW9yaXplIGl0ICovCisJZm9yIChjbXNncHRyID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKwkJCWNtc2dwdHIgIT0gTlVMTDsKKwkJCWNtc2dwdHIgPSBDTVNHX05YVEhEUigmbXNnLCBjbXNncHRyKQorCSkgeworCQlpZiAoY21zZ3B0ci0+Y21zZ19sZXZlbCA9PSBJUFBST1RPX0lQCisJCSAmJiBjbXNncHRyLT5jbXNnX3R5cGUgPT0gSVBfUEtUSU5GTworCQkpIHsKKwkJCWNvbnN0IGludCBJUElfQUREUl9PRkYgPSBvZmZzZXRvZihzdHJ1Y3QgaW5fcGt0aW5mbywgaXBpX2FkZHIpOworCQkJdG8tPnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJCQkvKiMgZGVmaW5lIHBrdGluZm8oY21zZ3B0cikgKCAoc3RydWN0IGluX3BrdGluZm8qKShDTVNHX0RBVEEoY21zZ3B0cikpICkqLworCQkJLyp0bzQtPnNpbl9hZGRyID0gcGt0aW5mbyhjbXNncHRyKS0+aXBpX2FkZHI7IC0gbWF5IGJlIHVuYWxpZ25lZCAqLworCQkJbWVtY3B5KCZ0bzQtPnNpbl9hZGRyLCAoY2hhciopKENNU0dfREFUQShjbXNncHRyKSkgKyBJUElfQUREUl9PRkYsIHNpemVvZih0bzQtPnNpbl9hZGRyKSk7CisJCQkvKnRvNC0+c2luX3BvcnQgPSAxMjM7IC0gdGhpcyBkYXRhIGlzIG5vdCBzdXBwbGllZCBieSBrZXJuZWwgKi8KKwkJCWJyZWFrOworCQl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgZGVmaW5lZChJUFY2X1BLVElORk8pCisJCWlmIChjbXNncHRyLT5jbXNnX2xldmVsID09IElQUFJPVE9fSVBWNgorCQkgJiYgY21zZ3B0ci0+Y21zZ190eXBlID09IElQVjZfUEtUSU5GTworCQkpIHsKKwkJCWNvbnN0IGludCBJUEk2X0FERFJfT0ZGID0gb2Zmc2V0b2Yoc3RydWN0IGluNl9wa3RpbmZvLCBpcGk2X2FkZHIpOworCQkJdG8tPnNhX2ZhbWlseSA9IEFGX0lORVQ2OworCQkJLyojICBkZWZpbmUgcGt0aW5mbyhjbXNncHRyKSAoIChzdHJ1Y3QgaW42X3BrdGluZm8qKShDTVNHX0RBVEEoY21zZ3B0cikpICkqLworCQkJLyp0bzYtPnNpbjZfYWRkciA9IHBrdGluZm8oY21zZ3B0ciktPmlwaTZfYWRkcjsgLSBtYXkgYmUgdW5hbGlnbmVkICovCisJCQltZW1jcHkoJnRvNi0+c2luNl9hZGRyLCAoY2hhciopKENNU0dfREFUQShjbXNncHRyKSkgKyBJUEk2X0FERFJfT0ZGLCBzaXplb2YodG82LT5zaW42X2FkZHIpKTsKKwkJCS8qdG82LT5zaW42X3BvcnQgPSAxMjM7ICovCisJCQlicmVhazsKKwkJfQorIyBlbmRpZgorCX0KKwlyZXR1cm4gcmVjdl9sZW5ndGg7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3VuaWNvZGUuYyBiL2xpYmJiL3VuaWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRjMWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdW5pY29kZS5jCkBAIC0wLDAgKzEsMTE1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVW5pY29kZSBzdXBwb3J0IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworLyogSWYgaXQncyBub3QgI2RlZmluZWQgYXMgYSBjb25zdGFudCBpbiB1bmljb2RlLmguLi4gKi8KKyNpZm5kZWYgdW5pY29kZV9zdGF0dXMKK3VpbnQ4X3QgdW5pY29kZV9zdGF0dXM7CisjZW5kaWYKKworLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG9ubHkgaWYgVU5JQ09ERV9TVVBQT1JUIGlzIG9uLgorICogV2UgY2hlY2sgb3RoZXIgb3B0aW9ucyBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gdXNlIGxpYmMgc3VwcG9ydAorICogdmlhIGxvY2FsZSwgb3IgdXNlIG91ciBvd24gbG9naWM6CisgKi8KKworI2lmIEVOQUJMRV9VTklDT0RFX1VTSU5HX0xPQ0FMRQorCisvKiBVbmljb2RlIHN1cHBvcnQgdXNpbmcgbGliYyBsb2NhbGUgc3VwcG9ydC4gKi8KKwordm9pZCBGQVNUX0ZVTkMgcmVpbml0X3VuaWNvZGUoY29uc3QgY2hhciAqTEFORykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciB1bmljb2RlXzB4Mzk0W10gPSB7IDB4Y2UsIDB4OTQsIDAgfTsKKwlzaXplX3Qgd2lkdGg7CisKKy8vVE9ETzogYXZvaWQgcmVwZWF0ZWQgY2FsbHMgYnkgY2FjaGluZyBsYXN0IHN0cmluZz8KKwlzZXRsb2NhbGUoTENfQUxMLCAoTEFORyAmJiBMQU5HWzBdKSA/IExBTkcgOiAiQyIpOworCisJLyogSW4gdW5pY29kZSwgdGhpcyBpcyBhIG9uZSBjaGFyYWN0ZXIgc3RyaW5nICovCisvLyBjYW4gdXNlIHVuaWNvZGVfc3RybGVuKHN0cmluZykgdG9vLCBidXQgb3RoZXJ3aXNlIHVuaWNvZGVfc3RybGVuKCkgaXMgdW51c2VkCisJd2lkdGggPSBtYnN0b3djcyhOVUxMLCB1bmljb2RlXzB4Mzk0LCBJTlRfTUFYKTsKKwl1bmljb2RlX3N0YXR1cyA9ICh3aWR0aCA9PSAxID8gVU5JQ09ERV9PTiA6IFVOSUNPREVfT0ZGKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgaW5pdF91bmljb2RlKHZvaWQpCit7CisJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfVU5LTk9XTikKKwkJcmVpbml0X3VuaWNvZGUoZ2V0ZW52KCJMQU5HIikpOworfQorCisjZWxzZQorCisvKiBIb21lZ3Jvd24gVW5pY29kZSBzdXBwb3J0LiBJdCBrbm93cyBvbmx5IEMgYW5kIFVuaWNvZGUgbG9jYWxlcy4gKi8KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOVgordm9pZCBGQVNUX0ZVTkMgcmVpbml0X3VuaWNvZGUoY29uc3QgY2hhciAqTEFORykKK3sKKwl1bmljb2RlX3N0YXR1cyA9IFVOSUNPREVfT0ZGOworCWlmICghTEFORyB8fCAhKHN0cnN0cihMQU5HLCAiLnV0ZiIpIHx8IHN0cnN0cihMQU5HLCAiLlVURiIpKSkKKwkJcmV0dXJuOworCXVuaWNvZGVfc3RhdHVzID0gVU5JQ09ERV9PTjsKK30KKwordm9pZCBGQVNUX0ZVTkMgaW5pdF91bmljb2RlKHZvaWQpCit7CisJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfVU5LTk9XTikKKwkJcmVpbml0X3VuaWNvZGUoZ2V0ZW52KCJMQU5HIikpOworfQorIyBlbmRpZgorCitzdGF0aWMgc2l6ZV90IHdjcnRvbWJfaW50ZXJuYWwoY2hhciAqcywgd2NoYXJfdCB3YykKK3sKKwlpbnQgbiwgaTsKKwl1aW50MzJfdCB2ID0gd2M7CisKKwlpZiAodiA8PSAweDdmKSB7CisJCSpzID0gdjsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUkZDIDM2Mjkgc2F5cyB0aGF0IFVuaWNvZGUgZW5kcyBhdCAxMEZGRkYsCisJICogYnV0IHdlIGNvdmVyIGVudGlyZSAzMiBiaXRzICovCisKKwkvKiA0MDAwMDAwLUZGRkZGRkZGIC0+IDExMTExMXR0IDEwdHR0dHR0IDEwenp6enp6IDEwenp5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogMjAwMDAwLTNGRkZGRkYgLT4gMTExMTEwdHQgMTB6enp6enogMTB6enl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkvKiAxMDAwMC0xRkZGRkYgLT4gMTExMTB6enogMTB6enl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkvKiA4MDAtRkZGRiAtPiAxMTEweXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDgwLTdGRiAtPiAxMTB5eXl4eCAxMHh4eHh4eCAqLworCisJLyogSG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZD8gKi8KKwluID0gMjsKKwkvKiAoMHg4MDAwMDAwMCsgd291bGQgcmVzdWx0IGluIG4gPSA3LCBsaW1pdGluZyBuIHRvIDYpICovCisJd2hpbGUgKHYgPj0gMHg4MDAgJiYgbiA8IDYpIHsKKwkJdiA+Pj0gNTsKKwkJbisrOworCX0KKwkvKiBGaWxsIGJ5dGVzIG4tMS4uMSAqLworCWkgPSBuOworCXdoaWxlICgtLWkpIHsKKwkJc1tpXSA9ICh3YyAmIDB4M2YpIHwgMHg4MDsKKwkJd2MgPj49IDY7CisJfQorCS8qIEZpbGwgYnl0ZSAwICovCisJc1swXSA9IHdjIHwgKHVpbnQ4X3QpKDB4M2YwMCA+PiBuKTsKKwlyZXR1cm4gbjsKK30KK3NpemVfdCBGQVNUX0ZVTkMgd2NydG9tYihjaGFyICpzLCB3Y2hhcl90IHdjLCBtYnN0YXRlX3QgKnBzIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTikgeworCQkqcyA9IHdjOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gd2NydG9tYl9pbnRlcm5hbChzLCB3Yyk7Cit9CitzaXplX3QgRkFTVF9GVU5DIHdjc3RvbWJzKGNoYXIgKmRlc3QsIGNvbnN0IHdjaGFyX3QgKnNyYywgc2l6ZV90IG4pCit7CisJc2l6ZV90IG9yZ19uID0gbjsKKworCWlmICh1bmljb2RlX3N0YXR1cyAhPSBVTklDT0RFX09OKSB7CisJCXdoaWxlIChuKSB7CisJCQl3Y2hhcl90IGMgPSAqc3JjKys7CisJCQkqZGVzdCsrID0gYzsKKwkJCWlmIChjID09IDApCisJCQkJYnJlYWs7CisJCQluLS07CisJCX0KKwkJcmV0dXJuIG9yZ19uIC0gbjsKKwl9CisKKwl3aGlsZSAobiA+PSBNQl9DVVJfTUFYKSB7CisJCXdjaGFyX3Qgd2MgPSAqc3JjKys7CisJCXNpemVfdCBsZW4gPSB3Y3J0b21iX2ludGVybmFsKGRlc3QsIHdjKTsKKworCQlpZiAod2MgPT0gTCdcMCcpCisJCQlyZXR1cm4gb3JnX24gLSBuOworCQlkZXN0ICs9IGxlbjsKKwkJbiAtPSBsZW47CisJfQorCXdoaWxlIChuKSB7CisJCWNoYXIgdGJ1ZltNQl9DVVJfTUFYXTsKKwkJd2NoYXJfdCB3YyA9ICpzcmMrKzsKKwkJc2l6ZV90IGxlbiA9IHdjcnRvbWJfaW50ZXJuYWwodGJ1Ziwgd2MpOworCisJCWlmIChsZW4gPiBuKQorCQkJYnJlYWs7CisJCW1lbWNweShkZXN0LCB0YnVmLCBsZW4pOworCQlpZiAod2MgPT0gTCdcMCcpCisJCQlyZXR1cm4gb3JnX24gLSBuOworCQlkZXN0ICs9IGxlbjsKKwkJbiAtPSBsZW47CisJfQorCXJldHVybiBvcmdfbiAtIG47Cit9CisKKyMgZGVmaW5lIEVSUk9SX1dDSEFSICh+KHdjaGFyX3QpMCkKKworc3RhdGljIGNvbnN0IGNoYXIgKm1ic3Rvd2NfaW50ZXJuYWwod2NoYXJfdCAqcmVzLCBjb25zdCBjaGFyICpzcmMpCit7CisJaW50IGJ5dGVzOworCXVuc2lnbmVkIGMgPSAodW5zaWduZWQgY2hhcikgKnNyYysrOworCisJaWYgKGMgPD0gMHg3ZikgeworCQkqcmVzID0gYzsKKwkJcmV0dXJuIHNyYzsKKwl9CisKKwkvKiA4MC03RkYgLT4gMTEweXl5eHggMTB4eHh4eHggKi8KKwkvKiA4MDAtRkZGRiAtPiAxMTEweXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDEwMDAwLTFGRkZGRiAtPiAxMTExMHp6eiAxMHp6eXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDIwMDAwMC0zRkZGRkZGIC0+IDExMTExMHR0IDEwenp6enp6IDEwenp5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogNDAwMDAwMC1GRkZGRkZGRiAtPiAxMTExMTF0dCAxMHR0dHR0dCAxMHp6enp6eiAxMHp6eXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCWJ5dGVzID0gMDsKKwlkbyB7CisJCWMgPDw9IDE7CisJCWJ5dGVzKys7CisJfSB3aGlsZSAoKGMgJiAweDgwKSAmJiBieXRlcyA8IDYpOworCWlmIChieXRlcyA9PSAxKSB7CisJCS8qIEEgYmFyZSAiY29udGludWF0aW9uIiBieXRlLiBTYXksIDgwICovCisJCSpyZXMgPSBFUlJPUl9XQ0hBUjsKKwkJcmV0dXJuIHNyYzsKKwl9CisJYyA9ICh1aW50OF90KShjKSA+PiBieXRlczsKKworCXdoaWxlICgtLWJ5dGVzKSB7CisJCXVuc2lnbmVkIGNoID0gKHVuc2lnbmVkIGNoYXIpICpzcmM7CisJCWlmICgoY2ggJiAweGMwKSAhPSAweDgwKSB7CisJCQkvKiBNaXNzaW5nICJjb250aW51YXRpb24iIGJ5dGUuIEV4YW1wbGU6IGUwIDgwICovCisJCQkqcmVzID0gRVJST1JfV0NIQVI7CisJCQlyZXR1cm4gc3JjOworCQl9CisJCWMgPSAoYyA8PCA2KSArIChjaCAmIDB4M2YpOworCQlzcmMrKzsKKwl9CisKKwkvKiBUT0RPICovCisJLyogTmVlZCB0byBjaGVjayB0aGF0IGMgaXNuJ3QgcHJvZHVjZWQgYnkgb3ZlcmxvbmcgZW5jb2RpbmcgKi8KKwkvKiBFeGFtcGxlOiAxMTAwMDAwMCAxMDAwMDAwMCBjb252ZXJ0cyB0byBOVUwgKi8KKwkvKiAxMTExMDAwMCAxMDAwMDAwMCAxMDAwMDEwMCAxMDAwMDAwMCBjb252ZXJ0cyB0byAweDEwMCAqLworCS8qIGNvcnJlY3QgZW5jb2Rpbmc6IDExMDAwMTAwIDEwMDAwMDAwICovCisJaWYgKGMgPD0gMHg3ZikgeyAvKiBjcnVkZSBjaGVjayAqLworCQkqcmVzID0gRVJST1JfV0NIQVI7CisJCXJldHVybiBzcmM7CisJfQorCisJKnJlcyA9IGM7CisJcmV0dXJuIHNyYzsKK30KK3NpemVfdCBGQVNUX0ZVTkMgbWJzdG93Y3Mod2NoYXJfdCAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbikKK3sKKwlzaXplX3Qgb3JnX24gPSBuOworCisJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04pIHsKKwkJd2hpbGUgKG4pIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpzcmMrKzsKKworCQkJaWYgKGRlc3QpCisJCQkJKmRlc3QrKyA9IGM7CisJCQlpZiAoYyA9PSAwKQorCQkJCWJyZWFrOworCQkJbi0tOworCQl9CisJCXJldHVybiBvcmdfbiAtIG47CisJfQorCisJd2hpbGUgKG4pIHsKKwkJd2NoYXJfdCB3YzsKKwkJc3JjID0gbWJzdG93Y19pbnRlcm5hbCgmd2MsIHNyYyk7CisJCWlmICh3YyA9PSBFUlJPUl9XQ0hBUikgLyogZXJyb3IgKi8KKwkJCXJldHVybiAoc2l6ZV90KSAtMUw7CisJCWlmIChkZXN0KQorCQkJKmRlc3QrKyA9IHdjOworCQlpZiAod2MgPT0gMCkgLyogZW5kLW9mLXN0cmluZyAqLworCQkJYnJlYWs7CisJCW4tLTsKKwl9CisKKwlyZXR1cm4gb3JnX24gLSBuOworfQorCitpbnQgRkFTVF9GVU5DIGlzd3NwYWNlKHdpbnRfdCB3YykKK3sKKwlyZXR1cm4gKHVuc2lnbmVkKXdjIDw9IDB4N2YgJiYgaXNzcGFjZSh3Yyk7Cit9CisKK2ludCBGQVNUX0ZVTkMgaXN3YWxudW0od2ludF90IHdjKQoreworCXJldHVybiAodW5zaWduZWQpd2MgPD0gMHg3ZiAmJiBpc2FsbnVtKHdjKTsKK30KKworaW50IEZBU1RfRlVOQyBpc3dwdW5jdCh3aW50X3Qgd2MpCit7CisJcmV0dXJuICh1bnNpZ25lZCl3YyA8PSAweDdmICYmIGlzcHVuY3Qod2MpOworfQorCisKKyMgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4MzAwCitzdHJ1Y3QgaW50ZXJ2YWwgeworCXVpbnQxNl90IGZpcnN0OworCXVpbnQxNl90IGxhc3Q7Cit9OworCisvKiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGJpbmFyeSBzZWFyY2ggaW4gaW50ZXJ2YWwgdGFibGUgKi8KK3N0YXRpYyBpbnQgaW5faW50ZXJ2YWxfdGFibGUodW5zaWduZWQgdWNzLCBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgKnRhYmxlLCB1bnNpZ25lZCBtYXgpCit7CisJdW5zaWduZWQgbWluOworCXVuc2lnbmVkIG1pZDsKKworCWlmICh1Y3MgPCB0YWJsZVswXS5maXJzdCB8fCB1Y3MgPiB0YWJsZVttYXhdLmxhc3QpCisJCXJldHVybiAwOworCisJbWluID0gMDsKKwl3aGlsZSAobWF4ID49IG1pbikgeworCQltaWQgPSAobWluICsgbWF4KSAvIDI7CisJCWlmICh1Y3MgPiB0YWJsZVttaWRdLmxhc3QpCisJCQltaW4gPSBtaWQgKyAxOworCQllbHNlIGlmICh1Y3MgPCB0YWJsZVttaWRdLmZpcnN0KQorCQkJbWF4ID0gbWlkIC0gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluX3VpbnQxNl90YWJsZSh1bnNpZ25lZCB1Y3MsIGNvbnN0IHVpbnQxNl90ICp0YWJsZSwgdW5zaWduZWQgbWF4KQoreworCXVuc2lnbmVkIG1pbjsKKwl1bnNpZ25lZCBtaWQ7CisJdW5zaWduZWQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IHRhYmxlWzBdID4+IDI7CisJbGFzdCA9IGZpcnN0ICsgKHRhYmxlWzBdICYgMyk7CisJaWYgKHVjcyA8IGZpcnN0IHx8IHVjcyA+IGxhc3QpCisJCXJldHVybiAwOworCisJbWluID0gMDsKKwl3aGlsZSAobWF4ID49IG1pbikgeworCQltaWQgPSAobWluICsgbWF4KSAvIDI7CisJCWZpcnN0ID0gdGFibGVbbWlkXSA+PiAyOworCQlsYXN0ID0gZmlyc3QgKyAodGFibGVbbWlkXSAmIDMpOworCQlpZiAodWNzID4gbGFzdCkKKwkJCW1pbiA9IG1pZCArIDE7CisJCWVsc2UgaWYgKHVjcyA8IGZpcnN0KQorCQkJbWF4ID0gbWlkIC0gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorIyBlbmRpZgorCisKKy8qCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHdjd2lkdGgoKSBhbmQgd2Nzd2lkdGgoKSAoZGVmaW5lZCBpbgorICogSUVFRSBTdGQgMTAwMi4xLTIwMDEpIGZvciBVbmljb2RlLgorICoKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS9mdW5jdGlvbnMvd2N3aWR0aC5odG1sCisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvZnVuY3Rpb25zL3djc3dpZHRoLmh0bWwKKyAqCisgKiBJbiBmaXhlZC13aWR0aCBvdXRwdXQgZGV2aWNlcywgTGF0aW4gY2hhcmFjdGVycyBhbGwgb2NjdXB5IGEgc2luZ2xlCisgKiAiY2VsbCIgcG9zaXRpb24gb2YgZXF1YWwgd2lkdGgsIHdoZXJlYXMgaWRlb2dyYXBoaWMgQ0pLIGNoYXJhY3RlcnMKKyAqIG9jY3VweSB0d28gc3VjaCBjZWxscy4gSW50ZXJvcGVyYWJpbGl0eSBiZXR3ZWVuIHRlcm1pbmFsLWxpbmUKKyAqIGFwcGxpY2F0aW9ucyBhbmQgKHRlbGV0eXBlLXN0eWxlKSBjaGFyYWN0ZXIgdGVybWluYWxzIHVzaW5nIHRoZQorICogVVRGLTggZW5jb2RpbmcgcmVxdWlyZXMgYWdyZWVtZW50IG9uIHdoaWNoIGNoYXJhY3RlciBzaG91bGQgYWR2YW5jZQorICogdGhlIGN1cnNvciBieSBob3cgbWFueSBjZWxsIHBvc2l0aW9ucy4gTm8gZXN0YWJsaXNoZWQgZm9ybWFsCisgKiBzdGFuZGFyZHMgZXhpc3QgYXQgcHJlc2VudCBvbiB3aGljaCBVbmljb2RlIGNoYXJhY3RlciBzaGFsbCBvY2N1cHkKKyAqIGhvdyBtYW55IGNlbGwgcG9zaXRpb25zIG9uIGNoYXJhY3RlciB0ZXJtaW5hbHMuIFRoZXNlIHJvdXRpbmVzIGFyZQorICogYSBmaXJzdCBhdHRlbXB0IG9mIGRlZmluaW5nIHN1Y2ggYmVoYXZpb3IgYmFzZWQgb24gc2ltcGxlIHJ1bGVzCisgKiBhcHBsaWVkIHRvIGRhdGEgcHJvdmlkZWQgYnkgdGhlIFVuaWNvZGUgQ29uc29ydGl1bS4KKyAqCisgKiBGb3Igc29tZSBncmFwaGljYWwgY2hhcmFjdGVycywgdGhlIFVuaWNvZGUgc3RhbmRhcmQgZXhwbGljaXRseQorICogZGVmaW5lcyBhIGNoYXJhY3Rlci1jZWxsIHdpZHRoIHZpYSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgRWFzdCBBc2lhbgorICogRnVsbFdpZHRoIChGKSwgV2lkZSAoVyksIEhhbGYtd2lkdGggKEgpLCBhbmQgTmFycm93IChOYSkgY2xhc3Nlcy4KKyAqIEluIGFsbCB0aGVzZSBjYXNlcywgdGhlcmUgaXMgbm8gYW1iaWd1aXR5IGFib3V0IHdoaWNoIHdpZHRoIGEKKyAqIHRlcm1pbmFsIHNoYWxsIHVzZS4gRm9yIGNoYXJhY3RlcnMgaW4gdGhlIEVhc3QgQXNpYW4gQW1iaWd1b3VzIChBKQorICogY2xhc3MsIHRoZSB3aWR0aCBjaG9pY2UgZGVwZW5kcyBwdXJlbHkgb24gYSBwcmVmZXJlbmNlIG9mIGJhY2t3YXJkCisgKiBjb21wYXRpYmlsaXR5IHdpdGggZWl0aGVyIGhpc3RvcmljIENKSyBvciBXZXN0ZXJuIHByYWN0aWNlLgorICogQ2hvb3Npbmcgc2luZ2xlLXdpZHRoIGZvciB0aGVzZSBjaGFyYWN0ZXJzIGlzIGVhc3kgdG8ganVzdGlmeSBhcworICogdGhlIGFwcHJvcHJpYXRlIGxvbmctdGVybSBzb2x1dGlvbiwgYXMgdGhlIENKSyBwcmFjdGljZSBvZgorICogZGlzcGxheWluZyB0aGVzZSBjaGFyYWN0ZXJzIGFzIGRvdWJsZS13aWR0aCBjb21lcyBmcm9tIGhpc3RvcmljCisgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbGljaXR5ICg4LWJpdCBlbmNvZGVkIGNoYXJhY3RlcnMgd2VyZSBkaXNwbGF5ZWQKKyAqIHNpbmdsZS13aWR0aCBhbmQgMTYtYml0IG9uZXMgZG91YmxlLXdpZHRoLCBldmVuIGZvciBHcmVlaywKKyAqIEN5cmlsbGljLCBldGMuKSBhbmQgbm90IGFueSB0eXBvZ3JhcGhpYyBjb25zaWRlcmF0aW9ucy4KKyAqCisgKiBNdWNoIGxlc3MgY2xlYXIgaXMgdGhlIGNob2ljZSBvZiB3aWR0aCBmb3IgdGhlIE5vdCBFYXN0IEFzaWFuCisgKiAoTmV1dHJhbCkgY2xhc3MuIEV4aXN0aW5nIHByYWN0aWNlIGRvZXMgbm90IGRpY3RhdGUgYSB3aWR0aCBmb3IgYW55CisgKiBvZiB0aGVzZSBjaGFyYWN0ZXJzLiBJdCB3b3VsZCBuZXZlcnRoZWxlc3MgbWFrZSBzZW5zZQorICogdHlwb2dyYXBoaWNhbGx5IHRvIGFsbG9jYXRlIHR3byBjaGFyYWN0ZXIgY2VsbHMgdG8gY2hhcmFjdGVycyBzdWNoCisgKiBhcyBmb3IgaW5zdGFuY2UgRU0gU1BBQ0Ugb3IgVk9MVU1FIElOVEVHUkFMLCB3aGljaCBjYW5ub3QgYmUKKyAqIHJlcHJlc2VudGVkIGFkZXF1YXRlbHkgd2l0aCBhIHNpbmdsZS13aWR0aCBnbHlwaC4gVGhlIGZvbGxvd2luZworICogcm91dGluZXMgYXQgcHJlc2VudCBtZXJlbHkgYXNzaWduIGEgc2luZ2xlLWNlbGwgd2lkdGggdG8gYWxsCisgKiBuZXV0cmFsIGNoYXJhY3RlcnMsIGluIHRoZSBpbnRlcmVzdCBvZiBzaW1wbGljaXR5LiBUaGlzIGlzIG5vdAorICogZW50aXJlbHkgc2F0aXNmYWN0b3J5IGFuZCBzaG91bGQgYmUgcmVjb25zaWRlcmVkIGJlZm9yZQorICogZXN0YWJsaXNoaW5nIGEgZm9ybWFsIHN0YW5kYXJkIGluIHRoaXMgYXJlYS4gQXQgdGhlIG1vbWVudCwgdGhlCisgKiBkZWNpc2lvbiB3aGljaCBOb3QgRWFzdCBBc2lhbiAoTmV1dHJhbCkgY2hhcmFjdGVycyBzaG91bGQgYmUKKyAqIHJlcHJlc2VudGVkIGJ5IGRvdWJsZS13aWR0aCBnbHlwaHMgY2Fubm90IHlldCBiZSBhbnN3ZXJlZCBieQorICogYXBwbHlpbmcgYSBzaW1wbGUgcnVsZSBmcm9tIHRoZSBVbmljb2RlIGRhdGFiYXNlIGNvbnRlbnQuIFNldHRpbmcKKyAqIHVwIGEgcHJvcGVyIHN0YW5kYXJkIGZvciB0aGUgYmVoYXZpb3Igb2YgVVRGLTggY2hhcmFjdGVyIHRlcm1pbmFscworICogd2lsbCByZXF1aXJlIGEgY2FyZWZ1bCBhbmFseXNpcyBub3Qgb25seSBvZiBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyLAorICogYnV0IGFsc28gb2YgZWFjaCBwcmVzZW50YXRpb24gZm9ybSwgc29tZXRoaW5nIHRoZSBhdXRob3Igb2YgdGhlc2UKKyAqIHJvdXRpbmVzIGhhcyBhdm9pZGVkIHRvIGRvIHNvIGZhci4KKyAqCisgKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjExLworICoKKyAqIE1hcmt1cyBLdWhuIC0tIDIwMDctMDUtMjYgKFVuaWNvZGUgNS4wKQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKyAqIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuIFRoZSBhdXRob3IKKyAqIGRpc2NsYWltcyBhbGwgd2FycmFudGllcyB3aXRoIHJlZ2FyZCB0byB0aGlzIHNvZnR3YXJlLgorICoKKyAqIExhdGVzdCB2ZXJzaW9uOiBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3djd2lkdGguYworICovCisKKy8qIEFzc2lnbmVkIFVuaWNvZGUgY2hhcmFjdGVyIHJhbmdlczoKKyAqIFBsYW5lIFJhbmdlCisgKiAwICAgICAgIDAwMDDigJNGRkZGICAgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgKiAxICAgICAgMTAwMDDigJMxRkZGRiAgU3VwcGxlbWVudGFyeSBNdWx0aWxpbmd1YWwgUGxhbmUKKyAqIDIgICAgICAyMDAwMOKAkzJGRkZGICBTdXBwbGVtZW50YXJ5IElkZW9ncmFwaGljIFBsYW5lCisgKiAzICAgICAgMzAwMDAtM0ZGRkYgIFRlcnRpYXJ5IElkZW9ncmFwaGljIFBsYW5lIChubyBjaGFycyBhc3NpZ25lZCB5ZXQpCisgKiA0LTEzICAgNDAwMDDigJNERkZGRiAgY3VycmVudGx5IHVuYXNzaWduZWQKKyAqIDE0ICAgICBFMDAwMOKAk0VGRkZGICBTdXBwbGVtZW50YXJ5IFNwZWNpYWwtcHVycG9zZSBQbGFuZQorICogMTUgICAgIEYwMDAw4oCTRkZGRkYgIFN1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1BCisgKiAxNiAgICAxMDAwMDDigJMxMEZGRkYgU3VwcGxlbWVudGFyeSBQcml2YXRlIFVzZSBBcmVhLUIKKyAqCisgKiAiU3VwcGxlbWVudGFyeSBTcGVjaWFsLXB1cnBvc2UgUGxhbmUgY3VycmVudGx5IGNvbnRhaW5zIG5vbi1ncmFwaGljYWwKKyAqIGNoYXJhY3RlcnMgaW4gdHdvIGJsb2NrcyBvZiAxMjggYW5kIDI0MCBjaGFyYWN0ZXJzLiBUaGUgZmlyc3QgYmxvY2sKKyAqIGlzIGZvciBsYW5ndWFnZSB0YWcgY2hhcmFjdGVycyBmb3IgdXNlIHdoZW4gbGFuZ3VhZ2UgY2Fubm90IGJlIGluZGljYXRlZAorICogdGhyb3VnaCBvdGhlciBwcm90b2NvbHMgKHN1Y2ggYXMgdGhlIHhtbDpsYW5nICBhdHRyaWJ1dGUgaW4gWE1MKS4KKyAqIFRoZSBvdGhlciBibG9jayBjb250YWlucyBnbHlwaCB2YXJpYXRpb24gc2VsZWN0b3JzIHRvIGluZGljYXRlCisgKiBhbiBhbHRlcm5hdGUgZ2x5cGggZm9yIGEgY2hhcmFjdGVyIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQgYnkgY29udGV4dC4iCisgKgorICogSW4gc2ltcGxlciB0ZXJtczogaXQgaXMgYSB0b29sIHRvIGZpeCB0aGUgIkhhbiB1bmlmaWNhdGlvbiIgbWVzcworICogY3JlYXRlZCBieSBVbmljb2RlIGNvbW1pdHRlZSwgdG8gc2VsZWN0IENoaW5lc2UvSmFwYW5lc2UvS29yZWFuL1RhaXdhbgorICogdmVyc2lvbiBvZiBhIGNoYXJhY3Rlci4gKFRoZXkgZm9yZ290IHRoYXQgdGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhlIFVuaWNvZGUKKyAqIHdhcyB0byBiZSBhYmxlIHRvIHdyaXRlIGFsbCBjaGFycyBpbiBvbmUgY2hhcnNldCB3aXRob3V0IHN1Y2ggdHJpY2tzKS4KKyAqIFVudGlsIEVhc3QgQXNpYW4gdXNlcnMgc2F5IGl0IGlzIGFjdHVhbGx5IG5lY2Vzc2FyeSB0byBzdXBwb3J0IHRoZXNlCisgKiBjb2RlIHBvaW50cyBpbiBjb25zb2xlIGFwcGxpY2F0aW9ucyBsaWtlIGJ1c3lib3gKKyAqIChpLmUuIGRvIHRoZXNlIGNoYXJzIGV2ZXIgYXBwZWFyIGluIGZpbGVuYW1lcywgaG9zdG5hbWVzLCB0ZXh0IGZpbGVzCisgKiBhbmQgc3VjaD8pLCB3ZSBhcmUgdHJlYXRpbmcgdGhlc2UgY29kZSBwb2ludHMgYXMgaW52YWxpZC4KKyAqCisgKiBUZXJ0aWFyeSBJZGVvZ3JhcGhpYyBQbGFuZSBpcyBhbHNvIGlnbm9yZWQgZm9yIG5vdywKKyAqIHVudGlsIFVuaWNvZGUgY29tbWl0dGVlIGFzc2lnbnMgc29tZXRoaW5nIHRoZXJlLgorICovCisvKiBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgZGVmaW5lIHRoZSBjb2x1bW4gd2lkdGggb2YgYW4gSVNPIDEwNjQ2CisgKiBjaGFyYWN0ZXIgYXMgZm9sbG93czoKKyAqCisgKiAgICAtIFRoZSBudWxsIGNoYXJhY3RlciAoVSswMDAwKSBoYXMgYSBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIE90aGVyIEMwL0MxIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgREVMIHdpbGwgbGVhZCB0byBhIHJldHVybgorICogICAgICB2YWx1ZSBvZiAtMS4KKyAqCisgKiAgICAtIE5vbi1zcGFjaW5nIGFuZCBlbmNsb3NpbmcgY29tYmluaW5nIGNoYXJhY3RlcnMgKGdlbmVyYWwKKyAqICAgICAgY2F0ZWdvcnkgY29kZSBNbiBvciBNZSBpbiB0aGUgVW5pY29kZSBkYXRhYmFzZSkgaGF2ZSBhCisgKiAgICAgIGNvbHVtbiB3aWR0aCBvZiAwLgorICoKKyAqICAgIC0gU09GVCBIWVBIRU4gKFUrMDBBRCkgaGFzIGEgY29sdW1uIHdpZHRoIG9mIDEuCisgKgorICogICAgLSBPdGhlciBmb3JtYXQgY2hhcmFjdGVycyAoZ2VuZXJhbCBjYXRlZ29yeSBjb2RlIENmIGluIHRoZSBVbmljb2RlCisgKiAgICAgIGRhdGFiYXNlKSBhbmQgWkVSTyBXSURUSCBTUEFDRSAoVSsyMDBCKSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBIYW5ndWwgSmFtbyBtZWRpYWwgdm93ZWxzIGFuZCBmaW5hbCBjb25zb25hbnRzIChVKzExNjAtVSsxMUZGKQorICogICAgICBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBTcGFjaW5nIGNoYXJhY3RlcnMgaW4gdGhlIEVhc3QgQXNpYW4gV2lkZSAoVykgb3IgRWFzdCBBc2lhbgorICogICAgICBGdWxsLXdpZHRoIChGKSBjYXRlZ29yeSBhcyBkZWZpbmVkIGluIFVuaWNvZGUgVGVjaG5pY2FsCisgKiAgICAgIFJlcG9ydCAjMTEgaGF2ZSBhIGNvbHVtbiB3aWR0aCBvZiAyLgorICoKKyAqICAgIC0gQWxsIHJlbWFpbmluZyBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgYWxsIHByaW50YWJsZQorICogICAgICBJU08gODg1OS0xIGFuZCBXR0w0IGNoYXJhY3RlcnMsIFVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXJzLAorICogICAgICBldGMuKSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDEuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgd2NoYXJfdCBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkCisgKiBpbiBJU08gMTA2NDYuCisgKi8KK2ludCBGQVNUX0ZVTkMgd2N3aWR0aCh1bnNpZ25lZCB1Y3MpCit7CisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweDMwMAorCS8qIHNvcnRlZCBsaXN0IG9mIG5vbi1vdmVybGFwcGluZyBpbnRlcnZhbHMgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyAqLworCS8qIGdlbmVyYXRlZCBieSAidW5pc2V0ICtjYXQ9TWUgK2NhdD1NbiArY2F0PUNmIC0wMEFEICsxMTYwLTExRkYgKzIwMEIgYyIgKi8KKyMgIGRlZmluZSBCSUdfKGEsYikgeyBhLCBiIH0sCisjICBkZWZpbmUgUEFJUihhLGIpCisjICBkZWZpbmUgQVJSQVkgLyogUEFJUiBpZiA8IDB4NDAwMCBhbmQgbm8gbW9yZSB0aGFuIDQgY2hhcnMgYmlnICovIFwKKwkJQklHXygweDAzMDAsIDB4MDM2RikgXAorCQlQQUlSKDB4MDQ4MywgMHgwNDg2KSBcCisJCVBBSVIoMHgwNDg4LCAweDA0ODkpIFwKKwkJQklHXygweDA1OTEsIDB4MDVCRCkgXAorCQlQQUlSKDB4MDVCRiwgMHgwNUJGKSBcCisJCVBBSVIoMHgwNUMxLCAweDA1QzIpIFwKKwkJUEFJUigweDA1QzQsIDB4MDVDNSkgXAorCQlQQUlSKDB4MDVDNywgMHgwNUM3KSBcCisJCVBBSVIoMHgwNjAwLCAweDA2MDMpIFwKKwkJQklHXygweDA2MTAsIDB4MDYxNSkgXAorCQlCSUdfKDB4MDY0QiwgMHgwNjVFKSBcCisJCVBBSVIoMHgwNjcwLCAweDA2NzApIFwKKwkJQklHXygweDA2RDYsIDB4MDZFNCkgXAorCQlQQUlSKDB4MDZFNywgMHgwNkU4KSBcCisJCVBBSVIoMHgwNkVBLCAweDA2RUQpIFwKKwkJUEFJUigweDA3MEYsIDB4MDcwRikgXAorCQlQQUlSKDB4MDcxMSwgMHgwNzExKSBcCisJCUJJR18oMHgwNzMwLCAweDA3NEEpIFwKKwkJQklHXygweDA3QTYsIDB4MDdCMCkgXAorCQlCSUdfKDB4MDdFQiwgMHgwN0YzKSBcCisJCVBBSVIoMHgwOTAxLCAweDA5MDIpIFwKKwkJUEFJUigweDA5M0MsIDB4MDkzQykgXAorCQlCSUdfKDB4MDk0MSwgMHgwOTQ4KSBcCisJCVBBSVIoMHgwOTRELCAweDA5NEQpIFwKKwkJUEFJUigweDA5NTEsIDB4MDk1NCkgXAorCQlQQUlSKDB4MDk2MiwgMHgwOTYzKSBcCisJCVBBSVIoMHgwOTgxLCAweDA5ODEpIFwKKwkJUEFJUigweDA5QkMsIDB4MDlCQykgXAorCQlQQUlSKDB4MDlDMSwgMHgwOUM0KSBcCisJCVBBSVIoMHgwOUNELCAweDA5Q0QpIFwKKwkJUEFJUigweDA5RTIsIDB4MDlFMykgXAorCQlQQUlSKDB4MEEwMSwgMHgwQTAyKSBcCisJCVBBSVIoMHgwQTNDLCAweDBBM0MpIFwKKwkJUEFJUigweDBBNDEsIDB4MEE0MikgXAorCQlQQUlSKDB4MEE0NywgMHgwQTQ4KSBcCisJCVBBSVIoMHgwQTRCLCAweDBBNEQpIFwKKwkJUEFJUigweDBBNzAsIDB4MEE3MSkgXAorCQlQQUlSKDB4MEE4MSwgMHgwQTgyKSBcCisJCVBBSVIoMHgwQUJDLCAweDBBQkMpIFwKKwkJQklHXygweDBBQzEsIDB4MEFDNSkgXAorCQlQQUlSKDB4MEFDNywgMHgwQUM4KSBcCisJCVBBSVIoMHgwQUNELCAweDBBQ0QpIFwKKwkJUEFJUigweDBBRTIsIDB4MEFFMykgXAorCQlQQUlSKDB4MEIwMSwgMHgwQjAxKSBcCisJCVBBSVIoMHgwQjNDLCAweDBCM0MpIFwKKwkJUEFJUigweDBCM0YsIDB4MEIzRikgXAorCQlQQUlSKDB4MEI0MSwgMHgwQjQzKSBcCisJCVBBSVIoMHgwQjRELCAweDBCNEQpIFwKKwkJUEFJUigweDBCNTYsIDB4MEI1NikgXAorCQlQQUlSKDB4MEI4MiwgMHgwQjgyKSBcCisJCVBBSVIoMHgwQkMwLCAweDBCQzApIFwKKwkJUEFJUigweDBCQ0QsIDB4MEJDRCkgXAorCQlQQUlSKDB4MEMzRSwgMHgwQzQwKSBcCisJCVBBSVIoMHgwQzQ2LCAweDBDNDgpIFwKKwkJUEFJUigweDBDNEEsIDB4MEM0RCkgXAorCQlQQUlSKDB4MEM1NSwgMHgwQzU2KSBcCisJCVBBSVIoMHgwQ0JDLCAweDBDQkMpIFwKKwkJUEFJUigweDBDQkYsIDB4MENCRikgXAorCQlQQUlSKDB4MENDNiwgMHgwQ0M2KSBcCisJCVBBSVIoMHgwQ0NDLCAweDBDQ0QpIFwKKwkJUEFJUigweDBDRTIsIDB4MENFMykgXAorCQlQQUlSKDB4MEQ0MSwgMHgwRDQzKSBcCisJCVBBSVIoMHgwRDRELCAweDBENEQpIFwKKwkJUEFJUigweDBEQ0EsIDB4MERDQSkgXAorCQlQQUlSKDB4MEREMiwgMHgwREQ0KSBcCisJCVBBSVIoMHgwREQ2LCAweDBERDYpIFwKKwkJUEFJUigweDBFMzEsIDB4MEUzMSkgXAorCQlCSUdfKDB4MEUzNCwgMHgwRTNBKSBcCisJCUJJR18oMHgwRTQ3LCAweDBFNEUpIFwKKwkJUEFJUigweDBFQjEsIDB4MEVCMSkgXAorCQlCSUdfKDB4MEVCNCwgMHgwRUI5KSBcCisJCVBBSVIoMHgwRUJCLCAweDBFQkMpIFwKKwkJQklHXygweDBFQzgsIDB4MEVDRCkgXAorCQlQQUlSKDB4MEYxOCwgMHgwRjE5KSBcCisJCVBBSVIoMHgwRjM1LCAweDBGMzUpIFwKKwkJUEFJUigweDBGMzcsIDB4MEYzNykgXAorCQlQQUlSKDB4MEYzOSwgMHgwRjM5KSBcCisJCUJJR18oMHgwRjcxLCAweDBGN0UpIFwKKwkJQklHXygweDBGODAsIDB4MEY4NCkgXAorCQlQQUlSKDB4MEY4NiwgMHgwRjg3KSBcCisJCVBBSVIoMHgwRkM2LCAweDBGQzYpIFwKKwkJQklHXygweDBGOTAsIDB4MEY5NykgXAorCQlCSUdfKDB4MEY5OSwgMHgwRkJDKSBcCisJCVBBSVIoMHgxMDJELCAweDEwMzApIFwKKwkJUEFJUigweDEwMzIsIDB4MTAzMikgXAorCQlQQUlSKDB4MTAzNiwgMHgxMDM3KSBcCisJCVBBSVIoMHgxMDM5LCAweDEwMzkpIFwKKwkJUEFJUigweDEwNTgsIDB4MTA1OSkgXAorCQlCSUdfKDB4MTE2MCwgMHgxMUZGKSBcCisJCVBBSVIoMHgxMzVGLCAweDEzNUYpIFwKKwkJUEFJUigweDE3MTIsIDB4MTcxNCkgXAorCQlQQUlSKDB4MTczMiwgMHgxNzM0KSBcCisJCVBBSVIoMHgxNzUyLCAweDE3NTMpIFwKKwkJUEFJUigweDE3NzIsIDB4MTc3MykgXAorCQlQQUlSKDB4MTdCNCwgMHgxN0I1KSBcCisJCUJJR18oMHgxN0I3LCAweDE3QkQpIFwKKwkJUEFJUigweDE3QzYsIDB4MTdDNikgXAorCQlCSUdfKDB4MTdDOSwgMHgxN0QzKSBcCisJCVBBSVIoMHgxN0RELCAweDE3REQpIFwKKwkJUEFJUigweDE4MEIsIDB4MTgwRCkgXAorCQlQQUlSKDB4MThBOSwgMHgxOEE5KSBcCisJCVBBSVIoMHgxOTIwLCAweDE5MjIpIFwKKwkJUEFJUigweDE5MjcsIDB4MTkyOCkgXAorCQlQQUlSKDB4MTkzMiwgMHgxOTMyKSBcCisJCVBBSVIoMHgxOTM5LCAweDE5M0IpIFwKKwkJUEFJUigweDFBMTcsIDB4MUExOCkgXAorCQlQQUlSKDB4MUIwMCwgMHgxQjAzKSBcCisJCVBBSVIoMHgxQjM0LCAweDFCMzQpIFwKKwkJQklHXygweDFCMzYsIDB4MUIzQSkgXAorCQlQQUlSKDB4MUIzQywgMHgxQjNDKSBcCisJCVBBSVIoMHgxQjQyLCAweDFCNDIpIFwKKwkJQklHXygweDFCNkIsIDB4MUI3MykgXAorCQlCSUdfKDB4MURDMCwgMHgxRENBKSBcCisJCVBBSVIoMHgxREZFLCAweDFERkYpIFwKKwkJQklHXygweDIwMEIsIDB4MjAwRikgXAorCQlCSUdfKDB4MjAyQSwgMHgyMDJFKSBcCisJCVBBSVIoMHgyMDYwLCAweDIwNjMpIFwKKwkJQklHXygweDIwNkEsIDB4MjA2RikgXAorCQlCSUdfKDB4MjBEMCwgMHgyMEVGKSBcCisJCUJJR18oMHgzMDJBLCAweDMwMkYpIFwKKwkJUEFJUigweDMwOTksIDB4MzA5QSkgXAorCQkvKiBUb28gYmlnIHRvIGJlIHBhY2tlZCBpbiBQQUlSczogKi8gXAorCQlCSUdfKDB4QTgwNiwgMHhBODA2KSBcCisJCUJJR18oMHhBODBCLCAweEE4MEIpIFwKKwkJQklHXygweEE4MjUsIDB4QTgyNikgXAorCQlCSUdfKDB4RkIxRSwgMHhGQjFFKSBcCisJCUJJR18oMHhGRTAwLCAweEZFMEYpIFwKKwkJQklHXygweEZFMjAsIDB4RkUyMykgXAorCQlCSUdfKDB4RkVGRiwgMHhGRUZGKSBcCisJCUJJR18oMHhGRkY5LCAweEZGRkIpCisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCBjb21iaW5pbmdbXSA9IHsgQVJSQVkgfTsKKyMgIHVuZGVmIEJJR18KKyMgIHVuZGVmIFBBSVIKKyMgIGRlZmluZSBCSUdfKGEsYikKKyMgIGRlZmluZSBQQUlSKGEsYikgKGEgPDwgMikgfCAoYi1hKSwKKwlzdGF0aWMgY29uc3QgdWludDE2X3QgY29tYmluaW5nMVtdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKSBjaGFyIGJpZ18jI2FbYiA8IDB4NDAwMCAmJiBiLWEgPD0gMyA/IC0xIDogMV07CisjICBkZWZpbmUgUEFJUihhLGIpIGNoYXIgcGFpciMjYVtiID49IDB4NDAwMCB8fCBiLWEgPiAzID8gLTEgOiAxXTsKKwlzdHJ1Y3QgQ0hFQ0sgeyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgdW5kZWYgQVJSQVkKKyMgZW5kaWYKKworCWlmICh1Y3MgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBUZXN0IGZvciA4LWJpdCBjb250cm9sIGNoYXJhY3RlcnMgKDAwLTFmLCA4MC05ZiwgN2YpICovCisJaWYgKCh1Y3MgJiB+MHg4MCkgPCAweDIwIHx8IHVjcyA9PSAweDdmKQorCQlyZXR1cm4gLTE7CisJLyogUXVpY2sgYWJvcnQgaWYgaXQgaXMgYW4gb2J2aW91c2x5IGludmFsaWQgY2hhciAqLworCWlmICh1Y3MgPiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIpCisJCXJldHVybiAtMTsKKworCS8qIE9wdGltaXphdGlvbjogbm8gY29tYmluaW5nIGNoYXJzIGJlbG93IDB4MzAwICovCisJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDB4MzAwIHx8IHVjcyA8IDB4MzAwKQorCQlyZXR1cm4gMTsKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgzMDAKKwkvKiBCaW5hcnkgc2VhcmNoIGluIHRhYmxlIG9mIG5vbi1zcGFjaW5nIGNoYXJhY3RlcnMgKi8KKwlpZiAoaW5faW50ZXJ2YWxfdGFibGUodWNzLCBjb21iaW5pbmcsIEFSUkFZX1NJWkUoY29tYmluaW5nKSAtIDEpKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5fdWludDE2X3RhYmxlKHVjcywgY29tYmluaW5nMSwgQVJSQVlfU0laRShjb21iaW5pbmcxKSAtIDEpKQorCQlyZXR1cm4gMDsKKworCS8qIE9wdGltaXphdGlvbjogYWxsIGNoYXJzIGJlbG93IDB4MTEwMCBhcmUgbm90IGRvdWJsZS13aWR0aCAqLworCWlmIChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPCAweDExMDAgfHwgdWNzIDwgMHgxMTAwKQorCQlyZXR1cm4gMTsKKworIyAgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4MTEwMAorCS8qIEludmFsaWQgY29kZSBwb2ludHM6ICovCisJLyogSGlnaCAoZDgwMC4uZGJmZikgYW5kIGxvdyAoZGMwMC4uZGZmZikgc3Vycm9nYXRlcyAodmFsaWQgb25seSBpbiBVVEYxNikgKi8KKwkvKiBQcml2YXRlIFVzZSBBcmVhIChlMDAwLi5mOGZmKSAqLworCS8qIE5vbmNoYXJhY3RlcnMgZmRkMC4uZmRlZiAqLworCWlmICgoQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4ZDgwMCAmJiB1Y3MgPj0gMHhkODAwICYmIHVjcyA8PSAweGY4ZmYpCisJIHx8IChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHhmZGQwICYmIHVjcyA+PSAweGZkZDAgJiYgdWNzIDw9IDB4ZmRlZikKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiAweGZmZmUgYW5kIDB4ZmZmZiBpbiBldmVyeSBwbGFuZSBhcmUgaW52YWxpZCAqLworCWlmIChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHhmZmZlICYmICgodWNzICYgMHhmZmZlKSA9PSAweGZmZmUpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKyMgICBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgxMDAwMAorCWlmICh1Y3MgPj0gMHgxMDAwMCkgeworCQkvKiBDb21iaW5pbmcgY2hhcnMgaW4gU3VwcGxlbWVudGFyeSBNdWx0aWxpbmd1YWwgUGxhbmUgMHgxeHh4eCAqLworCQlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIGNvbWJpbmluZzB4MTAwMDBbXSA9IHsKKwkJCXsgMHgwQTAxLCAweDBBMDMgfSwgeyAweDBBMDUsIDB4MEEwNiB9LCB7IDB4MEEwQywgMHgwQTBGIH0sCisJCQl7IDB4MEEzOCwgMHgwQTNBIH0sIHsgMHgwQTNGLCAweDBBM0YgfSwgeyAweEQxNjcsIDB4RDE2OSB9LAorCQkJeyAweEQxNzMsIDB4RDE4MiB9LCB7IDB4RDE4NSwgMHhEMThCIH0sIHsgMHhEMUFBLCAweEQxQUQgfSwKKwkJCXsgMHhEMjQyLCAweEQyNDQgfQorCQl9OworCQkvKiBCaW5hcnkgc2VhcmNoIGluIHRhYmxlIG9mIG5vbi1zcGFjaW5nIGNoYXJhY3RlcnMgaW4gU3VwcGxlbWVudGFyeSBNdWx0aWxpbmd1YWwgUGxhbmUgKi8KKwkJaWYgKGluX2ludGVydmFsX3RhYmxlKHVjcyBeIDB4MTAwMDAsIGNvbWJpbmluZzB4MTAwMDAsIEFSUkFZX1NJWkUoY29tYmluaW5nMHgxMDAwMCkgLSAxKSkKKwkJCXJldHVybiAwOworCQkvKiBDaGVjayBhIGZldyBub24tc3BhY2luZyBjaGFycyBpbiBTdXBwbGVtZW50YXJ5IFNwZWNpYWwtcHVycG9zZSBQbGFuZSAweEV4eHh4ICovCisJCWlmIChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHhFMDAwMQorCQkgJiYgKCAgdWNzID09IDB4RTAwMDEKKwkJICAgIHx8ICh1Y3MgPj0gMHhFMDAyMCAmJiB1Y3MgPD0gMHhFMDA3RikKKwkJICAgIHx8ICh1Y3MgPj0gMHhFMDEwMCAmJiB1Y3MgPD0gMHhFMDFFRikKKwkJICAgICkKKwkJKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyMgICBlbmRpZgorCisJLyogSWYgd2UgYXJyaXZlIGhlcmUsIHVjcyBpcyBub3QgYSBjb21iaW5pbmcgb3IgQzAvQzEgY29udHJvbCBjaGFyYWN0ZXIuCisJICogQ2hlY2sgd2hldGhlciBpdCdzIDEgY2hhciBvciAyLXNoYXIgd2lkZS4KKwkgKi8KKwlyZXR1cm4gMSArCisJCSggICgvKnVjcyA+PSAweDExMDAgJiYqLyB1Y3MgPD0gMHgxMTVmKSAvKiBIYW5ndWwgSmFtbyBpbml0LiBjb25zb25hbnRzICovCisJCXx8IHVjcyA9PSAweDIzMjkgLyogbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0OyBhbHNvIENKSyBwdW5jdC4gY2hhciAqLworCQl8fCB1Y3MgPT0gMHgyMzJhIC8qIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQ7IGFsc28gQ0pLIHB1bmN0LiBjaGFyICovCisJCXx8ICh1Y3MgPj0gMHgyZTgwICYmIHVjcyA8PSAweGE0Y2YgJiYgdWNzICE9IDB4MzAzZikgLyogQ0pLIC4uLiBZaSAqLworIyAgIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweGFjMDAKKwkJfHwgKHVjcyA+PSAweGFjMDAgJiYgdWNzIDw9IDB4ZDdhMykgLyogSGFuZ3VsIFN5bGxhYmxlcyAqLworCQl8fCAodWNzID49IDB4ZjkwMCAmJiB1Y3MgPD0gMHhmYWZmKSAvKiBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzICovCisJCXx8ICh1Y3MgPj0gMHhmZTEwICYmIHVjcyA8PSAweGZlMTkpIC8qIFZlcnRpY2FsIGZvcm1zICovCisJCXx8ICh1Y3MgPj0gMHhmZTMwICYmIHVjcyA8PSAweGZlNmYpIC8qIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisJCXx8ICh1Y3MgPj0gMHhmZjAwICYmIHVjcyA8PSAweGZmNjApIC8qIEZ1bGx3aWR0aCBGb3JtcyAqLworCQl8fCAodWNzID49IDB4ZmZlMCAmJiB1Y3MgPD0gMHhmZmU2KQorCQl8fCAoKHVjcyA+PiAxNykgPT0gKDIgPj4gMSkpIC8qIDIwMDAwLi4zZmZmZjogU3VwcGxlbWVudGFyeSBhbmQgVGVydGlhcnkgSWRlb2dyYXBoaWMgUGxhbmVzICovCisjICAgZW5kaWYKKwkJKTsKKyMgIGVuZGlmIC8qID49IDB4MTEwMCAqLworIyBlbmRpZiAvKiA+PSAweDMwMCAqLworfQorCisKKyMgaWYgRU5BQkxFX1VOSUNPREVfQklESV9TVVBQT1JUCitpbnQgRkFTVF9GVU5DIHVuaWNvZGVfYmlkaV9pc3J0bCh3aW50X3Qgd2MpCit7CisJLyogcmFuZ2VzIHRha2VuIGZyb20KKwkgKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy81LjIuMC91Y2QvZXh0cmFjdGVkL0Rlcml2ZWRCaWRpQ2xhc3MudHh0CisJICogQmlkaV9DbGFzcz1MZWZ0X1RvX1JpZ2h0IHwgQmlkaV9DbGFzcz1BcmFiaWNfTGV0dGVyCisJICovCisjICBkZWZpbmUgQklHXyhhLGIpIHsgYSwgYiB9LAorIyAgZGVmaW5lIFBBSVIoYSxiKQorIyAgZGVmaW5lIEFSUkFZIFwKKwkJUEFJUigweDA1OTAsIDB4MDU5MCkgXAorCQlQQUlSKDB4MDVCRSwgMHgwNUJFKSBcCisJCVBBSVIoMHgwNUMwLCAweDA1QzApIFwKKwkJUEFJUigweDA1QzMsIDB4MDVDMykgXAorCQlQQUlSKDB4MDVDNiwgMHgwNUM2KSBcCisJCUJJR18oMHgwNUM4LCAweDA1RkYpIFwKKwkJUEFJUigweDA2MDQsIDB4MDYwNSkgXAorCQlQQUlSKDB4MDYwOCwgMHgwNjA4KSBcCisJCVBBSVIoMHgwNjBCLCAweDA2MEIpIFwKKwkJUEFJUigweDA2MEQsIDB4MDYwRCkgXAorCQlCSUdfKDB4MDYxQiwgMHgwNjRBKSBcCisJCVBBSVIoMHgwNjVGLCAweDA2NUYpIFwKKwkJUEFJUigweDA2NkQsIDB4MDY2RikgXAorCQlCSUdfKDB4MDY3MSwgMHgwNkQ1KSBcCisJCVBBSVIoMHgwNkU1LCAweDA2RTYpIFwKKwkJUEFJUigweDA2RUUsIDB4MDZFRikgXAorCQlCSUdfKDB4MDZGQSwgMHgwNzBFKSBcCisJCVBBSVIoMHgwNzEwLCAweDA3MTApIFwKKwkJQklHXygweDA3MTIsIDB4MDcyRikgXAorCQlCSUdfKDB4MDc0QiwgMHgwN0E1KSBcCisJCUJJR18oMHgwN0IxLCAweDA3RUEpIFwKKwkJUEFJUigweDA3RjQsIDB4MDdGNSkgXAorCQlCSUdfKDB4MDdGQSwgMHgwODE1KSBcCisJCVBBSVIoMHgwODFBLCAweDA4MUEpIFwKKwkJUEFJUigweDA4MjQsIDB4MDgyNCkgXAorCQlQQUlSKDB4MDgyOCwgMHgwODI4KSBcCisJCUJJR18oMHgwODJFLCAweDA4RkYpIFwKKwkJUEFJUigweDIwMEYsIDB4MjAwRikgXAorCQlQQUlSKDB4MjAyQiwgMHgyMDJCKSBcCisJCVBBSVIoMHgyMDJFLCAweDIwMkUpIFwKKwkJQklHXygweEZCMUQsIDB4RkIxRCkgXAorCQlCSUdfKDB4RkIxRiwgMHhGQjI4KSBcCisJCUJJR18oMHhGQjJBLCAweEZEM0QpIFwKKwkJQklHXygweEZENDAsIDB4RkRDRikgXAorCQlCSUdfKDB4RkRDOCwgMHhGRENGKSBcCisJCUJJR18oMHhGREYwLCAweEZERkMpIFwKKwkJQklHXygweEZERkUsIDB4RkRGRikgXAorCQlCSUdfKDB4RkU3MCwgMHhGRUZFKQorCQkvKiBQcm9iYWJseSBub3QgbmVjZXNzYXJ5CisJCXsweDEwODAwLCAweDEwOTFFfSwKKwkJezB4MTA5MjAsIDB4MTBBMDB9LAorCQl7MHgxMEEwNCwgMHgxMEEwNH0sCisJCXsweDEwQTA3LCAweDEwQTBCfSwKKwkJezB4MTBBMTAsIDB4MTBBMzd9LAorCQl7MHgxMEEzQiwgMHgxMEEzRX0sCisJCXsweDEwQTQwLCAweDEwQTdGfSwKKwkJezB4MTBCMzYsIDB4MTBCMzh9LAorCQl7MHgxMEI0MCwgMHgxMEU1Rn0sCisJCXsweDEwRTdGLCAweDEwRkZGfSwKKwkJezB4MUU4MDAsIDB4MUVGRkZ9CisJCSovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCBydGxfYltdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKQorIyAgZGVmaW5lIFBBSVIoYSxiKSAoYSA8PCAyKSB8IChiLWEpLAorCXN0YXRpYyBjb25zdCB1aW50MTZfdCBydGxfcFtdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKSBjaGFyIGJpZ18jI2FbYiA8IDB4NDAwMCAmJiBiLWEgPD0gMyA/IC0xIDogMV07CisjICBkZWZpbmUgUEFJUihhLGIpIGNoYXIgcGFpciMjYVtiID49IDB4NDAwMCB8fCBiLWEgPiAzID8gLTEgOiAxXTsKKwlzdHJ1Y3QgQ0hFQ0sgeyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgdW5kZWYgQVJSQVkKKworCWlmIChpbl9pbnRlcnZhbF90YWJsZSh3YywgcnRsX2IsIEFSUkFZX1NJWkUocnRsX2IpIC0gMSkpCisJCXJldHVybiAxOworCWlmIChpbl91aW50MTZfdGFibGUod2MsIHJ0bF9wLCBBUlJBWV9TSVpFKHJ0bF9wKSAtIDEpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworIyAgaWYgRU5BQkxFX1VOSUNPREVfTkVVVFJBTF9UQUJMRQoraW50IEZBU1RfRlVOQyB1bmljb2RlX2JpZGlfaXNfbmV1dHJhbF93Y2hhcih3aW50X3Qgd2MpCit7CisJLyogcmFuZ2VzIHRha2VuIGZyb20KKwkgKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy81LjIuMC91Y2QvZXh0cmFjdGVkL0Rlcml2ZWRCaWRpQ2xhc3MudHh0CisJICogQmlkaV9DbGFzc2VzOiBQYXJhZ3JhcGhfU2VwYXJhdG9yLCBTZWdtZW50X1NlcGFyYXRvciwKKwkgKiBXaGl0ZV9TcGFjZSwgT3RoZXJfTmV1dHJhbCwgRXVyb3BlYW5fTnVtYmVyLCBFdXJvcGVhbl9TZXBhcmF0b3IsCisJICogRXVyb3BlYW5fVGVybWluYXRvciwgQXJhYmljX051bWJlciwgQ29tbW9uX1NlcGFyYXRvcgorCSAqLworIyAgZGVmaW5lIEJJR18oYSxiKSB7IGEsIGIgfSwKKyMgIGRlZmluZSBQQUlSKGEsYikKKyMgIGRlZmluZSBBUlJBWSBcCisJCUJJR18oMHgwMDA5LCAweDAwMEQpIFwKKwkJQklHXygweDAwMUMsIDB4MDA0MCkgXAorCQlCSUdfKDB4MDA1QiwgMHgwMDYwKSBcCisJCVBBSVIoMHgwMDdCLCAweDAwN0UpIFwKKwkJUEFJUigweDAwODUsIDB4MDA4NSkgXAorCQlCSUdfKDB4MDBBMCwgMHgwMEE5KSBcCisJCVBBSVIoMHgwMEFCLCAweDAwQUMpIFwKKwkJQklHXygweDAwQUUsIDB4MDBCNCkgXAorCQlQQUlSKDB4MDBCNiwgMHgwMEI5KSBcCisJCUJJR18oMHgwMEJCLCAweDAwQkYpIFwKKwkJUEFJUigweDAwRDcsIDB4MDBENykgXAorCQlQQUlSKDB4MDBGNywgMHgwMEY3KSBcCisJCVBBSVIoMHgwMkI5LCAweDAyQkEpIFwKKwkJQklHXygweDAyQzIsIDB4MDJDRikgXAorCQlCSUdfKDB4MDJEMiwgMHgwMkRGKSBcCisJCUJJR18oMHgwMkU1LCAweDAyRkYpIFwKKwkJUEFJUigweDAzNzQsIDB4MDM3NSkgXAorCQlQQUlSKDB4MDM3RSwgMHgwMzdFKSBcCisJCVBBSVIoMHgwMzg0LCAweDAzODUpIFwKKwkJUEFJUigweDAzODcsIDB4MDM4NykgXAorCQlQQUlSKDB4MDNGNiwgMHgwM0Y2KSBcCisJCVBBSVIoMHgwNThBLCAweDA1OEEpIFwKKwkJUEFJUigweDA2MDAsIDB4MDYwMykgXAorCQlQQUlSKDB4MDYwNiwgMHgwNjA3KSBcCisJCVBBSVIoMHgwNjA5LCAweDA2MEEpIFwKKwkJUEFJUigweDA2MEMsIDB4MDYwQykgXAorCQlQQUlSKDB4MDYwRSwgMHgwNjBGKSBcCisJCUJJR18oMHgwNjYwLCAweDA2NkMpIFwKKwkJUEFJUigweDA2REQsIDB4MDZERCkgXAorCQlQQUlSKDB4MDZFOSwgMHgwNkU5KSBcCisJCUJJR18oMHgwNkYwLCAweDA2RjkpIFwKKwkJUEFJUigweDA3RjYsIDB4MDdGOSkgXAorCQlQQUlSKDB4MDlGMiwgMHgwOUYzKSBcCisJCVBBSVIoMHgwOUZCLCAweDA5RkIpIFwKKwkJUEFJUigweDBBRjEsIDB4MEFGMSkgXAorCQlCSUdfKDB4MEJGMywgMHgwQkZBKSBcCisJCUJJR18oMHgwQzc4LCAweDBDN0UpIFwKKwkJUEFJUigweDBDRjEsIDB4MENGMikgXAorCQlQQUlSKDB4MEUzRiwgMHgwRTNGKSBcCisJCVBBSVIoMHgwRjNBLCAweDBGM0QpIFwKKwkJQklHXygweDEzOTAsIDB4MTQwMCkgXAorCQlQQUlSKDB4MTY4MCwgMHgxNjgwKSBcCisJCVBBSVIoMHgxNjlCLCAweDE2OUMpIFwKKwkJUEFJUigweDE3REIsIDB4MTdEQikgXAorCQlCSUdfKDB4MTdGMCwgMHgxN0Y5KSBcCisJCUJJR18oMHgxODAwLCAweDE4MEEpIFwKKwkJUEFJUigweDE4MEUsIDB4MTgwRSkgXAorCQlQQUlSKDB4MTk0MCwgMHgxOTQwKSBcCisJCVBBSVIoMHgxOTQ0LCAweDE5NDUpIFwKKwkJQklHXygweDE5REUsIDB4MTlGRikgXAorCQlQQUlSKDB4MUZCRCwgMHgxRkJEKSBcCisJCVBBSVIoMHgxRkJGLCAweDFGQzEpIFwKKwkJUEFJUigweDFGQ0QsIDB4MUZDRikgXAorCQlQQUlSKDB4MUZERCwgMHgxRkRGKSBcCisJCVBBSVIoMHgxRkVELCAweDFGRUYpIFwKKwkJUEFJUigweDFGRkQsIDB4MUZGRSkgXAorCQlCSUdfKDB4MjAwMCwgMHgyMDBBKSBcCisJCUJJR18oMHgyMDEwLCAweDIwMjkpIFwKKwkJQklHXygweDIwMkYsIDB4MjA1RikgXAorCQlQQUlSKDB4MjA3MCwgMHgyMDcwKSBcCisJCUJJR18oMHgyMDc0LCAweDIwN0UpIFwKKwkJQklHXygweDIwODAsIDB4MjA4RSkgXAorCQlCSUdfKDB4MjBBMCwgMHgyMEI4KSBcCisJCVBBSVIoMHgyMTAwLCAweDIxMDEpIFwKKwkJUEFJUigweDIxMDMsIDB4MjEwNikgXAorCQlQQUlSKDB4MjEwOCwgMHgyMTA5KSBcCisJCVBBSVIoMHgyMTE0LCAweDIxMTQpIFwKKwkJUEFJUigweDIxMTYsIDB4MjExOCkgXAorCQlCSUdfKDB4MjExRSwgMHgyMTIzKSBcCisJCVBBSVIoMHgyMTI1LCAweDIxMjUpIFwKKwkJUEFJUigweDIxMjcsIDB4MjEyNykgXAorCQlQQUlSKDB4MjEyOSwgMHgyMTI5KSBcCisJCVBBSVIoMHgyMTJFLCAweDIxMkUpIFwKKwkJUEFJUigweDIxM0EsIDB4MjEzQikgXAorCQlCSUdfKDB4MjE0MCwgMHgyMTQ0KSBcCisJCVBBSVIoMHgyMTRBLCAweDIxNEQpIFwKKwkJQklHXygweDIxNTAsIDB4MjE1RikgXAorCQlQQUlSKDB4MjE4OSwgMHgyMTg5KSBcCisJCUJJR18oMHgyMTkwLCAweDIzMzUpIFwKKwkJQklHXygweDIzN0IsIDB4MjM5NCkgXAorCQlCSUdfKDB4MjM5NiwgMHgyM0U4KSBcCisJCUJJR18oMHgyNDAwLCAweDI0MjYpIFwKKwkJQklHXygweDI0NDAsIDB4MjQ0QSkgXAorCQlCSUdfKDB4MjQ2MCwgMHgyNDlCKSBcCisJCUJJR18oMHgyNEVBLCAweDI2QUIpIFwKKwkJQklHXygweDI2QUQsIDB4MjZDRCkgXAorCQlCSUdfKDB4MjZDRiwgMHgyNkUxKSBcCisJCVBBSVIoMHgyNkUzLCAweDI2RTMpIFwKKwkJQklHXygweDI2RTgsIDB4MjZGRikgXAorCQlQQUlSKDB4MjcwMSwgMHgyNzA0KSBcCisJCVBBSVIoMHgyNzA2LCAweDI3MDkpIFwKKwkJQklHXygweDI3MEMsIDB4MjcyNykgXAorCQlCSUdfKDB4MjcyOSwgMHgyNzRCKSBcCisJCVBBSVIoMHgyNzRELCAweDI3NEQpIFwKKwkJUEFJUigweDI3NEYsIDB4Mjc1MikgXAorCQlCSUdfKDB4Mjc1NiwgMHgyNzVFKSBcCisJCUJJR18oMHgyNzYxLCAweDI3OTQpIFwKKwkJQklHXygweDI3OTgsIDB4MjdBRikgXAorCQlCSUdfKDB4MjdCMSwgMHgyN0JFKSBcCisJCUJJR18oMHgyN0MwLCAweDI3Q0EpIFwKKwkJUEFJUigweDI3Q0MsIDB4MjdDQykgXAorCQlCSUdfKDB4MjdEMCwgMHgyN0ZGKSBcCisJCUJJR18oMHgyOTAwLCAweDJCNEMpIFwKKwkJQklHXygweDJCNTAsIDB4MkI1OSkgXAorCQlCSUdfKDB4MkNFNSwgMHgyQ0VBKSBcCisJCUJJR18oMHgyQ0Y5LCAweDJDRkYpIFwKKwkJQklHXygweDJFMDAsIDB4MkU5OSkgXAorCQlCSUdfKDB4MkU5QiwgMHgyRUYzKSBcCisJCUJJR18oMHgyRjAwLCAweDJGRDUpIFwKKwkJQklHXygweDJGRjAsIDB4MkZGQikgXAorCQlCSUdfKDB4MzAwMCwgMHgzMDA0KSBcCisJCUJJR18oMHgzMDA4LCAweDMwMjApIFwKKwkJUEFJUigweDMwMzAsIDB4MzAzMCkgXAorCQlQQUlSKDB4MzAzNiwgMHgzMDM3KSBcCisJCVBBSVIoMHgzMDNELCAweDMwM0QpIFwKKwkJUEFJUigweDMwM0UsIDB4MzAzRikgXAorCQlQQUlSKDB4MzA5QiwgMHgzMDlDKSBcCisJCVBBSVIoMHgzMEEwLCAweDMwQTApIFwKKwkJUEFJUigweDMwRkIsIDB4MzBGQikgXAorCQlCSUdfKDB4MzFDMCwgMHgzMUUzKSBcCisJCVBBSVIoMHgzMjFELCAweDMyMUUpIFwKKwkJQklHXygweDMyNTAsIDB4MzI1RikgXAorCQlQQUlSKDB4MzI3QywgMHgzMjdFKSBcCisJCUJJR18oMHgzMkIxLCAweDMyQkYpIFwKKwkJUEFJUigweDMyQ0MsIDB4MzJDRikgXAorCQlQQUlSKDB4MzM3NywgMHgzMzdBKSBcCisJCVBBSVIoMHgzM0RFLCAweDMzREYpIFwKKwkJUEFJUigweDMzRkYsIDB4MzNGRikgXAorCQlCSUdfKDB4NERDMCwgMHg0REZGKSBcCisJCUJJR18oMHhBNDkwLCAweEE0QzYpIFwKKwkJQklHXygweEE2MEQsIDB4QTYwRikgXAorCQlCSUdfKDB4QTY3MywgMHhBNjczKSBcCisJCUJJR18oMHhBNjdFLCAweEE2N0YpIFwKKwkJQklHXygweEE3MDAsIDB4QTcyMSkgXAorCQlCSUdfKDB4QTc4OCwgMHhBNzg4KSBcCisJCUJJR18oMHhBODI4LCAweEE4MkIpIFwKKwkJQklHXygweEE4MzgsIDB4QTgzOSkgXAorCQlCSUdfKDB4QTg3NCwgMHhBODc3KSBcCisJCUJJR18oMHhGQjI5LCAweEZCMjkpIFwKKwkJQklHXygweEZEM0UsIDB4RkQzRikgXAorCQlCSUdfKDB4RkRGRCwgMHhGREZEKSBcCisJCUJJR18oMHhGRTEwLCAweEZFMTkpIFwKKwkJQklHXygweEZFMzAsIDB4RkU1MikgXAorCQlCSUdfKDB4RkU1NCwgMHhGRTY2KSBcCisJCUJJR18oMHhGRTY4LCAweEZFNkIpIFwKKwkJQklHXygweEZGMDEsIDB4RkYyMCkgXAorCQlCSUdfKDB4RkYzQiwgMHhGRjQwKSBcCisJCUJJR18oMHhGRjVCLCAweEZGNjUpIFwKKwkJQklHXygweEZGRTAsIDB4RkZFNikgXAorCQlCSUdfKDB4RkZFOCwgMHhGRkVFKSBcCisJCUJJR18oMHhGRkY5LCAweEZGRkQpCisJCS8qCisJCXsweDEwMTAxLCAweDEwMTAxfSwKKwkJezB4MTAxNDAsIDB4MTAxOUJ9LAorCQl7MHgxMDkxRiwgMHgxMDkxRn0sCisJCXsweDEwQjM5LCAweDEwQjNGfSwKKwkJezB4MTBFNjAsIDB4MTBFN0V9LAorCQl7MHgxRDIwMCwgMHgxRDI0MX0sCisJCXsweDFEMjQ1LCAweDFEMjQ1fSwKKwkJezB4MUQzMDAsIDB4MUQzNTZ9LAorCQl7MHgxRDZEQiwgMHgxRDZEQn0sCisJCXsweDFENzE1LCAweDFENzE1fSwKKwkJezB4MUQ3NEYsIDB4MUQ3NEZ9LAorCQl7MHgxRDc4OSwgMHgxRDc4OX0sCisJCXsweDFEN0MzLCAweDFEN0MzfSwKKwkJezB4MUQ3Q0UsIDB4MUQ3RkZ9LAorCQl7MHgxRjAwMCwgMHgxRjAyQn0sCisJCXsweDFGMDMwLCAweDFGMDkzfSwKKwkJezB4MUYxMDAsIDB4MUYxMEF9CisJCSovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCBuZXV0cmFsX2JbXSA9IHsgQVJSQVkgfTsKKyMgIHVuZGVmIEJJR18KKyMgIHVuZGVmIFBBSVIKKyMgIGRlZmluZSBCSUdfKGEsYikKKyMgIGRlZmluZSBQQUlSKGEsYikgKGEgPDwgMikgfCAoYi1hKSwKKwlzdGF0aWMgY29uc3QgdWludDE2X3QgbmV1dHJhbF9wW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpIGNoYXIgYmlnXyMjYVtiIDwgMHg0MDAwICYmIGItYSA8PSAzID8gLTEgOiAxXTsKKyMgIGRlZmluZSBQQUlSKGEsYikgY2hhciBwYWlyIyNhW2IgPj0gMHg0MDAwIHx8IGItYSA+IDMgPyAtMSA6IDFdOworCXN0cnVjdCBDSEVDSyB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICB1bmRlZiBBUlJBWQorCisJaWYgKGluX2ludGVydmFsX3RhYmxlKHdjLCBuZXV0cmFsX2IsIEFSUkFZX1NJWkUobmV1dHJhbF9iKSAtIDEpKQorCQlyZXR1cm4gMTsKKwlpZiAoaW5fdWludDE2X3RhYmxlKHdjLCBuZXV0cmFsX3AsIEFSUkFZX1NJWkUobmV1dHJhbF9wKSAtIDEpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKyMgIGVuZGlmCisKKyMgZW5kaWYgLyogVU5JQ09ERV9CSURJX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIEhvbWVncm93biBVbmljb2RlIHN1cHBvcnQgKi8KKworCisvKiBUaGUgcmVzdCBpcyBtb3N0bHkgc2FtZSBmb3IgbGliYyBhbmQgZm9yICJob21lZ3Jvd24iIHN1cHBvcnQgKi8KKworI2lmIDAgLy8gVU5VU0VECitzaXplX3QgRkFTVF9GVU5DIHVuaWNvZGVfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlzaXplX3Qgd2lkdGggPSBtYnN0b3djcyhOVUxMLCBzdHJpbmcsIElOVF9NQVgpOworCWlmICh3aWR0aCA9PSAoc2l6ZV90KS0xTCkKKwkJcmV0dXJuIHN0cmxlbihzdHJpbmcpOworCXJldHVybiB3aWR0aDsKK30KKyNlbmRpZgorCitzaXplX3QgRkFTVF9GVU5DIHVuaWNvZGVfc3Ryd2lkdGgoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXVuaV9zdGF0X3QgdW5pX3N0YXQ7CisJcHJpbnRhYmxlX3N0cmluZygmdW5pX3N0YXQsIHN0cmluZyk7CisJcmV0dXJuIHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7Cit9CisKK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZTIodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgd2lkdGgsIGludCBmbGFncykKK3sKKwljaGFyICpkc3Q7CisJdW5zaWduZWQgZHN0X2xlbjsKKwl1bnNpZ25lZCB1bmlfY291bnQ7CisJdW5zaWduZWQgdW5pX3dpZHRoOworCisJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04pIHsKKwkJY2hhciAqZDsKKwkJaWYgKGZsYWdzICYgVU5JX0ZMQUdfUEFEKSB7CisJCQlkID0gZHN0ID0geG1hbGxvYyh3aWR0aCArIDEpOworCQkJd2hpbGUgKChpbnQpLS13aWR0aCA+PSAwKSB7CisJCQkJdW5zaWduZWQgY2hhciBjID0gKnNyYzsKKwkJCQlpZiAoYyA9PSAnXDAnKSB7CisJCQkJCWRvCisJCQkJCQkqZCsrID0gJyAnOworCQkJCQl3aGlsZSAoKGludCktLXdpZHRoID49IDApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJKmQrKyA9IChjID49ICcgJyAmJiBjIDwgMHg3ZikgPyBjIDogJz8nOworCQkJCXNyYysrOworCQkJfQorCQkJKmQgPSAnXDAnOworCQl9IGVsc2UgeworCQkJZCA9IGRzdCA9IHhzdHJuZHVwKHNyYywgd2lkdGgpOworCQkJd2hpbGUgKCpkKSB7CisJCQkJdW5zaWduZWQgY2hhciBjID0gKmQ7CisJCQkJaWYgKGMgPCAnICcgfHwgYyA+PSAweDdmKQorCQkJCQkqZCA9ICc/JzsKKwkJCQlkKys7CisJCQl9CisJCX0KKwkJaWYgKHN0YXRzKSB7CisJCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChkIC0gZHN0KTsKKwkJCXN0YXRzLT51bmljb2RlX2NvdW50ID0gKGQgLSBkc3QpOworCQkJc3RhdHMtPnVuaWNvZGVfd2lkdGggPSAoZCAtIGRzdCk7CisJCX0KKwkJcmV0dXJuIGRzdDsKKwl9CisKKwlkc3QgPSBOVUxMOworCXVuaV9jb3VudCA9IHVuaV93aWR0aCA9IDA7CisJZHN0X2xlbiA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IHc7CisJCXdjaGFyX3Qgd2M7CisKKyNpZiBFTkFCTEVfVU5JQ09ERV9VU0lOR19MT0NBTEUKKwkJeworCQkJbWJzdGF0ZV90IG1ic3QgPSB7IDAgfTsKKwkJCXNzaXplX3QgcmMgPSBtYnNydG93Y3MoJndjLCAmc3JjLCAxLCAmbWJzdCk7CisJCQkvKiBJZiBpbnZhbGlkIHNlcXVlbmNlIGlzIHNlZW46IC0xIGlzIHJldHVybmVkLAorCQkJICogc3JjIHBvaW50cyB0byB0aGUgaW52YWxpZCBzZXF1ZW5jZSwgZXJybm8gPSBFSUxTRVEuCisJCQkgKiBFbHNlIG51bWJlciBvZiB3Y2hhcnMgKGV4Y2x1ZGluZyB0ZXJtaW5hdGluZyBMJ1wwJykKKwkJCSAqIHdyaXR0ZW4gdG8gZGVzdCBpcyByZXR1cm5lZC4KKwkJCSAqIElmIGxlbiAoaGVyZTogMSkgbm9uLUwnXDAnIHdjaGFycyBzdG9yZWQgYXQgZGVzdCwKKwkJCSAqIHNyYyBwb2ludHMgdG8gdGhlIG5leHQgY2hhciB0byBiZSBjb252ZXJ0ZWQuCisJCQkgKiBJZiBzdHJpbmcgaXMgY29tcGxldGVseSBjb252ZXJ0ZWQ6IHNyYyA9IE5VTEwuCisJCQkgKi8KKwkJCWlmIChyYyA9PSAwKSAvKiBlbmQtb2Ytc3RyaW5nICovCisJCQkJYnJlYWs7CisJCQlpZiAocmMgPCAwKSB7IC8qIGVycm9yICovCisJCQkJc3JjKys7CisJCQkJZ290byBzdWJzdDsKKwkJCX0KKwkJCWlmICghaXN3cHJpbnQod2MpKQorCQkJCWdvdG8gc3Vic3Q7CisJCX0KKyNlbHNlCisJCXNyYyA9IG1ic3Rvd2NfaW50ZXJuYWwoJndjLCBzcmMpOworCQkvKiBzcmMgaXMgYWR2YW5jZWQgdG8gbmV4dCBtYiBjaGFyCisJCSAqIHdjID09IEVSUk9SX1dDSEFSOiBpbnZhbGlkIHNlcXVlbmNlIGlzIHNlZW4KKwkJICogZWxzZTogd2MgaXMgc2V0CisJCSAqLworCQlpZiAod2MgPT0gRVJST1JfV0NIQVIpIC8qIGVycm9yICovCisJCQlnb3RvIHN1YnN0OworCQlpZiAod2MgPT0gMCkgLyogZW5kLW9mLXN0cmluZyAqLworCQkJYnJlYWs7CisjZW5kaWYKKwkJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiAmJiB3YyA+IENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUikKKwkJCWdvdG8gc3Vic3Q7CisJCXcgPSB3Y3dpZHRoKHdjKTsKKwkJaWYgKChFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTICYmIHcgPCAwKSAvKiBub24tcHJpbnRhYmxlIHdjaGFyICovCisJCSB8fCAoIUVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgJiYgdyA8PSAwKQorCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUyAmJiB3ID4gMSkKKwkJKSB7Cisgc3Vic3Q6CisJCQl3YyA9IENPTkZJR19TVUJTVF9XQ0hBUjsKKwkJCXcgPSAxOworCQl9CisJCXdpZHRoIC09IHc7CisJCS8qIE5vdGU6IGlmIHdpZHRoID09IDAsIHdlIHN0aWxsIG1heSBhZGQgbW9yZSBjaGFycywKKwkJICogdGhleSBtYXkgYmUgemVyby13aWR0aCBvciBjb21iaW5pbmcgb25lcyAqLworCQlpZiAoKGludCl3aWR0aCA8IDApIHsKKwkJCS8qIGNhbid0IGFkZCB0aGlzIHdjLCBzdHJpbmcgd291bGQgYmVjb21lIGxvbmdlciB0aGFuIHdpZHRoICovCisJCQl3aWR0aCArPSB3OworCQkJYnJlYWs7CisJCX0KKworCQl1bmlfY291bnQrKzsKKwkJdW5pX3dpZHRoICs9IHc7CisJCWRzdCA9IHhyZWFsbG9jKGRzdCwgZHN0X2xlbiArIE1CX0NVUl9NQVgpOworI2lmIEVOQUJMRV9VTklDT0RFX1VTSU5HX0xPQ0FMRQorCQl7CisJCQltYnN0YXRlX3QgbWJzdCA9IHsgMCB9OworCQkJZHN0X2xlbiArPSB3Y3J0b21iKCZkc3RbZHN0X2xlbl0sIHdjLCAmbWJzdCk7CisJCX0KKyNlbHNlCisJCWRzdF9sZW4gKz0gd2NydG9tYl9pbnRlcm5hbCgmZHN0W2RzdF9sZW5dLCB3Yyk7CisjZW5kaWYKKwl9CisKKwkvKiBQYWQgdG8gcmVtYWluaW5nIHdpZHRoICovCisJaWYgKGZsYWdzICYgVU5JX0ZMQUdfUEFEKSB7CisJCWRzdCA9IHhyZWFsbG9jKGRzdCwgZHN0X2xlbiArIHdpZHRoICsgMSk7CisJCXVuaV9jb3VudCArPSB3aWR0aDsKKwkJdW5pX3dpZHRoICs9IHdpZHRoOworCQl3aGlsZSAoKGludCktLXdpZHRoID49IDApIHsKKwkJCWRzdFtkc3RfbGVuKytdID0gJyAnOworCQl9CisJfQorCWRzdFtkc3RfbGVuXSA9ICdcMCc7CisJaWYgKHN0YXRzKSB7CisJCXN0YXRzLT5ieXRlX2NvdW50ID0gZHN0X2xlbjsKKwkJc3RhdHMtPnVuaWNvZGVfY291bnQgPSB1bmlfY291bnQ7CisJCXN0YXRzLT51bmljb2RlX3dpZHRoID0gdW5pX3dpZHRoOworCX0KKworCXJldHVybiBkc3Q7Cit9CitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZSh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjKQoreworCXJldHVybiB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlMihzdGF0cywgc3JjLCBJTlRfTUFYLCAwKTsKK30KK2NoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlX2ZpeGVkd2lkdGgoLyp1bmlfc3RhdF90ICpzdGF0cywqLyBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIHdpZHRoKQoreworCXJldHVybiB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlMigvKnN0YXRzOiovIE5VTEwsIHNyYywgd2lkdGgsIFVOSV9GTEFHX1BBRCk7Cit9CisKKyNpZmRlZiBVTlVTRUQKK2NoYXIqIEZBU1RfRlVOQyB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlX21heHdpZHRoKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIG1heHdpZHRoKQoreworCXJldHVybiB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlMihzdGF0cywgc3JjLCBtYXh3aWR0aCwgMCk7Cit9CisKK3Vuc2lnbmVkIEZBU1RfRlVOQyB1bmljb2RlX3BhZGRpbmdfdG9fd2lkdGgodW5zaWduZWQgd2lkdGgsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTikgeworCQlyZXR1cm4gd2lkdGggLSBzdHJubGVuKHNyYywgd2lkdGgpOworCX0KKworCXdoaWxlICgxKSB7CisJCWludCB3OworCQl3Y2hhcl90IHdjOworCisjaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisJCXsKKwkJCW1ic3RhdGVfdCBtYnN0ID0geyAwIH07CisJCQlzc2l6ZV90IHJjID0gbWJzcnRvd2NzKCZ3YywgJnNyYywgMSwgJm1ic3QpOworCQkJaWYgKHJjIDw9IDApIC8qIGVycm9yLCBvciBlbmQtb2Ytc3RyaW5nICovCisJCQkJcmV0dXJuIHdpZHRoOworCQl9CisjZWxzZQorCQlzcmMgPSBtYnN0b3djX2ludGVybmFsKCZ3Yywgc3JjKTsKKwkJaWYgKHdjID09IEVSUk9SX1dDSEFSIHx8IHdjID09IDApIC8qIGVycm9yLCBvciBlbmQtb2Ytc3RyaW5nICovCisJCQlyZXR1cm4gd2lkdGg7CisjZW5kaWYKKwkJdyA9IHdjd2lkdGgod2MpOworCQlpZiAodyA8IDApIC8qIG5vbi1wcmludGFibGUgd2NoYXIgKi8KKwkJCXJldHVybiB3aWR0aDsKKwkJd2lkdGggLT0gdzsKKwkJaWYgKChpbnQpd2lkdGggPD0gMCkgLyogc3RyaW5nIGlzIGxvbmdlciB0aGFuIHdpZHRoICovCisJCQlyZXR1cm4gMDsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3VwZGF0ZV9wYXNzd2QuYyBiL2xpYmJiL3VwZGF0ZV9wYXNzd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBhZjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdXBkYXRlX3Bhc3N3ZC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1cGRhdGVfcGFzc3dkCisgKgorICogdXBkYXRlX3Bhc3N3ZCBpcyBhIGNvbW1vbiBmdW5jdGlvbiBmb3IgcGFzc3dkIGFuZCBjaHBhc3N3ZCBhcHBsZXRzOworICogaXQgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHBhc3N3b3JkIGZpbGUgKGkuZS4gL2V0Yy9wYXNzd2Qgb3IKKyAqIC9ldGMvc2hhZG93KSBmb3IgYSBnaXZlbiB1c2VyIGFuZCBwYXNzd29yZC4KKyAqCisgKiBNb3ZlZCBmcm9tIGxvZ2ludXRpbHMvcGFzc3dkLmMgYnkgQWxleGFuZGVyIFNoaXNoa2luIDx2aXJ0dW9zb0BzbGluZC5vcmc+CisgKgorICogTW9kaWZpZWQgdG8gYmUgYWJsZSB0byBhZGQgb3IgZGVsZXRlIHVzZXJzLCBncm91cHMgYW5kIHVzZXJzIHRvL2Zyb20gZ3JvdXBzCisgKiBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgY2hlY2tfc2VsaW51eF91cGRhdGVfcGFzc3dkKGNvbnN0IGNoYXIgKnVzZXJuYW1lKQoreworCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0OworCWNoYXIgKnNldXNlcjsKKworCWlmIChnZXR1aWQoKSAhPSAodWlkX3QpMCB8fCBpc19zZWxpbnV4X2VuYWJsZWQoKSA9PSAwKQorCQlyZXR1cm47ICAvKiBObyBuZWVkIHRvIGNoZWNrICovCisKKwlpZiAoZ2V0cHJldmNvbl9yYXcoJmNvbnRleHQpIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRwcmV2Y29uIGZhaWxlZCIpOworCXNldXNlciA9IHN0cnRvayhjb250ZXh0LCAiOiIpOworCWlmICghc2V1c2VyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBjb250ZXh0ICclcyciLCBjb250ZXh0KTsKKwlpZiAoc3RyY21wKHNldXNlciwgdXNlcm5hbWUpICE9IDApIHsKKwkJaWYgKGNoZWNrUGFzc3dkQWNjZXNzKFBBU1NXRF9fUEFTU1dEKSAhPSAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlNFTGludXg6IGFjY2VzcyBkZW5pZWQiKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlY29uKGNvbnRleHQpOworfQorI2Vsc2UKKyMgZGVmaW5lIGNoZWNrX3NlbGludXhfdXBkYXRlX3Bhc3N3ZCh1c2VybmFtZSkgKCh2b2lkKTApCisjZW5kaWYKKworLyoKKyAxKSBhZGQgYSB1c2VyOiB1cGRhdGVfcGFzc3dkKEZJTEUsIFVTRVIsIFJFTUFJTklOR19QV0xJTkUsIE5VTEwpCisgICAgb25seSBpZiBDT05GSUdfQUREVVNFUj15IGFuZCBhcHBsZXRfbmFtZVswXSA9PSAnYScgbGlrZSBpbiBhZGR1c2VyCisKKyAyKSBhZGQgYSBncm91cDogdXBkYXRlX3Bhc3N3ZChGSUxFLCBHUk9VUCwgUkVNQUlOSU5HX0dSTElORSwgTlVMTCkKKyAgICBvbmx5IGlmIENPTkZJR19BRERHUk9VUD15IGFuZCBhcHBsZXRfbmFtZVswXSA9PSAnYScgbGlrZSBpbiBhZGRncm91cAorCisgMykgYWRkIGEgdXNlciB0byBhIGdyb3VwOiB1cGRhdGVfcGFzc3dkKEZJTEUsIEdST1VQLCBOVUxMLCBNRU1CRVIpCisgICAgb25seSBpZiBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQPXksIGFwcGxldF9uYW1lWzBdID09ICdhJworICAgIGxpa2UgaW4gYWRkZ3JvdXAgYW5kIG1lbWJlciAhPSBOVUxMCisKKyA0KSBkZWxldGUgYSB1c2VyOiB1cGRhdGVfcGFzc3dkKEZJTEUsIFVTRVIsIE5VTEwsIE5VTEwpCisKKyA1KSBkZWxldGUgYSBncm91cDogdXBkYXRlX3Bhc3N3ZChGSUxFLCBHUk9VUCwgTlVMTCwgTlVMTCkKKworIDYpIGRlbGV0ZSBhIHVzZXIgZnJvbSBhIGdyb3VwOiB1cGRhdGVfcGFzc3dkKEZJTEUsIEdST1VQLCBOVUxMLCBNRU1CRVIpCisgICAgb25seSBpZiBDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQPXkgYW5kIG1lbWJlciAhPSBOVUxMCisKKyA3KSBjaGFuZ2UgdXNlcidzIHBhc3N3b3JkOiB1cGRhdGVfcGFzc3dkKEZJTEUsIFVTRVIsIE5FV19QQVNTV0QsIE5VTEwpCisgICAgb25seSBpZiBDT05GSUdfUEFTU1dEPXkgYW5kIGFwcGxldF9uYW1lWzBdID09ICdwJyBsaWtlIGluIHBhc3N3ZAorICAgIG9yIGlmIENPTkZJR19DSFBBU1NXRD15IGFuZCBhcHBsZXRfbmFtZVswXSA9PSAnYycgbGlrZSBpbiBjaHBhc3N3ZAorCisgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgYXJndW1lbnRzIGZlZCB0byBpdAorIHNvIHRoZSBjYWxsaW5nIHByb2dyYW0gc2hvdWxkIHRha2UgY2FyZSBvZiB0aGF0LgorCisgUmV0dXJucyBudW1iZXIgb2YgbGluZXMgY2hhbmdlZCwgb3IgLTEgb24gZXJyb3IuCisqLworaW50IEZBU1RfRlVOQyB1cGRhdGVfcGFzc3dkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQljb25zdCBjaGFyICpuYW1lLAorCQljb25zdCBjaGFyICpuZXdfcGFzc3dkLAorCQljb25zdCBjaGFyICptZW1iZXIpCit7CisjaWYgIShFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIHx8IEVOQUJMRV9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVApCisjZGVmaW5lIG1lbWJlciBOVUxMCisjZW5kaWYKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwlzdHJ1Y3QgZmxvY2sgbG9jazsKKwlGSUxFICpvbGRfZnA7CisJRklMRSAqbmV3X2ZwOworCWNoYXIgKmZuYW1lc2Z4OworCWNoYXIgKnNmeF9jaGFyOworCWNoYXIgKm5hbWVfY29sb247CisJdW5zaWduZWQgdXNlcl9sZW47CisJaW50IG9sZF9mZDsKKwlpbnQgbmV3X2ZkOworCWludCBpOworCWludCBjaGFuZ2VkX2xpbmVzOworCWludCByZXQgPSAtMTsgLyogZmFpbHVyZSAqLworCS8qIHVzZWQgYXMgYSBib29sOiAiYXJlIHdlIG1vZGlmeWluZyAvZXRjL3NoYWRvdz8iICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCWNvbnN0IGNoYXIgKnNoYWRvdyA9IHN0cnN0cihmaWxlbmFtZSwgInNoYWRvdyIpOworI2Vsc2UKKyMgZGVmaW5lIHNoYWRvdyBOVUxMCisjZW5kaWYKKworCWZpbGVuYW1lID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoZmlsZW5hbWUpOworCWlmIChmaWxlbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gcmV0OworCisJY2hlY2tfc2VsaW51eF91cGRhdGVfcGFzc3dkKG5hbWUpOworCisJLyogTmV3IHBhc3N3ZCBmaWxlLCAiL2V0Yy9wYXNzd2QrIiBmb3Igbm93ICovCisJZm5hbWVzZnggPSB4YXNwcmludGYoIiVzKyIsIGZpbGVuYW1lKTsKKwlzZnhfY2hhciA9ICZmbmFtZXNmeFtzdHJsZW4oZm5hbWVzZngpLTFdOworCW5hbWVfY29sb24gPSB4YXNwcmludGYoIiVzOiIsIG5hbWUpOworCXVzZXJfbGVuID0gc3RybGVuKG5hbWVfY29sb24pOworCisJaWYgKHNoYWRvdykKKwkJb2xkX2ZwID0gZm9wZW4oZmlsZW5hbWUsICJyKyIpOworCWVsc2UKKwkJb2xkX2ZwID0gZm9wZW5fb3Jfd2FybihmaWxlbmFtZSwgInIrIik7CisJaWYgKCFvbGRfZnApIHsKKwkJaWYgKHNoYWRvdykKKwkJCXJldCA9IDA7IC8qIG1pc3Npbmcgc2hhZG93IGlzIG5vdCBhbiBlcnJvciAqLworCQlnb3RvIGZyZWVfbWVtOworCX0KKwlvbGRfZmQgPSBmaWxlbm8ob2xkX2ZwKTsKKworCXNlbGludXhfcHJlc2VydmVfZmNvbnRleHQob2xkX2ZkKTsKKworCS8qIFRyeSB0byBjcmVhdGUgIi9ldGMvcGFzc3dkKyIuIFdhaXQgaWYgaXQgZXhpc3RzLiAqLworCWkgPSAzMDsKKwlkbyB7CisJCS8vIEZJWE1FOiBvbiBsYXN0IGl0ZXJhdGlvbiB0cnkgdy9vIE9fRVhDTCBidXQgd2l0aCBPX1RSVU5DPworCQluZXdfZmQgPSBvcGVuKGZuYW1lc2Z4LCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgMDYwMCk7CisJCWlmIChuZXdfZmQgPj0gMCkgZ290byBjcmVhdGVkOworCQlpZiAoZXJybm8gIT0gRUVYSVNUKSBicmVhazsKKwkJdXNsZWVwKDEwMDAwMCk7IC8qIDAuMSBzZWMgKi8KKwl9IHdoaWxlICgtLWkpOworCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSAnJXMnIiwgZm5hbWVzZngpOworCWdvdG8gY2xvc2Vfb2xkX2ZwOworCisgY3JlYXRlZDoKKwlpZiAoZnN0YXQob2xkX2ZkLCAmc2IpID09IDApIHsKKwkJZmNobW9kKG5ld19mZCwgc2Iuc3RfbW9kZSAmIDA3NzcpOyAvKiBpZ25vcmUgZXJyb3JzICovCisJCWZjaG93bihuZXdfZmQsIHNiLnN0X3VpZCwgc2Iuc3RfZ2lkKTsKKwl9CisJZXJybm8gPSAwOworCW5ld19mcCA9IHhmZG9wZW5fZm9yX3dyaXRlKG5ld19mZCk7CisKKwkvKiBCYWNrdXAgZmlsZSBpcyAiL2V0Yy9wYXNzd2QtIiAqLworCSpzZnhfY2hhciA9ICctJzsKKwkvKiBEZWxldGUgb2xkIGJhY2t1cCAqLworCWkgPSAodW5saW5rKGZuYW1lc2Z4KSAmJiBlcnJubyAhPSBFTk9FTlQpOworCS8qIENyZWF0ZSBiYWNrdXAgYXMgYSBoYXJkbGluayB0byBjdXJyZW50ICovCisJaWYgKGkgfHwgbGluayhmaWxlbmFtZSwgZm5hbWVzZngpKQorCQliYl9wZXJyb3JfbXNnKCJ3YXJuaW5nOiBjYW4ndCBjcmVhdGUgYmFja3VwIGNvcHkgJyVzJyIsCisJCQkJZm5hbWVzZngpOworCSpzZnhfY2hhciA9ICcrJzsKKworCS8qIExvY2sgdGhlIHBhc3N3b3JkIGZpbGUgYmVmb3JlIHVwZGF0aW5nICovCisJbG9jay5sX3R5cGUgPSBGX1dSTENLOworCWxvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKwlsb2NrLmxfc3RhcnQgPSAwOworCWxvY2subF9sZW4gPSAwOworCWlmIChmY250bChvbGRfZmQsIEZfU0VUTEssICZsb2NrKSA8IDApCisJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6IGNhbid0IGxvY2sgJyVzJyIsIGZpbGVuYW1lKTsKKwlsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7CisKKwkvKiBSZWFkIGN1cnJlbnQgcGFzc3dvcmQgZmlsZSwgd3JpdGUgdXBkYXRlZCAvZXRjL3Bhc3N3ZCsgKi8KKwljaGFuZ2VkX2xpbmVzID0gMDsKKwl3aGlsZSAoMSkgeworCQljaGFyICpjcCwgKmxpbmU7CisKKwkJbGluZSA9IHhtYWxsb2NfZmdldGxpbmUob2xkX2ZwKTsKKwkJaWYgKCFsaW5lKSAvKiBFT0YvZXJyb3IgKi8KKwkJCWJyZWFrOworCQlpZiAoc3RybmNtcChuYW1lX2NvbG9uLCBsaW5lLCB1c2VyX2xlbikgIT0gMCkgeworCQkJZnByaW50ZihuZXdfZnAsICIlc1xuIiwgbGluZSk7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQkvKiBXZSBoYXZlIGEgbWF0Y2ggd2l0aCAibmFtZToiLi4uICovCisJCWNwID0gbGluZSArIHVzZXJfbGVuOyAvKiBtb3ZlIHBhc3QgbmFtZTogKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgfHwgRU5BQkxFX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUAorCQlpZiAobWVtYmVyKSB7CisJCQkvKiBJdCdzIGFjdHVhbGx5IC9ldGMvZ3JvdXArLCBub3QgL2V0Yy9wYXNzd2QrICovCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUAorCQkJICYmIGFwcGxldF9uYW1lWzBdID09ICdhJworCQkJKSB7CisJCQkJLyogQWRkIHVzZXIgdG8gZ3JvdXAgKi8KKwkJCQlmcHJpbnRmKG5ld19mcCwgIiVzJXMlc1xuIiwgbGluZSwKKwkJCQkJbGFzdF9jaGFyX2lzKGxpbmUsICc6JykgPyAiIiA6ICIsIiwKKwkJCQkJbWVtYmVyKTsKKwkJCQljaGFuZ2VkX2xpbmVzKys7CisJCQl9IGVsc2UgaWYgKEVOQUJMRV9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAKKwkJCS8qICYmIGFwcGxldF9uYW1lWzBdID09ICdkJyAqLworCQkJKSB7CisJCQkJLyogRGVsZXRlIHVzZXIgZnJvbSBncm91cCAqLworCQkJCWNoYXIgKnRtcDsKKwkJCQljb25zdCBjaGFyICpmbXQgPSAiJXMiOworCisJCQkJLyogZmluZCB0aGUgc3RhcnQgb2YgdGhlIG1lbWJlciBsaXN0OiBsYXN0ICc6JyAqLworCQkJCWNwID0gc3RycmNocihsaW5lLCAnOicpOworCQkJCS8qIGN1dCBpdCAqLworCQkJCSpjcCsrID0gJ1wwJzsKKwkJCQkvKiB3cml0ZSB0aGUgY3V0IGxpbmUgbmFtZTpwYXNzd2Q6Z2lkOgorCQkJCSAqIG9yIG5hbWU6ITo6ICovCisJCQkJZnByaW50ZihuZXdfZnAsICIlczoiLCBsaW5lKTsKKwkJCQkvKiBwYXJzZSB0aGUgdG9rZW5zIG9mIHRoZSBtZW1iZXIgbGlzdCAqLworCQkJCXRtcCA9IGNwOworCQkJCXdoaWxlICgoY3AgPSBzdHJzZXAoJnRtcCwgIiwiKSkgIT0gTlVMTCkgeworCQkJCQlpZiAoc3RyY21wKG1lbWJlciwgY3ApICE9IDApIHsKKwkJCQkJCWZwcmludGYobmV3X2ZwLCBmbXQsIGNwKTsKKwkJCQkJCWZtdCA9ICIsJXMiOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogZm91bmQgbWVtYmVyLCBza2lwIGl0ICovCisJCQkJCQljaGFuZ2VkX2xpbmVzKys7CisJCQkJCX0KKwkJCQl9CisJCQkJZnByaW50ZihuZXdfZnAsICJcbiIpOworCQkJfQorCQl9IGVsc2UKKyNlbmRpZgorCQlpZiAoKEVOQUJMRV9QQVNTV0QgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ3AnKQorCQkgfHwgKEVOQUJMRV9DSFBBU1NXRCAmJiBhcHBsZXRfbmFtZVswXSA9PSAnYycpCisJCSkgeworCQkJLyogQ2hhbmdlIHBhc3N3ZCAqLworCQkJY3AgPSBzdHJjaHJudWwoY3AsICc6Jyk7IC8qIG1vdmUgcGFzdCBvbGQgcGFzc3dkICovCisKKwkJCWlmIChzaGFkb3cgJiYgKmNwID09ICc6JykgeworCQkJCS8qIC9ldGMvc2hhZG93J3MgZmllbGQgMyAocGFzc3dkIGNoYW5nZSBkYXRlKSBuZWVkcyB1cGRhdGluZyAqLworCQkJCS8qIG1vdmUgcGFzdCBvbGQgY2hhbmdlIGRhdGUgKi8KKwkJCQljcCA9IHN0cmNocm51bChjcCArIDEsICc6Jyk7CisJCQkJLyogIm5hbWU6IiArICJuZXdfcGFzc3dkIiArICI6IiArICJjaGFuZ2UgZGF0ZSIgKyAiOnJlc3Qgb2YgbGluZSIgKi8KKwkJCQlmcHJpbnRmKG5ld19mcCwgIiVzJXM6JXUlc1xuIiwgbmFtZV9jb2xvbiwgbmV3X3Bhc3N3ZCwKKwkJCQkJKHVuc2lnbmVkKSh0aW1lKE5VTEwpKSAvICgyNCo2MCo2MCksIGNwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogIm5hbWU6IiArICJuZXdfcGFzc3dkIiArICI6cmVzdCBvZiBsaW5lIiAqLworCQkJCWZwcmludGYobmV3X2ZwLCAiJXMlcyVzXG4iLCBuYW1lX2NvbG9uLCBuZXdfcGFzc3dkLCBjcCk7CisJCQl9CisJCQljaGFuZ2VkX2xpbmVzKys7CisJCX0gLyogZWxzZSBkZWxldGUgdXNlciBvciBncm91cDogc2tpcCB0aGUgbGluZSAqLworIG5leHQ6CisJCWZyZWUobGluZSk7CisJfQorCisJaWYgKGNoYW5nZWRfbGluZXMgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgfHwgRU5BQkxFX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUAorCQlpZiAobWVtYmVyKSB7CisJCQlpZiAoRU5BQkxFX0FEREdST1VQICYmIGFwcGxldF9uYW1lWzBdID09ICdhJykKKwkJCQliYl9lcnJvcl9tc2coImNhbid0IGZpbmQgJXMgaW4gJXMiLCBuYW1lLCBmaWxlbmFtZSk7CisJCQlpZiAoRU5BQkxFX0RFTEdST1VQICYmIGFwcGxldF9uYW1lWzBdID09ICdkJykKKwkJCQliYl9lcnJvcl9tc2coImNhbid0IGZpbmQgJXMgaW4gJXMiLCBtZW1iZXIsIGZpbGVuYW1lKTsKKwkJfQorI2VuZGlmCisJCWlmICgoRU5BQkxFX0FERFVTRVIgfHwgRU5BQkxFX0FEREdST1VQKQorCQkgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2EnICYmICFtZW1iZXIKKwkJKSB7CisJCQkvKiBhZGQgdXNlciBvciBncm91cCAqLworCQkJZnByaW50ZihuZXdfZnAsICIlcyVzXG4iLCBuYW1lX2NvbG9uLCBuZXdfcGFzc3dkKTsKKwkJCWNoYW5nZWRfbGluZXMrKzsKKwkJfQorCX0KKworCWZjbnRsKG9sZF9mZCwgRl9TRVRMSywgJmxvY2spOworCisJLyogV2UgZG8gd2FudCBhbGwgb2YgdGhlbSB0byBleGVjdXRlLCB0aHVzIHwgaW5zdGVhZCBvZiB8fCAqLworCWVycm5vID0gMDsKKwlpZiAoKGZlcnJvcihvbGRfZnApIHwgZmZsdXNoKG5ld19mcCkgfCBmc3luYyhuZXdfZmQpIHwgZmNsb3NlKG5ld19mcCkpCisJIHx8IHJlbmFtZShmbmFtZXNmeCwgZmlsZW5hbWUpCisJKSB7CisJCS8qIEF0IGxlYXN0IG9uZSBvZiB0aG9zZSBmYWlsZWQgKi8KKwkJYmJfcGVycm9yX25vbXNnKCk7CisJCWdvdG8gdW5saW5rX25ldzsKKwl9CisJLyogU3VjY2VzczogcmV0ID49IDAgKi8KKwlyZXQgPSBjaGFuZ2VkX2xpbmVzOworCisgdW5saW5rX25ldzoKKwlpZiAocmV0IDwgMCkKKwkJdW5saW5rKGZuYW1lc2Z4KTsKKworIGNsb3NlX29sZF9mcDoKKwlmY2xvc2Uob2xkX2ZwKTsKKworIGZyZWVfbWVtOgorCWZyZWUoZm5hbWVzZngpOworCWZyZWUoKGNoYXIgKilmaWxlbmFtZSk7CisJZnJlZShuYW1lX2NvbG9uKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYmIvdXRtcC5jIGIvbGliYmIvdXRtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDQzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi91dG1wLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHV0bXAvd3RtcCBzdXBwb3J0IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdm9pZCB0b3VjaChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpZiAoYWNjZXNzKGZpbGVuYW1lLCBSX09LIHwgV19PSykgPT0gLTEpCisJCWNsb3NlKG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2NCkpOworfQorCit2b2lkIEZBU1RfRlVOQyB3cml0ZV9uZXdfdXRtcChwaWRfdCBwaWQsIGludCBuZXdfdHlwZSwgY29uc3QgY2hhciAqdHR5X25hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSkKK3sKKwlzdHJ1Y3QgdXRtcCB1dGVudDsKKwljaGFyICppZDsKKwl1bnNpZ25lZCB3aWR0aDsKKworCW1lbXNldCgmdXRlbnQsIDAsIHNpemVvZih1dGVudCkpOworCXV0ZW50LnV0X3BpZCA9IHBpZDsKKwl1dGVudC51dF90eXBlID0gbmV3X3R5cGU7CisJdHR5X25hbWUgPSBza2lwX2Rldl9wZngodHR5X25hbWUpOworCXNhZmVfc3RybmNweSh1dGVudC51dF9saW5lLCB0dHlfbmFtZSwgc2l6ZW9mKHV0ZW50LnV0X2xpbmUpKTsKKwlpZiAodXNlcm5hbWUpCisJCXNhZmVfc3RybmNweSh1dGVudC51dF91c2VyLCB1c2VybmFtZSwgc2l6ZW9mKHV0ZW50LnV0X3VzZXIpKTsKKwlpZiAoaG9zdG5hbWUpCisJCXNhZmVfc3RybmNweSh1dGVudC51dF9ob3N0LCBob3N0bmFtZSwgc2l6ZW9mKHV0ZW50LnV0X2hvc3QpKTsKKwl1dGVudC51dF90di50dl9zZWMgPSB0aW1lKE5VTEwpOworCisJLyogSW52ZW50IG91ciBvd24gdXRfaWQuIHV0X2lkIGlzIG9ubHkgNCBjaGFycyB3aWRlLgorCSAqIFRyeSB0byBmaXQgc29tZXRoaW5nIHJlbW90ZWx5IG1lYW5pbmdmdWwuLi4gKi8KKwlpZCA9IHV0ZW50LnV0X2lkOworCXdpZHRoID0gc2l6ZW9mKHV0ZW50LnV0X2lkKTsKKwlpZiAodHR5X25hbWVbMF0gPT0gJ3AnKSB7CisJCS8qIGlmICJwdHlYWFgiLCBtYXAgdG8gInBYWFgiICovCisJCS8qIGlmICJwdHMvWFgiLCBtYXAgdG8gInAvWFgiICovCisJCSppZCsrID0gJ3AnOworCQl3aWR0aC0tOworCX0gLyogZWxzZTogdXN1YWxseSBpdCdzICJ0dHlYWFhYIiwgbWFwIHRvICJYWFhYIiAqLworCWlmIChzdHJsZW4odHR5X25hbWUpID4gMykKKwkJdHR5X25hbWUgKz0gMzsKKwlzdHJuY3B5KGlkLCB0dHlfbmFtZSwgd2lkdGgpOworCisJdG91Y2goX1BBVEhfVVRNUCk7CisJLy91dG1wbmFtZShfUEFUSF9VVE1QKTsKKwlzZXR1dGVudCgpOworCS8qIEFwcGVuZCBuZXcgb25lIChob3BlZnVsbHksIHVubGVzcyB3ZSBjb2xsaWRlIG9uIHV0X2lkKSAqLworCXB1dHV0bGluZSgmdXRlbnQpOworCWVuZHV0ZW50KCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XVE1QCisJLyogIm1hbiB1dG1wIiBzYXlzIHd0bXAgZmlsZSBzaG91bGQgKm5vdCogYmUgY3JlYXRlZCBhdXRvbWFnaWNhbGx5ICovCisJLyp0b3VjaChiYl9wYXRoX3d0bXBfZmlsZSk7Ki8KKwl1cGR3dG1wKGJiX3BhdGhfd3RtcF9maWxlLCAmdXRlbnQpOworI2VuZGlmCit9CisKKy8qCisgKiBSZWFkICJtYW4gdXRtcCIgdG8gbWFrZSBzZW5zZSBvdXQgb2YgaXQuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHVwZGF0ZV91dG1wKHBpZF90IHBpZCwgaW50IG5ld190eXBlLCBjb25zdCBjaGFyICp0dHlfbmFtZSwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQoreworCXN0cnVjdCB1dG1wIHV0ZW50OworCXN0cnVjdCB1dG1wICp1dHA7CisKKwl0b3VjaChfUEFUSF9VVE1QKTsKKwkvL3V0bXBuYW1lKF9QQVRIX1VUTVApOworCXNldHV0ZW50KCk7CisKKwkvKiBEaWQgaW5pdC9nZXR0eS90ZWxuZXRkL3NzaGQvLi4uIGNyZWF0ZSBhbiBlbnRyeSBmb3IgdXM/CisJICogSXQgc2hvdWxkIGJlIChuZXdfdHlwZS0xKSwgYnV0IHdlJ2QgYWxzbyByZXVzZQorCSAqIGFueSBvdGhlciBwb3RlbnRpYWxseSBzdGFsZSB4eHhfUFJPQ0VTUyBlbnRyeSAqLworCXdoaWxlICgodXRwID0gZ2V0dXRlbnQoKSkgIT0gTlVMTCkgeworCQlpZiAodXRwLT51dF9waWQgPT0gcGlkCisJCS8vICYmIHV0LT51dF9saW5lWzBdCisJCSAmJiB1dHAtPnV0X2lkWzBdIC8qIG11c3QgaGF2ZSBub256ZXJvIGlkICovCisJCSAmJiAoICB1dHAtPnV0X3R5cGUgPT0gSU5JVF9QUk9DRVNTCisJCSAgICB8fCB1dHAtPnV0X3R5cGUgPT0gTE9HSU5fUFJPQ0VTUworCQkgICAgfHwgdXRwLT51dF90eXBlID09IFVTRVJfUFJPQ0VTUworCQkgICAgfHwgdXRwLT51dF90eXBlID09IERFQURfUFJPQ0VTUworCQkgICAgKQorCQkpIHsKKwkJCWlmICh1dHAtPnV0X3R5cGUgPj0gbmV3X3R5cGUpIHsKKwkJCQkvKiBTdGFsZSByZWNvcmQuIE51a2UgaG9zdG5hbWUgKi8KKwkJCQltZW1zZXQodXRwLT51dF9ob3N0LCAwLCBzaXplb2YodXRwLT51dF9ob3N0KSk7CisJCQl9CisJCQkvKiBOQjogcHV0dXRsaW5lIChzZWUgbGF0ZXIpIHNlYXJjaGVzIGZvciBtYXRjaGluZyB1dGVudAorCQkJICogdXNpbmcgZ2V0dXRpZCh1dGVudCkgLSB3ZSBtdXN0IG5vdCBjaGFuZ2UgdXRfaWQKKwkJCSAqIGlmIHdlIHdhbnQgKmV4YWN0bHkgdGhpcyogcmVjb3JkIHRvIGJlIG92ZXJ3cml0dGVuIQorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKwkvL2VuZHV0ZW50KCk7IC0gbm8gbmVlZCwgcHV0dXRsaW5lIGNhbiBkZWFsIHdpdGggKGFuZCBhY3R1YWxseSBsaWtlcykKKwkvL3RoZSBzaXR1YXRpb24gd2hlbiB1dG1wIGZpbGUgaXMgcG9zaXRpb25lZCBvbiBmb3VuZCByZWNvcmQKKworCWlmICghdXRwKSB7CisJCWlmIChuZXdfdHlwZSAhPSBERUFEX1BST0NFU1MpCisJCQl3cml0ZV9uZXdfdXRtcChwaWQsIG5ld190eXBlLCB0dHlfbmFtZSwgdXNlcm5hbWUsIGhvc3RuYW1lKTsKKwkJZWxzZQorCQkJZW5kdXRlbnQoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1ha2UgYSBjb3B5LiBXZSBjYW4ndCB1c2UgKnV0cCwgcHV0dXRsaW5lJ3MgaW50ZXJuYWwgZ2V0dXRpZAorCSAqIHdpbGwgb3ZlcndyaXRlIGl0IGJlZm9yZSBpdCBpcyB1c2VkISAqLworCXV0ZW50ID0gKnV0cDsKKworCXV0ZW50LnV0X3R5cGUgPSBuZXdfdHlwZTsKKwlpZiAodHR5X25hbWUpCisJCXNhZmVfc3RybmNweSh1dGVudC51dF9saW5lLCBza2lwX2Rldl9wZngodHR5X25hbWUpLCBzaXplb2YodXRlbnQudXRfbGluZSkpOworCWlmICh1c2VybmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X3VzZXIsIHVzZXJuYW1lLCBzaXplb2YodXRlbnQudXRfdXNlcikpOworCWlmIChob3N0bmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2hvc3QsIGhvc3RuYW1lLCBzaXplb2YodXRlbnQudXRfaG9zdCkpOworCXV0ZW50LnV0X3R2LnR2X3NlYyA9IHRpbWUoTlVMTCk7CisKKwkvKiBVcGRhdGUsIG9yIGFwcGVuZCBuZXcgb25lICovCisJLy9zZXR1dGVudCgpOworCXB1dHV0bGluZSgmdXRlbnQpOworCWVuZHV0ZW50KCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XVE1QCisJLyogIm1hbiB1dG1wIiBzYXlzIHd0bXAgZmlsZSBzaG91bGQgKm5vdCogYmUgY3JlYXRlZCBhdXRvbWFnaWNhbGx5ICovCisJLyp0b3VjaChiYl9wYXRoX3d0bXBfZmlsZSk7Ki8KKwl1cGR3dG1wKGJiX3BhdGhfd3RtcF9maWxlLCAmdXRlbnQpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJiYi91dWVuY29kZS5jIGIvbGliYmIvdXVlbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2U3MDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdXVlbmNvZGUuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDIwMDMsIEdsZW5uIE1jR3JhdGgKKyAqIENvcHlyaWdodCAyMDA2LCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICogQ29weXJpZ2h0IDIwMTAsIERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQ29udmVyc2lvbiB0YWJsZS4gIGZvciBiYXNlIDY0ICovCitjb25zdCBjaGFyIGJiX3V1ZW5jX3RibF9iYXNlNjRbNjUgKyAyXSBBTElHTjEgPSB7CisJJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsCisJJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsCisJJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsCisJJ1knLCAnWicsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsCisJJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsCisJJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsCisJJ3cnLCAneCcsICd5JywgJ3onLCAnMCcsICcxJywgJzInLCAnMycsCisJJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJysnLCAnLycsCisJJz0nIC8qIHRlcm1pbmF0aW9uIGNoYXJhY3RlciAqLywKKwknXG4nLCAnXDAnIC8qIG5lZWRlZCBmb3IgdXVkZWNvZGUuYyAqLworfTsKKworY29uc3QgY2hhciBiYl91dWVuY190Ymxfc3RkWzY1XSBBTElHTjEgPSB7CisJJ2AnLCAnIScsICciJywgJyMnLCAnJCcsICclJywgJyYnLCAnXCcnLAorCScoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLAorCScwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAorCSc4JywgJzknLCAnOicsICc7JywgJzwnLCAnPScsICc+JywgJz8nLAorCSdAJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLAorCSdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLAorCSdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLAorCSdYJywgJ1knLCAnWicsICdbJywgJ1xcJywgJ10nLCAnXicsICdfJywKKwknYCcgLyogdGVybWluYXRpb24gY2hhcmFjdGVyICovCit9OworCisvKgorICogRW5jb2RlIGJ5dGVzIGF0IFMgb2YgbGVuZ3RoIExFTkdUSCB0byB1dWVuY29kZSBvciBiYXNlNjQgZm9ybWF0IGFuZCBwbGFjZSBpdAorICogdG8gU1RPUkUuICBTVE9SRSB3aWxsIGJlIDAtdGVybWluYXRlZCwgYW5kIG11c3QgcG9pbnQgdG8gYSB3cml0YWJsZQorICogYnVmZmVyIG9mIGF0IGxlYXN0IDErQkFTRTY0X0xFTkdUSChsZW5ndGgpIGJ5dGVzLgorICogd2hlcmUgQkFTRTY0X0xFTkdUSChsZW4pID0gKDQgKiAoKExFTkdUSCArIDIpIC8gMykpCisgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX3V1ZW5jb2RlKGNoYXIgKnAsIGNvbnN0IHZvaWQgKnNyYywgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqdGJsKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSBzcmM7CisKKwkvKiBUcmFuc2Zvcm0gdGhlIDN4OCBiaXRzIHRvIDR4NiBiaXRzICovCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJdW5zaWduZWQgczEsIHMyOworCisJCS8qIEFyZSBzWzFdLCBzWzJdIHZhbGlkIG9yIHNob3VsZCBiZSBhc3N1bWVkIDA/ICovCisJCXMxID0gczIgPSAwOworCQlsZW5ndGggLT0gMzsgLyogY2FuIGJlID49MCwgLTEsIC0yICovCisJCWlmIChsZW5ndGggPj0gLTEpIHsKKwkJCXMxID0gc1sxXTsKKwkJCWlmIChsZW5ndGggPj0gMCkKKwkJCQlzMiA9IHNbMl07CisJCX0KKwkJKnArKyA9IHRibFtzWzBdID4+IDJdOworCQkqcCsrID0gdGJsWygoc1swXSAmIDMpIDw8IDQpICsgKHMxID4+IDQpXTsKKwkJKnArKyA9IHRibFsoKHMxICYgMHhmKSA8PCAyKSArIChzMiA+PiA2KV07CisJCSpwKysgPSB0YmxbczIgJiAweDNmXTsKKwkJcyArPSAzOworCX0KKwkvKiBaZXJvLXRlcm1pbmF0ZSAqLworCSpwID0gJ1wwJzsKKwkvKiBJZiBsZW5ndGggaXMgLTIgb3IgLTEsIHBhZCBsYXN0IGNoYXIgb3IgdHdvICovCisJd2hpbGUgKGxlbmd0aCkgeworCQkqLS1wID0gdGJsWzY0XTsKKwkJbGVuZ3RoKys7CisJfQorfQorCisvKgorICogRGVjb2RlIGJhc2U2NCBlbmNvZGVkIHN0cmVhbS4KKyAqIENhbiBzdG9wIG9uIEVPRiwgc3BlY2lmaWVkIGNoYXIsIG9yIG9uIHV1ZW5jb2RlLXN0eWxlICI9PT09IiBsaW5lOgorICogZmxhZ3MgYXJndW1lbnQgY29udHJvbHMgaXQuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHJlYWRfYmFzZTY0KEZJTEUgKnNyY19zdHJlYW0sIEZJTEUgKmRzdF9zdHJlYW0sIGludCBmbGFncykKK3sKKy8qIE5vdGUgdGhhdCBFT0YgX2Nhbl8gYmUgcGFzc2VkIGFzIGV4aXRfY2hhciB0b28gKi8KKyNkZWZpbmUgZXhpdF9jaGFyICAgICgoaW50KShzaWduZWQgY2hhcilmbGFncykKKyNkZWZpbmUgdXVfc3R5bGVfZW5kIChmbGFncyAmIEJBU0U2NF9GTEFHX1VVX1NUT1ApCisKKwlpbnQgdGVybV9jb3VudCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBjaGFyIHRyYW5zbGF0ZWRbNF07CisJCWludCBjb3VudCA9IDA7CisKKwkJLyogUHJvY2VzcyBvbmUgZ3JvdXAgb2YgNCBjaGFycyAqLworCQl3aGlsZSAoY291bnQgPCA0KSB7CisJCQljaGFyICp0YWJsZV9wdHI7CisJCQlpbnQgY2g7CisKKwkJCS8qIEdldCBuZXh0IF92YWxpZF8gY2hhcmFjdGVyLgorCQkJICogYmJfdXVlbmNfdGJsX2Jhc2U2NFtdIGNvbnRhaW5zIHRoaXMgc3RyaW5nOgorCQkJICogIDAgICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgNSAgICAgICAgIDYKKwkJCSAqICAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUKKwkJCSAqICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxuIgorCQkJICovCisJCQlkbyB7CisJCQkJY2ggPSBmZ2V0YyhzcmNfc3RyZWFtKTsKKwkJCQlpZiAoY2ggPT0gZXhpdF9jaGFyICYmIGNvdW50ID09IDApCisJCQkJCXJldHVybjsKKwkJCQlpZiAoY2ggPT0gRU9GKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidHJ1bmNhdGVkIGJhc2U2NCBpbnB1dCIpOworCQkJCXRhYmxlX3B0ciA9IHN0cmNocihiYl91dWVuY190YmxfYmFzZTY0LCBjaCk7CisvL1RPRE86IGFkZCBCQVNFNjRfRkxBR19mb28gdG8gZGllIG9uIGJhZCBjaGFyPworLy9Ob3RlIHRoYXQgdGhlbiB3ZSBtYXkgbmVlZCB0byBzdGlsbCBhbGxvdyAnXHInIChmb3IgbWFpbCBwcm9jZXNzaW5nKQorCQkJfSB3aGlsZSAoIXRhYmxlX3B0cik7CisKKwkJCS8qIENvbnZlcnQgZW5jb2RlZCBjaGFyYWN0ZXIgdG8gZGVjaW1hbCAqLworCQkJY2ggPSB0YWJsZV9wdHIgLSBiYl91dWVuY190YmxfYmFzZTY0OworCisJCQlpZiAoY2ggPT0gNjUgLyogJ1xuJyAqLykgeworCQkJCS8qIFRlcm1pbmF0aW5nICI9PT09IiBsaW5lPyAqLworCQkJCWlmICh1dV9zdHlsZV9lbmQgJiYgdGVybV9jb3VudCA9PSA0KQorCQkJCQlyZXR1cm47IC8qIHllcyAqLworCQkJCXRlcm1fY291bnQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogY2ggaXMgNjQgaWYgY2hhciB3YXMgJz0nLCBvdGhlcndpc2UgMC4uNjMgKi8KKwkJCXRyYW5zbGF0ZWRbY291bnRdID0gY2ggJiA2MzsgLyogNjQgLT4gMCAqLworCQkJaWYgKGNoID09IDY0KSB7CisJCQkJdGVybV9jb3VudCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJY291bnQrKzsKKwkJCXRlcm1fY291bnQgPSAwOworCQl9CisKKwkJLyogTWVyZ2UgNiBiaXQgY2hhcnMgdG8gOCBiaXQuCisJCSAqIGNvdW50IGNhbiBiZSA8IDQgd2hlbiB3ZSBkZWNvZGUgdGhlIHRhaWw6CisJCSAqICJlUT09IiAtPiAieSIsIG5vdCAieSBOVUwgTlVMIgorCQkgKi8KKwkJaWYgKGNvdW50ID4gMSkKKwkJCWZwdXRjKHRyYW5zbGF0ZWRbMF0gPDwgMiB8IHRyYW5zbGF0ZWRbMV0gPj4gNCwgZHN0X3N0cmVhbSk7CisJCWlmIChjb3VudCA+IDIpCisJCQlmcHV0Yyh0cmFuc2xhdGVkWzFdIDw8IDQgfCB0cmFuc2xhdGVkWzJdID4+IDIsIGRzdF9zdHJlYW0pOworCQlpZiAoY291bnQgPiAzKQorCQkJZnB1dGModHJhbnNsYXRlZFsyXSA8PCA2IHwgdHJhbnNsYXRlZFszXSwgZHN0X3N0cmVhbSk7CisJfSAvKiB3aGlsZSAoMSkgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3ZkcHJpbnRmLmMgYi9saWJiYi92ZHByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWI0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi92ZHByaW50Zi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fIDwgMgoraW50IEZBU1RfRlVOQyB2ZHByaW50ZihpbnQgZCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCWNoYXIgYnVmW0JVRl9TSVpFXTsKKwlpbnQgbGVuOworCisJbGVuID0gdnNucHJpbnRmKGJ1ZiwgQlVGX1NJWkUsIGZvcm1hdCwgYXApOworCXJldHVybiB3cml0ZShkLCBidWYsIGxlbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3ZlcnJvcl9tc2cuYyBiL2xpYmJiL3ZlcnJvcl9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk1YmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdmVycm9yX21zZy5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworc21hbGxpbnQgbG9nbW9kZSA9IExPR01PREVfU1RESU87Citjb25zdCBjaGFyICptc2dfZW9sID0gIlxuIjsKKwordm9pZCBGQVNUX0ZVTkMgYmJfdmVycm9yX21zZyhjb25zdCBjaGFyICpzLCB2YV9saXN0IHAsIGNvbnN0IGNoYXIqIHN0cmVycikKK3sKKwljaGFyICptc2csICptc2cxOworCWludCBhcHBsZXRfbGVuLCBzdHJlcnJfbGVuLCBtc2dlb2xfbGVuLCB1c2VkOworCisJaWYgKCFsb2dtb2RlKQorCQlyZXR1cm47CisKKwlpZiAoIXMpIC8qIG5vbXNnW19hbmRfZGllXSB1c2VzIE5VTEwgZm10ICovCisJCXMgPSAiIjsgLyogc29tZSBsaWJjIGRvbid0IGxpa2UgcHJpbnRmKE5VTEwpICovCisKKwl1c2VkID0gdmFzcHJpbnRmKCZtc2csIHMsIHApOworCWlmICh1c2VkIDwgMCkKKwkJcmV0dXJuOworCisJLyogVGhpcyBpcyB1Z2x5IGFuZCBjb3N0cyArNjAgYnl0ZXMgY29tcGFyZWQgdG8gbXVsdGlwbGUKKwkgKiBmcHJpbnRmJ3MsIGJ1dCBpcyBndWFyYW50ZWVkIHRvIGRvIGEgc2luZ2xlIHdyaXRlLgorCSAqIFRoaXMgaXMgbmVlZGVkIGZvciBlLmcuIGh0dHBkIGxvZ2dpbmcsIHdoZW4gbXVsdGlwbGUKKwkgKiBjaGlsZHJlbiBjYW4gcHJvZHVjZSBsb2cgbWVzc2FnZXMgc2ltdWx0YW5lb3VzbHkuICovCisKKwlhcHBsZXRfbGVuID0gc3RybGVuKGFwcGxldF9uYW1lKSArIDI7IC8qICJhcHBsZXQ6ICIgKi8KKwlzdHJlcnJfbGVuID0gc3RyZXJyID8gc3RybGVuKHN0cmVycikgOiAwOworCW1zZ2VvbF9sZW4gPSBzdHJsZW4obXNnX2VvbCk7CisJLyogY2FuJ3QgdXNlIHhyZWFsbG9jOiBpdCBjYWxscyBlcnJvcl9tc2cgb24gZmFpbHVyZSwKKwkgKiB0aGF0IG1heSByZXN1bHQgaW4gYSByZWN1cnNpb24gKi8KKwkvKiArMyBpcyBmb3IgIjogIiBiZWZvcmUgc3RyZXJyIGFuZCBmb3IgdGVybWluYXRpbmcgTlVMICovCisJbXNnMSA9IHJlYWxsb2MobXNnLCBhcHBsZXRfbGVuICsgdXNlZCArIHN0cmVycl9sZW4gKyBtc2dlb2xfbGVuICsgMyk7CisJaWYgKCFtc2cxKSB7CisJCW1zZ1t1c2VkKytdID0gJ1xuJzsgLyogb3ZlcndyaXRlcyBOVUwgKi8KKwkJYXBwbGV0X2xlbiA9IDA7CisJfSBlbHNlIHsKKwkJbXNnID0gbXNnMTsKKwkJLyogVE9ETzogbWF5YmUgdXNlIHdyaXRldiBpbnN0ZWFkIG9mIG1lbW1vdmluZz8gTmVlZCBmdWxsX3dyaXRldj8gKi8KKwkJbWVtbW92ZShtc2cgKyBhcHBsZXRfbGVuLCBtc2csIHVzZWQpOworCQl1c2VkICs9IGFwcGxldF9sZW47CisJCXN0cmNweShtc2csIGFwcGxldF9uYW1lKTsKKwkJbXNnW2FwcGxldF9sZW4gLSAyXSA9ICc6JzsKKwkJbXNnW2FwcGxldF9sZW4gLSAxXSA9ICcgJzsKKwkJaWYgKHN0cmVycikgeworCQkJaWYgKHNbMF0pIHsgLyogbm90IHBlcnJvcl9ub21zZz8gKi8KKwkJCQltc2dbdXNlZCsrXSA9ICc6JzsKKwkJCQltc2dbdXNlZCsrXSA9ICcgJzsKKwkJCX0KKwkJCXN0cmNweSgmbXNnW3VzZWRdLCBzdHJlcnIpOworCQkJdXNlZCArPSBzdHJlcnJfbGVuOworCQl9CisJCXN0cmNweSgmbXNnW3VzZWRdLCBtc2dfZW9sKTsKKwkJdXNlZCArPSBtc2dlb2xfbGVuOworCX0KKworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TVERJTykgeworCQlmZmx1c2hfYWxsKCk7CisJCWZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgbXNnLCB1c2VkKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HCisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NZU0xPRykgeworCQlzeXNsb2coTE9HX0VSUiwgIiVzIiwgbXNnICsgYXBwbGV0X2xlbik7CisJfQorI2VuZGlmCisJZnJlZShtc2cpOworfQorCisjaWZkZWYgVkVSU0lPTl9XSVRIX1dSSVRFVgorLyogQ29kZSBzaXplIGlzIGFwcHJveGltYXRlbHkgdGhlIHNhbWUsIGJ1dCBjdXJyZW50bHkgaXQncyB0aGUgb25seSB1c2VyCisgKiBvZiB3cml0ZXYgaW4gZW50aXJlIGJib3guIF9fbGliY193cml0ZXYgaW4gdWNsaWJjIGlzIH41MCBieXRlcy4gKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX3ZlcnJvcl9tc2coY29uc3QgY2hhciAqcywgdmFfbGlzdCBwLCBjb25zdCBjaGFyKiBzdHJlcnIpCit7CisJaW50IHN0cmVycl9sZW4sIG1zZ2VvbF9sZW47CisJc3RydWN0IGlvdmVjIGlvdlszXTsKKworI2RlZmluZSB1c2VkICAgKGlvdlsyXS5pb3ZfbGVuKQorI2RlZmluZSBtc2d2ICAgKGlvdlsyXS5pb3ZfYmFzZSkKKyNkZWZpbmUgbXNnYyAgICgoY2hhciopKGlvdlsyXS5pb3ZfYmFzZSkpCisjZGVmaW5lIG1zZ3B0ciAoJihpb3ZbMl0uaW92X2Jhc2UpKQorCisJaWYgKCFsb2dtb2RlKQorCQlyZXR1cm47CisKKwlpZiAoIXMpIC8qIG5vbXNnW19hbmRfZGllXSB1c2VzIE5VTEwgZm10ICovCisJCXMgPSAiIjsgLyogc29tZSBsaWJjIGRvbid0IGxpa2UgcHJpbnRmKE5VTEwpICovCisKKwkvKiBQcmV2ZW50ICJkZXJlZmluZyB0eXBlLXB1bm5lZCBwdHIgd2lsbCBicmVhayBhbGlhc2luZyBydWxlcyIgKi8KKwl1c2VkID0gdmFzcHJpbnRmKChjaGFyKiopKHZvaWQqKW1zZ3B0ciwgcywgcCk7CisJaWYgKHVzZWQgPCAwKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGlzIHVnbHkgYW5kIGNvc3RzICs2MCBieXRlcyBjb21wYXJlZCB0byBtdWx0aXBsZQorCSAqIGZwcmludGYncywgYnV0IGlzIGd1YXJhbnRlZWQgdG8gZG8gYSBzaW5nbGUgd3JpdGUuCisJICogVGhpcyBpcyBuZWVkZWQgZm9yIGUuZy4gaHR0cGQgbG9nZ2luZywgd2hlbiBtdWx0aXBsZQorCSAqIGNoaWxkcmVuIGNhbiBwcm9kdWNlIGxvZyBtZXNzYWdlcyBzaW11bHRhbmVvdXNseS4gKi8KKworCXN0cmVycl9sZW4gPSBzdHJlcnIgPyBzdHJsZW4oc3RyZXJyKSA6IDA7CisJbXNnZW9sX2xlbiA9IHN0cmxlbihtc2dfZW9sKTsKKwkvKiArMyBpcyBmb3IgIjogIiBiZWZvcmUgc3RyZXJyIGFuZCBmb3IgdGVybWluYXRpbmcgTlVMICovCisJbXNndiA9IHhyZWFsbG9jKG1zZ3YsIHVzZWQgKyBzdHJlcnJfbGVuICsgbXNnZW9sX2xlbiArIDMpOworCWlmIChzdHJlcnIpIHsKKwkJbXNnY1t1c2VkKytdID0gJzonOworCQltc2djW3VzZWQrK10gPSAnICc7CisJCXN0cmNweShtc2djICsgdXNlZCwgc3RyZXJyKTsKKwkJdXNlZCArPSBzdHJlcnJfbGVuOworCX0KKwlzdHJjcHkobXNnYyArIHVzZWQsIG1zZ19lb2wpOworCXVzZWQgKz0gbXNnZW9sX2xlbjsKKworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TVERJTykgeworCQlpb3ZbMF0uaW92X2Jhc2UgPSAoY2hhciopYXBwbGV0X25hbWU7CisJCWlvdlswXS5pb3ZfbGVuID0gc3RybGVuKGFwcGxldF9uYW1lKTsKKwkJaW92WzFdLmlvdl9iYXNlID0gKGNoYXIqKSI6ICI7CisJCWlvdlsxXS5pb3ZfbGVuID0gMjsKKwkJLyppb3ZbMl0uaW92X2Jhc2UgPSBtc2djOyovCisJCS8qaW92WzJdLmlvdl9sZW4gPSB1c2VkOyovCisJCWZmbHVzaF9hbGwoKTsKKwkJd3JpdGV2KFNUREVSUl9GSUxFTk8sIGlvdiwgMyk7CisJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1lTTE9HKSB7CisJCXN5c2xvZyhMT0dfRVJSLCAiJXMiLCBtc2djKTsKKwl9CisjIGVuZGlmCisJZnJlZShtc2djKTsKK30KKyNlbmRpZgorCisKK3ZvaWQgRkFTVF9GVU5DIGJiX2Vycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKwl2YV9saXN0IHA7CisKKwl2YV9zdGFydChwLCBzKTsKKwliYl92ZXJyb3JfbXNnKHMsIHAsIE5VTEwpOworCXZhX2VuZChwKTsKKwl4ZnVuY19kaWUoKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKwl2YV9saXN0IHA7CisKKwl2YV9zdGFydChwLCBzKTsKKwliYl92ZXJyb3JfbXNnKHMsIHAsIE5VTEwpOworCXZhX2VuZChwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3Zmb3JrX2RhZW1vbl9yZXhlYy5jIGIvbGliYmIvdmZvcmtfZGFlbW9uX3JleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1ZWFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3Zmb3JrX2RhZW1vbl9yZXhlYy5jCkBAIC0wLDAgKzEsMjczIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSZXhlYyBwcm9ncmFtIGZvciBzeXN0ZW0gaGF2ZSBmb3JrKCkgYXMgdmZvcmsoKSB3aXRoIGZvcmVncm91bmQgb3B0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSBWbGFkaW1pciBOLiBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4KKyAqCisgKiBkYWVtb24oKSBwb3J0aW9uIHRha2VuIGZyb20gdUNsaWJjOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBNb2RpZmllZCBmb3IgdUNsaWJjIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VlQGRlYmlhbi5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAiYnVzeWJveC5oIiAvKiB1c2VzIGFwcGxldCB0YWJsZXMgKi8KKworLyogVGhpcyBkb2VzIGEgZm9yay9leGVjIGluIG9uZSBjYWxsLCB1c2luZyB2Zm9yaygpLiAgUmV0dXJucyBQSUQgb2YgbmV3IGNoaWxkLAorICogLTEgZm9yIGZhaWx1cmUuICBSdW5zIGFyZ3ZbMF0sIHNlYXJjaGluZyBwYXRoIGlmIHRoYXQgaGFzIG5vIC8gaW4gaXQuICovCitwaWRfdCBGQVNUX0ZVTkMgc3Bhd24oY2hhciAqKmFyZ3YpCit7CisJLyogQ29tcGlsZXIgc2hvdWxkIG5vdCBvcHRpbWl6ZSBzdG9yZXMgaGVyZSAqLworCXZvbGF0aWxlIGludCBmYWlsZWQ7CisJcGlkX3QgcGlkOworCisJZmZsdXNoX2FsbCgpOworCisJLyogQmUgbmljZSB0byBub21tdSBtYWNoaW5lcy4gKi8KKwlmYWlsZWQgPSAwOworCXBpZCA9IHZmb3JrKCk7CisJaWYgKHBpZCA8IDApIC8qIGVycm9yICovCisJCXJldHVybiBwaWQ7CisJaWYgKCFwaWQpIHsgLyogY2hpbGQgKi8KKwkJLyogVGhpcyBtYWNybyBpcyBvayAtIGl0IGRvZXNuJ3QgZG8gTk9FWEVDL05PRk9SSyB0cmlja3MgKi8KKwkJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCisJCS8qIFdlIGFyZSAobWF5YmUpIHNoYXJpbmcgYSBzdGFjayB3aXRoIGJsb2NrZWQgcGFyZW50LAorCQkgKiBsZXQgcGFyZW50IGtub3cgd2UgZmFpbGVkIGFuZCB0aGVuIGV4aXQgdG8gdW5ibG9jayBwYXJlbnQKKwkJICogKGJ1dCBkb24ndCBydW4gYXRleGl0KCkgc3R1ZmYsIHdoaWNoIHdvdWxkIHNjcmV3IHVwIHBhcmVudC4pCisJCSAqLworCQlmYWlsZWQgPSBlcnJubzsKKwkJLyogbW91bnQsIGZvciBleGFtcGxlLCBkb2VzIG5vdCB3YW50IHRoZSBtZXNzYWdlICovCisJCS8qYmJfcGVycm9yX21zZygiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYXJndlswXSk7Ki8KKwkJX2V4aXQoMTExKTsKKwl9CisJLyogcGFyZW50ICovCisJLyogVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBub3QgcmVsaWFibGU6IGFjY29yZGluZyB0byBzdGFuZGFyZHMKKwkgKiB2Zm9yaygpIGNhbiBiZSBlcXVpdmFsZW50IHRvIGZvcmsoKSBhbmQgd2Ugd29uJ3Qgc2VlIHZhbHVlCisJICogb2YgJ2ZhaWxlZCcuCisJICogSW50ZXJlc3RlZCBwYXJ0eSBjYW4gd2FpdCBvbiBwaWQgYW5kIGxlYXJuIGV4aXQgY29kZS4KKwkgKiBJZiAxMTEgLSB0aGVuIGl0IChtb3N0IHByb2JhYmx5KSBmYWlsZWQgdG8gZXhlYyAqLworCWlmIChmYWlsZWQpIHsKKwkJc2FmZV93YWl0cGlkKHBpZCwgTlVMTCwgMCk7IC8qIHByZXZlbnQgem9tYmllICovCisJCWVycm5vID0gZmFpbGVkOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBwaWQ7Cit9CisKKy8qIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3Qgc3Bhd24gYSBjaGlsZCBwcm9jZXNzLiAqLworcGlkX3QgRkFTVF9GVU5DIHhzcGF3bihjaGFyICoqYXJndikKK3sKKwlwaWRfdCBwaWQgPSBzcGF3bihhcmd2KTsKKwlpZiAocGlkIDwgMCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZSgqYXJndik7CisJcmV0dXJuIHBpZDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCitzdHJ1Y3Qgbm9mb3JrX3NhdmVfYXJlYSB7CisJam1wX2J1ZiBkaWVfam1wOworCWNvbnN0IGNoYXIgKmFwcGxldF9uYW1lOworCXVpbnQzMl90IG9wdGlvbl9tYXNrMzI7CisJaW50IGRpZV9zbGVlcDsKKwl1aW50OF90IHhmdW5jX2Vycm9yX3JldHZhbDsKK307CitzdGF0aWMgdm9pZCBzYXZlX25vZm9ya19kYXRhKHN0cnVjdCBub2Zvcmtfc2F2ZV9hcmVhICpzYXZlKQoreworCW1lbWNweSgmc2F2ZS0+ZGllX2ptcCwgJmRpZV9qbXAsIHNpemVvZihkaWVfam1wKSk7CisJc2F2ZS0+YXBwbGV0X25hbWUgPSBhcHBsZXRfbmFtZTsKKwlzYXZlLT54ZnVuY19lcnJvcl9yZXR2YWwgPSB4ZnVuY19lcnJvcl9yZXR2YWw7CisJc2F2ZS0+b3B0aW9uX21hc2szMiA9IG9wdGlvbl9tYXNrMzI7CisJc2F2ZS0+ZGllX3NsZWVwID0gZGllX3NsZWVwOworfQorc3RhdGljIHZvaWQgcmVzdG9yZV9ub2ZvcmtfZGF0YShzdHJ1Y3Qgbm9mb3JrX3NhdmVfYXJlYSAqc2F2ZSkKK3sKKwltZW1jcHkoJmRpZV9qbXAsICZzYXZlLT5kaWVfam1wLCBzaXplb2YoZGllX2ptcCkpOworCWFwcGxldF9uYW1lID0gc2F2ZS0+YXBwbGV0X25hbWU7CisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gc2F2ZS0+eGZ1bmNfZXJyb3JfcmV0dmFsOworCW9wdGlvbl9tYXNrMzIgPSBzYXZlLT5vcHRpb25fbWFzazMyOworCWRpZV9zbGVlcCA9IHNhdmUtPmRpZV9zbGVlcDsKK30KKworaW50IEZBU1RfRlVOQyBydW5fbm9mb3JrX2FwcGxldChpbnQgYXBwbGV0X25vLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmMsIGFyZ2M7CisJc3RydWN0IG5vZm9ya19zYXZlX2FyZWEgb2xkOworCisJc2F2ZV9ub2ZvcmtfZGF0YSgmb2xkKTsKKworCWFwcGxldF9uYW1lID0gQVBQTEVUX05BTUUoYXBwbGV0X25vKTsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IEVYSVRfRkFJTFVSRTsKKworCS8qIEluIGNhc2UgZ2V0b3B0KCkgb3IgZ2V0b3B0MzIoKSB3YXMgYWxyZWFkeSBjYWxsZWQ6CisJICogcmVzZXQgdGhlIGxpYmMgZ2V0b3B0KCkgZnVuY3Rpb24sIHdoaWNoIGtlZXBzIGludGVybmFsIHN0YXRlLgorCSAqCisJICogQlNELWRlcml2ZWQgZ2V0b3B0KCkgZnVuY3Rpb25zIHJlcXVpcmUgdGhhdCBvcHRpbmQgYmUgc2V0IHRvIDEgaW4KKwkgKiBvcmRlciB0byByZXNldCBnZXRvcHQoKSBzdGF0ZS4gIFRoaXMgdXNlZCB0byBiZSBnZW5lcmFsbHkgYWNjZXB0ZWQKKwkgKiB3YXkgb2YgcmVzZXR0aW5nIGdldG9wdCgpLiAgSG93ZXZlciwgZ2xpYmMncyBnZXRvcHQoKQorCSAqIGhhcyBhZGRpdGlvbmFsIGdldG9wdCgpIHN0YXRlIGJleW9uZCBvcHRpbmQsIGFuZCByZXF1aXJlcyB0aGF0CisJICogb3B0aW5kIGJlIHNldCB0byB6ZXJvIHRvIHJlc2V0IGl0cyBzdGF0ZS4gIFNvIHRoZSB1bmZvcnR1bmF0ZSBzdGF0ZSBvZgorCSAqIGFmZmFpcnMgaXMgdGhhdCBCU0QtZGVyaXZlZCB2ZXJzaW9ucyBvZiBnZXRvcHQoKSBtaXNiZWhhdmUgaWYKKwkgKiBvcHRpbmQgaXMgc2V0IHRvIDAgaW4gb3JkZXIgdG8gcmVzZXQgZ2V0b3B0KCksIGFuZCBnbGliYydzIGdldG9wdCgpCisJICogd2lsbCBjb3JlIGR1bXAgaWYgb3B0aW5kIGlzIHNldCAxIGluIG9yZGVyIHRvIHJlc2V0IGdldG9wdCgpLgorCSAqCisJICogTW9yZSBtb2Rlcm4gdmVyc2lvbnMgb2YgQlNEIHJlcXVpcmUgdGhhdCBvcHRyZXNldCBiZSBzZXQgdG8gMSBpbgorCSAqIG9yZGVyIHRvIHJlc2V0IGdldG9wdCgpLiAgU2lnaC4gIFN0YW5kYXJkcywgYW55b25lPworCSAqLworI2lmZGVmIF9fR0xJQkNfXworCW9wdGluZCA9IDA7CisjZWxzZSAvKiBCU0Qgc3R5bGUgKi8KKwlvcHRpbmQgPSAxOworCS8qIG9wdHJlc2V0ID0gMTsgKi8KKyNlbmRpZgorCS8qIG9wdGFyZyA9IE5VTEw7IG9wdGVyciA9IDE7IG9wdG9wdCA9IDYzOyAtIGRvIHdlIG5lZWQgdGhpcyB0b28/ICovCisJLyogKHZhbHVlcyBhYm92ZSBhcmUgd2hhdCB0aGV5IGluaXRpYWxpemVkIHRvIGluIGdsaWJjIGFuZCB1Y2xpYmMpICovCisJLyogb3B0aW9uX21hc2szMiA9IDA7IC0gbm90IG5lZWRlZCwgbm8gYXBwbGV0IGRlcGVuZHMgb24gaXQgYmVpbmcgMCAqLworCisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ3ZbYXJnY10pCisJCWFyZ2MrKzsKKworCS8qIFNwZWNpYWwgZmxhZyBmb3IgeGZ1bmNfZGllKCkuIElmIHhmdW5jIHdpbGwgImRpZSIKKwkgKiBpbiBOT0ZPUksgYXBwbGV0LCB4ZnVuY19kaWUoKSBzZWVzIG5lZ2F0aXZlCisJICogZGllX3NsZWVwIGFuZCBsb25nam1wIGhlcmUgaW5zdGVhZC4gKi8KKwlkaWVfc2xlZXAgPSAtMTsKKworCXJjID0gc2V0am1wKGRpZV9qbXApOworCWlmICghcmMpIHsKKwkJLyogU29tZSBjYWxsZXJzICh4YXJncykKKwkJICogbmVlZCBhcmd2IHVudG91Y2hlZCBiZWNhdXNlIHRoZXkgZnJlZSBhcmd2W2ldISAqLworCQljaGFyICp0bXBfYXJndlthcmdjKzFdOworCQltZW1jcHkodG1wX2FyZ3YsIGFyZ3YsIChhcmdjKzEpICogc2l6ZW9mKHRtcF9hcmd2WzBdKSk7CisJCS8qIEZpbmFsbHkgd2UgY2FuIGNhbGwgTk9GT1JLIGFwcGxldCdzIG1haW4oKSAqLworCQlyYyA9IGFwcGxldF9tYWluW2FwcGxldF9ub10oYXJnYywgdG1wX2FyZ3YpOworCX0gZWxzZSB7IC8qIHhmdW5jIGRpZWQgaW4gTk9GT1JLIGFwcGxldCAqLworCQkvKiBpbiBjYXNlIHRoZXkgbWVhbnQgdG8gcmV0dXJuIDAuLi4gKi8KKwkJaWYgKHJjID09IC0yMjIyKQorCQkJcmMgPSAwOworCX0KKworCS8qIFJlc3RvcmluZyBzb21lIGdsb2JhbHMgKi8KKwlyZXN0b3JlX25vZm9ya19kYXRhKCZvbGQpOworCisJLyogT3RoZXIgZ2xvYmFscyBjYW4gYmUgc2ltcGx5IHJlc2V0IHRvIGRlZmF1bHRzICovCisjaWZkZWYgX19HTElCQ19fCisJb3B0aW5kID0gMDsKKyNlbHNlIC8qIEJTRCBzdHlsZSAqLworCW9wdGluZCA9IDE7CisjZW5kaWYKKworCXJldHVybiByYyAmIDB4ZmY7IC8qIGRvbid0IGNvbmZ1c2UgcGVvcGxlIHdpdGggImV4aXRjb2RlcyIgPjI1NSAqLworfQorI2VuZGlmIC8qIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMgKi8KKworaW50IEZBU1RfRlVOQyBzcGF3bl9hbmRfd2FpdChjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwlpbnQgYSA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXJndlswXSk7CisKKwlpZiAoYSA+PSAwICYmIChBUFBMRVRfSVNfTk9GT1JLKGEpCisjIGlmIEJCX01NVQorCQkJfHwgQVBQTEVUX0lTX05PRVhFQyhhKSAvKiBOT0VYRUMgdHJpY2sgbmVlZHMgZm9yaygpICovCisjIGVuZGlmCisJKSkgeworIyBpZiBCQl9NTVUKKwkJaWYgKEFQUExFVF9JU19OT0ZPUksoYSkpCisjIGVuZGlmCisJCXsKKwkJCXJldHVybiBydW5fbm9mb3JrX2FwcGxldChhLCBhcmd2KTsKKwkJfQorIyBpZiBCQl9NTVUKKwkJLyogTU1VIG9ubHkgKi8KKwkJLyogYS0+bm9leGVjIGlzIHRydWUgKi8KKwkJcmMgPSBmb3JrKCk7CisJCWlmIChyYykgLyogcGFyZW50IG9yIGVycm9yICovCisJCQlyZXR1cm4gd2FpdDRwaWQocmMpOworCQkvKiBjaGlsZCAqLworCQl4ZnVuY19lcnJvcl9yZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYSwgYXJndik7CisjIGVuZGlmCisJfQorI2VuZGlmIC8qIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMgKi8KKwlyYyA9IHNwYXduKGFyZ3YpOworCXJldHVybiB3YWl0NHBpZChyYyk7Cit9CisKKyNpZiAhQkJfTU1VCit2b2lkIEZBU1RfRlVOQyByZV9leGVjKGNoYXIgKiphcmd2KQoreworCS8qIGhpZ2gtb3JkZXIgYml0IG9mIGZpcnN0IGNoYXIgaW4gYXJndlswXSBpcyBhIGhpZGRlbgorCSAqICJ3ZSBoYXZlIChhbHJlYWR5KSByZS1leGVjZWQsIGRvbid0IGRvIGl0IGFnYWluIiBmbGFnICovCisJYXJndlswXVswXSB8PSAweDgwOworCWV4ZWN2KGJiX2J1c3lib3hfZXhlY19wYXRoLCBhcmd2KTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGJiX2J1c3lib3hfZXhlY19wYXRoKTsKK30KKworcGlkX3QgRkFTVF9GVU5DIGZvcmtfb3JfcmV4ZWMoY2hhciAqKmFyZ3YpCit7CisJcGlkX3QgcGlkOworCS8qIE1heWJlIHdlIGFyZSBhbHJlYWR5IHJlLWV4ZWNlZCBhbmQgY29tZSBoZXJlIGFnYWluPyAqLworCWlmIChyZV9leGVjZWQpCisJCXJldHVybiAwOworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQpIC8qIHBhcmVudCAqLworCQlyZXR1cm4gcGlkOworCS8qIGNoaWxkIC0gcmUtZXhlYyBvdXJzZWxmICovCisJcmVfZXhlYyhhcmd2KTsKK30KKyNlbmRpZgorCisvKiBEdWUgdG8gYSAjZGVmaW5lIGluIGxpYmJiLmggb24gTU1VIHN5c3RlbXMgd2UgYWN0dWFsbHkgaGF2ZSAxIGFyZ3VtZW50IC0KKyAqIGNoYXIgKiphcmd2ICJ2YW5pc2hlcyIgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyhpbnQgZmxhZ3MsIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKworCWlmIChmbGFncyAmIERBRU1PTl9DSERJUl9ST09UKQorCQl4Y2hkaXIoIi8iKTsKKworCWlmIChmbGFncyAmIERBRU1PTl9ERVZOVUxMX1NURElPKSB7CisJCWNsb3NlKDApOworCQljbG9zZSgxKTsKKwkJY2xvc2UoMik7CisJfQorCisJZmQgPSBvcGVuKGJiX2Rldl9udWxsLCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJLyogTkI6IHdlIGNhbiBiZSBjYWxsZWQgYXMgYmJfc2FuaXRpemVfc3RkaW8oKSBmcm9tIGluaXQKKwkJICogb3IgbWRldiwgYW5kIHRoZXJlIC9kZXYvbnVsbCBtYXkgbGVnaXRpbWF0ZWx5IG5vdCAoeWV0KSBleGlzdCEKKwkJICogRG8gbm90IHVzZSB4b3BlbiBhYm92ZSwgYnV0IG9idGFpbiBfQU5ZXyBvcGVuIGRlc2NyaXB0b3IsCisJCSAqIGV2ZW4gYm9ndXMgb25lIGFzIGJlbG93LiAqLworCQlmZCA9IHhvcGVuKCIvIiwgT19SRE9OTFkpOyAvKiBkb24ndCBiZWxpZXZlIHRoaXMgY2FuIGZhaWwgKi8KKwl9CisKKwl3aGlsZSAoKHVuc2lnbmVkKWZkIDwgMikKKwkJZmQgPSBkdXAoZmQpOyAvKiBoYXZlIDAsMSwyIG9wZW4gYXQgbGVhc3QgdG8gL2Rldi9udWxsICovCisKKwlpZiAoIShmbGFncyAmIERBRU1PTl9PTkxZX1NBTklUSVpFKSkgeworCQlpZiAoZm9ya19vcl9yZXhlYyhhcmd2KSkKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsgLyogcGFyZW50ICovCisJCS8qIGlmIGRhZW1vbml6aW5nLCBtYWtlIHN1cmUgd2UgZGV0YWNoIGZyb20gc3RkaW8gJiBjdHR5ICovCisJCXNldHNpZCgpOworCQlkdXAyKGZkLCAwKTsKKwkJZHVwMihmZCwgMSk7CisJCWR1cDIoZmQsIDIpOworCX0KKwl3aGlsZSAoZmQgPiAyKSB7CisJCWNsb3NlKGZkLS0pOworCQlpZiAoIShmbGFncyAmIERBRU1PTl9DTE9TRV9FWFRSQV9GRFMpKQorCQkJcmV0dXJuOworCQkvKiBlbHNlIGNsb3NlIGV2ZXJ5dGhpbmcgYWZ0ZXIgZmQjMiAqLworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfc2FuaXRpemVfc3RkaW8odm9pZCkKK3sKKwliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX09OTFlfU0FOSVRJWkUsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvd2Fybl9pZ25vcmluZ19hcmdzLmMgYi9saWJiYi93YXJuX2lnbm9yaW5nX2FyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMwMjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvd2Fybl9pZ25vcmluZ19hcmdzLmMKQEAgLTAsMCArMSwxOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogd2Fybl9pZ25vcmluZ19hcmdzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfREVTS1RPUAordm9pZCBGQVNUX0ZVTkMgYmJfd2Fybl9pZ25vcmluZ19hcmdzKGNoYXIgKmFyZykKK3sKKwlpZiAoYXJnKSB7CisJCWJiX2Vycm9yX21zZygiaWdub3JpbmcgYWxsIGFyZ3VtZW50cyIpOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvd2ZvcGVuLmMgYi9saWJiYi93Zm9wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmRjOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvd2ZvcGVuLmMKQEAgLTAsMCArMSw1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworRklMRSogRkFTVF9GVU5DIGZvcGVuX29yX3dhcm4oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkKK3sKKwlGSUxFICpmcCA9IGZvcGVuKHBhdGgsIG1vZGUpOworCWlmICghZnApIHsKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2cocGF0aCk7CisJCS8vZXJybm8gPSAwOyAvKiB3aHk/ICovCisJfQorCXJldHVybiBmcDsKK30KKworRklMRSogRkFTVF9GVU5DIGZvcGVuX2Zvcl9yZWFkKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIGZvcGVuKHBhdGgsICJyIik7Cit9CisKK0ZJTEUqIEZBU1RfRlVOQyB4Zm9wZW5fZm9yX3JlYWQoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4geGZvcGVuKHBhdGgsICJyIik7Cit9CisKK0ZJTEUqIEZBU1RfRlVOQyBmb3Blbl9mb3Jfd3JpdGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4gZm9wZW4ocGF0aCwgInciKTsKK30KKworRklMRSogRkFTVF9GVU5DIHhmb3Blbl9mb3Jfd3JpdGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlyZXR1cm4geGZvcGVuKHBhdGgsICJ3Iik7Cit9CisKK3N0YXRpYyBGSUxFKiB4ZmRvcGVuX2hlbHBlcih1bnNpZ25lZCBmZF9hbmRfcndfYml0KQoreworCUZJTEUqIGZwID0gZmRvcGVuKGZkX2FuZF9yd19iaXQgPj4gMSwgZmRfYW5kX3J3X2JpdCAmIDEgPyAidyIgOiAiciIpOworCWlmICghZnApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlyZXR1cm4gZnA7Cit9CitGSUxFKiBGQVNUX0ZVTkMgeGZkb3Blbl9mb3JfcmVhZChpbnQgZmQpCit7CisJcmV0dXJuIHhmZG9wZW5faGVscGVyKGZkIDw8IDEpOworfQorRklMRSogRkFTVF9GVU5DIHhmZG9wZW5fZm9yX3dyaXRlKGludCBmZCkKK3sKKwlyZXR1cm4geGZkb3Blbl9oZWxwZXIoKGZkIDw8IDEpICsgMSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi93Zm9wZW5faW5wdXQuYyBiL2xpYmJiL3dmb3Blbl9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjFjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi93Zm9wZW5faW5wdXQuYwpAQCAtMCwwICsxLDU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3Zm9wZW5faW5wdXQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEEgbnVtYmVyIG9mIGFwcGxldHMgbmVlZCB0byBvcGVuIGEgZmlsZSBmb3IgcmVhZGluZywgd2hlcmUgdGhlIGZpbGVuYW1lCisgKiBpcyBhIGNvbW1hbmQgbGluZSBhcmcuICBTaW5jZSBvZnRlbiB0aGF0IGFyZyBpcyAnLScgKG1lYW5pbmcgc3RkaW4pLAorICogd2UgYXZvaWQgdGVzdGluZyBldmVyeXdoZXJlIGJ5IGNvbnNvbGlkYXRpbmcgdGhpbmdzIGluIHRoaXMgcm91dGluZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworRklMRSogRkFTVF9GVU5DIGZvcGVuX29yX3dhcm5fc3RkaW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZnAgPSBzdGRpbjsKKworCWlmIChmaWxlbmFtZSAhPSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQKKwkgJiYgTk9UX0xPTkVfREFTSChmaWxlbmFtZSkKKwkpIHsKKwkJZnAgPSBmb3Blbl9vcl93YXJuKGZpbGVuYW1lLCAiciIpOworCX0KKwlyZXR1cm4gZnA7Cit9CisKK0ZJTEUqIEZBU1RfRlVOQyB4Zm9wZW5fc3RkaW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZnAgPSBmb3Blbl9vcl93YXJuX3N0ZGluKGZpbGVuYW1lKTsKKwlpZiAoZnApCisJCXJldHVybiBmcDsKKwl4ZnVuY19kaWUoKTsgIC8qIFdlIGFscmVhZHkgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UuICovCit9CisKK2ludCBGQVNUX0ZVTkMgb3Blbl9vcl93YXJuX3N0ZGluKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBmZCA9IFNURElOX0ZJTEVOTzsKKworCWlmIChmaWxlbmFtZSAhPSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQKKwkgJiYgTk9UX0xPTkVfREFTSChmaWxlbmFtZSkKKwkpIHsKKwkJZmQgPSBvcGVuX29yX3dhcm4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwl9CisKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgeG9wZW5fc3RkaW4oY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGZkID0gb3Blbl9vcl93YXJuX3N0ZGluKGZpbGVuYW1lKTsKKwlpZiAoZmQgPj0gMCkKKwkJcmV0dXJuIGZkOworCXhmdW5jX2RpZSgpOyAgLyogV2UgYWxyZWFkeSBvdXRwdXQgYW4gZXJyb3IgbWVzc2FnZS4gKi8KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3dyaXRlLmMgYi9saWJiYi93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjdhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi93cml0ZS5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE9wZW4gZmlsZSBhbmQgd3JpdGUgc3RyaW5nIHN0ciB0byBpdCwgY2xvc2UgZmlsZS4KKyAqIERpZSBvbiBhbnkgb3BlbiBvciB3cml0ZSBlcnJvci4gICovCit2b2lkIEZBU1RfRlVOQyB4b3Blbl94d3JpdGVfY2xvc2UoY29uc3QgY2hhciogZmlsZSwgY29uc3QgY2hhciogc3RyKQoreworCWludCBmZCA9IHhvcGVuKGZpbGUsIE9fV1JPTkxZKTsKKwl4d3JpdGVfc3RyKGZkLCBzdHIpOworCWNsb3NlKGZkKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3hhdG9udW0uYyBiL2xpYmJiL3hhdG9udW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJiZTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGF0b251bS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFzY2lpLXRvLW51bWJlcnMgaW1wbGVtZW50YXRpb25zIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSB0eXBlIGxvbmcgbG9uZworI2RlZmluZSB4c3RydG91KHJlc3QpIHhzdHJ0b3VsbCMjcmVzdAorI2RlZmluZSB4c3RydG8ocmVzdCkgeHN0cnRvbGwjI3Jlc3QKKyNkZWZpbmUgeGF0b3UocmVzdCkgeGF0b3VsbCMjcmVzdAorI2RlZmluZSB4YXRvKHJlc3QpIHhhdG9sbCMjcmVzdAorI2RlZmluZSBYU1RSX1VUWVBFX01BWCBVTExPTkdfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NQVggTExPTkdfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NSU4gTExPTkdfTUlOCisjZGVmaW5lIFhTVFJfU1RSVE9VIHN0cnRvdWxsCisjaW5jbHVkZSAieGF0b251bV90ZW1wbGF0ZS5jIgorCisjaWYgVUxPTkdfTUFYICE9IFVMTE9OR19NQVgKKyNkZWZpbmUgdHlwZSBsb25nCisjZGVmaW5lIHhzdHJ0b3UocmVzdCkgeHN0cnRvdWwjI3Jlc3QKKyNkZWZpbmUgeHN0cnRvKHJlc3QpIHhzdHJ0b2wjI3Jlc3QKKyNkZWZpbmUgeGF0b3UocmVzdCkgeGF0b3VsIyNyZXN0CisjZGVmaW5lIHhhdG8ocmVzdCkgeGF0b2wjI3Jlc3QKKyNkZWZpbmUgWFNUUl9VVFlQRV9NQVggVUxPTkdfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NQVggTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01JTiBMT05HX01JTgorI2RlZmluZSBYU1RSX1NUUlRPVSBzdHJ0b3VsCisjaW5jbHVkZSAieGF0b251bV90ZW1wbGF0ZS5jIgorI2VuZGlmCisKKyNpZiBVSU5UX01BWCAhPSBVTE9OR19NQVgKK3N0YXRpYyBBTFdBWVNfSU5MSU5FCit1bnNpZ25lZCBiYl9zdHJ0b3VpKGNvbnN0IGNoYXIgKnN0ciwgY2hhciAqKmVuZCwgaW50IGIpCit7CisJdW5zaWduZWQgbG9uZyB2ID0gc3RydG91bChzdHIsIGVuZCwgYik7CisJaWYgKHYgPiBVSU5UX01BWCkgeworCQllcnJubyA9IEVSQU5HRTsKKwkJcmV0dXJuIFVJTlRfTUFYOworCX0KKwlyZXR1cm4gdjsKK30KKyNkZWZpbmUgdHlwZSBpbnQKKyNkZWZpbmUgeHN0cnRvdShyZXN0KSB4c3RydG91IyNyZXN0CisjZGVmaW5lIHhzdHJ0byhyZXN0KSB4c3RydG9pIyNyZXN0CisjZGVmaW5lIHhhdG91KHJlc3QpIHhhdG91IyNyZXN0CisjZGVmaW5lIHhhdG8ocmVzdCkgeGF0b2kjI3Jlc3QKKyNkZWZpbmUgWFNUUl9VVFlQRV9NQVggVUlOVF9NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01BWCBJTlRfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NSU4gSU5UX01JTgorLyogbGliYyBoYXMgbm8gc3RydG91aSwgc28gd2UgbmVlZCB0byBjcmVhdGUvdXNlIG91ciBvd24gKi8KKyNkZWZpbmUgWFNUUl9TVFJUT1UgYmJfc3RydG91aQorI2luY2x1ZGUgInhhdG9udW1fdGVtcGxhdGUuYyIKKyNlbmRpZgorCisvKiBBIGZldyBzcGVjaWFsIGNhc2VzICovCisKK2ludCBGQVNUX0ZVTkMgeGF0b2lfcG9zaXRpdmUoY29uc3QgY2hhciAqbnVtc3RyKQoreworCXJldHVybiB4YXRvdV9yYW5nZShudW1zdHIsIDAsIElOVF9NQVgpOworfQorCit1aW50MTZfdCBGQVNUX0ZVTkMgeGF0b3UxNihjb25zdCBjaGFyICpudW1zdHIpCit7CisJcmV0dXJuIHhhdG91X3JhbmdlKG51bXN0ciwgMCwgMHhmZmZmKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3hhdG9udW1fdGVtcGxhdGUuYyBiL2xpYmJiL3hhdG9udW1fdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlmNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGF0b251bV90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qCitZb3UgbmVlZCB0byBkZWZpbmUgdGhlIGZvbGxvd2luZyAoZXhhbXBsZSk6CisKKyNkZWZpbmUgdHlwZSBsb25nCisjZGVmaW5lIHhzdHJ0b3UocmVzdCkgeHN0cnRvdWwjI3Jlc3QKKyNkZWZpbmUgeHN0cnRvKHJlc3QpIHhzdHJ0b2wjI3Jlc3QKKyNkZWZpbmUgeGF0b3UocmVzdCkgeGF0b3VsIyNyZXN0CisjZGVmaW5lIHhhdG8ocmVzdCkgeGF0b2wjI3Jlc3QKKyNkZWZpbmUgWFNUUl9VVFlQRV9NQVggVUxPTkdfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NQVggTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01JTiBMT05HX01JTgorI2RlZmluZSBYU1RSX1NUUlRPVSBzdHJ0b3VsCisqLworCit1bnNpZ25lZCB0eXBlIEZBU1RfRlVOQyB4c3RydG91KF9yYW5nZV9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IGJhc2UsCisJCXVuc2lnbmVkIHR5cGUgbG93ZXIsCisJCXVuc2lnbmVkIHR5cGUgdXBwZXIsCisJCWNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc3VmZml4ZXMpCit7CisJdW5zaWduZWQgdHlwZSByOworCWludCBvbGRfZXJybm87CisJY2hhciAqZTsKKworCS8qIERpc2FsbG93ICctJyBhbmQgYW55IGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKwlpZiAoKm51bXN0ciA9PSAnLScgfHwgKm51bXN0ciA9PSAnKycgfHwgaXNzcGFjZSgqbnVtc3RyKSkKKwkJZ290byBpbnZhbDsKKworCS8qIFNpbmNlIHRoaXMgaXMgYSBsaWIgZnVuY3Rpb24sIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIHJlc2V0IGVycm5vIHRvIDAuCisJICogRG9pbmcgc28gY291bGQgYnJlYWsgYW4gYXBwIHRoYXQgaXMgZGVmZXJyaW5nIGNoZWNraW5nIG9mIGVycm5vLgorCSAqIFNvLCBzYXZlIHRoZSBvbGQgdmFsdWUgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdCBpZiBzdWNjZXNzZnVsLiAqLworCW9sZF9lcnJubyA9IGVycm5vOworCWVycm5vID0gMDsKKwlyID0gWFNUUl9TVFJUT1UobnVtc3RyLCAmZSwgYmFzZSk7CisJLyogRG8gdGhlIGluaXRpYWwgdmFsaWRpdHkgY2hlY2suICBOb3RlOiBUaGUgc3RhbmRhcmRzIGRvIG5vdAorCSAqIGd1YXJhbnRlZSB0aGF0IGVycm5vIGlzIHNldCBpZiBubyBkaWdpdHMgd2VyZSBmb3VuZC4gIFNvIHdlCisJICogbXVzdCB0ZXN0IGZvciB0aGlzIGV4cGxpY2l0bHkuICovCisJaWYgKGVycm5vIHx8IG51bXN0ciA9PSBlKQorCQlnb3RvIGludmFsOyAvKiBlcnJvciAvIG5vIGRpZ2l0cyAvIGlsbGVnYWwgdHJhaWxpbmcgY2hhcnMgKi8KKworCWVycm5vID0gb2xkX2Vycm5vOyAgLyogT2suICBTbyByZXN0b3JlIGVycm5vLiAqLworCisJLyogRG8gb3B0aW9uYWwgc3VmZml4IHBhcnNpbmcuICBBbGxvdyAnZW1wdHknIHN1ZmZpeCB0YWJsZXMuCisJICogTm90ZSB0aGF0IHdlIGFsc28gYWxsb3cgbnVsIHN1ZmZpeGVzIHdpdGggYXNzb2NpYXRlZCBtdWx0aXBsaWVycywKKwkgKiB0byBhbGxvdyBmb3Igc2NhbGluZyBvZiB0aGUgbnVtc3RyIGJ5IHNvbWUgZGVmYXVsdCBtdWx0aXBsaWVyLiAqLworCWlmIChzdWZmaXhlcykgeworCQl3aGlsZSAoc3VmZml4ZXMtPm11bHQpIHsKKwkJCWlmIChzdHJjbXAoc3VmZml4ZXMtPnN1ZmZpeCwgZSkgPT0gMCkgeworCQkJCWlmIChYU1RSX1VUWVBFX01BWCAvIHN1ZmZpeGVzLT5tdWx0IDwgcikKKwkJCQkJZ290byByYW5nZTsgLyogb3ZlcmZsb3chICovCisJCQkJciAqPSBzdWZmaXhlcy0+bXVsdDsKKwkJCQlnb3RvIGNoa19yYW5nZTsKKwkJCX0KKwkJCSsrc3VmZml4ZXM7CisJCX0KKwl9CisKKwkvKiBOb3RlOiB0cmFpbGluZyBzcGFjZSBpcyBhbiBlcnJvci4KKwkgICBJdCB3b3VsZCBiZSBlYXN5IGVub3VnaCB0byBhbGxvdyB0aG91Z2ggaWYgZGVzaXJlZC4gKi8KKwlpZiAoKmUpCisJCWdvdG8gaW52YWw7CisgY2hrX3JhbmdlOgorCS8qIEZpbmFsbHksIGNoZWNrIGZvciByYW5nZSBsaW1pdHMuICovCisJaWYgKHIgPj0gbG93ZXIgJiYgciA8PSB1cHBlcikKKwkJcmV0dXJuIHI7CisgcmFuZ2U6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm51bWJlciAlcyBpcyBub3QgaW4gJWxsdS4uJWxsdSByYW5nZSIsCisJCW51bXN0ciwgKHVuc2lnbmVkIGxvbmcgbG9uZylsb3dlciwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1cHBlcik7CisgaW52YWw6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgbnVtYmVyICclcyciLCBudW1zdHIpOworfQorCit1bnNpZ25lZCB0eXBlIEZBU1RfRlVOQyB4c3RydG91KF9yYW5nZSkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwKKwkJdW5zaWduZWQgdHlwZSBsb3dlciwKKwkJdW5zaWduZWQgdHlwZSB1cHBlcikKK3sKKwlyZXR1cm4geHN0cnRvdShfcmFuZ2Vfc2Z4KShudW1zdHIsIGJhc2UsIGxvd2VyLCB1cHBlciwgTlVMTCk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhzdHJ0b3UoX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvdShfcmFuZ2Vfc2Z4KShudW1zdHIsIGJhc2UsIDAsIFhTVFJfVVRZUEVfTUFYLCBzdWZmaXhlcyk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhzdHJ0b3UoKShjb25zdCBjaGFyICpudW1zdHIsIGludCBiYXNlKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgMCwgWFNUUl9VVFlQRV9NQVgsIE5VTEwpOworfQorCit1bnNpZ25lZCB0eXBlIEZBU1RfRlVOQyB4YXRvdShfcmFuZ2Vfc2Z4KShjb25zdCBjaGFyICpudW1zdHIsCisJCXVuc2lnbmVkIHR5cGUgbG93ZXIsCisJCXVuc2lnbmVkIHR5cGUgdXBwZXIsCisJCWNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc3VmZml4ZXMpCit7CisJcmV0dXJuIHhzdHJ0b3UoX3JhbmdlX3NmeCkobnVtc3RyLCAxMCwgbG93ZXIsIHVwcGVyLCBzdWZmaXhlcyk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhhdG91KF9yYW5nZSkoY29uc3QgY2hhciAqbnVtc3RyLAorCQl1bnNpZ25lZCB0eXBlIGxvd2VyLAorCQl1bnNpZ25lZCB0eXBlIHVwcGVyKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIGxvd2VyLCB1cHBlciwgTlVMTCk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhhdG91KF9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvdShfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCAwLCBYU1RSX1VUWVBFX01BWCwgc3VmZml4ZXMpOworfQorCit1bnNpZ25lZCB0eXBlIEZBU1RfRlVOQyB4YXRvdSgpKGNvbnN0IGNoYXIgKm51bXN0cikKK3sKKwlyZXR1cm4geGF0b3UoX3NmeCkobnVtc3RyLCBOVUxMKTsKK30KKworLyogU2lnbmVkIG9uZXMgKi8KKwordHlwZSBGQVNUX0ZVTkMgeHN0cnRvKF9yYW5nZV9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IGJhc2UsCisJCXR5cGUgbG93ZXIsCisJCXR5cGUgdXBwZXIsCisJCWNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc3VmZml4ZXMpCit7CisJdW5zaWduZWQgdHlwZSB1ID0gWFNUUl9UWVBFX01BWDsKKwl0eXBlIHI7CisJY29uc3QgY2hhciAqcCA9IG51bXN0cjsKKworCS8qIE5COiBpZiB5b3UnbGwgZGVjaWRlIHRvIGRpc2FsbG93ICcrJzoKKwkgKiBhdCBsZWFzdCByZW5pY2UgYXBwbGV0IG5lZWRzIHRvIGFsbG93IGl0ICovCisJaWYgKHBbMF0gPT0gJysnIHx8IHBbMF0gPT0gJy0nKSB7CisJCSsrcDsKKwkJaWYgKHBbMF0gPT0gJy0nKQorCQkJKyt1OyAvKiA9IDx0eXBlPl9NSU4gKDAxMTExLi4uICsgMSA9PSAxMDAwMC4uLikgKi8KKwl9CisKKwlyID0geHN0cnRvdShfcmFuZ2Vfc2Z4KShwLCBiYXNlLCAwLCB1LCBzdWZmaXhlcyk7CisKKwlpZiAoKm51bXN0ciA9PSAnLScpIHsKKwkJciA9IC1yOworCX0KKworCWlmIChyIDwgbG93ZXIgfHwgciA+IHVwcGVyKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJudW1iZXIgJXMgaXMgbm90IGluICVsbGQuLiVsbGQgcmFuZ2UiLAorCQkJCW51bXN0ciwgKGxvbmcgbG9uZylsb3dlciwgKGxvbmcgbG9uZyl1cHBlcik7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhzdHJ0byhfcmFuZ2UpKGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IGJhc2UsIHR5cGUgbG93ZXIsIHR5cGUgdXBwZXIpCit7CisJcmV0dXJuIHhzdHJ0byhfcmFuZ2Vfc2Z4KShudW1zdHIsIGJhc2UsIGxvd2VyLCB1cHBlciwgTlVMTCk7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhzdHJ0bygpKGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IGJhc2UpCit7CisJcmV0dXJuIHhzdHJ0byhfcmFuZ2Vfc2Z4KShudW1zdHIsIGJhc2UsIFhTVFJfVFlQRV9NSU4sIFhTVFJfVFlQRV9NQVgsIE5VTEwpOworfQorCit0eXBlIEZBU1RfRlVOQyB4YXRvKF9yYW5nZV9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwKKwkJdHlwZSBsb3dlciwKKwkJdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIGxvd2VyLCB1cHBlciwgc3VmZml4ZXMpOworfQorCit0eXBlIEZBU1RfRlVOQyB4YXRvKF9yYW5nZSkoY29uc3QgY2hhciAqbnVtc3RyLCB0eXBlIGxvd2VyLCB0eXBlIHVwcGVyKQoreworCXJldHVybiB4c3RydG8oX3JhbmdlX3NmeCkobnVtc3RyLCAxMCwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordHlwZSBGQVNUX0ZVTkMgeGF0byhfc2Z4KShjb25zdCBjaGFyICpudW1zdHIsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc3VmZml4ZXMpCit7CisJcmV0dXJuIHhzdHJ0byhfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCBYU1RSX1RZUEVfTUlOLCBYU1RSX1RZUEVfTUFYLCBzdWZmaXhlcyk7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhhdG8oKShjb25zdCBjaGFyICpudW1zdHIpCit7CisJcmV0dXJuIHhzdHJ0byhfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCBYU1RSX1RZUEVfTUlOLCBYU1RSX1RZUEVfTUFYLCBOVUxMKTsKK30KKworI3VuZGVmIHR5cGUKKyN1bmRlZiB4c3RydG91CisjdW5kZWYgeHN0cnRvCisjdW5kZWYgeGF0b3UKKyN1bmRlZiB4YXRvCisjdW5kZWYgWFNUUl9VVFlQRV9NQVgKKyN1bmRlZiBYU1RSX1RZUEVfTUFYCisjdW5kZWYgWFNUUl9UWVBFX01JTgorI3VuZGVmIFhTVFJfU1RSVE9VCmRpZmYgLS1naXQgYS9saWJiYi94Y29ubmVjdC5jIGIvbGliYmIveGNvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjdjMTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGNvbm5lY3QuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb25uZWN0IHRvIGhvc3QgYXQgcG9ydCB1c2luZyBhZGRyZXNzIHJlc29sdXRpb24gZnJvbSBnZXRhZGRyaW5mbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gLyogbmV0aW5ldC9pbi5oIG5lZWRzIGl0ICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIHNldHNvY2tvcHRfcmV1c2VhZGRyKGludCBmZCkKK3sKKwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7Cit9CitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfYnJvYWRjYXN0KGludCBmZCkKK3sKKwlyZXR1cm4gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworfQorCisjaWZkZWYgU09fQklORFRPREVWSUNFCitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfYmluZHRvZGV2aWNlKGludCBmZCwgY29uc3QgY2hhciAqaWZhY2UpCit7CisJaW50IHI7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZhY2UpOworCS8qIE5COiBwYXNzaW5nIChpZmFjZSwgc3RybGVuKGlmYWNlKSArIDEpIGRvZXMgbm90IHdvcmshCisJICogKG1heWJlIGl0IHdvcmtzIG9uIF9zb21lXyBrZXJuZWxzLCBidXQgbm90IG9uIDIuNi4yNikKKwkgKiBBY3R1YWxseSwgaWZyX25hbWUgaXMgYXQgb2Zmc2V0IDAsIGFuZCBpbiBwcmFjdGljZQorCSAqIGp1c3QgZ2l2aW5nIGNoYXJbSUZOQU1TSVpdIGluc3RlYWQgb2Ygc3RydWN0IGlmcmVxIHdvcmtzIHRvby4KKwkgKiBCdXQganVzdCBpbiBjYXNlIGl0J3Mgbm90IHRydWUgb24gc29tZSBvYnNjdXJlIGFyY2guLi4gKi8KKwlyID0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLCAmaWZyLCBzaXplb2YoaWZyKSk7CisJaWYgKHIpCisJCWJiX3BlcnJvcl9tc2coImNhbid0IGJpbmQgdG8gaW50ZXJmYWNlICVzIiwgaWZhY2UpOworCXJldHVybiByOworfQorI2Vsc2UKK2ludCBGQVNUX0ZVTkMgc2V0c29ja29wdF9iaW5kdG9kZXZpY2UoaW50IGZkIFVOVVNFRF9QQVJBTSwKKwkJY29uc3QgY2hhciAqaWZhY2UgVU5VU0VEX1BBUkFNKQoreworCWJiX2Vycm9yX21zZygiU09fQklORFRPREVWSUNFIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0iKTsKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworc3RhdGljIGxlbl9hbmRfc29ja2FkZHIqIGdldF9sc2EoaW50IGZkLCBpbnQgKCpnZXRfbmFtZSkoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCAqYWRkcmxlbikpCit7CisJbGVuX2FuZF9zb2NrYWRkciBsc2E7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhX3B0cjsKKworCWxzYS5sZW4gPSBMU0FfU0laRU9GX1NBOworCWlmIChnZXRfbmFtZShmZCwgJmxzYS51LnNhLCAmbHNhLmxlbikgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsc2FfcHRyID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBsc2EubGVuKTsKKwlpZiAobHNhLmxlbiA+IExTQV9TSVpFT0ZfU0EpIHsgLyogcmFyZWx5IChpZiBldmVyKSBoYXBwZW5zICovCisJCWxzYV9wdHItPmxlbiA9IGxzYS5sZW47CisJCWdldF9uYW1lKGZkLCAmbHNhX3B0ci0+dS5zYSwgJmxzYV9wdHItPmxlbik7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGxzYV9wdHIsICZsc2EsIExTQV9MRU5fU0laRSArIGxzYS5sZW4pOworCX0KKwlyZXR1cm4gbHNhX3B0cjsKK30KKworbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIGdldF9zb2NrX2xzYShpbnQgZmQpCit7CisJcmV0dXJuIGdldF9sc2EoZmQsIGdldHNvY2tuYW1lKTsKK30KKworbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIGdldF9wZWVyX2xzYShpbnQgZmQpCit7CisJcmV0dXJuIGdldF9sc2EoZmQsIGdldHBlZXJuYW1lKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGNvbm5lY3QoaW50IHMsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc19hZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKK3sKKwlpZiAoY29ubmVjdChzLCBzX2FkZHIsIGFkZHJsZW4pIDwgMCkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZShzKTsKKwkJaWYgKHNfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzICglcykiLAorCQkJCSJjYW4ndCBjb25uZWN0IHRvIHJlbW90ZSBob3N0IiwKKwkJCQlpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzX2FkZHIpLT5zaW5fYWRkcikpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNvbm5lY3QgdG8gcmVtb3RlIGhvc3QiKTsKKwl9Cit9CisKKy8qIFJldHVybiBwb3J0IG51bWJlciBmb3IgYSBzZXJ2aWNlLgorICogSWYgInBvcnQiIGlzIGEgbnVtYmVyIHVzZSBpdCBhcyB0aGUgcG9ydC4KKyAqIElmICJwb3J0IiBpcyBhIG5hbWUgaXQgaXMgbG9va2VkIHVwIGluIC9ldGMvc2VydmljZXMsCisgKiBpZiBpdCBpc250IGZvdW5kIHJldHVybiBkZWZhdWx0X3BvcnQKKyAqLwordW5zaWduZWQgRkFTVF9GVU5DIGJiX2xvb2t1cF9wb3J0KGNvbnN0IGNoYXIgKnBvcnQsIGNvbnN0IGNoYXIgKnByb3RvY29sLCB1bnNpZ25lZCBkZWZhdWx0X3BvcnQpCit7CisJdW5zaWduZWQgcG9ydF9uciA9IGRlZmF1bHRfcG9ydDsKKwlpZiAocG9ydCkgeworCQlpbnQgb2xkX2Vycm5vOworCisJCS8qIFNpbmNlIHRoaXMgaXMgYSBsaWIgZnVuY3Rpb24sIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIHJlc2V0IGVycm5vIHRvIDAuCisJCSAqIERvaW5nIHNvIGNvdWxkIGJyZWFrIGFuIGFwcCB0aGF0IGlzIGRlZmVycmluZyBjaGVja2luZyBvZiBlcnJuby4gKi8KKwkJb2xkX2Vycm5vID0gZXJybm87CisJCXBvcnRfbnIgPSBiYl9zdHJ0b3UocG9ydCwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgcG9ydF9uciA+IDY1NTM1KSB7CisJCQlzdHJ1Y3Qgc2VydmVudCAqdHNlcnYgPSBnZXRzZXJ2YnluYW1lKHBvcnQsIHByb3RvY29sKTsKKwkJCXBvcnRfbnIgPSBkZWZhdWx0X3BvcnQ7CisJCQlpZiAodHNlcnYpCisJCQkJcG9ydF9uciA9IG50b2hzKHRzZXJ2LT5zX3BvcnQpOworCQl9CisJCWVycm5vID0gb2xkX2Vycm5vOworCX0KKwlyZXR1cm4gKHVpbnQxNl90KXBvcnRfbnI7Cit9CisKKworLyogIk5ldyIgbmV0d29ya2luZyBBUEkgKi8KKworCitpbnQgRkFTVF9GVU5DIGdldF9ucG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlyZXR1cm4gKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilzYSktPnNpbjZfcG9ydDsKKwl9CisjZW5kaWYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXJldHVybiAoKHN0cnVjdCBzb2NrYWRkcl9pbiopc2EpLT5zaW5fcG9ydDsKKwl9CisJLyogV2hhdD8gVU5JWCBzb2NrZXQ/IElQWD8/IDopICovCisJcmV0dXJuIC0xOworfQorCit2b2lkIEZBU1RfRlVOQyBzZXRfbnBvcnQoc3RydWN0IHNvY2thZGRyICpzYSwgdW5zaWduZWQgcG9ydCkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9ICh2b2lkKikgc2E7CisJCXNpbjYtPnNpbjZfcG9ydCA9IHBvcnQ7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHZvaWQqKSBzYTsKKwkJc2luLT5zaW5fcG9ydCA9IHBvcnQ7CisJCXJldHVybjsKKwl9CisJLyogV2hhdD8gVU5JWCBzb2NrZXQ/IElQWD8/IDopICovCit9CisKKy8qIFdlIGhpamFjayB0aGlzIGNvbnN0YW50IHRvIG1lYW4gc29tZXRoaW5nIGVsc2UgKi8KKy8qIEl0IGRvZXNuJ3QgaHVydCBiZWNhdXNlIHdlIHdpbGwgcmVtb3ZlIHRoaXMgYml0IGFueXdheSAqLworI2RlZmluZSBESUVfT05fRVJST1IgQUlfQ0FOT05OQU1FCisKKy8qIGhvc3Q6ICIxLjIuMy40Wzpwb3J0XSIsICJ3d3cuZ29vZ2xlLmNvbVs6cG9ydF0iCisgKiBwb3J0OiBpZiBuZWl0aGVyIG9mIGFib3ZlIHNwZWNpZmllcyBwb3J0ICMgKi8KK3N0YXRpYyBsZW5fYW5kX3NvY2thZGRyKiBzdHIyc29ja2FkZHIoCisJCWNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LAorSUZfRkVBVFVSRV9JUFY2KHNhX2ZhbWlseV90IGFmLCkKKwkJaW50IGFpX2ZsYWdzKQoreworSUZfTk9UX0ZFQVRVUkVfSVBWNihzYV9mYW1pbHlfdCBhZiA9IEFGX0lORVQ7KQorCWludCByYzsKKwlsZW5fYW5kX3NvY2thZGRyICpyOworCXN0cnVjdCBhZGRyaW5mbyAqcmVzdWx0ID0gTlVMTDsKKwlzdHJ1Y3QgYWRkcmluZm8gKnVzZWRfcmVzOworCWNvbnN0IGNoYXIgKm9yZ19ob3N0ID0gaG9zdDsgLyogb25seSBmb3IgZXJyb3IgbXNnICovCisJY29uc3QgY2hhciAqY3A7CisJc3RydWN0IGFkZHJpbmZvIGhpbnQ7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVU5JWF9MT0NBTCAmJiBzdHJuY21wKGhvc3QsICJsb2NhbDoiLCA2KSA9PSAwKSB7CisJCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOworCisJCXIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKwkJci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bik7CisJCXItPnUuc2Euc2FfZmFtaWx5ID0gQUZfVU5JWDsKKwkJc3VuID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKSZyLT51LnNhOworCQlzYWZlX3N0cm5jcHkoc3VuLT5zdW5fcGF0aCwgaG9zdCArIDYsIHNpemVvZihzdW4tPnN1bl9wYXRoKSk7CisJCXJldHVybiByOworCX0KKworCXIgPSBOVUxMOworCisJLyogVWdseSBwYXJzaW5nIG9mIGhvc3Q6YWRkciAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGhvc3RbMF0gPT0gJ1snKSB7CisJCS8qIEV2ZW4gdWdsaWVyIHBhcnNpbmcgb2YgW3h4XTpubiAqLworCQlob3N0Kys7CisJCWNwID0gc3RyY2hyKGhvc3QsICddJyk7CisJCWlmICghY3AgfHwgKGNwWzFdICE9ICc6JyAmJiBjcFsxXSAhPSAnXDAnKSkgeworCQkJLyogTWFsZm9ybWVkOiBtdXN0IGJlIFt4eF06bm4gb3IgW3h4XSAqLworCQkJYmJfZXJyb3JfbXNnKCJiYWQgYWRkcmVzcyAnJXMnIiwgb3JnX2hvc3QpOworCQkJaWYgKGFpX2ZsYWdzICYgRElFX09OX0VSUk9SKQorCQkJCXhmdW5jX2RpZSgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQljcCA9IHN0cnJjaHIoaG9zdCwgJzonKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgY3AgJiYgc3RyY2hyKGhvc3QsICc6JykgIT0gY3ApIHsKKwkJCS8qIFRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgJzonIChlLmcuICI6OjEiKSAqLworCQkJY3AgPSBOVUxMOyAvKiBpdCdzIG5vdCBhIHBvcnQgc3BlYyAqLworCQl9CisJfQorCWlmIChjcCkgeyAvKiBwb2ludHMgdG8gIjoiIG9yICJdOiIgKi8KKwkJaW50IHN6ID0gY3AgLSBob3N0ICsgMTsKKworCQlob3N0ID0gc2FmZV9zdHJuY3B5KGFsbG9jYShzeiksIGhvc3QsIHN6KTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgKmNwICE9ICc6JykgeworCQkJY3ArKzsgLyogc2tpcCAnXScgKi8KKwkJCWlmICgqY3AgPT0gJ1wwJykgLyogW3h4XSB3aXRob3V0IHBvcnQgKi8KKwkJCQlnb3RvIHNraXA7CisJCX0KKwkJY3ArKzsgLyogc2tpcCAnOicgKi8KKwkJcG9ydCA9IGJiX3N0cnRvdShjcCwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgKHVuc2lnbmVkKXBvcnQgPiAweGZmZmYpIHsKKwkJCWJiX2Vycm9yX21zZygiYmFkIHBvcnQgc3BlYyAnJXMnIiwgb3JnX2hvc3QpOworCQkJaWYgKGFpX2ZsYWdzICYgRElFX09OX0VSUk9SKQorCQkJCXhmdW5jX2RpZSgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKyBza2lwOiA7CisJfQorCisJLyogTmV4dCB0d28gaWYgYmxvY2tzIGFsbG93IHRvIHNraXAgZ2V0YWRkcmluZm8oKQorCSAqIGluIGNhc2UgaG9zdCBuYW1lIGlzIGEgbnVtZXJpYyBJUCh2NikgYWRkcmVzcy4KKwkgKiBnZXRhZGRyaW5mbygpIGluaXRpYWxpemVzIEROUyByZXNvbHV0aW9uIG1hY2hpbmVyeSwKKwkgKiBzY2FucyBuZXR3b3JrIGNvbmZpZyBhbmQgc3VjaCAtIHRlbnMgb2Ygc3lzY2FsbHMuCisJICovCisJLyogSWYgd2Ugd2VyZSBub3QgYXNrZWQgc3BlY2lmaWNhbGx5IGZvciBJUHY2LAorCSAqIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG51bWVyaWMgSVB2NCAqLworCUlGX0ZFQVRVUkVfSVBWNihpZihhZiAhPSBBRl9JTkVUNikpIHsKKwkJc3RydWN0IGluX2FkZHIgaW40OworCQlpZiAoaW5ldF9hdG9uKGhvc3QsICZpbjQpICE9IDApIHsKKwkJCXIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwkJCXItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJci0+dS5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUOworCQkJci0+dS5zaW4uc2luX2FkZHIgPSBpbjQ7CisJCQlnb3RvIHNldF9wb3J0OworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkvKiBJZiB3ZSB3ZXJlIG5vdCBhc2tlZCBzcGVjaWZpY2FsbHkgZm9yIElQdjQsCisJICogY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgbnVtZXJpYyBJUHY2ICovCisJaWYgKGFmICE9IEFGX0lORVQpIHsKKwkJc3RydWN0IGluNl9hZGRyIGluNjsKKwkJaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdCwgJmluNikgPiAwKSB7CisJCQlyID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCQkJci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJci0+dS5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCXItPnUuc2luNi5zaW42X2FkZHIgPSBpbjY7CisJCQlnb3RvIHNldF9wb3J0OworCQl9CisJfQorI2VuZGlmCisKKwltZW1zZXQoJmhpbnQsIDAgLCBzaXplb2YoaGludCkpOworCWhpbnQuYWlfZmFtaWx5ID0gYWY7CisJLyogTmVlZCBTT0NLX1NUUkVBTSwgb3IgZWxzZSB3ZSBnZXQgZWFjaCBhZGRyZXNzIHRocmljZSAob3IgbW9yZSkKKwkgKiBmb3IgZWFjaCBwb3NzaWJsZSBzb2NrZXQgdHlwZSAodGNwLHVkcCxyYXcuLi4pOiAqLworCWhpbnQuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50LmFpX2ZsYWdzID0gYWlfZmxhZ3MgJiB+RElFX09OX0VSUk9SOworCXJjID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgJmhpbnQsICZyZXN1bHQpOworCWlmIChyYyB8fCAhcmVzdWx0KSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGFkZHJlc3MgJyVzJyIsIG9yZ19ob3N0KTsKKwkJaWYgKGFpX2ZsYWdzICYgRElFX09OX0VSUk9SKQorCQkJeGZ1bmNfZGllKCk7CisJCWdvdG8gcmV0OworCX0KKwl1c2VkX3JlcyA9IHJlc3VsdDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTCisJd2hpbGUgKDEpIHsKKwkJaWYgKHVzZWRfcmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCWJyZWFrOworCQl1c2VkX3JlcyA9IHVzZWRfcmVzLT5haV9uZXh0OworCQlpZiAoIXVzZWRfcmVzKSB7CisJCQl1c2VkX3JlcyA9IHJlc3VsdDsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisJciA9IHhtYWxsb2MoTFNBX0xFTl9TSVpFICsgdXNlZF9yZXMtPmFpX2FkZHJsZW4pOworCXItPmxlbiA9IHVzZWRfcmVzLT5haV9hZGRybGVuOworCW1lbWNweSgmci0+dS5zYSwgdXNlZF9yZXMtPmFpX2FkZHIsIHVzZWRfcmVzLT5haV9hZGRybGVuKTsKKworIHNldF9wb3J0OgorCXNldF9ucG9ydCgmci0+dS5zYSwgaHRvbnMocG9ydCkpOworIHJldDoKKwlpZiAocmVzdWx0KQorCQlmcmVlYWRkcmluZm8ocmVzdWx0KTsKKwlyZXR1cm4gcjsKK30KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfSVBWNgorI2RlZmluZSBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWYsIGFpX2ZsYWdzKSBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWlfZmxhZ3MpCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyBob3N0X2FuZF9hZjJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgc2FfZmFtaWx5X3QgYWYpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBhZiwgMCk7Cit9CisKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyB4aG9zdF9hbmRfYWYyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIHNhX2ZhbWlseV90IGFmKQoreworCXJldHVybiBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWYsIERJRV9PTl9FUlJPUik7Cit9CisjZW5kaWYKKworbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIGhvc3Qyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBBRl9VTlNQRUMsIDApOworfQorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgeGhvc3Qyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBBRl9VTlNQRUMsIERJRV9PTl9FUlJPUik7Cit9CisKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyB4ZG90dGVkMnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworCXJldHVybiBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgQUZfVU5TUEVDLCBBSV9OVU1FUklDSE9TVCB8IERJRV9PTl9FUlJPUik7Cit9CisKKyN1bmRlZiB4c29ja2V0X3R5cGUKK2ludCBGQVNUX0ZVTkMgeHNvY2tldF90eXBlKGxlbl9hbmRfc29ja2FkZHIgKipsc2FwLCBJRl9GRUFUVVJFX0lQVjYoaW50IGZhbWlseSwpIGludCBzb2NrX3R5cGUpCit7CisJSUZfTk9UX0ZFQVRVUkVfSVBWNihlbnVtIHsgZmFtaWx5ID0gQUZfSU5FVCB9OykKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJaW50IGZkOworCWludCBsZW47CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKGZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJZmQgPSBzb2NrZXQoQUZfSU5FVDYsIHNvY2tfdHlwZSwgMCk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlmYW1pbHkgPSBBRl9JTkVUNjsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlmYW1pbHkgPSBBRl9JTkVUOworCX0KKyNlbmRpZgorCWZkID0geHNvY2tldChmYW1pbHksIHNvY2tfdHlwZSwgMCk7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyBkb25lOgorCQlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJfQorI2VuZGlmCisJbHNhID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBsZW4pOworCWxzYS0+bGVuID0gbGVuOworCWxzYS0+dS5zYS5zYV9mYW1pbHkgPSBmYW1pbHk7CisJKmxzYXAgPSBsc2E7CisJcmV0dXJuIGZkOworfQorCitpbnQgRkFTVF9GVU5DIHhzb2NrZXRfc3RyZWFtKGxlbl9hbmRfc29ja2FkZHIgKipsc2FwKQoreworCXJldHVybiB4c29ja2V0X3R5cGUobHNhcCwgSUZfRkVBVFVSRV9JUFY2KEFGX1VOU1BFQywpIFNPQ0tfU1RSRUFNKTsKK30KKworc3RhdGljIGludCBjcmVhdGVfYW5kX2JpbmRfb3JfZGllKGNvbnN0IGNoYXIgKmJpbmRhZGRyLCBpbnQgcG9ydCwgaW50IHNvY2tfdHlwZSkKK3sKKwlpbnQgZmQ7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJaWYgKGJpbmRhZGRyICYmIGJpbmRhZGRyWzBdKSB7CisJCWxzYSA9IHhkb3R0ZWQyc29ja2FkZHIoYmluZGFkZHIsIHBvcnQpOworCQkvKiB1c2VyIHNwZWNpZmllZCBiaW5kIGFkZHIgZGljdGF0ZXMgZmFtaWx5ICovCisJCWZkID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBzb2NrX3R5cGUsIDApOworCX0gZWxzZSB7CisJCWZkID0geHNvY2tldF90eXBlKCZsc2EsIElGX0ZFQVRVUkVfSVBWNihBRl9VTlNQRUMsKSBzb2NrX3R5cGUpOworCQlzZXRfbnBvcnQoJmxzYS0+dS5zYSwgaHRvbnMocG9ydCkpOworCX0KKwlzZXRzb2Nrb3B0X3JldXNlYWRkcihmZCk7CisJeGJpbmQoZmQsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKwlmcmVlKGxzYSk7CisJcmV0dXJuIGZkOworfQorCitpbnQgRkFTVF9GVU5DIGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKGNvbnN0IGNoYXIgKmJpbmRhZGRyLCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gY3JlYXRlX2FuZF9iaW5kX29yX2RpZShiaW5kYWRkciwgcG9ydCwgU09DS19TVFJFQU0pOworfQorCitpbnQgRkFTVF9GVU5DIGNyZWF0ZV9hbmRfYmluZF9kZ3JhbV9vcl9kaWUoY29uc3QgY2hhciAqYmluZGFkZHIsIGludCBwb3J0KQoreworCXJldHVybiBjcmVhdGVfYW5kX2JpbmRfb3JfZGllKGJpbmRhZGRyLCBwb3J0LCBTT0NLX0RHUkFNKTsKK30KKworCitpbnQgRkFTVF9GVU5DIGNyZWF0ZV9hbmRfY29ubmVjdF9zdHJlYW1fb3JfZGllKGNvbnN0IGNoYXIgKnBlZXIsIGludCBwb3J0KQoreworCWludCBmZDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisKKwlsc2EgPSB4aG9zdDJzb2NrYWRkcihwZWVyLCBwb3J0KTsKKwlmZCA9IHhzb2NrZXQobHNhLT51LnNhLnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKwl4Y29ubmVjdChmZCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCWZyZWUobHNhKTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgeGNvbm5lY3Rfc3RyZWFtKGNvbnN0IGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKK3sKKwlpbnQgZmQgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKKwl4Y29ubmVjdChmZCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCXJldHVybiBmZDsKK30KKworLyogV2UgaGlqYWNrIHRoaXMgY29uc3RhbnQgdG8gbWVhbiBzb21ldGhpbmcgZWxzZSAqLworLyogSXQgZG9lc24ndCBodXJ0IGJlY2F1c2Ugd2Ugd2lsbCBhZGQgdGhpcyBiaXQgYW55d2F5ICovCisjZGVmaW5lIElHTk9SRV9QT1JUIE5JX05VTUVSSUNTRVJWCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHNvY2thZGRyMnN0cihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgZmxhZ3MpCit7CisJY2hhciBob3N0WzEyOF07CisJY2hhciBzZXJ2WzE2XTsKKwlpbnQgcmM7CisJc29ja2xlbl90IHNhbGVuOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1VOSVhfTE9DQUwgJiYgc2EtPnNhX2ZhbWlseSA9PSBBRl9VTklYKSB7CisJCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKXNhOworCQlyZXR1cm4geGFzcHJpbnRmKCJsb2NhbDolLipzIiwKKwkJCQkoaW50KSBzaXplb2Yoc3VuLT5zdW5fcGF0aCksCisJCQkJc3VuLT5zdW5fcGF0aCk7CisJfQorCisJc2FsZW4gPSBMU0FfU0laRU9GX1NBOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyNlbmRpZgorCXJjID0gZ2V0bmFtZWluZm8oc2EsIHNhbGVuLAorCQkJaG9zdCwgc2l6ZW9mKGhvc3QpLAorCS8qIGNhbiBkbyAoKGZsYWdzICYgSUdOT1JFX1BPUlQpID8gTlVMTCA6IHNlcnYpIGJ1dCB3aHkgYm90aGVyPyAqLworCQkJc2Vydiwgc2l6ZW9mKHNlcnYpLAorCQkJLyogZG8gbm90IHJlc29sdmUgcG9ydCMgaW50byBzZXJ2aWNlIF9uYW1lXyAqLworCQkJZmxhZ3MgfCBOSV9OVU1FUklDU0VSVgorCSk7CisJaWYgKHJjKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZmxhZ3MgJiBJR05PUkVfUE9SVCkKKwkJcmV0dXJuIHhzdHJkdXAoaG9zdCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWlmIChzdHJjaHIoaG9zdCwgJzonKSkgLyogaGVoLCBpdCdzIG5vdCBhIHJlc29sdmVkIGhvc3RuYW1lICovCisJCQlyZXR1cm4geGFzcHJpbnRmKCJbJXNdOiVzIiwgaG9zdCwgc2Vydik7CisJCS8qcmV0dXJuIHhhc3ByaW50ZigiJXM6JXMiLCBob3N0LCBzZXJ2KTsqLworCQkvKiAtIGZhbGwgdGhyb3VnaCBpbnN0ZWFkICovCisJfQorI2VuZGlmCisJLyogRm9yIG5vdyB3ZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIGVsc2UsIHNvIGl0IGhhcyB0byBiZSBJTkVUICovCisJLyppZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSovCisJCXJldHVybiB4YXNwcmludGYoIiVzOiVzIiwgaG9zdCwgc2Vydik7CisJLypyZXR1cm4geHN0cmR1cChob3N0KTsqLworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19zb2NrYWRkcjJob3N0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisJcmV0dXJuIHNvY2thZGRyMnN0cihzYSwgMCk7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3NvY2thZGRyMmhvc3Rfbm9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisJcmV0dXJuIHNvY2thZGRyMnN0cihzYSwgSUdOT1JFX1BPUlQpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19zb2NrYWRkcjJob3N0b25seV9ub3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKwlyZXR1cm4gc29ja2FkZHIyc3RyKHNhLCBOSV9OQU1FUkVRRCB8IElHTk9SRV9QT1JUKTsKK30KK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworCXJldHVybiBzb2NrYWRkcjJzdHIoc2EsIE5JX05VTUVSSUNIT1NUKTsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworCXJldHVybiBzb2NrYWRkcjJzdHIoc2EsIE5JX05VTUVSSUNIT1NUIHwgSUdOT1JFX1BPUlQpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIveGZ1bmNfZGllLmMgYi9saWJiYi94ZnVuY19kaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRlNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGZ1bmNfZGllLmMKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEtlZXBpbmcgaXQgc2VwYXJhdGUgYWxsb3dzIHRvIE5PVCBzdWNrIGluIHN0ZGlvIGZvciBWRVJZIHNtYWxsIGFwcGxldHMuCisgKiBUcnkgYnVpbGRpbmcgYnVzeWJveCB3aXRoIG9ubHkgInRydWUiIGVuYWJsZWQuLi4gKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBkaWVfc2xlZXA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgfHwgRU5BQkxFX0hVU0gKK2ptcF9idWYgZGllX2ptcDsKKyNlbmRpZgorCit2b2lkIEZBU1RfRlVOQyB4ZnVuY19kaWUodm9pZCkKK3sKKwlpZiAoZGllX3NsZWVwKSB7CisJCWlmICgoRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgfHwgRU5BQkxFX0hVU0gpCisJCSAmJiBkaWVfc2xlZXAgPCAwCisJCSkgeworCQkJLyogU3BlY2lhbCBjYXNlLiBXZSBhcnJpdmUgaGVyZSBpZiBOT0ZPUksgYXBwbGV0CisJCQkgKiBjYWxscyB4ZnVuYywgd2hpY2ggdGhlbiBkZWNpZGVzIHRvIGRpZS4KKwkJCSAqIFdlIGRvbid0IGRpZSwgYnV0IGp1bXAgaW5zdGVhZCBiYWNrIHRvIGNhbGxlci4KKwkJCSAqIE5PRk9SSyBhcHBsZXRzIHN0aWxsIGNhbm5vdCBjYXJlbGVzc2x5IGNhbGwgeGZ1bmNzOgorCQkJICogcCA9IHhtYWxsb2MoMTApOworCQkJICogcSA9IHhtYWxsb2MoMTApOyAvLyBCVUchIGlmIHRoaXMgZGllcywgd2UgbGVhayBwIQorCQkJICovCisJCQkvKiAtMjIyMiBtZWFucyAiemVybyIgKGxvbmdqbXAgY2FuJ3QgcGFzcyAwKQorCQkJICogcnVuX25vZm9ya19hcHBsZXQoKSBjYXRjaGVzIC0yMjIyLiAqLworCQkJbG9uZ2ptcChkaWVfam1wLCB4ZnVuY19lcnJvcl9yZXR2YWwgPyB4ZnVuY19lcnJvcl9yZXR2YWwgOiAtMjIyMik7CisJCX0KKwkJc2xlZXAoZGllX3NsZWVwKTsKKwl9CisJZXhpdCh4ZnVuY19lcnJvcl9yZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIveGZ1bmNzLmMgYi9saWJiYi94ZnVuY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YyNzUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGZ1bmNzLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYiBMYW5kbGV5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFdlIG5lZWQgdG8gaGF2ZSBzZXBhcmF0ZSB4ZnVuY3MuYyBhbmQgeGZ1bmNzX3ByaW50Zi5jIGJlY2F1c2UKKyAqIHdpdGggY3VycmVudCBsaW5rZXJzLCBldmVuIHdpdGggc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24sCisgKiBpZiAqLm8gbW9kdWxlIHJlZmVyZW5jZXMgYW55IG9mIFhYWHByaW50ZiBmdW5jdGlvbnMsIHlvdSBwdWxsIGluCisgKiBlbnRpcmUgcHJpbnRmIG1hY2hpbmVyeS4gRXZlbiBpZiB5b3UgZG8gbm90IHVzZSB0aGUgZnVuY3Rpb24KKyAqIHdoaWNoIHVzZXMgWFhYcHJpbnRmLgorICoKKyAqIHhmdW5jcy5jIGNvbnRhaW5zIGZ1bmN0aW9ucyAobm90IG5lY2Vzc2FyaWx5IHhmdW5jcykKKyAqIHdoaWNoIGRvIG5vdCBwdWxsIGluIHByaW50ZiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KKyAqIHhmdW5jX3ByaW50Zi5jIGNvbnRhaW5zIHRob3NlIHdoaWNoIGRvLgorICoKKyAqIFRPRE86IG1vdmUgeG1hbGxvYygpIGFuZCB4YXRvbnVtKCkgaGVyZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVHVybiBvbiBub25ibG9ja2luZyBJL08gb24gYSBmZCAqLwordm9pZCBGQVNUX0ZVTkMgbmRlbGF5X29uKGludCBmZCkKK3sKKwlpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCk7CisJaWYgKGZsYWdzICYgT19OT05CTE9DSykKKwkJcmV0dXJuOworCWZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOworfQorCit2b2lkIEZBU1RfRlVOQyBuZGVsYXlfb2ZmKGludCBmZCkKK3sKKwlpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCk7CisJaWYgKCEoZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuOworCWZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgY2xvc2Vfb25fZXhlY19vbihpbnQgZmQpCit7CisJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgc3RybmNweV9JRk5BTVNJWihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyNpZm5kZWYgSUZOQU1TSVoKKwllbnVtIHsgSUZOQU1TSVogPSAxNiB9OworI2VuZGlmCisJcmV0dXJuIHN0cm5jcHkoZHN0LCBzcmMsIElGTkFNU0laKTsKK30KKworCisvKiBDb252ZXJ0IHVuc2lnbmVkIGludGVnZXIgdG8gYXNjaWksIHdyaXRpbmcgaW50byBzdXBwbGllZCBidWZmZXIuCisgKiBBIHRydW5jYXRlZCByZXN1bHQgY29udGFpbnMgdGhlIGZpcnN0IGZldyBkaWdpdHMgb2YgdGhlIHJlc3VsdCBhbGEgc3RybmNweS4KKyAqIFJldHVybnMgYSBwb2ludGVyIHBhc3QgbGFzdCBnZW5lcmF0ZWQgZGlnaXQsIGRvZXMgX25vdF8gc3RvcmUgTlVMLgorICovCit2b2lkIEJVR19zaXplb2Yodm9pZCk7CitjaGFyKiBGQVNUX0ZVTkMgdXRvYV90b19idWYodW5zaWduZWQgbiwgY2hhciAqYnVmLCB1bnNpZ25lZCBidWZsZW4pCit7CisJdW5zaWduZWQgaSwgb3V0LCByZXM7CisKKwlpZiAoYnVmbGVuKSB7CisJCW91dCA9IDA7CisJCWlmIChzaXplb2YobikgPT0gNCkKKwkJLy8gMl4zMi0xID0gNDI5NDk2NzI5NQorCQkJaSA9IDEwMDAwMDAwMDA7CisjaWYgVUlOVF9NQVggPiA0Mjk0OTY3Mjk1IC8qIHByZXZlbnRzIHdhcm5pbmcgYWJvdXQgImNvbnN0IHRvbyBsYXJnZSIgKi8KKwkJZWxzZQorCQlpZiAoc2l6ZW9mKG4pID09IDgpCisJCS8vIDJeNjQtMSA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1CisJCQlpID0gMTAwMDAwMDAwMDAwMDAwMDAwMDA7CisjZW5kaWYKKwkJZWxzZQorCQkJQlVHX3NpemVvZigpOworCQlmb3IgKDsgaTsgaSAvPSAxMCkgeworCQkJcmVzID0gbiAvIGk7CisJCQluID0gbiAlIGk7CisJCQlpZiAocmVzIHx8IG91dCB8fCBpID09IDEpIHsKKwkJCQlpZiAoLS1idWZsZW4gPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJb3V0Kys7CisJCQkJKmJ1ZisrID0gJzAnICsgcmVzOworCQkJfQorCQl9CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qIENvbnZlcnQgc2lnbmVkIGludGVnZXIgdG8gYXNjaWksIGxpa2UgdXRvYV90b19idWYoKSAqLworY2hhciogRkFTVF9GVU5DIGl0b2FfdG9fYnVmKGludCBuLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbikKK3sKKwlpZiAoIWJ1ZmxlbikKKwkJcmV0dXJuIGJ1ZjsKKwlpZiAobiA8IDApIHsKKwkJbiA9IC1uOworCQkqYnVmKysgPSAnLSc7CisJCWJ1Zmxlbi0tOworCX0KKwlyZXR1cm4gdXRvYV90b19idWYoKHVuc2lnbmVkKW4sIGJ1ZiwgYnVmbGVuKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIHVzZSBhIHN0YXRpYyBidWZmZXIsIHNvIGNhbGxpbmcgZWl0aGVyIG9uZSBhCisvLyBzZWNvbmQgdGltZSB3aWxsIG92ZXJ3cml0ZSBwcmV2aW91cyByZXN1bHRzLgorLy8KKy8vIFRoZSBsYXJnZXN0IDMyIGJpdCBpbnRlZ2VyIGlzIC0yIGJpbGxpb24gcGx1cyBOVUwsIG9yIDErMTArMT0xMiBieXRlcy4KKy8vIEl0IHNvIGhhcHBlbnMgdGhhdCBzaXplb2YoaW50KSAqIDMgaXMgZW5vdWdoIGZvciAzMisgYml0IGludHMuCisvLyAoc2l6ZW9mKGludCkgKiAzICsgMiBpcyBjb3JyZWN0IGZvciBhbnkgd2lkdGgsIGV2ZW4gOC1iaXQpCisKK3N0YXRpYyBjaGFyIGxvY2FsX2J1ZltzaXplb2YoaW50KSAqIDNdOworCisvKiBDb252ZXJ0IHVuc2lnbmVkIGludGVnZXIgdG8gYXNjaWkgdXNpbmcgYSBzdGF0aWMgYnVmZmVyIChyZXR1cm5lZCkuICovCitjaGFyKiBGQVNUX0ZVTkMgdXRvYSh1bnNpZ25lZCBuKQoreworCSoodXRvYV90b19idWYobiwgbG9jYWxfYnVmLCBzaXplb2YobG9jYWxfYnVmKSAtIDEpKSA9ICdcMCc7CisKKwlyZXR1cm4gbG9jYWxfYnVmOworfQorCisvKiBDb252ZXJ0IHNpZ25lZCBpbnRlZ2VyIHRvIGFzY2lpIHVzaW5nIGEgc3RhdGljIGJ1ZmZlciAocmV0dXJuZWQpLiAqLworY2hhciogRkFTVF9GVU5DIGl0b2EoaW50IG4pCit7CisJKihpdG9hX3RvX2J1ZihuLCBsb2NhbF9idWYsIHNpemVvZihsb2NhbF9idWYpIC0gMSkpID0gJ1wwJzsKKworCXJldHVybiBsb2NhbF9idWY7Cit9CisKKy8qIEVtaXQgYSBzdHJpbmcgb2YgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGJ5dGVzICovCitjaGFyKiBGQVNUX0ZVTkMgYmluMmhleChjaGFyICpwLCBjb25zdCBjaGFyICpjcCwgaW50IGNvdW50KQoreworCXdoaWxlIChjb3VudCkgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqY3ArKzsKKwkJLyogcHV0IGxvd2VyY2FzZSBoZXggZGlnaXRzICovCisJCSpwKysgPSAweDIwIHwgYmJfaGV4ZGlnaXRzX3VwY2FzZVtjID4+IDRdOworCQkqcCsrID0gMHgyMCB8IGJiX2hleGRpZ2l0c191cGNhc2VbYyAmIDB4Zl07CisJCWNvdW50LS07CisJfQorCXJldHVybiBwOworfQorCisvKiBDb252ZXJ0ICJbeF14WzpdW3hdeFs6XVt4XXhbOl1beF14IiBoZXggc3RyaW5nIHRvIGJpbmFyeSwgbm8gbW9yZSB0aGFuIENPVU5UIGJ5dGVzICovCitjaGFyKiBGQVNUX0ZVTkMgaGV4MmJpbihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGNvdW50KQoreworCWVycm5vID0gRUlOVkFMOworCXdoaWxlICgqc3RyICYmIGNvdW50KSB7CisJCXVpbnQ4X3QgdmFsOworCQl1aW50OF90IGMgPSAqc3RyKys7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJdmFsID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoKGN8MHgyMCkgPj0gJ2EnICYmIChjfDB4MjApIDw9ICdmJykKKwkJCXZhbCA9IChjfDB4MjApIC0gKCdhJyAtIDEwKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJCXZhbCA8PD0gNDsKKwkJYyA9ICpzdHI7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJdmFsIHw9IGMgLSAnMCc7CisJCWVsc2UgaWYgKChjfDB4MjApID49ICdhJyAmJiAoY3wweDIwKSA8PSAnZicpCisJCQl2YWwgfD0gKGN8MHgyMCkgLSAoJ2EnIC0gMTApOworCQllbHNlIGlmIChjID09ICc6JyB8fCBjID09ICdcMCcpCisJCQl2YWwgPj49IDQ7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCisJCSpkc3QrKyA9IHZhbDsKKwkJaWYgKGMgIT0gJ1wwJykKKwkJCXN0cisrOworCQlpZiAoKnN0ciA9PSAnOicpCisJCQlzdHIrKzsKKwkJY291bnQtLTsKKwl9CisJZXJybm8gPSAoKnN0ciA/IEVSQU5HRSA6IDApOworCXJldHVybiBkc3Q7Cit9CisKKy8qIFJldHVybiBob3cgbG9uZyB0aGUgZmlsZSBhdCBmZCBpcywgaWYgdGhlcmUncyBhbnkgd2F5IHRvIGRldGVybWluZSBpdC4gKi8KKyNpZmRlZiBVTlVTRUQKK29mZl90IEZBU1RfRlVOQyBmZGxlbmd0aChpbnQgZmQpCit7CisJb2ZmX3QgYm90dG9tID0gMCwgdG9wID0gMCwgcG9zOworCWxvbmcgc2l6ZTsKKworCS8vIElmIHRoZSBpb2N0bCB3b3JrcyBmb3IgdGhpcywgcmV0dXJuIGl0LgorCisJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgcmV0dXJuIHNpemUqNTEyOworCisJLy8gRklYTUU6IGV4cGxhaW4gd2h5IGxzZWVrKFNFRUtfRU5EKSBpcyBub3QgdXNlZCBoZXJlIQorCisJLy8gSWYgbm90LCBkbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IGxvY2F0aW9uIHdlIGNhbiByZWFkLiAgKFNvbWUKKwkvLyBibG9jayBkZXZpY2VzIGRvbid0IGRvIEJMS0dFVFNJWkUgcmlnaHQuKQorCisJZG8geworCQljaGFyIHRlbXA7CisKKwkJcG9zID0gYm90dG9tICsgKHRvcCAtIGJvdHRvbSkgLyAyOworCisJCS8vIElmIHdlIGNhbiByZWFkIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24sIGl0J3MgYmlnZ2VyLgorCisJCWlmIChsc2VlayhmZCwgcG9zLCBTRUVLX1NFVCk+PTAgJiYgc2FmZV9yZWFkKGZkLCAmdGVtcCwgMSk9PTEpIHsKKwkJCWlmIChib3R0b20gPT0gdG9wKSBib3R0b20gPSB0b3AgPSAodG9wKzEpICogMjsKKwkJCWVsc2UgYm90dG9tID0gcG9zOworCisJCS8vIElmIHdlIGNhbid0LCBpdCdzIHNtYWxsZXIuCisKKwkJfSBlbHNlIHsKKwkJCWlmIChib3R0b20gPT0gdG9wKSB7CisJCQkJaWYgKCF0b3ApIHJldHVybiAwOworCQkJCWJvdHRvbSA9IHRvcC8yOworCQkJfQorCQkJZWxzZSB0b3AgPSBwb3M7CisJCX0KKwl9IHdoaWxlIChib3R0b20gKyAxICE9IHRvcCk7CisKKwlyZXR1cm4gcG9zICsgMTsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGJiX3B1dGNoYXJfc3RkZXJyKGNoYXIgY2gpCit7CisJcmV0dXJuIHdyaXRlKFNUREVSUl9GSUxFTk8sICZjaCwgMSk7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIGZ1bGxfd3JpdGUxX3N0cihjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIGZ1bGxfd3JpdGUyX3N0cihjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIGZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3N0YXRpYyBpbnQgd2hfaGVscGVyKGludCB2YWx1ZSwgaW50IGRlZl92YWwsIGNvbnN0IGNoYXIgKmVudl9uYW1lLCBpbnQgKmVycikKK3sKKwlpZiAodmFsdWUgPT0gMCkgeworCQljaGFyICpzID0gZ2V0ZW52KGVudl9uYW1lKTsKKwkJaWYgKHMpIHsKKwkJCXZhbHVlID0gYXRvaShzKTsKKwkJCS8qIElmIExJTkVTL0NPTFVNTlMgYXJlIHNldCwgcHJldGVuZCB0aGF0IHRoZXJlIGlzCisJCQkgKiBubyBlcnJvciBnZXR0aW5nIHcvaCwgdGhpcyBwcmV2ZW50cyBzb21lIHVnbHkKKwkJCSAqIGN1cnNvciB0cmlja3MgYnkgb3VyIGNhbGxlcnMgKi8KKwkJCSplcnIgPSAwOworCQl9CisJfQorCWlmICh2YWx1ZSA8PSAxIHx8IHZhbHVlID49IDMwMDAwKQorCQl2YWx1ZSA9IGRlZl92YWw7CisJcmV0dXJuIHZhbHVlOworfQorCisvKiBJdCBpcyBwZXJmZWN0bHkgb2sgdG8gcGFzcyBpbiBhIE5VTEwgZm9yIGVpdGhlciB3aWR0aCBvciBmb3IKKyAqIGhlaWdodCwgaW4gd2hpY2ggY2FzZSB0aGF0IHZhbHVlIHdpbGwgbm90IGJlIHNldC4gICovCitpbnQgRkFTVF9GVU5DIGdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoaW50IGZkLCB1bnNpZ25lZCAqd2lkdGgsIHVuc2lnbmVkICpoZWlnaHQpCit7CisJc3RydWN0IHdpbnNpemUgd2luOworCWludCBlcnI7CisKKwl3aW4ud3Nfcm93ID0gMDsKKwl3aW4ud3NfY29sID0gMDsKKwkvKiBJJ3ZlIHNlZW4gaW9jdGwgcmV0dXJuaW5nIDAsIGJ1dCByb3cvY29sIGlzIChzdGlsbD8pIDAuCisJICogV2UgdHJlYXQgdGhhdCBhcyBhbiBlcnJvciB0b28uICAqLworCWVyciA9IGlvY3RsKGZkLCBUSU9DR1dJTlNaLCAmd2luKSAhPSAwIHx8IHdpbi53c19yb3cgPT0gMDsKKwlpZiAoaGVpZ2h0KQorCQkqaGVpZ2h0ID0gd2hfaGVscGVyKHdpbi53c19yb3csIDI0LCAiTElORVMiLCAmZXJyKTsKKwlpZiAod2lkdGgpCisJCSp3aWR0aCA9IHdoX2hlbHBlcih3aW4ud3NfY29sLCA4MCwgIkNPTFVNTlMiLCAmZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgRkFTVF9GVU5DIHRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0cCkKK3sKKwlyZXR1cm4gdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQU5PVywgdHApOworfQorCitwaWRfdCBGQVNUX0ZVTkMgc2FmZV93YWl0cGlkKHBpZF90IHBpZCwgaW50ICp3c3RhdCwgaW50IG9wdGlvbnMpCit7CisJcGlkX3QgcjsKKworCWRvCisJCXIgPSB3YWl0cGlkKHBpZCwgd3N0YXQsIG9wdGlvbnMpOworCXdoaWxlICgociA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisJcmV0dXJuIHI7Cit9CisKK3BpZF90IEZBU1RfRlVOQyB3YWl0X2FueV9ub2hhbmcoaW50ICp3c3RhdCkKK3sKKwlyZXR1cm4gc2FmZV93YWl0cGlkKC0xLCB3c3RhdCwgV05PSEFORyk7Cit9CisKKy8vIFdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgY2hpbGQgUElEIHRvIGV4aXQsIHJldHVybmluZyBjaGlsZCdzIGVycm9yIHJldHVybi4KK2ludCBGQVNUX0ZVTkMgd2FpdDRwaWQocGlkX3QgcGlkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAocGlkIDw9IDApIHsKKwkJLyplcnJubyA9IEVDSElMRDsgLS0gd3JvbmcuICovCisJCS8qIHdlIGV4cGVjdCBlcnJubyB0byBiZSBhbHJlYWR5IHNldCBmcm9tIGZhaWxlZCBbdl1mb3JrL2V4ZWMgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCXJldHVybiBXRVhJVFNUQVRVUyhzdGF0dXMpOworCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQlyZXR1cm4gV1RFUk1TSUcoc3RhdHVzKSArIDB4MTgwOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYmIveGZ1bmNzX3ByaW50Zi5jIGIvbGliYmIveGZ1bmNzX3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZWU0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi94ZnVuY3NfcHJpbnRmLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYiBMYW5kbGV5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFdlIG5lZWQgdG8gaGF2ZSBzZXBhcmF0ZSB4ZnVuY3MuYyBhbmQgeGZ1bmNzX3ByaW50Zi5jIGJlY2F1c2UKKyAqIHdpdGggY3VycmVudCBsaW5rZXJzLCBldmVuIHdpdGggc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24sCisgKiBpZiAqLm8gbW9kdWxlIHJlZmVyZW5jZXMgYW55IG9mIFhYWHByaW50ZiBmdW5jdGlvbnMsIHlvdSBwdWxsIGluCisgKiBlbnRpcmUgcHJpbnRmIG1hY2hpbmVyeS4gRXZlbiBpZiB5b3UgZG8gbm90IHVzZSB0aGUgZnVuY3Rpb24KKyAqIHdoaWNoIHVzZXMgWFhYcHJpbnRmLgorICoKKyAqIHhmdW5jcy5jIGNvbnRhaW5zIGZ1bmN0aW9ucyAobm90IG5lY2Vzc2FyaWx5IHhmdW5jcykKKyAqIHdoaWNoIGRvIG5vdCBwdWxsIGluIHByaW50ZiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KKyAqIHhmdW5jX3ByaW50Zi5jIGNvbnRhaW5zIHRob3NlIHdoaWNoIGRvLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKKy8qIEFsbCB0aGUgZnVuY3Rpb25zIHN0YXJ0aW5nIHdpdGggIngiIGNhbGwgYmJfZXJyb3JfbXNnX2FuZF9kaWUoKSBpZiB0aGV5CisgKiBmYWlsLCBzbyBjYWxsZXJzIG5ldmVyIG5lZWQgdG8gY2hlY2sgZm9yIGVycm9ycy4gIElmIGl0IHJldHVybmVkLCBpdAorICogc3VjY2VlZGVkLiAqLworCisjaWZuZGVmIERNQUxMT0MKKy8qIGRtYWxsb2MgcHJvdmlkZXMgdmFyaWFudHMgb2YgdGhlc2UgdGhhdCBkbyBhYm9ydCgpIG9uIGZhaWx1cmUuCisgKiBTaW5jZSBkbWFsbG9jJ3MgcHJvdG90eXBlcyBvdmVyd3JpdGUgdGhlIGltcGxzIGhlcmUgYXMgdGhleSBhcmUKKyAqIGluY2x1ZGVkIGFmdGVyIHRoZXNlIHByb3RvdHlwZXMgaW4gbGliYmIuaCwgYWxsIGlzIHdlbGwuCisgKi8KKy8vIFdhcm4gaWYgd2UgY2FuJ3QgYWxsb2NhdGUgc2l6ZSBieXRlcyBvZiBtZW1vcnkuCit2b2lkKiBGQVNUX0ZVTkMgbWFsbG9jX29yX3dhcm4oc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcHRyID0gbWFsbG9jKHNpemUpOworCWlmIChwdHIgPT0gTlVMTCAmJiBzaXplICE9IDApCisJCWJiX2Vycm9yX21zZyhiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHB0cjsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IGFsbG9jYXRlIHNpemUgYnl0ZXMgb2YgbWVtb3J5Lgordm9pZCogRkFTVF9GVU5DIHhtYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcHRyID0gbWFsbG9jKHNpemUpOworCWlmIChwdHIgPT0gTlVMTCAmJiBzaXplICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlyZXR1cm4gcHRyOworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3QgcmVzaXplIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4gIChUaGlzIHJldHVybnMgYSBwb2ludGVyCisvLyB0byB0aGUgbmV3IG1lbW9yeSwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG9sZCBtZW1vcnkuCisvLyBJdCdsbCBjb3B5IHRoZSBjb250ZW50cyB0byBhIG5ldyBjaHVuayBhbmQgZnJlZSB0aGUgb2xkIG9uZSBpZiBuZWNlc3NhcnkuKQordm9pZCogRkFTVF9GVU5DIHhyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJcHRyID0gcmVhbGxvYyhwdHIsIHNpemUpOworCWlmIChwdHIgPT0gTlVMTCAmJiBzaXplICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwlyZXR1cm4gcHRyOworfQorI2VuZGlmIC8qIERNQUxMT0MgKi8KKworLy8gRGllIGlmIHdlIGNhbid0IGFsbG9jYXRlIGFuZCB6ZXJvIHNpemUgYnl0ZXMgb2YgbWVtb3J5Lgordm9pZCogRkFTVF9GVU5DIHh6YWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcHRyID0geG1hbGxvYyhzaXplKTsKKwltZW1zZXQocHRyLCAwLCBzaXplKTsKKwlyZXR1cm4gcHRyOworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3QgY29weSBhIHN0cmluZyB0byBmcmVzaGx5IGFsbG9jYXRlZCBtZW1vcnkuCitjaGFyKiBGQVNUX0ZVTkMgeHN0cmR1cChjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnQ7CisKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXQgPSBzdHJkdXAocyk7CisKKwlpZiAodCA9PSBOVUxMKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisKKwlyZXR1cm4gdDsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IGFsbG9jYXRlIG4rMSBieXRlcyAoc3BhY2UgZm9yIHRoZSBudWxsIHRlcm1pbmF0b3IpIGFuZCBjb3B5CisvLyB0aGUgKHBvc3NpYmx5IHRydW5jYXRlZCB0byBsZW5ndGggbikgc3RyaW5nIGludG8gaXQuCitjaGFyKiBGQVNUX0ZVTkMgeHN0cm5kdXAoY29uc3QgY2hhciAqcywgaW50IG4pCit7CisJaW50IG07CisJY2hhciAqdDsKKworCWlmIChFTkFCTEVfREVCVUcgJiYgcyA9PSBOVUxMKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgieHN0cm5kdXAgYnVnIik7CisKKwkvKiBXZSBjYW4ganVzdCB4bWFsbG9jKG4rMSkgYW5kIHN0cm5jcHkgaW50byBpdCwgKi8KKwkvKiBidXQgdGhpbmsgYWJvdXQgeHN0cm5kdXAoImFiYyIsIDEwMDAwKSB3YXN0YWdlISAqLworCW0gPSBuOworCXQgPSAoY2hhciopIHM7CisJd2hpbGUgKG0pIHsKKwkJaWYgKCEqdCkgYnJlYWs7CisJCW0tLTsKKwkJdCsrOworCX0KKwluIC09IG07CisJdCA9IHhtYWxsb2MobiArIDEpOworCXRbbl0gPSAnXDAnOworCisJcmV0dXJuIG1lbWNweSh0LCBzLCBuKTsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IG9wZW4gYSBmaWxlIGFuZCByZXR1cm4gYSBGSUxFKiB0byBpdC4KKy8vIE5vdGljZSB3ZSBoYXZlbid0IGdvdCB4ZnJlYWQoKSwgVGhpcyBpcyBmb3IgdXNlIHdpdGggZnNjYW5mKCkgYW5kIGZyaWVuZHMuCitGSUxFKiBGQVNUX0ZVTkMgeGZvcGVuKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisJRklMRSAqZnAgPSBmb3BlbihwYXRoLCBtb2RlKTsKKwlpZiAoZnAgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBwYXRoKTsKKwlyZXR1cm4gZnA7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBvcGVuIGEgZmlsZSBhbmQgcmV0dXJuIGEgZmQuCitpbnQgRkFTVF9GVU5DIHhvcGVuMyhjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gb3BlbihwYXRobmFtZSwgZmxhZ3MsIG1vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgcGF0aG5hbWUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3Qgb3BlbiBhIGZpbGUgYW5kIHJldHVybiBhIGZkLgoraW50IEZBU1RfRlVOQyB4b3Blbihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzKQoreworCXJldHVybiB4b3BlbjMocGF0aG5hbWUsIGZsYWdzLCAwNjY2KTsKK30KKworLyogRGllIGlmIHdlIGNhbid0IG9wZW4gYW4gZXhpc3RpbmcgZmlsZSByZWFkb25seSB3aXRoIE9fTk9OQkxPQ0sKKyAqIGFuZCByZXR1cm4gdGhlIGZkLgorICogTm90ZSB0aGF0IGZvciBpb2N0bCBPX1JET05MWSBpcyBzdWZmaWNpZW50LgorICovCitpbnQgRkFTVF9GVU5DIHhvcGVuX25vbmJsb2NraW5nKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCXJldHVybiB4b3BlbihwYXRobmFtZSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKK30KKworLy8gV2FybiBpZiB3ZSBjYW4ndCBvcGVuIGEgZmlsZSBhbmQgcmV0dXJuIGEgZmQuCitpbnQgRkFTVF9GVU5DIG9wZW4zX29yX3dhcm4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisJaW50IHJldDsKKworCXJldCA9IG9wZW4ocGF0aG5hbWUsIGZsYWdzLCBtb2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLCBwYXRobmFtZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8vIFdhcm4gaWYgd2UgY2FuJ3Qgb3BlbiBhIGZpbGUgYW5kIHJldHVybiBhIGZkLgoraW50IEZBU1RfRlVOQyBvcGVuX29yX3dhcm4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gb3BlbjNfb3Jfd2FybihwYXRobmFtZSwgZmxhZ3MsIDA2NjYpOworfQorCit2b2lkIEZBU1RfRlVOQyB4dW5saW5rKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWlmICh1bmxpbmsocGF0aG5hbWUpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlbW92ZSBmaWxlICclcyciLCBwYXRobmFtZSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHhyZW5hbWUoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkKK3sKKwlpZiAocmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1vdmUgJyVzJyB0byAnJXMnIiwgb2xkcGF0aCwgbmV3cGF0aCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgcmVuYW1lX29yX3dhcm4oY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkKK3sKKwlpbnQgbiA9IHJlbmFtZShvbGRwYXRoLCBuZXdwYXRoKTsKKwlpZiAobikKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgbW92ZSAnJXMnIHRvICclcyciLCBvbGRwYXRoLCBuZXdwYXRoKTsKKwlyZXR1cm4gbjsKK30KKwordm9pZCBGQVNUX0ZVTkMgeHBpcGUoaW50IGZpbGVkZXNbMl0pCit7CisJaWYgKHBpcGUoZmlsZWRlcykpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY3JlYXRlIHBpcGUiKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGR1cDIoaW50IGZyb20sIGludCB0bykKK3sKKwlpZiAoZHVwMihmcm9tLCB0bykgIT0gdG8pCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvciIpOworfQorCisvLyAiUmVudW1iZXIiIG9wZW5lZCBmZAordm9pZCBGQVNUX0ZVTkMgeG1vdmVfZmQoaW50IGZyb20sIGludCB0bykKK3sKKwlpZiAoZnJvbSA9PSB0bykKKwkJcmV0dXJuOworCXhkdXAyKGZyb20sIHRvKTsKKwljbG9zZShmcm9tKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCB3cml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4KK3ZvaWQgRkFTVF9GVU5DIHh3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQlzc2l6ZV90IHNpemUgPSBmdWxsX3dyaXRlKGZkLCBidWYsIGNvdW50KTsKKwkJaWYgKChzaXplX3Qpc2l6ZSAhPSBjb3VudCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzaG9ydCB3cml0ZSIpOworCX0KK30KK3ZvaWQgRkFTVF9GVU5DIHh3cml0ZV9zdHIoaW50IGZkLCBjb25zdCBjaGFyICpzdHIpCit7CisJeHdyaXRlKGZkLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGNsb3NlKGludCBmZCkKK3sKKwlpZiAoY2xvc2UoZmQpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNsb3NlIGZhaWxlZCIpOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IGxzZWVrIHRvIHRoZSByaWdodCBzcG90Lgorb2ZmX3QgRkFTVF9GVU5DIHhsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKwlvZmZfdCBvZmYgPSBsc2VlayhmZCwgb2Zmc2V0LCB3aGVuY2UpOworCWlmIChvZmYgPT0gKG9mZl90KS0xKSB7CisJCWlmICh3aGVuY2UgPT0gU0VFS19TRVQpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImxzZWVrKCUiT0ZGX0ZNVCJ1KSIsIG9mZnNldCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibHNlZWsiKTsKKwl9CisJcmV0dXJuIG9mZjsKK30KKworaW50IEZBU1RfRlVOQyB4bWtzdGVtcChjaGFyICp0ZW1wbGF0ZSkKK3sKKwlpbnQgZmQgPSBta3N0ZW1wKHRlbXBsYXRlKTsKKwlpZiAoZmQgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNyZWF0ZSB0ZW1wIGZpbGUgJyVzJyIsIHRlbXBsYXRlKTsKKwlyZXR1cm4gZmQ7Cit9CisKKy8vIERpZSB3aXRoIHN1cHBsaWVkIGZpbGVuYW1lIGlmIHRoaXMgRklMRSogaGFzIGZlcnJvciBzZXQuCit2b2lkIEZBU1RfRlVOQyBkaWVfaWZfZmVycm9yKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmbikKK3sKKwlpZiAoZmVycm9yKGZwKSkgeworCQkvKiBmZXJyb3IgZG9lc24ndCBzZXQgdXNlZnVsIGVycm5vICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogSS9PIGVycm9yIiwgZm4pOworCX0KK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBzdGRvdXQgaGFzIGZlcnJvciBzZXQuCit2b2lkIEZBU1RfRlVOQyBkaWVfaWZfZmVycm9yX3N0ZG91dCh2b2lkKQoreworCWRpZV9pZl9mZXJyb3Ioc3Rkb3V0LCBiYl9tc2dfc3RhbmRhcmRfb3V0cHV0KTsKK30KKworaW50IEZBU1RfRlVOQyBmZmx1c2hfYWxsKHZvaWQpCit7CisJcmV0dXJuIGZmbHVzaChOVUxMKTsKK30KKworCitpbnQgRkFTVF9GVU5DIGJiX3B1dGNoYXIoaW50IGNoKQoreworCXJldHVybiBwdXRjaGFyKGNoKTsKK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBjb3B5IGFuIGVudGlyZSBGSUxFKiB0byBzdGRvdXQsCisgKiB0aGVuIGNsb3NlIHRoYXQgZmlsZS4gKi8KK3ZvaWQgRkFTVF9GVU5DIHhwcmludF9hbmRfY2xvc2VfZmlsZShGSUxFICpmaWxlKQoreworCWZmbHVzaF9hbGwoKTsKKwkvLyBjb3B5ZmQgb3V0cHV0cyBlcnJvciBtZXNzYWdlcyBmb3IgdXMuCisJaWYgKGJiX2NvcHlmZF9lb2YoZmlsZW5vKGZpbGUpLCBTVERPVVRfRklMRU5PKSA9PSAtMSkKKwkJeGZ1bmNfZGllKCk7CisKKwlmY2xvc2UoZmlsZSk7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgbWFsbG9jKCkgZW5vdWdoIHNwYWNlIGFuZCBkbyBhbgorLy8gc3ByaW50ZigpIGludG8gdGhhdCBzcGFjZS4KK2NoYXIqIEZBU1RfRlVOQyB4YXNwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwOworCWludCByOworCWNoYXIgKnN0cmluZ19wdHI7CisKKwl2YV9zdGFydChwLCBmb3JtYXQpOworCXIgPSB2YXNwcmludGYoJnN0cmluZ19wdHIsIGZvcm1hdCwgcCk7CisJdmFfZW5kKHApOworCisJaWYgKHIgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHN0cmluZ19wdHI7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHhzZXRlbnYoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoc2V0ZW52KGtleSwgdmFsdWUsIDEpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7Cit9CisKKy8qIEhhbmRsZXMgIlZBUj1WQUwiIHN0cmluZ3MsIGV2ZW4gdGhvc2Ugd2hpY2ggYXJlIHBhcnQgb2YgZW52aXJvbgorICogX3JpZ2h0IG5vd18KKyAqLwordm9pZCBGQVNUX0ZVTkMgYmJfdW5zZXRlbnYoY29uc3QgY2hhciAqdmFyKQoreworCWNoYXIgKnRwID0gc3RyY2hyKHZhciwgJz0nKTsKKworCWlmICghdHApIHsKKwkJdW5zZXRlbnYodmFyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluIGNhc2UgdmFyIHdhcyBwdXRlbnYnZWQsIHdlIGNhbid0IHJlcGxhY2UgJz0nCisJICogd2l0aCBOVUwgYW5kIHVuc2V0ZW52KHZhcikgLSBpdCB3b24ndCB3b3JrLAorCSAqIGVudiBpcyBtb2RpZmllZCBieSB0aGUgcmVwbGFjZW1lbnQsIHVuc2V0ZW52CisJICogc2VlcyAiVkFSIiBpbnN0ZWFkIG9mICJWQVI9VkFMIiBhbmQgZG9lcyBub3QgcmVtb3ZlIGl0IQorCSAqIGhvcnJvciA6KCAqLworCXRwID0geHN0cm5kdXAodmFyLCB0cCAtIHZhcik7CisJdW5zZXRlbnYodHApOworCWZyZWUodHApOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl91bnNldGVudl9hbmRfZnJlZShjaGFyICp2YXIpCit7CisJYmJfdW5zZXRlbnYodmFyKTsKKwlmcmVlKHZhcik7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3Qgc2V0IGdpZC4gIChCZWNhdXNlIHJlc291cmNlIGxpbWl0cyBtYXkKKy8vIGxpbWl0IHRoaXMgdXNlciB0byBhIGdpdmVuIG51bWJlciBvZiBwcm9jZXNzZXMsIGFuZCBpZiB0aGF0IGZpbGxzIHVwIHRoZQorLy8gc2V0Z2lkKCkgd2lsbCBmYWlsIGFuZCB3ZSdsbCBfc3RpbGxfYmVfcm9vdF8sIHdoaWNoIGlzIGJhZC4pCit2b2lkIEZBU1RfRlVOQyB4c2V0Z2lkKGdpZF90IGdpZCkKK3sKKwlpZiAoc2V0Z2lkKGdpZCkpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0Z2lkIik7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3Qgc2V0IHVpZC4gIChTZWUgeHNldGdpZCgpIGZvciB3aHkuKQordm9pZCBGQVNUX0ZVTkMgeHNldHVpZCh1aWRfdCB1aWQpCit7CisJaWYgKHNldHVpZCh1aWQpKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHVpZCIpOworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3QgY2hkaXIgdG8gYSBuZXcgcGF0aC4KK3ZvaWQgRkFTVF9GVU5DIHhjaGRpcihjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChjaGRpcihwYXRoKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjaGRpciglcykiLCBwYXRoKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGNocm9vdChjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChjaHJvb3QocGF0aCkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY2hhbmdlIHJvb3QgZGlyZWN0b3J5IHRvICVzIiwgcGF0aCk7Cit9CisKKy8vIFByaW50IGEgd2FybmluZyBtZXNzYWdlIGlmIG9wZW5kaXIoKSBmYWlscywgYnV0IGRvbid0IGRpZS4KK0RJUiogRkFTVF9GVU5DIHdhcm5fb3BlbmRpcihjb25zdCBjaGFyICpwYXRoKQoreworCURJUiAqZHA7CisKKwlkcCA9IG9wZW5kaXIocGF0aCk7CisJaWYgKCFkcCkKKwkJYmJfcGVycm9yX21zZygiY2FuJ3Qgb3BlbiAnJXMnIiwgcGF0aCk7CisJcmV0dXJuIGRwOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG9wZW5kaXIoKSBmYWlscy4KK0RJUiogRkFTVF9GVU5DIHhvcGVuZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkcDsKKworCWRwID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoIWRwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIHBhdGgpOworCXJldHVybiBkcDsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBvcGVuIGEgbmV3IHNvY2tldC4KK2ludCBGQVNUX0ZVTkMgeHNvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworCWludCByID0gc29ja2V0KGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworCisJaWYgKHIgPCAwKSB7CisJCS8qIEhpamFjayB2YWd1ZWx5IHJlbGF0ZWQgY29uZmlnIG9wdGlvbiAqLworI2lmIEVOQUJMRV9WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTCisJCWNvbnN0IGNoYXIgKnMgPSAiSU5FVCI7CisjIGlmZGVmIEFGX1BBQ0tFVAorCQlpZiAoZG9tYWluID09IEFGX1BBQ0tFVCkgcyA9ICJQQUNLRVQiOworIyBlbmRpZgorIyBpZmRlZiBBRl9ORVRMSU5LCisJCWlmIChkb21haW4gPT0gQUZfTkVUTElOSykgcyA9ICJORVRMSU5LIjsKKyMgZW5kaWYKK0lGX0ZFQVRVUkVfSVBWNihpZiAoZG9tYWluID09IEFGX0lORVQ2KSBzID0gIklORVQ2IjspCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic29ja2V0KEFGXyVzLCVkLCVkKSIsIHMsIHR5cGUsIHByb3RvY29sKTsKKyNlbHNlCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic29ja2V0Iik7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBiaW5kIGEgc29ja2V0IHRvIGFuIGFkZHJlc3MuCit2b2lkIEZBU1RfRlVOQyB4YmluZChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKm15X2FkZHIsIHNvY2tsZW5fdCBhZGRybGVuKQoreworCWlmIChiaW5kKHNvY2tmZCwgbXlfYWRkciwgYWRkcmxlbikpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYmluZCIpOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24gYSBzb2NrZXQuCit2b2lkIEZBU1RfRlVOQyB4bGlzdGVuKGludCBzLCBpbnQgYmFja2xvZykKK3sKKwlpZiAobGlzdGVuKHMsIGJhY2tsb2cpKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoImxpc3RlbiIpOworfQorCisvKiBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHNlbmR0byBmYWlsZWQuCisgKiBSZXR1cm4gYnl0ZXMgc2VudCBvdGhlcndpc2UgICovCitzc2l6ZV90IEZBU1RfRlVOQyB4c2VuZHRvKGludCBzLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sCisJCQkJc29ja2xlbl90IHRvbGVuKQoreworCXNzaXplX3QgcmV0ID0gc2VuZHRvKHMsIGJ1ZiwgbGVuLCAwLCB0bywgdG9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlKHMpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNlbmR0byIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvLyB4c3RhdCgpIC0gYSBzdGF0KCkgd2hpY2ggZGllcyBvbiBmYWlsdXJlIHdpdGggbWVhbmluZ2Z1bCBlcnJvciBtZXNzYWdlCit2b2lkIEZBU1RfRlVOQyB4c3RhdChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdF9idWYpCit7CisJaWYgKHN0YXQobmFtZSwgc3RhdF9idWYpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHN0YXQgJyVzJyIsIG5hbWUpOworfQorCit2b2lkIEZBU1RfRlVOQyB4ZnN0YXQoaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqc3RhdF9idWYsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwkvKiBlcnJtc2cgaXMgdXN1YWxseSBhIGZpbGUgbmFtZSwgYnV0IG5vdCBhbHdheXM6CisJICogeGZzdGF0IG1heSBiZSBjYWxsZWQgaW4gYSBzcG90IHdoZXJlIGZpbGUgbmFtZSBpcyBubyBsb25nZXIKKwkgKiBhdmFpbGFibGUsIGFuZCBjYWxsZXIgbWF5IGdpdmUgZS5nLiAiY2FuJ3Qgc3RhdCBpbnB1dCBmaWxlIiBzdHJpbmcuCisJICovCisJaWYgKGZzdGF0KGZkLCBzdGF0X2J1ZikpCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoZXJybXNnKTsKK30KKworLy8gc2VsaW51eF9vcl9kaWUoKSAtIGRpZSBpZiBTRUxpbnV4IGlzIGRpc2FibGVkLgordm9pZCBGQVNUX0ZVTkMgc2VsaW51eF9vcl9kaWUodm9pZCkKK3sKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWludCByYyA9IGlzX3NlbGludXhfZW5hYmxlZCgpOworCWlmIChyYyA9PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTRUxpbnV4IGlzIGRpc2FibGVkIik7CisJfSBlbHNlIGlmIChyYyA8IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlzX3NlbGludXhfZW5hYmxlZCgpIGZhaWxlZCIpOworCX0KKyNlbHNlCisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlNFTGludXggc3VwcG9ydCBpcyBkaXNhYmxlZCIpOworI2VuZGlmCit9CisKK2ludCBGQVNUX0ZVTkMgaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpmbXQsLi4uKQoreworCWludCByZXQ7CisJdmFfbGlzdCBwOworCisJcmV0ID0gaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApOworCWlmIChyZXQgPCAwKSB7CisJCXZhX3N0YXJ0KHAsIGZtdCk7CisJCWJiX3ZlcnJvcl9tc2coZm10LCBwLCBzdHJlcnJvcihlcnJubykpOworCQkvKiB4ZnVuY19kaWUgY2FuIGFjdHVhbGx5IGxvbmdqbXAsIHNvIGJlIG5pY2UgKi8KKwkJdmFfZW5kKHApOworCQl4ZnVuY19kaWUoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IEZBU1RfRlVOQyBpb2N0bF9vcl9wZXJyb3IoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpmbXQsLi4uKQoreworCXZhX2xpc3QgcDsKKwlpbnQgcmV0ID0gaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApOworCisJaWYgKHJldCA8IDApIHsKKwkJdmFfc3RhcnQocCwgZm10KTsKKwkJYmJfdmVycm9yX21zZyhmbXQsIHAsIHN0cmVycm9yKGVycm5vKSk7CisJCXZhX2VuZChwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmIEVOQUJMRV9JT0NUTF9IRVgyU1RSX0VSUk9SCitpbnQgRkFTVF9GVU5DIGJiX2lvY3RsX29yX3dhcm4oaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICppb2N0bF9uYW1lKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJncCk7CisJaWYgKHJldCA8IDApCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGlvY3RsX25hbWUpOworCXJldHVybiByZXQ7Cit9CitpbnQgRkFTVF9GVU5DIGJiX3hpb2N0bChpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3AsIGNvbnN0IGNoYXIgKmlvY3RsX25hbWUpCit7CisJaW50IHJldDsKKworCXJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmdwKTsKKwlpZiAocmV0IDwgMCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShpb2N0bF9uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKK2ludCBGQVNUX0ZVTkMgYmJfaW9jdGxfb3Jfd2FybihpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3ApCit7CisJaW50IHJldDsKKworCXJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmdwKTsKKwlpZiAocmV0IDwgMCkKKwkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIHJlcXVlc3QpOworCXJldHVybiByZXQ7Cit9CitpbnQgRkFTVF9GVU5DIGJiX3hpb2N0bChpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3ApCit7CisJaW50IHJldDsKKworCXJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmdwKTsKKwlpZiAocmV0IDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpb2N0bCAlI3ggZmFpbGVkIiwgcmVxdWVzdCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY190dHluYW1lKGludCBmZCkKK3sKKwljaGFyICpidWYgPSB4emFsbG9jKDEyOCk7CisJaW50IHIgPSB0dHluYW1lX3IoZmQsIGJ1ZiwgMTI3KTsKKwlpZiAocikgeworCQlmcmVlKGJ1Zik7CisJCWJ1ZiA9IE5VTEw7CisJfQorCXJldHVybiBidWY7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGdlbmVyYXRlX3V1aWQodWludDhfdCAqYnVmKQoreworCS8qIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0CisJICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9sb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCSAqIHwgICAgICAgdGltZV9taWQgICAgICAgICAgICAgICAgfCAgICAgICAgIHRpbWVfaGlfYW5kX3ZlcnNpb24gICB8CisJICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKwkgKiB8Y2xrX3NlcV9hbmRfdmFyaWFudCAgICAgICAgICAgIHwgICAgICAgICBub2RlICgwLTEpICAgICAgICAgICAgfAorCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJICogfCAgICAgICAgICAgICAgICAgICAgICAgICBub2RlICgyLTUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCSAqIElPVywgdXVpZCBoYXMgdGhpcyBsYXlvdXQ6CisJICogdWludDMyX3QgdGltZV9sb3cgKGJpZyBlbmRpYW4pCisJICogdWludDE2X3QgdGltZV9taWQgKGJpZyBlbmRpYW4pCisJICogdWludDE2X3QgdGltZV9oaV9hbmRfdmVyc2lvbiAoYmlnIGVuZGlhbikKKwkgKiAgdmVyc2lvbiBpcyBhIDQtYml0IGZpZWxkOgorCSAqICAgMSBUaW1lLWJhc2VkCisJICogICAyIERDRSBTZWN1cml0eSwgd2l0aCBlbWJlZGRlZCBQT1NJWCBVSURzCisJICogICAzIE5hbWUtYmFzZWQgKE1ENSkKKwkgKiAgIDQgUmFuZG9tbHkgZ2VuZXJhdGVkCisJICogICA1IE5hbWUtYmFzZWQgKFNIQS0xKQorCSAqIHVpbnQxNl90IGNsa19zZXFfYW5kX3ZhcmlhbnQgKGJpZyBlbmRpYW4pCisJICogIHZhcmlhbnQgaXMgYSAzLWJpdCBmaWVsZDoKKwkgKiAgIDB4eCBSZXNlcnZlZCwgTkNTIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwkgKiAgIDEweCBUaGUgdmFyaWFudCBzcGVjaWZpZWQgaW4gcmZjNDEyMgorCSAqICAgMTEwIFJlc2VydmVkLCBNaWNyb3NvZnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCSAqICAgMTExIFJlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbgorCSAqIHVpbnQ4X3Qgbm9kZVs2XQorCSAqCisJICogRm9yIHZlcnNpb24gNCwgdGhlc2UgYml0cyBhcmUgc2V0L2NsZWFyZWQ6CisJICogdGltZV9oaV9hbmRfdmVyc2lvbiAmIDB4MGZmZiB8IDB4NDAwMAorCSAqIGNsa19zZXFfYW5kX3ZhcmlhbnQgJiAweDNmZmYgfCAweDgwMDAKKwkgKi8KKwlwaWRfdCBwaWQ7CisJaW50IGk7CisKKwlpID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworCWlmIChpID49IDApIHsKKwkJcmVhZChpLCBidWYsIDE2KTsKKwkJY2xvc2UoaSk7CisJfQorCS8qIFBhcmFub2lhLiAvZGV2L3VyYW5kb20gbWF5IGJlIG1pc3NpbmcuCisJICogcmFuZCgpIGlzIGd1YXJhbnRlZWQgdG8gZ2VuZXJhdGUgYXQgbGVhc3QgWzAsIDJeMTUpIHJhbmdlLAorCSAqIGJ1dCBsb3dlc3QgYml0cyBpbiBzb21lIGxpYmMgYXJlIG5vdCBzbyAicmFuZG9tIi4gICovCisJc3JhbmQobW9ub3RvbmljX3VzKCkpOyAvKiBwdWxscyBpbiBwcmludGYgKi8KKwlwaWQgPSBnZXRwaWQoKTsKKwl3aGlsZSAoMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWJ1ZltpXSBePSByYW5kKCkgPj4gNTsKKwkJaWYgKHBpZCA9PSAwKQorCQkJYnJlYWs7CisJCXNyYW5kKHBpZCk7CisJCXBpZCA9IDA7CisJfQorCisJLyogdmVyc2lvbiA9IDQgKi8KKwlidWZbNCArIDIgICAgXSA9IChidWZbNCArIDIgICAgXSAmIDB4MGYpIHwgMHg0MDsKKwkvKiB2YXJpYW50ID0gMTB4ICovCisJYnVmWzQgKyAyICsgMl0gPSAoYnVmWzQgKyAyICsgMl0gJiAweDNmKSB8IDB4ODA7Cit9CisKKyNpZiBCQl9NTVUKK3BpZF90IEZBU1RfRlVOQyB4Zm9yayh2b2lkKQoreworCXBpZF90IHBpZDsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIC8qIHd0Zj8gKi8KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJ2Zm9yayIrMSk7CisJcmV0dXJuIHBpZDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIveGdldGN3ZC5jIGIvbGliYmIveGdldGN3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzIwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi94Z2V0Y3dkLmMKQEAgLTAsMCArMSw0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogeGdldGN3ZC5jIC0tIHJldHVybiBjdXJyZW50IGRpcmVjdG9yeSB3aXRoIHVubGltaXRlZCBsZW5ndGgKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LgorICoKKyAqIFNwZWNpYWwgZnVuY3Rpb24gZm9yIGJ1c3lib3ggd3JpdHRlbiBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgbmV3bHkgYWxsb2NhdGVkLCBhcmJpdHJhcmlseSBsb25nLgorICAgUmV0dXJuIE5VTEwgYW5kIHNldCBlcnJubyBvbiBlcnJvci4KKyAgIElmIGFyZ3VtZW50IGlzIG5vdCBOVUxMIChwcmV2aW91cyB1c2FnZSBhbGxvY2F0ZSBtZW1vcnkpLCBjYWxsIGZyZWUoKQorKi8KKworY2hhciogRkFTVF9GVU5DCit4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihjaGFyICpjd2QpCit7CisjZGVmaW5lIFBBVEhfSU5DUiA2NAorCisJY2hhciAqcmV0OworCXVuc2lnbmVkIHBhdGhfbWF4OworCisJcGF0aF9tYXggPSAxMjg7IC8qIDEyOCArIDY0IHNob3VsZCBiZSBlbm91Z2ggZm9yIDk5JSBvZiBjYXNlcyAqLworCisJd2hpbGUgKDEpIHsKKwkJcGF0aF9tYXggKz0gUEFUSF9JTkNSOworCQljd2QgPSB4cmVhbGxvYyhjd2QsIHBhdGhfbWF4KTsKKwkJcmV0ID0gZ2V0Y3dkKGN3ZCwgcGF0aF9tYXgpOworCQlpZiAocmV0ID09IE5VTEwpIHsKKwkJCWlmIChlcnJubyA9PSBFUkFOR0UpCisJCQkJY29udGludWU7CisJCQlmcmVlKGN3ZCk7CisJCQliYl9wZXJyb3JfbXNnKCJnZXRjd2QiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWN3ZCA9IHhyZWFsbG9jKGN3ZCwgc3RybGVuKGN3ZCkgKyAxKTsKKwkJcmV0dXJuIGN3ZDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJiYi94Z2V0aG9zdGJ5bmFtZS5jIGIvbGliYmIveGdldGhvc3RieW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQwMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGdldGhvc3RieW5hbWUuYwpAQCAtMCwwICsxLDE3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHhnZXRob3N0YnluYW1lIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1Pi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IGhvc3RlbnQqIEZBU1RfRlVOQyB4Z2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBob3N0ZW50ICpyZXR2YWwgPSBnZXRob3N0YnluYW1lKG5hbWUpOworCWlmICghcmV0dmFsKQorCQliYl9oZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgbmFtZSk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3hyZWFkbGluay5jIGIvbGliYmIveHJlYWRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5NWFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3hyZWFkbGluay5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB4cmVhZGxpbmsuYyAtIHNhZmUgaW1wbGVtZW50YXRpb24gb2YgcmVhZGxpbmsuCisgKiBSZXR1cm5zIGEgTlVMTCBvbiBmYWlsdXJlLi4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hbGxvY2VkIGNoYXIqIHRoYXQgeW91IHdpbGwgaGF2ZSB0byBmcmVlCisgKiB5b3Vyc2VsZi4KKyAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfcmVhZGxpbmsoY29uc3QgY2hhciAqcGF0aCkKK3sKKwllbnVtIHsgR1JPV0JZID0gODAgfTsgLyogaG93IGxhcmdlIHdlIHdpbGwgZ3JvdyBzdHJpbmdzIGJ5ICovCisKKwljaGFyICpidWYgPSBOVUxMOworCWludCBidWZzaXplID0gMCwgcmVhZHNpemUgPSAwOworCisJZG8geworCQlidWZzaXplICs9IEdST1dCWTsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCBidWZzaXplKTsKKwkJcmVhZHNpemUgPSByZWFkbGluayhwYXRoLCBidWYsIGJ1ZnNpemUpOworCQlpZiAocmVhZHNpemUgPT0gLTEpIHsKKwkJCWZyZWUoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSB3aGlsZSAoYnVmc2l6ZSA8IHJlYWRzaXplICsgMSk7CisKKwlidWZbcmVhZHNpemVdID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgbm90IHRoZSBzYW1lIGFzIHJlYWxwYXRoKCksIHdoaWNoCisgKiBjYW5vbmljYWxpemVzIHRoZSBnaXZlbiBwYXRoIGNvbXBsZXRlbHkuIFRoaXMgcm91dGluZSBvbmx5CisgKiBmb2xsb3dzIHRyYWlsaW5nIHN5bWxpbmtzIHVudGlsIGEgcmVhbCBmaWxlIGlzIHJlYWNoZWQgYW5kCisgKiByZXR1cm5zIGl0cyBuYW1lLiBJZiB0aGUgcGF0aCBlbmRzIGluIGEgZGFuZ2xpbmcgbGluayBvciBpZgorICogdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0LCB0aGUgcGF0aCBpcyByZXR1cm5lZCBpbiBhbnkgY2FzZS4KKyAqIEludGVybWVkaWF0ZSBzeW1saW5rcyBpbiB0aGUgcGF0aCBhcmUgbm90IGV4cGFuZGVkIC0tIG9ubHkKKyAqIHRob3NlIGF0IHRoZSB0YWlsLgorICogQSBtYWxsb2NlZCBjaGFyKiBpcyByZXR1cm5lZCwgd2hpY2ggbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mb2xsb3dfc3ltbGlua3MoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpidWY7CisJY2hhciAqbHBjOworCWNoYXIgKmxpbmtwYXRoOworCWludCBidWZzaXplOworCWludCBsb29waW5nID0gTUFYU1lNTElOS1MgKyAxOworCisJYnVmID0geHN0cmR1cChwYXRoKTsKKwlnb3RvIGp1bXBfaW47CisKKwl3aGlsZSAoMSkgeworCQlsaW5rcGF0aCA9IHhtYWxsb2NfcmVhZGxpbmsoYnVmKTsKKwkJaWYgKCFsaW5rcGF0aCkgeworCQkJLyogbm90IGEgc3ltbGluaywgb3IgZG9lc24ndCBleGlzdCAqLworCQkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFTk9FTlQpCisJCQkJcmV0dXJuIGJ1ZjsKKwkJCWdvdG8gZnJlZV9idWZfcmV0X251bGw7CisJCX0KKworCQlpZiAoIS0tbG9vcGluZykgeworCQkJZnJlZShsaW5rcGF0aCk7CisgZnJlZV9idWZfcmV0X251bGw6CisJCQlmcmVlKGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICgqbGlua3BhdGggIT0gJy8nKSB7CisJCQlidWZzaXplICs9IHN0cmxlbihsaW5rcGF0aCk7CisJCQlidWYgPSB4cmVhbGxvYyhidWYsIGJ1ZnNpemUpOworCQkJbHBjID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoYnVmKTsKKwkJCXN0cmNweShscGMsIGxpbmtwYXRoKTsKKwkJCWZyZWUobGlua3BhdGgpOworCQl9IGVsc2UgeworCQkJZnJlZShidWYpOworCQkJYnVmID0gbGlua3BhdGg7CisganVtcF9pbjoKKwkJCWJ1ZnNpemUgPSBzdHJsZW4oYnVmKSArIDE7CisJCX0KKwl9Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpidWYgPSB4bWFsbG9jX3JlYWRsaW5rKHBhdGgpOworCWlmICghYnVmKSB7CisJCS8qIEVJTlZBTCA9PiAiZmlsZTogSW52YWxpZCBhcmd1bWVudCIgPT4gcHV6emxlZCB1c2VyICovCisJCWNvbnN0IGNoYXIgKmVycm1zZyA9ICJub3QgYSBzeW1saW5rIjsKKwkJaW50IGVyciA9IGVycm5vOworCQlpZiAoZXJyICE9IEVJTlZBTCkKKwkJCWVycm1zZyA9IHN0cmVycm9yKGVycik7CisJCWJiX2Vycm9yX21zZygiJXM6IGNhbm5vdCByZWFkIGxpbms6ICVzIiwgcGF0aCwgZXJybXNnKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoX19VQ0xJQkNfXykKKwkvKiBnbGliYyBwcm92aWRlcyBhIG5vbi1zdGFuZGFyZCBleHRlbnNpb24gKi8KKwkvKiBuZXc6IFBPU0lYLjEtMjAwOCBzcGVjaWZpZXMgdGhpcyBiZWhhdmlvciBhcyB3ZWxsICovCisJcmV0dXJuIHJlYWxwYXRoKHBhdGgsIE5VTEwpOworI2Vsc2UKKwljaGFyIGJ1ZltQQVRIX01BWCsxXTsKKworCS8qIG9uIGVycm9yIHJldHVybnMgTlVMTCAoeHN0cmR1cChOVUxMKSA9PSBOVUxMKSAqLworCXJldHVybiB4c3RyZHVwKHJlYWxwYXRoKHBhdGgsIGJ1ZikpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJiYi94cmVhbGxvY192ZWN0b3IuYyBiL2xpYmJiL3hyZWFsbG9jX3ZlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDMxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi94cmVhbGxvY192ZWN0b3IuYwpAQCAtMCwwICsxLDQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFJlc2l6ZSAoZ3JvdykgbWFsbG9jZWQgdmVjdG9yLgorICoKKyAqICAjZGVmaW5lIG1hZ2ljIHBhY2tlZCB0d28gcGFyYW1ldGVycyBpbnRvIG9uZToKKyAqICBzaXplb2YgPSBzaXplb2ZfYW5kX3NoaWZ0ID4+IDgKKyAqICBzaGlmdCAgPSAoc2l6ZW9mX2FuZF9zaGlmdCkgJiAweGZmCisgKgorICogTGV0cyBzYXkgc2hpZnQgPSA0LiAxIDw8IDQgPT0gMHgxMC4KKyAqIElmIGlkeCA9PSAwLCAweDEwLCAweDIwIGV0YywgdmVjdG9yW10gaXMgcmVzaXplZCB0byBuZXh0IGhpZ2hlcgorICogaWR4IHN0ZXAsIHBsdXMgb25lOiBpZiBpZHggPT0gMHgyMCwgdmVjdG9yW10gaXMgcmVzaXplZCB0byAweDMxLAorICogdGh1cyBsYXN0IHVzYWJsZSBlbGVtZW50IGlzIHZlY3RvclsweDMwXS4KKyAqCisgKiBJbiBvdGhlciB3b3JkczogYWZ0ZXIgeHJlYWxsb2NfdmVjdG9yKHYsIDQsIGlkeCksIHdpdGggYW55IGlkeCwKKyAqIGl0J3Mgb2sgdG8gdXNlIGF0IGxlYXN0IHZbaWR4XSBhbmQgdltpZHgrMV0uCisgKiB2W2lkeCsyXSBldGMgZ2VuZXJhbGx5IGFyZSBub3Qgb2suCisgKgorICogTmV3IGVsZW1lbnRzIGFyZSB6ZXJvZWQgb3V0LCBidXQgb25seSBpZiByZWFsbG9jIHdhcyBkb25lCisgKiAobm90IG9uIGV2ZXJ5IGNhbGwpLiBZb3UgY2FuIGRlcGVuZCBvbiB2W2lkeF0gYW5kIHZbaWR4KzFdIGJlaW5nCisgKiB6ZXJvZWQgb3V0IGlmIHlvdSB1c2UgaXQgbGlrZSB0aGlzOgorICogIHYgPSB4cmVhbGxvY192ZWN0b3IodiwgNCwgaWR4KTsKKyAqICB2W2lkeF0uc29tZV9maWVsZHMgPSAuLi47IC0gdGhlIHJlc3Qgc3RheXMgMC9OVUxMCisgKiAgaWR4Kys7CisgKiBJZiB5b3UgZG8gbm90IGFkdmFuY2UgaWR4IGxpa2UgYWJvdmUsIHlvdSBzaG91bGQgYmUgbW9yZSBjYXJlZnVsLgorICogTmV4dCBjYWxsIHRvIHhyZWFsbG9jX3ZlY3Rvcih2LCA0LCBpZHgpIG1heSBvciBtYXkgbm90IHplcm8gb3V0IHZbaWR4XS4KKyAqLwordm9pZCogRkFTVF9GVU5DIHhyZWFsbG9jX3ZlY3Rvcl9oZWxwZXIodm9pZCAqdmVjdG9yLCB1bnNpZ25lZCBzaXplb2ZfYW5kX3NoaWZ0LCBpbnQgaWR4KQoreworCWludCBtYXNrID0gMSA8PCAodWludDhfdClzaXplb2ZfYW5kX3NoaWZ0OworCisJaWYgKCEoaWR4ICYgKG1hc2sgLSAxKSkpIHsKKwkJc2l6ZW9mX2FuZF9zaGlmdCA+Pj0gODsgLyogc2l6ZW9mKHZlY3RvclswXSkgKi8KKwkJdmVjdG9yID0geHJlYWxsb2ModmVjdG9yLCBzaXplb2ZfYW5kX3NoaWZ0ICogKGlkeCArIG1hc2sgKyAxKSk7CisJCW1lbXNldCgoY2hhciopdmVjdG9yICsgKHNpemVvZl9hbmRfc2hpZnQgKiBpZHgpLCAwLCBzaXplb2ZfYW5kX3NoaWZ0ICogKG1hc2sgKyAxKSk7CisJfQorCXJldHVybiB2ZWN0b3I7Cit9CmRpZmYgLS1naXQgYS9saWJiYi94cmVnY29tcC5jIGIvbGliYmIveHJlZ2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQwMjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveHJlZ2NvbXAuYwpAQCAtMCwwICsxLDMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworY2hhciogRkFTVF9GVU5DIHJlZ2NvbXBfb3JfZXJybXNnKHJlZ2V4X3QgKnByZWcsIGNvbnN0IGNoYXIgKnJlZ2V4LCBpbnQgY2ZsYWdzKQoreworCWludCByZXQgPSByZWdjb21wKHByZWcsIHJlZ2V4LCBjZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJaW50IGVycm1zZ3N6ID0gcmVnZXJyb3IocmV0LCBwcmVnLCBOVUxMLCAwKTsKKwkJY2hhciAqZXJybXNnID0geG1hbGxvYyhlcnJtc2dzeik7CisJCXJlZ2Vycm9yKHJldCwgcHJlZywgZXJybXNnLCBlcnJtc2dzeik7CisJCXJldHVybiBlcnJtc2c7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIEZBU1RfRlVOQyB4cmVnY29tcChyZWdleF90ICpwcmVnLCBjb25zdCBjaGFyICpyZWdleCwgaW50IGNmbGFncykKK3sKKwljaGFyICplcnJtc2cgPSByZWdjb21wX29yX2Vycm1zZyhwcmVnLCByZWdleCwgY2ZsYWdzKTsKKwlpZiAoZXJybXNnKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgcmVnZXggJyVzJzogJXMiLCByZWdleCwgZXJybXNnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJwd2RncnAvS2J1aWxkLnNyYyBiL2xpYnB3ZGdycC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWUzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwd2RncnAvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDkgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteSA6PSB1aWRnaWRfZ2V0Lm8KKworbGliLSQoQ09ORklHX1VTRV9CQl9QV0RfR1JQKSArPSBwd2RfZ3JwLm8KZGlmZiAtLWdpdCBhL2xpYnB3ZGdycC9wd2RfZ3JwLmMgYi9saWJwd2RncnAvcHdkX2dycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjlkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwd2RncnAvcHdkX2dycC5jCkBAIC0wLDAgKzEsMTA2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDMgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE5vdiA2LCAyMDAzICBJbml0aWFsIHZlcnNpb24uCisgKgorICogTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBxdWl0ZSBzdHJpY3QgYWJvdXQgcmVxdWlyaW5nIGFsbAorICogICAgZmllbGQgc2VwZXJhdG9ycy4gIEl0IGFsc28gZG9lcyBub3QgYWxsb3cgbGVhZGluZyB3aGl0ZXNwYWNlCisgKiAgICBleGNlcHQgd2hlbiBwcm9jZXNzaW5nIHRoZSBudW1lcmljIGZpZWxkcy4gIGdsaWJjIGlzIG1vcmUKKyAqICAgIGxlbmllbnQuICBTZWUgdGhlIHZhcmlvdXMgZ2xpYmMgZGlmZmVyZW5jZSBjb21tZW50cyBiZWxvdy4KKyAqCisgKiBUT0RPOgorICogICAgTW92ZSB0byBkeW5hbWljIGFsbG9jYXRpb24gb2YgKGN1cnJlbnRseSBzdGF0aWNhbGx5IGFsbG9jYXRlZCkKKyAqICAgICAgYnVmZmVyczsgZXNwZWNpYWxseSBmb3IgdGhlIGdyb3VwLXJlbGF0ZWQgZnVuY3Rpb25zIHNpbmNlCisgKiAgICAgIGxhcmdlIGdyb3VwIG1lbWJlciBsaXN0cyB3aWxsIGNhdXNlIGVycm9yIHJldHVybnMuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2l6ZXMgZm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGJ1ZmZlcnMuICovCisKKy8qIElmIHlvdSBjaGFuZ2UgdGhlc2UgdmFsdWVzLCBhbHNvIGNoYW5nZSBfU0NfR0VUUFdfUl9TSVpFX01BWCBhbmQKKyAqIF9TQ19HRVRHUl9SX1NJWkVfTUFYIGluIGxpYmMvdW5pc3RkL3N5c2NvbmYuYyB0byBtYXRjaCAqLworI2RlZmluZSBQV0RfQlVGRkVSX1NJWkUgMjU2CisjZGVmaW5lIEdSUF9CVUZGRVJfU0laRSAyNTYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQcm90b3R5cGVzIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuICovCisKK3N0YXRpYyBpbnQgYmJfX3Bnc3JlYWRlcigKKwkJaW50IEZBU1RfRlVOQyAoKnBhcnNlcmZ1bmMpKHZvaWQgKmQsIGNoYXIgKmxpbmUpLAorCQl2b2lkICpkYXRhLAorCQljaGFyICpfX3Jlc3RyaWN0IGxpbmVfYnVmZiwKKwkJc2l6ZV90IGJ1ZmxlbiwKKwkJRklMRSAqZik7CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJiX19wYXJzZXB3ZW50KHZvaWQgKnB3LCBjaGFyICpsaW5lKTsKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJiX19wYXJzZWdyZW50KHZvaWQgKmdyLCBjaGFyICpsaW5lKTsKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworc3RhdGljIGludCBGQVNUX0ZVTkMgYmJfX3BhcnNlc3BlbnQodm9pZCAqc3AsIGNoYXIgKmxpbmUpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2UgYXZvaWQgaGF2aW5nIGJpZyBnbG9iYWwgZGF0YS4gKi8KKworc3RydWN0IHN0YXRpY3MgeworCS8qIFNtYWxsZXIgdGhpbmdzIGZpcnN0ICovCisJc3RydWN0IHBhc3N3ZCBnZXRwd3VpZF9yZXN1bHRidWY7CisJc3RydWN0IGdyb3VwIGdldGdyZ2lkX3Jlc3VsdGJ1ZjsKKwlzdHJ1Y3QgcGFzc3dkIGdldHB3bmFtX3Jlc3VsdGJ1ZjsKKwlzdHJ1Y3QgZ3JvdXAgZ2V0Z3JuYW1fcmVzdWx0YnVmOworCisJY2hhciBnZXRwd3VpZF9idWZmZXJbUFdEX0JVRkZFUl9TSVpFXTsKKwljaGFyIGdldGdyZ2lkX2J1ZmZlcltHUlBfQlVGRkVSX1NJWkVdOworCWNoYXIgZ2V0cHduYW1fYnVmZmVyW1BXRF9CVUZGRVJfU0laRV07CisJY2hhciBnZXRncm5hbV9idWZmZXJbR1JQX0JVRkZFUl9TSVpFXTsKKyNpZiAwCisJc3RydWN0IHBhc3N3ZCBmZ2V0cHdlbnRfcmVzdWx0YnVmOworCXN0cnVjdCBncm91cCBmZ2V0Z3JlbnRfcmVzdWx0YnVmOworCXN0cnVjdCBzcHdkIGZnZXRzcGVudF9yZXN1bHRidWY7CisJY2hhciBmZ2V0cHdlbnRfYnVmZmVyW1BXRF9CVUZGRVJfU0laRV07CisJY2hhciBmZ2V0Z3JlbnRfYnVmZmVyW0dSUF9CVUZGRVJfU0laRV07CisJY2hhciBmZ2V0c3BlbnRfYnVmZmVyW1BXRF9CVUZGRVJfU0laRV07CisjZW5kaWYKKyNpZiAwIC8vRU5BQkxFX1VTRV9CQl9TSEFET1cKKwlzdHJ1Y3Qgc3B3ZCBnZXRzcHVpZF9yZXN1bHRidWY7CisJc3RydWN0IHNwd2QgZ2V0c3BuYW1fcmVzdWx0YnVmOworCWNoYXIgZ2V0c3B1aWRfYnVmZmVyW1BXRF9CVUZGRVJfU0laRV07CisJY2hhciBnZXRzcG5hbV9idWZmZXJbUFdEX0JVRkZFUl9TSVpFXTsKKyNlbmRpZgorLy8gTm90IGNvbnZlcnRlZCAtIHRvbyBzbWFsbCB0byBib3RoZXIKKy8vcHRocmVhZF9tdXRleF90IG15bG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisvL0ZJTEUgKnB3ZiAvKj0gTlVMTCovOworLy9GSUxFICpncmYgLyo9IE5VTEwqLzsKKy8vRklMRSAqc3BmIC8qPSBOVUxMKi87CisjaWYgMAorCXN0cnVjdCBwYXNzd2QgZ2V0cHdlbnRfcHdkOworCXN0cnVjdCBncm91cCBnZXRncmVudF9ncjsKKwljaGFyIGdldHB3ZW50X2xpbmVfYnVmZltQV0RfQlVGRkVSX1NJWkVdOworCWNoYXIgZ2V0Z3JlbnRfbGluZV9idWZmW0dSUF9CVUZGRVJfU0laRV07CisjZW5kaWYKKyNpZiAwIC8vRU5BQkxFX1VTRV9CQl9TSEFET1cKKwlzdHJ1Y3Qgc3B3ZCBnZXRzcGVudF9zcHdkOworCXN0cnVjdCBzcHdkIHNnZXRzcGVudF9zcHdkOworCWNoYXIgZ2V0c3BlbnRfbGluZV9idWZmW1BXRF9CVUZGRVJfU0laRV07CisJY2hhciBzZ2V0c3BlbnRfbGluZV9idWZmW1BXRF9CVUZGRVJfU0laRV07CisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhdGljcyAqcHRyX3RvX3N0YXRpY3M7CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhdGljcyAqZ2V0X1Modm9pZCkKK3sKKwlpZiAoIXB0cl90b19zdGF0aWNzKQorCQlwdHJfdG9fc3RhdGljcyA9IHh6YWxsb2Moc2l6ZW9mKCpwdHJfdG9fc3RhdGljcykpOworCXJldHVybiBwdHJfdG9fc3RhdGljczsKK30KKworLyogQWx3YXlzIHVzZSBpbiB0aGlzIG9yZGVyLCBnZXRfUygpIG11c3QgYmUgY2FsbGVkIGZpcnN0ICovCisjZGVmaW5lIFJFU1VMVEJVRihuYW1lKSAmKChTID0gZ2V0X1MoKSktPm5hbWUjI19yZXN1bHRidWYpCisjZGVmaW5lIEJVRkZFUihuYW1lKSAgICAoUy0+bmFtZSMjX2J1ZmZlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgdGhlIHZhcmlvdXMgZmdldD8/ZW50X3IgZnVuY3MsIHJldHVybgorICoKKyAqICAwOiBzdWNjZXNzCisgKiAgRU5PRU5UOiBlbmQtb2YtZmlsZSBlbmNvdW50ZXJlZAorICogIEVSQU5HRTogYnVmbGVuIHRvbyBzbWFsbAorICogIG90aGVyIGVycm9yIHZhbHVlcyBwb3NzaWJsZS4gU2VlIGJiX19wZ3NyZWFkZXIuCisgKgorICogQWxzbywgKnJlc3VsdCA9PSByZXN1bHRidWYgb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICoKKyAqIE5PVEU6IGdsaWJjIGRpZmZlcmVuY2UgLSBGb3IgdGhlIEVOT0VOVCBjYXNlLCBnbGliYyBhbHNvIHNldHMgZXJybm8uCisgKiAgIFdlIGRvIG5vdCwgYXMgaXQgcmVhbGx5IGlzbid0IGFuIGVycm9yIGlmIHdlIHJlYWNoIHRoZSBlbmQtb2YtZmlsZS4KKyAqICAgRG9pbmcgc28gaXMgYW5hbG9nb3VzIHRvIGhhdmluZyBmZ2V0YygpIHNldCBlcnJubyBvbiBFT0YuCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZmdldHB3ZW50X3IoRklMRSAqX19yZXN0cmljdCBzdHJlYW0sIHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgcmVzdWx0YnVmLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQkJCXN0cnVjdCBwYXNzd2QgKipfX3Jlc3RyaWN0IHJlc3VsdCkKK3sKKwlpbnQgcnY7CisKKwkqcmVzdWx0ID0gTlVMTDsKKworCXJ2ID0gYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2Vwd2VudCwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1Zmxlbiwgc3RyZWFtKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitpbnQgZmdldGdyZW50X3IoRklMRSAqX19yZXN0cmljdCBzdHJlYW0sIHN0cnVjdCBncm91cCAqX19yZXN0cmljdCByZXN1bHRidWYsCisJCQkJY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCQkJc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCByZXN1bHQpCit7CisJaW50IHJ2OworCisJKnJlc3VsdCA9IE5VTEw7CisKKwlydiA9IGJiX19wZ3NyZWFkZXIoYmJfX3BhcnNlZ3JlbnQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBidWZsZW4sIHN0cmVhbSk7CisJaWYgKCFydikgeworCQkqcmVzdWx0ID0gcmVzdWx0YnVmOworCX0KKworCXJldHVybiBydjsKK30KKworI2lmIEVOQUJMRV9VU0VfQkJfU0hBRE9XCisjaWZkZWYgVU5VU0VEX0ZPUl9OT1cKK2ludCBmZ2V0c3BlbnRfcihGSUxFICpfX3Jlc3RyaWN0IHN0cmVhbSwgc3RydWN0IHNwd2QgKl9fcmVzdHJpY3QgcmVzdWx0YnVmLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQkJCXN0cnVjdCBzcHdkICoqX19yZXN0cmljdCByZXN1bHQpCit7CisJaW50IHJ2OworCisJKnJlc3VsdCA9IE5VTEw7CisKKwlydiA9IGJiX19wZ3NyZWFkZXIoYmJfX3BhcnNlc3BlbnQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBidWZsZW4sIHN0cmVhbSk7CisJaWYgKCFydikgeworCQkqcmVzdWx0ID0gcmVzdWx0YnVmOworCX0KKworCXJldHVybiBydjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRm9yIHRoZSB2YXJpb3VzIGZnZXQ/P2VudCBmdW5jcywgcmV0dXJuIE5VTEwgb24gZmFpbHVyZSBhbmQgYQorICogcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0IChzdGF0aWNhbGx5IGFsbG9jYXRlZCkgb24gc3VjY2Vzcy4KKyAqIFRPRE86IGF1ZGl0ICYgc3RvcCB1c2luZyB0aGVzZSBpbiBiYm94LCB0aGV5IHB1bGwgaW4gc3RhdGljIGJ1ZmZlcnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgVU5VU0VEX1NJTkNFX1dFX0FWT0lEX1NUQVRJQ19CVUZTCitzdHJ1Y3QgcGFzc3dkICpmZ2V0cHdlbnQoRklMRSAqc3RyZWFtKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBwYXNzd2QgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihmZ2V0cHdlbnQpOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihmZ2V0cHdlbnQpOworCXN0cnVjdCBwYXNzd2QgKnJlc3VsdDsKKworCWZnZXRwd2VudF9yKHN0cmVhbSwgcmVzdWx0YnVmLCBidWZmZXIsIHNpemVvZihCVUZGRVIoZmdldHB3ZW50KSksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBncm91cCAqZmdldGdyZW50KEZJTEUgKnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3RhdGljcyAqUzsKKwlzdHJ1Y3QgZ3JvdXAgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihmZ2V0Z3JlbnQpOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihmZ2V0Z3JlbnQpOworCXN0cnVjdCBncm91cCAqcmVzdWx0OworCisJZmdldGdyZW50X3Ioc3RyZWFtLCByZXN1bHRidWYsIGJ1ZmZlciwgc2l6ZW9mKEJVRkZFUihmZ2V0Z3JlbnQpKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKKyNpZmRlZiBVTlVTRURfU0lOQ0VfV0VfQVZPSURfU1RBVElDX0JVRlMKK3N0cnVjdCBzcHdkICpmZ2V0c3BlbnQoRklMRSAqc3RyZWFtKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBzcHdkICpyZXN1bHRidWYgPSBSRVNVTFRCVUYoZmdldHNwZW50KTsKKwljaGFyICpidWZmZXIgPSBCVUZGRVIoZmdldHNwZW50KTsKKwlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0OworCisJZmdldHNwZW50X3Ioc3RyZWFtLCByZXN1bHRidWYsIGJ1ZmZlciwgc2l6ZW9mKEJVRkZFUihmZ2V0c3BlbnQpKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWZkZWYgVU5VU0VEX0ZPUl9OT1cKK2ludCBzZ2V0c3BlbnRfcihjb25zdCBjaGFyICpzdHJpbmcsIHN0cnVjdCBzcHdkICpyZXN1bHRfYnVmLAorCQkJCWNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgc3RydWN0IHNwd2QgKipyZXN1bHQpCit7CisJaW50IHJ2ID0gRVJBTkdFOworCisJKnJlc3VsdCA9IE5VTEw7CisKKwlpZiAoYnVmbGVuIDwgUFdEX0JVRkZFUl9TSVpFKSB7CisgRE9fRVJBTkdFOgorCQllcnJubyA9IHJ2OworCQlnb3RvIERPTkU7CisJfQorCisJaWYgKHN0cmluZyAhPSBidWZmZXIpIHsKKwkJaWYgKHN0cmxlbihzdHJpbmcpID49IGJ1ZmxlbikgeworCQkJZ290byBET19FUkFOR0U7CisJCX0KKwkJc3RyY3B5KGJ1ZmZlciwgc3RyaW5nKTsKKwl9CisKKwlydiA9IGJiX19wYXJzZXNwZW50KHJlc3VsdF9idWYsIGJ1ZmZlcik7CisJaWYgKCFydikgeworCQkqcmVzdWx0ID0gcmVzdWx0X2J1ZjsKKwl9CisKKyBET05FOgorCXJldHVybiBydjsKK30KKyNlbmRpZgorI2VuZGlmIC8qIEVOQUJMRV9VU0VfQkJfU0hBRE9XICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEdFVFhYS0VZX1JfRlVOQyAgICAgICAgIGdldHB3bmFtX3IKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVJTRVIgICAgICAgYmJfX3BhcnNlcHdlbnQKKyNkZWZpbmUgR0VUWFhLRVlfUl9FTlRUWVBFICAgICAgc3RydWN0IHBhc3N3ZAorI2RlZmluZSBHRVRYWEtFWV9SX1RFU1QoRU5UKSAgICAoIXN0cmNtcCgoRU5UKS0+cHdfbmFtZSwga2V5KSkKKyNkZWZpbmUgR0VUWFhLRVlfUl9LRVlUWVBFICAgICAgY29uc3QgY2hhciAqX19yZXN0cmljdAorI2RlZmluZSBHRVRYWEtFWV9SX1BBVEhOQU1FICAgICBfUEFUSF9QQVNTV0QKKyNpbmNsdWRlICJwd2RfZ3JwX2ludGVybmFsLmMiCisKKyNkZWZpbmUgR0VUWFhLRVlfUl9GVU5DICAgICAgICAgZ2V0Z3JuYW1fcgorI2RlZmluZSBHRVRYWEtFWV9SX1BBUlNFUiAgICAgICBiYl9fcGFyc2VncmVudAorI2RlZmluZSBHRVRYWEtFWV9SX0VOVFRZUEUgICAgICBzdHJ1Y3QgZ3JvdXAKKyNkZWZpbmUgR0VUWFhLRVlfUl9URVNUKEVOVCkgICAgKCFzdHJjbXAoKEVOVCktPmdyX25hbWUsIGtleSkpCisjZGVmaW5lIEdFVFhYS0VZX1JfS0VZVFlQRSAgICAgIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVRITkFNRSAgICAgX1BBVEhfR1JPVVAKKyNpbmNsdWRlICJwd2RfZ3JwX2ludGVybmFsLmMiCisKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworI2RlZmluZSBHRVRYWEtFWV9SX0ZVTkMgICAgICAgICBnZXRzcG5hbV9yCisjZGVmaW5lIEdFVFhYS0VZX1JfUEFSU0VSICAgICAgIGJiX19wYXJzZXNwZW50CisjZGVmaW5lIEdFVFhYS0VZX1JfRU5UVFlQRSAgICAgIHN0cnVjdCBzcHdkCisjZGVmaW5lIEdFVFhYS0VZX1JfVEVTVChFTlQpICAgICghc3RyY21wKChFTlQpLT5zcF9uYW1wLCBrZXkpKQorI2RlZmluZSBHRVRYWEtFWV9SX0tFWVRZUEUgICAgICBjb25zdCBjaGFyICpfX3Jlc3RyaWN0CisjZGVmaW5lIEdFVFhYS0VZX1JfUEFUSE5BTUUgICAgIF9QQVRIX1NIQURPVworI2luY2x1ZGUgInB3ZF9ncnBfaW50ZXJuYWwuYyIKKyNlbmRpZgorCisjZGVmaW5lIEdFVFhYS0VZX1JfRlVOQyAgICAgICAgIGdldHB3dWlkX3IKKyNkZWZpbmUgR0VUWFhLRVlfUl9QQVJTRVIgICAgICAgYmJfX3BhcnNlcHdlbnQKKyNkZWZpbmUgR0VUWFhLRVlfUl9FTlRUWVBFICAgICAgc3RydWN0IHBhc3N3ZAorI2RlZmluZSBHRVRYWEtFWV9SX1RFU1QoRU5UKSAgICAoKEVOVCktPnB3X3VpZCA9PSBrZXkpCisjZGVmaW5lIEdFVFhYS0VZX1JfS0VZVFlQRSAgICAgIHVpZF90CisjZGVmaW5lIEdFVFhYS0VZX1JfUEFUSE5BTUUgICAgIF9QQVRIX1BBU1NXRAorI2luY2x1ZGUgInB3ZF9ncnBfaW50ZXJuYWwuYyIKKworI2RlZmluZSBHRVRYWEtFWV9SX0ZVTkMgICAgICAgICBnZXRncmdpZF9yCisjZGVmaW5lIEdFVFhYS0VZX1JfUEFSU0VSICAgICAgIGJiX19wYXJzZWdyZW50CisjZGVmaW5lIEdFVFhYS0VZX1JfRU5UVFlQRSAgICAgIHN0cnVjdCBncm91cAorI2RlZmluZSBHRVRYWEtFWV9SX1RFU1QoRU5UKSAgICAoKEVOVCktPmdyX2dpZCA9PSBrZXkpCisjZGVmaW5lIEdFVFhYS0VZX1JfS0VZVFlQRSAgICAgIGdpZF90CisjZGVmaW5lIEdFVFhYS0VZX1JfUEFUSE5BTUUgICAgIF9QQVRIX0dST1VQCisjaW5jbHVkZSAicHdkX2dycF9pbnRlcm5hbC5jIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRPRE86IGF1ZGl0ICYgc3RvcCB1c2luZyB0aGVzZSBpbiBiYm94LCB0aGV5IHB1bGwgaW4gc3RhdGljIGJ1ZmZlcnMgKi8KKworLyogVGhpcyBvbmUgaGFzIG1hbnkgdXNlcnMgKi8KK3N0cnVjdCBwYXNzd2QgKmdldHB3dWlkKHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3Qgc3RhdGljcyAqUzsKKwlzdHJ1Y3QgcGFzc3dkICpyZXN1bHRidWYgPSBSRVNVTFRCVUYoZ2V0cHd1aWQpOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihnZXRwd3VpZCk7CisJc3RydWN0IHBhc3N3ZCAqcmVzdWx0OworCisJZ2V0cHd1aWRfcih1aWQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGdldHB3dWlkKSksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFRoaXMgb25lIGhhcyBtYW55IHVzZXJzICovCitzdHJ1Y3QgZ3JvdXAgKmdldGdyZ2lkKGdpZF90IGdpZCkKK3sKKwlzdHJ1Y3Qgc3RhdGljcyAqUzsKKwlzdHJ1Y3QgZ3JvdXAgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihnZXRncmdpZCk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGdldGdyZ2lkKTsKKwlzdHJ1Y3QgZ3JvdXAgKnJlc3VsdDsKKworCWdldGdyZ2lkX3IoZ2lkLCByZXN1bHRidWYsIGJ1ZmZlciwgc2l6ZW9mKEJVRkZFUihnZXRncmdpZCkpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWYgMCAvL0VOQUJMRV9VU0VfQkJfU0hBRE9XCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vbi1zdGFuZGFyZCBhbmQgaXMgY3VycmVudGx5IG5vdCBidWlsdC4gIEl0IHNlZW1zCisgKiB0byBoYXZlIGJlZW4gY3JlYXRlZCBhcyBhIHJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBub24tc3RhbmRhcmQKKyAqIGZ1bmN0aW9ucyBnZXRzcHVpZC4gIFdoeSBnZXRzcHVpZCB3YXMgYWRkZWQsIEkgZG8gbm90IGtub3cuICovCitpbnQgZ2V0c3B1aWRfcih1aWRfdCB1aWQsIHN0cnVjdCBzcHdkICpfX3Jlc3RyaWN0IHJlc3VsdGJ1ZiwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHNwd2QgKipfX3Jlc3RyaWN0IHJlc3VsdCkKK3sKKwlpbnQgcnY7CisJc3RydWN0IHBhc3N3ZCAqcHA7CisJc3RydWN0IHBhc3N3ZCBwYXNzd29yZDsKKwljaGFyIHB3ZF9idWZmW1BXRF9CVUZGRVJfU0laRV07CisKKwkqcmVzdWx0ID0gTlVMTDsKKwlydiA9IGdldHB3dWlkX3IodWlkLCAmcGFzc3dvcmQsIHB3ZF9idWZmLCBzaXplb2YocHdkX2J1ZmYpLCAmcHApOworCWlmICghcnYpIHsKKwkJcnYgPSBnZXRzcG5hbV9yKHBhc3N3b3JkLnB3X25hbWUsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBidWZsZW4sIHJlc3VsdCk7CisJfQorCisJcmV0dXJuIHJ2OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vbi1zdGFuZGFyZCBhbmQgaXMgY3VycmVudGx5IG5vdCBidWlsdC4KKyAqIFdoeSBpdCB3YXMgYWRkZWQsIEkgZG8gbm90IGtub3cuICovCitzdHJ1Y3Qgc3B3ZCAqZ2V0c3B1aWQodWlkX3QgdWlkKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBzcHdkICpyZXN1bHRidWYgPSBSRVNVTFRCVUYoZ2V0c3B1aWQpOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihnZXRzcHVpZCk7CisJc3RydWN0IHNwd2QgKnJlc3VsdDsKKworCWdldHNwdWlkX3IodWlkLCByZXN1bHRidWYsIGJ1ZmZlciwgc2l6ZW9mKEJVRkZFUihnZXRzcHVpZCkpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8qIFRoaXMgb25lIGhhcyBtYW55IHVzZXJzICovCitzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBwYXNzd2QgKnJlc3VsdGJ1ZiA9IFJFU1VMVEJVRihnZXRwd25hbSk7CisJY2hhciAqYnVmZmVyID0gQlVGRkVSKGdldHB3bmFtKTsKKwlzdHJ1Y3QgcGFzc3dkICpyZXN1bHQ7CisKKwlnZXRwd25hbV9yKG5hbWUsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGdldHB3bmFtKSksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFRoaXMgb25lIGhhcyBtYW55IHVzZXJzICovCitzdHJ1Y3QgZ3JvdXAgKmdldGdybmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXRpY3MgKlM7CisJc3RydWN0IGdyb3VwICpyZXN1bHRidWYgPSBSRVNVTFRCVUYoZ2V0Z3JuYW0pOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihnZXRncm5hbSk7CisJc3RydWN0IGdyb3VwICpyZXN1bHQ7CisKKwlnZXRncm5hbV9yKG5hbWUsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBzaXplb2YoQlVGRkVSKGdldGdybmFtKSksICZyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiAwIC8vRU5BQkxFX1VTRV9CQl9TSEFET1cKK3N0cnVjdCBzcHdkICpnZXRzcG5hbShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0aWNzICpTOworCXN0cnVjdCBzcHdkICpyZXN1bHRidWYgPSBSRVNVTFRCVUYoZ2V0c3BuYW0pOworCWNoYXIgKmJ1ZmZlciA9IEJVRkZFUihnZXRzcG5hbSk7CisJc3RydWN0IHNwd2QgKnJlc3VsdDsKKworCWdldHNwbmFtX3IobmFtZSwgcmVzdWx0YnVmLCBidWZmZXIsIHNpemVvZihCVUZGRVIoZ2V0c3BuYW0pKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRklYTUU6IHdlIGRvbid0IGhhdmUgc3VjaCBDT05GSUdfeHggLSA/ISAqLworCisjaWYgZGVmaW5lZCBDT05GSUdfVVNFX0JCX1RIUkVBRFNBRkVfU0hBRE9XICYmIGRlZmluZWQgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBteWxvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworIyBkZWZpbmUgTE9DSwkJcHRocmVhZF9tdXRleF9sb2NrKCZteWxvY2spCisjIGRlZmluZSBVTkxPQ0sJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteWxvY2spOworI2Vsc2UKKyMgZGVmaW5lIExPQ0sJCSgodm9pZCkgMCkKKyMgZGVmaW5lIFVOTE9DSwkJKCh2b2lkKSAwKQorI2VuZGlmCisKK3N0YXRpYyBGSUxFICpwd2YgLyo9IE5VTEwqLzsKK3ZvaWQgc2V0cHdlbnQodm9pZCkKK3sKKwlMT0NLOworCWlmIChwd2YpIHsKKwkJcmV3aW5kKHB3Zik7CisJfQorCVVOTE9DSzsKK30KKwordm9pZCBlbmRwd2VudCh2b2lkKQoreworCUxPQ0s7CisJaWYgKHB3ZikgeworCQlmY2xvc2UocHdmKTsKKwkJcHdmID0gTlVMTDsKKwl9CisJVU5MT0NLOworfQorCisKK2ludCBnZXRwd2VudF9yKHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgcmVzdWx0YnVmLAorCQkJICAgY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCQkgICBzdHJ1Y3QgcGFzc3dkICoqX19yZXN0cmljdCByZXN1bHQpCit7CisJaW50IHJ2OworCisJTE9DSzsKKwkqcmVzdWx0ID0gTlVMTDsJCQkJLyogSW4gY2FzZSBvZiBlcnJvci4uLiAqLworCisJaWYgKCFwd2YpIHsKKwkJcHdmID0gZm9wZW5fZm9yX3JlYWQoX1BBVEhfUEFTU1dEKTsKKwkJaWYgKCFwd2YpIHsKKwkJCXJ2ID0gZXJybm87CisJCQlnb3RvIEVSUjsKKwkJfQorCX0KKworCXJ2ID0gYmJfX3Bnc3JlYWRlcihiYl9fcGFyc2Vwd2VudCwgcmVzdWx0YnVmLCBidWZmZXIsIGJ1ZmxlbiwgcHdmKTsKKwlpZiAoIXJ2KSB7CisJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJfQorCisgRVJSOgorCVVOTE9DSzsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBGSUxFICpncmYgLyo9IE5VTEwqLzsKK3ZvaWQgc2V0Z3JlbnQodm9pZCkKK3sKKwlMT0NLOworCWlmIChncmYpIHsKKwkJcmV3aW5kKGdyZik7CisJfQorCVVOTE9DSzsKK30KKwordm9pZCBlbmRncmVudCh2b2lkKQoreworCUxPQ0s7CisJaWYgKGdyZikgeworCQlmY2xvc2UoZ3JmKTsKKwkJZ3JmID0gTlVMTDsKKwl9CisJVU5MT0NLOworfQorCitpbnQgZ2V0Z3JlbnRfcihzdHJ1Y3QgZ3JvdXAgKl9fcmVzdHJpY3QgcmVzdWx0YnVmLAorCQkJICAgY2hhciAqX19yZXN0cmljdCBidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCQkgICBzdHJ1Y3QgZ3JvdXAgKipfX3Jlc3RyaWN0IHJlc3VsdCkKK3sKKwlpbnQgcnY7CisKKwlMT0NLOworCSpyZXN1bHQgPSBOVUxMOwkJCQkvKiBJbiBjYXNlIG9mIGVycm9yLi4uICovCisKKwlpZiAoIWdyZikgeworCQlncmYgPSBmb3Blbl9mb3JfcmVhZChfUEFUSF9HUk9VUCk7CisJCWlmICghZ3JmKSB7CisJCQlydiA9IGVycm5vOworCQkJZ290byBFUlI7CisJCX0KKwl9CisKKwlydiA9IGJiX19wZ3NyZWFkZXIoYmJfX3BhcnNlZ3JlbnQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBidWZsZW4sIGdyZik7CisJaWYgKCFydikgeworCQkqcmVzdWx0ID0gcmVzdWx0YnVmOworCX0KKworIEVSUjoKKwlVTkxPQ0s7CisJcmV0dXJuIHJ2OworfQorCisjaWZkZWYgVU5VU0VEX0ZPUl9OT1cKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworc3RhdGljIEZJTEUgKnNwZiAvKj0gTlVMTCovOwordm9pZCBzZXRzcGVudCh2b2lkKQoreworCUxPQ0s7CisJaWYgKHNwZikgeworCQlyZXdpbmQoc3BmKTsKKwl9CisJVU5MT0NLOworfQorCit2b2lkIGVuZHNwZW50KHZvaWQpCit7CisJTE9DSzsKKwlpZiAoc3BmKSB7CisJCWZjbG9zZShzcGYpOworCQlzcGYgPSBOVUxMOworCX0KKwlVTkxPQ0s7Cit9CisKK2ludCBnZXRzcGVudF9yKHN0cnVjdCBzcHdkICpyZXN1bHRidWYsIGNoYXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBidWZsZW4sIHN0cnVjdCBzcHdkICoqcmVzdWx0KQoreworCWludCBydjsKKworCUxPQ0s7CisJKnJlc3VsdCA9IE5VTEw7CQkJCS8qIEluIGNhc2Ugb2YgZXJyb3IuLi4gKi8KKworCWlmICghc3BmKSB7CisJCXNwZiA9IGZvcGVuX2Zvcl9yZWFkKF9QQVRIX1NIQURPVyk7CisJCWlmICghc3BmKSB7CisJCQlydiA9IGVycm5vOworCQkJZ290byBFUlI7CisJCX0KKwl9CisKKwlydiA9IGJiX19wZ3NyZWFkZXIoYmJfX3BhcnNlc3BlbnQsIHJlc3VsdGJ1ZiwgYnVmZmVyLCBidWZsZW4sIHNwZik7CisJaWYgKCFydikgeworCQkqcmVzdWx0ID0gcmVzdWx0YnVmOworCX0KKworIEVSUjoKKwlVTkxPQ0s7CisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisjZW5kaWYgLyogVU5VU0VEX0ZPUl9OT1cgKi8KKworI2lmZGVmIFVOVVNFRF9TSU5DRV9XRV9BVk9JRF9TVEFUSUNfQlVGUworc3RydWN0IHBhc3N3ZCAqZ2V0cHdlbnQodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBsaW5lX2J1ZmZbUFdEX0JVRkZFUl9TSVpFXTsKKwlzdGF0aWMgc3RydWN0IHBhc3N3ZCBwd2Q7CisJc3RydWN0IHBhc3N3ZCAqcmVzdWx0OworCisJZ2V0cHdlbnRfcigmcHdkLCBsaW5lX2J1ZmYsIHNpemVvZihsaW5lX2J1ZmYpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgZ3JvdXAgKmdldGdyZW50KHZvaWQpCit7CisJc3RhdGljIGNoYXIgbGluZV9idWZmW0dSUF9CVUZGRVJfU0laRV07CisJc3RhdGljIHN0cnVjdCBncm91cCBncjsKKwlzdHJ1Y3QgZ3JvdXAgKnJlc3VsdDsKKworCWdldGdyZW50X3IoJmdyLCBsaW5lX2J1ZmYsIHNpemVvZihsaW5lX2J1ZmYpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKK3N0cnVjdCBzcHdkICpnZXRzcGVudCh2b2lkKQoreworCXN0YXRpYyBjaGFyIGxpbmVfYnVmZltQV0RfQlVGRkVSX1NJWkVdOworCXN0YXRpYyBzdHJ1Y3Qgc3B3ZCBzcHdkOworCXN0cnVjdCBzcHdkICpyZXN1bHQ7CisKKwlnZXRzcGVudF9yKCZzcHdkLCBsaW5lX2J1ZmYsIHNpemVvZihsaW5lX2J1ZmYpLCAmcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3Qgc3B3ZCAqc2dldHNwZW50KGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlzdGF0aWMgY2hhciBsaW5lX2J1ZmZbUFdEX0JVRkZFUl9TSVpFXTsKKwlzdGF0aWMgc3RydWN0IHNwd2Qgc3B3ZDsKKwlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0OworCisJc2dldHNwZW50X3Ioc3RyaW5nLCAmc3B3ZCwgbGluZV9idWZmLCBzaXplb2YobGluZV9idWZmKSwgJnJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorI2VuZGlmIC8qIFVOVVNFRF9TSU5DRV9XRV9BVk9JRF9TVEFUSUNfQlVGUyAqLworCitzdGF0aWMgZ2lkX3QgKmdldGdyb3VwbGlzdF9pbnRlcm5hbChpbnQgKm5ncm91cHNfcHRyLCBjb25zdCBjaGFyICp1c2VyLCBnaWRfdCBnaWQpCit7CisJRklMRSAqZ3JmaWxlOworCWdpZF90ICpncm91cF9saXN0OworCWludCBuZ3JvdXBzOworCXN0cnVjdCBncm91cCBncm91cDsKKwljaGFyIGJ1ZmZbUFdEX0JVRkZFUl9TSVpFXTsKKworCS8qIFdlIGFsbG9jIHNwYWNlIGZvciA4IGdpZHMgYXQgYSB0aW1lLiAqLworCWdyb3VwX2xpc3QgPSB4bWFsbG9jKDggKiBzaXplb2YoZ3JvdXBfbGlzdFswXSkpOworCWdyb3VwX2xpc3RbMF0gPSBnaWQ7CisJbmdyb3VwcyA9IDE7CisKKwlncmZpbGUgPSBmb3Blbl9mb3JfcmVhZChfUEFUSF9HUk9VUCk7CisJaWYgKGdyZmlsZSkgeworCQl3aGlsZSAoIWJiX19wZ3NyZWFkZXIoYmJfX3BhcnNlZ3JlbnQsICZncm91cCwgYnVmZiwgc2l6ZW9mKGJ1ZmYpLCBncmZpbGUpKSB7CisJCQljaGFyICoqbTsKKwkJCWFzc2VydChncm91cC5ncl9tZW0pOyAvKiBNdXN0IGhhdmUgYXQgbGVhc3QgYSBOVUxMIHRlcm1pbmF0b3IuICovCisJCQlpZiAoZ3JvdXAuZ3JfZ2lkID09IGdpZCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAobSA9IGdyb3VwLmdyX21lbTsgKm07IG0rKykgeworCQkJCWlmIChzdHJjbXAoKm0sIHVzZXIpICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWdyb3VwX2xpc3QgPSB4cmVhbGxvY192ZWN0b3IoZ3JvdXBfbGlzdCwgLyo4PTJeMzoqLyAzLCBuZ3JvdXBzKTsKKwkJCQlncm91cF9saXN0W25ncm91cHMrK10gPSBncm91cC5ncl9naWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZmNsb3NlKGdyZmlsZSk7CisJfQorCSpuZ3JvdXBzX3B0ciA9IG5ncm91cHM7CisJcmV0dXJuIGdyb3VwX2xpc3Q7Cit9CisKK2ludCBpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGdpZCkKK3sKKwlpbnQgbmdyb3VwczsKKwlnaWRfdCAqZ3JvdXBfbGlzdCA9IGdldGdyb3VwbGlzdF9pbnRlcm5hbCgmbmdyb3VwcywgdXNlciwgZ2lkKTsKKworCW5ncm91cHMgPSBzZXRncm91cHMobmdyb3VwcywgZ3JvdXBfbGlzdCk7CisJZnJlZShncm91cF9saXN0KTsKKwlyZXR1cm4gbmdyb3VwczsKK30KKworaW50IGdldGdyb3VwbGlzdChjb25zdCBjaGFyICp1c2VyLCBnaWRfdCBnaWQsIGdpZF90ICpncm91cHMsIGludCAqbmdyb3VwcykKK3sKKwlpbnQgbmdyb3Vwc19vbGQgPSAqbmdyb3VwczsKKwlnaWRfdCAqZ3JvdXBfbGlzdCA9IGdldGdyb3VwbGlzdF9pbnRlcm5hbChuZ3JvdXBzLCB1c2VyLCBnaWQpOworCisJaWYgKCpuZ3JvdXBzIDw9IG5ncm91cHNfb2xkKSB7CisJCW5ncm91cHNfb2xkID0gKm5ncm91cHM7CisJCW1lbWNweShncm91cHMsIGdyb3VwX2xpc3QsIG5ncm91cHNfb2xkICogc2l6ZW9mKGdyb3Vwc1swXSkpOworCX0gZWxzZSB7CisJCW5ncm91cHNfb2xkID0gLTE7CisJfQorCWZyZWUoZ3JvdXBfbGlzdCk7CisJcmV0dXJuIG5ncm91cHNfb2xkOworfQorCisjaWZkZWYgVU5VU0VEX1NJTkNFX1dFX0FWT0lEX1NUQVRJQ19CVUZTCitpbnQgcHV0cHdlbnQoY29uc3Qgc3RydWN0IHBhc3N3ZCAqX19yZXN0cmljdCBwLCBGSUxFICpfX3Jlc3RyaWN0IGYpCit7CisJaW50IHJ2ID0gLTE7CisKKyNpZiAwCisJLyogZ2xpYmMgZG9lcyB0aGlzIGNoZWNrICovCisJaWYgKCFwIHx8ICFmKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gcnY7CisJfQorI2VuZGlmCisKKwkvKiBObyBleHRyYSB0aHJlYWQgbG9ja2luZyBpcyBuZWVkZWQgYWJvdmUgd2hhdCBmcHJpbnRmIGRvZXMuICovCisJaWYgKGZwcmludGYoZiwgIiVzOiVzOiVsdTolbHU6JXM6JXM6JXNcbiIsCisJCQkJcC0+cHdfbmFtZSwgcC0+cHdfcGFzc3dkLAorCQkJCSh1bnNpZ25lZCBsb25nKShwLT5wd191aWQpLAorCQkJCSh1bnNpZ25lZCBsb25nKShwLT5wd19naWQpLAorCQkJCXAtPnB3X2dlY29zLCBwLT5wd19kaXIsIHAtPnB3X3NoZWxsKSA+PSAwCisJCSkgeworCQlydiA9IDA7CisJfQorCisJcmV0dXJuIHJ2OworfQorCitpbnQgcHV0Z3JlbnQoY29uc3Qgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IHAsIEZJTEUgKl9fcmVzdHJpY3QgZikKK3sKKwlpbnQgcnYgPSAtMTsKKworI2lmIDAKKwkvKiBnbGliYyBkb2VzIHRoaXMgY2hlY2sgKi8KKwlpZiAoIXAgfHwgIWYpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiBydjsKKwl9CisjZW5kaWYKKworCWlmIChmcHJpbnRmKGYsICIlczolczolbHU6IiwKKwkJCQlwLT5ncl9uYW1lLCBwLT5ncl9wYXNzd2QsCisJCQkJKHVuc2lnbmVkIGxvbmcpKHAtPmdyX2dpZCkpID49IDAKKwkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0W10gQUxJR04xID0gIiwlcyI7CisKKwkJY2hhciAqKm07CisJCWNvbnN0IGNoYXIgKmZtdDsKKworCQlmbXQgPSBmb3JtYXQgKyAxOworCisJCWFzc2VydChwLT5ncl9tZW0pOworCQltID0gcC0+Z3JfbWVtOworCisJCXdoaWxlICgxKSB7CisJCQlpZiAoISptKSB7CisJCQkJaWYgKGZwdXRjKCdcbicsIGYpID49IDApIHsKKwkJCQkJcnYgPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChmcHJpbnRmKGYsIGZtdCwgKm0pIDwgMCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJbSsrOworCQkJZm10ID0gZm9ybWF0OworCQl9CisJfQorCisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworI2lmZGVmIFVOVVNFRF9GT1JfTk9XCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwdXRfc3Bfb2ZmW10gQUxJR04xID0geworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9sc3RjaGcpLCAgICAgICAvKiAyIC0gbm90IGEgY2hhciBwdHIgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbWluKSwgICAgICAgICAgLyogMyAtIG5vdCBhIGNoYXIgcHRyICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX21heCksICAgICAgICAgIC8qIDQgLSBub3QgYSBjaGFyIHB0ciAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF93YXJuKSwgICAgICAgICAvKiA1IC0gbm90IGEgY2hhciBwdHIgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfaW5hY3QpLCAgICAgICAgLyogNiAtIG5vdCBhIGNoYXIgcHRyICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX2V4cGlyZSkgICAgICAgIC8qIDcgLSBub3QgYSBjaGFyIHB0ciAqLworfTsKKworaW50IHB1dHNwZW50KGNvbnN0IHN0cnVjdCBzcHdkICpwLCBGSUxFICpzdHJlYW0pCit7CisJY29uc3QgY2hhciAqZm10OworCWxvbmcgeDsKKwlpbnQgaTsKKwlpbnQgcnYgPSAtMTsKKworCS8qIFVubGlrZSBwdXRwd2VudCBhbmQgcHV0Z3JlbnQsIGdsaWJjIGRvZXMgbm90IGNoZWNrIHRoZSBhcmdzLiAqLworCWlmIChmcHJpbnRmKHN0cmVhbSwgIiVzOiVzOiIsIHAtPnNwX25hbXAsCisJCQkJKHAtPnNwX3B3ZHAgPyBwLT5zcF9wd2RwIDogIiIpKSA8IDAKKwkpIHsKKwkJZ290byBET19VTkxPQ0s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihwdXRfc3Bfb2ZmKTsgaSsrKSB7CisJCWZtdCA9ICIlbGQ6IjsKKwkJeCA9ICoobG9uZyAqKSgoY2hhciAqKXAgKyBwdXRfc3Bfb2ZmW2ldKTsKKwkJaWYgKHggPT0gLTEpIHsKKwkJCWZtdCArPSAzOworCQl9CisJCWlmIChmcHJpbnRmKHN0cmVhbSwgZm10LCB4KSA8IDApIHsKKwkJCWdvdG8gRE9fVU5MT0NLOworCQl9CisJfQorCisJaWYgKChwLT5zcF9mbGFnICE9IH4wVUwpICYmIChmcHJpbnRmKHN0cmVhbSwgIiVsdSIsIHAtPnNwX2ZsYWcpIDwgMCkpIHsKKwkJZ290byBET19VTkxPQ0s7CisJfQorCisJaWYgKGZwdXRjKCdcbicsIHN0cmVhbSkgPiAwKSB7CisJCXJ2ID0gMDsKKwl9CisKKyBET19VTkxPQ0s6CisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisjZW5kaWYgLyogVVNFX0JCX1NIQURPVyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHB3X29mZltdIEFMSUdOMSA9IHsKKwlvZmZzZXRvZihzdHJ1Y3QgcGFzc3dkLCBwd19uYW1lKSwgICAgICAgLyogMCAqLworCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X3Bhc3N3ZCksICAgICAvKiAxICovCisJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfdWlkKSwgICAgICAgIC8qIDIgLSBub3QgYSBjaGFyIHB0ciAqLworCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X2dpZCksICAgICAgICAvKiAzIC0gbm90IGEgY2hhciBwdHIgKi8KKwlvZmZzZXRvZihzdHJ1Y3QgcGFzc3dkLCBwd19nZWNvcyksICAgICAgLyogNCAqLworCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X2RpciksICAgICAgICAvKiA1ICovCisJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfc2hlbGwpICAgICAgIC8qIDYgKi8KK307CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJiX19wYXJzZXB3ZW50KHZvaWQgKmRhdGEsIGNoYXIgKmxpbmUpCit7CisJY2hhciAqZW5kcHRyOworCWNoYXIgKnA7CisJaW50IGk7CisKKwlpID0gMDsKKwl3aGlsZSAoMSkgeworCQlwID0gKGNoYXIgKikgZGF0YSArIHB3X29mZltpXTsKKworCQlpZiAoaSA8IDIgfHwgaSA+IDMpIHsKKwkJCSooKGNoYXIgKiopIHApID0gbGluZTsKKwkJCWlmIChpID09IDYpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIE5PVEU6IGdsaWJjIGRpZmZlcmVuY2UgLSBnbGliYyBhbGxvd3Mgb21pc3Npb24gb2YKKwkJCSAqICc6JyBzZXBlcmF0b3JzIGFmdGVyIHRoZSBnaWQgZmllbGQgaWYgYWxsIHJlbWFpbmluZworCQkJICogZW50cmllcyBhcmUgZW1wdHkuICBXZSByZXF1aXJlIGFsbCBzZXBhcmF0b3JzLiAqLworCQkJbGluZSA9IHN0cmNocihsaW5lLCAnOicpOworCQkJaWYgKCFsaW5lKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIHQgPSBzdHJ0b3VsKGxpbmUsICZlbmRwdHIsIDEwKTsKKwkJCS8qIE1ha2Ugc3VyZSB3ZSBoYWQgYXQgbGVhc3Qgb25lIGRpZ2l0LCBhbmQgdGhhdCB0aGUKKwkJCSAqIGZhaWxpbmcgY2hhciBpcyB0aGUgbmV4dCBmaWVsZCBzZXBlcmF0b3IgJzonLiAgU2VlCisJCQkgKiBnbGliYyBkaWZmZXJlbmNlIG5vdGUgYWJvdmUuICovCisJCQkvKiBUT0RPOiBBbHNvIGNoZWNrIGZvciBsZWFkaW5nIHdoaXRlc3BhY2U/ICovCisJCQlpZiAoKGVuZHB0ciA9PSBsaW5lKSB8fCAoKmVuZHB0ciAhPSAnOicpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlsaW5lID0gZW5kcHRyOworCQkJaWYgKGkgJiAxKSB7CQkvKiBpID09IDMgLS0gZ2lkICovCisJCQkJKigoZ2lkX3QgKikgcCkgPSB0OworCQkJfSBlbHNlIHsJCQkvKiBpID09IDIgLS0gdWlkICovCisJCQkJKigodWlkX3QgKikgcCkgPSB0OworCQkJfQorCQl9CisKKwkJKmxpbmUrKyA9ICdcMCc7CisJCWkrKzsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ3Jfb2ZmW10gQUxJR04xID0geworCW9mZnNldG9mKHN0cnVjdCBncm91cCwgZ3JfbmFtZSksICAgICAgICAvKiAwICovCisJb2Zmc2V0b2Yoc3RydWN0IGdyb3VwLCBncl9wYXNzd2QpLCAgICAgIC8qIDEgKi8KKwlvZmZzZXRvZihzdHJ1Y3QgZ3JvdXAsIGdyX2dpZCkgICAgICAgICAgLyogMiAtIG5vdCBhIGNoYXIgcHRyICovCit9OworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBiYl9fcGFyc2VncmVudCh2b2lkICpkYXRhLCBjaGFyICpsaW5lKQoreworCWNoYXIgKmVuZHB0cjsKKwljaGFyICpwOworCWludCBpOworCWNoYXIgKiptZW1iZXJzOworCWNoYXIgKmVuZF9vZl9idWY7CisKKwllbmRfb2ZfYnVmID0gKChzdHJ1Y3QgZ3JvdXAgKikgZGF0YSktPmdyX25hbWU7IC8qIEV2aWwgaGFjayEgKi8KKwlpID0gMDsKKwl3aGlsZSAoMSkgeworCQlwID0gKGNoYXIgKikgZGF0YSArIGdyX29mZltpXTsKKworCQlpZiAoaSA8IDIpIHsKKwkJCSooKGNoYXIgKiopIHApID0gbGluZTsKKwkJCWxpbmUgPSBzdHJjaHIobGluZSwgJzonKTsKKwkJCWlmICghbGluZSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJKmxpbmUrKyA9ICdcMCc7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQkqKChnaWRfdCAqKSBwKSA9IHN0cnRvdWwobGluZSwgJmVuZHB0ciwgMTApOworCisJCQkvKiBOT1RFOiBnbGliYyBkaWZmZXJlbmNlIC0gZ2xpYmMgYWxsb3dzIG9taXNzaW9uIG9mIHRoZQorCQkJICogdHJhaWxpbmcgY29sb24gd2hlbiB0aGVyZSBpcyBubyBtZW1iZXIgbGlzdC4gIFdlIHRyZWF0CisJCQkgKiB0aGlzIGFzIGFuIGVycm9yLiAqLworCisJCQkvKiBNYWtlIHN1cmUgd2UgaGFkIGF0IGxlYXN0IG9uZSBkaWdpdCwgYW5kIHRoYXQgdGhlCisJCQkgKiBmYWlsaW5nIGNoYXIgaXMgdGhlIG5leHQgZmllbGQgc2VwZXJhdG9yICc6Jy4gIFNlZQorCQkJICogZ2xpYmMgZGlmZmVyZW5jZSBub3RlIGFib3ZlLiAqLworCQkJaWYgKChlbmRwdHIgPT0gbGluZSkgfHwgKCplbmRwdHIgIT0gJzonKSkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlpID0gMTsJCQkJLyogQ291bnQgdGVybWluYXRpbmcgTlVMTCBwdHIuICovCisJCQlwID0gZW5kcHRyOworCisJCQlpZiAocFsxXSkgeyAvKiBXZSBoYXZlIGEgbWVtYmVyIGxpc3QgdG8gcHJvY2Vzcy4gKi8KKwkJCQkvKiBPdmVyd3JpdGUgdGhlIGxhc3QgJzonIHdpdGggYSAnLCcgYmVmb3JlIGNvdW50aW5nLgorCQkJCSAqIFRoaXMgYWxsb3dzIHVzIHRvICgxKSB0ZXN0IGZvciBpbml0aWFsICcsJworCQkJCSAqIGFuZCAoMikgYWRkcyBvbmUgJywnIHNvIHRoYXQgdGhlIG51bWJlciBvZiBjb21tYXMKKwkJCQkgKiBlcXVhbHMgdGhlIG1lbWJlciBjb3VudC4gKi8KKwkJCQkqcCA9ICcsJzsKKwkJCQlkbyB7CisJCQkJCS8qIE5PVEU6IGdsaWJjIGRpZmZlcmVuY2UgLSBnbGliYyBhbGxvd3MgYW5kIHRyaW1zIGxlYWRpbmcKKwkJCQkJICogKGJ1dCBub3QgdHJhaWxpbmcpIHNwYWNlLiAgV2UgdHJlYXQgdGhpcyBhcyBhbiBlcnJvci4gKi8KKwkJCQkJLyogTk9URTogZ2xpYmMgZGlmZmVyZW5jZSAtIGdsaWJjIGFsbG93cyBjb25zZWN1dGl2ZSBhbmQKKwkJCQkJICogdHJhaWxpbmcgY29tbWFzLCBhbmQgaWdub3JlcyAiZW1wdHkgc3RyaW5nIiB1c2Vycy4gIFdlCisJCQkJCSAqIHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IuICovCisJCQkJCWlmICgqcCA9PSAnLCcpIHsKKwkJCQkJCSsraTsKKwkJCQkJCSpwID0gMDsJLyogbnVsLXRlcm1pbmF0ZSBlYWNoIG1lbWJlciBzdHJpbmcuICovCisJCQkJCQlpZiAoISorK3AgfHwgKCpwID09ICcsJykgfHwgaXNzcGFjZSgqcCkpIHsKKwkJCQkJCQlnb3RvIEVSUjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gd2hpbGUgKCorK3ApOworCQkJfQorCisJCQkvKiBOb3cgYWxpZ24gKHArMSksIHJvdW5kaW5nIHVwLiAqLworCQkJLyogQXNzdW1lcyBzaXplb2YoY2hhciAqKikgaXMgYSBwb3dlciBvZiAyLiAqLworCQkJbWVtYmVycyA9IChjaGFyICoqKSggKCgoaW50cHRyX3QpIHApICsgc2l6ZW9mKGNoYXIgKiopKQorCQkJCQkJCQkgJiB+KChpbnRwdHJfdCkoc2l6ZW9mKGNoYXIgKiopIC0gMSkpICk7CisKKwkJCWlmICgoKGNoYXIgKikobWVtYmVycyArIGkpKSA+IGVuZF9vZl9idWYpIHsJLyogTm8gc3BhY2UuICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSgoc3RydWN0IGdyb3VwICopIGRhdGEpLT5ncl9tZW0gPSBtZW1iZXJzOworCisJCQlpZiAoLS1pKSB7CisJCQkJcCA9IGVuZHB0cjsJLyogUG9pbnRpbmcgdG8gY2hhciBwcmlvciB0byBmaXJzdCBtZW1iZXIuICovCisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJKm1lbWJlcnMrKyA9ICsrcDsKKwkJCQkJaWYgKCEtLWkpCisJCQkJCQlicmVhazsKKwkJCQkJd2hpbGUgKCorK3ApCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkqbWVtYmVycyA9IE5VTEw7CisKKwkJCXJldHVybiAwOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIEVSUjoKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNwX29mZltdIEFMSUdOMSA9IHsKKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbmFtcCksICAgICAgICAgLyogMDogY2hhciogKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfcHdkcCksICAgICAgICAgLyogMTogY2hhciogKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbHN0Y2hnKSwgICAgICAgLyogMjogbG9uZyAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9taW4pLCAgICAgICAgICAvKiAzOiBsb25nICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX21heCksICAgICAgICAgIC8qIDQ6IGxvbmcgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3Bfd2FybiksICAgICAgICAgLyogNTogbG9uZyAqLworCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9pbmFjdCksICAgICAgICAvKiA2OiBsb25nICovCisJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX2V4cGlyZSksICAgICAgIC8qIDc6IGxvbmcgKi8KKwlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfZmxhZykgICAgICAgICAgLyogODogdW5zaWduZWQgbG9uZyAqLworfTsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgYmJfX3BhcnNlc3BlbnQodm9pZCAqZGF0YSwgY2hhciAqbGluZSkKK3sKKwljaGFyICplbmRwdHI7CisJY2hhciAqcDsKKwlpbnQgaTsKKworCWkgPSAwOworCXdoaWxlICgxKSB7CisJCXAgPSAoY2hhciAqKSBkYXRhICsgc3Bfb2ZmW2ldOworCQlpZiAoaSA8IDIpIHsKKwkJCSooKGNoYXIgKiopIHApID0gbGluZTsKKwkJCWxpbmUgPSBzdHJjaHIobGluZSwgJzonKTsKKwkJCWlmICghbGluZSkgeworCQkJCWJyZWFrOyAvKiBlcnJvciAqLworCQkJfQorCQl9IGVsc2UgeworCQkJKigobG9uZyAqKSBwKSA9IHN0cnRvdWwobGluZSwgJmVuZHB0ciwgMTApOworCQkJaWYgKGVuZHB0ciA9PSBsaW5lKSB7CisJCQkJKigobG9uZyAqKSBwKSA9IC0xTDsKKwkJCX0KKwkJCWxpbmUgPSBlbmRwdHI7CisJCQlpZiAoaSA9PSA4KSB7CisJCQkJaWYgKCpsaW5lICE9ICdcMCcpIHsKKwkJCQkJYnJlYWs7IC8qIGVycm9yICovCisJCQkJfQorCQkJCXJldHVybiAwOyAvKiBhbGwgb2sgKi8KKwkJCX0KKwkJCWlmICgqbGluZSAhPSAnOicpIHsKKwkJCQlicmVhazsgLyogZXJyb3IgKi8KKwkJCX0KKwkJfQorCQkqbGluZSsrID0gJ1wwJzsKKwkJaSsrOworCX0KKworCXJldHVybiBFSU5WQUw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlYWRzIHVudGlsIEVPRiwgb3IgdW50aWwgaXQgZmluZHMgYSBsaW5lIHdoaWNoIGZpdHMgaW4gdGhlIGJ1ZmZlcgorICogYW5kIGZvciB3aGljaCB0aGUgcGFyc2VyIGZ1bmN0aW9uIHN1Y2NlZWRzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBFTk9FTlQgZm9yIGVuZC1vZi1maWxlIChnbGliYyBjb252ZW50aW9uKS4KKyAqLworc3RhdGljIGludCBiYl9fcGdzcmVhZGVyKAorCQlpbnQgRkFTVF9GVU5DICgqcGFyc2VyZnVuYykodm9pZCAqZCwgY2hhciAqbGluZSksCisJCXZvaWQgKmRhdGEsCisJCWNoYXIgKl9fcmVzdHJpY3QgbGluZV9idWZmLAorCQlzaXplX3QgYnVmbGVuLAorCQlGSUxFICpmKQoreworCWludCBza2lwOworCWludCBydiA9IEVSQU5HRTsKKworCWlmIChidWZsZW4gPCBQV0RfQlVGRkVSX1NJWkUpIHsKKwkJZXJybm8gPSBydjsKKwkJcmV0dXJuIHJ2OworCX0KKworCXNraXAgPSAwOworCXdoaWxlICgxKSB7CisJCWlmICghZmdldHMobGluZV9idWZmLCBidWZsZW4sIGYpKSB7CisJCQlpZiAoZmVvZihmKSkgeworCQkJCXJ2ID0gRU5PRU5UOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQl7CisJCQlpbnQgbGluZV9sZW4gPSBzdHJsZW4obGluZV9idWZmKSAtIDE7CisJCQlpZiAobGluZV9sZW4gPj0gMCAmJiBsaW5lX2J1ZmZbbGluZV9sZW5dID09ICdcbicpIHsKKwkJCQlsaW5lX2J1ZmZbbGluZV9sZW5dID0gJ1wwJzsKKwkJCX0gZWxzZQorCQkJaWYgKGxpbmVfbGVuICsgMiA9PSBidWZsZW4pIHsKKwkJCQkvKiBBIHN0YXJ0IChvciBjb250aW51YXRpb24pIG9mIG92ZXJsb25nIGxpbmUgKi8KKwkJCQlza2lwID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gLyogZWxzZTogYSBsYXN0IGxpbmUgaW4gdGhlIGZpbGUsIGFuZCBpdCBoYXMgbm8gJ1xuJyAqLworCQl9CisKKwkJaWYgKHNraXApIHsKKwkJCS8qIFRoaXMgImxpbmUiIGlzIGEgcmVtYWluZGVyIG9mIG92ZXJsb25nIGxpbmUsIGlnbm9yZSAqLworCQkJc2tpcCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5PVEU6IGdsaWJjIGRpZmZlcmVuY2UgLSBnbGliYyBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20KKwkJICogcmVjb3Jkcy4gIFdlIGRvIG5vdCBhbGxvdyBsZWFkaW5nIHdoaXRlc3BhY2UuICovCisKKwkJLyogU2tpcCBlbXB0eSBsaW5lcywgY29tbWVudCBsaW5lcywgYW5kIGxpbmVzIHdpdGggbGVhZGluZworCQkgKiB3aGl0ZXNwYWNlLiAqLworCQlpZiAobGluZV9idWZmWzBdICE9ICdcMCcgJiYgbGluZV9idWZmWzBdICE9ICcjJyAmJiAhaXNzcGFjZShsaW5lX2J1ZmZbMF0pKSB7CisJCQlpZiAocGFyc2VyZnVuYyA9PSBiYl9fcGFyc2VncmVudCkgeworCQkJCS8qIERvIGV2aWwgZ3JvdXAgaGFjazoKKwkJCQkgKiBUaGUgZ3JvdXAgZW50cnkgcGFyc2luZyBmdW5jdGlvbiBuZWVkcyB0byBrbm93IHdoZXJlCisJCQkJICogdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIHNvIHRoYXQgaXQgY2FuIGNvbnN0cnVjdCB0aGUKKwkJCQkgKiBncm91cCBtZW1iZXIgcHRyIHRhYmxlLiAqLworCQkJCSgoc3RydWN0IGdyb3VwICopIGRhdGEpLT5ncl9uYW1lID0gbGluZV9idWZmICsgYnVmbGVuOworCQkJfQorCQkJaWYgKHBhcnNlcmZ1bmMoZGF0YSwgbGluZV9idWZmKSA9PSAwKSB7CisJCQkJcnYgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL2xpYnB3ZGdycC9wd2RfZ3JwX2ludGVybmFsLmMgYi9saWJwd2RncnAvcHdkX2dycF9pbnRlcm5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDgzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwd2RncnAvcHdkX2dycF9pbnRlcm5hbC5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogQ29weXJpZ2h0IChDKSAyMDAzICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBOb3YgNiwgMjAwMyAgSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqIE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgcXVpdGUgc3RyaWN0IGFib3V0IHJlcXVpcmluZyBhbGwKKyAqICAgIGZpZWxkIHNlcGVyYXRvcnMuICBJdCBhbHNvIGRvZXMgbm90IGFsbG93IGxlYWRpbmcgd2hpdGVzcGFjZQorICogICAgZXhjZXB0IHdoZW4gcHJvY2Vzc2luZyB0aGUgbnVtZXJpYyBmaWVsZHMuICBnbGliYyBpcyBtb3JlCisgKiAgICBsZW5pZW50LiAgU2VlIHRoZSB2YXJpb3VzIGdsaWJjIGRpZmZlcmVuY2UgY29tbWVudHMgYmVsb3cuCisgKgorICogVE9ETzoKKyAqICAgIE1vdmUgdG8gZHluYW1pYyBhbGxvY2F0aW9uIG9mIChjdXJyZW50bHkgc3RhdGljYWxseSBhbGxvY2F0ZWQpCisgKiAgICAgIGJ1ZmZlcnM7IGVzcGVjaWFsbHkgZm9yIHRoZSBncm91cC1yZWxhdGVkIGZ1bmN0aW9ucyBzaW5jZQorICogICAgICBsYXJnZSBncm91cCBtZW1iZXIgbGlzdHMgd2lsbCBjYXVzZSBlcnJvciByZXR1cm5zLgorICovCisKKyNpZm5kZWYgR0VUWFhLRVlfUl9GVU5DCisjZXJyb3IgR0VUWFhLRVlfUl9GVU5DIGlzIG5vdCBkZWZpbmVkIQorI2VuZGlmCisKK2ludCBHRVRYWEtFWV9SX0ZVTkMoR0VUWFhLRVlfUl9LRVlUWVBFIGtleSwKKwkJCQlHRVRYWEtFWV9SX0VOVFRZUEUgKl9fcmVzdHJpY3QgcmVzdWx0YnVmLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQkJCUdFVFhYS0VZX1JfRU5UVFlQRSAqKl9fcmVzdHJpY3QgcmVzdWx0KQoreworCUZJTEUgKnN0cmVhbTsKKwlpbnQgcnY7CisKKwkqcmVzdWx0ID0gTlVMTDsKKworCXN0cmVhbSA9IGZvcGVuX2Zvcl9yZWFkKEdFVFhYS0VZX1JfUEFUSE5BTUUpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gZXJybm87CisJd2hpbGUgKDEpIHsKKwkJcnYgPSBiYl9fcGdzcmVhZGVyKEdFVFhYS0VZX1JfUEFSU0VSLCByZXN1bHRidWYsIGJ1ZmZlciwgYnVmbGVuLCBzdHJlYW0pOworCQlpZiAoIXJ2KSB7CisJCQlpZiAoR0VUWFhLRVlfUl9URVNUKHJlc3VsdGJ1ZikpIHsgLyogZm91bmQga2V5PyAqLworCQkJCSpyZXN1bHQgPSByZXN1bHRidWY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocnYgPT0gRU5PRU5UKSB7ICAvKiBFT0YgZW5jb3VudGVyZWQgKi8KKwkJCQlydiA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlmY2xvc2Uoc3RyZWFtKTsKKworCXJldHVybiBydjsKK30KKworI3VuZGVmIEdFVFhYS0VZX1JfRlVOQworI3VuZGVmIEdFVFhYS0VZX1JfUEFSU0VSCisjdW5kZWYgR0VUWFhLRVlfUl9FTlRUWVBFCisjdW5kZWYgR0VUWFhLRVlfUl9URVNUCisjdW5kZWYgR0VUWFhLRVlfUl9LRVlUWVBFCisjdW5kZWYgR0VUWFhLRVlfUl9QQVRITkFNRQpkaWZmIC0tZ2l0IGEvbGlicHdkZ3JwL3VpZGdpZF9nZXQuYyBiL2xpYnB3ZGdycC91aWRnaWRfZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4OGJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnB3ZGdycC91aWRnaWRfZ2V0LmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBBbHdheXMgc2V0cyB1aWQgYW5kIGdpZCAqLworaW50IEZBU1RfRlVOQyBnZXRfdWlkZ2lkKHN0cnVjdCBiYl91aWRnaWRfdCAqdSwgY29uc3QgY2hhciAqdWcsIGludCBudW1lcmljX29rKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ZDsKKwlzdHJ1Y3QgZ3JvdXAgKmdyOworCWNoYXIgKnVzZXIsICpncm91cDsKKwl1bnNpZ25lZCBuOworCisJdXNlciA9IChjaGFyKil1ZzsKKwlncm91cCA9IHN0cmNocih1ZywgJzonKTsKKwlpZiAoZ3JvdXApIHsKKwkJaW50IHN6ID0gKCsrZ3JvdXApIC0gdWc7CisJCXVzZXIgPSBhbGxvY2Eoc3opOworCQkvKiBjb3BpZXMgc3otMSBieXRlcywgc3RvcmVzIHRlcm1pbmF0aW5nICdcMCcgKi8KKwkJc2FmZV9zdHJuY3B5KHVzZXIsIHVnLCBzeik7CisJfQorCWlmIChudW1lcmljX29rKSB7CisJCW4gPSBiYl9zdHJ0b3UodXNlciwgTlVMTCwgMTApOworCQlpZiAoIWVycm5vKSB7CisJCQl1LT51aWQgPSBuOworCQkJcHdkID0gZ2V0cHd1aWQobik7CisJCQkvKiBJZiB3ZSBoYXZlIGUuZy4gIjUwMCIgc3RyaW5nIHdpdGhvdXQgdXNlciAqLworCQkJLyogd2l0aCB1aWQgNTAwIGluIC9ldGMvcGFzc3dkLCB3ZSBzZXQgZ2lkID09IHVpZCAqLworCQkJdS0+Z2lkID0gcHdkID8gcHdkLT5wd19naWQgOiBuOworCQkJZ290byBza2lwOworCQl9CisJfQorCS8qIEVpdGhlciBpdCBpcyBub3QgbnVtZXJpYywgb3IgY2FsbGVyIGRpc2FsbG93cyBudW1lcmljIHVzZXJuYW1lICovCisJcHdkID0gZ2V0cHduYW0odXNlcik7CisJaWYgKCFwd2QpCisJCXJldHVybiAwOworCXUtPnVpZCA9IHB3ZC0+cHdfdWlkOworCXUtPmdpZCA9IHB3ZC0+cHdfZ2lkOworCisgc2tpcDoKKwlpZiAoZ3JvdXApIHsKKwkJaWYgKG51bWVyaWNfb2spIHsKKwkJCW4gPSBiYl9zdHJ0b3UoZ3JvdXAsIE5VTEwsIDEwKTsKKwkJCWlmICghZXJybm8pIHsKKwkJCQl1LT5naWQgPSBuOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCWdyID0gZ2V0Z3JuYW0oZ3JvdXApOworCQlpZiAoIWdyKQorCQkJcmV0dXJuIDA7CisJCXUtPmdpZCA9IGdyLT5ncl9naWQ7CisJfQorCXJldHVybiAxOworfQordm9pZCBGQVNUX0ZVTkMgeGdldF91aWRnaWQoc3RydWN0IGJiX3VpZGdpZF90ICp1LCBjb25zdCBjaGFyICp1ZykKK3sKKwlpZiAoIWdldF91aWRnaWQodSwgdWcsIDEpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB1c2VyL2dyb3VwICVzIiwgdWcpOworfQorCisvKiBjaG93bi1saWtlOgorICogInVzZXIiIHNldHMgdWlkIG9ubHksCisgKiAiOmdyb3VwIiBzZXRzIGdpZCBvbmx5CisgKiAidXNlcjoiIHNldHMgdWlkIGFuZCBnaWQgKHRvIHVzZXIncyBwcmltYXJ5IGdyb3VwIGlkKQorICogInVzZXI6Z3JvdXAiIHNldHMgdWlkIGFuZCBnaWQKKyAqICgndW5zZXQnIHVpZCBvciBnaWQgcmV0YWlucyB0aGUgdmFsdWUgaXQgaGFzIG9uIGVudHJ5KQorICovCit2b2lkIEZBU1RfRlVOQyBwYXJzZV9jaG93bl91c2VyZ3JvdXBfb3JfZGllKHN0cnVjdCBiYl91aWRnaWRfdCAqdSwgY2hhciAqdXNlcl9ncm91cCkKK3sKKwljaGFyICpncm91cDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGEgZ3JvdXAgbmFtZSAqLworCWdyb3VwID0gc3RyY2hyKHVzZXJfZ3JvdXAsICcuJyk7IC8qIGRlcHJlY2F0ZWQ/ICovCisJaWYgKCFncm91cCkKKwkJZ3JvdXAgPSBzdHJjaHIodXNlcl9ncm91cCwgJzonKTsKKwllbHNlCisJCSpncm91cCA9ICc6JzsgLyogcmVwbGFjZSAnLicgd2l0aCAnOicgKi8KKworCS8qIFBhcnNlICJ1c2VyWzpbZ3JvdXBdXSIgKi8KKwlpZiAoIWdyb3VwKSB7IC8qICJ1c2VyIiAqLworCQl1LT51aWQgPSBnZXRfdWdfaWQodXNlcl9ncm91cCwgeHVuYW1lMnVpZCk7CisJfSBlbHNlIGlmIChncm91cCA9PSB1c2VyX2dyb3VwKSB7IC8qICI6Z3JvdXAiICovCisJCXUtPmdpZCA9IGdldF91Z19pZChncm91cCArIDEsIHhncm91cDJnaWQpOworCX0gZWxzZSB7CisJCWlmICghZ3JvdXBbMV0pIC8qICJ1c2VyOiIgKi8KKwkJCSpncm91cCA9ICdcMCc7CisJCXhnZXRfdWlkZ2lkKHUsIHVzZXJfZ3JvdXApOworCX0KK30KKworI2lmIDAKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oKQoreworCXVuc2lnbmVkIHU7CisJc3RydWN0IGJiX3VpZGdpZF90IHVnOworCXUgPSBnZXRfdWlkZ2lkKCZ1ZywgImFwYWNoZSIsIDApOworCXByaW50ZigiJXUgPSAldToldVxuIiwgdSwgdWcudWlkLCB1Zy5naWQpOworCXVnLnVpZCA9IHVnLmdpZCA9IDExMTE7CisJdSA9IGdldF91aWRnaWQoJnVnLCAiYXBhY2hlIiwgMCk7CisJcHJpbnRmKCIldSA9ICV1OiV1XG4iLCB1LCB1Zy51aWQsIHVnLmdpZCk7CisJdWcudWlkID0gdWcuZ2lkID0gMTExMTsKKwl1ID0gZ2V0X3VpZGdpZCgmdWcsICJhcGFjaGU6dXNlcnMiLCAwKTsKKwlwcmludGYoIiV1ID0gJXU6JXVcbiIsIHUsIHVnLnVpZCwgdWcuZ2lkKTsKKwl1Zy51aWQgPSB1Zy5naWQgPSAxMTExOworCXUgPSBnZXRfdWlkZ2lkKCZ1ZywgImFwYWNoZTp1c2VycyIsIDApOworCXByaW50ZigiJXUgPSAldToldVxuIiwgdSwgdWcudWlkLCB1Zy5naWQpOworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL0NvbmZpZy5pbiBiL2xvZ2ludXRpbHMvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjMzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL0NvbmZpZy5pbgpAQCAtMCwwICsxLDMyNCBAQAorIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzIgorCitjb25maWcgQUREX1NIRUxMCisgICAgICAgYm9vbCAiYWRkLXNoZWxsIgorICAgICAgIGRlZmF1bHQgeSBpZiBERVNLVE9QCisgICAgICAgaGVscAorICAgICAgICAgQWRkIHNoZWxscyB0byAvZXRjL3NoZWxscy4KKworY29uZmlnIFJFTU9WRV9TSEVMTAorICAgICAgIGJvb2wgInJlbW92ZS1zaGVsbCIKKyAgICAgICBkZWZhdWx0IHkgaWYgREVTS1RPUAorICAgICAgIGhlbHAKKyAgICAgICAgIFJlbW92ZSBzaGVsbHMgZnJvbSAvZXRjL3NoZWxscy4KKworY29uZmlnIEZFQVRVUkVfU0hBRE9XUEFTU1dEUworCWJvb2wgIlN1cHBvcnQgZm9yIHNoYWRvdyBwYXNzd29yZHMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQnVpbGQgc3VwcG9ydCBmb3Igc2hhZG93IHBhc3N3b3JkIGluIC9ldGMvc2hhZG93LiBUaGlzIGZpbGUgaXMgb25seQorCSAgcmVhZGFibGUgYnkgcm9vdCBhbmQgdGh1cyB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkcyBhcmUgbm8gbG9uZ2VyCisJICBwdWJsaWNseSByZWFkYWJsZS4KKworY29uZmlnIFVTRV9CQl9QV0RfR1JQCisJYm9vbCAiVXNlIGludGVybmFsIHBhc3N3b3JkIGFuZCBncm91cCBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gc3lzdGVtIGZ1bmN0aW9ucyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgYnVzeWJveCB3aWxsIHVzZSB0aGUgc3lzdGVtJ3MgcGFzc3dvcmQKKwkgIGFuZCBncm91cCBmdW5jdGlvbnMuIEFuZCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5CisJICAoZ2xpYmMpLCB5b3Ugd2lsbCB0aGVuIG5lZWQgdG8gaW5zdGFsbCB0aGUgL2V0Yy9uc3N3aXRjaC5jb25mCisJICBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHRoZSByZXF1aXJlZCAvbGliL2xpYm5zc18qIGxpYnJhcmllcyBpbgorCSAgb3JkZXIgZm9yIHRoZSBwYXNzd29yZCBhbmQgZ3JvdXAgZnVuY3Rpb25zIHRvIHdvcmsuIFRoaXMgZ2VuZXJhbGx5CisJICBtYWtlcyB5b3VyIGVtYmVkZGVkIHN5c3RlbSBxdWl0ZSBhIGJpdCBsYXJnZXIuCisKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgYnVzeWJveCB0byBkaXJlY3RseSBhY2Nlc3MgdGhlCisJICBzeXN0ZW0ncyAvZXRjL3Bhc3N3b3JkLCAvZXRjL2dyb3VwIGZpbGVzIChhbmQgeW91ciBzeXN0ZW0gd2lsbCBiZQorCSAgc21hbGxlciwgYW5kIEkgd2lsbCBnZXQgZmV3ZXIgZW1haWxzIGFza2luZyBhYm91dCBob3cgZ2xpYmMgTlNTCisJICB3b3JrcykuIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gdXNlCisJICBQQU0gdG8gYWNjZXNzIHJlbW90ZSBMREFQIHBhc3N3b3JkIHNlcnZlcnMgYW5kIHdoYXRub3QuIEFuZCBpZiB5b3UKKwkgIHdhbnQgaG9zdG5hbWUgcmVzb2x1dGlvbiB0byB3b3JrIHdpdGggZ2xpYmMsIHlvdSBzdGlsbCBuZWVkIHRoZQorCSAgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMuCisKKwkgIElmIHlvdSBuZWVkIHRvIHVzZSBnbGliYydzIG5zc3dpdGNoLmNvbmYgbWVjaGFuaXNtCisJICAoZS5nLiBpZiB1c2VyL2dyb3VwIGRhdGFiYXNlIGlzIE5PVCBzdG9yZWQgaW4gL2V0Yy9wYXNzd2QgZXRjKSwKKwkgIHlvdSBtdXN0IE5PVCB1c2UgdGhpcyBvcHRpb24uCisKKwkgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIGl0IHdpbGwgYWRkIGFib3V0IDEuNWsuCisKK2NvbmZpZyBVU0VfQkJfU0hBRE9XCisJYm9vbCAiVXNlIGludGVybmFsIHNoYWRvdyBwYXNzd29yZCBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0VfQkJfUFdEX0dSUCAmJiBGRUFUVVJFX1NIQURPV1BBU1NXRFMKKwloZWxwCisJICBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgYnVzeWJveCB3aWxsIHVzZSB0aGUgc3lzdGVtJ3Mgc2hhZG93CisJICBwYXNzd29yZCBoYW5kbGluZyBmdW5jdGlvbnMuIEFuZCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5CisJICAoZ2xpYmMpLCB5b3Ugd2lsbCB0aGVuIG5lZWQgdG8gaW5zdGFsbCB0aGUgL2V0Yy9uc3N3aXRjaC5jb25mCisJICBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHRoZSByZXF1aXJlZCAvbGliL2xpYm5zc18qIGxpYnJhcmllcyBpbgorCSAgb3JkZXIgZm9yIHRoZSBzaGFkb3cgcGFzc3dvcmQgZnVuY3Rpb25zIHRvIHdvcmsuIFRoaXMgZ2VuZXJhbGx5CisJICBtYWtlcyB5b3VyIGVtYmVkZGVkIHN5c3RlbSBxdWl0ZSBhIGJpdCBsYXJnZXIuCisKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgYnVzeWJveCB0byBkaXJlY3RseSBhY2Nlc3MgdGhlCisJICBzeXN0ZW0ncyAvZXRjL3NoYWRvdyBmaWxlIHdoZW4gaGFuZGxpbmcgc2hhZG93IHBhc3N3b3Jkcy4gVGhpcworCSAgbWFrZXMgeW91ciBzeXN0ZW0gc21hbGxlciAoYW5kIEkgd2lsbCBnZXQgZmV3ZXIgZW1haWxzIGFza2luZyBhYm91dAorCSAgaG93IGdsaWJjIE5TUyB3b3JrcykuIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgeW91IHdpbGwgbm90IGJlCisJICBhYmxlIHRvIHVzZSBQQU0gdG8gYWNjZXNzIHNoYWRvdyBwYXNzd29yZHMgZnJvbSByZW1vdGUgTERBUAorCSAgcGFzc3dvcmQgc2VydmVycyBhbmQgd2hhdG5vdC4KKworY29uZmlnIFVTRV9CQl9DUllQVAorCWJvb2wgIlVzZSBpbnRlcm5hbCBjcnlwdCBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQnVzeWJveCBoYXMgaW50ZXJuYWwgREVTIGFuZCBNRDUgY3J5cHQgZnVuY3Rpb25zLgorCSAgVGhleSBwcm9kdWNlIHJlc3VsdHMgd2hpY2ggYXJlIGlkZW50aWNhbCB0byBjb3JyZXNwb25kaW5nCisJICBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zLgorCisJICBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgYnVzeWJveCB3aWxsIHVzZSB0aGUgc3lzdGVtJ3MKKwkgIGNyeXB0IGZ1bmN0aW9ucy4gTW9zdCBDIGxpYnJhcmllcyB1c2UgbGFyZ2UgKH43MGspCisJICBzdGF0aWMgYnVmZmVycyB0aGVyZSwgYW5kIGFsc28gY29tYmluZSB0aGVtIHdpdGggbW9yZSBnZW5lcmFsCisJICBERVMgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLgorCisJICBGb3IgYnVzeWJveCwgaGF2aW5nIGxhcmdlIHN0YXRpYyBidWZmZXJzIGlzIHVuZGVzaXJhYmxlLAorCSAgZXNwZWNpYWxseSBvbiBOT01NVSBtYWNoaW5lcy4gQnVzeWJveCBhbHNvIGRvZXNuJ3QgbmVlZAorCSAgREVTIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBhbmQgY2FuIGRvIHdpdGggc21hbGxlciBjb2RlLgorCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uLCBpdCB3aWxsIGFkZCBhYm91dCA0LjhrIG9mIGNvZGUKKwkgIGlmIHlvdSBhcmUgYnVpbGRpbmcgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGUuCisJICBJbiBzdGF0aWMgYnVpbGQsIGl0IG1ha2VzIGNvZGUgX3NtYWxsZXJfIGJ5IGFib3V0IDEuMmssCisJICBhbmQgbGlrZWx5IG1hbnkga2lsb2J5dGVzIGxlc3Mgb2YgYnNzLgorCitjb25maWcgVVNFX0JCX0NSWVBUX1NIQQorCWJvb2wgIkVuYWJsZSBTSEEyNTYvNTEyIGNyeXB0IGZ1bmN0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVTRV9CQl9DUllQVAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIGlmIHlvdSBoYXZlIHBhc3N3b3JkcyBzdGFydGluZyB3aXRoICIkNSQiIG9yICIkNiQiCisJICBpbiB5b3VyIC9ldGMvcGFzc3dkIG9yIC9ldGMvc2hhZG93IGZpbGVzLiBUaGVzZSBwYXNzd29yZHMKKwkgIGFyZSBoYXNoZWQgdXNpbmcgU0hBMjU2IGFuZCBTSEE1MTIgYWxnb3JpdGhtcy4gU3VwcG9ydCBmb3IgdGhlbQorCSAgd2FzIGFkZGVkIHRvIGdsaWJjIGluIDIwMDguCisJICBXaXRoIHRoaXMgb3B0aW9uIG9mZiwgbG9naW4gd2lsbCBmYWlsIHBhc3N3b3JkIGNoZWNrIGZvciBhbnkKKwkgIHVzZXIgd2hpY2ggaGFzIHBhc3N3b3JkIGVuY3J5cHRlZCB3aXRoIHRoZXNlIGFsZ29yaXRobXMuCisKK2NvbmZpZyBBRERVU0VSCisJYm9vbCAiYWRkdXNlciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVdGlsaXR5IGZvciBjcmVhdGluZyBhIG5ldyB1c2VyIGFjY291bnQuCisKK2NvbmZpZyBGRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFERFVTRVIgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBhZGR1c2VyIGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfQ0hFQ0tfTkFNRVMKKwlib29sICJFbmFibGUgc2FuaXR5IGNoZWNrIG9uIHVzZXIvZ3JvdXAgbmFtZXMgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBBRERVU0VSIHx8IEFEREdST1VQCisJaGVscAorCSAgRW5hYmxlIHNhbml0eSBjaGVjayBvbiB1c2VyIGFuZCBncm91cCBuYW1lcyBpbiBhZGR1c2VyIGFuZCBhZGRncm91cC4KKwkgIFRvIGF2b2lkIHByb2JsZW1zLCB0aGUgdXNlciBvciBncm91cCBuYW1lIHNob3VsZCBjb25zaXN0IG9ubHkgb2YKKwkgIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZXMsIHBlcmlvZHMsIGF0IHNpZ25zIGFuZCBkYXNoZXMsCisJICBhbmQgbm90IHN0YXJ0IHdpdGggYSBkYXNoIChhcyBkZWZpbmVkIGJ5IElFRUUgU3RkIDEwMDMuMS0yMDAxKS4KKwkgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggU2FtYmEgbWFjaGluZSBhY2NvdW50cyAiJCIgaXMgYWxzbyBzdXBwb3J0ZWQKKwkgIGF0IHRoZSBlbmQgb2YgdGhlIHVzZXIgb3IgZ3JvdXAgbmFtZS4KKworY29uZmlnIEZJUlNUX1NZU1RFTV9JRAorCWludCAiRmlyc3QgdmFsaWQgc3lzdGVtIHVpZCBvciBnaWQgZm9yIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCXJhbmdlIDAgNjQ5MDAKKwlkZWZhdWx0IDEwMAorCWhlbHAKKwkgIEZpcnN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cAorCitjb25maWcgTEFTVF9TWVNURU1fSUQKKwlpbnQgIkxhc3QgdmFsaWQgc3lzdGVtIHVpZCBvciBnaWQgZm9yIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCXJhbmdlIDAgNjQ5MDAKKwlkZWZhdWx0IDk5OQorCWhlbHAKKwkgIExhc3QgdmFsaWQgc3lzdGVtIHVpZCBvciBnaWQgZm9yIGFkZHVzZXIgYW5kIGFkZGdyb3VwCisKK2NvbmZpZyBBRERHUk9VUAorCWJvb2wgImFkZGdyb3VwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFV0aWxpdHkgZm9yIGNyZWF0aW5nIGEgbmV3IGdyb3VwIGFjY291bnQuCisKK2NvbmZpZyBGRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBRERHUk9VUCAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIGFkZGdyb3VwIGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfQUREVVNFUl9UT19HUk9VUAorCWJvb2wgIlN1cHBvcnQgZm9yIGFkZGluZyB1c2VycyB0byBncm91cHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBRERHUk9VUAorCWhlbHAKKwkgIElmICBjYWxsZWQgIHdpdGggdHdvIG5vbi1vcHRpb24gYXJndW1lbnRzLAorCSAgYWRkZ3JvdXAgd2lsbCBhZGQgYW4gZXhpc3RpbmcgdXNlciB0byBhbgorCSAgZXhpc3RpbmcgZ3JvdXAuCisKK2NvbmZpZyBERUxVU0VSCisJYm9vbCAiZGVsdXNlciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVdGlsaXR5IGZvciBkZWxldGluZyBhIHVzZXIgYWNjb3VudC4KKworY29uZmlnIERFTEdST1VQCisJYm9vbCAiZGVsZ3JvdXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgZGVsZXRpbmcgYSBncm91cCBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQCisJYm9vbCAiU3VwcG9ydCBmb3IgcmVtb3ZpbmcgdXNlcnMgZnJvbSBncm91cHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERUxHUk9VUAorCWhlbHAKKwkgIElmIGNhbGxlZCB3aXRoIHR3byBub24tb3B0aW9uIGFyZ3VtZW50cywgZGVsdXNlcgorCSAgb3IgZGVsZ3JvdXAgd2lsbCByZW1vdmUgYW4gdXNlciBmcm9tIGEgc3BlY2lmaWVkIGdyb3VwLgorCitjb25maWcgR0VUVFkKKwlib29sICJnZXR0eSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBnZXR0eSBsZXRzIHlvdSBsb2cgaW4gb24gYSB0dHkuIEl0IGlzIG5vcm1hbGx5IGludm9rZWQgYnkgaW5pdC4KKworCSAgTm90ZSB0aGF0IHlvdSBjYW4gc2F2ZSBhIGZldyBieXRlcyBieSBkaXNhYmxpbmcgaXQgYW5kCisJICB1c2luZyBsb2dpbiBhcHBsZXQgZGlyZWN0bHkuCisJICBJZiB5b3UgbmVlZCB0byByZXNldCB0dHkgYXR0cmlidXRlcyBiZWZvcmUgY2FsbGluZyBsb2dpbiwKKwkgIHRoaXMgc2NyaXB0IGFwcHJveGltYXRlcyBnZXR0eToKKworCSAgZXhlYyA8L2Rldi8kMSA+L2Rldi8kMSAyPiYxIHx8IGV4aXQgMQorCSAgcmVzZXQKKwkgIHN0dHkgc2FuZTsgc3R0eSBpc3BlZWQgMzg0MDA7IHN0dHkgb3NwZWVkIDM4NDAwCisJICBwcmludGYgIiVzIGxvZ2luOiAiICJgaG9zdG5hbWVgIgorCSAgcmVhZCAtciBsb2dpbgorCSAgZXhlYyAvYmluL2xvZ2luICIkbG9naW4iCisKK2NvbmZpZyBMT0dJTgorCWJvb2wgImxvZ2luIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIGxvZ2luIGlzIHVzZWQgd2hlbiBzaWduaW5nIG9udG8gYSBzeXN0ZW0uCisKKwkgIE5vdGUgdGhhdCBCdXN5Ym94IGJpbmFyeSBtdXN0IGJlIHNldHVpZCByb290IGZvciB0aGlzIGFwcGxldCB0bworCSAgd29yayBwcm9wZXJseS4KKworY29uZmlnIFBBTQorCWJvb2wgIlN1cHBvcnQgZm9yIFBBTSAoUGx1Z2dhYmxlIEF1dGhlbnRpY2F0aW9uIE1vZHVsZXMpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTE9HSU4KKwloZWxwCisJICBVc2UgUEFNIGluIGxvZ2luKDEpIGluc3RlYWQgb2YgZGlyZWN0IGFjY2VzcyB0byBwYXNzd29yZCBkYXRhYmFzZS4KKworY29uZmlnIExPR0lOX1NDUklQVFMKKwlib29sICJTdXBwb3J0IGZvciBsb2dpbiBzY3JpcHRzIgorCWRlcGVuZHMgb24gTE9HSU4KKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCBsb2dpbiB0byBleGVjdXRlICRMT0dJTl9QUkVfU1VJRF9TQ1JJUFQKKwkgIGp1c3QgcHJpb3IgdG8gc3dpdGNoaW5nIGZyb20gcm9vdCB0byBsb2dnZWQtaW4gdXNlci4KKworY29uZmlnIEZFQVRVUkVfTk9MT0dJTgorCWJvb2wgIlN1cHBvcnQgZm9yIC9ldGMvbm9sb2dpbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPR0lOCisJaGVscAorCSAgVGhlIGZpbGUgL2V0Yy9ub2xvZ2luIGlzIHVzZWQgYnkgKHNvbWUgdmVyc2lvbnMgb2YpIGxvZ2luKDEpLgorCSAgSWYgaXQgZXhpc3RzLCBub24tcm9vdCBsb2dpbnMgYXJlIHByb2hpYml0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX1NFQ1VSRVRUWQorCWJvb2wgIlN1cHBvcnQgZm9yIC9ldGMvc2VjdXJldHR5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9HSU4KKwloZWxwCisJICBUaGUgZmlsZSAvZXRjL3NlY3VyZXR0eSBpcyB1c2VkIGJ5IChzb21lIHZlcnNpb25zIG9mKSBsb2dpbigxKS4KKwkgIFRoZSBmaWxlIGNvbnRhaW5zIHRoZSBkZXZpY2UgbmFtZXMgb2YgdHR5IGxpbmVzIChvbmUgcGVyIGxpbmUsCisJICB3aXRob3V0IGxlYWRpbmcgL2Rldi8pIG9uIHdoaWNoIHJvb3QgaXMgYWxsb3dlZCB0byBsb2dpbi4KKworY29uZmlnIFBBU1NXRAorCWJvb2wgInBhc3N3ZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBwYXNzd2QgY2hhbmdlcyBwYXNzd29yZHMgZm9yIHVzZXIgYW5kIGdyb3VwIGFjY291bnRzLiBBIG5vcm1hbCB1c2VyCisJICBtYXkgb25seSBjaGFuZ2UgdGhlIHBhc3N3b3JkIGZvciBoaXMvaGVyIG93biBhY2NvdW50LCB0aGUgc3VwZXIgdXNlcgorCSAgbWF5IGNoYW5nZSB0aGUgcGFzc3dvcmQgZm9yIGFueSBhY2NvdW50LiBUaGUgYWRtaW5pc3RyYXRvciBvZiBhIGdyb3VwCisJICBtYXkgY2hhbmdlIHRoZSBwYXNzd29yZCBmb3IgdGhlIGdyb3VwLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBGRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLCisJYm9vbCAiQ2hlY2sgbmV3IHBhc3N3b3JkcyBmb3Igd2Vha25lc3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQQVNTV0QKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIHBhc3N3ZCB3aWxsIHJlZnVzZSBuZXcgcGFzc3dvcmRzIHdoaWNoIGFyZSAid2VhayIuCisKK2NvbmZpZyBDUllQVFBXCisJYm9vbCAiY3J5cHRwdyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmNyeXB0cyB0aGUgZ2l2ZW4gcGFzc3dvcmQgd2l0aCB0aGUgY3J5cHQoMykgbGliYyBmdW5jdGlvbgorCSAgdXNpbmcgdGhlIGdpdmVuIHNhbHQuIERlYmlhbiBoYXMgdGhpcyB1dGlsaXR5IHVuZGVyIG1rcGFzc3dkCisJICBuYW1lLiBCdXN5Ym94IHByb3ZpZGVzIG1rcGFzc3dkIGFzIGFuIGFsaWFzIGZvciBjcnlwdHB3LgorCitjb25maWcgQ0hQQVNTV0QKKwlib29sICJjaHBhc3N3ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZWFkcyBhIGZpbGUgb2YgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBwYWlycyBmcm9tIHN0YW5kYXJkIGlucHV0CisJICBhbmQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIHVwZGF0ZSBhIGdyb3VwIG9mIGV4aXN0aW5nIHVzZXJzLgorCitjb25maWcgU1UKKwlib29sICJzdSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBzdSBpcyB1c2VkIHRvIGJlY29tZSBhbm90aGVyIHVzZXIgZHVyaW5nIGEgbG9naW4gc2Vzc2lvbi4KKwkgIEludm9rZWQgd2l0aG91dCBhIHVzZXJuYW1lLCBzdSBkZWZhdWx0cyB0byBiZWNvbWluZyB0aGUgc3VwZXIgdXNlci4KKworCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitjb25maWcgRkVBVFVSRV9TVV9TWVNMT0cKKwlib29sICJFbmFibGUgc3UgdG8gd3JpdGUgdG8gc3lzbG9nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1UKKworY29uZmlnIEZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUworCWJvb2wgIkVuYWJsZSBzdSB0byBjaGVjayB1c2VyJ3Mgc2hlbGwgdG8gYmUgbGlzdGVkIGluIC9ldGMvc2hlbGxzIgorCWRlcGVuZHMgb24gU1UKKwlkZWZhdWx0IHkKKworY29uZmlnIFNVTE9HSU4KKwlib29sICJzdWxvZ2luIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIHN1bG9naW4gaXMgaW52b2tlZCB3aGVuIHRoZSBzeXN0ZW0gZ29lcyBpbnRvIHNpbmdsZSB1c2VyCisJICBtb2RlICh0aGlzIGlzIGRvbmUgdGhyb3VnaCBhbiBlbnRyeSBpbiBpbml0dGFiKS4KKworY29uZmlnIFZMT0NLCisJYm9vbCAidmxvY2siCisJZGVmYXVsdCB5CisJaGVscAorCSAgQnVpbGQgdGhlICJ2bG9jayIgYXBwbGV0IHdoaWNoIGFsbG93cyB5b3UgdG8gbG9jayAodmlydHVhbCkgdGVybWluYWxzLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvQ29uZmlnLnNyYyBiL2xvZ2ludXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdmNTBjCi0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMzEzIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBGRUFUVVJFX1NIQURPV1BBU1NXRFMKKwlib29sICJTdXBwb3J0IGZvciBzaGFkb3cgcGFzc3dvcmRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1aWxkIHN1cHBvcnQgZm9yIHNoYWRvdyBwYXNzd29yZCBpbiAvZXRjL3NoYWRvdy4gVGhpcyBmaWxlIGlzIG9ubHkKKwkgIHJlYWRhYmxlIGJ5IHJvb3QgYW5kIHRodXMgdGhlIGVuY3J5cHRlZCBwYXNzd29yZHMgYXJlIG5vIGxvbmdlcgorCSAgcHVibGljbHkgcmVhZGFibGUuCisKK2NvbmZpZyBVU0VfQkJfUFdEX0dSUAorCWJvb2wgIlVzZSBpbnRlcm5hbCBwYXNzd29yZCBhbmQgZ3JvdXAgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHN5c3RlbSBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzIHBhc3N3b3JkCisJICBhbmQgZ3JvdXAgZnVuY3Rpb25zLiBBbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorCSAgKGdsaWJjKSwgeW91IHdpbGwgdGhlbiBuZWVkIHRvIGluc3RhbGwgdGhlIC9ldGMvbnNzd2l0Y2guY29uZgorCSAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgcmVxdWlyZWQgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMgaW4KKwkgIG9yZGVyIGZvciB0aGUgcGFzc3dvcmQgYW5kIGdyb3VwIGZ1bmN0aW9ucyB0byB3b3JrLiBUaGlzIGdlbmVyYWxseQorCSAgbWFrZXMgeW91ciBlbWJlZGRlZCBzeXN0ZW0gcXVpdGUgYSBiaXQgbGFyZ2VyLgorCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIGJ1c3lib3ggdG8gZGlyZWN0bHkgYWNjZXNzIHRoZQorCSAgc3lzdGVtJ3MgL2V0Yy9wYXNzd29yZCwgL2V0Yy9ncm91cCBmaWxlcyAoYW5kIHlvdXIgc3lzdGVtIHdpbGwgYmUKKwkgIHNtYWxsZXIsIGFuZCBJIHdpbGwgZ2V0IGZld2VyIGVtYWlscyBhc2tpbmcgYWJvdXQgaG93IGdsaWJjIE5TUworCSAgd29ya3MpLiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZQorCSAgUEFNIHRvIGFjY2VzcyByZW1vdGUgTERBUCBwYXNzd29yZCBzZXJ2ZXJzIGFuZCB3aGF0bm90LiBBbmQgaWYgeW91CisJICB3YW50IGhvc3RuYW1lIHJlc29sdXRpb24gdG8gd29yayB3aXRoIGdsaWJjLCB5b3Ugc3RpbGwgbmVlZCB0aGUKKwkgIC9saWIvbGlibnNzXyogbGlicmFyaWVzLgorCisJICBJZiB5b3UgbmVlZCB0byB1c2UgZ2xpYmMncyBuc3N3aXRjaC5jb25mIG1lY2hhbmlzbQorCSAgKGUuZy4gaWYgdXNlci9ncm91cCBkYXRhYmFzZSBpcyBOT1Qgc3RvcmVkIGluIC9ldGMvcGFzc3dkIGV0YyksCisJICB5b3UgbXVzdCBOT1QgdXNlIHRoaXMgb3B0aW9uLgorCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uLCBpdCB3aWxsIGFkZCBhYm91dCAxLjVrLgorCitjb25maWcgVVNFX0JCX1NIQURPVworCWJvb2wgIlVzZSBpbnRlcm5hbCBzaGFkb3cgcGFzc3dvcmQgZnVuY3Rpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVVNFX0JCX1BXRF9HUlAgJiYgRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJaGVscAorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzIHNoYWRvdworCSAgcGFzc3dvcmQgaGFuZGxpbmcgZnVuY3Rpb25zLiBBbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorCSAgKGdsaWJjKSwgeW91IHdpbGwgdGhlbiBuZWVkIHRvIGluc3RhbGwgdGhlIC9ldGMvbnNzd2l0Y2guY29uZgorCSAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgcmVxdWlyZWQgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMgaW4KKwkgIG9yZGVyIGZvciB0aGUgc2hhZG93IHBhc3N3b3JkIGZ1bmN0aW9ucyB0byB3b3JrLiBUaGlzIGdlbmVyYWxseQorCSAgbWFrZXMgeW91ciBlbWJlZGRlZCBzeXN0ZW0gcXVpdGUgYSBiaXQgbGFyZ2VyLgorCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIGJ1c3lib3ggdG8gZGlyZWN0bHkgYWNjZXNzIHRoZQorCSAgc3lzdGVtJ3MgL2V0Yy9zaGFkb3cgZmlsZSB3aGVuIGhhbmRsaW5nIHNoYWRvdyBwYXNzd29yZHMuIFRoaXMKKwkgIG1ha2VzIHlvdXIgc3lzdGVtIHNtYWxsZXIgKGFuZCBJIHdpbGwgZ2V0IGZld2VyIGVtYWlscyBhc2tpbmcgYWJvdXQKKwkgIGhvdyBnbGliYyBOU1Mgd29ya3MpLiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZQorCSAgYWJsZSB0byB1c2UgUEFNIHRvIGFjY2VzcyBzaGFkb3cgcGFzc3dvcmRzIGZyb20gcmVtb3RlIExEQVAKKwkgIHBhc3N3b3JkIHNlcnZlcnMgYW5kIHdoYXRub3QuCisKK2NvbmZpZyBVU0VfQkJfQ1JZUFQKKwlib29sICJVc2UgaW50ZXJuYWwgY3J5cHQgZnVuY3Rpb25zIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1c3lib3ggaGFzIGludGVybmFsIERFUyBhbmQgTUQ1IGNyeXB0IGZ1bmN0aW9ucy4KKwkgIFRoZXkgcHJvZHVjZSByZXN1bHRzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gY29ycmVzcG9uZGluZworCSAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4KKworCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzCisJICBjcnlwdCBmdW5jdGlvbnMuIE1vc3QgQyBsaWJyYXJpZXMgdXNlIGxhcmdlICh+NzBrKQorCSAgc3RhdGljIGJ1ZmZlcnMgdGhlcmUsIGFuZCBhbHNvIGNvbWJpbmUgdGhlbSB3aXRoIG1vcmUgZ2VuZXJhbAorCSAgREVTIGVuY3J5cHRpb24vZGVjcnlwdGlvbi4KKworCSAgRm9yIGJ1c3lib3gsIGhhdmluZyBsYXJnZSBzdGF0aWMgYnVmZmVycyBpcyB1bmRlc2lyYWJsZSwKKwkgIGVzcGVjaWFsbHkgb24gTk9NTVUgbWFjaGluZXMuIEJ1c3lib3ggYWxzbyBkb2Vzbid0IG5lZWQKKwkgIERFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gYW5kIGNhbiBkbyB3aXRoIHNtYWxsZXIgY29kZS4KKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiwgaXQgd2lsbCBhZGQgYWJvdXQgNC44ayBvZiBjb2RlCisJICBpZiB5b3UgYXJlIGJ1aWxkaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLgorCSAgSW4gc3RhdGljIGJ1aWxkLCBpdCBtYWtlcyBjb2RlIF9zbWFsbGVyXyBieSBhYm91dCAxLjJrLAorCSAgYW5kIGxpa2VseSBtYW55IGtpbG9ieXRlcyBsZXNzIG9mIGJzcy4KKworY29uZmlnIFVTRV9CQl9DUllQVF9TSEEKKwlib29sICJFbmFibGUgU0hBMjU2LzUxMiBjcnlwdCBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0VfQkJfQ1JZUFQKKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBwYXNzd29yZHMgc3RhcnRpbmcgd2l0aCAiJDUkIiBvciAiJDYkIgorCSAgaW4geW91ciAvZXRjL3Bhc3N3ZCBvciAvZXRjL3NoYWRvdyBmaWxlcy4gVGhlc2UgcGFzc3dvcmRzCisJICBhcmUgaGFzaGVkIHVzaW5nIFNIQTI1NiBhbmQgU0hBNTEyIGFsZ29yaXRobXMuIFN1cHBvcnQgZm9yIHRoZW0KKwkgIHdhcyBhZGRlZCB0byBnbGliYyBpbiAyMDA4LgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvZmYsIGxvZ2luIHdpbGwgZmFpbCBwYXNzd29yZCBjaGVjayBmb3IgYW55CisJICB1c2VyIHdoaWNoIGhhcyBwYXNzd29yZCBlbmNyeXB0ZWQgd2l0aCB0aGVzZSBhbGdvcml0aG1zLgorCitjb25maWcgQUREVVNFUgorCWJvb2wgImFkZHVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgY3JlYXRpbmcgYSBuZXcgdXNlciBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBRERVU0VSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgYWRkdXNlciBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX0NIRUNLX05BTUVTCisJYm9vbCAiRW5hYmxlIHNhbml0eSBjaGVjayBvbiB1c2VyL2dyb3VwIG5hbWVzIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCWhlbHAKKwkgIEVuYWJsZSBzYW5pdHkgY2hlY2sgb24gdXNlciBhbmQgZ3JvdXAgbmFtZXMgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAuCisJICBUbyBhdm9pZCBwcm9ibGVtcywgdGhlIHVzZXIgb3IgZ3JvdXAgbmFtZSBzaG91bGQgY29uc2lzdCBvbmx5IG9mCisJICBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBwZXJpb2RzLCBhdCBzaWducyBhbmQgZGFzaGVzLAorCSAgYW5kIG5vdCBzdGFydCB3aXRoIGEgZGFzaCAoYXMgZGVmaW5lZCBieSBJRUVFIFN0ZCAxMDAzLjEtMjAwMSkuCisJICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNhbWJhIG1hY2hpbmUgYWNjb3VudHMgIiQiIGlzIGFsc28gc3VwcG9ydGVkCisJICBhdCB0aGUgZW5kIG9mIHRoZSB1c2VyIG9yIGdyb3VwIG5hbWUuCisKK2NvbmZpZyBGSVJTVF9TWVNURU1fSUQKKwlpbnQgIkZpcnN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cCIKKwlkZXBlbmRzIG9uIEFERFVTRVIgfHwgQURER1JPVVAKKwlyYW5nZSAwIDY0OTAwCisJZGVmYXVsdCAxMDAKKwloZWxwCisJICBGaXJzdCB2YWxpZCBzeXN0ZW0gdWlkIG9yIGdpZCBmb3IgYWRkdXNlciBhbmQgYWRkZ3JvdXAKKworY29uZmlnIExBU1RfU1lTVEVNX0lECisJaW50ICJMYXN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cCIKKwlkZXBlbmRzIG9uIEFERFVTRVIgfHwgQURER1JPVVAKKwlyYW5nZSAwIDY0OTAwCisJZGVmYXVsdCA5OTkKKwloZWxwCisJICBMYXN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cAorCitjb25maWcgQURER1JPVVAKKwlib29sICJhZGRncm91cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVdGlsaXR5IGZvciBjcmVhdGluZyBhIG5ldyBncm91cCBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQURER1JPVVAgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBhZGRncm91cCBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAKKwlib29sICJTdXBwb3J0IGZvciBhZGRpbmcgdXNlcnMgdG8gZ3JvdXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQURER1JPVVAKKwloZWxwCisJICBJZiAgY2FsbGVkICB3aXRoIHR3byBub24tb3B0aW9uIGFyZ3VtZW50cywKKwkgIGFkZGdyb3VwIHdpbGwgYWRkIGFuIGV4aXN0aW5nIHVzZXIgdG8gYW4KKwkgIGV4aXN0aW5nIGdyb3VwLgorCitjb25maWcgREVMVVNFUgorCWJvb2wgImRlbHVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgZGVsZXRpbmcgYSB1c2VyIGFjY291bnQuCisKK2NvbmZpZyBERUxHUk9VUAorCWJvb2wgImRlbGdyb3VwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFV0aWxpdHkgZm9yIGRlbGV0aW5nIGEgZ3JvdXAgYWNjb3VudC4KKworY29uZmlnIEZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUAorCWJvb2wgIlN1cHBvcnQgZm9yIHJlbW92aW5nIHVzZXJzIGZyb20gZ3JvdXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVMR1JPVVAKKwloZWxwCisJICBJZiBjYWxsZWQgd2l0aCB0d28gbm9uLW9wdGlvbiBhcmd1bWVudHMsIGRlbHVzZXIKKwkgIG9yIGRlbGdyb3VwIHdpbGwgcmVtb3ZlIGFuIHVzZXIgZnJvbSBhIHNwZWNpZmllZCBncm91cC4KKworY29uZmlnIEdFVFRZCisJYm9vbCAiZ2V0dHkiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgZ2V0dHkgbGV0cyB5b3UgbG9nIGluIG9uIGEgdHR5LiBJdCBpcyBub3JtYWxseSBpbnZva2VkIGJ5IGluaXQuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgZGlzYWJsaW5nIGl0IGFuZAorCSAgdXNpbmcgbG9naW4gYXBwbGV0IGRpcmVjdGx5LgorCSAgSWYgeW91IG5lZWQgdG8gcmVzZXQgdHR5IGF0dHJpYnV0ZXMgYmVmb3JlIGNhbGxpbmcgbG9naW4sCisJICB0aGlzIHNjcmlwdCBhcHByb3hpbWF0ZXMgZ2V0dHk6CisKKwkgIGV4ZWMgPC9kZXYvJDEgPi9kZXYvJDEgMj4mMSB8fCBleGl0IDEKKwkgIHJlc2V0CisJICBzdHR5IHNhbmU7IHN0dHkgaXNwZWVkIDM4NDAwOyBzdHR5IG9zcGVlZCAzODQwMAorCSAgcHJpbnRmICIlcyBsb2dpbjogIiAiYGhvc3RuYW1lYCIKKwkgIHJlYWQgLXIgbG9naW4KKwkgIGV4ZWMgL2Jpbi9sb2dpbiAiJGxvZ2luIgorCitjb25maWcgTE9HSU4KKwlib29sICJsb2dpbiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBsb2dpbiBpcyB1c2VkIHdoZW4gc2lnbmluZyBvbnRvIGEgc3lzdGVtLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBQQU0KKwlib29sICJTdXBwb3J0IGZvciBQQU0gKFBsdWdnYWJsZSBBdXRoZW50aWNhdGlvbiBNb2R1bGVzKSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIExPR0lOCisJaGVscAorCSAgVXNlIFBBTSBpbiBsb2dpbigxKSBpbnN0ZWFkIG9mIGRpcmVjdCBhY2Nlc3MgdG8gcGFzc3dvcmQgZGF0YWJhc2UuCisKK2NvbmZpZyBMT0dJTl9TQ1JJUFRTCisJYm9vbCAiU3VwcG9ydCBmb3IgbG9naW4gc2NyaXB0cyIKKwlkZXBlbmRzIG9uIExPR0lOCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgbG9naW4gdG8gZXhlY3V0ZSAkTE9HSU5fUFJFX1NVSURfU0NSSVBUCisJICBqdXN0IHByaW9yIHRvIHN3aXRjaGluZyBmcm9tIHJvb3QgdG8gbG9nZ2VkLWluIHVzZXIuCisKK2NvbmZpZyBGRUFUVVJFX05PTE9HSU4KKwlib29sICJTdXBwb3J0IGZvciAvZXRjL25vbG9naW4iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMT0dJTgorCWhlbHAKKwkgIFRoZSBmaWxlIC9ldGMvbm9sb2dpbiBpcyB1c2VkIGJ5IChzb21lIHZlcnNpb25zIG9mKSBsb2dpbigxKS4KKwkgIElmIGl0IGV4aXN0cywgbm9uLXJvb3QgbG9naW5zIGFyZSBwcm9oaWJpdGVkLgorCitjb25maWcgRkVBVFVSRV9TRUNVUkVUVFkKKwlib29sICJTdXBwb3J0IGZvciAvZXRjL3NlY3VyZXR0eSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPR0lOCisJaGVscAorCSAgVGhlIGZpbGUgL2V0Yy9zZWN1cmV0dHkgaXMgdXNlZCBieSAoc29tZSB2ZXJzaW9ucyBvZikgbG9naW4oMSkuCisJICBUaGUgZmlsZSBjb250YWlucyB0aGUgZGV2aWNlIG5hbWVzIG9mIHR0eSBsaW5lcyAob25lIHBlciBsaW5lLAorCSAgd2l0aG91dCBsZWFkaW5nIC9kZXYvKSBvbiB3aGljaCByb290IGlzIGFsbG93ZWQgdG8gbG9naW4uCisKK2NvbmZpZyBQQVNTV0QKKwlib29sICJwYXNzd2QiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgcGFzc3dkIGNoYW5nZXMgcGFzc3dvcmRzIGZvciB1c2VyIGFuZCBncm91cCBhY2NvdW50cy4gQSBub3JtYWwgdXNlcgorCSAgbWF5IG9ubHkgY2hhbmdlIHRoZSBwYXNzd29yZCBmb3IgaGlzL2hlciBvd24gYWNjb3VudCwgdGhlIHN1cGVyIHVzZXIKKwkgIG1heSBjaGFuZ2UgdGhlIHBhc3N3b3JkIGZvciBhbnkgYWNjb3VudC4gVGhlIGFkbWluaXN0cmF0b3Igb2YgYSBncm91cAorCSAgbWF5IGNoYW5nZSB0aGUgcGFzc3dvcmQgZm9yIHRoZSBncm91cC4KKworCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitjb25maWcgRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSworCWJvb2wgIkNoZWNrIG5ldyBwYXNzd29yZHMgZm9yIHdlYWtuZXNzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUEFTU1dECisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBwYXNzd2Qgd2lsbCByZWZ1c2UgbmV3IHBhc3N3b3JkcyB3aGljaCBhcmUgIndlYWsiLgorCitjb25maWcgQ1JZUFRQVworCWJvb2wgImNyeXB0cHciCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5jcnlwdHMgdGhlIGdpdmVuIHBhc3N3b3JkIHdpdGggdGhlIGNyeXB0KDMpIGxpYmMgZnVuY3Rpb24KKwkgIHVzaW5nIHRoZSBnaXZlbiBzYWx0LiBEZWJpYW4gaGFzIHRoaXMgdXRpbGl0eSB1bmRlciBta3Bhc3N3ZAorCSAgbmFtZS4gQnVzeWJveCBwcm92aWRlcyBta3Bhc3N3ZCBhcyBhbiBhbGlhcyBmb3IgY3J5cHRwdy4KKworY29uZmlnIENIUEFTU1dECisJYm9vbCAiY2hwYXNzd2QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmVhZHMgYSBmaWxlIG9mIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgcGFpcnMgZnJvbSBzdGFuZGFyZCBpbnB1dAorCSAgYW5kIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byB1cGRhdGUgYSBncm91cCBvZiBleGlzdGluZyB1c2Vycy4KKworY29uZmlnIFNVCisJYm9vbCAic3UiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgc3UgaXMgdXNlZCB0byBiZWNvbWUgYW5vdGhlciB1c2VyIGR1cmluZyBhIGxvZ2luIHNlc3Npb24uCisJICBJbnZva2VkIHdpdGhvdXQgYSB1c2VybmFtZSwgc3UgZGVmYXVsdHMgdG8gYmVjb21pbmcgdGhlIHN1cGVyIHVzZXIuCisKKwkgIE5vdGUgdGhhdCBCdXN5Ym94IGJpbmFyeSBtdXN0IGJlIHNldHVpZCByb290IGZvciB0aGlzIGFwcGxldCB0bworCSAgd29yayBwcm9wZXJseS4KKworY29uZmlnIEZFQVRVUkVfU1VfU1lTTE9HCisJYm9vbCAiRW5hYmxlIHN1IHRvIHdyaXRlIHRvIHN5c2xvZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNVCisKK2NvbmZpZyBGRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMKKwlib29sICJFbmFibGUgc3UgdG8gY2hlY2sgdXNlcidzIHNoZWxsIHRvIGJlIGxpc3RlZCBpbiAvZXRjL3NoZWxscyIKKwlkZXBlbmRzIG9uIFNVCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTVUxPR0lOCisJYm9vbCAic3Vsb2dpbiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBzdWxvZ2luIGlzIGludm9rZWQgd2hlbiB0aGUgc3lzdGVtIGdvZXMgaW50byBzaW5nbGUgdXNlcgorCSAgbW9kZSAodGhpcyBpcyBkb25lIHRocm91Z2ggYW4gZW50cnkgaW4gaW5pdHRhYikuCisKK2NvbmZpZyBWTE9DSworCWJvb2wgInZsb2NrIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1aWxkIHRoZSAidmxvY2siIGFwcGxldCB3aGljaCBhbGxvd3MgeW91IHRvIGxvY2sgKHZpcnR1YWwpIHRlcm1pbmFscy4KKworCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL0tidWlsZC5zcmMgYi9sb2dpbnV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0MTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDIxIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19BRERHUk9VUCkJKz0gYWRkZ3JvdXAubworbGliLSQoQ09ORklHX0FERFVTRVIpCSs9IGFkZHVzZXIubworbGliLSQoQ09ORklHX0NSWVBUUFcpCSs9IGNyeXB0cHcubworbGliLSQoQ09ORklHX0NIUEFTU1dEKQkrPSBjaHBhc3N3ZC5vCitsaWItJChDT05GSUdfR0VUVFkpCSs9IGdldHR5Lm8KK2xpYi0kKENPTkZJR19MT0dJTikJKz0gbG9naW4ubworbGliLSQoQ09ORklHX1BBU1NXRCkJKz0gcGFzc3dkLm8KK2xpYi0kKENPTkZJR19TVSkJKz0gc3UubworbGliLSQoQ09ORklHX1NVTE9HSU4pCSs9IHN1bG9naW4ubworbGliLSQoQ09ORklHX1ZMT0NLKQkrPSB2bG9jay5vCitsaWItJChDT05GSUdfREVMVVNFUikJKz0gZGVsdXNlci5vCitsaWItJChDT05GSUdfREVMR1JPVVApCSs9IGRlbHVzZXIubwpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9hZGQtcmVtb3ZlLXNoZWxsLmMgYi9sb2dpbnV0aWxzL2FkZC1yZW1vdmUtc2hlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE0NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9hZGQtcmVtb3ZlLXNoZWxsLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBhZGQtc2hlbGwgYW5kIHJlbW92ZS1zaGVsbCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFNoaXNoa2luIDx2aXJ0dW9zb0BzbGluZC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoaXMgc291cmNlIHRyZWUKKyAqIGZvciBkZXRhaWxzLgorICovCisKKy8vYXBwbGV0OklGX0FERF9TSEVMTCggICBBUFBMRVRfT0RETkFNRShhZGQtc2hlbGwgICAsIGFkZF9yZW1vdmVfc2hlbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGFkZF9zaGVsbCAgICkpCisvL2FwcGxldDpJRl9SRU1PVkVfU0hFTEwoQVBQTEVUX09ERE5BTUUocmVtb3ZlLXNoZWxsLCBhZGRfcmVtb3ZlX3NoZWxsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCByZW1vdmVfc2hlbGwpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQUREX1NIRUxMKSAgICArPSBhZGQtcmVtb3ZlLXNoZWxsLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19SRU1PVkVfU0hFTEwpICs9IGFkZC1yZW1vdmUtc2hlbGwubworCisvL2NvbmZpZzpjb25maWcgQUREX1NIRUxMCisvL2NvbmZpZzogICAgICAgYm9vbCAiYWRkLXNoZWxsIgorLy9jb25maWc6ICAgICAgIGRlZmF1bHQgeSBpZiBERVNLVE9QCisvL2NvbmZpZzogICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICAgQWRkIHNoZWxscyB0byAvZXRjL3NoZWxscy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFJFTU9WRV9TSEVMTAorLy9jb25maWc6ICAgICAgIGJvb2wgInJlbW92ZS1zaGVsbCIKKy8vY29uZmlnOiAgICAgICBkZWZhdWx0IHkgaWYgREVTS1RPUAorLy9jb25maWc6ICAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgIFJlbW92ZSBzaGVsbHMgZnJvbSAvZXRjL3NoZWxscy4KKworLy91c2FnZTojZGVmaW5lIGFkZF9zaGVsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0hFTEwuLi4iCisvL3VzYWdlOiNkZWZpbmUgYWRkX3NoZWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRkIFNIRUxMcyB0byAvZXRjL3NoZWxscyIKKworLy91c2FnZTojZGVmaW5lIHJlbW92ZV9zaGVsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0hFTEwuLi4iCisvL3VzYWdlOiNkZWZpbmUgcmVtb3ZlX3NoZWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlIFNIRUxMcyBmcm9tIC9ldGMvc2hlbGxzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBTSEVMTFNfRklMRSAiL2V0Yy9zaGVsbHMiCisKKyNkZWZpbmUgUkVNT1ZFX1NIRUxMIChFTkFCTEVfUkVNT1ZFX1NIRUxMICYmICghRU5BQkxFX0FERF9TSEVMTCB8fCBhcHBsZXRfbmFtZVswXSA9PSAncicpKQorI2RlZmluZSBBRERfU0hFTEwgICAgKEVOQUJMRV9BRERfU0hFTEwgJiYgKCFFTkFCTEVfUkVNT1ZFX1NIRUxMIHx8IGFwcGxldF9uYW1lWzBdID09ICdhJykpCisKKy8qIE5COiB3ZSB1c2UgdGhlIF9hZGRyZXNzXywgbm90IHRoZSB2YWx1ZSwgb2YgdGhpcyBzdHJpbmcKKyAqIGFzIGEgInNwZWNpYWwgdmFsdWUgb2YgcG9pbnRlciIgaW4gdGhlIGNvZGUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvbnRfYWRkW10gQUxJR04xID0gIlxuIjsKKworaW50IGFkZF9yZW1vdmVfc2hlbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFkZF9yZW1vdmVfc2hlbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKm9yaWdfZnA7CisJY2hhciAqb3JpZ19mbjsKKwljaGFyICpuZXdfZm47CisKKwlhcmd2Kys7CisKKwlvcmlnX2ZuID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoU0hFTExTX0ZJTEUpOworCWlmICghb3JpZ19mbikKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwlvcmlnX2ZwID0gZm9wZW5fZm9yX3JlYWQob3JpZ19mbik7CisKKwluZXdfZm4gPSB4YXNwcmludGYoIiVzLnRtcCIsIG9yaWdfZm4pOworCS8qCisJICogT19UUlVOQyBvciBPX0VYQ0w/IEF0IHRoZSBmaXJzdCBnbGFuY2UsIE9fRVhDTCBsb29rcyBiZXR0ZXIsCisJICogc2luY2UgaXQgcHJldmVudHMgcmFjZXMuIEJ1dDogKDEpIGl0IHJlcXVpcmVzIGEgcmV0cnkgbG9vcCwKKwkgKiAoMikgaWYgL2V0Yy9zaGVsbHMudG1wIGlzICpzdGFsZSosIHRoZW4gcmV0cnkgbG9vcAorCSAqIHdpdGggT19FWENMIHdpbGwgbmV2ZXIgc3VjY2VlZCAtIGl0IHNob3VsZCBoYXZlIGEgdGltZW91dCwKKwkgKiBhZnRlciB3aGljaCBpdCBzaG91bGQgcmV2ZXJ0IHRvIE9fVFJVTkMuCisJICogRm9yIG5vdywgSSBzZXR0bGUgZm9yIE9fVFJVTkMgaW5zdGVhZC4KKwkgKi8KKwl4bW92ZV9mZCh4b3BlbihuZXdfZm4sIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKworCS8qIFRPRE86CisJc3RydWN0IHN0YXQgc2I7CisJeGZzdGF0KGZpbGVubyhvcmlnX2ZwKSwgJnNiKTsKKwl4ZmNob3duKFNURE9VVF9GSUxFTk8sIHNiLnN0X3VpZCwgc2Iuc3RfZ2lkKTsKKwl4ZmNobW9kKFNURE9VVF9GSUxFTk8sIHNiLnN0X21vZGUpOworCSovCisKKwlpZiAob3JpZ19mcCkgeworCQkvKiBDb3B5IG9sZCBmaWxlLCBwb3NzaWJseSBza2lwcGluZyByZW1vdmVkIHNoZWxsIG5hbWVzICovCisJCWNoYXIgKmxpbmU7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUob3JpZ19mcCkpICE9IE5VTEwpIHsKKwkJCWNoYXIgKipjcHAgPSBhcmd2OworCQkJd2hpbGUgKCpjcHApIHsKKwkJCQlpZiAoc3RyY21wKCpjcHAsIGxpbmUpID09IDApIHsKKwkJCQkJLyogT2xkIGZpbGUgaGFzIHRoaXMgc2hlbGwgbmFtZSAqLworCQkJCQlpZiAoUkVNT1ZFX1NIRUxMKSB7CisJCQkJCQkvKiB3ZSBhcmUgcmVtb3ZlLXNoZWxsICovCisJCQkJCQkvKiBkZWxldGUgdGhpcyBuYW1lIGJ5IG5vdCBjb3B5aW5nIGl0ICovCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQkJfQorCQkJCQkvKiB3ZSBhcmUgYWRkLXNoZWxsICovCisJCQkJCS8qIG1hcmsgdGhpcyBuYW1lIGFzICJkbyBub3QgYWRkIiAqLworCQkJCQkqY3BwID0gKGNoYXIqKWRvbnRfYWRkOworCQkJCX0KKwkJCQljcHArKzsKKwkJCX0KKwkJCS8qIGNvcHkgc2hlbGwgbmFtZSBmcm9tIG9sZCB0byBuZXcgZmlsZSAqLworCQkJcHJpbnRmKCIlc1xuIiwgbGluZSk7CisgbmV4dF9saW5lOgorCQkJZnJlZShsaW5lKTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmY2xvc2Uob3JpZ19mcCk7CisJfQorCisJaWYgKEFERF9TSEVMTCkgeworCQljaGFyICoqY3BwID0gYXJndjsKKwkJd2hpbGUgKCpjcHApIHsKKwkJCWlmICgqY3BwICE9IGRvbnRfYWRkKQorCQkJCXByaW50ZigiJXNcbiIsICpjcHApOworCQkJY3BwKys7CisJCX0KKwl9CisKKwkvKiBFbnN1cmUgd2Ugd3JvdGUgb3V0IGV2ZXJ5dGhpbmcgKi8KKwlpZiAoZmNsb3NlKHN0ZG91dCkgIT0gMCkgeworCQl4dW5saW5rKG5ld19mbik7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXM6IHdyaXRlIGVycm9yIiwgbmV3X2ZuKTsKKwl9CisKKwkvKiBTbWFsbCBob2xlOiBpZiByZW5hbWUgZmFpbHMsIC9ldGMvc2hlbGxzLnRtcCBpcyBub3QgcmVtb3ZlZCAqLworCXhyZW5hbWUobmV3X2ZuLCBvcmlnX2ZuKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKG9yaWdfZm4pOworCQlmcmVlKG5ld19mbik7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvYWRkZ3JvdXAuYyBiL2xvZ2ludXRpbHMvYWRkZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzcyNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9hZGRncm91cC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhZGRncm91cCAtIGFkZCBncm91cHMgdG8gL2V0Yy9ncm91cCBhbmQgL2V0Yy9nc2hhZG93CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IExpbmVvLCBpbmMuIGFuZCBKb2huIEJlcHB1CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IEpvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKi8KKworLy91c2FnZTojZGVmaW5lIGFkZGdyb3VwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWcgR0lEXSAiIElGX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCgiW1VTRVJdICIpICJHUk9VUCIKKy8vdXNhZ2U6I2RlZmluZSBhZGRncm91cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkFkZCBhIGdyb3VwICIgSUZfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQKCJvciBhZGQgYSB1c2VyIHRvIGEgZ3JvdXAiKSAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1nIEdJRAlHcm91cCBpZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJQ3JlYXRlIGEgc3lzdGVtIGdyb3VwIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIENPTkZJR19MQVNUX1NZU1RFTV9JRCA8IENPTkZJR19GSVJTVF9TWVNURU1fSUQKKyNlcnJvciBCYWQgTEFTVF9TWVNURU1fSUQgb3IgRklSU1RfU1lTVEVNX0lEIGluIC5jb25maWcKKyNlbmRpZgorCisjZGVmaW5lIE9QVF9HSUQgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIE9QVF9TWVNURU1fQUNDT1VOVCAgICAgICAgICAgICgxIDw8IDEpCisKKy8qIFdlIGFzc3VtZSBHSURfVF9NQVggPT0gSU5UX01BWCAqLworc3RhdGljIHZvaWQgeGdyb3VwX3N0dWR5KHN0cnVjdCBncm91cCAqZykKK3sKKwl1bnNpZ25lZCBtYXggPSBJTlRfTUFYOworCisJLyogTWFrZSBzdXJlIGdyX25hbWUgaXMgdW51c2VkICovCisJaWYgKGdldGdybmFtKGctPmdyX25hbWUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJncm91cCIsIGctPmdyX25hbWUpOworCQkvKiB0aGVzZSBmb3JtYXQgc3RyaW5ncyBhcmUgcmV1c2VkIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwICovCisJfQorCisJLyogaWYgYSBzcGVjaWZpYyBnaWQgaXMgcmVxdWVzdGVkLCB0aGUgLS1zeXN0ZW0gc3dpdGNoIGFuZCAqLworCS8qIG1pbiBhbmQgbWF4IHZhbHVlcyBhcmUgb3ZlcnJpZGRlbiwgYW5kIHRoZSByYW5nZSBvZiB2YWxpZCAqLworCS8qIGdpZCB2YWx1ZXMgaXMgc2V0IHRvIFswLCBJTlRfTUFYXSAqLworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfR0lEKSkgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TWVNURU1fQUNDT1VOVCkgeworCQkJZy0+Z3JfZ2lkID0gQ09ORklHX0ZJUlNUX1NZU1RFTV9JRDsKKwkJCW1heCA9IENPTkZJR19MQVNUX1NZU1RFTV9JRDsKKwkJfSBlbHNlIHsKKwkJCWctPmdyX2dpZCA9IENPTkZJR19MQVNUX1NZU1RFTV9JRCArIDE7CisJCQltYXggPSA2NDk5OTsKKwkJfQorCX0KKwkvKiBDaGVjayBpZiB0aGUgZGVzaXJlZCBnaWQgaXMgZnJlZQorCSAqIG9yIGZpbmQgdGhlIGZpcnN0IGZyZWUgb25lICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFnZXRncmdpZChnLT5ncl9naWQpKSB7CisJCQlyZXR1cm47IC8qIGZvdW5kIGZyZWUgZ3JvdXA6IHJldHVybiAqLworCQl9CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0dJRCkgeworCQkJLyogLWcgTiwgY2Fubm90IHBpY2sgZ2lkIG90aGVyIHRoYW4gTjogZXJyb3IgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJnaWQiLCBpdG9hKGctPmdyX2dpZCkpOworCQkJLyogdGhpcyBmb3JtYXQgc3RyaW5ncyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlpZiAoZy0+Z3JfZ2lkID09IG1heCkgeworCQkJLyogb3ZlcmZsb3dlZDogZXJyb3IgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyAlY2lkcyBsZWZ0IiwgJ2cnKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlnLT5ncl9naWQrKzsKKwl9Cit9CisKKy8qIGFwcGVuZCBhIG5ldyB1c2VyIHRvIHRoZSBwYXNzd2QgZmlsZSAqLworc3RhdGljIHZvaWQgbmV3X2dyb3VwKGNoYXIgKmdyb3VwLCBnaWRfdCBnaWQpCit7CisJc3RydWN0IGdyb3VwIGdyOworCWNoYXIgKnA7CisKKwkvKiBtYWtlIHN1cmUgZ2lkIGFuZCBncm91cCBoYXZlbid0IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgKi8KKwlnci5ncl9naWQgPSBnaWQ7CisJZ3IuZ3JfbmFtZSA9IGdyb3VwOworCXhncm91cF9zdHVkeSgmZ3IpOworCisJLyogYWRkIGVudHJ5IHRvIGdyb3VwICovCisJcCA9IHhhc3ByaW50ZigieDoldToiLCAodW5zaWduZWQpIGdyLmdyX2dpZCk7CisJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9ncm91cF9maWxlLCBncm91cCwgcCwgTlVMTCkgPCAwKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKHApOworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiAvZXRjL2dzaGFkb3cgZmllbGRzOgorCSAqIDEuIEdyb3VwIG5hbWUuCisJICogMi4gRW5jcnlwdGVkIHBhc3N3b3JkLgorCSAqICAgIElmIHNldCwgbm9uLW1lbWJlcnMgb2YgdGhlIGdyb3VwIGNhbiBqb2luIHRoZSBncm91cAorCSAqICAgIGJ5IHR5cGluZyB0aGUgcGFzc3dvcmQgZm9yIHRoYXQgZ3JvdXAgdXNpbmcgdGhlIG5ld2dycCBjb21tYW5kLgorCSAqICAgIElmIHRoZSB2YWx1ZSBpcyBvZiB0aGlzIGZpZWxkICEgdGhlbiBubyB1c2VyIGlzIGFsbG93ZWQKKwkgKiAgICB0byBhY2Nlc3MgdGhlIGdyb3VwIHVzaW5nIHRoZSBuZXdncnAgY29tbWFuZC4gQSB2YWx1ZSBvZiAhIQorCSAqICAgIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSB2YWx1ZSBvZiAhIG9ubHkgaXQgaW5kaWNhdGVzCisJICogICAgdGhhdCBhIHBhc3N3b3JkIGhhcyBuZXZlciBiZWVuIHNldCBiZWZvcmUuIElmIHRoZSB2YWx1ZSBpcyBudWxsLAorCSAqICAgIG9ubHkgZ3JvdXAgbWVtYmVycyBjYW4gbG9nIGludG8gdGhlIGdyb3VwLgorCSAqIDMuIEdyb3VwIGFkbWluaXN0cmF0b3JzIChjb21tYSBkZWxpbWl0ZWQgbGlzdCkuCisJICogICAgR3JvdXAgbWVtYmVycyBsaXN0ZWQgaGVyZSBjYW4gYWRkIG9yIHJlbW92ZSBncm91cCBtZW1iZXJzCisJICogICAgdXNpbmcgdGhlIGdwYXNzd2QgY29tbWFuZC4KKwkgKiA0LiBHcm91cCBtZW1iZXJzIChjb21tYSBkZWxpbWl0ZWQgbGlzdCkuCisJICovCisJLyogSWdub3JlIGVycm9yczogaWYgZmlsZSBpcyBtaXNzaW5nIHdlIGFzc3VtZSBhZG1pbiBkb2Vzbid0IHdhbnQgaXQgKi8KKwl1cGRhdGVfcGFzc3dkKGJiX3BhdGhfZ3NoYWRvd19maWxlLCBncm91cCwgIiE6OiIsIE5VTEwpOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGFkZGdyb3VwX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImdpZFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImciCisJCSJzeXN0ZW1cMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJTIgorCQk7CisjZW5kaWYKKworLyoKKyAqIGFkZGdyb3VwIHdpbGwgdGFrZSBhIGxvZ2luX25hbWUgYXMgaXRzIGZpcnN0IHBhcmFtZXRlci4KKyAqCisgKiBnaWQgY2FuIGJlIGN1c3RvbWl6ZWQgdmlhIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLgorICogSWYgY2FsbGVkIHdpdGggdHdvIG5vbi1vcHRpb24gYXJndW1lbnRzLCBhZGRncm91cAorICogd2lsbCBhZGQgYW4gZXhpc3RpbmcgdXNlciB0byBhbiBleGlzdGluZyBncm91cC4KKyAqLworaW50IGFkZGdyb3VwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhZGRncm91cF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBnaWQgPSAwOworCisJLyogbmVlZCB0byBiZSByb290ICovCisJaWYgKGdldGV1aWQoKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcGVybV9kZW5pZWRfYXJlX3lvdV9yb290KTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGFkZGdyb3VwX2xvbmdvcHRzOworI2VuZGlmCisJLyogU3ludGF4OgorCSAqICBhZGRncm91cCBncm91cAorCSAqICBhZGRncm91cCAtZyBudW0gZ3JvdXAKKwkgKiAgYWRkZ3JvdXAgdXNlciBncm91cAorCSAqIENoZWNrIGZvciBtaW4sIG1heCBhbmQgbWlzc2luZyBhcmdzICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6PzI6ZysiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZzpTIiwgJmdpZCk7CisJLyogbW92ZSBwYXN0IHRoZSBjb21tYW5kbGluZSBvcHRpb25zICovCisJYXJndiArPSBvcHRpbmQ7CisJLy9hcmdjIC09IG9wdGluZDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAKKwlpZiAoYXJndlsxXSkgeworCQlzdHJ1Y3QgZ3JvdXAgKmdyOworCisJCWlmIChvcHRzICYgT1BUX0dJRCkgeworCQkJLyogLWcgd2FzIHRoZXJlLCBidXQgImFkZGdyb3VwIC1nIG51bSB1c2VyIGdyb3VwIgorCQkJICogaXMgYSBuby1ubyAqLworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisKKwkJLyogY2hlY2sgaWYgZ3JvdXAgYW5kIHVzZXIgZXhpc3QgKi8KKwkJeHVuYW1lMnVpZChhcmd2WzBdKTsgLyogdW5rbm93biB1c2VyOiBleGl0ICovCisJCWdyID0geGdldGdybmFtKGFyZ3ZbMV0pOyAvKiB1bmtub3duIGdyb3VwOiBleGl0ICovCisJCS8qIGNoZWNrIGlmIHVzZXIgaXMgYWxyZWFkeSBpbiB0aGlzIGdyb3VwICovCisJCWZvciAoOyAqKGdyLT5ncl9tZW0pICE9IE5VTEw7IChnci0+Z3JfbWVtKSsrKSB7CisJCQlpZiAoIXN0cmNtcChhcmd2WzBdLCAqKGdyLT5ncl9tZW0pKSkgeworCQkJCS8qIHVzZXIgaXMgYWxyZWFkeSBpbiBncm91cDogZG8gbm90aGluZyAqLworCQkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9ncm91cF9maWxlLCBhcmd2WzFdLCBOVUxMLCBhcmd2WzBdKSA8IDApIHsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCQl1cGRhdGVfcGFzc3dkKGJiX3BhdGhfZ3NoYWRvd19maWxlLCBhcmd2WzFdLCBOVUxMLCBhcmd2WzBdKTsKKyMgZW5kaWYKKwl9IGVsc2UKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQICovCisJeworCQlkaWVfaWZfYmFkX3VzZXJuYW1lKGFyZ3ZbMF0pOworCQluZXdfZ3JvdXAoYXJndlswXSwgZ2lkKTsKKwl9CisJLyogUmVhY2hlZCBvbmx5IG9uIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9hZGR1c2VyLmMgYi9sb2dpbnV0aWxzL2FkZHVzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDA4MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9hZGR1c2VyLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFkZHVzZXIgLSBhZGQgdXNlcnMgdG8gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvc2hhZG93CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IExpbmVvLCBpbmMuIGFuZCBKb2huIEJlcHB1CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IEpvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhZGR1c2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gVVNFUiIKKy8vdXNhZ2U6I2RlZmluZSBhZGR1c2VyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRkIGEgdXNlclxuIgorLy91c2FnZTogICAgICJcbgktaCBESVIJCUhvbWUgZGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbgktZyBHRUNPUwlHRUNPUyBmaWVsZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0hFTEwJTG9naW4gc2hlbGwiCisvL3VzYWdlOiAgICAgIlxuCS1HIEdSUAkJQWRkIHVzZXIgdG8gZXhpc3RpbmcgZ3JvdXAiCisvL3VzYWdlOiAgICAgIlxuCS1TCQlDcmVhdGUgYSBzeXN0ZW0gdXNlciIKKy8vdXNhZ2U6ICAgICAiXG4JLUQJCURvbid0IGFzc2lnbiBhIHBhc3N3b3JkIgorLy91c2FnZTogICAgICJcbgktSAkJRG9uJ3QgY3JlYXRlIGhvbWUgZGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbgktdSBVSUQJCVVzZXIgaWQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgQ09ORklHX0xBU1RfU1lTVEVNX0lEIDwgQ09ORklHX0ZJUlNUX1NZU1RFTV9JRAorI2Vycm9yIEJhZCBMQVNUX1NZU1RFTV9JRCBvciBGSVJTVF9TWVNURU1fSUQgaW4gLmNvbmZpZworI2VuZGlmCisKKy8qICNkZWZpbmUgT1BUX0hPTUUgICAgICAgICAgICgxIDw8IDApICovIC8qIHVudXNlZCAqLworLyogI2RlZmluZSBPUFRfR0VDT1MgICAgICAgICAgKDEgPDwgMSkgKi8gLyogdW51c2VkICovCisjZGVmaW5lIE9QVF9TSEVMTCAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBPUFRfR0lEICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX0RPTlRfU0VUX1BBU1MgICgxIDw8IDQpCisjZGVmaW5lIE9QVF9TWVNURU1fQUNDT1VOVCAoMSA8PCA1KQorI2RlZmluZSBPUFRfRE9OVF9NQUtFX0hPTUUgKDEgPDwgNikKKyNkZWZpbmUgT1BUX1VJRCAgICAgICAgICAgICgxIDw8IDcpCisKKy8qIFdlIGFzc3VtZSBVSURfVF9NQVggPT0gSU5UX01BWCAqLworLyogcmVtaXggKi8KKy8qIHJlY29kZWQgc3VjaCB0aGF0IHRoZSB1aWQgbWF5IGJlIHBhc3NlZCBpbiAqcCAqLworc3RhdGljIHZvaWQgcGFzc3dkX3N0dWR5KHN0cnVjdCBwYXNzd2QgKnApCit7CisJaW50IG1heCA9IFVJTlRfTUFYOworCisJaWYgKGdldHB3bmFtKHAtPnB3X25hbWUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJ1c2VyIiwgcC0+cHdfbmFtZSk7CisJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwl9CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1VJRCkpIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU1lTVEVNX0FDQ09VTlQpIHsKKwkJCXAtPnB3X3VpZCA9IENPTkZJR19GSVJTVF9TWVNURU1fSUQ7CisJCQltYXggPSBDT05GSUdfTEFTVF9TWVNURU1fSUQ7CisJCX0gZWxzZSB7CisJCQlwLT5wd191aWQgPSBDT05GSUdfTEFTVF9TWVNURU1fSUQgKyAxOworCQkJbWF4ID0gNjQ5OTk7CisJCX0KKwl9CisJLyogY2hlY2sgZm9yIGEgZnJlZSB1aWQgKGFuZCBtYXliZSBnaWQpICovCisJd2hpbGUgKGdldHB3dWlkKHAtPnB3X3VpZCkgfHwgKHAtPnB3X2dpZCA9PSAoZ2lkX3QpLTEgJiYgZ2V0Z3JnaWQocC0+cHdfdWlkKSkpIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVUlEKSB7CisJCQkvKiAtdSBOLCBjYW5ub3QgcGljayB1aWQgb3RoZXIgdGhhbiBOOiBlcnJvciAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzICclcycgaW4gdXNlIiwgInVpZCIsIGl0b2EocC0+cHdfdWlkKSk7CisJCQkvKiB0aGlzIGZvcm1hdCBzdHJpbmcgaXMgcmV1c2VkIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwICovCisJCX0KKwkJaWYgKHAtPnB3X3VpZCA9PSBtYXgpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyAlY2lkcyBsZWZ0IiwgJ3UnKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlwLT5wd191aWQrKzsKKwl9CisKKwlpZiAocC0+cHdfZ2lkID09IChnaWRfdCktMSkgeworCQlwLT5wd19naWQgPSBwLT5wd191aWQ7IC8qIG5ldyBnaWQgPSB1aWQgKi8KKwkJaWYgKGdldGdybmFtKHAtPnB3X25hbWUpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgJyVzJyBpbiB1c2UiLCAiZ3JvdXAiLCBwLT5wd19uYW1lKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWRkZ3JvdXBfd3JhcHBlcihzdHJ1Y3QgcGFzc3dkICpwLCBjb25zdCBjaGFyICpncm91cF9uYW1lKQoreworCWNoYXIgKmFyZ3ZbNl07CisKKwlhcmd2WzBdID0gKGNoYXIqKSJhZGRncm91cCI7CisJaWYgKGdyb3VwX25hbWUpIHsKKwkJLyogQWRkIHVzZXIgdG8gZXhpc3RpbmcgZ3JvdXAgKi8KKwkJYXJndlsxXSA9IChjaGFyKikiLS0iOworCQlhcmd2WzJdID0gcC0+cHdfbmFtZTsKKwkJYXJndlszXSA9IChjaGFyKilncm91cF9uYW1lOworCQlhcmd2WzRdID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBBZGQgdXNlciB0byBoaXMgb3duIGdyb3VwIHdpdGggdGhlIGZpcnN0IGZyZWUgZ2lkCisJCSAqIGZvdW5kIGluIHBhc3N3ZF9zdHVkeS4KKwkJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TIHx8ICFFTkFCTEVfQURER1JPVVAKKwkJLyogV2UgdHJ5IHRvIHVzZSAtLWdpZCwgbm90IC1nLCBiZWNhdXNlICJzdGFuZGFyZCIgYWRkZ3JvdXAKKwkJICogaGFzIG5vIHNob3J0IG9wdGlvbiAtZywgaXQgaGFzIG9ubHkgbG9uZyAtLWdpZC4KKwkJICovCisJCWFyZ3ZbMV0gPSAoY2hhciopIi0tZ2lkIjsKKyNlbHNlCisJCS8qIEJyZWFrcyBpZiBzeXN0ZW0gaW4gZmFjdCBkb2VzIE5PVCB1c2UgYnVzeWJveCBhZGRncm91cCAqLworCQlhcmd2WzFdID0gKGNoYXIqKSItZyI7CisjZW5kaWYKKwkJYXJndlsyXSA9IHV0b2EocC0+cHdfZ2lkKTsKKwkJYXJndlszXSA9IChjaGFyKikiLS0iOworCQlhcmd2WzRdID0gcC0+cHdfbmFtZTsKKwkJYXJndls1XSA9IE5VTEw7CisJfQorCisJc3Bhd25fYW5kX3dhaXQoYXJndik7Cit9CisKK3N0YXRpYyB2b2lkIHBhc3N3ZF93cmFwcGVyKGNvbnN0IGNoYXIgKmxvZ2luX25hbWUpIE5PUkVUVVJOOworCitzdGF0aWMgdm9pZCBwYXNzd2Rfd3JhcHBlcihjb25zdCBjaGFyICpsb2dpbl9uYW1lKQoreworCUJCX0VYRUNMUCgicGFzc3dkIiwgInBhc3N3ZCIsICItLSIsIGxvZ2luX25hbWUsIE5VTEwpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlIHBhc3N3ZCwgeW91IG11c3Qgc2V0IHBhc3N3b3JkIG1hbnVhbGx5Iik7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgYWRkdXNlcl9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJob21lXDAiICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJoIgorCQkiZ2Vjb3NcMCIgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZyIKKwkJInNoZWxsXDAiICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJCSJpbmdyb3VwXDAiICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJHIgorCQkiZGlzYWJsZWQtcGFzc3dvcmRcMCIgICBOb19hcmd1bWVudCAgICAgICAiRCIKKwkJImVtcHR5LXBhc3N3b3JkXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgIkQiCisJCSJzeXN0ZW1cMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJTIgorCQkibm8tY3JlYXRlLWhvbWVcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiSCIKKwkJInVpZFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInUiCisJCTsKKyNlbmRpZgorCisvKgorICogYWRkdXNlciB3aWxsIHRha2UgYSBsb2dpbl9uYW1lIGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBob21lLCBzaGVsbCwgZ2Vjb3M6CisgKiBjYW4gYmUgY3VzdG9taXplZCB2aWEgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCisgKi8KK2ludCBhZGR1c2VyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhZGR1c2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcGFzc3dkIHB3OworCWNvbnN0IGNoYXIgKnVzZWdyb3VwID0gTlVMTDsKKwljaGFyICpwOworCXVuc2lnbmVkIG9wdHM7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBhZGR1c2VyX2xvbmdvcHRzOworI2VuZGlmCisKKwkvKiBnb3Qgcm9vdD8gKi8KKwlpZiAoZ2V0ZXVpZCgpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCX0KKworCXB3LnB3X2dlY29zID0gKGNoYXIgKikiTGludXggVXNlciwsLCI7CisJLyogV2UgYXNzdW1lIHRoYXQgbmV3bHkgY3JlYXRlZCB1c2VycyAiaW5oZXJpdCIgcm9vdCdzIHNoZWxsIHNldHRpbmcgKi8KKwlwdy5wd19zaGVsbCA9IChjaGFyICopZ2V0X3NoZWxsX25hbWUoKTsKKwlwdy5wd19kaXIgPSBOVUxMOworCisJLyogZXhhY3RseSBvbmUgbm9uLW9wdGlvbiBhcmcgKi8KKwkvKiBkaXNhYmxlIGludGVyYWN0aXZlIHBhc3N3ZCBmb3Igc3lzdGVtIGFjY291bnRzICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6U0Q6dSsiOworCWlmIChzaXplb2YocHcucHdfdWlkKSA9PSBzaXplb2YoaW50KSkgeworCQlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImg6ZzpzOkc6RFNIdToiLCAmcHcucHdfZGlyLCAmcHcucHdfZ2Vjb3MsICZwdy5wd19zaGVsbCwgJnVzZWdyb3VwLCAmcHcucHdfdWlkKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCB1aWQ7CisJCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiaDpnOnM6RzpEU0h1OiIsICZwdy5wd19kaXIsICZwdy5wd19nZWNvcywgJnB3LnB3X3NoZWxsLCAmdXNlZ3JvdXAsICZ1aWQpOworCQlpZiAob3B0cyAmIE9QVF9VSUQpIHsKKwkJCXB3LnB3X3VpZCA9IHVpZDsKKwkJfQorCX0KKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGZpbGwgaW4gdGhlIHBhc3N3ZCBzdHJ1Y3QgKi8KKwlwdy5wd19uYW1lID0gYXJndlswXTsKKwlkaWVfaWZfYmFkX3VzZXJuYW1lKHB3LnB3X25hbWUpOworCWlmICghcHcucHdfZGlyKSB7CisJCS8qIGNyZWF0ZSBzdHJpbmcgZm9yICRIT01FIGlmIG5vdCBzcGVjaWZpZWQgYWxyZWFkeSAqLworCQlwdy5wd19kaXIgPSB4YXNwcmludGYoIi9ob21lLyVzIiwgYXJndlswXSk7CisJfQorCXB3LnB3X3Bhc3N3ZCA9IChjaGFyICopIngiOworCWlmIChvcHRzICYgT1BUX1NZU1RFTV9BQ0NPVU5UKSB7CisJCWlmICghdXNlZ3JvdXApIHsKKwkJCXVzZWdyb3VwID0gIm5vZ3JvdXAiOworCQl9CisJCWlmICghKG9wdHMgJiBPUFRfU0hFTEwpKSB7CisJCQlwdy5wd19zaGVsbCA9IChjaGFyICopICIvYmluL2ZhbHNlIjsKKwkJfQorCX0KKwlwdy5wd19naWQgPSB1c2Vncm91cCA/IHhncm91cDJnaWQodXNlZ3JvdXApIDogLTE7IC8qIGV4aXRzIG9uIGZhaWx1cmUgKi8KKworCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGtvc2hlciBhbmQgc2V0dXAgdWlkICYmIG1heWJlIGdpZCAqLworCXBhc3N3ZF9zdHVkeSgmcHcpOworCisJcCA9IHhhc3ByaW50ZigieDoldToldTolczolczolcyIsCisJCQkodW5zaWduZWQpIHB3LnB3X3VpZCwgKHVuc2lnbmVkKSBwdy5wd19naWQsCisJCQlwdy5wd19nZWNvcywgcHcucHdfZGlyLCBwdy5wd19zaGVsbCk7CisJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9wYXNzd2RfZmlsZSwgcHcucHdfbmFtZSwgcCwgTlVMTCkgPCAwKSB7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShwKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiAvZXRjL3NoYWRvdyBmaWVsZHM6CisJICogMS4gdXNlcm5hbWUKKwkgKiAyLiBlbmNyeXB0ZWQgcGFzc3dvcmQKKwkgKiAzLiBsYXN0IHBhc3N3b3JkIGNoYW5nZSAodW5peCBkYXRlICh1bml4IHRpbWUvMjQqNjAqNjApKQorCSAqIDQuIG1pbmltdW0gZGF5cyByZXF1aXJlZCBiZXR3ZWVuIHBhc3N3b3JkIGNoYW5nZXMKKwkgKiA1LiBtYXhpbXVtIGRheXMgcGFzc3dvcmQgaXMgdmFsaWQKKwkgKiA2LiBkYXlzIGJlZm9yZSBwYXNzd29yZCBpcyB0byBleHBpcmUgdGhhdCB1c2VyIGlzIHdhcm5lZAorCSAqIDcuIGRheXMgYWZ0ZXIgcGFzc3dvcmQgZXhwaXJlcyB0aGF0IGFjY291bnQgaXMgZGlzYWJsZWQKKwkgKiA4LiB1bml4IGRhdGUgd2hlbiBsb2dpbiBleHBpcmVzIChpLmUuIHdoZW4gaXQgbWF5IG5vIGxvbmdlciBiZSB1c2VkKQorCSAqLworCS8qIGZpZWxkczogICAgIDIgMyAgNCA1ICAgICA2IDc4ICovCisJcCA9IHhhc3ByaW50ZigiIToldTowOjk5OTk5Ojc6OjoiLCAodW5zaWduZWQpKHRpbWUoTlVMTCkpIC8gKDI0KjYwKjYwKSk7CisJLyogaWdub3JlIGVycm9yczogaWYgZmlsZSBpcyBtaXNzaW5nIHdlIHN1cHBvc2UgYWRtaW4gZG9lc24ndCB3YW50IGl0ICovCisJdXBkYXRlX3Bhc3N3ZChiYl9wYXRoX3NoYWRvd19maWxlLCBwdy5wd19uYW1lLCBwLCBOVUxMKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUocCk7CisjZW5kaWYKKworCS8qIGFkZCB0byBncm91cCAqLworCWFkZGdyb3VwX3dyYXBwZXIoJnB3LCB1c2Vncm91cCk7CisKKwkvKiBjbGVhciB0aGUgdW1hc2sgZm9yIHRoaXMgcHJvY2VzcyBzbyBpdCBkb2Vzbid0CisJICogc2NyZXcgdXAgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBta2RpciBhbmQgY2hvd24uICovCisJdW1hc2soMCk7CisJaWYgKCEob3B0cyAmIE9QVF9ET05UX01BS0VfSE9NRSkpIHsKKwkJLyogc2V0IHRoZSBvd25lciBhbmQgZ3JvdXAgc28gaXQgaXMgb3duZWQgYnkgdGhlIG5ldyB1c2VyLAorCQkgKiB0aGVuIGZpeCB1cCB0aGUgcGVybWlzc2lvbnMgdG8gMjc1NS4gQ2FuJ3QgZG8gaXQgYmVmb3JlCisJCSAqIHNpbmNlIGNob3duIHdpbGwgY2xlYXIgdGhlIHNldGdpZCBiaXQgKi8KKwkJaW50IG1rZGlyX2VyciA9IG1rZGlyKHB3LnB3X2RpciwgMDc1NSk7CisJCWlmIChta2Rpcl9lcnIgPT0gMCkgeworCQkJLyogTmV3IGhvbWUuIENvcHkgL2V0Yy9za2VsIHRvIGl0ICovCisJCQljb25zdCBjaGFyICphcmdzW10gPSB7CisJCQkJImNob3duIiwKKwkJCQkiLVIiLAorCQkJCXhhc3ByaW50ZigiJXU6JXUiLCAoaW50KXB3LnB3X3VpZCwgKGludClwdy5wd19naWQpLAorCQkJCXB3LnB3X2RpciwKKwkJCQlOVUxMCisJCQl9OworCQkJLyogQmUgc2lsZW50IG9uIGFueSBlcnJvcnMgKGxpa2U6IG5vIC9ldGMvc2tlbCkgKi8KKwkJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJCQljb3B5X2ZpbGUoIi9ldGMvc2tlbCIsIHB3LnB3X2RpciwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJCWxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworCQkJY2hvd25fbWFpbig0LCAoY2hhcioqKWFyZ3MpOworCQl9CisJCWlmICgobWtkaXJfZXJyICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKQorCQkgfHwgY2hvd24ocHcucHdfZGlyLCBwdy5wd191aWQsIHB3LnB3X2dpZCkgIT0gMAorCQkgfHwgY2htb2QocHcucHdfZGlyLCAwMjc1NSkgIT0gMCAvKiBzZXQgc2V0Z2lkIGJpdCBvbiBob21lZGlyICovCisJCSkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2cocHcucHdfZGlyKTsKKwkJfQorCX0KKworCWlmICghKG9wdHMgJiBPUFRfRE9OVF9TRVRfUEFTUykpIHsKKwkJLyogaW50ZXJhY3RpdmVseSBzZXQgcGFzc3dkICovCisJCXBhc3N3ZF93cmFwcGVyKHB3LnB3X25hbWUpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL2NocGFzc3dkLmMgYi9sb2dpbnV0aWxzL2NocGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkZjU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvY2hwYXNzd2QuYwpAQCAtMCwwICsxLDkzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaHBhc3N3ZC5jCisgKgorICogV3JpdHRlbiBmb3IgU0xJTkQgKGZyb20gcGFzc3dkLmMpIGJ5IEFsZXhhbmRlciBTaGlzaGtpbiA8dmlydHVvc29Ac2xpbmQub3JnPgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vdXNhZ2U6I2RlZmluZSBjaHBhc3N3ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9MT05HX09QVFMoIlstLW1kNXwtLWVuY3J5cHRlZF0iKSBJRl9OT1RfTE9OR19PUFRTKCJbLW18LWVdIikKKy8vdXNhZ2U6I2RlZmluZSBjaHBhc3N3ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlYWQgdXNlcjpwYXNzd29yZCBmcm9tIHN0ZGluIGFuZCB1cGRhdGUgL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWUsLS1lbmNyeXB0ZWQJU3VwcGxpZWQgcGFzc3dvcmRzIGFyZSBpbiBlbmNyeXB0ZWQgZm9ybSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tZDUJVXNlIE1ENSBlbmNyeXB0aW9uIGluc3RlYWQgb2YgREVTIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWUJU3VwcGxpZWQgcGFzc3dvcmRzIGFyZSBpbiBlbmNyeXB0ZWQgZm9ybSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JVXNlIE1ENSBlbmNyeXB0aW9uIGluc3RlYWQgb2YgREVTIgorLy91c2FnZToJKQorCisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIGNvbnN0IGNoYXIgY2hwYXNzd2RfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJlbmNyeXB0ZWRcMCIgTm9fYXJndW1lbnQgImUiCisJIm1kNVwwIiAgICAgICBOb19hcmd1bWVudCAibSIKKwk7CisjZW5kaWYKKworI2RlZmluZSBPUFRfRU5DICAxCisjZGVmaW5lIE9QVF9NRDUgIDIKKworaW50IGNocGFzc3dkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaHBhc3N3ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgb3B0OworCisJaWYgKGdldHVpZCgpICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibS0tZTplLS1tIjsKKwlJRl9MT05HX09QVFMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGNocGFzc3dkX2xvbmdvcHRzOykKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZW0iKTsKKworCXdoaWxlICgobmFtZSA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCWNoYXIgKmZyZWVfbWU7CisJCWNoYXIgKnBhc3M7CisJCWludCByYzsKKworCQlwYXNzID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJCWlmICghcGFzcykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNzaW5nIG5ldyBwYXNzd29yZCIpOworCQkqcGFzcysrID0gJ1wwJzsKKworCQl4dW5hbWUydWlkKG5hbWUpOyAvKiBkaWVzIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdXNlciAqLworCisJCWZyZWVfbWUgPSBOVUxMOworCQlpZiAoIShvcHQgJiBPUFRfRU5DKSkgeworCQkJY2hhciBzYWx0W3NpemVvZigiJE4kWFhYWFhYWFgiKV07CisKKwkJCWNyeXB0X21ha2Vfc2FsdChzYWx0LCAxKTsKKwkJCWlmIChvcHQgJiBPUFRfTUQ1KSB7CisJCQkJc2FsdFswXSA9ICckJzsKKwkJCQlzYWx0WzFdID0gJzEnOworCQkJCXNhbHRbMl0gPSAnJCc7CisJCQkJY3J5cHRfbWFrZV9zYWx0KHNhbHQgKyAzLCA0KTsKKwkJCX0KKwkJCWZyZWVfbWUgPSBwYXNzID0gcHdfZW5jcnlwdChwYXNzLCBzYWx0LCAwKTsKKwkJfQorCisJCS8qIFRoaXMgaXMgcmF0aGVyIGNvbXBsZXg6IGlmIHVzZXIgaXMgbm90IGZvdW5kIGluIC9ldGMvc2hhZG93LAorCQkgKiB3ZSB0cnkgdG8gZmluZCAmIGNoYW5nZSBoaXMgcGFzc3dkIGluIC9ldGMvcGFzc3dkICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCQlyYyA9IHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9zaGFkb3dfZmlsZSwgbmFtZSwgcGFzcywgTlVMTCk7CisJCWlmIChyYyA+IDApIC8qIHBhc3N3b3JkIGluIC9ldGMvc2hhZG93IHdhcyB1cGRhdGVkICovCisJCQlwYXNzID0gKGNoYXIqKSJ4IjsKKwkJaWYgKHJjID49IDApCisJCQkvKiAwID0gL2V0Yy9zaGFkb3cgbWlzc2luZyAobm90IGFuIGVycm9yKSwgPjAgPSBwYXNzd2QgY2hhbmdlZCBpbiAvZXRjL3NoYWRvdyAqLworI2VuZGlmCisJCQlyYyA9IHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9wYXNzd2RfZmlsZSwgbmFtZSwgcGFzcywgTlVMTCk7CisJCS8qIExPR01PREVfQk9USCBsb2dzIHRvIHN5c2xvZyBhbHNvICovCisJCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisJCWlmIChyYyA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gZXJyb3Igb2NjdXJyZWQgdXBkYXRpbmcgcGFzc3dvcmQgZm9yICVzIiwgbmFtZSk7CisJCWlmIChyYykKKwkJCWJiX2luZm9fbXNnKCJQYXNzd29yZCBmb3IgJyVzJyBjaGFuZ2VkIiwgbmFtZSk7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworCQlmcmVlKG5hbWUpOworCQlmcmVlKGZyZWVfbWUpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9jcnlwdHB3LmMgYi9sb2dpbnV0aWxzL2NyeXB0cHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjQ0ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9jcnlwdHB3LmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNyeXB0cHcuYyAtIG91dHB1dCBhIGNyeXB0KDMpZWQgcGFzc3dvcmQgdG8gc3Rkb3V0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ29va2VkIGZyb20gcGFzc3dkLmMgYnkgVGhvbWFzIEx1bmRxdWlzdCA8dGhvbWFzZXpAemVsb3cubm8+CisgKiBta3Bhc3N3ZCBjb21wYXRpYmxlIG9wdGlvbnMgYWRkZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3J5cHRwd190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtQQVNTV09SRF0gW1NBTFRdIgorLyogV2UgZG8gc3VwcG9ydCAtcywgd2UganVzdCBkb24ndCBtZW50aW9uIGl0ICovCisvL3VzYWdlOiNkZWZpbmUgY3J5cHRwd19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyeXB0IFBBU1NXT1JEIHVzaW5nIGNyeXB0KDMpXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcGFzc3dvcmQtZmQ9TglSZWFkIHBhc3N3b3JkIGZyb20gZmQgTiIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMsLS1zdGRpbgkJVXNlIHN0ZGluOyBsaWtlIC1QMCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tZXRob2Q9VFlQRQlFbmNyeXB0aW9uIG1ldGhvZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMsLS1zYWx0PVNBTFQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktUCBOCVJlYWQgcGFzc3dvcmQgZnJvbSBmZCBOIgorLyogLy91c2FnZTogICJcbgktcwlVc2Ugc3RkaW47IGxpa2UgLVAwIiAqLworLy91c2FnZTogICAgICJcbgktbSBUWVBFCUVuY3J5cHRpb24gbWV0aG9kIFRZUEUiCisvL3VzYWdlOiAgICAgIlxuCS1TIFNBTFQiCisvL3VzYWdlOgkpCisKKy8qIG1rcGFzc3dkIGlzIGFuIGFsaWFzIHRvIGNyeXB0cHcgKi8KKy8vdXNhZ2U6I2RlZmluZSBta3Bhc3N3ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtQQVNTV09SRF0gW1NBTFRdIgorLyogV2UgZG8gc3VwcG9ydCAtcywgd2UganVzdCBkb24ndCBtZW50aW9uIGl0ICovCisvL3VzYWdlOiNkZWZpbmUgbWtwYXNzd2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcnlwdCBQQVNTV09SRCB1c2luZyBjcnlwdCgzKVxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktUCwtLXBhc3N3b3JkLWZkPU4JUmVhZCBwYXNzd29yZCBmcm9tIGZkIE4iCisvKiAvL3VzYWdlOiAgIlxuCS1zLC0tc3RkaW4JCVVzZSBzdGRpbjsgbGlrZSAtUDAiICovCisvL3VzYWdlOiAgICAgIlxuCS1tLC0tbWV0aG9kPVRZUEUJRW5jcnlwdGlvbiBtZXRob2QiCisvL3VzYWdlOiAgICAgIlxuCS1TLC0tc2FsdD1TQUxUIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLVAgTglSZWFkIHBhc3N3b3JkIGZyb20gZmQgTiIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMJVXNlIHN0ZGluOyBsaWtlIC1QMCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW0gVFlQRQlFbmNyeXB0aW9uIG1ldGhvZCBUWVBFIgorLy91c2FnZTogICAgICJcbgktUyBTQUxUIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRGViaWFuIGhhcyAnbWtwYXNzd2QnIHV0aWxpdHksIG1hbnBhZ2Ugc2F5czoKKworTkFNRQorICAgIG1rcGFzc3dkIC0gT3ZlcmZlYXR1cmVkIGZyb250IGVuZCB0byBjcnlwdCgzKQorU1lOT1BTSVMKKyAgICBta3Bhc3N3ZCBQQVNTV09SRCBTQUxUCisuLi4KK09QVElPTlMKKy1TLCAtLXNhbHQ9U1RSSU5HCisgICAgVXNlIHRoZSBTVFJJTkcgYXMgc2FsdC4gSXQgbXVzdCBub3QgIGNvbnRhaW4gIHByZWZpeGVzICBzdWNoICBhcworICAgICQxJC4KKy1SLCAtLXJvdW5kcz1OVU1CRVIKKyAgICBVc2UgTlVNQkVSIHJvdW5kcy4gVGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkIGlmIHRoZSBtZXRob2QKKyAgICBjaG9vc2VuIGRvZXMgbm90IHN1cHBvcnQgdmFyaWFibGUgcm91bmRzLiBGb3IgdGhlIE9wZW5CU0QgQmxvd2Zpc2gKKyAgICBtZXRob2QgdGhpcyBpcyB0aGUgbG9nYXJpdGhtIG9mIHRoZSBudW1iZXIgb2Ygcm91bmRzLgorLW0sIC0tbWV0aG9kPVRZUEUKKyAgICBDb21wdXRlIHRoZSBwYXNzd29yZCB1c2luZyB0aGUgVFlQRSBtZXRob2QuIElmIFRZUEUgaXMgJ2hlbHAnCisgICAgdGhlbiB0aGUgYXZhaWxhYmxlIG1ldGhvZHMgYXJlIHByaW50ZWQuCistUCwgLS1wYXNzd29yZC1mZD1OVU0KKyAgICBSZWFkIHRoZSBwYXNzd29yZCBmcm9tIGZpbGUgZGVzY3JpcHRvciBOVU0gaW5zdGVhZCBvZiB1c2luZyBnZXRwYXNzKDMpLgorICAgIElmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGNvbm5lY3RlZCB0byBhIHR0eSB0aGVuCisgICAgbm8gb3RoZXIgbWVzc2FnZSB0aGFuIHRoZSBoYXNoZWQgcGFzc3dvcmQgaXMgcHJpbnRlZCBvbiBzdGRvdXQuCistcywgLS1zdGRpbgorICAgIExpa2UgLS1wYXNzd29yZC1mZD0wLgorRU5WSVJPTk1FTlQKKyAgICAkTUtQQVNTV0RfT1BUSU9OUworICAgIEEgbGlzdCBvZiBvcHRpb25zIHdoaWNoIHdpbGwgYmUgZXZhbHVhdGVkIGJlZm9yZSB0aGUgb25lcworICAgIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorQlVHUworICAgIFRoaXMgcHJvZ3JhbXMgc3VmZmVycyBvZiBhIGJhZCBjYXNlIG9mIGZlYXR1cml0aXMuCisgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVmVyeSB0cnVlLi4uCisKK2NyeXB0cHcgd2FzIGluIGJib3ggYmVmb3JlIHRoaXMgZ2VtLCBzbyB3ZSByZXRhaW4gaXQsIGFuZCBhbGlhcyBta3Bhc3N3ZAordG8gY3J5cHRwdy4gLWEgb3B0aW9uIChhbGlhcyBmb3IgLW0pIGNhbWUgZnJvbSBjcnlwdHB3LgorKi8KKworaW50IGNyeXB0cHdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNyeXB0cHdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgc2FsdFtNQVhfUFdfU0FMVF9MRU5dOworCWNoYXIgKnNhbHRfcHRyOworCWNvbnN0IGNoYXIgKm9wdF9tLCAqb3B0X1M7CisJaW50IGZkOworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIG1rcGFzc3dkX2xvbmdvcHRzW10gQUxJR04xID0KKwkJInN0ZGluXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkicGFzc3dvcmQtZmRcMCIgUmVxdWlyZWRfYXJndW1lbnQgIlAiCisJCSJzYWx0XDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiUyIKKwkJIm1ldGhvZFwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJtIgorCTsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gbWtwYXNzd2RfbG9uZ29wdHM7CisjZW5kaWYKKwlmZCA9IFNURElOX0ZJTEVOTzsKKwlvcHRfbSA9ICJkIjsKKwlvcHRfUyA9IE5VTEw7CisJLyogYXQgbW9zdCB0d28gbm9uLW9wdGlvbiBhcmd1bWVudHM7IC1QIE5VTSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8yOlArIjsKKwlnZXRvcHQzMihhcmd2LCAic1A6UzptOmE6IiwgJmZkLCAmb3B0X1MsICZvcHRfbSwgJm9wdF9tKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGhhdmUgbm8gaWRlYSBob3cgdG8gaGFuZGxlIC1zLi4uICovCisKKwlpZiAoYXJndlswXSAmJiAhb3B0X1MpCisJCW9wdF9TID0gYXJndlsxXTsKKworCXNhbHRfcHRyID0gY3J5cHRfbWFrZV9wd19zYWx0KHNhbHQsIG9wdF9tKTsKKwlpZiAob3B0X1MpCisJCXNhZmVfc3RybmNweShzYWx0X3B0ciwgb3B0X1MsIHNpemVvZihzYWx0KSAtIChzaXplb2YoIiROJCIpLTEpKTsKKworCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCisJcHV0cyhwd19lbmNyeXB0KAorCQlhcmd2WzBdID8gYXJndlswXSA6ICgKKwkJCS8qIE9ubHkgbWtwYXNzd2QsIGFuZCBvbmx5IGZyb20gdHR5LCBwcm9tcHRzLgorCQkJICogT3RoZXJ3aXNlIGl0IGlzIGEgcGxhaW4gcmVhZC4gKi8KKwkJCShpc2F0dHkoU1RESU5fRklMRU5PKSAmJiBhcHBsZXRfbmFtZVswXSA9PSAnbScpCisJCQk/IGJiX2Fza19zdGRpbigiUGFzc3dvcmQ6ICIpCisJCQk6IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pCisJCSksCisJCXNhbHQsIDEpKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL2RlbHVzZXIuYyBiL2xvZ2ludXRpbHMvZGVsdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWFjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL2RlbHVzZXIuYwpAQCAtMCwwICsxLDExNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGVsdXNlci9kZWxncm91cCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkZWx1c2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVU0VSIgorLy91c2FnZTojZGVmaW5lIGRlbHVzZXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWxldGUgVVNFUiBmcm9tIHRoZSBzeXN0ZW0iCisKKy8vdXNhZ2U6I2RlZmluZSBkZWxncm91cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAoIltVU0VSXSAiKSJHUk9VUCIKKy8vdXNhZ2U6I2RlZmluZSBkZWxncm91cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlbGV0ZSBncm91cCBHUk9VUCBmcm9tIHRoZSBzeXN0ZW0iCisvL3VzYWdlOglJRl9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAoIiBvciB1c2VyIFVTRVIgZnJvbSBncm91cCBHUk9VUCIpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZGVsdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVsdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKiBVc2VyIG9yIGdyb3VwIG5hbWUgKi8KKwljaGFyICpuYW1lOworCS8qIFVzZXJuYW1lIChub24tTlVMTCBvbmx5IGluICJkZWxncm91cCBVU0VSIEdST1VQIiBjYXNlKSAqLworCWNoYXIgKm1lbWJlcjsKKwkvKiBOYW1lIG9mIHBhc3N3ZCBvciBncm91cCBmaWxlICovCisJY29uc3QgY2hhciAqcGZpbGU7CisJLyogTmFtZSBvZiBzaGFkb3cgb3IgZ3NoYWRvdyBmaWxlICovCisJY29uc3QgY2hhciAqc2ZpbGU7CisJLyogQXJlIHdlIGRlbHVzZXIgb3IgZGVsZ3JvdXA/ICovCisJaW50IGRvX2RlbHVzZXIgPSAoRU5BQkxFX0RFTFVTRVIgJiYgKCFFTkFCTEVfREVMR1JPVVAgfHwgYXBwbGV0X25hbWVbM10gPT0gJ3UnKSk7CisKKwlpZiAoZ2V0ZXVpZCgpICE9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCisJbmFtZSA9IGFyZ3ZbMV07CisJbWVtYmVyID0gTlVMTDsKKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMzoKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIHx8IGRvX2RlbHVzZXIpCisJCQlicmVhazsKKwkJLyogSXQncyAiZGVsZ3JvdXAgVVNFUiBHUk9VUCIgKi8KKwkJbWVtYmVyID0gbmFtZTsKKwkJbmFtZSA9IGFyZ3ZbMl07CisJCS8qIEZhbGx0aHJvdWdoICovCisKKwljYXNlIDI6CisJCWlmIChkb19kZWx1c2VyKSB7CisJCQkvKiAiZGVsdXNlciBVU0VSIiAqLworCQkJeGdldHB3bmFtKG5hbWUpOyAvKiBiYWlsIG91dCBpZiBVU0VSIGlzIHdyb25nICovCisJCQlwZmlsZSA9IGJiX3BhdGhfcGFzc3dkX2ZpbGU7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUykKKwkJCQlzZmlsZSA9IGJiX3BhdGhfc2hhZG93X2ZpbGU7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgZ3JvdXAgKmdyOworIGRvX2RlbGdyb3VwOgorCQkJLyogImRlbGdyb3VwIEdST1VQIiBvciAiZGVsZ3JvdXAgVVNFUiBHUk9VUCIgKi8KKwkJCWlmIChkb19kZWx1c2VyIDwgMCkgeyAvKiBkZWxncm91cCBhZnRlciBkZWx1c2VyPyAqLworCQkJCWdyID0gZ2V0Z3JuYW0obmFtZSk7CisJCQkJaWYgKCFncikKKwkJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCX0gZWxzZSB7CisJCQkJZ3IgPSB4Z2V0Z3JuYW0obmFtZSk7IC8qIGJhaWwgb3V0IGlmIEdST1VQIGlzIHdyb25nICovCisJCQl9CisJCQlpZiAoIW1lbWJlcikgeworCQkJCS8qICJkZWxncm91cCBHUk9VUCIgKi8KKwkJCQlzdHJ1Y3QgcGFzc3dkICpwdzsKKwkJCQlzdHJ1Y3QgcGFzc3dkIHB3ZW50OworCQkJCS8qIENoZWNrIGlmIHRoZSBncm91cCBpcyBpbiB1c2UgKi8KKyNkZWZpbmUgcGFzc3dkX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCQkJCXdoaWxlICghZ2V0cHdlbnRfcigmcHdlbnQsIHBhc3N3ZF9idWYsIHNpemVvZihwYXNzd2RfYnVmKSwgJnB3KSkgeworCQkJCQlpZiAocHdlbnQucHdfZ2lkID09IGdyLT5ncl9naWQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBzdGlsbCBoYXMgJyVzJyBhcyB0aGVpciBwcmltYXJ5IGdyb3VwISIsIHB3ZW50LnB3X25hbWUsIG5hbWUpOworCQkJCX0KKwkJCQkvL2VuZHB3ZW50KCk7CisJCQl9CisJCQlwZmlsZSA9IGJiX3BhdGhfZ3JvdXBfZmlsZTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKQorCQkJCXNmaWxlID0gYmJfcGF0aF9nc2hhZG93X2ZpbGU7CisJCX0KKworCQkvKiBNb2RpZnkgcGZpbGUsIHRoZW4gc2ZpbGUgKi8KKwkJZG8geworCQkJaWYgKHVwZGF0ZV9wYXNzd2QocGZpbGUsIG5hbWUsIE5VTEwsIG1lbWJlcikgPT0gLTEpCisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKSB7CisJCQkJcGZpbGUgPSBzZmlsZTsKKwkJCQlzZmlsZSA9IE5VTEw7CisJCQl9CisJCX0gd2hpbGUgKEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMgJiYgcGZpbGUpOworCisJCWlmIChFTkFCTEVfREVMR1JPVVAgJiYgZG9fZGVsdXNlciA+IDApIHsKKwkJCS8qICJkZWx1c2VyIFVTRVIiIGFsc28gc2hvdWxkIHRyeSB0byBkZWxldGUKKwkJCSAqIHNhbWUtbmFtZWQgZ3JvdXAuIElPVzogZG8gImRlbGdyb3VwIFVTRVIiCisJCQkgKi8KKy8vIE9uIGRlYmlhbiBkZWx1c2VyIGlzIGEgcGVybCBzY3JpcHQgdGhhdCBjYWxscyB1c2VyZGVsLgorLy8gRnJvbSBtYW4gdXNlcmRlbDoKKy8vICBJZiBVU0VSR1JPVVBTX0VOQUIgaXMgZGVmaW5lZCB0byB5ZXMgaW4gL2V0Yy9sb2dpbi5kZWZzLCB1c2VyZGVsIHdpbGwKKy8vICBkZWxldGUgdGhlIGdyb3VwIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgdXNlci4KKwkJCWRvX2RlbHVzZXIgPSAtMTsKKwkJCWdvdG8gZG9fZGVsZ3JvdXA7CisJCX0KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJLyogUmVhY2hlZCBvbmx5IGlmIG51bWJlciBvZiBjb21tYW5kIGxpbmUgYXJncyBpcyB3cm9uZyAqLworCWJiX3Nob3dfdXNhZ2UoKTsKK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvZ2V0dHkuYyBiL2xvZ2ludXRpbHMvZ2V0dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzhkZDkxCi0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9nZXR0eS5jCkBAIC0wLDAgKzEsNjU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBCYXNlZCBvbiBhZ2V0dHkgLSBhbm90aGVyIGdldHR5IHByb2dyYW0gZm9yIExpbnV4LiBCeSBXLiBaLiBWZW5lbWEgMTk4OQorICogUG9ydGVkIHRvIExpbnV4IGJ5IFBldGVyIE9yYmFlayA8cG9lQGRhaW1pLmFhdS5kaz4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KKyAqCisgKiBvcHRpb24gYWRkZWQgYnkgRXJpYyBSYXNtdXNzZW4gPGVhckB1c2ZpcnN0Lm9yZz4gLSAxMi8yOC85NQorICoKKyAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1pY2tpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgorICogLSBBZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICoKKyAqIDE5OTktMDUtMDUgVGhvcnN0ZW4gS3Jhbnprb3dza2kgPGRsOGJjdUBnbXgubmV0PgorICogLSBFbmFibGVkIGhhcmR3YXJlIGZsb3cgY29udHJvbCBiZWZvcmUgZGlzcGxheWluZyAvZXRjL2lzc3VlCisgKgorICogMjAxMS0wMSBWZW55cyBWbGFzZW5rbworICogLSBSZW1vdmVkIHBhcml0eSBkZXRlY3Rpb24gY29kZS4gSXQgY2FuJ3Qgd29yayByZWxpYWJseToKKyAqIGlmIGFsbCBjaGFycyByZWNlaXZlZCBoYXZlIGJpdCA3IGNsZWFyZWQgYW5kIG9kZCAob3IgZXZlbikgcGFyaXR5LAorICogaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBvdGhlciBzaWRlIGlzIDgtYml0LG5vLXBhcml0eQorICogb3IgNy1iaXQsb2RkKGV2ZW4pLXBhcml0eS4gSXQgYWxzbyBpbnRlcmZlcmVzIHdpdGggbm9uLUFTQ0lJIHVzZXJuYW1lcy4KKyAqIC0gRnJvbSBub3cgb24sIHdlIGFzc3VtZSB0aGF0IHBhcml0eSBpcyBjb3JyZWN0bHkgc2V0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaWZuZGVmIElVQ0xDCisjIGRlZmluZSBJVUNMQyAwCisjZW5kaWYKKworI2lmbmRlZiBMT0dJTl9QUk9DRVNTCisjIHVuZGVmIEVOQUJMRV9GRUFUVVJFX1VUTVAKKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfV1RNUAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVVRNUCAwCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9XVE1QIDAKKyNlbmRpZgorCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgdW5kZXJzdGFuZGFibGUgZGlhZ25vc3RpY3MgKi8KKyNpZmRlZiBERUJVR0dJTkcKK3N0YXRpYyBGSUxFICpkYmY7CisjIGRlZmluZSBERUJVR1RFUk0gIi9kZXYvdHR5cDAiCisjIGRlZmluZSBkZWJ1ZyguLi4pIGRvIHsgZnByaW50ZihkYmYsIF9fVkFfQVJHU19fKTsgZmZsdXNoKGRiZik7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgZGVidWcoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qCisgKiBUaGluZ3MgeW91IG1heSB3YW50IHRvIG1vZGlmeS4KKyAqCisgKiBZb3UgbWF5IGRpc2FncmVlIHdpdGggdGhlIGRlZmF1bHQgbGluZS1lZGl0aW5nIGV0Yy4gY2hhcmFjdGVycyBkZWZpbmVkCisgKiBiZWxvdy4gTm90ZSwgaG93ZXZlciwgdGhhdCBERUwgY2Fubm90IGJlIHVzZWQgZm9yIGludGVycnVwdCBnZW5lcmF0aW9uCisgKiBhbmQgZm9yIGxpbmUgZWRpdGluZyBhdCB0aGUgc2FtZSB0aW1lLgorICovCisjdW5kZWYgIF9QQVRIX0xPR0lOCisjZGVmaW5lIF9QQVRIX0xPR0lOICIvYmluL2xvZ2luIgorCisvKiBEaXNwbGF5ZWQgYmVmb3JlIHRoZSBsb2dpbiBwcm9tcHQuCisgKiBJZiBJU1NVRSBpcyBub3QgZGVmaW5lZCwgZ2V0dHkgd2lsbCBuZXZlciBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIC9ldGMvaXNzdWUgZmlsZS4gWW91IHdpbGwgbm90IHdhbnQgdG8gc3BpdCBvdXQgbGFyZ2UgImlzc3VlIiBmaWxlcyBhdCB0aGUKKyAqIHdyb25nIGJhdWQgcmF0ZS4KKyAqLworI2RlZmluZSBJU1NVRSAiL2V0Yy9pc3N1ZSIKKworLyogU29tZSBzaG9ydGhhbmRzIGZvciBjb250cm9sIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgQ1RMKHgpICAgICAgICAgICgoeCkgXiAwMTAwKSAgICAvKiBBc3N1bWVzIEFTQ0lJIGRpYWxlY3QgKi8KKyNkZWZpbmUgQlMgICAgICAgICAgICAgIENUTCgnSCcpICAgICAgICAvKiBiYWNrIHNwYWNlICovCisjZGVmaW5lIERFTCAgICAgICAgICAgICBDVEwoJz8nKSAgICAgICAgLyogZGVsZXRlICovCisKKy8qIERlZmF1bHRzIGZvciBsaW5lLWVkaXRpbmcgZXRjLiBjaGFyYWN0ZXJzOyB5b3UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgKi8KKyNkZWZpbmUgREVGX0lOVFIgICAgICAgIENUTCgnQycpICAgICAgICAvKiBkZWZhdWx0IGludGVycnVwdCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgREVGX1FVSVQgICAgICAgIENUTCgnXFwnKSAgICAgICAvKiBkZWZhdWx0IHF1aXQgY2hhciAqLworI2RlZmluZSBERUZfS0lMTCAgICAgICAgQ1RMKCdVJykgICAgICAgIC8qIGRlZmF1bHQga2lsbCBjaGFyICovCisjZGVmaW5lIERFRl9FT0YgICAgICAgICBDVEwoJ0QnKSAgICAgICAgLyogZGVmYXVsdCBFT0YgY2hhciAqLworI2RlZmluZSBERUZfRU9MICAgICAgICAgJ1xuJworI2RlZmluZSBERUZfU1dJVENIICAgICAgMCAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgc3dpdGNoIGNoYXIgKG5vbmUpICovCisKKy8qCisgKiBXaGVuIG11bHRpcGxlIGJhdWQgcmF0ZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAorICogdGhlIGZpcnN0IG9uZSB3ZSB3aWxsIHRyeSBpcyB0aGUgZmlyc3Qgb25lIHNwZWNpZmllZC4KKyAqLworI2RlZmluZSBNQVhfU1BFRUQgICAgICAgMTAgICAgICAgICAgICAgIC8qIG1heC4gbnIuIG9mIGJhdWQgcmF0ZXMgKi8KKworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIHRpbWVvdXQ7ICAgICAgICAgICAgICAgLyogdGltZS1vdXQgcGVyaW9kICovCisJY29uc3QgY2hhciAqbG9naW47ICAgICAgICAgICAgICAvKiBsb2dpbiBwcm9ncmFtICovCisJY29uc3QgY2hhciAqZmFrZWhvc3Q7CisJY29uc3QgY2hhciAqdHR5OyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHR0eSAqLworCWNoYXIgKmluaXRzdHJpbmc7ICAgICAgICAgICAgICAgLyogbW9kZW0gaW5pdCBzdHJpbmcgKi8KKwljb25zdCBjaGFyICppc3N1ZTsgICAgICAgICAgICAgIC8qIGFsdGVybmF0aXZlIGlzc3VlIGZpbGUgKi8KKwlpbnQgbnVtc3BlZWQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiYXVkIHJhdGVzIHRvIHRyeSAqLworCWludCBzcGVlZHNbTUFYX1NQRUVEXTsgICAgICAgICAgLyogYmF1ZCByYXRlcyB0byBiZSB0cmllZCAqLworCXVuc2lnbmVkIGNoYXIgZW9sOyAgICAgICAgICAgICAgLyogZW5kLW9mLWxpbmUgY2hhciBzZWVuIChDUiBvciBOTCkgKi8KKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOyAgICAgICAgIC8qIHRlcm1pbmFsIG1vZGUgYml0cyAqLworCWNoYXIgbGluZV9idWZbMTI4XTsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworLy91c2FnZTojZGVmaW5lIGdldHR5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gQkFVRF9SQVRFWyxCQVVEX1JBVEVdLi4uIFRUWSBbVEVSTVRZUEVdIgorLy91c2FnZTojZGVmaW5lIGdldHR5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiT3BlbiBhIHR0eSwgcHJvbXB0IGZvciBhIGxvZ2luIG5hbWUsIHRoZW4gaW52b2tlIC9iaW4vbG9naW5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJCUVuYWJsZSBoYXJkd2FyZSBSVFMvQ1RTIGZsb3cgY29udHJvbCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJCVNldCBDTE9DQUwgKGlnbm9yZSBDYXJyaWVyIERldGVjdCBzdGF0ZSkiCisvL3VzYWdlOiAgICAgIlxuCS1tCQlHZXQgYmF1ZCByYXRlIGZyb20gbW9kZW0ncyBDT05ORUNUIHN0YXR1cyBtZXNzYWdlIgorLy91c2FnZTogICAgICJcbgktbgkJRG9uJ3QgcHJvbXB0IGZvciBsb2dpbiBuYW1lIgorLy91c2FnZTogICAgICJcbgktdwkJV2FpdCBmb3IgQ1Igb3IgTEYgYmVmb3JlIHNlbmRpbmcgL2V0Yy9pc3N1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCURvbid0IGRpc3BsYXkgL2V0Yy9pc3N1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgSVNTVUVfRklMRQlEaXNwbGF5IElTU1VFX0ZJTEUgaW5zdGVhZCBvZiAvZXRjL2lzc3VlIgorLy91c2FnZTogICAgICJcbgktbCBMT0dJTglJbnZva2UgTE9HSU4gaW5zdGVhZCBvZiAvYmluL2xvZ2luIgorLy91c2FnZTogICAgICJcbgktdCBTRUMJCVRlcm1pbmF0ZSBhZnRlciBTRUMgaWYgbm8gbG9naW4gbmFtZSBpcyByZWFkIgorLy91c2FnZTogICAgICJcbgktSSBJTklUU1RSCVNlbmQgSU5JVFNUUiBiZWZvcmUgYW55dGhpbmcgZWxzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUggSE9TVAkJTG9nIEhPU1QgaW50byB0aGUgdXRtcCBmaWxlIGFzIHRoZSBob3N0bmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQkFVRF9SQVRFIG9mIDAgbGVhdmVzIGl0IHVuY2hhbmdlZCIKKworc3RhdGljIGNvbnN0IGNoYXIgb3B0X3N0cmluZ1tdIEFMSUdOMSA9ICJJOkxIOmY6aGlsOm10OnduIjsKKyNkZWZpbmUgRl9JTklUU1RSSU5HICAgICgxIDw8IDApICAgLyogLUkgKi8KKyNkZWZpbmUgRl9MT0NBTCAgICAgICAgICgxIDw8IDEpICAgLyogLUwgKi8KKyNkZWZpbmUgRl9GQUtFSE9TVCAgICAgICgxIDw8IDIpICAgLyogLUggKi8KKyNkZWZpbmUgRl9DVVNUSVNTVUUgICAgICgxIDw8IDMpICAgLyogLWYgKi8KKyNkZWZpbmUgRl9SVFNDVFMgICAgICAgICgxIDw8IDQpICAgLyogLWggKi8KKyNkZWZpbmUgRl9OT0lTU1VFICAgICAgICgxIDw8IDUpICAgLyogLWkgKi8KKyNkZWZpbmUgRl9MT0dJTiAgICAgICAgICgxIDw8IDYpICAgLyogLWwgKi8KKyNkZWZpbmUgRl9QQVJTRSAgICAgICAgICgxIDw8IDcpICAgLyogLW0gKi8KKyNkZWZpbmUgRl9USU1FT1VUICAgICAgICgxIDw8IDgpICAgLyogLXQgKi8KKyNkZWZpbmUgRl9XQUlUQ1JMRiAgICAgICgxIDw8IDkpICAgLyogLXcgKi8KKyNkZWZpbmUgRl9OT1BST01QVCAgICAgICgxIDw8IDEwKSAgLyogLW4gKi8KKworCisvKiBjb252ZXJ0IHNwZWVkIHN0cmluZyB0byBzcGVlZCBjb2RlOyByZXR1cm4gPD0gMCBvbiBmYWlsdXJlICovCitzdGF0aWMgaW50IGJjb2RlKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IHZhbHVlID0gYmJfc3RydG91KHMsIE5VTEwsIDEwKTsgLyogeWVzLCBpbnQgaXMgaW50ZW5kZWQhICovCisJaWYgKHZhbHVlIDwgMCkgLyogYmFkIHRlcm1pbmF0aW5nIGNoYXIsIG92ZXJmbG93LCBldGMgKi8KKwkJcmV0dXJuIHZhbHVlOworCXJldHVybiB0dHlfdmFsdWVfdG9fYmF1ZCh2YWx1ZSk7Cit9CisKKy8qIHBhcnNlIGFsdGVybmF0ZSBiYXVkIHJhdGVzICovCitzdGF0aWMgdm9pZCBwYXJzZV9zcGVlZHMoY2hhciAqYXJnKQoreworCWNoYXIgKmNwOworCisJLyogTkI6IGF0IGxlYXN0IG9uZSBpdGVyYXRpb24gaXMgYWx3YXlzIGRvbmUgKi8KKwlkZWJ1ZygiZW50ZXJlZCBwYXJzZV9zcGVlZHNcbiIpOworCXdoaWxlICgoY3AgPSBzdHJzZXAoJmFyZywgIiwiKSkgIT0gTlVMTCkgeworCQlHLnNwZWVkc1tHLm51bXNwZWVkXSA9IGJjb2RlKGNwKTsKKwkJaWYgKEcuc3BlZWRzW0cubnVtc3BlZWRdIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgc3BlZWQ6ICVzIiwgY3ApOworCQkvKiBub3RlOiBhcmcgIjAiIHR1cm5zIGludG8gc3BlZWQgQjAgKi8KKwkJRy5udW1zcGVlZCsrOworCQlpZiAoRy5udW1zcGVlZCA+IE1BWF9TUEVFRCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBhbHRlcm5hdGUgc3BlZWRzIik7CisJfQorCWRlYnVnKCJleGl0aW5nIHBhcnNlX3NwZWVkc1xuIik7Cit9CisKKy8qIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoY2hhciAqKmFyZ3YpCit7CisJY2hhciAqdHM7CisJaW50IGZsYWdzOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6dCsiOyAvKiBhdCBsZWFzdCAyIGFyZ3M7IC10IE4gKi8KKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsIG9wdF9zdHJpbmcsCisJCSZHLmluaXRzdHJpbmcsICZHLmZha2Vob3N0LCAmRy5pc3N1ZSwKKwkJJkcubG9naW4sICZHLnRpbWVvdXQKKwkpOworCWlmIChmbGFncyAmIEZfSU5JVFNUUklORykgeworCQlHLmluaXRzdHJpbmcgPSB4c3RyZHVwKEcuaW5pdHN0cmluZyk7CisJCS8qIGRlY29kZSBcZGRkIG9jdGFsIGNvZGVzIGludG8gY2hhcnMgKi8KKwkJc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXMoRy5pbml0c3RyaW5nLCBHLmluaXRzdHJpbmcpOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKwlkZWJ1ZygiYWZ0ZXIgZ2V0b3B0XG4iKTsKKworCS8qIFdlIGxvb3NlbiB1cCBhIGJpdCBhbmQgYWNjZXB0IGJvdGggImJhdWRyYXRlIHR0eSIgYW5kICJ0dHkgYmF1ZHJhdGUiICovCisJRy50dHkgPSBhcmd2WzBdOyAgICAgICAgLyogdHR5IG5hbWUgKi8KKwl0cyA9IGFyZ3ZbMV07ICAgICAgICAgICAvKiBiYXVkIHJhdGUocykgKi8KKwlpZiAoaXNkaWdpdChhcmd2WzBdWzBdKSkgeworCQkvKiBBIG51bWJlciBmaXJzdCwgYXNzdW1lIGl0J3MgYSBzcGVlZCAoQlNEIHN0eWxlKSAqLworCQlHLnR0eSA9IHRzOyAgICAgLyogdHR5IG5hbWUgaXMgaW4gYXJndlsxXSAqLworCQl0cyA9IGFyZ3ZbMF07ICAgLyogYmF1ZCByYXRlKHMpICovCisJfQorCXBhcnNlX3NwZWVkcyh0cyk7CisJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoImdldHR5OiAlcyIsIEcudHR5KTsKKworCWlmIChhcmd2WzJdKQorCQl4c2V0ZW52KCJURVJNIiwgYXJndlsyXSk7CisKKwlkZWJ1ZygiZXhpdGluZyBwYXJzZV9hcmdzXG4iKTsKK30KKworLyogc2V0IHVwIHR0eSBhcyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0LCBlcnJvciAqLworc3RhdGljIHZvaWQgb3Blbl90dHkodm9pZCkKK3sKKwkvKiBTZXQgdXAgbmV3IHN0YW5kYXJkIGlucHV0LCB1bmxlc3Mgd2UgYXJlIGdpdmVuIGFuIGFscmVhZHkgb3BlbmVkIHBvcnQgKi8KKwlpZiAoTk9UX0xPTkVfREFTSChHLnR0eSkpIHsKKwkJaWYgKEcudHR5WzBdICE9ICcvJykKKwkJCUcudHR5ID0geGFzcHJpbnRmKCIvZGV2LyVzIiwgRy50dHkpOyAvKiB3aWxsIGxlYWsgaXQgKi8KKworCQkvKiBPcGVuIHRoZSB0dHkgYXMgc3RhbmRhcmQgaW5wdXQgKi8KKwkJZGVidWcoIm9wZW4oMilcbiIpOworCQljbG9zZSgwKTsKKwkJeG9wZW4oRy50dHksIE9fUkRXUiB8IE9fTk9OQkxPQ0spOyAvKiB1c2VzIGZkIDAgKi8KKworCQkvKiBTZXQgcHJvcGVyIHByb3RlY3Rpb25zIGFuZCBvd25lcnNoaXAgKi8KKwkJZmNob3duKDAsIDAsIDApOyAgICAgICAgLyogMDowICovCisJCWZjaG1vZCgwLCAwNjIwKTsgICAgICAgIC8qIGNydy0tdy0tLS0gKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFuZGFyZCBpbnB1dCBzaG91bGQgYWxyZWFkeSBiZSBjb25uZWN0ZWQgdG8gYW4gb3BlbiBwb3J0LiBNYWtlCisJCSAqIHN1cmUgaXQgaXMgb3BlbiBmb3IgcmVhZC93cml0ZS4KKwkJICovCisJCWlmICgoZmNudGwoMCwgRl9HRVRGTCkgJiAoT19SRFdSfE9fUkRPTkxZfE9fV1JPTkxZKSkgIT0gT19SRFdSKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0ZGluIGlzIG5vdCBvcGVuIGZvciByZWFkL3dyaXRlIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfdGVybWlvcyh2b2lkKQoreworCWlmICh0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmRy50ZXJtaW9zKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidGNzZXRhdHRyIik7Cit9CisKKy8qIFdlIG1hbmlwdWxhdGUgdGVybWlvcyB0aGlzIHdheToKKyAqIC0gZmlyc3QsIHdlIHJlYWQgZXhpc3RpbmcgdGVybWlvcyBzZXR0aW5ncworICogLSB0ZXJtaW9zX2luaXQgbW9kaWZpZXMgc29tZSBwYXJ0cyBhbmQgc2V0cyBpdAorICogLSBhdXRvX2JhdWQgYW5kL29yIEJSRUFLIHByb2Nlc3NpbmcgY2FuIHNldCBkaWZmZXJlbnQgc3BlZWQgYW5kIHNldCB0ZXJtaW9zCisgKiAtIHRlcm1pb3NfZmluYWwgYWdhaW4gbW9kaWZpZXMgc29tZSBwYXJ0cyBhbmQgc2V0cyB0ZXJtaW9zIGJlZm9yZQorICogICBleGVjaW5nIGxvZ2luCisgKi8KK3N0YXRpYyB2b2lkIHRlcm1pb3NfaW5pdChpbnQgc3BlZWQpCit7CisJLyogVHJ5IHRvIGRyYWluIG91dHB1dCBidWZmZXIsIHdpdGggNSBzZWMgdGltZW91dC4KKwkgKiBBZGRlZCBvbiByZXF1ZXN0IGZyb20gdXNlcnMgb2YgfjYwMCBiYXVkIHNlcmlhbCBpbnRlcmZhY2UKKwkgKiB3aXRoIGJpZ2dpc2ggYnVmZmVyIG9uIGEgOTBNSHogQ1BVLgorCSAqIFRoZXkgd2VyZSBsb3NpbmcgaHVuZHJlZHMgb2YgYnl0ZXMgb2YgYnVmZmVyZWQgb3V0cHV0CisJICogb24gdGNmbHVzaC4KKwkgKi8KKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0FMUk0sIHJlY29yZF9zaWdubyk7CisJYWxhcm0oNSk7CisJdGNkcmFpbihTVERJTl9GSUxFTk8pOworCWFsYXJtKDApOworCXNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsgLyogZG8gbm90IGJyZWFrIC10IFRJTUVPVVQhICovCisKKwkvKiBGbHVzaCBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlcywgaW1wb3J0YW50IGZvciBtb2RlbXMhICovCisJdGNmbHVzaChTVERJTl9GSUxFTk8sIFRDSU9GTFVTSCk7CisKKwkvKiBTZXQgc3BlZWQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZCBhcyAiMCIgb24gY29tbWFuZCBsaW5lICovCisJaWYgKHNwZWVkICE9IEIwKQorCQljZnNldHNwZWVkKCZHLnRlcm1pb3MsIHNwZWVkKTsKKworCS8qIEluaXRpYWwgdGVybWlvcyBzZXR0aW5nczogOC1iaXQgY2hhcmFjdGVycywgcmF3IG1vZGUsIGJsb2NraW5nIGkvby4KKwkgKiBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHNldCBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIGxvZ2luIG5hbWU7IGFsbAorCSAqIHJlYWRzIHdpbGwgYmUgZG9uZSBpbiByYXcgbW9kZSBhbnl3YXkuCisJICovCisJLyogQ2xlYXIgYWxsIGJpdHMgZXhjZXB0OiAqLworCUcudGVybWlvcy5jX2NmbGFnICY9ICgwCisJCS8qIDIgc3RvcCBiaXRzICgxIG90aGVyd2lzZSkKKwkJICogRW5hYmxlIHBhcml0eSBiaXQgKGJvdGggb24gaW5wdXQgYW5kIG91dHB1dCkKKwkJICogT2RkIHBhcml0eSAoZWxzZSBldmVuKQorCQkgKi8KKwkJfCBDU1RPUEIgfCBQQVJFTkIgfCBQQVJPREQKKyNpZmRlZiBDTVNQQVIKKwkJfCBDTVNQQVIgIC8qIG1hcmsgb3Igc3BhY2UgcGFyaXR5ICovCisjZW5kaWYKKyNpZmRlZiBDQkFVRAorCQl8IENCQVVEICAgLyogKG91dHB1dCkgYmF1ZCByYXRlICovCisjZW5kaWYKKyNpZmRlZiBDQkFVREVYCisJCXwgQ0JBVURFWCAvKiAob3V0cHV0KSBiYXVkIHJhdGUgKi8KKyNlbmRpZgorI2lmZGVmIENJQkFVRAorCQl8IENJQkFVRCAgIC8qIGlucHV0IGJhdWQgcmF0ZSAqLworI2VuZGlmCisJKTsKKwkvKiBTZXQ6IDggYml0czsgaGFuZyB1cCAoZHJvcCBEVFIpIG9uIGxhc3QgY2xvc2U7IGVuYWJsZSByZWNlaXZlICovCisJRy50ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M4IHwgSFVQQ0wgfCBDUkVBRDsKKwlpZiAob3B0aW9uX21hc2szMiAmIEZfTE9DQUwpIHsKKwkJLyogaWdub3JlIENhcnJpZXIgRGV0ZWN0IHBpbjoKKwkJICogb3BlbnMgZG9uJ3QgYmxvY2sgd2hlbiBDRCBpcyBsb3csCisJCSAqIGxvc2luZyBDRCBkb2Vzbid0IGhhbmcgdXAgcHJvY2Vzc2VzIHdob3NlIGN0dHkgaXMgdGhpcyB0dHkKKwkJICovCisJCUcudGVybWlvcy5jX2NmbGFnIHw9IENMT0NBTDsKKwl9CisjaWZkZWYgQ1JUU0NUUworCWlmIChvcHRpb25fbWFzazMyICYgRl9SVFNDVFMpCisJCUcudGVybWlvcy5jX2NmbGFnIHw9IENSVFNDVFM7IC8qIGZsb3cgY29udHJvbCB1c2luZyBSVFMvQ1RTIHBpbnMgKi8KKyNlbmRpZgorCUcudGVybWlvcy5jX2lmbGFnID0gMDsKKwlHLnRlcm1pb3MuY19sZmxhZyA9IDA7CisJLyogbm9uLXJhdyBvdXRwdXQ7IGFkZCBDUiB0byBlYWNoIE5MICovCisJRy50ZXJtaW9zLmNfb2ZsYWcgPSBPUE9TVCB8IE9OTENSOworCisJRy50ZXJtaW9zLmNfY2NbVk1JTl0gPSAxOyAvKiBibG9jayByZWFkcyBpZiA8IDEgY2hhciBpcyBhdmFpbGFibGUgKi8KKwlHLnRlcm1pb3MuY19jY1tWVElNRV0gPSAwOyAvKiBubyB0aW1lb3V0IChyZWFkcyBibG9jayBmb3JldmVyKSAqLworI2lmZGVmIF9fbGludXhfXworCUcudGVybWlvcy5jX2xpbmUgPSAwOworI2VuZGlmCisKKwlzZXRfdGVybWlvcygpOworCisJZGVidWcoInRlcm1faW8gMlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlcm1pb3NfZmluYWwodm9pZCkKK3sKKwkvKiBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgb24gb3V0cHV0IChzdG9wIHNlbmRpbmcgaWYgWE9GRiBpcyByZWN2ZCk7CisJICogYW5kIG9uIGlucHV0IChzZW5kIFhPRkYgd2hlbiBidWZmZXIgaXMgZnVsbCkKKwkgKi8KKwlHLnRlcm1pb3MuY19pZmxhZyB8PSBJWE9OIHwgSVhPRkY7CisJaWYgKEcuZW9sID09ICdccicpIHsKKwkJRy50ZXJtaW9zLmNfaWZsYWcgfD0gSUNSTkw7IC8qIG1hcCBDUiBvbiBpbnB1dCB0byBOTCAqLworCX0KKwkvKiBPdGhlciBiaXRzIGluIGNfaWZsYWc6CisJICogSVhBTlkgICBBbnkgcmVjdmQgY2hhciBlbmFibGVzIG91dHB1dCAoYW55IGNoYXIgaXMgYWxzbyBhIFhPTikKKwkgKiBJTlBDSyAgIEVuYWJsZSBwYXJpdHkgY2hlY2sKKwkgKiBJR05QQVIgIElnbm9yZSBwYXJpdHkgZXJyb3JzIChkcm9wIGJhZCBieXRlcykKKwkgKiBQQVJNUksgIE1hcmsgcGFyaXR5IGVycm9ycyB3aXRoIDB4ZmYsIDB4MDAgcHJlZml4CisJICogICAgICAgICAoZWxzZSBiYWQgYnl0ZSBpcyByZWNlaXZlZCBhcyAweDAwKQorCSAqIElTVFJJUCAgU3RyaXAgcGFyaXR5IGJpdAorCSAqIElHTkJSSyAgSWdub3JlIGJyZWFrIGNvbmRpdGlvbgorCSAqIEJSS0lOVCAgU2VuZCBTSUdJTlQgb24gYnJlYWsgLSBtYXliZSBzZXQgdGhpcz8KKwkgKiBJTkxDUiAgIE1hcCBOTCB0byBDUgorCSAqIElHTkNSICAgSWdub3JlIENSCisJICogSUNSTkwgICBNYXAgQ1IgdG8gTkwKKwkgKiBJVUNMQyAgIE1hcCB1cHBlcmNhc2UgdG8gbG93ZXJjYXNlCisJICogSU1BWEJFTCBFY2hvIEJFTCBvbiBpbnB1dCBsaW5lIHRvbyBsb25nCisJICogSVVURjggICBBcHBlYXJzIHRvIGFmZmVjdCB0dHkncyBpZGVhIG9mIGNoYXIgd2lkdGhzLAorCSAqICAgICAgICAgb2JzZXJ2ZWQgdG8gaW1wcm92ZSBiYWNrc3BhY2luZyB0aHJvdWdoIFVuaWNvZGUgY2hhcnMKKwkgKi8KKworCS8qIGxpbmUgYnVmZmVyZWQgaW5wdXQgKE5MIG9yIEVPTCBvciBFT0YgY2hhcnMgZW5kIGEgbGluZSk7CisJICogcmVjb2duaXplIElOVC9RVUlUL1NVU1AgY2hhcnM7CisJICogZWNobyBpbnB1dCBjaGFyczsKKwkgKiBlY2hvIEJTLVNQLUJTIG9uIGVyYXNlIGNoYXJhY3RlcjsKKwkgKiBlY2hvIGtpbGwgY2hhciBzcGVjaWFsbHksIG5vdCBhcyBeYyAoRUNIT0tFIGNvbnRyb2xzIGhvdyBleGFjdGx5KTsKKwkgKiBlcmFzZSBhbGwgaW5wdXQgdmlhIEJTLVNQLUJTIG9uIGtpbGwgY2hhciAoZWxzZSBnbyB0byBuZXh0IGxpbmUpCisJICovCisJRy50ZXJtaW9zLmNfbGZsYWcgfD0gSUNBTk9OIHwgSVNJRyB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgRUNIT0tFOworCS8qIE90aGVyIGJpdHMgaW4gY19sZmxhZzoKKwkgKiBYQ0FTRSAgIE1hcCB1cHBlcmNhc2UgdG8gXGxvd2VyY2FzZSBbdHJpZWQsIGRvZXNuJ3Qgd29ya10KKwkgKiBFQ0hPTkwgIEVjaG8gTkwgZXZlbiBpZiBFQ0hPIGlzIG5vdCBzZXQKKwkgKiBFQ0hPQ1RMIEVjaG8gY3RybCBjaGFycyBhcyBeYyAoZWxzZSBkb24ndCBlY2hvKSAtIG1heWJlIHNldCB0aGlzPworCSAqIEVDSE9QUlQgT24gZXJhc2UsIGVjaG8gZXJhc2VkIGNoYXJzCisJICogICAgICAgICBbcXdlPEJTPjxCUz48QlM+IGlucHV0IGxvb2tzIGxpa2UgInF3ZVxld3EvIiBvbiBzY3JlZW5dCisJICogTk9GTFNIICBEb24ndCBmbHVzaCBpbnB1dCBidWZmZXIgYWZ0ZXIgaW50ZXJydXB0IG9yIHF1aXQgY2hhcnMKKwkgKiBJRVhURU4gIEVuYWJsZSBleHRlbmRlZCBmdW5jdGlvbnMgKD8/KQorCSAqICAgICAgICAgW2dsaWJjIHNheXMgaXQgZW5hYmxlcyBjX2NjW0xORVhUXSAiZW50ZXIgbGl0ZXJhbCBjaGFyIgorCSAqICAgICAgICAgYW5kIGNfY2NbVkRJU0NBUkRdICJ0b2dnbGUgZGlzY2FyZCBidWZmZXJlZCBvdXRwdXQiIGNoYXJzXQorCSAqIEZMVVNITyAgT3V0cHV0IGJlaW5nIGZsdXNoZWQgKGNfY2NbVkRJU0NBUkRdIGlzIGluIGVmZmVjdCkKKwkgKiBQRU5ESU4gIFJldHlwZSBwZW5kaW5nIGlucHV0IGF0IG5leHQgcmVhZCBvciBpbnB1dCBjaGFyCisJICogICAgICAgICAoY19jY1tWUkVQUklOVF0gaXMgYmVpbmcgcHJvY2Vzc2VkKQorCSAqIFRPU1RPUCAgU2VuZCBTSUdUVE9VIGZvciBiYWNrZ3JvdW5kIG91dHB1dAorCSAqICAgICAgICAgKHdoeSAic3R0eSBzYW5lIiB1bnNldHMgdGhpcyBiaXQ/KQorCSAqLworCisJRy50ZXJtaW9zLmNfY2NbVklOVFJdID0gREVGX0lOVFI7CisJRy50ZXJtaW9zLmNfY2NbVlFVSVRdID0gREVGX1FVSVQ7CisJRy50ZXJtaW9zLmNfY2NbVkVPRl0gPSBERUZfRU9GOworCUcudGVybWlvcy5jX2NjW1ZFT0xdID0gREVGX0VPTDsKKyNpZmRlZiBWU1dUQworCUcudGVybWlvcy5jX2NjW1ZTV1RDXSA9IERFRl9TV0lUQ0g7CisjZW5kaWYKKyNpZmRlZiBWU1dUQ0gKKwlHLnRlcm1pb3MuY19jY1tWU1dUQ0hdID0gREVGX1NXSVRDSDsKKyNlbmRpZgorCUcudGVybWlvcy5jX2NjW1ZLSUxMXSA9IERFRl9LSUxMOworCS8qIE90aGVyIGNvbnRyb2wgY2hhcnM6CisJICogVkVPTDIKKwkgKiBWRVJBU0UsIFZXRVJBU0UgLSAod29yZCkgZXJhc2UuIHdlIG1heSBzZXQgVkVSQVNFIGluIGdldF9sb2duYW1lCisJICogVlJFUFJJTlQgLSByZXByaW50IGN1cnJlbnQgaW5wdXQgYnVmZmVyCisJICogVkxORVhULCBWRElTQ0FSRCwgVlNUQVRVUworCSAqIFZTVVNQLCBWRFNVU1AgLSBzZW5kIChkZWxheWVkKSBTSUdUU1RQCisJICogVlNUQVJULCBWU1RPUCAtIGNoYXJzIHVzZWQgZm9yIElYT04vSVhPRkYKKwkgKi8KKworCXNldF90ZXJtaW9zKCk7Cit9CisKKy8qIGV4dHJhY3QgYmF1ZCByYXRlIGZyb20gbW9kZW0gc3RhdHVzIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIGF1dG9fYmF1ZCh2b2lkKQoreworCWludCBucmVhZDsKKworCS8qCisJICogVGhpcyB3b3JrcyBvbmx5IGlmIHRoZSBtb2RlbSBwcm9kdWNlcyBpdHMgc3RhdHVzIGNvZGUgQUZURVIgcmFpc2luZworCSAqIHRoZSBEQ0QgbGluZSwgYW5kIGlmIHRoZSBjb21wdXRlciBpcyBmYXN0IGVub3VnaCB0byBzZXQgdGhlIHByb3BlcgorCSAqIGJhdWQgcmF0ZSBiZWZvcmUgdGhlIG1lc3NhZ2UgaGFzIGdvbmUgYnkuIFdlIGV4cGVjdCBhIG1lc3NhZ2Ugb2YgdGhlCisJICogZm9sbG93aW5nIGZvcm1hdDoKKwkgKgorCSAqIDxqdW5rPjxudW1iZXI+PGp1bms+CisJICoKKwkgKiBUaGUgbnVtYmVyIGlzIGludGVycHJldGVkIGFzIHRoZSBiYXVkIHJhdGUgb2YgdGhlIGluY29taW5nIGNhbGwuIElmIHRoZQorCSAqIG1vZGVtIGRvZXMgbm90IHRlbGwgdXMgdGhlIGJhdWQgcmF0ZSB3aXRoaW4gb25lIHNlY29uZCwgd2Ugd2lsbCBrZWVwCisJICogdXNpbmcgdGhlIGN1cnJlbnQgYmF1ZCByYXRlLiBJdCBpcyBhZHZpc2FibGUgdG8gZW5hYmxlIEJSRUFLCisJICogcHJvY2Vzc2luZyAoY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYmF1ZCByYXRlcykgaWYgdGhlIHByb2Nlc3Npbmcgb2YKKwkgKiBtb2RlbSBzdGF0dXMgbWVzc2FnZXMgaXMgZW5hYmxlZC4KKwkgKi8KKworCUcudGVybWlvcy5jX2NjW1ZNSU5dID0gMDsgLyogZG9uJ3QgYmxvY2sgcmVhZHMgKG1pbiByZWFkIGlzIDAgY2hhcnMpICovCisJc2V0X3Rlcm1pb3MoKTsKKworCS8qCisJICogV2FpdCBmb3IgYSB3aGlsZSwgdGhlbiByZWFkIGV2ZXJ5dGhpbmcgdGhlIG1vZGVtIGhhcyBzYWlkIHNvIGZhciBhbmQKKwkgKiB0cnkgdG8gZXh0cmFjdCB0aGUgc3BlZWQgb2YgdGhlIGRpYWwtaW4gY2FsbC4KKwkgKi8KKwlzbGVlcCgxKTsKKwlucmVhZCA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIEcubGluZV9idWYsIHNpemVvZihHLmxpbmVfYnVmKSAtIDEpOworCWlmIChucmVhZCA+IDApIHsKKwkJaW50IHNwZWVkOworCQljaGFyICpicDsKKwkJRy5saW5lX2J1ZltucmVhZF0gPSAnXDAnOworCQlmb3IgKGJwID0gRy5saW5lX2J1ZjsgYnAgPCBHLmxpbmVfYnVmICsgbnJlYWQ7IGJwKyspIHsKKwkJCWlmIChpc2RpZ2l0KCpicCkpIHsKKwkJCQlzcGVlZCA9IGJjb2RlKGJwKTsKKwkJCQlpZiAoc3BlZWQgPiAwKQorCQkJCQljZnNldHNwZWVkKCZHLnRlcm1pb3MsIHNwZWVkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlc3RvcmUgdGVybWluYWwgc2V0dGluZ3MgKi8KKwlHLnRlcm1pb3MuY19jY1tWTUlOXSA9IDE7IC8qIHJlc3RvcmUgdG8gdmFsdWUgc2V0IGJ5IHRlcm1pb3NfaW5pdCAqLworCXNldF90ZXJtaW9zKCk7Cit9CisKKy8qIGdldCB1c2VyIG5hbWUsIGVzdGFibGlzaCBwYXJpdHksIHNwZWVkLCBlcmFzZSwga2lsbCwgZW9sOworICogcmV0dXJuIE5VTEwgb24gQlJFQUssIGxvZ25hbWUgb24gc3VjY2VzcworICovCitzdGF0aWMgY2hhciAqZ2V0X2xvZ25hbWUodm9pZCkKK3sKKwljaGFyICpicDsKKwljaGFyIGM7CisKKwkvKiBGbHVzaCBwZW5kaW5nIGlucHV0IChlc3AuIGFmdGVyIHBhcnNpbmcgb3Igc3dpdGNoaW5nIHRoZSBiYXVkIHJhdGUpICovCisJdXNsZWVwKDEwMCoxMDAwKTsgLyogMC4xIHNlYyAqLworCXRjZmx1c2goU1RESU5fRklMRU5PLCBUQ0lGTFVTSCk7CisKKwkvKiBQcm9tcHQgZm9yIGFuZCByZWFkIGEgbG9naW4gbmFtZSAqLworCUcubGluZV9idWZbMF0gPSAnXDAnOworCXdoaWxlICghRy5saW5lX2J1ZlswXSkgeworCQkvKiBXcml0ZSBpc3N1ZSBmaWxlIGFuZCBwcm9tcHQgKi8KKyNpZmRlZiBJU1NVRQorCQlpZiAoIShvcHRpb25fbWFzazMyICYgRl9OT0lTU1VFKSkKKwkJCXByaW50X2xvZ2luX2lzc3VlKEcuaXNzdWUsIEcudHR5KTsKKyNlbmRpZgorCQlwcmludF9sb2dpbl9wcm9tcHQoKTsKKworCQkvKiBSZWFkIG5hbWUsIHdhdGNoIGZvciBicmVhaywgcGFyaXR5LCBlcmFzZSwga2lsbCwgZW5kLW9mLWxpbmUgKi8KKwkJYnAgPSBHLmxpbmVfYnVmOworCQlHLmVvbCA9ICdcMCc7CisJCXdoaWxlICgxKSB7CisJCQkvKiBEbyBub3QgcmVwb3J0IHRyaXZpYWwgRUlOVFIvRUlPIGVycm9ycyAqLworCQkJZXJybm8gPSBFSU5UUjsgLyogbWFrZSByZWFkIG9mIDAgYnl0ZXMgYmUgc2lsZW50IHRvbyAqLworCQkJaWYgKHJlYWQoU1RESU5fRklMRU5PLCAmYywgMSkgPCAxKSB7CisJCQkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVJTykKKwkJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQl9CisKKwkJCS8qIEJSRUFLLiBJZiB3ZSBoYXZlIHNwZWVkcyB0byB0cnksCisJCQkgKiByZXR1cm4gTlVMTCAod2lsbCBzd2l0Y2ggc3BlZWRzIGFuZCByZXR1cm4gaGVyZSkgKi8KKwkJCWlmIChjID09ICdcMCcgJiYgRy5udW1zcGVlZCA+IDEpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCS8qIERvIGVyYXNlLCBraWxsIGFuZCBlbmQtb2YtbGluZSBwcm9jZXNzaW5nICovCisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ1xyJzoKKwkJCWNhc2UgJ1xuJzoKKwkJCQkqYnAgPSAnXDAnOworCQkJCUcuZW9sID0gYzsKKwkJCQlnb3RvIGdvdF9sb2duYW1lOworCQkJY2FzZSBCUzoKKwkJCWNhc2UgREVMOgorCQkJCUcudGVybWlvcy5jX2NjW1ZFUkFTRV0gPSBjOworCQkJCWlmIChicCA+IEcubGluZV9idWYpIHsKKwkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAxMCBcMDEwIiwgMyk7CisJCQkJCWJwLS07CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDVEwoJ1UnKToKKwkJCQl3aGlsZSAoYnAgPiBHLmxpbmVfYnVmKSB7CisJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgIlwwMTAgXDAxMCIsIDMpOworCQkJCQlicC0tOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ1RMKCdEJyk6CisJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpYyA8ICcgJykgeworCQkJCQkvKiBpZ25vcmUgZ2FyYmFnZSBjaGFyYWN0ZXJzICovCisJCQkJfSBlbHNlIGlmICgoaW50KShicCAtIEcubGluZV9idWYpIDwgc2l6ZW9mKEcubGluZV9idWYpIC0gMSkgeworCQkJCQkvKiBlY2hvIGFuZCBzdG9yZSB0aGUgY2hhcmFjdGVyICovCisJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgJmMsIDEpOworCQkJCQkqYnArKyA9IGM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IC8qIGVuZCBvZiBnZXQgY2hhciBsb29wICovCisgZ290X2xvZ25hbWU6IDsKKwl9IC8qIHdoaWxlIGxvZ25hbWUgaXMgZW1wdHkgKi8KKworCXJldHVybiBHLmxpbmVfYnVmOworfQorCitpbnQgZ2V0dHlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGdldHR5X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbjsKKwlwaWRfdCBwaWQ7CisJY2hhciAqbG9nbmFtZTsKKworCUlOSVRfRygpOworCUcubG9naW4gPSBfUEFUSF9MT0dJTjsgICAgLyogZGVmYXVsdCBsb2dpbiBwcm9ncmFtICovCisjaWZkZWYgSVNTVUUKKwlHLmlzc3VlID0gSVNTVUU7ICAgICAgICAgIC8qIGRlZmF1bHQgaXNzdWUgZmlsZSAqLworI2VuZGlmCisJRy5lb2wgPSAnXHInOworCisJLyogUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cyAqLworCXBhcnNlX2FyZ3MoYXJndik7CisKKwlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworCisJLyogQ3JlYXRlIG5ldyBzZXNzaW9uLCBsb3NlIGNvbnRyb2xsaW5nIHR0eSwgaWYgYW55ICovCisJLyogZG9jcy9jdHR5Lmh0bSBzYXlzOgorCSAqICJUaGlzIGlzIGFsbG93ZWQgb25seSB3aGVuIHRoZSBjdXJyZW50IHByb2Nlc3MKKwkgKiAgaXMgbm90IGEgcHJvY2VzcyBncm91cCBsZWFkZXIiIC0gaXMgdGhpcyBhIHByb2JsZW0/ICovCisJc2V0c2lkKCk7CisJLyogY2xvc2Ugc3RkaW8sIGFuZCBzdHJheSBkZXNjcmlwdG9ycywganVzdCBpbiBjYXNlICovCisJbiA9IHhvcGVuKGJiX2Rldl9udWxsLCBPX1JEV1IpOworCS8qIGR1cDIobiwgMCk7IC0gbm8sIHdlIG5lZWQgdG8gaGFuZGxlICJnZXR0eSAtIDk2MDAiIHRvbyAqLworCXhkdXAyKG4sIDEpOworCXhkdXAyKG4sIDIpOworCXdoaWxlIChuID4gMikKKwkJY2xvc2Uobi0tKTsKKworCS8qIExvZ2dpbmcuIFdlIHdhbnQgc3BlY2lhbCBmbGF2b3Igb2YgZXJyb3JfbXNnX2FuZF9kaWUgKi8KKwlkaWVfc2xlZXAgPSAxMDsKKwltc2dfZW9sID0gIlxyXG4iOworCS8qIG1vc3QgbGlrZWx5IHdpbGwgaW50ZXJuYWxseSB1c2UgZmQgIzMgaW4gQ0xPRVhFQyBtb2RlOiAqLworCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19BVVRIKTsKKwlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCisjaWZkZWYgREVCVUdHSU5HCisJZGJmID0geGZvcGVuX2Zvcl93cml0ZShERUJVR1RFUk0pOworCWZvciAobiA9IDE7IGFyZ3Zbbl07IG4rKykgeworCQlkZWJ1Zyhhcmd2W25dKTsKKwkJZGVidWcoIlxuIik7CisJfQorI2VuZGlmCisKKwkvKiBPcGVuIHRoZSB0dHkgYXMgc3RhbmRhcmQgaW5wdXQsIGlmIGl0IGlzIG5vdCAiLSIgKi8KKwkvKiBJZiBpdCdzIG5vdCAiLSIgYW5kIG5vdCB0YWtlbiB5ZXQsIGl0IHdpbGwgYmVjb21lIG91ciBjdHR5ICovCisJZGVidWcoImNhbGxpbmcgb3Blbl90dHlcbiIpOworCW9wZW5fdHR5KCk7CisJbmRlbGF5X29mZigwKTsKKwlkZWJ1ZygiZHVwaW5nXG4iKTsKKwl4ZHVwMigwLCAxKTsKKwl4ZHVwMigwLCAyKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBpb2N0bCB3aWxsIGZhaWwgaWYgc3RkaW4gaXMgbm90IGEgdHR5LCBidXQgYWxzbyB3aGVuCisJICogdGhlcmUgaXMgbm9pc2Ugb24gdGhlIG1vZGVtIGNvbnRyb2wgbGluZXMuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisJICogY29tbW9uIGNvdXJzZSBvZiBhY3Rpb24gaXMgKDEpIGZpeCB5b3VyIGNhYmxlcyAoMikgZ2l2ZSB0aGUgbW9kZW0gbW9yZQorCSAqIHRpbWUgdG8gcHJvcGVybHkgcmVzZXQgYWZ0ZXIgaGFuZ2luZyB1cC4gU3VuT1MgdXNlcnMgY2FuIGFjaGlldmUgKDIpCisJICogYnkgcGF0Y2hpbmcgdGhlIFN1bk9TIGtlcm5lbCB2YXJpYWJsZSAienNhZHRybG93IiB0byBhIGxhcmdlciB2YWx1ZTsKKwkgKiA1IHNlY29uZHMgc2VlbXMgdG8gYmUgYSBnb29kIHZhbHVlLgorCSAqLworCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmRy50ZXJtaW9zKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidGNnZXRhdHRyIik7CisKKwlwaWQgPSBnZXRwaWQoKTsKKyNpZmRlZiBfX2xpbnV4X18KKy8vIEZJWE1FOiBkbyB3ZSBuZWVkIHRoaXM/IE90aGVyd2lzZSAiLSIgY2FzZSBzZWVtcyB0byBiZSBicm9rZW4uLi4KKwkvLyAvKiBGb3JjaWJseSBtYWtlIGZkIDAgb3VyIGNvbnRyb2xsaW5nIHR0eSwgZXZlbiBpZiBhbm90aGVyIHNlc3Npb24KKwkvLyAgKiBoYXMgaXQgYXMgYSBjdHR5LiAoQW5vdGhlciBzZXNzaW9uIGxvc2VzIGN0dHkpLiAqLworCS8vIGlvY3RsKFNURElOX0ZJTEVOTywgVElPQ1NDVFRZLCAodm9pZCopMSk7CisJLyogTWFrZSBvdXJzZWxmIGEgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIHdpdGhpbiBvdXIgc2Vzc2lvbiAqLworCXRjc2V0cGdycChTVERJTl9GSUxFTk8sIHBpZCk7CisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgdXRtcCBmaWxlLiBUaGlzIHR0eSBpcyBvdXJzIG5vdyEgKi8KKwl1cGRhdGVfdXRtcChwaWQsIExPR0lOX1BST0NFU1MsIEcudHR5LCAiTE9HSU4iLCBHLmZha2Vob3N0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIHRlcm1pb3Mgc2V0dGluZ3MgKHJhdyBtb2RlLCBlaWdodC1iaXQsIGJsb2NraW5nIGkvbykgKi8KKwlkZWJ1ZygiY2FsbGluZyB0ZXJtaW9zX2luaXRcbiIpOworCXRlcm1pb3NfaW5pdChHLnNwZWVkc1swXSk7CisKKwkvKiBXcml0ZSB0aGUgbW9kZW0gaW5pdCBzdHJpbmcgYW5kIERPTidUIGZsdXNoIHRoZSBidWZmZXJzICovCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGX0lOSVRTVFJJTkcpIHsKKwkJZGVidWcoIndyaXRpbmcgaW5pdCBzdHJpbmdcbiIpOworCQlmdWxsX3dyaXRlMV9zdHIoRy5pbml0c3RyaW5nKTsKKwl9CisKKwkvKiBPcHRpb25hbGx5IGRldGVjdCB0aGUgYmF1ZCByYXRlIGZyb20gdGhlIG1vZGVtIHN0YXR1cyBtZXNzYWdlICovCisJZGVidWcoImJlZm9yZSBhdXRvYmF1ZFxuIik7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGX1BBUlNFKQorCQlhdXRvX2JhdWQoKTsKKworCS8qIFNldCB0aGUgb3B0aW9uYWwgdGltZXIgKi8KKwlhbGFybShHLnRpbWVvdXQpOyAvKiBpZiAwLCBhbGFybSBpcyBub3Qgc2V0ICovCisvL0JVRzogZGVhdGggYnkgc2lnbmFsIHdvbid0IHJlc3RvcmUgdGVybWlvcworCisJLyogT3B0aW9uYWxseSB3YWl0IGZvciBDUiBvciBMRiBiZWZvcmUgd3JpdGluZyAvZXRjL2lzc3VlICovCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGX1dBSVRDUkxGKSB7CisJCWNoYXIgY2g7CisJCWRlYnVnKCJ3YWl0aW5nIGZvciBjci1sZlxuIik7CisJCXdoaWxlIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCAmY2gsIDEpID09IDEpIHsKKwkJCWRlYnVnKCJyZWFkICV4XG4iLCAodW5zaWduZWQgY2hhciljaCk7CisJCQlpZiAoY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJbG9nbmFtZSA9IE5VTEw7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZfTk9QUk9NUFQpKSB7CisJCS8qIE5COiB0ZXJtaW9zX2luaXQgYWxyZWFkeSBzZXQgbGluZSBzcGVlZAorCQkgKiB0byBHLnNwZWVkc1swXSAqLworCQlpbnQgYmF1ZF9pbmRleCA9IDA7CisKKwkJd2hpbGUgKDEpIHsKKwkJCS8qIFJlYWQgdGhlIGxvZ2luIG5hbWUgKi8KKwkJCWRlYnVnKCJyZWFkaW5nIGxvZ2luIG5hbWVcbiIpOworCQkJbG9nbmFtZSA9IGdldF9sb2duYW1lKCk7CisJCQlpZiAobG9nbmFtZSkKKwkJCQlicmVhazsKKwkJCS8qIFdlIGFyZSBoZXJlIG9ubHkgaWYgRy5udW1zcGVlZCA+IDEgKi8KKwkJCWJhdWRfaW5kZXggPSAoYmF1ZF9pbmRleCArIDEpICUgRy5udW1zcGVlZDsKKwkJCWNmc2V0c3BlZWQoJkcudGVybWlvcywgRy5zcGVlZHNbYmF1ZF9pbmRleF0pOworCQkJc2V0X3Rlcm1pb3MoKTsKKwkJfQorCX0KKworCS8qIERpc2FibGUgdGltZXIgKi8KKwlhbGFybSgwKTsKKworCS8qIEZpbmFsaXplIHRoZSB0ZXJtaW9zIHNldHRpbmdzICovCisJdGVybWlvc19maW5hbCgpOworCisJLyogTm93IHRoZSBuZXdsaW5lIGNoYXJhY3RlciBzaG91bGQgYmUgcHJvcGVybHkgd3JpdHRlbiAqLworCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgIlxuIiwgMSk7CisKKwkvKiBMZXQgdGhlIGxvZ2luIHByb2dyYW0gdGFrZSBjYXJlIG9mIHBhc3N3b3JkIHZhbGlkYXRpb24gKi8KKwkvKiBXZSB1c2UgUEFUSCBiZWNhdXNlIHdlIHRydXN0IHRoYXQgcm9vdCBkb2Vzbid0IHNldCAiYmFkIiBQQVRILAorCSAqIGFuZCBnZXR0eSBpcyBub3Qgc3VpZC1yb290IGFwcGxldCAqLworCS8qIFdpdGggLW4sIGxvZ25hbWUgPT0gTlVMTCwgYW5kIGxvZ2luIHdpbGwgYXNrIGZvciB1c2VybmFtZSBpbnN0ZWFkICovCisJQkJfRVhFQ0xQKEcubG9naW4sIEcubG9naW4sICItLSIsIGxvZ25hbWUsIE5VTEwpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBHLmxvZ2luKTsKK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvbG9naW4uYyBiL2xvZ2ludXRpbHMvbG9naW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdiOWIyCi0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9sb2dpbi5jCkBAIC0wLDAgKzEsNDYxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb2dpbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1wXSBbLWggSE9TVF0gW1stZl0gVVNFUl0iCisvL3VzYWdlOiNkZWZpbmUgbG9naW5fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJCZWdpbiBhIG5ldyBzZXNzaW9uIG9uIHRoZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRG9uJ3QgYXV0aGVudGljYXRlICh1c2VyIGFscmVhZHkgYXV0aGVudGljYXRlZCkiCisvL3VzYWdlOiAgICAgIlxuCS1oCU5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IgorLy91c2FnZTogICAgICJcbgktcAlQcmVzZXJ2ZSBlbnZpcm9ubWVudCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorIyBpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4gIC8qIGZvciBpc19zZWxpbnV4X2VuYWJsZWQoKSAgKi8KKyMgaW5jbHVkZSA8c2VsaW51eC9nZXRfY29udGV4dF9saXN0Lmg+IC8qIGZvciBnZXRfZGVmYXVsdF9jb250ZXh0KCkgKi8KKyMgaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPiAvKiBmb3Igc2VjdXJpdHkgY2xhc3MgZGVmaW5pdGlvbnMgICovCisjZW5kaWYKKworI2lmIEVOQUJMRV9QQU0KKy8qIFBBTSBtYXkgaW5jbHVkZSA8bG9jYWxlLmg+LiBXZSBtYXkgbmVlZCB0byB1bmRlZmluZSBiYm94J3Mgc3R1YiBkZWZpbmU6ICovCisjIHVuZGVmIHNldGxvY2FsZQorLyogRm9yIHNvbWUgb2JzY3VyZSByZWFzb24sIFBBTSBpcyBub3QgaW4gcGFtL3h4eCwgYnV0IGluIHNlY3VyaXR5L3h4eC4KKyAqIEFwcGFyZW50bHkgdGhleSBsaWtlIHRvIGNvbmZ1c2UgcGVvcGxlLiAqLworIyBpbmNsdWRlIDxzZWN1cml0eS9wYW1fYXBwbC5oPgorIyBpbmNsdWRlIDxzZWN1cml0eS9wYW1fbWlzYy5oPgorc3RhdGljIGNvbnN0IHN0cnVjdCBwYW1fY29udiBjb252ID0geworCW1pc2NfY29udiwKKwlOVUxMCit9OworI2VuZGlmCisKK2VudW0geworCVRJTUVPVVQgPSA2MCwKKwlFTVBUWV9VU0VSTkFNRV9DT1VOVCA9IDEwLAorCVVTRVJOQU1FX1NJWkUgPSAzMiwKKwlUVFlOQU1FX1NJWkUgPSAzMiwKK307CisKK3N0YXRpYyBjaGFyKiBzaG9ydF90dHk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OT0xPR0lOCitzdGF0aWMgdm9pZCBkaWVfaWZfbm9sb2dpbih2b2lkKQoreworCUZJTEUgKmZwOworCWludCBjOworCWludCBlbXB0eSA9IDE7CisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKCIvZXRjL25vbG9naW4iKTsKKwlpZiAoIWZwKSAvKiBhc3N1bWluZyBpdCBkb2VzIG5vdCBleGlzdCAqLworCQlyZXR1cm47CisKKwl3aGlsZSAoKGMgPSBnZXRjKGZwKSkgIT0gRU9GKSB7CisJCWlmIChjID09ICdcbicpCisJCQliYl9wdXRjaGFyKCdccicpOworCQliYl9wdXRjaGFyKGMpOworCQllbXB0eSA9IDA7CisJfQorCWlmIChlbXB0eSkKKwkJcHV0cygiXHJcblN5c3RlbSBjbG9zZWQgZm9yIHJvdXRpbmUgbWFpbnRlbmFuY2VcciIpOworCisJZmNsb3NlKGZwKTsKKwlmZmx1c2hfYWxsKCk7CisJLyogVXNlcnMgc2F5IHRoYXQgdGhleSBkbyBuZWVkIHRoaXMgcHJpb3IgdG8gZXhpdDogKi8KKwl0Y2RyYWluKFNURE9VVF9GSUxFTk8pOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKyNlbHNlCisjIGRlZmluZSBkaWVfaWZfbm9sb2dpbigpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUNVUkVUVFkgJiYgIUVOQUJMRV9QQU0KK3N0YXRpYyBpbnQgY2hlY2tfc2VjdXJldHR5KHZvaWQpCit7CisJY2hhciAqYnVmID0gKGNoYXIqKSIvZXRjL3NlY3VyZXR0eSI7IC8qIGFueSBub24tTlVMTCBpcyBvayAqLworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9ldGMvc2VjdXJldHR5IiwgZm9wZW5fZm9yX3JlYWQpOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsICZidWYsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoc3RyY21wKGJ1Ziwgc2hvcnRfdHR5KSA9PSAwKQorCQkJYnJlYWs7CisJCWJ1ZiA9IE5VTEw7CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCS8qIGJ1ZiAhPSBOVUxMIGhlcmUgaWYgY29uZmlnIGZpbGUgd2FzIG5vdCBmb3VuZCwgZW1wdHkKKwkgKiBvciBsaW5lIHdhcyBmb3VuZCB3aGljaCBlcXVhbHMgc2hvcnRfdHR5ICovCisJcmV0dXJuIGJ1ZiAhPSBOVUxMOworfQorI2Vsc2UKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBjaGVja19zZWN1cmV0dHkodm9pZCkgeyByZXR1cm4gMTsgfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgaW5pdHNlbGludXgoY2hhciAqdXNlcm5hbWUsIGNoYXIgKmZ1bGxfdHR5LAorCQkJCQkJc2VjdXJpdHlfY29udGV4dF90ICp1c2VyX3NpZCkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3Qgb2xkX3R0eV9zaWQsIG5ld190dHlfc2lkOworCisJaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJaWYgKGdldF9kZWZhdWx0X2NvbnRleHQodXNlcm5hbWUsIE5VTEwsIHVzZXJfc2lkKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IFNJRCBmb3IgJXMiLCB1c2VybmFtZSk7CisJfQorCWlmIChnZXRmaWxlY29uKGZ1bGxfdHR5LCAmb2xkX3R0eV9zaWQpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldGZpbGVjb24oJXMpIGZhaWxlZCIsIGZ1bGxfdHR5KTsKKwl9CisJaWYgKHNlY3VyaXR5X2NvbXB1dGVfcmVsYWJlbCgqdXNlcl9zaWQsIG9sZF90dHlfc2lkLAorCQkJCVNFQ0NMQVNTX0NIUl9GSUxFLCAmbmV3X3R0eV9zaWQpICE9IDApIHsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZWN1cml0eV9jaGFuZ2Vfc2lkKCVzKSBmYWlsZWQiLCBmdWxsX3R0eSk7CisJfQorCWlmIChzZXRmaWxlY29uKGZ1bGxfdHR5LCBuZXdfdHR5X3NpZCkgIT0gMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNoc2lkKCVzLCAlcykgZmFpbGVkIiwgZnVsbF90dHksIG5ld190dHlfc2lkKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9MT0dJTl9TQ1JJUFRTCitzdGF0aWMgdm9pZCBydW5fbG9naW5fc2NyaXB0KHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICpmdWxsX3R0eSkKK3sKKwljaGFyICp0X2FyZ3ZbMl07CisKKwl0X2FyZ3ZbMF0gPSBnZXRlbnYoIkxPR0lOX1BSRV9TVUlEX1NDUklQVCIpOworCWlmICh0X2FyZ3ZbMF0pIHsKKwkJdF9hcmd2WzFdID0gTlVMTDsKKwkJeHNldGVudigiTE9HSU5fVFRZIiwgZnVsbF90dHkpOworCQl4c2V0ZW52KCJMT0dJTl9VU0VSIiwgcHctPnB3X25hbWUpOworCQl4c2V0ZW52KCJMT0dJTl9VSUQiLCB1dG9hKHB3LT5wd191aWQpKTsKKwkJeHNldGVudigiTE9HSU5fR0lEIiwgdXRvYShwdy0+cHdfZ2lkKSk7CisJCXhzZXRlbnYoIkxPR0lOX1NIRUxMIiwgcHctPnB3X3NoZWxsKTsKKwkJc3Bhd25fYW5kX3dhaXQodF9hcmd2KTsgLyogTk9NTVUtZnJpZW5kbHkgKi8KKwkJdW5zZXRlbnYoIkxPR0lOX1RUWSIpOworCQl1bnNldGVudigiTE9HSU5fVVNFUiIpOworCQl1bnNldGVudigiTE9HSU5fVUlEIik7CisJCXVuc2V0ZW52KCJMT0dJTl9HSUQiKTsKKwkJdW5zZXRlbnYoIkxPR0lOX1NIRUxMIik7CisJfQorfQorI2Vsc2UKK3ZvaWQgcnVuX2xvZ2luX3NjcmlwdChzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqZnVsbF90dHkpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF91c2VybmFtZV9vcl9kaWUoY2hhciAqYnVmLCBpbnQgc2l6ZV9idWYpCit7CisJaW50IGMsIGNudGRvd247CisKKwljbnRkb3duID0gRU1QVFlfVVNFUk5BTUVfQ09VTlQ7CisgcHJvbXB0OgorCXByaW50X2xvZ2luX3Byb21wdCgpOworCS8qIHNraXAgd2hpdGVzcGFjZSAqLworCWRvIHsKKwkJYyA9IGdldGNoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAoIS0tY250ZG93bikKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQlnb3RvIHByb21wdDsKKwkJfQorCX0gd2hpbGUgKGlzc3BhY2UoYykpOyAvKiBtYXliZSBpc2JsYW5rPyAqLworCisJKmJ1ZisrID0gYzsKKwlpZiAoIWZnZXRzKGJ1Ziwgc2l6ZV9idWYtMiwgc3RkaW4pKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKCFzdHJjaHIoYnVmLCAnXG4nKSkKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCXdoaWxlICgodW5zaWduZWQgY2hhcikqYnVmID4gJyAnKQorCQlidWYrKzsKKwkqYnVmID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgbW90ZCh2b2lkKQoreworCWludCBmZDsKKworCWZkID0gb3BlbihiYl9wYXRoX21vdGRfZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCWZmbHVzaF9hbGwoKTsKKwkJYmJfY29weWZkX2VvZihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCWNsb3NlKGZkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJLyogVGhpcyBpcyB0aGUgZXNjYXBlIGhhdGNoISAgUG9vciBzZXJpYWwgbGluZSB1c2VycyBhbmQgdGhlIGxpa2UKKwkgKiBhcnJpdmUgaGVyZSB3aGVuIHRoZWlyIGNvbm5lY3Rpb24gaXMgYnJva2VuLgorCSAqIFdlIGRvbid0IHdhbnQgdG8gYmxvY2sgaGVyZSAqLworCW5kZWxheV9vbigxKTsKKwlwcmludGYoIlxyXG5Mb2dpbiB0aW1lZCBvdXQgYWZ0ZXIgJWQgc2Vjb25kc1xyXG4iLCBUSU1FT1VUKTsKKwlmZmx1c2hfYWxsKCk7CisJLyogdW5peCBBUEkgaXMgYnJhaW4gZGFtYWdlZCByZWdhcmRpbmcgT19OT05CTE9DSywKKwkgKiB3ZSBzaG91bGQgdW5kbyBpdCwgb3IgZWxzZSB3ZSBjYW4gYWZmZWN0IG90aGVyIHByb2Nlc3NlcyAqLworCW5kZWxheV9vZmYoMSk7CisJX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworaW50IGxvZ2luX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsb2dpbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCUxPR0lOX09QVF9mID0gKDE8PDApLAorCQlMT0dJTl9PUFRfaCA9ICgxPDwxKSwKKwkJTE9HSU5fT1BUX3AgPSAoMTw8MiksCisJfTsKKwljaGFyICpmcm9taG9zdDsKKwljaGFyIHVzZXJuYW1lW1VTRVJOQU1FX1NJWkVdOworCWludCBydW5fYnlfcm9vdDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwljaGFyICpvcHRfaG9zdCA9IE5VTEw7CisJY2hhciAqb3B0X3VzZXIgPSBvcHRfdXNlcjsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqZnVsbF90dHk7CisJSUZfU0VMSU5VWChzZWN1cml0eV9jb250ZXh0X3QgdXNlcl9zaWQgPSBOVUxMOykKKyNpZiBFTkFCTEVfUEFNCisJaW50IHBhbXJldDsKKwlwYW1faGFuZGxlX3QgKnBhbWg7CisJY29uc3QgY2hhciAqcGFtdXNlcjsKKwljb25zdCBjaGFyICpmYWlsZWRfbXNnOworCXN0cnVjdCBwYXNzd2QgcHdkc3RydWN0OworCWNoYXIgcHdkYnVmWzI1Nl07CisJY2hhciAqKnBhbWVudjsKKyNlbmRpZgorCisJdXNlcm5hbWVbMF0gPSAnXDAnOworCXNpZ25hbChTSUdBTFJNLCBhbGFybV9oYW5kbGVyKTsKKwlhbGFybShUSU1FT1VUKTsKKworCS8qIE1vcmUgb2Ygc3VpZCBwYXJhbm9pYSBpZiBjYWxsZWQgYnkgbm9uLXJvb3Q6ICovCisJLyogQ2xlYXIgZGFuZ2Vyb3VzIHN0dWZmLCBzZXQgUEFUSCAqLworCXJ1bl9ieV9yb290ID0gIXNhbml0aXplX2Vudl9pZl9zdWlkKCk7CisKKwkvKiBNYW5kYXRvcnkgcGFyYW5vaWEgZm9yIHN1aWQgYXBwbGV0OgorCSAqIGVuc3VyZSB0aGF0IGZkIyAwLDEsMiBhcmUgb3BlbmVkIChhdCBsZWFzdCB0byAvZGV2L251bGwpCisJICogYW5kIGFueSBleHRyYSBvcGVuIGZkJ3MgYXJlIGNsb3NlZC4KKwkgKiAoVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlzIG1pc2xlYWRpbmcuIE5vdCBkYWVtb25pemluZyBoZXJlLikgKi8KKwliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX09OTFlfU0FOSVRJWkUgfCBEQUVNT05fQ0xPU0VfRVhUUkFfRkRTLCBOVUxMKTsKKworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmOmg6cCIsICZvcHRfdXNlciwgJm9wdF9ob3N0KTsKKwlpZiAob3B0ICYgTE9HSU5fT1BUX2YpIHsKKwkJaWYgKCFydW5fYnlfcm9vdCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCItZiBpcyBmb3Igcm9vdCBvbmx5Iik7CisJCXNhZmVfc3RybmNweSh1c2VybmFtZSwgb3B0X3VzZXIsIHNpemVvZih1c2VybmFtZSkpOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlswXSkgLyogdXNlciBmcm9tIGNvbW1hbmQgbGluZSAoZ2V0dHkpICovCisJCXNhZmVfc3RybmNweSh1c2VybmFtZSwgYXJndlswXSwgc2l6ZW9mKHVzZXJuYW1lKSk7CisKKwkvKiBMZXQncyBmaW5kIG91dCBhbmQgbWVtb3JpemUgb3VyIHR0eSAqLworCWlmICghaXNhdHR5KFNURElOX0ZJTEVOTykgfHwgIWlzYXR0eShTVERPVVRfRklMRU5PKSB8fCAhaXNhdHR5KFNUREVSUl9GSUxFTk8pKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOyAgLyogTXVzdCBiZSBhIHRlcm1pbmFsICovCisJZnVsbF90dHkgPSB4bWFsbG9jX3R0eW5hbWUoU1RESU5fRklMRU5PKTsKKwlpZiAoIWZ1bGxfdHR5KQorCQlmdWxsX3R0eSA9IHhzdHJkdXAoIlVOS05PV04iKTsKKwlzaG9ydF90dHkgPSBza2lwX2Rldl9wZngoZnVsbF90dHkpOworCisJaWYgKG9wdF9ob3N0KSB7CisJCWZyb21ob3N0ID0geGFzcHJpbnRmKCIgb24gJyVzJyBmcm9tICclcyciLCBzaG9ydF90dHksIG9wdF9ob3N0KTsKKwl9IGVsc2UgeworCQlmcm9taG9zdCA9IHhhc3ByaW50ZigiIG9uICclcyciLCBzaG9ydF90dHkpOworCX0KKworCS8qIFdhcyBicmVha2luZyAibG9naW4gPHVzZXJuYW1lPiIgZnJvbSBzaGVsbCBjb21tYW5kIGxpbmU6ICovCisJLypiYl9zZXRwZ3JwKCk7Ki8KKworCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQgfCBMT0dfQ09OUywgTE9HX0FVVEgpOworCisJd2hpbGUgKDEpIHsKKwkJLyogZmx1c2ggYXdheSBhbnkgdHlwZS1haGVhZCAoYXMgZ2V0dHkgZG9lcykgKi8KKwkJdGNmbHVzaCgwLCBUQ0lGTFVTSCk7CisKKwkJaWYgKCF1c2VybmFtZVswXSkKKwkJCWdldF91c2VybmFtZV9vcl9kaWUodXNlcm5hbWUsIHNpemVvZih1c2VybmFtZSkpOworCisjaWYgRU5BQkxFX1BBTQorCQlwYW1yZXQgPSBwYW1fc3RhcnQoImxvZ2luIiwgdXNlcm5hbWUsICZjb252LCAmcGFtaCk7CisJCWlmIChwYW1yZXQgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAic3RhcnQiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJLyogc2V0IFRUWSAoc28gdGhpbmdzIGxpa2Ugc2VjdXJldHR5IHdvcmspICovCisJCXBhbXJldCA9IHBhbV9zZXRfaXRlbShwYW1oLCBQQU1fVFRZLCBzaG9ydF90dHkpOworCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gInNldF9pdGVtKFRUWSkiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJLyogc2V0IFJIT1NUICovCisJCWlmIChvcHRfaG9zdCkgeworCQkJcGFtcmV0ID0gcGFtX3NldF9pdGVtKHBhbWgsIFBBTV9SSE9TVCwgb3B0X2hvc3QpOworCQkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJCWZhaWxlZF9tc2cgPSAic2V0X2l0ZW0oUkhPU1QpIjsKKwkJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJCX0KKwkJfQorCQlwYW1yZXQgPSBwYW1fYXV0aGVudGljYXRlKHBhbWgsIDApOworCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gImF1dGhlbnRpY2F0ZSI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJCS8qIFRPRE86IG9yIGp1c3QgImdvdG8gYXV0aF9mYWlsZWQiCisJCQkgKiBzaW5jZSB1c2VyIHNlZW1zIHRvIGVudGVyIHdyb25nIHBhc3N3b3JkCisJCQkgKiAoaW4gdGhpcyBjYXNlIHBhbXJldCA9PSA3KQorCQkJICovCisJCX0KKwkJLyogY2hlY2sgdGhhdCB0aGUgYWNjb3VudCBpcyBoZWFsdGh5ICovCisJCXBhbXJldCA9IHBhbV9hY2N0X21nbXQocGFtaCwgMCk7CisJCWlmIChwYW1yZXQgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAiYWNjdF9tZ210IjsKKwkJCWdvdG8gcGFtX2F1dGhfZmFpbGVkOworCQl9CisJCS8qIHJlYWQgdXNlciBiYWNrICovCisJCXBhbXVzZXIgPSBOVUxMOworCQkvKiBnY2M6ICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgYnJlYWtzIGFsaWFzaW5nIHJ1bGVzLi4uIgorCQkgKiB0aHVzIHdlIGNhc3QgdG8gKHZvaWQqKSAqLworCQlpZiAocGFtX2dldF9pdGVtKHBhbWgsIFBBTV9VU0VSLCAodm9pZCopJnBhbXVzZXIpICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gImdldF9pdGVtKFVTRVIpIjsKKwkJCWdvdG8gcGFtX2F1dGhfZmFpbGVkOworCQl9CisJCWlmICghcGFtdXNlciB8fCAhcGFtdXNlclswXSkKKwkJCWdvdG8gYXV0aF9mYWlsZWQ7CisJCXNhZmVfc3RybmNweSh1c2VybmFtZSwgcGFtdXNlciwgc2l6ZW9mKHVzZXJuYW1lKSk7CisJCS8qIERvbid0IHVzZSAicHcgPSBnZXRwd25hbSh1c2VybmFtZSk7IiwKKwkJICogUEFNIGlzIHNhaWQgdG8gYmUgY2FwYWJsZSBvZiBkZXN0cm95aW5nIHN0YXRpYyBzdG9yYWdlCisJCSAqIHVzZWQgYnkgZ2V0cHduYW0oKS4gV2UgYXJlIHVzaW5nIHNhZmUocikgZnVuY3Rpb24gKi8KKwkJcHcgPSBOVUxMOworCQlnZXRwd25hbV9yKHVzZXJuYW1lLCAmcHdkc3RydWN0LCBwd2RidWYsIHNpemVvZihwd2RidWYpLCAmcHcpOworCQlpZiAoIXB3KQorCQkJZ290byBhdXRoX2ZhaWxlZDsKKwkJcGFtcmV0ID0gcGFtX29wZW5fc2Vzc2lvbihwYW1oLCAwKTsKKwkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJZmFpbGVkX21zZyA9ICJvcGVuX3Nlc3Npb24iOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJcGFtcmV0ID0gcGFtX3NldGNyZWQocGFtaCwgUEFNX0VTVEFCTElTSF9DUkVEKTsKKwkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJZmFpbGVkX21zZyA9ICJzZXRjcmVkIjsKKwkJCWdvdG8gcGFtX2F1dGhfZmFpbGVkOworCQl9CisJCWJyZWFrOyAvKiBzdWNjZXNzLCBjb250aW51ZSBsb2dpbiBwcm9jZXNzICovCisKKyBwYW1fYXV0aF9mYWlsZWQ6CisJCS8qIHN5c2xvZywgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHBvdGVudGlhbCBhdHRhY2tlcgorCQkgKiB0byBrbm93IF93aHlfIGxvZ2luIGZhaWxlZCAqLworCQlzeXNsb2coTE9HX1dBUk5JTkcsICJwYW1fJXMgY2FsbCBmYWlsZWQ6ICVzICglZCkiLCBmYWlsZWRfbXNnLAorCQkJCQlwYW1fc3RyZXJyb3IocGFtaCwgcGFtcmV0KSwgcGFtcmV0KTsKKwkJc2FmZV9zdHJuY3B5KHVzZXJuYW1lLCAiVU5LTk9XTiIsIHNpemVvZih1c2VybmFtZSkpOworI2Vsc2UgLyogbm90IFBBTSAqLworCQlwdyA9IGdldHB3bmFtKHVzZXJuYW1lKTsKKwkJaWYgKCFwdykgeworCQkJc3RyY3B5KHVzZXJuYW1lLCAiVU5LTk9XTiIpOworCQkJZ290byBmYWtlX2l0OworCQl9CisKKwkJaWYgKHB3LT5wd19wYXNzd2RbMF0gPT0gJyEnIHx8IHB3LT5wd19wYXNzd2RbMF0gPT0gJyonKQorCQkJZ290byBhdXRoX2ZhaWxlZDsKKworCQlpZiAob3B0ICYgTE9HSU5fT1BUX2YpCisJCQlicmVhazsgLyogLWYgVVNFUjogc3VjY2VzcyB3aXRob3V0IGFza2luZyBwYXNzd2QgKi8KKworCQlpZiAocHctPnB3X3VpZCA9PSAwICYmICFjaGVja19zZWN1cmV0dHkoKSkKKwkJCWdvdG8gYXV0aF9mYWlsZWQ7CisKKwkJLyogRG9uJ3QgY2hlY2sgdGhlIHBhc3N3b3JkIGlmIHBhc3N3b3JkIGVudHJ5IGlzIGVtcHR5ICghKSAqLworCQlpZiAoIXB3LT5wd19wYXNzd2RbMF0pCisJCQlicmVhazsKKyBmYWtlX2l0OgorCQkvKiBhdXRob3JpemF0aW9uIHRha2VzIHBsYWNlIGhlcmUgKi8KKwkJaWYgKGNvcnJlY3RfcGFzc3dvcmQocHcpKQorCQkJYnJlYWs7CisjZW5kaWYgLyogRU5BQkxFX1BBTSAqLworIGF1dGhfZmFpbGVkOgorCQlvcHQgJj0gfkxPR0lOX09QVF9mOworCQliYl9kb19kZWxheShMT0dJTl9GQUlMX0RFTEFZKTsKKwkJLyogVE9ETzogZG9lc24ndCBzb3VuZCBsaWtlIGNvcnJlY3QgRW5nbGlzaCBwaHJhc2UgdG8gbWUgKi8KKwkJcHV0cygiTG9naW4gaW5jb3JyZWN0Iik7CisJCWlmICgrK2NvdW50ID09IDMpIHsKKwkJCXN5c2xvZyhMT0dfV0FSTklORywgImludmFsaWQgcGFzc3dvcmQgZm9yICclcyclcyIsCisJCQkJCQl1c2VybmFtZSwgZnJvbWhvc3QpOworCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShmcm9taG9zdCk7CisKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwkJdXNlcm5hbWVbMF0gPSAnXDAnOworCX0gLyogd2hpbGUgKDEpICovCisKKwlhbGFybSgwKTsKKwkvKiBXZSBjYW4gaWdub3JlIC9ldGMvbm9sb2dpbiBpZiB3ZSBhcmUgbG9nZ2luZyBpbiBhcyByb290LAorCSAqIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgd2UgYXJlIHJ1biBieSByb290IG9yIG5vdCAqLworCWlmIChwdy0+cHdfdWlkICE9IDApCisJCWRpZV9pZl9ub2xvZ2luKCk7CisKKwlJRl9TRUxJTlVYKGluaXRzZWxpbnV4KHVzZXJuYW1lLCBmdWxsX3R0eSwgJnVzZXJfc2lkKSk7CisKKwkvKiBUcnkgdGhlc2UsIGJ1dCBkb24ndCBjb21wbGFpbiBpZiB0aGV5IGZhaWwuCisJICogX2ZfY2hvd24gaXMgc2FmZSB3cnQgcmFjZSB0PXR0eW5hbWUoMCk7Li4uO2Nob3duKHQpOyAqLworCWZjaG93bigwLCBwdy0+cHdfdWlkLCBwdy0+cHdfZ2lkKTsKKwlmY2htb2QoMCwgMDYwMCk7CisKKwl1cGRhdGVfdXRtcChnZXRwaWQoKSwgVVNFUl9QUk9DRVNTLCBzaG9ydF90dHksIHVzZXJuYW1lLCBydW5fYnlfcm9vdCA/IG9wdF9ob3N0IDogTlVMTCk7CisKKwkvKiBXZSB0cnVzdCBlbnZpcm9ubWVudCBvbmx5IGlmIHdlIHJ1biBieSByb290ICovCisJaWYgKEVOQUJMRV9MT0dJTl9TQ1JJUFRTICYmIHJ1bl9ieV9yb290KQorCQlydW5fbG9naW5fc2NyaXB0KHB3LCBmdWxsX3R0eSk7CisKKwljaGFuZ2VfaWRlbnRpdHkocHcpOworCXNldHVwX2Vudmlyb25tZW50KHB3LT5wd19zaGVsbCwKKwkJCSghKG9wdCAmIExPR0lOX09QVF9wKSAqIFNFVFVQX0VOVl9DTEVBUkVOVikgKyBTRVRVUF9FTlZfQ0hBTkdFRU5WLAorCQkJcHcpOworCisjaWYgRU5BQkxFX1BBTQorCS8qIE1vZHVsZXMgc3VjaCBhcyBwYW1fZW52IHdpbGwgc2V0dXAgdGhlIFBBTSBlbnZpcm9ubWVudCwKKwkgKiB3aGljaCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIG5ldyBlbnZpcm9ubWVudC4gKi8KKwlwYW1lbnYgPSBwYW1fZ2V0ZW52bGlzdChwYW1oKTsKKwlpZiAocGFtZW52KSB3aGlsZSAoKnBhbWVudikgeworCQlwdXRlbnYoKnBhbWVudik7CisJCXBhbWVudisrOworCX0KKyNlbmRpZgorCisJbW90ZCgpOworCisJaWYgKHB3LT5wd191aWQgPT0gMCkKKwkJc3lzbG9nKExPR19JTkZPLCAicm9vdCBsb2dpbiVzIiwgZnJvbWhvc3QpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKGZyb21ob3N0KTsKKworCS8qIHdlbGwsIGEgc2ltcGxlIHNldGV4ZWNjb24oKSBoZXJlIHdvdWxkIGRvIHRoZSBqb2IgYXMgd2VsbCwKKwkgKiBidXQgbGV0J3MgcGxheSB0aGUgZ2FtZSBmb3Igbm93ICovCisJSUZfU0VMSU5VWChzZXRfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KHVzZXJfc2lkKTspCisKKwkvLyB1dGlsLWxpbnV4IGxvZ2luIGFsc28gZG9lczoKKwkvLyAvKiBzdGFydCBuZXcgc2Vzc2lvbiAqLworCS8vIHNldHNpZCgpOworCS8vIC8qIFRJT0NTQ1RUWTogc3RlYWwgdHR5IGZyb20gb3RoZXIgcHJvY2VzcyBncm91cCAqLworCS8vIGlmIChpb2N0bCgwLCBUSU9DU0NUVFksIDEpKSBlcnJvcl9tc2cuLi4KKwkvLyBCQm94IGxvZ2luIHVzZWQgdG8gZG8gdGhpcyAoc2VlIGFib3ZlKToKKwkvLyBiYl9zZXRwZ3JwKCk7CisJLy8gSWYgdGhpcyBzdHVmZiBpcyByZWFsbHkgbmVlZGVkLCBhZGQgaXQgYW5kIGV4cGxhaW4gd2h5IQorCisJLyogU2V0IHNpZ25hbHMgdG8gZGVmYXVsdHMgKi8KKwkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJLypzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7Ki8KKworCS8qIElzIHRoaXMgY29ycmVjdD8gVGhpcyB3YXkgdXNlciBjYW4gY3RybC1jIG91dCBvZiAvZXRjL3Byb2ZpbGUsCisJICogcG90ZW50aWFsbHkgY3JlYXRpbmcgc2VjdXJpdHkgYnJlYWNoICh0ZXN0ZWQgd2l0aCBiYXNoIDMuMCkuCisJICogQnV0IHdpdGhvdXQgdGhpcywgYmFzaCAzLjAgd2lsbCBub3QgZW5hYmxlIGN0cmwtYyBlaXRoZXIuCisJICogTWF5YmUgYmFzaCBpcyBidWdneT8KKwkgKiBOZWVkIHRvIGZpbmQgb3V0IHdoYXQgc3RhbmRhcmRzIHNheSBhYm91dCAvYmluL2xvZ2luIC0KKwkgKiBzaG91bGQgd2UgbGVhdmUgU0lHSU5UIGV0YyBlbmFibGVkIG9yIGRpc2FibGVkPyAqLworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCisJLyogRXhlYyBsb2dpbiBzaGVsbCB3aXRoIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyAqLworCXJ1bl9zaGVsbChwdy0+cHdfc2hlbGwsIDEsIE5VTEwsIE5VTEwpOworCisJLyogcmV0dXJuIEVYSVRfRkFJTFVSRTsgLSBub3QgcmVhY2hlZCAqLworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9wYXNzd2QuYyBiL2xvZ2ludXRpbHMvcGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmYWZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvcGFzc3dkLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHBhc3N3ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtVU0VSXSIKKy8vdXNhZ2U6I2RlZmluZSBwYXNzd2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgVVNFUidzIHBhc3N3b3JkIChkZWZhdWx0OiBjdXJyZW50IHVzZXIpIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEgQUxHCUVuY3J5cHRpb24gbWV0aG9kIgorLy91c2FnZTogICAgICJcbgktZAlTZXQgcGFzc3dvcmQgdG8gJyciCisvL3VzYWdlOiAgICAgIlxuCS1sCUxvY2sgKGRpc2FibGUpIGFjY291bnQiCisvL3VzYWdlOiAgICAgIlxuCS11CVVubG9jayAoZW5hYmxlKSBhY2NvdW50IgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworc3RhdGljIHZvaWQgbnVrZV9zdHIoY2hhciAqc3RyKQoreworCWlmIChzdHIpIG1lbXNldChzdHIsIDAsIHN0cmxlbihzdHIpKTsKK30KKworc3RhdGljIGNoYXIqIG5ld19wYXNzd29yZChjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdywgdWlkX3QgbXl1aWQsIGNvbnN0IGNoYXIgKmFsZ28pCit7CisJY2hhciBzYWx0W01BWF9QV19TQUxUX0xFTl07CisJY2hhciAqb3JpZyA9IChjaGFyKikiIjsKKwljaGFyICpuZXdwID0gTlVMTDsKKwljaGFyICpjcCA9IE5VTEw7CisJY2hhciAqcmV0ID0gTlVMTDsgLyogZmFpbHVyZSBzbyBmYXIgKi8KKworCWlmIChteXVpZCAhPSAwICYmIHB3LT5wd19wYXNzd2RbMF0pIHsKKwkJY2hhciAqZW5jcnlwdGVkOworCisJCW9yaWcgPSBiYl9hc2tfc3RkaW4oIk9sZCBwYXNzd29yZDogIik7IC8qIHJldHVybnMgcHRyIHRvIHN0YXRpYyAqLworCQlpZiAoIW9yaWcpCisJCQlnb3RvIGVycl9yZXQ7CisJCWVuY3J5cHRlZCA9IHB3X2VuY3J5cHQob3JpZywgcHctPnB3X3Bhc3N3ZCwgMSk7IC8qIHJldHVybnMgbWFsbG9jZWQgc3RyICovCisJCWlmIChzdHJjbXAoZW5jcnlwdGVkLCBwdy0+cHdfcGFzc3dkKSAhPSAwKSB7CisJCQlzeXNsb2coTE9HX1dBUk5JTkcsICJpbmNvcnJlY3QgcGFzc3dvcmQgZm9yICVzIiwgcHctPnB3X25hbWUpOworCQkJYmJfZG9fZGVsYXkoTE9HSU5fRkFJTF9ERUxBWSk7CisJCQlwdXRzKCJJbmNvcnJlY3QgcGFzc3dvcmQiKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGVuY3J5cHRlZCk7CisJfQorCW9yaWcgPSB4c3RyZHVwKG9yaWcpOyAvKiBvciBlbHNlIGJiX2Fza19zdGRpbigpIHdpbGwgZGVzdHJveSBpdCAqLworCW5ld3AgPSBiYl9hc2tfc3RkaW4oIk5ldyBwYXNzd29yZDogIik7IC8qIHJldHVybnMgcHRyIHRvIHN0YXRpYyAqLworCWlmICghbmV3cCkKKwkJZ290byBlcnJfcmV0OworCW5ld3AgPSB4c3RyZHVwKG5ld3ApOyAvKiB3ZSBhcmUgZ29pbmcgdG8gYmJfYXNrX3N0ZGluKCkgYWdhaW4sIHNvIHNhdmUgaXQgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0sKKwkgJiYgb2JzY3VyZShvcmlnLCBuZXdwLCBwdykKKwkgJiYgbXl1aWQgIT0gMAorCSkgeworCQlnb3RvIGVycl9yZXQ7IC8qIG5vbi1yb290IGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgd2VhayBwYXNzd2QgKi8KKwl9CisKKwljcCA9IGJiX2Fza19zdGRpbigiUmV0eXBlIHBhc3N3b3JkOiAiKTsKKwlpZiAoIWNwKQorCQlnb3RvIGVycl9yZXQ7CisJaWYgKHN0cmNtcChjcCwgbmV3cCkgIT0gMCkgeworCQlwdXRzKCJQYXNzd29yZHMgZG9uJ3QgbWF0Y2giKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWNyeXB0X21ha2VfcHdfc2FsdChzYWx0LCBhbGdvKTsKKworCS8qIHB3X2VuY3J5cHQgcmV0dXJucyBtYWxsb2NlZCBzdHIgKi8KKwlyZXQgPSBwd19lbmNyeXB0KG5ld3AsIHNhbHQsIDEpOworCS8qIHdoZWUsIHN1Y2Nlc3MhICovCisKKyBlcnJfcmV0OgorCW51a2Vfc3RyKG9yaWcpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShvcmlnKTsKKworCW51a2Vfc3RyKG5ld3ApOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShuZXdwKTsKKworCW51a2Vfc3RyKGNwKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcGFzc3dkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXNzd2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfYWxnbyAgID0gKDEgPDwgMCksIC8qIC1hIC0gcGFzc3dvcmQgYWxnb3JpdGhtICovCisJCU9QVF9sb2NrICAgPSAoMSA8PCAxKSwgLyogLWwgLSBsb2NrIGFjY291bnQgKi8KKwkJT1BUX3VubG9jayA9ICgxIDw8IDIpLCAvKiAtdSAtIHVubG9jayBhY2NvdW50ICovCisJCU9QVF9kZWxldGUgPSAoMSA8PCAzKSwgLyogLWQgLSBkZWxldGUgcGFzc3dvcmQgKi8KKwkJT1BUX2x1ZCAgICA9IE9QVF9sb2NrIHwgT1BUX3VubG9jayB8IE9QVF9kZWxldGUsCisJfTsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IHJjOworCWNvbnN0IGNoYXIgKm9wdF9hID0gImQiOyAvKiBkZXMgKi8KKwljb25zdCBjaGFyICpmaWxlbmFtZTsKKwljaGFyICpteW5hbWU7CisJY2hhciAqbmFtZTsKKwljaGFyICpuZXdwOworCXN0cnVjdCBwYXNzd2QgKnB3OworCXVpZF90IG15dWlkOworCXN0cnVjdCBybGltaXQgcmxpbWl0X2ZzaXplOworCWNoYXIgYzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJLyogVXNpbmcgX3IgZnVuY3Rpb24gdG8gYXZvaWQgcHVsbGluZyBpbiBzdGF0aWMgYnVmZmVycyAqLworCXN0cnVjdCBzcHdkIHNwdzsKKwljaGFyIGJ1ZmZlclsyNTZdOworI2VuZGlmCisKKwlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19BVVRIKTsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYTpsdWQiLCAmb3B0X2EpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlteXVpZCA9IGdldHVpZCgpOworCS8qIC1sLCAtdSwgLWQgcmVxdWlyZSByb290IHByaXYgYW5kIHVzZXJuYW1lIGFyZ3VtZW50ICovCisJaWYgKChvcHQgJiBPUFRfbHVkKSAmJiAobXl1aWQgIT0gMCB8fCAhYXJndlswXSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIFdpbGwgY29tcGxhaW4gYW5kIGRpZSBpZiB1c2VybmFtZSBub3QgZm91bmQgKi8KKwlteW5hbWUgPSB4c3RyZHVwKHh1aWQydW5hbWUobXl1aWQpKTsKKwluYW1lID0gYXJndlswXSA/IGFyZ3ZbMF0gOiBteW5hbWU7CisKKwlwdyA9IHhnZXRwd25hbShuYW1lKTsKKwlpZiAobXl1aWQgIT0gMCAmJiBwdy0+cHdfdWlkICE9IG15dWlkKSB7CisJCS8qIExPR01PREVfQk9USCAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgY2FuJ3QgY2hhbmdlIHBhc3N3b3JkIGZvciAlcyIsIG15bmFtZSwgbmFtZSk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCXsKKwkJLyogZ2V0c3BuYW1fciBtYXkgcmV0dXJuIDAgeWV0IHNldCByZXN1bHQgdG8gTlVMTC4KKwkJICogQXQgbGVhc3QgZ2xpYmMgMi40IGRvZXMgdGhpcy4gQmUgZXh0cmEgcGFyYW5vaWQgaGVyZS4gKi8KKwkJc3RydWN0IHNwd2QgKnJlc3VsdCA9IE5VTEw7CisJCWVycm5vID0gMDsKKwkJaWYgKGdldHNwbmFtX3IocHctPnB3X25hbWUsICZzcHcsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZyZXN1bHQpICE9IDAKKwkJIHx8ICFyZXN1bHQgLyogbm8gZXJyb3IsIGJ1dCBubyByZWNvcmQgZm91bmQgZWl0aGVyICovCisJCSB8fCBzdHJjbXAocmVzdWx0LT5zcF9uYW1wLCBwdy0+cHdfbmFtZSkgIT0gMCAvKiBwYXJhbm9pYSAqLworCQkpIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCQkvKiBMT0dNT0RFX0JPVEggKi8KKwkJCQliYl9wZXJyb3JfbXNnKCJubyByZWNvcmQgb2YgJXMgaW4gJXMsIHVzaW5nICVzIiwKKwkJCQkJbmFtZSwgYmJfcGF0aF9zaGFkb3dfZmlsZSwKKwkJCQkJYmJfcGF0aF9wYXNzd2RfZmlsZSk7CisJCQl9CisJCQkvKiBlbHNlOiAvZXRjL3NoYWRvdyBkb2VzIG5vdCBleGlzdCwKKwkJCSAqIGFwcGFyZW50bHkgd2UgYXJlIG9uIGEgc2hhZG93LWxlc3Mgc3lzdGVtLAorCQkJICogbm8gc3VycHJpc2UgdGhlcmUgKi8KKwkJfSBlbHNlIHsKKwkJCXB3LT5wd19wYXNzd2QgPSByZXN1bHQtPnNwX3B3ZHA7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIERlY2lkZSB3aGF0IHRoZSBuZXcgcGFzc3dvcmQgd2lsbCBiZSAqLworCW5ld3AgPSBOVUxMOworCWMgPSBwdy0+cHdfcGFzc3dkWzBdIC0gJyEnOworCWlmICghKG9wdCAmIE9QVF9sdWQpKSB7CisJCWlmIChteXVpZCAhPSAwICYmICFjKSB7IC8qIHBhc3N3ZCBzdGFydHMgd2l0aCAnIScgKi8KKwkJCS8qIExPR01PREVfQk9USCAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNoYW5nZSAiCisJCQkJCSJsb2NrZWQgcGFzc3dvcmQgZm9yICVzIiwgbmFtZSk7CisJCX0KKwkJcHJpbnRmKCJDaGFuZ2luZyBwYXNzd29yZCBmb3IgJXNcbiIsIG5hbWUpOworCQluZXdwID0gbmV3X3Bhc3N3b3JkKHB3LCBteXVpZCwgb3B0X2EpOworCQlpZiAoIW5ld3ApIHsKKwkJCWxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInBhc3N3b3JkIGZvciAlcyBpcyB1bmNoYW5nZWQiLCBuYW1lKTsKKwkJfQorCX0gZWxzZSBpZiAob3B0ICYgT1BUX2xvY2spIHsKKwkJaWYgKCFjKQorCQkJZ290byBza2lwOyAvKiBwYXNzd2Qgc3RhcnRzIHdpdGggJyEnICovCisJCW5ld3AgPSB4YXNwcmludGYoIiElcyIsIHB3LT5wd19wYXNzd2QpOworCX0gZWxzZSBpZiAob3B0ICYgT1BUX3VubG9jaykgeworCQlpZiAoYykKKwkJCWdvdG8gc2tpcDsgLyogbm90ICchJyAqLworCQkvKiBwdy0+cHdfcGFzc3dkIHBvaW50cyB0byBzdGF0aWMgc3RvcmFnZSwKKwkJICogc3RyZHVwJ2luZyB0byBhdm9pZCBuYXN0eSBzdXJwcml6ZXMgKi8KKwkJbmV3cCA9IHhzdHJkdXAoJnB3LT5wd19wYXNzd2RbMV0pOworCX0gZWxzZSBpZiAob3B0ICYgT1BUX2RlbGV0ZSkgeworCQluZXdwID0gKGNoYXIqKSIiOworCX0KKworCXJsaW1pdF9mc2l6ZS5ybGltX2N1ciA9IHJsaW1pdF9mc2l6ZS5ybGltX21heCA9IDUxMkwgKiAzMDAwMDsKKwlzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCAmcmxpbWl0X2ZzaXplKTsKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdIVVApCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1FVSVQpCisJCSwgU0lHX0lHTik7CisJdW1hc2soMDc3KTsKKwl4c2V0dWlkKDApOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCWZpbGVuYW1lID0gYmJfcGF0aF9zaGFkb3dfZmlsZTsKKwlyYyA9IHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9zaGFkb3dfZmlsZSwgbmFtZSwgbmV3cCwgTlVMTCk7CisJaWYgKHJjID4gMCkKKwkJLyogcGFzc3dvcmQgaW4gL2V0Yy9zaGFkb3cgd2FzIHVwZGF0ZWQgKi8KKwkJbmV3cCA9IChjaGFyKikgIngiOworCWlmIChyYyA+PSAwKQorCQkvKiAwID0gL2V0Yy9zaGFkb3cgbWlzc2luZyAobm90IGFuIGVycm9yKSwgPjAgPSBwYXNzd2QgY2hhbmdlZCBpbiAvZXRjL3NoYWRvdyAqLworI2VuZGlmCisJeworCQlmaWxlbmFtZSA9IGJiX3BhdGhfcGFzc3dkX2ZpbGU7CisJCXJjID0gdXBkYXRlX3Bhc3N3ZChiYl9wYXRoX3Bhc3N3ZF9maWxlLCBuYW1lLCBuZXdwLCBOVUxMKTsKKwl9CisJLyogTE9HTU9ERV9CT1RIICovCisJaWYgKHJjIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHVwZGF0ZSBwYXNzd29yZCBmaWxlICVzIiwgZmlsZW5hbWUpOworCWJiX2luZm9fbXNnKCJQYXNzd29yZCBmb3IgJXMgY2hhbmdlZCBieSAlcyIsIG5hbWUsIG15bmFtZSk7CisKKwkvKmlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShuZXdwKTsgLSBjYW4ndCwgaXQgbWF5IGJlIG5vbi1tYWxsb2NlZCAqLworIHNraXA6CisJaWYgKCFuZXdwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYXNzd29yZCBmb3IgJXMgaXMgYWxyZWFkeSAlc2xvY2tlZCIsCisJCQluYW1lLCAob3B0ICYgT1BUX3VubG9jaykgPyAidW4iIDogIiIpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShteW5hbWUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9zdS5jIGIvbG9naW51dGlscy9zdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWE3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL3N1LmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgc3UgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvL3VzYWdlOiNkZWZpbmUgc3VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbLV0gW1VTRVJdIgorLy91c2FnZTojZGVmaW5lIHN1X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIHNoZWxsIHVuZGVyIFVTRVIgKGJ5IGRlZmF1bHQsIHJvb3QpXG4iCisvL3VzYWdlOiAgICAgIlxuCS0sLWwJQ2xlYXIgZW52aXJvbm1lbnQsIHJ1biBzaGVsbCBhcyBsb2dpbiBzaGVsbCIKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLW0JRG8gbm90IHNldCBuZXcgJEhPTUUsICRTSEVMTCwgJFVTRVIsICRMT0dOQU1FIgorLy91c2FnZTogICAgICJcbgktYyBDTUQJQ29tbWFuZCB0byBwYXNzIHRvICdzaCAtYyciCisvL3VzYWdlOiAgICAgIlxuCS1zIFNICVNoZWxsIHRvIHVzZSBpbnN0ZWFkIG9mIHVzZXIncyBkZWZhdWx0IgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUworLyogUmV0dXJuIDEgaWYgU0hFTEwgaXMgYSByZXN0cmljdGVkIHNoZWxsIChvbmUgbm90IHJldHVybmVkIGJ5CisgKiBnZXR1c2Vyc2hlbGwpLCBlbHNlIDAsIG1lYW5pbmcgaXQgaXMgYSBzdGFuZGFyZCBzaGVsbC4gICovCitzdGF0aWMgaW50IHJlc3RyaWN0ZWRfc2hlbGwoY29uc3QgY2hhciAqc2hlbGwpCit7CisJY2hhciAqbGluZTsKKwlpbnQgcmVzdWx0ID0gMTsKKworCS8qc2V0dXNlcnNoZWxsKCk7IC0gZ2V0dXNlcnNoZWxsIGRvZXMgaXQgaXRzZWxmKi8KKwl3aGlsZSAoKGxpbmUgPSBnZXR1c2Vyc2hlbGwoKSkgIT0gTlVMTCkgeworCQlpZiAoLyogKmxpbmUgIT0gJyMnICYmICovIHN0cmNtcChsaW5lLCBzaGVsbCkgPT0gMCkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZW5kdXNlcnNoZWxsKCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisjZGVmaW5lIFNVX09QVF9tcCAoMykKKyNkZWZpbmUgU1VfT1BUX2wgICg0KQorCitpbnQgc3VfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN1X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBmbGFnczsKKwljaGFyICpvcHRfc2hlbGwgPSBOVUxMOworCWNoYXIgKm9wdF9jb21tYW5kID0gTlVMTDsKKwljb25zdCBjaGFyICpvcHRfdXNlcm5hbWUgPSAicm9vdCI7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdWlkX3QgY3VyX3VpZCA9IGdldHVpZCgpOworCWNvbnN0IGNoYXIgKnR0eTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VVE1QCisJY2hhciB1c2VyX2J1Zls2NF07CisjZW5kaWYKKwljb25zdCBjaGFyICpvbGRfdXNlcjsKKworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgIm1wbGM6czoiLCAmb3B0X2NvbW1hbmQsICZvcHRfc2hlbGwpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoYXJndlswXSAmJiBMT05FX0RBU0goYXJndlswXSkpIHsKKwkJZmxhZ3MgfD0gU1VfT1BUX2w7CisJCWFyZ3YrKzsKKwl9CisKKwkvKiBnZXQgdXNlciBpZiBzcGVjaWZpZWQgKi8KKwlpZiAoYXJndlswXSkgeworCQlvcHRfdXNlcm5hbWUgPSBhcmd2WzBdOworCQlhcmd2Kys7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX1NVX1NZU0xPRykgeworCQkvKiBUaGUgdXRtcCBlbnRyeSAodmlhIGdldGxvZ2luKSBpcyBwcm9iYWJseSB0aGUgYmVzdCB3YXkgdG8KKwkJICogaWRlbnRpZnkgdGhlIHVzZXIsIGVzcGVjaWFsbHkgaWYgc29tZW9uZSBzdSdzIGZyb20gYSBzdS1zaGVsbC4KKwkJICogQnV0IGdldGxvZ2luIGNhbiBmYWlsIC0tIHVzdWFsbHkgZHVlIHRvIGxhY2sgb2YgdXRtcCBlbnRyeS4KKwkJICogaW4gdGhpcyBjYXNlIHJlc29ydCB0byBnZXRwd3VpZC4gICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVRNUAorCQlvbGRfdXNlciA9IHVzZXJfYnVmOworCQlpZiAoZ2V0bG9naW5fcih1c2VyX2J1Ziwgc2l6ZW9mKHVzZXJfYnVmKSkgIT0gMCkKKyNlbmRpZgorCQl7CisJCQlwdyA9IGdldHB3dWlkKGN1cl91aWQpOworCQkJb2xkX3VzZXIgPSBwdyA/IHhzdHJkdXAocHctPnB3X25hbWUpIDogIiI7CisJCX0KKwkJdHR5ID0geG1hbGxvY190dHluYW1lKDIpOworCQlpZiAoIXR0eSkgeworCQkJdHR5ID0gIm5vbmUiOworCQl9CisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19BVVRIKTsKKwl9CisKKwlwdyA9IHhnZXRwd25hbShvcHRfdXNlcm5hbWUpOworCisJaWYgKGN1cl91aWQgPT0gMCB8fCBjb3JyZWN0X3Bhc3N3b3JkKHB3KSkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU1VfU1lTTE9HKQorCQkJc3lzbG9nKExPR19OT1RJQ0UsICIlYyAlcyAlczolcyIsCisJCQkJJysnLCB0dHksIG9sZF91c2VyLCBvcHRfdXNlcm5hbWUpOworCX0gZWxzZSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TVV9TWVNMT0cpCisJCQlzeXNsb2coTE9HX05PVElDRSwgIiVjICVzICVzOiVzIiwKKwkJCQknLScsIHR0eSwgb2xkX3VzZXIsIG9wdF91c2VybmFtZSk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbmNvcnJlY3QgcGFzc3dvcmQiKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgRU5BQkxFX0ZFQVRVUkVfU1VfU1lTTE9HKSB7CisJCWNsb3NlbG9nKCk7CisJfQorCisJaWYgKCFvcHRfc2hlbGwgJiYgKGZsYWdzICYgU1VfT1BUX21wKSkgeworCQkvKiAtcyBTSEVMTCBpcyBub3QgZ2l2ZW4sIGJ1dCAicHJlc2VydmUgZW52IiBvcHQgaXMgKi8KKwkJb3B0X3NoZWxsID0gZ2V0ZW52KCJTSEVMTCIpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMKKwlpZiAob3B0X3NoZWxsICYmIGN1cl91aWQgIT0gMCAmJiBwdy0+cHdfc2hlbGwgJiYgcmVzdHJpY3RlZF9zaGVsbChwdy0+cHdfc2hlbGwpKSB7CisJCS8qIFRoZSB1c2VyIGJlaW5nIHN1J2QgdG8gaGFzIGEgbm9uc3RhbmRhcmQgc2hlbGwsIGFuZCBzbyBpcworCQkgKiBwcm9iYWJseSBhIHV1Y3AgYWNjb3VudCBvciBoYXMgcmVzdHJpY3RlZCBhY2Nlc3MuICBEb24ndAorCQkgKiBjb21wcm9taXNlIHRoZSBhY2NvdW50IGJ5IGFsbG93aW5nIGFjY2VzcyB3aXRoIGEgc3RhbmRhcmQKKwkJICogc2hlbGwuICAqLworCQliYl9lcnJvcl9tc2coInVzaW5nIHJlc3RyaWN0ZWQgc2hlbGwiKTsKKwkJb3B0X3NoZWxsID0gTlVMTDsgLyogaWdub3JlIC1zIFBST0cgKi8KKwl9CisJLyogZWxzZTogdXNlciBjYW4gcnVuIHdoYXRldmVyIGhlIHdhbnRzIHZpYSAic3UgLXMgUFJPRyBVU0VSIi4KKwkgKiBUaGlzIGlzIHNhZmUgc2luY2UgUFJPRyBpcyBydW4gdW5kZXIgdXNlcidzIHVpZC9naWQuICovCisjZW5kaWYKKwlpZiAoIW9wdF9zaGVsbCkKKwkJb3B0X3NoZWxsID0gcHctPnB3X3NoZWxsOworCisJY2hhbmdlX2lkZW50aXR5KHB3KTsKKwlzZXR1cF9lbnZpcm9ubWVudChvcHRfc2hlbGwsCisJCQkoKGZsYWdzICYgU1VfT1BUX2wpIC8gU1VfT1BUX2wgKiBTRVRVUF9FTlZfQ0xFQVJFTlYpCisJCQkrICghKGZsYWdzICYgU1VfT1BUX21wKSAqIFNFVFVQX0VOVl9DSEFOR0VFTlYpLAorCQkJcHcpOworCUlGX1NFTElOVVgoc2V0X2N1cnJlbnRfc2VjdXJpdHlfY29udGV4dChOVUxMKTspCisKKwkvKiBOZXZlciByZXR1cm5zICovCisJcnVuX3NoZWxsKG9wdF9zaGVsbCwgZmxhZ3MgJiBTVV9PUFRfbCwgb3B0X2NvbW1hbmQsIChjb25zdCBjaGFyKiopYXJndik7CisKKwkvKiByZXR1cm4gRVhJVF9GQUlMVVJFOyAtIG5vdCByZWFjaGVkICovCit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL3N1bG9naW4uYyBiL2xvZ2ludXRpbHMvc3Vsb2dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmIwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL3N1bG9naW4uYwpAQCAtMCwwICsxLDExOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzdWxvZ2luIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3Vsb2dpbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy10IE5dIFtUVFldIgorLy91c2FnZTojZGVmaW5lIHN1bG9naW5fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaW5nbGUgdXNlciBsb2dpblxuIgorLy91c2FnZTogICAgICJcbgktdCBOCVRpbWVvdXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvL3N0YXRpYyB2b2lkIGNhdGNoYWxhcm0oaW50IFVOVVNFRF9QQVJBTSBqdW5rKQorLy97CisvLwlleGl0KEVYSVRfRkFJTFVSRSk7CisvL30KKworCitpbnQgc3Vsb2dpbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3Vsb2dpbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqY3A7CisJaW50IHRpbWVvdXQgPSAwOworCXN0cnVjdCBwYXNzd2QgKnB3ZDsKKwljb25zdCBjaGFyICpzaGVsbDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJLyogVXNpbmcgX3IgZnVuY3Rpb24gdG8gYXZvaWQgcHVsbGluZyBpbiBzdGF0aWMgYnVmZmVycyAqLworCWNoYXIgYnVmZmVyWzI1Nl07CisJc3RydWN0IHNwd2Qgc3B3OworI2VuZGlmCisKKwlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19BVVRIKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInQrIjsgLyogLXQgTiAqLworCWdldG9wdDMyKGFyZ3YsICJ0OiIsICZ0aW1lb3V0KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWNsb3NlKDApOworCQljbG9zZSgxKTsKKwkJZHVwKHhvcGVuKGFyZ3ZbMF0sIE9fUkRXUikpOworCQljbG9zZSgyKTsKKwkJZHVwKDApOworCX0KKworCS8qIE1hbGljaW91cyB1c2UgbGlrZSAic3Vsb2dpbiAvZGV2L3NkYSI/ICovCisJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSB8fCAhaXNhdHR5KDIpKSB7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHR0eSIpOworCX0KKworCS8qIENsZWFyIGRhbmdlcm91cyBzdHVmZiwgc2V0IFBBVEggKi8KKwlzYW5pdGl6ZV9lbnZfaWZfc3VpZCgpOworCisJcHdkID0gZ2V0cHd1aWQoMCk7CisJaWYgKCFwd2QpIHsKKwkJZ290byBhdXRoX2Vycm9yOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwl7CisJCS8qIGdldHNwbmFtX3IgbWF5IHJldHVybiAwIHlldCBzZXQgcmVzdWx0IHRvIE5VTEwuCisJCSAqIEF0IGxlYXN0IGdsaWJjIDIuNCBkb2VzIHRoaXMuIEJlIGV4dHJhIHBhcmFub2lkIGhlcmUuICovCisJCXN0cnVjdCBzcHdkICpyZXN1bHQgPSBOVUxMOworCQlpbnQgciA9IGdldHNwbmFtX3IocHdkLT5wd19uYW1lLCAmc3B3LCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmcmVzdWx0KTsKKwkJaWYgKHIgfHwgIXJlc3VsdCkgeworCQkJZ290byBhdXRoX2Vycm9yOworCQl9CisJCXB3ZC0+cHdfcGFzc3dkID0gcmVzdWx0LT5zcF9wd2RwOworCX0KKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqZW5jcnlwdGVkOworCQlpbnQgcjsKKworCQkvKiBjcCBwb2ludHMgdG8gYSBzdGF0aWMgYnVmZmVyIHRoYXQgaXMgemVyb2VkIGV2ZXJ5IHRpbWUgKi8KKwkJY3AgPSBiYl9hc2soU1RESU5fRklMRU5PLCB0aW1lb3V0LAorCQkJCSJHaXZlIHJvb3QgcGFzc3dvcmQgZm9yIHN5c3RlbSBtYWludGVuYW5jZVxuIgorCQkJCSIob3IgdHlwZSBDb250cm9sLUQgZm9yIG5vcm1hbCBzdGFydHVwKToiKTsKKworCQlpZiAoIWNwIHx8ICEqY3ApIHsKKwkJCWJiX2luZm9fbXNnKCJOb3JtYWwgc3RhcnR1cCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZW5jcnlwdGVkID0gcHdfZW5jcnlwdChjcCwgcHdkLT5wd19wYXNzd2QsIDEpOworCQlyID0gc3RyY21wKGVuY3J5cHRlZCwgcHdkLT5wd19wYXNzd2QpOworCQlmcmVlKGVuY3J5cHRlZCk7CisJCWlmIChyID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWJiX2RvX2RlbGF5KExPR0lOX0ZBSUxfREVMQVkpOworCQliYl9pbmZvX21zZygiTG9naW4gaW5jb3JyZWN0Iik7CisJfQorCW1lbXNldChjcCwgMCwgc3RybGVuKGNwKSk7CisvLwlzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7CisKKwliYl9pbmZvX21zZygiU3lzdGVtIE1haW50ZW5hbmNlIE1vZGUiKTsKKworCUlGX1NFTElOVVgocmVuZXdfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KCkpOworCisJc2hlbGwgPSBnZXRlbnYoIlNVU0hFTEwiKTsKKwlpZiAoIXNoZWxsKQorCQlzaGVsbCA9IGdldGVudigic3VzaGVsbCIpOworCWlmICghc2hlbGwpCisJCXNoZWxsID0gcHdkLT5wd19zaGVsbDsKKworCS8qIEV4ZWMgbG9naW4gc2hlbGwgd2l0aCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuIE5ldmVyIHJldHVybnMuICovCisJcnVuX3NoZWxsKHNoZWxsLCAxLCBOVUxMLCBOVUxMKTsKKworIGF1dGhfZXJyb3I6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHBhc3N3b3JkIGVudHJ5IGZvciByb290Iik7Cit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL3Zsb2NrLmMgYi9sb2dpbnV0aWxzL3Zsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhZjkzOQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvdmxvY2suYwpAQCAtMCwwICsxLDExOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdmxvY2sgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgc3Bvb24gPHNwb29uQGl4Lm5ldGNvbS5jb20+CisgKiBXcml0dGVuIGJ5IHNwb29uIDxzcG9uQGl4Lm5ldGNvbS5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBTaG91dHogdG8gTWljaGFlbCBLLiBKb2huc29uIDxqb2huc29ubUByZWRoYXQuY29tPiwgYXV0aG9yIG9mIHRoZQorICogb3JpZ2luYWwgdmxvY2suICBJIHNuYWdnZWQgYSBidW5jaCBvZiBoaXMgY29kZSB0byB3cml0ZSB0aGlzCisgKiBtaW5pbWFsaXN0aWMgdmxvY2suCisgKi8KKy8qIEZpeGVkIGJ5IEVyaWsgQW5kZXJzZW4gdG8gZG8gcGFzc3dvcmRzIHRoZSB0aW55bG9naW4gd2F5Li4uCisgKiBJdCBub3cgd29ya3Mgd2l0aCBtZDUsIHNoYTEsIGV0YyBwYXNzd29yZHMuICovCisKKy8vdXNhZ2U6I2RlZmluZSB2bG9ja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hXSIKKy8vdXNhZ2U6I2RlZmluZSB2bG9ja19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxvY2sgYSB2aXJ0dWFsIHRlcm1pbmFsLiBBIHBhc3N3b3JkIGlzIHJlcXVpcmVkIHRvIHVubG9jay5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJTG9jayBhbGwgVlRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHN5cy92dC5oPgorCitzdGF0aWMgdm9pZCByZWxlYXNlX3Z0KGludCBzaWdubyBVTlVTRURfUEFSQU0pCit7CisJLyogSWYgLWEsIHBhcmFtIGlzIDAsIHdoaWNoIG1lYW5zOgorCSAqICJubywga2VybmVsLCB3ZSBkb24ndCBhbGxvdyBjb25zb2xlIHN3aXRjaCBhd2F5IGZyb20gdXMhIiAqLworCWlvY3RsKFNURElOX0ZJTEVOTywgVlRfUkVMRElTUCwgKHVuc2lnbmVkIGxvbmcpICFvcHRpb25fbWFzazMyKTsKK30KKworc3RhdGljIHZvaWQgYWNxdWlyZV92dChpbnQgc2lnbm8gVU5VU0VEX1BBUkFNKQoreworCS8qIEFDSyB0byBrZXJuZWwgdGhhdCBzd2l0Y2ggdG8gY29uc29sZSBpcyBzdWNjZXNzZnVsICovCisJaW9jdGwoU1RESU5fRklMRU5PLCBWVF9SRUxESVNQLCBWVF9BQ0tBQ1EpOworfQorI2VuZGlmCisKK2ludCB2bG9ja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdmxvY2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworI2lmZGVmIF9fbGludXhfXworCXN0cnVjdCB2dF9tb2RlIHZ0bTsKKwlzdHJ1Y3QgdnRfbW9kZSBvdnRtOworI2VuZGlmCisJc3RydWN0IHRlcm1pb3MgdGVybTsKKwlzdHJ1Y3QgdGVybWlvcyBvdGVybTsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKworCXB3ID0geGdldHB3dWlkKGdldHVpZCgpKTsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCI7IC8qIG5vIHBhcmFtcyEgKi8KKwlnZXRvcHQzMihhcmd2LCAiYSIpOworCisJLyogSWdub3JlIHNvbWUgc2lnbmFscyBzbyB0aGF0IHdlIGRvbid0IGdldCBraWxsZWQgYnkgdGhlbSAqLworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR1RTVFApCisJCSsgKDEgPDwgU0lHVFRJTikKKwkJKyAoMSA8PCBTSUdUVE9VKQorCQkrICgxIDw8IFNJR0hVUCApCisJCSsgKDEgPDwgU0lHQ0hMRCkgLyogcGFyYW5vaWEgOikgKi8KKwkJKyAoMSA8PCBTSUdRVUlUKQorCQkrICgxIDw8IFNJR0lOVCApCisJCSwgU0lHX0lHTik7CisKKyNpZmRlZiBfX2xpbnV4X18KKwkvKiBXZSB3aWxsIHVzZSBTSUdVU1J4IGZvciBjb25zb2xlIHN3aXRjaCBjb250cm9sOiAqLworCS8qIDE6IHNldCBoYW5kbGVycyAqLworCXNpZ25hbF9TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHVVNSMSwgcmVsZWFzZV92dCk7CisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdVU1IyLCBhY3F1aXJlX3Z0KTsKKwkvKiAyOiB1bm1hc2sgdGhlbSAqLworCXNpZ191bmJsb2NrKFNJR1VTUjEpOworCXNpZ191bmJsb2NrKFNJR1VTUjIpOworI2VuZGlmCisKKwkvKiBSZXZlcnQgc3RkaW4vb3V0IHRvIG91ciBjb250cm9sbGluZyB0dHkKKwkgKiAob3IgZGllIGlmIHdlIGhhdmUgbm9uZSkgKi8KKwl4bW92ZV9mZCh4b3BlbihDVVJSRU5UX1RUWSwgT19SRFdSKSwgU1RESU5fRklMRU5PKTsKKwl4ZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCisjaWZkZWYgX19saW51eF9fCisJeGlvY3RsKFNURElOX0ZJTEVOTywgVlRfR0VUTU9ERSwgJnZ0bSk7CisJb3Z0bSA9IHZ0bTsKKwkvKiAiY29uc29sZSBzd2l0Y2hlcyBhcmUgY29udHJvbGxlZCBieSB1cywgbm90IGtlcm5lbCEiICovCisJdnRtLm1vZGUgPSBWVF9QUk9DRVNTOworCXZ0bS5yZWxzaWcgPSBTSUdVU1IxOworCXZ0bS5hY3FzaWcgPSBTSUdVU1IyOworCWlvY3RsKFNURElOX0ZJTEVOTywgVlRfU0VUTU9ERSwgJnZ0bSk7CisjZW5kaWYKKworCXRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZvdGVybSk7CisJdGVybSA9IG90ZXJtOworCXRlcm0uY19pZmxhZyAmPSB+QlJLSU5UOworCXRlcm0uY19pZmxhZyB8PSBJR05CUks7CisJdGVybS5jX2xmbGFnICY9IH5JU0lHOworCXRlcm0uY19sZmxhZyAmPSB+KEVDSE8gfCBFQ0hPQ1RMKTsKKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdGVybSk7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIlZpcnR1YWwgY29uc29sZSVzIGxvY2tlZCBieSAlcy5cbiIsCisJCQkJLyogInMiIGlmIC1hLCBlbHNlICIiOiAqLyAicyIgKyAhb3B0aW9uX21hc2szMiwKKwkJCQlwdy0+cHdfbmFtZQorCQkpOworCQlpZiAoY29ycmVjdF9wYXNzd29yZChwdykpIHsKKwkJCWJyZWFrOworCQl9CisJCWJiX2RvX2RlbGF5KExPR0lOX0ZBSUxfREVMQVkpOworCQlwdXRzKCJJbmNvcnJlY3QgcGFzc3dvcmQiKTsKKwl9CisKKyNpZmRlZiBfX2xpbnV4X18KKwlpb2N0bChTVERJTl9GSUxFTk8sIFZUX1NFVE1PREUsICZvdnRtKTsKKyNlbmRpZgorCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZvdGVybSk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWFpbHV0aWxzL0NvbmZpZy5pbiBiL21haWx1dGlscy9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2MjcyMAotLS0gL2Rldi9udWxsCisrKyBiL21haWx1dGlscy9Db25maWcuaW4KQEAgLTAsMCArMSw1NiBAQAorIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMKK21lbnUgIk1haWwgVXRpbGl0aWVzIgorCisKKworY29uZmlnIE1BS0VNSU1FCisJYm9vbCAibWFrZW1pbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ3JlYXRlIE1JTUUtZm9ybWF0dGVkIG1lc3NhZ2VzLgorCitjb25maWcgRkVBVFVSRV9NSU1FX0NIQVJTRVQKKwlzdHJpbmcgIkRlZmF1bHQgY2hhcnNldCIKKwlkZWZhdWx0ICJ1cy1hc2NpaSIKKwlkZXBlbmRzIG9uIE1BS0VNSU1FIHx8IFJFRk9STUlNRSB8fCBTRU5ETUFJTAorCWhlbHAKKwkgIERlZmF1bHQgY2hhcnNldCBvZiB0aGUgbWVzc2FnZS4KKworY29uZmlnIFBPUE1BSUxESVIKKwlib29sICJwb3BtYWlsZGlyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSB5ZXQgcG93ZXJmdWwgUE9QMyBtYWlsIHBvcHBlci4gRGVsaXZlcnMgY29udGVudAorCSAgb2YgcmVtb3RlIG1haWxib3hlcyB0byBsb2NhbCBNYWlsZGlyLgorCitjb25maWcgRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisJYm9vbCAiQWxsb3cgbWVzc2FnZSBmaWx0ZXJzIGFuZCBjdXN0b20gZGVsaXZlcnkgcHJvZ3JhbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBPUE1BSUxESVIKKwloZWxwCisJICBBbGxvdyB0byB1c2UgYSBjdXN0b20gcHJvZ3JhbSB0byBmaWx0ZXIgdGhlIGNvbnRlbnQKKwkgIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSBhY3R1YWwgZGVsaXZlcnkgKC1GICJwcm9nIFthcmdzLi4uXSIpLgorCSAgQWxsb3cgdG8gdXNlIGEgY3VzdG9tIHByb2dyYW0gZm9yIG1lc3NhZ2UgYWN0dWFsIGRlbGl2ZXJ5CisJICAoLU0gInByb2cgW2FyZ3MuLi5dIikuCisKK2NvbmZpZyBSRUZPUk1JTUUKKwlib29sICJyZWZvcm1pbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUGFyc2UgTUlNRS1mb3JtYXR0ZWQgbWVzc2FnZXMuCisKK2NvbmZpZyBGRUFUVVJFX1JFRk9STUlNRV9DT01QQVQKKwlib29sICJBY2NlcHQgYW5kIGlnbm9yZSBvcHRpb25zIG90aGVyIHRoYW4gLXggYW5kIC1YIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUkVGT1JNSU1FCisJaGVscAorCSAgQWNjZXB0IChmb3IgY29tcGF0aWJpbGl0eSBvbmx5KSBhbmQgaWdub3JlIG9wdGlvbnMKKwkgIG90aGVyIHRoYW4gLXggYW5kIC1YLgorCitjb25maWcgU0VORE1BSUwKKwlib29sICJzZW5kbWFpbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCYXJlYm9uZXMgc2VuZG1haWwuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21haWx1dGlscy9Db25maWcuc3JjIGIvbWFpbHV0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5YzVjMAotLS0gL2Rldi9udWxsCisrKyBiL21haWx1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsNTUgQEAKK21lbnUgIk1haWwgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIE1BS0VNSU1FCisJYm9vbCAibWFrZW1pbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ3JlYXRlIE1JTUUtZm9ybWF0dGVkIG1lc3NhZ2VzLgorCitjb25maWcgRkVBVFVSRV9NSU1FX0NIQVJTRVQKKwlzdHJpbmcgIkRlZmF1bHQgY2hhcnNldCIKKwlkZWZhdWx0ICJ1cy1hc2NpaSIKKwlkZXBlbmRzIG9uIE1BS0VNSU1FIHx8IFJFRk9STUlNRSB8fCBTRU5ETUFJTAorCWhlbHAKKwkgIERlZmF1bHQgY2hhcnNldCBvZiB0aGUgbWVzc2FnZS4KKworY29uZmlnIFBPUE1BSUxESVIKKwlib29sICJwb3BtYWlsZGlyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSB5ZXQgcG93ZXJmdWwgUE9QMyBtYWlsIHBvcHBlci4gRGVsaXZlcnMgY29udGVudAorCSAgb2YgcmVtb3RlIG1haWxib3hlcyB0byBsb2NhbCBNYWlsZGlyLgorCitjb25maWcgRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisJYm9vbCAiQWxsb3cgbWVzc2FnZSBmaWx0ZXJzIGFuZCBjdXN0b20gZGVsaXZlcnkgcHJvZ3JhbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBPUE1BSUxESVIKKwloZWxwCisJICBBbGxvdyB0byB1c2UgYSBjdXN0b20gcHJvZ3JhbSB0byBmaWx0ZXIgdGhlIGNvbnRlbnQKKwkgIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSBhY3R1YWwgZGVsaXZlcnkgKC1GICJwcm9nIFthcmdzLi4uXSIpLgorCSAgQWxsb3cgdG8gdXNlIGEgY3VzdG9tIHByb2dyYW0gZm9yIG1lc3NhZ2UgYWN0dWFsIGRlbGl2ZXJ5CisJICAoLU0gInByb2cgW2FyZ3MuLi5dIikuCisKK2NvbmZpZyBSRUZPUk1JTUUKKwlib29sICJyZWZvcm1pbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUGFyc2UgTUlNRS1mb3JtYXR0ZWQgbWVzc2FnZXMuCisKK2NvbmZpZyBGRUFUVVJFX1JFRk9STUlNRV9DT01QQVQKKwlib29sICJBY2NlcHQgYW5kIGlnbm9yZSBvcHRpb25zIG90aGVyIHRoYW4gLXggYW5kIC1YIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUkVGT1JNSU1FCisJaGVscAorCSAgQWNjZXB0IChmb3IgY29tcGF0aWJpbGl0eSBvbmx5KSBhbmQgaWdub3JlIG9wdGlvbnMKKwkgIG90aGVyIHRoYW4gLXggYW5kIC1YLgorCitjb25maWcgU0VORE1BSUwKKwlib29sICJzZW5kbWFpbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCYXJlYm9uZXMgc2VuZG1haWwuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21haWx1dGlscy9LYnVpbGQuc3JjIGIvbWFpbHV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0ZmI3NAotLS0gL2Rldi9udWxsCisrKyBiL21haWx1dGlscy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsOSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCmRpZmYgLS1naXQgYS9tYWlsdXRpbHMvbWFpbC5jIGIvbWFpbHV0aWxzL21haWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM3OTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL21haWwuYwpAQCAtMCwwICsxLDE4MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGVscGVyIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYWlsLmgiCisKK3N0YXRpYyB2b2lkIGtpbGxfaGVscGVyKHZvaWQpCit7CisJaWYgKEcuaGVscGVyX3BpZCA+IDApIHsKKwkJa2lsbChHLmhlbHBlcl9waWQsIFNJR1RFUk0pOworCQlHLmhlbHBlcl9waWQgPSAwOworCX0KK30KKworLy8gZ2VuZXJpYyBzaWduYWwgaGFuZGxlcgorc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25vKQoreworI2RlZmluZSBlcnIgc2lnbm8KKwlpZiAoU0lHQUxSTSA9PSBzaWdubykgeworCQlraWxsX2hlbHBlcigpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZWQgb3V0Iik7CisJfQorCisJLy8gU0lHQ0hMRC4gcmVhcCB6b21iaWVzCisJaWYgKHNhZmVfd2FpdHBpZChHLmhlbHBlcl9waWQsICZlcnIsIFdOT0hBTkcpID4gMCkgeworCQlpZiAoV0lGU0lHTkFMRUQoZXJyKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJoZWxwZXIga2lsbGVkIGJ5IHNpZ25hbCAldSIsIFdURVJNU0lHKGVycikpOworCQlpZiAoV0lGRVhJVEVEKGVycikpIHsKKwkJCUcuaGVscGVyX3BpZCA9IDA7CisJCQlpZiAoV0VYSVRTVEFUVVMoZXJyKSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaGVscGVyIGV4aXRlZCAoJXUpIiwgV0VYSVRTVEFUVVMoZXJyKSk7CisJCX0KKwl9CisjdW5kZWYgZXJyCit9CisKK3ZvaWQgRkFTVF9GVU5DIGxhdW5jaF9oZWxwZXIoY29uc3QgY2hhciAqKmFyZ3YpCit7CisJLy8gc2V0dXAgdmFuaWxsYSB1bmlkaXJlY3Rpb25hbCBwaXBlcyBpbnRlcmNoYW5nZQorCWludCBpOworCWludCBwaXBlc1s0XTsKKworCXhwaXBlKHBpcGVzKTsKKwl4cGlwZShwaXBlcyArIDIpOworCisJLy8gTkI6IGhhbmRsZXIgbXVzdCBiZSBpbnN0YWxsZWQgYmVmb3JlIHZmb3JrCisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHQ0hMRCkKKwkJKyAoMSA8PCBTSUdBTFJNKQorCQksIHNpZ25hbF9oYW5kbGVyKTsKKworCUcuaGVscGVyX3BpZCA9IHh2Zm9yaygpOworCisJaSA9ICghRy5oZWxwZXJfcGlkKSAqIDI7IC8vIGZvciBwYXJlbnQ6MCwgZm9yIGNoaWxkOjIKKwljbG9zZShwaXBlc1tpICsgMV0pOyAvLyAxIG9yIDMgLSBjbG9zaW5nIG9uZSB3cml0ZSBlbmQKKwljbG9zZShwaXBlc1syIC0gaV0pOyAvLyAyIG9yIDAgLSBjbG9zaW5nIG9uZSByZWFkIGVuZAorCXhtb3ZlX2ZkKHBpcGVzW2ldLCBTVERJTl9GSUxFTk8pOyAvLyAwIG9yIDIgLSB1c2luZyBvdGhlciByZWFkIGVuZAorCXhtb3ZlX2ZkKHBpcGVzWzMgLSBpXSwgU1RET1VUX0ZJTEVOTyk7IC8vIDMgb3IgMSAtIG90aGVyIHdyaXRlIGVuZAorCisJaWYgKCFHLmhlbHBlcl9waWQpIHsKKwkJLy8gY2hpbGQ6IHRyeSB0byBleGVjdXRlIGNvbm5lY3Rpb24gaGVscGVyCisJCS8vIE5COiBTSUdDSExEICYgU0lHQUxSTSByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjCisJCUJCX0VYRUNWUF9vcl9kaWUoKGNoYXIqKilhcmd2KTsKKwl9CisKKwkvLyBwYXJlbnQKKwkvLyBjaGVjayB3aGV0aGVyIGNoaWxkIGlzIGFsaXZlCisJLy9yZWR1bmRhbnQ6c2lnbmFsX2hhbmRsZXIoU0lHQ0hMRCk7CisJLy8gY2hpbGQgc2VlbXMgT0sgLT4gcGFyZW50IGdvZXMgb24KKwlhdGV4aXQoa2lsbF9oZWxwZXIpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgc2VuZF9tYWlsX2NvbW1hbmQoY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpwYXJhbSkKK3sKKwljaGFyICptc2c7CisJaWYgKHRpbWVvdXQpCisJCWFsYXJtKHRpbWVvdXQpOworCW1zZyA9IChjaGFyKilmbXQ7CisJaWYgKGZtdCkgeworCQltc2cgPSB4YXNwcmludGYoZm10LCBwYXJhbSk7CisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKCJzZW5kOiclcyciLCBtc2cpOworCQlwcmludGYoIiVzXHJcbiIsIG1zZyk7CisJfQorCWZmbHVzaF9hbGwoKTsKKwlyZXR1cm4gbXNnOworfQorCisvLyBOQjogcGFyc2VfdXJsIGNhbiBtb2RpZnkgdXJsW10gKGRlc3BpdGUgY29uc3QpLCBidXQgb25seSBpZiAnQCcgaXMgdGhlcmUKKy8qCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHBhcnNlX3VybChjaGFyICp1cmwsIGNoYXIgKip1c2VyLCBjaGFyICoqcGFzcykKK3sKKwkvLyBwYXJzZSBbdXNlcls6cGFzc11AXWhvc3QKKwkvLyByZXR1cm4gaG9zdAorCWNoYXIgKnMgPSBzdHJjaHIodXJsLCAnQCcpOworCSp1c2VyID0gKnBhc3MgPSBOVUxMOworCWlmIChzKSB7CisJCSpzKysgPSAnXDAnOworCQkqdXNlciA9IHVybDsKKwkJdXJsID0gczsKKwkJcyA9IHN0cmNocigqdXNlciwgJzonKTsKKwkJaWYgKHMpIHsKKwkJCSpzKysgPSAnXDAnOworCQkJKnBhc3MgPSBzOworCQl9CisJfQorCXJldHVybiB1cmw7Cit9CisqLworCit2b2lkIEZBU1RfRlVOQyBlbmNvZGVfYmFzZTY0KGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICplb2wpCit7CisJZW51bSB7CisJCVNSQ19CVUZfU0laRSA9IDQ1LCAgLyogVGhpcyAqTVVTVCogYmUgYSBtdWx0aXBsZSBvZiAzICovCisJCURTVF9CVUZfU0laRSA9IDQgKiAoKFNSQ19CVUZfU0laRSArIDIpIC8gMyksCisJfTsKKyNkZWZpbmUgc3JjX2J1ZiB0ZXh0CisJY2hhciBzcmNbU1JDX0JVRl9TSVpFXTsKKwlGSUxFICpmcCA9IGZwOworCXNzaXplX3QgbGVuID0gbGVuOworCWNoYXIgZHN0X2J1ZltEU1RfQlVGX1NJWkUgKyAxXTsKKworCWlmIChmbmFtZSkgeworCQlmcCA9IChOT1RfTE9ORV9EQVNIKGZuYW1lKSkgPyB4Zm9wZW5fZm9yX3JlYWQoZm5hbWUpIDogKEZJTEUgKil0ZXh0OworCQlzcmNfYnVmID0gc3JjOworCX0gZWxzZSBpZiAodGV4dCkgeworCQkvLyB0aG91Z2ggd2UgZG8gbm90IGNhbGwgdXVlbmNvZGUoTlVMTCwgTlVMTCkgZXhwbGljaXRseQorCQkvLyBzdGlsbCB3ZSBkbyBub3Qgd2FudCB0byBicmVhayB0aGluZ3Mgc3VkZGVubHkKKwkJbGVuID0gc3RybGVuKHRleHQpOworCX0gZWxzZQorCQlyZXR1cm47CisKKwl3aGlsZSAoMSkgeworCQlzaXplX3Qgc2l6ZTsKKwkJaWYgKGZuYW1lKSB7CisJCQlzaXplID0gZnJlYWQoKGNoYXIgKilzcmNfYnVmLCAxLCBTUkNfQlVGX1NJWkUsIGZwKTsKKwkJCWlmICgoc3NpemVfdClzaXplIDwgMCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQl9IGVsc2UgeworCQkJc2l6ZSA9IGxlbjsKKwkJCWlmIChsZW4gPiBTUkNfQlVGX1NJWkUpCisJCQkJc2l6ZSA9IFNSQ19CVUZfU0laRTsKKwkJfQorCQlpZiAoIXNpemUpCisJCQlicmVhazsKKwkJLy8gZW5jb2RlIHRoZSBidWZmZXIgd2UganVzdCByZWFkIGluCisJCWJiX3V1ZW5jb2RlKGRzdF9idWYsIHNyY19idWYsIHNpemUsIGJiX3V1ZW5jX3RibF9iYXNlNjQpOworCQlpZiAoZm5hbWUpIHsKKwkJCXByaW50ZigiJXNcbiIsIGVvbCk7CisJCX0gZWxzZSB7CisJCQlzcmNfYnVmICs9IHNpemU7CisJCQlsZW4gLT0gc2l6ZTsKKwkJfQorCQlmd3JpdGUoZHN0X2J1ZiwgMSwgNCAqICgoc2l6ZSArIDIpIC8gMyksIHN0ZG91dCk7CisJfQorCWlmIChmbmFtZSAmJiBOT1RfTE9ORV9EQVNIKGZuYW1lKSkKKwkJZmNsb3NlKGZwKTsKKyN1bmRlZiBzcmNfYnVmCit9CisKKy8qCisgKiBnZXQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IKKyAqLwordm9pZCBGQVNUX0ZVTkMgZ2V0X2NyZWRfb3JfZGllKGludCBmZCkKK3sKKwlpZiAoaXNhdHR5KGZkKSkgeworCQlHLnVzZXIgPSB4c3RyZHVwKGJiX2FzayhmZCwgLyogdGltZW91dDogKi8gMCwgIlVzZXI6ICIpKTsKKwkJRy5wYXNzID0geHN0cmR1cChiYl9hc2soZmQsIC8qIHRpbWVvdXQ6ICovIDAsICJQYXNzd29yZDogIikpOworCX0gZWxzZSB7CisJCUcudXNlciA9IHhtYWxsb2NfcmVhZHMoZmQsIC8qIG1heHNpemU6ICovIE5VTEwpOworCQlHLnBhc3MgPSB4bWFsbG9jX3JlYWRzKGZkLCAvKiBtYXhzaXplOiAqLyBOVUxMKTsKKwl9CisJaWYgKCFHLnVzZXIgfHwgISpHLnVzZXIgfHwgIUcucGFzcykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHVzZXJuYW1lIG9yIHBhc3N3b3JkIik7Cit9CmRpZmYgLS1naXQgYS9tYWlsdXRpbHMvbWFpbC5oIGIvbWFpbHV0aWxzL21haWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ3ODMwCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL21haWwuaApAQCAtMCwwICsxLDQ0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBoZWxwZXIgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworc3RydWN0IGdsb2JhbHMgeworCXBpZF90IGhlbHBlcl9waWQ7CisJdW5zaWduZWQgdGltZW91dDsKKwl1bnNpZ25lZCB2ZXJib3NlOworCXVuc2lnbmVkIG9wdHM7CisJY2hhciAqdXNlcjsKKwljaGFyICpwYXNzOworCUZJTEUgKmZwMDsgLy8gaW5pdGlhbCBzdGRpbgorCWNoYXIgKm9wdF9jaGFyc2V0OworCWNoYXIgKmNvbnRlbnRfdHlwZTsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB0aW1lb3V0ICAgICAgICAgKEcudGltZW91dCAgKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgKEcudmVyYm9zZSAgKQorI2RlZmluZSBvcHRzICAgICAgICAgICAgKEcub3B0cyAgICAgKQorLy8jZGVmaW5lIHVzZXIgICAgICAgICAgICAoRy51c2VyICAgICApCisvLyNkZWZpbmUgcGFzcyAgICAgICAgICAgIChHLnBhc3MgICAgICkKKy8vI2RlZmluZSBmcDAgICAgICAgICAgICAgKEcuZnAwICAgICAgKQorLy8jZGVmaW5lIG9wdF9jaGFyc2V0ICAgICAoRy5vcHRfY2hhcnNldCkKKy8vI2RlZmluZSBjb250ZW50X3R5cGUgICAgKEcuY29udGVudF90eXBlKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUcub3B0X2NoYXJzZXQgPSAoY2hhciAqKUNPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVDsgXAorCUcuY29udGVudF90eXBlID0gKGNoYXIgKikidGV4dC9wbGFpbiI7IFwKK30gd2hpbGUgKDApCisKKy8vY2hhciBGQVNUX0ZVTkMgKnBhcnNlX3VybChjaGFyICp1cmwsIGNoYXIgKip1c2VyLCBjaGFyICoqcGFzcyk7CisKK3ZvaWQgbGF1bmNoX2hlbHBlcihjb25zdCBjaGFyICoqYXJndikgRkFTVF9GVU5DOwordm9pZCBnZXRfY3JlZF9vcl9kaWUoaW50IGZkKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnNlbmRfbWFpbF9jb21tYW5kKGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqcGFyYW0pIEZBU1RfRlVOQzsKKwordm9pZCBlbmNvZGVfYmFzZTY0KGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICplb2wpIEZBU1RfRlVOQzsKZGlmZiAtLWdpdCBhL21haWx1dGlscy9tYWtlbWltZS5jIGIvbWFpbHV0aWxzL21ha2VtaW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjNTNhMwotLS0gL2Rldi9udWxsCisrKyBiL21haWx1dGlscy9tYWtlbWltZS5jCkBAIC0wLDAgKzEsMjE3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtYWtlbWltZTogY3JlYXRlIE1JTUUtZW5jb2RlZCBtZXNzYWdlCisgKiByZWZvcm1pbWU6IHBhcnNlIE1JTUUtZW5jb2RlZCBtZXNzYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19NQUtFTUlNRSkgKz0gbWFrZW1pbWUubyBtYWlsLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWFpbC5oIgorCisjaWYgMAorIyBkZWZpbmUgZGJnX2Vycm9yX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLyoKKyAgbWFrZW1pbWUgLWMgdHlwZSBbLW8gZmlsZV0gWy1lIGVuY29kaW5nXSBbLUMgY2hhcnNldF0gWy1OIG5hbWVdIFwKKyAgICAgICAgICAgICAgICAgICBbLWEgIkhlYWRlcjogQ29udGVudHMiXSBmaWxlCisgICAgICAgICAgIC1tIFsgdHlwZSBdIFstbyBmaWxlXSBbLWUgZW5jb2RpbmddIFstYSAiSGVhZGVyOiBDb250ZW50cyJdIGZpbGUKKyAgICAgICAgICAgLWogWy1vIGZpbGVdIGZpbGUxIGZpbGUyCisgICAgICAgICAgIEBmaWxlCisKKyAgIGZpbGU6ICBmaWxlbmFtZSAgICAtIHJlYWQgb3Igd3JpdGUgZnJvbSBmaWxlbmFtZQorICAgICAgICAgIC0gICAgICAgICAgIC0gcmVhZCBvciB3cml0ZSBmcm9tIHN0ZGluIG9yIHN0ZG91dAorICAgICAgICAgICZuICAgICAgICAgIC0gcmVhZCBvciB3cml0ZSBmcm9tIGZpbGUgZGVzY3JpcHRvciBuCisgICAgICAgICAgXCggb3B0cyBcKSAgLSByZWFkIGZyb20gY2hpbGQgcHJvY2VzcywgdGhhdCBnZW5lcmF0ZXMgWyBvcHRzIF0KKworT3B0aW9uczoKKyAgLWMgdHlwZSAgICAgICAgIC0gY3JlYXRlIGEgbmV3IE1JTUUgc2VjdGlvbiBmcm9tICJmaWxlIiB3aXRoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgQ29udGVudC1UeXBlOiAoZGVmYXVsdCBpcyBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0pLgorICAtQyBjaGFyc2V0ICAgICAgLSBNSU1FIGNoYXJzZXQgb2YgYSBuZXcgdGV4dC9wbGFpbiBzZWN0aW9uLgorICAtTiBuYW1lICAgICAgICAgLSBNSU1FIGNvbnRlbnQgbmFtZSBvZiB0aGUgbmV3IG1pbWUgc2VjdGlvbi4KKyAgLW0gWyB0eXBlIF0gICAgIC0gY3JlYXRlIGEgbXVsdGlwYXJ0IG1pbWUgc2VjdGlvbiBmcm9tICJmaWxlIiBvZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIENvbnRlbnQtVHlwZTogKGRlZmF1bHQgaXMgbXVsdGlwYXJ0L21peGVkKS4KKyAgLWUgZW5jb2RpbmcgICAgIC0gdXNlIHRoZSBnaXZlbiBlbmNvZGluZyAoN2JpdCwgOGJpdCwgcXVvdGVkLXByaW50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgb3IgYmFzZTY0KSwgaW5zdGVhZCBvZiBndWVzc2luZy4gIE9taXQgIi1lIiBhbmQgdXNlCisgICAgICAgICAgICAgICAgICAgIC1jIGF1dG8gdG8gc2V0IENvbnRlbnQtVHlwZTogdG8gdGV4dC9wbGFpbiBvcgorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0gYmFzZWQgb24gcGlja2VkIGVuY29kaW5nLgorICAtaiBmaWxlMSBmaWxlMiAgLSBqb2luIG1pbWUgc2VjdGlvbiBmaWxlMiB0byBtdWx0aXBhcnQgc2VjdGlvbiBmaWxlMS4KKyAgLW8gZmlsZSAgICAgICAgIC0gd3JpdGUgdGhlIHJlc3VsdCB0byBmaWxlLCBpbnN0ZWFkIG9mIHN0ZG91dCAobm90CisgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gY2hpbGQgcHJvY2Vzc2VzKS4KKyAgLWEgaGVhZGVyICAgICAgIC0gcHJlcGVuZCBhbiBhZGRpdGlvbmFsIGhlYWRlciB0byB0aGUgb3V0cHV0LgorCisgIEBmaWxlIC0gcmVhZCBhbGwgb2YgdGhlIGFib3ZlIG9wdGlvbnMgZnJvbSBmaWxlLCBvbmUgb3B0aW9uIG9yCisgICAgICAgICAgdmFsdWUgb24gZWFjaCBsaW5lLgorICB7d2hpY2ggdmVyc2lvbiBvZiBtYWtlbWltZSBpcyB0aGlzPyBXaGF0IGRvIHdlIHN1cHBvcnQ/fQorKi8KKy8qIG1hbiBtYWtlbWltZToKKworICogLWMgVFlQRTogY3JlYXRlIGEgKG5vbi1tdWx0aXBhcnQpIE1JTUUgc2VjdGlvbiB3aXRoIENvbnRlbnQtVHlwZTogVFlQRQorICogbWFrZW1pbWUgLWMgVFlQRSBbLWUgRU5DT0RJTkddIFstbyBPVVRGSUxFXSBbLUMgQ0hBUlNFVF0gWy1OIE5BTUVdIFstYSBIRUFERVIuLi5dIEZJTEUKKyAqIFRoZSAtQyBvcHRpb24gc2V0cyB0aGUgTUlNRSBjaGFyc2V0IGF0dHJpYnV0ZSBmb3IgdGV4dC9wbGFpbiBjb250ZW50LgorICogVGhlIC1OIG9wdGlvbiBzZXRzIHRoZSBuYW1lIGF0dHJpYnV0ZSBmb3IgQ29udGVudC1UeXBlOgorICogRW5jb2RpbmcgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogN2JpdCwgOGJpdCwgcXVvdGVkLXByaW50YWJsZSwgb3IgYmFzZTY0LgorCisgKiAtbSBtdWx0aXBhcnQvVFlQRTogY3JlYXRlIGEgbXVsdGlwYXJ0IE1JTUUgY29sbGVjdGlvbiB3aXRoIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L1RZUEUKKyAqIG1ha2VtaW1lIC1tIG11bHRpcGFydC9UWVBFIFstZSBFTkNPRElOR10gWy1vIE9VVEZJTEVdIFstYSBIRUFERVIuLi5dIEZJTEUKKyAqIFR5cGUgbXVzdCBiZSBlaXRoZXIgIm11bHRpcGFydC9taXhlZCIsICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiLCBvciBzb21lIG90aGVyIE1JTUUgbXVsdGlwYXJ0IGNvbnRlbnQgdHlwZS4KKyAqIEFkZGl0aW9uYWxseSwgZW5jb2RpbmcgY2FuIG9ubHkgYmUgIjdiaXQiIG9yICI4Yml0IiwgYW5kIHdpbGwgZGVmYXVsdCB0byAiOGJpdCIgaWYgbm90IHNwZWNpZmllZC4KKyAqIEZpbmFsbHksIGZpbGVuYW1lIG11c3QgYmUgYSBNSU1FLWZvcm1hdHRlZCBzZWN0aW9uLCBOT1QgYSByZWd1bGFyIGZpbGUuCisgKiBUaGUgLW0gb3B0aW9uIGNyZWF0ZXMgYW4gaW5pdGlhbCBtdWx0aXBhcnQgTUlNRSBjb2xsZWN0aW9uLCB0aGF0IGNvbnRhaW5zIG9ubHkgb25lIE1JTUUgc2VjdGlvbiwgdGFrZW4gZnJvbSBmaWxlbmFtZS4KKyAqIFRoZSBjb2xsZWN0aW9uIGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQgb3V0cHV0LCBvciB0aGUgcGlwZSBvciB0byBvdXRwdXRmaWxlLgorCisgKiAtaiBGSUxFMTogYWRkIGEgc2VjdGlvbiB0byBhIG11bHRpcGFydCBNSU1FIGNvbGxlY3Rpb24KKyAqIG1ha2VtaW1lIC1qIEZJTEUxIFstbyBPVVRGSUxFXSBGSUxFMgorICogRklMRTEgbXVzdCBiZSBhIE1JTUUgY29sbGVjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgdGhlIC1tIG9wdGlvbi4KKyAqIEZJTEUyIG11c3QgYmUgYSBNSU1FIHNlY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHRoZSAtYyBvcHRpb24uCisgKiBUaGUgLWogb3B0aW9ucyBhZGRzIHRoZSBNSU1FIHNlY3Rpb24gaW4gRklMRTIgdG8gdGhlIE1JTUUgY29sbGVjdGlvbiBpbiBGSUxFMS4KKyAqLworCisKKy8qIEluIGJ1c3lib3ggMS4xNS4wLnN2biwgbWFrZW1pbWUgZ2VuZXJhdGVzIG91dHB1dCBsaWtlIHRoaXMKKyAqIChlbXB0eSBsaW5lcyBhcmUgc2hvd24gZXhhY3RseSEpOgore2hlYWRlcnMgYWRkZWQgd2l0aCAtYSBIRFJ9CitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIyNDI2OTUzNC0yMTQ1NTgzNDQ4LTE2NTU4OTA2NzYiCisKKy0tMjQyNjk1MzQtMjE0NTU4MzQ0OC0xNjU1ODkwNjc2CitDb250ZW50LVR5cGU6IHtzZXQgYnkgLWMsIGUuZy4gdGV4dC9wbGFpbn07IGNoYXJzZXQ9e3NldCBieSAtQywgZS5nLiB1cy1hc2NpaX0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IkEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworLi4uZmlsZSBBIGNvbnRlbnRzLi4uCistLTI0MjY5NTM0LTIxNDU1ODM0NDgtMTY1NTg5MDY3NgorQ29udGVudC1UeXBlOiB7c2V0IGJ5IC1jLCBlLmcuIHRleHQvcGxhaW59OyBjaGFyc2V0PXtzZXQgYnkgLUMsIGUuZy4gdXMtYXNjaWl9CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSJCIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKKy4uLmZpbGUgQiBjb250ZW50cy4uLgorLS0yNDI2OTUzNC0yMTQ1NTgzNDQ4LTE2NTU4OTA2NzYtLQorCisgKgorICogRm9yIHJlZmVyZW5jZTogaGVyZSBpcyBhbiBleGFtcGxlIGVtYWlsIHRvIExLTUwgd2hpY2ggaGFzCisgKiAxc3QgdW5uYW1lZCBwYXJ0IChzbyBpdCBzZXJ2ZXMgYXMgYW4gZW1haWwgYm9keSkKKyAqIGFuZCBvbmUgYXR0YWNoZWQgZmlsZToKKy4uLm90aGVyIGhlYWRlcnMuLi4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iPS10T2ZUZjNieU9TMHZaZ3hFV2NYKyIKKy4uLm90aGVyIGhlYWRlcnMuLi4KK01pbWUtVmVyc2lvbjogMS4wCisuLi5vdGhlciBoZWFkZXJzLi4uCisKKworLS09LXRPZlRmM2J5T1MwdlpneEVXY1grCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworLi4uZW1haWwgdGV4dC4uLgorLi4uZW1haWwgdGV4dC4uLgorCisKKy0tPS10T2ZUZjNieU9TMHZaZ3hFV2NYKworQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Inh5eiIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgbmFtZT0ieHl6IjsgY2hhcnNldD0iVVRGLTgiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKKy4uLmZpbGUgY29udGVudHMuLi4KKy4uLmZpbGUgY29udGVudHMuLi4KKworLS09LXRPZlRmM2J5T1MwdlpneEVXY1grLS0KKworLi4ucmFuZG9tIGp1bmsgYWRkZWQgYnkgbWFpbGluZyBsaXN0IHJvYm90cyBhbmQgc3VjaC4uLgorKi8KKworLy91c2FnZTojZGVmaW5lIG1ha2VtaW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIG1ha2VtaW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIG11bHRpcGFydCBNSU1FLWVuY29kZWQgbWVzc2FnZSBmcm9tIEZJTEVzXG4iCisvKiAvL3VzYWdlOiAgICAiVHJhbnNmZXIgZW5jb2RpbmcgaXMgYmFzZTY0LCBkaXNwb3NpdGlvbiBpcyBpbmxpbmUgKG5vdCBhdHRhY2htZW50KVxuIiAqLworLy91c2FnZTogICAgICJcbgktbyBGSUxFCU91dHB1dC4gRGVmYXVsdDogc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktYSBIRFIJQWRkIGhlYWRlci4gRXhhbXBsZXM6IgorLy91c2FnZTogICAgICJcbgkJXCJGcm9tOiB1c2VyQGhvc3Qub3JnXCIsIFwiRGF0ZTogYGRhdGUgLVJgXCIiCisvL3VzYWdlOiAgICAgIlxuCS1jIENUCUNvbnRlbnQgdHlwZS4gRGVmYXVsdDogdGV4dC9wbGFpbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgQ1MJQ2hhcnNldC4gRGVmYXVsdDogIiBDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQKKy8qIC8vdXNhZ2U6ICAiXG4JLWUgRU5DCVRyYW5zZmVyIGVuY29kaW5nLiBJZ25vcmVkLiBiYXNlNjQgaXMgYXNzdW1lZCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuT3RoZXIgb3B0aW9ucyBhcmUgc2lsZW50bHkgaWdub3JlZCIKKworaW50IG1ha2VtaW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtYWtlbWltZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJbGxpc3RfdCAqb3B0X2hlYWRlcnMgPSBOVUxMLCAqbDsKKwljb25zdCBjaGFyICpvcHRfb3V0cHV0OworI2RlZmluZSBib3VuZGFyeSBvcHRfb3V0cHV0CisKKwllbnVtIHsKKwkJT1BUX2MgPSAxIDw8IDAsICAgICAgICAgLy8gY3JlYXRlIChub24tbXVsdGlwYXJ0KSBzZWN0aW9uCisJCU9QVF9lID0gMSA8PCAxLCAgICAgICAgIC8vIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcuIElnbm9yZWQuIEFzc3VtZWQgYmFzZTY0CisJCU9QVF9vID0gMSA8PCAyLCAgICAgICAgIC8vIG91dHB1dCB0bworCQlPUFRfQyA9IDEgPDwgMywgICAgICAgICAvLyBjaGFyc2V0CisJCU9QVF9OID0gMSA8PCA0LCAgICAgICAgIC8vIENPTVBBVAorCQlPUFRfYSA9IDEgPDwgNSwgICAgICAgICAvLyBhZGRpdGlvbmFsIGhlYWRlcnMKKwkJLy9PUFRfbSA9IDEgPDwgNiwgICAgICAgICAvLyBjcmVhdGUgbXV0aXBhcnQgc2VjdGlvbgorCQkvL09QVF9qID0gMSA8PCA3LCAgICAgICAgIC8vIGpvaW4gc2VjdGlvbiB0byBtdWx0aXBhcnQgc2VjdGlvbgorCX07CisKKwlJTklUX0coKTsKKworCS8vIHBhcnNlIG9wdGlvbnMKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJhOjoiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkiYzplOm86QzpOOmEiLCAvLzptOmo6IiwKKwkJJkcuY29udGVudF90eXBlLCBOVUxMLCAmb3B0X291dHB1dCwgJkcub3B0X2NoYXJzZXQsIE5VTEwsICZvcHRfaGVhZGVycyAvLywgTlVMTCwgTlVMTAorCSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIHJlc3BlY3QgLW8gb3V0cHV0CisJaWYgKG9wdHMgJiBPUFRfbykKKwkJZnJlb3BlbihvcHRfb3V0cHV0LCAidyIsIHN0ZG91dCk7CisKKwkvLyBubyBmaWxlcyBnaXZlbiBvbiBjb21tYW5kIGxpbmU/IC0+IHVzZSBzdGRpbgorCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciAqKSItIjsKKworCS8vIHB1dCBhZGRpdGlvbmFsIGhlYWRlcnMKKwlmb3IgKGwgPSBvcHRfaGVhZGVyczsgbDsgbCA9IGwtPmxpbmspCisJCXB1dHMobC0+ZGF0YSk7CisKKwkvLyBtYWtlIGEgcmFuZG9tIHN0cmluZyAtLSBpdCB3aWxsIGRlbGltaXQgbWVzc2FnZSBwYXJ0cworCXNyYW5kKG1vbm90b25pY191cygpKTsKKwlib3VuZGFyeSA9IHhhc3ByaW50ZigiJXUtJXUtJXUiLAorCQkJKHVuc2lnbmVkKXJhbmQoKSwgKHVuc2lnbmVkKXJhbmQoKSwgKHVuc2lnbmVkKXJhbmQoKSk7CisKKwkvLyBwdXQgbXVsdGlwYXJ0IGhlYWRlcgorCXByaW50ZigKKwkJIk1pbWUtVmVyc2lvbjogMS4wXG4iCisJCSJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9XCIlc1wiXG4iCisJCSwgYm91bmRhcnkKKwkpOworCisJLy8gcHV0IGF0dGFjaG1lbnRzCisJd2hpbGUgKCphcmd2KSB7CisJCXByaW50ZigKKwkJCSJcbi0tJXNcbiIKKwkJCSJDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PSVzXG4iCisJCQkiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT1cIiVzXCJcbiIKKwkJCSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjRcbiIKKwkJCSwgYm91bmRhcnkKKwkJCSwgRy5jb250ZW50X3R5cGUKKwkJCSwgRy5vcHRfY2hhcnNldAorCQkJLCBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCgqYXJndikKKwkJKTsKKwkJZW5jb2RlX2Jhc2U2NCgqYXJndisrLCAoY29uc3QgY2hhciAqKXN0ZGluLCAiIik7CisJfQorCisJLy8gcHV0IG11bHRpcGFydCBmb290ZXIKKwlwcmludGYoIlxuLS0lcy0tXG4iICJcbiIsIGJvdW5kYXJ5KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7CisjdW5kZWYgYm91bmRhcnkKK30KZGlmZiAtLWdpdCBhL21haWx1dGlscy9wb3BtYWlsZGlyLmMgYi9tYWlsdXRpbHMvcG9wbWFpbGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDMwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWlsdXRpbHMvcG9wbWFpbGRpci5jCkBAIC0wLDAgKzEsMjcxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwb3BtYWlsZGlyOiBhIHNpbXBsZSB5ZXQgcG93ZXJmdWwgUE9QMyBjbGllbnQKKyAqIERlbGl2ZXJzIGNvbnRlbnRzIG9mIHJlbW90ZSBtYWlsYm94ZXMgdG8gbG9jYWwgTWFpbGRpcgorICoKKyAqIEluc3BpcmVkIGJ5IG9yaWdpbmFsIHV0aWxpdHkgYnkgTmlrb2xhIFZsYWRvdgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfUE9QTUFJTERJUikgKz0gcG9wbWFpbGRpci5vIG1haWwubworCisvL3VzYWdlOiNkZWZpbmUgcG9wbWFpbGRpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIE1BSUxESVIgW0NPTk5fSEVMUEVSIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIHBvcG1haWxkaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGZXRjaCBjb250ZW50IG9mIHJlbW90ZSBtYWlsYm94IHRvIGxvY2FsIG1haWxkaXJcbiIKKy8qIC8vdXNhZ2U6ICAiXG4JLWIJCUJpbmFyeSBtb2RlLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktZAkJRGVidWcuIElnbm9yZWQiICovCisvKiAvL3VzYWdlOiAgIlxuCS1tCQlTaG93IHVzZWQgbWVtb3J5LiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktVgkJU2hvdyB2ZXJzaW9uLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktYwkJVXNlIHRjcGNsaWVudC4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLWEJCVVzZSBBUE9QIHByb3RvY29sLiBJbXBsaWVkLiBJZiBzZXJ2ZXIgc3VwcG9ydHMgQVBPUCAtPiB1c2UgaXQiICovCisvL3VzYWdlOiAgICAgIlxuCS1zCQlTa2lwIGF1dGhvcml6YXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1UCQlHZXQgbWVzc2FnZXMgd2l0aCBUT1AgaW5zdGVhZCBvZiBSRVRSIgorLy91c2FnZTogICAgICJcbgktawkJS2VlcCByZXRyaWV2ZWQgbWVzc2FnZXMgb24gdGhlIHNlcnZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgU0VDCQlOZXR3b3JrIHRpbWVvdXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkoCisvL3VzYWdlOiAgICAgIlxuCS1GIFwiUFJPRyBBUkdTXCIJRmlsdGVyIHByb2dyYW0gKG1heSBiZSByZXBlYXRlZCkiCisvL3VzYWdlOiAgICAgIlxuCS1NIFwiUFJPRyBBUkdTXCIJRGVsaXZlcnkgcHJvZ3JhbSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRmV0Y2ggZnJvbSBwbGFpbiBQT1AzIHNlcnZlcjoiCisvL3VzYWdlOiAgICAgIlxucG9wbWFpbGRpciAtayBESVIgbmMgcG9wMy5zZXJ2ZXIuY29tIDExMCA8dXNlcl9hbmRfcGFzcy50eHQiCisvL3VzYWdlOiAgICAgIlxuRmV0Y2ggZnJvbSBTU0xlZCBQT1AzIHNlcnZlciBhbmQgZGVsZXRlIGZldGNoZWQgZW1haWxzOiIKKy8vdXNhZ2U6ICAgICAiXG5wb3BtYWlsZGlyIERJUiAtLSBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCBwb3AzLnNlcnZlci5jb206OTk1IDx1c2VyX2FuZF9wYXNzLnR4dCIKKy8qIC8vdXNhZ2U6ICAiXG4JLVIgQllURVMJUmVtb3ZlIG9sZCBtZXNzYWdlcyBvbiB0aGUgc2VydmVyID49IEJZVEVTLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktWiBOMS1OMglSZW1vdmUgbWVzc2FnZXMgZnJvbSBOMSB0byBOMiAoZGFuZ2Vyb3VzKS4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLUwgQllURVMJRG9uJ3QgcmV0cmlldmUgbmV3IG1lc3NhZ2VzID49IEJZVEVTLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktSCBMSU5FUwlUeXBlIGZpcnN0IExJTkVTIG9mIGEgbWVzc2FnZS4gSWdub3JlZCIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcG9wbWFpbGRpcl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwb3BtYWlsZGlyIC1rIH4vTWFpbGRpciAtLSBuYyBwb3AuZHJ2di5ydSAxMTAgWzxwYXNzd29yZF9maWxlXVxuIgorLy91c2FnZTogICAgICAgIiQgcG9wbWFpbGRpciB+L01haWxkaXIgLS0gb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgcG9wLmdtYWlsLmNvbTo5OTUgWzxwYXNzd29yZF9maWxlXVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYWlsLmgiCisKK3N0YXRpYyB2b2lkIHBvcDNfY2hlY2tyKGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqcGFyYW0sIGNoYXIgKipyZXQpCit7CisJY2hhciAqbXNnID0gc2VuZF9tYWlsX2NvbW1hbmQoZm10LCBwYXJhbSk7CisJY2hhciAqYW5zd2VyID0geG1hbGxvY19mZ2V0bGluZShzdGRpbik7CisJaWYgKGFuc3dlciAmJiAnKycgPT0gYW5zd2VyWzBdKSB7CisJCWZyZWUobXNnKTsKKwkJaWYgKHRpbWVvdXQpCisJCQlhbGFybSgwKTsKKwkJaWYgKHJldCkgeworCQkJLy8gc2tpcCAiK09LICIKKwkJCW1lbW1vdmUoYW5zd2VyLCBhbnN3ZXIgKyA0LCBzdHJsZW4oYW5zd2VyKSAtIDQpOworCQkJKnJldCA9IGFuc3dlcjsKKwkJfSBlbHNlCisJCQlmcmVlKGFuc3dlcik7CisJCXJldHVybjsKKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGZhaWxlZCwgcmVwbHkgd2FzOiAlcyIsIG1zZywgYW5zd2VyKTsKK30KKworc3RhdGljIHZvaWQgcG9wM19jaGVjayhjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtKQoreworCXBvcDNfY2hlY2tyKGZtdCwgcGFyYW0sIE5VTEwpOworfQorCitpbnQgcG9wbWFpbGRpcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcG9wbWFpbGRpcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIG5tc2c7CisJY2hhciAqaG9zdG5hbWU7CisJcGlkX3QgcGlkOworCWNvbnN0IGNoYXIgKnJldHI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCWNvbnN0IGNoYXIgKmRlbGl2ZXJ5OworI2VuZGlmCisJdW5zaWduZWQgb3B0X25saW5lcyA9IDA7CisKKwllbnVtIHsKKwkJT1BUX2IgPSAxIDw8IDAsCQkvLyAtYiBiaW5hcnkgbW9kZS4gSWdub3JlZAorCQlPUFRfZCA9IDEgPDwgMSwJCS8vIC1kLC1kZCwtZGRkIGRlYnVnLiBJZ25vcmVkCisJCU9QVF9tID0gMSA8PCAyLAkJLy8gLW0gc2hvdyB1c2VkIG1lbW9yeS4gSWdub3JlZAorCQlPUFRfViA9IDEgPDwgMywJCS8vIC1WIHZlcnNpb24uIElnbm9yZWQKKwkJT1BUX2MgPSAxIDw8IDQsCQkvLyAtYyB1c2UgdGNwY2xpZW50LiBJZ25vcmVkCisJCU9QVF9hID0gMSA8PCA1LAkJLy8gLWEgdXNlIEFQT1AgcHJvdG9jb2wKKwkJT1BUX3MgPSAxIDw8IDYsCQkvLyAtcyBza2lwIGF1dGhvcml6YXRpb24KKwkJT1BUX1QgPSAxIDw8IDcsCQkvLyAtVCBnZXQgbWVzc2FnZXMgd2l0aCBUT1AgaW5zdGVhZCB3aXRoIFJFVFIKKwkJT1BUX2sgPSAxIDw8IDgsCQkvLyAtayBrZWVwIHJldHJpZXZlZCBtZXNzYWdlcyBvbiB0aGUgc2VydmVyCisJCU9QVF90ID0gMSA8PCA5LAkJLy8gLXQ5MCBzZXQgdGltZW91dCB0byA5MCBzZWMKKwkJT1BUX1IgPSAxIDw8IDEwLAkvLyAtUjIwMDAwIHJlbW92ZSBvbGQgbWVzc2FnZXMgb24gdGhlIHNlcnZlciA+PSAyMDAwMCBieXRlcyAocmVxdWlyZXMgLWspLiBJZ25vcmVkCisJCU9QVF9aID0gMSA8PCAxMSwJLy8gLVoxMS0yMyByZW1vdmUgbWVzc2FnZXMgZnJvbSAxMSB0byAyMyAoZGFuZ2Vyb3VzKS4gSWdub3JlZAorCQlPUFRfTCA9IDEgPDwgMTIsCS8vIC1MNTAwMDAgbm90IHJldHJpZXZlIG5ldyBtZXNzYWdlcyA+PSA1MDAwMCBieXRlcy4gSWdub3JlZAorCQlPUFRfSCA9IDEgPDwgMTMsCS8vIC1IMzAgdHlwZSBmaXJzdCAzMCBsaW5lcyBvZiBhIG1lc3NhZ2U7ICgtTDEyMDAwIC1IMzApLiBJZ25vcmVkCisJCU9QVF9NID0gMSA8PCAxNCwJLy8gLU1cInByb2dyYW0gYXJnMSBhcmcyIC4uLlwiOyBkZWxpdmVyIGJ5IHByb2dyYW0uIFRyZWF0ZWQgbGlrZSAtRgorCQlPUFRfRiA9IDEgPDwgMTUsCS8vIC1GXCJwcm9ncmFtIGFyZzEgYXJnMiAuLi5cIjsgZmlsdGVyIGJ5IHByb2dyYW0uIFRyZWF0ZWQgbGlrZSAtTQorCX07CisKKwkvLyBpbml0IGdsb2JhbCB2YXJpYWJsZXMKKwlJTklUX0coKTsKKworCS8vIHBhcnNlIG9wdGlvbnMKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpkZDp0KzpSKzpMKzpIKyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCSJiZG1WY2FzVGt0OiIgIlI6WjpMOkg6IiBJRl9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkoIk06RjoiKSwKKwkJJnRpbWVvdXQsIE5VTEwsIE5VTEwsIE5VTEwsICZvcHRfbmxpbmVzCisJCUlGX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWSgsICZkZWxpdmVyeSwgJmRlbGl2ZXJ5KSAvLyB3ZSB0cmVhdCAtTSBhbmQgLUYgdGhlIHNhbWUKKwkpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyBnZXQgYXV0aCBpbmZvCisJaWYgKCEob3B0cyAmIE9QVF9zKSkKKwkJZ2V0X2NyZWRfb3JfZGllKFNURElOX0ZJTEVOTyk7CisKKwkvLyBnb3RvIG1haWxkaXIKKwl4Y2hkaXIoKmFyZ3YrKyk7CisKKwkvLyBsYXVuY2ggY29ubmVjdCBoZWxwZXIsIGlmIGFueQorCWlmICgqYXJndikKKwkJbGF1bmNoX2hlbHBlcigoY29uc3QgY2hhciAqKilhcmd2KTsKKworCS8vIGdldCBzZXJ2ZXIgZ3JlZXRpbmcKKwlwb3AzX2NoZWNrcihOVUxMLCBOVUxMLCAmYnVmKTsKKworCS8vIGF1dGhlbnRpY2F0ZSAoaWYgbm8gLXMgZ2l2ZW4pCisJaWYgKCEob3B0cyAmIE9QVF9zKSkgeworCQkvLyBzZXJ2ZXIgc3VwcG9ydHMgQVBPUCBhbmQgd2Ugd2FudCBpdD8KKwkJaWYgKCc8JyA9PSBidWZbMF0gJiYgKG9wdHMgJiBPUFRfYSkpIHsKKwkJCXVuaW9uIHsgLy8gc2F2ZSBhIGJpdCBvZiBzdGFjaworCQkJCW1kNV9jdHhfdCBjdHg7CisJCQkJY2hhciBoZXhbMTYgKiAyICsgMV07CisJCQl9IG1kNTsKKwkJCXVpbnQzMl90IHJlc1sxNiAvIDRdOworCisJCQljaGFyICpzID0gc3RyY2hyKGJ1ZiwgJz4nKTsKKwkJCWlmIChzKQorCQkJCXNbMV0gPSAnXDAnOworCQkJLy8gZ2V0IG1kNSBzdW0gb2YgIjxzdGFtcD5wYXNzd29yZCIgc3RyaW5nCisJCQltZDVfYmVnaW4oJm1kNS5jdHgpOworCQkJbWQ1X2hhc2goJm1kNS5jdHgsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQkJbWQ1X2hhc2goJm1kNS5jdHgsIEcucGFzcywgc3RybGVuKEcucGFzcykpOworCQkJbWQ1X2VuZCgmbWQ1LmN0eCwgcmVzKTsKKwkJCSpiaW4yaGV4KG1kNS5oZXgsIChjaGFyKilyZXMsIDE2KSA9ICdcMCc7CisJCQkvLyBBUE9QCisJCQlzID0geGFzcHJpbnRmKCIlcyAlcyIsIEcudXNlciwgbWQ1LmhleCk7CisJCQlwb3AzX2NoZWNrKCJBUE9QICVzIiwgcyk7CisJCQlmcmVlKHMpOworCQkJZnJlZShidWYpOworCQkvLyBzZXJ2ZXIgaWdub3JlcyBBUE9QIC0+IHVzZSBzaW1wbGUgdGV4dCBhdXRoZW50aWNhdGlvbgorCQl9IGVsc2UgeworCQkJLy8gVVNFUgorCQkJcG9wM19jaGVjaygiVVNFUiAlcyIsIEcudXNlcik7CisJCQkvLyBQQVNTCisJCQlwb3AzX2NoZWNrKCJQQVNTICVzIiwgRy5wYXNzKTsKKwkJfQorCX0KKworCS8vIGdldCBtYWlsYm94IHN0YXRpc3RpY3MKKwlwb3AzX2NoZWNrcigiU1RBVCIsIE5VTEwsICZidWYpOworCisJLy8gcHJlcGFyZSBtZXNzYWdlIGZpbGVuYW1lIHN1ZmZpeAorCWhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCXBpZCA9IGdldHBpZCgpOworCisJLy8gZ2V0IG1lc3NhZ2VzIGNvdW50ZXIKKwkvLyBOT1RFOiB3ZSBkb24ndCB1c2UgeGF0b3UoYnVmKSBzaW5jZSBidWYgaXMgIm5tc2cgbmJ5dGVzIgorCS8vIHdlIG9ubHkgbmVlZCBubXNnIGFuZCBhdG9pIGlzIGp1c3QgZXhhY3RseSB3aGF0IHdlIG5lZWQKKwkvLyBpZiBhdG9pIGZhaWxzIHRvIGNvbnZlcnQgYnVmIGludG8gbnVtYmVyIGl0IHJldHVybnMgMAorCS8vIGluIHRoaXMgY2FzZSB0aGUgZm9sbG93aW5nIGxvb3Agc2ltcGx5IHdpbGwgbm90IGJlIGV4ZWN1dGVkCisJbm1zZyA9IGF0b2koYnVmKTsKKwlmcmVlKGJ1Zik7CisKKwkvLyBsb29wIHRocm91Z2ggbWVzc2FnZXMKKwlyZXRyID0gKG9wdHMgJiBPUFRfVCkgPyB4YXNwcmludGYoIlRPUCAlJXUgJXUiLCBvcHRfbmxpbmVzKSA6ICJSRVRSICV1IjsKKwlmb3IgKDsgbm1zZzsgbm1zZy0tKSB7CisKKwkJY2hhciAqZmlsZW5hbWU7CisJCWNoYXIgKnRhcmdldDsKKwkJY2hhciAqYW5zd2VyOworCQlGSUxFICpmcDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisJCWludCByYzsKKyNlbmRpZgorCQkvLyBnZW5lcmF0ZSB1bmlxdWUgZmlsZW5hbWUKKwkJZmlsZW5hbWUgID0geGFzcHJpbnRmKCJ0bXAvJWxsdS4ldS4lcyIsCisJCQltb25vdG9uaWNfdXMoKSwgKHVuc2lnbmVkKXBpZCwgaG9zdG5hbWUpOworCisJCS8vIHJldHJpZXZlIG1lc3NhZ2UgaW4gLi90bXAvIHVubGVzcyBmaWx0ZXIgaXMgc3BlY2lmaWVkCisJCXBvcDNfY2hlY2socmV0ciwgKGNvbnN0IGNoYXIgKikocHRyZGlmZl90KW5tc2cpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCQkvLyBkZWxpdmVyeSBoZWxwZXIgb3JkZXJlZD8gLT4gc2V0dXAgcGlwZQorCQlpZiAob3B0cyAmIChPUFRfRnxPUFRfTSkpIHsKKwkJCS8vIGhlbHBlciB3aWxsIGhhdmUgJEZJTEVOQU1FIHNldCB0byBmaWxlbmFtZQorCQkJeHNldGVudigiRklMRU5BTUUiLCBmaWxlbmFtZSk7CisJCQlmcCA9IHBvcGVuKGRlbGl2ZXJ5LCAidyIpOworCQkJdW5zZXRlbnYoIkZJTEVOQU1FIik7CisJCQlpZiAoIWZwKSB7CisJCQkJYmJfcGVycm9yX21zZygiZGVsaXZlcnkgaGVscGVyIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCS8vIGNyZWF0ZSBhbmQgb3BlbiBmaWxlIGZpbGVuYW1lCisJCWZwID0geGZvcGVuX2Zvcl93cml0ZShmaWxlbmFtZSk7CisKKwkJLy8gY29weSBzdGRpbiB0byBmcCAoZWl0aGVyIGZpbGVuYW1lIG9yIGRlbGl2ZXJ5IGhlbHBlcikKKwkJd2hpbGUgKChhbnN3ZXIgPSB4bWFsbG9jX2ZnZXRzX3N0cihzdGRpbiwgIlxyXG4iKSkgIT0gTlVMTCkgeworCQkJY2hhciAqcyA9IGFuc3dlcjsKKwkJCWlmICgnLicgPT0gYW5zd2VyWzBdKSB7CisJCQkJaWYgKCcuJyA9PSBhbnN3ZXJbMV0pCisJCQkJCXMrKzsKKwkJCQllbHNlIGlmICgnXHInID09IGFuc3dlclsxXSAmJiAnXG4nID09IGFuc3dlclsyXSAmJiAnXDAnID09IGFuc3dlclszXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvLypzdHJjaHJudWwocywgJ1xyJykgPSAnXG4nOworCQkJZnB1dHMocywgZnApOworCQkJZnJlZShhbnN3ZXIpOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisJCS8vIGFuYWx5c2UgZGVsaXZlcnkgc3RhdHVzCisJCWlmIChvcHRzICYgKE9QVF9GfE9QVF9NKSkgeworCQkJcmMgPSBwY2xvc2UoZnApOworCQkJaWYgKDk5ID09IHJjKSAvLyA5OSBtZWFucyBiYWlsIG91dAorCQkJCWJyZWFrOworLy8JCQlpZiAocmMpIC8vICEwIG1lYW5zIHNraXAgdG8gdGhlIG5leHQgbWVzc2FnZQorCQkJCWdvdG8gc2tpcDsKKy8vCQkJLy8gMCBtZWFucyBjb250aW51ZQorCQl9IGVsc2UgeworCQkJLy8gY2xvc2UgZmlsZW5hbWUKKwkJCWZjbG9zZShmcCk7CisJCX0KKyNlbmRpZgorCisJCS8vIGRlbGV0ZSBtZXNzYWdlIGZyb20gc2VydmVyCisJCWlmICghKG9wdHMgJiBPUFRfaykpCisJCQlwb3AzX2NoZWNrKCJERUxFICV1IiwgKGNvbnN0IGNoYXIqKShwdHJkaWZmX3Qpbm1zZyk7CisKKwkJLy8gYXRvbWljYWxseSBtb3ZlIG1lc3NhZ2UgdG8gLi9uZXcvCisJCXRhcmdldCA9IHhzdHJkdXAoZmlsZW5hbWUpOworCQlzdHJuY3B5KHRhcmdldCwgIm5ldyIsIDMpOworCQkvLyAuLi4gb3IganVzdCBzdG9wIHJlY2VpdmluZyBvbiBmYWlsdXJlCisJCWlmIChyZW5hbWVfb3Jfd2FybihmaWxlbmFtZSwgdGFyZ2V0KSkKKwkJCWJyZWFrOworCQlmcmVlKHRhcmdldCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisgc2tpcDoKKyNlbmRpZgorCQlmcmVlKGZpbGVuYW1lKTsKKwl9CisKKwkvLyBCeWUKKwlwb3AzX2NoZWNrKCJRVUlUIiwgTlVMTCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShHLnVzZXIpOworCQlmcmVlKEcucGFzcyk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21haWx1dGlscy9yZWZvcm1pbWUuYyBiL21haWx1dGlscy9yZWZvcm1pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI4ZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL3JlZm9ybWltZS5jCkBAIC0wLDAgKzEsMjc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtYWtlbWltZTogY3JlYXRlIE1JTUUtZW5jb2RlZCBtZXNzYWdlCisgKiByZWZvcm1pbWU6IHBhcnNlIE1JTUUtZW5jb2RlZCBtZXNzYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19SRUZPUk1JTUUpICs9IHJlZm9ybWltZS5vIG1haWwubworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYWlsLmgiCisKKyNpZiAwCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIGRiZ19lcnJvcl9tc2coLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF90b2tlbihjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpkZWZ2YWx1ZSkKK3sKKwljb25zdCBjaGFyICpyID0gTlVMTDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBzdHJpbmdfYXJyYXlbaV0gIT0gTlVMTDsgaSsrKSB7CisJCWlmIChzdHJjYXNlY21wKHN0cmluZ19hcnJheVtpXSwga2V5KSA9PSAwKSB7CisJCQlyID0gKGNoYXIgKilzdHJpbmdfYXJyYXlbaSsxXTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAocikgPyByIDogZGVmdmFsdWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp4ZmluZF90b2tlbihjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KQoreworCWNvbnN0IGNoYXIgKnIgPSBmaW5kX3Rva2VuKHN0cmluZ19hcnJheSwga2V5LCBOVUxMKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBmb3VuZDogJyVzJyIsIGtleSk7Cit9CisKK2VudW0geworCU9QVF94ID0gMSA8PCAwLAorCU9QVF9YID0gMSA8PCAxLAorI2lmIEVOQUJMRV9GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQKKwlPUFRfZCA9IDEgPDwgMiwKKwlPUFRfZSA9IDEgPDwgMywKKwlPUFRfaSA9IDEgPDwgNCwKKwlPUFRfcyA9IDEgPDwgNSwKKwlPUFRfciA9IDEgPDwgNiwKKwlPUFRfYyA9IDEgPDwgNywKKwlPUFRfbSA9IDEgPDwgOCwKKwlPUFRfaCA9IDEgPDwgOSwKKwlPUFRfbyA9IDEgPDwgMTAsCisJT1BUX08gPSAxIDw8IDExLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHBhcnNlKGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjaGFyICoqYXJndikKK3sKKwlpbnQgYm91bmRhcnlfbGVuID0gc3RybGVuKGJvdW5kYXJ5KTsKKwljaGFyIHVuaXFbc2l6ZW9mKCIlJWxsdS4ldSIpICsgc2l6ZW9mKGludCkqM107CisKKwlkYmdfZXJyb3JfbXNnKCJCT1VOREFSWVslc10iLCBib3VuZGFyeSk7CisKKwkvLyBwcmVwYXJlIHVuaXF1ZSBzdHJpbmcgcGF0dGVybgorCXNwcmludGYodW5pcSwgIiUlbGx1LiV1IiwgKHVuc2lnbmVkKWdldHBpZCgpKTsKKwlkYmdfZXJyb3JfbXNnKCJVTklRWyVzXSIsIHVuaXEpOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqaGVhZGVyOworCQljb25zdCBjaGFyICp0b2tlbnNbMzJdOyAvKiAzMiBpcyBlbm91Z2ggKi8KKwkJY29uc3QgY2hhciAqdHlwZTsKKworCQkvKiBSZWFkIHRoZSBoZWFkZXIgKGV2ZXJ5dGhpbmcgdXAgdG8gdHdvIFxuKSAqLworCQl7CisJCQl1bnNpZ25lZCBoZWFkZXJfaWR4ID0gMDsKKwkJCWludCBsYXN0X2NoID0gMDsKKwkJCWhlYWRlciA9IE5VTEw7CisJCQl3aGlsZSAoMSkgeworCQkJCWludCBjaCA9IGZnZXRjKHN0ZGluKTsKKwkJCQlpZiAoY2ggPT0gJ1xyJykgLyogU3VwcG9ydCBib3RoIGxpbmUgZW5kaW5ncyAqLworCQkJCQljb250aW51ZTsKKwkJCQlpZiAoY2ggPT0gRU9GKQorCQkJCQlicmVhazsKKwkJCQlpZiAoY2ggPT0gJ1xuJyAmJiBsYXN0X2NoID09IGNoKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShoZWFkZXJfaWR4ICYgMHhmZikpCisJCQkJCWhlYWRlciA9IHhyZWFsbG9jKGhlYWRlciwgaGVhZGVyX2lkeCArIDB4MTAxKTsKKwkJCQloZWFkZXJbaGVhZGVyX2lkeCsrXSA9IGxhc3RfY2ggPSBjaDsKKwkJCX0KKwkJCWlmICghaGVhZGVyKSB7CisJCQkJZGJnX2Vycm9yX21zZygiRU9GIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQloZWFkZXJbaGVhZGVyX2lkeF0gPSAnXDAnOworCQkJZGJnX2Vycm9yX21zZygiSDonJXMnIiwgcCk7CisJCX0KKworCQkvKiBTcGxpdCB0byB0b2tlbnMgKi8KKwkJeworCQkJY2hhciAqcywgKnA7CisJCQl1bnNpZ25lZCBudG9rZW5zOworCQkJY29uc3QgY2hhciAqZGVsaW1zID0gIjs9XCIgXHRcbiI7CisKKwkJCS8qIFNraXAgdG8gbGFzdCBDb250ZW50LVR5cGU6ICovCisJCQlzID0gcCA9IGhlYWRlcjsKKwkJCXdoaWxlICgocCA9IHN0cmNocihwLCAnXG4nKSkgIT0gTlVMTCkgeworCQkJCXArKzsKKwkJCQlpZiAoc3RybmNhc2VjbXAocCwgIkNvbnRlbnQtVHlwZToiLCBzaXplb2YoIkNvbnRlbnQtVHlwZToiKS0xKSA9PSAwKQorCQkJCQlzID0gcDsKKwkJCX0KKwkJCWRiZ19lcnJvcl9tc2coIkw6JyVzJyIsIHApOworCQkJbnRva2VucyA9IDA7CisJCQlzID0gc3RydG9rKHMsIGRlbGltcyk7CisJCQl3aGlsZSAocykgeworCQkJCXRva2Vuc1tudG9rZW5zXSA9IHM7CisJCQkJaWYgKG50b2tlbnMgPCBBUlJBWV9TSVpFKHRva2VucykgLSAxKQorCQkJCQludG9rZW5zKys7CisJCQkJZGJnX2Vycm9yX21zZygiTFslZF09JyVzJyIsIG50b2tlbnMsIHMpOworCQkJCXMgPSBzdHJ0b2soTlVMTCwgZGVsaW1zKTsKKwkJCX0KKwkJCXRva2Vuc1tudG9rZW5zXSA9IE5VTEw7CisJCQlkYmdfZXJyb3JfbXNnKCJFTVBUWUxJTkUsIG50b2tlbnM6JWQiLCBudG9rZW5zKTsKKwkJCWlmIChudG9rZW5zID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBJcyBpdCBtdWx0aXBhcnQ/ICovCisJCXR5cGUgPSBmaW5kX3Rva2VuKHRva2VucywgIkNvbnRlbnQtVHlwZToiLCAidGV4dC9wbGFpbiIpOworCQlkYmdfZXJyb3JfbXNnKCJUWVBFOiclcyciLCB0eXBlKTsKKwkJaWYgKDAgPT0gc3RybmNhc2VjbXAodHlwZSwgIm11bHRpcGFydC8iLCAxMCkpIHsKKwkJCS8qIFllcywgcmVjdXJzZSAqLworCQkJaWYgKHN0cmNhc2VjbXAodHlwZSArIDEwLCAibWl4ZWQiKSAhPSAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBzdXBwb3J0IG9mIGNvbnRlbnQgdHlwZSAnJXMnIiwgdHlwZSk7CisJCQlwYXJzZSh4ZmluZF90b2tlbih0b2tlbnMsICJib3VuZGFyeSIpLCBhcmd2KTsKKworCQl9IGVsc2UgeworCQkJLyogTm8sIHByb2Nlc3Mgb25lIG5vbi1tdWx0aXBhcnQgc2VjdGlvbiAqLworCQkJY2hhciAqZW5kOworCQkJcGlkX3QgcGlkID0gcGlkOworCQkJRklMRSAqZnA7CisKKwkJCWNvbnN0IGNoYXIgKmNoYXJzZXQgPSBmaW5kX3Rva2VuKHRva2VucywgImNoYXJzZXQiLCBDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQpOworCQkJY29uc3QgY2hhciAqZW5jb2RpbmcgPSBmaW5kX3Rva2VuKHRva2VucywgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IiwgIjdiaXQiKTsKKworCQkJLyogQ29tcG9zZSB0YXJnZXQgZmlsZW5hbWUgKi8KKwkJCWNoYXIgKmZpbGVuYW1lID0gKGNoYXIgKilmaW5kX3Rva2VuKHRva2VucywgImZpbGVuYW1lIiwgTlVMTCk7CisJCQlpZiAoIWZpbGVuYW1lKQorCQkJCWZpbGVuYW1lID0geGFzcHJpbnRmKHVuaXEsIG1vbm90b25pY191cygpKTsKKwkJCWVsc2UKKwkJCQlmaWxlbmFtZSA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKHhzdHJkdXAoZmlsZW5hbWUpKTsKKworCQkJaWYgKG9wdHMgJiBPUFRfWCkgeworCQkJCWludCBmZFsyXTsKKworCQkJCS8qIHN0YXJ0IGV4dGVybmFsIGhlbHBlciAqLworCQkJCXhwaXBlKGZkKTsKKwkJCQlwaWQgPSB2Zm9yaygpOworCQkJCWlmICgwID09IHBpZCkgeworCQkJCQkvKiBjaGlsZCByZWFkcyBmcm9tIGZkWzBdICovCisJCQkJCWNsb3NlKGZkWzFdKTsKKwkJCQkJeG1vdmVfZmQoZmRbMF0sIFNURElOX0ZJTEVOTyk7CisJCQkJCXhzZXRlbnYoIkNPTlRFTlRfVFlQRSIsIHR5cGUpOworCQkJCQl4c2V0ZW52KCJDSEFSU0VUIiwgY2hhcnNldCk7CisJCQkJCXhzZXRlbnYoIkVOQ09ESU5HIiwgZW5jb2RpbmcpOworCQkJCQl4c2V0ZW52KCJGSUxFTkFNRSIsIGZpbGVuYW1lKTsKKwkJCQkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwkJCQl9CisJCQkJLyogcGFyZW50IHdpbGwgd3JpdGUgdG8gZmRbMV0gKi8KKwkJCQljbG9zZShmZFswXSk7CisJCQkJZnAgPSB4ZmRvcGVuX2Zvcl93cml0ZShmZFsxXSk7CisJCQkJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCQkJfSBlbHNlIHsKKwkJCQkvKiB3cml0ZSB0byBmaWxlICovCisJCQkJY2hhciAqZm5hbWUgPSB4YXNwcmludGYoIiVzJXMiLCAqYXJndiwgZmlsZW5hbWUpOworCQkJCWZwID0geGZvcGVuX2Zvcl93cml0ZShmbmFtZSk7CisJCQkJZnJlZShmbmFtZSk7CisJCQl9CisJCQlmcmVlKGZpbGVuYW1lKTsKKworCQkJLyogd3JpdGUgdG8gZnAgKi8KKwkJCWVuZCA9IE5VTEw7CisJCQlpZiAoMCA9PSBzdHJjYXNlY21wKGVuY29kaW5nLCAiYmFzZTY0IikpIHsKKwkJCQlyZWFkX2Jhc2U2NChzdGRpbiwgZnAsICctJyk7CisJCQl9IGVsc2UKKwkJCWlmICgwICE9IHN0cmNhc2VjbXAoZW5jb2RpbmcsICI3Yml0IikKKwkJCSAmJiAwICE9IHN0cmNhc2VjbXAoZW5jb2RpbmcsICI4Yml0IikKKwkJCSkgeworCQkJCS8qIHF1b3RlZC1wcmludGFibGUsIGJpbmFyeSwgdXNlci1kZWZpbmVkIGFyZSB1bnN1cHBvcnRlZCBzbyBmYXIgKi8KKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZW5jb2RpbmcgJyVzJyBub3Qgc3VwcG9ydGVkIiwgZW5jb2RpbmcpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBwbGFpbiA3Yml0IG9yIDhiaXQgKi8KKwkJCQl3aGlsZSAoKGVuZCA9IHhtYWxsb2NfZmdldHMoc3RkaW4pKSAhPSBOVUxMKSB7CisJCQkJCWlmICgnLScgPT0gZW5kWzBdCisJCQkJCSAmJiAnLScgPT0gZW5kWzFdCisJCQkJCSAmJiBzdHJuY21wKGVuZCArIDIsIGJvdW5kYXJ5LCBib3VuZGFyeV9sZW4pID09IDAKKwkJCQkJKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlmcHV0cyhlbmQsIGZwKTsKKwkJCQl9CisJCQl9CisJCQlmY2xvc2UoZnApOworCisJCQkvKiBXYWl0IGZvciBjaGlsZCAqLworCQkJaWYgKG9wdHMgJiBPUFRfWCkgeworCQkJCWludCByYzsKKwkJCQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisJCQkJcmMgPSAod2FpdDRwaWQocGlkKSAmIDB4ZmYpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlyZXR1cm4gcmMgKyAyMDsKKwkJCX0KKworCQkJLyogTXVsdGlwYXJ0IGVuZGVkPyAqLworCQkJaWYgKGVuZCAmJiAnLScgPT0gZW5kWzIgKyBib3VuZGFyeV9sZW5dICYmICctJyA9PSBlbmRbMiArIGJvdW5kYXJ5X2xlbiArIDFdKSB7CisJCQkJZGJnX2Vycm9yX21zZygiRklOSVNIRUQgTVBBUlQ6JyVzJyIsIGVuZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYmdfZXJyb3JfbXNnKCJGSU5JU0hFRDonJXMnIiwgZW5kKTsKKwkJCWZyZWUoZW5kKTsKKwkJfSAvKiBlbmQgb2YgImhhbmRsZSBvbmUgbm9uLW11bHRpcGFydCBibG9jayIgKi8KKworCQlmcmVlKGhlYWRlcik7CisJfSAvKiB3aGlsZSAoMSkgKi8KKworCWRiZ19lcnJvcl9tc2coIkVORFBBUlNFWyVzXSIsIGJvdW5kYXJ5KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8vdXNhZ2U6I2RlZmluZSByZWZvcm1pbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSByZWZvcm1pbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQYXJzZSBNSU1FLWVuY29kZWQgbWVzc2FnZSBvbiBzdGRpblxuIgorLy91c2FnZTogICAgICJcbgkteCBQUkVGSVgJRXh0cmFjdCBjb250ZW50IG9mIE1JTUUgc2VjdGlvbnMgdG8gZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS1YIFBST0cgQVJHUwlGaWx0ZXIgY29udGVudCBvZiBNSU1FIHNlY3Rpb25zIHRocm91Z2ggUFJPRyIKKy8vdXNhZ2U6ICAgICAiXG4JCQlNdXN0IGJlIHRoZSBsYXN0IG9wdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuT3RoZXIgb3B0aW9ucyBhcmUgc2lsZW50bHkgaWdub3JlZCIKKworLyoKK1VzYWdlOiByZWZvcm1pbWUgW29wdGlvbnNdCisgICAgLWQgLSBwYXJzZSBhIGRlbGl2ZXJ5IHN0YXR1cyBub3RpZmljYXRpb24uCisgICAgLWUgLSBleHRyYWN0IGNvbnRlbnRzIG9mIE1JTUUgc2VjdGlvbi4KKyAgICAteCAtIGV4dHJhY3QgTUlNRSBzZWN0aW9uIHRvIGEgZmlsZS4KKyAgICAtWCAtIHBpcGUgTUlNRSBzZWN0aW9uIHRvIGEgcHJvZ3JhbS4KKyAgICAtaSAtIHNob3cgTUlNRSBpbmZvLgorICAgIC1zIG4ubi5uLm4gLSBzcGVjaWZ5IE1JTUUgc2VjdGlvbi4KKyAgICAtciAtIHJld3JpdGUgbWVzc2FnZSwgZmlsbGluZyBpbiBtaXNzaW5nIE1JTUUgaGVhZGVycy4KKyAgICAtcjcgLSBhbHNvIGNvbnZlcnQgOGJpdC9yYXcgZW5jb2RpbmcgdG8gcXVvdGVkLXByaW50YWJsZSwgaWYgcG9zc2libGUuCisgICAgLXI4IC0gYWxzbyBjb252ZXJ0IHF1b3RlZC1wcmludGFibGUgZW5jb2RpbmcgdG8gOGJpdCwgaWYgcG9zc2libGUuCisgICAgLWMgY2hhcnNldCAtIGRlZmF1bHQgY2hhcnNldCBmb3IgcmV3cml0aW5nLCAtbywgYW5kIC1PLgorICAgIC1tIFtmaWxlXSBbZmlsZV0uLi4gLSBjcmVhdGUgYSBNSU1FIG1lc3NhZ2UgZGlnZXN0LgorICAgIC1oICJoZWFkZXIiIC0gZGVjb2RlIFJGQyAyMDQ3LWVuY29kZWQgaGVhZGVyLgorICAgIC1vICJoZWFkZXIiIC0gZW5jb2RlIHVuc3RydWN0dXJlZCBoZWFkZXIgdXNpbmcgUkZDIDIwNDcuCisgICAgLU8gImhlYWRlciIgLSBlbmNvZGUgYWRkcmVzcyBsaXN0IGhlYWRlciB1c2luZyBSRkMgMjA0Ny4KKyovCisKK2ludCByZWZvcm1pbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlZm9ybWltZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqb3B0X3ByZWZpeCA9ICIiOworCisJSU5JVF9HKCk7CisKKwkvLyBwYXJzZSBvcHRpb25zCisJLy8gTi5CLiBvbmx5IC14IGFuZCAtWCBhcmUgc3VwcG9ydGVkIHNvIGZhcgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIngtLVg6WC0teCIgSUZfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUKCI6bTo6Iik7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCSJ4OlgiIElGX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCgiZGVpczpyOmM6bTpoOm86TzoiKSwKKwkJJm9wdF9wcmVmaXgKKwkJSUZfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUKCwgTlVMTCwgTlVMTCwgJkcub3B0X2NoYXJzZXQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpCisJKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXJldHVybiBwYXJzZSgiIiwgKG9wdHMgJiBPUFRfWCkgPyBhcmd2IDogKGNoYXIgKiopJm9wdF9wcmVmaXgpOworfQpkaWZmIC0tZ2l0IGEvbWFpbHV0aWxzL3NlbmRtYWlsLmMgYi9tYWlsdXRpbHMvc2VuZG1haWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFmZjIwCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL3NlbmRtYWlsLmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJhcmUgYm9uZXMgc2VuZG1haWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1NFTkRNQUlMKSArPSBzZW5kbWFpbC5vIG1haWwubworCisvL3VzYWdlOiNkZWZpbmUgc2VuZG1haWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbUkVDSVBJRU5UX0VNQUlMXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzZW5kbWFpbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlYWQgZW1haWwgZnJvbSBzdGRpbiBhbmQgc2VuZCBpdFxuIgorLy91c2FnZTogICAgICJcblN0YW5kYXJkIG9wdGlvbnM6IgorLy91c2FnZTogICAgICJcbgktdAkJUmVhZCBhZGRpdGlvbmFsIHJlY2lwaWVudHMgZnJvbSBtZXNzYWdlIGJvZHkiCisvL3VzYWdlOiAgICAgIlxuCS1mIFNFTkRFUglTZW5kZXIgKHJlcXVpcmVkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gT1BUSU9OUwlWYXJpb3VzIG9wdGlvbnMuIC1vaSBpbXBsaWVkLCBvdGhlcnMgYXJlIGlnbm9yZWQiCisvL3VzYWdlOiAgICAgIlxuCS1pCQktb2kgc3lub255bS4gaW1wbGllZCBhbmQgaWdub3JlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQnVzeWJveCBzcGVjaWZpYyBvcHRpb25zOiIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS13IFNFQ1MJCU5ldHdvcmsgdGltZW91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLUggJ1BST0cgQVJHUycJUnVuIGNvbm5lY3Rpb24gaGVscGVyIgorLy91c2FnZTogICAgICJcbgkJCUV4YW1wbGVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JCQktSCAnZXhlYyBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtdGxzMSAtc3RhcnR0bHMgc210cCIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLWNvbm5lY3Qgc210cC5nbWFpbC5jb206MjUnIDxlbWFpbC50eHQiCisvL3VzYWdlOiAgICAgIlxuCQkJCVs0PHVzZXJuYW1lX2FuZF9wYXNzd2QudHh0IHwgLWF1PHVzZXJuYW1lPiAtYXA8cGFzc3dvcmQ+XSIKKy8vdXNhZ2U6ICAgICAiXG4JCQktSCAnZXhlYyBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtdGxzMSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLWNvbm5lY3Qgc210cC5nbWFpbC5jb206NDY1JyA8ZW1haWwudHh0IgorLy91c2FnZTogICAgICJcbgkJCQlbNDx1c2VybmFtZV9hbmRfcGFzc3dkLnR4dCB8IC1hdTx1c2VybmFtZT4gLWFwPHBhc3N3b3JkPl0iCisvL3VzYWdlOiAgICAgIlxuCS1TIEhPU1RbOlBPUlRdCVNlcnZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLWF1PHVzZXJuYW1lPglVc2VybmFtZSBmb3IgQVVUSCBMT0dJTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWFwPHBhc3N3b3JkPglQYXNzd29yZCBmb3IgQVVUSCBMT0dJTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWFtPG1ldGhvZD4JQXV0aGVudGljYXRpb24gbWV0aG9kLiBJZ25vcmVkLiBMT0dJTiBpcyBpbXBsaWVkIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5PdGhlciBvcHRpb25zIGFyZSBzaWxlbnRseSBpZ25vcmVkOyAtb2kgLXQgaXMgaW1wbGllZCIKKy8vdXNhZ2U6CUlGX01BS0VNSU1FKAorLy91c2FnZTogICAgICJcblVzZSBtYWtlbWltZSBhcHBsZXQgdG8gY3JlYXRlIG1lc3NhZ2Ugd2l0aCBhdHRhY2htZW50cyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWFpbC5oIgorCisvLyBsaW1pdCBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIGhlYWRlcnMgdG8gcHJldmVudCBvdmVyZmxvd3MuCisvLyBzZXQgdG8gMCB0byBub3QgbGltaXQKKyNkZWZpbmUgTUFYX0hFQURFUlMgMjU2CisKK3N0YXRpYyB2b2lkIHNlbmRfcl9uKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygic2VuZDonJXMnIiwgcyk7CisJcHJpbnRmKCIlc1xyXG4iLCBzKTsKK30KKworc3RhdGljIGludCBzbXRwX2NoZWNrcChjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtLCBpbnQgY29kZSkKK3sKKwljaGFyICphbnN3ZXI7CisJY2hhciAqbXNnID0gc2VuZF9tYWlsX2NvbW1hbmQoZm10LCBwYXJhbSk7CisJLy8gcmVhZCBzdGRpbgorCS8vIGlmIHRoZSBzdHJpbmcgaGFzIGEgZm9ybSBOTk4tIC0tIHJlYWQgbmV4dCBzdHJpbmcuIEUuZy4gRUhMTyByZXNwb25zZQorCS8vIHBhcnNlIGZpcnN0IGJ5dGVzIHRvIGEgbnVtYmVyCisJLy8gaWYgY29kZSA9IC0xIHRoZW4ganVzdCByZXR1cm4gdGhpcyBudW1iZXIKKwkvLyBpZiBjb2RlICE9IC0xIHRoZW4gY2hlY2tzIHdoZXRoZXIgdGhlIG51bWJlciBlcXVhbHMgdGhlIGNvZGUKKwkvLyBpZiBub3QgZXF1YWwgLT4gZGllIHNheWluZyBtc2cKKwl3aGlsZSAoKGFuc3dlciA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKCJyZWN2OiclLipzJyAlZCIsIChpbnQpKHN0cmNocm51bChhbnN3ZXIsICdccicpIC0gYW5zd2VyKSwgYW5zd2VyLCB2ZXJib3NlKTsKKwkJaWYgKHN0cmxlbihhbnN3ZXIpIDw9IDMgfHwgJy0nICE9IGFuc3dlclszXSkKKwkJCWJyZWFrOworCQlmcmVlKGFuc3dlcik7CisJfQorCWlmIChhbnN3ZXIpIHsKKwkJaW50IG4gPSBhdG9pKGFuc3dlcik7CisJCWlmICh0aW1lb3V0KQorCQkJYWxhcm0oMCk7CisJCWZyZWUobXNnKTsKKwkJZnJlZShhbnN3ZXIpOworCQlpZiAoLTEgPT0gY29kZSB8fCBuID09IGNvZGUpCisJCQlyZXR1cm4gbjsKKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGZhaWxlZCIsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgc210cF9jaGVjayhjb25zdCBjaGFyICpmbXQsIGludCBjb2RlKQoreworCXJldHVybiBzbXRwX2NoZWNrcChmbXQsIE5VTEwsIGNvZGUpOworfQorCisvLyBzdHJpcCBhcmd1bWVudCBvZiBiYWQgY2hhcnMKK3N0YXRpYyBjaGFyICpzYW5lX2FkZHJlc3MoY2hhciAqc3RyKQoreworCWNoYXIgKnMgPSBzdHI7CisJY2hhciAqcCA9IHM7CisJd2hpbGUgKCpzKSB7CisJCWlmIChpc2FsbnVtKCpzKSB8fCAnXycgPT0gKnMgfHwgJy0nID09ICpzIHx8ICcuJyA9PSAqcyB8fCAnQCcgPT0gKnMpIHsKKwkJCSpwKysgPSAqczsKKwkJfQorCQlzKys7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZCByY3B0dG8oY29uc3QgY2hhciAqcykKK3sKKwkvLyBOLkIuIHdlIGRvbid0IGRpZSBpZiByZWNpcGllbnQgaXMgcmVqZWN0ZWQsIGZvciB0aGUgb3RoZXIgcmVjaXBpZW50cyBtYXkgYmUgYWNjZXB0ZWQKKwlpZiAoMjUwICE9IHNtdHBfY2hlY2twKCJSQ1BUIFRPOjwlcz4iLCBzLCAtMSkpCisJCWJiX2Vycm9yX21zZygiQmFkIHJlY2lwaWVudDogPCVzPiIsIHMpOworfQorCitpbnQgc2VuZG1haWxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNlbmRtYWlsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpvcHRfY29ubmVjdCA9IG9wdF9jb25uZWN0OworCWNoYXIgKm9wdF9mcm9tOworCWNoYXIgKnM7CisJbGxpc3RfdCAqbGlzdCA9IE5VTEw7CisJY2hhciAqZG9tYWluID0gc2FuZV9hZGRyZXNzKHNhZmVfZ2V0ZG9tYWlubmFtZSgpKTsKKwl1bnNpZ25lZCBuaGVhZGVycyA9IDA7CisJaW50IGNvZGU7CisKKwllbnVtIHsKKwkvLy0tLSBzdGFuZGFyZCBvcHRpb25zCisJCU9QVF90ID0gMSA8PCAwLCAgICAgICAgIC8vIHJlYWQgbWVzc2FnZSBmb3IgcmVjaXBpZW50cywgYXBwZW5kIHRoZW0gdG8gdGhvc2Ugb24gY21kbGluZQorCQlPUFRfZiA9IDEgPDwgMSwgICAgICAgICAvLyBzZW5kZXIgYWRkcmVzcworCQlPUFRfbyA9IDEgPDwgMiwgICAgICAgICAvLyB2YXJpb3VzIG9wdGlvbnMuIC1vaSBJTVBMSUVEISBvdGhlcnMgYXJlIElHTk9SRUQhCisJCU9QVF9pID0gMSA8PCAzLCAgICAgICAgIC8vIElNUExJRUQhCisJLy8tLS0gQkIgc3BlY2lmaWMgb3B0aW9ucworCQlPUFRfdyA9IDEgPDwgNCwgICAgICAgICAvLyBuZXR3b3JrIHRpbWVvdXQKKwkJT1BUX0ggPSAxIDw8IDUsICAgICAgICAgLy8gdXNlIGV4dGVybmFsIGNvbm5lY3Rpb24gaGVscGVyCisJCU9QVF9TID0gMSA8PCA2LCAgICAgICAgIC8vIHNwZWNpZnkgY29ubmVjdGlvbiBzdHJpbmcKKwkJT1BUX2EgPSAxIDw8IDcsICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gdG9rZW5zCisJCU9QVF92ID0gMSA8PCA4LCAgICAgICAgIC8vIHZlcmJvc2l0eQorCX07CisKKwkvLyBpbml0IGdsb2JhbCB2YXJpYWJsZXMKKwlJTklUX0coKTsKKworCS8vIHNhdmUgaW5pdGlhbCBzdGRpbiBzaW5jZSBib2R5IGlzIHBpcGVkIQorCXhkdXAyKFNURElOX0ZJTEVOTywgMyk7CisJRy5mcDAgPSB4ZmRvcGVuX2Zvcl9yZWFkKDMpOworCisJLy8gcGFyc2Ugb3B0aW9ucworCS8vIC12IGlzIGEgY291bnRlciwgLWYgaXMgcmVxdWlyZWQuIC1IIGFuZCAtUyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCAtYSBpcyBhIGxpc3QKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ2djpmOncrOkgtLVM6Uy0tSDphOjoiOworCS8vIE4uQi4gc2luY2UgLUggYW5kIC1TIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgdGhleSBkbyBub3QgaW50ZXJmZXJlIGluIG9wdF9jb25uZWN0CisJLy8gLWEgaXMgZm9yIHNzbXRwIChodHRwOi8vZG93bmxvYWRzLm9wZW53cnQub3JnL3Blb3BsZS9uaWNvL21hbi9tYW44L3NzbXRwLjguaHRtbCkgY29tcGF0aWJpbGl0eSwKKwkvLyBpdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudC4KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInRmOm86aXc6SDpTOmE6OnYiLCAmb3B0X2Zyb20sIE5VTEwsCisJCQkmdGltZW91dCwgJm9wdF9jb25uZWN0LCAmb3B0X2Nvbm5lY3QsICZsaXN0LCAmdmVyYm9zZSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIHByb2Nlc3MgLWFbdXBtXTx0b2tlbj4gb3B0aW9ucworCWlmICgob3B0cyAmIE9QVF9hKSAmJiAhbGlzdCkKKwkJYmJfc2hvd191c2FnZSgpOworCXdoaWxlIChsaXN0KSB7CisJCWNoYXIgKmEgPSAoY2hhciAqKSBsbGlzdF9wb3AoJmxpc3QpOworCQlpZiAoJ3UnID09IGFbMF0pCisJCQlHLnVzZXIgPSB4c3RyZHVwKGErMSk7CisJCWlmICgncCcgPT0gYVswXSkKKwkJCUcucGFzcyA9IHhzdHJkdXAoYSsxKTsKKwkJLy8gTi5CLiB3ZSBzdXBwb3J0IG9ubHkgQVVUSCBMT0dJTiBzbyBmYXIKKwkJLy9pZiAoJ20nID09IGFbMF0pCisJCS8vCUcubWV0aG9kID0geHN0cmR1cChhKzEpOworCX0KKwkvLyBOLkIuIGxpc3QgPT0gTlVMTCBoZXJlCisJLy9iYl9pbmZvX21zZygiT1BUWyV4XSBBVVslc10sIEFQWyVzXSwgQU1bJXNdLCBBUkdWWyVzXSIsIG9wdHMsIGF1LCBhcCwgYW0sICphcmd2KTsKKworCS8vIGNvbm5lY3QgdG8gc2VydmVyCisKKwkvLyBjb25uZWN0aW9uIGhlbHBlciBvcmRlcmVkPyAtPgorCWlmIChvcHRzICYgT1BUX0gpIHsKKwkJY29uc3QgY2hhciAqYXJnc1tdID0geyAic2giLCAiLWMiLCBvcHRfY29ubmVjdCwgTlVMTCB9OworCQkvLyBwbHVnIGl0IGluCisJCWxhdW5jaF9oZWxwZXIoYXJncyk7CisJLy8gdmFuaWxsYSBjb25uZWN0aW9uCisJfSBlbHNlIHsKKwkJaW50IGZkOworCQkvLyBob3N0Wzpwb3J0XSBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQ/IC0+IHVzZSAkU01UUEhPU1QKKwkJLy8gbm8gJFNNVFBIT1NUID8gLT4gdXNlIGxvY2FsaG9zdAorCQlpZiAoIShvcHRzICYgT1BUX1MpKSB7CisJCQlvcHRfY29ubmVjdCA9IGdldGVudigiU01UUEhPU1QiKTsKKwkJCWlmICghb3B0X2Nvbm5lY3QpCisJCQkJb3B0X2Nvbm5lY3QgPSAoY2hhciAqKSIxMjcuMC4wLjEiOworCQl9CisJCS8vIGRvIGNvbm5lY3QKKwkJZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShvcHRfY29ubmVjdCwgMjUpOworCQkvLyBhbmQgbWFrZSBvdXJzZWx2ZXMgYSBzaW1wbGUgSU8gZmlsdGVyCisJCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCQl4ZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCX0KKwkvLyBOLkIuIGZyb20gbm93IHdlIGtub3cgbm90aGluZyBhYm91dCBuZXR3b3JrIDopCisKKwkvLyB3YWl0IGZvciBpbml0aWFsIHNlcnZlciBPSworCS8vIE4uQi4gaWYgd2UgdXNlZCBvcGVuc3NsIHRoZSBpbml0aWFsIDIyMCBhbnN3ZXIgaXMgYWxyZWFkeSBzd2FsbG93ZWQgZHVyaW5nIG9wZW5zc2wgVExTIGluaXQgcHJvY2VkdXJlCisJLy8gc28gd2UgbmVlZCB0byBraWNrIHRoZSBzZXJ2ZXIgdG8gc2VlIHdoZXRoZXIgd2UgYXJlIG9rCisJY29kZSA9IHNtdHBfY2hlY2soIk5PT1AiLCAtMSk7CisJLy8gMjIwIG9uIHBsYWluIGNvbm5lY3Rpb24sIDI1MCBvbiBvcGVuc3NsLWhlbHBlZCBUTFMgc2Vzc2lvbgorCWlmICgyMjAgPT0gY29kZSkKKwkJc210cF9jaGVjayhOVUxMLCAyNTApOyAvLyByZXJlYWQgdGhlIGNvZGUgdG8gc3RheSBpbiBzeW5jCisJZWxzZSBpZiAoMjUwICE9IGNvZGUpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJJTklUIGZhaWxlZCIpOworCisJLy8gd2Ugc2hvdWxkIHN0YXJ0IHdpdGggbW9kZXJuIEVITE8KKwlpZiAoMjUwICE9IHNtdHBfY2hlY2twKCJFSExPICVzIiwgZG9tYWluLCAtMSkpIHsKKwkJc210cF9jaGVja3AoIkhFTE8gJXMiLCBkb21haW4sIDI1MCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShkb21haW4pOworCisJLy8gcGVyZm9ybSBhdXRoZW50aWNhdGlvbgorCWlmIChvcHRzICYgT1BUX2EpIHsKKwkJc210cF9jaGVjaygiQVVUSCBMT0dJTiIsIDMzNCk7CisJCS8vIHdlIG11c3QgcmVhZCBjcmVkZW50aWFscyB1bmxlc3MgdGhleSBhcmUgZ2l2ZW4gdmlhIC1hW3VwXSBvcHRpb25zCisJCWlmICghRy51c2VyIHx8ICFHLnBhc3MpCisJCQlnZXRfY3JlZF9vcl9kaWUoNCk7CisJCWVuY29kZV9iYXNlNjQoTlVMTCwgRy51c2VyLCBOVUxMKTsKKwkJc210cF9jaGVjaygiIiwgMzM0KTsKKwkJZW5jb2RlX2Jhc2U2NChOVUxMLCBHLnBhc3MsIE5VTEwpOworCQlzbXRwX2NoZWNrKCIiLCAyMzUpOworCX0KKworCS8vIHNldCBzZW5kZXIKKwkvLyBOLkIuIHdlIGhhdmUgaGVyZSBhIHZlcnkgbG9vc2VseSBkZWZpbmVkIGFsZ290eXRobQorCS8vIHNpbmNlIHNlbmRtYWlsIGhpc3RvcmljYWxseSBvZmZlcnMgbm8gbWVhbnMgdG8gc3BlY2lmeSBzZWNyZXRzIG9uIGNtZGxpbmUuCisJLy8gMSkgc2VydmVyIGNhbiByZXF1aXJlIG5vIGF1dGhlbnRpY2F0aW9uIC0+CisJLy8Jd2UgbXVzdCBqdXN0IHByb3ZpZGUgYSAocG9zc2libHkgZmFrZSkgcmVwbHkgYWRkcmVzcy4KKwkvLyAyKSBzZXJ2ZXIgY2FuIHJlcXVpcmUgQVVUSCAtPgorCS8vCXdlIG11c3QgcHJvdmlkZSB2YWxpZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYWxvbmcgd2l0aCBhIChwb3NzaWJseSBmYWtlKSByZXBseSBhZGRyZXNzLgorCS8vCUZvciB0aGUgc2FrZSBvZiBzZWN1cml0eSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlIHRvIGJlIHJlYWQgZWl0aGVyIGZyb20gY29uc29sZSBvciBmcm9tIGEgc2VjdXJlZCBmaWxlLgorCS8vCVNpbmNlIHJlYWRpbmcgZnJvbSBjb25zb2xlIG1heSBkZWZlYXQgdXNhYmlsaXR5LCB0aGUgc29sdXRpb24gaXMgZWl0aGVyIHRvIHJlYWQgZnJvbSBhIHByZWRlZmluZWQKKwkvLwlmaWxlIGRlc2NyaXB0b3IgKGUuZy4gNCksIG9yIGFnYWluIGZyb20gYSBzZWN1cmVkIGZpbGUuCisKKwkvLyBnb3Qgbm8gc2VuZGVyIGFkZHJlc3M/IC0+IHVzZSBzeXN0ZW0gdXNlcm5hbWUgYXMgYSByZXNvcnQKKwkvLyBOLkIuIHdlIG1hcmtlZCAtZiBhcyByZXF1aXJlZCBvcHRpb24hCisJLy9pZiAoIUcudXNlcikgeworCS8vCS8vIE4uQi4gSU1ITyBnZXRlbnYoIlVTRVIiKSBjYW4gYmUgd2F5IGVhc2lseSBzcG9vZmVkIQorCS8vCUcudXNlciA9IHh1aWQydW5hbWUoZ2V0dWlkKCkpOworCS8vCW9wdF9mcm9tID0geGFzcHJpbnRmKCIlc0AlcyIsIEcudXNlciwgZG9tYWluKTsKKwkvL30KKwkvL2lmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkvLwlmcmVlKGRvbWFpbik7CisJc210cF9jaGVja3AoIk1BSUwgRlJPTTo8JXM+Iiwgb3B0X2Zyb20sIDI1MCk7CisKKwkvLyBwcm9jZXNzIG1lc3NhZ2UKKworCS8vIHJlYWQgcmVjaXBpZW50cyBmcm9tIG1lc3NhZ2UgYW5kIGFkZCB0aGVtIHRvIHRob3NlIGdpdmVuIG9uIGNtZGxpbmUuCisJLy8gdGhpcyBtZWFucyB3ZSBzY2FuIHN0ZGluIGZvciBUbzosIENjOiwgQmNjOiBsaW5lcyB1bnRpbCBhbiBlbXB0eSBsaW5lCisJLy8gYW5kIHRoZW4gdXNlIHRoZSByZXN0IG9mIHN0ZGluIGFzIG1lc3NhZ2UgYm9keQorCWNvZGUgPSAwOyAvLyBzZXQgImFuYWx5emUgaGVhZGVycyIgbW9kZQorCXdoaWxlICgocyA9IHhtYWxsb2NfZmdldGxpbmUoRy5mcDApKSAhPSBOVUxMKSB7CisgZHVtcDoKKwkJLy8gcHV0IG1lc3NhZ2UgbGluZXMgZG91YmxpbmcgbGVhZGluZyBkb3RzCisJCWlmIChjb2RlKSB7CisJCQkvLyBlc2NhcGUgbGVhZGluZyBkb3RzCisJCQkvLyBOLkIuIHRoaXMgZmVhdHVyZSBpcyBpbXBsaWVkIGV2ZW4gaWYgbm8gLWkgKC1vaSkgc3dpdGNoIGdpdmVuCisJCQkvLyBOLkIuIHdlIG5lZWQgdG8gZXNjYXBlIHRoZSBsZWFkaW5nIGRvdCByZWdhcmRsZXNzIG9mCisJCQkvLyB3aGV0aGVyIGl0IGlzIHNpbmdsZSBvciBub3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lCisJCQlpZiAoJy4nID09IHNbMF0gLyomJiAnXDAnID09IHNbMV0gKi8pCisJCQkJcHJpbnRmKCIuIik7CisJCQkvLyBkdW1wIHJlYWQgbGluZQorCQkJc2VuZF9yX24ocyk7CisJCQlmcmVlKHMpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBhbmFseXplIGhlYWRlcnMKKwkJLy8gVG86IG9yIENjOiBoZWFkZXJzIGFkZCByZWNpcGllbnRzCisJCWlmICgwID09IHN0cm5jYXNlY21wKCJUbzoiLCBzLCAzKSB8fCAwID09IHN0cm5jYXNlY21wKCJCY2M6IiArIDEsIHMsIDMpKSB7CisJCQlyY3B0dG8oc2FuZV9hZGRyZXNzKHMrMykpOworCQkJZ290byBhZGRoZWFkZXI7CisJCS8vIEJjYzogaGVhZGVyIGFkZHMgYmxpbmQgY29weSAoaGlkZGVuKSByZWNpcGllbnQKKwkJfSBlbHNlIGlmICgwID09IHN0cm5jYXNlY21wKCJCY2M6IiwgcywgNCkpIHsKKwkJCXJjcHR0byhzYW5lX2FkZHJlc3Mocys0KSk7CisJCQlmcmVlKHMpOworCQkJLy8gTi5CLiBCY2M6IHZhbmlzaGVzIGZyb20gaGVhZGVycyEKKworCQkvLyBvdGhlciBoZWFkZXJzIGdvIHZlcmJhdGltCisKKwkJLy8gTi5CLiBSRkMyODIyIDIuMi4zICJMb25nIEhlYWRlciBGaWVsZHMiIGFsbG93cyBmb3IgaGVhZGVycyB0byBvY2N1cHkgc2V2ZXJhbCBsaW5lcy4KKwkJLy8gQ29udGludWF0aW9uIGlzIGRlbm90ZWQgYnkgcHJlZml4aW5nIGFkZGl0aW9uYWwgbGluZXMgd2l0aCB3aGl0ZXNwYWNlKHMpLgorCQkvLyBUaGFua3MgKHN0ZWZhbi5zZXlmcmllZCBhdCBnb29nbGVtYWlsLmNvbSkgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgorCQl9IGVsc2UgaWYgKHN0cmNocihzLCAnOicpIHx8IChsaXN0ICYmIHNraXBfd2hpdGVzcGFjZShzKSAhPSBzKSkgeworIGFkZGhlYWRlcjoKKwkJCS8vIE4uQi4gd2UgYWxsb3cgTUFYX0hFQURFUlMgZ2VuZXJpYyBoZWFkZXJzIGF0IG1vc3QgdG8gcHJldmVudCBhdHRhY2tzCisJCQlpZiAoTUFYX0hFQURFUlMgJiYgKytuaGVhZGVycyA+PSBNQVhfSEVBREVSUykKKwkJCQlnb3RvIGJhaWw7CisJCQlsbGlzdF9hZGRfdG9fZW5kKCZsaXN0LCBzKTsKKwkJLy8gYSBsaW5lIHdpdGhvdXQgIjoiIChhbiBlbXB0eSBsaW5lIHRvbywgYnkgZGVmaW5pdGlvbikgZG9lc24ndCBsb29rIGxpa2UgYSB2YWxpZCBoZWFkZXIKKwkJLy8gc28gc3RvcCAiYW5hbHl6ZSBoZWFkZXJzIiBtb2RlCisJCX0gZWxzZSB7CisgcmVlbnRlcjoKKwkJCS8vIHB1dCByZWNpcGllbnRzIHNwZWNpZmllZCBvbiBjbWRsaW5lCisJCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCQljaGFyICp0ID0gc2FuZV9hZGRyZXNzKCphcmd2KTsKKwkJCQlyY3B0dG8odCk7CisJCQkJLy9pZiAoTUFYX0hFQURFUlMgJiYgKytuaGVhZGVycyA+PSBNQVhfSEVBREVSUykKKwkJCQkvLwlnb3RvIGJhaWw7CisJCQkJbGxpc3RfYWRkX3RvX2VuZCgmbGlzdCwgeGFzcHJpbnRmKCJUbzogJXMiLCB0KSk7CisJCQkJYXJndisrOworCQkJfQorCQkJLy8gZW50ZXIgInB1dCBtZXNzYWdlIiBtb2RlCisJCQkvLyBOLkIuIERBVEEgZmFpbHMgaWZmIG5vIHJlY2lwaWVudHMgd2VyZSBhY2NlcHRlZCAob3IgZXZlbiBwcm92aWRlZCkKKwkJCS8vIGluIHRoaXMgY2FzZSBqdXN0IGJhaWwgb3V0IGdyYWNlZnVsbHkKKwkJCWlmICgzNTQgIT0gc210cF9jaGVjaygiREFUQSIsIC0xKSkKKwkJCQlnb3RvIGJhaWw7CisJCQkvLyBkdW1wIHRoZSBoZWFkZXJzCisJCQl3aGlsZSAobGlzdCkgeworCQkJCXNlbmRfcl9uKChjaGFyICopIGxsaXN0X3BvcCgmbGlzdCkpOworCQkJfQorCQkJLy8gc3RvcCBhbmFseXppbmcgaGVhZGVycworCQkJY29kZSsrOworCQkJLy8gTi5CLiAhcyBtZWFuczogd2UgcmVhZCBub3RoaW5nLCBhbmQgbm90aGluZyB0byBiZSByZWFkIGluIHRoZSBmdXR1cmUuCisJCQkvLyBqdXN0IGR1bXAgZW1wdHkgbGluZSBhbmQgYnJlYWsgdGhlIGxvb3AKKwkJCWlmICghcykgeworCQkJCXNlbmRfcl9uKCIiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIGdvIGR1bXAgbWVzc2FnZSBib2R5CisJCQkvLyBOLkIuICJzIiBhbHJlYWR5IGNvbnRhaW5zIHRoZSBmaXJzdCBub24taGVhZGVyIGxpbmUsIHNvIHByZXRlbmQgd2UgcmVhZCBpdCBmcm9tIGlucHV0CisJCQlnb3RvIGR1bXA7CisJCX0KKwl9CisJLy8gb2RkIGNhc2U6IHdlIGRpZG4ndCBzdG9wICJhbmFseXplIGhlYWRlcnMiIG1vZGUgLT4gbWVzc2FnZSBib2R5IGlzIGVtcHR5LiBSZWVudGVyIHRoZSBsb29wCisJLy8gTi5CLiBhZnRlciByZWVudGVyIGNvZGUgd2lsbCBiZSA+IDAKKwlpZiAoIWNvZGUpCisJCWdvdG8gcmVlbnRlcjsKKworCS8vIGZpbmFsaXplIHRoZSBtZXNzYWdlCisJc210cF9jaGVjaygiLiIsIDI1MCk7CisgYmFpbDoKKwkvLyAuLi4gYW5kIHNheSBnb29kYnllCisJc210cF9jaGVjaygiUVVJVCIsIDIyMSk7CisJLy8gY2xlYW51cAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZmNsb3NlKEcuZnAwKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvQ29uZmlnLmluIGIvbWlzY3V0aWxzL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjk5NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL0NvbmZpZy5pbgpAQCAtMCwwICsxLDc2MSBAQAorIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIk1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzIgorCitjb25maWcgQ09OU1BZCisJYm9vbCAiY29uc3B5IgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEEgdGV4dC1tb2RlIFZOQyBsaWtlIHByb2dyYW0gZm9yIExpbnV4IHZpcnR1YWwgdGVybWluYWxzLgorCSAgZXhhbXBsZTogIGNvbnNweSBOVU0gICAgICBzaGFyZWQgYWNjZXNzIHRvIGNvbnNvbGUgbnVtCisJICBvciAgICAgICAgY29uc3B5IC1uZCBOVU0gIHNjcmVlbnNob3Qgb2YgY29uc29sZSBudW0KKwkgIG9yICAgICAgICBjb25zcHkgLWNzIE5VTSAgcG9vciBtYW4ncyBHTlUgc2NyZWVuIGxpa2UKK2NvbmZpZyBMRVNTCisJYm9vbCAibGVzcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICAnbGVzcycgaXMgYSBwYWdlciwgbWVhbmluZyB0aGF0IGl0IGRpc3BsYXlzIHRleHQgZmlsZXMuIEl0IHBvc3Nlc3NlcworCSAgYSB3aWRlIGFycmF5IG9mIGZlYXR1cmVzLCBhbmQgaXMgYW4gaW1wcm92ZW1lbnQgb3ZlciAnbW9yZScuCisKK2NvbmZpZyBGRUFUVVJFX0xFU1NfTUFYTElORVMKKwlpbnQgIk1heCBudW1iZXIgb2YgaW5wdXQgbGluZXMgbGVzcyB3aWxsIHRyeSB0byBlYXQiCisJZGVmYXVsdCA5OTk5OTk5CisJZGVwZW5kcyBvbiBMRVNTCisKK2NvbmZpZyBGRUFUVVJFX0xFU1NfQlJBQ0tFVFMKKwlib29sICJFbmFibGUgYnJhY2tldCBzZWFyY2hpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMRVNTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgY2FwYWJpbGl0eSB0byBzZWFyY2ggZm9yIG1hdGNoaW5nIGxlZnQgYW5kIHJpZ2h0CisJICBicmFja2V0cywgZmFjaWxpdGF0aW5nIHByb2dyYW1taW5nLgorCitjb25maWcgRkVBVFVSRV9MRVNTX0ZMQUdTCisJYm9vbCAiRW5hYmxlIGV4dHJhIGZsYWdzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTEVTUworCWhlbHAKKwkgIFRoZSBleHRyYSBmbGFncyBwcm92aWRlZCBkbyB0aGUgZm9sbG93aW5nOgorCisJICBUaGUgLU0gZmxhZyBlbmFibGVzIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHN0YXR1cyBsaW5lLgorCSAgVGhlIC1tIGZsYWcgZW5hYmxlcyBhIHNpbXBsZXIgc3RhdHVzIGxpbmUgd2l0aCBhIHBlcmNlbnRhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0xFU1NfTUFSS1MKKwlib29sICJFbmFibGUgbWFya3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMRVNTCisJaGVscAorCSAgTWFya3MgZW5hYmxlIHBvc2l0aW9ucyBpbiBhIGZpbGUgdG8gYmUgc3RvcmVkIGZvciBlYXN5IHJlZmVyZW5jZS4KKworY29uZmlnIEZFQVRVUkVfTEVTU19SRUdFWFAKKwlib29sICJFbmFibGUgcmVndWxhciBleHByZXNzaW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExFU1MKKwloZWxwCisJICBFbmFibGUgcmVndWxhciBleHByZXNzaW9ucywgYWxsb3dpbmcgY29tcGxleCBmaWxlIHNlYXJjaGVzLgorCitjb25maWcgRkVBVFVSRV9MRVNTX1dJTkNICisJYm9vbCAiRW5hYmxlIGF1dG9tYXRpYyByZXNpemluZyBvbiB3aW5kb3cgc2l6ZSBjaGFuZ2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTEVTUworCWhlbHAKKwkgIE1ha2VzIGxlc3MgdHJhY2sgd2luZG93IHNpemUgY2hhbmdlcy4KKworY29uZmlnIEZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwKKwlib29sICJVc2UgJ3RlbGwgbWUgY3Vyc29yIHBvc2l0aW9uJyBFU0Mgc2VxdWVuY2UgdG8gbWVhc3VyZSB3aW5kb3ciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0xFU1NfV0lOQ0gKKwloZWxwCisJICBNYWtlcyBsZXNzIHRyYWNrIHdpbmRvdyBzaXplIGNoYW5nZXMuCisJICBJZiB0ZXJtaW5hbCBzaXplIGNhbid0IGJlIHJldHJpZXZlZCBhbmQgJExJTkVTLyRDT0xVTU5TIGFyZSBub3Qgc2V0LAorCSAgdGhpcyBvcHRpb24gbWFrZXMgbGVzcyBwZXJmb3JtIGEgbGFzdC1kaXRjaCBlZmZvcnQgdG8gZmluZCBpdDoKKwkgIHBvc2l0aW9uIGN1cnNvciB0byA5OTksOTk5IGFuZCBhc2sgdGVybWluYWwgdG8gcmVwb3J0IHJlYWwKKwkgIGN1cnNvciBwb3NpdGlvbiB1c2luZyAiRVNDIFsgNiBuIiBlc2NhcGUgc2VxdWVuY2UsIHRoZW4gcmVhZCBzdGRpbi4KKworCSAgVGhpcyBpcyBub3QgY2xlYW4gYnV0IGhlbHBzIGEgbG90IG9uIHNlcmlhbCBsaW5lcyBhbmQgc3VjaC4KKworY29uZmlnIEZFQVRVUkVfTEVTU19EQVNIQ01ECisJYm9vbCAiRW5hYmxlIGZsYWcgY2hhbmdlcyAoJy0nIGNvbW1hbmQpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTEVTUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgY29tbWFuZC1saW5lIGZsYWdzIHdpdGhpbgorCSAgbGVzcyBpdHNlbGYgKCctJyBrZXlib2FyZCBjb21tYW5kKS4KKworY29uZmlnIEZFQVRVUkVfTEVTU19MSU5FTlVNUworCWJvb2wgIkVuYWJsZSBkeW5hbWljIHN3aXRjaGluZyBvZiBsaW5lIG51bWJlcnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0xFU1NfREFTSENNRAorCWhlbHAKKwkgIEVuYWJsZXMgIi1OIiBjb21tYW5kLgorY29uZmlnIFNFVFNFUklBTAorCWJvb2wgInNldHNlcmlhbCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSZXRyaWV2ZSBvciBzZXQgTGludXggc2VyaWFsIHBvcnQuCitjb25maWcgVUJJQVRUQUNICisJYm9vbCAidWJpYXR0YWNoIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEF0dGFjaCBNVEQgZGV2aWNlIHRvIGFuIFVCSSBkZXZpY2UuCisKK2NvbmZpZyBVQklERVRBQ0gKKwlib29sICJ1YmlkZXRhY2giCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgRGV0YWNoIE1URCBkZXZpY2UgZnJvbSBhbiBVQkkgZGV2aWNlLgorCitjb25maWcgVUJJTUtWT0wKKwlib29sICJ1Ymlta3ZvbCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBDcmVhdGUgYSBVQkkgdm9sdW1lLgorCitjb25maWcgVUJJUk1WT0wKKwlib29sICJ1YmlybXZvbCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBEZWxldGUgYSBVQkkgdm9sdW1lLgorCitjb25maWcgVUJJUlNWT0wKKwlib29sICJ1Ymlyc3ZvbCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSZXNpemUgYSBVQkkgdm9sdW1lLgorCitjb25maWcgVUJJVVBEQVRFVk9MCisJYm9vbCAidWJpdXBkYXRldm9sIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFVwZGF0ZSBhIFVCSSB2b2x1bWUuCisKK2NvbmZpZyBBREpUSU1FWAorCWJvb2wgImFkanRpbWV4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFkanRpbWV4IHJlYWRzIGFuZCBvcHRpb25hbGx5IHNldHMgYWRqdXN0bWVudCBwYXJhbWV0ZXJzIGZvcgorCSAgdGhlIExpbnV4IGNsb2NrIGFkanVzdG1lbnQgYWxnb3JpdGhtLgorCitjb25maWcgQkJDT05GSUcKKwlib29sICJiYmNvbmZpZyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGUgYmJjb25maWcgYXBwbGV0IHdpbGwgcHJpbnQgdGhlIGNvbmZpZyBmaWxlIHdpdGggd2hpY2gKKwkgIGJ1c3lib3ggd2FzIGJ1aWx0LgorCitjb25maWcgRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRworCWJvb2wgIkNvbXByZXNzIGJiY29uZmlnIGRhdGEiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCQkNPTkZJRworCWhlbHAKKwkgIFN0b3JlIGJiY29uZmlnIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtLCB1bmNvbXByZXNzIHRoZW0gb24tdGhlLWZseQorCSAgYmVmb3JlIG91dHB1dC4KKworCSAgSWYgeW91IGhhdmUgYSByZWFsbHkgdGlueSBidXN5Ym94IHdpdGggZmV3IGFwcGxldHMgZW5hYmxlZCAoYW5kCisJICBidW56aXAyIGlzbid0IG9uZSBvZiB0aGVtKSwgdGhlIG92ZXJoZWFkIG9mIHRoZSBkZWNvbXByZXNzb3IgbWlnaHQKKwkgIGJlIG5vdGljZWFibGUuIEFsc28sIGlmIHlvdSBydW4gZXhlY3V0YWJsZXMgZGlyZWN0bHkgZnJvbSBST00KKwkgIGFuZCBoYXZlIHZlcnkgbGl0dGxlIG1lbW9yeSwgdGhpcyBtaWdodCBub3QgYmUgYSB3aW4uIE90aGVyd2lzZSwKKwkgIHlvdSBwcm9iYWJseSB3YW50IHRoaXMuCisKK2NvbmZpZyBCRUVQCisJYm9vbCAiYmVlcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgYmVlcCBhcHBsZXRzIGJlZXBzIGluIGEgZ2l2ZW4gZnJlcS9Iei4KKworY29uZmlnIEZFQVRVUkVfQkVFUF9GUkVRCisJaW50ICJkZWZhdWx0IGZyZXF1ZW5jeSIKKwlyYW5nZSAwIDIxNDc0ODM2NDcKKwlkZWZhdWx0IDQwMDAKKwlkZXBlbmRzIG9uIEJFRVAKKwloZWxwCisJICBGcmVxdWVuY3kgZm9yIGRlZmF1bHQgYmVlcC4KKworY29uZmlnIEZFQVRVUkVfQkVFUF9MRU5HVEhfTVMKKwlpbnQgImRlZmF1bHQgbGVuZ3RoIgorCXJhbmdlIDAgMjE0NzQ4MzY0NworCWRlZmF1bHQgMzAKKwlkZXBlbmRzIG9uIEJFRVAKKwloZWxwCisJICBMZW5ndGggaW4gbXMgZm9yIGRlZmF1bHQgYmVlcC4KKworY29uZmlnIENIQVQKKwlib29sICJjaGF0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSBjaGF0IHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfTk9GQUlMCisJYm9vbCAiRW5hYmxlIE5PRkFJTCBleHBlY3Qgc3RyaW5ncyIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaGVuIGVuYWJsZWQgZXhwZWN0IHN0cmluZ3Mgd2hpY2ggYXJlIHN0YXJ0ZWQgd2l0aCBhIGRhc2ggdHJpZ2dlcgorCSAgbm8tZmFpbCBtb2RlLiBUaGF0IGlzIHdoZW4gZXhwZWN0YXRpb24gaXMgbm90IG1ldCB3aXRoaW4gdGltZW91dAorCSAgdGhlIHNjcmlwdCBpcyBub3QgdGVybWluYXRlZCBidXQgc2VuZHMgbmV4dCBTRU5EIHN0cmluZyBhbmQgd2FpdHMKKwkgIGZvciBuZXh0IEVYUEVDVCBzdHJpbmcuIFRoaXMgYWxsb3dzIHRvIGNvbXBvc2UgZmFyIG1vcmUgZmxleGlibGUKKwkgIHNjcmlwdHMuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfVFRZX0hJRkkKKwlib29sICJGb3JjZSBTVERJTiB0byBiZSBhIFRUWSIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IG4KKwloZWxwCisJICBPcmlnaW5hbCBjaGF0IGFsd2F5cyB0cmVhdHMgU1RESU4gYXMgYSBUVFkgZGV2aWNlIGFuZCBzZXRzIGZvciBpdAorCSAgc28tY2FsbGVkIHJhdyBtb2RlLiBUaGlzIG9wdGlvbiB0dXJucyBvbiBzdWNoIGJlaGF2aW91ci4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCWJvb2wgIkVuYWJsZSBpbXBsaWNpdCBDYXJyaWFnZSBSZXR1cm4iCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgV2hlbiBlbmFibGVkIG1ha2UgY2hhdCB0byB0ZXJtaW5hdGUgYWxsIFNFTkQgc3RyaW5ncyB3aXRoIGEgIlxyIgorCSAgdW5sZXNzICJcYyIgaXMgbWV0IGFueXdoZXJlIGluIHRoZSBzdHJpbmcuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTCisJYm9vbCAiU3dhbGxvdyBvcHRpb25zIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1c3lib3ggY2hhdCByZXF1aXJlIG5vIG9wdGlvbnMuIFRvIG1ha2UgaXQgbm90IGZhaWwgd2hlbiB1c2VkCisJICBpbiBwbGFjZSBvZiBvcmlnaW5hbCBjaGF0ICh3aGljaCBoYXMgYSBidW5jaCBvZiBvcHRpb25zKSB0dXJuCisJICB0aGlzIG9uLgorCitjb25maWcgRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUworCWJvb2wgIlN1cHBvcnQgd2VpcmQgU0VORCBlc2NhcGVzIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgdXNlcyBzb21lIGVzY2FwZSBzZXF1ZW5jZXMgaW4gU0VORCBhcmd1bWVudHMgd2hpY2gKKwkgIGFyZSBub3Qgc2VudCB0byBkZXZpY2UgYnV0IHJhdGhlciBwZXJmb3JtcyBzcGVjaWFsIGFjdGlvbnMuCisJICBFLmcuICJcSyIgbWVhbnMgdG8gc2VuZCBhIGJyZWFrIHNlcXVlbmNlIHRvIGRldmljZS4KKwkgICJcZCIgZGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzZWNvbmQsICJccCIgLS0gZm9yIGEgMS8xMDAgb2Ygc2Vjb25kLgorCSAgQmVmb3JlIHR1cm5pbmcgdGhpcyBvcHRpb24gb24gdGhpbmsgdHdpY2U6IGRvIHlvdSByZWFsbHkgbmVlZCB0aGVtPworCitjb25maWcgRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwlib29sICJTdXBwb3J0IHZhcmlhYmxlLWxlbmd0aCBBQk9SVCBjb25kaXRpb25zIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgdXNlcyBmaXhlZCA1MC1ieXRlcyBsZW5ndGggQUJPUlQgY29uZGl0aW9ucy4gU2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQKKwlib29sICJTdXBwb3J0IHJldm9raW5nIG9mIEFCT1JUIGNvbmRpdGlvbnMiCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBDTFJfQUJPUlQgZGlyZWN0aXZlLgorCitjb25maWcgQ0hSVAorCWJvb2wgImNocnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWFuaXB1bGF0ZSByZWFsLXRpbWUgYXR0cmlidXRlcyBvZiBhIHByb2Nlc3MuCisJICBUaGlzIHJlcXVpcmVzIHNjaGVkX3tnLHN9ZXRwYXJhbSBzdXBwb3J0IGluIHlvdXIgbGliYy4KKworY29uZmlnIENST05ECisJYm9vbCAiY3JvbmQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgQ3JvbmQgaXMgYSBiYWNrZ3JvdW5kIGRhZW1vbiB0aGF0IHBhcnNlcyBpbmRpdmlkdWFsIGNyb250YWIKKwkgIGZpbGVzIGFuZCBleGVjdXRlcyBjb21tYW5kcyBvbiBiZWhhbGYgb2YgdGhlIHVzZXJzIGluIHF1ZXN0aW9uLgorCSAgVGhpcyBpcyBhIHBvcnQgb2YgZGNyb24gZnJvbSBzbGFja3dhcmUuIEl0IHVzZXMgZmlsZXMgb2YgdGhlCisJICBmb3JtYXQgL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLzx1c2VybmFtZT4gZmlsZXMsIGZvciBleGFtcGxlOgorCSAgICAgICQgY2F0IC92YXIvc3Bvb2wvY3Jvbi9jcm9udGFicy9yb290CisJICAgICAgIyBSdW4gZGFpbHkgY3JvbiBqb2JzIGF0IDQ6NDAgZXZlcnkgZGF5OgorCSAgICAgIDQwIDQgKiAqICogL2V0Yy9jcm9uL2RhaWx5ID4gL2Rldi9udWxsIDI+JjEKKworY29uZmlnIEZFQVRVUkVfQ1JPTkRfRAorCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1kIHRvIHJlZGlyZWN0IG91dHB1dCB0byBzdGRlcnIiCisJZGVwZW5kcyBvbiBDUk9ORAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIC1kIHNldHMgbG9nbGV2ZWwgdG8gMCAobW9zdCB2ZXJib3NlKSBhbmQgZGlyZWN0cyBhbGwgb3V0cHV0IHRvIHN0ZGVyci4KKworY29uZmlnIEZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTAorCWJvb2wgIlJlcG9ydCBjb21tYW5kIG91dHB1dCB2aWEgZW1haWwgKHVzaW5nIHNlbmRtYWlsKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENST05ECisJaGVscAorCSAgQ29tbWFuZCBvdXRwdXQgd2lsbCBiZSBzZW50IHRvIGNvcnJlc3BvbmRpbmcgdXNlciB2aWEgZW1haWwuCisKK2NvbmZpZyBGRUFUVVJFX0NST05EX0RJUgorCXN0cmluZyAiY3JvbmQgc3Bvb2wgZGlyZWN0b3J5IgorCWRlZmF1bHQgIi92YXIvc3Bvb2wvY3JvbiIKKwlkZXBlbmRzIG9uIENST05EIHx8IENST05UQUIKKwloZWxwCisJICBMb2NhdGlvbiBvZiBjcm9uZCBzcG9vbC4KKworY29uZmlnIENST05UQUIKKwlib29sICJjcm9udGFiIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENyb250YWIgbWFuaXB1bGF0ZXMgdGhlIGNyb250YWIgZm9yIGEgcGFydGljdWxhciB1c2VyLiBPbmx5CisJICB0aGUgc3VwZXJ1c2VyIG1heSBzcGVjaWZ5IGEgZGlmZmVyZW50IHVzZXIgYW5kL29yIGNyb250YWIgZGlyZWN0b3J5LgorCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitjb25maWcgREMKKwlib29sICJkYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEYyBpcyBhIHJldmVyc2UtcG9saXNoIGRlc2sgY2FsY3VsYXRvciB3aGljaCBzdXBwb3J0cyB1bmxpbWl0ZWQKKwkgIHByZWNpc2lvbiBhcml0aG1ldGljLgorCitjb25maWcgRkVBVFVSRV9EQ19MSUJNCisJYm9vbCAiRW5hYmxlIHBvd2VyIGFuZCBleHAgZnVuY3Rpb25zIChyZXF1aXJlcyBsaWJtKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERDCisJaGVscAorCSAgRW5hYmxlIHBvd2VyIGFuZCBleHAgZnVuY3Rpb25zLgorCSAgTk9URTogVGhpcyB3aWxsIHJlcXVpcmUgbGlibSB0byBiZSBwcmVzZW50IGZvciBsaW5raW5nLgorCitjb25maWcgREVWRlNECisJYm9vbCAiZGV2ZnNkIChvYnNvbGV0ZSkiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgTk9UIGJlIHVzZWQgYW55bW9yZS4KKwkgIFVzZSBsaW51eCA+PSAyLjYgKG9wdGlvbmFsbHkgd2l0aCBob3RwbHVnKSBhbmQgbWRldiBpbnN0ZWFkIQorCSAgU2VlIGRvY3MvbWRldi50eHQgZm9yIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIG1kZXYKKwkgIGluc3RlYWQuCisKKwkgIFByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGV2aWNlIG5hbWVzIG9uIGEgZGV2ZnMgc3lzdGVtcy4KKwkgIFlvdSBzaG91bGQgc2V0IGl0IHRvIHRydWUgaWYgeW91IGhhdmUgZGV2ZnMgZW5hYmxlZC4KKwkgIFRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gZGV2c2ZkLmNvbmYgYXJlIHN1cHBvcnRlZDoKKwkgICJDTEVBUl9DT05GSUciLCAiSU5DTFVERSIsICJPUFRJT05BTF9JTkNMVURFIiwgIlJFU1RPUkUiLAorCSAgIlBFUk1JU1NJT05TIiwgIkVYRUNVVEUiLCAiQ09QWSIsICJJR05PUkUiLAorCSAgIk1LT0xEQ09NUEFUIiwgIk1LTkVXQ09NUEFUIiwiUk1PTERDT01QQVQiLCAiUk1ORVdDT01QQVQiLgorCisJICBCdXQgb25seSBpZiB0aGV5IGFyZSB3cml0dGVuIFVQUEVSQ0FTRSEhISEhISEhCisKK2NvbmZpZyBERVZGU0RfTU9ETE9BRAorCWJvb2wgIkFkZHMgc3VwcG9ydCBmb3IgTU9ETE9BRCBrZXl3b3JkIGluIGRldnNmZC5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgVGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgd2l0aCBidXN5Ym94IG1vZHV0aWxzIGJ1dCBuZWVkcworCSAgdGhlIGV4dGVybmFsIG1vZHV0aWxzLgorCitjb25maWcgREVWRlNEX0ZHX05QCisJYm9vbCAiRW5hYmxlcyB0aGUgLWZnIGFuZCAtbnAgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERFVkZTRAorCWhlbHAKKwkgIC1mZyAgUnVuIHRoZSBkYWVtb24gaW4gdGhlIGZvcmVncm91bmQuCisJICAtbnAgIEV4aXQgYWZ0ZXIgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCSAgICAgICBEbyBub3QgcG9sbCBmb3IgZXZlbnRzLgorCitjb25maWcgREVWRlNEX1ZFUkJPU0UKKwlib29sICJJbmNyZWFzZXMgbG9nZ2luZyAoYW5kIHNpemUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgSW5jcmVhc2VzIGxvZ2dpbmcgdG8gc3RkZXJyIG9yIHN5c2xvZy4KKworY29uZmlnIEZFQVRVUkVfREVWRlMKKwlib29sICJVc2UgZGV2ZnMgbmFtZXMgZm9yIGFsbCBkZXZpY2VzIChvYnNvbGV0ZSkiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIE5PVCBiZSB1c2VkIGFueW1vcmUuCisJICBVc2UgbGludXggPj0gMi42IChvcHRpb25hbGx5IHdpdGggaG90cGx1ZykgYW5kIG1kZXYgaW5zdGVhZCEKKworCSAgRm9yIGxlZ2FjeSBzeXN0ZW1zIC0tIGlmIHRoZXJlIGlzIG5vIHdheSBhcm91bmQgZGV2ZnNkIC0tIHRoaXMKKwkgIHRlbGxzIGJ1c3lib3ggdG8gbG9vayBmb3IgbmFtZXMgbGlrZSAvZGV2L2xvb3AvMCBpbnN0ZWFkIG9mCisJICAvZGV2L2xvb3AwLiBJZiB5b3VyIC9kZXYgZGlyZWN0b3J5IGhhcyBub3JtYWwgbmFtZXMgaW5zdGVhZCBvZgorCSAgZGV2ZnMgbmFtZXMsIHlvdSBkb24ndCB3YW50IHRoaXMuCisKK2NvbmZpZyBERVZNRU0KKwlib29sICJkZXZtZW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGV2bWVtIGlzIGEgc21hbGwgcHJvZ3JhbSB0aGF0IHJlYWRzIGFuZCB3cml0ZXMgZnJvbSBwaHlzaWNhbAorCSAgbWVtb3J5IHVzaW5nIC9kZXYvbWVtLgorCitjb25maWcgRUpFQ1QKKwlib29sICJlamVjdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2VkIHRvIGVqZWN0IGNkcm9tcy4gKGRlZmF1bHRzIHRvIC9kZXYvY2Ryb20pCisKK2NvbmZpZyBGRUFUVVJFX0VKRUNUX1NDU0kKKwlib29sICJTQ1NJIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBFSkVDVAorCWhlbHAKKwkgIEFkZCB0aGUgLXMgb3B0aW9uIHRvIGVqZWN0LCB0aGlzIGFsbG93cyB0byBlamVjdCBTQ1NJLURldmljZXMgYW5kCisJICB1c2Itc3RvcmFnZSBkZXZpY2VzLgorCitjb25maWcgRkJTUExBU0gKKwlib29sICJmYnNwbGFzaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaG93cyBzcGxhc2ggaW1hZ2UgYW5kIHByb2dyZXNzIGJhciBvbiBmcmFtZWJ1ZmZlciBkZXZpY2UuCisJICBDYW4gYmUgdXNlZCBkdXJpbmcgYm9vdCBwaGFzZSBvZiBhbiBlbWJlZGRlZCBkZXZpY2UuIH4ya2IuCisJICBVc2FnZToKKwkgIC0gdXNlIGtlcm5lbCBvcHRpb24gJ3ZnYT14eHgnIG9yIG90aGVyd2lzZSBlbmFibGUgZmIgZGV2aWNlLgorCSAgLSBwdXQgc29tZXdoZXJlIGZic3BsYXNoLmNmZyBmaWxlIGFuZCBhbiBpbWFnZSBpbiAucHBtIGZvcm1hdC4KKwkgIC0gJCBzZXRzaWQgZmJzcGxhc2ggW3BhcmFtc10gJgorCSAgICAtYzogaGlkZSBjdXJzb3IKKwkgICAgLWQgL2Rldi9mYk46IGZyYW1lYnVmZmVyIGRldmljZSAoaWYgbm90IC9kZXYvZmIwKQorCSAgICAtcyBwYXRoX3RvX2ltYWdlX2ZpbGUgKGNhbiBiZSAiLSIgZm9yIHN0ZGluKQorCSAgICAtaSBwYXRoX3RvX2NmZ19maWxlIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKwkgICAgLWYgcGF0aF90b19maWZvIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKwkgIC0gaWYgeW91IHdhbnQgdG8gcnVuIGl0IG9ubHkgaW4gcHJlc2VuY2Ugb2Yga2VybmVsIHBhcmFtZXRlcjoKKwkgICAgZ3JlcCAtcSAiZmJzcGxhc2g9b24iIDwvcHJvYy9jbWRsaW5lICYmIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXSAmCisJICAtIGNvbW1hbmRzIGZvciBmaWZvOgorCSAgICAiTk4iIChBU0NJSSBkZWNpbWFsIG51bWJlcikgLSBwZXJjZW50YWdlIHRvIHNob3cgb24gcHJvZ3Jlc3MgYmFyCisJICAgICJleGl0IiAtIHdlbGwgeW91IGd1ZXNzZWQgaXQKKworY29uZmlnIEZMQVNIQ1AKKwlib29sICJmbGFzaGNwIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoY3AgYmluYXJ5LCBpbnNwaXJlZCBieSBtdGQtdXRpbHMgYXMgb2YgZ2l0IGhlYWQgNWVjZWI3NGY3LgorCSAgVGhpcyB1dGlsaXR5IGlzIHVzZWQgdG8gY29weSBpbWFnZXMgaW50byBhIE1URCBkZXZpY2UuCisKK2NvbmZpZyBGTEFTSF9MT0NLCisJYm9vbCAiZmxhc2hfbG9jayIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBVYnVudHUgOC4wNAorCWhlbHAKKwkgIFRoZSBmbGFzaF9sb2NrIGJpbmFyeSBmcm9tIG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCA1ZWMwYzEwZDAuIFRoaXMKKwkgIHV0aWxpdHkgbG9ja3MgcGFydCBvciBhbGwgb2YgdGhlIGZsYXNoIGRldmljZS4KKworY29uZmlnIEZMQVNIX1VOTE9DSworCWJvb2wgImZsYXNoX3VubG9jayIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBVYnVudHUgOC4wNAorCWhlbHAKKwkgIFRoZSBmbGFzaF91bmxvY2sgYmluYXJ5IGZyb20gbXRkLXV0aWxzIGFzIG9mIGdpdCBoZWFkIDVlYzBjMTBkMC4gVGhpcworCSAgdXRpbGl0eSB1bmxvY2tzIHBhcnQgb3IgYWxsIG9mIHRoZSBmbGFzaCBkZXZpY2UuCisKK2NvbmZpZyBGTEFTSF9FUkFTRUFMTAorCWJvb2wgImZsYXNoX2VyYXNlYWxsIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoX2VyYXNlYWxsIGJpbmFyeSBmcm9tIG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCBjNGM2YTU5ZWIuCisJICBUaGlzIHV0aWxpdHkgaXMgdXNlZCB0byBlcmFzZSB0aGUgd2hvbGUgTVREIGRldmljZS4KKworY29uZmlnIE5BTkREVU1QCisJYm9vbCAibmFuZGR1bXAiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhlIG5hbmRkdW1wIGJpbmFyeSBmcm9tIG10ZC11dGlscy4KKwkgIFRoaXMgdXRpbGl0eSBpcyB1c2VkIHRvIGR1bXAgZGF0YSBmcm9tIG5hbmQgZGV2aWNlLgorCitjb25maWcgTkFORFdSSVRFCisJYm9vbCAibmFuZHdyaXRlIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoZSBuYW5kd3JpdGUgYmluYXJ5IGZyb20gbXRkLXV0aWxzLgorCSAgVGhpcyB1dGlsaXR5IGlzIHVzZWQgdG8gd3JpdGUgZGF0YSBpbnRvIG5hbmQgZGV2aWNlLgorCitjb25maWcgSU9OSUNFCisJYm9vbCAiaW9uaWNlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNldC9zZXQgcHJvZ3JhbSBpbyBzY2hlZHVsaW5nIGNsYXNzIGFuZCBwcmlvcml0eQorCSAgUmVxdWlyZXMga2VybmVsID49IDIuNi4xMworCitjb25maWcgSU5PVElGWUQKKwlib29sICJpbm90aWZ5ZCIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBLbm9wcGl4IDUKKwloZWxwCisJICBTaW1wbGUgaW5vdGlmeSBkYWVtb24uIFJlcG9ydHMgZmlsZXN5c3RlbSBjaGFuZ2VzLiBSZXF1aXJlcworCSAga2VybmVsID49IDIuNi4xMworCitjb25maWcgTEFTVAorCWJvb2wgImxhc3QiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1dUTVAKKwloZWxwCisJICAnbGFzdCcgZGlzcGxheXMgYSBsaXN0IG9mIHRoZSBsYXN0IHVzZXJzIHRoYXQgbG9nZ2VkIGludG8gdGhlIHN5c3RlbS4KKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2UgbGFzdCBpbXBsZW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIExBU1QKKwlkZWZhdWx0IEZFQVRVUkVfTEFTVF9GQU5DWQorCitjb25maWcgRkVBVFVSRV9MQVNUX1NNQUxMCisJYm9vbCAic21hbGwiCisJaGVscAorCSAgVGhpcyBpcyBhIHNtYWxsIHZlcnNpb24gb2YgbGFzdCB3aXRoIGp1c3QgdGhlIGJhc2ljIHNldCBvZgorCSAgZmVhdHVyZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xBU1RfRkFOQ1kKKwlib29sICJodWdlIgorCWhlbHAKKwkgICdsYXN0JyBkaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB1c2VycyB0aGF0CisJICBsb2dnZWQgaW50byB0aGUgc3lzdGVtIChtaW1pY3Mgc3lzdmluaXQgbGFzdCkuICs5MDAgYnl0ZXMuCitlbmRjaG9pY2UKKworY29uZmlnIEhEUEFSTQorCWJvb2wgImhkcGFybSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZXQvU2V0IGhhcmQgZHJpdmUgcGFyYW1ldGVycy4gUHJpbWFyaWx5IGludGVuZGVkIGZvciBBVEEKKwkgIGRyaXZlcy4gQWRkcyBhYm91dCAxM2sgKG9yIGFyb3VuZCAzMGsgaWYgeW91IGVuYWJsZSB0aGUKKwkgIEZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSBvcHRpb24pLi4uLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZCisJYm9vbCAiU3VwcG9ydCBvYnRhaW5pbmcgZGV0YWlsZWQgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSBkcml2ZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAtSSBhbmQgLWkgb3B0aW9ucyB0byBvYnRhaW4gZGV0YWlsZWQgaW5mb3JtYXRpb24KKwkgIGRpcmVjdGx5IGZyb20gZHJpdmVzIGFib3V0IHRoZWlyIGNhcGFiaWxpdGllcyBhbmQgc3VwcG9ydGVkIEFUQQorCSAgZmVhdHVyZSBzZXQuIElmIG5vIGRldmljZSBuYW1lIGlzIHNwZWNpZmllZCwgaGRwYXJtIHdpbGwgcmVhZAorCSAgaWRlbnRpZnkgZGF0YSBmcm9tIHN0ZGluLiBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGFkZCBhYm91dCAxNmsuLi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJYm9vbCAiUmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZSAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLVInIG9wdGlvbiB0byByZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlLgorCSAgVGhpcyBpcyBkYW5nZXJvdXMgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRgorCWJvb2wgIlVuLXJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAnaGRwYXJtIC1VJyBvcHRpb24gdG8gdW4tcmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZS4KKwkgIFRoaXMgaXMgZGFuZ2Vyb3VzIHN0dWZmLCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBOLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVAorCWJvb2wgIlBlcmZvcm0gZGV2aWNlIHJlc2V0IChEQU5HRVJPVVMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtdycgb3B0aW9uIHRvIHBlcmZvcm0gYSBkZXZpY2UgcmVzZXQuCisJICBUaGlzIGlzIGRhbmdlcm91cyBzdHVmZiwgc28geW91IHNob3VsZCBwcm9iYWJseSBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWJvb2wgIlRyaXN0YXRlIGRldmljZSBmb3IgaG90c3dhcCAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLXgnIG9wdGlvbiB0byB0cmlzdGF0ZSBkZXZpY2UgZm9yIGhvdHN3YXAsCisJICBhbmQgdGhlICctYicgb3B0aW9uIHRvIGdldC9zZXQgYnVzIHN0YXRlLiBUaGlzIGlzIGRhbmdlcm91cworCSAgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlib29sICJHZXQvc2V0IHVzaW5nX2RtYSBmbGFnIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtZCcgb3B0aW9uIHRvIGdldC9zZXQgdXNpbmdfZG1hIGZsYWcuCisKK2NvbmZpZyBNQUtFREVWUworCWJvb2wgIm1ha2VkZXZzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgICdtYWtlZGV2cycgaXMgYSB1dGlsaXR5IHVzZWQgdG8gY3JlYXRlIGEgYmF0Y2ggb2YgZGV2aWNlcyB3aXRoCisJICBvbmUgY29tbWFuZC4KKworCSAgVGhlcmUgYXJlIHR3byBjaG9pY2VzIGZvciBjb21tYW5kIGxpbmUgYmVoYXZpb3VyLCB0aGUgaW50ZXJmYWNlCisJICBhcyB1c2VkIGJ5IExFQUYvTGludXggUm91dGVyIFByb2plY3QsIG9yIGEgZGV2aWNlIHRhYmxlIGZpbGUuCisKKwkgICdsZWFmJyBpcyB0cmFkaXRpb25hbGx5IHdoYXQgYnVzeWJveCBmb2xsb3dzLCBpdCBhbGxvd3MgbXVsdGlwbGUKKwkgIGRldmljZXMgb2YgYSBwYXJ0aWNsdWFyIHR5cGUgdG8gYmUgY3JlYXRlZCBwZXIgY29tbWFuZC4KKwkgIGUuZy4gL2Rldi9oZGFbMC05XQorCSAgRGV2aWNlIHByb3BlcnRpZXMgYXJlIHBhc3NlZCBhcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorCisJICAndGFibGUnIHJlYWRzIGRldmljZSBwcm9wZXJ0aWVzIGZyb20gYSBmaWxlIG9yIHN0ZGluLCBhbGxvd2luZworCSAgYSBiYXRjaCBvZiB1bnJlbGF0ZWQgZGV2aWNlcyB0byBiZSBtYWRlIHdpdGggb25lIGNvbW1hbmQuCisJICBVc2VyL2dyb3VwIG5hbWVzIGFyZSBhbGxvd2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIHVpZC9naWQuCisKK2Nob2ljZQorCXByb21wdCAiQ2hvb3NlIG1ha2VkZXZzIGJlaGF2aW91ciIKKwlkZXBlbmRzIG9uIE1BS0VERVZTCisJZGVmYXVsdCBGRUFUVVJFX01BS0VERVZTX1RBQkxFCisKK2NvbmZpZyBGRUFUVVJFX01BS0VERVZTX0xFQUYKKwlib29sICJsZWFmIgorCitjb25maWcgRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCWJvb2wgInRhYmxlIgorCitlbmRjaG9pY2UKKworY29uZmlnIE1BTgorCWJvb2wgIm1hbiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBGb3JtYXQgYW5kIGRpc3BsYXkgbWFudWFsIHBhZ2VzLgorCitjb25maWcgTUlDUk9DT00KKwlib29sICJtaWNyb2NvbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgcG9vciBtYW4ncyBtaW5pY29tIHV0aWxpdHkgZm9yIGNoYXR0aW5nIHdpdGggc2VyaWFsIHBvcnQgZGV2aWNlcy4KKworY29uZmlnIE1PVU5UUE9JTlQKKwlib29sICJtb3VudHBvaW50IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1vdW50cG9pbnQgY2hlY2tzIGlmIHRoZSBkaXJlY3RvcnkgaXMgYSBtb3VudHBvaW50LgorCitjb25maWcgTVQKKwlib29sICJtdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtdCBpcyB1c2VkIHRvIGNvbnRyb2wgdGFwZSBkZXZpY2VzLiBZb3UgY2FuIHVzZSB0aGUgbXQgdXRpbGl0eQorCSAgdG8gYWR2YW5jZSBvciByZXdpbmQgYSB0YXBlIHBhc3QgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyY2hpdmUKKwkgIGZpbGVzIG9uIHRoZSB0YXBlLgorCitjb25maWcgUkFJREFVVE9SVU4KKwlib29sICJyYWlkYXV0b3J1biIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICByYWlkYXV0b3J1biB0ZWxscyB0aGUga2VybmVsIG1kIGRyaXZlciB0bworCSAgc2VhcmNoIGFuZCBzdGFydCBSQUlEIGFycmF5cy4KKworY29uZmlnIFJFQURBSEVBRAorCWJvb2wgInJlYWRhaGVhZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExGUworCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFByZWxvYWQgdGhlIGZpbGVzIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gUkFNIGNhY2hlIHNvIHRoYXQKKwkgIHN1YnNlcXVlbnQgcmVhZHMgb24gdGhlc2UgZmlsZXMgd2lsbCBub3QgYmxvY2sgb24gZGlzayBJL08uCisKKwkgIFRoaXMgYXBwbGV0IGp1c3QgY2FsbHMgdGhlIHJlYWRhaGVhZCgyKSBzeXN0ZW0gY2FsbCBvbiBlYWNoIGZpbGUuCisJICBJdCBpcyBtYWlubHkgdXNlZnVsIGluIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMgdG8gcHJlbG9hZCBmaWxlcworCSAgb3IgZXhlY3V0YWJsZXMgYmVmb3JlIHRoZXkgYXJlIHVzZWQuIFdoZW4gdXNlZCBhdCB0aGUgcmlnaHQgdGltZQorCSAgKGluIHBhcnRpY3VsYXIgd2hlbiBhIENQVSBib3VuZCBwcm9jZXNzIGlzIHJ1bm5pbmcpIGl0IGNhbgorCSAgc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBzeXN0ZW0gc3RhcnR1cC4KKworCSAgQXMgcmVhZGFoZWFkKDIpIGJsb2NrcyB1bnRpbCBlYWNoIGZpbGUgaGFzIGJlZW4gcmVhZCwgaXQgaXMgYmVzdCB0bworCSAgcnVuIHRoaXMgYXBwbGV0IGFzIGEgYmFja2dyb3VuZCBqb2IuCisKK2NvbmZpZyBSRktJTEwKKwlib29sICJyZmtpbGwiCisJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gVWJ1bnR1IDkuMDQKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbmFibGUvZGlzYWJsZSB3aXJlbGVzcyBkZXZpY2VzLgorCisJICByZmtpbGwgbGlzdCA6IGxpc3QgYWxsIHdpcmVsZXNzIGRldmljZXMKKwkgIHJma2lsbCBsaXN0IGJsdWV0b290aCA6IGxpc3QgYWxsIGJsdWV0b290aCBkZXZpY2VzCisJICByZmtpbGwgbGlzdCAxIDogbGlzdCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXgKKwkgIHJma2lsbCBibG9ja3x1bmJsb2NrIHdsYW4gOiBibG9jay91bmJsb2NrIGFsbCB3bGFuKHdpZmkpIGRldmljZXMKKworY29uZmlnIFJVTkxFVkVMCisJYm9vbCAicnVubGV2ZWwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKwloZWxwCisJICBmaW5kIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzeXN0ZW0gcnVubGV2ZWwuCisKKwkgIFRoaXMgYXBwbGV0IHVzZXMgdXRtcCBidXQgZG9lcyBub3QgcmVseSBvbiBidXN5Ym94IHN1cHBvcmluZworCSAgdXRtcCBvbiBwdXJwb3NlLiBJdCBpcyB1c2VkIGJ5IGUuZy4gZW1kZWJpYW4gdmlhIC9ldGMvaW5pdC5kL3JjLgorCitjb25maWcgUlgKKwlib29sICJyeCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSZWNlaXZlIGZpbGVzIHVzaW5nIHRoZSBYbW9kZW0gcHJvdG9jb2wuCisKK2NvbmZpZyBTRVRTSUQKKwlib29sICJzZXRzaWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc2V0c2lkIHJ1bnMgYSBwcm9ncmFtIGluIGEgbmV3IHNlc3Npb24KKworY29uZmlnIFNUUklOR1MKKwlib29sICJzdHJpbmdzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0cmluZ3MgcHJpbnRzIHRoZSBwcmludGFibGUgY2hhcmFjdGVyIHNlcXVlbmNlcyBmb3IgZWFjaCBmaWxlCisJICBzcGVjaWZpZWQuCisKK2NvbmZpZyBUQVNLU0VUCisJYm9vbCAidGFza3NldCIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBzb21lIG5vbi14ODYgdGFyZ2V0cyAobTY4aykKKwloZWxwCisJICBSZXRyaWV2ZSBvciBzZXQgYSBwcm9jZXNzZXMncyBDUFUgYWZmaW5pdHkuCisJICBUaGlzIHJlcXVpcmVzIHNjaGVkX3tnLHN9ZXRhZmZpbml0eSBzdXBwb3J0IGluIHlvdXIgbGliYy4KKworY29uZmlnIEZFQVRVUkVfVEFTS1NFVF9GQU5DWQorCWJvb2wgIkZhbmN5IG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBU0tTRVQKKwloZWxwCisJICBBZGQgY29kZSBmb3IgZmFuY3kgb3V0cHV0LiBUaGlzIG1lcmVseSBzaWxlbmNlcyBhIGNvbXBpbGVyLXdhcm5pbmcKKwkgIGFuZCBhZGRzIGFib3V0IDEzNSBCeXRlcy4gTWF5IGJlIG5lZWRlZCBmb3IgbWFjaGluZXMgd2l0aCBhbG90CisJICBvZiBDUFVzLgorCitjb25maWcgVElNRQorCWJvb2wgInRpbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHRpbWUgY29tbWFuZCBydW5zIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisJICBXaGVuIHRoZSBjb21tYW5kIGZpbmlzaGVzLCB0aW1lIHdyaXRlcyBhIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0CisJICBnaXZpbmcgdGltaW5nIHN0YXRpc3RpY3MgYWJvdXQgdGhpcyBwcm9ncmFtIHJ1bi4KKworY29uZmlnIFRJTUVPVVQKKwlib29sICJ0aW1lb3V0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJ1bnMgYSBwcm9ncmFtIGFuZCB3YXRjaGVzIGl0LiBJZiBpdCBkb2VzIG5vdCB0ZXJtaW5hdGUgaW4KKwkgIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcywgaXQgaXMgc2VudCBhIHNpZ25hbC4KKworY29uZmlnIFRUWVNJWkUKKwlib29sICJ0dHlzaXplIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEEgcmVwbGFjZW1lbnQgZm9yICJzdHR5IHNpemUiLiBVbmxpa2Ugc3R0eSwgY2FuIHJlcG9ydCBvbmx5IHdpZHRoLAorCSAgb25seSBoZWlnaHQsIG9yIGJvdGgsIGluIGFueSBvcmRlci4gSXQgYWxzbyBkb2VzIG5vdCBjb21wbGFpbiBvbgorCSAgZXJyb3IsIGJ1dCByZXR1cm5zIGRlZmF1bHQgODB4MjQuCisJICBVc2FnZSBpbiBzaGVsbCBzY3JpcHRzOiB3aWR0aD1gdHR5c2l6ZSB3YC4KKworY29uZmlnIFZPTE5BTUUKKwlib29sICJ2b2xuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50cyBhIENELVJPTSB2b2x1bWUgbmFtZS4KKworY29uZmlnIFdBTEwKKwlib29sICJ3YWxsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9VVE1QCisJaGVscAorCSAgV3JpdGUgYSBtZXNzYWdlIHRvIGFsbCB1c2VycyB0aGF0IGFyZSBsb2dnZWQgaW4uCisKK2NvbmZpZyBXQVRDSERPRworCWJvb2wgIndhdGNoZG9nIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSB3YXRjaGRvZyB1dGlsaXR5IGlzIHVzZWQgd2l0aCBoYXJkd2FyZSBvciBzb2Z0d2FyZSB3YXRjaGRvZworCSAgZGV2aWNlIGRyaXZlcnMuIEl0IG9wZW5zIHRoZSBzcGVjaWZpZWQgd2F0Y2hkb2cgZGV2aWNlIHNwZWNpYWwgZmlsZQorCSAgYW5kIHBlcmlvZGljYWxseSB3cml0ZXMgYSBtYWdpYyBjaGFyYWN0ZXIgdG8gdGhlIGRldmljZS4gSWYgdGhlCisJICB3YXRjaGRvZyBhcHBsZXQgZXZlciBmYWlscyB0byB3cml0ZSB0aGUgbWFnaWMgY2hhcmFjdGVyIHdpdGhpbiBhCisJICBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgZGV2aWNlIGFzc3VtZXMgdGhlIHN5c3RlbSBoYXMKKwkgIGh1bmcsIGFuZCB3aWxsIGNhdXNlIHRoZSBoYXJkd2FyZSB0byByZWJvb3QuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21pc2N1dGlscy9Db25maWcuc3JjIGIvbWlzY3V0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkZDcwOQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsNjI3IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJNaXNjZWxsYW5lb3VzIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBBREpUSU1FWAorCWJvb2wgImFkanRpbWV4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFkanRpbWV4IHJlYWRzIGFuZCBvcHRpb25hbGx5IHNldHMgYWRqdXN0bWVudCBwYXJhbWV0ZXJzIGZvcgorCSAgdGhlIExpbnV4IGNsb2NrIGFkanVzdG1lbnQgYWxnb3JpdGhtLgorCitjb25maWcgQkJDT05GSUcKKwlib29sICJiYmNvbmZpZyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGUgYmJjb25maWcgYXBwbGV0IHdpbGwgcHJpbnQgdGhlIGNvbmZpZyBmaWxlIHdpdGggd2hpY2gKKwkgIGJ1c3lib3ggd2FzIGJ1aWx0LgorCitjb25maWcgRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRworCWJvb2wgIkNvbXByZXNzIGJiY29uZmlnIGRhdGEiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCQkNPTkZJRworCWhlbHAKKwkgIFN0b3JlIGJiY29uZmlnIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtLCB1bmNvbXByZXNzIHRoZW0gb24tdGhlLWZseQorCSAgYmVmb3JlIG91dHB1dC4KKworCSAgSWYgeW91IGhhdmUgYSByZWFsbHkgdGlueSBidXN5Ym94IHdpdGggZmV3IGFwcGxldHMgZW5hYmxlZCAoYW5kCisJICBidW56aXAyIGlzbid0IG9uZSBvZiB0aGVtKSwgdGhlIG92ZXJoZWFkIG9mIHRoZSBkZWNvbXByZXNzb3IgbWlnaHQKKwkgIGJlIG5vdGljZWFibGUuIEFsc28sIGlmIHlvdSBydW4gZXhlY3V0YWJsZXMgZGlyZWN0bHkgZnJvbSBST00KKwkgIGFuZCBoYXZlIHZlcnkgbGl0dGxlIG1lbW9yeSwgdGhpcyBtaWdodCBub3QgYmUgYSB3aW4uIE90aGVyd2lzZSwKKwkgIHlvdSBwcm9iYWJseSB3YW50IHRoaXMuCisKK2NvbmZpZyBCRUVQCisJYm9vbCAiYmVlcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgYmVlcCBhcHBsZXRzIGJlZXBzIGluIGEgZ2l2ZW4gZnJlcS9Iei4KKworY29uZmlnIEZFQVRVUkVfQkVFUF9GUkVRCisJaW50ICJkZWZhdWx0IGZyZXF1ZW5jeSIKKwlyYW5nZSAwIDIxNDc0ODM2NDcKKwlkZWZhdWx0IDQwMDAKKwlkZXBlbmRzIG9uIEJFRVAKKwloZWxwCisJICBGcmVxdWVuY3kgZm9yIGRlZmF1bHQgYmVlcC4KKworY29uZmlnIEZFQVRVUkVfQkVFUF9MRU5HVEhfTVMKKwlpbnQgImRlZmF1bHQgbGVuZ3RoIgorCXJhbmdlIDAgMjE0NzQ4MzY0NworCWRlZmF1bHQgMzAKKwlkZXBlbmRzIG9uIEJFRVAKKwloZWxwCisJICBMZW5ndGggaW4gbXMgZm9yIGRlZmF1bHQgYmVlcC4KKworY29uZmlnIENIQVQKKwlib29sICJjaGF0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSBjaGF0IHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfTk9GQUlMCisJYm9vbCAiRW5hYmxlIE5PRkFJTCBleHBlY3Qgc3RyaW5ncyIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaGVuIGVuYWJsZWQgZXhwZWN0IHN0cmluZ3Mgd2hpY2ggYXJlIHN0YXJ0ZWQgd2l0aCBhIGRhc2ggdHJpZ2dlcgorCSAgbm8tZmFpbCBtb2RlLiBUaGF0IGlzIHdoZW4gZXhwZWN0YXRpb24gaXMgbm90IG1ldCB3aXRoaW4gdGltZW91dAorCSAgdGhlIHNjcmlwdCBpcyBub3QgdGVybWluYXRlZCBidXQgc2VuZHMgbmV4dCBTRU5EIHN0cmluZyBhbmQgd2FpdHMKKwkgIGZvciBuZXh0IEVYUEVDVCBzdHJpbmcuIFRoaXMgYWxsb3dzIHRvIGNvbXBvc2UgZmFyIG1vcmUgZmxleGlibGUKKwkgIHNjcmlwdHMuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfVFRZX0hJRkkKKwlib29sICJGb3JjZSBTVERJTiB0byBiZSBhIFRUWSIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IG4KKwloZWxwCisJICBPcmlnaW5hbCBjaGF0IGFsd2F5cyB0cmVhdHMgU1RESU4gYXMgYSBUVFkgZGV2aWNlIGFuZCBzZXRzIGZvciBpdAorCSAgc28tY2FsbGVkIHJhdyBtb2RlLiBUaGlzIG9wdGlvbiB0dXJucyBvbiBzdWNoIGJlaGF2aW91ci4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCWJvb2wgIkVuYWJsZSBpbXBsaWNpdCBDYXJyaWFnZSBSZXR1cm4iCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgV2hlbiBlbmFibGVkIG1ha2UgY2hhdCB0byB0ZXJtaW5hdGUgYWxsIFNFTkQgc3RyaW5ncyB3aXRoIGEgIlxyIgorCSAgdW5sZXNzICJcYyIgaXMgbWV0IGFueXdoZXJlIGluIHRoZSBzdHJpbmcuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTCisJYm9vbCAiU3dhbGxvdyBvcHRpb25zIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1c3lib3ggY2hhdCByZXF1aXJlIG5vIG9wdGlvbnMuIFRvIG1ha2UgaXQgbm90IGZhaWwgd2hlbiB1c2VkCisJICBpbiBwbGFjZSBvZiBvcmlnaW5hbCBjaGF0ICh3aGljaCBoYXMgYSBidW5jaCBvZiBvcHRpb25zKSB0dXJuCisJICB0aGlzIG9uLgorCitjb25maWcgRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUworCWJvb2wgIlN1cHBvcnQgd2VpcmQgU0VORCBlc2NhcGVzIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgdXNlcyBzb21lIGVzY2FwZSBzZXF1ZW5jZXMgaW4gU0VORCBhcmd1bWVudHMgd2hpY2gKKwkgIGFyZSBub3Qgc2VudCB0byBkZXZpY2UgYnV0IHJhdGhlciBwZXJmb3JtcyBzcGVjaWFsIGFjdGlvbnMuCisJICBFLmcuICJcSyIgbWVhbnMgdG8gc2VuZCBhIGJyZWFrIHNlcXVlbmNlIHRvIGRldmljZS4KKwkgICJcZCIgZGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzZWNvbmQsICJccCIgLS0gZm9yIGEgMS8xMDAgb2Ygc2Vjb25kLgorCSAgQmVmb3JlIHR1cm5pbmcgdGhpcyBvcHRpb24gb24gdGhpbmsgdHdpY2U6IGRvIHlvdSByZWFsbHkgbmVlZCB0aGVtPworCitjb25maWcgRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwlib29sICJTdXBwb3J0IHZhcmlhYmxlLWxlbmd0aCBBQk9SVCBjb25kaXRpb25zIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgdXNlcyBmaXhlZCA1MC1ieXRlcyBsZW5ndGggQUJPUlQgY29uZGl0aW9ucy4gU2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQKKwlib29sICJTdXBwb3J0IHJldm9raW5nIG9mIEFCT1JUIGNvbmRpdGlvbnMiCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBDTFJfQUJPUlQgZGlyZWN0aXZlLgorCitjb25maWcgQ0hSVAorCWJvb2wgImNocnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWFuaXB1bGF0ZSByZWFsLXRpbWUgYXR0cmlidXRlcyBvZiBhIHByb2Nlc3MuCisJICBUaGlzIHJlcXVpcmVzIHNjaGVkX3tnLHN9ZXRwYXJhbSBzdXBwb3J0IGluIHlvdXIgbGliYy4KKworY29uZmlnIENST05ECisJYm9vbCAiY3JvbmQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgQ3JvbmQgaXMgYSBiYWNrZ3JvdW5kIGRhZW1vbiB0aGF0IHBhcnNlcyBpbmRpdmlkdWFsIGNyb250YWIKKwkgIGZpbGVzIGFuZCBleGVjdXRlcyBjb21tYW5kcyBvbiBiZWhhbGYgb2YgdGhlIHVzZXJzIGluIHF1ZXN0aW9uLgorCSAgVGhpcyBpcyBhIHBvcnQgb2YgZGNyb24gZnJvbSBzbGFja3dhcmUuIEl0IHVzZXMgZmlsZXMgb2YgdGhlCisJICBmb3JtYXQgL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLzx1c2VybmFtZT4gZmlsZXMsIGZvciBleGFtcGxlOgorCSAgICAgICQgY2F0IC92YXIvc3Bvb2wvY3Jvbi9jcm9udGFicy9yb290CisJICAgICAgIyBSdW4gZGFpbHkgY3JvbiBqb2JzIGF0IDQ6NDAgZXZlcnkgZGF5OgorCSAgICAgIDQwIDQgKiAqICogL2V0Yy9jcm9uL2RhaWx5ID4gL2Rldi9udWxsIDI+JjEKKworY29uZmlnIEZFQVRVUkVfQ1JPTkRfRAorCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1kIHRvIHJlZGlyZWN0IG91dHB1dCB0byBzdGRlcnIiCisJZGVwZW5kcyBvbiBDUk9ORAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIC1kIHNldHMgbG9nbGV2ZWwgdG8gMCAobW9zdCB2ZXJib3NlKSBhbmQgZGlyZWN0cyBhbGwgb3V0cHV0IHRvIHN0ZGVyci4KKworY29uZmlnIEZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTAorCWJvb2wgIlJlcG9ydCBjb21tYW5kIG91dHB1dCB2aWEgZW1haWwgKHVzaW5nIHNlbmRtYWlsKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENST05ECisJaGVscAorCSAgQ29tbWFuZCBvdXRwdXQgd2lsbCBiZSBzZW50IHRvIGNvcnJlc3BvbmRpbmcgdXNlciB2aWEgZW1haWwuCisKK2NvbmZpZyBGRUFUVVJFX0NST05EX0RJUgorCXN0cmluZyAiY3JvbmQgc3Bvb2wgZGlyZWN0b3J5IgorCWRlZmF1bHQgIi92YXIvc3Bvb2wvY3JvbiIKKwlkZXBlbmRzIG9uIENST05EIHx8IENST05UQUIKKwloZWxwCisJICBMb2NhdGlvbiBvZiBjcm9uZCBzcG9vbC4KKworY29uZmlnIENST05UQUIKKwlib29sICJjcm9udGFiIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENyb250YWIgbWFuaXB1bGF0ZXMgdGhlIGNyb250YWIgZm9yIGEgcGFydGljdWxhciB1c2VyLiBPbmx5CisJICB0aGUgc3VwZXJ1c2VyIG1heSBzcGVjaWZ5IGEgZGlmZmVyZW50IHVzZXIgYW5kL29yIGNyb250YWIgZGlyZWN0b3J5LgorCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitjb25maWcgREMKKwlib29sICJkYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEYyBpcyBhIHJldmVyc2UtcG9saXNoIGRlc2sgY2FsY3VsYXRvciB3aGljaCBzdXBwb3J0cyB1bmxpbWl0ZWQKKwkgIHByZWNpc2lvbiBhcml0aG1ldGljLgorCitjb25maWcgRkVBVFVSRV9EQ19MSUJNCisJYm9vbCAiRW5hYmxlIHBvd2VyIGFuZCBleHAgZnVuY3Rpb25zIChyZXF1aXJlcyBsaWJtKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERDCisJaGVscAorCSAgRW5hYmxlIHBvd2VyIGFuZCBleHAgZnVuY3Rpb25zLgorCSAgTk9URTogVGhpcyB3aWxsIHJlcXVpcmUgbGlibSB0byBiZSBwcmVzZW50IGZvciBsaW5raW5nLgorCitjb25maWcgREVWRlNECisJYm9vbCAiZGV2ZnNkIChvYnNvbGV0ZSkiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgTk9UIGJlIHVzZWQgYW55bW9yZS4KKwkgIFVzZSBsaW51eCA+PSAyLjYgKG9wdGlvbmFsbHkgd2l0aCBob3RwbHVnKSBhbmQgbWRldiBpbnN0ZWFkIQorCSAgU2VlIGRvY3MvbWRldi50eHQgZm9yIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIG1kZXYKKwkgIGluc3RlYWQuCisKKwkgIFByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGV2aWNlIG5hbWVzIG9uIGEgZGV2ZnMgc3lzdGVtcy4KKwkgIFlvdSBzaG91bGQgc2V0IGl0IHRvIHRydWUgaWYgeW91IGhhdmUgZGV2ZnMgZW5hYmxlZC4KKwkgIFRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gZGV2c2ZkLmNvbmYgYXJlIHN1cHBvcnRlZDoKKwkgICJDTEVBUl9DT05GSUciLCAiSU5DTFVERSIsICJPUFRJT05BTF9JTkNMVURFIiwgIlJFU1RPUkUiLAorCSAgIlBFUk1JU1NJT05TIiwgIkVYRUNVVEUiLCAiQ09QWSIsICJJR05PUkUiLAorCSAgIk1LT0xEQ09NUEFUIiwgIk1LTkVXQ09NUEFUIiwiUk1PTERDT01QQVQiLCAiUk1ORVdDT01QQVQiLgorCisJICBCdXQgb25seSBpZiB0aGV5IGFyZSB3cml0dGVuIFVQUEVSQ0FTRSEhISEhISEhCisKK2NvbmZpZyBERVZGU0RfTU9ETE9BRAorCWJvb2wgIkFkZHMgc3VwcG9ydCBmb3IgTU9ETE9BRCBrZXl3b3JkIGluIGRldnNmZC5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgVGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgd2l0aCBidXN5Ym94IG1vZHV0aWxzIGJ1dCBuZWVkcworCSAgdGhlIGV4dGVybmFsIG1vZHV0aWxzLgorCitjb25maWcgREVWRlNEX0ZHX05QCisJYm9vbCAiRW5hYmxlcyB0aGUgLWZnIGFuZCAtbnAgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERFVkZTRAorCWhlbHAKKwkgIC1mZyAgUnVuIHRoZSBkYWVtb24gaW4gdGhlIGZvcmVncm91bmQuCisJICAtbnAgIEV4aXQgYWZ0ZXIgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCSAgICAgICBEbyBub3QgcG9sbCBmb3IgZXZlbnRzLgorCitjb25maWcgREVWRlNEX1ZFUkJPU0UKKwlib29sICJJbmNyZWFzZXMgbG9nZ2luZyAoYW5kIHNpemUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgSW5jcmVhc2VzIGxvZ2dpbmcgdG8gc3RkZXJyIG9yIHN5c2xvZy4KKworY29uZmlnIEZFQVRVUkVfREVWRlMKKwlib29sICJVc2UgZGV2ZnMgbmFtZXMgZm9yIGFsbCBkZXZpY2VzIChvYnNvbGV0ZSkiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIE5PVCBiZSB1c2VkIGFueW1vcmUuCisJICBVc2UgbGludXggPj0gMi42IChvcHRpb25hbGx5IHdpdGggaG90cGx1ZykgYW5kIG1kZXYgaW5zdGVhZCEKKworCSAgRm9yIGxlZ2FjeSBzeXN0ZW1zIC0tIGlmIHRoZXJlIGlzIG5vIHdheSBhcm91bmQgZGV2ZnNkIC0tIHRoaXMKKwkgIHRlbGxzIGJ1c3lib3ggdG8gbG9vayBmb3IgbmFtZXMgbGlrZSAvZGV2L2xvb3AvMCBpbnN0ZWFkIG9mCisJICAvZGV2L2xvb3AwLiBJZiB5b3VyIC9kZXYgZGlyZWN0b3J5IGhhcyBub3JtYWwgbmFtZXMgaW5zdGVhZCBvZgorCSAgZGV2ZnMgbmFtZXMsIHlvdSBkb24ndCB3YW50IHRoaXMuCisKK2NvbmZpZyBERVZNRU0KKwlib29sICJkZXZtZW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGV2bWVtIGlzIGEgc21hbGwgcHJvZ3JhbSB0aGF0IHJlYWRzIGFuZCB3cml0ZXMgZnJvbSBwaHlzaWNhbAorCSAgbWVtb3J5IHVzaW5nIC9kZXYvbWVtLgorCitjb25maWcgRUpFQ1QKKwlib29sICJlamVjdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2VkIHRvIGVqZWN0IGNkcm9tcy4gKGRlZmF1bHRzIHRvIC9kZXYvY2Ryb20pCisKK2NvbmZpZyBGRUFUVVJFX0VKRUNUX1NDU0kKKwlib29sICJTQ1NJIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBFSkVDVAorCWhlbHAKKwkgIEFkZCB0aGUgLXMgb3B0aW9uIHRvIGVqZWN0LCB0aGlzIGFsbG93cyB0byBlamVjdCBTQ1NJLURldmljZXMgYW5kCisJICB1c2Itc3RvcmFnZSBkZXZpY2VzLgorCitjb25maWcgRkJTUExBU0gKKwlib29sICJmYnNwbGFzaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaG93cyBzcGxhc2ggaW1hZ2UgYW5kIHByb2dyZXNzIGJhciBvbiBmcmFtZWJ1ZmZlciBkZXZpY2UuCisJICBDYW4gYmUgdXNlZCBkdXJpbmcgYm9vdCBwaGFzZSBvZiBhbiBlbWJlZGRlZCBkZXZpY2UuIH4ya2IuCisJICBVc2FnZToKKwkgIC0gdXNlIGtlcm5lbCBvcHRpb24gJ3ZnYT14eHgnIG9yIG90aGVyd2lzZSBlbmFibGUgZmIgZGV2aWNlLgorCSAgLSBwdXQgc29tZXdoZXJlIGZic3BsYXNoLmNmZyBmaWxlIGFuZCBhbiBpbWFnZSBpbiAucHBtIGZvcm1hdC4KKwkgIC0gJCBzZXRzaWQgZmJzcGxhc2ggW3BhcmFtc10gJgorCSAgICAtYzogaGlkZSBjdXJzb3IKKwkgICAgLWQgL2Rldi9mYk46IGZyYW1lYnVmZmVyIGRldmljZSAoaWYgbm90IC9kZXYvZmIwKQorCSAgICAtcyBwYXRoX3RvX2ltYWdlX2ZpbGUgKGNhbiBiZSAiLSIgZm9yIHN0ZGluKQorCSAgICAtaSBwYXRoX3RvX2NmZ19maWxlIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKwkgICAgLWYgcGF0aF90b19maWZvIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKwkgIC0gaWYgeW91IHdhbnQgdG8gcnVuIGl0IG9ubHkgaW4gcHJlc2VuY2Ugb2Yga2VybmVsIHBhcmFtZXRlcjoKKwkgICAgZ3JlcCAtcSAiZmJzcGxhc2g9b24iIDwvcHJvYy9jbWRsaW5lICYmIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXSAmCisJICAtIGNvbW1hbmRzIGZvciBmaWZvOgorCSAgICAiTk4iIChBU0NJSSBkZWNpbWFsIG51bWJlcikgLSBwZXJjZW50YWdlIHRvIHNob3cgb24gcHJvZ3Jlc3MgYmFyCisJICAgICJleGl0IiAtIHdlbGwgeW91IGd1ZXNzZWQgaXQKKworY29uZmlnIEZMQVNIQ1AKKwlib29sICJmbGFzaGNwIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoY3AgYmluYXJ5LCBpbnNwaXJlZCBieSBtdGQtdXRpbHMgYXMgb2YgZ2l0IGhlYWQgNWVjZWI3NGY3LgorCSAgVGhpcyB1dGlsaXR5IGlzIHVzZWQgdG8gY29weSBpbWFnZXMgaW50byBhIE1URCBkZXZpY2UuCisKK2NvbmZpZyBGTEFTSF9MT0NLCisJYm9vbCAiZmxhc2hfbG9jayIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBVYnVudHUgOC4wNAorCWhlbHAKKwkgIFRoZSBmbGFzaF9sb2NrIGJpbmFyeSBmcm9tIG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCA1ZWMwYzEwZDAuIFRoaXMKKwkgIHV0aWxpdHkgbG9ja3MgcGFydCBvciBhbGwgb2YgdGhlIGZsYXNoIGRldmljZS4KKworY29uZmlnIEZMQVNIX1VOTE9DSworCWJvb2wgImZsYXNoX3VubG9jayIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBVYnVudHUgOC4wNAorCWhlbHAKKwkgIFRoZSBmbGFzaF91bmxvY2sgYmluYXJ5IGZyb20gbXRkLXV0aWxzIGFzIG9mIGdpdCBoZWFkIDVlYzBjMTBkMC4gVGhpcworCSAgdXRpbGl0eSB1bmxvY2tzIHBhcnQgb3IgYWxsIG9mIHRoZSBmbGFzaCBkZXZpY2UuCisKK2NvbmZpZyBGTEFTSF9FUkFTRUFMTAorCWJvb2wgImZsYXNoX2VyYXNlYWxsIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoX2VyYXNlYWxsIGJpbmFyeSBmcm9tIG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCBjNGM2YTU5ZWIuCisJICBUaGlzIHV0aWxpdHkgaXMgdXNlZCB0byBlcmFzZSB0aGUgd2hvbGUgTVREIGRldmljZS4KKworY29uZmlnIE5BTkREVU1QCisJYm9vbCAibmFuZGR1bXAiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhlIG5hbmRkdW1wIGJpbmFyeSBmcm9tIG10ZC11dGlscy4KKwkgIFRoaXMgdXRpbGl0eSBpcyB1c2VkIHRvIGR1bXAgZGF0YSBmcm9tIG5hbmQgZGV2aWNlLgorCitjb25maWcgTkFORFdSSVRFCisJYm9vbCAibmFuZHdyaXRlIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoZSBuYW5kd3JpdGUgYmluYXJ5IGZyb20gbXRkLXV0aWxzLgorCSAgVGhpcyB1dGlsaXR5IGlzIHVzZWQgdG8gd3JpdGUgZGF0YSBpbnRvIG5hbmQgZGV2aWNlLgorCitjb25maWcgSU9OSUNFCisJYm9vbCAiaW9uaWNlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNldC9zZXQgcHJvZ3JhbSBpbyBzY2hlZHVsaW5nIGNsYXNzIGFuZCBwcmlvcml0eQorCSAgUmVxdWlyZXMga2VybmVsID49IDIuNi4xMworCitjb25maWcgSU5PVElGWUQKKwlib29sICJpbm90aWZ5ZCIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBLbm9wcGl4IDUKKwloZWxwCisJICBTaW1wbGUgaW5vdGlmeSBkYWVtb24uIFJlcG9ydHMgZmlsZXN5c3RlbSBjaGFuZ2VzLiBSZXF1aXJlcworCSAga2VybmVsID49IDIuNi4xMworCitjb25maWcgTEFTVAorCWJvb2wgImxhc3QiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1dUTVAKKwloZWxwCisJICAnbGFzdCcgZGlzcGxheXMgYSBsaXN0IG9mIHRoZSBsYXN0IHVzZXJzIHRoYXQgbG9nZ2VkIGludG8gdGhlIHN5c3RlbS4KKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2UgbGFzdCBpbXBsZW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIExBU1QKKwlkZWZhdWx0IEZFQVRVUkVfTEFTVF9GQU5DWQorCitjb25maWcgRkVBVFVSRV9MQVNUX1NNQUxMCisJYm9vbCAic21hbGwiCisJaGVscAorCSAgVGhpcyBpcyBhIHNtYWxsIHZlcnNpb24gb2YgbGFzdCB3aXRoIGp1c3QgdGhlIGJhc2ljIHNldCBvZgorCSAgZmVhdHVyZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xBU1RfRkFOQ1kKKwlib29sICJodWdlIgorCWhlbHAKKwkgICdsYXN0JyBkaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB1c2VycyB0aGF0CisJICBsb2dnZWQgaW50byB0aGUgc3lzdGVtIChtaW1pY3Mgc3lzdmluaXQgbGFzdCkuICs5MDAgYnl0ZXMuCitlbmRjaG9pY2UKKworY29uZmlnIEhEUEFSTQorCWJvb2wgImhkcGFybSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZXQvU2V0IGhhcmQgZHJpdmUgcGFyYW1ldGVycy4gUHJpbWFyaWx5IGludGVuZGVkIGZvciBBVEEKKwkgIGRyaXZlcy4gQWRkcyBhYm91dCAxM2sgKG9yIGFyb3VuZCAzMGsgaWYgeW91IGVuYWJsZSB0aGUKKwkgIEZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSBvcHRpb24pLi4uLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZCisJYm9vbCAiU3VwcG9ydCBvYnRhaW5pbmcgZGV0YWlsZWQgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSBkcml2ZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAtSSBhbmQgLWkgb3B0aW9ucyB0byBvYnRhaW4gZGV0YWlsZWQgaW5mb3JtYXRpb24KKwkgIGRpcmVjdGx5IGZyb20gZHJpdmVzIGFib3V0IHRoZWlyIGNhcGFiaWxpdGllcyBhbmQgc3VwcG9ydGVkIEFUQQorCSAgZmVhdHVyZSBzZXQuIElmIG5vIGRldmljZSBuYW1lIGlzIHNwZWNpZmllZCwgaGRwYXJtIHdpbGwgcmVhZAorCSAgaWRlbnRpZnkgZGF0YSBmcm9tIHN0ZGluLiBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGFkZCBhYm91dCAxNmsuLi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJYm9vbCAiUmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZSAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLVInIG9wdGlvbiB0byByZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlLgorCSAgVGhpcyBpcyBkYW5nZXJvdXMgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRgorCWJvb2wgIlVuLXJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAnaGRwYXJtIC1VJyBvcHRpb24gdG8gdW4tcmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZS4KKwkgIFRoaXMgaXMgZGFuZ2Vyb3VzIHN0dWZmLCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBOLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVAorCWJvb2wgIlBlcmZvcm0gZGV2aWNlIHJlc2V0IChEQU5HRVJPVVMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtdycgb3B0aW9uIHRvIHBlcmZvcm0gYSBkZXZpY2UgcmVzZXQuCisJICBUaGlzIGlzIGRhbmdlcm91cyBzdHVmZiwgc28geW91IHNob3VsZCBwcm9iYWJseSBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWJvb2wgIlRyaXN0YXRlIGRldmljZSBmb3IgaG90c3dhcCAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLXgnIG9wdGlvbiB0byB0cmlzdGF0ZSBkZXZpY2UgZm9yIGhvdHN3YXAsCisJICBhbmQgdGhlICctYicgb3B0aW9uIHRvIGdldC9zZXQgYnVzIHN0YXRlLiBUaGlzIGlzIGRhbmdlcm91cworCSAgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlib29sICJHZXQvc2V0IHVzaW5nX2RtYSBmbGFnIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtZCcgb3B0aW9uIHRvIGdldC9zZXQgdXNpbmdfZG1hIGZsYWcuCisKK2NvbmZpZyBNQUtFREVWUworCWJvb2wgIm1ha2VkZXZzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgICdtYWtlZGV2cycgaXMgYSB1dGlsaXR5IHVzZWQgdG8gY3JlYXRlIGEgYmF0Y2ggb2YgZGV2aWNlcyB3aXRoCisJICBvbmUgY29tbWFuZC4KKworCSAgVGhlcmUgYXJlIHR3byBjaG9pY2VzIGZvciBjb21tYW5kIGxpbmUgYmVoYXZpb3VyLCB0aGUgaW50ZXJmYWNlCisJICBhcyB1c2VkIGJ5IExFQUYvTGludXggUm91dGVyIFByb2plY3QsIG9yIGEgZGV2aWNlIHRhYmxlIGZpbGUuCisKKwkgICdsZWFmJyBpcyB0cmFkaXRpb25hbGx5IHdoYXQgYnVzeWJveCBmb2xsb3dzLCBpdCBhbGxvd3MgbXVsdGlwbGUKKwkgIGRldmljZXMgb2YgYSBwYXJ0aWNsdWFyIHR5cGUgdG8gYmUgY3JlYXRlZCBwZXIgY29tbWFuZC4KKwkgIGUuZy4gL2Rldi9oZGFbMC05XQorCSAgRGV2aWNlIHByb3BlcnRpZXMgYXJlIHBhc3NlZCBhcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorCisJICAndGFibGUnIHJlYWRzIGRldmljZSBwcm9wZXJ0aWVzIGZyb20gYSBmaWxlIG9yIHN0ZGluLCBhbGxvd2luZworCSAgYSBiYXRjaCBvZiB1bnJlbGF0ZWQgZGV2aWNlcyB0byBiZSBtYWRlIHdpdGggb25lIGNvbW1hbmQuCisJICBVc2VyL2dyb3VwIG5hbWVzIGFyZSBhbGxvd2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIHVpZC9naWQuCisKK2Nob2ljZQorCXByb21wdCAiQ2hvb3NlIG1ha2VkZXZzIGJlaGF2aW91ciIKKwlkZXBlbmRzIG9uIE1BS0VERVZTCisJZGVmYXVsdCBGRUFUVVJFX01BS0VERVZTX1RBQkxFCisKK2NvbmZpZyBGRUFUVVJFX01BS0VERVZTX0xFQUYKKwlib29sICJsZWFmIgorCitjb25maWcgRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCWJvb2wgInRhYmxlIgorCitlbmRjaG9pY2UKKworY29uZmlnIE1BTgorCWJvb2wgIm1hbiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBGb3JtYXQgYW5kIGRpc3BsYXkgbWFudWFsIHBhZ2VzLgorCitjb25maWcgTUlDUk9DT00KKwlib29sICJtaWNyb2NvbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgcG9vciBtYW4ncyBtaW5pY29tIHV0aWxpdHkgZm9yIGNoYXR0aW5nIHdpdGggc2VyaWFsIHBvcnQgZGV2aWNlcy4KKworY29uZmlnIE1PVU5UUE9JTlQKKwlib29sICJtb3VudHBvaW50IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1vdW50cG9pbnQgY2hlY2tzIGlmIHRoZSBkaXJlY3RvcnkgaXMgYSBtb3VudHBvaW50LgorCitjb25maWcgTVQKKwlib29sICJtdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtdCBpcyB1c2VkIHRvIGNvbnRyb2wgdGFwZSBkZXZpY2VzLiBZb3UgY2FuIHVzZSB0aGUgbXQgdXRpbGl0eQorCSAgdG8gYWR2YW5jZSBvciByZXdpbmQgYSB0YXBlIHBhc3QgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyY2hpdmUKKwkgIGZpbGVzIG9uIHRoZSB0YXBlLgorCitjb25maWcgUkFJREFVVE9SVU4KKwlib29sICJyYWlkYXV0b3J1biIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICByYWlkYXV0b3J1biB0ZWxscyB0aGUga2VybmVsIG1kIGRyaXZlciB0bworCSAgc2VhcmNoIGFuZCBzdGFydCBSQUlEIGFycmF5cy4KKworY29uZmlnIFJFQURBSEVBRAorCWJvb2wgInJlYWRhaGVhZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExGUworCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFByZWxvYWQgdGhlIGZpbGVzIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gUkFNIGNhY2hlIHNvIHRoYXQKKwkgIHN1YnNlcXVlbnQgcmVhZHMgb24gdGhlc2UgZmlsZXMgd2lsbCBub3QgYmxvY2sgb24gZGlzayBJL08uCisKKwkgIFRoaXMgYXBwbGV0IGp1c3QgY2FsbHMgdGhlIHJlYWRhaGVhZCgyKSBzeXN0ZW0gY2FsbCBvbiBlYWNoIGZpbGUuCisJICBJdCBpcyBtYWlubHkgdXNlZnVsIGluIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMgdG8gcHJlbG9hZCBmaWxlcworCSAgb3IgZXhlY3V0YWJsZXMgYmVmb3JlIHRoZXkgYXJlIHVzZWQuIFdoZW4gdXNlZCBhdCB0aGUgcmlnaHQgdGltZQorCSAgKGluIHBhcnRpY3VsYXIgd2hlbiBhIENQVSBib3VuZCBwcm9jZXNzIGlzIHJ1bm5pbmcpIGl0IGNhbgorCSAgc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBzeXN0ZW0gc3RhcnR1cC4KKworCSAgQXMgcmVhZGFoZWFkKDIpIGJsb2NrcyB1bnRpbCBlYWNoIGZpbGUgaGFzIGJlZW4gcmVhZCwgaXQgaXMgYmVzdCB0bworCSAgcnVuIHRoaXMgYXBwbGV0IGFzIGEgYmFja2dyb3VuZCBqb2IuCisKK2NvbmZpZyBSRktJTEwKKwlib29sICJyZmtpbGwiCisJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gVWJ1bnR1IDkuMDQKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbmFibGUvZGlzYWJsZSB3aXJlbGVzcyBkZXZpY2VzLgorCisJICByZmtpbGwgbGlzdCA6IGxpc3QgYWxsIHdpcmVsZXNzIGRldmljZXMKKwkgIHJma2lsbCBsaXN0IGJsdWV0b290aCA6IGxpc3QgYWxsIGJsdWV0b290aCBkZXZpY2VzCisJICByZmtpbGwgbGlzdCAxIDogbGlzdCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXgKKwkgIHJma2lsbCBibG9ja3x1bmJsb2NrIHdsYW4gOiBibG9jay91bmJsb2NrIGFsbCB3bGFuKHdpZmkpIGRldmljZXMKKworY29uZmlnIFJVTkxFVkVMCisJYm9vbCAicnVubGV2ZWwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKwloZWxwCisJICBmaW5kIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzeXN0ZW0gcnVubGV2ZWwuCisKKwkgIFRoaXMgYXBwbGV0IHVzZXMgdXRtcCBidXQgZG9lcyBub3QgcmVseSBvbiBidXN5Ym94IHN1cHBvcmluZworCSAgdXRtcCBvbiBwdXJwb3NlLiBJdCBpcyB1c2VkIGJ5IGUuZy4gZW1kZWJpYW4gdmlhIC9ldGMvaW5pdC5kL3JjLgorCitjb25maWcgUlgKKwlib29sICJyeCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSZWNlaXZlIGZpbGVzIHVzaW5nIHRoZSBYbW9kZW0gcHJvdG9jb2wuCisKK2NvbmZpZyBTRVRTSUQKKwlib29sICJzZXRzaWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc2V0c2lkIHJ1bnMgYSBwcm9ncmFtIGluIGEgbmV3IHNlc3Npb24KKworY29uZmlnIFNUUklOR1MKKwlib29sICJzdHJpbmdzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0cmluZ3MgcHJpbnRzIHRoZSBwcmludGFibGUgY2hhcmFjdGVyIHNlcXVlbmNlcyBmb3IgZWFjaCBmaWxlCisJICBzcGVjaWZpZWQuCisKK2NvbmZpZyBUQVNLU0VUCisJYm9vbCAidGFza3NldCIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBzb21lIG5vbi14ODYgdGFyZ2V0cyAobTY4aykKKwloZWxwCisJICBSZXRyaWV2ZSBvciBzZXQgYSBwcm9jZXNzZXMncyBDUFUgYWZmaW5pdHkuCisJICBUaGlzIHJlcXVpcmVzIHNjaGVkX3tnLHN9ZXRhZmZpbml0eSBzdXBwb3J0IGluIHlvdXIgbGliYy4KKworY29uZmlnIEZFQVRVUkVfVEFTS1NFVF9GQU5DWQorCWJvb2wgIkZhbmN5IG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRBU0tTRVQKKwloZWxwCisJICBBZGQgY29kZSBmb3IgZmFuY3kgb3V0cHV0LiBUaGlzIG1lcmVseSBzaWxlbmNlcyBhIGNvbXBpbGVyLXdhcm5pbmcKKwkgIGFuZCBhZGRzIGFib3V0IDEzNSBCeXRlcy4gTWF5IGJlIG5lZWRlZCBmb3IgbWFjaGluZXMgd2l0aCBhbG90CisJICBvZiBDUFVzLgorCitjb25maWcgVElNRQorCWJvb2wgInRpbWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHRpbWUgY29tbWFuZCBydW5zIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisJICBXaGVuIHRoZSBjb21tYW5kIGZpbmlzaGVzLCB0aW1lIHdyaXRlcyBhIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0CisJICBnaXZpbmcgdGltaW5nIHN0YXRpc3RpY3MgYWJvdXQgdGhpcyBwcm9ncmFtIHJ1bi4KKworY29uZmlnIFRJTUVPVVQKKwlib29sICJ0aW1lb3V0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJ1bnMgYSBwcm9ncmFtIGFuZCB3YXRjaGVzIGl0LiBJZiBpdCBkb2VzIG5vdCB0ZXJtaW5hdGUgaW4KKwkgIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcywgaXQgaXMgc2VudCBhIHNpZ25hbC4KKworY29uZmlnIFRUWVNJWkUKKwlib29sICJ0dHlzaXplIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEEgcmVwbGFjZW1lbnQgZm9yICJzdHR5IHNpemUiLiBVbmxpa2Ugc3R0eSwgY2FuIHJlcG9ydCBvbmx5IHdpZHRoLAorCSAgb25seSBoZWlnaHQsIG9yIGJvdGgsIGluIGFueSBvcmRlci4gSXQgYWxzbyBkb2VzIG5vdCBjb21wbGFpbiBvbgorCSAgZXJyb3IsIGJ1dCByZXR1cm5zIGRlZmF1bHQgODB4MjQuCisJICBVc2FnZSBpbiBzaGVsbCBzY3JpcHRzOiB3aWR0aD1gdHR5c2l6ZSB3YC4KKworY29uZmlnIFZPTE5BTUUKKwlib29sICJ2b2xuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50cyBhIENELVJPTSB2b2x1bWUgbmFtZS4KKworY29uZmlnIFdBTEwKKwlib29sICJ3YWxsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9VVE1QCisJaGVscAorCSAgV3JpdGUgYSBtZXNzYWdlIHRvIGFsbCB1c2VycyB0aGF0IGFyZSBsb2dnZWQgaW4uCisKK2NvbmZpZyBXQVRDSERPRworCWJvb2wgIndhdGNoZG9nIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSB3YXRjaGRvZyB1dGlsaXR5IGlzIHVzZWQgd2l0aCBoYXJkd2FyZSBvciBzb2Z0d2FyZSB3YXRjaGRvZworCSAgZGV2aWNlIGRyaXZlcnMuIEl0IG9wZW5zIHRoZSBzcGVjaWZpZWQgd2F0Y2hkb2cgZGV2aWNlIHNwZWNpYWwgZmlsZQorCSAgYW5kIHBlcmlvZGljYWxseSB3cml0ZXMgYSBtYWdpYyBjaGFyYWN0ZXIgdG8gdGhlIGRldmljZS4gSWYgdGhlCisJICB3YXRjaGRvZyBhcHBsZXQgZXZlciBmYWlscyB0byB3cml0ZSB0aGUgbWFnaWMgY2hhcmFjdGVyIHdpdGhpbiBhCisJICBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgZGV2aWNlIGFzc3VtZXMgdGhlIHN5c3RlbSBoYXMKKwkgIGh1bmcsIGFuZCB3aWxsIGNhdXNlIHRoZSBoYXJkd2FyZSB0byByZWJvb3QuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21pc2N1dGlscy9LYnVpbGQuc3JjIGIvbWlzY3V0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwMDZlOQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNTIgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0FESlRJTUVYKSAgICArPSBhZGp0aW1leC5vCitsaWItJChDT05GSUdfQkJDT05GSUcpICAgICs9IGJiY29uZmlnLm8KK2xpYi0kKENPTkZJR19CRUVQKSAgICAgICAgKz0gYmVlcC5vCitsaWItJChDT05GSUdfQ0hBVCkgICAgICAgICs9IGNoYXQubworbGliLSQoQ09ORklHX0NIUlQpICAgICAgICArPSBjaHJ0Lm8KK2xpYi0kKENPTkZJR19DUk9ORCkgICAgICAgKz0gY3JvbmQubworbGliLSQoQ09ORklHX0NST05UQUIpICAgICArPSBjcm9udGFiLm8KK2xpYi0kKENPTkZJR19EQykgICAgICAgICAgKz0gZGMubworbGliLSQoQ09ORklHX0RFVkZTRCkgICAgICArPSBkZXZmc2QubworbGliLSQoQ09ORklHX0RFVk1FTSkgICAgICArPSBkZXZtZW0ubworbGliLSQoQ09ORklHX0VKRUNUKSAgICAgICArPSBlamVjdC5vCitsaWItJChDT05GSUdfRkJTUExBU0gpICAgICs9IGZic3BsYXNoLm8KK2xpYi0kKENPTkZJR19GTEFTSENQKSAgICAgKz0gZmxhc2hjcC5vCitsaWItJChDT05GSUdfRkxBU0hfRVJBU0VBTEwpICs9IGZsYXNoX2VyYXNlYWxsLm8KK2xpYi0kKENPTkZJR19GTEFTSF9MT0NLKSAgICAgKz0gZmxhc2hfbG9ja191bmxvY2subworbGliLSQoQ09ORklHX0ZMQVNIX1VOTE9DSykgICArPSBmbGFzaF9sb2NrX3VubG9jay5vCitsaWItJChDT05GSUdfTkFORERVTVApICAgICs9IG5hbmRkdW1wLm8KK2xpYi0kKENPTkZJR19OQU5EV1JJVEUpICAgKz0gbmFuZHdyaXRlLm8KK2xpYi0kKENPTkZJR19JT05JQ0UpICAgICAgKz0gaW9uaWNlLm8KK2xpYi0kKENPTkZJR19IRFBBUk0pICAgICAgKz0gaGRwYXJtLm8KK2xpYi0kKENPTkZJR19JTk9USUZZRCkgICAgKz0gaW5vdGlmeWQubworbGliLSQoQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCkrPSBsYXN0Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kpKz0gbGFzdF9mYW5jeS5vCitsaWItJChDT05GSUdfTEVTUykgICAgICAgICs9IGxlc3MubworbGliLSQoQ09ORklHX01BS0VERVZTKSAgICArPSBtYWtlZGV2cy5vCitsaWItJChDT05GSUdfTUFOKSAgICAgICAgICs9IG1hbi5vCitsaWItJChDT05GSUdfTUlDUk9DT00pICAgICs9IG1pY3JvY29tLm8KK2xpYi0kKENPTkZJR19NT1VOVFBPSU5UKSAgKz0gbW91bnRwb2ludC5vCitsaWItJChDT05GSUdfTVQpICAgICAgICAgICs9IG10Lm8KK2xpYi0kKENPTkZJR19SQUlEQVVUT1JVTikgKz0gcmFpZGF1dG9ydW4ubworbGliLSQoQ09ORklHX1JFQURBSEVBRCkgICArPSByZWFkYWhlYWQubworbGliLSQoQ09ORklHX1JGS0lMTCkgICAgICArPSByZmtpbGwubworbGliLSQoQ09ORklHX1JVTkxFVkVMKSAgICArPSBydW5sZXZlbC5vCitsaWItJChDT05GSUdfUlgpICAgICAgICAgICs9IHJ4Lm8KK2xpYi0kKENPTkZJR19TRVRTSUQpICAgICAgKz0gc2V0c2lkLm8KK2xpYi0kKENPTkZJR19TVFJJTkdTKSAgICAgKz0gc3RyaW5ncy5vCitsaWItJChDT05GSUdfVEFTS1NFVCkgICAgICs9IHRhc2tzZXQubworbGliLSQoQ09ORklHX1RJTUUpICAgICAgICArPSB0aW1lLm8KK2xpYi0kKENPTkZJR19USU1FT1VUKSAgICAgKz0gdGltZW91dC5vCitsaWItJChDT05GSUdfVFRZU0laRSkgICAgICs9IHR0eXNpemUubworbGliLSQoQ09ORklHX1ZPTE5BTUUpICAgICArPSB2b2xuYW1lLm8KK2xpYi0kKENPTkZJR19XQUxMKSAgICAgICAgKz0gd2FsbC5vCitsaWItJChDT05GSUdfV0FUQ0hET0cpICAgICs9IHdhdGNoZG9nLm8KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9hZGp0aW1leC5jIGIvbWlzY3V0aWxzL2FkanRpbWV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MTZlOQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9hZGp0aW1leC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhZGp0aW1leC5jIC0gcmVhZCwgYW5kIHBvc3NpYmx5IG1vZGlmeSwgdGhlIExpbnV4IGtlcm5lbCBgdGltZXgnIHZhcmlhYmxlcy4KKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW46IE9jdG9iZXIgMTk5NworICogTGFzdCBoYWNrOiBNYXJjaCAyMDAxCisgKiBDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBMYXJyeSBEb29saXR0bGUgPExSRG9vbGl0dGxlQGxibC5nb3Y+CisgKgorICogYnVzeWJveGVkIDIwIE1hcmNoIDIwMDEsIExhcnJ5IERvb2xpdHRsZSA8bGRvb2xpdHRAcmVjeWNsZS5sYmwuZ292PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGFkanRpbWV4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXFdIFstbyBPRkZdIFstZiBGUkVRXSBbLXAgVENPTlNUXSBbLXQgVElDS10iCisvL3VzYWdlOiNkZWZpbmUgYWRqdGltZXhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkIGFuZCBvcHRpb25hbGx5IHNldCBzeXN0ZW0gdGltZWJhc2UgcGFyYW1ldGVycy4gU2VlIGFkanRpbWV4KDIpXG4iCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktbyBPRkYJVGltZSBvZmZzZXQsIG1pY3Jvc2Vjb25kcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRlJFUQlGcmVxdWVuY3kgYWRqdXN0LCBpbnRlZ2VyIGtlcm5lbCB1bml0cyAoNjU1MzYgaXMgMXBwbSkiCisvL3VzYWdlOiAgICAgIlxuCQkocG9zaXRpdmUgdmFsdWVzIG1ha2UgY2xvY2sgcnVuIGZhc3RlcikiCisvL3VzYWdlOiAgICAgIlxuCS10IFRJQ0sJTWljcm9zZWNvbmRzIHBlciB0aWNrLCB1c3VhbGx5IDEwMDAwIgorLy91c2FnZTogICAgICJcbgktcCBUQ09OU1QiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmZGVmIF9fQklPTklDX18KKyMgaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN5cy90aW1leC5oPgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzdGF0bGlzdF9iaXRbXSA9IHsKKwlTVEFfUExMLAorCVNUQV9QUFNGUkVRLAorCVNUQV9QUFNUSU1FLAorCVNUQV9GTEwsCisJU1RBX0lOUywKKwlTVEFfREVMLAorCVNUQV9VTlNZTkMsCisJU1RBX0ZSRVFIT0xELAorCVNUQV9QUFNTSUdOQUwsCisJU1RBX1BQU0pJVFRFUiwKKwlTVEFfUFBTV0FOREVSLAorCVNUQV9QUFNFUlJPUiwKKwlTVEFfQ0xPQ0tFUlIsCisJMAorfTsKK3N0YXRpYyBjb25zdCBjaGFyIHN0YXRsaXN0X25hbWVbXSA9CisJIlBMTCIgICAgICAgIlwwIgorCSJQUFNGUkVRIiAgICJcMCIKKwkiUFBTVElNRSIgICAiXDAiCisJIkZGTCIgICAgICAgIlwwIgorCSJJTlMiICAgICAgICJcMCIKKwkiREVMIiAgICAgICAiXDAiCisJIlVOU1lOQyIgICAgIlwwIgorCSJGUkVRSE9MRCIgICJcMCIKKwkiUFBTU0lHTkFMIiAiXDAiCisJIlBQU0pJVFRFUiIgIlwwIgorCSJQUFNXQU5ERVIiICJcMCIKKwkiUFBTRVJST1IiICAiXDAiCisJIkNMT0NLRVJSIgorOworCitzdGF0aWMgY29uc3QgY2hhciByZXRfY29kZV9kZXNjcmlwdFtdID0KKwkiY2xvY2sgc3luY2hyb25pemVkIiAiXDAiCisJImluc2VydCBsZWFwIHNlY29uZCIgIlwwIgorCSJkZWxldGUgbGVhcCBzZWNvbmQiICJcMCIKKwkibGVhcCBzZWNvbmQgaW4gcHJvZ3Jlc3MiICJcMCIKKwkibGVhcCBzZWNvbmQgaGFzIG9jY3VycmVkIiAiXDAiCisJImNsb2NrIG5vdCBzeW5jaHJvbml6ZWQiCis7CisKK2ludCBhZGp0aW1leF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYWRqdGltZXhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfcXVpZXQgPSAweDEKKwl9OworCXVuc2lnbmVkIG9wdDsKKwljaGFyICpvcHRfbywgKm9wdF9mLCAqb3B0X3AsICpvcHRfdDsKKwlzdHJ1Y3QgdGltZXggdHhjOworCWludCBpLCByZXQ7CisJY29uc3QgY2hhciAqZGVzY3JpcHQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCI7IC8qIG5vIHZhbGlkIG5vbi1vcHRpb24gcGFyYW1ldGVycyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJxbzpmOnA6dDoiLAorCQkJJm9wdF9vLCAmb3B0X2YsICZvcHRfcCwgJm9wdF90KTsKKwl0eGMubW9kZXMgPSAwOworCS8vaWYgKG9wdCAmIDB4MSkgLy8gLXEKKwlpZiAob3B0ICYgMHgyKSB7IC8vIC1vCisJCXR4Yy5vZmZzZXQgPSB4YXRvbChvcHRfbyk7CisJCXR4Yy5tb2RlcyB8PSBBREpfT0ZGU0VUX1NJTkdMRVNIT1Q7CisJfQorCWlmIChvcHQgJiAweDQpIHsgLy8gLWYKKwkJdHhjLmZyZXEgPSB4YXRvbChvcHRfZik7CisJCXR4Yy5tb2RlcyB8PSBBREpfRlJFUVVFTkNZOworCX0KKwlpZiAob3B0ICYgMHg4KSB7IC8vIC1wCisJCXR4Yy5jb25zdGFudCA9IHhhdG9sKG9wdF9wKTsKKwkJdHhjLm1vZGVzIHw9IEFESl9USU1FQ09OU1Q7CisJfQorCWlmIChvcHQgJiAweDEwKSB7IC8vIC10CisJCXR4Yy50aWNrID0geGF0b2wob3B0X3QpOworCQl0eGMubW9kZXMgfD0gQURKX1RJQ0s7CisJfQorCisJcmV0ID0gYWRqdGltZXgoJnR4Yyk7CisKKwlpZiAocmV0IDwgMCkgeworCQliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCX0KKworCWlmICghKG9wdCAmIE9QVF9xdWlldCkpIHsKKwkJaW50IHNlcDsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlwcmludGYoCisJCQkiICAgIG1vZGU6ICAgICAgICAgJWRcbiIKKwkJCSItbyAgb2Zmc2V0OiAgICAgICAlbGRcbiIKKwkJCSItZiAgZnJlcXVlbmN5OiAgICAlbGRcbiIKKwkJCSIgICAgbWF4ZXJyb3I6ICAgICAlbGRcbiIKKwkJCSIgICAgZXN0ZXJyb3I6ICAgICAlbGRcbiIKKwkJCSIgICAgc3RhdHVzOiAgICAgICAlZCAoIiwKKwkJdHhjLm1vZGVzLCB0eGMub2Zmc2V0LCB0eGMuZnJlcSwgdHhjLm1heGVycm9yLAorCQl0eGMuZXN0ZXJyb3IsIHR4Yy5zdGF0dXMpOworCisJCS8qIHJlcHJlc2VudGF0aXZlIG91dHB1dCBvZiBuZXh0IGNvZGUgZnJhZ21lbnQ6CisJCSAgICJQTEwgfCBQUFNUSU1FIiAqLworCQluYW1lID0gc3RhdGxpc3RfbmFtZTsKKwkJc2VwID0gMDsKKwkJZm9yIChpID0gMDsgc3RhdGxpc3RfYml0W2ldOyBpKyspIHsKKwkJCWlmICh0eGMuc3RhdHVzICYgc3RhdGxpc3RfYml0W2ldKSB7CisJCQkJaWYgKHNlcCkKKwkJCQkJZnB1dHMoIiB8ICIsIHN0ZG91dCk7CisJCQkJZnB1dHMobmFtZSwgc3Rkb3V0KTsKKwkJCQlzZXAgPSAxOworCQkJfQorCQkJbmFtZSArPSBzdHJsZW4obmFtZSkgKyAxOworCQl9CisKKwkJZGVzY3JpcHQgPSAiZXJyb3IiOworCQlpZiAocmV0IDw9IDUpCisJCQlkZXNjcmlwdCA9IG50aF9zdHJpbmcocmV0X2NvZGVfZGVzY3JpcHQsIHJldCk7CisJCXByaW50ZigiKVxuIgorCQkJIi1wICB0aW1lY29uc3RhbnQ6ICVsZFxuIgorCQkJIiAgICBwcmVjaXNpb246ICAgICVsZFxuIgorCQkJIiAgICB0b2xlcmFuY2U6ICAgICVsZFxuIgorCQkJIi10ICB0aWNrOiAgICAgICAgICVsZFxuIgorCQkJIiAgICB0aW1lLnR2X3NlYzogICVsZFxuIgorCQkJIiAgICB0aW1lLnR2X3VzZWM6ICVsZFxuIgorCQkJIiAgICByZXR1cm4gdmFsdWU6ICVkICglcylcbiIsCisJCXR4Yy5jb25zdGFudCwKKwkJdHhjLnByZWNpc2lvbiwgdHhjLnRvbGVyYW5jZSwgdHhjLnRpY2ssCisJCShsb25nKXR4Yy50aW1lLnR2X3NlYywgKGxvbmcpdHhjLnRpbWUudHZfdXNlYywgcmV0LCBkZXNjcmlwdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvYmJjb25maWcuYyBiL21pc2N1dGlscy9iYmNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmU4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvYmJjb25maWcuYwpAQCAtMCwwICsxLDQwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIFRoaXMgZmlsZSB3YXMgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbiBieSBQYXVsIEZveC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYmJjb25maWdfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBiYmNvbmZpZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBjb25maWcgZmlsZSB1c2VkIGJ5IGJ1c3lib3ggYnVpbGQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiY29uZmlnb3B0cy5oIgorI2lmIEVOQUJMRV9GRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHCisjIGluY2x1ZGUgImFyY2hpdmUuaCIKKyMgaW5jbHVkZSAiYmJjb25maWdvcHRzX2J6Mi5oIgorI2VuZGlmCisKK2ludCBiYmNvbmZpZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmJjb25maWdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRworCWJ1bnppcF9kYXRhICpiZDsKKwlpbnQgaSA9IHN0YXJ0X2J1bnppcCgmYmQsCisJCQkvKiBzcmNfZmQ6ICovIC0xLAorCQkJLyogaW5idWY6ICAqLyBiYmNvbmZpZ19jb25maWdfYnoyLAorCQkJLyogbGVuOiAgICAqLyBzaXplb2YoYmJjb25maWdfY29uZmlnX2J6MikpOworCS8qIHJlYWRfYnVuemlwIGNhbiBsb25nam1wIHRvIHN0YXJ0X2J1bnppcCwgYW5kIHVsdGltYXRlbHkKKwkgKiBlbmQgdXAgaGVyZSB3aXRoIGkgIT0gMCBvbiByZWFkIGRhdGEgZXJyb3JzISBOb3QgdHJpdmlhbCAqLworCWlmICghaSkgeworCQkvKiBDYW5ub3QgdXNlIHhtYWxsb2M6IHdpbGwgbGVhayBiZCBpbiBOT0ZPUksgY2FzZSEgKi8KKwkJY2hhciAqb3V0YnVmID0gbWFsbG9jX29yX3dhcm4oc2l6ZW9mKGJiY29uZmlnX2NvbmZpZykpOworCQlpZiAob3V0YnVmKSB7CisJCQlyZWFkX2J1bnppcChiZCwgb3V0YnVmLCBzaXplb2YoYmJjb25maWdfY29uZmlnKSk7CisJCQlmdWxsX3dyaXRlMV9zdHIob3V0YnVmKTsKKwkJfQorCX0KKyNlbHNlCisJZnVsbF93cml0ZTFfc3RyKGJiY29uZmlnX2NvbmZpZyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9iZWVwLmMgYi9taXNjdXRpbHMvYmVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGUwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvYmVlcC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiZWVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBiZWVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItZiBGUkVRIC1sIExFTiAtZCBERUxBWSAtciBDT1VOVCAtbiIKKy8vdXNhZ2U6I2RlZmluZSBiZWVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1mCUZyZXF1ZW5jeSBpbiBIeiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGVuZ3RoIGluIG1zIgorLy91c2FnZTogICAgICJcbgktZAlEZWxheSBpbiBtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUmVwZXRpdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1uCVN0YXJ0IG5ldyB0b25lIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaWZuZGVmIENMT0NLX1RJQ0tfUkFURQorIyBkZWZpbmUgQ0xPQ0tfVElDS19SQVRFIDExOTMxODAKKyNlbmRpZgorCisvKiBkZWZhdWx0cyAqLworI2lmbmRlZiBDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVEKKyMgZGVmaW5lIEZSRVEgKDQwMDApCisjZWxzZQorIyBkZWZpbmUgRlJFUSAoQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRKQorI2VuZGlmCisjaWZuZGVmIENPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TCisjIGRlZmluZSBMRU5HVEggKDMwKQorI2Vsc2UKKyMgZGVmaW5lIExFTkdUSCAoQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVMpCisjZW5kaWYKKyNkZWZpbmUgREVMQVkgKDApCisjZGVmaW5lIFJFUEVUSVRJT05TICgxKQorCitpbnQgYmVlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmVlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3BlYWtlciA9IGdldF9jb25zb2xlX2ZkX29yX2RpZSgpOworCXVuc2lnbmVkIHRpY2tyYXRlX2Rpdl9mcmVxID0gdGlja3JhdGVfZGl2X2ZyZXE7IC8qIGZvciBjb21waWxlciAqLworCXVuc2lnbmVkIGxlbmd0aCA9IGxlbmd0aDsKKwl1bnNpZ25lZCBkZWxheSA9IGRlbGF5OworCXVuc2lnbmVkIHJlcCA9IHJlcDsKKwlpbnQgYzsKKworCWMgPSAnbic7CisJd2hpbGUgKGMgIT0gLTEpIHsKKwkJaWYgKGMgPT0gJ24nKSB7CisJCQl0aWNrcmF0ZV9kaXZfZnJlcSA9IENMT0NLX1RJQ0tfUkFURSAvIEZSRVE7CisJCQlsZW5ndGggPSBMRU5HVEg7CisJCQlkZWxheSA9IERFTEFZOworCQkJcmVwID0gUkVQRVRJVElPTlM7CisJCX0KKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZjpsOmQ6cjpuIik7CisvKiBUT0RPOiAtcywgLWM6CisgKiBwaXBlIHN0ZGluIHRvIHN0ZG91dCwgYnV0IGFsc28gYmVlcCBhZnRlciBlYWNoIGxpbmUgKC1zKSBvciBjaGFyICgtYykKKyAqLworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisvKiBUT0RPOiB3aGF0ICItZiAwIiBzaG91bGQgZG8/ICovCisJCQl0aWNrcmF0ZV9kaXZfZnJlcSA9ICh1bnNpZ25lZClDTE9DS19USUNLX1JBVEUgLyB4YXRvdShvcHRhcmcpOworCQkJY29udGludWU7CisJCWNhc2UgJ2wnOgorCQkJbGVuZ3RoID0geGF0b3Uob3B0YXJnKTsKKwkJCWNvbnRpbnVlOworCQljYXNlICdkJzoKKy8qIFRPRE86CisgKiAtZCBOLCAtRCBOCisgKiBzcGVjaWZ5IGEgZGVsYXkgb2YgTiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXBldGl0aW9ucy4KKyAqIC1kIHNwZWNpZmllcyB0aGF0IHRoaXMgZGVsYXkgc2hvdWxkIG9ubHkgb2NjdXIgYmV0d2VlbiBiZWVwcywKKyAqIHRoYXQgaXMsIGl0IHNob3VsZCBub3Qgb2NjdXIgYWZ0ZXIgdGhlIGxhc3QgcmVwZXRpdGlvbi4KKyAqIC1EIGluZGljYXRlcyB0aGF0IHRoZSBkZWxheSBzaG91bGQgb2NjdXIgYWZ0ZXIgZXZlcnkgcmVwZXRpdGlvbgorICovCisJCQlkZWxheSA9IHhhdG91KG9wdGFyZyk7CisJCQljb250aW51ZTsKKwkJY2FzZSAncic6CisJCQlyZXAgPSB4YXRvdShvcHRhcmcpOworCQkJY29udGludWU7CisJCWNhc2UgJ24nOgorCQljYXNlIC0xOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJd2hpbGUgKHJlcCkgeworLy9iYl9pbmZvX21zZygicmVwWyVkXSBmcmVxPSVkLCBsZW5ndGg9JWQsIGRlbGF5PSVkIiwgcmVwLCBmcmVxLCBsZW5ndGgsIGRlbGF5KTsKKwkJCXhpb2N0bChzcGVha2VyLCBLSU9DU09VTkQsICh2b2lkKikodWludHB0cl90KXRpY2tyYXRlX2Rpdl9mcmVxKTsKKwkJCXVzbGVlcCgxMDAwICogbGVuZ3RoKTsKKwkJCWlvY3RsKHNwZWFrZXIsIEtJT0NTT1VORCwgKHZvaWQqKTApOworCQkJaWYgKC0tcmVwKQorCQkJCXVzbGVlcCgxMDAwICogZGVsYXkpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShzcGVha2VyKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorLyoKKyAqIHNvLCBlLmcuIEJlZXRob3ZlbidzIDl0aCBzeW1waG9ueSAiT2RlIGFuIGRpZSBGcmV1ZGUiIHdvdWxkIGJlCisgKiBzb21ldGhpbmcgbGlrZToKK2E9JCgoMjIwKjMpKQorYj0kKCgyNDcqMykpCitjPSQoKDI2MiozKSkKK2Q9JCgoMjk0KjMpKQorZT0kKCgzMjkqMykpCitmPSQoKDM0OSozKSkKK2c9JCgoMzkyKjMpKQorIy4vYmVlcCAtZiRkIC1sMjAwIC1yMiAtbiAtZiRlIC1sMTAwIC1kIDEwIC1uIC1mJGMgLWw0MDAgLWYkZyAtbDIwMAorLi9iZWVwIC1mJGUgLWwyMDAgLXIyIFwKKyAgICAgICAgLW4gLWQgMTAwIC1mJGYgLWwyMDAgXAorICAgICAgICAtbiAtZiRnIC1sMjAwIC1yMiBcCisgICAgICAgIC1uIC1mJGYgLWwyMDAgXAorICAgICAgICAtbiAtZiRlIC1sMjAwIFwKKyAgICAgICAgLW4gLWYkZCAtbDIwMCBcCisgICAgICAgIC1uIC1mJGMgLWwyMDAgLXIyIFwKKyAgICAgICAgLW4gLWYkZCAtbDIwMCBcCisgICAgICAgIC1uIC1mJGUgLWwyMDAgXAorICAgICAgICAtbiAtZiRlIC1sNDAwIFwKKyAgICAgICAgLW4gLWYkZCAtbDEwMCBcCisgICAgICAgIC1uIC1mJGQgLWwyMDAgXAorKi8KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9jaGF0LmMgYi9taXNjdXRpbHMvY2hhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTk0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvY2hhdC5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYXJlIGJvbmVzIGNoYXQgdXRpbGl0eQorICogaW5zcGlyZWQgYnkgcHBwJ3MgY2hhdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2hhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRVhQRUNUIFtTRU5EIFtFWFBFQ1QgW1NFTkQuLi5dXV0iCisvL3VzYWdlOiNkZWZpbmUgY2hhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlVzZWZ1bCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIG1vZGVtIGNvbm5lY3RlZCB0byBzdGRpbi9zdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgICAiQSBzY3JpcHQgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgXCJleHBlY3Qtc2VuZFwiIHBhaXJzIG9mIHN0cmluZ3MsXG4iCisvL3VzYWdlOiAgICAgICAiZWFjaCBwYWlyIGlzIGEgcGFpciBvZiBhcmd1bWVudHMuIEV4YW1wbGU6XG4iCisvL3VzYWdlOiAgICAgICAiY2hhdCAnJyBBVFogT0sgQVREMTIzNDU2IENPTk5FQ1QgJycgb2dpbjogcHBwdXNlciB3b3JkOiBwcHBwYXNzICd+JyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vIGRlZmF1bHQgdGltZW91dDogNDUgc2VjCisjZGVmaW5lIERFRkFVTFRfQ0hBVF9USU1FT1VUIDQ1KjEwMDAKKy8vIG1heCBsZW5ndGggb2YgImFib3J0IHN0cmluZyIsCisvLyBpLmUuIGRldmljZSByZXBseSB3aGljaCBjYXVzZXMgdGVybWluYXRpb24KKyNkZWZpbmUgTUFYX0FCT1JUX0xFTiA1MAorCisvLyBwb3NzaWJsZSBleGl0IGNvZGVzCitlbnVtIHsKKwlFUlJfT0sgPSAwLCAgICAgLy8gYWxsJ3Mgd2VsbAorCUVSUl9NRU0sICAgICAgICAvLyByZWFkIHRvbyBtdWNoIHdoaWxlIGV4cGVjdGluZworCUVSUl9JTywgICAgICAgICAvLyBzaWduYWxsZWQgb3IgSS9PIGVycm9yCisJRVJSX1RJTUVPVVQsICAgIC8vIHRpbWVkIG91dCB3aGlsZSBleHBlY3RpbmcKKwlFUlJfQUJPUlQsICAgICAgLy8gZmlyc3QgYWJvcnQgY29uZGl0aW9uIHdhcyBtZXQKKy8vCUVSUl9BQk9SVDIsICAgICAvLyBzZWNvbmQgYWJvcnQgY29uZGl0aW9uIHdhcyBtZXQKKy8vCS4uLgorfTsKKworLy8gZXhpdCBjb2RlCisjZGVmaW5lIGV4aXRjb2RlIGJiX2dvdF9zaWduYWwKKworLy8gdHJhcCBmb3IgY3JpdGljYWwgc2lnbmFscworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoVU5VU0VEX1BBUkFNIGludCBzaWdubykKK3sKKwkvLyByZXBvcnQgSS9PIGVycm9yIGNvbmRpdGlvbgorCWV4aXRjb2RlID0gRVJSX0lPOworfQorCisjaWYgIUVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKyNkZWZpbmUgdW5lc2NhcGUocywgbm9jcikgdW5lc2NhcGUocykKKyNlbmRpZgorc3RhdGljIHNpemVfdCB1bmVzY2FwZShjaGFyICpzLCBpbnQgKm5vY3IpCit7CisJY2hhciAqc3RhcnQgPSBzOworCWNoYXIgKnAgPSBzOworCisJd2hpbGUgKCpzKSB7CisJCWNoYXIgYyA9ICpzOworCQkvLyBkbyB3ZSBuZWVkIHNwZWNpYWwgcHJvY2Vzc2luZz8KKwkJLy8gc3RhbmRhcmQgZXNjYXBlcyArIFxzIGZvciBzcGFjZSBhbmQgXE4gZm9yIFwwCisJCS8vIFxjIGluaGliaXRzIHRlcm1pbmF0aW5nIFxyIGZvciBjb21tYW5kcyBhbmQgaXMgbm9vcCBmb3IgZXhwZWN0cworCQlpZiAoJ1xcJyA9PSBjKSB7CisJCQljID0gKisrczsKKwkJCWlmIChjKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCQkJCWlmICgnYycgPT0gYykgeworCQkJCQkqbm9jciA9IDE7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoJ04nID09IGMpIHsKKwkJCQkJYyA9ICdcMCc7CisJCQkJfSBlbHNlIGlmICgncycgPT0gYykgeworCQkJCQljID0gJyAnOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfTk9GQUlMCisJCQkJLy8gdW5lc2NhcGUgbGVhZGluZyBkYXNoIG9ubHkKKwkJCQkvLyBUT0RPOiBhbmQgb25seSBmb3IgZXhwZWN0LCBub3QgY29tbWFuZCBzdHJpbmcKKwkJCQl9IGVsc2UgaWYgKCctJyA9PSBjICYmIChzdGFydCArIDEgPT0gcykpIHsKKwkJCQkJLy9jID0gJy0nOworI2VuZGlmCisJCQkJfSBlbHNlIHsKKwkJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKChjb25zdCBjaGFyICoqKSZzKTsKKwkJCQkJcy0tOworCQkJCX0KKwkJCX0KKwkJLy8gXkEgYmVjb21lcyBcMDAxLCBeQiAtLSBcMDAyIGFuZCBzbyBvbi4uLgorCQl9IGVsc2UgaWYgKCdeJyA9PSBjKSB7CisJCQljID0gKisrcy0nQCc7CisJCX0KKwkJLy8gcHV0IHVuZXNjYXBlZCBjaGFyCisJCSpwKysgPSBjOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKyBuZXh0OgorI2VuZGlmCisJCS8vIG5leHQgY2hhcgorCQlzKys7CisJfQorCSpwID0gJ1wwJzsKKworCXJldHVybiBwIC0gc3RhcnQ7Cit9CisKK2ludCBjaGF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaGF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmVjb3JkX2ZkID0gLTE7CisJYm9vbCBlY2hvID0gMDsKKwkvLyBjb2xsZWN0aW9uIG9mIGRldmljZSByZXBsaWVzIHdoaWNoIGNhdXNlIHVuY29uZGl0aW9uYWwgdGVybWluYXRpb24KKwlsbGlzdF90ICphYm9ydHMgPSBOVUxMOworCS8vIGluYWN0aXZpdHkgcGVyaW9kCisJaW50IHRpbWVvdXQgPSBERUZBVUxUX0NIQVRfVElNRU9VVDsKKwkvLyBtYXhpbXVtIGxlbmd0aCBvZiBhYm9ydCBzdHJpbmcKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwlzaXplX3QgbWF4X2Fib3J0X2xlbiA9IDA7CisjZWxzZQorI2RlZmluZSBtYXhfYWJvcnRfbGVuIE1BWF9BQk9SVF9MRU4KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVFRZX0hJRkkKKwlzdHJ1Y3QgdGVybWlvcyB0aW8wLCB0aW87CisjZW5kaWYKKwkvLyBkaXJlY3RpdmUgbmFtZXMKKwllbnVtIHsKKwkJRElSX0hBTkdVUCA9IDAsCisJCURJUl9BQk9SVCwKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVAorCQlESVJfQ0xSX0FCT1JULAorI2VuZGlmCisJCURJUl9USU1FT1VULAorCQlESVJfRUNITywKKwkJRElSX1NBWSwKKwkJRElSX1JFQ09SRCwKKwl9OworCisJLy8gbWFrZSB4KiBmdW5jdGlvbnMgZmFpbCB3aXRoIGNvcnJlY3QgZXhpdGNvZGUKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSBFUlJfSU87CisKKwkvLyB0cmFwIHZhbmlsbGEgc2lnbmFscyB0byBwcmV2ZW50IHByb2Nlc3MgZnJvbSBiZWluZyBraWxsZWQgc3VkZGVubHkKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdIVVApCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHUElQRSkKKwkJLCBzaWduYWxfaGFuZGxlcik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1RUWV9ISUZJCisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJnRpbyk7CisJdGlvMCA9IHRpbzsKKwljZm1ha2VyYXcoJnRpbyk7CisJdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQUZMVVNILCAmdGlvKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFMKKwlnZXRvcHQzMihhcmd2LCAidlZzU0UiKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJYXJndisrOyAvLyBnb3RvIGZpcnN0IGFyZworI2VuZGlmCisJLy8gaGFuZGxlIGNoYXQgZXhwZWN0LXNlbmQgcGFpcnMKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJLy8gZGlyZWN0aXZlIGdpdmVuPyBwcm9jZXNzIGl0CisJCWludCBrZXkgPSBpbmRleF9pbl9zdHJpbmdzKAorCQkJIkhBTkdVUFwwIiAiQUJPUlRcMCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVAorCQkJIkNMUl9BQk9SVFwwIgorI2VuZGlmCisJCQkiVElNRU9VVFwwIiAiRUNIT1wwIiAiU0FZXDAiICJSRUNPUkRcMCIKKwkJCSwgKmFyZ3YKKwkJKTsKKwkJaWYgKGtleSA+PSAwKSB7CisJCQkvLyBjYWNoZSBkaXJlY3RpdmUgdmFsdWUKKwkJCWNoYXIgKmFyZyA9ICorK2FyZ3Y7CisJCQkvLyBPRkYgLT4gMCwgYW55dGhpbmcgZWxzZSAtPiAxCisJCQlib29sIG9ub2ZmID0gKDAgIT0gc3RyY21wKCJPRkYiLCBhcmcpKTsKKwkJCS8vIHByb2Nlc3MgZGlyZWN0aXZlCisJCQlpZiAoRElSX0hBTkdVUCA9PSBrZXkpIHsKKwkJCQkvLyB0dXJuIFNJR0hVUCBvbi9vZmYKKwkJCQlzaWduYWwoU0lHSFVQLCBvbm9mZiA/IHNpZ25hbF9oYW5kbGVyIDogU0lHX0lHTik7CisJCQl9IGVsc2UgaWYgKERJUl9BQk9SVCA9PSBrZXkpIHsKKwkJCQkvLyBhcHBlbmQgdGhlIHN0cmluZyB0byBhYm9ydCBjb25kaXRpb25zCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOCisJCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihhcmcpOworCQkJCWlmIChsZW4gPiBtYXhfYWJvcnRfbGVuKQorCQkJCQltYXhfYWJvcnRfbGVuID0gbGVuOworI2VuZGlmCisJCQkJbGxpc3RfYWRkX3RvX2VuZCgmYWJvcnRzLCBhcmcpOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUCisJCQl9IGVsc2UgaWYgKERJUl9DTFJfQUJPUlQgPT0ga2V5KSB7CisJCQkJbGxpc3RfdCAqbDsKKwkJCQkvLyByZW1vdmUgdGhlIHN0cmluZyBmcm9tIGFib3J0IGNvbmRpdGlvbnMKKwkJCQkvLyBOLkIuIGdvdHRhIHJlZnJlc2ggbWF4aW11bSBsZW5ndGggdG9vLi4uCisjIGlmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTgorCQkJCW1heF9hYm9ydF9sZW4gPSAwOworIyBlbmRpZgorCQkJCWZvciAobCA9IGFib3J0czsgbDsgbCA9IGwtPmxpbmspIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOCisJCQkJCXNpemVfdCBsZW4gPSBzdHJsZW4obC0+ZGF0YSk7CisjIGVuZGlmCisJCQkJCWlmIChzdHJjbXAoYXJnLCBsLT5kYXRhKSA9PSAwKSB7CisJCQkJCQlsbGlzdF91bmxpbmsoJmFib3J0cywgbCk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwkJCQkJaWYgKGxlbiA+IG1heF9hYm9ydF9sZW4pCisJCQkJCQltYXhfYWJvcnRfbGVuID0gbGVuOworIyBlbmRpZgorCQkJCX0KKyNlbmRpZgorCQkJfSBlbHNlIGlmIChESVJfVElNRU9VVCA9PSBrZXkpIHsKKwkJCQkvLyBzZXQgbmV3IHRpbWVvdXQKKwkJCQkvLyAtMSBtZWFucyBPRkYKKwkJCQl0aW1lb3V0ID0gYXRvaShhcmcpICogMTAwMDsKKwkJCQkvLyAwIG1lYW5zIGRlZmF1bHQKKwkJCQkvLyA+MCBtZWFucyB2YWx1ZSBpbiBtc2VjcworCQkJCWlmICghdGltZW91dCkKKwkJCQkJdGltZW91dCA9IERFRkFVTFRfQ0hBVF9USU1FT1VUOworCQkJfSBlbHNlIGlmIChESVJfRUNITyA9PSBrZXkpIHsKKwkJCQkvLyB0dXJuIGVjaG8gb24vb2ZmCisJCQkJLy8gTi5CLiBlY2hvIG1lYW5zIGR1bXBpbmcgZGV2aWNlIGlucHV0L291dHB1dCB0byBzdGRlcnIKKwkJCQllY2hvID0gb25vZmY7CisJCQl9IGVsc2UgaWYgKERJUl9SRUNPUkQgPT0ga2V5KSB7CisJCQkJLy8gdHVybiByZWNvcmQgb24vb2ZmCisJCQkJLy8gTi5CLiByZWNvcmQgbWVhbnMgZHVtcGluZyBkZXZpY2UgaW5wdXQgdG8gYSBmaWxlCisJCQkJCS8vIGNsb3NlIHByZXZpb3VzIHJlY29yZF9mZAorCQkJCWlmIChyZWNvcmRfZmQgPiAwKQorCQkJCQljbG9zZShyZWNvcmRfZmQpOworCQkJCS8vIE4uQi4gZG8gd2UgaGF2ZSB0byBkaWUgaGVyZSBvbiBvcGVuIGVycm9yPworCQkJCXJlY29yZF9mZCA9IChvbm9mZikgPyB4b3BlbihhcmcsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQykgOiAtMTsKKwkJCX0gZWxzZSBpZiAoRElSX1NBWSA9PSBrZXkpIHsKKwkJCQkvLyBqdXN0IHByaW50IGFyZ3VtZW50IHZlcmJhdGltCisJCQkJLy8gVE9ETzogc2hvdWxkIHdlIHVzZSBmdWxsX3dyaXRlKCkgdG8gYXZvaWQgdW5pc3RkL3N0ZGlvIGNvbmZsaWN0PworCQkJCWJiX2Vycm9yX21zZygiJXMiLCBhcmcpOworCQkJfQorCQkJLy8gbmV4dCwgcGxlYXNlIQorCQkJYXJndisrOworCQkvLyBvcmRpbmFyeSBleHBlY3Qtc2VuZCBwYWlyIQorCQl9IGVsc2UgeworCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJLy8gZG8gZXhwZWN0CisJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlpbnQgZXhwZWN0X2xlbjsKKwkJCXNpemVfdCBidWZfbGVuID0gMDsKKwkJCXNpemVfdCBtYXhfbGVuID0gbWF4X2Fib3J0X2xlbjsKKworCQkJc3RydWN0IHBvbGxmZCBwZmQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwKKwkJCWludCBub2ZhaWwgPSAwOworI2VuZGlmCisJCQljaGFyICpleHBlY3QgPSAqYXJndisrOworCisJCQkvLyBzYW5pdHkgY2hlY2s6IHNoYWxsIHdlIHJlYWxseSBleHBlY3Qgc29tZXRoaW5nPworCQkJaWYgKCFleHBlY3QpCisJCQkJZ290byBleHBlY3RfZG9uZTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfTk9GQUlMCisJCQkvLyBpZiBleHBlY3Qgc3RhcnRzIHdpdGggLQorCQkJaWYgKCctJyA9PSAqZXhwZWN0KSB7CisJCQkJLy8gc3dhbGxvdyAtCisJCQkJZXhwZWN0Kys7CisJCQkJLy8gYW5kIGVudGVyIG5vZmFpbCBtb2RlCisJCQkJbm9mYWlsKys7CisJCQl9CisjZW5kaWYKKworI2lmZGVmIF9fX1RFU1RfX19CVUZfX18gLy8gdGVzdCBiZWhhdmlvdXIgd2l0aCBhIHNtYWxsIGJ1ZmZlcgorIwl1bmRlZiBDT01NT05fQlVGU0laRQorIwlkZWZpbmUgQ09NTU9OX0JVRlNJWkUgNgorI2VuZGlmCisJCQkvLyBleHBhbmQgZXNjYXBlIHNlcXVlbmNlcyBpbiBleHBlY3QKKwkJCWV4cGVjdF9sZW4gPSB1bmVzY2FwZShleHBlY3QsICZleHBlY3RfbGVuIC8qZHVtbXkqLyk7CisJCQlpZiAoZXhwZWN0X2xlbiA+IG1heF9sZW4pCisJCQkJbWF4X2xlbiA9IGV4cGVjdF9sZW47CisJCQkvLyBzYW5pdHkgY2hlY2s6CisJCQkvLyB3ZSBzaG91bGQgZXhwZWN0IG1vcmUgdGhhbiBub3RoaW5nIGJ1dCBub3QgbW9yZSB0aGFuIGlucHV0IGJ1ZmZlcgorCQkJLy8gVE9ETzogbGF0ZXIgd2UnbGwgZ2V0IHJpZCBvZiBmaXhlZC1zaXplIGJ1ZmZlcgorCQkJaWYgKCFleHBlY3RfbGVuKQorCQkJCWdvdG8gZXhwZWN0X2RvbmU7CisJCQlpZiAobWF4X2xlbiA+PSBDT01NT05fQlVGU0laRSkgeworCQkJCWV4aXRjb2RlID0gRVJSX01FTTsKKwkJCQlnb3RvIGV4cGVjdF9kb25lOworCQkJfQorCisJCQkvLyBnZXQgcmVwbHkKKwkJCXBmZC5mZCA9IFNURElOX0ZJTEVOTzsKKwkJCXBmZC5ldmVudHMgPSBQT0xMSU47CisJCQl3aGlsZSAoIWV4aXRjb2RlCisJCQkgICAgJiYgcG9sbCgmcGZkLCAxLCB0aW1lb3V0KSA+IDAKKwkJCSAgICAmJiAocGZkLnJldmVudHMgJiBQT0xMSU4pCisJCQkpIHsKKyNkZWZpbmUgYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCQkJbGxpc3RfdCAqbDsKKwkJCQlzc2l6ZV90IGRlbHRhOworCisJCQkJLy8gcmVhZCBuZXh0IGNoYXIgZnJvbSBkZXZpY2UKKwkJCQlpZiAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgYnVmK2J1Zl9sZW4sIDEpID4gMCkgeworCQkJCQkvLyBkdW1wIGRldmljZSBpbnB1dCBpZiBSRUNPUkQgZm5hbWUKKwkJCQkJaWYgKHJlY29yZF9mZCA+IDApIHsKKwkJCQkJCWZ1bGxfd3JpdGUocmVjb3JkX2ZkLCBidWYrYnVmX2xlbiwgMSk7CisJCQkJCX0KKwkJCQkJLy8gZHVtcCBkZXZpY2UgaW5wdXQgaWYgRUNITyBPTgorCQkJCQlpZiAoZWNobyA+IDApIHsKKy8vCQkJCQkJaWYgKGJ1ZltidWZfbGVuXSA8ICcgJykgeworLy8JCQkJCQkJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCAiXiIsIDEpOworLy8JCQkJCQkJYnVmW2J1Zl9sZW5dICs9ICdAJzsKKy8vCQkJCQkJfQorCQkJCQkJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBidWYrYnVmX2xlbiwgMSk7CisJCQkJCX0KKwkJCQkJYnVmX2xlbisrOworCQkJCQkvLyBtb3ZlIGlucHV0IGZyYW1lIGlmIHdlJ3ZlIHJlYWNoZWQgaGlnaGVyIGJvdW5kCisJCQkJCWlmIChidWZfbGVuID4gQ09NTU9OX0JVRlNJWkUpIHsKKwkJCQkJCW1lbW1vdmUoYnVmLCBidWYrYnVmX2xlbi1tYXhfbGVuLCBtYXhfbGVuKTsKKwkJCQkJCWJ1Zl9sZW4gPSBtYXhfbGVuOworCQkJCQl9CisJCQkJfQorCQkJCS8vIE4uQi4gcnVsZSBvZiB0aHVtYjogdmFsdWVzIGJlaW5nIGxvb2tlZCBmb3IgY2FuCisJCQkJLy8gYmUgZm91bmQgb25seSBhdCB0aGUgZW5kIG9mIGlucHV0IGJ1ZmZlcgorCQkJCS8vIHRoaXMgYWxsb3dzIHRvIGdldCByaWQgb2Ygc3Ryc3RyKCkgYW5kIG1lbW1lbSgpCisKKwkJCQkvLyBUT0RPOiBtYWtlIGV4cGVjdCBhbmQgYWJvcnQgc3RyaW5ncyBwcm9jZXNzZWQgdW5pZm9ybWx5CisJCQkJLy8gYWJvcnQgY29uZGl0aW9uIGlzIG1ldD8gLT4gYmFpbCBvdXQKKwkJCQlmb3IgKGwgPSBhYm9ydHMsIGV4aXRjb2RlID0gRVJSX0FCT1JUOyBsOyBsID0gbC0+bGluaywgKytleGl0Y29kZSkgeworCQkJCQlzaXplX3QgbGVuID0gc3RybGVuKGwtPmRhdGEpOworCQkJCQlkZWx0YSA9IGJ1Zl9sZW4tbGVuOworCQkJCQlpZiAoZGVsdGEgPj0gMCAmJiAhbWVtY21wKGJ1ZitkZWx0YSwgbC0+ZGF0YSwgbGVuKSkKKwkJCQkJCWdvdG8gZXhwZWN0X2RvbmU7CisJCQkJfQorCQkJCWV4aXRjb2RlID0gRVJSX09LOworCisJCQkJLy8gZXhwZWN0ZWQgcmVwbHkgcmVjZWl2ZWQ/IC0+IGdvdG8gbmV4dCBjb21tYW5kCisJCQkJZGVsdGEgPSBidWZfbGVuIC0gZXhwZWN0X2xlbjsKKwkJCQlpZiAoZGVsdGEgPj0gMCAmJiAhbWVtY21wKGJ1ZitkZWx0YSwgZXhwZWN0LCBleHBlY3RfbGVuKSkKKwkJCQkJZ290byBleHBlY3RfZG9uZTsKKyN1bmRlZiBidWYKKwkJCX0gLyogd2hpbGUgKGhhdmUgZGF0YSkgKi8KKworCQkJLy8gZGV2aWNlIHRpbWVkIG91dCBvciB1bmV4cGVjdGVkIHJlcGx5IHJlY2VpdmVkCisJCQlleGl0Y29kZSA9IEVSUl9USU1FT1VUOworIGV4cGVjdF9kb25lOgorI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfTk9GQUlMCisJCQkvLyBvbiBzdWNjZXNzIGFuZCB3aGVuIGluIG5vZmFpbCBtb2RlCisJCQkvLyB3ZSBzaG91bGQgc2tpcCBmb2xsb3dpbmcgc3Vic2VuZC1zdWJleHBlY3QgcGFpcnMKKwkJCWlmIChub2ZhaWwpIHsKKwkJCQlpZiAoIWV4aXRjb2RlKSB7CisJCQkJCS8vIGZpbmQgbGFzdCBzZW5kIGJlZm9yZSBub24tZGFzaGVkIGV4cGVjdAorCQkJCQl3aGlsZSAoKmFyZ3YgJiYgYXJndlsxXSAmJiAnLScgPT0gYXJndlsxXVswXSkKKwkJCQkJCWFyZ3YgKz0gMjsKKwkJCQkJLy8gc2tpcCB0aGUgcGFpcgorCQkJCQkvLyBOLkIuIGRvIHdlIHJlYWxseSBuZWVkIHRoaXM/IQorCQkJCQlpZiAoISphcmd2KysgfHwgISphcmd2KyspCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gbm9mYWlsIG1vZGUgYWxzbyBjbGVhcnMgYWxsIGJ1dCBJTyBlcnJvcnMgKG9yIHNpZ25hbHMpCisJCQkJaWYgKEVSUl9JTyAhPSBleGl0Y29kZSkKKwkJCQkJZXhpdGNvZGUgPSBFUlJfT0s7CisJCQl9CisjZW5kaWYKKwkJCS8vIGJhaWwgb3V0IHVubGVzcyB3ZSBleHBlY3RlZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChleGl0Y29kZSkKKwkJCQlicmVhazsKKworCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJLy8gZG8gc2VuZAorCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJaWYgKCphcmd2KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCQkJCWludCBub2NyID0gMDsgLy8gaW5oaWJpdCB0ZXJtaW5hdGluZyBjb21tYW5kIHdpdGggXHIKKyNlbmRpZgorCQkJCWNoYXIgKmxvYWRlZCA9IE5VTEw7IC8vIGxvYWRlZCBjb21tYW5kCisJCQkJc2l6ZV90IGxlbjsKKwkJCQljaGFyICpidWYgPSAqYXJndisrOworCisJCQkJLy8gaWYgY29tbWFuZCBzdGFydHMgd2l0aCBACisJCQkJLy8gbG9hZCAicmVhbCIgY29tbWFuZCBmcm9tIGZpbGUgbmFtZWQgYWZ0ZXIgQAorCQkJCWlmICgnQCcgPT0gKmJ1ZikgeworCQkJCQkvLyBza2lwIHRoZSBAIGFuZCBhbnkgZm9sbG93aW5nIHdoaXRlLXNwYWNlCisJCQkJCXRyaW0oKytidWYpOworCQkJCQlidWYgPSBsb2FkZWQgPSB4bWFsbG9jX3hvcGVuX3JlYWRfY2xvc2UoYnVmLCBOVUxMKTsKKwkJCQl9CisJCQkJLy8gZXhwYW5kIGVzY2FwZSBzZXF1ZW5jZXMgaW4gY29tbWFuZAorCQkJCWxlbiA9IHVuZXNjYXBlKGJ1ZiwgJm5vY3IpOworCisJCQkJLy8gc2VuZCBjb21tYW5kCisJCQkJYWxhcm0odGltZW91dCk7CisJCQkJcGZkLmZkID0gU1RET1VUX0ZJTEVOTzsKKwkJCQlwZmQuZXZlbnRzID0gUE9MTE9VVDsKKwkJCQl3aGlsZSAobGVuICYmICFleGl0Y29kZQorCQkJCSAgICAmJiBwb2xsKCZwZmQsIDEsIC0xKSA+IDAKKwkJCQkgICAgJiYgKHBmZC5yZXZlbnRzICYgUE9MTE9VVCkKKwkJCQkpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUworCQkJCQkvLyAiXFxkIiBtZWFucyAxIHNlYyBkZWxheSwgIlxccCIgbWVhbnMgMC4wMSBzZWMgZGVsYXkKKwkJCQkJLy8gIlxcSyIgbWVhbnMgc2VuZCBCUkVBSworCQkJCQljaGFyIGMgPSAqYnVmOworCQkJCQlpZiAoJ1xcJyA9PSBjKSB7CisJCQkJCQljID0gKisrYnVmOworCQkJCQkJaWYgKCdkJyA9PSBjKSB7CisJCQkJCQkJc2xlZXAoMSk7CisJCQkJCQkJbGVuLS07CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlpZiAoJ3AnID09IGMpIHsKKwkJCQkJCQl1c2xlZXAoMTAwMDApOworCQkJCQkJCWxlbi0tOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJaWYgKCdLJyA9PSBjKSB7CisJCQkJCQkJdGNzZW5kYnJlYWsoU1RET1VUX0ZJTEVOTywgMCk7CisJCQkJCQkJbGVuLS07CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlidWYtLTsKKwkJCQkJfQorCQkJCQlpZiAoc2FmZV93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIDEpICE9IDEpCisJCQkJCQlicmVhazsKKwkJCQkJbGVuLS07CisJCQkJCWJ1ZisrOworI2Vsc2UKKwkJCQkJbGVuIC09IGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBsZW4pOworI2VuZGlmCisJCQkJfSAvKiB3aGlsZSAoY2FuIHdyaXRlKSAqLworCQkJCWFsYXJtKDApOworCisJCQkJLy8gcmVwb3J0IEkvTyBlcnJvciBpZiB0aGVyZSBzdGlsbCBleGlzdHMgYXQgbGVhc3Qgb25lIG5vbi1zZW50IGNoYXIKKwkJCQlpZiAobGVuKQorCQkJCQlleGl0Y29kZSA9IEVSUl9JTzsKKworCQkJCS8vIGZyZWUgbG9hZGVkIGNvbW1hbmQgKGlmIGFueSkKKwkJCQlpZiAobG9hZGVkKQorCQkJCQlmcmVlKGxvYWRlZCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCQkJCS8vIG9yIHRlcm1pbmF0ZSBjb21tYW5kIHdpdGggXHIgKGlmIG5vdCBpbmhpYml0ZWQpCisJCQkJZWxzZSBpZiAoIW5vY3IpCisJCQkJCXh3cml0ZShTVERPVVRfRklMRU5PLCAiXHIiLCAxKTsKKyNlbmRpZgorCQkJCS8vIGJhaWwgb3V0IHVubGVzcyB3ZSBzZW50IGNvbW1hbmQgc3VjY2Vzc2Z1bGx5CisJCQkJaWYgKGV4aXRjb2RlKQorCQkJCQlicmVhazsKKwkJCX0gLyogaWYgKCphcmd2KSAqLworCQl9CisJfSAvKiB3aGlsZSAoKmFyZ3YpICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1RUWV9ISUZJCisJdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQUZMVVNILCAmdGlvMCk7CisjZW5kaWYKKworCXJldHVybiBleGl0Y29kZTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9jaHJ0LmMgYi9taXNjdXRpbHMvY2hydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjUzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvY2hydC5jCkBAIC0wLDAgKzEsMTQyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaHJ0IC0gbWFuaXB1bGF0ZSByZWFsLXRpbWUgYXR0cmlidXRlcyBvZiBhIHByb2Nlc3MKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNocnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcHJmb21dIFtQUklPXSBbUElEIHwgUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBjaHJ0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHNjaGVkdWxpbmcgcHJpb3JpdHkgYW5kIGNsYXNzIGZvciBhIHByb2Nlc3NcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJT3BlcmF0ZSBvbiBQSUQiCisvL3VzYWdlOiAgICAgIlxuCS1yCVNldCBTQ0hFRF9SUiBjbGFzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJU2V0IFNDSEVEX0ZJRk8gY2xhc3MiCisvL3VzYWdlOiAgICAgIlxuCS1vCVNldCBTQ0hFRF9PVEhFUiBjbGFzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JU2hvdyBtaW4vbWF4IHByaW9yaXRpZXMiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGNocnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgY2hydCAtciA0IHNsZWVwIDkwMDsgeD0kIVxuIgorLy91c2FnZTogICAgICAgIiQgY2hydCAtZiAtcCAzICR4XG4iCisvL3VzYWdlOiAgICAgICAiWW91IG5lZWQgQ0FQX1NZU19OSUNFIHByaXZpbGVnZXMgdG8gc2V0IHNjaGVkdWxpbmcgYXR0cmlidXRlcyBvZiBhIHByb2Nlc3MiCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisjaWZuZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjd2FybmluZyB5b3VyIHN5c3RlbSBtYXkgYmUgZm9vYmFyZWQKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgcG9saWN5OworCWNoYXIgbmFtZVtzaXplb2YoIlNDSEVEX09USEVSIildOworfSBwb2xpY2llc1tdID0geworCXtTQ0hFRF9PVEhFUiwgIlNDSEVEX09USEVSIn0sCisJe1NDSEVEX0ZJRk8sICJTQ0hFRF9GSUZPIn0sCisJe1NDSEVEX1JSLCAiU0NIRURfUlIifQorfTsKKworLy9UT0RPOiBhZGQKKy8vIC1iLCBTQ0hFRF9CQVRDSAorLy8gLWksIFNDSEVEX0lETEUKKworc3RhdGljIHZvaWQgc2hvd19taW5fbWF4KGludCBwb2wpCit7CisJY29uc3QgY2hhciAqZm10ID0gIiVzIG1pbi9tYXggcHJpb3JpdHlcdDogJXUvJXVcbiI7CisJaW50IG1heCwgbWluOworCisJbWF4ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwb2wpOworCW1pbiA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4ocG9sKTsKKwlpZiAoKG1heHxtaW4pIDwgMCkKKwkJZm10ID0gIiVzIG5vdCBzdXBwb3J0ZWRcbiI7CisJcHJpbnRmKGZtdCwgcG9saWNpZXNbcG9sXS5uYW1lLCBtaW4sIG1heCk7Cit9CisKKyNkZWZpbmUgT1BUX20gKDE8PDApCisjZGVmaW5lIE9QVF9wICgxPDwxKQorI2RlZmluZSBPUFRfciAoMTw8MikKKyNkZWZpbmUgT1BUX2YgKDE8PDMpCisjZGVmaW5lIE9QVF9vICgxPDw0KQorCitpbnQgY2hydF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hydF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcGlkX3QgcGlkID0gMDsKKwl1bnNpZ25lZCBvcHQ7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCWNoYXIgKnBpZF9zdHI7CisJY2hhciAqcHJpb3JpdHkgPSBwcmlvcml0eTsgLyogZm9yIGNvbXBpbGVyICovCisJY29uc3QgY2hhciAqY3VycmVudF9uZXc7CisJaW50IHBvbGljeSA9IFNDSEVEX1JSOworCisJLyogb25seSBvbmUgcG9saWN5IGFjY2VwdGVkICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAici0tZm86Zi0tcm86by0tcmYiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrbXByZm8iKTsKKwlpZiAob3B0ICYgT1BUX20pIHsgLyogcHJpbnQgbWluL21heCBhbmQgZXhpdCAqLworCQlzaG93X21pbl9tYXgoU0NIRURfRklGTyk7CisJCXNob3dfbWluX21heChTQ0hFRF9SUik7CisJCXNob3dfbWluX21heChTQ0hFRF9PVEhFUik7CisJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisJaWYgKG9wdCAmIE9QVF9yKQorCQlwb2xpY3kgPSBTQ0hFRF9SUjsKKwlpZiAob3B0ICYgT1BUX2YpCisJCXBvbGljeSA9IFNDSEVEX0ZJRk87CisJaWYgKG9wdCAmIE9QVF9vKQorCQlwb2xpY3kgPSBTQ0hFRF9PVEhFUjsKKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghYXJndlswXSkKKwkJYmJfc2hvd191c2FnZSgpOworCWlmIChvcHQgJiBPUFRfcCkgeworCQlwaWRfc3RyID0gKmFyZ3YrKzsKKwkJaWYgKCphcmd2KSB7IC8qICItcCA8cHJpb3JpdHk+IDxwaWQ+IFsuLi5dIiAqLworCQkJcHJpb3JpdHkgPSBwaWRfc3RyOworCQkJcGlkX3N0ciA9ICphcmd2OworCQl9CisJCS8qIGVsc2UgIi1wIDxwaWQ+IiwgYW5kICphcmd2ID09IE5VTEwgKi8KKwkJcGlkID0geGF0b3VsX3JhbmdlKHBpZF9zdHIsIDEsICgodW5zaWduZWQpKHBpZF90KVVMT05HX01BWCkgPj4gMSk7CisJfSBlbHNlIHsKKwkJcHJpb3JpdHkgPSAqYXJndisrOworCQlpZiAoISphcmd2KQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWN1cnJlbnRfbmV3ID0gImN1cnJlbnRcMG5ldyI7CisJaWYgKG9wdCAmIE9QVF9wKSB7CisJCWludCBwb2w7CisgcHJpbnRfcnRfaW5mbzoKKwkJcG9sID0gc2NoZWRfZ2V0c2NoZWR1bGVyKHBpZCk7CisJCWlmIChwb2wgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCAlY2V0IHBpZCAlZCdzIHBvbGljeSIsICdnJywgKGludClwaWQpOworCQlwcmludGYoInBpZCAlZCdzICVzIHNjaGVkdWxpbmcgcG9saWN5OiAlc1xuIiwKKwkJCQlwaWQsIGN1cnJlbnRfbmV3LCBwb2xpY2llc1twb2xdLm5hbWUpOworCQlpZiAoc2NoZWRfZ2V0cGFyYW0ocGlkLCAmc3ApKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgcGlkICVkJ3MgYXR0cmlidXRlcyIsIChpbnQpcGlkKTsKKwkJcHJpbnRmKCJwaWQgJWQncyAlcyBzY2hlZHVsaW5nIHByaW9yaXR5OiAlZFxuIiwKKwkJCQkoaW50KXBpZCwgY3VycmVudF9uZXcsIHNwLnNjaGVkX3ByaW9yaXR5KTsKKwkJaWYgKCEqYXJndikgeworCQkJLyogRWl0aGVyIGl0IHdhcyBqdXN0ICItcCA8cGlkPiIsCisJCQkgKiBvciBpdCB3YXMgIi1wIDxwcmlvcml0eT4gPHBpZD4iIGFuZCB3ZSBjYW1lIGhlcmUKKwkJCSAqIGZvciB0aGUgc2Vjb25kIHRpbWUgKHNlZSBnb3RvIGJlbG93KSAqLworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQkqYXJndiA9IE5VTEw7CisJCWN1cnJlbnRfbmV3ICs9IDg7CisJfQorCisJLyogZnJvbSB0aGUgbWFucGFnZSBvZiBzY2hlZF9nZXRzY2hlZHVsZXI6CisJWy4uLl0gc2NoZWRfcHJpb3JpdHkgY2FuIGhhdmUgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMCB0byA5OS4KKwlbLi4uXSBTQ0hFRF9PVEhFUiBvciBTQ0hFRF9CQVRDSCBtdXN0IGJlIGFzc2lnbmVkIHN0YXRpYyBwcmlvcml0eSAwLgorCVsuLi5dIFNDSEVEX0ZJRk8gb3IgU0NIRURfUlIgY2FuIGhhdmUgc3RhdGljIHByaW9yaXR5IGluIDEuLjk5IHJhbmdlLgorCSovCisJc3Auc2NoZWRfcHJpb3JpdHkgPSB4c3RydG91X3JhbmdlKHByaW9yaXR5LCAwLCBwb2xpY3kgIT0gU0NIRURfT1RIRVIgPyAxIDogMCwgOTkpOworCisJaWYgKHNjaGVkX3NldHNjaGVkdWxlcihwaWQsIHBvbGljeSwgJnNwKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJWNldCBwaWQgJWQncyBwb2xpY3kiLCAncycsIChpbnQpcGlkKTsKKworCWlmICghYXJndlswXSkgLyogIi1wIDxwcmlvcml0eT4gPHBpZD4gWy4uLl0iICovCisJCWdvdG8gcHJpbnRfcnRfaW5mbzsKKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvY29uc3B5LmMgYi9taXNjdXRpbHMvY29uc3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzYzNlOAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9jb25zcHkuYwpAQCAtMCwwICsxLDU0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQSB0ZXh0LW1vZGUgVk5DIGxpa2UgcHJvZ3JhbSBmb3IgTGludXggdmlydHVhbCB0ZXJtaW5hbHMuCisgKgorICogcGFzY2FsLmJlbGxhcmRAYWRzLWx1LmNvbQorICoKKyAqIEJhc2VkIG9uIFJ1c3NlbGwgU3R1YXJ0J3MgY29uc3B5LmMKKyAqICAgaHR0cDovL2FjZS1ob3N0LnN0dWFydC5pZC5hdS9ydXNzZWxsL2ZpbGVzL2NvbnNweS5jCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9DT05TUFkoQVBQTEVUKGNvbnNweSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NPTlNQWSkgKz0gY29uc3B5Lm8KKworLy9jb25maWc6Y29uZmlnIENPTlNQWQorLy9jb25maWc6CWJvb2wgImNvbnNweSIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBIHRleHQtbW9kZSBWTkMgbGlrZSBwcm9ncmFtIGZvciBMaW51eCB2aXJ0dWFsIHRlcm1pbmFscy4KKy8vY29uZmlnOgkgIGV4YW1wbGU6ICBjb25zcHkgTlVNICAgICAgc2hhcmVkIGFjY2VzcyB0byBjb25zb2xlIG51bQorLy9jb25maWc6CSAgb3IgICAgICAgIGNvbnNweSAtbmQgTlVNICBzY3JlZW5zaG90IG9mIGNvbnNvbGUgbnVtCisvL2NvbmZpZzoJICBvciAgICAgICAgY29uc3B5IC1jcyBOVU0gIHBvb3IgbWFuJ3MgR05VIHNjcmVlbiBsaWtlCisKKy8vdXNhZ2U6I2RlZmluZSBjb25zcHlfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstdmNzbmRmXSBbLXggQ09MXSBbLXkgTElORV0gW0NPTlNPTEVfTk9dIgorLy91c2FnZTojZGVmaW5lIGNvbnNweV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICJBIHRleHQtbW9kZSBWTkMgbGlrZSBwcm9ncmFtIGZvciBMaW51eCB2aXJ0dWFsIGNvbnNvbGVzLiIKKy8vdXNhZ2U6ICAgICAiXG5UbyBleGl0LCBxdWlja2x5IHByZXNzIEVTQyAzIHRpbWVzLiIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS12CURvbid0IHNlbmQga2V5c3Ryb2tlcyB0byB0aGUgY29uc29sZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ3JlYXRlIG1pc3NpbmcgZGV2aWNlcyBpbiAvZGV2IgorLy91c2FnZTogICAgICJcbgktcwlPcGVuIGEgU0hFTEwgc2Vzc2lvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JQmxhY2sgJiB3aGl0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRHVtcCBjb25zb2xlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9sbG93IGN1cnNvciIKKy8vdXNhZ2U6ICAgICAiXG4JLXggQ09MCVN0YXJ0aW5nIGNvbHVtbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXkgTElORQlTdGFydGluZyBsaW5lIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMva2QuaD4KKworCisjZGVmaW5lIEVTQyAiXDAzMyIKKworc3RydWN0IHNjcmVlbl9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGxpbmVzLCBjb2xzLCBjdXJzb3JfeCwgY3Vyc29yX3k7Cit9OworCisjZGVmaW5lIENIQVIoeCkgKCoodWludDhfdCopKHgpKQorI2RlZmluZSBBVFRSKHgpICgoKHVpbnQ4X3QqKSh4KSlbMV0pCisjZGVmaW5lIE5FWFQoeCkgKCh4KSArPSAyKQorI2RlZmluZSBEQVRBKHgpICgqKHVpbnQxNl90KikoeCkpCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyKiBkYXRhOworCWludCBzaXplOworCWludCB4LCB5OworCWludCBrYmRfZmQ7CisJaW50IGlvZXJyb3JfY291bnQ7CisJaW50IGtleV9jb3VudDsKKwlpbnQgZXNjYXBlX2NvdW50OworCWludCBub2tleXM7CisJaW50IGN1cnJlbnQ7CisJaW50IGZpcnN0X2xpbmVfb2Zmc2V0OworCWludCBsYXN0X2F0dHI7CisJLy8gY2FjaGVkIGxvY2FsIHR0eSBwYXJhbWV0ZXJzCisJdW5zaWduZWQgd2lkdGg7CisJdW5zaWduZWQgaGVpZ2h0OworCXVuc2lnbmVkIGNvbDsKKwl1bnNpZ25lZCBsaW5lOworCXNtYWxsaW50IGN1cm9mZjsgLy8gdW5rbm93bjowIGN1cnNvciBvbjotMSBjdXJzb3Igb2ZmOjEKKwljaGFyIGF0dHJidWZbc2l6ZW9mKEVTQyJbMDsxOzU7MzA7NDBtIildOworCS8vIHJlbW90ZSBjb25zb2xlCisJc3RydWN0IHNjcmVlbl9pbmZvIHJlbW90ZTsKKwkvLyBzYXZlZCBsb2NhbCB0dHkgdGVybWluZm8KKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtX29yaWc7CisJY2hhciB2Y3NhX25hbWVbc2l6ZW9mKCIvZGV2L3Zjc2FOTiIpXTsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUcuYXR0cmJ1ZlswXSA9ICdcMDMzJzsgXAorCUcuYXR0cmJ1ZlsxXSA9ICdbJzsgXAorCUcud2lkdGggPSBHLmhlaWdodCA9IFVJTlRfTUFYOyBcCisJRy5sYXN0X2F0dHItLTsgXAorfSB3aGlsZSAoMCkKKworZW51bSB7CisJRkxBR192LCAgLy8gdmlldyBvbmx5CisJRkxBR19jLCAgLy8gY3JlYXRlIGRldmljZSBpZiBuZWVkCisJRkxBR19zLCAgLy8gc2Vzc2lvbgorCUZMQUdfbiwgIC8vIG5vIGNvbG9ycworCUZMQUdfZCwgIC8vIGR1bXAgc2NyZWVuCisJRkxBR19mLCAgLy8gZm9sbG93IGN1cnNvcgorfTsKKyNkZWZpbmUgRkxBRyh4KSAoMSA8PCBGTEFHXyMjeCkKKyNkZWZpbmUgQlcgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKG4pKQorCitzdGF0aWMgdm9pZCBjbHJzY3Iodm9pZCkKK3sKKwkvLyBIb21lLCBjbGVhciB0aWxsIGVuZCBvZiBzY3JlZW4KKwlmcHV0cyhFU0MiWzE7MUgiIEVTQyJbSiIsIHN0ZG91dCk7CisJRy5jb2wgPSBHLmxpbmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfY3Vyc29yKGludCBzdGF0ZSkKK3sKKwlpZiAoRy5jdXJvZmYgIT0gc3RhdGUpIHsKKwkJRy5jdXJvZmYgPSBzdGF0ZTsKKwkJZnB1dHMoRVNDIls/MjUiLCBzdGRvdXQpOworCQliYl9wdXRjaGFyKCJoP2wiWzEgKyBzdGF0ZV0pOworCX0KK30KKworc3RhdGljIHZvaWQgZ290b3h5KGludCBjb2wsIGludCBsaW5lKQoreworCWlmIChHLmNvbCAhPSBjb2wgfHwgRy5saW5lICE9IGxpbmUpIHsKKwkJRy5jb2wgPSBjb2w7CisJCUcubGluZSA9IGxpbmU7CisJCXByaW50ZihFU0MiWyV1OyV1SCIsIGxpbmUgKyAxLCBjb2wgKyAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXAoaW50IGNvZGUpCit7CisJc2V0X2N1cnNvcigtMSk7IC8vIGN1cnNvciBvbgorCXRjc2V0YXR0cihHLmtiZF9mZCwgVENTQU5PVywgJkcudGVybV9vcmlnKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoRy5rYmRfZmQpOworCX0KKwkvLyBSZXNldCBhdHRyaWJ1dGVzCisJaWYgKCFCVykKKwkJZnB1dHMoRVNDIlswbSIsIHN0ZG91dCk7CisJYmJfcHV0Y2hhcignXG4nKTsKKwlpZiAoY29kZSA+IDEpCisJCWtpbGxfbXlzZWxmX3dpdGhfc2lnKGNvZGUpOworCWV4aXQoY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjcmVlbl9yZWFkX2Nsb3NlKHZvaWQpCit7CisJdW5zaWduZWQgaSwgajsKKwlpbnQgdmNzYV9mZDsKKwljaGFyICpkYXRhOworCisJLy8gQ2xvc2UgJiByZS1vcGVuIHZjc2EgaW4gY2FzZSB0aGV5IGhhdmUgc3dhcHBlZCB2aXJ0dWFsIGNvbnNvbGVzCisJdmNzYV9mZCA9IHhvcGVuKEcudmNzYV9uYW1lLCBPX1JET05MWSk7CisJeHJlYWQodmNzYV9mZCwgJkcucmVtb3RlLCA0KTsKKwlpID0gRy5yZW1vdGUuY29scyAqIDI7CisJRy5maXJzdF9saW5lX29mZnNldCA9IEcueSAqIGk7CisJaSAqPSBHLnJlbW90ZS5saW5lczsKKwlpZiAoRy5kYXRhID09IE5VTEwpIHsKKwkJRy5zaXplID0gaTsKKwkJRy5kYXRhID0geHphbGxvYygyICogaSk7CisJfQorCWVsc2UgaWYgKEcuc2l6ZSAhPSBpKSB7CisJCWNsZWFudXAoMSk7CisJfQorCWRhdGEgPSBHLmRhdGEgKyBHLmN1cnJlbnQ7CisJeHJlYWQodmNzYV9mZCwgZGF0YSwgRy5zaXplKTsKKwljbG9zZSh2Y3NhX2ZkKTsKKwlmb3IgKGkgPSAwOyBpIDwgRy5yZW1vdGUubGluZXM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgRy5yZW1vdGUuY29sczsgaisrLCBORVhUKGRhdGEpKSB7CisJCQl1bnNpZ25lZCB4ID0gaiAtIEcueDsgLy8gaWYgd2lsbCBjYXRjaCBqIDwgRy54IHRvbworCQkJdW5zaWduZWQgeSA9IGkgLSBHLnk7IC8vIGlmIHdpbGwgY2F0Y2ggaSA8IEcueSB0b28KKworCQkJaWYgKENIQVIoZGF0YSkgPCAnICcpCisJCQkJQ0hBUihkYXRhKSA9ICcgJzsKKwkJCWlmICh5ID49IEcuaGVpZ2h0IHx8IHggPj0gRy53aWR0aCkKKwkJCQlEQVRBKGRhdGEpID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NyZWVuX2NoYXIoY2hhciAqZGF0YSkKK3sKKwlpZiAoIUJXKSB7CisJCXVpbnQ4X3QgYXR0ciA9IEFUVFIoZGF0YSk7CisJCS8vdWludDhfdCBhdHRyID0gQVRUUihkYXRhKSA+PiAxOyAvLyBmb3IgZnJhbWVidWZmZXIgY29uc29sZQorCQl1aW50OF90IGF0dHJfZGlmZiA9IEcubGFzdF9hdHRyIF4gYXR0cjsKKworCQlpZiAoYXR0cl9kaWZmKSB7CisvLyBBdHRyaWJ1dGUgbGF5b3V0IGZvciBWR0EgY29tcGF0aWJsZSB0ZXh0IHZpZGVvYnVmZmVyOgorLy8gYmxpbmtpbmcgdGV4dAorLy8gfHJlZCBia2dkCisvLyB8fGdyZWVuIGJrZ2QKKy8vIHx8fGJsdWUgYmtnZAorLy8gdnZ2dgorLy8gMDAwMDAwMDAgPC0gbHNiIGJpdCBvbiB0aGUgcmlnaHQKKy8vICAgICBib2xkIHRleHQgLyB0ZXh0IDh0aCBiaXQKKy8vICAgICAgcmVkIHRleHQKKy8vICAgICAgIGdyZWVuIHRleHQKKy8vICAgICAgICBibHVlIHRleHQKKy8vIFRPRE86IGFwcGFyZW50bHkgZnJhbWVidWZmZXItYmFzZWQgY29uc29sZSB1c2VzIGRpZmZlcmVudCBsYXlvdXQKKy8vIChidWc/IGF0dGVtcHQgdG8gZ2V0IDh0aCB0ZXh0IGJpdCBpbiBiZXR0ZXIgcG9zaXRpb24/KQorLy8gcmVkIGJrZ2QKKy8vIHxncmVlbiBia2dkCisvLyB8fGJsdWUgYmtnZAorLy8gdnZ2CisvLyAwMDAwMDAwMCA8LSBsc2IgYml0IG9uIHRoZSByaWdodAorLy8gICAgYm9sZCB0ZXh0CisvLyAgICAgcmVkIHRleHQKKy8vICAgICAgZ3JlZW4gdGV4dAorLy8gICAgICAgYmx1ZSB0ZXh0CisvLyAgICAgICAgdGV4dCA4dGggYml0CisJCQkvLyBjb252ZXJ0aW5nIFJHQiBjb2xvciBiaXQgdHJpYWQgdG8gQkdSOgorCQkJc3RhdGljIGNvbnN0IGNoYXIgY29sb3JbOF0gPSAiMDQyNjE1MzciOworCQkJY29uc3QgdWludDhfdCBmZ19tYXNrID0gMHgwNywgYm9sZF9tYXNrICA9IDB4MDg7CisJCQljb25zdCB1aW50OF90IGJnX21hc2sgPSAweDcwLCBibGlua19tYXNrID0gMHg4MDsKKwkJCWNoYXIgKnB0cjsKKworCQkJcHRyID0gRy5hdHRyYnVmICsgMjsgLy8gc2tpcCAiRVNDIFsiCisKKwkJCS8vIChHLmxhc3RfYXR0ciAmIH5hdHRyKSBoYXMgMSBvbmx5IHdoZXJlCisJCQkvLyBHLmxhc3RfYXR0ciBoYXMgMSBidXQgYXR0ciBoYXMgMC4KKwkJCS8vIEhlcmUgd2UgY2hlY2sgd2hldGhlciB3ZSBoYXZlIHRyYW5zaXRpb24KKwkJCS8vIGJvbGQtPm5vbi1ib2xkIG9yIGJsaW5rLT5ub24tYmxpbms6CisJCQlpZiAoRy5sYXN0X2F0dHIgPCAwICAvLyBpbml0aWFsIHZhbHVlCisJCQkgfHwgKChHLmxhc3RfYXR0ciAmIH5hdHRyKSAmIChib2xkX21hc2sgfCBibGlua19tYXNrKSkgIT0gMAorCQkJKSB7CisJCQkJKnB0cisrID0gJzAnOyAvLyAicmVzZXQgYWxsIGF0dHJzIgorCQkJCSpwdHIrKyA9ICc7JzsKKwkJCQkvLyBtdXN0IHNldCBmZyAmIGJnLCBtYXliZSBuZWVkIHRvIHNldCBib2xkIG9yIGJsaW5rOgorCQkJCWF0dHJfZGlmZiA9IGF0dHIgfCB+KGJvbGRfbWFzayB8IGJsaW5rX21hc2spOworCQkJfQorCQkJRy5sYXN0X2F0dHIgPSBhdHRyOworCQkJaWYgKGF0dHJfZGlmZiAmIGJvbGRfbWFzaykgeworCQkJCSpwdHIrKyA9ICcxJzsKKwkJCQkqcHRyKysgPSAnOyc7CisJCQl9CisJCQlpZiAoYXR0cl9kaWZmICYgYmxpbmtfbWFzaykgeworCQkJCSpwdHIrKyA9ICc1JzsKKwkJCQkqcHRyKysgPSAnOyc7CisJCQl9CisJCQlpZiAoYXR0cl9kaWZmICYgZmdfbWFzaykgeworCQkJCSpwdHIrKyA9ICczJzsKKwkJCQkqcHRyKysgPSBjb2xvclthdHRyICYgZmdfbWFza107CisJCQkJKnB0cisrID0gJzsnOworCQkJfQorCQkJaWYgKGF0dHJfZGlmZiAmIGJnX21hc2spIHsKKwkJCQkqcHRyKysgPSAnNCc7CisJCQkJKnB0cisrID0gY29sb3JbKGF0dHIgJiBiZ19tYXNrKSA+PiA0XTsKKwkJCQkqcHRyKysgPSAnOyc7CisJCQl9CisJCQlpZiAocHRyICE9IEcuYXR0cmJ1ZiArIDIpIHsKKwkJCQlwdHJbLTFdID0gJ20nOworCQkJCSpwdHIgPSAnXDAnOworCQkJCWZwdXRzKEcuYXR0cmJ1Ziwgc3Rkb3V0KTsKKwkJCX0KKwkJfQorCX0KKwlwdXRjaGFyKENIQVIoZGF0YSkpOworCUcuY29sKys7Cit9CisKK3N0YXRpYyB2b2lkIHNjcmVlbl9kdW1wKHZvaWQpCit7CisJaW50IGxpbmVmZWVkX2NudDsKKwlpbnQgbGluZSwgY29sOworCWludCBsaW5lY250ID0gRy5yZW1vdGUubGluZXMgLSBHLnk7CisJY2hhciAqZGF0YSA9IEcuZGF0YSArIEcuY3VycmVudCArIEcuZmlyc3RfbGluZV9vZmZzZXQ7CisKKwlsaW5lZmVlZF9jbnQgPSAwOworCWZvciAobGluZSA9IDA7IGxpbmUgPCBsaW5lY250ICYmIGxpbmUgPCBHLmhlaWdodDsgbGluZSsrKSB7CisJCWludCBzcGFjZV9jbnQgPSAwOworCQlmb3IgKGNvbCA9IDA7IGNvbCA8IEcucmVtb3RlLmNvbHM7IGNvbCsrLCBORVhUKGRhdGEpKSB7CisJCQl1bnNpZ25lZCB0dHlfY29sID0gY29sIC0gRy54OyAvLyBpZiB3aWxsIGNhdGNoIGNvbCA8IEcueCB0b28KKworCQkJaWYgKHR0eV9jb2wgPj0gRy53aWR0aCkKKwkJCQljb250aW51ZTsKKwkJCXNwYWNlX2NudCsrOworCQkJaWYgKEJXICYmIENIQVIoZGF0YSkgPT0gJyAnKQorCQkJCWNvbnRpbnVlOworCQkJd2hpbGUgKGxpbmVmZWVkX2NudCAhPSAwKSB7CisJCQkJLy9iYl9wdXRjaGFyKCdccicpOyAtIHR0eSBkcml2ZXIgZG9lcyBpdCBmb3IgdXMKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCWxpbmVmZWVkX2NudC0tOworCQkJfQorCQkJd2hpbGUgKC0tc3BhY2VfY250KQorCQkJCWJiX3B1dGNoYXIoJyAnKTsKKwkJCXNjcmVlbl9jaGFyKGRhdGEpOworCQl9CisJCWxpbmVmZWVkX2NudCsrOworCX0KK30KKworc3RhdGljIHZvaWQgY3VybW92ZSh2b2lkKQoreworCXVuc2lnbmVkIGN4ID0gRy5yZW1vdGUuY3Vyc29yX3ggLSBHLng7CisJdW5zaWduZWQgY3kgPSBHLnJlbW90ZS5jdXJzb3JfeSAtIEcueTsKKwlpbnQgY3Vyc29yID0gMTsKKworCWlmIChjeCA8IEcud2lkdGggJiYgY3kgPCBHLmhlaWdodCkgeworCQlnb3RveHkoY3gsIGN5KTsKKwkJY3Vyc29yID0gLTE7CisJfQorCXNldF9jdXJzb3IoY3Vyc29yKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2NkZXZfaWZfZG9lc250X2V4aXN0KGNvbnN0IGNoYXIqIG5hbWUsIGRldl90IGRldikKK3sKKwlpbnQgZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgIT0gLTEpCisJCWNsb3NlKGZkKTsKKwllbHNlIGlmIChlcnJubyA9PSBFTk9FTlQpCisJCW1rbm9kKG5hbWUsIFNfSUZDSFIgfCAwNjYwLCBkZXYpOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzdGFydF9zaGVsbF9pbl9jaGlsZChjb25zdCBjaGFyKiB0dHlfbmFtZSkKK3sKKwlpbnQgcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCXN0cnVjdCB0ZXJtaW9zIHRlcm1jaGlsZDsKKwkJY29uc3QgY2hhciAqc2hlbGwgPSBnZXRfc2hlbGxfbmFtZSgpOworCisJCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworCQkvLyBzZXQgdHR5IGFzIGEgY29udHJvbGxpbmcgdHR5CisJCXNldHNpZCgpOworCQkvLyBtYWtlIHR0eSB0byBiZSBpbnB1dCwgb3V0cHV0LCBlcnJvcgorCQljbG9zZSgwKTsKKwkJeG9wZW4odHR5X25hbWUsIE9fUkRXUik7IC8vIHVzZXMgZmQgMAorCQl4ZHVwMigwLCAxKTsKKwkJeGR1cDIoMCwgMik7CisJCWlvY3RsKDAsIFRJT0NTQ1RUWSwgMSk7CisJCXRjc2V0cGdycCgwLCBnZXRwaWQoKSk7CisJCXRjZ2V0YXR0cigwLCAmdGVybWNoaWxkKTsKKwkJdGVybWNoaWxkLmNfbGZsYWcgfD0gRUNITzsKKwkJdGVybWNoaWxkLmNfb2ZsYWcgfD0gT05MQ1IgfCBYVEFCUzsKKwkJdGVybWNoaWxkLmNfaWZsYWcgfD0gSUNSTkw7CisJCXRlcm1jaGlsZC5jX2lmbGFnICY9IH5JWE9GRjsKKwkJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRlcm1jaGlsZCk7CisJCWV4ZWNsKHNoZWxsLCBzaGVsbCwgIi1pIiwgKGNoYXIgKikgTlVMTCk7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoc2hlbGwpOworCX0KK30KKworaW50IGNvbnNweV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY29uc3B5X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyIHR0eV9uYW1lW3NpemVvZigiL2Rldi90dHlOTiIpXTsKKyNkZWZpbmUga2V5YnVmIGJiX2NvbW1vbl9idWZzaXoxCisJc3RydWN0IHRlcm1pb3MgdGVybWJ1ZjsKKwl1bnNpZ25lZCBvcHRzOworCXVuc2lnbmVkIHR0eW51bTsKKwlpbnQgcG9sbF90aW1lb3V0X21zOworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBnZXRvcHRfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkidmlld29ubHlcMCIgICAgIE5vX2FyZ3VtZW50ICJ2IgorCQkiY3JlYXRlZGV2aWNlXDAiIE5vX2FyZ3VtZW50ICJjIgorCQkic2Vzc2lvblwwIiAgICAgIE5vX2FyZ3VtZW50ICJzIgorCQkibm9jb2xvcnNcMCIgICAgIE5vX2FyZ3VtZW50ICJuIgorCQkiZHVtcFwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICJkIgorCQkiZm9sbG93XDAiICAgICAgIE5vX2FyZ3VtZW50ICJmIgorCQk7CisKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZ2V0b3B0X2xvbmdvcHRzOworI2VuZGlmCisJSU5JVF9HKCk7CisJc3RyY3B5KEcudmNzYV9uYW1lLCAiL2Rldi92Y3NhIik7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ4Kzp5KyI7IC8vIG51bWVyaWMgcGFyYW1zCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJ2Y3NuZGZ4Onk6IiwgJkcueCwgJkcueSk7CisJYXJndiArPSBvcHRpbmQ7CisJdHR5bnVtID0gMDsKKwlpZiAoYXJndlswXSkgeworCQl0dHludW0gPSB4YXRvdV9yYW5nZShhcmd2WzBdLCAwLCA2Myk7CisJCXNwcmludGYoRy52Y3NhX25hbWUgKyBzaXplb2YoIi9kZXYvdmNzYSIpLTEsICIldSIsIHR0eW51bSk7CisJfQorCXNwcmludGYodHR5X25hbWUsICIlcyV1IiwgIi9kZXYvdHR5IiwgdHR5bnVtKTsKKwlpZiAob3B0cyAmIEZMQUcoYykpIHsKKwkJaWYgKChvcHRzICYgKEZMQUcocyl8RkxBRyh2KSkpICE9IEZMQUcodikpCisJCQljcmVhdGVfY2Rldl9pZl9kb2VzbnRfZXhpc3QodHR5X25hbWUsIG1ha2VkZXYoNCwgdHR5bnVtKSk7CisJCWNyZWF0ZV9jZGV2X2lmX2RvZXNudF9leGlzdChHLnZjc2FfbmFtZSwgbWFrZWRldig3LCAxMjggKyB0dHludW0pKTsKKwl9CisJaWYgKChvcHRzICYgRkxBRyhzKSkgJiYgdHR5bnVtKSB7CisJCXN0YXJ0X3NoZWxsX2luX2NoaWxkKHR0eV9uYW1lKTsKKwl9CisKKwlzY3JlZW5fcmVhZF9jbG9zZSgpOworCWlmIChvcHRzICYgRkxBRyhkKSkgeworCQlzY3JlZW5fZHVtcCgpOworCQliYl9wdXRjaGFyKCdcbicpOworCQlyZXR1cm4gMDsKKwl9CisKKwliYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIGNsZWFudXApOworCisJLy8gQWxsIGNoYXJhY3RlcnMgbXVzdCBiZSBwYXNzZWQgdGhyb3VnaCB0byB1cyB1bmFsdGVyZWQKKwlHLmtiZF9mZCA9IHhvcGVuKENVUlJFTlRfVFRZLCBPX1JET05MWSk7CisJdGNnZXRhdHRyKEcua2JkX2ZkLCAmRy50ZXJtX29yaWcpOworCXRlcm1idWYgPSBHLnRlcm1fb3JpZzsKKwl0ZXJtYnVmLmNfaWZsYWcgJj0gfihCUktJTlR8SU5MQ1J8SUNSTkx8SVhPTnxJWE9GRnxJVUNMQ3xJWEFOWXxJTUFYQkVMKTsKKwkvL3Rlcm1idWYuY19vZmxhZyAmPSB+KE9QT1NUKTsgLSBubywgd2Ugc3RpbGwgd2FudCBcbiAtPiBcclxuCisJdGVybWJ1Zi5jX2xmbGFnICY9IH4oSVNJR3xJQ0FOT058RUNITyk7CisJdGVybWJ1Zi5jX2NjW1ZNSU5dID0gMTsKKwl0ZXJtYnVmLmNfY2NbVlRJTUVdID0gMDsKKwl0Y3NldGF0dHIoRy5rYmRfZmQsIFRDU0FOT1csICZ0ZXJtYnVmKTsKKworCXBvbGxfdGltZW91dF9tcyA9IDI1MDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwkJaW50IGJ5dGVzX3JlYWQ7CisJCWludCBpLCBqOworCQljaGFyICpkYXRhLCAqb2xkOworCisJCS8vIGluIHRoZSBmaXJzdCBsb29wIEcud2lkdGggPSBHLmhlaWdodCA9IDA6IHJlZnJlc2gKKwkJaSA9IEcud2lkdGg7CisJCWogPSBHLmhlaWdodDsKKwkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChHLmtiZF9mZCwgJkcud2lkdGgsICZHLmhlaWdodCk7CisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBRyhmKSkgeworCQkJaW50IG54ID0gRy5yZW1vdGUuY3Vyc29yX3ggLSBHLndpZHRoICsgMTsKKwkJCWludCBueSA9IEcucmVtb3RlLmN1cnNvcl95IC0gRy5oZWlnaHQgKyAxOworCisJCQlpZiAoRy5yZW1vdGUuY3Vyc29yX3ggPCBHLngpIHsKKwkJCQlHLnggPSBHLnJlbW90ZS5jdXJzb3JfeDsKKwkJCQlpID0gMDsgLy8gZm9yY2UgcmVmcmVzaAorCQkJfQorCQkJaWYgKG54ID4gRy54KSB7CisJCQkJRy54ID0gbng7CisJCQkJaSA9IDA7IC8vIGZvcmNlIHJlZnJlc2gKKwkJCX0KKwkJCWlmIChHLnJlbW90ZS5jdXJzb3JfeSA8IEcueSkgeworCQkJCUcueSA9IEcucmVtb3RlLmN1cnNvcl95OworCQkJCWkgPSAwOyAvLyBmb3JjZSByZWZyZXNoCisJCQl9CisJCQlpZiAobnkgPiBHLnkpIHsKKwkJCQlHLnkgPSBueTsKKwkJCQlpID0gMDsgLy8gZm9yY2UgcmVmcmVzaAorCQkJfQorCQl9CisKKwkJLy8gU2NhbiBjb25zb2xlIGRhdGEgYW5kIHJlZHJhdyBvdXIgdHR5IHdoZXJlIG5lZWRlZAorCQlvbGQgPSBHLmRhdGEgKyBHLmN1cnJlbnQ7CisJCUcuY3VycmVudCA9IEcuc2l6ZSAtIEcuY3VycmVudDsKKwkJZGF0YSA9IEcuZGF0YSArIEcuY3VycmVudDsKKwkJc2NyZWVuX3JlYWRfY2xvc2UoKTsKKwkJaWYgKGkgIT0gRy53aWR0aCB8fCBqICE9IEcuaGVpZ2h0KSB7CisJCQljbHJzY3IoKTsKKwkJCXNjcmVlbl9kdW1wKCk7CisJCX0gZWxzZSB7CisJCQkvLyBGb3IgZWFjaCByZW1vdGUgbGluZQorCQkJb2xkICs9IEcuZmlyc3RfbGluZV9vZmZzZXQ7CisJCQlkYXRhICs9IEcuZmlyc3RfbGluZV9vZmZzZXQ7CisJCQlmb3IgKGkgPSBHLnk7IGkgPCBHLnJlbW90ZS5saW5lczsgaSsrKSB7CisJCQkJY2hhciAqZmlyc3QgPSBOVUxMOyAvLyBmaXJzdCBjaGFyIHdoaWNoIG5lZWRzIHVwZGF0aW5nCisJCQkJY2hhciAqbGFzdCA9IGxhc3Q7ICAvLyBsYXN0IGNoYXIgd2hpY2ggbmVlZHMgdXBkYXRpbmcKKwkJCQl1bnNpZ25lZCBpeSA9IGkgLSBHLnk7CisKKwkJCQlpZiAoaXkgPj0gRy5oZWlnaHQpCisJCQkJCWJyZWFrOworCQkJCWZvciAoaiA9IDA7IGogPCBHLnJlbW90ZS5jb2xzOyBqKyssIE5FWFQob2xkKSwgTkVYVChkYXRhKSkgeworCQkJCQl1bnNpZ25lZCBqeCA9IGogLSBHLng7IC8vIGlmIHdpbGwgY2F0Y2ggaiA+PSBHLnggdG9vCisKKwkJCQkJaWYgKGp4IDwgRy53aWR0aCAmJiBEQVRBKGRhdGEpICE9IERBVEEob2xkKSkgeworCQkJCQkJbGFzdCA9IGRhdGE7CisJCQkJCQlpZiAoIWZpcnN0KSB7CisJCQkJCQkJZmlyc3QgPSBkYXRhOworCQkJCQkJCWdvdG94eShqeCwgaXkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChmaXJzdCkgeworCQkJCQkvLyBSZXdyaXRlIHVwZGF0ZWQgZGF0YSBvbiB0aGUgbG9jYWwgc2NyZWVuCisJCQkJCWZvciAoOyBmaXJzdCA8PSBsYXN0OyBORVhUKGZpcnN0KSkKKwkJCQkJCXNjcmVlbl9jaGFyKGZpcnN0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJY3VybW92ZSgpOworCisJCS8vIFdhaXQgZm9yIGxvY2FsIHVzZXIga2V5cHJlc3NlcworCQlmZmx1c2hfYWxsKCk7CisJCXBmZC5mZCA9IEcua2JkX2ZkOworCQlwZmQuZXZlbnRzID0gUE9MTElOOworCQlieXRlc19yZWFkID0gMDsKKwkJc3dpdGNoIChwb2xsKCZwZmQsIDEsIHBvbGxfdGltZW91dF9tcykpIHsKKwkJCWNoYXIgKms7CisJCWNhc2UgLTE6CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJY2xlYW51cCgxKTsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlpZiAoKytHLm5va2V5cyA+PSA0KQorCQkJCUcubm9rZXlzID0gRy5lc2NhcGVfY291bnQgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvLyBSZWFkIHRoZSBrZXlzIHByZXNzZWQKKwkJCWsgPSBrZXlidWYgKyBHLmtleV9jb3VudDsKKwkJCWJ5dGVzX3JlYWQgPSByZWFkKEcua2JkX2ZkLCBrLCBzaXplb2Yoa2V5YnVmKSAtIEcua2V5X2NvdW50KTsKKwkJCWlmIChieXRlc19yZWFkIDwgMCkKKwkJCQljbGVhbnVwKDEpOworCisJCQkvLyBEbyBleGl0IHByb2Nlc3NpbmcKKwkJCWZvciAoaSA9IDA7IGkgPCBieXRlc19yZWFkOyBpKyspIHsKKwkJCQlpZiAoa1tpXSAhPSAnXDAzMycpCisJCQkJCUcuZXNjYXBlX2NvdW50ID0gMDsKKwkJCQllbHNlIGlmICgrK0cuZXNjYXBlX2NvdW50ID49IDMpCisJCQkJCWNsZWFudXAoMCk7CisJCQl9CisJCX0KKwkJcG9sbF90aW1lb3V0X21zID0gMjUwOworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUcodikpIGNvbnRpbnVlOworCisJCS8vIEluc2VydCBhbGwga2V5cyBwcmVzc2VkIGludG8gdGhlIHZpcnR1YWwgY29uc29sZSdzIGlucHV0CisJCS8vIGJ1ZmZlci4gIERvbid0IGRvIHRoaXMgaWYgdGhlIHZpcnR1YWwgY29uc29sZSBpcyBpbiBzY2FuCisJCS8vIGNvZGUgbW9kZSAtIGdpdmluZyBBU0NJSSBjaGFyYWN0ZXJzIHRvIGEgcHJvZ3JhbSBleHBlY3RpbmcKKwkJLy8gc2NhbiBjb2RlcyB3aWxsIGNvbmZ1c2UgaXQuCisJCUcua2V5X2NvdW50ICs9IGJ5dGVzX3JlYWQ7CisJCWlmIChHLmVzY2FwZV9jb3VudCA9PSAwKSB7CisJCQlpbnQgaGFuZGxlLCByZXN1bHQ7CisJCQlsb25nIGtiZF9tb2RlOworCisJCQloYW5kbGUgPSB4b3Blbih0dHlfbmFtZSwgT19XUk9OTFkpOworCQkJcmVzdWx0ID0gaW9jdGwoaGFuZGxlLCBLREdLQk1PREUsICZrYmRfbW9kZSk7CisJCQlpZiAocmVzdWx0ID49IDApIHsKKwkJCQljaGFyICpwID0ga2V5YnVmOworCisJCQkJaWYgKGtiZF9tb2RlICE9IEtfWExBVEUgJiYga2JkX21vZGUgIT0gS19VTklDT0RFKSB7CisJCQkJCUcua2V5X2NvdW50ID0gMDsgLy8gc2NhbiBjb2RlIG1vZGUKKwkJCQl9CisJCQkJZm9yICg7IEcua2V5X2NvdW50ICE9IDA7IHArKywgRy5rZXlfY291bnQtLSkgeworCQkJCQlyZXN1bHQgPSBpb2N0bChoYW5kbGUsIFRJT0NTVEksIHApOworCQkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQkJbWVtbW92ZShrZXlidWYsIHAsIEcua2V5X2NvdW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIElmIHRoZXJlIGlzIGFuIGFwcGxpY2F0aW9uIG9uIGNvbnNvbGUgd2hpY2ggcmVhY3RzCisJCQkJCS8vIHRvIGtleXByZXNzZXMsIHdlIG5lZWQgdG8gbWFrZSBvdXIgZmlyc3Qgc2xlZXAKKwkJCQkJLy8gc2hvcnRlciB0byBxdWlja2x5IHJlZHJhdyB3aGF0ZXZlciBpdCBwcmludGVkIHRoZXJlLgorCQkJCQlwb2xsX3RpbWVvdXRfbXMgPSAyMDsKKwkJCQl9CisJCQl9CisJCQkvLyBDbG9zZSAmIHJlLW9wZW4gdHR5IGluIGNhc2UgdGhleSBoYXZlCisJCQkvLyBzd2FwcGVkIHZpcnR1YWwgY29uc29sZXMKKwkJCWNsb3NlKGhhbmRsZSk7CisKKwkJCS8vIFdlIHNvbWV0aW1lcyBnZXQgc3B1cmlvdXMgSU8gZXJyb3JzIG9uIHRoZSBUVFkKKwkJCS8vIGFzIHByb2dyYW1zIGNsb3NlIGFuZCByZS1vcGVuIGl0CisJCQlpZiAocmVzdWx0ID49IDApCisJCQkJRy5pb2Vycm9yX2NvdW50ID0gMDsKKwkJCWVsc2UgaWYgKGVycm5vICE9IEVJTyB8fCArK0cuaW9lcnJvcl9jb3VudCA+IDQpCisJCQkJY2xlYW51cCgxKTsKKwkJfQorCX0gLyogd2hpbGUgKDEpICovCit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvY3JvbmQuYyBiL21pc2N1dGlscy9jcm9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjczYzcKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvY3JvbmQuYwpAQCAtMCwwICsxLDk1NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY3JvbmQgLWRbI10gLWMgPGNyb25kaXI+IC1mIC1iCisgKgorICogcnVuIGFzIHJvb3QsIGJ1dCBOT1Qgc2V0dWlkIHJvb3QKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCBNYXR0aGV3IERpbGxvbiAoZGlsbG9uQGFwb2xsby53ZXN0Lm9pYy5jb20pCisgKiAodmVyc2lvbiAyLjMuMikKKyAqIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gKEMpIDIwMDIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjcm9uZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWZiUyAtbCBOICIgSUZfRkVBVFVSRV9DUk9ORF9EKCItZCBOICIpICItTCBMT0dGSUxFIC1jIERJUiIKKy8vdXNhZ2U6I2RlZmluZSBjcm9uZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktZglGb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktYglCYWNrZ3JvdW5kIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJTG9nIHRvIHN5c2xvZyAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1sCVNldCBsb2cgbGV2ZWwuIDAgaXMgdGhlIG1vc3QgdmVyYm9zZSwgZGVmYXVsdCA4IgorLy91c2FnZToJSUZfRkVBVFVSRV9DUk9ORF9EKAorLy91c2FnZTogICAgICJcbgktZAlTZXQgbG9nIGxldmVsLCBsb2cgdG8gc3RkZXJyIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTAlMb2cgdG8gZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV29ya2luZyBkaXIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvKiBnbGliYyBmcmVlcyBwcmV2aW91cyBzZXRlbnYnZWQgdmFsdWUgd2hlbiB3ZSBkbyBuZXh0IHNldGVudigpCisgKiBvZiB0aGUgc2FtZSB2YXJpYWJsZS4gdWNsaWJjIGRvZXMgbm90IGRvIHRoaXMhICovCisjaWYgKGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKSkgLyogfHwgT1RIRVJfU0FGRV9MSUJDLi4uICovCisjIGRlZmluZSBTRVRFTlZfTEVBS1MgMAorI2Vsc2UKKyMgZGVmaW5lIFNFVEVOVl9MRUFLUyAxCisjZW5kaWYKKworCisjZGVmaW5lIFRNUERJUiAgICAgICAgICBDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVIKKyNkZWZpbmUgQ1JPTlRBQlMgICAgICAgIENPTkZJR19GRUFUVVJFX0NST05EX0RJUiAiL2Nyb250YWJzIgorI2lmbmRlZiBTRU5ETUFJTAorIyBkZWZpbmUgU0VORE1BSUwgICAgICAgInNlbmRtYWlsIgorI2VuZGlmCisjaWZuZGVmIFNFTkRNQUlMX0FSR1MKKyMgZGVmaW5lIFNFTkRNQUlMX0FSR1MgICItdGkiCisjZW5kaWYKKyNpZm5kZWYgQ1JPTlVQREFURQorIyBkZWZpbmUgQ1JPTlVQREFURSAgICAgImNyb24udXBkYXRlIgorI2VuZGlmCisjaWZuZGVmIE1BWExJTkVTCisjIGRlZmluZSBNQVhMSU5FUyAgICAgICAyNTYgIC8qIG1heCBsaW5lcyBpbiBub24tcm9vdCBjcm9udGFicyAqLworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgQ3JvbkZpbGUgeworCXN0cnVjdCBDcm9uRmlsZSAqY2ZfbmV4dDsKKwlzdHJ1Y3QgQ3JvbkxpbmUgKmNmX2xpbmVzOworCWNoYXIgKmNmX3VzZXJuYW1lOworCXNtYWxsaW50IGNmX3dhbnRzX3N0YXJ0aW5nOyAgICAgLyogYm9vbDogb25lIG9yIG1vcmUgam9icyByZWFkeSAqLworCXNtYWxsaW50IGNmX2hhc19ydW5uaW5nOyAgICAgICAgLyogYm9vbDogb25lIG9yIG1vcmUgam9icyBydW5uaW5nICovCisJc21hbGxpbnQgY2ZfZGVsZXRlZDsgICAgICAgICAgICAvKiBtYXJrZWQgZm9yIGRlbGV0aW9uIChidXQgc3RpbGwgaGFzIHJ1bm5pbmcgam9icykgKi8KK30gQ3JvbkZpbGU7CisKK3R5cGVkZWYgc3RydWN0IENyb25MaW5lIHsKKwlzdHJ1Y3QgQ3JvbkxpbmUgKmNsX25leHQ7CisJY2hhciAqY2xfY21kOyAgICAgICAgICAgICAgICAgICAvKiBzaGVsbCBjb21tYW5kICovCisJcGlkX3QgY2xfcGlkOyAgICAgICAgICAgICAgICAgICAvKiA+MDpydW5uaW5nLCA8MDpuZWVkcyB0byBiZSBzdGFydGVkIGluIHRoaXMgbWludXRlLCAwOmRvcm1hbnQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJaW50IGNsX2VtcHR5X21haWxfc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIG1haWwgaGVhZGVyIG9ubHksIDAgaWYgbm8gbWFpbGZpbGUgKi8KKwljaGFyICpjbF9tYWlsdG87ICAgICAgICAgICAgICAgIC8qIHdob20gdG8gbWFpbCByZXN1bHRzLCBtYXkgYmUgTlVMTCAqLworI2VuZGlmCisJLyogb3JkZXJlZCBieSBzaXplLCBub3QgaW4gbmF0dXJhbCBvcmRlci4gbWFrZXMgY29kZSBzbWFsbGVyOiAqLworCWNoYXIgY2xfRG93WzddOyAgICAgICAgICAgICAgICAgLyogMC02LCBiZWdpbm5pbmcgc3VuZGF5ICovCisJY2hhciBjbF9Nb25zWzEyXTsgICAgICAgICAgICAgICAvKiAwLTExICovCisJY2hhciBjbF9IcnNbMjRdOyAgICAgICAgICAgICAgICAvKiAwLTIzICovCisJY2hhciBjbF9EYXlzWzMyXTsgICAgICAgICAgICAgICAvKiAxLTMxICovCisJY2hhciBjbF9NaW5zWzYwXTsgICAgICAgICAgICAgICAvKiAwLTU5ICovCit9IENyb25MaW5lOworCisKKyNkZWZpbmUgREFFTU9OX1VJRCAwCisKKworZW51bSB7CisJT1BUX2wgPSAoMSA8PCAwKSwKKwlPUFRfTCA9ICgxIDw8IDEpLAorCU9QVF9mID0gKDEgPDwgMiksCisJT1BUX2IgPSAoMSA8PCAzKSwKKwlPUFRfUyA9ICgxIDw8IDQpLAorCU9QVF9jID0gKDEgPDwgNSksCisJT1BUX2QgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX0NST05EX0QsCit9OworI2lmIEVOQUJMRV9GRUFUVVJFX0NST05EX0QKKyMgZGVmaW5lIERlYnVnT3B0IChvcHRpb25fbWFzazMyICYgT1BUX2QpCisjZWxzZQorIyBkZWZpbmUgRGVidWdPcHQgMAorI2VuZGlmCisKKworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIGxvZ19sZXZlbDsgLyogPSA4OyAqLworCXRpbWVfdCBjcm9udGFiX2Rpcl9tdGltZTsKKwljb25zdCBjaGFyICpsb2dfZmlsZW5hbWU7CisJY29uc3QgY2hhciAqY3JvbnRhYl9kaXJfbmFtZTsgLyogPSBDUk9OVEFCUzsgKi8KKwlDcm9uRmlsZSAqY3Jvbl9maWxlczsKKyNpZiBTRVRFTlZfTEVBS1MKKwljaGFyICplbnZfdmFyX3VzZXI7CisJY2hhciAqZW52X3Zhcl9ob21lOworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlHLmxvZ19sZXZlbCA9IDg7IFwKKwlHLmNyb250YWJfZGlyX25hbWUgPSBDUk9OVEFCUzsgXAorfSB3aGlsZSAoMCkKKworCisvKiAwIGlzIHRoZSBtb3N0IHZlcmJvc2UsIGRlZmF1bHQgOCAqLworI2RlZmluZSBMVkw1ICAiXHgwNSIKKyNkZWZpbmUgTFZMNyAgIlx4MDciCisjZGVmaW5lIExWTDggICJceDA4IgorI2RlZmluZSBXQVJOOSAiXHg0OSIKKyNkZWZpbmUgRElFOSAgIlx4YzkiCisvKiBsZXZlbCA+PSAyMCBpcyAiZXJyb3IiICovCisjZGVmaW5lIEVSUjIwICJceDE0IgorCitzdGF0aWMgdm9pZCBjcm9uZGxvZyhjb25zdCBjaGFyICpjdGwsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworc3RhdGljIHZvaWQgY3JvbmRsb2coY29uc3QgY2hhciAqY3RsLCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKwlpbnQgbGV2ZWwgPSAoY3RsWzBdICYgMHgxZik7CisKKwl2YV9zdGFydCh2YSwgY3RsKTsKKwlpZiAobGV2ZWwgPj0gKGludClHLmxvZ19sZXZlbCkgeworCQkvKiBEZWJ1ZyBtb2RlOiBhbGwgdG8gKG5vbi1yZWRpcmVjdGVkKSBzdGRlcnIsICovCisJCS8qIFN5c2xvZyBtb2RlOiBhbGwgdG8gc3lzbG9nIChsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0cpLCAqLworCQlpZiAoIURlYnVnT3B0ICYmIEcubG9nX2ZpbGVuYW1lKSB7CisJCQkvKiBPdGhlcndpc2UgKGxvZyB0byBmaWxlKTogd2UgcmVvcGVuIGxvZyBmaWxlIGF0IGV2ZXJ5IHdyaXRlOiAqLworCQkJaW50IGxvZ2ZkID0gb3Blbl9vcl93YXJuKEcubG9nX2ZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0FQUEVORCk7CisJCQlpZiAobG9nZmQgPj0gMCkKKwkJCQl4bW92ZV9mZChsb2dmZCwgU1RERVJSX0ZJTEVOTyk7CisJCX0KKwkJLyogV2hlbiB3ZSBsb2cgdG8gc3lzbG9nLCBsZXZlbCA+IDggaXMgbG9nZ2VkIGF0IExPR19FUlIKKwkJICogc3lzbG9nIGxldmVsLCBsZXZlbCA8PSA4IGlzIGxvZ2dlZCBhdCBMT0dfSU5GTy4gKi8KKwkJaWYgKGxldmVsID4gOCkgeworCQkJYmJfdmVycm9yX21zZyhjdGwgKyAxLCB2YSwgLyogc3RyZXJyOiAqLyBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKm1zZyA9IE5VTEw7CisJCQl2YXNwcmludGYoJm1zZywgY3RsICsgMSwgdmEpOworCQkJYmJfaW5mb19tc2coIiVzOiAlcyIsIGFwcGxldF9uYW1lLCBtc2cpOworCQkJZnJlZShtc2cpOworCQl9CisJfQorCXZhX2VuZCh2YSk7CisJaWYgKGN0bFswXSAmIDB4ODApCisJCWV4aXQoMjApOworfQorCitzdGF0aWMgY29uc3QgY2hhciBEb3dBcnlbXSBBTElHTjEgPQorCSJzdW4iIm1vbiIidHVlIiJ3ZWQiInRodSIiZnJpIiJzYXQiCisJLyogIlN1biIiTW9uIiJUdWUiIldlZCIiVGh1IiJGcmkiIlNhdCIgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgTW9uQXJ5W10gQUxJR04xID0KKwkiamFuIiJmZWIiIm1hciIiYXByIiJtYXkiImp1biIianVsIiJhdWciInNlcCIib2N0IiJub3YiImRlYyIKKwkvKiAiSmFuIiJGZWIiIk1hciIiQXByIiJNYXkiIkp1biIiSnVsIiJBdWciIlNlcCIiT2N0IiJOb3YiIkRlYyIgKi8KKzsKKworc3RhdGljIHZvaWQgUGFyc2VGaWVsZChjaGFyICp1c2VyLCBjaGFyICphcnksIGludCBtb2R2YWx1ZSwgaW50IG9mZiwKKwkJCQljb25zdCBjaGFyICpuYW1lcywgY2hhciAqcHRyKQorLyogJ25hbWVzJyBpcyBhIHBvaW50ZXIgdG8gYSBzZXQgb2YgMy1jaGFyIGFiYnJldmlhdGlvbnMgKi8KK3sKKwljaGFyICpiYXNlID0gcHRyOworCWludCBuMSA9IC0xOworCWludCBuMiA9IC0xOworCisJLy8gdGhpcyBjYW4ndCBoYXBwZW4gZHVlIHRvIGNvbmZpZ19yZWFkKCkKKwkvKmlmIChiYXNlID09IE5VTEwpCisJCXJldHVybjsqLworCisJd2hpbGUgKDEpIHsKKwkJaW50IHNraXAgPSAwOworCisJCS8qIEhhbmRsZSBudW1lcmljIGRpZ2l0IG9yIHN5bWJvbCBvciAnKicgKi8KKwkJaWYgKCpwdHIgPT0gJyonKSB7CisJCQluMSA9IDA7ICAvKiBldmVyeXRoaW5nIHdpbGwgYmUgZmlsbGVkICovCisJCQluMiA9IG1vZHZhbHVlIC0gMTsKKwkJCXNraXAgPSAxOworCQkJKytwdHI7CisJCX0gZWxzZSBpZiAoaXNkaWdpdCgqcHRyKSkgeworCQkJY2hhciAqZW5kcDsKKwkJCWlmIChuMSA8IDApIHsKKwkJCQluMSA9IHN0cnRvbChwdHIsICZlbmRwLCAxMCkgKyBvZmY7CisJCQl9IGVsc2UgeworCQkJCW4yID0gc3RydG9sKHB0ciwgJmVuZHAsIDEwKSArIG9mZjsKKwkJCX0KKwkJCXB0ciA9IGVuZHA7IC8qIGdjYyBsaWtlcyB0ZW1wIHZhciBmb3IgJmVuZHAgKi8KKwkJCXNraXAgPSAxOworCQl9IGVsc2UgaWYgKG5hbWVzKSB7CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgbmFtZXNbaV07IGkgKz0gMykgeworCQkJCS8qIHdhcyB1c2luZyBzdHJuY21wIGJlZm9yZS4uLiAqLworCQkJCWlmIChzdHJuY2FzZWNtcChwdHIsICZuYW1lc1tpXSwgMykgPT0gMCkgeworCQkJCQlwdHIgKz0gMzsKKwkJCQkJaWYgKG4xIDwgMCkgeworCQkJCQkJbjEgPSBpIC8gMzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW4yID0gaSAvIDM7CisJCQkJCX0KKwkJCQkJc2tpcCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIGhhbmRsZSBvcHRpb25hbCByYW5nZSAnLScgKi8KKwkJaWYgKHNraXAgPT0gMCkgeworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKCpwdHIgPT0gJy0nICYmIG4yIDwgMCkgeworCQkJKytwdHI7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIGNvbGxhcHNlIHNpbmdsZS12YWx1ZSByYW5nZXMsIGhhbmRsZSBza2lwbWFyaywgYW5kIGZpbGwKKwkJICogaW4gdGhlIGNoYXJhY3RlciBhcnJheSBhcHByb3ByaWF0ZWx5LgorCQkgKi8KKwkJaWYgKG4yIDwgMCkgeworCQkJbjIgPSBuMTsKKwkJfQorCQlpZiAoKnB0ciA9PSAnLycpIHsKKwkJCWNoYXIgKmVuZHA7CisJCQlza2lwID0gc3RydG9sKHB0ciArIDEsICZlbmRwLCAxMCk7CisJCQlwdHIgPSBlbmRwOyAvKiBnY2MgbGlrZXMgdGVtcCB2YXIgZm9yICZlbmRwICovCisJCX0KKworCQkvKgorCQkgKiBmaWxsIGFycmF5LCB1c2luZyBhIGZhaWxzYWZlIGlzIHRoZSBlYXNpZXN0IHdheSB0byBwcmV2ZW50CisJCSAqIGFuIGVuZGxlc3MgbG9vcAorCQkgKi8KKwkJeworCQkJaW50IHMwID0gMTsKKwkJCWludCBmYWlsc2FmZSA9IDEwMjQ7CisKKwkJCS0tbjE7CisJCQlkbyB7CisJCQkJbjEgPSAobjEgKyAxKSAlIG1vZHZhbHVlOworCisJCQkJaWYgKC0tczAgPT0gMCkgeworCQkJCQlhcnlbbjEgJSBtb2R2YWx1ZV0gPSAxOworCQkJCQlzMCA9IHNraXA7CisJCQkJfQorCQkJCWlmICgtLWZhaWxzYWZlID09IDApIHsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfSB3aGlsZSAobjEgIT0gbjIpOworCQl9CisJCWlmICgqcHRyICE9ICcsJykgeworCQkJYnJlYWs7CisJCX0KKwkJKytwdHI7CisJCW4xID0gLTE7CisJCW4yID0gLTE7CisJfQorCisJaWYgKCpwdHIpIHsKKyBlcnI6CisJCWNyb25kbG9nKFdBUk45ICJ1c2VyICVzOiBwYXJzZSBlcnJvciBhdCAlcyIsIHVzZXIsIGJhc2UpOworCQlyZXR1cm47CisJfQorCisJaWYgKERlYnVnT3B0ICYmIChHLmxvZ19sZXZlbCA8PSA1KSkgeyAvKiBsaWtlIExWTDUgKi8KKwkJLyogY2FuJ3QgdXNlIGNyb25kbG9nLCBpdCBpbnNlcnRzICdcbicgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBtb2R2YWx1ZTsgKytpKQorCQkJZnByaW50ZihzdGRlcnIsICIlZCIsICh1bnNpZ25lZCBjaGFyKWFyeVtpXSk7CisJCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgRml4RGF5RG93KENyb25MaW5lICpsaW5lKQoreworCXVuc2lnbmVkIGk7CisJaW50IHdlZWtVc2VkID0gMDsKKwlpbnQgZGF5c1VzZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGluZS0+Y2xfRG93KTsgKytpKSB7CisJCWlmIChsaW5lLT5jbF9Eb3dbaV0gPT0gMCkgeworCQkJd2Vla1VzZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGluZS0+Y2xfRGF5cyk7ICsraSkgeworCQlpZiAobGluZS0+Y2xfRGF5c1tpXSA9PSAwKSB7CisJCQlkYXlzVXNlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAod2Vla1VzZWQgIT0gZGF5c1VzZWQpIHsKKwkJaWYgKHdlZWtVc2VkKQorCQkJbWVtc2V0KGxpbmUtPmNsX0RheXMsIDAsIHNpemVvZihsaW5lLT5jbF9EYXlzKSk7CisJCWVsc2UgLyogZGF5c1VzZWQgKi8KKwkJCW1lbXNldChsaW5lLT5jbF9Eb3csIDAsIHNpemVvZihsaW5lLT5jbF9Eb3cpKTsKKwl9Cit9CisKKy8qCisgKiBkZWxldGVfY3JvbmZpbGUoKSAtIGRlbGV0ZSB1c2VyIGRhdGFiYXNlCisgKgorICogTm90ZTogbXVsdGlwbGUgZW50cmllcyBmb3Igc2FtZSB1c2VyIG1heSBleGlzdCBpZiB3ZSB3ZXJlIHVuYWJsZSB0bworICogY29tcGxldGVseSBkZWxldGUgYSBkYXRhYmFzZSBkdWUgdG8gcnVubmluZyBwcm9jZXNzZXMuCisgKi8KKy8vRklYTUU6IHdlIHdpbGwgc3RhcnQgYSBuZXcgam9iIGV2ZW4gaWYgdGhlIG9sZCBqb2IgaXMgcnVubmluZworLy9pZiBjcm9udGFiIHdhcyByZWxvYWRlZDogY3JvbmQgdGhpbmtzIHRoYXQgIm5ldyIgam9iIGlzIGRpZmZlcmVudCBmcm9tICJvbGQiCisvL2V2ZW4gaWYgdGhleSBhcmUgaW4gZmFjdCBjb21wbGV0ZWx5IHRoZSBzYW1lLiBFeGFtcGxlCisvL0Nyb250YWIgd2FzOgorLy8gMC01OSAqICogKiAqIGpvYjEKKy8vIDAtNTkgKiAqICogKiBsb25nX3J1bm5pbmdfam9iMgorLy9Vc2VyIGVkaXRzIGNyb250YWIgdG86CisvLyAwLTU5ICogKiAqICogam9iMV91cGRhdGVkCisvLyAwLTU5ICogKiAqICogbG9uZ19ydW5uaW5nX2pvYjIKKy8vQnVnOiBjcm9uZCBjYW4gbm93IHN0YXJ0IGFub3RoZXIgbG9uZ19ydW5uaW5nX2pvYjIgZXZlbiBpZiBvbGQgb25lCisvL2lzIHN0aWxsIHJ1bm5pbmcuCisvL09UT0ggbW9zdCBvdGhlciB2ZXJzaW9ucyBvZiBjcm9uIGRvIG5vdCB3YWl0IGZvciBqb2IgdGVybWluYXRpb24gYW55d2F5LAorLy90aGV5IGVuZCB1cCB3aXRoIG11bHRpcGxlIGNvcGllcyBvZiBqb2JzIGlmIHRoZXkgZG9uJ3QgdGVybWluYXRlIHNvb24gZW5vdWdoLgorc3RhdGljIHZvaWQgZGVsZXRlX2Nyb25maWxlKGNvbnN0IGNoYXIgKnVzZXJOYW1lKQoreworCUNyb25GaWxlICoqcGZpbGUgPSAmRy5jcm9uX2ZpbGVzOworCUNyb25GaWxlICpmaWxlOworCisJd2hpbGUgKChmaWxlID0gKnBmaWxlKSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAodXNlck5hbWUsIGZpbGUtPmNmX3VzZXJuYW1lKSA9PSAwKSB7CisJCQlDcm9uTGluZSAqKnBsaW5lID0gJmZpbGUtPmNmX2xpbmVzOworCQkJQ3JvbkxpbmUgKmxpbmU7CisKKwkJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMDsKKwkJCWZpbGUtPmNmX2RlbGV0ZWQgPSAxOworCisJCQl3aGlsZSAoKGxpbmUgPSAqcGxpbmUpICE9IE5VTEwpIHsKKwkJCQlpZiAobGluZS0+Y2xfcGlkID4gMCkgeworCQkJCQlmaWxlLT5jZl9oYXNfcnVubmluZyA9IDE7CisJCQkJCXBsaW5lID0gJmxpbmUtPmNsX25leHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJKnBsaW5lID0gbGluZS0+Y2xfbmV4dDsKKwkJCQkJZnJlZShsaW5lLT5jbF9jbWQpOworCQkJCQlmcmVlKGxpbmUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmaWxlLT5jZl9oYXNfcnVubmluZyA9PSAwKSB7CisJCQkJKnBmaWxlID0gZmlsZS0+Y2ZfbmV4dDsKKwkJCQlmcmVlKGZpbGUtPmNmX3VzZXJuYW1lKTsKKwkJCQlmcmVlKGZpbGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXBmaWxlID0gJmZpbGUtPmNmX25leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2FkX2Nyb250YWIoY29uc3QgY2hhciAqZmlsZU5hbWUpCit7CisJc3RydWN0IHBhcnNlcl90ICpwYXJzZXI7CisJc3RydWN0IHN0YXQgc2J1ZjsKKwlpbnQgbWF4TGluZXM7CisJY2hhciAqdG9rZW5zWzZdOworI2lmIEVOQUJMRV9GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwKKwljaGFyICptYWlsVG8gPSBOVUxMOworI2VuZGlmCisKKwlkZWxldGVfY3JvbmZpbGUoZmlsZU5hbWUpOworCisJaWYgKCFnZXRwd25hbShmaWxlTmFtZSkpIHsKKwkJY3JvbmRsb2coTFZMNyAiaWdub3JpbmcgZmlsZSAnJXMnIChubyBzdWNoIHVzZXIpIiwgZmlsZU5hbWUpOworCQlyZXR1cm47CisJfQorCisJcGFyc2VyID0gY29uZmlnX29wZW4oZmlsZU5hbWUpOworCWlmICghcGFyc2VyKQorCQlyZXR1cm47CisKKwltYXhMaW5lcyA9IChzdHJjbXAoZmlsZU5hbWUsICJyb290IikgPT0gMCkgPyA2NTUzNSA6IE1BWExJTkVTOworCisJaWYgKGZzdGF0KGZpbGVubyhwYXJzZXItPmZwKSwgJnNidWYpID09IDAgJiYgc2J1Zi5zdF91aWQgPT0gREFFTU9OX1VJRCkgeworCQlDcm9uRmlsZSAqZmlsZSA9IHh6YWxsb2Moc2l6ZW9mKENyb25GaWxlKSk7CisJCUNyb25MaW5lICoqcGxpbmU7CisJCWludCBuOworCisJCWZpbGUtPmNmX3VzZXJuYW1lID0geHN0cmR1cChmaWxlTmFtZSk7CisJCXBsaW5lID0gJmZpbGUtPmNmX2xpbmVzOworCisJCXdoaWxlICgxKSB7CisJCQlDcm9uTGluZSAqbGluZTsKKworCQkJaWYgKCEtLW1heExpbmVzKQorCQkJCWJyZWFrOworCQkJbiA9IGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCA2LCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCB8IFBBUlNFX0tFRVBfQ09QWSk7CisJCQlpZiAoIW4pCisJCQkJYnJlYWs7CisKKwkJCWlmIChEZWJ1Z09wdCkKKwkJCQljcm9uZGxvZyhMVkw1ICJ1c2VyOiVzIGVudHJ5OiVzIiwgZmlsZU5hbWUsIHBhcnNlci0+ZGF0YSk7CisKKwkJCS8qIGNoZWNrIGlmIGxpbmUgaXMgc2V0dGluZyBNQUlMVE89ICovCisJCQlpZiAoMCA9PSBzdHJuY21wKHRva2Vuc1swXSwgIk1BSUxUTz0iLCA3KSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwKKwkJCQlmcmVlKG1haWxUbyk7CisJCQkJbWFpbFRvID0gKHRva2Vuc1swXVs3XSkgPyB4c3RyZHVwKCZ0b2tlbnNbMF1bN10pIDogTlVMTDsKKyNlbmRpZiAvKiBvdGhlcndpc2UganVzdCBpZ25vcmUgc3VjaCBsaW5lcyAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogY2hlY2sgaWYgYSBtaW5pbXVtIG9mIHRva2VucyBpcyBzcGVjaWZpZWQgKi8KKwkJCWlmIChuIDwgNikKKwkJCQljb250aW51ZTsKKwkJCSpwbGluZSA9IGxpbmUgPSB4emFsbG9jKHNpemVvZigqbGluZSkpOworCQkJLyogcGFyc2UgZGF0ZSByYW5nZXMgKi8KKwkJCVBhcnNlRmllbGQoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX01pbnMsIDYwLCAwLCBOVUxMLCB0b2tlbnNbMF0pOworCQkJUGFyc2VGaWVsZChmaWxlLT5jZl91c2VybmFtZSwgbGluZS0+Y2xfSHJzLCAyNCwgMCwgTlVMTCwgdG9rZW5zWzFdKTsKKwkJCVBhcnNlRmllbGQoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX0RheXMsIDMyLCAwLCBOVUxMLCB0b2tlbnNbMl0pOworCQkJUGFyc2VGaWVsZChmaWxlLT5jZl91c2VybmFtZSwgbGluZS0+Y2xfTW9ucywgMTIsIC0xLCBNb25BcnksIHRva2Vuc1szXSk7CisJCQlQYXJzZUZpZWxkKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lLT5jbF9Eb3csIDcsIDAsIERvd0FyeSwgdG9rZW5zWzRdKTsKKwkJCS8qCisJCQkgKiBmaXggZGF5cyBhbmQgZG93IC0gaWYgb25lIGlzIG5vdCAiKiIgYW5kIHRoZSBvdGhlcgorCQkJICogaXMgIioiLCB0aGUgb3RoZXIgaXMgc2V0IHRvIDAsIGFuZCB2aXNlLXZlcnNhCisJCQkgKi8KKwkJCUZpeERheURvdyhsaW5lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJCQkvKiBjb3B5IG1haWx0byAoY2FuIGJlIE5VTEwpICovCisJCQlsaW5lLT5jbF9tYWlsdG8gPSB4c3RyZHVwKG1haWxUbyk7CisjZW5kaWYKKwkJCS8qIGNvcHkgY29tbWFuZCAqLworCQkJbGluZS0+Y2xfY21kID0geHN0cmR1cCh0b2tlbnNbNV0pOworCQkJaWYgKERlYnVnT3B0KSB7CisJCQkJY3JvbmRsb2coTFZMNSAiIGNvbW1hbmQ6JXMiLCB0b2tlbnNbNV0pOworCQkJfQorCQkJcGxpbmUgPSAmbGluZS0+Y2xfbmV4dDsKKy8vYmJfZXJyb3JfbXNnKCJNWyVzXUZbJXNdWyVzXVslc11bJXNdWyVzXVslc10iLCBtYWlsVG8sIHRva2Vuc1swXSwgdG9rZW5zWzFdLCB0b2tlbnNbMl0sIHRva2Vuc1szXSwgdG9rZW5zWzRdLCB0b2tlbnNbNV0pOworCQl9CisJCSpwbGluZSA9IE5VTEw7CisKKwkJZmlsZS0+Y2ZfbmV4dCA9IEcuY3Jvbl9maWxlczsKKwkJRy5jcm9uX2ZpbGVzID0gZmlsZTsKKworCQlpZiAobWF4TGluZXMgPT0gMCkgeworCQkJY3JvbmRsb2coV0FSTjkgInVzZXIgJXM6IHRvbyBtYW55IGxpbmVzIiwgZmlsZU5hbWUpOworCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2Nyb25fdXBkYXRlX2ZpbGUodm9pZCkKK3sKKwlGSUxFICpmaTsKKwljaGFyIGJ1ZlsyNTZdOworCisJZmkgPSBmb3Blbl9mb3JfcmVhZChDUk9OVVBEQVRFKTsKKwlpZiAoZmkgIT0gTlVMTCkgeworCQl1bmxpbmsoQ1JPTlVQREFURSk7CisJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmaSkgIT0gTlVMTCkgeworCQkJLyogdXNlIGZpcnN0IHdvcmQgb25seSAqLworCQkJc2tpcF9ub25fd2hpdGVzcGFjZShidWYpWzBdID0gJ1wwJzsKKwkJCWxvYWRfY3JvbnRhYihidWYpOworCQl9CisJCWZjbG9zZShmaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByZXNjYW5fY3JvbnRhYl9kaXIodm9pZCkKK3sKKwlDcm9uRmlsZSAqZmlsZTsKKworCS8qIERlbGV0ZSBhbGwgZmlsZXMgdW50aWwgd2Ugb25seSBoYXZlIG9uZXMgd2l0aCBydW5uaW5nIGpvYnMgKG9yIG5vbmUpICovCisgYWdhaW46CisJZm9yIChmaWxlID0gRy5jcm9uX2ZpbGVzOyBmaWxlOyBmaWxlID0gZmlsZS0+Y2ZfbmV4dCkgeworCQlpZiAoIWZpbGUtPmNmX2RlbGV0ZWQpIHsKKwkJCWRlbGV0ZV9jcm9uZmlsZShmaWxlLT5jZl91c2VybmFtZSk7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJLyogUmVtb3ZlIGNyb24gdXBkYXRlIGZpbGUgKi8KKwl1bmxpbmsoQ1JPTlVQREFURSk7CisJLyogUmUtY2hkaXIsIGluIGNhc2UgZGlyZWN0b3J5IHdhcyByZW5hbWVkICYgZGVsZXRlZCAqLworCWlmIChjaGRpcihHLmNyb250YWJfZGlyX25hbWUpIDwgMCkgeworCQljcm9uZGxvZyhESUU5ICJjaGRpciglcykiLCBHLmNyb250YWJfZGlyX25hbWUpOworCX0KKworCS8qIFNjYW4gZGlyZWN0b3J5IGFuZCBhZGQgYXNzb2NpYXRlZCB1c2VycyAqLworCXsKKwkJRElSICpkaXIgPSBvcGVuZGlyKCIuIik7CisJCXN0cnVjdCBkaXJlbnQgKmRlbjsKKworCQlpZiAoIWRpcikKKwkJCWNyb25kbG9nKERJRTkgImNoZGlyKCVzKSIsICIuIik7IC8qIGV4aXRzICovCisJCXdoaWxlICgoZGVuID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQlpZiAoc3RyY2hyKGRlbi0+ZF9uYW1lLCAnLicpICE9IE5VTEwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWxvYWRfY3JvbnRhYihkZW4tPmRfbmFtZSk7CisJCX0KKwkJY2xvc2VkaXIoZGlyKTsKKwl9Cit9CisKKyNpZiBTRVRFTlZfTEVBS1MKKy8qIFdlIHNldCBlbnZpcm9ubWVudCAqYmVmb3JlKiB2Zm9yayAoYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSB2Zm9yayksCisgKiBzbyB3ZSBjYW5ub3QgdXNlIHNldGVudigpIC0gcmVwZWF0ZWQgY2FsbHMgdG8gc2V0ZW52KCkgbWF5IGxlYWsgbWVtb3J5IQorICogVXNpbmcgcHV0ZW52KCksIGFuZCBmcmVlaW5nIG1lbW9yeSBhZnRlciB1bnNldGVudigpIHdvbid0IGxlYWsgKi8KK3N0YXRpYyB2b2lkIHNhZmVfc2V0ZW52KGNoYXIgKipwdmFyX3ZhbCwgY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWwpCit7CisJY2hhciAqdmFyX3ZhbCA9ICpwdmFyX3ZhbDsKKworCWlmICh2YXJfdmFsKSB7CisJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKHZhcl92YWwpOworCX0KKwkqcHZhcl92YWwgPSB4YXNwcmludGYoIiVzPSVzIiwgdmFyLCB2YWwpOworCXB1dGVudigqcHZhcl92YWwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldF9lbnZfdmFycyhzdHJ1Y3QgcGFzc3dkICpwYXMpCit7CisjaWYgU0VURU5WX0xFQUtTCisJc2FmZV9zZXRlbnYoJkcuZW52X3Zhcl91c2VyLCAiVVNFUiIsIHBhcy0+cHdfbmFtZSk7CisJc2FmZV9zZXRlbnYoJkcuZW52X3Zhcl9ob21lLCAiSE9NRSIsIHBhcy0+cHdfZGlyKTsKKwkvKiBpZiB3ZSB3YW50IHRvIHNldCB1c2VyJ3Mgc2hlbGwgaW5zdGVhZDogKi8KKwkvKnNhZmVfc2V0ZW52KEcuZW52X3Zhcl9zaGVsbCwgIlNIRUxMIiwgcGFzLT5wd19zaGVsbCk7Ki8KKyNlbHNlCisJeHNldGVudigiVVNFUiIsIHBhcy0+cHdfbmFtZSk7CisJeHNldGVudigiSE9NRSIsIHBhcy0+cHdfZGlyKTsKKyNlbmRpZgorCS8qIGN1cnJlbnRseSwgd2UgdXNlIGNvbnN0YW50IG9uZTogKi8KKwkvKnNldGVudigiU0hFTEwiLCBERUZBVUxUX1NIRUxMLCAxKTsgLSBkb25lIGVhcmxpZXIgKi8KK30KKworc3RhdGljIHZvaWQgY2hhbmdlX3VzZXIoc3RydWN0IHBhc3N3ZCAqcGFzKQoreworCS8qIGNhcmVmdWw6IHdlJ3JlIGFmdGVyIHZmb3JrISAqLworCWNoYW5nZV9pZGVudGl0eShwYXMpOyAvKiAtIGluaXRncm91cHMsIHNldGdpZCwgc2V0dWlkICovCisJaWYgKGNoZGlyKHBhcy0+cHdfZGlyKSA8IDApIHsKKwkJY3JvbmRsb2coV0FSTjkgImNoZGlyKCVzKSIsIHBhcy0+cHdfZGlyKTsKKwkJaWYgKGNoZGlyKFRNUERJUikgPCAwKSB7CisJCQljcm9uZGxvZyhESUU5ICJjaGRpciglcykiLCBUTVBESVIpOyAvKiBleGl0cyAqLworCQl9CisJfQorfQorCisvLyBUT0RPOiBzZW5kbWFpbCBzaG91bGQgYmUgX3J1bi10aW1lXyBvcHRpb24sIG5vdCBjb21waWxlLXRpbWUhCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTAorCitzdGF0aWMgcGlkX3QKK2Zvcmtfam9iKGNvbnN0IGNoYXIgKnVzZXIsIGludCBtYWlsRmQsCisJCWNvbnN0IGNoYXIgKnByb2csCisJCWNvbnN0IGNoYXIgKnNoZWxsX2NtZCAvKiBpZiBOVUxMLCB3ZSBydW4gc2VuZG1haWwgKi8KKykgeworCXN0cnVjdCBwYXNzd2QgKnBhczsKKwlwaWRfdCBwaWQ7CisKKwkvKiBwcmVwYXJlIHRoaW5ncyBiZWZvcmUgdmZvcmsgKi8KKwlwYXMgPSBnZXRwd25hbSh1c2VyKTsKKwlpZiAoIXBhcykgeworCQljcm9uZGxvZyhXQVJOOSAiY2FuJ3QgZ2V0IHVpZCBmb3IgJXMiLCB1c2VyKTsKKwkJZ290byBlcnI7CisJfQorCXNldF9lbnZfdmFycyhwYXMpOworCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ0hJTEQgKi8KKwkJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQsIGFuZCBjaGRpciB0byBob21lIG9yIFRNUERJUiAqLworCQljaGFuZ2VfdXNlcihwYXMpOworCQlpZiAoRGVidWdPcHQpIHsKKwkJCWNyb25kbG9nKExWTDUgImNoaWxkIHJ1bm5pbmcgJXMiLCBwcm9nKTsKKwkJfQorCQlpZiAobWFpbEZkID49IDApIHsKKwkJCXhtb3ZlX2ZkKG1haWxGZCwgc2hlbGxfY21kID8gMSA6IDApOworCQkJZHVwMigxLCAyKTsKKwkJfQorCQkvKiBjcm9uZCAzLjBwbDEtMTAwIHB1dHMgdGFza3MgaW4gc2VwYXJhdGUgcHJvY2VzcyBncm91cHMgKi8KKwkJYmJfc2V0cGdycCgpOworCQlleGVjbHAocHJvZywgcHJvZywgKHNoZWxsX2NtZCA/ICItYyIgOiBTRU5ETUFJTF9BUkdTKSwgc2hlbGxfY21kLCAoY2hhciAqKSBOVUxMKTsKKwkJY3JvbmRsb2coRVJSMjAgImNhbid0IGV4ZWN1dGUgJyVzJyBmb3IgdXNlciAlcyIsIHByb2csIHVzZXIpOworCQlpZiAoc2hlbGxfY21kKSB7CisJCQlmZHByaW50ZigxLCAiRXhlYyBmYWlsZWQ6ICVzIC1jICVzXG4iLCBwcm9nLCBzaGVsbF9jbWQpOworCQl9CisJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisJaWYgKHBpZCA8IDApIHsKKwkJLyogRk9SSyBGQUlMRUQgKi8KKwkJY3JvbmRsb2coRVJSMjAgImNhbid0IHZmb3JrIik7CisgZXJyOgorCQlwaWQgPSAwOworCX0gLyogZWxzZTogUEFSRU5ULCBGT1JLIFNVQ0NFU1MgKi8KKworCS8qCisJICogQ2xvc2UgdGhlIG1haWwgZmlsZSBkZXNjcmlwdG9yLi4gd2UgY2FuJ3QganVzdCBsZWF2ZSBpdCBvcGVuIGluCisJICogYSBzdHJ1Y3R1cmUsIGNsb3NpbmcgaXQgbGF0ZXIsIGJlY2F1c2Ugd2UgbWlnaHQgcnVuIG91dCBvZiBkZXNjcmlwdG9ycworCSAqLworCWlmIChtYWlsRmQgPj0gMCkgeworCQljbG9zZShtYWlsRmQpOworCX0KKwlyZXR1cm4gcGlkOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9vbmVfam9iKGNvbnN0IGNoYXIgKnVzZXIsIENyb25MaW5lICpsaW5lKQoreworCWNoYXIgbWFpbEZpbGVbMTI4XTsKKwlpbnQgbWFpbEZkID0gLTE7CisKKwlsaW5lLT5jbF9waWQgPSAwOworCWxpbmUtPmNsX2VtcHR5X21haWxfc2l6ZSA9IDA7CisKKwlpZiAobGluZS0+Y2xfbWFpbHRvKSB7CisJCS8qIE9wZW4gbWFpbCBmaWxlIChvd25lciBpcyByb290IHNvIG5vYm9keSBjYW4gc2NyZXcgd2l0aCBpdCkgKi8KKwkJc25wcmludGYobWFpbEZpbGUsIHNpemVvZihtYWlsRmlsZSksICIlcy9jcm9uLiVzLiVkIiwgVE1QRElSLCB1c2VyLCBnZXRwaWQoKSk7CisJCW1haWxGZCA9IG9wZW4obWFpbEZpbGUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFkgfCBPX0VYQ0wgfCBPX0FQUEVORCwgMDYwMCk7CisKKwkJaWYgKG1haWxGZCA+PSAwKSB7CisJCQlmZHByaW50ZihtYWlsRmQsICJUbzogJXNcblN1YmplY3Q6IGNyb246ICVzXG5cbiIsIGxpbmUtPmNsX21haWx0bywKKwkJCQlsaW5lLT5jbF9jbWQpOworCQkJbGluZS0+Y2xfZW1wdHlfbWFpbF9zaXplID0gbHNlZWsobWFpbEZkLCAwLCBTRUVLX0NVUik7CisJCX0gZWxzZSB7CisJCQljcm9uZGxvZyhFUlIyMCAiY2FuJ3QgY3JlYXRlIG1haWwgZmlsZSAlcyBmb3IgdXNlciAlcywgIgorCQkJCQkiZGlzY2FyZGluZyBvdXRwdXQiLCBtYWlsRmlsZSwgdXNlcik7CisJCX0KKwl9CisKKwlsaW5lLT5jbF9waWQgPSBmb3JrX2pvYih1c2VyLCBtYWlsRmQsIERFRkFVTFRfU0hFTEwsIGxpbmUtPmNsX2NtZCk7CisJaWYgKG1haWxGZCA+PSAwKSB7CisJCWlmIChsaW5lLT5jbF9waWQgPD0gMCkgeworCQkJdW5saW5rKG1haWxGaWxlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlbmFtZSBtYWlsLWZpbGUgYmFzZWQgb24gcGlkIG9mIHByb2Nlc3MgKi8KKwkJCWNoYXIgKm1haWxGaWxlMiA9IHhhc3ByaW50ZigiJXMvY3Jvbi4lcy4lZCIsIFRNUERJUiwgdXNlciwgKGludClsaW5lLT5jbF9waWQpOworCQkJcmVuYW1lKG1haWxGaWxlLCBtYWlsRmlsZTIpOyAvLyBUT0RPOiB4cmVuYW1lPworCQkJZnJlZShtYWlsRmlsZTIpOworCQl9CisJfQorfQorCisvKgorICogcHJvY2Vzc19maW5pc2hlZF9qb2IgLSBjYWxsZWQgd2hlbiBqb2IgdGVybWluYXRlcyBhbmQgd2hlbiBtYWlsIHRlcm1pbmF0ZXMKKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19maW5pc2hlZF9qb2IoY29uc3QgY2hhciAqdXNlciwgQ3JvbkxpbmUgKmxpbmUpCit7CisJcGlkX3QgcGlkOworCWludCBtYWlsRmQ7CisJY2hhciBtYWlsRmlsZVsxMjhdOworCXN0cnVjdCBzdGF0IHNidWY7CisKKwlwaWQgPSBsaW5lLT5jbF9waWQ7CisJbGluZS0+Y2xfcGlkID0gMDsKKwlpZiAocGlkIDw9IDApIHsKKwkJLyogTm8gam9iICovCisJCXJldHVybjsKKwl9CisJaWYgKGxpbmUtPmNsX2VtcHR5X21haWxfc2l6ZSA8PSAwKSB7CisJCS8qIEVuZCBvZiBqb2IgYW5kIG5vIG1haWwgZmlsZSwgb3IgZW5kIG9mIHNlbmRtYWlsIGpvYiAqLworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBFbmQgb2YgcHJpbWFyeSBqb2IgLSBjaGVjayBmb3IgbWFpbCBmaWxlLgorCSAqIElmIHNpemUgaGFzIGNoYW5nZWQgYW5kIHRoZSBmaWxlIGlzIHN0aWxsIHZhbGlkLCB3ZSBzZW5kIGl0LgorCSAqLworCXNucHJpbnRmKG1haWxGaWxlLCBzaXplb2YobWFpbEZpbGUpLCAiJXMvY3Jvbi4lcy4lZCIsIFRNUERJUiwgdXNlciwgKGludClwaWQpOworCW1haWxGZCA9IG9wZW4obWFpbEZpbGUsIE9fUkRPTkxZKTsKKwl1bmxpbmsobWFpbEZpbGUpOworCWlmIChtYWlsRmQgPCAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZnN0YXQobWFpbEZkLCAmc2J1ZikgPCAwCisJIHx8IHNidWYuc3RfdWlkICE9IERBRU1PTl9VSUQKKwkgfHwgc2J1Zi5zdF9ubGluayAhPSAwCisJIHx8IHNidWYuc3Rfc2l6ZSA9PSBsaW5lLT5jbF9lbXB0eV9tYWlsX3NpemUKKwkgfHwgIVNfSVNSRUcoc2J1Zi5zdF9tb2RlKQorCSkgeworCQljbG9zZShtYWlsRmQpOworCQlyZXR1cm47CisJfQorCWxpbmUtPmNsX2VtcHR5X21haWxfc2l6ZSA9IDA7CisJLyogaWYgKGxpbmUtPmNsX21haWx0bykgLSBhbHdheXMgdHJ1ZSBpZiBjbF9lbXB0eV9tYWlsX3NpemUgd2FzIG5vbnplcm8gKi8KKwkJbGluZS0+Y2xfcGlkID0gZm9ya19qb2IodXNlciwgbWFpbEZkLCBTRU5ETUFJTCwgTlVMTCk7Cit9CisKKyNlbHNlIC8qICFFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMICovCisKK3N0YXRpYyB2b2lkIHN0YXJ0X29uZV9qb2IoY29uc3QgY2hhciAqdXNlciwgQ3JvbkxpbmUgKmxpbmUpCit7CisJc3RydWN0IHBhc3N3ZCAqcGFzOworCXBpZF90IHBpZDsKKworCXBhcyA9IGdldHB3bmFtKHVzZXIpOworCWlmICghcGFzKSB7CisJCWNyb25kbG9nKFdBUk45ICJjYW4ndCBnZXQgdWlkIGZvciAlcyIsIHVzZXIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBQcmVwYXJlIHRoaW5ncyBiZWZvcmUgdmZvcmsgKi8KKwlzZXRfZW52X3ZhcnMocGFzKTsKKworCS8qIEZvcmsgYXMgdGhlIHVzZXIgaW4gcXVlc3Rpb24gYW5kIHJ1biBwcm9ncmFtICovCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ0hJTEQgKi8KKwkJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQsIGFuZCBjaGRpciB0byBob21lIG9yIFRNUERJUiAqLworCQljaGFuZ2VfdXNlcihwYXMpOworCQlpZiAoRGVidWdPcHQpIHsKKwkJCWNyb25kbG9nKExWTDUgImNoaWxkIHJ1bm5pbmcgJXMiLCBERUZBVUxUX1NIRUxMKTsKKwkJfQorCQkvKiBjcm9uZCAzLjBwbDEtMTAwIHB1dHMgdGFza3MgaW4gc2VwYXJhdGUgcHJvY2VzcyBncm91cHMgKi8KKwkJYmJfc2V0cGdycCgpOworCQlleGVjbChERUZBVUxUX1NIRUxMLCBERUZBVUxUX1NIRUxMLCAiLWMiLCBsaW5lLT5jbF9jbWQsIChjaGFyICopIE5VTEwpOworCQljcm9uZGxvZyhFUlIyMCAiY2FuJ3QgZXhlY3V0ZSAnJXMnIGZvciB1c2VyICVzIiwgREVGQVVMVF9TSEVMTCwgdXNlcik7CisJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCWlmIChwaWQgPCAwKSB7CisJCS8qIEZPUksgRkFJTEVEICovCisJCWNyb25kbG9nKEVSUjIwICJjYW4ndCB2Zm9yayIpOworIGVycjoKKwkJcGlkID0gMDsKKwl9CisJbGluZS0+Y2xfcGlkID0gcGlkOworfQorCisjZGVmaW5lIHByb2Nlc3NfZmluaXNoZWRfam9iKHVzZXIsIGxpbmUpICAoKGxpbmUpLT5jbF9waWQgPSAwKQorCisjZW5kaWYgLyogIUVOQUJMRV9GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwgKi8KKworLyoKKyAqIERldGVybWluZSB3aGljaCBqb2JzIG5lZWQgdG8gYmUgcnVuLiAgVW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMsIHRoZQorICogcGVyaW9kIGlzIGFib3V0IGEgbWludXRlIChvbmUgc2NhbikuICBXb3JzdCBjYXNlIGl0IHdpbGwgYmUgb25lCisgKiBob3VyICg2MCBzY2FucykuCisgKi8KK3N0YXRpYyB2b2lkIGZsYWdfc3RhcnRpbmdfam9icyh0aW1lX3QgdDEsIHRpbWVfdCB0MikKK3sKKwl0aW1lX3QgdDsKKworCS8qIEZpbmQgam9icyA+IHQxIGFuZCA8PSB0MiAqLworCisJZm9yICh0ID0gdDEgLSB0MSAlIDYwOyB0IDw9IHQyOyB0ICs9IDYwKSB7CisJCXN0cnVjdCB0bSAqcHRtOworCQlDcm9uRmlsZSAqZmlsZTsKKwkJQ3JvbkxpbmUgKmxpbmU7CisKKwkJaWYgKHQgPD0gdDEpCisJCQljb250aW51ZTsKKworCQlwdG0gPSBsb2NhbHRpbWUoJnQpOworCQlmb3IgKGZpbGUgPSBHLmNyb25fZmlsZXM7IGZpbGU7IGZpbGUgPSBmaWxlLT5jZl9uZXh0KSB7CisJCQlpZiAoRGVidWdPcHQpCisJCQkJY3JvbmRsb2coTFZMNSAiZmlsZSAlczoiLCBmaWxlLT5jZl91c2VybmFtZSk7CisJCQlpZiAoZmlsZS0+Y2ZfZGVsZXRlZCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAobGluZSA9IGZpbGUtPmNmX2xpbmVzOyBsaW5lOyBsaW5lID0gbGluZS0+Y2xfbmV4dCkgeworCQkJCWlmIChEZWJ1Z09wdCkKKwkJCQkJY3JvbmRsb2coTFZMNSAiIGxpbmUgJXMiLCBsaW5lLT5jbF9jbWQpOworCQkJCWlmIChsaW5lLT5jbF9NaW5zW3B0bS0+dG1fbWluXQorCQkJCSAmJiBsaW5lLT5jbF9IcnNbcHRtLT50bV9ob3VyXQorCQkJCSAmJiAobGluZS0+Y2xfRGF5c1twdG0tPnRtX21kYXldIHx8IGxpbmUtPmNsX0Rvd1twdG0tPnRtX3dkYXldKQorCQkJCSAmJiBsaW5lLT5jbF9Nb25zW3B0bS0+dG1fbW9uXQorCQkJCSkgeworCQkJCQlpZiAoRGVidWdPcHQpIHsKKwkJCQkJCWNyb25kbG9nKExWTDUgIiBqb2I6ICVkICVzIiwKKwkJCQkJCQkoaW50KWxpbmUtPmNsX3BpZCwgbGluZS0+Y2xfY21kKTsKKwkJCQkJfQorCQkJCQlpZiAobGluZS0+Y2xfcGlkID4gMCkgeworCQkJCQkJY3JvbmRsb2coTFZMOCAidXNlciAlczogcHJvY2VzcyBhbHJlYWR5IHJ1bm5pbmc6ICVzIiwKKwkJCQkJCQlmaWxlLT5jZl91c2VybmFtZSwgbGluZS0+Y2xfY21kKTsKKwkJCQkJfSBlbHNlIGlmIChsaW5lLT5jbF9waWQgPT0gMCkgeworCQkJCQkJbGluZS0+Y2xfcGlkID0gLTE7CisJCQkJCQlmaWxlLT5jZl93YW50c19zdGFydGluZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2pvYnModm9pZCkKK3sKKwlDcm9uRmlsZSAqZmlsZTsKKwlDcm9uTGluZSAqbGluZTsKKworCWZvciAoZmlsZSA9IEcuY3Jvbl9maWxlczsgZmlsZTsgZmlsZSA9IGZpbGUtPmNmX25leHQpIHsKKwkJaWYgKCFmaWxlLT5jZl93YW50c19zdGFydGluZykKKwkJCWNvbnRpbnVlOworCisJCWZpbGUtPmNmX3dhbnRzX3N0YXJ0aW5nID0gMDsKKwkJZm9yIChsaW5lID0gZmlsZS0+Y2ZfbGluZXM7IGxpbmU7IGxpbmUgPSBsaW5lLT5jbF9uZXh0KSB7CisJCQlwaWRfdCBwaWQ7CisJCQlpZiAobGluZS0+Y2xfcGlkID49IDApCisJCQkJY29udGludWU7CisKKwkJCXN0YXJ0X29uZV9qb2IoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUpOworCQkJcGlkID0gbGluZS0+Y2xfcGlkOworCQkJY3JvbmRsb2coTFZMOCAiVVNFUiAlcyBwaWQgJTNkIGNtZCAlcyIsCisJCQkJZmlsZS0+Y2ZfdXNlcm5hbWUsIChpbnQpcGlkLCBsaW5lLT5jbF9jbWQpOworCQkJaWYgKHBpZCA8IDApIHsKKwkJCQlmaWxlLT5jZl93YW50c19zdGFydGluZyA9IDE7CisJCQl9CisJCQlpZiAocGlkID4gMCkgeworCQkJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIENoZWNrIGZvciBqb2IgY29tcGxldGlvbiwgcmV0dXJuIG51bWJlciBvZiBqb2JzIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIKKyAqIGFsbCBkb25lLgorICovCitzdGF0aWMgaW50IGNoZWNrX2NvbXBsZXRpb25zKHZvaWQpCit7CisJQ3JvbkZpbGUgKmZpbGU7CisJQ3JvbkxpbmUgKmxpbmU7CisJaW50IG51bV9zdGlsbF9ydW5uaW5nID0gMDsKKworCWZvciAoZmlsZSA9IEcuY3Jvbl9maWxlczsgZmlsZTsgZmlsZSA9IGZpbGUtPmNmX25leHQpIHsKKwkJaWYgKCFmaWxlLT5jZl9oYXNfcnVubmluZykKKwkJCWNvbnRpbnVlOworCisJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMDsKKwkJZm9yIChsaW5lID0gZmlsZS0+Y2ZfbGluZXM7IGxpbmU7IGxpbmUgPSBsaW5lLT5jbF9uZXh0KSB7CisJCQlpbnQgcjsKKworCQkJaWYgKGxpbmUtPmNsX3BpZCA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlyID0gd2FpdHBpZChsaW5lLT5jbF9waWQsIE5VTEwsIFdOT0hBTkcpOworCQkJaWYgKHIgPCAwIHx8IHIgPT0gbGluZS0+Y2xfcGlkKSB7CisJCQkJcHJvY2Vzc19maW5pc2hlZF9qb2IoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUpOworCQkJCWlmIChsaW5lLT5jbF9waWQgPT0gMCkgeworCQkJCQkvKiBzZW5kbWFpbCB3YXMgbm90IHN0YXJ0ZWQgZm9yIGl0ICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBlbHNlOiBzZW5kbWFpbCB3YXMgc3RhcnRlZCwgam9iIGlzIHN0aWxsIHJ1bm5pbmcsIGZhbGwgdGhydSAqLworCQkJfQorCQkJLyogZWxzZTogciA9PSAwOiAicHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nIiAqLworCQkJZmlsZS0+Y2ZfaGFzX3J1bm5pbmcgPSAxOworCQl9CisvL0ZJWE1FOiBpZiAhZmlsZS0+Y2ZfaGFzX3J1bm5pbmcgJiYgZmlsZS0+ZGVsZXRlZDogZGVsZXRlIGl0IQorLy9vdGhlcndpc2UgZGVsZXRlZCBlbnRyaWVzIHdpbGwgc3RheSBmb3JldmVyLCByaWdodD8KKwkJbnVtX3N0aWxsX3J1bm5pbmcgKz0gZmlsZS0+Y2ZfaGFzX3J1bm5pbmc7CisJfQorCXJldHVybiBudW1fc3RpbGxfcnVubmluZzsKK30KKworaW50IGNyb25kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjcm9uZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdGltZV90IHQyOworCWludCByZXNjYW47CisJaW50IHNsZWVwX3RpbWU7CisJdW5zaWduZWQgb3B0czsKKworCUlOSVRfRygpOworCisJLyogIi1iIGFmdGVyIC1mIGlzIGlnbm9yZWQiLCBhbmQgc28gb24gZm9yIGV2ZXJ5IHBhaXIgYS1iICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZi1iOmItZjpTLUw6TC1TIiBJRl9GRUFUVVJFX0NST05EX0QoIjpkLWwiKQorCQkJLyogLWwgYW5kIC1kIGhhdmUgbnVtZXJpYyBwYXJhbSAqLworCQkJIjpsKyIgSUZfRkVBVFVSRV9DUk9ORF9EKCI6ZCsiKTsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImw6TDpmYlNjOiIgSUZfRkVBVFVSRV9DUk9ORF9EKCJkOiIpLAorCQkJJkcubG9nX2xldmVsLCAmRy5sb2dfZmlsZW5hbWUsICZHLmNyb250YWJfZGlyX25hbWUKKwkJCUlGX0ZFQVRVUkVfQ1JPTkRfRCgsJkcubG9nX2xldmVsKSk7CisJLyogYm90aCAtZCBOIGFuZCAtbCBOIHNldCB0aGUgc2FtZSB2YXJpYWJsZTogRy5sb2dfbGV2ZWwgKi8KKworCWlmICghKG9wdHMgJiBPUFRfZikpIHsKKwkJLyogY2xvc2Ugc3RkaW4sIHN0ZG91dCwgc3RkZXJyLgorCQkgKiBjbG9zZSB1bnVzZWQgZGVzY3JpcHRvcnMgLSBkb24ndCBuZWVkIHRoZW0uICovCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0xPU0VfRVhUUkFfRkRTLCBhcmd2KTsKKwl9CisKKwlpZiAoIShvcHRzICYgT1BUX2QpICYmIEcubG9nX2ZpbGVuYW1lID09IE5VTEwpIHsKKwkJLyogbG9nZ2luZyB0byBzeXNsb2cgKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX0NPTlMgfCBMT0dfUElELCBMT0dfQ1JPTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisKKwl4Y2hkaXIoRy5jcm9udGFiX2Rpcl9uYW1lKTsKKwkvL3NpZ25hbChTSUdIVVAsIFNJR19JR04pOyAvKiA/IG9yaWdpbmFsIGNyb25kIGRpZXMgb24gSFVQLi4uICovCisJeHNldGVudigiU0hFTEwiLCBERUZBVUxUX1NIRUxMKTsgLyogb25jZSwgZm9yIGFsbCBmdXR1cmUgY2hpbGRyZW4gKi8KKwljcm9uZGxvZyhMVkw4ICJjcm9uZCAoYnVzeWJveCAiQkJfVkVSIikgc3RhcnRlZCwgbG9nIGxldmVsICVkIiwgRy5sb2dfbGV2ZWwpOworCXJlc2Nhbl9jcm9udGFiX2RpcigpOworCXdyaXRlX3BpZGZpbGUoIi92YXIvcnVuL2Nyb25kLnBpZCIpOworCisJLyogTWFpbiBsb29wICovCisJdDIgPSB0aW1lKE5VTEwpOworCXJlc2NhbiA9IDYwOworCXNsZWVwX3RpbWUgPSA2MDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBzdGF0IHNidWY7CisJCXRpbWVfdCB0MTsKKwkJbG9uZyBkdDsKKworCQl0MSA9IHQyOworCisJCS8qIFN5bmNocm9uaXplIHRvIDEgbWludXRlLCBtaW5pbXVtIDEgc2Vjb25kICovCisJCXNsZWVwKHNsZWVwX3RpbWUgLSAodGltZShOVUxMKSAlIHNsZWVwX3RpbWUpICsgMSk7CisKKwkJdDIgPSB0aW1lKE5VTEwpOworCQlkdCA9IChsb25nKXQyIC0gKGxvbmcpdDE7CisKKwkJLyoKKwkJICogVGhlIGZpbGUgJ2Nyb24udXBkYXRlJyBpcyBjaGVja2VkIHRvIGRldGVybWluZSBuZXcgY3JvbgorCQkgKiBqb2JzLiAgVGhlIGRpcmVjdG9yeSBpcyByZXNjYW5uZWQgb25jZSBhbiBob3VyIHRvIGRlYWwKKwkJICogd2l0aCBhbnkgc2NyZXd1cHMuCisJCSAqCisJCSAqIENoZWNrIGZvciB0aW1lIGp1bXAuICBEaXNwYXJpdGllcyBvdmVyIGFuIGhvdXIgZWl0aGVyIHdheQorCQkgKiByZXN1bHQgaW4gcmVzeW5jaHJvbml6YXRpb24uICBBIG5lZ2F0aXZlIGRpc3Bhcml0eQorCQkgKiBsZXNzIHRoYW4gYW4gaG91ciBjYXVzZXMgdXMgdG8gZWZmZWN0aXZlbHkgc2xlZXAgdW50aWwgd2UKKwkJICogbWF0Y2ggdGhlIG9yaWdpbmFsIHRpbWUgKGkuZS4gbm8gcmUtZXhlY3V0aW9uIG9mIGpvYnMgdGhhdAorCQkgKiBoYXZlIGp1c3QgYmVlbiBydW4pLiAgQSBwb3NpdGl2ZSBkaXNwYXJpdHkgbGVzcyB0aGFuCisJCSAqIGFuIGhvdXIgY2F1c2VzIGludGVybWVkaWF0ZSBqb2JzIHRvIGJlIHJ1biwgYnV0IG9ubHkgb25jZQorCQkgKiBpbiB0aGUgd29yc3QgY2FzZS4KKwkJICoKKwkJICogV2hlbiBydW5uaW5nIGpvYnMsIHRoZSBpbmVxdWFsaXR5IHVzZWQgaXMgZ3JlYXRlciBidXQgbm90CisJCSAqIGVxdWFsIHRvIHQxLCBhbmQgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIHQyLgorCQkgKi8KKwkJaWYgKHN0YXQoRy5jcm9udGFiX2Rpcl9uYW1lLCAmc2J1ZikgIT0gMCkKKwkJCXNidWYuc3RfbXRpbWUgPSAwOyAvKiBmb3JjZSB1cGRhdGUgKG9uY2UpIGlmIGRpciB3YXMgZGVsZXRlZCAqLworCQlpZiAoRy5jcm9udGFiX2Rpcl9tdGltZSAhPSBzYnVmLnN0X210aW1lKSB7CisJCQlHLmNyb250YWJfZGlyX210aW1lID0gc2J1Zi5zdF9tdGltZTsKKwkJCXJlc2NhbiA9IDE7CisJCX0KKwkJaWYgKC0tcmVzY2FuID09IDApIHsKKwkJCXJlc2NhbiA9IDYwOworCQkJcmVzY2FuX2Nyb250YWJfZGlyKCk7CisJCX0KKwkJcHJvY2Vzc19jcm9uX3VwZGF0ZV9maWxlKCk7CisJCWlmIChEZWJ1Z09wdCkKKwkJCWNyb25kbG9nKExWTDUgIndha2V1cCBkdD0lbGQiLCBkdCk7CisJCWlmIChkdCA8IC02MCAqIDYwIHx8IGR0ID4gNjAgKiA2MCkgeworCQkJY3JvbmRsb2coV0FSTjkgInRpbWUgZGlzcGFyaXR5IG9mICVsZCBtaW51dGVzIGRldGVjdGVkIiwgZHQgLyA2MCk7CisJCQkvKiBhbmQgd2UgZG8gbm90IHJ1biBhbnkgam9icyBpbiB0aGlzIGNhc2UgKi8KKwkJfSBlbHNlIGlmIChkdCA+IDApIHsKKwkJCS8qIFVzdWFsIGNhc2U6IHRpbWUgYWR2YW5jZXMgZm9yd2FyZCwgYXMgZXhwZWN0ZWQgKi8KKwkJCWZsYWdfc3RhcnRpbmdfam9icyh0MSwgdDIpOworCQkJc3RhcnRfam9icygpOworCQkJaWYgKGNoZWNrX2NvbXBsZXRpb25zKCkgPiAwKSB7CisJCQkJLyogc29tZSBqb2JzIGFyZSBzdGlsbCBydW5uaW5nICovCisJCQkJc2xlZXBfdGltZSA9IDEwOworCQkJfSBlbHNlIHsKKwkJCQlzbGVlcF90aW1lID0gNjA7CisJCQl9CisJCX0KKwkJLyogZWxzZTogdGltZSBqdW1wZWQgYmFjaywgZG8gbm90IHJ1biBhbnkgam9icyAqLworCX0gLyogZm9yICg7OykgKi8KKworCXJldHVybiAwOyAvKiBub3QgcmVhY2hlZCAqLworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2Nyb250YWIuYyBiL21pc2N1dGlscy9jcm9udGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9jcm9udGFiLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENST05UQUIKKyAqCisgKiB1c3VhbGx5IHNldHVpZCByb290LCAtYyBvcHRpb24gb25seSB3b3JrcyBpZiBnZXR1aWQoKSA9PSBnZXRldWlkKCkKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCBNYXR0aGV3IERpbGxvbiAoZGlsbG9uQGFwb2xsby53ZXN0Lm9pYy5jb20pCisgKiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChDKSAyMDAyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3JvbnRhYl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIERJUl0gWy11IFVTRVJdIFstbGVyXXxbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgY3JvbnRhYl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktYwlDcm9udGFiIGRpcmVjdG9yeSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVXNlciIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBjcm9udGFiIgorLy91c2FnZTogICAgICJcbgktZQlFZGl0IGNyb250YWIiCisvL3VzYWdlOiAgICAgIlxuCS1yCURlbGV0ZSBjcm9udGFiIgorLy91c2FnZTogICAgICJcbglGSUxFCVJlcGxhY2UgY3JvbnRhYiBieSBGSUxFICgnLSc6IHN0ZGluKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgQ1JPTlRBQlMgICAgICAgIENPTkZJR19GRUFUVVJFX0NST05EX0RJUiAiL2Nyb250YWJzIgorI2lmbmRlZiBDUk9OVVBEQVRFCisjZGVmaW5lIENST05VUERBVEUgICAgICAiY3Jvbi51cGRhdGUiCisjZW5kaWYKKworc3RhdGljIHZvaWQgZWRpdF9maWxlKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnBhcywgY29uc3QgY2hhciAqZmlsZSkKK3sKKwljb25zdCBjaGFyICpwdHI7CisJcGlkX3QgcGlkOworCisJcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCkgeyAvKiBwYXJlbnQgKi8KKwkJd2FpdDRwaWQocGlkKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENISUxEIC0gY2hhbmdlIHVzZXIgYW5kIHJ1biBlZGl0b3IgKi8KKwkvKiBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZCAqLworCWNoYW5nZV9pZGVudGl0eShwYXMpOworCXNldHVwX2Vudmlyb25tZW50KHBhcy0+cHdfc2hlbGwsCisJCQlTRVRVUF9FTlZfQ0hBTkdFRU5WIHwgU0VUVVBfRU5WX1RPX1RNUCwKKwkJCXBhcyk7CisJcHRyID0gZ2V0ZW52KCJWSVNVQUwiKTsKKwlpZiAoIXB0cikgeworCQlwdHIgPSBnZXRlbnYoIkVESVRPUiIpOworCQlpZiAoIXB0cikKKwkJCXB0ciA9ICJ2aSI7CisJfQorCisJQkJfRVhFQ0xQKHB0ciwgcHRyLCBmaWxlLCBOVUxMKTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIHB0cik7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9hc191c2VyKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnBhcywgY29uc3QgY2hhciAqZmlsZSkKK3sKKwlwaWRfdCBwaWQ7CisJY2hhciBjOworCisJcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCkgeyAvKiBQQVJFTlQgKi8KKwkJaWYgKHdhaXQ0cGlkKHBpZCkgPT0gMCkgeworCQkJLyogZXhpdGNvZGUgMDogY2hpbGQgc2F5cyBpdCBjYW4gcmVhZCAqLworCQkJcmV0dXJuIG9wZW4oZmlsZSwgT19SRE9OTFkpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDSElMRCAqLworCS8qIGluaXRncm91cHMsIHNldGdpZCwgc2V0dWlkICovCisJY2hhbmdlX2lkZW50aXR5KHBhcyk7CisJLyogV2UganVzdCB0cnkgdG8gcmVhZCBvbmUgYnl0ZS4gSWYgaXQgd29ya3MsIGZpbGUgaXMgcmVhZGFibGUKKwkgKiB1bmRlciB0aGlzIHVzZXIuIFdlIHNpZ25hbCB0aGF0IGJ5IGV4aXRpbmcgd2l0aCAwLiAqLworCV9leGl0KHNhZmVfcmVhZCh4b3BlbihmaWxlLCBPX1JET05MWSksICZjLCAxKSA8IDApOworfQorCitpbnQgY3JvbnRhYl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY3JvbnRhYl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3Qgc3RydWN0IHBhc3N3ZCAqcGFzOworCWNvbnN0IGNoYXIgKmNyb250YWJfZGlyID0gQ1JPTlRBQlM7CisJY2hhciAqdG1wX2ZuYW1lOworCWNoYXIgKm5ld19mbmFtZTsKKwljaGFyICp1c2VyX25hbWU7ICAvKiAtdSBVU0VSICovCisJaW50IGZkOworCWludCBzcmNfZmQ7CisJaW50IG9wdF9sZXI7CisKKwkvKiBmaWxlIFtvcHRzXSAgICAgUmVwbGFjZSBjcm9udGFiIGZyb20gZmlsZQorCSAqIC0gW29wdHNdICAgICAgICBSZXBsYWNlIGNyb250YWIgZnJvbSBzdGRpbgorCSAqIC11IHVzZXIgICAgICAgICBVc2VyCisJICogLWMgZGlyICAgICAgICAgIENyb250YWIgZGlyZWN0b3J5CisJICogLWwgICAgICAgICAgICAgIExpc3QgY3JvbnRhYiBmb3IgdXNlcgorCSAqIC1lICAgICAgICAgICAgICBFZGl0IGNyb250YWIgZm9yIHVzZXIKKwkgKiAtciAgICAgICAgICAgICAgRGVsZXRlIGNyb250YWIgZm9yIHVzZXIKKwkgKiBiYm94IGFsc28gc3VwcG9ydHMgLWQgPT0gLXIsIGJ1dCBtb3N0IG90aGVyIGNyb250YWIKKwkgKiBpbXBsZW1lbnRhdGlvbnMgZG8gbm90LiBEZXByZWNhdGVkLgorCSAqLworCWVudW0geworCQlPUFRfdSA9ICgxIDw8IDApLAorCQlPUFRfYyA9ICgxIDw8IDEpLAorCQlPUFRfbCA9ICgxIDw8IDIpLAorCQlPUFRfZSA9ICgxIDw8IDMpLAorCQlPUFRfciA9ICgxIDw8IDQpLAorCQlPUFRfbGVyID0gT1BUX2wgKyBPUFRfZSArIE9QVF9yLAorCX07CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MTpkciI7IC8qIG1heCBvbmUgYXJndW1lbnQ7IC1kIGltcGxpZXMgLXIgKi8KKwlvcHRfbGVyID0gZ2V0b3B0MzIoYXJndiwgInU6YzpsZXJkIiwgJnVzZXJfbmFtZSwgJmNyb250YWJfZGlyKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChzYW5pdGl6ZV9lbnZfaWZfc3VpZCgpKSB7IC8qIENsZWFycyBkYW5nZXJvdXMgc3R1ZmYsIHNldHMgUEFUSCAqLworCQkvKiBSdW4gYnkgbm9uLXJvb3QgKi8KKwkJaWYgKG9wdF9sZXIgJiAoT1BUX3V8T1BUX2MpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCX0KKworCWlmIChvcHRfbGVyICYgT1BUX3UpIHsKKwkJcGFzID0geGdldHB3bmFtKHVzZXJfbmFtZSk7CisJfSBlbHNlIHsKKwkJcGFzID0geGdldHB3dWlkKGdldHVpZCgpKTsKKwl9CisKKyNkZWZpbmUgdXNlcl9uYW1lIERPTlRfVVNFX01FX0JFWU9ORF9USElTX1BPSU5UCisKKwkvKiBGcm9tIG5vdyBvbiwga2VlcCBvbmx5IC1sLCAtZSwgLXIgYml0cyAqLworCW9wdF9sZXIgJj0gT1BUX2xlcjsKKwlpZiAoKG9wdF9sZXIgLSAxKSAmIG9wdF9sZXIpIC8qIG1vcmUgdGhhbiBvbmUgYml0IHNldD8gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogUmVhZCByZXBsYWNlbWVudCBmaWxlIHVuZGVyIHVzZXIncyBVSUQvR0lEL2dyb3VwIHZlY3RvciAqLworCXNyY19mZCA9IFNURElOX0ZJTEVOTzsKKwlpZiAoIW9wdF9sZXIpIHsgLyogUmVwbGFjZT8gKi8KKwkJaWYgKCFhcmd2WzBdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoTk9UX0xPTkVfREFTSChhcmd2WzBdKSkgeworCQkJc3JjX2ZkID0gb3Blbl9hc191c2VyKHBhcywgYXJndlswXSk7CisJCQlpZiAoc3JjX2ZkIDwgMCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidXNlciAlcyBjYW5ub3QgcmVhZCAlcyIsCisJCQkJCQlwYXMtPnB3X25hbWUsIGFyZ3ZbMF0pOworCQl9CisJfQorCisJLyogY2QgdG8gb3VyIGNyb250YWIgZGlyZWN0b3J5ICovCisJeGNoZGlyKGNyb250YWJfZGlyKTsKKworCXRtcF9mbmFtZSA9IE5VTEw7CisKKwkvKiBIYW5kbGUgcmVxdWVzdGVkIG9wZXJhdGlvbiAqLworCXN3aXRjaCAob3B0X2xlcikgeworCisJZGVmYXVsdDogLyogY2FzZSBPUFRfcjogRGVsZXRlICovCisJCXVubGluayhwYXMtPnB3X25hbWUpOworCQlicmVhazsKKworCWNhc2UgT1BUX2w6IC8qIExpc3QgKi8KKwkJeworCQkJY2hhciAqYXJnc1syXSA9IHsgcGFzLT5wd19uYW1lLCBOVUxMIH07CisJCQlyZXR1cm4gYmJfY2F0KGFyZ3MpOworCQkJLyogbGlzdCBleGl0cywKKwkJCSAqIHRoZSByZXN0IGdvIHBsYXkgd2l0aCBjcm9uIHVwZGF0ZSBmaWxlICovCisJCX0KKworCWNhc2UgT1BUX2U6IC8qIEVkaXQgKi8KKwkJdG1wX2ZuYW1lID0geGFzcHJpbnRmKCIlcy4ldSIsIGNyb250YWJfZGlyLCAodW5zaWduZWQpZ2V0cGlkKCkpOworCQkvKiBObyBPX0VYQ0w6IHdlIGRvbid0IHdhbnQgdG8gYmUgc3R1Y2sgaWYgZWFybGllciBjcm9udGFicworCQkgKiB3ZXJlIGtpbGxlZCwgbGVhdmluZyBzdGFsZSB0ZW1wIGZpbGUgYmVoaW5kICovCisJCXNyY19mZCA9IHhvcGVuMyh0bXBfZm5hbWUsIE9fUkRXUnxPX0NSRUFUfE9fVFJVTkMsIDA2MDApOworCQlmY2hvd24oc3JjX2ZkLCBwYXMtPnB3X3VpZCwgcGFzLT5wd19naWQpOworCQlmZCA9IG9wZW4ocGFzLT5wd19uYW1lLCBPX1JET05MWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQliYl9jb3B5ZmRfZW9mKGZkLCBzcmNfZmQpOworCQkJY2xvc2UoZmQpOworCQkJeGxzZWVrKHNyY19mZCwgMCwgU0VFS19TRVQpOworCQl9CisJCWNsb3NlX29uX2V4ZWNfb24oc3JjX2ZkKTsgLyogZG9uJ3Qgd2FudCBlZGl0b3IgdG8gc2VlIHRoaXMgZmQgKi8KKwkJZWRpdF9maWxlKHBhcywgdG1wX2ZuYW1lKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIDA6IC8qIFJlcGxhY2UgKG5vIC1sLCAtZSwgb3IgLXIgd2VyZSBnaXZlbikgKi8KKwkJbmV3X2ZuYW1lID0geGFzcHJpbnRmKCIlcy5uZXciLCBwYXMtPnB3X25hbWUpOworCQlmZCA9IG9wZW4obmV3X2ZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkN8T19BUFBFTkQsIDA2MDApOworCQlpZiAoZmQgPj0gMCkgeworCQkJYmJfY29weWZkX2VvZihzcmNfZmQsIGZkKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXhyZW5hbWUobmV3X2ZuYW1lLCBwYXMtPnB3X25hbWUpOworCQl9IGVsc2UgeworCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJXMvJXMiLAorCQkJCQljcm9udGFiX2RpciwgbmV3X2ZuYW1lKTsKKwkJfQorCQlpZiAodG1wX2ZuYW1lKQorCQkJdW5saW5rKHRtcF9mbmFtZSk7CisJCS8qZnJlZSh0bXBfZm5hbWUpOyovCisJCS8qZnJlZShuZXdfZm5hbWUpOyovCisKKwl9IC8qIHN3aXRjaCAqLworCisJLyogQnVtcCBub3RpZmljYXRpb24gZmlsZS4gIEhhbmRsZSB3aW5kb3cgd2hlcmUgY3JvbmQgcGlja3MgZmlsZSB1cAorCSAqIGJlZm9yZSB3ZSBjYW4gd3JpdGUgb3VyIGVudHJ5IG91dC4KKwkgKi8KKwl3aGlsZSAoKGZkID0gb3BlbihDUk9OVVBEQVRFLCBPX1dST05MWXxPX0NSRUFUfE9fQVBQRU5ELCAwNjAwKSkgPj0gMCkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQlmZHByaW50ZihmZCwgIiVzXG4iLCBwYXMtPnB3X25hbWUpOworCQlpZiAoZnN0YXQoZmQsICZzdCkgIT0gMCB8fCBzdC5zdF9ubGluayAhPSAwKSB7CisJCQkvKmNsb3NlKGZkKTsqLworCQkJYnJlYWs7CisJCX0KKwkJLyogc3Quc3RfbmxpbmsgPT0gMDoKKwkJICogZmlsZSB3YXMgZGVsZXRlZCwgbWF5YmUgY3JvbmQgbWlzc2VkIG91ciBub3RpZmljYXRpb24gKi8KKwkJY2xvc2UoZmQpOworCQkvKiBsb29wICovCisJfQorCWlmIChmZCA8IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBhcHBlbmQgdG8gJXMvJXMiLAorCQkJCWNyb250YWJfZGlyLCBDUk9OVVBEQVRFKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZGMuYyBiL21pc2N1dGlscy9kYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDM3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvZGMuYwpAQCAtMCwwICsxLDI4MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8vdXNhZ2U6I2RlZmluZSBkY190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRVhQUkVTU0lPTi4uLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZGNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUaW55IFJQTiBjYWxjdWxhdG9yLiBPcGVyYXRpb25zOlxuIgorLy91c2FnZTogICAgICAgIissIGFkZCwgLSwgc3ViLCAqLCBtdWwsIC8sIGRpdiwgJSwgbW9kLCAiSUZfRkVBVFVSRV9EQ19MSUJNKCIqKiwgZXhwLCAiKSJhbmQsIG9yLCBub3QsIGVvcixcbiIKKy8vdXNhZ2U6ICAgICAgICJwIC0gcHJpbnQgdG9wIG9mIHRoZSBzdGFjayAod2l0aG91dCBwb3BwaW5nKSxcbiIKKy8vdXNhZ2U6ICAgICAgICJmIC0gcHJpbnQgZW50aXJlIHN0YWNrLFxuIgorLy91c2FnZTogICAgICAgIm8gLSBwb3AgdGhlIHZhbHVlIGFuZCBzZXQgb3V0cHV0IHJhZGl4IChtdXN0IGJlIDEwLCAxNiwgOCBvciAyKS5cbiIKKy8vdXNhZ2U6ICAgICAgICJFeGFtcGxlczogJ2RjIDIgMiBhZGQgcCcgLT4gNCwgJ2RjIDggOCAqIDIgMiArIC8gcCcgLT4gMTYiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRjX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRjIDIgMiArIHBcbiIKKy8vdXNhZ2U6ICAgICAgICI0XG4iCisvL3VzYWdlOiAgICAgICAiJCBkYyA4IDggXFwqIDIgMiArIC8gcFxuIgorLy91c2FnZTogICAgICAgIjE2XG4iCisvL3VzYWdlOiAgICAgICAiJCBkYyAwIDEgYW5kIHBcbiIKKy8vdXNhZ2U6ICAgICAgICIwXG4iCisvL3VzYWdlOiAgICAgICAiJCBkYyAwIDEgb3IgcFxuIgorLy91c2FnZTogICAgICAgIjFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gNzIgOSBkaXYgOCBtdWwgcCB8IGRjXG4iCisvL3VzYWdlOiAgICAgICAiNjRcbiIKKworI2lmIDAKK3R5cGVkZWYgdW5zaWduZWQgZGF0YV90OworI2RlZmluZSBEQVRBX0ZNVCAiIgorI2VsaWYgMAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRhdGFfdDsKKyNkZWZpbmUgREFUQV9GTVQgImwiCisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV90OworI2RlZmluZSBEQVRBX0ZNVCAibGwiCisjZW5kaWYKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgcG9pbnRlcjsKKwl1bnNpZ25lZCBiYXNlOworCWRvdWJsZSBzdGFja1sxXTsKK30gRklYX0FMSUFTSU5HOworZW51bSB7IFNUQUNLX1NJWkUgPSAoQ09NTU9OX0JVRlNJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFscywgc3RhY2spKSAvIHNpemVvZihkb3VibGUpIH07CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgcG9pbnRlciAgIChHLnBvaW50ZXIgICApCisjZGVmaW5lIGJhc2UgICAgICAoRy5iYXNlICAgICAgKQorI2RlZmluZSBzdGFjayAgICAgKEcuc3RhY2sgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJYmFzZSA9IDEwOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB2b2lkIHB1c2goZG91YmxlIGEpCit7CisJaWYgKHBvaW50ZXIgPj0gU1RBQ0tfU0laRSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0YWNrIG92ZXJmbG93Iik7CisJc3RhY2tbcG9pbnRlcisrXSA9IGE7Cit9CisKK3N0YXRpYyBkb3VibGUgcG9wKHZvaWQpCit7CisJaWYgKHBvaW50ZXIgPT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0YWNrIHVuZGVyZmxvdyIpOworCXJldHVybiBzdGFja1stLXBvaW50ZXJdOworfQorCitzdGF0aWMgdm9pZCBhZGQodm9pZCkKK3sKKwlwdXNoKHBvcCgpICsgcG9wKCkpOworfQorCitzdGF0aWMgdm9pZCBzdWIodm9pZCkKK3sKKwlkb3VibGUgc3VidHJhaGVuZCA9IHBvcCgpOworCisJcHVzaChwb3AoKSAtIHN1YnRyYWhlbmQpOworfQorCitzdGF0aWMgdm9pZCBtdWwodm9pZCkKK3sKKwlwdXNoKHBvcCgpICogcG9wKCkpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRENfTElCTQorc3RhdGljIHZvaWQgcG93ZXIodm9pZCkKK3sKKwlkb3VibGUgdG9wb3dlciA9IHBvcCgpOworCisJcHVzaChwb3cocG9wKCksIHRvcG93ZXIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaXZpZGUodm9pZCkKK3sKKwlkb3VibGUgZGl2aXNvciA9IHBvcCgpOworCisJcHVzaChwb3AoKSAvIGRpdmlzb3IpOworfQorCitzdGF0aWMgdm9pZCBtb2Qodm9pZCkKK3sKKwlkYXRhX3QgZCA9IHBvcCgpOworCisJcHVzaCgoZGF0YV90KSBwb3AoKSAlIGQpOworfQorCitzdGF0aWMgdm9pZCBhbmQodm9pZCkKK3sKKwlwdXNoKChkYXRhX3QpIHBvcCgpICYgKGRhdGFfdCkgcG9wKCkpOworfQorCitzdGF0aWMgdm9pZCBvcih2b2lkKQoreworCXB1c2goKGRhdGFfdCkgcG9wKCkgfCAoZGF0YV90KSBwb3AoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVvcih2b2lkKQoreworCXB1c2goKGRhdGFfdCkgcG9wKCkgXiAoZGF0YV90KSBwb3AoKSk7Cit9CisKK3N0YXRpYyB2b2lkIG5vdCh2b2lkKQoreworCXB1c2gofihkYXRhX3QpIHBvcCgpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X291dHB1dF9iYXNlKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgYmFzZXNbXSBBTElHTjEgPSB7IDIsIDgsIDEwLCAxNiwgMCB9OworCXVuc2lnbmVkIGIgPSAodW5zaWduZWQpcG9wKCk7CisKKwliYXNlID0gKnN0cmNocm51bChiYXNlcywgYik7CisJaWYgKGJhc2UgPT0gMCkgeworCQliYl9lcnJvcl9tc2coImVycm9yLCBiYXNlICV1IGlzIG5vdCBzdXBwb3J0ZWQiLCBiKTsKKwkJYmFzZSA9IDEwOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfYmFzZShkb3VibGUgcHJpbnQpCit7CisJZGF0YV90IHgsIGk7CisKKwl4ID0gKGRhdGFfdCkgcHJpbnQ7CisJaWYgKGJhc2UgPT0gMTApIHsKKwkJaWYgKHggPT0gcHJpbnQpIC8qIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyB1bnNpZ25lZCBpbnRlZ2VyICovCisJCQlwcmludGYoIiUiREFUQV9GTVQidVxuIiwgeCk7CisJCWVsc2UKKwkJCXByaW50ZigiJWdcbiIsIHByaW50KTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoYmFzZSkgeworCWNhc2UgMTY6CisJCXByaW50ZigiJSJEQVRBX0ZNVCJ4XG4iLCB4KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlwcmludGYoIiUiREFUQV9GTVQib1xuIiwgeCk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIGJhc2UgMiAqLworCQlpID0gTUFYSU5UKGRhdGFfdCkgLSAoTUFYSU5UKGRhdGFfdCkgPj4gMSk7CisJCS8qIGkgaXMgMTAwMDAwLi4uMDAwMDAgKi8KKwkJZG8geworCQkJaWYgKHggJiBpKQorCQkJCWJyZWFrOworCQkJaSA+Pj0gMTsKKwkJfSB3aGlsZSAoaSA+IDEpOworCQlkbyB7CisJCQliYl9wdXRjaGFyKCcxJyAtICEoeCAmIGkpKTsKKwkJCWkgPj49IDE7CisJCX0gd2hpbGUgKGkpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhY2tfbm9fcG9wKHZvaWQpCit7CisJdW5zaWduZWQgaSA9IHBvaW50ZXI7CisJd2hpbGUgKGkpCisJCXByaW50X2Jhc2Uoc3RhY2tbLS1pXSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X25vX3BvcCh2b2lkKQoreworCXByaW50X2Jhc2Uoc3RhY2tbcG9pbnRlci0xXSk7Cit9CisKK3N0cnVjdCBvcCB7CisJY29uc3QgY2hhciBuYW1lWzRdOworCXZvaWQgKCpmdW5jdGlvbikgKHZvaWQpOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcCBvcGVyYXRvcnNbXSA9IHsKKwl7IisiLCAgIGFkZH0sCisJeyJhZGQiLCBhZGR9LAorCXsiLSIsICAgc3VifSwKKwl7InN1YiIsIHN1Yn0sCisJeyIqIiwgICBtdWx9LAorCXsibXVsIiwgbXVsfSwKKwl7Ii8iLCAgIGRpdmlkZX0sCisJeyJkaXYiLCBkaXZpZGV9LAorI2lmIEVOQUJMRV9GRUFUVVJFX0RDX0xJQk0KKwl7IioqIiwgIHBvd2VyfSwKKwl7ImV4cCIsIHBvd2VyfSwKKwl7InBvdyIsIHBvd2VyfSwKKyNlbmRpZgorCXsiJSIsICAgbW9kfSwKKwl7Im1vZCIsIG1vZH0sCisJeyJhbmQiLCBhbmR9LAorCXsib3IiLCAgb3J9LAorCXsibm90Iiwgbm90fSwKKwl7ImVvciIsIGVvcn0sCisJeyJ4b3IiLCBlb3J9LAorCXsicCIsIHByaW50X25vX3BvcH0sCisJeyJmIiwgcHJpbnRfc3RhY2tfbm9fcG9wfSwKKwl7Im8iLCBzZXRfb3V0cHV0X2Jhc2V9LAorCXsgIiIsIE5VTEwgfQorfTsKKworc3RhdGljIHZvaWQgc3RhY2tfbWFjaGluZShjb25zdCBjaGFyICphcmd1bWVudCkKK3sKKwljaGFyICplbmRQb2ludGVyOworCWRvdWJsZSBkOworCWNvbnN0IHN0cnVjdCBvcCAqbyA9IG9wZXJhdG9yczsKKworCWQgPSBzdHJ0b2QoYXJndW1lbnQsICZlbmRQb2ludGVyKTsKKworCWlmIChlbmRQb2ludGVyICE9IGFyZ3VtZW50ICYmICplbmRQb2ludGVyID09ICdcMCcpIHsKKwkJcHVzaChkKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChvLT5mdW5jdGlvbikgeworCQlpZiAoc3RyY21wKG8tPm5hbWUsIGFyZ3VtZW50KSA9PSAwKSB7CisJCQlvLT5mdW5jdGlvbigpOworCQkJcmV0dXJuOworCQl9CisJCW8rKzsKKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciBhdCAnJXMnIiwgYXJndW1lbnQpOworfQorCitpbnQgZGNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJTklUX0coKTsKKworCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJLyogdGFrZSBzdHVmZiBmcm9tIHN0ZGluIGlmIG5vIGFyZ3MgYXJlIGdpdmVuICovCisJCWNoYXIgKmxpbmU7CisJCWNoYXIgKmN1cnNvcjsKKwkJY2hhciAqdG9rZW47CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCQljdXJzb3IgPSBsaW5lOworCQkJd2hpbGUgKDEpIHsKKwkJCQl0b2tlbiA9IHNraXBfd2hpdGVzcGFjZShjdXJzb3IpOworCQkJCWlmICgqdG9rZW4gPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQkJY3Vyc29yID0gc2tpcF9ub25fd2hpdGVzcGFjZSh0b2tlbik7CisJCQkJaWYgKCpjdXJzb3IgIT0gJ1wwJykKKwkJCQkJKmN1cnNvcisrID0gJ1wwJzsKKwkJCQlzdGFja19tYWNoaW5lKHRva2VuKTsKKwkJCX0KKwkJCWZyZWUobGluZSk7CisJCX0KKwl9IGVsc2UgeworCQkvLyB3aHk/IGl0IGJyZWFrcyAiZGMgLTIgMiArIHAiCisJCS8vaWYgKGFyZ3ZbMF1bMF0gPT0gJy0nKQorCQkvLwliYl9zaG93X3VzYWdlKCk7CisJCWRvIHsKKwkJCXN0YWNrX21hY2hpbmUoKmFyZ3YpOworCQl9IHdoaWxlICgqKythcmd2KTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9kZXZmc2QuYyBiL21pc2N1dGlscy9kZXZmc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDkzZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2RldmZzZC5jCkBAIC0wLDAgKzEsMTgwOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorCWRldmZzZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorCisJQ29weXJpZ2h0IChDKSAyMDAzIGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKworCUJ1c3lib3ggdmVyc2lvbiBpcyBiYXNlZCBvbiBzb21lIHByZXZpb3VzIHdvcmsgYW5kIGlkZWFzCisJQ29weXJpZ2h0IChDKSBbMjAwM10gYnkgW01hdHRlbyBDcm9jZV0gPDMyOTc2Mjc3OTlAd2luZC5pdD4KKworCWRldmZzZC5jCisKKwlNYWluIGZpbGUgZm9yICBkZXZmc2QgIChkZXZmcyBkYWVtb24gZm9yIExpbnV4KS4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAyICBSaWNoYXJkIEdvb2NoCisKKwlkZXZmc2QuaAorCisgICAgSGVhZGVyIGZpbGUgZm9yICBkZXZmc2QgIChkZXZmcyBkYWVtb24gZm9yIExpbnV4KS4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBSaWNoYXJkIEdvb2NoCisKKwljb21wYXRfbmFtZS5jCisKKyAgICBDb21wYXRpYmlsaXR5IG5hbWUgZmlsZSBmb3IgIGRldmZzZCAgKGJ1aWxkIGNvbXBhdGliaWxpdHkgbmFtZXMpLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDIgIFJpY2hhcmQgR29vY2gKKworCWV4cHJlc3Npb24uYworCisgICAgVGhpcyBjb2RlIHByb3ZpZGVzIEJvcm5lIFNoZWxsLWxpa2UgZXhwcmVzc2lvbiBleHBhbnNpb24uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSAgUmljaGFyZCBHb29jaAorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBSaWNoYXJkIEdvb2NoIG1heSBiZSByZWFjaGVkIGJ5IGVtYWlsIGF0ICByZ29vY2hAYXRuZi5jc2lyby5hdQorICAgIFRoZSBwb3N0YWwgYWRkcmVzcyBpczoKKyAgICAgIFJpY2hhcmQgR29vY2gsIGMvbyBBVE5GLCBQLiBPLiBCb3ggNzYsIEVwcGluZywgTi5TLlcuLCAyMTIxLCBBdXN0cmFsaWEuCisqLworCisvL3VzYWdlOiNkZWZpbmUgZGV2ZnNkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJtbnRwbnQgWy12XSIgSUZfREVWRlNEX0ZHX05QKCJbLWZnXVstbnBdIikKKy8vdXNhZ2U6I2RlZmluZSBkZXZmc2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYW5hZ2UgZGV2ZnMgcGVybWlzc2lvbnMgYW5kIG9sZCBkZXZpY2UgbmFtZSBzeW1saW5rc1xuIgorLy91c2FnZTogICAgICJcbgltbnRwbnQJVGhlIG1vdW50IHBvaW50IHdoZXJlIGRldmZzIGlzIG1vdW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCS12CVByaW50IHRoZSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlcnMgZm9yIGRldmZzZCIKKy8vdXNhZ2U6ICAgICAiXG4JCWFuZCB0aGUga2VybmVsLXNpZGUgcHJvdG9jb2wgdmVyc2lvbiBhbmQgZXhpdCIKKy8vdXNhZ2U6CUlGX0RFVkZTRF9GR19OUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWZnCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktbnAJRXhpdCBhZnRlciBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCQlhbmQgcHJvY2Vzc2luZyBzeW50aGV0aWMgUkVHSVNURVIgZXZlbnRzLCIKKy8vdXNhZ2U6ICAgICAiXG4JCWRvbid0IHBvbGwgZm9yIGV2ZW50cyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisKKy8qIFZhcmlvdXMgZGVmaW5lcyB0YWtlbiBmcm9tIGxpbnV4L21ham9yLmggKi8KKyNkZWZpbmUgSURFMF9NQUpPUgkzCisjZGVmaW5lIElERTFfTUFKT1IJMjIKKyNkZWZpbmUgSURFMl9NQUpPUgkzMworI2RlZmluZSBJREUzX01BSk9SCTM0CisjZGVmaW5lIElERTRfTUFKT1IJNTYKKyNkZWZpbmUgSURFNV9NQUpPUgk1NworI2RlZmluZSBJREU2X01BSk9SCTg4CisjZGVmaW5lIElERTdfTUFKT1IJODkKKyNkZWZpbmUgSURFOF9NQUpPUgk5MAorI2RlZmluZSBJREU5X01BSk9SCTkxCisKKworLyogVmFyaW91cyBkZWZpbmVzIHRha2VuIGZyb20gbGludXgvZGV2ZnNfZnMuaCAqLworI2RlZmluZSBERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fS0VSTkVMICA1CisjZGVmaW5lIERFVkZTRF9JT0NUTF9CQVNFCSdkJworLyogIFRoZXNlIGFyZSB0aGUgdmFyaW91cyBpb2N0bHMgICovCisjZGVmaW5lIERFVkZTRElPQ19HRVRfUFJPVE9fUkVWICAgICAgICAgX0lPUihERVZGU0RfSU9DVExfQkFTRSwgMCwgaW50KQorI2RlZmluZSBERVZGU0RJT0NfU0VUX0VWRU5UX01BU0sgICAgICAgIF9JT1coREVWRlNEX0lPQ1RMX0JBU0UsIDIsIGludCkKKyNkZWZpbmUgREVWRlNESU9DX1JFTEVBU0VfRVZFTlRfUVVFVUUgICBfSU9XKERFVkZTRF9JT0NUTF9CQVNFLCAzLCBpbnQpCisjZGVmaW5lIERFVkZTRElPQ19TRVRfQ09ORklHX0RFQlVHX01BU0sgX0lPVyhERVZGU0RfSU9DVExfQkFTRSwgNCwgaW50KQorI2RlZmluZSBERVZGU0RfTk9USUZZX1JFR0lTVEVSRUQgICAgMAorI2RlZmluZSBERVZGU0RfTk9USUZZX1VOUkVHSVNURVJFRCAgMQorI2RlZmluZSBERVZGU0RfTk9USUZZX0FTWU5DX09QRU4gICAgMgorI2RlZmluZSBERVZGU0RfTk9USUZZX0NMT1NFICAgICAgICAgMworI2RlZmluZSBERVZGU0RfTk9USUZZX0xPT0tVUCAgICAgICAgNAorI2RlZmluZSBERVZGU0RfTk9USUZZX0NIQU5HRSAgICAgICAgNQorI2RlZmluZSBERVZGU0RfTk9USUZZX0NSRUFURSAgICAgICAgNgorI2RlZmluZSBERVZGU0RfTk9USUZZX0RFTEVURSAgICAgICAgNworI2RlZmluZSBERVZGU19QQVRITEVOICAgICAgICAgICAgICAgMTAyNAorLyogIE5ldmVyIGNoYW5nZSB0aGlzIG90aGVyd2lzZSB0aGUgYmluYXJ5IGludGVyZmFjZSB3aWxsIGNoYW5nZSAgICovCisKK3N0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCB7CisJLyogIFVzZSBuYXRpdmUgQyB0eXBlcyB0byBlbnN1cmUgc2FtZSB0eXBlcyBpbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UgICAgICovCisJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgICAvKiAgREVWRlNEX05PVElGWV8qIHZhbHVlICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IG1vZGU7ICAgICAgICAgICAvKiAgTW9kZSBvZiB0aGUgaW5vZGUgb3IgZGV2aWNlIGVudHJ5ICAgICAgICovCisJdW5zaWduZWQgaW50IG1ham9yOyAgICAgICAgICAvKiAgTWFqb3IgbnVtYmVyIG9mIGRldmljZSBlbnRyeSAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IG1pbm9yOyAgICAgICAgICAvKiAgTWlub3IgbnVtYmVyIG9mIGRldmljZSBlbnRyeSAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IHVpZDsgICAgICAgICAgICAvKiAgVWlkIG9mIHByb2Nlc3MsIGlub2RlIG9yIGRldmljZSBlbnRyeSAgICovCisJdW5zaWduZWQgaW50IGdpZDsgICAgICAgICAgICAvKiAgR2lkIG9mIHByb2Nlc3MsIGlub2RlIG9yIGRldmljZSBlbnRyeSAgICovCisJdW5zaWduZWQgaW50IG92ZXJydW5fY291bnQ7ICAvKiAgTnVtYmVyIG9mIGxvc3QgZXZlbnRzICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IG5hbWVsZW47ICAgICAgICAvKiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgbm90IGluY2x1ZGluZyAnXDAnICovCisJLyogIFRoZSBkZXZpY2UgbmFtZSBNVVNUIGNvbWUgbGFzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY2hhciBkZXZuYW1lW0RFVkZTX1BBVEhMRU5dOyAvKiAgVGhpcyB3aWxsIGJlICdcMCcgdGVybWluYXRlZCAgICAgICAgICAgICovCit9OworCisjZGVmaW5lIEJVRkZFUl9TSVpFIDE2Mzg0CisjZGVmaW5lIERFVkZTRF9WRVJTSU9OICIxLjMuMjUiCisjZGVmaW5lIENPTkZJR19GSUxFICAiL2V0Yy9kZXZmc2QuY29uZiIKKyNkZWZpbmUgTU9EUFJPQkUJCSIvc2Jpbi9tb2Rwcm9iZSIKKyNkZWZpbmUgTU9EUFJPQkVfU1dJVENIXzEgIi1rIgorI2RlZmluZSBNT0RQUk9CRV9TV0lUQ0hfMiAiLUMiCisjZGVmaW5lIENPTkZJR19NT0RVTEVTX0RFVkZTICIvZXRjL21vZHVsZXMuZGV2ZnMiCisjZGVmaW5lIE1BWF9BUkdTICAgICAoNiArIDEpCisjZGVmaW5lIE1BWF9TVUJFWFBSICAxMAorI2RlZmluZSBTVFJJTkdfTEVOR1RIIDI1NQorCisvKiBmb3IgZ2V0X3VpZF9naWQoKSAqLworI2RlZmluZSBVSUQJCQkwCisjZGVmaW5lIEdJRAkJCTEKKworLyogZm9ya19hbmRfZXhlY3V0ZSgpICovCisjIGRlZmluZSBESUUJCQkxCisjIGRlZmluZSBOT19ESUUJCQkwCisKKy8qIGZvciBkaXJfb3BlcmF0aW9uKCkgKi8KKyNkZWZpbmUgUkVTVE9SRQkJMAorI2RlZmluZSBTRVJWSUNFCQkxCisjZGVmaW5lIFJFQURfQ09ORklHIDIKKworLyogIFVwZGF0ZSBvbmx5IGFmdGVyIGNoYW5naW5nIGNvZGUgdG8gcmVmbGVjdCBuZXcgcHJvdG9jb2wgICovCisjZGVmaW5lIERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04gIDUKKworLyogIENvbXBpbGUtdGltZSBjaGVjayAgKi8KKyNpZiBERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fS0VSTkVMICE9IERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04KKyNlcnJvciBwcm90b2NvbCB2ZXJzaW9uIG1pc21hdGNoLiBVcGRhdGUgeW91ciBrZXJuZWwgaGVhZGVycworI2VuZGlmCisKKyNkZWZpbmUgQUNfUEVSTUlTU0lPTlMJCQkJMAorI2RlZmluZSBBQ19NT0RMT0FECQkJCQkxCisjZGVmaW5lIEFDX0VYRUNVVEUJCQkJCTIKKyNkZWZpbmUgQUNfTUZVTkNUSU9OCQkJCTMJLyogbm90IHN1cHBvcnRlZCBieSBidXN5Ym94ICovCisjZGVmaW5lIEFDX0NGVU5DVElPTgkJCQk0CS8qIG5vdCBzdXBwb3J0ZWQgYnkgYnVzeWJveCAqLworI2RlZmluZSBBQ19DT1BZCQkJCQkJNQorI2RlZmluZSBBQ19JR05PUkUJCQkJCTYKKyNkZWZpbmUgQUNfTUtPTERDT01QQVQJCQkJNworI2RlZmluZSBBQ19NS05FV0NPTVBBVAkJCQk4CisjZGVmaW5lIEFDX1JNT0xEQ09NUEFUCQkJCTkKKyNkZWZpbmUgQUNfUk1ORVdDT01QQVQJCQkJMTAKKyNkZWZpbmUgQUNfUkVTVE9SRQkJCQkJMTEKKworc3RydWN0IHBlcm1pc3Npb25zX3R5cGUgeworCW1vZGVfdCBtb2RlOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7Cit9OworCitzdHJ1Y3QgZXhlY3V0ZV90eXBlIHsKKwljaGFyICphcmd2W01BWF9BUkdTICsgMV07ICAvKiAgYXJndlswXSBtdXN0IGFsd2F5cyBiZSB0aGUgcHJvZ3JhbW1lICAqLworfTsKKworc3RydWN0IGNvcHlfdHlwZSB7CisJY29uc3QgY2hhciAqc291cmNlOworCWNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uOworfTsKKworc3RydWN0IGFjdGlvbl90eXBlIHsKKwl1bnNpZ25lZCBpbnQgd2hhdDsKKwl1bnNpZ25lZCBpbnQgd2hlbjsKK307CisKK3N0cnVjdCBjb25maWdfZW50cnlfc3RydWN0IHsKKwlzdHJ1Y3QgYWN0aW9uX3R5cGUgYWN0aW9uOworCXJlZ2V4X3QgcHJlZzsKKwl1bmlvbgorCXsKKwlzdHJ1Y3QgcGVybWlzc2lvbnNfdHlwZSBwZXJtaXNzaW9uczsKKwlzdHJ1Y3QgZXhlY3V0ZV90eXBlIGV4ZWN1dGU7CisJc3RydWN0IGNvcHlfdHlwZSBjb3B5OworCX0KKwl1OworCXN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICpuZXh0OworfTsKKworc3RydWN0IGdldF92YXJpYWJsZV9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm87CisJY29uc3QgY2hhciAqZGV2bmFtZTsKKwljaGFyIGRldnBhdGhbU1RSSU5HX0xFTkdUSF07Cit9OworCitzdGF0aWMgdm9pZCBkaXJfb3BlcmF0aW9uKGludCAsIGNvbnN0IGNoYXIgKiAsIGludCwgIHVuc2lnbmVkIGxvbmcqKTsKK3N0YXRpYyB2b2lkIHNlcnZpY2Uoc3RydWN0IHN0YXQgc3RhdGJ1ZiwgY2hhciAqcGF0aCk7CitzdGF0aWMgaW50IHN0X2V4cHJfZXhwYW5kKGNoYXIgKiwgdW5zaWduZWQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfb2xkX25hbWUoY29uc3QgY2hhciAqLCB1bnNpZ25lZCwgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIGludCBta3N5bWxpbmsoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCk7CitzdGF0aWMgdm9pZCByZWFkX2NvbmZpZ19maWxlKGNoYXIgKnBhdGgsIGludCBvcHRpb25hbCwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzayk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX2NvbmZpZ19saW5lKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKK3N0YXRpYyBpbnQgIGRvX3NlcnZpY2luZyhpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2VydmljZV9uYW1lKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9wZXJtaXNzaW9ucyhjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKiwgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhY3Rpb25fZXhlY3V0ZShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKiwgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKiwKKwkJCQkJCQljb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9tb2Rsb2FkKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9jb3B5KGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqLCBjb25zdCBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqLAorCQkJCQkJIGNvbnN0IHJlZ21hdGNoX3QgKiwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgYWN0aW9uX2NvbXBhdChjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKiwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZnJlZV9jb25maWcodm9pZCk7CitzdGF0aWMgdm9pZCByZXN0b3JlKGNoYXIgKnNwYXRoLCBzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdCwgaW50IHJvb3RsZW4pOworc3RhdGljIGludCBjb3B5X2lub2RlKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHN0YXQgKiwgbW9kZV90LCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBzdGF0ICopOworc3RhdGljIG1vZGVfdCBnZXRfbW9kZShjb25zdCBjaGFyICopOworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfdmFyaWFibGUoY29uc3QgY2hhciAqLCB2b2lkICopOworc3RhdGljIGludCBtYWtlX2Rpcl90cmVlKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGV4cGFuZF9leHByZXNzaW9uKGNoYXIgKiwgdW5zaWduZWQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqLAorCQkJCQkJCSBjb25zdCBjaGFyICosIGNvbnN0IHJlZ21hdGNoX3QgKiwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZXhwYW5kX3JlZ2V4cChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IHJlZ21hdGNoX3QgKiwgdW5zaWduZWQpOworc3RhdGljIGNvbnN0IGNoYXIgKmV4cGFuZF92YXJpYWJsZSgJY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgKiwgY29uc3QgY2hhciAqLAorCQkJCQkJCQkJY29uc3QgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfdmFyaWFibGVfdjIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICooKikoY29uc3QgY2hhciAqLCB2b2lkICopLCB2b2lkICopOworc3RhdGljIGNoYXIgZ2V0X29sZF9pZGVfbmFtZSh1bnNpZ25lZCAsIHVuc2lnbmVkKTsKK3N0YXRpYyBjaGFyICp3cml0ZV9vbGRfc2RfbmFtZShjaGFyICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgY29uc3QgY2hhciAqKTsKKworLyogYnVzeWJveCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZ2V0X3VpZF9naWQoaW50IGZsYWcsIGNvbnN0IGNoYXIgKnN0cmluZyk7CitzdGF0aWMgdm9pZCBzYWZlX21lbWNweShjaGFyICogZGVzdCwgY29uc3QgY2hhciAqIHNyYywgaW50IGxlbik7CitzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5fZGV2X25hbWVfY29tbW9uKGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCBuLCBpbnQgYWRkZW5kdW0sIGNvbnN0IGNoYXIgKnB0cik7CitzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5fZGV2X25hbWUoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IG4sIGNvbnN0IGNoYXIgKnB0cik7CisKKy8qIFN0cnVjdHMgYW5kIHZhcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZmlyc3RfY29uZmlnID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqbGFzdF9jb25maWcgPSBOVUxMOworc3RhdGljIGNoYXIgKm1vdW50X3BvaW50ID0gTlVMTDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY2F1Z2h0X3NpZ25hbCA9IEZBTFNFOworc3RhdGljIHZvbGF0aWxlIGludCBjYXVnaHRfc2lnaHVwID0gRkFMU0U7CitzdGF0aWMgc3RydWN0IGluaXRpYWxfc3ltbGlua19zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKmRlc3Q7CisJY29uc3QgY2hhciAqbmFtZTsKK30gaW5pdGlhbF9zeW1saW5rc1tdID0geworCXsiL3Byb2Mvc2VsZi9mZCIsICJmZCJ9LAorCXsiZmQvMCIsICJzdGRpbiJ9LAorCXsiZmQvMSIsICJzdGRvdXQifSwKKwl7ImZkLzIiLCAic3RkZXJyIn0sCisJe05VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIHN0cnVjdCBldmVudF90eXBlIHsKKwl1bnNpZ25lZCBpbnQgdHlwZTsgICAgICAgIC8qICBUaGUgREVWRlNEX05PVElGWV8qIHZhbHVlICAgICAgICAgICAgICAgICAgKi8KKwljb25zdCBjaGFyICpjb25maWdfbmFtZTsgIC8qICBUaGUgbmFtZSB1c2VkIGluIHRoZSBjb25maWcgZmlsZSAgICAgICAgICAgKi8KK30gZXZlbnRfdHlwZXNbXSA9IHsKKwl7REVWRlNEX05PVElGWV9SRUdJU1RFUkVELCAgICJSRUdJU1RFUiJ9LAorCXtERVZGU0RfTk9USUZZX1VOUkVHSVNURVJFRCwgIlVOUkVHSVNURVIifSwKKwl7REVWRlNEX05PVElGWV9BU1lOQ19PUEVOLCAgICJBU1lOQ19PUEVOIn0sCisJe0RFVkZTRF9OT1RJRllfQ0xPU0UsICAgICAgICAiQ0xPU0UifSwKKwl7REVWRlNEX05PVElGWV9MT09LVVAsICAgICAgICJMT09LVVAifSwKKwl7REVWRlNEX05PVElGWV9DSEFOR0UsICAgICAgICJDSEFOR0UifSwKKwl7REVWRlNEX05PVElGWV9DUkVBVEUsICAgICAgICJDUkVBVEUifSwKKwl7REVWRlNEX05PVElGWV9ERUxFVEUsICAgICAgICJERUxFVEUifSwKKwl7MHhmZmZmZmZmZiwgICAgICAgICAgICAgICAgIE5VTEx9Cit9OworCisvKiBCdXN5Ym94IG1lc3NhZ2VzICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGJiX21zZ19wcm90b19yZXZbXSBBTElHTjEgICAgICAgICAgPSAicHJvdG9jb2wgcmV2aXNpb24iOworc3RhdGljIGNvbnN0IGNoYXIgYmJfbXNnX2JhZF9jb25maWdbXSBBTElHTjEgICAgICAgICA9ICJiYWQgJXMgY29uZmlnIGZpbGU6ICVzIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJiX21zZ19zbWFsbF9idWZmZXJbXSBBTElHTjEgICAgICAgPSAiYnVmZmVyIHRvbyBzbWFsbCI7CitzdGF0aWMgY29uc3QgY2hhciBiYl9tc2dfdmFyaWFibGVfbm90X2ZvdW5kW10gQUxJR04xID0gInZhcmlhYmxlOiAlcyBub3QgZm91bmQiOworCisvKiBCdXN5Ym94IHN0dWZmICovCisjaWYgRU5BQkxFX0RFVkZTRF9WRVJCT1NFIHx8IEVOQUJMRV9ERUJVRworI2RlZmluZSBpbmZvX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBiYl9pbmZvX21zZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIG1zZ19sb2dnZXIocCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgIGJiX2Vycm9yX21zZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIG1zZ19sb2dnZXJfYW5kX2RpZShwLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgIGJiX2Vycm9yX21zZ19hbmRfZGllKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgZXJyb3JfbG9nZ2VyKHAsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgYmJfcGVycm9yX21zZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGVycm9yX2xvZ2dlcl9hbmRfZGllKHAsIGZtdCwgYXJncy4uLikgICAgICAgIGJiX3BlcnJvcl9tc2dfYW5kX2RpZShmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBpbmZvX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIG1zZ19sb2dnZXIocCwgZm10LCBhcmdzLi4uKQorI2RlZmluZSBtc2dfbG9nZ2VyX2FuZF9kaWUocCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpCisjZGVmaW5lIGVycm9yX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIGVycm9yX2xvZ2dlcl9hbmRfZGllKHAsIGZtdCwgYXJncy4uLikgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzYWZlX21lbWNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIGludCBsZW4pCit7CisJbWVtY3B5KGRlc3QgLCBzcmMsIGxlbik7CisJZGVzdFtsZW5dID0gJ1wwJzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2Rldl9uYW1lX2NvbW1vbihjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgbiwgaW50IGFkZGVuZHVtLCBjb25zdCBjaGFyICpwdHIpCit7CisJaWYgKGRbbiAtIDRdID09ICdkJyAmJiBkW24gLSAzXSA9PSAnaScgJiYgZFtuIC0gMl0gPT0gJ3MnICYmIGRbbiAtIDFdID09ICdjJykKKwkJcmV0dXJuIDIgKyBhZGRlbmR1bTsKKwlpZiAoZFtuIC0gMl0gPT0gJ2MnICYmIGRbbiAtIDFdID09ICdkJykKKwkJcmV0dXJuIDMgKyBhZGRlbmR1bTsKKwlpZiAocHRyWzBdID09ICdwJyAmJiBwdHJbMV0gPT0gJ2EnICYmIHB0clsyXSA9PSAncicgJiYgcHRyWzNdID09ICd0JykKKwkJcmV0dXJuIDQgKyBhZGRlbmR1bTsKKwlpZiAocHRyW24gLSAyXSA9PSAnbScgJiYgcHRyW24gLSAxXSA9PSAndCcpCisJCXJldHVybiA1ICsgYWRkZW5kdW07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Nhbl9kZXZfbmFtZShjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgbiwgY29uc3QgY2hhciAqcHRyKQoreworCWlmIChkWzBdID09ICdzJyAmJiBkWzFdID09ICdjJyAmJiBkWzJdID09ICdzJyAmJiBkWzNdID09ICdpJyAmJiBkWzRdID09ICcvJykgeworCQlpZiAoZFtuIC0gN10gPT0gJ2cnICYmIGRbbiAtIDZdID09ICdlJyAmJiBkW24gLSA1XSA9PSAnbicKKwkJCSYmIGRbbiAtIDRdID09ICdlJyAmJiBkW24gLSAzXSA9PSAncicgJiYgZFtuIC0gMl0gPT0gJ2knICYmIGRbbiAtIDFdID09ICdjJworCQkpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHNjYW5fZGV2X25hbWVfY29tbW9uKGQsIG4sIDAsIHB0cik7CisJfQorCWlmIChkWzBdID09ICdpJyAmJiBkWzFdID09ICdkJyAmJiBkWzJdID09ICdlJyAmJiBkWzNdID09ICcvJworCQkmJiBkWzRdID09ICdoJyAmJiBkWzVdID09ICdvJyAmJiBkWzZdID09ICdzJyAmJiBkWzddID09ICd0JworCSkKKwkJcmV0dXJuIHNjYW5fZGV2X25hbWVfY29tbW9uKGQsIG4sIDQsIHB0cik7CisJaWYgKGRbMF0gPT0gJ3MnICYmIGRbMV0gPT0gJ2InICYmIGRbMl0gPT0gJ3AnICYmIGRbM10gPT0gJy8nKQorCQlyZXR1cm4gMTA7CisJaWYgKGRbMF0gPT0gJ3YnICYmIGRbMV0gPT0gJ2MnICYmIGRbMl0gPT0gJ2MnICYmIGRbM10gPT0gJy8nKQorCQlyZXR1cm4gMTE7CisJaWYgKGRbMF0gPT0gJ3AnICYmIGRbMV0gPT0gJ3QnICYmIGRbMl0gPT0gJ3knICYmIGRbM10gPT0gJy8nKQorCQlyZXR1cm4gMTI7CisJcmV0dXJuIDA7Cit9CisKKy8qICBQdWJsaWMgZnVuY3Rpb25zIGZvbGxvdyAgKi8KKworaW50IGRldmZzZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGV2ZnNkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBwcmludF92ZXJzaW9uID0gRkFMU0U7CisJaW50IGRvX2RhZW1vbiA9IFRSVUU7CisJaW50IG5vX3BvbGxpbmcgPSBGQUxTRTsKKwlpbnQgZG9fc2NhbjsKKwlpbnQgZmQsIHByb3RvX3JldiwgY291bnQ7CisJdW5zaWduZWQgbG9uZyBldmVudF9tYXNrID0gMDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3Rpb247CisJc3RydWN0IGluaXRpYWxfc3ltbGlua19zdHJ1Y3QgKmN1cnI7CisKKwlpZiAoYXJnYyA8IDIpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWZvciAoY291bnQgPSAyOyBjb3VudCA8IGFyZ2M7ICsrY291bnQpIHsKKwkJaWYgKGFyZ3ZbY291bnRdWzBdID09ICctJykgeworCQkJaWYgKGFyZ3ZbY291bnRdWzFdID09ICd2JyAmJiAhYXJndltjb3VudF1bMl0pIC8qIC12ICovCisJCQkJcHJpbnRfdmVyc2lvbiA9IFRSVUU7CisJCQllbHNlIGlmIChFTkFCTEVfREVWRlNEX0ZHX05QICYmIGFyZ3ZbY291bnRdWzFdID09ICdmJworCQkJICYmIGFyZ3ZbY291bnRdWzJdID09ICdnJyAmJiAhYXJndltjb3VudF1bM10pIC8qIC1mZyAqLworCQkJCWRvX2RhZW1vbiA9IEZBTFNFOworCQkJZWxzZSBpZiAoRU5BQkxFX0RFVkZTRF9GR19OUCAmJiBhcmd2W2NvdW50XVsxXSA9PSAnbicKKwkJCSAmJiBhcmd2W2NvdW50XVsyXSA9PSAncCcgJiYgIWFyZ3ZbY291bnRdWzNdKSAvKiAtbnAgKi8KKwkJCQlub19wb2xsaW5nID0gVFJVRTsKKwkJCWVsc2UKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisKKwltb3VudF9wb2ludCA9IGJiX3NpbXBsaWZ5X3BhdGgoYXJndlsxXSk7CisKKwl4Y2hkaXIobW91bnRfcG9pbnQpOworCisJZmQgPSB4b3BlbigiLmRldmZzZCIsIE9fUkRPTkxZKTsKKwljbG9zZV9vbl9leGVjX29uKGZkKTsKKwl4aW9jdGwoZmQsIERFVkZTRElPQ19HRVRfUFJPVE9fUkVWLCAmcHJvdG9fcmV2KTsKKworCS8qc2V0dXAgaW5pdGlhbCBlbnRyaWVzICovCisJZm9yIChjdXJyID0gaW5pdGlhbF9zeW1saW5rczsgY3Vyci0+ZGVzdCAhPSBOVUxMOyArK2N1cnIpCisJCXN5bWxpbmsoY3Vyci0+ZGVzdCwgY3Vyci0+bmFtZSk7CisKKwkvKiBOQjogVGhlIGNoZWNrIGZvciBDT05GSUdfRklMRSBpcyBkb25lIGluIHJlYWRfY29uZmlnX2ZpbGUoKSAqLworCisJaWYgKHByaW50X3ZlcnNpb24gfHwgKERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04gIT0gcHJvdG9fcmV2KSkgeworCQlwcmludGYoIiVzIHYlc1xuRGFlbW9uICVzOlx0JWRcbktlcm5lbC1zaWRlICVzOlx0JWRcbiIsCisJCQkJYXBwbGV0X25hbWUsIERFVkZTRF9WRVJTSU9OLCBiYl9tc2dfcHJvdG9fcmV2LAorCQkJCURFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04sIGJiX21zZ19wcm90b19yZXYsIHByb3RvX3Jldik7CisJCWlmIChERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fREFFTU9OICE9IHByb3RvX3JldikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBtaXNtYXRjaCEiLCBiYl9tc2dfcHJvdG9fcmV2KTsKKwkJZXhpdChFWElUX1NVQ0NFU1MpOyAvKiAtdiAqLworCX0KKwkvKiAgVGVsbCBrZXJuZWwgd2UgYXJlIHNwZWNpYWwoaS5lLiB3ZSBnZXQgdG8gc2VlIGhpZGRlbiBlbnRyaWVzKSAgKi8KKwl4aW9jdGwoZmQsIERFVkZTRElPQ19TRVRfRVZFTlRfTUFTSywgMCk7CisKKwkvKiAgU2V0IHVwIFNJR0hVUCBhbmQgU0lHVVNSMSBoYW5kbGVycyAgKi8KKwlzaWdlbXB0eXNldCgmbmV3X2FjdGlvbi5zYV9tYXNrKTsKKwluZXdfYWN0aW9uLnNhX2ZsYWdzID0gMDsKKwluZXdfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWduYWxfaGFuZGxlcjsKKwlzaWdhY3Rpb25fc2V0KFNJR0hVUCwgJm5ld19hY3Rpb24pOworCXNpZ2FjdGlvbl9zZXQoU0lHVVNSMSwgJm5ld19hY3Rpb24pOworCisJcHJpbnRmKCIlcyB2JXMgc3RhcnRlZCBmb3IgJXNcbiIsIGFwcGxldF9uYW1lLCBERVZGU0RfVkVSU0lPTiwgbW91bnRfcG9pbnQpOworCisJLyogIFNldCB1bWFzayBzbyB0aGF0IG1rbm9kKDIpLCBvcGVuKDIpIGFuZCBta2RpcigyKSBoYXZlIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBwZXJtaXNzaW9ucyAgKi8KKwl1bWFzaygwKTsKKwlyZWFkX2NvbmZpZ19maWxlKChjaGFyKilDT05GSUdfRklMRSwgRkFMU0UsICZldmVudF9tYXNrKTsKKwkvKiAgRG8gdGhlIHNjYW4gYmVmb3JlIGZvcmtpbmcsIHNvIHRoYXQgYm9vdCBzY3JpcHRzIHNlZSB0aGUgZmluaXNoZWQgcHJvZHVjdCAgKi8KKwlkaXJfb3BlcmF0aW9uKFNFUlZJQ0UsIG1vdW50X3BvaW50LCAwLCBOVUxMKTsKKworCWlmIChFTkFCTEVfREVWRlNEX0ZHX05QICYmIG5vX3BvbGxpbmcpCisJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKworCWlmIChFTkFCTEVfREVWRlNEX1ZFUkJPU0UgfHwgRU5BQkxFX0RFQlVHKQorCQlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCWVsc2UgaWYgKGRvX2RhZW1vbiA9PSBUUlVFKQorCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJLyogVGhpcyBpcyB0aGUgZGVmYXVsdCAqLworCS8qZWxzZQorCQlsb2dtb2RlID0gTE9HTU9ERV9TVERJTzsgKi8KKworCWlmIChkb19kYWVtb24pIHsKKwkJLyogIFJlbGVhc2Ugc28gdGhhdCB0aGUgY2hpbGQgY2FuIGdyYWIgaXQgICovCisJCXhpb2N0bChmZCwgREVWRlNESU9DX1JFTEVBU0VfRVZFTlRfUVVFVUUsIDApOworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoMCwgYXJndik7CisJfSBlbHNlIGlmIChFTkFCTEVfREVWRlNEX0ZHX05QKSB7CisJCXNldHBnaWQoMCwgMCk7ICAvKiAgQmVjb21lIHByb2Nlc3MgZ3JvdXAgbGVhZGVyICAgICAgICAgICAgICAgICAgICAqLworCX0KKworCXdoaWxlIChUUlVFKSB7CisJCWRvX3NjYW4gPSBkb19zZXJ2aWNpbmcoZmQsIGV2ZW50X21hc2spOworCisJCWZyZWVfY29uZmlnKCk7CisJCXJlYWRfY29uZmlnX2ZpbGUoKGNoYXIqKUNPTkZJR19GSUxFLCBGQUxTRSwgJmV2ZW50X21hc2spOworCQlpZiAoZG9fc2NhbikKKwkJCWRpcl9vcGVyYXRpb24oU0VSVklDRSwgbW91bnRfcG9pbnQsIDAsIE5VTEwpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUobW91bnRfcG9pbnQpOworfSAgIC8qICBFbmQgRnVuY3Rpb24gbWFpbiAgKi8KKworCisvKiAgUHJpdmF0ZSBmdW5jdGlvbnMgZm9sbG93ICAqLworCitzdGF0aWMgdm9pZCByZWFkX2NvbmZpZ19maWxlKGNoYXIgKnBhdGgsIGludCBvcHRpb25hbCwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gUmVhZCBhIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UuCisgICAgPHBhdGg+IFRoZSBwYXRoIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGZyb20uIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIGFsbAorICAgIGVudHJpZXMgaW4gdGhhdCBkaXJlY3Rvcnkgd2lsbCBiZSByZWFkKGV4Y2VwdCBoaWRkZW4gZW50cmllcykuCisgICAgPG9wdGlvbmFsPiBJZiBUUlVFLCB0aGUgcm91dGluZSB3aWxsIHNpbGVudGx5IGlnbm9yZSBhIG1pc3NpbmcgY29uZmlnIGZpbGUuCisgICAgPGV2ZW50X21hc2s+IFRoZSBldmVudCBtYXNrIGlzIHdyaXR0ZW4gaGVyZS4gVGhpcyBpcyBub3QgaW5pdGlhbGlzZWQuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJRklMRSAqZnA7CisJY2hhciBidWZbU1RSSU5HX0xFTkdUSF07CisJY2hhciAqbGluZSA9IE5VTEw7CisJY2hhciAqcDsKKworCWlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisJCS8qIERvbid0IHJlYWQgMCBsZW5ndGggZmlsZXM6IGlnbm9yZWQgKi8KKwkJLyppZiAoc3RhdGJ1Zi5zdF9zaXplID09IDApCisJCQkJcmV0dXJuOyovCisJCWlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJCXAgPSBiYl9zaW1wbGlmeV9wYXRoKHBhdGgpOworCQkJZGlyX29wZXJhdGlvbihSRUFEX0NPTkZJRywgcCwgMCwgZXZlbnRfbWFzayk7CisJCQlmcmVlKHApOworCQkJcmV0dXJuOworCQl9CisJCWZwID0gZm9wZW5fZm9yX3JlYWQocGF0aCk7CisJCWlmIChmcCAhPSBOVUxMKSB7CisJCQl3aGlsZSAoZmdldHMoYnVmLCBTVFJJTkdfTEVOR1RILCBmcCkgIT0gTlVMTCkgeworCQkJCS8qICBTa2lwIHdoaXRlc3BhY2UgICovCisJCQkJbGluZSA9IGJ1ZjsKKwkJCQlsaW5lID0gc2tpcF93aGl0ZXNwYWNlKGxpbmUpOworCQkJCWlmIChsaW5lWzBdID09ICdcMCcgfHwgbGluZVswXSA9PSAnIycpCisJCQkJCWNvbnRpbnVlOworCQkJCXByb2Nlc3NfY29uZmlnX2xpbmUobGluZSwgZXZlbnRfbWFzayk7CisJCQl9CisJCQlmY2xvc2UoZnApOworCQl9IGVsc2UgeworCQkJZ290byByZWFkX2NvbmZpZ19maWxlX2VycjsKKwkJfQorCX0gZWxzZSB7CityZWFkX2NvbmZpZ19maWxlX2VycjoKKwkJaWYgKG9wdGlvbmFsID09IDAgJiYgZXJybm8gPT0gRU5PRU5UKQorCQkJZXJyb3JfbG9nZ2VyX2FuZF9kaWUoTE9HX0VSUiwgInJlYWQgY29uZmlnIGZpbGU6ICVzIiwgcGF0aCk7CisJfQorfSAgIC8qICBFbmQgRnVuY3Rpb24gcmVhZF9jb25maWdfZmlsZSAgICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY29uZmlnX2xpbmUoY29uc3QgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gUHJvY2VzcyBhIGxpbmUgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICA8bGluZT4gVGhlIGNvbmZpZ3VyYXRpb24gbGluZS4KKyAgICA8ZXZlbnRfbWFzaz4gVGhlIGV2ZW50IG1hc2sgaXMgd3JpdHRlbiBoZXJlLiBUaGlzIGlzIG5vdCBpbml0aWFsaXNlZC4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJaW50ICBudW1fYXJncywgY291bnQ7CisJc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKm5ldzsKKwljaGFyIHBbTUFYX0FSR1NdW1NUUklOR19MRU5HVEhdOworCWNoYXIgd2hlbltTVFJJTkdfTEVOR1RIXSwgd2hhdFtTVFJJTkdfTEVOR1RIXTsKKwljaGFyIG5hbWVbU1RSSU5HX0xFTkdUSF07CisJY29uc3QgY2hhciAqbXNnID0gIiI7CisJY2hhciAqcHRyOworCWludCBpOworCisJLyogISEhISBPbmx5IFVwcGVyY2FzZSBLZXl3b3JkcyBpbiBkZXZzZmQuY29uZiAqLworCXN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCQkiQ0xFQVJfQ09ORklHXDAiIklOQ0xVREVcMCIiT1BUSU9OQUxfSU5DTFVERVwwIgorCQkiUkVTVE9SRVwwIiJQRVJNSVNTSU9OU1wwIiJNT0RMT0FEXDAiIkVYRUNVVEVcMCIKKwkJIkNPUFlcMCIiSUdOT1JFXDAiIk1LT0xEQ09NUEFUXDAiIk1LTkVXQ09NUEFUXDAiCisJCSJSTU9MRENPTVBBVFwwIiJSTU5FV0NPTVBBVFwwIjsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWF9BUkdTOyArK2NvdW50KQorCQlwW2NvdW50XVswXSA9ICdcMCc7CisJbnVtX2FyZ3MgPSBzc2NhbmYobGluZSwgIiVzICVzICVzICVzICVzICVzICVzICVzICVzICVzIiwKKwkJCXdoZW4sIG5hbWUsIHdoYXQsCisJCQlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdKTsKKworCWkgPSBpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsIHdoZW4pOworCisJLyogIkNMRUFSX0NPTkZJRyIgKi8KKwlpZiAoaSA9PSAwKSB7CisJCWZyZWVfY29uZmlnKCk7CisJCSpldmVudF9tYXNrID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChudW1fYXJncyA8IDIpCisJCWdvdG8gcHJvY2Vzc19jb25maWdfbGluZV9lcnI7CisKKwkvKiAiSU5DTFVERSIgJiAiT1BUSU9OQUxfSU5DTFVERSIgKi8KKwlpZiAoaSA9PSAxIHx8IGkgPT0gMikgeworCQlzdF9leHByX2V4cGFuZChuYW1lLCBTVFJJTkdfTEVOR1RILCBuYW1lLCBnZXRfdmFyaWFibGUsIE5VTEwpOworCQlpbmZvX2xvZ2dlcihMT0dfSU5GTywgIiVzaW5jbHVkZTogJXMiLCAodG91cHBlcih3aGVuWzBdKSA9PSAnSScpID8gIiI6ICJvcHRpb25hbF8iLCBuYW1lKTsKKwkJcmVhZF9jb25maWdfZmlsZShuYW1lLCAodG91cHBlcih3aGVuWzBdKSA9PSAnSScpID8gRkFMU0UgOiBUUlVFLCBldmVudF9tYXNrKTsKKwkJcmV0dXJuOworCX0KKwkvKiAiUkVTVE9SRSIgKi8KKwlpZiAoaSA9PSAzKSB7CisJCWRpcl9vcGVyYXRpb24oUkVTVE9SRSwgbmFtZSwgc3RybGVuKG5hbWUpLE5VTEwpOworCQlyZXR1cm47CisJfQorCWlmIChudW1fYXJncyA8IDMpCisJCWdvdG8gcHJvY2Vzc19jb25maWdfbGluZV9lcnI7CisKKwluZXcgPSB4emFsbG9jKHNpemVvZiAqbmV3KTsKKworCWZvciAoY291bnQgPSAwOyBldmVudF90eXBlc1tjb3VudF0uY29uZmlnX25hbWUgIT0gTlVMTDsgKytjb3VudCkgeworCQlpZiAoc3RyY2FzZWNtcCh3aGVuLCBldmVudF90eXBlc1tjb3VudF0uY29uZmlnX25hbWUpICE9IDApCisJCQljb250aW51ZTsKKwkJbmV3LT5hY3Rpb24ud2hlbiA9IGV2ZW50X3R5cGVzW2NvdW50XS50eXBlOworCQlicmVhazsKKwl9CisJaWYgKGV2ZW50X3R5cGVzW2NvdW50XS5jb25maWdfbmFtZSA9PSBOVUxMKSB7CisJCW1zZyA9ICJXSEVOIGluIjsKKwkJZ290byBwcm9jZXNzX2NvbmZpZ19saW5lX2VycjsKKwl9CisKKwlpID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCB3aGF0KTsKKworCXN3aXRjaCAoaSkgeworCQljYXNlIDQ6CS8qICJQRVJNSVNTSU9OUyIgKi8KKwkJCW5ldy0+YWN0aW9uLndoYXQgPSBBQ19QRVJNSVNTSU9OUzsKKwkJCS8qICBHZXQgdXNlciBhbmQgZ3JvdXAgICovCisJCQlwdHIgPSBzdHJjaHIocFswXSwgJy4nKTsKKwkJCWlmIChwdHIgPT0gTlVMTCkgeworCQkJCW1zZyA9ICJVSUQuR0lEIjsKKwkJCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOyAvKiJtaXNzaW5nICcuJyBpbiBVSUQuR0lEIiovCisJCQl9CisKKwkJCSpwdHIrKyA9ICdcMCc7CisJCQluZXctPnUucGVybWlzc2lvbnMudWlkID0gZ2V0X3VpZF9naWQoVUlELCBwWzBdKTsKKwkJCW5ldy0+dS5wZXJtaXNzaW9ucy5naWQgPSBnZXRfdWlkX2dpZChHSUQsIHB0cik7CisJCQkvKiAgR2V0IG1vZGUgICovCisJCQluZXctPnUucGVybWlzc2lvbnMubW9kZSA9IGdldF9tb2RlKHBbMV0pOworCQkJYnJlYWs7CisJCWNhc2UgNToJLyogIE1PRExPQUQgKi8KKwkJCS8qVGhpcyAgYWN0aW9uIHdpbGwgcGFzcyAiL2Rldi8kZGV2bmFtZSIoaS5lLiAiL2Rldi8iIHByZWZpeGVkIHRvCisJCQl0aGUgZGV2aWNlIG5hbWUpIHRvIHRoZSBtb2R1bGUgbG9hZGluZyAgZmFjaWxpdHkuICBJbiAgYWRkaXRpb24sCisJCQl0aGUgL2V0Yy9tb2R1bGVzLmRldmZzIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB1c2VkLiovCisJCQkgaWYgKEVOQUJMRV9ERVZGU0RfTU9ETE9BRCkKKwkJCQluZXctPmFjdGlvbi53aGF0ID0gQUNfTU9ETE9BRDsKKwkJCSBicmVhazsKKwkJY2FzZSA2OiAvKiBFWEVDVVRFICovCisJCQluZXctPmFjdGlvbi53aGF0ID0gQUNfRVhFQ1VURTsKKwkJCW51bV9hcmdzIC09IDM7CisKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG51bV9hcmdzOyArK2NvdW50KQorCQkJCW5ldy0+dS5leGVjdXRlLmFyZ3ZbY291bnRdID0geHN0cmR1cChwW2NvdW50XSk7CisKKwkJCW5ldy0+dS5leGVjdXRlLmFyZ3ZbbnVtX2FyZ3NdID0gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIDc6IC8qIENPUFkgKi8KKwkJCW5ldy0+YWN0aW9uLndoYXQgPSBBQ19DT1BZOworCQkJbnVtX2FyZ3MgLT0gMzsKKwkJCWlmIChudW1fYXJncyAhPSAyKQorCQkJCWdvdG8gcHJvY2Vzc19jb25maWdfbGluZV9lcnI7IC8qIG1pc3NpbmcgcGF0aCBhbmQgZnVuY3Rpb24gaW4gbGluZSAqLworCisJCQluZXctPnUuY29weS5zb3VyY2UgPSB4c3RyZHVwKHBbMF0pOworCQkJbmV3LT51LmNvcHkuZGVzdGluYXRpb24gPSB4c3RyZHVwKHBbMV0pOworCQkJYnJlYWs7CisJCWNhc2UgODogLyogSUdOT1JFICovCisJCS8qIEZBTExUUk9VR0ggKi8KKwkJY2FzZSA5OiAvKiBNS09MRENPTVBBVCAqLworCQkvKiBGQUxMVFJPVUdIICovCisJCWNhc2UgMTA6IC8qIE1LTkVXQ09NUEFUICovCisJCS8qIEZBTExUUk9VR0ggKi8KKwkJY2FzZSAxMTovKiBSTU9MRENPTVBBVCAqLworCQkvKiBGQUxMVFJPVUdIICovCisJCWNhc2UgMTI6IC8qIFJNTkVXQ09NUEFUICovCisJCS8qCUFDX0lHTk9SRQkJCQkJNgorCQkJQUNfTUtPTERDT01QQVQJCQkJNworCQkJQUNfTUtORVdDT01QQVQJCQkJOAorCQkJQUNfUk1PTERDT01QQVQJCQkJOQorCQkJQUNfUk1ORVdDT01QQVQJCQkJMTAqLworCQkJbmV3LT5hY3Rpb24ud2hhdCA9IGkgLSAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltc2cgPSAiV0hBVCBpbiI7CisJCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOworCQkvKmVzYWMqLworCX0gLyogc3dpdGNoIChpKSAqLworCisJeHJlZ2NvbXAoJm5ldy0+cHJlZywgbmFtZSwgUkVHX0VYVEVOREVEKTsKKworCSpldmVudF9tYXNrIHw9IDEgPDwgbmV3LT5hY3Rpb24ud2hlbjsKKwluZXctPm5leHQgPSBOVUxMOworCWlmIChmaXJzdF9jb25maWcgPT0gTlVMTCkKKwkJZmlyc3RfY29uZmlnID0gbmV3OworCWVsc2UKKwkJbGFzdF9jb25maWctPm5leHQgPSBuZXc7CisJbGFzdF9jb25maWcgPSBuZXc7CisJcmV0dXJuOworCisgcHJvY2Vzc19jb25maWdfbGluZV9lcnI6CisJbXNnX2xvZ2dlcl9hbmRfZGllKExPR19FUlIsIGJiX21zZ19iYWRfY29uZmlnLCBtc2cgLCBsaW5lKTsKK30gIC8qICBFbmQgRnVuY3Rpb24gcHJvY2Vzc19jb25maWdfbGluZSAgICovCisKK3N0YXRpYyBpbnQgZG9fc2VydmljaW5nKGludCBmZCwgdW5zaWduZWQgbG9uZyBldmVudF9tYXNrKQorLyogIFtTVU1NQVJZXSBTZXJ2aWNlIGRldmZzIGNoYW5nZXMgdW50aWwgYSBzaWduYWwgaXMgcmVjZWl2ZWQuCisgICAgPGZkPiBUaGUgb3BlbiBjb250cm9sIGZpbGUuCisgICAgPGV2ZW50X21hc2s+IFRoZSBldmVudCBtYXNrLgorICAgIFtSRVRVUk5TXSBUUlVFIGlmIFNJR0hVUCB3YXMgY2F1Z2h0LCBlbHNlIEZBTFNFLgorKi8KK3sKKwlzc2l6ZV90IGJ5dGVzOworCXN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCBpbmZvOworCisJLyogKHZvaWQqKSBjYXN0IGlzIG9ubHkgaW4gb3JkZXIgdG8gbWF0Y2ggcHJvdG90eXBlICovCisJeGlvY3RsKGZkLCBERVZGU0RJT0NfU0VUX0VWRU5UX01BU0ssICh2b2lkKilldmVudF9tYXNrKTsKKwl3aGlsZSAoIWNhdWdodF9zaWduYWwpIHsKKwkJZXJybm8gPSAwOworCQlieXRlcyA9IHJlYWQoZmQsIChjaGFyICopICZpbmZvLCBzaXplb2YgaW5mbyk7CisJCWlmIChjYXVnaHRfc2lnbmFsKQorCQkJYnJlYWs7ICAgICAgLyogIE11c3QgdGVzdCBmb3IgdGhpcyBmaXJzdCAgICAgKi8KKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7ICAvKiAgWWVzLCB0aGUgb3JkZXIgaXMgaW1wb3J0YW50ICAqLworCQlpZiAoYnl0ZXMgPCAxKQorCQkJYnJlYWs7CisJCXNlcnZpY2VfbmFtZSgmaW5mbyk7CisJfQorCWlmIChjYXVnaHRfc2lnbmFsKSB7CisJCWludCBjX3NpZ2h1cCA9IGNhdWdodF9zaWdodXA7CisKKwkJY2F1Z2h0X3NpZ25hbCA9IEZBTFNFOworCQljYXVnaHRfc2lnaHVwID0gRkFMU0U7CisJCXJldHVybiBjX3NpZ2h1cDsKKwl9CisJbXNnX2xvZ2dlcl9hbmRfZGllKExPR19FUlIsICJyZWFkIGVycm9yIG9uIGNvbnRyb2wgZmlsZSIpOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZG9fc2VydmljaW5nICAqLworCitzdGF0aWMgdm9pZCBzZXJ2aWNlX25hbWUoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvKQorLyogIFtTVU1NQVJZXSBTZXJ2aWNlIGEgc2luZ2xlIGRldmZzIGNoYW5nZS4KKyAgICA8aW5mbz4gVGhlIGRldmZzIGNoYW5nZS4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJdW5zaWduZWQgaW50IG47CisJcmVnbWF0Y2hfdCBtYnVmW01BWF9TVUJFWFBSXTsKKwlzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZW50cnk7CisKKwlpZiAoRU5BQkxFX0RFQlVHICYmIGluZm8tPm92ZXJydW5fY291bnQgPiAwKQorCQltc2dfbG9nZ2VyKExPR19FUlIsICJsb3N0ICV1IGV2ZW50cyIsIGluZm8tPm92ZXJydW5fY291bnQpOworCisJLyogIERpc2NhcmQgbG9va3VwcyBvbiAiL2Rldi9sb2ciIGFuZCAiL2Rldi9pbml0Y3RsIiAgKi8KKwlpZiAoaW5mby0+dHlwZSA9PSBERVZGU0RfTk9USUZZX0xPT0tVUAorCQkmJiAoKGluZm8tPmRldm5hbWVbMF0gPT0gJ2wnICYmIGluZm8tPmRldm5hbWVbMV0gPT0gJ28nCisJCSYmIGluZm8tPmRldm5hbWVbMl0gPT0gJ2cnICYmICFpbmZvLT5kZXZuYW1lWzNdKQorCQl8fCAoaW5mby0+ZGV2bmFtZVswXSA9PSAnaScgJiYgaW5mby0+ZGV2bmFtZVsxXSA9PSAnbicKKwkJJiYgaW5mby0+ZGV2bmFtZVsyXSA9PSAnaScgJiYgaW5mby0+ZGV2bmFtZVszXSA9PSAndCcKKwkJJiYgaW5mby0+ZGV2bmFtZVs0XSA9PSAnYycgJiYgaW5mby0+ZGV2bmFtZVs1XSA9PSAndCcKKwkJJiYgaW5mby0+ZGV2bmFtZVs2XSA9PSAnbCcgJiYgIWluZm8tPmRldm5hbWVbN10pKQorCSkKKwkJcmV0dXJuOworCisJZm9yIChlbnRyeSA9IGZpcnN0X2NvbmZpZzsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQkvKiAgRmlyc3QgY2hlY2sgaWYgYWN0aW9uIG1hdGNoZXMgdGhlIHR5cGUsIHRoZW4gY2hlY2sgaWYgbmFtZSBtYXRjaGVzICovCisJCWlmIChpbmZvLT50eXBlICE9IGVudHJ5LT5hY3Rpb24ud2hlbgorCQl8fCByZWdleGVjKCZlbnRyeS0+cHJlZywgaW5mby0+ZGV2bmFtZSwgTUFYX1NVQkVYUFIsIG1idWYsIDApICE9IDApCisJCQljb250aW51ZTsKKwkJZm9yIChuID0gMDsobiA8IE1BWF9TVUJFWFBSKSAmJiAobWJ1ZltuXS5ybV9zbyAhPSAtMSk7ICsrbikKKwkJCS8qIFZPSUQgKi87CisKKwkJc3dpdGNoIChlbnRyeS0+YWN0aW9uLndoYXQpIHsKKwkJCWNhc2UgQUNfUEVSTUlTU0lPTlM6CisJCQkJYWN0aW9uX3Blcm1pc3Npb25zKGluZm8sIGVudHJ5KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNfTU9ETE9BRDoKKwkJCQlpZiAoRU5BQkxFX0RFVkZTRF9NT0RMT0FEKQorCQkJCQlhY3Rpb25fbW9kbG9hZChpbmZvLCBlbnRyeSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDX0VYRUNVVEU6CisJCQkJYWN0aW9uX2V4ZWN1dGUoaW5mbywgZW50cnksIG1idWYsIG4pOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ19DT1BZOgorCQkJCWFjdGlvbl9jb3B5KGluZm8sIGVudHJ5LCBtYnVmLCBuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNfSUdOT1JFOgorCQkJCXJldHVybjsKKwkJCQkvKmJyZWFrOyovCisJCQljYXNlIEFDX01LT0xEQ09NUEFUOgorCQkJY2FzZSBBQ19NS05FV0NPTVBBVDoKKwkJCWNhc2UgQUNfUk1PTERDT01QQVQ6CisJCQljYXNlIEFDX1JNTkVXQ09NUEFUOgorCQkJCWFjdGlvbl9jb21wYXQoaW5mbywgZW50cnktPmFjdGlvbi53aGF0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbXNnX2xvZ2dlcl9hbmRfZGllKExPR19FUlIsICJVbmtub3duIGFjdGlvbiIpOworCQl9CisJfQorfSAgIC8qICBFbmQgRnVuY3Rpb24gc2VydmljZV9uYW1lICAqLworCitzdGF0aWMgdm9pZCBhY3Rpb25fcGVybWlzc2lvbnMoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICplbnRyeSkKKy8qICBbU1VNTUFSWV0gVXBkYXRlIHBlcm1pc3Npb25zIGZvciBhIGRldmljZSBlbnRyeS4KKyAgICA8aW5mbz4gVGhlIGRldmZzIGNoYW5nZS4KKyAgICA8ZW50cnk+IFRoZSBjb25maWcgZmlsZSBlbnRyeS4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCWlmIChzdGF0KGluZm8tPmRldm5hbWUsICZzdGF0YnVmKSAhPSAwCisJIHx8IGNobW9kKGluZm8tPmRldm5hbWUsIChzdGF0YnVmLnN0X21vZGUgJiBTX0lGTVQpIHwgKGVudHJ5LT51LnBlcm1pc3Npb25zLm1vZGUgJiB+U19JRk1UKSkgIT0gMAorCSB8fCBjaG93bihpbmZvLT5kZXZuYW1lLCBlbnRyeS0+dS5wZXJtaXNzaW9ucy51aWQsIGVudHJ5LT51LnBlcm1pc3Npb25zLmdpZCkgIT0gMAorCSkKKwkJZXJyb3JfbG9nZ2VyKExPR19FUlIsICJDYW4ndCBjaG1vZCBvciBjaG93bjogJXMiLCBpbmZvLT5kZXZuYW1lKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGFjdGlvbl9wZXJtaXNzaW9ucyAgKi8KKworc3RhdGljIHZvaWQgYWN0aW9uX21vZGxvYWQoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvLAorCQkJICAgIGNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICplbnRyeSBVTlVTRURfUEFSQU0pCisvKiAgW1NVTU1BUlldIExvYWQgYSBtb2R1bGUuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgPGVudHJ5PiBUaGUgY29uZmlnIGZpbGUgZW50cnkuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCWNoYXIgKmFyZ3ZbNl07CisKKwlhcmd2WzBdID0gKGNoYXIqKU1PRFBST0JFOworCWFyZ3ZbMV0gPSAoY2hhciopTU9EUFJPQkVfU1dJVENIXzE7IC8qICItayIgKi8KKwlhcmd2WzJdID0gKGNoYXIqKU1PRFBST0JFX1NXSVRDSF8yOyAvKiAiLUMiICovCisJYXJndlszXSA9IChjaGFyKilDT05GSUdfTU9EVUxFU19ERVZGUzsKKwlhcmd2WzRdID0gY29uY2F0X3BhdGhfZmlsZSgiL2RldiIsIGluZm8tPmRldm5hbWUpOyAvKiBkZXZpY2UgKi8KKwlhcmd2WzVdID0gTlVMTDsKKworCXNwYXduX2FuZF93YWl0KGFyZ3YpOworCWZyZWUoYXJndls0XSk7Cit9ICAvKiAgRW5kIEZ1bmN0aW9uIGFjdGlvbl9tb2Rsb2FkICAqLworCitzdGF0aWMgdm9pZCBhY3Rpb25fZXhlY3V0ZShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm8sCisJCQkgICAgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5LAorCQkJICAgIGNvbnN0IHJlZ21hdGNoX3QgKnJlZ2V4cHIsIHVuc2lnbmVkIGludCBudW1leHByKQorLyogIFtTVU1NQVJZXSBFeGVjdXRlIGEgcHJvZ3JhbW1lLgorICAgIDxpbmZvPiBUaGUgZGV2ZnMgY2hhbmdlLgorICAgIDxlbnRyeT4gVGhlIGNvbmZpZyBmaWxlIGVudHJ5LgorICAgIDxyZWdleHByPiBUaGUgbnVtYmVyIG9mIHN1YmV4cHJlc3Npb24oc3RhcnQsIGVuZCkgb2Zmc2V0cyB3aXRoaW4gdGhlCisgICAgZGV2aWNlIG5hbWUuCisgICAgPG51bWV4cHI+IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aGluIDw8cmVnZXhwcj4+LgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJc3RydWN0IGdldF92YXJpYWJsZV9pbmZvIGd2X2luZm87CisJY2hhciAqYXJndltNQVhfQVJHUyArIDFdOworCWNoYXIgbGFyZ3ZbTUFYX0FSR1MgKyAxXVtTVFJJTkdfTEVOR1RIXTsKKworCWd2X2luZm8uaW5mbyA9IGluZm87CisJZ3ZfaW5mby5kZXZuYW1lID0gaW5mby0+ZGV2bmFtZTsKKwlzbnByaW50Zihndl9pbmZvLmRldnBhdGgsIHNpemVvZihndl9pbmZvLmRldnBhdGgpLCAiJXMvJXMiLCBtb3VudF9wb2ludCwgaW5mby0+ZGV2bmFtZSk7CisJZm9yIChjb3VudCA9IDA7IGVudHJ5LT51LmV4ZWN1dGUuYXJndltjb3VudF0gIT0gTlVMTDsgKytjb3VudCkgeworCQlleHBhbmRfZXhwcmVzc2lvbihsYXJndltjb3VudF0sIFNUUklOR19MRU5HVEgsCisJCQkJZW50cnktPnUuZXhlY3V0ZS5hcmd2W2NvdW50XSwKKwkJCQlnZXRfdmFyaWFibGUsICZndl9pbmZvLAorCQkJCWd2X2luZm8uZGV2bmFtZSwgcmVnZXhwciwgbnVtZXhwcik7CisJCWFyZ3ZbY291bnRdID0gbGFyZ3ZbY291bnRdOworCX0KKwlhcmd2W2NvdW50XSA9IE5VTEw7CisJc3Bhd25fYW5kX3dhaXQoYXJndik7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBhY3Rpb25fZXhlY3V0ZSAgKi8KKworCitzdGF0aWMgdm9pZCBhY3Rpb25fY29weShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm8sCisJCQkgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5LAorCQkJIGNvbnN0IHJlZ21hdGNoX3QgKnJlZ2V4cHIsIHVuc2lnbmVkIGludCBudW1leHByKQorLyogIFtTVU1NQVJZXSBDb3B5IHBlcm1pc3Npb25zLgorICAgIDxpbmZvPiBUaGUgZGV2ZnMgY2hhbmdlLgorICAgIDxlbnRyeT4gVGhlIGNvbmZpZyBmaWxlIGVudHJ5LgorICAgIDxyZWdleHByPiBUaGlzIGxpc3Qgb2Ygc3ViZXhwcmVzc2lvbihzdGFydCwgZW5kKSBvZmZzZXRzIHdpdGhpbiB0aGUKKyAgICBkZXZpY2UgbmFtZS4KKyAgICA8bnVtZXhwcj4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiA8PHJlZ2V4cHI+Pi4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJbW9kZV90IG5ld19tb2RlOworCXN0cnVjdCBnZXRfdmFyaWFibGVfaW5mbyBndl9pbmZvOworCXN0cnVjdCBzdGF0IHNvdXJjZV9zdGF0LCBkZXN0X3N0YXQ7CisJY2hhciBzb3VyY2VbU1RSSU5HX0xFTkdUSF0sIGRlc3RpbmF0aW9uW1NUUklOR19MRU5HVEhdOworCWludCByZXQgPSAwOworCisJZGVzdF9zdGF0LnN0X21vZGUgPSAwOworCisJaWYgKChpbmZvLT50eXBlID09IERFVkZTRF9OT1RJRllfQ0hBTkdFKSAmJiBTX0lTTE5LKGluZm8tPm1vZGUpKQorCQlyZXR1cm47CisJZ3ZfaW5mby5pbmZvID0gaW5mbzsKKwlndl9pbmZvLmRldm5hbWUgPSBpbmZvLT5kZXZuYW1lOworCisJc25wcmludGYoZ3ZfaW5mby5kZXZwYXRoLCBzaXplb2YoZ3ZfaW5mby5kZXZwYXRoKSwgIiVzLyVzIiwgbW91bnRfcG9pbnQsIGluZm8tPmRldm5hbWUpOworCWV4cGFuZF9leHByZXNzaW9uKHNvdXJjZSwgU1RSSU5HX0xFTkdUSCwgZW50cnktPnUuY29weS5zb3VyY2UsCisJCQkJZ2V0X3ZhcmlhYmxlLCAmZ3ZfaW5mbywgZ3ZfaW5mby5kZXZuYW1lLAorCQkJCXJlZ2V4cHIsIG51bWV4cHIpOworCisJZXhwYW5kX2V4cHJlc3Npb24oZGVzdGluYXRpb24sIFNUUklOR19MRU5HVEgsIGVudHJ5LT51LmNvcHkuZGVzdGluYXRpb24sCisJCQkJZ2V0X3ZhcmlhYmxlLCAmZ3ZfaW5mbywgZ3ZfaW5mby5kZXZuYW1lLAorCQkJCXJlZ2V4cHIsIG51bWV4cHIpOworCisJaWYgKCFtYWtlX2Rpcl90cmVlKGRlc3RpbmF0aW9uKSB8fCBsc3RhdChzb3VyY2UsICZzb3VyY2Vfc3RhdCkgIT0gMCkKKwkJCXJldHVybjsKKwlsc3RhdChkZXN0aW5hdGlvbiwgJmRlc3Rfc3RhdCk7CisJbmV3X21vZGUgPSBzb3VyY2Vfc3RhdC5zdF9tb2RlICYgflNfSVNWVFg7CisJaWYgKGluZm8tPnR5cGUgPT0gREVWRlNEX05PVElGWV9DUkVBVEUpCisJCW5ld19tb2RlIHw9IFNfSVNWVFg7CisJZWxzZSBpZiAoKGluZm8tPnR5cGUgPT0gREVWRlNEX05PVElGWV9DSEFOR0UpICYmKGRlc3Rfc3RhdC5zdF9tb2RlICYgU19JU1ZUWCkpCisJCW5ld19tb2RlIHw9IFNfSVNWVFg7CisJcmV0ID0gY29weV9pbm9kZShkZXN0aW5hdGlvbiwgJmRlc3Rfc3RhdCwgbmV3X21vZGUsIHNvdXJjZSwgJnNvdXJjZV9zdGF0KTsKKwlpZiAoRU5BQkxFX0RFQlVHICYmIHJldCAmJiAoZXJybm8gIT0gRUVYSVNUKSkKKwkJZXJyb3JfbG9nZ2VyKExPR19FUlIsICJjb3B5X2lub2RlOiAlcyB0byAlcyIsIHNvdXJjZSwgZGVzdGluYXRpb24pOworfSAgIC8qICBFbmQgRnVuY3Rpb24gYWN0aW9uX2NvcHkgICovCisKK3N0YXRpYyB2b2lkIGFjdGlvbl9jb21wYXQoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQorLyogIFtTVU1NQVJZXSBQcm9jZXNzIGEgY29tcGF0aWJpbGl0eSByZXF1ZXN0LgorICAgIDxpbmZvPiBUaGUgZGV2ZnMgY2hhbmdlLgorICAgIDxhY3Rpb24+IFRoZSBhY3Rpb24gdG8gdGFrZS4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJaW50IHJldDsKKwljb25zdCBjaGFyICpjb21wYXRfbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqZGVzdF9uYW1lID0gaW5mby0+ZGV2bmFtZTsKKwljb25zdCBjaGFyICpwdHI7CisJY2hhciBjb21wYXRfYnVmW1NUUklOR19MRU5HVEhdLCBkZXN0X2J1ZltTVFJJTkdfTEVOR1RIXTsKKwlpbnQgbW9kZSwgaG9zdCwgYnVzLCB0YXJnZXQsIGx1bjsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyIHJld2luZF87CisJLyogMSB0byA1ICAic2NzaS8iICwgNiB0byA5ICJpZGUvaG9zdCIgKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZm10W10gPSB7CisJCU5VTEwgLAorCQkic2cvYyVkYiVkdCVkdSVkIiwJCS8qIHNjc2kvZ2VuZXJpYyAqLworCQkic2QvYyVkYiVkdCVkdSVkIiwJCS8qIHNjc2kvZGlzYyAqLworCQkic3IvYyVkYiVkdCVkdSVkIiwJCS8qIHNjc2kvY2QgKi8KKwkJInNkL2MlZGIlZHQlZHUlZHAlZCIsCQkvKiBzY3NpL3BhcnQgKi8KKwkJInN0L2MlZGIlZHQlZHUlZG0lZCVjIiwJCS8qIHNjc2kvbXQgKi8KKwkJImlkZS9oZC9jJWRiJWR0JWR1JWQiLAkJLyogaWRlL2hvc3QvZGlzYyAqLworCQkiaWRlL2NkL2MlZGIlZHQlZHUlZCIsCQkvKiBpZGUvaG9zdC9jZCAqLworCQkiaWRlL2hkL2MlZGIlZHQlZHUlZHAlZCIsCS8qIGlkZS9ob3N0L3BhcnQgKi8KKwkJImlkZS9tdC9jJWRiJWR0JWR1JWQlcyIsCS8qIGlkZS9ob3N0L210ICovCisJCU5VTEwKKwl9OworCisJLyogIEZpcnN0IGNvbnN0cnVjdCBjb21wYXRpYmlsaXR5IG5hbWUgICovCisJc3dpdGNoIChhY3Rpb24pIHsKKwkJY2FzZSBBQ19NS09MRENPTVBBVDoKKwkJY2FzZSBBQ19STU9MRENPTVBBVDoKKwkJCWNvbXBhdF9uYW1lID0gZ2V0X29sZF9uYW1lKGluZm8tPmRldm5hbWUsIGluZm8tPm5hbWVsZW4sIGNvbXBhdF9idWYsIGluZm8tPm1ham9yLCBpbmZvLT5taW5vcik7CisJCQlicmVhazsKKwkJY2FzZSBBQ19NS05FV0NPTVBBVDoKKwkJY2FzZSBBQ19STU5FV0NPTVBBVDoKKwkJCXB0ciA9IGJiX2Jhc2VuYW1lKGluZm8tPmRldm5hbWUpOworCQkJaSA9IHNjYW5fZGV2X25hbWUoaW5mby0+ZGV2bmFtZSwgaW5mby0+bmFtZWxlbiwgcHRyKTsKKworCQkJLyogbm90aGluZyBmb3VuZCAqLworCQkJaWYgKGkgPT0gMCB8fCBpID4gOSkKKwkJCQlyZXR1cm47CisKKwkJCXNzY2FuZihpbmZvLT5kZXZuYW1lICsgKChpIDwgNikgPyA1IDogNCksICJob3N0JWQvYnVzJWQvdGFyZ2V0JWQvbHVuJWQvIiwgJmhvc3QsICZidXMsICZ0YXJnZXQsICZsdW4pOworCQkJc25wcmludGYoZGVzdF9idWYsIHNpemVvZihkZXN0X2J1ZiksICIuLi8lcyIsIGluZm8tPmRldm5hbWUgKyAoKCBpID4gNSkgPyA0IDogMCkpOworCQkJZGVzdF9uYW1lID0gZGVzdF9idWY7CisJCQljb21wYXRfbmFtZSA9IGNvbXBhdF9idWY7CisKKworCQkJLyogMSA9PSBzY3NpL2dlbmVyaWMgIDIgPT0gc2NzaS9kaXNjIDMgPT0gc2NzaS9jZCA2ID09IGlkZS9ob3N0L2Rpc2MgNyA9PSBpZGUvaG9zdC9jZCAqLworCQkJaWYgKGkgPT0gMSB8fCBpID09IDIgfHwgaSA9PSAzIHx8IGkgPT0gNiB8fCBpID09NykKKwkJCQlzcHJpbnRmKGNvbXBhdF9idWYsIGZtdFtpXSwgaG9zdCwgYnVzLCB0YXJnZXQsIGx1bik7CisKKwkJCS8qIDQgPT0gc2NzaS9wYXJ0IDggPT0gaWRlL2hvc3QvcGFydCAqLworCQkJaWYgKGkgPT0gNCB8fCBpID09IDgpCisJCQkJc3ByaW50Zihjb21wYXRfYnVmLCBmbXRbaV0sIGhvc3QsIGJ1cywgdGFyZ2V0LCBsdW4sIGF0b2kocHRyICsgNCkpOworCisJCQkvKiA1ID09IHNjc2kvbXQgKi8KKwkJCWlmIChpID09IDUpIHsKKwkJCQlyZXdpbmRfID0gaW5mby0+ZGV2bmFtZVtpbmZvLT5uYW1lbGVuIC0gMV07CisJCQkJaWYgKHJld2luZF8gIT0gJ24nKQorCQkJCQlyZXdpbmRfID0gJ1wwJzsKKwkJCQltb2RlPTA7CisJCQkJaWYgKHB0clsyXSA9PSAgJ2wnIC8qMTA4Ki8gfHwgcHRyWzJdID09ICdtJy8qMTA5Ki8pCisJCQkJCW1vZGUgPSBwdHJbMl0gLSAxMDc7IC8qIDEgb3IgMiAqLworCQkJCWlmIChwdHJbMl0gPT0gICdhJykKKwkJCQkJbW9kZSA9IDM7CisJCQkJc3ByaW50Zihjb21wYXRfYnVmLCBmbXRbaV0sIGhvc3QsIGJ1cywgdGFyZ2V0LCBsdW4sIG1vZGUsIHJld2luZF8pOworCQkJfQorCisJCQkvKiA5ID09IGlkZS9ob3N0L210ICovCisJCQlpZiAoaSA9PSAgOSkKKwkJCQlzbnByaW50Zihjb21wYXRfYnVmLCBzaXplb2YoY29tcGF0X2J1ZiksIGZtdFtpXSwgaG9zdCwgYnVzLCB0YXJnZXQsIGx1biwgcHRyICsgMik7CisJCS8qIGVzYWMgKi8KKwl9IC8qIHN3aXRjaCAoYWN0aW9uKSAqLworCisJaWYgKGNvbXBhdF9uYW1lID09IE5VTEwpCisJCXJldHVybjsKKworCS8qICBOb3cgZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdCAgKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCQljYXNlIEFDX01LT0xEQ09NUEFUOgorCQljYXNlIEFDX01LTkVXQ09NUEFUOgorCQkJbWtzeW1saW5rKGRlc3RfbmFtZSwgY29tcGF0X25hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgQUNfUk1PTERDT01QQVQ6CisJCWNhc2UgQUNfUk1ORVdDT01QQVQ6CisJCQlyZXQgPSB1bmxpbmsoY29tcGF0X25hbWUpOworCQkJaWYgKEVOQUJMRV9ERUJVRyAmJiByZXQpCisJCQkJZXJyb3JfbG9nZ2VyKExPR19FUlIsICJ1bmxpbms6ICVzIiwgY29tcGF0X25hbWUpOworCQkJYnJlYWs7CisJCS8qZXNhYyovCisJfSAvKiBzd2l0Y2ggKGFjdGlvbikgKi8KK30gICAvKiAgRW5kIEZ1bmN0aW9uIGFjdGlvbl9jb21wYXQgICovCisKK3N0YXRpYyB2b2lkIHJlc3RvcmUoY2hhciAqc3BhdGgsIHN0cnVjdCBzdGF0IHNvdXJjZV9zdGF0LCBpbnQgcm9vdGxlbikKK3sKKwljaGFyICpkcGF0aDsKKwlzdHJ1Y3Qgc3RhdCBkZXN0X3N0YXQ7CisKKwlkZXN0X3N0YXQuc3RfbW9kZSA9IDA7CisJZHBhdGggPSBjb25jYXRfcGF0aF9maWxlKG1vdW50X3BvaW50LCBzcGF0aCArIHJvb3RsZW4pOworCWxzdGF0KGRwYXRoLCAmZGVzdF9zdGF0KTsKKwlmcmVlKGRwYXRoKTsKKwlpZiAoU19JU0xOSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSB8fCAoc291cmNlX3N0YXQuc3RfbW9kZSAmIFNfSVNWVFgpKQorCQljb3B5X2lub2RlKGRwYXRoLCAmZGVzdF9zdGF0LCAoc291cmNlX3N0YXQuc3RfbW9kZSAmIH5TX0lTVlRYKSwgc3BhdGgsICZzb3VyY2Vfc3RhdCk7CisKKwlpZiAoU19JU0RJUihzb3VyY2Vfc3RhdC5zdF9tb2RlKSkKKwkJZGlyX29wZXJhdGlvbihSRVNUT1JFLCBzcGF0aCwgcm9vdGxlbiwgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBjb3B5X2lub2RlKGNvbnN0IGNoYXIgKmRlc3RwYXRoLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqZGVzdF9zdGF0LAorCQkJbW9kZV90IG5ld19tb2RlLAorCQkJY29uc3QgY2hhciAqc291cmNlcGF0aCwgY29uc3Qgc3RydWN0IHN0YXQgKnNvdXJjZV9zdGF0KQorLyogIFtTVU1NQVJZXSBDb3B5IGFuIGlub2RlLgorICAgIDxkZXN0cGF0aD4gVGhlIGRlc3RpbmF0aW9uIHBhdGguIEFuIGV4aXN0aW5nIGlub2RlIG1heSBiZSBkZWxldGVkLgorICAgIDxkZXN0X3N0YXQ+IFRoZSBkZXN0aW5hdGlvbiBzdGF0KDIpIGluZm9ybWF0aW9uLgorICAgIDxuZXdfbW9kZT4gVGhlIGRlc2lyZWQgbmV3IG1vZGUgZm9yIHRoZSBkZXN0aW5hdGlvbi4KKyAgICA8c291cmNlcGF0aD4gVGhlIHNvdXJjZSBwYXRoLgorICAgIDxzb3VyY2Vfc3RhdD4gVGhlIHNvdXJjZSBzdGF0KDIpIGluZm9ybWF0aW9uLgorICAgIFtSRVRVUk5TXSBUUlVFIG9uIHN1Y2Nlc3MsIGVsc2UgRkFMU0UuCisqLworeworCWludCBzb3VyY2VfbGVuLCBkZXN0X2xlbjsKKwljaGFyIHNvdXJjZV9saW5rW1NUUklOR19MRU5HVEhdLCBkZXN0X2xpbmtbU1RSSU5HX0xFTkdUSF07CisJaW50IGZkLCB2YWw7CisJc3RydWN0IHNvY2thZGRyX3VuIHVuX2FkZHI7CisJY2hhciBzeW1saW5rX3ZhbFtTVFJJTkdfTEVOR1RIXTsKKworCWlmICgoc291cmNlX3N0YXQtPnN0X21vZGUgJiBTX0lGTVQpID09KGRlc3Rfc3RhdC0+c3RfbW9kZSAmIFNfSUZNVCkpIHsKKwkJLyogIFNhbWUgdHlwZSAgKi8KKwkJaWYgKFNfSVNMTksoc291cmNlX3N0YXQtPnN0X21vZGUpKSB7CisJCQlzb3VyY2VfbGVuID0gcmVhZGxpbmsoc291cmNlcGF0aCwgc291cmNlX2xpbmssIFNUUklOR19MRU5HVEggLSAxKTsKKwkJCWlmICgoc291cmNlX2xlbiA8IDApCisJCQkgfHwgKGRlc3RfbGVuID0gcmVhZGxpbmsoZGVzdHBhdGgsIGRlc3RfbGluaywgU1RSSU5HX0xFTkdUSCAtIDEpKSA8IDAKKwkJCSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlzb3VyY2VfbGlua1tzb3VyY2VfbGVuXQk9ICdcMCc7CisJCQlkZXN0X2xpbmtbZGVzdF9sZW5dCT0gJ1wwJzsKKwkJCWlmICgoc291cmNlX2xlbiAhPSBkZXN0X2xlbikgfHwgKHN0cmNtcChzb3VyY2VfbGluaywgZGVzdF9saW5rKSAhPSAwKSkgeworCQkJCXVubGluayhkZXN0cGF0aCk7CisJCQkJc3ltbGluayhzb3VyY2VfbGluaywgZGVzdHBhdGgpOworCQkJfQorCQkJcmV0dXJuIFRSVUU7CisJCX0gICAvKiAgRWxzZSBub3QgYSBzeW1saW5rICAqLworCQljaG1vZChkZXN0cGF0aCwgbmV3X21vZGUgJiB+U19JRk1UKTsKKwkJY2hvd24oZGVzdHBhdGgsIHNvdXJjZV9zdGF0LT5zdF91aWQsIHNvdXJjZV9zdGF0LT5zdF9naWQpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyogIERpZmZlcmVudCB0eXBlczogdW5saW5rIGFuZCBjcmVhdGUgICovCisJdW5saW5rKGRlc3RwYXRoKTsKKwlzd2l0Y2ggKHNvdXJjZV9zdGF0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJCWNhc2UgU19JRlNPQ0s6CisJCQlmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWJyZWFrOworCQkJdW5fYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKwkJCXNucHJpbnRmKHVuX2FkZHIuc3VuX3BhdGgsIHNpemVvZih1bl9hZGRyLnN1bl9wYXRoKSwgIiVzIiwgZGVzdHBhdGgpOworCQkJdmFsID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmdW5fYWRkciwgKGludCkgc2l6ZW9mIHVuX2FkZHIpOworCQkJY2xvc2UoZmQpOworCQkJaWYgKHZhbCAhPSAwIHx8IGNobW9kKGRlc3RwYXRoLCBuZXdfbW9kZSAmIH5TX0lGTVQpICE9IDApCisJCQkJYnJlYWs7CisJCQlnb3RvIGRvX2Nob3duOworCQljYXNlIFNfSUZMTks6CisJCQl2YWwgPSByZWFkbGluayhzb3VyY2VwYXRoLCBzeW1saW5rX3ZhbCwgU1RSSU5HX0xFTkdUSCAtIDEpOworCQkJaWYgKHZhbCA8IDApCisJCQkJYnJlYWs7CisJCQlzeW1saW5rX3ZhbFt2YWxdID0gJ1wwJzsKKwkJCWlmIChzeW1saW5rKHN5bWxpbmtfdmFsLCBkZXN0cGF0aCkgPT0gMCkKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZSRUc6CisJCQlmZCA9IG9wZW4oZGVzdHBhdGgsIE9fUkRPTkxZIHwgT19DUkVBVCwgbmV3X21vZGUgJiB+U19JRk1UKTsKKwkJCWlmIChmZCA8IDApCisJCQkJYnJlYWs7CisJCQljbG9zZShmZCk7CisJCQlpZiAoY2htb2QoZGVzdHBhdGgsIG5ld19tb2RlICYgflNfSUZNVCkgIT0gMCkKKwkJCQlicmVhazsKKwkJCWdvdG8gZG9fY2hvd247CisJCWNhc2UgU19JRkJMSzoKKwkJY2FzZSBTX0lGQ0hSOgorCQljYXNlIFNfSUZJRk86CisJCQlpZiAobWtub2QoZGVzdHBhdGgsIG5ld19tb2RlLCBzb3VyY2Vfc3RhdC0+c3RfcmRldikgIT0gMCkKKwkJCQlicmVhazsKKwkJCWdvdG8gZG9fY2hvd247CisJCWNhc2UgU19JRkRJUjoKKwkJCWlmIChta2RpcihkZXN0cGF0aCwgbmV3X21vZGUgJiB+U19JRk1UKSAhPSAwKQorCQkJCWJyZWFrOworZG9fY2hvd246CisJCQlpZiAoY2hvd24oZGVzdHBhdGgsIHNvdXJjZV9zdGF0LT5zdF91aWQsIHNvdXJjZV9zdGF0LT5zdF9naWQpID09IDApCisJCQkJcmV0dXJuIFRSVUU7CisJCS8qYnJlYWs7Ki8KKwl9CisJcmV0dXJuIEZBTFNFOworfSAgIC8qICBFbmQgRnVuY3Rpb24gY29weV9pbm9kZSAgKi8KKworc3RhdGljIHZvaWQgZnJlZV9jb25maWcodm9pZCkKKy8qICBbU1VNTUFSWV0gRnJlZSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmNfZW50cnk7CisJdm9pZCAqbmV4dDsKKworCWZvciAoY19lbnRyeSA9IGZpcnN0X2NvbmZpZzsgY19lbnRyeSAhPSBOVUxMOyBjX2VudHJ5ID0gbmV4dCkgeworCQl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwkJbmV4dCA9IGNfZW50cnktPm5leHQ7CisJCXJlZ2ZyZWUoJmNfZW50cnktPnByZWcpOworCQlpZiAoY19lbnRyeS0+YWN0aW9uLndoYXQgPT0gQUNfRVhFQ1VURSkgeworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUFYX0FSR1M7ICsrY291bnQpIHsKKwkJCQlpZiAoY19lbnRyeS0+dS5leGVjdXRlLmFyZ3ZbY291bnRdID09IE5VTEwpCisJCQkJCWJyZWFrOworCQkJCWZyZWUoY19lbnRyeS0+dS5leGVjdXRlLmFyZ3ZbY291bnRdKTsKKwkJCX0KKwkJfQorCQlmcmVlKGNfZW50cnkpOworCX0KKwlmaXJzdF9jb25maWcgPSBOVUxMOworCWxhc3RfY29uZmlnID0gTlVMTDsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGZyZWVfY29uZmlnICAqLworCitzdGF0aWMgaW50IGdldF91aWRfZ2lkKGludCBmbGFnLCBjb25zdCBjaGFyICpzdHJpbmcpCisvKiAgW1NVTU1BUlldIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBVSUQgb3IgR0lEIHZhbHVlLgorCTxmbGFnPiAiVUlEIiBvciAiR0lEIi4KKwk8c3RyaW5nPiBUaGUgc3RyaW5nLgorICAgIFtSRVRVUk5TXSBUaGUgVUlEIG9yIEdJRCB2YWx1ZS4KKyovCit7CisJc3RydWN0IHBhc3N3ZCAqcHdfZW50OworCXN0cnVjdCBncm91cCAqZ3JwX2VudDsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXNnOworCisJaWYgKEVOQUJMRV9ERVZGU0RfVkVSQk9TRSkKKwkJbXNnID0gInVzZXIiOworCisJaWYgKGlzZGlnaXQoc3RyaW5nWzBdKSB8fCgoc3RyaW5nWzBdID09ICctJykgJiYgaXNkaWdpdChzdHJpbmdbMV0pKSkKKwkJcmV0dXJuIGF0b2koc3RyaW5nKTsKKworCWlmIChmbGFnID09IFVJRCAmJiAocHdfZW50ID0gZ2V0cHduYW0oc3RyaW5nKSkgIT0gTlVMTCkKKwkJcmV0dXJuIHB3X2VudC0+cHdfdWlkOworCisJaWYgKGZsYWcgPT0gR0lEICYmIChncnBfZW50ID0gZ2V0Z3JuYW0oc3RyaW5nKSkgIT0gTlVMTCkKKwkJcmV0dXJuIGdycF9lbnQtPmdyX2dpZDsKKwllbHNlIGlmIChFTkFCTEVfREVWRlNEX1ZFUkJPU0UpCisJCW1zZyA9ICJncm91cCI7CisKKwlpZiAoRU5BQkxFX0RFVkZTRF9WRVJCT1NFKQorCQltc2dfbG9nZ2VyKExPR19FUlIsICJ1bmtub3duICVzOiAlcywgZGVmYXVsdGluZyB0byAlY2lkPTAiLCAgbXNnLCBzdHJpbmcsIG1zZ1swXSk7CisJcmV0dXJuIDA7Cit9LyogIEVuZCBGdW5jdGlvbiBnZXRfdWlkX2dpZCAgKi8KKworc3RhdGljIG1vZGVfdCBnZXRfbW9kZShjb25zdCBjaGFyICpzdHJpbmcpCisvKiAgW1NVTU1BUlldIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBtb2RlIHZhbHVlLgorICAgIDxzdHJpbmc+IFRoZSBzdHJpbmcuCisgICAgW1JFVFVSTlNdIFRoZSBtb2RlIHZhbHVlLgorKi8KK3sKKwltb2RlX3QgbW9kZTsKKwlpbnQgaTsKKworCWlmIChpc2RpZ2l0KHN0cmluZ1swXSkpCisJCXJldHVybiBzdHJ0b3VsKHN0cmluZywgTlVMTCwgOCk7CisJaWYgKHN0cmxlbihzdHJpbmcpICE9IDkpCisJCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCAiYmFkIG1vZGU6ICVzIiwgc3RyaW5nKTsKKworCW1vZGUgPSAwOworCWkgPSBTX0lSVVNSOworCXdoaWxlIChpID4gMCkgeworCQlpZiAoc3RyaW5nWzBdID09ICdyJyB8fCBzdHJpbmdbMF0gPT0gJ3cnIHx8IHN0cmluZ1swXSA9PSAneCcpCisJCQltb2RlICs9IGk7CisJCWkgPSBpIC8gMjsKKwkJc3RyaW5nKys7CisJfQorCXJldHVybiBtb2RlOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZ2V0X21vZGUgICovCisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisJY2F1Z2h0X3NpZ25hbCA9IFRSVUU7CisJaWYgKHNpZyA9PSBTSUdIVVApCisJCWNhdWdodF9zaWdodXAgPSBUUlVFOworCisJaW5mb19sb2dnZXIoTE9HX0lORk8sICJDYXVnaHQgc2lnbmFsICVkIiwgc2lnKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIHNpZ25hbF9oYW5kbGVyICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3ZhcmlhYmxlKGNvbnN0IGNoYXIgKnZhcmlhYmxlLCB2b2lkICppbmZvKQoreworCXN0YXRpYyBjaGFyIHNidWZbc2l6ZW9mKGludCkqMyArIDJdOyAvKiBzaWduIGFuZCBOVUwgKi8KKwlzdGF0aWMgY2hhciAqaG9zdG5hbWU7CisKKwlzdHJ1Y3QgZ2V0X3ZhcmlhYmxlX2luZm8gKmd2X2luZm8gPSBpbmZvOworCWNvbnN0IGNoYXIgKmZpZWxkX25hbWVzW10gPSB7CisJCQkiaG9zdG5hbWUiLCAibW50cHQiLCAiZGV2cGF0aCIsICJkZXZuYW1lIiwKKwkJCSJ1aWQiLCAiZ2lkIiwgIm1vZGUiLCBob3N0bmFtZSwgbW91bnRfcG9pbnQsCisJCQlndl9pbmZvLT5kZXZwYXRoLCBndl9pbmZvLT5kZXZuYW1lLCBOVUxMCisJfTsKKwlpbnQgaTsKKworCWlmICghaG9zdG5hbWUpCisJCWhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCS8qIGluZGV4X2luX3N0cl9hcnJheSByZXR1cm5zIGk+PTAgICovCisJaSA9IGluZGV4X2luX3N0cl9hcnJheShmaWVsZF9uYW1lcywgdmFyaWFibGUpOworCisJaWYgKGkgPiA2IHx8IGkgPCAwIHx8IChpID4gMSAmJiBndl9pbmZvID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoaSA+PSAwICYmIGkgPD0gMykKKwkJcmV0dXJuIGZpZWxkX25hbWVzW2kgKyA3XTsKKworCWlmIChpID09IDQpCisJCXNwcmludGYoc2J1ZiwgIiV1IiwgZ3ZfaW5mby0+aW5mby0+dWlkKTsKKwllbHNlIGlmIChpID09IDUpCisJCXNwcmludGYoc2J1ZiwgIiV1IiwgZ3ZfaW5mby0+aW5mby0+Z2lkKTsKKwllbHNlIGlmIChpID09IDYpCisJCXNwcmludGYoc2J1ZiwgIiVvIiwgZ3ZfaW5mby0+aW5mby0+bW9kZSk7CisJcmV0dXJuIHNidWY7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBnZXRfdmFyaWFibGUgICovCisKK3N0YXRpYyB2b2lkIHNlcnZpY2Uoc3RydWN0IHN0YXQgc3RhdGJ1ZiwgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgaW5mbzsKKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mIGluZm8pOworCWluZm8udHlwZSA9IERFVkZTRF9OT1RJRllfUkVHSVNURVJFRDsKKwlpbmZvLm1vZGUgPSBzdGF0YnVmLnN0X21vZGU7CisJaW5mby5tYWpvciA9IG1ham9yKHN0YXRidWYuc3RfcmRldik7CisJaW5mby5taW5vciA9IG1pbm9yKHN0YXRidWYuc3RfcmRldik7CisJaW5mby51aWQgPSBzdGF0YnVmLnN0X3VpZDsKKwlpbmZvLmdpZCA9IHN0YXRidWYuc3RfZ2lkOworCXNucHJpbnRmKGluZm8uZGV2bmFtZSwgc2l6ZW9mKGluZm8uZGV2bmFtZSksICIlcyIsIHBhdGggKyBzdHJsZW4obW91bnRfcG9pbnQpICsgMSk7CisJaW5mby5uYW1lbGVuID0gc3RybGVuKGluZm8uZGV2bmFtZSk7CisJc2VydmljZV9uYW1lKCZpbmZvKTsKKwlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKQorCQlkaXJfb3BlcmF0aW9uKFNFUlZJQ0UsIHBhdGgsIDAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBkaXJfb3BlcmF0aW9uKGludCB0eXBlLCBjb25zdCBjaGFyICogZGlyX25hbWUsIGludCB2YXIsIHVuc2lnbmVkIGxvbmcgKmV2ZW50X21hc2spCisvKiAgW1NVTU1BUlldIFNjYW4gYSBkaXJlY3RvcnkgdHJlZSBhbmQgZ2VuZXJhdGUgcmVnaXN0ZXIgZXZlbnRzIG9uIGxlYWYgbm9kZXMuCisJPGZsYWc+IFRvIGNob29zZSB3aGljaCBmdW5jdGlvbiB0byBwZXJmb3JtCisJPGRwPiBUaGUgZGlyZWN0b3J5IHBvaW50ZXIuIFRoaXMgaXMgY2xvc2VkIHVwb24gY29tcGxldGlvbi4KKyAgICA8ZGlyX25hbWU+IFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkuCisJPHJvb3RsZW4+IHN0cmluZyBsZW5ndGggcGFyYW1ldGVyLgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCURJUiAqZHA7CisJc3RydWN0IGRpcmVudCAqZGU7CisJY2hhciAqcGF0aDsKKworCWRwID0gd2Fybl9vcGVuZGlyKGRpcl9uYW1lKTsKKwlpZiAoZHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZHApKSAhPSBOVUxMKSB7CisKKwkJaWYgKGRlLT5kX25hbWUgJiYgRE9UX09SX0RPVERPVChkZS0+ZF9uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlwYXRoID0gY29uY2F0X3BhdGhfZmlsZShkaXJfbmFtZSwgZGUtPmRfbmFtZSk7CisJCWlmIChsc3RhdChwYXRoLCAmc3RhdGJ1ZikgPT0gMCkgeworCQkJc3dpdGNoICh0eXBlKSB7CisJCQkJY2FzZSBTRVJWSUNFOgorCQkJCQlzZXJ2aWNlKHN0YXRidWYsIHBhdGgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFU1RPUkU6CisJCQkJCXJlc3RvcmUocGF0aCwgc3RhdGJ1ZiwgdmFyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRUFEX0NPTkZJRzoKKwkJCQkJcmVhZF9jb25maWdfZmlsZShwYXRoLCB2YXIsIGV2ZW50X21hc2spOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmcmVlKHBhdGgpOworCX0KKwljbG9zZWRpcihkcCk7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBkb19zY2FuX2FuZF9zZXJ2aWNlICAqLworCitzdGF0aWMgaW50IG1rc3ltbGluayhjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKQorLyogIFtTVU1NQVJZXSBDcmVhdGUgYSBzeW1saW5rLCBjcmVhdGluZyBpbnRlcnZlbmluZyBkaXJlY3RvcmllcyBhcyByZXF1aXJlZC4KKyAgICA8b2xkcGF0aD4gVGhlIHN0cmluZyBjb250YWluZWQgaW4gdGhlIHN5bWxpbmsuCisgICAgPG5ld3BhdGg+IFRoZSBuYW1lIG9mIHRoZSBuZXcgc3ltbGluay4KKyAgICBbUkVUVVJOU10gMCBvbiBzdWNjZXNzLCBlbHNlIC0xLgorKi8KK3sKKwlpZiAoIW1ha2VfZGlyX3RyZWUobmV3cGF0aCkpCisJCXJldHVybiAtMTsKKworCWlmIChzeW1saW5rKG9sZHBhdGgsIG5ld3BhdGgpICE9IDApIHsKKwkJaWYgKGVycm5vICE9IEVFWElTVCkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBta3N5bWxpbmsgICovCisKKworc3RhdGljIGludCBtYWtlX2Rpcl90cmVlKGNvbnN0IGNoYXIgKnBhdGgpCisvKiAgW1NVTU1BUlldIENyZWF0aW5nIGludGVydmVuaW5nIGRpcmVjdG9yaWVzIGZvciBhIHBhdGggYXMgcmVxdWlyZWQuCisgICAgPHBhdGg+IFRoZSBmdWxsIHBhdGhuYW1lKGluY2x1ZGluZyB0aGUgbGVhZiBub2RlKS4KKyAgICBbUkVUVVJOU10gVFJVRSBvbiBzdWNjZXNzLCBlbHNlIEZBTFNFLgorKi8KK3sKKwlpZiAoYmJfbWFrZV9kaXJlY3RvcnkoZGlybmFtZSgoY2hhciAqKXBhdGgpLCAtMSwgRklMRVVUSUxTX1JFQ1VSKSA9PSAtMSkKKwkJcmV0dXJuIEZBTFNFOworCXJldHVybiBUUlVFOworfSAvKiAgRW5kIEZ1bmN0aW9uIG1ha2VfZGlyX3RyZWUgICovCisKK3N0YXRpYyBpbnQgZXhwYW5kX2V4cHJlc3Npb24oY2hhciAqb3V0cHV0LCB1bnNpZ25lZCBpbnQgb3V0c2l6ZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmlucHV0LAorCQkJICAgICAgY29uc3QgY2hhciAqKCpnZXRfdmFyaWFibGVfZnVuYykoY29uc3QgY2hhciAqdmFyaWFibGUsIHZvaWQgKmluZm8pLAorCQkJICAgICAgdm9pZCAqaW5mbywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmRldm5hbWUsCisJCQkgICAgICBjb25zdCByZWdtYXRjaF90ICpleCwgdW5zaWduZWQgaW50IG51bWV4cCkKKy8qICBbU1VNTUFSWV0gRXhwYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgcmVndWxhciBzdWJleHByZXNzaW9ucyBpbiBzdHJpbmcuCisgICAgPG91dHB1dD4gVGhlIG91dHB1dCBleHBhbmRlZCBleHByZXNzaW9uIGlzIHdyaXR0ZW4gaGVyZS4KKyAgICA8bGVuZ3RoPiBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICA8aW5wdXQ+IFRoZSBpbnB1dCBleHByZXNzaW9uLiBUaGlzIG1heSBlcXVhbCA8PG91dHB1dD4+LgorICAgIDxnZXRfdmFyaWFibGU+IEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGdldCB2YXJpYWJsZSB2YWx1ZXMuIElmCisgICAgdGhpcyByZXR1cm5zIE5VTEwsIHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZCBpbnN0ZWFkLiBJZiB0aGlzIGlzIE5VTEwsCisgICAgb25seSB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQuCisgICAgPGluZm8+IEFuIGFyYml0cmFyeSBwb2ludGVyIHBhc3NlZCB0byA8PGdldF92YXJpYWJsZT4+LgorICAgIDxkZXZuYW1lPiBEZXZpY2UgbmFtZTsgc3BlY2lmaWNhbGx5LCB0aGlzIGlzIHRoZSBzdHJpbmcgdGhhdCBjb250YWlucyBhbGwKKyAgICBvZiB0aGUgcmVndWxhciBzdWJleHByZXNzaW9ucy4KKyAgICA8ZXg+IEFycmF5IG9mIHN0YXJ0IC8gZW5kIG9mZnNldHMgaW50byBpbmZvLT5kZXZuYW1lIGZvciBlYWNoIHN1YmV4cHJlc3Npb24KKyAgICA8bnVtZXhwPiBOdW1iZXIgb2YgcmVndWxhciBzdWJleHByZXNzaW9ucyBmb3VuZCBpbiA8PGRldm5hbWU+Pi4KKyAgICBbUkVUVVJOU10gVFJVRSBvbiBzdWNjZXNzLCBlbHNlIEZBTFNFLgorKi8KK3sKKwljaGFyIHRlbXBbU1RSSU5HX0xFTkdUSF07CisKKwlpZiAoIXN0X2V4cHJfZXhwYW5kKHRlbXAsIFNUUklOR19MRU5HVEgsIGlucHV0LCBnZXRfdmFyaWFibGVfZnVuYywgaW5mbykpCisJCXJldHVybiBGQUxTRTsKKwlleHBhbmRfcmVnZXhwKG91dHB1dCwgb3V0c2l6ZSwgdGVtcCwgZGV2bmFtZSwgZXgsIG51bWV4cCk7CisJcmV0dXJuIFRSVUU7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBleHBhbmRfZXhwcmVzc2lvbiAgKi8KKworc3RhdGljIHZvaWQgZXhwYW5kX3JlZ2V4cChjaGFyICpvdXRwdXQsIHNpemVfdCBvdXRzaXplLCBjb25zdCBjaGFyICppbnB1dCwKKwkJCSAgIGNvbnN0IGNoYXIgKmRldm5hbWUsCisJCQkgICBjb25zdCByZWdtYXRjaF90ICpleCwgdW5zaWduZWQgaW50IG51bWV4KQorLyogIFtTVU1NQVJZXSBFeHBhbmQgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSByZWd1bGFyIHN1YmV4cHJlc3Npb25zIFwwIHRvIFw5LgorICAgIDxvdXRwdXQ+IFRoZSBvdXRwdXQgZXhwYW5kZWQgZXhwcmVzc2lvbiBpcyB3cml0dGVuIGhlcmUuCisgICAgPG91dHNpemU+IFRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIDxpbnB1dD4gVGhlIGlucHV0IGV4cHJlc3Npb24uIFRoaXMgbWF5IE5PVCBlcXVhbCA8PG91dHB1dD4+LCBiZWNhdXNlCisgICAgc3VwcG9ydGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgeWV0IGFub3RoZXIgc3RyaW5nLWNvcHkuIEhvd2V2ZXIsIGl0J3Mgbm90CisgICAgaGFyZCB0byB3cml0ZSBhIHNpbXBsZSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHkgZm9yIHRob3NlCisgICAgZmV3IGNhc2VzIHRoYXQgbmVlZCBpdC4KKyAgICA8ZGV2bmFtZT4gRGV2aWNlIG5hbWU7IHNwZWNpZmljYWxseSwgdGhpcyBpcyB0aGUgc3RyaW5nIHRoYXQgY29udGFpbnMgYWxsCisgICAgb2YgdGhlIHJlZ3VsYXIgc3ViZXhwcmVzc2lvbnMuCisgICAgPGV4PiBBbiBhcnJheSBvZiBzdGFydCBhbmQgZW5kIG9mZnNldHMgaW50byA8PGRldm5hbWU+Piwgb25lIGZvciBlYWNoCisgICAgc3ViZXhwcmVzc2lvbgorICAgIDxudW1leD4gTnVtYmVyIG9mIHN1YmV4cHJlc3Npb25zIGluIHRoZSBvZmZzZXQtYXJyYXkgPDxleD4+LgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwljb25zdCBjaGFyIGxhc3RfZXhwID0gJzAnIC0gMSArIG51bWV4OworCWludCBjID0gLTE7CisKKwkvKiAgR3VhcmFudGVlIE5VTEwgdGVybWluYXRpb24gYnkgd3JpdGluZyBhbiBleHBsaWNpdCAnXDAnIGNoYXJhY3RlciBpbnRvCisJdGhlIHZlcnkgbGFzdCBieXRlICAqLworCWlmIChvdXRzaXplKQorCQlvdXRwdXRbLS1vdXRzaXplXSA9ICdcMCc7CisJLyogIENvcHkgdGhlIGlucHV0IHN0cmluZyBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLCByZXBsYWNpbmcgJ1xcJyB3aXRoICdcJworCWFuZCAnXDAnIC4uICdcOScgd2l0aCBzdWJleHByZXNzaW9ucyAwIC4uIDksIGlmIHRoZXkgZXhpc3QuIE90aGVyIFx4CisJY29kZXMgYXJlIGRlbGV0ZWQgICovCisJd2hpbGUgKChjICE9ICdcMCcpICYmIChvdXRzaXplICE9IDApKSB7CisJCWMgPSAqaW5wdXQ7CisJCSsraW5wdXQ7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWMgPSAqaW5wdXQ7CisJCQkrK2lucHV0OworCQkJaWYgKGMgIT0gJ1xcJykgeworCQkJCWlmICgoYyA+PSAnMCcpICYmIChjIDw9IGxhc3RfZXhwKSkgeworCQkJCQljb25zdCByZWdtYXRjaF90ICpzdWJleHAgPSBleCArIChjIC0gJzAnKTsKKwkJCQkJdW5zaWduZWQgaW50IHN1YmxlbiA9IHN1YmV4cC0+cm1fZW8gLSBzdWJleHAtPnJtX3NvOworCisJCQkJCS8qICBSYW5nZSBjaGVja2luZyAgKi8KKwkJCQkJaWYgKHN1YmxlbiA+IG91dHNpemUpCisJCQkJCQlzdWJsZW4gPSBvdXRzaXplOworCQkJCQlzdHJuY3B5KG91dHB1dCwgZGV2bmFtZSArIHN1YmV4cC0+cm1fc28sIHN1Ymxlbik7CisJCQkJCW91dHB1dCArPSBzdWJsZW47CisJCQkJCW91dHNpemUgLT0gc3VibGVuOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkqb3V0cHV0ID0gYzsKKwkJKytvdXRwdXQ7CisJCS0tb3V0c2l6ZTsKKwl9IC8qIHdoaWxlICovCit9ICAgLyogIEVuZCBGdW5jdGlvbiBleHBhbmRfcmVnZXhwICAqLworCisKKy8qIGZyb20gY29tcGF0X25hbWUuYyAqLworCitzdHJ1Y3QgdHJhbnNsYXRlX3N0cnVjdCB7CisJY29uc3QgY2hhciAqbWF0Y2g7ICAgIC8qICBUaGUgc3RyaW5nIHRvIG1hdGNoIHRvKHVwIHRvIGxlbmd0aCkgICAgICAgICAgICAgICAgKi8KKwljb25zdCBjaGFyICpmb3JtYXQ7ICAgLyogIEZvcm1hdCBvZiBvdXRwdXQsICIlcyIgdGFrZXMgZGF0YSBwYXN0IG1hdGNoIHN0cmluZywKKwkJCU5VTEwgaXMgZWZmZWN0aXZlbHkgIiVzIihqdXN0IG1vcmUgZWZmaWNpZW50KSAgICAgICAqLworfTsKKworc3RhdGljIHN0cnVjdCB0cmFuc2xhdGVfc3RydWN0IHRyYW5zbGF0ZV90YWJsZVtdID0KK3sKKwl7InNvdW5kLyIsICAgICBOVUxMfSwKKwl7InByaW50ZXJzLyIsICAibHAlcyJ9LAorCXsidjRsLyIsICAgICAgIE5VTEx9LAorCXsicGFycG9ydHMvIiwgICJwYXJwb3J0JXMifSwKKwl7ImZiLyIsICAgICAgICAiZmIlcyJ9LAorCXsibmV0bGluay8iLCAgIE5VTEx9LAorCXsibG9vcC8iLCAgICAgICJsb29wJXMifSwKKwl7ImZsb3BweS8iLCAgICAiZmQlcyJ9LAorCXsicmQvIiwgICAgICAgICJyYW0lcyJ9LAorCXsibWQvIiwgICAgICAgICJtZCVzIn0sICAgICAgICAgLyogIE1ldGEtZGV2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXsidmMvIiwgICAgICAgICJ0dHklcyJ9LAorCXsibWlzYy8iLCAgICAgIE5VTEx9LAorCXsiaXNkbi8iLCAgICAgIE5VTEx9LAorCXsicGcvIiwgICAgICAgICJwZyVzIn0sICAgICAgICAgLyogIFBhcmFsbGVsIHBvcnQgZ2VuZXJpYyBBVEFQSSBpbnRlcmZhY2UqLworCXsiaTJjLyIsICAgICAgICJpMmMtJXMifSwKKwl7InN0YWxpb21lbS8iLCAic3RhbGlvbWVtJXMifSwgIC8qICBTdGFsbGlvbiBzZXJpYWwgZHJpdmVyIGNvbnRyb2wgICAgICAgKi8KKwl7InR0cy9FIiwgICAgICAidHR5RSVzIn0sICAgICAgIC8qICBTdGFsbGlvbiBzZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAgKi8KKwl7ImN1YS9FIiwgICAgICAiY3VlJXMifSwgICAgICAgIC8qICBTdGFsbGlvbiBzZXJpYWwgZHJpdmVyIGNhbGxvdXQgICAgICAgKi8KKwl7InR0cy9SIiwgICAgICAidHR5UiVzIn0sICAgICAgIC8qICBSb2NrZXRwb3J0IHNlcmlhbCBkcml2ZXIgICAgICAgICAgICAgKi8KKwl7ImN1YS9SIiwgICAgICAiY3VyJXMifSwgICAgICAgIC8qICBSb2NrZXRwb3J0IHNlcmlhbCBkcml2ZXIgY2FsbG91dCAgICAgKi8KKwl7ImlwMi8iLCAgICAgICAiaXAyJXMifSwgICAgICAgIC8qICBDb21wdXRvbmUgc2VyaWFsIGRyaXZlciBjb250cm9sICAgICAgKi8KKwl7InR0cy9GIiwgICAgICAidHR5RiVzIn0sICAgICAgIC8qICBDb21wdXRvbmUgc2VyaWFsIGRyaXZlciAgICAgICAgICAgICAgKi8KKwl7ImN1YS9GIiwgICAgICAiY3VmJXMifSwgICAgICAgIC8qICBDb21wdXRvbmUgc2VyaWFsIGRyaXZlciBjYWxsb3V0ICAgICAgKi8KKwl7InR0cy9DIiwgICAgICAidHR5QyVzIn0sICAgICAgIC8qICBDeWNsYWRlcyBzZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAgKi8KKwl7ImN1YS9DIiwgICAgICAiY3ViJXMifSwgICAgICAgIC8qICBDeWNsYWRlcyBzZXJpYWwgZHJpdmVyIGNhbGxvdXQgICAgICAgKi8KKwl7InR0cy8iLCAgICAgICAidHR5UyVzIn0sICAgICAgIC8qICBHZW5lcmljIHNlcmlhbDogbXVzdCBiZSBhZnRlciBvdGhlcnMgKi8KKwl7ImN1YS8iLCAgICAgICAiY3VhJXMifSwgICAgICAgIC8qICBHZW5lcmljIHNlcmlhbDogbXVzdCBiZSBhZnRlciBvdGhlcnMgKi8KKwl7ImlucHV0L2pzIiwgICAianMlcyJ9LCAgICAgICAgIC8qICBKb3lzdGljayBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7TlVMTCwgICAgICAgICBOVUxMfQorfTsKKworY29uc3QgY2hhciAqZ2V0X29sZF9uYW1lKGNvbnN0IGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGludCBuYW1lbGVuLAorCQkJICBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBtYWpvciwgdW5zaWduZWQgaW50IG1pbm9yKQorLyogIFtTVU1NQVJZXSBUcmFuc2xhdGUgYSBrZXJuZWwtc3VwcGxpZWQgbmFtZSBpbnRvIGFuIG9sZCBuYW1lLgorICAgIDxkZXZuYW1lPiBUaGUgZGV2aWNlIG5hbWUgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbC4KKyAgICA8bmFtZWxlbj4gVGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4KKyAgICA8YnVmZmVyPiBBIGJ1ZmZlciB0aGF0IG1heSBiZSB1c2VkLiBUaGlzIHNob3VsZCBiZSBhdCBsZWFzdCAxMjggYnl0ZXMgbG9uZy4KKyAgICA8bWFqb3I+IFRoZSBtYWpvciBudW1iZXIgZm9yIHRoZSBkZXZpY2UuCisgICAgPG1pbm9yPiBUaGUgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIFtSRVRVUk5TXSBBIHBvaW50ZXIgdG8gdGhlIG9sZCBuYW1lIGlmIGtub3duLCBlbHNlIE5VTEwuCisqLworeworCWNvbnN0IGNoYXIgKmNvbXBhdF9uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICpwdHI7CisJc3RydWN0IHRyYW5zbGF0ZV9zdHJ1Y3QgKnRyYW5zOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgbW9kZTsKKwlpbnQgaW5kZXh4OworCWNvbnN0IGNoYXIgKnB0eTE7CisJY29uc3QgY2hhciAqcHR5MjsKKwlzaXplX3QgbGVuOworCS8qIDEgdG8gNSAgInNjc2kvIiAsIDYgdG8gOSAiaWRlL2hvc3QiLCAxMCBzYnAvLCAxMSB2Y2MvLCAxMiBwdHkvICovCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZtdFtdID0geworCQlOVUxMICwKKwkJInNnJXUiLAkJCS8qIHNjc2kvZ2VuZXJpYyAqLworCQlOVUxMLAkJCS8qIHNjc2kvZGlzYyAqLworCQkic3IldSIsCQkJLyogc2NzaS9jZCAqLworCQlOVUxMLAkJCS8qIHNjc2kvcGFydCAqLworCQkibnN0JXUlYyIsCQkvKiBzY3NpL210ICovCisJCSJoZCVjIgksCQkvKiBpZGUvaG9zdC9kaXNjICovCisJCSJoZCVjIgksCQkvKiBpZGUvaG9zdC9jZCAqLworCQkiaGQlYyVzIiwJCS8qIGlkZS9ob3N0L3BhcnQgKi8KKwkJIiVzaHQlZCIsCQkvKiBpZGUvaG9zdC9tdCAqLworCQkic2JwY2QldSIsCQkvKiBzYnAvICovCisJCSJ2Y3MlcyIsCQkvKiB2Y2MvICovCisJCSIlY3R5JWMlYyIsCQkvKiBwdHkvICovCisJCU5VTEwKKwl9OworCisJZm9yICh0cmFucyA9IHRyYW5zbGF0ZV90YWJsZTsgdHJhbnMtPm1hdGNoICE9IE5VTEw7ICsrdHJhbnMpIHsKKwkJIGxlbiA9IHN0cmxlbih0cmFucy0+bWF0Y2gpOworCisJCWlmIChzdHJuY21wKGRldm5hbWUsIHRyYW5zLT5tYXRjaCwgbGVuKSA9PSAwKSB7CisJCQlpZiAodHJhbnMtPmZvcm1hdCA9PSBOVUxMKQorCQkJCXJldHVybiBkZXZuYW1lICsgbGVuOworCQkJc3ByaW50ZihidWZmZXIsIHRyYW5zLT5mb3JtYXQsIGRldm5hbWUgKyBsZW4pOworCQkJcmV0dXJuIGJ1ZmZlcjsKKwkJfQorCX0KKworCXB0ciA9IGJiX2Jhc2VuYW1lKGRldm5hbWUpOworCWkgPSBzY2FuX2Rldl9uYW1lKGRldm5hbWUsIG5hbWVsZW4sIHB0cik7CisKKwlpZiAoaSA+IDAgJiYgaSA8IDEzKQorCQljb21wYXRfbmFtZSA9IGJ1ZmZlcjsKKwllbHNlCisJCXJldHVybiBOVUxMOworCisJLyogMSA9PSBzY3NpL2dlbmVyaWMsIDMgPT0gc2NzaS9jZCwgMTAgPT0gc2JwLyAqLworCWlmIChpID09IDEgfHwgaSA9PSAzIHx8IGkgPT0gMTApCisJCXNwcmludGYoYnVmZmVyLCBmbXRbaV0sIG1pbm9yKTsKKworCS8qIDIgPT1zY3NpL2Rpc2MsIDQgPT0gc2NzaS9wYXJ0ICovCisJaWYgKGkgPT0gMiB8fCBpID09IDQpCisJCWNvbXBhdF9uYW1lID0gd3JpdGVfb2xkX3NkX25hbWUoYnVmZmVyLCBtYWpvciwgbWlub3IsICgoaSA9PSAyKSA/ICIiIDogKHB0ciArIDQpKSk7CisKKwkvKiA1ID09IHNjc2kvbXQgKi8KKwlpZiAoaSA9PSA1KSB7CisJCW1vZGUgPSBwdHJbMl07CisJCWlmIChtb2RlID09ICduJykKKwkJCW1vZGUgPSAnXDAnOworCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBtaW5vciAmIDB4MWYsIG1vZGUpOworCQlpZiAoZGV2bmFtZVtuYW1lbGVuIC0gMV0gIT0gJ24nKQorCQkJKytjb21wYXRfbmFtZTsKKwl9CisJLyogNiA9PSBpZGUvaG9zdC9kaXNjLCA3ID09IGlkZS9ob3N0L2NkLCA4ID09IGlkZS9ob3N0L3BhcnQgKi8KKwlpZiAoaSA9PSA2IHx8IGkgPT0gNyB8fCBpID09IDgpCisJCS8qIGxhc3QgYXJnIHNob3VsZCBiZSBpZ25vcmVkIGZvciBpID09IDYgb3IgaT09IDcgKi8KKwkJc3ByaW50ZihidWZmZXIsIGZtdFtpXSAsIGdldF9vbGRfaWRlX25hbWUobWFqb3IsIG1pbm9yKSwgcHRyICsgNCk7CisKKwkvKiA5ID09ICBpZGUvaG9zdC9tdCAqLworCWlmIChpID09IDkpCisJCXNwcmludGYoYnVmZmVyLCBmbXRbaV0sIHB0ciArIDIsIG1pbm9yICYgMHg3Zik7CisKKwkvKiAgMTEgPT0gdmNjLyAqLworCWlmIChpID09IDExKSB7CisJCXNwcmludGYoYnVmZmVyLCBmbXRbaV0sIGRldm5hbWUgKyA0KTsKKwkJaWYgKGJ1ZmZlclszXSA9PSAnMCcpCisJCQlidWZmZXJbM10gPSAnXDAnOworCX0KKwkvKiAxMiA9PSAgcHR5LyAqLworCWlmIChpID09IDEyKSB7CisJCXB0eTEgPSAicHFyc3R1dnd4eXphYmNkZSI7CisJCXB0eTIgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJCWluZGV4eCA9IGF0b2koZGV2bmFtZSArIDUpOworCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCAoZGV2bmFtZVs0XSA9PSAnbScpID8gJ3AnIDogJ3QnLCBwdHkxW2luZGV4eCA+PiA0XSwgcHR5MltpbmRleHggJiAweDBmXSk7CisJfQorCXJldHVybiBjb21wYXRfbmFtZTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGdldF9vbGRfbmFtZSAgKi8KKworc3RhdGljIGNoYXIgZ2V0X29sZF9pZGVfbmFtZSh1bnNpZ25lZCBpbnQgbWFqb3IsIHVuc2lnbmVkIGludCBtaW5vcikKKy8qICBbU1VNTUFSWV0gR2V0IHRoZSBvbGQgSURFIG5hbWUgZm9yIGEgZGV2aWNlLgorICAgIDxtYWpvcj4gVGhlIG1ham9yIG51bWJlciBmb3IgdGhlIGRldmljZS4KKyAgICA8bWlub3I+IFRoZSBtaW5vciBudW1iZXIgZm9yIHRoZSBkZXZpY2UuCisgICAgW1JFVFVSTlNdIFRoZSBkcml2ZSBsZXR0ZXIuCisqLworeworCWNoYXIgbGV0dGVyID0gJ3knOwkvKiAxMjEgKi8KKwljaGFyIGMgPSAnYSc7CQkvKiAgOTcgKi8KKwlpbnQgaSA9IElERTBfTUFKT1I7CisKKwkvKiBJIGhvcGUgaXQgd29ya3MgbGlrZSB0aGUgcHJldmlvdXMgY29kZSBhcyBpdCBzYXZlcyBhIGZldyBieXRlcy4gVGl0byA7UCAqLworCWRvIHsKKwkJaWYgKGkgPT0gSURFMF9NQUpPUiB8fCBpID09IElERTFfTUFKT1IgfHwgaSA9PSBJREUyX01BSk9SCisJCSB8fCBpID09IElERTNfTUFKT1IgfHwgaSA9PSBJREU0X01BSk9SIHx8IGkgPT0gSURFNV9NQUpPUgorCQkgfHwgaSA9PSBJREU2X01BSk9SIHx8IGkgPT0gSURFN19NQUpPUiB8fCBpID09IElERThfTUFKT1IKKwkJIHx8IGkgPT0gSURFOV9NQUpPUgorCQkpIHsKKwkJCWlmICgodW5zaWduZWQgaW50KWkgPT0gbWFqb3IpIHsKKwkJCQlsZXR0ZXIgPSBjOworCQkJCWJyZWFrOworCQkJfQorCQkJYyArPSAyOworCQl9CisJCWkrKzsKKwl9IHdoaWxlIChpIDw9IElERTlfTUFKT1IpOworCisJaWYgKG1pbm9yID4gNjMpCisJCSsrbGV0dGVyOworCXJldHVybiBsZXR0ZXI7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBnZXRfb2xkX2lkZV9uYW1lICAqLworCitzdGF0aWMgY2hhciAqd3JpdGVfb2xkX3NkX25hbWUoY2hhciAqYnVmZmVyLAorCQkJCXVuc2lnbmVkIGludCBtYWpvciwgdW5zaWduZWQgaW50IG1pbm9yLAorCQkJCWNvbnN0IGNoYXIgKnBhcnQpCisvKiAgW1NVTU1BUlldIFdyaXRlIHRoZSBvbGQgU0NTSSBkaXNjIG5hbWUgdG8gYSBidWZmZXIuCisgICAgPGJ1ZmZlcj4gVGhlIGJ1ZmZlciB0byB3cml0ZSB0by4KKyAgICA8bWFqb3I+IFRoZSBtYWpvciBudW1iZXIgZm9yIHRoZSBkZXZpY2UuCisgICAgPG1pbm9yPiBUaGUgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIDxwYXJ0PiBUaGUgcGFydGl0aW9uIHN0cmluZy4gTXVzdCBiZSAiIiBmb3IgYSB3aG9sZS1kaXNjIGVudHJ5LgorICAgIFtSRVRVUk5TXSBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvbiBzdWNjZXNzLCBlbHNlIE5VTEwuCisqLworeworCXVuc2lnbmVkIGludCBkaXNjX2luZGV4OworCisJaWYgKG1ham9yID09IDgpIHsKKwkJc3ByaW50ZihidWZmZXIsICJzZCVjJXMiLCAnYScgKyAobWlub3IgPj4gNCksIHBhcnQpOworCQlyZXR1cm4gYnVmZmVyOworCX0KKwlpZiAoKG1ham9yID4gNjQpICYmIChtYWpvciA8IDcyKSkgeworCQlkaXNjX2luZGV4ID0gKChtYWpvciAtIDY0KSA8PCA0KSArKG1pbm9yID4+IDQpOworCQlpZiAoZGlzY19pbmRleCA8IDI2KQorCQkJc3ByaW50ZihidWZmZXIsICJzZCVjJXMiLCAnYScgKyBkaXNjX2luZGV4LCBwYXJ0KTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWZmZXIsICJzZCVjJWMlcyIsICdhJyArKGRpc2NfaW5kZXggLyAyNikgLSAxLCAnYScgKyBkaXNjX2luZGV4ICUgMjYsIHBhcnQpOworCQlyZXR1cm4gYnVmZmVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIHdyaXRlX29sZF9zZF9uYW1lICAqLworCisKKy8qICBleHByZXNzaW9uLmMgKi8KKworLypFWFBFUklNRU5UQUxfRlVOQ1RJT04qLworCitpbnQgc3RfZXhwcl9leHBhbmQoY2hhciAqb3V0cHV0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyICppbnB1dCwKKwkJICAgICBjb25zdCBjaGFyICooKmdldF92YXJpYWJsZV9mdW5jKShjb25zdCBjaGFyICp2YXJpYWJsZSwKKwkJCQkJCSAgdm9pZCAqaW5mbyksCisJCSAgICAgdm9pZCAqaW5mbykKKy8qICBbU1VNTUFSWV0gRXhwYW5kIGFuIGV4cHJlc3Npb24gdXNpbmcgQm9ybmUgU2hlbGwtbGlrZSB1bnF1b3RlZCBydWxlcy4KKyAgICA8b3V0cHV0PiBUaGUgb3V0cHV0IGV4cGFuZGVkIGV4cHJlc3Npb24gaXMgd3JpdHRlbiBoZXJlLgorICAgIDxsZW5ndGg+IFRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIDxpbnB1dD4gVGhlIGlucHV0IGV4cHJlc3Npb24uIFRoaXMgbWF5IGVxdWFsIDw8b3V0cHV0Pj4uCisgICAgPGdldF92YXJpYWJsZT4gQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZ2V0IHZhcmlhYmxlIHZhbHVlcy4gSWYKKyAgICB0aGlzIHJldHVybnMgTlVMTCwgdGhlIGVudmlyb25tZW50IGlzIHNlYXJjaGVkIGluc3RlYWQuIElmIHRoaXMgaXMgTlVMTCwKKyAgICBvbmx5IHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZC4KKyAgICA8aW5mbz4gQW4gYXJiaXRyYXJ5IHBvaW50ZXIgcGFzc2VkIHRvIDw8Z2V0X3ZhcmlhYmxlPj4uCisgICAgW1JFVFVSTlNdIFRSVUUgb24gc3VjY2VzcywgZWxzZSBGQUxTRS4KKyovCit7CisJY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBvdXRfcG9zID0gMDsKKwljb25zdCBjaGFyICplbnY7CisJY29uc3QgY2hhciAqcHRyOworCXN0cnVjdCBwYXNzd2QgKnB3ZW50OworCWNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgdG1wW1NUUklOR19MRU5HVEhdOworCisJaWYgKGxlbmd0aCA+IEJVRkZFUl9TSVpFKQorCQlsZW5ndGggPSBCVUZGRVJfU0laRTsKKwlmb3IgKDsgVFJVRTsgKytpbnB1dCkgeworCQlzd2l0Y2ggKGNoID0gKmlucHV0KSB7CisJCQljYXNlICckJzoKKwkJCQkvKiAgVmFyaWFibGUgZXhwYW5zaW9uICAqLworCQkJCWlucHV0ID0gZXhwYW5kX3ZhcmlhYmxlKGJ1ZmZlciwgbGVuZ3RoLCAmb3V0X3BvcywgKytpbnB1dCwgZ2V0X3ZhcmlhYmxlX2Z1bmMsIGluZm8pOworCQkJCWlmIChpbnB1dCA9PSBOVUxMKQorCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJYnJlYWs7CisJCQljYXNlICd+JzoKKwkJCQkvKiAgSG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uICAqLworCQkJCWNoID0gaW5wdXRbMV07CisJCQkJaWYgKGlzc3BhY2UoY2gpIHx8KGNoID09ICcvJykgfHwoY2ggPT0gJ1wwJykpIHsKKwkJCQkJLyogVXNlcidzIG93biBob21lIGRpcmVjdG9yeTogbGVhdmUgc2VwYXJhdG9yIGZvciBuZXh0IHRpbWUgKi8KKwkJCQkJZW52ID0gZ2V0ZW52KCJIT01FIik7CisJCQkJCWlmIChlbnYgPT0gTlVMTCkgeworCQkJCQkJaW5mb19sb2dnZXIoTE9HX0lORk8sIGJiX21zZ192YXJpYWJsZV9ub3RfZm91bmQsICJIT01FIik7CisJCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJCX0KKwkJCQkJbGVuID0gc3RybGVuKGVudik7CisJCQkJCWlmIChsZW4gKyBvdXRfcG9zID49IGxlbmd0aCkKKwkJCQkJCWdvdG8gc3RfZXhwcl9leHBhbmRfb3V0OworCQkJCQltZW1jcHkoYnVmZmVyICsgb3V0X3BvcywgZW52LCBsZW4gKyAxKTsKKwkJCQkJb3V0X3BvcyArPSBsZW47CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiAgU29tZW9uZSBlbHNlJ3MgaG9tZSBkaXJlY3RvcnkgICovCisJCQkJZm9yIChwdHIgPSArK2lucHV0OyAhaXNzcGFjZShjaCkgJiYgKGNoICE9ICcvJykgJiYgKGNoICE9ICdcMCcpOyBjaCA9ICorK3B0cikKKwkJCQkJLyogVk9JRCAqLzsKKwkJCQlsZW4gPSBwdHIgLSBpbnB1dDsKKwkJCQlpZiAobGVuID49IHNpemVvZiB0bXApCisJCQkJCWdvdG8gc3RfZXhwcl9leHBhbmRfb3V0OworCQkJCXNhZmVfbWVtY3B5KHRtcCwgaW5wdXQsIGxlbik7CisJCQkJaW5wdXQgPSBwdHIgLSAxOworCQkJCXB3ZW50ID0gZ2V0cHduYW0odG1wKTsKKwkJCQlpZiAocHdlbnQgPT0gTlVMTCkgeworCQkJCQlpbmZvX2xvZ2dlcihMT0dfSU5GTywgIm5vIHB3ZW50IGZvcjogJXMiLCB0bXApOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWxlbiA9IHN0cmxlbihwd2VudC0+cHdfZGlyKTsKKwkJCQlpZiAobGVuICsgb3V0X3BvcyA+PSBsZW5ndGgpCisJCQkJCWdvdG8gc3RfZXhwcl9leHBhbmRfb3V0OworCQkJCW1lbWNweShidWZmZXIgKyBvdXRfcG9zLCBwd2VudC0+cHdfZGlyLCBsZW4gKyAxKTsKKwkJCQlvdXRfcG9zICs9IGxlbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1wwJzoKKwkJCS8qIEZhbGx0cm91Z2ggKi8KKwkJCWRlZmF1bHQ6CisJCQkJaWYgKG91dF9wb3MgPj0gbGVuZ3RoKQorCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQlidWZmZXJbb3V0X3BvcysrXSA9IGNoOworCQkJCWlmIChjaCA9PSAnXDAnKSB7CisJCQkJCW1lbWNweShvdXRwdXQsIGJ1ZmZlciwgb3V0X3Bvcyk7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCQlicmVhazsKKwkJCS8qIGVzYWMgKi8KKwkJfQorCX0KKwlyZXR1cm4gRkFMU0U7CitzdF9leHByX2V4cGFuZF9vdXQ6CisJaW5mb19sb2dnZXIoTE9HX0lORk8sIGJiX21zZ19zbWFsbF9idWZmZXIpOworCXJldHVybiBGQUxTRTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIHN0X2V4cHJfZXhwYW5kICAqLworCisKKy8qICBQcml2YXRlIGZ1bmN0aW9ucyBmb2xsb3cgICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpleHBhbmRfdmFyaWFibGUoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKm91dF9wb3MsIGNvbnN0IGNoYXIgKmlucHV0LAorCQkJCSAgICBjb25zdCBjaGFyICooKmZ1bmMpKGNvbnN0IGNoYXIgKnZhcmlhYmxlLAorCQkJCQkJCSB2b2lkICppbmZvKSwKKwkJCQkgICAgdm9pZCAqaW5mbykKKy8qICBbU1VNTUFSWV0gRXhwYW5kIGEgdmFyaWFibGUuCisgICAgPGJ1ZmZlcj4gVGhlIGJ1ZmZlciB0byB3cml0ZSB0by4KKyAgICA8bGVuZ3RoPiBUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIDxvdXRfcG9zPiBUaGUgY3VycmVudCBvdXRwdXQgcG9zaXRpb24uIFRoaXMgaXMgdXBkYXRlZC4KKyAgICA8aW5wdXQ+IEEgcG9pbnRlciB0byB0aGUgaW5wdXQgY2hhcmFjdGVyIHBvaW50ZXIuCisgICAgPGZ1bmM+IEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGdldCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoaXMKKyAgICByZXR1cm5zIE5VTEwsIHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZCBpbnN0ZWFkLiBJZiB0aGlzIGlzIE5VTEwsIG9ubHkKKyAgICB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQuCisgICAgPGluZm8+IEFuIGFyYml0cmFyeSBwb2ludGVyIHBhc3NlZCB0byA8PGZ1bmM+Pi4KKyAgICA8ZXJyZnA+IERpYWdub3N0aWMgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gaGVyZS4KKyAgICBbUkVUVVJOU10gQSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdWJleHByZXNzaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4KKyovCit7CisJY2hhciBjaDsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBvcGVuX2JyYWNlczsKKwljb25zdCBjaGFyICplbnYsICpwdHI7CisJY2hhciB0bXBbU1RSSU5HX0xFTkdUSF07CisKKwljaCA9IGlucHV0WzBdOworCWlmIChjaCA9PSAnJCcpIHsKKwkJLyogIFNwZWNpYWwgY2FzZSBmb3IgIiQkIjogUElEICAqLworCQlzcHJpbnRmKHRtcCwgIiVkIiwgKGludCkgZ2V0cGlkKCkpOworCQlsZW4gPSBzdHJsZW4odG1wKTsKKwkJaWYgKGxlbiArICpvdXRfcG9zID49IGxlbmd0aCkKKwkJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCQltZW1jcHkoYnVmZmVyICsgKm91dF9wb3MsIHRtcCwgbGVuICsgMSk7CisJCW91dF9wb3MgKz0gbGVuOworCQlyZXR1cm4gaW5wdXQ7CisJfQorCS8qICBPcmRpbmFyeSB2YXJpYWJsZSBleHBhbnNpb24sIHBvc3NpYmx5IGluIGJyYWNlcyAgKi8KKwlpZiAoY2ggIT0gJ3snKSB7CisJCS8qICBTaW1wbGUgdmFyaWFibGUgZXhwYW5zaW9uICAqLworCQlmb3IgKHB0ciA9IGlucHV0OyBpc2FsbnVtKGNoKSB8fCAoY2ggPT0gJ18nKSB8fCAoY2ggPT0gJzonKTsgY2ggPSAqKytwdHIpCisJCQkvKiBWT0lEICovOworCQlsZW4gPSBwdHIgLSBpbnB1dDsKKwkJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCQlnb3RvIGV4cGFuZF92YXJpYWJsZV9vdXQ7CisKKwkJc2FmZV9tZW1jcHkodG1wLCBpbnB1dCwgbGVuKTsKKwkJaW5wdXQgPSBwdHIgLSAxOworCQllbnYgPSBnZXRfdmFyaWFibGVfdjIodG1wLCBmdW5jLCBpbmZvKTsKKwkJaWYgKGVudiA9PSBOVUxMKSB7CisJCQlpbmZvX2xvZ2dlcihMT0dfSU5GTywgYmJfbXNnX3ZhcmlhYmxlX25vdF9mb3VuZCwgdG1wKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWxlbiA9IHN0cmxlbihlbnYpOworCQlpZiAobGVuICsgKm91dF9wb3MgPj0gbGVuZ3RoKQorCQkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJCW1lbWNweShidWZmZXIgKyAqb3V0X3BvcywgZW52LCBsZW4gKyAxKTsKKwkJKm91dF9wb3MgKz0gbGVuOworCQlyZXR1cm4gaW5wdXQ7CisJfQorCS8qICBWYXJpYWJsZSBpbiBicmFjZXM6IGNoZWNrIGZvciAnOicgdHJpY2tzICAqLworCWNoID0gKisraW5wdXQ7CisJZm9yIChwdHIgPSBpbnB1dDsgaXNhbG51bShjaCkgfHwgKGNoID09ICdfJyk7IGNoID0gKisrcHRyKQorCQkvKiBWT0lEICovOworCWlmIChjaCA9PSAnfScpIHsKKwkJLyogIE11c3QgYmUgc2ltcGxlIHZhcmlhYmxlIGV4cGFuc2lvbiB3aXRoICIke3Zhcn0iICAqLworCQlsZW4gPSBwdHIgLSBpbnB1dDsKKwkJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCQlnb3RvIGV4cGFuZF92YXJpYWJsZV9vdXQ7CisKKwkJc2FmZV9tZW1jcHkodG1wLCBpbnB1dCwgbGVuKTsKKwkJcHRyID0gZXhwYW5kX3ZhcmlhYmxlKGJ1ZmZlciwgbGVuZ3RoLCBvdXRfcG9zLCB0bXAsIGZ1bmMsIGluZm8pOworCQlpZiAocHRyID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIGlucHV0ICsgbGVuOworCX0KKwlpZiAoY2ggIT0gJzonIHx8IHB0clsxXSAhPSAnLScpIHsKKwkJaW5mb19sb2dnZXIoTE9HX0lORk8sICJpbGxlZ2FsIGNoYXIgaW4gdmFyIG5hbWUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qICBJdCdzIHRoYXQgaGFuZHkgIiR7dmFyOi13b3JkfSIgZXhwcmVzc2lvbi4gQ2hlY2sgaWYgdmFyIGlzIGRlZmluZWQgICovCisJbGVuID0gcHRyIC0gaW5wdXQ7CisJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCXNhZmVfbWVtY3B5KHRtcCwgaW5wdXQsIGxlbik7CisJLyogIE1vdmUgaW5wdXQgcG9pbnRlciB0byAnOicgICovCisJaW5wdXQgPSBwdHI7CisJLyogIEZpcnN0IHNraXAgdG8gY2xvc2luZyBicmFjZSwgdGFraW5nIG5vdGUgb2YgbmVzdGVkIGV4cHJlc3Npb25zICAqLworCXB0ciArPSAyOworCWNoID0gcHRyWzBdOworCWZvciAob3Blbl9icmFjZXMgPSAxOyBvcGVuX2JyYWNlcyA+IDA7IGNoID0gKisrcHRyKSB7CisJCXN3aXRjaCAoY2gpIHsKKwkJCWNhc2UgJ3snOgorCQkJCSsrb3Blbl9icmFjZXM7CisJCQkJYnJlYWs7CisJCQljYXNlICd9JzoKKwkJCQktLW9wZW5fYnJhY2VzOworCQkJCWJyZWFrOworCQkJY2FzZSAnXDAnOgorCQkJCWluZm9fbG9nZ2VyKExPR19JTkZPLCAiXCJ9XCIgbm90IGZvdW5kIGluOiAlcyIsIGlucHV0KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisJLS1wdHI7CisJLyogIEF0IHRoaXMgcG9pbnQgcHRyIHNob3VsZCBwb2ludCB0byBjbG9zaW5nIGJyYWNlIG9mICIke3Zhcjotd29yZH0iICAqLworCWVudiA9IGdldF92YXJpYWJsZV92Mih0bXAsIGZ1bmMsIGluZm8pOworCWlmIChlbnYgIT0gTlVMTCkgeworCQkvKiAgRm91bmQgZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIHNraXAgdGhlIGlucHV0IHRvIHRoZSBjbG9zaW5nIGJyYWNlCisJCQlhbmQgcmV0dXJuIHRoZSB2YXJpYWJsZSAgKi8KKwkJaW5wdXQgPSBwdHI7CisJCWxlbiA9IHN0cmxlbihlbnYpOworCQlpZiAobGVuICsgKm91dF9wb3MgPj0gbGVuZ3RoKQorCQkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJCW1lbWNweShidWZmZXIgKyAqb3V0X3BvcywgZW52LCBsZW4gKyAxKTsKKwkJKm91dF9wb3MgKz0gbGVuOworCQlyZXR1cm4gaW5wdXQ7CisJfQorCS8qICBFbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgbm90IGZvdW5kLCBzbyBwcm9jZXNzIHdvcmQuIEFkdmFuY2UgaW5wdXQKKwlwb2ludGVyIHRvIHN0YXJ0IG9mIHdvcmQgaW4gIiR7dmFyOi13b3JkfSIgICovCisJaW5wdXQgKz0gMjsKKwlsZW4gPSBwdHIgLSBpbnB1dDsKKwlpZiAoKHNpemVfdClsZW4gPj0gc2l6ZW9mIHRtcCkKKwkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJc2FmZV9tZW1jcHkodG1wLCBpbnB1dCwgbGVuKTsKKwlpbnB1dCA9IHB0cjsKKwlpZiAoIXN0X2V4cHJfZXhwYW5kKHRtcCwgU1RSSU5HX0xFTkdUSCwgdG1wLCBmdW5jLCBpbmZvKSkKKwkJcmV0dXJuIE5VTEw7CisJbGVuID0gc3RybGVuKHRtcCk7CisJaWYgKGxlbiArICpvdXRfcG9zID49IGxlbmd0aCkKKwkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJbWVtY3B5KGJ1ZmZlciArICpvdXRfcG9zLCB0bXAsIGxlbiArIDEpOworCSpvdXRfcG9zICs9IGxlbjsKKwlyZXR1cm4gaW5wdXQ7CitleHBhbmRfdmFyaWFibGVfb3V0OgorCWluZm9fbG9nZ2VyKExPR19JTkZPLCBiYl9tc2dfc21hbGxfYnVmZmVyKTsKKwlyZXR1cm4gTlVMTDsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGV4cGFuZF92YXJpYWJsZSAgKi8KKworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3ZhcmlhYmxlX3YyKGNvbnN0IGNoYXIgKnZhcmlhYmxlLAorCQkJCSAgY29uc3QgY2hhciAqKCpmdW5jKShjb25zdCBjaGFyICp2YXJpYWJsZSwgdm9pZCAqaW5mbyksCisJCQkJIHZvaWQgKmluZm8pCisvKiAgW1NVTU1BUlldIEdldCBhIHZhcmlhYmxlIGZyb20gdGhlIGVudmlyb25tZW50IG9yIC4KKyAgICA8dmFyaWFibGU+IFRoZSB2YXJpYWJsZSBuYW1lLgorICAgIDxmdW5jPiBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIHZhcmlhYmxlLiBJZiB0aGlzIHJldHVybnMKKyAgICBOVUxMLCB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQgaW5zdGVhZC4gSWYgdGhpcyBpcyBOVUxMLCBvbmx5IHRoZQorICAgIGVudmlyb25tZW50IGlzIHNlYXJjaGVkLgorICAgIFtSRVRVUk5TXSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4KKyovCit7CisJY29uc3QgY2hhciAqdmFsdWU7CisKKwlpZiAoZnVuYyAhPSBOVUxMKSB7CisJCXZhbHVlID0gKCpmdW5jKSh2YXJpYWJsZSwgaW5mbyk7CisJCWlmICh2YWx1ZSAhPSBOVUxMKQorCQkJcmV0dXJuIHZhbHVlOworCX0KKwlyZXR1cm4gZ2V0ZW52KHZhcmlhYmxlKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGdldF92YXJpYWJsZSAgKi8KKworLyogRU5EIE9GIENPREUgKi8KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9kZXZtZW0uYyBiL21pc2N1dGlscy9kZXZtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZhMjFiCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2Rldm1lbS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIEphbi1EZXJrIEJha2tlciAoSi5ELkJha2tlckBpdHMudHVkZWxmdC5ubCkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgsIEJ1c3lCb3ggVGVhbS4gLXNvbGFyIDQvMjYvMDgKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGV2bWVtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJBRERSRVNTIFtXSURUSCBbVkFMVUVdXSIKKy8vdXNhZ2U6I2RlZmluZSBkZXZtZW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkL3dyaXRlIGZyb20gcGh5c2ljYWwgYWRkcmVzc1xuIgorLy91c2FnZTogICAgICJcbglBRERSRVNTCUFkZHJlc3MgdG8gYWN0IHVwb24iCisvL3VzYWdlOiAgICAgIlxuCVdJRFRICVdpZHRoICg4LzE2Ly4uLikiCisvL3VzYWdlOiAgICAgIlxuCVZBTFVFCURhdGEgdG8gYmUgd3JpdHRlbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBkZXZtZW1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRldm1lbV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdm9pZCAqbWFwX2Jhc2UsICp2aXJ0X2FkZHI7CisJdWludDY0X3QgcmVhZF9yZXN1bHQ7CisJdWludDY0X3Qgd3JpdGV2YWwgPSB3cml0ZXZhbDsgLyogZm9yIGNvbXBpbGVyICovCisJb2ZmX3QgdGFyZ2V0OworCXVuc2lnbmVkIHBhZ2Vfc2l6ZSwgbWFwcGVkX3NpemUsIG9mZnNldF9pbl9wYWdlOworCWludCBmZDsKKwl1bnNpZ25lZCB3aWR0aCA9IDggKiBzaXplb2YoaW50KTsKKworCS8qIGRldm1lbSBBRERSRVNTIFtXSURUSCBbVkFMVUVdXSAqLworLy8gVE9ETzogb3B0aW9ucz8KKy8vIC1yOiByZWFkIGFuZCBvdXRwdXQgb25seSB0aGUgdmFsdWUgaW4gaGV4LCB3aXRoIDB4IHByZWZpeAorLy8gLXc6IHdyaXRlIG9ubHksIG5vIHJlYWRzIGJlZm9yZSBvciBhZnRlciwgYW5kIG5vIG91dHB1dAorLy8gb3IgbWFrZSB0aGlzIGJlaGF2aW9yIGRlZmF1bHQ/CisvLyBMZXQncyB0cnkgdGhpcyBhbmQgc2VlIGhvdyB1c2VycyByZWFjdC4KKworCS8qIEFERFJFU1MgKi8KKwlpZiAoIWFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwllcnJubyA9IDA7CisJdGFyZ2V0ID0gYmJfc3RydG91bGwoYXJndlsxXSwgTlVMTCwgMCk7IC8qIGFsbG93cyBoZXgsIG9jdCBldGMgKi8KKworCS8qIFdJRFRIICovCisJaWYgKGFyZ3ZbMl0pIHsKKwkJaWYgKGlzZGlnaXQoYXJndlsyXVswXSkgfHwgYXJndlsyXVsxXSkKKwkJCXdpZHRoID0geGF0b3UoYXJndlsyXSk7CisJCWVsc2UgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgYmh3bFtdIEFMSUdOMSA9ICJiaHdsIjsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IHNpemVzW10gQUxJR04xID0geworCQkJCTggKiBzaXplb2YoY2hhciksCisJCQkJOCAqIHNpemVvZihzaG9ydCksCisJCQkJOCAqIHNpemVvZihpbnQpLAorCQkJCTggKiBzaXplb2YobG9uZyksCisJCQkJMCAvKiBiYWQgKi8KKwkJCX07CisJCQl3aWR0aCA9IHN0cmNocm51bChiaHdsLCAoYXJndlsyXVswXSB8IDB4MjApKSAtIGJod2w7CisJCQl3aWR0aCA9IHNpemVzW3dpZHRoXTsKKwkJfQorCQkvKiBWQUxVRSAqLworCQlpZiAoYXJndlszXSkKKwkJCXdyaXRldmFsID0gYmJfc3RydG91bGwoYXJndlszXSwgTlVMTCwgMCk7CisJfSBlbHNlIHsgLyogYXJndlsyXSA9PSBOVUxMICovCisJCS8qIG1ha2UgYXJndlszXSB0byBiZSBhIHZhbGlkIHRoaW5nIHRvIGZldGNoICovCisJCWFyZ3YtLTsKKwl9CisJaWYgKGVycm5vKQorCQliYl9zaG93X3VzYWdlKCk7IC8qIG9uZSBvZiBiYl9zdHJ0b3VYWCBmYWlsZWQgKi8KKworCWZkID0geG9wZW4oIi9kZXYvbWVtIiwgYXJndlszXSA/IChPX1JEV1IgfCBPX1NZTkMpIDogKE9fUkRPTkxZIHwgT19TWU5DKSk7CisJbWFwcGVkX3NpemUgPSBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworCW9mZnNldF9pbl9wYWdlID0gKHVuc2lnbmVkKXRhcmdldCAmIChwYWdlX3NpemUgLSAxKTsKKwlpZiAob2Zmc2V0X2luX3BhZ2UgKyB3aWR0aCA+IHBhZ2Vfc2l6ZSkgeworCQkvKiBUaGlzIGFjY2VzcyBzcGFucyBwYWdlcy4KKwkJICogTXVzdCBtYXAgdHdvIHBhZ2VzIHRvIG1ha2UgaXQgcG9zc2libGU6ICovCisJCW1hcHBlZF9zaXplICo9IDI7CisJfQorCW1hcF9iYXNlID0gbW1hcChOVUxMLAorCQkJbWFwcGVkX3NpemUsCisJCQlhcmd2WzNdID8gKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpIDogUFJPVF9SRUFELAorCQkJTUFQX1NIQVJFRCwKKwkJCWZkLAorCQkJdGFyZ2V0ICYgfihvZmZfdCkocGFnZV9zaXplIC0gMSkpOworCWlmIChtYXBfYmFzZSA9PSBNQVBfRkFJTEVEKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm1tYXAiKTsKKworLy8JcHJpbnRmKCJNZW1vcnkgbWFwcGVkIGF0IGFkZHJlc3MgJXAuXG4iLCBtYXBfYmFzZSk7CisKKwl2aXJ0X2FkZHIgPSAoY2hhciopbWFwX2Jhc2UgKyBvZmZzZXRfaW5fcGFnZTsKKworCWlmICghYXJndlszXSkgeworCQlzd2l0Y2ggKHdpZHRoKSB7CisJCWNhc2UgODoKKwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50OF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50MTZfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDMyX3QqKXZpcnRfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIDY0OgorCQkJcmVhZF9yZXN1bHQgPSAqKHZvbGF0aWxlIHVpbnQ2NF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgd2lkdGgiKTsKKwkJfQorLy8JCXByaW50ZigiVmFsdWUgYXQgYWRkcmVzcyAweCUiT0ZGX0ZNVCJYICglcCk6IDB4JWxsWFxuIiwKKy8vCQkJdGFyZ2V0LCB2aXJ0X2FkZHIsCisvLwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVhZF9yZXN1bHQpOworCQkvKiBaZXJvLXBhZGRlZCBvdXRwdXQgc2hvd3MgdGhlIHdpZHRoIG9mIGFjY2VzcyBqdXN0IGRvbmUgKi8KKwkJcHJpbnRmKCIweCUwKmxsWFxuIiwgKHdpZHRoID4+IDIpLCAodW5zaWduZWQgbG9uZyBsb25nKXJlYWRfcmVzdWx0KTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHdpZHRoKSB7CisJCWNhc2UgODoKKwkJCSoodm9sYXRpbGUgdWludDhfdCopdmlydF9hZGRyID0gd3JpdGV2YWw7CisvLwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50OF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCSoodm9sYXRpbGUgdWludDE2X3QqKXZpcnRfYWRkciA9IHdyaXRldmFsOworLy8JCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDE2X3QqKXZpcnRfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJKih2b2xhdGlsZSB1aW50MzJfdCopdmlydF9hZGRyID0gd3JpdGV2YWw7CisvLwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50MzJfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCQkqKHZvbGF0aWxlIHVpbnQ2NF90Kil2aXJ0X2FkZHIgPSB3cml0ZXZhbDsKKy8vCQkJcmVhZF9yZXN1bHQgPSAqKHZvbGF0aWxlIHVpbnQ2NF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgd2lkdGgiKTsKKwkJfQorLy8JCXByaW50ZigiV3JpdHRlbiAweCVsbFg7IHJlYWRiYWNrIDB4JWxsWFxuIiwKKy8vCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpd3JpdGV2YWwsCisvLwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlYWRfcmVzdWx0KTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJaWYgKG11bm1hcChtYXBfYmFzZSwgbWFwcGVkX3NpemUpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtdW5tYXAiKTsKKwkJY2xvc2UoZmQpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZWplY3QuYyBiL21pc2N1dGlscy9lamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGUwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvZWplY3QuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZWplY3QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFBldGVyIFdpbGxpcyA8cHN5cGhyZWFrQHBocmVha2VyLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNSAgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgYSBzaW1wbGUgaGFjayBvZiBlamVjdCBiYXNlZCBvbiBzb21ldGhpbmcgRXJpayBwb3N0ZWQgaW4gI3VjbGliYy4KKyAqIE1vc3Qgb2YgdGhlIGRpcnR5IHdvcmsgYmxhdGFudGx5IHJpcHBlZCBvZmYgZnJvbSBjYXQuYyA9KQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBlamVjdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy10XSBbLVRdIFtERVZJQ0VdIgorLy91c2FnZTojZGVmaW5lIGVqZWN0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRWplY3QgREVWSUNFIG9yIGRlZmF1bHQgL2Rldi9jZHJvbVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9FSkVDVF9TQ1NJKAorLy91c2FnZTogICAgICJcbgktcwlTQ1NJIGRldmljZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXQJQ2xvc2UgdHJheSIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJT3Blbi9jbG9zZSB0cmF5ICh0b2dnbGUpIgorCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKy8qIE11c3QgYmUgYWZ0ZXIgbGliYmIuaDogdGhleSBuZWVkIHNpemVfdCAqLworI2luY2x1ZGUgImZpeF91MzIuaCIKKyNpbmNsdWRlIDxzY3NpL3NnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisKKy8qIHZhcmlvdXMgZGVmaW5lcyBzd2lwZWQgZnJvbSBsaW51eC9jZHJvbS5oICovCisjZGVmaW5lIENEUk9NQ0xPU0VUUkFZICAgICAgICAgICAgMHg1MzE5ICAvKiBwZW5kYW50IG9mIENEUk9NRUpFQ1QgICovCisjZGVmaW5lIENEUk9NRUpFQ1QgICAgICAgICAgICAgICAgMHg1MzA5ICAvKiBFamVjdHMgdGhlIGNkcm9tIG1lZGlhICovCisjZGVmaW5lIENEUk9NX0RSSVZFX1NUQVRVUyAgICAgICAgMHg1MzI2ICAvKiBHZXQgdHJheSBwb3NpdGlvbiwgZXRjLiAqLworLyogZHJpdmUgc3RhdHVzIHBvc3NpYmlsaXRpZXMgcmV0dXJuZWQgYnkgQ0RST01fRFJJVkVfU1RBVFVTIGlvY3RsICovCisjZGVmaW5lIENEU19UUkFZX09QRU4gICAgICAgIDIKKworI2RlZmluZSBkZXZfZmQgMworCisvKiBDb2RlIHRha2VuIGZyb20gdGhlIG9yaWdpbmFsIGVqZWN0IChodHRwOi8vZWplY3Quc291cmNlZm9yZ2UubmV0LyksCisgKiByZWZhY3RvcmVkIGl0IGEgYml0IGZvciBidXN5Ym94IChuZS1iYkBuaWNvZXJmdXJ0aC5kZSkgKi8KKworc3RhdGljIHZvaWQgZWplY3Rfc2NzaShjb25zdCBjaGFyICpkZXYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc2dfY29tbWFuZHNbM11bNl0gPSB7CisJCXsgQUxMT1dfTUVESVVNX1JFTU9WQUwsIDAsIDAsIDAsIDAsIDAgfSwKKwkJeyBTVEFSVF9TVE9QLCAwLCAwLCAwLCAxLCAwIH0sCisJCXsgU1RBUlRfU1RPUCwgMCwgMCwgMCwgMiwgMCB9CisJfTsKKworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgY2hhciBzZW5zZV9idWZmZXJbMzJdOworCXVuc2lnbmVkIGNoYXIgaW5xQnVmZlsyXTsKKwlzZ19pb19oZHJfdCBpb19oZHI7CisKKwlpZiAoKGlvY3RsKGRldl9mZCwgU0dfR0VUX1ZFUlNJT05fTlVNLCAmaSkgPCAwKSB8fCAoaSA8IDMwMDAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHNnIGRldmljZSBvciBvbGQgc2cgZHJpdmVyIik7CisKKwltZW1zZXQoJmlvX2hkciwgMCwgc2l6ZW9mKHNnX2lvX2hkcl90KSk7CisJaW9faGRyLmludGVyZmFjZV9pZCA9ICdTJzsKKwlpb19oZHIuY21kX2xlbiA9IDY7CisJaW9faGRyLm14X3NiX2xlbiA9IHNpemVvZihzZW5zZV9idWZmZXIpOworCWlvX2hkci5keGZlcl9kaXJlY3Rpb24gPSBTR19EWEZFUl9OT05FOworCS8qIGlvX2hkci5keGZlcl9sZW4gPSAwOyAqLworCWlvX2hkci5keGZlcnAgPSBpbnFCdWZmOworCWlvX2hkci5zYnAgPSBzZW5zZV9idWZmZXI7CisJaW9faGRyLnRpbWVvdXQgPSAyMDAwOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpb19oZHIuY21kcCA9ICh2b2lkICopc2dfY29tbWFuZHNbaV07CisJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGRldl9mZCwgU0dfSU8sICh2b2lkICopJmlvX2hkciwgIiVzIiwgZGV2KTsKKwl9CisKKwkvKiBmb3JjZSBrZXJuZWwgdG8gcmVyZWFkIHBhcnRpdGlvbiB0YWJsZSB3aGVuIG5ldyBkaXNjIGlzIGluc2VydGVkICovCisJaW9jdGwoZGV2X2ZkLCBCTEtSUlBBUlQpOworfQorCisjZGVmaW5lIEZMQUdfQ0xPU0UgIDEKKyNkZWZpbmUgRkxBR19TTUFSVCAgMgorI2RlZmluZSBGTEFHX1NDU0kgICA0CisKK3N0YXRpYyB2b2lkIGVqZWN0X2Nkcm9tKHVuc2lnbmVkIGZsYWdzLCBjb25zdCBjaGFyICpkZXYpCit7CisJaW50IGNtZCA9IENEUk9NRUpFQ1Q7CisKKwlpZiAoZmxhZ3MgJiBGTEFHX0NMT1NFCisJIHx8ICgoZmxhZ3MgJiBGTEFHX1NNQVJUKSAmJiBpb2N0bChkZXZfZmQsIENEUk9NX0RSSVZFX1NUQVRVUykgPT0gQ0RTX1RSQVlfT1BFTikKKwkpIHsKKwkJY21kID0gQ0RST01DTE9TRVRSQVk7CisJfQorCisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZGV2X2ZkLCBjbWQsIE5VTEwsICIlcyIsIGRldik7Cit9CisKK2ludCBlamVjdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZWplY3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGZsYWdzOworCWNvbnN0IGNoYXIgKmRldmljZTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xOnQtLVQ6VC0tdCI7CisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAidFQiIElGX0ZFQVRVUkVfRUpFQ1RfU0NTSSgicyIpKTsKKwlkZXZpY2UgPSBhcmd2W29wdGluZF0gPyBhcmd2W29wdGluZF0gOiAiL2Rldi9jZHJvbSI7CisKKwkvKiBXZSB1c2VkIHRvIGRvICJ1bW91bnQgPGRldmljZT4iIGhlcmUsIGJ1dCBpdCB3YXMgYnVnZ3kKKwkgICBpZiBzb21ldGhpbmcgd2FzIG1vdW50ZWQgT1ZFUiBjZHJvbSBhbmQKKwkgICBpZiBjZHJvbSBpcyBtb3VudGVkIG1hbnkgdGltZXMuCisKKwkgICBUaGlzIHdvcmtzIGVxdWFsbHkgd2VsbCAob3IgYmV0dGVyKToKKwkgICAjIS9iaW4vc2gKKwkgICB1bW91bnQgL2Rldi9jZHJvbQorCSAgIGVqZWN0IC9kZXYvY2Ryb20KKwkqLworCisJeG1vdmVfZmQoeG9wZW5fbm9uYmxvY2tpbmcoZGV2aWNlKSwgZGV2X2ZkKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9FSkVDVF9TQ1NJICYmIChmbGFncyAmIEZMQUdfU0NTSSkpCisJCWVqZWN0X3Njc2koZGV2aWNlKTsKKwllbHNlCisJCWVqZWN0X2Nkcm9tKGZsYWdzLCBkZXZpY2UpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShkZXZfZmQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9mYnNwbGFzaC5jIGIvbWlzY3V0aWxzL2Zic3BsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYTQ3MgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9mYnNwbGFzaC5jCkBAIC0wLDAgKzEsNDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGVsZSBTYW5nZXMgPG1pY2hlbGUuc2FuZ2VzQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFVzYWdlOgorICogLSB1c2Uga2VybmVsIG9wdGlvbiAndmdhPXh4eCcgb3Igb3RoZXJ3aXNlIGVuYWJsZSBmcmFtZWJ1ZmZlciBkZXZpY2UuCisgKiAtIHB1dCBzb21ld2hlcmUgZmJzcGxhc2guY2ZnIGZpbGUgYW5kIGFuIGltYWdlIGluIC5wcG0gZm9ybWF0LgorICogLSBydW4gYXBwbGV0OiAkIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXSAmCisgKiAgICAgIC1jOiBoaWRlIGN1cnNvcgorICogICAgICAtZCAvZGV2L2ZiTjogZnJhbWVidWZmZXIgZGV2aWNlIChpZiBub3QgL2Rldi9mYjApCisgKiAgICAgIC1zIHBhdGhfdG9faW1hZ2VfZmlsZSAoY2FuIGJlICItIiBmb3Igc3RkaW4pCisgKiAgICAgIC1pIHBhdGhfdG9fY2ZnX2ZpbGUKKyAqICAgICAgLWYgcGF0aF90b19maWZvIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKyAqIC0gaWYgeW91IHdhbnQgdG8gcnVuIGl0IG9ubHkgaW4gcHJlc2VuY2Ugb2YgYSBrZXJuZWwgcGFyYW1ldGVyCisgKiAgIChmb3IgZXhhbXBsZSBmYnNwbGFzaD1vbiksIHVzZToKKyAqICAgZ3JlcCAtcSAiZmJzcGxhc2g9b24iIDwvcHJvYy9jbWRsaW5lICYmIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXQorICogLSBjb21tYW5kcyBmb3IgZmlmbzoKKyAqICAgIk5OIiAoQVNDSUkgZGVjaW1hbCBudW1iZXIpIC0gcGVyY2VudGFnZSB0byBzaG93IG9uIHByb2dyZXNzIGJhci4KKyAqICAgImV4aXQiIChvciBqdXN0IGNsb3NlIGZpZm8pIC0gd2VsbCB5b3UgZ3Vlc3NlZCBpdC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmJzcGxhc2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1zIElNR0ZJTEUgWy1jXSBbLWQgREVWXSBbLWkgSU5JRklMRV0gWy1mIENNRF0iCisvL3VzYWdlOiNkZWZpbmUgZmJzcGxhc2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXMJSW1hZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1jCUhpZGUgY3Vyc29yIgorLy91c2FnZTogICAgICJcbgktZAlGcmFtZWJ1ZmZlciBkZXZpY2UgKGRlZmF1bHQgL2Rldi9mYjApIgorLy91c2FnZTogICAgICJcbgktaQlDb25maWcgZmlsZSAodmFyPXZhbHVlKToiCisvL3VzYWdlOiAgICAgIlxuCQkJQkFSX0xFRlQsQkFSX1RPUCxCQVJfV0lEVEgsQkFSX0hFSUdIVCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlCQVJfUixCQVJfRyxCQVJfQiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJQ29udHJvbCBwaXBlIChlbHNlIGV4aXQgYWZ0ZXIgZHJhd2luZyBpbWFnZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJY29tbWFuZHM6ICdOTicgKCUgZm9yIHByb2dyZXNzIGJhcikgb3IgJ2V4aXQnIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisvKiBJZiB5b3Ugd2FudCBsb2dnaW5nIG1lc3NhZ2VzIG9uIC90bXAvZmJzcGxhc2gubG9nLi4uICovCisjZGVmaW5lIERFQlVHIDAKKworc3RydWN0IGdsb2JhbHMgeworI2lmIERFQlVHCisJYm9vbCBiZGVidWdfbWVzc2FnZXM7CS8vIGVuYWJsZS9kaXNhYmxlIGxvZ2dpbmcKKwlGSUxFICpsb2dmaWxlX2ZkOwkvLyBsb2cgZmlsZQorI2VuZGlmCisJdW5zaWduZWQgY2hhciAqYWRkcjsJLy8gcG9pbnRlciB0byBmcmFtZWJ1ZmZlciBtZW1vcnkKKwl1bnNpZ25lZCBuc1s3XTsJCS8vIG4tcGFyYW1ldGVycworCWNvbnN0IGNoYXIgKmltYWdlX2ZpbGVuYW1lOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBzY3JfdmFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBzY3JfZml4OworCXVuc2lnbmVkIGJ5dGVzX3Blcl9waXhlbDsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgbmJhcl93aWR0aAluc1swXQkvLyBwcm9ncmVzcyBiYXIgd2lkdGgKKyNkZWZpbmUgbmJhcl9oZWlnaHQJbnNbMV0JLy8gcHJvZ3Jlc3MgYmFyIGhlaWdodAorI2RlZmluZSBuYmFyX3Bvc3gJbnNbMl0JLy8gcHJvZ3Jlc3MgYmFyIGhvcml6b250YWwgcG9zaXRpb24KKyNkZWZpbmUgbmJhcl9wb3N5CW5zWzNdCS8vIHByb2dyZXNzIGJhciB2ZXJ0aWNhbCBwb3NpdGlvbgorI2RlZmluZSBuYmFyX2NvbHIJbnNbNF0JLy8gcHJvZ3Jlc3MgYmFyIGNvbG9yIHJlZCBjb21wb25lbnQKKyNkZWZpbmUgbmJhcl9jb2xnCW5zWzVdCS8vIHByb2dyZXNzIGJhciBjb2xvciBncmVlbiBjb21wb25lbnQKKyNkZWZpbmUgbmJhcl9jb2xiCW5zWzZdCS8vIHByb2dyZXNzIGJhciBjb2xvciBibHVlIGNvbXBvbmVudAorCisjaWYgREVCVUcKKyNkZWZpbmUgREVCVUdfTUVTU0FHRShzdHJNZXNzYWdlLCBhcmdzLi4uKSBcCisJaWYgKEcuYmRlYnVnX21lc3NhZ2VzKSB7IFwKKwkJZnByaW50ZihHLmxvZ2ZpbGVfZmQsICJbJXNdWyVzXSAtICVzXG4iLCBcCisJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHN0ck1lc3NhZ2UpOwlcCisJfQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTUVTU0FHRSguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKworLyoqCisgKiBPcGVuIGFuZCBpbml0aWFsaXplIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UKKyAqIFxwYXJhbSAqc3RyZmJfZGV2aWNlIHBvaW50ZXIgdG8gZnJhbWVidWZmZXIgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGZiX29wZW4oY29uc3QgY2hhciAqc3RyZmJfZGV2aWNlKQoreworCWludCBmYmZkID0geG9wZW4oc3RyZmJfZGV2aWNlLCBPX1JEV1IpOworCisJLy8gZnJhbWVidWZmZXIgcHJvcGVydGllcworCXhpb2N0bChmYmZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmRy5zY3JfdmFyKTsKKwl4aW9jdGwoZmJmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJkcuc2NyX2ZpeCk7CisKKwlpZiAoRy5zY3JfdmFyLmJpdHNfcGVyX3BpeGVsIDwgMTYgfHwgRy5zY3JfdmFyLmJpdHNfcGVyX3BpeGVsID4gMzIpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnN1cHBvcnRlZCAldSBicHAiLCAoaW50KUcuc2NyX3Zhci5iaXRzX3Blcl9waXhlbCk7CisJRy5ieXRlc19wZXJfcGl4ZWwgPSAoRy5zY3JfdmFyLmJpdHNfcGVyX3BpeGVsICsgNykgPj4gMzsKKworCS8vIG1hcCB0aGUgZGV2aWNlIGluIG1lbW9yeQorCUcuYWRkciA9IG1tYXAoTlVMTCwKKwkJCUcuc2NyX3Zhci54cmVzICogRy5zY3JfdmFyLnlyZXMgKiBHLmJ5dGVzX3Blcl9waXhlbCwKKwkJCVBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZiZmQsIDApOworCWlmIChHLmFkZHIgPT0gTUFQX0ZBSUxFRCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtbWFwIik7CisKKwkvLyBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHZpc2libGUgc2NyZWVuCisJRy5hZGRyICs9IEcuc2NyX3Zhci55b2Zmc2V0ICogRy5zY3JfZml4LmxpbmVfbGVuZ3RoICsgRy5zY3JfdmFyLnhvZmZzZXQgKiBHLmJ5dGVzX3Blcl9waXhlbDsKKwljbG9zZShmYmZkKTsKK30KKworCisvKioKKyAqIFJldHVybiBwaXhlbCB2YWx1ZSBvZiB0aGUgcGFzc2VkIFJHQiBjb2xvcgorICovCitzdGF0aWMgdW5zaWduZWQgZmJfcGl4ZWxfdmFsdWUodW5zaWduZWQgciwgdW5zaWduZWQgZywgdW5zaWduZWQgYikKK3sKKwlpZiAoRy5ieXRlc19wZXJfcGl4ZWwgPT0gMikgeworCQlyID4+PSAzOyAgLy8gNS1iaXQgcmVkCisJCWcgPj49IDI7ICAvLyA2LWJpdCBncmVlbgorCQliID4+PSAzOyAgLy8gNS1iaXQgYmx1ZQorCQlyZXR1cm4gYiArIChnIDw8IDUpICsgKHIgPDwgKDUrNikpOworCX0KKwkvLyBSR0IgODg4CisJcmV0dXJuIGIgKyAoZyA8PCA4KSArIChyIDw8IDE2KTsKK30KKworLyoqCisgKiBEcmF3IHBpeGVsIG9uIGZyYW1lYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGZiX3dyaXRlX3BpeGVsKHVuc2lnbmVkIGNoYXIgKmFkZHIsIHVuc2lnbmVkIHBpeGVsKQoreworCXN3aXRjaCAoRy5ieXRlc19wZXJfcGl4ZWwpIHsKKwljYXNlIDI6CisJCSoodWludDE2X3QgKilhZGRyID0gcGl4ZWw7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKih1aW50MzJfdCAqKWFkZHIgPSBwaXhlbDsKKwkJYnJlYWs7CisJZGVmYXVsdDogLy8gMjQgYml0cyBwZXIgcGl4ZWwKKwkJYWRkclswXSA9IHBpeGVsOworCQlhZGRyWzFdID0gcGl4ZWwgPj4gODsKKwkJYWRkclsyXSA9IHBpeGVsID4+IDE2OworCX0KK30KKworCisvKioKKyAqIERyYXcgaG9sbG93IHJlY3RhbmdsZSBvbiBmcmFtZWJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBmYl9kcmF3cmVjdGFuZ2xlKHZvaWQpCit7CisJaW50IGNudDsKKwl1bnNpZ25lZCB0aGlzcGl4OworCXVuc2lnbmVkIGNoYXIgKnB0cjEsICpwdHIyOworCXVuc2lnbmVkIGNoYXIgbnJlZCA9IEcubmJhcl9jb2xyLzI7CisJdW5zaWduZWQgY2hhciBuZ3JlZW4gPSAgRy5uYmFyX2NvbGcvMjsKKwl1bnNpZ25lZCBjaGFyIG5ibHVlID0gRy5uYmFyX2NvbGIvMjsKKworCXRoaXNwaXggPSBmYl9waXhlbF92YWx1ZShucmVkLCBuZ3JlZW4sIG5ibHVlKTsKKworCS8vIGhvcml6b250YWwgbGluZXMKKwlwdHIxID0gRy5hZGRyICsgKEcubmJhcl9wb3N5ICogRy5zY3JfdmFyLnhyZXMgKyBHLm5iYXJfcG9zeCkgKiBHLmJ5dGVzX3Blcl9waXhlbDsKKwlwdHIyID0gRy5hZGRyICsgKChHLm5iYXJfcG9zeSArIEcubmJhcl9oZWlnaHQgLSAxKSAqIEcuc2NyX3Zhci54cmVzICsgRy5uYmFyX3Bvc3gpICogRy5ieXRlc19wZXJfcGl4ZWw7CisJY250ID0gRy5uYmFyX3dpZHRoIC0gMTsKKwlkbyB7CisJCWZiX3dyaXRlX3BpeGVsKHB0cjEsIHRoaXNwaXgpOworCQlmYl93cml0ZV9waXhlbChwdHIyLCB0aGlzcGl4KTsKKwkJcHRyMSArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwkJcHRyMiArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwl9IHdoaWxlICgtLWNudCA+PSAwKTsKKworCS8vIHZlcnRpY2FsIGxpbmVzCisJcHRyMSA9IEcuYWRkciArIChHLm5iYXJfcG9zeSAqIEcuc2NyX3Zhci54cmVzICsgRy5uYmFyX3Bvc3gpICogRy5ieXRlc19wZXJfcGl4ZWw7CisJcHRyMiA9IEcuYWRkciArIChHLm5iYXJfcG9zeSAqIEcuc2NyX3Zhci54cmVzICsgRy5uYmFyX3Bvc3ggKyBHLm5iYXJfd2lkdGggLSAxKSAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCWNudCA9IEcubmJhcl9oZWlnaHQgLSAxOworCWRvIHsKKwkJZmJfd3JpdGVfcGl4ZWwocHRyMSwgdGhpc3BpeCk7CisJCWZiX3dyaXRlX3BpeGVsKHB0cjIsIHRoaXNwaXgpOworCQlwdHIxICs9IEcuc2NyX3Zhci54cmVzICogRy5ieXRlc19wZXJfcGl4ZWw7CisJCXB0cjIgKz0gRy5zY3JfdmFyLnhyZXMgKiBHLmJ5dGVzX3Blcl9waXhlbDsKKwl9IHdoaWxlICgtLWNudCA+PSAwKTsKK30KKworCisvKioKKyAqIERyYXcgZmlsbGVkIHJlY3RhbmdsZSBvbiBmcmFtZWJ1ZmZlcgorICogXHBhcmFtIG54MXBvcyxueTFwb3MgdXBwZXIgbGVmdCBwb3NpdGlvbgorICogXHBhcmFtIG54MnBvcyxueTJwb3MgZG93biByaWdodCBwb3NpdGlvbgorICogXHBhcmFtIG5yZWQsbmdyZWVuLG5ibHVlIHJnYiBjb2xvcgorICovCitzdGF0aWMgdm9pZCBmYl9kcmF3ZnVsbHJlY3RhbmdsZShpbnQgbngxcG9zLCBpbnQgbnkxcG9zLCBpbnQgbngycG9zLCBpbnQgbnkycG9zLAorCXVuc2lnbmVkIGNoYXIgbnJlZCwgdW5zaWduZWQgY2hhciBuZ3JlZW4sIHVuc2lnbmVkIGNoYXIgbmJsdWUpCit7CisJaW50IGNudDEsIGNudDIsIG55cG9zOworCXVuc2lnbmVkIHRoaXNwaXg7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJdGhpc3BpeCA9IGZiX3BpeGVsX3ZhbHVlKG5yZWQsIG5ncmVlbiwgbmJsdWUpOworCisJY250MSA9IG55MnBvcyAtIG55MXBvczsKKwlueXBvcyA9IG55MXBvczsKKwlkbyB7CisJCXB0ciA9IEcuYWRkciArIChueXBvcyAqIEcuc2NyX3Zhci54cmVzICsgbngxcG9zKSAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCQljbnQyID0gbngycG9zIC0gbngxcG9zOworCQlkbyB7CisJCQlmYl93cml0ZV9waXhlbChwdHIsIHRoaXNwaXgpOworCQkJcHRyICs9IEcuYnl0ZXNfcGVyX3BpeGVsOworCQl9IHdoaWxlICgtLWNudDIgPj0gMCk7CisKKwkJbnlwb3MrKzsKKwl9IHdoaWxlICgtLWNudDEgPj0gMCk7Cit9CisKKworLyoqCisgKiBEcmF3IGEgcHJvZ3Jlc3MgYmFyIG9uIGZyYW1lYnVmZmVyCisgKiBccGFyYW0gcGVyY2VudCBwZXJjZW50YWdlIG9mIGxvYWRpbmcKKyAqLworc3RhdGljIHZvaWQgZmJfZHJhd3Byb2dyZXNzYmFyKHVuc2lnbmVkIHBlcmNlbnQpCit7CisJaW50IGksIGxlZnRfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQ7CisKKwkvLyBvdXRlciBib3gKKwlsZWZ0X3ggPSBHLm5iYXJfcG9zeDsKKwl0b3BfeSA9IEcubmJhcl9wb3N5OworCXdpZHRoID0gRy5uYmFyX3dpZHRoIC0gMTsKKwloZWlnaHQgPSBHLm5iYXJfaGVpZ2h0IC0gMTsKKwlpZiAoKGhlaWdodCB8IHdpZHRoKSA8IDApCisJCXJldHVybjsKKwkvLyBOQjogIndpZHRoIiBvZiAxIGFjdHVhbGx5IG1ha2VzIHJlY3Qgd2l0aCB3aWR0aCBvZiAyIQorCWZiX2RyYXdyZWN0YW5nbGUoKTsKKworCS8vIGlubmVyICJlbXB0eSIgcmVjdGFuZ2xlCisJbGVmdF94Kys7CisJdG9wX3krKzsKKwl3aWR0aCAtPSAyOworCWhlaWdodCAtPSAyOworCWlmICgoaGVpZ2h0IHwgd2lkdGgpIDwgMCkKKwkJcmV0dXJuOworCWZiX2RyYXdmdWxscmVjdGFuZ2xlKAorCQkJbGVmdF94LAl0b3BfeSwKKwkJCQkJbGVmdF94ICsgd2lkdGgsIHRvcF95ICsgaGVpZ2h0LAorCQkJRy5uYmFyX2NvbHIsIEcubmJhcl9jb2xnLCBHLm5iYXJfY29sYik7CisKKwlpZiAocGVyY2VudCA+IDApIHsKKwkJLy8gYWN0dWFsIHByb2dyZXNzIGJhcgorCQl3aWR0aCA9IHdpZHRoICogcGVyY2VudCAvIDEwMDsKKwkJaSA9IGhlaWdodDsKKwkJaWYgKGhlaWdodCA9PSAwKQorCQkJaGVpZ2h0Kys7IC8vIGRpdmlkZSBieSAwIGlzIGJhZAorCQl3aGlsZSAoaSA+PSAwKSB7CisJCQkvLyBkcmF3IG9uZS1saW5lIHRoaWNrICJyZWN0YW5nbGUiCisJCQkvLyB0b3AgbGluZSB3aWxsIGhhdmUgZ3JheSBsdmwgMjAwLCBib3R0b20gb25lIDEwMAorCQkJdW5zaWduZWQgZ3JheV9sZXZlbCA9IDEwMCArIGkqMTAwL2hlaWdodDsKKwkJCWZiX2RyYXdmdWxscmVjdGFuZ2xlKAorCQkJCQlsZWZ0X3gsIHRvcF95LCBsZWZ0X3ggKyB3aWR0aCwgdG9wX3ksCisJCQkJCWdyYXlfbGV2ZWwsIGdyYXlfbGV2ZWwsIGdyYXlfbGV2ZWwpOworCQkJdG9wX3krKzsKKwkJCWktLTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIERyYXcgaW1hZ2UgZnJvbSBQUE0gZmlsZQorICovCitzdGF0aWMgdm9pZCBmYl9kcmF3aW1hZ2Uodm9pZCkKK3sKKwlGSUxFICp0aGVtZV9maWxlOworCWNoYXIgKnJlYWRfcHRyOworCXVuc2lnbmVkIGNoYXIgKnBpeGxpbmU7CisJdW5zaWduZWQgaSwgaiwgd2lkdGgsIGhlaWdodCwgbGluZV9zaXplOworCisJaWYgKExPTkVfREFTSChHLmltYWdlX2ZpbGVuYW1lKSkgeworCQl0aGVtZV9maWxlID0gc3RkaW47CisJfSBlbHNlIHsKKwkJaW50IGZkID0gb3Blbl96aXBwZWQoRy5pbWFnZV9maWxlbmFtZSk7CisJCWlmIChmZCA8IDApCisJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKEcuaW1hZ2VfZmlsZW5hbWUpOworCQl0aGVtZV9maWxlID0geGZkb3Blbl9mb3JfcmVhZChmZCk7CisJfQorCisJLyogUGFyc2UgcHBtIGhlYWRlcjoKKwkgKiAtIE1hZ2ljOiB0d28gY2hhcmFjdGVycyAiUDYiLgorCSAqIC0gV2hpdGVzcGFjZSAoYmxhbmtzLCBUQUJzLCBDUnMsIExGcykuCisJICogLSBBIHdpZHRoLCBmb3JtYXR0ZWQgYXMgQVNDSUkgY2hhcmFjdGVycyBpbiBkZWNpbWFsLgorCSAqIC0gV2hpdGVzcGFjZS4KKwkgKiAtIEEgaGVpZ2h0LCBBU0NJSSBkZWNpbWFsLgorCSAqIC0gV2hpdGVzcGFjZS4KKwkgKiAtIFRoZSBtYXhpbXVtIGNvbG9yIHZhbHVlLCBBU0NJSSBkZWNpbWFsLCBpbiAwLi42NTUzNQorCSAqIC0gTmV3bGluZSBvciBvdGhlciBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCisJICogICAod2Ugc3VwcG9ydCBuZXdsaW5lIG9ubHkpCisJICogLSBBIHJhc3RlciBvZiBXaWR0aCAqIEhlaWdodCBwaXhlbHMgaW4gdHJpcGxldHMgb2YgcmdiCisJICogICBpbiBwdXJlIGJpbmFyeSBieSAxIG9yIDIgYnl0ZXMuICh3ZSBzdXBwb3J0IG9ubHkgMSBieXRlKQorCSAqLworI2RlZmluZSBjb25jYXRfYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJcmVhZF9wdHIgPSBjb25jYXRfYnVmOworCXdoaWxlICgxKSB7CisJCWludCB3LCBoLCBtYXhfY29sb3JfdmFsOworCQlpbnQgcmVtID0gY29uY2F0X2J1ZiArIHNpemVvZihjb25jYXRfYnVmKSAtIHJlYWRfcHRyOworCQlpZiAocmVtIDwgMgorCQkgfHwgZmdldHMocmVhZF9wdHIsIHJlbSwgdGhlbWVfZmlsZSkgPT0gTlVMTAorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgUFBNIGZpbGUgJyVzJyIsIEcuaW1hZ2VfZmlsZW5hbWUpOworCQl9CisJCXJlYWRfcHRyID0gc3RyY2hybnVsKHJlYWRfcHRyLCAnIycpOworCQkqcmVhZF9wdHIgPSAnXDAnOyAvKiBpZ25vcmUgI2NvbW1lbnRzICovCisJCWlmIChzc2NhbmYoY29uY2F0X2J1ZiwgIlA2ICV1ICV1ICV1IiwgJncsICZoLCAmbWF4X2NvbG9yX3ZhbCkgPT0gMworCQkgJiYgbWF4X2NvbG9yX3ZhbCA8PSAyNTUKKwkJKSB7CisJCQl3aWR0aCA9IHc7IC8qIHcgaXMgb24gc3RhY2ssIHdpZHRoIG1heSBiZSBpbiByZWdpc3RlciAqLworCQkJaGVpZ2h0ID0gaDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbGluZV9zaXplID0gd2lkdGgqMzsKKwlwaXhsaW5lID0geG1hbGxvYyhsaW5lX3NpemUpOworCisJaWYgKHdpZHRoID4gRy5zY3JfdmFyLnhyZXMpCisJCXdpZHRoID0gRy5zY3JfdmFyLnhyZXM7CisJaWYgKGhlaWdodCA+IEcuc2NyX3Zhci55cmVzKQorCQloZWlnaHQgPSBHLnNjcl92YXIueXJlczsKKwlmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKwkJdW5zaWduZWQgY2hhciAqcGl4ZWw7CisJCXVuc2lnbmVkIGNoYXIgKnNyYzsKKworCQlpZiAoZnJlYWQocGl4bGluZSwgMSwgbGluZV9zaXplLCB0aGVtZV9maWxlKSAhPSBsaW5lX3NpemUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIFBQTSBmaWxlICclcyciLCBHLmltYWdlX2ZpbGVuYW1lKTsKKwkJcGl4ZWwgPSBwaXhsaW5lOworCQlzcmMgPSBHLmFkZHIgKyBqICogRy5zY3JfZml4LmxpbmVfbGVuZ3RoOworCQlmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworCQkJdW5zaWduZWQgdGhpc3BpeCA9IGZiX3BpeGVsX3ZhbHVlKHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pOworCQkJZmJfd3JpdGVfcGl4ZWwoc3JjLCB0aGlzcGl4KTsKKwkJCXNyYyArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwkJCXBpeGVsICs9IDM7CisJCX0KKwl9CisJZnJlZShwaXhsaW5lKTsKKwlmY2xvc2UodGhlbWVfZmlsZSk7Cit9CisKKworLyoqCisgKiBQYXJzZSBjb25maWd1cmF0aW9uIGZpbGUKKyAqIFxwYXJhbSAqY2ZnX2ZpbGVuYW1lIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorICovCitzdGF0aWMgdm9pZCBpbml0KGNvbnN0IGNoYXIgKmNmZ19maWxlbmFtZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwYXJhbV9uYW1lc1tdIEFMSUdOMSA9CisJCSJCQVJfV0lEVEhcMCIgIkJBUl9IRUlHSFRcMCIKKwkJIkJBUl9MRUZUXDAiICJCQVJfVE9QXDAiCisJCSJCQVJfUlwwIiAiQkFSX0dcMCIgIkJBUl9CXDAiCisjaWYgREVCVUcKKwkJIkRFQlVHXDAiCisjZW5kaWYKKwkJOworCWNoYXIgKnRva2VuWzJdOworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoY2ZnX2ZpbGVuYW1lLCB4Zm9wZW5fc3RkaW4pOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIz0iLAorCQkJCShQQVJTRV9OT1JNQUwgfCBQQVJTRV9NSU5fRElFKSAmIH4oUEFSU0VfVFJJTSB8IFBBUlNFX0NPTExBUFNFKSkpIHsKKwkJdW5zaWduZWQgdmFsID0geGF0b2lfcG9zaXRpdmUodG9rZW5bMV0pOworCQlpbnQgaSA9IGluZGV4X2luX3N0cmluZ3MocGFyYW1fbmFtZXMsIHRva2VuWzBdKTsKKwkJaWYgKGkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvcjogJXMiLCB0b2tlblswXSk7CisJCWlmIChpID49IDAgJiYgaSA8IDcpCisJCQlHLm5zW2ldID0gdmFsOworI2lmIERFQlVHCisJCWlmIChpID09IDcpIHsKKwkJCUcuYmRlYnVnX21lc3NhZ2VzID0gdmFsOworCQkJaWYgKEcuYmRlYnVnX21lc3NhZ2VzKQorCQkJCUcubG9nZmlsZV9mZCA9IHhmb3Blbl9mb3Jfd3JpdGUoIi90bXAvZmJzcGxhc2gubG9nIik7CisJCX0KKyNlbmRpZgorCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKK30KKworCitpbnQgZmJzcGxhc2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZic3BsYXNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpmYl9kZXZpY2UsICpjZmdfZmlsZW5hbWUsICpmaWZvX2ZpbGVuYW1lOworCUZJTEUgKmZwID0gZnA7IC8vIGZvciBjb21waWxlcgorCWNoYXIgKm51bV9idWY7CisJdW5zaWduZWQgbnVtOworCWJvb2wgYkN1cnNvck9mZjsKKworCUlOSVRfRygpOworCisJLy8gcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKKwlmYl9kZXZpY2UgPSAiL2Rldi9mYjAiOworCWNmZ19maWxlbmFtZSA9IE5VTEw7CisJZmlmb19maWxlbmFtZSA9IE5VTEw7CisJYkN1cnNvck9mZiA9IDEgJiBnZXRvcHQzMihhcmd2LCAiY3M6ZDppOmY6IiwKKwkJCSZHLmltYWdlX2ZpbGVuYW1lLCAmZmJfZGV2aWNlLCAmY2ZnX2ZpbGVuYW1lLCAmZmlmb19maWxlbmFtZSk7CisKKwkvLyBwYXJzZSBjb25maWd1cmF0aW9uIGZpbGUKKwlpZiAoY2ZnX2ZpbGVuYW1lKQorCQlpbml0KGNmZ19maWxlbmFtZSk7CisKKwkvLyBXZSBtdXN0IGhhdmUgLXMgSU1HCisJaWYgKCFHLmltYWdlX2ZpbGVuYW1lKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlmYl9vcGVuKGZiX2RldmljZSk7CisKKwlpZiAoZmlmb19maWxlbmFtZSAmJiBiQ3Vyc29yT2ZmKSB7CisJCS8vIGhpZGUgY3Vyc29yIChCRUZPUkUgYW55IGZiIG9wcykKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAzM1s/MjVsIiwgNik7CisJfQorCisJZmJfZHJhd2ltYWdlKCk7CisKKwlpZiAoIWZpZm9fZmlsZW5hbWUpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwlmcCA9IHhmb3Blbl9zdGRpbihmaWZvX2ZpbGVuYW1lKTsKKwlpZiAoZnAgIT0gc3RkaW4pIHsKKwkJLy8gRm9yIG5hbWVkIHBpcGVzLCB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpczoKKwkJLy8gIG1rZmlmbyBjbWRfcGlwZQorCQkvLyAgZmJzcGxhc2ggLWYgY21kX3BpcGUgLi4uLiAmCisJCS8vICAuLi4KKwkJLy8gIGVjaG8gMzMgPmNtZF9waXBlCisJCS8vICAuLi4KKwkJLy8gIGVjaG8gNjYgPmNtZF9waXBlCisJCS8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBkb24ndCB3YW50IGZic3BsYXNoIHRvIGdldCBFT0YKKwkJLy8gd2hlbiBsYXN0IHdyaXRlciBjbG9zZXMgaW5wdXQgZW5kLgorCQkvLyBUaGUgc2ltcGxlc3Qgd2F5IGlzIHRvIG9wZW4gZmlmbyBmb3Igd3JpdGluZyB0b28KKwkJLy8gYW5kIGJlY29tZSBhbiBhZGRpdGlvbmFsIHdyaXRlciA6KQorCQlvcGVuKGZpZm9fZmlsZW5hbWUsIE9fV1JPTkxZKTsgLy8gZXJyb3JzIGFyZSBpZ25vcmVkCisJfQorCisJZmJfZHJhd3Byb2dyZXNzYmFyKDApOworCS8vIEJsb2NrIG9uIHJlYWQsIHdhaXRpbmcgZm9yIHNvbWUgaW5wdXQuCisJLy8gVXNlIG9mIDxzdGRpby5oPiBzdHlsZSBJL08gYWxsb3dzIHRvIGNvcnJlY3RseQorCS8vIGhhbmRsZSBhIGNhc2Ugd2hlbiB3ZSBoYXZlIG1hbnkgYnVmZmVyZWQgbGluZXMKKwkvLyBhbHJlYWR5IGluIHRoZSBwaXBlCisJd2hpbGUgKChudW1fYnVmID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAobnVtX2J1ZiwgImV4aXQiLCA0KSA9PSAwKSB7CisJCQlERUJVR19NRVNTQUdFKCJleGl0Iik7CisJCQlicmVhazsKKwkJfQorCQludW0gPSBhdG9pKG51bV9idWYpOworCQlpZiAoaXNkaWdpdChudW1fYnVmWzBdKSAmJiAobnVtIDw9IDEwMCkpIHsKKyNpZiBERUJVRworCQkJREVCVUdfTUVTU0FHRShpdG9hKG51bSkpOworI2VuZGlmCisJCQlmYl9kcmF3cHJvZ3Jlc3NiYXIobnVtKTsKKwkJfQorCQlmcmVlKG51bV9idWYpOworCX0KKworCWlmIChiQ3Vyc29yT2ZmKSAvLyByZXN0b3JlIGN1cnNvcgorCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sICJcMDMzWz8yNWgiLCA2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZmJzcGxhc2guY2ZnIGIvbWlzY3V0aWxzL2Zic3BsYXNoLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmNmNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2Zic3BsYXNoLmNmZwpAQCAtMCwwICsxLDkgQEAKKyMgcHJvZ3Jlc3MgYmFyIHBvc2l0aW9uCitCQVJfTEVGVD0xNzAKK0JBUl9UT1A9MzAwCitCQVJfV0lEVEg9MzAwCitCQVJfSEVJR0hUPTIwCisjIHByb2dyZXNzIGJhciBjb2xvcgorQkFSX1I9ODAKK0JBUl9HPTgwCitCQVJfQj0xMzAKZGlmZiAtLWdpdCBhL21pc2N1dGlscy9mbGFzaF9lcmFzZWFsbC5jIGIvbWlzY3V0aWxzL2ZsYXNoX2VyYXNlYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5ODM3MQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9mbGFzaF9lcmFzZWFsbC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIGVyYXNlYWxsLmMgLS0gZXJhc2UgdGhlIHdob2xlIG9mIGEgTVREIGRldmljZQorICoKKyAqIFBvcnRlZCB0byBidXN5Ym94IGZyb20gbXRkLXV0aWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBBcmNvbSBDb250cm9sIFN5c3RlbSBMdGQKKyAqCisgKiBSZW5hbWVkIHRvIGZsYXNoX2VyYXNlYWxsLmMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaF9lcmFzZWFsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1qcV0gTVREX0RFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaF9lcmFzZWFsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVyYXNlIGFuIE1URCBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWoJRm9ybWF0IHRoZSBkZXZpY2UgZm9yIGpmZnMyIgorLy91c2FnZTogICAgICJcbgktcQlEb24ndCBkaXNwbGF5IHByb2dyZXNzIG1lc3NhZ2VzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorCisjZGVmaW5lIE9QVElPTl9KICAoMSA8PCAwKQorI2RlZmluZSBPUFRJT05fUSAgKDEgPDwgMSkKKyNkZWZpbmUgSVNfTkFORCAgICgxIDw8IDIpCisjZGVmaW5lIEJCVEVTVCAgICAoMSA8PCAzKQorCisvKiBtdGQvamZmczItdXNlci5oIHVzZWQgdG8gaGF2ZSB0aGlzIGF0cm9jaXR5OgorZXh0ZXJuIGludCB0YXJnZXRfZW5kaWFuOworCisjZGVmaW5lIHQxNih4KSAoeyBfX3UxNiBfX2IgPSAoeCk7ICh0YXJnZXRfZW5kaWFuPT1fX0JZVEVfT1JERVIpP19fYjpic3dhcF8xNihfX2IpOyB9KQorI2RlZmluZSB0MzIoeCkgKHsgX191MzIgX19iID0gKHgpOyAodGFyZ2V0X2VuZGlhbj09X19CWVRFX09SREVSKT9fX2I6YnN3YXBfMzIoX19iKTsgfSkKKworI2RlZmluZSBjcHVfdG9famUxNih4KSAoKGppbnQxNl90KXt0MTYoeCl9KQorI2RlZmluZSBjcHVfdG9famUzMih4KSAoKGppbnQzMl90KXt0MzIoeCl9KQorI2RlZmluZSBjcHVfdG9famVtb2RlKHgpICgoam1vZGVfdCl7dDMyKHgpfSkKKworI2RlZmluZSBqZTE2X3RvX2NwdSh4KSAodDE2KCh4KS52MTYpKQorI2RlZmluZSBqZTMyX3RvX2NwdSh4KSAodDMyKCh4KS52MzIpKQorI2RlZmluZSBqZW1vZGVfdG9fY3B1KHgpICh0MzIoKHgpLm0pKQorCitidXQgbXRkL2pmZnMyLXVzZXIuaCBpcyBnb25lIG5vdyAoYXQgbGVhc3QgMi42LjMxLjYgZG9lcyBub3QgaGF2ZSBpdCBhbnltb3JlKQorKi8KKworLyogV2UgYWx3YXlzIHVzZSBuYXRpdmUgZW5kaWFubmVzcyAqLworI3VuZGVmIGNwdV90b19qZTE2CisjdW5kZWYgY3B1X3RvX2plMzIKKyNkZWZpbmUgY3B1X3RvX2plMTYodikgKChqaW50MTZfdCl7KHYpfSkKKyNkZWZpbmUgY3B1X3RvX2plMzIodikgKChqaW50MzJfdCl7KHYpfSkKKworc3RhdGljIHZvaWQgc2hvd19wcm9ncmVzcyhtdGRfaW5mb190ICptZW1pbmZvLCBlcmFzZV9pbmZvX3QgKmVyYXNlKQoreworCXByaW50ZigiXHJFcmFzaW5nICV1IEtpYnl0ZSBAICV4IC0gJTJ1JSUgY29tcGxldGUuIiwKKwkJKHVuc2lnbmVkKW1lbWluZm8tPmVyYXNlc2l6ZSAvIDEwMjQsCisJCWVyYXNlLT5zdGFydCwKKwkJKHVuc2lnbmVkKSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgZXJhc2UtPnN0YXJ0ICogMTAwIC8gbWVtaW5mby0+c2l6ZSkKKwkpOworCWZmbHVzaF9hbGwoKTsKK30KKworaW50IGZsYXNoX2VyYXNlYWxsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmbGFzaF9lcmFzZWFsbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBjbGVhbm1hcmtlcjsKKwltdGRfaW5mb190IG1lbWluZm87CisJaW50IGZkLCBjbG1wb3MsIGNsbWxlbjsKKwllcmFzZV9pbmZvX3QgZXJhc2U7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWNoYXIgKm10ZF9uYW1lOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOworCWZsYWdzID0gQkJURVNUIHwgZ2V0b3B0MzIoYXJndiwgImpxIik7CisKKwltdGRfbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKwlmZCA9IHhvcGVuKG10ZF9uYW1lLCBPX1JEV1IpOworCWZzdGF0KGZkLCAmc3QpOworCWlmICghU19JU0NIUihzdC5zdF9tb2RlKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBub3QgYSBjaGFyIGRldmljZSIsIG10ZF9uYW1lKTsKKworCXhpb2N0bChmZCwgTUVNR0VUSU5GTywgJm1lbWluZm8pOworCWVyYXNlLmxlbmd0aCA9IG1lbWluZm8uZXJhc2VzaXplOworCWlmIChtZW1pbmZvLnR5cGUgPT0gTVREX05BTkRGTEFTSCkKKwkJZmxhZ3MgfD0gSVNfTkFORDsKKworCWNsbXBvcyA9IDA7CisJY2xtbGVuID0gODsKKwlpZiAoZmxhZ3MgJiBPUFRJT05fSikgeworCQl1aW50MzJfdCAqY3JjMzJfdGFibGU7CisKKwkJY3JjMzJfdGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMCk7CisKKwkJY2xlYW5tYXJrZXIubWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwkJY2xlYW5tYXJrZXIubm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9DTEVBTk1BUktFUik7CisJCWlmICghKGZsYWdzICYgSVNfTkFORCkpCisJCQljbGVhbm1hcmtlci50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkpOworCQllbHNlIHsKKwkJCXN0cnVjdCBuYW5kX29vYmluZm8gb29iaW5mbzsKKworCQkJeGlvY3RsKGZkLCBNRU1HRVRPT0JTRUwsICZvb2JpbmZvKTsKKworCQkJLyogQ2hlY2sgZm9yIGF1dG9wbGFjZW1lbnQgKi8KKwkJCWlmIChvb2JpbmZvLnVzZWVjYyA9PSBNVERfTkFOREVDQ19BVVRPUExBQ0UpIHsKKwkJCQkvKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmcmVlIGJ5dGVzICovCisJCQkJY2xtcG9zID0gb29iaW5mby5vb2JmcmVlWzBdWzBdOworCQkJCWNsbWxlbiA9IG9vYmluZm8ub29iZnJlZVswXVsxXTsKKwkJCQlpZiAoY2xtbGVuID4gOCkKKwkJCQkJY2xtbGVuID0gODsKKwkJCQlpZiAoY2xtbGVuID09IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJhdXRvcGxhY2VtZW50IHNlbGVjdGVkIGFuZCBubyBlbXB0eSBzcGFjZSBpbiBvb2IiKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTGVnYWN5IG1vZGUgKi8KKwkJCQlzd2l0Y2ggKG1lbWluZm8ub29ic2l6ZSkgeworCQkJCWNhc2UgODoKKwkJCQkJY2xtcG9zID0gNjsKKwkJCQkJY2xtbGVuID0gMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxNjoKKwkJCQkJY2xtcG9zID0gODsKKwkJCQkJLypjbG1sZW4gPSA4OyovCisJCQkJCWJyZWFrOworCQkJCWNhc2UgNjQ6CisJCQkJCWNsbXBvcyA9IDE2OworCQkJCQkvKmNsbWxlbiA9IDg7Ki8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY2xlYW5tYXJrZXIudG90bGVuID0gY3B1X3RvX2plMzIoOCk7CisJCX0KKworCQljbGVhbm1hcmtlci5oZHJfY3JjID0gY3B1X3RvX2plMzIoCisJCQljcmMzMl9ibG9ja19lbmRpYW4wKDAsICZjbGVhbm1hcmtlciwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpIC0gNCwgY3JjMzJfdGFibGUpCisJCSk7CisJfQorCisJLyogRG9uJ3Qgd2FudCB0byBkZXN0cm95IHByb2dyZXNzIGluZGljYXRvciBieSBiYl9lcnJvcl9tc2cncyAqLworCWFwcGxldF9uYW1lID0geGFzcHJpbnRmKCJcbiVzOiAlcyIsIGFwcGxldF9uYW1lLCBtdGRfbmFtZSk7CisKKwlmb3IgKGVyYXNlLnN0YXJ0ID0gMDsgZXJhc2Uuc3RhcnQgPCBtZW1pbmZvLnNpemU7CisJICAgICBlcmFzZS5zdGFydCArPSBtZW1pbmZvLmVyYXNlc2l6ZSkgeworCQlpZiAoZmxhZ3MgJiBCQlRFU1QpIHsKKwkJCWludCByZXQ7CisJCQlsb2ZmX3Qgb2Zmc2V0ID0gZXJhc2Uuc3RhcnQ7CisKKwkJCXJldCA9IGlvY3RsKGZkLCBNRU1HRVRCQURCTE9DSywgJm9mZnNldCk7CisJCQlpZiAocmV0ID4gMCkgeworCQkJCWlmICghKGZsYWdzICYgT1BUSU9OX1EpKQorCQkJCQliYl9pbmZvX21zZygiXG5Ta2lwcGluZyBiYWQgYmxvY2sgYXQgMHglMDh4IiwgZXJhc2Uuc3RhcnQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHJldCA8IDApIHsKKwkJCQkvKiBCbGFjayBibG9jayB0YWJsZSBpcyBub3QgYXZhaWxhYmxlIG9uIGNlcnRhaW4gZmxhc2gKKwkJCQkgKiB0eXBlcyBlLmcuIE5PUgorCQkJCSAqLworCQkJCWlmIChlcnJubyA9PSBFT1BOT1RTVVBQKSB7CisJCQkJCWZsYWdzICY9IH5CQlRFU1Q7CisJCQkJCWlmIChmbGFncyAmIElTX05BTkQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGJsb2NrIGNoZWNrIG5vdCBhdmFpbGFibGUiKTsKKwkJCQl9IGVsc2UgeworCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIk1FTUdFVEJBREJMT0NLIGVycm9yIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCEoZmxhZ3MgJiBPUFRJT05fUSkpCisJCQlzaG93X3Byb2dyZXNzKCZtZW1pbmZvLCAmZXJhc2UpOworCisJCXhpb2N0bChmZCwgTUVNRVJBU0UsICZlcmFzZSk7CisKKwkJLyogZm9ybWF0IGZvciBKRkZTMiA/ICovCisJCWlmICghKGZsYWdzICYgT1BUSU9OX0opKQorCQkJY29udGludWU7CisKKwkJLyogd3JpdGUgY2xlYW5tYXJrZXIgKi8KKwkJaWYgKGZsYWdzICYgSVNfTkFORCkgeworCQkJc3RydWN0IG10ZF9vb2JfYnVmIG9vYjsKKworCQkJb29iLnB0ciA9ICh1bnNpZ25lZCBjaGFyICopICZjbGVhbm1hcmtlcjsKKwkJCW9vYi5zdGFydCA9IGVyYXNlLnN0YXJ0ICsgY2xtcG9zOworCQkJb29iLmxlbmd0aCA9IGNsbWxlbjsKKwkJCXhpb2N0bChmZCwgTUVNV1JJVEVPT0IsICZvb2IpOworCQl9IGVsc2UgeworCQkJeGxzZWVrKGZkLCBlcmFzZS5zdGFydCwgU0VFS19TRVQpOworCQkJLyogaWYgKGxzZWVrKGZkLCBlcmFzZS5zdGFydCwgU0VFS19TRVQpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coIk1URCAlcyBmYWlsdXJlIiwgInNlZWsiKTsKKwkJCQljb250aW51ZTsKKwkJCX0gKi8KKwkJCXh3cml0ZShmZCwgJmNsZWFubWFya2VyLCBzaXplb2YoY2xlYW5tYXJrZXIpKTsKKwkJCS8qIGlmICh3cml0ZShmZCwgJmNsZWFubWFya2VyLCBzaXplb2YoY2xlYW5tYXJrZXIpKSAhPSBzaXplb2YoY2xlYW5tYXJrZXIpKSB7CisJCQkJYmJfcGVycm9yX21zZygiTVREICVzIGZhaWx1cmUiLCAid3JpdGUiKTsKKwkJCQljb250aW51ZTsKKwkJCX0gKi8KKwkJfQorCQlpZiAoIShmbGFncyAmIE9QVElPTl9RKSkKKwkJCXByaW50ZigiIENsZWFubWFya2VyIHdyaXR0ZW4gYXQgJXguIiwgZXJhc2Uuc3RhcnQpOworCX0KKwlpZiAoIShmbGFncyAmIE9QVElPTl9RKSkgeworCQlzaG93X3Byb2dyZXNzKCZtZW1pbmZvLCAmZXJhc2UpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmQpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZmxhc2hfbG9ja191bmxvY2suYyBiL21pc2N1dGlscy9mbGFzaF9sb2NrX3VubG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZWZkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvZmxhc2hfbG9ja191bmxvY2suYwpAQCAtMCwwICsxLDgxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIFBvcnRlZCB0byBidXN5Ym94IGZyb20gbXRkLXV0aWxzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZsYXNoX2xvY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIk1URF9ERVZJQ0UgT0ZGU0VUIFNFQ1RPUlMiCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfbG9ja19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxvY2sgcGFydCBvciBhbGwgb2YgYW4gTVREIGRldmljZS4gSWYgU0VDVE9SUyBpcyAtMSwgdGhlbiBhbGwgc2VjdG9yc1xuIgorLy91c2FnZTogICAgICAgIndpbGwgYmUgbG9ja2VkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBPRkZTRVQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZsYXNoX3VubG9ja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTVREX0RFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaF91bmxvY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVbmxvY2sgYW4gTVREIGRldmljZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+CisKK2ludCBmbGFzaF9sb2NrX3VubG9ja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmxhc2hfbG9ja191bmxvY2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIG5vdGU6IGZpZWxkcyBpbiB0aGVzZSBzdHJ1Y3RzIGFyZSAzMi1iaXRzLgorCSAqIGFwcGFyZW50bHkgd2UgY2FuJ3Qgd2luIGFueXRoaW5nIGJ5IHVzaW5nIG9mZl90CisJICogb3IgbG9uZyBsb25nJ3MgZm9yIG9mZnNldCBhbmQvb3Igc2VjdG9ycyB2YXJzLiAqLworCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87CisJc3RydWN0IGVyYXNlX2luZm9fdXNlciBsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWxvbmcgc2VjdG9yczsKKwlpbnQgZmQ7CisKKyNkZWZpbmUgZG9fbG9jayAoRU5BQkxFX0ZMQVNIX0xPQ0sgJiYgKCFFTkFCTEVfRkxBU0hfVU5MT0NLIHx8IChhcHBsZXRfbmFtZVs2XSA9PSAnbCcpKSkKKworCWlmICghYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogcGFyc2Ugb2Zmc2V0IGFuZCBudW1iZXIgb2Ygc2VjdG9ycyB0byBsb2NrICovCisJb2Zmc2V0ID0gMDsKKwlzZWN0b3JzID0gLTE7CisJaWYgKGRvX2xvY2spIHsKKwkJaWYgKCFhcmd2WzJdIHx8ICFhcmd2WzNdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlvZmZzZXQgPSB4c3RydG91bChhcmd2WzJdLCAwKTsKKwkJc2VjdG9ycyA9IHhzdHJ0b2woYXJndlszXSwgMCk7CisJfQorCisJZmQgPSB4b3Blbihhcmd2WzFdLCBPX1JEV1IpOworCisJeGlvY3RsKGZkLCBNRU1HRVRJTkZPLCAmaW5mbyk7CisKKwlsb2NrLnN0YXJ0ID0gMDsKKwlsb2NrLmxlbmd0aCA9IGluZm8uc2l6ZTsKKwlpZiAoZG9fbG9jaykgeworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBpbmZvLnNpemUgLSBpbmZvLmVyYXNlc2l6ZTsKKwkJaWYgKG9mZnNldCA+IHNpemUpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlbHggaXMgYmV5b25kIGRldmljZSBzaXplICVseFxuIiwKKwkJCQkJb2Zmc2V0LCBzaXplKTsKKwkJfQorCisJCWlmIChzZWN0b3JzID09IC0xKSB7CisJCQlzZWN0b3JzID0gaW5mby5zaXplIC8gaW5mby5lcmFzZXNpemU7CisJCX0gZWxzZSB7CisvLyBpc24ndCB0aGlzIHVzZWxlc3M/CisJCQl1bnNpZ25lZCBsb25nIG51bSA9IGluZm8uc2l6ZSAvIGluZm8uZXJhc2VzaXplOworCQkJaWYgKHNlY3RvcnMgPiBudW0pIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJWxkIGFyZSB0b28gbWFueSAiCisJCQkJCQkic2VjdG9ycywgZGV2aWNlIG9ubHkgaGFzICIKKwkJCQkJCSIlbGRcbiIsIHNlY3RvcnMsIG51bSk7CisJCQl9CisJCX0KKworCQlsb2NrLnN0YXJ0ID0gb2Zmc2V0OworCQlsb2NrLmxlbmd0aCA9IHNlY3RvcnMgKiBpbmZvLmVyYXNlc2l6ZTsKKwkJeGlvY3RsKGZkLCBNRU1MT0NLLCAmbG9jayk7CisJfSBlbHNlIHsKKwkJeGlvY3RsKGZkLCBNRU1VTkxPQ0ssICZsb2NrKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2ZsYXNoY3AuYyBiL21pc2N1dGlscy9mbGFzaGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0M2Q4YwotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9mbGFzaGNwLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJ1c3lib3ggcmVpbXBsZW1lbnRhdGlvbiBvZiBmbGFzaGNwCisgKgorICogKEMpIDIwMDkgU3RlZmFuIFNleWZyaWVkIDxzZWlmZUBzcGhhaXJvbi5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hjcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLXYgRklMRSBNVERfREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZsYXNoY3BfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3B5IGFuIGltYWdlIHRvIE1URCBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+CisKKyNkZWZpbmUgTVREX0RFQlVHIDAKKworI2RlZmluZSBPUFRfdiAoMSA8PCAwKQorCisjZGVmaW5lIEJVRlNJWkUgKDggKiAxMDI0KQorCitzdGF0aWMgdm9pZCBwcm9ncmVzcyhpbnQgbW9kZSwgdW9mZl90IGNvdW50LCB1b2ZmX3QgdG90YWwpCit7CisJdW9mZl90IHBlcmNlbnQ7CisKKwlpZiAoIW9wdGlvbl9tYXNrMzIpIC8vaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF92KSkKKwkJcmV0dXJuOworCXBlcmNlbnQgPSBjb3VudCAqIDEwMDsKKwlpZiAodG90YWwpCisJCXBlcmNlbnQgPSAodW5zaWduZWQpIChwZXJjZW50IC8gdG90YWwpOworCXByaW50ZigiXHIlczogJSJPRkZfRk1UInUvJSJPRkZfRk1UInUgKCV1JSUpICIsCisJCShtb2RlID09IDApID8gIkVyYXNpbmcgYmxvY2siIDogKChtb2RlID09IDEpID8gIldyaXRpbmcga2IiIDogIlZlcmlmeWluZyBrYiIpLAorCQljb3VudCwgdG90YWwsICh1bnNpZ25lZClwZXJjZW50KTsKKwlmZmx1c2hfYWxsKCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX25ld2xpbmUodm9pZCkKK3sKKwlpZiAoIW9wdGlvbl9tYXNrMzIpIC8vaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF92KSkKKwkJcmV0dXJuOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKK2ludCBmbGFzaGNwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmbGFzaGNwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmRfZiwgZmRfZDsgLyogaW5wdXQgZmlsZSBhbmQgbXRkIGRldmljZSBmaWxlIGRlc2NyaXB0b3JzICovCisJaW50IGk7CisJdW9mZl90IGVyYXNlX2NvdW50OworCS8vdW5zaWduZWQgb3B0czsKKwlzdHJ1Y3QgbXRkX2luZm9fdXNlciBtdGQ7CisJc3RydWN0IGVyYXNlX2luZm9fdXNlciBlOworCXN0cnVjdCBzdGF0IHN0YXRiOworLy8JY29uc3QgY2hhciAqZmlsZW5hbWUsICpkZXZpY2VuYW1lOworCVJFU0VSVkVfQ09ORklHX1VCVUZGRVIoYnVmLCBCVUZTSVpFKTsKKwlSRVNFUlZFX0NPTkZJR19VQlVGRkVSKGJ1ZjIsIEJVRlNJWkUpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTIiOyAvKiBleGFjdGx5IDIgbm9uLW9wdGlvbiBhcmdzOiBmaWxlLCBkZXYgKi8KKwkvL29wdHMgPSBnZXRvcHQzMihhcmd2LCAidiIpOworCWFyZ3YgKz0gb3B0aW5kOworLy8JZmlsZW5hbWUgPSAqYXJndisrOworLy8JZGV2aWNlbmFtZSA9ICphcmd2OworI2RlZmluZSBmaWxlbmFtZSBhcmd2WzBdCisjZGVmaW5lIGRldmljZW5hbWUgYXJndlsxXQorCisJLyogb3BlbiBpbnB1dCBmaWxlIGFuZCBtdGQgZGV2aWNlIGFuZCBkbyBzYW5pdHkgY2hlY2tzICovCisJZmRfZiA9IHhvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJZnN0YXQoZmRfZiwgJnN0YXRiKTsKKwlmZF9kID0geG9wZW4oZGV2aWNlbmFtZSwgT19TWU5DIHwgT19SRFdSKTsKKyNpZiAhTVREX0RFQlVHCisJaWYgKGlvY3RsKGZkX2QsIE1FTUdFVElORk8sICZtdGQpIDwgMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgbm90IGEgTVREIGZsYXNoIGRldmljZSIsIGRldmljZW5hbWUpOworCX0KKwlpZiAoc3RhdGIuc3Rfc2l6ZSA+IG10ZC5zaXplKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBiaWdnZXIgdGhhbiAlcyIsIGZpbGVuYW1lLCBkZXZpY2VuYW1lKTsKKwl9CisjZWxzZQorCW10ZC5lcmFzZXNpemUgPSA2NCAqIDEwMjQ7CisjZW5kaWYKKworCS8qIGFsd2F5cyBlcmFzZSBhIGNvbXBsZXRlIGJsb2NrICovCisJZXJhc2VfY291bnQgPSAodW9mZl90KShzdGF0Yi5zdF9zaXplICsgbXRkLmVyYXNlc2l6ZSAtIDEpIC8gbXRkLmVyYXNlc2l6ZTsKKwkvKiBlcmFzZSAxIGJsb2NrIGF0IGEgdGltZSB0byBiZSBhYmxlIHRvIGdpdmUgdmVyYm9zZSBvdXRwdXQgKi8KKwllLmxlbmd0aCA9IG10ZC5lcmFzZXNpemU7CisjaWYgMAorLyogKDEpIGJsb2F0CisgKiAoMikgd2lsbCBpdCB3b3JrIGZvciBtdWx0aS1naWdhYnl0ZSBkZXZpY2VzPworICogKDMpIHdvcnNlIHdydCBlcnJvciBkZXRlY3Rpb24gZ3JhbnVsYXJpdHkKKyAqLworCS8qIG9wdGltaXphdGlvbjogaWYgbm90IHZlcmJvc2UsIGVyYXNlIGluIG9uZSBnbyAqLworCWlmICghb3B0cykgeyAvLyBpZiAoIShvcHRzICYgT1BUX3YpKQorCQllLmxlbmd0aCA9IG10ZC5lcmFzZXNpemUgKiBlcmFzZV9jb3VudDsKKwkJZXJhc2VfY291bnQgPSAxOworCX0KKyNlbmRpZgorCWUuc3RhcnQgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gZXJhc2VfY291bnQ7IGkrKykgeworCQlwcm9ncmVzcygwLCBpLCBlcmFzZV9jb3VudCk7CisJCWVycm5vID0gMDsKKyNpZiAhTVREX0RFQlVHCisJCWlmIChpb2N0bChmZF9kLCBNRU1FUkFTRSwgJmUpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcmFzZSBlcnJvciBhdCAweCVsbHggb24gJXMiLAorCQkJCShsb25nIGxvbmcpZS5zdGFydCwgZGV2aWNlbmFtZSk7CisJCX0KKyNlbHNlCisJCXVzbGVlcCgxMDAqMTAwMCk7CisjZW5kaWYKKwkJZS5zdGFydCArPSBtdGQuZXJhc2VzaXplOworCX0KKwlwcm9ncmVzc19uZXdsaW5lKCk7CisKKwkvKiBkb2luZyB0aGlzIG91dGVyIGxvb3AgZ2l2ZXMgc2lnbmlmaWNhbnRseSBzbWFsbGVyIGNvZGUKKwkgKiB0aGFuIGRvaW5nIHR3byBzZXBhcmF0ZSBsb29wcyBmb3Igd3JpdGluZyBhbmQgdmVyaWZ5aW5nICovCisJZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKKwkJdW9mZl90IGRvbmU7CisJCXVuc2lnbmVkIGNvdW50OworCisJCXhsc2VlayhmZF9mLCAwLCBTRUVLX1NFVCk7CisJCXhsc2VlayhmZF9kLCAwLCBTRUVLX1NFVCk7CisJCWRvbmUgPSAwOworCQljb3VudCA9IEJVRlNJWkU7CisJCXdoaWxlICgxKSB7CisJCQl1b2ZmX3QgcmVtID0gc3RhdGIuc3Rfc2l6ZSAtIGRvbmU7CisJCQlpZiAocmVtID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAocmVtIDwgQlVGU0laRSkKKwkJCQljb3VudCA9IHJlbTsKKwkJCXByb2dyZXNzKGksIGRvbmUgLyAxMDI0LCAodW9mZl90KXN0YXRiLnN0X3NpemUgLyAxMDI0KTsKKwkJCXhyZWFkKGZkX2YsIGJ1ZiwgY291bnQpOworCQkJaWYgKGkgPT0gMSkgeworCQkJCWludCByZXQ7CisJCQkJZXJybm8gPSAwOworCQkJCXJldCA9IGZ1bGxfd3JpdGUoZmRfZCwgYnVmLCBjb3VudCk7CisJCQkJaWYgKHJldCAhPSBjb3VudCkgeworCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIndyaXRlIGVycm9yIGF0IDB4JSJPRkZfRk1UInggb24gJXMsICIKKwkJCQkJCSJ3cml0ZSByZXR1cm5lZCAlZCIsCisJCQkJCQlkb25lLCBkZXZpY2VuYW1lLCByZXQpOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qIGkgPT0gMiAqLworCQkJCXhyZWFkKGZkX2QsIGJ1ZjIsIGNvdW50KTsKKwkJCQlpZiAobWVtY21wKGJ1ZiwgYnVmMiwgY291bnQpKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ2ZXJpZmljYXRpb24gbWlzbWF0Y2ggYXQgMHglIk9GRl9GTVQieCIsIGRvbmUpOworCQkJCX0KKwkJCX0KKworCQkJZG9uZSArPSBjb3VudDsKKwkJfQorCisJCXByb2dyZXNzX25ld2xpbmUoKTsKKwl9CisJLyogd2Ugd29uJ3QgY29tZSBoZXJlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9oZHBhcm0uYyBiL21pc2N1dGlscy9oZHBhcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBlN2RlCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2hkcGFybS5jCkBAIC0wLDAgKzEsMjEzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGRwYXJtIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSBbMjAwM10gYnkgW01hdHRlbyBDcm9jZV0gPDMyOTc2Mjc3OTlAd2luZC5pdD4KKyAqIEhhY2tlZCBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4gZm9yIHNpemUgb3B0aW1pemF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBvZiBoZHBhcm06IHNlZSBiZWxvdy4uLgorICogaGRwYXJtLmMgLSBDb21tYW5kIGxpbmUgaW50ZXJmYWNlIHRvIGdldC9zZXQgaGFyZCBkaXNrIHBhcmFtZXRlcnMKKyAqICAgICAgICAgIC0gYnkgTWFyayBMb3JkIChDKSAxOTk0LTIwMDIgLS0gZnJlZWx5IGRpc3RyaWJ1dGFibGUKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaGRwYXJtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0RFVklDRV0iCisvL3VzYWdlOiNkZWZpbmUgaGRwYXJtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUdldC9zZXQgZnMgcmVhZGFoZWFkIgorLy91c2FnZTogICAgICJcbgktQQlTZXQgZHJpdmUgcmVhZC1sb29rYWhlYWQgZmxhZyAoMC8xKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJR2V0L3NldCBidXMgc3RhdGUgKDAgPT0gb2ZmLCAxID09IG9uLCAyID09IHRyaXN0YXRlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUIJU2V0IEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZyAoMS0yNTUpIgorLy91c2FnZTogICAgICJcbgktYwlHZXQvc2V0IElERSAzMi1iaXQgSU8gc2V0dGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJQ2hlY2sgSURFIHBvd2VyIG1vZGUgc3RhdHVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKAorLy91c2FnZTogICAgICJcbgktZAlHZXQvc2V0IHVzaW5nX2RtYSBmbGFnIikKKy8vdXNhZ2U6ICAgICAiXG4JLUQJRW5hYmxlL2Rpc2FibGUgZHJpdmUgZGVmZWN0LW1nbXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZsdXNoIGJ1ZmZlciBjYWNoZSBmb3IgZGV2aWNlIG9uIGV4aXQiCisvL3VzYWdlOiAgICAgIlxuCS1nCURpc3BsYXkgZHJpdmUgZ2VvbWV0cnkiCisvL3VzYWdlOiAgICAgIlxuCS1oCURpc3BsYXkgdGVyc2UgdXNhZ2UgaW5mb3JtYXRpb24iCisvL3VzYWdlOglJRl9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkoCisvL3VzYWdlOiAgICAgIlxuCS1pCURpc3BsYXkgZHJpdmUgaWRlbnRpZmljYXRpb24iKQorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKAorLy91c2FnZTogICAgICJcbgktSQlEZXRhaWxlZC9jdXJyZW50IGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gZHJpdmUiKQorLy91c2FnZTogICAgICJcbgktawlHZXQvc2V0IGtlZXBfc2V0dGluZ3Nfb3Zlcl9yZXNldCBmbGFnICgwLzEpIgorLy91c2FnZTogICAgICJcbgktSwlTZXQgZHJpdmUga2VlcF9mZWF0dXJlc19vdmVyX3Jlc2V0IGZsYWcgKDAvMSkiCisvL3VzYWdlOiAgICAgIlxuCS1MCVNldCBkcml2ZSBkb29ybG9jayAoMC8xKSAocmVtb3ZhYmxlIGhhcmRkaXNrcyBvbmx5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JR2V0L3NldCBtdWx0aXBsZSBzZWN0b3IgY291bnQiCisvL3VzYWdlOiAgICAgIlxuCS1uCUdldC9zZXQgaWdub3JlLXdyaXRlLWVycm9ycyBmbGFnICgwLzEpIgorLy91c2FnZTogICAgICJcbgktcAlTZXQgUElPIG1vZGUgb24gSURFIGludGVyZmFjZSBjaGlwc2V0ICgwLDEsMiwzLDQsLi4uKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJU2V0IGRyaXZlIHByZWZldGNoIGNvdW50IgorLyogLy91c2FnZTogICJcbgktcQlDaGFuZ2UgbmV4dCBzZXR0aW5nIHF1aWV0bHkiIC0gbm90IHN1cHBvcnRlZCBpYiBiYm94ICovCisvL3VzYWdlOiAgICAgIlxuCS1RCUdldC9zZXQgRE1BIHRhZ2dlZC1xdWV1aW5nIGRlcHRoIChpZiBzdXBwb3J0ZWQpIgorLy91c2FnZTogICAgICJcbgktcglHZXQvc2V0IHJlYWRvbmx5IGZsYWcgKERBTkdFUk9VUyB0byBzZXQpIgorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYoCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiKQorLy91c2FnZTogICAgICJcbgktUwlTZXQgc3RhbmRieSAoc3BpbmRvd24pIHRpbWVvdXQiCisvL3VzYWdlOiAgICAgIlxuCS10CVBlcmZvcm0gZGV2aWNlIHJlYWQgdGltaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJUGVyZm9ybSBjYWNoZSByZWFkIHRpbWluZ3MiCisvL3VzYWdlOiAgICAgIlxuCS11CUdldC9zZXQgdW5tYXNraXJxIGZsYWcgKDAvMSkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRigKKy8vdXNhZ2U6ICAgICAiXG4JLVUJVW5yZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlIChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLXYJRGVmYXVsdHM7IHNhbWUgYXMgLW1jdWRrcmFnIGZvciBJREUgZHJpdmVzIgorLy91c2FnZTogICAgICJcbgktVglEaXNwbGF5IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdCBpbW1lZGlhdGVseSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQoCisvL3VzYWdlOiAgICAgIlxuCS13CVBlcmZvcm0gZGV2aWNlIHJlc2V0IChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLVcJU2V0IGRyaXZlIHdyaXRlLWNhY2hpbmcgZmxhZyAoMC8xKSAoREFOR0VST1VTKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRigKKy8vdXNhZ2U6ICAgICAiXG4JLXgJVHJpc3RhdGUgZGV2aWNlIGZvciBob3Rzd2FwICgwLzEpIChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLVgJU2V0IElERSB4ZmVyIG1vZGUgKERBTkdFUk9VUykiCisvL3VzYWdlOiAgICAgIlxuCS15CVB1dCBJREUgZHJpdmUgaW4gc3RhbmRieSBtb2RlIgorLy91c2FnZTogICAgICJcbgktWQlQdXQgSURFIGRyaXZlIHRvIHNsZWVwIgorLy91c2FnZTogICAgICJcbgktWglEaXNhYmxlIFNlYWdhdGUgYXV0by1wb3dlcnNhdmluZyBtb2RlIgorLy91c2FnZTogICAgICJcbgkteglSZXJlYWQgcGFydGl0aW9uIHRhYmxlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIG11c3QgYmUgX2FmdGVyXyBsaWJiYi5oOiAqLworI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaWYgIWRlZmluZWQoQkxLR0VUU0laRTY0KQorIyBkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQorI2VuZGlmCisKKy8qIGRldmljZSB0eXBlcyAqLworLyogLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE5PX0RFViAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBBVEFfREVWICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVRBUElfREVWICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qIHdvcmQgZGVmaW5pdGlvbnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgR0VOX0NPTkZJRwkJMCAgIC8qIGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMQ1lMUwkJCTEgICAvKiBudW1iZXIgb2YgbG9naWNhbCBjeWxpbmRlcnMgKi8KKyNkZWZpbmUgQ09ORklHCQkJMiAgIC8qIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTEhFQURTCQkJMyAgIC8qIG51bWJlciBvZiBsb2dpY2FsIGhlYWRzICovCisjZGVmaW5lIFRSQUNLX0JZVEVTCQk0ICAgLyogbnVtYmVyIG9mIGJ5dGVzL3RyYWNrIChBVEEtMSkgKi8KKyNkZWZpbmUgU0VDVF9CWVRFUwkJNSAgIC8qIG51bWJlciBvZiBieXRlcy9zZWN0b3IgKEFUQS0xKSAqLworI2RlZmluZSBMU0VDVFMJCQk2ICAgLyogbnVtYmVyIG9mIGxvZ2ljYWwgc2VjdG9ycy90cmFjayAqLworI2RlZmluZSBTVEFSVF9TRVJJQUwgICAgICAgICAgICAxMCAgLyogQVNDSUkgc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBMRU5HVEhfU0VSSUFMICAgICAgICAgICAxMCAgLyogMTAgd29yZHMgKDIwIGJ5dGVzIG9yIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIEJVRl9UWVBFCQkyMCAgLyogYnVmZmVyIHR5cGUgKEFUQS0xKSAqLworI2RlZmluZSBCVUZGRVJfX1NJWkUJCTIxICAvKiBidWZmZXIgc2l6ZSAoQVRBLTEpICovCisjZGVmaW5lIFJXX0xPTkcJCQkyMiAgLyogZXh0cmEgYnl0ZXMgaW4gUi9XIExPTkcgY21kICggPCBBVEEtNCkqLworI2RlZmluZSBTVEFSVF9GV19SRVYgICAgICAgICAgICAyMyAgLyogQVNDSUkgZmlybXdhcmUgcmV2aXNpb24gKi8KKyNkZWZpbmUgTEVOR1RIX0ZXX1JFVgkJIDQgIC8qICA0IHdvcmRzICg4IGJ5dGVzIG9yIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIFNUQVJUX01PREVMCQkyNyAgLyogQVNDSUkgbW9kZWwgbnVtYmVyICovCisjZGVmaW5lIExFTkdUSF9NT0RFTAkJMjAgIC8qIDIwIHdvcmRzICg0MCBieXRlcyBvciBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSBTRUNUT1JfWEZFUl9NQVgJCTQ3ICAvKiByL3cgbXVsdGlwbGU6IG1heCBzZWN0b3JzIHhmZXJlZCAqLworI2RlZmluZSBEV09SRF9JTwkJNDggIC8qIGNhbiBkbyBkb3VibGUtd29yZCBJTyAoQVRBLTEgb25seSkgKi8KKyNkZWZpbmUgQ0FQQUJfMAkJCTQ5ICAvKiBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQ0FQQUJfMQkJCTUwCisjZGVmaW5lIFBJT19NT0RFCQk1MSAgLyogbWF4IFBJTyBtb2RlIHN1cHBvcnRlZCAob2Jzb2xldGUpKi8KKyNkZWZpbmUgRE1BX01PREUJCTUyICAvKiBtYXggU2luZ2xld29yZCBETUEgbW9kZSBzdXBwb3J0ZWQgKG9icykqLworI2RlZmluZSBXSEFUU19WQUxJRAkJNTMgIC8qIHdoYXQgZmllbGRzIGFyZSB2YWxpZCAqLworI2RlZmluZSBMQ1lMU19DVVIJCTU0ICAvKiBjdXJyZW50IGxvZ2ljYWwgY3lsaW5kZXJzICovCisjZGVmaW5lIExIRUFEU19DVVIJCTU1ICAvKiBjdXJyZW50IGxvZ2ljYWwgaGVhZHMgKi8KKyNkZWZpbmUgTFNFQ1RTX0NVUgkJNTYgIC8qIGN1cnJlbnQgbG9naWNhbCBzZWN0b3JzL3RyYWNrICovCisjZGVmaW5lIENBUEFDSVRZX0xTQgkJNTcgIC8qIGN1cnJlbnQgY2FwYWNpdHkgaW4gc2VjdG9ycyAqLworI2RlZmluZSBDQVBBQ0lUWV9NU0IJCTU4CisjZGVmaW5lIFNFQ1RPUl9YRkVSX0NVUgkJNTkgIC8qIHIvdyBtdWx0aXBsZTogY3VycmVudCBzZWN0b3JzIHhmZXJlZCAqLworI2RlZmluZSBMQkFfU0VDVFNfTFNCCQk2MCAgLyogTEJBOiB0b3RhbCBudW1iZXIgb2YgdXNlciAqLworI2RlZmluZSBMQkFfU0VDVFNfTVNCCQk2MSAgLyogICAgICBhZGRyZXNzYWJsZSBzZWN0b3JzICovCisjZGVmaW5lIFNJTkdMRV9ETUEJCTYyICAvKiBzaW5nbGV3b3JkIERNQSBtb2RlcyAqLworI2RlZmluZSBNVUxUSV9ETUEJCTYzICAvKiBtdWx0aXdvcmQgRE1BIG1vZGVzICovCisjZGVmaW5lIEFEVl9QSU9fTU9ERVMJCTY0ICAvKiBhZHZhbmNlZCBQSU8gbW9kZXMgc3VwcG9ydGVkICovCisJCQkJICAgIC8qIG11bHRpd29yZCBETUEgeGZlciBjeWNsZSB0aW1lOiAqLworI2RlZmluZSBETUFfVElNRV9NSU4JCTY1ICAvKiAgIC0gbWluaW11bSAqLworI2RlZmluZSBETUFfVElNRV9OT1JNCQk2NiAgLyogICAtIG1hbnVmYWN0dXJlcidzIHJlY29tbWVuZGVkICovCisJCQkJICAgIC8qIG1pbmltdW0gUElPIHhmZXIgY3ljbGUgdGltZTogKi8KKyNkZWZpbmUgUElPX05PX0ZMT1cJCTY3ICAvKiAgIC0gd2l0aG91dCBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUElPX0ZMT1cJCTY4ICAvKiAgIC0gd2l0aCBJT1JEWSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEtUX1JFTAkJCTcxICAvKiB0eXBpY2FsICNucyBmcm9tIFBLVCBjbWQgdG8gYnVzIHJlbCAqLworI2RlZmluZSBTVkNfTkJTWQkJNzIgIC8qIHR5cGljYWwgI25zIGZyb20gU0VSVklDRSBjbWQgdG8gIUJTWSAqLworI2RlZmluZSBDRFJfTUFKT1IJCTczICAvKiBDRCBST006IG1ham9yIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIENEUl9NSU5PUgkJNzQgIC8qIENEIFJPTTogbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUVVFVUVfREVQVEgJCTc1ICAvKiBxdWV1ZSBkZXB0aCAqLworI2RlZmluZSBNQUpPUgkJCTgwICAvKiBtYWpvciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNSU5PUgkJCTgxICAvKiBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBDTURTX1NVUFBfMAkJODIgIC8qIGNvbW1hbmQvZmVhdHVyZSBzZXQocykgc3VwcG9ydGVkICovCisjZGVmaW5lIENNRFNfU1VQUF8xCQk4MworI2RlZmluZSBDTURTX1NVUFBfMgkJODQKKyNkZWZpbmUgQ01EU19FTl8wCQk4NSAgLyogY29tbWFuZC9mZWF0dXJlIHNldChzKSBlbmFibGVkICovCisjZGVmaW5lIENNRFNfRU5fMQkJODYKKyNkZWZpbmUgQ01EU19FTl8yCQk4NworI2RlZmluZSBVTFRSQV9ETUEJCTg4ICAvKiB1bHRyYSBETUEgbW9kZXMgKi8KKwkJCQkgICAgLyogdGltZSB0byBjb21wbGV0ZSBzZWN1cml0eSBlcmFzZSAqLworI2RlZmluZSBFUkFTRV9USU1FCQk4OSAgLyogICAtIG9yZGluYXJ5ICovCisjZGVmaW5lIEVOSF9FUkFTRV9USU1FCQk5MCAgLyogICAtIGVuaGFuY2VkICovCisjZGVmaW5lIEFEVl9QV1IJCQk5MSAgLyogY3VycmVudCBhZHZhbmNlZCBwb3dlciBtYW5hZ2VtZW50IGxldmVsCisJCQkJICAgICAgIGluIGxvdyBieXRlLCAweDQwIGluIGhpZ2ggYnl0ZS4gKi8KKyNkZWZpbmUgUFNXRF9DT0RFCQk5MiAgLyogbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uIGNvZGUgKi8KKyNkZWZpbmUgSFdSU1RfUlNMVAkJOTMgIC8qIGhhcmR3YXJlIHJlc2V0IHJlc3VsdCAqLworI2RlZmluZSBBQ09VU1RJQwkJOTQgIC8qIGFjb3VzdGljIG1nbXQgdmFsdWVzICggPj0gQVRBLTYpICovCisjZGVmaW5lIExCQV9MU0IJCQkxMDAgLyogTEJBOiBtYXhpbXVtLiAgQ3VycmVudGx5IG9ubHkgNDggKi8KKyNkZWZpbmUgTEJBX01JRAkJCTEwMSAvKiAgICAgIGJpdHMgYXJlIHVzZWQsIGJ1dCBhZGRyIDEwMyAqLworI2RlZmluZSBMQkFfNDhfTVNCCQkxMDIgLyogICAgICBoYXMgYmVlbiByZXNlcnZlZCBmb3IgTEJBIGluICovCisjZGVmaW5lIExCQV82NF9NU0IJCTEwMyAvKiAgICAgIHRoZSBmdXR1cmUuICovCisjZGVmaW5lIFJNX1NUQVQJCQkxMjcgLyogcmVtb3ZhYmxlIG1lZGlhIHN0YXR1cyBub3RpZmljYXRpb24gZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBTRUNVX1NUQVRVUwkJMTI4IC8qIHNlY3VyaXR5IHN0YXR1cyAqLworI2RlZmluZSBDRkFfUFdSX01PREUJCTE2MCAvKiBDRkEgcG93ZXIgbW9kZSAxICovCisjZGVmaW5lIFNUQVJUX01FRElBICAgICAgICAgICAgIDE3NiAvKiBtZWRpYSBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lIExFTkdUSF9NRURJQSAgICAgICAgICAgIDIwICAvKiAyMCB3b3JkcyAoNDAgYnl0ZXMgb3IgY2hhcmFjdGVycykqLworI2RlZmluZSBTVEFSVF9NQU5VRiAgICAgICAgICAgICAxOTYgLyogbWVkaWEgbWFudWZhY3R1cmVyIEkuRC4gKi8KKyNkZWZpbmUgTEVOR1RIX01BTlVGICAgICAgICAgICAgMTAgIC8qIDEwIHdvcmRzICgyMCBieXRlcyBvciBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSBJTlRFR1JJVFkJCTI1NSAvKiBpbnRlZ3JpdHkgd29yZCAqLworCisvKiBiaXQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSB3b3JkcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWFueSB3b3JkcyBhcmUgY29uc2lkZXJlZCB2YWxpZCBpZiBiaXQgMTUgaXMgMCBhbmQgYml0IDE0IGlzIDEgKi8KKyNkZWZpbmUgVkFMSUQJCQkweGMwMDAKKyNkZWZpbmUgVkFMSURfVkFMCQkweDQwMDAKKy8qIG1hbnkgd29yZHMgYXJlIGNvbnNpZGVyZWQgaW52YWxpZCBpZiB0aGV5IGFyZSBlaXRoZXIgYWxsLTAgb3IgYWxsLTEgKi8KKyNkZWZpbmUgTk9WQUxfMAkJCTB4MDAwMAorI2RlZmluZSBOT1ZBTF8xCQkJMHhmZmZmCisKKy8qIHdvcmQgMDogZ2VuX2NvbmZpZyAqLworI2RlZmluZSBOT1RfQVRBCQkJMHg4MDAwCisjZGVmaW5lIE5PVF9BVEFQSQkJMHg0MDAwCS8qIChjaGVjayBvbmx5IGlmIGJpdCAxNSA9PSAxKSAqLworI2RlZmluZSBNRURJQV9SRU1PVkFCTEUJCTB4MDA4MAorI2RlZmluZSBEUklWRV9OT1RfUkVNT1ZBQkxFCTB4MDA0MCAgLyogYml0IG9ic29sZXRlZCBpbiBBVEEgNiAqLworI2RlZmluZSBJTkNPTVBMRVRFCQkweDAwMDQKKyNkZWZpbmUgQ0ZBX1NVUFBPUlRfVkFMCQkweDg0OGEJLyogODQ4YT1DRkEgZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBEUlFfUkVTUE9OU0VfVElNRQkweDAwNjAKKyNkZWZpbmUgRFJRXzNNU19WQUwJCTB4MDAwMAorI2RlZmluZSBEUlFfSU5UUl9WQUwJCTB4MDAyMAorI2RlZmluZSBEUlFfNTBVU19WQUwJCTB4MDA0MAorI2RlZmluZSBQS1RfU0laRV9TVVBQT1JURUQJMHgwMDAzCisjZGVmaW5lIFBLVF9TSVpFXzEyX1ZBTAkJMHgwMDAwCisjZGVmaW5lIFBLVF9TSVpFXzE2X1ZBTAkJMHgwMDAxCisjZGVmaW5lIEVRUFRfVFlQRQkJMHgxZjAwCisjZGVmaW5lIFNISUZUX0VRUFQJCTgKKworI2RlZmluZSBDRFJPTSAweDAwMDUKKworLyogd29yZCAxOiBudW1iZXIgb2YgbG9naWNhbCBjeWxpbmRlcnMgKi8KKyNkZWZpbmUgTENZTFNfTUFYCQkweDNmZmYgLyogbWF4aW11bSBhbGxvd2FibGUgdmFsdWUgKi8KKworLyogd29yZCAyOiBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiAoYSkgcmVxdWlyZSBTRVQgRkVBVFVSRVMgdG8gc3Bpbi11cAorICogKGIpIHJlcXVpcmUgc3Bpbi11cCB0byBmdWxseSByZXBseSB0byBJREVOVElGWSBERVZJQ0UKKyAqLworI2RlZmluZSBTVEJZX05JRF9WQUwJCTB4MzdjOCAgLyogICAgIChhKSBhbmQgICAgIChiKSAqLworI2RlZmluZSBTVEJZX0lEX1ZBTAkJMHg3MzhjCS8qICAgICAoYSkgYW5kIG5vdCAoYikgKi8KKyNkZWZpbmUgUFdSRF9OSURfVkFMCQkweDhjNzMJLyogbm90IChhKSBhbmQgICAgIChiKSAqLworI2RlZmluZSBQV1JEX0lEX1ZBTAkJMHhjODM3CS8qIG5vdCAoYSkgYW5kIG5vdCAoYikgKi8KKworLyogd29yZHMgNDcgJiA1OTogc2VjdG9yX3hmZXJfbWF4ICYgc2VjdG9yX3hmZXJfY3VyICovCisjZGVmaW5lIFNFQ1RPUl9YRkVSCQkweDAwZmYgIC8qIHNlY3RvcnMgeGZlcmVkIG9uIHIvdyBtdWx0aXBsZSBjbWRzKi8KKyNkZWZpbmUgTVVMVElQTEVfU0VUVElOR19WQUxJRCAgMHgwMTAwICAvKiAxPW11bHRpcGxlIHNlY3RvciBzZXR0aW5nIGlzIHZhbGlkICovCisKKy8qIHdvcmQgNDk6IGNhcGFiaWxpdGllcyAwICovCisjZGVmaW5lIFNURF9TVEJZCQkweDIwMDAgIC8qIDE9c3RhbmRhcmQgdmFsdWVzIHN1cHBvcnRlZCAoQVRBKTsgMD12ZW5kb3Igc3BlY2lmaWMgdmFsdWVzICovCisjZGVmaW5lIElPUkRZX1NVUAkJMHgwODAwICAvKiAxPXN1cHBvcnQ7IDA9bWF5IGJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBJT1JEWV9PRkYJCTB4MDQwMCAgLyogMT1tYXkgYmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTEJBX1NVUAkJCTB4MDIwMCAgLyogMT1Mb2dpY2FsIEJsb2NrIEFkZHJlc3Mgc3VwcG9ydCAqLworI2RlZmluZSBETUFfU1VQCQkJMHgwMTAwICAvKiAxPURpcmVjdCBNZW1vcnkgQWNjZXNzIHN1cHBvcnQgKi8KKyNkZWZpbmUgRE1BX0lMX1NVUAkJMHg4MDAwICAvKiAxPWludGVybGVhdmVkIERNQSBzdXBwb3J0IChBVEFQSSkgKi8KKyNkZWZpbmUgQ01EX1FfU1VQCQkweDQwMDAgIC8qIDE9Y29tbWFuZCBxdWV1aW5nIHN1cHBvcnQgKEFUQVBJKSAqLworI2RlZmluZSBPVkxQX1NVUAkJMHgyMDAwICAvKiAxPW92ZXJsYXAgb3BlcmF0aW9uIHN1cHBvcnQgKEFUQVBJKSAqLworI2RlZmluZSBTV1JTVF9SRVEJCTB4MTAwMCAgLyogMT1BVEEgU1cgcmVzZXQgcmVxdWlyZWQgKEFUQVBJLCBvYnNvbGV0ZSAqLworCisvKiB3b3JkIDUwOiBjYXBhYmlsaXRpZXMgMSAqLworI2RlZmluZSBNSU5fU1RBTkRCWV9USU1FUgkweDAwMDEgIC8qIDE9ZGV2aWNlIHNwZWNpZmljIHN0YW5kYnkgdGltZXIgdmFsdWUgbWluaW11bSAqLworCisvKiB3b3JkcyA1MSAmIDUyOiBQSU8gJiBETUEgY3ljbGUgdGltZXMgKi8KKyNkZWZpbmUgTU9ERQkJCTB4ZmYwMCAgLyogdGhlIG1vZGUgaXMgaW4gdGhlIE1TQnMgKi8KKworLyogd29yZCA1Mzogd2hhdHNfdmFsaWQgKi8KKyNkZWZpbmUgT0tfVzg4CQkJMHgwMDA0CS8qIHRoZSB1bHRyYV9kbWEgaW5mbyBpcyB2YWxpZCAqLworI2RlZmluZSBPS19XNjRfNzAJCTB4MDAwMiAgLyogc2VlIGFib3ZlIGZvciB3b3JkIGRlc2NyaXB0aW9ucyAqLworI2RlZmluZSBPS19XNTRfNTgJCTB4MDAwMSAgLyogY3VycmVudCBjeWwsIGhlYWQsIHNlY3RvciwgY2FwLiBpbmZvIHZhbGlkICovCisKKy8qd29yZCA2Myw4ODogZG1hX21vZGUsIHVsdHJhX2RtYV9tb2RlKi8KKyNkZWZpbmUgTU9ERV9NQVgJCTcJLyogYml0IGRlZmluaXRpb25zIGZvcmNlIHVkbWEgPD03ICh3aGVuCisJCQkJCSAqIHVkbWEgPj04IGNvbWVzIG91dCBpdCdsbCBoYXZlIHRvIGJlCisJCQkJCSAqIGRlZmluZWQgaW4gYSBuZXcgZG1hX21vZGUgd29yZCEpICovCisKKy8qIHdvcmQgNjQ6IFBJTyB0cmFuc2ZlciBtb2RlcyAqLworI2RlZmluZSBQSU9fU1VQCQkJMHgwMGZmICAvKiBvbmx5IGJpdHMgMCAmIDEgYXJlIHVzZWQgc28gZmFyLCAgKi8KKyNkZWZpbmUgUElPX01PREVfTUFYCQk4ICAgICAgIC8qIGJ1dCBhbGwgOCBiaXRzIGFyZSBkZWZpbmVkICAgICAgICAqLworCisvKiB3b3JkIDc1OiBxdWV1ZV9kZXB0aCAqLworI2RlZmluZSBERVBUSF9CSVRTCQkweDAwMWYgIC8qIGJpdHMgdXNlZCBmb3IgcXVldWUgZGVwdGggKi8KKworLyogd29yZHMgODAtODE6IHZlcnNpb24gbnVtYmVycyAqLworLyogTk9WQUxfMCBvciAgTk9WQUxfMSBtZWFucyBkZXZpY2UgZG9lcyBub3QgcmVwb3J0IHZlcnNpb24gKi8KKworLyogd29yZCA4MTogbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTUlOT1JfTUFYCQkweDIyCisvKiB3b3JkcyA4Mi04NDogY21kcy9mZWF0cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ01EU19XODIJCTB4NzdmZiAgLyogd29yZCA4MjogZGVmaW5lZCBjb21tYW5kIGxvY2F0aW9ucyovCisjZGVmaW5lIENNRFNfVzgzCQkweDNmZmYgIC8qIHdvcmQgODM6IGRlZmluZWQgY29tbWFuZCBsb2NhdGlvbnMqLworI2RlZmluZSBDTURTX1c4NAkJMHgwMDJmICAvKiB3b3JkIDgzOiBkZWZpbmVkIGNvbW1hbmQgbG9jYXRpb25zKi8KKyNkZWZpbmUgU1VQUE9SVF80OF9CSVQJCTB4MDQwMAorI2RlZmluZSBOVU1fQ01EX0ZFQVRfU1RSCTQ4CisKKy8qIHdvcmRzIDg1LTg3OiBjbWRzL2ZlYXRzIGVuYWJsZWQgKi8KKy8qIHVzZSBjbWRfZmVhdF9zdHJbXSB0byBkaXNwbGF5IHdoYXQgY29tbWFuZHMgYW5kIGZlYXR1cmVzIGhhdmUKKyAqIGJlZW4gZW5hYmxlZCB3aXRoIHdvcmRzIDg1LTg3CisgKi8KKworLyogd29yZHMgODksIDkwLCBTRUNVIEVSQVNFIFRJTUUgKi8KKyNkZWZpbmUgRVJBU0VfQklUUyAgICAgIDB4MDBmZgorCisvKiB3b3JkIDkyOiBtYXN0ZXIgcGFzc3dvcmQgcmV2aXNpb24gKi8KKy8qIE5PVkFMXzAgb3IgIE5PVkFMXzEgbWVhbnMgbm8gc3VwcG9ydCBmb3IgbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uICovCisKKy8qIHdvcmQgOTM6IGh3IHJlc2V0IHJlc3VsdCAqLworI2RlZmluZSBDQkxJRCAgICAgICAgICAgMHgyMDAwICAvKiBDQkxJRCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNUMCAgICAgICAgICAgIDB4MDAwMSAgLyogMT1yZXNldCB0byBkZXZpY2UgIzAgKi8KKyNkZWZpbmUgREVWX0RFVCAgICAgICAgIDB4MDAwNiAgLyogaG93IGRldmljZSBudW0gZGV0ZXJtaW5lZCAqLworI2RlZmluZSBKVU1QRVJfVkFMICAgICAgMHgwMDAyICAvKiBkZXZpY2UgbnVtIGRldGVybWluZWQgYnkganVtcGVyICovCisjZGVmaW5lIENTRUxfVkFMICAgICAgICAweDAwMDQgIC8qIGRldmljZSBudW0gZGV0ZXJtaW5lZCBieSBDU0VMX1ZBTCAqLworCisvKiB3b3JkIDEyNzogcmVtb3ZhYmxlIG1lZGlhIHN0YXR1cyBub3RpZmljYXRpb24gZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBSTV9TVEFUX0JJVFMgICAgMHgwMDAzCisjZGVmaW5lIFJNX1NUQVRfU1VQICAgICAweDAwMDEKKworLyogd29yZCAxMjg6IHNlY3VyaXR5ICovCisjZGVmaW5lIFNFQ1VfRU5BQkxFRCAgICAweDAwMDIKKyNkZWZpbmUgU0VDVV9MRVZFTCAgICAgIDB4MDAxMAorI2RlZmluZSBOVU1fU0VDVV9TVFIgICAgNgorCisvKiB3b3JkIDE2MDogQ0ZBIHBvd2VyIG1vZGUgKi8KKyNkZWZpbmUgVkFMSURfVzE2MCAgICAgICAgICAgICAgMHg4MDAwICAvKiAxPXdvcmQgdmFsaWQgKi8KKyNkZWZpbmUgUFdSX01PREVfUkVRICAgICAgICAgICAgMHgyMDAwICAvKiAxPUNGQSBwb3dlciBtb2RlIHJlcSdkIGJ5IHNvbWUgY21kcyovCisjZGVmaW5lIFBXUl9NT0RFX09GRiAgICAgICAgICAgIDB4MTAwMCAgLyogMT1DRkEgcG93ZXIgbW9kZWQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTUFYX0FNUFMgICAgICAgICAgICAgICAgMHgwZmZmICAvKiB2YWx1ZSA9IG1heCBjdXJyZW50IGluIG1hICovCisKKy8qIHdvcmQgMjU1OiBpbnRlZ3JpdHkgKi8KKyNkZWZpbmUgU0lHICAgICAgICAgICAgICAgICAgICAgMHgwMGZmICAvKiBzaWduYXR1cmUgbG9jYXRpb24gKi8KKyNkZWZpbmUgU0lHX1ZBTCAgICAgICAgICAgICAgICAgMHgwMGE1ICAvKiBzaWduYXR1cmUgdmFsdWUgKi8KKworI2RlZmluZSBUSU1JTkdfQlVGX01CICAgICAgICAgICAxCisjZGVmaW5lIFRJTUlOR19CVUZfQllURVMgICAgICAgIChUSU1JTkdfQlVGX01CICogMTAyNCAqIDEwMjQpCisKKyN1bmRlZiBET19GTFVTSENBQ0hFICAgICAgICAgICAgLyogdW5kZXIgY29uc3RydWN0aW9uOiBmb3JjZSBjYWNoZSBmbHVzaCBvbiAtVzAgKi8KKworCisjZGVmaW5lIElTX0dFVCAxCisjZGVmaW5lIElTX1NFVCAyCisKKworZW51bSB7IGZkID0gMyB9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBnZXRfaWRlbnRpdHksIGdldF9nZW9tOworCXNtYWxsaW50IGRvX2ZsdXNoOworCXNtYWxsaW50IGRvX2N0aW1pbmdzLCBkb190aW1pbmdzOworCXNtYWxsaW50IHJlcmVhZF9wYXJ0bjsKKwlzbWFsbGludCBzZXRfcGlvbW9kZSwgbm9pc3lfcGlvbW9kZTsKKwlzbWFsbGludCBnZXRzZXRfcmVhZGFoZWFkOworCXNtYWxsaW50IGdldHNldF9yZWFkb25seTsKKwlzbWFsbGludCBnZXRzZXRfdW5tYXNrOworCXNtYWxsaW50IGdldHNldF9tdWx0OworI2lmZGVmIEhESU9fR0VUX1FETUEKKwlzbWFsbGludCBnZXRzZXRfZG1hX3E7CisjZW5kaWYKKwlzbWFsbGludCBnZXRzZXRfbm93ZXJyOworCXNtYWxsaW50IGdldHNldF9rZWVwOworCXNtYWxsaW50IGdldHNldF9pbzMyYml0OworCWludCBwaW9tb2RlOworCXVuc2lnbmVkIGxvbmcgWHJlYWRhaGVhZDsKKwl1bnNpZ25lZCBsb25nIHJlYWRvbmx5OworCXVuc2lnbmVkIGxvbmcgdW5tYXNrOworCXVuc2lnbmVkIGxvbmcgbXVsdDsKKyNpZmRlZiBIRElPX1NFVF9RRE1BCisJdW5zaWduZWQgbG9uZyBkbWFfcTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbm93ZXJyOworCXVuc2lnbmVkIGxvbmcga2VlcDsKKwl1bnNpZ25lZCBsb25nIGlvMzJiaXQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQQorCXVuc2lnbmVkIGxvbmcgZG1hOworCXNtYWxsaW50IGdldHNldF9kbWE7CisjZW5kaWYKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCXNtYWxsaW50IHNldF94ZmVybW9kZSwgZ2V0X3hmZXJtb2RlOworCXNtYWxsaW50IGdldHNldF9ka2VlcDsKKwlzbWFsbGludCBnZXRzZXRfc3RhbmRieTsKKwlzbWFsbGludCBnZXRzZXRfbG9va2FoZWFkOworCXNtYWxsaW50IGdldHNldF9wcmVmZXRjaDsKKwlzbWFsbGludCBnZXRzZXRfZGVmZWN0czsKKwlzbWFsbGludCBnZXRzZXRfd2NhY2hlOworCXNtYWxsaW50IGdldHNldF9kb29ybG9jazsKKwlzbWFsbGludCBzZXRfc2VhZ2F0ZTsKKwlzbWFsbGludCBzZXRfc3RhbmRieW5vdzsKKwlzbWFsbGludCBzZXRfc2xlZXBub3c7CisJc21hbGxpbnQgZ2V0X3Bvd2VybW9kZTsKKwlzbWFsbGludCBnZXRzZXRfYXBtbW9kZTsKKwlpbnQgeGZlcm1vZGVfcmVxdWVzdGVkOworCXVuc2lnbmVkIGxvbmcgZGtlZXA7CisJdW5zaWduZWQgbG9uZyBzdGFuZGJ5X3JlcXVlc3RlZDsgLyogMC4uMjU1ICovCisJdW5zaWduZWQgbG9uZyBsb29rYWhlYWQ7CisJdW5zaWduZWQgbG9uZyBwcmVmZXRjaDsKKwl1bnNpZ25lZCBsb25nIGRlZmVjdHM7CisJdW5zaWduZWQgbG9uZyB3Y2FjaGU7CisJdW5zaWduZWQgbG9uZyBkb29ybG9jazsKKwl1bnNpZ25lZCBsb25nIGFwbW1vZGU7CisjZW5kaWYKKwlJRl9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkoICAgICAgICBzbWFsbGludCBnZXRfSURlbnRpdHk7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHNtYWxsaW50IGdldHNldF9idXNzdGF0ZTspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCggICAgc21hbGxpbnQgcGVyZm9ybV9yZXNldDspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGKCAgc21hbGxpbnQgcGVyZm9ybV90cmlzdGF0ZTspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYoc21hbGxpbnQgdW5yZWdpc3Rlcl9od2lmOykKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRiggICAgICBzbWFsbGludCBzY2FuX2h3aWY7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHVuc2lnbmVkIGxvbmcgYnVzc3RhdGU7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHVuc2lnbmVkIGxvbmcgdHJpc3RhdGU7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGKHVuc2lnbmVkIGxvbmcgaHdpZjspCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJdW5zaWduZWQgbG9uZyBod2lmX2RhdGE7CisJdW5zaWduZWQgbG9uZyBod2lmX2N0cmw7CisJdW5zaWduZWQgbG9uZyBod2lmX2lycTsKKyNlbmRpZgorI2lmZGVmIERPX0ZMVVNIQ0FDSEUKKwl1bnNpZ25lZCBjaGFyIGZsdXNoY2FjaGVbNF0gPSB7IFdJTl9GTFVTSENBQ0hFLCAwLCAwLCAwIH07CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCitzdHJ1Y3QgQlVHX0dfdG9vX2JpZyB7CisJY2hhciBCVUdfR190b29fYmlnW3NpemVvZihHKSA8PSBDT01NT05fQlVGU0laRSA/IDEgOiAtMV07Cit9OworI2RlZmluZSBnZXRfaWRlbnRpdHkgICAgICAgKEcuZ2V0X2lkZW50aXR5ICAgICAgICAgICApCisjZGVmaW5lIGdldF9nZW9tICAgICAgICAgICAoRy5nZXRfZ2VvbSAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZG9fZmx1c2ggICAgICAgICAgIChHLmRvX2ZsdXNoICAgICAgICAgICAgICAgKQorI2RlZmluZSBkb19jdGltaW5ncyAgICAgICAgKEcuZG9fY3RpbWluZ3MgICAgICAgICAgICApCisjZGVmaW5lIGRvX3RpbWluZ3MgICAgICAgICAoRy5kb190aW1pbmdzICAgICAgICAgICAgICkKKyNkZWZpbmUgcmVyZWFkX3BhcnRuICAgICAgIChHLnJlcmVhZF9wYXJ0biAgICAgICAgICAgKQorI2RlZmluZSBzZXRfcGlvbW9kZSAgICAgICAgKEcuc2V0X3Bpb21vZGUgICAgICAgICAgICApCisjZGVmaW5lIG5vaXN5X3Bpb21vZGUgICAgICAoRy5ub2lzeV9waW9tb2RlICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X3JlYWRhaGVhZCAgIChHLmdldHNldF9yZWFkYWhlYWQgICAgICAgKQorI2RlZmluZSBnZXRzZXRfcmVhZG9ubHkgICAgKEcuZ2V0c2V0X3JlYWRvbmx5ICAgICAgICApCisjZGVmaW5lIGdldHNldF91bm1hc2sgICAgICAoRy5nZXRzZXRfdW5tYXNrICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X211bHQgICAgICAgIChHLmdldHNldF9tdWx0ICAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfZG1hX3EgICAgICAgKEcuZ2V0c2V0X2RtYV9xICAgICAgICAgICApCisjZGVmaW5lIGdldHNldF9ub3dlcnIgICAgICAoRy5nZXRzZXRfbm93ZXJyICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2tlZXAgICAgICAgIChHLmdldHNldF9rZWVwICAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfaW8zMmJpdCAgICAgKEcuZ2V0c2V0X2lvMzJiaXQgICAgICAgICApCisjZGVmaW5lIHBpb21vZGUgICAgICAgICAgICAoRy5waW9tb2RlICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgWHJlYWRhaGVhZCAgICAgICAgIChHLlhyZWFkYWhlYWQgICAgICAgICAgICAgKQorI2RlZmluZSByZWFkb25seSAgICAgICAgICAgKEcucmVhZG9ubHkgICAgICAgICAgICAgICApCisjZGVmaW5lIHVubWFzayAgICAgICAgICAgICAoRy51bm1hc2sgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgbXVsdCAgICAgICAgICAgICAgIChHLm11bHQgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBkbWFfcSAgICAgICAgICAgICAgKEcuZG1hX3EgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIG5vd2VyciAgICAgICAgICAgICAoRy5ub3dlcnIgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUga2VlcCAgICAgICAgICAgICAgIChHLmtlZXAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBpbzMyYml0ICAgICAgICAgICAgKEcuaW8zMmJpdCAgICAgICAgICAgICAgICApCisjZGVmaW5lIGRtYSAgICAgICAgICAgICAgICAoRy5kbWEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2RtYSAgICAgICAgIChHLmdldHNldF9kbWEgICAgICAgICAgICAgKQorI2RlZmluZSBzZXRfeGZlcm1vZGUgICAgICAgKEcuc2V0X3hmZXJtb2RlICAgICAgICAgICApCisjZGVmaW5lIGdldF94ZmVybW9kZSAgICAgICAoRy5nZXRfeGZlcm1vZGUgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2RrZWVwICAgICAgIChHLmdldHNldF9ka2VlcCAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfc3RhbmRieSAgICAgKEcuZ2V0c2V0X3N0YW5kYnkgICAgICAgICApCisjZGVmaW5lIGdldHNldF9sb29rYWhlYWQgICAoRy5nZXRzZXRfbG9va2FoZWFkICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X3ByZWZldGNoICAgIChHLmdldHNldF9wcmVmZXRjaCAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfZGVmZWN0cyAgICAgKEcuZ2V0c2V0X2RlZmVjdHMgICAgICAgICApCisjZGVmaW5lIGdldHNldF93Y2FjaGUgICAgICAoRy5nZXRzZXRfd2NhY2hlICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2Rvb3Jsb2NrICAgIChHLmdldHNldF9kb29ybG9jayAgICAgICAgKQorI2RlZmluZSBzZXRfc2VhZ2F0ZSAgICAgICAgKEcuc2V0X3NlYWdhdGUgICAgICAgICAgICApCisjZGVmaW5lIHNldF9zdGFuZGJ5bm93ICAgICAoRy5zZXRfc3RhbmRieW5vdyAgICAgICAgICkKKyNkZWZpbmUgc2V0X3NsZWVwbm93ICAgICAgIChHLnNldF9zbGVlcG5vdyAgICAgICAgICAgKQorI2RlZmluZSBnZXRfcG93ZXJtb2RlICAgICAgKEcuZ2V0X3Bvd2VybW9kZSAgICAgICAgICApCisjZGVmaW5lIGdldHNldF9hcG1tb2RlICAgICAoRy5nZXRzZXRfYXBtbW9kZSAgICAgICAgICkKKyNkZWZpbmUgeGZlcm1vZGVfcmVxdWVzdGVkIChHLnhmZXJtb2RlX3JlcXVlc3RlZCAgICAgKQorI2RlZmluZSBka2VlcCAgICAgICAgICAgICAgKEcuZGtlZXAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIHN0YW5kYnlfcmVxdWVzdGVkICAoRy5zdGFuZGJ5X3JlcXVlc3RlZCAgICAgICkKKyNkZWZpbmUgbG9va2FoZWFkICAgICAgICAgIChHLmxvb2thaGVhZCAgICAgICAgICAgICAgKQorI2RlZmluZSBwcmVmZXRjaCAgICAgICAgICAgKEcucHJlZmV0Y2ggICAgICAgICAgICAgICApCisjZGVmaW5lIGRlZmVjdHMgICAgICAgICAgICAoRy5kZWZlY3RzICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgd2NhY2hlICAgICAgICAgICAgIChHLndjYWNoZSAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBkb29ybG9jayAgICAgICAgICAgKEcuZG9vcmxvY2sgICAgICAgICAgICAgICApCisjZGVmaW5lIGFwbW1vZGUgICAgICAgICAgICAoRy5hcG1tb2RlICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0X0lEZW50aXR5ICAgICAgIChHLmdldF9JRGVudGl0eSAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfYnVzc3RhdGUgICAgKEcuZ2V0c2V0X2J1c3N0YXRlICAgICAgICApCisjZGVmaW5lIHBlcmZvcm1fcmVzZXQgICAgICAoRy5wZXJmb3JtX3Jlc2V0ICAgICAgICAgICkKKyNkZWZpbmUgcGVyZm9ybV90cmlzdGF0ZSAgIChHLnBlcmZvcm1fdHJpc3RhdGUgICAgICAgKQorI2RlZmluZSB1bnJlZ2lzdGVyX2h3aWYgICAgKEcudW5yZWdpc3Rlcl9od2lmICAgICAgICApCisjZGVmaW5lIHNjYW5faHdpZiAgICAgICAgICAoRy5zY2FuX2h3aWYgICAgICAgICAgICAgICkKKyNkZWZpbmUgYnVzc3RhdGUgICAgICAgICAgIChHLmJ1c3N0YXRlICAgICAgICAgICAgICAgKQorI2RlZmluZSB0cmlzdGF0ZSAgICAgICAgICAgKEcudHJpc3RhdGUgICAgICAgICAgICAgICApCisjZGVmaW5lIGh3aWYgICAgICAgICAgICAgICAoRy5od2lmICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgaHdpZl9kYXRhICAgICAgICAgIChHLmh3aWZfZGF0YSAgICAgICAgICAgICAgKQorI2RlZmluZSBod2lmX2N0cmwgICAgICAgICAgKEcuaHdpZl9jdHJsICAgICAgICAgICAgICApCisjZGVmaW5lIGh3aWZfaXJxICAgICAgICAgICAoRy5od2lmX2lycSAgICAgICAgICAgICAgICkKKworCisvKiBCdXN5Ym94IG1lc3NhZ2VzIGFuZCBmdW5jdGlvbnMgKi8KKyNpZiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUgorc3RhdGljIGludCBpb2N0bF9hbHRfZnVuYygvKmludCBmZCwqLyBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICphcmdzLCBpbnQgYWx0LCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJaWYgKCFpb2N0bChmZCwgY21kLCBhcmdzKSkKKwkJcmV0dXJuIDA7CisJYXJnc1swXSA9IGFsdDsKKwlyZXR1cm4gYmJfaW9jdGxfb3Jfd2FybihmZCwgY21kLCBhcmdzLCBzdHJpbmcpOworfQorI2RlZmluZSBpb2N0bF9hbHRfb3Jfd2FybihjbWQsYXJncyxhbHQpIGlvY3RsX2FsdF9mdW5jKGNtZCxhcmdzLGFsdCwjY21kKQorI2Vsc2UKK3N0YXRpYyBpbnQgaW9jdGxfYWx0X2Z1bmMoLyppbnQgZmQsKi8gaW50IGNtZCwgdW5zaWduZWQgY2hhciAqYXJncywgaW50IGFsdCkKK3sKKwlpZiAoIWlvY3RsKGZkLCBjbWQsIGFyZ3MpKQorCQlyZXR1cm4gMDsKKwlhcmdzWzBdID0gYWx0OworCXJldHVybiBiYl9pb2N0bF9vcl93YXJuKGZkLCBjbWQsIGFyZ3MpOworfQorI2RlZmluZSBpb2N0bF9hbHRfb3Jfd2FybihjbWQsYXJncyxhbHQpIGlvY3RsX2FsdF9mdW5jKGNtZCxhcmdzLGFsdCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvbl9vZmYoaW50IHZhbHVlKQoreworCXB1dHModmFsdWUgPyAiIChvbikiIDogIiAob2ZmKSIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9mbGFnX29uX29mZihpbnQgZ2V0X2FyZywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKGdldF9hcmcpIHsKKwkJcHJpbnRmKCIgc2V0dGluZyAlcyB0byAlbGQiLCBzLCBhcmcpOworCQlvbl9vZmYoYXJnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZhbHVlX29uX29mZihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgYXJncCkKK3sKKwlwcmludGYoIiAlc1x0PSAlMmxkIiwgc3RyLCBhcmdwKTsKKwlvbl9vZmYoYXJncCAhPSAwKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkKK3N0YXRpYyB2b2lkIHByaW50X2FzY2lpKGNvbnN0IGNoYXIgKnAsIGludCBsZW5ndGgpCit7CisjaWYgQkJfQklHX0VORElBTgorI2RlZmluZSBMRV9PTkxZKHgpCisJZW51bSB7IG9mcyA9IDAgfTsKKyNlbHNlCisjZGVmaW5lIExFX09OTFkoeCkgeAorCS8qIGV2ZXJ5IDE2Yml0IHdvcmQgaXMgYmlnLWVuZGlhbiAoaS5lLiBpbnZlcnRlZCkgKi8KKwkvKiBhY2Nlc3NpbmcgYnl0ZXMgaW4gMSwwLCAzLDIsIDUsNC4uLiBzZXF1ZW5jZSAqLworCWludCBvZnMgPSAxOworI2VuZGlmCisKKwlsZW5ndGggKj0gMjsKKwkvKiBmaW5kIGZpcnN0IG5vbi1zcGFjZSAmIHByaW50IGl0ICovCisJd2hpbGUgKGxlbmd0aCAmJiBwW29mc10gIT0gJyAnKSB7CisJCXArKzsKKwkJTEVfT05MWShvZnMgPSAtb2ZzOykKKwkJbGVuZ3RoLS07CisJfQorCXdoaWxlIChsZW5ndGggJiYgcFtvZnNdKSB7CisJCWJiX3B1dGNoYXIocFtvZnNdKTsKKwkJcCsrOworCQlMRV9PTkxZKG9mcyA9IC1vZnM7KQorCQlsZW5ndGgtLTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKyN1bmRlZiBMRV9PTkxZCit9CisKK3N0YXRpYyB2b2lkIHhwcmludF9hc2NpaSh1aW50MTZfdCAqdmFsLCBpbnQgaSwgY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgbikKK3sKKwlpZiAodmFsW2ldKSB7CisJCXByaW50ZigiXHQlLTIwcyIsIHN0cmluZyk7CisJCXByaW50X2FzY2lpKCh2b2lkKikmdmFsW2ldLCBuKTsKKwl9Cit9CisKK3N0YXRpYyB1aW50OF90IG1vZGVfbG9vcCh1aW50MTZfdCBtb2RlX3N1cCwgdWludDE2X3QgbW9kZV9zZWwsIGludCBjYywgdWludDhfdCAqaGF2ZV9tb2RlKQoreworCXVpbnQxNl90IGlpOworCXVpbnQ4X3QgZXJyX2RtYSA9IDA7CisKKwlmb3IgKGlpID0gMDsgaWkgPD0gTU9ERV9NQVg7IGlpKyspIHsKKwkJaWYgKG1vZGVfc2VsICYgMHgwMDAxKSB7CisJCQlwcmludGYoIiolY2RtYSV1ICIsIGNjLCBpaSk7CisJCQlpZiAoKmhhdmVfbW9kZSkKKwkJCQllcnJfZG1hID0gMTsKKwkJCSpoYXZlX21vZGUgPSAxOworCQl9IGVsc2UgaWYgKG1vZGVfc3VwICYgMHgwMDAxKQorCQkJcHJpbnRmKCIlY2RtYSV1ICIsIGNjLCBpaSk7CisKKwkJbW9kZV9zdXAgPj49IDE7CisJCW1vZGVfc2VsID4+PSAxOworCX0KKwlyZXR1cm4gZXJyX2RtYTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgcGt0X3N0cltdIEFMSUdOMSA9CisJIkRpcmVjdC1hY2Nlc3MgZGV2aWNlIiAiXDAiICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDAgKi8KKwkiU2VxdWVudGlhbC1hY2Nlc3MgZGV2aWNlIiAiXDAiICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwMSAqLworCSJQcmludGVyIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDAyICovCisJIlByb2Nlc3NvciIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDMgKi8KKwkiV3JpdGUtb25jZSBkZXZpY2UiICJcMCIgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwNCAqLworCSJDRC1ST00iICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDA1ICovCisJIlNjYW5uZXIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDYgKi8KKwkiT3B0aWNhbCBtZW1vcnkiICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwNyAqLworCSJNZWRpdW0gY2hhbmdlciIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDA4ICovCisJIkNvbW11bmljYXRpb25zIGRldmljZSIgIlwwIiAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDkgKi8KKwkiQUNTLUlUOCBkZXZpY2UiICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwYSAqLworCSJBQ1MtSVQ4IGRldmljZSIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDBiICovCisJIkFycmF5IGNvbnRyb2xsZXIiICJcMCIgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMGMgKi8KKwkiRW5jbG9zdXJlIHNlcnZpY2VzIiAiXDAiICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwZCAqLworCSJSZWR1Y2VkIGJsb2NrIGNvbW1hbmQgZGV2aWNlIiAiXDAiICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDBlICovCisJIk9wdGljYWwgY2FyZCByZWFkZXIvd3JpdGVyIiAiXDAiICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMGYgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgYXRhMV9jZmdfc3RyW10gQUxJR04xID0gICAgICAgLyogd29yZCAwIGluIEFUQS0xIG1vZGUgKi8KKwkicmVzZXJ2ZWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0IDAgKi8KKwkiaGFyZCBzZWN0b3JlZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogYml0IDEgKi8KKwkic29mdCBzZWN0b3JlZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogYml0IDIgKi8KKwkibm90IE1GTSBlbmNvZGVkICIgIlwwIiAgICAgICAgICAgICAgICAgLyogYml0IDMgKi8KKwkiaGVhZCBzd2l0Y2ggdGltZSA+IDE1dXMiICJcMCIgICAgICAgICAgLyogYml0IDQgKi8KKwkic3BpbmRsZSBtb3RvciBjb250cm9sIG9wdGlvbiIgIlwwIiAgICAgLyogYml0IDUgKi8KKwkiZml4ZWQgZHJpdmUiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogYml0IDYgKi8KKwkicmVtb3ZhYmxlIGRyaXZlIiAiXDAiICAgICAgICAgICAgICAgICAgLyogYml0IDcgKi8KKwkiZGlzayB4ZmVyIHJhdGUgPD0gNU1icyIgIlwwIiAgICAgICAgICAgLyogYml0IDggKi8KKwkiZGlzayB4ZmVyIHJhdGUgPiA1TWJzLCA8PSAxME1icyIgIlwwIiAgLyogYml0IDkgKi8KKwkiZGlzayB4ZmVyIHJhdGUgPiA1TWJzIiAiXDAiICAgICAgICAgICAgLyogYml0IDEwICovCisJInJvdGF0aW9uYWwgc3BlZWQgdG9sLiIgIlwwIiAgICAgICAgICAgIC8qIGJpdCAxMSAqLworCSJkYXRhIHN0cm9iZSBvZmZzZXQgb3B0aW9uIiAiXDAiICAgICAgICAvKiBiaXQgMTIgKi8KKwkidHJhY2sgb2Zmc2V0IG9wdGlvbiIgIlwwIiAgICAgICAgICAgICAgLyogYml0IDEzICovCisJImZvcm1hdCBzcGVlZCB0b2xlcmFuY2UgZ2FwIHJlcWQiICJcMCIgIC8qIGJpdCAxNCAqLworCSJBVEFQSSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgMTQgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgbWlub3Jfc3RyW10gQUxJR04xID0KKwkvKiB3b3JkIDgxIHZhbHVlOiAqLworCSJVbnNwZWNpZmllZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDAgKi8KKwkiQVRBLTEgWDNUOS4yIDc4MUQgcHJpb3IgdG8gcmV2LjQiICJcMCIgICAgICAgICAgICAgLyogMHgwMDAxICovCisJIkFUQS0xIHB1Ymxpc2hlZCwgQU5TSSBYMy4yMjEtMTk5NCIgIlwwIiAgICAgICAgICAgIC8qIDB4MDAwMiAqLworCSJBVEEtMSBYM1Q5LjIgNzgxRCByZXYuNCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDMgKi8KKwkiQVRBLTIgcHVibGlzaGVkLCBBTlNJIFgzLjI3OS0xOTk2IiAiXDAiICAgICAgICAgICAgLyogMHgwMDA0ICovCisJIkFUQS0yIFgzVDEwIDk0OEQgcHJpb3IgdG8gcmV2LjJrIiAiXDAiICAgICAgICAgICAgIC8qIDB4MDAwNSAqLworCSJBVEEtMyBYM1QxMCAyMDA4RCByZXYuMSIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDYgKi8KKwkiQVRBLTIgWDNUMTAgOTQ4RCByZXYuMmsiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDA3ICovCisJIkFUQS0zIFgzVDEwIDIwMDhEIHJldi4wIiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwOCAqLworCSJBVEEtMiBYM1QxMCA5NDhEIHJldi4zIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDkgKi8KKwkiQVRBLTMgcHVibGlzaGVkLCBBTlNJIFgzLjI5OC0xOTl4IiAiXDAiICAgICAgICAgICAgLyogMHgwMDBhICovCisJIkFUQS0zIFgzVDEwIDIwMDhEIHJldi42IiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwYiAqLworCSJBVEEtMyBYM1QxMyAyMDA4RCByZXYuNyBhbmQgN2EiICJcMCIgICAgICAgICAgICAgICAvKiAweDAwMGMgKi8KKwkiQVRBL0FUQVBJLTQgWDNUMTMgMTE1M0QgcmV2LjYiICJcMCIgICAgICAgICAgICAgICAgLyogMHgwMDBkICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTMiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAwZSAqLworCSJBVEEvQVRBUEktNCBYM1QxMyAxMTUzRCByZXYuNyIgIlwwIiAgICAgICAgICAgICAgICAvKiAweDAwMGYgKi8KKwkiQVRBL0FUQVBJLTQgVDEzIDExNTNEIHJldi4xOCIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDEwICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTUiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAxMSAqLworCSJBVEEvQVRBUEktNCBwdWJsaXNoZWQsIEFOU0kgSU5DSVRTIDMxNy0xOTk4IiAiXDAiICAvKiAweDAwMTIgKi8KKwkiQVRBL0FUQVBJLTUgVDEzIDEzMjFEIHJldi4zIiAiXDAiICAgICAgICAgICAgICAgICAgLyogMHgwMDEzICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTQiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAxNCAqLworCSJBVEEvQVRBUEktNSBUMTMgMTMyMUQgcmV2LjEiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMTUgKi8KKwkiQVRBL0FUQVBJLTUgcHVibGlzaGVkLCBBTlNJIElOQ0lUUyAzNDAtMjAwMCIgIlwwIiAgLyogMHgwMDE2ICovCisJIkFUQS9BVEFQSS00IFQxMyAxMTUzRCByZXYuMTciICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAxNyAqLworCSJBVEEvQVRBUEktNiBUMTMgMTQxMEQgcmV2LjAiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMTggKi8KKwkiQVRBL0FUQVBJLTYgVDEzIDE0MTBEIHJldi4zYSIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDE5ICovCisJIkFUQS9BVEFQSS03IFQxMyAxNTMyRCByZXYuMSIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIDB4MDAxYSAqLworCSJBVEEvQVRBUEktNiBUMTMgMTQxMEQgcmV2LjIiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMWIgKi8KKwkiQVRBL0FUQVBJLTYgVDEzIDE0MTBEIHJldi4xIiAiXDAiICAgICAgICAgICAgICAgICAgLyogMHgwMDFjICovCisJIkFUQS9BVEFQSS03IHB1Ymxpc2hlZCwgQU5TSSBJTkNJVFMgMzk3LTIwMDUiICJcMCIgIC8qIDB4MDAxZCAqLworCSJBVEEvQVRBUEktNyBUMTMgMTUzMkQgcmV2LjAiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMWUgKi8KKwkicmVzZXJ2ZWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDFmICovCisJInJlc2VydmVkIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAyMCAqLworCSJBVEEvQVRBUEktNyBUMTMgMTUzMkQgcmV2LjRhIiAiXDAiICAgICAgICAgICAgICAgICAvKiAweDAwMjEgKi8KKwkiQVRBL0FUQVBJLTYgcHVibGlzaGVkLCBBTlNJIElOQ0lUUyAzNjEtMjAwMiIgIlwwIiAgLyogMHgwMDIyICovCisJInJlc2VydmVkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAyMy0weGZmZmUgKi8KKzsKK3N0YXRpYyBjb25zdCBjaGFyIGFjdHVhbF92ZXJbTUlOT1JfTUFYICsgMl0gQUxJR04xID0geworCSAgIC8qIHdvcmQgODEgdmFsdWU6ICovCisJMCwgLyogMHgwMDAwIFdBUk5JTkc6IGFjdHVhbF92ZXJbXSBhcnJheSAqLworCTEsIC8qIDB4MDAwMSBXQVJOSU5HOiBjb3JyZXNwb25kcyAgICAgICAgKi8KKwkxLCAvKiAweDAwMDIgV0FSTklORzogKmV4YWN0bHkqICAgICAgICAgICovCisJMSwgLyogMHgwMDAzIFdBUk5JTkc6IHRvIHRoZSBBVEEvICAgICAgICAqLworCTIsIC8qIDB4MDAwNCBXQVJOSU5HOiBBVEFQSSB2ZXJzaW9uICAgICAgKi8KKwkyLCAvKiAweDAwMDUgV0FSTklORzogbGlzdGVkIGluICAgICAgICAgICovCisJMywgLyogMHgwMDA2IFdBUk5JTkc6IHRoZSAgICAgICAgICAgICAgICAqLworCTIsIC8qIDB4MDAwNyBXQVJOSU5HOiBtaW5vcl9zdHIgICAgICAgICAgKi8KKwkzLCAvKiAweDAwMDggV0FSTklORzogYXJyYXkgICAgICAgICAgICAgICovCisJMiwgLyogMHgwMDA5IFdBUk5JTkc6IGFib3ZlLiAgICAgICAgICAgICAqLworCTMsIC8qIDB4MDAwYSBXQVJOSU5HOiAgICAgICAgICAgICAgICAgICAgKi8KKwkzLCAvKiAweDAwMGIgV0FSTklORzogSWYgeW91IGNoYW5nZSAgICAgICovCisJMywgLyogMHgwMDBjIFdBUk5JTkc6IHRoYXQgb25lLCAgICAgICAgICAqLworCTQsIC8qIDB4MDAwZCBXQVJOSU5HOiBjaGFuZ2UgdGhpcyBvbmUgICAgKi8KKwk0LCAvKiAweDAwMGUgV0FSTklORzogdG9vISEhICAgICAgICAgICAgICovCisJNCwgLyogMHgwMDBmICovCisJNCwgLyogMHgwMDEwICovCisJNCwgLyogMHgwMDExICovCisJNCwgLyogMHgwMDEyICovCisJNSwgLyogMHgwMDEzICovCisJNCwgLyogMHgwMDE0ICovCisJNSwgLyogMHgwMDE1ICovCisJNSwgLyogMHgwMDE2ICovCisJNCwgLyogMHgwMDE3ICovCisJNiwgLyogMHgwMDE4ICovCisJNiwgLyogMHgwMDE5ICovCisJNywgLyogMHgwMDFhICovCisJNiwgLyogMHgwMDFiICovCisJNiwgLyogMHgwMDFjICovCisJNywgLyogMHgwMDFkICovCisJNywgLyogMHgwMDFlICovCisJMCwgLyogMHgwMDFmICovCisJMCwgLyogMHgwMDIwICovCisJNywgLyogMHgwMDIxICovCisJNiwgLyogMHgwMDIyICovCisJMCAgLyogMHgwMDIzLTB4ZmZmZSAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgY21kX2ZlYXRfc3RyW10gQUxJR04xID0KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDE1OiBvYnNvbGV0ZSAgKi8KKwkiTk9QIGNtZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDE0ICovCisJIlJFQUQgQlVGRkVSIGNtZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAxMyAqLworCSJXUklURSBCVUZGRVIgY21kIiAiXDAiICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgMTIgKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDExOiBvYnNvbGV0ZSAgKi8KKwkiSG9zdCBQcm90ZWN0ZWQgQXJlYSBmZWF0dXJlIHNldCIgIlwwIiAgICAgIC8qIHdvcmQgODIgYml0IDEwICovCisJIkRFVklDRSBSRVNFVCBjbWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgOSAqLworCSJTRVJWSUNFIGludGVycnVwdCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDggKi8KKwkiUmVsZWFzZSBpbnRlcnJ1cHQiICJcMCIgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICA3ICovCisJIkxvb2stYWhlYWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgNiAqLworCSJXcml0ZSBjYWNoZSIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDUgKi8KKwkiUEFDS0VUIGNvbW1hbmQgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICA0ICovCisJIlBvd2VyIE1hbmFnZW1lbnQgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgMyAqLworCSJSZW1vdmFibGUgTWVkaWEgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDIgKi8KKwkiU2VjdXJpdHkgTW9kZSBmZWF0dXJlIHNldCIgIlwwIiAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICAxICovCisJIlNNQVJUIGZlYXR1cmUgc2V0IiAiXDAiICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgMCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0gKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODMgYml0IDE1OiAhdmFsaWQgYml0ICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAxNDogIHZhbGlkIGJpdCAqLworCSJGTFVTSCBDQUNIRSBFWFQgY21kIiAiXDAiICAgICAgICAgICAgICAgICAgLyogd29yZCA4MyBiaXQgMTMgKi8KKwkiTWFuZGF0b3J5IEZMVVNIIENBQ0hFIGNtZCAiICJcMCIgICAgICAgICAgIC8qIHdvcmQgODMgYml0IDEyICovCisJIkRldmljZSBDb25maWd1cmF0aW9uIE92ZXJsYXkgZmVhdHVyZSBzZXQgIiAiXDAiCisJIjQ4LWJpdCBBZGRyZXNzIGZlYXR1cmUgc2V0ICIgIlwwIiAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAxMCAqLworCSIiICJcMCIKKwkiU0VUIE1BWCBzZWN1cml0eSBleHRlbnNpb24iICJcMCIgICAgICAgICAgIC8qIHdvcmQgODMgYml0ICA4ICovCisJIkFkZHJlc3MgT2Zmc2V0IFJlc2VydmVkIEFyZWEgQm9vdCIgIlwwIiAgICAvKiB3b3JkIDgzIGJpdCAgNyAqLworCSJTRVQgRkVBVFVSRVMgc3ViY29tbWFuZCByZXF1aXJlZCB0byBzcGludXAgYWZ0ZXIgcG93ZXIgdXAiICJcMCIKKwkiUG93ZXItVXAgSW4gU3RhbmRieSBmZWF0dXJlIHNldCIgIlwwIiAgICAgIC8qIHdvcmQgODMgYml0ICA1ICovCisJIlJlbW92YWJsZSBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uIGZlYXR1cmUgc2V0IiAiXDAiCisJIkFkdi4gUG93ZXIgTWFuYWdlbWVudCBmZWF0dXJlIHNldCIgIlwwIiAgICAvKiB3b3JkIDgzIGJpdCAgMyAqLworCSJDRkEgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MyBiaXQgIDIgKi8KKwkiUkVBRC9XUklURSBETUEgUVVFVUVEIiAiXDAiICAgICAgICAgICAgICAgIC8qIHdvcmQgODMgYml0ICAxICovCisJIkRPV05MT0FEIE1JQ1JPQ09ERSBjbWQiICJcMCIgICAgICAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAgMCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0gKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0IDE1OiAhdmFsaWQgYml0ICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAxNDogIHZhbGlkIGJpdCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTM6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTI6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTE6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTA6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDk6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDg6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDc6ICByZXNlcnZlZCAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDY6ICByZXNlcnZlZCAqLworCSJHZW5lcmFsIFB1cnBvc2UgTG9nZ2luZyBmZWF0dXJlIHNldCIgIlwwIiAgLyogd29yZCA4NCBiaXQgIDUgKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0ICA0OiAgcmVzZXJ2ZWQgKi8KKwkiTWVkaWEgQ2FyZCBQYXNzIFRocm91Z2ggQ29tbWFuZCBmZWF0dXJlIHNldCAiICJcMCIKKwkiTWVkaWEgc2VyaWFsIG51bWJlciAiICJcMCIgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0ICAyICovCisJIlNNQVJUIHNlbGYtdGVzdCAiICJcMCIgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgMSAqLworCSJTTUFSVCBlcnJvciBsb2dnaW5nICIgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDAgKi8KKzsKKworc3RhdGljIGNvbnN0IGNoYXIgc2VjdV9zdHJbXSBBTElHTjEgPQorCSJzdXBwb3J0ZWQiICJcMCIgICAgICAgICAgICAgICAgLyogd29yZCAxMjgsIGJpdCAwICovCisJImVuYWJsZWQiICJcMCIgICAgICAgICAgICAgICAgICAvKiB3b3JkIDEyOCwgYml0IDEgKi8KKwkibG9ja2VkIiAiXDAiICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMTI4LCBiaXQgMiAqLworCSJmcm96ZW4iICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAxMjgsIGJpdCAzICovCisJImV4cGlyZWQ6IHNlY3VyaXR5IGNvdW50IiAiXDAiICAvKiB3b3JkIDEyOCwgYml0IDQgKi8KKwkic3VwcG9ydGVkOiBlbmhhbmNlZCBlcmFzZSIgICAgIC8qIHdvcmQgMTI4LCBiaXQgNSAqLworOworCisvLyBQYXJzZSA1MTIgYnl0ZSBkaXNrIGlkZW50aWZpY2F0aW9uIGJsb2NrIGFuZCBwcmludCBtdWNoIGNyYXAuCitzdGF0aWMgdm9pZCBpZGVudGlmeSh1aW50MTZfdCAqdmFsKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGlkZW50aWZ5KHVpbnQxNl90ICp2YWwpCit7CisJdWludDE2X3QgaWksIGpqLCBrazsKKwl1aW50MTZfdCBsaWtlX3N0ZCA9IDEsIHN0ZCA9IDAsIG1pbl9zdGQgPSAweGZmZmY7CisJdWludDE2X3QgZGV2ID0gTk9fREVWLCBlcXB0ID0gTk9fREVWOworCXVpbnQ4X3QgIGhhdmVfbW9kZSA9IDAsIGVycl9kbWEgPSAwOworCXVpbnQ4X3QgIGNoa3N1bSA9IDA7CisJdWludDMyX3QgbGwsIG1tLCBubiwgb287CisJdWludDY0X3QgYmJiaWc7IC8qICg6KSAqLworCWNvbnN0IGNoYXIgKnN0cm5nOworI2lmIEJCX0JJR19FTkRJQU4KKwl1aW50MTZfdCBidWZbMjU2XTsKKworCS8vIEFkanVzdCBmb3IgZW5kaWFubmVzcworCXN3YWIodmFsLCBidWYsIHNpemVvZihidWYpKTsKKwl2YWwgPSBidWY7CisjZW5kaWYKKwkvKiBjaGVjayBpZiB3ZSByZWNvZ25pemUgdGhlIGRldmljZSB0eXBlICovCisJYmJfcHV0Y2hhcignXG4nKTsKKwlpZiAoISh2YWxbR0VOX0NPTkZJR10gJiBOT1RfQVRBKSkgeworCQlkZXYgPSBBVEFfREVWOworCQlwcmludGYoIkFUQSBkZXZpY2UsIHdpdGggIik7CisJfSBlbHNlIGlmICh2YWxbR0VOX0NPTkZJR109PUNGQV9TVVBQT1JUX1ZBTCkgeworCQlkZXYgPSBBVEFfREVWOworCQlsaWtlX3N0ZCA9IDQ7CisJCXByaW50ZigiQ29tcGFjdEZsYXNoIEFUQSBkZXZpY2UsIHdpdGggIik7CisJfSBlbHNlIGlmICghKHZhbFtHRU5fQ09ORklHXSAmIE5PVF9BVEFQSSkpIHsKKwkJZGV2ID0gQVRBUElfREVWOworCQllcXB0ID0gKHZhbFtHRU5fQ09ORklHXSAmIEVRUFRfVFlQRSkgPj4gU0hJRlRfRVFQVDsKKwkJcHJpbnRmKCJBVEFQSSAlcywgd2l0aCAiLCBlcXB0IDw9IDB4ZiA/IG50aF9zdHJpbmcocGt0X3N0ciwgZXFwdCkgOiAidW5rbm93biIpOworCQlsaWtlX3N0ZCA9IDM7CisJfSBlbHNlCisJCS8qICJVbmtub3duIGRldmljZSB0eXBlOlxuXHRiaXRzIDE1JjE0IG9mIGdlbmVyYWwgY29uZmlndXJhdGlvbiB3b3JkIDAgYm90aCBzZXQgdG8gMS5cbiIgKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gZGV2aWNlIHR5cGUiKTsKKworCXByaW50ZigiJXNyZW1vdmFibGUgbWVkaWFcbiIsICEodmFsW0dFTl9DT05GSUddICYgTUVESUFfUkVNT1ZBQkxFKSA/ICJub24tIiA6ICIiKTsKKwkvKiBJbmZvIGZyb20gdGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gd29yZCBzYXlzIHdoZXRoZXIgb3Igbm90IHRoZQorCSAqIElEIGNvbW1hbmQgY29tcGxldGVkIGNvcnJlY3RseS4gIEl0IGlzIG9ubHkgZGVmaW5lZCwgaG93ZXZlciBpbgorCSAqIEFUQS9BVEFQSS01ICYgNjsgaXQgaXMgcmVzZXJ2ZWQgKHZhbHVlIHRoZW9yZXRpY2FsbHkgMCkgaW4gcHJpb3IKKwkgKiBzdGFuZGFyZHMuICBTaW5jZSB0aGUgdmFsdWVzIGFsbG93ZWQgZm9yIHRoaXMgd29yZCBhcmUgZXh0cmVtZWx5CisJICogc3BlY2lmaWMsIGl0IHNob3VsZCBiZSBzYWZlIHRvIGNoZWNrIGl0IG5vdywgZXZlbiB0aG91Z2ggd2UgZG9uJ3QKKwkgKiBrbm93IHlldCB3aGF0IHN0YW5kYXJkIHRoaXMgZGV2aWNlIGlzIHVzaW5nLgorCSAqLworCWlmICgodmFsW0NPTkZJR109PVNUQllfTklEX1ZBTCkgfHwgKHZhbFtDT05GSUddPT1TVEJZX0lEX1ZBTCkKKwkgfHwgKHZhbFtDT05GSUddPT1QV1JEX05JRF9WQUwpIHx8ICh2YWxbQ09ORklHXT09UFdSRF9JRF9WQUwpCisJKSB7CisJCWxpa2Vfc3RkID0gNTsKKwkJaWYgKCh2YWxbQ09ORklHXT09U1RCWV9OSURfVkFMKSB8fCAodmFsW0NPTkZJR109PVNUQllfSURfVkFMKSkKKwkJCXByaW50ZigicG93ZXJzLXVwIGluIHN0YW5kYnk7IFNFVCBGRUFUVVJFUyBzdWJjbWQgc3BpbnMtdXAuXG4iKTsKKwkJaWYgKCgodmFsW0NPTkZJR109PVNUQllfTklEX1ZBTCkgfHwgKHZhbFtDT05GSUddPT1QV1JEX05JRF9WQUwpKSAmJiAodmFsW0dFTl9DT05GSUddICYgSU5DT01QTEVURSkpCisJCQlwcmludGYoIlxuXHRXQVJOSU5HOiBJRCByZXNwb25zZSBpbmNvbXBsZXRlLlxuXHRGb2xsb3dpbmcgZGF0YSBtYXkgYmUgaW5jb3JyZWN0LlxuXG4iKTsKKwl9CisKKwkvKiBvdXRwdXQgdGhlIG1vZGVsIGFuZCBzZXJpYWwgbnVtYmVycyBhbmQgdGhlIGZ3IHJldmlzaW9uICovCisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfTU9ERUwsICAiTW9kZWwgTnVtYmVyOiIsICAgICAgICBMRU5HVEhfTU9ERUwpOworCXhwcmludF9hc2NpaSh2YWwsIFNUQVJUX1NFUklBTCwgIlNlcmlhbCBOdW1iZXI6IiwgICAgICAgTEVOR1RIX1NFUklBTCk7CisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfRldfUkVWLCAiRmlybXdhcmUgUmV2aXNpb246IiwgICBMRU5HVEhfRldfUkVWKTsKKwl4cHJpbnRfYXNjaWkodmFsLCBTVEFSVF9NRURJQSwgICJNZWRpYSBTZXJpYWwgTnVtOiIsICAgIExFTkdUSF9NRURJQSk7CisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfTUFOVUYsICAiTWVkaWEgTWFudWZhY3R1cmVyOiIsICBMRU5HVEhfTUFOVUYpOworCisJLyogbWFqb3IgJiBtaW5vciBzdGFuZGFyZHMgdmVyc2lvbiBudW1iZXIgKE5vdGU6IHRoZXNlIHdvcmRzIHdlcmUgbm90CisJICogZGVmaW5lZCB1bnRpbCBBVEEtMyAmIHRoZSBDRFJPTSBzdGQgdXNlcyBkaWZmZXJlbnQgd29yZHMuKSAqLworCXByaW50ZigiU3RhbmRhcmRzOiIpOworCWlmIChlcXB0ICE9IENEUk9NKSB7CisJCWlmICh2YWxbTUlOT1JdICYmICh2YWxbTUlOT1JdIDw9IE1JTk9SX01BWCkpIHsKKwkJCWlmIChsaWtlX3N0ZCA8IDMpIGxpa2Vfc3RkID0gMzsKKwkJCXN0ZCA9IGFjdHVhbF92ZXJbdmFsW01JTk9SXV07CisJCQlpZiAoc3RkKQorCQkJCXByaW50ZigiXG5cdFVzZWQ6ICVzICIsIG50aF9zdHJpbmcobWlub3Jfc3RyLCB2YWxbTUlOT1JdKSk7CisJCX0KKwkJLyogbG9va3MgbGlrZSB3aGVuIHRoZXkgdXAtaXNzdWUgdGhlIHN0ZCwgdGhleSBvYnNvbGV0ZSBvbmU7CisJCSAqIHRodXMsIG9ubHkgdGhlIG5ld2VzdCA0IGlzc3VlcyBuZWVkIGJlIHN1cHBvcnRlZC4gKFRoYXQncworCQkgKiB3aGF0ICJrayIgYW5kICJtaW5fc3RkIiBhcmUgYWxsIGFib3V0LikgKi8KKwkJaWYgKHZhbFtNQUpPUl0gJiYgKHZhbFtNQUpPUl0gIT0gTk9WQUxfMSkpIHsKKwkJCXByaW50ZigiXG5cdFN1cHBvcnRlZDogIik7CisJCQlqaiA9IHZhbFtNQUpPUl0gPDwgMTsKKwkJCWtrID0gbGlrZV9zdGQgPjQgPyBsaWtlX3N0ZC00OiAwOworCQkJZm9yIChpaSA9IDE0OyAoaWkgPjApJiYoaWk+a2spOyBpaS0tKSB7CisJCQkJaWYgKGpqICYgMHg4MDAwKSB7CisJCQkJCXByaW50ZigiJXUgIiwgaWkpOworCQkJCQlpZiAobGlrZV9zdGQgPCBpaSkgeworCQkJCQkJbGlrZV9zdGQgPSBpaTsKKwkJCQkJCWtrID0gbGlrZV9zdGQgPjQgPyBsaWtlX3N0ZC00OiAwOworCQkJCQl9CisJCQkJCWlmIChtaW5fc3RkID4gaWkpIG1pbl9zdGQgPSBpaTsKKwkJCQl9CisJCQkJamogPDw9IDE7CisJCQl9CisJCQlpZiAobGlrZV9zdGQgPCAzKSBsaWtlX3N0ZCA9IDM7CisJCX0KKwkJLyogRmlndXJlIG91dCB3aGF0IHN0YW5kYXJkIHRoZSBkZXZpY2UgaXMgdXNpbmcgaWYgaXQgaGFzbid0IHRvbGQKKwkJICogdXMuICBJZiB3ZSBrbm93IHRoZSBzdGQsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgdXNpbmcgYW55IG9mCisJCSAqIHRoZSB3b3JkcyBmcm9tIHRoZSBuZXh0IGxldmVsIHVwLiAgSXQgaGFwcGVucy4KKwkJICovCisJCWlmIChsaWtlX3N0ZCA8IHN0ZCkgbGlrZV9zdGQgPSBzdGQ7CisKKwkJaWYgKCgoc3RkID09IDUpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDYpKSkgJiYKKwkJCSgoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgJiYKKwkJCSgoCXZhbFtDTURTX1NVUFBfMV0gJiBDTURTX1c4MykgPiAweDAwZmYpKSB8fAorCQkJKCgoCXZhbFtDTURTX1NVUFBfMl0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSAmJgorCQkJKAl2YWxbQ01EU19TVVBQXzJdICYgQ01EU19XODQpICkgKQorCQkpIHsKKwkJCWxpa2Vfc3RkID0gNjsKKwkJfSBlbHNlIGlmICgoKHN0ZCA9PSA0KSB8fCAoIXN0ZCAmJiAobGlrZV9zdGQgPCA1KSkpICYmCisJCQkoKCgodmFsW0lOVEVHUklUWV0JJiBTSUcpID09IFNJR19WQUwpICYmICFjaGtzdW0pIHx8CisJCQkoKAl2YWxbSFdSU1RfUlNMVF0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB8fAorCQkJKCgoCXZhbFtDTURTX1NVUFBfMV0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSAmJgorCQkJKCgJdmFsW0NNRFNfU1VQUF8xXSAmIENNRFNfVzgzKSA+IDB4MDAxZikpICkgKQorCQl7CisJCQlsaWtlX3N0ZCA9IDU7CisJCX0gZWxzZSBpZiAoKChzdGQgPT0gMykgfHwgKCFzdGQgJiYgKGxpa2Vfc3RkIDwgNCkpKSAmJgorCQkJCSgoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgJiYKKwkJCQkoKCgJdmFsW0NNRFNfU1VQUF8xXSAmIENNRFNfVzgzKSA+IDB4MDAwMCkgfHwKKwkJCQkoKAl2YWxbQ01EU19TVVBQXzBdICYgQ01EU19XODIpID4gMHgwMDBmKSkpIHx8CisJCQkJKCgJdmFsW0NBUEFCXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgfHwKKwkJCQkoKAl2YWxbV0hBVFNfVkFMSURdICYgT0tfVzg4KSAmJiB2YWxbVUxUUkFfRE1BXSkgfHwKKwkJCQkoKAl2YWxbUk1fU1RBVF0gJiBSTV9TVEFUX0JJVFMpID09IFJNX1NUQVRfU1VQKSApCisJCSkgeworCQkJbGlrZV9zdGQgPSA0OworCQl9IGVsc2UgaWYgKCgoc3RkID09IDIpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDMpKSkKKwkJICYmICgodmFsW0NNRFNfU1VQUF8xXSAmIFZBTElEKSA9PSBWQUxJRF9WQUwpCisJCSkgeworCQkJbGlrZV9zdGQgPSAzOworCQl9IGVsc2UgaWYgKCgoc3RkID09IDEpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDIpKSkgJiYKKwkJCQkoKHZhbFtDQVBBQl8wXSAmIChJT1JEWV9TVVAgfCBJT1JEWV9PRkYpKSB8fAorCQkJCSh2YWxbV0hBVFNfVkFMSURdICYgT0tfVzY0XzcwKSkgKQorCQl7CisJCQlsaWtlX3N0ZCA9IDI7CisJCX0KKworCQlpZiAoIXN0ZCkKKwkJCXByaW50ZigiXG5cdExpa2VseSB1c2VkOiAldVxuIiwgbGlrZV9zdGQpOworCQllbHNlIGlmIChsaWtlX3N0ZCA+IHN0ZCkKKwkJCXByaW50ZigiJiBzb21lIG9mICV1XG4iLCBsaWtlX3N0ZCk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIHsKKwkJLyogVEJEOiBkbyBDRFJPTSBzdHVmZiBtb3JlIHRob3JvdWdobHkuICBGb3Igbm93Li4uICovCisJCWtrID0gMDsKKwkJaWYgKHZhbFtDRFJfTUlOT1JdID09IDkpIHsKKwkJCWtrID0gMTsKKwkJCXByaW50ZigiXG5cdFVzZWQ6IEFUQVBJIGZvciBDRC1ST01zLCBTRkYtODAyMGksIHIyLjUiKTsKKwkJfQorCQlpZiAodmFsW0NEUl9NQUpPUl0gJiYgKHZhbFtDRFJfTUFKT1JdICE9Tk9WQUxfMSkpIHsKKwkJCWtrID0gMTsKKwkJCXByaW50ZigiXG5cdFN1cHBvcnRlZDogQ0QtUk9NIEFUQVBJIik7CisJCQlqaiA9IHZhbFtDRFJfTUFKT1JdID4+IDE7CisJCQlmb3IgKGlpID0gMTsgaWkgPCAxNTsgaWkrKykgeworCQkJCWlmIChqaiAmIDB4MDAwMSkgcHJpbnRmKCItJXUgIiwgaWkpOworCQkJCWpqID4+PSAxOworCQkJfQorCQl9CisJCXB1dHMoa2sgPyAiIiA6ICJcblx0TGlrZWx5IHVzZWQgQ0QtUk9NIEFUQVBJLTEiKTsKKwkJLyogdGhlIGNkcm9tIHN0dWZmIGlzIG1vcmUgbGlrZSBBVEEtMiB0aGFuIGFueXRoaW5nIGVsc2UsIHNvOiAqLworCQlsaWtlX3N0ZCA9IDI7CisJfQorCisJaWYgKG1pbl9zdGQgPT0gMHhmZmZmKQorCQltaW5fc3RkID0gbGlrZV9zdGQgPiA0ID8gbGlrZV9zdGQgLSAzIDogMTsKKworCXByaW50ZigiQ29uZmlndXJhdGlvbjpcbiIpOworCS8qIG1vcmUgaW5mbyBmcm9tIHRoZSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gd29yZCAqLworCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID09IDEpKSB7CisJCWpqID0gdmFsW0dFTl9DT05GSUddID4+IDE7CisJCWZvciAoaWkgPSAxOyBpaSA8IDE1OyBpaSsrKSB7CisJCQlpZiAoamogJiAweDAwMDEpCisJCQkJcHJpbnRmKCJcdCVzXG4iLCBudGhfc3RyaW5nKGF0YTFfY2ZnX3N0ciwgaWkpKTsKKwkJCWpqID4+PTE7CisJCX0KKwl9CisJaWYgKGRldiA9PSBBVEFQSV9ERVYpIHsKKwkJaWYgKCh2YWxbR0VOX0NPTkZJR10gJiBEUlFfUkVTUE9OU0VfVElNRSkgPT0gIERSUV8zTVNfVkFMKQorCQkJc3RybmcgPSAiM21zIjsKKwkJZWxzZSBpZiAoKHZhbFtHRU5fQ09ORklHXSAmIERSUV9SRVNQT05TRV9USU1FKSA9PSAgRFJRX0lOVFJfVkFMKQorCQkJc3RybmcgPSAiPD0xMG1zIHdpdGggSU5UUlEiOworCQllbHNlIGlmICgodmFsW0dFTl9DT05GSUddICYgRFJRX1JFU1BPTlNFX1RJTUUpID09ICBEUlFfNTBVU19WQUwpCisJCQlzdHJuZyA9IjUwdXMiOworCQllbHNlCisJCQlzdHJuZyA9ICJ1bmtub3duIjsKKwkJcHJpbnRmKCJcdERSUSByZXNwb25zZTogJXNcblx0UGFja2V0IHNpemU6ICIsIHN0cm5nKTsgLyogRGF0YSBSZXF1ZXN0IChEUlEpICovCisKKwkJaWYgKCh2YWxbR0VOX0NPTkZJR10gJiBQS1RfU0laRV9TVVBQT1JURUQpID09IFBLVF9TSVpFXzEyX1ZBTCkKKwkJCXN0cm5nID0gIjEyIGJ5dGVzIjsKKwkJZWxzZSBpZiAoKHZhbFtHRU5fQ09ORklHXSAmIFBLVF9TSVpFX1NVUFBPUlRFRCkgPT0gUEtUX1NJWkVfMTZfVkFMKQorCQkJc3RybmcgPSAiMTYgYnl0ZXMiOworCQllbHNlCisJCQlzdHJuZyA9ICJ1bmtub3duIjsKKwkJcHV0cyhzdHJuZyk7CisJfSBlbHNlIHsKKwkJLyogYWRkcmVzc2luZy4uLkNIUz8gU2VlIHNlY3Rpb24gNi4yIG9mIEFUQSBzcGVjcyA0IG9yIDUgKi8KKwkJbGwgPSAodWludDMyX3QpdmFsW0xCQV9TRUNUU19NU0JdIDw8IDE2IHwgdmFsW0xCQV9TRUNUU19MU0JdOworCQltbSA9IDA7CisJCWJiYmlnID0gMDsKKwkJaWYgKChsbCA+IDB4MDBGQkZDMTApICYmICghdmFsW0xDWUxTXSkpCisJCQlwcmludGYoIlx0Q0hTIGFkZHJlc3Npbmcgbm90IHN1cHBvcnRlZFxuIik7CisJCWVsc2UgeworCQkJamogPSB2YWxbV0hBVFNfVkFMSURdICYgT0tfVzU0XzU4OworCQkJcHJpbnRmKCJcdExvZ2ljYWxcdFx0bWF4XHRjdXJyZW50XG4iCisJCQkJIlx0Y3lsaW5kZXJzXHQldVx0JXVcbiIKKwkJCQkiXHRoZWFkc1x0XHQldVx0JXVcbiIKKwkJCQkiXHRzZWN0b3JzL3RyYWNrXHQldVx0JXVcbiIKKwkJCQkiXHQtLVxuIiwKKwkJCQl2YWxbTENZTFNdLAorCQkJCWpqID8gdmFsW0xDWUxTX0NVUl0gOiAwLAorCQkJCXZhbFtMSEVBRFNdLAorCQkJCWpqID8gdmFsW0xIRUFEU19DVVJdIDogMCwKKwkJCQl2YWxbTFNFQ1RTXSwKKwkJCQlqaiA/IHZhbFtMU0VDVFNfQ1VSXSA6IDApOworCisJCQlpZiAoKG1pbl9zdGQgPT0gMSkgJiYgKHZhbFtUUkFDS19CWVRFU10gfHwgdmFsW1NFQ1RfQllURVNdKSkKKwkJCQlwcmludGYoIlx0Ynl0ZXMvdHJhY2s6ICV1XHRieXRlcy9zZWN0b3I6ICV1XG4iLAorCQkJCQl2YWxbVFJBQ0tfQllURVNdLCB2YWxbU0VDVF9CWVRFU10pOworCisJCQlpZiAoamopIHsKKwkJCQltbSA9ICh1aW50MzJfdCl2YWxbQ0FQQUNJVFlfTVNCXSA8PCAxNiB8IHZhbFtDQVBBQ0lUWV9MU0JdOworCQkJCWlmIChsaWtlX3N0ZCA8IDMpIHsKKwkJCQkJLyogY2hlY2sgRW5kaWFuIG9mIGNhcGFjaXR5IGJ5dGVzICovCisJCQkJCW5uID0gdmFsW0xDWUxTX0NVUl0gKiB2YWxbTEhFQURTX0NVUl0gKiB2YWxbTFNFQ1RTX0NVUl07CisJCQkJCW9vID0gKHVpbnQzMl90KXZhbFtDQVBBQ0lUWV9MU0JdIDw8IDE2IHwgdmFsW0NBUEFDSVRZX01TQl07CisJCQkJCWlmIChhYnMobW0gLSBubikgPiBhYnMob28gLSBubikpCisJCQkJCQltbSA9IG9vOworCQkJCX0KKwkJCQlwcmludGYoIlx0Q0hTIGN1cnJlbnQgYWRkcmVzc2FibGUgc2VjdG9yczolMTF1XG4iLCBtbSk7CisJCQl9CisJCX0KKwkJLyogTEJBIGFkZHJlc3NpbmcgKi8KKwkJcHJpbnRmKCJcdExCQSAgICB1c2VyIGFkZHJlc3NhYmxlIHNlY3RvcnM6JTExdVxuIiwgbGwpOworCQlpZiAoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkKKwkJICYmICh2YWxbQ01EU19TVVBQXzFdICYgU1VQUE9SVF80OF9CSVQpCisJCSkgeworCQkJYmJiaWcgPSAodWludDY0X3QpdmFsW0xCQV82NF9NU0JdIDw8IDQ4IHwKKwkJCSAgICAgICAgKHVpbnQ2NF90KXZhbFtMQkFfNDhfTVNCXSA8PCAzMiB8CisJCQkgICAgICAgICh1aW50NjRfdCl2YWxbTEJBX01JRF0gPDwgMTYgfAorCQkJCQl2YWxbTEJBX0xTQl07CisJCQlwcmludGYoIlx0TEJBNDggIHVzZXIgYWRkcmVzc2FibGUgc2VjdG9yczolMTEiUFJJdTY0IlxuIiwgYmJiaWcpOworCQl9CisKKwkJaWYgKCFiYmJpZykKKwkJCWJiYmlnID0gKHVpbnQ2NF90KShsbD5tbSA/IGxsIDogbW0pOyAvKiAjIDUxMiBieXRlIGJsb2NrcyAqLworCQlwcmludGYoIlx0ZGV2aWNlIHNpemUgd2l0aCBNID0gMTAyNCoxMDI0OiAlMTEiUFJJdTY0IiBNQnl0ZXNcbiIsIGJiYmlnPj4xMSk7CisJCWJiYmlnID0gKGJiYmlnIDw8IDkpIC8gMTAwMDAwMDsKKwkJcHJpbnRmKCJcdGRldmljZSBzaXplIHdpdGggTSA9IDEwMDAqMTAwMDogJTExIlBSSXU2NCIgTUJ5dGVzICIsIGJiYmlnKTsKKworCQlpZiAoYmJiaWcgPiAxMDAwKQorCQkJcHJpbnRmKCIoJSJQUkl1NjQiIEdCKVxuIiwgYmJiaWcvMTAwMCk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJLyogaHcgc3VwcG9ydCBvZiBjb21tYW5kcyAoY2FwYWJpbGl0aWVzKSAqLworCXByaW50ZigiQ2FwYWJpbGl0aWVzOlxuXHQiKTsKKworCWlmIChkZXYgPT0gQVRBUElfREVWKSB7CisJCWlmIChlcXB0ICE9IENEUk9NICYmICh2YWxbQ0FQQUJfMF0gJiBDTURfUV9TVVApKQorCQkJcHJpbnRmKCJDbWQgcXVldWluZywgIik7CisJCWlmICh2YWxbQ0FQQUJfMF0gJiBPVkxQX1NVUCkKKwkJCXByaW50ZigiQ21kIG92ZXJsYXAsICIpOworCX0KKwlpZiAodmFsW0NBUEFCXzBdICYgTEJBX1NVUCkgcHJpbnRmKCJMQkEsICIpOworCisJaWYgKGxpa2Vfc3RkICE9IDEpIHsKKwkJcHJpbnRmKCJJT1JEWSVzKGNhbiVzIGJlIGRpc2FibGVkKVxuIiwKKwkJCSEodmFsW0NBUEFCXzBdICYgSU9SRFlfU1VQKSA/ICIobWF5IGJlKSIgOiAiIiwKKwkJCSh2YWxbQ0FQQUJfMF0gJiBJT1JEWV9PRkYpID8gIiIgOiJub3QiKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCJubyBJT1JEWVxuIik7CisKKwlpZiAoKGxpa2Vfc3RkID09IDEpICYmIHZhbFtCVUZfVFlQRV0pIHsKKwkJcHJpbnRmKCJcdEJ1ZmZlciB0eXBlOiAlMDR4OiAlcyVzXG4iLCB2YWxbQlVGX1RZUEVdLAorCQkJKHZhbFtCVUZfVFlQRV0gPCAyKSA/ICJzaW5nbGUgcG9ydCwgc2luZ2xlLXNlY3RvciIgOiAiZHVhbCBwb3J0LCBtdWx0aS1zZWN0b3IiLAorCQkJKHZhbFtCVUZfVFlQRV0gPiAyKSA/ICIgd2l0aCByZWFkIGNhY2hpbmcgYWJpbGl0eSIgOiAiIik7CisJfQorCisJaWYgKChtaW5fc3RkID09IDEpICYmICh2YWxbQlVGRkVSX19TSVpFXSAmJiAodmFsW0JVRkZFUl9fU0laRV0gIT0gTk9WQUxfMSkpKSB7CisJCXByaW50ZigiXHRCdWZmZXIgc2l6ZTogJS4xZmtCXG4iLCAoZmxvYXQpdmFsW0JVRkZFUl9fU0laRV0vMik7CisJfQorCWlmICgobWluX3N0ZCA8IDQpICYmICh2YWxbUldfTE9OR10pKSB7CisJCXByaW50ZigiXHRieXRlcyBhdmFpbCBvbiByL3cgbG9uZzogJXVcbiIsIHZhbFtSV19MT05HXSk7CisJfQorCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID4gMykpIHsKKwkJcHJpbnRmKCJcdFF1ZXVlIGRlcHRoOiAldVxuIiwgKHZhbFtRVUVVRV9ERVBUSF0gJiBERVBUSF9CSVRTKSArIDEpOworCX0KKworCWlmIChkZXYgPT0gQVRBX0RFVikgeworCQlpZiAobGlrZV9zdGQgPT0gMSkKKwkJCXByaW50ZigiXHRDYW4lcyBwZXJmb3JtIGRvdWJsZS13b3JkIElPXG4iLCAoIXZhbFtEV09SRF9JT10pID8gIm5vdCIgOiAiIik7CisJCWVsc2UgeworCQkJcHJpbnRmKCJcdFN0YW5kYnkgdGltZXIgdmFsdWVzOiBzcGVjJ2QgYnkgJXMiLAorCQkJCSh2YWxbQ0FQQUJfMF0gJiBTVERfU1RCWSkgPyAic3RhbmRhcmQiIDogInZlbmRvciIpOworCQkJaWYgKChsaWtlX3N0ZCA+IDMpICYmICgodmFsW0NBUEFCXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkpCisJCQkJcHJpbnRmKCIsICVzIGRldmljZSBzcGVjaWZpYyBtaW5pbXVtXG4iLAorCQkJCQkodmFsW0NBUEFCXzFdICYgTUlOX1NUQU5EQllfVElNRVIpID8gIndpdGgiIDogIm5vIik7CisJCQllbHNlCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCQlwcmludGYoIlx0Ui9XIG11bHRpcGxlIHNlY3RvciB0cmFuc2ZlcjogIik7CisJCWlmICgobGlrZV9zdGQgPCAzKSAmJiAhKHZhbFtTRUNUT1JfWEZFUl9NQVhdICYgU0VDVE9SX1hGRVIpKQorCQkJcHJpbnRmKCJub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZWxzZSB7CisJCQlwcmludGYoIk1heCA9ICV1XHRDdXJyZW50ID0gIiwgdmFsW1NFQ1RPUl9YRkVSX01BWF0gJiBTRUNUT1JfWEZFUik7CisJCQlpZiAodmFsW1NFQ1RPUl9YRkVSX0NVUl0gJiBNVUxUSVBMRV9TRVRUSU5HX1ZBTElEKQorCQkJCXByaW50ZigiJXVcbiIsIHZhbFtTRUNUT1JfWEZFUl9DVVJdICYgU0VDVE9SX1hGRVIpOworCQkJZWxzZQorCQkJCXByaW50ZigiP1xuIik7CisJCX0KKwkJaWYgKChsaWtlX3N0ZCA+IDMpICYmICh2YWxbQ01EU19TVVBQXzFdICYgMHgwMDA4KSkgeworCQkJLyogV2UgcHJpbnQgb3V0IGVsc2V3aGVyZSB3aGV0aGVyIHRoZSBBUE0gZmVhdHVyZSBpcyBlbmFibGVkIG9yCisJCQkgICBub3QuICBJZiBpdCdzIG5vdCBlbmFibGVkLCBsZXQncyBub3QgcmVwZWF0IHRoZSBpbmZvOyBqdXN0IHByaW50CisJCQkgICBub3RoaW5nIGhlcmUuICovCisJCQlwcmludGYoIlx0QWR2YW5jZWRQTSBsZXZlbDogIik7CisJCQlpZiAoKHZhbFtBRFZfUFdSXSAmIDB4RkYwMCkgPT0gMHg0MDAwKSB7CisJCQkJdWludDhfdCBhcG1fbGV2ZWwgPSB2YWxbQURWX1BXUl0gJiAweDAwRkY7CisJCQkJcHJpbnRmKCIldSAoMHgleClcbiIsIGFwbV9sZXZlbCwgYXBtX2xldmVsKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwcmludGYoInVua25vd24gc2V0dGluZyAoMHglMDR4KVxuIiwgdmFsW0FEVl9QV1JdKTsKKwkJfQorCQlpZiAobGlrZV9zdGQgPiA1ICYmIHZhbFtBQ09VU1RJQ10pIHsKKwkJCXByaW50ZigiXHRSZWNvbW1lbmRlZCBhY291c3RpYyBtYW5hZ2VtZW50IHZhbHVlOiAldSwgY3VycmVudCB2YWx1ZTogJXVcbiIsCisJCQkJKHZhbFtBQ09VU1RJQ10gPj4gOCkgJiAweDAwZmYsCisJCQkJdmFsW0FDT1VTVElDXSAmIDB4MDBmZik7CisJCX0KKwl9IGVsc2UgeworCQkgLyogQVRBUEkgKi8KKwkJaWYgKGVxcHQgIT0gQ0RST00gJiYgKHZhbFtDQVBBQl8wXSAmIFNXUlNUX1JFUSkpCisJCQlwcmludGYoIlx0QVRBIHN3IHJlc2V0IHJlcXVpcmVkXG4iKTsKKworCQlpZiAodmFsW1BLVF9SRUxdIHx8IHZhbFtTVkNfTkJTWV0pIHsKKwkJCXByaW50ZigiXHRPdmVybGFwIHN1cHBvcnQ6Iik7CisJCQlpZiAodmFsW1BLVF9SRUxdKQorCQkJCXByaW50ZigiICV1dXMgdG8gcmVsZWFzZSBidXMuIiwgdmFsW1BLVF9SRUxdKTsKKwkJCWlmICh2YWxbU1ZDX05CU1ldKQorCQkJCXByaW50ZigiICV1dXMgdG8gY2xlYXIgQlNZIGFmdGVyIFNFUlZJQ0UgY21kLiIsCisJCQkJCXZhbFtTVkNfTkJTWV0pOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCX0KKworCS8qIERNQSBzdHVmZi4gQ2hlY2sgdGhhdCBvbmx5IG9uZSBETUEgbW9kZSBpcyBzZWxlY3RlZC4gKi8KKwlwcmludGYoIlx0RE1BOiAiKTsKKwlpZiAoISh2YWxbQ0FQQUJfMF0gJiBETUFfU1VQKSkKKwkJcHJpbnRmKCJub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJaWYgKHZhbFtETUFfTU9ERV0gJiYgIXZhbFtTSU5HTEVfRE1BXSAmJiAhdmFsW01VTFRJX0RNQV0pCisJCQlwcmludGYoIiBzZG1hJXVcbiIsICh2YWxbRE1BX01PREVdICYgTU9ERSkgPj4gOCk7CisJCWlmICh2YWxbU0lOR0xFX0RNQV0pIHsKKwkJCWpqID0gdmFsW1NJTkdMRV9ETUFdOworCQkJa2sgPSB2YWxbU0lOR0xFX0RNQV0gPj4gODsKKwkJCWVycl9kbWEgKz0gbW9kZV9sb29wKGpqLCBraywgJ3MnLCAmaGF2ZV9tb2RlKTsKKwkJfQorCQlpZiAodmFsW01VTFRJX0RNQV0pIHsKKwkJCWpqID0gdmFsW01VTFRJX0RNQV07CisJCQlrayA9IHZhbFtNVUxUSV9ETUFdID4+IDg7CisJCQllcnJfZG1hICs9IG1vZGVfbG9vcChqaiwga2ssICdtJywgJmhhdmVfbW9kZSk7CisJCX0KKwkJaWYgKCh2YWxbV0hBVFNfVkFMSURdICYgT0tfVzg4KSAmJiB2YWxbVUxUUkFfRE1BXSkgeworCQkJamogPSB2YWxbVUxUUkFfRE1BXTsKKwkJCWtrID0gdmFsW1VMVFJBX0RNQV0gPj4gODsKKwkJCWVycl9kbWEgKz0gbW9kZV9sb29wKGpqLCBraywgJ3UnLCAmaGF2ZV9tb2RlKTsKKwkJfQorCQlpZiAoZXJyX2RtYSB8fCAhaGF2ZV9tb2RlKSBwcmludGYoIig/KSIpOworCQliYl9wdXRjaGFyKCdcbicpOworCisJCWlmICgoZGV2ID09IEFUQVBJX0RFVikgJiYgKGVxcHQgIT0gQ0RST00pICYmICh2YWxbQ0FQQUJfMF0gJiBETUFfSUxfU1VQKSkKKwkJCXByaW50ZigiXHRcdEludGVybGVhdmVkIERNQSBzdXBwb3J0XG4iKTsKKworCQlpZiAoKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApCisJCSAmJiAodmFsW0RNQV9USU1FX01JTl0gfHwgdmFsW0RNQV9USU1FX05PUk1dKQorCQkpIHsKKwkJCXByaW50ZigiXHRcdEN5Y2xlIHRpbWU6Iik7CisJCQlpZiAodmFsW0RNQV9USU1FX01JTl0pIHByaW50ZigiIG1pbj0ldW5zIiwgdmFsW0RNQV9USU1FX01JTl0pOworCQkJaWYgKHZhbFtETUFfVElNRV9OT1JNXSkgcHJpbnRmKCIgcmVjb21tZW5kZWQ9JXVucyIsIHZhbFtETUFfVElNRV9OT1JNXSk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJLyogUHJvZ3JhbW1lZCBJTyBzdHVmZiAqLworCXByaW50ZigiXHRQSU86ICIpOworCS8qIElmIGEgZHJpdmUgc3VwcG9ydHMgbW9kZSBuIChlLmcuIDMpLCBpdCBhbHNvIHN1cHBvcnRzIGFsbCBtb2RlcyBsZXNzCisJICogdGhhbiBuIChlLmcuIDMsIDIsIDEgYW5kIDApLiAgUHJpbnQgYWxsIHRoZSBtb2Rlcy4gKi8KKwlpZiAoKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApICYmICh2YWxbQURWX1BJT19NT0RFU10gJiBQSU9fU1VQKSkgeworCQlqaiA9ICgodmFsW0FEVl9QSU9fTU9ERVNdICYgUElPX1NVUCkgPDwgMykgfCAweDAwMDc7CisJCWZvciAoaWkgPSAwOyBpaSA8PSBQSU9fTU9ERV9NQVg7IGlpKyspIHsKKwkJCWlmIChqaiAmIDB4MDAwMSkgcHJpbnRmKCJwaW8lZCAiLCBpaSk7CisJCQlqaiA+Pj0xOworCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIGlmICgoKG1pbl9zdGQgPCA1KSB8fCAoZXFwdCA9PSBDRFJPTSkpICYmICh2YWxbUElPX01PREVdICYgTU9ERSkpIHsKKwkJZm9yIChpaSA9IDA7IGlpIDw9IHZhbFtQSU9fTU9ERV0+Pjg7IGlpKyspCisJCQlwcmludGYoInBpbyVkICIsIGlpKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9IGVsc2UKKwkJcHV0cygidW5rbm93biIpOworCisJaWYgKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApIHsKKwkJaWYgKHZhbFtQSU9fTk9fRkxPV10gfHwgdmFsW1BJT19GTE9XXSkgeworCQkJcHJpbnRmKCJcdFx0Q3ljbGUgdGltZToiKTsKKwkJCWlmICh2YWxbUElPX05PX0ZMT1ddKQorCQkJCXByaW50ZigiIG5vIGZsb3cgY29udHJvbD0ldW5zIiwgdmFsW1BJT19OT19GTE9XXSk7CisJCQlpZiAodmFsW1BJT19GTE9XXSkKKwkJCQlwcmludGYoIiAgSU9SRFkgZmxvdyBjb250cm9sPSV1bnMiLCB2YWxbUElPX0ZMT1ddKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwl9CisKKwlpZiAoKHZhbFtDTURTX1NVUFBfMV0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB7CisJCXByaW50ZigiQ29tbWFuZHMvZmVhdHVyZXM6XG4iCisJCQkiXHRFbmFibGVkXHRTdXBwb3J0ZWQ6XG4iKTsKKwkJamogPSB2YWxbQ01EU19TVVBQXzBdOworCQlrayA9IHZhbFtDTURTX0VOXzBdOworCQlmb3IgKGlpID0gMDsgaWkgPCBOVU1fQ01EX0ZFQVRfU1RSOyBpaSsrKSB7CisJCQljb25zdCBjaGFyICpmZWF0X3N0ciA9IG50aF9zdHJpbmcoY21kX2ZlYXRfc3RyLCBpaSk7CisJCQlpZiAoKGpqICYgMHg4MDAwKSAmJiAoKmZlYXRfc3RyICE9ICdcMCcpKSB7CisJCQkJcHJpbnRmKCJcdCVzXHQlc1xuIiwgKGtrICYgMHg4MDAwKSA/ICIgICAqIiA6ICIiLCBmZWF0X3N0cik7CisJCQl9CisJCQlqaiA8PD0gMTsKKwkJCWtrIDw8PSAxOworCQkJaWYgKGlpICUgMTYgPT0gMTUpIHsKKwkJCQlqaiA9IHZhbFtDTURTX1NVUFBfMCsxKyhpaS8xNildOworCQkJCWtrID0gdmFsW0NNRFNfRU5fMCsxKyhpaS8xNildOworCQkJfQorCQkJaWYgKGlpID09IDMxKSB7CisJCQkJaWYgKCh2YWxbQ01EU19TVVBQXzJdICYgVkFMSUQpICE9IFZBTElEX1ZBTCkKKwkJCQkJaWkgKz0xNjsKKwkJCX0KKwkJfQorCX0KKwkvKiBSZW1vdmFibGUgTWVkaWEgU3RhdHVzIE5vdGlmaWNhdGlvbiBmZWF0dXJlIHNldCAqLworCWlmICgodmFsW1JNX1NUQVRdICYgUk1fU1RBVF9CSVRTKSA9PSBSTV9TVEFUX1NVUCkKKwkJcHJpbnRmKCJcdCVzIHN1cHBvcnRlZFxuIiwgbnRoX3N0cmluZyhjbWRfZmVhdF9zdHIsIDI3KSk7CisKKwkvKiBzZWN1cml0eSAqLworCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID4gMykKKwkgJiYgKHZhbFtTRUNVX1NUQVRVU10gfHwgdmFsW0VSQVNFX1RJTUVdIHx8IHZhbFtFTkhfRVJBU0VfVElNRV0pCisJKSB7CisJCXByaW50ZigiU2VjdXJpdHk6XG4iKTsKKwkJaWYgKHZhbFtQU1dEX0NPREVdICYmICh2YWxbUFNXRF9DT0RFXSAhPSBOT1ZBTF8xKSkKKwkJCXByaW50ZigiXHRNYXN0ZXIgcGFzc3dvcmQgcmV2aXNpb24gY29kZSA9ICV1XG4iLCB2YWxbUFNXRF9DT0RFXSk7CisJCWpqID0gdmFsW1NFQ1VfU1RBVFVTXTsKKwkJaWYgKGpqKSB7CisJCQlmb3IgKGlpID0gMDsgaWkgPCBOVU1fU0VDVV9TVFI7IGlpKyspIHsKKwkJCQlwcmludGYoIlx0JXNcdCVzXG4iLAorCQkJCQkoIShqaiAmIDB4MDAwMSkpID8gIm5vdCIgOiAiIiwKKwkJCQkJbnRoX3N0cmluZyhzZWN1X3N0ciwgaWkpKTsKKwkJCQlqaiA+Pj0xOworCQkJfQorCQkJaWYgKHZhbFtTRUNVX1NUQVRVU10gJiBTRUNVX0VOQUJMRUQpIHsKKwkJCQlwcmludGYoIlx0U2VjdXJpdHkgbGV2ZWwgJXNcbiIsCisJCQkJCSh2YWxbU0VDVV9TVEFUVVNdICYgU0VDVV9MRVZFTCkgPyAibWF4aW11bSIgOiAiaGlnaCIpOworCQkJfQorCQl9CisJCWpqID0gIHZhbFtFUkFTRV9USU1FXSAgICAgJiBFUkFTRV9CSVRTOworCQlrayA9ICB2YWxbRU5IX0VSQVNFX1RJTUVdICYgRVJBU0VfQklUUzsKKwkJaWYgKGpqIHx8IGtrKSB7CisJCQliYl9wdXRjaGFyKCdcdCcpOworCQkJaWYgKGpqKSBwcmludGYoIiV1bWluIGZvciAlc1NFQ1VSSVRZIEVSQVNFIFVOSVQuICIsIGpqPT1FUkFTRV9CSVRTID8gNTA4IDogamo8PDEsICIiKTsKKwkJCWlmIChraykgcHJpbnRmKCIldW1pbiBmb3IgJXNTRUNVUklUWSBFUkFTRSBVTklULiAiLCBraz09RVJBU0VfQklUUyA/IDUwOCA6IGtrPDwxLCAiRU5IQU5DRUQgIik7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJLyogcmVzZXQgcmVzdWx0ICovCisJamogPSB2YWxbSFdSU1RfUlNMVF07CisJaWYgKChqaiAmIFZBTElEKSA9PSBWQUxJRF9WQUwpIHsKKwkJb28gPSAoamogJiBSU1QwKTsKKwkJaWYgKCFvbykKKwkJCWpqID4+PSA4OworCQlpZiAoKGpqICYgREVWX0RFVCkgPT0gSlVNUEVSX1ZBTCkKKwkJCXN0cm5nID0gIiBkZXRlcm1pbmVkIGJ5IHRoZSBqdW1wZXIiOworCQllbHNlIGlmICgoamogJiBERVZfREVUKSA9PSBDU0VMX1ZBTCkKKwkJCXN0cm5nID0gIiBkZXRlcm1pbmVkIGJ5IENTRUwiOworCQllbHNlCisJCQlzdHJuZyA9ICIiOworCQlwcmludGYoIkhXIHJlc2V0IHJlc3VsdHM6XG4iCisJCQkiXHRDQkxJRC0gJXMgVmloXG4iCisJCQkiXHREZXZpY2UgbnVtID0gJWklc1xuIiwKKwkJCSh2YWxbSFdSU1RfUlNMVF0gJiBDQkxJRCkgPyAiYWJvdmUiIDogImJlbG93IiwKKwkJCSEob28pLCBzdHJuZyk7CisJfQorCisJLyogbW9yZSBzdHVmZiBmcm9tIHN0ZCA1ICovCisJaWYgKChsaWtlX3N0ZCA+IDQpICYmIChlcXB0ICE9IENEUk9NKSkgeworCQlpZiAodmFsW0NGQV9QV1JfTU9ERV0gJiBWQUxJRF9XMTYwKSB7CisJCQlwcmludGYoIkNGQSBwb3dlciBtb2RlIDE6XG4iCisJCQkJIlx0JXMlc1xuIiwKKwkJCQkodmFsW0NGQV9QV1JfTU9ERV0gJiBQV1JfTU9ERV9PRkYpID8gImRpc2FibGVkIiA6ICJlbmFibGVkIiwKKwkJCQkodmFsW0NGQV9QV1JfTU9ERV0gJiBQV1JfTU9ERV9SRVEpID8gIiBhbmQgcmVxdWlyZWQgYnkgc29tZSBjb21tYW5kcyIgOiAiIik7CisJCQlpZiAodmFsW0NGQV9QV1JfTU9ERV0gJiBNQVhfQU1QUykKKwkJCQlwcmludGYoIlx0TWF4aW11bSBjdXJyZW50ID0gJXVtYVxuIiwgdmFsW0NGQV9QV1JfTU9ERV0gJiBNQVhfQU1QUyk7CisJCX0KKwkJaWYgKCh2YWxbSU5URUdSSVRZXSAmIFNJRykgPT0gU0lHX1ZBTCkgeworCQkJcHJpbnRmKCJDaGVja3N1bTogJXNjb3JyZWN0XG4iLCBjaGtzdW0gPyAiaW4iIDogIiIpOworCQl9CisJfQorCisJZXhpdChFWElUX1NVQ0NFU1MpOworfQorI2VuZGlmCisKKy8vIEhpc3RvcmljYWxseSwgaWYgdGhlcmUgd2FzIG5vIEhESU9fT0JTT0xFVEVfSURFTlRJVFksIHRoZW4KKy8vIHRoZW4gdGhlIEhESU9fR0VUX0lERU5USVRZIG9ubHkgcmV0dXJuZWQgMTQyIGJ5dGVzLgorLy8gT3RoZXJ3aXNlLCBIRElPX09CU09MRVRFX0lERU5USVRZIHJldHVybnMgMTQyIGJ5dGVzLAorLy8gYW5kIEhESU9fR0VUX0lERU5USVRZIHJldHVybnMgNTEyIGJ5dGVzLiAgQnV0IHRoZSBsYXRlc3QKKy8vIDIuNS54eCBrZXJuZWxzIG5vIGxvbmdlciBkZWZpbmUgSERJT19PQlNPTEVURV9JREVOVElUWQorLy8gKHdoaWNoIHRoZXkgc2hvdWxkLCBidXQgdGhleSBzaG91bGQganVzdCByZXR1cm4gLUVJTlZBTCkuCisvLworLy8gU28uLiB3ZSBtdXN0IG5vdyBhc3N1bWUgdGhhdCBIRElPX0dFVF9JREVOVElUWSByZXR1cm5zIDUxMiBieXRlcy4KKy8vIE9uIGEgcmVhbGx5IG9sZCBzeXN0ZW0sIGl0IHdpbGwgbm90LCBhbmQgd2Ugd2lsbCBiZSBjb25mdXNlZC4KKy8vIFRvbyBiYWQsIHJlYWxseS4KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkKK3N0YXRpYyBjb25zdCBjaGFyIGNmZ19zdHJbXSBBTElHTjEgPQorCSIiIlwwIiAgICAgICAgICAgICJIYXJkU2VjdCIiXDAiICAgIlNvZnRTZWN0IiJcMCIgICJOb3RNRk0iIlwwIgorCSJIZFN3PjE1dVNlYyIiXDAiICJTcGluTW90Q3RsIiJcMCIgIkZpeGVkIiJcMCIgICAgICJSZW1vdmVhYmxlIiJcMCIKKwkiRFRSPD01TWJzIiJcMCIgICAiRFRSPjVNYnMiIlwwIiAgICJEVFI+MTBNYnMiIlwwIiAiUm90U3BkVG9sPi41JSIiXDAiCisJImRTdGJPZmYiIlwwIiAgICAgIlRya09mZiIiXDAiICAgICAiRm10R2FwUmVxIiJcMCIgIm5vbk1hZ25ldGljIgorOworCitzdGF0aWMgY29uc3QgY2hhciBCdWZmVHlwZVtdIEFMSUdOMSA9CisJInVua25vd24iIlwwIiAgICAgIjFTZWN0IiJcMCIgICAgICAiRHVhbFBvcnQiIlwwIiAgIkR1YWxQb3J0Q2FjaGUiCis7CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGR1bXBfaWRlbnRpdHkoY29uc3Qgc3RydWN0IGhkX2RyaXZlaWQgKmlkKQoreworCWludCBpOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICppZF9yZWdzID0gKGNvbnN0IHZvaWQqKSBpZDsKKworCXByaW50ZigiXG4gTW9kZWw9JS40MHMsIEZ3UmV2PSUuOHMsIFNlcmlhbE5vPSUuMjBzXG4gQ29uZmlnPXsiLAorCQkJCWlkLT5tb2RlbCwgaWQtPmZ3X3JldiwgaWQtPnNlcmlhbF9ubyk7CisJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKSB7CisJCWlmIChpZC0+Y29uZmlnICYgKDE8PGkpKQorCQkJcHJpbnRmKCIgJXMiLCBudGhfc3RyaW5nKGNmZ19zdHIsIGkpKTsKKwl9CisJcHJpbnRmKCIgfVxuIFJhd0NIUz0ldS8ldS8ldSwgVHJrU2l6ZT0ldSwgU2VjdFNpemU9JXUsIEVDQ2J5dGVzPSV1XG4iCisJCSIgQnVmZlR5cGU9KCV1KSAlcywgQnVmZlNpemU9JXVrQiwgTWF4TXVsdFNlY3Q9JXUiLAorCQlpZC0+Y3lscywgaWQtPmhlYWRzLCBpZC0+c2VjdG9ycywgaWQtPnRyYWNrX2J5dGVzLAorCQlpZC0+c2VjdG9yX2J5dGVzLCBpZC0+ZWNjX2J5dGVzLAorCQlpZC0+YnVmX3R5cGUsCisJCW50aF9zdHJpbmcoQnVmZlR5cGUsIChpZC0+YnVmX3R5cGUgPiAzKSA/IDAgOiBpZC0+YnVmX3R5cGUpLAorCQlpZC0+YnVmX3NpemUvMiwgaWQtPm1heF9tdWx0c2VjdCk7CisJaWYgKGlkLT5tYXhfbXVsdHNlY3QpIHsKKwkJcHJpbnRmKCIsIE11bHRTZWN0PSIpOworCQlpZiAoIShpZC0+bXVsdHNlY3RfdmFsaWQgJiAxKSkKKwkJCXByaW50ZigiPyV1PyIsIGlkLT5tdWx0c2VjdCk7CisJCWVsc2UgaWYgKGlkLT5tdWx0c2VjdCkKKwkJCXByaW50ZigiJXUiLCBpZC0+bXVsdHNlY3QpOworCQllbHNlCisJCQlwcmludGYoIm9mZiIpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJaWYgKCEoaWQtPmZpZWxkX3ZhbGlkICYgMSkpCisJCXByaW50ZigiIChtYXliZSk6Iik7CisKKwlwcmludGYoIiBDdXJDSFM9JXUvJXUvJXUsIEN1clNlY3RzPSVsdSwgTEJBPSVzIiwgaWQtPmN1cl9jeWxzLCBpZC0+Y3VyX2hlYWRzLAorCQlpZC0+Y3VyX3NlY3RvcnMsCisJCShCQl9CSUdfRU5ESUFOKSA/CisJCQkodW5zaWduZWQgbG9uZykoaWQtPmN1cl9jYXBhY2l0eTAgPDwgMTYpIHwgaWQtPmN1cl9jYXBhY2l0eTEgOgorCQkJKHVuc2lnbmVkIGxvbmcpKGlkLT5jdXJfY2FwYWNpdHkxIDw8IDE2KSB8IGlkLT5jdXJfY2FwYWNpdHkwLAorCQkJKChpZC0+Y2FwYWJpbGl0eSYyKSA9PSAwKSA/ICJubyIgOiAieWVzIik7CisKKwlpZiAoaWQtPmNhcGFiaWxpdHkgJiAyKQorCQlwcmludGYoIiwgTEJBc2VjdHM9JXUiLCBpZC0+bGJhX2NhcGFjaXR5KTsKKworCXByaW50ZigiXG4gSU9SRFk9JXMiLAorCQkoaWQtPmNhcGFiaWxpdHkgJiA4KQorCQkJPyAoKGlkLT5jYXBhYmlsaXR5ICYgNCkgPyAib24vb2ZmIiA6ICJ5ZXMiKQorCQkJOiAibm8iKTsKKworCWlmICgoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSAmJiAoaWQtPmZpZWxkX3ZhbGlkICYgMikpCisJCXByaW50ZigiLCB0UElPPXttaW46JXUsdy9JT1JEWToldX0iLCBpZC0+ZWlkZV9waW8sIGlkLT5laWRlX3Bpb19pb3JkeSk7CisKKwlpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgKGlkLT5maWVsZF92YWxpZCAmIDIpKQorCQlwcmludGYoIiwgdERNQT17bWluOiV1LHJlYzoldX0iLCBpZC0+ZWlkZV9kbWFfbWluLCBpZC0+ZWlkZV9kbWFfdGltZSk7CisKKwlwcmludGYoIlxuIFBJTyBtb2RlczogICIpOworCWlmIChpZC0+dFBJTyA8PSA1KSB7CisJCXByaW50ZigicGlvMCAiKTsKKwkJaWYgKGlkLT50UElPID49IDEpIHByaW50ZigicGlvMSAiKTsKKwkJaWYgKGlkLT50UElPID49IDIpIHByaW50ZigicGlvMiAiKTsKKwl9CisJaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpIHsKKwkJc3RhdGljIGNvbnN0IG1hc2tzX2xhYmVsc190IHBpb19tb2RlcyA9IHsKKwkJCS5tYXNrcyA9IHsgMSwgMiwgfjMgfSwKKwkJCS5sYWJlbHMgPSAicGlvMyBcMCIicGlvNCBcMCIicGlvPyBcMCIsCisJCX07CisJCXByaW50X2ZsYWdzKCZwaW9fbW9kZXMsIGlkLT5laWRlX3Bpb19tb2Rlcyk7CisJfQorCWlmIChpZC0+Y2FwYWJpbGl0eSAmIDEpIHsKKwkJaWYgKGlkLT5kbWFfMXdvcmQgfCBpZC0+ZG1hX213b3JkKSB7CisJCQlzdGF0aWMgY29uc3QgaW50IGRtYV93bW9kZV9tYXNrc1tdID0geyAweDEwMCwgMSwgMHgyMDAsIDIsIDB4NDAwLCA0LCAweGY4MDAsIDB4ZjggfTsKKwkJCXByaW50ZigiXG4gRE1BIG1vZGVzOiAgIik7CisJCQlwcmludF9mbGFnc19zZXBhcmF0ZWQoZG1hX3dtb2RlX21hc2tzLAorCQkJCSIqXDAiInNkbWEwIFwwIiIqXDAiInNkbWExIFwwIiIqXDAiInNkbWEyIFwwIiIqXDAiInNkbWE/IFwwIiwKKwkJCQlpZC0+ZG1hXzF3b3JkLCBOVUxMKTsKKwkJCXByaW50X2ZsYWdzX3NlcGFyYXRlZChkbWFfd21vZGVfbWFza3MsCisJCQkJIipcMCIibWRtYTAgXDAiIipcMCIibWRtYTEgXDAiIipcMCIibWRtYTIgXDAiIipcMCIibWRtYT8gXDAiLAorCQkJCWlkLT5kbWFfbXdvcmQsIE5VTEwpOworCQl9CisJfQorCWlmICgoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92YWxpZCAmIDIpKSAmJiBpZC0+ZmllbGRfdmFsaWQgJiA0KSB7CisJCXN0YXRpYyBjb25zdCBtYXNrc19sYWJlbHNfdCB1bHRyYV9tb2RlczEgPSB7CisJCQkubWFza3MgPSB7IDB4MTAwLCAweDAwMSwgMHgyMDAsIDB4MDAyLCAweDQwMCwgMHgwMDQgfSwKKwkJCS5sYWJlbHMgPSAiKlwwIiJ1ZG1hMCBcMCIiKlwwIiJ1ZG1hMSBcMCIiKlwwIiJ1ZG1hMiBcMCIsCisJCX07CisKKwkJcHJpbnRmKCJcbiBVRE1BIG1vZGVzOiAiKTsKKwkJcHJpbnRfZmxhZ3MoJnVsdHJhX21vZGVzMSwgaWQtPmRtYV91bHRyYSk7CisjaWZkZWYgX19ORVdfSERfRFJJVkVfSUQKKwkJaWYgKGlkLT5od19jb25maWcgJiAweDIwMDApIHsKKyNlbHNlIC8qICFfX05FV19IRF9EUklWRV9JRCAqLworCQlpZiAoaWQtPndvcmQ5MyAmIDB4MjAwMCkgeworI2VuZGlmIC8qIF9fTkVXX0hEX0RSSVZFX0lEICovCisJCQlzdGF0aWMgY29uc3QgbWFza3NfbGFiZWxzX3QgdWx0cmFfbW9kZXMyID0geworCQkJCS5tYXNrcyA9IHsgMHgwODAwLCAweDAwMDgsIDB4MTAwMCwgMHgwMDEwLAorCQkJCQkweDIwMDAsIDB4MDAyMCwgMHg0MDAwLCAweDAwNDAsCisJCQkJCTB4ODAwMCwgMHgwMDgwIH0sCisJCQkJLmxhYmVscyA9ICIqXDAiInVkbWEzIFwwIiIqXDAiInVkbWE0IFwwIgorCQkJCQkiKlwwIiJ1ZG1hNSBcMCIiKlwwIiJ1ZG1hNiBcMCIKKwkJCQkJIipcMCIidWRtYTcgXDAiCisJCQl9OworCQkJcHJpbnRfZmxhZ3MoJnVsdHJhX21vZGVzMiwgaWQtPmRtYV91bHRyYSk7CisJCX0KKwl9CisJcHJpbnRmKCJcbiBBZHZhbmNlZFBNPSVzIiwgKCEoaWRfcmVnc1s4M10gJiA4KSkgPyAibm8iIDogInllcyIpOworCWlmIChpZF9yZWdzWzgzXSAmIDgpIHsKKwkJaWYgKCEoaWRfcmVnc1s4Nl0gJiA4KSkKKwkJCXByaW50ZigiOiBkaXNhYmxlZCAoMjU1KSIpOworCQllbHNlIGlmICgoaWRfcmVnc1s5MV0gJiAweEZGMDApICE9IDB4NDAwMCkKKwkJCXByaW50ZigiOiB1bmtub3duIHNldHRpbmciKTsKKwkJZWxzZQorCQkJcHJpbnRmKCI6IG1vZGU9MHglMDJYICgldSkiLCBpZF9yZWdzWzkxXSAmIDB4RkYsIGlkX3JlZ3NbOTFdICYgMHhGRik7CisJfQorCWlmIChpZF9yZWdzWzgyXSAmIDB4MjApCisJCXByaW50ZigiIFdyaXRlQ2FjaGU9JXMiLCAoaWRfcmVnc1s4NV0gJiAweDIwKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworI2lmZGVmIF9fTkVXX0hEX0RSSVZFX0lECisJaWYgKChpZC0+bWlub3JfcmV2X251bSAmJiBpZC0+bWlub3JfcmV2X251bSA8PSAzMSkKKwkgfHwgKGlkLT5tYWpvcl9yZXZfbnVtICYmIGlkLT5taW5vcl9yZXZfbnVtIDw9IDMxKQorCSkgeworCQlwcmludGYoIlxuIERyaXZlIGNvbmZvcm1zIHRvOiAlczogIiwKKwkJCShpZC0+bWlub3JfcmV2X251bSA8PSAzMSkgPyBudGhfc3RyaW5nKG1pbm9yX3N0ciwgaWQtPm1pbm9yX3Jldl9udW0pIDogInVua25vd24iKTsKKwkJaWYgKGlkLT5tYWpvcl9yZXZfbnVtICE9IDB4MDAwMCAvKiBOT1ZBTF8wICovCisJCSAmJiBpZC0+bWFqb3JfcmV2X251bSAhPSAweEZGRkYgLyogTk9WQUxfMSAqLworCQkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgeworCQkJCWlmIChpZC0+bWFqb3JfcmV2X251bSAmICgxPDxpKSkKKwkJCQkJcHJpbnRmKCIgQVRBL0FUQVBJLSV1IiwgaSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogX19ORVdfSERfRFJJVkVfSUQgKi8KKwlwcmludGYoIlxuXG4gKiBjdXJyZW50IGFjdGl2ZSBtb2RlXG5cbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcl9jYWNoZSgvKmludCBmZCovIHZvaWQpCit7CisJZnN5bmMoZmQpOwkJCQkvKiBmbHVzaCBidWZmZXJzICovCisJaW9jdGxfb3Jfd2FybihmZCwgQkxLRkxTQlVGLCBOVUxMKTsgLyogZG8gaXQgYWdhaW4sIGJpZyB0aW1lICovCisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlzbGVlcCgxKTsKKwlpZiAoaW9jdGwoZmQsIEhESU9fRFJJVkVfQ01ELCBOVUxMKSAmJiBlcnJubyAhPSBFSU5WQUwpIHsJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQlpZiAoRU5BQkxFX0lPQ1RMX0hFWDJTVFJfRVJST1IpIC8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2FybiAqLworCQkJYmJfcGVycm9yX21zZygiSERJT19EUklWRV9DTUQiKTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIEhESU9fRFJJVkVfQ01EKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc2Vla190b196ZXJvKC8qaW50IGZkKi8gdm9pZCkKK3sKKwl4bHNlZWsoZmQsIChvZmZfdCkgMCwgU0VFS19TRVQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2JpZ19ibG9jaygvKmludCBmZCwqLyBjaGFyICpidWYpCit7CisJaW50IGk7CisKKwl4cmVhZChmZCwgYnVmLCBUSU1JTkdfQlVGX0JZVEVTKTsKKwkvKiBhY2Nlc3MgYWxsIHNlY3RvcnMgb2YgYnVmIHRvIGVuc3VyZSB0aGUgcmVhZCBmdWxseSBjb21wbGV0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVElNSU5HX0JVRl9CWVRFUzsgaSArPSA1MTIpCisJCWJ1ZltpXSAmPSAxOworfQorCitzdGF0aWMgdW5zaWduZWQgZGV2X3NpemVfbWIoLyppbnQgZmQqLyB2b2lkKQoreworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJsa3NpemU2NDsKKwkJdW5zaWduZWQgYmxrc2l6ZTMyOworCX0gdTsKKworCWlmICgwID09IGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsICZ1LmJsa3NpemU2NCkpIHsgLy8gYnl0ZXMKKwkJdS5ibGtzaXplNjQgLz0gKDEwMjQgKiAxMDI0KTsKKwl9IGVsc2UgeworCQl4aW9jdGwoZmQsIEJMS0dFVFNJWkUsICZ1LmJsa3NpemUzMik7IC8vIHNlY3RvcnMKKwkJdS5ibGtzaXplNjQgPSB1LmJsa3NpemUzMiAvICgyICogMTAyNCk7CisJfQorCWlmICh1LmJsa3NpemU2NCA+IFVJTlRfTUFYKQorCQlyZXR1cm4gVUlOVF9NQVg7CisJcmV0dXJuIHUuYmxrc2l6ZTY0OworfQorCitzdGF0aWMgdm9pZCBwcmludF90aW1pbmcodW5zaWduZWQgbSwgdW5zaWduZWQgZWxhcHNlZF91cykKK3sKKwl1bnNpZ25lZCBzZWMgPSBlbGFwc2VkX3VzIC8gMTAwMDAwMDsKKwl1bnNpZ25lZCBocyA9IChlbGFwc2VkX3VzICUgMTAwMDAwMCkgLyAxMDAwMDsKKworCXByaW50ZigiJTV1IE1CIGluICV1LiUwMnUgc2Vjb25kcyA9ICV1IGtCL3NcbiIsCisJCW0sIHNlYywgaHMsCisJCS8qICJ8IDEiIHByZXZlbnRzIGRpdi1ieS0wICovCisJCSh1bnNpZ25lZCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpbSAqICgxMDI0ICogMTAwMDAwMCkgLyAoZWxhcHNlZF91cyB8IDEpKQorCQkvLyB+PSAobSAqIDEwMjQpIC8gKGVsYXBzZWRfdXMgLyAxMDAwMDAwKQorCQkvLyA9IGtiIC8gZWxhcHNlZF9zZWMKKwkpOworfQorCitzdGF0aWMgdm9pZCBkb190aW1lKGludCBjYWNoZSAvKixpbnQgZmQqLykKKy8qIGNhY2hlPTE6IHRpbWUgY2FjaGU6IHJlcGVhdGVkbHkgcmVhZCBOIE1CIGF0IG9mZnNldCAwCisgKiBjYWNoZT0wOiB0aW1lIGRldmljZTogbGluZWFyIHJlYWQsIHN0YXJ0aW5nIGF0IG9mZnNldCAwCisgKi8KK3sKKwl1bnNpZ25lZCBtYXhfaXRlcmF0aW9ucywgaXRlcmF0aW9uczsKKwl1bnNpZ25lZCBzdGFydDsgLyogZG9lc24ndCBuZWVkIHRvIGJlIGxvbmcgbG9uZyAqLworCXVuc2lnbmVkIGVsYXBzZWQsIGVsYXBzZWQyOworCXVuc2lnbmVkIHRvdGFsX01COworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MoVElNSU5HX0JVRl9CWVRFUyk7CisKKwlpZiAobWxvY2soYnVmLCBUSU1JTkdfQlVGX0JZVEVTKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtbG9jayIpOworCisJLyogQ2xlYXIgb3V0IHRoZSBkZXZpY2UgcmVxdWVzdCBxdWV1ZXMgJiBnaXZlIHRoZW0gdGltZSB0byBjb21wbGV0ZS4KKwkgKiBOQjogKnNtYWxsKiBkZWxheS4gVXNlciBpcyBleHBlY3RlZCB0byBoYXZlIGEgY2x1ZSBhbmQgdG8gbm90IHJ1bgorCSAqIGhlYXZ5IGlvIGluIHBhcmFsbGVsIHdpdGggbWVhc3VyZW1lbnRzLiAqLworCXN5bmMoKTsKKwlzbGVlcCgxKTsKKwlpZiAoY2FjaGUpIHsgLyogVGltZSBjYWNoZSAqLworCQlzZWVrX3RvX3plcm8oKTsKKwkJcmVhZF9iaWdfYmxvY2soYnVmKTsKKwkJcHJpbnRmKCJUaW1pbmcgYnVmZmVyLWNhY2hlIHJlYWRzOiAiKTsKKwl9IGVsc2UgeyAvKiBUaW1lIGRldmljZSAqLworCQlwcmludGYoIlRpbWluZyBidWZmZXJlZCBkaXNrIHJlYWRzOiIpOworCX0KKwlmZmx1c2hfYWxsKCk7CisKKwkvKiBOb3cgZG8gdGhlIHRpbWluZyAqLworCWl0ZXJhdGlvbnMgPSAwOworCS8qIE1heCB0aW1lIHRvIHJ1biAoc21hbGwgZm9yIGNhY2hlLCBhdm9pZHMgZ2V0dGluZworCSAqIGh1Z2UgdG90YWxfTUIgd2hpY2ggY2FuIG92ZXJsb3cgdW5zaWduZWQgdHlwZSkgKi8KKwllbGFwc2VkMiA9IDUxMDAwMDsgLyogY2FjaGUgKi8KKwltYXhfaXRlcmF0aW9ucyA9IFVJTlRfTUFYOworCWlmICghY2FjaGUpIHsKKwkJZWxhcHNlZDIgPSAzMDAwMDAwOyAvKiBub3QgY2FjaGUgKi8KKwkJLyogRG9uJ3Qgd2FudCB0byByZWFkIHBhc3QgdGhlIGVuZCEgKi8KKwkJbWF4X2l0ZXJhdGlvbnMgPSBkZXZfc2l6ZV9tYigpIC8gVElNSU5HX0JVRl9NQjsKKwl9CisJc3RhcnQgPSBtb25vdG9uaWNfdXMoKTsKKwlkbyB7CisJCWlmIChjYWNoZSkKKwkJCXNlZWtfdG9femVybygpOworCQlyZWFkX2JpZ19ibG9jayhidWYpOworCQllbGFwc2VkID0gKHVuc2lnbmVkKW1vbm90b25pY191cygpIC0gc3RhcnQ7CisJCSsraXRlcmF0aW9uczsKKwl9IHdoaWxlIChlbGFwc2VkIDwgZWxhcHNlZDIgJiYgaXRlcmF0aW9ucyA8IG1heF9pdGVyYXRpb25zKTsKKwl0b3RhbF9NQiA9IGl0ZXJhdGlvbnMgKiBUSU1JTkdfQlVGX01COworCS8vcHJpbnRmKCIgZWxhcHNlZDoldSBpdGVyYXRpb25zOiV1ICIsIGVsYXBzZWQsIGl0ZXJhdGlvbnMpOworCWlmIChjYWNoZSkgeworCQkvKiBDYWNoZTogcmVtb3ZlIGxzZWVrKCkgYW5kIG1vbm90b25pY191cygpIG92ZXJoZWFkcworCQkgKiBmcm9tIGVsYXBzZWQgKi8KKwkJc3RhcnQgPSBtb25vdG9uaWNfdXMoKTsKKwkJZG8geworCQkJc2Vla190b196ZXJvKCk7CisJCQllbGFwc2VkMiA9ICh1bnNpZ25lZCltb25vdG9uaWNfdXMoKSAtIHN0YXJ0OworCQl9IHdoaWxlICgtLWl0ZXJhdGlvbnMpOworCQkvL3ByaW50ZigiIGVsYXBzZWQyOiV1ICIsIGVsYXBzZWQyKTsKKwkJZWxhcHNlZCAtPSBlbGFwc2VkMjsKKwkJdG90YWxfTUIgKj0gMjsgLy8gQlVGQ0FDSEVfRkFDVE9SICh3aHk/KQorCQlmbHVzaF9idWZmZXJfY2FjaGUoKTsKKwl9CisJcHJpbnRfdGltaW5nKHRvdGFsX01CLCBlbGFwc2VkKTsKKwltdW5sb2NrKGJ1ZiwgVElNSU5HX0JVRl9CWVRFUyk7CisJZnJlZShidWYpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorc3RhdGljIHZvaWQgYnVzX3N0YXRlX3ZhbHVlKHVuc2lnbmVkIHZhbHVlKQoreworCWlmICh2YWx1ZSA9PSBCVVNTVEFURV9PTikKKwkJb25fb2ZmKDEpOworCWVsc2UgaWYgKHZhbHVlID09IEJVU1NUQVRFX09GRikKKwkJb25fb2ZmKDApOworCWVsc2UgaWYgKHZhbHVlID09IEJVU1NUQVRFX1RSSVNUQVRFKQorCQlwcmludGYoIiAodHJpc3RhdGUpXG4iKTsKKwllbHNlCisJCXByaW50ZigiICh1bmtub3duOiAlZClcbiIsIHZhbHVlKTsKK30KKyNlbmRpZgorCisjaWZkZWYgSERJT19EUklWRV9DTUQKK3N0YXRpYyB2b2lkIGludGVycHJldF9zdGFuZGJ5KHVpbnQ4X3Qgc3RhbmRieSkKK3sKKwlwcmludGYoIiAoIik7CisJaWYgKHN0YW5kYnkgPT0gMCkgeworCQlwcmludGYoIm9mZiIpOworCX0gZWxzZSBpZiAoc3RhbmRieSA8PSAyNDAgfHwgc3RhbmRieSA9PSAyNTIgfHwgc3RhbmRieSA9PSAyNTUpIHsKKwkJLyogc3RhbmRieSBpcyBpbiA1IHNlYyB1bml0cyAqLworCQl1bnNpZ25lZCB0ID0gc3RhbmRieSAqIDU7CisJCXByaW50ZigiJXUgbWludXRlcyAldSBzZWNvbmRzIiwgdCAvIDYwLCB0ICUgNjApOworCX0gZWxzZSBpZiAoc3RhbmRieSA8PSAyNTEpIHsKKwkJdW5zaWduZWQgdCA9IChzdGFuZGJ5IC0gMjQwKTsgLyogdCBpcyBpbiAzMCBtaW4gdW5pdHMgKi87CisJCXByaW50ZigiJXUuJWMgaG91cnMiLCB0IC8gMiwgKHQgJiAxKSA/ICc1JyA6ICcwJyk7CisJfQorCWlmIChzdGFuZGJ5ID09IDI1MykKKwkJcHJpbnRmKCJ2ZW5kb3Itc3BlY2lmaWMiKTsKKwlpZiAoc3RhbmRieSA9PSAyNTQpCisJCXByaW50ZigicmVzZXJ2ZWQiKTsKKwlwcmludGYoIilcbiIpOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCB4ZmVybW9kZV92YWxbXSBBTElHTjEgPSB7CisJIDgsICAgICAgOSwgICAgIDEwLCAgICAgMTEsICAgICAxMiwgICAgIDEzLCAgICAgMTQsICAgICAxNSwKKwkxNiwgICAgIDE3LCAgICAgMTgsICAgICAxOSwgICAgIDIwLCAgICAgMjEsICAgICAyMiwgICAgIDIzLAorCTMyLCAgICAgMzMsICAgICAzNCwgICAgIDM1LCAgICAgMzYsICAgICAzNywgICAgIDM4LCAgICAgMzksCisJNjQsICAgICA2NSwgICAgIDY2LCAgICAgNjcsICAgICA2OCwgICAgIDY5LCAgICAgNzAsICAgICA3MQorfTsKKy8qIE5COiB3ZSBzYXZlIHNpemUgYnkgX25vdF8gc3RvcmluZyB0ZXJuaW5hdGluZyBOVUwhICovCitzdGF0aWMgY29uc3QgY2hhciB4ZmVybW9kZV9uYW1lW11bNV0gQUxJR04xID0geworCSJwaW8wIiwgInBpbzEiLCAicGlvMiIsICJwaW8zIiwgInBpbzQiLCAicGlvNSIsICJwaW82IiwgInBpbzciLAorCSJzZG1hMCIsInNkbWExIiwic2RtYTIiLCJzZG1hMyIsInNkbWE0Iiwic2RtYTUiLCJzZG1hNiIsInNkbWE3IiwKKwkibWRtYTAiLCJtZG1hMSIsIm1kbWEyIiwibWRtYTMiLCJtZG1hNCIsIm1kbWE1IiwibWRtYTYiLCJtZG1hNyIsCisJInVkbWEwIiwidWRtYTEiLCJ1ZG1hMiIsInVkbWEzIiwidWRtYTQiLCJ1ZG1hNSIsInVkbWE2IiwidWRtYTciCit9OworCitzdGF0aWMgaW50IHRyYW5zbGF0ZV94ZmVybW9kZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCB2YWw7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHhmZXJtb2RlX3ZhbCk7IGkrKykgeworCQlpZiAoIXN0cm5jbXAobmFtZSwgeGZlcm1vZGVfbmFtZVtpXSwgNSkpCisJCQlpZiAoc3RybGVuKG5hbWUpIDw9IDUpCisJCQkJcmV0dXJuIHhmZXJtb2RlX3ZhbFtpXTsKKwl9CisJLyogTmVnYXRpdmUgbnVtYmVycyBhcmUgaW52YWxpZCBhbmQgYXJlIGNhdWdodCBsYXRlciAqLworCXZhbCA9IGJiX3N0cnRvaShuYW1lLCBOVUxMLCAxMCk7CisJaWYgKCFlcnJubykKKwkJcmV0dXJuIHZhbDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGludGVycHJldF94ZmVybW9kZSh1bnNpZ25lZCB4ZmVybW9kZSkKK3sKKwlwcmludGYoIiAoIik7CisJaWYgKHhmZXJtb2RlID09IDApCisJCXByaW50ZigiZGVmYXVsdCBQSU8gbW9kZSIpOworCWVsc2UgaWYgKHhmZXJtb2RlID09IDEpCisJCXByaW50ZigiZGVmYXVsdCBQSU8gbW9kZSwgZGlzYWJsZSBJT1JEWSIpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDggJiYgeGZlcm1vZGUgPD0gMTUpCisJCXByaW50ZigiUElPIGZsb3cgY29udHJvbCBtb2RlJXUiLCB4ZmVybW9kZSAtIDgpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDE2ICYmIHhmZXJtb2RlIDw9IDIzKQorCQlwcmludGYoInNpbmdsZXdvcmQgRE1BIG1vZGUldSIsIHhmZXJtb2RlIC0gMTYpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDMyICYmIHhmZXJtb2RlIDw9IDM5KQorCQlwcmludGYoIm11bHRpd29yZCBETUEgbW9kZSV1IiwgeGZlcm1vZGUgLSAzMik7CisJZWxzZSBpZiAoeGZlcm1vZGUgPj0gNjQgJiYgeGZlcm1vZGUgPD0gNzEpCisJCXByaW50ZigiVWx0cmFETUEgbW9kZSV1IiwgeGZlcm1vZGUgLSA2NCk7CisJZWxzZQorCQlwcmludGYoInVua25vd24iKTsKKwlwcmludGYoIilcbiIpOworfQorI2VuZGlmIC8qIEhESU9fRFJJVkVfQ01EICovCisKK3N0YXRpYyB2b2lkIHByaW50X2ZsYWcoaW50IGZsYWcsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJaWYgKGZsYWcpCisJCXByaW50ZigiIHNldHRpbmcgJXMgdG8gJWxkXG4iLCBzLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZGV2KGNoYXIgKmRldm5hbWUpCit7CisJLyppbnQgZmQ7Ki8KKwlsb25nIHBhcm0sIG11bHRjb3VudDsKKyNpZm5kZWYgSERJT19EUklWRV9DTUQKKwlpbnQgZm9yY2Vfb3BlcmF0aW9uID0gMDsKKyNlbmRpZgorCS8qIFBsZWFzZSByZXN0b3JlIGFyZ3Nbbl0gdG8gdGhlc2UgdmFsdWVzIGFmdGVyIGVhY2ggaW9jdGwKKwkgICBleGNlcHQgZm9yIGFyZ3NbMl0gKi8KKwl1bnNpZ25lZCBjaGFyIGFyZ3NbNF0gPSB7IFdJTl9TRVRGRUFUVVJFUywgMCwgMCwgMCB9OworCWNvbnN0IGNoYXIgKmZtdCA9ICIgJXNcdD0gJTJsZCI7CisKKwkvKmZkID0geG9wZW5fbm9uYmxvY2tpbmcoZGV2bmFtZSk7Ki8KKwl4bW92ZV9mZCh4b3Blbl9ub25ibG9ja2luZyhkZXZuYW1lKSwgZmQpOworCXByaW50ZigiXG4lczpcbiIsIGRldm5hbWUpOworCisJaWYgKGdldHNldF9yZWFkYWhlYWQgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoZ2V0c2V0X3JlYWRhaGVhZCwgImZzIHJlYWRhaGVhZCIsIFhyZWFkYWhlYWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtSQVNFVCwgKGludCAqKVhyZWFkYWhlYWQpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYKKwlpZiAodW5yZWdpc3Rlcl9od2lmKSB7CisJCXByaW50ZigiIGF0dGVtcHRpbmcgdG8gdW5yZWdpc3RlciBod2lmIyVsdVxuIiwgaHdpZik7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fVU5SRUdJU1RFUl9IV0lGLCAoaW50ICopKHVuc2lnbmVkIGxvbmcpaHdpZik7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJaWYgKHNjYW5faHdpZiA9PSBJU19TRVQpIHsKKwkJcHJpbnRmKCIgYXR0ZW1wdGluZyB0byBzY2FuIGh3aWYgKDB4JWx4LCAweCVseCwgJWx1KVxuIiwgaHdpZl9kYXRhLCBod2lmX2N0cmwsIGh3aWZfaXJxKTsKKwkJYXJnc1swXSA9IGh3aWZfZGF0YTsKKwkJYXJnc1sxXSA9IGh3aWZfY3RybDsKKwkJYXJnc1syXSA9IGh3aWZfaXJxOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NDQU5fSFdJRiwgYXJncyk7CisJCWFyZ3NbMF0gPSBXSU5fU0VURkVBVFVSRVM7CisJCWFyZ3NbMV0gPSAwOworCX0KKyNlbmRpZgorCWlmIChzZXRfcGlvbW9kZSkgeworCQlpZiAobm9pc3lfcGlvbW9kZSkgeworCQkJcHJpbnRmKCIgYXR0ZW1wdGluZyB0byAiKTsKKwkJCWlmIChwaW9tb2RlID09IDI1NSkKKwkJCQlwcmludGYoImF1dG8tdHVuZSBQSU8gbW9kZVxuIik7CisJCQllbHNlIGlmIChwaW9tb2RlIDwgMTAwKQorCQkJCXByaW50Zigic2V0IFBJTyBtb2RlIHRvICVkXG4iLCBwaW9tb2RlKTsKKwkJCWVsc2UgaWYgKHBpb21vZGUgPCAyMDApCisJCQkJcHJpbnRmKCJzZXQgTURNQSBtb2RlIHRvICVkXG4iLCAocGlvbW9kZS0xMDApKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoInNldCBVRE1BIG1vZGUgdG8gJWRcbiIsIChwaW9tb2RlLTIwMCkpOworCQl9CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX1BJT19NT0RFLCAoaW50ICopKHVuc2lnbmVkIGxvbmcpcGlvbW9kZSk7CisJfQorCWlmIChnZXRzZXRfaW8zMmJpdCA9PSBJU19TRVQpIHsKKwkJcHJpbnRfZmxhZyhnZXRzZXRfaW8zMmJpdCwgIjMyLWJpdCBJT19zdXBwb3J0IGZsYWciLCBpbzMyYml0KTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfMzJCSVQsIChpbnQgKilpbzMyYml0KTsKKwl9CisJaWYgKGdldHNldF9tdWx0ID09IElTX1NFVCkgeworCQlwcmludF9mbGFnKGdldHNldF9tdWx0LCAibXVsdGNvdW50IiwgbXVsdCk7CisjaWZkZWYgSERJT19EUklWRV9DTUQKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfTVVMVENPVU5ULCAodm9pZCAqKW11bHQpOworI2Vsc2UKKwkJZm9yY2Vfb3BlcmF0aW9uIHw9ICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfTVVMVENPVU5ULCAodm9pZCAqKW11bHQpKTsKKyNlbmRpZgorCX0KKwlpZiAoZ2V0c2V0X3JlYWRvbmx5ID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfcmVhZG9ubHksICJyZWFkb25seSIsIHJlYWRvbmx5KTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgQkxLUk9TRVQsICZyZWFkb25seSk7CisJfQorCWlmIChnZXRzZXRfdW5tYXNrID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfdW5tYXNrLCAidW5tYXNraXJxIiwgdW5tYXNrKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfVU5NQVNLSU5UUiwgKGludCAqKXVubWFzayk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlpZiAoZ2V0c2V0X2RtYSA9PSBJU19TRVQpIHsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2RtYSwgInVzaW5nX2RtYSIsIGRtYSk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX0RNQSwgKGludCAqKWRtYSk7CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSAqLworI2lmZGVmIEhESU9fU0VUX1FETUEKKwlpZiAoZ2V0c2V0X2RtYV9xID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfZG1hX3EsICJETUEgcXVldWVfZGVwdGgiLCBkbWFfcSk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX1FETUEsIChpbnQgKilkbWFfcSk7CisJfQorI2VuZGlmCisJaWYgKGdldHNldF9ub3dlcnIgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9ub3dlcnIsICJub3dlcnIiLCBub3dlcnIpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9OT1dFUlIsIChpbnQgKilub3dlcnIpOworCX0KKwlpZiAoZ2V0c2V0X2tlZXAgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9rZWVwLCAia2VlcF9zZXR0aW5ncyIsIGtlZXApOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9LRUVQU0VUVElOR1MsIChpbnQgKilrZWVwKTsKKwl9CisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlpZiAoZ2V0c2V0X2Rvb3Jsb2NrID09IElTX1NFVCkgeworCQlhcmdzWzBdID0gZG9vcmxvY2sgPyBXSU5fRE9PUkxPQ0sgOiBXSU5fRE9PUlVOTE9DSzsKKwkJYXJnc1syXSA9IDA7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9kb29ybG9jaywgImRyaXZlIGRvb3Jsb2NrIiwgZG9vcmxvY2spOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzBdID0gV0lOX1NFVEZFQVRVUkVTOworCX0KKwlpZiAoZ2V0c2V0X2RrZWVwID09IElTX1NFVCkgeworCQkvKiBsb2NrL3VubG9jayB0aGUgZHJpdmUncyAiZmVhdHVyZSIgc2V0dGluZ3MgKi8KKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2RrZWVwLCAiZHJpdmUga2VlcCBmZWF0dXJlcyIsIGRrZWVwKTsKKwkJYXJnc1syXSA9IGRrZWVwID8gMHg2NiA6IDB4Y2M7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJfQorCWlmIChnZXRzZXRfZGVmZWN0cyA9PSBJU19TRVQpIHsKKwkJYXJnc1syXSA9IGRlZmVjdHMgPyAweDA0IDogMHg4NDsKKwkJcHJpbnRfZmxhZyhnZXRzZXRfZGVmZWN0cywgImRyaXZlIGRlZmVjdC1tZ210IiwgZGVmZWN0cyk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJfQorCWlmIChnZXRzZXRfcHJlZmV0Y2ggPT0gSVNfU0VUKSB7CisJCWFyZ3NbMV0gPSBwcmVmZXRjaDsKKwkJYXJnc1syXSA9IDB4YWI7CisJCXByaW50X2ZsYWcoZ2V0c2V0X3ByZWZldGNoLCAiZHJpdmUgcHJlZmV0Y2giLCBwcmVmZXRjaCk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJCWFyZ3NbMV0gPSAwOworCX0KKwlpZiAoc2V0X3hmZXJtb2RlKSB7CisJCWFyZ3NbMV0gPSB4ZmVybW9kZV9yZXF1ZXN0ZWQ7CisJCWFyZ3NbMl0gPSAzOworCQlwcmludF9mbGFnKDEsICJ4ZmVybW9kZSIsIHhmZXJtb2RlX3JlcXVlc3RlZCk7CisJCWludGVycHJldF94ZmVybW9kZSh4ZmVybW9kZV9yZXF1ZXN0ZWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzFdID0gMDsKKwl9CisJaWYgKGdldHNldF9sb29rYWhlYWQgPT0gSVNfU0VUKSB7CisJCWFyZ3NbMl0gPSBsb29rYWhlYWQgPyAweGFhIDogMHg1NTsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2xvb2thaGVhZCwgImRyaXZlIHJlYWQtbG9va2FoZWFkIiwgbG9va2FoZWFkKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwl9CisJaWYgKGdldHNldF9hcG1tb2RlID09IElTX1NFVCkgeworCQkvKiBmZWF0dXJlIHJlZ2lzdGVyICovCisJCWFyZ3NbMl0gPSAoYXBtbW9kZSA9PSAyNTUpID8gMHg4NSAvKiBkaXNhYmxlICovIDogMHgwNSAvKiBzZXQgKi87CisJCWFyZ3NbMV0gPSBhcG1tb2RlOyAvKiBzZWN0b3IgY291bnQgcmVnaXN0ZXIgMS0yNTUgKi8KKwkJcHJpbnRmKCIgc2V0dGluZyBBUE0gbGV2ZWwgdG8gJXMgMHglMDJsWCAoJWxkKVxuIiwKKwkJCShhcG1tb2RlID09IDI1NSkgPyAiZGlzYWJsZWQiIDogIiIsCisJCQlhcG1tb2RlLCBhcG1tb2RlKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwkJYXJnc1sxXSA9IDA7CisJfQorCWlmIChnZXRzZXRfd2NhY2hlID09IElTX1NFVCkgeworI2lmZGVmIERPX0ZMVVNIQ0FDSEUKKyNpZm5kZWYgV0lOX0ZMVVNIQ0FDSEUKKyNkZWZpbmUgV0lOX0ZMVVNIQ0FDSEUgMHhlNworI2VuZGlmCisjZW5kaWYgLyogRE9fRkxVU0hDQUNIRSAqLworCQlhcmdzWzJdID0gd2NhY2hlID8gMHgwMiA6IDB4ODI7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF93Y2FjaGUsICJkcml2ZSB3cml0ZS1jYWNoaW5nIiwgd2NhY2hlKTsKKyNpZmRlZiBET19GTFVTSENBQ0hFCisJCWlmICghd2NhY2hlKQorCQkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZmbHVzaGNhY2hlKTsKKyNlbmRpZiAvKiBET19GTFVTSENBQ0hFICovCisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisjaWZkZWYgRE9fRkxVU0hDQUNIRQorCQlpZiAoIXdjYWNoZSkKKwkJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmZmx1c2hjYWNoZSk7CisjZW5kaWYgLyogRE9fRkxVU0hDQUNIRSAqLworCX0KKworCS8qIEluIGNvZGUgYmVsb3csIHdlIGRvIG5vdCBwcmVzZXJ2ZSBhcmdzWzBdLCBidXQgdGhlIHJlc3QKKwkgICBpcyBwcmVzZXJ2ZWQsIGluY2x1ZGluZyBhcmdzWzJdICovCisJYXJnc1syXSA9IDA7CisKKwlpZiAoc2V0X3N0YW5kYnlub3cpIHsKKyNpZm5kZWYgV0lOX1NUQU5EQllOT1cxCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMSAweEUwCisjZW5kaWYKKyNpZm5kZWYgV0lOX1NUQU5EQllOT1cyCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMiAweDk0CisjZW5kaWYKKwkJcHJpbnRmKCIgaXNzdWluZyBzdGFuZGJ5IGNvbW1hbmRcbiIpOworCQlhcmdzWzBdID0gV0lOX1NUQU5EQllOT1cxOworCQlpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJncywgV0lOX1NUQU5EQllOT1cyKTsKKwl9CisJaWYgKHNldF9zbGVlcG5vdykgeworI2lmbmRlZiBXSU5fU0xFRVBOT1cxCisjZGVmaW5lIFdJTl9TTEVFUE5PVzEgMHhFNgorI2VuZGlmCisjaWZuZGVmIFdJTl9TTEVFUE5PVzIKKyNkZWZpbmUgV0lOX1NMRUVQTk9XMiAweDk5CisjZW5kaWYKKwkJcHJpbnRmKCIgaXNzdWluZyBzbGVlcCBjb21tYW5kXG4iKTsKKwkJYXJnc1swXSA9IFdJTl9TTEVFUE5PVzE7CisJCWlvY3RsX2FsdF9vcl93YXJuKEhESU9fRFJJVkVfQ01ELCBhcmdzLCBXSU5fU0xFRVBOT1cyKTsKKwl9CisJaWYgKHNldF9zZWFnYXRlKSB7CisJCWFyZ3NbMF0gPSAweGZiOworCQlwcmludGYoIiBkaXNhYmxpbmcgU2VhZ2F0ZSBhdXRvIHBvd2Vyc2F2aW5nIG1vZGVcbiIpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCX0KKwlpZiAoZ2V0c2V0X3N0YW5kYnkgPT0gSVNfU0VUKSB7CisJCWFyZ3NbMF0gPSBXSU5fU0VUSURMRTE7CisJCWFyZ3NbMV0gPSBzdGFuZGJ5X3JlcXVlc3RlZDsKKwkJcHJpbnRfZmxhZygxLCAic3RhbmRieSIsIHN0YW5kYnlfcmVxdWVzdGVkKTsKKwkJaW50ZXJwcmV0X3N0YW5kYnkoc3RhbmRieV9yZXF1ZXN0ZWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzFdID0gMDsKKwl9CisjZWxzZQkvKiBIRElPX0RSSVZFX0NNRCAqLworCWlmIChmb3JjZV9vcGVyYXRpb24pIHsKKwkJY2hhciBidWZbNTEyXTsKKwkJZmx1c2hfYnVmZmVyX2NhY2hlKCk7CisJCWlmICgtMSA9PSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkKKwkJCWJiX3BlcnJvcl9tc2coInJlYWQgb2YgNTEyIGJ5dGVzIGZhaWxlZCIpOworCX0KKyNlbmRpZiAgLyogSERJT19EUklWRV9DTUQgKi8KKwlpZiAoZ2V0c2V0X211bHQgfHwgZ2V0X2lkZW50aXR5KSB7CisJCW11bHRjb3VudCA9IC0xOworCQlpZiAoaW9jdGwoZmQsIEhESU9fR0VUX01VTFRDT1VOVCwgJm11bHRjb3VudCkpIHsKKwkJCS8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2Fybi4gKi8KKwkJCWlmIChnZXRzZXRfbXVsdCAmJiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUikKKwkJCQliYl9wZXJyb3JfbXNnKCJIRElPX0dFVF9NVUxUQ09VTlQiKTsKKwkJCWVsc2UKKwkJCQliYl9wZXJyb3JfbXNnKCJpb2N0bCAlI3ggZmFpbGVkIiwgSERJT19HRVRfTVVMVENPVU5UKTsKKwkJfSBlbHNlIGlmIChnZXRzZXRfbXVsdCkgeworCQkJcHJpbnRmKGZtdCwgIm11bHRjb3VudCIsIG11bHRjb3VudCk7CisJCQlvbl9vZmYobXVsdGNvdW50ICE9IDApOworCQl9CisJfQorCWlmIChnZXRzZXRfaW8zMmJpdCkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUXzMyQklULCAmcGFybSkpIHsKKwkJCXByaW50ZigiIElPX3N1cHBvcnRcdD0lM2xkICgiLCBwYXJtKTsKKwkJCWlmIChwYXJtID09IDApCisJCQkJcHJpbnRmKCJkZWZhdWx0IDE2LWJpdClcbiIpOworCQkJZWxzZSBpZiAocGFybSA9PSAyKQorCQkJCXByaW50ZigiMTYtYml0KVxuIik7CisJCQllbHNlIGlmIChwYXJtID09IDEpCisJCQkJcHJpbnRmKCIzMi1iaXQpXG4iKTsKKwkJCWVsc2UgaWYgKHBhcm0gPT0gMykKKwkJCQlwcmludGYoIjMyLWJpdCB3L3N5bmMpXG4iKTsKKwkJCWVsc2UgaWYgKHBhcm0gPT0gOCkKKwkJCQlwcmludGYoIlJlcXVlc3QtUXVldWUtQnlwYXNzKVxuIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCJcP1w/XD8pXG4iKTsKKwkJfQorCX0KKwlpZiAoZ2V0c2V0X3VubWFzaykgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX1VOTUFTS0lOVFIsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigidW5tYXNraXJxIiwgcGFybSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEKKwlpZiAoZ2V0c2V0X2RtYSkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX0RNQSwgJnBhcm0pKSB7CisJCQlwcmludGYoZm10LCAidXNpbmdfZG1hIiwgcGFybSk7CisJCQlpZiAocGFybSA9PSA4KQorCQkJCXByaW50ZigiIChETUEtQXNzaXN0ZWQtUElPKVxuIik7CisJCQllbHNlCisJCQkJb25fb2ZmKHBhcm0gIT0gMCk7CisJCX0KKwl9CisjZW5kaWYKKyNpZmRlZiBIRElPX0dFVF9RRE1BCisJaWYgKGdldHNldF9kbWFfcSkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX1FETUEsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigicXVldWVfZGVwdGgiLCBwYXJtKTsKKwl9CisjZW5kaWYKKwlpZiAoZ2V0c2V0X2tlZXApIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVF9LRUVQU0VUVElOR1MsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigia2VlcHNldHRpbmdzIiwgcGFybSk7CisJfQorCWlmIChnZXRzZXRfbm93ZXJyKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRfTk9XRVJSLCAmcGFybSkpCisJCQlwcmludF92YWx1ZV9vbl9vZmYoIm5vd2VyciIsIHBhcm0pOworCX0KKwlpZiAoZ2V0c2V0X3JlYWRvbmx5KSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgQkxLUk9HRVQsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigicmVhZG9ubHkiLCBwYXJtKTsKKwl9CisJaWYgKGdldHNldF9yZWFkYWhlYWQpIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBCTEtSQUdFVCwgJnBhcm0pKQorCQkJcHJpbnRfdmFsdWVfb25fb2ZmKCJyZWFkYWhlYWQiLCBwYXJtKTsKKwl9CisJaWYgKGdldF9nZW9tKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgQkxLR0VUU0laRSwgJnBhcm0pKSB7CisJCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZzsKKworCQkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVEdFTywgJmcpKQorCQkJCXByaW50ZigiIGdlb21ldHJ5XHQ9ICV1LyV1LyV1LCBzZWN0b3JzID0gJWxkLCBzdGFydCA9ICVsZFxuIiwKKwkJCQkJZy5jeWxpbmRlcnMsIGcuaGVhZHMsIGcuc2VjdG9ycywgcGFybSwgZy5zdGFydCk7CisJCX0KKwl9CisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlpZiAoZ2V0X3Bvd2VybW9kZSkgeworI2lmbmRlZiBXSU5fQ0hFQ0tQT1dFUk1PREUxCisjZGVmaW5lIFdJTl9DSEVDS1BPV0VSTU9ERTEgMHhFNQorI2VuZGlmCisjaWZuZGVmIFdJTl9DSEVDS1BPV0VSTU9ERTIKKyNkZWZpbmUgV0lOX0NIRUNLUE9XRVJNT0RFMiAweDk4CisjZW5kaWYKKwkJY29uc3QgY2hhciAqc3RhdGU7CisKKwkJYXJnc1swXSA9IFdJTl9DSEVDS1BPV0VSTU9ERTE7CisJCWlmIChpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJncywgV0lOX0NIRUNLUE9XRVJNT0RFMikpIHsKKwkJCWlmIChlcnJubyAhPSBFSU8gfHwgYXJnc1swXSAhPSAwIHx8IGFyZ3NbMV0gIT0gMCkKKwkJCQlzdGF0ZSA9ICJ1bmtub3duIjsKKwkJCWVsc2UKKwkJCQlzdGF0ZSA9ICJzbGVlcGluZyI7CisJCX0gZWxzZQorCQkJc3RhdGUgPSAoYXJnc1syXSA9PSAyNTUpID8gImFjdGl2ZS9pZGxlIiA6ICJzdGFuZGJ5IjsKKwkJYXJnc1sxXSA9IGFyZ3NbMl0gPSAwOworCisJCXByaW50ZigiIGRyaXZlIHN0YXRlIGlzOiAgJXNcbiIsIHN0YXRlKTsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVAorCWlmIChwZXJmb3JtX3Jlc2V0KSB7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfUkVTRVQsIE5VTEwpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWlmIChwZXJmb3JtX3RyaXN0YXRlKSB7CisJCWFyZ3NbMF0gPSAwOworCQlhcmdzWzFdID0gdHJpc3RhdGU7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fVFJJU1RBVEVfSFdJRiwgJmFyZ3MpOworCX0KKyNlbmRpZiAvKiBGRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZCisJaWYgKGdldF9pZGVudGl0eSkgeworCQlzdHJ1Y3QgaGRfZHJpdmVpZCBpZDsKKworCQlpZiAoIWlvY3RsKGZkLCBIRElPX0dFVF9JREVOVElUWSwgJmlkKSkJeworCQkJaWYgKG11bHRjb3VudCAhPSAtMSkgeworCQkJCWlkLm11bHRzZWN0ID0gbXVsdGNvdW50OworCQkJCWlkLm11bHRzZWN0X3ZhbGlkIHw9IDE7CisJCQl9IGVsc2UKKwkJCQlpZC5tdWx0c2VjdF92YWxpZCAmPSB+MTsKKwkJCWR1bXBfaWRlbnRpdHkoJmlkKTsKKwkJfSBlbHNlIGlmIChlcnJubyA9PSAtRU5PTVNHKQorCQkJcHJpbnRmKCIgbm8gaWRlbnRpZmljYXRpb24gaW5mbyBhdmFpbGFibGVcbiIpOworCQllbHNlIGlmIChFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUikgIC8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2FybiAqLworCQkJYmJfcGVycm9yX21zZygiSERJT19HRVRfSURFTlRJVFkiKTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIEhESU9fR0VUX0lERU5USVRZKTsKKwl9CisKKwlpZiAoZ2V0X0lEZW50aXR5KSB7CisJCXVuc2lnbmVkIGNoYXIgYXJnczFbNCs1MTJdOyAvKiA9IHsgLi4uIH0gd2lsbCBlYXQgMC41ayBvZiByb2RhdGEhICovCisKKwkJbWVtc2V0KGFyZ3MxLCAwLCBzaXplb2YoYXJnczEpKTsKKwkJYXJnczFbMF0gPSBXSU5fSURFTlRJRlk7CisJCWFyZ3MxWzNdID0gMTsKKwkJaWYgKCFpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJnczEsIFdJTl9QSURFTlRJRlkpKQorCQkJaWRlbnRpZnkoKHZvaWQgKikoYXJnczEgKyA0KSk7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWlmIChnZXRzZXRfYnVzc3RhdGUgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoMSwgImJ1cyBzdGF0ZSIsIGJ1c3N0YXRlKTsKKwkJYnVzX3N0YXRlX3ZhbHVlKGJ1c3N0YXRlKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfQlVTU1RBVEUsIChpbnQgKikodW5zaWduZWQgbG9uZylidXNzdGF0ZSk7CisJfQorCWlmIChnZXRzZXRfYnVzc3RhdGUpIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVF9CVVNTVEFURSwgJnBhcm0pKSB7CisJCQlwcmludGYoZm10LCAiYnVzIHN0YXRlIiwgcGFybSk7CisJCQlidXNfc3RhdGVfdmFsdWUocGFybSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAocmVyZWFkX3BhcnRuKQorCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtSUlBBUlQsIE5VTEwpOworCisJaWYgKGRvX2N0aW1pbmdzKQorCQlkb190aW1lKDEgLyosZmQqLyk7IC8qIHRpbWUgY2FjaGUgKi8KKwlpZiAoZG9fdGltaW5ncykKKwkJZG9fdGltZSgwIC8qLGZkKi8pOyAvKiB0aW1lIGRldmljZSAqLworCWlmIChkb19mbHVzaCkKKwkJZmx1c2hfYnVmZmVyX2NhY2hlKCk7CisJY2xvc2UoZmQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWQorc3RhdGljIGludCBmcm9taGV4KHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXNkaWdpdChjKSkKKwkJcmV0dXJuIChjIC0gJzAnKTsKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCXJldHVybiAoYyAtICgnYScgLSAxMCkpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2hhcjogJyVjJyAweCUwMngiLCBjLCBjKTsKK30KKworc3RhdGljIHZvaWQgaWRlbnRpZnlfZnJvbV9zdGRpbih2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGlkZW50aWZ5X2Zyb21fc3RkaW4odm9pZCkKK3sKKwl1aW50MTZfdCBzYnVmWzI1Nl07CisJdW5zaWduZWQgY2hhciBidWZbMTI4MF07CisJdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCWludCBpOworCisJeHJlYWQoU1RESU5fRklMRU5PLCBidWYsIDEyODApOworCisJLy8gQ29udmVydCB0aGUgbmV3bGluZS1zZXBhcmF0ZWQgaGV4IGRhdGEgaW50byBhbiBpZGVudGlmeSBibG9jay4KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCXNidWZbaV0gPSAoc2J1ZltpXSA8PCA0KSArIGZyb21oZXgoKihiKyspKTsKKwl9CisKKwkvLyBQYXJzZSB0aGUgZGF0YS4KKworCWlkZW50aWZ5KHNidWYpOworfQorI2Vsc2UKK3ZvaWQgaWRlbnRpZnlfZnJvbV9zdGRpbih2b2lkKTsKKyNlbmRpZgorCisvKiBidXN5Ym94IHNwZWNpZmljIHN0dWZmICovCitzdGF0aWMgaW50IHBhcnNlX29wdHModW5zaWduZWQgbG9uZyAqdmFsdWUsIGludCBtaW4sIGludCBtYXgpCit7CisJaWYgKG9wdGFyZykgeworCQkqdmFsdWUgPSB4YXRvbF9yYW5nZShvcHRhcmcsIG1pbiwgbWF4KTsKKwkJcmV0dXJuIElTX1NFVDsKKwl9CisJcmV0dXJuIElTX0dFVDsKK30KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0c18wX21heCh1bnNpZ25lZCBsb25nICp2YWx1ZSwgaW50IG1heCkKK3sKKwlyZXR1cm4gcGFyc2Vfb3B0cyh2YWx1ZSwgMCwgbWF4KTsKK30KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0c18wXzEodW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisJcmV0dXJuIHBhcnNlX29wdHModmFsdWUsIDAsIDEpOworfQorc3RhdGljIGludCBwYXJzZV9vcHRzXzBfSU5UTUFYKHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCXJldHVybiBwYXJzZV9vcHRzKHZhbHVlLCAwLCBJTlRfTUFYKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfeGZlcm1vZGUoaW50IGZsYWcsIHNtYWxsaW50ICpnZXQsIHNtYWxsaW50ICpzZXQsIGludCAqdmFsdWUpCit7CisJaWYgKGZsYWcpIHsKKwkJKmdldCA9IElTX0dFVDsKKwkJaWYgKG9wdGFyZykgeworCQkJKnZhbHVlID0gdHJhbnNsYXRlX3hmZXJtb2RlKG9wdGFyZyk7CisJCQkqc2V0ID0gKCp2YWx1ZSA+IC0xKTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tIGdldG9wdCBzaG9ydCBvcHRpb25zIC0tLS0tLS0tKi8KK3N0YXRpYyBjb25zdCBjaGFyIGhkcGFybV9vcHRpb25zW10gQUxJR04xID0KKwkiZ2Z1OjpuOjpwOnI6Om06OmM6Oms6OmE6OkI6dFQiCisJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKCJpSSIpCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKCJkOjoiKQorI2lmZGVmIEhESU9fRFJJVkVfQ01ECisJIlM6RDpQOlg6SzpBOkw6VzpDeVl6WiIKKyNlbmRpZgorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGKCJVOiIpCisjaWZkZWYgSERJT19HRVRfUURNQQorI2lmZGVmIEhESU9fU0VUX1FETUEKKwkiUToiCisjZWxzZQorCSJRIgorI2VuZGlmCisjZW5kaWYKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUKCJ3IikKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYoIng6OmI6IikKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRigiUjoiKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG91ciBtYWluKCkgcm91dGluZTogKi8KK2ludCBoZHBhcm1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhkcGFybV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKwlpbnQgZmxhZ2NvdW50ID0gMDsKKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCBoZHBhcm1fb3B0aW9ucykpID49IDApIHsKKwkJZmxhZ2NvdW50Kys7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWShnZXRfSURlbnRpdHkgfD0gKGMgPT0gJ0knKSk7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWShnZXRfaWRlbnRpdHkgfD0gKGMgPT0gJ2knKSk7CisJCWdldF9nZW9tIHw9IChjID09ICdnJyk7CisJCWRvX2ZsdXNoIHw9IChjID09ICdmJyk7CisJCWlmIChjID09ICd1JykgZ2V0c2V0X3VubWFzayAgICA9IHBhcnNlX29wdHNfMF8xKCZ1bm1hc2spOworCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSgKKwkJaWYgKGMgPT0gJ2QnKSBnZXRzZXRfZG1hICAgICAgID0gcGFyc2Vfb3B0c18wX21heCgmZG1hLCA5KTsKKwkpCisJCWlmIChjID09ICduJykgZ2V0c2V0X25vd2VyciAgICA9IHBhcnNlX29wdHNfMF8xKCZub3dlcnIpOworCQlwYXJzZV94ZmVybW9kZSgoYyA9PSAncCcpLCAmbm9pc3lfcGlvbW9kZSwgJnNldF9waW9tb2RlLCAmcGlvbW9kZSk7CisJCWlmIChjID09ICdyJykgZ2V0c2V0X3JlYWRvbmx5ICA9IHBhcnNlX29wdHNfMF8xKCZyZWFkb25seSk7CisJCWlmIChjID09ICdtJykgZ2V0c2V0X211bHQgICAgICA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJm11bHQgLyozMiovKTsKKwkJaWYgKGMgPT0gJ2MnKSBnZXRzZXRfaW8zMmJpdCAgID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmaW8zMmJpdCAvKjgqLyk7CisJCWlmIChjID09ICdrJykgZ2V0c2V0X2tlZXAgICAgICA9IHBhcnNlX29wdHNfMF8xKCZrZWVwKTsKKwkJaWYgKGMgPT0gJ2EnKSBnZXRzZXRfcmVhZGFoZWFkID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmWHJlYWRhaGVhZCk7CisJCWlmIChjID09ICdCJykgZ2V0c2V0X2FwbW1vZGUgICA9IHBhcnNlX29wdHMoJmFwbW1vZGUsIDEsIDI1NSk7CisJCWRvX2ZsdXNoIHw9IGRvX3RpbWluZ3MgfD0gKGMgPT0gJ3QnKTsKKwkJZG9fZmx1c2ggfD0gZG9fY3RpbWluZ3MgfD0gKGMgPT0gJ1QnKTsKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCQlpZiAoYyA9PSAnUycpIGdldHNldF9zdGFuZGJ5ICA9IHBhcnNlX29wdHNfMF9tYXgoJnN0YW5kYnlfcmVxdWVzdGVkLCAyNTUpOworCQlpZiAoYyA9PSAnRCcpIGdldHNldF9kZWZlY3RzICA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJmRlZmVjdHMpOworCQlpZiAoYyA9PSAnUCcpIGdldHNldF9wcmVmZXRjaCA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJnByZWZldGNoKTsKKwkJcGFyc2VfeGZlcm1vZGUoKGMgPT0gJ1gnKSwgJmdldF94ZmVybW9kZSwgJnNldF94ZmVybW9kZSwgJnhmZXJtb2RlX3JlcXVlc3RlZCk7CisJCWlmIChjID09ICdLJykgZ2V0c2V0X2RrZWVwICAgICA9IHBhcnNlX29wdHNfMF8xKCZwcmVmZXRjaCk7CisJCWlmIChjID09ICdBJykgZ2V0c2V0X2xvb2thaGVhZCA9IHBhcnNlX29wdHNfMF8xKCZsb29rYWhlYWQpOworCQlpZiAoYyA9PSAnTCcpIGdldHNldF9kb29ybG9jayAgPSBwYXJzZV9vcHRzXzBfMSgmZG9vcmxvY2spOworCQlpZiAoYyA9PSAnVycpIGdldHNldF93Y2FjaGUgICAgPSBwYXJzZV9vcHRzXzBfMSgmd2NhY2hlKTsKKwkJZ2V0X3Bvd2VybW9kZSB8PSAoYyA9PSAnQycpOworCQlzZXRfc3RhbmRieW5vdyB8PSAoYyA9PSAneScpOworCQlzZXRfc2xlZXBub3cgfD0gKGMgPT0gJ1knKTsKKwkJcmVyZWFkX3BhcnRuIHw9IChjID09ICd6Jyk7CisJCXNldF9zZWFnYXRlIHw9IChjID09ICdaJyk7CisjZW5kaWYKKwkJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYoaWYgKGMgPT0gJ1UnKSB1bnJlZ2lzdGVyX2h3aWYgPSBwYXJzZV9vcHRzXzBfSU5UTUFYKCZod2lmKSk7CisjaWZkZWYgSERJT19HRVRfUURNQQorCQlpZiAoYyA9PSAnUScpIHsKKwkJCWdldHNldF9kbWFfcSA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJmRtYV9xKTsKKwkJfQorI2VuZGlmCisJCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQocGVyZm9ybV9yZXNldCA9IChjID09ICdyJykpOworCQlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYoaWYgKGMgPT0gJ3gnKSBwZXJmb3JtX3RyaXN0YXRlID0gcGFyc2Vfb3B0c18wXzEoJnRyaXN0YXRlKSk7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRihpZiAoYyA9PSAnYicpIGdldHNldF9idXNzdGF0ZSA9IHBhcnNlX29wdHNfMF9tYXgoJmJ1c3N0YXRlLCAyKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJCWlmIChjID09ICdSJykgeworCQkJc2Nhbl9od2lmID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmaHdpZl9kYXRhKTsKKwkJCWh3aWZfY3RybCA9IHhhdG9pX3Bvc2l0aXZlKChhcmd2W29wdGluZF0pID8gYXJndltvcHRpbmRdIDogIiIpOworCQkJaHdpZl9pcnEgID0geGF0b2lfcG9zaXRpdmUoKGFyZ3Zbb3B0aW5kKzFdKSA/IGFyZ3Zbb3B0aW5kKzFdIDogIiIpOworCQkJLyogTW92ZSBwYXN0IHRoZSAyIGFkZGl0aW9uYWwgYXJndW1lbnRzICovCisJCQlhcmd2ICs9IDI7CisJCQlhcmdjIC09IDI7CisJCX0KKyNlbmRpZgorCX0KKwkvKiBXaGVuIG5vIGZsYWdzIGFyZSBnaXZlbiAoZmxhZ2NvdW50ID0gMCksIC1hY2Rna21ucnUgaXMgYXNzdW1lZC4gKi8KKwlpZiAoIWZsYWdjb3VudCkgeworCQlnZXRzZXRfbXVsdCA9IGdldHNldF9pbzMyYml0ID0gZ2V0c2V0X3VubWFzayA9IGdldHNldF9rZWVwID0gZ2V0c2V0X3JlYWRvbmx5ID0gZ2V0c2V0X3JlYWRhaGVhZCA9IGdldF9nZW9tID0gSVNfR0VUOworCQlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUEoZ2V0c2V0X2RtYSA9IElTX0dFVCk7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWSAmJiAhaXNhdHR5KFNURElOX0ZJTEVOTykpCisJCQlpZGVudGlmeV9mcm9tX3N0ZGluKCk7IC8qIEVYSVQgKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWRvIHsKKwkJcHJvY2Vzc19kZXYoKmFyZ3YrKyk7CisJfSB3aGlsZSAoKmFyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9pbm90aWZ5ZC5jIGIvbWlzY3V0aWxzL2lub3RpZnlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0ZTBhYgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9pbm90aWZ5ZC5jCkBAIC0wLDAgKzEsMjAzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzaW1wbGUgaW5vdGlmeSBkYWVtb24KKyAqIHJlcG9ydHMgZmlsZXN5c3RlbSBjaGFuZ2VzIHZpYSB1c2Vyc3BhY2UgYWdlbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFVzZSBhcyBmb2xsb3dzOgorICogIyBpbm90aWZ5ZCAvdXNlci9zcGFjZS9hZ2VudCBkaXIvb3IvZmlsZS9iZWluZy93YXRjaGVkWzptYXNrXSAuLi4KKyAqCisgKiBXaGVuIGEgZmlsZXN5c3RlbSBldmVudCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG1hc2sgaXMgb2NjdXJlZCBvbiBzcGVjaWZpZWQgZmlsZSAob3IgZGlyZWN0b3J5KQorICogYSB1c2Vyc3BhY2UgYWdlbnQgaXMgc3Bhd25lZCBhbmQgZ2l2ZW4gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICogJDEuIGFjdHVhbCBldmVudChzKQorICogJDIuIGZpbGUgKG9yIGRpcmVjdG9yeSkgbmFtZQorICogJDMuIG5hbWUgb2Ygc3ViZmlsZSAoaWYgYW55KSwgaW4gY2FzZSBvZiB3YXRjaGluZyBhIGRpcmVjdG9yeQorICoKKyAqIEUuZy4gaW5vdGlmeWQgLi9kZXYtd2F0Y2hlciAvZGV2Om4KKyAqCisgKiAuL2Rldi13YXRjaGVyIGNhbiBiZSwgc2F5OgorICogIyEvYmluL3NoCisgKiBlY2hvICJXZSBoYXZlIG5ldyBkZXZpY2UgaW4gaGVyZSEgSGVsbG8sICQzISIKKyAqCisgKiBTZWUgYmVsb3cgZm9yIG1hc2sgbmFtZXMgZXhwbGFuYXRpb24uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlub3RpZnlkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJQUk9HIEZJTEUxWzpNQVNLXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBpbm90aWZ5ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIG9uIGZpbGVzeXN0ZW0gY2hhbmdlcy4iCisvL3VzYWdlOiAgICAgIlxuV2hlbiBhIGZpbGVzeXN0ZW0gZXZlbnQgbWF0Y2hpbmcgTUFTSyBvY2N1cnMgb24gRklMRW4sIgorLy91c2FnZTogICAgICJcblBST0cgQUNUVUFMX0VWRU5UUyBGSUxFbiBbU1VCRklMRV0gaXMgcnVuLiIKKy8vdXNhZ2U6ICAgICAiXG5FdmVudHM6IgorLy91c2FnZTogICAgICJcbglhCUZpbGUgaXMgYWNjZXNzZWQiCisvL3VzYWdlOiAgICAgIlxuCWMJRmlsZSBpcyBtb2RpZmllZCIKKy8vdXNhZ2U6ICAgICAiXG4JZQlNZXRhZGF0YSBjaGFuZ2VkIgorLy91c2FnZTogICAgICJcbgl3CVdyaXRhYmxlIGZpbGUgaXMgY2xvc2VkIgorLy91c2FnZTogICAgICJcbgkwCVVud3JpdGFibGUgZmlsZSBpcyBjbG9zZWQiCisvL3VzYWdlOiAgICAgIlxuCXIJRmlsZSBpcyBvcGVuZWQiCisvL3VzYWdlOiAgICAgIlxuCUQJRmlsZSBpcyBkZWxldGVkIgorLy91c2FnZTogICAgICJcbglNCUZpbGUgaXMgbW92ZWQiCisvL3VzYWdlOiAgICAgIlxuCXUJQmFja2luZyBmcyBpcyB1bm1vdW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCW8JRXZlbnQgcXVldWUgb3ZlcmZsb3dlZCIKKy8vdXNhZ2U6ICAgICAiXG4JeAlGaWxlIGNhbid0IGJlIHdhdGNoZWQgYW55bW9yZSIKKy8vdXNhZ2U6ICAgICAiXG5JZiB3YXRjaGluZyBhIGRpcmVjdG9yeToiCisvL3VzYWdlOiAgICAgIlxuCW0JU3ViZmlsZSBpcyBtb3ZlZCBpbnRvIGRpciIKKy8vdXNhZ2U6ICAgICAiXG4JeQlTdWJmaWxlIGlzIG1vdmVkIG91dCBvZiBkaXIiCisvL3VzYWdlOiAgICAgIlxuCW4JU3ViZmlsZSBpcyBjcmVhdGVkIgorLy91c2FnZTogICAgICJcbglkCVN1YmZpbGUgaXMgZGVsZXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuaW5vdGlmeWQgd2FpdHMgZm9yIFBST0cgdG8gZXhpdC4iCisvL3VzYWdlOiAgICAgIlxuV2hlbiB4IGV2ZW50IGhhcHBlbnMgZm9yIGFsbCBGSUxFcywgaW5vdGlmeWQgZXhpdHMuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvaW5vdGlmeS5oPgorCitzdGF0aWMgY29uc3QgY2hhciBtYXNrX25hbWVzW10gQUxJR04xID0KKwkiYSIJLy8gMHgwMDAwMDAwMQlGaWxlIHdhcyBhY2Nlc3NlZAorCSJjIgkvLyAweDAwMDAwMDAyCUZpbGUgd2FzIG1vZGlmaWVkCisJImUiCS8vIDB4MDAwMDAwMDQJTWV0YWRhdGEgY2hhbmdlZAorCSJ3IgkvLyAweDAwMDAwMDA4CVdyaXRhYmxlIGZpbGUgd2FzIGNsb3NlZAorCSIwIgkvLyAweDAwMDAwMDEwCVVud3JpdGFibGUgZmlsZSBjbG9zZWQKKwkiciIJLy8gMHgwMDAwMDAyMAlGaWxlIHdhcyBvcGVuZWQKKwkibSIJLy8gMHgwMDAwMDA0MAlGaWxlIHdhcyBtb3ZlZCBmcm9tIFgKKwkieSIJLy8gMHgwMDAwMDA4MAlGaWxlIHdhcyBtb3ZlZCB0byBZCisJIm4iCS8vIDB4MDAwMDAxMDAJU3ViZmlsZSB3YXMgY3JlYXRlZAorCSJkIgkvLyAweDAwMDAwMjAwCVN1YmZpbGUgd2FzIGRlbGV0ZWQKKwkiRCIJLy8gMHgwMDAwMDQwMAlTZWxmIHdhcyBkZWxldGVkCisJIk0iCS8vIDB4MDAwMDA4MDAJU2VsZiB3YXMgbW92ZWQKKwkiXDAiCS8vIDB4MDAwMDEwMDAgICAodW51c2VkKQorCS8vIEtlcm5lbCBldmVudHMsIGFsd2F5cyByZXBvcnRlZDoKKwkidSIJLy8gMHgwMDAwMjAwMCAgIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZAorCSJvIgkvLyAweDAwMDA0MDAwICAgRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQKKwkieCIJLy8gMHgwMDAwODAwMCAgIEZpbGUgaXMgbm8gbG9uZ2VyIHdhdGNoZWQgKHVzdWFsbHkgZGVsZXRlZCkKKzsKK2VudW0geworCU1BU0tfQklUUyA9IHNpemVvZihtYXNrX25hbWVzKSAtIDEKK307CisKK2ludCBpbm90aWZ5ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaW5vdGlmeWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJdW5zaWduZWQgbWFzazsKKwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwljaGFyICoqd2F0Y2hlczsgLy8gbmFtZXMgb2YgZmlsZXMgYmVpbmcgd2F0Y2hlZAorCWNvbnN0IGNoYXIgKmFyZ3NbNV07CisKKwkvLyBzYW5pdHkgY2hlY2s6IGFnZW50IGFuZCBhdCBsZWFzdCBvbmUgd2F0Y2ggbXVzdCBiZSBnaXZlbgorCWlmICghYXJndlsxXSB8fCAhYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJYXJndisrOworCS8vIGlub3RpZnlfYWRkX3dhdGNoIHdpbGwgbnVtYmVyIHdhdGNoZWQgZmlsZXMKKwkvLyBzdGFydGluZyBmcm9tIDEsIHRodXMgd2F0Y2hlc1swXSBpcyB1bmltcG9ydGFudCwKKwkvLyBhbmQgMXN0IGZpbGUgbmFtZSBpcyB3YXRjaGVzWzFdLgorCXdhdGNoZXMgPSBhcmd2OworCWFyZ3NbMF0gPSAqYXJndjsKKwlhcmdzWzRdID0gTlVMTDsKKwlhcmdjIC09IDI7IC8vIG51bWJlciBvZiBmaWxlcyB3ZSB3YXRjaAorCisJLy8gb3BlbiBpbm90aWZ5CisJcGZkLmZkID0gaW5vdGlmeV9pbml0KCk7CisJaWYgKHBmZC5mZCA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibm8ga2VybmVsIHN1cHBvcnQiKTsKKworCS8vIHNldHVwIHdhdGNoZXMKKwl3aGlsZSAoKisrYXJndikgeworCQljaGFyICpwYXRoID0gKmFyZ3Y7CisJCWNoYXIgKm1hc2tzID0gc3RyY2hyKHBhdGgsICc6Jyk7CisKKwkJbWFzayA9IDB4MGZmZjsgLy8gYXNzdW1pbmcgd2Ugd2FudCBhbGwgbm9uLWtlcm5lbCBldmVudHMKKwkJLy8gaWYgbWFzayBpcyBzcGVjaWZpZWQgLT4KKwkJaWYgKG1hc2tzKSB7CisJCQkqbWFza3MgPSAnXDAnOyAvLyBzcGxpdCBwYXRoIGFuZCBtYXNrCisJCQkvLyBjb252ZXJ0IG1hc2sgbmFtZXMgdG8gbWFzayBiaXRzZXQKKwkJCW1hc2sgPSAwOworCQkJd2hpbGUgKCorK21hc2tzKSB7CisJCQkJY29uc3QgY2hhciAqZm91bmQ7CisJCQkJZm91bmQgPSBtZW1jaHIobWFza19uYW1lcywgKm1hc2tzLCBNQVNLX0JJVFMpOworCQkJCWlmIChmb3VuZCkKKwkJCQkJbWFzayB8PSAoMSA8PCAoZm91bmQgLSBtYXNrX25hbWVzKSk7CisJCQl9CisJCX0KKwkJLy8gYWRkIHdhdGNoCisJCW4gPSBpbm90aWZ5X2FkZF93YXRjaChwZmQuZmQsIHBhdGgsIG1hc2spOworCQlpZiAobiA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFkZCB3YXRjaCAoJXMpIGZhaWxlZCIsIHBhdGgpOworCQkvL2JiX2Vycm9yX21zZygiYWRkZWQgJWQgWyVzXTolNFgiLCBuLCBwYXRoLCBtYXNrKTsKKwl9CisKKwkvLyBzZXR1cCBzaWduYWxzCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCByZWNvcmRfc2lnbm8pOworCisJLy8gZG8gd2F0Y2gKKwlwZmQuZXZlbnRzID0gUE9MTElOOworCXdoaWxlICgxKSB7CisJCWludCBsZW47CisJCXZvaWQgKmJ1ZjsKKwkJc3RydWN0IGlub3RpZnlfZXZlbnQgKmllOworIGFnYWluOgorCQlpZiAoYmJfZ290X3NpZ25hbCkKKwkJCWJyZWFrOworCQluID0gcG9sbCgmcGZkLCAxLCAtMSk7CisJCS8vIFNpZ25hbCBpbnRlcnJ1cHRlZCB1cz8KKwkJaWYgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKQorCQkJZ290byBhZ2FpbjsKKwkJLy8gVW5kZXIgTGludXgsIGFib3ZlIGlmKCkgaXMgbm90IG5lY2Vzc2FyeS4KKwkJLy8gTm9uLWZhdGFsIHNpZ25hbHMsIGUuZy4gU0lHQ0hMRCwgd2hlbiBzZXQgdG8gU0lHX0RGTCwKKwkJLy8gYXJlIG5vdCBpbnRlcnJ1cHRpbmcgcG9sbCgpLgorCQkvLyBUaHVzIHdlIGNhbiBqdXN0IGJyZWFrIGlmIG4gPD0gMCAoc2VlIGJlbG93KSwKKwkJLy8gYmVjYXVzZSBFSU5UUiB3aWxsIGhhcHBlbiBvbmx5IG9uIFNJR1RFUk0gZXQgYWwuCisJCS8vIEJ1dCB0aGlzIG1pZ2h0IGJlIG5vdCB0cnVlIHVuZGVyIG90aGVyIFVuaXhlcywKKwkJLy8gYW5kIGlzIGdlbmVyYWxseSB3YXkgdG9vIHN1YnRsZSB0byBkZXBlbmQgb24uCisJCWlmIChuIDw9IDApIC8vIHN0cmFuZ2UgZXJyb3I/CisJCQlicmVhazsKKworCQkvLyByZWFkIG91dCBhbGwgcGVuZGluZyBldmVudHMKKwkJLy8gKE5COiBsZW4gbXVzdCBiZSBpbnQsIG5vdCBzc2l6ZV90IG9yIGxvbmchKQorCQl4aW9jdGwocGZkLmZkLCBGSU9OUkVBRCwgJmxlbik7CisjZGVmaW5lIGV2ZW50YnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCWllID0gYnVmID0gKGxlbiA8PSBzaXplb2YoZXZlbnRidWYpKSA/IGV2ZW50YnVmIDogeG1hbGxvYyhsZW4pOworCQlsZW4gPSBmdWxsX3JlYWQocGZkLmZkLCBidWYsIGxlbik7CisJCS8vIHByb2Nlc3MgZXZlbnRzLiBOLkIuIGV2ZW50cyBtYXkgdmFyeSBpbiBsZW5ndGgKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWludCBpOworCQkJLy8gY2FjaGUgcmVsZXZhbnQgZXZlbnRzIG1hc2sKKwkJCXVuc2lnbmVkIG0gPSBpZS0+bWFzayAmICgoMSA8PCBNQVNLX0JJVFMpIC0gMSk7CisJCQlpZiAobSkgeworCQkJCWNoYXIgZXZlbnRzW01BU0tfQklUUyArIDFdOworCQkJCWNoYXIgKnMgPSBldmVudHM7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BU0tfQklUUzsgKytpLCBtID4+PSAxKSB7CisJCQkJCWlmICgobSAmIDEpICYmIChtYXNrX25hbWVzW2ldICE9ICdcMCcpKQorCQkJCQkJKnMrKyA9IG1hc2tfbmFtZXNbaV07CisJCQkJfQorCQkJCSpzID0gJ1wwJzsKKy8vCQkJCWJiX2Vycm9yX21zZygiZXhlYyAlcyAlMDhYXHQlc1x0JXNcdCVzIiwgYXJnc1swXSwKKy8vCQkJCQlpZS0+bWFzaywgZXZlbnRzLCB3YXRjaGVzW2llLT53ZF0sIGllLT5sZW4gPyBpZS0+bmFtZSA6ICIiKTsKKwkJCQlhcmdzWzFdID0gZXZlbnRzOworCQkJCWFyZ3NbMl0gPSB3YXRjaGVzW2llLT53ZF07CisJCQkJYXJnc1szXSA9IGllLT5sZW4gPyBpZS0+bmFtZSA6IE5VTEw7CisJCQkJc3Bhd25fYW5kX3dhaXQoKGNoYXIgKiopYXJncyk7CisJCQkJLy8gd2UgYXJlIGRvbmUgaWYgYWxsIGZpbGVzIGdvdCBmaW5hbCB4IGV2ZW50CisJCQkJaWYgKGllLT5tYXNrICYgMHg4MDAwKSB7CisJCQkJCWlmICgtLWFyZ2MgPD0gMCkKKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJaW5vdGlmeV9ybV93YXRjaChwZmQuZmQsIGllLT53ZCk7CisJCQkJfQorCQkJfQorCQkJLy8gbmV4dCBldmVudAorCQkJaSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBpZS0+bGVuOworCQkJbGVuIC09IGk7CisJCQlpZSA9ICh2b2lkKikoKGNoYXIqKWllICsgaSk7CisJCX0KKwkJaWYgKGV2ZW50YnVmICE9IGJ1ZikKKwkJCWZyZWUoYnVmKTsKKwl9IC8vIHdoaWxlICgxKQorIGRvbmU6CisJcmV0dXJuIGJiX2dvdF9zaWduYWw7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvaW9uaWNlLmMgYi9taXNjdXRpbHMvaW9uaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMDA2MAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9pb25pY2UuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaW9uaWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94IGJhc2VkIG9uIGxpbnV4LXV0aWxzLW5nIDIuMTQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgIDx1MTczMDM0QGluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpb25pY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYyAxLTNdIFstbiAwLTddIFstcCBQSURdIFtQUk9HXSIKKy8vdXNhZ2U6I2RlZmluZSBpb25pY2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgSS9PIHByaW9yaXR5IGFuZCBjbGFzc1xuIgorLy91c2FnZTogICAgICJcbgktYwlDbGFzcy4gMTpyZWFsdGltZSAyOmJlc3QtZWZmb3J0IDM6aWRsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpb3JpdHkiCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgaW50IGlvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKQoreworCXJldHVybiBzeXNjYWxsKFNZU19pb3ByaW9fc2V0LCB3aGljaCwgd2hvLCBpb3ByaW8pOworfQorCitzdGF0aWMgaW50IGlvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKQoreworCXJldHVybiBzeXNjYWxsKFNZU19pb3ByaW9fZ2V0LCB3aGljaCwgd2hvKTsKK30KKworZW51bSB7CisJSU9QUklPX1dIT19QUk9DRVNTID0gMSwKKwlJT1BSSU9fV0hPX1BHUlAsCisJSU9QUklPX1dIT19VU0VSCit9OworCitlbnVtIHsKKwlJT1BSSU9fQ0xBU1NfTk9ORSwKKwlJT1BSSU9fQ0xBU1NfUlQsCisJSU9QUklPX0NMQVNTX0JFLAorCUlPUFJJT19DTEFTU19JRExFCit9OworCitzdGF0aWMgY29uc3QgY2hhciB0b19wcmlvW10gPSAibm9uZVwwcmVhbHRpbWVcMGJlc3QtZWZmb3J0XDBpZGxlIjsKKworI2RlZmluZSBJT1BSSU9fQ0xBU1NfU0hJRlQgICAgICAxMworCitpbnQgaW9uaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpb25pY2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIERlZmF1bHRzICovCisJaW50IGlvY2xhc3MgPSAwOworCWludCBwcmkgPSAwOworCWludCBwaWQgPSAwOyAvKiBhZmZlY3Qgb3duIHBvcmNlc3MgKi8KKwlpbnQgb3B0OworCWVudW0geworCQlPUFRfbiA9IDEsCisJCU9QVF9jID0gMiwKKwkJT1BUX3AgPSA0LAorCX07CisKKwkvKiBOdW1lcmljIHBhcmFtcyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm4rOmMrOnArIjsKKwkvKiAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrbjpjOnA6IiwgJnByaSwgJmlvY2xhc3MsICZwaWQpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCWlmIChpb2NsYXNzID4gMykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2xhc3MgJWQiLCBpb2NsYXNzKTsKKy8vIERvIHdlIG5lZWQgdGhpcyAoY29tcGF0Pyk/CisvLwkJaWYgKGlvY2xhc3MgPT0gSU9QUklPX0NMQVNTX05PTkUpCisvLwkJCWlvY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisvLwkJaWYgKGlvY2xhc3MgPT0gSU9QUklPX0NMQVNTX0lETEUpIHsKKy8vCQkJLy9pZiAob3B0ICYgT1BUX24pCisvLwkJCS8vCWJiX2Vycm9yX21zZygiaWdub3JpbmcgcHJpb3JpdHkgZm9yIGlkbGUgY2xhc3MiKTsKKy8vCQkJcHJpID0gNzsKKy8vCQl9CisJfQorCisJaWYgKCEob3B0ICYgKE9QVF9ufE9QVF9jKSkpIHsKKwkJaWYgKCEob3B0ICYgT1BUX3ApICYmICphcmd2KQorCQkJcGlkID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCisJCXByaSA9IGlvcHJpb19nZXQoSU9QUklPX1dIT19QUk9DRVNTLCBwaWQpOworCQlpZiAocHJpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpb3ByaW9fJWNldCIsICdnJyk7CisKKwkJaW9jbGFzcyA9IChwcmkgPj4gSU9QUklPX0NMQVNTX1NISUZUKSAmIDB4MzsKKwkJcHJpICY9IDB4ZmY7CisJCXByaW50ZigoaW9jbGFzcyA9PSBJT1BSSU9fQ0xBU1NfSURMRSkgPyAiJXNcbiIgOiAiJXM6IHByaW8gJWRcbiIsCisJCQkJbnRoX3N0cmluZyh0b19wcmlvLCBpb2NsYXNzKSwgcHJpKTsKKwl9IGVsc2UgeworLy9wcmludGYoInByaT0lZCBjbGFzcz0lZCB2YWw9JXhcbiIsCisvL3ByaSwgaW9jbGFzcywgcHJpIHwgKGlvY2xhc3MgPDwgSU9QUklPX0NMQVNTX1NISUZUKSk7CisJCXByaSB8PSAoaW9jbGFzcyA8PCBJT1BSSU9fQ0xBU1NfU0hJRlQpOworCQlpZiAoaW9wcmlvX3NldChJT1BSSU9fV0hPX1BST0NFU1MsIHBpZCwgcHJpKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiaW9wcmlvXyVjZXQiLCAncycpOworCQlpZiAoYXJndlswXSkgeworCQkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwkJfQorCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvbGFzdC5jIGIvbWlzY3V0aWxzL2xhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI3ODAzCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2xhc3QuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGFzdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsYXN0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiSUZfRkVBVFVSRV9MQVNUX0ZBTkNZKCJbLUhXXSBbLWYgRklMRV0iKQorLy91c2FnZTojZGVmaW5lIGxhc3RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGxpc3Rpbmcgb2YgdGhlIGxhc3QgdXNlcnMgdGhhdCBsb2dnZWQgaW50byB0aGUgc3lzdGVtIgorLy91c2FnZToJSUZfRkVBVFVSRV9MQVNUX0ZBTkNZKCAiXG4iCisvKiAvL3VzYWdlOiAgIlxuCS1ICVNob3cgaGVhZGVyIGxpbmUiICovCisvL3VzYWdlOiAgICAgIlxuCS1XCURpc3BsYXkgd2l0aCBubyBob3N0IGNvbHVtbiB0cnVuY2F0aW9uIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFIFJlYWQgZnJvbSBGSUxFIGluc3RlYWQgb2YgL3Zhci9sb2cvd3RtcCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5COiB1dF9uYW1lIGFuZCB1dF91c2VyIGFyZSB0aGUgc2FtZSBmaWVsZCwgdXNlIG9ubHkgb25lIG5hbWUgKHV0X3VzZXIpCisgKiB0byByZWR1Y2UgY29uZnVzaW9uICovCisKKyNpZm5kZWYgU0hVVERPV05fVElNRQorIyAgZGVmaW5lIFNIVVRET1dOX1RJTUUgMjU0CisjZW5kaWYKKworLyogR3JyLi4uIHV0bXAgY2hhcltdIG1lbWJlcnMgZG8gbm90IGhhdmUgdG8gYmUgbnVsLXRlcm1pbmF0ZWQuCisgKiBEbyB3aGF0IHdlIGNhbiB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoaXMgcmVhc29uYWJseSBzbWFsbC4KKyAqIE5vdGU6IFdlIGFyZSBhc3N1bWluZyB0aGUgdXRfaWRbXSBzaXplIGlzIGZpeGVkIGF0IDQuICovCisKKyNpZiBkZWZpbmVkIFVUX0xJTkVTSVpFIFwKKwkmJiAoKFVUX0xJTkVTSVpFICE9IDMyKSB8fCAoVVRfTkFNRVNJWkUgIT0gMzIpIHx8IChVVF9IT1NUU0laRSAhPSAyNTYpKQorI2Vycm9yIHN0cnVjdCB1dG1wIG1lbWJlciBjaGFyW10gc2l6ZShzKSBoYXZlIGNoYW5nZWQhCisjZWxpZiBkZWZpbmVkIF9fVVRfTElORVNJWkUgXAorCSYmICgoX19VVF9MSU5FU0laRSAhPSAzMikgfHwgKF9fVVRfTkFNRVNJWkUgIT0gNjQpIHx8IChfX1VUX0hPU1RTSVpFICE9IDI1NikpCisjZXJyb3Igc3RydWN0IHV0bXAgbWVtYmVyIGNoYXJbXSBzaXplKHMpIGhhdmUgY2hhbmdlZCEKKyNlbmRpZgorCisjaWYgRU1QVFkgIT0gMCB8fCBSVU5fTFZMICE9IDEgfHwgQk9PVF9USU1FICE9IDIgfHwgTkVXX1RJTUUgIT0gMyB8fCBcCisJT0xEX1RJTUUgIT0gNAorI2Vycm9yIFZhbHVlcyBmb3IgdGhlIHV0X3R5cGUgZmllbGQgb2Ygc3RydWN0IHV0bXAgY2hhbmdlZAorI2VuZGlmCisKK2ludCBsYXN0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsYXN0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHV0bXAgdXQ7CisJaW50IG4sIGZpbGUgPSBTVERJTl9GSUxFTk87CisJdGltZV90IHRfdG1wOworCW9mZl90IHBvczsKKwlzdGF0aWMgY29uc3QgY2hhciBfdXRfdXNyW10gQUxJR04xID0KKwkJCSJydW5sZXZlbFwwIiAicmVib290XDAiICJzaHV0ZG93blwwIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfdXRfbGluW10gQUxJR04xID0KKwkJCSJ+XDAiICJ7XDAiICJ8XDAiIC8qICJMT0dJTlwwIiAiZGF0ZVwwIiAqLzsKKwllbnVtIHsKKwkJVFlQRV9SVU5fTFZMID0gUlVOX0xWTCwgICAgICAgICAvKiAxICovCisJCVRZUEVfQk9PVF9USU1FID0gQk9PVF9USU1FLCAgICAgLyogMiAqLworCQlUWVBFX1NIVVRET1dOX1RJTUUgPSBTSFVURE9XTl9USU1FCisJfTsKKwllbnVtIHsKKwkJX1RJTERFID0gRU1QVFksIC8qIDAgKi8KKwkJVFlQRV9ORVdfVElNRSwgIC8qIE5FV19USU1FLCAzICovCisJCVRZUEVfT0xEX1RJTUUgICAvKiBPTERfVElNRSwgNCAqLworCX07CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCWZpbGUgPSB4b3BlbihiYl9wYXRoX3d0bXBfZmlsZSwgT19SRE9OTFkpOworCisJcHJpbnRmKCIlLTEwcyAlLTE0cyAlLTE4cyAlLTEyLjEycyAlc1xuIiwKKwkgICAgICAgIlVTRVIiLCAiVFRZIiwgIkhPU1QiLCAiTE9HSU4iLCAiVElNRSIpOworCS8qIHlpa2VzLiBXZSByZXZlcnNlIG92ZXIgdGhlIGZpbGUgYW5kIHRoYXQgaXMgYSBub3QgdG9vIGVsZWdhbnQgd2F5ICovCisJcG9zID0geGxzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKwlwb3MgPSBsc2VlayhmaWxlLCBwb3MgLSBzaXplb2YodXQpLCBTRUVLX1NFVCk7CisJd2hpbGUgKChuID0gZnVsbF9yZWFkKGZpbGUsICZ1dCwgc2l6ZW9mKHV0KSkpID4gMCkgeworCQlpZiAobiAhPSBzaXplb2YodXQpKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkJfQorCQluID0gaW5kZXhfaW5fc3RyaW5ncyhfdXRfbGluLCB1dC51dF9saW5lKTsKKwkJaWYgKG4gPT0gX1RJTERFKSB7IC8qICd+JyAqLworI2lmIDEKKy8qIGRvIHdlIHJlYWxseSBuZWVkIHRvIGJlIGNhdXRpb3VzIGhlcmU/ICovCisJCQluID0gaW5kZXhfaW5fc3RyaW5ncyhfdXRfdXNyLCB1dC51dF91c2VyKTsKKwkJCWlmICgrK24gPiAwKQorCQkJCXV0LnV0X3R5cGUgPSBuICE9IDMgPyBuIDogU0hVVERPV05fVElNRTsKKyNlbHNlCisJCQlpZiAoc3RybmNtcCh1dC51dF91c2VyLCAic2h1dGRvd24iLCA4KSA9PSAwKQorCQkJCXV0LnV0X3R5cGUgPSBTSFVURE9XTl9USU1FOworCQkJZWxzZSBpZiAoc3RybmNtcCh1dC51dF91c2VyLCAicmVib290IiwgNikgPT0gMCkKKwkJCQl1dC51dF90eXBlID0gQk9PVF9USU1FOworCQkJZWxzZSBpZiAoc3RybmNtcCh1dC51dF91c2VyLCAicnVubGV2ZWwiLCA4KSA9PSAwKQorCQkJCXV0LnV0X3R5cGUgPSBSVU5fTFZMOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpZiAodXQudXRfdXNlclswXSA9PSAnXDAnIHx8IHN0cmNtcCh1dC51dF91c2VyLCAiTE9HSU4iKSA9PSAwKSB7CisJCQkJLyogRG9uJ3QgYm90aGVyLiAgVGhpcyBtZWFucyB3ZSBjYW4ndCBmaW5kIGhvdyBsb25nCisJCQkJICogc29tZW9uZSB3YXMgbG9nZ2VkIGluIGZvci4gIE9oIHdlbGwuICovCisJCQkJZ290byBuZXh0OworCQkJfQorCQkJaWYgKHV0LnV0X3R5cGUgIT0gREVBRF9QUk9DRVNTCisJCQkgJiYgdXQudXRfdXNlclswXQorCQkJICYmIHV0LnV0X2xpbmVbMF0KKwkJCSkgeworCQkJCXV0LnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7CisJCQl9CisJCQlpZiAoc3RyY21wKHV0LnV0X3VzZXIsICJkYXRlIikgPT0gMCkgeworCQkJCWlmIChuID09IFRZUEVfT0xEX1RJTUUpIHsgLyogJ3wnICovCisJCQkJCXV0LnV0X3R5cGUgPSBPTERfVElNRTsKKwkJCQl9CisJCQkJaWYgKG4gPT0gVFlQRV9ORVdfVElNRSkgeyAvKiAneycgKi8KKwkJCQkJdXQudXRfdHlwZSA9IE5FV19USU1FOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICh1dC51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykgeworCQkJc3dpdGNoICh1dC51dF90eXBlKSB7CisJCQkJY2FzZSBPTERfVElNRToKKwkJCQljYXNlIE5FV19USU1FOgorCQkJCWNhc2UgUlVOX0xWTDoKKwkJCQljYXNlIFNIVVRET1dOX1RJTUU6CisJCQkJCWdvdG8gbmV4dDsKKwkJCQljYXNlIEJPT1RfVElNRToKKwkJCQkJc3RyY3B5KHV0LnV0X2xpbmUsICJzeXN0ZW0gYm9vdCIpOworCQkJfQorCQl9CisJCS8qIG1hbnBhZ2VzIHNheSB1dF90di50dl9zZWMgKmlzKiB0aW1lX3QsCisJCSAqIGJ1dCBzb21lIHN5c3RlbXMgaGF2ZSBpdCB3cm9uZyAqLworCQl0X3RtcCA9ICh0aW1lX3QpdXQudXRfdHYudHZfc2VjOworCQlwcmludGYoIiUtMTBzICUtMTRzICUtMThzICUtMTIuMTJzXG4iLAorCQkgICAgICAgdXQudXRfdXNlciwgdXQudXRfbGluZSwgdXQudXRfaG9zdCwgY3RpbWUoJnRfdG1wKSArIDQpOworIG5leHQ6CisJCXBvcyAtPSBzaXplb2YodXQpOworCQlpZiAocG9zIDw9IDApCisJCQlicmVhazsgLyogZG9uZS4gKi8KKwkJeGxzZWVrKGZpbGUsIHBvcywgU0VFS19TRVQpOworCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9sYXN0X2ZhbmN5LmMgYi9taXNjdXRpbHMvbGFzdF9mYW5jeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDliNjUKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvbGFzdF9mYW5jeS5jCkBAIC0wLDAgKzEsMjk1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAoc3lzdmluaXQgbGlrZSkgbGFzdCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYS5tdXNjYWx1QGF4aXMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5COiB1dF9uYW1lIGFuZCB1dF91c2VyIGFyZSB0aGUgc2FtZSBmaWVsZCwgdXNlIG9ubHkgb25lIG5hbWUgKHV0X3VzZXIpCisgKiB0byByZWR1Y2UgY29uZnVzaW9uICovCisKKyNpZm5kZWYgU0hVVERPV05fVElNRQorIyAgZGVmaW5lIFNIVVRET1dOX1RJTUUgMjU0CisjZW5kaWYKKworI2RlZmluZSBIRUFERVJfRk9STUFUICAgICAiJS04LjhzICUtMTIuMTJzICUtKi4qcyAlLTE2LjE2cyAlLTcuN3MgJXNcbiIKKyNkZWZpbmUgSEVBREVSX0xJTkUgICAgICAgIlVTRVIiLCAiVFRZIiwgXAorCUlORVRfQUREUlNUUkxFTiwgSU5FVF9BRERSU1RSTEVOLCAiSE9TVCIsICJMT0dJTiIsICIgIFRJTUUiLCAiIgorI2RlZmluZSBIRUFERVJfTElORV9XSURFICAiVVNFUiIsICJUVFkiLCBcCisJSU5FVDZfQUREUlNUUkxFTiwgSU5FVDZfQUREUlNUUkxFTiwgIkhPU1QiLCAiTE9HSU4iLCAiICBUSU1FIiwgIiIKKworZW51bSB7CisJTk9STUFMLAorCUxPR0dFRCwKKwlET1dOLAorCVJFQk9PVCwKKwlDUkFTSCwKKwlHT05FCit9OworCitlbnVtIHsKKwlMQVNUX09QVF9XID0gKDEgPDwgMCksICAvKiAtVyB3aWRlICAgICAgICAgICAgKi8KKwlMQVNUX09QVF9mID0gKDEgPDwgMSksICAvKiAtZiBpbnB1dCBmaWxlICAgICAgKi8KKwlMQVNUX09QVF9IID0gKDEgPDwgMiksICAvKiAtSCBoZWFkZXIgICAgICAgICAgKi8KK307CisKKyNkZWZpbmUgc2hvd193aWRlIChvcHRpb25fbWFzazMyICYgTEFTVF9PUFRfVykKKworc3RhdGljIHZvaWQgc2hvd19lbnRyeShzdHJ1Y3QgdXRtcCAqdXQsIGludCBzdGF0ZSwgdGltZV90IGR1cl9zZWNzKQoreworCXVuc2lnbmVkIGRheXMsIGhvdXJzLCBtaW5zOworCWNoYXIgZHVyYXRpb25bMzJdOworCWNoYXIgbG9naW5fdGltZVsxN107CisJY2hhciBsb2dvdXRfdGltZVs4XTsKKwljb25zdCBjaGFyICpsb2dvdXRfc3RyOworCWNvbnN0IGNoYXIgKmR1cmF0aW9uX3N0cjsKKwl0aW1lX3QgdG1wOworCisJLyogbWFucGFnZXMgc2F5IHV0X3R2LnR2X3NlYyAqaXMqIHRpbWVfdCwKKwkgKiBidXQgc29tZSBzeXN0ZW1zIGhhdmUgaXQgd3JvbmcgKi8KKwl0bXAgPSB1dC0+dXRfdHYudHZfc2VjOworCXNhZmVfc3RybmNweShsb2dpbl90aW1lLCBjdGltZSgmdG1wKSwgMTcpOworCXNucHJpbnRmKGxvZ291dF90aW1lLCA4LCAiLSAlcyIsIGN0aW1lKCZkdXJfc2VjcykgKyAxMSk7CisKKwlkdXJfc2VjcyA9IE1BWChkdXJfc2VjcyAtICh0aW1lX3QpdXQtPnV0X3R2LnR2X3NlYywgKHRpbWVfdCkwKTsKKwkvKiB1bnNpZ25lZCBpbnQgaXMgZWFzaWVyIHRvIGRpdmlkZSB0aGFuIHRpbWVfdCAod2hpY2ggbWF5IGJlIHNpZ25lZCBsb25nKSAqLworCW1pbnMgPSBkdXJfc2VjcyAvIDYwOworCWRheXMgPSBtaW5zIC8gKDI0KjYwKTsKKwltaW5zID0gbWlucyAlICgyNCo2MCk7CisJaG91cnMgPSBtaW5zIC8gNjA7CisJbWlucyA9IG1pbnMgJSA2MDsKKworLy8JaWYgKGRheXMpIHsKKwkJc3ByaW50ZihkdXJhdGlvbiwgIigldSslMDJ1OiUwMnUpIiwgZGF5cywgaG91cnMsIG1pbnMpOworLy8JfSBlbHNlIHsKKy8vCQlzcHJpbnRmKGR1cmF0aW9uLCAiICglMDJ1OiUwMnUpIiwgaG91cnMsIG1pbnMpOworLy8JfQorCisJbG9nb3V0X3N0ciA9IGxvZ291dF90aW1lOworCWR1cmF0aW9uX3N0ciA9IGR1cmF0aW9uOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE5PUk1BTDoKKwkJYnJlYWs7CisJY2FzZSBMT0dHRUQ6CisJCWxvZ291dF9zdHIgPSAiICBzdGlsbCI7CisJCWR1cmF0aW9uX3N0ciA9ICJsb2dnZWQgaW4iOworCQlicmVhazsKKwljYXNlIERPV046CisJCWxvZ291dF9zdHIgPSAiLSBkb3duICI7CisJCWJyZWFrOworCWNhc2UgUkVCT09UOgorCQlicmVhazsKKwljYXNlIENSQVNIOgorCQlsb2dvdXRfc3RyID0gIi0gY3Jhc2giOworCQlicmVhazsKKwljYXNlIEdPTkU6CisJCWxvZ291dF9zdHIgPSAiICAgZ29uZSI7CisJCWR1cmF0aW9uX3N0ciA9ICItIG5vIGxvZ291dCI7CisJCWJyZWFrOworCX0KKworCXByaW50ZihIRUFERVJfRk9STUFULAorCQkgICB1dC0+dXRfdXNlciwKKwkJICAgdXQtPnV0X2xpbmUsCisJCSAgIHNob3dfd2lkZSA/IElORVQ2X0FERFJTVFJMRU4gOiBJTkVUX0FERFJTVFJMRU4sCisJCSAgIHNob3dfd2lkZSA/IElORVQ2X0FERFJTVFJMRU4gOiBJTkVUX0FERFJTVFJMRU4sCisJCSAgIHV0LT51dF9ob3N0LAorCQkgICBsb2dpbl90aW1lLAorCQkgICBsb2dvdXRfc3RyLAorCQkgICBkdXJhdGlvbl9zdHIpOworfQorCitzdGF0aWMgaW50IGdldF91dF90eXBlKHN0cnVjdCB1dG1wICp1dCkKK3sKKwlpZiAodXQtPnV0X2xpbmVbMF0gPT0gJ34nKSB7CisJCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJzaHV0ZG93biIpID09IDApIHsKKwkJCXJldHVybiBTSFVURE9XTl9USU1FOworCQl9CisJCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJyZWJvb3QiKSA9PSAwKSB7CisJCQlyZXR1cm4gQk9PVF9USU1FOworCQl9CisJCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJydW5sZXZlbCIpID09IDApIHsKKwkJCXJldHVybiBSVU5fTFZMOworCQl9CisJCXJldHVybiB1dC0+dXRfdHlwZTsKKwl9CisKKwlpZiAodXQtPnV0X3VzZXJbMF0gPT0gMCkgeworCQlyZXR1cm4gREVBRF9QUk9DRVNTOworCX0KKworCWlmICgodXQtPnV0X3R5cGUgIT0gREVBRF9QUk9DRVNTKQorCSAmJiAoc3RyY21wKHV0LT51dF91c2VyLCAiTE9HSU4iKSAhPSAwKQorCSAmJiB1dC0+dXRfdXNlclswXQorCSAmJiB1dC0+dXRfbGluZVswXQorCSkgeworCQl1dC0+dXRfdHlwZSA9IFVTRVJfUFJPQ0VTUzsKKwl9CisKKwlpZiAoc3RyY21wKHV0LT51dF91c2VyLCAiZGF0ZSIpID09IDApIHsKKwkJaWYgKHV0LT51dF9saW5lWzBdID09ICd8JykgeworCQkJcmV0dXJuIE9MRF9USU1FOworCQl9CisJCWlmICh1dC0+dXRfbGluZVswXSA9PSAneycpIHsKKwkJCXJldHVybiBORVdfVElNRTsKKwkJfQorCX0KKwlyZXR1cm4gdXQtPnV0X3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgaXNfcnVubGV2ZWxfc2h1dGRvd24oc3RydWN0IHV0bXAgKnV0KQoreworCWlmICgoKHV0LT51dF9waWQgJiAyNTUpID09ICcwJykgfHwgKCh1dC0+dXRfcGlkICYgMjU1KSA9PSAnNicpKSB7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbGFzdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbGFzdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXAgdXQ7CisJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBfUEFUSF9XVE1QOworCWxsaXN0X3QgKnpsaXN0OworCW9mZl90IHBvczsKKwl0aW1lX3Qgc3RhcnRfdGltZTsKKwl0aW1lX3QgYm9vdF90aW1lOworCXRpbWVfdCBkb3duX3RpbWU7CisJaW50IGZpbGU7CisJc21hbGxpbnQgZ29pbmdfZG93bjsKKwlzbWFsbGludCBib290X2Rvd247CisKKwkvKm9wdCA9Ki8gZ2V0b3B0MzIoYXJndiwgIldmOiIgLyogIkgiICovLCAmZmlsZW5hbWUpOworI2lmZGVmIEJVVF9VVElMX0xJTlVYX0xBU1RfSEFTX05PX1NVQ0hfT1BUCisJaWYgKG9wdCAmIExBU1RfT1BUX0gpIHsKKwkJLyogUHJpbnQgaGVhZGVyIGxpbmUgKi8KKwkJaWYgKG9wdCAmIExBU1RfT1BUX1cpIHsKKwkJCXByaW50ZihIRUFERVJfRk9STUFULCBIRUFERVJfTElORV9XSURFKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZihIRUFERVJfRk9STUFULCBIRUFERVJfTElORSk7CisJCX0KKwl9CisjZW5kaWYKKworCWZpbGUgPSB4b3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCXsKKwkJLyogaW4gY2FzZSB0aGUgZmlsZSBpcyBlbXB0eS4uLiAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJZnN0YXQoZmlsZSwgJnN0KTsKKwkJc3RhcnRfdGltZSA9IHN0LnN0X2N0aW1lOworCX0KKworCXRpbWUoJmRvd25fdGltZSk7CisJZ29pbmdfZG93biA9IDA7CisJYm9vdF9kb3duID0gTk9STUFMOyAvKiAwICovCisJemxpc3QgPSBOVUxMOworCWJvb3RfdGltZSA9IDA7CisJLyogZ2V0IGZpbGUgc2l6ZSwgcm91bmRpbmcgZG93biB0byBsYXN0IGZ1bGwgcmVjb3JkICovCisJcG9zID0geGxzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKSAvIHNpemVvZih1dCkgKiBzaXplb2YodXQpOworCWZvciAoOzspIHsKKwkJcG9zIC09IChvZmZfdClzaXplb2YodXQpOworCQlpZiAocG9zIDwgMCkgeworCQkJLyogQmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYm91bmRhcnkgPT4KKwkJCSAqIHRoZSB3aG9sZSBmaWxlIGhhcyBiZWVuIHJlYWQuICovCisJCQlicmVhazsKKwkJfQorCQl4bHNlZWsoZmlsZSwgcG9zLCBTRUVLX1NFVCk7CisJCXhyZWFkKGZpbGUsICZ1dCwgc2l6ZW9mKHV0KSk7CisJCS8qIHJld3JpdHRlbiBieSBlYWNoIHJlY29yZCwgZXZlbnRpYWxseSB3aWxsIGhhdmUKKwkJICogZmlyc3QgcmVjb3JkJ3MgdXRfdHYudHZfc2VjOiAqLworCQlzdGFydF90aW1lID0gdXQudXRfdHYudHZfc2VjOworCisJCXN3aXRjaCAoZ2V0X3V0X3R5cGUoJnV0KSkgeworCQljYXNlIFNIVVRET1dOX1RJTUU6CisJCQlkb3duX3RpbWUgPSB1dC51dF90di50dl9zZWM7CisJCQlib290X2Rvd24gPSBET1dOOworCQkJZ29pbmdfZG93biA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBSVU5fTFZMOgorCQkJaWYgKGlzX3J1bmxldmVsX3NodXRkb3duKCZ1dCkpIHsKKwkJCQlkb3duX3RpbWUgPSB1dC51dF90di50dl9zZWM7CisJCQkJZ29pbmdfZG93biA9IDE7CisJCQkJYm9vdF9kb3duID0gRE9XTjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJPT1RfVElNRToKKwkJCXN0cmNweSh1dC51dF9saW5lLCAic3lzdGVtIGJvb3QiKTsKKwkJCXNob3dfZW50cnkoJnV0LCBSRUJPT1QsIGRvd25fdGltZSk7CisJCQlib290X2Rvd24gPSBDUkFTSDsKKwkJCWdvaW5nX2Rvd24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgREVBRF9QUk9DRVNTOgorCQkJaWYgKCF1dC51dF9saW5lWzBdKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBhZGRfZW50cnkgKi8KKwkJCWxsaXN0X2FkZF90bygmemxpc3QsIG1lbWNweSh4bWFsbG9jKHNpemVvZih1dCkpLCAmdXQsIHNpemVvZih1dCkpKTsKKwkJCWJyZWFrOworCQljYXNlIFVTRVJfUFJPQ0VTUzogeworCQkJaW50IHNob3c7CisKKwkJCWlmICghdXQudXRfbGluZVswXSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZmluZF9lbnRyeSAqLworCQkJc2hvdyA9IDE7CisJCQl7CisJCQkJbGxpc3RfdCAqZWwsICpuZXh0OworCQkJCWZvciAoZWwgPSB6bGlzdDsgZWw7IGVsID0gbmV4dCkgeworCQkJCQlzdHJ1Y3QgdXRtcCAqdXAgPSAoc3RydWN0IHV0bXAgKillbC0+ZGF0YTsKKwkJCQkJbmV4dCA9IGVsLT5saW5rOworCQkJCQlpZiAoc3RybmNtcCh1cC0+dXRfbGluZSwgdXQudXRfbGluZSwgVVRfTElORVNJWkUpID09IDApIHsKKwkJCQkJCWlmIChzaG93KSB7CisJCQkJCQkJc2hvd19lbnRyeSgmdXQsIE5PUk1BTCwgdXAtPnV0X3R2LnR2X3NlYyk7CisJCQkJCQkJc2hvdyA9IDA7CisJCQkJCQl9CisJCQkJCQlsbGlzdF91bmxpbmsoJnpsaXN0LCBlbCk7CisJCQkJCQlmcmVlKGVsLT5kYXRhKTsKKwkJCQkJCWZyZWUoZWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoc2hvdykgeworCQkJCWludCBzdGF0ZSA9IGJvb3RfZG93bjsKKworCQkJCWlmIChib290X3RpbWUgPT0gMCkgeworCQkJCQlzdGF0ZSA9IExPR0dFRDsKKwkJCQkJLyogQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaXMgYWxpdmUgKi8KKwkJCQkJaWYgKCh1dC51dF9waWQgPiAwKQorCQkJCQkgJiYgKGtpbGwodXQudXRfcGlkLCAwKSAhPSAwKQorCQkJCQkgJiYgKGVycm5vID09IEVTUkNIKSkgeworCQkJCQkJc3RhdGUgPSBHT05FOworCQkJCQl9CisJCQkJfQorCQkJCXNob3dfZW50cnkoJnV0LCBzdGF0ZSwgYm9vdF90aW1lKTsKKwkJCX0KKwkJCS8qIGFkZF9lbnRyeSAqLworCQkJbGxpc3RfYWRkX3RvKCZ6bGlzdCwgbWVtY3B5KHhtYWxsb2Moc2l6ZW9mKHV0KSksICZ1dCwgc2l6ZW9mKHV0KSkpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCisJCWlmIChnb2luZ19kb3duKSB7CisJCQlib290X3RpbWUgPSB1dC51dF90di50dl9zZWM7CisJCQlsbGlzdF9mcmVlKHpsaXN0LCBmcmVlKTsKKwkJCXpsaXN0ID0gTlVMTDsKKwkJCWdvaW5nX2Rvd24gPSAwOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWxsaXN0X2ZyZWUoemxpc3QsIGZyZWUpOworCX0KKworCXByaW50ZigiXG53dG1wIGJlZ2lucyAlcyIsIGN0aW1lKCZzdGFydF90aW1lKSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZpbGUpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9sZXNzLmMgYi9taXNjdXRpbHMvbGVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWZkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvbGVzcy5jCkBAIC0wLDAgKzEsMTkxNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsZXNzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJvYiBTdWxsaXZhbiA8Y29naXRvLmVyZ28uY29naXRvQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUT0RPOgorICogLSBBZGQgbW9yZSByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCAtIHNlYXJjaCBtb2RpZmllcnMsIGNlcnRhaW4gbWF0Y2hlcywgZXRjLgorICogLSBBZGQgbW9yZSBjb21wbGV4IGJyYWNrZXQgc2VhcmNoaW5nIC0gY3VycmVudGx5LCBuZXN0ZWQgYnJhY2tldHMgYXJlCisgKiAgIG5vdCBjb25zaWRlcmVkLgorICogLSBBZGQgc3VwcG9ydCBmb3IgIkYiIGFzIGFuIGlucHV0LiBUaGlzIGNhdXNlcyBsZXNzIHRvIGFjdCBpbgorICogICBhIHNpbWlsYXIgd2F5IHRvIHRhaWwgLWYuCisgKiAtIEFsbG93IGhvcml6b250YWwgc2Nyb2xsaW5nLgorICoKKyAqIE5vdGVzOgorICogLSB0aGUgaW5wIGZpbGUgcG9pbnRlciBpcyB1c2VkIHNvIHRoYXQga2V5Ym9hcmQgaW5wdXQgd29ya3MgYWZ0ZXIKKyAqICAgcmVkaXJlY3RlZCBpbnB1dCBoYXMgYmVlbiByZWFkIGZyb20gc3RkaW4KKyAqLworCisvL2NvbmZpZzpjb25maWcgTEVTUworLy9jb25maWc6CWJvb2wgImxlc3MiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgJ2xlc3MnIGlzIGEgcGFnZXIsIG1lYW5pbmcgdGhhdCBpdCBkaXNwbGF5cyB0ZXh0IGZpbGVzLiBJdCBwb3NzZXNzZXMKKy8vY29uZmlnOgkgIGEgd2lkZSBhcnJheSBvZiBmZWF0dXJlcywgYW5kIGlzIGFuIGltcHJvdmVtZW50IG92ZXIgJ21vcmUnLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX01BWExJTkVTCisvL2NvbmZpZzoJaW50ICJNYXggbnVtYmVyIG9mIGlucHV0IGxpbmVzIGxlc3Mgd2lsbCB0cnkgdG8gZWF0IgorLy9jb25maWc6CWRlZmF1bHQgOTk5OTk5OQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX0JSQUNLRVRTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGJyYWNrZXQgc2VhcmNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGNhcGFiaWxpdHkgdG8gc2VhcmNoIGZvciBtYXRjaGluZyBsZWZ0IGFuZCByaWdodAorLy9jb25maWc6CSAgYnJhY2tldHMsIGZhY2lsaXRhdGluZyBwcm9ncmFtbWluZy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19GTEFHUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBleHRyYSBmbGFncyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgZXh0cmEgZmxhZ3MgcHJvdmlkZWQgZG8gdGhlIGZvbGxvd2luZzoKKy8vY29uZmlnOgorLy9jb25maWc6CSAgVGhlIC1NIGZsYWcgZW5hYmxlcyBhIG1vcmUgc29waGlzdGljYXRlZCBzdGF0dXMgbGluZS4KKy8vY29uZmlnOgkgIFRoZSAtbSBmbGFnIGVuYWJsZXMgYSBzaW1wbGVyIHN0YXR1cyBsaW5lIHdpdGggYSBwZXJjZW50YWdlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX01BUktTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIG1hcmtzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1hcmtzIGVuYWJsZSBwb3NpdGlvbnMgaW4gYSBmaWxlIHRvIGJlIHN0b3JlZCBmb3IgZWFzeSByZWZlcmVuY2UuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfUkVHRVhQCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBMRVNTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGFsbG93aW5nIGNvbXBsZXggZmlsZSBzZWFyY2hlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19XSU5DSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBhdXRvbWF0aWMgcmVzaXppbmcgb24gd2luZG93IHNpemUgY2hhbmdlcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBNYWtlcyBsZXNzIHRyYWNrIHdpbmRvdyBzaXplIGNoYW5nZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisvL2NvbmZpZzoJYm9vbCAiVXNlICd0ZWxsIG1lIGN1cnNvciBwb3NpdGlvbicgRVNDIHNlcXVlbmNlIHRvIG1lYXN1cmUgd2luZG93IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9MRVNTX1dJTkNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZXMgbGVzcyB0cmFjayB3aW5kb3cgc2l6ZSBjaGFuZ2VzLgorLy9jb25maWc6CSAgSWYgdGVybWluYWwgc2l6ZSBjYW4ndCBiZSByZXRyaWV2ZWQgYW5kICRMSU5FUy8kQ09MVU1OUyBhcmUgbm90IHNldCwKKy8vY29uZmlnOgkgIHRoaXMgb3B0aW9uIG1ha2VzIGxlc3MgcGVyZm9ybSBhIGxhc3QtZGl0Y2ggZWZmb3J0IHRvIGZpbmQgaXQ6CisvL2NvbmZpZzoJICBwb3NpdGlvbiBjdXJzb3IgdG8gOTk5LDk5OSBhbmQgYXNrIHRlcm1pbmFsIHRvIHJlcG9ydCByZWFsCisvL2NvbmZpZzoJICBjdXJzb3IgcG9zaXRpb24gdXNpbmcgIkVTQyBbIDYgbiIgZXNjYXBlIHNlcXVlbmNlLCB0aGVuIHJlYWQgc3RkaW4uCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgaXMgbm90IGNsZWFuIGJ1dCBoZWxwcyBhIGxvdCBvbiBzZXJpYWwgbGluZXMgYW5kIHN1Y2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfREFTSENNRAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBmbGFnIGNoYW5nZXMgKCctJyBjb21tYW5kKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGVuYWJsZXMgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIGNvbW1hbmQtbGluZSBmbGFncyB3aXRoaW4KKy8vY29uZmlnOgkgIGxlc3MgaXRzZWxmICgnLScga2V5Ym9hcmQgY29tbWFuZCkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfTElORU5VTVMKKy8vY29uZmlnOglib29sICJFbmFibGUgZHluYW1pYyBzd2l0Y2hpbmcgb2YgbGluZSBudW1iZXJzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9MRVNTX0RBU0hDTUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGVzICItTiIgY29tbWFuZC4KKworLy91c2FnZTojZGVmaW5lIGxlc3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstRU1ObWh+ST9dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsZXNzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVmlldyBGSUxFIChvciBzdGRpbikgb25lIHNjcmVlbmZ1bCBhdCBhIHRpbWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUUJUXVpdCBvbmNlIHRoZSBlbmQgb2YgYSBmaWxlIGlzIHJlYWNoZWQiCisvL3VzYWdlOiAgICAgIlxuCS1NLC1tCURpc3BsYXkgc3RhdHVzIGxpbmUgd2l0aCBsaW5lIG51bWJlcnMiCisvL3VzYWdlOiAgICAgIlxuCQlhbmQgcGVyY2VudGFnZSB0aHJvdWdoIHRoZSBmaWxlIgorLy91c2FnZTogICAgICJcbgktTglQcmVmaXggbGluZSBudW1iZXIgdG8gZWFjaCBsaW5lIgorLy91c2FnZTogICAgICJcbgktSQlJZ25vcmUgY2FzZSBpbiBhbGwgc2VhcmNoZXMiCisvL3VzYWdlOiAgICAgIlxuCS1+CVN1cHByZXNzIH5zIGRpc3BsYXllZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUiCisKKyNpbmNsdWRlIDxzY2hlZC5oPiAgLyogc2NoZWRfeWllbGQoKSAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorI2luY2x1ZGUgInhyZWdleC5oIgorI2VuZGlmCisKKworI2RlZmluZSBFU0MgIlwwMzMiCisvKiBUaGUgZXNjYXBlIGNvZGVzIGZvciBoaWdobGlnaHRlZCBhbmQgbm9ybWFsIHRleHQgKi8KKyNkZWZpbmUgSElHSExJR0hUICAgRVNDIls3bSIKKyNkZWZpbmUgTk9STUFMICAgICAgRVNDIlswbSIKKy8qIFRoZSBlc2NhcGUgY29kZSB0byBob21lIGFuZCBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworI2RlZmluZSBDTEVBUiAgICAgICBFU0MiW0hcMDMzW0oiCisvKiBUaGUgZXNjYXBlIGNvZGUgdG8gY2xlYXIgdG8gdGhlIGVuZCBvZiBsaW5lICovCisjZGVmaW5lIENMRUFSXzJfRU9MIEVTQyJbSyIKKworZW51bSB7CisvKiBBYnNvbHV0ZSBtYXggb2YgbGluZXMgZWF0ZW4gKi8KKwlNQVhMSU5FUyA9IENPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVMsCisvKiBUaGlzIG1hbnkgImFmdGVyIHRoZSBlbmQiIGxpbmVzIHdlIHdpbGwgc2hvdyAoYXQgbWF4KSAqLworCVRJTERFUyA9IDEsCit9OworCisvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyAqLworZW51bSB7CisJRkxBR19FID0gMSA8PCAwLAorCUZMQUdfTSA9IDEgPDwgMSwKKwlGTEFHX20gPSAxIDw8IDIsCisJRkxBR19OID0gMSA8PCAzLAorCUZMQUdfVElMREUgPSAxIDw8IDQsCisJRkxBR19JID0gMSA8PCA1LAorCUZMQUdfUyA9ICgxIDw8IDYpICogRU5BQkxFX0ZFQVRVUkVfTEVTU19EQVNIQ01ELAorLyogaGlqYWNrIGNvbW1hbmQgbGluZSBvcHRpb25zIHZhcmlhYmxlIGZvciBpbnRlcm5hbCBzdGF0ZSB2YXJzICovCisJTEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFMgPSAxIDw8IDE1LAorfTsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorZW51bSB7IHBhdHRlcm5fdmFsaWQgPSAwIH07CisjZW5kaWYKKworc3RydWN0IGdsb2JhbHMgeworCWludCBjdXJfZmxpbmU7IC8qIHNpZ25lZCAqLworCWludCBrYmRfZmQ7ICAvKiBmZCB0byBnZXQgaW5wdXQgZnJvbSAqLworCWludCBsZXNzX2dldHNfcG9zOworLyogbGFzdCBwb3NpdGlvbiBpbiBsYXN0IGxpbmUsIHRha2luZyBpbnRvIGFjY291bnQgdGFicyAqLworCXNpemVfdCBsYXN0X2xpbmVfcG9zOworCXVuc2lnbmVkIG1heF9mbGluZTsKKwl1bnNpZ25lZCBtYXhfbGluZW5vOyAvKiB0aGlzIG9uZSB0cmFja3MgbGluZXdyYXAgKi8KKwl1bnNpZ25lZCBtYXhfZGlzcGxheWVkX2xpbmU7CisJdW5zaWduZWQgd2lkdGg7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19XSU5DSAorCXVuc2lnbmVkIHdpbmNoX2NvdW50ZXI7CisjZW5kaWYKKwlzc2l6ZV90IGVvZl9lcnJvcjsgLyogZW9mIGlmIDAsIGVycm9yIGlmIDwgMCAqLworCXNzaXplX3QgcmVhZHBvczsKKwlzc2l6ZV90IHJlYWRlb2Y7IC8qIG11c3QgYmUgc2lnbmVkICovCisJY29uc3QgY2hhciAqKmJ1ZmZlcjsKKwljb25zdCBjaGFyICoqZmxpbmVzOworCWNvbnN0IGNoYXIgKmVtcHR5X2xpbmVfbWFya2VyOworCXVuc2lnbmVkIG51bV9maWxlczsKKwl1bnNpZ25lZCBjdXJyZW50X2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqKmZpbGVzOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTUFSS1MKKwl1bnNpZ25lZCBudW1fbWFya3M7CisJdW5zaWduZWQgbWFya19saW5lc1sxNV1bMl07CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCXVuc2lnbmVkICptYXRjaF9saW5lczsKKwlpbnQgbWF0Y2hfcG9zOyAvKiBzaWduZWQhICovCisJaW50IHdhbnRlZF9tYXRjaDsgLyogc2lnbmVkISAqLworCWludCBudW1fbWF0Y2hlczsKKwlyZWdleF90IHBhdHRlcm47CisJc21hbGxpbnQgcGF0dGVybl92YWxpZDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisJc21hbGxpbnQgd2luc2l6ZV9lcnI7CisjZW5kaWYKKwlzbWFsbGludCB0ZXJtaW5hdGVkOworCXN0cnVjdCB0ZXJtaW9zIHRlcm1fb3JpZywgdGVybV9sZXNzOworCWNoYXIga2JkX2lucHV0W0tFWUNPREVfQlVGRkVSX1NJWkVdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBjdXJfZmxpbmUgICAgICAgICAgIChHLmN1cl9mbGluZSAgICAgICAgICkKKyNkZWZpbmUga2JkX2ZkICAgICAgICAgICAgICAoRy5rYmRfZmQgICAgICAgICAgICApCisjZGVmaW5lIGxlc3NfZ2V0c19wb3MgICAgICAgKEcubGVzc19nZXRzX3BvcyAgICAgKQorI2RlZmluZSBsYXN0X2xpbmVfcG9zICAgICAgIChHLmxhc3RfbGluZV9wb3MgICAgICkKKyNkZWZpbmUgbWF4X2ZsaW5lICAgICAgICAgICAoRy5tYXhfZmxpbmUgICAgICAgICApCisjZGVmaW5lIG1heF9saW5lbm8gICAgICAgICAgKEcubWF4X2xpbmVubyAgICAgICAgKQorI2RlZmluZSBtYXhfZGlzcGxheWVkX2xpbmUgIChHLm1heF9kaXNwbGF5ZWRfbGluZSkKKyNkZWZpbmUgd2lkdGggICAgICAgICAgICAgICAoRy53aWR0aCAgICAgICAgICAgICApCisjZGVmaW5lIHdpbmNoX2NvdW50ZXIgICAgICAgKEcud2luY2hfY291bnRlciAgICAgKQorLyogVGhpcyBvbmUgaXMgMTAwJSBub3QgY2FjaGVkIGJ5IGNvbXBpbGVyIG9uIHJlYWQgYWNjZXNzICovCisjZGVmaW5lIFdJTkNIX0NPVU5URVIgKCoodm9sYXRpbGUgdW5zaWduZWQgKikmd2luY2hfY291bnRlcikKKyNkZWZpbmUgZW9mX2Vycm9yICAgICAgICAgICAoRy5lb2ZfZXJyb3IgICAgICAgICApCisjZGVmaW5lIHJlYWRwb3MgICAgICAgICAgICAgKEcucmVhZHBvcyAgICAgICAgICAgKQorI2RlZmluZSByZWFkZW9mICAgICAgICAgICAgIChHLnJlYWRlb2YgICAgICAgICAgICkKKyNkZWZpbmUgYnVmZmVyICAgICAgICAgICAgICAoRy5idWZmZXIgICAgICAgICAgICApCisjZGVmaW5lIGZsaW5lcyAgICAgICAgICAgICAgKEcuZmxpbmVzICAgICAgICAgICAgKQorI2RlZmluZSBlbXB0eV9saW5lX21hcmtlciAgIChHLmVtcHR5X2xpbmVfbWFya2VyICkKKyNkZWZpbmUgbnVtX2ZpbGVzICAgICAgICAgICAoRy5udW1fZmlsZXMgICAgICAgICApCisjZGVmaW5lIGN1cnJlbnRfZmlsZSAgICAgICAgKEcuY3VycmVudF9maWxlICAgICAgKQorI2RlZmluZSBmaWxlbmFtZSAgICAgICAgICAgIChHLmZpbGVuYW1lICAgICAgICAgICkKKyNkZWZpbmUgZmlsZXMgICAgICAgICAgICAgICAoRy5maWxlcyAgICAgICAgICAgICApCisjZGVmaW5lIG51bV9tYXJrcyAgICAgICAgICAgKEcubnVtX21hcmtzICAgICAgICAgKQorI2RlZmluZSBtYXJrX2xpbmVzICAgICAgICAgIChHLm1hcmtfbGluZXMgICAgICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorI2RlZmluZSBtYXRjaF9saW5lcyAgICAgICAgIChHLm1hdGNoX2xpbmVzICAgICAgICkKKyNkZWZpbmUgbWF0Y2hfcG9zICAgICAgICAgICAoRy5tYXRjaF9wb3MgICAgICAgICApCisjZGVmaW5lIG51bV9tYXRjaGVzICAgICAgICAgKEcubnVtX21hdGNoZXMgICAgICAgKQorI2RlZmluZSB3YW50ZWRfbWF0Y2ggICAgICAgIChHLndhbnRlZF9tYXRjaCAgICAgICkKKyNkZWZpbmUgcGF0dGVybiAgICAgICAgICAgICAoRy5wYXR0ZXJuICAgICAgICAgICApCisjZGVmaW5lIHBhdHRlcm5fdmFsaWQgICAgICAgKEcucGF0dGVybl92YWxpZCAgICAgKQorI2VuZGlmCisjZGVmaW5lIHRlcm1pbmF0ZWQgICAgICAgICAgKEcudGVybWluYXRlZCAgICAgICAgKQorI2RlZmluZSB0ZXJtX29yaWcgICAgICAgICAgIChHLnRlcm1fb3JpZyAgICAgICAgICkKKyNkZWZpbmUgdGVybV9sZXNzICAgICAgICAgICAoRy50ZXJtX2xlc3MgICAgICAgICApCisjZGVmaW5lIGtiZF9pbnB1dCAgICAgICAgICAgKEcua2JkX2lucHV0ICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWxlc3NfZ2V0c19wb3MgPSAtMTsgXAorCWVtcHR5X2xpbmVfbWFya2VyID0gIn4iOyBcCisJbnVtX2ZpbGVzID0gMTsgXAorCWN1cnJlbnRfZmlsZSA9IDE7IFwKKwllb2ZfZXJyb3IgPSAxOyBcCisJdGVybWluYXRlZCA9IDE7IFwKKwlJRl9GRUFUVVJFX0xFU1NfUkVHRVhQKHdhbnRlZF9tYXRjaCA9IC0xOykgXAorfSB3aGlsZSAoMCkKKworLyogZmxpbmVzW10gYXJlIGxpbmVzIHJlYWQgZnJvbSBzdGRpbiwgZWFjaCBpbiBtYWxsb2MnZWQgYnVmZmVyLgorICogTGluZSBudW1iZXJzIGFyZSBzdG9yZWQgYXMgdWludDMyX3QgcHJlcGVuZGVkIHRvIGVhY2ggbGluZS4KKyAqIFBvaW50ZXIgaXMgYWRqdXN0ZWQgc28gdGhhdCBmbGluZXNbaV0gcG9pbnRzIGRpcmVjdGx5IHBhc3QKKyAqIGxpbmUgbnVtYmVyLiBBY2Nlc29yOiAqLworI2RlZmluZSBNRU1QVFIocCkgKChjaGFyKikocCkgLSA0KQorI2RlZmluZSBMSU5FTk8ocCkgKCoodWludDMyX3QqKSgocCkgLSA0KSkKKworCisvKiBSZXNldCB0ZXJtaW5hbCBpbnB1dCB0byBub3JtYWwgKi8KK3N0YXRpYyB2b2lkIHNldF90dHlfY29va2VkKHZvaWQpCit7CisJZmZsdXNoX2FsbCgpOworCXRjc2V0YXR0cihrYmRfZmQsIFRDU0FOT1csICZ0ZXJtX29yaWcpOworfQorCisvKiBNb3ZlIHRoZSBjdXJzb3IgdG8gYSBwb3NpdGlvbiAoeCx5KSwgd2hlcmUgKDAsMCkgaXMgdGhlCisgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvbnNvbGUgKi8KK3N0YXRpYyB2b2lkIG1vdmVfY3Vyc29yKGludCBsaW5lLCBpbnQgcm93KQoreworCXByaW50ZihFU0MiWyV1OyV1SCIsIGxpbmUsIHJvdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2xpbmUodm9pZCkKK3sKKwlwcmludGYoRVNDIlsldTswSCIgQ0xFQVJfMl9FT0wsIG1heF9kaXNwbGF5ZWRfbGluZSArIDIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oaWxpdGUoY29uc3QgY2hhciAqc3RyKQoreworCXByaW50ZihISUdITElHSFQiJXMiTk9STUFMLCBzdHIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0dXNsaW5lKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljbGVhcl9saW5lKCk7CisJcHJpbnRmKEhJR0hMSUdIVCIlLipzIk5PUk1BTCwgd2lkdGggLSAxLCBzdHIpOworfQorCisvKiBFeGl0IHRoZSBwcm9ncmFtIGdyYWNlZnVsbHkgKi8KK3N0YXRpYyB2b2lkIGxlc3NfZXhpdChpbnQgY29kZSkKK3sKKwlzZXRfdHR5X2Nvb2tlZCgpOworCWNsZWFyX2xpbmUoKTsKKwlpZiAoY29kZSA8IDApCisJCWtpbGxfbXlzZWxmX3dpdGhfc2lnKC0gY29kZSk7IC8qIGRvZXMgbm90IHJldHVybiAqLworCWV4aXQoY29kZSk7Cit9CisKKyNpZiAoRU5BQkxFX0ZFQVRVUkVfTEVTU19EQVNIQ01EICYmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTElORU5VTVMpIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9MRVNTX1dJTkNICitzdGF0aWMgdm9pZCByZV93cmFwKHZvaWQpCit7CisJaW50IHcgPSB3aWR0aDsKKwlpbnQgbmV3X2xpbmVfcG9zOworCWludCBzcmNfaWR4OworCWludCBkc3RfaWR4OworCWludCBuZXdfY3VyX2ZsaW5lID0gMDsKKwl1aW50MzJfdCBsaW5lbm87CisJY2hhciBsaW5lYnVmW3cgKyAxXTsKKwljb25zdCBjaGFyICoqb2xkX2ZsaW5lcyA9IGZsaW5lczsKKwljb25zdCBjaGFyICpzOworCWNoYXIgKipuZXdfZmxpbmVzID0gTlVMTDsKKwljaGFyICpkOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX04pCisJCXcgLT0gODsKKworCXNyY19pZHggPSAwOworCWRzdF9pZHggPSAwOworCXMgPSBvbGRfZmxpbmVzWzBdOworCWxpbmVubyA9IExJTkVOTyhzKTsKKwlkID0gbGluZWJ1ZjsKKwluZXdfbGluZV9wb3MgPSAwOworCXdoaWxlICgxKSB7CisJCSpkID0gKnM7CisJCWlmICgqZCAhPSAnXDAnKSB7CisJCQluZXdfbGluZV9wb3MrKzsKKwkJCWlmICgqZCA9PSAnXHQnKSAvKiB0YWIgKi8KKwkJCQluZXdfbGluZV9wb3MgKz0gNzsKKwkJCXMrKzsKKwkJCWQrKzsKKwkJCWlmIChuZXdfbGluZV9wb3MgPj0gdykgeworCQkJCWludCBzejsKKwkJCQkvKiBuZXcgbGluZSBpcyBmdWxsLCBjcmVhdGUgbmV4dCBvbmUgKi8KKwkJCQkqZCA9ICdcMCc7CisgbmV4dF9uZXc6CisJCQkJc3ogPSAoZCAtIGxpbmVidWYpICsgMTsgLyogKyAxOiBOVUwgKi8KKwkJCQlkID0gKChjaGFyKil4bWFsbG9jKHN6ICsgNCkpICsgNDsKKwkJCQlMSU5FTk8oZCkgPSBsaW5lbm87CisJCQkJbWVtY3B5KGQsIGxpbmVidWYsIHN6KTsKKwkJCQluZXdfZmxpbmVzID0geHJlYWxsb2NfdmVjdG9yKG5ld19mbGluZXMsIDgsIGRzdF9pZHgpOworCQkJCW5ld19mbGluZXNbZHN0X2lkeF0gPSBkOworCQkJCWRzdF9pZHgrKzsKKwkJCQlpZiAobmV3X2xpbmVfcG9zIDwgdykgeworCQkJCQkvKiBpZiB3ZSBjYW1lIGhlcmUgdGhydSAiZ290byBuZXh0X25ldyIgKi8KKwkJCQkJaWYgKHNyY19pZHggPiBtYXhfZmxpbmUpCisJCQkJCQlicmVhazsKKwkJCQkJbGluZW5vID0gTElORU5PKHMpOworCQkJCX0KKwkJCQlkID0gbGluZWJ1ZjsKKwkJCQluZXdfbGluZV9wb3MgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyogKmQgPT0gTlVMOiBvbGQgbGluZSBlbmRlZCwgZ28gdG8gbmV4dCBvbGQgb25lICovCisJCWZyZWUoTUVNUFRSKG9sZF9mbGluZXNbc3JjX2lkeF0pKTsKKwkJLyogYnR3LCBjb252ZXJ0IGN1cl9mbGluZS4uLiAqLworCQlpZiAoY3VyX2ZsaW5lID09IHNyY19pZHgpCisJCQluZXdfY3VyX2ZsaW5lID0gZHN0X2lkeDsKKwkJc3JjX2lkeCsrOworCQkvKiBubyBtb3JlIGxpbmVzPyBmaW5pc2ggbGFzdCBuZXcgbGluZSAoYW5kIGV4aXQgdGhlIGxvb3ApICovCisJCWlmIChzcmNfaWR4ID4gbWF4X2ZsaW5lKQorCQkJZ290byBuZXh0X25ldzsKKwkJcyA9IG9sZF9mbGluZXNbc3JjX2lkeF07CisJCWlmIChsaW5lbm8gIT0gTElORU5PKHMpKSB7CisJCQkvKiB0aGlzIGlzIG5vdCBhIGNvbnRpbnVhdGlvbiBsaW5lIQorCQkJICogY3JlYXRlIG5leHQgX25ld18gbGluZSB0b28gKi8KKwkJCWdvdG8gbmV4dF9uZXc7CisJCX0KKwl9CisKKwlmcmVlKG9sZF9mbGluZXMpOworCWZsaW5lcyA9IChjb25zdCBjaGFyICoqKW5ld19mbGluZXM7CisKKwltYXhfZmxpbmUgPSBkc3RfaWR4IC0gMTsKKwlsYXN0X2xpbmVfcG9zID0gbmV3X2xpbmVfcG9zOworCWN1cl9mbGluZSA9IG5ld19jdXJfZmxpbmU7CisJLyogbWF4X2xpbmVubyBpcyBzY3JlZW4tc2l6ZSBpbmRlcGVuZGVudCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisJcGF0dGVybl92YWxpZCA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIGZpbGxfbWF0Y2hfbGluZXModW5zaWduZWQgcG9zKTsKKyNlbHNlCisjZGVmaW5lIGZpbGxfbWF0Y2hfbGluZXMocG9zKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBEZXZpbGlzaGx5IGNvbXBsZXggcm91dGluZS4KKyAqCisgKiBIYXMgdG8gZGVhbCB3aXRoIEVPRiBhbmQgRVBJUEUgb24gaW5wdXQsCisgKiB3aXRoIGxpbmUgd3JhcHBpbmcsIHdpdGggbGFzdCBsaW5lIG5vdCBlbmRpbmcgaW4gJ1xuJworICogKHBvc3NpYmx5IG5vdCBlbmRpbmcgWUVUISksIHdpdGggYmFja3NwYWNlIGFuZCB0YWJzLgorICogSXQgcmVhZHMgaW5wdXQgYWdhaW4gaWYgbGFzdCB0aW1lIHdlIGdvdCBhbiBFT0YgKHRodXMgc3VwcG9ydGluZworICogZ3Jvd2luZyBmaWxlcykgb3IgRVBJUEUgKHdhdGNoaW5nIG91dHB1dCBvZiBzbG93IHByb2Nlc3MgbGlrZSBtYWtlKS4KKyAqCisgKiBWYXJpYWJsZXMgdXNlZDoKKyAqIGZsaW5lc1tdIC0gYXJyYXkgb2YgbGluZXMgYWxyZWFkeSByZWFkLiBMaW5ld3JhcCBtYXkgY2F1c2UKKyAqICAgICAgb25lIHNvdXJjZSBmaWxlIGxpbmUgdG8gb2NjdXB5IHNldmVyYWwgZmxpbmVzW25dLgorICogZmxpbmVzW21heF9mbGluZV0gLSBsYXN0IGxpbmUsIHBvc3NpYmx5IGluY29tcGxldGUuCisgKiB0ZXJtaW5hdGVkIC0gMSBpZiBmbGluZXNbbWF4X2ZsaW5lXSBpcyAndGVybWluYXRlZCcKKyAqICAgICAgKGlmIHRoZXJlIHdhcyAnXG4nIFt3aGljaCBpc24ndCBzdG9yZWQgaXRzZWxmLCB3ZSBqdXN0IHJlbWVtYmVyCisgKiAgICAgIHRoYXQgaXQgd2FzIHNlZW5dKQorICogbWF4X2xpbmVubyAtIGxhc3QgbGluZSdzIG51bWJlciwgdGhpcyBvbmUgZG9lc24ndCBpbmNyZW1lbnQKKyAqICAgICAgb24gbGluZSB3cmFwLCBvbmx5IG9uICJyZWFsIiBuZXcgbGluZXMuCisgKiByZWFkYnVmWzAuLnJlYWRlb2YtMV0gLSBzbWFsbCBwcmVsaW1pbmFyeSBidWZmZXIuCisgKiByZWFkYnVmW3JlYWRwb3NdIC0gbmV4dCBjaGFyYWN0ZXIgdG8gYWRkIHRvIGN1cnJlbnQgbGluZS4KKyAqIGxhc3RfbGluZV9wb3MgLSBzY3JlZW4gbGluZSBwb3NpdGlvbiBvZiBuZXh0IGNoYXIgdG8gYmUgcmVhZAorICogICAgICAodGFrZXMgaW50byBhY2NvdW50IHRhYnMgYW5kIGJhY2tzcGFjZXMpCisgKiBlb2ZfZXJyb3IgLSA8IDAgZXJyb3IsID09IDAgRU9GLCA+IDAgbm90IEVPRi9lcnJvcgorICovCitzdGF0aWMgdm9pZCByZWFkX2xpbmVzKHZvaWQpCit7CisjZGVmaW5lIHJlYWRidWYgYmJfY29tbW9uX2J1ZnNpejEKKwljaGFyICpjdXJyZW50X2xpbmUsICpwOworCWludCB3ID0gd2lkdGg7CisJY2hhciBsYXN0X3Rlcm1pbmF0ZWQgPSB0ZXJtaW5hdGVkOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisJdW5zaWduZWQgb2xkX21heF9mbGluZSA9IG1heF9mbGluZTsKKwl0aW1lX3QgbGFzdF90aW1lID0gMDsKKwl1bnNpZ25lZCBzZWNvbmRzX3AxID0gMzsgLyogc2Vjb25kc190b19sb29wICsgMSAqLworI2VuZGlmCisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfTikKKwkJdyAtPSA4OworCisgSUZfRkVBVFVSRV9MRVNTX1JFR0VYUChhZ2FpbjA6KQorCisJcCA9IGN1cnJlbnRfbGluZSA9ICgoY2hhciopeG1hbGxvYyh3ICsgNCkpICsgNDsKKwltYXhfZmxpbmUgKz0gbGFzdF90ZXJtaW5hdGVkOworCWlmICghbGFzdF90ZXJtaW5hdGVkKSB7CisJCWNvbnN0IGNoYXIgKmNwID0gZmxpbmVzW21heF9mbGluZV07CisJCXN0cmNweShwLCBjcCk7CisJCXAgKz0gc3RybGVuKGN1cnJlbnRfbGluZSk7CisJCWZyZWUoTUVNUFRSKGZsaW5lc1ttYXhfZmxpbmVdKSk7CisJCS8qIGxhc3RfbGluZV9wb3MgaXMgc3RpbGwgdmFsaWQgZnJvbSBwcmV2aW91cyByZWFkX2xpbmVzKCkgKi8KKwl9IGVsc2UgeworCQlsYXN0X2xpbmVfcG9zID0gMDsKKwl9CisKKwl3aGlsZSAoMSkgeyAvKiByZWFkIGxpbmVzIHVudGlsIHdlIHJlYWNoIGN1cl9mbGluZSBvciB3YW50ZWRfbWF0Y2ggKi8KKwkJKnAgPSAnXDAnOworCQl0ZXJtaW5hdGVkID0gMDsKKwkJd2hpbGUgKDEpIHsgLyogcmVhZCBjaGFycyB1bnRpbCB3ZSBoYXZlIGEgbGluZSAqLworCQkJY2hhciBjOworCQkJLyogaWYgbm8gdW5wcm9jZXNzZWQgY2hhcnMgbGVmdCwgZWF0IG1vcmUgKi8KKwkJCWlmIChyZWFkcG9zID49IHJlYWRlb2YpIHsKKwkJCQluZGVsYXlfb24oMCk7CisJCQkJZW9mX2Vycm9yID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKTsKKwkJCQluZGVsYXlfb2ZmKDApOworCQkJCXJlYWRwb3MgPSAwOworCQkJCXJlYWRlb2YgPSBlb2ZfZXJyb3I7CisJCQkJaWYgKGVvZl9lcnJvciA8PSAwKQorCQkJCQlnb3RvIHJlYWNoZWRfZW9mOworCQkJfQorCQkJYyA9IHJlYWRidWZbcmVhZHBvc107CisJCQkvKiBiYWNrc3BhY2U/IFtuZWVkZWQgZm9yIG1hbnBhZ2VzXSAqLworCQkJLyogPHRhYj48YnM+IGlzIChhKSBpbnNhbmUgYW5kICovCisJCQkvKiAoYikgaGFyZGVyIHRvIGRvIGNvcnJlY3RseSwgc28gd2UgcmVmdXNlIHRvIGRvIGl0ICovCisJCQlpZiAoYyA9PSAnXHg4JyAmJiBsYXN0X2xpbmVfcG9zICYmIHBbLTFdICE9ICdcdCcpIHsKKwkJCQlyZWFkcG9zKys7IC8qIGVhdCBpdCAqLworCQkJCWxhc3RfbGluZV9wb3MtLTsKKwkJCS8qIHdhcyBidWdneSAocCBjb3VsZCBlbmQgdXAgPD0gY3VycmVudF9saW5lKS4uLiAqLworCQkJCSotLXAgPSAnXDAnOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJeworCQkJCXNpemVfdCBuZXdfbGFzdF9saW5lX3BvcyA9IGxhc3RfbGluZV9wb3MgKyAxOworCQkJCWlmIChjID09ICdcdCcpIHsKKwkJCQkJbmV3X2xhc3RfbGluZV9wb3MgKz0gNzsKKwkJCQkJbmV3X2xhc3RfbGluZV9wb3MgJj0gKH43KTsKKwkJCQl9CisJCQkJaWYgKChpbnQpbmV3X2xhc3RfbGluZV9wb3MgPj0gdykKKwkJCQkJYnJlYWs7CisJCQkJbGFzdF9saW5lX3BvcyA9IG5ld19sYXN0X2xpbmVfcG9zOworCQkJfQorCQkJLyogb2ssIHdlIHdpbGwgZWF0IHRoaXMgY2hhciAqLworCQkJcmVhZHBvcysrOworCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCXRlcm1pbmF0ZWQgPSAxOworCQkJCWxhc3RfbGluZV9wb3MgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTlVMIGlzIHN1YnN0aXR1dGVkIGJ5ICdcbichICovCisJCQlpZiAoYyA9PSAnXDAnKSBjID0gJ1xuJzsKKwkJCSpwKysgPSBjOworCQkJKnAgPSAnXDAnOworCQl9IC8qIGVuZCBvZiAicmVhZCBjaGFycyB1bnRpbCB3ZSBoYXZlIGEgbGluZSIgbG9vcCAqLworCQkvKiBDb3JuZXIgY2FzZTogbGluZXdyYXAgd2l0aCBvbmx5ICIiIHdyYXBwaW5nIHRvIG5leHQgbGluZSAqLworCQkvKiBMb29rcyB1Z2x5IG9uIHNjcmVlbiwgc28gd2UgZG8gbm90IHN0b3JlIHRoaXMgZW1wdHkgbGluZSAqLworCQlpZiAoIWxhc3RfdGVybWluYXRlZCAmJiAhY3VycmVudF9saW5lWzBdKSB7CisJCQlsYXN0X3Rlcm1pbmF0ZWQgPSAxOworCQkJbWF4X2xpbmVubysrOworCQkJY29udGludWU7CisJCX0KKyByZWFjaGVkX2VvZjoKKwkJbGFzdF90ZXJtaW5hdGVkID0gdGVybWluYXRlZDsKKwkJZmxpbmVzID0geHJlYWxsb2NfdmVjdG9yKGZsaW5lcywgOCwgbWF4X2ZsaW5lKTsKKworCQlmbGluZXNbbWF4X2ZsaW5lXSA9IChjaGFyKil4cmVhbGxvYyhNRU1QVFIoY3VycmVudF9saW5lKSwgc3RybGVuKGN1cnJlbnRfbGluZSkgKyAxICsgNCkgKyA0OworCQlMSU5FTk8oZmxpbmVzW21heF9mbGluZV0pID0gbWF4X2xpbmVubzsKKwkJaWYgKHRlcm1pbmF0ZWQpCisJCQltYXhfbGluZW5vKys7CisKKwkJaWYgKG1heF9mbGluZSA+PSBNQVhMSU5FUykgeworCQkJZW9mX2Vycm9yID0gMDsgLyogUHJldGVuZCB3ZSBzYXcgRU9GICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShvcHRpb25fbWFzazMyICYgRkxBR19TKQorCQkgID8gKG1heF9mbGluZSA+IGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSkKKwkJICA6IChtYXhfZmxpbmUgPj0gY3VyX2ZsaW5lCisJCSAgICAgJiYgbWF4X2xpbmVubyA+IExJTkVOTyhmbGluZXNbY3VyX2ZsaW5lXSkgKyBtYXhfZGlzcGxheWVkX2xpbmUpCisJCSkgeworI2lmICFFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCQkJYnJlYWs7CisjZWxzZQorCQkJaWYgKHdhbnRlZF9tYXRjaCA+PSBudW1fbWF0Y2hlcykgeyAvKiBnb3RvX21hdGNoIGNhbGxlZCB1cyAqLworCQkJCWZpbGxfbWF0Y2hfbGluZXMob2xkX21heF9mbGluZSk7CisJCQkJb2xkX21heF9mbGluZSA9IG1heF9mbGluZTsKKwkJCX0KKwkJCWlmICh3YW50ZWRfbWF0Y2ggPCBudW1fbWF0Y2hlcykKKwkJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWlmIChlb2ZfZXJyb3IgPD0gMCkgeworCQkJaWYgKGVvZl9lcnJvciA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisJCQkJCS8qIG5vdCB5ZXQgZW9mIG9yIGVycm9yLCByZXNldCBmbGFnIChvciBlbHNlCisJCQkJCSAqIHdlIHdpbGwgaG9nIENQVSAtIHNlbGVjdCgpIHdpbGwgcmV0dXJuCisJCQkJCSAqIGltbWVkaWF0ZWx5ICovCisJCQkJCWVvZl9lcnJvciA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRfc3RhdHVzbGluZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJfQorCQkJfQorI2lmICFFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCQkJYnJlYWs7CisjZWxzZQorCQkJaWYgKHdhbnRlZF9tYXRjaCA8IG51bV9tYXRjaGVzKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeyAvKiBnb3RvX21hdGNoIGNhbGxlZCB1cyAqLworCQkJCXRpbWVfdCB0ID0gdGltZShOVUxMKTsKKwkJCQlpZiAodCAhPSBsYXN0X3RpbWUpIHsKKwkJCQkJbGFzdF90aW1lID0gdDsKKwkJCQkJaWYgKC0tc2Vjb25kc19wMSA9PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNjaGVkX3lpZWxkKCk7CisJCQkJZ290byBhZ2FpbjA7IC8qIGdvIGxvb3AgYWdhaW4gKG1heCAyIHNlY29uZHMpICovCisJCQl9CisjZW5kaWYKKwkJfQorCQltYXhfZmxpbmUrKzsKKwkJY3VycmVudF9saW5lID0gKChjaGFyKil4bWFsbG9jKHcgKyA0KSkgKyA0OworCQlwID0gY3VycmVudF9saW5lOworCQlsYXN0X2xpbmVfcG9zID0gMDsKKwl9IC8qIGVuZCBvZiAicmVhZCBsaW5lcyB1bnRpbCB3ZSByZWFjaCBjdXJfZmxpbmUiIGxvb3AgKi8KKwlmaWxsX21hdGNoX2xpbmVzKG9sZF9tYXhfZmxpbmUpOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisJLyogcHJldmVudCB1cyBmcm9tIGJlaW5nIHN0dWNrIGluIHNlYXJjaCBmb3IgYSBtYXRjaCAqLworCXdhbnRlZF9tYXRjaCA9IC0xOworI2VuZGlmCisjdW5kZWYgcmVhZGJ1ZgorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19GTEFHUworLyogSW50ZXJlc3RpbmdseSwgd3JpdGluZyBjYWxjX3BlcmNlbnQgYXMgYSBmdW5jdGlvbiBzYXZlcyBhcm91bmQgMzIgYnl0ZXMKKyAqIG9uIG15IGJ1aWxkLiAqLworc3RhdGljIGludCBjYWxjX3BlcmNlbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBwID0gKDEwMCAqIChjdXJfZmxpbmUrbWF4X2Rpc3BsYXllZF9saW5lKzEpICsgbWF4X2ZsaW5lLzIpIC8gKG1heF9mbGluZSsxKTsKKwlyZXR1cm4gcCA8PSAxMDAgPyBwIDogMTAwOworfQorCisvKiBQcmludCBhIHN0YXR1cyBsaW5lIGlmIC1NIHdhcyBzcGVjaWZpZWQgKi8KK3N0YXRpYyB2b2lkIG1fc3RhdHVzX3ByaW50KHZvaWQpCit7CisJaW50IHBlcmNlbnRhZ2U7CisKKwlpZiAobGVzc19nZXRzX3BvcyA+PSAwKSAvKiBkb24ndCB0b3VjaCBzdGF0dXNsaW5lIHdoaWxlIGlucHV0IGlzIGRvbmUhICovCisJCXJldHVybjsKKworCWNsZWFyX2xpbmUoKTsKKwlwcmludGYoSElHSExJR0hUIiVzIiwgZmlsZW5hbWUpOworCWlmIChudW1fZmlsZXMgPiAxKQorCQlwcmludGYoIiAoZmlsZSAlaSBvZiAlaSkiLCBjdXJyZW50X2ZpbGUsIG51bV9maWxlcyk7CisJcHJpbnRmKCIgbGluZXMgJWktJWkvJWkgIiwKKwkJCWN1cl9mbGluZSArIDEsIGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSArIDEsCisJCQltYXhfZmxpbmUgKyAxKTsKKwlpZiAoY3VyX2ZsaW5lID49IChpbnQpKG1heF9mbGluZSAtIG1heF9kaXNwbGF5ZWRfbGluZSkpIHsKKwkJcHJpbnRmKCIoRU5EKSJOT1JNQUwpOworCQlpZiAobnVtX2ZpbGVzID4gMSAmJiBjdXJyZW50X2ZpbGUgIT0gbnVtX2ZpbGVzKQorCQkJcHJpbnRmKEhJR0hMSUdIVCIgLSBuZXh0OiAlcyJOT1JNQUwsIGZpbGVzW2N1cnJlbnRfZmlsZV0pOworCQlyZXR1cm47CisJfQorCXBlcmNlbnRhZ2UgPSBjYWxjX3BlcmNlbnQoKTsKKwlwcmludGYoIiVpJSUiTk9STUFMLCBwZXJjZW50YWdlKTsKK30KKyNlbmRpZgorCisvKiBQcmludCB0aGUgc3RhdHVzIGxpbmUgKi8KK3N0YXRpYyB2b2lkIHN0YXR1c19wcmludCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAobGVzc19nZXRzX3BvcyA+PSAwKSAvKiBkb24ndCB0b3VjaCBzdGF0dXNsaW5lIHdoaWxlIGlucHV0IGlzIGRvbmUhICovCisJCXJldHVybjsKKworCS8qIENoYW5nZSB0aGUgc3RhdHVzIGlmIGZsYWdzIGhhdmUgYmVlbiBzZXQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJaWYgKG9wdGlvbl9tYXNrMzIgJiAoRkxBR19NfEZMQUdfbSkpIHsKKwkJbV9zdGF0dXNfcHJpbnQoKTsKKwkJcmV0dXJuOworCX0KKwkvKiBObyBmbGFncyBzZXQgKi8KKyNlbmRpZgorCisJY2xlYXJfbGluZSgpOworCWlmIChjdXJfZmxpbmUgJiYgY3VyX2ZsaW5lIDwgKGludCkobWF4X2ZsaW5lIC0gbWF4X2Rpc3BsYXllZF9saW5lKSkgeworCQliYl9wdXRjaGFyKCc6Jyk7CisJCXJldHVybjsKKwl9CisJcCA9ICIoRU5EKSI7CisJaWYgKCFjdXJfZmxpbmUpCisJCXAgPSBmaWxlbmFtZTsKKwlpZiAobnVtX2ZpbGVzID4gMSkgeworCQlwcmludGYoSElHSExJR0hUIiVzIChmaWxlICVpIG9mICVpKSJOT1JNQUwsCisJCQkJcCwgY3VycmVudF9maWxlLCBudW1fZmlsZXMpOworCQlyZXR1cm47CisJfQorCXByaW50X2hpbGl0ZShwKTsKK30KKworc3RhdGljIHZvaWQgY2FwX2N1cl9mbGluZShpbnQgbmxpbmVzKQoreworCWludCBkaWZmOworCWlmIChjdXJfZmxpbmUgPCAwKQorCQljdXJfZmxpbmUgPSAwOworCWlmIChjdXJfZmxpbmUgKyBtYXhfZGlzcGxheWVkX2xpbmUgPiBtYXhfZmxpbmUgKyBUSUxERVMpIHsKKwkJY3VyX2ZsaW5lIC09IG5saW5lczsKKwkJaWYgKGN1cl9mbGluZSA8IDApCisJCQljdXJfZmxpbmUgPSAwOworCQlkaWZmID0gbWF4X2ZsaW5lIC0gKGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSkgKyBUSUxERVM7CisJCS8qIEFzIHRoZSBudW1iZXIgb2YgbGluZXMgcmVxdWVzdGVkIHdhcyB0b28gbGFyZ2UsIHdlIGp1c3QgbW92ZQorCQkgKiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisJCWlmIChkaWZmID4gMCkKKwkJCWN1cl9mbGluZSArPSBkaWZmOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgY29udHJvbHNbXSBBTElHTjEgPQorCS8qIE5VTDogbmV2ZXIgZW5jb3VudGVyZWQ7IFRBQjogbm90IGNvbnZlcnRlZCAqLworCS8qKi8iXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiICAiXHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgorCSJceDdmXHg5YiI7IC8qIERFTCBhbmQgaW5mYW1vdXMgTWV0YS1FU0MgOiggKi8KK3N0YXRpYyBjb25zdCBjaGFyIGN0cmxjb252W10gQUxJR04xID0KKwkvKiB3aHkgNDAgaW5zdGVhZCBvZiA0YSBiZWxvdz8gLSBpdCBpcyBhIHJlcGxhY2VtZW50IGZvciAnXG4nLgorCSAqICdcbicgaXMgYSBmb3JtZXIgTlVMIC0gd2Ugc3Vic3QgaXQgd2l0aCBALCBub3QgSiAqLworCSJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0N1x4NDhceDQ5XHg0MFx4NGJceDRjXHg0ZFx4NGVceDRmIgorCSJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1N1x4NThceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmIjsKKworc3RhdGljIHZvaWQgbGluZW5vX3N0cihjaGFyICpuYnVmOSwgY29uc3QgY2hhciAqbGluZSkKK3sKKwluYnVmOVswXSA9ICdcMCc7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX04pIHsKKwkJY29uc3QgY2hhciAqZm10OworCQl1bnNpZ25lZCBuOworCisJCWlmIChsaW5lID09IGVtcHR5X2xpbmVfbWFya2VyKSB7CisJCQltZW1zZXQobmJ1ZjksICcgJywgOCk7CisJCQluYnVmOVs4XSA9ICdcMCc7CisJCQlyZXR1cm47CisJCX0KKwkJLyogV2lkdGggb2YgNyBwcmVzZXJ2ZXMgdGFiIHNwYWNpbmcgaW4gdGhlIHRleHQgKi8KKwkJZm10ID0gIiU3dSAiOworCQluID0gTElORU5PKGxpbmUpICsgMTsKKwkJaWYgKG4gPiA5OTk5OTk5KSB7CisJCQluICU9IDEwMDAwMDAwOworCQkJZm10ID0gIiUwN3UgIjsKKwkJfQorCQlzcHJpbnRmKG5idWY5LCBmbXQsIG4pOworCX0KK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIHByaW50X2ZvdW5kKGNvbnN0IGNoYXIgKmxpbmUpCit7CisJaW50IG1hdGNoX3N0YXR1czsKKwlpbnQgZWZsYWdzOworCWNoYXIgKmdyb3dsaW5lOworCXJlZ21hdGNoX3QgbWF0Y2hfc3RydWN0czsKKworCWNoYXIgYnVmW3dpZHRoXTsKKwljaGFyIG5idWY5WzldOworCWNvbnN0IGNoYXIgKnN0ciA9IGxpbmU7CisJY2hhciAqcCA9IGJ1ZjsKKwlzaXplX3QgbjsKKworCXdoaWxlICgqc3RyKSB7CisJCW4gPSBzdHJjc3BuKHN0ciwgY29udHJvbHMpOworCQlpZiAobikgeworCQkJaWYgKCFzdHJbbl0pIGJyZWFrOworCQkJbWVtY3B5KHAsIHN0ciwgbik7CisJCQlwICs9IG47CisJCQlzdHIgKz0gbjsKKwkJfQorCQluID0gc3Ryc3BuKHN0ciwgY29udHJvbHMpOworCQltZW1zZXQocCwgJy4nLCBuKTsKKwkJcCArPSBuOworCQlzdHIgKz0gbjsKKwl9CisJc3RyY3B5KHAsIHN0cik7CisKKwkvKiBidWZbXSBob2xkcyBxdWFyYW50aW5lZCB2ZXJzaW9uIG9mIHN0ciAqLworCisJLyogRWFjaCBwYXJ0IG9mIHRoZSBsaW5lIHRoYXQgbWF0Y2hlcyBoYXMgdGhlIEhJR0hMSUdIVAorCSAgIGFuZCBOT1JNQUwgZXNjYXBlIHNlcXVlbmNlcyBwbGFjZWQgYXJvdW5kIGl0LgorCSAgIE5COiB3ZSByZWdleCBhZ2FpbnN0IGxpbmUsIGJ1dCBpbnNlcnQgdGV4dAorCSAgIGZyb20gcXVhcmFudGluZWQgY29weSAoYnVmW10pICovCisJc3RyID0gYnVmOworCWdyb3dsaW5lID0gTlVMTDsKKwllZmxhZ3MgPSAwOworCWdvdG8gc3RhcnQ7CisKKwl3aGlsZSAobWF0Y2hfc3RhdHVzID09IDApIHsKKwkJY2hhciAqbmV3ID0geGFzcHJpbnRmKCIlcyUuKnMiSElHSExJR0hUIiUuKnMiTk9STUFMLAorCQkJCWdyb3dsaW5lID8gZ3Jvd2xpbmUgOiAiIiwKKwkJCQkoaW50KW1hdGNoX3N0cnVjdHMucm1fc28sIHN0ciwKKwkJCQkoaW50KShtYXRjaF9zdHJ1Y3RzLnJtX2VvIC0gbWF0Y2hfc3RydWN0cy5ybV9zbyksCisJCQkJCQlzdHIgKyBtYXRjaF9zdHJ1Y3RzLnJtX3NvKTsKKwkJZnJlZShncm93bGluZSk7CisJCWdyb3dsaW5lID0gbmV3OworCQlzdHIgKz0gbWF0Y2hfc3RydWN0cy5ybV9lbzsKKwkJbGluZSArPSBtYXRjaF9zdHJ1Y3RzLnJtX2VvOworCQllZmxhZ3MgPSBSRUdfTk9UQk9MOworIHN0YXJ0OgorCQkvKiBNb3N0IG9mIHRoZSB0aW1lIGRvZXNuJ3QgZmluZCB0aGUgcmVnZXgsIG9wdGltaXplIGZvciB0aGF0ICovCisJCW1hdGNoX3N0YXR1cyA9IHJlZ2V4ZWMoJnBhdHRlcm4sIGxpbmUsIDEsICZtYXRjaF9zdHJ1Y3RzLCBlZmxhZ3MpOworCQkvKiBpZiBldmVuICIiIG1hdGNoZXMsIHRyZWF0IGl0IGFzICJub3QgYSBtYXRjaCIgKi8KKwkJaWYgKG1hdGNoX3N0cnVjdHMucm1fc28gPj0gbWF0Y2hfc3RydWN0cy5ybV9lbykKKwkJCW1hdGNoX3N0YXR1cyA9IDE7CisJfQorCisJbGluZW5vX3N0cihuYnVmOSwgbGluZSk7CisJaWYgKCFncm93bGluZSkgeworCQlwcmludGYoQ0xFQVJfMl9FT0wiJXMlc1xuIiwgbmJ1ZjksIHN0cik7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKENMRUFSXzJfRU9MIiVzJXMlc1xuIiwgbmJ1ZjksIGdyb3dsaW5lLCBzdHIpOworCWZyZWUoZ3Jvd2xpbmUpOworfQorI2Vsc2UKK3ZvaWQgcHJpbnRfZm91bmQoY29uc3QgY2hhciAqbGluZSk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgcHJpbnRfYXNjaWkoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgYnVmW3dpZHRoXTsKKwljaGFyIG5idWY5WzldOworCWNoYXIgKnA7CisJc2l6ZV90IG47CisKKwlsaW5lbm9fc3RyKG5idWY5LCBzdHIpOworCXByaW50ZihDTEVBUl8yX0VPTCIlcyIsIG5idWY5KTsKKworCXdoaWxlICgqc3RyKSB7CisJCW4gPSBzdHJjc3BuKHN0ciwgY29udHJvbHMpOworCQlpZiAobikgeworCQkJaWYgKCFzdHJbbl0pIGJyZWFrOworCQkJcHJpbnRmKCIlLipzIiwgKGludCkgbiwgc3RyKTsKKwkJCXN0ciArPSBuOworCQl9CisJCW4gPSBzdHJzcG4oc3RyLCBjb250cm9scyk7CisJCXAgPSBidWY7CisJCWRvIHsKKwkJCWlmICgqc3RyID09IDB4N2YpCisJCQkJKnArKyA9ICc/JzsKKwkJCWVsc2UgaWYgKCpzdHIgPT0gKGNoYXIpMHg5YikKKwkJCS8qIFZUMTAwJ3MgQ1NJLCBha2EgTWV0YS1FU0MuIFdobydzIGludmVudG9yPyAqLworCQkJLyogSSB3YW50IHRvIGtub3cgd2hvIGNvbW1pdHRlZCB0aGlzIHNpbiAqLworCQkJCSpwKysgPSAneyc7CisJCQllbHNlCisJCQkJKnArKyA9IGN0cmxjb252Wyh1bnNpZ25lZCBjaGFyKSpzdHJdOworCQkJc3RyKys7CisJCX0gd2hpbGUgKC0tbik7CisJCSpwID0gJ1wwJzsKKwkJcHJpbnRfaGlsaXRlKGJ1Zik7CisJfQorCXB1dHMoc3RyKTsKK30KKworLyogUHJpbnQgdGhlIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgYnVmZmVyX3ByaW50KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCW1vdmVfY3Vyc29yKDAsIDApOworCWZvciAoaSA9IDA7IGkgPD0gbWF4X2Rpc3BsYXllZF9saW5lOyBpKyspCisJCWlmIChwYXR0ZXJuX3ZhbGlkKQorCQkJcHJpbnRfZm91bmQoYnVmZmVyW2ldKTsKKwkJZWxzZQorCQkJcHJpbnRfYXNjaWkoYnVmZmVyW2ldKTsKKwlzdGF0dXNfcHJpbnQoKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2ZpbGxfYW5kX3ByaW50KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0RBU0hDTUQKKwlpbnQgZnBvcyA9IGN1cl9mbGluZTsKKworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19TKSB7CisJCS8qIEdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGxpbmUgKi8KKwkJd2hpbGUgKGZwb3MgJiYgTElORU5PKGZsaW5lc1tmcG9zXSkgPT0gTElORU5PKGZsaW5lc1tmcG9zLTFdKSkKKwkJCWZwb3MtLTsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8PSBtYXhfZGlzcGxheWVkX2xpbmUgJiYgZnBvcyA8PSBtYXhfZmxpbmUpIHsKKwkJaW50IGxpbmVubyA9IExJTkVOTyhmbGluZXNbZnBvc10pOworCQlidWZmZXJbaV0gPSBmbGluZXNbZnBvc107CisJCWkrKzsKKwkJZG8geworCQkJZnBvcysrOworCQl9IHdoaWxlICgoZnBvcyA8PSBtYXhfZmxpbmUpCisJCSAgICAgICYmIChvcHRpb25fbWFzazMyICYgRkxBR19TKQorCQkgICAgICAmJiBsaW5lbm8gPT0gTElORU5PKGZsaW5lc1tmcG9zXSkKKwkJKTsKKwl9CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPD0gbWF4X2Rpc3BsYXllZF9saW5lICYmIGN1cl9mbGluZSArIGkgPD0gbWF4X2ZsaW5lOyBpKyspIHsKKwkJYnVmZmVyW2ldID0gZmxpbmVzW2N1cl9mbGluZSArIGldOworCX0KKyNlbmRpZgorCWZvciAoOyBpIDw9IG1heF9kaXNwbGF5ZWRfbGluZTsgaSsrKSB7CisJCWJ1ZmZlcltpXSA9IGVtcHR5X2xpbmVfbWFya2VyOworCX0KKwlidWZmZXJfcHJpbnQoKTsKK30KKworLyogTW92ZSB0aGUgYnVmZmVyIHVwIGFuZCBkb3duIGluIHRoZSBmaWxlIGluIG9yZGVyIHRvIHNjcm9sbCAqLworc3RhdGljIHZvaWQgYnVmZmVyX2Rvd24oaW50IG5saW5lcykKK3sKKwljdXJfZmxpbmUgKz0gbmxpbmVzOworCXJlYWRfbGluZXMoKTsKKwljYXBfY3VyX2ZsaW5lKG5saW5lcyk7CisJYnVmZmVyX2ZpbGxfYW5kX3ByaW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl91cChpbnQgbmxpbmVzKQoreworCWN1cl9mbGluZSAtPSBubGluZXM7CisJaWYgKGN1cl9mbGluZSA8IDApIGN1cl9mbGluZSA9IDA7CisJcmVhZF9saW5lcygpOworCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfbGluZShpbnQgbGluZW51bSkKK3sKKwlpZiAobGluZW51bSA8IDApCisJCWxpbmVudW0gPSAwOworCWN1cl9mbGluZSA9IGxpbmVudW07CisJcmVhZF9saW5lcygpOworCWlmIChsaW5lbnVtICsgbWF4X2Rpc3BsYXllZF9saW5lID4gbWF4X2ZsaW5lKQorCQlsaW5lbnVtID0gbWF4X2ZsaW5lIC0gbWF4X2Rpc3BsYXllZF9saW5lICsgVElMREVTOworCWlmIChsaW5lbnVtIDwgMCkKKwkJbGluZW51bSA9IDA7CisJY3VyX2ZsaW5lID0gbGluZW51bTsKKwlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKK30KKworc3RhdGljIHZvaWQgb3Blbl9maWxlX2FuZF9yZWFkX2xpbmVzKHZvaWQpCit7CisJaWYgKGZpbGVuYW1lKSB7CisJCXhtb3ZlX2ZkKHhvcGVuKGZpbGVuYW1lLCBPX1JET05MWSksIFNURElOX0ZJTEVOTyk7CisJfSBlbHNlIHsKKwkJLyogImxlc3MiIHdpdGggbm8gYXJndW1lbnRzIGluIGFyZ3ZbXSAqLworCQkvKiBGb3Igc3RhdHVzIGxpbmUgb25seSAqLworCQlmaWxlbmFtZSA9IHhzdHJkdXAoYmJfbXNnX3N0YW5kYXJkX2lucHV0KTsKKwl9CisJcmVhZHBvcyA9IDA7CisJcmVhZGVvZiA9IDA7CisJbGFzdF9saW5lX3BvcyA9IDA7CisJdGVybWluYXRlZCA9IDE7CisJcmVhZF9saW5lcygpOworfQorCisvKiBSZWluaXRpYWxpemUgZXZlcnl0aGluZyBmb3IgYSBuZXcgZmlsZSAtIGZyZWUgdGhlIG1lbW9yeSBhbmQgc3RhcnQgb3ZlciAqLworc3RhdGljIHZvaWQgcmVpbml0aWFsaXplKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChmbGluZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBtYXhfZmxpbmU7IGkrKykKKwkJCWZyZWUoTUVNUFRSKGZsaW5lc1tpXSkpOworCQlmcmVlKGZsaW5lcyk7CisJCWZsaW5lcyA9IE5VTEw7CisJfQorCisJbWF4X2ZsaW5lID0gLTE7CisJY3VyX2ZsaW5lID0gMDsKKwltYXhfbGluZW5vID0gMDsKKwlvcGVuX2ZpbGVfYW5kX3JlYWRfbGluZXMoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTAorCWlmIChHLndpbnNpemVfZXJyKQorCQlwcmludGYoIlwwMzNbOTk5Ozk5OUgiICJcMDMzWzZuIik7CisjZW5kaWYKKwlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0Y2hfbm93YWl0KHZvaWQpCit7CisJaW50IHJkOworCWludDY0X3Qga2V5NjQ7CisJc3RydWN0IHBvbGxmZCBwZmRbMl07CisKKwlwZmRbMF0uZmQgPSBTVERJTl9GSUxFTk87CisJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwlwZmRbMV0uZmQgPSBrYmRfZmQ7CisJcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKyBhZ2FpbjoKKwl0Y3NldGF0dHIoa2JkX2ZkLCBUQ1NBTk9XLCAmdGVybV9sZXNzKTsKKwkvKiBOQjogc2VsZWN0L3BvbGwgcmV0dXJucyB3aGVuZXZlciByZWFkIHdpbGwgbm90IGJsb2NrLiBUaGVyZWZvcmU6CisJICogaWYgZW9mIGlzIHJlYWNoZWQsIHNlbGVjdC9wb2xsIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5CisJICogYmVjYXVzZSByZWFkIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIDAgYnl0ZXMuCisJICogRXZlbiBpZiBzZWxlY3QvcG9sbCBzYXlzIHRoYXQgaW5wdXQgaXMgYXZhaWxhYmxlLCByZWFkIENBTiBibG9jaworCSAqIChzd2l0Y2ggZmQgaW50byBPX05PTkJMT0NLJ2VkIG1vZGUgdG8gYXZvaWQgaXQpCisJICovCisJcmQgPSAxOworCS8qIEFyZSB3ZSBpbnRlcmVzdGVkIGluIHN0ZGluPyAqLworLy9UT0RPOiByZXVzZSBjb2RlIGZvciBkZXRlcm1pbmluZyB0aGlzCisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUykKKwkgICA/ICEobWF4X2ZsaW5lID4gY3VyX2ZsaW5lICsgbWF4X2Rpc3BsYXllZF9saW5lKQorCSAgIDogIShtYXhfZmxpbmUgPj0gY3VyX2ZsaW5lCisJICAgICAgICYmIG1heF9saW5lbm8gPiBMSU5FTk8oZmxpbmVzW2N1cl9mbGluZV0pICsgbWF4X2Rpc3BsYXllZF9saW5lKQorCSkgeworCQlpZiAoZW9mX2Vycm9yID4gMCkgLyogZGlkIE5PVCByZWFjaCBlb2YgeWV0ICovCisJCQlyZCA9IDA7IC8qIHllcywgd2UgYXJlIGludGVyZXN0ZWQgaW4gc3RkaW4gKi8KKwl9CisJLyogUG9zaXRpb24gY3Vyc29yIGlmIGxpbmUgaW5wdXQgaXMgZG9uZSAqLworCWlmIChsZXNzX2dldHNfcG9zID49IDApCisJCW1vdmVfY3Vyc29yKG1heF9kaXNwbGF5ZWRfbGluZSArIDIsIGxlc3NfZ2V0c19wb3MgKyAxKTsKKwlmZmx1c2hfYWxsKCk7CisKKwlpZiAoa2JkX2lucHV0WzBdID09IDApIHsgLyogaWYgbm90aGluZyBpcyBidWZmZXJlZCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKKwkJd2hpbGUgKDEpIHsKKwkJCWludCByOworCQkJLyogTkI6IFNJR1dJTkNIIGludGVycnVwdHMgcG9sbCgpICovCisJCQlyID0gcG9sbChwZmQgKyByZCwgMiAtIHJkLCAtMSk7CisJCQlpZiAoLypyIDwgMCAmJiBlcnJubyA9PSBFSU5UUiAmJiovIHdpbmNoX2NvdW50ZXIpCisJCQkJcmV0dXJuICdcXCc7IC8qIGFueXRoaW5nIHdoaWNoIGhhcyBubyBkZWZpbmVkIGZ1bmN0aW9uICovCisJCQlpZiAocikgYnJlYWs7CisJCX0KKyNlbHNlCisJCXNhZmVfcG9sbChwZmQgKyByZCwgMiAtIHJkLCAtMSk7CisjZW5kaWYKKwl9CisKKwkvKiBXZSBoYXZlIGtiZF9mZCBpbiBPX05PTkJMT0NLIG1vZGUsIHJlYWQgaW5zaWRlIHJlYWRfa2V5KCkKKwkgKiB3b3VsZCBub3QgYmxvY2sgZXZlbiBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUgKi8KKwlrZXk2NCA9IHJlYWRfa2V5KGtiZF9mZCwga2JkX2lucHV0LCAvKnRpbWVvdXQgb2ZmOiovIC0yKTsKKwlpZiAoKGludClrZXk2NCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisJCQkvKiBObyBrZXlib2FyZCBpbnB1dCBhdmFpbGFibGUuIFNpbmNlIHBvbGwoKSBkaWQgcmV0dXJuLAorCQkJICogd2Ugc2hvdWxkIGhhdmUgaW5wdXQgb24gc3RkaW4gKi8KKwkJCXJlYWRfbGluZXMoKTsKKwkJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQkvKiBFT0YvZXJyb3IgKHNzaCBzZXNzaW9uIGdvdCBraWxsZWQgZXRjKSAqLworCQlsZXNzX2V4aXQoMCk7CisJfQorCXNldF90dHlfY29va2VkKCk7CisJcmV0dXJuIGtleTY0OworfQorCisvKiBHcmFiIGEgY2hhcmFjdGVyIGZyb20gaW5wdXQgd2l0aG91dCByZXF1aXJpbmcgdGhlIHJldHVybiBrZXkuCisgKiBNYXkgcmV0dXJuIEtFWUNPREVfeHh4IHZhbHVlcy4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdvcmtzIGJlc3Qgd2l0aCByYXcgaW5wdXQuICovCitzdGF0aWMgaW50NjRfdCBsZXNzX2dldGNoKGludCBwb3MpCit7CisJaW50NjRfdCBrZXk2NDsKKwlpbnQga2V5OworCisgYWdhaW46CisJbGVzc19nZXRzX3BvcyA9IHBvczsKKwlrZXkgPSBrZXk2NCA9IGdldGNoX25vd2FpdCgpOworCWxlc3NfZ2V0c19wb3MgPSAtMTsKKworCS8qIERpc2NhcmQgQ3RybC1zb21ldGhpbmcgY2hhcnMuCisJICogKGNoZWNraW5nIG9ubHkgbG93ZXIgMzIgYml0cyBpcyBhIHNpemUgb3B0aW1pemF0aW9uOgorCSAqIHVwcGVyIDMyIGJpdHMgYXJlIHVzZWQgb25seSBieSBLRVlDT0RFX0NVUlNPUl9QT1MpCisJICovCisJaWYgKGtleSA+PSAwICYmIGtleSA8ICcgJyAmJiBrZXkgIT0gMHgwZCAmJiBrZXkgIT0gOCkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiBrZXk2NDsKK30KKworc3RhdGljIGNoYXIqIGxlc3NfZ2V0cyhpbnQgc3opCit7CisJaW50IGM7CisJdW5zaWduZWQgaSA9IDA7CisJY2hhciAqcmVzdWx0ID0geHphbGxvYygxKTsKKworCXdoaWxlICgxKSB7CisJCWMgPSAnXDAnOworCQlsZXNzX2dldHNfcG9zID0gc3ogKyBpOworCQljID0gZ2V0Y2hfbm93YWl0KCk7CisJCWlmIChjID09IDB4MGQpIHsKKwkJCXJlc3VsdFtpXSA9ICdcMCc7CisJCQlsZXNzX2dldHNfcG9zID0gLTE7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChjID09IDB4N2YpCisJCQljID0gODsKKwkJaWYgKGMgPT0gOCAmJiBpKSB7CisJCQlwcmludGYoIlx4OCBceDgiKTsKKwkJCWktLTsKKwkJfQorCQlpZiAoYyA8ICcgJykgLyogZmlsdGVycyBvdXQgS0VZQ09ERV94eHggdG9vICg8MCkgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoaSA+PSB3aWR0aCAtIHN6IC0gMSkKKwkJCWNvbnRpbnVlOyAvKiBsZW4gbGltaXQgKi8KKwkJYmJfcHV0Y2hhcihjKTsKKwkJcmVzdWx0W2krK10gPSBjOworCQlyZXN1bHQgPSB4cmVhbGxvYyhyZXN1bHQsIGkrMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGFtaW5lX2ZpbGUodm9pZCkKK3sKKwljaGFyICpuZXdfZm5hbWU7CisKKwlwcmludF9zdGF0dXNsaW5lKCJFeGFtaW5lOiAiKTsKKwluZXdfZm5hbWUgPSBsZXNzX2dldHMoc2l6ZW9mKCJFeGFtaW5lOiAiKSAtIDEpOworCWlmICghbmV3X2ZuYW1lWzBdKSB7CisJCXN0YXR1c19wcmludCgpOworIGVycjoKKwkJZnJlZShuZXdfZm5hbWUpOworCQlyZXR1cm47CisJfQorCWlmIChhY2Nlc3MobmV3X2ZuYW1lLCBSX09LKSAhPSAwKSB7CisJCXByaW50X3N0YXR1c2xpbmUoIkNhbm5vdCByZWFkIHRoaXMgZmlsZSIpOworCQlnb3RvIGVycjsKKwl9CisJZnJlZShmaWxlbmFtZSk7CisJZmlsZW5hbWUgPSBuZXdfZm5hbWU7CisJLyogZmlsZXMgc3RhcnQgYnkgPSBhcmd2LiB3aHkgd2UgYXNzdW1lIHRoYXQgYXJndiBpcyBpbmZpbml0ZWx5IGxvbmc/PworCWZpbGVzW251bV9maWxlc10gPSBmaWxlbmFtZTsKKwljdXJyZW50X2ZpbGUgPSBudW1fZmlsZXMgKyAxOworCW51bV9maWxlcysrOyAqLworCWZpbGVzWzBdID0gZmlsZW5hbWU7CisJbnVtX2ZpbGVzID0gY3VycmVudF9maWxlID0gMTsKKwlyZWluaXRpYWxpemUoKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBwYWdlZC4gZGlyZWN0aW9uIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqIC0xOiBnbyBiYWNrIG9uZSBmaWxlCisgKiAgMDogZ28gdG8gdGhlIGZpcnN0IGZpbGUKKyAqICAxOiBnbyBmb3J3YXJkIG9uZSBmaWxlICovCitzdGF0aWMgdm9pZCBjaGFuZ2VfZmlsZShpbnQgZGlyZWN0aW9uKQoreworCWlmIChjdXJyZW50X2ZpbGUgIT0gKChkaXJlY3Rpb24gPiAwKSA/IG51bV9maWxlcyA6IDEpKSB7CisJCWN1cnJlbnRfZmlsZSA9IGRpcmVjdGlvbiA/IGN1cnJlbnRfZmlsZSArIGRpcmVjdGlvbiA6IDE7CisJCWZyZWUoZmlsZW5hbWUpOworCQlmaWxlbmFtZSA9IHhzdHJkdXAoZmlsZXNbY3VycmVudF9maWxlIC0gMV0pOworCQlyZWluaXRpYWxpemUoKTsKKwl9IGVsc2UgeworCQlwcmludF9zdGF0dXNsaW5lKGRpcmVjdGlvbiA+IDAgPyAiTm8gbmV4dCBmaWxlIiA6ICJObyBwcmV2aW91cyBmaWxlIik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfY3VycmVudF9maWxlKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChudW1fZmlsZXMgPCAyKQorCQlyZXR1cm47CisKKwlpZiAoY3VycmVudF9maWxlICE9IDEpIHsKKwkJY2hhbmdlX2ZpbGUoLTEpOworCQlmb3IgKGkgPSAzOyBpIDw9IG51bV9maWxlczsgaSsrKQorCQkJZmlsZXNbaSAtIDJdID0gZmlsZXNbaSAtIDFdOworCQludW1fZmlsZXMtLTsKKwl9IGVsc2UgeworCQljaGFuZ2VfZmlsZSgxKTsKKwkJZm9yIChpID0gMjsgaSA8PSBudW1fZmlsZXM7IGkrKykKKwkJCWZpbGVzW2kgLSAyXSA9IGZpbGVzW2kgLSAxXTsKKwkJbnVtX2ZpbGVzLS07CisJCWN1cnJlbnRfZmlsZS0tOworCX0KK30KKworc3RhdGljIHZvaWQgY29sb25fcHJvY2Vzcyh2b2lkKQoreworCWludCBrZXlwcmVzczsKKworCS8qIENsZWFyIHRoZSBjdXJyZW50IGxpbmUgYW5kIHByaW50IGEgcHJvbXB0ICovCisJcHJpbnRfc3RhdHVzbGluZSgiIDoiKTsKKworCWtleXByZXNzID0gbGVzc19nZXRjaCgyKTsKKwlzd2l0Y2ggKGtleXByZXNzKSB7CisJY2FzZSAnZCc6CisJCXJlbW92ZV9jdXJyZW50X2ZpbGUoKTsKKwkJYnJlYWs7CisJY2FzZSAnZSc6CisJCWV4YW1pbmVfZmlsZSgpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJY2FzZSAnZic6CisJCW1fc3RhdHVzX3ByaW50KCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAnbic6CisJCWNoYW5nZV9maWxlKDEpOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJY2hhbmdlX2ZpbGUoLTEpOworCQlicmVhazsKKwljYXNlICdxJzoKKwkJbGVzc19leGl0KEVYSVRfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgJ3gnOgorCQljaGFuZ2VfZmlsZSgwKTsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9tYXRjaF9wb3MoaW50IG1hdGNoKQoreworCWlmIChtYXRjaCA+PSBudW1fbWF0Y2hlcykKKwkJbWF0Y2ggPSBudW1fbWF0Y2hlcyAtIDE7CisJaWYgKG1hdGNoIDwgMCkKKwkJbWF0Y2ggPSAwOworCW1hdGNoX3BvcyA9IG1hdGNoOworfQorCitzdGF0aWMgdm9pZCBnb3RvX21hdGNoKGludCBtYXRjaCkKK3sKKwlpZiAoIXBhdHRlcm5fdmFsaWQpCisJCXJldHVybjsKKwlpZiAobWF0Y2ggPCAwKQorCQltYXRjaCA9IDA7CisJLyogVHJ5IHRvIGZpbmQgbmV4dCBtYXRjaCBpZiBlb2YgaXNuJ3QgcmVhY2hlZCB5ZXQgKi8KKwlpZiAobWF0Y2ggPj0gbnVtX21hdGNoZXMgJiYgZW9mX2Vycm9yID4gMCkgeworCQl3YW50ZWRfbWF0Y2ggPSBtYXRjaDsgLyogIkkgd2FudCB0byByZWFkIHVudGlsIEkgc2VlIE4ndGggbWF0Y2giICovCisJCXJlYWRfbGluZXMoKTsKKwl9CisJaWYgKG51bV9tYXRjaGVzKSB7CisJCW5vcm1hbGl6ZV9tYXRjaF9wb3MobWF0Y2gpOworCQlidWZmZXJfbGluZShtYXRjaF9saW5lc1ttYXRjaF9wb3NdKTsKKwl9IGVsc2UgeworCQlwcmludF9zdGF0dXNsaW5lKCJObyBtYXRjaGVzIGZvdW5kIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX21hdGNoX2xpbmVzKHVuc2lnbmVkIHBvcykKK3sKKwlpZiAoIXBhdHRlcm5fdmFsaWQpCisJCXJldHVybjsKKwkvKiBSdW4gdGhlIHJlZ2V4IG9uIGVhY2ggbGluZSBvZiB0aGUgY3VycmVudCBmaWxlICovCisJd2hpbGUgKHBvcyA8PSBtYXhfZmxpbmUpIHsKKwkJLyogSWYgdGhpcyBsaW5lIG1hdGNoZXMgKi8KKwkJaWYgKHJlZ2V4ZWMoJnBhdHRlcm4sIGZsaW5lc1twb3NdLCAwLCBOVUxMLCAwKSA9PSAwCisJCS8qIGFuZCB3ZSBkaWRuJ3QgbWF0Y2ggaXQgbGFzdCB0aW1lICovCisJCSAmJiAhKG51bV9tYXRjaGVzICYmIG1hdGNoX2xpbmVzW251bV9tYXRjaGVzLTFdID09IHBvcykKKwkJKSB7CisJCQltYXRjaF9saW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihtYXRjaF9saW5lcywgNCwgbnVtX21hdGNoZXMpOworCQkJbWF0Y2hfbGluZXNbbnVtX21hdGNoZXMrK10gPSBwb3M7CisJCX0KKwkJcG9zKys7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWdleF9wcm9jZXNzKHZvaWQpCit7CisJY2hhciAqdW5jb21wX3JlZ2V4LCAqZXJyOworCisJLyogUmVzZXQgdmFyaWFibGVzICovCisJZnJlZShtYXRjaF9saW5lcyk7CisJbWF0Y2hfbGluZXMgPSBOVUxMOworCW1hdGNoX3BvcyA9IDA7CisJbnVtX21hdGNoZXMgPSAwOworCWlmIChwYXR0ZXJuX3ZhbGlkKSB7CisJCXJlZ2ZyZWUoJnBhdHRlcm4pOworCQlwYXR0ZXJuX3ZhbGlkID0gMDsKKwl9CisKKwkvKiBHZXQgdGhlIHVuY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHVzZXIgKi8KKwljbGVhcl9saW5lKCk7CisJYmJfcHV0Y2hhcigob3B0aW9uX21hc2szMiAmIExFU1NfU1RBVEVfTUFUQ0hfQkFDS1dBUkRTKSA/ICc/JyA6ICcvJyk7CisJdW5jb21wX3JlZ2V4ID0gbGVzc19nZXRzKDEpOworCWlmICghdW5jb21wX3JlZ2V4WzBdKSB7CisJCWZyZWUodW5jb21wX3JlZ2V4KTsKKwkJYnVmZmVyX3ByaW50KCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb21waWxlIHRoZSByZWdleCBhbmQgY2hlY2sgZm9yIGVycm9ycyAqLworCWVyciA9IHJlZ2NvbXBfb3JfZXJybXNnKCZwYXR0ZXJuLCB1bmNvbXBfcmVnZXgsCisJCQkJKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0kpID8gUkVHX0lDQVNFIDogMCk7CisJZnJlZSh1bmNvbXBfcmVnZXgpOworCWlmIChlcnIpIHsKKwkJcHJpbnRfc3RhdHVzbGluZShlcnIpOworCQlmcmVlKGVycik7CisJCXJldHVybjsKKwl9CisKKwlwYXR0ZXJuX3ZhbGlkID0gMTsKKwltYXRjaF9wb3MgPSAwOworCWZpbGxfbWF0Y2hfbGluZXMoMCk7CisJd2hpbGUgKG1hdGNoX3BvcyA8IG51bV9tYXRjaGVzKSB7CisJCWlmICgoaW50KW1hdGNoX2xpbmVzW21hdGNoX3Bvc10gPiBjdXJfZmxpbmUpCisJCQlicmVhazsKKwkJbWF0Y2hfcG9zKys7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgTEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFMpCisJCW1hdGNoX3Bvcy0tOworCisJLyogSXQncyBwb3NzaWJsZSB0aGF0IG5vIG1hdGNoZXMgYXJlIGZvdW5kIHlldC4KKwkgKiBnb3RvX21hdGNoKCkgd2lsbCByZWFkIGlucHV0IGxvb2tpbmcgZm9yIG1hdGNoLAorCSAqIGlmIG5lZWRlZCAqLworCWdvdG9fbWF0Y2gobWF0Y2hfcG9zKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBudW1iZXJfcHJvY2VzcyhpbnQgZmlyc3RfZGlnaXQpCit7CisJdW5zaWduZWQgaTsKKwlpbnQgbnVtOworCWludCBrZXlwcmVzczsKKwljaGFyIG51bV9pbnB1dFtzaXplb2YoaW50KSo0XTsgLyogbW9yZSB0aGFuIGVub3VnaCAqLworCisJbnVtX2lucHV0WzBdID0gZmlyc3RfZGlnaXQ7CisKKwkvKiBDbGVhciB0aGUgY3VycmVudCBsaW5lLCBwcmludCBhIHByb21wdCwgYW5kIHRoZW4gcHJpbnQgdGhlIGRpZ2l0ICovCisJY2xlYXJfbGluZSgpOworCXByaW50ZigiOiVjIiwgZmlyc3RfZGlnaXQpOworCisJLyogUmVjZWl2ZSBpbnB1dCB1bnRpbCBhIGxldHRlciBpcyBnaXZlbiAqLworCWkgPSAxOworCXdoaWxlIChpIDwgc2l6ZW9mKG51bV9pbnB1dCktMSkgeworCQlrZXlwcmVzcyA9IGxlc3NfZ2V0Y2goaSArIDEpOworCQlpZiAoKHVuc2lnbmVkKWtleXByZXNzID4gMjU1IHx8ICFpc2RpZ2l0KG51bV9pbnB1dFtpXSkpCisJCQlicmVhazsKKwkJbnVtX2lucHV0W2ldID0ga2V5cHJlc3M7CisJCWJiX3B1dGNoYXIoa2V5cHJlc3MpOworCQlpKys7CisJfQorCisJbnVtX2lucHV0W2ldID0gJ1wwJzsKKwludW0gPSBiYl9zdHJ0b3UobnVtX2lucHV0LCBOVUxMLCAxMCk7CisJLyogb24gZm9ybWF0IGVycm9yLCBudW0gPT0gLTEgKi8KKwlpZiAobnVtIDwgMSB8fCBudW0gPiBNQVhMSU5FUykgeworCQlidWZmZXJfcHJpbnQoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIG5vdyBrbm93IHRoZSBudW1iZXIgYW5kIHRoZSBsZXR0ZXIgZW50ZXJlZCwgc28gd2UgcHJvY2VzcyB0aGVtICovCisJc3dpdGNoIChrZXlwcmVzcykgeworCWNhc2UgS0VZQ09ERV9ET1dOOiBjYXNlICd6JzogY2FzZSAnZCc6IGNhc2UgJ2UnOiBjYXNlICcgJzogY2FzZSAnXDAxNSc6CisJCWJ1ZmZlcl9kb3duKG51bSk7CisJCWJyZWFrOworCWNhc2UgS0VZQ09ERV9VUDogY2FzZSAnYic6IGNhc2UgJ3cnOiBjYXNlICd5JzogY2FzZSAndSc6CisJCWJ1ZmZlcl91cChudW0pOworCQlicmVhazsKKwljYXNlICdnJzogY2FzZSAnPCc6IGNhc2UgJ0cnOiBjYXNlICc+JzoKKwkJY3VyX2ZsaW5lID0gbnVtICsgbWF4X2Rpc3BsYXllZF9saW5lOworCQlyZWFkX2xpbmVzKCk7CisJCWJ1ZmZlcl9saW5lKG51bSAtIDEpOworCQlicmVhazsKKwljYXNlICdwJzogY2FzZSAnJSc6CisJCW51bSA9IG51bSAqIChtYXhfZmxpbmUgLyAxMDApOyAvKiArIG1heF9mbGluZSAvIDI7ICovCisJCWN1cl9mbGluZSA9IG51bSArIG1heF9kaXNwbGF5ZWRfbGluZTsKKwkJcmVhZF9saW5lcygpOworCQlidWZmZXJfbGluZShudW0pOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCWNhc2UgJ24nOgorCQlnb3RvX21hdGNoKG1hdGNoX3BvcyArIG51bSk7CisJCWJyZWFrOworCWNhc2UgJy8nOgorCQlvcHRpb25fbWFzazMyICY9IH5MRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKwljYXNlICc/JzoKKwkJb3B0aW9uX21hc2szMiB8PSBMRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfREFTSENNRAorc3RhdGljIHZvaWQgZmxhZ19jaGFuZ2Uodm9pZCkKK3sKKwlpbnQga2V5cHJlc3M7CisKKwljbGVhcl9saW5lKCk7CisJYmJfcHV0Y2hhcignLScpOworCWtleXByZXNzID0gbGVzc19nZXRjaCgxKTsKKworCXN3aXRjaCAoa2V5cHJlc3MpIHsKKwljYXNlICdNJzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX007CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQlvcHRpb25fbWFzazMyIF49IEZMQUdfbTsKKwkJYnJlYWs7CisJY2FzZSAnRSc6CisJCW9wdGlvbl9tYXNrMzIgXj0gRkxBR19FOworCQlicmVhazsKKwljYXNlICd+JzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX1RJTERFOworCQlicmVhazsKKwljYXNlICdTJzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX1M7CisJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0xJTkVOVU1TCisJY2FzZSAnTic6CisJCW9wdGlvbl9tYXNrMzIgXj0gRkxBR19OOworCQlyZV93cmFwKCk7CisJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworI2lmZGVmIEJMT0FUCitzdGF0aWMgdm9pZCBzaG93X2ZsYWdfc3RhdHVzKHZvaWQpCit7CisJaW50IGtleXByZXNzOworCWludCBmbGFnX3ZhbDsKKworCWNsZWFyX2xpbmUoKTsKKwliYl9wdXRjaGFyKCdfJyk7CisJa2V5cHJlc3MgPSBsZXNzX2dldGNoKDEpOworCisJc3dpdGNoIChrZXlwcmVzcykgeworCWNhc2UgJ00nOgorCQlmbGFnX3ZhbCA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX007CisJCWJyZWFrOworCWNhc2UgJ20nOgorCQlmbGFnX3ZhbCA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX207CisJCWJyZWFrOworCWNhc2UgJ34nOgorCQlmbGFnX3ZhbCA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX1RJTERFOworCQlicmVhazsKKwljYXNlICdOJzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19OOworCQlicmVhazsKKwljYXNlICdFJzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbGFnX3ZhbCA9IDA7CisJCWJyZWFrOworCX0KKworCWNsZWFyX2xpbmUoKTsKKwlwcmludGYoSElHSExJR0hUIlRoZSBzdGF0dXMgb2YgdGhlIGZsYWcgaXM6ICV1Ik5PUk1BTCwgZmxhZ192YWwgIT0gMCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX0xFU1NfREFTSENNRCAqLworCitzdGF0aWMgdm9pZCBzYXZlX2lucHV0X3RvX2ZpbGUodm9pZCkKK3sKKwljb25zdCBjaGFyICptc2cgPSAiIjsKKwljaGFyICpjdXJyZW50X2xpbmU7CisJdW5zaWduZWQgaTsKKwlGSUxFICpmcDsKKworCXByaW50X3N0YXR1c2xpbmUoIkxvZyBmaWxlOiAiKTsKKwljdXJyZW50X2xpbmUgPSBsZXNzX2dldHMoc2l6ZW9mKCJMb2cgZmlsZTogIiktMSk7CisJaWYgKGN1cnJlbnRfbGluZVswXSkgeworCQlmcCA9IGZvcGVuX2Zvcl93cml0ZShjdXJyZW50X2xpbmUpOworCQlpZiAoIWZwKSB7CisJCQltc2cgPSAiRXJyb3Igb3BlbmluZyBsb2cgZmlsZSI7CisJCQlnb3RvIHJldDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDw9IG1heF9mbGluZTsgaSsrKQorCQkJZnByaW50ZihmcCwgIiVzXG4iLCBmbGluZXNbaV0pOworCQlmY2xvc2UoZnApOworCQltc2cgPSAiRG9uZSI7CisJfQorIHJldDoKKwlwcmludF9zdGF0dXNsaW5lKG1zZyk7CisJZnJlZShjdXJyZW50X2xpbmUpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19NQVJLUworc3RhdGljIHZvaWQgYWRkX21hcmsodm9pZCkKK3sKKwlpbnQgbGV0dGVyOworCisJcHJpbnRfc3RhdHVzbGluZSgiTWFyazogIik7CisJbGV0dGVyID0gbGVzc19nZXRjaChzaXplb2YoIk1hcms6ICIpIC0gMSk7CisKKwlpZiAoaXNhbHBoYShsZXR0ZXIpKSB7CisJCS8qIElmIHdlIGV4Y2VlZCAxNSBtYXJrcywgc3RhcnQgb3ZlcndyaXRpbmcgcHJldmlvdXMgb25lcyAqLworCQlpZiAobnVtX21hcmtzID09IDE0KQorCQkJbnVtX21hcmtzID0gMDsKKworCQltYXJrX2xpbmVzW251bV9tYXJrc11bMF0gPSBsZXR0ZXI7CisJCW1hcmtfbGluZXNbbnVtX21hcmtzXVsxXSA9IGN1cl9mbGluZTsKKwkJbnVtX21hcmtzKys7CisJfSBlbHNlIHsKKwkJcHJpbnRfc3RhdHVzbGluZSgiSW52YWxpZCBtYXJrIGxldHRlciIpOworCX0KK30KKworc3RhdGljIHZvaWQgZ290b19tYXJrKHZvaWQpCit7CisJaW50IGxldHRlcjsKKwlpbnQgaTsKKworCXByaW50X3N0YXR1c2xpbmUoIkdvIHRvIG1hcms6ICIpOworCWxldHRlciA9IGxlc3NfZ2V0Y2goc2l6ZW9mKCJHbyB0byBtYXJrOiAiKSAtIDEpOworCWNsZWFyX2xpbmUoKTsKKworCWlmIChpc2FscGhhKGxldHRlcikpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBudW1fbWFya3M7IGkrKykKKwkJCWlmIChsZXR0ZXIgPT0gbWFya19saW5lc1tpXVswXSkgeworCQkJCWJ1ZmZlcl9saW5lKG1hcmtfbGluZXNbaV1bMV0pOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAobnVtX21hcmtzID09IDE0ICYmIGxldHRlciAhPSBtYXJrX2xpbmVzWzE0XVswXSkKKwkJCXByaW50X3N0YXR1c2xpbmUoIk1hcmsgbm90IHNldCIpOworCX0gZWxzZQorCQlwcmludF9zdGF0dXNsaW5lKCJJbnZhbGlkIG1hcmsgbGV0dGVyIik7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfQlJBQ0tFVFMKK3N0YXRpYyBjaGFyIG9wcF9icmFja2V0KGNoYXIgYnJhY2tldCkKK3sKKwlzd2l0Y2ggKGJyYWNrZXQpIHsKKwkJY2FzZSAneyc6IGNhc2UgJ1snOiAvKiAnfScgPT0gJ3snICsgMi4gU2FtZSBmb3IgJ1snICovCisJCQlicmFja2V0Kys7CisJCWNhc2UgJygnOiAgICAgICAgICAgLyogJyknID09ICcoJyArIDEgKi8KKwkJCWJyYWNrZXQrKzsKKwkJCWJyZWFrOworCQljYXNlICd9JzogY2FzZSAnXSc6CisJCQlicmFja2V0LS07CisJCWNhc2UgJyknOgorCQkJYnJhY2tldC0tOworCQkJYnJlYWs7CisJfTsKKwlyZXR1cm4gYnJhY2tldDsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hfcmlnaHRfYnJhY2tldChjaGFyIGJyYWNrZXQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChzdHJjaHIoZmxpbmVzW2N1cl9mbGluZV0sIGJyYWNrZXQpID09IE5VTEwpIHsKKwkJcHJpbnRfc3RhdHVzbGluZSgiTm8gYnJhY2tldCBpbiB0b3AgbGluZSIpOworCQlyZXR1cm47CisJfQorCWJyYWNrZXQgPSBvcHBfYnJhY2tldChicmFja2V0KTsKKwlmb3IgKGkgPSBjdXJfZmxpbmUgKyAxOyBpIDwgbWF4X2ZsaW5lOyBpKyspIHsKKwkJaWYgKHN0cmNocihmbGluZXNbaV0sIGJyYWNrZXQpICE9IE5VTEwpIHsKKwkJCWJ1ZmZlcl9saW5lKGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCXByaW50X3N0YXR1c2xpbmUoIk5vIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQiKTsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hfbGVmdF9icmFja2V0KGNoYXIgYnJhY2tldCkKK3sKKwlpbnQgaTsKKworCWlmIChzdHJjaHIoZmxpbmVzW2N1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZV0sIGJyYWNrZXQpID09IE5VTEwpIHsKKwkJcHJpbnRfc3RhdHVzbGluZSgiTm8gYnJhY2tldCBpbiBib3R0b20gbGluZSIpOworCQlyZXR1cm47CisJfQorCisJYnJhY2tldCA9IG9wcF9icmFja2V0KGJyYWNrZXQpOworCWZvciAoaSA9IGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHN0cmNocihmbGluZXNbaV0sIGJyYWNrZXQpICE9IE5VTEwpIHsKKwkJCWJ1ZmZlcl9saW5lKGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCXByaW50X3N0YXR1c2xpbmUoIk5vIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQiKTsKK30KKyNlbmRpZiAgLyogRkVBVFVSRV9MRVNTX0JSQUNLRVRTICovCisKK3N0YXRpYyB2b2lkIGtleXByZXNzX3Byb2Nlc3MoaW50IGtleXByZXNzKQoreworCXN3aXRjaCAoa2V5cHJlc3MpIHsKKwljYXNlIEtFWUNPREVfRE9XTjogY2FzZSAnZSc6IGNhc2UgJ2onOiBjYXNlIDB4MGQ6CisJCWJ1ZmZlcl9kb3duKDEpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfVVA6IGNhc2UgJ3knOiBjYXNlICdrJzoKKwkJYnVmZmVyX3VwKDEpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfUEFHRURPV046IGNhc2UgJyAnOiBjYXNlICd6JzogY2FzZSAnZic6CisJCWJ1ZmZlcl9kb3duKG1heF9kaXNwbGF5ZWRfbGluZSArIDEpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfUEFHRVVQOiBjYXNlICd3JzogY2FzZSAnYic6CisJCWJ1ZmZlcl91cChtYXhfZGlzcGxheWVkX2xpbmUgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCWJ1ZmZlcl9kb3duKChtYXhfZGlzcGxheWVkX2xpbmUgKyAxKSAvIDIpOworCQlicmVhazsKKwljYXNlICd1JzoKKwkJYnVmZmVyX3VwKChtYXhfZGlzcGxheWVkX2xpbmUgKyAxKSAvIDIpOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfSE9NRTogY2FzZSAnZyc6IGNhc2UgJ3AnOiBjYXNlICc8JzogY2FzZSAnJSc6CisJCWJ1ZmZlcl9saW5lKDApOworCQlicmVhazsKKwljYXNlIEtFWUNPREVfRU5EOiBjYXNlICdHJzogY2FzZSAnPic6CisJCWN1cl9mbGluZSA9IE1BWExJTkVTOworCQlyZWFkX2xpbmVzKCk7CisJCWJ1ZmZlcl9saW5lKGN1cl9mbGluZSk7CisJCWJyZWFrOworCWNhc2UgJ3EnOiBjYXNlICdRJzoKKwkJbGVzc19leGl0KEVYSVRfU1VDQ0VTUyk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTUFSS1MKKwljYXNlICdtJzoKKwkJYWRkX21hcmsoKTsKKwkJYnVmZmVyX3ByaW50KCk7CisJCWJyZWFrOworCWNhc2UgJ1wnJzoKKwkJZ290b19tYXJrKCk7CisJCWJ1ZmZlcl9wcmludCgpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgJ3InOiBjYXNlICdSJzoKKwkJLyogVE9ETzogKDEpIGFsc28gYmluZCBeUiwgXkwgdG8gdGhpcz8KKwkJICogKDIpIHJlLW1lYXN1cmUgd2luZG93IHNpemU/CisJCSAqLworCQlidWZmZXJfcHJpbnQoKTsKKwkJYnJlYWs7CisJLypjYXNlICdSJzoKKwkJZnVsbF9yZXBhaW50KCk7CisJCWJyZWFrOyovCisJY2FzZSAncyc6CisJCXNhdmVfaW5wdXRfdG9fZmlsZSgpOworCQlicmVhazsKKwljYXNlICdFJzoKKwkJZXhhbWluZV9maWxlKCk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfRkxBR1MKKwljYXNlICc9JzoKKwkJbV9zdGF0dXNfcHJpbnQoKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCWNhc2UgJy8nOgorCQlvcHRpb25fbWFzazMyICY9IH5MRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKwljYXNlICduJzoKKwkJZ290b19tYXRjaChtYXRjaF9wb3MgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSAnTic6CisJCWdvdG9fbWF0Y2gobWF0Y2hfcG9zIC0gMSk7CisJCWJyZWFrOworCWNhc2UgJz8nOgorCQlvcHRpb25fbWFzazMyIHw9IExFU1NfU1RBVEVfTUFUQ0hfQkFDS1dBUkRTOworCQlyZWdleF9wcm9jZXNzKCk7CisJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19EQVNIQ01ECisJY2FzZSAnLSc6CisJCWZsYWdfY2hhbmdlKCk7CisJCWJ1ZmZlcl9wcmludCgpOworCQlicmVhazsKKyNpZmRlZiBCTE9BVAorCWNhc2UgJ18nOgorCQlzaG93X2ZsYWdfc3RhdHVzKCk7CisJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0JSQUNLRVRTCisJY2FzZSAneyc6IGNhc2UgJygnOiBjYXNlICdbJzoKKwkJbWF0Y2hfcmlnaHRfYnJhY2tldChrZXlwcmVzcyk7CisJCWJyZWFrOworCWNhc2UgJ30nOiBjYXNlICcpJzogY2FzZSAnXSc6CisJCW1hdGNoX2xlZnRfYnJhY2tldChrZXlwcmVzcyk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAnOic6CisJCWNvbG9uX3Byb2Nlc3MoKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGlzZGlnaXQoa2V5cHJlc3MpKQorCQludW1iZXJfcHJvY2VzcyhrZXlwcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19jYXRjaGVyKGludCBzaWcpCit7CisJbGVzc19leGl0KC0gc2lnKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKK3N0YXRpYyB2b2lkIHNpZ3dpbmNoX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJd2luY2hfY291bnRlcisrOworfQorI2VuZGlmCisKK2ludCBsZXNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsZXNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUlOSVRfRygpOworCisJLyogVE9ETzogLXg6IGRvIG5vdCBpbnRlcnByZXQgYmFja3NwYWNlLCAteHg6IHRhYiBhbHNvICovCisJLyogLXh4eDogbmV3bGluZSBhbHNvICovCisJLyogLXcgTjogYXNzdW1lIHdpZHRoIE4gKC14eHggLXcgMzI6IGhleCB2aWV3ZXIgb2Ygc29ydHMpICovCisJZ2V0b3B0MzIoYXJndiwgIkVNbU5+SSIgSUZfRkVBVFVSRV9MRVNTX0RBU0hDTUQoIlMiKSk7CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJbnVtX2ZpbGVzID0gYXJnYzsKKwlmaWxlcyA9IGFyZ3Y7CisKKwkvKiBBbm90aGVyIHBvcHVsYXIgcGFnZXIsIG1vc3QsIGRldGVjdHMgd2hlbiBzdGRvdXQKKwkgKiBpcyBub3QgYSB0dHkgYW5kIHR1cm5zIGludG8gY2F0LiBUaGlzIG1ha2VzIHNlbnNlLiAqLworCWlmICghaXNhdHR5KFNURE9VVF9GSUxFTk8pKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCisJaWYgKCFudW1fZmlsZXMpIHsKKwkJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCQkvKiBKdXN0ICJsZXNzIj8gTm8gYXJncyBhbmQgbm8gcmVkaXJlY3Rpb24/ICovCisJCQliYl9lcnJvcl9tc2coIm1pc3NpbmcgZmlsZW5hbWUiKTsKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0gZWxzZSB7CisJCWZpbGVuYW1lID0geHN0cmR1cChmaWxlc1swXSk7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1RJTERFKQorCQllbXB0eV9saW5lX21hcmtlciA9ICIiOworCisJa2JkX2ZkID0gb3BlbihDVVJSRU5UX1RUWSwgT19SRE9OTFkpOworCWlmIChrYmRfZmQgPCAwKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCW5kZWxheV9vbihrYmRfZmQpOworCisJdGNnZXRhdHRyKGtiZF9mZCwgJnRlcm1fb3JpZyk7CisJdGVybV9sZXNzID0gdGVybV9vcmlnOworCXRlcm1fbGVzcy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisJdGVybV9sZXNzLmNfaWZsYWcgJj0gfihJWE9OIHwgSUNSTkwpOworCS8qdGVybV9sZXNzLmNfb2ZsYWcgJj0gfk9OTENSOyovCisJdGVybV9sZXNzLmNfY2NbVk1JTl0gPSAxOworCXRlcm1fbGVzcy5jX2NjW1ZUSU1FXSA9IDA7CisKKwlJRl9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMKEcud2luc2l6ZV9lcnIgPSkgZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChrYmRfZmQsICZ3aWR0aCwgJm1heF9kaXNwbGF5ZWRfbGluZSk7CisJLyogMjA6IHR3byB0YWJzdG9wcyArIDQgKi8KKwlpZiAod2lkdGggPCAyMCB8fCBtYXhfZGlzcGxheWVkX2xpbmUgPCAzKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCW1heF9kaXNwbGF5ZWRfbGluZSAtPSAyOworCisJLyogV2Ugd2FudCB0byByZXN0b3JlIHRlcm1fb3JpZyBvbiBleGl0ICovCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBzaWdfY2F0Y2hlcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19XSU5DSAorCXNpZ25hbChTSUdXSU5DSCwgc2lnd2luY2hfaGFuZGxlcik7CisjZW5kaWYKKworCWJ1ZmZlciA9IHhtYWxsb2MoKG1heF9kaXNwbGF5ZWRfbGluZSsxKSAqIHNpemVvZihjaGFyICopKTsKKwlyZWluaXRpYWxpemUoKTsKKwl3aGlsZSAoMSkgeworCQlpbnQ2NF90IGtleXByZXNzOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19XSU5DSAorCQl3aGlsZSAoV0lOQ0hfQ09VTlRFUikgeworIGFnYWluOgorCQkJd2luY2hfY291bnRlci0tOworCQkJSUZfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTChHLndpbnNpemVfZXJyID0pIGdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoa2JkX2ZkLCAmd2lkdGgsICZtYXhfZGlzcGxheWVkX2xpbmUpOworIElGX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwoZ290X3NpemU6KQorCQkJLyogMjA6IHR3byB0YWJzdG9wcyArIDQgKi8KKwkJCWlmICh3aWR0aCA8IDIwKQorCQkJCXdpZHRoID0gMjA7CisJCQlpZiAobWF4X2Rpc3BsYXllZF9saW5lIDwgMykKKwkJCQltYXhfZGlzcGxheWVkX2xpbmUgPSAzOworCQkJbWF4X2Rpc3BsYXllZF9saW5lIC09IDI7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlidWZmZXIgPSB4bWFsbG9jKChtYXhfZGlzcGxheWVkX2xpbmUrMSkgKiBzaXplb2YoY2hhciAqKSk7CisJCQkvKiBBdm9pZCByZS13cmFwIGFuZC9vciByZWRyYXcgaWYgd2UgYWxyZWFkeSBrbm93CisJCQkgKiB3ZSBuZWVkIHRvIGRvIGl0IGFnYWluLiBUaGVzZSBvcHMgYXJlIGV4cGVuc2l2ZSAqLworCQkJaWYgKFdJTkNIX0NPVU5URVIpCisJCQkJZ290byBhZ2FpbjsKKwkJCXJlX3dyYXAoKTsKKwkJCWlmIChXSU5DSF9DT1VOVEVSKQorCQkJCWdvdG8gYWdhaW47CisJCQlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKKwkJCS8qIFRoaXMgdG9vayBzb21lIHRpbWUuIExvb3AgYmFjayBhbmQgY2hlY2ssCisJCQkgKiB3ZXJlIHRoZXJlIGFub3RoZXIgU0lHV0lOQ0g/ICovCisJCX0KKwkJa2V5cHJlc3MgPSBsZXNzX2dldGNoKC0xKTsgLyogLTE6IGRvIG5vdCBwb3NpdGlvbiBjdXJzb3IgKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwKKwkJaWYgKChpbnQzMl90KWtleXByZXNzID09IEtFWUNPREVfQ1VSU09SX1BPUykgeworCQkJdWludDMyX3QgcmMgPSAoa2V5cHJlc3MgPj4gMzIpOworCQkJd2lkdGggPSAocmMgJiAweDdmZmYpOworCQkJbWF4X2Rpc3BsYXllZF9saW5lID0gKChyYyA+PiAxNikgJiAweDdmZmYpOworCQkJZ290byBnb3Rfc2l6ZTsKKwkJfQorIyBlbmRpZgorI2Vsc2UKKwkJa2V5cHJlc3MgPSBsZXNzX2dldGNoKC0xKTsgLyogLTE6IGRvIG5vdCBwb3NpdGlvbiBjdXJzb3IgKi8KKyNlbmRpZgorCQlrZXlwcmVzc19wcm9jZXNzKGtleXByZXNzKTsKKwl9Cit9CisKKy8qCitIZWxwIHRleHQgb2YgbGVzcyB2ZXJzaW9uIDQxOCBpcyBiZWxvdy4KK0lmIHlvdSBhcmUgaW1wbGVtZW50aW5nIHNvbWV0aGluZywga2VlcGluZwora2V5IGFuZC9vciBjb21tYW5kIGxpbmUgc3dpdGNoIGNvbXBhdGliaWxpdHkgaXMgYSBnb29kIGlkZWE6CisKKworICAgICAgICAgICAgICAgICAgIFNVTU1BUlkgT0YgTEVTUyBDT01NQU5EUworCisgICAgICBDb21tYW5kcyBtYXJrZWQgd2l0aCAqIG1heSBiZSBwcmVjZWRlZCBieSBhIG51bWJlciwgTi4KKyAgICAgIE5vdGVzIGluIHBhcmVudGhlc2VzIGluZGljYXRlIHRoZSBiZWhhdmlvciBpZiBOIGlzIGdpdmVuLgorICBoICBIICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscC4KKyAgcSAgOnEgIFEgIDpRICBaWiAgICAgRXhpdC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVklORworICBlICBeRSAgaiAgXk4gIENSICAqICBGb3J3YXJkICBvbmUgbGluZSAgIChvciBOIGxpbmVzKS4KKyAgeSAgXlkgIGsgIF5LICBeUCAgKiAgQmFja3dhcmQgb25lIGxpbmUgICAob3IgTiBsaW5lcykuCisgIGYgIF5GICBeViAgU1BBQ0UgICogIEZvcndhcmQgIG9uZSB3aW5kb3cgKG9yIE4gbGluZXMpLgorICBiICBeQiAgRVNDLXYgICAgICAqICBCYWNrd2FyZCBvbmUgd2luZG93IChvciBOIGxpbmVzKS4KKyAgeiAgICAgICAgICAgICAgICAgKiAgRm9yd2FyZCAgb25lIHdpbmRvdyAoYW5kIHNldCB3aW5kb3cgdG8gTikuCisgIHcgICAgICAgICAgICAgICAgICogIEJhY2t3YXJkIG9uZSB3aW5kb3cgKGFuZCBzZXQgd2luZG93IHRvIE4pLgorICBFU0MtU1BBQ0UgICAgICAgICAqICBGb3J3YXJkICBvbmUgd2luZG93LCBidXQgZG9uJ3Qgc3RvcCBhdCBlbmQtb2YtZmlsZS4KKyAgZCAgXkQgICAgICAgICAgICAgKiAgRm9yd2FyZCAgb25lIGhhbGYtd2luZG93IChhbmQgc2V0IGhhbGYtd2luZG93IHRvIE4pLgorICB1ICBeVSAgICAgICAgICAgICAqICBCYWNrd2FyZCBvbmUgaGFsZi13aW5kb3cgKGFuZCBzZXQgaGFsZi13aW5kb3cgdG8gTikuCisgIEVTQy0pICBSaWdodEFycm93ICogIExlZnQgIG9uZSBoYWxmIHNjcmVlbiB3aWR0aCAob3IgTiBwb3NpdGlvbnMpLgorICBFU0MtKCAgTGVmdEFycm93ICAqICBSaWdodCBvbmUgaGFsZiBzY3JlZW4gd2lkdGggKG9yIE4gcG9zaXRpb25zKS4KKyAgRiAgICAgICAgICAgICAgICAgICAgRm9yd2FyZCBmb3JldmVyOyBsaWtlICJ0YWlsIC1mIi4KKyAgciAgXlIgIF5MICAgICAgICAgICAgUmVwYWludCBzY3JlZW4uCisgIFIgICAgICAgICAgICAgICAgICAgIFJlcGFpbnQgc2NyZWVuLCBkaXNjYXJkaW5nIGJ1ZmZlcmVkIGlucHV0LgorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRGVmYXVsdCAid2luZG93IiBpcyB0aGUgc2NyZWVuIGhlaWdodC4KKyAgICAgICAgRGVmYXVsdCAiaGFsZi13aW5kb3ciIGlzIGhhbGYgb2YgdGhlIHNjcmVlbiBoZWlnaHQuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQVJDSElORworICAvcGF0dGVybiAgICAgICAgICAqICBTZWFyY2ggZm9yd2FyZCBmb3IgKE4tdGgpIG1hdGNoaW5nIGxpbmUuCisgID9wYXR0ZXJuICAgICAgICAgICogIFNlYXJjaCBiYWNrd2FyZCBmb3IgKE4tdGgpIG1hdGNoaW5nIGxpbmUuCisgIG4gICAgICAgICAgICAgICAgICogIFJlcGVhdCBwcmV2aW91cyBzZWFyY2ggKGZvciBOLXRoIG9jY3VycmVuY2UpLgorICBOICAgICAgICAgICAgICAgICAqICBSZXBlYXQgcHJldmlvdXMgc2VhcmNoIGluIHJldmVyc2UgZGlyZWN0aW9uLgorICBFU0MtbiAgICAgICAgICAgICAqICBSZXBlYXQgcHJldmlvdXMgc2VhcmNoLCBzcGFubmluZyBmaWxlcy4KKyAgRVNDLU4gICAgICAgICAgICAgKiAgUmVwZWF0IHByZXZpb3VzIHNlYXJjaCwgcmV2ZXJzZSBkaXIuICYgc3Bhbm5pbmcgZmlsZXMuCisgIEVTQy11ICAgICAgICAgICAgICAgIFVuZG8gKHRvZ2dsZSkgc2VhcmNoIGhpZ2hsaWdodGluZy4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNlYXJjaCBwYXR0ZXJucyBtYXkgYmUgbW9kaWZpZWQgYnkgb25lIG9yIG1vcmUgb2Y6CisgICAgICAgIF5OIG9yICEgIFNlYXJjaCBmb3IgTk9OLW1hdGNoaW5nIGxpbmVzLgorICAgICAgICBeRSBvciAqICBTZWFyY2ggbXVsdGlwbGUgZmlsZXMgKHBhc3MgdGhydSBFTkQgT0YgRklMRSkuCisgICAgICAgIF5GIG9yIEAgIFN0YXJ0IHNlYXJjaCBhdCBGSVJTVCBmaWxlIChmb3IgLykgb3IgbGFzdCBmaWxlIChmb3IgPykuCisgICAgICAgIF5LICAgICAgIEhpZ2hsaWdodCBtYXRjaGVzLCBidXQgZG9uJ3QgbW92ZSAoS0VFUCBwb3NpdGlvbikuCisgICAgICAgIF5SICAgICAgIERvbid0IHVzZSBSRUdVTEFSIEVYUFJFU1NJT05TLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSlVNUElORworICBnICA8ICBFU0MtPCAgICAgICAqICBHbyB0byBmaXJzdCBsaW5lIGluIGZpbGUgKG9yIGxpbmUgTikuCisgIEcgID4gIEVTQy0+ICAgICAgICogIEdvIHRvIGxhc3QgbGluZSBpbiBmaWxlIChvciBsaW5lIE4pLgorICBwICAlICAgICAgICAgICAgICAqICBHbyB0byBiZWdpbm5pbmcgb2YgZmlsZSAob3IgTiBwZXJjZW50IGludG8gZmlsZSkuCisgIHQgICAgICAgICAgICAgICAgICogIEdvIHRvIHRoZSAoTi10aCkgbmV4dCB0YWcuCisgIFQgICAgICAgICAgICAgICAgICogIEdvIHRvIHRoZSAoTi10aCkgcHJldmlvdXMgdGFnLgorICB7ICAoICBbICAgICAgICAgICAqICBGaW5kIGNsb3NlIGJyYWNrZXQgfSApIF0uCisgIH0gICkgIF0gICAgICAgICAgICogIEZpbmQgb3BlbiBicmFja2V0IHsgKCBbLgorICBFU0MtXkYgPGMxPiA8YzI+ICAqICBGaW5kIGNsb3NlIGJyYWNrZXQgPGMyPi4KKyAgRVNDLV5CIDxjMT4gPGMyPiAgKiAgRmluZCBvcGVuIGJyYWNrZXQgPGMxPgorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRWFjaCAiZmluZCBjbG9zZSBicmFja2V0IiBjb21tYW5kIGdvZXMgZm9yd2FyZCB0byB0aGUgY2xvc2UgYnJhY2tldAorICAgICAgICAgIG1hdGNoaW5nIHRoZSAoTi10aCkgb3BlbiBicmFja2V0IGluIHRoZSB0b3AgbGluZS4KKyAgICAgICAgRWFjaCAiZmluZCBvcGVuIGJyYWNrZXQiIGNvbW1hbmQgZ29lcyBiYWNrd2FyZCB0byB0aGUgb3BlbiBicmFja2V0CisgICAgICAgICAgbWF0Y2hpbmcgdGhlIChOLXRoKSBjbG9zZSBicmFja2V0IGluIHRoZSBib3R0b20gbGluZS4KKyAgbTxsZXR0ZXI+ICAgICAgICAgICAgTWFyayB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoIDxsZXR0ZXI+LgorICAnPGxldHRlcj4gICAgICAgICAgICBHbyB0byBhIHByZXZpb3VzbHkgbWFya2VkIHBvc2l0aW9uLgorICAnJyAgICAgICAgICAgICAgICAgICBHbyB0byB0aGUgcHJldmlvdXMgcG9zaXRpb24uCisgIF5YXlggICAgICAgICAgICAgICAgIFNhbWUgYXMgJy4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEEgbWFyayBpcyBhbnkgdXBwZXItY2FzZSBvciBsb3dlci1jYXNlIGxldHRlci4KKyAgICAgICAgQ2VydGFpbiBtYXJrcyBhcmUgcHJlZGVmaW5lZDoKKyAgICAgICAgICAgICBeICBtZWFucyAgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgJCAgbWVhbnMgIGVuZCBvZiB0aGUgZmlsZQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdJTkcgRklMRVMKKyAgOmUgW2ZpbGVdICAgICAgICAgICAgRXhhbWluZSBhIG5ldyBmaWxlLgorICBeWF5WICAgICAgICAgICAgICAgICBTYW1lIGFzIDplLgorICA6biAgICAgICAgICAgICAgICAqICBFeGFtaW5lIHRoZSAoTi10aCkgbmV4dCBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgOnAgICAgICAgICAgICAgICAgKiAgRXhhbWluZSB0aGUgKE4tdGgpIHByZXZpb3VzIGZpbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICA6eCAgICAgICAgICAgICAgICAqICBFeGFtaW5lIHRoZSBmaXJzdCAob3IgTi10aCkgZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgIDpkICAgICAgICAgICAgICAgICAgIERlbGV0ZSB0aGUgY3VycmVudCBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSBsaXN0LgorICA9ICBeRyAgOmYgICAgICAgICAgICBQcmludCBjdXJyZW50IGZpbGUgbmFtZS4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgTUlTQ0VMTEFORU9VUyBDT01NQU5EUworICAtPGZsYWc+ICAgICAgICAgICAgICBUb2dnbGUgYSBjb21tYW5kIGxpbmUgb3B0aW9uIFtzZWUgT1BUSU9OUyBiZWxvd10uCisgIC0tPG5hbWU+ICAgICAgICAgICAgIFRvZ2dsZSBhIGNvbW1hbmQgbGluZSBvcHRpb24sIGJ5IG5hbWUuCisgIF88ZmxhZz4gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHNldHRpbmcgb2YgYSBjb21tYW5kIGxpbmUgb3B0aW9uLgorICBfXzxuYW1lPiAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZXR0aW5nIG9mIGFuIG9wdGlvbiwgYnkgbmFtZS4KKyAgK2NtZCAgICAgICAgICAgICAgICAgRXhlY3V0ZSB0aGUgbGVzcyBjbWQgZWFjaCB0aW1lIGEgbmV3IGZpbGUgaXMgZXhhbWluZWQuCisgICFjb21tYW5kICAgICAgICAgICAgIEV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgd2l0aCAkU0hFTEwuCisgIHxYY29tbWFuZCAgICAgICAgICAgIFBpcGUgZmlsZSBiZXR3ZWVuIGN1cnJlbnQgcG9zICYgbWFyayBYIHRvIHNoZWxsIGNvbW1hbmQuCisgIHYgICAgICAgICAgICAgICAgICAgIEVkaXQgdGhlIGN1cnJlbnQgZmlsZSB3aXRoICRWSVNVQUwgb3IgJEVESVRPUi4KKyAgViAgICAgICAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBudW1iZXIgb2YgImxlc3MiLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUworICAgICAgICBNb3N0IG9wdGlvbnMgbWF5IGJlIGNoYW5nZWQgZWl0aGVyIG9uIHRoZSBjb21tYW5kIGxpbmUsCisgICAgICAgIG9yIGZyb20gd2l0aGluIGxlc3MgYnkgdXNpbmcgdGhlIC0gb3IgLS0gY29tbWFuZC4KKyAgICAgICAgT3B0aW9ucyBtYXkgYmUgZ2l2ZW4gaW4gb25lIG9mIHR3byBmb3JtczogZWl0aGVyIGEgc2luZ2xlCisgICAgICAgIGNoYXJhY3RlciBwcmVjZWRlZCBieSBhIC0sIG9yIGEgbmFtZSBwcmVjZWVkZWQgYnkgLS0uCisgIC0/ICAuLi4uLi4uLiAgLS1oZWxwCisgICAgICAgICAgICAgICAgICBEaXNwbGF5IGhlbHAgKGZyb20gY29tbWFuZCBsaW5lKS4KKyAgLWEgIC4uLi4uLi4uICAtLXNlYXJjaC1za2lwLXNjcmVlbgorICAgICAgICAgICAgICAgICAgRm9yd2FyZCBzZWFyY2ggc2tpcHMgY3VycmVudCBzY3JlZW4uCisgIC1iIFtOXSAgLi4uLiAgLS1idWZmZXJzPVtOXQorICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMuCisgIC1CICAuLi4uLi4uLiAgLS1hdXRvLWJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgIERvbid0IGF1dG9tYXRpY2FsbHkgYWxsb2NhdGUgYnVmZmVycyBmb3IgcGlwZXMuCisgIC1jICAuLi4uLi4uLiAgLS1jbGVhci1zY3JlZW4KKyAgICAgICAgICAgICAgICAgIFJlcGFpbnQgYnkgY2xlYXJpbmcgcmF0aGVyIHRoYW4gc2Nyb2xsaW5nLgorICAtZCAgLi4uLi4uLi4gIC0tZHVtYgorICAgICAgICAgICAgICAgICAgRHVtYiB0ZXJtaW5hbC4KKyAgLUQgW3huLm5dICAuICAtLWNvbG9yPXhuLm4KKyAgICAgICAgICAgICAgICAgIFNldCBzY3JlZW4gY29sb3JzLiAoTVMtRE9TIG9ubHkpCisgIC1lICAtRSAgLi4uLiAgLS1xdWl0LWF0LWVvZiAgLS1RVUlULUFULUVPRgorICAgICAgICAgICAgICAgICAgUXVpdCBhdCBlbmQgb2YgZmlsZS4KKyAgLWYgIC4uLi4uLi4uICAtLWZvcmNlCisgICAgICAgICAgICAgICAgICBGb3JjZSBvcGVuIG5vbi1yZWd1bGFyIGZpbGVzLgorICAtRiAgLi4uLi4uLi4gIC0tcXVpdC1pZi1vbmUtc2NyZWVuCisgICAgICAgICAgICAgICAgICBRdWl0IGlmIGVudGlyZSBmaWxlIGZpdHMgb24gZmlyc3Qgc2NyZWVuLgorICAtZyAgLi4uLi4uLi4gIC0taGlsaXRlLXNlYXJjaAorICAgICAgICAgICAgICAgICAgSGlnaGxpZ2h0IG9ubHkgbGFzdCBtYXRjaCBmb3Igc2VhcmNoZXMuCisgIC1HICAuLi4uLi4uLiAgLS1ISUxJVEUtU0VBUkNICisgICAgICAgICAgICAgICAgICBEb24ndCBoaWdobGlnaHQgYW55IG1hdGNoZXMgZm9yIHNlYXJjaGVzLgorICAtaCBbTl0gIC4uLi4gIC0tbWF4LWJhY2stc2Nyb2xsPVtOXQorICAgICAgICAgICAgICAgICAgQmFja3dhcmQgc2Nyb2xsIGxpbWl0LgorICAtaSAgLi4uLi4uLi4gIC0taWdub3JlLWNhc2UKKyAgICAgICAgICAgICAgICAgIElnbm9yZSBjYXNlIGluIHNlYXJjaGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdXBwZXJjYXNlLgorICAtSSAgLi4uLi4uLi4gIC0tSUdOT1JFLUNBU0UKKyAgICAgICAgICAgICAgICAgIElnbm9yZSBjYXNlIGluIGFsbCBzZWFyY2hlcy4KKyAgLWogW05dICAuLi4uICAtLWp1bXAtdGFyZ2V0PVtOXQorICAgICAgICAgICAgICAgICAgU2NyZWVuIHBvc2l0aW9uIG9mIHRhcmdldCBsaW5lcy4KKyAgLUogIC4uLi4uLi4uICAtLXN0YXR1cy1jb2x1bW4KKyAgICAgICAgICAgICAgICAgIERpc3BsYXkgYSBzdGF0dXMgY29sdW1uIGF0IGxlZnQgZWRnZSBvZiBzY3JlZW4uCisgIC1rIFtmaWxlXSAgLiAgLS1sZXNza2V5LWZpbGU9W2ZpbGVdCisgICAgICAgICAgICAgICAgICBVc2UgYSBsZXNza2V5IGZpbGUuCisgIC1MICAuLi4uLi4uLiAgLS1uby1sZXNzb3BlbgorICAgICAgICAgICAgICAgICAgSWdub3JlIHRoZSBMRVNTT1BFTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgLW0gIC1NICAuLi4uICAtLWxvbmctcHJvbXB0ICAtLUxPTkctUFJPTVBUCisgICAgICAgICAgICAgICAgICBTZXQgcHJvbXB0IHN0eWxlLgorICAtbiAgLU4gIC4uLi4gIC0tbGluZS1udW1iZXJzICAtLUxJTkUtTlVNQkVSUworICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIGxpbmUgbnVtYmVycy4KKyAgLW8gW2ZpbGVdICAuICAtLWxvZy1maWxlPVtmaWxlXQorICAgICAgICAgICAgICAgICAgQ29weSB0byBsb2cgZmlsZSAoc3RhbmRhcmQgaW5wdXQgb25seSkuCisgIC1PIFtmaWxlXSAgLiAgLS1MT0ctRklMRT1bZmlsZV0KKyAgICAgICAgICAgICAgICAgIENvcHkgdG8gbG9nIGZpbGUgKHVuY29uZGl0aW9uYWxseSBvdmVyd3JpdGUpLgorICAtcCBbcGF0dGVybl0gIC0tcGF0dGVybj1bcGF0dGVybl0KKyAgICAgICAgICAgICAgICAgIFN0YXJ0IGF0IHBhdHRlcm4gKGZyb20gY29tbWFuZCBsaW5lKS4KKyAgLVAgW3Byb21wdF0gICAtLXByb21wdD1bcHJvbXB0XQorICAgICAgICAgICAgICAgICAgRGVmaW5lIG5ldyBwcm9tcHQuCisgIC1xICAtUSAgLi4uLiAgLS1xdWlldCAgLS1RVUlFVCAgLS1zaWxlbnQgLS1TSUxFTlQKKyAgICAgICAgICAgICAgICAgIFF1aWV0IHRoZSB0ZXJtaW5hbCBiZWxsLgorICAtciAgLVIgIC4uLi4gIC0tcmF3LWNvbnRyb2wtY2hhcnMgIC0tUkFXLUNPTlRST0wtQ0hBUlMKKyAgICAgICAgICAgICAgICAgIE91dHB1dCAicmF3IiBjb250cm9sIGNoYXJhY3RlcnMuCisgIC1zICAuLi4uLi4uLiAgLS1zcXVlZXplLWJsYW5rLWxpbmVzCisgICAgICAgICAgICAgICAgICBTcXVlZXplIG11bHRpcGxlIGJsYW5rIGxpbmVzLgorICAtUyAgLi4uLi4uLi4gIC0tY2hvcC1sb25nLWxpbmVzCisgICAgICAgICAgICAgICAgICBDaG9wIGxvbmcgbGluZXMuCisgIC10IFt0YWddICAuLiAgLS10YWc9W3RhZ10KKyAgICAgICAgICAgICAgICAgIEZpbmQgYSB0YWcuCisgIC1UIFt0YWdzZmlsZV0gLS10YWctZmlsZT1bdGFnc2ZpbGVdCisgICAgICAgICAgICAgICAgICBVc2UgYW4gYWx0ZXJuYXRlIHRhZ3MgZmlsZS4KKyAgLXUgIC1VICAuLi4uICAtLXVuZGVybGluZS1zcGVjaWFsICAtLVVOREVSTElORS1TUEVDSUFMCisgICAgICAgICAgICAgICAgICBDaGFuZ2UgaGFuZGxpbmcgb2YgYmFja3NwYWNlcy4KKyAgLVYgIC4uLi4uLi4uICAtLXZlcnNpb24KKyAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mICJsZXNzIi4KKyAgLXcgIC4uLi4uLi4uICAtLWhpbGl0ZS11bnJlYWQKKyAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBmaXJzdCBuZXcgbGluZSBhZnRlciBmb3J3YXJkLXNjcmVlbi4KKyAgLVcgIC4uLi4uLi4uICAtLUhJTElURS1VTlJFQUQKKyAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBmaXJzdCBuZXcgbGluZSBhZnRlciBhbnkgZm9yd2FyZCBtb3ZlbWVudC4KKyAgLXggW05bLC4uLl1dICAtLXRhYnM9W05bLC4uLl1dCisgICAgICAgICAgICAgICAgICBTZXQgdGFiIHN0b3BzLgorICAtWCAgLi4uLi4uLi4gIC0tbm8taW5pdAorICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHRlcm1jYXAgaW5pdC9kZWluaXQgc3RyaW5ncy4KKyAgICAgICAgICAgICAgICAtLW5vLWtleXBhZAorICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHRlcm1jYXAga2V5cGFkIGluaXQvZGVpbml0IHN0cmluZ3MuCisgIC15IFtOXSAgLi4uLiAgLS1tYXgtZm9ydy1zY3JvbGw9W05dCisgICAgICAgICAgICAgICAgICBGb3J3YXJkIHNjcm9sbCBsaW1pdC4KKyAgLXogW05dICAuLi4uICAtLXdpbmRvdz1bTl0KKyAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHdpbmRvdy4KKyAgLSIgW2NbY11dICAuICAtLXF1b3Rlcz1bY1tjXV0KKyAgICAgICAgICAgICAgICAgIFNldCBzaGVsbCBxdW90ZSBjaGFyYWN0ZXJzLgorICAtfiAgLi4uLi4uLi4gIC0tdGlsZGUKKyAgICAgICAgICAgICAgICAgIERvbid0IGRpc3BsYXkgdGlsZGVzIGFmdGVyIGVuZCBvZiBmaWxlLgorICAtIyBbTl0gIC4uLi4gIC0tc2hpZnQ9W05dCisgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIHNjcm9sbCBhbW91bnQgKDAgPSBvbmUgaGFsZiBzY3JlZW4gd2lkdGgpCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTElORSBFRElUSU5HCisgICAgICAgIFRoZXNlIGtleXMgY2FuIGJlIHVzZWQgdG8gZWRpdCB0ZXh0IGJlaW5nIGVudGVyZWQKKyAgICAgICAgb24gdGhlICJjb21tYW5kIGxpbmUiIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KKyBSaWdodEFycm93ICAgICAgICAgICAgICAgICAgICAgICBFU0MtbCAgICAgTW92ZSBjdXJzb3IgcmlnaHQgb25lIGNoYXJhY3Rlci4KKyBMZWZ0QXJyb3cgICAgICAgICAgICAgICAgICAgICAgICBFU0MtaCAgICAgTW92ZSBjdXJzb3IgbGVmdCBvbmUgY2hhcmFjdGVyLgorIENOVEwtUmlnaHRBcnJvdyAgRVNDLVJpZ2h0QXJyb3cgIEVTQy13ICAgICBNb3ZlIGN1cnNvciByaWdodCBvbmUgd29yZC4KKyBDTlRMLUxlZnRBcnJvdyAgIEVTQy1MZWZ0QXJyb3cgICBFU0MtYiAgICAgTW92ZSBjdXJzb3IgbGVmdCBvbmUgd29yZC4KKyBIT01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtMCAgICAgTW92ZSBjdXJzb3IgdG8gc3RhcnQgb2YgbGluZS4KKyBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtJCAgICAgTW92ZSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUuCisgQkFDS1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBjaGFyIHRvIGxlZnQgb2YgY3Vyc29yLgorIERFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQy14ICAgICBEZWxldGUgY2hhciB1bmRlciBjdXJzb3IuCisgQ05UTC1CQUNLU1BBQ0UgICBFU0MtQkFDS1NQQUNFICAgICAgICAgICAgIERlbGV0ZSB3b3JkIHRvIGxlZnQgb2YgY3Vyc29yLgorIENOVEwtREVMRVRFICAgICAgRVNDLURFTEVURSAgICAgIEVTQy1YICAgICBEZWxldGUgd29yZCB1bmRlciBjdXJzb3IuCisgQ05UTC1VICAgICAgICAgICBFU0MgKE1TLURPUyBvbmx5KSAgICAgICAgIERlbGV0ZSBlbnRpcmUgbGluZS4KKyBVcEFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtayAgICAgUmV0cmlldmUgcHJldmlvdXMgY29tbWFuZCBsaW5lLgorIERvd25BcnJvdyAgICAgICAgICAgICAgICAgICAgICAgIEVTQy1qICAgICBSZXRyaWV2ZSBuZXh0IGNvbW1hbmQgbGluZS4KKyBUQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGUgZmlsZW5hbWUgJiBjeWNsZS4KKyBTSElGVC1UQUIgICAgICAgICAgICAgICAgICAgICAgICBFU0MtVEFCICAgQ29tcGxldGUgZmlsZW5hbWUgJiByZXZlcnNlIGN5Y2xlLgorIENOVEwtTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZSBmaWxlbmFtZSwgbGlzdCBhbGwuCisqLwpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL21ha2VkZXZzLmMgYi9taXNjdXRpbHMvbWFrZWRldnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ1YTEzCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL21ha2VkZXZzLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHB1YmxpYyBkb21haW4gLS0gRGF2ZSAnS2lsbCBhIENvcCcgQ2luZWdlIDxkY2luZWdlQHBzeWNob3Npcy5jb20+CisgKgorICogbWFrZWRldnMKKyAqIE1ha2UgcmFuZ2VzIG9mIGRldmljZSBmaWxlcyBxdWlja2x5LgorICoga25vd24gYnVnczogY2FuJ3QgZGVhbCB3aXRoIGFscGhhIHJhbmdlcworICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX01BS0VERVZTX0xFQUYKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTkFNRSBUWVBFIE1BSk9SIE1JTk9SIEZJUlNUIExBU1QgW3NdIgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGEgcmFuZ2Ugb2YgYmxvY2sgb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcblRZUEUgaXM6IgorLy91c2FnZTogICAgICJcbgliCUJsb2NrIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JYwlDaGFyYWN0ZXIgZGV2aWNlIgorLy91c2FnZTogICAgICJcbglmCUZJRk8sIE1BSk9SIGFuZCBNSU5PUiBhcmUgaWdub3JlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRklSU1QuLkxBU1Qgc3BlY2lmeSBudW1iZXJzIGFwcGVuZGVkIHRvIE5BTUUuIgorLy91c2FnZTogICAgICJcbklmICdzJyBpcyB0aGUgbGFzdCBhcmd1bWVudCwgdGhlIGJhc2UgZGV2aWNlIGlzIGNyZWF0ZWQgYXMgd2VsbC4iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JbWFrZWRldnMgL2Rldi90dHlTIGMgNCA2NiAyIDYzICAgLT4gIHR0eVMyLXR0eVM2MyIKKy8vdXNhZ2U6ICAgICAiXG4JbWFrZWRldnMgL2Rldi9oZGEgYiAzIDAgMCA4IHMgICAgLT4gIGhkYSxoZGExLWhkYTgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIjIG1ha2VkZXZzIC9kZXYvdHR5UyBjIDQgNjYgMiA2M1xuIgorLy91c2FnZTogICAgICAgIltjcmVhdGVzIHR0eVMyLXR0eVM2M11cbiIKKy8vdXNhZ2U6ICAgICAgICIjIG1ha2VkZXZzIC9kZXYvaGRhIGIgMyAwIDAgOCBzXG4iCisvL3VzYWdlOiAgICAgICAiW2NyZWF0ZXMgaGRhLGhkYTEtaGRhOF1cbiIKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEUKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIGRldmljZV90YWJsZV0gcm9vdGRpciIKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBhIHJhbmdlIG9mIHNwZWNpYWwgZmlsZXMgYXMgc3BlY2lmaWVkIGluIGEgZGV2aWNlIHRhYmxlLlxuIgorLy91c2FnZTogICAgICAgIkRldmljZSB0YWJsZSBlbnRyaWVzIHRha2UgdGhlIGZvcm0gb2Y6XG4iCisvL3VzYWdlOiAgICAgICAiPG5hbWU+IDx0eXBlPiA8bW9kZT4gPHVpZD4gPGdpZD4gPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluYz4gPGNvdW50PlxuIgorLy91c2FnZTogICAgICAgIldoZXJlIG5hbWUgaXMgdGhlIGZpbGUgbmFtZSwgdHlwZSBjYW4gYmUgb25lIG9mOlxuIgorLy91c2FnZTogICAgICAgIglmCVJlZ3VsYXIgZmlsZVxuIgorLy91c2FnZTogICAgICAgIglkCURpcmVjdG9yeVxuIgorLy91c2FnZTogICAgICAgIgljCUNoYXJhY3RlciBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJYglCbG9jayBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJcAlGaWZvIChuYW1lZCBwaXBlKVxuIgorLy91c2FnZTogICAgICAgInVpZCBpcyB0aGUgdXNlciBpZCBmb3IgdGhlIHRhcmdldCBmaWxlLCBnaWQgaXMgdGhlIGdyb3VwIGlkIGZvciB0aGVcbiIKKy8vdXNhZ2U6ICAgICAgICJ0YXJnZXQgZmlsZS4gVGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgKG1ham9yLCBtaW5vciwgZXRjKSBhcHBseSB0b1xuIgorLy91c2FnZTogICAgICAgInRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiBBICctJyBtYXkgYmUgdXNlZCBmb3IgYmxhbmsgZW50cmllcy4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGb3IgZXhhbXBsZTpcbiIKKy8vdXNhZ2U6ICAgICAgICI8bmFtZT4gICAgPHR5cGU+IDxtb2RlPjx1aWQ+PGdpZD48bWFqb3I+PG1pbm9yPjxzdGFydD48aW5jPjxjb3VudD5cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2ICAgICAgICAgZCAgIDc1NSAgICAwICAgIDAgICAgLSAgICAgIC0gICAgICAtICAgICAgLSAgICAtXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9jb25zb2xlIGMgICA2NjYgICAgMCAgICAwICAgIDUgICAgICAxICAgICAgLSAgICAgIC0gICAgLVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbnVsbCAgICBjICAgNjY2ICAgIDAgICAgMCAgICAxICAgICAgMyAgICAgIDAgICAgICAwICAgIC1cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3plcm8gICAgYyAgIDY2NiAgICAwICAgIDAgICAgMSAgICAgIDUgICAgICAwICAgICAgMCAgICAtXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGEgICAgIGIgICA2NDAgICAgMCAgICAwICAgIDMgICAgICAwICAgICAgMCAgICAgIDAgICAgLVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhICAgICBiICAgNjQwICAgIDAgICAgMCAgICAzICAgICAgMSAgICAgIDEgICAgICAxICAgIDE1XG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaWxsIFByb2R1Y2U6XG4iCisvL3VzYWdlOiAgICAgICAiL2RldlxuIgorLy91c2FnZTogICAgICAgIi9kZXYvY29uc29sZVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbnVsbFxuIgorLy91c2FnZTogICAgICAgIi9kZXYvemVyb1xuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGFbMC0xNV1cbiIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUFLRURFVlNfTEVBRgorLyoKK21ha2VkZXZzIE5BTUUgVFlQRSBNQUpPUiBNSU5PUiBGSVJTVCBMQVNUIFtzXQorVFlQRXM6CitiICAgICAgIEJsb2NrIGRldmljZQorYyAgICAgICBDaGFyYWN0ZXIgZGV2aWNlCitmICAgICAgIEZJRk8KKworRklSU1QuLkxBU1Qgc3BlY2lmeSBudW1iZXJzIGFwcGVuZGVkIHRvIE5BTUUuCitJZiAncycgaXMgdGhlIGxhc3QgYXJndW1lbnQsIHRoZSBiYXNlIGRldmljZSBpcyBjcmVhdGVkIGFzIHdlbGwuCitFeGFtcGxlczoKKyAgICAgICAgbWFrZWRldnMgL2Rldi90dHlTIGMgNCA2NiAyIDYzICAgLT4gIHR0eVMyLXR0eVM2MworICAgICAgICBtYWtlZGV2cyAvZGV2L2hkYSBiIDMgMCAwIDggcyAgICAtPiAgaGRhLGhkYTEtaGRhOAorKi8KK2ludCBtYWtlZGV2c19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWFrZWRldnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGU7CisJY2hhciAqYmFzZWRldiwgKnR5cGUsICpub2RuYW1lLCAqYnVmOworCWludCBTbWFqb3IsIFNtaW5vciwgUywgRTsKKworCWlmIChhcmdjIDwgNyB8fCBhcmd2WzFdWzBdID09ICctJykKKwkJYmJfc2hvd191c2FnZSgpOworCisJYmFzZWRldiA9IGFyZ3ZbMV07CisJYnVmID0geGFzcHJpbnRmKCIlcyV1IiwgYXJndlsxXSwgKHVuc2lnbmVkKS0xKTsKKwl0eXBlID0gYXJndlsyXTsKKwlTbWFqb3IgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzNdKTsKKwlTbWlub3IgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzRdKTsKKwlTID0geGF0b2lfcG9zaXRpdmUoYXJndls1XSk7CisJRSA9IHhhdG9pX3Bvc2l0aXZlKGFyZ3ZbNl0pOworCW5vZG5hbWUgPSBhcmd2WzddID8gYmFzZWRldiA6IGJ1ZjsKKworCW1vZGUgPSAwNjYwOworCXN3aXRjaCAodHlwZVswXSkgeworCWNhc2UgJ2MnOgorCQltb2RlIHw9IFNfSUZDSFI7CisJCWJyZWFrOworCWNhc2UgJ2InOgorCQltb2RlIHw9IFNfSUZCTEs7CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQltb2RlIHw9IFNfSUZJRk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwl3aGlsZSAoUyA8PSBFKSB7CisJCXNwcmludGYoYnVmLCAiJXMldSIsIGJhc2VkZXYsIFMpOworCisJCS8qIGlmIG1vZGUgIT0gU19JRkNIUiBhbmQgIT0gU19JRkJMSywKKwkJICogdGhpcmQgcGFyYW0gaW4gbWtub2QoKSBpZ25vcmVkICovCisJCWlmIChta25vZChub2RuYW1lLCBtb2RlLCBtYWtlZGV2KFNtYWpvciwgU21pbm9yKSkpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIG5vZG5hbWUpOworCisJCS8qaWYgKG5vZG5hbWUgPT0gYmFzZWRldikqLyAvKiBleC4gL2Rldi9oZGEgLSB0byAvZGV2L2hkYTEgLi4uICovCisJCQlub2RuYW1lID0gYnVmOworCQlTKys7CisJCVNtaW5vcisrOworCX0KKworCXJldHVybiAwOworfQorCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCisvKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLiAqLworCitpbnQgbWFrZWRldnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1ha2VkZXZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKmxpbmUgPSAoY2hhciAqKSItIjsKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBleGFjdGx5IG9uZSBwYXJhbSAqLworCWdldG9wdDMyKGFyZ3YsICJkOiIsICZsaW5lKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXhjaGRpcigqYXJndik7IC8qIGVuc3VyZSByb290IGRpciBleGlzdHMgKi8KKworCXVtYXNrKDApOworCisJcHJpbnRmKCJyb290ZGlyPSVzXG50YWJsZT0iLCAqYXJndik7CisJaWYgKE5PVF9MT05FX0RBU0gobGluZSkpIHsKKwkJcHJpbnRmKCInJXMnXG4iLCBsaW5lKTsKKwl9IGVsc2UgeworCQlwdXRzKCI8c3RkaW4+Iik7CisJfQorCisJcGFyc2VyID0gY29uZmlnX29wZW4obGluZSk7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJmxpbmUsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpbnQgbGluZW51bTsKKwkJY2hhciB0eXBlOworCQl1bnNpZ25lZCBtb2RlID0gMDc1NTsKKwkJdW5zaWduZWQgbWFqb3IgPSAwOworCQl1bnNpZ25lZCBtaW5vciA9IDA7CisJCXVuc2lnbmVkIGNvdW50ID0gMDsKKwkJdW5zaWduZWQgaW5jcmVtZW50ID0gMDsKKwkJdW5zaWduZWQgc3RhcnQgPSAwOworCQljaGFyIG5hbWVbNDFdOworCQljaGFyIHVzZXJbNDFdOworCQljaGFyIGdyb3VwWzQxXTsKKwkJY2hhciAqZnVsbF9uYW1lID0gbmFtZTsKKwkJdWlkX3QgdWlkOworCQlnaWRfdCBnaWQ7CisKKwkJbGluZW51bSA9IHBhcnNlci0+bGluZW5vOworCisJCWlmICgoMiA+IHNzY2FuZihsaW5lLCAiJTQwcyAlYyAlbyAlNDBzICU0MHMgJXUgJXUgJXUgJXUgJXUiLAorCQkJCQluYW1lLCAmdHlwZSwgJm1vZGUsIHVzZXIsIGdyb3VwLAorCQkJCQkmbWFqb3IsICZtaW5vciwgJnN0YXJ0LCAmaW5jcmVtZW50LCAmY291bnQpKQorCQkgfHwgKCh1bnNpZ25lZCkobWFqb3IgfCBtaW5vciB8IHN0YXJ0IHwgY291bnQgfCBpbmNyZW1lbnQpID4gMjU1KQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBsaW5lICVkOiAnJXMnIiwgbGluZW51bSwgbGluZSk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWdpZCA9ICgqZ3JvdXApID8gZ2V0X3VnX2lkKGdyb3VwLCB4Z3JvdXAyZ2lkKSA6IGdldGdpZCgpOworCQl1aWQgPSAoKnVzZXIpID8gZ2V0X3VnX2lkKHVzZXIsIHh1bmFtZTJ1aWQpIDogZ2V0dWlkKCk7CisJCS8qIFdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCByb290IGRpciwKKwkJICogc28gbWFrZSBhYnNvbHV0ZSBwYXRocyByZWxhdGl2ZSAqLworCQlpZiAoJy8nID09ICpmdWxsX25hbWUpCisJCQlmdWxsX25hbWUrKzsKKworCQlpZiAodHlwZSA9PSAnZCcpIHsKKwkJCWJiX21ha2VfZGlyZWN0b3J5KGZ1bGxfbmFtZSwgbW9kZSB8IFNfSUZESVIsIEZJTEVVVElMU19SRUNVUik7CisJCQlpZiAoY2hvd24oZnVsbF9uYW1lLCB1aWQsIGdpZCkgPT0gLTEpIHsKKyBjaG93bl9mYWlsOgorCQkJCWJiX3BlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNob3duICVzIiwgbGluZW51bSwgZnVsbF9uYW1lKTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY2htb2QoZnVsbF9uYW1lLCBtb2RlKSA8IDApIHsKKyBjaG1vZF9mYWlsOgorCQkJCWJiX3BlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNobW9kICVzIiwgbGluZW51bSwgZnVsbF9uYW1lKTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAodHlwZSA9PSAnZicpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKChzdGF0KGZ1bGxfbmFtZSwgJnN0KSA8IDAgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpKSB7CisJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogcmVndWxhciBmaWxlICclcycgZG9lcyBub3QgZXhpc3QiLCBsaW5lbnVtLCBmdWxsX25hbWUpOworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjaG93bihmdWxsX25hbWUsIHVpZCwgZ2lkKSA8IDApCisJCQkJZ290byBjaG93bl9mYWlsOworCQkJaWYgKGNobW9kKGZ1bGxfbmFtZSwgbW9kZSkgPCAwKQorCQkJCWdvdG8gY2htb2RfZmFpbDsKKwkJfSBlbHNlIHsKKwkJCWRldl90IHJkZXY7CisJCQl1bnNpZ25lZCBpOworCQkJY2hhciAqZnVsbF9uYW1lX2luYzsKKworCQkJaWYgKHR5cGUgPT0gJ3AnKSB7CisJCQkJbW9kZSB8PSBTX0lGSUZPOworCQkJfSBlbHNlIGlmICh0eXBlID09ICdjJykgeworCQkJCW1vZGUgfD0gU19JRkNIUjsKKwkJCX0gZWxzZSBpZiAodHlwZSA9PSAnYicpIHsKKwkJCQltb2RlIHw9IFNfSUZCTEs7CisJCQl9IGVsc2UgeworCQkJCWJiX2Vycm9yX21zZygibGluZSAlZDogdW5zdXBwb3J0ZWQgZmlsZSB0eXBlICVjIiwgbGluZW51bSwgdHlwZSk7CisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmdWxsX25hbWVfaW5jID0geG1hbGxvYyhzdHJsZW4oZnVsbF9uYW1lKSArIHNpemVvZihpbnQpKjMgKyAyKTsKKwkJCWlmIChjb3VudCkKKwkJCQljb3VudC0tOworCQkJZm9yIChpID0gc3RhcnQ7IGkgPD0gc3RhcnQgKyBjb3VudDsgaSsrKSB7CisJCQkJc3ByaW50ZihmdWxsX25hbWVfaW5jLCBjb3VudCA/ICIlcyV1IiA6ICIlcyIsIGZ1bGxfbmFtZSwgaSk7CisJCQkJcmRldiA9IG1ha2VkZXYobWFqb3IsIG1pbm9yICsgKGkgLSBzdGFydCkgKiBpbmNyZW1lbnQpOworCQkJCWlmIChta25vZChmdWxsX25hbWVfaW5jLCBtb2RlLCByZGV2KSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogY2FuJ3QgY3JlYXRlIG5vZGUgJXMiLCBsaW5lbnVtLCBmdWxsX25hbWVfaW5jKTsKKwkJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCX0gZWxzZSBpZiAoY2hvd24oZnVsbF9uYW1lX2luYywgdWlkLCBnaWQpIDwgMCkgeworCQkJCQliYl9wZXJyb3JfbXNnKCJsaW5lICVkOiBjYW4ndCBjaG93biAlcyIsIGxpbmVudW0sIGZ1bGxfbmFtZV9pbmMpOworCQkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJfSBlbHNlIGlmIChjaG1vZChmdWxsX25hbWVfaW5jLCBtb2RlKSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogY2FuJ3QgY2htb2QgJXMiLCBsaW5lbnVtLCBmdWxsX25hbWVfaW5jKTsKKwkJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCX0KKwkJCWZyZWUoZnVsbF9uYW1lX2luYyk7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNlbHNlCisjIGVycm9yIG1ha2VkZXZzIGNvbmZpZ3VyYXRpb24gZXJyb3IsIGVpdGhlciBsZWFmIG9yIHRhYmxlIG11c3QgYmUgc2VsZWN0ZWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL21hbi5jIGIvbWlzY3V0aWxzL21hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjdlODQKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvbWFuLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIG1pbmkgbWFuIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1hbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hd10gW01BTlBBR0VdLi4uIgorLy91c2FnZTojZGVmaW5lIG1hbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZvcm1hdCBhbmQgZGlzcGxheSBtYW51YWwgcGFnZVxuIgorLy91c2FnZTogICAgICJcbgktYQlEaXNwbGF5IGFsbCBwYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJU2hvdyBwYWdlIGxvY2F0aW9ucyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCU9QVF9hID0gMSwgLyogYWxsICovCisJT1BUX3cgPSAyLCAvKiBwcmludCBwYXRoICovCit9OworCisvKiBUaGlzIGlzIHdoYXQgSSBzZWUgb24gbXkgZGVza3RvcCBzeXN0ZW0gYmVpbmcgZXhlY3V0ZWQ6CisKKygKK2VjaG8gIi5sbCAxMi40aSIKK2VjaG8gIi5uciBMTCAxMi40aSIKK2VjaG8gIi5wbCAxMTAwaSIKK2d1bnppcCAtYyAnL3Vzci9tYW4vbWFuMS9iemlwMi4xLmd6JworZWNobyAiLlxcXCIiCitlY2hvICIucGwgXG4obmx1KzEwIgorKSB8IGd0YmwgfCBucm9mZiAtVGxhdGluMSAtbWFuZG9jIHwgbGVzcworCisqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQQorI2RlZmluZSBaX1NVRkZJWCAiLmx6bWEiCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKyNkZWZpbmUgWl9TVUZGSVggIi5iejIiCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorI2RlZmluZSBaX1NVRkZJWCAiLmd6IgorI2Vsc2UKKyNkZWZpbmUgWl9TVUZGSVggIiIKKyNlbmRpZgorCitzdGF0aWMgaW50IHNob3dfbWFucGFnZShjb25zdCBjaGFyICpwYWdlciwgY2hhciAqbWFuX2ZpbGVuYW1lLCBpbnQgbWFuLCBpbnQgbGV2ZWwpOworCitzdGF0aWMgaW50IHJ1bl9waXBlKGNvbnN0IGNoYXIgKnBhZ2VyLCBjaGFyICptYW5fZmlsZW5hbWUsIGludCBtYW4sIGludCBsZXZlbCkKK3sKKwljaGFyICpjbWQ7CisKKwkvKiBQcmV2ZW50IG1hbiBwYWdlIGxpbmsgbG9vcHMgKi8KKwlpZiAobGV2ZWwgPiAxMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWNjZXNzKG1hbl9maWxlbmFtZSwgUl9PSykgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF93KSB7CisJCXB1dHMobWFuX2ZpbGVuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1hbikgeyAvKiBtYW4gcGFnZSwgbm90IGNhdCBwYWdlICovCisJCS8qIElzIHRoaXMgYSBsaW5rIHRvIGFub3RoZXIgbWFucGFnZT8gKi8KKwkJLyogVGhlIGxpbmsgaGFzIHRoZSBmb2xsb3dpbmcgb24gdGhlIGZpcnN0IGxpbmU6ICovCisJCS8qICIuc28gYW5vdGhlcl9tYW5fcGFnZSIgKi8KKworCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJY2hhciAqbGluZTsKKwkJY2hhciAqbGlua25hbWUsICpwOworCisJCS8qIE9uIG15IHN5c3RlbToKKwkJICogbWFuMS9nZW5ob3N0aWQuMS5nejogMjAzIGJ5dGVzIC0gc21hbGxlc3QgcmVhbCBtYW5wYWdlCisJCSAqIG1hbjIvcGF0aF9yZXNvbHV0aW9uLjIuZ3o6IDExNCBieXRlcyAtIGxhcmdlc3QgbGluaworCQkgKi8KKwkJeHN0YXQobWFuX2ZpbGVuYW1lLCAmc2IpOworCQlpZiAoc2Iuc3Rfc2l6ZSA+IDMwMCkgLyogZXJyIG9uIHRoZSBzYWZlIHNpZGUgKi8KKwkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKworCQlsaW5lID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKG1hbl9maWxlbmFtZSwgTlVMTCk7CisJCWlmICghbGluZSB8fCBzdHJuY21wKGxpbmUsICIuc28gIiwgNCkgIT0gMCkgeworCQkJZnJlZShsaW5lKTsKKwkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKwkJfQorCQkvKiBFeGFtcGxlOiBtYW4yL3BhdGhfcmVzb2x1dGlvbi4yLmd6IGNvbnRhaW5zCisJCSAqICIuc28gbWFuNy9wYXRoX3Jlc29sdXRpb24uN1xuPGp1bms+IgorCQkgKi8KKwkJKnN0cmNocm51bChsaW5lLCAnXG4nKSA9ICdcMCc7CisJCWxpbmtuYW1lID0gc2tpcF93aGl0ZXNwYWNlKCZsaW5lWzRdKTsKKworCQkvKiBJZiBsaW5rIGhhcyBubyBzbGFzaGVzLCB3ZSBqdXN0IHJlcGxhY2UgbWFuIHBhZ2UgbmFtZS4KKwkJICogSWYgbGluayBoYXMgc2xhc2hlcyAoaG93ZXZlciBtYW55KSwgd2UgZ28gYmFjayAqb25jZSouCisJCSAqICIuc28genp6L2dnZy9wYWdlLjMiIGRvZXMgTk9UIGdvIGJhY2sgdHdvIGxldmVscy4gKi8KKwkJcCA9IHN0cnJjaHIobWFuX2ZpbGVuYW1lLCAnLycpOworCQlpZiAoIXApCisJCQlnb3RvIG9yZGluYXJ5X21hbnBhZ2U7CisJCSpwID0gJ1wwJzsKKwkJaWYgKHN0cmNocihsaW5rbmFtZSwgJy8nKSkgeworCQkJcCA9IHN0cnJjaHIobWFuX2ZpbGVuYW1lLCAnLycpOworCQkJaWYgKCFwKQorCQkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKwkJCSpwID0gJ1wwJzsKKwkJfQorCisJCS8qIExpbmtzIGRvIG5vdCBoYXZlIC5neiBleHRlbnNpb25zLCBldmVuIGlmIG1hbnBhZ2UKKwkJICogaXMgY29tcHJlc3NlZCAqLworCQltYW5fZmlsZW5hbWUgPSB4YXNwcmludGYoIiVzLyVzIiBaX1NVRkZJWCwgbWFuX2ZpbGVuYW1lLCBsaW5rbmFtZSk7CisJCWZyZWUobGluZSk7CisJCS8qIE5vdGU6IHdlIGxlYWsgIm5ldyIgbWFuX2ZpbGVuYW1lIHN0cmluZyBhcyB3ZWxsLi4uICovCisJCWlmIChzaG93X21hbnBhZ2UocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCArIDEpKQorCQkJcmV0dXJuIDE7CisJCS8qIGVsc2U6IHNob3cgdGhlIGxpbmssIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZyAqLworCX0KKworIG9yZGluYXJ5X21hbnBhZ2U6CisJY2xvc2UoU1RESU5fRklMRU5PKTsKKwlvcGVuX3ppcHBlZChtYW5fZmlsZW5hbWUpOyAvKiBndWFyYW50ZWVkIHRvIHVzZSBmZCAwIChTVERJTl9GSUxFTk8pICovCisJLyogIjI+JjEiIGlzIGFkZGVkIHNvIHRoYXQgbnJvZmYgZXJyb3JzIGFyZSBzaG93biBpbiBwYWdlciB0b28uCisJICogT3RoZXJ3aXNlIGl0IG1heSBzaG93IGp1c3QgZW1wdHkgc2NyZWVuICovCisJY21kID0geGFzcHJpbnRmKAorCQltYW4gPyAiZ3RibCB8IG5yb2ZmIC1UbGF0aW4xIC1tYW5kb2MgMj4mMSB8ICVzIgorCQkgICAgOiAiJXMiLAorCQlwYWdlcik7CisJc3lzdGVtKGNtZCk7CisJZnJlZShjbWQpOworCXJldHVybiAxOworfQorCisvKiBtYW5fZmlsZW5hbWUgaXMgb2YgdGhlIGZvcm0gIi9kaXIvZGlyL2Rpci9uYW1lLnMiIFpfU1VGRklYICovCitzdGF0aWMgaW50IHNob3dfbWFucGFnZShjb25zdCBjaGFyICpwYWdlciwgY2hhciAqbWFuX2ZpbGVuYW1lLCBpbnQgbWFuLCBpbnQgbGV2ZWwpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQQorCWlmIChydW5fcGlwZShwYWdlciwgbWFuX2ZpbGVuYW1lLCBtYW4sIGxldmVsKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwlzdHJjcHkoc3RycmNocihtYW5fZmlsZW5hbWUsICcuJykgKyAxLCAiYnoyIik7CisjZW5kaWYKKwlpZiAocnVuX3BpcGUocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCkpCisJCXJldHVybiAxOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEgfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJc3RyY3B5KHN0cnJjaHIobWFuX2ZpbGVuYW1lLCAnLicpICsgMSwgImd6Iik7CisjZW5kaWYKKwlpZiAocnVuX3BpcGUocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCkpCisJCXJldHVybiAxOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19MWk1BIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMiB8fCBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCSpzdHJyY2hyKG1hbl9maWxlbmFtZSwgJy4nKSA9ICdcMCc7CisjZW5kaWYKKwlpZiAocnVuX3BpcGUocGFnZXIsIG1hbl9maWxlbmFtZSwgbWFuLCBsZXZlbCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1hbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljb25zdCBjaGFyICpwYWdlcjsKKwljaGFyICoqbWFuX3BhdGhfbGlzdDsKKwljaGFyICpzZWNfbGlzdDsKKwljaGFyICpjdXJfcGF0aCwgKmN1cl9zZWN0OworCWludCBjb3VudF9tcCwgY3VyX21wOworCWludCBvcHQsIG5vdF9mb3VuZDsKKwljaGFyICp0b2tlblsyXTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3Qgb25lIGFyZ3VtZW50ICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIithdyIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJc2VjX2xpc3QgPSB4c3RyZHVwKCIxOjI6Mzo0OjU6Njo3Ojg6OSIpOworCS8qIExhc3QgdmFsaWQgbWFuX3BhdGhfbGlzdFtdIGlzIFsweDEwXSAqLworCWNvdW50X21wID0gMDsKKwltYW5fcGF0aF9saXN0ID0geHphbGxvYygweDExICogc2l6ZW9mKG1hbl9wYXRoX2xpc3RbMF0pKTsKKwltYW5fcGF0aF9saXN0WzBdID0gZ2V0ZW52KCJNQU5QQVRIIik7CisJaWYgKCFtYW5fcGF0aF9saXN0WzBdKSAvKiBkZWZhdWx0LCBtYXkgYmUgb3ZlcnJpZGRlbiBieSAvZXRjL21hbi5jb25mICovCisJCW1hbl9wYXRoX2xpc3RbMF0gPSAoY2hhciopIi91c3IvbWFuIjsKKwllbHNlCisJCWNvdW50X21wKys7CisJcGFnZXIgPSBnZXRlbnYoIk1BTlBBR0VSIik7CisJaWYgKCFwYWdlcikgeworCQlwYWdlciA9IGdldGVudigiUEFHRVIiKTsKKwkJaWYgKCFwYWdlcikKKwkJCXBhZ2VyID0gIm1vcmUiOworCX0KKworCS8qIFBhcnNlIG1hbi5jb25mW2lnXSBvciBtYW5fZGIuY29uZiAqLworCS8qIG1hbiB2ZXJzaW9uIDEuNmYgdXNlcyBtYW4uY29uZmlnICovCisJLyogbWFuLWRiIGltcGxlbWVudGF0aW9uIG9mIG1hbiB1c2VzIG1hbl9kYi5jb25mICovCisJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21hbi5jb25maWciLCBmb3Blbl9mb3JfcmVhZCk7CisJaWYgKCFwYXJzZXIpCisJCXBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9tYW4uY29uZiIsIGZvcGVuX2Zvcl9yZWFkKTsKKwlpZiAoIXBhcnNlcikKKwkJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21hbl9kYi5jb25mIiwgZm9wZW5fZm9yX3JlYWQpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDAsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoIXRva2VuWzFdKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAoIk1BTkRBVE9SWV9NQU5QQVRIIisxMCwgdG9rZW5bMF0pID09IDAgLyogIk1BTlBBVEgiPyAqLworCQkgfHwgc3RyY21wKCJNQU5EQVRPUllfTUFOUEFUSCIsIHRva2VuWzBdKSA9PSAwCisJCSkgeworCQkJY2hhciAqcGF0aCA9IHRva2VuWzFdOworCQkJd2hpbGUgKCpwYXRoKSB7CisJCQkJY2hhciAqbmV4dF9wYXRoOworCQkJCWNoYXIgKipwYXRoX2VsZW1lbnQ7CisKKwkJCQluZXh0X3BhdGggPSBzdHJjaHIocGF0aCwgJzonKTsKKwkJCQlpZiAobmV4dF9wYXRoKSB7CisJCQkJCSpuZXh0X3BhdGggPSAnXDAnOworCQkJCQlpZiAobmV4dF9wYXRoKysgPT0gcGF0aCkgLyogIjo6Ij8gKi8KKwkJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJLyogRG8gd2UgYWxyZWFkeSBoYXZlIHBhdGg/ICovCisJCQkJcGF0aF9lbGVtZW50ID0gbWFuX3BhdGhfbGlzdDsKKwkJCQl3aGlsZSAoKnBhdGhfZWxlbWVudCkgeworCQkJCQlpZiAoc3RyY21wKCpwYXRoX2VsZW1lbnQsIHBhdGgpID09IDApCisJCQkJCQlnb3RvIHNraXA7CisJCQkJCXBhdGhfZWxlbWVudCsrOworCQkJCX0KKwkJCQltYW5fcGF0aF9saXN0ID0geHJlYWxsb2NfdmVjdG9yKG1hbl9wYXRoX2xpc3QsIDQsIGNvdW50X21wKTsKKwkJCQltYW5fcGF0aF9saXN0W2NvdW50X21wXSA9IHhzdHJkdXAocGF0aCk7CisJCQkJY291bnRfbXArKzsKKwkJCQkvKiBtYW5fcGF0aF9saXN0IGlzIE5VTEwgdGVybWluYXRlZCAqLworCQkJCS8qbWFuX3BhdGhfbGlzdFtjb3VudF9tcF0gPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKyBza2lwOgorCQkJCWlmICghbmV4dF9wYXRoKQorCQkJCQlicmVhazsKKyBuZXh0OgorCQkJCXBhdGggPSBuZXh0X3BhdGg7CisJCQl9CisJCX0KKwkJaWYgKHN0cmNtcCgiTUFOU0VDVCIsIHRva2VuWzBdKSA9PSAwKSB7CisJCQlmcmVlKHNlY19saXN0KTsKKwkJCXNlY19saXN0ID0geHN0cmR1cCh0b2tlblsxXSk7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwlub3RfZm91bmQgPSAwOworCWRvIHsgLyogZm9yIGVhY2ggYXJndltdICovCisJCWludCBmb3VuZCA9IDA7CisJCWN1cl9tcCA9IDA7CisKKwkJaWYgKHN0cmNocigqYXJndiwgJy8nKSkgeworCQkJZm91bmQgPSBzaG93X21hbnBhZ2UocGFnZXIsICphcmd2LCAvKm1hbjoqLyAxLCAwKTsKKwkJCWdvdG8gY2hlY2tfZm91bmQ7CisJCX0KKwkJd2hpbGUgKChjdXJfcGF0aCA9IG1hbl9wYXRoX2xpc3RbY3VyX21wKytdKSAhPSBOVUxMKSB7CisJCQkvKiBmb3IgZWFjaCBNQU5QQVRIICovCisJCQljdXJfc2VjdCA9IHNlY19saXN0OworCQkJZG8geyAvKiBmb3IgZWFjaCBzZWN0aW9uICovCisJCQkJY2hhciAqbmV4dF9zZWN0ID0gc3RyY2hybnVsKGN1cl9zZWN0LCAnOicpOworCQkJCWludCBzZWN0X2xlbiA9IG5leHRfc2VjdCAtIGN1cl9zZWN0OworCQkJCWNoYXIgKm1hbl9maWxlbmFtZTsKKwkJCQlpbnQgY2F0MG1hbjEgPSAwOworCisJCQkJLyogU2VhcmNoIGZvciBjYXQsIHRoZW4gbWFuIHBhZ2UgKi8KKwkJCQl3aGlsZSAoY2F0MG1hbjEgPCAyKSB7CisJCQkJCWludCBmb3VuZF9oZXJlOworCQkJCQltYW5fZmlsZW5hbWUgPSB4YXNwcmludGYoIiVzLyVzJS4qcy8lcy4lLipzIiBaX1NVRkZJWCwKKwkJCQkJCQljdXJfcGF0aCwKKwkJCQkJCQkiY2F0XDBtYW4iICsgKGNhdDBtYW4xICogNCksCisJCQkJCQkJc2VjdF9sZW4sIGN1cl9zZWN0LAorCQkJCQkJCSphcmd2LAorCQkJCQkJCXNlY3RfbGVuLCBjdXJfc2VjdCk7CisJCQkJCWZvdW5kX2hlcmUgPSBzaG93X21hbnBhZ2UocGFnZXIsIG1hbl9maWxlbmFtZSwgY2F0MG1hbjEsIDApOworCQkJCQlmb3VuZCB8PSBmb3VuZF9oZXJlOworCQkJCQljYXQwbWFuMSArPSBmb3VuZF9oZXJlICsgMTsKKwkJCQkJZnJlZShtYW5fZmlsZW5hbWUpOworCQkJCX0KKworCQkJCWlmIChmb3VuZCAmJiAhKG9wdCAmIE9QVF9hKSkKKwkJCQkJZ290byBuZXh0X2FyZzsKKwkJCQljdXJfc2VjdCA9IG5leHRfc2VjdDsKKwkJCQl3aGlsZSAoKmN1cl9zZWN0ID09ICc6JykKKwkJCQkJY3VyX3NlY3QrKzsKKwkJCX0gd2hpbGUgKCpjdXJfc2VjdCk7CisJCX0KKyBjaGVja19mb3VuZDoKKwkJaWYgKCFmb3VuZCkgeworCQkJYmJfZXJyb3JfbXNnKCJubyBtYW51YWwgZW50cnkgZm9yICclcyciLCAqYXJndik7CisJCQlub3RfZm91bmQgPSAxOworCQl9CisgbmV4dF9hcmc6CisJCWFyZ3YrKzsKKwl9IHdoaWxlICgqYXJndik7CisKKwlyZXR1cm4gbm90X2ZvdW5kOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL21pY3JvY29tLmMgYi9taXNjdXRpbHMvbWljcm9jb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI5YTFhCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL21pY3JvY29tLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJhcmUgYm9uZXMgJ3RhbGsgdG8gbW9kZW0nIHByb2dyYW0gLSBzaW1pbGFyIHRvICdjdSAtbCAkZGV2aWNlJworICogaW5zcGlyZWQgYnkgbWdldHR5J3MgbWljcm9jb20KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1pY3JvY29tX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWQgREVMQVldIFstdCBUSU1FT1VUXSBbLXMgU1BFRURdIFstWF0gVFRZIgorLy91c2FnZTojZGVmaW5lIG1pY3JvY29tX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29weSBieXRlcyBmb3Igc3RkaW4gdG8gVFRZIGFuZCBmcm9tIFRUWSB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJV2FpdCB1cCB0byBERUxBWSBtcyBmb3IgVFRZIG91dHB1dCBiZWZvcmUgc2VuZGluZyBldmVyeSIKKy8vdXNhZ2U6ICAgICAiXG4JCW5leHQgYnl0ZSB0byBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJRXhpdCBpZiBib3RoIHN0ZGluIGFuZCBUVFkgYXJlIHNpbGVudCBmb3IgVElNRU9VVCBtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2V0IHNlcmlhbCBsaW5lIHRvIFNQRUVEIgorLy91c2FnZTogICAgICJcbgktWAlEaXNhYmxlIHNwZWNpYWwgbWVhbmluZyBvZiBOVUwgYW5kIEN0cmwtWCBmcm9tIHN0ZGluIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8gc2V0IHJhdyB0dHkgbW9kZQorc3RhdGljIHZvaWQgeGdldDEoaW50IGZkLCBzdHJ1Y3QgdGVybWlvcyAqdCwgc3RydWN0IHRlcm1pb3MgKm9sZHQpCit7CisJdGNnZXRhdHRyKGZkLCBvbGR0KTsKKwkqdCA9ICpvbGR0OworCWNmbWFrZXJhdyh0KTsKKy8vCXQtPmNfbGZsYWcgJj0gfihJU0lHfElDQU5PTnxFQ0hPfElFWFRFTik7CisvLwl0LT5jX2lmbGFnICY9IH4oQlJLSU5UfElYT058SUNSTkwpOworLy8JdC0+Y19vZmxhZyAmPSB+KE9OTENSKTsKKy8vCXQtPmNfY2NbVk1JTl0gID0gMTsKKy8vCXQtPmNfY2NbVlRJTUVdID0gMDsKK30KKworc3RhdGljIGludCB4c2V0MShpbnQgZmQsIHN0cnVjdCB0ZXJtaW9zICp0aW8sIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlpbnQgcmV0ID0gdGNzZXRhdHRyKGZkLCBUQ1NBRkxVU0gsIHRpbyk7CisKKwlpZiAocmV0KSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHRjc2V0YXR0ciBmb3IgJXMiLCBkZXZpY2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWljcm9jb21fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1pY3JvY29tX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2ZkOworCWludCBuZmQ7CisJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJc3RydWN0IHRlcm1pb3MgdGlvMCwgdGlvc2ZkLCB0aW87CisJY2hhciAqZGV2aWNlX2xvY2tfZmlsZTsKKwllbnVtIHsKKwkJT1BUX1ggPSAxIDw8IDAsIC8vIGRvIG5vdCByZXNwZWN0IEN0cmwtWCwgQ3RybC1ACisJCU9QVF9zID0gMSA8PCAxLCAvLyBiYXVkcmF0ZQorCQlPUFRfZCA9IDEgPDwgMiwgLy8gd2FpdCBmb3IgZGV2aWNlIHJlc3BvbnNlLCBtcworCQlPUFRfdCA9IDEgPDwgMywgLy8gdGltZW91dCwgbXMKKwl9OworCXNwZWVkX3Qgc3BlZWQgPSA5NjAwOworCWludCBkZWxheSA9IC0xOworCWludCB0aW1lb3V0ID0gLTE7CisJdW5zaWduZWQgb3B0czsKKworCS8vIGZldGNoIG9wdGlvbnMKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTpzKzpkKzp0KyI7IC8vIGV4YWN0bHkgb25lIGFyZywgbnVtZXJpYyBvcHRpb25zCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJYczpkOnQ6IiwgJnNwZWVkLCAmZGVsYXksICZ0aW1lb3V0KTsKKy8vCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gdHJ5IHRvIGNyZWF0ZSBsb2NrIGZpbGUgaW4gL3Zhci9sb2NrCisJZGV2aWNlX2xvY2tfZmlsZSA9IChjaGFyICopYmJfYmFzZW5hbWUoYXJndlswXSk7CisJZGV2aWNlX2xvY2tfZmlsZSA9IHhhc3ByaW50ZigiL3Zhci9sb2NrL0xDSy4uJXMiLCBkZXZpY2VfbG9ja19maWxlKTsKKwlzZmQgPSBvcGVuKGRldmljZV9sb2NrX2ZpbGUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0VYQ0wsIDA2NDQpOworCWlmIChzZmQgPCAwKSB7CisJCS8vIGRldmljZSBhbHJlYWR5IGxvY2tlZCAtPiBiYWlsIG91dAorCQlpZiAoZXJybm8gPT0gRUVYSVNUKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjcmVhdGUgJyVzJyIsIGRldmljZV9sb2NrX2ZpbGUpOworCQkvLyBjYW4ndCBjcmVhdGUgbG9jayAtPiBkb24ndCBjYXJlCisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoZGV2aWNlX2xvY2tfZmlsZSk7CisJCWRldmljZV9sb2NrX2ZpbGUgPSBOVUxMOworCX0gZWxzZSB7CisJCS8vICU0ZCB0byBtYWtlIGNvbmN1cnJlbnQgbWdldHR5IChpZiBhbnkpIGhhcHB5LgorCQkvLyBNZ2V0dHkgdHJlYXRzIDQtYnl0ZXMgbG9jayBmaWxlcyBhcyBiaW5hcnksCisJCS8vIG5vdCB0ZXh0LCBQSUQuIE1ha2luZyA1KyBjaGFyIGZpbGUuIEJycnIuLi4KKwkJZmRwcmludGYoc2ZkLCAiJTRkXG4iLCBnZXRwaWQoKSk7CisJCWNsb3NlKHNmZCk7CisJfQorCisJLy8gc2V0dXAgc2lnbmFscworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0hVUCkKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJKyAoMSA8PCBTSUdQSVBFKQorCQksIHJlY29yZF9zaWdubyk7CisKKwkvLyBlcnJvciBleGl0IGNvZGUgaWYgd2UgZmFpbCB0byBvcGVuIHRoZSBkZXZpY2UKKwliYl9nb3Rfc2lnbmFsID0gMTsKKworCS8vIG9wZW4gZGV2aWNlCisJc2ZkID0gb3Blbl9vcl93YXJuKGFyZ3ZbMF0sIE9fUkRXUiB8IE9fTk9DVFRZIHwgT19OT05CTE9DSyk7CisJaWYgKHNmZCA8IDApCisJCWdvdG8gZG9uZTsKKwlmY250bChzZmQsIEZfU0VURkwsIE9fUkRXUik7CisKKwkvLyBwdXQgZGV2aWNlIHRvICJyYXcgbW9kZSIKKwl4Z2V0MShzZmQsICZ0aW8sICZ0aW9zZmQpOworCS8vIHNldCBkZXZpY2Ugc3BlZWQKKwljZnNldHNwZWVkKCZ0aW8sIHR0eV92YWx1ZV90b19iYXVkKHNwZWVkKSk7CisJaWYgKHhzZXQxKHNmZCwgJnRpbywgYXJndlswXSkpCisJCWdvdG8gZG9uZTsKKworCS8vIHB1dCBzdGRpbiB0byAicmF3IG1vZGUiIChpZiBzdGRpbiBpcyBhIFRUWSksCisJLy8gaGFuZGxlIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKSB7CisJCXhnZXQxKFNURElOX0ZJTEVOTywgJnRpbywgJnRpbzApOworCQlpZiAoeHNldDEoU1RESU5fRklMRU5PLCAmdGlvLCAic3RkaW4iKSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyBtYWluIGxvb3A6IGNoZWNrIHdpdGggcG9sbCgpLCB0aGVuIHJlYWQvd3JpdGUgYnl0ZXMgYWNyb3NzCisJcGZkWzBdLmZkID0gc2ZkOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJcGZkWzFdLmZkID0gU1RESU5fRklMRU5POworCXBmZFsxXS5ldmVudHMgPSBQT0xMSU47CisKKwliYl9nb3Rfc2lnbmFsID0gMDsKKwluZmQgPSAyOworCS8vIE5vdCBzYWZlX3BvbGw6IHdlIHdhbnQgdG8gZXhpdCBvbiBzaWduYWwKKwl3aGlsZSAoIWJiX2dvdF9zaWduYWwgJiYgcG9sbChwZmQsIG5mZCwgdGltZW91dCkgPiAwKSB7CisJCWlmIChuZmQgPiAxICYmIHBmZFsxXS5yZXZlbnRzKSB7CisJCQljaGFyIGM7CisJCQkvLyByZWFkIGZyb20gc3RkaW4gLT4gd3JpdGUgdG8gZGV2aWNlCisJCQlpZiAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpIDwgMSkgeworCQkJCS8vIGRvbid0IHBvbGwgc3RkaW4gYW55bW9yZSBpZiB3ZSBnb3QgRU9GL2Vycm9yCisJCQkJbmZkLS07CisJCQkJZ290byBza2lwX3dyaXRlOworCQkJfQorCQkJLy8gZG8gd2UgbmVlZCBzcGVjaWFsIHByb2Nlc3Npbmc/CisJCQlpZiAoIShvcHRzICYgT1BUX1gpKSB7CisJCQkJLy8gXkAgc2VuZHMgQnJlYWsKKwkJCQlpZiAoVklOVFIgPT0gYykgeworCQkJCQl0Y3NlbmRicmVhayhzZmQsIDApOworCQkJCQlnb3RvIHNraXBfd3JpdGU7CisJCQkJfQorCQkJCS8vIF5YIGV4aXRzCisJCQkJaWYgKDI0ID09IGMpCisJCQkJCWJyZWFrOworCQkJfQorCQkJd3JpdGUoc2ZkLCAmYywgMSk7CisJCQlpZiAoZGVsYXkgPj0gMCkKKwkJCQlzYWZlX3BvbGwocGZkLCAxLCBkZWxheSk7Citza2lwX3dyaXRlOiA7CisJCX0KKwkJaWYgKHBmZFswXS5yZXZlbnRzKSB7CisjZGVmaW5lIGlvYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCQlzc2l6ZV90IGxlbjsKKwkJCS8vIHJlYWQgZnJvbSBkZXZpY2UgLT4gd3JpdGUgdG8gc3Rkb3V0CisJCQlsZW4gPSBzYWZlX3JlYWQoc2ZkLCBpb2J1Ziwgc2l6ZW9mKGlvYnVmKSk7CisJCQlpZiAobGVuID4gMCkKKwkJCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGlvYnVmLCBsZW4pOworCQkJZWxzZSB7CisJCQkJLy8gRU9GL2Vycm9yIC0+IGJhaWwgb3V0CisJCQkJYmJfZ290X3NpZ25hbCA9IFNJR0hVUDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIHJlc3RvcmUgZGV2aWNlIG1vZGUKKwl0Y3NldGF0dHIoc2ZkLCBUQ1NBRkxVU0gsICZ0aW9zZmQpOworCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pKQorCQl0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRkxVU0gsICZ0aW8wKTsKKworZG9uZToKKwlpZiAoZGV2aWNlX2xvY2tfZmlsZSkKKwkJdW5saW5rKGRldmljZV9sb2NrX2ZpbGUpOworCisJcmV0dXJuIGJiX2dvdF9zaWduYWw7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvbW91bnRwb2ludC5jIGIvbWlzY3V0aWxzL21vdW50cG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQxZjdjCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL21vdW50cG9pbnQuYwpAQCAtMCwwICsxLDk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtb3VudHBvaW50IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQmFzZWQgb24gc3lzdmluaXQncyBtb3VudHBvaW50CisgKi8KKworLy91c2FnZTojZGVmaW5lIG1vdW50cG9pbnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcV0gPFstZG5dIERJUiB8IC14IERFVklDRT4iCisvL3VzYWdlOiNkZWZpbmUgbW91bnRwb2ludF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoZWNrIGlmIHRoZSBkaXJlY3RvcnkgaXMgYSBtb3VudHBvaW50XG4iCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktZAlQcmludCBtYWpvci9taW5vciBkZXZpY2UgbnVtYmVyIG9mIHRoZSBmaWxlc3lzdGVtIgorLy91c2FnZTogICAgICJcbgktbglQcmludCBkZXZpY2UgbmFtZSBvZiB0aGUgZmlsZXN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJUHJpbnQgbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBvZiB0aGUgYmxvY2tkZXZpY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1vdW50cG9pbnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbW91bnRwb2ludCAvcHJvY1xuIgorLy91c2FnZTogICAgICAgIi9wcm9jIGlzIG5vdCBhIG1vdW50cG9pbnRcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50cG9pbnQgL3N5c1xuIgorLy91c2FnZTogICAgICAgIi9zeXMgaXMgYSBtb3VudHBvaW50XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgbW91bnRwb2ludF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbW91bnRwb2ludF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqbXNnOworCWNoYXIgKmFyZzsKKwlpbnQgcmMsIG9wdDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsgLyogbXVzdCBoYXZlIG9uZSBhcmd1bWVudCAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJxZHhuIik7CisjZGVmaW5lIE9QVF9xICgxKQorI2RlZmluZSBPUFRfZCAoMikKKyNkZWZpbmUgT1BUX3ggKDQpCisjZGVmaW5lIE9QVF9uICg4KQorCWFyZyA9IGFyZ3Zbb3B0aW5kXTsKKwltc2cgPSAiJXMiOworCisJcmMgPSAob3B0ICYgT1BUX3gpID8gc3RhdChhcmcsICZzdCkgOiBsc3RhdChhcmcsICZzdCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZXJyOworCisJaWYgKG9wdCAmIE9QVF94KSB7CisJCWlmIChTX0lTQkxLKHN0LnN0X21vZGUpKSB7CisJCQlwcmludGYoIiV1OiV1XG4iLCBtYWpvcihzdC5zdF9yZGV2KSwKKwkJCQkJCW1pbm9yKHN0LnN0X3JkZXYpKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJZXJybm8gPSAwOyAvKiBtYWtlIHBlcnJvcl9tc2cgd29yayBhcyBlcnJvcl9tc2cgKi8KKwkJbXNnID0gIiVzOiBub3QgYSBibG9jayBkZXZpY2UiOworCQlnb3RvIGVycjsKKwl9CisKKwllcnJubyA9IEVOT1RESVI7CisJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZGV2X3Qgc3RfZGV2ID0gc3Quc3RfZGV2OworCQlpbm9fdCBzdF9pbm8gPSBzdC5zdF9pbm87CisJCWNoYXIgKnAgPSB4YXNwcmludGYoIiVzLy4uIiwgYXJnKTsKKworCQlpZiAoc3RhdChwLCAmc3QpID09IDApIHsKKwkJCS8vaW50IGlzX21udCA9IChzdF9kZXYgIT0gc3Quc3RfZGV2KSB8fCAoc3RfZGV2ID09IHN0LnN0X2RldiAmJiBzdF9pbm8gPT0gc3Quc3RfaW5vKTsKKwkJCWludCBpc19ub3RfbW50ID0gKHN0X2RldiA9PSBzdC5zdF9kZXYpICYmIChzdF9pbm8gIT0gc3Quc3RfaW5vKTsKKworCQkJaWYgKG9wdCAmIE9QVF9kKQorCQkJCXByaW50ZigiJXU6JXVcbiIsIG1ham9yKHN0X2RldiksIG1pbm9yKHN0X2RldikpOworCQkJaWYgKG9wdCAmIE9QVF9uKSB7CisJCQkJY29uc3QgY2hhciAqZCA9IGZpbmRfYmxvY2tfZGV2aWNlKGFyZyk7CisJCQkJLyogbmFtZSBpcyB1bmRlZmluZWQsIGJ1dCBkZXZpY2UgaXMgbW91bnRlZCAtPiBhbm9ueW1vdXMgc3VwZXJibG9jayEgKi8KKwkJCQkvKiBoYXBwZW5zIHdpdGggYnRyZnMgKi8KKwkJCQlpZiAoIWQpIHsKKwkJCQkJZCA9ICJVTktOT1dOIjsKKwkJCQkJLyogVE9ETzogaXRlcmF0ZSAvcHJvYy9tb3VudHMsIG9yIC9wcm9jL3NlbGYvbW91bnRpbmZvCisJCQkJCSAqIHRvIGZpbmQgb3V0IHRoZSBkZXZpY2UgbmFtZSAqLworCQkJCX0KKwkJCQlwcmludGYoIiVzICVzXG4iLCBkLCBhcmcpOworCQkJfQorCQkJaWYgKCEob3B0ICYgKE9QVF9xIHwgT1BUX2QgfCBPUFRfbikpKQorCQkJCXByaW50ZigiJXMgaXMgJXNhIG1vdW50cG9pbnRcbiIsIGFyZywgaXNfbm90X21udCA/ICJub3QgIiA6ICIiKTsKKwkJCXJldHVybiBpc19ub3RfbW50OworCQl9CisJCWFyZyA9IHA7CisJCS8qIGVsc2U6IHN0YXQgaGFkIHNldCBlcnJubywganVzdCBmYWxsIHRocm91Z2ggKi8KKwl9CisKKyBlcnI6CisJaWYgKCEob3B0ICYgT1BUX3EpKQorCQliYl9wZXJyb3JfbXNnKG1zZywgYXJnKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL210LmMgYi9taXNjdXRpbHMvbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFmZDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL210LmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG10X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWYgZGV2aWNlXSBvcGNvZGUgdmFsdWUiCisvL3VzYWdlOiNkZWZpbmUgbXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb250cm9sIG1hZ25ldGljIHRhcGUgZHJpdmUgb3BlcmF0aW9uXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiQXZhaWxhYmxlIE9wY29kZXM6XG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiYnNmIGJzZm0gYnNyIGJzcyBkYXRhY29tcHJlc3Npb24gZHJ2YnVmZmVyIGVvZiBlb20gZXJhc2VcbiIKKy8vdXNhZ2U6ICAgICAgICJmc2YgZnNmbSBmc3IgZnNzIGxvYWQgbG9jayBta3BhcnQgbm9wIG9mZmxpbmUgcmFzMSByYXMyXG4iCisvL3VzYWdlOiAgICAgICAicmFzMyByZXNldCByZXRlbnNpb24gcmV3aW5kIHJld29mZmxpbmUgc2VlayBzZXRibGsgc2V0ZGVuc2l0eVxuIgorLy91c2FnZTogICAgICAgInNldHBhcnQgdGVsbCB1bmxvYWQgdW5sb2NrIHdlb2Ygd3NldCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL210aW8uaD4KKworLyogbWlzc2luZzogZW9kL3Nlb2QsIHN0b3B0aW9ucywgc3R3cnRocmVzaG9sZCwgZGVuc2l0aWVzICovCitzdGF0aWMgY29uc3Qgc2hvcnQgb3Bjb2RlX3ZhbHVlW10gPSB7CisJTVRCU0YsCisJTVRCU0ZNLAorCU1UQlNSLAorCU1UQlNTLAorCU1UQ09NUFJFU1NJT04sCisJTVRFT00sCisJTVRFUkFTRSwKKwlNVEZTRiwKKwlNVEZTRk0sCisJTVRGU1IsCisJTVRGU1MsCisJTVRMT0FELAorCU1UTE9DSywKKwlNVE1LUEFSVCwKKwlNVE5PUCwKKwlNVE9GRkwsCisJTVRPRkZMLAorCU1UUkFTMSwKKwlNVFJBUzIsCisJTVRSQVMzLAorCU1UUkVTRVQsCisJTVRSRVRFTiwKKwlNVFJFVywKKwlNVFNFRUssCisJTVRTRVRCTEssCisJTVRTRVRERU5TSVRZLAorCU1UU0VURFJWQlVGRkVSLAorCU1UU0VUUEFSVCwKKwlNVFRFTEwsCisJTVRXU00sCisJTVRVTkxPQUQsCisJTVRVTkxPQ0ssCisJTVRXRU9GLAorCU1UV0VPRgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgb3Bjb2RlX25hbWVbXSBBTElHTjEgPQorCSJic2YiICAgICAgICAgICAgICJcMCIKKwkiYnNmbSIgICAgICAgICAgICAiXDAiCisJImJzciIgICAgICAgICAgICAgIlwwIgorCSJic3MiICAgICAgICAgICAgICJcMCIKKwkiZGF0YWNvbXByZXNzaW9uIiAiXDAiCisJImVvbSIgICAgICAgICAgICAgIlwwIgorCSJlcmFzZSIgICAgICAgICAgICJcMCIKKwkiZnNmIiAgICAgICAgICAgICAiXDAiCisJImZzZm0iICAgICAgICAgICAgIlwwIgorCSJmc3IiICAgICAgICAgICAgICJcMCIKKwkiZnNzIiAgICAgICAgICAgICAiXDAiCisJImxvYWQiICAgICAgICAgICAgIlwwIgorCSJsb2NrIiAgICAgICAgICAgICJcMCIKKwkibWtwYXJ0IiAgICAgICAgICAiXDAiCisJIm5vcCIgICAgICAgICAgICAgIlwwIgorCSJvZmZsaW5lIiAgICAgICAgICJcMCIKKwkicmV3b2ZmbGluZSIgICAgICAiXDAiCisJInJhczEiICAgICAgICAgICAgIlwwIgorCSJyYXMyIiAgICAgICAgICAgICJcMCIKKwkicmFzMyIgICAgICAgICAgICAiXDAiCisJInJlc2V0IiAgICAgICAgICAgIlwwIgorCSJyZXRlbnNpb24iICAgICAgICJcMCIKKwkicmV3aW5kIiAgICAgICAgICAiXDAiCisJInNlZWsiICAgICAgICAgICAgIlwwIgorCSJzZXRibGsiICAgICAgICAgICJcMCIKKwkic2V0ZGVuc2l0eSIgICAgICAiXDAiCisJImRydmJ1ZmZlciIgICAgICAgIlwwIgorCSJzZXRwYXJ0IiAgICAgICAgICJcMCIKKwkidGVsbCIgICAgICAgICAgICAiXDAiCisJIndzZXQiICAgICAgICAgICAgIlwwIgorCSJ1bmxvYWQiICAgICAgICAgICJcMCIKKwkidW5sb2NrIiAgICAgICAgICAiXDAiCisJImVvZiIgICAgICAgICAgICAgIlwwIgorCSJ3ZW9mIiAgICAgICAgICAgICJcMCI7CisKK2ludCBtdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmZpbGUgPSAiL2Rldi90YXBlIjsKKwlzdHJ1Y3QgbXRvcCBvcDsKKwlzdHJ1Y3QgbXRwb3MgcG9zaXRpb247CisJaW50IGZkLCBtb2RlLCBpZHg7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChzdHJjbXAoYXJndlsxXSwgIi1mIikgPT0gMCkgeworCQlpZiAoIWFyZ3ZbMl0gfHwgIWFyZ3ZbM10pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWZpbGUgPSBhcmd2WzJdOworCQlhcmd2ICs9IDI7CisJfQorCisJaWR4ID0gaW5kZXhfaW5fc3RyaW5ncyhvcGNvZGVfbmFtZSwgYXJndlsxXSk7CisKKwlpZiAoaWR4IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVucmVjb2duaXplZCBvcGNvZGUgJXMiLCBhcmd2WzFdKTsKKworCW9wLm10X29wID0gb3Bjb2RlX3ZhbHVlW2lkeF07CisJaWYgKGFyZ3ZbMl0pCisJCW9wLm10X2NvdW50ID0geGF0b2lfcG9zaXRpdmUoYXJndlsyXSk7CisJZWxzZQorCQlvcC5tdF9jb3VudCA9IDE7ICAvKiBPbmUsIG5vdCB6ZXJvLCByaWdodD8gKi8KKworCXN3aXRjaCAob3Bjb2RlX3ZhbHVlW2lkeF0pIHsKKwkJY2FzZSBNVFdFT0Y6CisJCWNhc2UgTVRFUkFTRToKKwkJY2FzZSBNVFdTTToKKwkJY2FzZSBNVFNFVERSVkJVRkZFUjoKKwkJCW1vZGUgPSBPX1dST05MWTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQltb2RlID0gT19SRE9OTFk7CisJCQlicmVhazsKKwl9CisKKwlmZCA9IHhvcGVuKGZpbGUsIG1vZGUpOworCisJc3dpdGNoIChvcGNvZGVfdmFsdWVbaWR4XSkgeworCQljYXNlIE1UVEVMTDoKKwkJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCBNVElPQ1BPUywgJnBvc2l0aW9uLCAiJXMiLCBmaWxlKTsKKwkJCXByaW50ZigiQXQgYmxvY2sgJWRcbiIsIChpbnQpIHBvc2l0aW9uLm10X2Jsa25vKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwgTVRJT0NUT1AsICZvcCwgIiVzIiwgZmlsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL25hbmRkdW1wLmMgYi9taXNjdXRpbHMvbmFuZGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjFjZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL25hbmRkdW1wLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBuYW5kZHVtcC5jCisgKgorICogIFBvcnRlZCB0byBidXN5Ym94IGZyb20gbXRkLXV0aWxzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgV29vZGhvdXNlIChkd213MkBpbmZyYWRlYWQub3JnKQorICogICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gSi4gSGlsbCAoc2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBPdmVydmlldzoKKyAqICAgVGhpcyB1dGlsaXR5IGR1bXBzIHRoZSBjb250ZW50cyBvZiByYXcgTkFORCBjaGlwcyBvciBOQU5ECisgKiAgIGNoaXBzIGNvbnRhaW5lZCBpbiBEb0MgZGV2aWNlcy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2RlZmluZSBQUk9HUkFNICJuYW5kZHVtcCIKKyNkZWZpbmUgVkVSU0lPTiAiJFJldmlzaW9uOiAxLjI5ICQiCisKK3N0cnVjdCBnbG9iYWxzIHsKKwl1bnNpZ25lZCBjaGFyIHJlYWRidWZbMjA0OF07CisJc3RydWN0IG5hbmRfb29iaW5mbyBub25lX29vYmluZm87Cit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLm5vbmVfb29iaW5mby51c2VlY2MgPSBNVERfTkFOREVDQ19PRkY7IFwKK30gd2hpbGUgKDApCitzdGF0aWMgdm9pZCBkaXNwbGF5X2hlbHAgKHZvaWQpCit7CisJcHJpbnRmKCJVc2FnZTogbmFuZGR1bXAgW09QVElPTlNdIE1URC1kZXZpY2VcbiIKKwkJCSJEdW1wcyB0aGUgY29udGVudHMgb2YgYSBuYW5kIG10ZCBwYXJ0aXRpb24uXG4iCisJCQkiXG4iCisJCQkiICAgICAgICAgICAtLWhlbHAJICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIgorCQkJIiAgICAgICAgICAgLS12ZXJzaW9uCSAgICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXRcbiIKKwkJCSItZiBmaWxlICAgIC0tZmlsZT1maWxlICAgICAgICAgIGR1bXAgdG8gZmlsZVxuIgorCQkJIi1pICAgICAgICAgLS1pZ25vcmVlcnJvcnMgICAgICAgaWdub3JlIGVycm9yc1xuIgorCQkJIi1sIGxlbmd0aCAgLS1sZW5ndGg9bGVuZ3RoICAgICAgbGVuZ3RoXG4iCisJCQkiLW4gICAgICAgICAtLW5vZWNjICAgICAgICAgICAgICByZWFkIHdpdGhvdXQgZXJyb3IgY29ycmVjdGlvblxuIgorCQkJIi1vICAgICAgICAgLS1vbWl0b29iICAgICAgICAgICAgb21pdCBvb2IgZGF0YVxuIgorCQkJIi1iICAgICAgICAgLS1vbWl0YmFkICAgICAgICAgICAgb21pdCBiYWQgYmxvY2tzIGZyb20gdGhlIGR1bXBcbiIKKwkJCSItcCAgICAgICAgIC0tcHJldHR5cHJpbnQgICAgICAgIHByaW50IG5pY2UgKGhleGR1bXApXG4iCisJCQkiLXMgYWRkciAgICAtLXN0YXJ0YWRkcmVzcz1hZGRyICBzdGFydCBhZGRyZXNzXG4iKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3ZlcnNpb24gKHZvaWQpCit7CisJcHJpbnRmKFBST0dSQU0gIiAiIFZFUlNJT04gIlxuIgorCQkJIlxuIgorCQkJUFJPR1JBTSAiIGNvbWVzIHdpdGggTk8gV0FSUkFOVFlcbiIKKwkJCSJ0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iCisJCQkiXG4iCisJCQkiWW91IG1heSByZWRpc3RyaWJ1dGUgY29waWVzIG9mICIgUFJPR1JBTSAiXG4iCisJCQkidW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZS5cbiIKKwkJCSJTZWUgdGhlIGZpbGUgYENPUFlJTkcnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIik7CisJZXhpdCgwKTsKK30KKworLy8gT3B0aW9uIHZhcmlhYmxlcworCitzdGF0aWMgaW50CWlnbm9yZWVycm9yczsJCS8vIGlnbm9yZSBlcnJvcnMKK3N0YXRpYyBpbnQJcHJldHR5X3ByaW50OwkJLy8gcHJpbnQgbmljZSBpbiBhc2NpaQorc3RhdGljIGludAlub2VjYzsJCQkvLyBkb24ndCBlcnJvciBjb3JyZWN0CitzdGF0aWMgaW50CW9taXRvb2I7CQkvLyBvbWl0IG9vYiBkYXRhCitzdGF0aWMgdW5zaWduZWQgbG9uZwlzdGFydF9hZGRyOwkvLyBzdGFydCBhZGRyZXNzCitzdGF0aWMgdW5zaWduZWQgbG9uZwlsZW5ndGg7CQkvLyBkdW1wIGxlbmd0aAorc3RhdGljIGNoYXIgICAgKm10ZGRldjsJCS8vIG10ZCBkZXZpY2UgbmFtZQorc3RhdGljIGNoYXIgICAgKmR1bXBmaWxlOwkJLy8gZHVtcCBmaWxlIG5hbWUKK3N0YXRpYyBpbnQJb21pdGJhZDsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19vcHRpb25zIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBlcnJvciA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWludCBvcHRpb25faW5kZXggPSAwOworCQlzdGF0aWMgY29uc3QgY2hhciAqc2hvcnRfb3B0aW9ucyA9ICJiczpmOmlsOm9wbiI7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsIDB9LAorCQkJeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIDB9LAorCQkJeyJmaWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCisJCQl7Imlnbm9yZWVycm9ycyIsIG5vX2FyZ3VtZW50LCAwLCAnaSd9LAorCQkJeyJwcmV0dHlwcmludCIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAorCQkJeyJvbWl0b29iIiwgbm9fYXJndW1lbnQsIDAsICdvJ30sCisJCQl7Im9taXRiYWQiLCBub19hcmd1bWVudCwgMCwgJ2InfSwKKwkJCXsic3RhcnRhZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdzJ30sCisJCQl7Imxlbmd0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbCd9LAorCQkJeyJub2VjYyIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAorCQkJezAsIDAsIDAsIDB9LAorCQl9OworCisJCWludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9ucywKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSBFT0YpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChjKSB7CisJCQljYXNlIDA6CisJCQkJc3dpdGNoIChvcHRpb25faW5kZXgpIHsKKwkJCQkJY2FzZSAwOgorCQkJCQkJZGlzcGxheV9oZWxwKCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZGlzcGxheV92ZXJzaW9uKCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQlvbWl0YmFkID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCXN0YXJ0X2FkZHIgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOgorCQkJCWlmICghKGR1bXBmaWxlID0gc3RyZHVwKG9wdGFyZykpKSB7CisJCQkJCXBlcnJvcigic3RkZHVwIik7CisJCQkJCWV4aXQoMSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAnaSc6CisJCQkJaWdub3JlZXJyb3JzID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCWxlbmd0aCA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAnbyc6CisJCQkJb21pdG9vYiA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlwcmV0dHlfcHJpbnQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJbm9lY2MgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnPyc6CisJCQkJZXJyb3IgPSAxOworCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKChhcmdjIC0gb3B0aW5kKSAhPSAxIHx8IGVycm9yKQorCQlkaXNwbGF5X2hlbHAgKCk7CisKKwltdGRkZXYgPSBhcmd2W29wdGluZF07Cit9CisKKy8qCisgKiBNYWluIHByb2dyYW0KKyAqLworaW50IG5hbmRkdW1wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuYW5kZHVtcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIG9mcywgZW5kX2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja3N0YXJ0ID0gMTsKKwlpbnQgcmV0LCBpLCBmZCwgb2ZkLCBicywgYmFkYmxvY2sgPSAwOworCXVuc2lnbmVkIGNoYXIgb29iYnVmWzY0XTsKKwlzdHJ1Y3QgbXRkX29vYl9idWYgb29iID0gezAsIDE2LCBvb2JidWZ9OworCW10ZF9pbmZvX3QgbWVtaW5mbzsKKwljaGFyIHByZXR0eV9idWZbODBdOworCWludCBvb2JpbmZvY2hhbmdlZCA9IDAgOworCXN0cnVjdCBuYW5kX29vYmluZm8gb2xkX29vYmluZm87CisJc3RydWN0IG10ZF9lY2Nfc3RhdHMgc3RhdDEsIHN0YXQyOworCWludCBlY2NzdGF0cyA9IDA7CisKKwlJTklUX0coKTsKKworCXByb2Nlc3Nfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCS8qIE9wZW4gTVREIGRldmljZSAqLworCWlmICgoZmQgPSBvcGVuKG10ZGRldiwgT19SRE9OTFkpKSA9PSAtMSkgeworCQlwZXJyb3IoIm9wZW4gZmxhc2giKTsKKwkJZXhpdCAoMSk7CisJfQorCisJLyogRmlsbCBpbiBNVEQgZGV2aWNlIGNhcGFiaWxpdHkgc3RydWN0dXJlICovCisJaWYgKGlvY3RsKGZkLCBNRU1HRVRJTkZPLCAmbWVtaW5mbykgIT0gMCkgeworCQlwZXJyb3IoIk1FTUdFVElORk8iKTsKKwkJY2xvc2UoZmQpOworCQlleGl0ICgxKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgZGV2aWNlIHBhZ2Ugc2l6ZXMgYXJlIHZhbGlkICovCisJaWYgKCEobWVtaW5mby5vb2JzaXplID09IDY0ICYmIG1lbWluZm8ud3JpdGVzaXplID09IDIwNDgpICYmCisJCQkhKG1lbWluZm8ub29ic2l6ZSA9PSAzMiAmJiBtZW1pbmZvLndyaXRlc2l6ZSA9PSAxMDI0KSAmJgorCQkJIShtZW1pbmZvLm9vYnNpemUgPT0gMTYgJiYgbWVtaW5mby53cml0ZXNpemUgPT0gNTEyKSAmJgorCQkJIShtZW1pbmZvLm9vYnNpemUgPT0gOCAmJiBtZW1pbmZvLndyaXRlc2l6ZSA9PSAyNTYpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBmbGFzaCAobm90IG5vcm1hbCBOQU5EKVxuIik7CisJCWNsb3NlKGZkKTsKKwkJZXhpdCgxKTsKKwl9CisJLyogUmVhZCB0aGUgcmVhbCBvb2IgbGVuZ3RoICovCisJb29iLmxlbmd0aCA9IG1lbWluZm8ub29ic2l6ZTsKKworCWlmIChub2VjYykgIHsKKwkJcmV0ID0gaW9jdGwoZmQsIE1UREZJTEVNT0RFLCAodm9pZCAqKSBNVERfTU9ERV9SQVcpOworCQlpZiAocmV0ID09IDApIHsKKwkJCW9vYmluZm9jaGFuZ2VkID0gMjsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCWNhc2UgRU5PVFRZOgorCQkJCWlmIChpb2N0bCAoZmQsIE1FTUdFVE9PQlNFTCwgJm9sZF9vb2JpbmZvKSAhPSAwKSB7CisJCQkJCXBlcnJvciAoIk1FTUdFVE9PQlNFTCIpOworCQkJCQljbG9zZSAoZmQpOworCQkJCQlleGl0ICgxKTsKKwkJCQl9CisJCQkJaWYgKGlvY3RsIChmZCwgTUVNU0VUT09CU0VMLCAmRy5ub25lX29vYmluZm8pICE9IDApIHsKKwkJCQkJcGVycm9yICgiTUVNU0VUT09CU0VMIik7CisJCQkJCWNsb3NlIChmZCk7CisJCQkJCWV4aXQgKDEpOworCQkJCX0KKwkJCQlvb2JpbmZvY2hhbmdlZCA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXBlcnJvciAoIk1UREZJTEVNT0RFIik7CisJCQkJY2xvc2UgKGZkKTsKKwkJCQlleGl0ICgxKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisKKwkJLyogY2hlY2sgaWYgd2UgY2FuIHJlYWQgZWNjIHN0YXRzICovCisJCWlmICghaW9jdGwoZmQsIEVDQ0dFVFNUQVRTLCAmc3RhdDEpKSB7CisJCQllY2NzdGF0cyA9IDE7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVDQyBmYWlsZWQ6ICVkXG4iLCBzdGF0MS5mYWlsZWQpOworCQkJZnByaW50ZihzdGRlcnIsICJFQ0MgY29ycmVjdGVkOiAlZFxuIiwgc3RhdDEuY29ycmVjdGVkKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiTnVtYmVyIG9mIGJhZCBibG9ja3M6ICVkXG4iLCBzdGF0MS5iYWRibG9ja3MpOworCQkJZnByaW50ZihzdGRlcnIsICJOdW1iZXIgb2YgYmJ0IGJsb2NrczogJWRcbiIsIHN0YXQxLmJidGJsb2Nrcyk7CisJCX0gZWxzZQorCQkJcGVycm9yKCJObyBFQ0Mgc3RhdHVzIGluZm9ybWF0aW9uIGF2YWlsYWJsZSIpOworCX0KKworCS8qIE9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcuIElmIGZpbGUgbmFtZSBpcyAiLSIsIHdyaXRlIHRvIHN0YW5kYXJkCisJICogb3V0cHV0LiAqLworCWlmICghZHVtcGZpbGUpIHsKKwkJb2ZkID0gU1RET1VUX0ZJTEVOTzsKKwl9IGVsc2UgaWYgKChvZmQgPSBvcGVuKGR1bXBmaWxlLCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFULCAwNjQ0KSk9PSAtMSkgeworCQlwZXJyb3IgKCJvcGVuIG91dGZpbGUiKTsKKwkJY2xvc2UoZmQpOworCQlleGl0KDEpOworCX0KKworCS8qIEluaXRpYWxpemUgc3RhcnQvZW5kIGFkZHJlc3NlcyBhbmQgYmxvY2sgc2l6ZSAqLworCWlmIChsZW5ndGgpCisJCWVuZF9hZGRyID0gc3RhcnRfYWRkciArIGxlbmd0aDsKKwlpZiAoIWxlbmd0aCB8fCBlbmRfYWRkciA+IG1lbWluZm8uc2l6ZSkKKwkJZW5kX2FkZHIgPSBtZW1pbmZvLnNpemU7CisKKwlicyA9IG1lbWluZm8ud3JpdGVzaXplOworCisJLyogUHJpbnQgaW5mb3JtYXRpdmUgbWVzc2FnZSAqLworCWZwcmludGYoc3RkZXJyLCAiQmxvY2sgc2l6ZSAldSwgcGFnZSBzaXplICV1LCBPT0Igc2l6ZSAldVxuIiwKKwkJCW1lbWluZm8uZXJhc2VzaXplLCBtZW1pbmZvLndyaXRlc2l6ZSwgbWVtaW5mby5vb2JzaXplKTsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJCSJEdW1waW5nIGRhdGEgc3RhcnRpbmcgYXQgMHglMDh4IGFuZCBlbmRpbmcgYXQgMHglMDh4Li4uXG4iLAorCQkJKHVuc2lnbmVkIGludCkgc3RhcnRfYWRkciwgKHVuc2lnbmVkIGludCkgZW5kX2FkZHIpOworCisJLyogRHVtcCB0aGUgZmxhc2ggY29udGVudHMgKi8KKwlmb3IgKG9mcyA9IHN0YXJ0X2FkZHI7IG9mcyA8IGVuZF9hZGRyIDsgb2ZzKz1icykgeworCisJCS8vIG5ldyBlcmFzZWJsb2NrICwgY2hlY2sgZm9yIGJhZCBibG9jaworCQlpZiAoYmxvY2tzdGFydCAhPSAob2ZzICYgKH5tZW1pbmZvLmVyYXNlc2l6ZSArIDEpKSkgeworCQkJYmxvY2tzdGFydCA9IG9mcyAmICh+bWVtaW5mby5lcmFzZXNpemUgKyAxKTsKKwkJCWlmICgoYmFkYmxvY2sgPSBpb2N0bChmZCwgTUVNR0VUQkFEQkxPQ0ssICZibG9ja3N0YXJ0KSkgPCAwKSB7CisJCQkJcGVycm9yKCJpb2N0bChNRU1HRVRCQURCTE9DSykiKTsKKwkJCQlnb3RvIGNsb3NlYWxsOworCQkJfQorCQl9CisKKwkJaWYgKGJhZGJsb2NrKSB7CisJCQlpZiAob21pdGJhZCkKKwkJCQljb250aW51ZTsKKwkJCW1lbXNldCAoRy5yZWFkYnVmLCAweGZmLCBicyk7CisJCX0gZWxzZSB7CisJCQkvKiBSZWFkIHBhZ2UgZGF0YSBhbmQgZXhpdCBvbiBmYWlsdXJlICovCisJCQlpZiAocHJlYWQoZmQsIEcucmVhZGJ1ZiwgYnMsIG9mcykgIT0gYnMpIHsKKwkJCQlwZXJyb3IoInByZWFkIik7CisJCQkJZ290byBjbG9zZWFsbDsKKwkJCX0KKwkJfQorCisJCS8qIEVDQyBzdGF0cyBhdmFpbGFibGUgPyAqLworCQlpZiAoZWNjc3RhdHMpIHsKKwkJCWlmIChpb2N0bChmZCwgRUNDR0VUU1RBVFMsICZzdGF0MikpIHsKKwkJCQlwZXJyb3IoImlvY3RsKEVDQ0dFVFNUQVRTKSIpOworCQkJCWdvdG8gY2xvc2VhbGw7CisJCQl9CisJCQlpZiAoc3RhdDEuZmFpbGVkICE9IHN0YXQyLmZhaWxlZCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkVDQzogJWQgdW5jb3JyZWN0YWJsZSBiaXRmbGlwKHMpIgorCQkJCQkJIiBhdCBvZmZzZXQgMHglMDhseFxuIiwKKwkJCQkJCXN0YXQyLmZhaWxlZCAtIHN0YXQxLmZhaWxlZCwgb2ZzKTsKKwkJCWlmIChzdGF0MS5jb3JyZWN0ZWQgIT0gc3RhdDIuY29ycmVjdGVkKQorCQkJCWZwcmludGYoc3RkZXJyLCAiRUNDOiAlZCBjb3JyZWN0ZWQgYml0ZmxpcChzKSBhdCIKKwkJCQkJCSIgb2Zmc2V0IDB4JTA4bHhcbiIsCisJCQkJCQlzdGF0Mi5jb3JyZWN0ZWQgLSBzdGF0MS5jb3JyZWN0ZWQsIG9mcyk7CisJCQlzdGF0MSA9IHN0YXQyOworCQl9CisKKwkJLyogV3JpdGUgb3V0IHBhZ2UgZGF0YSAqLworCQlpZiAocHJldHR5X3ByaW50KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgYnM7IGkgKz0gMTYpIHsKKwkJCQlzcHJpbnRmKHByZXR0eV9idWYsCisJCQkJCQkiMHglMDh4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpIChvZnMgKyBpKSwgIEcucmVhZGJ1ZltpXSwKKwkJCQkJCUcucmVhZGJ1ZltpKzFdLCBHLnJlYWRidWZbaSsyXSwKKwkJCQkJCUcucmVhZGJ1ZltpKzNdLCBHLnJlYWRidWZbaSs0XSwKKwkJCQkJCUcucmVhZGJ1ZltpKzVdLCBHLnJlYWRidWZbaSs2XSwKKwkJCQkJCUcucmVhZGJ1ZltpKzddLCBHLnJlYWRidWZbaSs4XSwKKwkJCQkJCUcucmVhZGJ1ZltpKzldLCBHLnJlYWRidWZbaSsxMF0sCisJCQkJCQlHLnJlYWRidWZbaSsxMV0sIEcucmVhZGJ1ZltpKzEyXSwKKwkJCQkJCUcucmVhZGJ1ZltpKzEzXSwgRy5yZWFkYnVmW2krMTRdLAorCQkJCQkJRy5yZWFkYnVmW2krMTVdKTsKKwkJCQl3cml0ZShvZmQsIHByZXR0eV9idWYsIDYwKTsKKwkJCX0KKwkJfSBlbHNlCisJCQl3cml0ZShvZmQsIEcucmVhZGJ1ZiwgYnMpOworCisKKworCQlpZiAob21pdG9vYikKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYWRibG9jaykgeworCQkJbWVtc2V0IChHLnJlYWRidWYsIDB4ZmYsIG1lbWluZm8ub29ic2l6ZSk7CisJCX0gZWxzZSB7CisJCQkvKiBSZWFkIE9PQiBkYXRhIGFuZCBleGl0IG9uIGZhaWx1cmUgKi8KKwkJCW9vYi5zdGFydCA9IG9mczsKKwkJCWlmIChpb2N0bChmZCwgTUVNUkVBRE9PQiwgJm9vYikgIT0gMCkgeworCQkJCXBlcnJvcigiaW9jdGwoTUVNUkVBRE9PQikiKTsKKwkJCQlnb3RvIGNsb3NlYWxsOworCQkJfQorCQl9CisKKwkJLyogV3JpdGUgb3V0IE9PQiBkYXRhICovCisJCWlmIChwcmV0dHlfcHJpbnQpIHsKKwkJCWlmIChtZW1pbmZvLm9vYnNpemUgPCAxNikgeworCQkJCXNwcmludGYocHJldHR5X2J1ZiwgIiAgT09CIERhdGE6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJCSIlMDJ4ICUwMnhcbiIsCisJCQkJCQlvb2JidWZbMF0sIG9vYmJ1ZlsxXSwgb29iYnVmWzJdLAorCQkJCQkJb29iYnVmWzNdLCBvb2JidWZbNF0sIG9vYmJ1Zls1XSwKKwkJCQkJCW9vYmJ1Zls2XSwgb29iYnVmWzddKTsKKwkJCQl3cml0ZShvZmQsIHByZXR0eV9idWYsIDQ4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IG1lbWluZm8ub29ic2l6ZTsgaSArPSAxNikgeworCQkJCXNwcmludGYocHJldHR5X2J1ZiwgIiAgT09CIERhdGE6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCQkJb29iYnVmW2ldLCBvb2JidWZbaSsxXSwgb29iYnVmW2krMl0sCisJCQkJCQlvb2JidWZbaSszXSwgb29iYnVmW2krNF0sIG9vYmJ1ZltpKzVdLAorCQkJCQkJb29iYnVmW2krNl0sIG9vYmJ1ZltpKzddLCBvb2JidWZbaSs4XSwKKwkJCQkJCW9vYmJ1ZltpKzldLCBvb2JidWZbaSsxMF0sIG9vYmJ1ZltpKzExXSwKKwkJCQkJCW9vYmJ1ZltpKzEyXSwgb29iYnVmW2krMTNdLCBvb2JidWZbaSsxNF0sCisJCQkJCQlvb2JidWZbaSsxNV0pOworCQkJCXdyaXRlKG9mZCwgcHJldHR5X2J1ZiwgNjApOworCQkJfQorCQl9IGVsc2UKKwkJCXdyaXRlKG9mZCwgb29iYnVmLCBtZW1pbmZvLm9vYnNpemUpOworCX0KKworCS8qIHJlc2V0IG9vYmluZm8gKi8KKwlpZiAob29iaW5mb2NoYW5nZWQgPT0gMSkgeworCQlpZiAoaW9jdGwgKGZkLCBNRU1TRVRPT0JTRUwsICZvbGRfb29iaW5mbykgIT0gMCkgeworCQkJcGVycm9yICgiTUVNU0VUT09CU0VMIik7CisJCQljbG9zZShmZCk7CisJCQljbG9zZShvZmQpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJLyogQ2xvc2UgdGhlIG91dHB1dCBmaWxlIGFuZCBNVEQgZGV2aWNlICovCisJY2xvc2UoZmQpOworCWNsb3NlKG9mZCk7CisKKwkvKiBFeGl0IGhhcHB5ICovCisJcmV0dXJuIDA7CisKK2Nsb3NlYWxsOgorCS8qIFRoZSBuZXcgbW9kZSBjaGFuZ2UgaXMgcGVyIGZpbGUgZGVzY3JpcHRvciAhICovCisJaWYgKG9vYmluZm9jaGFuZ2VkID09IDEpIHsKKwkJaWYgKGlvY3RsIChmZCwgTUVNU0VUT09CU0VMLCAmb2xkX29vYmluZm8pICE9IDApICB7CisJCQlwZXJyb3IgKCJNRU1TRVRPT0JTRUwiKTsKKwkJfQorCX0KKwljbG9zZShmZCk7CisJY2xvc2Uob2ZkKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL25hbmR3cml0ZS5jIGIvbWlzY3V0aWxzL25hbmR3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODRkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvbmFuZHdyaXRlLmMKQEAgLTAsMCArMSwxNzYxIEBACisvKgorICogbmFuZHdyaXRlIGFuZCBuYW5kZHVtcCBwb3J0ZWQgdG8gYnVzeWJveCBmcm9tIG10ZC11dGlscworICoKKyAqIEF1dGhvcjogQmFydWNoIFNpYWNoIDxiYXJ1Y2hAdGtvcy5jby5pbD4sIE9yZXggQ29tcHV0ZWQgUmFkaW9ncmFwaHkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRPRE86IGFkZCBzdXBwb3J0IGZvciBsYXJnZSAoPjRHQikgTVREIGRldmljZXMKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjZGVmaW5lIFBST0dSQU0gIm5hbmR3cml0ZSIKKyNkZWZpbmUgVkVSU0lPTiAiJFJldmlzaW9uOiAxLjMyLWRyb3BjYW0gJCIKKyNkZWZpbmUgQU1CX1ZFUlNJT04gIkFtYmFyZWxsYTogMC0yMDExMDMxOCAkIgorCisjZGVmaW5lIE1BWF9QQUdFX1NJWkUJMjA0OAorI2RlZmluZSBNQVhfT09CX1NJWkUJNjQKKworc3RydWN0IGdsb2JhbHMgeworCS8qIEJ1ZmZlciBhcnJheSB1c2VkIGZvciB3cml0aW5nIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIHdyaXRlYnVmW01BWF9QQUdFX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgb29iYnVmW01BWF9PT0JfU0laRV07CisJdW5zaWduZWQgY2hhciBvb2JyZWFkYnVmW01BWF9PT0JfU0laRV07CisJLyogb29iIGxheW91dHMgdG8gcGFzcyBpbnRvIHRoZSBrZXJuZWwgYXMgZGVmYXVsdCAqLworCXN0cnVjdCBuYW5kX29vYmluZm8gbm9uZV9vb2JpbmZvOworCXN0cnVjdCBuYW5kX29vYmluZm8gamZmczJfb29iaW5mbzsKKwlzdHJ1Y3QgbmFuZF9vb2JpbmZvIHlhZmZzX29vYmluZm87CisJc3RydWN0IG5hbmRfb29iaW5mbyBhdXRvcGxhY2Vfb29iaW5mbzsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorXAorCUcubm9uZV9vb2JpbmZvLnVzZWVjYyA9IE1URF9OQU5ERUNDX09GRjsgXAorCUcuYXV0b3BsYWNlX29vYmluZm8udXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFOyBcCitcCisJRy5qZmZzMl9vb2JpbmZvLnVzZWVjYyA9IE1URF9OQU5ERUNDX1BMQUNFOyBcCisJRy5qZmZzMl9vb2JpbmZvLmVjY2J5dGVzID0gNjsgXAorCUcuamZmczJfb29iaW5mby5lY2Nwb3NbMF0gPSAwOyBcCisJRy5qZmZzMl9vb2JpbmZvLmVjY3Bvc1sxXSA9IDE7IFwKKwlHLmpmZnMyX29vYmluZm8uZWNjcG9zWzJdID0gMjsgXAorCUcuamZmczJfb29iaW5mby5lY2Nwb3NbM10gPSAzOyBcCisJRy5qZmZzMl9vb2JpbmZvLmVjY3Bvc1s0XSA9IDY7IFwKKwlHLmpmZnMyX29vYmluZm8uZWNjcG9zWzVdID0gNzsgXAorXAorCUcueWFmZnNfb29iaW5mby51c2VlY2MgPSBNVERfTkFOREVDQ19QTEFDRTsgXAorCUcueWFmZnNfb29iaW5mby5lY2NieXRlcyA9IDY7IFwKKwlHLnlhZmZzX29vYmluZm8uZWNjcG9zWzBdID0gODsgXAorCUcueWFmZnNfb29iaW5mby5lY2Nwb3NbMV0gPSA5OyBcCisJRy55YWZmc19vb2JpbmZvLmVjY3Bvc1syXSA9IDEwOyBcCisJRy55YWZmc19vb2JpbmZvLmVjY3Bvc1szXSA9IDEzOyBcCisJRy55YWZmc19vb2JpbmZvLmVjY3Bvc1s0XSA9IDE0OyBcCisJRy55YWZmc19vb2JpbmZvLmVjY3Bvc1s1XSA9IDE1OyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZMUEFSVF9NQUdJQwkweDg3MzJkZmU2CisjZGVmaW5lIF9fQVJNQ0NfUEFDS19fCisjZGVmaW5lIF9fQVRUUklCX1BBQ0tfXyAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisjZGVmaW5lIEVUSF9JTlNUQU5DRVMJCTIKKyNkZWZpbmUgVVNFX1dJRkkJCTEKKyNkZWZpbmUgQ01EX0xJTkVfU0laRQkJNTEyCisjZGVmaW5lIE1BQ19TSVpFCQk2CisjZGVmaW5lIFNOX1NJWkUJCQkzMgordHlwZWRlZiBfX0FSTUNDX1BBQ0tfXyBzdHJ1Y3QgZmxwYXJ0X3MKK3sKKwl1aW50MzJfdAljcmMzMjsJCS8qKjwgQ1JDMzIgY2hlY2tzdW0gb2YgaW1hZ2UgKi8KKwl1aW50MzJfdAl2ZXJfbnVtOwkvKio8IFZlcnNpb24gbnVtYmVyICovCisJdWludDMyX3QJdmVyX2RhdGU7CS8qKjwgVmVyc2lvbiBkYXRlICovCisJdWludDMyX3QJaW1nX2xlbjsJLyoqPCBMZW5naCBvZiBpbWFnZSBpbiB0aGUgcGFydGl0aW9uICovCisJdWludDMyX3QJbWVtX2FkZHI7CS8qKjwgU3RhcnRpbmcgYWRkcmVzcyB0byBjb3B5IHRvIFJBTSAqLworCXVpbnQzMl90CWZsYWc7CQkvKio8IFNwZWNpYWwgcHJvcGVydGllcyBvZiB0aGlzIHBhcnRpdGlvbiAqLworCXVpbnQzMl90CW1hZ2ljOwkJLyoqPCBNYWdpYyBudW1iZXIgKi8KK30gX19BVFRSSUJfUEFDS19fIGZscGFydF90OworCisvKioKKyAqIFBhcnRpdGlvbnMgb24gZGV2aWNlLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEJlbG93IGFyZSBmaXJtd2FyZSBwYXJ0aXRpb25zLiAod2l0aCBwcmUtYnVpbHQgaW1hZ2UpICovCisjZGVmaW5lIFBBUlRfQlNUCTAKKyNkZWZpbmUgUEFSVF9QVEIJMQorI2RlZmluZSBQQVJUX0JMRAkyCisjZGVmaW5lIFBBUlRfSEFMCTMKKyNkZWZpbmUgUEFSVF9QQkEJNAorI2RlZmluZSBQQVJUX1BSSSAgCTUKKyNkZWZpbmUgUEFSVF9TRUMJNgorI2RlZmluZSBQQVJUX0JBSwk3CisjZGVmaW5lIFBBUlRfUk1ECTgKKyNkZWZpbmUgUEFSVF9ST00JOQorI2RlZmluZSBQQVJUX0RTUAkxMAorI2RlZmluZSBQQVJUX0xOWAkxMQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQmVsb3cgYXJlIGdlbmVyYWwgcHVycG9zZSBwYXJ0aXRpb25zLiAod2l0aG91dCBwcmUtYnVpbHQgaW1hZ2UpICovCisjZGVmaW5lIFBBUlRfU1dQCTEyCisjZGVmaW5lIFBBUlRfQURECTEzCisjZGVmaW5lIFBBUlRfQURDCTE0CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBCZWxvdyBhcmUgbWVkaWEobmZ0bCkgcGFydGl0aW9ucy4gKHdpdGhvdXQgcHJlLWJ1aWx0IGltYWdlKSAqLworI2RlZmluZSBQQVJUX1JBVwkxNQorI2RlZmluZSBQQVJUX1NURzIJMTYKKyNkZWZpbmUgUEFSVF9TVEcJMTcKKyNkZWZpbmUgUEFSVF9QUkYJMTgKKyNkZWZpbmUgUEFSVF9DQUwJMTkKKworY29uc3QgY2hhciAqZ19wYXJ0X3N0cltdID0geyJic3QiLCAicHRiIiwgImJsZCIsICJoYWwiLCAicGJhIiwKKyJwcmkiLCAic2VjIiwgImJhayIsICJybWQiLCAicm9tIiwKKyJkc3AiLCAibG54IiwgInN3cCIsICJhZGQiLCAiYWRjIiwKKyJyYXciLCAic3RnMiIsICJzdGciLCAicHJmIiwgImNhbCIsCisiYWxsIn07CisKKyNkZWZpbmUgRkxERVZfQ01EX0xJTkVfU0laRQkxMDI0CisKKy8qKgorICogUHJvcGVydGllcyBvZiB0aGUgbmV0d29yayBkZXZpY2UKKyAqLwordHlwZWRlZiBfX0FSTUNDX1BBQ0tfXyBzdHJ1Y3QgbmV0ZGV2X3MKK3sKKwkvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgbmV0d29ya2luZyByZWxhdGVkIHNldHRpbmdzICovCisJdWludDhfdAltYWNbNl07CQkvKio8IE1BQyBhZGRyZXNzKi8KKwl1aW50MzJfdAlpcDsJCS8qKjwgQm9vdCBsb2FkZXIncyBMQU4gSVAgKi8KKwl1aW50MzJfdAltYXNrOwkJLyoqPCBCb290IGxvYWRlcidzIExBTiBtYXNrICovCisJdWludDMyX3QJZ3c7CQkvKio8IEJvb3QgbG9hZGVyJ3MgTEFOIGdhdGV3YXkgKi8KK30gX19BVFRSSUJfUEFDS19fIG5ldGRldl90OworCisvKioKKyAqIFByb3BlcnRpZXMgb2YgdGhlIHRhcmdldCBkZXZpY2UgdGhhdCBpcyBzdG9yZWQgaW4gdGhlIGZsYXNoLgorICovCit0eXBlZGVmIF9fQVJNQ0NfUEFDS19fIHN0cnVjdCBmbGRldl9zCit7CisJY2hhcglzblszMl07CQkvKio8IFNlcmlhbCBudW1iZXIgKi8KKwl1aW50OF90CXVzYmRsX21vZGU7CS8qKjwgVVNCIGRvd25sb2FkIG1vZGUgKi8KKwl1aW50OF90CWF1dG9fYm9vdDsJLyoqPCBBdXRvbWF0aWMgYm9vdCAqLworCWNoYXIJY21kbGluZVtGTERFVl9DTURfTElORV9TSVpFXTsJLyoqPCBCb290IGNvbW1hbmQgbGluZSBvcHRpb25zICovCisJdWludDhfdAlyc3ZbMl07CisJdWludDMyX3QJc3BsYXNoX2lkOworCisJLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIG5ldHdvcmtpbmcgcmVsYXRlZCBzZXR0aW5ncyAqLworCW5ldGRldl90IGV0aFsyXTsKKwluZXRkZXZfdCB3aWZpWzFdOwkJLyogVXBkYXRpbmcgdGhlIGZsZGV2X3Qgc3RydWN0ICovCisJLy9uZXRkZXZfdCB1c2JfZXRoWzJdOworCisJLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHVwZGF0ZSBieSBuZXR3b3JrICByZWxhdGVkIHNldHRpbmdzICovCisJdWludDhfdAlhdXRvX2RsOwkvKio8IEF1dG9tYXRpYyBkb3dubG9hZD8gKi8KKwl1aW50MzJfdAl0ZnRwZDsJCS8qKjwgQm9vdCBsb2FkZXIncyBURlRQIHNlcnZlciAqLworCXVpbnQzMl90CXByaV9hZGRyOwkvKio8IFJUT1MgZG93bmxvYWQgYWRkcmVzcyAqLworCWNoYXIJcHJpX2ZpbGVbMzJdOwkvKio8IFJUT1MgZmlsZSBuYW1lICovCisJdWludDhfdAlwcmlfY29tcDsJLyoqPCBSVE9TIGNvbXByZXNzZWQ/ICovCisJdWludDMyX3QJcm1kX2FkZHI7CS8qKjwgUmFtZGlzayBkb3dubG9hZCBhZGRyZXNzICovCisJY2hhcglybWRfZmlsZVszMl07CS8qKjwgUmFtZGlzayBmaWxlIG5hbWUgKi8KKwl1aW50OF90CXJtZF9jb21wOwkvKio8IFJhbWRpc2sgY29tcHJlc3NlZD8gKi8KKwl1aW50MzJfdAlkc3BfYWRkcjsJLyoqPCBEU1AgZG93bmxvYWQgYWRkcmVzcyAqLworCWNoYXIJZHNwX2ZpbGVbMzJdOwkvKio8IERTUCBmaWxlIG5hbWUgKi8KKwl1aW50OF90CWRzcF9jb21wOwkvKio8IERTUCBjb21wcmVzc2VkPyAqLworCXVpbnQ4X3QJcnN2MlsyXTsKKworCXVpbnQzMl90CW1hZ2ljOwkJLyoqPCBNYWdpYyBudW1iZXIgKi8KK30gX19BVFRSSUJfUEFDS19fIGZsZGV2X3Q7CisKKy8qKgorICogVGhlIHBhcnRpdGlvbiB0YWJsZSBpcyBhIHJlZ2lvbiBpbiBmbGFzaCB3aGVyZSBtZXRhIGRhdGEgYWJvdXQKKyAqIGRpZmZlcmVudCBwYXJ0aXRpb25zIGFyZSBzdG9yZWQuCisgKi8KKworI2RlZmluZSBQQVJUX01BWF9XSVRIX1JTVgkzMgorI2RlZmluZSBQVEJfU0laRQkJNDA5NgorI2RlZmluZSBQVEJfUEFEX1NJWkUJCVwKKwkoUFRCX1NJWkUgLSBQQVJUX01BWF9XSVRIX1JTViAqIHNpemVvZihmbHBhcnRfdCkgLSBzaXplb2YoZmxkZXZfdCkpCit0eXBlZGVmIF9fQVJNQ0NfUEFDS19fIHN0cnVjdCBmbHBhcnRfdGFibGVfcworeworCWZscGFydF90CXBhcnRbUEFSVF9NQVhfV0lUSF9SU1ZdOy8qKiBQYXJ0aXRpb25zICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJZmxkZXZfdAkJZGV2OwkJCS8qKjwgRGV2aWNlIHByb3BlcnRpZXMgKi8KKwl1aW50OF90CQlyc3ZbUFRCX1BBRF9TSVpFXTsJLyoqPCBQYWRkaW5nIHRvIDIwNDggYnl0ZXMgKi8KK30gX19BVFRSSUJfUEFDS19fIGZscGFydF90YWJsZV90OworCitzdGF0aWMgY29uc3QgdWludDMyX3QgKmNyYzMyX3RhYmxlOworCisvKiBSZXR1cm4gYSAzMi1iaXQgQ1JDIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjcmMzMih1aW50MzJfdCB2YWwsIGNvbnN0IHZvaWQgKnNzLCBpbnQgbGVuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSBzczsKKwl3aGlsZSAoLS1sZW4gPj0gMCkKKwkJdmFsID0gY3JjMzJfdGFibGVbKHZhbCBeICpzKyspICYgMHhmZl0gXiAodmFsID4+IDgpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfdmVyc2lvbiAodm9pZCkKK3sKKwlwcmludGYoUFJPR1JBTSAiICIgVkVSU0lPTiAiIiBBTUJfVkVSU0lPTiAiXG4iCisJCQkiXG4iCisJCQkiQ29weXJpZ2h0IChDKSAyMDAzIFRob21hcyBHbGVpeG5lciBcbiIKKwkJCSJcbiIKKwkJCVBST0dSQU0gIiBjb21lcyB3aXRoIE5PIFdBUlJBTlRZXG4iCisJCQkidG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIgorCQkJIlxuIgorCQkJIllvdSBtYXkgcmVkaXN0cmlidXRlIGNvcGllcyBvZiAiIFBST0dSQU0gIlxuIgorCQkJInVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UuXG4iCisJCQkiU2VlIHRoZSBmaWxlIGBDT1BZSU5HJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOworCWV4aXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfZmxwYXJ0IChjb25zdCBjaGFyICpuYW1lLCBmbHBhcnRfdCAqcF9mbHBhcnQpCit7CisJcHJpbnRmKCIlczpcbiIsIG5hbWUpOworCXByaW50ZigiY3JjMzIgXHQ9IDB4JTA4eFxuIiwgcF9mbHBhcnQtPmNyYzMyKTsKKwlwcmludGYoInZlcl9udW0gPSAweCUwOHhcbiIsIHBfZmxwYXJ0LT52ZXJfbnVtKTsKKwlwcmludGYoInZlcl9kYXRlPSAweCUwOHhcbiIsIHBfZmxwYXJ0LT52ZXJfZGF0ZSk7CisJcHJpbnRmKCJpbWdfbGVuID0gMHglMDh4XG4iLCBwX2ZscGFydC0+aW1nX2xlbik7CisJcHJpbnRmKCJtZW1fYWRkcj0gMHglMDh4XG4iLCBwX2ZscGFydC0+bWVtX2FkZHIpOworCXByaW50ZigiZmxhZyBcdD0gMHglMDh4XG4iLCBwX2ZscGFydC0+ZmxhZyk7CisJcHJpbnRmKCJtYWdpYyBcdD0gMHglMDh4XG4iLCBwX2ZscGFydC0+bWFnaWMpOworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9kZXYgKGZsZGV2X3QgKnBfZGV2KQoreworCWludCBpOworCXByaW50Zigic24JCT0gJXNcbiIsIHBfZGV2LT5zbik7CisJcHJpbnRmKCJtYWdpYwkJPSAweCUwOHhcbiIsIHBfZGV2LT5tYWdpYyk7CisJcHJpbnRmKCJ1c2JkbF9tb2RlCT0gMHglMDh4XG4iLCBwX2Rldi0+dXNiZGxfbW9kZSk7CisJcHJpbnRmKCJjbWRsaW5lCT0gJXNcbiIsIHBfZGV2LT5jbWRsaW5lKTsKKwlwcmludGYoImZvcmNlX3B0Ygk9IDB4JTA4eFxuIiwgcF9kZXYtPnJzdlswXSk7CisJcHJpbnRmKCJhdXRvX2Jvb3QgCT0gJWRcbiIsIHBfZGV2LT5hdXRvX2Jvb3QpOworCXByaW50ZigiYXV0b19kbCAJPSAlZFxuIiwgcF9kZXYtPmF1dG9fZGwpOworCXByaW50ZigicHJpX2ZpbGUJPSAlc1xuIiwgcF9kZXYtPnByaV9maWxlKTsKKyAJcHJpbnRmKCJwcmlfYWRkcgk9IDB4JTA4eFxuIiwgcF9kZXYtPnByaV9hZGRyKTsKKworCWZvciAoaT0wIDsgaTwgRVRIX0lOU1RBTkNFUyA7IGkrKykKKwl7CisJCXByaW50ZigiZXRoJWQgTUFDCT0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsaSwKKwkJCXBfZGV2LT5ldGhbaV0ubWFjWzBdLCBwX2Rldi0+ZXRoW2ldLm1hY1sxXSwKKwkJCXBfZGV2LT5ldGhbaV0ubWFjWzJdLCBwX2Rldi0+ZXRoW2ldLm1hY1szXSwKKwkJCXBfZGV2LT5ldGhbaV0ubWFjWzRdLCBwX2Rldi0+ZXRoW2ldLm1hY1s1XSk7CisJCXByaW50ZigiRXRoJWQgaXAgIAk9ICVkLiVkLiVkLiVkXG4iLGksCisJCQkocF9kZXYtPmV0aFtpXS5pcCkgJjB4ZmYsIChwX2Rldi0+ZXRoW2ldLmlwPj44KSAmMHhmZiwKKwkJCShwX2Rldi0+ZXRoW2ldLmlwPj4xNikgJjB4ZmYsIChwX2Rldi0+ZXRoW2ldLmlwPj4yNCkgJjB4ZmYpOworCQlwcmludGYoIkV0aCVkIG1hc2sJPSAlZC4lZC4lZC4lZFxuIixpLAorCQkJKHBfZGV2LT5ldGhbaV0ubWFzaykgJjB4ZmYsIChwX2Rldi0+ZXRoW2ldLm1hc2s+PjgpICYweGZmLAorCQkJKHBfZGV2LT5ldGhbaV0ubWFzaz4+MTYpICYweGZmLCAocF9kZXYtPmV0aFtpXS5tYXNrPj4yNCkgJjB4ZmYpOworCQlwcmludGYoIkV0aCVkIGd3ICAJPSAlZC4lZC4lZC4lZFxuIixpLAorCQkJKHBfZGV2LT5ldGhbaV0uZ3cpICYweGZmLCAocF9kZXYtPmV0aFtpXS5ndz4+OCkgJjB4ZmYsCisJCQkocF9kZXYtPmV0aFtpXS5ndz4+MTYpICYweGZmLCAocF9kZXYtPmV0aFtpXS5ndz4+MjQpICYweGZmKTsKKwl9CisJaWYgKFVTRV9XSUZJKQorCXsKKwkJZm9yIChpPTA7IGk8IFVTRV9XSUZJOyBpKyspCisJCXsKKwkJCXByaW50ZigiV0lGSSVkIE1BQwk9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLGksCisJCQkJcF9kZXYtPndpZmlbaV0ubWFjWzBdLCBwX2Rldi0+d2lmaVtpXS5tYWNbMV0sCisJCQkJcF9kZXYtPndpZmlbaV0ubWFjWzJdLCBwX2Rldi0+d2lmaVtpXS5tYWNbM10sCisJCQkJcF9kZXYtPndpZmlbaV0ubWFjWzRdLCBwX2Rldi0+d2lmaVtpXS5tYWNbNV0pOworCQkJcHJpbnRmKCJXSUZJJWQgaXAJCT0gJWQuJWQuJWQuJWRcbiIsaSwKKwkJCQkocF9kZXYtPndpZmlbaV0uaXApICYweGZmLChwX2Rldi0+d2lmaVtpXS5pcD4+OCkgJjB4ZmYsCisJCQkJKHBfZGV2LT53aWZpW2ldLmlwPj4xNikgJjB4ZmYsIChwX2Rldi0+d2lmaVtpXS5pcD4+MjQpICYweGZmKTsKKwkJCXByaW50ZigiV0lGSSVkIG1hc2sJPSAlZC4lZC4lZC4lZFxuIixpLAorCQkJCShwX2Rldi0+d2lmaVtpXS5tYXNrKSAmMHhmZiwocF9kZXYtPndpZmlbaV0ubWFzaz4+OCkgJjB4ZmYsCisJCQkJKHBfZGV2LT53aWZpW2ldLm1hc2s+PjE2KSAmMHhmZiwgKHBfZGV2LT53aWZpW2ldLm1hc2s+PjI0KSAmMHhmZik7CisJCQlwcmludGYoIldJRkklZCBndwkJPSAlZC4lZC4lZC4lZFxuIixpLAorCQkJCShwX2Rldi0+d2lmaVtpXS5ndykgJjB4ZmYsKHBfZGV2LT53aWZpW2ldLmd3Pj44KSAmMHhmZiwKKwkJCQkocF9kZXYtPndpZmlbaV0uZ3c+PjE2KSAmMHhmZiwgKHBfZGV2LT53aWZpW2ldLmd3Pj4yNCkgJjB4ZmYpOworCQl9CisJfQorCXByaW50ZigidGZ0cGQJCT0gJWQuJWQuJWQuJWRcbiIsCisJCSggcF9kZXYtPnRmdHBkKSAmMHhmZiwocF9kZXYtPnRmdHBkPj44KSAmMHhmZiwKKwkJKHBfZGV2LT50ZnRwZD4+MTYpICYweGZmLCAocF9kZXYtPnRmdHBkPj4yNCkgJjB4ZmYpOworCXByaW50ZigiXG4iKTsKKworfQorCisjZGVmaW5lIE5BTkRXUklURV9PUFRJT05TX0JBU0UJCTAKKyNkZWZpbmUgTkVUV09SS19PUFRJT05fQkFTRQkJMjAKKworZW51bSBudW1lcmljX3Nob3J0X29wdGlvbnMgeworCUhFTFAgPSBOQU5EV1JJVEVfT1BUSU9OU19CQVNFLAorCVZFUlNJT05fSU5GTywKKwlBVVRPX0RPV05MT0FELAorCUFVVE9fQk9PVCwKKwlQUklfQUREUiwKKwlQUklfRklMRSwKKwlTSE9XX0lORk8sCisKKwlFVEgwX0lQID0gTkVUV09SS19PUFRJT05fQkFTRSwKKwlFVEgwX01BU0ssCisJRVRIMF9HVywKKwlURlRQRCwKKwlFVEgxX01BQywKKwlFVEgxX0lQLAorCUVUSDFfTUFTSywKKwlFVEgxX0dXLAorCVdJRkkwX01BQywgIC8vMjAxMjAzMzErIGZvciB1cGRhdGluZyB3aXRoIHRoZSBmbGRldl90IHN0cnVjdAorCVdJRkkwX0lQLAorCVdJRkkwX01BU0ssCisJV0lGSTBfR1csCisjaWYgKFVTRV9XSUZJID49IDIpCisJV0lGSTFfTUFDLAorCVdJRkkxX0lQLAorCVdJRkkxX01BU0ssCisJV0lGSTFfR1csCisjZW5kaWYKKwlVU0JfRVRIMF9NQUMsCisJVVNCX0VUSDBfSVAsCisJVVNCX0VUSDBfTUFTSywKKwlVU0JfRVRIMF9HVywKKwlVU0JfRVRIMV9NQUMsCisJVVNCX0VUSDFfSVAsCisJVVNCX0VUSDFfTUFTSywKKwlVU0JfRVRIMV9HVywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzaG9ydF9vcHRpb25zID0gImFiOmZqbm9wcWQ6czp5S01SQkdIUUlVV1hZWkM6RjpMOlM6RDpWOkU6TjpCOiI7CitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ImF1dG9wbGFjZSIsIG5vX2FyZ3VtZW50LCAwLCAnYSd9LAorCXsiamZmczIiLCBub19hcmd1bWVudCwgMCwgJ2onfSwKKwl7InlhZmZzIiwgbm9fYXJndW1lbnQsIDAsICd5J30sCisJeyJmb3JjZWxlZ2FjeSIsIG5vX2FyZ3VtZW50LCAwLCAnZid9LAorCXsibm9lY2MiLCBub19hcmd1bWVudCwgMCwgJ24nfSwKKwl7Im9vYiIsIG5vX2FyZ3VtZW50LCAwLCAnbyd9LAorCXsic3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKKwl7InBhZCIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAorCXsiYmxvY2thbGlnbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYid9LAorCXsicXVpZXQiLCBub19hcmd1bWVudCwgMCwgJ3EnfSwKKwl7ImRlbGF5IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJ30sCisJeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsIEhFTFB9LAorCXsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCBWRVJTSU9OX0lORk99LAorCisJLy97InB0YiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LAorCXsiYmxkIiwgbm9fYXJndW1lbnQsIDAsICdHJ30sCisJeyJoYWwiLCBub19hcmd1bWVudCwgMCwgJ0gnfSwKKwl7InBiYSIsIG5vX2FyZ3VtZW50LCAwLCAnUSd9LAorCXsic2VjIiwgbm9fYXJndW1lbnQsIDAsICdJJ30sCisJeyJkc3AiLCBub19hcmd1bWVudCwgMCwgJ1UnfSwKKwl7ImxueCIsIG5vX2FyZ3VtZW50LCAwLCAnVyd9LAorCXsic3dwIiwgbm9fYXJndW1lbnQsIDAsICdYJ30sCisJeyJhZGQiLCBub19hcmd1bWVudCwgMCwgJ1knfSwKKwl7ImFkYyIsIG5vX2FyZ3VtZW50LCAwLCAnWid9LAorCXsicHJpIiwgbm9fYXJndW1lbnQsIDAsICdLJ30sCisJeyJybWQiLCBub19hcmd1bWVudCwgMCwgJ00nfSwKKwl7InJvbSIsIG5vX2FyZ3VtZW50LCAwLCAnUid9LAorCXsiYmFrIiwgbm9fYXJndW1lbnQsIDAsICdCJ30sCisKKwl7ImNtZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorCXsiZmxhZyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAorCXsic2FmZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUyd9LAorCXsibG9hZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTCd9LAorCisJeyJkYXRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdEJ30sCisJeyJ2ZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1YnfSwKKwl7ImV0aG1hYyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRSd9LAorCXsic24gICAiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKKworCXsiYXV0b19ib290IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEFVVE9fQk9PVH0sCisJeyJhdXRvX2RsIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEFVVE9fRE9XTkxPQUR9LAorCisJeyJwcmlfYWRkciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBQUklfQUREUn0sCisJeyJwcmlfZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBQUklfRklMRX0sCisKKwl7Imxhbl9pcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBFVEgwX0lQfSwKKwl7Imxhbl9tYXNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEVUSDBfTUFTS30sCisJeyJsYW5fZ3ciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgRVRIMF9HV30sCisJeyJ0ZnRwZCAgIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFRGVFBEfSwKKworCXsiZXRoMV9tYWMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgRVRIMV9NQUN9LAorCXsiZXRoMV9pcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBFVEgxX0lQfSwKKwl7ImV0aDFfbWFzayIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBFVEgxX01BU0t9LAorCXsiZXRoMV9ndyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBFVEgxX0dXfSwKKworCXsid2lmaTBfbWFjIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFdJRkkwX01BQ30sCisJeyJ3aWZpMF9pcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBXSUZJMF9JUH0sCisJeyJ3aWZpMF9tYXNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFdJRkkwX01BU0t9LAorCXsid2lmaTBfZ3ciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgV0lGSTBfR1d9LAorI2lmIChVU0VfV0lGSSA+PSAyKQorCXsid2lmaTFfbWFjIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFdJRkkxX01BQ30sCisJeyJ3aWZpMV9pcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBXSUZJMV9JUH0sCisJeyJ3aWZpMV9tYXNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFdJRkkxX01BU0t9LAorCXsid2lmaTFfZ3ciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgV0lGSTFfR1d9LAorI2VuZGlmCisJeyJzaG93X2luZm8iLCBub19hcmd1bWVudCwgMCwgU0hPV19JTkZPfSwKKwl7MCwgMCwgMCwgMH0sCit9OworCitzdHJ1Y3QgaGludF9zIHsKKwljb25zdCBjaGFyICphcmc7CisJY29uc3QgY2hhciAqc3RyOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaW50X3MgaGludFtdID0geworCXsiIiwgIlVzZSBhdXRvIG9vYiBsYXlvdXQifSwKKwl7IiIsICJmb3JjZSBqZmZzMiBvb2IgbGF5b3V0IChsZWdhY3kgc3VwcG9ydCkifSwKKwl7IiIsICJmb3JjZSB5YWZmcyBvb2IgbGF5b3V0IChsZWdhY3kgc3VwcG9ydCkifSwKKwl7IiIsICJmb3JjZSBsZWdhY3kgc3VwcG9ydCBvbiBhdXRvcGxhY2VtZW50IGVuYWJsZWQgbXRkIGRldmljZSJ9LAorCXsiIiwgIndyaXRlIHdpdGhvdXQgZWNjIn0sCisJeyIiLCAiaW1hZ2UgY29udGFpbnMgb29iIGRhdGEifSwKKwl7IiIsICJzZXQgc3RhcnQgYWRkcmVzcyAoZGVmYXVsdCBpcyAwKSJ9LAorCXsiIiwgInBhZCB0byBwYWdlIHNpemUifSwKKwl7ImJsb2NrYWxpZ249MXwyfDQiLCAic2V0IG11bHRpcGxlIG9mIGVyYXNlYmxvY2tzIHRvIGFsaWduIHRvIn0sCisJeyIiLCAiZG9uJ3QgZGlzcGxheSBwcm9ncmVzcyBtZXNzYWdlcyJ9LAorCXsiIiwgImFkZCB4IG1pY3Jvc2Vjb25kIGRlbGF5IGJldHdlZW4gYmxvY2sgd3JpdGVzIn0sCisJeyIiLCAiZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQifSwKKwl7IiIsICJvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCJ9LAorCXsiIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIEJMRCBQYXJ0aXRpb24ifSwKKwl7IiIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBIQUwgUGFydGl0aW9uIn0sCisJeyIiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUEJBIFBhcnRpdGlvbiJ9LAorCXsiIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFNFQyBQYXJ0aXRpb24gIn0sCisJeyIiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgRFNQIFBhcnRpdGlvbiAifSwKKwl7IiIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBMTlggUGFydGl0aW9uICJ9LAorCXsiIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFNXUCBQYXJ0aXRpb24gIn0sCisJeyIiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQUREIFBhcnRpdGlvbiAifSwKKwl7IiIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBBREMgUGFydGl0aW9uICJ9LAorCXsiIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBSSSBQYXJ0aXRpb24gIn0sCisJeyIiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUk1EIFBhcnRpdGlvbiAifSwKKwl7IiIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBST00gUGFydGl0aW9uICJ9LAorCXsiIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIEJBSyBQYXJ0aXRpb24gIn0sCisJeyIiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgQ01EIGxpbmUgIn0sCisJeyJoZXgiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgUGFydGl0aW9uIGxvYWQgZmxhZyAifSwKKwl7ImhleCIsICJmb3JjZSBBTUJPT1QgYm9vdCBmb3JtIFBUQiwgc2FmZSByZWNvdmVyeSAifSwKKwl7ImhleCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBQYXJ0aXRpb24gbG9hZCBhZGRyZXNzICJ9LAorCXsiaGV4IiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBhcnRpdGlvbiBkYXRlICJ9LAorCXsiaGV4IiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIFBhcnRpdGlvbiB2ZXJzaW9uICJ9LAorCXsiTUFDIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIGV0aDAgTUFDICJ9LAorCXsic24iLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgU04gIn0sCisJeyJoZXgiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgbG9hZCBsaW51eCBmcm9tIG5hbmRmbGFzaCBvciBubyAifSwKKwl7ImhleCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBsb2FkIGxpbnV4IGZyb20gbmV0d29yayBvciBubyAifSwKKwl7InN0ciIsICJVcGRhdGUgQW1iYXJlbGxhIHVwZGF0ZWQgZmlsZSBuYW1lKDMyYnl0ZXMpICJ9LAorCXsiaGV4IiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIHByaV9hZGRyICJ9LAorCXsiaXAiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgZXRoMCBsYW4gaXAgIn0sCisJeyJpcCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBldGgwIGxhbiBtYXNrICJ9LAorCXsiaXAiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgZXRoMCBsYW4gZ3cgIn0sCisJeyJpcCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBldGgwIHRmdHBkIGlwICJ9LAorCXsiTUFDIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIGV0aDEgTUFDICJ9LAorCXsiaXAiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgZXRoMSBsYW4gaXAgIn0sCisJeyJpcCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCBldGgxIGxhbiBtYXNrICJ9LAorCXsiaXAiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1QgZXRoMSBsYW4gZ3cgIn0sCisJeyJNQUMiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1Qgd2lmaTAgTUFDICJ9LAorCXsiaXAiLCAiVXBkYXRlIEFtYmFyZWxsYSBBTUJPT1Qgd2lmaTAgaXAgIn0sCisJeyJpcCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCB3aWZpMCBtYXNrIn0sCisJeyJpcCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCB3aWZpMCBndyAifSwKKyNpZiAoVVNFX1dJRkkgPj0gMikKKwl7Ik1BQyIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCB3aWZpMSBNQUMgIn0sCisJeyJpcCIsICJVcGRhdGUgQW1iYXJlbGxhIEFNQk9PVCB3aWZpMSBpcCAifSwKKwl7ImlwIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIHdpZmkxIG1hc2sifSwKKwl7ImlwIiwgIlVwZGF0ZSBBbWJhcmVsbGEgQU1CT09UIHdpZmkxIGd3ICJ9LAorI2VuZGlmCisJeyIiLCAgIlNob3cgQW1iYXJlbGxhIEFNQk9PVCBpbmZvcm1hdGlvbiAifSwKKworfTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlpbnQgaTsKKwlwcmludGYoIlVzYWdlOm5hbmR3cml0ZSBbT1BUSU9OXSBNVERfREVWSUNFIElOUFVURklMRVxuIgorCQkJIldyaXRlcyB0byB0aGUgc3BlY2lmaWVkIE1URCBkZXZpY2UuXG4iCisJCQkiXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGxvbmdfb3B0aW9ucykgLyBzaXplb2YobG9uZ19vcHRpb25zWzBdKSAtIDE7IGkrKykgeworCQlpZiAoaXNhbHBoYShsb25nX29wdGlvbnNbaV0udmFsKSkKKwkJCXByaW50ZigiLSVjICIsIGxvbmdfb3B0aW9uc1tpXS52YWwpOworCQllbHNlCisJCQlwcmludGYoIiAgICIpOworCQlwcmludGYoIi0tJXMiLCBsb25nX29wdGlvbnNbaV0ubmFtZSk7CisJCWlmIChoaW50W2ldLmFyZ1swXSAhPSAwKQorCQkJcHJpbnRmKCIgWyVzXSIsIGhpbnRbaV0uYXJnKTsKKwkJcHJpbnRmKCJcdCVzXG4iLCBoaW50W2ldLnN0cik7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIGV0aGVybmV0IEhXIGFkZHJlc3MuICh4eDp4eDp4eDp4eDp4eDp4eCkuCisgKi8KK3N0YXRpYyBpbnQgc3RyX3RvX2h3YWRkcihjb25zdCBjaGFyICpidWZwLCB1aW50OF90ICpod2FkZHIpCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCWludCBpLCBqOworCXVuc2lnbmVkIGNoYXIgdmFsOworCXVuc2lnbmVkIGNoYXIgYzsKKworCXB0ciA9IGh3YWRkcjsKKyAJaSA9IDA7CisJZG8geworICAgICAgICAgICAgICAgIGogPSB2YWwgPSAwOworCisJCS8qIFdlIG1pZ2h0IGdldCBhIHNlbWljb2xvbiBoZXJlIC0gbm90IHJlcXVpcmVkLiAqLworCQlpZiAoaSAmJiAoKmJ1ZnAgPT0gJzonKSkgeworCQkJYnVmcCsrOworCQl9CisKKwkJZG8geworCQkJYyA9ICpidWZwOworCQkJaWYgKCgodW5zaWduZWQgY2hhcikoYyAtICcwJykpIDw9IDkpIHsKKwkJCQljIC09ICcwJzsKKwkJCX0gZWxzZSBpZiAoKCh1bnNpZ25lZCBjaGFyKSgoYyB8IDB4MjApIC0gJ2EnKSkgPD0gNSkgeworCQkJCWMgPSAoYyB8IDB4MjApIC0gKCdhJyAtIDEwKTsKKwkJCX0gZWxzZSBpZiAoaiAmJiAoYyA9PSAnOicgfHwgYyA9PSAwKSkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkrK2J1ZnA7CisJCQl2YWwgPDw9IDQ7CisJCQl2YWwgKz0gYzsKKwkJfSB3aGlsZSAoKytqIDwgMik7CisJCSpwdHIrKyA9IHZhbDsKKwl9IHdoaWxlICgrK2kgPCBNQUNfU0laRSk7CisKKwlyZXR1cm4gKGludCkgKCpidWZwKTsgICAvKiBFcnJvciBpZiB3ZSBkb24ndCBlbmQgYXQgZW5kIG9mIHN0cmluZy4gKi8KK30KKworc3RhdGljIGludCBzdHJfdG9faXBhZGRyKGNvbnN0IGNoYXIgKnNyYywgdWludDMyX3QgKmFkZHIpCit7CisJaW50IHNhd19kaWdpdCwgb2N0ZXRzLCBjaDsKKwl1bnNpZ25lZCBjaGFyIHRtcFs0XSwgKnRwOworCisJc2F3X2RpZ2l0ID0gMDsKKwlvY3RldHMgPSAwOworCSoodHAgPSB0bXApID0gMDsKKwl3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAnXDAnKSB7CisKKwkJaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJCXVuc2lnbmVkIGludCBuZXcgPSAqdHAgKiAxMCArIChjaCAtICcwJyk7CisKKwkJCWlmIChuZXcgPiAyNTUpCisJCQkJcmV0dXJuICgwKTsKKwkJCSp0cCA9IG5ldzsKKwkJCWlmICghIHNhd19kaWdpdCkgeworCQkJCWlmICgrK29jdGV0cyA+IDQpCisJCQkJCXJldHVybiAoMCk7CisJCQkJc2F3X2RpZ2l0ID0gMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjaCA9PSAnLicgJiYgc2F3X2RpZ2l0KSB7CisJCQlpZiAob2N0ZXRzID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisJCQkqKyt0cCA9IDA7CisJCQlzYXdfZGlnaXQgPSAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtMTsKKyAgICAgICAgfQorCWlmIChvY3RldHMgPCA0KQorCQlyZXR1cm4gLTI7CisJbWVtY3B5KGFkZHIsIHRtcCwgNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIJKm10ZF9kZXZpY2UsICppbWc7CitzdGF0aWMgaW50CW10ZG9mZnNldCA9IDA7CitzdGF0aWMgaW50CXF1aWV0ID0gMDsKK3N0YXRpYyBpbnQJZGVsYXkgPSAwOworc3RhdGljIGludAl3cml0ZW9vYiA9IDA7CitzdGF0aWMgaW50CWF1dG9wbGFjZSA9IDA7CitzdGF0aWMgaW50CWZvcmNlamZmczIgPSAwOworc3RhdGljIGludAlmb3JjZXlhZmZzID0gMDsKK3N0YXRpYyBpbnQJZm9yY2VsZWdhY3kgPSAwOworc3RhdGljIGludAlub2VjYyA9IDA7CitzdGF0aWMgaW50CXBhZCA9IDA7CitzdGF0aWMgaW50CWJsb2NrYWxpZ24gPSAxOyAvKmRlZmF1bHQgdG8gdXNpbmcgMTZLIGJsb2NrIHNpemUgKi8KK3N0YXRpYyBjaGFyCXB0Yl9kZXZpY2VbMTAyNF0gPSAiL2Rldi9tdGQxIjsKKy8vc3RhdGljIGludAlhbWJhcmVsbGFfcHRiID0gMDsKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX2JsZCA9IDA7CitzdGF0aWMgaW50CWFtYmFyZWxsYV9oYWwgPSAwOworc3RhdGljIGludAlhbWJhcmVsbGFfcGJhID0gMDsKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3NlYyA9IDA7CitzdGF0aWMgaW50CWFtYmFyZWxsYV9kc3AgPSAwOworc3RhdGljIGludAlhbWJhcmVsbGFfbG54ID0gMDsKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3N3cCA9IDA7CitzdGF0aWMgaW50CWFtYmFyZWxsYV9hZGQgPSAwOworc3RhdGljIGludAlhbWJhcmVsbGFfYWRjID0gMDsKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3ByaSA9IDA7CitzdGF0aWMgaW50CWFtYmFyZWxsYV9ybWQgPSAwOworc3RhdGljIGludAlhbWJhcmVsbGFfcm9tID0gMDsKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX2JhayA9IDA7CitzdGF0aWMgaW50CWFtYmFyZWxsYV9jbWQgPSAwOworc3RhdGljIHVpbnQzMl90IGFtYmFyZWxsYV9mbHBhcnRfZmxhZyA9IDA7CitzdGF0aWMgdWludDMyX3QgYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkciA9IDA7CitzdGF0aWMgdWludDMyX3QgYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uID0gMDsKK3N0YXRpYyB1aW50MzJfdCBhbWJhcmVsbGFfZmxwYXJ0X2RhdGUgPSAwOworc3RhdGljIGludAlhbWJhcmVsbGFfZm9yY2VfcHRiID0gMDsKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3B0Yl9kYXRhID0gMDsKK3N0YXRpYyBjaGFyIGFtYmFyZWxsYV9jbWRsaW5lW0NNRF9MSU5FX1NJWkVdOworc3RhdGljIGludAlhbWJhcmVsbGFfc2tpcF9pbWcgPSAwOworCitzdGF0aWMgaW50CWFtYmFyZWxsYV9zbiA9IDA7CitzdGF0aWMgY2hhcglhbWJhcmVsbGFfc25fZGF0YVtTTl9TSVpFXTsKKworc3RhdGljIGludAlhbWJhcmVsbGFfYXV0b19kbCA9IDA7CitzdGF0aWMgdWludDhfdAlhbWJhcmVsbGFfYXV0b19kbF9kYXRhPTE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX2F1dG9fYm9vdCA9IDA7CitzdGF0aWMgdWludDhfdAlhbWJhcmVsbGFfYXV0b19ib290X2RhdGE9MTsKKworc3RhdGljIGludAlhbWJhcmVsbGFfZXRoID0gMDsKK3N0YXRpYyB1aW50OF90CWFtYmFyZWxsYV9ldGhfbWFjW01BQ19TSVpFXTsKKworc3RhdGljIGludAlhbWJhcmVsbGFfbGFuX2lwID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfbGFuX2lwX2RhdGE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX2xhbl9tYXNrID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfbGFuX21hc2tfZGF0YTsKKworc3RhdGljIGludAlhbWJhcmVsbGFfbGFuX2d3ID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfbGFuX2d3X2RhdGE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3RmdHBkID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfdGZ0cGRfZGF0YTsKKworI2lmIChFVEhfSU5TVEFOQ0VTID49IDIpCitzdGF0aWMgaW50CWFtYmFyZWxsYV9ldGgxID0gMDsKK3N0YXRpYyB1aW50OF90CWFtYmFyZWxsYV9ldGgxX21hY1tNQUNfU0laRV07CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX2V0aDFfaXAgPSAwOworc3RhdGljIHVpbnQzMl90CWFtYmFyZWxsYV9ldGgxX2lwX2RhdGE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX2V0aDFfbWFzayA9IDA7CitzdGF0aWMgdWludDMyX3QJYW1iYXJlbGxhX2V0aDFfbWFza19kYXRhOworCitzdGF0aWMgaW50CWFtYmFyZWxsYV9ldGgxX2d3ID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfZXRoMV9nd19kYXRhOworCisjZW5kaWYKKworI2lmICggVVNFX1dJRkkgPj0xICkKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3dpZmkwID0gMDsKK3N0YXRpYyB1aW50OF90CWFtYmFyZWxsYV93aWZpMF9tYWNbTUFDX1NJWkVdOworCitzdGF0aWMgaW50CWFtYmFyZWxsYV93aWZpMF9pcCA9IDA7CitzdGF0aWMgdWludDMyX3QJYW1iYXJlbGxhX3dpZmkwX2lwX2RhdGE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3dpZmkwX21hc2sgPSAwOworc3RhdGljIHVpbnQzMl90CWFtYmFyZWxsYV93aWZpMF9tYXNrX2RhdGE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3dpZmkwX2d3ID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfd2lmaTBfZ3dfZGF0YTsKKworI2VuZGlmCisKKy8qIDIwMTIwMzMxKyBmb3IgdXBkYXRpbmcgd2l0aCB0aGUgZmxkZXZfdCBzdHJ1Y3QgKi8KKyNpZiAoVVNFX1dJRkkgPj0yKQorc3RhdGljIGludAlhbWJhcmVsbGFfd2lmaTEgPSAwOworc3RhdGljIHVpbnQ4X3QJYW1iYXJlbGxhX3dpZmkxX21hY1tNQUNfU0laRV07CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3dpZmkxX2lwID0gMDsKK3N0YXRpYyB1aW50MzJfdAlhbWJhcmVsbGFfd2lmaTFfaXBfZGF0YTsKKworc3RhdGljIGludAlhbWJhcmVsbGFfd2lmaTFfbWFzayA9IDA7CitzdGF0aWMgdWludDMyX3QJYW1iYXJlbGxhX3dpZmkxX21hc2tfZGF0YTsKKworc3RhdGljIGludAlhbWJhcmVsbGFfd2lmaTFfZ3cgPSAwOworc3RhdGljIHVpbnQzMl90CWFtYmFyZWxsYV93aWZpMV9nd19kYXRhOworCisjZW5kaWYKKworc3RhdGljIGludCBhbWJhcmVsbGFfc2hvd19pbmZvX2ZsYWcgPSAwOworCitzdGF0aWMgaW50CWFtYmFyZWxsYV9wcmlfYWRkciA9IDA7CitzdGF0aWMgdWludDMyX3QJYW1iYXJlbGxhX3ByaV9hZGRyX2RhdGE7CisKK3N0YXRpYyBpbnQJYW1iYXJlbGxhX3ByaV9maWxlID0gMDsKK3N0YXRpYyBjaGFyCWFtYmFyZWxsYV9wcmlfZmlsZV9kYXRhWzMyXTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19vcHRpb25zIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBlcnJvciA9IDA7CisJaW50IGNoOworCWludCBvcHRpb25faW5kZXggPSAwOworCXdoaWxlICgoY2ggPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBzaG9ydF9vcHRpb25zLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlIEhFTFA6CisJCQkJdXNhZ2UoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVkVSU0lPTl9JTkZPOgorCQkJCWRpc3BsYXlfdmVyc2lvbigpOworCQkJCWJyZWFrOworCQkJY2FzZSBBVVRPX0RPV05MT0FEOgorCQkJCWFtYmFyZWxsYV9hdXRvX2RsID0gMTsKKwkJCQlhbWJhcmVsbGFfYXV0b19kbF9kYXRhPXN0cnRvdWwgKG9wdGFyZywgTlVMTCwgMCk7CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUT19CT09UOgorCQkJCWFtYmFyZWxsYV9hdXRvX2Jvb3QgPSAxOworCQkJCWFtYmFyZWxsYV9hdXRvX2Jvb3RfZGF0YT1zdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApOworCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFBSSV9BRERSOgorCQkJCWFtYmFyZWxsYV9wcmlfYWRkciA9IDE7CisJCQkJYW1iYXJlbGxhX3ByaV9hZGRyX2RhdGEgPSBzdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApOworCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFBSSV9GSUxFOgorCQkJCWFtYmFyZWxsYV9wcmlfZmlsZSA9IDE7CisJCQkJc3RybmNweShhbWJhcmVsbGFfcHJpX2ZpbGVfZGF0YSwgb3B0YXJnLCBTTl9TSVpFKTsKKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBFVEgwX0lQOgorCQkJCWFtYmFyZWxsYV9sYW5faXA9MTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV9sYW5faXBfZGF0YSkpCisJCQkJeworCQkJCQlwcmludGYgKCJJUCBlcnJvciBcbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEVUSDBfTUFTSzoKKwkJCQlhbWJhcmVsbGFfbGFuX21hc2sgPSAxOworCQkJCWlmIChzdHJfdG9faXBhZGRyKG9wdGFyZywmYW1iYXJlbGxhX2xhbl9tYXNrX2RhdGEpKQorCQkJCXsKKwkJCQkJcHJpbnRmICgiSVAgZXJyb3IgXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBFVEgwX0dXOgorCQkJCWFtYmFyZWxsYV9sYW5fZ3cgPSAxOworCQkJCWlmIChzdHJfdG9faXBhZGRyKG9wdGFyZywmYW1iYXJlbGxhX2xhbl9nd19kYXRhKSkKKwkJCQl7CisJCQkJCXByaW50ZiAoIklQIGVycm9yIFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVEZUUEQ6CisJCQkJYW1iYXJlbGxhX3RmdHBkID0gMTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV90ZnRwZF9kYXRhKSkKKwkJCQl7CisJCQkJCXByaW50ZiAoIklQIGVycm9yIFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBFVEgxX01BQzoKKwkJCQlpZiAoc3RyX3RvX2h3YWRkcihvcHRhcmcsIGFtYmFyZWxsYV9ldGgxX21hYykgIT0gMCkgeworCQkJCQlwZXJyb3IgKCJod2FkZHIgZXJyb3IhXG4iKTsKKwkJCQkJZXJyb3IgPSAxOworCQkJCX0KKwkJCQlhbWJhcmVsbGFfZXRoMSA9IDE7CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVRIMV9JUDoKKwkJCQlhbWJhcmVsbGFfZXRoMV9pcD0xOworCQkJCWlmIChzdHJfdG9faXBhZGRyKG9wdGFyZywmYW1iYXJlbGxhX2V0aDFfaXBfZGF0YSkpCisJCQkJeworCQkJCQlwcmludGYgKCJJUCBlcnJvciBcbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEVUSDFfTUFTSzoKKwkJCQlhbWJhcmVsbGFfZXRoMV9tYXNrID0gMTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV9ldGgxX21hc2tfZGF0YSkpCisJCQkJeworCQkJCQlwcmludGYgKCJJUCBlcnJvciBcbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEVUSDFfR1c6CisJCQkJYW1iYXJlbGxhX2V0aDFfZ3c9MTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV9ldGgxX2d3X2RhdGEpKQorCQkJCXsKKwkJCQkJcHJpbnRmICgiSVAgZXJyb3IgXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIFdJRkkwX01BQzoKKwkJCQlpZiAoc3RyX3RvX2h3YWRkcihvcHRhcmcsIGFtYmFyZWxsYV93aWZpMF9tYWMpICE9IDApIHsKKwkJCQkJcGVycm9yICgiaHdhZGRyIGVycm9yIVxuIik7CisJCQkJCWVycm9yID0gMTsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX3dpZmkwID0gMTsKKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBXSUZJMF9JUDoKKwkJCQlhbWJhcmVsbGFfd2lmaTBfaXAgPSAxOworCQkJCWlmIChzdHJfdG9faXBhZGRyKG9wdGFyZywmYW1iYXJlbGxhX3dpZmkwX2lwX2RhdGEpKQorCQkJCXsKKwkJCQkJcHJpbnRmICgiSVAgZXJyb3IgXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBXSUZJMF9NQVNLOgorCQkJCWFtYmFyZWxsYV93aWZpMF9tYXNrID0gMTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV93aWZpMF9tYXNrX2RhdGEpKQorCQkJCXsKKwkJCQkJcHJpbnRmICgiSVAgZXJyb3IgXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBXSUZJMF9HVzoKKwkJCQlhbWJhcmVsbGFfd2lmaTBfZ3cgPSAxOworCQkJCWlmIChzdHJfdG9faXBhZGRyKG9wdGFyZywmYW1iYXJlbGxhX3dpZmkwX2d3X2RhdGEpKQorCQkJCXsKKwkJCQkJcHJpbnRmICgiSVAgZXJyb3IgXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJI2lmIChVU0VfV0lGSSA+PSAyKQorCQkJY2FzZSBXSUZJMV9NQUM6CisJCQkJaWYgKHN0cl90b19od2FkZHIob3B0YXJnLCBhbWJhcmVsbGFfd2lmaTFfbWFjKSAhPSAwKSB7CisJCQkJCXBlcnJvciAoImh3YWRkciBlcnJvciFcbiIpOworCQkJCQllcnJvciA9IDE7CisJCQkJfQorCQkJCWFtYmFyZWxsYV93aWZpMSA9IDE7CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0lGSTFfSVA6CisJCQkJYW1iYXJlbGxhX3dpZmkxX2lwID0gMTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV93aWZpMV9pcF9kYXRhKSkKKwkJCQl7CisJCQkJCXByaW50ZiAoIklQIGVycm9yIFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0lGSTFfTUFTSzoKKwkJCQlhbWJhcmVsbGFfd2lmaTFfbWFzayA9IDE7CisJCQkJaWYgKHN0cl90b19pcGFkZHIob3B0YXJnLCZhbWJhcmVsbGFfd2lmaTFfbWFza19kYXRhKSkKKwkJCQl7CisJCQkJCXByaW50ZiAoIklQIGVycm9yIFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0lGSTFfR1c6CisJCQkJYW1iYXJlbGxhX3dpZmkxX2d3ID0gMTsKKwkJCQlpZiAoc3RyX3RvX2lwYWRkcihvcHRhcmcsJmFtYmFyZWxsYV93aWZpMV9nd19kYXRhKSkKKwkJCQl7CisJCQkJCXByaW50ZiAoIklQIGVycm9yIFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCSNlbmRpZgorCisJCQljYXNlIFNIT1dfSU5GTzoKKwkJCQlhbWJhcmVsbGFfc2hvd19pbmZvX2ZsYWcgPSAxOworCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdxJzoKKwkJCQlxdWlldCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQlkZWxheSA9IGF0b2kob3B0YXJnKTsKKwkJCQlmcHJpbnRmKHN0ZG91dCwgImRlbGF5IHdpbGwgYmUgJWR1cyBiZXR3ZWVuIGJsb2NrIHdyaXRlc1xuIiwgZGVsYXkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYSc6CisJCQkJYXV0b3BsYWNlID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2onOgorCQkJCWZvcmNlamZmczIgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAneSc6CisJCQkJZm9yY2V5YWZmcyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdmJzoKKwkJCQlmb3JjZWxlZ2FjeSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQlub2VjYyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdvJzoKKwkJCQl3cml0ZW9vYiA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlwYWQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJbXRkb2Zmc2V0ID0gc3RydG9sIChvcHRhcmcsIE5VTEwsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAnYic6CisJCQkJYmxvY2thbGlnbiA9IGF0b2kgKG9wdGFyZyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdUJzoKKwkJCQlzdHJuY3B5KHB0Yl9kZXZpY2UsIG9wdGFyZywgc2l6ZW9mKHB0Yl9kZXZpY2UpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0snOgorCQkJCWFtYmFyZWxsYV9wcmkgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnTSc6CisJCQkJYW1iYXJlbGxhX3JtZCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoKKwkJCQlhbWJhcmVsbGFfcm9tID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0InOgorCQkJCWFtYmFyZWxsYV9iYWsgPSAxOworCQkJCWJyZWFrOworCQkJLy9jYXNlICdBJzoKKwkJCQkvL2FtYmFyZWxsYV9wdGIgPSAxOworCQkJCS8vYnJlYWs7CisJCQljYXNlICdHJzoKKwkJCQlhbWJhcmVsbGFfYmxkID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0gnOgorCQkJCWFtYmFyZWxsYV9oYWwgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnUSc6CisJCQkJYW1iYXJlbGxhX3BiYSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdJJzoKKwkJCQlhbWJhcmVsbGFfc2VjID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1UnOgorCQkJCWFtYmFyZWxsYV9kc3AgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnVyc6CisJCQkJYW1iYXJlbGxhX2xueCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdYJzoKKwkJCQlhbWJhcmVsbGFfc3dwID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1knOgorCQkJCWFtYmFyZWxsYV9hZGQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnWic6CisJCQkJYW1iYXJlbGxhX2FkYyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdDJzoKKwkJCQlhbWJhcmVsbGFfY21kID0gMTsKKwkJCQlzdHJuY3B5KGFtYmFyZWxsYV9jbWRsaW5lLCBvcHRhcmcsIENNRF9MSU5FX1NJWkUpOworCQkJCWFtYmFyZWxsYV9za2lwX2ltZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdGJzoKKwkJCQlhbWJhcmVsbGFfZmxwYXJ0X2ZsYWcgPSBzdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkciA9IHN0cnRvdWwgKG9wdGFyZywgTlVMTCwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdWJzoKKwkJCQlhbWJhcmVsbGFfZmxwYXJ0X3ZlcnNpb24gPSBzdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAnRCc6CisJCQkJYW1iYXJlbGxhX2ZscGFydF9kYXRlID0gc3RydG91bCAob3B0YXJnLCBOVUxMLCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCWFtYmFyZWxsYV9mb3JjZV9wdGIgPSAxOworCQkJCWFtYmFyZWxsYV9wdGJfZGF0YSA9IGF0b2kgKG9wdGFyZyk7CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0UnOgorCQkJCWlmIChzdHJfdG9faHdhZGRyKG9wdGFyZywgYW1iYXJlbGxhX2V0aF9tYWMpICE9IDApIHsKKwkJCQkJcGVycm9yICgiaHdhZGRyIGVycm9yIVxuIik7CisJCQkJCWVycm9yID0gMTsKKwkJCQl9CisJCQkJYW1iYXJlbGxhX2V0aCA9IDE7CisJCQkJYW1iYXJlbGxhX3NraXBfaW1nID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ04nOgorCQkJCXN0cm5jcHkoYW1iYXJlbGxhX3NuX2RhdGEsIG9wdGFyZywgU05fU0laRSk7CisJCQkJYW1iYXJlbGxhX3NuID0gMTsKKwkJCQlhbWJhcmVsbGFfc2tpcF9pbWcgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnPyc6CisJCQkJZXJyb3IgPSAxOworCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCgoKGFyZ2MgLSBvcHRpbmQpICE9IDIpICYmIChhbWJhcmVsbGFfc2tpcF9pbWcgIT0gMSkpIHx8IGVycm9yKQorCQl1c2FnZSAoKTsKKworCWlmICgoYXJnYyAtIG9wdGluZCkgPT0gMikgeworCQltdGRfZGV2aWNlID0gYXJndltvcHRpbmQrK107CisJCWltZyA9IGFyZ3Zbb3B0aW5kXTsKKwkJYW1iYXJlbGxhX3NraXBfaW1nID0gMDsKKwl9Cit9CisKKy8qKgorICogR2V0IHRoZSBwdGIuZGV2IHBhcmFtZXRlcnMgd2hpY2ggYXJlIG9yaWdpbmFsIHNldHRpbmdzIG9mIGZpcm13YXJlLgorICovCisjaWYgMAorc3RhdGljIHZvaWQgZmxwcm9nX2dldF9kZXZfcGFyYW0oZmxwYXJ0X3RhYmxlX3QgKnRhYmxlKQoreworCXRhYmxlLT5kZXYudXNiZGxfbW9kZSA9IDA7CisJdGFibGUtPmRldi5hdXRvX2Jvb3QgPSAxOworCW1lbXNldCh0YWJsZS0+ZGV2LmNtZGxpbmUsIDB4MCwgc2l6ZW9mKHRhYmxlLT5kZXYuY21kbGluZSkpOworfQorI2VuZGlmCisKKy8qKgorICogR2V0IHRoZSBjb250ZW50IG9mIHRoZSBwYXJ0aXRpb24gdGFibGUuCisgKi8KK3N0YXRpYyBpbnQgZmxwcm9nX2dldF9wYXJ0X3RhYmxlICh1aW50OF90ICoqcHRiX2J1ZikKK3sKKwlpbnQgcmV0LCBpLCBjb3VudDsKKwlpbnQgcHRiX2ZkLCBwdGJfb2Zmc2V0OworCXN0cnVjdCBtdGRfaW5mb191c2VyIHB0Yl9tZW1pbmZvOworCWxvZmZfdCBwdGJfYmFkX29mZnNldDsKKwlmbHBhcnRfdGFibGVfdCAqdGFibGU7CisKKwkvKiBPcGVuIHRoZSBQVEIgZGV2aWNlICovCisJaWYgKChwdGJfZmQgPSBvcGVuKHB0Yl9kZXZpY2UsIE9fUkRPTkxZKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJvcGVuIFBUQiIpOworCQlleGl0KDEpOworCX0KKworCS8qIEZpbGwgaW4gTVREIGRldmljZSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAqLworCWlmICgocmV0ID0gaW9jdGwocHRiX2ZkLCBNRU1HRVRJTkZPLCAmcHRiX21lbWluZm8pKSAhPSAwKSB7CisJCXBlcnJvcigiUFRCIE1FTUdFVElORk8iKTsKKwkJZ290byBjbG9zZWFsbDsKKwl9CisKKwlmb3IgKHB0Yl9vZmZzZXQgPSAwOyBwdGJfb2Zmc2V0IDwgcHRiX21lbWluZm8uc2l6ZTsgcHRiX29mZnNldCArPSBwdGJfbWVtaW5mby5lcmFzZXNpemUpIHsKKwkJcHRiX2JhZF9vZmZzZXQgPSBwdGJfb2Zmc2V0OworCQlpZiAoKHJldCA9IGlvY3RsKHB0Yl9mZCwgTUVNR0VUQkFEQkxPQ0ssICZwdGJfYmFkX29mZnNldCkpIDwgMCkgeworCQkJcGVycm9yKCJpb2N0bChNRU1HRVRCQURCTE9DSykiKTsKKwkJCWdvdG8gY2xvc2VhbGw7CisJCX0KKworCQlpZiAocmV0ID09IDApCisJCQlicmVhazsKKworCQlpZiAoIXF1aWV0KQorCQkJZnByaW50ZiAoc3RkZXJyLAorCQkJIkJhZCBibG9jayBhdCAleCwgZnJvbSAleCB3aWxsIGJlIHNraXBwZWRcbiIsCisJCQkoaW50KXB0Yl9iYWRfb2Zmc2V0LCBwdGJfb2Zmc2V0KTsKKwl9CisJaWYgKHB0Yl9vZmZzZXQgPj0gcHRiX21lbWluZm8uc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgZ29vZCBibG9jayBpbiBQVEIuXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gY2xvc2VhbGw7CisJfQorCisJLyogcHRiX2J1ZiB3aWxsIGJlIGZyZWVkIGluIGZscHJvZ19zZXRfcGFydF90YWJsZSgpICovCisJKnB0Yl9idWYgPSB4bWFsbG9jKHB0Yl9tZW1pbmZvLmVyYXNlc2l6ZSk7CisKKwkvKiBSZWFkIHBhcnRpdGlvbiB0YWJsZS4KKwkgKiBOb3RlOiB3ZSBuZWVkIHRvIHJlYWQgYW5kIHNhdmUgdGhlIGVudGlyZSBibG9jayBkYXRhLCBiZWNhdXNlIHRoZQorCSAqIGVudGlyZSBibG9jayB3aWxsIGJlIGVyYXNlZCB3aGVuIHdyaXRlIHBhcnRpdGlvbiB0YWJsZSBiYWNrIHRvIGZsYXNoLgorCSAqIEJUVywgZmxwYXJ0X21ldGFfdCBpcyBsb2NhdGVkIGluIHRoZSBzYW1lIGJsb2NrIGFzIGZscGFydF90YWJsZV90CisJICovCisJY291bnQgPSBwdGJfbWVtaW5mby5lcmFzZXNpemU7CisJaWYgKHByZWFkKHB0Yl9mZCwgKnB0Yl9idWYsIGNvdW50LCBwdGJfb2Zmc2V0KSAhPSBjb3VudCkgeworCQlwZXJyb3IoInByZWFkIFBUQiIpOworCQlyZXQgPSAtMTsKKwkJZnJlZSgqcHRiX2J1Zik7CisJCWdvdG8gY2xvc2VhbGw7CisJfQorCisJdGFibGUgPSAoZmxwYXJ0X3RhYmxlX3QgKikoKnB0Yl9idWYpOworCWlmICghcXVpZXQpIHsKKwkJIGZvcihpID0gMDsgaSA8IFBBUlRfTUFYX1dJVEhfUlNWOyBpKyspeworCQkJaWYoIHRhYmxlLT5wYXJ0W2ldLmltZ19sZW4hPTApCisJCQkJZGlzcGxheV9mbHBhcnQoZ19wYXJ0X3N0cltpXSwgJih0YWJsZS0+cGFydFtpXSkpOworCQkgfQorCQkgZGlzcGxheV9kZXYoJih0YWJsZS0+ZGV2KSk7CisJfQorCitjbG9zZWFsbDoKKwljbG9zZShwdGJfZmQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBQcm9ncmFtIHRoZSBQVEIgZW50cnkuCisgKi8KK3N0YXRpYyBpbnQgZmxwcm9nX3NldF9wYXJ0X3RhYmxlKHVpbnQ4X3QgKipwdGJfYnVmKQoreworCWludCByZXQsIGksIGNvdW50LCBwdGJfZmQsIHB0Yl9vZmZzZXQ7CisJc3RydWN0IG10ZF9pbmZvX3VzZXIgcHRiX21lbWluZm87CisJbG9mZl90IHB0Yl9iYWRfb2Zmc2V0OworCWZscGFydF90YWJsZV90ICp0YWJsZSA9IChmbHBhcnRfdGFibGVfdCAqKSgqcHRiX2J1Zik7CisKKwkvKiBPcGVuIHRoZSBQVEIgZGV2aWNlICovCisJaWYgKChwdGJfZmQgPSBvcGVuKHB0Yl9kZXZpY2UsIE9fUkRXUikpID09IC0xKSB7CisJCXBlcnJvcigib3BlbiBQVEIiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBGaWxsIGluIE1URCBkZXZpY2UgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KKwlpZiAoKHJldCA9IGlvY3RsKHB0Yl9mZCwgTUVNR0VUSU5GTywgJnB0Yl9tZW1pbmZvKSkgIT0gMCkgeworCQlwZXJyb3IoIlBUQiBNRU1HRVRJTkZPIik7CisJCWdvdG8gY2xvc2VhbGw7CisJfQorCisJaWYgKFBUQl9TSVpFID4gcHRiX21lbWluZm8uZXJhc2VzaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUFRCIGNhbid0IGZpdCBpbnRvIGVyYXNlc2l6ZS5cbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZWFsbDsKKwl9CisKKwlmb3IgKHB0Yl9vZmZzZXQgPSAwOyBwdGJfb2Zmc2V0IDwgcHRiX21lbWluZm8uc2l6ZTsgcHRiX29mZnNldCArPSBwdGJfbWVtaW5mby5lcmFzZXNpemUpIHsKKwkJcHRiX2JhZF9vZmZzZXQgPSBwdGJfb2Zmc2V0OworCQlpZiAoKHJldCA9IGlvY3RsKHB0Yl9mZCwgTUVNR0VUQkFEQkxPQ0ssICZwdGJfYmFkX29mZnNldCkpIDwgMCkgeworCQkJcGVycm9yKCJpb2N0bChNRU1HRVRCQURCTE9DSykiKTsKKwkJCWdvdG8gY2xvc2VhbGw7CisJCX0KKworCQlpZiAocmV0ID09IDApIHsKKwkJCS8qIFRoaXMgaXNuJ3QgYSBiYWQgYmxvY2ssIHNvIGVyYXNlIGl0IGZpcnN0ICovCisJCQllcmFzZV9pbmZvX3QgZXJhc2U7CisJCQllcmFzZS5zdGFydCA9IHB0Yl9vZmZzZXQ7CisJCQllcmFzZS5sZW5ndGggPSBwdGJfbWVtaW5mby5lcmFzZXNpemU7CisJCQlpZiAoKHJldCA9IGlvY3RsKHB0Yl9mZCwgTUVNRVJBU0UsICZlcmFzZSkpICE9IDApIHsKKwkJCQlwZXJyb3IoIlBUQiBNRU1FUkFTRSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXF1aWV0KQorCQkJZnByaW50ZiAoc3RkZXJyLAorCQkJCSJCYWQgYmxvY2sgYXQgJXgsIGZyb20gJXggd2lsbCBiZSBza2lwcGVkXG4iLAorCQkJCShpbnQpcHRiX2JhZF9vZmZzZXQsIHB0Yl9vZmZzZXQpOworCX0KKworCWlmIChwdGJfb2Zmc2V0ID49IHB0Yl9tZW1pbmZvLnNpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBmaW5kIGdvb2QgYmxvY2sgaW4gUFRCLlxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIGNsb3NlYWxsOworCX0KKworI2lmIDAKKwlpZiAodGFibGUtPmRldi5tYWdpYyAhPSBGTFBBUlRfTUFHSUMpIHsKKwkJbWVtc2V0KCZ0YWJsZS0+ZGV2LCAweDAsIHNpemVvZih0YWJsZS0+ZGV2KSk7CisJCWZscHJvZ19nZXRfZGV2X3BhcmFtKHRhYmxlKTsKKwkJdGFibGUtPmRldi5tYWdpYyA9IEZMUEFSVF9NQUdJQzsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBQQVJUX01BWF9XSVRIX1JTVjsgaSsrKXsKKwkJaWYgKHRhYmxlLT5wYXJ0W2ldLmltZ19sZW4gIT0gMCAmJiB0YWJsZS0+cGFydFtpXS5tYWdpYyAhPSBGTFBBUlRfTUFHSUMpIHsKKwkJCW1lbXNldCgmdGFibGUtPnBhcnRbaV0sIDB4MCwgc2l6ZW9mKHRhYmxlLT5wYXJ0W2ldKSk7CisJCQl0YWJsZS0+cGFydFtpXS5tYWdpYyA9IEZMUEFSVF9NQUdJQzsKKwkJfQorCX0KKyNlbHNlCisJaWYgKHRhYmxlLT5kZXYubWFnaWMgIT0gRkxQQVJUX01BR0lDKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBkZXYgbWFnaWM6IDB4JTA4eCgweCUwOHgpXG4iLAorCQkJdGFibGUtPmRldi5tYWdpYywgRkxQQVJUX01BR0lDKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gY2xvc2VhbGw7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgUEFSVF9NQVhfV0lUSF9SU1Y7IGkrKyl7CisJCWlmICh0YWJsZS0+cGFydFtpXS5pbWdfbGVuICE9IDAgJiYgdGFibGUtPnBhcnRbaV0ubWFnaWMgIT0gRkxQQVJUX01BR0lDKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiSW52YWxpZCBwYXJ0aXRpb24gdGFibGUgbWFnaWMoJWQpOiAweCUwOHgoMHglMDh4KVxuIiwKKwkJCQlpLCB0YWJsZS0+cGFydFtpXS5tYWdpYywgRkxQQVJUX01BR0lDKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBjbG9zZWFsbDsKKwkJfQorCX0KKyNlbmRpZgorCisJY291bnQgPSBwdGJfbWVtaW5mby5lcmFzZXNpemU7CisJaWYgKHB3cml0ZShwdGJfZmQsICpwdGJfYnVmLCBjb3VudCwgcHRiX29mZnNldCkgIT0gY291bnQpIHsKKwkJcGVycm9yICgicHdyaXRlIFBUQiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZWFsbDsKKwl9CisKKwlpZiAoIXF1aWV0KSB7CisJCWZvcihpID0gMDtpIDwgUEFSVF9NQVhfV0lUSF9SU1Y7IGkrKyl7CisJCQlpZiggdGFibGUtPnBhcnRbaV0uaW1nX2xlbiE9MCkKKwkJCQlkaXNwbGF5X2ZscGFydChnX3BhcnRfc3RyW2ldLCAmdGFibGUtPnBhcnRbaV0pOworCQl9CisJCWRpc3BsYXlfZGV2KCZ0YWJsZS0+ZGV2KTsKKwl9CitjbG9zZWFsbDoKKwlmcmVlKCpwdGJfYnVmKTsKKwljbG9zZShwdGJfZmQpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogTWFpbiBwcm9ncmFtCisgKi8KK2ludCBuYW5kd3JpdGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5hbmR3cml0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgY250LCBmZCwgaWZkLCBwYWdlbGVuLCBiYWRlcmFzZWJsb2NrLCBibG9ja3N0YXJ0ID0gLTE7CisJaW50IHJldCwgcmVhZGxlbiwgb29iaW5mb2NoYW5nZWQgPSAwOworCWludCBpbWFnZV9jcmMgPSB+MFUsIGltYWdlX2xlbmd0aCA9IDAsIGltZ2xlbiA9IDA7CisJdWludDhfdCAqcHRiX2J1ZiA9IE5VTEw7CisJZmxwYXJ0X3RhYmxlX3QgKnB0Yl90YWJsZTsKKwlzdHJ1Y3QgbmFuZF9vb2JpbmZvIG9sZF9vb2JpbmZvOworCXN0cnVjdCBtdGRfaW5mb191c2VyIG1lbWluZm87CisJc3RydWN0IG10ZF9vb2JfYnVmIG9vYjsKKwlsb2ZmX3Qgb2ZmczsKKwl1bnNpZ25lZCBjaGFyIHJlYWRidWZbTUFYX1BBR0VfU0laRV07CisJaW50IGZpbGVfb2Zmc2V0ID0gbXRkb2Zmc2V0OworCWludCBidWZfbnVtID0gMDsKKworCUlOSVRfRygpOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcm9jZXNzX29wdGlvbnMoYXJnYywgYXJndik7CisKKwlpZiAoYW1iYXJlbGxhX3NraXBfaW1nID09IDEpCisJCWdvdG8gYW1iYXJlbGxhX3Byb2Nlc3M7CisKKwltZW1zZXQoRy5vb2JidWYsIDB4ZmYsIHNpemVvZihHLm9vYmJ1ZikpOworCisJaWYgKHBhZCAmJiB3cml0ZW9vYikgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHBhZCB3aGVuIG9vYiBkYXRhIGlzIHByZXNlbnQuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBPcGVuIHRoZSBkZXZpY2UgKi8KKwlpZiAoKGZkID0gb3BlbihtdGRfZGV2aWNlLCBPX1JEV1IpKSA9PSAtMSkgeworCQlwZXJyb3IoIm9wZW4gZmxhc2giKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBGaWxsIGluIE1URCBkZXZpY2UgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KKwlpZiAoaW9jdGwoZmQsIE1FTUdFVElORk8sICZtZW1pbmZvKSAhPSAwKSB7CisJCXBlcnJvcigiTUVNR0VUSU5GTyIpOworCQljbG9zZShmZCk7CisJCWV4aXQoMSk7CisJfQorCisJLyogU2V0IGVyYXNlc2l6ZSB0byBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2NrcyAtIHRvIG1hdGNoIGpmZnMyCisJICogKHZpcnR1YWwpIGJsb2NrIHNpemUgKi8KKwltZW1pbmZvLmVyYXNlc2l6ZSAqPSBibG9ja2FsaWduOworCisJLyogTWFrZSBzdXJlIGRldmljZSBwYWdlIHNpemVzIGFyZSB2YWxpZCAqLworCWlmICghKG1lbWluZm8ub29ic2l6ZSA9PSAxNiAmJiBtZW1pbmZvLndyaXRlc2l6ZSA9PSA1MTIpICYmCisJCQkhKG1lbWluZm8ub29ic2l6ZSA9PSA4ICYmIG1lbWluZm8ud3JpdGVzaXplID09IDI1NikgJiYKKwkJCSEobWVtaW5mby5vb2JzaXplID09IDY0ICYmIG1lbWluZm8ud3JpdGVzaXplID09IDIwNDgpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBmbGFzaCAobm90IG5vcm1hbCBOQU5EKVxuIik7CisJCWNsb3NlKGZkKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoYXV0b3BsYWNlKSB7CisJCS8qIFJlYWQgdGhlIGN1cnJlbnQgb29iIGluZm8gKi8KKwkJaWYgKGlvY3RsIChmZCwgTUVNR0VUT09CU0VMLCAmb2xkX29vYmluZm8pICE9IDApIHsKKwkJCXBlcnJvciAoIk1FTUdFVE9PQlNFTCIpOworCQkJY2xvc2UgKGZkKTsKKwkJCWV4aXQgKDEpOworCQl9CisKKwkJLy8gYXV0b3BsYWNlIEVDQyA/CisJCWlmIChhdXRvcGxhY2UgJiYgKG9sZF9vb2JpbmZvLnVzZWVjYyAhPSBNVERfTkFOREVDQ19BVVRPUExBQ0UpKSB7CisJCQlpZiAoaW9jdGwgKGZkLCBNRU1TRVRPT0JTRUwsICZHLmF1dG9wbGFjZV9vb2JpbmZvKSAhPSAwKSB7CisJCQkJcGVycm9yICgiTUVNU0VUT09CU0VMIik7CisJCQkJY2xvc2UgKGZkKTsKKwkJCQlleGl0ICgxKTsKKwkJCX0KKwkJCW9vYmluZm9jaGFuZ2VkID0gMTsKKwkJfQorCX0KKworCWlmIChub2VjYykgIHsKKwkJcmV0ID0gaW9jdGwoZmQsIE1UREZJTEVNT0RFLCAodm9pZCAqKSBNVERfTU9ERV9SQVcpOworCQlpZiAocmV0ID09IDApIHsKKwkJCW9vYmluZm9jaGFuZ2VkID0gMjsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCWNhc2UgRU5PVFRZOgorCQkJCWlmIChpb2N0bCAoZmQsIE1FTUdFVE9PQlNFTCwgJm9sZF9vb2JpbmZvKSAhPSAwKSB7CisJCQkJCXBlcnJvciAoIk1FTUdFVE9PQlNFTCIpOworCQkJCQljbG9zZSAoZmQpOworCQkJCQlleGl0ICgxKTsKKwkJCQl9CisJCQkJaWYgKGlvY3RsIChmZCwgTUVNU0VUT09CU0VMLCAmRy5ub25lX29vYmluZm8pICE9IDApIHsKKwkJCQkJcGVycm9yICgiTUVNU0VUT09CU0VMIik7CisJCQkJCWNsb3NlIChmZCk7CisJCQkJCWV4aXQgKDEpOworCQkJCX0KKwkJCQlvb2JpbmZvY2hhbmdlZCA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXBlcnJvciAoIk1UREZJTEVNT0RFIik7CisJCQkJY2xvc2UgKGZkKTsKKwkJCQlleGl0ICgxKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogZm9yY2Ugb29iIGxheW91dCBmb3IgamZmczIgb3IgeWFmZnMgPworCSAqIExlZ2FjeSBzdXBwb3J0CisJICovCisJaWYgKGZvcmNlamZmczIgfHwgZm9yY2V5YWZmcykgeworCQlzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwgPSBmb3JjZWpmZnMyID8gJkcuamZmczJfb29iaW5mbyA6ICZHLnlhZmZzX29vYmluZm87CisKKwkJaWYgKGF1dG9wbGFjZSkgeworCQkJZnByaW50ZihzdGRlcnIsICJBdXRvcGxhY2VtZW50IGlzIG5vdCBwb3NzaWJsZSBmb3IgbGVnYWN5IC1qLy15IG9wdGlvbnNcbiIpOworCQkJZ290byByZXN0b3Jlb29iOworCQl9CisJCWlmICgob2xkX29vYmluZm8udXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkgJiYgIWZvcmNlbGVnYWN5KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVzZSAtZiBvcHRpb24gdG8gZW5mb3JjZSBsZWdhY3kgcGxhY2VtZW50IG9uIGF1dG9wbGFjZW1lbnQgZW5hYmxlZCBtdGQgZGV2aWNlXG4iKTsKKwkJCWdvdG8gcmVzdG9yZW9vYjsKKwkJfQorCQlpZiAobWVtaW5mby5vb2JzaXplID09IDgpIHsKKwkJCWlmIChmb3JjZXlhZmZzKSB7CisJCQkJZnByaW50ZiAoc3RkZXJyLCAiWUFGU1MgY2Fubm90IG9wZXJhdGUgb24gMjU2IEJ5dGUgcGFnZSBzaXplIik7CisJCQkJZ290byByZXN0b3Jlb29iOworCQkJfQorCQkJLyogQWRqdXN0IG51bWJlciBvZiBlY2MgYnl0ZXMgKi8KKwkJCUcuamZmczJfb29iaW5mby5lY2NieXRlcyA9IDM7CisJCX0KKworCQlpZiAoaW9jdGwgKGZkLCBNRU1TRVRPT0JTRUwsIG9vYnNlbCkgIT0gMCkgeworCQkJcGVycm9yICgiTUVNU0VUT09CU0VMIik7CisJCQlnb3RvIHJlc3RvcmVvb2I7CisJCX0KKwl9CisKKwlvb2IubGVuZ3RoID0gbWVtaW5mby5vb2JzaXplOworCW9vYi5wdHIgPSBub2VjYyA/IEcub29icmVhZGJ1ZiA6IEcub29iYnVmOworCisJLyogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLworCWlmICgoaWZkID0gb3BlbihpbWcsIE9fUkRPTkxZKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJvcGVuIGlucHV0IGZpbGUiKTsKKwkJZ290byByZXN0b3Jlb29iOworCX0KKworCS8vIGdldCBpbWFnZSBsZW5ndGgKKwlpbWdsZW4gPSBsc2VlayhpZmQsIDAsIFNFRUtfRU5EKTsKKwlsc2VlayAoaWZkLCAwLCBTRUVLX1NFVCk7CisJaW1hZ2VfbGVuZ3RoID0gaW1nbGVuOworCisJcGFnZWxlbiA9IG1lbWluZm8ud3JpdGVzaXplICsgKCh3cml0ZW9vYiA9PSAxKSA/IG1lbWluZm8ub29ic2l6ZSA6IDApOworCisJLy8gQ2hlY2ssIGlmIGZpbGUgaXMgcGFnZWFsaWduZWQKKwlpZiAoKCFwYWQpICYmICgoaW1nbGVuICUgcGFnZWxlbikgIT0gMCkpIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAiSW5wdXQgZmlsZSBpcyBub3QgcGFnZSBhbGlnbmVkXG4iKTsKKwkJZ290byBjbG9zZWFsbDsKKwl9CisKKwkvLyBDaGVjaywgaWYgbGVuZ3RoIGZpdHMgaW50byBkZXZpY2UKKwlpZiAoICgoaW1nbGVuIC8gcGFnZWxlbikgKiBtZW1pbmZvLndyaXRlc2l6ZSkgPiAobWVtaW5mby5zaXplIC0gbXRkb2Zmc2V0KSkgeworCQlmcHJpbnRmIChzdGRlcnIsICJJbWFnZSAlZCBieXRlcywgTkFORCBwYWdlICVkIGJ5dGVzLCBPT0IgYXJlYSAldSBieXRlcywgZGV2aWNlIHNpemUgJXUgYnl0ZXNcbiIsCisJCQkJaW1nbGVuLCBwYWdlbGVuLCBtZW1pbmZvLndyaXRlc2l6ZSwgbWVtaW5mby5zaXplKTsKKwkJcGVycm9yICgiSW5wdXQgZmlsZSBkb2VzIG5vdCBmaXQgaW50byBkZXZpY2UiKTsKKwkJZ290byBjbG9zZWFsbDsKKwl9CisKKwljcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKworCS8qIEdldCBkYXRhIGZyb20gaW5wdXQgYW5kIHdyaXRlIHRvIHRoZSBkZXZpY2UgKi8KKwl3aGlsZSAoaW1nbGVuICYmIChtdGRvZmZzZXQgPCBtZW1pbmZvLnNpemUpKSB7CisJCS8vIG5ldyBlcmFzZWJsb2NrICwgY2hlY2sgZm9yIGJhZCBibG9jayhzKQorCQkvLyBTdGF5IGluIHRoZSBsb29wIHRvIGJlIHN1cmUgaWYgdGhlIG10ZG9mZnNldCBjaGFuZ2VzIGJlY2F1c2UKKwkJLy8gb2YgYSBiYWQgYmxvY2ssIHRoYXQgdGhlIG5leHQgYmxvY2sgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8KKwkJLy8gaXMgYWxzbyBjaGVja2VkLiBUaHVzIGF2b2lkaW5nIGVycm9ycyBpZiB0aGUgYmxvY2socykgYWZ0ZXIgdGhlCisJCS8vIHNraXBwZWQgYmxvY2socykgaXMgYWxzbyBiYWQgKG51bWJlciBvZiBibG9ja3MgZGVwZW5kaW5nIG9uCisJCS8vIHRoZSBibG9ja2FsaWduCisJCXdoaWxlIChibG9ja3N0YXJ0ICE9IChtdGRvZmZzZXQgJiAofm1lbWluZm8uZXJhc2VzaXplICsgMSkpKSB7CisJCQlpZiAoZGVsYXkpIHsKKwkJCQl1c2xlZXAoZGVsYXkpOworCQkJfQorCQkJYmxvY2tzdGFydCA9IG10ZG9mZnNldCAmICh+bWVtaW5mby5lcmFzZXNpemUgKyAxKTsKKwkJCW9mZnMgPSBibG9ja3N0YXJ0OworCQkJYmFkZXJhc2VibG9jayA9IDA7CisJCQlpZiAoIXF1aWV0KQorCQkJCWZwcmludGYgKHN0ZG91dCwgIldyaXRpbmcgZGF0YSB0byBibG9jayAleFxuIiwgYmxvY2tzdGFydCk7CisKKwkJCS8qIENoZWNrIGFsbCB0aGUgYmxvY2tzIGluIGFuIGVyYXNlIGJsb2NrIGZvciBiYWQgYmxvY2tzICovCisJCQlkbyB7CisJCQkJaWYgKChyZXQgPSBpb2N0bChmZCwgTUVNR0VUQkFEQkxPQ0ssICZvZmZzKSkgPCAwKSB7CisJCQkJCXBlcnJvcigiaW9jdGwoTUVNR0VUQkFEQkxPQ0spIik7CisJCQkJCWdvdG8gY2xvc2VhbGw7CisJCQkJfQorCQkJCWlmIChyZXQgPT0gMSkgeworCQkJCQliYWRlcmFzZWJsb2NrID0gMTsKKwkJCQkJaWYgKCFxdWlldCkKKwkJCQkJCWZwcmludGYgKHN0ZGVyciwgIkJhZCBibG9jayBhdCAleCwgJXUgYmxvY2socykgIgorCQkJCQkJCQkiZnJvbSAleCB3aWxsIGJlIHNraXBwZWRcbiIsCisJCQkJCQkJCShpbnQpIG9mZnMsIGJsb2NrYWxpZ24sIGJsb2Nrc3RhcnQpOworCQkJCX0KKworCQkJCWlmIChiYWRlcmFzZWJsb2NrKSB7CisJCQkJCW10ZG9mZnNldCA9IGJsb2Nrc3RhcnQgKyBtZW1pbmZvLmVyYXNlc2l6ZTsKKwkJCQl9CisJCQkJb2ZmcyArPSAgbWVtaW5mby5lcmFzZXNpemUgLyBibG9ja2FsaWduIDsKKwkJCX0gd2hpbGUgKCBvZmZzIDwgYmxvY2tzdGFydCArIG1lbWluZm8uZXJhc2VzaXplICk7CisKKwkJfQorCisJCXJlYWRsZW4gPSBtZW1pbmZvLndyaXRlc2l6ZTsKKwkJaWYgKHBhZCAmJiAoaW1nbGVuIDwgcmVhZGxlbikpCisJCXsKKwkJCXJlYWRsZW4gPSBpbWdsZW47CisJCQltZW1zZXQoRy53cml0ZWJ1ZiArIHJlYWRsZW4sIDB4ZmYsIG1lbWluZm8ud3JpdGVzaXplIC0gcmVhZGxlbik7CisJCX0KKworCQkvKiBSZWFkIFBhZ2UgRGF0YSBmcm9tIGlucHV0IGZpbGUgKi8KKwkJaWYgKChjbnQgPSBwcmVhZChpZmQsIEcud3JpdGVidWYsIHJlYWRsZW4sZmlsZV9vZmZzZXQpKSAhPSByZWFkbGVuKSB7CisJCQlpZiAoY250ID09IDApCS8vIEVPRgorCQkJCWJyZWFrOworCQkJcGVycm9yICgiRmlsZSBJL08gZXJyb3Igb24gaW5wdXQgZmlsZSIpOworCQkJZ290byBjbG9zZWFsbDsKKwkJfQorCisJCWltYWdlX2NyYyA9IGNyYzMyKGltYWdlX2NyYywgRy53cml0ZWJ1ZiwgY250KTsKKworCQlpZiAod3JpdGVvb2IpIHsKKwkJCS8qIFJlYWQgT09CIGRhdGEgZnJvbSBpbnB1dCBmaWxlLCBleGl0IG9uIGZhaWx1cmUgKi8KKwkJCWlmICgoY250ID0gcHJlYWQoaWZkLCBHLm9vYnJlYWRidWYsIG1lbWluZm8ub29ic2l6ZSxmaWxlX29mZnNldCkpICE9IG1lbWluZm8ub29ic2l6ZSkgeworCQkJCXBlcnJvciAoIkZpbGUgSS9PIGVycm9yIG9uIGlucHV0IGZpbGUiKTsKKwkJCQlnb3RvIGNsb3NlYWxsOworCQkJfQorCQkJaWYgKCFub2VjYykgeworCQkJCWludCBpLCBzdGFydCwgbGVuLCBmaWxsZWQ7CisJCQkJLyoKKwkJCQkgKiAgV2UgdXNlIGF1dG9wbGFjZW1lbnQgYW5kIGhhdmUgdGhlIG9vYmluZm8gd2l0aCB0aGUgYXV0b3BsYWNlbWVudAorCQkJCSAqIGluZm9ybWF0aW9uIGZyb20gdGhlIGtlcm5lbCBhdmFpbGFibGUKKwkJCQkgKgorCQkJCSAqIE1vZGlmaWVkIHRvIHN1cHBvcnQgb3V0IG9mIG9yZGVyIG9vYmZyZWUgc2VnbWVudHMsCisJCQkJICogc3VjaCBhcyB0aGUgbGF5b3V0IHVzZWQgYnkgZGlza29uY2hpcC5jCisJCQkJICovCisJCQkJaWYgKCFvb2JpbmZvY2hhbmdlZCAmJiAob2xkX29vYmluZm8udXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkpIHsKKwkJCQkJZm9yIChmaWxsZWQgPSAwLCBpID0gMDsgb2xkX29vYmluZm8ub29iZnJlZVtpXVsxXSAmJiAoaSA8IE1URF9NQVhfT09CRlJFRV9FTlRSSUVTKTsgaSsrKSB7CisJCQkJCQkvKiBTZXQgdGhlIHJlc2VydmVkIGJ5dGVzIHRvIDB4ZmYgKi8KKwkJCQkJCXN0YXJ0ID0gb2xkX29vYmluZm8ub29iZnJlZVtpXVswXTsKKwkJCQkJCWxlbiA9IG9sZF9vb2JpbmZvLm9vYmZyZWVbaV1bMV07CisJCQkJCQltZW1jcHkoRy5vb2JidWYgKyBzdGFydCwKKwkJCQkJCQkJRy5vb2JyZWFkYnVmICsgZmlsbGVkLAorCQkJCQkJCQlsZW4pOworCQkJCQkJZmlsbGVkICs9IGxlbjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIFNldCBhdCBsZWFzdCB0aGUgZWNjIGJ5dGUgcG9zaXRpb25zIHRvIDB4ZmYgKi8KKwkJCQkJc3RhcnQgPSBvbGRfb29iaW5mby5lY2NieXRlczsKKwkJCQkJbGVuID0gbWVtaW5mby5vb2JzaXplIC0gc3RhcnQ7CisJCQkJCW1lbWNweShHLm9vYmJ1ZiArIHN0YXJ0LAorCQkJCQkJCUcub29icmVhZGJ1ZiArIHN0YXJ0LAorCQkJCQkJCWxlbik7CisJCQkJfQorCQkJfQorCQkJLyogV3JpdGUgT09CIGRhdGEgZmlyc3QsIGFzIGVjYyB3aWxsIGJlIHBsYWNlZCBpbiB0aGVyZSovCisJCQlvb2Iuc3RhcnQgPSBtdGRvZmZzZXQ7CisJCQlpZiAoaW9jdGwoZmQsIE1FTVdSSVRFT09CLCAmb29iKSAhPSAwKSB7CisJCQkJcGVycm9yICgiaW9jdGwoTUVNV1JJVEVPT0IpIik7CisJCQkJZ290byBjbG9zZWFsbDsKKwkJCX0KKwkJCWltZ2xlbiAtPSBtZW1pbmZvLm9vYnNpemU7CisJCX0KKworCQkvKiBXcml0ZSBvdXQgdGhlIFBhZ2UgZGF0YSAqLworCQlpZiAocHdyaXRlKGZkLCBHLndyaXRlYnVmLCBtZW1pbmZvLndyaXRlc2l6ZSwgbXRkb2Zmc2V0KSAhPSBtZW1pbmZvLndyaXRlc2l6ZSkgeworCQkJcGVycm9yICgicHdyaXRlIik7CisJCQlnb3RvIGNsb3NlYWxsOworCQl9CisKKwkJLyogcmVhZCBvdXQgdGhlIFBhZ2UgZGF0YSAqLworCQlpZiAocHJlYWQoZmQsIHJlYWRidWYsIG1lbWluZm8ud3JpdGVzaXplLCBtdGRvZmZzZXQpICE9IG1lbWluZm8ud3JpdGVzaXplKSB7CisJCQlwZXJyb3IgKCJwcmVhZCIpOworCQkJZ290byBjbG9zZWFsbDsKKwkJfQorCisJCWJ1Zl9udW09MDsKKwkJd2hpbGUgKChHLndyaXRlYnVmW2J1Zl9udW1dPT1yZWFkYnVmW2J1Zl9udW1dKSAmJiAoYnVmX251bSA8IHJlYWRsZW4pKSBidWZfbnVtKys7CisKKwkJLy9pZiAoKChibG9ja3N0YXJ0L01BWF9QQUdFX1NJWkUvNjQpICUgMTApID09IDkpCisJCWlmIChidWZfbnVtIDwgcmVhZGxlbikKKwkJeworCQkJLy9wcmludGYoIm9mZnNbJXggXSxibG9ja3N0YXJ0WyV4XSxtdGRvZmZzZXRbJXhdLHdyaXRlc2l6ZVsweCV4XSwgYnVmX251bVsweCV4XVxuIiwoaW50KW9mZnMsYmxvY2tzdGFydCxtdGRvZmZzZXQsbWVtaW5mby53cml0ZXNpemUsIGJ1Zl9udW0pOworCisJCQkvKiBzZXQgYmFkIGJsb2NrcyAqLworCQkJb2ZmcyA9IChsb2ZmX3QpIGJsb2Nrc3RhcnQ7CisJCQlpZiAoKHJldCA9IGlvY3RsKGZkLCBNRU1TRVRCQURCTE9DSywgJm9mZnMpKSA8IDApIHsKKwkJCQlwZXJyb3IoImlvY3RsKE1FTVNFVEJBREJMT0NLKSIpOworCQkJCWdvdG8gY2xvc2VhbGw7CisJCQl9CisJCQlpZiAoKHJldCA9PSAwKSAmJiAoIXF1aWV0KSkgeworCQkJCWZwcmludGYgKHN0ZG91dCwgInNldCBCYWQgYmxvY2sgYXQgJXggIVxuIixibG9ja3N0YXJ0KTsKKwkJCQlmaWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0IC0gKG10ZG9mZnNldC1ibG9ja3N0YXJ0KTsKKwkJCQlpbWdsZW4gPSBpbWdsZW4rIChtdGRvZmZzZXQtYmxvY2tzdGFydCk7OworCQkJCW10ZG9mZnNldCA9IGJsb2Nrc3RhcnQgKyBtZW1pbmZvLmVyYXNlc2l6ZTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWltZ2xlbiAtPSByZWFkbGVuOworCQkJbXRkb2Zmc2V0ICs9IG1lbWluZm8ud3JpdGVzaXplOworCQkJZmlsZV9vZmZzZXQrPSBtZW1pbmZvLndyaXRlc2l6ZTsKKwkJfQorCX0KKworY2xvc2VhbGw6CisJY2xvc2UoaWZkKTsKKworcmVzdG9yZW9vYjoKKwlpZiAob29iaW5mb2NoYW5nZWQgPT0gMSkgeworCQlpZiAoaW9jdGwgKGZkLCBNRU1TRVRPT0JTRUwsICZvbGRfb29iaW5mbykgIT0gMCkgeworCQkJcGVycm9yICgiTUVNU0VUT09CU0VMIik7CisJCQljbG9zZSAoZmQpOworCQkJZXhpdCAoMSk7CisJCX0KKwl9CisKKwljbG9zZShmZCk7CisKKwlpZiAoaW1nbGVuID4gMCkgeworCQlwZXJyb3IgKCJEYXRhIHdhcyBvbmx5IHBhcnRpYWxseSB3cml0dGVuIGR1ZSB0byBlcnJvclxuIik7CisJCWV4aXQgKDEpOworCX0KKworCWltYWdlX2NyYyBePSB+MFU7CisJcHJpbnRmICgiaW1hZ2VfbGVuZ3RoID0gMHglMDh4XG4iLCBpbWFnZV9sZW5ndGgpOworCXByaW50ZiAoImltYWdlX2NyYyA9IDB4JTA4eFxuIiwgaW1hZ2VfY3JjKTsKK2FtYmFyZWxsYV9wcm9jZXNzOgorCWlmIChhbWJhcmVsbGFfYmxkIHx8YW1iYXJlbGxhX2ZvcmNlX3B0Ynx8IGFtYmFyZWxsYV9oYWwgfHwKKwkJYW1iYXJlbGxhX3BiYSB8fCBhbWJhcmVsbGFfc2VjIHx8IGFtYmFyZWxsYV9kc3AgfHwKKwkJYW1iYXJlbGxhX2xueCB8fCBhbWJhcmVsbGFfc3dwIHx8IGFtYmFyZWxsYV9hZGQgfHwKKwkJYW1iYXJlbGxhX2FkYyB8fCBhbWJhcmVsbGFfcHJpIHx8IGFtYmFyZWxsYV9ybWQgfHwKKwkJYW1iYXJlbGxhX3JvbSB8fCBhbWJhcmVsbGFfY21kIHx8IGFtYmFyZWxsYV9ldGggfHwKKwkJYW1iYXJlbGxhX3NuIHx8IGFtYmFyZWxsYV9iYWsgfHwgYW1iYXJlbGxhX2F1dG9fZGwgfHwKKwkJYW1iYXJlbGxhX2F1dG9fYm9vdCB8fCBhbWJhcmVsbGFfbGFuX2lwIHx8IGFtYmFyZWxsYV9sYW5fbWFzayB8fAorCQlhbWJhcmVsbGFfbGFuX2d3IHx8IGFtYmFyZWxsYV90ZnRwZCB8fCBhbWJhcmVsbGFfcHJpX2FkZHIgfHwKKwkJYW1iYXJlbGxhX3ByaV9maWxlIHx8IGFtYmFyZWxsYV9zaG93X2luZm9fZmxhZ3x8CisJCWFtYmFyZWxsYV9ldGgxIHx8IGFtYmFyZWxsYV9ldGgxX2lwIHx8IGFtYmFyZWxsYV9ldGgxX21hc2sgfHwKKwkJYW1iYXJlbGxhX2V0aDFfZ3cgfHwKKwkJYW1iYXJlbGxhX3dpZmkwIHx8IGFtYmFyZWxsYV93aWZpMF9pcCB8fCBhbWJhcmVsbGFfd2lmaTBfbWFzayB8fAorCQlhbWJhcmVsbGFfd2lmaTBfZ3cKKyNpZiAoVVNFX1dJRkkgPj0gMikKKwkJfHwgYW1iYXJlbGxhX3dpZmkxIHx8IGFtYmFyZWxsYV93aWZpMV9pcCB8fCBhbWJhcmVsbGFfd2lmaTFfbWFzayB8fAorCQlhbWJhcmVsbGFfd2lmaTFfZ3cKKyNlbmRpZgorCQkpIHsKKwkJaWYgKGZscHJvZ19nZXRfcGFydF90YWJsZSgmcHRiX2J1ZikgPCAwKQorCQkJZXhpdCAoMSk7CisJfQorCisJcHRiX3RhYmxlID0gKGZscGFydF90YWJsZV90ICopcHRiX2J1ZjsKKworCWlmIChhbWJhcmVsbGFfcHJpKSB7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1BSSV0uaW1nX2xlbiA9IGltYWdlX2xlbmd0aDsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUFJJXS5jcmMzMiA9IGltYWdlX2NyYzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUFJJXS5mbGFnID0gYW1iYXJlbGxhX2ZscGFydF9mbGFnOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9QUkldLm1lbV9hZGRyID0gYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkcjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUFJJXS52ZXJfbnVtID0gYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9QUkldLnZlcl9kYXRlID0gYW1iYXJlbGxhX2ZscGFydF9kYXRlOworCX0KKwlpZiAoYW1iYXJlbGxhX3JtZCkgeworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9STURdLmltZ19sZW4gPSBpbWFnZV9sZW5ndGg7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1JNRF0uY3JjMzIgPSBpbWFnZV9jcmM7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1JNRF0uZmxhZyA9IGFtYmFyZWxsYV9mbHBhcnRfZmxhZzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUk1EXS5tZW1fYWRkciA9IGFtYmFyZWxsYV9mbHBhcnRfbWVtX2FkZHI7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1JNRF0udmVyX251bSA9IGFtYmFyZWxsYV9mbHBhcnRfdmVyc2lvbjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUk1EXS52ZXJfZGF0ZSA9IGFtYmFyZWxsYV9mbHBhcnRfZGF0ZTsKKwl9CisJaWYgKGFtYmFyZWxsYV9yb20pIHsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUk9NXS5pbWdfbGVuID0gaW1hZ2VfbGVuZ3RoOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9ST01dLmNyYzMyID0gaW1hZ2VfY3JjOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9ST01dLmZsYWcgPSBhbWJhcmVsbGFfZmxwYXJ0X2ZsYWc7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1JPTV0ubWVtX2FkZHIgPSBhbWJhcmVsbGFfZmxwYXJ0X21lbV9hZGRyOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9ST01dLnZlcl9udW0gPSBhbWJhcmVsbGFfZmxwYXJ0X3ZlcnNpb247CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1JPTV0udmVyX2RhdGUgPSBhbWJhcmVsbGFfZmxwYXJ0X2RhdGU7CisJfQorCWlmIChhbWJhcmVsbGFfYmFrKSB7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0JBS10uaW1nX2xlbiA9IGltYWdlX2xlbmd0aDsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQkFLXS5jcmMzMiA9IGltYWdlX2NyYzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQkFLXS5mbGFnID0gYW1iYXJlbGxhX2ZscGFydF9mbGFnOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9CQUtdLm1lbV9hZGRyID0gYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkcjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQkFLXS52ZXJfbnVtID0gYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9CQUtdLnZlcl9kYXRlID0gYW1iYXJlbGxhX2ZscGFydF9kYXRlOworCX0KKworCS8vaWYgKGFtYmFyZWxsYV9wdGIpIHsKKwkJLy9wdGJfdGFibGUtPnBhcnRbUEFSVF9QVEJdLmltZ19sZW4gPSBpbWFnZV9sZW5ndGg7CisJCS8vcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUFRCXS5jcmMzMiA9IGltYWdlX2NyYzsKKwkJLy9wdGJfdGFibGUtPnBhcnRbUEFSVF9QVEJdLmZsYWcgPSBhbWJhcmVsbGFfZmxwYXJ0X2ZsYWc7CisJCS8vcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUFRCXS5tZW1fYWRkciA9IGFtYmFyZWxsYV9mbHBhcnRfbWVtX2FkZHI7CisJCS8vcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUFRCXS52ZXJfbnVtID0gYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uOworCQkvL3B0Yl90YWJsZS0+cGFydFtQQVJUX1BUQl0udmVyX2RhdGUgPSBhbWJhcmVsbGFfZmxwYXJ0X2RhdGU7CisJLy99CisJaWYgKGFtYmFyZWxsYV9ibGQpIHsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQkxEXS5pbWdfbGVuID0gaW1hZ2VfbGVuZ3RoOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9CTERdLmNyYzMyID0gaW1hZ2VfY3JjOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9CTERdLmZsYWcgPSBhbWJhcmVsbGFfZmxwYXJ0X2ZsYWc7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0JMRF0ubWVtX2FkZHIgPSBhbWJhcmVsbGFfZmxwYXJ0X21lbV9hZGRyOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9CTERdLnZlcl9udW0gPSBhbWJhcmVsbGFfZmxwYXJ0X3ZlcnNpb247CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0JMRF0udmVyX2RhdGUgPSBhbWJhcmVsbGFfZmxwYXJ0X2RhdGU7CisJfQorCWlmIChhbWJhcmVsbGFfaGFsKSB7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0hBTF0uaW1nX2xlbiA9IGltYWdlX2xlbmd0aDsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfSEFMXS5jcmMzMiA9IGltYWdlX2NyYzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfSEFMXS5mbGFnID0gYW1iYXJlbGxhX2ZscGFydF9mbGFnOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9IQUxdLm1lbV9hZGRyID0gYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkcjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfSEFMXS52ZXJfbnVtID0gYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9IQUxdLnZlcl9kYXRlID0gYW1iYXJlbGxhX2ZscGFydF9kYXRlOworCX0KKwlpZiAoYW1iYXJlbGxhX3BiYSkgeworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9QQkFdLmltZ19sZW4gPSBpbWFnZV9sZW5ndGg7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1BCQV0uY3JjMzIgPSBpbWFnZV9jcmM7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1BCQV0uZmxhZyA9IGFtYmFyZWxsYV9mbHBhcnRfZmxhZzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUEJBXS5tZW1fYWRkciA9IGFtYmFyZWxsYV9mbHBhcnRfbWVtX2FkZHI7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1BCQV0udmVyX251bSA9IGFtYmFyZWxsYV9mbHBhcnRfdmVyc2lvbjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfUEJBXS52ZXJfZGF0ZSA9IGFtYmFyZWxsYV9mbHBhcnRfZGF0ZTsKKwl9CisJaWYgKGFtYmFyZWxsYV9zZWMpIHsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfU0VDXS5pbWdfbGVuID0gaW1hZ2VfbGVuZ3RoOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9TRUNdLmNyYzMyID0gaW1hZ2VfY3JjOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9TRUNdLmZsYWcgPSBhbWJhcmVsbGFfZmxwYXJ0X2ZsYWc7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1NFQ10ubWVtX2FkZHIgPSBhbWJhcmVsbGFfZmxwYXJ0X21lbV9hZGRyOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9TRUNdLnZlcl9udW0gPSBhbWJhcmVsbGFfZmxwYXJ0X3ZlcnNpb247CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1NFQ10udmVyX2RhdGUgPSBhbWJhcmVsbGFfZmxwYXJ0X2RhdGU7CisJfQorCWlmIChhbWJhcmVsbGFfZHNwKSB7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0RTUF0uaW1nX2xlbiA9IGltYWdlX2xlbmd0aDsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfRFNQXS5jcmMzMiA9IGltYWdlX2NyYzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfRFNQXS5mbGFnID0gYW1iYXJlbGxhX2ZscGFydF9mbGFnOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9EU1BdLm1lbV9hZGRyID0gYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkcjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfRFNQXS52ZXJfbnVtID0gYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9EU1BdLnZlcl9kYXRlID0gYW1iYXJlbGxhX2ZscGFydF9kYXRlOworCX0KKwlpZiAoYW1iYXJlbGxhX2xueCkgeworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9MTlhdLmltZ19sZW4gPSBpbWFnZV9sZW5ndGg7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0xOWF0uY3JjMzIgPSBpbWFnZV9jcmM7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0xOWF0uZmxhZyA9IGFtYmFyZWxsYV9mbHBhcnRfZmxhZzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfTE5YXS5tZW1fYWRkciA9IGFtYmFyZWxsYV9mbHBhcnRfbWVtX2FkZHI7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0xOWF0udmVyX251bSA9IGFtYmFyZWxsYV9mbHBhcnRfdmVyc2lvbjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfTE5YXS52ZXJfZGF0ZSA9IGFtYmFyZWxsYV9mbHBhcnRfZGF0ZTsKKwl9CisJaWYgKGFtYmFyZWxsYV9zd3ApIHsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfU1dQXS5pbWdfbGVuID0gaW1hZ2VfbGVuZ3RoOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9TV1BdLmNyYzMyID0gaW1hZ2VfY3JjOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9TV1BdLmZsYWcgPSBhbWJhcmVsbGFfZmxwYXJ0X2ZsYWc7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1NXUF0ubWVtX2FkZHIgPSBhbWJhcmVsbGFfZmxwYXJ0X21lbV9hZGRyOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9TV1BdLnZlcl9udW0gPSBhbWJhcmVsbGFfZmxwYXJ0X3ZlcnNpb247CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX1NXUF0udmVyX2RhdGUgPSBhbWJhcmVsbGFfZmxwYXJ0X2RhdGU7CisJfQorCWlmIChhbWJhcmVsbGFfYWRkKSB7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0FERF0uaW1nX2xlbiA9IGltYWdlX2xlbmd0aDsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQUREXS5jcmMzMiA9IGltYWdlX2NyYzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQUREXS5mbGFnID0gYW1iYXJlbGxhX2ZscGFydF9mbGFnOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9BRERdLm1lbV9hZGRyID0gYW1iYXJlbGxhX2ZscGFydF9tZW1fYWRkcjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQUREXS52ZXJfbnVtID0gYW1iYXJlbGxhX2ZscGFydF92ZXJzaW9uOworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9BRERdLnZlcl9kYXRlID0gYW1iYXJlbGxhX2ZscGFydF9kYXRlOworCX0KKwlpZiAoYW1iYXJlbGxhX2FkYykgeworCQlwdGJfdGFibGUtPnBhcnRbUEFSVF9BRENdLmltZ19sZW4gPSBpbWFnZV9sZW5ndGg7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0FEQ10uY3JjMzIgPSBpbWFnZV9jcmM7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0FEQ10uZmxhZyA9IGFtYmFyZWxsYV9mbHBhcnRfZmxhZzsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQURDXS5tZW1fYWRkciA9IGFtYmFyZWxsYV9mbHBhcnRfbWVtX2FkZHI7CisJCXB0Yl90YWJsZS0+cGFydFtQQVJUX0FEQ10udmVyX251bSA9IGFtYmFyZWxsYV9mbHBhcnRfdmVyc2lvbjsKKwkJcHRiX3RhYmxlLT5wYXJ0W1BBUlRfQURDXS52ZXJfZGF0ZSA9IGFtYmFyZWxsYV9mbHBhcnRfZGF0ZTsKKwl9CisKKwlpZiAoYW1iYXJlbGxhX2ZvcmNlX3B0YikgeworCQlwdGJfdGFibGUtPmRldi5yc3ZbMF0gPSBhbWJhcmVsbGFfcHRiX2RhdGE7CisJfQorCisJaWYgKGFtYmFyZWxsYV9jbWQpIHsKKwkJc3RybmNweShwdGJfdGFibGUtPmRldi5jbWRsaW5lLCBhbWJhcmVsbGFfY21kbGluZSwgQ01EX0xJTkVfU0laRSk7CisJfQorCisKKwlpZiAoYW1iYXJlbGxhX3NuKSB7CisJCXN0cm5jcHkocHRiX3RhYmxlLT5kZXYuc24sIGFtYmFyZWxsYV9zbl9kYXRhLCBTTl9TSVpFKTsKKwl9CisKKworCWlmIChhbWJhcmVsbGFfYXV0b19kbCkgeworCQlwdGJfdGFibGUtPmRldi5hdXRvX2RsID0gYW1iYXJlbGxhX2F1dG9fZGxfZGF0YTsKKwl9CisKKwlpZiAoYW1iYXJlbGxhX2F1dG9fYm9vdCkgeworCQlwdGJfdGFibGUtPmRldi5hdXRvX2Jvb3QgPSBhbWJhcmVsbGFfYXV0b19ib290X2RhdGE7CisJfQorCisJaWYgKGFtYmFyZWxsYV9ldGgpIHsKKwkJbWVtY3B5KHB0Yl90YWJsZS0+ZGV2LmV0aFswXS5tYWMsIGFtYmFyZWxsYV9ldGhfbWFjLCBNQUNfU0laRSk7CisJfQorCWlmIChhbWJhcmVsbGFfbGFuX2lwKSB7CisJCXB0Yl90YWJsZS0+ZGV2LmV0aFswXS5pcCA9IGFtYmFyZWxsYV9sYW5faXBfZGF0YTsKKwl9CisJaWYgKGFtYmFyZWxsYV9sYW5fbWFzaykgeworCQlwdGJfdGFibGUtPmRldi5ldGhbMF0ubWFzayA9IGFtYmFyZWxsYV9sYW5fbWFza19kYXRhOworCX0KKwlpZiAoYW1iYXJlbGxhX2xhbl9ndykgeworCQlwdGJfdGFibGUtPmRldi5ldGhbMF0uZ3cgPSBhbWJhcmVsbGFfbGFuX2d3X2RhdGE7CisJfQorCWlmIChhbWJhcmVsbGFfdGZ0cGQpIHsKKwkJcHRiX3RhYmxlLT5kZXYudGZ0cGQgPSBhbWJhcmVsbGFfdGZ0cGRfZGF0YTsKKwl9CisKKwlpZiAoYW1iYXJlbGxhX2V0aDEpIHsKKwkJbWVtY3B5KHB0Yl90YWJsZS0+ZGV2LmV0aFsxXS5tYWMsIGFtYmFyZWxsYV9ldGgxX21hYywgTUFDX1NJWkUpOworCX0KKwlpZiAoYW1iYXJlbGxhX2V0aDFfaXApIHsKKwkJcHRiX3RhYmxlLT5kZXYuZXRoWzFdLmlwID0gYW1iYXJlbGxhX2V0aDFfaXBfZGF0YTsKKwl9CisJaWYgKGFtYmFyZWxsYV9ldGgxX21hc2spIHsKKwkJcHRiX3RhYmxlLT5kZXYuZXRoWzFdLm1hc2sgPSBhbWJhcmVsbGFfZXRoMV9tYXNrX2RhdGE7CisJfQorCWlmIChhbWJhcmVsbGFfZXRoMV9ndykgeworCQlwdGJfdGFibGUtPmRldi5ldGhbMV0uZ3cgPSBhbWJhcmVsbGFfZXRoMV9nd19kYXRhOworCX0KKworCWlmIChhbWJhcmVsbGFfd2lmaTApIHsKKwkJbWVtY3B5KHB0Yl90YWJsZS0+ZGV2LndpZmlbMF0ubWFjLCBhbWJhcmVsbGFfd2lmaTBfbWFjLCBNQUNfU0laRSk7CisJfQorCWlmIChhbWJhcmVsbGFfd2lmaTBfaXApIHsKKwkJcHRiX3RhYmxlLT5kZXYud2lmaVswXS5pcCA9IGFtYmFyZWxsYV93aWZpMF9pcF9kYXRhOworCX0KKwlpZiAoYW1iYXJlbGxhX3dpZmkwX21hc2spIHsKKwkJcHRiX3RhYmxlLT5kZXYud2lmaVswXS5tYXNrID0gYW1iYXJlbGxhX3dpZmkwX21hc2tfZGF0YTsKKwl9CisJaWYgKGFtYmFyZWxsYV93aWZpMF9ndykgeworCQlwdGJfdGFibGUtPmRldi53aWZpWzBdLmd3ID0gYW1iYXJlbGxhX3dpZmkwX2d3X2RhdGE7CisJfQorI2lmIChVU0VfV0lGSSA+PSAyKQorCWlmIChhbWJhcmVsbGFfd2lmaTEpIHsKKwkJbWVtY3B5KHB0Yl90YWJsZS0+ZGV2LndpZmlbMV0ubWFjLCBhbWJhcmVsbGFfd2lmaTFfbWFjLCBNQUNfU0laRSk7CisJfQorCWlmIChhbWJhcmVsbGFfd2lmaTFfaXApIHsKKwkJcHRiX3RhYmxlLT5kZXYud2lmaVsxXS5pcCA9IGFtYmFyZWxsYV93aWZpMV9pcF9kYXRhOworCX0KKwlpZiAoYW1iYXJlbGxhX3dpZmkxX21hc2spIHsKKwkJcHRiX3RhYmxlLT5kZXYud2lmaVsxXS5tYXNrID0gYW1iYXJlbGxhX3dpZmkxX21hc2tfZGF0YTsKKwl9CisJaWYgKGFtYmFyZWxsYV93aWZpMV9ndykgeworCQlwdGJfdGFibGUtPmRldi53aWZpWzFdLmd3ID0gYW1iYXJlbGxhX3dpZmkxX2d3X2RhdGE7CisJfQorI2VuZGlmCisJaWYgKGFtYmFyZWxsYV9wcmlfYWRkcikgeworCQlwdGJfdGFibGUtPmRldi5wcmlfYWRkciA9IGFtYmFyZWxsYV9wcmlfYWRkcl9kYXRhOworCX0KKworCWlmIChhbWJhcmVsbGFfcHJpX2ZpbGUpIHsKKwkJc3RybmNweShwdGJfdGFibGUtPmRldi5wcmlfZmlsZSwgYW1iYXJlbGxhX3ByaV9maWxlX2RhdGEsIFNOX1NJWkUpOworCX0KKworCWlmIChhbWJhcmVsbGFfYmxkIHx8YW1iYXJlbGxhX2ZvcmNlX3B0Ynx8IGFtYmFyZWxsYV9oYWwgfHwKKwkJYW1iYXJlbGxhX3BiYSB8fCBhbWJhcmVsbGFfc2VjIHx8IGFtYmFyZWxsYV9kc3AgfHwKKwkJYW1iYXJlbGxhX2xueCB8fCBhbWJhcmVsbGFfc3dwIHx8IGFtYmFyZWxsYV9hZGQgfHwKKwkJYW1iYXJlbGxhX2FkYyB8fCBhbWJhcmVsbGFfcHJpIHx8IGFtYmFyZWxsYV9ybWQgfHwKKwkJYW1iYXJlbGxhX3JvbSB8fCBhbWJhcmVsbGFfY21kIHx8IGFtYmFyZWxsYV9ldGggfHwKKwkJYW1iYXJlbGxhX3NuIHx8IGFtYmFyZWxsYV9iYWsgfHxhbWJhcmVsbGFfYXV0b19kbHx8CisJCWFtYmFyZWxsYV9hdXRvX2Jvb3QgfHwgYW1iYXJlbGxhX2xhbl9pcCB8fCBhbWJhcmVsbGFfbGFuX21hc2sgfHwKKwkJYW1iYXJlbGxhX2xhbl9ndyB8fCBhbWJhcmVsbGFfdGZ0cGQgfHwgYW1iYXJlbGxhX3ByaV9hZGRyIHx8CisJCWFtYmFyZWxsYV9wcmlfZmlsZSB8fAorCQlhbWJhcmVsbGFfZXRoMSB8fCBhbWJhcmVsbGFfZXRoMV9pcCB8fCBhbWJhcmVsbGFfZXRoMV9tYXNrIHx8CisJCWFtYmFyZWxsYV9ldGgxX2d3IHx8CisJCWFtYmFyZWxsYV93aWZpMCB8fCBhbWJhcmVsbGFfd2lmaTBfaXAgfHwgYW1iYXJlbGxhX3dpZmkwX21hc2sgfHwKKwkJYW1iYXJlbGxhX3dpZmkwX2d3CisjaWYgKFVTRV9XSUZJID49IDIpCisJCXx8IGFtYmFyZWxsYV93aWZpMSB8fCBhbWJhcmVsbGFfd2lmaTFfaXAgfHwgYW1iYXJlbGxhX3dpZmkxX21hc2sgfHwKKwkJYW1iYXJlbGxhX3dpZmkxX2d3CisjZW5kaWYKKwkJKSB7CisJCWlmIChmbHByb2dfc2V0X3BhcnRfdGFibGUoJnB0Yl9idWYpIDwgMCkKKwkJCWV4aXQgKDEpOworCX0KKworCXN5bmMoKTsKKwkvKiBSZXR1cm4gaGFwcHkgKi8KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3JhaWRhdXRvcnVuLmMgYi9taXNjdXRpbHMvcmFpZGF1dG9ydW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzJkODkwCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3JhaWRhdXRvcnVuLmMKQEAgLTAsMCArMSwyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmFpZGF1dG9ydW4gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJhaWRhdXRvcnVuX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJERVZJQ0UiCisvL3VzYWdlOiNkZWZpbmUgcmFpZGF1dG9ydW5fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUZWxsIHRoZSBrZXJuZWwgdG8gYXV0b21hdGljYWxseSBzZWFyY2ggYW5kIHN0YXJ0IFJBSUQgYXJyYXlzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSByYWlkYXV0b3J1bl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCByYWlkYXV0b3J1biAvZGV2L21kMCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWRfdS5oPgorCitpbnQgcmFpZGF1dG9ydW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJhaWRhdXRvcnVuX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl4aW9jdGwoeG9wZW4oc2luZ2xlX2FyZ3YoYXJndiksIE9fUkRPTkxZKSwgUkFJRF9BVVRPUlVOLCBOVUxMKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3JlYWRhaGVhZC5jIGIvbWlzY3V0aWxzL3JlYWRhaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmFhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvcmVhZGFoZWFkLmMKQEAgLTAsMCArMSw0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmVhZGFoZWFkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogUHJlbG9hZHMgdGhlIGdpdmVuIGZpbGVzIGluIFJBTSwgdG8gcmVkdWNlIGFjY2VzcyB0aW1lLgorICogRG9lcyB0aGlzIGJ5IGNhbGxpbmcgdGhlIHJlYWRhaGVhZCgyKSBzeXN0ZW0gY2FsbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIE1pY2hhZWwgT3BkZW5hY2tlciA8bWljaGFlbEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcmVhZGFoZWFkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcmVhZGFoZWFkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJlbG9hZCBGSUxFcyB0byBSQU0iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgcmVhZGFoZWFkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZWFkYWhlYWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXdoaWxlICgqKythcmd2KSB7CisJCWludCBmZCA9IG9wZW5fb3Jfd2FybigqYXJndiwgT19SRE9OTFkpOworCQlpZiAoZmQgPj0gMCkgeworCQkJb2ZmX3QgbGVuOworCQkJaW50IHI7CisKKwkJCS8qIGZkbGVuZ3RoIHdhcyByZXBvcnRlZCB0byBiZSB1bnJlbGlhYmxlIC0gdXNlIHNlZWsgKi8KKwkJCWxlbiA9IHhsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCQkJeGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisJCQlyID0gcmVhZGFoZWFkKGZkLCAwLCBsZW4pOworCQkJY2xvc2UoZmQpOworCQkJaWYgKHIgPj0gMCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9yZmtpbGwuYyBiL21pc2N1dGlscy9yZmtpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjcxOTczCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3Jma2lsbC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisqIHJma2lsbCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorKgorKiBDb3B5cmlnaHQgKEMpIDIwMTAgIE1hbGVrIERlZ2FjaGkgPG1hbGVrLWRlZ2FjaGlAbGFwb3N0ZS5uZXQ+CisqCisqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvL3VzYWdlOiNkZWZpbmUgcmZraWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJDT01NQU5EIFtJTkRFWHxUWVBFXSIKKy8vdXNhZ2U6I2RlZmluZSByZmtpbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFbmFibGUvZGlzYWJsZSB3aXJlbGVzcyBkZXZpY2VzXG4iCisvL3VzYWdlOiAgICAgICAiXG5Db21tYW5kczoiCisvL3VzYWdlOiAgICAgIlxuCWxpc3QgW0lOREVYfFRZUEVdCUxpc3QgY3VycmVudCBzdGF0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JYmxvY2sgSU5ERVh8VFlQRQlEaXNhYmxlIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JdW5ibG9jayBJTkRFWHxUWVBFCUVuYWJsZSBkZXZpY2UiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbglUWVBFOiBhbGwsIHdsYW4od2lmaSksIGJsdWV0b290aCwgdXdiKHVsdHJhd2lkZWJhbmQpLCIKKy8vdXNhZ2U6ICAgICAiXG4JCXdpbWF4LCB3d2FuLCBncHMsIGZtIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKworZW51bSB7CisJT1BUX2IgPSAoMSA8PCAwKSwgLyogbXVzdCBiZSA9IDEgKi8KKwlPUFRfdSA9ICgxIDw8IDEpLAorCU9QVF9sID0gKDEgPDwgMiksCit9OworCitpbnQgcmZraWxsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZmtpbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCByZmtpbGxfZXZlbnQgZXZlbnQ7CisJY29uc3QgY2hhciAqcmZfbmFtZTsKKwlpbnQgcmZfZmQ7CisJaW50IG1vZGU7CisJaW50IHJmX3R5cGU7CisJaW50IHJmX2lkeDsKKwl1bnNpZ25lZCByZl9vcHQgPSAwOworCisJYXJndisrOworCS8qIE11c3QgaGF2ZSBvbmUgb3IgdHdvIHBhcmFtcyAqLworCWlmICghYXJndlswXSB8fCAoYXJndlsxXSAmJiBhcmd2WzJdKSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJbW9kZSA9IE9fUkRXUiB8IE9fTk9OQkxPQ0s7CisJcmZfbmFtZSA9IGFyZ3ZbMV07CisJaWYgKHN0cmNtcChhcmd2WzBdLCAibGlzdCIpID09IDApIHsKKwkJcmZfb3B0IHw9IE9QVF9sOworCQltb2RlID0gT19SRE9OTFkgfCBPX05PTkJMT0NLOworCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJibG9jayIpID09IDAgJiYgcmZfbmFtZSkgeworCQlyZl9vcHQgfD0gT1BUX2I7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJndlswXSwgInVuYmxvY2siKSA9PSAwICYmIHJmX25hbWUpIHsKKwkJcmZfb3B0IHw9IE9QVF91OworCX0gZWxzZQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlyZl90eXBlID0gUkZLSUxMX1RZUEVfQUxMOworCXJmX2lkeCA9IC0xOworCWlmIChyZl9uYW1lKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIHJma2lsbF90eXBlc1tdIEFMSUdOMSA9ICJhbGxcMHdsYW5cMGJsdWV0b290aFwwdXdiXDB3aW1heFwwd3dhblwwZ3BzXDBmbVwwIjsKKwkJaWYgKHN0cmNtcChyZl9uYW1lLCAid2lmaSIpID09IDApCisJCQlyZl9uYW1lID0gIndsYW4iOworCQlpZiAoc3RyY21wKHJmX25hbWUsICJ1bHRyYXdpZGViYW5kIikgPT0gMCkKKwkJCXJmX25hbWUgPSAidXdiIjsKKwkJcmZfdHlwZSA9IGluZGV4X2luX3N0cmluZ3MocmZraWxsX3R5cGVzLCByZl9uYW1lKTsKKwkJaWYgKHJmX3R5cGUgPCAwKSB7CisJCQlyZl9pZHggPSB4YXRvaV9wb3NpdGl2ZShyZl9uYW1lKTsKKwkJfQorCX0KKworCXJmX2ZkID0gZGV2aWNlX29wZW4oIi9kZXYvcmZraWxsIiwgbW9kZSk7CisJaWYgKHJmX2ZkIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCIvZGV2L3Jma2lsbCIpOworCisJaWYgKHJmX29wdCAmIE9QVF9sKSB7CisJCXdoaWxlIChmdWxsX3JlYWQocmZfZmQsICZldmVudCwgc2l6ZW9mKGV2ZW50KSkgPT0gUkZLSUxMX0VWRU5UX1NJWkVfVjEpIHsKKwkJCXBhcnNlcl90ICpwYXJzZXI7CisJCQljaGFyICp0b2tlbnNbMl07CisJCQljaGFyIHJmX3N5c2ZzW3NpemVvZigiL3N5cy9jbGFzcy9yZmtpbGwvcmZraWxsJXUvdWV2ZW50IikgKyBzaXplb2YoaW50KSozXTsKKwkJCWNoYXIgKm5hbWUsICp0eXBlOworCisJCQlpZiAocmZfdHlwZSAmJiByZl90eXBlICE9IGV2ZW50LnR5cGUgJiYgcmZfaWR4IDwgMCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAocmZfaWR4ID49IDAgJiYgZXZlbnQuaWR4ICE9IHJmX2lkeCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQluYW1lID0gTlVMTDsKKwkJCXR5cGUgPSBOVUxMOworCQkJc3ByaW50ZihyZl9zeXNmcywgIi9zeXMvY2xhc3MvcmZraWxsL3Jma2lsbCV1L3VldmVudCIsIGV2ZW50LmlkeCk7CisJCQlwYXJzZXIgPSBjb25maWdfb3BlbjIocmZfc3lzZnMsIGZvcGVuX2Zvcl9yZWFkKTsKKwkJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgMiwgMiwgIlxuPSIsIFBBUlNFX05PUk1BTCkpIHsKKwkJCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlJGS0lMTF9OQU1FIikgPT0gMCkgeworCQkJCQluYW1lID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJSRktJTExfVFlQRSIpID09IDApIHsKKwkJCQkJdHlwZSA9IHhzdHJkdXAodG9rZW5zWzFdKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwkJCXByaW50ZigiJXU6ICVzOiAlc1xuIiwgZXZlbnQuaWR4LCBuYW1lLCB0eXBlKTsKKwkJCXByaW50ZigiXHRTb2Z0IGJsb2NrZWQ6ICVzXG4iLCBldmVudC5zb2Z0ID8gInllcyIgOiAibm8iKTsKKwkJCXByaW50ZigiXHRIYXJkIGJsb2NrZWQ6ICVzXG4iLCBldmVudC5oYXJkID8gInllcyIgOiAibm8iKTsKKwkJCWZyZWUobmFtZSk7CisJCQlmcmVlKHR5cGUpOworCQl9CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7CisJCWlmIChyZl90eXBlID49IDApIHsKKwkJCWV2ZW50LnR5cGUgPSByZl90eXBlOworCQkJZXZlbnQub3AgPSBSRktJTExfT1BfQ0hBTkdFX0FMTDsKKwkJfQorCisJCWlmIChyZl9pZHggPj0gMCkgeworCQkJZXZlbnQuaWR4ID0gcmZfaWR4OworCQkJZXZlbnQub3AgPSBSRktJTExfT1BfQ0hBTkdFOworCQl9CisKKwkJLyogTm90ZTogT1BUX2IgPT0gMSAqLworCQlldmVudC5zb2Z0ID0gKHJmX29wdCAmIE9QVF9iKTsKKworCQl4d3JpdGUocmZfZmQsICZldmVudCwgc2l6ZW9mKGV2ZW50KSk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9ydW5sZXZlbC5jIGIvbWlzY3V0aWxzL3J1bmxldmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzOGI3OQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9ydW5sZXZlbC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFByaW50cyBvdXQgdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCBydW5sZXZlbC4KKyAqCisgKiBWZXJzaW9uOiBAKCMpcnVubGV2ZWwgIDEuMjAgIDE2LUFwci0xOTk3ICBNdlMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgc3lzdmluaXQgc3VpdGUsCisgKiBDb3B5cmlnaHQgMTk5MS0xOTk3IE1pcXVlbCB2YW4gU21vb3JlbmJ1cmcuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBpbml0aWFsbHkgYnVzeWJveGlmaWVkIGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICovCisgCisvL3VzYWdlOiNkZWZpbmUgcnVubGV2ZWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBydW5sZXZlbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZpbmQgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN5c3RlbSBydW5sZXZlbFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIklmIG5vIHV0bXAgRklMRSBleGlzdHMgb3IgaWYgbm8gcnVubGV2ZWwgcmVjb3JkIGNhbiBiZSBmb3VuZCxcbiIKKy8vdXNhZ2U6ICAgICAgICJwcmludCBcInVua25vd25cIiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcnVubGV2ZWxfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcnVubGV2ZWwgL3Zhci9ydW4vdXRtcFxuIgorLy91c2FnZTogICAgICAgIk4gMiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBydW5sZXZlbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVubGV2ZWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB1dG1wICp1dDsKKwljaGFyIHByZXY7CisKKwlpZiAoYXJndlsxXSkgdXRtcG5hbWUoYXJndlsxXSk7CisKKwlzZXR1dGVudCgpOworCXdoaWxlICgodXQgPSBnZXR1dGVudCgpKSAhPSBOVUxMKSB7CisJCWlmICh1dC0+dXRfdHlwZSA9PSBSVU5fTFZMKSB7CisJCQlwcmV2ID0gdXQtPnV0X3BpZCAvIDI1NjsKKwkJCWlmIChwcmV2ID09IDApIHByZXYgPSAnTic7CisJCQlwcmludGYoIiVjICVjXG4iLCBwcmV2LCB1dC0+dXRfcGlkICUgMjU2KTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQllbmR1dGVudCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlwdXRzKCJ1bmtub3duIik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWVuZHV0ZW50KCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvcnguYyBiL21pc2N1dGlscy9yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjI1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvcnguYwpAQCAtMCwwICsxLDI3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0OiAgICAgQ29weXJpZ2h0IChDKSAyMDAxLCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICogQXV0aG9yOiAgICAgICAgQ2hyaXN0b3BoZXIgSG9vdmVyIDxjaEBocGwuaHAuY29tPgorICogRGVzY3JpcHRpb246ICAgeG1vZGVtIGZ1bmN0aW9uYWxpdHkgZm9yIHVwbG9hZGluZyBvZiBrZXJuZWxzCisgKiAgICAgICAgICAgICAgICBhbmQgdGhlIGxpa2UKKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBEZWMgMjAgMDE6NTg6MDggUFNUIDIwMDEKKyAqCisgKiB4bW9kZW0gZnVuY3Rpb25hbGl0eSBmb3IgdXBsb2FkaW5nIG9mIGtlcm5lbHMgYW5kIHRoZSBsaWtlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEhld2xldHQtUGFja2FyZCBMYWJvcmF0b3JpZXMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgYmxvYiBhbmQgdGhlbiBhZGFwdGVkIGZvciBidXN5Ym94LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByeF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRSIKKy8vdXNhZ2U6I2RlZmluZSByeF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlY2VpdmUgYSBmaWxlIHVzaW5nIHRoZSB4bW9kZW0gcHJvdG9jb2wiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJ4X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJ4IC90bXAvZm9vXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFNPSCAweDAxCisjZGVmaW5lIFNUWCAweDAyCisjZGVmaW5lIEVPVCAweDA0CisjZGVmaW5lIEFDSyAweDA2CisjZGVmaW5lIE5BSyAweDE1CisjZGVmaW5lIEJTICAweDA4CisjZGVmaW5lIFBBRCAweDFBCisKKy8qCitDZjoKKyAgaHR0cDovL3d3dy50ZXh0ZmlsZXMuY29tL2FwcGxlL3htb2RlbQorICBodHRwOi8vd3d3LnBoeXMud2FzaGluZ3Rvbi5lZHUvfmJlbG9uaXMveG1vZGVtL2RvY3htb2RlbS50eHQKKyAgaHR0cDovL3d3dy5waHlzLndhc2hpbmd0b24uZWR1L35iZWxvbmlzL3htb2RlbS9kb2N5bW9kZW0udHh0CisgIGh0dHA6Ly93d3cucGh5cy53YXNoaW5ndG9uLmVkdS9+YmVsb25pcy94bW9kZW0vbW9kbXByb3QuY29sCisqLworCisjZGVmaW5lIFRJTUVPVVQgMQorI2RlZmluZSBUSU1FT1VUX0xPTkcgMTAKKyNkZWZpbmUgTUFYRVJST1JTIDEwCisKKyNkZWZpbmUgcmVhZF9mZCAgU1RESU5fRklMRU5PCisjZGVmaW5lIHdyaXRlX2ZkIFNURE9VVF9GSUxFTk8KKworc3RhdGljIGludCByZWFkX2J5dGUodW5zaWduZWQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgbjsKKworCWFsYXJtKHRpbWVvdXQpOworCS8qIE5PVCBzYWZlX3JlYWQhIFdlIHdhbnQgQUxSTSB0byBpbnRlcnJ1cHQgdXMgKi8KKwluID0gcmVhZChyZWFkX2ZkLCAmYnVmLCAxKTsKKwlhbGFybSgwKTsKKwlpZiAobiA9PSAxKQorCQlyZXR1cm4gYnVmOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWNlaXZlKC8qaW50IHJlYWRfZmQsICovaW50IGZpbGVfZmQpCit7CisJdW5zaWduZWQgY2hhciBibG9ja0J1ZlsxMDI0XTsKKwl1bnNpZ25lZCBibG9ja0xlbmd0aCA9IDA7CisJdW5zaWduZWQgZXJyb3JzID0gMDsKKwl1bnNpZ25lZCB3YW50QmxvY2tObyA9IDE7CisJdW5zaWduZWQgbGVuZ3RoID0gMDsKKwlpbnQgZG9fY3JjID0gMTsKKwljaGFyIHJlcGx5X2NoYXI7CisJdW5zaWduZWQgdGltZW91dCA9IFRJTUVPVVRfTE9ORzsKKworCS8qIEZsdXNoIHBlbmRpbmcgaW5wdXQgKi8KKwl0Y2ZsdXNoKHJlYWRfZmQsIFRDSUZMVVNIKTsKKworCS8qIEFzayBmb3IgQ1JDOyBpZiB3ZSBnZXQgZXJyb3JzLCB3ZSB3aWxsIGdvIHdpdGggY2hlY2tzdW0gKi8KKwlyZXBseV9jaGFyID0gJ0MnOworCWZ1bGxfd3JpdGUod3JpdGVfZmQsICZyZXBseV9jaGFyLCAxKTsKKworCWZvciAoOzspIHsKKwkJaW50IGJsb2NrQmVnaW47CisJCWludCBibG9ja05vLCBibG9ja05vT25lc0NvbXBsOworCQlpbnQgY2tzdW1fb3JfY3JjOworCQlpbnQgZXhwZWN0ZWQ7CisJCWludCBpLCBqOworCisJCWJsb2NrQmVnaW4gPSByZWFkX2J5dGUodGltZW91dCk7CisJCWlmIChibG9ja0JlZ2luIDwgMCkKKwkJCWdvdG8gdGltZW91dDsKKworCQkvKiBJZiBsYXN0IGJsb2NrLCByZW1vdmUgcGFkZGluZyAqLworCQlpZiAoYmxvY2tCZWdpbiA9PSBFT1QpIHsKKwkJCS8qIERhdGEgYmxvY2tzIGNhbiBiZSBwYWRkZWQgd2l0aCBeWiBjaGFyYWN0ZXJzICovCisJCQkvKiBUaGlzIGNvZGUgdHJpZXMgdG8gZGV0ZWN0IGFuZCByZW1vdmUgdGhlbSAqLworCQkJaWYgKGJsb2NrTGVuZ3RoID49IDMKKwkJCSAmJiBibG9ja0J1ZltibG9ja0xlbmd0aCAtIDFdID09IFBBRAorCQkJICYmIGJsb2NrQnVmW2Jsb2NrTGVuZ3RoIC0gMl0gPT0gUEFECisJCQkgJiYgYmxvY2tCdWZbYmxvY2tMZW5ndGggLSAzXSA9PSBQQUQKKwkJCSkgeworCQkJCXdoaWxlIChibG9ja0xlbmd0aAorCQkJICAgICAgICAgICAmJiBibG9ja0J1ZltibG9ja0xlbmd0aCAtIDFdID09IFBBRAorCQkJCSkgeworCQkJCQlibG9ja0xlbmd0aC0tOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBXcml0ZSBwcmV2aW91c2x5IHJlY2VpdmVkIGJsb2NrICovCisJCWlmIChibG9ja0xlbmd0aCkgeworCQkJZXJybm8gPSAwOworCQkJaWYgKGZ1bGxfd3JpdGUoZmlsZV9mZCwgYmxvY2tCdWYsIGJsb2NrTGVuZ3RoKSAhPSBibG9ja0xlbmd0aCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHdyaXRlIHRvIGZpbGUiKTsKKwkJCQlnb3RvIGZhdGFsOworCQkJfQorCQl9CisKKwkJdGltZW91dCA9IFRJTUVPVVQ7CisJCXJlcGx5X2NoYXIgPSBOQUs7CisKKwkJc3dpdGNoIChibG9ja0JlZ2luKSB7CisJCWNhc2UgU09IOgorCQljYXNlIFNUWDoKKwkJCWJyZWFrOworCQljYXNlIEVPVDoKKwkJCXJlcGx5X2NoYXIgPSBBQ0s7CisJCQlmdWxsX3dyaXRlKHdyaXRlX2ZkLCAmcmVwbHlfY2hhciwgMSk7CisJCQlyZXR1cm4gbGVuZ3RoOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIEJsb2NrIG5vICovCisJCWJsb2NrTm8gPSByZWFkX2J5dGUoVElNRU9VVCk7CisJCWlmIChibG9ja05vIDwgMCkKKwkJCWdvdG8gdGltZW91dDsKKworCQkvKiBCbG9jayBubywgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtICovCisJCWJsb2NrTm9PbmVzQ29tcGwgPSByZWFkX2J5dGUoVElNRU9VVCk7CisJCWlmIChibG9ja05vT25lc0NvbXBsIDwgMCkKKwkJCWdvdG8gdGltZW91dDsKKworCQlpZiAoYmxvY2tObyAhPSAoMjU1IC0gYmxvY2tOb09uZXNDb21wbCkpIHsKKwkJCWJiX2Vycm9yX21zZygiYmFkIGJsb2NrIG9uZXMgY29tcGwiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlibG9ja0xlbmd0aCA9IChibG9ja0JlZ2luID09IFNPSCkgPyAxMjggOiAxMDI0OworCisJCWZvciAoaSA9IDA7IGkgPCBibG9ja0xlbmd0aDsgaSsrKSB7CisJCQlpbnQgY2MgPSByZWFkX2J5dGUoVElNRU9VVCk7CisJCQlpZiAoY2MgPCAwKQorCQkJCWdvdG8gdGltZW91dDsKKwkJCWJsb2NrQnVmW2ldID0gY2M7CisJCX0KKworCQlpZiAoZG9fY3JjKSB7CisJCQlja3N1bV9vcl9jcmMgPSByZWFkX2J5dGUoVElNRU9VVCk7CisJCQlpZiAoY2tzdW1fb3JfY3JjIDwgMCkKKwkJCQlnb3RvIHRpbWVvdXQ7CisJCQlja3N1bV9vcl9jcmMgPSAoY2tzdW1fb3JfY3JjIDw8IDgpIHwgcmVhZF9ieXRlKFRJTUVPVVQpOworCQkJaWYgKGNrc3VtX29yX2NyYyA8IDApCisJCQkJZ290byB0aW1lb3V0OworCQl9IGVsc2UgeworCQkJY2tzdW1fb3JfY3JjID0gcmVhZF9ieXRlKFRJTUVPVVQpOworCQkJaWYgKGNrc3VtX29yX2NyYyA8IDApCisJCQkJZ290byB0aW1lb3V0OworCQl9CisKKwkJaWYgKGJsb2NrTm8gPT0gKCh3YW50QmxvY2tObyAtIDEpICYgMHhmZikpIHsKKwkJCS8qIGEgcmVwZWF0IG9mIHRoZSBsYXN0IGJsb2NrIGlzIG9rLCBqdXN0IGlnbm9yZSBpdC4gKi8KKwkJCS8qIHRoaXMgYWxzbyBpZ25vcmVzIHRoZSBpbml0aWFsIGJsb2NrIDAgd2hpY2ggaXMgKi8KKwkJCS8qIG1ldGEgZGF0YS4gKi8KKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlpZiAoYmxvY2tObyAhPSAod2FudEJsb2NrTm8gJiAweGZmKSkgeworCQkJYmJfZXJyb3JfbXNnKCJ1bmV4cGVjdGVkIGJsb2NrIG5vLCAweCUwOHgsIGV4cGVjdGluZyAweCUwOHgiLCBibG9ja05vLCB3YW50QmxvY2tObyk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJZXhwZWN0ZWQgPSAwOworCQlpZiAoZG9fY3JjKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgYmxvY2tMZW5ndGg7IGkrKykgeworCQkJCWV4cGVjdGVkID0gZXhwZWN0ZWQgXiBibG9ja0J1ZltpXSA8PCA4OworCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQkJaWYgKGV4cGVjdGVkICYgMHg4MDAwKQorCQkJCQkJZXhwZWN0ZWQgPSAoZXhwZWN0ZWQgPDwgMSkgXiAweDEwMjE7CisJCQkJCWVsc2UKKwkJCQkJCWV4cGVjdGVkID0gKGV4cGVjdGVkIDw8IDEpOworCQkJCX0KKwkJCX0KKwkJCWV4cGVjdGVkICY9IDB4ZmZmZjsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBibG9ja0xlbmd0aDsgaSsrKQorCQkJCWV4cGVjdGVkICs9IGJsb2NrQnVmW2ldOworCQkJZXhwZWN0ZWQgJj0gMHhmZjsKKwkJfQorCQlpZiAoY2tzdW1fb3JfY3JjICE9IGV4cGVjdGVkKSB7CisJCQliYl9lcnJvcl9tc2coZG9fY3JjID8gImNyYyBlcnJvciwgZXhwZWN0ZWQgMHglMDR4LCBnb3QgMHglMDR4IgorCQkJICAgICAgICAgICAgICAgICAgIDogImNoZWNrc3VtIGVycm9yLCBleHBlY3RlZCAweCUwMngsIGdvdCAweCUwMngiLAorCQkJCQlleHBlY3RlZCwgY2tzdW1fb3JfY3JjKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQl3YW50QmxvY2tObysrOworCQlsZW5ndGggKz0gYmxvY2tMZW5ndGg7CisgbmV4dDoKKwkJZXJyb3JzID0gMDsKKwkJcmVwbHlfY2hhciA9IEFDSzsKKwkJZnVsbF93cml0ZSh3cml0ZV9mZCwgJnJlcGx5X2NoYXIsIDEpOworCQljb250aW51ZTsKKyBlcnJvcjoKKyB0aW1lb3V0OgorCQllcnJvcnMrKzsKKwkJaWYgKGVycm9ycyA9PSBNQVhFUlJPUlMpIHsKKwkJCS8qIEFib3J0ICovCisKKwkJCS8qIElmIHdlcmUgYXNraW5nIGZvciBjcmMsIHRyeSBhZ2FpbiB3L28gY3JjICovCisJCQlpZiAocmVwbHlfY2hhciA9PSAnQycpIHsKKwkJCQlyZXBseV9jaGFyID0gTkFLOworCQkJCWVycm9ycyA9IDA7CisJCQkJZG9fY3JjID0gMDsKKwkJCQlnb3RvIHRpbWVvdXQ7CisJCQl9CisJCQliYl9lcnJvcl9tc2coInRvbyBtYW55IGVycm9yczsgZ2l2aW5nIHVwIik7CisgZmF0YWw6CisJCQkvKiA1IENBTiBmb2xsb3dlZCBieSA1IEJTLiBEb24ndCB0cnkgdG9vIGhhcmQuLi4gKi8KKwkJCXNhZmVfd3JpdGUod3JpdGVfZmQsICJcMDMwXDAzMFwwMzBcMDMwXDAzMFwwMTBcMDEwXDAxMFwwMTBcMDEwIiwgMTApOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogRmx1c2ggcGVuZGluZyBpbnB1dCAqLworCQl0Y2ZsdXNoKHJlYWRfZmQsIFRDSUZMVVNIKTsKKworCQlmdWxsX3dyaXRlKHdyaXRlX2ZkLCAmcmVwbHlfY2hhciwgMSk7CisJfSAvKiBmb3IgKDs7KSAqLworfQorCitzdGF0aWMgdm9pZCBzaWdhbHJtX2hhbmRsZXIoaW50IFVOVVNFRF9QQVJBTSBzaWdudW0pCit7Cit9CisKK2ludCByeF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0ZXJtaW9zIHR0eSwgb3JpZ190dHk7CisJaW50IHRlcm1pb3NfZXJyOworCWludCBmaWxlX2ZkOworCWludCBuOworCisJLyogRGlzYWJsZWQgYnkgdmRhOgorCSAqIHdoeSB3ZSBjYW4ndCByZWNlaXZlIGZyb20gc3RkaW4/IFdoeSB3ZSAqcmVxdWlyZSoKKwkgKiBjb250cm9sbGluZyB0dHk/PyAqLworCS8qcmVhZF9mZCA9IHhvcGVuKENVUlJFTlRfVFRZLCBPX1JEV1IpOyovCisJZmlsZV9mZCA9IHhvcGVuKHNpbmdsZV9hcmd2KGFyZ3YpLCBPX1JEV1J8T19DUkVBVHxPX1RSVU5DKTsKKworCXRlcm1pb3NfZXJyID0gdGNnZXRhdHRyKHJlYWRfZmQsICZ0dHkpOworCWlmICh0ZXJtaW9zX2VyciA9PSAwKSB7CisJCW9yaWdfdHR5ID0gdHR5OworCQljZm1ha2VyYXcoJnR0eSk7CisJCXRjc2V0YXR0cihyZWFkX2ZkLCBUQ1NBRkxVU0gsICZ0dHkpOworCX0KKworCS8qIE5vIFNBX1JFU1RBUlQ6IHdlIHdhbnQgQUxSTSB0byBpbnRlcnJ1cHQgcmVhZCgpICovCisJc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdBTFJNLCBzaWdhbHJtX2hhbmRsZXIpOworCisJbiA9IHJlY2VpdmUoZmlsZV9mZCk7CisKKwlpZiAodGVybWlvc19lcnIgPT0gMCkKKwkJdGNzZXRhdHRyKHJlYWRfZmQsIFRDU0FGTFVTSCwgJm9yaWdfdHR5KTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZpbGVfZmQpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQobiA+PSAwKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9zZXRzZXJpYWwuYyBiL21pc2N1dGlscy9zZXRzZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTAzNGUzCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3NldHNlcmlhbC5jCkBAIC0wLDAgKzEsNzYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXRzZXJpYWwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE1hcmVrIEJlxI1rYSA8eXVlbkBrbGFjbm8uc2s+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgU0VUU0VSSUFMCisvL2NvbmZpZzoJYm9vbCAic2V0c2VyaWFsIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJldHJpZXZlIG9yIHNldCBMaW51eCBzZXJpYWwgcG9ydC4KKworLy9hcHBsZXQ6SUZfU0VUU0VSSUFMKEFQUExFVChzZXRzZXJpYWwsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19TRVRTRVJJQUwpICs9IHNldHNlcmlhbC5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZuZGVmIFBPUlRfVU5LTk9XTgorIyBkZWZpbmUgUE9SVF9VTktOT1dOICAgICAgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIFBPUlRfODI1MAorIyBkZWZpbmUgUE9SVF84MjUwICAgICAgICAgICAgICAgMQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY0NTAKKyMgZGVmaW5lIFBPUlRfMTY0NTAgICAgICAgICAgICAgIDIKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NTUwCisjIGRlZmluZSBQT1JUXzE2NTUwICAgICAgICAgICAgICAzCisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjU1MEEKKyMgZGVmaW5lIFBPUlRfMTY1NTBBICAgICAgICAgICAgIDQKKyNlbmRpZgorI2lmbmRlZiBQT1JUX0NJUlJVUworIyBkZWZpbmUgUE9SVF9DSVJSVVMgICAgICAgICAgICAgNQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY2NTAKKyMgZGVmaW5lIFBPUlRfMTY2NTAgICAgICAgICAgICAgIDYKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NjUwVjIKKyMgZGVmaW5lIFBPUlRfMTY2NTBWMiAgICAgICAgICAgIDcKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NzUwCisjIGRlZmluZSBQT1JUXzE2NzUwICAgICAgICAgICAgICA4CisjZW5kaWYKKyNpZm5kZWYgUE9SVF9TVEFSVEVDSAorIyBkZWZpbmUgUE9SVF9TVEFSVEVDSCAgICAgICAgICAgOQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTZDOTUwCisjIGRlZmluZSBQT1JUXzE2Qzk1MCAgICAgICAgICAgIDEwCisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjY1NAorIyBkZWZpbmUgUE9SVF8xNjY1NCAgICAgICAgICAgICAxMQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY4NTAKKyMgZGVmaW5lIFBPUlRfMTY4NTAgICAgICAgICAgICAgMTIKKyNlbmRpZgorI2lmbmRlZiBQT1JUX1JTQQorIyBkZWZpbmUgUE9SVF9SU0EgICAgICAgICAgICAgICAxMworI2VuZGlmCisjaWZuZGVmIFBPUlRfTlMxNjU1MEEKKyMgZGVmaW5lIFBPUlRfTlMxNjU1MEEgICAgICAgICAgMTQKKyNlbmRpZgorI2lmbmRlZiBQT1JUX1hTQ0FMRQorIyBkZWZpbmUgUE9SVF9YU0NBTEUgICAgICAgICAgICAxNQorI2VuZGlmCisjaWZuZGVmIFBPUlRfUk05MDAwCisjIGRlZmluZSBQT1JUX1JNOTAwMCAgICAgICAgICAgIDE2CisjZW5kaWYKKyNpZm5kZWYgUE9SVF9PQ1RFT04KKyMgZGVmaW5lIFBPUlRfT0NURU9OICAgICAgICAgICAgMTcKKyNlbmRpZgorI2lmbmRlZiBQT1JUX0FSNworIyBkZWZpbmUgUE9SVF9BUjcgICAgICAgICAgICAgICAxOAorI2VuZGlmCisjaWZuZGVmIFBPUlRfVTZfMTY1NTBBCisjIGRlZmluZSBQT1JUX1U2XzE2NTUwQSAgICAgICAgIDE5CisjZW5kaWYKKworI2lmbmRlZiBBU1lOQ0JfSFVQX05PVElGWQorIyBkZWZpbmUgQVNZTkNCX0hVUF9OT1RJRlkgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9GT1VSUE9SVAorIyBkZWZpbmUgQVNZTkNCX0ZPVVJQT1JUICAgICAgICAgMQorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TQUsKKyMgZGVmaW5lIEFTWU5DQl9TQUsgICAgICAgICAgICAgIDIKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU1BMSVRfVEVSTUlPUworIyBkZWZpbmUgQVNZTkNCX1NQTElUX1RFUk1JT1MgICAgMworI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TUERfSEkKKyMgZGVmaW5lIEFTWU5DQl9TUERfSEkgICAgICAgICAgIDQKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU1BEX1ZISQorIyBkZWZpbmUgQVNZTkNCX1NQRF9WSEkgICAgICAgICAgNQorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TS0lQX1RFU1QKKyMgZGVmaW5lIEFTWU5DQl9TS0lQX1RFU1QgICAgICAgIDYKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfQVVUT19JUlEKKyMgZGVmaW5lIEFTWU5DQl9BVVRPX0lSUSAgICAgICAgIDcKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUCisjIGRlZmluZSBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUICA4CisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1BHUlBfTE9DS09VVAorIyBkZWZpbmUgQVNZTkNCX1BHUlBfTE9DS09VVCAgICAgOQorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9DQUxMT1VUX05PSFVQCisjIGRlZmluZSBBU1lOQ0JfQ0FMTE9VVF9OT0hVUCAgIDEwCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1NQRF9TSEkKKyMgZGVmaW5lIEFTWU5DQl9TUERfU0hJICAgICAgICAgMTIKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfTE9XX0xBVEVOQ1kKKyMgZGVmaW5lIEFTWU5DQl9MT1dfTEFURU5DWSAgICAgMTMKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfQlVHR1lfVUFSVAorIyBkZWZpbmUgQVNZTkNCX0JVR0dZX1VBUlQgICAgICAxNAorI2VuZGlmCisKKyNpZm5kZWYgQVNZTkNfSFVQX05PVElGWQorIyBkZWZpbmUgQVNZTkNfSFVQX05PVElGWSAgICAgICAoMVUgPDwgQVNZTkNCX0hVUF9OT1RJRlkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfRk9VUlBPUlQKKyMgZGVmaW5lIEFTWU5DX0ZPVVJQT1JUICAgICAgICAgKDFVIDw8IEFTWU5DQl9GT1VSUE9SVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TQUsKKyMgZGVmaW5lIEFTWU5DX1NBSyAgICAgICAgICAgICAgKDFVIDw8IEFTWU5DQl9TQUspCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BMSVRfVEVSTUlPUworIyBkZWZpbmUgQVNZTkNfU1BMSVRfVEVSTUlPUyAgICAoMVUgPDwgQVNZTkNCX1NQTElUX1RFUk1JT1MpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX0hJCisjIGRlZmluZSBBU1lOQ19TUERfSEkgICAgICAgICAgICgxVSA8PCBBU1lOQ0JfU1BEX0hJKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NQRF9WSEkKKyMgZGVmaW5lIEFTWU5DX1NQRF9WSEkgICAgICAgICAgKDFVIDw8IEFTWU5DQl9TUERfVkhJKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NLSVBfVEVTVAorIyBkZWZpbmUgQVNZTkNfU0tJUF9URVNUICAgICAgICAoMVUgPDwgQVNZTkNCX1NLSVBfVEVTVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19BVVRPX0lSUQorIyBkZWZpbmUgQVNZTkNfQVVUT19JUlEgICAgICAgICAoMVUgPDwgQVNZTkNCX0FVVE9fSVJRKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NFU1NJT05fTE9DS09VVAorIyBkZWZpbmUgQVNZTkNfU0VTU0lPTl9MT0NLT1VUICAoMVUgPDwgQVNZTkNCX1NFU1NJT05fTE9DS09VVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19QR1JQX0xPQ0tPVVQKKyMgZGVmaW5lIEFTWU5DX1BHUlBfTE9DS09VVCAgICAgKDFVIDw8IEFTWU5DQl9QR1JQX0xPQ0tPVVQpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfQ0FMTE9VVF9OT0hVUAorIyBkZWZpbmUgQVNZTkNfQ0FMTE9VVF9OT0hVUCAgICAoMVUgPDwgQVNZTkNCX0NBTExPVVRfTk9IVVApCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX1NISQorIyBkZWZpbmUgQVNZTkNfU1BEX1NISSAgICAgICAgICAoMVUgPDwgQVNZTkNCX1NQRF9TSEkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfTE9XX0xBVEVOQ1kKKyMgZGVmaW5lIEFTWU5DX0xPV19MQVRFTkNZICAgICAgKDFVIDw8IEFTWU5DQl9MT1dfTEFURU5DWSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19CVUdHWV9VQVJUCisjIGRlZmluZSBBU1lOQ19CVUdHWV9VQVJUICAgICAgICgxVSA8PCBBU1lOQ0JfQlVHR1lfVUFSVCkKKyNlbmRpZgorCisjaWZuZGVmIEFTWU5DX1NQRF9DVVNUCisjIGRlZmluZSBBU1lOQ19TUERfQ1VTVCAgICAgICAgIChBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1ZISSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TUERfV0FSUAorIyBkZWZpbmUgQVNZTkNfU1BEX1dBUlAgICAgICAgICAoQVNZTkNfU1BEX0hJfEFTWU5DX1NQRF9TSEkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX01BU0sKKyMgZGVmaW5lIEFTWU5DX1NQRF9NQVNLICAgICAgICAgKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJfEFTWU5DX1NQRF9TSEkpCisjZW5kaWYKKworI2lmbmRlZiBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GCisjIGRlZmluZSBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GICAgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FCisjIGRlZmluZSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSAgICAgICAgNjU1MzUKKyNlbmRpZgorCisjaWZuZGVmIF9MSU5VWF9TRVJJQUxfSAorc3RydWN0IHNlcmlhbF9zdHJ1Y3QgeworCWludAl0eXBlOworCWludAlsaW5lOworCXVuc2lnbmVkIGludAlwb3J0OworCWludAlpcnE7CisJaW50CWZsYWdzOworCWludAl4bWl0X2ZpZm9fc2l6ZTsKKwlpbnQJY3VzdG9tX2Rpdmlzb3I7CisJaW50CWJhdWRfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAljbG9zZV9kZWxheTsKKwljaGFyCWlvX3R5cGU7CisJY2hhcglyZXNlcnZlZF9jaGFyWzFdOworCWludAlodWI2OworCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDsgLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0MjsgLyogbm8gbG9uZ2VyIHVzZWQuLi4gKi8KKwl1bnNpZ25lZCBjaGFyCSppb21lbV9iYXNlOworCXVuc2lnbmVkIHNob3J0CWlvbWVtX3JlZ19zaGlmdDsKKwl1bnNpZ25lZCBpbnQJcG9ydF9oaWdoOworCXVuc2lnbmVkIGxvbmcJaW9tYXBfYmFzZTsJLyogY29va2llIHBhc3NlZCBpbnRvIGlvcmVtYXAgKi8KK307CisjZW5kaWYKKworLy91c2FnZTojZGVmaW5lIHNldHNlcmlhbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1nYWJHdnpWXSBERVZJQ0UgW1BBUkFNRVRFUiBbQVJHXV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2V0c2VyaWFsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiUmVxdWVzdCBvciBzZXQgTGludXggc2VyaWFsIHBvcnQgaW5mb3JtYXRpb25cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJLWcJSW50ZXJwcmV0IHBhcmFtZXRlcnMgYXMgbGlzdCBvZiBkZXZpY2VzIGZvciByZXBvcnRpbmdcbiIKKy8vdXNhZ2U6CSIJLWEJUHJpbnQgYWxsIGF2YWlsYWJsZSBpbmZvcm1hdGlvblxuIgorLy91c2FnZToJIgktYglQcmludCBzdW1tYXJ5IGluZm9ybWF0aW9uXG4iCisvL3VzYWdlOgkiCS1HCVByaW50IGluIGZvcm0gd2hpY2ggY2FuIGJlIGZlZCBiYWNrXG4iCisvL3VzYWdlOgkiCQl0byBzZXRzZXJpYWwgYXMgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnNcbiIKKy8vdXNhZ2U6CSIJLXoJWmVybyBvdXQgc2VyaWFsIGZsYWdzIGJlZm9yZSBzZXR0aW5nXG4iCisvL3VzYWdlOgkiCS12CVZlcmJvc2VcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJQYXJhbWV0ZXJzOiAoKiA9IHRha2VzIGFuIGFyZ3VtZW50LCBeID0gY2FuIGJlIHR1cm5lZCBvZmYgYnkgcHJlY2VkaW5nIF4pXG4iCisvL3VzYWdlOgkiCSpwb3J0LCAqaXJxLCAqZGl2aXNvciwgKnVhcnQsICpiYXVuZF9iYXNlLCAqY2xvc2VfZGVsYXksICpjbG9zaW5nX3dhaXQsXG4iCisvL3VzYWdlOgkiCV5mb3VycG9ydCwgXmF1dG9faXJxLCBec2tpcF90ZXN0LCBec2FrLCBec2Vzc2lvbl9sb2Nrb3V0LCBecGdycF9sb2Nrb3V0LFxuIgorLy91c2FnZToJIgleY2FsbG91dF9ub2h1cCwgXnNwbGl0X3Rlcm1pb3MsIF5odXBfbm90aWZ5LCBebG93X2xhdGVuY3ksIGF1dG9jb25maWcsXG4iCisvL3VzYWdlOgkiCXNwZF9ub3JtYWwsIHNwZF9oaSwgc3BkX3ZoaSwgc3BkX3NoaSwgc3BkX3dhcnAsIHNwZF9jdXN0XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiVUFSVCB0eXBlczpcbiIKKy8vdXNhZ2U6CSIJdW5rbm93biwgODI1MCwgMTY0NTAsIDE2NTUwLCAxNjU1MEEsIENpcnJ1cywgMTY2NTAsIDE2NjUwVjIsIDE2NzUwLFxuIgorLy91c2FnZToJIgkxNjk1MCwgMTY5NTQsIDE2NjU0LCAxNjg1MCwgUlNBLCBOUzE2NTUwQSwgWFNDQUxFLCBSTTkwMDAsIE9DVEVPTiwgQVI3LFxuIgorLy91c2FnZToJIglVNl8xNjU1MEEiCisKKyNkZWZpbmUgT1BUX1BSSU5UX1NVTU1BUlkgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgT1BUX1BSSU5UX0ZFREJBQ0sgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgT1BUX1BSSU5UX0FMTCAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgT1BUX1ZFUkJPU0UgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX1pFUk8gICAgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgT1BUX0dFVCAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKworI2RlZmluZSBPUFRfTU9ERV9NQVNLIFwKKwkoT1BUX1BSSU5UX0FMTCB8IE9QVF9QUklOVF9TVU1NQVJZIHwgT1BUX1BSSU5UX0ZFREJBQ0spCisKK2VudW0gcHJpbnRfbW9kZQoreworCVBSSU5UX05PUk1BTCAgPSAwLAorCVBSSU5UX1NVTU1BUlkgPSAoMSA8PCAwKSwKKwlQUklOVF9GRURCQUNLID0gKDEgPDwgMSksCisJUFJJTlRfQUxMICAgICA9ICgxIDw8IDIpLAorfTsKKworI2RlZmluZSBDVExfU0VUICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDVExfQ09ORklHICAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDVExfR0VUICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBDVExfQ0xPU0UgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBDVExfTk9ESUUgICAgICAgICAgICAgICAoMSA8PCA0KQorCitzdGF0aWMgY29uc3QgY2hhciBzZXJpYWxfdHlwZXNbXSA9CisJInVua25vd25cMCIJCS8qIDAgKi8KKwkiODI1MFwwIgkJLyogMSAqLworCSIxNjQ1MFwwIgkJLyogMiAqLworCSIxNjU1MFwwIgkJLyogMyAqLworCSIxNjU1MEFcMCIJCS8qIDQgKi8KKwkiQ2lycnVzXDAiCQkvKiA1ICovCisJIjE2NjUwXDAiCQkvKiA2ICovCisJIjE2NjUwVjJcMCIJCS8qIDcgKi8KKwkiMTY3NTBcMCIJCS8qIDggKi8KKwkiMTY5NTBcMCIJCS8qIDkgVU5JTVBMRU1FTlRFRDogYWxzbyBrbm93IGFzICIxNjk1MC85NTQiICovCisJIjE2OTU0XDAiCQkvKiAxMCAqLworCSIxNjY1NFwwIgkJLyogMTEgKi8KKwkiMTY4NTBcMCIJCS8qIDEyICovCisJIlJTQVwwIgkJCS8qIDEzICovCisjaWZuZGVmIFNFVFNFUklBTF9CQVNFCisJIk5TMTY1NTBBXDAiCQkvKiAxNCAqLworCSJYU0NBTEVcMCIJCS8qIDE1ICovCisJIlJNOTAwMFwwIgkJLyogMTYgKi8KKwkiT0NURU9OXDAiCQkvKiAxNyAqLworCSJBUjdcMCIJCQkvKiAxOCAqLworCSJVNl8xNjU1MEFcMCIJCS8qIDE5ICovCisjZW5kaWYKKzsKKworI2lmbmRlZiBTRVRTRVJJQUxfQkFTRQorIyBkZWZpbmUgTUFYX1NFUklBTF9UWVBFCTE5CisjZWxzZQorIyBkZWZpbmUgTUFYX1NFUklBTF9UWVBFCTEzCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgY29tbWFuZHNbXSA9CisJInNwZF9ub3JtYWxcMCIKKwkic3BkX2hpXDAiCisJInNwZF92aGlcMCIKKwkic3BkX3NoaVwwIgorCSJzcGRfd2FycFwwIgorCSJzcGRfY3VzdFwwIgorCisJInNha1wwIgorCSJmb3VycG9ydFwwIgorCSJodXBfbm90aWZ5XDAiCisJInNraXBfdGVzdFwwIgorCSJhdXRvX2lycVwwIgorCSJzcGxpdF90ZXJtaW9zXDAiCisJInNlc3Npb25fbG9ja291dFwwIgorCSJwZ3JwX2xvY2tvdXRcMCIKKwkiY2FsbG91dF9ub2h1cFwwIgorCSJsb3dfbGF0ZW5jeVwwIgorCisJInBvcnRcMCIKKwkiaXJxXDAiCisJImRpdmlzb3JcMCIKKwkidWFydFwwIgorCSJiYXVuZF9iYXNlXDAiCisJImNsb3NlX2RlbGF5XDAiCisJImNsb3Npbmdfd2FpdFwwIgorCisJImF1dG9jb25maWdcMCIKKzsKKworZW51bQoreworCUNNRF9TUERfTk9STUFMID0gMCwKKwlDTURfU1BEX0hJLAorCUNNRF9TUERfVkhJLAorCUNNRF9TUERfU0hJLAorCUNNRF9TUERfV0FSUCwKKwlDTURfU1BEX0NVU1QsCisKKwlDTURfRkxBR19TQUssCisJQ01EX0ZMQUdfRk9VUlBPUlQsCisJQ01EX0ZMQUdfTlVQX05PVElGWSwKKwlDTURfRkxBR19TS0lQX1RFU1QsCisJQ01EX0ZMQUdfQVVUT19JUlEsCisJQ01EX0ZMQUdfU1BMSVRfVEVSTUlPUywKKwlDTURfRkxBR19TRVNTSU9OX0xPQ0tPVVQsCisJQ01EX0ZMQUdfUEdSUF9MT0NLT1VULAorCUNNRF9GTEFHX0NBTExPVVRfTk9IVVAsCisJQ01EX0ZMQUdfTE9XX0xBVEVOQ1ksCisKKwlDTURfUE9SVCwKKwlDTURfSVJRLAorCUNNRF9ESVZJU09SLAorCUNNRF9VQVJULAorCUNNRF9CQVNFLAorCUNNRF9ERUxBWSwKKwlDTURfV0FJVCwKKworCUNNRF9BVVRPQ09ORklHLAorCisJQ01EX0ZMQUdfRklSU1QgPSBDTURfRkxBR19TQUssCisJQ01EX0ZMQUdfTEFTVCAgPSBDTURfRkxBR19MT1dfTEFURU5DWSwKK307CisKK3N0YXRpYyBib29sIGNtZF9ub3ByaW50KGludCBjbWQpCit7CisJcmV0dXJuIChjbWQgPj0gQ01EX0ZMQUdfU0tJUF9URVNUICYmIGNtZCA8PSBDTURfRkxBR19DQUxMT1VUX05PSFVQKTsKK30KKworc3RhdGljIGJvb2wgY21kX2lzX2ZsYWcoaW50IGNtZCkKK3sKKwlyZXR1cm4gKGNtZCA+PSBDTURfRkxBR19GSVJTVCAmJiBjbWQgPD0gQ01EX0ZMQUdfTEFTVCk7Cit9CisKK3N0YXRpYyBib29sIGNtZF9uZWVkX2FyZyhpbnQgY21kKQoreworCXJldHVybiAoY21kID49IENNRF9QT1JUICYmIGNtZCA8PSBDTURfV0FJVCk7Cit9CisKKyNkZWZpbmUgQUxMX1NQRCAoIFwKKwlBU1lOQ19TUERfSEkgfCBBU1lOQ19TUERfVkhJIHwgQVNZTkNfU1BEX1NISSB8IFwKKwlBU1lOQ19TUERfV0FSUCB8IEFTWU5DX1NQRF9DVVNUIFwKKwkpCisKKyNkZWZpbmUgQUxMX0ZMQUdTICggXAorCUFTWU5DX1NBSyB8IEFTWU5DX0ZPVVJQT1JUIHwgQVNZTkNfSFVQX05PVElGWSB8IFwKKwlBU1lOQ19TS0lQX1RFU1QgfCBBU1lOQ19BVVRPX0lSUSB8IEFTWU5DX1NQTElUX1RFUk1JT1MgfCBcCisJQVNZTkNfU0VTU0lPTl9MT0NLT1VUIHwgQVNZTkNfUEdSUF9MT0NLT1VUIHwgQVNZTkNfQ0FMTE9VVF9OT0hVUCB8IFwKKwlBU1lOQ19MT1dfTEFURU5DWSBcCisJKQorCisjaWYgKEFMTF9TUEQgfCBBTExfRkxBR1MpID4gMHhmZmZmCisjIGVycm9yICJVbmV4cGVjdGVkIGZsYWdzIHNpemUiCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNldGJpdHNbQ01EX0ZMQUdfTEFTVCArIDFdID0KK3sKKwkwLAorCUFTWU5DX1NQRF9ISSwKKwlBU1lOQ19TUERfVkhJLAorCUFTWU5DX1NQRF9TSEksCisJQVNZTkNfU1BEX1dBUlAsCisJQVNZTkNfU1BEX0NVU1QsCisKKwlBU1lOQ19TQUssCisJQVNZTkNfRk9VUlBPUlQsCisJQVNZTkNfSFVQX05PVElGWSwKKwlBU1lOQ19TS0lQX1RFU1QsCisJQVNZTkNfQVVUT19JUlEsCisJQVNZTkNfU1BMSVRfVEVSTUlPUywKKwlBU1lOQ19TRVNTSU9OX0xPQ0tPVVQsCisJQVNZTkNfUEdSUF9MT0NLT1VULAorCUFTWU5DX0NBTExPVVRfTk9IVVAsCisJQVNZTkNfTE9XX0xBVEVOQ1kKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIFNUUl9JTkZJTklURVtdID0gImluZmluaXRlIjsKK3N0YXRpYyBjb25zdCBjaGFyIFNUUl9OT05FW10gPSAibm9uZSI7CisKK3N0YXRpYyBjb25zdCBjaGFyICp1YXJ0X3R5cGUoaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPiBNQVhfU0VSSUFMX1RZUEUpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKworCXJldHVybiBudGhfc3RyaW5nKHNlcmlhbF90eXBlcywgdHlwZSk7Cit9CisKKy8qIGxpYmJiIGNhbmRpZGF0ZSAqLworc3RhdGljIGludCBpbmRleF9pbl9zdHJpbmdzX2Nhc2VfaW5zZW5zaXRpdmUoY29uc3QgY2hhciAqc3RyaW5ncywgY29uc3QgY2hhciAqa2V5KQoreworCWludCBpZHggPSAwOworCisJd2hpbGUgKCpzdHJpbmdzKSB7CisJCWlmIChzdHJjYXNlY21wKHN0cmluZ3MsIGtleSkgPT0gMCkgeworCQkJcmV0dXJuIGlkeDsKKwkJfQorCQlzdHJpbmdzICs9IHN0cmxlbihzdHJpbmdzKSArIDE7IC8qIHNraXAgTlVMICovCisJCWlkeCsrOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdWFydF9pZChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBpbmRleF9pbl9zdHJpbmdzX2Nhc2VfaW5zZW5zaXRpdmUoc2VyaWFsX3R5cGVzLCBuYW1lKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9zcGQoaW50IGZsYWdzLCBlbnVtIHByaW50X21vZGUgbW9kZSkKK3sKKwlpbnQgaWR4OworCisJc3dpdGNoIChmbGFncyAmIEFTWU5DX1NQRF9NQVNLKSB7CisJY2FzZSBBU1lOQ19TUERfSEk6CisJCWlkeCA9IENNRF9TUERfSEk7CisJCWJyZWFrOworCWNhc2UgQVNZTkNfU1BEX1ZISToKKwkJaWR4ID0gQ01EX1NQRF9WSEk7CisJCWJyZWFrOworCWNhc2UgQVNZTkNfU1BEX1NISToKKwkJaWR4ID0gQ01EX1NQRF9TSEk7CisJCWJyZWFrOworCWNhc2UgQVNZTkNfU1BEX1dBUlA6CisJCWlkeCA9IENNRF9TUERfV0FSUDsKKwkJYnJlYWs7CisJY2FzZSBBU1lOQ19TUERfQ1VTVDoKKwkJaWR4ID0gQ01EX1NQRF9DVVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAobW9kZSA8IFBSSU5UX0ZFREJBQ0spCisJCQlyZXR1cm4gTlVMTDsKKwkJaWR4ID0gQ01EX1NQRF9OT1JNQUw7CisJfQorCisJcmV0dXJuIG50aF9zdHJpbmcoY29tbWFuZHMsIGlkeCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X251bWVyaWMoY29uc3QgY2hhciAqYXJnKQoreworCXJldHVybiBiYl9zdHJ0b2woYXJnLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBnZXRfd2FpdChjb25zdCBjaGFyICphcmcpCit7CisJaWYgKHN0cmNhc2VjbXAoYXJnLCBTVFJfTk9ORSkgPT0gMCkKKwkJcmV0dXJuIEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FOworCisJaWYgKHN0cmNhc2VjbXAoYXJnLCBTVFJfSU5GSU5JVEUpID09IDApCisJCXJldHVybiBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GOworCisJcmV0dXJuIGdldF9udW1lcmljKGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3VhcnQoY29uc3QgY2hhciAqYXJnKQoreworCWludCB1YXJ0ID0gdWFydF9pZChhcmcpOworCisJaWYgKHVhcnQgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBVQVJUIHR5cGU6ICVzIiwgYXJnKTsKKworCXJldHVybiB1YXJ0OworfQorCitzdGF0aWMgaW50IHNlcmlhbF9vcGVuKGNvbnN0IGNoYXIgKmRldiwgYm9vbCBxdWlldCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IGRldmljZV9vcGVuKGRldiwgT19SRFdSIHwgT19OT05CTE9DSyk7CisJaWYgKGZkIDwgMCAmJiAhcXVpZXQpCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGRldik7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBpbnQgc2VyaWFsX2N0bChpbnQgZmQsIGludCBvcHMsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXJpbmZvKQoreworCWludCByZXQgPSAwOworCWNvbnN0IGNoYXIgKmVycjsKKworCWlmIChvcHMgJiBDVExfU0VUKSB7CisJCXJldCA9IGlvY3RsKGZkLCBUSU9DU1NFUklBTCwgc2VyaW5mbyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSAiY2FuJ3Qgc2V0IHNlcmlhbCBpbmZvIjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWlmIChvcHMgJiBDVExfQ09ORklHKSB7CisJCXJldCA9IGlvY3RsKGZkLCBUSU9DU0VSQ09ORklHKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9ICJjYW4ndCBhdXRvY29uZmlndXJlIHBvcnQiOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaWYgKG9wcyAmIENUTF9HRVQpIHsKKwkJcmV0ID0gaW9jdGwoZmQsIFRJT0NHU0VSSUFMLCBzZXJpbmZvKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9ICJjYW4ndCBnZXQgc2VyaWFsIGluZm8iOworCQkJZ290byBmYWlsOworCQl9CisJfQorIG5vZGllOgorCWlmIChvcHMgJiBDVExfQ0xPU0UpCisJCWNsb3NlKGZkKTsKKworCXJldHVybiByZXQ7CisgZmFpbDoKKwliYl9zaW1wbGVfcGVycm9yX21zZyhlcnIpOworCWlmIChvcHMgJiBDVExfTk9ESUUpCisJCWdvdG8gbm9kaWU7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9mbGFnKGNvbnN0IGNoYXIgKipwcmVmaXgsIGNvbnN0IGNoYXIgKmZsYWcpCit7CisJcHJpbnRmKCIlcyVzIiwgKnByZWZpeCwgZmxhZyk7CisJKnByZWZpeCA9ICIgIjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2VyaWFsX2ZsYWdzKGludCBzZXJpYWxfZmxhZ3MsIGVudW0gcHJpbnRfbW9kZSBtb2RlLAorCQkJCWNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqcG9zdGZpeCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpzcGQsICpwcjsKKworCXByID0gcHJlZml4OworCisJc3BkID0gZ2V0X3NwZChzZXJpYWxfZmxhZ3MsIG1vZGUpOworCWlmIChzcGQpCisJCXByaW50X2ZsYWcoJnByLCBzcGQpOworCisJZm9yIChpID0gQ01EX0ZMQUdfRklSU1Q7IGkgPD0gQ01EX0ZMQUdfTEFTVDsgaSsrKSB7CisJCWlmICgoc2VyaWFsX2ZsYWdzICYgc2V0Yml0c1tpXSkKKwkJICYmIChtb2RlID4gUFJJTlRfU1VNTUFSWSB8fCAhY21kX25vcHJpbnQoaSkpCisJCSkgeworCQkJcHJpbnRfZmxhZygmcHIsIG50aF9zdHJpbmcoY29tbWFuZHMsIGkpKTsKKwkJfQorCX0KKworCXB1dHMocHIgPT0gcHJlZml4ID8gIiIgOiBwb3N0Zml4KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfY2xvc2luZ193YWl0KHVuc2lnbmVkIGludCBjbG9zaW5nX3dhaXQpCit7CisJc3dpdGNoIChjbG9zaW5nX3dhaXQpIHsKKwljYXNlIEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FOgorCQlwdXRzKFNUUl9OT05FKTsKKwkJYnJlYWs7CisJY2FzZSBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GOgorCQlwdXRzKFNUUl9JTkZJTklURSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiJXVcbiIsIGNsb3Npbmdfd2FpdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXJpYWxfZ2V0KGNvbnN0IGNoYXIgKmRldmljZSwgZW51bSBwcmludF9tb2RlIG1vZGUpCit7CisJaW50IGZkLCByZXQ7CisJY29uc3QgY2hhciAqdWFydCwgKnByZWZpeCwgKnBvc3RmaXg7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyaW5mbzsKKworCWZkID0gc2VyaWFsX29wZW4oZGV2aWNlLCAvKnF1aWV0OiovIG1vZGUgPT0gUFJJTlRfU1VNTUFSWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCisJcmV0ID0gc2VyaWFsX2N0bChmZCwgQ1RMX0dFVCB8IENUTF9DTE9TRSB8IENUTF9OT0RJRSwgJnNlcmluZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm47CisKKwl1YXJ0ID0gdWFydF90eXBlKHNlcmluZm8udHlwZSk7CisJcHJlZml4ID0gIiwgRmxhZ3M6ICI7CisJcG9zdGZpeCA9ICIiOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBQUklOVF9OT1JNQUw6CisJCXByaW50ZigiJXMsIFVBUlQ6ICVzLCBQb3J0OiAweCUuNHgsIElSUTogJWQiLAorCQkJZGV2aWNlLCB1YXJ0LCBzZXJpbmZvLnBvcnQsIHNlcmluZm8uaXJxKTsKKwkJYnJlYWs7CisJY2FzZSBQUklOVF9TVU1NQVJZOgorCQlpZiAoIXNlcmluZm8udHlwZSkKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIlcyBhdCAweCUuNHggKGlycSA9ICVkKSBpcyBhICVzIiwKKwkJCWRldmljZSwgc2VyaW5mby5wb3J0LCBzZXJpbmZvLmlycSwgdWFydCk7CisJCXByZWZpeCA9ICIgKCI7CisJCXBvc3RmaXggPSAiKSI7CisJCWJyZWFrOworCWNhc2UgUFJJTlRfRkVEQkFDSzoKKwkJcHJpbnRmKCIlcyB1YXJ0ICVzIHBvcnQgMHglLjR4IGlycSAlZCBiYXVkX2Jhc2UgJWQiLCBkZXZpY2UsCisJCQl1YXJ0LCBzZXJpbmZvLnBvcnQsIHNlcmluZm8uaXJxLCBzZXJpbmZvLmJhdWRfYmFzZSk7CisJCXByZWZpeCA9ICIgIjsKKwkJYnJlYWs7CisJY2FzZSBQUklOVF9BTEw6CisJCXByaW50ZigiJXMsIExpbmUgJWQsIFVBUlQ6ICVzLCBQb3J0OiAweCUuNHgsIElSUTogJWRcbiIsCisJCQlkZXZpY2UsIHNlcmluZm8ubGluZSwgdWFydCwgc2VyaW5mby5wb3J0LCBzZXJpbmZvLmlycSk7CisJCXByaW50ZigiXHRCYXVkX2Jhc2U6ICVkLCBjbG9zZV9kZWxheTogJXUsIGRpdmlzb3I6ICVkXG4iLAorCQkJc2VyaW5mby5iYXVkX2Jhc2UsIHNlcmluZm8uY2xvc2VfZGVsYXksCisJCQlzZXJpbmZvLmN1c3RvbV9kaXZpc29yKTsKKwkJcHJpbnRmKCJcdGNsb3Npbmdfd2FpdDogIik7CisJCXByaW50X2Nsb3Npbmdfd2FpdChzZXJpbmZvLmNsb3Npbmdfd2FpdCk7CisJCXByZWZpeCA9ICJcdEZsYWdzOiAiOworCQlwb3N0Zml4ID0gIlxuIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNzZXJ0KDApOworCX0KKworCXByaW50X3NlcmlhbF9mbGFncyhzZXJpbmZvLmZsYWdzLCBtb2RlLCBwcmVmaXgsIHBvc3RmaXgpOworfQorCitzdGF0aWMgaW50IGZpbmRfY21kKGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlpbnQgaWR4OworCisJaWR4ID0gaW5kZXhfaW5fc3RyaW5nc19jYXNlX2luc2Vuc2l0aXZlKGNvbW1hbmRzLCBjbWQpOworCWlmIChpZHggPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBmbGFnOiAlcyIsIGNtZCk7CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgdm9pZCBzZXJpYWxfc2V0KGNoYXIgKiphcmcsIGludCBvcHRzKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNlcmluZm87CisJaW50IGNtZDsKKwljb25zdCBjaGFyICp3b3JkOworCWludCBmZDsKKworCWZkID0gc2VyaWFsX29wZW4oKmFyZysrLCAvKnF1aWV0OiovIGZhbHNlKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDIwMSk7CisKKwlzZXJpYWxfY3RsKGZkLCBDVExfR0VULCAmc2VyaW5mbyk7CisKKwlpZiAob3B0cyAmIE9QVF9aRVJPKQorCQlzZXJpbmZvLmZsYWdzID0gMDsKKworCXdoaWxlICgqYXJnKSB7CisJCWludCBpbnZlcnQ7CisKKwkJd29yZCA9ICphcmcrKzsKKwkJaW52ZXJ0ID0gKCp3b3JkID09ICdeJyk7CisJCXdvcmQgKz0gaW52ZXJ0OworCisJCWNtZCA9IGZpbmRfY21kKHdvcmQpOworCisJCWlmICgqYXJnID09IE5VTEwgJiYgY21kX25lZWRfYXJnKGNtZCkpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCB3b3JkKTsKKworCQlpZiAoaW52ZXJ0ICYmICFjbWRfaXNfZmxhZyhjbWQpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGludmVydCAlcyIsIHdvcmQpOworCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgQ01EX1NQRF9OT1JNQUw6CisJCWNhc2UgQ01EX1NQRF9ISToKKwkJY2FzZSBDTURfU1BEX1ZISToKKwkJY2FzZSBDTURfU1BEX1NISToKKwkJY2FzZSBDTURfU1BEX1dBUlA6CisJCWNhc2UgQ01EX1NQRF9DVVNUOgorCQkJc2VyaW5mby5mbGFncyAmPSB+QVNZTkNfU1BEX01BU0s7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIENNRF9GTEFHX1NBSzoKKwkJY2FzZSBDTURfRkxBR19GT1VSUE9SVDoKKwkJY2FzZSBDTURfRkxBR19OVVBfTk9USUZZOgorCQljYXNlIENNRF9GTEFHX1NLSVBfVEVTVDoKKwkJY2FzZSBDTURfRkxBR19BVVRPX0lSUToKKwkJY2FzZSBDTURfRkxBR19TUExJVF9URVJNSU9TOgorCQljYXNlIENNRF9GTEFHX1NFU1NJT05fTE9DS09VVDoKKwkJY2FzZSBDTURfRkxBR19QR1JQX0xPQ0tPVVQ6CisJCWNhc2UgQ01EX0ZMQUdfQ0FMTE9VVF9OT0hVUDoKKwkJY2FzZSBDTURfRkxBR19MT1dfTEFURU5DWToKKwkJCWlmIChpbnZlcnQpCisJCQkJc2VyaW5mby5mbGFncyAmPSB+c2V0Yml0c1tjbWRdOworCQkJZWxzZQorCQkJCXNlcmluZm8uZmxhZ3MgfD0gc2V0Yml0c1tjbWRdOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX1BPUlQ6CisJCQlzZXJpbmZvLnBvcnQgPSBnZXRfbnVtZXJpYygqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0lSUToKKwkJCXNlcmluZm8uaXJxID0gZ2V0X251bWVyaWMoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9ESVZJU09SOgorCQkJc2VyaW5mby5jdXN0b21fZGl2aXNvciA9IGdldF9udW1lcmljKCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfVUFSVDoKKwkJCXNlcmluZm8udHlwZSA9IGdldF91YXJ0KCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfQkFTRToKKwkJCXNlcmluZm8uYmF1ZF9iYXNlID0gZ2V0X251bWVyaWMoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9ERUxBWToKKwkJCXNlcmluZm8uY2xvc2VfZGVsYXkgPSBnZXRfbnVtZXJpYygqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX1dBSVQ6CisJCQlzZXJpbmZvLmNsb3Npbmdfd2FpdCA9IGdldF93YWl0KCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfQVVUT0NPTkZJRzoKKwkJCXNlcmlhbF9jdGwoZmQsIENUTF9TRVQgfCBDVExfQ09ORklHIHwgQ1RMX0dFVCwgJnNlcmluZm8pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhc3NlcnQoMCk7CisJCX0KKwl9CisKKwlzZXJpYWxfY3RsKGZkLCBDVExfU0VUIHwgQ1RMX0NMT1NFLCAmc2VyaW5mbyk7Cit9CisKK2ludCBzZXRzZXJpYWxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldHNlcmlhbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpiLWFHOkctYWI6YS1iRyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJiR2F2emciKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghYXJndlsxXSkgLyogb25lIGFyZyBvbmx5PyAqLworCQlvcHRzIHw9IE9QVF9HRVQ7CisKKwlpZiAoIShvcHRzICYgT1BUX0dFVCkpIHsKKwkJc2VyaWFsX3NldChhcmd2LCBvcHRzKTsKKwkJYXJndlsxXSA9IE5VTEw7CisJfQorCisJaWYgKG9wdHMgJiAoT1BUX1ZFUkJPU0UgfCBPUFRfR0VUKSkgeworCQlkbyB7CisJCQlzZXJpYWxfZ2V0KCphcmd2KyssIG9wdHMgJiBPUFRfTU9ERV9NQVNLKTsKKwkJfSB3aGlsZSAoKmFyZ3YpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvc2V0c2lkLmMgYi9taXNjdXRpbHMvc2V0c2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyYzhhNAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9zZXRzaWQuYwpAQCAtMCwwICsxLDU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXRzaWQuYyAtLSBleGVjdXRlIGEgY29tbWFuZCBpbiBhIG5ldyBzZXNzaW9uCisgKiBSaWNrIFNsYWRrZXkgPGpyc0B3b3JsZC5zdGQuY29tPgorICogSW4gdGhlIHB1YmxpYyBkb21haW4uCisgKgorICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWlja2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CisgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKgorICogMjAwMS0wMS0xOCBKb2huIEZyZW1saW4gPHZpaUBwZW5ndWlucG93ZXJlZC5jb20+CisgKiAtIGZvcmsgaW4gY2FzZSB3ZSBhcmUgcHJvY2VzcyBncm91cCBsZWFkZXIKKyAqCisgKiAyMDA0LTExLTEyIFBhdWwgRm94CisgKiAtIGJ1c3lib3hlZAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRzaWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBzZXRzaWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBpbiBhIG5ldyBzZXNzaW9uLiBQUk9HIHdpbGwgaGF2ZSBubyBjb250cm9sbGluZyB0ZXJtaW5hbFxuIgorLy91c2FnZTogICAgICAgImFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBrZXlib2FyZCBzaWduYWxzIChDdHJsLUMgZXRjKS5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZWUgc2V0c2lkKDIpIGZvciBkZXRhaWxzLiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRzaWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldHNpZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaWYgKCFhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiBzZXRzaWQoKSBpcyBhbGxvd2VkIG9ubHkgd2hlbiB3ZSBhcmUgbm90IGEgcHJvY2VzcyBncm91cCBsZWFkZXIuCisJICogT3RoZXJ3aXNlIG91ciBQSUQgc2VydmVzIGFzIFBHSUQgb2Ygc29tZSBleGlzdGluZyBwcm9jZXNzIGdyb3VwCisJICogYW5kIGNhbm5vdCBiZSB1c2VkIGFzIFBHSUQgb2YgYSBuZXcgcHJvY2VzcyBncm91cC4gKi8KKwlpZiAoc2V0c2lkKCkgPCAwKSB7CisJCXBpZF90IHBpZCA9IGZvcmtfb3JfcmV4ZWMoYXJndik7CisJCWlmIChwaWQgIT0gMCkgeworCQkJLyogcGFyZW50ICovCisJCQkvKiBUT0RPOgorCQkJICogd2UgY2FuIHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSBhbmQgdGhlbiBldmVuCisJCQkgKiBlbXVsYXRlIGV4aXRjb2RlLCBtYWtpbmcgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnQKKwkJCSAqIGluIGJvdGggZm9ya2VkIGFuZCBub24gZm9ya2VkIGNhc2VzLgorCQkJICogSG93ZXZlciwgdGhlIGNvZGUgaXMgbGFyZ2VyIGFuZCB1cHN0cmVhbQorCQkJICogZG9lcyBub3QgZG8gc3VjaCB0cmljay4KKwkJCSAqLworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisKKwkJLyogY2hpbGQgKi8KKwkJLyogbm93IHRoZXJlIHNob3VsZCBiZSBubyBlcnJvcjogKi8KKwkJc2V0c2lkKCk7CisJfQorCisJYXJndisrOworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvc3RyaW5ncy5jIGIvbWlzY3V0aWxzL3N0cmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjUwMTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3N0cmluZ3MuYwpAQCAtMCwwICsxLDkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzdHJpbmdzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IDIwMDMgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN0cmluZ3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYWZvXSBbLW4gTEVOXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc3RyaW5nc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgcHJpbnRhYmxlIHN0cmluZ3MgaW4gYSBiaW5hcnkgZmlsZVxuIgorLy91c2FnZTogICAgICJcbgktYQlTY2FuIHdob2xlIGZpbGUgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktZglQcmVjZWRlIHN0cmluZ3Mgd2l0aCBmaWxlbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1uIExFTglBdCBsZWFzdCBMRU4gY2hhcmFjdGVycyBmb3JtIGEgc3RyaW5nIChkZWZhdWx0IDQpIgorLy91c2FnZTogICAgICJcbgktbwlQcmVjZWRlIHN0cmluZ3Mgd2l0aCBkZWNpbWFsIG9mZnNldHMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFdIT0xFX0ZJTEUgICAgMQorI2RlZmluZSBQUklOVF9OQU1FICAgIDIKKyNkZWZpbmUgUFJJTlRfT0ZGU0VUICA0CisjZGVmaW5lIFNJWkUgICAgICAgICAgOAorCitpbnQgc3RyaW5nc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3RyaW5nc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG4sIGMsIHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwl1bnNpZ25lZCBjb3VudDsKKwlvZmZfdCBvZmZzZXQ7CisJRklMRSAqZmlsZTsKKwljaGFyICpzdHJpbmc7CisJY29uc3QgY2hhciAqZm10ID0gIiVzOiAiOworCWNvbnN0IGNoYXIgKm5fYXJnID0gIjQiOworCisJZ2V0b3B0MzIoYXJndiwgImFmb246IiwgJm5fYXJnKTsKKwkvKiAtYSBpcyBvdXIgZGVmYXVsdCBiZWhhdmlvdXIgKi8KKwkvKmFyZ2MgLT0gb3B0aW5kOyovCisJYXJndiArPSBvcHRpbmQ7CisKKwluID0geGF0b3VfcmFuZ2Uobl9hcmcsIDEsIElOVF9NQVgpOworCXN0cmluZyA9IHh6YWxsb2MobiArIDEpOworCW4tLTsKKworCWlmICghKmFyZ3YpIHsKKwkJZm10ID0gInslc306ICI7CisJCSotLWFyZ3YgPSAoY2hhciAqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwl9CisKKwlkbyB7CisJCWZpbGUgPSBmb3Blbl9vcl93YXJuX3N0ZGluKCphcmd2KTsKKwkJaWYgKCFmaWxlKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCQlvZmZzZXQgPSAwOworCQljb3VudCA9IDA7CisJCWRvIHsKKwkJCWMgPSBmZ2V0YyhmaWxlKTsKKwkJCWlmIChpc3ByaW50X2FzY2lpb25seShjKSB8fCBjID09ICdcdCcpIHsKKwkJCQlpZiAoY291bnQgPiBuKSB7CisJCQkJCWJiX3B1dGNoYXIoYyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RyaW5nW2NvdW50XSA9IGM7CisJCQkJCWlmIChjb3VudCA9PSBuKSB7CisJCQkJCQlpZiAob3B0aW9uX21hc2szMiAmIFBSSU5UX05BTUUpIHsKKwkJCQkJCQlwcmludGYoZm10LCAqYXJndik7CisJCQkJCQl9CisJCQkJCQlpZiAob3B0aW9uX21hc2szMiAmIFBSSU5UX09GRlNFVCkgeworCQkJCQkJCXByaW50ZigiJTciT0ZGX0ZNVCJvICIsIG9mZnNldCAtIG4pOworCQkJCQkJfQorCQkJCQkJZnB1dHMoc3RyaW5nLCBzdGRvdXQpOworCQkJCQl9CisJCQkJCWNvdW50Kys7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY291bnQgPiBuKSB7CisJCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQkJfQorCQkJCWNvdW50ID0gMDsKKwkJCX0KKwkJCW9mZnNldCsrOworCQl9IHdoaWxlIChjICE9IEVPRik7CisJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZmlsZSk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoc3RyaW5nKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy90YXNrc2V0LmMgYi9taXNjdXRpbHMvdGFza3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOWUzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvdGFza3NldC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0YXNrc2V0IC0gcmV0cmlldmUgb3Igc2V0IGEgcHJvY2Vzc2VzJyBDUFUgYWZmaW5pdHkKKyAqIENvcHlyaWdodCAoYykgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0YXNrc2V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXBdIFtNQVNLXSBbUElEIHwgUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSB0YXNrc2V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2V0IG9yIGdldCBDUFUgYWZmaW5pdHlcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJT3BlcmF0ZSBvbiBhbiBleGlzdGluZyBQSUQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRhc2tzZXRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdGFza3NldCAweDcgLi9kZ2VtbV90ZXN0JlxuIgorLy91c2FnZTogICAgICAgIiQgdGFza3NldCAtcCAweDEgJCFcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgNDc5MCdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzazogN1xuIgorLy91c2FnZTogICAgICAgInBpZCA0NzkwJ3MgbmV3IGFmZmluaXR5IG1hc2s6IDFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRhc2tzZXQgMHg3IC9iaW4vc2ggLWMgJy4vdGFza3NldCAtcCAweDEgJCQnXG4iCisvL3VzYWdlOiAgICAgICAicGlkIDY2NzEncyBjdXJyZW50IGFmZmluaXR5IG1hc2s6IDFcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgNjY3MSdzIG5ldyBhZmZpbml0eSBtYXNrOiAxXG4iCisvL3VzYWdlOiAgICAgICAiJCB0YXNrc2V0IC1wIDFcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgMSdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzazogM1xuIgorCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWQorI2RlZmluZSBUQVNLU0VUX1BSSU5URl9NQVNLICIlcyIKKy8qIGNyYWZ0IGEgc3RyaW5nIGZyb20gdGhlIG1hc2sgKi8KK3N0YXRpYyBjaGFyICpmcm9tX2NwdXNldChjcHVfc2V0X3QgKm1hc2spCit7CisJaW50IGk7CisJY2hhciAqcmV0ID0gTlVMTDsKKwljaGFyICpzdHIgPSB4emFsbG9jKChDUFVfU0VUU0laRSAvIDQpICsgMSk7IC8qIHdlIHdpbGwgbGVhayBpdCAqLworCisJZm9yIChpID0gQ1BVX1NFVFNJWkUgLSA0OyBpID49IDA7IGkgLT0gNCkgeworCQlpbnQgdmFsID0gMDsKKwkJaW50IG9mZjsKKwkJZm9yIChvZmYgPSAwOyBvZmYgPD0gMzsgKytvZmYpCisJCQlpZiAoQ1BVX0lTU0VUKGkgKyBvZmYsIG1hc2spKQorCQkJCXZhbCB8PSAxIDw8IG9mZjsKKwkJaWYgKCFyZXQgJiYgdmFsKQorCQkJcmV0ID0gc3RyOworCQkqc3RyKysgPSBiYl9oZXhkaWdpdHNfdXBjYXNlW3ZhbF0gfCAweDIwOworCX0KKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKKyNkZWZpbmUgVEFTS1NFVF9QUklOVEZfTUFTSyAiJWxseCIKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZnJvbV9jcHVzZXQoY3B1X3NldF90ICptYXNrKQoreworCXN0cnVjdCBCVUdfQ1BVX1NFVFNJWkVfaXNfdG9vX3NtYWxsIHsKKwkJY2hhciBCVUdfQ1BVX1NFVFNJWkVfaXNfdG9vX3NtYWxsWworCQkJQ1BVX1NFVFNJWkUgPCBzaXplb2YoaW50KSA/IC0xIDogMV07CisJfTsKKwljaGFyICpwID0gKHZvaWQqKW1hc2s7CisKKwkvKiBUYWtlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiBDYXJlZnVsIQorCSAqIENvbnNpZGVyIGJvdGggQ1BVX1NFVFNJWkU9NCBhbmQgQ1BVX1NFVFNJWkU9MTAyNCBjYXNlcworCSAqLworI2lmIEJCX0JJR19FTkRJQU4KKwkvKiBGb3IgYmlnIGVuZGlhbiwgaXQgbWVhbnMgTEFTVCBiaXRzICovCisJaWYgKENQVV9TRVRTSVpFIDwgc2l6ZW9mKGxvbmcpKQorCQlwICs9IENQVV9TRVRTSVpFIC0gc2l6ZW9mKGludCk7CisJZWxzZSBpZiAoQ1BVX1NFVFNJWkUgPCBzaXplb2YobG9uZyBsb25nKSkKKwkJcCArPSBDUFVfU0VUU0laRSAtIHNpemVvZihsb25nKTsKKwllbHNlCisJCXAgKz0gQ1BVX1NFVFNJWkUgLSBzaXplb2YobG9uZyBsb25nKTsKKyNlbmRpZgorCWlmIChDUFVfU0VUU0laRSA8IHNpemVvZihsb25nKSkKKwkJcmV0dXJuICoodW5zaWduZWQqKXA7CisJaWYgKENQVV9TRVRTSVpFIDwgc2l6ZW9mKGxvbmcgbG9uZykpCisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcqKXA7CisJcmV0dXJuICoodW5zaWduZWQgbG9uZyBsb25nKilwOworfQorI2VuZGlmCisKKworaW50IHRhc2tzZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRhc2tzZXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNwdV9zZXRfdCBtYXNrOworCXBpZF90IHBpZCA9IDA7CisJdW5zaWduZWQgb3B0X3A7CisJY29uc3QgY2hhciAqY3VycmVudF9uZXc7CisJY2hhciAqcGlkX3N0cjsKKwljaGFyICphZmYgPSBhZmY7IC8qIGZvciBjb21waWxlciAqLworCisJLyogTkI6IHdlIG1pbWljIHV0aWwtbGludXgncyB0YXNrc2V0OiAtcCBkb2VzIG5vdCB0YWtlCisJICogYW4gYXJndW1lbnQsIGkuZS4sICItcE4iIGlzIE5PVCB2YWxpZCwgb25seSAiLXAgTiIhCisJICogSW5kZWVkLCB1dGlsLWxpbnV4LTIuMTMtcHJlNyB1c2VzOgorCSAqIGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICIrcGNoViIsIC4uLiksIG5vdCAiLi4ucDouLi4iICovCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIGF0IGxlYXN0IDEgYXJnICovCisJb3B0X3AgPSBnZXRvcHQzMihhcmd2LCAiK3AiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHRfcCkgeworCQlwaWRfc3RyID0gKmFyZ3YrKzsKKwkJaWYgKCphcmd2KSB7IC8qICItcCA8YWZmPiA8cGlkPiAuLi5yZXN0LmlzLmlnbm9yZWQuLi4iICovCisJCQlhZmYgPSBwaWRfc3RyOworCQkJcGlkX3N0ciA9ICphcmd2OyAvKiBOQjogKmFyZ3YgIT0gTlVMTCBpbiB0aGlzIGNhc2UgKi8KKwkJfQorCQkvKiBlbHNlIGl0IHdhcyBqdXN0ICItcCA8cGlkPiIsIGFuZCAqYXJndiA9PSBOVUxMICovCisJCXBpZCA9IHhhdG91bF9yYW5nZShwaWRfc3RyLCAxLCAoKHVuc2lnbmVkKShwaWRfdClVTE9OR19NQVgpID4+IDEpOworCX0gZWxzZSB7CisJCWFmZiA9ICphcmd2Kys7IC8qIDxhZmY+IDxjbWQuLi4+ICovCisJCWlmICghKmFyZ3YpCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJY3VycmVudF9uZXcgPSAiY3VycmVudFwwbmV3IjsKKwlpZiAob3B0X3ApIHsKKyBwcmludF9hZmY6CisJCWlmIChzY2hlZF9nZXRhZmZpbml0eShwaWQsIHNpemVvZihtYXNrKSwgJm1hc2spIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJWNldCBwaWQgJWQncyBhZmZpbml0eSIsICdnJywgcGlkKTsKKwkJcHJpbnRmKCJwaWQgJWQncyAlcyBhZmZpbml0eSBtYXNrOiAiVEFTS1NFVF9QUklOVEZfTUFTSyJcbiIsCisJCQkJcGlkLCBjdXJyZW50X25ldywgZnJvbV9jcHVzZXQoJm1hc2spKTsKKwkJaWYgKCEqYXJndikgeworCQkJLyogRWl0aGVyIGl0IHdhcyBqdXN0ICItcCA8cGlkPiIsCisJCQkgKiBvciBpdCB3YXMgIi1wIDxhZmY+IDxwaWQ+IiBhbmQgd2UgY2FtZSBoZXJlCisJCQkgKiBmb3IgdGhlIHNlY29uZCB0aW1lIChzZWUgZ290byBiZWxvdykgKi8KKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJKmFyZ3YgPSBOVUxMOworCQljdXJyZW50X25ldyArPSA4OyAvKiAibmV3IiAqLworCX0KKworCXsgLyogQWZmaW5pdHkgd2FzIHNwZWNpZmllZCwgdHJhbnNsYXRlIGl0IGludG8gY3B1X3NldF90ICovCisJCXVuc2lnbmVkIGk7CisJCS8qIERvIG5vdCBhbGxvdyB6ZXJvIG1hc2s6ICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtID0geHN0cnRvdWxsX3JhbmdlKGFmZiwgMCwgMSwgVUxMT05HX01BWCk7CisJCWVudW0geyBDTlRfQklUID0gQ1BVX1NFVFNJWkUgPCBzaXplb2YobSkqOCA/IENQVV9TRVRTSVpFIDogc2l6ZW9mKG0pKjggfTsKKworCQlDUFVfWkVSTygmbWFzayk7CisJCWZvciAoaSA9IDA7IGkgPCBDTlRfQklUOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBiaXQgPSAoMVVMTCA8PCBpKTsKKwkJCWlmIChiaXQgJiBtKQorCQkJCUNQVV9TRVQoaSwgJm1hc2spOworCQl9CisJfQorCisJLyogU2V0IHBpZCdzIG9yIG91ciBvd24gKHBpZD09MCkgYWZmaW5pdHkgKi8KKwlpZiAoc2NoZWRfc2V0YWZmaW5pdHkocGlkLCBzaXplb2YobWFzayksICZtYXNrKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCAlY2V0IHBpZCAlZCdzIGFmZmluaXR5IiwgJ3MnLCBwaWQpOworCisJaWYgKCFhcmd2WzBdKSAvKiAiLXAgPGFmZj4gPHBpZD4gWy4uLmlnbm9yZWQuLi5dIiAqLworCQlnb3RvIHByaW50X2FmZjsgLyogcHJpbnQgbmV3IGFmZmluaXR5IGFuZCBleGl0ICovCisKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3RpbWUuYyBiL21pc2N1dGlscy90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1ZjE1ZgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy90aW1lLmMKQEAgLTAsMCArMSw0MjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogJ3RpbWUnIHV0aWxpdHkgdG8gZGlzcGxheSByZXNvdXJjZSB1c2FnZSBvZiBwcm9jZXNzZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKy8qIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBEYXZpZCBLZXBwZWwgPHBhcmRvQGNzLndhc2hpbmd0b24uZWR1Pi4KKyAgIEhlYXZpbHkgbW9kaWZpZWQgYnkgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LgorICAgSGVhdmlseSBtb2RpZmllZCBmb3IgYnVzeWJveCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisqLworCisvL3VzYWdlOiNkZWZpbmUgdGltZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12XSBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgdGltZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HLCBkaXNwbGF5IHJlc291cmNlIHVzYWdlIHdoZW4gaXQgZXhpdHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEluZm9ybWF0aW9uIG9uIHRoZSByZXNvdXJjZXMgdXNlZCBieSBhIGNoaWxkIHByb2Nlc3MuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB3YWl0c3RhdHVzOworCXN0cnVjdCBydXNhZ2UgcnU7CisJdW5zaWduZWQgZWxhcHNlZF9tczsJLyogV2FsbGNsb2NrIHRpbWUgb2YgcHJvY2Vzcy4gICovCit9IHJlc291cmNlX3Q7CisKKy8qIG1zZWMgPSBtaWxsaXNlY29uZHMgPSAxLzEsMDAwICgxKjEwZS0zKSBzZWNvbmQuCisgICB1c2VjID0gbWljcm9zZWNvbmRzID0gMS8xLDAwMCwwMDAgKDEqMTBlLTYpIHNlY29uZC4gICovCisKKyNkZWZpbmUgVUwgdW5zaWduZWQgbG9uZworCitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2Zvcm1hdFtdIEFMSUdOMSA9ICJyZWFsXHQlRVxudXNlclx0JXVcbnN5c1x0JVQiOworCisvKiBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgdGhlIC1wIG9wdGlvbiAuKi8KK3N0YXRpYyBjb25zdCBjaGFyIHBvc2l4X2Zvcm1hdFtdIEFMSUdOMSA9ICJyZWFsICVlXG51c2VyICVVXG5zeXMgJVMiOworCisvKiBGb3JtYXQgc3RyaW5nIGZvciBwcmludGluZyBhbGwgc3RhdGlzdGljcyB2ZXJib3NlbHkuCisgICBLZWVwIHRoaXMgb3V0cHV0IHRvIDI0IGxpbmVzIHNvIHVzZXJzIG9uIHRlcm1pbmFscyBjYW4gc2VlIGl0IGFsbC4qLworc3RhdGljIGNvbnN0IGNoYXIgbG9uZ19mb3JtYXRbXSBBTElHTjEgPQorCSJcdENvbW1hbmQgYmVpbmcgdGltZWQ6IFwiJUNcIlxuIgorCSJcdFVzZXIgdGltZSAoc2Vjb25kcyk6ICVVXG4iCisJIlx0U3lzdGVtIHRpbWUgKHNlY29uZHMpOiAlU1xuIgorCSJcdFBlcmNlbnQgb2YgQ1BVIHRoaXMgam9iIGdvdDogJVBcbiIKKwkiXHRFbGFwc2VkICh3YWxsIGNsb2NrKSB0aW1lIChoOm1tOnNzIG9yIG06c3MpOiAlRVxuIgorCSJcdEF2ZXJhZ2Ugc2hhcmVkIHRleHQgc2l6ZSAoa2J5dGVzKTogJVhcbiIKKwkiXHRBdmVyYWdlIHVuc2hhcmVkIGRhdGEgc2l6ZSAoa2J5dGVzKTogJURcbiIKKwkiXHRBdmVyYWdlIHN0YWNrIHNpemUgKGtieXRlcyk6ICVwXG4iCisJIlx0QXZlcmFnZSB0b3RhbCBzaXplIChrYnl0ZXMpOiAlS1xuIgorCSJcdE1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgKGtieXRlcyk6ICVNXG4iCisJIlx0QXZlcmFnZSByZXNpZGVudCBzZXQgc2l6ZSAoa2J5dGVzKTogJXRcbiIKKwkiXHRNYWpvciAocmVxdWlyaW5nIEkvTykgcGFnZSBmYXVsdHM6ICVGXG4iCisJIlx0TWlub3IgKHJlY2xhaW1pbmcgYSBmcmFtZSkgcGFnZSBmYXVsdHM6ICVSXG4iCisJIlx0Vm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXM6ICV3XG4iCisJIlx0SW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlczogJWNcbiIKKwkiXHRTd2FwczogJVdcbiIKKwkiXHRGaWxlIHN5c3RlbSBpbnB1dHM6ICVJXG4iCisJIlx0RmlsZSBzeXN0ZW0gb3V0cHV0czogJU9cbiIKKwkiXHRTb2NrZXQgbWVzc2FnZXMgc2VudDogJXNcbiIKKwkiXHRTb2NrZXQgbWVzc2FnZXMgcmVjZWl2ZWQ6ICVyXG4iCisJIlx0U2lnbmFscyBkZWxpdmVyZWQ6ICVrXG4iCisJIlx0UGFnZSBzaXplIChieXRlcyk6ICVaXG4iCisJIlx0RXhpdCBzdGF0dXM6ICV4IjsKKworLyogV2FpdCBmb3IgYW5kIGZpbGwgaW4gZGF0YSBvbiBjaGlsZCBwcm9jZXNzIFBJRC4KKyAgIFJldHVybiAwIG9uIGVycm9yLCAxIGlmIG9rLiAgKi8KKy8qIHBpZF90IGlzIHNob3J0IG9uIEJTREksIHNvIGRvbid0IHRyeSB0byBwcm9tb3RlIGl0LiAgKi8KK3N0YXRpYyB2b2lkIHJlc3VzZV9lbmQocGlkX3QgcGlkLCByZXNvdXJjZV90ICpyZXNwKQoreworCXBpZF90IGNhdWdodDsKKworCS8qIElnbm9yZSBzaWduYWxzLCBidXQgZG9uJ3QgaWdub3JlIHRoZSBjaGlsZHJlbi4gIFdoZW4gd2FpdDMKKwkgICByZXR1cm5zIHRoZSBjaGlsZCBwcm9jZXNzLCBzZXQgdGhlIHRpbWUgdGhlIGNvbW1hbmQgZmluaXNoZWQuICovCisJd2hpbGUgKChjYXVnaHQgPSB3YWl0MygmcmVzcC0+d2FpdHN0YXR1cywgMCwgJnJlc3AtPnJ1KSkgIT0gcGlkKSB7CisJCWlmIChjYXVnaHQgPT0gLTEgJiYgZXJybm8gIT0gRUlOVFIpIHsKKwkJCWJiX3BlcnJvcl9tc2coIndhaXQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlyZXNwLT5lbGFwc2VkX21zID0gbW9ub3RvbmljX21zKCkgLSByZXNwLT5lbGFwc2VkX21zOworfQorCitzdGF0aWMgdm9pZCBwcmludGFyZ3YoY2hhciAqY29uc3QgKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZm10ID0gIiAlcyIgKyAxOworCWRvIHsKKwkJcHJpbnRmKGZtdCwgKmFyZ3YpOworCQlmbXQgPSAiICVzIjsKKwl9IHdoaWxlICgqKythcmd2KTsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2Yga2lsb2J5dGVzIGNvcnJlc3BvbmRpbmcgdG8gYSBudW1iZXIgb2YgcGFnZXMgUEFHRVMuCisgICAoQWN0dWFsbHksIHdlIHVzZSBpdCB0byBjb252ZXJ0IHBhZ2VzKnRpY2tzIGludG8ga2lsb2J5dGVzKnRpY2tzLikKKworICAgVHJ5IHRvIGRvIGFyaXRobWV0aWMgc28gdGhhdCB0aGUgcmlzayBvZiBvdmVyZmxvdyBlcnJvcnMgaXMgbWluaW1pemVkLgorICAgVGhpcyBpcyBmdW5reSBzaW5jZSB0aGUgcGFnZXNpemUgY291bGQgYmUgbGVzcyB0aGFuIDFLLgorICAgTm90ZTogU29tZSBtYWNoaW5lcyBleHByZXNzIGdldHJ1c2FnZSBzdGF0aXN0aWNzIGluIHRlcm1zIG9mIEssCisgICBvdGhlcnMgaW4gdGVybXMgb2YgcGFnZXMuICAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHRvayhjb25zdCB1bnNpZ25lZCBwYWdlc2l6ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBwYWdlcykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCS8qIENvbnZlcnNpb24uICAqLworCWlmIChwYWdlcyA+IChMT05HX01BWCAvIHBhZ2VzaXplKSkgeyAvKiBDb3VsZCBvdmVyZmxvdy4gICovCisJCXRtcCA9IHBhZ2VzIC8gMTAyNDsgICAgIC8qIFNtYWxsZXIgZmlyc3QsICovCisJCXJldHVybiB0bXAgKiBwYWdlc2l6ZTsgIC8qIHRoZW4gbGFyZ2VyLiAgKi8KKwl9CisJLyogQ291bGQgdW5kZXJmbG93LiAgKi8KKwl0bXAgPSBwYWdlcyAqIHBhZ2VzaXplOyAvKiBMYXJnZXIgZmlyc3QsICovCisJcmV0dXJuIHRtcCAvIDEwMjQ7ICAgICAgLyogdGhlbiBzbWFsbGVyLiAgKi8KK30KKworLyogc3VtbWFyaXplOiBSZXBvcnQgb24gdGhlIHN5c3RlbSB1c2Ugb2YgYSBjb21tYW5kLgorCisgICBQcmludCB0aGUgRk1UIGFyZ3VtZW50IGV4Y2VwdCB0aGF0IGAlJyBzZXF1ZW5jZXMKKyAgIGhhdmUgc3BlY2lhbCBtZWFuaW5nLCBhbmQgYFxuJyBhbmQgYFx0JyBhcmUgdHJhbnNsYXRlZCBpbnRvCisgICBuZXdsaW5lIGFuZCB0YWIsIHJlc3BlY3RpdmVseSwgYW5kIGBcXCcgaXMgdHJhbnNsYXRlZCBpbnRvIGBcJy4KKworICAgVGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgYSBgJScgY2FuIGJlOgorICAgKCogbWVhbnMgdGhlIHRjc2ggdGltZSBidWlsdGluIGFsc28gcmVjb2duaXplcyBpdCkKKyAgICUgPT0gYSBsaXRlcmFsIGAlJworICAgQyA9PSBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cworKiAgRCA9PSBhdmVyYWdlIHVuc2hhcmVkIGRhdGEgc2l6ZSBpbiBLIChydV9pZHJzcytydV9pc3JzcykKKyogIEUgPT0gZWxhcHNlZCByZWFsICh3YWxsIGNsb2NrKSB0aW1lIGluIFtob3VyOl1taW46c2VjCisqICBGID09IG1ham9yIHBhZ2UgZmF1bHRzIChyZXF1aXJlZCBwaHlzaWNhbCBJL08pIChydV9tYWpmbHQpCisqICBJID09IGZpbGUgc3lzdGVtIGlucHV0cyAocnVfaW5ibG9jaykKKyogIEsgPT0gYXZlcmFnZSB0b3RhbCBtZW0gdXNhZ2UgKHJ1X2lkcnNzK3J1X2lzcnNzK3J1X2l4cnNzKQorKiAgTSA9PSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIGluIEsgKHJ1X21heHJzcykKKyogIE8gPT0gZmlsZSBzeXN0ZW0gb3V0cHV0cyAocnVfb3VibG9jaykKKyogIFAgPT0gcGVyY2VudCBvZiBDUFUgdGhpcyBqb2IgZ290ICh0b3RhbCBjcHUgdGltZSAvIGVsYXBzZWQgdGltZSkKKyogIFIgPT0gbWlub3IgcGFnZSBmYXVsdHMgKHJlY2xhaW1zOyBubyBwaHlzaWNhbCBJL08gaW52b2x2ZWQpIChydV9taW5mbHQpCisqICBTID09IHN5c3RlbSAoa2VybmVsKSB0aW1lIChzZWNvbmRzKSAocnVfc3RpbWUpCisqICBUID09IHN5c3RlbSB0aW1lIGluIFtob3VyOl1taW46c2VjCisqICBVID09IHVzZXIgdGltZSAoc2Vjb25kcykgKHJ1X3V0aW1lKQorKiAgdSA9PSB1c2VyIHRpbWUgaW4gW2hvdXI6XW1pbjpzZWMKKyogIFcgPT0gdGltZXMgc3dhcHBlZCBvdXQgKHJ1X25zd2FwKQorKiAgWCA9PSBhdmVyYWdlIGFtb3VudCBvZiBzaGFyZWQgdGV4dCBpbiBLIChydV9peHJzcykKKyAgIFogPT0gcGFnZSBzaXplCisqICBjID09IGludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMgKHJ1X25pdmNzdykKKyAgIGUgPT0gZWxhcHNlZCByZWFsIHRpbWUgaW4gc2Vjb25kcworKiAgayA9PSBzaWduYWxzIGRlbGl2ZXJlZCAocnVfbnNpZ25hbHMpCisgICBwID09IGF2ZXJhZ2UgdW5zaGFyZWQgc3RhY2sgc2l6ZSBpbiBLIChydV9pc3JzcykKKyogIHIgPT0gc29ja2V0IG1lc3NhZ2VzIHJlY2VpdmVkIChydV9tc2dyY3YpCisqICBzID09IHNvY2tldCBtZXNzYWdlcyBzZW50IChydV9tc2dzbmQpCisgICB0ID09IGF2ZXJhZ2UgcmVzaWRlbnQgc2V0IHNpemUgaW4gSyAocnVfaWRyc3MpCisqICB3ID09IHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzIChydV9udmNzdykKKyAgIHggPT0gZXhpdCBzdGF0dXMgb2YgY29tbWFuZAorCisgICBWYXJpb3VzIG1lbW9yeSB1c2FnZXMgYXJlIGZvdW5kIGJ5IGNvbnZlcnRpbmcgZnJvbSBwYWdlLXNlY29uZHMKKyAgIHRvIGtieXRlcyBieSBtdWx0aXBseWluZyBieSB0aGUgcGFnZSBzaXplLCBkaXZpZGluZyBieSAxMDI0LAorICAgYW5kIGRpdmlkaW5nIGJ5IGVsYXBzZWQgcmVhbCB0aW1lLgorCisgICBGTVQgaXMgdGhlIGZvcm1hdCBzdHJpbmcsIGludGVycHJldGVkIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgIENPTU1BTkQgaXMgdGhlIGNvbW1hbmQgYW5kIGFyZ3MgdGhhdCBhcmUgYmVpbmcgc3VtbWFyaXplZC4KKyAgIFJFU1AgaXMgcmVzb3VyY2UgaW5mb3JtYXRpb24gb24gdGhlIGNvbW1hbmQuICAqLworCisjaWZuZGVmIFRJQ0tTX1BFUl9TRUMKKyNkZWZpbmUgVElDS1NfUEVSX1NFQyAxMDAKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdW1tYXJpemUoY29uc3QgY2hhciAqZm10LCBjaGFyICoqY29tbWFuZCwgcmVzb3VyY2VfdCAqcmVzcCkKK3sKKwl1bnNpZ25lZCB2dl9tczsgICAgIC8qIEVsYXBzZWQgdmlydHVhbCAoQ1BVKSBtaWxsaXNlY29uZHMgKi8KKwl1bnNpZ25lZCBjcHVfdGlja3M7IC8qIFNhbWUsIGluICJDUFUgdGlja3MiICovCisJdW5zaWduZWQgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyogSW1wb3NzaWJsZTogd2UgZG8gbm90IHVzZSBXVU5UUkFDRUQgZmxhZyBpbiB3YWl0KCkuLi4KKwlpZiAoV0lGU1RPUFBFRChyZXNwLT53YWl0c3RhdHVzKSkKKwkJcHJpbnRmKCJDb21tYW5kIHN0b3BwZWQgYnkgc2lnbmFsICV1XG4iLAorCQkJCVdTVE9QU0lHKHJlc3AtPndhaXRzdGF0dXMpKTsKKwllbHNlICovCisJaWYgKFdJRlNJR05BTEVEKHJlc3AtPndhaXRzdGF0dXMpKQorCQlwcmludGYoIkNvbW1hbmQgdGVybWluYXRlZCBieSBzaWduYWwgJXVcbiIsCisJCQkJV1RFUk1TSUcocmVzcC0+d2FpdHN0YXR1cykpOworCWVsc2UgaWYgKFdJRkVYSVRFRChyZXNwLT53YWl0c3RhdHVzKSAmJiBXRVhJVFNUQVRVUyhyZXNwLT53YWl0c3RhdHVzKSkKKwkJcHJpbnRmKCJDb21tYW5kIGV4aXRlZCB3aXRoIG5vbi16ZXJvIHN0YXR1cyAldVxuIiwKKwkJCQlXRVhJVFNUQVRVUyhyZXNwLT53YWl0c3RhdHVzKSk7CisKKwl2dl9tcyA9IChyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgKyByZXNwLT5ydS5ydV9zdGltZS50dl9zZWMpICogMTAwMAorCSAgICAgICsgKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3VzZWMgKyByZXNwLT5ydS5ydV9zdGltZS50dl91c2VjKSAvIDEwMDA7CisKKyNpZiAoMTAwMCAvIFRJQ0tTX1BFUl9TRUMpICogVElDS1NfUEVSX1NFQyA9PSAxMDAwCisJLyogMTAwMCBpcyBleGFjdGx5IGRpdmlzaWJsZSBieSBUSUNLU19QRVJfU0VDICh0eXBpY2FsKSAqLworCWNwdV90aWNrcyA9IHZ2X21zIC8gKDEwMDAgLyBUSUNLU19QRVJfU0VDKTsKKyNlbHNlCisJY3B1X3RpY2tzID0gdnZfbXMgKiAodW5zaWduZWQgbG9uZyBsb25nKVRJQ0tTX1BFUl9TRUMgLyAxMDAwOworI2VuZGlmCisJaWYgKCFjcHVfdGlja3MpIGNwdV90aWNrcyA9IDE7IC8qIHdlIGRpdmlkZSBieSBpdCwgbXVzdCBiZSBub256ZXJvICovCisKKwl3aGlsZSAoKmZtdCkgeworCQkvKiBIYW5kbGUgbGVhZGluZyBsaXRlcmFsIHBhcnQgKi8KKwkJaW50IG4gPSBzdHJjc3BuKGZtdCwgIiVcXCIpOworCQlpZiAobikgeworCQkJcHJpbnRmKCIlLipzIiwgbiwgZm10KTsKKwkJCWZtdCArPSBuOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKCpmbXQpIHsKKyNpZmRlZiBOT1RfTkVFREVECisJCS8qIEhhbmRsZSBsaXRlcmFsIGNoYXIgKi8KKwkJLyogVXN1YWxseSB3ZSBvcHRpbWl6ZSBmb3Igc2l6ZSwgYnV0IHRoZXJlIGlzIGEgbGltaXQKKwkJICogZm9yIGV2ZXJ5dGhpbmcuIFdpdGggdGhpcyB3ZSBkbyBhIGxvdCBvZiAxLWJ5dGUgd3JpdGVzICovCisJCWRlZmF1bHQ6CisJCQliYl9wdXRjaGFyKCpmbXQpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlICclJzoKKwkJCXN3aXRjaCAoKisrZm10KSB7CisjaWZkZWYgTk9UX05FRURFRF9ZRVQKKwkJLyogT3VyIGZvcm1hdCBzdHJpbmdzIGRvIG5vdCBoYXZlIHRoZXNlICovCisJCS8qIGFuZCB3ZSBkbyBub3QgdGFrZSBmb3JtYXQgc3RyIGZyb20gdXNlciAqLworCQkJZGVmYXVsdDoKKwkJCQliYl9wdXRjaGFyKCclJyk7CisJCQkJLypGQUxMVEhST1VHSCovCisJCQljYXNlICclJzoKKwkJCQlpZiAoISpmbXQpIGdvdG8gcmV0OworCQkJCWJiX3B1dGNoYXIoKmZtdCk7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgJ0MnOgkvKiBUaGUgY29tbWFuZCB0aGF0IGdvdCB0aW1lZC4gICovCisJCQkJcHJpbnRhcmd2KGNvbW1hbmQpOworCQkJCWJyZWFrOworCQkJY2FzZSAnRCc6CS8qIEF2ZXJhZ2UgdW5zaGFyZWQgZGF0YSBzaXplLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsCisJCQkJCShwdG9rKHBhZ2VzaXplLCAoVUwpIHJlc3AtPnJ1LnJ1X2lkcnNzKSArCisJCQkJCSBwdG9rKHBhZ2VzaXplLCAoVUwpIHJlc3AtPnJ1LnJ1X2lzcnNzKSkgLyBjcHVfdGlja3MpOworCQkJCWJyZWFrOworCQkJY2FzZSAnRSc6IHsJLyogRWxhcHNlZCByZWFsICh3YWxsIGNsb2NrKSB0aW1lLiAgKi8KKwkJCQl1bnNpZ25lZCBzZWNvbmRzID0gcmVzcC0+ZWxhcHNlZF9tcyAvIDEwMDA7CisJCQkJaWYgKHNlY29uZHMgPj0gMzYwMCkJLyogT25lIGhvdXIgLT4gaDptOnMuICAqLworCQkJCQlwcmludGYoIiV1aCAldW0gJTAydXMiLAorCQkJCQkJCXNlY29uZHMgLyAzNjAwLAorCQkJCQkJCShzZWNvbmRzICUgMzYwMCkgLyA2MCwKKwkJCQkJCQlzZWNvbmRzICUgNjApOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIldW0gJXUuJTAydXMiLAkvKiAtPiBtOnMuICAqLworCQkJCQkJCXNlY29uZHMgLyA2MCwKKwkJCQkJCQlzZWNvbmRzICUgNjAsCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5lbGFwc2VkX21zIC8gMTApICUgMTAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ0YnOgkvKiBNYWpvciBwYWdlIGZhdWx0cy4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9tYWpmbHQpOworCQkJCWJyZWFrOworCQkJY2FzZSAnSSc6CS8qIElucHV0cy4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9pbmJsb2NrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0snOgkvKiBBdmVyYWdlIG1lbSB1c2FnZSA9PSBkYXRhK3N0YWNrK3RleHQuICAqLworCQkJCXByaW50ZigiJWx1IiwKKwkJCQkJKHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaWRyc3MpICsKKwkJCQkJIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaXNyc3MpICsKKwkJCQkJIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaXhyc3MpKSAvIGNwdV90aWNrcyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdNJzoJLyogTWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZS4gICovCisJCQkJcHJpbnRmKCIlbHUiLCBwdG9rKHBhZ2VzaXplLCAoVUwpIHJlc3AtPnJ1LnJ1X21heHJzcykpOworCQkJCWJyZWFrOworCQkJY2FzZSAnTyc6CS8qIE91dHB1dHMuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfb3VibG9jayk7CisJCQkJYnJlYWs7CisJCQljYXNlICdQJzoJLyogUGVyY2VudCBvZiBDUFUgdGhpcyBqb2IgZ290LiAgKi8KKwkJCQkvKiAlIGNwdSBpcyAodG90YWwgY3B1IHRpbWUpLyhlbGFwc2VkIHRpbWUpLiAgKi8KKwkJCQlpZiAocmVzcC0+ZWxhcHNlZF9tcyA+IDApCisJCQkJCXByaW50ZigiJXUlJSIsICh1bnNpZ25lZCkodnZfbXMgKiAxMDAgLyByZXNwLT5lbGFwc2VkX21zKSk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIj8lJSIpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUic6CS8qIE1pbm9yIHBhZ2UgZmF1bHRzIChyZWNsYWltcykuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbWluZmx0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgkvKiBTeXN0ZW0gdGltZS4gICovCisJCQkJcHJpbnRmKCIldS4lMDJ1IiwKKwkJCQkJCSh1bnNpZ25lZClyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMsCisJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnVCc6CS8qIFN5c3RlbSB0aW1lLiAgKi8KKwkJCQlpZiAocmVzcC0+cnUucnVfc3RpbWUudHZfc2VjID49IDM2MDApIC8qIE9uZSBob3VyIC0+IGg6bTpzLiAgKi8KKwkJCQkJcHJpbnRmKCIldWggJXVtICUwMnVzIiwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYyAvIDM2MDApLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfc2VjICUgMzYwMCkgLyA2MCwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYyAlIDYwKSk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiV1bSAldS4lMDJ1cyIsCS8qIC0+IG06cy4gICovCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMgLyA2MCksCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMgJSA2MCksCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV9zdGltZS50dl91c2VjIC8gMTAwMDApKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1UnOgkvKiBVc2VyIHRpbWUuICAqLworCQkJCXByaW50ZigiJXUuJTAydSIsCisJCQkJCQkodW5zaWduZWQpcmVzcC0+cnUucnVfdXRpbWUudHZfc2VjLAorCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV91dGltZS50dl91c2VjIC8gMTAwMDApKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3UnOgkvKiBVc2VyIHRpbWUuICAqLworCQkJCWlmIChyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgPj0gMzYwMCkgLyogT25lIGhvdXIgLT4gaDptOnMuICAqLworCQkJCQlwcmludGYoIiV1aCAldW0gJTAydXMiLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfc2VjIC8gMzYwMCksCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgJSAzNjAwKSAvIDYwLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfc2VjICUgNjApKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiJXVtICV1LiUwMnVzIiwJLyogLT4gbTpzLiAgKi8KKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyAvIDYwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyAlIDYwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3VzZWMgLyAxMDAwMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnVyc6CS8qIFRpbWVzIHN3YXBwZWQgb3V0LiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X25zd2FwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1gnOgkvKiBBdmVyYWdlIHNoYXJlZCB0ZXh0IHNpemUuICAqLworCQkJCXByaW50ZigiJWx1IiwgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9peHJzcykgLyBjcHVfdGlja3MpOworCQkJCWJyZWFrOworCQkJY2FzZSAnWic6CS8qIFBhZ2Ugc2l6ZS4gICovCisJCQkJcHJpbnRmKCIldSIsIHBhZ2VzaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2MnOgkvKiBJbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X25pdmNzdyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdlJzoJLyogRWxhcHNlZCByZWFsIHRpbWUgaW4gc2Vjb25kcy4gICovCisJCQkJcHJpbnRmKCIldS4lMDJ1IiwKKwkJCQkJCSh1bnNpZ25lZClyZXNwLT5lbGFwc2VkX21zIC8gMTAwMCwKKwkJCQkJCSh1bnNpZ25lZCkocmVzcC0+ZWxhcHNlZF9tcyAvIDEwKSAlIDEwMCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdrJzoJLyogU2lnbmFscyBkZWxpdmVyZWQuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbnNpZ25hbHMpOworCQkJCWJyZWFrOworCQkJY2FzZSAncCc6CS8qIEF2ZXJhZ2Ugc3RhY2sgc2VnbWVudC4gICovCisJCQkJcHJpbnRmKCIlbHUiLCBwdG9rKHBhZ2VzaXplLCAoVUwpIHJlc3AtPnJ1LnJ1X2lzcnNzKSAvIGNwdV90aWNrcyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdyJzoJLyogSW5jb21pbmcgc29ja2V0IG1lc3NhZ2VzIHJlY2VpdmVkLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X21zZ3Jjdik7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoJLyogT3V0Z29pbmcgc29ja2V0IG1lc3NhZ2VzIHNlbnQuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbXNnc25kKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgkvKiBBdmVyYWdlIHJlc2lkZW50IHNldCBzaXplLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaWRyc3MpIC8gY3B1X3RpY2tzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3cnOgkvKiBWb2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcy4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9udmNzdyk7CisJCQkJYnJlYWs7CisJCQljYXNlICd4JzoJLyogRXhpdCBzdGF0dXMuICAqLworCQkJCXByaW50ZigiJXUiLCBXRVhJVFNUQVRVUyhyZXNwLT53YWl0c3RhdHVzKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworI2lmZGVmIE5PVF9ORUVERURfWUVUCisJCWNhc2UgJ1xcJzoJCS8qIEZvcm1hdCBlc2NhcGUuICAqLworCQkJc3dpdGNoICgqKytmbXQpIHsKKwkJCWRlZmF1bHQ6CisJCQkJYmJfcHV0Y2hhcignXFwnKTsKKwkJCQkvKkZBTExUSFJPVUdIKi8KKwkJCWNhc2UgJ1xcJzoKKwkJCQlpZiAoISpmbXQpIGdvdG8gcmV0OworCQkJCWJiX3B1dGNoYXIoKmZtdCk7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQliYl9wdXRjaGFyKCdcdCcpOworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJKytmbXQ7CisJfQorIC8qIHJldDogKi8KKwliYl9wdXRjaGFyKCdcbicpOworfQorCisvKiBSdW4gY29tbWFuZCBDTUQgYW5kIHJldHVybiBzdGF0aXN0aWNzIG9uIGl0LgorICAgUHV0IHRoZSBzdGF0aXN0aWNzIGluICpSRVNQLiAgKi8KK3N0YXRpYyB2b2lkIHJ1bl9jb21tYW5kKGNoYXIgKmNvbnN0ICpjbWQsIHJlc291cmNlX3QgKnJlc3ApCit7CisJcGlkX3QgcGlkOworCXZvaWQgKCppbnRlcnJ1cHRfc2lnbmFsKShpbnQpOworCXZvaWQgKCpxdWl0X3NpZ25hbCkoaW50KTsKKworCXJlc3AtPmVsYXBzZWRfbXMgPSBtb25vdG9uaWNfbXMoKTsKKwlwaWQgPSB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ2hpbGQgKi8KKwkJQkJfRVhFQ1ZQX29yX2RpZSgoY2hhcioqKWNtZCk7CisJfQorCisJLyogSGF2ZSBzaWduYWxzIGtpbGwgdGhlIGNoaWxkIGJ1dCBub3Qgc2VsZiAoaWYgcG9zc2libGUpLiAgKi8KKy8vVE9ETzoganVzdCBibG9jayBhbGwgc2lncz8gYW5kIHJlZW5hYmxlIHRoZW0gaW4gdGhlIHZlcnkgZW5kIGluIG1haW4/CisJaW50ZXJydXB0X3NpZ25hbCA9IHNpZ25hbChTSUdJTlQsIFNJR19JR04pOworCXF1aXRfc2lnbmFsID0gc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworCisJcmVzdXNlX2VuZChwaWQsIHJlc3ApOworCisJLyogUmUtZW5hYmxlIHNpZ25hbHMuICAqLworCXNpZ25hbChTSUdJTlQsIGludGVycnVwdF9zaWduYWwpOworCXNpZ25hbChTSUdRVUlULCBxdWl0X3NpZ25hbCk7Cit9CisKK2ludCB0aW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0aW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXNvdXJjZV90IHJlczsKKwljb25zdCBjaGFyICpvdXRwdXRfZm9ybWF0ID0gZGVmYXVsdF9mb3JtYXQ7CisJaW50IG9wdDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3Qgb25lIGFyZyAqLworCS8qICIrIjogc3RvcCBvbiBmaXJzdCBub24tb3B0aW9uICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIit2cCIpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiAxKQorCQlvdXRwdXRfZm9ybWF0ID0gbG9uZ19mb3JtYXQ7CisJaWYgKG9wdCAmIDIpCisJCW91dHB1dF9mb3JtYXQgPSBwb3NpeF9mb3JtYXQ7CisKKwlydW5fY29tbWFuZChhcmd2LCAmcmVzKTsKKworCS8qIENoZWF0LiBwcmludGYncyBhcmUgc2hvcnRlciA6KSAqLworCXhkdXAyKFNUREVSUl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCXN1bW1hcml6ZShvdXRwdXRfZm9ybWF0LCBhcmd2LCAmcmVzKTsKKworCWlmIChXSUZTVE9QUEVEKHJlcy53YWl0c3RhdHVzKSkKKwkJcmV0dXJuIFdTVE9QU0lHKHJlcy53YWl0c3RhdHVzKTsKKwlpZiAoV0lGU0lHTkFMRUQocmVzLndhaXRzdGF0dXMpKQorCQlyZXR1cm4gV1RFUk1TSUcocmVzLndhaXRzdGF0dXMpOworCWlmIChXSUZFWElURUQocmVzLndhaXRzdGF0dXMpKQorCQlyZXR1cm4gV0VYSVRTVEFUVVMocmVzLndhaXRzdGF0dXMpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy90aW1lb3V0LmMgYi9taXNjdXRpbHMvdGltZW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTY1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvdGltZW91dC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoKKyAqIENPUFlJTkcgTk9URVMKKyAqCisgKiB0aW1lb3V0LmMgLS0gYSB0aW1lb3V0IGhhbmRsZXIgZm9yIHNoZWxsIGNvbW1hbmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTYsIFJvYmVydG8gQS4gRm9nbGlldHRhIDxtZUByb2JlcnRvLmZvZ2xpZXR0YS5uYW1lPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCisgKiBSRVZJU0lPTiBOT1RFUzoKKyAqIHJlbGVhc2VkIDE3LTExLTIwMDUgYnkgUm9iZXJ0byBBLiBGb2dsaWV0dGEKKyAqIHRhbGFybSAgIDA0LTEyLTIwMDUgYnkgUm9iZXJ0byBBLiBGb2dsaWV0dGEKKyAqIG1vZGlmaWVkIDA1LTEyLTIwMDUgYnkgUm9iZXJ0byBBLiBGb2dsaWV0dGEKKyAqIHNpemVyZGN0IDA2LTEyLTIwMDUgYnkgUm9iZXJ0byBBLiBGb2dsaWV0dGEKKyAqIHNwbGl0c3pmIDEyLTA1LTIwMDYgYnkgUm9iZXJ0byBBLiBGb2dsaWV0dGEKKyAqIHJld3JpdGUgIDE0LTExLTIwMDggdmRhCisgKi8KKworLy91c2FnZTojZGVmaW5lIHRpbWVvdXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdCBTRUNTXSBbLXMgU0lHXSBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgdGltZW91dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1bnMgUFJPRy4gU2VuZHMgU0lHIHRvIGl0IGlmIGl0IGlzIG5vdCBnb25lIGluIFNFQ1Mgc2Vjb25kcy5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWZhdWx0czogU0VDUzogMTAsIFNJRzogVEVSTS4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgdGltZW91dF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGltZW91dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHNpZ25vOworCWludCBzdGF0dXM7CisJaW50IHBhcmVudCA9IDA7CisJaW50IHRpbWVvdXQgPSAxMDsKKwlwaWRfdCBwaWQ7CisjaWYgIUJCX01NVQorCWNoYXIgKnN2MSwgKnN2MjsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKm9wdF9zID0gIlRFUk0iOworCisJLyogLXAgb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkLCBpdCBpcyBuZWVkZWQgdG8gc3VwcG9ydCBOT01NVS4gKi8KKworCS8qIC10IFNFQ09ORFM7IC1wIFBBUkVOVF9QSUQgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ0KyIgVVNFX0ZPUl9OT01NVSgiOnArIik7CisJLyogJysnOiBzdG9wIGF0IGZpcnN0IG5vbi1vcHRpb24gKi8KKwlnZXRvcHQzMihhcmd2LCAiK3M6dDoiIFVTRV9GT1JfTk9NTVUoInA6IiksICZvcHRfcywgJnRpbWVvdXQsICZwYXJlbnQpOworCS8qYXJndiArPSBvcHRpbmQ7IC0gbm8sIHdhaXQgZm9yIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyEgKi8KKwlzaWdubyA9IGdldF9zaWdudW0ob3B0X3MpOworCWlmIChzaWdubyA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHNpZ25hbCAnJXMnIiwgb3B0X3MpOworCisJLyogV2Ugd2FudCB0byBjcmVhdGUgYSBncmFuZGNoaWxkIHdoaWNoIHdpbGwgd2F0Y2gKKwkgKiBhbmQga2lsbCB0aGUgZ3JhbmRwYXJlbnQuIE90aGVyIG1ldGhvZHM6CisJICogbWFraW5nIHBhcmVudCB3YXRjaCBjaGlsZCBkaXNydXB0cyBwYXJlbnQ8LT5jaGlsZCBsaW5rCisJICogKGV4YW1wbGU6ICJ0Y3BzdmQgMC4wLjAuMCAxMjM0IHRpbWVvdXQgc2VydmljZV9wcm9nIiAtCisJICogaXQncyBiZXR0ZXIgaWYgc2VydmljZV9wcm9nIGlzIGEgY2hpbGQgb2YgdGNwc3ZkISksCisJICogbWFraW5nIGNoaWxkIHdhdGNoIHBhcmVudCByZXN1bHRzIGluIHByb2dyYW1zIGhhdmluZworCSAqIHVuZXhwZWN0ZWQgY2hpbGRyZW4uICovCisKKwlpZiAocGFyZW50KSAvKiB3ZSB3ZXJlIHJlLWV4ZWNlZCwgYWxyZWFkeSBncmFuZGNoaWxkICovCisJCWdvdG8gZ3JhbmRjaGlsZDsKKwlpZiAoIWFyZ3Zbb3B0aW5kXSkgLyogbm8gUFJPRz8gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCisjaWYgIUJCX01NVQorCXN2MSA9IGFyZ3Zbb3B0aW5kXTsKKwlzdjIgPSBhcmd2W29wdGluZCArIDFdOworI2VuZGlmCisJcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIENoaWxkOiBzcGF3biBncmFuZGNoaWxkIGFuZCBleGl0ICovCisJCXBhcmVudCA9IGdldHBwaWQoKTsKKyNpZiAhQkJfTU1VCisJCWFyZ3Zbb3B0aW5kXSA9IHhhc3ByaW50ZigiLXAldSIsIHBhcmVudCk7CisJCWFyZ3Zbb3B0aW5kICsgMV0gPSBOVUxMOworI2VuZGlmCisJCS8qIE5COiBleGl0cyB3aXRoIG5vbnplcm8gb24gZXJyb3I6ICovCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsKKwkJLyogSGVyZSB3ZSBhcmUgZ3JhbmRjaGlsZC4gU2xlZXAsIHRoZW4ga2lsbCBncmFuZHBhcmVudCAqLworIGdyYW5kY2hpbGQ6CisJCS8qIEp1c3Qgc2xlZXAoSFVHRV9OVU0pOyBraWxsKHBhcmVudCkgbWF5IGtpbGwgd3JvbmcgcHJvY2VzcyEgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCXNsZWVwKDEpOworCQkJaWYgKC0tdGltZW91dCA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGtpbGwocGFyZW50LCAwKSkgeworCQkJCS8qIHByb2Nlc3MgaXMgZ29uZSAqLworCQkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJa2lsbChwYXJlbnQsIHNpZ25vKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBQYXJlbnQgKi8KKwl3YWl0KCZzdGF0dXMpOyAvKiB3YWl0IGZvciBjaGlsZCB0byBkaWUgKi8KKwkvKiBEaWQgaW50ZXJtZWRpYXRlIFt2XWZvcmsgb3IgZXhlYyBmYWlsPyAqLworCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCS8qIE9rLCBleGVjIGEgcHJvZ3JhbSBhcyByZXF1ZXN0ZWQgKi8KKwlhcmd2ICs9IG9wdGluZDsKKyNpZiAhQkJfTU1VCisJYXJndlswXSA9IHN2MTsKKwlhcmd2WzFdID0gc3YyOworI2VuZGlmCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy90dHlzaXplLmMgYi9taXNjdXRpbHMvdHR5c2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDQ4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvdHR5c2l6ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJlcGxhY2VtZW50IGZvciAic3R0eSBzaXplIiwgd2hpY2ggaXMgYXdrd2FyZCBmb3Igc2hlbGwgc2NyaXB0IHVzZS4KKyAqIC0gQWxsb3dzIHRvIHJlcXVlc3Qgd2lkdGgsIGhlaWdodCwgb3IgYm90aCwgaW4gYW55IG9yZGVyLgorICogLSBEb2VzIG5vdCBjb21wbGFpbiBvbiBlcnJvciwgYnV0IHJldHVybnMgd2lkdGggODAsIGhlaWdodCAyNC4KKyAqIC0gU2l6ZTogbGVzcyB0aGFuIDIwMCBieXRlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHR0eXNpemVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlt3XSBbaF0iCisvL3VzYWdlOiNkZWZpbmUgdHR5c2l6ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGRpbWVuc2lvbihzKSBvZiBzdGRpbidzIHRlcm1pbmFsLCBvbiBlcnJvciByZXR1cm4gODB4MjUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgdHR5c2l6ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHR5c2l6ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgdywgaDsKKwlzdHJ1Y3Qgd2luc2l6ZSB3c3o7CisKKwl3ID0gODA7CisJaCA9IDI0OworCWlmICghaW9jdGwoMCwgVElPQ0dXSU5TWiwgJndzeikpIHsKKwkJdyA9IHdzei53c19jb2w7CisJCWggPSB3c3oud3Nfcm93OworCX0KKworCWlmICghYXJndlsxXSkgeworCQlwcmludGYoIiV1ICV1IiwgdywgaCk7CisJfSBlbHNlIHsKKwkJY29uc3QgY2hhciAqZm10LCAqYXJnOworCisJCWZtdCA9ICIldSAldSIgKyAzOyAvKiAiJXUiICovCisJCXdoaWxlICgoYXJnID0gKisrYXJndikgIT0gTlVMTCkgeworCQkJY2hhciBjID0gYXJnWzBdOworCQkJaWYgKGMgPT0gJ3cnKQorCQkJCXByaW50ZihmbXQsIHcpOworCQkJaWYgKGMgPT0gJ2gnKQorCQkJCXByaW50ZihmbXQsIGgpOworCQkJZm10ID0gIiV1ICV1IiArIDI7IC8qICIgJXUiICovCisJCX0KKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy91YmlfdG9vbHMuYyBiL21pc2N1dGlscy91YmlfdG9vbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQyNmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3ViaV90b29scy5jCkBAIC0wLDAgKzEsMjcyIEBACisvKiBQb3J0ZWQgdG8gYnVzeWJveCBmcm9tIG10ZC11dGlscy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBVQklBVFRBQ0gKKy8vY29uZmlnOglib29sICJ1YmlhdHRhY2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQXR0YWNoIE1URCBkZXZpY2UgdG8gYW4gVUJJIGRldmljZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSURFVEFDSAorLy9jb25maWc6CWJvb2wgInViaWRldGFjaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBEZXRhY2ggTVREIGRldmljZSBmcm9tIGFuIFVCSSBkZXZpY2UuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBVQklNS1ZPTAorLy9jb25maWc6CWJvb2wgInViaW1rdm9sIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIENyZWF0ZSBhIFVCSSB2b2x1bWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBVQklSTVZPTAorLy9jb25maWc6CWJvb2wgInViaXJtdm9sIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIERlbGV0ZSBhIFVCSSB2b2x1bWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBVQklSU1ZPTAorLy9jb25maWc6CWJvb2wgInViaXJzdm9sIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJlc2l6ZSBhIFVCSSB2b2x1bWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBVQklVUERBVEVWT0wKKy8vY29uZmlnOglib29sICJ1Yml1cGRhdGV2b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVXBkYXRlIGEgVUJJIHZvbHVtZS4KKworLy9hcHBsZXQ6SUZfVUJJQVRUQUNIKEFQUExFVF9PREROQU1FKHViaWF0dGFjaCwgdWJpX3Rvb2xzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgdWJpYXR0YWNoKSkKKy8vYXBwbGV0OklGX1VCSURFVEFDSChBUFBMRVRfT0RETkFNRSh1YmlkZXRhY2gsIHViaV90b29scywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIHViaWRldGFjaCkpCisvL2FwcGxldDpJRl9VQklNS1ZPTChBUFBMRVRfT0RETkFNRSh1Ymlta3ZvbCwgdWJpX3Rvb2xzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgdWJpbWt2b2wpKQorLy9hcHBsZXQ6SUZfVUJJUk1WT0woQVBQTEVUX09ERE5BTUUodWJpcm12b2wsIHViaV90b29scywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIHViaXJtdm9sKSkKKy8vYXBwbGV0OklGX1VCSVJTVk9MKEFQUExFVF9PREROQU1FKHViaXJzdm9sLCB1YmlfdG9vbHMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCB1Ymlyc3ZvbCkpCisvL2FwcGxldDpJRl9VQklVUERBVEVWT0woQVBQTEVUX09ERE5BTUUodWJpdXBkYXRldm9sLCB1YmlfdG9vbHMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCB1Yml1cGRhdGV2b2wpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfVUJJQVRUQUNIKSArPSB1YmlfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VCSURFVEFDSCkgKz0gdWJpX3Rvb2xzLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19VQklNS1ZPTCkgICs9IHViaV90b29scy5vCisvL2tidWlsZDpsaWItJChDT05GSUdfVUJJUk1WT0wpICArPSB1YmlfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VCSVJTVk9MKSAgKz0gdWJpX3Rvb2xzLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19VQklVUERBVEVWT0wpICs9IHViaV90b29scy5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG10ZC91YmktdXNlci5oPgorCisjZGVmaW5lIE9QVElPTl9NICAoMSA8PCAwKQorI2RlZmluZSBPUFRJT05fRCAgKDEgPDwgMSkKKyNkZWZpbmUgT1BUSU9OX24gICgxIDw8IDIpCisjZGVmaW5lIE9QVElPTl9OICAoMSA8PCAzKQorI2RlZmluZSBPUFRJT05fcyAgKDEgPDwgNCkKKyNkZWZpbmUgT1BUSU9OX2EgICgxIDw8IDUpCisjZGVmaW5lIE9QVElPTl90ICAoMSA8PCA2KQorCisjZGVmaW5lIGRvX2F0dGFjaCAoRU5BQkxFX1VCSUFUVEFDSCAmJiBhcHBsZXRfbmFtZVszXSA9PSAnYScpCisjZGVmaW5lIGRvX2RldGFjaCAoRU5BQkxFX1VCSURFVEFDSCAmJiBhcHBsZXRfbmFtZVszXSA9PSAnZCcpCisjZGVmaW5lIGRvX21rdm9sICAoRU5BQkxFX1VCSU1LVk9MICAmJiBhcHBsZXRfbmFtZVszXSA9PSAnbScpCisjZGVmaW5lIGRvX3Jtdm9sICAoRU5BQkxFX1VCSVJNVk9MICAmJiBhcHBsZXRfbmFtZVs0XSA9PSAnbScpCisjZGVmaW5lIGRvX3Jzdm9sICAoRU5BQkxFX1VCSVJTVk9MICAmJiBhcHBsZXRfbmFtZVs0XSA9PSAncycpCisjZGVmaW5lIGRvX3VwZGF0ZSAoRU5BQkxFX1VCSVVQREFURVZPTCAmJiBhcHBsZXRfbmFtZVszXSA9PSAndScpCisKKy8vdXNhZ2U6I2RlZmluZSB1YmlhdHRhY2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1tIE1URF9OVU0gWy1kIFVCSV9OVU1dIFVCSV9DVFJMX0RFViIKKy8vdXNhZ2U6I2RlZmluZSB1YmlhdHRhY2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJBdHRhY2ggTVREIGRldmljZSB0byBVQklcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTVREX05VTQlNVEQgZGV2aWNlIG51bWJlciB0byBhdHRhY2giCisvL3VzYWdlOiAgICAgIlxuCS1kIFVCSV9OVU0JVUJJIGRldmljZSBudW1iZXIgdG8gYXNzaWduIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1YmlkZXRhY2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1kIFVCSV9OVU0gVUJJX0NUUkxfREVWIgorLy91c2FnZTojZGVmaW5lIHViaWRldGFjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRldGFjaCBNVEQgZGV2aWNlIGZyb20gVUJJXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kIFVCSV9OVU0JVUJJIGRldmljZSBudW1iZXIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHViaW1rdm9sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVQklfREVWSUNFIC1OIE5BTUUgLXMgU0laRSIKKy8vdXNhZ2U6I2RlZmluZSB1Ymlta3ZvbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBVQkkgdm9sdW1lXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hIEFMSUdOTUVOVAlWb2x1bWUgYWxpZ25tZW50IChkZWZhdWx0IDEpIgorLy91c2FnZTogICAgICJcbgktbiBWT0xJRAlWb2x1bWUgSUQsIGlmIG5vdCBzcGVjaWZpZWQsIGl0IgorLy91c2FnZTogICAgICJcbgkJCXdpbGwgYmUgYXNzaWduZWQgYXV0b21hdGljYWxseSIKKy8vdXNhZ2U6ICAgICAiXG4JLU4gTkFNRQkJVm9sdW1lIG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNJWkUJCVNpemUgaW4gYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS10IFRZUEUJCVZvbHVtZSB0eXBlIChzdGF0aWN8ZHluYW1pYykiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHViaXJtdm9sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVQklfREVWSUNFIC1uIFZPTElEIgorLy91c2FnZTojZGVmaW5lIHViaXJtdm9sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlIFVCSSB2b2x1bWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gVk9MSUQJVm9sdW1lIElEIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1Ymlyc3ZvbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVUJJX0RFVklDRSAtbiBWT0xJRCAtcyBTSVpFIgorLy91c2FnZTojZGVmaW5lIHViaXJzdm9sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzaXplIFVCSSB2b2x1bWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gVk9MSUQJVm9sdW1lIElEIHRvIHJlc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0laRQkJU2l6ZSBpbiBieXRlcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdWJpdXBkYXRldm9sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVQklfREVWSUNFIFtJTUdfRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgdWJpdXBkYXRldm9sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVXBkYXRlIFVCSSB2b2x1bWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVHJ1bmNhdGUgVUJJIHZvbHVtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0laRQlCeXRlcyBpbiBpbnB1dCAoaWYgcmVhZGluZyBzdGRpbikiCisKKworaW50IHViaV90b29sc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdWJpX3Rvb2xzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKnViaV9jdHJsOworCS8vc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCWludCBtdGRfbnVtOworCWludCBkZXZfbnVtID0gVUJJX0RFVl9OVU1fQVVUTzsKKwlpbnQgdm9sX2lkID0gVUJJX1ZPTF9OVU1fQVVUTzsKKwljaGFyICp2b2xfbmFtZSA9IE5VTEw7CisJaW50IHNpemVfYnl0ZXM7CisJaW50IGFsaWdubWVudCA9IDE7CisJY2hhciAqdHlwZSA9IE5VTEw7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTptKzpkKzpuKzpzKzphKyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJtOmQ6bjpOOnM6YTp0OjoiLAorCQkJJm10ZF9udW0sICZkZXZfbnVtLCAmdm9sX2lkLAorCQkJJnZvbF9uYW1lLCAmc2l6ZV9ieXRlcywgJmFsaWdubWVudCwgJnR5cGUKKwkpOworCXViaV9jdHJsID0gYXJndltvcHRpbmRdOworCisJZmQgPSB4b3Blbih1YmlfY3RybCwgT19SRFdSKTsKKwkvL3hmc3RhdChmZCwgJnN0LCB1YmlfY3RybCk7CisJLy9pZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpCisJLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBub3QgYSBjaGFyIGRldmljZSIsIHViaV9jdHJsKTsKKworCWlmIChkb19hdHRhY2gpIHsKKwkJc3RydWN0IHViaV9hdHRhY2hfcmVxIHJlcTsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9NKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBkZXZpY2Ugbm90IHNwZWNpZmllZCIsICJNVEQiKTsKKworCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCQlyZXEubXRkX251bSA9IG10ZF9udW07CisJCXJlcS51YmlfbnVtID0gZGV2X251bTsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NBVFQsICZyZXEpOworCX0gZWxzZQorCWlmIChkb19kZXRhY2gpIHsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9EKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBkZXZpY2Ugbm90IHNwZWNpZmllZCIsICJVQkkiKTsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NERVQsICZkZXZfbnVtKTsKKwl9IGVsc2UKKwlpZiAoZG9fbWt2b2wpIHsKKwkJc3RydWN0IHViaV9ta3ZvbF9yZXEgcmVxOworCQlpbnQgdm9sX25hbWVfbGVuOworCQlpZiAoIShvcHRzICYgT1BUSU9OX3MpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHNpemUgbm90IHNwZWNpZmllZCIsICJVQkkiKTsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9OKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBuYW1lIG5vdCBzcGVjaWZpZWQiLCAiVUJJIik7CisJCXZvbF9uYW1lX2xlbiA9IHN0cmxlbih2b2xfbmFtZSk7CisJCWlmICh2b2xfbmFtZV9sZW4gPiBVQklfTUFYX1ZPTFVNRV9OQU1FKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHZvbHVtZSBuYW1lIHRvbyBsb25nIiwgIlVCSSIpOworCisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJCXJlcS52b2xfaWQgPSB2b2xfaWQ7CisJCWlmICgob3B0cyAmIE9QVElPTl90KSAmJiB0eXBlKSB7CisJCQlpZiAodHlwZVswXSA9PSAncycpCisJCQkJcmVxLnZvbF90eXBlID0gVUJJX1NUQVRJQ19WT0xVTUU7CisJCQllbHNlCisJCQkJcmVxLnZvbF90eXBlID0gVUJJX0RZTkFNSUNfVk9MVU1FOworCQl9IGVsc2UgeworCQkJcmVxLnZvbF90eXBlID0gVUJJX0RZTkFNSUNfVk9MVU1FOworCQl9CisJCXJlcS5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CisJCXJlcS5ieXRlcyA9IHNpemVfYnl0ZXM7CisJCXN0cm5jcHkocmVxLm5hbWUsIHZvbF9uYW1lLCBVQklfTUFYX1ZPTFVNRV9OQU1FKTsKKwkJcmVxLm5hbWVfbGVuID0gdm9sX25hbWVfbGVuOworCisJCXhpb2N0bChmZCwgVUJJX0lPQ01LVk9MLCAmcmVxKTsKKwl9IGVsc2UKKwlpZiAoZG9fcm12b2wpIHsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9uKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB2b2x1bWUgaWQgbm90IHNwZWNpZmllZCIsICJVQkkiKTsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NSTVZPTCwgJnZvbF9pZCk7CisJfSBlbHNlCisJaWYgKGRvX3Jzdm9sKSB7CisJCXN0cnVjdCB1YmlfcnN2b2xfcmVxIHJlcTsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9zKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBzaXplIG5vdCBzcGVjaWZpZWQiLCAiVUJJIik7CisJCWlmICghKG9wdHMgJiBPUFRJT05fbikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdm9sdW1lIGlkIG5vdCBzcGVjaWZpZWQiLCAiVUJJIik7CisKKwkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwkJcmVxLmJ5dGVzID0gc2l6ZV9ieXRlczsKKwkJcmVxLnZvbF9pZCA9IHZvbF9pZDsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NSU1ZPTCwgJnJlcSk7CisJfSBlbHNlCisJaWYgKGRvX3VwZGF0ZSkgeworCQlsb25nIGxvbmcgYnl0ZXM7CisKKwkJaWYgKG9wdHMgJiBPUFRJT05fdCkgeworCQkJLy8gdHJ1bmNhdGUgdGhlIHZvbHVtZSBieSBzdGFydGluZyBhbiB1cGRhdGUgZm9yIHNpemUgMAorCQkJYnl0ZXMgPSAwOworCQkJeGlvY3RsKGZkLCBVQklfSU9DVk9MVVAsICZieXRlcyk7CisJCX0KKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCWNoYXIgYnVmW3NpemVvZigiL3N5cy9jbGFzcy91YmkvdWJpJWRfJWQvdXNhYmxlX2ViX3NpemUiKSArIDIgKiBzaXplb2YoaW50KSozXTsKKwkJCWludCBpbnB1dF9mZDsKKwkJCXVuc2lnbmVkIHViaW51bSwgdm9sbnVtOworCQkJdW5zaWduZWQgbGViX3NpemU7CisJCQlzc2l6ZV90IGxlbjsKKwkJCWNoYXIgKmlucHV0X2RhdGE7CisKKwkJCS8vIE1ha2UgYXNzdW1wdGlvbiB0aGF0IGRldmljZSBub3QgaXMgaW4gbm9ybWFsIGZvcm1hdC4KKwkJCS8vIFJlbW92ZXMgbmVlZCBmb3Igc2Nhbm5pbmcgc3lzZnMgdHJlZSBhcyBmdWxsIGxpYnViaSBkb2VzCisJCQlpZiAoc3NjYW5mKHViaV9jdHJsLCAiL2Rldi91YmkldV8ldSIsICZ1YmludW0sICZ2b2xudW0pICE9IDIpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHZvbHVtZSBub2RlIG5vdCBpbiBjb3JyZWN0IGZvcm1hdCIsICJVQkkiKTsKKworCQkJc3ByaW50ZihidWYsICIvc3lzL2NsYXNzL3ViaS91YmkldV8ldS91c2FibGVfZWJfc2l6ZSIsIHViaW51bSwgdm9sbnVtKTsKKwkJCWlmIChvcGVuX3JlYWRfY2xvc2UoYnVmLCBidWYsIHNpemVvZihidWYpKSA8PSAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBjb3VsZCBub3QgZ2V0IExFQiBzaXplIiwgIlVCSSIpOworCQkJaWYgKHNzY2FuZihidWYsICIldSIsICZsZWJfc2l6ZSkgIT0gMSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgY291bGQgbm90IGdldCBMRUIgc2l6ZSIsICJVQkkiKTsKKworCQkJaWYgKG9wdHMgJiBPUFRJT05fcykgeworCQkJCWlucHV0X2ZkID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFhcmd2W29wdGluZCsxXSkKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCXhzdGF0KGFyZ3Zbb3B0aW5kKzFdLCAmc3QpOworCQkJCXNpemVfYnl0ZXMgPSBzdC5zdF9zaXplOworCQkJCWlucHV0X2ZkID0geG9wZW4oYXJndltvcHRpbmQrMV0sIE9fUkRPTkxZKTsKKwkJCX0KKworCQkJYnl0ZXMgPSBzaXplX2J5dGVzOworCQkJeGlvY3RsKGZkLCBVQklfSU9DVk9MVVAsICZieXRlcyk7CisKKwkJCWlucHV0X2RhdGEgPSB4bWFsbG9jKGxlYl9zaXplKTsKKwkJCXdoaWxlICgobGVuID0gZnVsbF9yZWFkKGlucHV0X2ZkLCBpbnB1dF9kYXRhLCBsZWJfc2l6ZSkpID4gMCkgeworCQkJCXh3cml0ZShmZCwgaW5wdXRfZGF0YSwgbGVuKTsKKwkJCX0KKwkJCWlmIChsZW4gPCAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB2b2x1bWUgdXBkYXRlIGZhaWxlZCIsICJVQkkiKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQljbG9zZShpbnB1dF9mZCk7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvdm9sbmFtZS5jIGIvbWlzY3V0aWxzL3ZvbG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBlNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3ZvbG5hbWUuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogUmVhZHMgYW5kIGRpc3BsYXlzIENELVJPTSB2b2x1bWUgbmFtZQorICoKKyAqIFNldmVyYWwgcGVvcGxlIGhhdmUgYXNrZWQgaG93IHRvIHJlYWQgQ0Qgdm9sdW1lIG5hbWVzIHNvIEkgd3JvdGUgdGhpcworICogc21hbGwgcHJvZ3JhbSB0byBkbyBpdC4KKyAqCisgKiB1c2FnZTogdm9sbmFtZSBbPGRldmljZS1maWxlPl0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBKZWZmIFRyYW50ZXIgKHRyYW50ZXJAcG9ib3guY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIG1vZHMgZnJvbSBkaXN0cmlidXRlZCBzb3VyY2UgKGVqZWN0LTIuMC4xMykgYXJlIGJ5CisgKiBNYXR0aGV3IFN0b2x0ZW5iZXJnIDxkM21hdHRAZ21haWwuY29tPgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB2b2xuYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSB2b2xuYW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdyBDRCB2b2x1bWUgbmFtZSBvZiB0aGUgREVWSUNFIChkZWZhdWx0IC9kZXYvY2Ryb20pIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHZvbG5hbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHZvbG5hbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwljaGFyIGJ1ZmZlclszMl07CisJY29uc3QgY2hhciAqZGV2aWNlOworCisJZGV2aWNlID0gIi9kZXYvY2Ryb20iOworCWlmIChhcmd2WzFdKSB7CisJCWRldmljZSA9IGFyZ3ZbMV07CisJCWlmIChhcmd2WzJdKQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWZkID0geG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJeGxzZWVrKGZkLCAzMjgwOCwgU0VFS19TRVQpOworCXhyZWFkKGZkLCBidWZmZXIsIDMyKTsKKwlwcmludGYoIiUzMi4zMnNcbiIsIGJ1ZmZlcik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWNsb3NlKGZkKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvd2FsbC5jIGIvbWlzY3V0aWxzL3dhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJmNTNiCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3dhbGwuYwpAQCAtMCwwICsxLDQ0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3YWxsIC0gd3JpdGUgYSBtZXNzYWdlIHRvIGFsbCBsb2dnZWQtaW4gdXNlcnMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB3YWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgd2FsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIldyaXRlIGNvbnRlbnQgb2YgRklMRSBvciBzdGRpbiB0byBhbGwgbG9nZ2VkLWluIHVzZXJzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB3YWxsX3NhbXBsZV91c2FnZQorLy91c2FnZToJImVjaG8gZm9vIHwgd2FsbFxuIgorLy91c2FnZToJIndhbGwgLi9teW1lc3NhZ2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgd2FsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2FsbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXAgKnV0OworCWNoYXIgKm1zZzsKKwlpbnQgZmQgPSBhcmd2WzFdID8geG9wZW4oYXJndlsxXSwgT19SRE9OTFkpIDogU1RESU5fRklMRU5POworCisJbXNnID0geG1hbGxvY19yZWFkKGZkLCBOVUxMKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgYXJndlsxXSkKKwkJY2xvc2UoZmQpOworCXNldHV0ZW50KCk7CisJd2hpbGUgKCh1dCA9IGdldHV0ZW50KCkpICE9IE5VTEwpIHsKKwkJY2hhciAqbGluZTsKKwkJaWYgKHV0LT51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykKKwkJCWNvbnRpbnVlOworCQlsaW5lID0gY29uY2F0X3BhdGhfZmlsZSgiL2RldiIsIHV0LT51dF9saW5lKTsKKwkJeG9wZW5feHdyaXRlX2Nsb3NlKGxpbmUsIG1zZyk7CisJCWZyZWUobGluZSk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQllbmR1dGVudCgpOworCQlmcmVlKG1zZyk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvd2F0Y2hkb2cuYyBiL21pc2N1dGlscy93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjhkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvd2F0Y2hkb2cuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB3YXRjaGRvZyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiAgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIDxidXN5Ym94QGJ1c3lib3gubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBEYXJpdXMgQXVndWxpcyA8YXVndWxpcy5kYXJpdXNAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHdhdGNoZG9nX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXQgTlttc11dIFstVCBOW21zXV0gWy1GXSBERVYiCisvL3VzYWdlOiNkZWZpbmUgd2F0Y2hkb2dfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQZXJpb2RpY2FsbHkgd3JpdGUgdG8gd2F0Y2hkb2cgZGV2aWNlIERFVlxuIgorLy91c2FnZTogICAgICJcbgktVCBOCVJlYm9vdCBhZnRlciBOIHNlY29uZHMgaWYgbm90IHJlc2V0IChkZWZhdWx0IDYwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgTglSZXNldCBldmVyeSBOIHNlY29uZHMgKGRlZmF1bHQgMzApIgorLy91c2FnZTogICAgICJcbgktRglSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuVXNlIDUwMG1zIHRvIHNwZWNpZnkgcGVyaW9kIGluIG1pbGxpc2Vjb25kcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGludXgvdHlwZXMuaCIgLyogZm9yIF9fdTMyICovCisjaW5jbHVkZSAibGludXgvd2F0Y2hkb2cuaCIKKworI2RlZmluZSBPUFRfRk9SRUdST1VORCAgKDEgPDwgMCkKKyNkZWZpbmUgT1BUX1NUSU1FUiAgICAgICgxIDw8IDEpCisjZGVmaW5lIE9QVF9IVElNRVIgICAgICAoMSA8PCAyKQorCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19zaHV0ZG93bihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBWID0gJ1YnOworCisJd3JpdGUoMywgJlYsIDEpOyAgLyogTWFnaWMsIHNlZSB3YXRjaGRvZy1hcGkudHh0IGluIGtlcm5lbCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoMyk7CisJX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworaW50IHdhdGNoZG9nX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3YXRjaGRvZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IHN1ZmZpeGVzW10gPSB7CisJCXsgIm1zIiwgMSB9LAorCQl7ICIiLCAxMDAwIH0sCisJCXsgIiIsIDAgfQorCX07CisKKwl1bnNpZ25lZCBvcHRzOworCXVuc2lnbmVkIHN0aW1lcl9kdXJhdGlvbjsgLyogaG93IG9mdGVuIHRvIHJlc3RhcnQgKi8KKwl1bnNpZ25lZCBodGltZXJfZHVyYXRpb24gPSA2MDAwMDsgLyogcmVib290cyBhZnRlciBOIG1zIGlmIG5vdCByZXN0YXJ0ZWQgKi8KKwljaGFyICpzdF9hcmc7CisJY2hhciAqaHRfYXJnOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBtdXN0IGhhdmUgZXhhY3RseSAxIGFyZ3VtZW50ICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJGdDpUOiIsICZzdF9hcmcsICZodF9hcmcpOworCisJLyogV2UgbmVlZCB0byBkYWVtb25pemUgKmJlZm9yZSogb3BlbmluZyB0aGUgd2F0Y2hkb2cgYXMgbWFueSBkcml2ZXJzCisJICogd2lsbCBvbmx5IGFsbG93IG9uZSBwcm9jZXNzIGF0IGEgdGltZSB0byBkbyBzby4gIFNpbmNlIGRhZW1vbml6aW5nCisJICogaXMgbm90IHBlcmZlY3QgKGNoaWxkIG1heSBydW4gYmVmb3JlIHBhcmVudCBmaW5pc2hlcyBleGl0aW5nKSwgd2UKKwkgKiBjYW4ndCByZWx5IG9uIHBhcmVudCBleGl0aW5nIGJlZm9yZSB1cyAobGV0IGFsb25lICpjbGVhbmx5KiByZWxlYXNpbmcKKwkgKiB0aGUgd2F0Y2hkb2cgZmQgLS0gc29tZXRoaW5nIGVsc2UgdGhhdCBtYXkgbm90IGV2ZW4gYmUgYWxsb3dlZCkuCisJICovCisJaWYgKCEob3B0cyAmIE9QVF9GT1JFR1JPVU5EKSkKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DSERJUl9ST09ULCBhcmd2KTsKKworCWlmIChvcHRzICYgT1BUX0hUSU1FUikKKwkJaHRpbWVyX2R1cmF0aW9uID0geGF0b3Vfc2Z4KGh0X2FyZywgc3VmZml4ZXMpOworCXN0aW1lcl9kdXJhdGlvbiA9IGh0aW1lcl9kdXJhdGlvbiAvIDI7CisJaWYgKG9wdHMgJiBPUFRfU1RJTUVSKQorCQlzdGltZXJfZHVyYXRpb24gPSB4YXRvdV9zZngoc3RfYXJnLCBzdWZmaXhlcyk7CisKKwliYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIHdhdGNoZG9nX3NodXRkb3duKTsKKworCS8qIFVzZSBrbm93biBmZCAjIC0gYXZvaWQgbmVlZGluZyBnbG9iYWwgJ2ludCBmZCcgKi8KKwl4bW92ZV9mZCh4b3Blbihhcmd2W2FyZ2MgLSAxXSwgT19XUk9OTFkpLCAzKTsKKworCS8qIFdESU9DX1NFVFRJTUVPVVQgdGFrZXMgc2Vjb25kcywgbm90IG1pbGxpc2Vjb25kcyAqLworCWh0aW1lcl9kdXJhdGlvbiA9IGh0aW1lcl9kdXJhdGlvbiAvIDEwMDA7CisjaWZuZGVmIFdESU9DX1NFVFRJTUVPVVQKKyMgZXJyb3IgV0RJT0NfU0VUVElNRU9VVCBpcyBub3QgZGVmaW5lZCwgY2Fubm90IGNvbXBpbGUgd2F0Y2hkb2cgYXBwbGV0CisjZWxzZQorIyBpZiBkZWZpbmVkIFdESU9DX1NFVE9QVElPTlMgJiYgZGVmaW5lZCBXRElPU19FTkFCTEVDQVJECisJeworCQlzdGF0aWMgY29uc3QgaW50IGVuYWJsZSA9IFdESU9TX0VOQUJMRUNBUkQ7CisJCWlvY3RsX29yX3dhcm4oMywgV0RJT0NfU0VUT1BUSU9OUywgKHZvaWQqKSAmZW5hYmxlKTsKKwl9CisjIGVuZGlmCisJaW9jdGxfb3Jfd2FybigzLCBXRElPQ19TRVRUSU1FT1VULCAmaHRpbWVyX2R1cmF0aW9uKTsKKyNlbmRpZgorCisjaWYgMAorCWlvY3RsX29yX3dhcm4oMywgV0RJT0NfR0VUVElNRU9VVCwgJmh0aW1lcl9kdXJhdGlvbik7CisJcHJpbnRmKCJ3YXRjaGRvZzogU1cgdGltZXIgaXMgJWRtcywgSFcgdGltZXIgaXMgJWRzXG4iLAorCQlzdGltZXJfZHVyYXRpb24sIGh0aW1lcl9kdXJhdGlvbiAqIDEwMDApOworI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIGNvdW50ZXIgYmVmb3JlIHNsZWVwaW5nLAorCQkgKiBhcyB0aGUgY291bnRlciB2YWx1ZSBpcyB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAtLSBQRk0KKwkJICovCisJCXdyaXRlKDMsICIiLCAxKTsgLyogd3JpdGUgemVybyBieXRlICovCisJCXVzbGVlcChzdGltZXJfZHVyYXRpb24gKiAxMDAwTCk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qIC0gbm90IHJlYWNoZWQsIGJ1dCBnY2MgNC4yLjEgaXMgdG9vIGR1bWIhICovCit9CmRpZmYgLS1naXQgYS9tb2R1dGlscy9Db25maWcuaW4gYi9tb2R1dGlscy9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5ZWEzMwotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL0NvbmZpZy5pbgpAQCAtMCwwICsxLDI2OSBAQAorIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IE1vZHVsZSBVdGlsaXRpZXMiCisKK2NvbmZpZyBNT0RJTkZPCisJYm9vbCAibW9kaW5mbyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaG93IGluZm9ybWF0aW9uIGFib3V0IGEgTGludXggS2VybmVsIG1vZHVsZQorCitjb25maWcgTU9EUFJPQkVfU01BTEwKKwlib29sICJTaW1wbGlmaWVkIG1vZHV0aWxzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNpbXBsaWZpZWQgbW9kdXRpbHMuCisKKwkgIFdpdGggdGhpcyBvcHRpb24gbW9kcHJvYmUgZG9lcyBub3QgcmVxdWlyZSBtb2R1bGVzLmRlcCBmaWxlCisJICBhbmQgZG9lcyBub3QgdXNlIC9ldGMvbW9kdWxlcy5jb25mIGZpbGUuCisJICBJdCBzY2FucyBtb2R1bGUgZmlsZXMgaW4gL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgYW5kCisJICBkZXRlcm1pbmVzIGRlcGVuZGVuY2llcyBhbmQgbW9kdWxlIGFsaWFzIG5hbWVzIG9uIHRoZSBmbHkuCisJICBUaGlzIG1heSBtYWtlIG1vZHVsZSBsb2FkaW5nIHNsb3dlciwgbW9zdCBub3RhYmx5CisJICB3aGVuIG9uZSBuZWVkcyB0byBsb2FkIG1vZHVsZSBieSBhbGlhcyAodGhpcyByZXF1aXJlcworCSAgc2Nhbm5pbmcgdGhyb3VnaCBtb2R1bGUgX2JvZGllc18pLgorCisJICBBdCB0aGUgZmlyc3QgYXR0ZW1wdCB0byBsb2FkIGEgbW9kdWxlIGJ5IGFsaWFzIG1vZHByb2JlCisJICB3aWxsIHRyeSB0byBnZW5lcmF0ZSBtb2R1bGVzLmRlcC5iYiBmaWxlIGluIG9yZGVyIHRvIHNwZWVkIHVwCisJICBmdXR1cmUgbG9hZHMgYnkgYWxpYXMuIEZhaWx1cmUgdG8gZG8gc28gKHJlYWQtb25seSAvbGliL21vZHVsZXMsCisJICBldGMpIGlzIG5vdCByZXBvcnRlZCwgYW5kIGZ1dHVyZSBtb2Rwcm9iZXMgd2lsbCBiZSBzbG93IHRvby4KKworCSAgTkI6IG1vZHVsZXMuZGVwLmJiIGZpbGUgZm9ybWF0IGlzIG5vdCBjb21wYXRpYmxlCisJICB3aXRoIG1vZHVsZXMuZGVwIGZpbGUgYXMgY3JlYXRlZC91c2VkIGJ5IHN0YW5kYXJkIG1vZHVsZSB0b29scy4KKworCSAgQWRkaXRpb25hbCBtb2R1bGUgcGFyYW1ldGVycyBjYW4gYmUgc3RvcmVkIGluCisJICAvZXRjL21vZHVsZXMvJG1vZHVsZV9uYW1lIGZpbGVzLgorCisJICBBcGFydCBmcm9tIG1vZHByb2JlLCBvdGhlciB1dGlsaXRpZXMgYXJlIGFsc28gcHJvdmlkZWQ6CisJICAtIGluc21vZCBpcyBhbiBhbGlhcyB0byBtb2Rwcm9iZQorCSAgLSBybW1vZCBpcyBhbiBhbGlhcyB0byBtb2Rwcm9iZSAtcgorCSAgLSBkZXBtb2QgZ2VuZXJhdGVzIG1vZHVsZXMuZGVwLmJiCisKKwkgIEFzIG9mIDIwMDgtMDcsIHRoaXMgY29kZSBpcyBleHBlcmltZW50YWwuIEl0IGlzIDE0a2Igc21hbGxlcgorCSAgdGhhbiAibm9uLXNtYWxsIiBtb2R1dGlscy4KKworY29uZmlnIEZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FCisJYm9vbCAiQWNjZXB0IG1vZHVsZSBvcHRpb25zIG9uIG1vZHByb2JlIGNvbW1hbmQgbGluZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQWxsb3cgaW5zbW9kIGFuZCBtb2Rwcm9iZSB0YWtlIG1vZHVsZSBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lLgorCitjb25maWcgRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRAorCWJvb2wgIlNraXAgbG9hZGluZyBvZiBhbHJlYWR5IGxvYWRlZCBtb2R1bGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9EUFJPQkVfU01BTEwKKwloZWxwCisJICBDaGVjayBpZiB0aGUgbW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkLgorCitjb25maWcgSU5TTU9ECisJYm9vbCAiaW5zbW9kIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgaW5zbW9kIGlzIHVzZWQgdG8gbG9hZCBzcGVjaWZpZWQgbW9kdWxlcyBpbiB0aGUgcnVubmluZyBrZXJuZWwuCisKK2NvbmZpZyBSTU1PRAorCWJvb2wgInJtbW9kIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgcm1tb2QgaXMgdXNlZCB0byB1bmxvYWQgc3BlY2lmaWVkIG1vZHVsZXMgZnJvbSB0aGUga2VybmVsLgorCitjb25maWcgTFNNT0QKKwlib29sICJsc21vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGxzbW9kIGlzIHVzZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUCisJYm9vbCAiUHJldHR5IG91dHB1dCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIExTTU9ECisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBvcHRpb24gbWFrZXMgb3V0cHV0IGZvcm1hdCBvZiBsc21vZCBhZGp1c3RlZCB0bworCSAgdGhlIGZvcm1hdCBvZiBtb2R1bGUtaW5pdC10b29scyBmb3IgTGludXgga2VybmVsIDIuNi4KKwkgIEluY3JlYXNlcyBzaXplIHNvbWV3aGF0LgorCitjb25maWcgTU9EUFJPQkUKKwlib29sICJtb2Rwcm9iZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEhhbmRsZSB0aGUgbG9hZGluZyBvZiBtb2R1bGVzLCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIG9uIGEgaGlnaAorCSAgbGV2ZWwuCisKK2NvbmZpZyBGRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVAorCWJvb2wgIkJsYWNrbGlzdCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTU9EUFJPQkUKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTYXkgJ3knIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSAnYmxhY2tsaXN0JyBjb21tYW5kIGluCisJICBtb2Rwcm9iZS5jb25mLiBUaGlzIHByZXZlbnRzIHRoZSBhbGlhcyByZXNvbHZlciB0byByZXNvbHZlCisJICBibGFja2xpc3RlZCBtb2R1bGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHlvdXIKKwkgIGhhcmR3YXJlIGF1dG9kZXRlY3Rpb24gc2NyaXB0cyB0byBsb2FkIG1vZHVsZXMgbGlrZSBldmRldiwgZnJhbWUKKwkgIGJ1ZmZlciBkcml2ZXJzIGV0Yy4KKworY29uZmlnIERFUE1PRAorCWJvb2wgImRlcG1vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGRlcG1vZCBnZW5lcmF0ZXMgbW9kdWxlcy5kZXAgKGFuZCBwb3RlbnRpYWxseSBtb2R1bGVzLmFsaWFzCisJICBhbmQgbW9kdWxlcy5zeW1ib2xzKSB0aGF0IGNvbnRhaW4gZGVwZW5kZW5jeSBpbmZvcm1hdGlvbgorCSAgZm9yIG1vZHByb2JlLgorCitjb21tZW50ICJPcHRpb25zIGNvbW1vbiB0byBtdWx0aXBsZSBtb2R1dGlscyIKKworY29uZmlnIEZFQVRVUkVfMl80X01PRFVMRVMKKwlib29sICJTdXBwb3J0IHZlcnNpb24gMi4yLzIuNCBMaW51eCBrZXJuZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gSU5TTU9EIHx8IFJNTU9EIHx8IExTTU9ECisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCBtb2R1bGUgbG9hZGluZyBmb3IgMi4yLnggYW5kIDIuNC54IExpbnV4IGtlcm5lbHMuCisJICBUaGlzIGluY3JlYXNlcyBzaXplIGNvbnNpZGVyYWJseS4gU2F5IE4gdW5sZXNzIHlvdSBwbGFuCisJICB0byBydW4gYW5jaWVudCBrZXJuZWxzLgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAKKwlib29sICJUcnkgdG8gbG9hZCBtb2R1bGUgZnJvbSBhIG1tYXAnZWQgYXJlYSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElOU01PRCB8fCBNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNhdXNlcyBtb2R1bGUgbG9hZGluZyBjb2RlIHRvIHRyeSB0byBtbWFwCisJICBtb2R1bGUgZmlyc3QuIElmIGl0IGRvZXMgbm90IHdvcmsgKGZvciBleGFtcGxlLAorCSAgaXQgZG9lcyBub3Qgd29yayBmb3IgY29tcHJlc3NlZCBtb2R1bGVzKSwgbW9kdWxlIHdpbGwgYmUgcmVhZAorCSAgKGFuZCB1bnBhY2tlZCBpZiBuZWVkZWQpIGludG8gYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGJ5IG1hbGxvYy4KKworCSAgVGhlIG9ubHkgY2FzZSB3aGVuIG1tYXAgd29ya3MgYnV0IG1hbGxvYyBkb2VzIG5vdCBpcyB3aGVuCisJICB5b3UgYXJlIHRyeWluZyB0byBsb2FkIGEgYmlnIG1vZHVsZSBvbiBhIHZlcnkgbWVtb3J5LWNvbnN0cmFpbmVkCisJICBtYWNoaW5lLiBNYWxsb2Mgd2lsbCBtb21lbnRhcmlseSBuZWVkIDJ4IGFzIG11Y2ggbWVtb3J5IGFzIG1tYXAuCisKKwkgIENob29zaW5nIE4gc2F2ZXMgYWJvdXQgMjUwIGJ5dGVzIG9mIGNvZGUgKG9uIDMyLWJpdCB4ODYpLgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCWJvb2wgIkVuYWJsZSBtb2R1bGUgdmVyc2lvbiBjaGVja2luZyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgKElOU01PRCB8fCBNT0RQUk9CRSkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTdXBwb3J0IGNoZWNraW5nIG9mIHZlcnNpb25zIGZvciBtb2R1bGVzLiBUaGlzIGlzIHVzZWQgdG8KKwkgIGVuc3VyZSB0aGF0IHRoZSBrZXJuZWwgYW5kIG1vZHVsZSBhcmUgbWFkZSBmb3IgZWFjaCBvdGhlci4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMKKwlib29sICJBZGQgbW9kdWxlIHN5bWJvbHMgdG8ga2VybmVsIHN5bWJvbCB0YWJsZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgKElOU01PRCB8fCBNT0RQUk9CRSkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBCeSBhZGRpbmcgbW9kdWxlIHN5bWJvbHMgdG8gdGhlIGtlcm5lbCBzeW1ib2wgdGFibGUsIE9vcHMgbWVzc2FnZXMKKwkgIG9jY3VyaW5nIHdpdGhpbiBrZXJuZWwgbW9kdWxlcyBjYW4gYmUgcHJvcGVybHkgZGVidWdnZWQuIEJ5IGVuYWJsaW5nCisJICB0aGlzIGZlYXR1cmUsIG1vZHVsZSBzeW1ib2xzIHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBrZXJuZWwgc3ltYm9sCisJICB0YWJsZSBmb3IgcHJvcGVyIGRlYnVnZ2luZyBzdXBwb3J0LiBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluCisJICBPb3BzIG1lc3NhZ2VzIGZyb20ga2VybmVsIG1vZHVsZXMsIHNheSBOLgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQorCWJvb2wgIkluIGtlcm5lbCBtZW1vcnkgb3B0aW1pemF0aW9uICh1Q2xpbnV4IG9ubHkpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV8yXzRfTU9EVUxFUyAmJiAoSU5TTU9EIHx8IE1PRFBST0JFKQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgaXMgYSBzcGVjaWFsIHVDbGludXggb25seSBtZW1vcnkgb3B0aW1pemF0aW9uIHRoYXQgbGV0cyBpbnNtb2QKKwkgIGxvYWQgdGhlIHNwZWNpZmllZCBrZXJuZWwgbW9kdWxlIGRpcmVjdGx5IGludG8ga2VybmVsIHNwYWNlLCByZWR1Y2luZworCSAgbWVtb3J5IHVzYWdlIGJ5IHByZXZlbnRpbmcgdGhlIG5lZWQgZm9yIHR3byBjb3BpZXMgb2YgdGhlIG1vZHVsZQorCSAgYmVpbmcgbG9hZGVkIGludG8gbWVtb3J5LgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAKKwlib29sICJFbmFibGUgaW5zbW9kIGxvYWQgbWFwICgtbSkgb3B0aW9uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV8yXzRfTU9EVUxFUyAmJiBJTlNNT0QKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbmFibGluZyB0aGlzLCBvbmUgd291bGQgYmUgYWJsZSB0byBnZXQgYSBsb2FkIG1hcAorCSAgb3V0cHV0IG9uIHN0ZG91dC4gVGhpcyBtYWtlcyBrZXJuZWwgbW9kdWxlIGRlYnVnZ2luZworCSAgZWFzaWVyLgorCSAgSWYgeW91IGRvbid0IHBsYW4gdG8gZGVidWcga2VybmVsIG1vZHVsZXMsIHlvdQorCSAgZG9uJ3QgbmVlZCB0aGlzIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwKKwlib29sICJTeW1ib2xzIGluIGxvYWQgbWFwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgJiYgIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgV2l0aG91dCB0aGlzIG9wdGlvbiwgLW0gd2lsbCBvbmx5IG91dHB1dCBzZWN0aW9uCisJICBsb2FkIG1hcC4gV2l0aCB0aGlzIG9wdGlvbiwgLW0gd2lsbCBhbHNvIG91dHB1dAorCSAgc3ltYm9scyBsb2FkIG1hcC4KKworY29uZmlnIEZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUKKwlib29sICJTdXBwb3J0IHRhaW50ZWQgbW9kdWxlIGNoZWNraW5nIHdpdGggbmV3IGtlcm5lbHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiAoTFNNT0QgfHwgRkVBVFVSRV8yXzRfTU9EVUxFUykgJiYgIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCBjaGVja2luZyBmb3IgdGFpbnRlZCBtb2R1bGVzLiBUaGVzZSBhcmUgdXN1YWxseSBiaW5hcnkKKwkgIG9ubHkgbW9kdWxlcyB0aGF0IHdpbGwgbWFrZSB0aGUgbGludXgta2VybmVsIGxpc3QgaWdub3JlIHlvdXIKKwkgIHN1cHBvcnQgcmVxdWVzdC4KKwkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgR1BMT05MWSBtb2R1bGVzLgorCitjb25maWcgRkVBVFVSRV9NT0RVVElMU19BTElBUworCWJvb2wgIlN1cHBvcnQgZm9yIG1vZHVsZS5hbGlhc2VzIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZW5lcmF0ZSBhbmQgcGFyc2UgbW9kdWxlcy5hbGlhcyBjb250YWluaW5nIGFsaWFzZXMgZm9yIGJ1cworCSAgaWRlbnRpZmllcnM6CisJICAgIGFsaWFzIHBjbWNpYTptKmMqZjAzZm4qcGZuKnBhKnBiKnBjKnBkKiBwYXJwb3J0X2NzCisKKwkgIGFuZCBhbGlhc2VzIGZvciBsb2dpY2FsIG1vZHVsZXMgbmFtZXMgZS5nLjoKKwkgICAgYWxpYXMgcGFkbG9ja19hZXMgYWVzCisJICAgIGFsaWFzIGFlc19pNTg2IGFlcworCSAgICBhbGlhcyBhZXNfZ2VuZXJpYyBhZXMKKworCSAgU2F5IFkgaWYgdW5zdXJlLgorCitjb25maWcgRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTCisJYm9vbCAiU3VwcG9ydCBmb3IgbW9kdWxlLnN5bWJvbHMgZmlsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERFUE1PRCB8fCBNT0RQUk9CRQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEdlbmVyYXRlIGFuZCBwYXJzZSBtb2R1bGVzLnN5bWJvbHMgY29udGFpbmluZyBhbGlhc2VzIGZvcgorCSAgc3ltYm9sX3JlcXVlc3QoKSBrZXJuZWwgY2FsbHMsIHN1Y2ggYXM6CisJICAgIGFsaWFzIHN5bWJvbDp1c2Jfc2dfaW5pdCB1c2Jjb3JlCisKKwkgIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnIERFRkFVTFRfTU9EVUxFU19ESVIKKwlzdHJpbmcgIkRlZmF1bHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbW9kdWxlcyIKKwlkZWZhdWx0ICIvbGliL21vZHVsZXMiCisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUgfHwgTU9EUFJPQkVfU01BTEwgfHwgTU9ESU5GTworCWhlbHAKKwkgIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGtlcm5lbCBtb2R1bGVzLgorCSAgRGVmYXVsdHMgdG8gIi9saWIvbW9kdWxlcyIKKworY29uZmlnIERFRkFVTFRfREVQTU9EX0ZJTEUKKwlzdHJpbmcgIkRlZmF1bHQgbmFtZSBvZiBtb2R1bGVzLmRlcCIKKwlkZWZhdWx0ICJtb2R1bGVzLmRlcCIKKwlkZXBlbmRzIG9uIERFUE1PRCB8fCBNT0RQUk9CRSB8fCBNT0RQUk9CRV9TTUFMTCB8fCBNT0RJTkZPCisJaGVscAorCSAgRmlsZW5hbWUgdGhhdCBjb250YWlucyBrZXJuZWwgbW9kdWxlcyBkZXBlbmRlbmNpZXMuCisJICBEZWZhdWx0cyB0byAibW9kdWxlcy5kZXAiCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21vZHV0aWxzL0NvbmZpZy5zcmMgYi9tb2R1dGlscy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWFjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjYzIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMaW51eCBNb2R1bGUgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIE1PRFBST0JFX1NNQUxMCisJYm9vbCAiU2ltcGxpZmllZCBtb2R1dGlscyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaW1wbGlmaWVkIG1vZHV0aWxzLgorCisJICBXaXRoIHRoaXMgb3B0aW9uIG1vZHByb2JlIGRvZXMgbm90IHJlcXVpcmUgbW9kdWxlcy5kZXAgZmlsZQorCSAgYW5kIGRvZXMgbm90IHVzZSAvZXRjL21vZHVsZXMuY29uZiBmaWxlLgorCSAgSXQgc2NhbnMgbW9kdWxlIGZpbGVzIGluIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgIGFuZAorCSAgZGV0ZXJtaW5lcyBkZXBlbmRlbmNpZXMgYW5kIG1vZHVsZSBhbGlhcyBuYW1lcyBvbiB0aGUgZmx5LgorCSAgVGhpcyBtYXkgbWFrZSBtb2R1bGUgbG9hZGluZyBzbG93ZXIsIG1vc3Qgbm90YWJseQorCSAgd2hlbiBvbmUgbmVlZHMgdG8gbG9hZCBtb2R1bGUgYnkgYWxpYXMgKHRoaXMgcmVxdWlyZXMKKwkgIHNjYW5uaW5nIHRocm91Z2ggbW9kdWxlIF9ib2RpZXNfKS4KKworCSAgQXQgdGhlIGZpcnN0IGF0dGVtcHQgdG8gbG9hZCBhIG1vZHVsZSBieSBhbGlhcyBtb2Rwcm9iZQorCSAgd2lsbCB0cnkgdG8gZ2VuZXJhdGUgbW9kdWxlcy5kZXAuYmIgZmlsZSBpbiBvcmRlciB0byBzcGVlZCB1cAorCSAgZnV0dXJlIGxvYWRzIGJ5IGFsaWFzLiBGYWlsdXJlIHRvIGRvIHNvIChyZWFkLW9ubHkgL2xpYi9tb2R1bGVzLAorCSAgZXRjKSBpcyBub3QgcmVwb3J0ZWQsIGFuZCBmdXR1cmUgbW9kcHJvYmVzIHdpbGwgYmUgc2xvdyB0b28uCisKKwkgIE5COiBtb2R1bGVzLmRlcC5iYiBmaWxlIGZvcm1hdCBpcyBub3QgY29tcGF0aWJsZQorCSAgd2l0aCBtb2R1bGVzLmRlcCBmaWxlIGFzIGNyZWF0ZWQvdXNlZCBieSBzdGFuZGFyZCBtb2R1bGUgdG9vbHMuCisKKwkgIEFkZGl0aW9uYWwgbW9kdWxlIHBhcmFtZXRlcnMgY2FuIGJlIHN0b3JlZCBpbgorCSAgL2V0Yy9tb2R1bGVzLyRtb2R1bGVfbmFtZSBmaWxlcy4KKworCSAgQXBhcnQgZnJvbSBtb2Rwcm9iZSwgb3RoZXIgdXRpbGl0aWVzIGFyZSBhbHNvIHByb3ZpZGVkOgorCSAgLSBpbnNtb2QgaXMgYW4gYWxpYXMgdG8gbW9kcHJvYmUKKwkgIC0gcm1tb2QgaXMgYW4gYWxpYXMgdG8gbW9kcHJvYmUgLXIKKwkgIC0gZGVwbW9kIGdlbmVyYXRlcyBtb2R1bGVzLmRlcC5iYgorCisJICBBcyBvZiAyMDA4LTA3LCB0aGlzIGNvZGUgaXMgZXhwZXJpbWVudGFsLiBJdCBpcyAxNGtiIHNtYWxsZXIKKwkgIHRoYW4gIm5vbi1zbWFsbCIgbW9kdXRpbHMuCisKK2NvbmZpZyBGRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORQorCWJvb2wgIkFjY2VwdCBtb2R1bGUgb3B0aW9ucyBvbiBtb2Rwcm9iZSBjb21tYW5kIGxpbmUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFsbG93IGluc21vZCBhbmQgbW9kcHJvYmUgdGFrZSBtb2R1bGUgb3B0aW9ucyBmcm9tIGNvbW1hbmQgbGluZS4KKworY29uZmlnIEZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQKKwlib29sICJTa2lwIGxvYWRpbmcgb2YgYWxyZWFkeSBsb2FkZWQgbW9kdWxlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PRFBST0JFX1NNQUxMCisJaGVscAorCSAgQ2hlY2sgaWYgdGhlIG1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4KKworY29uZmlnIElOU01PRAorCWJvb2wgImluc21vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGluc21vZCBpcyB1c2VkIHRvIGxvYWQgc3BlY2lmaWVkIG1vZHVsZXMgaW4gdGhlIHJ1bm5pbmcga2VybmVsLgorCitjb25maWcgUk1NT0QKKwlib29sICJybW1vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHJtbW9kIGlzIHVzZWQgdG8gdW5sb2FkIHNwZWNpZmllZCBtb2R1bGVzIGZyb20gdGhlIGtlcm5lbC4KKworY29uZmlnIExTTU9ECisJYm9vbCAibHNtb2QiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsc21vZCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzLgorCitjb25maWcgRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVAorCWJvb2wgIlByZXR0eSBvdXRwdXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBMU01PRAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIG91dHB1dCBmb3JtYXQgb2YgbHNtb2QgYWRqdXN0ZWQgdG8KKwkgIHRoZSBmb3JtYXQgb2YgbW9kdWxlLWluaXQtdG9vbHMgZm9yIExpbnV4IGtlcm5lbCAyLjYuCisJICBJbmNyZWFzZXMgc2l6ZSBzb21ld2hhdC4KKworY29uZmlnIE1PRFBST0JFCisJYm9vbCAibW9kcHJvYmUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBIYW5kbGUgdGhlIGxvYWRpbmcgb2YgbW9kdWxlcywgYW5kIHRoZWlyIGRlcGVuZGVuY2llcyBvbiBhIGhpZ2gKKwkgIGxldmVsLgorCitjb25maWcgRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QKKwlib29sICJCbGFja2xpc3Qgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1PRFBST0JFCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU2F5ICd5JyBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgJ2JsYWNrbGlzdCcgY29tbWFuZCBpbgorCSAgbW9kcHJvYmUuY29uZi4gVGhpcyBwcmV2ZW50cyB0aGUgYWxpYXMgcmVzb2x2ZXIgdG8gcmVzb2x2ZQorCSAgYmxhY2tsaXN0ZWQgbW9kdWxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcHJldmVudCB5b3VyCisJICBoYXJkd2FyZSBhdXRvZGV0ZWN0aW9uIHNjcmlwdHMgdG8gbG9hZCBtb2R1bGVzIGxpa2UgZXZkZXYsIGZyYW1lCisJICBidWZmZXIgZHJpdmVycyBldGMuCisKK2NvbmZpZyBERVBNT0QKKwlib29sICJkZXBtb2QiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBkZXBtb2QgZ2VuZXJhdGVzIG1vZHVsZXMuZGVwIChhbmQgcG90ZW50aWFsbHkgbW9kdWxlcy5hbGlhcworCSAgYW5kIG1vZHVsZXMuc3ltYm9scykgdGhhdCBjb250YWluIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KKwkgIGZvciBtb2Rwcm9iZS4KKworY29tbWVudCAiT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMiCisKK2NvbmZpZyBGRUFUVVJFXzJfNF9NT0RVTEVTCisJYm9vbCAiU3VwcG9ydCB2ZXJzaW9uIDIuMi8yLjQgTGludXgga2VybmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElOU01PRCB8fCBSTU1PRCB8fCBMU01PRAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgZm9yIDIuMi54IGFuZCAyLjQueCBMaW51eCBrZXJuZWxzLgorCSAgVGhpcyBpbmNyZWFzZXMgc2l6ZSBjb25zaWRlcmFibHkuIFNheSBOIHVubGVzcyB5b3UgcGxhbgorCSAgdG8gcnVuIGFuY2llbnQga2VybmVscy4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQCisJYm9vbCAiVHJ5IHRvIGxvYWQgbW9kdWxlIGZyb20gYSBtbWFwJ2VkIGFyZWEiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBJTlNNT0QgfHwgTU9EUFJPQkVfU01BTEwKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgbW9kdWxlIGxvYWRpbmcgY29kZSB0byB0cnkgdG8gbW1hcAorCSAgbW9kdWxlIGZpcnN0LiBJZiBpdCBkb2VzIG5vdCB3b3JrIChmb3IgZXhhbXBsZSwKKwkgIGl0IGRvZXMgbm90IHdvcmsgZm9yIGNvbXByZXNzZWQgbW9kdWxlcyksIG1vZHVsZSB3aWxsIGJlIHJlYWQKKwkgIChhbmQgdW5wYWNrZWQgaWYgbmVlZGVkKSBpbnRvIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBieSBtYWxsb2MuCisKKwkgIFRoZSBvbmx5IGNhc2Ugd2hlbiBtbWFwIHdvcmtzIGJ1dCBtYWxsb2MgZG9lcyBub3QgaXMgd2hlbgorCSAgeW91IGFyZSB0cnlpbmcgdG8gbG9hZCBhIGJpZyBtb2R1bGUgb24gYSB2ZXJ5IG1lbW9yeS1jb25zdHJhaW5lZAorCSAgbWFjaGluZS4gTWFsbG9jIHdpbGwgbW9tZW50YXJpbHkgbmVlZCAyeCBhcyBtdWNoIG1lbW9yeSBhcyBtbWFwLgorCisJICBDaG9vc2luZyBOIHNhdmVzIGFib3V0IDI1MCBieXRlcyBvZiBjb2RlIChvbiAzMi1iaXQgeDg2KS4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKKwlib29sICJFbmFibGUgbW9kdWxlIHZlcnNpb24gY2hlY2tpbmciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRUFUVVJFXzJfNF9NT0RVTEVTICYmIChJTlNNT0QgfHwgTU9EUFJPQkUpCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCBjaGVja2luZyBvZiB2ZXJzaW9ucyBmb3IgbW9kdWxlcy4gVGhpcyBpcyB1c2VkIHRvCisJICBlbnN1cmUgdGhhdCB0aGUga2VybmVsIGFuZCBtb2R1bGUgYXJlIG1hZGUgZm9yIGVhY2ggb3RoZXIuCisKK2NvbmZpZyBGRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCisJYm9vbCAiQWRkIG1vZHVsZSBzeW1ib2xzIHRvIGtlcm5lbCBzeW1ib2wgdGFibGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRUFUVVJFXzJfNF9NT0RVTEVTICYmIChJTlNNT0QgfHwgTU9EUFJPQkUpCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQnkgYWRkaW5nIG1vZHVsZSBzeW1ib2xzIHRvIHRoZSBrZXJuZWwgc3ltYm9sIHRhYmxlLCBPb3BzIG1lc3NhZ2VzCisJICBvY2N1cmluZyB3aXRoaW4ga2VybmVsIG1vZHVsZXMgY2FuIGJlIHByb3Blcmx5IGRlYnVnZ2VkLiBCeSBlbmFibGluZworCSAgdGhpcyBmZWF0dXJlLCBtb2R1bGUgc3ltYm9scyB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUga2VybmVsIHN5bWJvbAorCSAgdGFibGUgZm9yIHByb3BlciBkZWJ1Z2dpbmcgc3VwcG9ydC4gSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbgorCSAgT29wcyBtZXNzYWdlcyBmcm9tIGtlcm5lbCBtb2R1bGVzLCBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0KKwlib29sICJJbiBrZXJuZWwgbWVtb3J5IG9wdGltaXphdGlvbiAodUNsaW51eCBvbmx5KSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgKElOU01PRCB8fCBNT0RQUk9CRSkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIGlzIGEgc3BlY2lhbCB1Q2xpbnV4IG9ubHkgbWVtb3J5IG9wdGltaXphdGlvbiB0aGF0IGxldHMgaW5zbW9kCisJICBsb2FkIHRoZSBzcGVjaWZpZWQga2VybmVsIG1vZHVsZSBkaXJlY3RseSBpbnRvIGtlcm5lbCBzcGFjZSwgcmVkdWNpbmcKKwkgIG1lbW9yeSB1c2FnZSBieSBwcmV2ZW50aW5nIHRoZSBuZWVkIGZvciB0d28gY29waWVzIG9mIHRoZSBtb2R1bGUKKwkgIGJlaW5nIGxvYWRlZCBpbnRvIG1lbW9yeS4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCisJYm9vbCAiRW5hYmxlIGluc21vZCBsb2FkIG1hcCAoLW0pIG9wdGlvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgSU5TTU9ECisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcywgb25lIHdvdWxkIGJlIGFibGUgdG8gZ2V0IGEgbG9hZCBtYXAKKwkgIG91dHB1dCBvbiBzdGRvdXQuIFRoaXMgbWFrZXMga2VybmVsIG1vZHVsZSBkZWJ1Z2dpbmcKKwkgIGVhc2llci4KKwkgIElmIHlvdSBkb24ndCBwbGFuIHRvIGRlYnVnIGtlcm5lbCBtb2R1bGVzLCB5b3UKKwkgIGRvbid0IG5lZWQgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCisJYm9vbCAiU3ltYm9scyBpbiBsb2FkIG1hcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSU5TTU9EX0xPQURfTUFQICYmICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFdpdGhvdXQgdGhpcyBvcHRpb24sIC1tIHdpbGwgb25seSBvdXRwdXQgc2VjdGlvbgorCSAgbG9hZCBtYXAuIFdpdGggdGhpcyBvcHRpb24sIC1tIHdpbGwgYWxzbyBvdXRwdXQKKwkgIHN5bWJvbHMgbG9hZCBtYXAuCisKK2NvbmZpZyBGRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCisJYm9vbCAiU3VwcG9ydCB0YWludGVkIG1vZHVsZSBjaGVja2luZyB3aXRoIG5ldyBrZXJuZWxzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gKExTTU9EIHx8IEZFQVRVUkVfMl80X01PRFVMRVMpICYmICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFN1cHBvcnQgY2hlY2tpbmcgZm9yIHRhaW50ZWQgbW9kdWxlcy4gVGhlc2UgYXJlIHVzdWFsbHkgYmluYXJ5CisJICBvbmx5IG1vZHVsZXMgdGhhdCB3aWxsIG1ha2UgdGhlIGxpbnV4LWtlcm5lbCBsaXN0IGlnbm9yZSB5b3VyCisJICBzdXBwb3J0IHJlcXVlc3QuCisJICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCB0byBzdXBwb3J0IEdQTE9OTFkgbW9kdWxlcy4KKworY29uZmlnIEZFQVRVUkVfTU9EVVRJTFNfQUxJQVMKKwlib29sICJTdXBwb3J0IGZvciBtb2R1bGUuYWxpYXNlcyBmaWxlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVQTU9EIHx8IE1PRFBST0JFCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgR2VuZXJhdGUgYW5kIHBhcnNlIG1vZHVsZXMuYWxpYXMgY29udGFpbmluZyBhbGlhc2VzIGZvciBidXMKKwkgIGlkZW50aWZpZXJzOgorCSAgICBhbGlhcyBwY21jaWE6bSpjKmYwM2ZuKnBmbipwYSpwYipwYypwZCogcGFycG9ydF9jcworCisJICBhbmQgYWxpYXNlcyBmb3IgbG9naWNhbCBtb2R1bGVzIG5hbWVzIGUuZy46CisJICAgIGFsaWFzIHBhZGxvY2tfYWVzIGFlcworCSAgICBhbGlhcyBhZXNfaTU4NiBhZXMKKwkgICAgYWxpYXMgYWVzX2dlbmVyaWMgYWVzCisKKwkgIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnIEZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUworCWJvb2wgIlN1cHBvcnQgZm9yIG1vZHVsZS5zeW1ib2xzIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZW5lcmF0ZSBhbmQgcGFyc2UgbW9kdWxlcy5zeW1ib2xzIGNvbnRhaW5pbmcgYWxpYXNlcyBmb3IKKwkgIHN5bWJvbF9yZXF1ZXN0KCkga2VybmVsIGNhbGxzLCBzdWNoIGFzOgorCSAgICBhbGlhcyBzeW1ib2w6dXNiX3NnX2luaXQgdXNiY29yZQorCisJICBTYXkgWSBpZiB1bnN1cmUuCisKK2NvbmZpZyBERUZBVUxUX01PRFVMRVNfRElSCisJc3RyaW5nICJEZWZhdWx0IGRpcmVjdG9yeSBjb250YWluaW5nIG1vZHVsZXMiCisJZGVmYXVsdCAiL2xpYi9tb2R1bGVzIgorCWRlcGVuZHMgb24gREVQTU9EIHx8IE1PRFBST0JFIHx8IE1PRFBST0JFX1NNQUxMIHx8IE1PRElORk8KKwloZWxwCisJICBEaXJlY3RvcnkgdGhhdCBjb250YWlucyBrZXJuZWwgbW9kdWxlcy4KKwkgIERlZmF1bHRzIHRvICIvbGliL21vZHVsZXMiCisKK2NvbmZpZyBERUZBVUxUX0RFUE1PRF9GSUxFCisJc3RyaW5nICJEZWZhdWx0IG5hbWUgb2YgbW9kdWxlcy5kZXAiCisJZGVmYXVsdCAibW9kdWxlcy5kZXAiCisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUgfHwgTU9EUFJPQkVfU01BTEwgfHwgTU9ESU5GTworCWhlbHAKKwkgIEZpbGVuYW1lIHRoYXQgY29udGFpbnMga2VybmVsIG1vZHVsZXMgZGVwZW5kZW5jaWVzLgorCSAgRGVmYXVsdHMgdG8gIm1vZHVsZXMuZGVwIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9tb2R1dGlscy9LYnVpbGQuc3JjIGIvbW9kdXRpbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTdhYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE2IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19NT0RQUk9CRV9TTUFMTCkgICAgICArPSBtb2Rwcm9iZS1zbWFsbC5vCitsaWItJChDT05GSUdfREVQTU9EKSAgICAgICAgICAgICAgKz0gZGVwbW9kLm8gbW9kdXRpbHMubworbGliLSQoQ09ORklHX0lOU01PRCkgICAgICAgICAgICAgICs9IGluc21vZC5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19MU01PRCkgICAgICAgICAgICAgICArPSBsc21vZC5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19NT0RQUk9CRSkgICAgICAgICAgICArPSBtb2Rwcm9iZS5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19STU1PRCkgICAgICAgICAgICAgICArPSBybW1vZC5vIG1vZHV0aWxzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTKSArPSBtb2R1dGlscy0yNC5vCmRpZmYgLS1naXQgYS9tb2R1dGlscy9kZXBtb2QuYyBiL21vZHV0aWxzL2RlcG1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzBiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9kZXBtb2QuYwpAQCAtMCwwICsxLDI3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZGVwbW9kIC0gZ2VuZXJhdGUgbW9kdWxlcy5kZXAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqIENvcHlyaWhndCAoYykgMjAwOCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBEcm9ubmlrb3YKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0RFUE1PRChBUFBMRVQoZGVwbW9kLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy91c2FnZTojaWYgIUVOQUJMRV9NT0RQUk9CRV9TTUFMTAorLy91c2FnZTojZGVmaW5lIGRlcG1vZF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZGVwbW9kX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gLyogdW5hbWUoKSAqLworCisvKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbjoKKyAqIC0gaXRlcmF0ZSBvdmVyIGFsbCBtb2R1bGVzIGFuZCByZWNvcmQgdGhlaXIgZnVsbCBwYXRoCisgKiAtIGl0ZXJhdGUgb3ZlciBhbGwgbW9kdWxlcyBsb29raW5nIGZvciAiZGVwZW5kcz0iIGVudHJpZXMKKyAqICAgZm9yIGVhY2ggZGVwZW5kcywgbG9vayB0aHJvdWdoIG91ciBsaXN0IG9mIGZ1bGwgcGF0aHMgYW5kIGVtaXQgaWYgZm91bmQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBtb2R1bGVfaW5mbyB7CisJc3RydWN0IG1vZHVsZV9pbmZvICpuZXh0OworCWNoYXIgKm5hbWUsICptb2RuYW1lOworCWxsaXN0X3QgKmRlcGVuZGVuY2llczsKKwlsbGlzdF90ICphbGlhc2VzOworCWxsaXN0X3QgKnN5bWJvbHM7CisJc3RydWN0IG1vZHVsZV9pbmZvICpkbmV4dCwgKmRwcmV2OworfSBtb2R1bGVfaW5mbzsKKworc3RhdGljIGludCBGQVNUX0ZVTkMgcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKmZuYW1lLCBzdHJ1Y3Qgc3RhdCAqc2IgVU5VU0VEX1BBUkFNLAorCQkJCSAgdm9pZCAqZGF0YSwgaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwltb2R1bGVfaW5mbyAqKmZpcnN0ID0gKG1vZHVsZV9pbmZvICoqKSBkYXRhOworCWNoYXIgKmltYWdlLCAqcHRyOworCW1vZHVsZV9pbmZvICppbmZvOworCS8qIEFyYml0cmFyeS4gV2FzIHNiLT5zdF9zaXplLCBidXQgdGhhdCBicmVha3MgLmd6IGV0YyAqLworCXNpemVfdCBsZW4gPSAoNjQqMTAyNCoxMDI0IC0gNDA5Nik7CisKKwlpZiAoc3RycnN0cihmbmFtZSwgIi5rbyIpID09IE5VTEwpCisJCXJldHVybiBUUlVFOworCisJaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoZm5hbWUsICZsZW4pOworCWluZm8gPSB4emFsbG9jKHNpemVvZigqaW5mbykpOworCisJaW5mby0+bmV4dCA9ICpmaXJzdDsKKwkqZmlyc3QgPSBpbmZvOworCisJaW5mby0+ZG5leHQgPSBpbmZvLT5kcHJldiA9IGluZm87CisJaW5mby0+bmFtZSA9IHhzdHJkdXAoZm5hbWUgKyAyKTsgLyogc2tpcCAiLi8iICovCisJaW5mby0+bW9kbmFtZSA9IHhzdHJkdXAoZmlsZW5hbWUybW9kbmFtZShmbmFtZSwgbW9kbmFtZSkpOworCWZvciAocHRyID0gaW1hZ2U7IHB0ciA8IGltYWdlICsgbGVuIC0gMTA7IHB0cisrKSB7CisJCWlmIChzdHJuY21wKHB0ciwgImRlcGVuZHM9IiwgOCkgPT0gMCkgeworCQkJY2hhciAqdTsKKworCQkJcHRyICs9IDg7CisJCQlmb3IgKHUgPSBwdHI7ICp1OyB1KyspCisJCQkJaWYgKCp1ID09ICctJykKKwkJCQkJKnUgPSAnXyc7CisJCQlwdHIgKz0gc3RyaW5nX3RvX2xsaXN0KHB0ciwgJmluZm8tPmRlcGVuZGVuY2llcywgIiwiKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19BTElBUworCQkgJiYgc3RybmNtcChwdHIsICJhbGlhcz0iLCA2KSA9PSAwCisJCSkgeworCQkJbGxpc3RfYWRkX3RvKCZpbmZvLT5hbGlhc2VzLCB4c3RyZHVwKHB0ciArIDYpKTsKKwkJCXB0ciArPSBzdHJsZW4ocHRyKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTCisJCSAmJiBzdHJuY21wKHB0ciwgIl9fa3N5bXRhYl8iLCAxMCkgPT0gMAorCQkpIHsKKwkJCXB0ciArPSAxMDsKKwkJCWlmIChzdHJuY21wKHB0ciwgImdwbCIsIDMpID09IDAKKwkJCSB8fCBzdHJjbXAocHRyLCAic3RyaW5ncyIpID09IDAKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbGxpc3RfYWRkX3RvKCZpbmZvLT5zeW1ib2xzLCB4c3RyZHVwKHB0cikpOworCQkJcHRyICs9IHN0cmxlbihwdHIpOworCQl9CisJfQorCWZyZWUoaW1hZ2UpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBtb2R1bGVfaW5mbyAqZmluZF9tb2R1bGUobW9kdWxlX2luZm8gKm1vZHVsZXMsIGNvbnN0IGNoYXIgKm1vZG5hbWUpCit7CisJbW9kdWxlX2luZm8gKm07CisKKwlmb3IgKG0gPSBtb2R1bGVzOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQorCQlpZiAoc3RyY21wKG0tPm1vZG5hbWUsIG1vZG5hbWUpID09IDApCisJCQlyZXR1cm4gbTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgb3JkZXJfZGVwX2xpc3QobW9kdWxlX2luZm8gKm1vZHVsZXMsIG1vZHVsZV9pbmZvICpzdGFydCwKKwkJCSAgIGxsaXN0X3QgKmFkZCkKK3sKKwltb2R1bGVfaW5mbyAqbTsKKwlsbGlzdF90ICpuOworCisJZm9yIChuID0gYWRkOyBuICE9IE5VTEw7IG4gPSBuLT5saW5rKSB7CisJCW0gPSBmaW5kX21vZHVsZShtb2R1bGVzLCBuLT5kYXRhKTsKKwkJaWYgKG0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHVubGluayBjdXJyZW50IGVudHJ5ICovCisJCW0tPmRuZXh0LT5kcHJldiA9IG0tPmRwcmV2OworCQltLT5kcHJldi0+ZG5leHQgPSBtLT5kbmV4dDsKKworCQkvKiBhbmQgYWRkIGl0IHRvIHRhaWwgKi8KKwkJbS0+ZG5leHQgPSBzdGFydDsKKwkJbS0+ZHByZXYgPSBzdGFydC0+ZHByZXY7CisJCXN0YXJ0LT5kcHJldi0+ZG5leHQgPSBtOworCQlzdGFydC0+ZHByZXYgPSBtOworCisJCS8qIHJlY3Vyc2UgKi8KKwkJb3JkZXJfZGVwX2xpc3QobW9kdWxlcywgc3RhcnQsIG0tPmRlcGVuZGVuY2llcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4ZnJlb3Blbl93cml0ZShjb25zdCBjaGFyICpmaWxlLCBGSUxFICpmKQoreworCWlmIChmcmVvcGVuKGZpbGUsICJ3IiwgZikgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBmaWxlKTsKK30KKworLyogVXNhZ2U6CisgKiBbLWFBZW52XSBbLUMgRklMRSBvciBESVJdIFstYiBCQVNFXSBbLUYgU3lzdGVtLm1hcF0gW1ZFUlNJT05dIFtNT0RGSUxFU10uLi4KKyAqCS1hIC0tYWxsCisgKgkJUHJvYmUgYWxsIG1vZHVsZXMuIERlZmF1bHQgaWYgbm8gTU9ERklMRVMuCisgKgktQSAtLXF1aWNrCisgKgkJQ2hlY2sgbW9kdWxlcy5kZXAncyBtdGltZSBhZ2FpbnN0IG1vZHVsZSBmaWxlcycgbXRpbWVzLgorICoJLWIgLS1iYXNlZGlyIEJBU0UKKyAqCQlVc2UgJEJBU0UvbGliL21vZHVsZXMvVkVSU0lPTgorICoJLUMgLS1jb25maWcgRklMRSBvciBESVIKKyAqCQlQYXRoIHRvIC9ldGMvZGVwbW9kLmNvbmYgb3IgL2V0Yy9kZXBtb2QuZC8KKyAqCS1lIC0tZXJyc3ltcworICoJCVdoZW4gY29tYmluZWQgd2l0aCB0aGUgLUYgb3B0aW9uLCB0aGlzIHJlcG9ydHMgYW55IHN5bWJvbHMgd2hpY2gKKyAqCQl3aGljaCBhcmUgbm90IHN1cHBsaWVkIGJ5IG90aGVyIG1vZHVsZXMgb3Iga2VybmVsLgorICoJLUYgLS1maWxlc3ltcyBTeXN0ZW0ubWFwCisgKgktbiAtLWRyeS1ydW4KKyAqCQlQcmludCBtb2R1bGVzLmRlcCBldGMgdG8gc3RhbmRhcmQgb3V0cHV0CisgKgktdiAtLXZlcmJvc2UKKyAqCQlQcmludCB0byBzdGRvdXQgYWxsIHRoZSBzeW1ib2xzIGVhY2ggbW9kdWxlIGRlcGVuZHMgb24KKyAqCQlhbmQgdGhlIG1vZHVsZSdzIGZpbGUgbmFtZSB3aGljaCBwcm92aWRlcyB0aGF0IHN5bWJvbC4KKyAqCS1yCU5vLW9wCisgKgktdQlOby1vcAorICoJLXEJTm8tb3AKKyAqCisgKiBTbyBmYXIgd2Ugb25seSBzdXBwb3J0OiBbLXJuXSBbLWIgQkFTRV0gW1ZFUlNJT05dIFtNT0RGSUxFU10uLi4KKyAqIC1hQWVGIGFyZSBhY2NlcHRlZCBidXQgaWdub3JlZC4gLXZDIGFyZSBub3QgYWNjZXB0ZWQuCisgKi8KK2VudW0geworCS8vT1BUX2EgPSAoMSA8PCAwKSwgLyogQWxsIG1vZHVsZXMsIGlnbm9yZSBtb2RzIGluIGFyZ3YgKi8KKwkvL09QVF9BID0gKDEgPDwgMSksIC8qIE9ubHkgZW1pdCAua28gdGhhdCBhcmUgbmV3ZXIgdGhhbiBtb2R1bGVzLmRlcCBmaWxlICovCisJT1BUX2IgPSAoMSA8PCAyKSwgLyogYmFzZSBkaXJlY3Rvcnkgd2hlbiBtb2R1bGVzIGFyZSBpbiBzdGFnaW5nIGFyZWEgKi8KKwkvL09QVF9lID0gKDEgPDwgMyksIC8qIHdpdGggLUYsIHByaW50IHVucmVzb2x2ZWQgc3ltYm9scyAqLworCS8vT1BUX0YgPSAoMSA8PCA0KSwgLyogU3lzdGVtLm1hcCB0aGF0IGNvbnRhaW5zIHRoZSBzeW1ib2xzICovCisJT1BUX24gPSAoMSA8PCA1KSwgLyogZHJ5LXJ1biwgcHJpbnQgdG8gc3Rkb3V0IG9ubHkgKi8KKwlPUFRfciA9ICgxIDw8IDYpLCAvKiBDb21wYXQgZHVtbXkuIExpbnV4IE1ha2VmaWxlIHVzZXMgaXQgKi8KKwlPUFRfdSA9ICgxIDw8IDcpLCAvKiAtdSwtLXVucmVzb2x2ZWQtZXJyb3I6IGlnbm9yZWQgKi8KKwlPUFRfcSA9ICgxIDw8IDgpLCAvKiAtcSwtLXF1aWV0OiBpZ25vcmVkICovCisJT1BUX0MgPSAoMSA8PCA5KSwgLyogLUMsLS1jb25maWcgZXRjX21vZHVsZXNfY29uZjogaWdub3JlZCAqLworfTsKKworaW50IGRlcG1vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVwbW9kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwltb2R1bGVfaW5mbyAqbW9kdWxlcywgKm0sICpkZXA7CisJY29uc3QgY2hhciAqbW9kZGlyX2Jhc2UgPSAiLyI7CisJY2hhciAqbW9kZGlyLCAqdmVyc2lvbjsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJaW50IHRtcDsKKworCWdldG9wdDMyKGFyZ3YsICJhQWI6ZUY6bnJ1cUM6IiwgJm1vZGRpcl9iYXNlLCBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGdvdG8gbW9kdWxlcyBsb2NhdGlvbiAqLworCXhjaGRpcihtb2RkaXJfYmFzZSk7CisKKwkvKiBJZiBhIHZlcnNpb24gaXMgcHJvdmlkZWQsIHRoZW4gdGhhdCBrZXJuZWwgdmVyc2lvbidzIG1vZHVsZSBkaXJlY3RvcnkKKwkgKiBpcyB1c2VkLCByYXRoZXIgdGhhbiB0aGUgY3VycmVudCBrZXJuZWwgdmVyc2lvbiAoYXMgcmV0dXJuZWQgYnkKKwkgKiAidW5hbWUgLXIiKS4gICovCisJaWYgKCphcmd2ICYmIHNzY2FuZigqYXJndiwgIiV1LiV1LiV1IiwgJnRtcCwgJnRtcCwgJnRtcCkgPT0gMykgeworCQl2ZXJzaW9uID0gKmFyZ3YrKzsKKwl9IGVsc2UgeworCQl1bmFtZSgmdXRzKTsKKwkJdmVyc2lvbiA9IHV0cy5yZWxlYXNlOworCX0KKwltb2RkaXIgPSBjb25jYXRfcGF0aF9maWxlKCZDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUlsxXSwgdmVyc2lvbik7CisJeGNoZGlyKG1vZGRpcik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKG1vZGRpcik7CisKKwkvKiBTY2FuIG1vZHVsZXMgKi8KKwltb2R1bGVzID0gTlVMTDsKKwlpZiAoKmFyZ3YpIHsKKwkJZG8geworCQkJcGFyc2VfbW9kdWxlKCphcmd2LCAvKnNiICh1bnVzZWQpOiovIE5VTEwsICZtb2R1bGVzLCAwKTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJfSBlbHNlIHsKKwkJcmVjdXJzaXZlX2FjdGlvbigiLiIsIEFDVElPTl9SRUNVUlNFLAorCQkJCSBwYXJzZV9tb2R1bGUsIE5VTEwsICZtb2R1bGVzLCAwKTsKKwl9CisKKwkvKiBHZW5lcmF0ZSBkZXBlbmRlbmN5IGFuZCBhbGlhcyBmaWxlcyAqLworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikpCisJCXhmcmVvcGVuX3dyaXRlKENPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFLCBzdGRvdXQpOworCWZvciAobSA9IG1vZHVsZXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpIHsKKwkJcHJpbnRmKCIlczoiLCBtLT5uYW1lKTsKKworCQlvcmRlcl9kZXBfbGlzdChtb2R1bGVzLCBtLCBtLT5kZXBlbmRlbmNpZXMpOworCQl3aGlsZSAobS0+ZG5leHQgIT0gbSkgeworCQkJZGVwID0gbS0+ZG5leHQ7CisJCQlwcmludGYoIiAlcyIsIGRlcC0+bmFtZSk7CisKKwkJCS8qIHVubGluayBjdXJyZW50IGVudHJ5ICovCisJCQlkZXAtPmRuZXh0LT5kcHJldiA9IGRlcC0+ZHByZXY7CisJCQlkZXAtPmRwcmV2LT5kbmV4dCA9IGRlcC0+ZG5leHQ7CisJCQlkZXAtPmRuZXh0ID0gZGVwLT5kcHJldiA9IGRlcDsKKwkJfQorCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX01PRFVUSUxTX0FMSUFTCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9uKSkKKwkJeGZyZW9wZW5fd3JpdGUoIm1vZHVsZXMuYWxpYXMiLCBzdGRvdXQpOworCWZvciAobSA9IG1vZHVsZXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpIHsKKwkJY29uc3QgY2hhciAqZm5hbWUgPSBiYl9iYXNlbmFtZShtLT5uYW1lKTsKKwkJaW50IGZubGVuID0gc3RyY2hybnVsKGZuYW1lLCAnLicpIC0gZm5hbWU7CisJCXdoaWxlIChtLT5hbGlhc2VzKSB7CisJCQkvKiBMYXN0IHdvcmQgY2FuIHdlbGwgYmUgbS0+bW9kbmFtZSBpbnN0ZWFkLAorCQkJICogYnV0IGRlcG1vZCBmcm9tIG1vZHVsZS1pbml0LXRvb2xzIDMuNAorCQkJICogdXNlcyBtb2R1bGUgYmFzZW5hbWUsIGkuZS4sIG5vIHMvLS9fL2cuCisJCQkgKiAocGF0aG5hbWUgYW5kIC5rby4qIGFyZSBzdGlsbCBzdHJpcHBlZCkKKwkJCSAqIE1pbWlja2luZyB0aGF0Li4uICovCisJCQlwcmludGYoImFsaWFzICVzICUuKnNcbiIsCisJCQkJKGNoYXIqKWxsaXN0X3BvcCgmbS0+YWxpYXNlcyksCisJCQkJZm5sZW4sIGZuYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX24pKQorCQl4ZnJlb3Blbl93cml0ZSgibW9kdWxlcy5zeW1ib2xzIiwgc3Rkb3V0KTsKKwlmb3IgKG0gPSBtb2R1bGVzOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KSB7CisJCWNvbnN0IGNoYXIgKmZuYW1lID0gYmJfYmFzZW5hbWUobS0+bmFtZSk7CisJCWludCBmbmxlbiA9IHN0cmNocm51bChmbmFtZSwgJy4nKSAtIGZuYW1lOworCQl3aGlsZSAobS0+c3ltYm9scykgeworCQkJcHJpbnRmKCJhbGlhcyBzeW1ib2w6JXMgJS4qc1xuIiwKKwkJCQkoY2hhciopbGxpc3RfcG9wKCZtLT5zeW1ib2xzKSwKKwkJCQlmbmxlbiwgZm5hbWUpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJd2hpbGUgKG1vZHVsZXMpIHsKKwkJCW1vZHVsZV9pbmZvICpvbGQgPSBtb2R1bGVzOworCQkJbW9kdWxlcyA9IG1vZHVsZXMtPm5leHQ7CisJCQlmcmVlKG9sZC0+bmFtZSk7CisJCQlmcmVlKG9sZC0+bW9kbmFtZSk7CisJCQlmcmVlKG9sZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvZGVwbW9kX3Byb2Nlc3Muc2ggYi9tb2R1dGlscy9kZXBtb2RfcHJvY2Vzcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTliMDkxCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvZGVwbW9kX3Byb2Nlc3Muc2gKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKKyMgRGVwbW9kIG91dHB1dCBtYXkgYmUgaGFyZCB0byBkaWZmLgorIyBUaGlzIHNjcmlwdCBzb3J0cyBkZXBlbmRlbmNpZXMgd2l0aGluICJ4eC5rbzogeXkua28genoua28iIGxpbmVzLAorIyBhbmQgc29ydHMgYWxsIGxpbmVzIHRvby4KKyMgVXNhZ2U6CisjCisjIFsuL2J1c3lib3hdIGRlcG1vZCAtbiB8IC4vZGVwbW9kX3Byb2Nlc3Muc2ggfCBzb3J0ID5PVVRGSUxFCisjCisjIGFuZCB0aGVuIHlvdSBjYW4gZGlmZiBPVVRGSUxFcy4gVXNlZnVsIGZvciBjb21wYXJpbmcgYmJveCBkZXBtb2QKKyMgd2l0aCBtb2R1bGUtaW5pdC10b29scyBkZXBtb2QgYW5kIHN1Y2guCisKK3doaWxlIHJlYWQgLXIgd29yZCByZXN0OyBkbworICAgIGlmICEgdGVzdCAiJHt3b3JkLyo6L30iOyB0aGVuCisJZWNobyAtbiAiJHdvcmQgIgorCWVjaG8gIiRyZXN0IiB8IHhhcmdzIC1uMSB8IHNvcnQgfCB4YXJncworICAgIGVsc2UKKwllY2hvICIkd29yZCAkcmVzdCI7CisgICAgZmkKK2RvbmUKZGlmZiAtLWdpdCBhL21vZHV0aWxzL2luc21vZC5jIGIvbW9kdXRpbHMvaW5zbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ZDlmMgotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL2luc21vZC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfSU5TTU9EKEFQUExFVChpbnNtb2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorCisvKiAyLjYgc3R5bGUgaW5zbW9kIGhhcyBubyBvcHRpb25zIGFuZCByZXF1aXJlZCBmaWxlbmFtZQorICogKG5vdCBtb2R1bGUgbmFtZSAtIC5rbyBjYW4ndCBiZSBvbWl0dGVkKSAqLworCisvL3VzYWdlOiNpZiAhRU5BQkxFX01PRFBST0JFX1NNQUxMCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoIltPUFRJT05TXSBNT0RVTEUgIikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFXzJfNF9NT0RVTEVTKCJGSUxFICIpCisvL3VzYWdlOgkiW1NZTUJPTD1WQUxVRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCB0aGUgc3BlY2lmaWVkIGtlcm5lbCBtb2R1bGVzIGludG8gdGhlIGtlcm5lbCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgbW9kdWxlIHRvIGxvYWQgaW50byB0aGUgd3Jvbmcga2VybmVsIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS1rCU1ha2UgbW9kdWxlIGF1dG9jbGVhbi1hYmxlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJTG9jazogcHJldmVudCBzaW11bHRhbmVvdXMgbG9hZHMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgKKy8vdXNhZ2U6ICAgICAiXG4JLW0JT3V0cHV0IGxvYWQgbWFwIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRG9uJ3QgZXhwb3J0IGV4dGVybnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZgorCitpbnQgaW5zbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpbnNtb2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmZpbGVuYW1lOworCWludCByYzsKKworCS8qIENvbXBhdCBub3RlOgorCSAqIDIuNiBzdHlsZSBpbnNtb2QgaGFzIG5vIG9wdGlvbnMgYW5kIHJlcXVpcmVkIGZpbGVuYW1lCisJICogKG5vdCBtb2R1bGUgbmFtZSAtIC5rbyBjYW4ndCBiZSBvbWl0dGVkKS4KKwkgKiAyLjQgc3R5bGUgaW5zbW9kIGNhbiB0YWtlIG1vZHVsZSBuYW1lIHdpdGhvdXQgLm8KKwkgKiBhbmQgcGVyZm9ybXMgbW9kdWxlIHNlYXJjaCBpbiBkZWZhdWx0IGRpcmVjdG9yaWVzCisJICogb3IgaW4gJE1PRFBBVEguCisJICovCisKKwlJRl9GRUFUVVJFXzJfNF9NT0RVTEVTKAorCQlnZXRvcHQzMihhcmd2LCBJTlNNT0RfT1BUUyBJTlNNT0RfQVJHUyk7CisJCWFyZ3YgKz0gb3B0aW5kIC0gMTsKKwkpOworCisJZmlsZW5hbWUgPSAqKythcmd2OworCWlmICghZmlsZW5hbWUpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXJjID0gYmJfaW5pdF9tb2R1bGUoZmlsZW5hbWUsIHBhcnNlX2NtZGxpbmVfbW9kdWxlX29wdGlvbnMoYXJndiwgLypxdW90ZV9zcGFjZXM6Ki8gMCkpOworCWlmIChyYykKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBpbnNlcnQgJyVzJzogJXMiLCBmaWxlbmFtZSwgbW9kZXJyb3IocmMpKTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL21vZHV0aWxzL2xzbW9kLmMgYi9tb2R1dGlscy9sc21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiM2MxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9sc21vZC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGxzbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0xTTU9EKEFQUExFVChsc21vZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTU9EUFJPQkVfU01BTEwKKy8vdXNhZ2U6I2RlZmluZSBsc21vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGxzbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCB0aGUgY3VycmVudGx5IGxvYWRlZCBrZXJuZWwgbW9kdWxlcyIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCitlbnVtIHsKKwlUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUgPSAoMSA8PCAwKSwKKwlUQUlOVF9GT1JDRURfTU9EVUxFICAgICAgPSAoMSA8PCAxKSwKKwlUQUlOVF9VTlNBRkVfU01QICAgICAgICAgPSAoMSA8PCAyKSwKK307CisKK3N0YXRpYyB2b2lkIGNoZWNrX3RhaW50ZWQodm9pZCkKK3sKKwlpbnQgdGFpbnRlZCA9IDA7CisJY2hhciAqYnVmID0geG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoIi9wcm9jL3N5cy9rZXJuZWwvdGFpbnRlZCIsIE5VTEwpOworCWlmIChidWYpIHsKKwkJdGFpbnRlZCA9IGF0b2koYnVmKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShidWYpOworCX0KKworCWlmICh0YWludGVkKSB7CisJCXByaW50ZigiICAgIFRhaW50ZWQ6ICVjJWMlY1xuIiwKKwkJCQl0YWludGVkICYgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFICAgICAgPyAnUCcgOiAnRycsCisJCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUgICAgICAgICAgID8gJ0YnIDogJyAnLAorCQkJCXRhaW50ZWQgJiBUQUlOVF9VTlNBRkVfU01QICAgICAgICAgICAgICA/ICdTJyA6ICcgJyk7CisJfSBlbHNlIHsKKwkJcHV0cygiICAgIE5vdCB0YWludGVkIik7CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGNoZWNrX3RhaW50ZWQodm9pZCkgeyBwdXRjaGFyKCdcbicpOyB9CisjZW5kaWYKKworaW50IGxzbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsc21vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUCisJY2hhciAqdG9rZW5bNF07CisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuKCIvcHJvYy9tb2R1bGVzIik7CisJaW5pdF91bmljb2RlKCk7CisKKwlwcmludGYoIiUtMjRzU2l6ZSAgVXNlZCBieSIsICJNb2R1bGUiKTsKKwljaGVja190YWludGVkKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMKKwkgJiYgZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJKSB7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCA0LCAzLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJCWlmICh0b2tlblszXSAhPSBOVUxMICYmIHRva2VuWzNdWzBdID09ICdbJykgeworCQkJCXRva2VuWzNdKys7CisJCQkJdG9rZW5bM11bc3RybGVuKHRva2VuWzNdKS0xXSA9ICdcMCc7CisJCQl9IGVsc2UKKwkJCQl0b2tlblszXSA9IChjaGFyICopICIiOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQl7CisJCQkJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKwkJCQljaGFyICp1bmlfbmFtZSA9IHVuaWNvZGVfY29udl90b19wcmludGFibGUoJnVuaV9zdGF0LCB0b2tlblswXSk7CisJCQkJdW5zaWduZWQgcGFkX2xlbiA9ICh1bmlfc3RhdC51bmljb2RlX3dpZHRoID4gMTkpID8gMCA6IDE5IC0gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwkJCQlwcmludGYoIiVzJSpzICU4cyAlMnMgJXNcbiIsIHVuaV9uYW1lLCBwYWRfbGVuLCAiIiwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSk7CisJCQkJZnJlZSh1bmlfbmFtZSk7CisJCQl9CisjIGVsc2UKKwkJCXByaW50ZigiJS0xOXMgJThzICUycyAlc1xuIiwgdG9rZW5bMF0sIHRva2VuWzFdLCB0b2tlblsyXSwgdG9rZW5bM10pOworIyBlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDQsIDQsICIjIFx0IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0dSRUVEWSkpIHsKKwkJCS8vIE4uQi4gdG9rZW5bM10gaXMgZWl0aGVyICctJyAobW9kdWxlIGlzIG5vdCB1c2VkIGJ5IG90aGVycykKKwkJCS8vIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGVuZGVkIGJ5IGNvbW1hCisJCQkvLyBzbyB0cmltbWluZyB0aGUgdHJhaWxpbmcgY2hhciBpcyBqdXN0IHdoYXQgd2UgbmVlZCEKKwkJCWlmICh0b2tlblszXVswXSkKKwkJCQl0b2tlblszXVtzdHJsZW4odG9rZW5bM10pIC0gMV0gPSAnXDAnOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQl7CisJCQkJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKwkJCQljaGFyICp1bmlfbmFtZSA9IHVuaWNvZGVfY29udl90b19wcmludGFibGUoJnVuaV9zdGF0LCB0b2tlblswXSk7CisJCQkJdW5zaWduZWQgcGFkX2xlbiA9ICh1bmlfc3RhdC51bmljb2RlX3dpZHRoID4gMTkpID8gMCA6IDE5IC0gdW5pX3N0YXQudW5pY29kZV93aWR0aDsKKwkJCQlwcmludGYoIiVzJSpzICU4cyAlMnMgJXNcbiIsIHVuaV9uYW1lLCBwYWRfbGVuLCAiIiwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSk7CisJCQkJZnJlZSh1bmlfbmFtZSk7CisJCQl9CisjIGVsc2UKKwkJCXByaW50ZigiJS0xOXMgJThzICUycyAlc1xuIiwgdG9rZW5bMF0sIHRva2VuWzFdLCB0b2tlblsyXSwgdG9rZW5bM10pOworIyBlbmRpZgorCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisjZWxzZQorCWNoZWNrX3RhaW50ZWQoKTsKKwl4cHJpbnRfYW5kX2Nsb3NlX2ZpbGUoeGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9tb2R1bGVzIikpOworI2VuZGlmCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21vZHV0aWxzL21vZGluZm8uYyBiL21vZHV0aWxzL21vZGluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkxMGZmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvbW9kaW5mby5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtb2RpbmZvIC0gcmV0cmlldmUgbW9kdWxlIGluZm8KKyAqIENvcHlyaWdodCAoYykgMjAwOCBQYXNjYWwgQmVsbGFyZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfTU9ESU5GTyhBUFBMRVQobW9kaW5mbywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19NT0RJTkZPKSArPSBtb2RpbmZvLm8gbW9kdXRpbHMubworCisvL2NvbmZpZzpjb25maWcgTU9ESU5GTworLy9jb25maWc6CWJvb2wgIm1vZGluZm8iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBhIExpbnV4IEtlcm5lbCBtb2R1bGUKKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiB1bmFtZSgpICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorCisKK2VudW0geworCU9QVF9UQUdTID0gKDEgPDwgOCkgLSAxLAorCU9QVF9GID0gKDEgPDwgOCksIC8qIGZpZWxkIG5hbWUgKi8KKwlPUFRfMCA9ICgxIDw8IDkpLCAgLyogXDAgYXMgc2VwYXJhdG9yICovCit9OworCitzdHJ1Y3QgbW9kaW5mb19lbnYgeworCWNoYXIgKmZpZWxkOworCWludCB0YWdzOworfTsKKworc3RhdGljIGludCBkaXNwbGF5KGNvbnN0IGNoYXIgKmRhdGEsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGludCBmbGFnKQoreworCWlmIChmbGFnKSB7CisJCWludCBuID0gcHJpbnRmKCIlczoiLCBwYXR0ZXJuKTsKKwkJd2hpbGUgKG4rKyA8IDE2KQorCQkJYmJfcHV0Y2hhcignICcpOworCX0KKwlyZXR1cm4gcHJpbnRmKCIlcyVjIiwgZGF0YSwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfMCkgPyAnXDAnIDogJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIG1vZGluZm8oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqdmVyc2lvbiwKKwkJCWNvbnN0IHN0cnVjdCBtb2RpbmZvX2VudiAqZW52KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaG9ydGN1dHNbXSA9IHsKKwkJImZpbGVuYW1lIiwKKwkJImRlc2NyaXB0aW9uIiwKKwkJImF1dGhvciIsCisJCSJsaWNlbnNlIiwKKwkJInZlcm1hZ2ljIiwKKwkJInBhcm0iLAorCQkiZmlybXdhcmUiLAorCQkiZGVwZW5kcyIsCisJfTsKKwlzaXplX3QgbGVuOworCWludCBqLCBsZW5ndGg7CisJY2hhciAqcHRyLCAqdGhlX21vZHVsZTsKKwljb25zdCBjaGFyICpmaWVsZCA9IGVudi0+ZmllbGQ7CisJaW50IHRhZ3MgPSBlbnYtPnRhZ3M7CisKKwlpZiAodGFncyAmIDEpIHsgLyogZmlsZW5hbWUgKi8KKwkJZGlzcGxheShwYXRoLCBzaG9ydGN1dHNbMF0sIDEgIT0gdGFncyk7CisJfQorCisJbGVuID0gTUFYSU5UKHNzaXplX3QpOworCXRoZV9tb2R1bGUgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aCwgJmxlbik7CisJaWYgKCF0aGVfbW9kdWxlKSB7CisJCWlmIChwYXRoWzBdID09ICcvJykKKwkJCXJldHVybjsKKwkJLyogTmV3ZXIgZGVwbW9kIHB1dHMgcmVsYXRpdmUgcGF0aHMgaW4gbW9kdWxlcy5kZXAgKi8KKwkJcGF0aCA9IHhhc3ByaW50ZigiJXMvJXMvJXMiLCBDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUiwgdmVyc2lvbiwgcGF0aCk7CisJCXRoZV9tb2R1bGUgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aCwgJmxlbik7CisJCWZyZWUoKGNoYXIqKXBhdGgpOworCQlpZiAoIXRoZV9tb2R1bGUpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGZpZWxkKQorCQl0YWdzIHw9IE9QVF9GOworCWZvciAoaiA9IDE7ICgxPDxqKSAmIChPUFRfVEFHUyArIE9QVF9GKTsgaisrKSB7CisJCWNvbnN0IGNoYXIgKnBhdHRlcm47CisKKwkJaWYgKCEoKDE8PGopICYgdGFncykpCisJCQljb250aW51ZTsKKwkJcGF0dGVybiA9IGZpZWxkOworCQlpZiAoKDE8PGopICYgT1BUX1RBR1MpCisJCQlwYXR0ZXJuID0gc2hvcnRjdXRzW2pdOworCQlsZW5ndGggPSBzdHJsZW4ocGF0dGVybik7CisJCXB0ciA9IHRoZV9tb2R1bGU7CisJCXdoaWxlICgxKSB7CisJCQlwdHIgPSBtZW1jaHIocHRyLCAqcGF0dGVybiwgbGVuIC0gKHB0ciAtIChjaGFyKil0aGVfbW9kdWxlKSk7CisJCQlpZiAocHRyID09IE5VTEwpIC8qIG5vIG9jY3VyYW5jZSBsZWZ0LCBkb25lICovCisJCQkJYnJlYWs7CisJCQlpZiAoc3RybmNtcChwdHIsIHBhdHRlcm4sIGxlbmd0aCkgPT0gMCAmJiBwdHJbbGVuZ3RoXSA9PSAnPScpIHsKKwkJCQlwdHIgKz0gbGVuZ3RoICsgMTsKKwkJCQlwdHIgKz0gZGlzcGxheShwdHIsIHBhdHRlcm4sICgxPDxqKSAhPSB0YWdzKTsKKwkJCX0KKwkJCSsrcHRyOworCQl9CisJfQorCWZyZWUodGhlX21vZHVsZSk7Cit9CisKKy8vdXNhZ2U6I2RlZmluZSBtb2RpbmZvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFkbHAwXSBbLUYga2V5d29yZF0gTU9EVUxFIgorLy91c2FnZTojZGVmaW5lIG1vZGluZm9fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJCVNob3J0Y3V0IGZvciAnLUYgYXV0aG9yJyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJCVNob3J0Y3V0IGZvciAnLUYgZGVzY3JpcHRpb24nIgorLy91c2FnZTogICAgICJcbgktbAkJU2hvcnRjdXQgZm9yICctRiBsaWNlbnNlJyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJCVNob3J0Y3V0IGZvciAnLUYgcGFybSciCisvL3VzYWdlOiAgICAgIlxuCS1GIGtleXdvcmQJS2V5d29yZCB0byBsb29rIGZvciIKKy8vdXNhZ2U6ICAgICAiXG4JLTAJCVNlcGFyYXRlIG91dHB1dCB3aXRoIE5VTHMiCisvL3VzYWdlOiNkZWZpbmUgbW9kaW5mb19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBtb2RpbmZvIC1GIHZlcm1hZ2ljIGxvb3BcbiIKKworaW50IG1vZGluZm9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vZGluZm9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBtb2RpbmZvX2VudiBlbnY7CisJY2hhciBuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJc3RydWN0IHV0c25hbWUgdXRzOworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqY29sb24sICp0b2tlbnNbMl07CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBpOworCisJZW52LmZpZWxkID0gTlVMTDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIG1pbmltdW0gb25lIHBhcmFtICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmZGFsdnBGOjAiLCAmZW52LmZpZWxkKTsKKwllbnYudGFncyA9IG9wdHMgJiBPUFRfVEFHUyA/IG9wdHMgJiBPUFRfVEFHUyA6IE9QVF9UQUdTOworCWFyZ3YgKz0gb3B0aW5kOworCisJdW5hbWUoJnV0cyk7CisJcGFyc2VyID0gY29uZmlnX29wZW4yKAorCQl4YXNwcmludGYoIiVzLyVzLyVzIiwgQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVIsIHV0cy5yZWxlYXNlLCBDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRSksCisJCXhmb3Blbl9mb3JfcmVhZAorCSk7CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDIsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQljb2xvbiA9IGxhc3RfY2hhcl9pcyh0b2tlbnNbMF0sICc6Jyk7CisJCWlmIChjb2xvbiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCSpjb2xvbiA9ICdcMCc7CisJCWZpbGVuYW1lMm1vZG5hbWUodG9rZW5zWzBdLCBuYW1lKTsKKwkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQlpZiAoZm5tYXRjaChhcmd2W2ldLCBuYW1lLCAwKSA9PSAwKSB7CisJCQkJbW9kaW5mbyh0b2tlbnNbMF0sIHV0cy5yZWxlYXNlLCAmZW52KTsKKwkJCQlhcmd2W2ldID0gKGNoYXIgKikgIiI7CisJCQl9CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoYXJndltpXVswXSkgeworCQkJbW9kaW5mbyhhcmd2W2ldLCB1dHMucmVsZWFzZSwgJmVudik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21vZHV0aWxzL21vZHByb2JlLXNtYWxsLmMgYi9tb2R1dGlscy9tb2Rwcm9iZS1zbWFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9tb2Rwcm9iZS1zbWFsbC5jCkBAIC0wLDAgKzEsODcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzaW1wbGlmaWVkIG1vZHByb2JlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIERyb25uaWtvdgorICogQ29weXJpZ2h0IChjKSAyMDA4IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlciAoaW5pdGlhbCBkZXBtb2QgY29kZSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX01PRFBST0JFX1NNQUxMKEFQUExFVChtb2Rwcm9iZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShkZXBtb2QsIG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBtb2Rwcm9iZSkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShpbnNtb2QsIG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBtb2Rwcm9iZSkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShsc21vZCwgbW9kcHJvYmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1vZHByb2JlKSkKKy8vYXBwbGV0OklGX01PRFBST0JFX1NNQUxMKEFQUExFVF9PREROQU1FKHJtbW9kLCBtb2Rwcm9iZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbW9kcHJvYmUpKQorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIHNpbmNlIGl0IG5lZWRzIHN5cy90eXBlcy5oIG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+IC8qIHVuYW1lKCkgKi8KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKK2V4dGVybiBpbnQgaW5pdF9tb2R1bGUodm9pZCAqbW9kdWxlLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqb3B0aW9ucyk7CitleHRlcm4gaW50IGRlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBmbGFncyk7CitleHRlcm4gaW50IHF1ZXJ5X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBpbnQgd2hpY2gsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCAqcmV0KTsKKworCisjaWYgMQorIyBkZWZpbmUgZGJnMV9lcnJvcl9tc2coLi4uKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGRiZzJfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjZWxzZQorIyBkZWZpbmUgZGJnMV9lcnJvcl9tc2coLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjIGRlZmluZSBkYmcyX2Vycm9yX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisjZGVmaW5lIERFUEZJTEVfQkIgQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUiLmJiIgorCitlbnVtIHsKKwlPUFRfcSA9ICgxIDw8IDApLCAvKiBiZSBxdWlldCAqLworCU9QVF9yID0gKDEgPDwgMSksIC8qIG1vZHVsZSByZW1vdmFsIGluc3RlYWQgb2YgbG9hZGluZyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbW9kdWxlX2luZm8geworCWNoYXIgKnBhdGhuYW1lOworCWNoYXIgKmFsaWFzZXM7CisJY2hhciAqZGVwczsKK30gbW9kdWxlX2luZm87CisKKy8qCisgKiBHTE9CQUxTCisgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwltb2R1bGVfaW5mbyAqbW9kaW5mbzsKKwljaGFyICptb2R1bGVfbG9hZF9vcHRpb25zOworCXNtYWxsaW50IGRlcF9iYl9zZWVuOworCXNtYWxsaW50IHdyb3RlX2RlcF9iYl9vazsKKwl1bnNpZ25lZCBtb2R1bGVfY291bnQ7CisJaW50IG1vZHVsZV9mb3VuZF9pZHg7CisJdW5zaWduZWQgc3RyaW5nYnVmX2lkeDsKKwl1bnNpZ25lZCBzdHJpbmdidWZfc2l6ZTsKKwljaGFyICpzdHJpbmdidWY7IC8qIHNvbWUgbW9kdWxlcyBoYXZlIGxvdHMgb2Ygc3R1ZmYgKi8KKwkvKiBmb3IgZXhhbXBsZSwgZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQua28gKi8KKwkvKiB0aGVyZWZvcmUgaGF2aW5nIGEgZml4ZWQgYmlnZ2lzaCBidWZmZXIgaXMgbm90IHdpc2UgKi8KK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgbW9kaW5mbyAgICAgICAgICAgICAoRy5tb2RpbmZvICAgICAgICAgICAgKQorI2RlZmluZSBkZXBfYmJfc2VlbiAgICAgICAgIChHLmRlcF9iYl9zZWVuICAgICAgICApCisjZGVmaW5lIHdyb3RlX2RlcF9iYl9vayAgICAgKEcud3JvdGVfZGVwX2JiX29rICAgICkKKyNkZWZpbmUgbW9kdWxlX2NvdW50ICAgICAgICAoRy5tb2R1bGVfY291bnQgICAgICAgKQorI2RlZmluZSBtb2R1bGVfZm91bmRfaWR4ICAgIChHLm1vZHVsZV9mb3VuZF9pZHggICApCisjZGVmaW5lIG1vZHVsZV9sb2FkX29wdGlvbnMgKEcubW9kdWxlX2xvYWRfb3B0aW9ucykKKyNkZWZpbmUgc3RyaW5nYnVmX2lkeCAgICAgICAoRy5zdHJpbmdidWZfaWR4ICAgICAgKQorI2RlZmluZSBzdHJpbmdidWZfc2l6ZSAgICAgIChHLnN0cmluZ2J1Zl9zaXplICAgICApCisjZGVmaW5lIHN0cmluZ2J1ZiAgICAgICAgICAgKEcuc3RyaW5nYnVmICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGFwcGVuZChjb25zdCBjaGFyICpzKQoreworCXVuc2lnbmVkIGxlbiA9IHN0cmxlbihzKTsKKwlpZiAoc3RyaW5nYnVmX2lkeCArIGxlbiArIDE1ID4gc3RyaW5nYnVmX3NpemUpIHsKKwkJc3RyaW5nYnVmX3NpemUgPSBzdHJpbmdidWZfaWR4ICsgbGVuICsgMTI3OworCQlkYmcyX2Vycm9yX21zZygiZ3JvdyBzdHJpbmdidWYgdG8gJXUiLCBzdHJpbmdidWZfc2l6ZSk7CisJCXN0cmluZ2J1ZiA9IHhyZWFsbG9jKHN0cmluZ2J1Ziwgc3RyaW5nYnVmX3NpemUpOworCX0KKwltZW1jcHkoc3RyaW5nYnVmICsgc3RyaW5nYnVmX2lkeCwgcywgbGVuKTsKKwlzdHJpbmdidWZfaWR4ICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kYyhjaGFyIGMpCit7CisJLyogV2UgYXBwZW5kYygpIG9ubHkgYWZ0ZXIgYXBwZW5kKCksICsgMTUgdHJpY2sgaW4gYXBwZW5kKCkKKwkgKiBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBjaGVjayBmb3Igb3ZlcmZsb3cgaGVyZSAqLworCXN0cmluZ2J1ZltzdHJpbmdidWZfaWR4KytdID0gYzsKK30KKworc3RhdGljIHZvaWQgYmtzcCh2b2lkKQoreworCWlmIChzdHJpbmdidWZfaWR4KQorCQlzdHJpbmdidWZfaWR4LS07Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3N0cmluZ2J1Zih2b2lkKQoreworCXN0cmluZ2J1Zl9pZHggPSAwOworfQorCitzdGF0aWMgY2hhciogY29weV9zdHJpbmdidWYodm9pZCkKK3sKKwljaGFyICpjb3B5ID0geHphbGxvYyhzdHJpbmdidWZfaWR4ICsgMSk7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLworCXJldHVybiBtZW1jcHkoY29weSwgc3RyaW5nYnVmLCBzdHJpbmdidWZfaWR4KTsKK30KKworc3RhdGljIGNoYXIqIGZpbmRfa2V5d29yZChjaGFyICpwdHIsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKndvcmQpCit7CisJaW50IHdsZW47CisKKwlpZiAoIXB0cikgLyogaGFwcGVucyBpZiB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UgY2Fubm90IHJlYWQgaXQgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwl3bGVuID0gc3RybGVuKHdvcmQpOworCWxlbiAtPSB3bGVuIC0gMTsKKwl3aGlsZSAoKHNzaXplX3QpbGVuID4gMCkgeworCQljaGFyICpvbGQgPSBwdHI7CisJCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGNoYXIgaW4gd29yZCAqLworCQlwdHIgPSBtZW1jaHIocHRyLCAqd29yZCwgbGVuKTsKKwkJaWYgKHB0ciA9PSBOVUxMKSAvKiBubyBvY2N1cmFuY2UgbGVmdCwgZG9uZSAqLworCQkJYnJlYWs7CisJCWlmIChzdHJuY21wKHB0ciwgd29yZCwgd2xlbikgPT0gMCkKKwkJCXJldHVybiBwdHIgKyB3bGVuOyAvKiBmb3VuZCwgcmV0dXJuIHB0ciBwYXN0IGl0ICovCisJCSsrcHRyOworCQlsZW4gLT0gKHB0ciAtIG9sZCk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZXBsYWNlKGNoYXIgKnMsIGNoYXIgd2hhdCwgY2hhciB3aXRoKQoreworCXdoaWxlICgqcykgeworCQlpZiAod2hhdCA9PSAqcykKKwkJCSpzID0gd2l0aDsKKwkJKytzOworCX0KK30KKworLyogVGFrZSAid29yZCB3b3JkIiwgcmV0dXJuIG1hbGxvY2VkICJ3b3JkIixOVUwsIndvcmQiLE5VTCxOVUwgKi8KK3N0YXRpYyBjaGFyKiBzdHJfMl9saXN0KGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cikgKyAxOworCWNoYXIgKmRzdCA9IHhtYWxsb2MobGVuICsgMSk7CisKKwlkc3RbbGVuXSA9ICdcMCc7CisJbWVtY3B5KGRzdCwgc3RyLCBsZW4pOworLy9UT0RPOiBwcm90ZWN0IGFnYWluc3QgMisgc3BhY2VzOiAid29yZCAgd29yZCIKKwlyZXBsYWNlKGRzdCwgJyAnLCAnXDAnKTsKKwlyZXR1cm4gZHN0OworfQorCisvKiBXZSB1c2UgZXJyb3IgbnVtYmVycyBpbiBhIGxvb3NlIHRyYW5zbGF0aW9uLi4uICovCitzdGF0aWMgY29uc3QgY2hhciAqbW9kZXJyb3IoaW50IGVycikKK3sKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgRU5PRVhFQzoKKwkJcmV0dXJuICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOworCWNhc2UgRU5PRU5UOgorCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciBpbnZhbGlkIHBhcmFtZXRlciI7CisJY2FzZSBFU1JDSDoKKwkJcmV0dXJuICJtb2R1bGUgaGFzIHdyb25nIHN5bWJvbCB2ZXJzaW9uIjsKKwljYXNlIEVJTlZBTDogLyogImludmFsaWQgcGFyYW1ldGVyIiAqLworCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciBpbnZhbGlkIHBhcmFtZXRlciIKKwkJKyBzaXplb2YoInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciIpOworCWRlZmF1bHQ6CisJCXJldHVybiBzdHJlcnJvcihlcnIpOworCX0KK30KKworc3RhdGljIGludCBsb2FkX21vZHVsZShjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKyNpZiAxCisJaW50IHI7CisJc2l6ZV90IGxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwljaGFyICptb2R1bGVfaW1hZ2U7CisJZGJnMV9lcnJvcl9tc2coImxvYWRfbW9kdWxlKCclcycsJyVzJykiLCBmbmFtZSwgb3B0aW9ucyk7CisKKwltb2R1bGVfaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoZm5hbWUsICZsZW4pOworCXIgPSAoIW1vZHVsZV9pbWFnZSB8fCBpbml0X21vZHVsZShtb2R1bGVfaW1hZ2UsIGxlbiwgb3B0aW9ucyA/IG9wdGlvbnMgOiAiIikgIT0gMCk7CisJZnJlZShtb2R1bGVfaW1hZ2UpOworCWRiZzFfZXJyb3JfbXNnKCJsb2FkX21vZHVsZTolZCIsIHIpOworCXJldHVybiByOyAvKiAwID0gc3VjY2VzcyAqLworI2Vsc2UKKwkvKiBGb3IgdGVzdGluZyAqLworCWRiZzFfZXJyb3JfbXNnKCJsb2FkX21vZHVsZSgnJXMnLCclcycpIiwgZm5hbWUsIG9wdGlvbnMpOworCXJldHVybiAxOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX21vZHVsZShtb2R1bGVfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJY2hhciAqbW9kdWxlX2ltYWdlOworCWNoYXIgKnB0cjsKKwlzaXplX3QgbGVuOworCXNpemVfdCBwb3M7CisJZGJnMV9lcnJvcl9tc2coInBhcnNlX21vZHVsZSgnJXMnKSIsIHBhdGhuYW1lKTsKKworCS8qIFJlYWQgKHBvc3NpYmx5IGNvbXByZXNzZWQpIG1vZHVsZSAqLworCWxlbiA9IDY0ICogMTAyNCAqIDEwMjQ7IC8qIDY0IE1iIGF0IG1vc3QgKi8KKwltb2R1bGVfaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aG5hbWUsICZsZW4pOworCS8qIG1vZHVsZV9pbWFnZSA9PSBOVUxMIGlzIG9rIGhlcmUsIGZpbmRfa2V5d29yZCBoYW5kbGVzIGl0ICovCisvL1RPRE86IG9wdGltaXplIHJlZHVuZGFudCBtb2R1bGUgYm9keSByZWFkcworCisJLyogImFsaWFzMSBzeW1ib2w6c3ltMSBhbGlhczIgc3ltYm9sOnN5bTIiICovCisJcmVzZXRfc3RyaW5nYnVmKCk7CisJcG9zID0gMDsKKwl3aGlsZSAoMSkgeworCQlwdHIgPSBmaW5kX2tleXdvcmQobW9kdWxlX2ltYWdlICsgcG9zLCBsZW4gLSBwb3MsICJhbGlhcz0iKTsKKwkJaWYgKCFwdHIpIHsKKwkJCXB0ciA9IGZpbmRfa2V5d29yZChtb2R1bGVfaW1hZ2UgKyBwb3MsIGxlbiAtIHBvcywgIl9fa3N5bXRhYl8iKTsKKwkJCWlmICghcHRyKQorCQkJCWJyZWFrOworCQkJLyogRE9DTUU6IF9fa3N5bXRhYl9ncGwgYW5kIF9fa3N5bXRhYl9zdHJpbmdzIG9jY3VyCisJCQkgKiBpbiBtYW55IG1vZHVsZXMuIFdoYXQgZG8gdGhleSBtZWFuPyAqLworCQkJaWYgKHN0cmNtcChwdHIsICJncGwiKSA9PSAwIHx8IHN0cmNtcChwdHIsICJzdHJpbmdzIikgPT0gMCkKKwkJCQlnb3RvIHNraXA7CisJCQlkYmcyX2Vycm9yX21zZygiYWxpYXM6J3N5bWJvbDolcyciLCBwdHIpOworCQkJYXBwZW5kKCJzeW1ib2w6Iik7CisJCX0gZWxzZSB7CisJCQlkYmcyX2Vycm9yX21zZygiYWxpYXM6JyVzJyIsIHB0cik7CisJCX0KKwkJYXBwZW5kKHB0cik7CisJCWFwcGVuZGMoJyAnKTsKKyBza2lwOgorCQlwb3MgPSAocHRyIC0gbW9kdWxlX2ltYWdlKTsKKwl9CisJYmtzcCgpOyAvKiByZW1vdmUgbGFzdCAnICcgKi8KKwlpbmZvLT5hbGlhc2VzID0gY29weV9zdHJpbmdidWYoKTsKKwlyZXBsYWNlKGluZm8tPmFsaWFzZXMsICctJywgJ18nKTsKKworCS8qICJkZXBlbmRlbmN5MSBkZXBhbmRlbmN5MiIgKi8KKwlyZXNldF9zdHJpbmdidWYoKTsKKwlwdHIgPSBmaW5kX2tleXdvcmQobW9kdWxlX2ltYWdlLCBsZW4sICJkZXBlbmRzPSIpOworCWlmIChwdHIgJiYgKnB0cikgeworCQlyZXBsYWNlKHB0ciwgJywnLCAnICcpOworCQlyZXBsYWNlKHB0ciwgJy0nLCAnXycpOworCQlkYmcyX2Vycm9yX21zZygiZGVwOiclcyciLCBwdHIpOworCQlhcHBlbmQocHRyKTsKKwl9CisJaW5mby0+ZGVwcyA9IGNvcHlfc3RyaW5nYnVmKCk7CisKKwlmcmVlKG1vZHVsZV9pbWFnZSk7Cit9CisKK3N0YXRpYyBpbnQgcGF0aG5hbWVfbWF0Y2hlc19tb2RuYW1lKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBjb25zdCBjaGFyICptb2RuYW1lKQoreworCWNvbnN0IGNoYXIgKmZuYW1lID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChwYXRobmFtZSk7CisJY29uc3QgY2hhciAqc3VmZml4ID0gc3RycnN0cihmbmFtZSwgIi5rbyIpOworLy9UT0RPOiBjYW4gZG8gd2l0aG91dCBtYWxsb2M/CisJY2hhciAqbmFtZSA9IHhzdHJuZHVwKGZuYW1lLCBzdWZmaXggLSBmbmFtZSk7CisJaW50IHI7CisJcmVwbGFjZShuYW1lLCAnLScsICdfJyk7CisJciA9IChzdHJjbXAobmFtZSwgbW9kbmFtZSkgPT0gMCk7CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIEZBU1RfRlVOQyBpbnQgZmlsZUFjdGlvbihjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJc3RydWN0IHN0YXQgKnNiIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqbW9kbmFtZV90b19tYXRjaCwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgY3VyOworCWNvbnN0IGNoYXIgKmZuYW1lOworCisJcGF0aG5hbWUgKz0gMjsgLyogc2tpcCAiLi8iICovCisJZm5hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHBhdGhuYW1lKTsKKwlpZiAoIXN0cnJzdHIoZm5hbWUsICIua28iKSkgeworCQlkYmcxX2Vycm9yX21zZygiJyVzJyBpcyBub3QgYSBtb2R1bGUiLCBwYXRobmFtZSk7CisJCXJldHVybiBUUlVFOyAvKiBub3QgYSBtb2R1bGUsIGNvbnRpbnVlIHNlYXJjaCAqLworCX0KKworCWN1ciA9IG1vZHVsZV9jb3VudCsrOworCW1vZGluZm8gPSB4cmVhbGxvY192ZWN0b3IobW9kaW5mbywgMTIsIGN1cik7CisJbW9kaW5mb1tjdXJdLnBhdGhuYW1lID0geHN0cmR1cChwYXRobmFtZSk7CisJLyptb2RpbmZvW2N1cl0uYWxpYXNlcyA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCS8qbW9kaW5mb1tjdXIrMV0ucGF0aG5hbWUgPSBOVUxMOyovCisKKwlpZiAoIXBhdGhuYW1lX21hdGNoZXNfbW9kbmFtZShmbmFtZSwgbW9kbmFtZV90b19tYXRjaCkpIHsKKwkJZGJnMV9lcnJvcl9tc2coIiclcycgbW9kdWxlIG5hbWUgZG9lc24ndCBtYXRjaCIsIHBhdGhuYW1lKTsKKwkJcmV0dXJuIFRSVUU7IC8qIG1vZHVsZSBuYW1lIGRvZXNuJ3QgbWF0Y2gsIGNvbnRpbnVlIHNlYXJjaCAqLworCX0KKworCWRiZzFfZXJyb3JfbXNnKCInJXMnIG1vZHVsZSBuYW1lIG1hdGNoZXMiLCBwYXRobmFtZSk7CisJbW9kdWxlX2ZvdW5kX2lkeCA9IGN1cjsKKwlwYXJzZV9tb2R1bGUoJm1vZGluZm9bY3VyXSwgcGF0aG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9yKSkgeworCQlpZiAobG9hZF9tb2R1bGUocGF0aG5hbWUsIG1vZHVsZV9sb2FkX29wdGlvbnMpID09IDApIHsKKwkJCS8qIExvYWQgd2FzIHN1Y2Nlc3NmdWwsIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkby4KKwkJCSAqIFRoaXMgY2FuIGhhcHBlbiBPTkxZIGZvciAidG9wLWxldmVsIiBtb2R1bGUgbG9hZCwKKwkJCSAqIG5vdCBhIGRlcCwgYmVjYXVzZSBkZXBzIGRvbnQgZG8gZGlyc2Nhbi4gKi8KKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGxvYWRfZGVwX2JiKHZvaWQpCit7CisJY2hhciAqbGluZTsKKwlGSUxFICpmcCA9IGZvcGVuX2Zvcl9yZWFkKERFUEZJTEVfQkIpOworCisJaWYgKCFmcCkKKwkJcmV0dXJuIDA7CisKKwlkZXBfYmJfc2VlbiA9IDE7CisJZGJnMV9lcnJvcl9tc2coImxvYWRpbmcgIkRFUEZJTEVfQkIpOworCisJLyogV2h5PyBUaGVyZSBpcyBhIHJhcmUgc2NlbmFyaW86IHdlIGRpZCBub3QgZmluZCBtb2Rwcm9iZS5kZXAuYmIsCisJICogd2Ugc2Nhbm5lZCB0aGUgZGlyIGFuZCBmb3VuZCBubyBtb2R1bGUgYnkgbmFtZSwgdGhlbiB3ZSBzZWFyY2gKKwkgKiBmb3IgYWxpYXMgKGZ1bGwgc2NhbiksIGFuZCB3ZSBkZWNpZGVkIHRvIGdlbmVyYXRlIG1vZHByb2JlLmRlcC5iYi4KKwkgKiBCdXQgd2Ugc2VlIG1vZHByb2JlLmRlcC5iYi5uZXchIE90aGVyIG1vZHByb2JlIGlzIGF0IHdvcmshCisJICogV2Ugd2FpdCBhbmQgb3RoZXIgbW9kcHJvYmUgcmVuYW1lcyBpdCB0byBtb2Rwcm9iZS5kZXAuYmIuCisJICogTm93IHdlIGNhbiB1c2UgaXQuCisJICogQnV0IHdlIGFscmVhZHkgaGF2ZSBtb2RpbmZvW10gZmlsbGVkLCBhbmQgIm1vZHVsZV9jb3VudCA9IDAiCisJICogbWFrZXMgdXMgc3RhcnQgYW5ldy4gWWVzLCB3ZSBsZWFrIG1vZGluZm9bXS54eHggcG9pbnRlcnMgLQorCSAqIHRoZXJlIGlzIG5vdCBtdWNoIG9mIGRhdGEgdGhlcmUgYW55d2F5LiAqLworCW1vZHVsZV9jb3VudCA9IDA7CisJbWVtc2V0KCZtb2RpbmZvWzBdLCAwLCBzaXplb2YobW9kaW5mb1swXSkpOworCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJY2hhciogc3BhY2U7CisJCWNoYXIqIGxpbmVidWY7CisJCWludCBjdXI7CisKKwkJaWYgKCFsaW5lWzBdKSB7CisJCQlmcmVlKGxpbmUpOworCQkJY29udGludWU7CisJCX0KKwkJc3BhY2UgPSBzdHJjaHJudWwobGluZSwgJyAnKTsKKwkJY3VyID0gbW9kdWxlX2NvdW50Kys7CisJCW1vZGluZm8gPSB4cmVhbGxvY192ZWN0b3IobW9kaW5mbywgMTIsIGN1cik7CisJCS8qbW9kaW5mb1tjdXIrMV0ucGF0aG5hbWUgPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKwkJbW9kaW5mb1tjdXJdLnBhdGhuYW1lID0gbGluZTsgLyogd2UgdGFrZSBvd25lcnNoaXAgb2YgbWFsbG9jZWQgYmxvY2sgaGVyZSAqLworCQlpZiAoKnNwYWNlKQorCQkJKnNwYWNlKysgPSAnXDAnOworCQltb2RpbmZvW2N1cl0uYWxpYXNlcyA9IHNwYWNlOworCQlsaW5lYnVmID0geG1hbGxvY19mZ2V0bGluZShmcCk7CisJCW1vZGluZm9bY3VyXS5kZXBzID0gbGluZWJ1ZiA/IGxpbmVidWYgOiB4emFsbG9jKDEpOworCQlpZiAobW9kaW5mb1tjdXJdLmRlcHNbMF0pIHsKKwkJCS8qIGRlcHMgYXJlIG5vdCAiIiwgc28gbmV4dCBsaW5lIG11c3QgYmUgZW1wdHkgKi8KKwkJCWxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKTsKKwkJCS8qIFJlZnVzZSB0byB3b3JrIHdpdGggZGFtYWdlZCBjb25maWcgZmlsZSAqLworCQkJaWYgKGxpbmUgJiYgbGluZVswXSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgaW4gJXMgYXQgJyVzJyIsIERFUEZJTEVfQkIsIGxpbmUpOworCQkJZnJlZShsaW5lKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzdGFydF9kZXBfYmJfd3JpdGVvdXQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwkvKiBkZXBtb2QgLW46IHdyaXRlIHJlc3VsdCB0byBzdGRvdXQgKi8KKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ2QnICYmIChvcHRpb25fbWFzazMyICYgMSkpCisJCXJldHVybiBTVERPVVRfRklMRU5POworCisJZmQgPSBvcGVuKERFUEZJTEVfQkIiLm5ldyIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0VYQ0wsIDA2NDQpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJaW50IGNvdW50ID0gNSAqIDIwOworCQkJZGJnMV9lcnJvcl9tc2coREVQRklMRV9CQiIubmV3IGV4aXN0cywgd2FpdGluZyBmb3IgIkRFUEZJTEVfQkIpOworCQkJd2hpbGUgKDEpIHsKKwkJCQl1c2xlZXAoMTAwMCoxMDAwIC8gMjApOworCQkJCWlmIChsb2FkX2RlcF9iYigpKSB7CisJCQkJCWRiZzFfZXJyb3JfbXNnKERFUEZJTEVfQkIiIGFwcGVhcmVkIik7CisJCQkJCXJldHVybiAtMjsgLyogbWFnaWMgbnVtYmVyICovCisJCQkJfQorCQkJCWlmICghLS1jb3VudCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQliYl9lcnJvcl9tc2coImRlbGV0aW5nIHN0YWxlICVzIiwgREVQRklMRV9CQiIubmV3Iik7CisJCQlmZCA9IG9wZW5fb3Jfd2FybihERVBGSUxFX0JCIi5uZXciLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKwkJfQorCX0KKwlkYmcxX2Vycm9yX21zZygib3BlbmVkICJERVBGSUxFX0JCIi5uZXc6JWQiLCBmZCk7CisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9vdXRfZGVwX2JiKGludCBmZCkKK3sKKwlpbnQgaTsKKwlGSUxFICpmcDsKKworCS8qIFdlIHdhbnQgZ29vZCBlcnJvciByZXBvcnRpbmcuIGZkcHJpbnRmIGlzIG5vdCBnb29kIGVub3VnaC4gKi8KKwlmcCA9IHhmZG9wZW5fZm9yX3dyaXRlKGZkKTsKKwlpID0gMDsKKwl3aGlsZSAobW9kaW5mb1tpXS5wYXRobmFtZSkgeworCQlmcHJpbnRmKGZwLCAiJXMlcyVzXG4iICIlcyVzXG4iLAorCQkJbW9kaW5mb1tpXS5wYXRobmFtZSwgbW9kaW5mb1tpXS5hbGlhc2VzWzBdID8gIiAiIDogIiIsIG1vZGluZm9baV0uYWxpYXNlcywKKwkJCW1vZGluZm9baV0uZGVwcywgbW9kaW5mb1tpXS5kZXBzWzBdID8gIlxuIiA6ICIiKTsKKwkJaSsrOworCX0KKwkvKiBCYWRseSBmb3JtYXR0ZWQgZGVwZmlsZSBpcyBhIG5vLW5vLiBCZSBwYXJhbm9pZC4gKi8KKwllcnJubyA9IDA7CisJaWYgKGZlcnJvcihmcCkgfCBmY2xvc2UoZnApKSAvKiB8IGluc3RlYWQgb2YgfHwgaXMgaW50ZW5kZWQgKi8KKwkJZ290byBlcnI7CisKKwlpZiAoZmQgPT0gU1RET1VUX0ZJTEVOTykgLyogaXQgd2FzIGRlcG1vZCAtbiAqLworCQlnb3RvIG9rOworCisJaWYgKHJlbmFtZShERVBGSUxFX0JCIi5uZXciLCBERVBGSUxFX0JCKSAhPSAwKSB7CisgZXJyOgorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIERFUEZJTEVfQkIpOworCQl1bmxpbmsoREVQRklMRV9CQiIubmV3Iik7CisJfSBlbHNlIHsKKyBvazoKKwkJd3JvdGVfZGVwX2JiX29rID0gMTsKKwkJZGJnMV9lcnJvcl9tc2coImNyZWF0ZWQgIkRFUEZJTEVfQkIpOworCX0KK30KKworc3RhdGljIG1vZHVsZV9pbmZvKiBmaW5kX2FsaWFzKGNvbnN0IGNoYXIgKmFsaWFzKQoreworCWludCBpOworCWludCBkZXBfYmJfZmQ7CisJbW9kdWxlX2luZm8gKnJlc3VsdDsKKwlkYmcxX2Vycm9yX21zZygiZmluZF9hbGlhcygnJXMnKSIsIGFsaWFzKTsKKworIHRyeV9hZ2FpbjoKKwkvKiBGaXJzdCB0cnkgdG8gZmluZCBieSBuYW1lIChjaGVhcGVyKSAqLworCWkgPSAwOworCXdoaWxlIChtb2RpbmZvW2ldLnBhdGhuYW1lKSB7CisJCWlmIChwYXRobmFtZV9tYXRjaGVzX21vZG5hbWUobW9kaW5mb1tpXS5wYXRobmFtZSwgYWxpYXMpKSB7CisJCQlkYmcxX2Vycm9yX21zZygiZm91bmQgJyVzJyBpbiBtb2R1bGUgJyVzJyIsCisJCQkJCWFsaWFzLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJCWlmICghbW9kaW5mb1tpXS5hbGlhc2VzKSB7CisJCQkJcGFyc2VfbW9kdWxlKCZtb2RpbmZvW2ldLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJCX0KKwkJCXJldHVybiAmbW9kaW5mb1tpXTsKKwkJfQorCQlpKys7CisJfQorCisJLyogT2ssIHdlIGRlZmluaXRlbHkgaGF2ZSB0byBzY2FuIG1vZHVsZSBib2RpZXMuIFRoaXMgaXMgYSBnb29kCisJICogbW9tZW50IHRvIGdlbmVyYXRlIG1vZHByb2JlLmRlcC5iYiwgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0ICovCisJZGVwX2JiX2ZkID0gZGVwX2JiX3NlZW4gPyAtMSA6IHN0YXJ0X2RlcF9iYl93cml0ZW91dCgpOworCWlmIChkZXBfYmJfZmQgPT0gLTIpIC8qIG1vZHByb2JlLmRlcC5iYiBhcHBlYXJlZD8gKi8KKwkJZ290byB0cnlfYWdhaW47CisKKwkvKiBTY2FuIGFsbCBtb2R1bGUgYm9kaWVzLCBleHRyYWN0IG1vZGluZm8gKGl0IGNvbnRhaW5zIGFsaWFzZXMpICovCisJaSA9IDA7CisJcmVzdWx0ID0gTlVMTDsKKwl3aGlsZSAobW9kaW5mb1tpXS5wYXRobmFtZSkgeworCQljaGFyICpkZXNjLCAqczsKKwkJaWYgKCFtb2RpbmZvW2ldLmFsaWFzZXMpIHsKKwkJCXBhcnNlX21vZHVsZSgmbW9kaW5mb1tpXSwgbW9kaW5mb1tpXS5wYXRobmFtZSk7CisJCX0KKwkJaWYgKHJlc3VsdCkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKwkJLyogImFsaWFzMSBzeW1ib2w6c3ltMSBhbGlhczIgc3ltYm9sOnN5bTIiICovCisJCWRlc2MgPSBzdHJfMl9saXN0KG1vZGluZm9baV0uYWxpYXNlcyk7CisJCS8qIERvZXMgbWF0Y2hpbmcgc3Vic3RyaW5nIGV4aXN0PyAqLworCQlmb3IgKHMgPSBkZXNjOyAqczsgcyArPSBzdHJsZW4ocykgKyAxKSB7CisJCQkvKiBBbGlhc2VzIGluIG1vZHVsZSBib2RpZXMgY2FuIGJlIGRlZmluZWQgd2l0aAorCQkJICogc2hlbGwgcGF0dGVybnMuIEV4YW1wbGU6CisJCQkgKiAicGNpOnYwMDAwMTBERWQwMDAwMDBEOXN2KnNkKmJjKnNjKmkqIi4KKwkJCSAqIFBsYWluIHN0cmNtcCgpIHdvbid0IGNhdGNoIHRoYXQgKi8KKwkJCWlmIChmbm1hdGNoKHMsIGFsaWFzLCAwKSA9PSAwKSB7CisJCQkJZGJnMV9lcnJvcl9tc2coImZvdW5kIGFsaWFzICclcycgaW4gbW9kdWxlICclcyciLAorCQkJCQkJYWxpYXMsIG1vZGluZm9baV0ucGF0aG5hbWUpOworCQkJCXJlc3VsdCA9ICZtb2RpbmZvW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZyZWUoZGVzYyk7CisJCWlmIChyZXN1bHQgJiYgZGVwX2JiX2ZkIDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWkrKzsKKwl9CisKKwkvKiBDcmVhdGUgbW9kdWxlLmRlcC5iYiBpZiBuZWVkZWQgKi8KKwlpZiAoZGVwX2JiX2ZkID49IDApIHsKKwkJd3JpdGVfb3V0X2RlcF9iYihkZXBfYmJfZmQpOworCX0KKworCWRiZzFfZXJyb3JfbXNnKCJmaW5kX2FsaWFzICclcycgcmV0dXJucyAlcCIsIGFsaWFzLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRAorLy8gVE9ETzogb3BlbiBvbmx5IG9uY2UsIGludmVudCBjb25maWdfcmV3aW5kKCkKK3N0YXRpYyBpbnQgYWxyZWFkeV9sb2FkZWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpzOworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9wcm9jL21vZHVsZXMiLCB4Zm9wZW5fZm9yX3JlYWQpOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsICZzLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCAmIH5QQVJTRV9HUkVFRFkpKSB7CisJCWlmIChzdHJjbXAocywgbmFtZSkgPT0gMCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCXJldHVybiByZXQ7Cit9CisjZWxzZQorI2RlZmluZSBhbHJlYWR5X2xvYWRlZChuYW1lKSBpc19ybW1vZAorI2VuZGlmCisKKy8qCisgKiBHaXZlbiBtb2R1bGVzIGRlZmluaXRpb24gYW5kIG1vZHVsZSBuYW1lIChvciBhbGlhcywgb3Igc3ltYm9sKQorICogbG9hZC9yZW1vdmUgdGhlIG1vZHVsZSByZXNwZWN0aW5nIGRlcGVuZGVuY2llcy4KKyAqIE5COiBhbHNvIGNhbGxlZCBieSBkZXBtb2Qgd2l0aCBib2d1cyBuYW1lICIvIiwKKyAqIGp1c3QgaW4gb3JkZXIgdG8gZm9yY2UgbW9kcHJvYmUuZGVwLmJiIGNyZWF0aW9uLgorKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FCisjZGVmaW5lIHByb2Nlc3NfbW9kdWxlKGEsYikgcHJvY2Vzc19tb2R1bGUoYSkKKyNkZWZpbmUgY21kbGluZV9vcHRpb25zICIiCisjZW5kaWYKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbW9kdWxlKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNtZGxpbmVfb3B0aW9ucykKK3sKKwljaGFyICpzLCAqZGVwcywgKm9wdGlvbnM7CisJbW9kdWxlX2luZm8gKmluZm87CisJaW50IGlzX3JtbW9kID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgIT0gMDsKKwlkYmcxX2Vycm9yX21zZygicHJvY2Vzc19tb2R1bGUoJyVzJywnJXMnKSIsIG5hbWUsIGNtZGxpbmVfb3B0aW9ucyk7CisKKwlyZXBsYWNlKG5hbWUsICctJywgJ18nKTsKKworCWRiZzFfZXJyb3JfbXNnKCJhbHJlYWR5X2xvYWRlZDolZCBpc19ybW1vZDolZCIsIGFscmVhZHlfbG9hZGVkKG5hbWUpLCBpc19ybW1vZCk7CisJaWYgKGFscmVhZHlfbG9hZGVkKG5hbWUpICE9IGlzX3JtbW9kKSB7CisJCWRiZzFfZXJyb3JfbXNnKCJub3RoaW5nIHRvIGRvIGZvciAnJXMnIiwgbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlvcHRpb25zID0gTlVMTDsKKwlpZiAoIWlzX3JtbW9kKSB7CisJCWNoYXIgKm9wdF9maWxlbmFtZSA9IHhhc3ByaW50ZigiL2V0Yy9tb2R1bGVzLyVzIiwgbmFtZSk7CisJCW9wdGlvbnMgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShvcHRfZmlsZW5hbWUsIE5VTEwpOworCQlpZiAob3B0aW9ucykKKwkJCXJlcGxhY2Uob3B0aW9ucywgJ1xuJywgJyAnKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUKKwkJaWYgKGNtZGxpbmVfb3B0aW9ucykgeworCQkJLyogTkI6IGNtZGxpbmVfb3B0aW9ucyBhbHdheXMgaGF2ZSBvbmUgbGVhZGluZyAnICcKKwkJCSAqIChzZWUgbWFpbigpKSwgd2UgcmVtb3ZlIGl0IGhlcmUgKi8KKwkJCWNoYXIgKm9wID0geGFzcHJpbnRmKG9wdGlvbnMgPyAiJXMgJXMiIDogIiVzICVzIiArIDMsCisJCQkJCQljbWRsaW5lX29wdGlvbnMgKyAxLCBvcHRpb25zKTsKKwkJCWZyZWUob3B0aW9ucyk7CisJCQlvcHRpb25zID0gb3A7CisJCX0KKyNlbmRpZgorCQlmcmVlKG9wdF9maWxlbmFtZSk7CisJCW1vZHVsZV9sb2FkX29wdGlvbnMgPSBvcHRpb25zOworCQlkYmcxX2Vycm9yX21zZygicHJvY2Vzc19tb2R1bGUoJyVzJyk6IG9wdGlvbnM6JyVzJyIsIG5hbWUsIG9wdGlvbnMpOworCX0KKworCWlmICghbW9kdWxlX2NvdW50KSB7CisJCS8qIFNjYW4gbW9kdWxlIGRpcmVjdG9yeS4gVGhpcyBpcyBkb25lIG9ubHkgb25jZS4KKwkJICogSXQgd2lsbCBhdHRlbXB0IG1vZHVsZSBsb2FkLCBhbmQgd2lsbCBleGl0KEVYSVRfU1VDQ0VTUykKKwkJICogb24gc3VjY2Vzcy4gKi8KKwkJbW9kdWxlX2ZvdW5kX2lkeCA9IC0xOworCQlyZWN1cnNpdmVfYWN0aW9uKCIuIiwKKwkJCUFDVElPTl9SRUNVUlNFLCAvKiBmbGFncyAqLworCQkJZmlsZUFjdGlvbiwgLyogZmlsZSBhY3Rpb24gKi8KKwkJCU5VTEwsIC8qIGRpciBhY3Rpb24gKi8KKwkJCW5hbWUsIC8qIHVzZXIgZGF0YSAqLworCQkJMCk7IC8qIGRlcHRoICovCisJCWRiZzFfZXJyb3JfbXNnKCJkaXJzY2FuIGNvbXBsZXRlIik7CisJCS8qIE1vZHVsZSB3YXMgbm90IGZvdW5kLCBvciBsb2FkIGZhaWxlZCwgb3IgaXNfcm1tb2QgKi8KKwkJaWYgKG1vZHVsZV9mb3VuZF9pZHggPj0gMCkgeyAvKiBtb2R1bGUgd2FzIGZvdW5kICovCisJCQlpbmZvID0gJm1vZGluZm9bbW9kdWxlX2ZvdW5kX2lkeF07CisJCX0gZWxzZSB7IC8qIHNlYXJjaCBmb3IgYWxpYXMsIG5vdCBhIHBsYWluIG1vZHVsZSBuYW1lICovCisJCQlpbmZvID0gZmluZF9hbGlhcyhuYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCWluZm8gPSBmaW5kX2FsaWFzKG5hbWUpOworCX0KKworLy8gUHJvYmxlbSBoZXJlOiB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBtb2R1bGUKKy8vIGZvciB0aGUgZ2l2ZW4gYWxpYXMuIEZvciBleGFtcGxlLAorLy8gInBjaTp2MDAwMDgwODZkMDAwMDcwMTBzdjAwMDAwMDAwc2QwMDAwMDAwMGJjMDFzYzAxaTgwIiBtYXRjaGVzCisvLyBhdGFfcGlpeCBiZWNhdXNlIGl0IGhhcyBhbiBhbGlhcyAicGNpOnYwMDAwODA4NmQwMDAwNzAxMHN2KnNkKmJjKnNjKmkqIgorLy8gYW5kIGF0YV9nZW5lcmljLCBpdCBoYXMgYW4gYWxpYXMgImFsaWFzPXBjaTp2KmQqc3Yqc2QqYmMwMXNjMDFpKiIKKy8vIFN0YW5kYXJkIG1vZHByb2JlIHdvdWxkIGxvYWQgdGhlbSBib3RoLgorLy8gSW4gdGhpcyBjb2RlLCBmaW5kX2FsaWFzKCkgcmV0dXJucyBvbmx5IHRoZSBmaXJzdCBtYXRjaGluZyBtb2R1bGUuCisKKwkvKiBybW1vZD8gdW5sb2FkIGl0IGJ5IG5hbWUgKi8KKwlpZiAoaXNfcm1tb2QpIHsKKwkJaWYgKGRlbGV0ZV9tb2R1bGUobmFtZSwgT19OT05CTE9DSyB8IE9fRVhDTCkgIT0gMCkgeworCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9xKSkKKwkJCQliYl9wZXJyb3JfbXNnKCJyZW1vdmUgJyVzJyIsIG5hbWUpOworCQkJZ290byByZXQ7CisJCX0KKwkJLyogTi5CLiB3ZSBkbyBub3Qgc3RvcCBoZXJlIC0KKwkJICogY29udGludWUgdG8gdW5sb2FkIG1vZHVsZXMgb24gd2hpY2ggdGhlIG1vZHVsZSBkZXBlbmRzOgorCQkgKiAiLXIgLS1yZW1vdmU6IG9wdGlvbiBjYXVzZXMgbW9kcHJvYmUgdG8gcmVtb3ZlIGEgbW9kdWxlLgorCQkgKiBJZiB0aGUgbW9kdWxlcyBpdCBkZXBlbmRzIG9uIGFyZSBhbHNvIHVudXNlZCwgbW9kcHJvYmUKKwkJICogd2lsbCB0cnkgdG8gcmVtb3ZlIHRoZW0sIHRvby4iICovCisJfQorCisJaWYgKCFpbmZvKSB7CisJCS8qIGJvdGggZGlyc2NhbiBhbmQgZmluZF9hbGlhcyBmb3VuZCBub3RoaW5nICovCisJCWlmICghaXNfcm1tb2QgJiYgYXBwbGV0X25hbWVbMF0gIT0gJ2QnKSAvKiBpdCB3YXNuJ3Qgcm1tb2Qgb3IgZGVwbW9kICovCisJCQliYl9lcnJvcl9tc2coIm1vZHVsZSAnJXMnIG5vdCBmb3VuZCIsIG5hbWUpOworLy9UT0RPOiBfYW5kX2RpZSgpPyBvciBzaG91bGQgd2UgY29udGludWUgKHVuKWxvYWRpbmcgbW9kdWxlcyBsaXN0ZWQgb24gY21kbGluZT8KKwkJZ290byByZXQ7CisJfQorCisJLyogSXRlcmF0ZSB0aHJ1IGRlcGVuZGVuY2llcywgdHJ5aW5nIHRvICh1bilsb2FkIHRoZW0gKi8KKwlkZXBzID0gc3RyXzJfbGlzdChpbmZvLT5kZXBzKTsKKwlmb3IgKHMgPSBkZXBzOyAqczsgcyArPSBzdHJsZW4ocykgKyAxKSB7CisJCS8vaWYgKHN0cmNtcChuYW1lLCBzKSAhPSAwKSAvLyBOLkIuIGRvIGxvb3BzIGV4aXN0PworCQlkYmcxX2Vycm9yX21zZygicmVjdXJzZSBvbiBkZXAgJyVzJyIsIHMpOworCQlwcm9jZXNzX21vZHVsZShzLCBOVUxMKTsKKwkJZGJnMV9lcnJvcl9tc2coInJlY3Vyc2Ugb24gZGVwICclcycgZG9uZSIsIHMpOworCX0KKwlmcmVlKGRlcHMpOworCisJLyogbW9kcHJvYmUgLT4gbG9hZCBpdCAqLworCWlmICghaXNfcm1tb2QpIHsKKwkJaWYgKCFvcHRpb25zIHx8IHN0cnN0cihvcHRpb25zLCAiYmxhY2tsaXN0IikgPT0gTlVMTCkgeworCQkJZXJybm8gPSAwOworCQkJaWYgKGxvYWRfbW9kdWxlKGluZm8tPnBhdGhuYW1lLCBvcHRpb25zKSAhPSAwKSB7CisJCQkJaWYgKEVFWElTVCAhPSBlcnJubykgeworCQkJCQliYl9lcnJvcl9tc2coIiclcyc6ICVzIiwKKwkJCQkJCWluZm8tPnBhdGhuYW1lLAorCQkJCQkJbW9kZXJyb3IoZXJybm8pKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkYmcxX2Vycm9yX21zZygiJyVzJzogJXMiLAorCQkJCQkJaW5mby0+cGF0aG5hbWUsCisJCQkJCQltb2RlcnJvcihlcnJubykpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRiZzFfZXJyb3JfbXNnKCInJXMnOiBibGFja2xpc3RlZCIsIGluZm8tPnBhdGhuYW1lKTsKKwkJfQorCX0KKyByZXQ6CisJZnJlZShvcHRpb25zKTsKKy8vVE9ETzogcmV0dXJuIGxvYWQgYXR0ZW1wdCByZXN1bHQgZnJvbSBwcm9jZXNzX21vZHVsZS4KKy8vSWYgZGVwIGRpZG4ndCBsb2FkIG9rLCBjb250aW51aW5nIG1ha2VzIGxpdHRsZSBzZW5zZS4KK30KKyN1bmRlZiBjbWRsaW5lX29wdGlvbnMKKworCisvKiBGb3IgcmVmZXJlbmNlLCBtb2R1bGUtaW5pdC10b29scyB2My40IG9wdGlvbnM6CisKKyMgaW5zbW9kCitVc2FnZTogaW5zbW9kIGZpbGVuYW1lIFthcmdzXQorCisjIHJtbW9kIC0taGVscAorVXNhZ2U6IHJtbW9kIFstZmhzd3ZWXSBtb2R1bGVuYW1lIC4uLgorIC1mIChvciAtLWZvcmNlKSBmb3JjZXMgYSBtb2R1bGUgdW5sb2FkLCBhbmQgbWF5IGNyYXNoIHlvdXIKKyAgICBtYWNoaW5lLiBUaGlzIHJlcXVpcmVzIHRoZSBGb3JjZWQgTW9kdWxlIFJlbW92YWwgb3B0aW9uCisgICAgd2hlbiB0aGUga2VybmVsIHdhcyBjb21waWxlZC4KKyAtaCAob3IgLS1oZWxwKSBwcmludHMgdGhpcyBoZWxwIHRleHQKKyAtcyAob3IgLS1zeXNsb2cpIHNheXMgdXNlIHN5c2xvZywgbm90IHN0ZGVycgorIC12IChvciAtLXZlcmJvc2UpIGVuYWJsZXMgbW9yZSBtZXNzYWdlcworIC1WIChvciAtLXZlcnNpb24pIHByaW50cyB0aGUgdmVyc2lvbiBjb2RlCisgLXcgKG9yIC0td2FpdCkgYmVnaW5zIG1vZHVsZSByZW1vdmFsIGV2ZW4gaWYgaXQgaXMgdXNlZAorICAgIGFuZCB3aWxsIHN0b3AgbmV3IHVzZXJzIGZyb20gYWNjZXNzaW5nIHRoZSBtb2R1bGUgKHNvIGl0CisgICAgc2hvdWxkIGV2ZW50dWFsbHkgZmFsbCB0byB6ZXJvKS4KKworIyBtb2Rwcm9iZQorVXNhZ2U6IG1vZHByb2JlIFstdl0gWy1WXSBbLUMgY29uZmlnLWZpbGVdIFstbl0gWy1pXSBbLXFdIFstYl0KKyAgICBbLW8gPG1vZG5hbWU+XSBbIC0tZHVtcC1tb2R2ZXJzaW9ucyBdIDxtb2RuYW1lPiBbcGFyYW1ldGVycy4uLl0KK21vZHByb2JlIC1yIFstbl0gWy1pXSBbLXZdIDxtb2R1bGVuYW1lPiAuLi4KK21vZHByb2JlIC1sIC10IDxkaXJuYW1lPiBbIC1hIDxtb2R1bGVuYW1lPiAuLi5dCisKKyMgZGVwbW9kIC0taGVscAorZGVwbW9kIDMuNCAtLSBwYXJ0IG9mIG1vZHVsZS1pbml0LXRvb2xzCitkZXBtb2QgLVthQV0gWy1uIC1lIC12IC1xIC1WIC1yIC11XQorICAgICAgWy1iIGJhc2VkaXJlY3RvcnldIFtmb3JjZWRfdmVyc2lvbl0KK2RlcG1vZCBbLW4gLWUgLXYgLXEgLXIgLXVdIFstRiBrZXJuZWxzeW1zXSBtb2R1bGUxLmtvIG1vZHVsZTIua28gLi4uCitJZiBubyBhcmd1bWVudHMgKGV4Y2VwdCBvcHRpb25zKSBhcmUgZ2l2ZW4sICJkZXBtb2QgLWEiIGlzIGFzc3VtZWQuCitkZXBtb2Qgd2lsbCBvdXRwdXQgYSBkZXBlbmRlbmN5IGxpc3Qgc3VpdGFibGUgZm9yIHRoZSBtb2Rwcm9iZSB1dGlsaXR5LgorT3B0aW9uczoKKyAgICAtYSwgLS1hbGwgICAgICAgICAgIFByb2JlIGFsbCBtb2R1bGVzCisgICAgLUEsIC0tcXVpY2sgICAgICAgICBPbmx5IGRvZXMgdGhlIHdvcmsgaWYgdGhlcmUncyBhIG5ldyBtb2R1bGUKKyAgICAtbiwgLS1zaG93ICAgICAgICAgIFdyaXRlIHRoZSBkZXBlbmRlbmN5IGZpbGUgb24gc3Rkb3V0IG9ubHkKKyAgICAtZSwgLS1lcnJzeW1zICAgICAgIFJlcG9ydCBub3Qgc3VwcGxpZWQgc3ltYm9scworICAgIC1WLCAtLXZlcnNpb24gICAgICAgUHJpbnQgdGhlIHJlbGVhc2UgdmVyc2lvbgorICAgIC12LCAtLXZlcmJvc2UgICAgICAgRW5hYmxlIHZlcmJvc2UgbW9kZQorICAgIC1oLCAtLWhlbHAgICAgICAgICAgUHJpbnQgdGhpcyB1c2FnZSBtZXNzYWdlCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHVzZWZ1bCBmb3IgcGVvcGxlIG1hbmFnaW5nIGRpc3RyaWJ1dGlvbnM6CisgICAgLWIgYmFzZWRpcmVjdG9yeQorICAgIC0tYmFzZWRpciBiYXNlZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICBVc2UgYW4gaW1hZ2Ugb2YgYSBtb2R1bGUgdHJlZQorICAgIC1GIGtlcm5lbHN5bXMKKyAgICAtLWZpbGVzeW1zIGtlcm5lbHN5bXMKKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGUgZmlsZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGtlcm5lbCBzeW1ib2xzCisqLworCisvL3VzYWdlOiNpZiBFTkFCTEVfTU9EUFJPQkVfU01BTEwKKworLy91c2FnZTojZGVmaW5lIGRlcG1vZF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZGVwbW9kX2Z1bGxfdXNhZ2UgIiIKKworLy91c2FnZTojZGVmaW5lIGxzbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgbHNtb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IHRoZSBjdXJyZW50bHkgbG9hZGVkIGtlcm5lbCBtb2R1bGVzIgorCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoIltPUFRJT05TXSBNT0RVTEUgIikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFXzJfNF9NT0RVTEVTKCJGSUxFICIpCisvL3VzYWdlOgkiW1NZTUJPTD1WQUxVRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCB0aGUgc3BlY2lmaWVkIGtlcm5lbCBtb2R1bGVzIGludG8gdGhlIGtlcm5lbCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgbW9kdWxlIHRvIGxvYWQgaW50byB0aGUgd3Jvbmcga2VybmVsIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS1rCU1ha2UgbW9kdWxlIGF1dG9jbGVhbi1hYmxlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJTG9jazogcHJldmVudCBzaW11bHRhbmVvdXMgbG9hZHMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgKKy8vdXNhZ2U6ICAgICAiXG4JLW0JT3V0cHV0IGxvYWQgbWFwIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRG9uJ3QgZXhwb3J0IGV4dGVybnMiCisvL3VzYWdlOgkpCisKKy8vdXNhZ2U6I2RlZmluZSBybW1vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy13ZmFdIFtNT0RVTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVW5sb2FkIGtlcm5lbCBtb2R1bGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CVdhaXQgdW50aWwgdGhlIG1vZHVsZSBpcyBubyBsb25nZXIgdXNlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgdW5sb2FkIgorLy91c2FnZTogICAgICJcbgktYQlSZW1vdmUgYWxsIHVudXNlZCBtb2R1bGVzIChyZWN1cnNpdmVseSkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJtbW9kIHR1bGlwXG4iCisKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1xZndyc3ZdIE1PRFVMRSBbc3ltYm9sPXZhbHVlXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktcglSZW1vdmUgTU9EVUxFIChzdGFja3MpIG9yIGRvIGF1dG9jbGVhbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJUXVpZXQiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktdwlXYWl0IGZvciB1bmxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVJlcG9ydCB2aWEgc3lzbG9nIGluc3RlYWQgb2Ygc3RkZXJyIgorCisvL3VzYWdlOiNlbmRpZgorCitpbnQgbW9kcHJvYmVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJY2hhciBhcHBsZXQwID0gYXBwbGV0X25hbWVbMF07CisJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUoY2hhciAqb3B0aW9uczspCisKKwkvKiBhcmUgd2UgbHNtb2Q/IC0+IGp1c3QgZHVtcCAvcHJvYy9tb2R1bGVzICovCisJaWYgKCdsJyA9PSBhcHBsZXQwKSB7CisJCXhwcmludF9hbmRfY2xvc2VfZmlsZSh4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL21vZHVsZXMiKSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJSU5JVF9HKCk7CisKKwkvKiBQcmV2ZW50IHVnbHkgY29ybmVyIGNhc2VzIHdpdGggbm8gbW9kdWxlcyBhdCBhbGwgKi8KKwltb2RpbmZvID0geHphbGxvYyhzaXplb2YobW9kaW5mb1swXSkpOworCisJaWYgKCdpJyAhPSBhcHBsZXQwKSB7IC8qIG5vdCBpbnNtb2QgKi8KKwkJLyogR290byBtb2R1bGVzIGRpcmVjdG9yeSAqLworCQl4Y2hkaXIoQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVIpOworCX0KKwl1bmFtZSgmdXRzKTsgLyogbmV2ZXIgZmFpbHMgKi8KKworCS8qIGRlcG1vZD8gKi8KKwlpZiAoJ2QnID09IGFwcGxldDApIHsKKwkJLyogU3VwcG9ydGVkOgorCQkgKiAtbjogcHJpbnQgcmVzdWx0IHRvIHN0ZG91dAorCQkgKiAtYTogcHJvY2VzcyBhbGwgbW9kdWxlcyAoZGVmYXVsdCkKKwkJICogb3B0aW9uYWwgVkVSU0lPTiBwYXJhbWV0ZXIKKwkJICogSWdub3JlZDoKKwkJICogLUE6IGRvIHdvcmsgb25seSBpZiBhIG1vZHVsZSBpcyBuZXdlciB0aGFuIGRlcGZpbGUKKwkJICogLWU6IHJlcG9ydCBhbnkgc3ltYm9scyB3aGljaCBhIG1vZHVsZSBuZWVkcworCQkgKiAgd2hpY2ggYXJlIG5vdCBzdXBwbGllZCBieSBvdGhlciBtb2R1bGVzIG9yIHRoZSBrZXJuZWwKKwkJICogLUYgRklMRTogU3lzdGVtLm1hcCAoc3ltYm9scyBmb3IgLWUpCisJCSAqIC1xLCAtciwgLXU6IG5vb3A/CisJCSAqIE5vdCBzdXBwb3J0ZWQ6CisJCSAqIC1iIEJBU0VESVI6IChUT0RPISkgbW9kdWxlcyBhcmUgaW4KKwkJICogICRCQVNFRElSL2xpYi9tb2R1bGVzLyRWRVJTSU9OCisJCSAqIC12OiBodW1hbiByZWFkYWJsZSBkZXBzIHRvIHN0ZG91dAorCQkgKiAtVjogdmVyc2lvbiAoZG9uJ3Qgd2FudCB0byBzdXBwb3J0IGl0IC0gcGVvcGxlIG1heSBkZXBlbmQKKwkJICogIG9uIGl0IGFzIGFuIGluZGljYXRvciBvZiAic3RhbmRhcmQiIGRlcG1vZCkKKwkJICogLWg6IGhlbHAgKHdlbGwgZHVoKQorCQkgKiBtb2R1bGUxLm8gbW9kdWxlMi5vIHBhcmFtZXRlcnMgKGp1c3QgaWdub3JlZCBmb3Igbm93KQorCQkgKi8KKwkJZ2V0b3B0MzIoYXJndiwgIm5hIiAiQWVGOnFydSIgLyogImI6dlYiLCBOVUxMICovLCBOVUxMKTsKKwkJYXJndiArPSBvcHRpbmQ7CisJCS8qIGlmIChhcmd2WzBdICYmIGFyZ3ZbMV0pIGJiX3Nob3dfdXNhZ2UoKTsgKi8KKwkJLyogR290byAkVkVSU0lPTiBkaXJlY3RvcnkgKi8KKwkJeGNoZGlyKGFyZ3ZbMF0gPyBhcmd2WzBdIDogdXRzLnJlbGVhc2UpOworCQkvKiBGb3JjZSBmdWxsIG1vZHVsZSBzY2FuIGJ5IGFza2luZyB0byBmaW5kIGEgYm9ndXMgbW9kdWxlLgorCQkgKiBUaGlzIHdpbGwgZ2VuZXJhdGUgbW9kdWxlcy5kZXAuYmIgYXMgYSBzaWRlIGVmZmVjdC4gKi8KKwkJcHJvY2Vzc19tb2R1bGUoKGNoYXIqKSIvIiwgTlVMTCk7CisJCXJldHVybiAhd3JvdGVfZGVwX2JiX29rOworCX0KKworCS8qIGluc21vZCwgbW9kcHJvYmUsIHJtbW9kIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50ICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCS8qIG9ubHkgLXEgKHF1aWV0KSBhbmQgLXIgKHJtbW9kKSwKKwkgKiB0aGUgcmVzdCBhcmUgYWNjZXB0ZWQgYW5kIGlnbm9yZWQgKGNvbXBhdCkgKi8KKwlnZXRvcHQzMihhcmd2LCAicXJmc3Z3Iik7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBhcmUgd2Ugcm1tb2Q/IC0+IHNpbXVsYXRlIG1vZHByb2JlIC1yICovCisJaWYgKCdyJyA9PSBhcHBsZXQwKSB7CisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX3I7CisJfQorCisJaWYgKCdpJyAhPSBhcHBsZXQwKSB7IC8qIG5vdCBpbnNtb2QgKi8KKwkJLyogR290byAkVkVSU0lPTiBkaXJlY3RvcnkgKi8KKwkJeGNoZGlyKHV0cy5yZWxlYXNlKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUKKwkvKiBJZiBub3Qgcm1tb2QsIHBhcnNlIHBvc3NpYmxlIG1vZHVsZSBvcHRpb25zIGdpdmVuIG9uIGNvbW1hbmQgbGluZS4KKwkgKiBpbnNtb2QvbW9kcHJvYmUgdGFrZXMgb25lIG1vZHVsZSBuYW1lLCB0aGUgcmVzdCBhcmUgcGFyYW1ldGVycy4gKi8KKwlvcHRpb25zID0gTlVMTDsKKwlpZiAoJ3InICE9IGFwcGxldDApIHsKKwkJY2hhciAqKmFyZyA9IGFyZ3Y7CisJCXdoaWxlICgqKythcmcpIHsKKwkJCS8qIEVuY2xvc2Ugb3B0aW9ucyBpbiBxdW90ZXMgKi8KKwkJCWNoYXIgKnMgPSBvcHRpb25zOworCQkJb3B0aW9ucyA9IHhhc3ByaW50ZigiJXMgXCIlc1wiIiwgcyA/IHMgOiAiIiwgKmFyZyk7CisJCQlmcmVlKHMpOworCQkJKmFyZyA9IE5VTEw7CisJCX0KKwl9CisjZWxzZQorCWlmICgncicgIT0gYXBwbGV0MCkKKwkJYXJndlsxXSA9IE5VTEw7CisjZW5kaWYKKworCWlmICgnaScgPT0gYXBwbGV0MCkgeyAvKiBpbnNtb2QgKi8KKwkJc2l6ZV90IGxlbjsKKwkJdm9pZCAqbWFwOworCisJCWxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwkJbWFwID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKCphcmd2LCAmbGVuKTsKKwkJaWYgKCFtYXApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsICphcmd2KTsKKwkJaWYgKGluaXRfbW9kdWxlKG1hcCwgbGVuLAorCQkJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUob3B0aW9ucyA/IG9wdGlvbnMgOiAiIikKKwkJCUlGX05PVF9GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSgiIikKKwkJCSkgIT0gMAorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBpbnNlcnQgJyVzJzogJXMiLAorCQkJCQkqYXJndiwgbW9kZXJyb3IoZXJybm8pKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgdG8gbG9hZCBtb2Rwcm9iZS5kZXAuYmIgKi8KKwlsb2FkX2RlcF9iYigpOworCisJLyogTG9hZC9yZW1vdmUgbW9kdWxlcy4KKwkgKiBPbmx5IHJtbW9kIGxvb3BzIGhlcmUsIG1vZHByb2JlIGhhcyBvbmx5IGFyZ3ZbMF0gKi8KKwlkbyB7CisJCXByb2Nlc3NfbW9kdWxlKCphcmd2LCBvcHRpb25zKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlJRl9GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORShmcmVlKG9wdGlvbnMpOykKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21vZHV0aWxzL21vZHByb2JlLmMgYi9tb2R1dGlscy9tb2Rwcm9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9tb2Rwcm9iZS5jCkBAIC0wLDAgKzEsNjYyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNb2Rwcm9iZSB3cml0dGVuIGZyb20gc2NyYXRjaCBmb3IgQnVzeUJveAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBWbGFkaW1pciBEcm9ubmlrb3YKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX01PRFBST0JFKEFQUExFVChtb2Rwcm9iZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKy8vI2RlZmluZSBEQkcoZm10LCAuLi4pIGJiX2Vycm9yX21zZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIERCRyguLi4pICgodm9pZCkwKQorCisvKiBOb3RlIHRoYXQgdW5saWtlIG9sZGVyIHZlcnNpb25zIG9mIG1vZHVsZXMuZGVwL2RlcG1vZCAoYnVzeWJveCBhbmQgbS1pLXQpLAorICogd2UgZXhwZWN0IHRoZSBmdWxsIGRlcGVuZGVuY3kgbGlzdCB0byBiZSBzcGVjaWZpZWQgaW4gbW9kdWxlcy5kZXAuCisgKiBPbGRlciB2ZXJzaW9ucyB3b3VsZCBvbmx5IGV4cG9ydCB0aGUgZGlyZWN0IGRlcGVuZGVuY3kgbGlzdC4KKyAqLworCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTU9EUFJPQkVfU01BTEwKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9ub3Rlc191c2FnZQorLy91c2FnZToJIm1vZHByb2JlIGNhbiAodW4pbG9hZCBhIHN0YWNrIG9mIG1vZHVsZXMsIHBhc3NpbmcgZWFjaCBtb2R1bGUgb3B0aW9ucyAod2hlblxuIgorLy91c2FnZToJImxvYWRpbmcpLiBtb2Rwcm9iZSB1c2VzIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVybWluZSB3aGF0IG9wdGlvbihzKSB0b1xuIgorLy91c2FnZToJInBhc3MgZWFjaCBtb2R1bGUgaXQgbG9hZHMuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBzZWFyY2hlZCAoaW4gdGhpcyBvcmRlcik6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvbW9kcHJvYmUuY29uZiAoMi42IG9ubHkpXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvbW9kdWxlcy5jb25mXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvY29uZi5tb2R1bGVzIChkZXByZWNhdGVkKVxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIlRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgc3ludGF4IChzZWUgYmVsb3cpLiBJZiBub25lIGlzIHByZXNlbnQsIGl0IGlzXG4iCisvL3VzYWdlOgkiX25vdF8gYW4gZXJyb3I7IGVhY2ggbG9hZGVkIG1vZHVsZSBpcyB0aGVuIGV4cGVjdGVkIHRvIGxvYWQgd2l0aG91dFxuIgorLy91c2FnZToJIm9wdGlvbnMuIE9uY2UgYSBmaWxlIGlzIGZvdW5kLCB0aGUgb3RoZXJzIGFyZSB0ZXN0ZWQgZm9yLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIi9ldGMvbW9kdWxlcy5jb25mIGVudHJ5IGZvcm1hdDpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIgIGFsaWFzIDxhbGlhc19uYW1lPiA8bW9kX25hbWU+XG4iCisvL3VzYWdlOgkiICAgIE1ha2VzIGl0IHBvc3NpYmxlIHRvIG1vZHByb2JlIGFsaWFzX25hbWUsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBtb2R1bGUuXG4iCisvL3VzYWdlOgkiICAgIEl0IG1ha2VzIHNlbnNlIGlmIHlvdXIgbW9kX25hbWUgaXMgbG9uZywgb3IgeW91IHdhbnQgYSBtb3JlIHJlcHJlc2VudGF0aXZlXG4iCisvL3VzYWdlOgkiICAgIG5hbWUgZm9yIHRoYXQgbW9kdWxlIChlZy4gJ3Njc2knIGluIHBsYWNlIG9mICdhaGE3eHh4JykuXG4iCisvL3VzYWdlOgkiICAgIFRoaXMgbWFrZXMgaXQgYWxzbyBwb3NzaWJsZSB0byB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mIG9wdGlvbnMgKGJlbG93KSBmb3JcbiIKKy8vdXNhZ2U6CSIgICAgdGhlIG1vZHVsZSBhbmQgdGhlIGFsaWFzLlxuIgorLy91c2FnZToJIiAgICBBIG1vZHVsZSBjYW4gYmUgYWxpYXNlZCBtb3JlIHRoYW4gb25jZS5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIgIG9wdGlvbnMgPG1vZF9uYW1lfGFsaWFzX25hbWU+IDxzeW1ib2w9dmFsdWUuLi4+XG4iCisvL3VzYWdlOgkiICAgIFdoZW4gbG9hZGluZyBtb2R1bGUgbW9kX25hbWUgKG9yIHRoZSBtb2R1bGUgYWxpYXNlZCBieSBhbGlhc19uYW1lKSwgcGFzc1xuIgorLy91c2FnZToJIiAgICB0aGUgXCJzeW1ib2w9dmFsdWVcIiBwYWlycyBhcyBvcHRpb24gdG8gdGhhdCBtb2R1bGUuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiU2FtcGxlIC9ldGMvbW9kdWxlcy5jb25mIGZpbGU6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiICBvcHRpb25zIHR1bGlwIGlycT0zXG4iCisvL3VzYWdlOgkiICBhbGlhcyB0dWxpcCB0dWxpcDJcbiIKKy8vdXNhZ2U6CSIgIG9wdGlvbnMgdHVsaXAyIGlycT00IGlvPTB4MzA4XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiT3RoZXIgZnVuY3Rpb25hbGl0eSBvZmZlcmVkIGJ5ICdjbGFzc2ljJyBtb2Rwcm9iZSBpcyBub3QgYXZhaWxhYmxlIGluXG4iCisvL3VzYWdlOgkidGhpcyBpbXBsZW1lbnRhdGlvbi5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJJZiBtb2R1bGUgb3B0aW9ucyBhcmUgcHJlc2VudCBib3RoIGluIHRoZSBjb25maWcgZmlsZSwgYW5kIG9uIHRoZSBjb21tYW5kIGxpbmUsXG4iCisvL3VzYWdlOgkidGhlbiB0aGUgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG1vZHVsZSBfYWZ0ZXJfXG4iCisvL3VzYWdlOgkidGhlIG9wdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGUuIFRoYXQgd2F5LCB5b3UgY2FuIGhhdmUgZGVmYXVsdHMgaW4gdGhlIGNvbmZpZ1xuIgorLy91c2FnZToJImZpbGUsIGFuZCBvdmVycmlkZSB0aGVtIGZvciBhIHNwZWNpZmljIHVzYWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS5cbiIKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiKHdpdGggdGhlIGFib3ZlIC9ldGMvbW9kdWxlcy5jb25mKTpcblxuIgorLy91c2FnZTogICAgICAgIiQgbW9kcHJvYmUgdHVsaXBcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aWxsIGxvYWQgdGhlIG1vZHVsZSAndHVsaXAnIHdpdGggZGVmYXVsdCBvcHRpb24gJ2lycT0zJ1xuXG4iCisvL3VzYWdlOiAgICAgICAiJCBtb2Rwcm9iZSB0dWxpcCBpcnE9NVxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBvcHRpb24gJ2lycT01JywgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vZHByb2JlIHR1bGlwMlxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBkZWZhdWx0IG9wdGlvbnMgJ2lycT00IGlvPTB4MzA4JyxcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aGljaCBhcmUgdGhlIGRlZmF1bHQgZm9yIGFsaWFzICd0dWxpcDInXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vZHByb2JlIHR1bGlwMiBpcnE9OFxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBkZWZhdWx0IG9wdGlvbnMgJ2lycT00IGlvPTB4MzA4IGlycT04JyxcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aGljaCBhcmUgdGhlIGRlZmF1bHQgZm9yIGFsaWFzICd0dWxpcDInIG92ZXJyaWRkZW4gYnkgdGhlIG9wdGlvbiAnaXJxPTgnXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgICBmcm9tIHRoZSBjb21tYW5kIGxpbmVcblxuIgorLy91c2FnZTogICAgICAgIiQgbW9kcHJvYmUgdHVsaXAyIGlycT0yIGlvPTB4MjEwXG4iCisvL3VzYWdlOiAgICAgICAiICAgd2lsbCBsb2FkIHRoZSBtb2R1bGUgJ3R1bGlwJyB3aXRoIGRlZmF1bHQgb3B0aW9ucyAnaXJxPTQgaW89MHgzMDggaXJxPTQgaW89MHgyMTAnLFxuIgorLy91c2FnZTogICAgICAgIiAgIHdoaWNoIGFyZSB0aGUgZGVmYXVsdCBmb3IgYWxpYXMgJ3R1bGlwMicgb3ZlcnJpZGRlbiBieSB0aGUgb3B0aW9ucyAnaXJxPTIgaW89MHgyMTAnXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgICBmcm9tIHRoZSBjb21tYW5kIGxpbmVcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbW9kcHJvYmVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYWxycXZzRCIgSUZfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QoImIiKSAiXSIKKy8vdXNhZ2U6CSIgTU9EVUxFIFtzeW1ib2w9dmFsdWVdLi4uIgorLy91c2FnZTojZGVmaW5lIG1vZHByb2JlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUxvYWQgbXVsdGlwbGUgTU9EVUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCAoTU9EVUxFIGlzIGEgcGF0dGVybikiCisvL3VzYWdlOiAgICAgIlxuCS1yCVJlbW92ZSBNT0RVTEUgKHN0YWNrcykgb3IgZG8gYXV0b2NsZWFuIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTG9nIHRvIHN5c2xvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUQJU2hvdyBkZXBlbmRlbmNpZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWIJQXBwbHkgYmxhY2tsaXN0IHRvIG1vZHVsZSBuYW1lcyB0b28iCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZiAvKiAhRU5BQkxFX01PRFBST0JFX1NNQUxMICovCisKKy8qIE5vdGUgdGhhdCB1c2FnZSB0ZXh0IGRvZXNuJ3QgZG9jdW1lbnQgdmFyaW91cyAyLjQgb3B0aW9ucworICogd2UgcHVsbCBpbiB0aHJvdWdoIElOU01PRF9PUFRTIGRlZmluZSAqLworI2RlZmluZSBNT0RQUk9CRV9PUFRTICAiYWxyRCIgSUZfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QoImIiKQorLyogLWEgYW5kIC1EIF9hcmVfIGluIGZhY3QgY29tcGF0aWJsZSAqLworI2RlZmluZSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZICgicS12OnYtcTpsLS1hckQ6ci0tYWxEOmEtLWxyOkQtLXJsIikKKy8vI2RlZmluZSBNT0RQUk9CRV9PUFRTICAiYWNkOmxucnQ6QzoiIElGX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUKCJiIikKKy8vI2RlZmluZSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZICJxLXY6di1xOmwtLWFjcjphLS1scjpyLS1hbCIKK2VudW0geworCU9QVF9JTlNFUlRfQUxMICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMCksIC8qIGEgKi8KKwkvL09QVF9EVU1QX09OTFkgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiBjICovCisJLy9PUFRfRElSTkFNRSAgICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogZCAqLworCU9QVF9MSVNUX09OTFkgICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMSksIC8qIGwgKi8KKwkvL09QVF9TSE9XX09OTFkgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiBuICovCisJT1BUX1JFTU9WRSAgICAgICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCAyKSwgLyogciAqLworCS8vT1BUX1JFU1RSSUNUICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgeCksIC8qIHQgKi8KKwkvL09QVF9WRVJPTkxZICAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiBWICovCisJLy9PUFRfQ09ORklHRklMRSA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogQyAqLworCU9QVF9TSE9XX0RFUFMgICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMyksIC8qIEQgKi8KKwlPUFRfQkxBQ0tMSVNUICAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNULAorfTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCitzdGF0aWMgY29uc3QgY2hhciBtb2Rwcm9iZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJLyogbm9ib2R5IGFza2VkIGZvciBsb25nIG9wdHMgKHlldCkgKi8KKwkvLyAiYWxsXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICJhIgorCS8vICJsaXN0XDAiICAgICAgICAgTm9fYXJndW1lbnQgImwiCisJLy8gInJlbW92ZVwwIiAgICAgICBOb19hcmd1bWVudCAiciIKKwkvLyAicXVpZXRcMCIgICAgICAgIE5vX2FyZ3VtZW50ICJxIgorCS8vICJ2ZXJib3NlXDAiICAgICAgTm9fYXJndW1lbnQgInYiCisJLy8gInN5c2xvZ1wwIiAgICAgICBOb19hcmd1bWVudCAicyIKKwkvKiBtb2R1bGUtaW5pdC10b29scyAzLjExLjEgaGFzIG9ubHkgbG9uZyBvcHQgLS1zaG93LWRlcGVuZHMKKwkgKiBidXQgbm8gc2hvcnQgLUQsIHdlIHByb3ZpZGUgbG9uZyBvcHQgZm9yIHNjcmlwdHMgd2hpY2gKKwkgKiB3ZXJlIHdyaXR0ZW4gZm9yIDMuMTEuMTogKi8KKwkic2hvdy1kZXBlbmRzXDAiIE5vX2FyZ3VtZW50ICJEIgorCS8vIElGX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUKAorCS8vICJ1c2UtYmxhY2tsaXN0XDAiIE5vX2FyZ3VtZW50ICJiIgorCS8vICkKKwk7CisjZW5kaWYKKworI2RlZmluZSBNT0RVTEVfRkxBR19MT0FERUQgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNT0RVTEVfRkxBR19ORUVEX0RFUFMgICAgICAgICAgIDB4MDAwMgorLyogIndhcyBzZWVuIGluIG1vZHVsZXMuZGVwIjogKi8KKyNkZWZpbmUgTU9EVUxFX0ZMQUdfRk9VTkRfSU5fTU9EREVQICAgICAweDAwMDQKKyNkZWZpbmUgTU9EVUxFX0ZMQUdfQkxBQ0tMSVNURUQgICAgICAgICAweDAwMDgKKworc3RydWN0IG1vZHVsZV9lbnRyeSB7IC8qIEknbGwgY2FsbCBpdCBNRS4gKi8KKwl1bnNpZ25lZCBmbGFnczsKKwljaGFyICptb2RuYW1lOyAvKiBzdHJpcHBlZCBvZiAvcGF0aC8sIC5leHQgYW5kIHMvLS9fL2cgKi8KKwljb25zdCBjaGFyICpwcm9iZWRfbmFtZTsgLyogdmVyYmF0aW0gYXMgc2VlbiBvbiBjbWRsaW5lICovCisJY2hhciAqb3B0aW9uczsgLyogb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlcyAqLworCWxsaXN0X3QgKnJlYWxuYW1lczsgLyogc3RyaW5ncy4gaWYgdGhpcyBtb2R1bGUgaXMgYW4gYWxpYXMsICovCisJLyogcmVhbCBtb2R1bGUgbmFtZSBpcyBvbmUgb2YgdGhlc2UuICovCisvL0NhbiB0aGVyZSByZWFsbHkgYmUgbW9yZSB0aGFuIG9uZT8gRXhhbXBsZSBmcm9tIHJlYWwga2VybmVsPworCWxsaXN0X3QgKmRlcHM7IC8qIHN0cmluZ3MuIG1vZHVsZXMgd2UgZGVwZW5kIG9uICovCit9OworCisjZGVmaW5lIERCX0hBU0hfU0laRSAyNTYKKworc3RydWN0IGdsb2JhbHMgeworCWxsaXN0X3QgKnByb2JlczsgLyogTUVzIG9mIG1vZHVsZShzKSByZXF1ZXN0ZWQgb24gY21kbGluZSAqLworCWNoYXIgKmNtZGxpbmVfbW9wdHM7IC8qIG1vZHVsZSBvcHRpb25zIGZyb20gY21kbGluZSAqLworCWludCBudW1fdW5yZXNvbHZlZF9kZXBzOworCS8qIGJvb2wuICJEaWQgd2UgaGF2ZSAnc3ltYm9sOkZPTycgcmVxdWVzdGVkIG9uIGNtZGxpbmU/IiAqLworCXNtYWxsaW50IG5lZWRfc3ltYm9sczsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJbGxpc3RfdCAqZGJbREJfSEFTSF9TSVpFXTsgLyogTUVzIG9mIGFsbCBtb2R1bGVzIGV2ZXIgc2VlbiAoY2FjaGluZyBmb3Igc3BlZWQpICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKyAgICAgICAgU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGludCByZWFkX2NvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKworc3RhdGljIGNoYXIgKmdhdGhlcl9vcHRpb25zX3N0cihjaGFyICpvcHRzLCBjb25zdCBjaGFyICphcHBlbmQpCit7CisJLyogU3BlZWQtb3B0aW1pemVkLiBXZSBjYWxsIGdhdGhlcl9vcHRpb25zX3N0ciBtYW55IHRpbWVzLiAqLworCWlmIChhcHBlbmQpIHsKKwkJaWYgKG9wdHMgPT0gTlVMTCkgeworCQkJb3B0cyA9IHhzdHJkdXAoYXBwZW5kKTsKKwkJfSBlbHNlIHsKKwkJCWludCBvcHRsZW4gPSBzdHJsZW4ob3B0cyk7CisJCQlvcHRzID0geHJlYWxsb2Mob3B0cywgb3B0bGVuICsgc3RybGVuKGFwcGVuZCkgKyAyKTsKKwkJCXNwcmludGYob3B0cyArIG9wdGxlbiwgIiAlcyIsIGFwcGVuZCk7CisJCX0KKwl9CisJcmV0dXJuIG9wdHM7Cit9CisKKy8qIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBjYWxsZWQgbWFueSB0aW1lcywgb3B0aW1pemluZyBmb3Igc3BlZWQuCisgKiBVc2VycyByZXBvcnRlZCBtaW51dGUtbG9uZyBkZWxheXMgd2hlbiB0aGV5IHJ1bm4gaXB0YWJsZXMgcmVwZWF0ZWRseQorICogKGlwdGFibGVzIHVzZSBtb2Rwcm9iZSB0byBpbnN0YWxsIG5lZWRlZCBrZXJuZWwgbW9kdWxlcykuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlX2VudHJ5ICpoZWxwZXJfZ2V0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUsIGludCBjcmVhdGUpCit7CisJY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJc3RydWN0IG1vZHVsZV9lbnRyeSAqZTsKKwlsbGlzdF90ICpsOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgaGFzaDsKKworCWZpbGVuYW1lMm1vZG5hbWUobW9kdWxlLCBtb2RuYW1lKTsKKworCWhhc2ggPSAwOworCWZvciAoaSA9IDA7IG1vZG5hbWVbaV07IGkrKykKKwkJaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgbW9kbmFtZVtpXTsKKwloYXNoICU9IERCX0hBU0hfU0laRTsKKworCWZvciAobCA9IEcuZGJbaGFzaF07IGw7IGwgPSBsLT5saW5rKSB7CisJCWUgPSAoc3RydWN0IG1vZHVsZV9lbnRyeSAqKSBsLT5kYXRhOworCQlpZiAoc3RyY21wKGUtPm1vZG5hbWUsIG1vZG5hbWUpID09IDApCisJCQlyZXR1cm4gZTsKKwl9CisJaWYgKCFjcmVhdGUpCisJCXJldHVybiBOVUxMOworCisJZSA9IHh6YWxsb2Moc2l6ZW9mKCplKSk7CisJZS0+bW9kbmFtZSA9IHhzdHJkdXAobW9kbmFtZSk7CisJbGxpc3RfYWRkX3RvKCZHLmRiW2hhc2hdLCBlKTsKKworCXJldHVybiBlOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgc3RydWN0IG1vZHVsZV9lbnRyeSAqZ2V0X29yX2FkZF9tb2RlbnRyeShjb25zdCBjaGFyICptb2R1bGUpCit7CisJcmV0dXJuIGhlbHBlcl9nZXRfbW9kdWxlKG1vZHVsZSwgMSk7Cit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBzdHJ1Y3QgbW9kdWxlX2VudHJ5ICpnZXRfbW9kZW50cnkoY29uc3QgY2hhciAqbW9kdWxlKQoreworCXJldHVybiBoZWxwZXJfZ2V0X21vZHVsZShtb2R1bGUsIDApOworfQorCitzdGF0aWMgdm9pZCBhZGRfcHJvYmUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptOworCisJbSA9IGdldF9vcl9hZGRfbW9kZW50cnkobmFtZSk7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIChPUFRfUkVNT1ZFIHwgT1BUX1NIT1dfREVQUykpCisJICYmIChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkpIHsKKwkJREJHKCJza2lwcGluZyAlcywgaXQgaXMgYWxyZWFkeSBsb2FkZWQiLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCURCRygicXVldWluZyAlcyIsIG5hbWUpOworCW0tPnByb2JlZF9uYW1lID0gbmFtZTsKKwltLT5mbGFncyB8PSBNT0RVTEVfRkxBR19ORUVEX0RFUFM7CisJbGxpc3RfYWRkX3RvX2VuZCgmRy5wcm9iZXMsIG0pOworCUcubnVtX3VucmVzb2x2ZWRfZGVwcysrOworCWlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTCisJICYmIHN0cm5jbXAobS0+bW9kbmFtZSwgInN5bWJvbDoiLCA3KSA9PSAwCisJKSB7CisJCUcubmVlZF9zeW1ib2xzID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNvbmZpZ19maWxlX2FjdGlvbihjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCQkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQkJCQl2b2lkICp1c2VyZGF0YSBVTlVTRURfUEFSQU0sCisJCQkJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqdG9rZW5zWzNdOworCXBhcnNlcl90ICpwOworCXN0cnVjdCBtb2R1bGVfZW50cnkgKm07CisJaW50IHJjID0gVFJVRTsKKworCWlmIChiYl9iYXNlbmFtZShmaWxlbmFtZSlbMF0gPT0gJy4nKQorCQlnb3RvIGVycm9yOworCisJcCA9IGNvbmZpZ19vcGVuMihmaWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWlmIChwID09IE5VTEwpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocCwgdG9rZW5zLCAzLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKy8vVXNlIGluZGV4X2luX3N0cmluZ3M/CisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiYWxpYXMiKSA9PSAwKSB7CisJCQkvKiBhbGlhcyA8d2lsZGNhcmQ+IDxtb2R1bGVuYW1lPiAqLworCQkJbGxpc3RfdCAqbDsKKwkJCWNoYXIgd2lsZGNhcmRbTU9EVUxFX05BTUVfTEVOXTsKKwkJCWNoYXIgKnJtb2Q7CisKKwkJCWlmICh0b2tlbnNbMl0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVuYW1lMm1vZG5hbWUodG9rZW5zWzFdLCB3aWxkY2FyZCk7CisKKwkJCWZvciAobCA9IEcucHJvYmVzOyBsOyBsID0gbC0+bGluaykgeworCQkJCW0gPSAoc3RydWN0IG1vZHVsZV9lbnRyeSAqKSBsLT5kYXRhOworCQkJCWlmIChmbm1hdGNoKHdpbGRjYXJkLCBtLT5tb2RuYW1lLCAwKSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlybW9kID0gZmlsZW5hbWUybW9kbmFtZSh0b2tlbnNbMl0sIE5VTEwpOworCQkJCWxsaXN0X2FkZF90bygmbS0+cmVhbG5hbWVzLCBybW9kKTsKKworCQkJCWlmIChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX05FRURfREVQUykgeworCQkJCQltLT5mbGFncyAmPSB+TU9EVUxFX0ZMQUdfTkVFRF9ERVBTOworCQkJCQlHLm51bV91bnJlc29sdmVkX2RlcHMtLTsKKwkJCQl9CisKKwkJCQltID0gZ2V0X29yX2FkZF9tb2RlbnRyeShybW9kKTsKKwkJCQlpZiAoIShtLT5mbGFncyAmIE1PRFVMRV9GTEFHX05FRURfREVQUykpIHsKKwkJCQkJbS0+ZmxhZ3MgfD0gTU9EVUxFX0ZMQUdfTkVFRF9ERVBTOworCQkJCQlHLm51bV91bnJlc29sdmVkX2RlcHMrKzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKHRva2Vuc1swXSwgIm9wdGlvbnMiKSA9PSAwKSB7CisJCQkvKiBvcHRpb25zIDxtb2R1bGVuYW1lPiA8b3B0aW9uLi4uPiAqLworCQkJaWYgKHRva2Vuc1syXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJbSA9IGdldF9vcl9hZGRfbW9kZW50cnkodG9rZW5zWzFdKTsKKwkJCW0tPm9wdGlvbnMgPSBnYXRoZXJfb3B0aW9uc19zdHIobS0+b3B0aW9ucywgdG9rZW5zWzJdKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAodG9rZW5zWzBdLCAiaW5jbHVkZSIpID09IDApIHsKKwkJCS8qIGluY2x1ZGUgPGZpbGVuYW1lPiAqLworCQkJcmVhZF9jb25maWcodG9rZW5zWzFdKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QKKwkJICYmIHN0cmNtcCh0b2tlbnNbMF0sICJibGFja2xpc3QiKSA9PSAwCisJCSkgeworCQkJLyogYmxhY2tsaXN0IDxtb2R1bGVuYW1lPiAqLworCQkJZ2V0X29yX2FkZF9tb2RlbnRyeSh0b2tlbnNbMV0pLT5mbGFncyB8PSBNT0RVTEVfRkxBR19CTEFDS0xJU1RFRDsKKwkJfQorCX0KKwljb25maWdfY2xvc2UocCk7CisgZXJyb3I6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHJlY3Vyc2l2ZV9hY3Rpb24ocGF0aCwgQUNUSU9OX1JFQ1VSU0UgfCBBQ1RJT05fUVVJRVQsCisJCQkJY29uZmlnX2ZpbGVfYWN0aW9uLCBOVUxMLCBOVUxMLCAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmh1bWFubHlfcmVhZGFibGVfbmFtZShzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptKQoreworCS8qIHByb2JlZF9uYW1lIG1heSBiZSBOVUxMLiBtb2RuYW1lIGFsd2F5cyBleGlzdHMuICovCisJcmV0dXJuIG0tPnByb2JlZF9uYW1lID8gbS0+cHJvYmVkX25hbWUgOiBtLT5tb2RuYW1lOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfYW5kX2FkZF9rY21kbGluZV9tb2R1bGVfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBjb25zdCBjaGFyICptb2R1bGVuYW1lKQoreworCWNoYXIgKmtjbWRsaW5lX2J1ZjsKKwljaGFyICprY21kbGluZTsKKwljaGFyICprcHRyOworCWludCBsZW47CisKKwlrY21kbGluZV9idWYgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZSgiL3Byb2MvY21kbGluZSIsIE5VTEwpOworCWlmICgha2NtZGxpbmVfYnVmKQorCQlyZXR1cm4gb3B0aW9uczsKKworCWtjbWRsaW5lID0ga2NtZGxpbmVfYnVmOworCWxlbiA9IHN0cmxlbihtb2R1bGVuYW1lKTsKKwl3aGlsZSAoKGtwdHIgPSBzdHJzZXAoJmtjbWRsaW5lLCAiXG5cdCAiKSkgIT0gTlVMTCkgeworCQlpZiAoc3RybmNtcChtb2R1bGVuYW1lLCBrcHRyLCBsZW4pICE9IDApCisJCQljb250aW51ZTsKKwkJa3B0ciArPSBsZW47CisJCWlmICgqa3B0ciAhPSAnLicpCisJCQljb250aW51ZTsKKwkJLyogSXQgaXMgIm1vZHVsZW5hbWUueHh4eCIgKi8KKwkJa3B0cisrOworCQlpZiAoc3RyY2hyKGtwdHIsICc9JykgIT0gTlVMTCkgeworCQkJLyogSXQgaXMgIm1vZHVsZW5hbWUub3B0PVt2YWxdIiAqLworCQkJb3B0aW9ucyA9IGdhdGhlcl9vcHRpb25zX3N0cihvcHRpb25zLCBrcHRyKTsKKwkJfQorCX0KKwlmcmVlKGtjbWRsaW5lX2J1Zik7CisKKwlyZXR1cm4gb3B0aW9uczsKK30KKworLyogUmV0dXJuOiBzaW1pbGFyIHRvIGJiX2luaXRfbW9kdWxlOgorICogMCBvbiBzdWNjZXNzLAorICogLWVycm5vIG9uIG9wZW4vcmVhZCBlcnJvciwKKyAqIGVycm5vIG9uIGluaXRfbW9kdWxlKCkgZXJyb3IKKyAqLworLyogTkI6IElOU01PRF9PUFRfU0lMRU5UIGJpdCBzdXBwcmVzc2VzIE9OTFkgbm9uLWV4aXN0ZW50IG1vZHVsZXMsCisgKiBub3QgZGVsZXRlZCBvbmVzICh0aG9zZSBhcmUgc3RpbGwgbGlzdGVkIGluIG1vZHVsZXMuZGVwKS4KKyAqIG1vZHVsZS1pbml0LXRvb2xzIHZlcnNpb24gMy40OgorICogIyBtb2Rwcm9iZSBib2d1cworICogRkFUQUw6IE1vZHVsZSBib2d1cyBub3QgZm91bmQuIFtleGl0Y29kZSAxXQorICogIyBtb2Rwcm9iZSAtcSBib2d1cyAgICAgICAgICAgIFtzaWxlbnQsIGV4aXRjb2RlIHN0aWxsIDFdCisgKiBidXQ6CisgKiAjIHJtIGtlcm5lbC9kcml2ZXJzL25ldC9kdW1teS5rbworICogIyBtb2Rwcm9iZSAtcSBkdW1teQorICogRkFUQUw6IENvdWxkIG5vdCBvcGVuICcvbGliL21vZHVsZXMveHh4L2tlcm5lbC9kcml2ZXJzL25ldC9kdW1teS5rbyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAqIFtleGl0Y29kZSAxXQorICovCitzdGF0aWMgaW50IGRvX21vZHByb2JlKHN0cnVjdCBtb2R1bGVfZW50cnkgKm0pCit7CisJaW50IHJjLCBmaXJzdDsKKworCWlmICghKG0tPmZsYWdzICYgTU9EVUxFX0ZMQUdfRk9VTkRfSU5fTU9EREVQKSkgeworCQlpZiAoIShvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9TSUxFTlQpKQorCQkJYmJfZXJyb3JfbXNnKCJtb2R1bGUgJXMgbm90IGZvdW5kIGluIG1vZHVsZXMuZGVwIiwKKwkJCQlodW1hbmx5X3JlYWRhYmxlX25hbWUobSkpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJREJHKCJkb19tb2Rwcm9iJ2luZyAlcyIsIG0tPm1vZG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9SRU1PVkUpKQorCQltLT5kZXBzID0gbGxpc3RfcmV2KG0tPmRlcHMpOworCisJaWYgKDApIHsKKwkJbGxpc3RfdCAqbDsKKwkJZm9yIChsID0gbS0+ZGVwczsgbDsgbCA9IGwtPmxpbmspCisJCQlEQkcoImRlcDogJXMiLCBsLT5kYXRhKTsKKwl9CisKKwlmaXJzdCA9IDE7CisJcmMgPSAwOworCXdoaWxlIChtLT5kZXBzKSB7CisJCXN0cnVjdCBtb2R1bGVfZW50cnkgKm0yOworCQljaGFyICpmbiwgKm9wdGlvbnM7CisKKwkJcmMgPSAwOworCQlmbiA9IGxsaXN0X3BvcCgmbS0+ZGVwcyk7IC8qIHdlIGxlYWsgaXQgKi8KKwkJbTIgPSBnZXRfb3JfYWRkX21vZGVudHJ5KGZuKTsKKworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9SRU1PVkUpIHsKKwkJCS8qIG1vZHByb2JlIC1yICovCisJCQlpZiAobTItPmZsYWdzICYgTU9EVUxFX0ZMQUdfTE9BREVEKSB7CisJCQkJcmMgPSBiYl9kZWxldGVfbW9kdWxlKG0yLT5tb2RuYW1lLCBPX0VYQ0wpOworCQkJCWlmIChyYykgeworCQkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgdW5sb2FkIG1vZHVsZSAlczogJXMiLAorCQkJCQkJCWh1bWFubHlfcmVhZGFibGVfbmFtZShtMiksCisJCQkJCQkJbW9kZXJyb3IocmMpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbTItPmZsYWdzICY9IH5NT0RVTEVfRkxBR19MT0FERUQ7CisJCQkJfQorCQkJfQorCQkJLyogZG8gbm90IGVycm9yIG91dCBpZiAqZGVwcyogZmFpbCB0byB1bmxvYWQgKi8KKwkJCWZpcnN0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJb3B0aW9ucyA9IG0yLT5vcHRpb25zOworCQltMi0+b3B0aW9ucyA9IE5VTEw7CisJCW9wdGlvbnMgPSBwYXJzZV9hbmRfYWRkX2tjbWRsaW5lX21vZHVsZV9vcHRpb25zKG9wdGlvbnMsIG0yLT5tb2RuYW1lKTsKKwkJaWYgKG0gPT0gbTIpCisJCQlvcHRpb25zID0gZ2F0aGVyX29wdGlvbnNfc3RyKG9wdGlvbnMsIEcuY21kbGluZV9tb3B0cyk7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0hPV19ERVBTKSB7CisJCQlwcmludGYob3B0aW9ucyA/ICJpbnNtb2QgJXMvJXMvJXMgJXNcbiIKKwkJCQkJOiAiaW5zbW9kICVzLyVzLyVzXG4iLAorCQkJCUNPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSLCBHLnV0cy5yZWxlYXNlLCBmbiwKKwkJCQlvcHRpb25zKTsKKwkJCWZyZWUob3B0aW9ucyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtMi0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19MT0FERUQpIHsKKwkJCURCRygiJXMgaXMgYWxyZWFkeSBsb2FkZWQsIHNraXBwaW5nIiwgZm4pOworCQkJZnJlZShvcHRpb25zKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmMgPSBiYl9pbml0X21vZHVsZShmbiwgb3B0aW9ucyk7CisJCURCRygibG9hZGVkICVzICclcycsIHJjOiVkIiwgZm4sIG9wdGlvbnMsIHJjKTsKKwkJaWYgKHJjID09IEVFWElTVCkKKwkJCXJjID0gMDsKKwkJZnJlZShvcHRpb25zKTsKKwkJaWYgKHJjKSB7CisJCQliYl9lcnJvcl9tc2coImNhbid0IGxvYWQgbW9kdWxlICVzICglcyk6ICVzIiwKKwkJCQlodW1hbmx5X3JlYWRhYmxlX25hbWUobTIpLAorCQkJCWZuLAorCQkJCW1vZGVycm9yKHJjKQorCQkJKTsKKwkJCWJyZWFrOworCQl9CisJCW0yLT5mbGFncyB8PSBNT0RVTEVfRkxBR19MT0FERUQ7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBsb2FkX21vZHVsZXNfZGVwKHZvaWQpCit7CisJc3RydWN0IG1vZHVsZV9lbnRyeSAqbTsKKwljaGFyICpjb2xvbiwgKnRva2Vuc1syXTsKKwlwYXJzZXJfdCAqcDsKKworCS8qIE1vZHByb2JlIGRvZXMgbm90IHdvcmsgYXQgYWxsIHdpdGhvdXQgbW9kdWxlcy5kZXAsCisJICogZXZlbiBpZiB0aGUgZnVsbCBtb2R1bGUgbmFtZSBpcyBnaXZlbi4gUmV0dXJuaW5nIGVycm9yIGhlcmUKKwkgKiB3YXMgbWFraW5nIHVzIGxhdGVyIGNvbmZ1c2UgdXNlciB3aXRoIHRoaXMgbWVzc2FnZToKKwkgKiAibW9kdWxlIC9mdWxsL3BhdGgvdG8vZXhpc3RpbmcvZmlsZS9tb2R1bGUua28gbm90IGZvdW5kIi4KKwkgKiBJdCdzIGJldHRlciB0byBkaWUgaW1tZWRpYXRlbHksIHdpdGggZ29vZCBtZXNzYWdlLgorCSAqIHhmb3Blbl9mb3JfcmVhZCBwcm92aWRlcyB0aGF0LiAqLworCXAgPSBjb25maWdfb3BlbjIoQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUsIHhmb3Blbl9mb3JfcmVhZCk7CisKKwl3aGlsZSAoRy5udW1fdW5yZXNvbHZlZF9kZXBzCisJICYmIGNvbmZpZ19yZWFkKHAsIHRva2VucywgMiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpCisJKSB7CisJCWNvbG9uID0gbGFzdF9jaGFyX2lzKHRva2Vuc1swXSwgJzonKTsKKwkJaWYgKGNvbG9uID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJKmNvbG9uID0gMDsKKworCQltID0gZ2V0X21vZGVudHJ5KHRva2Vuc1swXSk7CisJCWlmIChtID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKiBPcHRpbWl6YXRpb24uLi4gKi8KKwkJaWYgKChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkJICYmICEob3B0aW9uX21hc2szMiAmIChPUFRfUkVNT1ZFIHwgT1BUX1NIT1dfREVQUykpCisJCSkgeworCQkJREJHKCJza2lwIGRlcHMgb2YgJXMsIGl0J3MgYWxyZWFkeSBsb2FkZWQiLCB0b2tlbnNbMF0pOworCQkJY29udGludWU7CisJCX0KKworCQltLT5mbGFncyB8PSBNT0RVTEVfRkxBR19GT1VORF9JTl9NT0RERVA7CisJCWlmICgobS0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19ORUVEX0RFUFMpICYmIChtLT5kZXBzID09IE5VTEwpKSB7CisJCQlHLm51bV91bnJlc29sdmVkX2RlcHMtLTsKKwkJCWxsaXN0X2FkZF90bygmbS0+ZGVwcywgeHN0cmR1cCh0b2tlbnNbMF0pKTsKKwkJCWlmICh0b2tlbnNbMV0pCisJCQkJc3RyaW5nX3RvX2xsaXN0KHRva2Vuc1sxXSwgJm0tPmRlcHMsICIgXHQiKTsKKwkJfSBlbHNlCisJCQlEQkcoInNraXBwaW5nIGRlcCBsaW5lIik7CisJfQorCWNvbmZpZ19jbG9zZShwKTsKK30KKworaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtb2Rwcm9iZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCXVuc2lnbmVkIG9wdDsKKwlzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptZTsKKworCUlOSVRfRygpOworCisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSBtb2Rwcm9iZV9sb25nb3B0czspCisJb3B0X2NvbXBsZW1lbnRhcnkgPSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIElOU01PRF9PUFRTIE1PRFBST0JFX09QVFMgSU5TTU9EX0FSR1MpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogR290byBtb2R1bGVzIGxvY2F0aW9uICovCisJeGNoZGlyKENPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSKTsKKwl1bmFtZSgmRy51dHMpOworCXhjaGRpcihHLnV0cy5yZWxlYXNlKTsKKworCWlmIChvcHQgJiBPUFRfTElTVF9PTkxZKSB7CisJCWludCBpOworCQljaGFyIG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwkJY2hhciAqY29sb24sICp0b2tlbnNbMl07CisJCXBhcnNlcl90ICpwID0gY29uZmlnX29wZW4yKENPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFLCB4Zm9wZW5fZm9yX3JlYWQpOworCisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykKKwkJCXJlcGxhY2UoYXJndltpXSwgJy0nLCAnXycpOworCisJCXdoaWxlIChjb25maWdfcmVhZChwLCB0b2tlbnMsIDIsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJY29sb24gPSBsYXN0X2NoYXJfaXModG9rZW5zWzBdLCAnOicpOworCQkJaWYgKCFjb2xvbikKKwkJCQljb250aW51ZTsKKwkJCSpjb2xvbiA9ICdcMCc7CisJCQlmaWxlbmFtZTJtb2RuYW1lKHRva2Vuc1swXSwgbmFtZSk7CisJCQlpZiAoIWFyZ3ZbMF0pCisJCQkJcHV0cyh0b2tlbnNbMF0pOworCQkJZWxzZSB7CisJCQkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQkJCWlmIChmbm1hdGNoKGFyZ3ZbaV0sIG5hbWUsIDApID09IDApIHsKKwkJCQkJCXB1dHModG9rZW5zWzBdKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFllcywgZm9yIHNvbWUgcmVhc29uIC1sIGlnbm9yZXMgLXMuLi4gKi8KKwlpZiAob3B0ICYgSU5TTU9EX09QVF9TWVNMT0cpCisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKworCWlmICghYXJndlswXSkgeworCQlpZiAob3B0ICYgT1BUX1JFTU9WRSkgeworCQkJLyogIm1vZHByb2JlIC1yIiAody9vIHBhcmFtcykuCisJCQkgKiAiSWYgbmFtZSBpcyBOVUxMLCBhbGwgdW51c2VkIG1vZHVsZXMgbWFya2VkCisJCQkgKiBhdXRvY2xlYW4gd2lsbCBiZSByZW1vdmVkIi4KKwkJCSAqLworCQkJaWYgKGJiX2RlbGV0ZV9tb2R1bGUoTlVMTCwgT19OT05CTE9DSyB8IE9fRVhDTCkgIT0gMCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJtbW9kIik7CisJCX0KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBSZXRyaWV2ZSBtb2R1bGUgbmFtZXMgb2YgYWxyZWFkeSBsb2FkZWQgbW9kdWxlcyAqLworCXsKKwkJY2hhciAqczsKKwkJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuMigiL3Byb2MvbW9kdWxlcyIsIGZvcGVuX2Zvcl9yZWFkKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJnMsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0dSRUVEWSkpCisJCQlnZXRfb3JfYWRkX21vZGVudHJ5KHMpLT5mbGFncyB8PSBNT0RVTEVfRkxBR19MT0FERUQ7CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0KKworCWlmIChvcHQgJiAoT1BUX0lOU0VSVF9BTEwgfCBPUFRfUkVNT1ZFKSkgeworCQkvKiBFYWNoIGFyZ3VtZW50IGlzIGEgbW9kdWxlIG5hbWUgKi8KKwkJZG8geworCQkJREJHKCJhZGRpbmcgbW9kdWxlICVzIiwgKmFyZ3YpOworCQkJYWRkX3Byb2JlKCphcmd2KyspOworCQl9IHdoaWxlICgqYXJndik7CisJfSBlbHNlIHsKKwkJLyogRmlyc3QgYXJndW1lbnQgaXMgbW9kdWxlIG5hbWUsIHJlc3QgYXJlIHBhcmFtZXRlcnMgKi8KKwkJREJHKCJwcm9iaW5nIGp1c3QgbW9kdWxlICVzIiwgKmFyZ3YpOworCQlhZGRfcHJvYmUoYXJndlswXSk7CisJCUcuY21kbGluZV9tb3B0cyA9IHBhcnNlX2NtZGxpbmVfbW9kdWxlX29wdGlvbnMoYXJndiwgLypxdW90ZV9zcGFjZXM6Ki8gMSk7CisJfQorCisJLyogSGFwcGVucyBpZiBhbGwgcmVxdWVzdGVkIG1vZHVsZXMgYXJlIGFscmVhZHkgbG9hZGVkICovCisJaWYgKEcucHJvYmVzID09IE5VTEwpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwlyZWFkX2NvbmZpZygiL2V0Yy9tb2Rwcm9iZS5jb25mIik7CisJcmVhZF9jb25maWcoIi9ldGMvbW9kcHJvYmUuZCIpOworCWlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTICYmIEcubmVlZF9zeW1ib2xzKQorCQlyZWFkX2NvbmZpZygibW9kdWxlcy5zeW1ib2xzIik7CisJbG9hZF9tb2R1bGVzX2RlcCgpOworCWlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19BTElBUyAmJiBHLm51bV91bnJlc29sdmVkX2RlcHMpIHsKKwkJcmVhZF9jb25maWcoIm1vZHVsZXMuYWxpYXMiKTsKKwkJbG9hZF9tb2R1bGVzX2RlcCgpOworCX0KKworCXJjID0gMDsKKwl3aGlsZSAoKG1lID0gbGxpc3RfcG9wKCZHLnByb2JlcykpICE9IE5VTEwpIHsKKwkJaWYgKG1lLT5yZWFsbmFtZXMgPT0gTlVMTCkgeworCQkJREJHKCJwcm9iaW5nIGJ5IG1vZHVsZSBuYW1lIik7CisJCQkvKiBUaGlzIGlzIG5vdCBhbiBhbGlhcy4gTGl0ZXJhbCBuYW1lcyBhcmUgYmxhY2tsaXN0ZWQKKwkJCSAqIG9ubHkgaWYgJy1iJyBpcyBnaXZlbi4KKwkJCSAqLworCQkJaWYgKCEob3B0ICYgT1BUX0JMQUNLTElTVCkKKwkJCSB8fCAhKG1lLT5mbGFncyAmIE1PRFVMRV9GTEFHX0JMQUNLTElTVEVEKQorCQkJKSB7CisJCQkJcmMgfD0gZG9fbW9kcHJvYmUobWUpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcm9iZSBhbGwgcmVhbCBuYW1lcyBmb3IgdGhlIGFsaWFzICovCisJCWRvIHsKKwkJCWNoYXIgKnJlYWxuYW1lID0gbGxpc3RfcG9wKCZtZS0+cmVhbG5hbWVzKTsKKwkJCXN0cnVjdCBtb2R1bGVfZW50cnkgKm0yOworCisJCQlEQkcoInByb2JpbmcgYWxpYXMgJXMgYnkgcmVhbG5hbWUgJXMiLCBtZS0+bW9kbmFtZSwgcmVhbG5hbWUpOworCQkJbTIgPSBnZXRfb3JfYWRkX21vZGVudHJ5KHJlYWxuYW1lKTsKKwkJCWlmICghKG0yLT5mbGFncyAmIE1PRFVMRV9GTEFHX0JMQUNLTElTVEVEKQorCQkJICYmICghKG0yLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkJCSAgICB8fCAob3B0ICYgKE9QVF9SRU1PVkUgfCBPUFRfU0hPV19ERVBTKSkpCisJCQkpIHsKKy8vVE9ETzogd2UgY2FuIHBhc3MgIm1lIiBhcyAybmQgcGFyYW0gdG8gZG9fbW9kcHJvYmUsCisvL2FuZCBtYWtlIGRvX21vZHByb2JlIGVtaXQgbW9yZSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2VzCisvL3dpdGggYWxpYXMgbmFtZSBpbmNsdWRlZCwgbm90IGp1c3QgbW9kdWxlIG5hbWUgYWxpYXMgcmVzb2x2ZXMgdG8uCisJCQkJcmMgfD0gZG9fbW9kcHJvYmUobTIpOworCQkJfQorCQkJZnJlZShyZWFsbmFtZSk7CisJCX0gd2hpbGUgKG1lLT5yZWFsbmFtZXMgIT0gTlVMTCk7CisJfQorCisJcmV0dXJuIChyYyAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL21vZHV0aWxzL21vZHV0aWxzLTI0LmMgYi9tb2R1dGlscy9tb2R1dGlscy0yNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzU0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9tb2R1dGlscy0yNC5jCkBAIC0wLDAgKzEsMzk0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBpbnNtb2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgaW5zbW9kIHN1cHBvcnRzIEFSTSwgQ1JJUywgSDgvMzAwLCB4ODYsIGlhNjQsIHg4Nl82NCwKKyAqIG02OGssIE1JUFMsIFBvd2VyUEMsIFMzOTAsIFNIMy80LzUsIFNwYXJjLCB2ODUwZSwgYW5kIHg4Nl82NC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBhbmQgUm9uIEFsZGVyIDxhbGRlckBsaW5lby5jb20+CisgKgorICogUm9kbmV5IFJhZGZvcmQgPHJyYWRmb3JkQG1pbmRzcHJpbmcuY29tPiAxNy1BdWctMjAwNC4KKyAqICAgQWRkZWQgeDg2XzY0IHN1cHBvcnQuCisgKgorICogTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+IGFkZGVkIE5FQyBWODUwRSBzdXBwb3J0LgorICoKKyAqIE1vZGlmaWVkIGJ5IEJyeWFuIFJpdHRtZXllciA8YnJ5YW5AaXhpYWNvbS5jb20+IHRvIHN1cHBvcnQgU0g0CisgKiBhbmQgKHRoZW9yZXRpY2FsbHkpIFNIMy4gSSBoYXZlIG9ubHkgdGVzdGVkIFNINCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCisgKgorICogTW9kaWZpZWQgYnkgQWxjb3ZlLCBKdWxpZW4gR2F1bG1pbiA8anVsaWVuLmdhdWxtaW5AYWxjb3ZlLmZyPiBhbmQKKyAqIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYWxjb3ZlLmZyPiB0byBzdXBwb3J0IEFSTTdURE1JLiAgT25seQorICogdmVyeSBtaW5vciBjaGFuZ2VzIHJlcXVpcmVkIHRvIGFsc28gd29yayB3aXRoIFN0cm9uZ0FybSBhbmQgcHJlc3VtYWJseQorICogYWxsIEFSTSBiYXNlZCBzeXN0ZW1zLgorICoKKyAqIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4gMTktTWF5LTIwMDQuCisgKiAgIGFkZGVkIFJlbmVzYXMgSDgvMzAwIHN1cHBvcnQuCisgKgorICogUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4gMDgtQXVnLTIwMDMuCisgKiAgIEludGVncmF0ZWQgc3VwcG9ydCBmb3Igc2g2NCAoU0gtNSksIGZyb20gcHJlbGltaW5hcnkgbW9kdXRpbHMKKyAqICAgcGF0Y2hlcyBmcm9tIEJlbmVkaWN0IEdhc3RlciA8YmVuZWRpY3QuZ2FzdGVyQHN1cGVyaC5jb20+LgorICogICBDdXJyZW50bHkgbGltaXRlZCB0byBzdXBwb3J0IGZvciAzMmJpdCBBQkkuCisgKgorICogTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4gMjItTWF5LTIwMDIuCisgKiAgIFRoZSBwbHQgYW5kIGdvdCBjb2RlIGFyZSBub3cgdXNpbmcgdGhlIHNhbWUgc3RydWN0cy4KKyAqICAgQWRkZWQgZ2VuZXJpYyBsaW5rZWQgbGlzdCBjb2RlIHRvIGZ1bGx5IHN1cHBvcnQgUG93ZXJQQy4KKyAqICAgUmVwbGFjZWQgdGhlIG1lc3MgaW4gYXJjaF9hcHBseV9yZWxvY2F0aW9uKCkgd2l0aCBhcmNoaXRlY3R1cmUgYmxvY2tzLgorICogICBUaGUgYXJjaF9jcmVhdGVfZ290KCkgZnVuY3Rpb24gZ290IGNsZWFuZWQgdXAgd2l0aCBhcmNoaXRlY3R1cmUgYmxvY2tzLgorICogICBUaGVzZSBibG9ja3Mgc2hvdWxkIGJlIGVhc3kgbWFpbnRhaW4gYW5kIHN5bmMgd2l0aCBvYmpfeHh4LmMgaW4gbW9kdXRpbHMuCisgKgorICogTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4gYWRkZWQgUG93ZXJQQyBzdXBwb3J0IDIwLUZlYi0yMDAxLgorICogICBQb3dlclBDIHNwZWNpZmljIGNvZGUgc3RvbGVuIGZyb20gbW9kdXRpbHMtMi4zLjE2LAorICogICB3cml0dGVuIGJ5IFBhdWwgTWFja2VycmFzLCBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorICogICBJJ3ZlIG9ubHkgdGVzdGVkIHRoZSBjb2RlIG9uIG1wYzh4eCBwbGF0Zm9ybXMgaW4gYmlnLWVuZGlhbiBtb2RlLgorICogICBEaWQgc29tZSBjbGVhbnVwIGFuZCBhZGRlZCBVU0VfeHh4X0VOVFJJRVMuLi4KKyAqCisgKiBRdWlubiBKZW5zZW4gPGplbnNlbnFAbGluZW8uY29tPiBhZGRlZCBNSVBTIHN1cHBvcnQgMjMtRmViLTIwMDEuCisgKiAgIGJhc2VkIG9uIG1vZHV0aWxzLTIuNC4yCisgKiAgIE1JUFMgc3BlY2lmaWMgc3VwcG9ydCBmb3IgRWxmIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24uCisgKiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCisgKiAgIENvbnRyaWJ1dGVkIGJ5IFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4KKyAqCisgKiBCYXNlZCBhbG1vc3QgZW50aXJlbHkgb24gdGhlIExpbnV4IG1vZHV0aWxzLTIuMy4xMSBpbXBsZW1lbnRhdGlvbi4KKyAqICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKyAqICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgKiAgIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgorICogICBSZXN0cnVjdHVyZWQgKGFuZCBwYXJ0bHkgcmV3cml0dGVuKSBieToKKyAqICAgQmr2cm4gRWt3YWxsIDxiajBybkBibG94LnNlPiBGZWJydWFyeSAxOTk5CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQorI2RlZmluZSBMT0FEQklUUyAwCisjZWxzZQorI2RlZmluZSBMT0FEQklUUyAxCisjZW5kaWYKKworLyogQWxwaGEgKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9BTFBIQSkKKyNkZWZpbmUgU0hUX1JFTE0gICAgICAgU0hUX1JFTEEKKyNkZWZpbmUgRWxmNjRfUmVsTSAgICAgRWxmNjRfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICAgICBFTEZDTEFTUzY0CisjZW5kaWYKKworLyogQVJNIHN1cHBvcnQgKi8KKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQVJNKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBORFMzMiBzdXBwb3J0ICovCisjaWYgZGVmaW5lZChfX25kczMyX18pIHx8IGRlZmluZWQoX19ORFMzMl9fKQorI2RlZmluZSBDT05GSUdfVVNFX0dPVF9FTlRSSUVTCisjZGVmaW5lIENPTkZJR19HT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIENPTkZJR19VU0VfU0lOR0xFCisKKyNpZiBkZWZpbmVkKF9fTkRTMzJfRUJfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9ORFMzMikKKyNkZWZpbmUgU0hUX1JFTE0gICAgU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTSAgRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICBFTEZDTEFTUzMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ORFMzMl9FTF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX05EUzMyKQorI2RlZmluZSBTSFRfUkVMTSAgICBTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNICBFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTSAgIEVMRkNMQVNTMzIKKyNlbmRpZgorI2VuZGlmCisKKy8qIGJsYWNrZmluICovCisjaWYgZGVmaW5lZChCRklOKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0JMQUNLRklOKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNlbmRpZgorCisvKiBDUklTICovCisjaWYgZGVmaW5lZChfX2NyaXNfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9DUklTKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNpZm5kZWYgRU1fQ1JJUworI2RlZmluZSBFTV9DUklTIDc2CisjZGVmaW5lIFJfQ1JJU19OT05FIDAKKyNkZWZpbmUgUl9DUklTXzMyICAgMworI2VuZGlmCisjZW5kaWYKKworLyogSDgvMzAwICovCisjaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fSDhfMzAwKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNkZWZpbmUgVVNFX1NJTkdMRQorI2RlZmluZSBTWU1CT0xfUFJFRklYCSJfIgorI2VuZGlmCisKKy8qIFBBLVJJU0MgLyBIUC1QQSAqLworI2lmIGRlZmluZWQoX19ocHBhX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUEFSSVNDKQorI2RlZmluZSBTSFRfUkVMTSAgICAgICBTSFRfUkVMQQorI2lmIGRlZmluZWQoX19MUDY0X18pCisjZGVmaW5lIEVsZjY0X1JlbE0gICAgIEVsZjY0X1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAorI2Vsc2UKKyNkZWZpbmUgRWxmMzJfUmVsTSAgICAgRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICAgICBFTEZDTEFTUzMyCisjZW5kaWYKKyNlbmRpZgorCisvKiB4ODYgKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2lmbmRlZiBFTV80ODYKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYpCisjZWxzZQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNXzM4NiB8fCB4ID09IEVNXzQ4NikKKyNlbmRpZgorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBJQTY0LCBha2EgSXRhbml1bSAqLworI2lmIGRlZmluZWQoX19pYTY0X18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fSUFfNjQpCisjZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCisjZGVmaW5lIEVsZjY0X1JlbE0gICAgIEVsZjY0X1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAorI2VuZGlmCisKKy8qIG02OGsgKi8KKyNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNXzY4SykKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBNaWNyb2JsYXplICovCisjaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKyNkZWZpbmUgVVNFX1NJTkdMRQorI2luY2x1ZGUgPGxpbnV4L2VsZi1lbS5oPgorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1hJTElOWF9NSUNST0JMQVpFKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKyNlbmRpZgorCisvKiBNSVBTICovCisjaWYgZGVmaW5lZChfX21pcHNfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9NSVBTIHx8IHggPT0gRU1fTUlQU19SUzNfTEUpCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUwKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWwKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKKy8qIEFjY291bnQgZm9yIEVMRiBzcGVjIGNoYW5nZXMuICAqLworI2lmbmRlZiBFTV9NSVBTX1JTM19MRQorI2lmZGVmIEVNX01JUFNfUlM0X0JFCisjZGVmaW5lIEVNX01JUFNfUlMzX0xFCUVNX01JUFNfUlM0X0JFCisjZWxzZQorI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAorI2VuZGlmCisjZW5kaWYgLyogIUVNX01JUFNfUlMzX0xFICovCisjZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19kYmVfdGFibGUiCisjZW5kaWYKKworLyogTmlvcyBJSSAqLworI2lmIGRlZmluZWQoX19uaW9zMl9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0FMVEVSQV9OSU9TMikKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZW5kaWYKKworLyogUG93ZXJQQyAqLworI2lmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QUEM2NCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmNjRfUmVsTQlFbGY2NF9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzY0CisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1BQQykKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSAxNgorI2RlZmluZSBVU0VfUExUX0xJU1QKKyNkZWZpbmUgTElTVF9BUkNIVFlQRSBFbGZXKEFkZHIpCisjZGVmaW5lIFVTRV9MSVNUCisjZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19mdHJfZml4dXAiCisjZW5kaWYKKworLyogUzM5MCAqLworI2lmIGRlZmluZWQoX19zMzkwX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUzM5MCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNlbmRpZgorCisvKiBTdXBlckggKi8KKyNpZiBkZWZpbmVkKF9fc2hfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9TSCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9HT1RfRU5UUklFUworI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CisjZGVmaW5lIFVTRV9TSU5HTEUKKy8qIHRoZSBTSCBjaGFuZ2VzIGhhdmUgb25seSBiZWVuIHRlc3RlZCBpbiA9bGl0dGxlIGVuZGlhbj0gbW9kZSAqLworLyogSSdtIG5vdCBzdXJlIGFib3V0IGJpZyBlbmRpYW4sIHNvIGxldCdzIHdhcm46ICovCisjaWYgZGVmaW5lZChfX3NoX18pICYmIEJCX0JJR19FTkRJQU4KKyMgZXJyb3IgaW5zbW9kLmMgbWF5IHJlcXVpcmUgY2hhbmdlcyBmb3IgdXNlIG9uIGJpZyBlbmRpYW4gU0gKKyNlbmRpZgorLyogaXQgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgU0gxL1NIMi4uLiBFcnJvciBvbiB0aG9zZSBhbHNvICovCisjaWYgKCghKGRlZmluZWQoX19TSDNfXykgfHwgZGVmaW5lZChfX1NINF9fKSB8fCBkZWZpbmVkKF9fU0g1X18pKSkpICYmIChkZWZpbmVkKF9fc2hfXykpCisjZXJyb3IgaW5zbW9kLmMgbWF5IHJlcXVpcmUgY2hhbmdlcyBmb3IgU0gxIG9yIFNIMiB1c2UKKyNlbmRpZgorI2VuZGlmCisKKy8qIFNwYXJjICovCisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fU1BBUkMpCisjZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0gICAgIEVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1MzMgorI2VuZGlmCisKKy8qIHY4NTBlICovCisjaWYgZGVmaW5lZChfX3Y4NTBlX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKCh4KSA9PSBFTV9WODUwIHx8ICh4KSA9PSBFTV9DWUdOVVNfVjg1MCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9QTFRfRU5UUklFUworI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CisjZGVmaW5lIFVTRV9TSU5HTEUKKyNpZm5kZWYgRU1fQ1lHTlVTX1Y4NTAJLyogZ3J1bWJsZSAqLworI2RlZmluZSBFTV9DWUdOVVNfVjg1MAkweDkwODAKKyNlbmRpZgorI2RlZmluZSBTWU1CT0xfUFJFRklYCSJfIgorI2VuZGlmCisKKy8qIFg4Nl82NCAgKi8KKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fWDg2XzY0KQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfU0lOR0xFCisjZGVmaW5lIEVsZjY0X1JlbE0JRWxmNjRfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1M2NAorI2VuZGlmCisKKyNpZm5kZWYgU0hUX1JFTE0KKyNlcnJvciBTb3JyeSwgYnV0IGluc21vZC5jIGRvZXMgbm90IHlldCBzdXBwb3J0IHRoaXMgYXJjaGl0ZWN0dXJlLi4uCisjZW5kaWYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS1tb2R1dGlscyBtb2R1bGUuaCwgbGluZXMgNDUtMjQyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMaW51eCBtb2R1bGUgc3lzY2FsbCBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorCisgICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBNT0RVVElMU19NT0RVTEVfSAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRm9yIHNpemVvZigpIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBtb2R1bGUgcGxhdGZvcm0gYW5kIG5vdCB0byB0aGUKKyAgIGVudmlyb25tZW50IGlzbm1vZCBpcyBydW5uaW5nIGluLCB1c2Ugc2l6ZW9mX3h4IGluc3RlYWQgb2Ygc2l6ZW9mKHh4KS4gICovCisKKyNkZWZpbmUgdGd0X3NpemVvZl9jaGFyCQlzaXplb2YoY2hhcikKKyNkZWZpbmUgdGd0X3NpemVvZl9zaG9ydAlzaXplb2Yoc2hvcnQpCisjZGVmaW5lIHRndF9zaXplb2ZfaW50CQlzaXplb2YoaW50KQorI2RlZmluZSB0Z3Rfc2l6ZW9mX2xvbmcJCXNpemVvZihsb25nKQorI2RlZmluZSB0Z3Rfc2l6ZW9mX2NoYXJfcAlzaXplb2YoY2hhciAqKQorI2RlZmluZSB0Z3Rfc2l6ZW9mX3ZvaWRfcAlzaXplb2Yodm9pZCAqKQorI2RlZmluZSB0Z3RfbG9uZwkJbG9uZworCisjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgZGVmaW5lZChBUkNIX3NwYXJjNjQpCisjdW5kZWYgdGd0X3NpemVvZl9sb25nCisjdW5kZWYgdGd0X3NpemVvZl9jaGFyX3AKKyN1bmRlZiB0Z3Rfc2l6ZW9mX3ZvaWRfcAorI3VuZGVmIHRndF9sb25nCitlbnVtIHsKKwl0Z3Rfc2l6ZW9mX2xvbmcgPSA4LAorCXRndF9zaXplb2ZfY2hhcl9wID0gOCwKKwl0Z3Rfc2l6ZW9mX3ZvaWRfcCA9IDgKK307CisjZGVmaW5lIHRndF9sb25nCQlsb25nIGxvbmcKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVGhlIHN0cnVjdHVyZXMgdXNlZCBpbiBMaW51eCAyLjEuICAqLworCisvKiBOb3RlOiBuZXdfbW9kdWxlX3N5bWJvbCBkb2VzIG5vdCB1c2UgdGd0X2xvbmcgaW50ZW50aW9uYWxseSAqLworc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgbmFtZTsKK307CisKK3N0cnVjdCBuZXdfbW9kdWxlX3BlcnNpc3Q7CisKK3N0cnVjdCBuZXdfbW9kdWxlX3JlZiB7CisJdW5zaWduZWQgdGd0X2xvbmcgZGVwOwkJLyoga2VybmVsIGFkZHJlc3NlcyAqLworCXVuc2lnbmVkIHRndF9sb25nIHJlZjsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0X3JlZjsKK307CisKK3N0cnVjdCBuZXdfbW9kdWxlIHsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBzaXplX29mX3N0cnVjdDsJLyogPT0gc2l6ZW9mKG1vZHVsZSkgKi8KKwl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0OworCXVuc2lnbmVkIHRndF9sb25nIG5hbWU7CisJdW5zaWduZWQgdGd0X2xvbmcgc2l6ZTsKKworCXRndF9sb25nIHVzZWNvdW50OworCXVuc2lnbmVkIHRndF9sb25nIGZsYWdzOwkJLyogQVVUT0NMRUFOIGV0IGFsICovCisKKwl1bnNpZ25lZCBuc3ltczsKKwl1bnNpZ25lZCBuZGVwczsKKworCXVuc2lnbmVkIHRndF9sb25nIHN5bXM7CisJdW5zaWduZWQgdGd0X2xvbmcgZGVwczsKKwl1bnNpZ25lZCB0Z3RfbG9uZyByZWZzOworCXVuc2lnbmVkIHRndF9sb25nIGluaXQ7CisJdW5zaWduZWQgdGd0X2xvbmcgY2xlYW51cDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9zdGFydDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9lbmQ7CisjaWZkZWYgX19hbHBoYV9fCisJdW5zaWduZWQgdGd0X2xvbmcgZ3A7CisjZW5kaWYKKwkvKiBFdmVyeXRoaW5nIGFmdGVyIGhlcmUgaXMgZXh0ZW5zaW9uLiAgKi8KKwl1bnNpZ25lZCB0Z3RfbG9uZyBwZXJzaXN0X3N0YXJ0OworCXVuc2lnbmVkIHRndF9sb25nIHBlcnNpc3RfZW5kOworCXVuc2lnbmVkIHRndF9sb25nIGNhbl91bmxvYWQ7CisJdW5zaWduZWQgdGd0X2xvbmcgcnVuc2l6ZTsKKwljb25zdCBjaGFyICprYWxsc3ltc19zdGFydDsgICAgIC8qIEFsbCBzeW1ib2xzIGZvciBrZXJuZWwgZGVidWdnaW5nICovCisJY29uc3QgY2hhciAqa2FsbHN5bXNfZW5kOworCWNvbnN0IGNoYXIgKmFyY2hkYXRhX3N0YXJ0OyAgICAgLyogYXJjaCBzcGVjaWZpYyBkYXRhIGZvciBtb2R1bGUgKi8KKwljb25zdCBjaGFyICphcmNoZGF0YV9lbmQ7CisJY29uc3QgY2hhciAqa2VybmVsX2RhdGE7ICAgICAgICAvKiBSZXNlcnZlZCBmb3Iga2VybmVsIGludGVybmFsIHVzZSAqLworfTsKKworI2lmZGVmIEFSQ0hEQVRBTQorI2RlZmluZSBBUkNIREFUQV9TRUNfTkFNRSBBUkNIREFUQU0KKyNlbHNlCisjZGVmaW5lIEFSQ0hEQVRBX1NFQ19OQU1FICJfX2FyY2hkYXRhIgorI2VuZGlmCisjZGVmaW5lIEtBTExTWU1TX1NFQ19OQU1FICJfX2thbGxzeW1zIgorCisKK3N0cnVjdCBuZXdfbW9kdWxlX2luZm8geworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIHVzZWNvdW50OworfTsKKworLyogQml0cyBvZiBtb2R1bGUuZmxhZ3MuICAqLworZW51bSB7CisJTkVXX01PRF9SVU5OSU5HID0gMSwKKwlORVdfTU9EX0RFTEVURUQgPSAyLAorCU5FV19NT0RfQVVUT0NMRUFOID0gNCwKKwlORVdfTU9EX1ZJU0lURUQgPSA4LAorCU5FV19NT0RfVVNFRF9PTkNFID0gMTYKK307CisKK2ludCBpbml0X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgbmV3X21vZHVsZSAqKTsKK2ludCBxdWVyeV9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgaW50IHdoaWNoLCB2b2lkICpidWYsCisJCXNpemVfdCBidWZzaXplLCBzaXplX3QgKnJldCk7CisKKy8qIFZhbHVlcyBmb3IgcXVlcnlfbW9kdWxlJ3Mgd2hpY2guICAqLworZW51bSB7CisJUU1fTU9EVUxFUyA9IDEsCisJUU1fREVQUyA9IDIsCisJUU1fUkVGUyA9IDMsCisJUU1fU1lNQk9MUyA9IDQsCisJUU1fSU5GTyA9IDUKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBUaGUgc3lzdGVtIGNhbGxzIHVuY2hhbmdlZCBiZXR3ZWVuIDIuMCBhbmQgMi4xLiAgKi8KKwordW5zaWduZWQgbG9uZyBjcmVhdGVfbW9kdWxlKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK2ludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKworCisjZW5kaWYgLyogbW9kdWxlLmggKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tZW5kIG9mIG1vZHV0aWxzIG1vZHVsZS5oCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLS0tLW1vZHV0aWxzIG9iai5oLCBsaW5lcyAyNTMtNDYyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyogRWxmIG9iamVjdCBmaWxlIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24gcm91dGluZXMuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorCisgICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBNT0RVVElMU19PQkpfSAorCisvKiBUaGUgcmVsb2NhdGFibGUgb2JqZWN0IGlzIG1hbmlwdWxhdGVkIHVzaW5nIGVsZmluIHR5cGVzLiAgKi8KKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisjaWZuZGVmIEVsZlcKKyMgaWYgRUxGQ0xBU1NNID09IEVMRkNMQVNTMzIKKyMgIGRlZmluZSBFbGZXKHgpICBFbGYzMl8gIyMgeAorIyAgZGVmaW5lIEVMRlcoeCkgIEVMRjMyXyAjIyB4CisjIGVsc2UKKyMgIGRlZmluZSBFbGZXKHgpICBFbGY2NF8gIyMgeAorIyAgZGVmaW5lIEVMRlcoeCkgIEVMRjY0XyAjIyB4CisjIGVuZGlmCisjZW5kaWYKKworLyogRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbWlzc2luZyBmcm9tIHNvbWUgYW5jaWVudCBDIGxpYnJhcmllcy4uLi4gICovCisjaWZuZGVmIEVMRjMyX1NUX0lORk8KKyMgZGVmaW5lIEVMRjMyX1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKKyNlbmRpZgorCisjaWZuZGVmIEVMRjY0X1NUX0lORk8KKyMgZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKKyNlbmRpZgorCisjZGVmaW5lIEVMRl9TVF9CSU5EKGluZm8pIEVMRlcoU1RfQklORCkoaW5mbykKKyNkZWZpbmUgRUxGX1NUX1RZUEUoaW5mbykgRUxGVyhTVF9UWVBFKShpbmZvKQorI2RlZmluZSBFTEZfU1RfSU5GTyhiaW5kLCB0eXBlKSBFTEZXKFNUX0lORk8pKGJpbmQsIHR5cGUpCisjZGVmaW5lIEVMRl9SX1RZUEUodmFsKSBFTEZXKFJfVFlQRSkodmFsKQorI2RlZmluZSBFTEZfUl9TWU0odmFsKSBFTEZXKFJfU1lNKSh2YWwpCisKK3N0cnVjdCBvYmpfc3RyaW5nX3BhdGNoOworc3RydWN0IG9ial9zeW1ib2xfcGF0Y2g7CisKK3N0cnVjdCBvYmpfc2VjdGlvbiB7CisJRWxmVyhTaGRyKSBoZWFkZXI7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICpjb250ZW50czsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmxvYWRfbmV4dDsKKwlpbnQgaWR4OworfTsKKworc3RydWN0IG9ial9zeW1ib2wgeworCXN0cnVjdCBvYmpfc3ltYm9sICpuZXh0OwkvKiBoYXNoIHRhYmxlIGxpbmsgKi8KKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBzZWNpZHg7CQkJLyogdGhlIGRlZmluaW5nIHNlY3Rpb24gaW5kZXgvbW9kdWxlICovCisJaW50IGluZm87CisJaW50IGtzeW1pZHg7CQkJLyogZm9yIGV4cG9ydCB0byB0aGUga2VybmVsIHN5bXRhYiAqLworCWludCByZWZlcmVuY2VkOwkJLyogYWN0dWFsbHkgdXNlZCBpbiB0aGUgbGluayAqLworfTsKKworLyogSGFyZGNvZGUgdGhlIGhhc2ggdGFibGUgc2l6ZS4gIFdlIHNob3VsZG4ndCBiZSBuZWVkaW5nIHNvIG1hbnkKKyAgIHN5bWJvbHMgdGhhdCB3ZSBiZWdpbiB0byBkZWdyYWRlIHBlcmZvcm1hbmNlLCBhbmQgd2UgZ2V0IGEgYmlnIHdpbgorICAgYnkgZ2l2aW5nIHRoZSBjb21waWxlciBhIGNvbnN0YW50IGRpdmlzb3IuICAqLworCisjZGVmaW5lIEhBU0hfQlVDS0VUUyAgNTIxCisKK3N0cnVjdCBvYmpfZmlsZSB7CisJRWxmVyhFaGRyKSBoZWFkZXI7CisJRWxmVyhBZGRyKSBiYXNlYWRkcjsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKipzZWN0aW9uczsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmxvYWRfb3JkZXI7CisJc3RydWN0IG9ial9zZWN0aW9uICoqbG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7CisJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKnN0cmluZ19wYXRjaGVzOworCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpzeW1ib2xfcGF0Y2hlczsKKwlpbnQgKCpzeW1ib2xfY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7IC8qIGNhbnQgYmUgRkFTVF9GVU5DICovCisJdW5zaWduZWQgbG9uZyAoKnN5bWJvbF9oYXNoKShjb25zdCBjaGFyICopIEZBU1RfRlVOQzsKKwl1bnNpZ25lZCBsb25nIGxvY2FsX3N5bXRhYl9zaXplOworCXN0cnVjdCBvYmpfc3ltYm9sICoqbG9jYWxfc3ltdGFiOworCXN0cnVjdCBvYmpfc3ltYm9sICpzeW10YWJbSEFTSF9CVUNLRVRTXTsKK307CisKK2VudW0gb2JqX3JlbG9jIHsKKwlvYmpfcmVsb2Nfb2ssCisJb2JqX3JlbG9jX292ZXJmbG93LAorCW9ial9yZWxvY19kYW5nZXJvdXMsCisJb2JqX3JlbG9jX3VuaGFuZGxlZAorfTsKKworc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggeworCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpuZXh0OworCWludCByZWxvY19zZWNpZHg7CisJRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CisJRWxmVyhBZGRyKSBzdHJpbmdfb2Zmc2V0OworfTsKKworc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggeworCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpuZXh0OworCWludCByZWxvY19zZWNpZHg7CisJRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKK307CisKKworLyogR2VuZXJpYyBvYmplY3QgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgRkFTVF9GVU5DIG9ial9lbGZfaGFzaChjb25zdCBjaGFyICopOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgbGVuKTsKKworc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICpvYmpfZmluZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLAorCQljb25zdCBjaGFyICpuYW1lKTsKKworc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKK3N0YXRpYyB2b2lkIG9ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAorCQlpbnQgKCpjbXApKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSwKKwkJdW5zaWduZWQgbG9uZyAoKmhhc2gpKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfZmluZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyB2b2lkIG9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMpOworCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJdW5zaWduZWQgbG9uZyBzaXplKTsKKworc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKTsKKworc3RhdGljIHZvaWQgb2JqX3N0cmluZ19wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAorCQljb25zdCBjaGFyICpzdHJpbmcpOworCitzdGF0aWMgdm9pZCBvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOworCitzdGF0aWMgdm9pZCBvYmpfY2hlY2tfdW5kZWZpbmVkcyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworCitzdGF0aWMgdm9pZCBvYmpfYWxsb2NhdGVfY29tbW9ucyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbG9hZF9zaXplKHN0cnVjdCBvYmpfZmlsZSAqZik7CisKK3N0YXRpYyBpbnQgb2JqX3JlbG9jYXRlKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKTsKKworI2lmICFMT0FEQklUUworI2RlZmluZSBvYmpfbG9hZChpbWFnZSwgaW1hZ2Vfc2l6ZSwgbG9hZHByb2diaXRzKSBcCisJb2JqX2xvYWQoaW1hZ2UsIGltYWdlX3NpemUpCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKGNoYXIgKmltYWdlLCBzaXplX3QgaW1hZ2Vfc2l6ZSwgaW50IGxvYWRwcm9nYml0cyk7CisKK3N0YXRpYyBpbnQgb2JqX2NyZWF0ZV9pbWFnZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKmltYWdlKTsKKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKmFyY2hfbmV3X2ZpbGUodm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmFyY2hfbmV3X3NlY3Rpb24odm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpOworCitzdGF0aWMgZW51bSBvYmpfcmVsb2MgYXJjaF9hcHBseV9yZWxvY2F0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAorCQkvKnN0cnVjdCBvYmpfc2VjdGlvbiAqc3ltc2VjLCovCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCisJCUVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFyY2hfY3JlYXRlX2dvdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCitzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKTsKKyNlbmRpZgorI2VuZGlmIC8qIG9iai5oICovCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS1lbmQgb2YgbW9kdXRpbHMgb2JqLmgKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8qIFNQRlggaXMgYWx3YXlzIGEgc3RyaW5nLCBzbyBpdCBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIHN0cmluZyBjb25zdGFudHMuICAqLworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKyNkZWZpbmUgU1BGWAlTWU1CT0xfUFJFRklYCisjZWxzZQorI2RlZmluZSBTUEZYCSIiCisjZW5kaWYKKworZW51bSB7IFNUUlZFUlNJT05MRU4gPSA2NCB9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIGZsYWdfZm9yY2VfbG9hZCAob3B0aW9uX21hc2szMiAmIElOU01PRF9PUFRfRk9SQ0UpCisjZGVmaW5lIGZsYWdfYXV0b2NsZWFuIChvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9LRVJORUxEKQorI2RlZmluZSBmbGFnX3ZlcmJvc2UgKG9wdGlvbl9tYXNrMzIgJiBJTlNNT0RfT1BUX1ZFUkJPU0UpCisjZGVmaW5lIGZsYWdfcXVpZXQgKG9wdGlvbl9tYXNrMzIgJiBJTlNNT0RfT1BUX1NJTEVOVCkKKyNkZWZpbmUgZmxhZ19ub2V4cG9ydCAob3B0aW9uX21hc2szMiAmIElOU01PRF9PUFRfTk9fRVhQT1JUKQorI2RlZmluZSBmbGFnX3ByaW50X2xvYWRfbWFwIChvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9QUklOVF9NQVApCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZiBkZWZpbmVkKFVTRV9MSVNUKQorCitzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpuZXh0OworCUxJU1RfQVJDSFRZUEUgYWRkZW5kOworCWludCBvZmZzZXQ7CisJaW50IGluaXRlZCA6IDE7Cit9OworCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX1NJTkdMRSkKKworc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5IHsKKwlpbnQgb2Zmc2V0OworCWludCBpbml0ZWQgOiAxOworCWludCBhbGxvY2F0ZWQgOiAxOworfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorc3RydWN0IG1pcHNfaGkxNiB7CisJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKKwlFbGZXKEFkZHIpICphZGRyOworCUVsZlcoQWRkcikgdmFsdWU7Cit9OworI2VuZGlmCisKK3N0cnVjdCBhcmNoX2ZpbGUgeworCXN0cnVjdCBvYmpfZmlsZSByb290OworI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCXN0cnVjdCBvYmpfc2VjdGlvbiAqcGx0OworI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJc3RydWN0IG9ial9zZWN0aW9uICpnb3Q7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCXN0cnVjdCBtaXBzX2hpMTYgKm1pcHNfaGkxNl9saXN0OworI2VuZGlmCit9OworCitzdHJ1Y3QgYXJjaF9zeW1ib2wgeworCXN0cnVjdCBvYmpfc3ltYm9sIHJvb3Q7CisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisjaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCisJc3RydWN0IGFyY2hfbGlzdF9lbnRyeSAqcGx0ZW50OworI2Vsc2UKKwlzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgcGx0ZW50OworI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwlzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgZ290ZW50OworI2VuZGlmCit9OworCisKK3N0cnVjdCBleHRlcm5hbF9tb2R1bGUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJRWxmVyhBZGRyKSBhZGRyOworCWludCB1c2VkOworCXNpemVfdCBuc3ltczsKKwlzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnN5bXM7Cit9OworCitzdGF0aWMgc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICprc3ltczsKK3N0YXRpYyBzaXplX3QgbmtzeW1zOworCitzdGF0aWMgc3RydWN0IGV4dGVybmFsX21vZHVsZSAqZXh0X21vZHVsZXM7CitzdGF0aWMgaW50IG5fZXh0X21vZHVsZXM7CitzdGF0aWMgaW50IG5fZXh0X21vZHVsZXNfdXNlZDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgc3RydWN0IG9ial9maWxlICphcmNoX25ld19maWxlKHZvaWQpCit7CisJc3RydWN0IGFyY2hfZmlsZSAqZjsKKwlmID0geHphbGxvYyhzaXplb2YoKmYpKTsKKwlyZXR1cm4gJmYtPnJvb3Q7IC8qIGl0J3MgYSBmaXJzdCBtZW1iZXIgKi8KK30KKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbih2b2lkKQoreworCXJldHVybiB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqX3NlY3Rpb24pKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICphcmNoX25ld19zeW1ib2wodm9pZCkKK3sKKwlzdHJ1Y3QgYXJjaF9zeW1ib2wgKnN5bTsKKwlzeW0gPSB4emFsbG9jKHNpemVvZigqc3ltKSk7CisJcmV0dXJuICZzeW0tPnJvb3Q7Cit9CisKK3N0YXRpYyBlbnVtIG9ial9yZWxvYworYXJjaF9hcHBseV9yZWxvY2F0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAorCQkvKnN0cnVjdCBvYmpfc2VjdGlvbiAqc3ltc2VjLCovCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCisJCUVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2KQoreworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgXAorIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIFwKKyB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCXN0cnVjdCBhcmNoX2ZpbGUgKmlmaWxlID0gKHN0cnVjdCBhcmNoX2ZpbGUgKikgZjsKKyNlbmRpZgorCWVudW0gb2JqX3JlbG9jIHJldCA9IG9ial9yZWxvY19vazsKKwlFbGZXKEFkZHIpICpsb2MgPSAoRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKSBcCisgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChfX21pY3JvYmxhemVfXykgXAorIHx8IGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19uaW9zMl9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSBcCisgfHwgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKwlFbGZXKEFkZHIpIGRvdCA9IHRhcmdzZWMtPmhlYWRlci5zaF9hZGRyICsgcmVsLT5yX29mZnNldDsKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwlzdHJ1Y3QgYXJjaF9zeW1ib2wgKmlzeW0gPSAoc3RydWN0IGFyY2hfc3ltYm9sICopIHN5bTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgXAorIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fczM5MF9fKQorI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorCUVsZlcoQWRkcikgZ290ID0gaWZpbGUtPmdvdCA/IGlmaWxlLT5nb3QtPmhlYWRlci5zaF9hZGRyIDogMDsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJRWxmVyhBZGRyKSBwbHQgPSBpZmlsZS0+cGx0ID8gaWZpbGUtPnBsdC0+aGVhZGVyLnNoX2FkZHIgOiAwOworCXVuc2lnbmVkIGxvbmcgKmlwOworIyBpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKKwlzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKKyMgZWxzZQorCXN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqcGU7CisjIGVuZGlmCisjZW5kaWYKKworCXN3aXRjaCAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykpIHsKKworI2lmIGRlZmluZWQoX19hcm1fXykKKworCQljYXNlIFJfQVJNX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfQVJNX0FCUzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX0FSTV9HT1QzMjoKKwkJCWdvdG8gYmJfdXNlX2dvdDsKKworCQljYXNlIFJfQVJNX0dPVFBDOgorCQkJLyogcmVsYXRpdmUgcmVsb2MsIGFsd2F5cyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8KKwkJCSAqICh3aGljaCBpcyAuZ290KSBzaW1pbGFyIHRvIGJyYW5jaCwKKwkJCSAqIGJ1dCBpcyBmdWxsIDMyIGJpdHMgcmVsYXRpdmUgKi8KKworCQkJKmxvYyArPSBnb3QgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfQVJNX1BDMjQ6CisJCWNhc2UgUl9BUk1fUExUMzI6CisJCQlnb3RvIGJiX3VzZV9wbHQ7CisKKwkJY2FzZSBSX0FSTV9HT1RPRkY6IC8qIGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIGdvdCAqLworCQkJKmxvYyArPSB2IC0gZ290OworCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19jcmlzX18pCisKKwkJY2FzZSBSX0NSSVNfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9DUklTXzMyOgorCQkJLyogQ1JJUyBrZWVwcyB0aGUgcmVsb2NhdGlvbiB2YWx1ZSBpbiB0aGUgcl9hZGRlbmQgZmllbGQgYW5kCisJCQkgKiBzaG91bGQgbm90IHVzZSB3aGF0cyBpbiAqbG9jIGF0IGFsbAorCQkJICovCisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKKworCQljYXNlIFJfSDhfRElSMjRSODoKKwkJCWxvYyA9IChFbGZXKEFkZHIpICopKChFbGZXKEFkZHIpKWxvYyAtIDEpOworCQkJKmxvYyA9ICgqbG9jICYgMHhmZjAwMDAwMCkgfCAoKCpsb2MgJiAweGZmZmZmZikgKyB2KTsKKwkJCWJyZWFrOworCQljYXNlIFJfSDhfRElSMjRBODoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfSDhfRElSMzI6CisJCWNhc2UgUl9IOF9ESVIzMkExNjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfSDhfUENSRUwxNjoKKwkJCXYgLT0gZG90ICsgMjsKKwkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2ZmZgorCQkJIHx8IChFbGZXKFN3b3JkKSl2IDwgLShFbGZXKFN3b3JkKSkweDgwMDAKKwkJCSkgeworCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCX0gZWxzZSB7CisJCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHY7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSX0g4X1BDUkVMODoKKwkJCXYgLT0gZG90ICsgMTsKKwkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2YKKwkJCSB8fCAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MAorCQkJKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfSBlbHNlIHsKKwkJCQkqKHVuc2lnbmVkIGNoYXIgKilsb2MgPSB2OworCQkJfQorCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisKKwkJY2FzZSBSXzM4Nl9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM4Nl8zMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfUExUMzI6CisJCWNhc2UgUl8zODZfUEMzMjoKKwkJY2FzZSBSXzM4Nl9HT1RPRkY6CisJCQkqbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X0dMT0JfREFUOgorCQljYXNlIFJfMzg2X0pNUF9TTE9UOgorCQkJKmxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X1JFTEFUSVZFOgorCQkJKmxvYyArPSBmLT5iYXNlYWRkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfR09UUEM6CisJCQkqbG9jICs9IGdvdCAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfR09UMzI6CisJCQlnb3RvIGJiX3VzZV9nb3Q7CisJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKwkJY2FzZSBSX01JQ1JPQkxBWkVfTk9ORToKKwkJY2FzZSBSX01JQ1JPQkxBWkVfNjRfTk9ORToKKwkJY2FzZSBSX01JQ1JPQkxBWkVfMzJfU1lNX09QX1NZTToKKwkJY2FzZSBSX01JQ1JPQkxBWkVfMzJfUENSRUw6CisJCQlicmVhazsKKworCQljYXNlIFJfTUlDUk9CTEFaRV82NF9QQ1JFTDogeworCQkJLyogZG90IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgorCQkJICogdiBpcyB0aGUgdGFyZ2V0IHN5bWJvbCBhZGRyZXNzLgorCQkJICogU28gd2UgbmVlZCB0byBleHRyYWN0IHRoZSBvZmZzZXQgaW4gdGhlIGNvZGUsCisJCQkgKiBhZGRpbmcgdiwgdGhlbiBzdWJ0cmF0aW5nIHRoZSBjdXJyZW50IGFkZHJlc3MKKwkJCSAqIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uCisJCQkgKiBFeDogIklNTSAweEZGRkUgIGJyYWxpZCAweDAwMDAiID0gImJyYWxpZCAweEZGRkUwMDAwIgorCQkJICovCisKKwkJCS8qIEdldCBzcGxpdCBvZmZzZXQgc3RvcmVkIGluIGNvZGUgKi8KKwkJCXVuc2lnbmVkIGludCB0ZW1wID0gKGxvY1swXSAmIDB4RkZGRikgPDwgMTYgfAorCQkJCQkJKGxvY1sxXSAmIDB4RkZGRik7CisKKwkJCS8qIEFkanVzdCByZWxhdGl2ZSBvZmZzZXQuIC00IGFkanVzdG1lbnQgcmVxdWlyZWQKKwkJCSAqIGJlY2F1c2UgZG90IHBvaW50cyB0byB0aGUgSU1NIGluc24sIGJ1dCBicmFuY2gKKwkJCSAqIGlzIGNvbXB1dGVkIHJlbGF0aXZlIHRvIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXRzZWxmLgorCQkJICovCisJCQl0ZW1wICs9IHYgLSBkb3QgLSA0OworCisJCQkvKiBTdG9yZSBiYWNrIGludG8gY29kZSAqLworCQkJbG9jWzBdID0gKGxvY1swXSAmIDB4RkZGRjAwMDApIHwgdGVtcCA+PiAxNjsKKwkJCWxvY1sxXSA9IChsb2NbMV0gJiAweEZGRkYwMDAwKSB8ICh0ZW1wICYgMHhGRkZGKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFJfTUlDUk9CTEFaRV8zMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9NSUNST0JMQVpFXzY0OiB7CisJCQkvKiBHZXQgc3BsaXQgcG9pbnRlciBzdG9yZWQgaW4gY29kZSAqLworCQkJdW5zaWduZWQgaW50IHRlbXAxID0gKGxvY1swXSAmIDB4RkZGRikgPDwgMTYgfAorCQkJCQkJKGxvY1sxXSAmIDB4RkZGRik7CisKKwkJCS8qIEFkZCByZWxvYyBvZmZzZXQgKi8KKwkJCXRlbXAxKz12OworCisJCQkvKiBTdG9yZSBiYWNrIGludG8gY29kZSAqLworCQkJbG9jWzBdID0gKGxvY1swXSAmIDB4RkZGRjAwMDApIHwgdGVtcDEgPj4gMTY7CisJCQlsb2NbMV0gPSAobG9jWzFdICYgMHhGRkZGMDAwMCkgfCAodGVtcDEgJiAweEZGRkYpOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1BDUkVMX0xPOgorCQljYXNlIFJfTUlDUk9CTEFaRV8zMl9MTzoKKwkJY2FzZSBSX01JQ1JPQkxBWkVfU1JPMzI6CisJCWNhc2UgUl9NSUNST0JMQVpFX1NSVzMyOgorCQkJcmV0ID0gb2JqX3JlbG9jX3VuaGFuZGxlZDsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQorCisJCWNhc2UgUl82OEtfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfMzI6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLXzg6CisJCQlpZiAodiA+IDB4ZmYpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKGNoYXIgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzY4S18xNjoKKwkJCWlmICh2ID4gMHhmZmZmKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihzaG9ydCAqKWxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLX1BDODoKKwkJCXYgLT0gZG90OworCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHg3ZgorCQkJIHx8IChFbGZXKFN3b3JkKSl2IDwgLShFbGZXKFN3b3JkKSkweDgwCisJCQkpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKGNoYXIgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzY4S19QQzE2OgorCQkJdiAtPSBkb3Q7CisJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmZmYKKwkJCSB8fCAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MDAwCisJCQkpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKHNob3J0ICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfUEMzMjoKKwkJCSooaW50ICopbG9jID0gdiAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfR0xPQl9EQVQ6CisJCWNhc2UgUl82OEtfSk1QX1NMT1Q6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfUkVMQVRJVkU6CisJCQkqKGludCAqKWxvYyArPSBmLT5iYXNlYWRkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfR09UMzI6CisJCQlnb3RvIGJiX3VzZV9nb3Q7CisKKyMgaWZkZWYgUl82OEtfR09UT0ZGCisJCWNhc2UgUl82OEtfR09UT0ZGOgorCQkJKmxvYyArPSB2IC0gZ290OworCQkJYnJlYWs7CisjIGVuZGlmCisKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisKKwkJY2FzZSBSX01JUFNfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9NSVBTXzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX01JUFNfMjY6CisJCQlpZiAodiAlIDQpCisJCQkJcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKKwkJCWlmICgodiAmIDB4ZjAwMDAwMDApICE9ICgoZG90ICsgNCkgJiAweGYwMDAwMDAwKSkKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQkqbG9jID0KKwkJCQkoKmxvYyAmIH4weDAzZmZmZmZmKSB8ICgoKmxvYyArICh2ID4+IDIpKSAmCisJCQkJCQkJCQkJMHgwM2ZmZmZmZik7CisJCQlicmVhazsKKworCQljYXNlIFJfTUlQU19ISTE2OgorCQkJeworCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm47CisKKwkJCQkvKiBXZSBjYW5ub3QgcmVsb2NhdGUgdGhpcyBvbmUgbm93IGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgdmFsdWUKKwkJCQkgICBvZiB0aGUgY2Fycnkgd2UgbmVlZCB0byBhZGQuICBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2CisJCQkJICAgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KKwkJCQluID0geG1hbGxvYyhzaXplb2YgKm4pOworCQkJCW4tPmFkZHIgPSBsb2M7CisJCQkJbi0+dmFsdWUgPSB2OworCQkJCW4tPm5leHQgPSBpZmlsZS0+bWlwc19oaTE2X2xpc3Q7CisJCQkJaWZpbGUtPm1pcHNfaGkxNl9saXN0ID0gbjsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFJfTUlQU19MTzE2OgorCQkJeworCQkJCXVuc2lnbmVkIGxvbmcgaW5zbmxvID0gKmxvYzsKKwkJCQlFbGZXKEFkZHIpIHZhbCwgdmFsbG87CisKKwkJCQkvKiBTaWduIGV4dGVuZCB0aGUgYWRkZW5kIHdlIGV4dHJhY3QgZnJvbSB0aGUgbG8gaW5zbi4gICovCisJCQkJdmFsbG8gPSAoKGluc25sbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOworCisJCQkJaWYgKGlmaWxlLT5taXBzX2hpMTZfbGlzdCAhPSBOVUxMKSB7CisJCQkJCXN0cnVjdCBtaXBzX2hpMTYgKmw7CisKKwkJCQkJbCA9IGlmaWxlLT5taXBzX2hpMTZfbGlzdDsKKwkJCQkJd2hpbGUgKGwgIT0gTlVMTCkgeworCQkJCQkJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKKwkJCQkJCXVuc2lnbmVkIGxvbmcgaW5zbjsKKworCQkJCQkJLyogRG8gdGhlIEhJMTYgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAorCQkJCQkJICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlCisJCQkJCQkgICB0byBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUgTE8xNi4gICovCisJCQkJCQlpbnNuID0gKmwtPmFkZHI7CisJCQkJCQl2YWwgPQorCQkJCQkJCSgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsKKwkJCQkJCQl2YWxsbzsKKwkJCQkJCXZhbCArPSB2OworCisJCQkJCQkvKiBBY2NvdW50IGZvciB0aGUgc2lnbiBleHRlbnNpb24gdGhhdCB3aWxsIGhhcHBlbiBpbiB0aGUKKwkJCQkJCSAgIGxvdyBiaXRzLiAgKi8KKwkJCQkJCXZhbCA9CisJCQkJCQkJKCh2YWwgPj4gMTYpICsKKwkJCQkJCQkgKCh2YWwgJiAweDgwMDApICE9CisJCQkJCQkJICAwKSkgJiAweGZmZmY7CisKKwkJCQkJCWluc24gPSAoaW5zbiAmIH4weGZmZmYpIHwgdmFsOworCQkJCQkJKmwtPmFkZHIgPSBpbnNuOworCisJCQkJCQluZXh0ID0gbC0+bmV4dDsKKwkJCQkJCWZyZWUobCk7CisJCQkJCQlsID0gbmV4dDsKKwkJCQkJfQorCisJCQkJCWlmaWxlLT5taXBzX2hpMTZfbGlzdCA9IE5VTEw7CisJCQkJfQorCisJCQkJLyogT2ssIHdlJ3JlIGRvbmUgd2l0aCB0aGUgSEkxNiByZWxvY3MuICBOb3cgZGVhbCB3aXRoIHRoZSBMTzE2LiAgKi8KKwkJCQl2YWwgPSB2ICsgdmFsbG87CisJCQkJaW5zbmxvID0gKGluc25sbyAmIH4weGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7CisJCQkJKmxvYyA9IGluc25sbzsKKwkJCQlicmVhazsKKwkJCX0KKworI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCisKKwkJY2FzZSBSX05JT1MyX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfQkZEX1JFTE9DXzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0JGRF9SRUxPQ18xNjoKKwkJCWlmICh2ID4gMHhmZmZmKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihzaG9ydCAqKWxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfQkZEX1JFTE9DXzg6CisJCQlpZiAodiA+IDB4ZmYpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9CisJCQkqKGNoYXIgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX1MxNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmZmYKKwkJCQkgfHwgKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMAorCQkJCSkgeworCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQkJfQorCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwKKwkJCQkgICAgICAgKHdvcmQgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9VMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJaWYgKHYgPiAweGZmZmYpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8CisJCQkJICAgICAgICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfUENSRUwxNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQl2IC09IGRvdCArIDQ7CisJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmCisJCQkJIHx8IChFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDAKKwkJCQkpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8ICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfR1BSRUw6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkLCBncDsKKwkJCQkvKiBnZXQgX2dwICovCisJCQkJZ3AgPSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJfZ3AiKSk7CisJCQkJdiAtPSBncDsKKwkJCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmZmYKKwkJCQkgfHwgKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMAorCQkJCSkgeworCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQkJfQorCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwgKHdvcmQgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9DQUxMMjY6CisJCQlpZiAodiAmIDMpCisJCQkJcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKKwkJCWlmICgodiA+PiAyOCkgIT0gKGRvdCA+PiAyOCkpCisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJKmxvYyA9ICgqbG9jICYgMHgzZikgfCAoKHYgPj4gMikgPDwgNik7CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfSU1NNToKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAodiA+IDB4MWYpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jICYgfjB4N2MwOworCQkJCSpsb2MgPSB3b3JkIHwgKCh2ICYgMHgxZikgPDwgNik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfSU1NNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAodiA+IDB4M2YpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jICYgfjB4ZmMwOworCQkJCSpsb2MgPSB3b3JkIHwgKCh2ICYgMHgzZikgPDwgNik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfSU1NODoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQlpZiAodiA+IDB4ZmYpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZjMDsKKwkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4ZmYpIDw8IDYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0hJMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAoKHYgPj4xNikgJiAweGZmZmYpKSA8PCA2KSB8CisJCQkJICAgICAgICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfTE8xNjoKKwkJCXsKKwkJCQlFbGYzMl9BZGRyIHdvcmQ7CisKKwkJCQl3b3JkID0gKmxvYzsKKwkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfAorCQkJCSAgICAgICAod29yZCAmIDB4M2YpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0hJQURKMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkMSwgd29yZDI7CisKKwkJCQl3b3JkMSA9ICpsb2M7CisJCQkJd29yZDIgPSAoKHYgPj4gMTYpICsgKCh2ID4+IDE1KSAmIDEpKSAmIDB4ZmZmZjsKKwkJCQkqbG9jID0gKCgoKHdvcmQxID4+IDIyKSA8PCAxNikgfCB3b3JkMikgPDwgNikgfAorCQkJCSAgICAgICAod29yZDEgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisJCS8qIFBQQzY0IG5lZWRzIGEgMi42IGtlcm5lbCwgMi40IG1vZHVsZSByZWxvY2F0aW9uIGlycmVsZXZhbnQgKi8KKworI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKworCQljYXNlIFJfUFBDX0FERFIxNl9IQToKKwkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSAodiArIDB4ODAwMCkgPj4gMTY7CisJCQlicmVhazsKKworCQljYXNlIFJfUFBDX0FERFIxNl9ISToKKwkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2ID4+IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1BQQ19BRERSMTZfTE86CisJCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9QUENfUkVMMjQ6CisJCQlnb3RvIGJiX3VzZV9wbHQ7CisKKwkJY2FzZSBSX1BQQ19SRUwzMjoKKwkJCSpsb2MgPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1BQQ19BRERSMzI6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fczM5MF9fKQorCisJCWNhc2UgUl8zOTBfMzI6CisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwXzE2OgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwXzg6CisJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfMzkwX1BDMzI6CisJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gdiAtIGRvdDsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwX1BDMTZEQkw6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSAodiAtIGRvdCkgPj4gMTsKKwkJCWJyZWFrOworCQljYXNlIFJfMzkwX1BDMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9QTFQzMjoKKwkJY2FzZSBSXzM5MF9QTFQxNkRCTDoKKwkJCS8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdC4gICovCisJCQlwZSA9IChzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgKikgJmlzeW0tPnBsdGVudDsKKwkJCWlmIChwZS0+aW5pdGVkID09IDApIHsKKwkJCQlpcCA9ICh1bnNpZ25lZCBsb25nICopKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CisJCQkJaXBbMF0gPSAweDBkMTA1ODEwOyAvKiBiYXNyIDEsMDsgbGcgMSwxMCgxKTsgYnIgMSAqLworCQkJCWlwWzFdID0gMHgxMDA2MDdmMTsKKwkJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMTZEQkwpCisJCQkJCWlwWzJdID0gdiAtIDI7CisJCQkJZWxzZQorCQkJCQlpcFsyXSA9IHY7CisJCQkJcGUtPmluaXRlZCA9IDE7CisJCQl9CisKKwkJCS8qIEluc2VydCByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQuICAqLworCQkJdiA9IHBsdCArIHBlLT5vZmZzZXQgLSBkb3Q7CisJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMzIpCisJCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jID0gKHVuc2lnbmVkIGludCkgdjsKKwkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDE2REJMKQorCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jID0gKHVuc2lnbmVkIHNob3J0KSAoKHYgKyAyKSA+PiAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfR0xPQl9EQVQ6CisJCWNhc2UgUl8zOTBfSk1QX1NMT1Q6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfUkVMQVRJVkU6CisJCQkqbG9jICs9IGYtPmJhc2VhZGRyOworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9HT1RQQzoKKwkJCSoodW5zaWduZWQgbG9uZyAqKSBsb2MgKz0gZ290IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9HT1QxMjoKKwkJY2FzZSBSXzM5MF9HT1QxNjoKKwkJY2FzZSBSXzM5MF9HT1QzMjoKKwkJCWlmICghaXN5bS0+Z290ZW50LmluaXRlZCkKKwkJCXsKKwkJCQlpc3ltLT5nb3RlbnQuaW5pdGVkID0gMTsKKwkJCQkqKEVsZlcoQWRkcikgKikoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CisJCQl9CisJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfR09UMTIpCisJCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgfD0gKCoodW5zaWduZWQgc2hvcnQgKikgbG9jICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgJiAweGZmZjsKKwkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX0dPVDE2KQorCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CisJCQllbHNlIGlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9HT1QzMikKKwkJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKKwkJCWJyZWFrOworCisjIGlmbmRlZiBSXzM5MF9HT1RPRkYzMgorIyAgZGVmaW5lIFJfMzkwX0dPVE9GRjMyIFJfMzkwX0dPVE9GRgorIyBlbmRpZgorCQljYXNlIFJfMzkwX0dPVE9GRjMyOgorCQkJKmxvYyArPSB2IC0gZ290OworCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19zaF9fKQorCisJCWNhc2UgUl9TSF9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX0RJUjMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX1JFTDMyOgorCQkJKmxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX1BMVDMyOgorCQkJKmxvYyA9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfU0hfR0xPQl9EQVQ6CisJCWNhc2UgUl9TSF9KTVBfU0xPVDoKKwkJCSpsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX1JFTEFUSVZFOgorCQkJKmxvYyA9IGYtPmJhc2VhZGRyICsgcmVsLT5yX2FkZGVuZDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9HT1RQQzoKKwkJCSpsb2MgPSBnb3QgLSBkb3QgKyByZWwtPnJfYWRkZW5kOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX0dPVDMyOgorCQkJZ290byBiYl91c2VfZ290OworCisJCWNhc2UgUl9TSF9HT1RPRkY6CisJCQkqbG9jID0gdiAtIGdvdDsKKwkJCWJyZWFrOworCisjIGlmIGRlZmluZWQoX19TSDVfXykKKwkJY2FzZSBSX1NIX0lNTV9NRURMT1cxNjoKKwkJY2FzZSBSX1NIX0lNTV9MT1cxNjoKKwkJCXsKKwkJCQlFbGZXKEFkZHIpIHdvcmQ7CisKKwkJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl9TSF9JTU1fTUVETE9XMTYpCisJCQkJCXYgPj49IDE2OworCisJCQkJLyoKKwkJCQkgKiAgbW92aSBhbmQgc2hvcmkgaGF2ZSB0aGUgZm9ybWF0OgorCQkJCSAqCisJCQkJICogIHwgIG9wICB8IGltbSAgfCByZWcgfCByZXNlcnZlZCB8CisJCQkJICogICAzMS4uMjYgMjUuLjEwIDkuLiA0IDMgICAuLiAgIDAKKwkJCQkgKgorCQkJCSAqIHNvIHdlIHNpbXBseSBtYXNrIGFuZCBvciBpbiBpbW0uCisJCQkJICovCisJCQkJd29yZCA9ICpsb2MgJiB+MHgzZmZmYzAwOworCQkJCXdvcmQgfD0gKHYgJiAweGZmZmYpIDw8IDEwOworCisJCQkJKmxvYyA9IHdvcmQ7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFJfU0hfSU1NX01FRExPVzE2X1BDUkVMOgorCQljYXNlIFJfU0hfSU1NX0xPVzE2X1BDUkVMOgorCQkJeworCQkJCUVsZlcoQWRkcikgd29yZDsKKworCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZmZmMwMDsKKworCQkJCXYgLT0gZG90OworCisJCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfU0hfSU1NX01FRExPVzE2X1BDUkVMKQorCQkJCQl2ID4+PSAxNjsKKworCQkJCXdvcmQgfD0gKHYgJiAweGZmZmYpIDw8IDEwOworCisJCQkJKmxvYyA9IHdvcmQ7CisKKwkJCQlicmVhazsKKwkJCX0KKyMgZW5kaWYgLyogX19TSDVfXyAqLworCisjZWxpZiBkZWZpbmVkKF9fdjg1MGVfXykKKworCQljYXNlIFJfVjg1MF9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX1Y4NTBfMzI6CisJCQkvKiBXZSB3cml0ZSB0d28gc2hvcnRzIGluc3RlYWQgb2YgYSBsb25nIGJlY2F1c2UgZXZlbgorCQkJICAgMzItYml0IGluc25zIG9ubHkgbmVlZCBoYWxmLXdvcmQgYWxpZ25tZW50LCBidXQKKwkJCSAgIDMyLWJpdCBkYXRhIG5lZWRzIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KKwkJCXYgKz0gKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF07CisJCQl2ICs9ICgodW5zaWduZWQgc2hvcnQgKilsb2MpWzFdIDw8IDE2OworCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF0gPSB2ICYgMHhmZmZmOworCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMV0gPSAodiA+PiAxNikgJiAweGZmZmY7CisJCQlicmVhazsKKworCQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKKwkJCWdvdG8gYmJfdXNlX3BsdDsKKworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCisJCWNhc2UgUl9YODZfNjRfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfNjQ6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0XzMyOgorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHY7CisJCQlpZiAodiA+IDB4ZmZmZmZmZmYpCisJCQl7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OyAvKiBLZXJuZWwgbW9kdWxlIGNvbXBpbGVkIHdpdGhvdXQgLW1jbW9kZWw9a2VybmVsLiAqLworCQkJCS8qIGVycm9yKCJQb3NzaWJseSBpcyBtb2R1bGUgY29tcGlsZWQgd2l0aG91dCAtbWNtb2RlbD1rZXJuZWwhIik7ICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0XzMyUzoKKwkJCSooc2lnbmVkIGludCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF84OgorCQkJKih1bnNpZ25lZCBjaGFyICopIGxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9QQzMyOgorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0X1BDMTY6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9QQzg6CisJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0X0dMT0JfREFUOgorCQljYXNlIFJfWDg2XzY0X0pVTVBfU0xPVDoKKwkJCSpsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9SRUxBVElWRToKKwkJCSpsb2MgKz0gZi0+YmFzZWFkZHI7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0X0dPVDMyOgorCQljYXNlIFJfWDg2XzY0X0dPVFBDUkVMOgorCQkJZ290byBiYl91c2VfZ290OworIyBpZiAwCisJCQlpZiAoIWlzeW0tPmdvdGVudC5yZWxvY19kb25lKQorCQkJeworCQkJCWlzeW0tPmdvdGVudC5yZWxvY19kb25lID0gMTsKKwkJCQkqKEVsZjY0X0FkZHIgKikoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CisJCQl9CisJCQkvKiBYWFggYXJlIHRoZXNlIHJlYWxseSBjb3JyZWN0PyAgKi8KKwkJCWlmIChFTEY2NF9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfWDg2XzY0X0dPVFBDUkVMKQorCQkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2ICsgaXN5bS0+Z290ZW50Lm9mZnNldDsKKwkJCWVsc2UKKwkJCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CisJCQlicmVhazsKKyMgZW5kaWYKKworI2Vsc2UKKyMgd2FybmluZyAibm8gaWRlYSBob3cgdG8gaGFuZGxlIHJlbG9jYXRpb25zIG9uIHlvdXIgYXJjaCIKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIldhcm5pbmc6IHVuaGFuZGxlZCByZWxvYyAlZFxuIiwgKGludClFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CisJCQlyZXQgPSBvYmpfcmVsb2NfdW5oYW5kbGVkOworCQkJYnJlYWs7CisKKyNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKworYmJfdXNlX3BsdDoKKworCQkJLyogZmluZCB0aGUgcGx0IGVudHJ5IGFuZCBpbml0aWFsaXplIGl0IGlmIG5lY2Vzc2FyeSAqLworCisjaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCisJCQlmb3IgKHBlID0gaXN5bS0+cGx0ZW50OyBwZSAhPSBOVUxMICYmIHBlLT5hZGRlbmQgIT0gcmVsLT5yX2FkZGVuZDspCisJCQkJcGUgPSBwZS0+bmV4dDsKKyNlbHNlCisJCQlwZSA9ICZpc3ltLT5wbHRlbnQ7CisjZW5kaWYKKworCQkJaWYgKCEgcGUtPmluaXRlZCkgeworCQkJCWlwID0gKHVuc2lnbmVkIGxvbmcgKikgKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CisKKwkJCQkvKiBnZW5lcmF0ZSBzb21lIG1hY2hpbmUgY29kZSAqLworCisjaWYgZGVmaW5lZChfX2FybV9fKQorCQkJCWlwWzBdID0gMHhlNTFmZjAwNDsJCQkvKiBsZHIgcGMsW3BjLCMtNF0gKi8KKwkJCQlpcFsxXSA9IHY7CQkJCS8qIHN5bUAgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCQkJaXBbMF0gPSAweDNkNjAwMDAwICsgKCh2ICsgMHg4MDAwKSA+PiAxNik7ICAvKiBsaXMgcjExLHN5bUBoYSAqLworCQkJCWlwWzFdID0gMHgzOTZiMDAwMCArICh2ICYgMHhmZmZmKTsgICAgICAgICAgLyogYWRkaSByMTEscjExLHN5bUBsICovCisJCQkJaXBbMl0gPSAweDdkNjkwM2E2OwkJCSAgICAgIC8qIG10Y3RyIHIxMSAqLworCQkJCWlwWzNdID0gMHg0ZTgwMDQyMDsJCQkgICAgICAvKiBiY3RyICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fdjg1MGVfXykKKwkJCQkvKiBXZSBoYXZlIHRvIHRyYXNoIGEgcmVnaXN0ZXIsIHNvIHdlIGFzc3VtZSB0aGF0IGFueSBjb250cm9sCisJCQkJICAgdHJhbnNmZXIgbW9yZSB0aGFuIDIxLWJpdHMgYXdheSBtdXN0IGJlIGEgZnVuY3Rpb24gY2FsbAorCQkJCSAgIChzbyB3ZSBjYW4gdXNlIGEgY2FsbC1jbG9iYmVyZWQgcmVnaXN0ZXIpLiAgKi8KKwkJCQlpcFswXSA9IDB4MDYyMSArICgodiAmIDB4ZmZmZikgPDwgMTYpOyAgIC8qIG1vdiBzeW0sIHIxIC4uLiAqLworCQkJCWlwWzFdID0gKCh2ID4+IDE2KSAmIDB4ZmZmZikgKyAweDYxMDAwMDsgLyogLi4uOyBqbXAgcjEgKi8KKyNlbmRpZgorCQkJCXBlLT5pbml0ZWQgPSAxOworCQkJfQorCisJCQkvKiByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQgKi8KKwkJCXYgLT0gZG90OworCQkJLyogaWYgdGhlIHRhcmdldCBpcyB0b28gZmFyIGF3YXkuLi4uICovCisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKQorCQkJaWYgKChpbnQpdiA8IC0weDAyMDAwMDAwIHx8IChpbnQpdiA+PSAweDAyMDAwMDAwKQorI2VsaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHgxZmZmZmYgfHwgKEVsZlcoU3dvcmQpKXYgPCAoRWxmVyhTd29yZCkpLTB4MjAwMDAwKQorI2VuZGlmCisJCQkJCS8qIGdvIHZpYSB0aGUgcGx0ICovCisJCQkJCXYgPSBwbHQgKyBwZS0+b2Zmc2V0IC0gZG90OworCisjaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQlpZiAodiAmIDEpCisjZWxzZQorCQkJCWlmICh2ICYgMykKKyNlbmRpZgorCQkJCQlyZXQgPSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOworCisJCQkvKiBtZXJnZSB0aGUgb2Zmc2V0IGludG8gdGhlIGluc3RydWN0aW9uLiAqLworI2lmIGRlZmluZWQoX19hcm1fXykKKwkJCS8qIENvbnZlcnQgdG8gd29yZHMuICovCisJCQl2ID4+PSAyOworCisJCQkqbG9jID0gKCpsb2MgJiB+MHgwMGZmZmZmZikgfCAoKHYgKyAqbG9jKSAmIDB4MDBmZmZmZmYpOworI2VuZGlmCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKwkJCSpsb2MgPSAoKmxvYyAmIH4weDAzZmZmZmZjKSB8ICh2ICYgMHgwM2ZmZmZmYyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fdjg1MGVfXykKKwkJCS8qIFdlIHdyaXRlIHR3byBzaG9ydHMgaW5zdGVhZCBvZiBhIGxvbmcgYmVjYXVzZSBldmVuIDMyLWJpdCBpbnNucworCQkJICAgb25seSBuZWVkIGhhbGYtd29yZCBhbGlnbm1lbnQsIGJ1dCB0aGUgMzItYml0IGRhdGEgd3JpdGUgbmVlZHMKKwkJCSAgIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KKwkJCSgodW5zaWduZWQgc2hvcnQgKilsb2MpWzBdID0KKwkJCQkoKih1bnNpZ25lZCBzaG9ydCAqKWxvYyAmIDB4ZmZjMCkgLyogb3Bjb2RlICsgcmVnICovCisJCQkJfCAoKHYgPj4gMTYpICYgMHgzZik7ICAgICAgICAgICAgIC8qIG9mZnMgaGlnaCBwYXJ0ICovCisJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA9CisJCQkJKHYgJiAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgLyogb2ZmcyBsb3cgcGFydCAqLworI2VuZGlmCisJCQlicmVhazsKKyNlbmRpZiAvKiBVU0VfUExUX0VOVFJJRVMgKi8KKworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorYmJfdXNlX2dvdDoKKworCQkJLyogbmVlZHMgYW4gZW50cnkgaW4gdGhlIC5nb3Q6IHNldCBpdCwgb25jZSAqLworCQkJaWYgKCFpc3ltLT5nb3RlbnQuaW5pdGVkKSB7CisJCQkJaXN5bS0+Z290ZW50LmluaXRlZCA9IDE7CisJCQkJKihFbGZXKEFkZHIpICopIChpZmlsZS0+Z290LT5jb250ZW50cyArIGlzeW0tPmdvdGVudC5vZmZzZXQpID0gdjsKKwkJCX0KKwkJCS8qIG1ha2UgdGhlIHJlbG9jIHdpdGhfcmVzcGVjdF90b18uZ290ICovCisjaWYgZGVmaW5lZChfX3NoX18pCisJCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQgKyByZWwtPnJfYWRkZW5kOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKQorCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OworI2VuZGlmCisJCQlicmVhazsKKworI2VuZGlmIC8qIFVTRV9HT1RfRU5UUklFUyAqLworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworI2lmIGRlZmluZWQoVVNFX0xJU1QpCisKK3N0YXRpYyBpbnQgYXJjaF9saXN0X2FkZChFbGZXKFJlbE0pICpyZWwsIHN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKipsaXN0LAorCQkJICBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKKworCWZvciAocGUgPSAqbGlzdDsgcGUgIT0gTlVMTDsgcGUgPSBwZS0+bmV4dCkgeworCQlpZiAocGUtPmFkZGVuZCA9PSByZWwtPnJfYWRkZW5kKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwZSA9PSBOVUxMKSB7CisJCXBlID0geHphbGxvYyhzaXplb2Yoc3RydWN0IGFyY2hfbGlzdF9lbnRyeSkpOworCQlwZS0+bmV4dCA9ICpsaXN0OworCQlwZS0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKwkJcGUtPm9mZnNldCA9IG9mZnNldDsKKwkJLypwZS0+aW5pdGVkID0gMDsqLworCQkqbGlzdCA9IHBlOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfU0lOR0xFKQorCitzdGF0aWMgaW50IGFyY2hfc2luZ2xlX2luaXQoLypFbGZXKFJlbE0pICpyZWwsKi8gc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5ICpzaW5nbGUsCisJCWludCBvZmZzZXQsIGludCBzaXplKQoreworCWlmIChzaW5nbGUtPmFsbG9jYXRlZCA9PSAwKSB7CisJCXNpbmdsZS0+YWxsb2NhdGVkID0gMTsKKwkJc2luZ2xlLT5vZmZzZXQgPSBvZmZzZXQ7CisJCXNpbmdsZS0+aW5pdGVkID0gMDsKKwkJcmV0dXJuIHNpemU7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF94c2VjdF9pbml0KHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSwKKwkJaW50IG9mZnNldCwgaW50IHNpemUpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpteXJlbHNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgbmFtZSk7CisKKwlpZiAob2Zmc2V0ID09IDApIHsKKwkJb2Zmc2V0ICs9IHNpemU7CisJfQorCisJaWYgKG15cmVsc2VjKSB7CisJCW9ial9leHRlbmRfc2VjdGlvbihteXJlbHNlYywgb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlteXJlbHNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsIG5hbWUsCisJCQkJc2l6ZSwgb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gbXlyZWxzZWM7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhcmNoX2NyZWF0ZV9nb3Qoc3RydWN0IG9ial9maWxlICpmKQoreworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwlzdHJ1Y3QgYXJjaF9maWxlICppZmlsZSA9IChzdHJ1Y3QgYXJjaF9maWxlICopIGY7CisJaW50IGk7CisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJaW50IGdvdF9vZmZzZXQgPSAwLCBnb3RfbmVlZGVkID0gMCwgZ290X2FsbG9jYXRlOworI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJaW50IHBsdF9vZmZzZXQgPSAwLCBwbHRfbmVlZGVkID0gMCwgcGx0X2FsbG9jYXRlOworI2VuZGlmCisJc3RydWN0IG9ial9zZWN0aW9uICpyZWxzZWMsICpzeW1zZWMsICpzdHJzZWM7CisJRWxmVyhSZWxNKSAqcmVsLCAqcmVsZW5kOworCUVsZlcoU3ltKSAqc3ltdGFiLCAqZXh0c3ltOworCWNvbnN0IGNoYXIgKnN0cnRhYiwgKm5hbWU7CisJc3RydWN0IGFyY2hfc3ltYm9sICppbnRzeW07CisKKwlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkgeworCQlyZWxzZWMgPSBmLT5zZWN0aW9uc1tpXTsKKwkJaWYgKHJlbHNlYy0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX1JFTE0pCisJCQljb250aW51ZTsKKworCQlzeW1zZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9saW5rXTsKKwkJc3Ryc2VjID0gZi0+c2VjdGlvbnNbc3ltc2VjLT5oZWFkZXIuc2hfbGlua107CisKKwkJcmVsID0gKEVsZlcoUmVsTSkgKikgcmVsc2VjLT5jb250ZW50czsKKwkJcmVsZW5kID0gcmVsICsgKHJlbHNlYy0+aGVhZGVyLnNoX3NpemUgLyBzaXplb2YoRWxmVyhSZWxNKSkpOworCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CisJCXN0cnRhYiA9IChjb25zdCBjaGFyICopIHN0cnNlYy0+Y29udGVudHM7CisKKwkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKKwkJCWV4dHN5bSA9ICZzeW10YWJbRUxGX1JfU1lNKHJlbC0+cl9pbmZvKV07CisKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwkJCWdvdF9hbGxvY2F0ZSA9IDA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwkJCXBsdF9hbGxvY2F0ZSA9IDA7CisjZW5kaWYKKworCQkJc3dpdGNoIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSkgeworI2lmIGRlZmluZWQoX19hcm1fXykKKwkJCWNhc2UgUl9BUk1fUEMyNDoKKwkJCWNhc2UgUl9BUk1fUExUMzI6CisJCQkJcGx0X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSX0FSTV9HT1RPRkY6CisJCQljYXNlIFJfQVJNX0dPVFBDOgorCQkJCWdvdF9uZWVkZWQgPSAxOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIFJfQVJNX0dPVDMyOgorCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisJCQljYXNlIFJfMzg2X0dPVFBDOgorCQkJY2FzZSBSXzM4Nl9HT1RPRkY6CisJCQkJZ290X25lZWRlZCA9IDE7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgUl8zODZfR09UMzI6CisJCQkJZ290X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKwkJCWNhc2UgUl9QUENfUkVMMjQ6CisJCQkJcGx0X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX21jNjgwMDBfXykKKwkJCWNhc2UgUl82OEtfR09UMzI6CisJCQkJZ290X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworI2lmZGVmIFJfNjhLX0dPVE9GRgorCQkJY2FzZSBSXzY4S19HT1RPRkY6CisJCQkJZ290X25lZWRlZCA9IDE7CisJCQkJY29udGludWU7CisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChfX3NoX18pCisJCQljYXNlIFJfU0hfR09UMzI6CisJCQkJZ290X2FsbG9jYXRlID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSX1NIX0dPVFBDOgorCQkJY2FzZSBSX1NIX0dPVE9GRjoKKwkJCQlnb3RfbmVlZGVkID0gMTsKKwkJCQljb250aW51ZTsKKworI2VsaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKKwkJCQlwbHRfbmVlZGVkID0gMTsKKwkJCQlicmVhazsKKworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoZXh0c3ltLT5zdF9uYW1lICE9IDApIHsKKwkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOworCQkJfSBlbHNlIHsKKwkJCQluYW1lID0gZi0+c2VjdGlvbnNbZXh0c3ltLT5zdF9zaG5keF0tPm5hbWU7CisJCQl9CisJCQlpbnRzeW0gPSAoc3RydWN0IGFyY2hfc3ltYm9sICopIG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwkJCWlmIChnb3RfYWxsb2NhdGUpIHsKKwkJCQlnb3Rfb2Zmc2V0ICs9IGFyY2hfc2luZ2xlX2luaXQoCisJCQkJCQkvKnJlbCwqLyAmaW50c3ltLT5nb3RlbnQsCisJCQkJCQlnb3Rfb2Zmc2V0LCBHT1RfRU5UUllfU0laRSk7CisKKwkJCQlnb3RfbmVlZGVkID0gMTsKKwkJCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCQkJaWYgKHBsdF9hbGxvY2F0ZSkgeworI2lmIGRlZmluZWQoVVNFX1BMVF9MSVNUKQorCQkJCXBsdF9vZmZzZXQgKz0gYXJjaF9saXN0X2FkZCgKKwkJCQkJCXJlbCwgJmludHN5bS0+cGx0ZW50LAorCQkJCQkJcGx0X29mZnNldCwgUExUX0VOVFJZX1NJWkUpOworI2Vsc2UKKwkJCQlwbHRfb2Zmc2V0ICs9IGFyY2hfc2luZ2xlX2luaXQoCisJCQkJCQkvKnJlbCwqLyAmaW50c3ltLT5wbHRlbnQsCisJCQkJCQlwbHRfb2Zmc2V0LCBQTFRfRU5UUllfU0laRSk7CisjZW5kaWYKKwkJCQlwbHRfbmVlZGVkID0gMTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJaWYgKGdvdF9uZWVkZWQpIHsKKwkJaWZpbGUtPmdvdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLmdvdCIsIGdvdF9vZmZzZXQsCisJCQkJR09UX0VOVFJZX1NJWkUpOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJaWYgKHBsdF9uZWVkZWQpIHsKKwkJaWZpbGUtPnBsdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLnBsdCIsIHBsdF9vZmZzZXQsCisJCQkJUExUX0VOVFJZX1NJWkUpOworCX0KKyNlbmRpZgorCisjZW5kaWYgLyogZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKSAqLworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBTdGFuZGFyZCBFTEYgaGFzaCBmdW5jdGlvbi4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdW5zaWduZWQgbG9uZyBoID0gMDsKKwl1bnNpZ25lZCBsb25nIGc7CisJdW5zaWduZWQgY2hhciBjaDsKKworCXdoaWxlIChuID4gMCkgeworCQljaCA9ICpuYW1lKys7CisJCWggPSAoaCA8PCA0KSArIGNoOworCQlnID0gKGggJiAweGYwMDAwMDAwKTsKKwkJaWYgKGcgIT0gMCkgeworCQkJaCBePSBnID4+IDI0OworCQkJaCAmPSB+ZzsKKwkJfQorCQluLS07CisJfQorCXJldHVybiBoOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBGQVNUX0ZVTkMgb2JqX2VsZl9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIG9ial9lbGZfaGFzaF9uKG5hbWUsIHN0cmxlbihuYW1lKSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworLyogU3RyaW5nIGNvbXBhcmlzb24gZm9yIG5vbi1jby12ZXJzaW9uZWQga2VybmVsIGFuZCBtb2R1bGUuICAqLworCitzdGF0aWMgaW50IG5jdl9zdHJjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwlzaXplX3QgYWxlbiA9IHN0cmxlbihhKSwgYmxlbiA9IHN0cmxlbihiKTsKKworCWlmIChibGVuID09IGFsZW4gKyAxMCAmJiBiW2FsZW5dID09ICdfJyAmJiBiW2FsZW4gKyAxXSA9PSAnUicpCisJCXJldHVybiBzdHJuY21wKGEsIGIsIGFsZW4pOworCWVsc2UgaWYgKGFsZW4gPT0gYmxlbiArIDEwICYmIGFbYmxlbl0gPT0gJ18nICYmIGFbYmxlbiArIDFdID09ICdSJykKKwkJcmV0dXJuIHN0cm5jbXAoYSwgYiwgYmxlbik7CisJZWxzZQorCQlyZXR1cm4gc3RyY21wKGEsIGIpOworfQorCisvKiBTdHJpbmcgaGFzaGluZyBmb3Igbm9uLWNvLXZlcnNpb25lZCBrZXJuZWwgYW5kIG1vZHVsZS4gIEhlcmUKKyAgIHdlIGFyZSBzaW1wbHkgZm9yY2VkIHRvIGRyb3AgdGhlIGNyYyBmcm9tIHRoZSBoYXNoLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgRkFTVF9GVU5DIG5jdl9zeW1ib2xfaGFzaChjb25zdCBjaGFyICpzdHIpCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworCWlmIChsZW4gPiAxMCAmJiBzdHJbbGVuIC0gMTBdID09ICdfJyAmJiBzdHJbbGVuIC0gOV0gPT0gJ1InKQorCQlsZW4gLT0gMTA7CisJcmV0dXJuIG9ial9lbGZfaGFzaF9uKHN0ciwgbGVuKTsKK30KKworc3RhdGljIHZvaWQKK29ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAorCQlpbnQgKCpjbXApIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCisJCXVuc2lnbmVkIGxvbmcgKCpoYXNoKSAoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkMpCit7CisJaWYgKGNtcCkKKwkJZi0+c3ltYm9sX2NtcCA9IGNtcDsKKwlpZiAoaGFzaCkgeworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG1wdGFiW0hBU0hfQlVDS0VUU10sICpzeW0sICpuZXh0OworCQlpbnQgaTsKKworCQlmLT5zeW1ib2xfaGFzaCA9IGhhc2g7CisKKwkJbWVtY3B5KHRtcHRhYiwgZi0+c3ltdGFiLCBzaXplb2YodG1wdGFiKSk7CisJCW1lbXNldChmLT5zeW10YWIsIDAsIHNpemVvZihmLT5zeW10YWIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKKwkJCWZvciAoc3ltID0gdG1wdGFiW2ldOyBzeW07IHN5bSA9IG5leHQpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGggPSBoYXNoKHN5bS0+bmFtZSkgJSBIQVNIX0JVQ0tFVFM7CisJCQkJbmV4dCA9IHN5bS0+bmV4dDsKKwkJCQlzeW0tPm5leHQgPSBmLT5zeW10YWJbaF07CisJCQkJZi0+c3ltdGFiW2hdID0gc3ltOworCQkJfQorCQl9CisJfQorfQorCisjZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLworCitzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgorb2JqX2FkZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lLAorCQl1bnNpZ25lZCBsb25nIHN5bWlkeCwgaW50IGluZm8sCisJCWludCBzZWNpZHgsIEVsZlcoQWRkcikgdmFsdWUsCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGYtPnN5bWJvbF9oYXNoKG5hbWUpICUgSEFTSF9CVUNLRVRTOworCWludCBuX3R5cGUgPSBFTEZfU1RfVFlQRShpbmZvKTsKKwlpbnQgbl9iaW5kaW5nID0gRUxGX1NUX0JJTkQoaW5mbyk7CisKKwlmb3IgKHN5bSA9IGYtPnN5bXRhYltoYXNoXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJaWYgKGYtPnN5bWJvbF9jbXAoc3ltLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpbnQgb19zZWNpZHggPSBzeW0tPnNlY2lkeDsKKwkJCWludCBvX2luZm8gPSBzeW0tPmluZm87CisJCQlpbnQgb190eXBlID0gRUxGX1NUX1RZUEUob19pbmZvKTsKKwkJCWludCBvX2JpbmRpbmcgPSBFTEZfU1RfQklORChvX2luZm8pOworCisJCQkvKiBBIHJlZGVmaW5pdGlvbiEgIElzIGl0IGxlZ2FsPyAgKi8KKworCQkJaWYgKHNlY2lkeCA9PSBTSE5fVU5ERUYpCisJCQkJcmV0dXJuIHN5bTsKKwkJCWVsc2UgaWYgKG9fc2VjaWR4ID09IFNITl9VTkRFRikKKwkJCQlnb3RvIGZvdW5kOworCQkJZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9HTE9CQUwgJiYgb19iaW5kaW5nID09IFNUQl9MT0NBTCkgeworCQkJCS8qIENvcGUgd2l0aCBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZQorCQkJCSAgIGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLCBhcyBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZAorCQkJCSAgIGJ5IGxkIC1yLiAgVGhlIG9ubHkgcmVhc29uIGxvY2FscyBhcmUgbm93IHNlZW4gYXQgdGhpcworCQkJCSAgIGxldmVsIGF0IGFsbCBpcyBzbyB0aGF0IHdlIGNhbiBkbyBzZW1pLXNlbnNpYmxlIHRoaW5ncworCQkJCSAgIHdpdGggcGFyYW1ldGVycy4gICovCisKKwkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqbnN5bSwgKipwOworCisJCQkJbnN5bSA9IGFyY2hfbmV3X3N5bWJvbCgpOworCQkJCW5zeW0tPm5leHQgPSBzeW0tPm5leHQ7CisJCQkJbnN5bS0+a3N5bWlkeCA9IC0xOworCisJCQkJLyogRXhjaXNlIHRoZSBvbGQgKGxvY2FsKSBzeW1ib2wgZnJvbSB0aGUgaGFzaCBjaGFpbi4gICovCisJCQkJZm9yIChwID0gJmYtPnN5bXRhYltoYXNoXTsgKnAgIT0gc3ltOyBwID0gJigqcCktPm5leHQpCisJCQkJCWNvbnRpbnVlOworCQkJCSpwID0gc3ltID0gbnN5bTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfSBlbHNlIGlmIChuX2JpbmRpbmcgPT0gU1RCX0xPQ0FMKSB7CisJCQkJLyogQW5vdGhlciBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuCisJCQkJICAgSnVzdCBhZGQgdGhpcyB0byB0aGUgbG9jYWwgdGFibGUuICAqLworCQkJCXN5bSA9IGFyY2hfbmV3X3N5bWJvbCgpOworCQkJCXN5bS0+bmV4dCA9IE5VTEw7CisJCQkJc3ltLT5rc3ltaWR4ID0gLTE7CisJCQkJZi0+bG9jYWxfc3ltdGFiW3N5bWlkeF0gPSBzeW07CisJCQkJZ290byBmb3VuZDsKKwkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9XRUFLKQorCQkJCXJldHVybiBzeW07CisJCQllbHNlIGlmIChvX2JpbmRpbmcgPT0gU1RCX1dFQUspCisJCQkJZ290byBmb3VuZDsKKwkJCS8qIERvbid0IHVuaWZ5IENPTU1PTiBzeW1ib2xzIHdpdGggb2JqZWN0IHR5cGVzIHRoZSBwcm9ncmFtbWVyCisJCQkgICBkb2Vzbid0IGV4cGVjdC4gICovCisJCQllbHNlIGlmIChzZWNpZHggPT0gU0hOX0NPTU1PTgorCQkJCQkmJiAob190eXBlID09IFNUVF9OT1RZUEUgfHwgb190eXBlID09IFNUVF9PQkpFQ1QpKQorCQkJCXJldHVybiBzeW07CisJCQllbHNlIGlmIChvX3NlY2lkeCA9PSBTSE5fQ09NTU9OCisJCQkJCSYmIChuX3R5cGUgPT0gU1RUX05PVFlQRSB8fCBuX3R5cGUgPT0gU1RUX09CSkVDVCkpCisJCQkJZ290byBmb3VuZDsKKwkJCWVsc2UgeworCQkJCS8qIERvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzIGNvbWluZyBmcm9tCisJCQkJICAgdGhlIGtlcm5lbCBvciBzb21lIGV4dGVybmFsIG1vZHVsZS4gICovCisJCQkJaWYgKHNlY2lkeCA8PSBTSE5fSElSRVNFUlZFKQorCQkJCQliYl9lcnJvcl9tc2coIiVzIG11bHRpcGx5IGRlZmluZWQiLCBuYW1lKTsKKwkJCQlyZXR1cm4gc3ltOworCQkJfQorCQl9CisJfQorCisJLyogQ29tcGxldGVseSBuZXcgc3ltYm9sLiAgKi8KKwlzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKKwlzeW0tPm5leHQgPSBmLT5zeW10YWJbaGFzaF07CisJZi0+c3ltdGFiW2hhc2hdID0gc3ltOworCXN5bS0+a3N5bWlkeCA9IC0xOworCWlmIChFTEZfU1RfQklORChpbmZvKSA9PSBTVEJfTE9DQUwgJiYgc3ltaWR4ICE9ICh1bnNpZ25lZCBsb25nKSgtMSkpIHsKKwkJaWYgKHN5bWlkeCA+PSBmLT5sb2NhbF9zeW10YWJfc2l6ZSkKKwkJCWJiX2Vycm9yX21zZygibG9jYWwgc3ltYm9sICVzIHdpdGggaW5kZXggJWxkIGV4Y2VlZHMgbG9jYWxfc3ltdGFiX3NpemUgJWxkIiwKKwkJCQkJbmFtZSwgKGxvbmcpIHN5bWlkeCwgKGxvbmcpIGYtPmxvY2FsX3N5bXRhYl9zaXplKTsKKwkJZWxzZQorCQkJZi0+bG9jYWxfc3ltdGFiW3N5bWlkeF0gPSBzeW07CisJfQorCitmb3VuZDoKKwlzeW0tPm5hbWUgPSBuYW1lOworCXN5bS0+dmFsdWUgPSB2YWx1ZTsKKwlzeW0tPnNpemUgPSBzaXplOworCXN5bS0+c2VjaWR4ID0gc2VjaWR4OworCXN5bS0+aW5mbyA9IGluZm87CisKKwlyZXR1cm4gc3ltOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgorb2JqX2ZpbmRfc3ltYm9sKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGYtPnN5bWJvbF9oYXNoKG5hbWUpICUgSEFTSF9CVUNLRVRTOworCisJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQorCQlpZiAoZi0+c3ltYm9sX2NtcChzeW0tPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gc3ltOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgRWxmVyhBZGRyKSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKHN0cnVjdCBvYmpfZmlsZSAqIGYsIHN0cnVjdCBvYmpfc3ltYm9sICogc3ltKQoreworCWlmIChzeW0pIHsKKwkJaWYgKHN5bS0+c2VjaWR4ID49IFNITl9MT1JFU0VSVkUpCisJCQlyZXR1cm4gc3ltLT52YWx1ZTsKKwkJcmV0dXJuIHN5bS0+dmFsdWUgKyBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmhlYWRlci5zaF9hZGRyOworCX0KKwkvKiBBcyBhIHNwZWNpYWwgY2FzZSwgYSBOVUxMIHN5bSBoYXMgdmFsdWUgemVyby4gICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9maW5kX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpLCBuID0gZi0+aGVhZGVyLmVfc2hudW07CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQlpZiAoc3RyY21wKGYtPnNlY3Rpb25zW2ldLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIGYtPnNlY3Rpb25zW2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9ial9sb2FkX29yZGVyX3ByaW8oc3RydWN0IG9ial9zZWN0aW9uICphKQoreworCXVuc2lnbmVkIGxvbmcgYWYsIGFjOworCisJYWYgPSBhLT5oZWFkZXIuc2hfZmxhZ3M7CisKKwlhYyA9IDA7CisJaWYgKGEtPm5hbWVbMF0gIT0gJy4nIHx8IHN0cmxlbihhLT5uYW1lKSAhPSAxMAorCSB8fCBzdHJjbXAoYS0+bmFtZSArIDUsICIuaW5pdCIpICE9IDAKKwkpIHsKKwkJYWMgfD0gMzI7CisJfQorCWlmIChhZiAmIFNIRl9BTExPQykKKwkJYWMgfD0gMTY7CisJaWYgKCEoYWYgJiBTSEZfV1JJVEUpKQorCQlhYyB8PSA4OworCWlmIChhZiAmIFNIRl9FWEVDSU5TVFIpCisJCWFjIHw9IDQ7CisJaWYgKGEtPmhlYWRlci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCisJCWFjIHw9IDI7CisKKwlyZXR1cm4gYWM7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqKnA7CisJaW50IHByaW8gPSBvYmpfbG9hZF9vcmRlcl9wcmlvKHNlYyk7CisJZm9yIChwID0gZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7ICpwOyBwID0gJigqcCktPmxvYWRfbmV4dCkKKwkJaWYgKG9ial9sb2FkX29yZGVyX3ByaW8oKnApIDwgcHJpbykKKwkJCWJyZWFrOworCXNlYy0+bG9hZF9uZXh0ID0gKnA7CisJKnAgPSBzZWM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmhlbHBlcl9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBuZXdpZHggPSBmLT5oZWFkZXIuZV9zaG51bSsrOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJZi0+c2VjdGlvbnMgPSB4cmVhbGxvY192ZWN0b3IoZi0+c2VjdGlvbnMsIDIsIG5ld2lkeCk7CisJZi0+c2VjdGlvbnNbbmV3aWR4XSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKKworCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgPSBTSEZfV1JJVEUgfCBTSEZfQUxMT0M7CisJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CisJc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gYWxpZ247CisJc2VjLT5uYW1lID0gbmFtZTsKKwlzZWMtPmlkeCA9IG5ld2lkeDsKKwlpZiAoc2l6ZSkKKwkJc2VjLT5jb250ZW50cyA9IHh6YWxsb2Moc2l6ZSk7CisKKwlyZXR1cm4gc2VjOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCXNlYyA9IGhlbHBlcl9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsIG5hbWUsIGFsaWduLCBzaXplKTsKKwlvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOworCXJldHVybiBzZWM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJc2VjID0gaGVscGVyX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgbmFtZSwgYWxpZ24sIHNpemUpOworCXNlYy0+bG9hZF9uZXh0ID0gZi0+bG9hZF9vcmRlcjsKKwlmLT5sb2FkX29yZGVyID0gc2VjOworCWlmIChmLT5sb2FkX29yZGVyX3NlYXJjaF9zdGFydCA9PSAmZi0+bG9hZF9vcmRlcikKKwkJZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPSAmc2VjLT5sb2FkX25leHQ7CisKKwlyZXR1cm4gc2VjOworfQorCitzdGF0aWMgdm9pZCAqb2JqX2V4dGVuZF9zZWN0aW9uKHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjLCB1bnNpZ25lZCBsb25nIG1vcmUpCit7CisJdW5zaWduZWQgbG9uZyBvbGRzaXplID0gc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwlpZiAobW9yZSkgeworCQlzZWMtPmhlYWRlci5zaF9zaXplICs9IG1vcmU7CisJCXNlYy0+Y29udGVudHMgPSB4cmVhbGxvYyhzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplKTsKKwl9CisJcmV0dXJuIHNlYy0+Y29udGVudHMgKyBvbGRzaXplOworfQorCisKKy8qIENvbmRpdGlvbmFsbHkgYWRkIHRoZSBzeW1ib2xzIGZyb20gdGhlIGdpdmVuIHN5bWJvbCBzZXQgdG8gdGhlCisgICBuZXcgbW9kdWxlLiAgKi8KKworc3RhdGljIGludCBhZGRfc3ltYm9sc19mcm9tKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJaW50IGlkeCwKKwkJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLAorCQlzaXplX3QgbnN5bXMpCit7CisJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzOworCXNpemVfdCBpOworCWludCB1c2VkID0gMDsKKyNpZmRlZiBTWU1CT0xfUFJFRklYCisJY2hhciAqbmFtZV9idWYgPSBOVUxMOworCXNpemVfdCBuYW1lX2FsbG9jZWRfc2l6ZSA9IDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQorCWludCBncGw7CisKKwlncGwgPSBvYmpfZ3BsX2xpY2Vuc2UoZiwgTlVMTCkgPT0gMDsKKyNlbmRpZgorCWZvciAoaSA9IDAsIHMgPSBzeW1zOyBpIDwgbnN5bXM7ICsraSwgKytzKSB7CisJCS8qIE9ubHkgYWRkIHN5bWJvbHMgdGhhdCBhcmUgYWxyZWFkeSBtYXJrZWQgZXh0ZXJuYWwuCisJCSAgIElmIHdlIG92ZXJyaWRlIGxvY2FscyB3ZSBtYXkgY2F1c2UgcHJvYmxlbXMgZm9yCisJCSAgIGFyZ3VtZW50IGluaXRpYWxpemF0aW9uLiAgV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIGZhbHNlCisJCSAgIGRlcGVuZGVuY3kgb24gdGhlIG1vZHVsZS4gICovCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCWNoYXIgKm5hbWU7CisKKwkJLyogR1BMIGxpY2Vuc2VkIG1vZHVsZXMgY2FuIHVzZSBzeW1ib2xzIGV4cG9ydGVkIHdpdGgKKwkJICogRVhQT1JUX1NZTUJPTF9HUEwsIHNvIGlnbm9yZSBhbnkgR1BMT05MWV8gcHJlZml4IG9uIHRoZQorCQkgKiBleHBvcnRlZCBuYW1lcy4gIE5vbi1HUEwgbW9kdWxlcyBuZXZlciBzZWUgYW55IEdQTE9OTFlfCisJCSAqIHN5bWJvbHMgc28gdGhleSBjYW5ub3QgZnVkZ2UgaXQgYnkgYWRkaW5nIHRoZSBwcmVmaXggb24KKwkJICogdGhlaXIgcmVmZXJlbmNlcy4KKwkJICovCisJCWlmIChzdHJuY21wKChjaGFyICopcy0+bmFtZSwgIkdQTE9OTFlfIiwgOCkgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCisJCQlpZiAoZ3BsKQorCQkJCXMtPm5hbWUgKz0gODsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWNvbnRpbnVlOworCQl9CisJCW5hbWUgPSAoY2hhciAqKXMtPm5hbWU7CisKKyNpZmRlZiBTWU1CT0xfUFJFRklYCisJCS8qIFByZXBlbmQgU1lNQk9MX1BSRUZJWCB0byB0aGUgc3ltYm9sJ3MgbmFtZSAodGhlCisJCSAgIGtlcm5lbCBleHBvcnRzIGBDIG5hbWVzJywgYnV0IG1vZHVsZSBvYmplY3QgZmlsZXMKKwkJICAgcmVmZXJlbmNlIGBsaW5rZXIgbmFtZXMnKS4gICovCisJCXNpemVfdCBleHRyYSA9IHNpemVvZiBTWU1CT0xfUFJFRklYOworCQlzaXplX3QgbmFtZV9zaXplID0gc3RybGVuKG5hbWUpICsgZXh0cmE7CisJCWlmIChuYW1lX3NpemUgPiBuYW1lX2FsbG9jZWRfc2l6ZSkgeworCQkJbmFtZV9hbGxvY2VkX3NpemUgPSBuYW1lX3NpemUgKiAyOworCQkJbmFtZV9idWYgPSBhbGxvY2EobmFtZV9hbGxvY2VkX3NpemUpOworCQl9CisJCXN0cmNweShuYW1lX2J1ZiwgU1lNQk9MX1BSRUZJWCk7CisJCXN0cmNweShuYW1lX2J1ZiArIGV4dHJhIC0gMSwgbmFtZSk7CisJCW5hbWUgPSBuYW1lX2J1ZjsKKyNlbmRpZgorCisJCXN5bSA9IG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKKwkJaWYgKHN5bSAmJiAhKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgPT0gU1RCX0xPQ0FMKSkgeworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKwkJCS8qIFB1dCBOQU1FX0JVRiBpbnRvIG1vcmUgcGVybWFuZW50IHN0b3JhZ2UuICAqLworCQkJbmFtZSA9IHhtYWxsb2MobmFtZV9zaXplKTsKKwkJCXN0cmNweShuYW1lLCBuYW1lX2J1Zik7CisjZW5kaWYKKwkJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLAorCQkJCQlFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLAorCQkJCQkJU1RUX05PVFlQRSksCisJCQkJCWlkeCwgcy0+dmFsdWUsIDApOworCQkJLyogRGlkIG91ciBzeW1ib2wganVzdCBnZXQgaW5zdGFsbGVkPyAgSWYgc28sIG1hcmsgdGhlCisJCQkgICBtb2R1bGUgYXMgInVzZWQiLiAgKi8KKwkJCWlmIChzeW0tPnNlY2lkeCA9PSBpZHgpCisJCQkJdXNlZCA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIHZvaWQgYWRkX2tlcm5lbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwlzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptOworCWludCBpLCBudXNlZCA9IDA7CisKKwkvKiBBZGQgbW9kdWxlIHN5bWJvbHMgZmlyc3QuICAqLworCisJZm9yIChpID0gMCwgbSA9IGV4dF9tb2R1bGVzOyBpIDwgbl9leHRfbW9kdWxlczsgKytpLCArK20pIHsKKwkJaWYgKG0tPm5zeW1zCisJCSAmJiBhZGRfc3ltYm9sc19mcm9tKGYsIFNITl9ISVJFU0VSVkUgKyAyICsgaSwgbS0+c3ltcywgbS0+bnN5bXMpCisJCSkgeworCQkJbS0+dXNlZCA9IDE7CisJCQkrK251c2VkOworCQl9CisJfQorCisJbl9leHRfbW9kdWxlc191c2VkID0gbnVzZWQ7CisKKwkvKiBBbmQgZmluYWxseSB0aGUgc3ltYm9scyBmcm9tIHRoZSBrZXJuZWwgcHJvcGVyLiAgKi8KKworCWlmIChua3N5bXMpCisJCWFkZF9zeW1ib2xzX2Zyb20oZiwgU0hOX0hJUkVTRVJWRSArIDEsIGtzeW1zLCBua3N5bXMpOworfQorCitzdGF0aWMgY2hhciAqZ2V0X21vZGluZm9fdmFsdWUoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICprZXkpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJY2hhciAqcCwgKnYsICpuLCAqZXA7CisJc2l6ZV90IGtsZW4gPSBzdHJsZW4oa2V5KTsKKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5tb2RpbmZvIik7CisJaWYgKHNlYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gc2VjLT5jb250ZW50czsKKwllcCA9IHAgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCXdoaWxlIChwIDwgZXApIHsKKwkJdiA9IHN0cmNocihwLCAnPScpOworCQluID0gc3RyY2hyKHAsICdcMCcpOworCQlpZiAodikgeworCQkJaWYgKHAgKyBrbGVuID09IHYgJiYgc3RybmNtcChwLCBrZXksIGtsZW4pID09IDApCisJCQkJcmV0dXJuIHYgKyAxOworCQl9IGVsc2UgeworCQkJaWYgKHAgKyBrbGVuID09IG4gJiYgc3RyY21wKHAsIGtleSkgPT0gMCkKKwkJCQlyZXR1cm4gbjsKKwkJfQorCQlwID0gbiArIDE7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEZ1bmN0aW9ucyByZWxhdGluZyB0byBtb2R1bGUgbG9hZGluZyBhZnRlciAyLjEuMTguICAqLworCisvKiBGcm9tIExpbnV4LTIuNiBzb3VyY2VzICovCisvKiBZb3UgY2FuIHVzZSAiIGFyb3VuZCBzcGFjZXMsIGJ1dCBjYW4ndCBlc2NhcGUgIi4gKi8KKy8qIEh5cGhlbnMgYW5kIHVuZGVyc2NvcmVzIGVxdWl2YWxlbnQgaW4gcGFyYW1ldGVyIG5hbWVzLiAqLworc3RhdGljIGNoYXIgKm5leHRfYXJnKGNoYXIgKmFyZ3MsIGNoYXIgKipwYXJhbSwgY2hhciAqKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgZXF1YWxzID0gMDsKKwlpbnQgaW5fcXVvdGUgPSAwLCBxdW90ZWQgPSAwOworCWNoYXIgKm5leHQ7CisKKwlpZiAoKmFyZ3MgPT0gJyInKSB7CisJCWFyZ3MrKzsKKwkJaW5fcXVvdGUgPSAxOworCQlxdW90ZWQgPSAxOworCX0KKworCWZvciAoaSA9IDA7IGFyZ3NbaV07IGkrKykgeworCQlpZiAoYXJnc1tpXSA9PSAnICcgJiYgIWluX3F1b3RlKQorCQkJYnJlYWs7CisJCWlmIChlcXVhbHMgPT0gMCkgeworCQkJaWYgKGFyZ3NbaV0gPT0gJz0nKQorCQkJCWVxdWFscyA9IGk7CisJCX0KKwkJaWYgKGFyZ3NbaV0gPT0gJyInKQorCQkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7CisJfQorCisJKnBhcmFtID0gYXJnczsKKwlpZiAoIWVxdWFscykKKwkJKnZhbCA9IE5VTEw7CisJZWxzZSB7CisJCWFyZ3NbZXF1YWxzXSA9ICdcMCc7CisJCSp2YWwgPSBhcmdzICsgZXF1YWxzICsgMTsKKworCQkvKiBEb24ndCBpbmNsdWRlIHF1b3RlcyBpbiB2YWx1ZS4gKi8KKwkJaWYgKCoqdmFsID09ICciJykgeworCQkJKCp2YWwpKys7CisJCQlpZiAoYXJnc1tpLTFdID09ICciJykKKwkJCQlhcmdzW2ktMV0gPSAnXDAnOworCQl9CisJCWlmIChxdW90ZWQgJiYgYXJnc1tpLTFdID09ICciJykKKwkJCWFyZ3NbaS0xXSA9ICdcMCc7CisJfQorCisJaWYgKGFyZ3NbaV0pIHsKKwkJYXJnc1tpXSA9ICdcMCc7CisJCW5leHQgPSBhcmdzICsgaSArIDE7CisJfSBlbHNlCisJCW5leHQgPSBhcmdzICsgaTsKKworCS8qIENoZXcgdXAgdHJhaWxpbmcgc3BhY2VzLiAqLworCXJldHVybiBza2lwX3doaXRlc3BhY2UobmV4dCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp4b3B0aW9ucywgKnBvczsKKwljaGFyICpwYXJhbSwgKnZhbDsKKworCXhvcHRpb25zID0gcG9zID0geHN0cmR1cChza2lwX3doaXRlc3BhY2Uob3B0aW9ucykpOworCXdoaWxlICgqcG9zKSB7CisJCXVuc2lnbmVkIGxvbmcgY2hhcnNzaXplID0gMDsKKwkJY2hhciAqdG1wLCAqY29udGVudHMsICpsb2MsICpwaW5mbywgKnA7CisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCWludCBtaW4sIG1heCwgbiwgbGVuOworCisJCXBvcyA9IG5leHRfYXJnKHBvcywgJnBhcmFtLCAmdmFsKTsKKworCQl0bXAgPSB4YXNwcmludGYoInBhcm1fJXMiLCBwYXJhbSk7CisJCXBpbmZvID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgdG1wKTsKKwkJZnJlZSh0bXApOworCQlpZiAocGluZm8gPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHBhcmFtZXRlciAlcyIsIHBhcmFtKTsKKworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKwkJdG1wID0geGFzcHJpbnRmKFNZTUJPTF9QUkVGSVggIiVzIiwgcGFyYW0pOworCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgdG1wKTsKKwkJZnJlZSh0bXApOworI2Vsc2UKKwkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIHBhcmFtKTsKKyNlbmRpZgorCisJCS8qIEFsc28gY2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVyIHdhcyBub3QgcmVzb2x2ZWQgZnJvbSB0aGUga2VybmVsLiAgKi8KKwkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW1ib2wgZm9yIHBhcmFtZXRlciAlcyBub3QgZm91bmQiLCBwYXJhbSk7CisKKwkJLyogTnVtYmVyIG9mIHBhcmFtZXRlcnMgKi8KKwkJbWluID0gbWF4ID0gMTsKKwkJaWYgKGlzZGlnaXQoKnBpbmZvKSkgeworCQkJbWluID0gbWF4ID0gc3RydG91bChwaW5mbywgJnBpbmZvLCAxMCk7CisJCQlpZiAoKnBpbmZvID09ICctJykKKwkJCQltYXggPSBzdHJ0b3VsKHBpbmZvICsgMSwgJnBpbmZvLCAxMCk7CisJCX0KKworCQljb250ZW50cyA9IGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XS0+Y29udGVudHM7CisJCWxvYyA9IGNvbnRlbnRzICsgc3ltLT52YWx1ZTsKKworCQlpZiAoKnBpbmZvID09ICdjJykgeworCQkJaWYgKCFpc2RpZ2l0KHBpbmZvWzFdKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYXJhbWV0ZXIgdHlwZSAnYycgZm9yICVzIG11c3QgYmUgZm9sbG93ZWQgYnkiCisJCQkJCQkgICAgICIgdGhlIG1heGltdW0gc2l6ZSIsIHBhcmFtKTsKKwkJCX0KKwkJCWNoYXJzc2l6ZSA9IHN0cnRvdWwocGluZm8gKyAxLCBOVUxMLCAxMCk7CisJCX0KKworCQlpZiAodmFsID09IE5VTEwpIHsKKwkJCWlmICgqcGluZm8gIT0gJ2InKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJhcmd1bWVudCBleHBlY3RlZCBmb3IgcGFyYW1ldGVyICVzIiwgcGFyYW0pOworCQkJdmFsID0gKGNoYXIgKikgIjEiOworCQl9CisKKwkJLyogUGFyc2UgcGFyYW1ldGVyIHZhbHVlcyAqLworCQluID0gMDsKKwkJcCA9IHZhbDsKKwkJd2hpbGUgKCpwKSB7CisJCQljaGFyIHN2X2NoOworCQkJY2hhciAqZW5kcDsKKworCQkJaWYgKCsrbiA+IG1heCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgdmFsdWVzIGZvciAlcyAobWF4ICVkKSIsIHBhcmFtLCBtYXgpOworCisJCQlzd2l0Y2ggKCpwaW5mbykgeworCQkJY2FzZSAncyc6CisJCQkJbGVuID0gc3RyY3NwbihwLCAiLCIpOworCQkJCXN2X2NoID0gcFtsZW5dOworCQkJCXBbbGVuXSA9ICdcMCc7CisJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwKKwkJCQkJCSBsb2MgLSBjb250ZW50cywgcCk7CisJCQkJbG9jICs9IHRndF9zaXplb2ZfY2hhcl9wOworCQkJCXAgKz0gbGVuOworCQkJCSpwID0gc3ZfY2g7CisJCQkJYnJlYWs7CisJCQljYXNlICdjJzoKKwkJCQlsZW4gPSBzdHJjc3BuKHAsICIsIik7CisJCQkJc3ZfY2ggPSBwW2xlbl07CisJCQkJcFtsZW5dID0gJ1wwJzsKKwkJCQlpZiAobGVuID49IGNoYXJzc2l6ZSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0cmluZyB0b28gbG9uZyBmb3IgJXMgKG1heCAlbGQpIiwgcGFyYW0sCisJCQkJCQkJICAgICBjaGFyc3NpemUgLSAxKTsKKwkJCQlzdHJjcHkoKGNoYXIgKikgbG9jLCBwKTsKKwkJCQlsb2MgKz0gY2hhcnNzaXplOworCQkJCXAgKz0gbGVuOworCQkJCSpwID0gc3ZfY2g7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQkqbG9jKysgPSBzdHJ0b3VsKHAsICZlbmRwLCAwKTsKKwkJCQlwID0gZW5kcDsgLyogZ2NjIGxpa2VzIHRlbXAgdmFyIGZvciAmZW5kcCAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnaCc6CisJCQkJKihzaG9ydCAqKSBsb2MgPSBzdHJ0b3VsKHAsICZlbmRwLCAwKTsKKwkJCQlsb2MgKz0gdGd0X3NpemVvZl9zaG9ydDsKKwkJCQlwID0gZW5kcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knOgorCQkJCSooaW50ICopIGxvYyA9IHN0cnRvdWwocCwgJmVuZHAsIDApOworCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2ludDsKKwkJCQlwID0gZW5kcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCSoobG9uZyAqKSBsb2MgPSBzdHJ0b3VsKHAsICZlbmRwLCAwKTsKKwkJCQlsb2MgKz0gdGd0X3NpemVvZl9sb25nOworCQkJCXAgPSBlbmRwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBwYXJhbWV0ZXIgdHlwZSAnJWMnIGZvciAlcyIsCisJCQkJCQkgICAgICpwaW5mbywgcGFyYW0pOworCQkJfQorCisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOworCQkJaWYgKCpwICE9ICcsJykKKwkJCQlicmVhazsKKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCArIDEpOworCQl9CisKKwkJaWYgKG4gPCBtaW4pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFyYW1ldGVyICVzIHJlcXVpcmVzIGF0IGxlYXN0ICVkIGFyZ3VtZW50cyIsIHBhcmFtLCBtaW4pOworCQlpZiAoKnAgIT0gJ1wwJykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyZ3VtZW50IHN5bnRheCBmb3IgJXMiLCBwYXJhbSk7CisJfQorCisJZnJlZSh4b3B0aW9ucyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworc3RhdGljIGludCBuZXdfaXNfbW9kdWxlX2NoZWNrc3VtbWVkKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwljb25zdCBjaGFyICpwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgInVzaW5nX2NoZWNrc3VtcyIpOworCWlmIChwKQorCQlyZXR1cm4geGF0b2kocCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgbW9kdWxlJ3Mga2VybmVsIHZlcnNpb24gaW4gdGhlIGNhbm9uaWNhbCBpbnRlZ2VyIGZvcm0uICAqLworCitzdGF0aWMgaW50CituZXdfZ2V0X21vZHVsZV92ZXJzaW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciBzdHJbU1RSVkVSU0lPTkxFTl0pCit7CisJY2hhciAqcCwgKnE7CisJaW50IGEsIGIsIGM7CisKKwlwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgImtlcm5lbF92ZXJzaW9uIik7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXNhZmVfc3RybmNweShzdHIsIHAsIFNUUlZFUlNJT05MRU4pOworCisJYSA9IHN0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAoKnAgIT0gJy4nKQorCQlyZXR1cm4gLTE7CisJYiA9IHN0cnRvdWwocCArIDEsICZwLCAxMCk7CisJaWYgKCpwICE9ICcuJykKKwkJcmV0dXJuIC0xOworCWMgPSBzdHJ0b3VsKHAgKyAxLCAmcSwgMTApOworCWlmIChwICsgMSA9PSBxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYSA8PCAxNiB8IGIgPDwgOCB8IGM7Cit9CisKKyNlbmRpZiAgIC8qIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KKworCisvKiBGZXRjaCB0aGUgbG9hZGVkIG1vZHVsZXMsIGFuZCBhbGwgY3VycmVudGx5IGV4cG9ydGVkIHN5bWJvbHMuICAqLworCitzdGF0aWMgdm9pZCBuZXdfZ2V0X2tlcm5lbF9zeW1ib2xzKHZvaWQpCit7CisJY2hhciAqbW9kdWxlX25hbWVzLCAqbW47CisJc3RydWN0IGV4dGVybmFsX21vZHVsZSAqbW9kdWxlcywgKm07CisJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLCAqczsKKwlzaXplX3QgcmV0LCBidWZzaXplLCBubW9kLCBuc3ltcywgaSwgajsKKworCS8qIENvbGxlY3QgdGhlIGxvYWRlZCBtb2R1bGVzLiAgKi8KKworCWJ1ZnNpemUgPSAyNTY7CisJbW9kdWxlX25hbWVzID0geG1hbGxvYyhidWZzaXplKTsKKworIHJldHJ5X21vZHVsZXNfbG9hZDoKKwlpZiAocXVlcnlfbW9kdWxlKE5VTEwsIFFNX01PRFVMRVMsIG1vZHVsZV9uYW1lcywgYnVmc2l6ZSwgJnJldCkpIHsKKwkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CisJCQlidWZzaXplID0gcmV0OworCQkJbW9kdWxlX25hbWVzID0geHJlYWxsb2MobW9kdWxlX25hbWVzLCBidWZzaXplKTsKKwkJCWdvdG8gcmV0cnlfbW9kdWxlc19sb2FkOworCQl9CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiUU1fTU9EVUxFUyIpOworCX0KKworCW5fZXh0X21vZHVsZXMgPSBubW9kID0gcmV0OworCisJLyogQ29sbGVjdCB0aGUgbW9kdWxlcycgc3ltYm9scy4gICovCisKKwlpZiAobm1vZCkgeworCQlleHRfbW9kdWxlcyA9IG1vZHVsZXMgPSB4emFsbG9jKG5tb2QgKiBzaXplb2YoKm1vZHVsZXMpKTsKKwkJZm9yIChpID0gMCwgbW4gPSBtb2R1bGVfbmFtZXMsIG0gPSBtb2R1bGVzOworCQkJCWkgPCBubW9kOyArK2ksICsrbSwgbW4gKz0gc3RybGVuKG1uKSArIDEpIHsKKwkJCXN0cnVjdCBuZXdfbW9kdWxlX2luZm8gaW5mbzsKKworCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fSU5GTywgJmluZm8sIHNpemVvZihpbmZvKSwgJnJldCkpIHsKKwkJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQkJCS8qIFRoZSBtb2R1bGUgd2FzIHJlbW92ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cy4gICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInF1ZXJ5X21vZHVsZTogUU1fSU5GTzogJXMiLCBtbik7CisJCQl9CisKKwkJCWJ1ZnNpemUgPSAxMDI0OworCQkJc3ltcyA9IHhtYWxsb2MoYnVmc2l6ZSk7CisgcmV0cnlfbW9kX3N5bV9sb2FkOgorCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fU1lNQk9MUywgc3ltcywgYnVmc2l6ZSwgJnJldCkpIHsKKwkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJCWNhc2UgRU5PU1BDOgorCQkJCQkJYnVmc2l6ZSA9IHJldDsKKwkJCQkJCXN5bXMgPSB4cmVhbGxvYyhzeW1zLCBidWZzaXplKTsKKwkJCQkJCWdvdG8gcmV0cnlfbW9kX3N5bV9sb2FkOworCQkJCQljYXNlIEVOT0VOVDoKKwkJCQkJCS8qIFRoZSBtb2R1bGUgd2FzIHJlbW92ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cy4gICovCisJCQkJCQljb250aW51ZTsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicXVlcnlfbW9kdWxlOiBRTV9TWU1CT0xTOiAlcyIsIG1uKTsKKwkJCQl9CisJCQl9CisJCQluc3ltcyA9IHJldDsKKworCQkJbS0+bmFtZSA9IG1uOworCQkJbS0+YWRkciA9IGluZm8uYWRkcjsKKwkJCW0tPm5zeW1zID0gbnN5bXM7CisJCQltLT5zeW1zID0gc3ltczsKKworCQkJZm9yIChqID0gMCwgcyA9IHN5bXM7IGogPCBuc3ltczsgKytqLCArK3MpIHsKKwkJCQlzLT5uYW1lICs9ICh1bnNpZ25lZCBsb25nKSBzeW1zOworCQkJfQorCQl9CisJfQorCisJLyogQ29sbGVjdCB0aGUga2VybmVsJ3Mgc3ltYm9scy4gICovCisKKwlidWZzaXplID0gMTYgKiAxMDI0OworCXN5bXMgPSB4bWFsbG9jKGJ1ZnNpemUpOworIHJldHJ5X2tlcm5fc3ltX2xvYWQ6CisJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCBRTV9TWU1CT0xTLCBzeW1zLCBidWZzaXplLCAmcmV0KSkgeworCQlpZiAoZXJybm8gPT0gRU5PU1BDICYmIGJ1ZnNpemUgPCByZXQpIHsKKwkJCWJ1ZnNpemUgPSByZXQ7CisJCQlzeW1zID0geHJlYWxsb2Moc3ltcywgYnVmc2l6ZSk7CisJCQlnb3RvIHJldHJ5X2tlcm5fc3ltX2xvYWQ7CisJCX0KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJrZXJuZWw6IFFNX1NZTUJPTFMiKTsKKwl9CisJbmtzeW1zID0gbnN5bXMgPSByZXQ7CisJa3N5bXMgPSBzeW1zOworCisJZm9yIChqID0gMCwgcyA9IHN5bXM7IGogPCBuc3ltczsgKytqLCArK3MpIHsKKwkJcy0+bmFtZSArPSAodW5zaWduZWQgbG9uZykgc3ltczsKKwl9Cit9CisKKworLyogUmV0dXJuIHRoZSBrZXJuZWwgc3ltYm9sIGNoZWNrc3VtIHZlcnNpb24sIG9yIHplcm8gaWYgbm90IHVzZWQuICAqLworCitzdGF0aWMgaW50IG5ld19pc19rZXJuZWxfY2hlY2tzdW1tZWQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnM7CisJc2l6ZV90IGk7CisKKwkvKiBVc2luZ19WZXJzaW9ucyBpcyBub3QgdGhlIGZpcnN0IHN5bWJvbCwgYnV0IGl0IHNob3VsZCBiZSBpbiB0aGVyZS4gICovCisKKwlmb3IgKGkgPSAwLCBzID0ga3N5bXM7IGkgPCBua3N5bXM7ICsraSwgKytzKQorCQlpZiAoc3RyY21wKChjaGFyICopIHMtPm5hbWUsICJVc2luZ19WZXJzaW9ucyIpID09IDApCisJCQlyZXR1cm4gcy0+dmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBuZXdfY3JlYXRlX3RoaXNfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbV9uYW1lKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QoZiwgIi50aGlzIiwgdGd0X3NpemVvZl9sb25nLAorCQkJc2l6ZW9mKHN0cnVjdCBuZXdfbW9kdWxlKSk7CisJLyogZG9uZSBieSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdDogKi8KKwkvKm1lbXNldChzZWMtPmNvbnRlbnRzLCAwLCBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsqLworCisJb2JqX2FkZF9zeW1ib2woZiwgU1BGWCAiX190aGlzX21vZHVsZSIsIC0xLAorCQkJRUxGX1NUX0lORk8oU1RCX0xPQ0FMLCBTVFRfT0JKRUNUKSwgc2VjLT5pZHgsIDAsCisJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKKworCW9ial9zdHJpbmdfcGF0Y2goZiwgc2VjLT5pZHgsIG9mZnNldG9mKHN0cnVjdCBuZXdfbW9kdWxlLCBuYW1lKSwKKwkJCW1fbmFtZSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUworLyogYWRkIGFuIGVudHJ5IHRvIHRoZSBfX2tzeW10YWIgc2VjdGlvbiwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5ICovCitzdGF0aWMgdm9pZCBuZXdfYWRkX2tzeW10YWIoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCUVsZlcoQWRkcikgb2ZzOworCisJLyogZW5zdXJlIF9fa3N5bXRhYiBpcyBhbGxvY2F0ZWQsIEVYUE9SVF9OT1NZTUJPTFMgY3JlYXRlcyBhIG5vbi1hbGxvYyBzZWN0aW9uLgorCSAqIElmIF9fa3N5bXRhYiBpcyBkZWZpbmVkIGJ1dCBub3QgbWFya2VkIGFsbG9jLCB4IG91dCB0aGUgZmlyc3QgY2hhcmFjdGVyCisJICogKG5vIG9ial9kZWxldGUgcm91dGluZSkgYW5kIGNyZWF0ZSBhIG5ldyBfX2tzeW10YWIgd2l0aCB0aGUgY29ycmVjdAorCSAqIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKKwlpZiAoc2VjICYmICEoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKSB7CisJCSooKGNoYXIgKikoc2VjLT5uYW1lKSkgPSAneCc7CS8qIG92ZXJyaWRlIGNvbnN0ICovCisJCXNlYyA9IE5VTEw7CisJfQorCWlmICghc2VjKQorCQlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwKKwkJCQl0Z3Rfc2l6ZW9mX3ZvaWRfcCwgMCk7CisJaWYgKCFzZWMpCisJCXJldHVybjsKKwlzZWMtPmhlYWRlci5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CisJLyogRW1wdHkgc2VjdGlvbiBtaWdodCBiZSBieXRlLWFsaWduZWQgKi8KKwlzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSB0Z3Rfc2l6ZW9mX3ZvaWRfcDsKKwlvZnMgPSBzZWMtPmhlYWRlci5zaF9zaXplOworCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKKwlvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwgc3ltLT5uYW1lKTsKKwlvYmpfZXh0ZW5kX3NlY3Rpb24oc2VjLCAyICogdGd0X3NpemVvZl9jaGFyX3ApOworfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgKi8KKworc3RhdGljIGludCBuZXdfY3JlYXRlX21vZHVsZV9rc3ltdGFiKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKwlpbnQgaTsKKworCS8qIFdlIG11c3QgYWx3YXlzIGFkZCB0aGUgbW9kdWxlIHJlZmVyZW5jZXMuICAqLworCisJaWYgKG5fZXh0X21vZHVsZXNfdXNlZCkgeworCQlzdHJ1Y3QgbmV3X21vZHVsZV9yZWYgKmRlcDsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnRtOworCisJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua21vZHRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLAorCQkJCShzaXplb2Yoc3RydWN0IG5ld19tb2R1bGVfcmVmKQorCQkJCSAqIG5fZXh0X21vZHVsZXNfdXNlZCkpOworCQlpZiAoIXNlYykKKwkJCXJldHVybiAwOworCisJCXRtID0gb2JqX2ZpbmRfc3ltYm9sKGYsIFNQRlggIl9fdGhpc19tb2R1bGUiKTsKKwkJZGVwID0gKHN0cnVjdCBuZXdfbW9kdWxlX3JlZiAqKSBzZWMtPmNvbnRlbnRzOworCQlmb3IgKGkgPSAwOyBpIDwgbl9leHRfbW9kdWxlczsgKytpKQorCQkJaWYgKGV4dF9tb2R1bGVzW2ldLnVzZWQpIHsKKwkJCQlkZXAtPmRlcCA9IGV4dF9tb2R1bGVzW2ldLmFkZHI7CisJCQkJb2JqX3N5bWJvbF9wYXRjaChmLCBzZWMtPmlkeCwKKwkJCQkJCShjaGFyICopICZkZXAtPnJlZiAtIHNlYy0+Y29udGVudHMsIHRtKTsKKwkJCQlkZXAtPm5leHRfcmVmID0gMDsKKwkJCQkrK2RlcDsKKwkJCX0KKwl9CisKKwlpZiAoIWZsYWdfbm9leHBvcnQgJiYgIW9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpKSB7CisJCXNpemVfdCBuc3ltczsKKwkJaW50ICpsb2FkZWQ7CisKKwkJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLCAwKTsKKworCQkvKiBXZSBkb24ndCB3YW50IHRvIGV4cG9ydCBzeW1ib2xzIHJlc2lkaW5nIGluIHNlY3Rpb25zIHRoYXQKKwkJICAgYXJlbid0IGxvYWRlZC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGVzZSBjcmVhdGVkIHNvIHRoYXQKKwkJICAgd2UgbWFrZSBzdXJlIGNlcnRhaW4gbW9kdWxlIG9wdGlvbnMgZG9uJ3QgYXBwZWFyIHR3aWNlLiAgKi8KKwkJaSA9IGYtPmhlYWRlci5lX3NobnVtOworCQlsb2FkZWQgPSBhbGxvY2Eoc2l6ZW9mKGludCkgKiBpKTsKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkJbG9hZGVkW2ldID0gKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDA7CisKKwkJZm9yIChuc3ltcyA9IGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKKwkJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSAhPSBTVEJfTE9DQUwKKwkJCQkgJiYgc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRQorCQkJCSAmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKQorCQkJCSkgeworCQkJCQlFbGZXKEFkZHIpIG9mcyA9IG5zeW1zICogMiAqIHRndF9zaXplb2Zfdm9pZF9wOworCisJCQkJCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKKwkJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzZWMtPmlkeCwgb2ZzICsgdGd0X3NpemVvZl92b2lkX3AsCisJCQkJCQkJc3ltLT5uYW1lKTsKKwkJCQkJbnN5bXMrKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlvYmpfZXh0ZW5kX3NlY3Rpb24oc2VjLCBuc3ltcyAqIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAorbmV3X2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm1fbmFtZSwgc3RydWN0IG9ial9maWxlICpmLCB1bnNpZ25lZCBsb25nIG1fc2l6ZSkKK3sKKwlzdHJ1Y3QgbmV3X21vZHVsZSAqbW9kdWxlOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCXZvaWQgKmltYWdlOworCWludCByZXQ7CisJdGd0X2xvbmcgbV9hZGRyOworCisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLnRoaXMiKTsKKwlpZiAoIXNlYyB8fCAhc2VjLT5jb250ZW50cykgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHQgbW9kdWxlICVzPyIsIG1fbmFtZSk7CisJfQorCW1vZHVsZSA9IChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBzZWMtPmNvbnRlbnRzOworCW1fYWRkciA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CisKKwltb2R1bGUtPnNpemVfb2Zfc3RydWN0ID0gc2l6ZW9mKCptb2R1bGUpOworCW1vZHVsZS0+c2l6ZSA9IG1fc2l6ZTsKKwltb2R1bGUtPmZsYWdzID0gZmxhZ19hdXRvY2xlYW4gPyBORVdfTU9EX0FVVE9DTEVBTiA6IDA7CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKKwlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKKwkJbW9kdWxlLT5zeW1zID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5uc3ltcyA9IHNlYy0+aGVhZGVyLnNoX3NpemUgLyAoMiAqIHRndF9zaXplb2ZfY2hhcl9wKTsKKwl9CisKKwlpZiAobl9leHRfbW9kdWxlc191c2VkKSB7CisJCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rbW9kdGFiIik7CisJCW1vZHVsZS0+ZGVwcyA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CisJCW1vZHVsZS0+bmRlcHMgPSBuX2V4dF9tb2R1bGVzX3VzZWQ7CisJfQorCisJbW9kdWxlLT5pbml0ID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiaW5pdF9tb2R1bGUiKSk7CisJbW9kdWxlLT5jbGVhbnVwID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiY2xlYW51cF9tb2R1bGUiKSk7CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2V4X3RhYmxlIik7CisJaWYgKHNlYykgeworCQltb2R1bGUtPmV4X3RhYmxlX3N0YXJ0ID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5leF90YWJsZV9lbmQgPSBzZWMtPmhlYWRlci5zaF9hZGRyICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwl9CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIudGV4dC5pbml0Iik7CisJaWYgKHNlYykgeworCQltb2R1bGUtPnJ1bnNpemUgPSBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyOworCX0KKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIuZGF0YS5pbml0Iik7CisJaWYgKHNlYykgeworCQlpZiAoIW1vZHVsZS0+cnVuc2l6ZQorCQkgfHwgbW9kdWxlLT5ydW5zaXplID4gc2VjLT5oZWFkZXIuc2hfYWRkciAtIG1fYWRkcgorCQkpIHsKKwkJCW1vZHVsZS0+cnVuc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHI7CisJCX0KKwl9CisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBBUkNIREFUQV9TRUNfTkFNRSk7CisJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CisJCW1vZHVsZS0+YXJjaGRhdGFfc3RhcnQgPSAodm9pZCopc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5hcmNoZGF0YV9lbmQgPSBtb2R1bGUtPmFyY2hkYXRhX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwl9CisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBLQUxMU1lNU19TRUNfTkFNRSk7CisJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CisJCW1vZHVsZS0+a2FsbHN5bXNfc3RhcnQgPSAodm9pZCopc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5rYWxsc3ltc19lbmQgPSBtb2R1bGUtPmthbGxzeW1zX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwl9CisKKwkvKiBXaGV3ISAgQWxsIG9mIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4gIENvbGxlY3QgdGhlIGZpbmFsCisJICAgbW9kdWxlIGltYWdlIGFuZCBnaXZlIGl0IHRvIHRoZSBrZXJuZWwuICAqLworCisJaW1hZ2UgPSB4bWFsbG9jKG1fc2l6ZSk7CisJb2JqX2NyZWF0ZV9pbWFnZShmLCBpbWFnZSk7CisKKwlyZXQgPSBpbml0X21vZHVsZShtX25hbWUsIChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBpbWFnZSk7CisJaWYgKHJldCkKKwkJYmJfcGVycm9yX21zZygiaW5pdF9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKKworCWZyZWUoaW1hZ2UpOworCisJcmV0dXJuIHJldCA9PSAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkCitvYmpfc3RyaW5nX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCisJCQkJIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqcDsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKKwlzaXplX3QgbGVuID0gc3RybGVuKHN0cmluZykgKyAxOworCWNoYXIgKmxvYzsKKworCXAgPSB4emFsbG9jKHNpemVvZigqcCkpOworCXAtPm5leHQgPSBmLT5zdHJpbmdfcGF0Y2hlczsKKwlwLT5yZWxvY19zZWNpZHggPSBzZWNpZHg7CisJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OworCWYtPnN0cmluZ19wYXRjaGVzID0gcDsKKworCXN0cnNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rc3RydGFiIik7CisJaWYgKHN0cnNlYyA9PSBOVUxMKSB7CisJCXN0cnNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua3N0cnRhYiIsIDEsIGxlbik7CisJCS8qcC0+c3RyaW5nX29mZnNldCA9IDA7Ki8KKwkJbG9jID0gc3Ryc2VjLT5jb250ZW50czsKKwl9IGVsc2UgeworCQlwLT5zdHJpbmdfb2Zmc2V0ID0gc3Ryc2VjLT5oZWFkZXIuc2hfc2l6ZTsKKwkJbG9jID0gb2JqX2V4dGVuZF9zZWN0aW9uKHN0cnNlYywgbGVuKTsKKwl9CisJbWVtY3B5KGxvYywgc3RyaW5nLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAorCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKQoreworCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOworCisJcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSk7CisJcC0+bmV4dCA9IGYtPnN5bWJvbF9wYXRjaGVzOworCXAtPnJlbG9jX3NlY2lkeCA9IHNlY2lkeDsKKwlwLT5yZWxvY19vZmZzZXQgPSBvZmZzZXQ7CisJcC0+c3ltID0gc3ltOworCWYtPnN5bWJvbF9wYXRjaGVzID0gcDsKK30KKworc3RhdGljIHZvaWQgb2JqX2NoZWNrX3VuZGVmaW5lZHMoc3RydWN0IG9ial9maWxlICpmKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSB7CisJCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX1VOREVGKSB7CisJCQkJaWYgKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgPT0gU1RCX1dFQUspIHsKKwkJCQkJc3ltLT5zZWNpZHggPSBTSE5fQUJTOworCQkJCQlzeW0tPnZhbHVlID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWZsYWdfcXVpZXQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5yZXNvbHZlZCBzeW1ib2wgJXMiLCBzeW0tPm5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgb2JqX2FsbG9jYXRlX2NvbW1vbnMoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0cnVjdCBjb21tb25fZW50cnkgeworCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpuZXh0OworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCX0gKmNvbW1vbl9oZWFkID0gTlVMTDsKKworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fQ09NTU9OKSB7CisJCQkJLyogQ29sbGVjdCBhbGwgQ09NTU9OIHN5bWJvbHMgYW5kIHNvcnQgdGhlbSBieSBzaXplIHNvIGFzIHRvCisJCQkJICAgbWluaW1pemUgc3BhY2Ugd2FzdGVkIGJ5IGFsaWdubWVudCByZXF1aXJlbWVudHMuICAqLworCQkJCXN0cnVjdCBjb21tb25fZW50cnkgKipwLCAqbjsKKwkJCQlmb3IgKHAgPSAmY29tbW9uX2hlYWQ7ICpwOyBwID0gJigqcCktPm5leHQpCisJCQkJCWlmIChzeW0tPnNpemUgPD0gKCpwKS0+c3ltLT5zaXplKQorCQkJCQkJYnJlYWs7CisJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKKwkJCQluLT5uZXh0ID0gKnA7CisJCQkJbi0+c3ltID0gc3ltOworCQkJCSpwID0gbjsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDE7IGkgPCBmLT5sb2NhbF9zeW10YWJfc2l6ZTsgKytpKSB7CisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0gPSBmLT5sb2NhbF9zeW10YWJbaV07CisJCWlmIChzeW0gJiYgc3ltLT5zZWNpZHggPT0gU0hOX0NPTU1PTikgeworCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOworCQkJZm9yIChwID0gJmNvbW1vbl9oZWFkOyAqcDsgcCA9ICYoKnApLT5uZXh0KSB7CisJCQkJaWYgKHN5bSA9PSAoKnApLT5zeW0pCisJCQkJCWJyZWFrOworCQkJCWlmIChzeW0tPnNpemUgPCAoKnApLT5zeW0tPnNpemUpIHsKKwkJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKKwkJCQkJbi0+bmV4dCA9ICpwOworCQkJCQluLT5zeW0gPSBzeW07CisJCQkJCSpwID0gbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGNvbW1vbl9oZWFkKSB7CisJCS8qIEZpbmQgdGhlIGJzcyBzZWN0aW9uLiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpCisJCQlpZiAoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF90eXBlID09IFNIVF9OT0JJVFMpCisJCQkJYnJlYWs7CisKKwkJLyogSWYgZm9yIHNvbWUgcmVhc29uIHRoZXJlIGhhZG4ndCBiZWVuIG9uZSwgY3JlYXRlIG9uZS4gICovCisJCWlmIChpID09IGYtPmhlYWRlci5lX3NobnVtKSB7CisJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCQkJZi0+aGVhZGVyLmVfc2hudW0rKzsKKwkJCWYtPnNlY3Rpb25zID0geHJlYWxsb2NfdmVjdG9yKGYtPnNlY3Rpb25zLCAyLCBpKTsKKwkJCWYtPnNlY3Rpb25zW2ldID0gc2VjID0gYXJjaF9uZXdfc2VjdGlvbigpOworCisJCQlzZWMtPmhlYWRlci5zaF90eXBlID0gU0hUX1BST0dCSVRTOworCQkJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgPSBTSEZfV1JJVEUgfCBTSEZfQUxMT0M7CisJCQlzZWMtPm5hbWUgPSAiLmJzcyI7CisJCQlzZWMtPmlkeCA9IGk7CisJCX0KKworCQkvKiBBbGxvY2F0ZSB0aGUgQ09NTU9OUy4gICovCisJCXsKKwkJCUVsZlcoQWRkcikgYnNzX3NpemUgPSBmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3NpemU7CisJCQlFbGZXKEFkZHIpIG1heF9hbGlnbiA9IGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduOworCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqYzsKKworCQkJZm9yIChjID0gY29tbW9uX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CisJCQkJRWxmVyhBZGRyKSBhbGlnbiA9IGMtPnN5bS0+dmFsdWU7CisKKwkJCQlpZiAoYWxpZ24gPiBtYXhfYWxpZ24pCisJCQkJCW1heF9hbGlnbiA9IGFsaWduOworCQkJCWlmIChic3Nfc2l6ZSAmIChhbGlnbiAtIDEpKQorCQkJCQlic3Nfc2l6ZSA9IChic3Nfc2l6ZSB8IChhbGlnbiAtIDEpKSArIDE7CisKKwkJCQljLT5zeW0tPnNlY2lkeCA9IGk7CisJCQkJYy0+c3ltLT52YWx1ZSA9IGJzc19zaXplOworCisJCQkJYnNzX3NpemUgKz0gYy0+c3ltLT5zaXplOworCQkJfQorCisJCQlmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3NpemUgPSBic3Nfc2l6ZTsKKwkJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gbWF4X2FsaWduOworCQl9CisJfQorCisJLyogRm9yIHRoZSBzYWtlIG9mIHBhdGNoIHJlbG9jYXRpb24gYW5kIHBhcmFtZXRlciBpbml0aWFsaXphdGlvbiwKKwkgICBhbGxvY2F0ZSB6ZXJvZWQgZGF0YSBmb3IgTk9CSVRTIHNlY3Rpb25zIG5vdy4gIE5vdGUgdGhhdCBhZnRlcgorCSAgIHRoaXMgd2UgY2Fubm90IGFzc3VtZSBOT0JJVFMgYXJlIHJlYWxseSBlbXB0eS4gICovCisJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzID0gZi0+c2VjdGlvbnNbaV07CisJCWlmIChzLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKSB7CisJCQlzLT5jb250ZW50cyA9IE5VTEw7CisJCQlpZiAocy0+aGVhZGVyLnNoX3NpemUgIT0gMCkKKwkJCQlzLT5jb250ZW50cyA9IHh6YWxsb2Mocy0+aGVhZGVyLnNoX3NpemUpOworCQkJcy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9sb2FkX3NpemUoc3RydWN0IG9ial9maWxlICpmKQoreworCXVuc2lnbmVkIGxvbmcgZG90ID0gMDsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCS8qIEZpbmFsaXplIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb25zIHJlbGF0aXZlIHRvIG9uZSBhbm90aGVyLiAgKi8KKworCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgeworCQlFbGZXKEFkZHIpIGFsaWduOworCisJCWFsaWduID0gc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduOworCQlpZiAoYWxpZ24gJiYgKGRvdCAmIChhbGlnbiAtIDEpKSkKKwkJCWRvdCA9IChkb3QgfCAoYWxpZ24gLSAxKSkgKyAxOworCisJCXNlYy0+aGVhZGVyLnNoX2FkZHIgPSBkb3Q7CisJCWRvdCArPSBzZWMtPmhlYWRlci5zaF9zaXplOworCX0KKworCXJldHVybiBkb3Q7Cit9CisKK3N0YXRpYyBpbnQgb2JqX3JlbG9jYXRlKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKQoreworCWludCBpLCBuID0gZi0+aGVhZGVyLmVfc2hudW07CisJaW50IHJldCA9IDE7CisKKwkvKiBGaW5hbGl6ZSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucy4gICovCisKKwlmLT5iYXNlYWRkciA9IGJhc2U7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyICs9IGJhc2U7CisKKwkvKiBBbmQgaXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgcmVsb2NhdGlvbnMuICAqLworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnJlbHNlYywgKnN5bXNlYywgKnRhcmdzZWMsICpzdHJzZWM7CisJCUVsZlcoUmVsTSkgKiByZWwsICpyZWxlbmQ7CisJCUVsZlcoU3ltKSAqIHN5bXRhYjsKKwkJY29uc3QgY2hhciAqc3RydGFiOworCisJCXJlbHNlYyA9IGYtPnNlY3Rpb25zW2ldOworCQlpZiAocmVsc2VjLT5oZWFkZXIuc2hfdHlwZSAhPSBTSFRfUkVMTSkKKwkJCWNvbnRpbnVlOworCisJCXN5bXNlYyA9IGYtPnNlY3Rpb25zW3JlbHNlYy0+aGVhZGVyLnNoX2xpbmtdOworCQl0YXJnc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfaW5mb107CisJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOworCisJCXJlbCA9IChFbGZXKFJlbE0pICopIHJlbHNlYy0+Y29udGVudHM7CisJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKKwkJc3ltdGFiID0gKEVsZlcoU3ltKSAqKSBzeW1zZWMtPmNvbnRlbnRzOworCQlzdHJ0YWIgPSAoY29uc3QgY2hhciAqKSBzdHJzZWMtPmNvbnRlbnRzOworCisJCWZvciAoOyByZWwgPCByZWxlbmQ7ICsrcmVsKSB7CisJCQlFbGZXKEFkZHIpIHZhbHVlID0gMDsKKwkJCXN0cnVjdCBvYmpfc3ltYm9sICppbnRzeW0gPSBOVUxMOworCQkJdW5zaWduZWQgbG9uZyBzeW1uZHg7CisJCQlFbGZXKFN5bSkgKmV4dHN5bSA9IE5VTEw7CisJCQljb25zdCBjaGFyICplcnJtc2c7CisKKwkJCS8qIEF0dGVtcHQgdG8gZmluZCBhIHZhbHVlIHRvIHVzZSBmb3IgdGhpcyByZWxvY2F0aW9uLiAgKi8KKworCQkJc3ltbmR4ID0gRUxGX1JfU1lNKHJlbC0+cl9pbmZvKTsKKwkJCWlmIChzeW1uZHgpIHsKKwkJCQkvKiBOb3RlIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLworCisJCQkJZXh0c3ltID0gJnN5bXRhYltzeW1uZHhdOworCQkJCWlmIChFTEZfU1RfQklORChleHRzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkgeworCQkJCQkvKiBMb2NhbCBzeW1ib2xzIHdlIGxvb2sgdXAgaW4gdGhlIGxvY2FsIHRhYmxlIHRvIGJlIHN1cmUKKwkJCQkJICAgd2UgZ2V0IHRoZSBvbmUgdGhhdCBpcyByZWFsbHkgaW50ZW5kZWQuICAqLworCQkJCQlpbnRzeW0gPSBmLT5sb2NhbF9zeW10YWJbc3ltbmR4XTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBPdGhlcnMgd2UgbG9vayB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCisJCQkJCWNvbnN0IGNoYXIgKm5hbWU7CisJCQkJCWlmIChleHRzeW0tPnN0X25hbWUpCisJCQkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOworCQkJCQllbHNlCisJCQkJCQluYW1lID0gZi0+c2VjdGlvbnNbZXh0c3ltLT5zdF9zaG5keF0tPm5hbWU7CisJCQkJCWludHN5bSA9IG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKKwkJCQl9CisKKwkJCQl2YWx1ZSA9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgaW50c3ltKTsKKwkJCQlpbnRzeW0tPnJlZmVyZW5jZWQgPSAxOworCQkJfQorI2lmIFNIVF9SRUxNID09IFNIVF9SRUxBCisjaWYgZGVmaW5lZChfX2FscGhhX18pICYmIGRlZmluZWQoQVhQX0JST0tFTl9HQVMpCisJCQkvKiBXb3JrIGFyb3VuZCBhIG5hc3R5IEdBUyBidWcsIHRoYXQgaXMgZml4ZWQgYXMgb2YgMi43LjAuOS4gICovCisJCQlpZiAoIWV4dHN5bSB8fCAhZXh0c3ltLT5zdF9uYW1lCisJCQkgfHwgRUxGX1NUX0JJTkQoZXh0c3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisjZW5kaWYKKwkJCQl2YWx1ZSArPSByZWwtPnJfYWRkZW5kOworI2VuZGlmCisKKwkJCS8qIERvIGl0ISAqLworCQkJc3dpdGNoIChhcmNoX2FwcGx5X3JlbG9jYXRpb24KKwkJCQkJKGYsIHRhcmdzZWMsIC8qc3ltc2VjLCovIGludHN5bSwgcmVsLCB2YWx1ZSkKKwkJCSkgeworCQkJY2FzZSBvYmpfcmVsb2Nfb2s6CisJCQkJYnJlYWs7CisKKwkJCWNhc2Ugb2JqX3JlbG9jX292ZXJmbG93OgorCQkJCWVycm1zZyA9ICJSZWxvY2F0aW9uIG92ZXJmbG93IjsKKwkJCQlnb3RvIGJhZF9yZWxvYzsKKwkJCWNhc2Ugb2JqX3JlbG9jX2Rhbmdlcm91czoKKwkJCQllcnJtc2cgPSAiRGFuZ2Vyb3VzIHJlbG9jYXRpb24iOworCQkJCWdvdG8gYmFkX3JlbG9jOworCQkJY2FzZSBvYmpfcmVsb2NfdW5oYW5kbGVkOgorCQkJCWVycm1zZyA9ICJVbmhhbmRsZWQgcmVsb2NhdGlvbiI7CitiYWRfcmVsb2M6CisJCQkJaWYgKGV4dHN5bSkgeworCQkJCQliYl9lcnJvcl9tc2coIiVzIG9mIHR5cGUgJWxkIGZvciAlcyIsIGVycm1zZywKKwkJCQkJCQkobG9uZykgRUxGX1JfVFlQRShyZWwtPnJfaW5mbyksCisJCQkJCQkJc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQliYl9lcnJvcl9tc2coIiVzIG9mIHR5cGUgJWxkIiwgZXJybXNnLAorCQkJCQkJCShsb25nKSBFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CisJCQkJfQorCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBGaW5hbGx5LCB0YWtlIGNhcmUgb2YgdGhlIHBhdGNoZXMuICAqLworCisJaWYgKGYtPnN0cmluZ19wYXRjaGVzKSB7CisJCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKKwkJRWxmVyhBZGRyKSBzdHJzZWNfYmFzZTsKKwkJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKKwkJc3Ryc2VjX2Jhc2UgPSBzdHJzZWMtPmhlYWRlci5zaF9hZGRyOworCisJCWZvciAocCA9IGYtPnN0cmluZ19wYXRjaGVzOyBwOyBwID0gcC0+bmV4dCkgeworCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjID0gZi0+c2VjdGlvbnNbcC0+cmVsb2Nfc2VjaWR4XTsKKwkJCSooRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyBwLT5yZWxvY19vZmZzZXQpCisJCQkJPSBzdHJzZWNfYmFzZSArIHAtPnN0cmluZ19vZmZzZXQ7CisJCX0KKwl9CisKKwlpZiAoZi0+c3ltYm9sX3BhdGNoZXMpIHsKKwkJc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggKnA7CisKKwkJZm9yIChwID0gZi0+c3ltYm9sX3BhdGNoZXM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMgPSBmLT5zZWN0aW9uc1twLT5yZWxvY19zZWNpZHhdOworCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKKwkJCQk9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgcC0+c3ltKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2JqX2NyZWF0ZV9pbWFnZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKmltYWdlKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCUVsZlcoQWRkcikgYmFzZSA9IGYtPmJhc2VhZGRyOworCisJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CisJCWNoYXIgKnNlY2ltZzsKKworCQlpZiAoc2VjLT5jb250ZW50cyA9PSAwIHx8IHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXNlY2ltZyA9IGltYWdlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKKworCQkvKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGVkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBlYXJsaWVyLiAgKi8KKwkJbWVtY3B5KHNlY2ltZywgc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKGNoYXIgKmltYWdlLCBzaXplX3QgaW1hZ2Vfc2l6ZSwgaW50IGxvYWRwcm9nYml0cykKK3sKKwl0eXBlZGVmIHVpbnQzMl90IGFsaWFzZWRfdWludDMyX3QgRklYX0FMSUFTSU5HOworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEVMRk1BR19VMzIgKCh1aW50MzJfdCkoRUxGTUFHMCArIDB4MTAwICogKEVMRk1BRzEgKyAoMHgxMDAgKiAoRUxGTUFHMiArIDB4MTAwICogRUxGTUFHMykpKSkpCisjZWxzZQorIyBkZWZpbmUgRUxGTUFHX1UzMiAoKHVpbnQzMl90KSgoKChFTEZNQUcwICogMHgxMDApICsgRUxGTUFHMSkgKiAweDEwMCArIEVMRk1BRzIpICogMHgxMDAgKyBFTEZNQUczKSkKKyNlbmRpZgorCXN0cnVjdCBvYmpfZmlsZSAqZjsKKwlFbGZXKFNoZHIpICogc2VjdGlvbl9oZWFkZXJzOworCXNpemVfdCBzaG51bSwgaTsKKwljaGFyICpzaHN0cnRhYjsKKworCS8qIFJlYWQgdGhlIGZpbGUgaGVhZGVyLiAgKi8KKworCWYgPSBhcmNoX25ld19maWxlKCk7CisJZi0+c3ltYm9sX2NtcCA9IHN0cmNtcDsKKwlmLT5zeW1ib2xfaGFzaCA9IG9ial9lbGZfaGFzaDsKKwlmLT5sb2FkX29yZGVyX3NlYXJjaF9zdGFydCA9ICZmLT5sb2FkX29yZGVyOworCisJaWYgKGltYWdlX3NpemUgPCBzaXplb2YoZi0+aGVhZGVyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIHdoaWxlIGxvYWRpbmcgRUxGIGhlYWRlciIpOworCW1lbWNweSgmZi0+aGVhZGVyLCBpbWFnZSwgc2l6ZW9mKGYtPmhlYWRlcikpOworCisJaWYgKCooYWxpYXNlZF91aW50MzJfdCopKCZmLT5oZWFkZXIuZV9pZGVudCkgIT0gRUxGTUFHX1UzMikgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGFuIEVMRiBmaWxlIik7CisJfQorCWlmIChmLT5oZWFkZXIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1NNCisJIHx8IGYtPmhlYWRlci5lX2lkZW50W0VJX0RBVEFdICE9IChCQl9CSUdfRU5ESUFOID8gRUxGREFUQTJNU0IgOiBFTEZEQVRBMkxTQikKKwkgfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gRVZfQ1VSUkVOVAorCSB8fCAhTUFUQ0hfTUFDSElORShmLT5oZWFkZXIuZV9tYWNoaW5lKQorCSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiRUxGIGZpbGUgbm90IGZvciB0aGlzIGFyY2hpdGVjdHVyZSIpOworCX0KKwlpZiAoZi0+aGVhZGVyLmVfdHlwZSAhPSBFVF9SRUwpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkVMRiBmaWxlIG5vdCBhIHJlbG9jYXRhYmxlIG9iamVjdCIpOworCX0KKworCS8qIFJlYWQgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCisKKwlpZiAoZi0+aGVhZGVyLmVfc2hlbnRzaXplICE9IHNpemVvZihFbGZXKFNoZHIpKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VjdGlvbiBoZWFkZXIgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGYtPmhlYWRlci5lX3NoZW50c2l6ZSwKKwkJCQkodW5zaWduZWQgbG9uZykgc2l6ZW9mKEVsZlcoU2hkcikpKTsKKwl9CisKKwlzaG51bSA9IGYtPmhlYWRlci5lX3NobnVtOworCS8qIEdyb3d0aCBvZiAtPnNlY3Rpb25zIHZlY3RvciB3aWxsIGJlIGRvbmUgYnkKKwkgKiB4cmVhbGxvY192ZWN0b3IoLi4uLCAyLCAuLi4pLCB0aGVyZWZvcmUgd2UgbXVzdCBhbGxvY2F0ZQorCSAqIGF0IGxlYXN0IDJeMiA9IDQgZXh0cmEgZWxlbWVudHMgaGVyZS4gKi8KKwlmLT5zZWN0aW9ucyA9IHh6YWxsb2Moc2l6ZW9mKGYtPnNlY3Rpb25zWzBdKSAqIChzaG51bSArIDQpKTsKKworCXNlY3Rpb25faGVhZGVycyA9IGFsbG9jYShzaXplb2YoRWxmVyhTaGRyKSkgKiBzaG51bSk7CisJaWYgKGltYWdlX3NpemUgPCBmLT5oZWFkZXIuZV9zaG9mZiArIHNpemVvZihFbGZXKFNoZHIpKSAqIHNobnVtKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgbG9hZGluZyBzZWN0aW9uIGhlYWRlcnMiKTsKKwltZW1jcHkoc2VjdGlvbl9oZWFkZXJzLCBpbWFnZSArIGYtPmhlYWRlci5lX3Nob2ZmLCBzaXplb2YoRWxmVyhTaGRyKSkgKiBzaG51bSk7CisKKwkvKiBSZWFkIHRoZSBzZWN0aW9uIGRhdGEuICAqLworCisJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisKKwkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CisKKwkJc2VjLT5oZWFkZXIgPSBzZWN0aW9uX2hlYWRlcnNbaV07CisJCXNlYy0+aWR4ID0gaTsKKworCQlpZiAoc2VjLT5oZWFkZXIuc2hfc2l6ZSkgeworCQkJc3dpdGNoIChzZWMtPmhlYWRlci5zaF90eXBlKSB7CisJCQljYXNlIFNIVF9OVUxMOgorCQkJY2FzZSBTSFRfTk9URToKKwkJCWNhc2UgU0hUX05PQklUUzoKKwkJCQkvKiBpZ25vcmUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgU0hUX1BST0dCSVRTOgorI2lmIExPQURCSVRTCisJCQkJaWYgKCFsb2FkcHJvZ2JpdHMpIHsKKwkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJY2FzZSBTSFRfU1lNVEFCOgorCQkJY2FzZSBTSFRfU1RSVEFCOgorCQkJY2FzZSBTSFRfUkVMTToKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorCQkJY2FzZSBTSFRfTUlQU19EV0FSRjoKKyNlbmRpZgorCQkJCXNlYy0+Y29udGVudHMgPSBOVUxMOworCQkJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplID4gMCkgeworCQkJCQlzZWMtPmNvbnRlbnRzID0geG1hbGxvYyhzZWMtPmhlYWRlci5zaF9zaXplKTsKKwkJCQkJaWYgKGltYWdlX3NpemUgPCAoc2VjLT5oZWFkZXIuc2hfb2Zmc2V0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZSkpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgbG9hZGluZyBzZWN0aW9uIGRhdGEiKTsKKwkJCQkJbWVtY3B5KHNlYy0+Y29udGVudHMsIGltYWdlICsgc2VjLT5oZWFkZXIuc2hfb2Zmc2V0LCBzZWMtPmhlYWRlci5zaF9zaXplKTsKKwkJCQl9CisJCQkJYnJlYWs7CisjaWYgU0hUX1JFTE0gPT0gU0hUX1JFTAorCQkJY2FzZSBTSFRfUkVMQToKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiUkVMQSByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIik7CisjZWxzZQorCQkJY2FzZSBTSFRfUkVMOgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJSRUwgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIpOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCWlmIChzZWMtPmhlYWRlci5zaF90eXBlID49IFNIVF9MT1BST0MpIHsKKwkJCQkJLyogQXNzdW1lIHByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzIGFyZSBkZWJ1ZworCQkJCQkgICBpbmZvIGFuZCBjYW4gc2FmZWx5IGJlIGlnbm9yZWQuICBJZiB0aGlzIGlzIGV2ZXIgbm90CisJCQkJCSAgIHRoZSBjYXNlIChIZWxsbyBNSVBTPyksIGRvbid0IHB1dCBpZmRlZnMgaGVyZSBidXQKKwkJCQkJICAgY3JlYXRlIGFuIGFyY2hfbG9hZF9wcm9jX3NlY3Rpb24oKS4gICovCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBoYW5kbGUgc2VjdGlvbnMgb2YgdHlwZSAlbGQiLAorCQkJCQkJKGxvbmcpIHNlYy0+aGVhZGVyLnNoX3R5cGUpOworCQkJfQorCQl9CisJfQorCisJLyogRG8gd2hhdCBzb3J0IG9mIGludGVycHJldGF0aW9uIGFzIG5lZWRlZCBieSBlYWNoIHNlY3Rpb24uICAqLworCisJc2hzdHJ0YWIgPSBmLT5zZWN0aW9uc1tmLT5oZWFkZXIuZV9zaHN0cm5keF0tPmNvbnRlbnRzOworCisJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKKwkJc2VjLT5uYW1lID0gc2hzdHJ0YWIgKyBzZWMtPmhlYWRlci5zaF9uYW1lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjID0gZi0+c2VjdGlvbnNbaV07CisKKwkJLyogLm1vZGluZm8gc2hvdWxkIGJlIGNvbnRlbnRzIG9ubHkgYnV0IGdjYyBoYXMgbm8gYXR0cmlidXRlIGZvciB0aGF0LgorCQkgKiBUaGUga2VybmVsIG1heSBoYXZlIG1hcmtlZCAubW9kaW5mbyBhcyBBTExPQywgaWdub3JlIHRoaXMgYml0LgorCQkgKi8KKwkJaWYgKHN0cmNtcChzZWMtPm5hbWUsICIubW9kaW5mbyIpID09IDApCisJCQlzZWMtPmhlYWRlci5zaF9mbGFncyAmPSB+U0hGX0FMTE9DOworCisJCWlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykKKwkJCW9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKGYsIHNlYyk7CisKKwkJc3dpdGNoIChzZWMtPmhlYWRlci5zaF90eXBlKSB7CisJCWNhc2UgU0hUX1NZTVRBQjoKKwkJCXsKKwkJCQl1bnNpZ25lZCBsb25nIG5zeW0sIGo7CisJCQkJY2hhciAqc3RydGFiOworCQkJCUVsZlcoU3ltKSAqIHN5bTsKKworCQkJCWlmIChzZWMtPmhlYWRlci5zaF9lbnRzaXplICE9IHNpemVvZihFbGZXKFN5bSkpKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW1ib2wgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNlYy0+aGVhZGVyLnNoX2VudHNpemUsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFN5bSkpKTsKKwkJCQl9CisKKwkJCQluc3ltID0gc2VjLT5oZWFkZXIuc2hfc2l6ZSAvIHNpemVvZihFbGZXKFN5bSkpOworCQkJCXN0cnRhYiA9IGYtPnNlY3Rpb25zW3NlYy0+aGVhZGVyLnNoX2xpbmtdLT5jb250ZW50czsKKwkJCQlzeW0gPSAoRWxmVyhTeW0pICopIHNlYy0+Y29udGVudHM7CisKKwkJCQkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSB0YWJsZSBvZiBsb2NhbCBzeW1ib2xzLiAgKi8KKwkJCQlqID0gZi0+bG9jYWxfc3ltdGFiX3NpemUgPSBzZWMtPmhlYWRlci5zaF9pbmZvOworCQkJCWYtPmxvY2FsX3N5bXRhYiA9IHh6YWxsb2MoaiAqIHNpemVvZihzdHJ1Y3Qgb2JqX3N5bWJvbCAqKSk7CisKKwkJCQkvKiBJbnNlcnQgYWxsIHN5bWJvbHMgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCisJCQkJZm9yIChqID0gMSwgKytzeW07IGogPCBuc3ltOyArK2osICsrc3ltKSB7CisJCQkJCUVsZlcoQWRkcikgdmFsID0gc3ltLT5zdF92YWx1ZTsKKwkJCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCQkJaWYgKHN5bS0+c3RfbmFtZSkKKwkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBzeW0tPnN0X25hbWU7CisJCQkJCWVsc2UgaWYgKHN5bS0+c3Rfc2huZHggPCBzaG51bSkKKwkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tzeW0tPnN0X3NobmR4XS0+bmFtZTsKKwkJCQkJZWxzZQorCQkJCQkJY29udGludWU7CisjaWYgZGVmaW5lZChfX1NINV9fKQorCQkJCQkvKgorCQkJCQkgKiBGb3Igc2g2NCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0YXJnZXQgb2YgYSBicmFuY2gKKwkJCQkJICogcmVxdWlyZXMgYSBtb2RlIHN3aXRjaCAoMzIgdG8gMTYgYW5kIGJhY2sgYWdhaW4pLgorCQkJCQkgKgorCQkJCQkgKiBUaGlzIGlzIGltcGxpZWQgYnkgdGhlIGxzYiBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAorCQkJCQkgKiBhZGRyZXNzIGZvciBTSG1lZGlhIG1vZGUgYW5kIGNsZWFyIGZvciBTSGNvbXBhY3QuCisJCQkJCSAqLworCQkJCQl2YWwgfD0gc3ltLT5zdF9vdGhlciAmIDQ7CisjZW5kaWYKKwkJCQkJb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgaiwgc3ltLT5zdF9pbmZvLCBzeW0tPnN0X3NobmR4LAorCQkJCQkJCXZhbCwgc3ltLT5zdF9zaXplKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNIVF9SRUxNOgorCQkJaWYgKHNlYy0+aGVhZGVyLnNoX2VudHNpemUgIT0gc2l6ZW9mKEVsZlcoUmVsTSkpKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlbG9jYXRpb24gZW50cnkgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCisJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhSZWxNKSkpOworCQkJfQorCQkJYnJlYWs7CisJCQkvKiBYWFggIFJlbG9jYXRpb24gY29kZSBmcm9tIG1vZHV0aWxzLTIuMy4xOSBpcyBub3QgaGVyZS4KKwkJCSAqIFdoeT8gIFRoYXQncyBhYm91dCAyMCBsaW5lcyBvZiBjb2RlIGZyb20gb2JqL29ial9sb2FkLmMsCisJCQkgKiB3aGljaCBnZXRzIGRvbmUgaW4gYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHRoZSBzZWN0aW9ucy4KKwkJCSAqIFRoaXMgQnVzeUJveCBpbnNtb2QgZG9lcyBzaW1pbGFyIHdvcmsgaW4gb2JqX3JlbG9jYXRlKCkuICovCisJCX0KKwl9CisKKwlyZXR1cm4gZjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNCisvKgorICogbG9hZCB0aGUgdW5sb2FkZWQgc2VjdGlvbnMgZGlyZWN0bHkgaW50byB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieQorICoga2VybmVsIGZvciB0aGUgbW9kdWxlCisgKi8KKworc3RhdGljIGludCBvYmpfbG9hZF9wcm9nYml0cyhjaGFyICppbWFnZSwgc2l6ZV90IGltYWdlX3NpemUsIHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqaW1hZ2ViYXNlKQoreworCUVsZlcoQWRkcikgYmFzZSA9IGYtPmJhc2VhZGRyOworCXN0cnVjdCBvYmpfc2VjdGlvbiogc2VjOworCisJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CisJCS8qIHNlY3Rpb24gYWxyZWFkeSBsb2FkZWQ/ICovCisJCWlmIChzZWMtPmNvbnRlbnRzICE9IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzZWMtPmNvbnRlbnRzID0gaW1hZ2ViYXNlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKKwkJaWYgKGltYWdlX3NpemUgPCAoc2VjLT5oZWFkZXIuc2hfb2Zmc2V0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZSkpIHsKKwkJCWJiX2Vycm9yX21zZygiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBkYXRhIik7CisJCQlyZXR1cm4gMDsgLyogbmVlZCB0byBkZWxldGUgaGFsZi1sb2FkZWQgbW9kdWxlISAqLworCQl9CisJCW1lbWNweShzZWMtPmNvbnRlbnRzLCBpbWFnZSArIHNlYy0+aGVhZGVyLnNoX29mZnNldCwgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGhpZGVfc3BlY2lhbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3BlY2lhbHNbXSA9IHsKKwkJU1BGWCAiY2xlYW51cF9tb2R1bGUiLAorCQlTUEZYICJpbml0X21vZHVsZSIsCisJCVNQRlggImtlcm5lbF92ZXJzaW9uIiwKKwkJTlVMTAorCX07CisKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCWNvbnN0IGNoYXIgKmNvbnN0ICpwOworCisJZm9yIChwID0gc3BlY2lhbHM7ICpwOyArK3ApIHsKKwkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsICpwKTsKKwkJaWYgKHN5bSAhPSBOVUxMKQorCQkJc3ltLT5pbmZvID0gRUxGX1NUX0lORk8oU1RCX0xPQ0FMLCBFTEZfU1RfVFlQRShzeW0tPmluZm8pKTsKKwl9Cit9CisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCitzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCS8qIFRoaXMgbGlzdCBtdXN0IG1hdGNoICpleGFjdGx5KiB0aGUgbGlzdCBvZiBhbGxvd2FibGUgbGljZW5zZXMgaW4KKwkgKiBsaW51eC9pbmNsdWRlL2xpbnV4L21vZHVsZS5oLiAgQ2hlY2tpbmcgZm9yIGxlYWRpbmcgIkdQTCIgd2lsbCBub3QKKwkgKiB3b3JrLCBzb21lYm9keSB3aWxsIHVzZSAiR1BMIHN1Y2tzLCB0aGlzIGlzIHByb3ByaWV0YXJ5Ii4KKwkgKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ3BsX2xpY2Vuc2VzW10gPSB7CisJCSJHUEwiLAorCQkiR1BMIHYyIiwKKwkJIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiLAorCQkiRHVhbCBCU0QvR1BMIiwKKwkJIkR1YWwgTVBML0dQTCIKKwl9OworCisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLm1vZGluZm8iKTsKKwlpZiAoc2VjKSB7CisJCWNvbnN0IGNoYXIgKnZhbHVlLCAqcHRyLCAqZW5kcHRyOworCQlwdHIgPSBzZWMtPmNvbnRlbnRzOworCQllbmRwdHIgPSBwdHIgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCQl3aGlsZSAocHRyIDwgZW5kcHRyKSB7CisJCQl2YWx1ZSA9IHN0cmNocihwdHIsICc9Jyk7CisJCQlpZiAodmFsdWUgJiYgc3RybmNtcChwdHIsICJsaWNlbnNlIiwgdmFsdWUtcHRyKSA9PSAwKSB7CisJCQkJdW5zaWduZWQgaTsKKwkJCQlpZiAobGljZW5zZSkKKwkJCQkJKmxpY2Vuc2UgPSB2YWx1ZSsxOworCQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwbF9saWNlbnNlcyk7ICsraSkgeworCQkJCQlpZiAoc3RyY21wKHZhbHVlKzEsIGdwbF9saWNlbnNlc1tpXSkgPT0gMCkKKwkJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCXB0ciA9IHN0cmNocihwdHIsICdcMCcpOworCQkJaWYgKHB0cikKKwkJCQlwdHIrKzsKKwkJCWVsc2UKKwkJCQlwdHIgPSBlbmRwdHI7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgVEFJTlRfRklMRU5BTUUgICAgICAgICAgICAgICAgICAiL3Byb2Mvc3lzL2tlcm5lbC90YWludGVkIgorI2RlZmluZSBUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUgICAgICAgICgxIDw8IDApCisjZGVmaW5lIFRBSU5UX0ZPUkNFRF9NT0RVTEUgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgVEFJTlRfVU5TQUZFX1NNUCAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBUQUlOVF9VUkwgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnR1eC5vcmcvbGttbC8jZXhwb3J0LXRhaW50ZWQiCisKK3N0YXRpYyB2b2lkIHNldF90YWludGVkKGludCBmZCwgY29uc3QgY2hhciAqbV9uYW1lLAorCQlpbnQga2VybmVsX2hhc190YWludGVkLCBpbnQgdGFpbnQsCisJCWNvbnN0IGNoYXIgKnRleHQxLCBjb25zdCBjaGFyICp0ZXh0MikKK3sKKwlzdGF0aWMgc21hbGxpbnQgcHJpbnRlZF9pbmZvOworCisJY2hhciBidWZbODBdOworCWludCBvbGR2YWw7CisKKwlpZiAoZmQgPCAwICYmICFrZXJuZWxfaGFzX3RhaW50ZWQpCisJCXJldHVybjsJCS8qIE5ldyBtb2R1dGlscyBvbiBvbGQga2VybmVsICovCisJcHJpbnRmKCJXYXJuaW5nOiBsb2FkaW5nICVzIHdpbGwgdGFpbnQgdGhlIGtlcm5lbDogJXMlc1xuIiwKKwkJCW1fbmFtZSwgdGV4dDEsIHRleHQyKTsKKwlpZiAoIXByaW50ZWRfaW5mbykgeworCQlwcmludGYoIiAgU2VlICVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0YWludGVkIG1vZHVsZXNcbiIsIFRBSU5UX1VSTCk7CisJCXByaW50ZWRfaW5mbyA9IDE7CisJfQorCWlmIChmZCA+PSAwKSB7CisJCXJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiktMSk7CisJCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisJCW9sZHZhbCA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJCXNwcmludGYoYnVmLCAiJWRcbiIsIG9sZHZhbCB8IHRhaW50KTsKKwkJeHdyaXRlX3N0cihmZCwgYnVmKTsKKwl9Cit9CisKKy8qIENoZWNrIGlmIGxvYWRpbmcgdGhpcyBtb2R1bGUgd2lsbCB0YWludCB0aGUga2VybmVsLiAqLworc3RhdGljIHZvaWQgY2hlY2tfdGFpbnRlZF9tb2R1bGUoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICptX25hbWUpCit7CisJaW50IGZkLCBrZXJuZWxfaGFzX3RhaW50ZWQ7CisJY29uc3QgY2hhciAqcHRyOworCisJa2VybmVsX2hhc190YWludGVkID0gMTsKKwlmZCA9IG9wZW4oVEFJTlRfRklMRU5BTUUsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJa2VybmVsX2hhc190YWludGVkID0gMDsKKwkJZWxzZSBpZiAoZXJybm8gPT0gRUFDQ0VTKQorCQkJa2VybmVsX2hhc190YWludGVkID0gMTsKKwkJZWxzZSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhUQUlOVF9GSUxFTkFNRSk7CisJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAwOworCQl9CisJfQorCisJc3dpdGNoIChvYmpfZ3BsX2xpY2Vuc2UoZiwgJnB0cikpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNldF90YWludGVkKGZkLCBtX25hbWUsIGtlcm5lbF9oYXNfdGFpbnRlZCwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAibm8gbGljZW5zZSIsICIiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIDI6ICovCisJCQkvKiBUaGUgbW9kdWxlIGhhcyBhIG5vbi1HUEwgbGljZW5zZSBzbyB3ZSBwcmV0ZW5kIHRoYXQgdGhlCisJCQkgKiBrZXJuZWwgYWx3YXlzIGhhcyBhIHRhaW50IGZsYWcgdG8gZ2V0IGEgd2FybmluZyBldmVuIG9uCisJCQkgKiBrZXJuZWxzIHdpdGhvdXQgdGhlIHByb2MgZmxhZy4KKwkJCSAqLworCQkJc2V0X3RhaW50ZWQoZmQsIG1fbmFtZSwgMSwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAibm9uLUdQTCBsaWNlbnNlIC0gIiwgcHRyKTsKKwkJCWJyZWFrOworCX0KKworCWlmIChmbGFnX2ZvcmNlX2xvYWQpCisJCXNldF90YWludGVkKGZkLCBtX25hbWUsIDEsIFRBSU5UX0ZPUkNFRF9NT0RVTEUsICJmb3JjZWQgbG9hZCIsICIiKTsKKworCWlmIChmZCA+PSAwKQorCQljbG9zZShmZCk7Cit9CisjZWxzZSAvKiAhRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSAqLworI2RlZmluZSBjaGVja190YWludGVkX21vZHVsZSh4LCB5KSBkbyB7IH0gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUworLyogYWRkIG1vZHVsZSBzb3VyY2UsIHRpbWVzdGFtcCwga2VybmVsIHZlcnNpb24gYW5kIGEgc3ltYm9sIGZvciB0aGUKKyAqIHN0YXJ0IG9mIHNvbWUgc2VjdGlvbnMuICB0aGlzIGluZm8gaXMgdXNlZCBieSBrc3ltb29wcyB0byBkbyBiZXR0ZXIKKyAqIGRlYnVnZ2luZy4KKyAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworI2RlZmluZSBnZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKSBnZXRfbW9kdWxlX3ZlcnNpb24oc3RyKQorI2VuZGlmCitzdGF0aWMgaW50CitnZXRfbW9kdWxlX3ZlcnNpb24oc3RydWN0IG9ial9maWxlICpmLCBjaGFyIHN0cltTVFJWRVJTSU9OTEVOXSkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCXJldHVybiBuZXdfZ2V0X21vZHVsZV92ZXJzaW9uKGYsIHN0cik7CisjZWxzZQorCXN0cm5jcHkoc3RyLCAiPz8/Iiwgc2l6ZW9mKHN0cikpOworCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisvKiBhZGQgbW9kdWxlIHNvdXJjZSwgdGltZXN0YW1wLCBrZXJuZWwgdmVyc2lvbiBhbmQgYSBzeW1ib2wgZm9yIHRoZQorICogc3RhcnQgb2Ygc29tZSBzZWN0aW9ucy4gIHRoaXMgaW5mbyBpcyB1c2VkIGJ5IGtzeW1vb3BzIHRvIGRvIGJldHRlcgorICogZGVidWdnaW5nLgorICovCitzdGF0aWMgdm9pZAorYWRkX2tzeW1vb3BzX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJY29uc3QgY2hhciAqbV9uYW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHN5bXByZWZpeFtdIEFMSUdOMSA9ICJfX2luc21vZF8iOworCXN0YXRpYyBjb25zdCBjaGFyIHNlY3Rpb25fbmFtZXNbXVs4XSA9IHsKKwkJIi50ZXh0IiwKKwkJIi5yb2RhdGEiLAorCQkiLmRhdGEiLAorCQkiLmJzcyIsCisJCSIuc2JzcyIKKwl9OworCisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwljaGFyICpuYW1lLCAqYWJzb2x1dGVfZmlsZW5hbWU7CisJY2hhciBzdHJbU1RSVkVSU0lPTkxFTl07CisJdW5zaWduZWQgaTsKKwlpbnQgbG1fbmFtZSwgbGZpbGVuYW1lLCB1c2Vfa3N5bXRhYiwgdmVyc2lvbjsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisJLyogV0FSTklORzogd2FzIHVzaW5nIHJlYWxwYXRoLCBidXQgcmVwbGFjZWQgYnkgcmVhZGxpbmsgdG8gc3RvcCB1c2luZworCSAqIGxvdHMgb2Ygc3RhY2suIEJ1dCBoZXJlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY2F1c2UgcHJvYmxlbXM/ICovCisJYWJzb2x1dGVfZmlsZW5hbWUgPSB4bWFsbG9jX3JlYWRsaW5rKGZpbGVuYW1lKTsKKwlpZiAoIWFic29sdXRlX2ZpbGVuYW1lKQorCQlhYnNvbHV0ZV9maWxlbmFtZSA9IHhzdHJkdXAoZmlsZW5hbWUpOworCisJbG1fbmFtZSA9IHN0cmxlbihtX25hbWUpOworCWxmaWxlbmFtZSA9IHN0cmxlbihhYnNvbHV0ZV9maWxlbmFtZSk7CisKKwkvKiBhZGQgdG8ga3N5bXRhYiBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvciB0aGVyZSBpcyBubyBrc3ltdGFiIGFuZCBvdGhlciBzeW1ib2xzCisJICogYXJlIG5vdCB0byBiZSBleHBvcnRlZC4gIG90aGVyd2lzZSBsZWF2ZSBrc3ltdGFiIGFsb25lIGZvciBub3csIHRoZQorCSAqICJleHBvcnQgYWxsIHN5bWJvbHMiIGNvbXBhdGliaWxpdHkgY29kZSB3aWxsIGV4cG9ydCB0aGVzZSBzeW1ib2xzIGxhdGVyLgorCSAqLworCXVzZV9rc3ltdGFiID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19rc3ltdGFiIikgfHwgZmxhZ19ub2V4cG9ydDsKKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50aGlzIik7CisJaWYgKHNlYykgeworCQkvKiB0YWcgdGhlIG1vZHVsZSBoZWFkZXIgd2l0aCB0aGUgb2JqZWN0IG5hbWUsIGxhc3QgbW9kaWZpZWQKKwkJICogdGltZXN0YW1wIGFuZCBtb2R1bGUgdmVyc2lvbi4gIHdvcnN0IGNhc2UgZm9yIG1vZHVsZSB2ZXJzaW9uCisJCSAqIGlzIDB4ZmZmZmZmLCBkZWNpbWFsIDE2Nzc3MjE1LiAgcHV0dGluZyBhbGwgdGhyZWUgZmllbGRzIGluCisJCSAqIG9uZSBzeW1ib2wgaXMgbGVzcyByZWFkYWJsZSBidXQgc2F2ZXMga2VybmVsIHNwYWNlLgorCQkgKi8KKwkJaWYgKHN0YXQoYWJzb2x1dGVfZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKQorCQkJc3RhdGJ1Zi5zdF9tdGltZSA9IDA7CisJCXZlcnNpb24gPSBnZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKTsJLyogLTEgaWYgbm90IGZvdW5kICovCisJCW5hbWUgPSB4YXNwcmludGYoIiVzJXNfTyVzX00lMCpsWF9WJWQiLAorCQkJCXN5bXByZWZpeCwgbV9uYW1lLCBhYnNvbHV0ZV9maWxlbmFtZSwKKwkJCQkoaW50KSgyICogc2l6ZW9mKHN0YXRidWYuc3RfbXRpbWUpKSwKKwkJCQkobG9uZylzdGF0YnVmLnN0X210aW1lLAorCQkJCXZlcnNpb24pOworCQlzeW0gPSBvYmpfYWRkX3N5bWJvbChmLCBuYW1lLCAtMSwKKwkJCQlFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKKwkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CisJCWlmICh1c2Vfa3N5bXRhYikKKwkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOworCX0KKwlmcmVlKGFic29sdXRlX2ZpbGVuYW1lKTsKKyNpZmRlZiBfTk9UX1NVUFBPUlRFRF8KKwkvKiByZWNvcmQgd2hlcmUgdGhlIHBlcnNpc3RlbnQgZGF0YSBpcyBnb2luZywgc2FtZSBhZGRyZXNzIGFzIHByZXZpb3VzIHN5bWJvbCAqLworCWlmIChmLT5wZXJzaXN0KSB7CisJCW5hbWUgPSB4YXNwcmludGYoIiVzJXNfUCVzIiwKKwkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgZi0+cGVyc2lzdCk7CisJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLCBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKKwkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CisJCWlmICh1c2Vfa3N5bXRhYikKKwkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOworCX0KKyNlbmRpZgorCS8qIHRhZyB0aGUgZGVzaXJlZCBzZWN0aW9ucyBpZiBzaXplIGlzIG5vbi16ZXJvICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VjdGlvbl9uYW1lcyk7ICsraSkgeworCQlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIHNlY3Rpb25fbmFtZXNbaV0pOworCQlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKKwkJCW5hbWUgPSB4YXNwcmludGYoIiVzJXNfUyVzX0wlbGQiLAorCQkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgc2VjLT5uYW1lLAorCQkJCQkobG9uZylzZWMtPmhlYWRlci5zaF9zaXplKTsKKwkJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLCBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKKwkJCQkJc2VjLT5pZHgsIHNlYy0+aGVhZGVyLnNoX2FkZHIsIDApOworCQkJaWYgKHVzZV9rc3ltdGFiKQorCQkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOworCQl9CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUAorc3RhdGljIHZvaWQgcHJpbnRfbG9hZF9tYXAoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCisJc3RydWN0IG9ial9zeW1ib2wgKiphbGwsICoqcDsKKwlpbnQgaSwgbnN5bXM7CisJY2hhciAqbG9hZGVkOyAvKiBhcnJheSBvZiBib29sZWFucyAqLworCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisjZW5kaWYKKwkvKiBSZXBvcnQgb24gdGhlIHNlY3Rpb24gbGF5b3V0LiAgKi8KKwlwcmludGYoIlNlY3Rpb25zOiAgICAgICBTaXplICAgICAgJS0qcyAgQWxpZ25cbiIsCisJCQkoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgIkFkZHJlc3MiKTsKKworCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgeworCQlpbnQgYTsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJZm9yIChhID0gLTEsIHRtcCA9IHNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbjsgdG1wOyArK2EpCisJCQl0bXAgPj49IDE7CisJCWlmIChhID09IC0xKQorCQkJYSA9IDA7CisKKwkJcHJpbnRmKCIlLTE1cyAlMDhseCAgJTAqbHggIDIqKiVkXG4iLAorCQkJCXNlYy0+bmFtZSwKKwkJCQkobG9uZylzZWMtPmhlYWRlci5zaF9zaXplLAorCQkJCShpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLAorCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX2FkZHIsCisJCQkJYSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCisJLyogUXVpY2sgcmVmZXJlbmNlIHdoaWNoIHNlY3Rpb24gaW5kaWNlcyBhcmUgbG9hZGVkLiAgKi8KKwlpID0gZi0+aGVhZGVyLmVfc2hudW07CisJbG9hZGVkID0gYWxsb2NhKGkgKiBzaXplb2YobG9hZGVkWzBdKSk7CisJd2hpbGUgKC0taSA+PSAwKQorCQlsb2FkZWRbaV0gPSAoKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApOworCisJLyogQ29sbGVjdCB0aGUgc3ltYm9scyB3ZSdsbCBiZSBsaXN0aW5nLiAgKi8KKwlmb3IgKG5zeW1zID0gaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkKKwkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQorCQkJaWYgKHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKKwkJCSAmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKQorCQkJKSB7CisJCQkJKytuc3ltczsKKwkJCX0KKworCWFsbCA9IGFsbG9jYShuc3ltcyAqIHNpemVvZihhbGxbMF0pKTsKKworCWZvciAoaSA9IDAsIHAgPSBhbGw7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkKKwkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQorCQkJaWYgKHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKKwkJCSAmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKQorCQkJKSB7CisJCQkJKnArKyA9IHN5bTsKKwkJCX0KKworCS8qIEFuZCBsaXN0IHRoZW0uICAqLworCXByaW50ZigiXG5TeW1ib2xzOlxuIik7CisJZm9yIChwID0gYWxsOyBwIDwgYWxsICsgbnN5bXM7ICsrcCkgeworCQljaGFyIHR5cGUgPSAnPyc7CisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJc3ltID0gKnA7CisJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fQUJTKSB7CisJCQl0eXBlID0gJ0EnOworCQkJdmFsdWUgPSBzeW0tPnZhbHVlOworCQl9IGVsc2UgaWYgKHN5bS0+c2VjaWR4ID09IFNITl9VTkRFRikgeworCQkJdHlwZSA9ICdVJzsKKwkJCXZhbHVlID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNlYyA9IGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XTsKKworCQkJaWYgKHNlYy0+aGVhZGVyLnNoX3R5cGUgPT0gU0hUX05PQklUUykKKwkJCQl0eXBlID0gJ0InOworCQkJZWxzZSBpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpIHsKKwkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKQorCQkJCQl0eXBlID0gJ1QnOworCQkJCWVsc2UgaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX1dSSVRFKQorCQkJCQl0eXBlID0gJ0QnOworCQkJCWVsc2UKKwkJCQkJdHlwZSA9ICdSJzsKKwkJCX0KKwkJCXZhbHVlID0gc3ltLT52YWx1ZSArIHNlYy0+aGVhZGVyLnNoX2FkZHI7CisJCX0KKworCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSA9PSBTVEJfTE9DQUwpCisJCQl0eXBlIHw9IDB4MjA7IC8qIHRvbG93ZXIuIHNhZmUgZm9yICc/JyB0b28gKi8KKworCQlwcmludGYoIiUwKmx4ICVjICVzXG4iLCAoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgdmFsdWUsCisJCQkJdHlwZSwgc3ltLT5uYW1lKTsKKwl9CisjZW5kaWYKK30KKyNlbHNlIC8qICFGRUFUVVJFX0lOU01PRF9MT0FEX01BUCAqLworc3RhdGljIHZvaWQgcHJpbnRfbG9hZF9tYXAoc3RydWN0IG9ial9maWxlICpmIFVOVVNFRF9QQVJBTSkKK3sKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGJiX2luaXRfbW9kdWxlXzI0KGNvbnN0IGNoYXIgKm1fZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGtfY3JjczsKKwl1bnNpZ25lZCBsb25nIG1fc2l6ZTsKKwlFbGZXKEFkZHIpIG1fYWRkcjsKKwlzdHJ1Y3Qgb2JqX2ZpbGUgKmY7CisJaW50IGV4aXRfc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCWNoYXIgKm1fbmFtZTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCWludCBtX2hhc19tb2RpbmZvOworI2VuZGlmCisJY2hhciAqaW1hZ2U7CisJc2l6ZV90IGltYWdlX3NpemU7CisJYm9vbCBtbWFwZWQ7CisKKwlpbWFnZV9zaXplID0gSU5UX01BWCAtIDQwOTU7CisJbW1hcGVkID0gMDsKKwlpbWFnZSA9IHRyeV90b19tbWFwX21vZHVsZShtX2ZpbGVuYW1lLCAmaW1hZ2Vfc2l6ZSk7CisJaWYgKGltYWdlKSB7CisJCW1tYXBlZCA9IDE7CisJfSBlbHNlIHsKKwkJLyogTG9hZCBtb2R1bGUgaW50byBtZW1vcnkgYW5kIHVuemlwIGlmIGNvbXByZXNzZWQgKi8KKwkJaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UobV9maWxlbmFtZSwgJmltYWdlX3NpemUpOworCQlpZiAoIWltYWdlKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwltX25hbWUgPSB4c3RyZHVwKGJiX2Jhc2VuYW1lKG1fZmlsZW5hbWUpKTsKKwkvKiAibW9kdWxlLm9bLmd6XSIgLT4gIm1vZHVsZSIgKi8KKwkqc3RyY2hybnVsKG1fbmFtZSwgJy4nKSA9ICdcMCc7CisKKwlmID0gb2JqX2xvYWQoaW1hZ2UsIGltYWdlX3NpemUsIExPQURCSVRTKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCisJLyogVmVyc2lvbiBjb3JyZXNwb25kZW5jZT8gICovCisJbV9oYXNfbW9kaW5mbyA9IChnZXRfbW9kaW5mb192YWx1ZShmLCAia2VybmVsX3ZlcnNpb24iKSAhPSBOVUxMKTsKKwlpZiAoIWZsYWdfcXVpZXQpIHsKKwkJY2hhciBtX3N0cnZlcnNpb25bU1RSVkVSU0lPTkxFTl07CisJCXN0cnVjdCB1dHNuYW1lIHV0czsKKworCQlpZiAobV9oYXNfbW9kaW5mbykgeworCQkJaW50IG1fdmVyc2lvbiA9IG5ld19nZXRfbW9kdWxlX3ZlcnNpb24oZiwgbV9zdHJ2ZXJzaW9uKTsKKwkJCWlmIChtX3ZlcnNpb24gPT0gLTEpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCB0aGUga2VybmVsIHZlcnNpb24gIgorCQkJCQkidGhlIG1vZHVsZSB3YXMgY29tcGlsZWQgZm9yIik7CisJCQl9CisJCX0KKworCQl1bmFtZSgmdXRzKTsKKwkJaWYgKHN0cm5jbXAodXRzLnJlbGVhc2UsIG1fc3RydmVyc2lvbiwgU1RSVkVSU0lPTkxFTikgIT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCIlc2tlcm5lbC1tb2R1bGUgdmVyc2lvbiBtaXNtYXRjaFxuIgorCQkJCSJcdCVzIHdhcyBjb21waWxlZCBmb3Iga2VybmVsIHZlcnNpb24gJXNcbiIKKwkJCQkiXHR3aGlsZSB0aGlzIGtlcm5lbCBpcyB2ZXJzaW9uICVzIiwKKwkJCQlmbGFnX2ZvcmNlX2xvYWQgPyAid2FybmluZzogIiA6ICIiLAorCQkJCW1fbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHMucmVsZWFzZSk7CisJCQlpZiAoIWZsYWdfZm9yY2VfbG9hZCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCAwLCBOVUxMLCAwLCBOVUxMKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9sZCAodW5zdXBwb3J0ZWQpIGtlcm5lbCIpOworCW5ld19nZXRfa2VybmVsX3N5bWJvbHMoKTsKKwlrX2NyY3MgPSBuZXdfaXNfa2VybmVsX2NoZWNrc3VtbWVkKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCXsKKwkJaW50IG1fY3JjcyA9IDA7CisJCWlmIChtX2hhc19tb2RpbmZvKQorCQkJbV9jcmNzID0gbmV3X2lzX21vZHVsZV9jaGVja3N1bW1lZChmKTsKKwkJaWYgKG1fY3JjcyAhPSBrX2NyY3MpCisJCQlvYmpfc2V0X3N5bWJvbF9jb21wYXJlKGYsIG5jdl9zdHJjbXAsIG5jdl9zeW1ib2xfaGFzaCk7CisJfQorI2VuZGlmCisKKwkvKiBMZXQgdGhlIG1vZHVsZSBrbm93IGFib3V0IHRoZSBrZXJuZWwgc3ltYm9scy4gICovCisJYWRkX2tlcm5lbF9zeW1ib2xzKGYpOworCisJLyogQWxsb2NhdGUgY29tbW9uIHN5bWJvbHMsIHN5bWJvbCB0YWJsZXMsIGFuZCBzdHJpbmcgdGFibGVzLiAgKi8KKwluZXdfY3JlYXRlX3RoaXNfbW9kdWxlKGYsIG1fbmFtZSk7CisJb2JqX2NoZWNrX3VuZGVmaW5lZHMoZik7CisJb2JqX2FsbG9jYXRlX2NvbW1vbnMoZik7CisJY2hlY2tfdGFpbnRlZF9tb2R1bGUoZiwgbV9uYW1lKTsKKworCS8qIERvbmUgd2l0aCB0aGUgbW9kdWxlIG5hbWUsIG9uIHRvIHRoZSBvcHRpb25hbCB2YXI9dmFsdWUgYXJndW1lbnRzICovCisJbmV3X3Byb2Nlc3NfbW9kdWxlX2FyZ3VtZW50cyhmLCBvcHRpb25zKTsKKworCWFyY2hfY3JlYXRlX2dvdChmKTsKKwloaWRlX3NwZWNpYWxfc3ltYm9scyhmKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCisJYWRkX2tzeW1vb3BzX3N5bWJvbHMoZiwgbV9maWxlbmFtZSwgbV9uYW1lKTsKKyNlbmRpZgorCisJbmV3X2NyZWF0ZV9tb2R1bGVfa3N5bXRhYihmKTsKKworCS8qIEZpbmQgY3VycmVudCBzaXplIG9mIHRoZSBtb2R1bGUgKi8KKwltX3NpemUgPSBvYmpfbG9hZF9zaXplKGYpOworCisJbV9hZGRyID0gY3JlYXRlX21vZHVsZShtX25hbWUsIG1fc2l6ZSk7CisJaWYgKG1fYWRkciA9PSAoRWxmVyhBZGRyKSkoLTEpKSBzd2l0Y2ggKGVycm5vKSB7CisJY2FzZSBFRVhJU1Q6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJhIG1vZHVsZSBuYW1lZCAlcyBhbHJlYWR5IGV4aXN0cyIsIG1fbmFtZSk7CisJY2FzZSBFTk9NRU06CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBhbGxvY2F0ZSBrZXJuZWwgbWVtb3J5IGZvciBtb2R1bGU7IG5lZWRlZCAlbHUgYnl0ZXMiLAorCQkJCW1fc2l6ZSk7CisJZGVmYXVsdDoKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjcmVhdGVfbW9kdWxlOiAlcyIsIG1fbmFtZSk7CisJfQorCisjaWYgIUxPQURCSVRTCisJLyoKKwkgKiB0aGUgUFJPR0JJVFMgc2VjdGlvbiB3YXMgbm90IGxvYWRlZCBieSB0aGUgb2JqX2xvYWQKKwkgKiBub3cgd2UgY2FuIGxvYWQgdGhlbSBkaXJlY3RseSBpbnRvIHRoZSBrZXJuZWwgbWVtb3J5CisJICovCisJaWYgKCFvYmpfbG9hZF9wcm9nYml0cyhpbWFnZSwgaW1hZ2Vfc2l6ZSwgZiwgKGNoYXIqKW1fYWRkcikpIHsKKwkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCWlmICghb2JqX3JlbG9jYXRlKGYsIG1fYWRkcikpIHsKKwkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIW5ld19pbml0X21vZHVsZShtX25hbWUsIGYsIG1fc2l6ZSkpIHsKKwkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZmxhZ19wcmludF9sb2FkX21hcCkKKwkJcHJpbnRfbG9hZF9tYXAoZik7CisKKwlleGl0X3N0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKworIG91dDoKKwlpZiAobW1hcGVkKQorCQltdW5tYXAoaW1hZ2UsIGltYWdlX3NpemUpOworCWVsc2UKKwkJZnJlZShpbWFnZSk7CisJZnJlZShtX25hbWUpOworCisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvbW9kdXRpbHMuYyBiL21vZHV0aWxzL21vZHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4N2NhNwotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL21vZHV0aWxzLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb21tb24gbW9kdXRpbHMgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVGltbyBUZXJhcyA8dGltby50ZXJhc0Bpa2kuZmk+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisKKyNpZmRlZiBfX1VDTElCQ19fCitleHRlcm4gaW50IGluaXRfbW9kdWxlKHZvaWQgKm1vZHVsZSwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKm9wdGlvbnMpOworZXh0ZXJuIGludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKyNlbHNlCisjIGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjIGRlZmluZSBpbml0X21vZHVsZShtb2QsIGxlbiwgb3B0cykgc3lzY2FsbChfX05SX2luaXRfbW9kdWxlLCBtb2QsIGxlbiwgb3B0cykKKyMgZGVmaW5lIGRlbGV0ZV9tb2R1bGUobW9kLCBmbGFncykgc3lzY2FsbChfX05SX2RlbGV0ZV9tb2R1bGUsIG1vZCwgZmxhZ3MpCisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgcmVwbGFjZShjaGFyICpzLCBjaGFyIHdoYXQsIGNoYXIgd2l0aCkKK3sKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKHdoYXQgPT0gKnMpCisJCQkqcyA9IHdpdGg7CisJCSsrczsKKwl9Cit9CisKK2NoYXIqIEZBU1RfRlVOQyByZXBsYWNlX3VuZGVyc2NvcmVzKGNoYXIgKnMpCit7CisJcmVwbGFjZShzLCAnLScsICdfJyk7CisJcmV0dXJuIHM7Cit9CisKK2ludCBGQVNUX0ZVTkMgc3RyaW5nX3RvX2xsaXN0KGNoYXIgKnN0cmluZywgbGxpc3RfdCAqKmxsaXN0LCBjb25zdCBjaGFyICpkZWxpbSkKK3sKKwljaGFyICp0b2s7CisJaW50IGxlbiA9IDA7CisKKwl3aGlsZSAoKHRvayA9IHN0cnNlcCgmc3RyaW5nLCBkZWxpbSkpICE9IE5VTEwpIHsKKwkJaWYgKHRva1swXSA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWxsaXN0X2FkZF90b19lbmQobGxpc3QsIHhzdHJkdXAodG9rKSk7CisJCWxlbiArPSBzdHJsZW4odG9rKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworY2hhciogRkFTVF9GVU5DIGZpbGVuYW1lMm1vZG5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKm1vZG5hbWUpCit7CisJaW50IGk7CisJY2hhciAqZnJvbTsKKworCWlmIChmaWxlbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobW9kbmFtZSA9PSBOVUxMKQorCQltb2RuYW1lID0geG1hbGxvYyhNT0RVTEVfTkFNRV9MRU4pOworCWZyb20gPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGZpbGVuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgKE1PRFVMRV9OQU1FX0xFTi0xKSAmJiBmcm9tW2ldICE9ICdcMCcgJiYgZnJvbVtpXSAhPSAnLic7IGkrKykKKwkJbW9kbmFtZVtpXSA9IChmcm9tW2ldID09ICctJykgPyAnXycgOiBmcm9tW2ldOworCW1vZG5hbWVbaV0gPSAnXDAnOworCisJcmV0dXJuIG1vZG5hbWU7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBwYXJzZV9jbWRsaW5lX21vZHVsZV9vcHRpb25zKGNoYXIgKiphcmd2LCBpbnQgcXVvdGVfc3BhY2VzKQoreworCWNoYXIgKm9wdGlvbnM7CisJaW50IG9wdGxlbjsKKworCW9wdGlvbnMgPSB4emFsbG9jKDEpOworCW9wdGxlbiA9IDA7CisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJY29uc3QgY2hhciAqZm10OworCQljb25zdCBjaGFyICp2YXI7CisJCWNvbnN0IGNoYXIgKnZhbDsKKworCQl2YXIgPSAqYXJndjsKKwkJb3B0aW9ucyA9IHhyZWFsbG9jKG9wdGlvbnMsIG9wdGxlbiArIDIgKyBzdHJsZW4odmFyKSArIDIpOworCQlmbXQgPSAiJS4qcyVzICI7CisJCXZhbCA9IHN0cmNocm51bCh2YXIsICc9Jyk7CisJCWlmIChxdW90ZV9zcGFjZXMpIHsKKwkJCS8qCisJCQkgKiBtb2Rwcm9iZSAobW9kdWxlLWluaXQtdG9vbHMgdmVyc2lvbiAzLjExLjEpIGNvbXBhdDoKKwkJCSAqIHF1b3RlIG9ubHkgdmFsdWU6CisJCQkgKiB2YXI9InZhbCB3aXRoIHNwYWNlcyIsIG5vdCAidmFyPXZhbCB3aXRoIHNwYWNlcyIKKwkJCSAqIChub3RlOiB2YXIgKm5hbWUqIGlzIG5vdCBjaGVja2VkIGZvciBzcGFjZXMhKQorCQkJICovCisJCQlpZiAoKnZhbCkgeyAvKiBoYXMgdmFyPXZhbCBmb3JtYXQuIHNraXAgJz0nICovCisJCQkJdmFsKys7CisJCQkJaWYgKHN0cmNocih2YWwsICcgJykpCisJCQkJCWZtdCA9ICIlLipzXCIlc1wiICI7CisJCQl9CisJCX0KKwkJb3B0bGVuICs9IHNwcmludGYob3B0aW9ucyArIG9wdGxlbiwgZm10LCAoaW50KSh2YWwgLSB2YXIpLCB2YXIsIHZhbCk7CisJfQorCS8qIFJlbW92ZSB0cmFpbGluZyBzcGFjZS4gRGlzYWJsZWQgKi8KKwkvKiBpZiAob3B0bGVuICE9IDApIG9wdGlvbnNbb3B0bGVuLTFdID0gJ1wwJzsgKi8KKwlyZXR1cm4gb3B0aW9uczsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9UUllfTU1BUAordm9pZCogRkFTVF9GVU5DIHRyeV90b19tbWFwX21vZHVsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICppbWFnZV9zaXplX3ApCit7CisJLyogV2UgaGF2ZSB1c2VyIHJlcG9ydHMgb2YgZmFpbHVyZSB0byBsb2FkIDNNQiBtb2R1bGUKKwkgKiBvbiBhIDE2TUIgUkFNIG1hY2hpbmUuIEFwcGFyZW50bHkgZXZlbiBhIHRyYW5zaWVudAorCSAqIG1lbW9yeSBzcGlrZSB0byA2TUIgZHVyaW5nIG1vZHVsZSBsb2FkCisJICogaXMgdG9vIGJpZyBmb3IgdGhhdCBzeXN0ZW0uICovCisJdm9pZCAqaW1hZ2U7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCisJZmQgPSB4b3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWZzdGF0KGZkLCAmc3QpOworCWltYWdlID0gTlVMTDsKKwkvKiBzdC5zdF9zaXplIGlzIG9mZl90LCB3ZSBjYW4ndCBqdXN0IHBhc3MgaXQgdG8gbW1hcCAqLworCWlmIChzdC5zdF9zaXplIDw9ICppbWFnZV9zaXplX3ApIHsKKwkJc2l6ZV90IGltYWdlX3NpemUgPSBzdC5zdF9zaXplOworCQlpbWFnZSA9IG1tYXAoTlVMTCwgaW1hZ2Vfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCQlpZiAoaW1hZ2UgPT0gTUFQX0ZBSUxFRCkgeworCQkJaW1hZ2UgPSBOVUxMOworCQl9IGVsc2UgaWYgKCoodWludDMyX3QqKWltYWdlICE9IFNXQVBfQkUzMigweDdmNDU0QzQ2KSkgeworCQkJLyogTm8gRUxGIHNpZ25hdHVyZS4gQ29tcHJlc3NlZCBtb2R1bGU/ICovCisJCQltdW5tYXAoaW1hZ2UsIGltYWdlX3NpemUpOworCQkJaW1hZ2UgPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyogU3VjY2Vzcy4gUmVwb3J0IHRoZSBzaXplICovCisJCQkqaW1hZ2Vfc2l6ZV9wID0gaW1hZ2Vfc2l6ZTsKKwkJfQorCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGltYWdlOworfQorI2VuZGlmCisKKy8qIFJldHVybjoKKyAqIDAgb24gc3VjY2VzcywKKyAqIC1lcnJubyBvbiBvcGVuL3JlYWQgZXJyb3IsCisgKiBlcnJubyBvbiBpbml0X21vZHVsZSgpIGVycm9yCisgKi8KK2ludCBGQVNUX0ZVTkMgYmJfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpCit7CisJc2l6ZV90IGltYWdlX3NpemU7CisJY2hhciAqaW1hZ2U7CisJaW50IHJjOworCWJvb2wgbW1hcGVkOworCisJaWYgKCFvcHRpb25zKQorCQlvcHRpb25zID0gIiI7CisKKy8vVE9ETzogYXVkaXQgYmJfaW5pdF9tb2R1bGVfMjQgdG8gbWF0Y2ggZXJyb3IgY29kZSBjb252ZW50aW9uCisjaWYgRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMKKwlpZiAoZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorCQlyZXR1cm4gYmJfaW5pdF9tb2R1bGVfMjQoZmlsZW5hbWUsIG9wdGlvbnMpOworI2VuZGlmCisKKwlpbWFnZV9zaXplID0gSU5UX01BWCAtIDQwOTU7CisJbW1hcGVkID0gMDsKKwlpbWFnZSA9IHRyeV90b19tbWFwX21vZHVsZShmaWxlbmFtZSwgJmltYWdlX3NpemUpOworCWlmIChpbWFnZSkgeworCQltbWFwZWQgPSAxOworCX0gZWxzZSB7CisJCWVycm5vID0gRU5PTUVNOyAvKiBtYXkgYmUgY2hhbmdlZCBieSBlLmcuIG9wZW4gZXJyb3JzIGJlbG93ICovCisJCWltYWdlID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKGZpbGVuYW1lLCAmaW1hZ2Vfc2l6ZSk7CisJCWlmICghaW1hZ2UpCisJCQlyZXR1cm4gLWVycm5vOworCX0KKworCWVycm5vID0gMDsKKwlpbml0X21vZHVsZShpbWFnZSwgaW1hZ2Vfc2l6ZSwgb3B0aW9ucyk7CisJcmMgPSBlcnJubzsKKwlpZiAobW1hcGVkKQorCQltdW5tYXAoaW1hZ2UsIGltYWdlX3NpemUpOworCWVsc2UKKwkJZnJlZShpbWFnZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgRkFTVF9GVU5DIGJiX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJZXJybm8gPSAwOworCWRlbGV0ZV9tb2R1bGUobW9kdWxlLCBmbGFncyk7CisJcmV0dXJuIGVycm5vOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbW9kZXJyb3IoaW50IGVycikKK3sKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgLTE6IC8qIGJ0dzogaXQncyAtRVBFUk0gKi8KKwkJcmV0dXJuICJubyBzdWNoIG1vZHVsZSI7CisJY2FzZSBFTk9FWEVDOgorCQlyZXR1cm4gImludmFsaWQgbW9kdWxlIGZvcm1hdCI7CisJY2FzZSBFTk9FTlQ6CisJCXJldHVybiAidW5rbm93biBzeW1ib2wgaW4gbW9kdWxlLCBvciB1bmtub3duIHBhcmFtZXRlciI7CisJY2FzZSBFU1JDSDoKKwkJcmV0dXJuICJtb2R1bGUgaGFzIHdyb25nIHN5bWJvbCB2ZXJzaW9uIjsKKwljYXNlIEVOT1NZUzoKKwkJcmV0dXJuICJrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgb3BlcmF0aW9uIjsKKwl9CisJaWYgKGVyciA8IDApIC8qIHNob3VsZCBhbHdheXMgYmUgKi8KKwkJZXJyID0gLWVycjsKKwlyZXR1cm4gc3RyZXJyb3IoZXJyKTsKK30KZGlmZiAtLWdpdCBhL21vZHV0aWxzL21vZHV0aWxzLmggYi9tb2R1dGlscy9tb2R1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDU5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9tb2R1dGlscy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb21tb24gbW9kdXRpbHMgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVGltbyBUZXJhcyA8dGltby50ZXJhc0Bpa2kuZmk+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIE1PRFVUSUxTX0gKKyNkZWZpbmUgTU9EVVRJTFNfSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogbGludXgvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBoYXMgNjQsIGJ1dCB0aGlzIGlzIGFsc28gdXNlZAorICogaW50ZXJuYWxseSBmb3IgdGhlIG1heGltdW0gYWxpYXMgbmFtZSBsZW5ndGgsIHdoaWNoIGNhbiBiZSBxdWl0ZSBsb25nICovCisjZGVmaW5lIE1PRFVMRV9OQU1FX0xFTiAyNTYKKwordm9pZCByZXBsYWNlKGNoYXIgKnMsIGNoYXIgd2hhdCwgY2hhciB3aXRoKSBGQVNUX0ZVTkM7CitjaGFyICpyZXBsYWNlX3VuZGVyc2NvcmVzKGNoYXIgKnMpIEZBU1RfRlVOQzsKK2ludCBzdHJpbmdfdG9fbGxpc3QoY2hhciAqc3RyaW5nLCBsbGlzdF90ICoqbGxpc3QsIGNvbnN0IGNoYXIgKmRlbGltKSBGQVNUX0ZVTkM7CitjaGFyICpmaWxlbmFtZTJtb2RuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICptb2RuYW1lKSBGQVNUX0ZVTkM7CitjaGFyICpwYXJzZV9jbWRsaW5lX21vZHVsZV9vcHRpb25zKGNoYXIgKiphcmd2LCBpbnQgcXVvdGVfc3BhY2VzKSBGQVNUX0ZVTkM7CisKKy8qIGluc21vZCBmb3IgMi40IGFuZCBtb2Rwcm9iZSdzIG9wdGlvbnMgKGluc21vZCAyLjYgaGFzIG5vIG9wdGlvbnMgYXQgYWxsKTogKi8KKyNkZWZpbmUgSU5TTU9EX09QVFMgXAorCSJ2cXMiIFwKKwlJRl9GRUFUVVJFXzJfNF9NT0RVTEVTKCJMZmt4IiBJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgibSIpKQorI2RlZmluZSBJTlNNT0RfQVJHUyAvKiAod2FzIG1lYW50IHRvIHN1cHBvcnQgLW8gTkFNRSkgLCBOVUxMICovCisKK2VudW0geworCUlOU01PRF9PUFRfVkVSQk9TRSAgICAgID0gKDEgPDwgMCksCisJSU5TTU9EX09QVF9TSUxFTlQgICAgICAgPSAoMSA8PCAxKSwKKwlJTlNNT0RfT1BUX1NZU0xPRyAgICAgICA9ICgxIDw8IDIpLAorCS8vSU5TTU9EX09QVF9PVVRQVVROQU1FID0gKDEgPDwgeCkgLSBub3Qgc3VwcG9ydGVkIHlldAorCUlOU01PRF9PUFRfTE9DSyAgICAgICAgID0gKDEgPDwgMykgKiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUywKKwlJTlNNT0RfT1BUX0ZPUkNFICAgICAgICA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMsCisJSU5TTU9EX09QVF9LRVJORUxEICAgICAgPSAoMSA8PCA1KSAqIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTLAorCUlOU01PRF9PUFRfTk9fRVhQT1JUICAgID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUywKKwlJTlNNT0RfT1BUX1BSSU5UX01BUCAgICA9ICgxIDw8IDcpICogRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQLAorCUlOU01PRF9PUFRfVU5VU0VEICAgICAgID0KKwkJKElOU01PRF9PUFRfUFJJTlRfTUFQID8gSU5TTU9EX09QVF9QUklOVF9NQVAKKwkJOiBJTlNNT0RfT1BUX05PX0VYUE9SVCA/IElOU01PRF9PUFRfTk9fRVhQT1JUCisJCTogSU5TTU9EX09QVF9TWVNMT0cKKwkJKSA8PCAxCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQCit2b2lkKiBGQVNUX0ZVTkMgdHJ5X3RvX21tYXBfbW9kdWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKmltYWdlX3NpemVfcCk7CisjZWxzZQorIyBkZWZpbmUgdHJ5X3RvX21tYXBfbW9kdWxlKGZpbGVuYW1lLCBpbWFnZV9zaXplKSBOVUxMCisjZW5kaWYKKworLyogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzLAorICogLWVycm5vIG9uIG9wZW4vcmVhZCBlcnJvciwKKyAqIGVycm5vIG9uIGluaXRfbW9kdWxlKCkgZXJyb3IKKyAqLworaW50IEZBU1RfRlVOQyBiYl9pbml0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpOworLyogUmV0dXJuOgorICogMCBvbiBzdWNjZXNzLAorICogZXJybm8gb24gaW5pdF9tb2R1bGUoKSBlcnJvcgorICovCitpbnQgRkFTVF9GVU5DIGJiX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworLyogVHJhbnNsYXRlcyBlcnJvciByZXR1cm4gdG8gYSBzdHJpbmcgKi8KK2NvbnN0IGNoYXIgKm1vZGVycm9yKGludCBlcnIpIEZBU1RfRlVOQzsKKworI2lmIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTCitpbnQgRkFTVF9GVU5DIGJiX2luaXRfbW9kdWxlXzI0KGNvbnN0IGNoYXIgKm1vZHVsZSwgY29uc3QgY2hhciAqb3B0aW9ucyk7CisjZW5kaWYKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tb2R1dGlscy9ybW1vZC5jIGIvbW9kdXRpbHMvcm1tb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRhOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvcm1tb2QuYwpAQCAtMCwwICsxLDY3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJtbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfUk1NT0QoQVBQTEVUKHJtbW9kLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy91c2FnZTojaWYgIUVOQUJMRV9NT0RQUk9CRV9TTUFMTAorLy91c2FnZTojZGVmaW5lIHJtbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXdmYV0gW01PRFVMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcm1tb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVbmxvYWQga2VybmVsIG1vZHVsZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJV2FpdCB1bnRpbCB0aGUgbW9kdWxlIGlzIG5vIGxvbmdlciB1c2VkIgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSB1bmxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS1hCVJlbW92ZSBhbGwgdW51c2VkIG1vZHVsZXMgKHJlY3Vyc2l2ZWx5KSIKKy8vdXNhZ2U6I2RlZmluZSBybW1vZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBybW1vZCB0dWxpcFxuIgorLy91c2FnZTojZW5kaWYKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibW9kdXRpbHMuaCIKKworaW50IHJtbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBybW1vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJdW5zaWduZWQgZmxhZ3MgPSBPX05PTkJMT0NLIHwgT19FWENMOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lLiAqLworCW4gPSBnZXRvcHQzMihhcmd2LCAid2ZhcyIpOyAvLyAtcyBpZ25vcmVkCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG4gJiAxKSAgLy8gLS13YWl0CisJCWZsYWdzICY9IH5PX05PTkJMT0NLOworCWlmIChuICYgMikgIC8vIC0tZm9yY2UKKwkJZmxhZ3MgfD0gT19UUlVOQzsKKwlpZiAobiAmIDQpIHsKKwkJLyogVW5sb2FkIF9hbGxfIHVudXNlZCBtb2R1bGVzIHZpYSBOVUxMIGRlbGV0ZV9tb2R1bGUoKSBjYWxsICovCisJCWlmIChiYl9kZWxldGVfbW9kdWxlKE5VTEwsIGZsYWdzKSAhPSAwICYmIGVycm5vICE9IEVGQVVMVCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicm1tb2QiKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisKKwluID0gRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMgJiYgZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApOworCXdoaWxlICgqYXJndikgeworCQljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwkJY29uc3QgY2hhciAqYm5hbWU7CisKKwkJYm5hbWUgPSBiYl9iYXNlbmFtZSgqYXJndisrKTsKKwkJaWYgKG4pCisJCQlzYWZlX3N0cm5jcHkobW9kbmFtZSwgYm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7CisJCWVsc2UKKwkJCWZpbGVuYW1lMm1vZG5hbWUoYm5hbWUsIG1vZG5hbWUpOworCQlpZiAoYmJfZGVsZXRlX21vZHVsZShtb2RuYW1lLCBmbGFncykpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgdW5sb2FkICclcyc6ICVzIiwKKwkJCQkJICAgICBtb2RuYW1lLCBtb2RlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL0NvbmZpZy5pbiBiL25ldHdvcmtpbmcvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjYxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL0NvbmZpZy5pbgpAQCAtMCwwICsxLDEwODIgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJOZXR3b3JraW5nIFV0aWxpdGllcyIKKworY29uZmlnIE5BTUVJRgorCWJvb2wgIm5hbWVpZiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBuYW1laWYgaXMgdXNlZCB0byByZW5hbWUgbmV0d29yayBpbnRlcmZhY2UgYnkgaXRzIE1BQyBhZGRyZXNzLgorCSAgUmVuYW1lZCBpbnRlcmZhY2VzIE1VU1QgYmUgaW4gdGhlIGRvd24gc3RhdGUuCisJICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBmaWxlIChkZWZhdWx0OiAvZXRjL21hY3RhYikKKwkgIHdpdGggbGlzdCBvZiBuZXcgaW50ZXJmYWNlIG5hbWVzIGFuZCBNQUNzLgorCSAgTWF4aW11bSBpbnRlcmZhY2UgbmFtZSBsZW5ndGg6IElGTkFNU0laID0gMTYKKwkgIEZpbGUgZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2Ugb3IgdGFiLgorCSAgRmlsZSBmb3JtYXQ6CisJICAjIENvbW1lbnQKKwkgIG5ld19pbnRlcmZhY2VfbmFtZSAgICBYWDpYWDpYWDpYWDpYWDpYWAorCitjb25maWcgRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwlib29sICJFeHRlbmRlZCBuYW1laWYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBOQU1FSUYKKwloZWxwCisJICBUaGlzIGV4dGVuZHMgdGhlIG5hbWVpZiBzeW50YXggdG8gc3VwcG9ydCB0aGUgYnVzX2luZm8sIGRyaXZlciwKKwkgIHBoeWFkZHIgc2VsZWN0b3JzLiBUaGUgc3ludGF4IGlzIGNvbXBhdGlibGUgdG8gdGhlIG5vcm1hbCBuYW1laWYuCisJICBGaWxlIGZvcm1hdDoKKwkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBkcml2ZXI9YXNpeCBidXM9dXNiLTAwMDA6MDA6MDguMi0zCisJICAgIG5ld19pbnRlcmZhY2VfbmFtZSAgYnVzPXVzYi0wMDAwOjAwOjA4LjItMyAwMDo4MDpDODozODo5MTpCNQorCSAgICBuZXdfaW50ZXJmYWNlX25hbWUgIHBoeV9hZGRyZXNzPTIgMDA6ODA6Qzg6Mzg6OTE6QjUKKwkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBtYWM9MDA6ODA6Qzg6Mzg6OTE6QjUKKwkgICAgbmV3X2ludGVyZmFjZV9uYW1lICAwMDo4MDpDODozODo5MTpCNQorY29uZmlnIE5CRENMSUVOVAorCWJvb2wgIm5iZC1jbGllbnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTmV0d29yayBibG9jayBkZXZpY2UgY2xpZW50Citjb25maWcgTkMKKwlib29sICJuYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBBIHNpbXBsZSBVbml4IHV0aWxpdHkgd2hpY2ggcmVhZHMgYW5kIHdyaXRlcyBkYXRhIGFjcm9zcyBuZXR3b3JrCisJICBjb25uZWN0aW9ucy4KKworY29uZmlnIE5DX1NFUlZFUgorCWJvb2wgIk5ldGNhdCBzZXJ2ZXIgb3B0aW9ucyAoLWwpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTkMKKwloZWxwCisJICBBbGxvdyBuZXRjYXQgdG8gYWN0IGFzIGEgc2VydmVyLgorCitjb25maWcgTkNfRVhUUkEKKwlib29sICJOZXRjYXQgZXh0ZW5zaW9ucyAoLWVpdyBhbmQgZmlsZW5hbWUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTkMKKwloZWxwCisJICBBZGQgLWUgKHN1cHBvcnQgZm9yIGV4ZWN1dGluZyB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBsaW5lIGFmdGVyCisJICBtYWtpbmcgb3IgcmVjZWl2aW5nIGEgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uKSwgLWkgKGRlbGF5IGludGVydmFsIGZvcgorCSAgbGluZXMgc2VudCksIC13ICh0aW1lb3V0IGZvciBpbml0aWFsIGNvbm5lY3Rpb24pLgorCitjb25maWcgTkNfMTEwX0NPTVBBVAorCWJvb2wgIk5ldGNhdCAxLjEwIGNvbXBhdGliaWxpdHkgKCsyLjVrKSIKKwlkZWZhdWx0IG4gICMgb2ZmIHNwZWNpYWxseSBmb3IgUm9iCisJZGVwZW5kcyBvbiBOQworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIG5jIGNsb3NlbHkgZm9sbG93IG9yaWdpbmFsIG5jLTEuMTAuCisJICBUaGUgY29kZSBpcyBhYm91dCAyLjVrIGJpZ2dlci4gSXQgZW5hYmxlcworCSAgLXMgQUREUiwgLW4sIC11LCAtdiwgLW8gRklMRSwgLXogb3B0aW9ucywgYnV0IGxvc2VzCisJICBidXN5Ym94LXNwZWNpZmljIGV4dGVuc2lvbnM6IC1mIEZJTEUgYW5kIC1sbC4KK2NvbmZpZyBQSU5HCisJYm9vbCAicGluZyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBwaW5nIHVzZXMgdGhlIElDTVAgcHJvdG9jb2wncyBtYW5kYXRvcnkgRUNIT19SRVFVRVNUIGRhdGFncmFtIHRvCisJICBlbGljaXQgYW4gSUNNUCBFQ0hPX1JFU1BPTlNFIGZyb20gYSBob3N0IG9yIGdhdGV3YXkuCisKK2NvbmZpZyBQSU5HNgorCWJvb2wgInBpbmc2IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUFY2ICYmIFBJTkcKKwloZWxwCisJICBUaGlzIHdpbGwgZ2l2ZSB5b3UgYSBwaW5nIHRoYXQgY2FuIHRhbGsgSVB2Ni4KKworY29uZmlnIEZFQVRVUkVfRkFOQ1lfUElORworCWJvb2wgIkVuYWJsZSBmYW5jeSBwaW5nIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBJTkcKKwloZWxwCisJICBNYWtlIHRoZSBvdXRwdXQgZnJvbSB0aGUgcGluZyBhcHBsZXQgaW5jbHVkZSBzdGF0aXN0aWNzLCBhbmQgYXQgdGhlCisJICBzYW1lIHRpbWUgcHJvdmlkZSBmdWxsIHN1cHBvcnQgZm9yIElDTVAgcGFja2V0cy4KK2NvbmZpZyBXSE9JUworCWJvb2wgIndob2lzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHdob2lzIGlzIGEgY2xpZW50IGZvciB0aGUgd2hvaXMgZGlyZWN0b3J5IHNlcnZpY2UKKworY29uZmlnIEZFQVRVUkVfSVBWNgorCWJvb2wgIkVuYWJsZSBJUHY2IHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIElQdjYgc3VwcG9ydCBpbiBidXN5Ym94LgorCSAgVGhpcyBhZGRzIElQdjYgc3VwcG9ydCBpbiB0aGUgbmV0d29ya2luZyBhcHBsZXRzLgorCitjb25maWcgRkVBVFVSRV9VTklYX0xPQ0FMCisJYm9vbCAiRW5hYmxlIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0ICh1c3VhbGx5IG5vdCBuZWVkZWQpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCBpbiBhbGwgYnVzeWJveCBuZXR3b3JraW5nCisJICBhcHBsZXRzLiAgQWRkcmVzcyBvZiB0aGUgZm9ybSBsb2NhbDovcGF0aC90by91bml4L3NvY2tldAorCSAgd2lsbCBiZSByZWNvZ25pemVkLgorCisJICBUaGlzIGV4dGVuc2lvbiBpcyBhbG1vc3QgbmV2ZXIgdXNlZCBpbiByZWFsIHdvcmxkIHVzYWdlLgorCSAgWW91IG1vc3QgbGlrZWx5IHdhbnQgdG8gc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MKKwlib29sICJQcmVmZXIgSVB2NCBhZGRyZXNzZXMgZnJvbSBETlMgcXVlcmllcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBWNgorCWhlbHAKKwkgIFVzZSBJUHY0IGFkZHJlc3Mgb2YgbmV0d29yayBob3N0IGlmIGl0IGhhcyBvbmUuCisKKwkgIElmIHRoaXMgb3B0aW9uIGlzIG9mZiwgdGhlIGZpcnN0IHJldHVybmVkIGFkZHJlc3Mgd2lsbCBiZSB1c2VkLgorCSAgVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiB5b3VyIEROUyBzZXJ2ZXIgaXMgSVB2Ni1jYXBhYmxlIGFuZAorCSAgaXMgcmV0dXJuaW5nIElQdjYgaG9zdCBhZGRyZXNzZXMgdG9vLiBJZiBJUHY2IGFkZHJlc3MKKwkgIHByZWNlZGVzIElQdjQgb25lIGluIEROUyByZXBseSwgYnVzeWJveCBuZXR3b3JrIGFwcGxldHMKKwkgIChlLmcuIHdnZXQpIHdpbGwgdXNlIElQdjYgYWRkcmVzcy4gT24gYW4gSVB2Ni1pbmNhcGFibGUgaG9zdAorCSAgb3IgbmV0d29yayBhcHBsZXRzIHdpbGwgZmFpbCB0byBjb25uZWN0IHRvIHRoZSBob3N0CisJICB1c2luZyBJUHY2IGFkZHJlc3MuCisKK2NvbmZpZyBWRVJCT1NFX1JFU09MVVRJT05fRVJST1JTCisJYm9vbCAiVmVyYm9zZSByZXNvbHV0aW9uIGVycm9ycyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggc2ltcGxpc3RpYworCSAgImNhbid0IHJlc29sdmUgJ2hvc3RuYW1lLmNvbSciIGFuZCB3YW50IHRvIGtub3cgbW9yZS4KKwkgIFRoaXMgbWF5IGluY3JlYXNlIHNpemUgb2YgeW91ciBleGVjdXRhYmxlIGEgYml0LgorCitjb25maWcgQVJQCisJYm9vbCAiYXJwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIE1hbmlwdWxhdGUgdGhlIHN5c3RlbSBBUlAgY2FjaGUuCisKK2NvbmZpZyBBUlBJTkcKKwlib29sICJhcnBpbmciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgUGluZyBob3N0cyBieSBBUlAgcGFja2V0cy4KKworY29uZmlnIEJSQ1RMCisJYm9vbCAiYnJjdGwiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgTWFuYWdlIGV0aGVybmV0IGJyaWRnZXMuCisJICBTdXBwb3J0cyBhZGRici9kZWxiciBhbmQgYWRkaWYvZGVsaWYuCisKK2NvbmZpZyBGRUFUVVJFX0JSQ1RMX0ZBTkNZCisJYm9vbCAiRmFuY3kgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJSQ1RMCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIGV4dGVuZGVkIG9wdGlvbiBsaWtlOgorCSAgICBzZXRhZ2VpbmcsIHNldGZkLCBzZXRoZWxsbywgc2V0bWF4YWdlLAorCSAgICBzZXRwYXRoY29zdCwgc2V0cG9ydHByaW8sIHNldGJyaWRnZXByaW8sCisJICAgIHN0cAorCSAgVGhpcyBhZGRzIGFib3V0IDYwMCBieXRlcy4KKworY29uZmlnIEZFQVRVUkVfQlJDVExfU0hPVworCWJvb2wgIlN1cHBvcnQgc2hvdywgc2hvd21hYyBhbmQgc2hvd3N0cCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJSQ1RMICYmIEZFQVRVUkVfQlJDVExfRkFOQ1kKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igb3B0aW9uIHdoaWNoIHByaW50cyB0aGUgY3VycmVudCBjb25maWc6CisJICAgIHNob3dtYWNzLCBzaG93c3RwLCBzaG93CisKK2NvbmZpZyBETlNECisJYm9vbCAiZG5zZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTbWFsbCBhbmQgc3RhdGljIEROUyBzZXJ2ZXIgZGFlbW9uLgorCitjb25maWcgRVRIRVJfV0FLRQorCWJvb2wgImV0aGVyLXdha2UiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU2VuZCBhIG1hZ2ljIHBhY2tldCB0byB3YWtlIHVwIHNsZWVwaW5nIG1hY2hpbmVzLgorCitjb25maWcgRkFLRUlERU5URAorCWJvb2wgImZha2VpZGVudGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgZmFrZWlkZW50ZCBsaXN0ZW5zIG9uIHRoZSBpZGVudCBwb3J0IGFuZCByZXR1cm5zIGEgcHJlZGVmaW5lZAorCSAgZmFrZSB2YWx1ZSBvbiBhbnkgcXVlcnkuCisKK2NvbmZpZyBGVFBECisJYm9vbCAiZnRwZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzaW1wbGUgRlRQIGRhZW1vbi4gWW91IGhhdmUgdG8gcnVuIGl0IHZpYSBpbmV0ZC4KKworY29uZmlnIEZFQVRVUkVfRlRQX1dSSVRFCisJYm9vbCAiRW5hYmxlIHVwbG9hZCBjb21tYW5kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZUUEQKKwloZWxwCisJICBFbmFibGUgYWxsIGtpbmRzIG9mIEZUUCB1cGxvYWQgY29tbWFuZHMgKC13IG9wdGlvbikKKworY29uZmlnIEZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QKKwlib29sICJFbmFibGUgd29ya2Fyb3VuZCBmb3IgUkZDLXZpb2xhdGluZyBjbGllbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRlRQRAorCWhlbHAKKwkgIFNvbWUgZnRwIGNsaWVudHMgKGFtb25nIHRoZW0gS0RFJ3MgS29ucXVlcm9yKSBpc3N1ZSBpbGxlZ2FsCisJICAiTElTVCAtbCIgcmVxdWVzdHMuIFRoaXMgb3B0aW9uIHdvcmtzIGFyb3VuZCBzdWNoIHByb2JsZW1zLgorCSAgSXQgbWlnaHQgcHJldmVudCB5b3UgZnJvbSBsaXN0aW5nIGZpbGVzIHN0YXJ0aW5nIHdpdGggIi0iIGFuZAorCSAgaXQgaW5jcmVhc2VzIHRoZSBjb2RlIHNpemUgYnkgfjQwIGJ5dGVzLgorCSAgTW9zdCBvdGhlciBmdHAgc2VydmVycyBzZWVtIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIHRoaXMuCisKK2NvbmZpZyBGVFBHRVQKKwlib29sICJmdHBnZXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmV0cmlldmUgYSByZW1vdGUgZmlsZSB2aWEgRlRQLgorCitjb25maWcgRlRQUFVUCisJYm9vbCAiZnRwcHV0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN0b3JlIGEgcmVtb3RlIGZpbGUgdmlhIEZUUC4KKworY29uZmlnIEZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMgaW4gZnRwZ2V0L2Z0cHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPTkdfT1BUUyAmJiAoRlRQR0VUIHx8IEZUUFBVVCkKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIGZ0cGdldC9mdHBwdXQgYXBwbGV0LgorCitjb25maWcgSE9TVE5BTUUKKwlib29sICJob3N0bmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTaG93IG9yIHNldCB0aGUgc3lzdGVtJ3MgaG9zdCBuYW1lLgorCitjb25maWcgSFRUUEQKKwlib29sICJodHRwZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXJ2ZSB3ZWIgcGFnZXMgdmlhIGFuIEhUVFAgc2VydmVyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlib29sICJTdXBwb3J0ICdSYW5nZXM6JyBoZWFkZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIE1ha2VzIGh0dHBkIGVtaXQgIkFjY2VwdC1SYW5nZXM6IGJ5dGVzIiBoZWFkZXIgYW5kIHVuZGVyc3RhbmQKKwkgICJSYW5nZTogYnl0ZXM9Tk5OLVtNTU1dIiBoZWFkZXIuIEFsbG93cyBmb3IgcmVzdW1pbmcgaW50ZXJydXB0ZWQKKwkgIGRvd25sb2Fkcywgc2Vla2luZyBpbiBtdWx0aW1lZGlhIHBsYXllcnMgZXRjLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUKKwlib29sICJVc2Ugc2VuZGZpbGUgc3lzdGVtIGNhbGwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFdoZW4gZW5hYmxlZCwgaHR0cGQgd2lsbCB1c2UgdGhlIGtlcm5lbCBzZW5kZmlsZSgpIGZ1bmN0aW9uCisJICBpbnN0ZWFkIG9mIHJlYWQvd3JpdGUgbG9vcC4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfU0VUVUlECisJYm9vbCAiRW5hYmxlIC11IDx1c2VyPiBvcHRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB0aGUgc2VydmVyIHRvIHJ1biBhcyBhIHNwZWNpZmljIHVzZXIKKwkgIHJhdGhlciB0aGFuIGRlZmF1bHRpbmcgdG8gdGhlIHVzZXIgdGhhdCBzdGFydHMgdGhlIHNlcnZlci4KKwkgIFVzZSBvZiB0aGlzIG9wdGlvbiByZXF1aXJlcyBzcGVjaWFsIHByaXZpbGVnZXMgdG8gY2hhbmdlIHRvIGEKKwkgIGRpZmZlcmVudCB1c2VyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJYm9vbCAiRW5hYmxlIEJhc2ljIGh0dHAgQXV0aGVudGljYXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFV0aWxpemVzIHBhc3N3b3JkIHNldHRpbmdzIGZyb20gL2V0Yy9odHRwZC5jb25mIGZvciBiYXNpYworCSAgYXV0aGVudGljYXRpb24gb24gYSBwZXIgdXJsIGJhc2lzLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9BVVRIX01ENQorCWJvb2wgIlN1cHBvcnQgTUQ1IGNyeXB0ZWQgcGFzc3dvcmRzIGZvciBodHRwIEF1dGhlbnRpY2F0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJaGVscAorCSAgRW5hYmxlcyBiYXNpYyBwZXIgVVJMIGF1dGhlbnRpY2F0aW9uIGZyb20gL2V0Yy9odHRwZC5jb25mCisJICB1c2luZyBtZDUgcGFzc3dvcmRzLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9DR0kKKwlib29sICJTdXBwb3J0IENvbW1vbiBHYXRld2F5IEludGVyZmFjZSAoQ0dJKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHNjcmlwdHMgYW5kIGV4ZWN1dGFibGVzIHRvIGJlIGludm9rZWQKKwkgIHdoZW4gc3BlY2lmaWMgVVJMcyBhcmUgcmVxdWVzdGVkLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCWJvb2wgIlN1cHBvcnQgZm9yIHJ1bm5pbmcgc2NyaXB0cyB0aHJvdWdoIGFuIGludGVycHJldGVyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9DR0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHJ1bm5pbmcgc2NyaXB0cyB0aHJvdWdoIGFuCisJICBpbnRlcnByZXRlci4gVHVybiB0aGlzIG9uIGlmIHlvdSB3YW50IFBIUCBzY3JpcHRzIHRvIHdvcmsKKwkgIHByb3Blcmx5LiBZb3UgbmVlZCB0byBzdXBwbHkgYW4gYWRkaXRpb25hbCBsaW5lIGluIHlvdXIgaHR0cGQKKwkgIGNvbmZpZyBmaWxlOgorCSAgKi5waHA6L3BhdGgvdG8veW91ci9waHAKKworY29uZmlnIEZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVgorCWJvb2wgIlNldCBSRU1PVEVfUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgQ0dJIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9DR0kKKwloZWxwCisJICBVc2Ugb2YgdGhpcyBvcHRpb24gY2FuIGFzc2lzdCBzY3JpcHRzIGluIGdlbmVyYXRpbmcKKwkgIHJlZmVyZW5jZXMgdGhhdCBjb250YWluIGEgdW5pcXVlIHBvcnQgbnVtYmVyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUgorCWJvb2wgIkVuYWJsZSAtZSBvcHRpb24gKHVzZWZ1bCBmb3IgQ0dJcyB3cml0dGVuIGFzIHNoZWxsIHNjcmlwdHMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgaHRtbCBlbmNvZGluZyBvZiBhcmJpdHJhcnkgc3RyaW5ncyBmb3IgZGlzcGxheQorCSAgYnkgdGhlIGJyb3dzZXIuIE91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKwkgIEZvciBleGFtcGxlLCBodHRwZCAtZSAiPEhlbGxvIFdvcmxkPiIgcHJvZHVjZXMKKwkgICImIzYwSGVsbG8mIzMyV29ybGQmIzYyIi4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwlib29sICJTdXBwb3J0IGZvciBjdXN0b20gZXJyb3IgcGFnZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGVmaW5lIGN1c3RvbSBlcnJvciBwYWdlcyBpbgorCSAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEhUVFAgc3RhdHVzCisJICBlcnJvciBwYWdlcy4gRm9yIGluc3RhbmNlLCBpZiB5b3UgYWRkIHRoZSBsaW5lOgorCSAgICAgICAgRTQwNDovcGF0aC9lNDA0Lmh0bWwKKwkgIGluIHRoZSBjb25maWcgZmlsZSwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdGhlIHNwZWNpZmllZAorCSAgJy9wYXRoL2U0MDQuaHRtbCcgZmlsZSBpbnN0ZWFkIG9mIHRoZSB0ZXJzZSAnNDA0IE5PVCBGT1VORCcKKwkgIG1lc3NhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1BST1hZCisJYm9vbCAiU3VwcG9ydCBmb3IgcmV2ZXJzZSBwcm94eSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWZpbmUgVVJMcyB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkCisJICB0byBhbm90aGVyIEhUVFAgc2VydmVyLiBUbyBzZXR1cCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZQorCSAgY29uZmlndXJhdGlvbiBmaWxlCisJICAgICAgICBQOi91cmwvOmh0dHA6Ly9ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGgvCisJICBUaGVuIGEgcmVxdWVzdCB0byAvdXJsL215ZmlsZSB3aWxsIGJlIGZvcndhcmRlZCB0bworCSAgaHR0cDovL2hvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aC9teWZpbGUuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0daSVAKKwlib29sICJTdXBwb3J0IGZvciBHWklQIGNvbnRlbnQgZW5jb2RpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIE1ha2VzIGh0dHBkIHNlbmQgZmlsZXMgdXNpbmcgR1pJUCBjb250ZW50IGVuY29kaW5nIGlmIHRoZQorCSAgY2xpZW50IHN1cHBvcnRzIGl0IGFuZCBhIHByZS1jb21wcmVzc2VkIDxmaWxlPi5neiBleGlzdHMuCisKK2NvbmZpZyBJRkNPTkZJRworCWJvb2wgImlmY29uZmlnIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIElmY29uZmlnIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBrZXJuZWwtcmVzaWRlbnQgbmV0d29yayBpbnRlcmZhY2VzLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMKKwlib29sICJFbmFibGUgc3RhdHVzIHJlcG9ydGluZyBvdXRwdXQgKCs3aykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIElmIGlmY29uZmlnIGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBpdCB3aWxsIGRpc3BsYXkgdGhlIHN0YXR1cworCSAgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW50ZXJmYWNlcy4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfU0xJUAorCWJvb2wgIkVuYWJsZSBzbGlwLXNwZWNpZmljIG9wdGlvbnMgXCJrZWVwYWxpdmVcIiBhbmQgXCJvdXRmaWxsXCIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIEFsbG93ICJrZWVwYWxpdmUiIGFuZCAib3V0ZmlsbCIgc3VwcG9ydCBmb3IgU0xJUC4gSWYgeW91J3JlIG5vdAorCSAgcGxhbm5pbmcgb24gdXNpbmcgc2VyaWFsIGxpbmVzLCBsZWF2ZSB0aGlzIHVuY2hlY2tlZC4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCWJvb2wgIkVuYWJsZSBvcHRpb25zIFwibWVtX3N0YXJ0XCIsIFwiaW9fYWRkclwiLCBhbmQgXCJpcnFcIiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGQ09ORklHCisJaGVscAorCSAgQWxsb3cgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHNoYXJlZCBtZW1vcnksIHN0YXJ0IGFkZHJlc3MgZm9yIEkvTywKKwkgIGFuZC9vciB0aGUgaW50ZXJydXB0IGxpbmUgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGRldmljZS4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfSFcKKwlib29sICJFbmFibGUgb3B0aW9uIFwiaHdcIiAoZXRoZXIgb25seSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIFNldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZSwgaWYgdGhlIGRldmljZSBkcml2ZXIKKwkgIHN1cHBvcnRzICB0aGlzICBvcGVyYXRpb24uIEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRoZSAnZXRoZXInCisJICBjbGFzcy4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwlib29sICJTZXQgdGhlIGJyb2FkY2FzdCBhdXRvbWF0aWNhbGx5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZDT05GSUcKKwloZWxwCisJICBTZXR0aW5nIHRoaXMgd2lsbCBtYWtlIGlmY29uZmlnIGF0dGVtcHQgdG8gZmluZCB0aGUgYnJvYWRjYXN0CisJICBhdXRvbWF0aWNhbGx5IGlmIHRoZSB2YWx1ZSAnKycgaXMgdXNlZC4KKworY29uZmlnIElGRU5TTEFWRQorCWJvb2wgImlmZW5zbGF2ZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gYmluZCBzZXZlcmFsIGludGVyZmFjZXMKKwkgIHRvIGEgbG9naWNhbCBpbnRlcmZhY2UgKHVzZSB3aXRoIGtlcm5lbCBib25kaW5nIGRyaXZlcikuCisKK2NvbmZpZyBJRlBMVUdECisJYm9vbCAiaWZwbHVnZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBOZXR3b3JrIGludGVyZmFjZSBwbHVnIGRldGVjdGlvbiBkYWVtb24uCisKK2NvbmZpZyBJRlVQRE9XTgorCWJvb2wgImlmdXBkb3duIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2VzLiBUaGlzIGFwcGxldCBtYWtlcworCSAgdXNlIG9mIGVpdGhlciAiaWZjb25maWciIGFuZCAicm91dGUiIG9yIHRoZSAiaXAiIGNvbW1hbmQgdG8gYWN0dWFsbHkKKwkgIGNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZXMuIFRoZXJlZm9yZSwgeW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50CisJICB0byBlbmFibGUgZWl0aGVyIElGQ09ORklHIGFuZCBST1VURSwgb3IgZW5hYmxlCisJICBGRUFUVVJFX0lGVVBET1dOX0lQIGFuZCB0aGUgdmFyaW91cyBJUCBvcHRpb25zLiBPZgorCSAgY291cnNlIHlvdSBjb3VsZCB1c2Ugbm9uLWJ1c3lib3ggdmVyc2lvbnMgb2YgdGhlc2UgcHJvZ3JhbXMsIHNvCisJICBhZ2FpbnN0IG15IGJldHRlciBqdWRnZW1lbnQgKHNpbmNlIHRoaXMgd2lsbCBzdXJlbHkgcmVzdWx0IGluIHBsZW50eQorCSAgb2Ygc3VwcG9ydCBxdWVzdGlvbnMgb24gdGhlIG1haWxpbmcgbGlzdCksIEkgZG8gbm90IGZvcmNlIHlvdSB0bworCSAgZW5hYmxlIHRoZXNlIGFkZGl0aW9uYWwgb3B0aW9ucy4gSXQgaXMgdXAgdG8geW91IHRvIHN1cHBseSBlaXRoZXIKKwkgICJpZmNvbmZpZyIsICJyb3V0ZSIgYW5kICJydW4tcGFydHMiIG9yIHRoZSAiaXAiIGNvbW1hbmQsIGVpdGhlcgorCSAgdmlhIGJ1c3lib3ggb3IgdmlhIHN0YW5kYWxvbmUgdXRpbGl0aWVzLgorCitjb25maWcgSUZVUERPV05fSUZTVEFURV9QQVRICisJc3RyaW5nICJBYnNvbHV0ZSBwYXRoIHRvIGlmc3RhdGUgZmlsZSIKKwlkZWZhdWx0ICIvdmFyL3J1bi9pZnN0YXRlIgorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBpZnVwZG93biBrZWVwcyBzdGF0ZSBpbmZvcm1hdGlvbiBpbiBhIGZpbGUgY2FsbGVkIGlmc3RhdGUuCisJICBUeXBpY2FsbHkgaXQgaXMgbG9jYXRlZCBpbiAvdmFyL3J1bi9pZnN0YXRlLCBob3dldmVyCisJICBzb21lIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBwdXQgaXQgaW4gb3RoZXIgcGxhY2VzCisJICAoZGViaWFuLCBmb3IgZXhhbXBsZSwgdXNlcyAvZXRjL25ldHdvcmsvcnVuL2lmc3RhdGUpLgorCSAgVGhpcyBjb25maWcgb3B0aW9uIGRlZmluZXMgbG9jYXRpb24gb2YgaWZzdGF0ZS4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVAKKwlib29sICJVc2UgaXAgYXBwbGV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBVc2UgdGhlIGlwcm91dGUgImlwIiBjb21tYW5kIHRvIGltcGxlbWVudCAiaWZ1cCIgYW5kICJpZmRvd24iLCByYXRoZXIKKwkgIHRoYW4gdGhlIGRlZmF1bHQgb2YgdXNpbmcgdGhlIG9sZGVyICdpZmNvbmZpZycgYW5kICdyb3V0ZScgdXRpbGl0aWVzLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOCisJYm9vbCAiVXNlIGJ1c3lib3ggaXAgYXBwbGV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JRlVQRE9XTl9JUAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBJUAorCXNlbGVjdCBGRUFUVVJFX0lQX0FERFJFU1MKKwlzZWxlY3QgRkVBVFVSRV9JUF9MSU5LCisJc2VsZWN0IEZFQVRVUkVfSVBfUk9VVEUKKwloZWxwCisJICBVc2UgdGhlIGJ1c3lib3ggaXByb3V0ZSAiaXAiIGFwcGxldCB0byBpbXBsZW1lbnQgImlmdXBkb3duIi4KKworCSAgSWYgbGVmdCBkaXNhYmxlZCwgeW91IG11c3QgaW5zdGFsbCB0aGUgZnVsbC1ibG93biBpcHJvdXRlMgorCSAgdXRpbGl0eSBvciB0aGUgICJpZnVwIiBhbmQgImlmZG93biIgYXBwbGV0cyB3aWxsIG5vdCB3b3JrLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOCisJYm9vbCAiVXNlIGJ1c3lib3ggaWZjb25maWcgYW5kIHJvdXRlIGFwcGxldHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBJRlVQRE9XTiAmJiAhRkVBVFVSRV9JRlVQRE9XTl9JUAorCXNlbGVjdCBJRkNPTkZJRworCXNlbGVjdCBST1VURQorCWhlbHAKKwkgIFVzZSB0aGUgYnVzeWJveCBpcHJvdXRlICJpZmNvbmZpZyIgYW5kICJyb3V0ZSIgYXBwbGV0cyB0bworCSAgaW1wbGVtZW50IHRoZSAiaWZ1cCIgYW5kICJpZmRvd24iIHV0aWxpdGllcy4KKworCSAgSWYgbGVmdCBkaXNhYmxlZCwgeW91IG11c3QgaW5zdGFsbCB0aGUgZnVsbC1ibG93biBpZmNvbmZpZworCSAgYW5kIHJvdXRlIHV0aWxpdGllcywgb3IgdGhlICAiaWZ1cCIgYW5kICJpZmRvd24iIGFwcGxldHMgd2lsbCBub3QKKwkgIHdvcmsuCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQVjQKKwlib29sICJTdXBwb3J0IGZvciBJUHY0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBJZiB5b3Ugd2FudCBpZnVwL2lmZG93biB0byB0YWxrIElQdjQsIGxlYXZlIHRoaXMgb24uCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQVjYKKwlib29sICJTdXBwb3J0IGZvciBJUHY2IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04gJiYgRkVBVFVSRV9JUFY2CisJaGVscAorCSAgSWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgSVB2NiwgdHVybiB0aGlzIG9wdGlvbiBvbi4KKworIyMjIFVOVVNFRAorIyMjY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVBYCisjIyMJYm9vbCAiU3VwcG9ydCBmb3IgSVBYIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gSUZVUERPV04KKyMjIwloZWxwCisjIyMJICBJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCB5b3UgY2FuIHVzZSBidXN5Ym94IHRvIHdvcmsgd2l0aCBJUFgKKyMjIwkgIG5ldHdvcmtzLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisJYm9vbCAiRW5hYmxlIG1hcHBpbmcgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGVVBET1dOCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSAibWFwcGluZyIgc3RhbnphLCB1bmxlc3MgeW91IGhhdmUKKwkgIGEgd2VpcmQgbmV0d29yayBzZXR1cCB5b3UgZG9uJ3QgbmVlZCBpdC4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUAorCWJvb2wgIlN1cHBvcnQgZm9yIGV4dGVybmFsIGRoY3AgY2xpZW50cyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElGVVBET1dOCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBleHRlcm5hbCBkaGNwIGNsaWVudHMuIENsaWVudHMgYXJlCisJICB0cmllZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiBkaGNwY2QsIGRoY2xpZW50LCBwdW1wIGFuZCB1ZGhjcGMuCisJICBPdGhlcndpc2UsIGlmIHVkaGNwYyBhcHBsZXQgaXMgZW5hYmxlZCwgaXQgaXMgdXNlZC4KKwkgIE90aGVyd2lzZSwgaWZ1cC9pZmRvd24gd2lsbCBoYXZlIG5vIHN1cHBvcnQgZm9yIERIQ1AuCisKK2NvbmZpZyBJTkVURAorCWJvb2wgImluZXRkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIEludGVybmV0IHN1cGVyc2VydmVyIGRhZW1vbgorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITworCWJvb2wgIlN1cHBvcnQgZWNobyBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBFY2hvIHJlY2VpdmVkIGRhdGEgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRAorCWJvb2wgIlN1cHBvcnQgZGlzY2FyZCBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBJbnRlcm5ldCAvZGV2L251bGwgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRQorCWJvb2wgIlN1cHBvcnQgdGltZSBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBSZXR1cm4gMzIgYml0IHRpbWUgc2luY2UgMTkwMCBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCisJYm9vbCAiU3VwcG9ydCBkYXl0aW1lIHNlcnZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCWhlbHAKKwkgIFJldHVybiBodW1hbi1yZWFkYWJsZSB0aW1lIGludGVybmFsIGluZXRkIHNlcnZpY2UKKworY29uZmlnIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KKwlib29sICJTdXBwb3J0IGNoYXJnZW4gc2VydmljZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElORVRECisJaGVscAorCSAgRmFtaWxpYXIgY2hhcmFjdGVyIGdlbmVyYXRvciBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1JQQworCWJvb2wgIlN1cHBvcnQgUlBDIHNlcnZpY2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwlzZWxlY3QgRkVBVFVSRV9IQVZFX1JQQworCWhlbHAKKwkgIFN1cHBvcnQgU3VuLVJQQyBiYXNlZCBzZXJ2aWNlcworCitjb25maWcgSVAKKwlib29sICJpcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgImlwIiBhcHBsZXQgaXMgYSBUQ1AvSVAgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gYW5kIHJvdXRpbmcKKwkgIHV0aWxpdHkuIFlvdSBnZW5lcmFsbHkgZG9uJ3QgbmVlZCAiaXAiIHRvIHVzZSBidXN5Ym94IHdpdGgKKwkgIFRDUC9JUC4KKworY29uZmlnIEZFQVRVUkVfSVBfQUREUkVTUworCWJvb2wgImlwIGFkZHJlc3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFkZHJlc3MgbWFuaXB1bGF0aW9uIHN1cHBvcnQgZm9yIHRoZSAiaXAiIGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfSVBfTElOSworCWJvb2wgImlwIGxpbmsiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIENvbmZpZ3VyZSBuZXR3b3JrIGRldmljZXMgd2l0aCAiaXAiLgorCitjb25maWcgRkVBVFVSRV9JUF9ST1VURQorCWJvb2wgImlwIHJvdXRlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IHRvICJpcCIuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1RVTk5FTAorCWJvb2wgImlwIHR1bm5lbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHR1bm5lbGluZyBjb21tYW5kcyB0byAiaXAiLgorCitjb25maWcgRkVBVFVSRV9JUF9SVUxFCisJYm9vbCAiaXAgcnVsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHJ1bGUgY29tbWFuZHMgdG8gImlwIi4KKworY29uZmlnIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMKKwlib29sICJTdXBwb3J0IHNob3J0IGZvcm1zIG9mIGlwIGNvbW1hbmRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBbHNvIHN1cHBvcnQgc2hvcnQtZm9ybSBvZiBpcCA8T0JKRUNUPiBjb21tYW5kczoKKwkgIGlwIGFkZHIgICAtPiBpcGFkZHIKKwkgIGlwIGxpbmsgICAtPiBpcGxpbmsKKwkgIGlwIHJvdXRlICAtPiBpcHJvdXRlCisJICBpcCB0dW5uZWwgLT4gaXB0dW5uZWwKKwkgIGlwIHJ1bGUgICAtPiBpcHJ1bGUKKworCSAgU2F5IE4gdW5sZXNzIHlvdSBkZXNwYXJhdGVseSBuZWVkIHRoZSBzaG9ydCBmb3JtIG9mIHRoZSBpcAorCSAgb2JqZWN0IGNvbW1hbmRzLgorCitjb25maWcgRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUworCWJvb2wgIlN1cHBvcnQgZGlzcGxheWluZyByYXJlbHkgdXNlZCBsaW5rIHR5cGVzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBJZiB5b3UgYXJlIG5vdCBnb2luZyB0byB1c2UgbGlua3Mgb2YgdHlwZSAiZnJhZCIsICJlY29uZXQiLAorCSAgImJpZiIgZXRjLCB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBlbmFibGUgdGhpcy4KKwkgIEV0aGVybmV0LCB3aXJlbGVzcywgaW5mcmFyZWQsIHBwcC9zbGlwLCBpcCB0dW5uZWxsaW5nCisJICBsaW5rIHR5cGVzIGFyZSBzdXBwb3J0ZWQgd2l0aG91dCB0aGlzIG9wdGlvbiBzZWxlY3RlZC4KKworY29uZmlnIElQQUREUgorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9BRERSRVNTCisKK2NvbmZpZyBJUExJTksKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfTElOSworCitjb25maWcgSVBST1VURQorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9ST1VURQorCitjb25maWcgSVBUVU5ORUwKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfVFVOTkVMCisKK2NvbmZpZyBJUFJVTEUKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfUlVMRQorCitjb25maWcgSVBDQUxDCisJYm9vbCAiaXBjYWxjIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGlwY2FsYyB0YWtlcyBhbiBJUCBhZGRyZXNzIGFuZCBuZXRtYXNrIGFuZCBjYWxjdWxhdGVzIHRoZQorCSAgcmVzdWx0aW5nIGJyb2FkY2FzdCwgbmV0d29yaywgYW5kIGhvc3QgcmFuZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ0FMQ19GQU5DWQorCWJvb2wgIkZhbmN5IElQQ0FMQywgbW9yZSBvcHRpb25zLCBhZGRzIDEga2J5dGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUENBTEMKKwloZWxwCisJICBBZGRzIHRoZSBvcHRpb25zIGhvc3RuYW1lLCBwcmVmaXggYW5kIHNpbGVudCB0byB0aGUgb3V0cHV0IG9mCisJICAiaXBjYWxjIi4KKworY29uZmlnIEZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUENBTEMgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBpcGNhbGMgYXBwbGV0LgorCitjb25maWcgTkVUU1RBVAorCWJvb2wgIm5ldHN0YXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbmV0c3RhdCBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4IG5ldHdvcmtpbmcgc3Vic3lzdGVtLgorCitjb25maWcgRkVBVFVSRV9ORVRTVEFUX1dJREUKKwlib29sICJFbmFibGUgd2lkZSBuZXRzdGF0IG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5FVFNUQVQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igd2lkZSBjb2x1bW5zLiBVc2VmdWwgd2hlbiBkaXNwbGF5aW5nIElQdjYgYWRkcmVzc2VzCisJICAoLVcgb3B0aW9uKS4KKworY29uZmlnIEZFQVRVUkVfTkVUU1RBVF9QUkcKKwlib29sICJFbmFibGUgUElEL1Byb2dyYW0gbmFtZSBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBORVRTVEFUCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIC1wIGZsYWcgdG8gcHJpbnQgb3V0IFBJRCBhbmQgcHJvZ3JhbSBuYW1lLgorCSAgKzcwMCBieXRlcyBvZiBjb2RlLgorCitjb25maWcgTlNMT09LVVAKKwlib29sICJuc2xvb2t1cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBuc2xvb2t1cCBpcyBhIHRvb2wgdG8gcXVlcnkgSW50ZXJuZXQgbmFtZSBzZXJ2ZXJzLgorCitjb25maWcgTlRQRAorCWJvb2wgIm50cGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIE5UUCBjbGllbnQvc2VydmVyIGRhZW1vbi4KKworY29uZmlnIEZFQVRVUkVfTlRQRF9TRVJWRVIKKwlib29sICJNYWtlIG50cGQgdXNhYmxlIGFzIGEgTlRQIHNlcnZlciIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5UUEQKKwloZWxwCisJICBNYWtlIG50cGQgdXNhYmxlIGFzIGEgTlRQIHNlcnZlci4gSWYgeW91IGRpc2FibGUgdGhpcyBvcHRpb24KKwkgIG50cGQgd2lsbCBiZSB1c2FibGUgb25seSBhcyBhIE5UUCBjbGllbnQuCisKK2NvbmZpZyBQU0NBTgorCWJvb2wgInBzY2FuIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSBuZXR3b3JrIHBvcnQgc2Nhbm5lci4KKworY29uZmlnIFJPVVRFCisJYm9vbCAicm91dGUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgUm91dGUgZGlzcGxheXMgb3IgbWFuaXB1bGF0ZXMgdGhlIGtlcm5lbCdzIElQIHJvdXRpbmcgdGFibGVzLgorCitjb25maWcgU0xBVFRBQ0gKKwlib29sICJzbGF0dGFjaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBzbGF0dGFjaCBpcyBhIHNtYWxsIHV0aWxpdHkgdG8gYXR0YWNoIG5ldHdvcmsgaW50ZXJmYWNlcyB0byBzZXJpYWwKKwkgIGxpbmVzLgorCisjY29uZmlnIFRDCisjCWJvb2wgInRjIgorIwlkZWZhdWx0IHkKKyMJaGVscAorIwkgIHNob3cgLyBtYW5pcHVsYXRlIHRyYWZmaWMgY29udHJvbCBzZXR0aW5ncworIworI2NvbmZpZyBGRUFUVVJFX1RDX0lOR1JFU1MKKyMJZGVmX2Jvb2wgbgorIwlkZXBlbmRzIG9uIFRDCisKK2NvbmZpZyBUQ1BTVkQKKwlib29sICJ0Y3BzdmQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdGNwc3ZkIGxpc3RlbnMgb24gYSBUQ1AgcG9ydCBhbmQgcnVucyBhIHByb2dyYW0gZm9yIGVhY2ggbmV3CisJICBjb25uZWN0aW9uLgorCitjb25maWcgVEVMTkVUCisJYm9vbCAidGVsbmV0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRlbG5ldCBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIFRFTE5FVCBwcm90b2NvbCwgYnV0IGlzIGFsc28gY29tbW9ubHkKKwkgIHVzZWQgdG8gdGVzdCBvdGhlciBzaW1wbGUgcHJvdG9jb2xzLgorCitjb25maWcgRkVBVFVSRV9URUxORVRfVFRZUEUKKwlib29sICJQYXNzIFRFUk0gdHlwZSB0byByZW1vdGUgaG9zdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRFTE5FVAorCWhlbHAKKwkgIFNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBmb3J3YXJkIHRoZSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZQorCSAgcmVtb3RlIGhvc3QgeW91IGFyZSBjb25uZWN0aW5nIHRvLiBUaGlzIGlzIHVzZWZ1bCB0byBtYWtlIHN1cmUgdGhhdAorCSAgdGhpbmdzIGxpa2UgQU5TSSBjb2xvcnMgYW5kIG90aGVyIGNvbnRyb2wgc2VxdWVuY2VzIGJlaGF2ZS4KKworY29uZmlnIEZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorCWJvb2wgIlBhc3MgVVNFUiB0eXBlIHRvIHJlbW90ZSBob3N0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVMTkVUCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIGZvcndhcmQgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlCisJICByZW1vdGUgaG9zdCB5b3UgYXJlIGNvbm5lY3RpbmcgdG8uIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8KKwkgIGxvZyBpbnRvIGEgbWFjaGluZSB3aXRob3V0IHRlbGxpbmcgdGhlIHVzZXJuYW1lIChhdXRvbG9naW4pLiBUaGlzCisJICBvcHRpb24gZW5hYmxlcyBgLWEnIGFuZCBgLWwgVVNFUicgYXJndW1lbnRzLgorCitjb25maWcgVEVMTkVURAorCWJvb2wgInRlbG5ldGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgQSBkYWVtb24gZm9yIHRoZSBURUxORVQgcHJvdG9jb2wsIGFsbG93aW5nIHlvdSB0byBsb2cgb250byB0aGUgaG9zdAorCSAgcnVubmluZyB0aGUgZGFlbW9uLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIFRFTE5FVCBwcm90b2NvbAorCSAgc2VuZHMgcGFzc3dvcmRzIGluIHBsYWluIHRleHQuIElmIHlvdSBjYW4ndCBhZmZvcmQgdGhlIHNwYWNlIGZvciBhbgorCSAgU1NIIGRhZW1vbiBhbmQgeW91IHRydXN0IHlvdXIgbmV0d29yaywgeW91IG1heSBzYXkgJ3knIGhlcmUuIEFzIGEKKwkgIG1vcmUgc2VjdXJlIGFsdGVybmF0aXZlLCB5b3Ugc2hvdWxkIHNlcmlvdXNseSBjb25zaWRlciBpbnN0YWxsaW5nIHRoZQorCSAgdmVyeSBzbWFsbCBEcm9wYmVhciBTU0ggZGFlbW9uIGluc3RlYWQ6CisJCWh0dHA6Ly9tYXR0LnVjYy5hc24uYXUvZHJvcGJlYXIvZHJvcGJlYXIuaHRtbAorCisJICBOb3RlIHRoYXQgZm9yIGJ1c3lib3ggdGVsbmV0ZCB0byB3b3JrIHlvdSBuZWVkIHNldmVyYWwgdGhpbmdzOgorCSAgRmlyc3Qgb2YgYWxsLCB5b3VyIGtlcm5lbCBuZWVkczoKKwkJICBVTklYOThfUFRZUz15CisJCSAgREVWUFRTX0ZTPXkKKworCSAgTmV4dCwgeW91IG5lZWQgYSAvZGV2L3B0cyBkaXJlY3Rvcnkgb24geW91ciByb290IGZpbGVzeXN0ZW06CisKKwkJICAkIGxzIC1sZCAvZGV2L3B0cworCQkgIGRyd3hyLXhyLXggIDIgcm9vdCByb290IDAgU2VwIDIzIDEzOjIxIC9kZXYvcHRzLworCisJICBOZXh0IHlvdSBuZWVkIHRoZSBwc2V1ZG8gdGVybWluYWwgbWFzdGVyIG11bHRpcGxleGVyIC9kZXYvcHRteDoKKworCQkgICQgbHMgLWxhIC9kZXYvcHRteAorCQkgIGNydy1ydy1ydy0gIDEgcm9vdCB0dHkgNSwgMiBTZXAgMjMgMTM6NTUgL2Rldi9wdG14CisKKwkgIEFueSAvZGV2L3R0eXBbMC05XSogZmlsZXMgeW91IG1heSBoYXZlIGNhbiBiZSByZW1vdmVkLgorCSAgTmV4dCwgeW91IG5lZWQgdG8gbW91bnQgdGhlIGRldnB0cyBmaWxlc3lzdGVtIG9uIC9kZXYvcHRzIHVzaW5nOgorCisJCSAgbW91bnQgLXQgZGV2cHRzIGRldnB0cyAvZGV2L3B0cworCisJICBZb3UgbmVlZCB0byBiZSBzdXJlIHRoYXQgYnVzeWJveCBoYXMgTE9HSU4gYW5kCisJICBGRUFUVVJFX1NVSUQgZW5hYmxlZC4gQW5kIGZpbmFsbHksIHlvdSBzaG91bGQgbWFrZQorCSAgY2VydGFpbiB0aGF0IEJ1c3lib3ggaGFzIGJlZW4gaW5zdGFsbGVkIHNldHVpZCByb290OgorCisJCWNob3duIHJvb3Qucm9vdCAvYmluL2J1c3lib3gKKwkJY2htb2QgNDc1NSAvYmluL2J1c3lib3gKKworCSAgd2l0aCBhbGwgdGhhdCBkb25lLCB0ZWxuZXRkIF9zaG91bGRfIHdvcmsuLi4uCisKKworY29uZmlnIEZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJYm9vbCAiU3VwcG9ydCBzdGFuZGFsb25lIHRlbG5ldGQgKG5vdCBpbmV0ZCBvbmx5KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRFTE5FVEQKKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyB3aWxsIG1ha2UgdGVsbmV0ZCBhYmxlIHRvIHJ1biBzdGFuZGFsb25lLgorCitjb25maWcgRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQKKwlib29sICJTdXBwb3J0IC13IFNFQyBvcHRpb24gKGluZXRkIHdhaXQgbW9kZSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gcnVuIHRlbG5ldGQgaW4gImluZXQgd2FpdCIgbW9kZS4KKwkgIEV4YW1wbGUgaW5ldGQuY29uZiBsaW5lIChub3RlICJ3YWl0Iiwgbm90IHVzdWFsICJub3dhaXQiKToKKworCSAgdGVsbmV0IHN0cmVhbSB0Y3Agd2FpdCByb290IC9iaW4vdGVsbmV0ZCB0ZWxuZXRkIC13MTAKKworCSAgSW4gdGhpcyBleGFtcGxlLCBpbmV0ZCBwYXNzZXMgX2xpc3RlbmluZ18gc29ja2V0XyBhcyBmZCAwCisJICB0byB0ZWxuZXRkIHdoZW4gY29ubmVjdGlvbiBhcHBlYXJzLgorCSAgdGVsbmV0ZCB3aWxsIHdhaXQgZm9yIGNvbm5lY3Rpb25zIHVudGlsIGFsbCBleGlzdGluZworCSAgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCwgYW5kIG5vIG5ldyBjb25uZWN0aW9ucworCSAgYXBwZWFyIGR1cmluZyAxMCBzZWNvbmRzLiBUaGVuIGl0IGV4aXRzLCBhbmQgaW5ldGQgY29udGludWVzCisJICB0byBsaXN0ZW4gZm9yIG5ldyBjb25uZWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgcmFyZWx5IHVzZWQuICJ0Y3Agbm93YWl0IiBpcyBtdWNoIG1vcmUgdXN1YWwKKwkgIHdheSBvZiBydW5uaW5nIHRjcCBzZXJ2aWNlcywgaW5jbHVkaW5nIHRlbG5ldGQuCisJICBZb3UgbW9zdCBwcm9iYWJseSB3YW50IHRvIHNheSBOIGhlcmUuCisKK2NvbmZpZyBURlRQCisJYm9vbCAidGZ0cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCBjbGllbnQgcHJvZ3JhbS4gVEZUUAorCSAgaXMgdXN1YWxseSB1c2VkIGZvciBzaW1wbGUsIHNtYWxsIHRyYW5zZmVycyBzdWNoIGFzIGEgcm9vdCBpbWFnZQorCSAgZm9yIGEgbmV0d29yay1lbmFibGVkIGJvb3Rsb2FkZXIuCisKK2NvbmZpZyBURlRQRAorCWJvb2wgInRmdHBkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIHNlcnZlciBwcm9ncmFtLgorCSAgSXQgZXhwZWN0cyB0aGF0IHN0ZGluIGlzIGEgZGF0YWdyYW0gc29ja2V0IGFuZCBhIHBhY2tldAorCSAgaXMgYWxyZWFkeSBwZW5kaW5nIG9uIGl0LiBJdCB3aWxsIGV4aXQgYWZ0ZXIgb25lIHRyYW5zZmVyLgorCSAgSW4gb3RoZXIgd29yZHM6IGl0IHNob3VsZCBiZSBydW4gZnJvbSBpbmV0ZCBpbiBub3dhaXQgbW9kZSwKKwkgIG9yIGZyb20gdWRwc3ZkLiBFeGFtcGxlOiAidWRwc3ZkIC1FIDAgNjkgdGZ0cGQgRElSIgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgdGZ0cC90ZnRwZCIKKwlkZXBlbmRzIG9uIFRGVFAgfHwgVEZUUEQKKworY29uZmlnIEZFQVRVUkVfVEZUUF9HRVQKKwlib29sICJFbmFibGUgJ3RmdHAgZ2V0JyBhbmQvb3IgdGZ0cGQgdXBsb2FkIGNvZGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBHRVQgY29tbWFuZCB3aXRoaW4gdGhlIFRGVFAgY2xpZW50LiBUaGlzIGFsbG93cworCSAgYSBjbGllbnQgdG8gcmV0cmlldmUgYSBmaWxlIGZyb20gYSBURlRQIHNlcnZlci4KKwkgIEFsc28gZW5hYmxlIHVwbG9hZCBzdXBwb3J0IGluIHRmdHBkLCBpZiB0ZnRwZCBpcyBzZWxlY3RlZC4KKworCSAgTm90ZTogdGhpcyBvcHRpb24gZG9lcyBfbm90XyBtYWtlIHRmdHBkIGNhcGFibGUgb2YgZG93bmxvYWQKKwkgICh0aGUgdXN1YWwgb3BlcmF0aW9uIHBlb3BsZSBuZWVkIGZyb20gaXQpIQorCitjb25maWcgRkVBVFVSRV9URlRQX1BVVAorCWJvb2wgIkVuYWJsZSAndGZ0cCBwdXQnIGFuZC9vciB0ZnRwZCBkb3dubG9hZCBjb2RlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciB0aGUgUFVUIGNvbW1hbmQgd2l0aGluIHRoZSBURlRQIGNsaWVudC4gVGhpcyBhbGxvd3MKKwkgIGEgY2xpZW50IHRvIHRyYW5zZmVyIGEgZmlsZSB0byBhIFRGVFAgc2VydmVyLgorCSAgQWxzbyBlbmFibGUgZG93bmxvYWQgc3VwcG9ydCBpbiB0ZnRwZCwgaWYgdGZ0cGQgaXMgc2VsZWN0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJYm9vbCAiRW5hYmxlICdibGtzaXplJyBhbmQgJ3RzaXplJyBwcm90b2NvbCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCWhlbHAKKwkgIEFsbG93IHRmdHAgdG8gc3BlY2lmeSBibG9jayBzaXplLCBhbmQgdGZ0cGQgdG8gdW5kZXJzdGFuZAorCSAgImJsa3NpemUiIGFuZCAidHNpemUiIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCisJYm9vbCAiRW5hYmxlIHRmdHAgcHJvZ3Jlc3MgbWV0ZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURlRQICYmIEZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwloZWxwCisJICBTaG93IHByb2dyZXNzIGJhci4KKworY29uZmlnIFRGVFBfREVCVUcKKwlib29sICJFbmFibGUgZGVidWciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisJaGVscAorCSAgTWFrZSB0ZnRwW2RdIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcyBvbiBzdGRlcnIuCisJICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGRpYWdub3NpbmcgYSBidWcgaW4gdGZ0cFtkXS4KKworY29uZmlnIFRSQUNFUk9VVEUKKwlib29sICJ0cmFjZXJvdXRlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gdHJhY2UgdGhlIHJvdXRlIG9mIElQIHBhY2tldHMuCisKK2NvbmZpZyBUUkFDRVJPVVRFNgorCWJvb2wgInRyYWNlcm91dGU2IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUFY2ICYmIFRSQUNFUk9VVEUKKwloZWxwCisJICBVdGlsaXR5IHRvIHRyYWNlIHRoZSByb3V0ZSBvZiBJUHY2IHBhY2tldHMuCisKK2NvbmZpZyBGRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRQorCWJvb2wgIkVuYWJsZSB2ZXJib3NlIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRSQUNFUk9VVEUKKwloZWxwCisJICBBZGQgc29tZSB2ZXJib3NpdHkgdG8gdHJhY2Vyb3V0ZS4gVGhpcyBpbmNsdWRlcyBhbW9uZyBvdGhlciB0aGluZ3MKKwkgIGhvc3RuYW1lcyBhbmQgSUNNUCByZXNwb25zZSB0eXBlcy4KKworY29uZmlnIEZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlib29sICJFbmFibGUgbG9vc2Ugc291cmNlIHJvdXRlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFJBQ0VST1VURQorCWhlbHAKKwkgIEFkZCBvcHRpb24gdG8gc3BlY2lmeSBhIGxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5CisJICAoOCBtYXhpbXVtKS4KKworY29uZmlnIEZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUAorCWJvb2wgIlVzZSBJQ01QIGluc3RlYWQgb2YgVURQIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFJBQ0VST1VURQorCWhlbHAKKwkgIEFkZCBvcHRpb24gLUkgdG8gdXNlIElDTVAgRUNITyBpbnN0ZWFkIG9mIFVEUCBkYXRhZ3JhbXMuCisKK2NvbmZpZyBUVU5DVEwKKwlib29sICJ0dW5jdGwiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgdHVuY3RsIGNyZWF0ZXMgb3IgZGVsZXRlcyB0dW4gZGV2aWNlcy4KKworY29uZmlnIEZFQVRVUkVfVFVOQ1RMX1VHCisJYm9vbCAiU3VwcG9ydCBvd25lcjpncm91cCBhc3NpZ25tZW50IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVFVOQ1RMCisJaGVscAorCSAgQWxsb3cgdG8gc3BlY2lmeSBvd25lciBhbmQgZ3JvdXAgb2YgbmV3bHkgY3JlYXRlZCBpbnRlcmZhY2UuCisJICAzNDAgYnl0ZXMgb2YgcHVyZSBibG9hdC4gU2F5IG5vIGhlcmUuCisKK3NvdXJjZSBuZXR3b3JraW5nL3VkaGNwL0NvbmZpZy5pbgorCitjb25maWcgSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TCisJc3RyaW5nICJpZnVwIHVkaGNwYyBjb21tYW5kIGxpbmUgb3B0aW9ucyIKKwlkZWZhdWx0ICItUiAtbiIKKwlkZXBlbmRzIG9uIElGVVBET1dOICYmIFVESENQQworCWhlbHAKKwkgIENvbW1hbmQgbGluZSBvcHRpb25zIHRvIHBhc3MgdG8gdWRoY3BjIGZyb20gaWZ1cC4KKwkgIEludGVuZGVkIHRvIGFsdGVyIG9wdGlvbnMgbm90IGF2YWlsYWJsZSBpbiAvZXRjL25ldHdvcmsvaW50ZXJmYWNlcy4KKwkgIChJRTogLS1zeXNsb2cgLS1iYWNrZ3JvdW5kIGV0Yy4uLikKKworY29uZmlnIFVEUFNWRAorCWJvb2wgInVkcHN2ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1ZHBzdmQgbGlzdGVucyBvbiBhbiBVRFAgcG9ydCBhbmQgcnVucyBhIHByb2dyYW0gZm9yIGVhY2ggbmV3CisJICBjb25uZWN0aW9uLgorCitjb25maWcgVkNPTkZJRworCWJvb2wgInZjb25maWciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQ3JlYXRlcywgcmVtb3ZlcywgYW5kIGNvbmZpZ3VyZXMgVkxBTiBpbnRlcmZhY2VzCisKK2NvbmZpZyBXR0VUCisJYm9vbCAid2dldCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3Z2V0IGlzIGEgdXRpbGl0eSBmb3Igbm9uLWludGVyYWN0aXZlIGRvd25sb2FkIG9mIGZpbGVzIGZyb20gSFRUUCwKKwkgIEhUVFBTLCBhbmQgRlRQIHNlcnZlcnMuCisKK2NvbmZpZyBGRUFUVVJFX1dHRVRfU1RBVFVTQkFSCisJYm9vbCAiRW5hYmxlIGEgbmlmdHkgcHJvY2VzcyBtZXRlciAoKzJrKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdHRVQKKwloZWxwCisJICBFbmFibGUgdGhlIHRyYW5zZmVyIHByb2dyZXNzIGJhciBmb3Igd2dldCB0cmFuc2ZlcnMuCisKK2NvbmZpZyBGRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKwlib29sICJFbmFibGUgSFRUUCBhdXRoZW50aWNhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdHRVQKKwloZWxwCisJICBTdXBwb3J0IGF1dGhlbnRpY2F0ZWQgSFRUUCB0cmFuc2ZlcnMuCisKK2NvbmZpZyBGRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdHRVQgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSB3Z2V0IGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfV0dFVF9USU1FT1VUCisJYm9vbCAiRW5hYmxlIHJlYWQgdGltZW91dCBvcHRpb24gLVQgU0VDIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gV0dFVAorCWhlbHAKKwkgIFN1cHBvcnRzIG5ldHdvcmsgcmVhZCB0aW1lb3V0IGZvciB3Z2V0LCBzbyB0aGF0IHdnZXQgd2lsbCBnaXZlCisJICB1cCBhbmQgdGltZW91dCB3aGVuIHJlYWRpbmcgbmV0d29yayBkYXRhLCB0aHJvdWdoIHRoZSAtVCBjb21tYW5kCisJICBsaW5lIG9wdGlvbi4gIEN1cnJlbnRseSBvbmx5IG5ldHdvcmsgZGF0YSByZWFkIHRpbWVvdXQgaXMKKwkgIHN1cHBvcnRlZCAoaS5lLiwgdGltZW91dCBpcyBub3QgYXBwbGllZCB0byB0aGUgRE5TIG5vciBUQ1AKKwkgIGNvbm5lY3Rpb24gaW5pdGlhbGl6YXRpb24pLiAgV2hlbiBGRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TIGlzCisJICBhbHNvIGVuYWJsZWQsIHRoZSAtLXRpbWVvdXQgb3B0aW9uIHdpbGwgd29yayBpbiBhZGRpdGlvbiB0byAtVC4KKworY29uZmlnIFpDSVAKKwlib29sICJ6Y2lwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIFpDSVAgcHJvdmlkZXMgWmVyb0NvbmYgSVB2NCBhZGRyZXNzIHNlbGVjdGlvbiwgYWNjb3JkaW5nIHRvIFJGQyAzOTI3LgorCSAgSXQncyBhIGRhZW1vbiB0aGF0IGFsbG9jYXRlcyBhbmQgZGVmZW5kcyBhIGR5bmFtaWNhbGx5IGFzc2lnbmVkCisJICBhZGRyZXNzIG9uIHRoZSAxNjkuMjU0LzE2IG5ldHdvcmssIHJlcXVpcmluZyBubyBzeXN0ZW0gYWRtaW5pc3RyYXRvci4KKworCSAgU2VlIGh0dHA6Ly93d3cuemVyb2NvbmYub3JnIGZvciBmdXJ0aGVyIGRldGFpbHMsIGFuZCAiemNpcC5zY3JpcHQiCisJICBpbiB0aGUgYnVzeWJveCBleGFtcGxlcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9Db25maWcuc3JjIGIvbmV0d29ya2luZy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZWJhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw5ODkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIk5ldHdvcmtpbmcgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIEZFQVRVUkVfSVBWNgorCWJvb2wgIkVuYWJsZSBJUHY2IHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIElQdjYgc3VwcG9ydCBpbiBidXN5Ym94LgorCSAgVGhpcyBhZGRzIElQdjYgc3VwcG9ydCBpbiB0aGUgbmV0d29ya2luZyBhcHBsZXRzLgorCitjb25maWcgRkVBVFVSRV9VTklYX0xPQ0FMCisJYm9vbCAiRW5hYmxlIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0ICh1c3VhbGx5IG5vdCBuZWVkZWQpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCBpbiBhbGwgYnVzeWJveCBuZXR3b3JraW5nCisJICBhcHBsZXRzLiAgQWRkcmVzcyBvZiB0aGUgZm9ybSBsb2NhbDovcGF0aC90by91bml4L3NvY2tldAorCSAgd2lsbCBiZSByZWNvZ25pemVkLgorCisJICBUaGlzIGV4dGVuc2lvbiBpcyBhbG1vc3QgbmV2ZXIgdXNlZCBpbiByZWFsIHdvcmxkIHVzYWdlLgorCSAgWW91IG1vc3QgbGlrZWx5IHdhbnQgdG8gc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MKKwlib29sICJQcmVmZXIgSVB2NCBhZGRyZXNzZXMgZnJvbSBETlMgcXVlcmllcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBWNgorCWhlbHAKKwkgIFVzZSBJUHY0IGFkZHJlc3Mgb2YgbmV0d29yayBob3N0IGlmIGl0IGhhcyBvbmUuCisKKwkgIElmIHRoaXMgb3B0aW9uIGlzIG9mZiwgdGhlIGZpcnN0IHJldHVybmVkIGFkZHJlc3Mgd2lsbCBiZSB1c2VkLgorCSAgVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiB5b3VyIEROUyBzZXJ2ZXIgaXMgSVB2Ni1jYXBhYmxlIGFuZAorCSAgaXMgcmV0dXJuaW5nIElQdjYgaG9zdCBhZGRyZXNzZXMgdG9vLiBJZiBJUHY2IGFkZHJlc3MKKwkgIHByZWNlZGVzIElQdjQgb25lIGluIEROUyByZXBseSwgYnVzeWJveCBuZXR3b3JrIGFwcGxldHMKKwkgIChlLmcuIHdnZXQpIHdpbGwgdXNlIElQdjYgYWRkcmVzcy4gT24gYW4gSVB2Ni1pbmNhcGFibGUgaG9zdAorCSAgb3IgbmV0d29yayBhcHBsZXRzIHdpbGwgZmFpbCB0byBjb25uZWN0IHRvIHRoZSBob3N0CisJICB1c2luZyBJUHY2IGFkZHJlc3MuCisKK2NvbmZpZyBWRVJCT1NFX1JFU09MVVRJT05fRVJST1JTCisJYm9vbCAiVmVyYm9zZSByZXNvbHV0aW9uIGVycm9ycyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggc2ltcGxpc3RpYworCSAgImNhbid0IHJlc29sdmUgJ2hvc3RuYW1lLmNvbSciIGFuZCB3YW50IHRvIGtub3cgbW9yZS4KKwkgIFRoaXMgbWF5IGluY3JlYXNlIHNpemUgb2YgeW91ciBleGVjdXRhYmxlIGEgYml0LgorCitjb25maWcgQVJQCisJYm9vbCAiYXJwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIE1hbmlwdWxhdGUgdGhlIHN5c3RlbSBBUlAgY2FjaGUuCisKK2NvbmZpZyBBUlBJTkcKKwlib29sICJhcnBpbmciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgUGluZyBob3N0cyBieSBBUlAgcGFja2V0cy4KKworY29uZmlnIEJSQ1RMCisJYm9vbCAiYnJjdGwiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgTWFuYWdlIGV0aGVybmV0IGJyaWRnZXMuCisJICBTdXBwb3J0cyBhZGRici9kZWxiciBhbmQgYWRkaWYvZGVsaWYuCisKK2NvbmZpZyBGRUFUVVJFX0JSQ1RMX0ZBTkNZCisJYm9vbCAiRmFuY3kgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJSQ1RMCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIGV4dGVuZGVkIG9wdGlvbiBsaWtlOgorCSAgICBzZXRhZ2VpbmcsIHNldGZkLCBzZXRoZWxsbywgc2V0bWF4YWdlLAorCSAgICBzZXRwYXRoY29zdCwgc2V0cG9ydHByaW8sIHNldGJyaWRnZXByaW8sCisJICAgIHN0cAorCSAgVGhpcyBhZGRzIGFib3V0IDYwMCBieXRlcy4KKworY29uZmlnIEZFQVRVUkVfQlJDVExfU0hPVworCWJvb2wgIlN1cHBvcnQgc2hvdywgc2hvd21hYyBhbmQgc2hvd3N0cCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJSQ1RMICYmIEZFQVRVUkVfQlJDVExfRkFOQ1kKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igb3B0aW9uIHdoaWNoIHByaW50cyB0aGUgY3VycmVudCBjb25maWc6CisJICAgIHNob3dtYWNzLCBzaG93c3RwLCBzaG93CisKK2NvbmZpZyBETlNECisJYm9vbCAiZG5zZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTbWFsbCBhbmQgc3RhdGljIEROUyBzZXJ2ZXIgZGFlbW9uLgorCitjb25maWcgRVRIRVJfV0FLRQorCWJvb2wgImV0aGVyLXdha2UiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU2VuZCBhIG1hZ2ljIHBhY2tldCB0byB3YWtlIHVwIHNsZWVwaW5nIG1hY2hpbmVzLgorCitjb25maWcgRkFLRUlERU5URAorCWJvb2wgImZha2VpZGVudGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgZmFrZWlkZW50ZCBsaXN0ZW5zIG9uIHRoZSBpZGVudCBwb3J0IGFuZCByZXR1cm5zIGEgcHJlZGVmaW5lZAorCSAgZmFrZSB2YWx1ZSBvbiBhbnkgcXVlcnkuCisKK2NvbmZpZyBGVFBECisJYm9vbCAiZnRwZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzaW1wbGUgRlRQIGRhZW1vbi4gWW91IGhhdmUgdG8gcnVuIGl0IHZpYSBpbmV0ZC4KKworY29uZmlnIEZFQVRVUkVfRlRQX1dSSVRFCisJYm9vbCAiRW5hYmxlIHVwbG9hZCBjb21tYW5kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZUUEQKKwloZWxwCisJICBFbmFibGUgYWxsIGtpbmRzIG9mIEZUUCB1cGxvYWQgY29tbWFuZHMgKC13IG9wdGlvbikKKworY29uZmlnIEZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QKKwlib29sICJFbmFibGUgd29ya2Fyb3VuZCBmb3IgUkZDLXZpb2xhdGluZyBjbGllbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRlRQRAorCWhlbHAKKwkgIFNvbWUgZnRwIGNsaWVudHMgKGFtb25nIHRoZW0gS0RFJ3MgS29ucXVlcm9yKSBpc3N1ZSBpbGxlZ2FsCisJICAiTElTVCAtbCIgcmVxdWVzdHMuIFRoaXMgb3B0aW9uIHdvcmtzIGFyb3VuZCBzdWNoIHByb2JsZW1zLgorCSAgSXQgbWlnaHQgcHJldmVudCB5b3UgZnJvbSBsaXN0aW5nIGZpbGVzIHN0YXJ0aW5nIHdpdGggIi0iIGFuZAorCSAgaXQgaW5jcmVhc2VzIHRoZSBjb2RlIHNpemUgYnkgfjQwIGJ5dGVzLgorCSAgTW9zdCBvdGhlciBmdHAgc2VydmVycyBzZWVtIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIHRoaXMuCisKK2NvbmZpZyBGVFBHRVQKKwlib29sICJmdHBnZXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmV0cmlldmUgYSByZW1vdGUgZmlsZSB2aWEgRlRQLgorCitjb25maWcgRlRQUFVUCisJYm9vbCAiZnRwcHV0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN0b3JlIGEgcmVtb3RlIGZpbGUgdmlhIEZUUC4KKworY29uZmlnIEZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMgaW4gZnRwZ2V0L2Z0cHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPTkdfT1BUUyAmJiAoRlRQR0VUIHx8IEZUUFBVVCkKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIGZ0cGdldC9mdHBwdXQgYXBwbGV0LgorCitjb25maWcgSE9TVE5BTUUKKwlib29sICJob3N0bmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTaG93IG9yIHNldCB0aGUgc3lzdGVtJ3MgaG9zdCBuYW1lLgorCitjb25maWcgSFRUUEQKKwlib29sICJodHRwZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXJ2ZSB3ZWIgcGFnZXMgdmlhIGFuIEhUVFAgc2VydmVyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlib29sICJTdXBwb3J0ICdSYW5nZXM6JyBoZWFkZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIE1ha2VzIGh0dHBkIGVtaXQgIkFjY2VwdC1SYW5nZXM6IGJ5dGVzIiBoZWFkZXIgYW5kIHVuZGVyc3RhbmQKKwkgICJSYW5nZTogYnl0ZXM9Tk5OLVtNTU1dIiBoZWFkZXIuIEFsbG93cyBmb3IgcmVzdW1pbmcgaW50ZXJydXB0ZWQKKwkgIGRvd25sb2Fkcywgc2Vla2luZyBpbiBtdWx0aW1lZGlhIHBsYXllcnMgZXRjLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUKKwlib29sICJVc2Ugc2VuZGZpbGUgc3lzdGVtIGNhbGwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFdoZW4gZW5hYmxlZCwgaHR0cGQgd2lsbCB1c2UgdGhlIGtlcm5lbCBzZW5kZmlsZSgpIGZ1bmN0aW9uCisJICBpbnN0ZWFkIG9mIHJlYWQvd3JpdGUgbG9vcC4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfU0VUVUlECisJYm9vbCAiRW5hYmxlIC11IDx1c2VyPiBvcHRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB0aGUgc2VydmVyIHRvIHJ1biBhcyBhIHNwZWNpZmljIHVzZXIKKwkgIHJhdGhlciB0aGFuIGRlZmF1bHRpbmcgdG8gdGhlIHVzZXIgdGhhdCBzdGFydHMgdGhlIHNlcnZlci4KKwkgIFVzZSBvZiB0aGlzIG9wdGlvbiByZXF1aXJlcyBzcGVjaWFsIHByaXZpbGVnZXMgdG8gY2hhbmdlIHRvIGEKKwkgIGRpZmZlcmVudCB1c2VyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJYm9vbCAiRW5hYmxlIEJhc2ljIGh0dHAgQXV0aGVudGljYXRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFV0aWxpemVzIHBhc3N3b3JkIHNldHRpbmdzIGZyb20gL2V0Yy9odHRwZC5jb25mIGZvciBiYXNpYworCSAgYXV0aGVudGljYXRpb24gb24gYSBwZXIgdXJsIGJhc2lzLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9BVVRIX01ENQorCWJvb2wgIlN1cHBvcnQgTUQ1IGNyeXB0ZWQgcGFzc3dvcmRzIGZvciBodHRwIEF1dGhlbnRpY2F0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJaGVscAorCSAgRW5hYmxlcyBiYXNpYyBwZXIgVVJMIGF1dGhlbnRpY2F0aW9uIGZyb20gL2V0Yy9odHRwZC5jb25mCisJICB1c2luZyBtZDUgcGFzc3dvcmRzLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9DR0kKKwlib29sICJTdXBwb3J0IENvbW1vbiBHYXRld2F5IEludGVyZmFjZSAoQ0dJKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHNjcmlwdHMgYW5kIGV4ZWN1dGFibGVzIHRvIGJlIGludm9rZWQKKwkgIHdoZW4gc3BlY2lmaWMgVVJMcyBhcmUgcmVxdWVzdGVkLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCWJvb2wgIlN1cHBvcnQgZm9yIHJ1bm5pbmcgc2NyaXB0cyB0aHJvdWdoIGFuIGludGVycHJldGVyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9DR0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHJ1bm5pbmcgc2NyaXB0cyB0aHJvdWdoIGFuCisJICBpbnRlcnByZXRlci4gVHVybiB0aGlzIG9uIGlmIHlvdSB3YW50IFBIUCBzY3JpcHRzIHRvIHdvcmsKKwkgIHByb3Blcmx5LiBZb3UgbmVlZCB0byBzdXBwbHkgYW4gYWRkaXRpb25hbCBsaW5lIGluIHlvdXIgaHR0cGQKKwkgIGNvbmZpZyBmaWxlOgorCSAgKi5waHA6L3BhdGgvdG8veW91ci9waHAKKworY29uZmlnIEZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVgorCWJvb2wgIlNldCBSRU1PVEVfUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgQ0dJIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9DR0kKKwloZWxwCisJICBVc2Ugb2YgdGhpcyBvcHRpb24gY2FuIGFzc2lzdCBzY3JpcHRzIGluIGdlbmVyYXRpbmcKKwkgIHJlZmVyZW5jZXMgdGhhdCBjb250YWluIGEgdW5pcXVlIHBvcnQgbnVtYmVyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUgorCWJvb2wgIkVuYWJsZSAtZSBvcHRpb24gKHVzZWZ1bCBmb3IgQ0dJcyB3cml0dGVuIGFzIHNoZWxsIHNjcmlwdHMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgaHRtbCBlbmNvZGluZyBvZiBhcmJpdHJhcnkgc3RyaW5ncyBmb3IgZGlzcGxheQorCSAgYnkgdGhlIGJyb3dzZXIuIE91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKwkgIEZvciBleGFtcGxlLCBodHRwZCAtZSAiPEhlbGxvIFdvcmxkPiIgcHJvZHVjZXMKKwkgICImIzYwSGVsbG8mIzMyV29ybGQmIzYyIi4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwlib29sICJTdXBwb3J0IGZvciBjdXN0b20gZXJyb3IgcGFnZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGVmaW5lIGN1c3RvbSBlcnJvciBwYWdlcyBpbgorCSAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEhUVFAgc3RhdHVzCisJICBlcnJvciBwYWdlcy4gRm9yIGluc3RhbmNlLCBpZiB5b3UgYWRkIHRoZSBsaW5lOgorCSAgICAgICAgRTQwNDovcGF0aC9lNDA0Lmh0bWwKKwkgIGluIHRoZSBjb25maWcgZmlsZSwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdGhlIHNwZWNpZmllZAorCSAgJy9wYXRoL2U0MDQuaHRtbCcgZmlsZSBpbnN0ZWFkIG9mIHRoZSB0ZXJzZSAnNDA0IE5PVCBGT1VORCcKKwkgIG1lc3NhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1BST1hZCisJYm9vbCAiU3VwcG9ydCBmb3IgcmV2ZXJzZSBwcm94eSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWZpbmUgVVJMcyB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkCisJICB0byBhbm90aGVyIEhUVFAgc2VydmVyLiBUbyBzZXR1cCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZQorCSAgY29uZmlndXJhdGlvbiBmaWxlCisJICAgICAgICBQOi91cmwvOmh0dHA6Ly9ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGgvCisJICBUaGVuIGEgcmVxdWVzdCB0byAvdXJsL215ZmlsZSB3aWxsIGJlIGZvcndhcmRlZCB0bworCSAgaHR0cDovL2hvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aC9teWZpbGUuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0daSVAKKwlib29sICJTdXBwb3J0IGZvciBHWklQIGNvbnRlbnQgZW5jb2RpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIE1ha2VzIGh0dHBkIHNlbmQgZmlsZXMgdXNpbmcgR1pJUCBjb250ZW50IGVuY29kaW5nIGlmIHRoZQorCSAgY2xpZW50IHN1cHBvcnRzIGl0IGFuZCBhIHByZS1jb21wcmVzc2VkIDxmaWxlPi5neiBleGlzdHMuCisKK2NvbmZpZyBJRkNPTkZJRworCWJvb2wgImlmY29uZmlnIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIElmY29uZmlnIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBrZXJuZWwtcmVzaWRlbnQgbmV0d29yayBpbnRlcmZhY2VzLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMKKwlib29sICJFbmFibGUgc3RhdHVzIHJlcG9ydGluZyBvdXRwdXQgKCs3aykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIElmIGlmY29uZmlnIGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBpdCB3aWxsIGRpc3BsYXkgdGhlIHN0YXR1cworCSAgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW50ZXJmYWNlcy4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfU0xJUAorCWJvb2wgIkVuYWJsZSBzbGlwLXNwZWNpZmljIG9wdGlvbnMgXCJrZWVwYWxpdmVcIiBhbmQgXCJvdXRmaWxsXCIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIEFsbG93ICJrZWVwYWxpdmUiIGFuZCAib3V0ZmlsbCIgc3VwcG9ydCBmb3IgU0xJUC4gSWYgeW91J3JlIG5vdAorCSAgcGxhbm5pbmcgb24gdXNpbmcgc2VyaWFsIGxpbmVzLCBsZWF2ZSB0aGlzIHVuY2hlY2tlZC4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCWJvb2wgIkVuYWJsZSBvcHRpb25zIFwibWVtX3N0YXJ0XCIsIFwiaW9fYWRkclwiLCBhbmQgXCJpcnFcIiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGQ09ORklHCisJaGVscAorCSAgQWxsb3cgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHNoYXJlZCBtZW1vcnksIHN0YXJ0IGFkZHJlc3MgZm9yIEkvTywKKwkgIGFuZC9vciB0aGUgaW50ZXJydXB0IGxpbmUgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGRldmljZS4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfSFcKKwlib29sICJFbmFibGUgb3B0aW9uIFwiaHdcIiAoZXRoZXIgb25seSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIFNldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZSwgaWYgdGhlIGRldmljZSBkcml2ZXIKKwkgIHN1cHBvcnRzICB0aGlzICBvcGVyYXRpb24uIEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRoZSAnZXRoZXInCisJICBjbGFzcy4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwlib29sICJTZXQgdGhlIGJyb2FkY2FzdCBhdXRvbWF0aWNhbGx5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZDT05GSUcKKwloZWxwCisJICBTZXR0aW5nIHRoaXMgd2lsbCBtYWtlIGlmY29uZmlnIGF0dGVtcHQgdG8gZmluZCB0aGUgYnJvYWRjYXN0CisJICBhdXRvbWF0aWNhbGx5IGlmIHRoZSB2YWx1ZSAnKycgaXMgdXNlZC4KKworY29uZmlnIElGRU5TTEFWRQorCWJvb2wgImlmZW5zbGF2ZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gYmluZCBzZXZlcmFsIGludGVyZmFjZXMKKwkgIHRvIGEgbG9naWNhbCBpbnRlcmZhY2UgKHVzZSB3aXRoIGtlcm5lbCBib25kaW5nIGRyaXZlcikuCisKK2NvbmZpZyBJRlBMVUdECisJYm9vbCAiaWZwbHVnZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBOZXR3b3JrIGludGVyZmFjZSBwbHVnIGRldGVjdGlvbiBkYWVtb24uCisKK2NvbmZpZyBJRlVQRE9XTgorCWJvb2wgImlmdXBkb3duIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2VzLiBUaGlzIGFwcGxldCBtYWtlcworCSAgdXNlIG9mIGVpdGhlciAiaWZjb25maWciIGFuZCAicm91dGUiIG9yIHRoZSAiaXAiIGNvbW1hbmQgdG8gYWN0dWFsbHkKKwkgIGNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZXMuIFRoZXJlZm9yZSwgeW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50CisJICB0byBlbmFibGUgZWl0aGVyIElGQ09ORklHIGFuZCBST1VURSwgb3IgZW5hYmxlCisJICBGRUFUVVJFX0lGVVBET1dOX0lQIGFuZCB0aGUgdmFyaW91cyBJUCBvcHRpb25zLiBPZgorCSAgY291cnNlIHlvdSBjb3VsZCB1c2Ugbm9uLWJ1c3lib3ggdmVyc2lvbnMgb2YgdGhlc2UgcHJvZ3JhbXMsIHNvCisJICBhZ2FpbnN0IG15IGJldHRlciBqdWRnZW1lbnQgKHNpbmNlIHRoaXMgd2lsbCBzdXJlbHkgcmVzdWx0IGluIHBsZW50eQorCSAgb2Ygc3VwcG9ydCBxdWVzdGlvbnMgb24gdGhlIG1haWxpbmcgbGlzdCksIEkgZG8gbm90IGZvcmNlIHlvdSB0bworCSAgZW5hYmxlIHRoZXNlIGFkZGl0aW9uYWwgb3B0aW9ucy4gSXQgaXMgdXAgdG8geW91IHRvIHN1cHBseSBlaXRoZXIKKwkgICJpZmNvbmZpZyIsICJyb3V0ZSIgYW5kICJydW4tcGFydHMiIG9yIHRoZSAiaXAiIGNvbW1hbmQsIGVpdGhlcgorCSAgdmlhIGJ1c3lib3ggb3IgdmlhIHN0YW5kYWxvbmUgdXRpbGl0aWVzLgorCitjb25maWcgSUZVUERPV05fSUZTVEFURV9QQVRICisJc3RyaW5nICJBYnNvbHV0ZSBwYXRoIHRvIGlmc3RhdGUgZmlsZSIKKwlkZWZhdWx0ICIvdmFyL3J1bi9pZnN0YXRlIgorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBpZnVwZG93biBrZWVwcyBzdGF0ZSBpbmZvcm1hdGlvbiBpbiBhIGZpbGUgY2FsbGVkIGlmc3RhdGUuCisJICBUeXBpY2FsbHkgaXQgaXMgbG9jYXRlZCBpbiAvdmFyL3J1bi9pZnN0YXRlLCBob3dldmVyCisJICBzb21lIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBwdXQgaXQgaW4gb3RoZXIgcGxhY2VzCisJICAoZGViaWFuLCBmb3IgZXhhbXBsZSwgdXNlcyAvZXRjL25ldHdvcmsvcnVuL2lmc3RhdGUpLgorCSAgVGhpcyBjb25maWcgb3B0aW9uIGRlZmluZXMgbG9jYXRpb24gb2YgaWZzdGF0ZS4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVAKKwlib29sICJVc2UgaXAgYXBwbGV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBVc2UgdGhlIGlwcm91dGUgImlwIiBjb21tYW5kIHRvIGltcGxlbWVudCAiaWZ1cCIgYW5kICJpZmRvd24iLCByYXRoZXIKKwkgIHRoYW4gdGhlIGRlZmF1bHQgb2YgdXNpbmcgdGhlIG9sZGVyICdpZmNvbmZpZycgYW5kICdyb3V0ZScgdXRpbGl0aWVzLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOCisJYm9vbCAiVXNlIGJ1c3lib3ggaXAgYXBwbGV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JRlVQRE9XTl9JUAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBJUAorCXNlbGVjdCBGRUFUVVJFX0lQX0FERFJFU1MKKwlzZWxlY3QgRkVBVFVSRV9JUF9MSU5LCisJc2VsZWN0IEZFQVRVUkVfSVBfUk9VVEUKKwloZWxwCisJICBVc2UgdGhlIGJ1c3lib3ggaXByb3V0ZSAiaXAiIGFwcGxldCB0byBpbXBsZW1lbnQgImlmdXBkb3duIi4KKworCSAgSWYgbGVmdCBkaXNhYmxlZCwgeW91IG11c3QgaW5zdGFsbCB0aGUgZnVsbC1ibG93biBpcHJvdXRlMgorCSAgdXRpbGl0eSBvciB0aGUgICJpZnVwIiBhbmQgImlmZG93biIgYXBwbGV0cyB3aWxsIG5vdCB3b3JrLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOCisJYm9vbCAiVXNlIGJ1c3lib3ggaWZjb25maWcgYW5kIHJvdXRlIGFwcGxldHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBJRlVQRE9XTiAmJiAhRkVBVFVSRV9JRlVQRE9XTl9JUAorCXNlbGVjdCBJRkNPTkZJRworCXNlbGVjdCBST1VURQorCWhlbHAKKwkgIFVzZSB0aGUgYnVzeWJveCBpcHJvdXRlICJpZmNvbmZpZyIgYW5kICJyb3V0ZSIgYXBwbGV0cyB0bworCSAgaW1wbGVtZW50IHRoZSAiaWZ1cCIgYW5kICJpZmRvd24iIHV0aWxpdGllcy4KKworCSAgSWYgbGVmdCBkaXNhYmxlZCwgeW91IG11c3QgaW5zdGFsbCB0aGUgZnVsbC1ibG93biBpZmNvbmZpZworCSAgYW5kIHJvdXRlIHV0aWxpdGllcywgb3IgdGhlICAiaWZ1cCIgYW5kICJpZmRvd24iIGFwcGxldHMgd2lsbCBub3QKKwkgIHdvcmsuCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQVjQKKwlib29sICJTdXBwb3J0IGZvciBJUHY0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBJZiB5b3Ugd2FudCBpZnVwL2lmZG93biB0byB0YWxrIElQdjQsIGxlYXZlIHRoaXMgb24uCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQVjYKKwlib29sICJTdXBwb3J0IGZvciBJUHY2IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04gJiYgRkVBVFVSRV9JUFY2CisJaGVscAorCSAgSWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgSVB2NiwgdHVybiB0aGlzIG9wdGlvbiBvbi4KKworIyMjIFVOVVNFRAorIyMjY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVBYCisjIyMJYm9vbCAiU3VwcG9ydCBmb3IgSVBYIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gSUZVUERPV04KKyMjIwloZWxwCisjIyMJICBJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCB5b3UgY2FuIHVzZSBidXN5Ym94IHRvIHdvcmsgd2l0aCBJUFgKKyMjIwkgIG5ldHdvcmtzLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisJYm9vbCAiRW5hYmxlIG1hcHBpbmcgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGVVBET1dOCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSAibWFwcGluZyIgc3RhbnphLCB1bmxlc3MgeW91IGhhdmUKKwkgIGEgd2VpcmQgbmV0d29yayBzZXR1cCB5b3UgZG9uJ3QgbmVlZCBpdC4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUAorCWJvb2wgIlN1cHBvcnQgZm9yIGV4dGVybmFsIGRoY3AgY2xpZW50cyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElGVVBET1dOCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBleHRlcm5hbCBkaGNwIGNsaWVudHMuIENsaWVudHMgYXJlCisJICB0cmllZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiBkaGNwY2QsIGRoY2xpZW50LCBwdW1wIGFuZCB1ZGhjcGMuCisJICBPdGhlcndpc2UsIGlmIHVkaGNwYyBhcHBsZXQgaXMgZW5hYmxlZCwgaXQgaXMgdXNlZC4KKwkgIE90aGVyd2lzZSwgaWZ1cC9pZmRvd24gd2lsbCBoYXZlIG5vIHN1cHBvcnQgZm9yIERIQ1AuCisKK2NvbmZpZyBJTkVURAorCWJvb2wgImluZXRkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIEludGVybmV0IHN1cGVyc2VydmVyIGRhZW1vbgorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITworCWJvb2wgIlN1cHBvcnQgZWNobyBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBFY2hvIHJlY2VpdmVkIGRhdGEgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRAorCWJvb2wgIlN1cHBvcnQgZGlzY2FyZCBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBJbnRlcm5ldCAvZGV2L251bGwgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRQorCWJvb2wgIlN1cHBvcnQgdGltZSBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBSZXR1cm4gMzIgYml0IHRpbWUgc2luY2UgMTkwMCBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCisJYm9vbCAiU3VwcG9ydCBkYXl0aW1lIHNlcnZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCWhlbHAKKwkgIFJldHVybiBodW1hbi1yZWFkYWJsZSB0aW1lIGludGVybmFsIGluZXRkIHNlcnZpY2UKKworY29uZmlnIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KKwlib29sICJTdXBwb3J0IGNoYXJnZW4gc2VydmljZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElORVRECisJaGVscAorCSAgRmFtaWxpYXIgY2hhcmFjdGVyIGdlbmVyYXRvciBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1JQQworCWJvb2wgIlN1cHBvcnQgUlBDIHNlcnZpY2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwlzZWxlY3QgRkVBVFVSRV9IQVZFX1JQQworCWhlbHAKKwkgIFN1cHBvcnQgU3VuLVJQQyBiYXNlZCBzZXJ2aWNlcworCitjb25maWcgSVAKKwlib29sICJpcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgImlwIiBhcHBsZXQgaXMgYSBUQ1AvSVAgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gYW5kIHJvdXRpbmcKKwkgIHV0aWxpdHkuIFlvdSBnZW5lcmFsbHkgZG9uJ3QgbmVlZCAiaXAiIHRvIHVzZSBidXN5Ym94IHdpdGgKKwkgIFRDUC9JUC4KKworY29uZmlnIEZFQVRVUkVfSVBfQUREUkVTUworCWJvb2wgImlwIGFkZHJlc3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFkZHJlc3MgbWFuaXB1bGF0aW9uIHN1cHBvcnQgZm9yIHRoZSAiaXAiIGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfSVBfTElOSworCWJvb2wgImlwIGxpbmsiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIENvbmZpZ3VyZSBuZXR3b3JrIGRldmljZXMgd2l0aCAiaXAiLgorCitjb25maWcgRkVBVFVSRV9JUF9ST1VURQorCWJvb2wgImlwIHJvdXRlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IHRvICJpcCIuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1RVTk5FTAorCWJvb2wgImlwIHR1bm5lbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHR1bm5lbGluZyBjb21tYW5kcyB0byAiaXAiLgorCitjb25maWcgRkVBVFVSRV9JUF9SVUxFCisJYm9vbCAiaXAgcnVsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHJ1bGUgY29tbWFuZHMgdG8gImlwIi4KKworY29uZmlnIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMKKwlib29sICJTdXBwb3J0IHNob3J0IGZvcm1zIG9mIGlwIGNvbW1hbmRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBbHNvIHN1cHBvcnQgc2hvcnQtZm9ybSBvZiBpcCA8T0JKRUNUPiBjb21tYW5kczoKKwkgIGlwIGFkZHIgICAtPiBpcGFkZHIKKwkgIGlwIGxpbmsgICAtPiBpcGxpbmsKKwkgIGlwIHJvdXRlICAtPiBpcHJvdXRlCisJICBpcCB0dW5uZWwgLT4gaXB0dW5uZWwKKwkgIGlwIHJ1bGUgICAtPiBpcHJ1bGUKKworCSAgU2F5IE4gdW5sZXNzIHlvdSBkZXNwYXJhdGVseSBuZWVkIHRoZSBzaG9ydCBmb3JtIG9mIHRoZSBpcAorCSAgb2JqZWN0IGNvbW1hbmRzLgorCitjb25maWcgRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUworCWJvb2wgIlN1cHBvcnQgZGlzcGxheWluZyByYXJlbHkgdXNlZCBsaW5rIHR5cGVzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBJZiB5b3UgYXJlIG5vdCBnb2luZyB0byB1c2UgbGlua3Mgb2YgdHlwZSAiZnJhZCIsICJlY29uZXQiLAorCSAgImJpZiIgZXRjLCB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBlbmFibGUgdGhpcy4KKwkgIEV0aGVybmV0LCB3aXJlbGVzcywgaW5mcmFyZWQsIHBwcC9zbGlwLCBpcCB0dW5uZWxsaW5nCisJICBsaW5rIHR5cGVzIGFyZSBzdXBwb3J0ZWQgd2l0aG91dCB0aGlzIG9wdGlvbiBzZWxlY3RlZC4KKworY29uZmlnIElQQUREUgorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9BRERSRVNTCisKK2NvbmZpZyBJUExJTksKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfTElOSworCitjb25maWcgSVBST1VURQorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfU0hPUlRfRk9STVMgJiYgRkVBVFVSRV9JUF9ST1VURQorCitjb25maWcgSVBUVU5ORUwKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfVFVOTkVMCisKK2NvbmZpZyBJUFJVTEUKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfUlVMRQorCitjb25maWcgSVBDQUxDCisJYm9vbCAiaXBjYWxjIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGlwY2FsYyB0YWtlcyBhbiBJUCBhZGRyZXNzIGFuZCBuZXRtYXNrIGFuZCBjYWxjdWxhdGVzIHRoZQorCSAgcmVzdWx0aW5nIGJyb2FkY2FzdCwgbmV0d29yaywgYW5kIGhvc3QgcmFuZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ0FMQ19GQU5DWQorCWJvb2wgIkZhbmN5IElQQ0FMQywgbW9yZSBvcHRpb25zLCBhZGRzIDEga2J5dGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUENBTEMKKwloZWxwCisJICBBZGRzIHRoZSBvcHRpb25zIGhvc3RuYW1lLCBwcmVmaXggYW5kIHNpbGVudCB0byB0aGUgb3V0cHV0IG9mCisJICAiaXBjYWxjIi4KKworY29uZmlnIEZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUENBTEMgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBpcGNhbGMgYXBwbGV0LgorCitjb25maWcgTkVUU1RBVAorCWJvb2wgIm5ldHN0YXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbmV0c3RhdCBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4IG5ldHdvcmtpbmcgc3Vic3lzdGVtLgorCitjb25maWcgRkVBVFVSRV9ORVRTVEFUX1dJREUKKwlib29sICJFbmFibGUgd2lkZSBuZXRzdGF0IG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5FVFNUQVQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igd2lkZSBjb2x1bW5zLiBVc2VmdWwgd2hlbiBkaXNwbGF5aW5nIElQdjYgYWRkcmVzc2VzCisJICAoLVcgb3B0aW9uKS4KKworY29uZmlnIEZFQVRVUkVfTkVUU1RBVF9QUkcKKwlib29sICJFbmFibGUgUElEL1Byb2dyYW0gbmFtZSBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBORVRTVEFUCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIC1wIGZsYWcgdG8gcHJpbnQgb3V0IFBJRCBhbmQgcHJvZ3JhbSBuYW1lLgorCSAgKzcwMCBieXRlcyBvZiBjb2RlLgorCitjb25maWcgTlNMT09LVVAKKwlib29sICJuc2xvb2t1cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBuc2xvb2t1cCBpcyBhIHRvb2wgdG8gcXVlcnkgSW50ZXJuZXQgbmFtZSBzZXJ2ZXJzLgorCitjb25maWcgTlRQRAorCWJvb2wgIm50cGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIE5UUCBjbGllbnQvc2VydmVyIGRhZW1vbi4KKworY29uZmlnIEZFQVRVUkVfTlRQRF9TRVJWRVIKKwlib29sICJNYWtlIG50cGQgdXNhYmxlIGFzIGEgTlRQIHNlcnZlciIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5UUEQKKwloZWxwCisJICBNYWtlIG50cGQgdXNhYmxlIGFzIGEgTlRQIHNlcnZlci4gSWYgeW91IGRpc2FibGUgdGhpcyBvcHRpb24KKwkgIG50cGQgd2lsbCBiZSB1c2FibGUgb25seSBhcyBhIE5UUCBjbGllbnQuCisKK2NvbmZpZyBQU0NBTgorCWJvb2wgInBzY2FuIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSBuZXR3b3JrIHBvcnQgc2Nhbm5lci4KKworY29uZmlnIFJPVVRFCisJYm9vbCAicm91dGUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgUm91dGUgZGlzcGxheXMgb3IgbWFuaXB1bGF0ZXMgdGhlIGtlcm5lbCdzIElQIHJvdXRpbmcgdGFibGVzLgorCitjb25maWcgU0xBVFRBQ0gKKwlib29sICJzbGF0dGFjaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBzbGF0dGFjaCBpcyBhIHNtYWxsIHV0aWxpdHkgdG8gYXR0YWNoIG5ldHdvcmsgaW50ZXJmYWNlcyB0byBzZXJpYWwKKwkgIGxpbmVzLgorCisjY29uZmlnIFRDCisjCWJvb2wgInRjIgorIwlkZWZhdWx0IHkKKyMJaGVscAorIwkgIHNob3cgLyBtYW5pcHVsYXRlIHRyYWZmaWMgY29udHJvbCBzZXR0aW5ncworIworI2NvbmZpZyBGRUFUVVJFX1RDX0lOR1JFU1MKKyMJZGVmX2Jvb2wgbgorIwlkZXBlbmRzIG9uIFRDCisKK2NvbmZpZyBUQ1BTVkQKKwlib29sICJ0Y3BzdmQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdGNwc3ZkIGxpc3RlbnMgb24gYSBUQ1AgcG9ydCBhbmQgcnVucyBhIHByb2dyYW0gZm9yIGVhY2ggbmV3CisJICBjb25uZWN0aW9uLgorCitjb25maWcgVEVMTkVUCisJYm9vbCAidGVsbmV0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRlbG5ldCBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIFRFTE5FVCBwcm90b2NvbCwgYnV0IGlzIGFsc28gY29tbW9ubHkKKwkgIHVzZWQgdG8gdGVzdCBvdGhlciBzaW1wbGUgcHJvdG9jb2xzLgorCitjb25maWcgRkVBVFVSRV9URUxORVRfVFRZUEUKKwlib29sICJQYXNzIFRFUk0gdHlwZSB0byByZW1vdGUgaG9zdCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRFTE5FVAorCWhlbHAKKwkgIFNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBmb3J3YXJkIHRoZSBURVJNIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZQorCSAgcmVtb3RlIGhvc3QgeW91IGFyZSBjb25uZWN0aW5nIHRvLiBUaGlzIGlzIHVzZWZ1bCB0byBtYWtlIHN1cmUgdGhhdAorCSAgdGhpbmdzIGxpa2UgQU5TSSBjb2xvcnMgYW5kIG90aGVyIGNvbnRyb2wgc2VxdWVuY2VzIGJlaGF2ZS4KKworY29uZmlnIEZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorCWJvb2wgIlBhc3MgVVNFUiB0eXBlIHRvIHJlbW90ZSBob3N0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVMTkVUCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIGZvcndhcmQgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlCisJICByZW1vdGUgaG9zdCB5b3UgYXJlIGNvbm5lY3RpbmcgdG8uIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8KKwkgIGxvZyBpbnRvIGEgbWFjaGluZSB3aXRob3V0IHRlbGxpbmcgdGhlIHVzZXJuYW1lIChhdXRvbG9naW4pLiBUaGlzCisJICBvcHRpb24gZW5hYmxlcyBgLWEnIGFuZCBgLWwgVVNFUicgYXJndW1lbnRzLgorCitjb25maWcgVEVMTkVURAorCWJvb2wgInRlbG5ldGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgQSBkYWVtb24gZm9yIHRoZSBURUxORVQgcHJvdG9jb2wsIGFsbG93aW5nIHlvdSB0byBsb2cgb250byB0aGUgaG9zdAorCSAgcnVubmluZyB0aGUgZGFlbW9uLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIFRFTE5FVCBwcm90b2NvbAorCSAgc2VuZHMgcGFzc3dvcmRzIGluIHBsYWluIHRleHQuIElmIHlvdSBjYW4ndCBhZmZvcmQgdGhlIHNwYWNlIGZvciBhbgorCSAgU1NIIGRhZW1vbiBhbmQgeW91IHRydXN0IHlvdXIgbmV0d29yaywgeW91IG1heSBzYXkgJ3knIGhlcmUuIEFzIGEKKwkgIG1vcmUgc2VjdXJlIGFsdGVybmF0aXZlLCB5b3Ugc2hvdWxkIHNlcmlvdXNseSBjb25zaWRlciBpbnN0YWxsaW5nIHRoZQorCSAgdmVyeSBzbWFsbCBEcm9wYmVhciBTU0ggZGFlbW9uIGluc3RlYWQ6CisJCWh0dHA6Ly9tYXR0LnVjYy5hc24uYXUvZHJvcGJlYXIvZHJvcGJlYXIuaHRtbAorCisJICBOb3RlIHRoYXQgZm9yIGJ1c3lib3ggdGVsbmV0ZCB0byB3b3JrIHlvdSBuZWVkIHNldmVyYWwgdGhpbmdzOgorCSAgRmlyc3Qgb2YgYWxsLCB5b3VyIGtlcm5lbCBuZWVkczoKKwkJICBVTklYOThfUFRZUz15CisJCSAgREVWUFRTX0ZTPXkKKworCSAgTmV4dCwgeW91IG5lZWQgYSAvZGV2L3B0cyBkaXJlY3Rvcnkgb24geW91ciByb290IGZpbGVzeXN0ZW06CisKKwkJICAkIGxzIC1sZCAvZGV2L3B0cworCQkgIGRyd3hyLXhyLXggIDIgcm9vdCByb290IDAgU2VwIDIzIDEzOjIxIC9kZXYvcHRzLworCisJICBOZXh0IHlvdSBuZWVkIHRoZSBwc2V1ZG8gdGVybWluYWwgbWFzdGVyIG11bHRpcGxleGVyIC9kZXYvcHRteDoKKworCQkgICQgbHMgLWxhIC9kZXYvcHRteAorCQkgIGNydy1ydy1ydy0gIDEgcm9vdCB0dHkgNSwgMiBTZXAgMjMgMTM6NTUgL2Rldi9wdG14CisKKwkgIEFueSAvZGV2L3R0eXBbMC05XSogZmlsZXMgeW91IG1heSBoYXZlIGNhbiBiZSByZW1vdmVkLgorCSAgTmV4dCwgeW91IG5lZWQgdG8gbW91bnQgdGhlIGRldnB0cyBmaWxlc3lzdGVtIG9uIC9kZXYvcHRzIHVzaW5nOgorCisJCSAgbW91bnQgLXQgZGV2cHRzIGRldnB0cyAvZGV2L3B0cworCisJICBZb3UgbmVlZCB0byBiZSBzdXJlIHRoYXQgYnVzeWJveCBoYXMgTE9HSU4gYW5kCisJICBGRUFUVVJFX1NVSUQgZW5hYmxlZC4gQW5kIGZpbmFsbHksIHlvdSBzaG91bGQgbWFrZQorCSAgY2VydGFpbiB0aGF0IEJ1c3lib3ggaGFzIGJlZW4gaW5zdGFsbGVkIHNldHVpZCByb290OgorCisJCWNob3duIHJvb3Qucm9vdCAvYmluL2J1c3lib3gKKwkJY2htb2QgNDc1NSAvYmluL2J1c3lib3gKKworCSAgd2l0aCBhbGwgdGhhdCBkb25lLCB0ZWxuZXRkIF9zaG91bGRfIHdvcmsuLi4uCisKKworY29uZmlnIEZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJYm9vbCAiU3VwcG9ydCBzdGFuZGFsb25lIHRlbG5ldGQgKG5vdCBpbmV0ZCBvbmx5KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRFTE5FVEQKKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyB3aWxsIG1ha2UgdGVsbmV0ZCBhYmxlIHRvIHJ1biBzdGFuZGFsb25lLgorCitjb25maWcgRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQKKwlib29sICJTdXBwb3J0IC13IFNFQyBvcHRpb24gKGluZXRkIHdhaXQgbW9kZSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gcnVuIHRlbG5ldGQgaW4gImluZXQgd2FpdCIgbW9kZS4KKwkgIEV4YW1wbGUgaW5ldGQuY29uZiBsaW5lIChub3RlICJ3YWl0Iiwgbm90IHVzdWFsICJub3dhaXQiKToKKworCSAgdGVsbmV0IHN0cmVhbSB0Y3Agd2FpdCByb290IC9iaW4vdGVsbmV0ZCB0ZWxuZXRkIC13MTAKKworCSAgSW4gdGhpcyBleGFtcGxlLCBpbmV0ZCBwYXNzZXMgX2xpc3RlbmluZ18gc29ja2V0XyBhcyBmZCAwCisJICB0byB0ZWxuZXRkIHdoZW4gY29ubmVjdGlvbiBhcHBlYXJzLgorCSAgdGVsbmV0ZCB3aWxsIHdhaXQgZm9yIGNvbm5lY3Rpb25zIHVudGlsIGFsbCBleGlzdGluZworCSAgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCwgYW5kIG5vIG5ldyBjb25uZWN0aW9ucworCSAgYXBwZWFyIGR1cmluZyAxMCBzZWNvbmRzLiBUaGVuIGl0IGV4aXRzLCBhbmQgaW5ldGQgY29udGludWVzCisJICB0byBsaXN0ZW4gZm9yIG5ldyBjb25uZWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgcmFyZWx5IHVzZWQuICJ0Y3Agbm93YWl0IiBpcyBtdWNoIG1vcmUgdXN1YWwKKwkgIHdheSBvZiBydW5uaW5nIHRjcCBzZXJ2aWNlcywgaW5jbHVkaW5nIHRlbG5ldGQuCisJICBZb3UgbW9zdCBwcm9iYWJseSB3YW50IHRvIHNheSBOIGhlcmUuCisKK2NvbmZpZyBURlRQCisJYm9vbCAidGZ0cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCBjbGllbnQgcHJvZ3JhbS4gVEZUUAorCSAgaXMgdXN1YWxseSB1c2VkIGZvciBzaW1wbGUsIHNtYWxsIHRyYW5zZmVycyBzdWNoIGFzIGEgcm9vdCBpbWFnZQorCSAgZm9yIGEgbmV0d29yay1lbmFibGVkIGJvb3Rsb2FkZXIuCisKK2NvbmZpZyBURlRQRAorCWJvb2wgInRmdHBkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIHNlcnZlciBwcm9ncmFtLgorCSAgSXQgZXhwZWN0cyB0aGF0IHN0ZGluIGlzIGEgZGF0YWdyYW0gc29ja2V0IGFuZCBhIHBhY2tldAorCSAgaXMgYWxyZWFkeSBwZW5kaW5nIG9uIGl0LiBJdCB3aWxsIGV4aXQgYWZ0ZXIgb25lIHRyYW5zZmVyLgorCSAgSW4gb3RoZXIgd29yZHM6IGl0IHNob3VsZCBiZSBydW4gZnJvbSBpbmV0ZCBpbiBub3dhaXQgbW9kZSwKKwkgIG9yIGZyb20gdWRwc3ZkLiBFeGFtcGxlOiAidWRwc3ZkIC1FIDAgNjkgdGZ0cGQgRElSIgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgdGZ0cC90ZnRwZCIKKwlkZXBlbmRzIG9uIFRGVFAgfHwgVEZUUEQKKworY29uZmlnIEZFQVRVUkVfVEZUUF9HRVQKKwlib29sICJFbmFibGUgJ3RmdHAgZ2V0JyBhbmQvb3IgdGZ0cGQgdXBsb2FkIGNvZGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBHRVQgY29tbWFuZCB3aXRoaW4gdGhlIFRGVFAgY2xpZW50LiBUaGlzIGFsbG93cworCSAgYSBjbGllbnQgdG8gcmV0cmlldmUgYSBmaWxlIGZyb20gYSBURlRQIHNlcnZlci4KKwkgIEFsc28gZW5hYmxlIHVwbG9hZCBzdXBwb3J0IGluIHRmdHBkLCBpZiB0ZnRwZCBpcyBzZWxlY3RlZC4KKworCSAgTm90ZTogdGhpcyBvcHRpb24gZG9lcyBfbm90XyBtYWtlIHRmdHBkIGNhcGFibGUgb2YgZG93bmxvYWQKKwkgICh0aGUgdXN1YWwgb3BlcmF0aW9uIHBlb3BsZSBuZWVkIGZyb20gaXQpIQorCitjb25maWcgRkVBVFVSRV9URlRQX1BVVAorCWJvb2wgIkVuYWJsZSAndGZ0cCBwdXQnIGFuZC9vciB0ZnRwZCBkb3dubG9hZCBjb2RlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciB0aGUgUFVUIGNvbW1hbmQgd2l0aGluIHRoZSBURlRQIGNsaWVudC4gVGhpcyBhbGxvd3MKKwkgIGEgY2xpZW50IHRvIHRyYW5zZmVyIGEgZmlsZSB0byBhIFRGVFAgc2VydmVyLgorCSAgQWxzbyBlbmFibGUgZG93bmxvYWQgc3VwcG9ydCBpbiB0ZnRwZCwgaWYgdGZ0cGQgaXMgc2VsZWN0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJYm9vbCAiRW5hYmxlICdibGtzaXplJyBhbmQgJ3RzaXplJyBwcm90b2NvbCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCWhlbHAKKwkgIEFsbG93IHRmdHAgdG8gc3BlY2lmeSBibG9jayBzaXplLCBhbmQgdGZ0cGQgdG8gdW5kZXJzdGFuZAorCSAgImJsa3NpemUiIGFuZCAidHNpemUiIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCisJYm9vbCAiRW5hYmxlIHRmdHAgcHJvZ3Jlc3MgbWV0ZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURlRQICYmIEZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwloZWxwCisJICBTaG93IHByb2dyZXNzIGJhci4KKworY29uZmlnIFRGVFBfREVCVUcKKwlib29sICJFbmFibGUgZGVidWciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisJaGVscAorCSAgTWFrZSB0ZnRwW2RdIHByaW50IGRlYnVnZ2luZyBtZXNzYWdlcyBvbiBzdGRlcnIuCisJICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGRpYWdub3NpbmcgYSBidWcgaW4gdGZ0cFtkXS4KKworY29uZmlnIFRSQUNFUk9VVEUKKwlib29sICJ0cmFjZXJvdXRlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gdHJhY2UgdGhlIHJvdXRlIG9mIElQIHBhY2tldHMuCisKK2NvbmZpZyBUUkFDRVJPVVRFNgorCWJvb2wgInRyYWNlcm91dGU2IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUFY2ICYmIFRSQUNFUk9VVEUKKwloZWxwCisJICBVdGlsaXR5IHRvIHRyYWNlIHRoZSByb3V0ZSBvZiBJUHY2IHBhY2tldHMuCisKK2NvbmZpZyBGRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRQorCWJvb2wgIkVuYWJsZSB2ZXJib3NlIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRSQUNFUk9VVEUKKwloZWxwCisJICBBZGQgc29tZSB2ZXJib3NpdHkgdG8gdHJhY2Vyb3V0ZS4gVGhpcyBpbmNsdWRlcyBhbW9uZyBvdGhlciB0aGluZ3MKKwkgIGhvc3RuYW1lcyBhbmQgSUNNUCByZXNwb25zZSB0eXBlcy4KKworY29uZmlnIEZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlib29sICJFbmFibGUgbG9vc2Ugc291cmNlIHJvdXRlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFJBQ0VST1VURQorCWhlbHAKKwkgIEFkZCBvcHRpb24gdG8gc3BlY2lmeSBhIGxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5CisJICAoOCBtYXhpbXVtKS4KKworY29uZmlnIEZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUAorCWJvb2wgIlVzZSBJQ01QIGluc3RlYWQgb2YgVURQIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVFJBQ0VST1VURQorCWhlbHAKKwkgIEFkZCBvcHRpb24gLUkgdG8gdXNlIElDTVAgRUNITyBpbnN0ZWFkIG9mIFVEUCBkYXRhZ3JhbXMuCisKK2NvbmZpZyBUVU5DVEwKKwlib29sICJ0dW5jdGwiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgdHVuY3RsIGNyZWF0ZXMgb3IgZGVsZXRlcyB0dW4gZGV2aWNlcy4KKworY29uZmlnIEZFQVRVUkVfVFVOQ1RMX1VHCisJYm9vbCAiU3VwcG9ydCBvd25lcjpncm91cCBhc3NpZ25tZW50IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVFVOQ1RMCisJaGVscAorCSAgQWxsb3cgdG8gc3BlY2lmeSBvd25lciBhbmQgZ3JvdXAgb2YgbmV3bHkgY3JlYXRlZCBpbnRlcmZhY2UuCisJICAzNDAgYnl0ZXMgb2YgcHVyZSBibG9hdC4gU2F5IG5vIGhlcmUuCisKK3NvdXJjZSBuZXR3b3JraW5nL3VkaGNwL0NvbmZpZy5pbgorCitjb25maWcgSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TCisJc3RyaW5nICJpZnVwIHVkaGNwYyBjb21tYW5kIGxpbmUgb3B0aW9ucyIKKwlkZWZhdWx0ICItUiAtbiIKKwlkZXBlbmRzIG9uIElGVVBET1dOICYmIFVESENQQworCWhlbHAKKwkgIENvbW1hbmQgbGluZSBvcHRpb25zIHRvIHBhc3MgdG8gdWRoY3BjIGZyb20gaWZ1cC4KKwkgIEludGVuZGVkIHRvIGFsdGVyIG9wdGlvbnMgbm90IGF2YWlsYWJsZSBpbiAvZXRjL25ldHdvcmsvaW50ZXJmYWNlcy4KKwkgIChJRTogLS1zeXNsb2cgLS1iYWNrZ3JvdW5kIGV0Yy4uLikKKworY29uZmlnIFVEUFNWRAorCWJvb2wgInVkcHN2ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1ZHBzdmQgbGlzdGVucyBvbiBhbiBVRFAgcG9ydCBhbmQgcnVucyBhIHByb2dyYW0gZm9yIGVhY2ggbmV3CisJICBjb25uZWN0aW9uLgorCitjb25maWcgVkNPTkZJRworCWJvb2wgInZjb25maWciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQ3JlYXRlcywgcmVtb3ZlcywgYW5kIGNvbmZpZ3VyZXMgVkxBTiBpbnRlcmZhY2VzCisKK2NvbmZpZyBXR0VUCisJYm9vbCAid2dldCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3Z2V0IGlzIGEgdXRpbGl0eSBmb3Igbm9uLWludGVyYWN0aXZlIGRvd25sb2FkIG9mIGZpbGVzIGZyb20gSFRUUCwKKwkgIEhUVFBTLCBhbmQgRlRQIHNlcnZlcnMuCisKK2NvbmZpZyBGRUFUVVJFX1dHRVRfU1RBVFVTQkFSCisJYm9vbCAiRW5hYmxlIGEgbmlmdHkgcHJvY2VzcyBtZXRlciAoKzJrKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdHRVQKKwloZWxwCisJICBFbmFibGUgdGhlIHRyYW5zZmVyIHByb2dyZXNzIGJhciBmb3Igd2dldCB0cmFuc2ZlcnMuCisKK2NvbmZpZyBGRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKwlib29sICJFbmFibGUgSFRUUCBhdXRoZW50aWNhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdHRVQKKwloZWxwCisJICBTdXBwb3J0IGF1dGhlbnRpY2F0ZWQgSFRUUCB0cmFuc2ZlcnMuCisKK2NvbmZpZyBGRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdHRVQgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSB3Z2V0IGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfV0dFVF9USU1FT1VUCisJYm9vbCAiRW5hYmxlIHJlYWQgdGltZW91dCBvcHRpb24gLVQgU0VDIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gV0dFVAorCWhlbHAKKwkgIFN1cHBvcnRzIG5ldHdvcmsgcmVhZCB0aW1lb3V0IGZvciB3Z2V0LCBzbyB0aGF0IHdnZXQgd2lsbCBnaXZlCisJICB1cCBhbmQgdGltZW91dCB3aGVuIHJlYWRpbmcgbmV0d29yayBkYXRhLCB0aHJvdWdoIHRoZSAtVCBjb21tYW5kCisJICBsaW5lIG9wdGlvbi4gIEN1cnJlbnRseSBvbmx5IG5ldHdvcmsgZGF0YSByZWFkIHRpbWVvdXQgaXMKKwkgIHN1cHBvcnRlZCAoaS5lLiwgdGltZW91dCBpcyBub3QgYXBwbGllZCB0byB0aGUgRE5TIG5vciBUQ1AKKwkgIGNvbm5lY3Rpb24gaW5pdGlhbGl6YXRpb24pLiAgV2hlbiBGRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TIGlzCisJICBhbHNvIGVuYWJsZWQsIHRoZSAtLXRpbWVvdXQgb3B0aW9uIHdpbGwgd29yayBpbiBhZGRpdGlvbiB0byAtVC4KKworY29uZmlnIFpDSVAKKwlib29sICJ6Y2lwIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIFpDSVAgcHJvdmlkZXMgWmVyb0NvbmYgSVB2NCBhZGRyZXNzIHNlbGVjdGlvbiwgYWNjb3JkaW5nIHRvIFJGQyAzOTI3LgorCSAgSXQncyBhIGRhZW1vbiB0aGF0IGFsbG9jYXRlcyBhbmQgZGVmZW5kcyBhIGR5bmFtaWNhbGx5IGFzc2lnbmVkCisJICBhZGRyZXNzIG9uIHRoZSAxNjkuMjU0LzE2IG5ldHdvcmssIHJlcXVpcmluZyBubyBzeXN0ZW0gYWRtaW5pc3RyYXRvci4KKworCSAgU2VlIGh0dHA6Ly93d3cuemVyb2NvbmYub3JnIGZvciBmdXJ0aGVyIGRldGFpbHMsIGFuZCAiemNpcC5zY3JpcHQiCisJICBpbiB0aGUgYnVzeWJveCBleGFtcGxlcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9LYnVpbGQuc3JjIGIvbmV0d29ya2luZy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NGYyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL0tidWlsZC5zcmMKQEAgLTAsMCArMSw0OCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQVJQKSAgICAgICAgICArPSBhcnAubyBpbnRlcmZhY2UubworbGliLSQoQ09ORklHX0FSUElORykgICAgICAgKz0gYXJwaW5nLm8KK2xpYi0kKENPTkZJR19CUkNUTCkgICAgICAgICs9IGJyY3RsLm8KK2xpYi0kKENPTkZJR19ETlNEKSAgICAgICAgICs9IGRuc2QubworbGliLSQoQ09ORklHX0VUSEVSX1dBS0UpICAgKz0gZXRoZXItd2FrZS5vCitsaWItJChDT05GSUdfRkFLRUlERU5URCkgICArPSBpc3J2X2lkZW50ZC5vIGlzcnYubworbGliLSQoQ09ORklHX0ZUUEQpICAgICAgICAgKz0gZnRwZC5vCitsaWItJChDT05GSUdfRlRQR0VUKSAgICAgICArPSBmdHBnZXRwdXQubworbGliLSQoQ09ORklHX0ZUUFBVVCkgICAgICAgKz0gZnRwZ2V0cHV0Lm8KK2xpYi0kKENPTkZJR19IT1NUTkFNRSkgICAgICs9IGhvc3RuYW1lLm8KK2xpYi0kKENPTkZJR19IVFRQRCkgICAgICAgICs9IGh0dHBkLm8KK2xpYi0kKENPTkZJR19JRkNPTkZJRykgICAgICs9IGlmY29uZmlnLm8gaW50ZXJmYWNlLm8KK2xpYi0kKENPTkZJR19JRkVOU0xBVkUpICAgICs9IGlmZW5zbGF2ZS5vIGludGVyZmFjZS5vCitsaWItJChDT05GSUdfSUZQTFVHRCkgICAgICArPSBpZnBsdWdkLm8KK2xpYi0kKENPTkZJR19JRlVQRE9XTikgICAgICs9IGlmdXBkb3duLm8KK2xpYi0kKENPTkZJR19JTkVURCkgICAgICAgICs9IGluZXRkLm8KK2xpYi0kKENPTkZJR19JUCkgICAgICAgICAgICs9IGlwLm8KK2xpYi0kKENPTkZJR19JUENBTEMpICAgICAgICs9IGlwY2FsYy5vCitsaWItJChDT05GSUdfTkFNRUlGKSAgICAgICArPSBuYW1laWYubworbGliLSQoQ09ORklHX05DKSAgICAgICAgICAgKz0gbmMubworbGliLSQoQ09ORklHX05FVFNUQVQpICAgICAgKz0gbmV0c3RhdC5vCitsaWItJChDT05GSUdfTlNMT09LVVApICAgICArPSBuc2xvb2t1cC5vCitsaWItJChDT05GSUdfTlRQRCkgICAgICAgICArPSBudHBkLm8KK2xpYi0kKENPTkZJR19QU0NBTikgICAgICAgICs9IHBzY2FuLm8KK2xpYi0kKENPTkZJR19ST1VURSkgICAgICAgICs9IHJvdXRlLm8KK2xpYi0kKENPTkZJR19TTEFUVEFDSCkgICAgICs9IHNsYXR0YWNoLm8KK2xpYi0kKENPTkZJR19UQykgICAgICAgICAgICs9IHRjLm8KK2xpYi0kKENPTkZJR19URUxORVQpICAgICAgICs9IHRlbG5ldC5vCitsaWItJChDT05GSUdfVEVMTkVURCkgICAgICArPSB0ZWxuZXRkLm8KK2xpYi0kKENPTkZJR19URlRQKSAgICAgICAgICs9IHRmdHAubworbGliLSQoQ09ORklHX1RGVFBEKSAgICAgICAgKz0gdGZ0cC5vCitsaWItJChDT05GSUdfVFJBQ0VST1VURSkgICArPSB0cmFjZXJvdXRlLm8KK2xpYi0kKENPTkZJR19UVU5DVEwpICAgICAgICs9IHR1bmN0bC5vCitsaWItJChDT05GSUdfVkNPTkZJRykgICAgICArPSB2Y29uZmlnLm8KK2xpYi0kKENPTkZJR19XR0VUKSAgICAgICAgICs9IHdnZXQubworbGliLSQoQ09ORklHX1pDSVApICAgICAgICAgKz0gemNpcC5vCisKK2xpYi0kKENPTkZJR19UQ1BTVkQpICAgICAgICs9IHRjcHVkcC5vIHRjcHVkcF9wZXJob3N0Lm8KK2xpYi0kKENPTkZJR19VRFBTVkQpICAgICAgICs9IHRjcHVkcC5vIHRjcHVkcF9wZXJob3N0Lm8KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvYXJwLmMgYi9uZXR3b3JraW5nL2FycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NmM0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2FycC5jCkBAIC0wLDAgKzEsNTMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhcnAuYyAtIE1hbmlwdWxhdGUgdGhlIHN5c3RlbSBBUlAgY2FjaGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplIGF0IHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKiBCdXN5Ym94IHBvcnQ6IFBhdWwgdmFuIEdvb2wgPHB2YW5nb29sIGF0IG1pbW90ZWNoLmNvbT4KKyAqCisgKiBtb2RpZmllZCBmb3IgZ2V0b3B0MzIgYnkgQXJuZSBCZXJuaW4gPGFybmUgW2F0XSBhbGFtdXQuZGU+CisgKi8KKworLy91c2FnZTojZGVmaW5lIGFycF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgIlxuWy12bl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtYSBbSE9TVE5BTUVdIgorLy91c2FnZTogICAgICJcblstdl0JCSAgICBbLWkgSUZdIC1kIEhPU1ROQU1FIFtwdWJdIgorLy91c2FnZTogICAgICJcblstdl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtcyBIT1NUTkFNRSBIV0FERFIgW3RlbXBdIgorLy91c2FnZTogICAgICJcblstdl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtcyBIT1NUTkFNRSBIV0FERFIgW25ldG1hc2sgTUFTS10gcHViIgorLy91c2FnZTogICAgICJcblstdl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtRHMgSE9TVE5BTUUgSUZBQ0UgW25ldG1hc2sgTUFTS10gcHViIgorLy91c2FnZTojZGVmaW5lIGFycF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1hbmlwdWxhdGUgQVJQIGNhY2hlXG4iCisvL3VzYWdlOiAgICAgICAiXG4JLWEJCURpc3BsYXkgKGFsbCkgaG9zdHMiCisvL3VzYWdlOiAgICAgICAiXG4JLXMJCVNldCBuZXcgQVJQIGVudHJ5IgorLy91c2FnZTogICAgICAgIlxuCS1kCQlEZWxldGUgYSBzcGVjaWZpZWQgZW50cnkiCisvL3VzYWdlOiAgICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgICAiXG4JLW4JCURvbid0IHJlc29sdmUgbmFtZXMiCisvL3VzYWdlOiAgICAgICAiXG4JLWkgSUYJCU5ldHdvcmsgaW50ZXJmYWNlIgorLy91c2FnZTogICAgICAgIlxuCS1ECQlSZWFkIDxod2FkZHI+IGZyb20gZ2l2ZW4gZGV2aWNlIgorLy91c2FnZTogICAgICAgIlxuCS1BLC1wIEFGCVByb3RvY29sIGZhbWlseSIKKy8vdXNhZ2U6ICAgICAgICJcbgktSCBIV1RZUEUJSGFyZHdhcmUgYWRkcmVzcyB0eXBlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisKKyNkZWZpbmUgREVCVUcgMAorCisjZGVmaW5lIERGTFRfQUYgImluZXQiCisjZGVmaW5lIERGTFRfSFcgImV0aGVyIgorCitlbnVtIHsKKwlBUlBfT1BUX0EgPSAoMSA8PCAwKSwKKwlBUlBfT1BUX3AgPSAoMSA8PCAxKSwKKwlBUlBfT1BUX0ggPSAoMSA8PCAyKSwKKwlBUlBfT1BUX3QgPSAoMSA8PCAzKSwKKwlBUlBfT1BUX2kgPSAoMSA8PCA0KSwKKwlBUlBfT1BUX2EgPSAoMSA8PCA1KSwKKwlBUlBfT1BUX2QgPSAoMSA8PCA2KSwKKwlBUlBfT1BUX24gPSAoMSA8PCA3KSwgLyogZG8gbm90IHJlc29sdmUgYWRkcmVzc2VzICovCisJQVJQX09QVF9EID0gKDEgPDwgOCksIC8qIEhXLWFkZHJlc3MgaXMgZGV2aWNlbmFtZSAqLworCUFSUF9PUFRfcyA9ICgxIDw8IDkpLAorCUFSUF9PUFRfdiA9ICgxIDw8IDEwKSAqIERFQlVHLCAvKiBkZWJ1Z2dpbmcgb3V0cHV0IGZsYWcgKi8KK307CisKK2VudW0geworCXNvY2tmZCA9IDMsIC8qIGFjdGl2ZSBzb2NrZXQgZGVzY3JpcHRvciAqLworfTsKKworc3RydWN0IGdsb2JhbHMgeworCWNvbnN0IHN0cnVjdCBhZnR5cGUgKmFwOyAvKiBjdXJyZW50IGFkZHJlc3MgZmFtaWx5ICovCisJY29uc3Qgc3RydWN0IGh3dHlwZSAqaHc7IC8qIGN1cnJlbnQgaGFyZHdhcmUgdHlwZSAqLworCWNvbnN0IGNoYXIgKmRldmljZTsgICAgICAvKiBjdXJyZW50IGRldmljZSAqLworCXNtYWxsaW50IGh3X3NldDsgICAgICAgICAvKiBmbGFnIGlmIGh3LXR5cGUgd2FzIHNldCAoLUgpICovCisKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIGFwICAgICAgICAgKEcuYXAgICAgICAgICkKKyNkZWZpbmUgaHcgICAgICAgICAoRy5odyAgICAgICAgKQorI2RlZmluZSBkZXZpY2UgICAgIChHLmRldmljZSAgICApCisjZGVmaW5lIGh3X3NldCAgICAgKEcuaHdfc2V0ICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJZGV2aWNlID0gIiI7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uc1tdIEFMSUdOMSA9CisJInB1YlwwIgorCSJwcml2XDAiCisJInRlbXBcMCIKKwkidHJhaWxcMCIKKwkiZG9udHB1YlwwIgorCSJhdXRvXDAiCisJImRldlwwIgorCSJuZXRtYXNrXDAiOworCisvKiBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgQVJQIGNhY2hlLiAqLworLyogQ2FsbGVkIG9ubHkgZnJvbSBtYWluLCBvbmNlICovCitzdGF0aWMgaW50IGFycF9kZWwoY2hhciAqKmFyZ3MpCit7CisJY2hhciAqaG9zdDsKKwlzdHJ1Y3QgYXJwcmVxIHJlcTsKKwlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJaW50IGZsYWdzID0gMDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCS8qIFJlc29sdmUgdGhlIGhvc3QgbmFtZS4gKi8KKwlob3N0ID0gKmFyZ3M7CisJaWYgKGFwLT5pbnB1dChob3N0LCAmc2EpIDwgMCkgeworCQliYl9oZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgaG9zdCk7CisJfQorCisJLyogSWYgYSBob3N0IGhhcyBtb3JlIHRoYW4gb25lIGFkZHJlc3MsIHVzZSB0aGUgY29ycmVjdCBvbmUhICovCisJbWVtY3B5KCZyZXEuYXJwX3BhLCAmc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKworCWlmIChod19zZXQpCisJCXJlcS5hcnBfaGEuc2FfZmFtaWx5ID0gaHctPnR5cGU7CisKKwlyZXEuYXJwX2ZsYWdzID0gQVRGX1BFUk07CisJYXJncysrOworCXdoaWxlICgqYXJncyAhPSBOVUxMKSB7CisJCXN3aXRjaCAoaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCAqYXJncykpIHsKKwkJY2FzZSAwOiAvKiAicHViIiAqLworCQkJZmxhZ3MgfD0gMTsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qICJwcml2IiAqLworCQkJZmxhZ3MgfD0gMjsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8qICJ0ZW1wIiAqLworCQkJcmVxLmFycF9mbGFncyAmPSB+QVRGX1BFUk07CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSAzOiAvKiAidHJhaWwiICovCisJCQlyZXEuYXJwX2ZsYWdzIHw9IEFURl9VU0VUUkFJTEVSUzsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDQ6IC8qICJkb250cHViIiAqLworI2lmZGVmIEhBVkVfQVRGX0RPTlRQVUIKKwkJCXJlcS5hcnBfZmxhZ3MgfD0gQVRGX0RPTlRQVUI7CisjZWxzZQorCQkJYmJfZXJyb3JfbXNnKCJmZWF0dXJlIEFURl9ET05UUFVCIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNTogLyogImF1dG8iICovCisjaWZkZWYgSEFWRV9BVEZfTUFHSUMKKwkJCXJlcS5hcnBfZmxhZ3MgfD0gQVRGX01BR0lDOworI2Vsc2UKKwkJCWJiX2Vycm9yX21zZygiZmVhdHVyZSBBVEZfTUFHSUMgaXMgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA2OiAvKiAiZGV2IiAqLworCQkJaWYgKCorK2FyZ3MgPT0gTlVMTCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlkZXZpY2UgPSAqYXJnczsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDc6IC8qICJuZXRtYXNrIiAqLworCQkJaWYgKCorK2FyZ3MgPT0gTlVMTCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlpZiAoc3RyY21wKCphcmdzLCAiMjU1LjI1NS4yNTUuMjU1IikgIT0gMCkgeworCQkJCWhvc3QgPSAqYXJnczsKKwkJCQlpZiAoYXAtPmlucHV0KGhvc3QsICZzYSkgPCAwKSB7CisJCQkJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBob3N0KTsKKwkJCQl9CisJCQkJbWVtY3B5KCZyZXEuYXJwX25ldG1hc2ssICZzYSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQkJCXJlcS5hcnBfZmxhZ3MgfD0gQVRGX05FVE1BU0s7CisJCQl9CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmbGFncyA9PSAwKQorCQlmbGFncyA9IDM7CisKKwlzdHJuY3B5KHJlcS5hcnBfZGV2LCBkZXZpY2UsIHNpemVvZihyZXEuYXJwX2RldikpOworCisJZXJyID0gLTE7CisKKwkvKiBDYWxsIHRoZSBrZXJuZWwuICovCisJaWYgKGZsYWdzICYgMikgeworCQlpZiAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfdikKKwkJCWJiX2Vycm9yX21zZygiU0lPQ0RBUlAobm9wdWIpIik7CisJCWVyciA9IGlvY3RsKHNvY2tmZCwgU0lPQ0RBUlAsICZyZXEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOWElPKSB7CisJCQkJaWYgKGZsYWdzICYgMSkKKwkJCQkJZ290byBub3B1YjsKKwkJCQlwcmludGYoIk5vIEFSUCBlbnRyeSBmb3IgJXNcbiIsIGhvc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU0lPQ0RBUlAocHJpdikiKTsKKwkJfQorCX0KKwlpZiAoKGZsYWdzICYgMSkgJiYgZXJyKSB7Cisgbm9wdWI6CisJCXJlcS5hcnBfZmxhZ3MgfD0gQVRGX1BVQkw7CisJCWlmIChvcHRpb25fbWFzazMyICYgQVJQX09QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJTSU9DREFSUChwdWIpIik7CisJCWlmIChpb2N0bChzb2NrZmQsIFNJT0NEQVJQLCAmcmVxKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTlhJTykgeworCQkJCXByaW50ZigiTm8gQVJQIGVudHJ5IGZvciAlc1xuIiwgaG9zdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJTSU9DREFSUChwdWIpIik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyB0byBhIHNwZWNpZmllZCBpbnRlcmZhY2UgbmFtZSAqLworc3RhdGljIHZvaWQgYXJwX2dldGRldmh3KGNoYXIgKmlmbmFtZSwgc3RydWN0IHNvY2thZGRyICpzYSwKKwkJCQkJCSBjb25zdCBzdHJ1Y3QgaHd0eXBlICpod3QpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwljb25zdCBzdHJ1Y3QgaHd0eXBlICp4aHc7CisKKwlzdHJjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKHNvY2tmZCwgU0lPQ0dJRkhXQUREUiwgJmlmciwKKwkJCQkJImNhbnQgZ2V0IEhXLUFkZHJlc3MgZm9yICclcyciLCBpZm5hbWUpOworCWlmIChod3QgJiYgKGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseSAhPSBody0+dHlwZSkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInByb3RvY29sIHR5cGUgbWlzbWF0Y2giKTsKKwl9CisJbWVtY3B5KHNhLCAmKGlmci5pZnJfaHdhZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX3YpIHsKKwkJeGh3ID0gZ2V0X2h3bnR5cGUoaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5KTsKKwkJaWYgKCF4aHcgfHwgIXhody0+cHJpbnQpIHsKKwkJCXhodyA9IGdldF9od250eXBlKC0xKTsKKwkJfQorCQliYl9lcnJvcl9tc2coImRldmljZSAnJXMnIGhhcyBIVyBhZGRyZXNzICVzICclcyciLAorCQkJCQkgaWZuYW1lLCB4aHctPm5hbWUsCisJCQkJCSB4aHctPnByaW50KCh1bnNpZ25lZCBjaGFyICopICZpZnIuaWZyX2h3YWRkci5zYV9kYXRhKSk7CisJfQorfQorCisvKiBTZXQgYW4gZW50cnkgaW4gdGhlIEFSUCBjYWNoZS4gKi8KKy8qIENhbGxlZCBvbmx5IGZyb20gbWFpbiwgb25jZSAqLworc3RhdGljIGludCBhcnBfc2V0KGNoYXIgKiphcmdzKQoreworCWNoYXIgKmhvc3Q7CisJc3RydWN0IGFycHJlcSByZXE7CisJc3RydWN0IHNvY2thZGRyIHNhOworCWludCBmbGFnczsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlob3N0ID0gKmFyZ3MrKzsKKwlpZiAoYXAtPmlucHV0KGhvc3QsICZzYSkgPCAwKSB7CisJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBob3N0KTsKKwl9CisJLyogSWYgYSBob3N0IGhhcyBtb3JlIHRoYW4gb25lIGFkZHJlc3MsIHVzZSB0aGUgY29ycmVjdCBvbmUhICovCisJbWVtY3B5KCZyZXEuYXJwX3BhLCAmc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKworCS8qIEZldGNoIHRoZSBoYXJkd2FyZSBhZGRyZXNzLiAqLworCWlmICgqYXJncyA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZWVkIGhhcmR3YXJlIGFkZHJlc3MiKTsKKwl9CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX0QpIHsKKwkJYXJwX2dldGRldmh3KCphcmdzKyssICZyZXEuYXJwX2hhLCBod19zZXQgPyBodyA6IE5VTEwpOworCX0gZWxzZSB7CisJCWlmIChody0+aW5wdXQoKmFyZ3MrKywgJnJlcS5hcnBfaGEpIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgaGFyZHdhcmUgYWRkcmVzcyIpOworCQl9CisJfQorCisJLyogQ2hlY2sgb3V0IGFueSBtb2RpZmllcnMuICovCisJZmxhZ3MgPSBBVEZfUEVSTSB8IEFURl9DT007CisJd2hpbGUgKCphcmdzICE9IE5VTEwpIHsKKwkJc3dpdGNoIChpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsICphcmdzKSkgeworCQljYXNlIDA6IC8qICJwdWIiICovCisJCQlmbGFncyB8PSBBVEZfUFVCTDsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qICJwcml2IiAqLworCQkJZmxhZ3MgJj0gfkFURl9QVUJMOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogInRlbXAiICovCisJCQlmbGFncyAmPSB+QVRGX1BFUk07CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSAzOiAvKiAidHJhaWwiICovCisJCQlmbGFncyB8PSBBVEZfVVNFVFJBSUxFUlM7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA0OiAvKiAiZG9udHB1YiIgKi8KKyNpZmRlZiBIQVZFX0FURl9ET05UUFVCCisJCQlmbGFncyB8PSBBVEZfRE9OVFBVQjsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coImZlYXR1cmUgQVRGX0RPTlRQVUIgaXMgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA1OiAvKiAiYXV0byIgKi8KKyNpZmRlZiBIQVZFX0FURl9NQUdJQworCQkJZmxhZ3MgfD0gQVRGX01BR0lDOworI2Vsc2UKKwkJCWJiX2Vycm9yX21zZygiZmVhdHVyZSBBVEZfTUFHSUMgaXMgbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA2OiAvKiAiZGV2IiAqLworCQkJaWYgKCorK2FyZ3MgPT0gTlVMTCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlkZXZpY2UgPSAqYXJnczsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDc6IC8qICJuZXRtYXNrIiAqLworCQkJaWYgKCorK2FyZ3MgPT0gTlVMTCkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlpZiAoc3RyY21wKCphcmdzLCAiMjU1LjI1NS4yNTUuMjU1IikgIT0gMCkgeworCQkJCWhvc3QgPSAqYXJnczsKKwkJCQlpZiAoYXAtPmlucHV0KGhvc3QsICZzYSkgPCAwKSB7CisJCQkJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBob3N0KTsKKwkJCQl9CisJCQkJbWVtY3B5KCZyZXEuYXJwX25ldG1hc2ssICZzYSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQkJCWZsYWdzIHw9IEFURl9ORVRNQVNLOworCQkJfQorCQkJYXJncysrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVxdWVzdC4gKi8KKwlyZXEuYXJwX2ZsYWdzID0gZmxhZ3M7CisKKwlzdHJuY3B5KHJlcS5hcnBfZGV2LCBkZXZpY2UsIHNpemVvZihyZXEuYXJwX2RldikpOworCisJLyogQ2FsbCB0aGUga2VybmVsLiAqLworCWlmIChvcHRpb25fbWFzazMyICYgQVJQX09QVF92KQorCQliYl9lcnJvcl9tc2coIlNJT0NTQVJQKCkiKTsKKwl4aW9jdGwoc29ja2ZkLCBTSU9DU0FSUCwgJnJlcSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIGFuIEFSUCByZXF1ZXN0IGJsb2NrLiAqLworc3RhdGljIHZvaWQKK2FycF9kaXNwKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmlwLCBpbnQgdHlwZSwgaW50IGFycF9mbGFncywKKwkJIGNoYXIgKmh3YSwgY2hhciAqbWFzaywgY2hhciAqZGV2KQoreworCXN0YXRpYyBjb25zdCBpbnQgYXJwX21hc2tzW10gPSB7CisJCUFURl9QRVJNLCBBVEZfUFVCTCwKKyNpZmRlZiBIQVZFX0FURl9NQUdJQworCQlBVEZfTUFHSUMsCisjZW5kaWYKKyNpZmRlZiBIQVZFX0FURl9ET05UUFVCCisJCUFURl9ET05UUFVCLAorI2VuZGlmCisJCUFURl9VU0VUUkFJTEVSUywKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIGFycF9sYWJlbHNbXSBBTElHTjEgPSAiUEVSTVwwIiJQVVBcMCIKKyNpZmRlZiBIQVZFX0FURl9NQUdJQworCQkiQVVUT1wwIgorI2VuZGlmCisjaWZkZWYgSEFWRV9BVEZfRE9OVFBVQgorCQkiRE9OVFBVQlwwIgorI2VuZGlmCisJCSJUUkFJTFwwIgorCTsKKworCWNvbnN0IHN0cnVjdCBod3R5cGUgKnhodzsKKworCXhodyA9IGdldF9od250eXBlKHR5cGUpOworCWlmICh4aHcgPT0gTlVMTCkKKwkJeGh3ID0gZ2V0X2h3dHlwZShERkxUX0hXKTsKKworCXByaW50ZigiJXMgKCVzKSBhdCAiLCBuYW1lLCBpcCk7CisKKwlpZiAoIShhcnBfZmxhZ3MgJiBBVEZfQ09NKSkgeworCQlpZiAoYXJwX2ZsYWdzICYgQVRGX1BVQkwpCisJCQlwcmludGYoIiogIik7CisJCWVsc2UKKwkJCXByaW50ZigiPGluY29tcGxldGU+ICIpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXMgWyVzXSAiLCBod2EsIHhody0+bmFtZSk7CisJfQorCisJaWYgKGFycF9mbGFncyAmIEFURl9ORVRNQVNLKQorCQlwcmludGYoIm5ldG1hc2sgJXMgIiwgbWFzayk7CisKKwlwcmludF9mbGFnc19zZXBhcmF0ZWQoYXJwX21hc2tzLCBhcnBfbGFiZWxzLCBhcnBfZmxhZ3MsICIgIik7CisJcHJpbnRmKCIgb24gJXNcbiIsIGRldik7Cit9CisKKy8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBBUlAgY2FjaGUgaW4gdGhlIGtlcm5lbC4gKi8KKy8qIENhbGxlZCBvbmx5IGZyb20gbWFpbiwgb25jZSAqLworc3RhdGljIGludCBhcnBfc2hvdyhjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKmhvc3Q7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJRklMRSAqZnA7CisJc3RydWN0IHNvY2thZGRyIHNhOworCWludCB0eXBlLCBmbGFnczsKKwlpbnQgbnVtOworCXVuc2lnbmVkIGVudHJpZXMgPSAwLCBzaG93biA9IDA7CisJY2hhciBpcFsxMjhdOworCWNoYXIgaHdhWzEyOF07CisJY2hhciBtYXNrWzEyOF07CisJY2hhciBsaW5lWzEyOF07CisJY2hhciBkZXZbMTI4XTsKKworCWhvc3QgPSBOVUxMOworCWlmIChuYW1lICE9IE5VTEwpIHsKKwkJLyogUmVzb2x2ZSB0aGUgaG9zdCBuYW1lLiAqLworCQlpZiAoYXAtPmlucHV0KG5hbWUsICZzYSkgPCAwKSB7CisJCQliYl9oZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgbmFtZSk7CisJCX0KKwkJaG9zdCA9IHhzdHJkdXAoYXAtPnNwcmludCgmc2EsIDEpKTsKKwl9CisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL25ldC9hcnAiKTsKKwkvKiBCeXBhc3MgaGVhZGVyIC0tIHJlYWQgb25lIGxpbmUgKi8KKwlmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKTsKKworCS8qIFJlYWQgdGhlIEFSUCBjYWNoZSBlbnRyaWVzLiAqLworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCisJCW1hc2tbMF0gPSAnLSc7IG1hc2tbMV0gPSAnXDAnOworCQlkZXZbMF0gPSAnLSc7IGRldlsxXSA9ICdcMCc7CisJCS8qIEFsbCB0aGVzZSBzdHJpbmdzIGNhbid0IG92ZXJmbG93CisJCSAqIGJlY2F1c2UgZmdldHMgYWJvdmUgcmVhZHMgbGltaXRlZCBhbW91bnQgb2YgZGF0YSAqLworCQludW0gPSBzc2NhbmYobGluZSwgIiVzIDB4JXggMHgleCAlcyAlcyAlc1xuIiwKKwkJCQkJIGlwLCAmdHlwZSwgJmZsYWdzLCBod2EsIG1hc2ssIGRldik7CisJCWlmIChudW0gPCA0KQorCQkJYnJlYWs7CisKKwkJZW50cmllcysrOworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgaHctdHlwZSBkaWZmZXJzLCBza2lwIGl0ICovCisJCWlmIChod19zZXQgJiYgKHR5cGUgIT0gaHctPnR5cGUpKQorCQkJY29udGludWU7CisKKwkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFkZHJlc3MgZGlmZmVycywgc2tpcCBpdCAqLworCQlpZiAoaG9zdCAmJiBzdHJjbXAoaXAsIGhvc3QpICE9IDApCisJCQljb250aW51ZTsKKworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgZGV2aWNlIGRpZmZlcnMsIHNraXAgaXQgKi8KKwkJaWYgKGRldmljZVswXSAmJiBzdHJjbXAoZGV2LCBkZXZpY2UpICE9IDApCisJCQljb250aW51ZTsKKworCQlzaG93bisrOworCQkvKiBUaGlzIElTIHVnbHkgYnV0IGl0IHdvcmtzIC1iZSAqLworCQlob3N0bmFtZSA9ICI/IjsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfbikpIHsKKwkJCWlmIChhcC0+aW5wdXQoaXAsICZzYSkgPCAwKQorCQkJCWhvc3RuYW1lID0gaXA7CisJCQllbHNlCisJCQkJaG9zdG5hbWUgPSBhcC0+c3ByaW50KCZzYSwgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX24pIHwgMHg4MDAwKTsKKwkJCWlmIChzdHJjbXAoaG9zdG5hbWUsIGlwKSA9PSAwKQorCQkJCWhvc3RuYW1lID0gIj8iOworCQl9CisKKwkJYXJwX2Rpc3AoaG9zdG5hbWUsIGlwLCB0eXBlLCBmbGFncywgaHdhLCBtYXNrLCBkZXYpOworCX0KKwlpZiAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfdikKKwkJcHJpbnRmKCJFbnRyaWVzOiAlZFx0U2tpcHBlZDogJWRcdEZvdW5kOiAlZFxuIiwKKwkJCSAgIGVudHJpZXMsIGVudHJpZXMgLSBzaG93biwgc2hvd24pOworCisJaWYgKCFzaG93bikgeworCQlpZiAoaHdfc2V0IHx8IGhvc3QgfHwgZGV2aWNlWzBdKQorCQkJcHJpbnRmKCJObyBtYXRjaCBmb3VuZCBpbiAlZCBlbnRyaWVzXG4iLCBlbnRyaWVzKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoKGNoYXIqKWhvc3QpOworCQlmY2xvc2UoZnApOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFycF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYXJwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpod190eXBlID0gImV0aGVyIjsKKwljb25zdCBjaGFyICpwcm90b2NvbDsKKwl1bnNpZ25lZCBvcHRzOworCisJSU5JVF9HKCk7CisKKwl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApLCBzb2NrZmQpOworCWFwID0gZ2V0X2FmdHlwZShERkxUX0FGKTsKKwlpZiAoIWFwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6ICVzIG5vdCBzdXBwb3J0ZWQiLCBERkxUX0FGLCAiYWRkcmVzcyBmYW1pbHkiKTsKKworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiQTpwOkg6dDppOmFkbkRzdiIsICZwcm90b2NvbCwgJnByb3RvY29sLAorCQkJCSAmaHdfdHlwZSwgJmh3X3R5cGUsICZkZXZpY2UpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHRzICYgKEFSUF9PUFRfQSB8IEFSUF9PUFRfcCkpIHsKKwkJYXAgPSBnZXRfYWZ0eXBlKHByb3RvY29sKTsKKwkJaWYgKGFwID09IE5VTEwpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IHVua25vd24gJXMiLCBwcm90b2NvbCwgImFkZHJlc3MgZmFtaWx5Iik7CisJfQorCWlmIChvcHRzICYgKEFSUF9PUFRfQSB8IEFSUF9PUFRfcCkpIHsKKwkJaHcgPSBnZXRfaHd0eXBlKGh3X3R5cGUpOworCQlpZiAoaHcgPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogdW5rbm93biAlcyIsIGh3X3R5cGUsICJoYXJkd2FyZSB0eXBlIik7CisJCWh3X3NldCA9IDE7CisJfQorCS8vaWYgKG9wdHMgJiBBUlBfT1BUX2kpLi4uIC1pCisKKwlpZiAoYXAtPmFmICE9IEFGX0lORVQpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBrZXJuZWwgb25seSBzdXBwb3J0cyAnaW5ldCciLCBhcC0+bmFtZSk7CisJfQorCisJLyogSWYgbm8gaHcgdHlwZSBzcGVjaWZpZWQgZ2V0IGRlZmF1bHQgKi8KKwlpZiAoIWh3KSB7CisJCWh3ID0gZ2V0X2h3dHlwZShERkxUX0hXKTsKKwkJaWYgKCFodykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogJXMgbm90IHN1cHBvcnRlZCIsIERGTFRfSFcsICJoYXJkd2FyZSB0eXBlIik7CisJfQorCisJaWYgKGh3LT5hbGVuIDw9IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiAlcyB3aXRob3V0IEFSUCBzdXBwb3J0IiwKKwkJCQkJCQkgaHctPm5hbWUsICJoYXJkd2FyZSB0eXBlIik7CisJfQorCisJLyogTm93IHNlZSB3aGF0IHdlIGhhdmUgdG8gZG8gaGVyZS4uLiAqLworCWlmIChvcHRzICYgKEFSUF9PUFRfZCB8IEFSUF9PUFRfcykpIHsKKwkJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZWVkIGhvc3QgbmFtZSIpOworCQlpZiAob3B0cyAmIEFSUF9PUFRfcykKKwkJCXJldHVybiBhcnBfc2V0KGFyZ3YpOworCQlyZXR1cm4gYXJwX2RlbChhcmd2KTsKKwl9CisJLy9pZiAob3B0cyAmIEFSUF9PUFRfYSkgLSBkZWZhdWx0CisJcmV0dXJuIGFycF9zaG93KGFyZ3ZbMF0pOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9hcnBpbmcuYyBiL25ldHdvcmtpbmcvYXJwaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MjFlZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvYXJwaW5nLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yOiBBbGV4ZXkgS3V6bmV0c292IDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqIEJ1c3lib3ggcG9ydDogTmljayBGZWRjaGlrIDxuaWNrQGZlZGNoaWsub3JnLnVhPgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhcnBpbmdfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZnFiRFVBXSBbLWMgQ05UXSBbLXcgVElNRU9VVF0gWy1JIElGQUNFXSBbLXMgU1JDX0lQXSBEU1RfSVAiCisvL3VzYWdlOiNkZWZpbmUgYXJwaW5nX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBBUlAgcmVxdWVzdHMvcmVwbGllc1xuIgorLy91c2FnZTogICAgICJcbgktZgkJUXVpdCBvbiBmaXJzdCBBUlAgcmVwbHkiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCUtlZXAgYnJvYWRjYXN0aW5nLCBkb24ndCBnbyB1bmljYXN0IgorLy91c2FnZTogICAgICJcbgktRAkJRHVwbGljYXRlZCBhZGRyZXNzIGRldGVjdGlvbiBtb2RlIgorLy91c2FnZTogICAgICJcbgktVQkJVW5zb2xpY2l0ZWQgQVJQIG1vZGUsIHVwZGF0ZSB5b3VyIG5laWdoYm9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JLUEJCUFSUCBhbnN3ZXIgbW9kZSwgdXBkYXRlIHlvdXIgbmVpZ2hib3JzIgorLy91c2FnZTogICAgICJcbgktYyBOCQlTdG9wIGFmdGVyIHNlbmRpbmcgTiBBUlAgcmVxdWVzdHMiCisvL3VzYWdlOiAgICAgIlxuCS13IFRJTUVPVVQJVGltZSB0byB3YWl0IGZvciBBUlAgcmVwbHksIHNlY29uZHMiCisvL3VzYWdlOiAgICAgIlxuCS1JIElGQUNFCUludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMCkiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNSQ19JUAlTZW5kZXIgSVAgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JRFNUX0lQCQlUYXJnZXQgSVAgYWRkcmVzcyIKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBXZSBkb24ndCBleHBlY3QgdG8gc2VlIDEwMDArIHNlY29uZHMgZGVsYXksIHVuc2lnbmVkIGlzIGVub3VnaCAqLworI2RlZmluZSBNT05PVE9OSUNfVVMoKSAoKHVuc2lnbmVkKW1vbm90b25pY191cygpKQorCitlbnVtIHsKKwlEQUQgPSAxLAorCVVOU09MSUNJVEVEID0gMiwKKwlBRFZFUlQgPSA0LAorCVFVSUVUID0gOCwKKwlRVUlUX09OX1JFUExZID0gMTYsCisJQkNBU1RfT05MWSA9IDMyLAorCVVOSUNBU1RJTkcgPSA2NAorfTsKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBpbl9hZGRyIHNyYzsKKwlzdHJ1Y3QgaW5fYWRkciBkc3Q7CisJc3RydWN0IHNvY2thZGRyX2xsIG1lOworCXN0cnVjdCBzb2NrYWRkcl9sbCBoZTsKKwlpbnQgc29ja19mZDsKKworCWludCBjb3VudDsgLy8gPSAtMTsKKwl1bnNpZ25lZCBsYXN0OworCXVuc2lnbmVkIHRpbWVvdXRfdXM7CisJdW5zaWduZWQgc3RhcnQ7CisKKwl1bnNpZ25lZCBzZW50OworCXVuc2lnbmVkIGJyZF9zZW50OworCXVuc2lnbmVkIHJlY2VpdmVkOworCXVuc2lnbmVkIGJyZF9yZWN2OworCXVuc2lnbmVkIHJlcV9yZWN2OworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgc3JjICAgICAgICAoRy5zcmMgICAgICAgKQorI2RlZmluZSBkc3QgICAgICAgIChHLmRzdCAgICAgICApCisjZGVmaW5lIG1lICAgICAgICAgKEcubWUgICAgICAgICkKKyNkZWZpbmUgaGUgICAgICAgICAoRy5oZSAgICAgICAgKQorI2RlZmluZSBzb2NrX2ZkICAgIChHLnNvY2tfZmQgICApCisjZGVmaW5lIGNvdW50ICAgICAgKEcuY291bnQgICAgICkKKyNkZWZpbmUgbGFzdCAgICAgICAoRy5sYXN0ICAgICAgKQorI2RlZmluZSB0aW1lb3V0X3VzIChHLnRpbWVvdXRfdXMpCisjZGVmaW5lIHN0YXJ0ICAgICAgKEcuc3RhcnQgICAgICkKKyNkZWZpbmUgc2VudCAgICAgICAoRy5zZW50ICAgICAgKQorI2RlZmluZSBicmRfc2VudCAgIChHLmJyZF9zZW50ICApCisjZGVmaW5lIHJlY2VpdmVkICAgKEcucmVjZWl2ZWQgICkKKyNkZWZpbmUgYnJkX3JlY3YgICAoRy5icmRfcmVjdiAgKQorI2RlZmluZSByZXFfcmVjdiAgIChHLnJlcV9yZWN2ICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWNvdW50ID0gLTE7IFwKK30gd2hpbGUgKDApCisKKy8vIElmIEdOVWlzbXMgYXJlIG5vdCBhdmFpbGFibGUuLi4KKy8vc3RhdGljIHZvaWQgKm1lbXBjcHkodm9pZCAqX2RzdCwgY29uc3Qgdm9pZCAqX3NyYywgaW50IG4pCisvL3sKKy8vCW1lbWNweShfZHN0LCBfc3JjLCBuKTsKKy8vCXJldHVybiAoY2hhciopX2RzdCArIG47CisvL30KKworc3RhdGljIGludCBzZW5kX3BhY2soc3RydWN0IGluX2FkZHIgKnNyY19hZGRyLAorCQkJc3RydWN0IGluX2FkZHIgKmRzdF9hZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfbGwgKk1FLAorCQkJc3RydWN0IHNvY2thZGRyX2xsICpIRSkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07CisJc3RydWN0IGFycGhkciAqYWggPSAoc3RydWN0IGFycGhkciAqKSBidWY7CisJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIChhaCArIDEpOworCisJYWgtPmFyX2hyZCA9IGh0b25zKEFSUEhSRF9FVEhFUik7CisJYWgtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKKwlhaC0+YXJfaGxuID0gTUUtPnNsbF9oYWxlbjsKKwlhaC0+YXJfcGxuID0gNDsKKwlhaC0+YXJfb3AgPSBvcHRpb25fbWFzazMyICYgQURWRVJUID8gaHRvbnMoQVJQT1BfUkVQTFkpIDogaHRvbnMoQVJQT1BfUkVRVUVTVCk7CisKKwlwID0gbWVtcGNweShwLCAmTUUtPnNsbF9hZGRyLCBhaC0+YXJfaGxuKTsKKwlwID0gbWVtcGNweShwLCBzcmNfYWRkciwgNCk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEFEVkVSVCkKKwkJcCA9IG1lbXBjcHkocCwgJk1FLT5zbGxfYWRkciwgYWgtPmFyX2hsbik7CisJZWxzZQorCQlwID0gbWVtcGNweShwLCAmSEUtPnNsbF9hZGRyLCBhaC0+YXJfaGxuKTsKKworCXAgPSBtZW1wY3B5KHAsIGRzdF9hZGRyLCA0KTsKKworCWVyciA9IHNlbmR0byhzb2NrX2ZkLCBidWYsIHAgLSBidWYsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgSEUsIHNpemVvZigqSEUpKTsKKwlpZiAoZXJyID09IHAgLSBidWYpIHsKKwkJbGFzdCA9IE1PTk9UT05JQ19VUygpOworCQlzZW50Kys7CisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBVTklDQVNUSU5HKSkKKwkJCWJyZF9zZW50Kys7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaCh2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGZpbmlzaCh2b2lkKQoreworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBRVUlFVCkpIHsKKwkJcHJpbnRmKCJTZW50ICV1IHByb2JlKHMpICgldSBicm9hZGNhc3QocykpXG4iCisJCQkiUmVjZWl2ZWQgJXUgcmVwbCVzIgorCQkJIiAoJXUgcmVxdWVzdChzKSwgJXUgYnJvYWRjYXN0KHMpKVxuIiwKKwkJCXNlbnQsIGJyZF9zZW50LAorCQkJcmVjZWl2ZWQsIChyZWNlaXZlZCA9PSAxKSA/ICJpZXMiIDogInkiLAorCQkJcmVxX3JlY3YsIGJyZF9yZWN2KTsKKwl9CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBEQUQpCisJCWV4aXQoISFyZWNlaXZlZCk7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBVTlNPTElDSVRFRCkKKwkJZXhpdChFWElUX1NVQ0NFU1MpOworCWV4aXQoIXJlY2VpdmVkKTsKK30KKworc3RhdGljIHZvaWQgY2F0Y2hlcih2b2lkKQoreworCXVuc2lnbmVkIG5vdzsKKworCW5vdyA9IE1PTk9UT05JQ19VUygpOworCWlmIChzdGFydCA9PSAwKQorCQlzdGFydCA9IG5vdzsKKworCWlmIChjb3VudCA9PSAwIHx8ICh0aW1lb3V0X3VzICYmIChub3cgLSBzdGFydCkgPiB0aW1lb3V0X3VzKSkKKwkJZmluaXNoKCk7CisKKwkvKiBjb3VudCA8IDAgbWVhbnMgImluZmluaXRlIGNvdW50IiAqLworCWlmIChjb3VudCA+IDApCisJCWNvdW50LS07CisKKwlpZiAobGFzdCA9PSAwIHx8IChub3cgLSBsYXN0KSA+IDUwMDAwMCkgeworCQlzZW5kX3BhY2soJnNyYywgJmRzdCwgJm1lLCAmaGUpOworCQlpZiAoY291bnQgPT0gMCAmJiAob3B0aW9uX21hc2szMiAmIFVOU09MSUNJVEVEKSkKKwkJCWZpbmlzaCgpOworCX0KKwlhbGFybSgxKTsKK30KKworc3RhdGljIGJvb2wgcmVjdl9wYWNrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHNvY2thZGRyX2xsICpGUk9NKQoreworCXN0cnVjdCBhcnBoZHIgKmFoID0gKHN0cnVjdCBhcnBoZHIgKikgYnVmOworCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSAoYWggKyAxKTsKKwlzdHJ1Y3QgaW5fYWRkciBzcmNfaXAsIGRzdF9pcDsKKwkvKiBtb3ZlcyBiZWxvdyBhc3N1bWUgaW5fYWRkciBpcyA0IGJ5dGVzIGJpZywgZW5zdXJlIHRoYXQgKi8KKwlzdHJ1Y3QgQlVHX2luX2FkZHJfbXVzdF9iZV80IHsKKwkJY2hhciBCVUdfaW5fYWRkcl9tdXN0X2JlXzRbCisJCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpID09IDQgPyAxIDogLTEKKwkJXTsKKwkJY2hhciBCVUdfc19hZGRyX211c3RfYmVfNFsKKwkJCXNpemVvZihzcmNfaXAuc19hZGRyKSA9PSA0ID8gMSA6IC0xCisJCV07CisJfTsKKworCS8qIEZpbHRlciBvdXQgd2lsZCBwYWNrZXRzICovCisJaWYgKEZST00tPnNsbF9wa3R0eXBlICE9IFBBQ0tFVF9IT1NUCisJICYmIEZST00tPnNsbF9wa3R0eXBlICE9IFBBQ0tFVF9CUk9BRENBU1QKKwkgJiYgRlJPTS0+c2xsX3BrdHR5cGUgIT0gUEFDS0VUX01VTFRJQ0FTVCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogT25seSB0aGVzZSB0eXBlcyBhcmUgcmVjb2duaXplZCAqLworCWlmIChhaC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkgJiYgYWgtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUExZKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogQVJQSFJEIGNoZWNrIGFuZCB0aGlzIGRhcm5lZCBGRERJIGhhY2sgaGVyZSA6LSggKi8KKwlpZiAoYWgtPmFyX2hyZCAhPSBodG9ucyhGUk9NLT5zbGxfaGF0eXBlKQorCSAmJiAoRlJPTS0+c2xsX2hhdHlwZSAhPSBBUlBIUkRfRkRESSB8fCBhaC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9FVEhFUikpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBQcm90b2NvbCBtdXN0IGJlIElQLiAqLworCWlmIChhaC0+YXJfcHJvICE9IGh0b25zKEVUSF9QX0lQKQorCSB8fCAoYWgtPmFyX3BsbiAhPSA0KQorCSB8fCAoYWgtPmFyX2hsbiAhPSBtZS5zbGxfaGFsZW4pCisJIHx8IChsZW4gPCAoaW50KShzaXplb2YoKmFoKSArIDIgKiAoNCArIGFoLT5hcl9obG4pKSkpCisJCXJldHVybiBmYWxzZTsKKworCW1vdmVfZnJvbV91bmFsaWduZWQzMihzcmNfaXAuc19hZGRyLCBwICsgYWgtPmFyX2hsbik7CisJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKGRzdF9pcC5zX2FkZHIsIHAgKyBhaC0+YXJfaGxuICsgNCArIGFoLT5hcl9obG4pOworCisJaWYgKGRzdC5zX2FkZHIgIT0gc3JjX2lwLnNfYWRkcikKKwkJcmV0dXJuIGZhbHNlOworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBEQUQpKSB7CisJCWlmICgoc3JjLnNfYWRkciAhPSBkc3RfaXAuc19hZGRyKQorCQkJfHwgKG1lbWNtcChwICsgYWgtPmFyX2hsbiArIDQsICZtZS5zbGxfYWRkciwgYWgtPmFyX2hsbikpKQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCS8qIERBRCBwYWNrZXQgd2FzOgorCQkgICBzcmNfaXAgPSAwIChvciBzb21lIHNyYykKKwkJICAgc3JjX2h3ID0gTUUKKwkJICAgZHN0X2lwID0gdGVzdGVkIGFkZHJlc3MKKwkJICAgZHN0X2h3ID0gPHVuc3BlYz4KKworCQkgICBXZSBmYWlsLCBpZiByZWNlaXZlIHJlcXVlc3QvcmVwbHkgd2l0aDoKKwkJICAgc3JjX2lwID0gdGVzdGVkX2FkZHJlc3MKKwkJICAgc3JjX2h3ICE9IE1FCisJCSAgIGlmIHNyY19pcCBpbiByZXF1ZXN0IHdhcyBub3QgemVybywgY2hlY2sKKwkJICAgYWxzbyB0aGF0IGl0IG1hdGNoZXMgdG8gZHN0X2lwLCBvdGhlcndpc2UKKwkJICAgZHN0X2lwL2RzdF9odyBkbyBub3QgbWF0dGVyLgorCQkgKi8KKwkJaWYgKChtZW1jbXAocCwgJm1lLnNsbF9hZGRyLCBtZS5zbGxfaGFsZW4pID09IDApCisJCSB8fCAoc3JjLnNfYWRkciAmJiBzcmMuc19hZGRyICE9IGRzdF9pcC5zX2FkZHIpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoIShvcHRpb25fbWFzazMyICYgUVVJRVQpKSB7CisJCWludCBzX3ByaW50ZWQgPSAwOworCisJCXByaW50ZigiJXNjYXN0IHJlJXMgZnJvbSAlcyBbJXNdIiwKKwkJCUZST00tPnNsbF9wa3R0eXBlID09IFBBQ0tFVF9IT1NUID8gIlVuaSIgOiAiQnJvYWQiLAorCQkJYWgtPmFyX29wID09IGh0b25zKEFSUE9QX1JFUExZKSA/ICJwbHkiIDogInF1ZXN0IiwKKwkJCWluZXRfbnRvYShzcmNfaXApLAorCQkJZXRoZXJfbnRvYSgoc3RydWN0IGV0aGVyX2FkZHIgKikgcCkpOworCQlpZiAoZHN0X2lwLnNfYWRkciAhPSBzcmMuc19hZGRyKSB7CisJCQlwcmludGYoImZvciAlcyAiLCBpbmV0X250b2EoZHN0X2lwKSk7CisJCQlzX3ByaW50ZWQgPSAxOworCQl9CisJCWlmIChtZW1jbXAocCArIGFoLT5hcl9obG4gKyA0LCBtZS5zbGxfYWRkciwgYWgtPmFyX2hsbikpIHsKKwkJCWlmICghc19wcmludGVkKQorCQkJCXByaW50ZigiZm9yICIpOworCQkJcHJpbnRmKCJbJXNdIiwKKwkJCQlldGhlcl9udG9hKChzdHJ1Y3QgZXRoZXJfYWRkciAqKSBwICsgYWgtPmFyX2hsbiArIDQpKTsKKwkJfQorCisJCWlmIChsYXN0KSB7CisJCQl1bnNpZ25lZCBkaWZmID0gTU9OT1RPTklDX1VTKCkgLSBsYXN0OworCQkJcHJpbnRmKCIgJXUuJTAzdW1zXG4iLCBkaWZmIC8gMTAwMCwgZGlmZiAlIDEwMDApOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIgVU5TT0xJQ0lURUQ/XG4iKTsKKwkJfQorCQlmZmx1c2hfYWxsKCk7CisJfQorCXJlY2VpdmVkKys7CisJaWYgKEZST00tPnNsbF9wa3R0eXBlICE9IFBBQ0tFVF9IT1NUKQorCQlicmRfcmVjdisrOworCWlmIChhaC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpCisJCXJlcV9yZWN2Kys7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBRVUlUX09OX1JFUExZKQorCQlmaW5pc2goKTsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgQkNBU1RfT05MWSkpIHsKKwkJbWVtY3B5KGhlLnNsbF9hZGRyLCBwLCBtZS5zbGxfaGFsZW4pOworCQlvcHRpb25fbWFzazMyIHw9IFVOSUNBU1RJTkc7CisJfQorCXJldHVybiB0cnVlOworfQorCitpbnQgYXJwaW5nX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhcnBpbmdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmRldmljZSA9ICJldGgwIjsKKwljaGFyICpzb3VyY2UgPSBOVUxMOworCWNoYXIgKnRhcmdldDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQ7CisJY2hhciAqZXJyX3N0cjsKKworCUlOSVRfRygpOworCisJc29ja19mZCA9IHhzb2NrZXQoQUZfUEFDS0VULCBTT0NLX0RHUkFNLCAwKTsKKworCS8vIERyb3Agc3VpZCByb290IHByaXZpbGVnZXMKKwkvLyBOZWVkIHRvIHJlbW92ZSBTVUlEX05FVkVSIGZyb20gYXBwbGV0cy5oIGZvciB0aGlzIHRvIHdvcmsKKwkvL3hzZXR1aWQoZ2V0dWlkKCkpOworCisJZXJyX3N0ciA9IHhhc3ByaW50ZigiaW50ZXJmYWNlICVzICUlcyIsIGRldmljZSk7CisJeworCQl1bnNpZ25lZCBvcHQ7CisJCWNoYXIgKnN0cl90aW1lb3V0OworCisJCS8qIERhZCBhbHNvIHNldHMgcXVpdF9vbl9yZXBseS4KKwkJICogQWR2ZXJ0IGFsc28gc2V0cyB1bnNvbGljaXRlZC4KKwkJICovCisJCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xOkRmOkFVOmMrIjsKKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkRVQXFmYmM6dzpJOnM6IiwKKwkJCQkmY291bnQsICZzdHJfdGltZW91dCwgJmRldmljZSwgJnNvdXJjZSk7CisJCWlmIChvcHQgJiAweDgwKSAvKiAtdzogdGltZW91dCAqLworCQkJdGltZW91dF91cyA9IHhhdG91X3JhbmdlKHN0cl90aW1lb3V0LCAwLCBJTlRfTUFYLzIwMDAwMDApICogMTAwMDAwMCArIDUwMDAwMDsKKwkJLy9pZiAob3B0ICYgMHgyMDApIC8qIC1zOiBzb3VyY2UgKi8KKwkJb3B0aW9uX21hc2szMiAmPSAweDNmOyAvKiBzZXQgcmVzcGVjdGl2ZSBmbGFncyAqLworCX0KKworCXRhcmdldCA9IGFyZ3Zbb3B0aW5kXTsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7CisKKwl7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisKKwkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldmljZSk7CisJCS8qIFdlIHVzZSBpZnIuaWZyX25hbWUgaW4gZXJyb3IgbXNnIHNvIHRoYXQgcHJvYmxlbQorCQkgKiB3aXRoIHRydW5jYXRlZCBuYW1lIHdpbGwgYmUgdmlzaWJsZSAqLworCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShzb2NrX2ZkLCBTSU9DR0lGSU5ERVgsICZpZnIsIGVycl9zdHIsICJub3QgZm91bmQiKTsKKwkJbWUuc2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisKKwkJeGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikgJmlmcik7CisKKwkJaWYgKCEoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGVycl9zdHIsICJpcyBkb3duIik7CisJCX0KKwkJaWYgKGlmci5pZnJfZmxhZ3MgJiAoSUZGX05PQVJQIHwgSUZGX0xPT1BCQUNLKSkgeworCQkJYmJfZXJyb3JfbXNnKGVycl9zdHIsICJpcyBub3QgQVJQYWJsZSIpOworCQkJcmV0dXJuIChvcHRpb25fbWFzazMyICYgREFEID8gMCA6IDIpOworCQl9CisJfQorCisJLyogaWYgKCFpbmV0X2F0b24odGFyZ2V0LCAmZHN0KSkgLSBub3QgbmVlZGVkICovIHsKKwkJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCQlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIodGFyZ2V0LCAwLCBBRl9JTkVUKTsKKwkJZHN0ID0gbHNhLT51LnNpbi5zaW5fYWRkcjsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShsc2EpOworCX0KKworCWlmIChzb3VyY2UgJiYgIWluZXRfYXRvbihzb3VyY2UsICZzcmMpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHNvdXJjZSBhZGRyZXNzICVzIiwgc291cmNlKTsKKwl9CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiAoREFEfFVOU09MSUNJVEVEKSkgPT0gVU5TT0xJQ0lURUQgJiYgc3JjLnNfYWRkciA9PSAwKQorCQlzcmMgPSBkc3Q7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgREFEKSB8fCBzcmMuc19hZGRyKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKwkJaW50IHByb2JlX2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworCQlzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShwcm9iZV9mZCwgZGV2aWNlKTsKKwkJbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisJCXNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlpZiAoc3JjLnNfYWRkcikgeworCQkJLyogQ2hlY2sgdGhhdCB0aGlzIGlzIGluZGVlZCBvdXIgSVAgKi8KKwkJCXNhZGRyLnNpbl9hZGRyID0gc3JjOworCQkJeGJpbmQocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKKwkJfSBlbHNlIHsgLyogIShvcHRpb25fbWFzazMyICYgREFEKSBjYXNlICovCisJCQkvKiBGaW5kIElQIGFkZHJlc3Mgb24gdGhpcyBpZmFjZSAqLworCQkJc29ja2xlbl90IGFsZW4gPSBzaXplb2Yoc2FkZHIpOworCisJCQlzYWRkci5zaW5fcG9ydCA9IGh0b25zKDEwMjUpOworCQkJc2FkZHIuc2luX2FkZHIgPSBkc3Q7CisKKwkJCWlmIChzZXRzb2Nrb3B0KHByb2JlX2ZkLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSkgPT0gLTEpCisJCQkJYmJfcGVycm9yX21zZygic2V0c29ja29wdChTT19ET05UUk9VVEUpIik7CisJCQl4Y29ubmVjdChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsIHNpemVvZihzYWRkcikpOworCQkJZ2V0c29ja25hbWUocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmYWxlbik7CisJCQkvL25ldmVyIGhhcHBlbnM6CisJCQkvL2lmIChnZXRzb2NrbmFtZShwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsICZhbGVuKSA9PSAtMSkKKwkJCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUiKTsKKwkJCWlmIChzYWRkci5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIElQIGFkZHJlc3MgY29uZmlndXJlZCIpOworCQkJc3JjID0gc2FkZHIuc2luX2FkZHI7CisJCX0KKwkJY2xvc2UocHJvYmVfZmQpOworCX0KKworCW1lLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJLy9tZS5zbGxfaWZpbmRleCA9IGlmaW5kZXg7IC0gZG9uZSBiZWZvcmUKKwltZS5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOworCXhiaW5kKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm1lLCBzaXplb2YobWUpKTsKKworCXsKKwkJc29ja2xlbl90IGFsZW4gPSBzaXplb2YobWUpOworCQlnZXRzb2NrbmFtZShzb2NrX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZtZSwgJmFsZW4pOworCQkvL25ldmVyIGhhcHBlbnM6CisJCS8vaWYgKGdldHNvY2tuYW1lKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm1lLCAmYWxlbikgPT0gLTEpCisJCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUiKTsKKwl9CisJaWYgKG1lLnNsbF9oYWxlbiA9PSAwKSB7CisJCWJiX2Vycm9yX21zZyhlcnJfc3RyLCAiaXMgbm90IEFSUGFibGUgKG5vIGxsIGFkZHJlc3MpIik7CisJCXJldHVybiAob3B0aW9uX21hc2szMiAmIERBRCA/IDAgOiAyKTsKKwl9CisJaGUgPSBtZTsKKwltZW1zZXQoaGUuc2xsX2FkZHIsIC0xLCBoZS5zbGxfaGFsZW4pOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIFFVSUVUKSkgeworCQkvKiBpbmV0X250b2EgdXNlcyBzdGF0aWMgc3RvcmFnZSwgY2FuJ3QgdXNlIGluIHNhbWUgcHJpbnRmICovCisJCXByaW50ZigiQVJQSU5HIHRvICVzIiwgaW5ldF9udG9hKGRzdCkpOworCQlwcmludGYoIiBmcm9tICVzIHZpYSAlc1xuIiwgaW5ldF9udG9hKHNyYyksIGRldmljZSk7CisJfQorCisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdJTlQsICAodm9pZCAoKikoaW50KSlmaW5pc2gpOworCXNpZ25hbF9TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHQUxSTSwgKHZvaWQgKCopKGludCkpY2F0Y2hlcik7CisKKwljYXRjaGVyKCk7CisKKwlwYWNrZXQgPSB4bWFsbG9jKDQwOTYpOworCXdoaWxlICgxKSB7CisJCXNpZ3NldF90IHNzZXQsIG9zc2V0OworCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgZnJvbTsKKwkJc29ja2xlbl90IGFsZW4gPSBzaXplb2YoZnJvbSk7CisJCWludCBjYzsKKworCQljYyA9IHJlY3Zmcm9tKHNvY2tfZmQsIHBhY2tldCwgNDA5NiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwgJmFsZW4pOworCQlpZiAoY2MgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJyZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKwkJc2lnZW1wdHlzZXQoJnNzZXQpOworCQlzaWdhZGRzZXQoJnNzZXQsIFNJR0FMUk0pOworCQlzaWdhZGRzZXQoJnNzZXQsIFNJR0lOVCk7CisJCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNzZXQsICZvc3NldCk7CisJCXJlY3ZfcGFjayhwYWNrZXQsIGNjLCAmZnJvbSk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCX0KK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvYnJjdGwuYyBiL25ldHdvcmtpbmcvYnJjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWY0NzRmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9icmN0bC5jCkBAIC0wLDAgKzEsMzE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTbWFsbCBpbXBsZW1lbnRhdGlvbiBvZiBicmN0bCBmb3IgYnVzeWJveC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZyb20gYnJpZGdlLXV0aWxzIGFyZQorICogQ29weXJpZ2h0IChDKSAyMDAwIExlbm5lcnQgQnV5dGVuaGVrCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyogVGhpcyBhcHBsZXQgY3VycmVudGx5IHVzZXMgb25seSB0aGUgaW9jdGwgaW50ZXJmYWNlIGFuZCBubyBzeXNmcyBhdCBhbGwuCisgKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgdGhpcyB3YXMgY29uc2lkZXJlZCBhIGZlYXR1cmUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGJyY3RsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJDT01NQU5EIFtCUklER0UgW0lOVEVSRkFDRV1dIgorLy91c2FnZTojZGVmaW5lIGJyY3RsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFuYWdlIGV0aGVybmV0IGJyaWRnZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG5Db21tYW5kczoiCisvL3VzYWdlOglJRl9GRUFUVVJFX0JSQ1RMX1NIT1coCisvL3VzYWdlOiAgICAgIlxuCXNob3cJCQlTaG93IGEgbGlzdCBvZiBicmlkZ2VzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbglhZGRiciBCUklER0UJCUNyZWF0ZSBCUklER0UiCisvL3VzYWdlOiAgICAgIlxuCWRlbGJyIEJSSURHRQkJRGVsZXRlIEJSSURHRSIKKy8vdXNhZ2U6ICAgICAiXG4JYWRkaWYgQlJJREdFIElGQUNFCUFkZCBJRkFDRSB0byBCUklER0UiCisvL3VzYWdlOiAgICAgIlxuCWRlbGlmIEJSSURHRSBJRkFDRQlEZWxldGUgSUZBQ0UgZnJvbSBCUklER0UiCisvL3VzYWdlOglJRl9GRUFUVVJFX0JSQ1RMX0ZBTkNZKAorLy91c2FnZTogICAgICJcbglzZXRhZ2VpbmcgQlJJREdFIFRJTUUJCVNldCBhZ2VpbmcgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0ZmQgQlJJREdFIFRJTUUJCVNldCBicmlkZ2UgZm9yd2FyZCBkZWxheSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0aGVsbG8gQlJJREdFIFRJTUUJCVNldCBoZWxsbyB0aW1lIgorLy91c2FnZTogICAgICJcbglzZXRtYXhhZ2UgQlJJREdFIFRJTUUJCVNldCBtYXggbWVzc2FnZSBhZ2UiCisvL3VzYWdlOiAgICAgIlxuCXNldHBhdGhjb3N0IEJSSURHRSBDT1NUCQlTZXQgcGF0aCBjb3N0IgorLy91c2FnZTogICAgICJcbglzZXRwb3J0cHJpbyBCUklER0UgUFJJTwkJU2V0IHBvcnQgcHJpb3JpdHkiCisvL3VzYWdlOiAgICAgIlxuCXNldGJyaWRnZXByaW8gQlJJREdFIFBSSU8JU2V0IGJyaWRnZSBwcmlvcml0eSIKKy8vdXNhZ2U6ICAgICAiXG4Jc3RwIEJSSURHRSBbMS95ZXMvb258MC9uby9vZmZdCVNUUCBvbi9vZmYiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworI2lmbmRlZiBTSU9DQlJBRERCUgorIyBkZWZpbmUgU0lPQ0JSQUREQlIgQlJDVExfQUREX0JSSURHRQorI2VuZGlmCisjaWZuZGVmIFNJT0NCUkRFTEJSCisjIGRlZmluZSBTSU9DQlJERUxCUiBCUkNUTF9ERUxfQlJJREdFCisjZW5kaWYKKyNpZm5kZWYgU0lPQ0JSQURESUYKKyMgZGVmaW5lIFNJT0NCUkFERElGIEJSQ1RMX0FERF9JRgorI2VuZGlmCisjaWZuZGVmIFNJT0NCUkRFTElGCisjIGRlZmluZSBTSU9DQlJERUxJRiBCUkNUTF9ERUxfSUYKKyNlbmRpZgorCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHN1cHBvcnRlZCBwZXIgYnJpZGdlIGludGVyZmFjZS4gICovCisjaWZuZGVmIE1BWF9QT1JUUworIyBkZWZpbmUgTUFYX1BPUlRTIDMyCisjZW5kaWYKKworLyogVXNlIGludGVybmFsIG51bWJlciBwYXJzaW5nIGFuZCBub3QgdGhlICJleGFjdCIgY29udmVyc2lvbi4gICovCisvKiAjZGVmaW5lIEJSQ1RMX1VTRV9JTlRFUk5BTCAwICovIC8qIHVzZSBleGFjdCBjb252ZXJzaW9uICovCisjZGVmaW5lIEJSQ1RMX1VTRV9JTlRFUk5BTCAxCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9CUkNUTF9GQU5DWQorIyBpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKworLyogRklYTUU6IFRoZXNlIDQgZnVuY3MgYXJlIG5vdCByZWFsbHkgY2xlYW4gYW5kIGNvdWxkIGJlIGltcHJvdmVkICovCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIHN0cnRvdGltZXZhbChzdHJ1Y3QgdGltZXZhbCAqdHYsCisJCWNvbnN0IGNoYXIgKnRpbWVfc3RyKQoreworCWRvdWJsZSBzZWNzOworIyBpZiBCUkNUTF9VU0VfSU5URVJOQUwKKwljaGFyICplbmRwdHI7CisJc2VjcyA9IC8qYmJfKi9zdHJ0b2QodGltZV9zdHIsICZlbmRwdHIpOworCWlmIChlbmRwdHIgPT0gdGltZV9zdHIpCisjIGVsc2UKKwlpZiAoc3NjYW5mKHRpbWVfc3RyLCAiJWxmIiwgJnNlY3MpICE9IDEpCisjIGVuZGlmCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgdGltZV9zdHIsICJ0aW1lc3BlYyIpOworCXR2LT50dl9zZWMgPSBzZWNzOworCXR2LT50dl91c2VjID0gMTAwMDAwMCAqIChzZWNzIC0gdHYtPnR2X3NlYyk7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGxvbmcgdHZfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGppZjsKKworCWppZiA9IDEwMDAwMDBVTEwgKiB0di0+dHZfc2VjICsgdHYtPnR2X3VzZWM7CisKKwlyZXR1cm4gamlmLzEwMDAwOworfQorIyBpZiAwCitzdGF0aWMgdm9pZCBqaWZmaWVzX3RvX3R2KHN0cnVjdCB0aW1ldmFsICp0diwgdW5zaWduZWQgbG9uZyBqaWZmaWVzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0dnVzZWM7CisKKwl0dnVzZWMgPSAxMDAwMFVMTCpqaWZmaWVzOworCXR2LT50dl9zZWMgPSB0dnVzZWMvMTAwMDAwMDsKKwl0di0+dHZfdXNlYyA9IHR2dXNlYyAtIDEwMDAwMDAgKiB0di0+dHZfc2VjOworfQorIyBlbmRpZgorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RyX3RvX2ppZmZpZXMoY29uc3QgY2hhciAqdGltZV9zdHIpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydG90aW1ldmFsKCZ0diwgdGltZV9zdHIpOworCXJldHVybiB0dl90b19qaWZmaWVzKCZ0dik7Cit9CisKK3N0YXRpYyB2b2lkIGFybV9pb2N0bCh1bnNpZ25lZCBsb25nICphcmdzLAorCQl1bnNpZ25lZCBsb25nIGFyZzAsIHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyKQoreworCWFyZ3NbMF0gPSBhcmcwOworCWFyZ3NbMV0gPSBhcmcxOworCWFyZ3NbMl0gPSBhcmcyOworCWFyZ3NbM10gPSAwOworfQorI2VuZGlmCisKKworaW50IGJyY3RsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBicmN0bF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkiYWRkYnJcMCIgImRlbGJyXDAiICJhZGRpZlwwIiAiZGVsaWZcMCIKKwlJRl9GRUFUVVJFX0JSQ1RMX0ZBTkNZKAorCQkic3RwXDAiCisJCSJzZXRhZ2VpbmdcMCIgInNldGZkXDAiICJzZXRoZWxsb1wwIiAic2V0bWF4YWdlXDAiCisJCSJzZXRwYXRoY29zdFwwIiAic2V0cG9ydHByaW9cMCIgInNldGJyaWRnZXByaW9cMCIKKwkpCisJSUZfRkVBVFVSRV9CUkNUTF9TSE9XKCJzaG93bWFjc1wwIiAic2hvd1wwIik7CisKKwllbnVtIHsgQVJHX2FkZGJyID0gMCwgQVJHX2RlbGJyLCBBUkdfYWRkaWYsIEFSR19kZWxpZgorCQlJRl9GRUFUVVJFX0JSQ1RMX0ZBTkNZKCwKKwkJICAgQVJHX3N0cCwKKwkJICAgQVJHX3NldGFnZWluZywgQVJHX3NldGZkLCBBUkdfc2V0aGVsbG8sIEFSR19zZXRtYXhhZ2UsCisJCSAgIEFSR19zZXRwYXRoY29zdCwgQVJHX3NldHBvcnRwcmlvLCBBUkdfc2V0YnJpZGdlcHJpbworCQkpCisJCUlGX0ZFQVRVUkVfQlJDVExfU0hPVygsIEFSR19zaG93bWFjcywgQVJHX3Nob3cpCisJfTsKKworCWludCBmZDsKKwlzbWFsbGludCBrZXk7CisJc3RydWN0IGlmcmVxIGlmcjsKKwljaGFyICpiciwgKmJyaWY7CisKKwlhcmd2Kys7CisJd2hpbGUgKCphcmd2KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQlJDVExfRkFOQ1kKKwkJaW50IGlmaWR4W01BWF9QT1JUU107CisJCXVuc2lnbmVkIGxvbmcgYXJnc1s0XTsKKwkJaWZyLmlmcl9kYXRhID0gKGNoYXIgKikgJmFyZ3M7CisjZW5kaWYKKworCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChrZXkgPT0gLTEpIC8qIG5vIG1hdGNoIGZvdW5kIGluIGtleXdvcmRzIGFycmF5LCBiYWlsIG91dC4gKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgKmFyZ3YsIGFwcGxldF9uYW1lKTsKKwkJYXJndisrOworCQlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQlJDVExfU0hPVworCQlpZiAoa2V5ID09IEFSR19zaG93KSB7IC8qIHNob3cgKi8KKwkJCWNoYXIgYnJuYW1lW0lGTkFNU0laXTsKKwkJCWludCBicmlkeFtNQVhfUE9SVFNdOworCQkJaW50IGksIG51bTsKKwkJCWFybV9pb2N0bChhcmdzLCBCUkNUTF9HRVRfQlJJREdFUywKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSBicmlkeCwgTUFYX1BPUlRTKTsKKwkJCW51bSA9IHhpb2N0bChmZCwgU0lPQ0dJRkJSLCBhcmdzKTsKKwkJCXByaW50ZigiYnJpZGdlIG5hbWVcdGJyaWRnZSBpZFx0XHRTVFAgZW5hYmxlZFx0aW50ZXJmYWNlc1xuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJCQljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisJCQkJaW50IGosIHRhYnM7CisJCQkJc3RydWN0IF9fYnJpZGdlX2luZm8gYmk7CisJCQkJdW5zaWduZWQgY2hhciAqeDsKKworCQkJCWlmICghaWZfaW5kZXh0b25hbWUoYnJpZHhbaV0sIGJybmFtZSkpCisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGJyaWRnZSBuYW1lIGZvciBpbmRleCAlZCIsIGkpOworCQkJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBicm5hbWUpOworCisJCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX0dFVF9CUklER0VfSU5GTywKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgJmJpLCAwKTsKKwkJCQl4aW9jdGwoZmQsIFNJT0NERVZQUklWQVRFLCAmaWZyKTsKKwkJCQlwcmludGYoIiVzXHRcdCIsIGJybmFtZSk7CisKKwkJCQkvKiBwcmludCBicmlkZ2UgaWQgKi8KKwkJCQl4ID0gKHVuc2lnbmVkIGNoYXIgKikgJmJpLmJyaWRnZV9pZDsKKwkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkJCXByaW50ZigiJS4yeCIsIHhbal0pOworCQkJCQlpZiAoaiA9PSAxKQorCQkJCQkJYmJfcHV0Y2hhcignLicpOworCQkJCX0KKwkJCQlwcmludGYoYmkuc3RwX2VuYWJsZWQgPyAiXHR5ZXMiIDogIlx0bm8iKTsKKworCQkJCS8qIHByaW50IGludGVyZmFjZSBsaXN0ICovCisJCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX0dFVF9QT1JUX0xJU1QsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGlmaWR4LCBNQVhfUE9SVFMpOworCQkJCXhpb2N0bChmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworCQkJCXRhYnMgPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCBNQVhfUE9SVFM7IGorKykgeworCQkJCQlpZiAoIWlmaWR4W2pdKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICghaWZfaW5kZXh0b25hbWUoaWZpZHhbal0sIGlmbmFtZSkpCisJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCBpbnRlcmZhY2UgbmFtZSBmb3IgaW5kZXggJWQiLCBqKTsKKwkJCQkJaWYgKHRhYnMpCisJCQkJCQlwcmludGYoIlx0XHRcdFx0XHQiKTsKKwkJCQkJZWxzZQorCQkJCQkJdGFicyA9IDE7CisJCQkJCXByaW50ZigiXHRcdCVzXG4iLCBpZm5hbWUpOworCQkJCX0KKwkJCQlpZiAoIXRhYnMpICAvKiBicmlkZ2UgaGFzIG5vIGludGVyZmFjZXMgKi8KKwkJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCX0KKwkJCWdvdG8gZG9uZTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKCEqYXJndikgLyogYWxsIGJ1dCAnc2hvdycgbmVlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQliciA9ICphcmd2Kys7CisKKwkJaWYgKGtleSA9PSBBUkdfYWRkYnIgfHwga2V5ID09IEFSR19kZWxicikgeyAvKiBhZGRiciBvciBkZWxiciAqLworCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsCisJCQkJCWtleSA9PSBBUkdfYWRkYnIgPyBTSU9DQlJBRERCUiA6IFNJT0NCUkRFTEJSLAorCQkJCQliciwgImJyaWRnZSAlcyIsIGJyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmICghKmFyZ3YpIC8qIGFsbCBidXQgJ2FkZGJyL2RlbGJyJyBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgYnIpOworCQlpZiAoa2V5ID09IEFSR19hZGRpZiB8fCBrZXkgPT0gQVJHX2RlbGlmKSB7IC8qIGFkZGlmIG9yIGRlbGlmICovCisJCQlicmlmID0gKmFyZ3Y7CisJCQlpZnIuaWZyX2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChicmlmKTsKKwkJCWlmICghaWZyLmlmcl9pZmluZGV4KSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpZmFjZSAlcyIsIGJyaWYpOworCQkJfQorCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsCisJCQkJCWtleSA9PSBBUkdfYWRkaWYgPyBTSU9DQlJBRERJRiA6IFNJT0NCUkRFTElGLAorCQkJCQkmaWZyLCAiYnJpZGdlICVzIiwgYnIpOworCQkJZ290byBkb25lX25leHRfYXJndjsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0JSQ1RMX0ZBTkNZCisJCWlmIChrZXkgPT0gQVJHX3N0cCkgeyAvKiBzdHAgKi8KKwkJCXN0YXRpYyBjb25zdCBjaGFyIG5vX3llc1tdIEFMSUdOMSA9CisJCQkJIjBcMCIgIm9mZlwwIiAiblwwIiAibm9cMCIgICAvKiAwIC4uIDMgKi8KKwkJCQkiMVwwIiAib25cMCIgICJ5XDAiICJ5ZXNcMCI7IC8qIDQgLi4gNyAqLworCQkJaW50IG9ub2ZmID0gaW5kZXhfaW5fc3RyaW5ncyhub195ZXMsICphcmd2KTsKKwkJCWlmIChvbm9mZiA8IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQkJb25vZmYgPSAodW5zaWduZWQpb25vZmYgLyA0OworCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX1NFVF9CUklER0VfU1RQX1NUQVRFLCBvbm9mZiwgMCk7CisJCQlnb3RvIGZpcmU7CisJCX0KKwkJaWYgKCh1bnNpZ25lZCkoa2V5IC0gQVJHX3NldGFnZWluZykgPCA0KSB7IC8qIHRpbWUgcmVsYXRlZCBvcHMgKi8KKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IG9wc1tdIEFMSUdOMSA9IHsKKwkJCQlCUkNUTF9TRVRfQUdFSU5HX1RJTUUsICAgICAgICAgIC8qIEFSR19zZXRhZ2VpbmcgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX0ZPUldBUkRfREVMQVksIC8qIEFSR19zZXRmZCAgICAgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX0hFTExPX1RJTUUsICAgIC8qIEFSR19zZXRoZWxsbyAgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX01BWF9BR0UgICAgICAgIC8qIEFSR19zZXRtYXhhZ2UgKi8KKwkJCX07CisJCQlhcm1faW9jdGwoYXJncywgb3BzW2tleSAtIEFSR19zZXRhZ2VpbmddLCBzdHJfdG9famlmZmllcygqYXJndiksIDApOworCQkJZ290byBmaXJlOworCQl9CisJCWlmIChrZXkgPT0gQVJHX3NldHBhdGhjb3N0CisJCSB8fCBrZXkgPT0gQVJHX3NldHBvcnRwcmlvCisJCSB8fCBrZXkgPT0gQVJHX3NldGJyaWRnZXByaW8KKwkJKSB7CisJCQlzdGF0aWMgY29uc3QgdWludDhfdCBvcHNbXSBBTElHTjEgPSB7CisJCQkJQlJDVExfU0VUX1BBVEhfQ09TVCwgICAgICAvKiBBUkdfc2V0cGF0aGNvc3QgICAqLworCQkJCUJSQ1RMX1NFVF9QT1JUX1BSSU9SSVRZLCAgLyogQVJHX3NldHBvcnRwcmlvICAgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX1BSSU9SSVRZIC8qIEFSR19zZXRicmlkZ2VwcmlvICovCisJCQl9OworCQkJaW50IHBvcnQgPSAtMTsKKwkJCXVuc2lnbmVkIGFyZzEsIGFyZzI7CisKKwkJCWlmIChrZXkgIT0gQVJHX3NldGJyaWRnZXByaW8pIHsKKwkJCQkvKiBnZXQgcG9ydG51bSAqLworCQkJCXVuc2lnbmVkIGk7CisKKwkJCQlwb3J0ID0gaWZfbmFtZXRvaW5kZXgoKmFyZ3YrKyk7CisJCQkJaWYgKCFwb3J0KQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCAicG9ydCIpOworCQkJCW1lbXNldChpZmlkeCwgMCwgc2l6ZW9mIGlmaWR4KTsKKwkJCQlhcm1faW9jdGwoYXJncywgQlJDVExfR0VUX1BPUlRfTElTVCwgKHVuc2lnbmVkIGxvbmcpaWZpZHgsCisJCQkJCQkgIE1BWF9QT1JUUyk7CisJCQkJeGlvY3RsKGZkLCBTSU9DREVWUFJJVkFURSwgJmlmcik7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUUzsgaSsrKSB7CisJCQkJCWlmIChpZmlkeFtpXSA9PSBwb3J0KSB7CisJCQkJCQlwb3J0ID0gaTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYXJnMSA9IHBvcnQ7CisJCQlhcmcyID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCQkJaWYgKGtleSA9PSBBUkdfc2V0YnJpZGdlcHJpbykgeworCQkJCWFyZzEgPSBhcmcyOworCQkJCWFyZzIgPSAwOworCQkJfQorCQkJYXJtX2lvY3RsKGFyZ3MsIG9wc1trZXkgLSBBUkdfc2V0cGF0aGNvc3RdLCBhcmcxLCBhcmcyKTsKKwkJfQorIGZpcmU6CisJCS8qIEV4ZWN1dGUgdGhlIHByZXZpb3VzbHkgc2V0IGNvbW1hbmQgKi8KKwkJeGlvY3RsKGZkLCBTSU9DREVWUFJJVkFURSwgJmlmcik7CisjZW5kaWYKKyBkb25lX25leHRfYXJndjoKKwkJYXJndisrOworIGRvbmU6CisJCWNsb3NlKGZkKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9kbnNkLmMgYi9uZXR3b3JraW5nL2Ruc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk4NDAwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9kbnNkLmMKQEAgLTAsMCArMSw1NTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgRE5TIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSb2JlcnRvIEEuIEZvZ2xpZXR0YSAobWVAcm9iZXJ0by5mb2dsaWV0dGEubmFtZSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSBPZGQgQXJpbGQgT2xzZW4gKG9hbyBhdCBmaWJ1bGEgZG90IG5vKQorICogQ29weXJpZ2h0IChDKSAyMDAzIFBhdWwgU2hlZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIE9kZCBBcmlsZCBPbHNlbiBzdGFydGVkIG91dCB3aXRoIHRoZSBzaGVlcmRucyBbMV0gb2YgUGF1bCBTaGVlciBhbmQgcmV3cm90ZQorICogaXQgaW50byBhIHNoYXBlIHdoaWNoIEkgYmVsaWV2ZSBpcyBib3RoIGVhc2llciB0byB1bmRlcnN0YW5kIGFuZCBtYWludGFpbi4KKyAqIEkgYWxzbyByZXVzZWQgdGhlIGlucHV0IGJ1ZmZlciBmb3Igb3V0cHV0IGFuZCByZW1vdmVkIHNlcnZpY2VzIGhlIGRpZCBub3QKKyAqIG5lZWQuICBbMV0gaHR0cDovL3RocmVhZGluZy4yMDM4YnVnLmNvbS9zaGVlcmRucy8KKyAqCisgKiBTb21lIGJ1Z2ZpeCBhbmQgbWlub3IgY2hhbmdlcyB3YXMgYXBwbGllZCBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YSB3aG8gbWFkZQorICogdGhlIGZpcnN0IHBvcnRpbmcgb2Ygb2FvJyBzY2RucyB0byBidXN5Ym94IGFsc28uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRuc2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZHZzXSBbLWMgQ09ORkZJTEVdIFstdCBUVExfU0VDXSBbLXAgUE9SVF0gWy1pIEFERFJdIgorLy91c2FnZTojZGVmaW5lIGRuc2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTbWFsbCBzdGF0aWMgRE5TIHNlcnZlciBkYWVtb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgRklMRQlDb25maWcgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgU0VDCVRUTCIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUE9SVAlMaXN0ZW4gb24gUE9SVCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkgQUREUglMaXN0ZW4gb24gQUREUiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGFlbW9uaXplIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcwlTZW5kIHN1Y2Nlc3NmdWwgcmVwbGllcyBvbmx5LiBVc2UgdGhpcyBpZiB5b3Ugd2FudCIKKy8vdXNhZ2U6ICAgICAiXG4JCXRvIHVzZSAvZXRjL3Jlc29sdi5jb25mIHdpdGggdHdvIG5hbWVzZXJ2ZXIgbGluZXM6IgorLy91c2FnZTogICAgICJcbgkJCW5hbWVzZXJ2ZXIgRE5TRF9TRVJWRVIiCisvL3VzYWdlOiAgICAgIlxuCQkJbmFtZXNlcnZlciBOT1JNQUxfRE5TX1NFUlZFUiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKy8vI2RlZmluZSBERUJVRyAxCisjZGVmaW5lIERFQlVHIDAKKworZW51bSB7CisJLyogY2FuIHR3ZWFrIHRoaXMgKi8KKwlERUZBVUxUX1RUTCA9IDEyMCwKKworCS8qIGNhbm5vdCBnZXQgYmlnZ2VyIHBhY2tldHMgdGhhbiA1MTIgcGVyIFJGQzEwMzUuICovCisJTUFYX1BBQ0tfTEVOID0gNTEyLAorCUlQX1NUUklOR19MRU4gPSBzaXplb2YoIi54eHgueHh4Lnh4eC54eHgiKSwKKwlNQVhfTkFNRV9MRU4gPSBJUF9TVFJJTkdfTEVOIC0gMSArIHNpemVvZigiLmluLWFkZHIuYXJwYSIpLAorCVJFUV9BID0gMSwKKwlSRVFfUFRSID0gMTIsCit9OworCisvKiB0aGUgbWVzc2FnZSBmcm9tIGNsaWVudCBhbmQgZmlyc3QgcGFydCBvZiByZXNwb25zZSBtc2cgKi8KK3N0cnVjdCBkbnNfaGVhZCB7CisJdWludDE2X3QgaWQ7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDE2X3QgbnF1ZXI7CisJdWludDE2X3QgbmFuc3c7CisJdWludDE2X3QgbmF1dGg7CisJdWludDE2X3QgbmFkZDsKK307CisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBhY2Nlc3MgdHlwZSBhbmQgY2xhc3MgZmllbGRzLgorICogVGhleSBhcmUgdG90YWxseSB1bmFsaWduZWQsIGJ1dCBnY2MgNC4zLjQgdGhpbmtzIHRoYXQgcG9pbnRlciBvZiB0eXBlIHVpbnQxNl90KgorICogaXMgMTYtYml0IGFsaWduZWQgYW5kIHJlcGxhY2VzIDE2LWJpdCBtZW1jcHkgKGluIG1vdmVfZnJvbV91bmFsaWduZWQxNiBtYWNybykKKyAqIHdpdGggYWxpZ25lZCBoYWxmd29yZCBhY2Nlc3Mgb24gYXJtOTIwdCEKKyAqIE9oIHdlbGwuIFNsYXBwaW5nIFBBQ0tFRCBldmVyeXdoZXJlIHNlZW1zIHRvIGhlbHA6ICovCitzdHJ1Y3QgdHlwZV9hbmRfY2xhc3MgeworCXVpbnQxNl90IHR5cGUgUEFDS0VEOworCXVpbnQxNl90IGNsYXNzIFBBQ0tFRDsKK30gUEFDS0VEOworLyogZWxlbWVudCBvZiBrbm93biBuYW1lLCBpcCBhZGRyZXNzIGFuZCByZXZlcnNlZCBpcCBhZGRyZXNzICovCitzdHJ1Y3QgZG5zX2VudHJ5IHsKKwlzdHJ1Y3QgZG5zX2VudHJ5ICpuZXh0OworCXVpbnQzMl90IGlwOworCWNoYXIgcmlwW0lQX1NUUklOR19MRU5dOyAvKiBsZW5ndGggZGVjaW1hbCByZXZlcnNlZCBJUCAqLworCWNoYXIgbmFtZVsxXTsKK307CisKKyNkZWZpbmUgT1BUX3ZlcmJvc2UgKG9wdGlvbl9tYXNrMzIgJiAxKQorI2RlZmluZSBPUFRfc2lsZW50ICAob3B0aW9uX21hc2szMiAmIDIpCisKKworLyoKKyAqIEluc2VydCBsZW5ndGggb2Ygc3Vic3RyaW5ncyBpbnN0ZWFkIG9mIGRvdHMKKyAqLworc3RhdGljIHZvaWQgdW5kb3QoY2hhciAqcmlwKQoreworCWludCBpID0gMDsKKwlpbnQgcyA9IDA7CisKKwl3aGlsZSAocmlwW2ldKQorCQlpKys7CisJZm9yICgtLWk7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChyaXBbaV0gPT0gJy4nKSB7CisJCQlyaXBbaV0gPSBzOworCQkJcyA9IDA7CisJCX0gZWxzZSB7CisJCQlzKys7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZWFkIGhvc3RuYW1lL0lQIHJlY29yZHMgZnJvbSBmaWxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5zX2VudHJ5ICpwYXJzZV9jb25mX2ZpbGUoY29uc3QgY2hhciAqZmlsZWNvbmYpCit7CisJY2hhciAqdG9rZW5bMl07CisJcGFyc2VyX3QgKnBhcnNlcjsKKwlzdHJ1Y3QgZG5zX2VudHJ5ICptLCAqY29uZl9kYXRhOworCXN0cnVjdCBkbnNfZW50cnkgKipuZXh0cDsKKworCWNvbmZfZGF0YSA9IE5VTEw7CisJbmV4dHAgPSAmY29uZl9kYXRhOworCisJcGFyc2VyID0gY29uZmlnX29wZW4oZmlsZWNvbmYpOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJc3RydWN0IGluX2FkZHIgaXA7CisJCXVpbnQzMl90IHYzMjsKKworCQlpZiAoaW5ldF9hdG9uKHRva2VuWzFdLCAmaXApID09IDApIHsKKwkJCWJiX2Vycm9yX21zZygiZXJyb3IgYXQgbGluZSAldSwgc2tpcHBpbmciLCBwYXJzZXItPmxpbmVubyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChPUFRfdmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZygibmFtZTolcywgaXA6JXMiLCB0b2tlblswXSwgdG9rZW5bMV0pOworCisJCS8qIHNpemVvZigqbSkgaW5jbHVkZXMgMSBieXRlIGZvciBtLT5uYW1lWzBdICovCisJCW0gPSB4emFsbG9jKHNpemVvZigqbSkgKyBzdHJsZW4odG9rZW5bMF0pICsgMSk7CisJCS8qbS0+bmV4dCA9IE5VTEw7Ki8KKwkJKm5leHRwID0gbTsKKwkJbmV4dHAgPSAmbS0+bmV4dDsKKworCQltLT5uYW1lWzBdID0gJy4nOworCQlzdHJjcHkobS0+bmFtZSArIDEsIHRva2VuWzBdKTsKKwkJdW5kb3QobS0+bmFtZSk7CisJCW0tPmlwID0gaXAuc19hZGRyOyAvKiBpbiBuZXR3b3JrIG9yZGVyICovCisJCXYzMiA9IG50b2hsKG0tPmlwKTsKKwkJLyogaW52ZXJ0ZWQgb3JkZXIgKi8KKwkJc3ByaW50ZihtLT5yaXAsICIuJXUuJXUuJXUuJXUiLAorCQkJKHVpbnQ4X3QpKHYzMiksCisJCQkodWludDhfdCkodjMyID4+IDgpLAorCQkJKHVpbnQ4X3QpKHYzMiA+PiAxNiksCisJCQkodjMyID4+IDI0KQorCQkpOworCQl1bmRvdChtLT5yaXApOworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKwlyZXR1cm4gY29uZl9kYXRhOworfQorCisvKgorICogTG9vayBxdWVyeSB1cCBpbiBkbnMgcmVjb3JkcyBhbmQgcmV0dXJuIGFuc3dlciBpZiBmb3VuZC4KKyAqLworc3RhdGljIGNoYXIgKnRhYmxlX2xvb2t1cChzdHJ1Y3QgZG5zX2VudHJ5ICpkLAorCQl1aW50MTZfdCB0eXBlLAorCQljaGFyKiBxdWVyeV9zdHJpbmcpCit7CisJd2hpbGUgKGQpIHsKKwkJdW5zaWduZWQgbGVuID0gZC0+bmFtZVswXTsKKwkJLyogZC0+bmFtZVtsZW5dIGlzIHRoZSBsYXN0IChub24gTlVMKSBjaGFyICovCisjaWYgREVCVUcKKwkJY2hhciAqcCwgKnE7CisJCXEgPSBxdWVyeV9zdHJpbmcgKyAxOworCQlwID0gZC0+bmFtZSArIDE7CisJCWZwcmludGYoc3RkZXJyLCAiJWQvJWQgcDolcyBxOiVzICVkXG4iLAorCQkJKGludClzdHJsZW4ocCksIGxlbiwKKwkJCXAsIHEsIChpbnQpc3RybGVuKHEpCisJCSk7CisjZW5kaWYKKwkJaWYgKHR5cGUgPT0gaHRvbnMoUkVRX0EpKSB7CisJCQkvKiBzZWFyY2ggYnkgaG9zdCBuYW1lICovCisJCQlpZiAobGVuICE9IDEgfHwgZC0+bmFtZVsxXSAhPSAnKicpIHsKKy8qIHdlIGFyZSBsYXgsIGhvcGUgbm8gbmFtZSBjb21wb25lbnQgaXMgZXZlciA+NjQgc28gdGhhdCBsZW5ndGgKKyAqICh3aGljaCB3aWxsIGJlIHJlcHJlc2VudGVkIGFzICdBJywnQicuLi4pIG1hdGNoZXMgYSBsb3dlcmNhc2UgbGV0dGVyLgorICogQWN0dWFsbHksIEkgdGhpbmsgZmFsc2UgbWF0Y2hlcyBhcmUgaGFyZCB0byBjb25zdHJ1Y3QuCisgKiBFeGFtcGxlLgorICogWzMxXSBsZW4gaXMgcmVwcmVzZW50ZWQgYXMgJzEnLCBbNjVdIGFzICdBJywgWzY1KzMyXSBhcyAnYScuCisgKiBbNjVdICAgPDY1IHNhbWUgY2hhcnM+WzMxXTwzMSBzYW1lIGNoYXJzPk5VTAorICogWzY1KzMyXTw2NSBzYW1lIGNoYXJzPjEgICA8MzEgc2FtZSBjaGFycz5OVUwKKyAqIFRoaXMgZXhhbXBsZSBzZWVtcyB0byBiZSB0aGUgbWluaW1hbCBjYXNlIHdoZW4gZmFsc2UgbWF0Y2ggb2NjdXJzLgorICovCisJCQkJaWYgKHN0cmNhc2VjbXAoZC0+bmFtZSwgcXVlcnlfc3RyaW5nKSAhPSAwKQorCQkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlyZXR1cm4gKGNoYXIgKikmZC0+aXA7CisjaWYgREVCVUcKKwkJCWZwcmludGYoc3RkZXJyLCAiRm91bmQgSVA6JXhcbiIsIChpbnQpZC0+aXApOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBzZWFyY2ggYnkgSVAtYWRkcmVzcyAqLworCQlpZiAoKGxlbiAhPSAxIHx8IGQtPm5hbWVbMV0gIT0gJyonKQorCQkvKiB3ZSBhc3N1bWUgKGRvIG5vdCBjaGVjaykgdGhhdCBxdWVyeV9zdHJpbmcKKwkJICogZW5kcyBpbiAiLmluLWFkZHIuYXJwYSIgKi8KKwkJICYmIHN0cm5jbXAoZC0+cmlwLCBxdWVyeV9zdHJpbmcsIHN0cmxlbihkLT5yaXApKSA9PSAwCisJCSkgeworI2lmIERFQlVHCisJCQlmcHJpbnRmKHN0ZGVyciwgIkZvdW5kIG5hbWU6JXNcbiIsIGQtPm5hbWUpOworI2VuZGlmCisJCQlyZXR1cm4gZC0+bmFtZTsKKwkJfQorIG5leHQ6CisJCWQgPSBkLT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogRGVjb2RlIG1lc3NhZ2UgYW5kIGdlbmVyYXRlIGFuc3dlcgorICovCisvKiBSRkMgMTAzNQorLi4uCitXaGVuZXZlciBhbiBvY3RldCByZXByZXNlbnRzIGEgbnVtZXJpYyBxdWFudGl0eSwgdGhlIGxlZnQgbW9zdCBiaXQKK2luIHRoZSBkaWFncmFtIGlzIHRoZSBoaWdoIG9yZGVyIG9yIG1vc3Qgc2lnbmlmaWNhbnQgYml0LgorVGhhdCBpcywgdGhlIGJpdCBsYWJlbGVkIDAgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LgorLi4uCisKKzQuMS4xLiBIZWFkZXIgc2VjdGlvbiBmb3JtYXQKKyAgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8UVJ8ICAgT1BDT0RFICB8QUF8VEN8UkR8UkF8IDAgIDAgIDB8ICAgUkNPREUgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgIFFEQ09VTlQgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgQU5DT1VOVCAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICBOU0NPVU5UICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgIEFSQ09VTlQgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCitJRCAgICAgIDE2IGJpdCByYW5kb20gaWRlbnRpZmllciBhc3NpZ25lZCBieSBxdWVyeWluZyBwZWVyLgorICAgICAgICBVc2VkIHRvIG1hdGNoIHF1ZXJ5L3Jlc3BvbnNlLgorUVIgICAgICBtZXNzYWdlIGlzIGEgcXVlcnkgKDApLCBvciBhIHJlc3BvbnNlICgxKS4KK09QQ09ERSAgMCAgIHN0YW5kYXJkIHF1ZXJ5IChRVUVSWSkKKyAgICAgICAgMSAgIGludmVyc2UgcXVlcnkgKElRVUVSWSkKKyAgICAgICAgMiAgIHNlcnZlciBzdGF0dXMgcmVxdWVzdCAoU1RBVFVTKQorQUEgICAgICBBdXRob3JpdGF0aXZlIEFuc3dlciAtIHRoaXMgYml0IGlzIHZhbGlkIGluIHJlc3BvbnNlcy4KKyAgICAgICAgUmVzcG9uZGluZyBuYW1lIHNlcnZlciBpcyBhbiBhdXRob3JpdHkgZm9yIHRoZSBkb21haW4gbmFtZQorICAgICAgICBpbiBxdWVzdGlvbiBzZWN0aW9uLiBBbnN3ZXIgc2VjdGlvbiBtYXkgaGF2ZSBtdWx0aXBsZSBvd25lciBuYW1lcworICAgICAgICBiZWNhdXNlIG9mIGFsaWFzZXMuICBUaGUgQUEgYml0IGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHdoaWNoIG1hdGNoZXMKKyAgICAgICAgdGhlIHF1ZXJ5IG5hbWUsIG9yIHRoZSBmaXJzdCBvd25lciBuYW1lIGluIHRoZSBhbnN3ZXIgc2VjdGlvbi4KK1RDICAgICAgVHJ1bkNhdGlvbiAtIHRoaXMgbWVzc2FnZSB3YXMgdHJ1bmNhdGVkLgorUkQgICAgICBSZWN1cnNpb24gRGVzaXJlZCAtIHRoaXMgYml0IG1heSBiZSBzZXQgaW4gYSBxdWVyeSBhbmQKKyAgICAgICAgaXMgY29waWVkIGludG8gdGhlIHJlc3BvbnNlLiAgSWYgUkQgaXMgc2V0LCBpdCBkaXJlY3RzCisgICAgICAgIHRoZSBuYW1lIHNlcnZlciB0byBwdXJzdWUgdGhlIHF1ZXJ5IHJlY3Vyc2l2ZWx5LgorICAgICAgICBSZWN1cnNpdmUgcXVlcnkgc3VwcG9ydCBpcyBvcHRpb25hbC4KK1JBICAgICAgUmVjdXJzaW9uIEF2YWlsYWJsZSAtIHRoaXMgYmUgaXMgc2V0IG9yIGNsZWFyZWQgaW4gYQorICAgICAgICByZXNwb25zZSwgYW5kIGRlbm90ZXMgd2hldGhlciByZWN1cnNpdmUgcXVlcnkgc3VwcG9ydCBpcworICAgICAgICBhdmFpbGFibGUgaW4gdGhlIG5hbWUgc2VydmVyLgorUkNPREUgICBSZXNwb25zZSBjb2RlLgorICAgICAgICAwICAgTm8gZXJyb3IgY29uZGl0aW9uCisgICAgICAgIDEgICBGb3JtYXQgZXJyb3IKKyAgICAgICAgMiAgIFNlcnZlciBmYWlsdXJlIC0gc2VydmVyIHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGUgcXVlcnkKKyAgICAgICAgICAgIGR1ZSB0byBhIHByb2JsZW0gd2l0aCB0aGUgbmFtZSBzZXJ2ZXIuCisgICAgICAgIDMgICBOYW1lIEVycm9yIC0gbWVhbmluZ2Z1bCBvbmx5IGZvciByZXNwb25zZXMgZnJvbQorICAgICAgICAgICAgYW4gYXV0aG9yaXRhdGl2ZSBuYW1lIHNlcnZlci4gVGhlIHJlZmVyZW5jZWQgZG9tYWluIG5hbWUKKyAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorICAgICAgICA0ICAgTm90IEltcGxlbWVudGVkLgorICAgICAgICA1ICAgUmVmdXNlZC4KK1FEQ09VTlQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHF1ZXN0aW9uIHNlY3Rpb24uCitBTkNPVU5UIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBhbnN3ZXIgc2VjdGlvbi4KK05TQ09VTlQgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGF1dGhvcml0eSByZWNvcmRzIHNlY3Rpb24uCitBUkNPVU5UIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBhZGRpdGlvbmFsIHJlY29yZHMgc2VjdGlvbi4KKworNC4xLjIuIFF1ZXN0aW9uIHNlY3Rpb24gZm9ybWF0CisKK1RoZSBzZWN0aW9uIGNvbnRhaW5zIFFEQ09VTlQgKHVzdWFsbHkgMSkgZW50cmllcywgZWFjaCBvZiB0aGlzIGZvcm1hdDoKKyAgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgLyAgICAgICAgICAgICAgICAgICAgIFFOQU1FICAgICAgICAgICAgICAgICAgICAgLworICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgIFFUWVBFICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgUUNMQVNTICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworUU5BTUUgICBhIGRvbWFpbiBuYW1lIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgbGFiZWxzLCB3aGVyZQorICAgICAgICBlYWNoIGxhYmVsIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIG9jdGV0IGZvbGxvd2VkIGJ5IHRoYXQKKyAgICAgICAgbnVtYmVyIG9mIG9jdGV0cy4gVGhlIGRvbWFpbiBuYW1lIHRlcm1pbmF0ZXMgd2l0aCB0aGUKKyAgICAgICAgemVybyBsZW5ndGggb2N0ZXQgZm9yIHRoZSBudWxsIGxhYmVsIG9mIHRoZSByb290LiBOb3RlCisgICAgICAgIHRoYXQgdGhpcyBmaWVsZCBtYXkgYmUgYW4gb2RkIG51bWJlciBvZiBvY3RldHM7IG5vCisgICAgICAgIHBhZGRpbmcgaXMgdXNlZC4KK1FUWVBFICAgYSB0d28gb2N0ZXQgdHlwZSBvZiB0aGUgcXVlcnkuCisgICAgICAgICAgMSBhIGhvc3QgYWRkcmVzcyBbUkVRX0EgY29uc3RdCisgICAgICAgICAgMiBhbiBhdXRob3JpdGF0aXZlIG5hbWUgc2VydmVyCisgICAgICAgICAgMyBhIG1haWwgZGVzdGluYXRpb24gKE9ic29sZXRlIC0gdXNlIE1YKQorICAgICAgICAgIDQgYSBtYWlsIGZvcndhcmRlciAoT2Jzb2xldGUgLSB1c2UgTVgpCisgICAgICAgICAgNSB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIGFuIGFsaWFzCisgICAgICAgICAgNiBtYXJrcyB0aGUgc3RhcnQgb2YgYSB6b25lIG9mIGF1dGhvcml0eQorICAgICAgICAgIDcgYSBtYWlsYm94IGRvbWFpbiBuYW1lIChFWFBFUklNRU5UQUwpCisgICAgICAgICAgOCBhIG1haWwgZ3JvdXAgbWVtYmVyIChFWFBFUklNRU5UQUwpCisgICAgICAgICAgOSBhIG1haWwgcmVuYW1lIGRvbWFpbiBuYW1lIChFWFBFUklNRU5UQUwpCisgICAgICAgICAxMCBhIG51bGwgUlIgKEVYUEVSSU1FTlRBTCkKKyAgICAgICAgIDExIGEgd2VsbCBrbm93biBzZXJ2aWNlIGRlc2NyaXB0aW9uCisgICAgICAgICAxMiBhIGRvbWFpbiBuYW1lIHBvaW50ZXIgW1JFUV9QVFIgY29uc3RdCisgICAgICAgICAxMyBob3N0IGluZm9ybWF0aW9uCisgICAgICAgICAxNCBtYWlsYm94IG9yIG1haWwgbGlzdCBpbmZvcm1hdGlvbgorICAgICAgICAgMTUgbWFpbCBleGNoYW5nZQorICAgICAgICAgMTYgdGV4dCBzdHJpbmdzCisgICAgICAgMHgxYyBJUHY2PworICAgICAgICAyNTIgYSByZXF1ZXN0IGZvciBhIHRyYW5zZmVyIG9mIGFuIGVudGlyZSB6b25lCisgICAgICAgIDI1MyBhIHJlcXVlc3QgZm9yIG1haWxib3gtcmVsYXRlZCByZWNvcmRzIChNQiwgTUcgb3IgTVIpCisgICAgICAgIDI1NCBhIHJlcXVlc3QgZm9yIG1haWwgYWdlbnQgUlJzIChPYnNvbGV0ZSAtIHNlZSBNWCkKKyAgICAgICAgMjU1IGEgcmVxdWVzdCBmb3IgYWxsIHJlY29yZHMKK1FDTEFTUyAgYSB0d28gb2N0ZXQgY29kZSB0aGF0IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgdGhlIHF1ZXJ5LgorICAgICAgICAgIDEgdGhlIEludGVybmV0CisgICAgICAgIChvdGhlcnMgYXJlIGhpc3RvcmljIG9ubHkpCisgICAgICAgIDI1NSBhbnkgY2xhc3MKKworNC4xLjMuIFJlc291cmNlIFJlY29yZCBmb3JtYXQKKworVGhlIGFuc3dlciwgYXV0aG9yaXR5LCBhbmQgYWRkaXRpb25hbCBzZWN0aW9ucyBhbGwgc2hhcmUgdGhlIHNhbWUgZm9ybWF0OgorYSB2YXJpYWJsZSBudW1iZXIgb2YgcmVzb3VyY2UgcmVjb3Jkcywgd2hlcmUgdGhlIG51bWJlciBvZiByZWNvcmRzCitpcyBzcGVjaWZpZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY291bnQgZmllbGQgaW4gdGhlIGhlYWRlci4KK0VhY2ggcmVzb3VyY2UgcmVjb3JkIGhhcyB0aGlzIGZvcm1hdDoKKyAgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgIC8gICAgICAgICAgICAgICAgICAgICAgTkFNRSAgICAgICAgICAgICAgICAgICAgIC8KKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBUWVBFICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgQ0xBU1MgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgVFRMICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgUkRMRU5HVEggICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS18CisgICAgLyAgICAgICAgICAgICAgICAgICAgIFJEQVRBICAgICAgICAgICAgICAgICAgICAgLworICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCitOQU1FICAgIGEgZG9tYWluIG5hbWUgdG8gd2hpY2ggdGhpcyByZXNvdXJjZSByZWNvcmQgcGVydGFpbnMuCitUWVBFICAgIHR3byBvY3RldHMgY29udGFpbmluZyBvbmUgb2YgdGhlIFJSIHR5cGUgY29kZXMuICBUaGlzCisgICAgICAgIGZpZWxkIHNwZWNpZmllcyB0aGUgbWVhbmluZyBvZiB0aGUgZGF0YSBpbiB0aGUgUkRBVEEgZmllbGQuCitDTEFTUyAgIHR3byBvY3RldHMgd2hpY2ggc3BlY2lmeSB0aGUgY2xhc3Mgb2YgdGhlIGRhdGEgaW4gdGhlIFJEQVRBIGZpZWxkLgorVFRMICAgICBhIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB0aW1lIGludGVydmFsCisgICAgICAgIChpbiBzZWNvbmRzKSB0aGF0IHRoZSByZWNvcmQgbWF5IGJlIGNhY2hlZC4KK1JETEVOR1RIIGEgMTYgYml0IGludGVnZXIsIGxlbmd0aCBpbiBvY3RldHMgb2YgdGhlIFJEQVRBIGZpZWxkLgorUkRBVEEgICBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcgb2Ygb2N0ZXRzIHRoYXQgZGVzY3JpYmVzIHRoZSByZXNvdXJjZS4KKyAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGlzIGluZm9ybWF0aW9uIHZhcmllcyBhY2NvcmRpbmcgdG8gdGhlIFRZUEUKKyAgICAgICAgYW5kIENMQVNTIG9mIHRoZSByZXNvdXJjZSByZWNvcmQuCisgICAgICAgIElmIHRoZSBUWVBFIGlzIEEgYW5kIHRoZSBDTEFTUyBpcyBJTiwgaXQncyBhIDQgb2N0ZXQgSVAgYWRkcmVzcy4KKworNC4xLjQuIE1lc3NhZ2UgY29tcHJlc3Npb24KKworSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBzaXplIG9mIG1lc3NhZ2VzLCBkb21haW4gbmFtZXMgY29hbiBiZSBjb21wcmVzc2VkLgorQW4gZW50aXJlIGRvbWFpbiBuYW1lIG9yIGEgbGlzdCBvZiBsYWJlbHMgYXQgdGhlIGVuZCBvZiBhIGRvbWFpbiBuYW1lCitpcyByZXBsYWNlZCB3aXRoIGEgcG9pbnRlciB0byBhIHByaW9yIG9jY3VyYW5jZSBvZiB0aGUgc2FtZSBuYW1lLgorCitUaGUgcG9pbnRlciB0YWtlcyB0aGUgZm9ybSBvZiBhIHR3byBvY3RldCBzZXF1ZW5jZToKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAxICAxfCAgICAgICAgICAgICAgICBPRkZTRVQgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKK1RoZSBmaXJzdCB0d28gYml0cyBhcmUgb25lcy4gIFRoaXMgYWxsb3dzIGEgcG9pbnRlciB0byBiZSBkaXN0aW5ndWlzaGVkCitmcm9tIGEgbGFiZWwsIHNpbmNlIHRoZSBsYWJlbCBtdXN0IGJlZ2luIHdpdGggdHdvIHplcm8gYml0cyBiZWNhdXNlCitsYWJlbHMgYXJlIHJlc3RyaWN0ZWQgdG8gNjMgb2N0ZXRzIG9yIGxlc3MuICBUaGUgT0ZGU0VUIGZpZWxkIHNwZWNpZmllcworYW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlIChpLmUuLCB0aGUgZmlyc3Qgb2N0ZXQKK29mIHRoZSBJRCBmaWVsZCBpbiB0aGUgZG9tYWluIGhlYWRlcikuCitBIHplcm8gb2Zmc2V0IHNwZWNpZmllcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgSUQgZmllbGQsIGV0Yy4KK0RvbWFpbiBuYW1lIGluIGEgbWVzc2FnZSBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgZWl0aGVyOgorICAgLSBhIHNlcXVlbmNlIG9mIGxhYmVscyBlbmRpbmcgaW4gYSB6ZXJvIG9jdGV0CisgICAtIGEgcG9pbnRlcgorICAgLSBhIHNlcXVlbmNlIG9mIGxhYmVscyBlbmRpbmcgd2l0aCBhIHBvaW50ZXIKKyAqLworc3RhdGljIGludCBwcm9jZXNzX3BhY2tldChzdHJ1Y3QgZG5zX2VudHJ5ICpjb25mX2RhdGEsCisJCXVpbnQzMl90IGNvbmZfdHRsLAorCQl1aW50OF90ICpidWYpCit7CisJc3RydWN0IGRuc19oZWFkICpoZWFkOworCXN0cnVjdCB0eXBlX2FuZF9jbGFzcyAqdW5hbGlnbmVkX3R5cGVfY2xhc3M7CisJY29uc3QgY2hhciAqZXJyX21zZzsKKwljaGFyICpxdWVyeV9zdHJpbmc7CisJY2hhciAqYW5zd3N0cjsKKwl1aW50OF90ICphbnN3YjsKKwl1aW50MTZfdCBvdXRyX3JsZW47CisJdWludDE2X3Qgb3V0cl9mbGFnczsKKwl1aW50MTZfdCB0eXBlOworCXVpbnQxNl90IGNsYXNzOworCWludCBxdWVyeV9sZW47CisKKwloZWFkID0gKHN0cnVjdCBkbnNfaGVhZCAqKWJ1ZjsKKwlpZiAoaGVhZC0+bnF1ZXIgPT0gMCkgeworCQliYl9lcnJvcl9tc2coInBhY2tldCBoYXMgMCBxdWVyaWVzLCBpZ25vcmVkIik7CisJCXJldHVybiAwOyAvKiBkb24ndCByZXBseSAqLworCX0KKwlpZiAoaGVhZC0+ZmxhZ3MgJiBodG9ucygweDgwMDApKSB7IC8qIFFSIGJpdCAqLworCQliYl9lcnJvcl9tc2coInJlc3BvbnNlIHBhY2tldCwgaWdub3JlZCIpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgcmVwbHkgKi8KKwl9CisJLyogUVIgPSAxICJyZXNwb25zZSIsIFJDT0RFID0gNCAiTm90IEltcGxlbWVudGVkIiAqLworCW91dHJfZmxhZ3MgPSBodG9ucygweDgwMDAgfCA0KTsKKwllcnJfbXNnID0gTlVMTDsKKworCS8qIHN0YXJ0IG9mIHF1ZXJ5IHN0cmluZyAqLworCXF1ZXJ5X3N0cmluZyA9ICh2b2lkICopKGhlYWQgKyAxKTsKKwkvKiBjYWxsZXIgZ3VhcmFudGVlcyBzdHJsZW4gaXMgPD0gTUFYX1BBQ0tfTEVOICovCisJcXVlcnlfbGVuID0gc3RybGVuKHF1ZXJ5X3N0cmluZykgKyAxOworCS8qIG1heSBiZSB1bmFsaWduZWQhICovCisJdW5hbGlnbmVkX3R5cGVfY2xhc3MgPSAodm9pZCAqKShxdWVyeV9zdHJpbmcgKyBxdWVyeV9sZW4pOworCXF1ZXJ5X2xlbiArPSBzaXplb2YoKnVuYWxpZ25lZF90eXBlX2NsYXNzKTsKKwkvKiB3aGVyZSB0byBhcHBlbmQgYW5zd2VyIGJsb2NrICovCisJYW5zd2IgPSAodm9pZCAqKSh1bmFsaWduZWRfdHlwZV9jbGFzcyArIDEpOworCisJLyogT1BDT0RFICE9IDAgInN0YW5kYXJkIHF1ZXJ5Ij8gKi8KKwlpZiAoKGhlYWQtPmZsYWdzICYgaHRvbnMoMHg3ODAwKSkgIT0gMCkgeworCQllcnJfbXNnID0gIm9wY29kZSAhPSAwIjsKKwkJZ290byBlbXB0eV9wYWNrZXQ7CisJfQorCW1vdmVfZnJvbV91bmFsaWduZWQxNihjbGFzcywgJnVuYWxpZ25lZF90eXBlX2NsYXNzLT5jbGFzcyk7CisJaWYgKGNsYXNzICE9IGh0b25zKDEpKSB7IC8qIG5vdCBjbGFzcyBJTkVUPyAqLworCQllcnJfbXNnID0gImNsYXNzICE9IDEiOworCQlnb3RvIGVtcHR5X3BhY2tldDsKKwl9CisJbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHR5cGUsICZ1bmFsaWduZWRfdHlwZV9jbGFzcy0+dHlwZSk7CisJaWYgKHR5cGUgIT0gaHRvbnMoUkVRX0EpICYmIHR5cGUgIT0gaHRvbnMoUkVRX1BUUikpIHsKKwkJLyogd2UgY2FuJ3QgaGFuZGxlIHRoaXMgcXVlcnkgdHlwZSAqLworLy9UT0RPOiBoYXBwZW5zIGFsbCB0aGUgdGltZSB3aXRoIFJFUV9BQUFBICgweDFjKSByZXF1ZXN0cyAtIGltcGxlbWVudCB0aG9zZT8KKwkJZXJyX21zZyA9ICJ0eXBlIGlzICFSRVFfQSBhbmQgIVJFUV9QVFIiOworCQlnb3RvIGVtcHR5X3BhY2tldDsKKwl9CisKKwkvKiBsb29rIHVwIHRoZSBuYW1lICovCisJYW5zd3N0ciA9IHRhYmxlX2xvb2t1cChjb25mX2RhdGEsIHR5cGUsIHF1ZXJ5X3N0cmluZyk7CisjaWYgREVCVUcKKwkvKiBTaG93cyBsZW5ndGhzIGluc3RlYWQgb2YgZG90cywgdW51c2FibGUgZm9yICFERUJVRyAqLworCWJiX2Vycm9yX21zZygiJyVzJy0+JyVzJyIsIHF1ZXJ5X3N0cmluZywgYW5zd3N0cik7CisjZW5kaWYKKwlvdXRyX3JsZW4gPSA0OworCWlmIChhbnN3c3RyICYmIHR5cGUgPT0gaHRvbnMoUkVRX1BUUikpIHsKKwkJLyogcmV0dXJuaW5nIGEgaG9zdCBuYW1lICovCisJCW91dHJfcmxlbiA9IHN0cmxlbihhbnN3c3RyKSArIDE7CisJfQorCWlmICghYW5zd3N0cgorCSB8fCAodW5zaWduZWQpKGFuc3diIC0gYnVmKSArIHF1ZXJ5X2xlbiArIDQgKyAyICsgb3V0cl9ybGVuID4gTUFYX1BBQ0tfTEVOCisJKSB7CisJCS8qIFFSID0gMSAicmVzcG9uc2UiCisJCSAqIEFBID0gMSAiQXV0aG9yaXRhdGl2ZSBBbnN3ZXIiCisJCSAqIFJDT0RFID0gMyAiTmFtZSBFcnJvciIgKi8KKwkJZXJyX21zZyA9ICJuYW1lIGlzIG5vdCBmb3VuZCI7CisJCW91dHJfZmxhZ3MgPSBodG9ucygweDgwMDAgfCAweDA0MDAgfCAzKTsKKwkJZ290byBlbXB0eV9wYWNrZXQ7CisJfQorCisJLyogQXBwZW5kIGFuc3dlciBSZXNvdXJjZSBSZWNvcmQgKi8KKwltZW1jcHkoYW5zd2IsIHF1ZXJ5X3N0cmluZywgcXVlcnlfbGVuKTsgLyogbmFtZSwgdHlwZSwgY2xhc3MgKi8KKwlhbnN3YiArPSBxdWVyeV9sZW47CisJbW92ZV90b191bmFsaWduZWQzMigodWludDMyX3QgKilhbnN3YiwgaHRvbmwoY29uZl90dGwpKTsKKwlhbnN3YiArPSA0OworCW1vdmVfdG9fdW5hbGlnbmVkMTYoKHVpbnQxNl90ICopYW5zd2IsIGh0b25zKG91dHJfcmxlbikpOworCWFuc3diICs9IDI7CisJbWVtY3B5KGFuc3diLCBhbnN3c3RyLCBvdXRyX3JsZW4pOworCWFuc3diICs9IG91dHJfcmxlbjsKKworCS8qIFFSID0gMSAicmVzcG9uc2UiLAorCSAqIEFBID0gMSAiQXV0aG9yaXRhdGl2ZSBBbnN3ZXIiLAorCSAqIFRPRE86IG5lZWQgdG8gc2V0IFJBIGJpdCAweDgwPyBPbmUgdXNlciBzYXlzIG5zbG9va3VwIGNvbXBsYWlucworCSAqICJHb3QgcmVjdXJzaW9uIG5vdCBhdmFpbGFibGUgZnJvbSBTRVJWRVIsIHRyeWluZyBuZXh0IHNlcnZlciIKKwkgKiAiKiogc2VydmVyIGNhbid0IGZpbmQgSE9TVE5BTUUiCisJICogUkNPREUgPSAwICJzdWNjZXNzIgorCSAqLworCWlmIChPUFRfdmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKCJyZXR1cm5pbmcgcG9zaXRpdmUgcmVwbHkiKTsKKwlvdXRyX2ZsYWdzID0gaHRvbnMoMHg4MDAwIHwgMHgwNDAwIHwgMCk7CisJLyogd2UgaGF2ZSBvbmUgYW5zd2VyICovCisJaGVhZC0+bmFuc3cgPSBodG9ucygxKTsKKworIGVtcHR5X3BhY2tldDoKKwlpZiAoKG91dHJfZmxhZ3MgJiBodG9ucygweGYpKSAhPSAwKSB7IC8qIG5vdCBhIHBvc2l0aXZlIHJlc3BvbnNlICovCisJCWlmIChPUFRfdmVyYm9zZSkgeworCQkJYmJfZXJyb3JfbXNnKCIlcywgJXMiLAorCQkJCWVycl9tc2csCisJCQkJT1BUX3NpbGVudCA/ICJkcm9wcGluZyBxdWVyeSIgOiAic2VuZGluZyBlcnJvciByZXBseSIKKwkJCSk7CisJCX0KKwkJaWYgKE9QVF9zaWxlbnQpCisJCQlyZXR1cm4gMDsKKwl9CisJaGVhZC0+ZmxhZ3MgfD0gb3V0cl9mbGFnczsKKwloZWFkLT5uYXV0aCA9IGhlYWQtPm5hZGQgPSAwOworCWhlYWQtPm5xdWVyID0gaHRvbnMoMSk7IC8vIHdoeT8/PworCisJcmV0dXJuIGFuc3diIC0gYnVmOworfQorCitpbnQgZG5zZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZG5zZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqbGlzdGVuX2ludGVyZmFjZSA9ICIwLjAuMC4wIjsKKwljb25zdCBjaGFyICpmaWxlY29uZiA9ICIvZXRjL2Ruc2QuY29uZiI7CisJc3RydWN0IGRuc19lbnRyeSAqY29uZl9kYXRhOworCXVpbnQzMl90IGNvbmZfdHRsID0gREVGQVVMVF9UVEw7CisJY2hhciAqc3R0bCwgKnNwb3J0OworCWxlbl9hbmRfc29ja2FkZHIgKmxzYSwgKmZyb20sICp0bzsKKwl1bnNpZ25lZCBsc2Ffc2l6ZTsKKwlpbnQgdWRwcywgb3B0czsKKwl1aW50MTZfdCBwb3J0ID0gNTM7CisJLyogRW5zdXJlIGJ1ZiBpcyAzMmJpdCBhbGlnbmVkICh3ZSBuZWVkIDE2Yml0LCBidXQgMzJiaXQgY2FuJ3QgaHVydCkgKi8KKwl1aW50OF90IGJ1ZltNQVhfUEFDS19MRU4gKyAxXSBBTElHTjQ7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInZzaTpjOnQ6cDpkIiwgJmxpc3Rlbl9pbnRlcmZhY2UsICZmaWxlY29uZiwgJnN0dGwsICZzcG9ydCk7CisJLy9pZiAob3B0cyAmICgxIDw8IDApKSAvLyAtdgorCS8vaWYgKG9wdHMgJiAoMSA8PCAxKSkgLy8gLXMKKwkvL2lmIChvcHRzICYgKDEgPDwgMikpIC8vIC1pCisJLy9pZiAob3B0cyAmICgxIDw8IDMpKSAvLyAtYworCWlmIChvcHRzICYgKDEgPDwgNCkpIC8vIC10CisJCWNvbmZfdHRsID0geGF0b3VfcmFuZ2Uoc3R0bCwgMSwgMHhmZmZmZmZmZik7CisJaWYgKG9wdHMgJiAoMSA8PCA1KSkgLy8gLXAKKwkJcG9ydCA9IHhhdG91X3JhbmdlKHNwb3J0LCAxLCAweGZmZmYpOworCWlmIChvcHRzICYgKDEgPDwgNikpIHsgLy8gLWQKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DTE9TRV9FWFRSQV9GRFMsIGFyZ3YpOworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCX0KKworCWNvbmZfZGF0YSA9IHBhcnNlX2NvbmZfZmlsZShmaWxlY29uZik7CisKKwlsc2EgPSB4ZG90dGVkMnNvY2thZGRyKGxpc3Rlbl9pbnRlcmZhY2UsIHBvcnQpOworCXVkcHMgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworCXhiaW5kKHVkcHMsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKwlzb2NrZXRfd2FudF9wa3RpbmZvKHVkcHMpOyAvKiBuZWVkZWQgZm9yIHJlY3ZfZnJvbV90byB0byB3b3JrICovCisJbHNhX3NpemUgPSBMU0FfTEVOX1NJWkUgKyBsc2EtPmxlbjsKKwlmcm9tID0geHphbGxvYyhsc2Ffc2l6ZSk7CisJdG8gPSB4emFsbG9jKGxzYV9zaXplKTsKKworCXsKKwkJY2hhciAqcCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZsc2EtPnUuc2EpOworCQliYl9lcnJvcl9tc2coImFjY2VwdGluZyBVRFAgcGFja2V0cyBvbiAlcyIsIHApOworCQlmcmVlKHApOworCX0KKworCXdoaWxlICgxKSB7CisJCWludCByOworCQkvKiBUcnkgdG8gZ2V0ICpERVNUKiBhZGRyZXNzICh0byB3aGljaCBvZiBvdXIgYWRkcmVzc2VzCisJCSAqIHRoaXMgcXVlcnkgd2FzIGRpcmVjdGVkKSwgYW5kIHJlcGx5IGZyb20gdGhlIHNhbWUgYWRkcmVzcy4KKwkJICogT3IgZWxzZSB3ZSBjYW4gZXhoaWJpdCB1c3VhbCBVRFAgdWdsaW5lc3M6CisJCSAqIFtpcDEubXVsdGlob21lZC5pcDJdIDw9ICBxdWVyeSB0byBpcDEgIDw9IHBlZXIKKwkJICogW2lwMS5tdWx0aWhvbWVkLmlwMl0gPT4gcmVwbHkgZnJvbSBpcDIgPT4gcGVlciAoY29uZnVzZWQpICovCisJCW1lbWNweSh0bywgbHNhLCBsc2Ffc2l6ZSk7CisJCXIgPSByZWN2X2Zyb21fdG8odWRwcywgYnVmLCBNQVhfUEFDS19MRU4gKyAxLCAwLCAmZnJvbS0+dS5zYSwgJnRvLT51LnNhLCBsc2EtPmxlbik7CisJCWlmIChyIDwgMTIgfHwgciA+IE1BWF9QQUNLX0xFTikgeworCQkJYmJfZXJyb3JfbXNnKCJwYWNrZXQgc2l6ZSAlZCwgaWdub3JlZCIsIHIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKE9QVF92ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKCJnb3QgVURQIHBhY2tldCIpOworCQlidWZbcl0gPSAnXDAnOyAvKiBwYXJhbm9pYSAqLworCQlyID0gcHJvY2Vzc19wYWNrZXQoY29uZl9kYXRhLCBjb25mX3R0bCwgYnVmKTsKKwkJaWYgKHIgPD0gMCkKKwkJCWNvbnRpbnVlOworCQlzZW5kX3RvX2Zyb20odWRwcywgYnVmLCByLCAwLCAmZnJvbS0+dS5zYSwgJnRvLT51LnNhLCBsc2EtPmxlbik7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9ldGhlci13YWtlLmMgYi9uZXR3b3JraW5nL2V0aGVyLXdha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg4Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9ldGhlci13YWtlLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGV0aGVyLXdha2UuYyAtIFNlbmQgYSBtYWdpYyBwYWNrZXQgdG8gd2FrZSB1cCBzbGVlcGluZyBtYWNoaW5lcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcjogICAgICBEb25hbGQgQmVja2VyLCBodHRwOi8vd3d3LnNjeWxkLmNvbS8iOyBodHRwOi8vd3d3LnNjeWxkLmNvbS93YWtlb25sYW4uaHRtbAorICogQnVzeWJveCBwb3J0OiBDaHJpc3RpYW4gVm9sa21hbm4gPGhhdmVhbmljZWRheUBvbmxpbmUuZGU+CisgKiAgICAgICAgICAgICAgIFVzZWQgdmVyc2lvbiBvZiBldGhlci13YWtlLmM6IHYxLjA5IDExLzEyLzIwMDMgRG9uYWxkIEJlY2tlciwgaHR0cDovL3d3dy5zY3lsZC5jb20vIjsKKyAqLworCisvKiBmdWxsIHVzYWdlIGFjY29yZGluZyBEb25hbGQgQmVja2VyCisgKiB1c2FnZTogZXRoZXItd2FrZSBbLWkgPGlmbmFtZT5dIFstcCBhYTpiYjpjYzpkZFs6ZWU6ZmZdXSAwMDoxMToyMjozMzo0NDo1NVxuIgorICoKKyAqCVRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgYW5kIHRyYW5zbWl0cyBhIFdha2UtT24tTEFOIChXT0wpXG4iCisgKglcIk1hZ2ljIFBhY2tldFwiLCB1c2VkIGZvciByZXN0YXJ0aW5nIG1hY2hpbmVzIHRoYXQgaGF2ZSBiZWVuXG4iCisgKglzb2Z0LXBvd2VyZWQtZG93biAoQUNQSSBEMy13YXJtIHN0YXRlKS5cbiIKKyAqCUl0IGN1cnJlbnRseSBnZW5lcmF0ZXMgdGhlIHN0YW5kYXJkIEFNRCBNYWdpYyBQYWNrZXQgZm9ybWF0LCB3aXRoXG4iCisgKglhbiBvcHRpb25hbCBwYXNzd29yZCBhcHBlbmRlZC5cbiIKKyAqCisgKglUaGUgc2luZ2xlIHJlcXVpcmVkIHBhcmFtZXRlciBpcyB0aGUgRXRoZXJuZXQgTUFDIChzdGF0aW9uKSBhZGRyZXNzXG4iCisgKglvZiB0aGUgbWFjaGluZSB0byB3YWtlIG9yIGEgaG9zdCBJRCB3aXRoIGtub3duIE5TUyAnZXRoZXJzJyBlbnRyeS5cbiIKKyAqCVRoZSBNQUMgYWRkcmVzcyBtYXkgYmUgZm91bmQgd2l0aCB0aGUgJ2FycCcgcHJvZ3JhbSB3aGlsZSB0aGUgdGFyZ2V0XG4iCisgKgltYWNoaW5lIGlzIGF3YWtlLlxuIgorICoKKyAqCU9wdGlvbnM6XG4iCisgKgkJLWIJU2VuZCB3YWtlLXVwIHBhY2tldCB0byB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuXG4iCisgKgkJLUQJSW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsLlxuIgorICoJCS1pIGlmbmFtZQlVc2UgaW50ZXJmYWNlIElGTkFNRSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0ICdldGgwJy5cbiIKKyAqCQktcCA8cHc+CQlBcHBlbmQgdGhlIGZvdXIgb3Igc2l4IGJ5dGUgcGFzc3dvcmQgUFcgdG8gdGhlIHBhY2tldC5cbiIKKyAqCQkJCQlBIHBhc3N3b3JkIGlzIG9ubHkgcmVxdWlyZWQgZm9yIGEgZmV3IGFkYXB0ZXIgdHlwZXMuXG4iCisgKgkJCQkJVGhlIHBhc3N3b3JkIG1heSBiZSBzcGVjaWZpZWQgaW4gZXRoZXJuZXQgaGV4IGZvcm1hdFxuIgorICoJCQkJCW9yIGRvdHRlZCBkZWNpbWFsIChJbnRlcm5ldCBhZGRyZXNzKVxuIgorICoJCS1wIDAwOjIyOjQ0OjY2Ojg4OmFhXG4iCisgKgkJLXAgMTkyLjE2OC4xLjFcbiI7CisgKgorICoKKyAqCVRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgYW5kIHRyYW5zbWl0cyBhIFdha2UtT24tTEFOIChXT0wpICJNYWdpYyBQYWNrZXQiLAorICoJdXNlZCBmb3IgcmVzdGFydGluZyBtYWNoaW5lcyB0aGF0IGhhdmUgYmVlbiBzb2Z0LXBvd2VyZWQtZG93bgorICoJKEFDUEkgRDMtd2FybSBzdGF0ZSkuICBJdCBjdXJyZW50bHkgZ2VuZXJhdGVzIHRoZSBzdGFuZGFyZCBBTUQgTWFnaWMgUGFja2V0CisgKglmb3JtYXQsIHdpdGggYW4gb3B0aW9uYWwgcGFzc3dvcmQgYXBwZW5kZWQuCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKglDb250YWN0IHRoZSBhdXRob3IgZm9yIHVzZSB1bmRlciBvdGhlciB0ZXJtcy4KKyAqCisgKglUaGlzIHNvdXJjZSBmaWxlIHdhcyBvcmlnaW5hbGx5IHBhcnQgb2YgdGhlIG5ldHdvcmsgdHJpY2tzIHBhY2thZ2UsIGFuZAorICoJaXMgbm93IGRpc3RyaWJ1dGVkIHRvIHN1cHBvcnQgdGhlIFNjeWxkIEJlb3d1bGYgc3lzdGVtLgorICoJQ29weXJpZ2h0IDE5OTktMjAwMyBEb25hbGQgQmVja2VyIGFuZCBTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24uCisgKgorICoJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQsIG9yIEMvTworICoJIFNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorICoJIDkxNCBCYXkgUmlkZ2UgUm9hZCwgU3VpdGUgMjIwCisgKgkgQW5uYXBvbGlzIE1EIDIxNDAzCisgKgorICogICBOb3RlczoKKyAqICAgT24gc29tZSBzeXN0ZW1zIGRyb3BwaW5nIHJvb3QgY2FwYWJpbGl0eSBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gYmUKKyAqICAgZHVtcGVkLCB0cmFjZWQgb3IgZGVidWdnZWQuCisgKiAgIElmIHNvbWVvbmUgdHJhY2VzIHRoaXMgcHJvZ3JhbSwgdGhleSBnZXQgY29udHJvbCBvZiBhIHJhdyBzb2NrZXQuCisgKiAgIExpbnV4IGhhbmRsZXMgdGhpcyBzYWZlbHksIGJ1dCBiZXdhcmUgd2hlbiBwb3J0aW5nIHRoaXMgcHJvZ3JhbS4KKyAqCisgKiAgIEFuIGFsdGVybmF0aXZlIHRvIG5lZWRpbmcgJ3Jvb3QnIGlzIHVzaW5nIGEgVURQIGJyb2FkY2FzdCBzb2NrZXQsIGhvd2V2ZXIKKyAqICAgZG9pbmcgc28gb25seSB3b3JrcyB3aXRoIGFkYXB0ZXJzIGNvbmZpZ3VyZWQgZm9yIHVuaWNhc3QrYnJvYWRjYXN0IFJ4CisgKiAgIGZpbHRlci4gIFRoYXQgY29uZmlndXJhdGlvbiBjb25zdW1lcyBtb3JlIHBvd2VyLgorKi8KKworLy91c2FnZTojZGVmaW5lIGV0aGVyX3dha2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYl0gWy1pIGlmYWNlXSBbLXAgYWE6YmI6Y2M6ZGRbOmVlOmZmXV0gTUFDIgorLy91c2FnZTojZGVmaW5lIGV0aGVyX3dha2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIGEgbWFnaWMgcGFja2V0IHRvIHdha2UgdXAgc2xlZXBpbmcgbWFjaGluZXMuXG4iCisvL3VzYWdlOiAgICAgICAiTUFDIG11c3QgYmUgYSBzdGF0aW9uIGFkZHJlc3MgKDAwOjExOjIyOjMzOjQ0OjU1KSBvclxuIgorLy91c2FnZTogICAgICAgImEgaG9zdG5hbWUgd2l0aCBhIGtub3duICdldGhlcnMnIGVudHJ5LlxuIgorLy91c2FnZTogICAgICJcbgktYgkJU2VuZCB3YWtlLXVwIHBhY2tldCB0byB0aGUgYnJvYWRjYXN0IGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1pIGlmYWNlCUludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMCkiCisvL3VzYWdlOiAgICAgIlxuCS1wIHBhc3MJCUFwcGVuZCBmb3VyIG9yIHNpeCBieXRlIHBhc3N3b3JkIFBXIHRvIHRoZSBwYWNrZXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworLyogTm90ZTogUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAgd291bGQgYWxsb3cgU0lPQ0dJRkhXQUREUiB0bworICogd29yayBhcyBub24tcm9vdCwgYnV0IHdlIG5lZWQgU09DS19QQUNLRVQgdG8gc3BlY2lmeSB0aGUgRXRoZXJuZXQKKyAqIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKi8KKyNpZmRlZiBQRl9QQUNLRVQKKyMgZGVmaW5lIHdoZXJldG9fdCBzb2NrYWRkcl9sbAorIyBkZWZpbmUgbWFrZV9zb2NrZXQoKSB4c29ja2V0KFBGX1BBQ0tFVCwgU09DS19SQVcsIDApCisjZWxzZQorIyBkZWZpbmUgd2hlcmV0b190IHNvY2thZGRyCisjIGRlZmluZSBtYWtlX3NvY2tldCgpIHhzb2NrZXQoQUZfSU5FVCwgU09DS19QQUNLRVQsIFNPQ0tfUEFDS0VUKQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgYmJfZGVidWdfbXNnKGZtdCwgYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgYXJncykKK3ZvaWQgYmJfZGVidWdfZHVtcF9wYWNrZXQodW5zaWduZWQgY2hhciAqb3V0cGFjaywgaW50IHBrdHNpemUpCit7CisJaW50IGk7CisJcHJpbnRmKCJwYWNrZXQgZHVtcDpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBwa3RzaXplOyArK2kpIHsKKwkJcHJpbnRmKCIlMi4yeCAiLCBvdXRwYWNrW2ldKTsKKwkJaWYgKGkgJSAyMCA9PSAxOSkgYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJcHJpbnRmKCJcblxuIik7Cit9CisjZWxzZQorIyBkZWZpbmUgYmJfZGVidWdfbXNnKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBiYl9kZWJ1Z19kdW1wX3BhY2tldChvdXRwYWNrLCBwa3RzaXplKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBDb252ZXJ0IHRoZSBob3N0IElEIHN0cmluZyB0byBhIE1BQyBhZGRyZXNzLgorICogVGhlIHN0cmluZyBtYXkgYmUgYToKKyAqICAgIEhvc3QgbmFtZQorICogICAgSVAgYWRkcmVzcyBzdHJpbmcKKyAqICAgIE1BQyBhZGRyZXNzIHN0cmluZworKi8KK3N0YXRpYyB2b2lkIGdldF9kZXN0X2FkZHIoY29uc3QgY2hhciAqaG9zdGlkLCBzdHJ1Y3QgZXRoZXJfYWRkciAqZWFkZHIpCit7CisJc3RydWN0IGV0aGVyX2FkZHIgKmVhcDsKKworCWVhcCA9IGV0aGVyX2F0b25fcihob3N0aWQsIGVhZGRyKTsKKwlpZiAoZWFwKSB7CisJCWJiX2RlYnVnX21zZygiVGhlIHRhcmdldCBzdGF0aW9uIGFkZHJlc3MgaXMgJXNcblxuIiwgZXRoZXJfbnRvYShlYXApKTsKKyNpZiAhZGVmaW5lZChfX1VDTElCQ19NQUpPUl9fKSBcCisgfHwgX19VQ0xJQkNfTUFKT1JfXyA+IDAgXAorIHx8IF9fVUNMSUJDX01JTk9SX18gPiA5IFwKKyB8fCAoX19VQ0xJQkNfTUlOT1JfXyA9PSA5ICYmIF9fVUNMSUJDX1NVQkxFVkVMX18gPj0gMzApCisJfSBlbHNlIGlmIChldGhlcl9ob3N0dG9uKGhvc3RpZCwgZWFkZHIpID09IDApIHsKKwkJYmJfZGVidWdfbXNnKCJTdGF0aW9uIGFkZHJlc3MgZm9yIGhvc3RuYW1lICVzIGlzICVzXG5cbiIsIGhvc3RpZCwgZXRoZXJfbnRvYShlYWRkcikpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KK30KKworc3RhdGljIGludCBnZXRfZmlsbCh1bnNpZ25lZCBjaGFyICpwa3QsIHN0cnVjdCBldGhlcl9hZGRyICplYWRkciwgaW50IGJyb2FkY2FzdCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpzdGF0aW9uX2FkZHIgPSBlYWRkci0+ZXRoZXJfYWRkcl9vY3RldDsKKworCW1lbXNldChwa3QsIDB4ZmYsIDYpOworCWlmICghYnJvYWRjYXN0KQorCQltZW1jcHkocGt0LCBzdGF0aW9uX2FkZHIsIDYpOworCXBrdCArPSA2OworCisJbWVtY3B5KHBrdCwgc3RhdGlvbl9hZGRyLCA2KTsgLyogNiAqLworCXBrdCArPSA2OworCisJKnBrdCsrID0gMHgwODsgLyogMTIgKi8gLyogT3IgMHgwODA2IGZvciBBUlAsIDB4ODAzNSBmb3IgUkFSUCAqLworCSpwa3QrKyA9IDB4NDI7IC8qIDEzICovCisKKwltZW1zZXQocGt0LCAweGZmLCA2KTsgLyogMTQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisJCXBrdCArPSA2OworCQltZW1jcHkocGt0LCBzdGF0aW9uX2FkZHIsIDYpOyAvKiAyMCwyNiwzMiwuLi4gKi8KKwl9CisKKwlyZXR1cm4gMjAgKyAxNio2OyAvKiBsZW5ndGggb2YgcGFja2V0ICovCit9CisKK3N0YXRpYyBpbnQgZ2V0X3dvbF9wdyhjb25zdCBjaGFyICpldGhvcHRhcmcsIHVuc2lnbmVkIGNoYXIgKndvbF9wYXNzd2QpCit7CisJdW5zaWduZWQgcGFzc3dkWzZdOworCWludCBieXRlX2NudCwgaTsKKworCS8qIGhhbmRsZSBNQUMgZm9ybWF0ICovCisJYnl0ZV9jbnQgPSBzc2NhbmYoZXRob3B0YXJnLCAiJTJ4OiUyeDolMng6JTJ4OiUyeDolMngiLAorCSAgICAgICAgICAgICAgICAgICZwYXNzd2RbMF0sICZwYXNzd2RbMV0sICZwYXNzd2RbMl0sCisJICAgICAgICAgICAgICAgICAgJnBhc3N3ZFszXSwgJnBhc3N3ZFs0XSwgJnBhc3N3ZFs1XSk7CisJLyogaGFuZGxlIElQIGZvcm1hdCAqLworLy8gRklYTUU6IHdoeSA8IDQ/PyBzaG91bGQgaXQgYmUgPCA2PworCWlmIChieXRlX2NudCA8IDQpCisJCWJ5dGVfY250ID0gc3NjYW5mKGV0aG9wdGFyZywgIiV1LiV1LiV1LiV1IiwKKwkJICAgICAgICAgICAgICAgICAgJnBhc3N3ZFswXSwgJnBhc3N3ZFsxXSwgJnBhc3N3ZFsyXSwgJnBhc3N3ZFszXSk7CisJaWYgKGJ5dGVfY250IDwgNCkgeworCQliYl9lcnJvcl9tc2coImNhbid0IHJlYWQgV2FrZS1Pbi1MQU4gcGFzcyIpOworCQlyZXR1cm4gMDsKKwl9CisvLyBUT0RPOiBjaGVjayBpbnZhbGlkIG51bWJlcnMgPjI1NT8/CisJZm9yIChpID0gMDsgaSA8IGJ5dGVfY250OyArK2kpCisJCXdvbF9wYXNzd2RbaV0gPSBwYXNzd2RbaV07CisKKwliYl9kZWJ1Z19tc2coInBhc3N3b3JkOiAlMi4yeCAlMi4yeCAlMi4yeCAlMi4yeCAoJWQpXG5cbiIsCisJICAgICAgICAgICAgIHdvbF9wYXNzd2RbMF0sIHdvbF9wYXNzd2RbMV0sIHdvbF9wYXNzd2RbMl0sIHdvbF9wYXNzd2RbM10sCisJICAgICAgICAgICAgIGJ5dGVfY250KTsKKworCXJldHVybiBieXRlX2NudDsKK30KKworaW50IGV0aGVyX3dha2VfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGV0aGVyX3dha2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmlmbmFtZSA9ICJldGgwIjsKKwljaGFyICpwYXNzOworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgd29sX3Bhc3N3ZFs2XTsKKwlpbnQgd29sX3Bhc3N3ZF9zeiA9IDA7CisJaW50IHM7ICAvKiBSYXcgc29ja2V0ICovCisJaW50IHBrdHNpemU7CisJdW5zaWduZWQgY2hhciBvdXRwYWNrWzEwMDBdOworCisJc3RydWN0IGV0aGVyX2FkZHIgZWFkZHI7CisJc3RydWN0IHdoZXJldG9fdCB3aGVyZXRvOyAgLyogd2hvIHRvIHdha2UgdXAgKi8KKworCS8qIGhhbmRsZSBtaXNjIHVzZXIgb3B0aW9ucyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJiaTpwOiIsICZpZm5hbWUsICZwYXNzKTsKKwlpZiAoZmxhZ3MgJiA0KSAvKiAtcCAqLworCQl3b2xfcGFzc3dkX3N6ID0gZ2V0X3dvbF9wdyhwYXNzLCB3b2xfcGFzc3dkKTsKKwlmbGFncyAmPSAxOyAvKiB3ZSBmdXJ0aGVyIGludGVyZXN0ZWQgb25seSBpbiAtYiBbYmNhc3RdIGZsYWcgKi8KKworCS8qIGNyZWF0ZSB0aGUgcmF3IHNvY2tldCAqLworCXMgPSBtYWtlX3NvY2tldCgpOworCisJLyogbm93IHRoYXQgd2UgaGF2ZSBhIHJhdyBzb2NrZXQgd2UgY2FuIGRyb3Agcm9vdCAqLworCS8qIHhzZXR1aWQoZ2V0dWlkKCkpOyAtIGJ1dCBzYXZlIG9uIGNvZGUgc2l6ZS4uLiAqLworCisJLyogbG9vayB1cCB0aGUgZGVzdCBtYWMgYWRkcmVzcyAqLworCWdldF9kZXN0X2FkZHIoYXJndltvcHRpbmRdLCAmZWFkZHIpOworCisJLyogZmlsbCBvdXQgdGhlIGhlYWRlciBvZiB0aGUgcGFja2V0ICovCisJcGt0c2l6ZSA9IGdldF9maWxsKG91dHBhY2ssICZlYWRkciwgZmxhZ3MgLyogJiAxIE9QVF9CUk9BRENBU1QgKi8pOworCisJYmJfZGVidWdfZHVtcF9wYWNrZXQob3V0cGFjaywgcGt0c2l6ZSk7CisKKwkvKiBGaWxsIGluIHRoZSBzb3VyY2UgYWRkcmVzcywgaWYgcG9zc2libGUuICovCisjaWZkZWYgX19saW51eF9fCisJeworCQlzdHJ1Y3QgaWZyZXEgaWZfaHdhZGRyOworCisJCXN0cm5jcHlfSUZOQU1TSVooaWZfaHdhZGRyLmlmcl9uYW1lLCBpZm5hbWUpOworCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShzLCBTSU9DR0lGSFdBRERSLCAmaWZfaHdhZGRyLCAiU0lPQ0dJRkhXQUREUiBvbiAlcyBmYWlsZWQiLCBpZm5hbWUpOworCisJCW1lbWNweShvdXRwYWNrKzYsIGlmX2h3YWRkci5pZnJfaHdhZGRyLnNhX2RhdGEsIDYpOworCisjIGlmZGVmIERFQlVHCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKmh3YWRkciA9IGlmX2h3YWRkci5pZnJfaHdhZGRyLnNhX2RhdGE7CisJCQlwcmludGYoIlRoZSBoYXJkd2FyZSBhZGRyZXNzIChTSU9DR0lGSFdBRERSKSBvZiAlcyBpcyB0eXBlICVkICAiCisJCQkJICAgIiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4XG5cbiIsIGlmbmFtZSwKKwkJCQkgICBpZl9od2FkZHIuaWZyX2h3YWRkci5zYV9mYW1pbHksIGh3YWRkclswXSwgaHdhZGRyWzFdLAorCQkJCSAgIGh3YWRkclsyXSwgaHdhZGRyWzNdLCBod2FkZHJbNF0sIGh3YWRkcls1XSk7CisJCX0KKyMgZW5kaWYKKwl9CisjZW5kaWYgLyogX19saW51eF9fICovCisKKwliYl9kZWJ1Z19kdW1wX3BhY2tldChvdXRwYWNrLCBwa3RzaXplKTsKKworCS8qIGFwcGVuZCB0aGUgcGFzc3dvcmQgaWYgc3BlY2lmaWVkICovCisJaWYgKHdvbF9wYXNzd2Rfc3ogPiAwKSB7CisJCW1lbWNweShvdXRwYWNrK3BrdHNpemUsIHdvbF9wYXNzd2QsIHdvbF9wYXNzd2Rfc3opOworCQlwa3RzaXplICs9IHdvbF9wYXNzd2Rfc3o7CisJfQorCisJYmJfZGVidWdfZHVtcF9wYWNrZXQob3V0cGFjaywgcGt0c2l6ZSk7CisKKwkvKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgYnJvYWRjYXN0cyB0byB3b3JrICovCisJaWYgKGZsYWdzIC8qICYgMSBPUFRfQlJPQURDQVNUICovKSB7CisJCWlmIChzZXRzb2Nrb3B0X2Jyb2FkY2FzdChzKSAhPSAwKQorCQkJYmJfcGVycm9yX21zZygiU09fQlJPQURDQVNUIik7CisJfQorCisjaWYgZGVmaW5lZChQRl9QQUNLRVQpCisJeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwkJeGlvY3RsKHMsIFNJT0NHSUZJTkRFWCwgJmlmcik7CisJCW1lbXNldCgmd2hlcmV0bywgMCwgc2l6ZW9mKHdoZXJldG8pKTsKKwkJd2hlcmV0by5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworCQl3aGVyZXRvLnNsbF9pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCQkvKiBUaGUgbWFudWFsIHBhZ2UgaW5jb3JyZWN0bHkgY2xhaW1zIHRoZSBhZGRyZXNzIG11c3QgYmUgZmlsbGVkLgorCQkgICBXZSBkbyBzbyBiZWNhdXNlIHRoZSBjb2RlIG1heSBjaGFuZ2UgdG8gbWF0Y2ggdGhlIGRvY3MuICovCisJCXdoZXJldG8uc2xsX2hhbGVuID0gRVRIX0FMRU47CisJCW1lbWNweSh3aGVyZXRvLnNsbF9hZGRyLCBvdXRwYWNrLCBFVEhfQUxFTik7CisJfQorI2Vsc2UKKwl3aGVyZXRvLnNhX2ZhbWlseSA9IDA7CisJc3RyY3B5KHdoZXJldG8uc2FfZGF0YSwgaWZuYW1lKTsKKyNlbmRpZgorCXhzZW5kdG8ocywgb3V0cGFjaywgcGt0c2l6ZSwgKHN0cnVjdCBzb2NrYWRkciAqKSZ3aGVyZXRvLCBzaXplb2Yod2hlcmV0bykpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2Uocyk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvZnRwZC5jIGIvbmV0d29ya2luZy9mdHBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4MTM4YwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvZnRwZC5jCkBAIC0wLDAgKzEsMTM3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2ltcGxlIEZUUCBkYWVtb24sIGJhc2VkIG9uIHZzZnRwZCAyLjAuNyAod3JpdHRlbiBieSBDaHJpcyBFdmFucykKKyAqCisgKiBBdXRob3I6IEFkYW0gVGthYyA8dm9uc2NoQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIE9ubHkgc3Vic2V0IG9mIEZUUCBwcm90b2NvbCBpcyBpbXBsZW1lbnRlZCBidXQgdmFzdCBtYWpvcml0eSBvZiBjbGllbnRzCisgKiBzaG91bGQgbm90IGhhdmUgYW55IHByb2JsZW0uCisgKgorICogWW91IGhhdmUgdG8gcnVuIHRoaXMgZGFlbW9uIHZpYSBpbmV0ZC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZnRwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy13dlNdIFstdCBOXSBbLVQgTl0gW0RJUl0iCisvL3VzYWdlOiNkZWZpbmUgZnRwZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkFub255bW91cyBGVFAgc2VydmVyXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiZnRwZCBzaG91bGQgYmUgdXNlZCBhcyBhbiBpbmV0ZCBzZXJ2aWNlLlxuIgorLy91c2FnZTogICAgICAgImZ0cGQncyBsaW5lIGZvciBpbmV0ZC5jb25mOlxuIgorLy91c2FnZTogICAgICAgIgkyMSBzdHJlYW0gdGNwIG5vd2FpdCByb290IGZ0cGQgZnRwZCAvZmlsZXMvdG8vc2VydmVcbiIKKy8vdXNhZ2U6ICAgICAgICJJdCBhbHNvIGNhbiBiZSByYW4gZnJvbSB0Y3BzdmQ6XG4iCisvL3VzYWdlOiAgICAgICAiCXRjcHN2ZCAtdkUgMC4wLjAuMCAyMSBmdHBkIC9maWxlcy90by9zZXJ2ZVxuIgorLy91c2FnZTogICAgICJcbgktdwlBbGxvdyB1cGxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS12CUxvZyBlcnJvcnMgdG8gc3RkZXJyLiAtdnY6IHZlcmJvc2UgbG9nIgorLy91c2FnZTogICAgICJcbgktUwlMb2cgZXJyb3JzIHRvIHN5c2xvZy4gLVNTOiB2ZXJib3NlIGxvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLVQJSWRsZSBhbmQgYWJzb2x1dGUgdGltZW91dHMiCisvL3VzYWdlOiAgICAgIlxuCURJUglDaGFuZ2Ugcm9vdCB0byB0aGlzIGRpcmVjdG9yeSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKworI2RlZmluZSBGVFBfREFUQUNPTk4gICAgICAgICAgICAxNTAKKyNkZWZpbmUgRlRQX05PT1BPSyAgICAgICAgICAgICAgMjAwCisjZGVmaW5lIEZUUF9UWVBFT0sgICAgICAgICAgICAgIDIwMAorI2RlZmluZSBGVFBfUE9SVE9LICAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgRlRQX1NUUlVPSyAgICAgICAgICAgICAgMjAwCisjZGVmaW5lIEZUUF9NT0RFT0sgICAgICAgICAgICAgIDIwMAorI2RlZmluZSBGVFBfQUxMT09LICAgICAgICAgICAgICAyMDIKKyNkZWZpbmUgRlRQX1NUQVRPSyAgICAgICAgICAgICAgMjExCisjZGVmaW5lIEZUUF9TVEFURklMRV9PSyAgICAgICAgIDIxMworI2RlZmluZSBGVFBfSEVMUCAgICAgICAgICAgICAgICAyMTQKKyNkZWZpbmUgRlRQX1NZU1RPSyAgICAgICAgICAgICAgMjE1CisjZGVmaW5lIEZUUF9HUkVFVCAgICAgICAgICAgICAgIDIyMAorI2RlZmluZSBGVFBfR09PREJZRSAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgRlRQX1RSQU5TRkVST0sgICAgICAgICAgMjI2CisjZGVmaW5lIEZUUF9QQVNWT0sgICAgICAgICAgICAgIDIyNworLyojZGVmaW5lIEZUUF9FUFJUT0sgICAgICAgICAgICAgIDIyOCovCisjZGVmaW5lIEZUUF9FUFNWT0sgICAgICAgICAgICAgIDIyOQorI2RlZmluZSBGVFBfTE9HSU5PSyAgICAgICAgICAgICAyMzAKKyNkZWZpbmUgRlRQX0NXRE9LICAgICAgICAgICAgICAgMjUwCisjZGVmaW5lIEZUUF9STURJUk9LICAgICAgICAgICAgIDI1MAorI2RlZmluZSBGVFBfREVMRU9LICAgICAgICAgICAgICAyNTAKKyNkZWZpbmUgRlRQX1JFTkFNRU9LICAgICAgICAgICAgMjUwCisjZGVmaW5lIEZUUF9QV0RPSyAgICAgICAgICAgICAgIDI1NworI2RlZmluZSBGVFBfTUtESVJPSyAgICAgICAgICAgICAyNTcKKyNkZWZpbmUgRlRQX0dJVkVQV09SRCAgICAgICAgICAgMzMxCisjZGVmaW5lIEZUUF9SRVNUT0sgICAgICAgICAgICAgIDM1MAorI2RlZmluZSBGVFBfUk5GUk9LICAgICAgICAgICAgICAzNTAKKyNkZWZpbmUgRlRQX1RJTUVPVVQgICAgICAgICAgICAgNDIxCisjZGVmaW5lIEZUUF9CQURTRU5EQ09OTiAgICAgICAgIDQyNQorI2RlZmluZSBGVFBfQkFEU0VORE5FVCAgICAgICAgICA0MjYKKyNkZWZpbmUgRlRQX0JBRFNFTkRGSUxFICAgICAgICAgNDUxCisjZGVmaW5lIEZUUF9CQURDTUQgICAgICAgICAgICAgIDUwMAorI2RlZmluZSBGVFBfQ09NTUFORE5PVElNUEwgICAgICA1MDIKKyNkZWZpbmUgRlRQX05FRURVU0VSICAgICAgICAgICAgNTAzCisjZGVmaW5lIEZUUF9ORUVEUk5GUiAgICAgICAgICAgIDUwMworI2RlZmluZSBGVFBfQkFEU1RSVSAgICAgICAgICAgICA1MDQKKyNkZWZpbmUgRlRQX0JBRE1PREUgICAgICAgICAgICAgNTA0CisjZGVmaW5lIEZUUF9MT0dJTkVSUiAgICAgICAgICAgIDUzMAorI2RlZmluZSBGVFBfRklMRUZBSUwgICAgICAgICAgICA1NTAKKyNkZWZpbmUgRlRQX05PUEVSTSAgICAgICAgICAgICAgNTUwCisjZGVmaW5lIEZUUF9VUExPQURGQUlMICAgICAgICAgIDU1MworCisjZGVmaW5lIFNUUjEocykgI3MKKyNkZWZpbmUgU1RSKHMpIFNUUjEocykKKworLyogQ29udmVydCBhIGNvbnN0YW50IHRvIDMtZGlnaXQgc3RyaW5nLCBwYWNrZWQgaW50byB1aW50MzJfdCAqLworZW51bSB7CisJLyogU2hpZnQgZm9yIE50aCBkZWNpbWFsIGRpZ2l0ICovCisJU0hJRlQyICA9ICAwICogQkJfTElUVExFX0VORElBTiArIDI0ICogQkJfQklHX0VORElBTiwKKwlTSElGVDEgID0gIDggKiBCQl9MSVRUTEVfRU5ESUFOICsgMTYgKiBCQl9CSUdfRU5ESUFOLAorCVNISUZUMCAgPSAxNiAqIEJCX0xJVFRMRV9FTkRJQU4gKyA4ICogQkJfQklHX0VORElBTiwKKwkvKiBBbmQgZm9yIDR0aCBwb3NpdGlvbiAoc3BhY2UpICovCisJU0hJRlRzcCA9IDI0ICogQkJfTElUVExFX0VORElBTiArIDAgKiBCQl9CSUdfRU5ESUFOLAorfTsKKyNkZWZpbmUgU1RSTlVNMzIocykgKHVpbnQzMl90KSgwIFwKKwl8ICgoJzAnICsgKChzKSAvIDEgJSAxMCkpIDw8IFNISUZUMCkgXAorCXwgKCgnMCcgKyAoKHMpIC8gMTAgJSAxMCkpIDw8IFNISUZUMSkgXAorCXwgKCgnMCcgKyAoKHMpIC8gMTAwICUgMTApKSA8PCBTSElGVDIpIFwKKykKKyNkZWZpbmUgU1RSTlVNMzJzcChzKSAodWludDMyX3QpKDAgXAorCXwgKCcgJyA8PCBTSElGVHNwKSBcCisJfCAoKCcwJyArICgocykgLyAxICUgMTApKSA8PCBTSElGVDApIFwKKwl8ICgoJzAnICsgKChzKSAvIDEwICUgMTApKSA8PCBTSElGVDEpIFwKKwl8ICgoJzAnICsgKChzKSAvIDEwMCAlIDEwKSkgPDwgU0hJRlQyKSBcCispCisKKyNkZWZpbmUgTVNHX09LICJPcGVyYXRpb24gc3VjY2Vzc2Z1bFxyXG4iCisjZGVmaW5lIE1TR19FUlIgIkVycm9yXHJcbiIKKworc3RydWN0IGdsb2JhbHMgeworCWludCBwYXN2X2xpc3Rlbl9mZDsKKyNpZiAhQkJfTU1VCisJaW50IHJvb3RfZmQ7CisjZW5kaWYKKwlpbnQgbG9jYWxfZmlsZV9mZDsKKwl1bnNpZ25lZCBlbmRfdGltZTsKKwl1bnNpZ25lZCB0aW1lb3V0OworCXVuc2lnbmVkIHZlcmJvc2U7CisJb2ZmX3QgbG9jYWxfZmlsZV9wb3M7CisJb2ZmX3QgcmVzdGFydF9wb3M7CisJbGVuX2FuZF9zb2NrYWRkciAqbG9jYWxfYWRkcjsKKwlsZW5fYW5kX3NvY2thZGRyICpwb3J0X2FkZHI7CisJY2hhciAqZnRwX2NtZDsKKwljaGFyICpmdHBfYXJnOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURQorCWNoYXIgKnJuZnJfZmlsZW5hbWU7CisjZW5kaWYKKwkvKiBXZSBuZWVkIHRoZXNlIGFsaWduZWQgdG8gdWludDMyX3QgKi8KKwljaGFyIG1zZ19vayBbKHNpemVvZigiTk5OICIgTVNHX09LICkgKyAzKSAmIDB4ZmZmY107CisJY2hhciBtc2dfZXJyWyhzaXplb2YoIk5OTiAiIE1TR19FUlIpICsgMykgJiAweGZmZmNdOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJLyogTW92ZWQgdG8gbWFpbiAqLyBcCisJLypzdHJjcHkoRy5tc2dfb2sgICsgNCwgTVNHX09LICk7Ki8gXAorCS8qc3RyY3B5KEcubXNnX2VyciArIDQsIE1TR19FUlIpOyovIFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGNoYXIgKgorZXNjYXBlX3RleHQoY29uc3QgY2hhciAqcHJlcGVuZCwgY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBlc2NhcGVlKQoreworCXVuc2lnbmVkIHJldGxlbiwgcmVtYWlubGVuLCBjaHVua2xlbjsKKwljaGFyICpyZXQsICpmb3VuZDsKKwljaGFyIGFwcGVuZDsKKworCWFwcGVuZCA9IChjaGFyKWVzY2FwZWU7CisJZXNjYXBlZSA+Pj0gODsKKworCXJlbWFpbmxlbiA9IHN0cmxlbihzdHIpOworCXJldGxlbiA9IHN0cmxlbihwcmVwZW5kKTsKKwlyZXQgPSB4bWFsbG9jKHJldGxlbiArIHJlbWFpbmxlbiAqIDIgKyAxICsgMSk7CisJc3RyY3B5KHJldCwgcHJlcGVuZCk7CisKKwlmb3IgKDs7KSB7CisJCWZvdW5kID0gc3RyY2hybnVsKHN0ciwgZXNjYXBlZSk7CisJCWNodW5rbGVuID0gZm91bmQgLSBzdHIgKyAxOworCisJCS8qIENvcHkgY2h1bmsgdXAgdG8gYW5kIGluY2x1ZGluZyBlc2NhcGVlIChvciBOVUwpIHRvIHJldCAqLworCQltZW1jcHkocmV0ICsgcmV0bGVuLCBzdHIsIGNodW5rbGVuKTsKKwkJcmV0bGVuICs9IGNodW5rbGVuOworCisJCWlmICgqZm91bmQgPT0gJ1wwJykgeworCQkJLyogSXQgd2Fzbid0IGVzY2FwZWUsIGl0IHdhcyBOVUwhICovCisJCQlyZXRbcmV0bGVuIC0gMV0gPSBhcHBlbmQ7IC8qIHJlcGxhY2UgTlVMICovCisJCQlyZXRbcmV0bGVuXSA9ICdcMCc7IC8qIGFkZCBOVUwgKi8KKwkJCWJyZWFrOworCQl9CisJCXJldFtyZXRsZW4rK10gPSBlc2NhcGVlOyAvKiBkdXBsaWNhdGUgZXNjYXBlZSAqLworCQlzdHIgPSBmb3VuZCArIDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIFJldHVybnMgc3RybGVuIGFzIGEgYm9udXMgKi8KK3N0YXRpYyB1bnNpZ25lZAorcmVwbGFjZV9jaGFyKGNoYXIgKnN0ciwgY2hhciBmcm9tLCBjaGFyIHRvKQoreworCWNoYXIgKnAgPSBzdHI7CisJd2hpbGUgKCpwKSB7CisJCWlmICgqcCA9PSBmcm9tKQorCQkJKnAgPSB0bzsKKwkJcCsrOworCX0KKwlyZXR1cm4gcCAtIHN0cjsKK30KKworc3RhdGljIHZvaWQKK3ZlcmJvc2VfbG9nKGNvbnN0IGNoYXIgKnN0cikKK3sKKwliYl9lcnJvcl9tc2coIiUuKnMiLCAoaW50KXN0cmNzcG4oc3RyLCAiXHJcbiIpLCBzdHIpOworfQorCisvKiBOQjogc3RhdHVzX3N0ciBpcyBjaGFyWzRdIHBhY2tlZCBpbnRvIHVpbnQzMl90ICovCitzdGF0aWMgdm9pZAorY21kaW9fd3JpdGUodWludDMyX3Qgc3RhdHVzX3N0ciwgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnJlc3BvbnNlOworCWludCBsZW47CisKKwkvKiBGVFAgdXNlcyB0ZWxuZXQgcHJvdG9jb2wgZm9yIGNvbW1hbmQgbGluay4KKwkgKiBJbiB0ZWxuZXQsIDB4ZmYgaXMgYW4gZXNjYXBlIGNoYXIsIGFuZCBuZWVkcyB0byBiZSBlc2NhcGVkOiAqLworCXJlc3BvbnNlID0gZXNjYXBlX3RleHQoKGNoYXIgKikgJnN0YXR1c19zdHIsIHN0ciwgKDB4ZmYgPDwgOCkgKyAnXHInKTsKKworCS8qIEZUUCBzZW5kcyBlbWJlZGRlZCBMRnMgYXMgTlVMcyAqLworCWxlbiA9IHJlcGxhY2VfY2hhcihyZXNwb25zZSwgJ1xuJywgJ1wwJyk7CisKKwlyZXNwb25zZVtsZW4rK10gPSAnXG4nOyAvKiB0YWNrIG9uIHRyYWlsaW5nICdcbicgKi8KKwl4d3JpdGUoU1RET1VUX0ZJTEVOTywgcmVzcG9uc2UsIGxlbik7CisJaWYgKEcudmVyYm9zZSA+IDEpCisJCXZlcmJvc2VfbG9nKHJlc3BvbnNlKTsKKwlmcmVlKHJlc3BvbnNlKTsKK30KKworc3RhdGljIHZvaWQKK2NtZGlvX3dyaXRlX29rKHVuc2lnbmVkIHN0YXR1cykKK3sKKwkqKHVpbnQzMl90ICopIEcubXNnX29rID0gc3RhdHVzOworCXh3cml0ZShTVERPVVRfRklMRU5PLCBHLm1zZ19vaywgc2l6ZW9mKCJOTk4gIiBNU0dfT0spIC0gMSk7CisJaWYgKEcudmVyYm9zZSA+IDEpCisJCXZlcmJvc2VfbG9nKEcubXNnX29rKTsKK30KKyNkZWZpbmUgV1JJVEVfT0soYSkgY21kaW9fd3JpdGVfb2soU1RSTlVNMzJzcChhKSkKKworLyogVE9ETzogb3V0cHV0IHN0cmVycihlcnJubykgaWYgZXJybm8gIT0gMD8gKi8KK3N0YXRpYyB2b2lkCitjbWRpb193cml0ZV9lcnJvcih1bnNpZ25lZCBzdGF0dXMpCit7CisJKih1aW50MzJfdCAqKSBHLm1zZ19lcnIgPSBzdGF0dXM7CisJeHdyaXRlKFNURE9VVF9GSUxFTk8sIEcubXNnX2Vyciwgc2l6ZW9mKCJOTk4gIiBNU0dfRVJSKSAtIDEpOworCWlmIChHLnZlcmJvc2UgPiAwKQorCQl2ZXJib3NlX2xvZyhHLm1zZ19lcnIpOworfQorI2RlZmluZSBXUklURV9FUlIoYSkgY21kaW9fd3JpdGVfZXJyb3IoU1RSTlVNMzJzcChhKSkKKworc3RhdGljIHZvaWQKK2NtZGlvX3dyaXRlX3Jhdyhjb25zdCBjaGFyICpwX3RleHQpCit7CisJeHdyaXRlX3N0cihTVERPVVRfRklMRU5PLCBwX3RleHQpOworCWlmIChHLnZlcmJvc2UgPiAxKQorCQl2ZXJib3NlX2xvZyhwX3RleHQpOworfQorCitzdGF0aWMgdm9pZAordGltZW91dF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCW9mZl90IHBvczsKKwlpbnQgc3ZfZXJybm8gPSBlcnJubzsKKworCWlmICgoaW50KShtb25vdG9uaWNfc2VjKCkgLSBHLmVuZF90aW1lKSA+PSAwKQorCQlnb3RvIHRpbWVkX291dDsKKworCWlmICghRy5sb2NhbF9maWxlX2ZkKQorCQlnb3RvIHRpbWVkX291dDsKKworCXBvcyA9IHhsc2VlayhHLmxvY2FsX2ZpbGVfZmQsIDAsIFNFRUtfQ1VSKTsKKwlpZiAocG9zID09IEcubG9jYWxfZmlsZV9wb3MpCisJCWdvdG8gdGltZWRfb3V0OworCUcubG9jYWxfZmlsZV9wb3MgPSBwb3M7CisKKwlhbGFybShHLnRpbWVvdXQpOworCWVycm5vID0gc3ZfZXJybm87CisJcmV0dXJuOworCisgdGltZWRfb3V0OgorCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX1RJTUVPVVQpIiBUaW1lb3V0XHJcbiIpOworLyogVE9ETzogZG8gd2UgbmVlZCB0byBhYm9ydCAoYXMgb3Bwb3NlZCB0byB1c3VhbCBzaHV0ZG93bikgZGF0YSB0cmFuc2Zlcj8gKi8KKwlleGl0KDEpOworfQorCisvKiBTaW1wbGUgY29tbWFuZHMgKi8KKworc3RhdGljIHZvaWQKK2hhbmRsZV9wd2Qodm9pZCkKK3sKKwljaGFyICpjd2QsICpyZXNwb25zZTsKKworCWN3ZCA9IHhyZWFsbG9jX2dldGN3ZF9vcl93YXJuKE5VTEwpOworCWlmIChjd2QgPT0gTlVMTCkKKwkJY3dkID0geHN0cmR1cCgiIik7CisKKwkvKiBXZSBoYXZlIHRvIHByb21vdGUgZWFjaCAiIHRvICIiICovCisJcmVzcG9uc2UgPSBlc2NhcGVfdGV4dCgiIFwiIiwgY3dkLCAoJyInIDw8IDgpICsgJyInKTsKKwlmcmVlKGN3ZCk7CisJY21kaW9fd3JpdGUoU1RSTlVNMzIoRlRQX1BXRE9LKSwgcmVzcG9uc2UpOworCWZyZWUocmVzcG9uc2UpOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2N3ZCh2b2lkKQoreworCWlmICghRy5mdHBfYXJnIHx8IGNoZGlyKEcuZnRwX2FyZykgIT0gMCkgeworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9PSyhGVFBfQ1dET0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2NkdXAodm9pZCkKK3sKKwlHLmZ0cF9hcmcgPSAoY2hhciopIi4uIjsKKwloYW5kbGVfY3dkKCk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc3RhdCh2b2lkKQoreworCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX1NUQVRPSykiLVNlcnZlciBzdGF0dXM6XHJcbiIKKwkJCSIgVFlQRTogQklOQVJZXHJcbiIKKwkJCVNUUihGVFBfU1RBVE9LKSIgT2tcclxuIik7Cit9CisKKy8qIEV4YW1wbGVzIG9mIEhFTFAgYW5kIEZFQVQ6CisjIG5jIC12dnYgZnRwLmtlcm5lbC5vcmcgMjEKK2Z0cC5rZXJuZWwub3JnICgxMzAuMjM5LjE3LjQ6MjEpIG9wZW4KKzIyMCBXZWxjb21lIHRvIGZ0cC5rZXJuZWwub3JnLgorRkVBVAorMjExLUZlYXR1cmVzOgorIEVQUlQKKyBFUFNWCisgTURUTQorIFBBU1YKKyBSRVNUIFNUUkVBTQorIFNJWkUKKyBUVkZTCisgVVRGOAorMjExIEVuZAorSEVMUAorMjE0LVRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIHJlY29nbml6ZWQuCisgQUJPUiBBQ0NUIEFMTE8gQVBQRSBDRFVQIENXRCAgREVMRSBFUFJUIEVQU1YgRkVBVCBIRUxQIExJU1QgTURUTSBNS0QKKyBNT0RFIE5MU1QgTk9PUCBPUFRTIFBBU1MgUEFTViBQT1JUIFBXRCAgUVVJVCBSRUlOIFJFU1QgUkVUUiBSTUQgIFJORlIKKyBSTlRPIFNJVEUgU0laRSBTTU5UIFNUQVQgU1RPUiBTVE9VIFNUUlUgU1lTVCBUWVBFIFVTRVIgWENVUCBYQ1dEIFhNS0QKKyBYUFdEIFhSTUQKKzIxNCBIZWxwIE9LLgorKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfZmVhdCh1bnNpZ25lZCBzdGF0dXMpCit7CisJY21kaW9fd3JpdGUoc3RhdHVzLCAiLUZlYXR1cmVzOiIpOworCWNtZGlvX3dyaXRlX3JhdygiIEVQU1ZcclxuIgorCQkJIiBQQVNWXHJcbiIKKwkJCSIgUkVTVCBTVFJFQU1cclxuIgorCQkJIiBNRFRNXHJcbiIKKwkJCSIgU0laRVxyXG4iKTsKKwljbWRpb193cml0ZShzdGF0dXMsICIgT2siKTsKK30KKworLyogRG93bmxvYWQgY29tbWFuZHMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3BvcnRfYWN0aXZlKHZvaWQpCit7CisJcmV0dXJuIChHLnBvcnRfYWRkciAhPSBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3Bhc3ZfYWN0aXZlKHZvaWQpCit7CisJcmV0dXJuIChHLnBhc3ZfbGlzdGVuX2ZkID4gU1RET1VUX0ZJTEVOTyk7Cit9CisKK3N0YXRpYyB2b2lkCitwb3J0X3Bhc3ZfY2xlYW51cCh2b2lkKQoreworCWZyZWUoRy5wb3J0X2FkZHIpOworCUcucG9ydF9hZGRyID0gTlVMTDsKKwlpZiAoRy5wYXN2X2xpc3Rlbl9mZCA+IFNURE9VVF9GSUxFTk8pCisJCWNsb3NlKEcucGFzdl9saXN0ZW5fZmQpOworCUcucGFzdl9saXN0ZW5fZmQgPSAtMTsKK30KKworLyogT24gZXJyb3IsIGVtaXRzIGVycm9yIGNvZGUgdG8gdGhlIHBlZXIgKi8KK3N0YXRpYyBpbnQKK2Z0cGRhdGFpb19nZXRfcGFzdl9mZCh2b2lkKQoreworCWludCByZW1vdGVfZmQ7CisKKwlyZW1vdGVfZmQgPSBhY2NlcHQoRy5wYXN2X2xpc3Rlbl9mZCwgTlVMTCwgMCk7CisKKwlpZiAocmVtb3RlX2ZkIDwgMCkgeworCQlXUklURV9FUlIoRlRQX0JBRFNFTkRDT05OKTsKKwkJcmV0dXJuIHJlbW90ZV9mZDsKKwl9CisKKwlzZXRzb2Nrb3B0KHJlbW90ZV9mZCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworCXJldHVybiByZW1vdGVfZmQ7Cit9CisKKy8qIENsZWFycyBwb3J0L3Bhc3YgZGF0YS4KKyAqIFRoaXMgbWVhbnMgd2UgZG9udCB3YXN0ZSByZXNvdXJjZXMsIGZvciBleGFtcGxlLCBrZWVwaW5nCisgKiBQQVNWIGxpc3RlbmluZyBzb2NrZXQgb3BlbiB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgKiBPbiBlcnJvciwgZW1pdHMgZXJyb3IgY29kZSB0byB0aGUgcGVlciAob3IgZXhpdHMpLgorICogT24gc3VjY2VzcywgZW1pdHMgcF9zdGF0dXNfbXNnIHRvIHRoZSBwZWVyLgorICovCitzdGF0aWMgaW50CitnZXRfcmVtb3RlX3RyYW5zZmVyX2ZkKGNvbnN0IGNoYXIgKnBfc3RhdHVzX21zZykKK3sKKwlpbnQgcmVtb3RlX2ZkOworCisJaWYgKHBhc3ZfYWN0aXZlKCkpCisJCS8qIE9uIGVycm9yLCBlbWl0cyBlcnJvciBjb2RlIHRvIHRoZSBwZWVyICovCisJCXJlbW90ZV9mZCA9IGZ0cGRhdGFpb19nZXRfcGFzdl9mZCgpOworCWVsc2UKKwkJLyogRXhpdHMgb24gZXJyb3IgKi8KKwkJcmVtb3RlX2ZkID0geGNvbm5lY3Rfc3RyZWFtKEcucG9ydF9hZGRyKTsKKworCXBvcnRfcGFzdl9jbGVhbnVwKCk7CisKKwlpZiAocmVtb3RlX2ZkIDwgMCkKKwkJcmV0dXJuIHJlbW90ZV9mZDsKKworCWNtZGlvX3dyaXRlKFNUUk5VTTMyKEZUUF9EQVRBQ09OTiksIHBfc3RhdHVzX21zZyk7CisJcmV0dXJuIHJlbW90ZV9mZDsKK30KKworLyogSWYgdGhlcmUgd2VyZSBuZWl0aGVyIFBBU1Ygbm9yIFBPUlQsIGVtaXRzIGVycm9yIGNvZGUgdG8gdGhlIHBlZXIgKi8KK3N0YXRpYyBpbnQKK3BvcnRfb3JfcGFzdl93YXNfc2Vlbih2b2lkKQoreworCWlmICghcGFzdl9hY3RpdmUoKSAmJiAhcG9ydF9hY3RpdmUoKSkgeworCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9CQURTRU5EQ09OTikiIFVzZSBQT1JUL1BBU1YgZmlyc3RcclxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHVuc2lnbmVkCitiaW5kX2Zvcl9wYXNzaXZlX21vZGUodm9pZCkKK3sKKwlpbnQgZmQ7CisJdW5zaWduZWQgcG9ydDsKKworCXBvcnRfcGFzdl9jbGVhbnVwKCk7CisKKwlHLnBhc3ZfbGlzdGVuX2ZkID0gZmQgPSB4c29ja2V0KEcubG9jYWxfYWRkci0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKKwlzZXRzb2Nrb3B0X3JldXNlYWRkcihmZCk7CisKKwlzZXRfbnBvcnQoJkcubG9jYWxfYWRkci0+dS5zYSwgMCk7CisJeGJpbmQoZmQsICZHLmxvY2FsX2FkZHItPnUuc2EsIEcubG9jYWxfYWRkci0+bGVuKTsKKwl4bGlzdGVuKGZkLCAxKTsKKwlnZXRzb2NrbmFtZShmZCwgJkcubG9jYWxfYWRkci0+dS5zYSwgJkcubG9jYWxfYWRkci0+bGVuKTsKKworCXBvcnQgPSBnZXRfbnBvcnQoJkcubG9jYWxfYWRkci0+dS5zYSk7CisJcG9ydCA9IG50b2hzKHBvcnQpOworCXJldHVybiBwb3J0OworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9wYXN2KHZvaWQpCit7CisJdW5zaWduZWQgcG9ydDsKKwljaGFyICphZGRyLCAqcmVzcG9uc2U7CisKKwlwb3J0ID0gYmluZF9mb3JfcGFzc2l2ZV9tb2RlKCk7CisKKwlpZiAoRy5sb2NhbF9hZGRyLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlhZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZHLmxvY2FsX2FkZHItPnUuc2EpOworCWVsc2UgLyogc2VlbiB0aGlzIGluIHRoZSB3aWxkIGRvbmUgYnkgb3RoZXIgZnRwIHNlcnZlcnM6ICovCisJCWFkZHIgPSB4c3RyZHVwKCIwLjAuMC4wIik7CisJcmVwbGFjZV9jaGFyKGFkZHIsICcuJywgJywnKTsKKworCXJlc3BvbnNlID0geGFzcHJpbnRmKFNUUihGVFBfUEFTVk9LKSIgUEFTViBvayAoJXMsJXUsJXUpXHJcbiIsCisJCQlhZGRyLCAoaW50KShwb3J0ID4+IDgpLCAoaW50KShwb3J0ICYgMjU1KSk7CisJZnJlZShhZGRyKTsKKwljbWRpb193cml0ZV9yYXcocmVzcG9uc2UpOworCWZyZWUocmVzcG9uc2UpOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9lcHN2KHZvaWQpCit7CisJdW5zaWduZWQgcG9ydDsKKwljaGFyICpyZXNwb25zZTsKKworCXBvcnQgPSBiaW5kX2Zvcl9wYXNzaXZlX21vZGUoKTsKKwlyZXNwb25zZSA9IHhhc3ByaW50ZihTVFIoRlRQX0VQU1ZPSykiIEVQU1Ygb2sgKHx8fCV1fClcclxuIiwgcG9ydCk7CisJY21kaW9fd3JpdGVfcmF3KHJlc3BvbnNlKTsKKwlmcmVlKHJlc3BvbnNlKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9wb3J0KHZvaWQpCit7CisJdW5zaWduZWQgcG9ydCwgcG9ydF9oaTsKKwljaGFyICpyYXcsICpjb21tYTsKKyNpZmRlZiBXSFlfQk9USEVSX1dFX0NBTl9BU1NVTUVfSVBfTUFUQ0hFUworCXNvY2tsZW5fdCBwZWVyX2lwdjRfbGVuOworCXN0cnVjdCBzb2NrYWRkcl9pbiBwZWVyX2lwdjQ7CisJc3RydWN0IGluX2FkZHIgcG9ydF9pcHY0X3Npbl9hZGRyOworI2VuZGlmCisKKwlwb3J0X3Bhc3ZfY2xlYW51cCgpOworCisJcmF3ID0gRy5mdHBfYXJnOworCisJLyogUE9SVCBjb21tYW5kIGZvcm1hdCBtYWtlcyBzZW5zZSBvbmx5IG92ZXIgSVB2NCAqLworCWlmICghcmF3CisjaWZkZWYgV0hZX0JPVEhFUl9XRV9DQU5fQVNTVU1FX0lQX01BVENIRVMKKwkgfHwgRy5sb2NhbF9hZGRyLT51LnNhLnNhX2ZhbWlseSAhPSBBRl9JTkVUCisjZW5kaWYKKwkpIHsKKyBiYWlsOgorCQlXUklURV9FUlIoRlRQX0JBRENNRCk7CisJCXJldHVybjsKKwl9CisKKwljb21tYSA9IHN0cnJjaHIocmF3LCAnLCcpOworCWlmIChjb21tYSA9PSBOVUxMKQorCQlnb3RvIGJhaWw7CisJKmNvbW1hID0gJ1wwJzsKKwlwb3J0ID0gYmJfc3RydG91KCZjb21tYVsxXSwgTlVMTCwgMTApOworCWlmIChlcnJubyB8fCBwb3J0ID4gMHhmZikKKwkJZ290byBiYWlsOworCisJY29tbWEgPSBzdHJyY2hyKHJhdywgJywnKTsKKwlpZiAoY29tbWEgPT0gTlVMTCkKKwkJZ290byBiYWlsOworCSpjb21tYSA9ICdcMCc7CisJcG9ydF9oaSA9IGJiX3N0cnRvdSgmY29tbWFbMV0sIE5VTEwsIDEwKTsKKwlpZiAoZXJybm8gfHwgcG9ydF9oaSA+IDB4ZmYpCisJCWdvdG8gYmFpbDsKKwlwb3J0IHw9IHBvcnRfaGkgPDwgODsKKworI2lmZGVmIFdIWV9CT1RIRVJfV0VfQ0FOX0FTU1VNRV9JUF9NQVRDSEVTCisJcmVwbGFjZV9jaGFyKHJhdywgJywnLCAnLicpOworCisJLyogV2UgYXJlIHZlcmlmeWluZyB0aGF0IFBPUlQncyBJUCBtYXRjaGVzIGdldHBlZXJuYW1lKCkuCisJICogT3RoZXJ3aXNlIHBlZXIgY2FuIG1ha2UgdXMgb3BlbiBkYXRhIGNvbm5lY3Rpb25zCisJICogdG8gb3RoZXIgaG9zdHMgKHNlY3VyaXR5IHByb2JsZW0hKQorCSAqIFRoaXMgY29kZSB3b3VsZCBiZSB0b28gc2ltcGxpc3RpYzoKKwkgKiBsc2EgPSB4ZG90dGVkMnNvY2thZGRyKHJhdywgcG9ydCk7CisJICogaWYgKGxzYSA9PSBOVUxMKSBnb3RvIGJhaWw7CisJICovCisJaWYgKCFpbmV0X2F0b24ocmF3LCAmcG9ydF9pcHY0X3Npbl9hZGRyKSkKKwkJZ290byBiYWlsOworCXBlZXJfaXB2NF9sZW4gPSBzaXplb2YocGVlcl9pcHY0KTsKKwlpZiAoZ2V0cGVlcm5hbWUoU1RESU5fRklMRU5PLCAmcGVlcl9pcHY0LCAmcGVlcl9pcHY0X2xlbikgIT0gMCkKKwkJZ290byBiYWlsOworCWlmIChtZW1jbXAoJnBvcnRfaXB2NF9zaW5fYWRkciwgJnBlZXJfaXB2NC5zaW5fYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgIT0gMCkKKwkJZ290byBiYWlsOworCisJRy5wb3J0X2FkZHIgPSB4ZG90dGVkMnNvY2thZGRyKHJhdywgcG9ydCk7CisjZWxzZQorCUcucG9ydF9hZGRyID0gZ2V0X3BlZXJfbHNhKFNURElOX0ZJTEVOTyk7CisJc2V0X25wb3J0KCZHLnBvcnRfYWRkci0+dS5zYSwgaHRvbnMocG9ydCkpOworI2VuZGlmCisJV1JJVEVfT0soRlRQX1BPUlRPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcmVzdCh2b2lkKQoreworCS8qIFdoZW4gZnRwX2FyZyA9PSBOVUxMIHNpbXBseSByZXN0YXJ0IGZyb20gYmVnaW5uaW5nICovCisJRy5yZXN0YXJ0X3BvcyA9IEcuZnRwX2FyZyA/IHhhdG9pX3Bvc2l0aXZlKEcuZnRwX2FyZykgOiAwOworCVdSSVRFX09LKEZUUF9SRVNUT0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3JldHIodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCW9mZl90IGJ5dGVzX3RyYW5zZmVycmVkOworCWludCByZW1vdGVfZmQ7CisJaW50IGxvY2FsX2ZpbGVfZmQ7CisJb2ZmX3Qgb2Zmc2V0ID0gRy5yZXN0YXJ0X3BvczsKKwljaGFyICpyZXNwb25zZTsKKworCUcucmVzdGFydF9wb3MgPSAwOworCisJaWYgKCFwb3J0X29yX3Bhc3Zfd2FzX3NlZW4oKSkKKwkJcmV0dXJuOyAvKiBwb3J0X29yX3Bhc3Zfd2FzX3NlZW4gZW1pdHRlZCBlcnJvciByZXNwb25zZSAqLworCisJLyogT19OT05CTE9DSyBpcyB1c2VmdWwgaWYgZmlsZSBoYXBwZW5zIHRvIGJlIGEgZGV2aWNlIG5vZGUgKi8KKwlsb2NhbF9maWxlX2ZkID0gRy5mdHBfYXJnID8gb3BlbihHLmZ0cF9hcmcsIE9fUkRPTkxZIHwgT19OT05CTE9DSykgOiAtMTsKKwlpZiAobG9jYWxfZmlsZV9mZCA8IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZnN0YXQobG9jYWxfZmlsZV9mZCwgJnN0YXRidWYpICE9IDAgfHwgIVNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkvKiBOb3RlIC0gcHJldGVuZCBvcGVuIGZhaWxlZCAqLworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJZ290byBmaWxlX2Nsb3NlX291dDsKKwl9CisJRy5sb2NhbF9maWxlX2ZkID0gbG9jYWxfZmlsZV9mZDsKKworCS8qIE5vdyBkZWFjdGl2ZSBPX05PTkJMT0NLLCBvdGhlcndpc2Ugd2UgaGF2ZSBhIHByb2JsZW0KKwkgKiBvbiBETUFQSSBmaWxlc3lzdGVtcyBzdWNoIGFzIFhGUyBETUFQSS4KKwkgKi8KKwluZGVsYXlfb2ZmKGxvY2FsX2ZpbGVfZmQpOworCisJLyogU2V0IHRoZSBkb3dubG9hZCBvZmZzZXQgKGZyb20gUkVTVCkgaWYgYW55ICovCisJaWYgKG9mZnNldCAhPSAwKQorCQl4bHNlZWsobG9jYWxfZmlsZV9mZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKwlyZXNwb25zZSA9IHhhc3ByaW50ZigKKwkJIiBPcGVuaW5nIEJJTkFSWSBjb25uZWN0aW9uIGZvciAlcyAoJSJPRkZfRk1UInUgYnl0ZXMpIiwKKwkJRy5mdHBfYXJnLCBzdGF0YnVmLnN0X3NpemUpOworCXJlbW90ZV9mZCA9IGdldF9yZW1vdGVfdHJhbnNmZXJfZmQocmVzcG9uc2UpOworCWZyZWUocmVzcG9uc2UpOworCWlmIChyZW1vdGVfZmQgPCAwKQorCQlnb3RvIGZpbGVfY2xvc2Vfb3V0OworCisJYnl0ZXNfdHJhbnNmZXJyZWQgPSBiYl9jb3B5ZmRfZW9mKGxvY2FsX2ZpbGVfZmQsIHJlbW90ZV9mZCk7CisJY2xvc2UocmVtb3RlX2ZkKTsKKwlpZiAoYnl0ZXNfdHJhbnNmZXJyZWQgPCAwKQorCQlXUklURV9FUlIoRlRQX0JBRFNFTkRGSUxFKTsKKwllbHNlCisJCVdSSVRFX09LKEZUUF9UUkFOU0ZFUk9LKTsKKworIGZpbGVfY2xvc2Vfb3V0OgorCWNsb3NlKGxvY2FsX2ZpbGVfZmQpOworCUcubG9jYWxfZmlsZV9mZCA9IDA7Cit9CisKKy8qIExpc3QgY29tbWFuZHMgKi8KKworc3RhdGljIGludAorcG9wZW5fbHMoY29uc3QgY2hhciAqb3B0KQoreworCWNvbnN0IGNoYXIgKmFyZ3ZbNV07CisJc3RydWN0IGZkX3BhaXIgb3V0ZmQ7CisJcGlkX3QgcGlkOworCisJYXJndlswXSA9ICJmdHBkIjsKKwlhcmd2WzFdID0gb3B0OyAvKiAiLWwiIG9yICItMSIgKi8KKyNpZiBCQl9NTVUKKwlhcmd2WzJdID0gIi0tIjsKKyNlbHNlCisJLyogTk9NTVUgZnRwZCBscyBoZWxwZXIgY2hkaXJzIHRvIGFyZ3ZbMl0sCisJICogcHJldmVudGluZyBwZWVyIGZyb20gc2VlaW5nIHJlYWwgcm9vdC4gKi8KKwlhcmd2WzJdID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oTlVMTCk7CisjZW5kaWYKKwlhcmd2WzNdID0gRy5mdHBfYXJnOworCWFyZ3ZbNF0gPSBOVUxMOworCisJLyogSW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggbm9uLVJGQyBjb25mb3JtaW5nIEZUUCBjbGllbnRzCisJICogd2hpY2ggc2VuZCBlLmcuICJMSVNUIC1sIiwgIkxJU1QgLWxhIiwgIkxJU1QgLWFMIi4KKwkgKiBTZWUgaHR0cHM6Ly9idWdzLmtkZS5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTU3OCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVAorCSAmJiBHLmZ0cF9hcmcgJiYgRy5mdHBfYXJnWzBdID09ICctJworCSkgeworCQljb25zdCBjaGFyICp0bXAgPSBzdHJjaHIoRy5mdHBfYXJnLCAnICcpOworCQlpZiAodG1wKSAvKiBza2lwIHRoZSBzcGFjZSAqLworCQkJdG1wKys7CisJCWFyZ3ZbM10gPSB0bXA7CisJfQorCisJeHBpcGVkX3BhaXIob3V0ZmQpOworCisJLypmZmx1c2hfYWxsKCk7IC0gc28gZmFyIHdlIGRvbnQgdXNlIHN0ZGlvIG9uIG91dHB1dCAqLworCXBpZCA9IEJCX01NVSA/IHhmb3JrKCkgOiB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogY2hpbGQgKi8KKyNpZiAhQkJfTU1VCisJCS8qIE9uIE5PTU1VLCB3ZSB3YW50IHRvIGV4ZWN1dGUgYSBjaGlsZCAtIGNvcHkgb2Ygb3Vyc2VsZi4KKwkJICogSW4gY2hyb290IHdlIHVzdWFsbHkgY2FuJ3QgZG8gaXQuIFRodXMgd2UgY2hkaXIKKwkJICogb3V0IG9mIHRoZSBjaHJvb3QgYmFjayB0byBvcmlnaW5hbCByb290LAorCQkgKiBhbmQgKHNlZSBsYXRlciBiZWxvdykgZXhlY3V0ZSBiYl9idXN5Ym94X2V4ZWNfcGF0aAorCQkgKiByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeSAqLworCQlpZiAoZmNoZGlyKEcucm9vdF9mZCkgIT0gMCkKKwkJCV9leGl0KDEyNyk7CisJCS8qY2xvc2UoRy5yb290X2ZkKTsgLSBjbG9zZV9vbl9leGVjX29uKCkgdG9vayBjYXJlIG9mIHRoaXMgKi8KKyNlbmRpZgorCQkvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkISAqLworCQljbG9zZShvdXRmZC5yZCk7CisJCXhtb3ZlX2ZkKG91dGZkLndyLCBTVERPVVRfRklMRU5PKTsKKwkJLyogT3BlbmluZyAvZGV2L251bGwgaW4gY2hyb290IGlzIGhhcmQuCisJCSAqIEp1c3QgbWFraW5nIHN1cmUgU1RESU5fRklMRU5PIGlzIG9wZW5lZAorCQkgKiB0byBzb21ldGhpbmcgaGFybWxlc3MuIFBhcmFub2lhLAorCQkgKiBscyB3b24ndCByZWFkIGl0IGFueXdheSAqLworCQljbG9zZShTVERJTl9GSUxFTk8pOworCQlkdXAoU1RET1VUX0ZJTEVOTyk7IC8qIGNvcHkgd2lsbCBiZWNvbWUgU1RESU5fRklMRU5PICovCisjaWYgQkJfTU1VCisJCS8qIG1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgLSBsc19tYWluIGRvZXMgaXQgKi8KKwkJZXhpdChsc19tYWluKEFSUkFZX1NJWkUoYXJndikgLSAxLCAoY2hhcioqKSBhcmd2KSk7CisjZWxzZQorCQkvKiArIDE6IHdlIG11c3QgdXNlIHJlbGF0aXZlIHBhdGggaGVyZSBpZiBpbiBjaHJvb3QuCisJCSAqIEZvciBleGFtcGxlLCBleGVjdigiL3Byb2Mvc2VsZi9leGUiKSB3aWxsIGZhaWwsIHNpbmNlCisJCSAqIGl0IGxvb2tzIGZvciAiL3Byb2Mvc2VsZi9leGUiIF9yZWxhdGl2ZSB0byBjaHJvb3QhXyAqLworCQlleGVjdihiYl9idXN5Ym94X2V4ZWNfcGF0aCArIDEsIChjaGFyKiopIGFyZ3YpOworCQlfZXhpdCgxMjcpOworI2VuZGlmCisJfQorCisJLyogcGFyZW50ICovCisJY2xvc2Uob3V0ZmQud3IpOworI2lmICFCQl9NTVUKKwlmcmVlKChjaGFyKilhcmd2WzJdKTsKKyNlbmRpZgorCXJldHVybiBvdXRmZC5yZDsKK30KKworZW51bSB7CisJVVNFX0NUUkxfQ09OTiA9IDEsCisJTE9OR19MSVNUSU5HID0gMiwKK307CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZGlyX2NvbW1vbihpbnQgb3B0cykKK3sKKwlGSUxFICpsc19mcDsKKwljaGFyICpsaW5lOworCWludCBsc19mZDsKKworCWlmICghKG9wdHMgJiBVU0VfQ1RSTF9DT05OKSAmJiAhcG9ydF9vcl9wYXN2X3dhc19zZWVuKCkpCisJCXJldHVybjsgLyogcG9ydF9vcl9wYXN2X3dhc19zZWVuIGVtaXR0ZWQgZXJyb3IgcmVzcG9uc2UgKi8KKworCS8qIC1uIHByZXZlbnRzIHVzZXIvZ3JvdXBuYW1lIGRpc3BsYXksCisJICogd2hpY2ggY2FuIGJlIHByb2JsZW1hdGljIGluIGNocm9vdCAqLworCWxzX2ZkID0gcG9wZW5fbHMoKG9wdHMgJiBMT05HX0xJU1RJTkcpID8gIi1sIiA6ICItMSIpOworCWxzX2ZwID0geGZkb3Blbl9mb3JfcmVhZChsc19mZCk7CisKKwlpZiAob3B0cyAmIFVTRV9DVFJMX0NPTk4pIHsKKwkJLyogU1RBVCA8ZmlsZW5hbWU+ICovCisJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX1NUQVRGSUxFX09LKSItRmlsZSBzdGF0dXM6XHJcbiIpOworCQl3aGlsZSAoMSkgeworCQkJbGluZSA9IHhtYWxsb2NfZmdldGxpbmUobHNfZnApOworCQkJaWYgKCFsaW5lKQorCQkJCWJyZWFrOworCQkJLyogSGFjazogMCByZXN1bHRzIGluIG5vIHN0YXR1cyBhdCBhbGwgKi8KKwkJCS8qIE5vdGU6IGl0J3Mgb2sgdGhhdCB3ZSBkb24ndCBwcmVwZW5kIHNwYWNlLAorCQkJICogZnRwLmtlcm5lbC5vcmcgZG9lc24ndCBkbyB0aGF0IHRvbyAqLworCQkJY21kaW9fd3JpdGUoMCwgbGluZSk7CisJCQlmcmVlKGxpbmUpOworCQl9CisJCVdSSVRFX09LKEZUUF9TVEFURklMRV9PSyk7CisJfSBlbHNlIHsKKwkJLyogTElTVC9OTFNUIFs8ZmlsZW5hbWU+XSAqLworCQlpbnQgcmVtb3RlX2ZkID0gZ2V0X3JlbW90ZV90cmFuc2Zlcl9mZCgiIERpcmVjdG9yeSBsaXN0aW5nIik7CisJCWlmIChyZW1vdGVfZmQgPj0gMCkgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlsaW5lID0geG1hbGxvY19mZ2V0bGluZShsc19mcCk7CisJCQkJaWYgKCFsaW5lKQorCQkJCQlicmVhazsKKwkJCQkvKiBJJ3ZlIHNlZW4gY2xpZW50cyBjb21wbGFpbmluZyB3aGVuIHRoZXkKKwkJCQkgKiBhcmUgZmVkIHdpdGggbHMgb3V0cHV0IHdpdGggYmFyZSAnXG4nLgorCQkJCSAqIFBpdHkuLi4gdGhhdCB3b3VsZCBiZSBtdWNoIHNpbXBsZXIuCisJCQkJICovCisvKiBUT0RPOiBuZWVkIHRvIHMvTEYvTlVML2cgaGVyZSAqLworCQkJCXh3cml0ZV9zdHIocmVtb3RlX2ZkLCBsaW5lKTsKKwkJCQl4d3JpdGUocmVtb3RlX2ZkLCAiXHJcbiIsIDIpOworCQkJCWZyZWUobGluZSk7CisJCQl9CisJCX0KKwkJY2xvc2UocmVtb3RlX2ZkKTsKKwkJV1JJVEVfT0soRlRQX1RSQU5TRkVST0spOworCX0KKwlmY2xvc2UobHNfZnApOyAvKiBjbG9zZXMgbHNfZmQgdG9vICovCit9CitzdGF0aWMgdm9pZAoraGFuZGxlX2xpc3Qodm9pZCkKK3sKKwloYW5kbGVfZGlyX2NvbW1vbihMT05HX0xJU1RJTkcpOworfQorc3RhdGljIHZvaWQKK2hhbmRsZV9ubHN0KHZvaWQpCit7CisJLyogTkxTVCByZXR1cm5zIGxpc3Qgb2YgbmFtZXMsICJcclxuIiB0ZXJtaW5hdGVkIHdpdGhvdXQgcmVnYXJkCisJICogdG8gdGhlIGN1cnJlbnQgYmluYXJ5IGZsYWcuIE5hbWVzIG1heSBzdGFydCB3aXRoICIvIiwKKwkgKiB0aGVuIHRoZXkgcmVwcmVzZW50IGZ1bGwgbmFtZXMgKHdlIGRvbid0IHByb2R1Y2Ugc3VjaCBuYW1lcyksCisJICogb3RoZXJ3aXNlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeS4KKwkgKiBFbWJlZGRlZCAiXG4iIGFyZSByZXBsYWNlZCBieSBOVUxzLiBUaGlzIGlzIHNhZmUgc2luY2UgbmFtZXMKKwkgKiBjYW4gbmV2ZXIgY29udGFpbiBOVUwuCisJICovCisJaGFuZGxlX2Rpcl9jb21tb24oMCk7Cit9CitzdGF0aWMgdm9pZAoraGFuZGxlX3N0YXRfZmlsZSh2b2lkKQoreworCWhhbmRsZV9kaXJfY29tbW9uKExPTkdfTElTVElORyArIFVTRV9DVFJMX0NPTk4pOworfQorCisvKiBUaGlzIGNhbiBiZSBleHRlbmRlZCB0byBoYW5kbGUgTUxTVCwgYXMgYWxsIGluZm8gaXMgYXZhaWxhYmxlCisgKiBpbiBzdHJ1Y3Qgc3RhdCBmb3IgdGhhdDoKKyAqIE1MU1QgZmlsZV9uYW1lCisgKiAyNTAtTGlzdGluZyBmaWxlX25hbWUKKyAqICB0eXBlPWZpbGU7c2l6ZT00MTYxO21vZGlmeT0xOTk3MDIxNDE2NTgwMDsgL2Rpci9kaXIvZmlsZV9uYW1lCisgKiAyNTAgRW5kCisgKiBOYW5vLWRvYzoKKyAqIE1MU1QgWzxmaWxlIG9yIGRpciBuYW1lLCAiLiIgYXNzdW1lZCBpZiBub3QgZ2l2ZW4+XQorICogUmV0dXJuZWQgbmFtZSBzaG91bGQgYmUgZWl0aGVyIHRoZSBzYW1lIGFzIHJlcXVlc3RlZCwgb3IgZnVsbHkgcXVhbGlmaWVkLgorICogSWYgdGhlcmUgd2FzIG5vIHBhcmFtZXRlciwgcmV0dXJuICIiIG9yIChwcmVmZXJyZWQpIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICogUmV0dXJuZWQgImZhY3RzIiAoY2FzZSBpcyBub3QgaW1wb3J0YW50KToKKyAqICBzaXplICAgIC0gc2l6ZSBpbiBvY3RldHMKKyAqICBtb2RpZnkgIC0gbGFzdCBtb2RpZmljYXRpb24gdGltZQorICogIHR5cGUgICAgLSBlbnRyeSB0eXBlIChmaWxlLGRpcixPUy51bml4PWJsb2NrKQorICogICAgICAgICAgICAoKyBjZGlyIGFuZCBwZGlyIHR5cGVzIGZvciBNTFNEKQorICogIHVuaXF1ZSAgLSB1bmlxdWUgaWQgb2YgZmlsZS9kaXJlY3RvcnkgKGlub2RlIykKKyAqICBwZXJtICAgIC0KKyAqICAgICAgYTogY2FuIGJlIGFwcGVuZGVkIHRvIChBUFBFKQorICogICAgICBkOiBjYW4gYmUgZGVsZXRlZCAoUk1EL0RFTEUpCisgKiAgICAgIGY6IGNhbiBiZSByZW5hbWVkIChSTkZSKQorICogICAgICByOiBjYW4gYmUgcmVhZCAoUkVUUikKKyAqICAgICAgdzogY2FuIGJlIHdyaXR0ZW4gKFNUT1IpCisgKiAgICAgIGU6IGNhbiBDV0QgaW50byB0aGlzIGRpcgorICogICAgICBsOiB0aGlzIGRpciBjYW4gYmUgbGlzdGVkIChkaXIgb25seSEpCisgKiAgICAgIGM6IGNhbiBjcmVhdGUgZmlsZXMgaW4gdGhpcyBkaXIKKyAqICAgICAgbTogY2FuIGNyZWF0ZSBkaXJzIGluIHRoaXMgZGlyIChNS0QpCisgKiAgICAgIHA6IGNhbiBkZWxldGUgZmlsZXMgaW4gdGhpcyBkaXIKKyAqICBVTklYLm1vZGUgLSB1bml4IGZpbGUgbW9kZQorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3NpemVfb3JfbWR0bShpbnQgbmVlZF9zaXplKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJc3RydWN0IHRtIGJyb2tlbl9vdXQ7CisJY2hhciBidWZbKHNpemVvZigiTk5OICUiT0ZGX0ZNVCJ1XHJcbiIpICsgc2l6ZW9mKG9mZl90KSAqIDMpCisJCXwgc2l6ZW9mKCJOTk4gWVlZWU1NRERoaG1tc3NcclxuIikKKwldOworCisJaWYgKCFHLmZ0cF9hcmcKKwkgfHwgc3RhdChHLmZ0cF9hcmcsICZzdGF0YnVmKSAhPSAwCisJIHx8ICFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkKKwkpIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJaWYgKG5lZWRfc2l6ZSkgeworCQlzcHJpbnRmKGJ1ZiwgU1RSKEZUUF9TVEFURklMRV9PSykiICUiT0ZGX0ZNVCJ1XHJcbiIsIHN0YXRidWYuc3Rfc2l6ZSk7CisJfSBlbHNlIHsKKwkJZ210aW1lX3IoJnN0YXRidWYuc3RfbXRpbWUsICZicm9rZW5fb3V0KTsKKwkJc3ByaW50ZihidWYsIFNUUihGVFBfU1RBVEZJTEVfT0spIiAlMDR1JTAydSUwMnUlMDJ1JTAydSUwMnVcclxuIiwKKwkJCWJyb2tlbl9vdXQudG1feWVhciArIDE5MDAsCisJCQlicm9rZW5fb3V0LnRtX21vbiwKKwkJCWJyb2tlbl9vdXQudG1fbWRheSwKKwkJCWJyb2tlbl9vdXQudG1faG91ciwKKwkJCWJyb2tlbl9vdXQudG1fbWluLAorCQkJYnJva2VuX291dC50bV9zZWMpOworCX0KKwljbWRpb193cml0ZV9yYXcoYnVmKTsKK30KKworLyogVXBsb2FkIGNvbW1hbmRzICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUKK3N0YXRpYyB2b2lkCitoYW5kbGVfbWtkKHZvaWQpCit7CisJaWYgKCFHLmZ0cF9hcmcgfHwgbWtkaXIoRy5mdHBfYXJnLCAwNzc3KSAhPSAwKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCVdSSVRFX09LKEZUUF9NS0RJUk9LKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9ybWQodm9pZCkKK3sKKwlpZiAoIUcuZnRwX2FyZyB8fCBybWRpcihHLmZ0cF9hcmcpICE9IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfT0soRlRQX1JNRElST0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2RlbGUodm9pZCkKK3sKKwlpZiAoIUcuZnRwX2FyZyB8fCB1bmxpbmsoRy5mdHBfYXJnKSAhPSAwKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCVdSSVRFX09LKEZUUF9ERUxFT0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3JuZnIodm9pZCkKK3sKKwlmcmVlKEcucm5mcl9maWxlbmFtZSk7CisJRy5ybmZyX2ZpbGVuYW1lID0geHN0cmR1cChHLmZ0cF9hcmcpOworCVdSSVRFX09LKEZUUF9STkZST0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3JudG8odm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogSWYgd2UgZGlkbid0IGdldCBhIFJORlIsIHRocm93IGEgd29iYmx5ICovCisJaWYgKEcucm5mcl9maWxlbmFtZSA9PSBOVUxMIHx8IEcuZnRwX2FyZyA9PSBOVUxMKSB7CisJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX05FRURSTkZSKSIgVXNlIFJORlIgZmlyc3RcclxuIik7CisJCXJldHVybjsKKwl9CisKKwlyZXR2YWwgPSByZW5hbWUoRy5ybmZyX2ZpbGVuYW1lLCBHLmZ0cF9hcmcpOworCWZyZWUoRy5ybmZyX2ZpbGVuYW1lKTsKKwlHLnJuZnJfZmlsZW5hbWUgPSBOVUxMOworCisJaWYgKHJldHZhbCkgeworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9PSyhGVFBfUkVOQU1FT0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3VwbG9hZF9jb21tb24oaW50IGlzX2FwcGVuZCwgaW50IGlzX3VuaXF1ZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNoYXIgKnRlbXBuYW1lOworCW9mZl90IGJ5dGVzX3RyYW5zZmVycmVkOworCW9mZl90IG9mZnNldDsKKwlpbnQgbG9jYWxfZmlsZV9mZDsKKwlpbnQgcmVtb3RlX2ZkOworCisJb2Zmc2V0ID0gRy5yZXN0YXJ0X3BvczsKKwlHLnJlc3RhcnRfcG9zID0gMDsKKworCWlmICghcG9ydF9vcl9wYXN2X3dhc19zZWVuKCkpCisJCXJldHVybjsgLyogcG9ydF9vcl9wYXN2X3dhc19zZWVuIGVtaXR0ZWQgZXJyb3IgcmVzcG9uc2UgKi8KKworCXRlbXBuYW1lID0gTlVMTDsKKwlsb2NhbF9maWxlX2ZkID0gLTE7CisJaWYgKGlzX3VuaXF1ZSkgeworCQl0ZW1wbmFtZSA9IHhzdHJkdXAoIiBGSUxFOiB1bmlxLlhYWFhYWCIpOworCQlsb2NhbF9maWxlX2ZkID0gbWtzdGVtcCh0ZW1wbmFtZSArIDcpOworCX0gZWxzZSBpZiAoRy5mdHBfYXJnKSB7CisJCWludCBmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJCWlmIChpc19hcHBlbmQpCisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5EOworCQlpZiAob2Zmc2V0KQorCQkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQ7CisJCWxvY2FsX2ZpbGVfZmQgPSBvcGVuKEcuZnRwX2FyZywgZmxhZ3MsIDA2NjYpOworCX0KKworCWlmIChsb2NhbF9maWxlX2ZkIDwgMAorCSB8fCBmc3RhdChsb2NhbF9maWxlX2ZkLCAmc3RhdGJ1ZikgIT0gMAorCSB8fCAhU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpCisJKSB7CisJCVdSSVRFX0VSUihGVFBfVVBMT0FERkFJTCk7CisJCWlmIChsb2NhbF9maWxlX2ZkID49IDApCisJCQlnb3RvIGNsb3NlX2xvY2FsX2FuZF9iYWlsOworCQlyZXR1cm47CisJfQorCUcubG9jYWxfZmlsZV9mZCA9IGxvY2FsX2ZpbGVfZmQ7CisKKwlpZiAob2Zmc2V0KQorCQl4bHNlZWsobG9jYWxfZmlsZV9mZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKwlyZW1vdGVfZmQgPSBnZXRfcmVtb3RlX3RyYW5zZmVyX2ZkKHRlbXBuYW1lID8gdGVtcG5hbWUgOiAiIE9rIHRvIHNlbmQgZGF0YSIpOworCWZyZWUodGVtcG5hbWUpOworCisJaWYgKHJlbW90ZV9mZCA8IDApCisJCWdvdG8gY2xvc2VfbG9jYWxfYW5kX2JhaWw7CisKKwlieXRlc190cmFuc2ZlcnJlZCA9IGJiX2NvcHlmZF9lb2YocmVtb3RlX2ZkLCBsb2NhbF9maWxlX2ZkKTsKKwljbG9zZShyZW1vdGVfZmQpOworCWlmIChieXRlc190cmFuc2ZlcnJlZCA8IDApCisJCVdSSVRFX0VSUihGVFBfQkFEU0VOREZJTEUpOworCWVsc2UKKwkJV1JJVEVfT0soRlRQX1RSQU5TRkVST0spOworCisgY2xvc2VfbG9jYWxfYW5kX2JhaWw6CisJY2xvc2UobG9jYWxfZmlsZV9mZCk7CisJRy5sb2NhbF9maWxlX2ZkID0gMDsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zdG9yKHZvaWQpCit7CisJaGFuZGxlX3VwbG9hZF9jb21tb24oMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfYXBwZSh2b2lkKQoreworCUcucmVzdGFydF9wb3MgPSAwOworCWhhbmRsZV91cGxvYWRfY29tbW9uKDEsIDApOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3N0b3Uodm9pZCkKK3sKKwlHLnJlc3RhcnRfcG9zID0gMDsKKwloYW5kbGVfdXBsb2FkX2NvbW1vbigwLCAxKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUgKi8KKworc3RhdGljIHVpbnQzMl90CitjbWRpb19nZXRfY21kX2FuZF9hcmcodm9pZCkKK3sKKwlpbnQgbGVuOworCXVpbnQzMl90IGNtZHZhbDsKKwljaGFyICpjbWQ7CisKKwlhbGFybShHLnRpbWVvdXQpOworCisJZnJlZShHLmZ0cF9jbWQpOworCXsKKwkJLyogUGFyYW5vaWEuIFBlZXIgbWF5IHNlbmQgMSBnaWdhYnl0ZSBsb25nIGNtZC4uLiAqLworCQkvKiBVc2luZyBzZXBhcmF0ZSBsZW5fb25fc3RrIGluc3RlYWQgb2YgbGVuIG9wdGltaXplcworCQkgKiBjb2RlIHNpemUgKGFsbG93cyBsZW4gdG8gYmUgaW4gQ1BVIHJlZ2lzdGVyKSAqLworCQlzaXplX3QgbGVuX29uX3N0ayA9IDggKiAxMDI0OworCQlHLmZ0cF9jbWQgPSBjbWQgPSB4bWFsbG9jX2ZnZXRzX3N0cl9sZW4oc3RkaW4sICJcclxuIiwgJmxlbl9vbl9zdGspOworCQlpZiAoIWNtZCkKKwkJCWV4aXQoMCk7CisJCWxlbiA9IGxlbl9vbl9zdGs7CisJfQorCisJLyogRGUtZXNjYXBlIHRlbG5ldDogMHhmZiwweGZmID0+IDB4ZmYgKi8KKwkvKiBSRkM5NTkgc2F5cyB0aGF0IEFCT1IsIFNUQVQsIFFVSVQgbWF5IGJlIHNlbnQgZXZlbiBkdXJpbmcKKwkgKiBkYXRhIHRyYW5zZmVyLCBhbmQgbWF5IGJlIHByZWNlZGVkIGJ5IHRlbG5ldCdzICJJbnRlcnJ1cHQgUHJvY2VzcyIKKwkgKiBjb2RlICh0d28tYnl0ZSBzZXF1ZW5jZSAyNTUsMjQ0KSBhbmQgdGhlbiBieSB0ZWxuZXQgIlN5bmNoIiBjb2RlCisJICogMjU1LDI0MiAoYnl0ZSAyNDIgaXMgc2VudCB3aXRoIFRDUCBVUkcgYml0IHVzaW5nIHNlbmQoTVNHX09PQikKKwkgKiBhbmQgbWF5IGdlbmVyYXRlIFNJR1VSRyBvbiBvdXIgc2lkZS4gU2VlIFJGQzg1NCkuCisJICogU28gZmFyIHdlIGRvbid0IHN1cHBvcnQgdGhhdCAobWF5IGluc3RhbGwgU0lHVVJHIGhhbmRsZXIgaWYgd2UnZCB3YW50IHRvKSwKKwkgKiBidXQgd2UgbmVlZCB0byBhdCBsZWFzdCByZW1vdmUgMjU1LHh4eCBwYWlycy4gbGZ0cCBzZW5kcyB0aG9zZS4gKi8KKwkvKiBUaGVuIGRlLWVzY2FwZSBGVFA6IE5VTCA9PiAnXG4nICovCisJLyogVGVzdGluZyBmb3IgXHhmZjoKKwkgKiBDcmVhdGUgZmlsZSBuYW1lZCAnXHhmZic6IGVjaG8gSGVsbG8gPmBlY2hvIC1uZSAiXHhmZiJgCisJICogVHJ5IHRvIGdldCBpdDogICAgICAgICAgICBmdHBnZXQgLXYgMTI3LjAuMC4xIEVmZiBgZWNobyAtbmUgIlx4ZmZceGZmImAKKwkgKiAobmVlZCAiXHhmZlx4ZmYiIHVudGlsIGZ0cGdldCBhcHBsZXQgaXMgZml4ZWQgdG8gZG8gZXNjYXBpbmcgOikKKwkgKiBUZXN0aW5nIGZvciBlbWJlZGRlZCBMRjoKKwkgKiBMRl9IRVJFPWBlY2hvIC1uZSAiTEZcbkhFUkUiYAorCSAqIGVjaG8gSGVsbG8gPiIkTEZfSEVSRSIKKwkgKiBmdHBnZXQgLXYgMTI3LjAuMC4xIExGX0hFUkUgIiRMRl9IRVJFIgorCSAqLworCXsKKwkJaW50IGRzdCwgc3JjOworCisJCS8qIFN0cmlwICJcclxuIiBpZiBpdCBpcyB0aGVyZSAqLworCQlpZiAobGVuICE9IDAgJiYgY21kW2xlbiAtIDFdID09ICdcbicpIHsKKwkJCWxlbi0tOworCQkJaWYgKGxlbiAhPSAwICYmIGNtZFtsZW4gLSAxXSA9PSAnXHInKQorCQkJCWxlbi0tOworCQkJY21kW2xlbl0gPSAnXDAnOworCQl9CisJCXNyYyA9IHN0cmNocm51bChjbWQsIDB4ZmYpIC0gY21kOworCQkvKiA5OSw5OSUgdGhlcmUgYXJlIG5laXRoZXIgTlVMcyBub3IgMjU1cyBhbmQgc3JjID09IGxlbiAqLworCQlpZiAoc3JjIDwgbGVuKSB7CisJCQlkc3QgPSBzcmM7CisJCQlkbyB7CisJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShjbWRbc3JjXSkgPT0gMjU1KSB7CisJCQkJCXNyYysrOworCQkJCQkvKiAyNTUseHh4IC0gc2tpcCAyNTUgKi8KKwkJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShjbWRbc3JjXSkgIT0gMjU1KSB7CisJCQkJCQkvKiAyNTUsITI1NSAtIHNraXAgYm90aCAqLworCQkJCQkJc3JjKys7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkvKiAyNTUsMjU1IC0gcmV0YWluIG9uZSAyNTUgKi8KKwkJCQl9CisJCQkJLyogTlVMID0+ICdcbicgKi8KKwkJCQljbWRbZHN0KytdID0gY21kW3NyY10gPyBjbWRbc3JjXSA6ICdcbic7CisJCQkJc3JjKys7CisJCQl9IHdoaWxlIChzcmMgPCBsZW4pOworCQkJY21kW2RzdF0gPSAnXDAnOworCQl9CisJfQorCisJaWYgKEcudmVyYm9zZSA+IDEpCisJCXZlcmJvc2VfbG9nKGNtZCk7CisKKwlHLmZ0cF9hcmcgPSBzdHJjaHIoY21kLCAnICcpOworCWlmIChHLmZ0cF9hcmcgIT0gTlVMTCkKKwkJKkcuZnRwX2FyZysrID0gJ1wwJzsKKworCS8qIFVwcGVyY2FzZSBhbmQgcGFjayBpbnRvIHVpbnQzMl90IGZpcnN0IHdvcmQgb2YgdGhlIGNvbW1hbmQgKi8KKwljbWR2YWwgPSAwOworCXdoaWxlICgqY21kKQorCQljbWR2YWwgPSAoY21kdmFsIDw8IDgpICsgKCh1bnNpZ25lZCBjaGFyKSpjbWQrKyAmICh1bnNpZ25lZCBjaGFyKX4weDIwKTsKKworCXJldHVybiBjbWR2YWw7Cit9CisKKyNkZWZpbmUgbWtfY29uc3Q0KGEsYixjLGQpICgoKGEgKiAweDEwMCArIGIpICogMHgxMDAgKyBjKSAqIDB4MTAwICsgZCkKKyNkZWZpbmUgbWtfY29uc3QzKGEsYixjKSAgICAoKGEgKiAweDEwMCArIGIpICogMHgxMDAgKyBjKQorZW51bSB7CisJY29uc3RfQUxMTyA9IG1rX2NvbnN0NCgnQScsICdMJywgJ0wnLCAnTycpLAorCWNvbnN0X0FQUEUgPSBta19jb25zdDQoJ0EnLCAnUCcsICdQJywgJ0UnKSwKKwljb25zdF9DRFVQID0gbWtfY29uc3Q0KCdDJywgJ0QnLCAnVScsICdQJyksCisJY29uc3RfQ1dEICA9IG1rX2NvbnN0MygnQycsICdXJywgJ0QnKSwKKwljb25zdF9ERUxFID0gbWtfY29uc3Q0KCdEJywgJ0UnLCAnTCcsICdFJyksCisJY29uc3RfRVBTViA9IG1rX2NvbnN0NCgnRScsICdQJywgJ1MnLCAnVicpLAorCWNvbnN0X0ZFQVQgPSBta19jb25zdDQoJ0YnLCAnRScsICdBJywgJ1QnKSwKKwljb25zdF9IRUxQID0gbWtfY29uc3Q0KCdIJywgJ0UnLCAnTCcsICdQJyksCisJY29uc3RfTElTVCA9IG1rX2NvbnN0NCgnTCcsICdJJywgJ1MnLCAnVCcpLAorCWNvbnN0X01EVE0gPSBta19jb25zdDQoJ00nLCAnRCcsICdUJywgJ00nKSwKKwljb25zdF9NS0QgID0gbWtfY29uc3QzKCdNJywgJ0snLCAnRCcpLAorCWNvbnN0X01PREUgPSBta19jb25zdDQoJ00nLCAnTycsICdEJywgJ0UnKSwKKwljb25zdF9OTFNUID0gbWtfY29uc3Q0KCdOJywgJ0wnLCAnUycsICdUJyksCisJY29uc3RfTk9PUCA9IG1rX2NvbnN0NCgnTicsICdPJywgJ08nLCAnUCcpLAorCWNvbnN0X1BBU1MgPSBta19jb25zdDQoJ1AnLCAnQScsICdTJywgJ1MnKSwKKwljb25zdF9QQVNWID0gbWtfY29uc3Q0KCdQJywgJ0EnLCAnUycsICdWJyksCisJY29uc3RfUE9SVCA9IG1rX2NvbnN0NCgnUCcsICdPJywgJ1InLCAnVCcpLAorCWNvbnN0X1BXRCAgPSBta19jb25zdDMoJ1AnLCAnVycsICdEJyksCisJY29uc3RfUVVJVCA9IG1rX2NvbnN0NCgnUScsICdVJywgJ0knLCAnVCcpLAorCWNvbnN0X1JFU1QgPSBta19jb25zdDQoJ1InLCAnRScsICdTJywgJ1QnKSwKKwljb25zdF9SRVRSID0gbWtfY29uc3Q0KCdSJywgJ0UnLCAnVCcsICdSJyksCisJY29uc3RfUk1EICA9IG1rX2NvbnN0MygnUicsICdNJywgJ0QnKSwKKwljb25zdF9STkZSID0gbWtfY29uc3Q0KCdSJywgJ04nLCAnRicsICdSJyksCisJY29uc3RfUk5UTyA9IG1rX2NvbnN0NCgnUicsICdOJywgJ1QnLCAnTycpLAorCWNvbnN0X1NJWkUgPSBta19jb25zdDQoJ1MnLCAnSScsICdaJywgJ0UnKSwKKwljb25zdF9TVEFUID0gbWtfY29uc3Q0KCdTJywgJ1QnLCAnQScsICdUJyksCisJY29uc3RfU1RPUiA9IG1rX2NvbnN0NCgnUycsICdUJywgJ08nLCAnUicpLAorCWNvbnN0X1NUT1UgPSBta19jb25zdDQoJ1MnLCAnVCcsICdPJywgJ1UnKSwKKwljb25zdF9TVFJVID0gbWtfY29uc3Q0KCdTJywgJ1QnLCAnUicsICdVJyksCisJY29uc3RfU1lTVCA9IG1rX2NvbnN0NCgnUycsICdZJywgJ1MnLCAnVCcpLAorCWNvbnN0X1RZUEUgPSBta19jb25zdDQoJ1QnLCAnWScsICdQJywgJ0UnKSwKKwljb25zdF9VU0VSID0gbWtfY29uc3Q0KCdVJywgJ1MnLCAnRScsICdSJyksCisKKyNpZiAhQkJfTU1VCisJT1BUX2wgPSAoMSA8PCAwKSwKKwlPUFRfMSA9ICgxIDw8IDEpLAorI2VuZGlmCisJT1BUX3YgPSAoMSA8PCAoKCFCQl9NTVUpICogMiArIDApKSwKKwlPUFRfUyA9ICgxIDw8ICgoIUJCX01NVSkgKiAyICsgMSkpLAorCU9QVF93ID0gKDEgPDwgKCghQkJfTU1VKSAqIDIgKyAyKSkgKiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUsCit9OworCitpbnQgZnRwZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisjaWYgIUJCX01NVQoraW50IGZ0cGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisjZWxzZQoraW50IGZ0cGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJdW5zaWduZWQgYWJzX3RpbWVvdXQ7CisJdW5zaWduZWQgdmVyYm9zZV9TOworCXNtYWxsaW50IG9wdHM7CisKKwlJTklUX0coKTsKKworCWFic190aW1lb3V0ID0gMSAqIDYwICogNjA7CisJdmVyYm9zZV9TID0gMDsKKwlHLnRpbWVvdXQgPSAyICogNjA7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidCs6VCs6dnY6U1MiOworI2lmIEJCX01NVQorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAgICJ2UyIgSUZfRkVBVFVSRV9GVFBfV1JJVEUoInciKSAidDpUOiIsICZHLnRpbWVvdXQsICZhYnNfdGltZW91dCwgJkcudmVyYm9zZSwgJnZlcmJvc2VfUyk7CisjZWxzZQorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAibDF2UyIgSUZfRkVBVFVSRV9GVFBfV1JJVEUoInciKSAidDpUOiIsICZHLnRpbWVvdXQsICZhYnNfdGltZW91dCwgJkcudmVyYm9zZSwgJnZlcmJvc2VfUyk7CisJaWYgKG9wdHMgJiAoT1BUX2x8T1BUXzEpKSB7CisJCS8qIE91ciBzZWNyZXQgYmFja2Rvb3IgdG8gbHMgKi8KKy8qIFRPRE86IHBhc3MgLW4/IEl0IHByZXZlbnRzIHVzZXIvZ3JvdXAgcmVzb2x1dGlvbiwgd2hpY2ggbWF5IG5vdCB3b3JrIGluIGNocm9vdCBhbnl3YXkgKi8KKy8qIFRPRE86IHBhc3MgLUE/IEl0IHNob3dzIGRvdCBmaWxlcyAqLworLyogVE9ETzogcGFzcyAtLWdyb3VwLWRpcmVjdG9yaWVzLWZpcnN0PyB3b3VsZCBiZSBuaWNlLCBidXQgbHMgZG9lc24ndCBkbyB0aGF0IHlldCAqLworCQl4Y2hkaXIoYXJndlsyXSk7CisJCWFyZ3ZbMl0gPSAoY2hhciopIi0tIjsKKwkJLyogbWVtc2V0KCZHLCAwLCBzaXplb2YoRykpOyAtIGxzX21haW4gZG9lcyBpdCAqLworCQlyZXR1cm4gbHNfbWFpbihhcmdjLCBhcmd2KTsKKwl9CisjZW5kaWYKKwlpZiAoRy52ZXJib3NlIDwgdmVyYm9zZV9TKQorCQlHLnZlcmJvc2UgPSB2ZXJib3NlX1M7CisJaWYgKGFic190aW1lb3V0IHwgRy50aW1lb3V0KSB7CisJCWlmIChhYnNfdGltZW91dCA9PSAwKQorCQkJYWJzX3RpbWVvdXQgPSBJTlRfTUFYOworCQlHLmVuZF90aW1lID0gbW9ub3RvbmljX3NlYygpICsgYWJzX3RpbWVvdXQ7CisJCWlmIChHLnRpbWVvdXQgPiBhYnNfdGltZW91dCkKKwkJCUcudGltZW91dCA9IGFic190aW1lb3V0OworCX0KKwlzdHJjcHkoRy5tc2dfb2sgICsgNCwgTVNHX09LICk7CisJc3RyY3B5KEcubXNnX2VyciArIDQsIE1TR19FUlIpOworCisJRy5sb2NhbF9hZGRyID0gZ2V0X3NvY2tfbHNhKFNURElOX0ZJTEVOTyk7CisJaWYgKCFHLmxvY2FsX2FkZHIpIHsKKwkJLyogVGhpcyBpcyBjb25mdXNpbmc6CisJCSAqIGJiX2Vycm9yX21zZ19hbmRfZGllKCJzdGRpbiBpcyBub3QgYSBzb2NrZXQiKTsKKwkJICogQmV0dGVyOiAqLworCQliYl9zaG93X3VzYWdlKCk7CisJCS8qIEhlbHAgdGV4dCBzYXlzIHRoYXQgZnRwZCBtdXN0IGJlIHVzZWQgYXMgaW5ldGQgc2VydmljZSwKKwkJICogd2hpY2ggaXMgYnkgZmFyIHRoZSBtb3N0IHVzdWFsIGNhdXNlIG9mIGdldF9zb2NrX2xzYQorCQkgKiBmYWlsdXJlICovCisJfQorCisJaWYgKCEob3B0cyAmIE9QVF92KSkKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwlpZiAob3B0cyAmIE9QVF9TKSB7CisJCS8qIExPR19OREVMQVkgaXMgbmVlZGVkIHNpbmNlIHdlIG1heSBjaHJvb3QgbGF0ZXIgKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCB8IExPR19OREVMQVksIExPR19EQUVNT04pOworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKwlpZiAobG9nbW9kZSkKKwkJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoIiVzWyV1XSIsIGFwcGxldF9uYW1lLCAoaW50KWdldHBpZCgpKTsKKworI2lmICFCQl9NTVUKKwlHLnJvb3RfZmQgPSB4b3BlbigiLyIsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpOworCWNsb3NlX29uX2V4ZWNfb24oRy5yb290X2ZkKTsKKyNlbmRpZgorCisJaWYgKGFyZ3Zbb3B0aW5kXSkgeworCQl4Y2hkaXIoYXJndltvcHRpbmRdKTsKKwkJY2hyb290KCIuIik7CisJfQorCisJLy91bWFzaygwNzcpOyAtIGFkbWluIGNhbiBzZXQgdW1hc2sgYmVmb3JlIHN0YXJ0aW5nIHVzCisKKwkvKiBTaWduYWxzLiBXZSdsbCBhbHdheXMgdGFrZSAtRVBJUEUgcmF0aGVyIHRoYW4gYSBydWRlIHNpZ25hbCwgdGhhbmtzICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJLyogU2V0IHVwIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgc29ja2V0IChkbyB3ZSBuZWVkIHRoZXNlIGFsbD8gd2h5PykgKi8KKwlzZXRzb2Nrb3B0KFNURElOX0ZJTEVOTywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworCXNldHNvY2tvcHQoU1RESU5fRklMRU5PLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisJLyogVGVsbmV0IHByb3RvY29sIG92ZXIgY29tbWFuZCBsaW5rIG1heSBzZW5kICJ1cmdlbnQiIGRhdGEsCisJICogd2UgcHJlZmVyIGl0IHRvIGJlIHJlY2VpdmVkIGluIHRoZSAibm9ybWFsIiBkYXRhIHN0cmVhbTogKi8KKwlzZXRzb2Nrb3B0KFNURElOX0ZJTEVOTywgU09MX1NPQ0tFVCwgU09fT09CSU5MSU5FLCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworCisJV1JJVEVfT0soRlRQX0dSRUVUKTsKKwlzaWduYWwoU0lHQUxSTSwgdGltZW91dF9oYW5kbGVyKTsKKworI2lmZGVmIElGX1dFX1dBTlRfVE9fUkVRVUlSRV9MT0dJTgorCXsKKwkJc21hbGxpbnQgdXNlcl93YXNfc3BlY2lmaWVkID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCXVpbnQzMl90IGNtZHZhbCA9IGNtZGlvX2dldF9jbWRfYW5kX2FyZygpOworCisJCQlpZiAoY21kdmFsID09IGNvbnN0X1VTRVIpIHsKKwkJCQlpZiAoRy5mdHBfYXJnID09IE5VTEwgfHwgc3RyY2FzZWNtcChHLmZ0cF9hcmcsICJhbm9ueW1vdXMiKSAhPSAwKQorCQkJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9MT0dJTkVSUikiIFNlcnZlciBpcyBhbm9ueW1vdXMgb25seVxyXG4iKTsKKwkJCQllbHNlIHsKKwkJCQkJdXNlcl93YXNfc3BlY2lmaWVkID0gMTsKKwkJCQkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfR0lWRVBXT1JEKSIgUGxlYXNlIHNwZWNpZnkgdGhlIHBhc3N3b3JkXHJcbiIpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1BBU1MpIHsKKwkJCQlpZiAodXNlcl93YXNfc3BlY2lmaWVkKQorCQkJCQlicmVhazsKKwkJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9ORUVEVVNFUikiIExvZ2luIHdpdGggVVNFUlxyXG4iKTsKKwkJCX0gZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1FVSVQpIHsKKwkJCQlXUklURV9PSyhGVFBfR09PREJZRSk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX0xPR0lORVJSKSIgTG9naW4gd2l0aCBVU0VSIGFuZCBQQVNTXHJcbiIpOworCQkJfQorCQl9CisJfQorCVdSSVRFX09LKEZUUF9MT0dJTk9LKTsKKyNlbmRpZgorCisJLyogUkZDLTk1OSBTZWN0aW9uIDUuMQorCSAqIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYW5kIG9wdGlvbnMgTVVTVCBiZSBzdXBwb3J0ZWQgYnkgZXZlcnkKKwkgKiBzZXJ2ZXItRlRQIGFuZCB1c2VyLUZUUCwgZXhjZXB0IGluIGNhc2VzIHdoZXJlIHRoZSB1bmRlcmx5aW5nCisJICogZmlsZSBzeXN0ZW0gb3Igb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBhbGxvdyBvciBzdXBwb3J0CisJICogYSBwYXJ0aWN1bGFyIGNvbW1hbmQuCisJICogVHlwZTogQVNDSUkgTm9uLXByaW50LCBJTUFHRSwgTE9DQUwgOAorCSAqIE1vZGU6IFN0cmVhbQorCSAqIFN0cnVjdHVyZTogRmlsZSwgUmVjb3JkKgorCSAqIChSZWNvcmQgc3RydWN0dXJlIGlzIFJFUVVJUkVEIG9ubHkgZm9yIGhvc3RzIHdob3NlIGZpbGUKKwkgKiAgc3lzdGVtcyBzdXBwb3J0IHJlY29yZCBzdHJ1Y3R1cmUpLgorCSAqIENvbW1hbmRzOgorCSAqIFVTRVIsIFBBU1MsIEFDQ1QsIFtiYm94OiBBQ0NUIG5vdCBzdXBwb3J0ZWRdCisJICogUE9SVCwgUEFTViwKKwkgKiBUWVBFLCBNT0RFLCBTVFJVLAorCSAqIFJFVFIsIFNUT1IsIEFQUEUsCisJICogUk5GUiwgUk5UTywgREVMRSwKKwkgKiBDV0QsICBDRFVQLCBSTUQsICBNS0QsICBQV0QsCisJICogTElTVCwgTkxTVCwKKwkgKiBTWVNULCBTVEFULAorCSAqIEhFTFAsIE5PT1AsIFFVSVQuCisJICovCisJLyogQUNDT1VOVCAoQUNDVCkKKwkgKiAiVGhlIGFyZ3VtZW50IGZpZWxkIGlzIGEgVGVsbmV0IHN0cmluZyBpZGVudGlmeWluZyB0aGUgdXNlcidzIGFjY291bnQuCisJICogVGhlIGNvbW1hbmQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbGF0ZWQgdG8gdGhlIFVTRVIgY29tbWFuZCwgYXMgc29tZQorCSAqIHNpdGVzIG1heSByZXF1aXJlIGFuIGFjY291bnQgZm9yIGxvZ2luIGFuZCBvdGhlcnMgb25seSBmb3Igc3BlY2lmaWMKKwkgKiBhY2Nlc3MsIHN1Y2ggYXMgc3RvcmluZyBmaWxlcy4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZSBjb21tYW5kIG1heQorCSAqIGFycml2ZSBhdCBhbnkgdGltZS4KKwkgKiBUaGVyZSBhcmUgcmVwbHkgY29kZXMgdG8gZGlmZmVyZW50aWF0ZSB0aGVzZSBjYXNlcyBmb3IgdGhlIGF1dG9tYXRpb246CisJICogd2hlbiBhY2NvdW50IGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkIGZvciBsb2dpbiwgdGhlIHJlc3BvbnNlIHRvCisJICogYSBzdWNjZXNzZnVsIFBBU1N3b3JkIGNvbW1hbmQgaXMgcmVwbHkgY29kZSAzMzIuIE9uIHRoZSBvdGhlciBoYW5kLAorCSAqIGlmIGFjY291bnQgaW5mb3JtYXRpb24gaXMgTk9UIHJlcXVpcmVkIGZvciBsb2dpbiwgdGhlIHJlcGx5IHRvCisJICogYSBzdWNjZXNzZnVsIFBBU1N3b3JkIGNvbW1hbmQgaXMgMjMwOyBhbmQgaWYgdGhlIGFjY291bnQgaW5mb3JtYXRpb24KKwkgKiBpcyBuZWVkZWQgZm9yIGEgY29tbWFuZCBpc3N1ZWQgbGF0ZXIgaW4gdGhlIGRpYWxvZ3VlLCB0aGUgc2VydmVyCisJICogc2hvdWxkIHJldHVybiBhIDMzMiBvciA1MzIgcmVwbHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgc3RvcmVzCisJICogKHBlbmRpbmcgcmVjZWlwdCBvZiB0aGUgQUNDb3VuVCBjb21tYW5kKSBvciBkaXNjYXJkcyB0aGUgY29tbWFuZCwKKwkgKiByZXNwZWN0aXZlbHkuIgorCSAqLworCisJd2hpbGUgKDEpIHsKKwkJdWludDMyX3QgY21kdmFsID0gY21kaW9fZ2V0X2NtZF9hbmRfYXJnKCk7CisKKwkJaWYgKGNtZHZhbCA9PSBjb25zdF9RVUlUKSB7CisJCQlXUklURV9PSyhGVFBfR09PREJZRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfVVNFUikKKwkJCS8qIFRoaXMgd291bGQgbWVhbiAib2ssIG5vdyBnaXZlIG1lIFBBU1MiLiAqLworCQkJLypXUklURV9PSyhGVFBfR0lWRVBXT1JEKTsqLworCQkJLyogdnNmdHBkIGNhbiBiZSBjb25maWd1cmVkIHRvIG5vdCByZXF1aXJlIHRoYXQsCisJCQkgKiBhbmQgdGhpcyBhbHNvIHNhdmVzIG9uZSByb3VuZHRyaXA6CisJCQkgKi8KKwkJCVdSSVRFX09LKEZUUF9MT0dJTk9LKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1BBU1MpCisJCQlXUklURV9PSyhGVFBfTE9HSU5PSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9OT09QKQorCQkJV1JJVEVfT0soRlRQX05PT1BPSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9UWVBFKQorCQkJV1JJVEVfT0soRlRQX1RZUEVPSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9TVFJVKQorCQkJV1JJVEVfT0soRlRQX1NUUlVPSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9NT0RFKQorCQkJV1JJVEVfT0soRlRQX01PREVPSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9BTExPKQorCQkJV1JJVEVfT0soRlRQX0FMTE9PSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9TWVNUKQorCQkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfU1lTVE9LKSIgVU5JWCBUeXBlOiBMOFxyXG4iKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1BXRCkKKwkJCWhhbmRsZV9wd2QoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0NXRCkKKwkJCWhhbmRsZV9jd2QoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0NEVVApIC8qIGNkIC4uICovCisJCQloYW5kbGVfY2R1cCgpOworCQkvKiBIRUxQIGlzIG5lYXJseSB1c2VsZXNzLCBidXQgd2UgY2FuIHJldXNlIEZFQVQgZm9yIGl0ICovCisJCS8qIGxmdHAgdXNlcyBGRUFUICovCisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9IRUxQIHx8IGNtZHZhbCA9PSBjb25zdF9GRUFUKQorCQkJaGFuZGxlX2ZlYXQoY21kdmFsID09IGNvbnN0X0hFTFAKKwkJCQkJPyBTVFJOVU0zMihGVFBfSEVMUCkKKwkJCQkJOiBTVFJOVU0zMihGVFBfU1RBVE9LKQorCQkJKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0xJU1QpIC8qIGxzIC1sICovCisJCQloYW5kbGVfbGlzdCgpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfTkxTVCkgLyogIm5hbWUgbGlzdCIsIGJhcmUgbHMgKi8KKwkJCWhhbmRsZV9ubHN0KCk7CisJCS8qIFNJWkUgaXMgY3J1Y2lhbCBmb3Igd2dldCdzIGRvd25sb2FkIGluZGljYXRvciBldGMgKi8KKwkJLyogTW96aWxsYSwgbGZ0cCB1c2UgTURUTSAocHJlc3VtYWJseSBmb3IgY2FjaGluZykgKi8KKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1NJWkUgfHwgY21kdmFsID09IGNvbnN0X01EVE0pCisJCQloYW5kbGVfc2l6ZV9vcl9tZHRtKGNtZHZhbCA9PSBjb25zdF9TSVpFKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1NUQVQpIHsKKwkJCWlmIChHLmZ0cF9hcmcgPT0gTlVMTCkKKwkJCQloYW5kbGVfc3RhdCgpOworCQkJZWxzZQorCQkJCWhhbmRsZV9zdGF0X2ZpbGUoKTsKKwkJfQorCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUEFTVikKKwkJCWhhbmRsZV9wYXN2KCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9FUFNWKQorCQkJaGFuZGxlX2Vwc3YoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1JFVFIpCisJCQloYW5kbGVfcmV0cigpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUE9SVCkKKwkJCWhhbmRsZV9wb3J0KCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9SRVNUKQorCQkJaGFuZGxlX3Jlc3QoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUKKwkJZWxzZSBpZiAob3B0cyAmIE9QVF93KSB7CisJCQlpZiAoY21kdmFsID09IGNvbnN0X1NUT1IpCisJCQkJaGFuZGxlX3N0b3IoKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9NS0QpCisJCQkJaGFuZGxlX21rZCgpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1JNRCkKKwkJCQloYW5kbGVfcm1kKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfREVMRSkKKwkJCQloYW5kbGVfZGVsZSgpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1JORlIpIC8qICJyZW5hbWUgZnJvbSIgKi8KKwkJCQloYW5kbGVfcm5mcigpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1JOVE8pIC8qICJyZW5hbWUgdG8iICovCisJCQkJaGFuZGxlX3JudG8oKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9BUFBFKQorCQkJCWhhbmRsZV9hcHBlKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfU1RPVSkgLyogInN0b3JlIHVuaXF1ZSIgKi8KKwkJCQloYW5kbGVfc3RvdSgpOworCQkJZWxzZQorCQkJCWdvdG8gYmFkX2NtZDsKKwkJfQorI2VuZGlmCisjaWYgMAorCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfU1RPUgorCQkgfHwgY21kdmFsID09IGNvbnN0X01LRAorCQkgfHwgY21kdmFsID09IGNvbnN0X1JNRAorCQkgfHwgY21kdmFsID09IGNvbnN0X0RFTEUKKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9STkZSCisJCSB8fCBjbWR2YWwgPT0gY29uc3RfUk5UTworCQkgfHwgY21kdmFsID09IGNvbnN0X0FQUEUKKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9TVE9VCisJCSkgeworCQkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfTk9QRVJNKSIgUGVybWlzc2lvbiBkZW5pZWRcclxuIik7CisJCX0KKyNlbmRpZgorCQllbHNlIHsKKwkJCS8qIFdoaWNoIHVuc3VwcG9ydGVkIGNvbW1hbmRzIHdlcmUgc2VlbiBpbiB0aGUgd2lsZD8KKwkJCSAqIChkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gIndlIG11c3Qgc3VwcG9ydCB0aGVtIikKKwkJCSAqIGZvbyAxLjIuMzogWFhYWCAtIGNvbW1lbnQKKwkJCSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURQorIGJhZF9jbWQ6CisjZW5kaWYKKwkJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX0JBRENNRCkiIFVua25vd24gY29tbWFuZFxyXG4iKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvZnRwZ2V0cHV0LmMgYi9uZXR3b3JraW5nL2Z0cGdldHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGY5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2Z0cGdldHB1dC5jCkBAIC0wLDAgKzEsMzYwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmdHBnZXQKKyAqCisgKiBNaW5pIGltcGxlbWVudGF0aW9uIG9mIEZUUCB0byByZXRyaWV2ZSBhIHJlbW90ZSBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIEFuZ2llbHNraSwgVGhlIFBUUiBHcm91cCA8amVmZkB0aGVwdHJncm91cC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgR2xlbm4gTWNHcmF0aAorICoKKyAqIEJhc2VkIG9uIHdnZXQuYyBieSBDaGlwIFJvc2VudGhhbCBDb3ZhZCBDb21tdW5pY2F0aW9ucworICogPGNoaXBAbGFzZXJsaW5rLm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmdHBnZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBIT1NUIFtMT0NBTF9GSUxFXSBSRU1PVEVfRklMRSIKKy8vdXNhZ2U6I2RlZmluZSBmdHBnZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXRyaWV2ZSBhIHJlbW90ZSBmaWxlIHZpYSBGVFBcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jb250aW51ZQlDb250aW51ZSBwcmV2aW91cyB0cmFuc2ZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXYsLS12ZXJib3NlCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXNlcm5hbWUJVXNlcm5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1wLC0tcGFzc3dvcmQJUGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcG9ydAlQb3J0IG51bWJlciIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1jCUNvbnRpbnVlIHByZXZpb3VzIHRyYW5zZmVyIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdQlVc2VybmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1QCVBvcnQgbnVtYmVyIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmdHBwdXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBIT1NUIFtSRU1PVEVfRklMRV0gTE9DQUxfRklMRSIKKy8vdXNhZ2U6I2RlZmluZSBmdHBwdXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdG9yZSBhIGxvY2FsIGZpbGUgb24gYSByZW1vdGUgbWFjaGluZSB2aWEgRlRQXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdSwtLXVzZXJuYW1lCVVzZXJuYW1lIgorLy91c2FnZTogICAgICJcbgktcCwtLXBhc3N3b3JkCVBhc3N3b3JkIgorLy91c2FnZTogICAgICJcbgktUCwtLXBvcnQJUG9ydCBudW1iZXIiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdQlVc2VybmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1QCVBvcnQgbnVtYmVyIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IGdsb2JhbHMgeworCWNvbnN0IGNoYXIgKnVzZXI7CisJY29uc3QgY2hhciAqcGFzc3dvcmQ7CisJc3RydWN0IGxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlGSUxFICpjb250cm9sX3N0cmVhbTsKKwlpbnQgdmVyYm9zZV9mbGFnOworCWludCBkb19jb250aW51ZTsKKwljaGFyIGJ1Zls0XTsgLyogYWN0dWFsbHkgW0JVRlNaXSAqLworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK2VudW0geyBCVUZTWiA9IENPTU1PTl9CVUZTSVpFIC0gb2Zmc2V0b2Yoc3RydWN0IGdsb2JhbHMsIGJ1ZikgfTsKK3N0cnVjdCBCVUdfR190b29fYmlnIHsKKwljaGFyIEJVR19HX3Rvb19iaWdbc2l6ZW9mKEcpIDw9IENPTU1PTl9CVUZTSVpFID8gMSA6IC0xXTsKK307CisjZGVmaW5lIHVzZXIgICAgICAgICAgIChHLnVzZXIgICAgICAgICAgKQorI2RlZmluZSBwYXNzd29yZCAgICAgICAoRy5wYXNzd29yZCAgICAgICkKKyNkZWZpbmUgbHNhICAgICAgICAgICAgKEcubHNhICAgICAgICAgICApCisjZGVmaW5lIGNvbnRyb2xfc3RyZWFtIChHLmNvbnRyb2xfc3RyZWFtKQorI2RlZmluZSB2ZXJib3NlX2ZsYWcgICAoRy52ZXJib3NlX2ZsYWcgICkKKyNkZWZpbmUgZG9fY29udGludWUgICAgKEcuZG9fY29udGludWUgICApCisjZGVmaW5lIGJ1ZiAgICAgICAgICAgIChHLmJ1ZiAgICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKworc3RhdGljIHZvaWQgZnRwX2RpZShjb25zdCBjaGFyICptc2cpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZnRwX2RpZShjb25zdCBjaGFyICptc2cpCit7CisJY2hhciAqY3AgPSBidWY7IC8qIGJ1ZiBob2xkcyBwZWVyJ3MgcmVzcG9uc2UgKi8KKworCS8qIEd1YXJkIGFnYWluc3QgZ2FyYmFnZSBmcm9tIHJlbW90ZSBzZXJ2ZXIgKi8KKwl3aGlsZSAoKmNwID49ICcgJyAmJiAqY3AgPCAnXHg3ZicpCisJCWNwKys7CisJKmNwID0gJ1wwJzsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UlcyVzOiAlcyIsCisJCQkobXNnID8gIiB0byAiIDogIiIpLCAobXNnID8gbXNnIDogIiIpLCBidWYpOworfQorCitzdGF0aWMgaW50IGZ0cGNtZChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJdW5zaWduZWQgbjsKKworCWlmICh2ZXJib3NlX2ZsYWcpIHsKKwkJYmJfZXJyb3JfbXNnKCJjbWQgJXMgJXMiLCBzMSwgczIpOworCX0KKworCWlmIChzMSkgeworCQlmcHJpbnRmKGNvbnRyb2xfc3RyZWFtLCAoczIgPyAiJXMgJXNcclxuIiA6ICIlcyAlc1xyXG4iKzMpLAorCQkJCQkJczEsIHMyKTsKKwkJZmZsdXNoKGNvbnRyb2xfc3RyZWFtKTsKKwl9CisKKwlkbyB7CisJCXN0cmNweShidWYsICJFT0YiKTsgLyogZm9yIGZ0cF9kaWUgKi8KKwkJaWYgKGZnZXRzKGJ1ZiwgQlVGU1ogLSAyLCBjb250cm9sX3N0cmVhbSkgPT0gTlVMTCkgeworCQkJZnRwX2RpZShOVUxMKTsKKwkJfQorCX0gd2hpbGUgKCFpc2RpZ2l0KGJ1ZlswXSkgfHwgYnVmWzNdICE9ICcgJyk7CisKKwlidWZbM10gPSAnXDAnOworCW4gPSB4YXRvdShidWYpOworCWJ1ZlszXSA9ICcgJzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgZnRwX2xvZ2luKHZvaWQpCit7CisJLyogQ29ubmVjdCB0byB0aGUgY29tbWFuZCBzb2NrZXQgKi8KKwljb250cm9sX3N0cmVhbSA9IGZkb3Blbih4Y29ubmVjdF9zdHJlYW0obHNhKSwgInIrIik7CisJaWYgKGNvbnRyb2xfc3RyZWFtID09IE5VTEwpIHsKKwkJLyogZmRvcGVuIGZhaWxlZCAtIGV4dHJlbWVseSB1bmxpa2VseSAqLworCQliYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSgpOworCX0KKworCWlmIChmdHBjbWQoTlVMTCwgTlVMTCkgIT0gMjIwKSB7CisJCWZ0cF9kaWUoTlVMTCk7CisJfQorCisJLyogIExvZ2luIHRvIHRoZSBzZXJ2ZXIgKi8KKwlzd2l0Y2ggKGZ0cGNtZCgiVVNFUiIsIHVzZXIpKSB7CisJY2FzZSAyMzA6CisJCWJyZWFrOworCWNhc2UgMzMxOgorCQlpZiAoZnRwY21kKCJQQVNTIiwgcGFzc3dvcmQpICE9IDIzMCkgeworCQkJZnRwX2RpZSgiUEFTUyIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZ0cF9kaWUoIlVTRVIiKTsKKwl9CisKKwlmdHBjbWQoIlRZUEUgSSIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHhjb25uZWN0X2Z0cGRhdGEodm9pZCkKK3sKKwljaGFyICpidWZfcHRyOworCXVuc2lnbmVkIHBvcnRfbnVtOworCisvKgorVE9ETzogUEFTViBjb21tYW5kIHdpbGwgbm90IHdvcmsgZm9yIElQdjYuIFJGQzI0MjggZGVzY3JpYmVzCitJUHY2LWNhcGFibGUgImV4dGVuZGVkIFBBU1YiIC0gRVBTVi4KKworIkVQU1YgW3Byb3RvY29sXSIgYXNrcyBzZXJ2ZXIgdG8gYmluZCB0byBhbmQgbGlzdGVuIG9uIGEgZGF0YSBwb3J0CitpbiBzcGVjaWZpZWQgcHJvdG9jb2wuIFByb3RvY29sIGlzIDEgZm9yIElQdjQsIDIgZm9yIElQdjYuCitJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAic2FtZSBhcyB1c2VkIGZvciBjb250cm9sIGNvbm5lY3Rpb24iLgorSWYgc2VydmVyIHVuZGVyc3Rvb2QgeW91LCBpdCBzaG91bGQgYW5zd2VyICIyMjkgPHNvbWUgdGV4dD4ofHx8cG9ydHwpIgord2hlcmUgInwiIGFyZSBsaXRlcmFsIHBpcGUgY2hhcnMgYW5kICJwb3J0IiBpcyBBU0NJSSBkZWNpbWFsIHBvcnQjLgorCitUaGVyZSBpcyBhbHNvIGFuIElQdjYtY2FwYWJsZSByZXBsYWNlbWVudCBmb3IgUE9SVCAoRVBSVCksCitidXQgd2UgZG9uJ3QgbmVlZCB0aGF0LgorCitOQjogUEFTViBtYXkgc3RpbGwgd29yayBmb3Igc29tZSBzZXJ2ZXJzIGV2ZW4gb3ZlciBJUHY2LgorRm9yIGV4YW1wbGUsIHZzZnRwIGhhcHBpbHkgYW5zd2VycworIjIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKDAsMCwwLDAsbixuKSIgYW5kIHByb2NlZWRzIGFzIHVzdWFsLgorCitUT0RPMjogbmVlZCB0byBzdG9wIGlnbm9yaW5nIElQIGFkZHJlc3MgaW4gUEFTViByZXNwb25zZS4KKyovCisKKwlpZiAoZnRwY21kKCJQQVNWIiwgTlVMTCkgIT0gMjI3KSB7CisJCWZ0cF9kaWUoIlBBU1YiKTsKKwl9CisKKwkvKiBSZXNwb25zZSBpcyAiTk5OIGdhcmJhZ2VOMSxOMixOMyxONCxQMSxQMlspZ2FyYmFnZV0KKwkgKiBTZXJ2ZXIncyBJUCBpcyBOMS5OMi5OMy5ONCAod2UgaWdub3JlIGl0KQorCSAqIFNlcnZlcidzIHBvcnQgZm9yIGRhdGEgY29ubmVjdGlvbiBpcyBQMSoyNTYrUDIgKi8KKwlidWZfcHRyID0gc3RycmNocihidWYsICcpJyk7CisJaWYgKGJ1Zl9wdHIpICpidWZfcHRyID0gJ1wwJzsKKworCWJ1Zl9wdHIgPSBzdHJyY2hyKGJ1ZiwgJywnKTsKKwkqYnVmX3B0ciA9ICdcMCc7CisJcG9ydF9udW0gPSB4YXRvdWxfcmFuZ2UoYnVmX3B0ciArIDEsIDAsIDI1NSk7CisKKwlidWZfcHRyID0gc3RycmNocihidWYsICcsJyk7CisJKmJ1Zl9wdHIgPSAnXDAnOworCXBvcnRfbnVtICs9IHhhdG91bF9yYW5nZShidWZfcHRyICsgMSwgMCwgMjU1KSAqIDI1NjsKKworCXNldF9ucG9ydCgmbHNhLT51LnNhLCBodG9ucyhwb3J0X251bSkpOworCXJldHVybiB4Y29ubmVjdF9zdHJlYW0obHNhKTsKK30KKworc3RhdGljIGludCBwdW1wX2RhdGFfYW5kX1FVSVQoaW50IGZyb20sIGludCB0bykKK3sKKwkvKiBjb3B5IHRoZSBmaWxlICovCisJaWYgKGJiX2NvcHlmZF9lb2YoZnJvbSwgdG8pID09IC0xKSB7CisJCS8qIGVycm9yIG1zZyBpcyBhbHJlYWR5IHByaW50ZWQgYnkgYmJfY29weWZkX2VvZiAqLworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIGNsb3NlIGRhdGEgY29ubmVjdGlvbiAqLworCWNsb3NlKGZyb20pOyAvKiBkb24ndCBrbm93IHdoaWNoIG9uZSBpcyB0aGF0LCBzbyB3ZSBjbG9zZSBib3RoICovCisJY2xvc2UodG8pOworCisJLyogZG9lcyBzZXJ2ZXIgY29uZmlybSB0aGF0IHRyYW5zZmVyIGlzIGZpbmlzaGVkPyAqLworCWlmIChmdHBjbWQoTlVMTCwgTlVMTCkgIT0gMjI2KSB7CisJCWZ0cF9kaWUoTlVMTCk7CisJfQorCWZ0cGNtZCgiUVVJVCIsIE5VTEwpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworI2lmICFFTkFCTEVfRlRQR0VUCitpbnQgZnRwX3JlY2VpdmUoY29uc3QgY2hhciAqbG9jYWxfcGF0aCwgY2hhciAqc2VydmVyX3BhdGgpOworI2Vsc2UKK3N0YXRpYworaW50IGZ0cF9yZWNlaXZlKGNvbnN0IGNoYXIgKmxvY2FsX3BhdGgsIGNoYXIgKnNlcnZlcl9wYXRoKQoreworCWludCBmZF9kYXRhOworCWludCBmZF9sb2NhbCA9IC0xOworCW9mZl90IGJlZ19yYW5nZSA9IDA7CisKKwkvKiBjb25uZWN0IHRvIHRoZSBkYXRhIHNvY2tldCAqLworCWZkX2RhdGEgPSB4Y29ubmVjdF9mdHBkYXRhKCk7CisKKwlpZiAoZnRwY21kKCJTSVpFIiwgc2VydmVyX3BhdGgpICE9IDIxMykgeworCQlkb19jb250aW51ZSA9IDA7CisJfQorCisJaWYgKExPTkVfREFTSChsb2NhbF9wYXRoKSkgeworCQlmZF9sb2NhbCA9IFNURE9VVF9GSUxFTk87CisJCWRvX2NvbnRpbnVlID0gMDsKKwl9CisKKwlpZiAoZG9fY29udGludWUpIHsKKwkJc3RydWN0IHN0YXQgc2J1ZjsKKwkJLyogbHN0YXQgd291bGQgYmUgd3JvbmcgaGVyZSEgKi8KKwkJaWYgKHN0YXQobG9jYWxfcGF0aCwgJnNidWYpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzdGF0Iik7CisJCX0KKwkJaWYgKHNidWYuc3Rfc2l6ZSA+IDApIHsKKwkJCWJlZ19yYW5nZSA9IHNidWYuc3Rfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWRvX2NvbnRpbnVlID0gMDsKKwkJfQorCX0KKworCWlmIChkb19jb250aW51ZSkgeworCQlzcHJpbnRmKGJ1ZiwgIlJFU1QgJSJPRkZfRk1UInUiLCBiZWdfcmFuZ2UpOworCQlpZiAoZnRwY21kKGJ1ZiwgTlVMTCkgIT0gMzUwKSB7CisJCQlkb19jb250aW51ZSA9IDA7CisJCX0KKwl9CisKKwlpZiAoZnRwY21kKCJSRVRSIiwgc2VydmVyX3BhdGgpID4gMTUwKSB7CisJCWZ0cF9kaWUoIlJFVFIiKTsKKwl9CisKKwkvKiBjcmVhdGUgbG9jYWwgZmlsZSBfYWZ0ZXJfIHdlIGtub3cgdGhhdCByZW1vdGUgZmlsZSBleGlzdHMgKi8KKwlpZiAoZmRfbG9jYWwgPT0gLTEpIHsKKwkJZmRfbG9jYWwgPSB4b3Blbihsb2NhbF9wYXRoLAorCQkJZG9fY29udGludWUgPyAoT19BUFBFTkQgfCBPX1dST05MWSkKKwkJCSAgICAgICAgICAgIDogKE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFkpCisJCSk7CisJfQorCisJcmV0dXJuIHB1bXBfZGF0YV9hbmRfUVVJVChmZF9kYXRhLCBmZF9sb2NhbCk7Cit9CisjZW5kaWYKKworI2lmICFFTkFCTEVfRlRQUFVUCitpbnQgZnRwX3NlbmQoY29uc3QgY2hhciAqc2VydmVyX3BhdGgsIGNoYXIgKmxvY2FsX3BhdGgpOworI2Vsc2UKK3N0YXRpYworaW50IGZ0cF9zZW5kKGNvbnN0IGNoYXIgKnNlcnZlcl9wYXRoLCBjaGFyICpsb2NhbF9wYXRoKQoreworCWludCBmZF9kYXRhOworCWludCBmZF9sb2NhbDsKKwlpbnQgcmVzcG9uc2U7CisKKwkvKiBjb25uZWN0IHRvIHRoZSBkYXRhIHNvY2tldCAqLworCWZkX2RhdGEgPSB4Y29ubmVjdF9mdHBkYXRhKCk7CisKKwkvKiBnZXQgdGhlIGxvY2FsIGZpbGUgKi8KKwlmZF9sb2NhbCA9IFNURElOX0ZJTEVOTzsKKwlpZiAoTk9UX0xPTkVfREFTSChsb2NhbF9wYXRoKSkKKwkJZmRfbG9jYWwgPSB4b3Blbihsb2NhbF9wYXRoLCBPX1JET05MWSk7CisKKwlyZXNwb25zZSA9IGZ0cGNtZCgiU1RPUiIsIHNlcnZlcl9wYXRoKTsKKwlzd2l0Y2ggKHJlc3BvbnNlKSB7CisJY2FzZSAxMjU6CisJY2FzZSAxNTA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZ0cF9kaWUoIlNUT1IiKTsKKwl9CisKKwlyZXR1cm4gcHVtcF9kYXRhX2FuZF9RVUlUKGZkX2xvY2FsLCBmZF9kYXRhKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgZnRwZ2V0cHV0X2xvbmdvcHRzW10gQUxJR04xID0KKwkiY29udGludWVcMCIgUmVxdWlyZWRfYXJndW1lbnQgImMiCisJInZlcmJvc2VcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorCSJ1c2VybmFtZVwwIiBSZXF1aXJlZF9hcmd1bWVudCAidSIKKwkicGFzc3dvcmRcMCIgUmVxdWlyZWRfYXJndW1lbnQgInAiCisJInBvcnRcMCIgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJQIgorCTsKKyNlbmRpZgorCitpbnQgZnRwZ2V0cHV0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmdHBnZXRwdXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnBvcnQgPSAiZnRwIjsKKwkvKiBzb2NrZXQgdG8gZnRwIHNlcnZlciAqLworCisjaWYgRU5BQkxFX0ZUUFBVVCAmJiAhRU5BQkxFX0ZUUEdFVAorIyBkZWZpbmUgZnRwX2FjdGlvbiBmdHBfc2VuZAorI2VsaWYgRU5BQkxFX0ZUUEdFVCAmJiAhRU5BQkxFX0ZUUFBVVAorIyBkZWZpbmUgZnRwX2FjdGlvbiBmdHBfcmVjZWl2ZQorI2Vsc2UKKwlpbnQgKCpmdHBfYWN0aW9uKShjb25zdCBjaGFyICosIGNoYXIgKikgPSBmdHBfc2VuZDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY29tbWFuZCBpcyBmdHBnZXQgb3IgZnRwdXQgKi8KKwlpZiAoYXBwbGV0X25hbWVbM10gPT0gJ2cnKSB7CisJCWZ0cF9hY3Rpb24gPSBmdHBfcmVjZWl2ZTsKKwl9CisjZW5kaWYKKworCUlOSVRfRygpOworCS8qIFNldCBkZWZhdWx0IHZhbHVlcyAqLworCXVzZXIgPSAiYW5vbnltb3VzIjsKKwlwYXNzd29yZCA9ICJidXN5Ym94QCI7CisKKwkvKgorCSAqIERlY2lwaGVyIHRoZSBjb21tYW5kIGxpbmUKKwkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGZ0cGdldHB1dF9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0yOnZ2OmNjIjsgLyogbXVzdCBoYXZlIDIgdG8gMyBwYXJhbXM7IC12IGFuZCAtYyBjb3VudCAqLworCWdldG9wdDMyKGFyZ3YsICJjdnU6cDpQOiIsICZ1c2VyLCAmcGFzc3dvcmQsICZwb3J0LAorCQkJCQkmdmVyYm9zZV9mbGFnLCAmZG9fY29udGludWUpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogV2Ugd2FudCB0byBkbyBleGFjdGx5IF9vbmVfIEROUyBsb29rdXAsIHNpbmNlIHNvbWUKKwkgKiBzaXRlcyAoaS5lLiBmdHAudXMuZGViaWFuLm9yZykgdXNlIHJvdW5kLXJvYmluIEROUworCSAqIGFuZCB3ZSB3YW50IHRvIGNvbm5lY3QgdG8gb25seSBvbmUgSVAuLi4gKi8KKwlsc2EgPSB4aG9zdDJzb2NrYWRkcihhcmd2WzBdLCBiYl9sb29rdXBfcG9ydChwb3J0LCAidGNwIiwgMjEpKTsKKwlpZiAodmVyYm9zZV9mbGFnKSB7CisJCXByaW50ZigiQ29ubmVjdGluZyB0byAlcyAoJXMpXG4iLCBhcmd2WzBdLAorCQkJeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxzYS0+dS5zYSkpOworCX0KKworCWZ0cF9sb2dpbigpOworCXJldHVybiBmdHBfYWN0aW9uKGFyZ3ZbMV0sIGFyZ3ZbMl0gPyBhcmd2WzJdIDogYXJndlsxXSk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2hvc3RuYW1lLmMgYi9uZXR3b3JraW5nL2hvc3RuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2NjM5MAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaG9zdG5hbWUuYwpAQCAtMCwwICsxLDE3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBob3N0bmFtZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAqCisgKiBBZGp1c3RlZCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+IHRvIHJlbW92ZQorICogdXNlIG9mIGxvbmcgb3B0aW9ucyBhbmQgR05VIGdldG9wdC4gIEltcHJvdmVkIHRoZSB1c2FnZSBpbmZvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGhvc3RuYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0hPU1ROQU1FIHwgLUYgRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgaG9zdG5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJHZXQgb3Igc2V0IGhvc3RuYW1lIG9yIEROUyBkb21haW4gbmFtZVxuIgorLy91c2FnZTogICAgICJcbgktcwlTaG9ydCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJQWRkcmVzc2VzIGZvciB0aGUgaG9zdG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1kCUROUyBkb21haW4gbmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIgorLy91c2FnZTogICAgICJcbgktRiBGSUxFCVVzZSBGSUxFJ3MgY29udGVudCBhcyBob3N0bmFtZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaG9zdG5hbWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgaG9zdG5hbWVcbiIKKy8vdXNhZ2U6ICAgICAgICJzYWdlXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRuc2RvbWFpbm5hbWVfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGRuc2RvbWFpbm5hbWVfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIHZvaWQgZG9fc2V0aG9zdG5hbWUoY2hhciAqcywgaW50IGlzZmlsZSkKK3sKKy8vCWlmICghcykKKy8vCQlyZXR1cm47CisJaWYgKGlzZmlsZSkgeworCQlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4yKHMsIHhmb3Blbl9mb3JfcmVhZCk7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsICZzLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCAmIH5QQVJTRV9HUkVFRFkpKSB7CisJCQlkb19zZXRob3N0bmFtZShzLCAwKTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9IGVsc2UgaWYgKHNldGhvc3RuYW1lKHMsIHN0cmxlbihzKSkpIHsKKy8vCQlpZiAoZXJybm8gPT0gRVBFUk0pCisvLwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldGhvc3RuYW1lIik7CisJfQorfQorCisvKiBNYW5wYWdlIGNpcmNhIDIwMDk6CisgKgorICogaG9zdG5hbWUgWy12XSBbLWFdIFstLWFsaWFzXSBbLWRdIFstLWRvbWFpbl0gWy1mXSBbLS1mcWRuXSBbLS1sb25nXQorICogICAgICBbLWldIFstLWlwLWFkZHJlc3NdIFstc10gWy0tc2hvcnRdIFsteV0gWy0teXBdIFstLW5pc10KKyAqCisgKiBob3N0bmFtZSBbLXZdIFstRiBmaWxlbmFtZV0gWy0tZmlsZSBmaWxlbmFtZV0gLyBbaG9zdG5hbWVdCisgKgorICogZG9tYWlubmFtZSBbLXZdIFstRiBmaWxlbmFtZV0gWy0tZmlsZSBmaWxlbmFtZV0gIC8gW25hbWVdCisgKiAgeyBiYm94OiBub3Qgc3VwcG9ydGVkIH0KKyAqCisgKiBub2RlbmFtZSBbLXZdIFstRiBmaWxlbmFtZV0gWy0tZmlsZSBmaWxlbmFtZV0gLyBbbmFtZV0KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICoKKyAqIGRuc2RvbWFpbm5hbWUgWy12XQorICogIHsgYmJveDogc3VwcG9ydGVkOiBMaW51eCBrZXJuZWwgYnVpbGQgbmVlZHMgdGhpcyB9CisgKiBuaXNkb21haW5uYW1lIFstdl0KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICogeXBkb21haW5uYW1lIFstdl0KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICoKKyAqIC1hLCAtLWFsaWFzCisgKiAgRGlzcGxheSB0aGUgYWxpYXMgbmFtZSBvZiB0aGUgaG9zdCAoaWYgdXNlZCkuCisgKiAgeyBiYm94OiBub3Qgc3VwcG9ydGVkIH0KKyAqIC1kLCAtLWRvbWFpbgorICogIERpc3BsYXkgdGhlIG5hbWUgb2YgdGhlIEROUyBkb21haW4uIERvbid0IHVzZSB0aGUgY29tbWFuZAorICogIGRvbWFpbm5hbWUgdG8gZ2V0IHRoZSBETlMgZG9tYWluIG5hbWUgYmVjYXVzZSBpdCB3aWxsIHNob3cgdGhlCisgKiAgTklTIGRvbWFpbiBuYW1lIGFuZCBub3QgdGhlIEROUyBkb21haW4gbmFtZS4gVXNlIGRuc2RvbWFpbm5hbWUKKyAqICBpbnN0ZWFkLgorICogLWYsIC0tZnFkbiwgLS1sb25nCisgKiAgRGlzcGxheSB0aGUgRlFETiAoRnVsbHkgUXVhbGlmaWVkIERvbWFpbiBOYW1lKS4gQSBGUUROIGNvbnNpc3RzCisgKiAgb2YgYSBzaG9ydCBob3N0IG5hbWUgYW5kIHRoZSBETlMgZG9tYWluIG5hbWUuIFVubGVzcyB5b3UgYXJlCisgKiAgdXNpbmcgYmluZCBvciBOSVMgZm9yIGhvc3QgbG9va3VwcyB5b3UgY2FuIGNoYW5nZSB0aGUgRlFETiBhbmQKKyAqICB0aGUgRE5TIGRvbWFpbiBuYW1lICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBGUUROKSBpbiB0aGUKKyAqICAvZXRjL2hvc3RzIGZpbGUuCisgKiAtaSwgLS1pcC1hZGRyZXNzCisgKiAgRGlzcGxheSB0aGUgSVAgYWRkcmVzcyhlcykgb2YgdGhlIGhvc3QuCisgKiAtcywgLS1zaG9ydAorICogIERpc3BsYXkgdGhlIHNob3J0IGhvc3QgbmFtZS4gVGhpcyBpcyB0aGUgaG9zdCBuYW1lIGN1dCBhdCB0aGUKKyAqICBmaXJzdCBkb3QuCisgKiAtdiwgLS12ZXJib3NlCisgKiAgQmUgdmVyYm9zZSBhbmQgdGVsbCB3aGF0J3MgZ29pbmcgb24uCisgKiAgeyBiYm94OiBzdXBwb3J0ZWQgYnV0IGlnbm9yZWQgfQorICogLXksIC0teXAsIC0tbmlzCisgKiAgRGlzcGxheSB0aGUgTklTIGRvbWFpbiBuYW1lLiBJZiBhIHBhcmFtZXRlciBpcyBnaXZlbiAob3IgLS1maWxlCisgKiAgbmFtZSApIHRoZW4gcm9vdCBjYW4gYWxzbyBzZXQgYSBuZXcgTklTIGRvbWFpbi4KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICogLUYsIC0tZmlsZSBmaWxlbmFtZQorICogIFJlYWQgdGhlIGhvc3QgbmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4gQ29tbWVudHMgKGxpbmVzCisgKiAgc3RhcnRpbmcgd2l0aCBhIGAjJykgYXJlIGlnbm9yZWQuCisgKi8KK2ludCBob3N0bmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaG9zdG5hbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfZCA9IDB4MSwKKwkJT1BUX2YgPSAweDIsCisJCU9QVF9pID0gMHg0LAorCQlPUFRfcyA9IDB4OCwKKwkJT1BUX0YgPSAweDEwLAorCQlPUFRfZGZpcyA9IDB4ZiwKKwl9OworCisJdW5zaWduZWQgb3B0czsKKwljaGFyICpidWY7CisJY2hhciAqaG9zdG5hbWVfc3RyOworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCWFwcGxldF9sb25nX29wdGlvbnMgPQorCQkiZG9tYWluXDAiICAgICBOb19hcmd1bWVudCAiZCIKKwkJImZxZG5cMCIgICAgICAgTm9fYXJndW1lbnQgImYiCisJLy9FbmFibGUgaWYgc2VlbiBpbiBhY3RpdmUgdXNlIGluIHNvbWUgZGlzdHJvOgorCS8vCSJsb25nXDAiICAgICAgIE5vX2FyZ3VtZW50ICJmIgorCS8vCSJpcC1hZGRyZXNzXDAiIE5vX2FyZ3VtZW50ICJpIgorCS8vCSJzaG9ydFwwIiAgICAgIE5vX2FyZ3VtZW50ICJzIgorCS8vCSJ2ZXJib3NlXDAiICAgIE5vX2FyZ3VtZW50ICJ2IgorCQkiZmlsZVwwIiAgICAgICBOb19hcmd1bWVudCAiRiIKKwkJOworCisjZW5kaWYKKwkvKiBkbnNkb21haW5uYW1lIGZyb20gbmV0LXRvb2xzIDEuNjAsIGhvc3RuYW1lIDEuMTAwICgyMDAxLTA0LTE0KSwKKwkgKiBzdXBwb3J0cyBob3N0bmFtZSdzIG9wdGlvbnMgdG9vIChub3QganVzdCAtdiBhcyBtYW5wYWdlIHNheXMpICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJkZmlzRjp2IiwgJmhvc3RuYW1lX3N0cik7CisJYXJndiArPSBvcHRpbmQ7CisJYnVmID0gc2FmZV9nZXRob3N0bmFtZSgpOworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAnZCcpIC8qIGRuc2RvbWFpbm5hbWU/ICovCisJCW9wdHMgPSBPUFRfZDsKKworCWlmIChvcHRzICYgT1BUX2RmaXMpIHsKKwkJLyogQ2FzZXMgd2hlbiB3ZSBuZWVkIGZ1bGwgaG9zdG5hbWUgKG9yIGl0cyBwYXJ0KSAqLworCQlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJCWNoYXIgKnA7CisKKwkJaHAgPSB4Z2V0aG9zdGJ5bmFtZShidWYpOworCQlwID0gc3RyY2hybnVsKGhwLT5oX25hbWUsICcuJyk7CisJCWlmIChvcHRzICYgT1BUX2YpIHsKKwkJCXB1dHMoaHAtPmhfbmFtZSk7CisJCX0gZWxzZSBpZiAob3B0cyAmIE9QVF9zKSB7CisJCQkqcCA9ICdcMCc7CisJCQlwdXRzKGhwLT5oX25hbWUpOworCQl9IGVsc2UgaWYgKG9wdHMgJiBPUFRfZCkgeworCQkJaWYgKCpwKQorCQkJCXB1dHMocCArIDEpOworCQl9IGVsc2UgLyppZiAob3B0cyAmIE9QVF9pKSovIHsKKwkJCWlmIChocC0+aF9sZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworCQkJCXN0cnVjdCBpbl9hZGRyICoqaF9hZGRyX2xpc3QgPSAoc3RydWN0IGluX2FkZHIgKiopaHAtPmhfYWRkcl9saXN0OworCQkJCXdoaWxlICgqaF9hZGRyX2xpc3QpIHsKKwkJCQkJcHJpbnRmKCIlcyAiLCBpbmV0X250b2EoKipoX2FkZHJfbGlzdCkpOworCQkJCQloX2FkZHJfbGlzdCsrOworCQkJCX0KKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChvcHRzICYgT1BUX0YpIHsKKwkJLyogU2V0IHRoZSBob3N0bmFtZSAqLworCQlkb19zZXRob3N0bmFtZShob3N0bmFtZV9zdHIsIDEpOworCX0gZWxzZSBpZiAoYXJndlswXSkgeworCQkvKiBTZXQgdGhlIGhvc3RuYW1lICovCisJCWRvX3NldGhvc3RuYW1lKGFyZ3ZbMF0sIDApOworCX0gZWxzZSB7CisJCS8qIEp1c3QgcHJpbnQgdGhlIGN1cnJlbnQgaG9zdG5hbWUgKi8KKwkJcHV0cyhidWYpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShidWYpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2h0dHBkLmMgYi9uZXR3b3JraW5nL2h0dHBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1ZWViYQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaHR0cGQuYwpAQCAtMCwwICsxLDI0OTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGh0dHBkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgR2xlbm4gRW5nZWwgPGdsZW5uZUBlbmdlbC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUeXBpY2FsIHVzYWdlOgorICogRm9yIG5vbiByb290IHVzZXI6CisgKiAgICAgIGh0dHBkIC1wIDgwODAgLWggJEhPTUUvcHVibGljX2h0bWwKKyAqIEZvciBkYWVtb24gc3RhcnQgZnJvbSByYyBzY3JpcHQgd2l0aCB1aWQ9MDoKKyAqICAgICAgaHR0cGQgLXUgd3d3CisgKiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIChhc3N1bWluZyB1c2VyIHd3dyBoYXMgdWlkIDgwKToKKyAqICAgICAgaHR0cGQgLXAgODAgLXUgODAgLWggJFBXRCAtYyAvZXRjL2h0dHBkLmNvbmYgLXIgIldlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24iCisgKgorICogV2hlbiBhbiB1cmwgc3RhcnRzIHdpdGggIi9jZ2ktYmluLyIgaXQgaXMgYXNzdW1lZCB0byBiZSBhIGNnaSBzY3JpcHQuCisgKiBUaGUgc2VydmVyIGNoYW5nZXMgZGlyZWN0b3J5IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IGFuZCBleGVjdXRlcyBpdAorICogYWZ0ZXIgc2V0dGluZyBRVUVSWV9TVFJJTkcgYW5kIG90aGVyIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAqCisgKiBJZiBkaXJlY3RvcnkgVVJMIGlzIGdpdmVuLCBubyBpbmRleC5odG1sIGlzIGZvdW5kIGFuZCBDR0kgc3VwcG9ydCBpcyBlbmFibGVkLAorICogY2dpLWJpbi9pbmRleC5jZ2kgd2lsbCBiZSBydW4uIERpcmVjdG9yeSB0byBsaXN0IGlzIC4uLyRRVUVSWV9TVFJJTkcuCisgKiBTZWUgaHR0cGRfaW5kZXhjZ2kuYyBmb3IgYW4gZXhhbXBsZSBHQ0kgY29kZS4KKyAqCisgKiBEb2M6CisgKiAiQ0dJIEVudmlyb25tZW50IFZhcmlhYmxlcyI6IGh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvZW52Lmh0bWwKKyAqCisgKiBUaGUgYXBwbGV0IGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYW4gdXJsIGFyZyBkZWNvZGVyIGFuZCBodG1sIHRleHQgZW5jb2RlcgorICogYXMgZm9sbG93czoKKyAqICAgICAgZm9vPWBodHRwZCAtZCAkZm9vYCAgICAgICAgICAgICAjIGRlY29kZSAiSGVsbG8lMjBXb3JsZCIgYXMgIkhlbGxvIFdvcmxkIgorICogICAgICBiYXI9YGh0dHBkIC1lICI8SGVsbG8gV29ybGQ+ImAgICMgZW5jb2RlIGFzICImIzYwSGVsbG8mIzMyV29ybGQmIzYyIgorICogTm90ZSB0aGF0IHVybCBlbmNvZGluZyBmb3IgYXJndW1lbnRzIGlzIG5vdCB0aGUgc2FtZSBhcyBodG1sIGVuY29kaW5nIGZvcgorICogcHJlc2VudGF0aW9uLiAgLWQgZGVjb2RlcyBhbiB1cmwtZW5jb2RlZCBhcmd1bWVudCB3aGlsZSAtZSBlbmNvZGVzIGluIGh0bWwKKyAqIGZvciBwYWdlIGRpc3BsYXkuCisgKgorICogaHR0cGQuY29uZiBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgorICogSDovc2VydmVycm9vdCAgICAgIyBkZWZpbmUgdGhlIHNlcnZlciByb290LiBJdCB3aWxsIG92ZXJyaWRlIC1oCisgKiBBOjE3Mi4yMC4gICAgICAgICAjIEFsbG93IGFkZHJlc3MgZnJvbSAxNzIuMjAuMC4wLzE2CisgKiBBOjEwLjAuMC4wLzI1ICAgICAjIEFsbG93IGFueSBhZGRyZXNzIGZyb20gMTAuMC4wLjAtMTAuMC4wLjEyNworICogQToxMC4wLjAuMC8yNTUuMjU1LjI1NS4xMjggICMgQWxsb3cgYW55IGFkZHJlc3MgdGhhdCBwcmV2aW91cyBzZXQKKyAqIEE6MTI3LjAuMC4xICAgICAgICMgQWxsb3cgbG9jYWwgbG9vcGJhY2sgY29ubmVjdGlvbnMKKyAqIEQ6KiAgICAgICAgICAgICAgICMgRGVueSBmcm9tIG90aGVyIElQIGNvbm5lY3Rpb25zCisgKiBFNDA0Oi9wYXRoL2U0MDQuaHRtbCAjIC9wYXRoL2U0MDQuaHRtbCBpcyB0aGUgNDA0IChub3QgZm91bmQpIGVycm9yIHBhZ2UKKyAqIEk6aW5kZXguaHRtbCAgICAgICMgU2hvdyBpbmRleC5odG1sIHdoZW4gYSBkaXJlY3RvcnkgaXMgcmVxdWVzdGVkCisgKgorICogUDovdXJsOltodHRwOi8vXWhvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aAorICogICAgICAgICAgICAgICAgICAgIyBXaGVuIC91cmxYWFhYWFggaXMgcmVxdWVzdGVkLCByZXZlcnNlIHByb3h5CisgKiAgICAgICAgICAgICAgICAgICAjIGl0IHRvIGh0dHA6Ly9ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGhYWFhYWFgKKyAqCisgKiAvY2dpLWJpbjpmb286YmFyICAjIFJlcXVpcmUgdXNlciBmb28sIHB3ZCBiYXIgb24gdXJscyBzdGFydGluZyB3aXRoIC9jZ2ktYmluLworICogL2FkbTphZG1pbjpzZXR1cCAgIyBSZXF1aXJlIHVzZXIgYWRtaW4sIHB3ZCBzZXR1cCBvbiB1cmxzIHN0YXJ0aW5nIHdpdGggL2FkbS8KKyAqIC9hZG06dG9vcjpQYVNzV2QgICMgb3IgdXNlciB0b29yLCBwd2QgUGFTc1dkIG9uIHVybHMgc3RhcnRpbmcgd2l0aCAvYWRtLworICogLmF1OmF1ZGlvL2Jhc2ljICAgIyBhZGRpdGlvbmFsIG1pbWUgdHlwZSBmb3IgYXVkaW8uYXUgZmlsZXMKKyAqICoucGhwOi9wYXRoL3BocCAgICMgcnVuIHh4eC5waHAgdGhyb3VnaCBhbiBpbnRlcnByZXRlcgorICoKKyAqIEEvRCBtYXkgYmUgYXMgYS9kIG9yIGFsbG93L2RlbnkgLSBvbmx5IGZpcnN0IGNoYXIgbWF0dGVycy4KKyAqIERlbnkvQWxsb3cgSVAgbG9naWM6CisgKiAgLSBEZWZhdWx0IGlzIHRvIGFsbG93IGFsbCAoQWxsb3cgYWxsIChBOiopIGlzIGEgbm8tb3ApLgorICogIC0gRGVueSBydWxlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhbGxvdyBydWxlcy4KKyAqICAtICJEZW55IGFsbCIgcnVsZSAoRDoqKSBpcyBhcHBsaWVkIGxhc3QuCisgKgorICogRXhhbXBsZToKKyAqICAgMS4gQWxsb3cgb25seSBzcGVjaWZpZWQgYWRkcmVzc2VzCisgKiAgICAgQToxNzIuMjAgICAgICAgICAgIyBBbGxvdyBhbnkgYWRkcmVzcyB0aGF0IGJlZ2lucyB3aXRoIDE3Mi4yMC4KKyAqICAgICBBOjEwLjEwLiAgICAgICAgICAjIEFsbG93IGFueSBhZGRyZXNzIHRoYXQgYmVnaW5zIHdpdGggMTAuMTAuCisgKiAgICAgQToxMjcuMC4wLjEgICAgICAgIyBBbGxvdyBsb2NhbCBsb29wYmFjayBjb25uZWN0aW9ucworICogICAgIEQ6KiAgICAgICAgICAgICAgICMgRGVueSBmcm9tIG90aGVyIElQIGNvbm5lY3Rpb25zCisgKgorICogICAyLiBPbmx5IGRlbnkgc3BlY2lmaWVkIGFkZHJlc3NlcworICogICAgIEQ6MS4yLjMuICAgICAgICAjIGRlbnkgZnJvbSAxLjIuMy4wIC0gMS4yLjMuMjU1CisgKiAgICAgRDoyLjMuNC4gICAgICAgICMgZGVueSBmcm9tIDIuMy40LjAgLSAyLjMuNC4yNTUKKyAqICAgICBBOiogICAgICAgICAgICAgIyAob3B0aW9uYWwgbGluZSBhZGRlZCBmb3IgY2xhcml0eSkKKyAqCisgKiBJZiBhIHN1YiBkaXJlY3RvcnkgY29udGFpbnMgY29uZmlnIGZpbGUsIGl0IGlzIHBhcnNlZCBhbmQgbWVyZ2VkIHdpdGgKKyAqIGFueSBleGlzdGluZyBzZXR0aW5ncyBhcyBpZiBpdCB3YXMgYXBwZW5kZWQgdG8gdGhlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24uCisgKgorICogc3ViZGlyIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBzdWJkaXIgYW5kIHRodXMgY2Fubm90CisgKiBhZmZlY3QgdGhlIHBhcmVudCBydWxlcy4KKyAqCisgKiBOb3RlIHRoYXQgc2luY2UgdGhlIHN1YiBkaXIgaXMgcGFyc2VkIGluIHRoZSBmb3JrZWQgdGhyZWFkIHNlcnZpY2luZyB0aGUKKyAqIHN1YmRpciBodHRwIHJlcXVlc3QsIGFueSBtZXJnZSBpcyBkaXNjYXJkZWQgd2hlbiB0aGUgcHJvY2VzcyBleGl0cy4gIEFzIGEKKyAqIHJlc3VsdCwgdGhlIHN1YmRpciBzZXR0aW5ncyBvbmx5IGhhdmUgYSBsaWZldGltZSBvZiBhIHNpbmdsZSByZXF1ZXN0LgorICoKKyAqIEN1c3RvbSBlcnJvciBwYWdlcyBjYW4gY29udGFpbiBhbiBhYnNvbHV0ZSBwYXRoIG9yIGJlIHJlbGF0aXZlIHRvCisgKiAnaG9tZV9odHRwZCcuIEVycm9yIHBhZ2VzIGFyZSB0byBiZSBzdGF0aWMgZmlsZXMgKG5vIENHSSBvciBzY3JpcHQpLiBFcnJvcgorICogcGFnZSBjYW4gb25seSBiZSBkZWZpbmVkIGluIHRoZSByb290IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgYXJlIG5vdCB0YWtlbgorICogaW50byBhY2NvdW50IGluIGxvY2FsIChkaXJlY3RvcmllcykgY29uZmlnIGZpbGVzLgorICoKKyAqIElmIC1jIGlzIG5vdCBzZXQsIGFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIG9wZW4gdGhlIGRlZmF1bHQKKyAqIHJvb3QgY29uZmlndXJhdGlvbiBmaWxlLiAgSWYgLWMgaXMgc2V0IGFuZCB0aGUgZmlsZSBpcyBub3QgZm91bmQsIHRoZQorICogc2VydmVyIGV4aXRzIHdpdGggYW4gZXJyb3IuCisgKgorICovCisgLyogVE9ETzogdXNlIFRDUF9DT1JLLCBwYXJzZV9jb25maWcoKSAqLworCisvL3VzYWdlOiNkZWZpbmUgaHR0cGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaWZ2W3ZdXSIKKy8vdXNhZ2U6ICAgICAgICIgWy1jIENPTkZGSUxFXSIKKy8vdXNhZ2U6ICAgICAgICIgWy1wIFtJUDpdUE9SVF0iCisvL3VzYWdlOglJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCgiIFstdSBVU0VSWzpHUlBdXSIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoIiBbLXIgUkVBTE1dIikKKy8vdXNhZ2U6ICAgICAgICIgWy1oIEhPTUVdXG4iCisvL3VzYWdlOiAgICAgICAib3IgaHR0cGQgLWQvLWUiIElGX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUoIi8tbSIpICIgU1RSSU5HIgorLy91c2FnZTojZGVmaW5lIGh0dHBkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdGVuIGZvciBpbmNvbWluZyBIVFRQIHJlcXVlc3RzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1pCQlJbmV0ZCBtb2RlIgorLy91c2FnZTogICAgICJcbgktZgkJRG9uJ3QgZGFlbW9uaXplIgorLy91c2FnZTogICAgICJcbgktdlt2XQkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgW0lQOl1QT1JUCUJpbmQgdG8gSVA6UE9SVCAoZGVmYXVsdCAqOjgwKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKAorLy91c2FnZTogICAgICJcbgktdSBVU0VSWzpHUlBdCVNldCB1aWQvZ2lkIGFmdGVyIGJpbmRpbmcgdG8gcG9ydCIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoCisvL3VzYWdlOiAgICAgIlxuCS1yIFJFQUxNCUF1dGhlbnRpY2F0aW9uIFJlYWxtIGZvciBCYXNpYyBBdXRoZW50aWNhdGlvbiIpCisvL3VzYWdlOiAgICAgIlxuCS1oIEhPTUUJCUhvbWUgZGlyZWN0b3J5IChkZWZhdWx0IC4pIgorLy91c2FnZTogICAgICJcbgktYyBGSUxFCQlDb25maWd1cmF0aW9uIGZpbGUgKGRlZmF1bHQgey9ldGMsSE9NRX0vaHR0cGQuY29uZikiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KAorLy91c2FnZTogICAgICJcbgktbSBTVFJJTkcJTUQ1IGNyeXB0IFNUUklORyIpCisvL3VzYWdlOiAgICAgIlxuCS1lIFNUUklORwlIVE1MIGVuY29kZSBTVFJJTkciCisvL3VzYWdlOiAgICAgIlxuCS1kIFNUUklORwlVUkwgZGVjb2RlIFNUUklORyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFCisjIGluY2x1ZGUgPHN5cy9zZW5kZmlsZS5oPgorI2VuZGlmCisvKiBhbW91bnQgb2YgYnVmZmVyaW5nIGluIGEgcGlwZSAqLworI2lmbmRlZiBQSVBFX0JVRgorIyBkZWZpbmUgUElQRV9CVUYgNDA5NgorI2VuZGlmCisKKyNkZWZpbmUgREVCVUcgMAorCisjZGVmaW5lIElPQlVGX1NJWkUgODE5MgorI2lmIFBJUEVfQlVGID49IElPQlVGX1NJWkUKKyMgZXJyb3IgIlBJUEVfQlVGID49IElPQlVGX1NJWkUiCisjZW5kaWYKKworI2RlZmluZSBIRUFERVJfUkVBRF9USU1FT1VUIDYwCisKK3N0YXRpYyBjb25zdCBjaGFyIERFRkFVTFRfUEFUSF9IVFRQRF9DT05GW10gQUxJR04xID0gIi9ldGMiOworc3RhdGljIGNvbnN0IGNoYXIgSFRUUERfQ09ORltdIEFMSUdOMSA9ICJodHRwZC5jb25mIjsKK3N0YXRpYyBjb25zdCBjaGFyIEhUVFBfMjAwW10gQUxJR04xID0gIkhUVFAvMS4wIDIwMCBPS1xyXG4iOworc3RhdGljIGNvbnN0IGNoYXIgaW5kZXhfaHRtbFtdIEFMSUdOMSA9ICJpbmRleC5odG1sIjsKKwordHlwZWRlZiBzdHJ1Y3QgaGFzX25leHRfcHRyIHsKKwlzdHJ1Y3QgaGFzX25leHRfcHRyICpuZXh0OworfSBoYXNfbmV4dF9wdHI7CisKKy8qIE11c3QgaGF2ZSAibmV4dCIgYXMgYSBmaXJzdCBtZW1iZXIgKi8KK3R5cGVkZWYgc3RydWN0IEh0YWNjZXNzIHsKKwlzdHJ1Y3QgSHRhY2Nlc3MgKm5leHQ7CisJY2hhciAqYWZ0ZXJfY29sb247CisJY2hhciBiZWZvcmVfY29sb25bMV07ICAvKiByZWFsbHkgYmlnZ2VyLCBtdXN0IGJlIGxhc3QgKi8KK30gSHRhY2Nlc3M7CisKKy8qIE11c3QgaGF2ZSAibmV4dCIgYXMgYSBmaXJzdCBtZW1iZXIgKi8KK3R5cGVkZWYgc3RydWN0IEh0YWNjZXNzX0lQIHsKKwlzdHJ1Y3QgSHRhY2Nlc3NfSVAgKm5leHQ7CisJdW5zaWduZWQgaXA7CisJdW5zaWduZWQgbWFzazsKKwlpbnQgYWxsb3dfZGVueTsKK30gSHRhY2Nlc3NfSVA7CisKKy8qIE11c3QgaGF2ZSAibmV4dCIgYXMgYSBmaXJzdCBtZW1iZXIgKi8KK3R5cGVkZWYgc3RydWN0IEh0YWNjZXNzX1Byb3h5IHsKKwlzdHJ1Y3QgSHRhY2Nlc3NfUHJveHkgKm5leHQ7CisJY2hhciAqdXJsX2Zyb207CisJY2hhciAqaG9zdF9wb3J0OworCWNoYXIgKnVybF90bzsKK30gSHRhY2Nlc3NfUHJveHk7CisKK2VudW0geworCUhUVFBfT0sgPSAyMDAsCisJSFRUUF9QQVJUSUFMX0NPTlRFTlQgPSAyMDYsCisJSFRUUF9NT1ZFRF9URU1QT1JBUklMWSA9IDMwMiwKKwlIVFRQX0JBRF9SRVFVRVNUID0gNDAwLCAgICAgICAvKiBtYWxmb3JtZWQgc3ludGF4ICovCisJSFRUUF9VTkFVVEhPUklaRUQgPSA0MDEsIC8qIGF1dGhlbnRpY2F0aW9uIG5lZWRlZCwgcmVzcG9uZCB3aXRoIGF1dGggaGRyICovCisJSFRUUF9OT1RfRk9VTkQgPSA0MDQsCisJSFRUUF9GT1JCSURERU4gPSA0MDMsCisJSFRUUF9SRVFVRVNUX1RJTUVPVVQgPSA0MDgsCisJSFRUUF9OT1RfSU1QTEVNRU5URUQgPSA1MDEsICAgLyogdXNlZCBmb3IgdW5yZWNvZ25pemVkIHJlcXVlc3RzICovCisJSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IgPSA1MDAsCisJSFRUUF9DT05USU5VRSA9IDEwMCwKKyNpZiAwICAgLyogZnV0dXJlIHVzZSAqLworCUhUVFBfU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMSwKKwlIVFRQX0NSRUFURUQgPSAyMDEsCisJSFRUUF9BQ0NFUFRFRCA9IDIwMiwKKwlIVFRQX05PTl9BVVRIT1JJVEFUSVZFX0lORk8gPSAyMDMsCisJSFRUUF9OT19DT05URU5UID0gMjA0LAorCUhUVFBfTVVMVElQTEVfQ0hPSUNFUyA9IDMwMCwKKwlIVFRQX01PVkVEX1BFUk1BTkVOVExZID0gMzAxLAorCUhUVFBfTk9UX01PRElGSUVEID0gMzA0LAorCUhUVFBfUEFZTUVOVF9SRVFVSVJFRCA9IDQwMiwKKwlIVFRQX0JBRF9HQVRFV0FZID0gNTAyLAorCUhUVFBfU0VSVklDRV9VTkFWQUlMQUJMRSA9IDUwMywgLyogb3ZlcmxvYWQsIG1haW50ZW5hbmNlICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBodHRwX3Jlc3BvbnNlX3R5cGVbXSBBTElHTjIgPSB7CisJSFRUUF9PSywKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlIVFRQX1BBUlRJQUxfQ09OVEVOVCwKKyNlbmRpZgorCUhUVFBfTU9WRURfVEVNUE9SQVJJTFksCisJSFRUUF9SRVFVRVNUX1RJTUVPVVQsCisJSFRUUF9OT1RfSU1QTEVNRU5URUQsCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCUhUVFBfVU5BVVRIT1JJWkVELAorI2VuZGlmCisJSFRUUF9OT1RfRk9VTkQsCisJSFRUUF9CQURfUkVRVUVTVCwKKwlIVFRQX0ZPUkJJRERFTiwKKwlIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyNpZiAwICAgLyogbm90IGltcGxlbWVudGVkICovCisJSFRUUF9DUkVBVEVELAorCUhUVFBfQUNDRVBURUQsCisJSFRUUF9OT19DT05URU5ULAorCUhUVFBfTVVMVElQTEVfQ0hPSUNFUywKKwlIVFRQX01PVkVEX1BFUk1BTkVOVExZLAorCUhUVFBfTk9UX01PRElGSUVELAorCUhUVFBfQkFEX0dBVEVXQVksCisJSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmluZm87Cit9IGh0dHBfcmVzcG9uc2VbQVJSQVlfU0laRShodHRwX3Jlc3BvbnNlX3R5cGUpXSA9IHsKKwl7ICJPSyIsIE5VTEwgfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwl7ICJQYXJ0aWFsIENvbnRlbnQiLCBOVUxMIH0sCisjZW5kaWYKKwl7ICJGb3VuZCIsIE5VTEwgfSwKKwl7ICJSZXF1ZXN0IFRpbWVvdXQiLCAiTm8gcmVxdWVzdCBhcHBlYXJlZCB3aXRoaW4gNjAgc2Vjb25kcyIgfSwKKwl7ICJOb3QgSW1wbGVtZW50ZWQiLCAiVGhlIHJlcXVlc3RlZCBtZXRob2QgaXMgbm90IHJlY29nbml6ZWQiIH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCXsgIlVuYXV0aG9yaXplZCIsICIiIH0sCisjZW5kaWYKKwl7ICJOb3QgRm91bmQiLCAiVGhlIHJlcXVlc3RlZCBVUkwgd2FzIG5vdCBmb3VuZCIgfSwKKwl7ICJCYWQgUmVxdWVzdCIsICJVbnN1cHBvcnRlZCBtZXRob2QiIH0sCisJeyAiRm9yYmlkZGVuIiwgIiIgIH0sCisJeyAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiwgIkludGVybmFsIFNlcnZlciBFcnJvciIgfSwKKyNpZiAwICAgLyogbm90IGltcGxlbWVudGVkICovCisJeyAiQ3JlYXRlZCIgfSwKKwl7ICJBY2NlcHRlZCIgfSwKKwl7ICJObyBDb250ZW50IiB9LAorCXsgIk11bHRpcGxlIENob2ljZXMiIH0sCisJeyAiTW92ZWQgUGVybWFuZW50bHkiIH0sCisJeyAiTm90IE1vZGlmaWVkIiB9LAorCXsgIkJhZCBHYXRld2F5IiwgIiIgfSwKKwl7ICJTZXJ2aWNlIFVuYXZhaWxhYmxlIiwgIiIgfSwKKyNlbmRpZgorfTsKKworc3RydWN0IGdsb2JhbHMgeworCWludCB2ZXJib3NlOyAgICAgICAgICAgIC8qIG11c3QgYmUgaW50ICh1c2VkIGJ5IGdldG9wdDMyKSAqLworCXNtYWxsaW50IGZsZ19kZW55X2FsbDsKKworCXVuc2lnbmVkIHJtdF9pcDsgICAgICAgIC8qIHVzZWQgZm9yIElQLWJhc2VkIGFsbG93L2RlbnkgcnVsZXMgKi8KKwl0aW1lX3QgbGFzdF9tb2Q7CisJY2hhciAqcm10X2lwX3N0cjsgICAgICAgLyogZm9yICRSRU1PVEVfQUREUiBhbmQgJFJFTU9URV9QT1JUICovCisJY29uc3QgY2hhciAqYmluZF9hZGRyX29yX3BvcnQ7CisKKwljb25zdCBjaGFyICpnX3F1ZXJ5OworCWNvbnN0IGNoYXIgKm9wdF9jX2NvbmZpZ0ZpbGU7CisJY29uc3QgY2hhciAqaG9tZV9odHRwZDsKKwljb25zdCBjaGFyICppbmRleF9wYWdlOworCisJY29uc3QgY2hhciAqZm91bmRfbWltZV90eXBlOworCWNvbnN0IGNoYXIgKmZvdW5kX21vdmVkX3RlbXBvcmFyaWx5OworCUh0YWNjZXNzX0lQICppcF9hX2Q7ICAgIC8qIGNvbmZpZyBhbGxvdy9kZW55IGxpbmVzICovCisKKwlJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoY29uc3QgY2hhciAqZ19yZWFsbTspCisJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKGNoYXIgKnJlbW90ZXVzZXI7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKnJlZmVyZXI7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKnVzZXJfYWdlbnQ7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKmhvc3Q7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKmh0dHBfYWNjZXB0OykKKwlJRl9GRUFUVVJFX0hUVFBEX0NHSShjaGFyICpodHRwX2FjY2VwdF9sYW5ndWFnZTspCisKKwlvZmZfdCBmaWxlX3NpemU7ICAgICAgICAvKiAtMSAtIHVua25vd24gKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlvZmZfdCByYW5nZV9zdGFydDsKKwlvZmZfdCByYW5nZV9lbmQ7CisJb2ZmX3QgcmFuZ2VfbGVuOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJSHRhY2Nlc3MgKmdfYXV0aDsgICAgICAgLyogY29uZmlnIHVzZXI6cGFzc3dvcmQgbGluZXMgKi8KKyNlbmRpZgorCUh0YWNjZXNzICptaW1lX2E7ICAgICAgIC8qIGNvbmZpZyBtaW1lIHR5cGVzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwlIdGFjY2VzcyAqc2NyaXB0X2k7ICAgICAvKiBjb25maWcgc2NyaXB0IGludGVycHJldGVycyAqLworI2VuZGlmCisJY2hhciAqaW9idWY7ICAgICAgICAgICAgLyogW0lPQlVGX1NJWkVdICovCisjZGVmaW5lIGhkcl9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwljaGFyICpoZHJfcHRyOworCWludCBoZHJfY250OworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTCisJY29uc3QgY2hhciAqaHR0cF9lcnJvcl9wYWdlW0FSUkFZX1NJWkUoaHR0cF9yZXNwb25zZV90eXBlKV07CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCUh0YWNjZXNzX1Byb3h5ICpwcm94eTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0daSVAKKwkvKiBjbGllbnQgY2FuIGhhbmRsZSBnemlwIC8gd2UgYXJlIGdvaW5nIHRvIHNlbmQgZ3ppcCAqLworCXNtYWxsaW50IGNvbnRlbnRfZ3ppcDsKKyNlbmRpZgorfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAoRy52ZXJib3NlICAgICAgICAgICkKKyNkZWZpbmUgZmxnX2RlbnlfYWxsICAgICAgKEcuZmxnX2RlbnlfYWxsICAgICApCisjZGVmaW5lIHJtdF9pcCAgICAgICAgICAgIChHLnJtdF9pcCAgICAgICAgICAgKQorI2RlZmluZSBiaW5kX2FkZHJfb3JfcG9ydCAoRy5iaW5kX2FkZHJfb3JfcG9ydCkKKyNkZWZpbmUgZ19xdWVyeSAgICAgICAgICAgKEcuZ19xdWVyeSAgICAgICAgICApCisjZGVmaW5lIG9wdF9jX2NvbmZpZ0ZpbGUgIChHLm9wdF9jX2NvbmZpZ0ZpbGUgKQorI2RlZmluZSBob21lX2h0dHBkICAgICAgICAoRy5ob21lX2h0dHBkICAgICAgICkKKyNkZWZpbmUgaW5kZXhfcGFnZSAgICAgICAgKEcuaW5kZXhfcGFnZSAgICAgICApCisjZGVmaW5lIGZvdW5kX21pbWVfdHlwZSAgIChHLmZvdW5kX21pbWVfdHlwZSAgKQorI2RlZmluZSBmb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSAoRy5mb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSkKKyNkZWZpbmUgbGFzdF9tb2QgICAgICAgICAgKEcubGFzdF9tb2QgICAgICAgICApCisjZGVmaW5lIGlwX2FfZCAgICAgICAgICAgIChHLmlwX2FfZCAgICAgICAgICAgKQorI2RlZmluZSBnX3JlYWxtICAgICAgICAgICAoRy5nX3JlYWxtICAgICAgICAgICkKKyNkZWZpbmUgcmVtb3RldXNlciAgICAgICAgKEcucmVtb3RldXNlciAgICAgICApCisjZGVmaW5lIHJlZmVyZXIgICAgICAgICAgIChHLnJlZmVyZXIgICAgICAgICAgKQorI2RlZmluZSB1c2VyX2FnZW50ICAgICAgICAoRy51c2VyX2FnZW50ICAgICAgICkKKyNkZWZpbmUgaG9zdCAgICAgICAgICAgICAgKEcuaG9zdCAgICAgICAgICAgICApCisjZGVmaW5lIGh0dHBfYWNjZXB0ICAgICAgIChHLmh0dHBfYWNjZXB0ICAgICAgKQorI2RlZmluZSBodHRwX2FjY2VwdF9sYW5ndWFnZSAoRy5odHRwX2FjY2VwdF9sYW5ndWFnZSkKKyNkZWZpbmUgZmlsZV9zaXplICAgICAgICAgKEcuZmlsZV9zaXplICAgICAgICApCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUkFOR0VTCisjZGVmaW5lIHJhbmdlX3N0YXJ0ICAgICAgIChHLnJhbmdlX3N0YXJ0ICAgICAgKQorI2RlZmluZSByYW5nZV9lbmQgICAgICAgICAoRy5yYW5nZV9lbmQgICAgICAgICkKKyNkZWZpbmUgcmFuZ2VfbGVuICAgICAgICAgKEcucmFuZ2VfbGVuICAgICAgICApCisjZWxzZQorZW51bSB7CisJcmFuZ2Vfc3RhcnQgPSAwLAorCXJhbmdlX2VuZCA9IE1BWElOVChvZmZfdCkgLSAxLAorCXJhbmdlX2xlbiA9IE1BWElOVChvZmZfdCksCit9OworI2VuZGlmCisjZGVmaW5lIHJtdF9pcF9zdHIgICAgICAgIChHLnJtdF9pcF9zdHIgICAgICAgKQorI2RlZmluZSBnX2F1dGggICAgICAgICAgICAoRy5nX2F1dGggICAgICAgICAgICkKKyNkZWZpbmUgbWltZV9hICAgICAgICAgICAgKEcubWltZV9hICAgICAgICAgICApCisjZGVmaW5lIHNjcmlwdF9pICAgICAgICAgIChHLnNjcmlwdF9pICAgICAgICAgKQorI2RlZmluZSBpb2J1ZiAgICAgICAgICAgICAoRy5pb2J1ZiAgICAgICAgICAgICkKKyNkZWZpbmUgaGRyX3B0ciAgICAgICAgICAgKEcuaGRyX3B0ciAgICAgICAgICApCisjZGVmaW5lIGhkcl9jbnQgICAgICAgICAgIChHLmhkcl9jbnQgICAgICAgICAgKQorI2RlZmluZSBodHRwX2Vycm9yX3BhZ2UgICAoRy5odHRwX2Vycm9yX3BhZ2UgICkKKyNkZWZpbmUgcHJveHkgICAgICAgICAgICAgKEcucHJveHkgICAgICAgICAgICApCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfR1pJUAorIyBkZWZpbmUgY29udGVudF9nemlwICAgICAoRy5jb250ZW50X2d6aXAgICAgICkKKyNlbHNlCisjIGRlZmluZSBjb250ZW50X2d6aXAgICAgIDAKKyNlbmRpZgorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUlGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSChnX3JlYWxtID0gIldlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24iOykgXAorCWJpbmRfYWRkcl9vcl9wb3J0ID0gIjgwIjsgXAorCWluZGV4X3BhZ2UgPSBpbmRleF9odG1sOyBcCisJZmlsZV9zaXplID0gLTE7IFwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBTVFJOQ0FTRUNNUChhLCBzdHIpIHN0cm5jYXNlY21wKChhKSwgKHN0ciksIHNpemVvZihzdHIpLTEpCisKKy8qIFByb3RvdHlwZXMgKi8KK2VudW0geworCVNFTkRfSEVBREVSUyAgICAgPSAoMSA8PCAwKSwKKwlTRU5EX0JPRFkgICAgICAgID0gKDEgPDwgMSksCisJU0VORF9IRUFERVJTX0FORF9CT0RZID0gU0VORF9IRUFERVJTICsgU0VORF9CT0RZLAorfTsKK3N0YXRpYyB2b2lkIHNlbmRfZmlsZV9hbmRfZXhpdChjb25zdCBjaGFyICp1cmwsIGludCB3aGF0KSBOT1JFVFVSTjsKKworc3RhdGljIHZvaWQgZnJlZV9sbGlzdChoYXNfbmV4dF9wdHIgKipwcHRyKQoreworCWhhc19uZXh0X3B0ciAqY3VyID0gKnBwdHI7CisJd2hpbGUgKGN1cikgeworCQloYXNfbmV4dF9wdHIgKnQgPSBjdXI7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwkJZnJlZSh0KTsKKwl9CisJKnBwdHIgPSBOVUxMOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIGZyZWVfSHRhY2Nlc3NfbGlzdChIdGFjY2VzcyAqKnBwdHIpCit7CisJZnJlZV9sbGlzdCgoaGFzX25leHRfcHRyKiopcHB0cik7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgZnJlZV9IdGFjY2Vzc19JUF9saXN0KEh0YWNjZXNzX0lQICoqcHB0cikKK3sKKwlmcmVlX2xsaXN0KChoYXNfbmV4dF9wdHIqKilwcHRyKTsKK30KKworLyogUmV0dXJucyBwcmVzdW1lZCBtYXNrIHdpZHRoIGluIGJpdHMgb3IgPCAwIG9uIGVycm9yLgorICogVXBkYXRlcyBzdHJwLCBzdG9yZXMgSVAgYXQgcHJvdmlkZWQgcG9pbnRlciAqLworc3RhdGljIGludCBzY2FuX2lwKGNvbnN0IGNoYXIgKipzdHJwLCB1bnNpZ25lZCAqaXBwLCB1bnNpZ25lZCBjaGFyIGVuZGMpCit7CisJY29uc3QgY2hhciAqcCA9ICpzdHJwOworCWludCBhdXRvX21hc2sgPSA4OworCXVuc2lnbmVkIGlwID0gMDsKKwlpbnQgajsKKworCWlmICgqcCA9PSAnLycpCisJCXJldHVybiAtYXV0b19tYXNrOworCisJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQl1bnNpZ25lZCBvY3RldDsKKworCQlpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKSAmJiAqcCAhPSAnLycgJiYgKnApCisJCQlyZXR1cm4gLWF1dG9fbWFzazsKKwkJb2N0ZXQgPSAwOworCQl3aGlsZSAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykgeworCQkJb2N0ZXQgKj0gMTA7CisJCQlvY3RldCArPSAqcCAtICcwJzsKKwkJCWlmIChvY3RldCA+IDI1NSkKKwkJCQlyZXR1cm4gLWF1dG9fbWFzazsKKwkJCXArKzsKKwkJfQorCQlpZiAoKnAgPT0gJy4nKQorCQkJcCsrOworCQlpZiAoKnAgIT0gJy8nICYmICpwKQorCQkJYXV0b19tYXNrICs9IDg7CisJCWlwID0gKGlwIDw8IDgpIHwgb2N0ZXQ7CisJfQorCWlmICgqcCkgeworCQlpZiAoKnAgIT0gZW5kYykKKwkJCXJldHVybiAtYXV0b19tYXNrOworCQlwKys7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJcmV0dXJuIC1hdXRvX21hc2s7CisJfQorCSppcHAgPSBpcDsKKwkqc3RycCA9IHA7CisJcmV0dXJuIGF1dG9fbWFzazsKK30KKworLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIFN0b3JlcyBJUCBhbmQgbWFzayBhdCBwcm92aWRlZCBwb2ludGVycyAqLworc3RhdGljIGludCBzY2FuX2lwX21hc2soY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCAqaXBwLCB1bnNpZ25lZCAqbWFza3ApCit7CisJaW50IGk7CisJdW5zaWduZWQgbWFzazsKKwljaGFyICpwOworCisJaSA9IHNjYW5faXAoJnN0ciwgaXBwLCAnLycpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIGk7CisKKwlpZiAoKnN0cikgeworCQkvKiB0aGVyZSBpcyAveHh4IGFmdGVyIGRvdHRlZC1JUCBhZGRyZXNzICovCisJCWkgPSBiYl9zdHJ0b3Uoc3RyLCAmcCwgMTApOworCQlpZiAoKnAgPT0gJy4nKSB7CisJCQkvKiAneHh4JyBpdHNlbGYgaXMgZG90dGVkLUlQIG1hc2ssIHBhcnNlIGl0ICovCisJCQkvKiAocmV0dXJuIDAgKHN1Y2Nlc3MpIG9ubHkgaWYgaXQgaGFzIE4uTi5OLk4gZm9ybSkgKi8KKwkJCXJldHVybiBzY2FuX2lwKCZzdHIsIG1hc2twLCAnXDAnKSAtIDMyOworCQl9CisJCWlmICgqcCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaSA+IDMyKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkKSA9PSA0ICYmIGkgPT0gMzIpIHsKKwkJLyogbWFzayA+Pj0gMzIgYmVsb3cgbWF5IG5vdCB3b3JrICovCisJCW1hc2sgPSAwOworCX0gZWxzZSB7CisJCW1hc2sgPSAweGZmZmZmZmZmOworCQltYXNrID4+PSBpOworCX0KKwkvKiBpID09IDAgLT4gKm1hc2twID0gMHgwMDAwMDAwMAorCSAqIGkgPT0gMSAtPiAqbWFza3AgPSAweDgwMDAwMDAwCisJICogaSA9PSA0IC0+ICptYXNrcCA9IDB4ZjAwMDAwMDAKKwkgKiBpID09IDMxIC0+ICptYXNrcCA9IDB4ZmZmZmZmZmUKKwkgKiBpID09IDMyIC0+ICptYXNrcCA9IDB4ZmZmZmZmZmYgKi8KKwkqbWFza3AgPSAodWludDMyX3QpKH5tYXNrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvIGluLW1lbW9yeSBsaW5rZWQgbGlzdC4KKyAqCisgKiBBbnkgcHJldmlvdXMgSVAgcnVsZXMgYXJlIGRpc2NhcmRlZC4KKyAqIElmIHRoZSBmbGFnIGFyZ3VtZW50IGlzIG5vdCBTVUJESVJfUEFSU0UgdGhlbiBhbGwgL3BhdGggYW5kIG1pbWUgcnVsZXMKKyAqIGFyZSBhbHNvIGRpc2NhcmRlZC4gIFRoYXQgaXMsIHByZXZpb3VzIHNldHRpbmdzIGFyZSByZXRhaW5lZCBpZiBmbGFnIGlzCisgKiBTVUJESVJfUEFSU0UuCisgKiBFcnJvciBwYWdlcyBhcmUgb25seSBwYXJzZWQgb24gdGhlIG1haW4gY29uZmlnIGZpbGUuCisgKgorICogcGF0aCAgIFBhdGggd2hlcmUgdG8gbG9vayBmb3IgaHR0cGQuY29uZiAod2l0aG91dCBmaWxlbmFtZSkuCisgKiBmbGFnICAgVHlwZSBvZiB0aGUgcGFyc2UgcmVxdWVzdC4KKyAqLworLyogZmxhZyBwYXJhbTogKi8KK2VudW0geworCUZJUlNUX1BBUlNFICAgID0gMCwgLyogcGF0aCB3aWxsIGJlICIvZXRjIiAqLworCVNJR05BTEVEX1BBUlNFID0gMSwgLyogcGF0aCB3aWxsIGJlICIvZXRjIiAqLworCVNVQkRJUl9QQVJTRSAgID0gMiwgLyogcGF0aCB3aWxsIGJlIGRlcml2ZWQgZnJvbSBVUkwgKi8KK307CitzdGF0aWMgdm9pZCBwYXJzZV9jb25mKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFnKQoreworCS8qIGludGVybmFsbHkgdXNlZCBleHRyYSBmbGFnIHN0YXRlICovCisJZW51bSB7IFRSWV9DVVJESVJfUEFSU0UgPSAzIH07CisKKwlGSUxFICpmOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWNoYXIgYnVmWzE2MF07CisKKwkvKiBkaXNjYXJkIG9sZCBydWxlcyAqLworCWZyZWVfSHRhY2Nlc3NfSVBfbGlzdCgmaXBfYV9kKTsKKwlmbGdfZGVueV9hbGwgPSAwOworCS8qIHJldGFpbiBwcmV2aW91cyBhdXRoIGFuZCBtaW1lIGNvbmZpZyBvbmx5IGZvciBzdWJkaXIgcGFyc2UgKi8KKwlpZiAoZmxhZyAhPSBTVUJESVJfUEFSU0UpIHsKKwkJZnJlZV9IdGFjY2Vzc19saXN0KCZtaW1lX2EpOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkJZnJlZV9IdGFjY2Vzc19saXN0KCZnX2F1dGgpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwkJZnJlZV9IdGFjY2Vzc19saXN0KCZzY3JpcHRfaSk7CisjZW5kaWYKKwl9CisKKwlmaWxlbmFtZSA9IG9wdF9jX2NvbmZpZ0ZpbGU7CisJaWYgKGZsYWcgPT0gU1VCRElSX1BBUlNFIHx8IGZpbGVuYW1lID09IE5VTEwpIHsKKwkJZmlsZW5hbWUgPSBhbGxvY2Eoc3RybGVuKHBhdGgpICsgc2l6ZW9mKEhUVFBEX0NPTkYpICsgMik7CisJCXNwcmludGYoKGNoYXIgKilmaWxlbmFtZSwgIiVzLyVzIiwgcGF0aCwgSFRUUERfQ09ORik7CisJfQorCisJd2hpbGUgKChmID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpKSA9PSBOVUxMKSB7CisJCWlmIChmbGFnID49IFNVQkRJUl9QQVJTRSkgeyAvKiBTVUJESVIgb3IgVFJZX0NVUkRJUiAqLworCQkJLyogY29uZmlnIGZpbGUgbm90IGZvdW5kLCBubyBjaGFuZ2VzIHRvIGNvbmZpZyAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChmbGFnID09IEZJUlNUX1BBUlNFKSB7CisJCQkvKiAtYyBDT05GRklMRSBnaXZlbiwgYnV0IENPTkZGSUxFIGRvZXNuJ3QgZXhpc3Q/ICovCisJCQlpZiAob3B0X2NfY29uZmlnRmlsZSkKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKG9wdF9jX2NvbmZpZ0ZpbGUpOworCQkJLyogZWxzZTogbm8gLWMsIHRodXMgd2UgbG9va2VkIGF0IC9ldGMvaHR0cGQuY29uZiwKKwkJCSAqIGFuZCBpdCdzIG5vdCB0aGVyZS4gdHJ5IC4vaHR0cGQuY29uZjogKi8KKwkJfQorCQlmbGFnID0gVFJZX0NVUkRJUl9QQVJTRTsKKwkJZmlsZW5hbWUgPSBIVFRQRF9DT05GOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkvKiBpbiAiL2ZpbGU6dXNlcjpwYXNzIiBsaW5lcywgd2UgcHJlcGVuZCBwYXRoIGluIHN1YmRpcnMgKi8KKwlpZiAoZmxhZyAhPSBTVUJESVJfUEFSU0UpCisJCXBhdGggPSAiIjsKKyNlbmRpZgorCS8qIFRoZSBsaW5lcyBjYW4gYmU6CisJICoKKwkgKiBJOmRlZmF1bHRfaW5kZXhfZmlsZQorCSAqIEg6aHR0cF9ob21lCisJICogW0FEXTpJUFsvbWFza10gICAjIGFsbG93L2RlbnksICogZm9yIHdpbGRjYXJkCisJICogRW5ubjplcnJvci5odG1sICAjIGVycm9yIHBhZ2UgZm9yIHN0YXR1cyBubm4KKwkgKiBQOi91cmw6W2h0dHA6Ly9daG9zdG5hbWVbOnBvcnRdL25ldy9wYXRoICMgcmV2ZXJzZSBwcm94eQorCSAqIC5leHQ6bWltZS90eXBlICAgIyBtaW1lIHR5cGUKKwkgKiAqLnBocDovcGF0aC9waHAgICMgcnVuIHh4eC5waHAgdGhyb3VnaCBhbiBpbnRlcnByZXRlcgorCSAqIC9maWxlOnVzZXI6cGFzcyAgIyB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKwkgKi8KKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBzdHJsZW5fYnVmOworCQl1bnNpZ25lZCBjaGFyIGNoOworCQljaGFyICphZnRlcl9jb2xvbjsKKworCQl7IC8qIHJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgYW5kICMgY29tbWVudHMgKi8KKwkJCWNoYXIgKnAsICpwMDsKKworCQkJcDAgPSBidWY7CisJCQkvKiBza2lwIG5vbi13aGl0ZXNwYWNlIGJlZ2lubmluZy4gT2Z0ZW4gdGhlIHdob2xlIGxpbmUKKwkJCSAqIGlzIG5vbi13aGl0ZXNwYWNlLiBXZSB3YW50IHRoaXMgY2FzZSB0byB3b3JrIGZhc3QsCisJCQkgKiB3aXRob3V0IG5lZWRsZXNzIGNvcHlpbmcsIHRoZXJlZm9yZSB3ZSBkb24ndCBtZXJnZQorCQkJICogdGhpcyBvcGVyYXRpb24gaW50byBuZXh0IHdoaWxlIGxvb3AuICovCisJCQl3aGlsZSAoKGNoID0gKnAwKSAhPSAnXDAnICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJyMnCisJCQkgJiYgY2ggIT0gJyAnICYmIGNoICE9ICdcdCcKKwkJCSkgeworCQkJCXAwKys7CisJCQl9CisJCQlwID0gcDA7CisJCQkvKiBpZiB3ZSBlbnRlciB0aGlzIGxvb3AsIHdlIGhhdmUgc29tZSB3aGl0ZXNwYWNlLgorCQkJICogZGlzY2FyZCBpdCAqLworCQkJd2hpbGUgKGNoICE9ICdcMCcgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnIycpIHsKKwkJCQlpZiAoY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKKwkJCQkJKnArKyA9IGNoOworCQkJCX0KKwkJCQljaCA9ICorK3AwOworCQkJfQorCQkJKnAgPSAnXDAnOworCQkJc3RybGVuX2J1ZiA9IHAgLSBidWY7CisJCQlpZiAoc3RybGVuX2J1ZiA9PSAwKQorCQkJCWNvbnRpbnVlOyAvKiBlbXB0eSBsaW5lICovCisJCX0KKworCQlhZnRlcl9jb2xvbiA9IHN0cmNocihidWYsICc6Jyk7CisJCS8qIHN0cmFuZ2UgbGluZT8gKi8KKwkJaWYgKGFmdGVyX2NvbG9uID09IE5VTEwgfHwgKisrYWZ0ZXJfY29sb24gPT0gJ1wwJykKKwkJCWdvdG8gY29uZmlnX2Vycm9yOworCisJCWNoID0gKGJ1ZlswXSAmIH4weDIwKTsgLyogdG91cHBlciBpZiBpdCdzIGEgbGV0dGVyICovCisKKwkJaWYgKGNoID09ICdJJykgeworCQkJaWYgKGluZGV4X3BhZ2UgIT0gaW5kZXhfaHRtbCkKKwkJCQlmcmVlKChjaGFyKilpbmRleF9wYWdlKTsKKwkJCWluZGV4X3BhZ2UgPSB4c3RyZHVwKGFmdGVyX2NvbG9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZG8gbm90IGFsbG93IGp1bXBpbmcgYXJvdW5kIHVzaW5nIEggaW4gc3ViZGlyJ3MgY29uZmlncyAqLworCQlpZiAoZmxhZyA9PSBGSVJTVF9QQVJTRSAmJiBjaCA9PSAnSCcpIHsKKwkJCWhvbWVfaHR0cGQgPSB4c3RyZHVwKGFmdGVyX2NvbG9uKTsKKwkJCXhjaGRpcihob21lX2h0dHBkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNoID09ICdBJyB8fCBjaCA9PSAnRCcpIHsKKwkJCUh0YWNjZXNzX0lQICpwaXA7CisKKwkJCWlmICgqYWZ0ZXJfY29sb24gPT0gJyonKSB7CisJCQkJaWYgKGNoID09ICdEJykgeworCQkJCQkvKiBtZW1vcml6ZSAiZGVueSBhbGwiICovCisJCQkJCWZsZ19kZW55X2FsbCA9IDE7CisJCQkJfQorCQkJCS8qIHNraXAgYXNzdW1lZCAiQToqIiwgaXQgaXMgYSBkZWZhdWx0IGFueXdheSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogc3RvcmUgImFsbG93L2RlbnkgSVAvbWFzayIgbGluZSAqLworCQkJcGlwID0geHphbGxvYyhzaXplb2YoKnBpcCkpOworCQkJaWYgKHNjYW5faXBfbWFzayhhZnRlcl9jb2xvbiwgJnBpcC0+aXAsICZwaXAtPm1hc2spKSB7CisJCQkJLyogSVB7L21hc2t9IHN5bnRheCBlcnJvciBkZXRlY3RlZCwgcHJvdGVjdCBhbGwgKi8KKwkJCQljaCA9ICdEJzsKKwkJCQlwaXAtPm1hc2sgPSAwOworCQkJfQorCQkJcGlwLT5hbGxvd19kZW55ID0gY2g7CisJCQlpZiAoY2ggPT0gJ0QnKSB7CisJCQkJLyogRGVueTpmcm9tX0lQIC0gcHJlcGVuZCAqLworCQkJCXBpcC0+bmV4dCA9IGlwX2FfZDsKKwkJCQlpcF9hX2QgPSBwaXA7CisJCQl9IGVsc2UgeworCQkJCS8qIEE6ZnJvbV9JUCAtIGFwcGVuZCAodGh1cyBhbGwgRCdzIHByZWNlZGVzIEEncykgKi8KKwkJCQlIdGFjY2Vzc19JUCAqcHJldl9JUCA9IGlwX2FfZDsKKwkJCQlpZiAocHJldl9JUCA9PSBOVUxMKSB7CisJCQkJCWlwX2FfZCA9IHBpcDsKKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAocHJldl9JUC0+bmV4dCkKKwkJCQkJCXByZXZfSVAgPSBwcmV2X0lQLT5uZXh0OworCQkJCQlwcmV2X0lQLT5uZXh0ID0gcGlwOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUworCQlpZiAoZmxhZyA9PSBGSVJTVF9QQVJTRSAmJiBjaCA9PSAnRScpIHsKKwkJCXVuc2lnbmVkIGk7CisJCQlpbnQgc3RhdHVzID0gYXRvaShidWYgKyAxKTsgLyogZXJyb3Igc3RhdHVzIGNvZGUgKi8KKworCQkJaWYgKHN0YXR1cyA8IEhUVFBfQ09OVElOVUUpIHsKKwkJCQlnb3RvIGNvbmZpZ19lcnJvcjsKKwkJCX0KKwkJCS8qIHRoZW4gZXJyb3IgcGFnZTsgZmluZCBtYXRjaGluZyBzdGF0dXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh0dHBfcmVzcG9uc2VfdHlwZSk7IGkrKykgeworCQkJCWlmIChodHRwX3Jlc3BvbnNlX3R5cGVbaV0gPT0gc3RhdHVzKSB7CisJCQkJCS8qIFdlIGNoZGlyIHRvIGhvbWVfaHR0cGQsIHRodXMgbm8gbmVlZCB0bworCQkJCQkgKiBjb25jYXRfcGF0aF9maWxlKGhvbWVfaHR0cGQsIGFmdGVyX2NvbG9uKQorCQkJCQkgKiBoZXJlICovCisJCQkJCWh0dHBfZXJyb3JfcGFnZVtpXSA9IHhzdHJkdXAoYWZ0ZXJfY29sb24pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCQlpZiAoZmxhZyA9PSBGSVJTVF9QQVJTRSAmJiBjaCA9PSAnUCcpIHsKKwkJCS8qIFA6L3VybDpbaHR0cDovL11ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGggKi8KKwkJCWNoYXIgKnVybF9mcm9tLCAqaG9zdF9wb3J0LCAqdXJsX3RvOworCQkJSHRhY2Nlc3NfUHJveHkgKnByb3h5X2VudHJ5OworCisJCQl1cmxfZnJvbSA9IGFmdGVyX2NvbG9uOworCQkJaG9zdF9wb3J0ID0gc3RyY2hyKGFmdGVyX2NvbG9uLCAnOicpOworCQkJaWYgKGhvc3RfcG9ydCA9PSBOVUxMKSB7CisJCQkJZ290byBjb25maWdfZXJyb3I7CisJCQl9CisJCQkqaG9zdF9wb3J0KysgPSAnXDAnOworCQkJaWYgKHN0cm5jbXAoaG9zdF9wb3J0LCAiaHR0cDovLyIsIDcpID09IDApCisJCQkJaG9zdF9wb3J0ICs9IDc7CisJCQlpZiAoKmhvc3RfcG9ydCA9PSAnXDAnKSB7CisJCQkJZ290byBjb25maWdfZXJyb3I7CisJCQl9CisJCQl1cmxfdG8gPSBzdHJjaHIoaG9zdF9wb3J0LCAnLycpOworCQkJaWYgKHVybF90byA9PSBOVUxMKSB7CisJCQkJZ290byBjb25maWdfZXJyb3I7CisJCQl9CisJCQkqdXJsX3RvID0gJ1wwJzsKKwkJCXByb3h5X2VudHJ5ID0geHphbGxvYyhzaXplb2YoKnByb3h5X2VudHJ5KSk7CisJCQlwcm94eV9lbnRyeS0+dXJsX2Zyb20gPSB4c3RyZHVwKHVybF9mcm9tKTsKKwkJCXByb3h5X2VudHJ5LT5ob3N0X3BvcnQgPSB4c3RyZHVwKGhvc3RfcG9ydCk7CisJCQkqdXJsX3RvID0gJy8nOworCQkJcHJveHlfZW50cnktPnVybF90byA9IHhzdHJkdXAodXJsX3RvKTsKKwkJCXByb3h5X2VudHJ5LT5uZXh0ID0gcHJveHk7CisJCQlwcm94eSA9IHByb3h5X2VudHJ5OworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQkvKiB0aGUgcmVzdCBvZiBkaXJlY3RpdmVzIGFyZSBub24tYWxwaGFiZXRpYywKKwkJICogbXVzdCBhdm9pZCB1c2luZyAidG91cHBlcidlZCIgY2ggKi8KKwkJY2ggPSBidWZbMF07CisKKwkJaWYgKGNoID09ICcuJyAvKiAiLmV4dDptaW1lL3R5cGUiICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwkJIHx8IChjaCA9PSAnKicgJiYgYnVmWzFdID09ICcuJykgLyogIioucGhwOi9wYXRoL3BocCIgKi8KKyNlbmRpZgorCQkpIHsKKwkJCWNoYXIgKnA7CisJCQlIdGFjY2VzcyAqY3VyOworCisJCQljdXIgPSB4emFsbG9jKHNpemVvZigqY3VyKSAvKiBpbmNsdWRlcyBzcGFjZSBmb3IgTlVMICovICsgc3RybGVuX2J1Zik7CisJCQlzdHJjcHkoY3VyLT5iZWZvcmVfY29sb24sIGJ1Zik7CisJCQlwID0gY3VyLT5iZWZvcmVfY29sb24gKyAoYWZ0ZXJfY29sb24gLSBidWYpOworCQkJcFstMV0gPSAnXDAnOworCQkJY3VyLT5hZnRlcl9jb2xvbiA9IHA7CisJCQlpZiAoY2ggPT0gJy4nKSB7CisJCQkJLyogLm1pbWUgbGluZTogcHJlcGVuZCB0byBtaW1lX2EgbGlzdCAqLworCQkJCWN1ci0+bmV4dCA9IG1pbWVfYTsKKwkJCQltaW1lX2EgPSBjdXI7CisJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwkJCWVsc2UgeworCQkJCS8qIHNjcmlwdCBpbnRlcnByZXRlciBsaW5lOiBwcmVwZW5kIHRvIHNjcmlwdF9pIGxpc3QgKi8KKwkJCQljdXItPm5leHQgPSBzY3JpcHRfaTsKKwkJCQlzY3JpcHRfaSA9IGN1cjsKKwkJCX0KKyNlbmRpZgorCQkJY29udGludWU7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkJaWYgKGNoID09ICcvJykgeyAvKiAiL2ZpbGU6dXNlcjpwYXNzIiAqLworCQkJY2hhciAqcDsKKwkJCUh0YWNjZXNzICpjdXI7CisJCQl1bnNpZ25lZCBmaWxlX2xlbjsKKworCQkJLyogbm90ZTogcGF0aCBpcyAiIiB1bmxlc3Mgd2UgYXJlIGluIFNVQkRJUiBwYXJzZSwKKwkJCSAqIG90aGVyd2lzZSBpdCBkb2VzIE5PVCBzdGFydCB3aXRoICIvIiAqLworCQkJY3VyID0geHphbGxvYyhzaXplb2YoKmN1cikgLyogaW5jbHVkZXMgc3BhY2UgZm9yIE5VTCAqLworCQkJCSsgMSArIHN0cmxlbihwYXRoKQorCQkJCSsgc3RybGVuX2J1ZgorCQkJCSk7CisJCQkvKiBmb3JtICIvcGF0aC9maWxlIiAqLworCQkJc3ByaW50ZihjdXItPmJlZm9yZV9jb2xvbiwgIi8lcyUuKnMiLAorCQkJCXBhdGgsCisJCQkJKGludCkgKGFmdGVyX2NvbG9uIC0gYnVmIC0gMSksIC8qIGluY2x1ZGVzICIvIiwgYnV0IG5vdCAiOiIgKi8KKwkJCQlidWYpOworCQkJLyogY2Fub25pY2FsaXplIGl0ICovCisJCQlwID0gYmJfc2ltcGxpZnlfYWJzX3BhdGhfaW5wbGFjZShjdXItPmJlZm9yZV9jb2xvbik7CisJCQlmaWxlX2xlbiA9IHAgLSBjdXItPmJlZm9yZV9jb2xvbjsKKwkJCS8qIGFkZCAidXNlcjpwYXNzIiBhZnRlciBOVUwgKi8KKwkJCXN0cmNweSgrK3AsIGFmdGVyX2NvbG9uKTsKKwkJCWN1ci0+YWZ0ZXJfY29sb24gPSBwOworCisJCQkvKiBpbnNlcnQgY3VyIGludG8gZ19hdXRoICovCisJCQkvKiBnX2F1dGggaXMgc29ydGVkIGJ5IGRlY3JlYXNlZCBmaWxlbmFtZSBsZW5ndGggKi8KKwkJCXsKKwkJCQlIdGFjY2VzcyAqYXV0aCwgKiphdXRocDsKKworCQkJCWF1dGhwID0gJmdfYXV0aDsKKwkJCQl3aGlsZSAoKGF1dGggPSAqYXV0aHApICE9IE5VTEwpIHsKKwkJCQkJaWYgKGZpbGVfbGVuID49IHN0cmxlbihhdXRoLT5iZWZvcmVfY29sb24pKSB7CisJCQkJCQkvKiBpbnNlcnQgY3VyIGJlZm9yZSBhdXRoICovCisJCQkJCQljdXItPm5leHQgPSBhdXRoOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYXV0aHAgPSAmYXV0aC0+bmV4dDsKKwkJCQl9CisJCQkJKmF1dGhwID0gY3VyOworCQkJfQorCQkJY29udGludWU7CisJCX0KKyNlbmRpZiAvKiBCQVNJQ19BVVRIICovCisKKwkJLyogdGhlIGxpbmUgaXMgbm90IHJlY29nbml6ZWQgKi8KKyBjb25maWdfZXJyb3I6CisJCWJiX2Vycm9yX21zZygiY29uZmlnIGVycm9yICclcycgaW4gJyVzJyIsIGJ1ZiwgZmlsZW5hbWUpOworCSB9IC8qIHdoaWxlIChmZ2V0cykgKi8KKworCSBmY2xvc2UoZik7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUgorLyoKKyAqIEdpdmVuIGEgc3RyaW5nLCBodG1sLWVuY29kZSBzcGVjaWFsIGNoYXJhY3RlcnMuCisgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSAtZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByb3ZpZGUgYW4gZWFzeSB3YXkKKyAqIGZvciBzY3JpcHRzIHRvIGVuY29kZSByZXN1bHQgZGF0YSB3aXRob3V0IGNvbmZ1c2luZyBicm93c2Vycy4gIFRoZQorICogcmV0dXJuZWQgc3RyaW5nIHBvaW50ZXIgaXMgbWVtb3J5IGFsbG9jYXRlZCBieSBtYWxsb2MoKS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW5jb2RlZCBzdHJpbmcgKG1hbGxvY2VkKS4KKyAqLworc3RhdGljIGNoYXIgKmVuY29kZVN0cmluZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisJLyogdGFrZSB0aGUgc2ltcGxlIHJvdXRlIGFuZCBlbmNvZGUgZXZlcnl0aGluZyAqLworCS8qIGNvdWxkIHBvc3NpYmx5IHNjYW4gb25jZSB0byBnZXQgbGVuZ3RoLiAgICAgKi8KKwlpbnQgbGVuID0gc3RybGVuKHN0cmluZyk7CisJY2hhciAqb3V0ID0geG1hbGxvYyhsZW4gKiA2ICsgMSk7CisJY2hhciAqcCA9IG91dDsKKwljaGFyIGNoOworCisJd2hpbGUgKChjaCA9ICpzdHJpbmcrKykgIT0gJ1wwJykgeworCQkvKiB2ZXJ5IHNpbXBsZSBjaGVjayBmb3Igd2hhdCB0byBlbmNvZGUgKi8KKwkJaWYgKGlzYWxudW0oY2gpKQorCQkJKnArKyA9IGNoOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIiYjJWQ7IiwgKHVuc2lnbmVkIGNoYXIpIGNoKTsKKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBvdXQ7Cit9CisjZW5kaWYKKworLyoKKyAqIEdpdmVuIGEgVVJMIGVuY29kZWQgc3RyaW5nLCBjb252ZXJ0IGl0IHRvIHBsYWluIGFzY2lpLgorICogU2luY2UgZGVjb2RpbmcgYWx3YXlzIG1ha2VzIHN0cmluZ3Mgc21hbGxlciwgdGhlIGRlY29kZSBpcyBkb25lIGluLXBsYWNlLgorICogVGh1cywgY2FsbGVycyBzaG91bGQgeHN0cmR1cCgpIHRoZSBhcmd1bWVudCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQorICogYXJndW1lbnQgbW9kaWZpZWQuICBUaGUgcmV0dXJuIGlzIHRoZSBvcmlnaW5hbCBwb2ludGVyLCBhbGxvd2luZyB0aGlzCisgKiBmdW5jdGlvbiB0byBiZSBlYXNpbHkgdXNlZCBhcyBhcmd1bWVudHMgdG8gb3RoZXIgZnVuY3Rpb25zLgorICoKKyAqIHN0cmluZyAgICBUaGUgZmlyc3Qgc3RyaW5nIHRvIGRlY29kZS4KKyAqIG9wdGlvbl9kICAxIGlmIGNhbGxlZCBmb3IgaHR0cGQgLWQKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGVjb2RlZCBzdHJpbmcgKHNhbWUgYXMgaW5wdXQpLgorICovCitzdGF0aWMgdW5zaWduZWQgaGV4X3RvX2Jpbih1bnNpZ25lZCBjaGFyIGMpCit7CisJdW5zaWduZWQgdjsKKworCXYgPSBjIC0gJzAnOworCWlmICh2IDw9IDkpCisJCXJldHVybiB2OworCS8qIGMgfCAweDIwOiBsZXR0ZXJzIHRvIGxvd2VyIGNhc2UsIG5vbi1sZXR0ZXJzCisJICogdG8gKHBvdGVudGlhbGx5IGRpZmZlcmVudCkgbm9uLWxldHRlcnMgKi8KKwl2ID0gKHVuc2lnbmVkKShjIHwgMHgyMCkgLSAnYSc7CisJaWYgKHYgPD0gNSkKKwkJcmV0dXJuIHYgKyAxMDsKKwlyZXR1cm4gfjA7CisvKiBGb3IgdGVzdGluZzoKK3ZvaWQgdChjaGFyIGMpIHsgcHJpbnRmKCInJWMnKCV1KSAldVxuIiwgYywgYywgaGV4X3RvX2JpbihjKSk7IH0KK2ludCBtYWluKCkgeyB0KDB4MTApOyB0KDB4MjApOyB0KCcwJyk7IHQoJzknKTsgdCgnQScpOyB0KCdGJyk7IHQoJ2EnKTsgdCgnZicpOwordCgnMCctMSk7IHQoJzknKzEpOyB0KCdBJy0xKTsgdCgnRicrMSk7IHQoJ2EnLTEpOyB0KCdmJysxKTsgcmV0dXJuIDA7IH0KKyovCit9CitzdGF0aWMgY2hhciAqZGVjb2RlU3RyaW5nKGNoYXIgKm9yaWcsIGludCBvcHRpb25fZCkKK3sKKwkvKiBub3RlIHRoYXQgZGVjb2RlZCBzdHJpbmcgaXMgYWx3YXlzIHNob3J0ZXIgdGhhbiBvcmlnaW5hbCAqLworCWNoYXIgKnN0cmluZyA9IG9yaWc7CisJY2hhciAqcHRyID0gc3RyaW5nOworCWNoYXIgYzsKKworCXdoaWxlICgoYyA9ICpwdHIrKykgIT0gJ1wwJykgeworCQl1bnNpZ25lZCB2OworCisJCWlmIChvcHRpb25fZCAmJiBjID09ICcrJykgeworCQkJKnN0cmluZysrID0gJyAnOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgIT0gJyUnKSB7CisJCQkqc3RyaW5nKysgPSBjOworCQkJY29udGludWU7CisJCX0KKwkJdiA9IGhleF90b19iaW4ocHRyWzBdKTsKKwkJaWYgKHYgPiAxNSkgeworIGJhZF9oZXg6CisJCQlpZiAoIW9wdGlvbl9kKQorCQkJCXJldHVybiBOVUxMOworCQkJKnN0cmluZysrID0gJyUnOworCQkJY29udGludWU7CisJCX0KKwkJdiA9ICh2ICogMTYpIHwgaGV4X3RvX2JpbihwdHJbMV0pOworCQlpZiAodiA+IDI1NSkKKwkJCWdvdG8gYmFkX2hleDsKKwkJaWYgKCFvcHRpb25fZCAmJiAodiA9PSAnLycgfHwgdiA9PSAnXDAnKSkgeworCQkJLyogY2FsbGVyIHRha2VzIGl0IGFzIGluZGljYXRpb24gb2YgaW52YWxpZAorCQkJICogKGRhbmdlcm91cyB3cnQgZXhwbG9pdHMpIGNoYXJzICovCisJCQlyZXR1cm4gb3JpZyArIDE7CisJCX0KKwkJKnN0cmluZysrID0gdjsKKwkJcHRyICs9IDI7CisJfQorCSpzdHJpbmcgPSAnXDAnOworCXJldHVybiBvcmlnOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorLyoKKyAqIERlY29kZSBhIGJhc2U2NCBkYXRhIHN0cmVhbSBhcyBwZXIgcmZjMTUyMS4KKyAqIE5vdGUgdGhhdCB0aGUgcmZjIHN0YXRlcyB0aGF0IG5vbiBiYXNlNjQgY2hhcnMgYXJlIHRvIGJlIGlnbm9yZWQuCisgKiBTaW5jZSB0aGUgZGVjb2RlIGFsd2F5cyByZXN1bHRzIGluIGEgc2hvcnRlciBzaXplIHRoYW4gdGhlIGlucHV0LAorICogaXQgaXMgT0sgdG8gcGFzcyB0aGUgaW5wdXQgYXJnIGFzIGFuIG91dHB1dCBhcmcuCisgKiBQYXJhbWV0ZXI6IGEgcG9pbnRlciB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy4KKyAqIERlY29kZWQgZGF0YSBpcyBzdG9yZWQgaW4tcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZUJhc2U2NChjaGFyICpEYXRhKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilEYXRhOworCS8qIFRoZSBkZWNvZGVkIHNpemUgd2lsbCBiZSBhdCBtb3N0IDMvNCB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCAqLworCXVuc2lnbmVkIGNoID0gMDsKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoKmluKSB7CisJCWludCB0ID0gKmluKys7CisKKwkJaWYgKHQgPj0gJzAnICYmIHQgPD0gJzknKQorCQkJdCA9IHQgLSAnMCcgKyA1MjsKKwkJZWxzZSBpZiAodCA+PSAnQScgJiYgdCA8PSAnWicpCisJCQl0ID0gdCAtICdBJzsKKwkJZWxzZSBpZiAodCA+PSAnYScgJiYgdCA8PSAneicpCisJCQl0ID0gdCAtICdhJyArIDI2OworCQllbHNlIGlmICh0ID09ICcrJykKKwkJCXQgPSA2MjsKKwkJZWxzZSBpZiAodCA9PSAnLycpCisJCQl0ID0gNjM7CisJCWVsc2UgaWYgKHQgPT0gJz0nKQorCQkJdCA9IDA7CisJCWVsc2UKKwkJCWNvbnRpbnVlOworCisJCWNoID0gKGNoIDw8IDYpIHwgdDsKKwkJaSsrOworCQlpZiAoaSA9PSA0KSB7CisJCQkqRGF0YSsrID0gKGNoYXIpIChjaCA+PiAxNik7CisJCQkqRGF0YSsrID0gKGNoYXIpIChjaCA+PiA4KTsKKwkJCSpEYXRhKysgPSAoY2hhcikgY2g7CisJCQlpID0gMDsKKwkJfQorCX0KKwkqRGF0YSA9ICdcMCc7Cit9CisjZW5kaWYKKworLyoKKyAqIENyZWF0ZSBhIGxpc3RlbiBzZXJ2ZXIgc29ja2V0IG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgb3BlblNlcnZlcih2b2lkKQoreworCXVuc2lnbmVkIG4gPSBiYl9zdHJ0b3UoYmluZF9hZGRyX29yX3BvcnQsIE5VTEwsIDEwKTsKKwlpZiAoIWVycm5vICYmIG4gJiYgbiA8PSAweGZmZmYpCisJCW4gPSBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShOVUxMLCBuKTsKKwllbHNlCisJCW4gPSBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShiaW5kX2FkZHJfb3JfcG9ydCwgODApOworCXhsaXN0ZW4obiwgOSk7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBMb2cgdGhlIGNvbm5lY3Rpb24gY2xvc3VyZSBhbmQgZXhpdC4KKyAqLworc3RhdGljIHZvaWQgbG9nX2FuZF9leGl0KHZvaWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgbG9nX2FuZF9leGl0KHZvaWQpCit7CisJLyogUGFyYW5vaWEuIElFIHNhaWQgdG8gYmUgYnVnZ3kuIEl0IG1heSBzZW5kIHNvbWUgZXh0cmEgZGF0YQorCSAqIG9yIGJlIGNvbmZ1c2VkIGJ5IHVzIGp1c3QgZXhpdGluZyB3aXRob3V0IFNIVVRfV1IuIE9oIHdlbGwuICovCisJc2h1dGRvd24oMSwgU0hVVF9XUik7CisJLyogV2h5Pz8KKwkodGhpcyBhbHNvIG1lc3NlcyB1cCBzdGRpbiB3aGVuIHVzZXIgcnVucyBodHRwZCAtaSBmcm9tIHRlcm1pbmFsKQorCW5kZWxheV9vbigwKTsKKwl3aGlsZSAocmVhZChTVERJTl9GSUxFTk8sIGlvYnVmLCBJT0JVRl9TSVpFKSA+IDApCisJCWNvbnRpbnVlOworCSovCisKKwlpZiAodmVyYm9zZSA+IDIpCisJCWJiX2Vycm9yX21zZygiY2xvc2VkIik7CisJX2V4aXQoeGZ1bmNfZXJyb3JfcmV0dmFsKTsKK30KKworLyoKKyAqIENyZWF0ZSBhbmQgc2VuZCBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCisgKiBUaGUgYXJndW1lbnRzIGFyZSBjb21iaW5lZCBhbmQgc2VudCBhcyBvbmUgd3JpdGUgb3BlcmF0aW9uLiAgTm90ZSB0aGF0CisgKiBJRSB3aWxsIHB1a2UgYmlnLXRpbWUgaWYgdGhlIGhlYWRlcnMgYXJlIG5vdCBzZW50IGluIG9uZSBwYWNrZXQgYW5kIHRoZQorICogc2Vjb25kIHBhY2tldCBpcyBkZWxheWVkIGZvciBhbnkgcmVhc29uLgorICogcmVzcG9uc2VOdW0gLSB0aGUgcmVzdWx0IGNvZGUgdG8gc2VuZC4KKyAqLworc3RhdGljIHZvaWQgc2VuZF9oZWFkZXJzKGludCByZXNwb25zZU51bSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBSRkMxMTIzRk1UW10gQUxJR04xID0gIiVhLCAlZCAlYiAlWSAlSDolTTolUyBHTVQiOworCisJY29uc3QgY2hhciAqcmVzcG9uc2VTdHJpbmcgPSAiIjsKKwljb25zdCBjaGFyICppbmZvU3RyaW5nID0gTlVMTDsKKwljb25zdCBjaGFyICptaW1lX3R5cGU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwljb25zdCBjaGFyICplcnJvcl9wYWdlID0gTlVMTDsKKyNlbmRpZgorCXVuc2lnbmVkIGk7CisJdGltZV90IHRpbWVyID0gdGltZShOVUxMKTsKKwljaGFyIHRtcF9zdHJbODBdOworCWludCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShodHRwX3Jlc3BvbnNlX3R5cGUpOyBpKyspIHsKKwkJaWYgKGh0dHBfcmVzcG9uc2VfdHlwZVtpXSA9PSByZXNwb25zZU51bSkgeworCQkJcmVzcG9uc2VTdHJpbmcgPSBodHRwX3Jlc3BvbnNlW2ldLm5hbWU7CisJCQlpbmZvU3RyaW5nID0gaHR0cF9yZXNwb25zZVtpXS5pbmZvOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTCisJCQllcnJvcl9wYWdlID0gaHR0cF9lcnJvcl9wYWdlW2ldOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBlcnJvciBtZXNzYWdlIGlzIEhUTUwgKi8KKwltaW1lX3R5cGUgPSByZXNwb25zZU51bSA9PSBIVFRQX09LID8KKwkJCQlmb3VuZF9taW1lX3R5cGUgOiAidGV4dC9odG1sIjsKKworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coInJlc3BvbnNlOiV1IiwgcmVzcG9uc2VOdW0pOworCisJLyogZW1pdCB0aGUgY3VycmVudCBkYXRlICovCisJc3RyZnRpbWUodG1wX3N0ciwgc2l6ZW9mKHRtcF9zdHIpLCBSRkMxMTIzRk1ULCBnbXRpbWUoJnRpbWVyKSk7CisJbGVuID0gc3ByaW50Zihpb2J1ZiwKKwkJCSJIVFRQLzEuMCAlZCAlc1xyXG5Db250ZW50LXR5cGU6ICVzXHJcbiIKKwkJCSJEYXRlOiAlc1xyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG4iLAorCQkJcmVzcG9uc2VOdW0sIHJlc3BvbnNlU3RyaW5nLCBtaW1lX3R5cGUsIHRtcF9zdHIpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCWlmIChyZXNwb25zZU51bSA9PSBIVFRQX1VOQVVUSE9SSVpFRCkgeworCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwKKwkJCQkiV1dXLUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09XCIlc1wiXHJcbiIsCisJCQkJZ19yZWFsbSk7CisJfQorI2VuZGlmCisJaWYgKHJlc3BvbnNlTnVtID09IEhUVFBfTU9WRURfVEVNUE9SQVJJTFkpIHsKKwkJbGVuICs9IHNwcmludGYoaW9idWYgKyBsZW4sICJMb2NhdGlvbjogJXMvJXMlc1xyXG4iLAorCQkJCWZvdW5kX21vdmVkX3RlbXBvcmFyaWx5LAorCQkJCShnX3F1ZXJ5ID8gIj8iIDogIiIpLAorCQkJCShnX3F1ZXJ5ID8gZ19xdWVyeSA6ICIiKSk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwlpZiAoZXJyb3JfcGFnZSAmJiBhY2Nlc3MoZXJyb3JfcGFnZSwgUl9PSykgPT0gMCkgeworCQlzdHJjYXQoaW9idWYsICJcclxuIik7CisJCWxlbiArPSAyOworCisJCWlmIChERUJVRykKKwkJCWZwcmludGYoc3RkZXJyLCAiaGVhZGVyczogJyVzJ1xuIiwgaW9idWYpOworCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGlvYnVmLCBsZW4pOworCQlpZiAoREVCVUcpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndyaXRpbmcgZXJyb3IgcGFnZTogJyVzJ1xuIiwgZXJyb3JfcGFnZSk7CisJCXJldHVybiBzZW5kX2ZpbGVfYW5kX2V4aXQoZXJyb3JfcGFnZSwgU0VORF9CT0RZKTsKKwl9CisjZW5kaWYKKworCWlmIChmaWxlX3NpemUgIT0gLTEpIHsgICAgLyogZmlsZSAqLworCQlzdHJmdGltZSh0bXBfc3RyLCBzaXplb2YodG1wX3N0ciksIFJGQzExMjNGTVQsIGdtdGltZSgmbGFzdF9tb2QpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwkJaWYgKHJlc3BvbnNlTnVtID09IEhUVFBfUEFSVElBTF9DT05URU5UKSB7CisJCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwgIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzICUiT0ZGX0ZNVCJ1LSUiT0ZGX0ZNVCJ1LyUiT0ZGX0ZNVCJ1XHJcbiIsCisJCQkJCXJhbmdlX3N0YXJ0LAorCQkJCQlyYW5nZV9lbmQsCisJCQkJCWZpbGVfc2l6ZSk7CisJCQlmaWxlX3NpemUgPSByYW5nZV9lbmQgLSByYW5nZV9zdGFydCArIDE7CisJCX0KKyNlbmRpZgorCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwkJCSJBY2NlcHQtUmFuZ2VzOiBieXRlc1xyXG4iCisjZW5kaWYKKwkJCSJMYXN0LU1vZGlmaWVkOiAlc1xyXG4lcyAlIk9GRl9GTVQidVxyXG4iLAorCQkJCXRtcF9zdHIsCisJCQkJY29udGVudF9nemlwID8gIlRyYW5zZmVyLWxlbmd0aDoiIDogIkNvbnRlbnQtbGVuZ3RoOiIsCisJCQkJZmlsZV9zaXplCisJCSk7CisJfQorCisJaWYgKGNvbnRlbnRfZ3ppcCkKKwkJbGVuICs9IHNwcmludGYoaW9idWYgKyBsZW4sICJDb250ZW50LUVuY29kaW5nOiBnemlwXHJcbiIpOworCisJaW9idWZbbGVuKytdID0gJ1xyJzsKKwlpb2J1ZltsZW4rK10gPSAnXG4nOworCWlmIChpbmZvU3RyaW5nKSB7CisJCWxlbiArPSBzcHJpbnRmKGlvYnVmICsgbGVuLAorCQkJCSI8SFRNTD48SEVBRD48VElUTEU+JWQgJXM8L1RJVExFPjwvSEVBRD5cbiIKKwkJCQkiPEJPRFk+PEgxPiVkICVzPC9IMT5cbiVzXG48L0JPRFk+PC9IVE1MPlxuIiwKKwkJCQlyZXNwb25zZU51bSwgcmVzcG9uc2VTdHJpbmcsCisJCQkJcmVzcG9uc2VOdW0sIHJlc3BvbnNlU3RyaW5nLCBpbmZvU3RyaW5nKTsKKwl9CisJaWYgKERFQlVHKQorCQlmcHJpbnRmKHN0ZGVyciwgImhlYWRlcnM6ICclcydcbiIsIGlvYnVmKTsKKwlpZiAoZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBpb2J1ZiwgbGVuKSAhPSBsZW4pIHsKKwkJaWYgKHZlcmJvc2UgPiAxKQorCQkJYmJfcGVycm9yX21zZygiZXJyb3IiKTsKKwkJbG9nX2FuZF9leGl0KCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX2hlYWRlcnNfYW5kX2V4aXQoaW50IHJlc3BvbnNlTnVtKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHNlbmRfaGVhZGVyc19hbmRfZXhpdChpbnQgcmVzcG9uc2VOdW0pCit7CisJSUZfRkVBVFVSRV9IVFRQRF9HWklQKGNvbnRlbnRfZ3ppcCA9IDA7KQorCXNlbmRfaGVhZGVycyhyZXNwb25zZU51bSk7CisJbG9nX2FuZF9leGl0KCk7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gdGhlIHNvY2tldCB1bnRpbCAnXG4nIG9yIEVPRi4gJ1xyJyBjaGFycyBhcmUgcmVtb3ZlZC4KKyAqICdcbicgaXMgcmVwbGFjZWQgd2l0aCBOVUwuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAwIGlmIG5vdGhpbmcgaXMgcmVhZAorICogKCdccicgYW5kICdcbicgYXJlIG5vdCBjb3VudGVkKS4KKyAqIERhdGEgaXMgcmV0dXJuZWQgaW4gaW9idWYuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2xpbmUodm9pZCkKK3sKKwlpbnQgY291bnQgPSAwOworCWNoYXIgYzsKKworCWFsYXJtKEhFQURFUl9SRUFEX1RJTUVPVVQpOworCXdoaWxlICgxKSB7CisJCWlmIChoZHJfY250IDw9IDApIHsKKwkJCWhkcl9jbnQgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBoZHJfYnVmLCBzaXplb2YoaGRyX2J1ZikpOworCQkJaWYgKGhkcl9jbnQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWhkcl9wdHIgPSBoZHJfYnVmOworCQl9CisJCWlvYnVmW2NvdW50XSA9IGMgPSAqaGRyX3B0cisrOworCQloZHJfY250LS07CisKKwkJaWYgKGMgPT0gJ1xyJykKKwkJCWNvbnRpbnVlOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpb2J1Zltjb3VudF0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvdW50IDwgKElPQlVGX1NJWkUgLSAxKSkgICAgICAvKiBjaGVjayBvdmVyZmxvdyAqLworCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJIHx8IEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisKKy8qIGdjYyA0LjIuMSBmYXJlcyBiZXR0ZXIgd2l0aCBOT0lOTElORSAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgY2dpX2lvX2xvb3BfYW5kX2V4aXQoaW50IGZyb21DZ2lfcmQsIGludCB0b0NnaV93ciwgaW50IHBvc3RfbGVuKSBOT1JFVFVSTjsKK3N0YXRpYyBOT0lOTElORSB2b2lkIGNnaV9pb19sb29wX2FuZF9leGl0KGludCBmcm9tQ2dpX3JkLCBpbnQgdG9DZ2lfd3IsIGludCBwb3N0X2xlbikKK3sKKwllbnVtIHsgRlJPTV9DR0kgPSAxLCBUT19DR0kgPSAyIH07IC8qIGluZGV4ZXMgaW4gcGZkW10gKi8KKwlzdHJ1Y3QgcG9sbGZkIHBmZFszXTsKKwlpbnQgb3V0X2NudDsgLyogd2UgYnVmZmVyIGEgYml0IG9mIGluaXRpYWwgQ0dJIG91dHB1dCAqLworCWludCBjb3VudDsKKworCS8qIGlvYnVmIGlzIHVzZWQgZm9yIENHSSAtPiBuZXR3b3JrIGRhdGEsCisJICogaGRyX2J1ZiBpcyBmb3IgbmV0d29yayAtPiBDR0kgZGF0YSAoUE9TVERBVEEpICovCisKKwkvKiBJZiBDR0kgZGllcywgd2Ugc3RpbGwgd2FudCB0byBjb3JyZWN0bHkgZmluaXNoIHJlYWRpbmcgaXRzIG91dHB1dAorCSAqIGFuZCBzZW5kIGl0IHRvIHRoZSBwZWVyLiBTbyBwbGVhc2Ugbm8gU0lHUElQRXMhICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJLy8gV2UgaW5jb25zaXN0ZW50bHkgaGFuZGxlIGEgY2FzZSB3aGVuIG1vcmUgUE9TVERBVEEgZnJvbSBuZXR3b3JrCisJLy8gaXMgY29taW5nIHRoYW4gd2UgZXhwZWN0ZWQuIFdlIG1heSBnaXZlICpzb21lIHBhcnQqIG9mIHRoYXQKKwkvLyBleHRyYSBkYXRhIHRvIENHSS4KKworCS8vaWYgKGhkcl9jbnQgPiBwb3N0X2xlbikgeworCS8vCS8qIFdlIGdvdCBtb3JlIFBPU1REQVRBIGZyb20gbmV0d29yayB0aGFuIHdlIGV4cGVjdGVkICovCisJLy8JaGRyX2NudCA9IHBvc3RfbGVuOworCS8vfQorCXBvc3RfbGVuIC09IGhkcl9jbnQ7CisJLyogcG9zdF9sZW4gLSBudW1iZXIgb2YgUE9TVCBieXRlcyBub3QgeWV0IHJlYWQgZnJvbSBuZXR3b3JrICovCisKKwkvKiBOQjogYnJlYWtpbmcgb3V0IG9mIHRoaXMgbG9vcCBqdW1wcyB0byBsb2dfYW5kX2V4aXQoKSAqLworCW91dF9jbnQgPSAwOworCXdoaWxlICgxKSB7CisJCW1lbXNldChwZmQsIDAsIHNpemVvZihwZmQpKTsKKworCQlwZmRbRlJPTV9DR0ldLmZkID0gZnJvbUNnaV9yZDsKKwkJcGZkW0ZST01fQ0dJXS5ldmVudHMgPSBQT0xMSU47CisKKwkJaWYgKHRvQ2dpX3dyKSB7CisJCQlwZmRbVE9fQ0dJXS5mZCA9IHRvQ2dpX3dyOworCQkJaWYgKGhkcl9jbnQgPiAwKSB7CisJCQkJcGZkW1RPX0NHSV0uZXZlbnRzID0gUE9MTE9VVDsKKwkJCX0gZWxzZSBpZiAocG9zdF9sZW4gPiAwKSB7CisJCQkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJCX0gZWxzZSB7CisJCQkJLyogcG9zdF9sZW4gPD0gMCAmJiBoZHJfY250IDw9IDA6CisJCQkJICogbm8gbW9yZSBQT1NUIGRhdGEgdG8gQ0dJLAorCQkJCSAqIGxldCBDR0kgc2VlIEVPRiBvbiBDR0kncyBzdGRpbiAqLworCQkJCWlmICh0b0NnaV93ciAhPSBmcm9tQ2dpX3JkKQorCQkJCQljbG9zZSh0b0NnaV93cik7CisJCQkJdG9DZ2lfd3IgPSAwOworCQkJfQorCQl9CisKKwkJLyogTm93IHdhaXQgb24gdGhlIHNldCBvZiBzb2NrZXRzICovCisJCWNvdW50ID0gc2FmZV9wb2xsKHBmZCwgdG9DZ2lfd3IgPyBUT19DR0krMSA6IEZST01fQ0dJKzEsIC0xKTsKKwkJaWYgKGNvdW50IDw9IDApIHsKKyNpZiAwCisJCQlpZiAoc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORykgPD0gMCkgeworCQkJCS8qIFdlaXJkLiBDR0kgZGlkbid0IGV4aXQgYW5kIG5vIGZkJ3MKKwkJCQkgKiBhcmUgcmVhZHksIHlldCBwb2xsIHJldHVybmVkPyEgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChERUJVRyAmJiBXSUZFWElURUQoc3RhdHVzKSkKKwkJCQliYl9lcnJvcl9tc2coIkNHSSBleGl0ZWQsIHN0YXR1cz0lZCIsIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQkJaWYgKERFQlVHICYmIFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQkJYmJfZXJyb3JfbXNnKCJDR0kga2lsbGVkLCBzaWduYWw9JWQiLCBXVEVSTVNJRyhzdGF0dXMpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAocGZkW1RPX0NHSV0ucmV2ZW50cykgeworCQkJLyogaGRyX2NudCA+IDAgaGVyZSBkdWUgdG8gdGhlIHdheSBwZmRbVE9fQ0dJXS5ldmVudHMgc2V0ICovCisJCQkvKiBIYXZlIGRhdGEgZnJvbSBwZWVyIGFuZCBjYW4gd3JpdGUgdG8gQ0dJICovCisJCQljb3VudCA9IHNhZmVfd3JpdGUodG9DZ2lfd3IsIGhkcl9wdHIsIGhkcl9jbnQpOworCQkJLyogRG9lc24ndCBoYXBwZW4sIHdlIGRvbnQgdXNlIG5vbmJsb2NraW5nIElPIGhlcmUKKwkJCSAqaWYgKGNvdW50IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKwkJCSAqCS4uLgorCQkJICp9IGVsc2UgKi8KKwkJCWlmIChjb3VudCA+IDApIHsKKwkJCQloZHJfcHRyICs9IGNvdW50OworCQkJCWhkcl9jbnQgLT0gY291bnQ7CisJCQl9IGVsc2UgeworCQkJCS8qIEVPRi9icm9rZW4gcGlwZSB0byBDR0ksIHN0b3AgcGlwaW5nIFBPU1QgZGF0YSAqLworCQkJCWhkcl9jbnQgPSBwb3N0X2xlbiA9IDA7CisJCQl9CisJCX0KKworCQlpZiAocGZkWzBdLnJldmVudHMpIHsKKwkJCS8qIHBvc3RfbGVuID4gMCAmJiBoZHJfY250ID09IDAgaGVyZSAqLworCQkJLyogV2UgZXhwZWN0IGRhdGEsIHByZXYgZGF0YSBwb3J0aW9uIGlzIGVhdGVuIGJ5IENHSQorCQkJICogYW5kIHRoZXJlICppcyogZGF0YSB0byByZWFkIGZyb20gdGhlIHBlZXIKKwkJCSAqIChQT1NUREFUQSkgKi8KKwkJCS8vY291bnQgPSBwb3N0X2xlbiA+IChpbnQpc2l6ZW9mKGhkcl9idWYpID8gKGludClzaXplb2YoaGRyX2J1ZikgOiBwb3N0X2xlbjsKKwkJCS8vY291bnQgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBoZHJfYnVmLCBjb3VudCk7CisJCQljb3VudCA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGhkcl9idWYsIHNpemVvZihoZHJfYnVmKSk7CisJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJaGRyX2NudCA9IGNvdW50OworCQkJCWhkcl9wdHIgPSBoZHJfYnVmOworCQkJCXBvc3RfbGVuIC09IGNvdW50OworCQkJfSBlbHNlIHsKKwkJCQkvKiBubyBtb3JlIFBPU1QgZGF0YSBjYW4gYmUgcmVhZCAqLworCQkJCXBvc3RfbGVuID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwZmRbRlJPTV9DR0ldLnJldmVudHMpIHsKKwkJCS8qIFRoZXJlIGlzIHNvbWV0aGluZyB0byByZWFkIGZyb20gQ0dJICovCisJCQljaGFyICpyYnVmID0gaW9idWY7CisKKwkJCS8qIEFyZSB3ZSBzdGlsbCBidWZmZXJpbmcgQ0dJIG91dHB1dD8gKi8KKwkJCWlmIChvdXRfY250ID49IDApIHsKKwkJCQkvKiBIVFRQXzIwMFtdIGhhcyBzaW5nbGUgIlxyXG4iIGF0IHRoZSBlbmQuCisJCQkJICogQWNjb3JkaW5nIHRvIGh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvb3V0Lmh0bWwsCisJCQkJICogQ0dJIHNjcmlwdHMgTVVTVCBzZW5kIHRoZWlyIG93biBoZWFkZXIgdGVybWluYXRlZCBieQorCQkJCSAqIGVtcHR5IGxpbmUsIHRoZW4gZGF0YS4gVGhhdCdzIHdoeSB3ZSBoYXZlIG9ubHkgb25lCisJCQkJICogPGNyPjxsZj4gcGFpciBoZXJlLiBXZSB3aWxsIG91dHB1dCAiMjAwIE9LIiBsaW5lCisJCQkJICogaWYgbmVlZGVkLCBidXQgQ0dJIHN0aWxsIGhhcyB0byBwcm92aWRlIGJsYW5rIGxpbmUKKwkJCQkgKiBiZXR3ZWVuIGhlYWRlciBhbmQgYm9keSAqLworCisJCQkJLyogTXVzdCB1c2Ugc2FmZV9yZWFkLCBub3QgZnVsbF9yZWFkLCBiZWNhdXNlCisJCQkJICogQ0dJIG1heSBvdXRwdXQgYSBmZXcgZmlyc3QgYnl0ZXMgYW5kIHRoZW4gd2FpdAorCQkJCSAqIGZvciBQT1NUREFUQSB3aXRob3V0IGNsb3Npbmcgc3Rkb3V0LgorCQkJCSAqIFdpdGggZnVsbF9yZWFkIHdlIG1heSB3YWl0IGhlcmUgZm9yZXZlci4gKi8KKwkJCQljb3VudCA9IHNhZmVfcmVhZChmcm9tQ2dpX3JkLCByYnVmICsgb3V0X2NudCwgUElQRV9CVUYgLSA4KTsKKwkJCQlpZiAoY291bnQgPD0gMCkgeworCQkJCQkvKiBlb2YgKG9yIGVycm9yKSBhbmQgdGhlcmUgd2FzIG5vICJIVFRQIiwKKwkJCQkJICogc28gd3JpdGUgaXQsIHRoZW4gd3JpdGUgcmVjZWl2ZWQgZGF0YSAqLworCQkJCQlpZiAob3V0X2NudCkgeworCQkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBIVFRQXzIwMCwgc2l6ZW9mKEhUVFBfMjAwKS0xKTsKKwkJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgcmJ1Ziwgb3V0X2NudCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7IC8qIENHSSBzdGRvdXQgaXMgY2xvc2VkLCBleGl0aW5nICovCisJCQkJfQorCQkJCW91dF9jbnQgKz0gY291bnQ7CisJCQkJY291bnQgPSAwOworCQkJCS8qICJTdGF0dXMiIGhlYWRlciBmb3JtYXQgaXM6ICJTdGF0dXM6IDMwMiBSZWRpcmVjdGVkXHJcbiIgKi8KKwkJCQlpZiAob3V0X2NudCA+PSA4ICYmIG1lbWNtcChyYnVmLCAiU3RhdHVzOiAiLCA4KSA9PSAwKSB7CisJCQkJCS8qIHNlbmQgIkhUVFAvMS4wICIgKi8KKwkJCQkJaWYgKGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgSFRUUF8yMDAsIDkpICE9IDkpCisJCQkJCQlicmVhazsKKwkJCQkJcmJ1ZiArPSA4OyAvKiBza2lwICJTdGF0dXM6ICIgKi8KKwkJCQkJY291bnQgPSBvdXRfY250IC0gODsKKwkJCQkJb3V0X2NudCA9IC0xOyAvKiBidWZmZXJpbmcgb2ZmICovCisJCQkJfSBlbHNlIGlmIChvdXRfY250ID49IDQpIHsKKwkJCQkJLyogRGlkIENHSSBhZGQgIkhUVFAiPyAqLworCQkJCQlpZiAobWVtY21wKHJidWYsIEhUVFBfMjAwLCA0KSAhPSAwKSB7CisJCQkJCQkvKiB0aGVyZSBpcyBubyAiSFRUUCIsIGRvIGl0IG91cnNlbGYgKi8KKwkJCQkJCWlmIChmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIEhUVFBfMjAwLCBzaXplb2YoSFRUUF8yMDApLTEpICE9IHNpemVvZihIVFRQXzIwMCktMSkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKiBDb21tZW50ZWQgb3V0OgorCQkJCQlpZiAoIXN0cnN0cihyYnVmLCAib250ZW50LSIpKSB7CisJCQkJCQlmdWxsX3dyaXRlKHMsICJDb250ZW50LXR5cGU6IHRleHQvcGxhaW5cclxuXHJcbiIsIDI4KTsKKwkJCQkJfQorCQkJCQkgKiBDb3VudGVyLWV4YW1wbGUgb2YgdmFsaWQgQ0dJIHdpdGhvdXQgQ29udGVudC10eXBlOgorCQkJCQkgKiBlY2hvIC1lbiAiSFRUUC8xLjAgMzAyIEZvdW5kXHJcbiIKKwkJCQkJICogZWNobyAtZW4gIkxvY2F0aW9uOiBodHRwOi8vd3d3LmJ1c3lib3gubmV0XHJcbiIKKwkJCQkJICogZWNobyAtZW4gIlxyXG4iCisJCQkJCSAqLworCQkJCQljb3VudCA9IG91dF9jbnQ7CisJCQkJCW91dF9jbnQgPSAtMTsgLyogYnVmZmVyaW5nIG9mZiAqLworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY291bnQgPSBzYWZlX3JlYWQoZnJvbUNnaV9yZCwgcmJ1ZiwgUElQRV9CVUYpOworCQkJCWlmIChjb3VudCA8PSAwKQorCQkJCQlicmVhazsgIC8qIGVvZiAob3IgZXJyb3IpICovCisJCQl9CisJCQlpZiAoZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCByYnVmLCBjb3VudCkgIT0gY291bnQpCisJCQkJYnJlYWs7CisJCQlpZiAoREVCVUcpCisJCQkJZnByaW50ZihzdGRlcnIsICJjZ2kgcmVhZCAlZCBieXRlczogJyUuKnMnXG4iLCBjb3VudCwgY291bnQsIHJidWYpOworCQl9IC8qIGlmIChwZmRbRlJPTV9DR0ldLnJldmVudHMpICovCisJfSAvKiB3aGlsZSAoMSkgKi8KKwlsb2dfYW5kX2V4aXQoKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJCisKK3N0YXRpYyB2b2lkIHNldGVudjEoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJc2V0ZW52KG5hbWUsIHZhbHVlID8gdmFsdWUgOiAiIiwgMSk7Cit9CisKKy8qCisgKiBTcGF3biBDR0kgc2NyaXB0LCBmb3J3YXJkIENHSSdzIHN0ZGluL291dCA8PT4gbmV0d29yaworICoKKyAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IHVwIGFuZCB0aGUgc2NyaXB0IGlzIGludm9rZWQgd2l0aCBwaXBlcworICogZm9yIHN0ZGluL3N0ZG91dC4gIElmIGEgUE9TVCBpcyBiZWluZyBkb25lIHRoZSBzY3JpcHQgaXMgZmVkIHRoZSBQT1NUCisgKiBkYXRhIGluIGFkZGl0aW9uIHRvIHNldHRpbmcgdGhlIFFVRVJZX1NUUklORyB2YXJpYWJsZSAoZm9yIEdFVHMgb3IgUE9TVHMpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBjb25zdCBjaGFyICp1cmwgICAgICAgICAgICAgIFRoZSByZXF1ZXN0ZWQgVVJMICh3aXRoIGxlYWRpbmcgLykuCisgKiBpbnQgcG9zdF9sZW4gICAgICAgICAgICAgICAgIExlbmd0aCBvZiB0aGUgUE9TVCBib2R5LgorICogY29uc3QgY2hhciAqY29va2llICAgICAgICAgICBGb3Igc2V0IEhUVFBfQ09PS0lFLgorICogY29uc3QgY2hhciAqY29udGVudF90eXBlICAgICBGb3Igc2V0IENPTlRFTlRfVFlQRS4KKyAqLworc3RhdGljIHZvaWQgc2VuZF9jZ2lfYW5kX2V4aXQoCisJCWNvbnN0IGNoYXIgKnVybCwKKwkJY29uc3QgY2hhciAqcmVxdWVzdCwKKwkJaW50IHBvc3RfbGVuLAorCQljb25zdCBjaGFyICpjb29raWUsCisJCWNvbnN0IGNoYXIgKmNvbnRlbnRfdHlwZSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBzZW5kX2NnaV9hbmRfZXhpdCgKKwkJY29uc3QgY2hhciAqdXJsLAorCQljb25zdCBjaGFyICpyZXF1ZXN0LAorCQlpbnQgcG9zdF9sZW4sCisJCWNvbnN0IGNoYXIgKmNvb2tpZSwKKwkJY29uc3QgY2hhciAqY29udGVudF90eXBlKQoreworCXN0cnVjdCBmZF9wYWlyIGZyb21DZ2k7ICAvKiBDR0kgLT4gaHR0cGQgcGlwZSAqLworCXN0cnVjdCBmZF9wYWlyIHRvQ2dpOyAgICAvKiBodHRwZCAtPiBDR0kgcGlwZSAqLworCWNoYXIgKnNjcmlwdDsKKwlpbnQgcGlkOworCisJLyogTWFrZSBhIGNvcHkuIE5COiBjYWxsZXIgZ3VhcmFudGVlczoKKwkgKiB1cmxbMF0gPT0gJy8nLCB1cmxbMV0gIT0gJy8nICovCisJdXJsID0geHN0cmR1cCh1cmwpOworCisJLyoKKwkgKiBXZSBhcmUgbXVja2luZyB3aXRoIGVudmlyb25tZW50IF9maXJzdF8gYW5kIHRoZW4gdmZvcmsvZXhlYywKKwkgKiB0aGlzIGFsbG93cyB1cyB0byB1c2UgdmZvcmsgc2FmZWx5LiBQYXJlbnQgZG9lc24ndCBjYXJlIGFib3V0CisJICogdGhlc2UgZW52aXJvbm1lbnQgY2hhbmdlcyBhbnl3YXkuCisJICovCisKKwkvKiBDaGVjayBmb3IgW2RpcnMvXXNjcmlwdC5jZ2kvUEFUSF9JTkZPICovCisJc2NyaXB0ID0gKGNoYXIqKXVybDsKKwl3aGlsZSAoKHNjcmlwdCA9IHN0cmNocihzY3JpcHQgKyAxLCAnLycpKSAhPSBOVUxMKSB7CisJCSpzY3JpcHQgPSAnXDAnOworCQlpZiAoIWlzX2RpcmVjdG9yeSh1cmwgKyAxLCAxLCBOVUxMKSkgeworCQkJLyogbm90IGRpcmVjdG9yeSwgZm91bmQgc2NyaXB0LmNnaS9QQVRIX0lORk8gKi8KKwkJCSpzY3JpcHQgPSAnLyc7CisJCQlicmVhazsKKwkJfQorCQkqc2NyaXB0ID0gJy8nOyAvKiBpcyBkaXJlY3RvcnksIGZpbmQgbmV4dCAnLycgKi8KKwl9CisJc2V0ZW52MSgiUEFUSF9JTkZPIiwgc2NyaXB0KTsgICAvKiBzZXQgdG8gL1BBVEhfSU5GTyBvciAiIiAqLworCXNldGVudjEoIlJFUVVFU1RfTUVUSE9EIiwgcmVxdWVzdCk7CisJaWYgKGdfcXVlcnkpIHsKKwkJcHV0ZW52KHhhc3ByaW50ZigiJXM9JXM/JXMiLCAiUkVRVUVTVF9VUkkiLCB1cmwsIGdfcXVlcnkpKTsKKwl9IGVsc2UgeworCQlzZXRlbnYxKCJSRVFVRVNUX1VSSSIsIHVybCk7CisJfQorCWlmIChzY3JpcHQgIT0gTlVMTCkKKwkJKnNjcmlwdCA9ICdcMCc7ICAgICAgICAgLyogY3V0IG9mZiAvUEFUSF9JTkZPICovCisKKwkvKiBTQ1JJUFRfRklMRU5BTUUgaXMgcmVxdWlyZWQgYnkgUEhQIGluIENHSSBtb2RlICovCisJaWYgKGhvbWVfaHR0cGRbMF0gPT0gJy8nKSB7CisJCWNoYXIgKmZ1bGxwYXRoID0gY29uY2F0X3BhdGhfZmlsZShob21lX2h0dHBkLCB1cmwpOworCQlzZXRlbnYxKCJTQ1JJUFRfRklMRU5BTUUiLCBmdWxscGF0aCk7CisJfQorCS8qIHNldCBTQ1JJUFRfTkFNRSBhcyBmdWxsIHBhdGg6IC9jZ2ktYmluL2RpcnMvc2NyaXB0LmNnaSAqLworCXNldGVudjEoIlNDUklQVF9OQU1FIiwgdXJsKTsKKwkvKiBodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2Vudi5odG1sOgorCSAqIFFVRVJZX1NUUklORzogVGhlIGluZm9ybWF0aW9uIHdoaWNoIGZvbGxvd3MgdGhlID8gaW4gdGhlIFVSTAorCSAqIHdoaWNoIHJlZmVyZW5jZWQgdGhpcyBzY3JpcHQuIFRoaXMgaXMgdGhlIHF1ZXJ5IGluZm9ybWF0aW9uLgorCSAqIEl0IHNob3VsZCBub3QgYmUgZGVjb2RlZCBpbiBhbnkgZmFzaGlvbi4gVGhpcyB2YXJpYWJsZQorCSAqIHNob3VsZCBhbHdheXMgYmUgc2V0IHdoZW4gdGhlcmUgaXMgcXVlcnkgaW5mb3JtYXRpb24sCisJICogcmVnYXJkbGVzcyBvZiBjb21tYW5kIGxpbmUgZGVjb2RpbmcuICovCisJLyogKE9sZGVyIHZlcnNpb25zIG9mIGJib3ggc2VlbSB0byBkbyBzb21lIGRlY29kaW5nKSAqLworCXNldGVudjEoIlFVRVJZX1NUUklORyIsIGdfcXVlcnkpOworCXB1dGVudigoY2hhciopIlNFUlZFUl9TT0ZUV0FSRT1idXN5Ym94IGh0dHBkLyJCQl9WRVIpOworCXB1dGVudigoY2hhciopIlNFUlZFUl9QUk9UT0NPTD1IVFRQLzEuMCIpOworCXB1dGVudigoY2hhciopIkdBVEVXQVlfSU5URVJGQUNFPUNHSS8xLjEiKTsKKwkvKiBIYXZpbmcgX3NlcGFyYXRlXyB2YXJpYWJsZXMgZm9yIElQIGFuZCBwb3J0IGRlZmVhdHMKKwkgKiB0aGUgcHVycG9zZSBvZiBoYXZpbmcgc29ja2V0IGFic3RyYWN0aW9uLiBXaGljaCAicG9ydCIKKwkgKiBhcmUgeW91IHVzaW5nIG9uIFVuaXggZG9tYWluIHNvY2tldD8KKwkgKiBJT1cgLSBSRU1PVEVfUEVFUj0iMS4yLjMuNDo1NiIgbWFrZXMgbXVjaCBtb3JlIHNlbnNlLgorCSAqIE9oIHdlbGwuLi4gKi8KKwl7CisJCWNoYXIgKnAgPSBybXRfaXBfc3RyID8gcm10X2lwX3N0ciA6IChjaGFyKikiIjsKKwkJY2hhciAqY3AgPSBzdHJyY2hyKHAsICc6Jyk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGNwICYmIHN0cmNocihjcCwgJ10nKSkKKwkJCWNwID0gTlVMTDsKKwkJaWYgKGNwKSAqY3AgPSAnXDAnOyAvKiBkZWxldGUgOlBPUlQgKi8KKwkJc2V0ZW52MSgiUkVNT1RFX0FERFIiLCBwKTsKKwkJaWYgKGNwKSB7CisJCQkqY3AgPSAnOic7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVgorCQkJc2V0ZW52MSgiUkVNT1RFX1BPUlQiLCBjcCArIDEpOworI2VuZGlmCisJCX0KKwl9CisJc2V0ZW52MSgiSFRUUF9VU0VSX0FHRU5UIiwgdXNlcl9hZ2VudCk7CisJaWYgKGh0dHBfYWNjZXB0KQorCQlzZXRlbnYxKCJIVFRQX0FDQ0VQVCIsIGh0dHBfYWNjZXB0KTsKKwlpZiAoaHR0cF9hY2NlcHRfbGFuZ3VhZ2UpCisJCXNldGVudjEoIkhUVFBfQUNDRVBUX0xBTkdVQUdFIiwgaHR0cF9hY2NlcHRfbGFuZ3VhZ2UpOworCWlmIChwb3N0X2xlbikKKwkJcHV0ZW52KHhhc3ByaW50ZigiQ09OVEVOVF9MRU5HVEg9JWQiLCBwb3N0X2xlbikpOworCWlmIChjb29raWUpCisJCXNldGVudjEoIkhUVFBfQ09PS0lFIiwgY29va2llKTsKKwlpZiAoY29udGVudF90eXBlKQorCQlzZXRlbnYxKCJDT05URU5UX1RZUEUiLCBjb250ZW50X3R5cGUpOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwlpZiAocmVtb3RldXNlcikgeworCQlzZXRlbnYxKCJSRU1PVEVfVVNFUiIsIHJlbW90ZXVzZXIpOworCQlwdXRlbnYoKGNoYXIqKSJBVVRIX1RZUEU9QmFzaWMiKTsKKwl9CisjZW5kaWYKKwlpZiAocmVmZXJlcikKKwkJc2V0ZW52MSgiSFRUUF9SRUZFUkVSIiwgcmVmZXJlcik7CisJc2V0ZW52MSgiSFRUUF9IT1NUIiwgaG9zdCk7IC8qIHNldCB0byAiIiBpZiBOVUxMICovCisJLyogc2V0ZW52MSgiU0VSVkVSX05BTUUiLCBzYWZlX2dldGhvc3RuYW1lKCkpOyAtIGRvbid0IGRvIHRoaXMsCisJICoganVzdCBydW4gImVudiBTRVJWRVJfTkFNRT14eXogaHR0cGQgLi4uIiBpbnN0ZWFkICovCisKKwl4cGlwZWRfcGFpcihmcm9tQ2dpKTsKKwl4cGlwZWRfcGFpcih0b0NnaSk7CisKKwlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPCAwKSB7CisJCS8qIFRPRE86IGxvZyBwZXJyb3I/ICovCisJCWxvZ19hbmRfZXhpdCgpOworCX0KKworCWlmICghcGlkKSB7CisJCS8qIENoaWxkIHByb2Nlc3MgKi8KKwkJY2hhciAqYXJndlszXTsKKworCQl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyNDI7CisKKwkJLyogTkI6IGNsb3NlIF9maXJzdF8sIHRoZW4gbW92ZSBmZHMhICovCisJCWNsb3NlKHRvQ2dpLndyKTsKKwkJY2xvc2UoZnJvbUNnaS5yZCk7CisJCXhtb3ZlX2ZkKHRvQ2dpLnJkLCAwKTsgIC8qIHJlcGxhY2Ugc3RkaW4gd2l0aCB0aGUgcGlwZSAqLworCQl4bW92ZV9mZChmcm9tQ2dpLndyLCAxKTsgIC8qIHJlcGxhY2Ugc3Rkb3V0IHdpdGggdGhlIHBpcGUgKi8KKwkJLyogVXNlciBzZWVpbmcgc3RkZXJyIG91dHB1dCBjYW4gYmUgYSBzZWN1cml0eSBwcm9ibGVtLgorCQkgKiBJZiBDR0kgcmVhbGx5IHdhbnRzIHRoYXQsIGl0IGNhbiBhbHdheXMgZG8gZHVwIGl0c2VsZi4gKi8KKwkJLyogZHVwMigxLCAyKTsgKi8KKworCQkvKiBDaGRpcmluZyB0byBzY3JpcHQncyBkaXIgKi8KKwkJc2NyaXB0ID0gc3RycmNocih1cmwsICcvJyk7CisJCWlmIChzY3JpcHQgIT0gdXJsKSB7IC8qIHBhcmFub2lhICovCisJCQkqc2NyaXB0ID0gJ1wwJzsKKwkJCWlmIChjaGRpcih1cmwgKyAxKSAhPSAwKSB7CisJCQkJYmJfcGVycm9yX21zZygiY2hkaXIoJXMpIiwgdXJsICsgMSk7CisJCQkJZ290byBlcnJvcl9leGVjaW5nX2NnaTsKKwkJCX0KKwkJCS8vIG5vdCBuZWVkZWQ6ICpzY3JpcHQgPSAnLyc7CisJCX0KKwkJc2NyaXB0Kys7CisKKwkJLyogc2V0IGFyZ3ZbMF0gdG8gbmFtZSB3aXRob3V0IHBhdGggKi8KKwkJYXJndlswXSA9IHNjcmlwdDsKKwkJYXJndlsxXSA9IE5VTEw7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCQl7CisJCQljaGFyICpzdWZmaXggPSBzdHJyY2hyKHNjcmlwdCwgJy4nKTsKKworCQkJaWYgKHN1ZmZpeCkgeworCQkJCUh0YWNjZXNzICpjdXI7CisJCQkJZm9yIChjdXIgPSBzY3JpcHRfaTsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJCQkJaWYgKHN0cmNtcChjdXItPmJlZm9yZV9jb2xvbiArIDEsIHN1ZmZpeCkgPT0gMCkgeworCQkJCQkJLyogZm91bmQgaW50ZXJwcmV0ZXIgbmFtZSAqLworCQkJCQkJYXJndlswXSA9IGN1ci0+YWZ0ZXJfY29sb247CisJCQkJCQlhcmd2WzFdID0gc2NyaXB0OworCQkJCQkJYXJndlsyXSA9IE5VTEw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisJCS8qIHJlc3RvcmUgZGVmYXVsdCBzaWduYWwgZGlzcG9zaXRpb25zIGZvciBDR0kgcHJvY2VzcyAqLworCQliYl9zaWduYWxzKDAKKwkJCXwgKDEgPDwgU0lHQ0hMRCkKKwkJCXwgKDEgPDwgU0lHUElQRSkKKwkJCXwgKDEgPDwgU0lHSFVQKQorCQkJLCBTSUdfREZMKTsKKworCQkvKiBfTk9UXyBleGVjdnAuIFdlIGRvIG5vdCBzZWFyY2ggUEFUSC4gYXJndlswXSBpcyBhIGZpbGVuYW1lCisJCSAqIHdpdGhvdXQgYW55IGRpciBjb21wb25lbnRzIGFuZCB3aWxsIG9ubHkgbWF0Y2ggYSBmaWxlCisJCSAqIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLworCQlleGVjdihhcmd2WzBdLCBhcmd2KTsKKwkJaWYgKHZlcmJvc2UpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsKKyBlcnJvcl9leGVjaW5nX2NnaToKKwkJLyogc2VuZCB0byBzdGRvdXQKKwkJICogKHdlIGFyZSBDR0kgaGVyZSwgb3VyIHN0ZG91dCBpcyBwdW1wZWQgdG8gdGhlIG5ldCkgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfTk9UX0ZPVU5EKTsKKwl9IC8qIGVuZCBjaGlsZCAqLworCisJLyogUGFyZW50IHByb2Nlc3MgKi8KKworCS8qIFJlc3RvcmUgdmFyaWFibGVzIHBvc3NpYmx5IGNoYW5nZWQgYnkgY2hpbGQgKi8KKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAwOworCisJLyogUHVtcCBkYXRhICovCisJY2xvc2UoZnJvbUNnaS53cik7CisJY2xvc2UodG9DZ2kucmQpOworCWNnaV9pb19sb29wX2FuZF9leGl0KGZyb21DZ2kucmQsIHRvQ2dpLndyLCBwb3N0X2xlbik7Cit9CisKKyNlbmRpZiAgICAgICAgICAvKiBGRUFUVVJFX0hUVFBEX0NHSSAqLworCisvKgorICogU2VuZCBhIGZpbGUgcmVzcG9uc2UgdG8gYSBIVFRQIHJlcXVlc3QsIGFuZCBleGl0CisgKgorICogUGFyYW1ldGVyczoKKyAqIGNvbnN0IGNoYXIgKnVybCAgVGhlIHJlcXVlc3RlZCBVUkwgKHdpdGggbGVhZGluZyAvKS4KKyAqIHdoYXQgICAgICAgICAgICAgV2hhdCB0byBzZW5kIChoZWFkZXJzL2JvZHkvYm90aCkuCisgKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIHNlbmRfZmlsZV9hbmRfZXhpdChjb25zdCBjaGFyICp1cmwsIGludCB3aGF0KQoreworCWNoYXIgKnN1ZmZpeDsKKwlpbnQgZmQ7CisJc3NpemVfdCBjb3VudDsKKworCWlmIChjb250ZW50X2d6aXApIHsKKwkJLyogZG9lcyA8dXJsPi5neiBleGlzdD8gVGhlbiB1c2UgaXQgaW5zdGVhZCAqLworCQljaGFyICpnenVybCA9IHhhc3ByaW50ZigiJXMuZ3oiLCB1cmwpOworCQlmZCA9IG9wZW4oZ3p1cmwsIE9fUkRPTkxZKTsKKwkJZnJlZShnenVybCk7CisJCWlmIChmZCAhPSAtMSkgeworCQkJc3RydWN0IHN0YXQgc2I7CisJCQlmc3RhdChmZCwgJnNiKTsKKwkJCWZpbGVfc2l6ZSA9IHNiLnN0X3NpemU7CisJCQlsYXN0X21vZCA9IHNiLnN0X210aW1lOworCQl9IGVsc2UgeworCQkJSUZfRkVBVFVSRV9IVFRQRF9HWklQKGNvbnRlbnRfZ3ppcCA9IDA7KQorCQkJZmQgPSBvcGVuKHVybCwgT19SRE9OTFkpOworCQl9CisJfSBlbHNlIHsKKwkJZmQgPSBvcGVuKHVybCwgT19SRE9OTFkpOworCX0KKwlpZiAoZmQgPCAwKSB7CisJCWlmIChERUJVRykKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IG9wZW4gJyVzJyIsIHVybCk7CisJCS8qIEVycm9yIHBhZ2VzIGFyZSBzZW50IGJ5IHVzaW5nIHNlbmRfZmlsZV9hbmRfZXhpdChTRU5EX0JPRFkpLgorCQkgKiBJT1c6IGl0IGlzIHVuc2FmZSB0byBjYWxsIHNlbmRfaGVhZGVyc19hbmRfZXhpdAorCQkgKiBpZiB3aGF0IGlzIFNFTkRfQk9EWSEgQ2FuIHJlY3Vyc2UhICovCisJCWlmICh3aGF0ICE9IFNFTkRfQk9EWSkKKwkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9GT1VORCk7CisJCWxvZ19hbmRfZXhpdCgpOworCX0KKwkvKiBJZiB5b3Ugd2FudCB0byBrbm93IGFib3V0IEVQSVBFIGJlbG93CisJICogKGhhcHBlbnMgaWYgeW91IGFib3J0IGRvd25sb2FkcyBmcm9tIGxvY2FsIGh0dHBkKTogKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwkvKiBJZiBub3QgZm91bmQsIGRlZmF1bHQgaXMgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgKi8KKwlmb3VuZF9taW1lX3R5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKwlzdWZmaXggPSBzdHJyY2hyKHVybCwgJy4nKTsKKwlpZiAoc3VmZml4KSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIHN1ZmZpeFRhYmxlW10gQUxJR04xID0KKwkJCS8qIFNob3J0ZXIgc3VmZml4IG11c3QgYmUgZmlyc3Q6CisJCQkgKiAiLmh0bWwuaHRtIiB3aWxsIGZhaWwgZm9yICIuaHRtIgorCQkJICovCisJCQkiLnR4dC5oLmMuY2MuY3BwXDAiICJ0ZXh0L3BsYWluXDAiCisJCQkvKiAuaHRtIGxpbmUgbXVzdCBiZSBhZnRlciAuaCBsaW5lICovCisJCQkiLmh0bS5odG1sXDAiICJ0ZXh0L2h0bWxcMCIKKwkJCSIuanBnLmpwZWdcMCIgImltYWdlL2pwZWdcMCIKKwkJCSIuZ2lmXDAiICAgICAgImltYWdlL2dpZlwwIgorCQkJIi5wbmdcMCIgICAgICAiaW1hZ2UvcG5nXDAiCisJCQkvKiAuY3NzIGxpbmUgbXVzdCBiZSBhZnRlciAuYyBsaW5lICovCisJCQkiLmNzc1wwIiAgICAgICJ0ZXh0L2Nzc1wwIgorCQkJIi53YXZcMCIgICAgICAiYXVkaW8vd2F2XDAiCisJCQkiLmF2aVwwIiAgICAgICJ2aWRlby94LW1zdmlkZW9cMCIKKwkJCSIucXQubW92XDAiICAgInZpZGVvL3F1aWNrdGltZVwwIgorCQkJIi5tcGUubXBlZ1wwIiAidmlkZW8vbXBlZ1wwIgorCQkJIi5taWQubWlkaVwwIiAiYXVkaW8vbWlkaVwwIgorCQkJIi5tcDNcMCIgICAgICAiYXVkaW8vbXBlZ1wwIgorI2lmIDAgIC8qIHVucG9wdWxhciAqLworCQkJIi5hdVwwIiAgICAgICAiYXVkaW8vYmFzaWNcMCIKKwkJCSIucGFjXDAiICAgICAgImFwcGxpY2F0aW9uL3gtbnMtcHJveHktYXV0b2NvbmZpZ1wwIgorCQkJIi52cm1sLndybFwwIiAibW9kZWwvdnJtbFwwIgorI2VuZGlmCisJCQkvKiBjb21waWxlciBhZGRzIGFub3RoZXIgIlwwIiBoZXJlICovCisJCTsKKwkJSHRhY2Nlc3MgKmN1cjsKKworCQkvKiBFeGFtaW5lIGJ1aWx0LWluIHRhYmxlICovCisJCWNvbnN0IGNoYXIgKnRhYmxlID0gc3VmZml4VGFibGU7CisJCWNvbnN0IGNoYXIgKnRhYmxlX25leHQ7CisJCWZvciAoOyAqdGFibGU7IHRhYmxlID0gdGFibGVfbmV4dCkgeworCQkJY29uc3QgY2hhciAqdHJ5X3N1ZmZpeDsKKwkJCWNvbnN0IGNoYXIgKm1pbWVfdHlwZTsKKwkJCW1pbWVfdHlwZSAgPSB0YWJsZSArIHN0cmxlbih0YWJsZSkgKyAxOworCQkJdGFibGVfbmV4dCA9IG1pbWVfdHlwZSArIHN0cmxlbihtaW1lX3R5cGUpICsgMTsKKwkJCXRyeV9zdWZmaXggPSBzdHJzdHIodGFibGUsIHN1ZmZpeCk7CisJCQlpZiAoIXRyeV9zdWZmaXgpCisJCQkJY29udGludWU7CisJCQl0cnlfc3VmZml4ICs9IHN0cmxlbihzdWZmaXgpOworCQkJaWYgKCp0cnlfc3VmZml4ID09ICdcMCcgfHwgKnRyeV9zdWZmaXggPT0gJy4nKSB7CisJCQkJZm91bmRfbWltZV90eXBlID0gbWltZV90eXBlOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRXhhbXBsZTogc3Ryc3RyKHRhYmxlLCAiLmF2IikgIT0gTlVMTCwgYnV0IGl0CisJCQkgKiBkb2VzIG5vdCBtYXRjaCAiLmF2aSIgYWZ0ZXIgYWxsIGFuZCB3ZSBlbmQgdXAgaGVyZS4KKwkJCSAqIFRoZSB0YWJsZSBpcyBhcnJhbmdlZCBzbyB0aGF0IGluIHRoaXMgY2FzZSB3ZSBrbm93CisJCQkgKiB0aGF0IGl0IGNhbid0IG1hdGNoIGFueXRoaW5nIGluIHRoZSBmb2xsb3dpbmcgbGluZXMsCisJCQkgKiBhbmQgd2Ugc3RvcCB0aGUgc2VhcmNoOiAqLworCQkJYnJlYWs7CisJCX0KKwkJLyogLi4udGhlbiB1c2VyJ3MgdGFibGUgKi8KKwkJZm9yIChjdXIgPSBtaW1lX2E7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCQlpZiAoc3RyY21wKGN1ci0+YmVmb3JlX2NvbG9uLCBzdWZmaXgpID09IDApIHsKKwkJCQlmb3VuZF9taW1lX3R5cGUgPSBjdXItPmFmdGVyX2NvbG9uOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKERFQlVHKQorCQliYl9lcnJvcl9tc2coInNlbmRpbmcgZmlsZSAnJXMnIGNvbnRlbnQtdHlwZTogJXMiLAorCQkJdXJsLCBmb3VuZF9taW1lX3R5cGUpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUkFOR0VTCisJaWYgKHdoYXQgPT0gU0VORF9CT0RZIC8qIGVyciBwYWdlcyBhbmQgcmFuZ2VzIGRvbid0IG1peCAqLworCSB8fCBjb250ZW50X2d6aXAgLyogd2UgYXJlIHNlbmRpbmcgY29tcHJlc3NlZCBwYWdlOiBjYW4ndCBkbyByYW5nZXMgKi8gIC8vL3doeT8KKwkpIHsKKwkJcmFuZ2Vfc3RhcnQgPSAwOworCX0KKwlyYW5nZV9sZW4gPSBNQVhJTlQob2ZmX3QpOworCWlmIChyYW5nZV9zdGFydCkgeworCQlpZiAoIXJhbmdlX2VuZCkgeworCQkJcmFuZ2VfZW5kID0gZmlsZV9zaXplIC0gMTsKKwkJfQorCQlpZiAocmFuZ2VfZW5kIDwgcmFuZ2Vfc3RhcnQKKwkJIHx8IGxzZWVrKGZkLCByYW5nZV9zdGFydCwgU0VFS19TRVQpICE9IHJhbmdlX3N0YXJ0CisJCSkgeworCQkJbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwkJCXJhbmdlX3N0YXJ0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJhbmdlX2xlbiA9IHJhbmdlX2VuZCAtIHJhbmdlX3N0YXJ0ICsgMTsKKwkJCXNlbmRfaGVhZGVycyhIVFRQX1BBUlRJQUxfQ09OVEVOVCk7CisJCQl3aGF0ID0gU0VORF9CT0RZOworCQl9CisJfQorI2VuZGlmCisJaWYgKHdoYXQgJiBTRU5EX0hFQURFUlMpCisJCXNlbmRfaGVhZGVycyhIVFRQX09LKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUKKwl7CisJCW9mZl90IG9mZnNldCA9IHJhbmdlX3N0YXJ0OworCQl3aGlsZSAoMSkgeworCQkJLyogc3ogaXMgcm91bmRlZCBkb3duIHRvIDY0ayAqLworCQkJc3NpemVfdCBzeiA9IE1BWElOVChzc2l6ZV90KSAtIDB4ZmZmZjsKKwkJCUlGX0ZFQVRVUkVfSFRUUERfUkFOR0VTKGlmIChzeiA+IHJhbmdlX2xlbikgc3ogPSByYW5nZV9sZW47KQorCQkJY291bnQgPSBzZW5kZmlsZShTVERPVVRfRklMRU5PLCBmZCwgJm9mZnNldCwgc3opOworCQkJaWYgKGNvdW50IDwgMCkgeworCQkJCWlmIChvZmZzZXQgPT0gcmFuZ2Vfc3RhcnQpCisJCQkJCWJyZWFrOyAvKiBmYWxsIGJhY2sgdG8gcmVhZC93cml0ZSBsb29wICovCisJCQkJZ290byBmaW47CisJCQl9CisJCQlJRl9GRUFUVVJFX0hUVFBEX1JBTkdFUyhyYW5nZV9sZW4gLT0gc3o7KQorCQkJaWYgKGNvdW50ID09IDAgfHwgcmFuZ2VfbGVuID09IDApCisJCQkJbG9nX2FuZF9leGl0KCk7CisJCX0KKwl9CisjZW5kaWYKKwl3aGlsZSAoKGNvdW50ID0gc2FmZV9yZWFkKGZkLCBpb2J1ZiwgSU9CVUZfU0laRSkpID4gMCkgeworCQlzc2l6ZV90IG47CisJCUlGX0ZFQVRVUkVfSFRUUERfUkFOR0VTKGlmIChjb3VudCA+IHJhbmdlX2xlbikgY291bnQgPSByYW5nZV9sZW47KQorCQluID0gZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBpb2J1ZiwgY291bnQpOworCQlpZiAoY291bnQgIT0gbikKKwkJCWJyZWFrOworCQlJRl9GRUFUVVJFX0hUVFBEX1JBTkdFUyhyYW5nZV9sZW4gLT0gY291bnQ7KQorCQlpZiAocmFuZ2VfbGVuID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGNvdW50IDwgMCkgeworIElGX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFKGZpbjopCisJCWlmICh2ZXJib3NlID4gMSkKKwkJCWJiX3BlcnJvcl9tc2coImVycm9yIik7CisJfQorCWxvZ19hbmRfZXhpdCgpOworfQorCitzdGF0aWMgaW50IGNoZWNrUGVybUlQKHZvaWQpCit7CisJSHRhY2Nlc3NfSVAgKmN1cjsKKworCWZvciAoY3VyID0gaXBfYV9kOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworI2lmIERFQlVHCisJCWZwcmludGYoc3RkZXJyLAorCQkJImNoZWNrUGVybUlQOiAnJXMnID8gJyV1LiV1LiV1LiV1LyV1LiV1LiV1LiV1J1xuIiwKKwkJCXJtdF9pcF9zdHIsCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5pcCA+PiAyNCksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5pcCA+PiAxNiksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5pcCA+PiA4KSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPmlwKSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPm1hc2sgPj4gMjQpLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+bWFzayA+PiAxNiksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5tYXNrID4+IDgpLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+bWFzaykKKwkJKTsKKyNlbmRpZgorCQlpZiAoKHJtdF9pcCAmIGN1ci0+bWFzaykgPT0gY3VyLT5pcCkKKwkJCXJldHVybiAoY3VyLT5hbGxvd19kZW55ID09ICdBJyk7IC8qIEEgLT4gMSAqLworCX0KKworCXJldHVybiAhZmxnX2RlbnlfYWxsOyAvKiBkZXBlbmRzIG9uIHdoZXRoZXIgd2Ugc2F3ICJEOioiICovCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisvKgorICogQ29uZmlnIGZpbGUgZW50cmllcyBhcmUgb2YgdGhlIGZvcm0gIi88cGF0aD46PHVzZXI+OjxwYXNzd2Q+Ii4KKyAqIElmIGNvbmZpZyBmaWxlIGhhcyBubyBwcmVmaXggbWF0Y2ggZm9yIHBhdGgsIGFjY2VzcyBpcyBhbGxvd2VkLgorICoKKyAqIHBhdGggICAgICAgICAgICAgICAgIFRoZSBmaWxlIHBhdGgKKyAqIHVzZXJfYW5kX3Bhc3N3ZCAgICAgICJ1c2VyOnBhc3N3ZCIgdG8gdmFsaWRhdGUKKyAqCisgKiBSZXR1cm5zIDEgaWYgdXNlcl9hbmRfcGFzc3dkIGlzIE9LLgorICovCitzdGF0aWMgaW50IGNoZWNrX3VzZXJfcGFzc3dkKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnVzZXJfYW5kX3Bhc3N3ZCkKK3sKKwlIdGFjY2VzcyAqY3VyOworCWNvbnN0IGNoYXIgKnByZXYgPSBOVUxMOworCisJZm9yIChjdXIgPSBnX2F1dGg7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCWNvbnN0IGNoYXIgKmRpcl9wcmVmaXg7CisJCXNpemVfdCBsZW47CisKKwkJZGlyX3ByZWZpeCA9IGN1ci0+YmVmb3JlX2NvbG9uOworCisJCS8qIFdIWT8gKi8KKwkJLyogSWYgYWxyZWFkeSBzYXcgYSBtYXRjaCwgZG9uJ3QgYWNjZXB0IG90aGVyIGRpZmZlcmVudCBtYXRjaGVzICovCisJCWlmIChwcmV2ICYmIHN0cmNtcChwcmV2LCBkaXJfcHJlZml4KSAhPSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKERFQlVHKQorCQkJZnByaW50ZihzdGRlcnIsICJjaGVja1Blcm06ICclcycgPyAnJXMnXG4iLCBkaXJfcHJlZml4LCB1c2VyX2FuZF9wYXNzd2QpOworCisJCS8qIElmIGl0J3Mgbm90IGEgcHJlZml4IG1hdGNoLCBjb250aW51ZSBzZWFyY2hpbmcgKi8KKwkJbGVuID0gc3RybGVuKGRpcl9wcmVmaXgpOworCQlpZiAobGVuICE9IDEgLyogZGlyX3ByZWZpeCAiLyIgbWF0Y2hlcyBhbGwsIGRvbid0IG5lZWQgdG8gY2hlY2sgKi8KKwkJICYmIChzdHJuY21wKGRpcl9wcmVmaXgsIHBhdGgsIGxlbikgIT0gMAorCQkgICAgfHwgKHBhdGhbbGVuXSAhPSAnLycgJiYgcGF0aFtsZW5dICE9ICdcMCcpKQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUGF0aCBtYXRjaCBmb3VuZCAqLworCQlwcmV2ID0gZGlyX3ByZWZpeDsKKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUpIHsKKwkJCWNoYXIgKm1kNV9wYXNzd2Q7CisKKwkJCW1kNV9wYXNzd2QgPSBzdHJjaHIoY3VyLT5hZnRlcl9jb2xvbiwgJzonKTsKKwkJCWlmIChtZDVfcGFzc3dkICYmIG1kNV9wYXNzd2RbMV0gPT0gJyQnICYmIG1kNV9wYXNzd2RbMl0gPT0gJzEnCisJCQkgJiYgbWQ1X3Bhc3N3ZFszXSA9PSAnJCcgJiYgbWQ1X3Bhc3N3ZFs0XQorCQkJKSB7CisJCQkJY2hhciAqZW5jcnlwdGVkOworCQkJCWludCByLCB1c2VyX2xlbl9wMTsKKworCQkJCW1kNV9wYXNzd2QrKzsKKwkJCQl1c2VyX2xlbl9wMSA9IG1kNV9wYXNzd2QgLSBjdXItPmFmdGVyX2NvbG9uOworCQkJCS8qIGNvbXBhcmluZyAidXNlcjoiICovCisJCQkJaWYgKHN0cm5jbXAoY3VyLT5hZnRlcl9jb2xvbiwgdXNlcl9hbmRfcGFzc3dkLCB1c2VyX2xlbl9wMSkgIT0gMCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQllbmNyeXB0ZWQgPSBwd19lbmNyeXB0KAorCQkJCQl1c2VyX2FuZF9wYXNzd2QgKyB1c2VyX2xlbl9wMSAvKiBjbGVhcnRleHQgcHdkIGZyb20gdXNlciAqLywKKwkJCQkJbWQ1X3Bhc3N3ZCAvKnNhbHQgKi8sIDEgLyogY2xlYW51cCAqLyk7CisJCQkJciA9IHN0cmNtcChlbmNyeXB0ZWQsIG1kNV9wYXNzd2QpOworCQkJCWZyZWUoZW5jcnlwdGVkKTsKKwkJCQlpZiAociA9PSAwKQorCQkJCQlnb3RvIHNldF9yZW1vdGV1c2VyX3ZhcjsgLyogT2sgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIENvbXBhcmluZyBwbGFpbnRleHQgInVzZXI6cGFzcyIgaW4gb25lIGdvICovCisJCWlmIChzdHJjbXAoY3VyLT5hZnRlcl9jb2xvbiwgdXNlcl9hbmRfcGFzc3dkKSA9PSAwKSB7Cisgc2V0X3JlbW90ZXVzZXJfdmFyOgorCQkJcmVtb3RldXNlciA9IHhzdHJuZHVwKHVzZXJfYW5kX3Bhc3N3ZCwKKwkJCQkJc3RyY2hybnVsKHVzZXJfYW5kX3Bhc3N3ZCwgJzonKSAtIHVzZXJfYW5kX3Bhc3N3ZCk7CisJCQlyZXR1cm4gMTsgLyogT2sgKi8KKwkJfQorCX0gLyogZm9yICovCisKKwkvKiAwKGJhZCkgaWYgcHJldiBpcyBzZXQ6IG1hdGNoZXMgd2VyZSBmb3VuZCBidXQgcGFzc3dkIHdhcyB3cm9uZyAqLworCXJldHVybiAocHJldiA9PSBOVUxMKTsKK30KKyNlbmRpZiAgLyogRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorc3RhdGljIEh0YWNjZXNzX1Byb3h5ICpmaW5kX3Byb3h5X2VudHJ5KGNvbnN0IGNoYXIgKnVybCkKK3sKKwlIdGFjY2Vzc19Qcm94eSAqcDsKKwlmb3IgKHAgPSBwcm94eTsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHN0cm5jbXAodXJsLCBwLT51cmxfZnJvbSwgc3RybGVuKHAtPnVybF9mcm9tKSkgPT0gMCkKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogSGFuZGxlIHRpbWVvdXRzCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfUkVRVUVTVF9USU1FT1VUX2FuZF9leGl0KGludCBzaWcpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgc2VuZF9SRVFVRVNUX1RJTUVPVVRfYW5kX2V4aXQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfUkVRVUVTVF9USU1FT1VUKTsKK30KKworLyoKKyAqIEhhbmRsZSBhbiBpbmNvbWluZyBodHRwIHJlcXVlc3QgYW5kIGV4aXQuCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9pbmNvbWluZ19hbmRfZXhpdChjb25zdCBsZW5fYW5kX3NvY2thZGRyICpmcm9tQWRkcikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBoYW5kbGVfaW5jb21pbmdfYW5kX2V4aXQoY29uc3QgbGVuX2FuZF9zb2NrYWRkciAqZnJvbUFkZHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcmVxdWVzdF9HRVRbXSBBTElHTjEgPSAiR0VUIjsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwljaGFyICp1cmxjb3B5OworCWNoYXIgKnVybHA7CisJY2hhciAqdHB0cjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKwlzdGF0aWMgY29uc3QgY2hhciByZXF1ZXN0X0hFQURbXSBBTElHTjEgPSAiSEVBRCI7CisJY29uc3QgY2hhciAqcHJlcXVlc3Q7CisJY2hhciAqY29va2llID0gTlVMTDsKKwljaGFyICpjb250ZW50X3R5cGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisjZGVmaW5lIHByZXF1ZXN0IHJlcXVlc3RfR0VUCisJdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCXNtYWxsaW50IGF1dGhvcml6ZWQgPSAtMTsKKyNlbmRpZgorCXNtYWxsaW50IGlwX2FsbG93ZWQ7CisJY2hhciBodHRwX21ham9yX3ZlcnNpb247CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwljaGFyIGh0dHBfbWlub3JfdmVyc2lvbjsKKwljaGFyICpoZWFkZXJfYnVmID0gaGVhZGVyX2J1ZjsgLyogZm9yIGdjYyAqLworCWNoYXIgKmhlYWRlcl9wdHIgPSBoZWFkZXJfcHRyOworCUh0YWNjZXNzX1Byb3h5ICpwcm94eV9lbnRyeTsKKyNlbmRpZgorCisJLyogQWxsb2NhdGlvbiBvZiBpb2J1ZiBpcyBwb3N0cG9uZWQgdW50aWwgbm93CisJICogKElPVywgc2VydmVyIHByb2Nlc3MgZG9lc24ndCBuZWVkIHRvIHdhc3RlIDhrKSAqLworCWlvYnVmID0geG1hbGxvYyhJT0JVRl9TSVpFKTsKKworCXJtdF9pcCA9IDA7CisJaWYgKGZyb21BZGRyLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXJtdF9pcCA9IG50b2hsKGZyb21BZGRyLT51LnNpbi5zaW5fYWRkci5zX2FkZHIpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKGZyb21BZGRyLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNgorCSAmJiBmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMF0gPT0gMAorCSAmJiBmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMV0gPT0gMAorCSAmJiBudG9obChmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMl0pID09IDB4ZmZmZikKKwkJcm10X2lwID0gbnRvaGwoZnJvbUFkZHItPnUuc2luNi5zaW42X2FkZHIuczZfYWRkcjMyWzNdKTsKKyNlbmRpZgorCWlmIChFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kgfHwgREVCVUcgfHwgdmVyYm9zZSkgeworCQkvKiBOQjogY2FuIGJlIE5VTEwgKHVzZXIgcnVucyBodHRwZCAtaSBieSBoYW5kPykgKi8KKwkJcm10X2lwX3N0ciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZmcm9tQWRkci0+dS5zYSk7CisJfQorCWlmICh2ZXJib3NlKSB7CisJCS8qIHRoaXMgdHJpY2sgbWFrZXMgLXYgbG9nZ2luZyBtdWNoIHNpbXBsZXIgKi8KKwkJaWYgKHJtdF9pcF9zdHIpCisJCQlhcHBsZXRfbmFtZSA9IHJtdF9pcF9zdHI7CisJCWlmICh2ZXJib3NlID4gMikKKwkJCWJiX2Vycm9yX21zZygiY29ubmVjdGVkIik7CisJfQorCisJLyogSW5zdGFsbCB0aW1lb3V0IGhhbmRsZXIuIGdldF9saW5lKCkgbmVlZHMgaXQuICovCisJc2lnbmFsKFNJR0FMUk0sIHNlbmRfUkVRVUVTVF9USU1FT1VUX2FuZF9leGl0KTsKKworCWlmICghZ2V0X2xpbmUoKSkgLyogRU9GIG9yIGVycm9yIG9yIGVtcHR5IGxpbmUgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCisJLyogRGV0ZXJtaW5lIHR5cGUgb2YgcmVxdWVzdCAoR0VUL1BPU1QpICovCisJdXJscCA9IHN0cnBicmsoaW9idWYsICIgXHQiKTsKKwlpZiAodXJscCA9PSBOVUxMKQorCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJKnVybHArKyA9ICdcMCc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJCisJcHJlcXVlc3QgPSByZXF1ZXN0X0dFVDsKKwlpZiAoc3RyY2FzZWNtcChpb2J1ZiwgcHJlcXVlc3QpICE9IDApIHsKKwkJcHJlcXVlc3QgPSByZXF1ZXN0X0hFQUQ7CisJCWlmIChzdHJjYXNlY21wKGlvYnVmLCBwcmVxdWVzdCkgIT0gMCkgeworCQkJcHJlcXVlc3QgPSAiUE9TVCI7CisJCQlpZiAoc3RyY2FzZWNtcChpb2J1ZiwgcHJlcXVlc3QpICE9IDApCisJCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfTk9UX0lNUExFTUVOVEVEKTsKKwkJfQorCX0KKyNlbHNlCisJaWYgKHN0cmNhc2VjbXAoaW9idWYsIHJlcXVlc3RfR0VUKSAhPSAwKQorCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9OT1RfSU1QTEVNRU5URUQpOworI2VuZGlmCisJdXJscCA9IHNraXBfd2hpdGVzcGFjZSh1cmxwKTsKKwlpZiAodXJscFswXSAhPSAnLycpCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0JBRF9SRVFVRVNUKTsKKworCS8qIEZpbmQgZW5kIG9mIFVSTCBhbmQgcGFyc2UgSFRUUCB2ZXJzaW9uLCBpZiBhbnkgKi8KKwlodHRwX21ham9yX3ZlcnNpb24gPSAnMCc7CisJSUZfRkVBVFVSRV9IVFRQRF9QUk9YWShodHRwX21pbm9yX3ZlcnNpb24gPSAnMCc7KQorCXRwdHIgPSBzdHJjaHJudWwodXJscCwgJyAnKTsKKwkvKiBJcyBpdCAiIEhUVFAvIj8gKi8KKwlpZiAodHB0clswXSAmJiBzdHJuY21wKHRwdHIgKyAxLCBIVFRQXzIwMCwgNSkgPT0gMCkgeworCQlodHRwX21ham9yX3ZlcnNpb24gPSB0cHRyWzZdOworCQlJRl9GRUFUVVJFX0hUVFBEX1BST1hZKGh0dHBfbWlub3JfdmVyc2lvbiA9IHRwdHJbOF07KQorCX0KKwkqdHB0ciA9ICdcMCc7CisKKwkvKiBDb3B5IFVSTCBmcm9tIGFmdGVyICJHRVQgIi8iUE9TVCAiIHRvIHN0YWNrLWFsbG9jYXRlZCBjaGFyW10gKi8KKwl1cmxjb3B5ID0gYWxsb2NhKCh0cHRyIC0gdXJscCkgKyAyICsgc3RybGVuKGluZGV4X3BhZ2UpKTsKKwkvKmlmICh1cmxjb3B5ID09IE5VTEwpCisJICoJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsqLworCXN0cmNweSh1cmxjb3B5LCB1cmxwKTsKKwkvKiBOQjogdXJsY29weSBwdHIgaXMgbmV2ZXIgY2hhbmdlZCBhZnRlciB0aGlzICovCisKKwkvKiBFeHRyYWN0IHVybCBhcmdzIGlmIHByZXNlbnQgKi8KKwlnX3F1ZXJ5ID0gTlVMTDsKKwl0cHRyID0gc3RyY2hyKHVybGNvcHksICc/Jyk7CisJaWYgKHRwdHIpIHsKKwkJKnRwdHIrKyA9ICdcMCc7CisJCWdfcXVlcnkgPSB0cHRyOworCX0KKworCS8qIERlY29kZSBVUkwgZXNjYXBlIHNlcXVlbmNlcyAqLworCXRwdHIgPSBkZWNvZGVTdHJpbmcodXJsY29weSwgMCk7CisJaWYgKHRwdHIgPT0gTlVMTCkKKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCWlmICh0cHRyID09IHVybGNvcHkgKyAxKSB7CisJCS8qICcvJyBvciBOVUwgaXMgZW5jb2RlZCAqLworCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9OT1RfRk9VTkQpOworCX0KKworCS8qIENhbm9uaWNhbGl6ZSBwYXRoICovCisJLyogQWxnb3JpdGhtIHN0b2xlbiBmcm9tIGxpYmJiIGJiX3NpbXBsaWZ5X3BhdGgoKSwKKwkgKiBidXQgZG9uJ3Qgc3RyZHVwLCByZXRhaW4gdHJhaWxpbmcgc2xhc2gsIHByb3RlY3Qgcm9vdCAqLworCXVybHAgPSB0cHRyID0gdXJsY29weTsKKwlkbyB7CisJCWlmICgqdXJscCA9PSAnLycpIHsKKwkJCS8qIHNraXAgZHVwbGljYXRlIChvciBpbml0aWFsKSBzbGFzaCAqLworCQkJaWYgKCp0cHRyID09ICcvJykgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCp0cHRyID09ICcuJykgeworCQkJCS8qIHNraXAgZXh0cmEgIi8uLyIgKi8KKwkJCQlpZiAodHB0clsxXSA9PSAnLycgfHwgIXRwdHJbMV0pIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qICIuLiI6IGJlIGNhcmVmdWwgKi8KKwkJCQlpZiAodHB0clsxXSA9PSAnLicgJiYgKHRwdHJbMl0gPT0gJy8nIHx8ICF0cHRyWzJdKSkgeworCQkJCQkrK3RwdHI7CisJCQkJCWlmICh1cmxwID09IHVybGNvcHkpIC8qIHByb3RlY3Qgcm9vdCAqLworCQkJCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCQkJCQl3aGlsZSAoKi0tdXJscCAhPSAnLycpIC8qIG9taXQgcHJldmlvdXMgZGlyICovOworCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJCSorK3VybHAgPSAqdHB0cjsKKwl9IHdoaWxlICgqKyt0cHRyKTsKKwkqKyt1cmxwID0gJ1wwJzsgICAgICAgLyogdGVybWluYXRlIGFmdGVyIGxhc3QgY2hhcmFjdGVyICovCisKKwkvKiBJZiBVUkwgaXMgYSBkaXJlY3RvcnksIGFkZCAnLycgKi8KKwlpZiAodXJscFstMV0gIT0gJy8nKSB7CisJCWlmIChpc19kaXJlY3RvcnkodXJsY29weSArIDEsIDEsIE5VTEwpKSB7CisJCQlmb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSA9IHVybGNvcHk7CisJCX0KKwl9CisKKwkvKiBMb2cgaXQgKi8KKwlpZiAodmVyYm9zZSA+IDEpCisJCWJiX2Vycm9yX21zZygidXJsOiVzIiwgdXJsY29weSk7CisKKwl0cHRyID0gdXJsY29weTsKKwlpcF9hbGxvd2VkID0gY2hlY2tQZXJtSVAoKTsKKwl3aGlsZSAoaXBfYWxsb3dlZCAmJiAodHB0ciA9IHN0cmNocih0cHRyICsgMSwgJy8nKSkgIT0gTlVMTCkgeworCQkvKiBoYXZlIHBhdGgxL3BhdGgyICovCisJCSp0cHRyID0gJ1wwJzsKKwkJaWYgKGlzX2RpcmVjdG9yeSh1cmxjb3B5ICsgMSwgMSwgTlVMTCkpIHsKKwkJCS8qIG1heSBoYXZlIHN1YmRpciBjb25maWcgKi8KKwkJCXBhcnNlX2NvbmYodXJsY29weSArIDEsIFNVQkRJUl9QQVJTRSk7CisJCQlpcF9hbGxvd2VkID0gY2hlY2tQZXJtSVAoKTsKKwkJfQorCQkqdHB0ciA9ICcvJzsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCXByb3h5X2VudHJ5ID0gZmluZF9wcm94eV9lbnRyeSh1cmxjb3B5KTsKKwlpZiAocHJveHlfZW50cnkpCisJCWhlYWRlcl9idWYgPSBoZWFkZXJfcHRyID0geG1hbGxvYyhJT0JVRl9TSVpFKTsKKyNlbmRpZgorCisJaWYgKGh0dHBfbWFqb3JfdmVyc2lvbiA+PSAnMCcpIHsKKwkJLyogUmVxdWVzdCB3YXMgd2l0aCAiLi4uIEhUVFAvblhYWCIsIGFuZCBuID49IDAgKi8KKworCQkvKiBSZWFkIHVudGlsIGJsYW5rIGxpbmUgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWlmICghZ2V0X2xpbmUoKSkKKwkJCQlicmVhazsgLyogRU9GIG9yIGVycm9yIG9yIGVtcHR5IGxpbmUgKi8KKwkJCWlmIChERUJVRykKKwkJCQliYl9lcnJvcl9tc2coImhlYWRlcjogJyVzJyIsIGlvYnVmKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisJCQkvKiBXZSBuZWVkIDIgbW9yZSBieXRlcyBmb3IgeWV0IGFub3RoZXIgIlxyXG4iIC0KKwkJCSAqIHNlZSBuZWFyIGZkcHJpbnRmKHByb3h5X2ZkLi4uKSBmdXJ0aGVyIGJlbG93ICovCisJCQlpZiAocHJveHlfZW50cnkgJiYgKGhlYWRlcl9wdHIgLSBoZWFkZXJfYnVmKSA8IElPQlVGX1NJWkUgLSAyKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihpb2J1Zik7CisJCQkJaWYgKGxlbiA+IElPQlVGX1NJWkUgLSAoaGVhZGVyX3B0ciAtIGhlYWRlcl9idWYpIC0gNCkKKwkJCQkJbGVuID0gSU9CVUZfU0laRSAtIChoZWFkZXJfcHRyIC0gaGVhZGVyX2J1ZikgLSA0OworCQkJCW1lbWNweShoZWFkZXJfcHRyLCBpb2J1ZiwgbGVuKTsKKwkJCQloZWFkZXJfcHRyICs9IGxlbjsKKwkJCQloZWFkZXJfcHRyWzBdID0gJ1xyJzsKKwkJCQloZWFkZXJfcHRyWzFdID0gJ1xuJzsKKwkJCQloZWFkZXJfcHRyICs9IDI7CisJCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSSB8fCBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCQkJLyogVHJ5IGFuZCBkbyBvdXIgYmVzdCB0byBwYXJzZSBtb3JlIGxpbmVzICovCisJCQlpZiAoKFNUUk5DQVNFQ01QKGlvYnVmLCAiQ29udGVudC1sZW5ndGg6IikgPT0gMCkpIHsKKwkJCQkvKiBleHRyYSByZWFkIG9ubHkgZm9yIFBPU1QgKi8KKwkJCQlpZiAocHJlcXVlc3QgIT0gcmVxdWVzdF9HRVQKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJCisJCQkJICYmIHByZXF1ZXN0ICE9IHJlcXVlc3RfSEVBRAorIyBlbmRpZgorCQkJCSkgeworCQkJCQl0cHRyID0gc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJDb250ZW50LWxlbmd0aDoiKSAtIDEpOworCQkJCQlpZiAoIXRwdHJbMF0pCisJCQkJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJCQkJCS8qIG5vdCB1c2luZyBzdHJ0b3VsOiBpdCBpZ25vcmVzIGxlYWRpbmcgbWludXMhICovCisJCQkJCWxlbmd0aCA9IGJiX3N0cnRvdSh0cHRyLCBOVUxMLCAxMCk7CisJCQkJCS8qIGxlbmd0aCBpcyAidWxvbmciLCBidXQgd2UgbmVlZCB0byBwYXNzIGl0IHRvIGludCBsYXRlciAqLworCQkJCQlpZiAoZXJybm8gfHwgbGVuZ3RoID4gSU5UX01BWCkKKwkJCQkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0JBRF9SRVFVRVNUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKwkJCWVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiQ29va2llOiIpID09IDApIHsKKwkJCQljb29raWUgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiQ29va2llOiIpLTEpKTsKKwkJCX0gZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJDb250ZW50LVR5cGU6IikgPT0gMCkgeworCQkJCWNvbnRlbnRfdHlwZSA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJDb250ZW50LVR5cGU6IiktMSkpOworCQkJfSBlbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIlJlZmVyZXI6IikgPT0gMCkgeworCQkJCXJlZmVyZXIgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiUmVmZXJlcjoiKS0xKSk7CisJCQl9IGVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiVXNlci1BZ2VudDoiKSA9PSAwKSB7CisJCQkJdXNlcl9hZ2VudCA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJVc2VyLUFnZW50OiIpLTEpKTsKKwkJCX0gZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJIb3N0OiIpID09IDApIHsKKwkJCQlob3N0ID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkhvc3Q6IiktMSkpOworCQkJfSBlbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkFjY2VwdDoiKSA9PSAwKSB7CisJCQkJaHR0cF9hY2NlcHQgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiQWNjZXB0OiIpLTEpKTsKKwkJCX0gZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJBY2NlcHQtTGFuZ3VhZ2U6IikgPT0gMCkgeworCQkJCWh0dHBfYWNjZXB0X2xhbmd1YWdlID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkFjY2VwdC1MYW5ndWFnZToiKS0xKSk7CisJCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJCQlpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJBdXRob3JpemF0aW9uOiIpID09IDApIHsKKwkJCQkvKiBXZSBvbmx5IGFsbG93IEJhc2ljIGNyZWRlbnRpYWxzLgorCQkJCSAqIEl0IHNob3dzIHVwIGFzICJBdXRob3JpemF0aW9uOiBCYXNpYyA8dXNlcj46PHBhc3N3ZD4iIHdoZXJlCisJCQkJICogIjx1c2VyPjo8cGFzc3dkPiIgaXMgYmFzZTY0IGVuY29kZWQuCisJCQkJICovCisJCQkJdHB0ciA9IHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiQXV0aG9yaXphdGlvbjoiKS0xKTsKKwkJCQlpZiAoU1RSTkNBU0VDTVAodHB0ciwgIkJhc2ljIikgIT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJdHB0ciArPSBzaXplb2YoIkJhc2ljIiktMTsKKwkJCQkvKiBkZWNvZGVCYXNlNjQoKSBza2lwcyB3aGl0ZXNwYWNlIGl0c2VsZiAqLworCQkJCWRlY29kZUJhc2U2NCh0cHRyKTsKKwkJCQlhdXRob3JpemVkID0gY2hlY2tfdXNlcl9wYXNzd2QodXJsY29weSwgdHB0cik7CisJCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwkJCWlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIlJhbmdlOiIpID09IDApIHsKKwkJCQkvKiBXZSBrbm93IG9ubHkgYnl0ZXM9Tk5OLVtNTU1dICovCisJCQkJY2hhciAqcyA9IHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiUmFuZ2U6IiktMSk7CisJCQkJaWYgKHN0cm5jbXAocywgImJ5dGVzPSIsIDYpID09IDApIHsKKwkJCQkJcyArPSBzaXplb2YoImJ5dGVzPSIpLTE7CisJCQkJCXJhbmdlX3N0YXJ0ID0gQkJfU1RSVE9PRkYocywgJnMsIDEwKTsKKwkJCQkJaWYgKHNbMF0gIT0gJy0nIHx8IHJhbmdlX3N0YXJ0IDwgMCkgeworCQkJCQkJcmFuZ2Vfc3RhcnQgPSAwOworCQkJCQl9IGVsc2UgaWYgKHNbMV0pIHsKKwkJCQkJCXJhbmdlX2VuZCA9IEJCX1NUUlRPT0ZGKHMrMSwgTlVMTCwgMTApOworCQkJCQkJaWYgKGVycm5vIHx8IHJhbmdlX2VuZCA8IHJhbmdlX3N0YXJ0KQorCQkJCQkJCXJhbmdlX3N0YXJ0ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0daSVAKKwkJCWlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkFjY2VwdC1FbmNvZGluZzoiKSA9PSAwKSB7CisJCQkJLyogTm90ZTogd2UgZG8gbm90IHN1cHBvcnQgImd6aXA7cT0wIgorCQkJCSAqIG1ldGhvZCBvZiBfZGlzYWJsaW5nXyBnemlwCisJCQkJICogZGVsaXZlcnkuIE5vIG9uZSB1c2VzIHRoYXQsIHRob3VnaCAqLworCQkJCWNvbnN0IGNoYXIgKnMgPSBzdHJzdHIoaW9idWYsICJnemlwIik7CisJCQkJaWYgKHMpIHsKKwkJCQkJLy8gd2FudCBtb3JlIHRob3JvdWdoIGNoZWNrcz8KKwkJCQkJLy9pZiAoc1stMV0gPT0gJyAnCisJCQkJCS8vIHx8IHNbLTFdID09ICcsJworCQkJCQkvLyB8fCBzWy0xXSA9PSAnOicKKwkJCQkJLy8pIHsKKwkJCQkJCWNvbnRlbnRfZ3ppcCA9IDE7CisJCQkJCS8vfQorCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9IC8qIHdoaWxlIGV4dHJhIGhlYWRlciByZWFkaW5nICovCisJfQorCisJLyogV2UgYXJlIGRvbmUgcmVhZGluZyBoZWFkZXJzLCBkaXNhYmxlIHBlZXIgdGltZW91dCAqLworCWFsYXJtKDApOworCisJaWYgKHN0cmNtcChiYl9iYXNlbmFtZSh1cmxjb3B5KSwgSFRUUERfQ09ORikgPT0gMCB8fCAhaXBfYWxsb3dlZCkgeworCQkvKiBwcm90ZWN0IGxpc3RpbmcgWy9wYXRoXS9odHRwZC5jb25mIG9yIElQIGRlbnkgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfRk9SQklEREVOKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJLyogQ2FzZTogbm8gIkF1dGhvcml6YXRpb246IiB3YXMgc2VlbiwgYnV0IHBhZ2UgZG9lcyByZXF1aXJlIHBhc3N3ZC4KKwkgKiBDaGVjayB0aGF0IHdpdGggZHVtbXkgdXNlcjpwYXNzICovCisJaWYgKGF1dGhvcml6ZWQgPCAwKQorCQlhdXRob3JpemVkID0gY2hlY2tfdXNlcl9wYXNzd2QodXJsY29weSwgIjoiKTsKKwlpZiAoIWF1dGhvcml6ZWQpCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX1VOQVVUSE9SSVpFRCk7CisjZW5kaWYKKworCWlmIChmb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSkgeworCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9NT1ZFRF9URU1QT1JBUklMWSk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwlpZiAocHJveHlfZW50cnkgIT0gTlVMTCkgeworCQlpbnQgcHJveHlfZmQ7CisJCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCQlwcm94eV9mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJCWlmIChwcm94eV9mZCA8IDApCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQlsc2EgPSBob3N0MnNvY2thZGRyKHByb3h5X2VudHJ5LT5ob3N0X3BvcnQsIDgwKTsKKwkJaWYgKGxzYSA9PSBOVUxMKQorCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKwkJaWYgKGNvbm5lY3QocHJveHlfZmQsICZsc2EtPnUuc2EsIGxzYS0+bGVuKSA8IDApCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQlmZHByaW50Zihwcm94eV9mZCwgIiVzICVzJXMlcyVzIEhUVFAvJWMuJWNcclxuIiwKKwkJCQlwcmVxdWVzdCwgLyogR0VUIG9yIFBPU1QgKi8KKwkJCQlwcm94eV9lbnRyeS0+dXJsX3RvLCAvKiB1cmwgcGFydCAxICovCisJCQkJdXJsY29weSArIHN0cmxlbihwcm94eV9lbnRyeS0+dXJsX2Zyb20pLCAvKiB1cmwgcGFydCAyICovCisJCQkJKGdfcXVlcnkgPyAiPyIgOiAiIiksIC8qICI/IiAobWF5YmUpICovCisJCQkJKGdfcXVlcnkgPyBnX3F1ZXJ5IDogIiIpLCAvKiBxdWVyeSBzdHJpbmcgKG1heWJlKSAqLworCQkJCWh0dHBfbWFqb3JfdmVyc2lvbiwgaHR0cF9taW5vcl92ZXJzaW9uKTsKKwkJaGVhZGVyX3B0clswXSA9ICdccic7CisJCWhlYWRlcl9wdHJbMV0gPSAnXG4nOworCQloZWFkZXJfcHRyICs9IDI7CisJCXdyaXRlKHByb3h5X2ZkLCBoZWFkZXJfYnVmLCBoZWFkZXJfcHRyIC0gaGVhZGVyX2J1Zik7CisJCWZyZWUoaGVhZGVyX2J1Zik7IC8qIG9uIHRoZSBvcmRlciBvZiA4aywgZnJlZSBpdCAqLworCQljZ2lfaW9fbG9vcF9hbmRfZXhpdChwcm94eV9mZCwgcHJveHlfZmQsIGxlbmd0aCk7CisJfQorI2VuZGlmCisKKwl0cHRyID0gdXJsY29weSArIDE7ICAgICAgLyogc2tpcCBmaXJzdCAnLycgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCWlmIChzdHJuY21wKHRwdHIsICJjZ2ktYmluLyIsIDgpID09IDApIHsKKwkJaWYgKHRwdHJbOF0gPT0gJ1wwJykgeworCQkJLyogcHJvdGVjdCBsaXN0aW5nICJjZ2ktYmluLyIgKi8KKwkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX0ZPUkJJRERFTik7CisJCX0KKwkJc2VuZF9jZ2lfYW5kX2V4aXQodXJsY29weSwgcHJlcXVlc3QsIGxlbmd0aCwgY29va2llLCBjb250ZW50X3R5cGUpOworCX0KKyNlbmRpZgorCisJaWYgKHVybHBbLTFdID09ICcvJykKKwkJc3RyY3B5KHVybHAsIGluZGV4X3BhZ2UpOworCWlmIChzdGF0KHRwdHIsICZzYikgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSCisJCWNoYXIgKnN1ZmZpeCA9IHN0cnJjaHIodHB0ciwgJy4nKTsKKwkJaWYgKHN1ZmZpeCkgeworCQkJSHRhY2Nlc3MgKmN1cjsKKwkJCWZvciAoY3VyID0gc2NyaXB0X2k7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCQkJaWYgKHN0cmNtcChjdXItPmJlZm9yZV9jb2xvbiArIDEsIHN1ZmZpeCkgPT0gMCkgeworCQkJCQlzZW5kX2NnaV9hbmRfZXhpdCh1cmxjb3B5LCBwcmVxdWVzdCwgbGVuZ3RoLCBjb29raWUsIGNvbnRlbnRfdHlwZSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJZmlsZV9zaXplID0gc2Iuc3Rfc2l6ZTsKKwkJbGFzdF9tb2QgPSBzYi5zdF9tdGltZTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJCisJZWxzZSBpZiAodXJscFstMV0gPT0gJy8nKSB7CisJCS8qIEl0J3MgYSBkaXIgVVJMIGFuZCB0aGVyZSBpcyBubyBpbmRleC5odG1sCisJCSAqIFRyeSBjZ2ktYmluL2luZGV4LmNnaSAqLworCQlpZiAoYWNjZXNzKCIvY2dpLWJpbi9pbmRleC5jZ2kiKzEsIFhfT0spID09IDApIHsKKwkJCXVybHBbMF0gPSAnXDAnOworCQkJZ19xdWVyeSA9IHVybGNvcHk7CisJCQlzZW5kX2NnaV9hbmRfZXhpdCgiL2NnaS1iaW4vaW5kZXguY2dpIiwgcHJlcXVlc3QsIGxlbmd0aCwgY29va2llLCBjb250ZW50X3R5cGUpOworCQl9CisJfQorCS8qIGVsc2UgZmFsbCB0aHJvdWdoIHRvIHNlbmRfZmlsZSwgaXQgZXJyb3JzIG91dCBpZiBvcGVuIGZhaWxzOiAqLworCisJaWYgKHByZXF1ZXN0ICE9IHJlcXVlc3RfR0VUICYmIHByZXF1ZXN0ICE9IHJlcXVlc3RfSEVBRCkgeworCQkvKiBQT1NUIGZvciBmaWxlcyBkb2VzIG5vdCBtYWtlIHNlbnNlICovCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9JTVBMRU1FTlRFRCk7CisJfQorCXNlbmRfZmlsZV9hbmRfZXhpdCh0cHRyLAorCQkocHJlcXVlc3QgIT0gcmVxdWVzdF9IRUFEID8gU0VORF9IRUFERVJTX0FORF9CT0RZIDogU0VORF9IRUFERVJTKQorCSk7CisjZWxzZQorCXNlbmRfZmlsZV9hbmRfZXhpdCh0cHRyLCBTRU5EX0hFQURFUlNfQU5EX0JPRFkpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGUgbWFpbiBodHRwIHNlcnZlciBmdW5jdGlvbi4KKyAqIEdpdmVuIGEgc29ja2V0LCBsaXN0ZW4gZm9yIG5ldyBjb25uZWN0aW9ucyBhbmQgZmFybSBvdXQKKyAqIHRoZSBwcm9jZXNzaW5nIGFzIGEgW3ZdZm9ya2VkIHByb2Nlc3MuCisgKiBOZXZlciByZXR1cm5zLgorICovCisjaWYgQkJfTU1VCitzdGF0aWMgdm9pZCBtaW5pX2h0dHBkKGludCBzZXJ2ZXJfc29ja2V0KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGQoaW50IHNlcnZlcl9zb2NrZXQpCit7CisJLyogTkI6IGl0J3MgYmVzdCB0byBub3QgdXNlIHhmdW5jcyBpbiB0aGlzIGxvb3AgYmVmb3JlIGZvcmsoKS4KKwkgKiBPdGhlcndpc2Ugc2VydmVyIG1heSBkaWUgb24gdHJhbnNpZW50IGVycm9ycyAodGVtcG9yYXJ5CisJICogb3V0LW9mLW1lbW9yeSBjb25kaXRpb24sIGV0YyksIHdoaWNoIGlzIEJhZCh0bSkuCisJICogVHJ5IHRvIGRvIGFueSBkYW5nZXJvdXMgY2FsbHMgYWZ0ZXIgZm9yay4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgbjsKKwkJbGVuX2FuZF9zb2NrYWRkciBmcm9tQWRkcjsKKworCQkvKiBXYWl0IGZvciBjb25uZWN0aW9ucy4uLiAqLworCQlmcm9tQWRkci5sZW4gPSBMU0FfU0laRU9GX1NBOworCQluID0gYWNjZXB0KHNlcnZlcl9zb2NrZXQsICZmcm9tQWRkci51LnNhLCAmZnJvbUFkZHIubGVuKTsKKwkJaWYgKG4gPCAwKQorCQkJY29udGludWU7CisKKwkJLyogc2V0IHRoZSBLRUVQQUxJVkUgb3B0aW9uIHRvIGN1bGwgZGVhZCBjb25uZWN0aW9ucyAqLworCQlzZXRzb2Nrb3B0KG4sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKworCQlpZiAoZm9yaygpID09IDApIHsKKwkJCS8qIGNoaWxkICovCisJCQkvKiBEbyBub3QgcmVsb2FkIGNvbmZpZyBvbiBIVVAgKi8KKwkJCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworCQkJY2xvc2Uoc2VydmVyX3NvY2tldCk7CisJCQl4bW92ZV9mZChuLCAwKTsKKwkJCXhkdXAyKDAsIDEpOworCisJCQloYW5kbGVfaW5jb21pbmdfYW5kX2V4aXQoJmZyb21BZGRyKTsKKwkJfQorCQkvKiBwYXJlbnQsIG9yIGZvcmsgZmFpbGVkICovCisJCWNsb3NlKG4pOworCX0gLyogd2hpbGUgKDEpICovCisJLyogbmV2ZXIgcmVhY2hlZCAqLworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGRfbm9tbXUoaW50IHNlcnZlcl9zb2NrZXQsIGludCBhcmdjLCBjaGFyICoqYXJndikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBtaW5pX2h0dHBkX25vbW11KGludCBzZXJ2ZXJfc29ja2V0LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYXJndl9jb3B5W2FyZ2MgKyAyXTsKKworCWFyZ3ZfY29weVswXSA9IGFyZ3ZbMF07CisJYXJndl9jb3B5WzFdID0gKGNoYXIqKSItaSI7CisJbWVtY3B5KCZhcmd2X2NvcHlbMl0sICZhcmd2WzFdLCBhcmdjICogc2l6ZW9mKGFyZ3ZbMF0pKTsKKworCS8qIE5COiBpdCdzIGJlc3QgdG8gbm90IHVzZSB4ZnVuY3MgaW4gdGhpcyBsb29wIGJlZm9yZSB2Zm9yaygpLgorCSAqIE90aGVyd2lzZSBzZXJ2ZXIgbWF5IGRpZSBvbiB0cmFuc2llbnQgZXJyb3JzICh0ZW1wb3JhcnkKKwkgKiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbiwgZXRjKSwgd2hpY2ggaXMgQmFkKHRtKS4KKwkgKiBUcnkgdG8gZG8gYW55IGRhbmdlcm91cyBjYWxscyBhZnRlciBmb3JrLgorCSAqLworCXdoaWxlICgxKSB7CisJCWludCBuOworCQlsZW5fYW5kX3NvY2thZGRyIGZyb21BZGRyOworCisJCS8qIFdhaXQgZm9yIGNvbm5lY3Rpb25zLi4uICovCisJCWZyb21BZGRyLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCW4gPSBhY2NlcHQoc2VydmVyX3NvY2tldCwgJmZyb21BZGRyLnUuc2EsICZmcm9tQWRkci5sZW4pOworCQlpZiAobiA8IDApCisJCQljb250aW51ZTsKKworCQkvKiBzZXQgdGhlIEtFRVBBTElWRSBvcHRpb24gdG8gY3VsbCBkZWFkIGNvbm5lY3Rpb25zICovCisJCXNldHNvY2tvcHQobiwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworCisJCWlmICh2Zm9yaygpID09IDApIHsKKwkJCS8qIGNoaWxkICovCisJCQkvKiBEbyBub3QgcmVsb2FkIGNvbmZpZyBvbiBIVVAgKi8KKwkJCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworCQkJY2xvc2Uoc2VydmVyX3NvY2tldCk7CisJCQl4bW92ZV9mZChuLCAwKTsKKwkJCXhkdXAyKDAsIDEpOworCisJCQkvKiBSdW4gYSBjb3B5IG9mIG91cnNlbGYgaW4gaW5ldGQgbW9kZSAqLworCQkJcmVfZXhlYyhhcmd2X2NvcHkpOworCQl9CisJCS8qIHBhcmVudCwgb3IgdmZvcmsgZmFpbGVkICovCisJCWNsb3NlKG4pOworCX0gLyogd2hpbGUgKDEpICovCisJLyogbmV2ZXIgcmVhY2hlZCAqLworfQorI2VuZGlmCisKKy8qCisgKiBQcm9jZXNzIGEgSFRUUCBjb25uZWN0aW9uIG9uIHN0ZGluL291dC4KKyAqIE5ldmVyIHJldHVybnMuCisgKi8KK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGRfaW5ldGQodm9pZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBtaW5pX2h0dHBkX2luZXRkKHZvaWQpCit7CisJbGVuX2FuZF9zb2NrYWRkciBmcm9tQWRkcjsKKworCW1lbXNldCgmZnJvbUFkZHIsIDAsIHNpemVvZihmcm9tQWRkcikpOworCWZyb21BZGRyLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJLyogTkI6IGNhbiBmYWlsIGlmIHVzZXIgcnVucyBpdCBieSBoYW5kIGFuZCB0eXBlcyBpbiBodHRwIGNtZHMgKi8KKwlnZXRwZWVybmFtZSgwLCAmZnJvbUFkZHIudS5zYSwgJmZyb21BZGRyLmxlbik7CisJaGFuZGxlX2luY29taW5nX2FuZF9leGl0KCZmcm9tQWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ2h1cF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXBhcnNlX2NvbmYoREVGQVVMVF9QQVRIX0hUVFBEX0NPTkYsIFNJR05BTEVEX1BBUlNFKTsKK30KKworZW51bSB7CisJY19vcHRfY29uZmlnX2ZpbGUgPSAwLAorCWRfb3B0X2RlY29kZV91cmwsCisJaF9vcHRfaG9tZV9odHRwZCwKKwlJRl9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSKGVfb3B0X2VuY29kZV91cmwsKQorCUlGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCggICAgcl9vcHRfcmVhbG0gICAgICwpCisJSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSggICAgICBtX29wdF9tZDUgICAgICAgLCkKKwlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCggICAgICAgIHVfb3B0X3NldHVpZCAgICAsKQorCXBfb3B0X3BvcnQgICAgICAsCisJcF9vcHRfaW5ldGQgICAgICwKKwlwX29wdF9mb3JlZ3JvdW5kLAorCXBfb3B0X3ZlcmJvc2UgICAsCisJT1BUX0NPTkZJR19GSUxFID0gMSA8PCBjX29wdF9jb25maWdfZmlsZSwKKwlPUFRfREVDT0RFX1VSTCAgPSAxIDw8IGRfb3B0X2RlY29kZV91cmwsCisJT1BUX0hPTUVfSFRUUEQgID0gMSA8PCBoX29wdF9ob21lX2h0dHBkLAorCU9QVF9FTkNPREVfVVJMICA9IElGX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIoKDEgPDwgZV9vcHRfZW5jb2RlX3VybCkpICsgMCwKKwlPUFRfUkVBTE0gICAgICAgPSBJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoICAgICgxIDw8IHJfb3B0X3JlYWxtICAgICApKSArIDAsCisJT1BUX01ENSAgICAgICAgID0gSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSggICAgICAoMSA8PCBtX29wdF9tZDUgICAgICAgKSkgKyAwLAorCU9QVF9TRVRVSUQgICAgICA9IElGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKCAgICAgICAgKDEgPDwgdV9vcHRfc2V0dWlkICAgICkpICsgMCwKKwlPUFRfUE9SVCAgICAgICAgPSAxIDw8IHBfb3B0X3BvcnQsCisJT1BUX0lORVREICAgICAgID0gMSA8PCBwX29wdF9pbmV0ZCwKKwlPUFRfRk9SRUdST1VORCAgPSAxIDw8IHBfb3B0X2ZvcmVncm91bmQsCisJT1BUX1ZFUkJPU0UgICAgID0gMSA8PCBwX29wdF92ZXJib3NlLAorfTsKKworCitpbnQgaHR0cGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGh0dHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2VydmVyX3NvY2tldCA9IHNlcnZlcl9zb2NrZXQ7IC8qIGZvciBnY2MgKi8KKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqdXJsX2Zvcl9kZWNvZGU7CisJSUZfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUihjb25zdCBjaGFyICp1cmxfZm9yX2VuY29kZTspCisJSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoY29uc3QgY2hhciAqc191Z2lkID0gTlVMTDspCisJSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoc3RydWN0IGJiX3VpZGdpZF90IHVnaWQ7KQorCUlGX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUoY29uc3QgY2hhciAqcGFzczspCisKKwlJTklUX0coKTsKKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCS8qIFVuZG8gYnVzeWJveC5jOiB3ZSB3YW50IHRvIHNwZWFrIEVuZ2xpc2ggaW4gaHR0cCAoZGF0ZXMgZXRjKSAqLworCXNldGxvY2FsZShMQ19USU1FLCAiQyIpOworI2VuZGlmCisKKwlob21lX2h0dHBkID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oTlVMTCk7CisJLyogLXYgY291bnRzLCAtaSBpbXBsaWVzIC1mICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidnY6aWYiOworCS8qIFdlIGRvIG5vdCAiYWJzb2x1dGl6ZSIgcGF0aCBnaXZlbiBieSAtaCAoaG9tZSkgb3B0LgorCSAqIElmIHVzZXIgZ2l2ZXMgcmVsYXRpdmUgcGF0aCBpbiAtaCwKKwkgKiAkU0NSSVBUX0ZJTEVOQU1FIHdpbGwgbm90IGJlIHNldC4gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYzpkOmg6IgorCQkJSUZfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUigiZToiKQorCQkJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKCJyOiIpCisJCQlJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCJtOiIpCisJCQlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCgidToiKQorCQkJInA6aWZ2IiwKKwkJCSZvcHRfY19jb25maWdGaWxlLCAmdXJsX2Zvcl9kZWNvZGUsICZob21lX2h0dHBkCisJCQlJRl9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSKCwgJnVybF9mb3JfZW5jb2RlKQorCQkJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKCwgJmdfcmVhbG0pCisJCQlJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCwgJnBhc3MpCisJCQlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCgsICZzX3VnaWQpCisJCQksICZiaW5kX2FkZHJfb3JfcG9ydAorCQkJLCAmdmVyYm9zZQorCQkpOworCWlmIChvcHQgJiBPUFRfREVDT0RFX1VSTCkgeworCQlmcHV0cyhkZWNvZGVTdHJpbmcodXJsX2Zvcl9kZWNvZGUsIDEpLCBzdGRvdXQpOworCQlyZXR1cm4gMDsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIKKwlpZiAob3B0ICYgT1BUX0VOQ09ERV9VUkwpIHsKKwkJZnB1dHMoZW5jb2RlU3RyaW5nKHVybF9mb3JfZW5jb2RlKSwgc3Rkb3V0KTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUKKwlpZiAob3B0ICYgT1BUX01ENSkgeworCQljaGFyIHNhbHRbc2l6ZW9mKCIkMSRYWFhYWFhYWCIpXTsKKwkJc2FsdFswXSA9ICckJzsKKwkJc2FsdFsxXSA9ICcxJzsKKwkJc2FsdFsyXSA9ICckJzsKKwkJY3J5cHRfbWFrZV9zYWx0KHNhbHQgKyAzLCA0KTsKKwkJcHV0cyhwd19lbmNyeXB0KHBhc3MsIHNhbHQsIDEpKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfU0VUVUlECisJaWYgKG9wdCAmIE9QVF9TRVRVSUQpIHsKKwkJeGdldF91aWRnaWQoJnVnaWQsIHNfdWdpZCk7CisJfQorI2VuZGlmCisKKyNpZiAhQkJfTU1VCisJaWYgKCEob3B0ICYgT1BUX0ZPUkVHUk9VTkQpKSB7CisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsgLyogZG9uJ3QgY2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJfQorI2VuZGlmCisKKwl4Y2hkaXIoaG9tZV9odHRwZCk7CisJaWYgKCEob3B0ICYgT1BUX0lORVREKSkgeworCQlzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7CisJCXNlcnZlcl9zb2NrZXQgPSBvcGVuU2VydmVyKCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfU0VUVUlECisJCS8qIGRyb3AgcHJpdmlsZWdlcyAqLworCQlpZiAob3B0ICYgT1BUX1NFVFVJRCkgeworCQkJaWYgKHVnaWQuZ2lkICE9IChnaWRfdCktMSkgeworCQkJCWlmIChzZXRncm91cHMoMSwgJnVnaWQuZ2lkKSA9PSAtMSkKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRncm91cHMiKTsKKwkJCQl4c2V0Z2lkKHVnaWQuZ2lkKTsKKwkJCX0KKwkJCXhzZXR1aWQodWdpZC51aWQpOworCQl9CisjZW5kaWYKKwl9CisKKyNpZiAwCisJLyogVXNlciBjYW4gZG8gaXQgaGltc2VsZjogJ2VudiAtIFBBVEg9IiRQQVRIIiBodHRwZCcKKwkgKiBXZSBkb24ndCBkbyBpdCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gc2NyZXcgdXNlcnMKKwkgKiB3aGljaCB3YW50IHRvIGRvCisJICogJ2VudiAtIFZBUjE9dmFsMSBWQVIyPXZhbDIgaHR0cGQnCisJICogYW5kIGhhdmUgVkFSMSBhbmQgVkFSMiB2YWx1ZXMgdmlzaWJsZSBpbiB0aGVpciBDR0lzLgorCSAqIEJlc2lkZXMsIGl0IGlzIGFsc28gc21hbGxlci4gKi8KKwl7CisJCWNoYXIgKnAgPSBnZXRlbnYoIlBBVEgiKTsKKwkJLyogZW52IHN0cmluZ3MgdGhlbXNlbGYgYXJlIG5vdCBmcmVlZCwgbm8gbmVlZCB0byB4c3RyZHVwKHApOiAqLworCQljbGVhcmVudigpOworCQlpZiAocCkKKwkJCXB1dGVudihwIC0gNSk7CisvLwkJaWYgKCEob3B0ICYgT1BUX0lORVREKSkKKy8vCQkJc2V0ZW52X2xvbmcoIlNFUlZFUl9QT1JUIiwgPz8/KTsKKwl9CisjZW5kaWYKKworCXBhcnNlX2NvbmYoREVGQVVMVF9QQVRIX0hUVFBEX0NPTkYsIEZJUlNUX1BBUlNFKTsKKwlpZiAoIShvcHQgJiBPUFRfSU5FVEQpKQorCQlzaWduYWwoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAwOworCWlmIChvcHQgJiBPUFRfSU5FVEQpCisJCW1pbmlfaHR0cGRfaW5ldGQoKTsKKyNpZiBCQl9NTVUKKwlpZiAoIShvcHQgJiBPUFRfRk9SRUdST1VORCkpCisJCWJiX2RhZW1vbml6ZSgwKTsgLyogZG9uJ3QgY2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJbWluaV9odHRwZChzZXJ2ZXJfc29ja2V0KTsgLyogbmV2ZXIgcmV0dXJucyAqLworI2Vsc2UKKwltaW5pX2h0dHBkX25vbW11KHNlcnZlcl9zb2NrZXQsIGFyZ2MsIGFyZ3YpOyAvKiBuZXZlciByZXR1cm5zICovCisjZW5kaWYKKwkvKiByZXR1cm4gMDsgKi8KK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaHR0cGRfaW5kZXhjZ2kuYyBiL25ldHdvcmtpbmcvaHR0cGRfaW5kZXhjZ2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAyMjVlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9odHRwZF9pbmRleGNnaS5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGEgQ0dJIGFwcGxpY2F0aW9uLiBJdCBvdXRwdXRzIGRpcmVjdG9yeSBpbmRleCBwYWdlLgorICogUHV0IGl0IGludG8gY2dpLWJpbi9pbmRleC5jZ2kgYW5kIGNobW9kIDA3NTUuCisgKi8KKworLyogQnVpbGQgYS1sYQoraTQ4Ni1saW51eC11Y2xpYmMtZ2NjIFwKKy1zdGF0aWMgLXN0YXRpYy1saWJnY2MgXAorLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCBcCistV2FsbCAtV3NoYWRvdyAtV3dyaXRlLXN0cmluZ3MgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1XZXJyb3IgXAorLVdvbGQtc3R5bGUtZGVmaW5pdGlvbiAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV25vLXBvaW50ZXItc2lnbiBcCistV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIFwKKy1PcyAtZm5vLWJ1aWx0aW4tc3RybGVuIC1maW5saW5lLWxpbWl0PTAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMgLWZuby1ndWVzcy1icmFuY2gtcHJvYmFiaWxpdHkgXAorLWZ1bnNpZ25lZC1jaGFyIFwKKy1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbGFiZWxzPTEgLWZhbGlnbi1sb29wcz0xIFwKKy1tYXJjaD1pMzg2IC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgXAorLVdsLC1NYXAgLVdsLGxpbmsubWFwIC1XbCwtLXdhcm4tY29tbW9uIC1XbCwtLXNvcnQtY29tbW9uIC1XbCwtLWdjLXNlY3Rpb25zIFwKK2h0dHBkX2luZGV4Y2dpLmMgLW8gaW5kZXguY2dpCisqLworCisvKiBXZSBkb24ndCB1c2UgcHJpbnRmLCBhcyBpdCBwdWxscyBpbiA+MTIga2Igb2YgY29kZSBmcm9tIHVjbGliYyAoaTM4NikuICovCisvKiBDdXJyZW50bHkgbWFsbG9jIG1hY2hpbmVyeSBpcyB0aGUgYmlnZ2VzdCBwYXJ0IG9mIGxpYmMgd2UgcHVsbCBpbi4gKi8KKy8qIFdlIGhhdmUgb25seSBvbmUgcmVhbGxvYyBhbmQgb25lIHN0cmR1cCwgYW55IGlkZWEgaG93IHRvIGRvIHdpdGhvdXQ/ICovCisKKy8qIFNpemUgKGkzODYsIHN0YXRpYyB1Y2xpYmMsIGFwcHJveGltYXRlKToKKyAqICAgdGV4dCAgICBkYXRhICAgICBic3MgICAgIGRlYyAgICAgaGV4IGZpbGVuYW1lCisgKiAgMTMwMzYgICAgICA0NCAgICAzMDUyICAgMTYxMzIgICAgM2YwNCBpbmRleC5jZ2kKKyAqICAgMjU3NiAgICAgICA0ICAgIDIwNDggICAgNDYyOCAgICAxMjE0IGluZGV4LmNnaS5vCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworLyogQXBwZWFyYW5jZSBvZiB0aGUgdGFibGUgaXMgY29udHJvbGxlZCBieSBzdHlsZSBzaGVldCAqT05MWSosCisgKiBmb3JtYXR0aW5nIGNvZGUgdXNlcyA8VEFHIGNsYXNzPUNMQVNTPiB0byBhcHBseSBzdHlsZQorICogdG8gZWxlbWVudHMuIEVkaXQgc3R5bGVzaGVldCB0byB5b3VyIGxpa2luZyBhbmQgcmVjb21waWxlLiAqLworCisjZGVmaW5lIFNUWUxFX1NUUiBcCisiPHN0eWxlPiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGFibGUgeyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICJ3aWR0aDoxMDAlOyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICJiYWNrZ3JvdW5kLWNvbG9yOiNmZmY1ZWU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICJib3JkZXItd2lkdGg6MXB4OyIgLyogMXB4IDFweCAxcHggMXB4OyAqLyAgICAgICAgICAgICJcbiJcCisgICJib3JkZXItc3BhY2luZzoycHg7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICJib3JkZXItc3R5bGU6c29saWQ7IiAvKiBzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsgKi8gICJcbiJcCisgICJib3JkZXItY29sb3I6YmxhY2s7IiAvKiBibGFjayBibGFjayBibGFjayBibGFjazsgKi8gICJcbiJcCisgICJib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisifSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGggeyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICJib3JkZXItd2lkdGg6MXB4OyIgLyogMXB4IDFweCAxcHggMXB4OyAqLyAgICAgICAgICAgICJcbiJcCisgICJwYWRkaW5nOjFweDsiIC8qIDFweCAxcHggMXB4IDFweDsgKi8gICAgICAgICAgICAgICAgICJcbiJcCisgICJib3JkZXItc3R5bGU6c29saWQ7IiAvKiBzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsgKi8gICJcbiJcCisgICJib3JkZXItY29sb3I6YmxhY2s7IiAvKiBibGFjayBibGFjayBibGFjayBibGFjazsgKi8gICJcbiJcCisifSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGQgeyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICAgICAgICAgICAgLyogdG9wIHJpZ2h0IGJvdHRvbSBsZWZ0ICovICAgICAgICAgICAgICAgICAgICBcCisgICJib3JkZXItd2lkdGg6MHB4IDFweCAwcHggMXB4OyIgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisgICJwYWRkaW5nOjFweDsiIC8qIDFweCAxcHggMXB4IDFweDsgKi8gICAgICAgICAgICAgICAgICJcbiJcCisgICJib3JkZXItc3R5bGU6c29saWQ7IiAvKiBzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsgKi8gICJcbiJcCisgICJib3JkZXItY29sb3I6YmxhY2s7IiAvKiBibGFjayBibGFjayBibGFjayBibGFjazsgKi8gICJcbiJcCisgICJ3aGl0ZS1zcGFjZTpub3dyYXA7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisifSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidHIuaGRyIHsgYmFja2dyb3VuZC1jb2xvcjojZWVlNWRlOyB9IiAgICAgICAgICAgICAgICAgICJcbiJcCisidHIubyB7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZjsgfSIgICAgICAgICAgICAgICAgICAgICJcbiJcCisvKiB0ci5lIHsgLi4uIH0gLSBmb3IgZXZlbiByb3dzIChjdXJyZW50bHkgbm9uZSkgKi8gICAgICAgICBcCisidHIuZm9vdCB7IGJhY2tncm91bmQtY29sb3I6I2VlZTVkZTsgfSIgICAgICAgICAgICAgICAgICJcbiJcCisidGguY250IHsgdGV4dC1hbGlnbjpsZWZ0OyB9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGguc3ogeyB0ZXh0LWFsaWduOnJpZ2h0OyB9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGguZHQgeyB0ZXh0LWFsaWduOnJpZ2h0OyB9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGQuc3ogeyB0ZXh0LWFsaWduOnJpZ2h0OyB9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisidGQuZHQgeyB0ZXh0LWFsaWduOnJpZ2h0OyB9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisiY29sLm5tIHsgd2lkdGg6OTglOyB9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisiY29sLnN6IHsgd2lkdGg6MSU7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisiY29sLmR0IHsgd2lkdGg6MSU7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisiPC9zdHlsZT4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiJcCisKK3R5cGVkZWYgc3RydWN0IGRpcl9saXN0X3QgeworCWNoYXIgICpkbF9uYW1lOworCW1vZGVfdCBkbF9tb2RlOworCW9mZl90ICBkbF9zaXplOworCXRpbWVfdCBkbF9tdGltZTsKK30gZGlyX2xpc3RfdDsKKworc3RhdGljIGludCBjb21wYXJlX2RsKGRpcl9saXN0X3QgKmEsIGRpcl9saXN0X3QgKmIpCit7CisJLyogIi4uIiBpcyAnbGVzcyB0aGFuJyBhbnkgb3RoZXIgZGlyIGVudHJ5ICovCisJaWYgKHN0cmNtcChhLT5kbF9uYW1lLCAiLi4iKSA9PSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHN0cmNtcChiLT5kbF9uYW1lLCAiLi4iKSA9PSAwKSB7CisJCXJldHVybiAxOworCX0KKwlpZiAoU19JU0RJUihhLT5kbF9tb2RlKSAhPSBTX0lTRElSKGItPmRsX21vZGUpKSB7CisJCS8qIDEgaWYgYiBpcyBhIGRpciAoYW5kIHRodXMgYSBpcyAnYWZ0ZXInIGIsIGEgPiBiKSwKKwkJICogZWxzZSAtMSAoYSA8IGIpICovCisJCXJldHVybiAoU19JU0RJUihiLT5kbF9tb2RlKSAhPSAwKSA/IDEgOiAtMTsKKwl9CisJcmV0dXJuIHN0cmNtcChhLT5kbF9uYW1lLCBiLT5kbF9uYW1lKTsKK30KKworc3RhdGljIGNoYXIgYnVmZmVyWzIqMTAyNCA+IHNpemVvZihTVFlMRV9TVFIpID8gMioxMDI0IDogc2l6ZW9mKFNUWUxFX1NUUildOworc3RhdGljIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKK2VudW0geworCUJVRkZFUl9TSVpFID0gc2l6ZW9mKGJ1ZmZlciksCisJSEVBRFJPT00gPSA2NCwKK307CisKKy8qIEFmdGVyIHRoaXMgY2FsbCwgeW91IGhhdmUgYXQgbGVhc3Qgc2l6ZSArIEhFQURST09NIGJ5dGVzIGF2YWlsYWJsZQorICogYWhlYWQgb2YgZHN0ICovCitzdGF0aWMgdm9pZCBndWFyYW50ZWUoaW50IHNpemUpCit7CisJaWYgKGJ1ZmZlciArIChCVUZGRVJfU0laRS1IRUFEUk9PTSkgLSBkc3QgPj0gc2l6ZSkKKwkJcmV0dXJuOworCXdyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZmZlciwgZHN0IC0gYnVmZmVyKTsKKwlkc3QgPSBidWZmZXI7Cit9CisKKy8qIE5COiBmb3JtYXR0ZXJzIGRvIG5vdCBzdG9yZSB0ZXJtaW5hdGluZyBOVUwhICovCisKKy8qIEhFQURST09NIGJ5dGVzIGFyZSBhdmFpbGFibGUgYWZ0ZXIgZHN0IGFmdGVyIHRoaXMgY2FsbCAqLworc3RhdGljIHZvaWQgZm10X3N0cigvKmNoYXIgKmRzdCwqLyBjb25zdCBjaGFyICpzcmMpCit7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKHNyYyk7CisJZ3VhcmFudGVlKGxlbik7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCWRzdCArPSBsZW47Cit9CisKKy8qIEhFQURST09NIGJ5dGVzIGFmdGVyIGRzdCBhcmUgYXZhaWxhYmxlIGFmdGVyIHRoaXMgY2FsbCAqLworc3RhdGljIHZvaWQgZm10X3VybCgvKmNoYXIgKmRzdCwqLyBjb25zdCBjaGFyICpuYW1lKQoreworCXdoaWxlICgqbmFtZSkgeworCQl1bnNpZ25lZCBjID0gKm5hbWUrKzsKKwkJZ3VhcmFudGVlKDMpOworCQkqZHN0ID0gYzsKKwkJaWYgKChjIC0gJzAnKSA+IDkgLyogbm90IGEgZGlnaXQgKi8KKwkJICYmICgoY3wweDIwKSAtICdhJykgPiAoJ3onIC0gJ2EnKSAvKiBub3QgQS1aIG9yIGEteiAqLworCQkgJiYgIXN0cmNocigiLl8tK0AiLCBjKQorCQkpIHsKKwkJCSpkc3QrKyA9ICclJzsKKwkJCSpkc3QrKyA9ICIwMTIzNDU2Nzg5QUJDREVGIltjID4+IDRdOworCQkJKmRzdCA9ICIwMTIzNDU2Nzg5QUJDREVGIltjICYgMHhmXTsKKwkJfQorCQlkc3QrKzsKKwl9Cit9CisKKy8qIEhFQURST09NIGJ5dGVzIGFyZSBhdmFpbGFibGUgYWZ0ZXIgZHN0IGFmdGVyIHRoaXMgY2FsbCAqLworc3RhdGljIHZvaWQgZm10X2h0bWwoLypjaGFyICpkc3QsKi8gY29uc3QgY2hhciAqbmFtZSkKK3sKKwl3aGlsZSAoKm5hbWUpIHsKKwkJY2hhciBjID0gKm5hbWUrKzsKKwkJaWYgKGMgPT0gJzwnKQorCQkJZm10X3N0cigiJmx0OyIpOworCQllbHNlIGlmIChjID09ICc+JykKKwkJCWZtdF9zdHIoIiZndDsiKTsKKwkJZWxzZSBpZiAoYyA9PSAnJicpIHsKKwkJCWZtdF9zdHIoIiZhbXA7Iik7CisJCX0gZWxzZSB7CisJCQlndWFyYW50ZWUoMSk7CisJCQkqZHN0KysgPSBjOworCQkJY29udGludWU7CisJCX0KKwl9Cit9CisKKy8qIEhFQURST09NIGJ5dGVzIGFyZSBhdmFpbGFibGUgYWZ0ZXIgZHN0IGFmdGVyIHRoaXMgY2FsbCAqLworc3RhdGljIHZvaWQgZm10X3VsbCgvKmNoYXIgKmRzdCwqLyB1bnNpZ25lZCBsb25nIGxvbmcgbikKK3sKKwljaGFyIGJ1ZltzaXplb2YobikqMyArIDJdOworCWNoYXIgKnA7CisKKwlwID0gYnVmICsgc2l6ZW9mKGJ1ZikgLSAxOworCSpwID0gJ1wwJzsKKwlkbyB7CisJCSotLXAgPSAobiAlIDEwKSArICcwJzsKKwkJbiAvPSAxMDsKKwl9IHdoaWxlIChuKTsKKwlmbXRfc3RyKC8qZHN0LCovIHApOworfQorCisvKiBEb2VzIG5vdCBjYWxsIGd1YXJhbnRlZSAtIGVhdHMgaW50byBoZWFkcm9vbSBpbnN0ZWFkICovCitzdGF0aWMgdm9pZCBmbXRfMDJ1KC8qY2hhciAqZHN0LCovIHVuc2lnbmVkIG4pCit7CisJLyogbiAlPSAxMDA7IC0gbm90IG5lZWRlZCwgY2FsbGVycyBkb24ndCBwYXNzIGJpZyBuICovCisJZHN0WzBdID0gKG4gLyAxMCkgKyAnMCc7CisJZHN0WzFdID0gKG4gJSAxMCkgKyAnMCc7CisJZHN0ICs9IDI7Cit9CisKKy8qIERvZXMgbm90IGNhbGwgZ3VhcmFudGVlIC0gZWF0cyBpbnRvIGhlYWRyb29tIGluc3RlYWQgKi8KK3N0YXRpYyB2b2lkIGZtdF8wNHUoLypjaGFyICpkc3QsKi8gdW5zaWduZWQgbikKK3sKKwkvKiBuICU9IDEwMDAwOyAtIG5vdCBuZWVkZWQsIGNhbGxlcnMgZG9uJ3QgcGFzcyBiaWcgbiAqLworCWZtdF8wMnUobiAvIDEwMCk7CisJZm10XzAydShuICUgMTAwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlkaXJfbGlzdF90ICpkaXJfbGlzdDsKKwlkaXJfbGlzdF90ICpjZGlyOworCXVuc2lnbmVkIGRpcl9saXN0X2NvdW50OworCXVuc2lnbmVkIGNvdW50X2RpcnM7CisJdW5zaWduZWQgY291bnRfZmlsZXM7CisJdW5zaWduZWQgbG9uZyBsb25nIHNpemVfdG90YWw7CisJaW50IG9kZDsKKwlESVIgKmRpcnA7CisJY2hhciAqUVVFUllfU1RSSU5HOworCisJUVVFUllfU1RSSU5HID0gZ2V0ZW52KCJRVUVSWV9TVFJJTkciKTsKKwlpZiAoIVFVRVJZX1NUUklORworCSB8fCBRVUVSWV9TVFJJTkdbMF0gIT0gJy8nCisJIHx8IHN0cnN0cihRVUVSWV9TVFJJTkcsICIvLyIpCisJIHx8IHN0cnN0cihRVUVSWV9TVFJJTkcsICIvLi4vIikKKwkgfHwgc3RyY21wKHN0cnJjaHIoUVVFUllfU1RSSU5HLCAnLycpLCAiLy4uIikgPT0gMAorCSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoY2hkaXIoIi4uIikKKwkgfHwgKFFVRVJZX1NUUklOR1sxXSAmJiBjaGRpcihRVUVSWV9TVFJJTkcgKyAxKSkKKwkpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJZGlycCA9IG9wZW5kaXIoIi4iKTsKKwlpZiAoIWRpcnApCisJCXJldHVybiAxOworCWRpcl9saXN0ID0gTlVMTDsKKwlkaXJfbGlzdF9jb3VudCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGRpcmVudCAqZHA7CisJCXN0cnVjdCBzdGF0IHNiOworCisJCWRwID0gcmVhZGRpcihkaXJwKTsKKwkJaWYgKCFkcCkKKwkJCWJyZWFrOworCQlpZiAoZHAtPmRfbmFtZVswXSA9PSAnLicgJiYgIWRwLT5kX25hbWVbMV0pCisJCQljb250aW51ZTsKKwkJaWYgKHN0YXQoZHAtPmRfbmFtZSwgJnNiKSAhPSAwKQorCQkJY29udGludWU7CisJCWRpcl9saXN0ID0gcmVhbGxvYyhkaXJfbGlzdCwgKGRpcl9saXN0X2NvdW50ICsgMSkgKiBzaXplb2YoZGlyX2xpc3RbMF0pKTsKKwkJZGlyX2xpc3RbZGlyX2xpc3RfY291bnRdLmRsX25hbWUgPSBzdHJkdXAoZHAtPmRfbmFtZSk7CisJCWRpcl9saXN0W2Rpcl9saXN0X2NvdW50XS5kbF9tb2RlID0gc2Iuc3RfbW9kZTsKKwkJZGlyX2xpc3RbZGlyX2xpc3RfY291bnRdLmRsX3NpemUgPSBzYi5zdF9zaXplOworCQlkaXJfbGlzdFtkaXJfbGlzdF9jb3VudF0uZGxfbXRpbWUgPSBzYi5zdF9tdGltZTsKKwkJZGlyX2xpc3RfY291bnQrKzsKKwl9CisJY2xvc2VkaXIoZGlycCk7CisKKwlxc29ydChkaXJfbGlzdCwgZGlyX2xpc3RfY291bnQsIHNpemVvZihkaXJfbGlzdFswXSksICh2b2lkKiljb21wYXJlX2RsKTsKKworCWZtdF9zdHIoCisJCSIiIC8qIEFkZGl0aW9uYWwgaGVhZGVycyAoY3VycmVudGx5IG5vbmUpICovCisJCSJcclxuIiAvKiBNYW5kYXRvcnkgZW1wdHkgbGluZSBhZnRlciBoZWFkZXJzICovCisJCSI8aHRtbD48aGVhZD48dGl0bGU+SW5kZXggb2YgIik7CisJLyogR3VhcmQgYWdhaW5zdCBkaXJlY3RvcmllcyB3aXRoICYsID4gZXRjICovCisJZm10X2h0bWwoUVVFUllfU1RSSU5HKTsKKwlmbXRfc3RyKAorCQkiPC90aXRsZT5cbiIKKwkJU1RZTEVfU1RSCisJCSI8L2hlYWQ+IiAiXG4iCisJCSI8Ym9keT4iICJcbiIKKwkJIjxoMT5JbmRleCBvZiAiKTsKKwlmbXRfaHRtbChRVUVSWV9TVFJJTkcpOworCWZtdF9zdHIoCisJCSI8L2gxPiIgIlxuIgorCQkiPHRhYmxlPiIgIlxuIgorCQkiPGNvbCBjbGFzcz1ubT48Y29sIGNsYXNzPXN6Pjxjb2wgY2xhc3M9ZHQ+IiAiXG4iCisJCSI8dHIgY2xhc3M9aGRyPjx0aCBjbGFzcz1jbnQ+TmFtZTx0aCBjbGFzcz1zej5TaXplPHRoIGNsYXNzPWR0Pkxhc3QgbW9kaWZpZWQiICJcbiIpOworCisJb2RkID0gMDsKKwljb3VudF9kaXJzID0gMDsKKwljb3VudF9maWxlcyA9IDA7CisJc2l6ZV90b3RhbCA9IDA7CisJY2RpciA9IGRpcl9saXN0OworCXdoaWxlIChkaXJfbGlzdF9jb3VudC0tKSB7CisJCXN0cnVjdCB0bSAqcHRtOworCisJCWlmIChTX0lTRElSKGNkaXItPmRsX21vZGUpKSB7CisJCQljb3VudF9kaXJzKys7CisJCX0gZWxzZSBpZiAoU19JU1JFRyhjZGlyLT5kbF9tb2RlKSkgeworCQkJY291bnRfZmlsZXMrKzsKKwkJCXNpemVfdG90YWwgKz0gY2Rpci0+ZGxfc2l6ZTsKKwkJfSBlbHNlCisJCQlnb3RvIG5leHQ7CisKKwkJZm10X3N0cigiPHRyIGNsYXNzPSIpOworCQkqZHN0KysgPSAob2RkID8gJ28nIDogJ2UnKTsKKwkJZm10X3N0cigiPjx0ZCBjbGFzcz1ubT48YSBocmVmPSciKTsKKwkJZm10X3VybChjZGlyLT5kbF9uYW1lKTsgLyogJTIwIGV0YyAqLworCQlpZiAoU19JU0RJUihjZGlyLT5kbF9tb2RlKSkKKwkJCSpkc3QrKyA9ICcvJzsKKwkJZm10X3N0cigiJz4iKTsKKwkJZm10X2h0bWwoY2Rpci0+ZGxfbmFtZSk7IC8qICZsdDsgZXRjICovCisJCWlmIChTX0lTRElSKGNkaXItPmRsX21vZGUpKQorCQkJKmRzdCsrID0gJy8nOworCQlmbXRfc3RyKCI8L2E+PHRkIGNsYXNzPXN6PiIpOworCQlpZiAoU19JU1JFRyhjZGlyLT5kbF9tb2RlKSkKKwkJCWZtdF91bGwoY2Rpci0+ZGxfc2l6ZSk7CisJCWZtdF9zdHIoIjx0ZCBjbGFzcz1kdD4iKTsKKwkJcHRtID0gZ210aW1lKCZjZGlyLT5kbF9tdGltZSk7CisJCWZtdF8wNHUoMTkwMCArIHB0bS0+dG1feWVhcik7ICpkc3QrKyA9ICctJzsKKwkJZm10XzAydShwdG0tPnRtX21vbiArIDEpOyAqZHN0KysgPSAnLSc7CisJCWZtdF8wMnUocHRtLT50bV9tZGF5KTsgKmRzdCsrID0gJyAnOworCQlmbXRfMDJ1KHB0bS0+dG1faG91cik7ICpkc3QrKyA9ICc6JzsKKwkJZm10XzAydShwdG0tPnRtX21pbik7ICpkc3QrKyA9ICc6JzsKKwkJZm10XzAydShwdG0tPnRtX3NlYyk7CisJCSpkc3QrKyA9ICdcbic7CisKKwkJb2RkID0gMSAtIG9kZDsKKyBuZXh0OgorCQljZGlyKys7CisJfQorCisJZm10X3N0cigiPHRyIGNsYXNzPWZvb3Q+PHRoIGNsYXNzPWNudD5GaWxlczogIik7CisJZm10X3VsbChjb3VudF9maWxlcyk7CisJLyogY291bnRfZGlycyAtIDE6IHdlIGRvbid0IHdhbnQgdG8gY291bnQgIi4uIiAqLworCWZtdF9zdHIoIiwgZGlyZWN0b3JpZXM6ICIpOworCWZtdF91bGwoY291bnRfZGlycyAtIDEpOworCWZtdF9zdHIoIjx0aCBjbGFzcz1zej4iKTsKKwlmbXRfdWxsKHNpemVfdG90YWwpOworCWZtdF9zdHIoIjx0aCBjbGFzcz1kdD5cbiIpOworCS8qICI8L3RhYmxlPjwvYm9keT48L2h0bWw+IiAtIHdoeSBib3RoZXI/ICovCisJZ3VhcmFudGVlKEJVRkZFUl9TSVpFICogMik7IC8qIGZsdXNoICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaHR0cGRfcG9zdF91cGxvYWQudHh0IGIvbmV0d29ya2luZy9odHRwZF9wb3N0X3VwbG9hZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MDRmNAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaHR0cGRfcG9zdF91cGxvYWQudHh0CkBAIC0wLDAgKzEsNjUgQEAKK1BPU1QgdXBsb2FkIGV4YW1wbGU6CisKK3Bvc3RfdXBsb2FkLmh0bQorPT09PT09PT09PT09PT09Cis8aHRtbD4KKzxib2R5PgorPGZvcm0gYWN0aW9uPS9jZ2ktYmluL3Bvc3RfdXBsb2FkLmNnaSBtZXRob2Q9cG9zdCBlbmN0eXBlPW11bHRpcGFydC9mb3JtLWRhdGE+CitGaWxlIHRvIHVwbG9hZDogPGlucHV0IHR5cGU9ZmlsZSBuYW1lPWZpbGUxPiA8aW5wdXQgdHlwZT1zdWJtaXQ+Cis8L2Zvcm0+CisKKworcG9zdF91cGxvYWQuY2dpCis9PT09PT09PT09PT09PT0KKyMhL2Jpbi9zaAorCisjIFBPU1QgdXBsb2FkIGZvcm1hdDoKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0yOTk5NTgwOTIxODA5Mzc0OTIyMTg1NjQ0NjAzMl5NCisjIENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iZmlsZTEiOyBmaWxlbmFtZT0iLi4uIl5NCisjIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXk0KKyMgXk0gICAgPC0tLS0tLS0tLSBoZWFkZXJzIGVuZCB3aXRoIGVtcHR5IGxpbmUKKyMgZmlsZSBjb250ZW50cworIyBmaWxlIGNvbnRlbnRzCisjIGZpbGUgY29udGVudHMKKyMgXk0gICAgPC0tLS0tLS0tLSBleHRyYSBlbXB0eSBsaW5lCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tMjk5OTU4MDkyMTgwOTM3NDkyMjE4NTY0NDYwMzItLV5NCisKK2ZpbGU9L3RtcC8kJC0kUkFORE9NCisKK0NSPWBwcmludGYgJ1xyJ2AKKworIyBDR0kgb3V0cHV0IG11c3Qgc3RhcnQgd2l0aCBhdCBsZWFzdCBlbXB0eSBsaW5lIChvciBoZWFkZXJzKQorcHJpbnRmICdcclxuJworCitJRlM9IiRDUiIKK3JlYWQgLXIgZGVsaW1fbGluZQorSUZTPSIiCisKK3doaWxlIHJlYWQgLXIgbGluZTsgZG8KKyAgICB0ZXN0IHgiJGxpbmUiID0geCIiICYmIGJyZWFrCisgICAgdGVzdCB4IiRsaW5lIiA9IHgiJENSIiAmJiBicmVhaworZG9uZQorCitjYXQgPiIkZmlsZSIKKworIyBXZSBuZWVkIHRvIGRlbGV0ZSB0aGUgdGFpbCBvZiAiXHJcbmRlbGltX2xpbmUtLVxyXG4iCit0YWlsX2xlbj0kKCgkeyNkZWxpbV9saW5lfSArIDYpKQorCisjIEdldCBhbmQgY2hlY2sgZmlsZSBzaXplCitmaWxlc2l6ZT1gc3RhdCAtYyIlcyIgIiRmaWxlImAKK3Rlc3QgIiRmaWxlc2l6ZSIgLWx0ICIkdGFpbF9sZW4iICYmIGV4aXQgMQorCisjIENoZWNrIHRoYXQgdGFpbCBpcyBjb3JyZWN0CitkZCBpZj0iJGZpbGUiIHNraXA9JCgoZmlsZXNpemUgLSB0YWlsX2xlbikpIGJzPTEgY291bnQ9MTAwMCA+IiRmaWxlLnRhaWwiIDI+L2Rldi9udWxsCitwcmludGYgIlxyXG4lcy0tXHJcbiIgIiRkZWxpbV9saW5lIiA+IiRmaWxlLnRhaWwuZXhwZWN0ZWQiCitpZiAhIGRpZmYgLXEgIiRmaWxlLnRhaWwiICIkZmlsZS50YWlsLmV4cGVjdGVkIiA+L2Rldi9udWxsOyB0aGVuCisgICAgcHJpbnRmICI8aHRtbD5cbjxib2R5PlxuTWFsZm9ybWVkIGZpbGUgdXBsb2FkIgorICAgIGV4aXQgMQorZmkKK3JtICIkZmlsZS50YWlsIgorcm0gIiRmaWxlLnRhaWwuZXhwZWN0ZWQiCisKKyMgVHJ1bmNhdGUgdGhlIGZpbGUKK2RkIG9mPSIkZmlsZSIgc2Vlaz0kKChmaWxlc2l6ZSAtIHRhaWxfbGVuKSkgYnM9MSBjb3VudD0wID4vZGV2L251bGwgMj4vZGV2L251bGwKKworcHJpbnRmICI8aHRtbD5cbjxib2R5PlxuRmlsZSB1cGxvYWQgaGFzIGJlZW4gYWNjZXB0ZWQiCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2h0dHBkX3NzaS5jIGIvbmV0d29ya2luZy9odHRwZF9zc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU2NGViCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9odHRwZF9zc2kuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBhIENHSSBhcHBsaWNhdGlvbi4gSXQgcHJvY2Vzc2VzIHNlcnZlci1zaWRlIGluY2x1ZGVzOgorICogPCEtLSNpbmNsdWRlIGZpbGU9ImZpbGUuaHRtbCIgLS0+CisgKgorICogVXNhZ2U6IHB1dCB0aGVzZSBsaW5lcyBpbiBodHRwZC5jb25mOgorICoKKyAqICouaHRtbDovYmluL2h0dHBkX3NzaQorICogKi5odG06L2Jpbi9odHRwZF9zc2kKKyAqLworCisvKiBCdWlsZCBhLWxhCitpNDg2LWxpbnV4LXVjbGliYy1nY2MgXAorLXN0YXRpYyAtc3RhdGljLWxpYmdjYyBcCistRF9MQVJHRUZJTEVfU09VUkNFIC1EX0xBUkdFRklMRTY0X1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IFwKKy1XYWxsIC1Xc2hhZG93IC1Xd3JpdGUtc3RyaW5ncyAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdlcnJvciBcCistV29sZC1zdHlsZS1kZWZpbml0aW9uIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xbm8tcG9pbnRlci1zaWduIFwKKy1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgXAorLU9zIC1mbm8tYnVpbHRpbi1zdHJsZW4gLWZpbmxpbmUtbGltaXQ9MCAtZm9taXQtZnJhbWUtcG9pbnRlciBcCistZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucyAtZm5vLWd1ZXNzLWJyYW5jaC1wcm9iYWJpbGl0eSBcCistZnVuc2lnbmVkLWNoYXIgXAorLWZhbGlnbi1mdW5jdGlvbnM9MSAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sYWJlbHM9MSAtZmFsaWduLWxvb3BzPTEgXAorLW1hcmNoPWkzODYgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiBcCistV2wsLU1hcCAtV2wsbGluay5tYXAgLVdsLC0td2Fybi1jb21tb24gLVdsLC0tc29ydC1jb21tb24gLVdsLC0tZ2Mtc2VjdGlvbnMgXAoraHR0cGRfc3NpLmMgLW8gaHR0cGRfc3NpCisqLworCisvKiBTaXplIChpMzg2LCBzdGF0aWMgdWNsaWJjLCBhcHByb3hpbWF0ZSk6CisgKiB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXggZmlsZW5hbWUKKyAqIDk0ODcgICAgIDE2MCAgIDY4NTUyICAgNzgxOTkgICAxMzE3NyBodHRwZF9zc2kKKyAqCisgKiBOb3RlOiBpdCB3b3VsZG4ndCBiZSB0b28gaGFyZCB0byBnZXQgcmlkIG9mIHN0ZGlvIGFuZCBzdHJkdXAsCisgKiAoZXNwZWNpYWxseSB0aGF0IGZnZXRzKCkgbWFuZ2xlcyBOVUxzLi4uKQorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworc3RhdGljIGNoYXIqIHNraXBfd2hpdGVzcGFjZShjaGFyICpzKQoreworCXdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykgKytzOworCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBjaGFyIGxpbmVbNjQgKiAxMDI0XTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19pbmNsdWRlcyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgY3VyZGlyX2ZkOworCWNoYXIgKmVuZDsKKwlGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCWlmICghZnApCisJCWV4aXQoMSk7CisKKwkvKiBFbnN1cmUgdGhhdCBuZXN0ZWQgaW5jbHVkZXMgYXJlIHJlbGF0aXZlOgorCSAqIGlmIHdlIGluY2x1ZGUgYS8xLmh0bSBhbmQgaXQgaW5jbHVkZXMgYi8yLmh0bSwKKwkgKiB3ZSBuZWVkIHRvIGluY2x1ZGUgYS9iLzIuaHRtLCBub3QgYi8yLmh0bQorCSAqLworCWN1cmRpcl9mZCA9IC0xOworCWVuZCA9IHN0cnJjaHIoZmlsZW5hbWUsICcvJyk7CisJaWYgKGVuZCkgeworCQljdXJkaXJfZmQgPSBvcGVuKCIuIiwgT19SRE9OTFkpOworCQkvKiAqZW5kID0gJ1wwJyB3b3VsZCBtaXNoYW5kbGUgIi9maWxlLmh0bSIgKi8KKwkJZW5kWzFdID0gJ1wwJzsKKwkJY2hkaXIoZmlsZW5hbWUpOworCX0KKworI2RlZmluZSBJTkNMVURFICI8IS0tI2luY2x1ZGUiCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7CisJCXVuc2lnbmVkIHByZWNlZGluZ19sZW47CisJCWNoYXIgKmluY2x1ZGVfZGlyZWN0aXZlOworCisJCWluY2x1ZGVfZGlyZWN0aXZlID0gc3Ryc3RyKGxpbmUsIElOQ0xVREUpOworCQlpZiAoIWluY2x1ZGVfZGlyZWN0aXZlKSB7CisJCQlmcHV0cyhsaW5lLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJcHJlY2VkaW5nX2xlbiA9IGluY2x1ZGVfZGlyZWN0aXZlIC0gbGluZTsKKwkJaWYgKG1lbWNocihsaW5lLCAnXCInLCBwcmVjZWRpbmdfbGVuKQorCQkgfHwgbWVtY2hyKGxpbmUsICdcJycsIHByZWNlZGluZ19sZW4pCisJCSkgeworCQkJLyogSU5DTFVERSBzdHJpbmcgbWF5IGJlIGluc2lkZSAic3RyIiBvciAnc3RyJywKKwkJCSAqIGlnbm9yZSBpdCAqLworCQkJZnB1dHMobGluZSwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFNtYWxsIGJ1Zzogd2UgYWNjZXB0ICNpbmNsdWRlZmlsZT0iZmlsZSIgdG9vICovCisJCWluY2x1ZGVfZGlyZWN0aXZlID0gc2tpcF93aGl0ZXNwYWNlKGluY2x1ZGVfZGlyZWN0aXZlICsgc2l6ZW9mKElOQ0xVREUpLTEpOworCQlpZiAoc3RybmNtcChpbmNsdWRlX2RpcmVjdGl2ZSwgImZpbGU9XCIiLCA2KSAhPSAwKSB7CisJCQkvKiAiPCEtLSNpbmNsdWRlIHZpcnR1YWw9Li4uIj8gLSBub3Qgc3VwcG9ydGVkICovCisJCQlmcHV0cyhsaW5lLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJaW5jbHVkZV9kaXJlY3RpdmUgKz0gNjsgLyogbm93IGl0IHBvaW50cyB0byBmaWxlIG5hbWUgKi8KKwkJZW5kID0gc3RyY2hyKGluY2x1ZGVfZGlyZWN0aXZlLCAnXCInKTsKKwkJaWYgKCFlbmQpIHsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBjaGVja2VkIHRoYXQgdGhpcyBpcyBhIHZhbGlkIGluY2x1ZGUgZGlyZWN0aXZlICovCisKKwkJLyogUHJpbnQgZXZlcnl0aGluZyBiZWZvcmUgZGlyZWN0aXZlICovCisJCWlmIChwcmVjZWRpbmdfbGVuKSB7CisJCQlsaW5lW3ByZWNlZGluZ19sZW5dID0gJ1wwJzsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCX0KKwkJLyogU2F2ZSBldmVyeXRoaW5nIGFmdGVyIGRpcmVjdGl2ZSAqLworCQkqZW5kKysgPSAnXDAnOworCQllbmQgPSBzdHJjaHIoZW5kLCAnPicpOworCQlpZiAoZW5kKQorCQkJZW5kID0gc3RyZHVwKGVuZCArIDEpOworCisJCS8qIEZJWE1FOgorCQkgKiAoMSkgYXJlIHJlbGF0aXZlIHBhdGhzIHdpdGggLy4uLyBldGMgb2s/CisJCSAqICgyKSB3aGF0IHRvIGRvIHdpdGggYWJzb2x1dGUgcGF0aHM/CisJCSAqIGFyZSB0aGV5IHJlbGF0aXZlIHRvIGRvYyByb290IG9yIHRvIHJlYWwgcm9vdD8KKwkJICovCisJCXByb2Nlc3NfaW5jbHVkZXMoaW5jbHVkZV9kaXJlY3RpdmUpOworCisJCS8qIFByaW50IGV2ZXJ5dGhpbmcgYWZ0ZXIgZGlyZWN0aXZlICovCisJICAgICAgICBpZiAoZW5kKSB7CisJCQlmcHV0cyhlbmQsIHN0ZG91dCk7CisJCQlmcmVlKGVuZCk7CisJCX0KKwl9CisJaWYgKGN1cmRpcl9mZCA+PSAwKQorCQlmY2hkaXIoY3VyZGlyX2ZkKTsKKwlmY2xvc2UoZnApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWlmICghYXJndlsxXSkKKwkJcmV0dXJuIDE7CisKKwkvKiBTZWVuIGZyb20gYnVzeWJveC5uZXQncyBBcGFjaGU6CisJICogSFRUUC8xLjEgMjAwIE9LCisJICogRGF0ZTogVGh1LCAxMCBTZXAgMjAwOSAxODoyMzoyOCBHTVQKKwkgKiBTZXJ2ZXI6IEFwYWNoZQorCSAqIEFjY2VwdC1SYW5nZXM6IGJ5dGVzCisJICogQ29ubmVjdGlvbjogY2xvc2UKKwkgKiBDb250ZW50LVR5cGU6IHRleHQvaHRtbAorCSAqLworCWZwdXRzKAorCQkvKiAiRGF0ZTogVGh1LCAxMCBTZXAgMjAwOSAxODoyMzoyOCBHTVRcclxuIiAqLworCQkvKiAiU2VydmVyOiBBcGFjaGVcclxuIiAqLworCQkvKiAiQWNjZXB0LVJhbmdlczogYnl0ZXNcclxuIiAtIGRvIHdlIHJlYWxseSBhY2NlcHQgYnl0ZXM/ISAqLworCQkiQ29ubmVjdGlvbjogY2xvc2VcclxuIgorCQkiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWxcclxuIgorCQkiXHJcbiIsCisJCXN0ZG91dAorCSk7CisJcHJvY2Vzc19pbmNsdWRlcyhhcmd2WzFdKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaWZjb25maWcuYyBiL25ldHdvcmtpbmcvaWZjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjYwNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pZmNvbmZpZy5jCkBAIC0wLDAgKzEsNTU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIGlmY29uZmlnCisgKgorICogU2ltaWxhciB0byB0aGUgc3RhbmRhcmQgVW5peCBpZmNvbmZpZywgYnV0IHdpdGggb25seSB0aGUgbmVjZXNzYXJ5CisgKiBwYXJ0cyBmb3IgQUZfSU5FVCwgYW5kIHdpdGhvdXQgYW55IHByaW50aW5nIG9mIGlmIGluZm8gKGZvciBub3cpLgorICoKKyAqIEJqb3JuIFdlc2VuLCBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICoKKyAqIEF1dGhvcnMgb2YgdGhlIG9yaWdpbmFsIGlmY29uZmlnIHdhczoKKyAqICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgICAgICAgTWFyIDYsIDIwMDEKKyAqCisgKiBGcm9tIGluaXRpYWwgcG9ydCB0byBidXN5Ym94LCByZW1vdmVkIG1vc3Qgb2YgdGhlIHJlZHVuZGFuY3kgYnkKKyAqIGNvbnZlcnRpbmcgdG8gYSB0YWJsZS1kcml2ZW4gYXBwcm9hY2guICBBZGRlZCBzZXZlcmFsIChvcHRpb25hbCkKKyAqIGFyZ3MgbWlzc2luZyBmcm9tIGluaXRpYWwgcG9ydC4KKyAqCisgKiBTdGlsbCBtaXNzaW5nOiAgbWVkaWEsIHR1bm5lbC4KKyAqCisgKiAyMDAyLTA0LTIwCisgKiBJUFY2IHN1cHBvcnQgYWRkZWQgYnkgQmFydCBWaXNzY2hlciA8bWFnaWNrQGxpbnV4LWZhbi5jb20+CisgKi8KKworLy91c2FnZTojZGVmaW5lIGlmY29uZmlnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTKCJbLWFdIikgIiBpbnRlcmZhY2UgW2FkZHJlc3NdIgorLy91c2FnZTojZGVmaW5lIGlmY29uZmlnX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29uZmlndXJlIGEgbmV0d29yayBpbnRlcmZhY2VcbiIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQVjYoCisvL3VzYWdlOiAgICAgICAiCVthZGQgQUREUkVTU1svUFJFRklYTEVOXV1cbiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQVjYoCisvL3VzYWdlOiAgICAgICAiCVtkZWwgQUREUkVTU1svUFJFRklYTEVOXV1cbiIpCisvL3VzYWdlOiAgICAgICAiCVtbLV1icm9hZGNhc3QgW0FERFJFU1NdXSBbWy1dcG9pbnRvcG9pbnQgW0FERFJFU1NdXVxuIgorLy91c2FnZTogICAgICAgIglbbmV0bWFzayBBRERSRVNTXSBbZHN0YWRkciBBRERSRVNTXVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9JRkNPTkZJR19TTElQKAorLy91c2FnZTogICAgICAgIglbb3V0ZmlsbCBOTl0gW2tlZXBhbGl2ZSBOTl1cbiIpCisvL3VzYWdlOiAgICAgICAiCSIgSUZfRkVBVFVSRV9JRkNPTkZJR19IVygiW2h3IGV0aGVyIiBJRl9GRUFUVVJFX0hXSUIoInxpbmZpbmliYW5kIikiIEFERFJFU1NdICIpICJbbWV0cmljIE5OXSBbbXR1IE5OXVxuIgorLy91c2FnZTogICAgICAgIglbWy1ddHJhaWxlcnNdIFtbLV1hcnBdIFtbLV1hbGxtdWx0aV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW211bHRpY2FzdF0gW1stXXByb21pc2NdIFt0eHF1ZXVlbGVuIE5OXSBbWy1dZHluYW1pY11cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUSgKKy8vdXNhZ2U6ICAgICAgICIJW21lbV9zdGFydCBOTl0gW2lvX2FkZHIgTk5dIFtpcnEgTk5dXG4iKQorLy91c2FnZTogICAgICAgIglbdXB8ZG93bl0gLi4uIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaWZkZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorIyBpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfU0xJUAorIyBpbmNsdWRlIDxuZXQvaWZfc2xpcC5oPgorI2VuZGlmCisKKy8qIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lZWRlZCBmb3IgYnVzeWJveCBvciBub3QuICBBbnlvbmU/ICovCisjZGVmaW5lIFFVRVNUSU9OQUJMRV9BTElBU19DQVNFCisKKworLyogRGVmaW5lcyBmb3IgZ2xpYmMyLjAgdXNlcnMuICovCisjaWZuZGVmIFNJT0NTSUZUWFFMRU4KKyMgZGVmaW5lIFNJT0NTSUZUWFFMRU4gICAgICAweDg5NDMKKyMgZGVmaW5lIFNJT0NHSUZUWFFMRU4gICAgICAweDg5NDIKKyNlbmRpZgorCisvKiBpZnJfcWxlbiBpcyBpZnJ1X2l2YWx1ZSwgYnV0IGl0IGlzbid0IHByZXNlbnQgaW4gMi4wIGtlcm5lbCBoZWFkZXJzICovCisjaWZuZGVmIGlmcl9xbGVuCisjIGRlZmluZSBpZnJfcWxlbiAgICAgICAgaWZyX2lmcnUuaWZydV9tdHUKKyNlbmRpZgorCisjaWZuZGVmIElGRl9EWU5BTUlDCisjIGRlZmluZSBJRkZfRFlOQU1JQyAgICAgMHg4MDAwCS8qIGRpYWx1cCBkZXZpY2Ugd2l0aCBjaGFuZ2luZyBhZGRyZXNzZXMgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorc3RydWN0IGluNl9pZnJlcSB7CisJc3RydWN0IGluNl9hZGRyIGlmcjZfYWRkcjsKKwl1aW50MzJfdCBpZnI2X3ByZWZpeGxlbjsKKwlpbnQgaWZyNl9pZmluZGV4OworfTsKKyNlbmRpZgorCisvKgorICogSGVyZSBhcmUgdGhlIGJpdCBtYXNrcyBmb3IgdGhlICJmbGFncyIgbWVtYmVyIG9mIHN0cnVjdCBvcHRpb25zIGJlbG93LgorICogTl8gc2lnbmlmaWVzIG5vIGFyZyBwcmVmaXg7IE1fIHNpZ25pZmllcyBhcmcgcHJlZml4ZWQgYnkgJy0nLgorICogQ0xSIGNsZWFycyB0aGUgZmxhZzsgU0VUIHNldHMgdGhlIGZsYWc7IEFSRyBzaWduaWZpZXMgKG9wdGlvbmFsKSBhcmcuCisgKi8KKyNkZWZpbmUgTl9DTFIgICAgICAgICAgICAweDAxCisjZGVmaW5lIE1fQ0xSICAgICAgICAgICAgMHgwMgorI2RlZmluZSBOX1NFVCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTV9TRVQgICAgICAgICAgICAweDA4CisjZGVmaW5lIE5fQVJHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBNX0FSRyAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBNX01BU0sgICAgICAgICAgIChNX0NMUiB8IE1fU0VUIHwgTV9BUkcpCisjZGVmaW5lIE5fTUFTSyAgICAgICAgICAgKE5fQ0xSIHwgTl9TRVQgfCBOX0FSRykKKyNkZWZpbmUgU0VUX01BU0sgICAgICAgICAoTl9TRVQgfCBNX1NFVCkKKyNkZWZpbmUgQ0xSX01BU0sgICAgICAgICAoTl9DTFIgfCBNX0NMUikKKyNkZWZpbmUgU0VUX0NMUl9NQVNLICAgICAoU0VUX01BU0sgfCBDTFJfTUFTSykKKyNkZWZpbmUgQVJHX01BU0sgICAgICAgICAoTV9BUkcgfCBOX0FSRykKKworLyoKKyAqIEhlcmUgYXJlIHRoZSBiaXQgbWFza3MgZm9yIHRoZSAiYXJnX2ZsYWdzIiBtZW1iZXIgb2Ygc3RydWN0IG9wdGlvbnMgYmVsb3cuCisgKi8KKworLyoKKyAqIGNhc3QgdHlwZToKKyAqICAgMDAgaW50CisgKiAgIDAxIGNoYXIgKgorICogICAwMiBIT1NUX0NPUFkgaW5fZXRoZXIKKyAqICAgMDMgSE9TVF9DT1BZIElORVRfcmVzb2x2ZQorICovCisjZGVmaW5lIEFfQ0FTVF9UWVBFICAgICAgMHgwMworLyoKKyAqIG1hcCB0eXBlOgorICogICAwMCBub3QgYSBtYXAgdHlwZSAobWVtX3N0YXJ0LCBpb19hZGRyLCBpcnEpCisgKiAgIDA0IG1lbXN0YXJ0ICh1bnNpZ25lZCBsb25nKQorICogICAwOCBpb19hZGRyICAodW5zaWduZWQgc2hvcnQpCisgKiAgIDBDIGlycSAgICAgICh1bnNpZ25lZCBjaGFyKQorICovCisjZGVmaW5lIEFfTUFQX1RZUEUgICAgICAgMHgwQworI2RlZmluZSBBX0FSR19SRVEgICAgICAgIDB4MTAJLyogU2V0IGlmIGFuIGFyZyBpcyByZXF1aXJlZC4gKi8KKyNkZWZpbmUgQV9ORVRNQVNLICAgICAgICAweDIwCS8qIFNldCBpZiBuZXRtYXNrIChjaGVjayBmb3IgbXVsdGlwbGUgc2V0cykuICovCisjZGVmaW5lIEFfU0VUX0FGVEVSICAgICAgMHg0MAkvKiBTZXQgYSBmbGFnIGF0IHRoZSBlbmQuICovCisjZGVmaW5lIEFfQ09MT05fQ0hLICAgICAgMHg4MAkvKiBJcyB0aGlzIG5lZWRlZD8gIFNlZSBiZWxvdy4gKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUworI2RlZmluZSBBX0hPU1ROQU1FICAgICAgMHgxMDAJLyogU2V0IGlmIGl0IGlzIGlwIGFkZHIuICovCisjZGVmaW5lIEFfQlJPQURDQVNUICAgICAweDIwMAkvKiBTZXQgaWYgaXQgaXMgYnJvYWRjYXN0IGFkZHIuICovCisjZWxzZQorI2RlZmluZSBBX0hPU1ROQU1FICAgICAgICAgIDAKKyNkZWZpbmUgQV9CUk9BRENBU1QgICAgICAgICAwCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGRlZmluZXMgYXJlIGZvciBkZWFsaW5nIHdpdGggdGhlIEFfQ0FTVF9UWVBFIGZpZWxkLgorICovCisjZGVmaW5lIEFfQ0FTVF9DSEFSX1BUUiAgMHgwMQorI2RlZmluZSBBX0NBU1RfUkVTT0xWRSAgIDB4MDEKKyNkZWZpbmUgQV9DQVNUX0hPU1RfQ09QWSAweDAyCisjZGVmaW5lIEFfQ0FTVF9IT1NUX0NPUFlfSU5fRVRIRVIgICAgQV9DQVNUX0hPU1RfQ09QWQorI2RlZmluZSBBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgICAgIChBX0NBU1RfSE9TVF9DT1BZIHwgQV9DQVNUX1JFU09MVkUpCisKKy8qCisgKiBUaGVzZSBkZWZpbmVzIGFyZSBmb3IgZGVhbGluZyB3aXRoIHRoZSBBX01BUF9UWVBFIGZpZWxkLgorICovCisjZGVmaW5lIEFfTUFQX1VMT05HICAgICAgMHgwNAkvKiBtZW1zdGFydCAqLworI2RlZmluZSBBX01BUF9VU0hPUlQgICAgIDB4MDgJLyogaW9fYWRkciAqLworI2RlZmluZSBBX01BUF9VQ0hBUiAgICAgIDB4MEMJLyogaXJxICovCisKKy8qCisgKiBEZWZpbmUgdGhlIGJpdCBtYXNrcyBzaWduaWZ5aW5nIHdoaWNoIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBmb3IgZWFjaCBhcmcuCisgKi8KKworI2RlZmluZSBBUkdfTUVUUklDICAgICAgIChBX0FSR19SRVEgLyp8IEFfQ0FTVF9JTlQqLykKKyNkZWZpbmUgQVJHX01UVSAgICAgICAgICAoQV9BUkdfUkVRIC8qfCBBX0NBU1RfSU5UKi8pCisjZGVmaW5lIEFSR19UWFFVRVVFTEVOICAgKEFfQVJHX1JFUSAvKnwgQV9DQVNUX0lOVCovKQorI2RlZmluZSBBUkdfTUVNX1NUQVJUICAgIChBX0FSR19SRVEgfCBBX01BUF9VTE9ORykKKyNkZWZpbmUgQVJHX0lPX0FERFIgICAgICAoQV9BUkdfUkVRIHwgQV9NQVBfVUxPTkcpCisjZGVmaW5lIEFSR19JUlEgICAgICAgICAgKEFfQVJHX1JFUSB8IEFfTUFQX1VDSEFSKQorI2RlZmluZSBBUkdfRFNUQUREUiAgICAgIChBX0FSR19SRVEgfCBBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUpCisjZGVmaW5lIEFSR19ORVRNQVNLICAgICAgKEFfQVJHX1JFUSB8IEFfQ0FTVF9IT1NUX0NPUFlfUkVTT0xWRSB8IEFfTkVUTUFTSykKKyNkZWZpbmUgQVJHX0JST0FEQ0FTVCAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9TRVRfQUZURVIgfCBBX0JST0FEQ0FTVCkKKyNkZWZpbmUgQVJHX0hXICAgICAgICAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9JTl9FVEhFUikKKyNkZWZpbmUgQVJHX1BPSU5UT1BPSU5UICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9TRVRfQUZURVIpCisjZGVmaW5lIEFSR19LRUVQQUxJVkUgICAgKEFfQVJHX1JFUSB8IEFfQ0FTVF9DSEFSX1BUUikKKyNkZWZpbmUgQVJHX09VVEZJTEwgICAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0NIQVJfUFRSKQorI2RlZmluZSBBUkdfSE9TVE5BTUUgICAgIChBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgfCBBX1NFVF9BRlRFUiB8IEFfQ09MT05fQ0hLIHwgQV9IT1NUTkFNRSkKKyNkZWZpbmUgQVJHX0FERF9ERUwgICAgICAoQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9TRVRfQUZURVIpCisKKworLyoKKyAqIFNldCB1cCB0aGUgdGFibGVzLiAgV2FybmluZyEgIFRoZXkgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmcgb3JkZXIhCisgKi8KKworc3RydWN0IGFyZzFvcHQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgc2hvcnQgc2VsZWN0b3I7CisJdW5zaWduZWQgc2hvcnQgaWZyX29mZnNldDsKK307CisKK3N0cnVjdCBvcHRpb25zIHsKKwljb25zdCBjaGFyICpuYW1lOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisJY29uc3QgdW5zaWduZWQgaW50IGZsYWdzOjY7CisJY29uc3QgdW5zaWduZWQgaW50IGFyZ19mbGFnczoxMDsKKyNlbHNlCisJY29uc3QgdW5zaWduZWQgY2hhciBmbGFnczsKKwljb25zdCB1bnNpZ25lZCBjaGFyIGFyZ19mbGFnczsKKyNlbmRpZgorCWNvbnN0IHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yOworfTsKKworI2RlZmluZSBpZnJlcV9vZmZzZXRvZih4KSAgb2Zmc2V0b2Yoc3RydWN0IGlmcmVxLCB4KQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZzFvcHQgQXJnMU9wdFtdID0geworCXsgIlNJRk1FVFJJQyIsICBTSU9DU0lGTUVUUklDLCAgaWZyZXFfb2Zmc2V0b2YoaWZyX21ldHJpYykgfSwKKwl7ICJTSUZNVFUiLCAgICAgU0lPQ1NJRk1UVSwgICAgIGlmcmVxX29mZnNldG9mKGlmcl9tdHUpIH0sCisJeyAiU0lGVFhRTEVOIiwgIFNJT0NTSUZUWFFMRU4sICBpZnJlcV9vZmZzZXRvZihpZnJfcWxlbikgfSwKKwl7ICJTSUZEU1RBRERSIiwgU0lPQ1NJRkRTVEFERFIsIGlmcmVxX29mZnNldG9mKGlmcl9kc3RhZGRyKSB9LAorCXsgIlNJRk5FVE1BU0siLCBTSU9DU0lGTkVUTUFTSywgaWZyZXFfb2Zmc2V0b2YoaWZyX25ldG1hc2spIH0sCisJeyAiU0lGQlJEQUREUiIsIFNJT0NTSUZCUkRBRERSLCBpZnJlcV9vZmZzZXRvZihpZnJfYnJvYWRhZGRyKSB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJeyAiU0lGSFdBRERSIiwgIFNJT0NTSUZIV0FERFIsICBpZnJlcV9vZmZzZXRvZihpZnJfaHdhZGRyKSB9LAorI2VuZGlmCisJeyAiU0lGRFNUQUREUiIsIFNJT0NTSUZEU1RBRERSLCBpZnJlcV9vZmZzZXRvZihpZnJfZHN0YWRkcikgfSwKKyNpZmRlZiBTSU9DU0tFRVBBTElWRQorCXsgIlNLRUVQQUxJVkUiLCBTSU9DU0tFRVBBTElWRSwgaWZyZXFfb2Zmc2V0b2YoaWZyX2RhdGEpIH0sCisjZW5kaWYKKyNpZmRlZiBTSU9DU09VVEZJTEwKKwl7ICJTT1VURklMTCIsICAgU0lPQ1NPVVRGSUxMLCAgIGlmcmVxX29mZnNldG9mKGlmcl9kYXRhKSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCXsgIlNJRk1BUCIsICAgICBTSU9DU0lGTUFQLCAgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX21hcC5tZW1fc3RhcnQpIH0sCisJeyAiU0lGTUFQIiwgICAgIFNJT0NTSUZNQVAsICAgICBpZnJlcV9vZmZzZXRvZihpZnJfbWFwLmJhc2VfYWRkcikgfSwKKwl7ICJTSUZNQVAiLCAgICAgU0lPQ1NJRk1BUCwgICAgIGlmcmVxX29mZnNldG9mKGlmcl9tYXAuaXJxKSB9LAorI2VuZGlmCisJLyogTGFzdCBlbnRyeSBpZiBmb3IgdW5tYXRjaGVkIChwb3NzaWJseSBob3N0bmFtZSkgYXJnLiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwl7ICJTSUZBRERSIiwgICAgU0lPQ1NJRkFERFIsICAgIGlmcmVxX29mZnNldG9mKGlmcl9hZGRyKSB9LCAvKiBJUHY2IHZlcnNpb24gaWdub3JlcyB0aGUgb2Zmc2V0ICovCisJeyAiRElGQUREUiIsICAgIFNJT0NESUZBRERSLCAgICBpZnJlcV9vZmZzZXRvZihpZnJfYWRkcikgfSwgLyogSVB2NiB2ZXJzaW9uIGlnbm9yZXMgdGhlIG9mZnNldCAqLworI2VuZGlmCisJeyAiU0lGQUREUiIsICAgIFNJT0NTSUZBRERSLCAgICBpZnJlcV9vZmZzZXRvZihpZnJfYWRkcikgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9ucyBPcHRBcnJheVtdID0geworCXsgIm1ldHJpYyIsICAgICAgTl9BUkcsICAgICAgICAgQVJHX01FVFJJQywgICAgICAwIH0sCisJeyAibXR1IiwgICAgICAgICBOX0FSRywgICAgICAgICBBUkdfTVRVLCAgICAgICAgIDAgfSwKKwl7ICJ0eHF1ZXVlbGVuIiwgIE5fQVJHLCAgICAgICAgIEFSR19UWFFVRVVFTEVOLCAgMCB9LAorCXsgImRzdGFkZHIiLCAgICAgTl9BUkcsICAgICAgICAgQVJHX0RTVEFERFIsICAgICAwIH0sCisJeyAibmV0bWFzayIsICAgICBOX0FSRywgICAgICAgICBBUkdfTkVUTUFTSywgICAgIDAgfSwKKwl7ICJicm9hZGNhc3QiLCAgIE5fQVJHIHwgTV9DTFIsIEFSR19CUk9BRENBU1QsICAgSUZGX0JST0FEQ0FTVCB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJeyAiaHciLCAgICAgICAgICBOX0FSRywgICAgICAgICBBUkdfSFcsICAgICAgICAgIDAgfSwKKyNlbmRpZgorCXsgInBvaW50b3BvaW50IiwgTl9BUkcgfCBNX0NMUiwgQVJHX1BPSU5UT1BPSU5ULCBJRkZfUE9JTlRPUE9JTlQgfSwKKyNpZmRlZiBTSU9DU0tFRVBBTElWRQorCXsgImtlZXBhbGl2ZSIsICAgTl9BUkcsICAgICAgICAgQVJHX0tFRVBBTElWRSwgICAwIH0sCisjZW5kaWYKKyNpZmRlZiBTSU9DU09VVEZJTEwKKwl7ICJvdXRmaWxsIiwgICAgIE5fQVJHLCAgICAgICAgIEFSR19PVVRGSUxMLCAgICAgMCB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCXsgIm1lbV9zdGFydCIsICAgTl9BUkcsICAgICAgICAgQVJHX01FTV9TVEFSVCwgICAwIH0sCisJeyAiaW9fYWRkciIsICAgICBOX0FSRywgICAgICAgICBBUkdfSU9fQUREUiwgICAgIDAgfSwKKwl7ICJpcnEiLCAgICAgICAgIE5fQVJHLCAgICAgICAgIEFSR19JUlEsICAgICAgICAgMCB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCXsgImFkZCIsICAgICAgICAgTl9BUkcsICAgICAgICAgQVJHX0FERF9ERUwsICAgICAwIH0sCisJeyAiZGVsIiwgICAgICAgICBOX0FSRywgICAgICAgICBBUkdfQUREX0RFTCwgICAgIDAgfSwKKyNlbmRpZgorCXsgImFycCIsICAgICAgICAgTl9DTFIgfCBNX1NFVCwgMCwgICAgICAgICAgICAgICBJRkZfTk9BUlAgfSwKKwl7ICJ0cmFpbGVycyIsICAgIE5fQ0xSIHwgTV9TRVQsIDAsICAgICAgICAgICAgICAgSUZGX05PVFJBSUxFUlMgfSwKKwl7ICJwcm9taXNjIiwgICAgIE5fU0VUIHwgTV9DTFIsIDAsICAgICAgICAgICAgICAgSUZGX1BST01JU0MgfSwKKwl7ICJtdWx0aWNhc3QiLCAgIE5fU0VUIHwgTV9DTFIsIDAsICAgICAgICAgICAgICAgSUZGX01VTFRJQ0FTVCB9LAorCXsgImFsbG11bHRpIiwgICAgTl9TRVQgfCBNX0NMUiwgMCwgICAgICAgICAgICAgICBJRkZfQUxMTVVMVEkgfSwKKwl7ICJkeW5hbWljIiwgICAgIE5fU0VUIHwgTV9DTFIsIDAsICAgICAgICAgICAgICAgSUZGX0RZTkFNSUMgfSwKKwl7ICJ1cCIsICAgICAgICAgIE5fU0VULCAgICAgICAgIDAsICAgICAgICAgICAgICAgKElGRl9VUCB8IElGRl9SVU5OSU5HKSB9LAorCXsgImRvd24iLCAgICAgICAgTl9DTFIsICAgICAgICAgMCwgICAgICAgICAgICAgICBJRkZfVVAgfSwKKwl7IE5VTEwsICAgICAgICAgIDAsICAgICAgICAgICAgIEFSR19IT1NUTkFNRSwgICAgKElGRl9VUCB8IElGRl9SVU5OSU5HKSB9Cit9OworCisvKgorICogQSBjb3VwbGUgb2YgcHJvdG90eXBlcy4KKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCitzdGF0aWMgaW50IGluX2V0aGVyKGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKTsKKyNlbmRpZgorCisvKgorICogT3VyIG1haW4gZnVuY3Rpb24uCisgKi8KK2ludCBpZmNvbmZpZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaWZjb25maWdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJc3RydWN0IHNvY2thZGRyX2luIHNhaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19IVworCXN0cnVjdCBzb2NrYWRkciBzYTsKKyNlbmRpZgorCWNvbnN0IHN0cnVjdCBhcmcxb3B0ICphMW9wOworCWNvbnN0IHN0cnVjdCBvcHRpb25zICpvcDsKKwlpbnQgc29ja2ZkOwkJCS8qIHNvY2tldCBmZCB3ZSB1c2UgdG8gbWFuaXB1bGF0ZSBzdHVmZiB3aXRoICovCisJaW50IHNlbGVjdG9yOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgaW50IGRpZF9mbGFnczsKKwl1bnNpZ25lZCBpbnQgc2FpX2hvc3RuYW1lLCBzYWlfbmV0bWFzazsKKyNlbHNlCisJdW5zaWduZWQgY2hhciBtYXNrOworCXVuc2lnbmVkIGNoYXIgZGlkX2ZsYWdzOworI2VuZGlmCisJY2hhciAqcDsKKwkvKmNoYXIgaG9zdFsxMjhdOyovCisJY29uc3QgY2hhciAqaG9zdCA9IE5VTEw7IC8qIG1ha2UgZ2NjIGhhcHB5ICovCisKKwlkaWRfZmxhZ3MgPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisJc2FpX2hvc3RuYW1lID0gMDsKKwlzYWlfbmV0bWFzayA9IDA7CisjZW5kaWYKKworCS8qIHNraXAgYXJndlswXSAqLworCSsrYXJndjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX1NUQVRVUworCWlmIChhcmd2WzBdICYmIChhcmd2WzBdWzBdID09ICctJyAmJiBhcmd2WzBdWzFdID09ICdhJyAmJiAhYXJndlswXVsyXSkpIHsKKwkJaW50ZXJmYWNlX29wdF9hID0gMTsKKwkJKythcmd2OworCX0KKyNlbmRpZgorCisJaWYgKCFhcmd2WzBdIHx8ICFhcmd2WzFdKSB7IC8qIG9uZSBvciBubyBhcmdzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTCisJCXJldHVybiBkaXNwbGF5X2ludGVyZmFjZXMoYXJndlswXSAvKiBjYW4gYmUgTlVMTCAqLyk7CisjZWxzZQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gc3VwcG9ydCBmb3Igc3RhdHVzIGRpc3BsYXkiKTsKKyNlbmRpZgorCX0KKworCS8qIENyZWF0ZSBhIGNoYW5uZWwgdG8gdGhlIE5FVCBrZXJuZWwuICovCisJc29ja2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworCS8qIGdldCBpbnRlcmZhY2UgbmFtZSAqLworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCAqYXJndik7CisKKwkvKiBQcm9jZXNzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLiAqLworCXdoaWxlICgqKythcmd2ICE9IChjaGFyICopIE5VTEwpIHsKKwkJcCA9ICphcmd2OworCQltYXNrID0gTl9NQVNLOworCQlpZiAoKnAgPT0gJy0nKSB7CS8qIElmIHRoZSBhcmcgc3RhcnRzIHdpdGggJy0nLi4uICovCisJCQkrK3A7CQkvKiAgICBhZHZhbmNlIHBhc3QgaXQgYW5kICovCisJCQltYXNrID0gTV9NQVNLOwkvKiAgICBzZXQgdGhlIGFwcHJvcHJpYXRlIG1hc2suICovCisJCX0KKwkJZm9yIChvcCA9IE9wdEFycmF5OyBvcC0+bmFtZTsgb3ArKykgewkvKiBGaW5kIHRhYmxlIGVudHJ5LiAqLworCQkJaWYgKHN0cmNtcChwLCBvcC0+bmFtZSkgPT0gMCkgewkvKiBJZiBuYW1lIG1hdGNoZXMuLi4gKi8KKwkJCQltYXNrICY9IG9wLT5mbGFnczsKKwkJCQlpZiAobWFzaykJLyogc2V0IHRoZSBtYXNrIGFuZCBnby4gKi8KKwkJCQkJZ290byBGT1VORF9BUkc7CisJCQkJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZXJlIHdhcyBhIHZhbGlkIGFyZyB3aXRoIGFuICovCisJCQkJLyogaW52YWxpZCAnLScgcHJlZml4LiAqLworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQ6ICclcyciLCBwLTEpOworCQkJfQorCQl9CisKKwkJLyogV2UgZmVsbCB0aHJvdWdoLCBzbyB0cmVhdCBhcyBwb3NzaWJsZSBob3N0bmFtZS4gKi8KKwkJYTFvcCA9IEFyZzFPcHQgKyBBUlJBWV9TSVpFKEFyZzFPcHQpIC0gMTsKKwkJbWFzayA9IG9wLT5hcmdfZmxhZ3M7CisJCWdvdG8gSE9TVE5BTUU7CisKKyBGT1VORF9BUkc6CisJCWlmIChtYXNrICYgQVJHX01BU0spIHsKKwkJCW1hc2sgPSBvcC0+YXJnX2ZsYWdzOworCQkJYTFvcCA9IEFyZzFPcHQgKyAob3AgLSBPcHRBcnJheSk7CisJCQlpZiAobWFzayAmIEFfTkVUTUFTSyAmIGRpZF9mbGFncykKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlpZiAoKisrYXJndiA9PSBOVUxMKSB7CisJCQkJaWYgKG1hc2sgJiBBX0FSR19SRVEpCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQktLWFyZ3Y7CisJCQkJbWFzayAmPSBBX1NFVF9BRlRFUjsJLyoganVzdCBmb3IgYnJvYWRjYXN0ICovCisJCQl9IGVsc2UgewkvKiBnb3QgYW4gYXJnIHNvIHByb2Nlc3MgaXQgKi8KKyBIT1NUTkFNRToKKwkJCQlkaWRfZmxhZ3MgfD0gKG1hc2sgJiAoQV9ORVRNQVNLfEFfSE9TVE5BTUUpKTsKKwkJCQlpZiAobWFzayAmIEFfQ0FTVF9IT1NUX0NPUFkpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19IVworCQkJCQlpZiAobWFzayAmIEFfQ0FTVF9SRVNPTFZFKSB7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCQkJCQljaGFyICpwcmVmaXg7CisJCQkJCQlpbnQgcHJlZml4X2xlbiA9IDA7CisjZW5kaWYKKwkJCQkJCS8qc2FmZV9zdHJuY3B5KGhvc3QsICphcmd2LCAoc2l6ZW9mIGhvc3QpKTsqLworCQkJCQkJaG9zdCA9ICphcmd2OworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJCQkJCXByZWZpeCA9IHN0cmNocihob3N0LCAnLycpOworCQkJCQkJaWYgKHByZWZpeCkgeworCQkJCQkJCXByZWZpeF9sZW4gPSB4YXRvdV9yYW5nZShwcmVmaXggKyAxLCAwLCAxMjgpOworCQkJCQkJCSpwcmVmaXggPSAnXDAnOworCQkJCQkJfQorI2VuZGlmCisJCQkJCQlzYWkuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQkJCQlzYWkuc2luX3BvcnQgPSAwOworCQkJCQkJaWYgKHN0cmNtcChob3N0LCAiZGVmYXVsdCIpID09IDApIHsKKwkJCQkJCQkvKiBEZWZhdWx0IGlzIHNwZWNpYWwsIG1lYW5pbmcgMC4wLjAuMC4gKi8KKwkJCQkJCQlzYWkuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwkJCQkJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUworCQkJCQkJZWxzZSBpZiAoKGhvc3RbMF0gPT0gJysnICYmICFob3N0WzFdKSAmJiAobWFzayAmIEFfQlJPQURDQVNUKQorCQkJCQkJICYmIChkaWRfZmxhZ3MgJiAoQV9ORVRNQVNLfEFfSE9TVE5BTUUpKSA9PSAoQV9ORVRNQVNLfEFfSE9TVE5BTUUpCisJCQkJCQkpIHsKKwkJCQkJCQkvKiArIGlzIHNwZWNpYWwsIG1lYW5pbmcgYnJvYWRjYXN0IGlzIGRlcml2ZWQuICovCisJCQkJCQkJc2FpLnNpbl9hZGRyLnNfYWRkciA9ICh+c2FpX25ldG1hc2spIHwgKHNhaV9ob3N0bmFtZSAmIHNhaV9uZXRtYXNrKTsKKwkJCQkJCX0KKyNlbmRpZgorCQkJCQkJZWxzZSB7CisJCQkJCQkJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCQkJCQkJCWlmIChzdHJjbXAoaG9zdCwgImluZXQiKSA9PSAwKQorCQkJCQkJCQljb250aW51ZTsgLyogY29tcGF0IHN0dWZmICovCisJCQkJCQkJbHNhID0geGhvc3Qyc29ja2FkZHIoaG9zdCwgMCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQkJCQkJCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQkJCQkJCWludCBzb2NrZmQ2OworCQkJCQkJCQlzdHJ1Y3QgaW42X2lmcmVxIGlmcjY7CisKKwkJCQkJCQkJbWVtY3B5KChjaGFyICopICZpZnI2LmlmcjZfYWRkciwKKwkJCQkJCQkJCQkoY2hhciAqKSAmKGxzYS0+dS5zaW42LnNpbjZfYWRkciksCisJCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCisJCQkJCQkJCS8qIENyZWF0ZSBhIGNoYW5uZWwgdG8gdGhlIE5FVCBrZXJuZWwuICovCisJCQkJCQkJCXNvY2tmZDYgPSB4c29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKwkJCQkJCQkJeGlvY3RsKHNvY2tmZDYsIFNJT0dJRklOREVYLCAmaWZyKTsKKwkJCQkJCQkJaWZyNi5pZnI2X2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisJCQkJCQkJCWlmcjYuaWZyNl9wcmVmaXhsZW4gPSBwcmVmaXhfbGVuOworCQkJCQkJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShzb2NrZmQ2LCBhMW9wLT5zZWxlY3RvciwgJmlmcjYsICJTSU9DJXMiLCBhMW9wLT5uYW1lKTsKKwkJCQkJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQkJCQkJZnJlZShsc2EpOworCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQl9CisjZW5kaWYKKwkJCQkJCQlzYWkuc2luX2FkZHIgPSBsc2EtPnUuc2luLnNpbl9hZGRyOworCQkJCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQkJCQkJZnJlZShsc2EpOworCQkJCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisJCQkJCQlpZiAobWFzayAmIEFfSE9TVE5BTUUpCisJCQkJCQkJc2FpX2hvc3RuYW1lID0gc2FpLnNpbl9hZGRyLnNfYWRkcjsKKwkJCQkJCWlmIChtYXNrICYgQV9ORVRNQVNLKQorCQkJCQkJCXNhaV9uZXRtYXNrID0gc2FpLnNpbl9hZGRyLnNfYWRkcjsKKyNlbmRpZgorCQkJCQkJcCA9IChjaGFyICopICZzYWk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfSFcKKwkJCQkJfSBlbHNlIHsJLyogQV9DQVNUX0hPU1RfQ09QWV9JTl9FVEhFUiAqLworCQkJCQkJLyogVGhpcyBpcyB0aGUgImh3IiBhcmcgY2FzZS4gKi8KKwkJCQkJCXNtYWxsdWludCBod19jbGFzcz0gaW5kZXhfaW5fc3Vic3RyaW5ncygiZXRoZXJcMCIKKwkJCQkJCQkJSUZfRkVBVFVSRV9IV0lCKCJpbmZpbmliYW5kXDAiKSwgKmFyZ3YpICsgMTsKKwkJCQkJCWlmICghaHdfY2xhc3MgfHwgISorK2FyZ3YpCisJCQkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCQkJLypzYWZlX3N0cm5jcHkoaG9zdCwgKmFyZ3YsIHNpemVvZihob3N0KSk7Ki8KKwkJCQkJCWhvc3QgPSAqYXJndjsKKwkJCQkJCWlmIChod19jbGFzcyA9PSAxID8gaW5fZXRoZXIoaG9zdCwgJnNhKSA6IGluX2liKGhvc3QsICZzYSkpCisJCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgaHctYWRkciAlcyIsIGhvc3QpOworCQkJCQkJcCA9IChjaGFyICopICZzYTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCW1lbWNweSggKCgoY2hhciAqKSZpZnIpICsgYTFvcC0+aWZyX29mZnNldCksCisJCQkJCQkgICBwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogRklYTUU6IGVycm9yIGNoZWNrPz8gKi8KKwkJCQkJdW5zaWduZWQgbG9uZyBpID0gc3RydG91bCgqYXJndiwgTlVMTCwgMCk7CisJCQkJCXAgPSAoKGNoYXIgKikmaWZyKSArIGExb3AtPmlmcl9vZmZzZXQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCQkJCQlpZiAobWFzayAmIEFfTUFQX1RZUEUpIHsKKwkJCQkJCXhpb2N0bChzb2NrZmQsIFNJT0NHSUZNQVAsICZpZnIpOworCQkJCQkJaWYgKChtYXNrICYgQV9NQVBfVUNIQVIpID09IEFfTUFQX1VDSEFSKQorCQkJCQkJCSooKHVuc2lnbmVkIGNoYXIgKikgcCkgPSBpOworCQkJCQkJZWxzZSBpZiAobWFzayAmIEFfTUFQX1VTSE9SVCkKKwkJCQkJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKSBwKSA9IGk7CisJCQkJCQllbHNlCisJCQkJCQkJKigodW5zaWduZWQgbG9uZyAqKSBwKSA9IGk7CisJCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJCWlmIChtYXNrICYgQV9DQVNUX0NIQVJfUFRSKQorCQkJCQkJKigoY2FkZHJfdCAqKSBwKSA9IChjYWRkcl90KSBpOworCQkJCQllbHNlCS8qIEFfQ0FTVF9JTlQgKi8KKwkJCQkJCSooKGludCAqKSBwKSA9IGk7CisJCQkJfQorCisJCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoc29ja2ZkLCBhMW9wLT5zZWxlY3RvciwgJmlmciwgIlNJT0MlcyIsIGExb3AtPm5hbWUpOworI2lmZGVmIFFVRVNUSU9OQUJMRV9BTElBU19DQVNFCisJCQkJaWYgKG1hc2sgJiBBX0NPTE9OX0NISykgeworCQkJCQkvKgorCQkJCQkgKiBEb24ndCBkbyB0aGUgc2V0X2ZsYWcoKSBpZiB0aGUgYWRkcmVzcyBpcyBhbiBhbGlhcyB3aXRoCisJCQkJCSAqIGEgJy0nIGF0IHRoZSBlbmQsIHNpbmNlIGl0J3MgZGVsZXRlZCBhbHJlYWR5ISAtIFJvbWFuCisJCQkJCSAqCisJCQkJCSAqIFNob3VsZCByZWFsbHkgdXNlIHJlZ2V4LmggaGVyZSwgbm90IHN1cmUgdGhvdWdoIGhvdyB3ZWxsCisJCQkJCSAqIGl0J2xsIGdvIHdpdGggdGhlIGNyb3NzLXBsYXRmb3JtIHN1cHBvcnQgZXRjLgorCQkJCQkgKi8KKwkJCQkJY2hhciAqcHRyOworCQkJCQlzaG9ydCBpbnQgZm91bmRfY29sb24gPSAwOworCQkJCQlmb3IgKHB0ciA9IGlmci5pZnJfbmFtZTsgKnB0cjsgcHRyKyspCisJCQkJCQlpZiAoKnB0ciA9PSAnOicpCisJCQkJCQkJZm91bmRfY29sb24rKzsKKwkJCQkJaWYgKGZvdW5kX2NvbG9uICYmIHB0clstMV0gPT0gJy0nKQorCQkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCQlpZiAoIShtYXNrICYgQV9TRVRfQUZURVIpKQorCQkJCWNvbnRpbnVlOworCQkJbWFzayA9IE5fU0VUOworCQl9CisKKwkJeGlvY3RsKHNvY2tmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKTsKKwkJc2VsZWN0b3IgPSBvcC0+c2VsZWN0b3I7CisJCWlmIChtYXNrICYgU0VUX01BU0spCisJCQlpZnIuaWZyX2ZsYWdzIHw9IHNlbGVjdG9yOworCQllbHNlCisJCQlpZnIuaWZyX2ZsYWdzICY9IH5zZWxlY3RvcjsKKwkJeGlvY3RsKHNvY2tmZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKTsKKwl9IC8qIHdoaWxlICgpICovCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKHNvY2tmZCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19IVworLyogSW5wdXQgYW4gRXRoZXJuZXQgYWRkcmVzcyBhbmQgY29udmVydCB0byBiaW5hcnkuICovCitzdGF0aWMgaW50IGluX2V0aGVyKGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNoYXIgKnB0cjsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlzYXAtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlwdHIgPSAoY2hhciAqKSBzYXAtPnNhX2RhdGE7CisKKwlpID0gMDsKKwlkbyB7CisJCWogPSB2YWwgPSAwOworCisJCS8qIFdlIG1pZ2h0IGdldCBhIHNlbWljb2xvbiBoZXJlIC0gbm90IHJlcXVpcmVkLiAqLworCQlpZiAoaSAmJiAoKmJ1ZnAgPT0gJzonKSkgeworCQkJYnVmcCsrOworCQl9CisKKwkJZG8geworCQkJYyA9ICpidWZwOworCQkJaWYgKCgodW5zaWduZWQgY2hhcikoYyAtICcwJykpIDw9IDkpIHsKKwkJCQljIC09ICcwJzsKKwkJCX0gZWxzZSBpZiAoKCh1bnNpZ25lZCBjaGFyKSgoY3wweDIwKSAtICdhJykpIDw9IDUpIHsKKwkJCQljID0gKGN8MHgyMCkgLSAoJ2EnLTEwKTsKKwkJCX0gZWxzZSBpZiAoaiAmJiAoYyA9PSAnOicgfHwgYyA9PSAwKSkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkrK2J1ZnA7CisJCQl2YWwgPDw9IDQ7CisJCQl2YWwgKz0gYzsKKwkJfSB3aGlsZSAoKytqIDwgMik7CisJCSpwdHIrKyA9IHZhbDsKKwl9IHdoaWxlICgrK2kgPCBFVEhfQUxFTik7CisKKwlyZXR1cm4gKmJ1ZnA7IC8qIEVycm9yIGlmIHdlIGRvbid0IGVuZCBhdCBlbmQgb2Ygc3RyaW5nLiAqLworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lmZW5zbGF2ZS5jIGIvbmV0d29ya2luZy9pZmVuc2xhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTc3MTlmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pZmVuc2xhdmUuYwpAQCAtMCwwICsxLDYxNyBAQAorLyogTW9kZTogQzsKKyAqCisgKiBNaW5pIGlmZW5zbGF2ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IE1hcmMgTGVlbWFuIDxtYXJjLmxlZW1hbkBiYXJjby5jb20+CisgKgorICogaWZlbnNsYXZlLmM6IENvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZXMgZm9yIHBhcmFsbGVsIHJvdXRpbmcuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gY29udHJvbHMgdGhlIExpbnV4IGltcGxlbWVudGF0aW9uIG9mIHJ1bm5pbmcgbXVsdGlwbGUKKyAqICAgICAgbmV0d29yayBpbnRlcmZhY2VzIGluIHBhcmFsbGVsLgorICoKKyAqIEF1dGhvcjogICAgICBEb25hbGQgQmVja2VyIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+CisgKiAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTQtMTk5NiBEb25hbGQgQmVja2VyCisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorICogICAgICAgICAgICAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgICAgICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAQ0VTRElTLmdzZmMubmFzYS5nb3YsIG9yIEMvTworICogICAgICBDZW50ZXIgb2YgRXhjZWxsZW5jZSBpbiBTcGFjZSBEYXRhIGFuZCBJbmZvcm1hdGlvbiBTY2llbmNlcworICogICAgICAgICBDb2RlIDkzMC41LCBHb2RkYXJkIFNwYWNlIEZsaWdodCBDZW50ZXIsIEdyZWVuYmVsdCBNRCAyMDc3MQorICoKKyAqICBDaGFuZ2VzIDoKKyAqICAgIC0gMjAwMC8xMC8wMiBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBtZXRhLXgub3JnPiA6CisgKiAgICAgICAtIGZldyBmaXhlcy4gTWFzdGVyJ3MgTUFDIGFkZHJlc3MgaXMgbm93IGNvcnJlY3RseSB0YWtlbiBmcm9tCisgKiAgICAgICAgIHRoZSBmaXJzdCBkZXZpY2Ugd2hlbiBub3QgcHJldmlvdXNseSBzZXQgOworICogICAgICAgLSBkZXRhY2ggc3VwcG9ydCA6IGNhbGwgQk9ORF9SRUxFQVNFIHRvIGRldGFjaCBhbiBlbnNsYXZlZCBpbnRlcmZhY2UuCisgKiAgICAgICAtIGdpdmUgYSBtaW5pLWhvd3RvIGZyb20gY29tbWFuZC1saW5lIGhlbHAgOiAjIGlmZW5zbGF2ZSAtaAorICoKKyAqICAgIC0gMjAwMS8wMi8xNiBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+IDoKKyAqICAgICAgIC0gTWFzdGVyIGlzIG5vdyBicm91Z2h0IGRvd24gYmVmb3JlIHNldHRpbmcgdGhlIE1BQyBhZGRyZXNzLiAgSW4KKyAqICAgICAgICAgdGhlIDIuNCBrZXJuZWwgeW91IGNhbid0IGNoYW5nZSB0aGUgTUFDIGFkZHJlc3Mgd2hpbGUgdGhlIGRldmljZSBpcworICogICAgICAgICB1cCBiZWNhdXNlIHlvdSBnZXQgRUJVU1kuCisgKgorICogICAgLSAyMDAxLzA5LzEzIFRha2FvIEluZG9oIDxpbmRvdSBkb3QgdGFrYW8gYXQganAgZG90IGZ1aml0c3UgZG90IGNvbT4KKyAqICAgICAgIC0gQWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIHRoZSBhY3RpdmUgaW50ZXJmYWNlIG9uIGEgbW9kZSAxIGJvbmQKKyAqICAgICAgICAgYXQgcnVudGltZS4KKyAqCisgKiAgICAtIDIwMDEvMTAvMjMgQ2hhZCBOLiBUaW5kZWwgPGN0aW5kZWwgYXQgaWVlZSBkb3Qgb3JnPiA6CisgKiAgICAgICAtIE5vIGxvbmdlciBzZXQgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBtYXN0ZXIuICBUaGUgYm9uZCBkZXZpY2Ugd2lsbAorICogICAgICAgICB0YWtlIGNhcmUgb2YgdGhpcyBpdHNlbGYKKyAqICAgICAgIC0gVHJ5IHRoZSBTSU9DKioqIHZlcnNpb25zIG9mIHRoZSBib25kaW5nIGlvY3RscyBiZWZvcmUgdXNpbmcgdGhlCisgKiAgICAgICAgIG9sZCB2ZXJzaW9ucworICogICAgLSAyMDAyLzAyLzE4IEVyaWsgSGFiYmluZ2EgPGVyaWtfaGFiYmluZ2EgQCBocCBkb3QgY29tPiA6CisgKiAgICAgICAtIGlmcjIuaWZyX2ZsYWdzIHdhcyBub3QgaW5pdGlhbGl6ZWQgaW4gdGhlIGh3YWRkcl9ub3RzZXQgY2FzZSwKKyAqICAgICAgICAgU0lPQ0dJRkZMQUdTIG5vdyBjYWxsZWQgYmVmb3JlIGh3YWRkcl9ub3RzZXQgdGVzdAorICoKKyAqICAgIC0gMjAwMi8xMC8zMSBUb255IEN1cmVpbmd0b24gPHRvbnkuY3VyZWluZ3RvbiAqIGhwX2NvbT4gOgorICogICAgICAgLSBJZiB0aGUgbWFzdGVyIGRvZXMgbm90IGhhdmUgYSBoYXJkd2FyZSBhZGRyZXNzIHdoZW4gdGhlIGZpcnN0IHNsYXZlCisgKiAgICAgICAgIGlzIGVuc2xhdmVkLCB0aGUgbWFzdGVyIGlzIGFzc2lnbmVkIHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9mIHRoYXQKKyAqICAgICAgICAgc2xhdmUgLSB0aGVyZSBpcyBhIGNvbW1lbnQgaW4gYm9uZGluZy5jIHN0YXRpbmcgImlmZW5zbGF2ZSB0YWtlcworICogICAgICAgICBjYXJlIG9mIHRoaXMgbm93LiIgVGhpcyBjb3JyZWN0cyB0aGUgcHJvYmxlbSBvZiBzbGF2ZXMgaGF2aW5nCisgKiAgICAgICAgIGRpZmZlcmVudCBoYXJkd2FyZSBhZGRyZXNzZXMgaW4gYWN0aXZlLWJhY2t1cCBtb2RlIHdoZW4KKyAqICAgICAgICAgbXVsdGlwbGUgaW50ZXJmYWNlcyBhcmUgc3BlY2lmaWVkIG9uIGEgc2luZ2xlIGlmZW5zbGF2ZSBjb21tYW5kCisgKiAgICAgICAgIChpZmVuc2xhdmUgYm9uZDAgZXRoMCBldGgxKS4KKyAqCisgKiAgICAtIDIwMDMvMDMvMTggLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICogICAgICAgICAgICAgICAgICAgU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKiAgICAgICAtIE1vdmVkIHNldHRpbmcgdGhlIHNsYXZlJ3MgbWFjIGFkZHJlc3MgYW5kIG9wZW5uaW5nIGl0LCBmcm9tCisgKiAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgZHJpdmVyLiBUaGlzIGVuYWJsZXMgc3VwcG9ydCBvZiBtb2RlcworICogICAgICAgICB0aGF0IG5lZWQgdG8gdXNlIHRoZSB1bmlxdWUgbWFjIGFkZHJlc3Mgb2YgZWFjaCBzbGF2ZS4KKyAqICAgICAgICAgVGhlIGRyaXZlciBhbHNvIHRha2VzIGNhcmUgb2YgY2xvc2luZyB0aGUgc2xhdmUgYW5kIHJlc3RvcmluZyBpdHMKKyAqICAgICAgICAgb3JpZ2luYWwgbWFjIGFkZHJlc3MgdXBvbiByZWxlYXNlLgorICogICAgICAgICBJbiBhZGRpdGlvbiwgYmxvY2sgcG9zc2liaWxpdHkgb2YgZW5zbGF2aW5nIGJlZm9yZSB0aGUgbWFzdGVyIGlzIHVwLgorICogICAgICAgICBUaGlzIHByZXZlbnRzIHB1dHRpbmcgdGhlIHN5c3RlbSBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKgorICogICAgLSAyMDAzLzA1LzAxIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqICAgICAgIC0gQWRkZWQgQUJJIHZlcnNpb24gY29udHJvbCB0byByZXN0b3JlIGNvbXBhdGliaWxpdHkgYmV0d2VlbgorICogICAgICAgICBuZXcvb2xkIGlmZW5zbGF2ZSBhbmQgbmV3L29sZCBib25kaW5nLgorICogICAgICAgLSBQcmV2ZW50IGFkZGluZyBhbiBhZGFwdGVyIHRoYXQgaXMgYWxyZWFkeSBhIHNsYXZlLgorICogICAgICAgICBGaXhlcyB0aGUgcHJvYmxlbSBvZiBzdGFsbGluZyB0aGUgdHJhbnNtaXNzaW9uIGFuZCBsZWF2aW5nCisgKiAgICAgICAgIHRoZSBzbGF2ZSBpbiBhIGRvd24gc3RhdGUuCisgKgorICogICAgLSAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKiAgICAgICAtIFByZXZlbnQgZW5zbGF2aW5nIGlmIHRoZSBib25kIGRldmljZSBpcyBkb3duLgorICogICAgICAgICBGaXhlcyB0aGUgcHJvYmxlbSBvZiBsZWF2aW5nIHRoZSBzeXN0ZW0gaW4gdW5zdGFibGUgc3RhdGUgYW5kCisgKiAgICAgICAgIGhhbHRpbmcgd2hlbiB0cnlpbmcgdG8gcmVtb3ZlIHRoZSBtb2R1bGUuCisgKiAgICAgICAtIENsb3NlIHNvY2tldCBvbiBhbGwgYWJub3JtYWwgZXhpc3RzLgorICogICAgICAgLSBBZGQgdmVyc2lvbmluZyBzY2hlbWUgdGhhdCBmb2xsb3dzIHRoYXQgb2YgdGhlIGJvbmRpbmcgZHJpdmVyLgorICogICAgICAgICBjdXJyZW50IHZlcnNpb24gaXMgMS4wLjAgYXMgYSBiYXNlIGxpbmUuCisgKgorICogICAgLSAyMDAzLzA1LzIyIC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKiAgICAgICAtIGlmZW5zbGF2ZSAtYyB3YXMgYnJva2VuOyBpdCdzIG5vdyBmaXhlZAorICogICAgICAgLSBGaXhlZCBwcm9ibGVtIHdpdGggcm91dGVzIHZhbmlzaGluZyBmcm9tIG1hc3RlciBkdXJpbmcgZW5zbGF2ZQorICogICAgICAgICBwcm9jZXNzaW5nLgorICoKKyAqICAgIC0gMjAwMy8wNS8yNyAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKiAgICAgICAtIEZpeCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlczoKKyAqICAgICAgICAgRm9yIGRyaXZlcnMgbm90IHVzaW5nIEFCSSB2ZXJzaW9ucywgc2xhdmUgd2FzIHNldCBkb3duIHdoaWxlCisgKiAgICAgICAgIGl0IHNob3VsZCBiZSBsZWZ0IHVwIGJlZm9yZSBlbnNsYXZpbmcuCisgKiAgICAgICAgIEFsc28sIG1hc3RlciB3YXMgbm90IHNldCBkb3duIGFuZCB0aGUgZGVmYXVsdCBzZXRfbWFjX2FkZHJlc3MoKQorICogICAgICAgICB3b3VsZCBmYWlsIGFuZCBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBzeXN0ZW0gbG9nLgorICogICAgICAgLSBGb3Igb3B0X2M6IHNsYXZlIHNob3VsZCBub3QgYmUgc2V0IHRvIHRoZSBtYXN0ZXIncyBzZXR0aW5nCisgKiAgICAgICAgIHdoaWxlIGl0IGlzIHJ1bm5pbmcuIEl0IHdhcyBhbHJlYWR5IHNldCBkdXJpbmcgZW5zbGF2ZS4gVG8KKyAqICAgICAgICAgc2ltcGxpZnkgdGhpbmdzLCBpdCBpcyBub3cgaGFuZGVsZWQgc2VwYXJhdGVseS4KKyAqCisgKiAgICAtIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqICAgICAgIC0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKiAgICAgICAgIHNldCB2ZXJzaW9uIHRvIDEuMS4wCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlmZW5zbGF2ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZGZdIE1BU1RFUl9JRkFDRSBTTEFWRV9JRkFDRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBpZmVuc2xhdmVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb25maWd1cmUgbmV0d29yayBpbnRlcmZhY2VzIGZvciBwYXJhbGxlbCByb3V0aW5nXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jLC0tY2hhbmdlLWFjdGl2ZQlDaGFuZ2UgYWN0aXZlIHNsYXZlIgorLy91c2FnZTogICAgICJcbgktZCwtLWRldGFjaAkJUmVtb3ZlIHNsYXZlIGludGVyZmFjZSBmcm9tIGJvbmRpbmcgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgktZiwtLWZvcmNlCQlGb3JjZSwgZXZlbiBpZiBpbnRlcmZhY2UgaXMgbm90IEV0aGVybmV0IgorLyogLy91c2FnZTogICJcbgktciwtLXJlY2VpdmUtc2xhdmUJQ3JlYXRlIGEgcmVjZWl2ZS1vbmx5IHNsYXZlIiAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBpZmVuc2xhdmVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIlRvIGNyZWF0ZSBhIGJvbmQgZGV2aWNlLCBzaW1wbHkgZm9sbG93IHRoZXNlIHRocmVlIHN0ZXBzOlxuIgorLy91c2FnZTogICAgICAgIi0gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGRyaXZlcnMgYXJlIHByb3Blcmx5IGxvYWRlZDpcbiIKKy8vdXNhZ2U6ICAgICAgICIgICMgbW9kcHJvYmUgYm9uZGluZyA7IG1vZHByb2JlIDwzYzU5eHxlZXBybzEwMHxwY25ldDMyfHR1bGlwfC4uLj5cbiIKKy8vdXNhZ2U6ICAgICAgICItIGFzc2lnbiBhbiBJUCBhZGRyZXNzIHRvIHRoZSBib25kIGRldmljZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIgICMgaWZjb25maWcgYm9uZDAgPGFkZHI+IG5ldG1hc2sgPG1hc2s+IGJyb2FkY2FzdCA8YmNhc3Q+XG4iCisvL3VzYWdlOiAgICAgICAiLSBhdHRhY2ggYWxsIHRoZSBpbnRlcmZhY2VzIHlvdSBuZWVkIHRvIHRoZSBib25kIGRldmljZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIgICMgaWZlbnNsYXZlIGJvbmQwIGV0aDAgZXRoMSBldGgyXG4iCisvL3VzYWdlOiAgICAgICAiICBJZiBib25kMCBkaWRuJ3QgaGF2ZSBhIE1BQyBhZGRyZXNzLCBpdCB3aWxsIHRha2UgZXRoMCdzLiBUaGVuLCBhbGxcbiIKKy8vdXNhZ2U6ICAgICAgICIgIGludGVyZmFjZXMgYXR0YWNoZWQgQUZURVIgdGhpcyBhc3NpZ25tZW50IHdpbGwgZ2V0IHRoZSBzYW1lIE1BQyBhZGRyLlxuXG4iCisvL3VzYWdlOiAgICAgICAiICBUbyBkZXRhY2ggYSBkZWFkIGludGVyZmFjZSB3aXRob3V0IHNldHRpbmcgdGhlIGJvbmQgZGV2aWNlIGRvd246XG4iCisvL3VzYWdlOiAgICAgICAiICAjIGlmZW5zbGF2ZSAtZCBib25kMCBldGgxXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgIFRvIHNldCB0aGUgYm9uZCBkZXZpY2UgZG93biBhbmQgYXV0b21hdGljYWxseSByZWxlYXNlIGFsbCB0aGUgc2xhdmVzOlxuIgorLy91c2FnZTogICAgICAgIiAgIyBpZmNvbmZpZyBib25kMCBkb3duXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgIFRvIGNoYW5nZSBhY3RpdmUgc2xhdmU6XG4iCisvL3VzYWdlOiAgICAgICAiICAjIGlmZW5zbGF2ZSAtYyBib25kMCBldGgwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiAjaW5jbHVkZSA8bmV0L2lmLmg+IC0gbm8uIGxpbnV4L2lmX2JvbmRpbmcuaCBwdWxscyBpbiBsaW51eC9pZi5oICovCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKy8vI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4gLSBub3QgbmVlZGVkPworI2luY2x1ZGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSAiZml4X3UzMi5oIiAvKiBoYWNrLCBzbyB3ZSBtYXkgaW5jbHVkZSBrZXJuZWwncyBldGh0b29sLmggKi8KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaWZuZGVmIEJPTkRfQUJJX1ZFUlNJT04KKyMgZGVmaW5lIEJPTkRfQUJJX1ZFUlNJT04gMgorI2VuZGlmCisjaWZuZGVmIElGTkFNU0laCisjIGRlZmluZSBJRk5BTVNJWiAxNgorI2VuZGlmCisKKworc3RydWN0IGRldl9kYXRhIHsKKwlzdHJ1Y3QgaWZyZXEgbXR1LCBmbGFncywgaHdhZGRyOworfTsKKworCitlbnVtIHsgc2tmZCA9IDMgfTsgICAgICAvKiBBRl9JTkVUIHNvY2tldCBmb3IgaW9jdGwoKSBjYWxscy4gKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwl1bnNpZ25lZCBhYmlfdmVyOyAgICAgICAvKiB1c2VybGFuZCAtIGtlcm5lbCBBQkkgdmVyc2lvbiAqLworCXNtYWxsaW50IGh3YWRkcl9zZXQ7ICAgIC8qIE1hc3RlcidzIGh3YWRkciBpcyBzZXQgKi8KKwlzdHJ1Y3QgZGV2X2RhdGEgbWFzdGVyOworCXN0cnVjdCBkZXZfZGF0YSBzbGF2ZTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgYWJpX3ZlciAgICAoRy5hYmlfdmVyICAgKQorI2RlZmluZSBod2FkZHJfc2V0IChHLmh3YWRkcl9zZXQpCisjZGVmaW5lIG1hc3RlciAgICAgKEcubWFzdGVyICAgICkKKyNkZWZpbmUgc2xhdmUgICAgICAoRy5zbGF2ZSAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBOT0lOTElORXMgYXJlIHBsYWNlZCB3aGVyZSBpdCByZXN1bHRzIGluIHNtYWxsZXIgY29kZSAoZ2NjIDQuMy4xKSAqLworCitzdGF0aWMgaW50IGlvY3RsX29uX3NrZmQodW5zaWduZWQgcmVxdWVzdCwgc3RydWN0IGlmcmVxICppZnIpCit7CisJcmV0dXJuIGlvY3RsKHNrZmQsIHJlcXVlc3QsIGlmcik7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKHVuc2lnbmVkIHJlcXVlc3QsIHN0cnVjdCBpZnJlcSAqaWZyLCBjb25zdCBjaGFyICppZm5hbWUpCit7CisJc3RybmNweV9JRk5BTVNJWihpZnItPmlmcl9uYW1lLCBpZm5hbWUpOworCXJldHVybiBpb2N0bF9vbl9za2ZkKHJlcXVlc3QsIGlmcik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2lmX3NldHRpbmdzKGNoYXIgKmlmbmFtZSwgc3RydWN0IGRldl9kYXRhICpkZCkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NHSUZNVFUsICZkZC0+bXR1LCBpZm5hbWUpOworCXJlcyB8PSBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0dJRkZMQUdTLCAmZGQtPmZsYWdzLCBpZm5hbWUpOworCXJlcyB8PSBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0dJRkhXQUREUiwgJmRkLT5od2FkZHIsIGlmbmFtZSk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGdldF9zbGF2ZV9mbGFncyhjaGFyICpzbGF2ZV9pZm5hbWUpCit7CisJcmV0dXJuIHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DR0lGRkxBR1MsICZzbGF2ZS5mbGFncywgc2xhdmVfaWZuYW1lKTsKK30KKworc3RhdGljIGludCBzZXRfaHdhZGRyKGNoYXIgKmlmbmFtZSwgc3RydWN0IHNvY2thZGRyICpod2FkZHIpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCW1lbWNweSgmKGlmci5pZnJfaHdhZGRyKSwgaHdhZGRyLCBzaXplb2YoKmh3YWRkcikpOworCXJldHVybiBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ1NJRkhXQUREUiwgJmlmciwgaWZuYW1lKTsKK30KKworc3RhdGljIGludCBzZXRfbXR1KGNoYXIgKmlmbmFtZSwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJaWZyLmlmcl9tdHUgPSBtdHU7CisJcmV0dXJuIHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DU0lGTVRVLCAmaWZyLCBpZm5hbWUpOworfQorCitzdGF0aWMgaW50IHNldF9pZl9mbGFncyhjaGFyICppZm5hbWUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJaWZyLmlmcl9mbGFncyA9IGZsYWdzOworCXJldHVybiBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ1NJRkZMQUdTLCAmaWZyLCBpZm5hbWUpOworfQorCitzdGF0aWMgaW50IHNldF9pZl91cChjaGFyICppZm5hbWUsIGludCBmbGFncykKK3sKKwlpbnQgcmVzID0gc2V0X2lmX2ZsYWdzKGlmbmFtZSwgZmxhZ3MgfCBJRkZfVVApOworCWlmIChyZXMpCisJCWJiX3BlcnJvcl9tc2coIiVzOiBjYW4ndCB1cCIsIGlmbmFtZSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBzZXRfaWZfZG93bihjaGFyICppZm5hbWUsIGludCBmbGFncykKK3sKKwlpbnQgcmVzID0gc2V0X2lmX2ZsYWdzKGlmbmFtZSwgZmxhZ3MgJiB+SUZGX1VQKTsKKwlpZiAocmVzKQorCQliYl9wZXJyb3JfbXNnKCIlczogY2FuJ3QgZG93biIsIGlmbmFtZSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBjbGVhcl9pZl9hZGRyKGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJaWZyLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJbWVtc2V0KGlmci5pZnJfYWRkci5zYV9kYXRhLCAwLCBzaXplb2YoaWZyLmlmcl9hZGRyLnNhX2RhdGEpKTsKKwlyZXR1cm4gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NTSUZBRERSLCAmaWZyLCBpZm5hbWUpOworfQorCitzdGF0aWMgaW50IHNldF9pZl9hZGRyKGNoYXIgKm1hc3Rlcl9pZm5hbWUsIGNoYXIgKnNsYXZlX2lmbmFtZSkKK3sKKyNpZiAoU0lPQ0dJRkFERFIgfCBTSU9DU0lGQUREUiBcCisgIHwgU0lPQ0dJRkRTVEFERFIgfCBTSU9DU0lGRFNUQUREUiBcCisgIHwgU0lPQ0dJRkJSREFERFIgfCBTSU9DU0lGQlJEQUREUiBcCisgIHwgU0lPQ0dJRk5FVE1BU0sgfCBTSU9DU0lGTkVUTUFTSykgPD0gMHhmZmZmCisjZGVmaW5lIElOVCB1aW50MTZfdAorI2Vsc2UKKyNkZWZpbmUgSU5UIGludAorI2VuZGlmCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCUlOVCBnX2lvY3RsOworCQlJTlQgc19pb2N0bDsKKwl9IGlmcmFbXSA9IHsKKwkJeyBTSU9DR0lGQUREUiwgICAgU0lPQ1NJRkFERFIgICAgfSwKKwkJeyBTSU9DR0lGRFNUQUREUiwgU0lPQ1NJRkRTVEFERFIgfSwKKwkJeyBTSU9DR0lGQlJEQUREUiwgU0lPQ1NJRkJSREFERFIgfSwKKwkJeyBTSU9DR0lGTkVUTUFTSywgU0lPQ1NJRk5FVE1BU0sgfSwKKwl9OworCisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgcmVzOworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZnJhKTsgaSsrKSB7CisJCXJlcyA9IHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChpZnJhW2ldLmdfaW9jdGwsICZpZnIsIG1hc3Rlcl9pZm5hbWUpOworCQlpZiAocmVzIDwgMCkgeworCQkJaWZyLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJCQltZW1zZXQoaWZyLmlmcl9hZGRyLnNhX2RhdGEsIDAsCisJCQkgICAgICAgc2l6ZW9mKGlmci5pZnJfYWRkci5zYV9kYXRhKSk7CisJCX0KKworCQlyZXMgPSBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoaWZyYVtpXS5zX2lvY3RsLCAmaWZyLCBzbGF2ZV9pZm5hbWUpOworCQlpZiAocmVzIDwgMCkKKwkJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9hY3RpdmUoY2hhciAqbWFzdGVyX2lmbmFtZSwgY2hhciAqc2xhdmVfaWZuYW1lKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlpZiAoIShzbGF2ZS5mbGFncy5pZnJfZmxhZ3MgJiBJRkZfU0xBVkUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBpcyBub3QgYSBzbGF2ZSIsIHNsYXZlX2lmbmFtZSk7CisJfQorCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX3NsYXZlLCBzbGF2ZV9pZm5hbWUpOworCWlmIChzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0JPTkRDSEFOR0VBQ1RJVkUsICZpZnIsIG1hc3Rlcl9pZm5hbWUpCisJICYmIGlvY3RsX29uX3NrZmQoQk9ORF9DSEFOR0VfQUNUSVZFX09MRCwgJmlmcikKKwkpIHsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKAorCQkJIm1hc3RlciAlcywgc2xhdmUgJXM6IGNhbid0ICIKKwkJCSJjaGFuZ2UgYWN0aXZlIiwKKwkJCW1hc3Rlcl9pZm5hbWUsIHNsYXZlX2lmbmFtZSk7CisJfQorfQorCitzdGF0aWMgTk9JTkxJTkUgaW50IGVuc2xhdmUoY2hhciAqbWFzdGVyX2lmbmFtZSwgY2hhciAqc2xhdmVfaWZuYW1lKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHJlczsKKworCWlmIChzbGF2ZS5mbGFncy5pZnJfZmxhZ3MgJiBJRkZfU0xBVkUpIHsKKwkJYmJfZXJyb3JfbXNnKAorCQkJIiVzIGlzIGFscmVhZHkgYSBzbGF2ZSIsCisJCQlzbGF2ZV9pZm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXMgPSBzZXRfaWZfZG93bihzbGF2ZV9pZm5hbWUsIHNsYXZlLmZsYWdzLmlmcl9mbGFncyk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWlmIChhYmlfdmVyIDwgMikgeworCQkvKiBPbGRlciBib25kaW5nIHZlcnNpb25zIHdvdWxkIHBhbmljIGlmIHRoZSBzbGF2ZSBoYXMgbm8gSVAKKwkJICogYWRkcmVzcywgc28gZ2V0IHRoZSBJUCBzZXR0aW5nIGZyb20gdGhlIG1hc3Rlci4KKwkJICovCisJCXJlcyA9IHNldF9pZl9hZGRyKG1hc3Rlcl9pZm5hbWUsIHNsYXZlX2lmbmFtZSk7CisJCWlmIChyZXMpIHsKKwkJCWJiX3BlcnJvcl9tc2coIiVzOiBjYW4ndCBzZXQgYWRkcmVzcyIsIHNsYXZlX2lmbmFtZSk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfSBlbHNlIHsKKwkJcmVzID0gY2xlYXJfaWZfYWRkcihzbGF2ZV9pZm5hbWUpOworCQlpZiAocmVzKSB7CisJCQliYl9wZXJyb3JfbXNnKCIlczogY2FuJ3QgY2xlYXIgYWRkcmVzcyIsIHNsYXZlX2lmbmFtZSk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCisJaWYgKG1hc3Rlci5tdHUuaWZyX210dSAhPSBzbGF2ZS5tdHUuaWZyX210dSkgeworCQlyZXMgPSBzZXRfbXR1KHNsYXZlX2lmbmFtZSwgbWFzdGVyLm10dS5pZnJfbXR1KTsKKwkJaWYgKHJlcykgeworCQkJYmJfcGVycm9yX21zZygiJXM6IGNhbid0IHNldCBNVFUiLCBzbGF2ZV9pZm5hbWUpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKworCWlmIChod2FkZHJfc2V0KSB7CisJCS8qIE1hc3RlciBhbHJlYWR5IGhhcyBhbiBod2FkZHIKKwkJICogc28gc2V0IGl0J3MgaHdhZGRyIHRvIHRoZSBzbGF2ZQorCQkgKi8KKwkJaWYgKGFiaV92ZXIgPCAxKSB7CisJCQkvKiBUaGUgZHJpdmVyIGlzIHVzaW5nIGFuIG9sZCBBQkksIHNvCisJCQkgKiB0aGUgYXBwbGljYXRpb24gc2V0cyB0aGUgc2xhdmUncworCQkJICogaHdhZGRyCisJCQkgKi8KKwkJCWlmIChzZXRfaHdhZGRyKHNsYXZlX2lmbmFtZSwgJihtYXN0ZXIuaHdhZGRyLmlmcl9od2FkZHIpKSkgeworCQkJCWJiX3BlcnJvcl9tc2coIiVzOiBjYW4ndCBzZXQgaHcgYWRkcmVzcyIsCisJCQkJCQlzbGF2ZV9pZm5hbWUpOworCQkJCWdvdG8gdW5kb19tdHU7CisJCQl9CisKKwkJCS8qIEZvciBvbGQgQUJJIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBicmluZyB0aGUKKwkJCSAqIHNsYXZlIGJhY2sgdXAKKwkJCSAqLworCQkJaWYgKHNldF9pZl91cChzbGF2ZV9pZm5hbWUsIHNsYXZlLmZsYWdzLmlmcl9mbGFncykpCisJCQkJZ290byB1bmRvX3NsYXZlX21hYzsKKwkJfQorCQkvKiBUaGUgZHJpdmVyIGlzIHVzaW5nIGEgbmV3IEFCSSwKKwkJICogc28gdGhlIGRyaXZlciB0YWtlcyBjYXJlIG9mIHNldHRpbmcKKwkJICogdGhlIHNsYXZlJ3MgaHdhZGRyIGFuZCBicmluZ2luZworCQkgKiBpdCB1cCBhZ2FpbgorCQkgKi8KKwl9IGVsc2UgeworCQkvKiBObyBod2FkZHIgZm9yIG1hc3RlciB5ZXQsIHNvCisJCSAqIHNldCB0aGUgc2xhdmUncyBod2FkZHIgdG8gaXQKKwkJICovCisJCWlmIChhYmlfdmVyIDwgMSkgeworCQkJLyogRm9yIG9sZCBBQkksIHRoZSBtYXN0ZXIgbmVlZHMgdG8gYmUKKwkJCSAqIGRvd24gYmVmb3JlIHNldHRpbmcgaXQncyBod2FkZHIKKwkJCSAqLworCQkJaWYgKHNldF9pZl9kb3duKG1hc3Rlcl9pZm5hbWUsIG1hc3Rlci5mbGFncy5pZnJfZmxhZ3MpKQorCQkJCWdvdG8gdW5kb19tdHU7CisJCX0KKworCQlpZiAoc2V0X2h3YWRkcihtYXN0ZXJfaWZuYW1lLCAmKHNsYXZlLmh3YWRkci5pZnJfaHdhZGRyKSkpIHsKKwkJCWJiX2Vycm9yX21zZygiJXM6IGNhbid0IHNldCBodyBhZGRyZXNzIiwKKwkJCQltYXN0ZXJfaWZuYW1lKTsKKwkJCWdvdG8gdW5kb19tdHU7CisJCX0KKworCQlpZiAoYWJpX3ZlciA8IDEpIHsKKwkJCS8qIEZvciBvbGQgQUJJLCBicmluZyB0aGUgbWFzdGVyCisJCQkgKiBiYWNrIHVwCisJCQkgKi8KKwkJCWlmIChzZXRfaWZfdXAobWFzdGVyX2lmbmFtZSwgbWFzdGVyLmZsYWdzLmlmcl9mbGFncykpCisJCQkJZ290byB1bmRvX21hc3Rlcl9tYWM7CisJCX0KKworCQlod2FkZHJfc2V0ID0gMTsKKwl9CisKKwkvKiBEbyB0aGUgcmVhbCB0aGluZyAqLworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9zbGF2ZSwgc2xhdmVfaWZuYW1lKTsKKwlpZiAoc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NCT05ERU5TTEFWRSwgJmlmciwgbWFzdGVyX2lmbmFtZSkKKwkgJiYgaW9jdGxfb25fc2tmZChCT05EX0VOU0xBVkVfT0xELCAmaWZyKQorCSkgeworCQlnb3RvIHVuZG9fbWFzdGVyX21hYzsKKwl9CisKKwlyZXR1cm4gMDsKKworLyogcm9sbGJhY2sgKGJlc3QgZWZmb3J0KSAqLworIHVuZG9fbWFzdGVyX21hYzoKKwlzZXRfaHdhZGRyKG1hc3Rlcl9pZm5hbWUsICYobWFzdGVyLmh3YWRkci5pZnJfaHdhZGRyKSk7CisJaHdhZGRyX3NldCA9IDA7CisJZ290byB1bmRvX210dTsKKworIHVuZG9fc2xhdmVfbWFjOgorCXNldF9od2FkZHIoc2xhdmVfaWZuYW1lLCAmKHNsYXZlLmh3YWRkci5pZnJfaHdhZGRyKSk7CisgdW5kb19tdHU6CisJc2V0X210dShzbGF2ZV9pZm5hbWUsIHNsYXZlLm10dS5pZnJfbXR1KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCByZWxlYXNlKGNoYXIgKm1hc3Rlcl9pZm5hbWUsIGNoYXIgKnNsYXZlX2lmbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCByZXMgPSAwOworCisJaWYgKCEoc2xhdmUuZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX1NMQVZFKSkgeworCQliYl9lcnJvcl9tc2coIiVzIGlzIG5vdCBhIHNsYXZlIiwgc2xhdmVfaWZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX3NsYXZlLCBzbGF2ZV9pZm5hbWUpOworCWlmIChzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0JPTkRSRUxFQVNFLCAmaWZyLCBtYXN0ZXJfaWZuYW1lKSA8IDAKKwkgJiYgaW9jdGxfb25fc2tmZChCT05EX1JFTEVBU0VfT0xELCAmaWZyKSA8IDAKKwkpIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChhYmlfdmVyIDwgMSkgeworCQkvKiBUaGUgZHJpdmVyIGlzIHVzaW5nIGFuIG9sZCBBQkksIHNvIHdlJ2xsIHNldCB0aGUgaW50ZXJmYWNlCisJCSAqIGRvd24gdG8gYXZvaWQgYW55IGNvbmZsaWN0cyBkdWUgdG8gc2FtZSBNQUMvSVAKKwkJICovCisJCXJlcyA9IHNldF9pZl9kb3duKHNsYXZlX2lmbmFtZSwgc2xhdmUuZmxhZ3MuaWZyX2ZsYWdzKTsKKwl9CisKKwkvKiBzZXQgdG8gZGVmYXVsdCBtdHUgKi8KKwlzZXRfbXR1KHNsYXZlX2lmbmFtZSwgMTUwMCk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBnZXRfZHJ2X2luZm8oY2hhciAqbWFzdGVyX2lmbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJaWZyLmlmcl9kYXRhID0gKGNhZGRyX3QpJmluZm87CisJaW5mby5jbWQgPSBFVEhUT09MX0dEUlZJTkZPOworCS8qIGJvdGggZmllbGRzIGFyZSAzMiBieXRlcyBsb25nIChsb25nIGVub3VnaCkgKi8KKwlzdHJjcHkoaW5mby5kcml2ZXIsICJpZmVuc2xhdmUiKTsKKwlzdHJjcHkoaW5mby5md192ZXJzaW9uLCB1dG9hKEJPTkRfQUJJX1ZFUlNJT04pKTsKKwlpZiAoc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NFVEhUT09MLCAmaWZyLCBtYXN0ZXJfaWZuYW1lKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVPUE5PVFNVUFApCisJCQlyZXR1cm47CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXM6IFNJT0NFVEhUT09MIGVycm9yIiwgbWFzdGVyX2lmbmFtZSk7CisJfQorCisJYWJpX3ZlciA9IGJiX3N0cnRvdShpbmZvLmZ3X3ZlcnNpb24sIE5VTEwsIDApOworCWlmIChlcnJubykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBTSU9DRVRIVE9PTCBlcnJvciIsIG1hc3Rlcl9pZm5hbWUpOworfQorCitpbnQgaWZlbnNsYXZlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpZmVuc2xhdmVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm1hc3Rlcl9pZm5hbWUsICpzbGF2ZV9pZm5hbWU7CisJaW50IHJ2OworCWludCByZXM7CisJdW5zaWduZWQgb3B0OworCWVudW0geworCQlPUFRfYyA9ICgxIDw8IDApLAorCQlPUFRfZCA9ICgxIDw8IDEpLAorCQlPUFRfZiA9ICgxIDw8IDIpLAorCX07CisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIGlmZW5zbGF2ZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJjaGFuZ2UtYWN0aXZlXDAiICBOb19hcmd1bWVudCAiYyIKKwkJImRldGFjaFwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICJkIgorCQkiZm9yY2VcMCIgICAgICAgICAgTm9fYXJndW1lbnQgImYiCisJCS8qICJhbGwtaW50ZXJmYWNlc1wwIiBOb19hcmd1bWVudCAiYSIgKi8KKwkJOworCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGlmZW5zbGF2ZV9sb25nb3B0czsKKyNlbmRpZgorCUlOSVRfRygpOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNkZmEiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgKG9wdC0xKSkgLyogT25seSBvbmUgb3B0aW9uIGNhbiBiZSBnaXZlbiAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKwltYXN0ZXJfaWZuYW1lID0gKmFyZ3YrKzsKKworCS8qIE5vIGludGVyZmFjZSBuYW1lcyAtIHNob3cgYWxsIGludGVyZmFjZXMuICovCisJaWYgKCFtYXN0ZXJfaWZuYW1lKSB7CisJCWRpc3BsYXlfaW50ZXJmYWNlcyhOVUxMKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBPcGVuIGEgYmFzaWMgc29ja2V0ICovCisJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSwgc2tmZCk7CisKKwkvKiBFeGNoYW5nZSBhYmkgdmVyc2lvbiB3aXRoIGJvbmRpbmcgbW9kdWxlICovCisJZ2V0X2Rydl9pbmZvKG1hc3Rlcl9pZm5hbWUpOworCisJc2xhdmVfaWZuYW1lID0gKmFyZ3YrKzsKKwlpZiAoIXNsYXZlX2lmbmFtZSkgeworCQlpZiAob3B0ICYgKE9QVF9kfE9QVF9jKSkgeworCQkJLyogLS1jaGFuZ2Ugb3IgLS1kZXRhY2gsIGFuZCBubyBzbGF2ZXMgZ2l2ZW4gLQorCQkJICogc2hvdyBhbGwgaW50ZXJmYWNlcy4gKi8KKwkJCWRpc3BsYXlfaW50ZXJmYWNlcyhzbGF2ZV9pZm5hbWUgLyogPT0gTlVMTCAqLyk7CisJCQlyZXR1cm4gMjsgLyogd2h5IDI/ICovCisJCX0KKwkJLyogQSBzaW5nbGUgYXJnIG1lYW5zIHNob3cgdGhlCisJCSAqIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlCisJCSAqLworCQlkaXNwbGF5X2ludGVyZmFjZXMobWFzdGVyX2lmbmFtZSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJaWYgKGdldF9pZl9zZXR0aW5ncyhtYXN0ZXJfaWZuYW1lLCAmbWFzdGVyKSkgeworCQkvKiBQcm9iYWJseSBhIGdvb2QgcmVhc29uIG5vdCB0byBnbyBvbiAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBjYW4ndCBnZXQgc2V0dGluZ3MiLCBtYXN0ZXJfaWZuYW1lKTsKKwl9CisKKwkvKiBDaGVjayBpZiBtYXN0ZXIgaXMgaW5kZWVkIGEgbWFzdGVyOworCSAqIGlmIG5vdCB0aGVuIGZhaWwgYW55IG9wZXJhdGlvbgorCSAqLworCWlmICghKG1hc3Rlci5mbGFncy5pZnJfZmxhZ3MgJiBJRkZfTUFTVEVSKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGlzIG5vdCBhIG1hc3RlciIsIG1hc3Rlcl9pZm5hbWUpOworCisJLyogQ2hlY2sgaWYgbWFzdGVyIGlzIHVwOyBpZiBub3QgdGhlbiBmYWlsIGFueSBvcGVyYXRpb24gKi8KKwlpZiAoIShtYXN0ZXIuZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX1VQKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGlzIG5vdCB1cCIsIG1hc3Rlcl9pZm5hbWUpOworCisjaWZkZWYgV0hZX0JPVEhFUgorCS8qIE5laXRoZXIgLWNbaGFuZ2VdIG5vciAtZFtldGFjaF0gLT4gaXQncyAiZW5zbGF2ZSIgdGhlbjsKKwkgKiBhbmQgLWZbb3JjZV0gaXMgbm90IHRoZXJlIHRvby4gQ2hlY2sgdGhhdCBpdCdzIGV0aGVybmV0LiAqLworCWlmICghKG9wdCAmIChPUFRfZHxPUFRfY3xPUFRfZikpIHsKKwkJLyogVGhlIGZhbWlseSAnMScgaXMgQVJQSFJEX0VUSEVSIGZvciBldGhlcm5ldC4gKi8KKwkJaWYgKG1hc3Rlci5od2FkZHIuaWZyX2h3YWRkci5zYV9mYW1pbHkgIT0gMSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIiVzIGlzIG5vdCBldGhlcm5ldC1saWtlICgtZiBvdmVycmlkZXMpIiwKKwkJCQltYXN0ZXJfaWZuYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogQWNjZXB0cyBvbmx5IG9uZSBzbGF2ZSAqLworCWlmIChvcHQgJiBPUFRfYykgeworCQkvKiBDaGFuZ2UgYWN0aXZlIHNsYXZlICovCisJCWlmIChnZXRfc2xhdmVfZmxhZ3Moc2xhdmVfaWZuYW1lKSkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKAorCQkJCSIlczogY2FuJ3QgZ2V0IGZsYWdzIiwgc2xhdmVfaWZuYW1lKTsKKwkJfQorCQljaGFuZ2VfYWN0aXZlKG1hc3Rlcl9pZm5hbWUsIHNsYXZlX2lmbmFtZSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogQWNjZXB0cyBtdWx0aXBsZSBzbGF2ZXMgKi8KKwlyZXMgPSAwOworCWRvIHsKKwkJaWYgKG9wdCAmIE9QVF9kKSB7CisJCQkvKiBEZXRhY2ggYSBzbGF2ZSBpbnRlcmZhY2UgZnJvbSB0aGUgbWFzdGVyICovCisJCQlydiA9IGdldF9zbGF2ZV9mbGFncyhzbGF2ZV9pZm5hbWUpOworCQkJaWYgKHJ2KSB7CisJCQkJLyogQ2FuJ3Qgd29yayB3aXRoIHRoaXMgc2xhdmUsICovCisJCQkJLyogcmVtZW1iZXIgdGhlIGVycm9yIGFuZCBza2lwIGl0ICovCisJCQkJYmJfcGVycm9yX21zZygKKwkJCQkJInNraXBwaW5nICVzOiBjYW4ndCBnZXQgZmxhZ3MiLAorCQkJCQlzbGF2ZV9pZm5hbWUpOworCQkJCXJlcyA9IHJ2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcnYgPSByZWxlYXNlKG1hc3Rlcl9pZm5hbWUsIHNsYXZlX2lmbmFtZSk7CisJCQlpZiAocnYpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZWxlYXNlICVzIGZyb20gJXMiLAorCQkJCQlzbGF2ZV9pZm5hbWUsIG1hc3Rlcl9pZm5hbWUpOworCQkJCXJlcyA9IHJ2OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQXR0YWNoIGEgc2xhdmUgaW50ZXJmYWNlIHRvIHRoZSBtYXN0ZXIgKi8KKwkJCXJ2ID0gZ2V0X2lmX3NldHRpbmdzKHNsYXZlX2lmbmFtZSwgJnNsYXZlKTsKKwkJCWlmIChydikgeworCQkJCS8qIENhbid0IHdvcmsgd2l0aCB0aGlzIHNsYXZlLCAqLworCQkJCS8qIHJlbWVtYmVyIHRoZSBlcnJvciBhbmQgc2tpcCBpdCAqLworCQkJCWJiX3BlcnJvcl9tc2coCisJCQkJCSJza2lwcGluZyAlczogY2FuJ3QgZ2V0IHNldHRpbmdzIiwKKwkJCQkJc2xhdmVfaWZuYW1lKTsKKwkJCQlyZXMgPSBydjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJ2ID0gZW5zbGF2ZShtYXN0ZXJfaWZuYW1lLCBzbGF2ZV9pZm5hbWUpOworCQkJaWYgKHJ2KSB7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgZW5zbGF2ZSAlcyB0byAlcyIsCisJCQkJCXNsYXZlX2lmbmFtZSwgbWFzdGVyX2lmbmFtZSk7CisJCQkJcmVzID0gcnY7CisJCQl9CisJCX0KKwl9IHdoaWxlICgoc2xhdmVfaWZuYW1lID0gKmFyZ3YrKykgIT0gTlVMTCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2Uoc2tmZCk7CisJfQorCisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaWZwbHVnZC5jIGIvbmV0d29ya2luZy9pZnBsdWdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzNThjZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaWZwbHVnZC5jCkBAIC0wLDAgKzEsNzM5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBpZnBsdWdkIGZvciBidXN5Ym94LCBiYXNlZCBvbiBpZnBsdWdkIDAuMjggKHdyaXR0ZW4gYnkgTGVubmFydCBQb2V0dGVyaW5nKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFrc3ltIEtyeXpoYW5vdnNreXkgPHhtYWtzQGVtYWlsLmN6PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlmcGx1Z2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSBpZnBsdWdkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTmV0d29yayBpbnRlcmZhY2UgcGx1ZyBkZXRlY3Rpb24gZGFlbW9uXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCQlEb24ndCBkYWVtb25pemUiCisvL3VzYWdlOiAgICAgIlxuCS1zCQlEb24ndCBsb2cgdG8gc3lzbG9nIgorLy91c2FnZTogICAgICJcbgktaSBJRkFDRQlJbnRlcmZhY2UiCisvL3VzYWdlOiAgICAgIlxuCS1mLy1GCQlUcmVhdCBsaW5rIGRldGVjdGlvbiBlcnJvciBhcyBsaW5rIGRvd24vbGluayB1cCIKKy8vdXNhZ2U6ICAgICAiXG4JCQkob3RoZXJ3aXNlIGV4aXQgb24gZXJyb3IpIgorLy91c2FnZTogICAgICJcbgktYQkJRG9uJ3QgdXAgaW50ZXJmYWNlIGF0IGVhY2ggbGluayBwcm9iZSIKKy8vdXNhZ2U6ICAgICAiXG4JLU0JCU1vbml0b3IgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gb2YgaW50ZXJmYWNlIgorLy91c2FnZTogICAgICJcbgkJCShvdGhlcndpc2UgaXQgbXVzdCBleGlzdCkiCisvL3VzYWdlOiAgICAgIlxuCS1yIFBST0cJCVNjcmlwdCB0byBydW4iCisvL3VzYWdlOiAgICAgIlxuCS14IEFSRwkJRXh0cmEgYXJndW1lbnQgZm9yIHNjcmlwdCIKKy8vdXNhZ2U6ICAgICAiXG4JLUkJCURvbid0IGV4aXQgb24gbm9uemVybyBleGl0IGNvZGUgZnJvbSBzY3JpcHQiCisvL3VzYWdlOiAgICAgIlxuCS1wCQlEb24ndCBydW4gc2NyaXB0IG9uIGRhZW1vbiBzdGFydHVwIgorLy91c2FnZTogICAgICJcbgktcQkJRG9uJ3QgcnVuIHNjcmlwdCBvbiBkYWVtb24gcXVpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJCVJ1biBzY3JpcHQgb24gc3RhcnR1cCBldmVuIGlmIG5vIGNhYmxlIGlzIGRldGVjdGVkIgorLy91c2FnZTogICAgICJcbgktdCBTRUNTCQlQb2xsIHRpbWUgaW4gc2Vjb25kcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgU0VDUwkJRGVsYXkgYmVmb3JlIHJ1bm5pbmcgc2NyaXB0IGFmdGVyIGxpbmsgdXAiCisvL3VzYWdlOiAgICAgIlxuCS1kIFNFQ1MJCURlbGF5IGFmdGVyIGxpbmsgZG93biIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQkJQVBJIG1vZGUgKG1paSwgcHJpdiwgZXRodG9vbCwgd2xhbiwgaWZmLCBhdXRvKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJCUtpbGwgcnVubmluZyBkYWVtb24iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaW5jbHVkZSAiZml4X3UzMi5oIgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2lmZGVmIEhBVkVfTkVUX0VUSEVSTkVUX0gKKyMgaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjZGVmaW5lIF9fdXNlcgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKy8qCitGcm9tIGluaXRpYWwgcG9ydCB0byBidXN5Ym94LCByZW1vdmVkIG1vc3Qgb2YgdGhlIHJlZHVuZGFuY3kgYnkKK2NvbnZlcnRpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBwb2x5bW9ycGhpYyBpbnRlcmZhY2UgdG8gdGhlIHN0cmljdAorZnVuY3Rpb25hbCBzdHlsZS4gVGhlIG1haW4gcm9sZSBpcyBydW4gYSBzY3JpcHQgd2hlbiBsaW5rIHN0YXRlCitjaGFuZ2VkLCBvdGhlciBhY3Rpdml0aWVzIGxpa2UgYXVkaW8gc2lnbmFsIG9yIGRldGFpbGVkIHJlcG9ydHMKK2FyZSBvbiB0aGUgc2NyaXB0IGl0c2VsZi4KKworT25lIHF1ZXN0aW9uYWJsZSBwb2ludCBvZiB0aGUgZGVzaWduIGlzIG5ldGxpbmsgdXNhZ2U6CisKK1dlIGhhdmUgMSBzZWNvbmQgdGltZW91dCBieSBkZWZhdWx0IHRvIHBvbGwgdGhlIGxpbmsgc3RhdHVzLAoraXQgaXMgc2hvcnQgZW5vdWdoIHNvIHRoYXQgdGhlcmUgYXJlIG5vIHJlYWwgYmVuZWZpdHMgaW4KK3VzaW5nIG5ldGxpbmsgdG8gZ2V0ICJpbnN0YW50YW5lb3VzIiBpbnRlcmZhY2UgY3JlYXRpb24vZGVsZXRpb24KK25vdGlmaWNhdGlvbnMuIFdlIGNhbiBjaGVjayBmb3IgaW50ZXJmYWNlIGV4aXN0ZW5jZSBieSBqdXN0Citkb2luZyBzb21lIGZhc3QgaW9jdGwgdXNpbmcgaXRzIG5hbWUuCisKK05ldGxpbmsgY29kZSB0aGVuIGNhbiBiZSBqdXN0IGRyb3BwZWQgKDFrIG9yIG1vcmU/KQorKi8KKworCisjZGVmaW5lIElGUExVR0RfRU5WX1BSRVZJT1VTICJJRlBMVUdEX1BSRVZJT1VTIgorI2RlZmluZSBJRlBMVUdEX0VOVl9DVVJSRU5UICJJRlBMVUdEX0NVUlJFTlQiCisKK2VudW0geworCUZMQUdfTk9fQVVUTwkJCT0gMSA8PCAgMCwgLy8gLWEsIERvIG5vdCBlbmFibGUgaW50ZXJmYWNlIGF1dG9tYXRpY2FsbHkKKwlGTEFHX05PX0RBRU1PTgkJCT0gMSA8PCAgMSwgLy8gLW4sIERvIG5vdCBkYWVtb25pemUKKwlGTEFHX05PX1NZU0xPRwkJCT0gMSA8PCAgMiwgLy8gLXMsIERvIG5vdCB1c2Ugc3lzbG9nLCB1c2Ugc3RkZXJyIGluc3RlYWQKKwlGTEFHX0lHTk9SRV9GQUlMCQk9IDEgPDwgIDMsIC8vIC1mLCBJZ25vcmUgZGV0ZWN0aW9uIGZhaWx1cmUsIHJldHJ5IGluc3RlYWQgKGZhaWx1cmUgaXMgdHJlYXRlZCBhcyBET1dOKQorCUZMQUdfSUdOT1JFX0ZBSUxfUE9TSVRJVkUJPSAxIDw8ICA0LCAvLyAtRiwgSWdub3JlIGRldGVjdGlvbiBmYWlsdXJlLCByZXRyeSBpbnN0ZWFkIChmYWlsdXJlIGlzIHRyZWF0ZWQgYXMgVVApCisJRkxBR19JRkFDRQkJCT0gMSA8PCAgNSwgLy8gLWksIFNwZWNpZnkgZXRoZXJuZXQgaW50ZXJmYWNlCisJRkxBR19SVU4JCQk9IDEgPDwgIDYsIC8vIC1yLCBTcGVjaWZ5IHByb2dyYW0gdG8gZXhlY3V0ZQorCUZMQUdfSUdOT1JFX1JFVFZBTAkJPSAxIDw8ICA3LCAvLyAtSSwgRG9uJ3QgZXhpdCBvbiBub256ZXJvIHJldHVybiB2YWx1ZSBvZiBwcm9ncmFtIGV4ZWN1dGVkCisJRkxBR19QT0xMX1RJTUUJCQk9IDEgPDwgIDgsIC8vIC10LCBTcGVjaWZ5IHBvbGwgdGltZSBpbiBzZWNvbmRzCisJRkxBR19ERUxBWV9VUAkJCT0gMSA8PCAgOSwgLy8gLXUsIFNwZWNpZnkgZGVsYXkgZm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZQorCUZMQUdfREVMQVlfRE9XTgkJCT0gMSA8PCAxMCwgLy8gLWQsIFNwZWNpZnkgZGVsYXkgZm9yIGRlY29uZmlndXJpbmcgaW50ZXJmYWNlCisJRkxBR19BUElfTU9ERQkJCT0gMSA8PCAxMSwgLy8gLW0sIEZvcmNlIEFQSSBtb2RlIChtaWksIHByaXYsIGV0aHRvb2wsIHdsYW4sIGF1dG8pCisJRkxBR19OT19TVEFSVFVQCQkJPSAxIDw8IDEyLCAvLyAtcCwgRG9uJ3QgcnVuIHNjcmlwdCBvbiBkYWVtb24gc3RhcnR1cAorCUZMQUdfTk9fU0hVVERPV04JCT0gMSA8PCAxMywgLy8gLXEsIERvbid0IHJ1biBzY3JpcHQgb24gZGFlbW9uIHF1aXQKKwlGTEFHX0lOSVRJQUxfRE9XTgkJPSAxIDw8IDE0LCAvLyAtbCwgUnVuICJkb3duIiBzY3JpcHQgb24gc3RhcnR1cCBpZiBubyBjYWJsZSBpcyBkZXRlY3RlZAorCUZMQUdfRVhUUkFfQVJHCQkJPSAxIDw8IDE1LCAvLyAteCwgU3BlY2lmeSBhbiBleHRyYSBhcmd1bWVudCBmb3IgYWN0aW9uIHNjcmlwdAorCUZMQUdfTU9OSVRPUgkJCT0gMSA8PCAxNiwgLy8gLU0sIFVzZSBpbnRlcmZhY2UgbW9uaXRvcmluZworI2lmIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUKKwlGTEFHX0tJTEwJCQk9IDEgPDwgMTcsIC8vIC1rLCBLaWxsIGEgcnVubmluZyBkYWVtb24KKyNlbmRpZgorfTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCisjIGRlZmluZSBPUFRJT05fU1RSICIrYW5zZkZpOnI6SXQ6dTpkOm06cHFseDpNayIKKyNlbHNlCisjIGRlZmluZSBPUFRJT05fU1RSICIrYW5zZkZpOnI6SXQ6dTpkOm06cHFseDpNIgorI2VuZGlmCisKK2VudW0geyAvLyBpbnRlcmZhY2Ugc3RhdHVzCisJSUZTVEFUVVNfRVJSID0gLTEsCisJSUZTVEFUVVNfRE9XTiA9IDAsCisJSUZTVEFUVVNfVVAgPSAxLAorfTsKKworZW51bSB7IC8vIGNvbnN0YW50IGZkcworCWlvY3RsX2ZkID0gMywKKwluZXRsaW5rX2ZkID0gNCwKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBpZmFjZV9sYXN0X3N0YXR1czsKKwlzbWFsbGludCBpZmFjZV9wcmV2X3N0YXR1czsKKwlzbWFsbGludCBpZmFjZV9leGlzdHM7CisJc21hbGxpbnQgYXBpX21ldGhvZF9udW07CisKKwkvKiBVc2VkIGluIGdldG9wdDMyLCBtdXN0IGhhdmUgc2l6ZW9mID09IHNpemVvZihpbnQpICovCisJdW5zaWduZWQgcG9sbF90aW1lOworCXVuc2lnbmVkIGRlbGF5X3VwOworCXVuc2lnbmVkIGRlbGF5X2Rvd247CisKKwljb25zdCBjaGFyICppZmFjZTsKKwljb25zdCBjaGFyICphcGlfbW9kZTsKKwljb25zdCBjaGFyICpzY3JpcHRfbmFtZTsKKwljb25zdCBjaGFyICpleHRyYV9hcmc7Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJRy5pZmFjZV9sYXN0X3N0YXR1cyA9IC0xOyBcCisJRy5pZmFjZV9leGlzdHMgICA9IDE7IFwKKwlHLnBvbGxfdGltZSAgICAgID0gMTsgXAorCUcuZGVsYXlfZG93biAgICAgPSA1OyBcCisJRy5pZmFjZSAgICAgICAgICA9ICJldGgwIjsgXAorCUcuYXBpX21vZGUgICAgICAgPSAiYSI7IFwKKwlHLnNjcmlwdF9uYW1lICAgID0gIi9ldGMvaWZwbHVnZC9pZnBsdWdkLmFjdGlvbiI7IFwKK30gd2hpbGUgKDApCisKKworLyogVXRpbGl0eSByb3V0aW5lcyAqLworCitzdGF0aWMgdm9pZCBzZXRfaWZyZXFfdG9faWZuYW1lKHN0cnVjdCBpZnJlcSAqaWZyZXEpCit7CisJbWVtc2V0KGlmcmVxLCAwLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CisJc3RybmNweV9JRk5BTVNJWihpZnJlcS0+aWZyX25hbWUsIEcuaWZhY2UpOworfQorCitzdGF0aWMgaW50IG5ldHdvcmtfaW9jdGwoaW50IHJlcXVlc3QsIHZvaWQqIGRhdGEsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwlpbnQgciA9IGlvY3RsKGlvY3RsX2ZkLCByZXF1ZXN0LCBkYXRhKTsKKwlpZiAociA8IDAgJiYgZXJybXNnKQorCQliYl9wZXJyb3JfbXNnKCIlcyBmYWlsZWQiLCBlcnJtc2cpOworCXJldHVybiByOworfQorCisvKiBMaW5rIGRldGVjdGlvbiByb3V0aW5lcyBhbmQgdGFibGUgKi8KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rX21paSh2b2lkKQoreworCS8qIGNoYXIgYnVmZmVyIGluc3RlYWQgb2YgYm9uYS1maWRlIHN0cnVjdCBhdm9pZHMgYWxpYXNpbmcgd2FybmluZyAqLworCWNoYXIgYnVmW3NpemVvZihzdHJ1Y3QgaWZyZXEpXTsKKwlzdHJ1Y3QgaWZyZXEgKmNvbnN0IGlmcmVxID0gKHZvaWQgKilidWY7CisKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paSA9ICh2b2lkICopJmlmcmVxLT5pZnJfZGF0YTsKKworCXNldF9pZnJlcV90b19pZm5hbWUoaWZyZXEpOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0dNSUlQSFksIGlmcmVxLCAiU0lPQ0dNSUlQSFkiKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwltaWktPnJlZ19udW0gPSAxOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0dNSUlSRUcsIGlmcmVxLCAiU0lPQ0dNSUlSRUciKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwlyZXR1cm4gKG1paS0+dmFsX291dCAmIDB4MDAwNCkgPyBJRlNUQVRVU19VUCA6IElGU1RBVFVTX0RPV047Cit9CisKK3N0YXRpYyBzbWFsbGludCBkZXRlY3RfbGlua19wcml2KHZvaWQpCit7CisJLyogY2hhciBidWZmZXIgaW5zdGVhZCBvZiBib25hLWZpZGUgc3RydWN0IGF2b2lkcyBhbGlhc2luZyB3YXJuaW5nICovCisJY2hhciBidWZbc2l6ZW9mKHN0cnVjdCBpZnJlcSldOworCXN0cnVjdCBpZnJlcSAqY29uc3QgaWZyZXEgPSAodm9pZCAqKWJ1ZjsKKworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpID0gKHZvaWQgKikmaWZyZXEtPmlmcl9kYXRhOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZShpZnJlcSk7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DREVWUFJJVkFURSwgaWZyZXEsICJTSU9DREVWUFJJVkFURSIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCW1paS0+cmVnX251bSA9IDE7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DREVWUFJJVkFURSsxLCBpZnJlcSwgIlNJT0NERVZQUklWQVRFKzEiKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwlyZXR1cm4gKG1paS0+dmFsX291dCAmIDB4MDAwNCkgPyBJRlNUQVRVU19VUCA6IElGU1RBVFVTX0RPV047Cit9CisKK3N0YXRpYyBzbWFsbGludCBkZXRlY3RfbGlua19ldGh0b29sKHZvaWQpCit7CisJc3RydWN0IGlmcmVxIGlmcmVxOworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXEpOworCisJZWRhdGEuY21kID0gRVRIVE9PTF9HTElOSzsKKwlpZnJlcS5pZnJfZGF0YSA9ICh2b2lkKikgJmVkYXRhOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0VUSFRPT0wsICZpZnJlcSwgIkVUSFRPT0xfR0xJTksiKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwlyZXR1cm4gZWRhdGEuZGF0YSA/IElGU1RBVFVTX1VQIDogSUZTVEFUVVNfRE9XTjsKK30KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rX2lmZih2b2lkKQoreworCXN0cnVjdCBpZnJlcSBpZnJlcTsKKworCXNldF9pZnJlcV90b19pZm5hbWUoJmlmcmVxKTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHSUZGTEFHUywgJmlmcmVxLCAiU0lPQ0dJRkZMQUdTIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJLyogSWYgSUZGX1VQIGlzIG5vdCBzZXQgKGludGVyZmFjZSBpcyBkb3duKSwgSUZGX1JVTk5JTkcgaXMgbmV2ZXIgc2V0CisJICogcmVnYXJkbGVzcyBvZiBsaW5rIHN0YXR1cy4gU2ltcGx5IGNvbnRpbnVlIHRvIHJlcG9ydCBsYXN0IHN0YXR1cyAtCisJICogbm8gcG9pbnQgaW4gcmVwb3J0aW5nIHNwdXJpb3VzIGxpbmsgZG93bnMgaWYgaW50ZXJmYWNlIGlzIGRpc2FibGVkCisJICogYnkgYWRtaW4uIFdoZW4vaWYgaXQgd2lsbCBiZSBicm91Z2h0IHVwLAorCSAqIHdlJ2xsIHJlcG9ydCByZWFsIGxpbmsgc3RhdHVzLgorCSAqLworCWlmICghKGlmcmVxLmlmcl9mbGFncyAmIElGRl9VUCkgJiYgRy5pZmFjZV9sYXN0X3N0YXR1cyAhPSBJRlNUQVRVU19FUlIpCisJCXJldHVybiBHLmlmYWNlX2xhc3Rfc3RhdHVzOworCisJcmV0dXJuIChpZnJlcS5pZnJfZmxhZ3MgJiBJRkZfUlVOTklORykgPyBJRlNUQVRVU19VUCA6IElGU1RBVFVTX0RPV047Cit9CisKK3N0YXRpYyBzbWFsbGludCBkZXRlY3RfbGlua193bGFuKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGl3cmVxIGl3cmVxdWVzdDsKKwl1aW50OF90IG1hY1tFVEhfQUxFTl07CisKKwltZW1zZXQoJml3cmVxdWVzdCwgMCwgc2l6ZW9mKGl3cmVxdWVzdCkpOworCXN0cm5jcHlfSUZOQU1TSVooaXdyZXF1ZXN0Lmlmcl9pZnJuLmlmcm5fbmFtZSwgRy5pZmFjZSk7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DR0lXQVAsICZpd3JlcXVlc3QsICJTSU9DR0lXQVAiKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwltZW1jcHkobWFjLCAmaXdyZXF1ZXN0LnUuYXBfYWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwlpZiAobWFjWzBdID09IDB4RkYgfHwgbWFjWzBdID09IDB4NDQgfHwgbWFjWzBdID09IDB4MDApIHsKKwkJZm9yIChpID0gMTsgaSA8IEVUSF9BTEVOOyArK2kpIHsKKwkJCWlmIChtYWNbaV0gIT0gbWFjWzBdKQorCQkJCXJldHVybiBJRlNUQVRVU19VUDsKKwkJfQorCQlyZXR1cm4gSUZTVEFUVVNfRE9XTjsKKwl9CisKKwlyZXR1cm4gSUZTVEFUVVNfVVA7Cit9CisKK2VudW0geyAvLyBhcGkgbW9kZQorCUFQSV9FVEhUT09MLCAvLyAnZScKKwlBUElfTUlJLCAgICAgLy8gJ20nCisJQVBJX1BSSVZBVEUsIC8vICdwJworCUFQSV9XTEFOLCAgICAvLyAndycKKwlBUElfSUZGLCAgICAgLy8gJ2knCisJQVBJX0FVVE8sICAgIC8vICdhJworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYXBpX21vZGVzW10gQUxJR04xID0gImVtcHdpYSI7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc21hbGxpbnQgKCpmdW5jKSh2b2lkKTsKK30gbWV0aG9kX3RhYmxlW10gPSB7CisJeyAiU0lPQ0VUSFRPT0wiICAgICAgICwgJmRldGVjdF9saW5rX2V0aHRvb2wgfSwKKwl7ICJTSU9DR01JSVBIWSIgICAgICAgLCAmZGV0ZWN0X2xpbmtfbWlpICAgICB9LAorCXsgIlNJT0NERVZQUklWQVRFIiAgICAsICZkZXRlY3RfbGlua19wcml2ICAgIH0sCisJeyAid2lyZWxlc3MgZXh0ZW5zaW9uIiwgJmRldGVjdF9saW5rX3dsYW4gICAgfSwKKwl7ICJJRkZfUlVOTklORyIgICAgICAgLCAmZGV0ZWN0X2xpbmtfaWZmICAgICB9LAorfTsKKworCisKK3N0YXRpYyBjb25zdCBjaGFyICpzdHJzdGF0dXMoaW50IHN0YXR1cykKK3sKKwlpZiAoc3RhdHVzID09IElGU1RBVFVTX0VSUikKKwkJcmV0dXJuICJlcnJvciI7CisJcmV0dXJuICJkb3duXDB1cCIgKyAoc3RhdHVzICogNSk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3NjcmlwdChjb25zdCBjaGFyICphY3Rpb24pCit7CisJY2hhciAqZW52X1BSRVZJT1VTLCAqZW52X0NVUlJFTlQ7CisJY2hhciAqYXJndls1XTsKKwlpbnQgcjsKKworCWJiX2Vycm9yX21zZygiZXhlY3V0aW5nICclcyAlcyAlcyciLCBHLnNjcmlwdF9uYW1lLCBHLmlmYWNlLCBhY3Rpb24pOworCisJYXJndlswXSA9IChjaGFyKikgRy5zY3JpcHRfbmFtZTsKKwlhcmd2WzFdID0gKGNoYXIqKSBHLmlmYWNlOworCWFyZ3ZbMl0gPSAoY2hhciopIGFjdGlvbjsKKwlhcmd2WzNdID0gKGNoYXIqKSBHLmV4dHJhX2FyZzsKKwlhcmd2WzRdID0gTlVMTDsKKworCWVudl9QUkVWSU9VUyA9IHhhc3ByaW50ZigiJXM9JXMiLCBJRlBMVUdEX0VOVl9QUkVWSU9VUywgc3Ryc3RhdHVzKEcuaWZhY2VfcHJldl9zdGF0dXMpKTsKKwlwdXRlbnYoZW52X1BSRVZJT1VTKTsKKwllbnZfQ1VSUkVOVCA9IHhhc3ByaW50ZigiJXM9JXMiLCBJRlBMVUdEX0VOVl9DVVJSRU5ULCBzdHJzdGF0dXMoRy5pZmFjZV9sYXN0X3N0YXR1cykpOworCXB1dGVudihlbnZfQ1VSUkVOVCk7CisKKwkvKiByIDwgMCAtIGNhbid0IGV4ZWMsIDAgPD0gciA8IDB4MTgwIC0gZXhpdGVkLCA+PTB4MTgwIC0ga2lsbGVkIGJ5IHNpZyAoci0weDE4MCkgKi8KKwlyID0gc3Bhd25fYW5kX3dhaXQoYXJndik7CisKKwl1bnNldGVudihJRlBMVUdEX0VOVl9QUkVWSU9VUyk7CisJdW5zZXRlbnYoSUZQTFVHRF9FTlZfQ1VSUkVOVCk7CisJZnJlZShlbnZfUFJFVklPVVMpOworCWZyZWUoZW52X0NVUlJFTlQpOworCisJYmJfZXJyb3JfbXNnKCJleGl0IGNvZGU6ICVkIiwgciAmIDB4ZmYpOworCXJldHVybiAob3B0aW9uX21hc2szMiAmIEZMQUdfSUdOT1JFX1JFVFZBTCkgPyAwIDogcjsKK30KKworc3RhdGljIHZvaWQgdXBfaWZhY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyZXF1ZXN0OworCisJaWYgKCFHLmlmYWNlX2V4aXN0cykKKwkJcmV0dXJuOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXF1ZXN0KTsKKwlpZiAobmV0d29ya19pb2N0bChTSU9DR0lGRkxBR1MsICZpZnJlcXVlc3QsICJnZXR0aW5nIGludGVyZmFjZSBmbGFncyIpIDwgMCkgeworCQlHLmlmYWNlX2V4aXN0cyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShpZnJlcXVlc3QuaWZyX2ZsYWdzICYgSUZGX1VQKSkgeworCQlpZnJlcXVlc3QuaWZyX2ZsYWdzIHw9IElGRl9VUDsKKwkJLyogTGV0IHVzZXIga25vdyB3ZSBtZXNzIHVwIHdpdGggaW50ZXJmYWNlICovCisJCWJiX2Vycm9yX21zZygidXBwaW5nIGludGVyZmFjZSIpOworCQlpZiAobmV0d29ya19pb2N0bChTSU9DU0lGRkxBR1MsICZpZnJlcXVlc3QsICJzZXR0aW5nIGludGVyZmFjZSBmbGFncyIpIDwgMCkKKwkJCXhmdW5jX2RpZSgpOworCX0KKworI2lmIDAgLyogd2h5IGRvIHdlIG1lc3Mgd2l0aCBJUCBhZGRyPyBJdCdzIG5vdCBvdXIgYnVzaW5lc3MgKi8KKwlpZiAobmV0d29ya19pb2N0bChTSU9DR0lGQUREUiwgJmlmcmVxdWVzdCwgImNhbid0IGdldCBpbnRlcmZhY2UgYWRkcmVzcyIpIDwgMCkgeworCX0gZWxzZSBpZiAoaWZyZXF1ZXN0Lmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCWJiX3BlcnJvcl9tc2coInRoZSBpbnRlcmZhY2UgaXMgbm90IElQLWJhc2VkIik7CisJfSBlbHNlIHsKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSgmaWZyZXF1ZXN0Lmlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJCW5ldHdvcmtfaW9jdGwoU0lPQ1NJRkFERFIsICZpZnJlcXVlc3QsICJjYW4ndCBzZXQgaW50ZXJmYWNlIGFkZHJlc3MiKTsKKwl9CisJbmV0d29ya19pb2N0bChTSU9DR0lGRkxBR1MsICZpZnJlcXVlc3QsICJjYW4ndCBnZXQgaW50ZXJmYWNlIGZsYWdzIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgbWF5YmVfdXBfbmV3X2lmYWNlKHZvaWQpCit7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfTk9fQVVUTykpCisJCXVwX2lmYWNlKCk7CisKKyNpZiAwIC8qIGJsb2F0ICovCisJc3RydWN0IGlmcmVxIGlmcmVxdWVzdDsKKwlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGRyaXZlcl9pbmZvOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXF1ZXN0KTsKKwlkcml2ZXJfaW5mby5jbWQgPSBFVEhUT09MX0dEUlZJTkZPOworCWlmcmVxdWVzdC5pZnJfZGF0YSA9ICZkcml2ZXJfaW5mbzsKKwlpZiAobmV0d29ya19pb2N0bChTSU9DRVRIVE9PTCwgJmlmcmVxdWVzdCwgTlVMTCkgPT0gMCkgeworCQljaGFyIGJ1ZltzaXplb2YoIi94eDp4eDp4eDp4eDp4eDp4eCIpXTsKKworCQkvKiBHZXQgTUFDICovCisJCWJ1ZlswXSA9ICdcMCc7CisJCXNldF9pZnJlcV90b19pZm5hbWUoJmlmcmVxdWVzdCk7CisJCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHSUZIV0FERFIsICZpZnJlcXVlc3QsIE5VTEwpID09IDApIHsKKwkJCXNwcmludGYoYnVmLCAiLyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCQkodWludDhfdCkoaWZyZXF1ZXN0Lmlmcl9od2FkZHIuc2FfZGF0YVswXSksCisJCQkJKHVpbnQ4X3QpKGlmcmVxdWVzdC5pZnJfaHdhZGRyLnNhX2RhdGFbMV0pLAorCQkJCSh1aW50OF90KShpZnJlcXVlc3QuaWZyX2h3YWRkci5zYV9kYXRhWzJdKSwKKwkJCQkodWludDhfdCkoaWZyZXF1ZXN0Lmlmcl9od2FkZHIuc2FfZGF0YVszXSksCisJCQkJKHVpbnQ4X3QpKGlmcmVxdWVzdC5pZnJfaHdhZGRyLnNhX2RhdGFbNF0pLAorCQkJCSh1aW50OF90KShpZnJlcXVlc3QuaWZyX2h3YWRkci5zYV9kYXRhWzVdKSk7CisJCX0KKworCQliYl9lcnJvcl9tc2coInVzaW5nIGludGVyZmFjZSAlcyVzIHdpdGggZHJpdmVyPCVzPiAodmVyc2lvbjogJXMpIiwKKwkJCUcuaWZhY2UsIGJ1ZiwgZHJpdmVyX2luZm8uZHJpdmVyLCBkcml2ZXJfaW5mby52ZXJzaW9uKTsKKwl9CisjZW5kaWYKKwlpZiAoRy5hcGlfbW9kZVswXSA9PSAnYScpCisJCUcuYXBpX21ldGhvZF9udW0gPSBBUElfQVVUTzsKK30KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rKHZvaWQpCit7CisJc21hbGxpbnQgc3RhdHVzOworCisJaWYgKCFHLmlmYWNlX2V4aXN0cykKKwkJcmV0dXJuIChvcHRpb25fbWFzazMyICYgRkxBR19NT05JVE9SKSA/IElGU1RBVFVTX0RPV04gOiBJRlNUQVRVU19FUlI7CisKKwkvKiBTb21lIGRyaXZlcnMgY2FuJ3QgZGV0ZWN0IGxpbmsgc3RhdHVzIHdoZW4gdGhlIGludGVyZmFjZSBpcyBkb3duLgorCSAqIEkgaW1hZ2luZSBkZXRlY3RfbGlua19pZmYoKSBpcyB0aGUgbW9zdCB2dWxuZXJhYmxlLgorCSAqIFRoYXQncyB3aHkgLWEgIm5vYXV0byIgaW4gYW4gb3B0aW9uLCBub3QgYSBoYXJkd2lyZWQgYmVoYXZpb3IuCisJICovCisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfTk9fQVVUTykpCisJCXVwX2lmYWNlKCk7CisKKwlpZiAoRy5hcGlfbWV0aG9kX251bSA9PSBBUElfQVVUTykgeworCQlpbnQgaTsKKwkJc21hbGxpbnQgc3ZfbG9nbW9kZTsKKworCQlzdl9sb2dtb2RlID0gbG9nbW9kZTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWV0aG9kX3RhYmxlKTsgaSsrKSB7CisJCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworCQkJc3RhdHVzID0gbWV0aG9kX3RhYmxlW2ldLmZ1bmMoKTsKKwkJCWxvZ21vZGUgPSBzdl9sb2dtb2RlOworCQkJaWYgKHN0YXR1cyAhPSBJRlNUQVRVU19FUlIpIHsKKwkJCQlHLmFwaV9tZXRob2RfbnVtID0gaTsKKwkJCQliYl9lcnJvcl9tc2coInVzaW5nICVzIGRldGVjdGlvbiBtb2RlIiwgbWV0aG9kX3RhYmxlW2ldLm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gbWV0aG9kX3RhYmxlW0cuYXBpX21ldGhvZF9udW1dLmZ1bmMoKTsKKwl9CisKKwlpZiAoc3RhdHVzID09IElGU1RBVFVTX0VSUikgeworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfSUdOT1JFX0ZBSUwpCisJCQlzdGF0dXMgPSBJRlNUQVRVU19ET1dOOworCQllbHNlIGlmIChvcHRpb25fbWFzazMyICYgRkxBR19JR05PUkVfRkFJTF9QT1NJVElWRSkKKwkJCXN0YXR1cyA9IElGU1RBVFVTX1VQOworCQllbHNlIGlmIChHLmFwaV9tb2RlWzBdID09ICdhJykKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgZGV0ZWN0IGxpbmsgc3RhdHVzIik7CisJfQorCisJaWYgKHN0YXR1cyAhPSBHLmlmYWNlX2xhc3Rfc3RhdHVzKSB7CisJCUcuaWZhY2VfcHJldl9zdGF0dXMgPSBHLmlmYWNlX2xhc3Rfc3RhdHVzOworCQlHLmlmYWNlX2xhc3Rfc3RhdHVzID0gc3RhdHVzOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBOT0lOTElORSBpbnQgY2hlY2tfZXhpc3RlbmNlX3Rocm91Z2hfbmV0bGluayh2b2lkKQoreworCWludCBpZmFjZV9sZW47CisJY2hhciByZXBseWJ1ZlsxMDI0XTsKKworCWlmYWNlX2xlbiA9IHN0cmxlbihHLmlmYWNlKTsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgbmxtc2doZHIgKm1oZHI7CisJCXNzaXplX3QgYnl0ZXM7CisKKwkJYnl0ZXMgPSByZWN2KG5ldGxpbmtfZmQsICZyZXBseWJ1Ziwgc2l6ZW9mKHJlcGx5YnVmKSwgTVNHX0RPTlRXQUlUKTsKKwkJaWYgKGJ5dGVzIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCQlyZXR1cm4gRy5pZmFjZV9leGlzdHM7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisKKwkJCWJiX3BlcnJvcl9tc2coIm5ldGxpbms6IHJlY3YiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1oZHIgPSAoc3RydWN0IG5sbXNnaGRyKilyZXBseWJ1ZjsKKwkJd2hpbGUgKGJ5dGVzID4gMCkgeworCQkJaWYgKCFOTE1TR19PSyhtaGRyLCBieXRlcykpIHsKKwkJCQliYl9lcnJvcl9tc2coIm5ldGxpbmsgcGFja2V0IHRvbyBzbWFsbCBvciB0cnVuY2F0ZWQiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChtaGRyLT5ubG1zZ190eXBlID09IFJUTV9ORVdMSU5LIHx8IG1oZHItPm5sbXNnX3R5cGUgPT0gUlRNX0RFTExJTkspIHsKKwkJCQlzdHJ1Y3QgcnRhdHRyICphdHRyOworCQkJCWludCBhdHRyX2xlbjsKKworCQkJCWlmIChtaGRyLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKSkgeworCQkJCQliYl9lcnJvcl9tc2coIm5ldGxpbmsgcGFja2V0IHRvbyBzbWFsbCBvciB0cnVuY2F0ZWQiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCWF0dHIgPSBJRkxBX1JUQShOTE1TR19EQVRBKG1oZHIpKTsKKwkJCQlhdHRyX2xlbiA9IElGTEFfUEFZTE9BRChtaGRyKTsKKworCQkJCXdoaWxlIChSVEFfT0soYXR0ciwgYXR0cl9sZW4pKSB7CisJCQkJCWlmIChhdHRyLT5ydGFfdHlwZSA9PSBJRkxBX0lGTkFNRSkgeworCQkJCQkJaW50IGxlbiA9IFJUQV9QQVlMT0FEKGF0dHIpOworCQkJCQkJaWYgKGxlbiA+IElGTkFNU0laKQorCQkJCQkJCWxlbiA9IElGTkFNU0laOworCQkJCQkJaWYgKGlmYWNlX2xlbiA8PSBsZW4KKwkJCQkJCSAmJiBzdHJuY21wKEcuaWZhY2UsIFJUQV9EQVRBKGF0dHIpLCBsZW4pID09IDAKKwkJCQkJCSkgeworCQkJCQkJCUcuaWZhY2VfZXhpc3RzID0gKG1oZHItPm5sbXNnX3R5cGUgPT0gUlRNX05FV0xJTkspOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWF0dHIgPSBSVEFfTkVYVChhdHRyLCBhdHRyX2xlbik7CisJCQkJfQorCQkJfQorCisJCQltaGRyID0gTkxNU0dfTkVYVChtaGRyLCBieXRlcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gRy5pZmFjZV9leGlzdHM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCitzdGF0aWMgTk9JTkxJTkUgcGlkX3QgcmVhZF9waWQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGxlbjsKKwljaGFyIGJ1ZlsxMjhdOworCisJbGVuID0gb3Blbl9yZWFkX2Nsb3NlKGZpbGVuYW1lLCBidWYsIDEyNyk7CisJaWYgKGxlbiA+IDApIHsKKwkJYnVmW2xlbl0gPSAnXDAnOworCQkvKiByZXR1cm5zIFVMT05HX01BWCBvbiBlcnJvciA9PiAtMSAqLworCQlyZXR1cm4gYmJfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IGlmcGx1Z2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlmcGx1Z2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpZmFjZV9zdGF0dXM7CisJaW50IGRlbGF5X3RpbWU7CisJY29uc3QgY2hhciAqaWZhY2Vfc3RhdHVzX3N0cjsKKwlzdHJ1Y3QgcG9sbGZkIG5ldGxpbmtfcG9sbGZkWzFdOworCXVuc2lnbmVkIG9wdHM7CisJY29uc3QgY2hhciAqYXBpX21vZGVfZm91bmQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRQorCWNoYXIgKnBpZGZpbGVfbmFtZTsKKwlwaWRfdCBwaWRfZnJvbV9waWRmaWxlOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInQrOnUrOmQrIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiwKKwkJJkcuaWZhY2UsICZHLnNjcmlwdF9uYW1lLCAmRy5wb2xsX3RpbWUsICZHLmRlbGF5X3VwLAorCQkmRy5kZWxheV9kb3duLCAmRy5hcGlfbW9kZSwgJkcuZXh0cmFfYXJnKTsKKwlHLnBvbGxfdGltZSAqPSAxMDAwOworCisJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoImlmcGx1Z2QoJXMpIiwgRy5pZmFjZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCisJcGlkZmlsZV9uYW1lID0geGFzcHJpbnRmKF9QQVRIX1ZBUlJVTiJpZnBsdWdkLiVzLnBpZCIsIEcuaWZhY2UpOworCXBpZF9mcm9tX3BpZGZpbGUgPSByZWFkX3BpZChwaWRmaWxlX25hbWUpOworCisJaWYgKG9wdHMgJiBGTEFHX0tJTEwpIHsKKwkJaWYgKHBpZF9mcm9tX3BpZGZpbGUgPiAwKQorCQkJa2lsbChwaWRfZnJvbV9waWRmaWxlLCBTSUdRVUlUKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAocGlkX2Zyb21fcGlkZmlsZSA+IDAgJiYga2lsbChwaWRfZnJvbV9waWRmaWxlLCAwKSA9PSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZGFlbW9uIGFscmVhZHkgcnVubmluZyIpOworI2VuZGlmCisKKwlhcGlfbW9kZV9mb3VuZCA9IHN0cmNocihhcGlfbW9kZXMsIEcuYXBpX21vZGVbMF0pOworCWlmICghYXBpX21vZGVfZm91bmQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIEFQSSBtb2RlICclcyciLCBHLmFwaV9tb2RlKTsKKwlHLmFwaV9tZXRob2RfbnVtID0gYXBpX21vZGVfZm91bmQgLSBhcGlfbW9kZXM7CisKKwlpZiAoIShvcHRzICYgRkxBR19OT19EQUVNT04pKQorCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NIRElSX1JPT1QsIGFyZ3YpOworCisJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSwgaW9jdGxfZmQpOworCWlmIChvcHRzICYgRkxBR19NT05JVE9SKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOworCQlpbnQgZmQgPSB4c29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfUk9VVEUpOworCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCQlhZGRyLm5sX2dyb3VwcyA9IFJUTUdSUF9MSU5LOworCQlhZGRyLm5sX3BpZCA9IGdldHBpZCgpOworCisJCXhiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJeG1vdmVfZmQoZmQsIG5ldGxpbmtfZmQpOworCX0KKworCXdyaXRlX3BpZGZpbGUocGlkZmlsZV9uYW1lKTsKKworCS8qIHRoaXMgY2FuJ3QgYmUgbW92ZWQgYmVmb3JlIHNvY2tldCBjcmVhdGlvbiAqLworCWlmICghKG9wdHMgJiBGTEFHX05PX1NZU0xPRykpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJYmJfc2lnbmFscygwCisJCXwgKDEgPDwgU0lHSU5UICkKKwkJfCAoMSA8PCBTSUdURVJNKQorCQl8ICgxIDw8IFNJR1FVSVQpCisJCXwgKDEgPDwgU0lHSFVQICkgLyogd2h5IHdlIGlnbm9yZSBpdD8gKi8KKwkJLyogfCAoMSA8PCBTSUdDSExEKSAtIHJ1bl9zY3JpcHQgZG9lcyBub3QgdXNlIGl0IGFueW1vcmUgKi8KKwkJLCByZWNvcmRfc2lnbm8pOworCisJYmJfZXJyb3JfbXNnKCJzdGFydGVkOiAlcyIsIGJiX2Jhbm5lcik7CisKKwlpZiAob3B0cyAmIEZMQUdfTU9OSVRPUikgeworCQlzdHJ1Y3QgaWZyZXEgaWZyZXF1ZXN0OworCQlzZXRfaWZyZXFfdG9faWZuYW1lKCZpZnJlcXVlc3QpOworCQlHLmlmYWNlX2V4aXN0cyA9IChuZXR3b3JrX2lvY3RsKFNJT0NHSUZJTkRFWCwgJmlmcmVxdWVzdCwgTlVMTCkgPT0gMCk7CisJfQorCisJaWYgKEcuaWZhY2VfZXhpc3RzKQorCQltYXliZV91cF9uZXdfaWZhY2UoKTsKKworCWlmYWNlX3N0YXR1cyA9IGRldGVjdF9saW5rKCk7CisJaWYgKGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19FUlIpCisJCWdvdG8gZXhpdGluZzsKKwlpZmFjZV9zdGF0dXNfc3RyID0gc3Ryc3RhdHVzKGlmYWNlX3N0YXR1cyk7CisKKwlpZiAob3B0cyAmIEZMQUdfTU9OSVRPUikgeworCQliYl9lcnJvcl9tc2coImludGVyZmFjZSAlcyIsCisJCQlHLmlmYWNlX2V4aXN0cyA/ICJleGlzdHMiCisJCQk6ICJkb2Vzbid0IGV4aXN0LCB3YWl0aW5nIik7CisJfQorCS8qIGVsc2Ugd2UgYXNzdW1lIGl0IGFsd2F5cyBleGlzdHMsIGJ1dCBkb24ndCBtaXNsZWFkIHVzZXIKKwkgKiBieSBwb3RlbnRpYWxseSBseWluZyB0aGF0IGl0IHJlYWxseSBleGlzdHMgKi8KKworCWlmIChHLmlmYWNlX2V4aXN0cykgeworCQliYl9lcnJvcl9tc2coImxpbmsgaXMgJXMiLCBpZmFjZV9zdGF0dXNfc3RyKTsKKwl9CisKKwlpZiAoKCEob3B0cyAmIEZMQUdfTk9fU1RBUlRVUCkKKwkgICAgICYmIGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19VUAorCSAgICApCisJIHx8IChvcHRzICYgRkxBR19JTklUSUFMX0RPV04pCisJKSB7CisJCWlmIChydW5fc2NyaXB0KGlmYWNlX3N0YXR1c19zdHIpICE9IDApCisJCQlnb3RvIGV4aXRpbmc7CisJfQorCisJLyogTWFpbiBsb29wICovCisJbmV0bGlua19wb2xsZmRbMF0uZmQgPSBuZXRsaW5rX2ZkOworCW5ldGxpbmtfcG9sbGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwlkZWxheV90aW1lID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgaWZhY2Vfc3RhdHVzX29sZDsKKwkJaW50IGlmYWNlX2V4aXN0c19vbGQ7CisKKwkJc3dpdGNoIChiYl9nb3Rfc2lnbmFsKSB7CisJCWNhc2UgU0lHSU5UOgorCQljYXNlIFNJR1RFUk06CisJCQliYl9nb3Rfc2lnbmFsID0gMDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJY2FzZSBTSUdRVUlUOgorCQkJYmJfZ290X3NpZ25hbCA9IDA7CisJCQlnb3RvIGV4aXRpbmc7CisJCWRlZmF1bHQ6CisJCQliYl9nb3Rfc2lnbmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBvbGwobmV0bGlua19wb2xsZmQsCisJCQkJKG9wdHMgJiBGTEFHX01PTklUT1IpID8gMSA6IDAsCisJCQkJRy5wb2xsX3RpbWUKKwkJCSkgPCAwCisJCSkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJYmJfcGVycm9yX21zZygicG9sbCIpOworCQkJZ290byBleGl0aW5nOworCQl9CisKKwkJaWZhY2Vfc3RhdHVzX29sZCA9IGlmYWNlX3N0YXR1czsKKwkJaWZhY2VfZXhpc3RzX29sZCA9IEcuaWZhY2VfZXhpc3RzOworCisJCWlmICgob3B0cyAmIEZMQUdfTU9OSVRPUikKKwkJICYmIChuZXRsaW5rX3BvbGxmZFswXS5yZXZlbnRzICYgUE9MTElOKQorCQkpIHsKKwkJCUcuaWZhY2VfZXhpc3RzID0gY2hlY2tfZXhpc3RlbmNlX3Rocm91Z2hfbmV0bGluaygpOworCQkJaWYgKEcuaWZhY2VfZXhpc3RzIDwgMCkgLyogZXJyb3IgKi8KKwkJCQlnb3RvIGV4aXRpbmc7CisJCQlpZiAoaWZhY2VfZXhpc3RzX29sZCAhPSBHLmlmYWNlX2V4aXN0cykgeworCQkJCWJiX2Vycm9yX21zZygiaW50ZXJmYWNlICVzYXBwZWFyZWQiLAorCQkJCQkJRy5pZmFjZV9leGlzdHMgPyAiIiA6ICJkaXMiKTsKKwkJCQlpZiAoRy5pZmFjZV9leGlzdHMpCisJCQkJCW1heWJlX3VwX25ld19pZmFjZSgpOworCQkJfQorCQl9CisKKwkJLyogbm90ZTogaWYgIUcuaWZhY2VfZXhpc3RzLCByZXR1cm5zIERPV04gKi8KKwkJaWZhY2Vfc3RhdHVzID0gZGV0ZWN0X2xpbmsoKTsKKwkJaWYgKGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19FUlIpIHsKKwkJCWlmICghKG9wdHMgJiBGTEFHX01PTklUT1IpKQorCQkJCWdvdG8gZXhpdGluZzsKKwkJCWlmYWNlX3N0YXR1cyA9IElGU1RBVFVTX0RPV047CisJCX0KKwkJaWZhY2Vfc3RhdHVzX3N0ciA9IHN0cnN0YXR1cyhpZmFjZV9zdGF0dXMpOworCisJCWlmIChpZmFjZV9zdGF0dXNfb2xkICE9IGlmYWNlX3N0YXR1cykgeworCQkJYmJfZXJyb3JfbXNnKCJsaW5rIGlzICVzIiwgaWZhY2Vfc3RhdHVzX3N0cik7CisKKwkJCWlmIChkZWxheV90aW1lKSB7CisJCQkJLyogbGluayByZXN0b3JlZCBpdHMgb2xkIHN0YXR1cyBiZWZvcmUKKwkJCQkgKiB3ZSBydW4gc2NyaXB0LiBkb24ndCBydW4gdGhlIHNjcmlwdDogKi8KKwkJCQlkZWxheV90aW1lID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZGVsYXlfdGltZSA9IG1vbm90b25pY19zZWMoKTsKKwkJCQlpZiAoaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX1VQKQorCQkJCQlkZWxheV90aW1lICs9IEcuZGVsYXlfdXA7CisJCQkJaWYgKGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19ET1dOKQorCQkJCQlkZWxheV90aW1lICs9IEcuZGVsYXlfZG93bjsKKwkJCQlpZiAoZGVsYXlfdGltZSA9PSAwKQorCQkJCQlkZWxheV90aW1lKys7CisJCQl9CisJCX0KKworCQlpZiAoZGVsYXlfdGltZSAmJiAoaW50KShtb25vdG9uaWNfc2VjKCkgLSBkZWxheV90aW1lKSA+PSAwKSB7CisJCQlkZWxheV90aW1lID0gMDsKKwkJCWlmIChydW5fc2NyaXB0KGlmYWNlX3N0YXR1c19zdHIpICE9IDApCisJCQkJZ290byBleGl0aW5nOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIGNsZWFudXA6CisJaWYgKCEob3B0cyAmIEZMQUdfTk9fU0hVVERPV04pCisJICYmIChpZmFjZV9zdGF0dXMgPT0gSUZTVEFUVVNfVVAKKwkgICAgIHx8IChpZmFjZV9zdGF0dXMgPT0gSUZTVEFUVVNfRE9XTiAmJiBkZWxheV90aW1lKQorCSAgICApCisJKSB7CisJCXNldGVudihJRlBMVUdEX0VOVl9QUkVWSU9VUywgc3Ryc3RhdHVzKGlmYWNlX3N0YXR1cyksIDEpOworCQlzZXRlbnYoSUZQTFVHRF9FTlZfQ1VSUkVOVCwgc3Ryc3RhdHVzKC0xKSwgMSk7CisJCXJ1bl9zY3JpcHQoImRvd25cMHVwIik7IC8qIHJldXNpbmcgc3RyaW5nICovCisJfQorCisgZXhpdGluZzoKKwlyZW1vdmVfcGlkZmlsZShwaWRmaWxlX25hbWUpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJleGl0aW5nIik7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lmdXBkb3duLmMgYi9uZXR3b3JraW5nL2lmdXBkb3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyMDMzMAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaWZ1cGRvd24uYwpAQCAtMCwwICsxLDEzNTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBpZnVwZG93biBmb3IgYnVzeWJveAorICogIENvcHlyaWdodCAoYykgMjAwMiBHbGVubiBNY0dyYXRoCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqICBCYXNlZCBvbiBpZnVwZG93biB2IDAuNi40IGJ5IEFudGhvbnkgVG93bnMKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW50aG9ueSBUb3ducyA8YWpAYXp1cmUuaHVtYnVnLm9yZy5hdT4KKyAqCisgKiAgQ2hhbmdlcyB0byB1cHN0cmVhbSB2ZXJzaW9uCisgKiAgUmVtb3ZlIGNoZWNrcyBmb3Iga2VybmVsIHZlcnNpb24sIGFzc3VtZSBrZXJuZWwgdmVyc2lvbiAyLjIuMCBvciBiZXR0ZXIuCisgKiAgTGluZXMgaW4gdGhlIGludGVyZmFjZXMgZmlsZSBjYW5ub3Qgd3JhcC4KKyAqICBUbyBhZGhlcmUgdG8gdGhlIEZIUywgdGhlIGRlZmF1bHQgc3RhdGUgZmlsZSBpcyAvdmFyL3J1bi9pZnN0YXRlCisgKiAgKGRlZmluZWQgdmlhIENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEgpIGFuZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBidWlsZAorICogIGNvbmZpZ3VyYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaWZ1cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hbiJJRl9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcoIm0iKSJ2Zl0gWy1pIEZJTEVdIElGQUNFLi4uIgorLy91c2FnZTojZGVmaW5lIGlmdXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJRGUvY29uZmlndXJlIGFsbCBpbnRlcmZhY2VzIGF1dG9tYXRpY2FsbHkiCisvL3VzYWdlOiAgICAgIlxuCS1pIEZJTEUJVXNlIEZJTEUgZm9yIGludGVyZmFjZSBkZWZpbml0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgb3V0IHdoYXQgd291bGQgaGFwcGVuLCBidXQgZG9uJ3QgZG8gaXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcoCisvL3VzYWdlOiAgICAgIlxuCQkobm90ZTogZG9lc24ndCBkaXNhYmxlIG1hcHBpbmdzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JRG9uJ3QgcnVuIGFueSBtYXBwaW5ncyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXYJUHJpbnQgb3V0IHdoYXQgd291bGQgaGFwcGVuIGJlZm9yZSBkb2luZyBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgZGUvY29uZmlndXJhdGlvbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaWZkb3duX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFuIklGX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORygibSIpInZmXSBbLWkgRklMRV0gSUZBQ0UuLi4iCisvL3VzYWdlOiNkZWZpbmUgaWZkb3duX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCURlL2NvbmZpZ3VyZSBhbGwgaW50ZXJmYWNlcyBhdXRvbWF0aWNhbGx5IgorLy91c2FnZTogICAgICJcbgktaSBGSUxFCVVzZSBGSUxFIGZvciBpbnRlcmZhY2UgZGVmaW5pdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1uCVByaW50IG91dCB3aGF0IHdvdWxkIGhhcHBlbiwgYnV0IGRvbid0IGRvIGl0IgorLy91c2FnZToJSUZfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HKAorLy91c2FnZTogICAgICJcbgkJKG5vdGU6IGRvZXNuJ3QgZGlzYWJsZSBtYXBwaW5ncykiCisvL3VzYWdlOiAgICAgIlxuCS1tCURvbid0IHJ1biBhbnkgbWFwcGluZ3MiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS12CVByaW50IG91dCB3aGF0IHdvdWxkIGhhcHBlbiBiZWZvcmUgZG9pbmcgaXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIGRlL2NvbmZpZ3VyYXRpb24iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNkZWZpbmUgTUFYX09QVF9ERVBUSCAxMAorI2RlZmluZSBFVU5CQUxCUkFDSyAxMDAwMQorI2RlZmluZSBFVU5ERUZWQVIgICAxMDAwMgorI2RlZmluZSBFVU5CQUxQRVIgICAxMDAwMAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworI2RlZmluZSBNQVhfSU5URVJGQUNFX0xFTkdUSCAxMAorI2VuZGlmCisKKyNkZWZpbmUgVURIQ1BDX0NNRF9PUFRJT05TIENPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlMKKworI2RlZmluZSBkZWJ1Z19ub2lzZShhcmdzLi4uKSAvKmZwcmludGYoc3RkZXJyLCBhcmdzKSovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBpbnRlcmZhY2VfZGVmbl90OworCit0eXBlZGVmIGludCBleGVjZm4oY2hhciAqY29tbWFuZCk7CisKK3N0cnVjdCBtZXRob2RfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp1cCkoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICplKSBGQVNUX0ZVTkM7CisJaW50ICgqZG93bikoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICplKSBGQVNUX0ZVTkM7Cit9OworCitzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbl9tZXRob2RzOworCWNvbnN0IHN0cnVjdCBtZXRob2RfdCAqbWV0aG9kOworfTsKKworc3RydWN0IG1hcHBpbmdfZGVmbl90IHsKKwlzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKm5leHQ7CisKKwlpbnQgbWF4X21hdGNoZXM7CisJaW50IG5fbWF0Y2hlczsKKwljaGFyICoqbWF0Y2g7CisKKwljaGFyICpzY3JpcHQ7CisKKwlpbnQgbWF4X21hcHBpbmdzOworCWludCBuX21hcHBpbmdzOworCWNoYXIgKiptYXBwaW5nOworfTsKKworc3RydWN0IHZhcmlhYmxlX3QgeworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWU7Cit9OworCitzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCB7CisJY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgKmFkZHJlc3NfZmFtaWx5OworCWNvbnN0IHN0cnVjdCBtZXRob2RfdCAqbWV0aG9kOworCisJY2hhciAqaWZhY2U7CisJaW50IG1heF9vcHRpb25zOworCWludCBuX29wdGlvbnM7CisJc3RydWN0IHZhcmlhYmxlX3QgKm9wdGlvbjsKK307CisKK3N0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCB7CisJbGxpc3RfdCAqYXV0b2ludGVyZmFjZXM7CisJbGxpc3RfdCAqaWZhY2VzOworCXN0cnVjdCBtYXBwaW5nX2RlZm5fdCAqbWFwcGluZ3M7Cit9OworCisKKyNkZWZpbmUgT1BUSU9OX1NUUiAiYW52ZiIgSUZfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HKCJtIikgImk6IgorZW51bSB7CisJT1BUX2RvX2FsbCAgICAgID0gMHgxLAorCU9QVF9ub19hY3QgICAgICA9IDB4MiwKKwlPUFRfdmVyYm9zZSAgICAgPSAweDQsCisJT1BUX2ZvcmNlICAgICAgID0gMHg4LAorCU9QVF9ub19tYXBwaW5ncyA9IDB4MTAsCit9OworI2RlZmluZSBET19BTEwgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9kb19hbGwpCisjZGVmaW5lIE5PX0FDVCAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX25vX2FjdCkKKyNkZWZpbmUgVkVSQk9TRSAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdmVyYm9zZSkKKyNkZWZpbmUgRk9SQ0UgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZm9yY2UpCisjZGVmaW5lIE5PX01BUFBJTkdTIChvcHRpb25fbWFzazMyICYgT1BUX25vX21hcHBpbmdzKQorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICoqbXlfZW52aXJvbjsKKwljb25zdCBjaGFyICpzdGFydHVwX1BBVEg7CisJY2hhciAqc2hlbGw7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQVjQgfHwgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNgorCitzdGF0aWMgdm9pZCBhZGRzdHIoY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IHN0cl9sZW5ndGgpCit7CisJLyogeGFzcHJpbnRmIHRyaWNrIHdpbGwgYmUgc21hbGxlciwgYnV0IHdlIGFyZSBvZnRlbgorCSAqIGNhbGxlZCB3aXRoIHN0cl9sZW5ndGggPT0gMSAtIGRvbid0IHdhbnQgdG8gaGF2ZQorCSAqIFRIQVQgbXVjaCBvZiBtYWxsb2MvZnJlZWluZyEgKi8KKwljaGFyICpidWYgPSAqYnVmcDsKKwlpbnQgbGVuID0gKGJ1ZiA/IHN0cmxlbihidWYpIDogMCk7CisJc3RyX2xlbmd0aCsrOworCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgbGVuICsgc3RyX2xlbmd0aCk7CisJLyogY29waWVzIGF0IG1vc3Qgc3RyX2xlbmd0aC0xIGNoYXJzISAqLworCXNhZmVfc3RybmNweShidWYgKyBsZW4sIHN0ciwgc3RyX2xlbmd0aCk7CisJKmJ1ZnAgPSBidWY7Cit9CisKK3N0YXRpYyBpbnQgc3RybmNtcHooY29uc3QgY2hhciAqbCwgY29uc3QgY2hhciAqciwgc2l6ZV90IGxsZW4pCit7CisJaW50IGkgPSBzdHJuY21wKGwsIHIsIGxsZW4pOworCisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC0gKHVuc2lnbmVkIGNoYXIpcltsbGVuXTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGNoYXIgKmdldF92YXIoY29uc3QgY2hhciAqaWQsIHNpemVfdCBpZGxlbiwgc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCkKK3sKKwlpbnQgaTsKKworCWlmIChzdHJuY21weihpZCwgImlmYWNlIiwgaWRsZW4pID09IDApIHsKKwkJLy8gdWJ1bnR1J3MgaWZ1cCBkb2Vzbid0IGRvIHRoaXM6CisJCS8vc3RhdGljIGNoYXIgKmxhYmVsX2J1ZjsKKwkJLy9jaGFyICpyZXN1bHQ7CisJCS8vZnJlZShsYWJlbF9idWYpOworCQkvL2xhYmVsX2J1ZiA9IHhzdHJkdXAoaWZkLT5pZmFjZSk7CisJCS8vIFJlbW92ZSB2aXJ0dWFsIGlmYWNlIHN1ZmZpeAorCQkvL3Jlc3VsdCA9IHN0cmNocm51bChsYWJlbF9idWYsICc6Jyk7CisJCS8vKnJlc3VsdCA9ICdcMCc7CisJCS8vcmV0dXJuIGxhYmVsX2J1ZjsKKworCQlyZXR1cm4gaWZkLT5pZmFjZTsKKwl9CisJaWYgKHN0cm5jbXB6KGlkLCAibGFiZWwiLCBpZGxlbikgPT0gMCkgeworCQlyZXR1cm4gaWZkLT5pZmFjZTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGlmZC0+bl9vcHRpb25zOyBpKyspIHsKKwkJaWYgKHN0cm5jbXB6KGlkLCBpZmQtPm9wdGlvbltpXS5uYW1lLCBpZGxlbikgPT0gMCkgeworCQkJcmV0dXJuIGlmZC0+b3B0aW9uW2ldLnZhbHVlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCitzdGF0aWMgaW50IGNvdW50X25ldG1hc2tfYml0cyhjb25zdCBjaGFyICpkb3R0ZWRfcXVhZCkKK3sKKy8vCWludCByZXN1bHQ7CisvLwl1bnNpZ25lZCBhLCBiLCBjLCBkOworLy8JLyogRm91bmQgYSBuZXRtYXNrLi4uICBDaGVjayBpZiBpdCBpcyBkb3R0ZWQgcXVhZCAqLworLy8JaWYgKHNzY2FuZihkb3R0ZWRfcXVhZCwgIiV1LiV1LiV1LiV1IiwgJmEsICZiLCAmYywgJmQpICE9IDQpCisvLwkJcmV0dXJuIC0xOworLy8JaWYgKChhfGJ8Y3xkKSA+PiA4KQorLy8JCXJldHVybiAtMTsgLyogb25lIG9mIG51bWJlcnMgaXMgPj0gMjU2ICovCisvLwlkIHw9IChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChjIDw8IDgpOyAvKiBJUCAqLworLy8JZCA9IH5kOyAvKiAxMTExMDAwMCAtPiAwMDAwMTExMSAqLworCisJLyogU2hvcnRlciB2ZXJzaW9uICovCisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaW5fYWRkciBpcDsKKwl1bnNpZ25lZCBkOworCisJaWYgKGluZXRfYXRvbihkb3R0ZWRfcXVhZCwgJmlwKSA9PSAwKQorCQlyZXR1cm4gLTE7IC8qIG1hbGZvcm1lZCBkb3R0ZWQgSVAgKi8KKwlkID0gbnRvaGwoaXAuc19hZGRyKTsgLyogSVAgaW4gaG9zdCBvcmRlciAqLworCWQgPSB+ZDsgLyogMTExMTAwMDAgLT4gMDAwMDExMTEgKi8KKwlpZiAoZCAmIChkKzEpKSAvKiBjaGVjayB0aGF0IGl0IGlzIGluIDAwMDAxMTExIGZvcm0gKi8KKwkJcmV0dXJuIC0xOyAvKiBubyBpdCBpcyBub3QgKi8KKwlyZXN1bHQgPSAzMjsKKwl3aGlsZSAoZCkgeworCQlkID4+PSAxOworCQlyZXN1bHQtLTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKyMgZW5kaWYKKworc3RhdGljIGNoYXIgKnBhcnNlKGNvbnN0IGNoYXIgKmNvbW1hbmQsIHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQpCit7CisJc2l6ZV90IG9sZF9wb3NbTUFYX09QVF9ERVBUSF0gPSB7IDAgfTsKKwlpbnQgb2theVtNQVhfT1BUX0RFUFRIXSA9IHsgMSB9OworCWludCBvcHRfZGVwdGggPSAxOworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisKKwl3aGlsZSAoKmNvbW1hbmQpIHsKKwkJc3dpdGNoICgqY29tbWFuZCkgeworCQlkZWZhdWx0OgorCQkJYWRkc3RyKCZyZXN1bHQsIGNvbW1hbmQsIDEpOworCQkJY29tbWFuZCsrOworCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChjb21tYW5kWzFdKSB7CisJCQkJYWRkc3RyKCZyZXN1bHQsIGNvbW1hbmQgKyAxLCAxKTsKKwkJCQljb21tYW5kICs9IDI7CisJCQl9IGVsc2UgeworCQkJCWFkZHN0cigmcmVzdWx0LCBjb21tYW5kLCAxKTsKKwkJCQljb21tYW5kKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnWyc6CisJCQlpZiAoY29tbWFuZFsxXSA9PSAnWycgJiYgb3B0X2RlcHRoIDwgTUFYX09QVF9ERVBUSCkgeworCQkJCW9sZF9wb3Nbb3B0X2RlcHRoXSA9IHJlc3VsdCA/IHN0cmxlbihyZXN1bHQpIDogMDsKKwkJCQlva2F5W29wdF9kZXB0aF0gPSAxOworCQkJCW9wdF9kZXB0aCsrOworCQkJCWNvbW1hbmQgKz0gMjsKKwkJCX0gZWxzZSB7CisJCQkJYWRkc3RyKCZyZXN1bHQsICJbIiwgMSk7CisJCQkJY29tbWFuZCsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ10nOgorCQkJaWYgKGNvbW1hbmRbMV0gPT0gJ10nICYmIG9wdF9kZXB0aCA+IDEpIHsKKwkJCQlvcHRfZGVwdGgtLTsKKwkJCQlpZiAoIW9rYXlbb3B0X2RlcHRoXSkgeworCQkJCQlyZXN1bHRbb2xkX3Bvc1tvcHRfZGVwdGhdXSA9ICdcMCc7CisJCQkJfQorCQkJCWNvbW1hbmQgKz0gMjsKKwkJCX0gZWxzZSB7CisJCQkJYWRkc3RyKCZyZXN1bHQsICJdIiwgMSk7CisJCQkJY29tbWFuZCsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyUnOgorCQkJeworCQkJCWNoYXIgKm5leHRwZXJjZW50OworCQkJCWNoYXIgKnZhcnZhbHVlOworCisJCQkJY29tbWFuZCsrOworCQkJCW5leHRwZXJjZW50ID0gc3RyY2hyKGNvbW1hbmQsICclJyk7CisJCQkJaWYgKCFuZXh0cGVyY2VudCkgeworCQkJCQllcnJubyA9IEVVTkJBTFBFUjsKKwkJCQkJZnJlZShyZXN1bHQpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisKKwkJCQl2YXJ2YWx1ZSA9IGdldF92YXIoY29tbWFuZCwgbmV4dHBlcmNlbnQgLSBjb21tYW5kLCBpZmQpOworCisJCQkJaWYgKHZhcnZhbHVlKSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJCQkJCS8qICJod2FkZHJlc3MgPGNsYXNzPiA8YWRkcmVzcz4iOgorCQkJCQkgKiB1bmxpa2UgaWZjb25maWcsIGlwIGRvZXNudCB3YW50IDxjbGFzcz4KKwkJCQkJICogKHVzdWFsbHkgImV0aGVyIiBrZXl3b3JkKS4gU2tpcCBpdC4gKi8KKwkJCQkJaWYgKHN0cm5jbXAoY29tbWFuZCwgImh3YWRkcmVzcyIsIDkpID09IDApIHsKKwkJCQkJCXZhcnZhbHVlID0gc2tpcF93aGl0ZXNwYWNlKHNraXBfbm9uX3doaXRlc3BhY2UodmFydmFsdWUpKTsKKwkJCQkJfQorIyBlbmRpZgorCQkJCQlhZGRzdHIoJnJlc3VsdCwgdmFydmFsdWUsIHN0cmxlbih2YXJ2YWx1ZSkpOworCQkJCX0gZWxzZSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJCQkJCS8qIFNpZ2guLi4gIEFkZCBhIHNwZWNpYWwgY2FzZSBmb3IgJ2lwJyB0byBjb252ZXJ0IGZyb20KKwkJCQkJICogZG90dGVkIHF1YWQgdG8gYml0IGNvdW50IHN0eWxlIG5ldG1hc2tzLiAgKi8KKwkJCQkJaWYgKHN0cm5jbXAoY29tbWFuZCwgImJubWFzayIsIDYpID09IDApIHsKKwkJCQkJCXVuc2lnbmVkIHJlczsKKwkJCQkJCXZhcnZhbHVlID0gZ2V0X3ZhcigibmV0bWFzayIsIDcsIGlmZCk7CisJCQkJCQlpZiAodmFydmFsdWUpIHsKKwkJCQkJCQlyZXMgPSBjb3VudF9uZXRtYXNrX2JpdHModmFydmFsdWUpOworCQkJCQkJCWlmIChyZXMgPiAwKSB7CisJCQkJCQkJCWNvbnN0IGNoYXIgKmFyZ3VtZW50ID0gdXRvYShyZXMpOworCQkJCQkJCQlhZGRzdHIoJnJlc3VsdCwgYXJndW1lbnQsIHN0cmxlbihhcmd1bWVudCkpOworCQkJCQkJCQljb21tYW5kID0gbmV4dHBlcmNlbnQgKyAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyMgZW5kaWYKKwkJCQkJb2theVtvcHRfZGVwdGggLSAxXSA9IDA7CisJCQkJfQorCisJCQkJY29tbWFuZCA9IG5leHRwZXJjZW50ICsgMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG9wdF9kZXB0aCA+IDEpIHsKKwkJZXJybm8gPSBFVU5CQUxCUkFDSzsKKwkJZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIW9rYXlbMF0pIHsKKwkJZXJybm8gPSBFVU5ERUZWQVI7CisJCWZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZXhlY3V0ZSgpIHJldHVybnMgMSBmb3Igc3VjY2VzcyBhbmQgMCBmb3IgZmFpbHVyZSAqLworc3RhdGljIGludCBleGVjdXRlKGNvbnN0IGNoYXIgKmNvbW1hbmQsIHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwljaGFyICpvdXQ7CisJaW50IHJldDsKKworCW91dCA9IHBhcnNlKGNvbW1hbmQsIGlmZCk7CisJaWYgKCFvdXQpIHsKKwkJLyogcGFyc2UgZXJyb3I/ICovCisJCXJldHVybiAwOworCX0KKwkvKiBvdXQgPT0gIiI6IHBhcnNlZCBvayBidXQgbm90IGFsbCBuZWVkZWQgdmFyaWFibGVzIGtub3duLCBza2lwICovCisJcmV0ID0gb3V0WzBdID8gKCpleGVjKShvdXQpIDogMTsKKworCWZyZWUob3V0KTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9JRlVQRE9XTl9JUFY0IHx8IEZFQVRVUkVfSUZVUERPV05fSVBWNiAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUFY2CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGxvb3BiYWNrX3VwNihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJaW50IHJlc3VsdDsKKwlyZXN1bHQgPSBleGVjdXRlKCJpcCBhZGRyIGFkZCA6OjEgZGV2ICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldCAlaWZhY2UlIHVwIiwgaWZkLCBleGVjKTsKKwlyZXR1cm4gKChyZXN1bHQgPT0gMikgPyAyIDogMCk7CisjIGVsc2UKKwlyZXR1cm4gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJSBhZGQgOjoxIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgbG9vcGJhY2tfZG93bjYoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCXJldHVybiBleGVjdXRlKCJpcCBsaW5rIHNldCAlaWZhY2UlIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbHNlCisJcmV0dXJuIGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgZGVsIDo6MSIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIG1hbnVhbF91cF9kb3duNihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkIFVOVVNFRF9QQVJBTSwgZXhlY2ZuICpleGVjIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgc3RhdGljX3VwNihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJaW50IHJlc3VsdDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwlyZXN1bHQgPSBleGVjdXRlKCJpcCBhZGRyIGFkZCAlYWRkcmVzcyUvJW5ldG1hc2slIGRldiAlaWZhY2UlW1sgbGFiZWwgJWxhYmVsJV1dIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXRbWyBtdHUgJW10dSVdXVtbIGFkZHIgJWh3YWRkcmVzcyVdXSAlaWZhY2UlIHVwIiwgaWZkLCBleGVjKTsKKwkvKiBXYXM6ICJbWyBpcCAuLi4uJWdhdGV3YXklIF1dIi4gUmVtb3ZlZCBleHRyYSBzcGFjZXMgdy9vIGNoZWNraW5nICovCisJcmVzdWx0ICs9IGV4ZWN1dGUoIltbaXAgcm91dGUgYWRkIDo6LzAgdmlhICVnYXRld2F5JV1dIiwgaWZkLCBleGVjKTsKKyMgZWxzZQorCXJlc3VsdCA9IGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSVbWyBtZWRpYSAlbWVkaWElXV1bWyBodyAlaHdhZGRyZXNzJV1dW1sgbXR1ICVtdHUlXV0gdXAiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIGFkZCAlYWRkcmVzcyUvJW5ldG1hc2slIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiW1tyb3V0ZSAtQSBpbmV0NiBhZGQgOjovMCBndyAlZ2F0ZXdheSVdXSIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCisJcmV0dXJuICgocmVzdWx0ID09IDMpID8gMyA6IDApOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfZG93bjYoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCXJldHVybiBleGVjdXRlKCJpcCBsaW5rIHNldCAlaWZhY2UlIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbHNlCisJcmV0dXJuIGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCit9CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHY0dHVubmVsX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0OworCXJlc3VsdCA9IGV4ZWN1dGUoImlwIHR1bm5lbCBhZGQgJWlmYWNlJSBtb2RlIHNpdCByZW1vdGUgIgorCQkJIiVlbmRwb2ludCVbWyBsb2NhbCAlbG9jYWwlXV1bWyB0dGwgJXR0bCVdXSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBhZGRyIGFkZCAlYWRkcmVzcyUvJW5ldG1hc2slIGRldiAlaWZhY2UlIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiW1tpcCByb3V0ZSBhZGQgOjovMCB2aWEgJWdhdGV3YXklXV0iLCBpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSA0KSA/IDQgOiAwKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgdjR0dW5uZWxfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqIGlmZCwgZXhlY2ZuICogZXhlYykKK3sKKwlyZXR1cm4gZXhlY3V0ZSgiaXAgdHVubmVsIGRlbCAlaWZhY2UlIiwgaWZkLCBleGVjKTsKK30KKyMgZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZXRob2RfdCBtZXRob2RzNltdID0geworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCXsgInY0dHVubmVsIiAsIHY0dHVubmVsX3VwICAgICAsIHY0dHVubmVsX2Rvd24gICAsIH0sCisjIGVuZGlmCisJeyAic3RhdGljIiAgICwgc3RhdGljX3VwNiAgICAgICwgc3RhdGljX2Rvd242ICAgICwgfSwKKwl7ICJtYW51YWwiICAgLCBtYW51YWxfdXBfZG93bjYgLCBtYW51YWxfdXBfZG93bjYgLCB9LAorCXsgImxvb3BiYWNrIiAsIGxvb3BiYWNrX3VwNiAgICAsIGxvb3BiYWNrX2Rvd242ICAsIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgYWRkcl9pbmV0NiA9IHsKKwkiaW5ldDYiLAorCUFSUkFZX1NJWkUobWV0aG9kczYpLAorCW1ldGhvZHM2Cit9OworCisjZW5kaWYgLyogRkVBVFVSRV9JRlVQRE9XTl9JUFY2ICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQVjQKKworc3RhdGljIGludCBGQVNUX0ZVTkMgbG9vcGJhY2tfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBhZGQgMTI3LjAuMC4xLzggZGV2ICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldCAlaWZhY2UlIHVwIiwgaWZkLCBleGVjKTsKKwlyZXR1cm4gKChyZXN1bHQgPT0gMikgPyAyIDogMCk7CisjIGVsc2UKKwlyZXR1cm4gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJSAxMjcuMC4wLjEgdXAiLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsb29wYmFja19kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwlpbnQgcmVzdWx0OworCXJlc3VsdCA9IGV4ZWN1dGUoImlwIGFkZHIgZmx1c2ggZGV2ICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldCAlaWZhY2UlIGRvd24iLCBpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAyKSA/IDIgOiAwKTsKKyMgZWxzZQorCXJldHVybiBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIDEyNy4wLjAuMSBkb3duIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgc3RhdGljX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0OworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCXJlc3VsdCA9IGV4ZWN1dGUoImlwIGFkZHIgYWRkICVhZGRyZXNzJS8lYm5tYXNrJVtbIGJyb2FkY2FzdCAlYnJvYWRjYXN0JV1dICIKKwkJCSJkZXYgJWlmYWNlJVtbIHBlZXIgJXBvaW50b3BvaW50JV1dW1sgbGFiZWwgJWxhYmVsJV1dIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXRbWyBtdHUgJW10dSVdXVtbIGFkZHIgJWh3YWRkcmVzcyVdXSAlaWZhY2UlIHVwIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiW1tpcCByb3V0ZSBhZGQgZGVmYXVsdCB2aWEgJWdhdGV3YXklIGRldiAlaWZhY2UlXV0iLCBpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAzKSA/IDMgOiAwKTsKKyMgZWxzZQorCS8qIGlmY29uZmlnIHNhaWQgdG8gc2V0IGlmYWNlIHVwIGJlZm9yZSBpdCBwcm9jZXNzZXMgaHcgJWh3YWRkcmVzcyUsCisJICogd2hpY2ggdGhlbiBvZiBjb3Vyc2UgZmFpbHMuIFRodXMgd2UgcnVuIHR3byBzZXBhcmF0ZSBpZmNvbmZpZyAqLworCXJlc3VsdCA9IGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSVbWyBodyAlaHdhZGRyZXNzJV1dW1sgbWVkaWEgJW1lZGlhJV1dW1sgbXR1ICVtdHUlXV0gdXAiLAorCQkJCWlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgJWFkZHJlc3MlIG5ldG1hc2sgJW5ldG1hc2slIgorCQkJCSJbWyBicm9hZGNhc3QgJWJyb2FkY2FzdCVdXVtbIHBvaW50b3BvaW50ICVwb2ludG9wb2ludCVdXSAiLAorCQkJCWlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoIltbcm91dGUgYWRkIGRlZmF1bHQgZ3cgJWdhdGV3YXklICVpZmFjZSVdXSIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDMpID8gMyA6IDApOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJaW50IHJlc3VsdDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwlyZXN1bHQgPSBleGVjdXRlKCJpcCBhZGRyIGZsdXNoIGRldiAlaWZhY2UlIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXQgJWlmYWNlJSBkb3duIiwgaWZkLCBleGVjKTsKKyMgZWxzZQorCS8qIHJlc3VsdCA9IGV4ZWN1dGUoIltbcm91dGUgZGVsIGRlZmF1bHQgZ3cgJWdhdGV3YXklICVpZmFjZSVdXSIsIGlmZCwgZXhlYyk7ICovCisJLyogQnJpbmdpbmcgdGhlIGludGVyZmFjZSBkb3duIGRlbGV0ZXMgdGhlIHJvdXRlcyBpbiBpdHNlbGYuCisJICAgT3RoZXJ3aXNlIHRoaXMgZmFpbHMgaWYgd2UgcmVmZXJlbmNlICdnYXRld2F5JyB3aGVuIHVzaW5nIHRoaXMgZnJvbSBkaGNwX2Rvd24gKi8KKwlyZXN1bHQgPSAxOworCXJlc3VsdCArPSBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorCXJldHVybiAoKHJlc3VsdCA9PSAyKSA/IDIgOiAwKTsKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQCitzdHJ1Y3QgZGhjcF9jbGllbnRfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpzdGFydGNtZDsKKwljb25zdCBjaGFyICpzdG9wY21kOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaGNwX2NsaWVudF90IGV4dF9kaGNwX2NsaWVudHNbXSA9IHsKKwl7ICJkaGNwY2QiLAorCQkiZGhjcGNkW1sgLWggJWhvc3RuYW1lJV1dW1sgLWkgJXZlbmRvciVdXVtbIC1JICVjbGllbnQlXV1bWyAtbCAlbGVhc2V0aW1lJV1dICVpZmFjZSUiLAorCQkiZGhjcGNkIC1rICVpZmFjZSUiLAorCX0sCisJeyAiZGhjbGllbnQiLAorCQkiZGhjbGllbnQgLXBmIC92YXIvcnVuL2RoY2xpZW50LiVpZmFjZSUucGlkICVpZmFjZSUiLAorCQkia2lsbCAtOSBgY2F0IC92YXIvcnVuL2RoY2xpZW50LiVpZmFjZSUucGlkYCAyPi9kZXYvbnVsbCIsCisJfSwKKwl7ICJwdW1wIiwKKwkJInB1bXAgLWkgJWlmYWNlJVtbIC1oICVob3N0bmFtZSVdXVtbIC1sICVsZWFzZWhvdXJzJV1dIiwKKwkJInB1bXAgLWkgJWlmYWNlJSAtayIsCisJfSwKKwl7ICJ1ZGhjcGMiLAorCQkidWRoY3BjICIgVURIQ1BDX0NNRF9PUFRJT05TICIgLXAgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkIC1pICVpZmFjZSVbWyAtSCAlaG9zdG5hbWUlXV1bWyAtYyAlY2xpZW50JV1dIgorCQkJCSJbWyAtcyAlc2NyaXB0JV1dW1sgJXVkaGNwY19vcHRzJV1dIiwKKwkJImtpbGwgYGNhdCAvdmFyL3J1bi91ZGhjcGMuJWlmYWNlJS5waWRgIDI+L2Rldi9udWxsIiwKKwl9LAorfTsKKyMgZW5kaWYgLyogRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQQyAqLworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXVuc2lnbmVkIGk7CisjICBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCS8qIGlwIGRvZXNuJ3QgdXAgaWZhY2Ugd2hlbiBpdCBjb25maWd1cmVzIGl0ICh1bmxpa2UgaWZjb25maWcpICovCisJaWYgKCFleGVjdXRlKCJpcCBsaW5rIHNldFtbIGFkZHIgJWh3YWRkcmVzcyVdXSAlaWZhY2UlIHVwIiwgaWZkLCBleGVjKSkKKwkJcmV0dXJuIDA7CisjICBlbHNlCisJLyogbmVlZGVkIGlmIHdlIGhhdmUgaHdhZGRyZXNzIG9uIGRoY3AgaWZhY2UgKi8KKwlpZiAoIWV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSVbWyBodyAlaHdhZGRyZXNzJV1dIHVwIiwgaWZkLCBleGVjKSkKKwkJcmV0dXJuIDA7CisjICBlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dF9kaGNwX2NsaWVudHMpOyBpKyspIHsKKwkJaWYgKGV4aXN0c19leGVjYWJsZShleHRfZGhjcF9jbGllbnRzW2ldLm5hbWUpKQorCQkJcmV0dXJuIGV4ZWN1dGUoZXh0X2RoY3BfY2xpZW50c1tpXS5zdGFydGNtZCwgaWZkLCBleGVjKTsKKwl9CisJYmJfZXJyb3JfbXNnKCJubyBkaGNwIGNsaWVudHMgZm91bmQiKTsKKwlyZXR1cm4gMDsKK30KKyMgZWxpZiBFTkFCTEVfVURIQ1BDCitzdGF0aWMgaW50IEZBU1RfRlVOQyBkaGNwX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKyMgIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJLyogaXAgZG9lc24ndCB1cCBpZmFjZSB3aGVuIGl0IGNvbmZpZ3VyZXMgaXQgKHVubGlrZSBpZmNvbmZpZykgKi8KKwlpZiAoIWV4ZWN1dGUoImlwIGxpbmsgc2V0W1sgYWRkciAlaHdhZGRyZXNzJV1dICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpKQorCQlyZXR1cm4gMDsKKyMgIGVsc2UKKwkvKiBuZWVkZWQgaWYgd2UgaGF2ZSBod2FkZHJlc3Mgb24gZGhjcCBpZmFjZSAqLworCWlmICghZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJVtbIGh3ICVod2FkZHJlc3MlXV0gdXAiLCBpZmQsIGV4ZWMpKQorCQlyZXR1cm4gMDsKKyMgIGVuZGlmCisJcmV0dXJuIGV4ZWN1dGUoInVkaGNwYyAiIFVESENQQ19DTURfT1BUSU9OUyAiIC1wIC92YXIvcnVuL3VkaGNwYy4laWZhY2UlLnBpZCAiCisJCQkiLWkgJWlmYWNlJVtbIC1IICVob3N0bmFtZSVdXVtbIC1jICVjbGllbnQlXV1bWyAtcyAlc2NyaXB0JV1dW1sgJXVkaGNwY19vcHRzJV1dIiwKKwkJCWlmZCwgZXhlYyk7Cit9CisjIGVsc2UKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCBVTlVTRURfUEFSQU0sCisJCWV4ZWNmbiAqZXhlYyBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDA7IC8qIG5vIGRoY3Agc3VwcG9ydCAqLworfQorIyBlbmRpZgorCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dF9kaGNwX2NsaWVudHMpOyBpKyspIHsKKwkJaWYgKGV4aXN0c19leGVjYWJsZShleHRfZGhjcF9jbGllbnRzW2ldLm5hbWUpKSB7CisJCQlyZXN1bHQgPSBleGVjdXRlKGV4dF9kaGNwX2NsaWVudHNbaV0uc3RvcGNtZCwgaWZkLCBleGVjKTsKKwkJCWlmIChyZXN1bHQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXJlc3VsdCkKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBubyBkaGNwIGNsaWVudHMgZm91bmQgYW5kIHN0b3BwZWQiKTsKKworCS8qIFNsZWVwIGEgYml0LCBvdGhlcndpc2Ugc3RhdGljX2Rvd24gdHJpZXMgdG8gYnJpbmcgZG93biBpbnRlcmZhY2UgdG9vIHNvb24sCisJICAgYW5kIGl0IG1heSBjb21lIGJhY2sgdXAgYmVjYXVzZSB1ZGhjcGMgaXMgc3RpbGwgc2h1dHRpbmcgZG93biAqLworCXVzbGVlcCgxMDAwMDApOworCXJlc3VsdCArPSBzdGF0aWNfZG93bihpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAzKSA/IDMgOiAwKTsKK30KKyMgZWxpZiBFTkFCTEVfVURIQ1BDCitzdGF0aWMgaW50IEZBU1RfRlVOQyBkaGNwX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgKKwkJInRlc3QgLWYgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkICYmICIKKwkJImtpbGwgYGNhdCAvdmFyL3J1bi91ZGhjcGMuJWlmYWNlJS5waWRgIDI+L2Rldi9udWxsIiwKKwkJaWZkLCBleGVjKTsKKwkvKiBBbHNvIGJyaW5nIHRoZSBoYXJkd2FyZSBpbnRlcmZhY2UgZG93biBzaW5jZQorCSAgIGtpbGxpbmcgdGhlIGRoY3AgY2xpZW50IGFsb25lIGRvZXNuJ3QgZG8gaXQuCisJICAgVGhpcyBlbmFibGVzIGNvbnNlY3V0aXZlIGlmdXAtPmlmZG93bi0+aWZ1cCAqLworCS8qIFNsZWVwIGEgYml0LCBvdGhlcndpc2Ugc3RhdGljX2Rvd24gdHJpZXMgdG8gYnJpbmcgZG93biBpbnRlcmZhY2UgdG9vIHNvb24sCisJICAgYW5kIGl0IG1heSBjb21lIGJhY2sgdXAgYmVjYXVzZSB1ZGhjcGMgaXMgc3RpbGwgc2h1dHRpbmcgZG93biAqLworCXVzbGVlcCgxMDAwMDApOworCXJlc3VsdCArPSBzdGF0aWNfZG93bihpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAzKSA/IDMgOiAwKTsKK30KKyMgZWxzZQorc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQgVU5VU0VEX1BBUkFNLAorCQlleGVjZm4gKmV4ZWMgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAwOyAvKiBubyBkaGNwIHN1cHBvcnQgKi8KK30KKyMgZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgbWFudWFsX3VwX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCBVTlVTRURfUEFSQU0sIGV4ZWNmbiAqZXhlYyBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJvb3RwX3VwKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlyZXR1cm4gZXhlY3V0ZSgiYm9vdHBjW1sgLS1ib290ZmlsZSAlYm9vdGZpbGUlXV0gLS1kZXYgJWlmYWNlJSIKKwkJCSJbWyAtLXNlcnZlciAlc2VydmVyJV1dW1sgLS1od2FkZHIgJWh3YWRkciVdXSIKKwkJCSIgLS1yZXR1cm5pZmZhaWwgLS1zZXJ2ZXJiY2FzdCIsIGlmZCwgZXhlYyk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHBwcF91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJcmV0dXJuIGV4ZWN1dGUoInBvbltbICVwcm92aWRlciVdXSIsIGlmZCwgZXhlYyk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHBwcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlyZXR1cm4gZXhlY3V0ZSgicG9mZltbICVwcm92aWRlciVdXSIsIGlmZCwgZXhlYyk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHd2ZGlhbF91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJcmV0dXJuIGV4ZWN1dGUoInN0YXJ0LXN0b3AtZGFlbW9uIC0tc3RhcnQgLXggd3ZkaWFsICIKKwkJIi1wIC92YXIvcnVuL3d2ZGlhbC4laWZhY2UlIC1iIC1tIC0tW1sgJXByb3ZpZGVyJV1dIiwgaWZkLCBleGVjKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgd3ZkaWFsX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXJldHVybiBleGVjdXRlKCJzdGFydC1zdG9wLWRhZW1vbiAtLXN0b3AgLXggd3ZkaWFsICIKKwkJCSItcCAvdmFyL3J1bi93dmRpYWwuJWlmYWNlJSAtcyAyIiwgaWZkLCBleGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZXRob2RfdCBtZXRob2RzW10gPSB7CisJeyAibWFudWFsIiAgLCBtYW51YWxfdXBfZG93biwgbWFudWFsX3VwX2Rvd24sIH0sCisJeyAid3ZkaWFsIiAgLCB3dmRpYWxfdXAgICAgICwgd3ZkaWFsX2Rvd24gICAsIH0sCisJeyAicHBwIiAgICAgLCBwcHBfdXAgICAgICAgICwgcHBwX2Rvd24gICAgICAsIH0sCisJeyAic3RhdGljIiAgLCBzdGF0aWNfdXAgICAgICwgc3RhdGljX2Rvd24gICAsIH0sCisJeyAiYm9vdHAiICAgLCBib290cF91cCAgICAgICwgc3RhdGljX2Rvd24gICAsIH0sCisJeyAiZGhjcCIgICAgLCBkaGNwX3VwICAgICAgICwgZGhjcF9kb3duICAgICAsIH0sCisJeyAibG9vcGJhY2siLCBsb29wYmFja191cCAgICwgbG9vcGJhY2tfZG93biAsIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgYWRkcl9pbmV0ID0geworCSJpbmV0IiwKKwlBUlJBWV9TSVpFKG1ldGhvZHMpLAorCW1ldGhvZHMKK307CisKKyNlbmRpZiAgLyogRkVBVFVSRV9JRlVQRE9XTl9JUFY0ICovCisKKworLyogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBuZXh0IHdvcmQsIG9yIE5VTEwuCisgKiBJbiAxc3QgY2FzZSwgYWR2YW5jZXMgKmJ1ZiB0byB0aGUgd29yZCBhZnRlciB0aGlzIG9uZS4KKyAqLworc3RhdGljIGNoYXIgKm5leHRfd29yZChjaGFyICoqYnVmKQoreworCXVuc2lnbmVkIGxlbmd0aDsKKwljaGFyICp3b3JkOworCisJLyogU2tpcCBvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworCXdvcmQgPSBza2lwX3doaXRlc3BhY2UoKmJ1Zik7CisKKwkvKiBTdG9wIG9uIEVPTCAqLworCWlmICgqd29yZCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHdvcmQgKGNhbid0IGJlIDApICovCisJbGVuZ3RoID0gc3RyY3Nwbih3b3JkLCAiIFx0XG4iKTsKKworCS8qIFVubGVzcyB3ZSBhcmUgYWxyZWFkeSBhdCBOVUwsIHN0b3JlIE5VTCBhbmQgYWR2YW5jZSAqLworCWlmICh3b3JkW2xlbmd0aF0gIT0gJ1wwJykKKwkJd29yZFtsZW5ndGgrK10gPSAnXDAnOworCisJKmJ1ZiA9IHNraXBfd2hpdGVzcGFjZSh3b3JkICsgbGVuZ3RoKTsKKworCXJldHVybiB3b3JkOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgKmdldF9hZGRyZXNzX2ZhbWlseShjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqY29uc3QgYWZbXSwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBhZltpXTsgaSsrKSB7CisJCWlmIChzdHJjbXAoYWZbaV0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCXJldHVybiBhZltpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZXRob2RfdCAqZ2V0X21ldGhvZChjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqYWYsIGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCS8qIFRPRE86IHVzZSBpbmRleF9pbl9zdHJfYXJyYXkoKSAqLworCWZvciAoaSA9IDA7IGkgPCBhZi0+bl9tZXRob2RzOyBpKyspIHsKKwkJaWYgKHN0cmNtcChhZi0+bWV0aG9kW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKwkJCXJldHVybiAmYWYtPm1ldGhvZFtpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCAqcmVhZF9pbnRlcmZhY2VzKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCS8qIExldCdzIHRyeSB0byBiZSBjb21wYXRpYmxlLgorCSAqCisJICogIm1hbiA1IGludGVyZmFjZXMiIHNheXM6CisJICogTGluZXMgc3RhcnRpbmcgd2l0aCAiIyIgYXJlIGlnbm9yZWQuIE5vdGUgdGhhdCBlbmQtb2YtbGluZQorCSAqIGNvbW1lbnRzIGFyZSBOT1Qgc3VwcG9ydGVkLCBjb21tZW50cyBtdXN0IGJlIG9uIGEgbGluZSBvZiB0aGVpciBvd24uCisJICogQSBsaW5lIG1heSBiZSBleHRlbmRlZCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMgYnkgbWFraW5nCisJICogdGhlIGxhc3QgY2hhcmFjdGVyIGEgYmFja3NsYXNoLgorCSAqCisJICogU2VlbiBlbHNld2hlcmUgaW4gZXhhbXBsZSBjb25maWcgZmlsZToKKwkgKiBBIGZpcnN0IG5vbi1ibGFuayAiIyIgY2hhcmFjdGVyIG1ha2VzIHRoZSByZXN0IG9mIHRoZSBsaW5lCisJICogYmUgaWdub3JlZC4gQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuIExpbmVzIG1heSBiZSBpbmRlbnRlZCBmcmVlbHkuCisJICogQSAiXCIgY2hhcmFjdGVyIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgbGluZSBpbmRpY2F0ZXMgdGhlIG5leHQgbGluZQorCSAqIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgY29udGludWF0aW9uIG9mIHRoZSBjdXJyZW50IG9uZS4KKwkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisJc3RydWN0IG1hcHBpbmdfZGVmbl90ICpjdXJybWFwID0gTlVMTDsKKyNlbmRpZgorCXN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICpjdXJyaWYgPSBOVUxMOworCXN0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCAqZGVmbjsKKwlGSUxFICpmOworCWNoYXIgKmJ1ZjsKKwljaGFyICpmaXJzdF93b3JkOworCWNoYXIgKnJlc3Rfb2ZfbGluZTsKKwllbnVtIHsgTk9ORSwgSUZBQ0UsIE1BUFBJTkcgfSBjdXJyZW50bHlfcHJvY2Vzc2luZyA9IE5PTkU7CisKKwlkZWZuID0geHphbGxvYyhzaXplb2YoKmRlZm4pKTsKKwlmID0geGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKworCXdoaWxlICgoYnVmID0geG1hbGxvY19mZ2V0bGluZShmKSkgIT0gTlVMTCkgeworI2lmIEVOQUJMRV9ERVNLVE9QCisJCS8qIFRyYWlsaW5nICJcIiBjb25jYXRlbmF0ZXMgbGluZXMgKi8KKwkJY2hhciAqcDsKKwkJd2hpbGUgKChwID0gbGFzdF9jaGFyX2lzKGJ1ZiwgJ1xcJykpICE9IE5VTEwpIHsKKwkJCSpwID0gJ1wwJzsKKwkJCXJlc3Rfb2ZfbGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZik7CisJCQlpZiAoIXJlc3Rfb2ZfbGluZSkKKwkJCQlicmVhazsKKwkJCXAgPSB4YXNwcmludGYoIiVzJXMiLCBidWYsIHJlc3Rfb2ZfbGluZSk7CisJCQlmcmVlKGJ1Zik7CisJCQlmcmVlKHJlc3Rfb2ZfbGluZSk7CisJCQlidWYgPSBwOworCQl9CisjZW5kaWYKKwkJcmVzdF9vZl9saW5lID0gYnVmOworCQlmaXJzdF93b3JkID0gbmV4dF93b3JkKCZyZXN0X29mX2xpbmUpOworCQlpZiAoIWZpcnN0X3dvcmQgfHwgKmZpcnN0X3dvcmQgPT0gJyMnKSB7CisJCQlmcmVlKGJ1Zik7CisJCQljb250aW51ZTsgLyogYmxhbmsvY29tbWVudCBsaW5lICovCisJCX0KKworCQlpZiAoc3RyY21wKGZpcnN0X3dvcmQsICJtYXBwaW5nIikgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKKwkJCWN1cnJtYXAgPSB4emFsbG9jKHNpemVvZigqY3Vycm1hcCkpOworCisJCQl3aGlsZSAoKGZpcnN0X3dvcmQgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSkpICE9IE5VTEwpIHsKKwkJCQljdXJybWFwLT5tYXRjaCA9IHhyZWFsbG9jX3ZlY3RvcihjdXJybWFwLT5tYXRjaCwgNCwgY3Vycm1hcC0+bl9tYXRjaGVzKTsKKwkJCQljdXJybWFwLT5tYXRjaFtjdXJybWFwLT5uX21hdGNoZXMrK10gPSB4c3RyZHVwKGZpcnN0X3dvcmQpOworCQkJfQorCQkJLypjdXJybWFwLT5tYXhfbWFwcGluZ3MgPSAwOyAtIGRvbmUgYnkgeHphbGxvYyAqLworCQkJLypjdXJybWFwLT5uX21hcHBpbmdzID0gMDsqLworCQkJLypjdXJybWFwLT5tYXBwaW5nID0gTlVMTDsqLworCQkJLypjdXJybWFwLT5zY3JpcHQgPSBOVUxMOyovCisJCQl7CisJCQkJc3RydWN0IG1hcHBpbmdfZGVmbl90ICoqd2hlcmUgPSAmZGVmbi0+bWFwcGluZ3M7CisJCQkJd2hpbGUgKCp3aGVyZSAhPSBOVUxMKSB7CisJCQkJCXdoZXJlID0gJigqd2hlcmUpLT5uZXh0OworCQkJCX0KKwkJCQkqd2hlcmUgPSBjdXJybWFwOworCQkJCS8qY3Vycm1hcC0+bmV4dCA9IE5VTEw7Ki8KKwkJCX0KKwkJCWRlYnVnX25vaXNlKCJBZGRlZCBtYXBwaW5nXG4iKTsKKyNlbmRpZgorCQkJY3VycmVudGx5X3Byb2Nlc3NpbmcgPSBNQVBQSU5HOworCQl9IGVsc2UgaWYgKHN0cmNtcChmaXJzdF93b3JkLCAiaWZhY2UiKSA9PSAwKSB7CisJCQlzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgKmNvbnN0IGFkZHJfZmFtc1tdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQVjQKKwkJCQkmYWRkcl9pbmV0LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNgorCQkJCSZhZGRyX2luZXQ2LAorI2VuZGlmCisJCQkJTlVMTAorCQkJfTsKKwkJCWNoYXIgKmlmYWNlX25hbWU7CisJCQljaGFyICphZGRyZXNzX2ZhbWlseV9uYW1lOworCQkJY2hhciAqbWV0aG9kX25hbWU7CisJCQlsbGlzdF90ICppZmFjZV9saXN0OworCisJCQljdXJyaWYgPSB4emFsbG9jKHNpemVvZigqY3VycmlmKSk7CisJCQlpZmFjZV9uYW1lID0gbmV4dF93b3JkKCZyZXN0X29mX2xpbmUpOworCQkJYWRkcmVzc19mYW1pbHlfbmFtZSA9IG5leHRfd29yZCgmcmVzdF9vZl9saW5lKTsKKwkJCW1ldGhvZF9uYW1lID0gbmV4dF93b3JkKCZyZXN0X29mX2xpbmUpOworCisJCQlpZiAobWV0aG9kX25hbWUgPT0gTlVMTCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIGZldyBwYXJhbWV0ZXJzIGZvciBsaW5lIFwiJXNcIiIsIGJ1Zik7CisKKwkJCS8qIHNoaXAgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwkJCXJlc3Rfb2ZfbGluZSA9IHNraXBfd2hpdGVzcGFjZShyZXN0X29mX2xpbmUpOworCisJCQlpZiAocmVzdF9vZl9saW5lWzBdICE9ICdcMCcgLyogJiYgcmVzdF9vZl9saW5lWzBdICE9ICcjJyAqLykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgcGFyYW1ldGVycyBcIiVzXCIiLCBidWYpOworCisJCQljdXJyaWYtPmlmYWNlID0geHN0cmR1cChpZmFjZV9uYW1lKTsKKworCQkJY3VycmlmLT5hZGRyZXNzX2ZhbWlseSA9IGdldF9hZGRyZXNzX2ZhbWlseShhZGRyX2ZhbXMsIGFkZHJlc3NfZmFtaWx5X25hbWUpOworCQkJaWYgKCFjdXJyaWYtPmFkZHJlc3NfZmFtaWx5KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIGFkZHJlc3MgdHlwZSBcIiVzXCIiLCBhZGRyZXNzX2ZhbWlseV9uYW1lKTsKKworCQkJY3VycmlmLT5tZXRob2QgPSBnZXRfbWV0aG9kKGN1cnJpZi0+YWRkcmVzc19mYW1pbHksIG1ldGhvZF9uYW1lKTsKKwkJCWlmICghY3VycmlmLT5tZXRob2QpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gbWV0aG9kIFwiJXNcIiIsIG1ldGhvZF9uYW1lKTsKKworCQkJZm9yIChpZmFjZV9saXN0ID0gZGVmbi0+aWZhY2VzOyBpZmFjZV9saXN0OyBpZmFjZV9saXN0ID0gaWZhY2VfbGlzdC0+bGluaykgeworCQkJCXN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICp0bXAgPSAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKikgaWZhY2VfbGlzdC0+ZGF0YTsKKwkJCQlpZiAoKHN0cmNtcCh0bXAtPmlmYWNlLCBjdXJyaWYtPmlmYWNlKSA9PSAwKQorCQkJCSAmJiAodG1wLT5hZGRyZXNzX2ZhbWlseSA9PSBjdXJyaWYtPmFkZHJlc3NfZmFtaWx5KQorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZHVwbGljYXRlIGludGVyZmFjZSBcIiVzXCIiLCB0bXAtPmlmYWNlKTsKKwkJCQl9CisJCQl9CisJCQlsbGlzdF9hZGRfdG9fZW5kKCYoZGVmbi0+aWZhY2VzKSwgKGNoYXIqKWN1cnJpZik7CisKKwkJCWRlYnVnX25vaXNlKCJpZmFjZSAlcyAlcyAlc1xuIiwgY3VycmlmLT5pZmFjZSwgYWRkcmVzc19mYW1pbHlfbmFtZSwgbWV0aG9kX25hbWUpOworCQkJY3VycmVudGx5X3Byb2Nlc3NpbmcgPSBJRkFDRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoZmlyc3Rfd29yZCwgImF1dG8iKSA9PSAwKSB7CisJCQl3aGlsZSAoKGZpcnN0X3dvcmQgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSkpICE9IE5VTEwpIHsKKworCQkJCS8qIENoZWNrIHRoZSBpbnRlcmZhY2UgaXNudCBhbHJlYWR5IGxpc3RlZCAqLworCQkJCWlmIChsbGlzdF9maW5kX3N0cihkZWZuLT5hdXRvaW50ZXJmYWNlcywgZmlyc3Rfd29yZCkpIHsKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpbnRlcmZhY2UgZGVjbGFyZWQgYXV0byB0d2ljZSBcIiVzXCIiLCBidWYpOworCQkJCX0KKworCQkJCS8qIEFkZCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBsaXN0ICovCisJCQkJbGxpc3RfYWRkX3RvX2VuZCgmKGRlZm4tPmF1dG9pbnRlcmZhY2VzKSwgeHN0cmR1cChmaXJzdF93b3JkKSk7CisJCQkJZGVidWdfbm9pc2UoIlxuYXV0byAlc1xuIiwgZmlyc3Rfd29yZCk7CisJCQl9CisJCQljdXJyZW50bHlfcHJvY2Vzc2luZyA9IE5PTkU7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGN1cnJlbnRseV9wcm9jZXNzaW5nKSB7CisJCQljYXNlIElGQUNFOgorCQkJCWlmIChyZXN0X29mX2xpbmVbMF0gPT0gJ1wwJykKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9wdGlvbiB3aXRoIGVtcHR5IHZhbHVlIFwiJXNcIiIsIGJ1Zik7CisKKwkJCQlpZiAoc3RyY21wKGZpcnN0X3dvcmQsICJ1cCIpICE9IDAKKwkJCQkgJiYgc3RyY21wKGZpcnN0X3dvcmQsICJkb3duIikgIT0gMAorCQkJCSAmJiBzdHJjbXAoZmlyc3Rfd29yZCwgInByZS11cCIpICE9IDAKKwkJCQkgJiYgc3RyY21wKGZpcnN0X3dvcmQsICJwb3N0LWRvd24iKSAhPSAwCisJCQkJKSB7CisJCQkJCWludCBpOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgY3VycmlmLT5uX29wdGlvbnM7IGkrKykgeworCQkJCQkJaWYgKHN0cmNtcChjdXJyaWYtPm9wdGlvbltpXS5uYW1lLCBmaXJzdF93b3JkKSA9PSAwKQorCQkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdXBsaWNhdGUgb3B0aW9uIFwiJXNcIiIsIGJ1Zik7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGN1cnJpZi0+bl9vcHRpb25zID49IGN1cnJpZi0+bWF4X29wdGlvbnMpIHsKKwkJCQkJY3VycmlmLT5tYXhfb3B0aW9ucyArPSAxMDsKKwkJCQkJY3VycmlmLT5vcHRpb24gPSB4cmVhbGxvYyhjdXJyaWYtPm9wdGlvbiwKKwkJCQkJCXNpemVvZigqY3VycmlmLT5vcHRpb24pICogY3VycmlmLT5tYXhfb3B0aW9ucyk7CisJCQkJfQorCQkJCWRlYnVnX25vaXNlKCJcdCVzPSVzXG4iLCBmaXJzdF93b3JkLCByZXN0X29mX2xpbmUpOworCQkJCWN1cnJpZi0+b3B0aW9uW2N1cnJpZi0+bl9vcHRpb25zXS5uYW1lID0geHN0cmR1cChmaXJzdF93b3JkKTsKKwkJCQljdXJyaWYtPm9wdGlvbltjdXJyaWYtPm5fb3B0aW9uc10udmFsdWUgPSB4c3RyZHVwKHJlc3Rfb2ZfbGluZSk7CisJCQkJY3VycmlmLT5uX29wdGlvbnMrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUFQUElORzoKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisJCQkJaWYgKHN0cmNtcChmaXJzdF93b3JkLCAic2NyaXB0IikgPT0gMCkgeworCQkJCQlpZiAoY3Vycm1hcC0+c2NyaXB0ICE9IE5VTEwpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZHVwbGljYXRlIHNjcmlwdCBpbiBtYXBwaW5nIFwiJXNcIiIsIGJ1Zik7CisJCQkJCWN1cnJtYXAtPnNjcmlwdCA9IHhzdHJkdXAobmV4dF93b3JkKCZyZXN0X29mX2xpbmUpKTsKKwkJCQl9IGVsc2UgaWYgKHN0cmNtcChmaXJzdF93b3JkLCAibWFwIikgPT0gMCkgeworCQkJCQlpZiAoY3Vycm1hcC0+bl9tYXBwaW5ncyA+PSBjdXJybWFwLT5tYXhfbWFwcGluZ3MpIHsKKwkJCQkJCWN1cnJtYXAtPm1heF9tYXBwaW5ncyA9IGN1cnJtYXAtPm1heF9tYXBwaW5ncyAqIDIgKyAxOworCQkJCQkJY3Vycm1hcC0+bWFwcGluZyA9IHhyZWFsbG9jKGN1cnJtYXAtPm1hcHBpbmcsCisJCQkJCQkJc2l6ZW9mKGNoYXIgKikgKiBjdXJybWFwLT5tYXhfbWFwcGluZ3MpOworCQkJCQl9CisJCQkJCWN1cnJtYXAtPm1hcHBpbmdbY3Vycm1hcC0+bl9tYXBwaW5nc10gPSB4c3RyZHVwKG5leHRfd29yZCgmcmVzdF9vZl9saW5lKSk7CisJCQkJCWN1cnJtYXAtPm5fbWFwcGluZ3MrKzsKKwkJCQl9IGVsc2UgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzcGxhY2VkIG9wdGlvbiBcIiVzXCIiLCBidWYpOworCQkJCX0KKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSBOT05FOgorCQkJZGVmYXVsdDoKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzcGxhY2VkIG9wdGlvbiBcIiVzXCIiLCBidWYpOworCQkJfQorCQl9CisJCWZyZWUoYnVmKTsKKwl9IC8qIHdoaWxlIChmZ2V0cykgKi8KKworCWlmIChmZXJyb3IoZikgIT0gMCkgeworCQkvKiBmZXJyb3IgZG9lcyBOT1Qgc2V0IGVycm5vISAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IEkvTyBlcnJvciIsIGZpbGVuYW1lKTsKKwl9CisJZmNsb3NlKGYpOworCisJcmV0dXJuIGRlZm47Cit9CisKK3N0YXRpYyBjaGFyICpzZXRsb2NhbGVudihjb25zdCBjaGFyICpmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWNoYXIgKnJlc3VsdDsKKwljaGFyICpkc3Q7CisJY2hhciAqc3JjOworCWNoYXIgYzsKKworCXJlc3VsdCA9IHhhc3ByaW50Zihmb3JtYXQsIG5hbWUsIHZhbHVlKTsKKworCWZvciAoZHN0ID0gc3JjID0gcmVzdWx0OyAoYyA9ICpzcmMpICE9ICc9JyAmJiBjOyBzcmMrKykgeworCQlpZiAoYyA9PSAnLScpCisJCQljID0gJ18nOworCQlpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJCQljIC09ICgnYScgLSAnQScpOworCQlpZiAoaXNhbG51bShjKSB8fCBjID09ICdfJykKKwkJCSpkc3QrKyA9IGM7CisJfQorCW92ZXJsYXBwaW5nX3N0cmNweShkc3QsIHNyYyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzZXRfZW52aXJvbihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZhY2UsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisJaW50IGk7CisJY2hhciAqKnBwOworCisJaWYgKEcubXlfZW52aXJvbiAhPSBOVUxMKSB7CisJCWZvciAocHAgPSBHLm15X2Vudmlyb247ICpwcDsgcHArKykgeworCQkJZnJlZSgqcHApOworCQl9CisJCWZyZWUoRy5teV9lbnZpcm9uKTsKKwl9CisKKwkvKiBub3RlOiBsYXN0IGVsZW1lbnQgd2lsbCBzdGF5IE5VTEw6ICovCisJRy5teV9lbnZpcm9uID0geHphbGxvYyhzaXplb2YoY2hhciAqKSAqIChpZmFjZS0+bl9vcHRpb25zICsgNikpOworCXBwID0gRy5teV9lbnZpcm9uOworCisJZm9yIChpID0gMDsgaSA8IGlmYWNlLT5uX29wdGlvbnM7IGkrKykgeworCQlpZiAoc3RyY21wKGlmYWNlLT5vcHRpb25baV0ubmFtZSwgInVwIikgPT0gMAorCQkgfHwgc3RyY21wKGlmYWNlLT5vcHRpb25baV0ubmFtZSwgImRvd24iKSA9PSAwCisJCSB8fCBzdHJjbXAoaWZhY2UtPm9wdGlvbltpXS5uYW1lLCAicHJlLXVwIikgPT0gMAorCQkgfHwgc3RyY21wKGlmYWNlLT5vcHRpb25baV0ubmFtZSwgInBvc3QtZG93biIpID09IDAKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorCQkqcHArKyA9IHNldGxvY2FsZW52KCJJRl8lcz0lcyIsIGlmYWNlLT5vcHRpb25baV0ubmFtZSwgaWZhY2UtPm9wdGlvbltpXS52YWx1ZSk7CisJfQorCisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiSUZBQ0UiLCBpZmFjZS0+aWZhY2UpOworCSpwcCsrID0gc2V0bG9jYWxlbnYoIiVzPSVzIiwgIkFERFJGQU0iLCBpZmFjZS0+YWRkcmVzc19mYW1pbHktPm5hbWUpOworCSpwcCsrID0gc2V0bG9jYWxlbnYoIiVzPSVzIiwgIk1FVEhPRCIsIGlmYWNlLT5tZXRob2QtPm5hbWUpOworCSpwcCsrID0gc2V0bG9jYWxlbnYoIiVzPSVzIiwgIk1PREUiLCBtb2RlKTsKKwlpZiAoRy5zdGFydHVwX1BBVEgpCisJCSpwcCsrID0gc2V0bG9jYWxlbnYoIiVzPSVzIiwgIlBBVEgiLCBHLnN0YXJ0dXBfUEFUSCk7Cit9CisKK3N0YXRpYyBpbnQgZG9pdChjaGFyICpzdHIpCit7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX25vX2FjdHxPUFRfdmVyYm9zZSkpIHsKKwkJcHV0cyhzdHIpOworCX0KKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX25vX2FjdCkpIHsKKwkJcGlkX3QgY2hpbGQ7CisJCWludCBzdGF0dXM7CisKKwkJZmZsdXNoX2FsbCgpOworCQljaGlsZCA9IHZmb3JrKCk7CisJCWlmIChjaGlsZCA8IDApIC8qIGZhaWx1cmUgKi8KKwkJCXJldHVybiAwOworCQlpZiAoY2hpbGQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQkJZXhlY2xlKEcuc2hlbGwsIEcuc2hlbGwsICItYyIsIHN0ciwgKGNoYXIgKikgTlVMTCwgRy5teV9lbnZpcm9uKTsKKwkJCV9leGl0KDEyNyk7CisJCX0KKwkJc2FmZV93YWl0cGlkKGNoaWxkLCAmc3RhdHVzLCAwKTsKKwkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpICE9IDApIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGV4ZWN1dGVfYWxsKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGNvbnN0IGNoYXIgKm9wdCkKK3sKKwlpbnQgaTsKKwljaGFyICpidWY7CisJZm9yIChpID0gMDsgaSA8IGlmZC0+bl9vcHRpb25zOyBpKyspIHsKKwkJaWYgKHN0cmNtcChpZmQtPm9wdGlvbltpXS5uYW1lLCBvcHQpID09IDApIHsKKwkJCWlmICghZG9pdChpZmQtPm9wdGlvbltpXS52YWx1ZSkpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCWJ1ZiA9IHhhc3ByaW50ZigicnVuLXBhcnRzIC9ldGMvbmV0d29yay9pZi0lcy5kIiwgb3B0KTsKKwkvKiBoZWgsIHdlIGRvbid0IGJvdGhlciBmcmVlJ2luZyBpdCAqLworCXJldHVybiBkb2l0KGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY2hhciAqc3RyKQoreworCXJldHVybiBzdHIgIT0gTlVMTDsKK30KKworc3RhdGljIGludCBpZmFjZV91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZhY2UpCit7CisJaWYgKCFpZmFjZS0+bWV0aG9kLT51cChpZmFjZSwgY2hlY2spKSByZXR1cm4gLTE7CisJc2V0X2Vudmlyb24oaWZhY2UsICJzdGFydCIpOworCWlmICghZXhlY3V0ZV9hbGwoaWZhY2UsICJwcmUtdXAiKSkgcmV0dXJuIDA7CisJaWYgKCFpZmFjZS0+bWV0aG9kLT51cChpZmFjZSwgZG9pdCkpIHJldHVybiAwOworCWlmICghZXhlY3V0ZV9hbGwoaWZhY2UsICJ1cCIpKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpZmFjZV9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmFjZSkKK3sKKwlpZiAoIWlmYWNlLT5tZXRob2QtPmRvd24oaWZhY2UsY2hlY2spKSByZXR1cm4gLTE7CisJc2V0X2Vudmlyb24oaWZhY2UsICJzdG9wIik7CisJaWYgKCFleGVjdXRlX2FsbChpZmFjZSwgImRvd24iKSkgcmV0dXJuIDA7CisJaWYgKCFpZmFjZS0+bWV0aG9kLT5kb3duKGlmYWNlLCBkb2l0KSkgcmV0dXJuIDA7CisJaWYgKCFleGVjdXRlX2FsbChpZmFjZSwgInBvc3QtZG93biIpKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKK3N0YXRpYyBpbnQgcG9wZW4yKEZJTEUgKippbiwgRklMRSAqKm91dCwgY2hhciAqY29tbWFuZCwgY2hhciAqcGFyYW0pCit7CisJY2hhciAqYXJndlszXSA9IHsgY29tbWFuZCwgcGFyYW0sIE5VTEwgfTsKKwlzdHJ1Y3QgZmRfcGFpciBpbmZkLCBvdXRmZDsKKwlwaWRfdCBwaWQ7CisKKwl4cGlwZWRfcGFpcihpbmZkKTsKKwl4cGlwZWRfcGFpcihvdXRmZCk7CisKKwlmZmx1c2hfYWxsKCk7CisJcGlkID0geHZmb3JrKCk7CisKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ2hpbGQgKi8KKwkJLyogTkI6IGNsb3NlIF9maXJzdF8sIHRoZW4gbW92ZSBmZHMhICovCisJCWNsb3NlKGluZmQud3IpOworCQljbG9zZShvdXRmZC5yZCk7CisJCXhtb3ZlX2ZkKGluZmQucmQsIDApOworCQl4bW92ZV9mZChvdXRmZC53ciwgMSk7CisJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJfQorCS8qIHBhcmVudCAqLworCWNsb3NlKGluZmQucmQpOworCWNsb3NlKG91dGZkLndyKTsKKwkqaW4gPSB4ZmRvcGVuX2Zvcl93cml0ZShpbmZkLndyKTsKKwkqb3V0ID0geGZkb3Blbl9mb3JfcmVhZChvdXRmZC5yZCk7CisJcmV0dXJuIHBpZDsKK30KKworc3RhdGljIGNoYXIgKnJ1bl9tYXBwaW5nKGNoYXIgKnBoeXNpY2FsLCBzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKm1hcCkKK3sKKwlGSUxFICppbiwgKm91dDsKKwlpbnQgaSwgc3RhdHVzOworCXBpZF90IHBpZDsKKworCWNoYXIgKmxvZ2ljYWwgPSB4c3RyZHVwKHBoeXNpY2FsKTsKKworCS8qIFJ1biB0aGUgbWFwcGluZyBzY3JpcHQuIE5ldmVyIGZhaWxzLiAqLworCXBpZCA9IHBvcGVuMigmaW4sICZvdXQsIG1hcC0+c2NyaXB0LCBwaHlzaWNhbCk7CisKKwkvKiBXcml0ZSBtYXBwaW5ncyB0byBzdGRpbiBvZiBtYXBwaW5nIHNjcmlwdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWFwLT5uX21hcHBpbmdzOyBpKyspIHsKKwkJZnByaW50ZihpbiwgIiVzXG4iLCBtYXAtPm1hcHBpbmdbaV0pOworCX0KKwlmY2xvc2UoaW4pOworCXNhZmVfd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgeworCQkvKiBJZiB0aGUgbWFwcGluZyBzY3JpcHQgZXhpdGVkIHN1Y2Nlc3NmdWxseSwgdHJ5IHRvCisJCSAqIGdyYWIgYSBsaW5lIG9mIG91dHB1dCBhbmQgdXNlIHRoYXQgYXMgdGhlIG5hbWUgb2YgdGhlCisJCSAqIGxvZ2ljYWwgaW50ZXJmYWNlLiAqLworCQljaGFyICpuZXdfbG9naWNhbCA9IHhtYWxsb2NfZmdldGxpbmUob3V0KTsKKworCQlpZiAobmV3X2xvZ2ljYWwpIHsKKwkJCS8qIElmIHdlIGFyZSBhYmxlIHRvIHJlYWQgYSBsaW5lIG9mIG91dHB1dCBmcm9tIHRoZSBzY3JpcHQsCisJCQkgKiByZW1vdmUgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIHVzZSB0aGlzIHZhbHVlCisJCQkgKiBhcyB0aGUgbmFtZSBvZiB0aGUgbG9naWNhbCBpbnRlcmZhY2UuICovCisJCQljaGFyICpwY2ggPSBuZXdfbG9naWNhbCArIHN0cmxlbihuZXdfbG9naWNhbCkgLSAxOworCisJCQl3aGlsZSAocGNoID49IG5ld19sb2dpY2FsICYmIGlzc3BhY2UoKnBjaCkpCisJCQkJKihwY2gtLSkgPSAnXDAnOworCisJCQlmcmVlKGxvZ2ljYWwpOworCQkJbG9naWNhbCA9IG5ld19sb2dpY2FsOworCQl9CisJfQorCisJZmNsb3NlKG91dCk7CisKKwlyZXR1cm4gbG9naWNhbDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgKi8KKworc3RhdGljIGxsaXN0X3QgKmZpbmRfaWZhY2Vfc3RhdGUobGxpc3RfdCAqc3RhdGVfbGlzdCwgY29uc3QgY2hhciAqaWZhY2UpCit7CisJdW5zaWduZWQgaWZhY2VfbGVuID0gc3RybGVuKGlmYWNlKTsKKwlsbGlzdF90ICpzZWFyY2ggPSBzdGF0ZV9saXN0OworCisJd2hpbGUgKHNlYXJjaCkgeworCQlpZiAoKHN0cm5jbXAoc2VhcmNoLT5kYXRhLCBpZmFjZSwgaWZhY2VfbGVuKSA9PSAwKQorCQkgJiYgKHNlYXJjaC0+ZGF0YVtpZmFjZV9sZW5dID09ICc9JykKKwkJKSB7CisJCQlyZXR1cm4gc2VhcmNoOworCQl9CisJCXNlYXJjaCA9IHNlYXJjaC0+bGluazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHJlYWQgdGhlIHByZXZpb3VzIHN0YXRlIGZyb20gdGhlIHN0YXRlIGZpbGUgKi8KK3N0YXRpYyBsbGlzdF90ICpyZWFkX2lmYWNlX3N0YXRlKHZvaWQpCit7CisJbGxpc3RfdCAqc3RhdGVfbGlzdCA9IE5VTEw7CisJRklMRSAqc3RhdGVfZnAgPSBmb3Blbl9mb3JfcmVhZChDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIKTsKKworCWlmIChzdGF0ZV9mcCkgeworCQljaGFyICpzdGFydCwgKmVuZF9wdHI7CisJCXdoaWxlICgoc3RhcnQgPSB4bWFsbG9jX2ZnZXRzKHN0YXRlX2ZwKSkgIT0gTlVMTCkgeworCQkJLyogV2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBjaGVjayBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyICovCisJCQllbmRfcHRyID0gc3RhcnQgKyBzdHJjc3BuKHN0YXJ0LCAiIFx0XG4iKTsKKwkJCSplbmRfcHRyID0gJ1wwJzsKKwkJCWxsaXN0X2FkZF90bygmc3RhdGVfbGlzdCwgc3RhcnQpOworCQl9CisJCWZjbG9zZShzdGF0ZV9mcCk7CisJfQorCXJldHVybiBzdGF0ZV9saXN0OworfQorCisKK2ludCBpZnVwZG93bl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaWZ1cGRvd25fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCAoKmNtZHMpKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICopOworCXN0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCAqZGVmbjsKKwlsbGlzdF90ICp0YXJnZXRfbGlzdCA9IE5VTEw7CisJY29uc3QgY2hhciAqaW50ZXJmYWNlcyA9ICIvZXRjL25ldHdvcmsvaW50ZXJmYWNlcyI7CisJYm9vbCBhbnlfZmFpbHVyZXMgPSAwOworCisJSU5JVF9HKCk7CisKKwlHLnN0YXJ0dXBfUEFUSCA9IGdldGVudigiUEFUSCIpOworCUcuc2hlbGwgPSB4c3RyZHVwKGdldF9zaGVsbF9uYW1lKCkpOworCisJY21kcyA9IGlmYWNlX2Rvd247CisJaWYgKGFwcGxldF9uYW1lWzJdID09ICd1JykgeworCQkvKiBpZnVwIGNvbW1hbmQgKi8KKwkJY21kcyA9IGlmYWNlX3VwOworCX0KKworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsICZpbnRlcmZhY2VzKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlswXSkgeworCQlpZiAoRE9fQUxMKSBiYl9zaG93X3VzYWdlKCk7CisJfSBlbHNlIHsKKwkJaWYgKCFET19BTEwpIGJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlkZWJ1Z19ub2lzZSgicmVhZGluZyAlcyBmaWxlOlxuIiwgaW50ZXJmYWNlcyk7CisJZGVmbiA9IHJlYWRfaW50ZXJmYWNlcyhpbnRlcmZhY2VzKTsKKwlkZWJ1Z19ub2lzZSgiXG5kb25lIHJlYWRpbmcgJXNcblxuIiwgaW50ZXJmYWNlcyk7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGludGVyZmFjZXMgdG8gd29yayBvbiAqLworCWlmIChET19BTEwpIHsKKwkJdGFyZ2V0X2xpc3QgPSBkZWZuLT5hdXRvaW50ZXJmYWNlczsKKwl9IGVsc2UgeworCQlsbGlzdF9hZGRfdG9fZW5kKCZ0YXJnZXRfbGlzdCwgYXJndlswXSk7CisJfQorCisJLyogVXBkYXRlIHRoZSBpbnRlcmZhY2VzICovCisJd2hpbGUgKHRhcmdldF9saXN0KSB7CisJCWxsaXN0X3QgKmlmYWNlX2xpc3Q7CisJCXN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICpjdXJyaWY7CisJCWNoYXIgKmlmYWNlOworCQljaGFyICpsaWZhY2U7CisJCWNoYXIgKnBjaDsKKwkJYm9vbCBva2F5ID0gMDsKKwkJaW50IGNtZHNfcmV0OworCisJCWlmYWNlID0geHN0cmR1cCh0YXJnZXRfbGlzdC0+ZGF0YSk7CisJCXRhcmdldF9saXN0ID0gdGFyZ2V0X2xpc3QtPmxpbms7CisKKwkJcGNoID0gc3RyY2hyKGlmYWNlLCAnPScpOworCQlpZiAocGNoKSB7CisJCQkqcGNoID0gJ1wwJzsKKwkJCWxpZmFjZSA9IHhzdHJkdXAocGNoICsgMSk7CisJCX0gZWxzZSB7CisJCQlsaWZhY2UgPSB4c3RyZHVwKGlmYWNlKTsKKwkJfQorCisJCWlmICghRk9SQ0UpIHsKKwkJCWxsaXN0X3QgKnN0YXRlX2xpc3QgPSByZWFkX2lmYWNlX3N0YXRlKCk7CisJCQljb25zdCBsbGlzdF90ICppZmFjZV9zdGF0ZSA9IGZpbmRfaWZhY2Vfc3RhdGUoc3RhdGVfbGlzdCwgaWZhY2UpOworCisJCQlpZiAoY21kcyA9PSBpZmFjZV91cCkgeworCQkJCS8qIGlmdXAgKi8KKwkJCQlpZiAoaWZhY2Vfc3RhdGUpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJpbnRlcmZhY2UgJXMgYWxyZWFkeSBjb25maWd1cmVkIiwgaWZhY2UpOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBpZmRvd24gKi8KKwkJCQlpZiAoIWlmYWNlX3N0YXRlKSB7CisJCQkJCWJiX2Vycm9yX21zZygiaW50ZXJmYWNlICVzIG5vdCBjb25maWd1cmVkIiwgaWZhY2UpOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJbGxpc3RfZnJlZShzdGF0ZV9saXN0LCBmcmVlKTsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworCQlpZiAoKGNtZHMgPT0gaWZhY2VfdXApICYmICFOT19NQVBQSU5HUykgeworCQkJc3RydWN0IG1hcHBpbmdfZGVmbl90ICpjdXJybWFwOworCisJCQlmb3IgKGN1cnJtYXAgPSBkZWZuLT5tYXBwaW5nczsgY3Vycm1hcDsgY3Vycm1hcCA9IGN1cnJtYXAtPm5leHQpIHsKKwkJCQlpbnQgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY3Vycm1hcC0+bl9tYXRjaGVzOyBpKyspIHsKKwkJCQkJaWYgKGZubWF0Y2goY3Vycm1hcC0+bWF0Y2hbaV0sIGxpZmFjZSwgMCkgIT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoVkVSQk9TRSkgeworCQkJCQkJcHJpbnRmKCJSdW5uaW5nIG1hcHBpbmcgc2NyaXB0ICVzIG9uICVzXG4iLCBjdXJybWFwLT5zY3JpcHQsIGxpZmFjZSk7CisJCQkJCX0KKwkJCQkJbGlmYWNlID0gcnVuX21hcHBpbmcoaWZhY2UsIGN1cnJtYXApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWlmYWNlX2xpc3QgPSBkZWZuLT5pZmFjZXM7CisJCXdoaWxlIChpZmFjZV9saXN0KSB7CisJCQljdXJyaWYgPSAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKikgaWZhY2VfbGlzdC0+ZGF0YTsKKwkJCWlmIChzdHJjbXAobGlmYWNlLCBjdXJyaWYtPmlmYWNlKSA9PSAwKSB7CisJCQkJY2hhciAqb2xkaWZhY2UgPSBjdXJyaWYtPmlmYWNlOworCisJCQkJb2theSA9IDE7CisJCQkJY3VycmlmLT5pZmFjZSA9IGlmYWNlOworCisJCQkJZGVidWdfbm9pc2UoIlxuQ29uZmlndXJpbmcgaW50ZXJmYWNlICVzICglcylcbiIsIGxpZmFjZSwgY3VycmlmLT5hZGRyZXNzX2ZhbWlseS0+bmFtZSk7CisKKwkJCQkvKiBDYWxsIHRoZSBjbWRzIGZ1bmN0aW9uIHBvaW50ZXIsIGRvZXMgZWl0aGVyIGlmYWNlX3VwKCkgb3IgaWZhY2VfZG93bigpICovCisJCQkJY21kc19yZXQgPSBjbWRzKGN1cnJpZik7CisJCQkJaWYgKGNtZHNfcmV0ID09IC0xKSB7CisJCQkJCWJiX2Vycm9yX21zZygiZG9uJ3Qgc2VlbSB0byBoYXZlIGFsbCB0aGUgdmFyaWFibGVzIGZvciAlcy8lcyIsCisJCQkJCQkJbGlmYWNlLCBjdXJyaWYtPmFkZHJlc3NfZmFtaWx5LT5uYW1lKTsKKwkJCQkJYW55X2ZhaWx1cmVzID0gMTsKKwkJCQl9IGVsc2UgaWYgKGNtZHNfcmV0ID09IDApIHsKKwkJCQkJYW55X2ZhaWx1cmVzID0gMTsKKwkJCQl9CisKKwkJCQljdXJyaWYtPmlmYWNlID0gb2xkaWZhY2U7CisJCQl9CisJCQlpZmFjZV9saXN0ID0gaWZhY2VfbGlzdC0+bGluazsKKwkJfQorCQlpZiAoVkVSQk9TRSkgeworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCisJCWlmICghb2theSAmJiAhRk9SQ0UpIHsKKwkJCWJiX2Vycm9yX21zZygiaWdub3JpbmcgdW5rbm93biBpbnRlcmZhY2UgJXMiLCBsaWZhY2UpOworCQkJYW55X2ZhaWx1cmVzID0gMTsKKwkJfSBlbHNlIGlmICghTk9fQUNUKSB7CisJCQkvKiB1cGRhdGUgdGhlIHN0YXRlIGZpbGUgKi8KKwkJCUZJTEUgKnN0YXRlX2ZwOworCQkJbGxpc3RfdCAqc3RhdGU7CisJCQlsbGlzdF90ICpzdGF0ZV9saXN0ID0gcmVhZF9pZmFjZV9zdGF0ZSgpOworCQkJbGxpc3RfdCAqaWZhY2Vfc3RhdGUgPSBmaW5kX2lmYWNlX3N0YXRlKHN0YXRlX2xpc3QsIGlmYWNlKTsKKworCQkJaWYgKGNtZHMgPT0gaWZhY2VfdXApIHsKKwkJCQljaGFyICogY29uc3QgbmV3aWZhY2UgPSB4YXNwcmludGYoIiVzPSVzIiwgaWZhY2UsIGxpZmFjZSk7CisJCQkJaWYgKGlmYWNlX3N0YXRlID09IE5VTEwpIHsKKwkJCQkJbGxpc3RfYWRkX3RvX2VuZCgmc3RhdGVfbGlzdCwgbmV3aWZhY2UpOworCQkJCX0gZWxzZSB7CisJCQkJCWZyZWUoaWZhY2Vfc3RhdGUtPmRhdGEpOworCQkJCQlpZmFjZV9zdGF0ZS0+ZGF0YSA9IG5ld2lmYWNlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogUmVtb3ZlIGFuIGludGVyZmFjZSBmcm9tIHN0YXRlX2xpc3QgKi8KKwkJCQlsbGlzdF91bmxpbmsoJnN0YXRlX2xpc3QsIGlmYWNlX3N0YXRlKTsKKwkJCQlmcmVlKGxsaXN0X3BvcCgmaWZhY2Vfc3RhdGUpKTsKKwkJCX0KKworCQkJLyogQWN0dWFsbHkgd3JpdGUgdGhlIG5ldyBzdGF0ZSAqLworCQkJc3RhdGVfZnAgPSB4Zm9wZW5fZm9yX3dyaXRlKENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEgpOworCQkJc3RhdGUgPSBzdGF0ZV9saXN0OworCQkJd2hpbGUgKHN0YXRlKSB7CisJCQkJaWYgKHN0YXRlLT5kYXRhKSB7CisJCQkJCWZwcmludGYoc3RhdGVfZnAsICIlc1xuIiwgc3RhdGUtPmRhdGEpOworCQkJCX0KKwkJCQlzdGF0ZSA9IHN0YXRlLT5saW5rOworCQkJfQorCQkJZmNsb3NlKHN0YXRlX2ZwKTsKKwkJCWxsaXN0X2ZyZWUoc3RhdGVfbGlzdCwgZnJlZSk7CisJCX0KKyBuZXh0OgorCQlmcmVlKGlmYWNlKTsKKwkJZnJlZShsaWZhY2UpOworCX0KKworCXJldHVybiBhbnlfZmFpbHVyZXM7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2luZXRkLmMgYi9uZXR3b3JraW5nL2luZXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaW5ldGQuYwpAQCAtMCwwICsxLDE2MzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogICAgICAkU2xhY2t3YXJlOiBpbmV0ZC5jIDEuNzlzIDIwMDEvMDIvMDYgMTM6MTg6MDAgdm9sa2VyZGkgRXhwICQgICAgKi8KKy8qICAgICAgJE9wZW5CU0Q6IGluZXRkLmMsdiAxLjc5IDIwMDEvMDEvMzAgMDg6MzA6NTcgZGVyYWFkdCBFeHAgJCAgICAgICovCisvKiAgICAgICROZXRCU0Q6IGluZXRkLmMsdiAxLjExIDE5OTYvMDIvMjIgMTE6MTQ6NDEgbXljcm9mdCBFeHAgJCAgICAgICAqLworLyogQnVzeWJveCBwb3J0IGJ5IFZsYWRpbWlyIE9sZXluaWsgKEMpIDIwMDEtMjAwNSA8ZHpvQHNpbXRyZWFzLnJ1PiAgICAgKi8KKy8qIElQdjYgc3VwcG9ydCwgbWFueSBidWcgZml4ZXMgYnkgRGVueXMgVmxhc2Vua28gKGMpIDIwMDggKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogSW5ldGQgLSBJbnRlcm5ldCBzdXBlci1zZXJ2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaW52b2tlcyBjb25maWd1cmVkIHNlcnZpY2VzIHdoZW4gYSBjb25uZWN0aW9uCisgKiBmcm9tIGEgcGVlciBpcyBlc3RhYmxpc2hlZCBvciBhIGRhdGFncmFtIGFycml2ZXMuCisgKiBDb25uZWN0aW9uLW9yaWVudGVkIHNlcnZpY2VzIGFyZSBpbnZva2VkIGVhY2ggdGltZSBhCisgKiBjb25uZWN0aW9uIGlzIG1hZGUsIGJ5IGNyZWF0aW5nIGEgcHJvY2Vzcy4gIFRoaXMgcHJvY2VzcworICogaXMgcGFzc2VkIHRoZSBjb25uZWN0aW9uIGFzIGZpbGUgZGVzY3JpcHRvciAwIGFuZCBpcworICogZXhwZWN0ZWQgdG8gZG8gYSBnZXRwZWVybmFtZSB0byBmaW5kIG91dCBwZWVyJ3MgaG9zdAorICogYW5kIHBvcnQuCisgKiBEYXRhZ3JhbSBvcmllbnRlZCBzZXJ2aWNlcyBhcmUgaW52b2tlZCB3aGVuIGEgZGF0YWdyYW0KKyAqIGFycml2ZXM7IGEgcHJvY2VzcyBpcyBjcmVhdGVkIGFuZCBwYXNzZWQgYSBwZW5kaW5nIG1lc3NhZ2UKKyAqIG9uIGZpbGUgZGVzY3JpcHRvciAwLiBwZWVyJ3MgYWRkcmVzcyBjYW4gYmUgb2J0YWluZWQKKyAqIHVzaW5nIHJlY3Zmcm9tLgorICoKKyAqIEluZXRkIHVzZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaXMgcmVhZCBhdCBzdGFydHVwCisgKiBhbmQsIHBvc3NpYmx5LCBhdCBzb21lIGxhdGVyIHRpbWUgaW4gcmVzcG9uc2UgdG8gYSBoYW5ndXAgc2lnbmFsLgorICogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyAiZnJlZSBmb3JtYXQiIHdpdGggZmllbGRzIGdpdmVuIGluIHRoZQorICogb3JkZXIgc2hvd24gYmVsb3cuICBDb250aW51YXRpb24gbGluZXMgZm9yIGFuIGVudHJ5IG11c3QgYmVnaW4gd2l0aAorICogYSBzcGFjZSBvciB0YWIuICBBbGwgZmllbGRzIG11c3QgYmUgcHJlc2VudCBpbiBlYWNoIGVudHJ5LgorICoKKyAqICAgICAgc2VydmljZV9uYW1lICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGluIC9ldGMvc2VydmljZXMKKyAqICAgICAgc29ja2V0X3R5cGUgICAgICAgICAgICAgICAgICAgICBzdHJlYW0vZGdyYW0vcmF3L3JkbS9zZXFwYWNrZXQKKyAqICAgICAgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGluIC9ldGMvcHJvdG9jb2xzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgInRjcCIgb3IgInVkcCIpCisgKiAgICAgIHdhaXQvbm93YWl0Wy5tYXhdICAgICAgICAgICAgICAgc2luZ2xlLXRocmVhZGVkL211bHRpLXRocmVhZGVkLCBtYXggIworICogICAgICB1c2VyWy5ncm91cF0gb3IgdXNlcls6Z3JvdXBdICAgIHVzZXIvZ3JvdXAgdG8gcnVuIGRhZW1vbiBhcworICogICAgICBzZXJ2ZXJfcHJvZ3JhbSAgICAgICAgICAgICAgICAgIGZ1bGwgcGF0aCBuYW1lCisgKiAgICAgIHNlcnZlcl9wcm9ncmFtX2FyZ3VtZW50cyAgICAgICAgbWF4aW11bSBvZiBNQVhBUkdTICgyMCkKKyAqCisgKiBGb3IgUlBDIHNlcnZpY2VzCisgKiAgICAgIHNlcnZpY2VfbmFtZS92ZXJzaW9uICAgICAgICAgICAgbXVzdCBiZSBpbiAvZXRjL3JwYworICogICAgICBzb2NrZXRfdHlwZSAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS9kZ3JhbS9yYXcvcmRtL3NlcXBhY2tldAorICogICAgICBycGMvcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICJycGMvdGNwIiBldGMKKyAqICAgICAgd2FpdC9ub3dhaXRbLm1heF0gICAgICAgICAgICAgICBzaW5nbGUtdGhyZWFkZWQvbXVsdGktdGhyZWFkZWQKKyAqICAgICAgdXNlclsuZ3JvdXBdIG9yIHVzZXJbOmdyb3VwXSAgICB1c2VyIHRvIHJ1biBkYWVtb24gYXMKKyAqICAgICAgc2VydmVyX3Byb2dyYW0gICAgICAgICAgICAgICAgICBmdWxsIHBhdGggbmFtZQorICogICAgICBzZXJ2ZXJfcHJvZ3JhbV9hcmd1bWVudHMgICAgICAgIG1heGltdW0gb2YgTUFYQVJHUyAoMjApCisgKgorICogRm9yIG5vbi1SUEMgc2VydmljZXMsIHRoZSAic2VydmljZSBuYW1lIiBjYW4gYmUgb2YgdGhlIGZvcm0KKyAqIGhvc3RhZGRyZXNzOnNlcnZpY2VuYW1lLCBpbiB3aGljaCBjYXNlIHRoZSBob3N0YWRkcmVzcyBpcyB1c2VkCisgKiBhcyB0aGUgaG9zdCBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzIHRvIGxpc3RlbiBvbi4gIElmIGhvc3RhZGRyZXNzCisgKiBjb25zaXN0cyBvZiBhIHNpbmdsZSAnKicgY2hhcmFjdGVyLCBJTkFERFJfQU5ZIGlzIHVzZWQuCisgKgorICogQSBsaW5lIGNhbiBhbHNvIGNvbnNpc3Qgb2YganVzdAorICogICAgICBob3N0YWRkcmVzczoKKyAqIHdoZXJlIGhvc3RhZGRyZXNzIGlzIGFzIGluIHRoZSBwcmVjZWRpbmcgcGFyYWdyYXBoLiAgU3VjaCBhIGxpbmUgbXVzdAorICogaGF2ZSBubyBmdXJ0aGVyIGZpZWxkczsgdGhlIHNwZWNpZmllZCBob3N0YWRkcmVzcyBpcyByZW1lbWJlcmVkIGFuZAorICogdXNlZCBmb3IgYWxsIGZ1cnRoZXIgbGluZXMgdGhhdCBoYXZlIG5vIGhvc3RhZGRyZXNzIHNwZWNpZmllZCwKKyAqIHVudGlsIHRoZSBuZXh0IHN1Y2ggbGluZSAob3IgRU9GKS4gIChUaGlzIGlzIHdoeSAqIGlzIHByb3ZpZGVkIHRvCisgKiBhbGxvdyBleHBsaWNpdCBzcGVjaWZpY2F0aW9uIG9mIElOQUREUl9BTlkuKSAgQSBsaW5lCisgKiAgICAgICo6CisgKiBpcyBpbXBsaWNpdGx5IGluIGVmZmVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICoKKyAqIFRoZSBob3N0YWRkcmVzcyBzcGVjaWZpZXIgbWF5IChhbmQgb2Z0ZW4gd2lsbCkgY29udGFpbiBkb3RzOworICogdGhlIHNlcnZpY2UgbmFtZSBtdXN0IG5vdC4KKyAqCisgKiBGb3IgUlBDIHNlcnZpY2VzLCBob3N0LWFkZHJlc3Mgc3BlY2lmaWVycyBhcmUgYWNjZXB0ZWQgYW5kIHdpbGwKKyAqIHdvcmsgdG8gc29tZSBleHRlbnQ7IGhvd2V2ZXIsIGJlY2F1c2Ugb2YgbGltaXRhdGlvbnMgaW4gdGhlCisgKiBwb3J0bWFwcGVyIGludGVyZmFjZSwgaXQgd2lsbCBub3Qgd29yayB0byB0cnkgdG8gZ2l2ZSBtb3JlIHRoYW4KKyAqIG9uZSBsaW5lIGZvciBhbnkgZ2l2ZW4gUlBDIHNlcnZpY2UsIGV2ZW4gaWYgdGhlIGhvc3QtYWRkcmVzcworICogc3BlY2lmaWVycyBhcmUgZGlmZmVyZW50LgorICoKKyAqIENvbW1lbnQgbGluZXMgYXJlIGluZGljYXRlZCBieSBhICcjJyBpbiBjb2x1bW4gMS4KKyAqLworCisvKiBpbmV0ZCBydWxlcyBmb3IgcGFzc2luZyBmaWxlIGRlc2NyaXB0b3JzIHRvIGNoaWxkcmVuCisgKiAoaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvbWFuLmNnaT9xdWVyeT1pbmV0ZCk6CisgKgorICogVGhlIHdhaXQvbm93YWl0IGVudHJ5IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXJ2ZXIgdGhhdCBpcyBpbnZva2VkIGJ5CisgKiBpbmV0ZCB3aWxsIHRha2Ugb3ZlciB0aGUgc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBhY2Nlc3MgcG9pbnQsCisgKiBhbmQgdGh1cyB3aGV0aGVyIGluZXRkIHNob3VsZCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGV4aXQgYmVmb3JlIGxpc3Rlbi0KKyAqIGluZyBmb3IgbmV3IHNlcnZpY2UgcmVxdWVzdHMuICBEYXRhZ3JhbSBzZXJ2ZXJzIG11c3QgdXNlICJ3YWl0IiwgYXMKKyAqIHRoZXkgYXJlIGFsd2F5cyBpbnZva2VkIHdpdGggdGhlIG9yaWdpbmFsIGRhdGFncmFtIHNvY2tldCBib3VuZCB0byB0aGUKKyAqIHNwZWNpZmllZCBzZXJ2aWNlIGFkZHJlc3MuICBUaGVzZSBzZXJ2ZXJzIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgZGF0YWdyYW0KKyAqIGZyb20gdGhlIHNvY2tldCBiZWZvcmUgZXhpdGluZy4gIElmIGEgZGF0YWdyYW0gc2VydmVyIGNvbm5lY3RzIHRvIGl0cworICogcGVlciwgZnJlZWluZyB0aGUgc29ja2V0IHNvIGluZXRkIGNhbiByZWNlaXZlIGZ1cnRoZXIgbWVzc2FnZXMgb24gdGhlCisgKiBzb2NrZXQsIGl0IGlzIHNhaWQgdG8gYmUgYSAibXVsdGktdGhyZWFkZWQiIHNlcnZlcjsgaXQgc2hvdWxkIHJlYWQgb25lCisgKiBkYXRhZ3JhbSBmcm9tIHRoZSBzb2NrZXQgYW5kIGNyZWF0ZSBhIG5ldyBzb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBwZWVyLgorICogSXQgc2hvdWxkIGZvcmssIGFuZCB0aGUgcGFyZW50IHNob3VsZCB0aGVuIGV4aXQgdG8gYWxsb3cgaW5ldGQgdG8gY2hlY2sKKyAqIGZvciBuZXcgc2VydmljZSByZXF1ZXN0cyB0byBzcGF3biBuZXcgc2VydmVycy4gIERhdGFncmFtIHNlcnZlcnMgd2hpY2gKKyAqIHByb2Nlc3MgYWxsIGluY29taW5nIGRhdGFncmFtcyBvbiBhIHNvY2tldCBhbmQgZXZlbnR1YWxseSB0aW1lIG91dCBhcmUKKyAqIHNhaWQgdG8gYmUgInNpbmdsZS10aHJlYWRlZCIuICBUaGUgY29tc2F0KDgpLCBiaWZmKDEpIGFuZCB0YWxrZCg4KQorICogdXRpbGl0aWVzIGFyZSBib3RoIGV4YW1wbGVzIG9mIHRoZSBsYXR0ZXIgdHlwZSBvZiBkYXRhZ3JhbSBzZXJ2ZXIuICBUaGUKKyAqIHRmdHBkKDgpIHV0aWxpdHkgaXMgYW4gZXhhbXBsZSBvZiBhIG11bHRpLXRocmVhZGVkIGRhdGFncmFtIHNlcnZlci4KKyAqCisgKiBTZXJ2ZXJzIHVzaW5nIHN0cmVhbSBzb2NrZXRzIGdlbmVyYWxseSBhcmUgbXVsdGktdGhyZWFkZWQgYW5kIHVzZSB0aGUKKyAqICJub3dhaXQiIGVudHJ5LiBDb25uZWN0aW9uIHJlcXVlc3RzIGZvciB0aGVzZSBzZXJ2aWNlcyBhcmUgYWNjZXB0ZWQgYnkKKyAqIGluZXRkLCBhbmQgdGhlIHNlcnZlciBpcyBnaXZlbiBvbmx5IHRoZSBuZXdseS1hY2NlcHRlZCBzb2NrZXQgY29ubmVjdGVkCisgKiB0byBhIGNsaWVudCBvZiB0aGUgc2VydmljZS4gIE1vc3Qgc3RyZWFtLWJhc2VkIHNlcnZpY2VzIG9wZXJhdGUgaW4gdGhpcworICogbWFubmVyLiAgU3RyZWFtLWJhc2VkIHNlcnZlcnMgdGhhdCB1c2UgIndhaXQiIGFyZSBzdGFydGVkIHdpdGggdGhlIGxpcy0KKyAqIHRlbmluZyBzZXJ2aWNlIHNvY2tldCwgYW5kIG11c3QgYWNjZXB0IGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIHJlcXVlc3QKKyAqIGJlZm9yZSBleGl0aW5nLiAgU3VjaCBhIHNlcnZlciB3b3VsZCBub3JtYWxseSBhY2NlcHQgYW5kIHByb2Nlc3MgaW5jb21pbmcKKyAqIGNvbm5lY3Rpb24gcmVxdWVzdHMgdW50aWwgYSB0aW1lb3V0LgorICovCisKKy8qIERlc3BpdGUgb2YgYWJvdmUgZG9jIHNheWluZyB0aGF0IGRncmFtIHNlcnZpY2VzIG11c3QgdXNlICJ3YWl0IiwKKyAqICJ1ZHAgbm93YWl0IiBzZXJ2ZXJzIGFyZSBpbXBsZW1lbnRlZCBpbiBidXN5Ym94ZWQgaW5ldGQuCisgKiBJUHY2IGFkZHJlc3NlcyBhcmUgYWxzbyBpbXBsZW1lbnRlZC4gSG93ZXZlciwgdGhleSBtYXkgbG9vayB1Z2x5IC0KKyAqICI6OjpzZXJ2aWNlLi4uIiBtZWFucyAiYWRkcmVzcyAnOjonIChJUHY2IHdpbGRjYXJkIGFkZHIpIjoic2VydmljZSIuLi4KKyAqIFlvdSBoYXZlIHRvIHB1dCAidGNwNiIvInVkcDYiIGluIHByb3RvY29sIGZpZWxkIHRvIHNlbGVjdCBJUHY2LgorICovCisKKy8qIEhlcmUncyB0aGUgc2Nvb3AgY29uY2VybmluZyB0aGUgdXNlcls6Z3JvdXBdIGZlYXR1cmU6CisgKiAxKSBncm91cCBpcyBub3Qgc3BlY2lmaWVkOgorICogICAgICBhKSB1c2VyID0gcm9vdDogTk8gc2V0dWlkKCkgb3Igc2V0Z2lkKCkgaXMgZG9uZQorICogICAgICBiKSBvdGhlcjogICAgICAgaW5pdGdyb3VwcyhuYW1lLCBwcmltYXJ5IGdyb3VwKQorICogICAgICAgICAgICAgICAgICAgICAgc2V0Z2lkKHByaW1hcnkgZ3JvdXAgYXMgZm91bmQgaW4gcGFzc3dkKQorICogICAgICAgICAgICAgICAgICAgICAgc2V0dWlkKCkKKyAqIDIpIGdyb3VwIGlzIHNwZWNpZmllZDoKKyAqICAgICAgYSkgdXNlciA9IHJvb3Q6IHNldGdpZChzcGVjaWZpZWQgZ3JvdXApCisgKiAgICAgICAgICAgICAgICAgICAgICBOTyBpbml0Z3JvdXBzKCkKKyAqICAgICAgICAgICAgICAgICAgICAgIE5PIHNldHVpZCgpCisgKiAgICAgIGIpIG90aGVyOiAgICAgICBpbml0Z3JvdXBzKG5hbWUsIHNwZWNpZmllZCBncm91cCkKKyAqICAgICAgICAgICAgICAgICAgICAgIHNldGdpZChzcGVjaWZpZWQgZ3JvdXApCisgKiAgICAgICAgICAgICAgICAgICAgICBzZXR1aWQoKQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpbmV0ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mZV0gWy1xIE5dIFstUiBOXSBbQ09ORkZJTEVdIgorLy91c2FnZTojZGVmaW5lIGluZXRkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdGVuIGZvciBuZXR3b3JrIGNvbm5lY3Rpb25zIGFuZCBsYXVuY2ggcHJvZ3JhbXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOiAgICAgIlxuCS1lCUxvZyB0byBzdGRlcnIiCisvL3VzYWdlOiAgICAgIlxuCS1xIE4JU29ja2V0IGxpc3RlbiBxdWV1ZSAoZGVmYXVsdDogMTI4KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIgTglQYXVzZSBzZXJ2aWNlcyBhZnRlciBOIGNvbm5lY3RzL21pbiIKKy8vdXNhZ2U6ICAgICAiXG4JCShkZWZhdWx0OiAwIC0gZGlzYWJsZWQpIgorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisjIGlmIGRlZmluZWQoX19VQ0xJQkNfXykgJiYgISBkZWZpbmVkKF9fVUNMSUJDX0hBU19SUENfXykKKyMgIGVycm9yICJZb3UgbmVlZCB0byBidWlsZCB1Q2xpYmMgd2l0aCBVQ0xJQkNfSEFTX1JQQyBmb3IgTkZTIHN1cHBvcnQiCisjIGVuZGlmCisjIGluY2x1ZGUgPHJwYy9ycGMuaD4KKyMgaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgorI2VuZGlmCisKKyNpZiAhQkJfTU1VCisvKiBzdHJlYW0gdmVyc2lvbiBvZiBjaGFyZ2VuIGlzIGZvcmtpbmcgYnV0IG5vdCBleGVjaW5nLAorICogY2FuJ3QgZG8gdGhhdCAoZWFzaWx5KSBvbiBOT01NVSAqLworI3VuZGVmICBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTgorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiAwCisjZW5kaWYKKworI2RlZmluZSBfUEFUSF9JTkVURFBJRCAgIi92YXIvcnVuL2luZXRkLnBpZCIKKworI2RlZmluZSBDTlRfSU5URVJWQUwgICAgNjAgICAgICAvKiBzZXJ2ZXJzIGluIENOVF9JTlRFUlZBTCBzZWMuICovCisjZGVmaW5lIFJFVFJZVElNRSAgICAgICA2MCAgICAgIC8qIHJldHJ5IGFmdGVyIGJpbmQgb3Igc2VydmVyIGZhaWwgKi8KKworLy8gVE9ETzogZXhwbGFpbiwgb3IgZ2V0IHJpZCBvZiBzZXRybGltaXQgZ2FtZXMKKworI2lmbmRlZiBSTElNSVRfTk9GSUxFCisjZGVmaW5lIFJMSU1JVF9OT0ZJTEUgICBSTElNSVRfT0ZJTEUKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5fTUFYCisjZGVmaW5lIE9QRU5fTUFYICAgICAgICA2NAorI2VuZGlmCisKKy8qIFJlc2VydmUgc29tZSBkZXNjcmlwdG9ycywgMyBzdGRpbyArIGF0IGxlYXN0OiAxIGxvZywgMSBjb25mLiBmaWxlICovCisjZGVmaW5lIEZEX01BUkdJTiAgICAgICA4CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gICAgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSAgICBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUKKyMgZGVmaW5lIElORVREX0JVSUxUSU5TX0VOQUJMRUQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzZXJ2dGFiX3QgeworCS8qIFRoZSBtb3N0IGZyZXF1ZW50bHkgcmVmZXJlbmNlZCBvbmU6ICovCisJaW50IHNlX2ZkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVuIGRlc2NyaXB0b3IgKi8KKwkvKiBOQjogJ2JpZ2dlc3QgZmllbGRzIGxhc3QnIHNhdmVzIG9uIGNvZGUgc2l6ZSAofjI1MCBieXRlcykgKi8KKwkvKiBbYWRkcjpdc2VydmljZSBzb2NrdHlwZSBwcm90byB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCWNoYXIgKnNlX2xvY2FsX2hvc3RuYW1lOyAgICAgICAgICAgICAgLyogYWRkciB0byBsaXN0ZW4gb24gKi8KKwljaGFyICpzZV9zZXJ2aWNlOyAgICAgICAgICAgICAgICAgICAgIC8qICI4MCIgb3IgInd3dyIgb3IgIm1vdW50LzJbLTNdIiAqLworCS8qIHNvY2t0eXBlIGlzIGluIHNlX3NvY2t0eXBlICovICAgICAgLyogInN0cmVhbSIgImRncmFtIiAicmF3IiAicmRtIiAic2VxcGFja2V0IiAqLworCWNoYXIgKnNlX3Byb3RvOyAgICAgICAgICAgICAgICAgICAgICAgLyogInVuaXgiIG9yICJbcnBjL110Y3BbNl0iICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJaW50IHNlX3JwY3Byb2c7ICAgICAgICAgICAgICAgICAgICAgICAvKiBycGMgcHJvZ3JhbSBudW1iZXIgKi8KKwlpbnQgc2VfcnBjdmVyX2xvOyAgICAgICAgICAgICAgICAgICAgIC8qIHJwYyBwcm9ncmFtIGxvd2VzdCB2ZXJzaW9uICovCisJaW50IHNlX3JwY3Zlcl9oaTsgICAgICAgICAgICAgICAgICAgICAvKiBycGMgcHJvZ3JhbSBoaWdoZXN0IHZlcnNpb24gKi8KKyNkZWZpbmUgaXNfcnBjX3NlcnZpY2Uoc2VwKSAgICAgICAoKHNlcCktPnNlX3JwY3Zlcl9sbyAhPSAwKQorI2Vsc2UKKyNkZWZpbmUgaXNfcnBjX3NlcnZpY2Uoc2VwKSAgICAgICAwCisjZW5kaWYKKwlwaWRfdCBzZV93YWl0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA6Im5vd2FpdCIsIDE6IndhaXQiLCA+MToid2FpdCIgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3YWl0aW5nIGZvciB0aGlzIHBpZCAqLworCXNvY2t0eXBlX3Qgc2Vfc29ja3R5cGU7ICAgICAgICAgICAgICAgLyogU09DS19TVFJFQU0vREdSQU0vUkRNLy4uLiAqLworCWZhbWlseV90IHNlX2ZhbWlseTsgICAgICAgICAgICAgICAgICAgLyogQUZfVU5JWC9JTkVUWzZdICovCisJLyogc2VfcHJvdG9fbm8gaXMgdXNlZCBieSBSUEMgY29kZSBvbmx5Li4uIGhtbSAqLworCXNtYWxsaW50IHNlX3Byb3RvX25vOyAgICAgICAgICAgICAgICAgLyogSVBQUk9UT19UQ1AvVURQLCBuL2EgZm9yIEFGX1VOSVggKi8KKwlzbWFsbGludCBzZV9jaGVja2VkOyAgICAgICAgICAgICAgICAgIC8qIGxvb2tlZCBhdCBkdXJpbmcgbWVyZ2UgKi8KKwl1bnNpZ25lZCBzZV9tYXg7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG93ZWQgaW5zdGFuY2VzIHBlciBtaW51dGUgKi8KKwl1bnNpZ25lZCBzZV9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBzdGFydGVkIHNpbmNlIHNlX3RpbWUgKi8KKwl1bnNpZ25lZCBzZV90aW1lOyAgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gd2Ugc3RhcnRlZCBjb3VudGluZyAqLworCWNoYXIgKnNlX3VzZXI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlciBuYW1lIHRvIHJ1biBhcyAqLworCWNoYXIgKnNlX2dyb3VwOyAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JvdXAgbmFtZSB0byBydW4gYXMsIGNhbiBiZSBOVUxMICovCisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorCWNvbnN0IHN0cnVjdCBidWlsdGluICpzZV9idWlsdGluOyAgICAgLyogaWYgYnVpbHQtaW4sIGRlc2NyaXB0aW9uICovCisjZW5kaWYKKwlzdHJ1Y3Qgc2VydnRhYl90ICpzZV9uZXh0OworCWxlbl9hbmRfc29ja2FkZHIgKnNlX2xzYTsKKwljaGFyICpzZV9wcm9ncmFtOyAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBwcm9ncmFtICovCisjZGVmaW5lIE1BWEFSR1YgMjAKKwljaGFyICpzZV9hcmd2W01BWEFSR1YgKyAxXTsgICAgICAgICAgIC8qIHByb2dyYW0gYXJndW1lbnRzICovCit9IHNlcnZ0YWJfdDsKKworI2lmZGVmIElORVREX0JVSUxUSU5TX0VOQUJMRUQKKy8qIEVjaG8gcmVjZWl2ZWQgZGF0YSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZWNob19zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZWNob19kZyhpbnQsIHNlcnZ0YWJfdCAqKTsKKyNlbmRpZgorLyogSW50ZXJuZXQgL2Rldi9udWxsICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkaXNjYXJkX3N0cmVhbShpbnQsIHNlcnZ0YWJfdCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkaXNjYXJkX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisvKiBSZXR1cm4gMzIgYml0IHRpbWUgc2luY2UgMTkwMCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgbWFjaHRpbWVfc3RyZWFtKGludCwgc2VydnRhYl90ICopOworc3RhdGljIHZvaWQgRkFTVF9GVU5DIG1hY2h0aW1lX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisvKiBSZXR1cm4gaHVtYW4tcmVhZGFibGUgdGltZSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF5dGltZV9zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF5dGltZV9kZyhpbnQsIHNlcnZ0YWJfdCAqKTsKKyNlbmRpZgorLyogRmFtaWxpYXIgY2hhcmFjdGVyIGdlbmVyYXRvciAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9kZyhpbnQsIHNlcnZ0YWJfdCAqKTsKKyNlbmRpZgorCitzdHJ1Y3QgYnVpbHRpbiB7CisJLyogTkI6IG5vdCBuZWNlc3NhcmlseSBOVUwgdGVybWluYXRlZCAqLworCWNoYXIgYmlfc2VydmljZTdbN107ICAgICAgLyogaW50ZXJuYWxseSBwcm92aWRlZCBzZXJ2aWNlIG5hbWUgKi8KKwl1aW50OF90IGJpX2Zvcms7ICAgICAgICAgIC8qIDEgaWYgc3RyZWFtIGZuIHNob3VsZCBydW4gaW4gY2hpbGQgKi8KKwl2b2lkICgqYmlfc3RyZWFtX2ZuKShpbnQsIHNlcnZ0YWJfdCAqKSBGQVNUX0ZVTkM7CisJdm9pZCAoKmJpX2RncmFtX2ZuKShpbnQsIHNlcnZ0YWJfdCAqKSBGQVNUX0ZVTkM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbnNbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITworCXsgImVjaG8iLCAxLCBlY2hvX3N0cmVhbSwgZWNob19kZyB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQKKwl7ICJkaXNjYXJkIiwgMSwgZGlzY2FyZF9zdHJlYW0sIGRpc2NhcmRfZGcgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCisJeyAiY2hhcmdlbiIsIDEsIGNoYXJnZW5fc3RyZWFtLCBjaGFyZ2VuX2RnIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRQorCXsgInRpbWUiLCAwLCBtYWNodGltZV9zdHJlYW0sIG1hY2h0aW1lX2RnIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRQorCXsgImRheXRpbWUiLCAwLCBkYXl0aW1lX3N0cmVhbSwgZGF5dGltZV9kZyB9LAorI2VuZGlmCit9OworI2VuZGlmIC8qIElORVREX0JVSUxUSU5TX0VOQUJMRUQgKi8KKworc3RydWN0IGdsb2JhbHMgeworCXJsaW1fdCBybGltX29maWxlX2N1cjsKKwlzdHJ1Y3QgcmxpbWl0IHJsaW1fb2ZpbGU7CisJc2VydnRhYl90ICpzZXJ2X2xpc3Q7CisJaW50IGdsb2JhbF9xdWV1ZWxlbjsKKwlpbnQgbWF4c29jazsgICAgICAgICAvKiBtYXggZmQjIGluIGFsbHNvY2ssIC0xOiB1bmtub3duICovCisJLyogd2hlbmV2ZXIgbWF4c29jayBncm93cywgcHJldl9tYXhzb2NrIGlzIHNldCB0byBuZXcgbWF4c29jaywKKwkgKiBidXQgaWYgbWF4c29jayBpcyBzZXQgdG8gLTEsIHByZXZfbWF4c29jayBpcyBub3QgY2hhbmdlZCAqLworCWludCBwcmV2X21heHNvY2s7CisJdW5zaWduZWQgbWF4X2NvbmN1cnJlbmN5OworCXNtYWxsaW50IGFsYXJtX2FybWVkOworCXVpZF90IHJlYWxfdWlkOyAvKiB1c2VyIElEIHdobyByYW4gdXMgKi8KKwljb25zdCBjaGFyICpjb25maWdfZmlsZW5hbWU7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICpkZWZhdWx0X2xvY2FsX2hvc3RuYW1lOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCisJY2hhciAqZW5kX3Jpbmc7CisJY2hhciAqcmluZ19wb3M7CisJY2hhciByaW5nWzEyOF07CisjZW5kaWYKKwlmZF9zZXQgYWxsc29jazsKKwkvKiBVc2VkIGluIG5leHRfbGluZSgpLCBhbmQgYXMgc2NyYXRjaCByZWFkIGJ1ZmZlciAqLworCWNoYXIgbGluZVsyNTZdOyAgICAgICAgICAvKiBfYXQgbGVhc3RfIDI1Niwgc2VlIExJTkVfU0laRSAqLworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK2VudW0geyBMSU5FX1NJWkUgPSBDT01NT05fQlVGU0laRSAtIG9mZnNldG9mKHN0cnVjdCBnbG9iYWxzLCBsaW5lKSB9Oworc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgcmxpbV9vZmlsZV9jdXIgIChHLnJsaW1fb2ZpbGVfY3VyICkKKyNkZWZpbmUgcmxpbV9vZmlsZSAgICAgIChHLnJsaW1fb2ZpbGUgICAgICkKKyNkZWZpbmUgc2Vydl9saXN0ICAgICAgIChHLnNlcnZfbGlzdCAgICAgICkKKyNkZWZpbmUgZ2xvYmFsX3F1ZXVlbGVuIChHLmdsb2JhbF9xdWV1ZWxlbikKKyNkZWZpbmUgbWF4c29jayAgICAgICAgIChHLm1heHNvY2sgICAgICAgICkKKyNkZWZpbmUgcHJldl9tYXhzb2NrICAgIChHLnByZXZfbWF4c29jayAgICkKKyNkZWZpbmUgbWF4X2NvbmN1cnJlbmN5IChHLm1heF9jb25jdXJyZW5jeSkKKyNkZWZpbmUgYWxhcm1fYXJtZWQgICAgIChHLmFsYXJtX2FybWVkICAgICkKKyNkZWZpbmUgcmVhbF91aWQgICAgICAgIChHLnJlYWxfdWlkICAgICAgICkKKyNkZWZpbmUgY29uZmlnX2ZpbGVuYW1lIChHLmNvbmZpZ19maWxlbmFtZSkKKyNkZWZpbmUgcGFyc2VyICAgICAgICAgIChHLnBhcnNlciAgICAgICAgICkKKyNkZWZpbmUgZGVmYXVsdF9sb2NhbF9ob3N0bmFtZSAoRy5kZWZhdWx0X2xvY2FsX2hvc3RuYW1lKQorI2RlZmluZSBmaXJzdF9wc19ieXRlICAgKEcuZmlyc3RfcHNfYnl0ZSAgKQorI2RlZmluZSBsYXN0X3BzX2J5dGUgICAgKEcubGFzdF9wc19ieXRlICAgKQorI2RlZmluZSBlbmRfcmluZyAgICAgICAgKEcuZW5kX3JpbmcgICAgICAgKQorI2RlZmluZSByaW5nX3BvcyAgICAgICAgKEcucmluZ19wb3MgICAgICAgKQorI2RlZmluZSByaW5nICAgICAgICAgICAgKEcucmluZyAgICAgICAgICAgKQorI2RlZmluZSBhbGxzb2NrICAgICAgICAgKEcuYWxsc29jayAgICAgICAgKQorI2RlZmluZSBsaW5lICAgICAgICAgICAgKEcubGluZSAgICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlybGltX29maWxlX2N1ciA9IE9QRU5fTUFYOyBcCisJZ2xvYmFsX3F1ZXVlbGVuID0gMTI4OyBcCisJY29uZmlnX2ZpbGVuYW1lID0gIi9ldGMvaW5ldGQuY29uZiI7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIG1heWJlX2Nsb3NlKGludCBmZCkKK3sKKwlpZiAoZmQgPj0gMCkKKwkJY2xvc2UoZmQpOworfQorCisvLyBUT0RPOiBtb3ZlIHRvIGxpYmJiPworc3RhdGljIGxlbl9hbmRfc29ja2FkZHIgKnh6YWxsb2NfbHNhKGludCBmYW1pbHkpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCWludCBzejsKKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJaWYgKGZhbWlseSA9PSBBRl9VTklYKQorCQlzeiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzeiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyNlbmRpZgorCWxzYSA9IHh6YWxsb2MoTFNBX0xFTl9TSVpFICsgc3opOworCWxzYS0+bGVuID0gc3o7CisJbHNhLT51LnNhLnNhX2ZhbWlseSA9IGZhbWlseTsKKwlyZXR1cm4gbHNhOworfQorCitzdGF0aWMgdm9pZCByZWFybV9hbGFybSh2b2lkKQoreworCWlmICghYWxhcm1fYXJtZWQpIHsKKwkJYWxhcm1fYXJtZWQgPSAxOworCQlhbGFybShSRVRSWVRJTUUpOworCX0KK30KKworc3RhdGljIHZvaWQgYmxvY2tfQ0hMRF9IVVBfQUxSTShzaWdzZXRfdCAqbSkKK3sKKwlzaWdlbXB0eXNldChtKTsKKwlzaWdhZGRzZXQobSwgU0lHQ0hMRCk7CisJc2lnYWRkc2V0KG0sIFNJR0hVUCk7CisJc2lnYWRkc2V0KG0sIFNJR0FMUk0pOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgbSwgbSk7IC8qIG9sZCBzaWdtYXNrIGlzIHN0b3JlZCBpbiBtICovCit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqbSkKK3sKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgbSwgTlVMTCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3JwYyhzZXJ2dGFiX3QgKnNlcCkKK3sKKwlpbnQgbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gaXJfc2luOworCXNvY2tsZW5fdCBzaXplOworCisJc2l6ZSA9IHNpemVvZihpcl9zaW4pOworCWlmIChnZXRzb2NrbmFtZShzZXAtPnNlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZpcl9zaW4sICZzaXplKSA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiZ2V0c29ja25hbWUiKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAobiA9IHNlcC0+c2VfcnBjdmVyX2xvOyBuIDw9IHNlcC0+c2VfcnBjdmVyX2hpOyBuKyspIHsKKwkJcG1hcF91bnNldChzZXAtPnNlX3JwY3Byb2csIG4pOworCQlpZiAoIXBtYXBfc2V0KHNlcC0+c2VfcnBjcHJvZywgbiwgc2VwLT5zZV9wcm90b19ubywgbnRvaHMoaXJfc2luLnNpbl9wb3J0KSkpCisJCQliYl9wZXJyb3JfbXNnKCIlcyAlczogcG1hcF9zZXQoJXUsJXUsJXUsJXUpIiwKKwkJCQlzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8sCisJCQkJc2VwLT5zZV9ycGNwcm9nLCBuLCBzZXAtPnNlX3Byb3RvX25vLCBudG9ocyhpcl9zaW4uc2luX3BvcnQpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfcnBjKHNlcnZ0YWJfdCAqc2VwKQoreworCWludCBuOworCisJZm9yIChuID0gc2VwLT5zZV9ycGN2ZXJfbG87IG4gPD0gc2VwLT5zZV9ycGN2ZXJfaGk7IG4rKykgeworCQlpZiAoIXBtYXBfdW5zZXQoc2VwLT5zZV9ycGNwcm9nLCBuKSkKKwkJCWJiX3BlcnJvcl9tc2coInBtYXBfdW5zZXQoJXUsJXUpIiwgc2VwLT5zZV9ycGNwcm9nLCBuKTsKKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTkVURF9SUEMgKi8KKworc3RhdGljIHZvaWQgYnVtcF9ub2ZpbGUodm9pZCkKK3sKKwllbnVtIHsgRkRfQ0hVTksgPSAzMiB9OworCXN0cnVjdCBybGltaXQgcmw7CisKKwkvKiBOZXZlciBmYWlscyB1bmRlciBMaW51eCAoZXhjZXB0IGlmIHlvdSBwYXNzIGl0IGJhZCBhcmd1bWVudHMpICovCisJZ2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybCk7CisJcmwucmxpbV9jdXIgPSBNSU4ocmwucmxpbV9tYXgsIHJsLnJsaW1fY3VyICsgRkRfQ0hVTkspOworCXJsLnJsaW1fY3VyID0gTUlOKEZEX1NFVFNJWkUsIHJsLnJsaW1fY3VyICsgRkRfQ0hVTkspOworCWlmIChybC5ybGltX2N1ciA8PSBybGltX29maWxlX2N1cikgeworCQliYl9lcnJvcl9tc2coImNhbid0IGV4dGVuZCBmaWxlIGxpbWl0LCBtYXggPSAlZCIsCisJCQkJCQkoaW50KSBybC5ybGltX2N1cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybCkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coInNldHJsaW1pdCIpOworCQlyZXR1cm47CisJfQorCisJcmxpbV9vZmlsZV9jdXIgPSBybC5ybGltX2N1cjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZkX2Zyb21fc2V0KGludCBmZCkKK3sKKwlpZiAoZmQgPj0gMCkgeworCQlGRF9DTFIoZmQsICZhbGxzb2NrKTsKKwkJbWF4c29jayA9IC0xOworCX0KK30KKworc3RhdGljIHZvaWQgYWRkX2ZkX3RvX3NldChpbnQgZmQpCit7CisJaWYgKGZkID49IDApIHsKKwkJRkRfU0VUKGZkLCAmYWxsc29jayk7CisJCWlmIChtYXhzb2NrID49IDAgJiYgZmQgPiBtYXhzb2NrKSB7CisJCQlwcmV2X21heHNvY2sgPSBtYXhzb2NrID0gZmQ7CisJCQlpZiAoKHJsaW1fdClmZCA+IHJsaW1fb2ZpbGVfY3VyIC0gRkRfTUFSR0lOKQorCQkJCWJ1bXBfbm9maWxlKCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlY2FsY3VsYXRlX21heHNvY2sodm9pZCkKK3sKKwlpbnQgZmQgPSAwOworCisJLyogV2UgbWF5IGhhdmUgbm8gc2VydmljZXMsIGluIHRoaXMgY2FzZSBtYXhzb2NrIHNob3VsZCBzdGlsbCBiZSA+PSAwCisJICogKGNvZGUgZWxzZXdoZXJlIGlzIG5vdCBoYXBweSB3aXRoIG1heHNvY2sgPT0gLTEpICovCisJbWF4c29jayA9IDA7CisJd2hpbGUgKGZkIDw9IHByZXZfbWF4c29jaykgeworCQlpZiAoRkRfSVNTRVQoZmQsICZhbGxzb2NrKSkKKwkJCW1heHNvY2sgPSBmZDsKKwkJZmQrKzsKKwl9CisJcHJldl9tYXhzb2NrID0gbWF4c29jazsKKwlpZiAoKHJsaW1fdCltYXhzb2NrID4gcmxpbV9vZmlsZV9jdXIgLSBGRF9NQVJHSU4pCisJCWJ1bXBfbm9maWxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfc29ja2V0X2ZkKHNlcnZ0YWJfdCAqc2VwKQoreworCWludCByLCBmZDsKKworCWZkID0gc29ja2V0KHNlcC0+c2VfZmFtaWx5LCBzZXAtPnNlX3NvY2t0eXBlLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coInNvY2tldCIpOworCQlyZXR1cm47CisJfQorCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCWlmIChpc19ycGNfc2VydmljZShzZXApKSB7CisJCXN0cnVjdCBwYXNzd2QgKnB3ZDsKKworCQkvKiB6ZXJvIG91dCB0aGUgcG9ydCBmb3IgYWxsIFJQQyBzZXJ2aWNlczsgbGV0IGJpbmQoKQorCQkgKiBmaW5kIG9uZS4gKi8KKwkJc2V0X25wb3J0KCZzZXAtPnNlX2xzYS0+dS5zYSwgMCk7CisKKwkJLyogZm9yIFJQQyBzZXJ2aWNlcywgYXR0ZW1wdCB0byB1c2UgYSByZXNlcnZlZCBwb3J0CisJCSAqIGlmIHRoZXkgYXJlIGdvaW5nIHRvIGJlIHJ1bm5pbmcgYXMgcm9vdC4gKi8KKwkJaWYgKHJlYWxfdWlkID09IDAgJiYgc2VwLT5zZV9mYW1pbHkgPT0gQUZfSU5FVAorCQkgJiYgKHB3ZCA9IGdldHB3bmFtKHNlcC0+c2VfdXNlcikpICE9IE5VTEwKKwkJICYmIHB3ZC0+cHdfdWlkID09IDAKKwkJKSB7CisJCQlyID0gYmluZHJlc3Zwb3J0KGZkLCAmc2VwLT5zZV9sc2EtPnUuc2luKTsKKwkJfSBlbHNlIHsKKwkJCXIgPSBiaW5kKGZkLCAmc2VwLT5zZV9sc2EtPnUuc2EsIHNlcC0+c2VfbHNhLT5sZW4pOworCQl9CisJCWlmIChyID09IDApIHsKKwkJCWludCBzYXZlZXJybm8gPSBlcnJubzsKKwkJCS8qIHVwZGF0ZSBsc2Egd2l0aCBwb3J0IyAqLworCQkJZ2V0c29ja25hbWUoZmQsICZzZXAtPnNlX2xzYS0+dS5zYSwgJnNlcC0+c2VfbHNhLT5sZW4pOworCQkJZXJybm8gPSBzYXZlZXJybm87CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJaWYgKHNlcC0+c2VfZmFtaWx5ID09IEFGX1VOSVgpIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOworCQkJc3VuID0gKHN0cnVjdCBzb2NrYWRkcl91biopJihzZXAtPnNlX2xzYS0+dS5zYSk7CisJCQl1bmxpbmsoc3VuLT5zdW5fcGF0aCk7CisJCX0KKwkJciA9IGJpbmQoZmQsICZzZXAtPnNlX2xzYS0+dS5zYSwgc2VwLT5zZV9sc2EtPmxlbik7CisJfQorCWlmIChyIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCIlcy8lczogYmluZCIsCisJCQkJc2VwLT5zZV9zZXJ2aWNlLCBzZXAtPnNlX3Byb3RvKTsKKwkJY2xvc2UoZmQpOworCQlyZWFybV9hbGFybSgpOworCQlyZXR1cm47CisJfQorCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKQorCQlsaXN0ZW4oZmQsIGdsb2JhbF9xdWV1ZWxlbik7CisKKwlhZGRfZmRfdG9fc2V0KGZkKTsKKwlzZXAtPnNlX2ZkID0gZmQ7Cit9CisKK3N0YXRpYyBpbnQgcmVvcGVuX2NvbmZpZ19maWxlKHZvaWQpCit7CisJZnJlZShkZWZhdWx0X2xvY2FsX2hvc3RuYW1lKTsKKwlkZWZhdWx0X2xvY2FsX2hvc3RuYW1lID0geHN0cmR1cCgiKiIpOworCWlmIChwYXJzZXIgIT0gTlVMTCkKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJcGFyc2VyID0gY29uZmlnX29wZW4oY29uZmlnX2ZpbGVuYW1lKTsKKwlyZXR1cm4gKHBhcnNlciAhPSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgY2xvc2VfY29uZmlnX2ZpbGUodm9pZCkKK3sKKwlpZiAocGFyc2VyKSB7CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCQlwYXJzZXIgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9zZXJ2dGFiX3N0cmluZ3Moc2VydnRhYl90ICpjcCkKK3sKKwlpbnQgaTsKKworCWZyZWUoY3AtPnNlX2xvY2FsX2hvc3RuYW1lKTsKKwlmcmVlKGNwLT5zZV9zZXJ2aWNlKTsKKwlmcmVlKGNwLT5zZV9wcm90byk7CisJZnJlZShjcC0+c2VfdXNlcik7CisJZnJlZShjcC0+c2VfZ3JvdXApOworCWZyZWUoY3AtPnNlX2xzYSk7IC8qIG5vdCBhIHN0cmluZyBpbiBmYWN0ICovCisJZnJlZShjcC0+c2VfcHJvZ3JhbSk7CisJZm9yIChpID0gMDsgaSA8IE1BWEFSR1Y7IGkrKykKKwkJZnJlZShjcC0+c2VfYXJndltpXSk7Cit9CisKK3N0YXRpYyBzZXJ2dGFiX3QgKm5ld19zZXJ2dGFiKHZvaWQpCit7CisJc2VydnRhYl90ICpuZXd0YWIgPSB4emFsbG9jKHNpemVvZihzZXJ2dGFiX3QpKTsKKwluZXd0YWItPnNlX2ZkID0gLTE7IC8qIHBhcmFub2lhICovCisJcmV0dXJuIG5ld3RhYjsKK30KKworc3RhdGljIHNlcnZ0YWJfdCAqZHVwX3NlcnZ0YWIoc2VydnRhYl90ICpzZXApCit7CisJc2VydnRhYl90ICpuZXd0YWI7CisJaW50IGFyZ2M7CisKKwluZXd0YWIgPSBuZXdfc2VydnRhYigpOworCSpuZXd0YWIgPSAqc2VwOyAvKiBzdHJ1Y3QgY29weSAqLworCS8qIGRlZXAtY29weWluZyBzdHJpbmdzICovCisJbmV3dGFiLT5zZV9zZXJ2aWNlID0geHN0cmR1cChuZXd0YWItPnNlX3NlcnZpY2UpOworCW5ld3RhYi0+c2VfcHJvdG8gPSB4c3RyZHVwKG5ld3RhYi0+c2VfcHJvdG8pOworCW5ld3RhYi0+c2VfdXNlciA9IHhzdHJkdXAobmV3dGFiLT5zZV91c2VyKTsKKwluZXd0YWItPnNlX2dyb3VwID0geHN0cmR1cChuZXd0YWItPnNlX2dyb3VwKTsKKwluZXd0YWItPnNlX3Byb2dyYW0gPSB4c3RyZHVwKG5ld3RhYi0+c2VfcHJvZ3JhbSk7CisJZm9yIChhcmdjID0gMDsgYXJnYyA8PSBNQVhBUkdWOyBhcmdjKyspCisJCW5ld3RhYi0+c2VfYXJndlthcmdjXSA9IHhzdHJkdXAobmV3dGFiLT5zZV9hcmd2W2FyZ2NdKTsKKwkvKiBOQjogc2VfZmQsIHNlX2hvc3RhZGRyIGFuZCBzZV9uZXh0IGFyZSBhbHdheXMKKwkgKiBvdmVyd3JpdHRlbmQgYnkgY2FsbGVycywgc28gd2UgZG9uJ3QgYm90aGVyIHJlc2V0dGluZyB0aGVtCisJICogdG8gTlVMTC8wLy0xIGV0YyAqLworCisJcmV0dXJuIG5ld3RhYjsKK30KKworLyogZ2NjIGdlbmVyYXRlcyBtdWNoIG1vcmUgY29kZSBpZiB0aGlzIGlzIGlubGluZWQgKi8KK3N0YXRpYyBzZXJ2dGFiX3QgKnBhcnNlX29uZV9saW5lKHZvaWQpCit7CisJaW50IGFyZ2M7CisJY2hhciAqdG9rZW5bNitNQVhBUkdWXTsKKwljaGFyICpwLCAqYXJnOworCWNoYXIgKmhvc3RkZWxpbTsKKwlzZXJ2dGFiX3QgKnNlcDsKKwlzZXJ2dGFiX3QgKm5zZXA7CisgbmV3OgorCXNlcCA9IG5ld19zZXJ2dGFiKCk7CisgbW9yZToKKwlhcmdjID0gY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgNitNQVhBUkdWLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCk7CisJaWYgKCFhcmdjKSB7CisJCWZyZWUoc2VwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogW2hvc3Q6XXNlcnZpY2Ugc29ja3R5cGUgcHJvdG8gd2FpdCB1c2VyWzpncm91cF0gcHJvZyBbYXJnc10gKi8KKwkvKiBDaGVjayBmb3IgImhvc3Q6Li4uLiIgbGluZSAqLworCWFyZyA9IHRva2VuWzBdOworCWhvc3RkZWxpbSA9IHN0cnJjaHIoYXJnLCAnOicpOworCWlmIChob3N0ZGVsaW0pIHsKKwkJKmhvc3RkZWxpbSA9ICdcMCc7CisJCXNlcC0+c2VfbG9jYWxfaG9zdG5hbWUgPSB4c3RyZHVwKGFyZyk7CisJCWFyZyA9IGhvc3RkZWxpbSArIDE7CisJCWlmICgqYXJnID09ICdcMCcgJiYgYXJnYyA9PSAxKSB7CisJCQkvKiBMaW5lIGhhcyBqdXN0ICJob3N0OiIsIGNoYW5nZSB0aGUKKwkJCSAqIGRlZmF1bHQgaG9zdCBmb3IgdGhlIGZvbGxvd2luZyBsaW5lcy4gKi8KKwkJCWZyZWUoZGVmYXVsdF9sb2NhbF9ob3N0bmFtZSk7CisJCQlkZWZhdWx0X2xvY2FsX2hvc3RuYW1lID0gc2VwLT5zZV9sb2NhbF9ob3N0bmFtZTsKKwkJCWdvdG8gbW9yZTsKKwkJfQorCX0gZWxzZQorCQlzZXAtPnNlX2xvY2FsX2hvc3RuYW1lID0geHN0cmR1cChkZWZhdWx0X2xvY2FsX2hvc3RuYW1lKTsKKworCS8qIHNlcnZpY2Ugc29ja3R5cGUgcHJvdG8gd2FpdCB1c2VyWzpncm91cF0gcHJvZyBbYXJnc10gKi8KKwlzZXAtPnNlX3NlcnZpY2UgPSB4c3RyZHVwKGFyZyk7CisKKwkvKiBzb2NrdHlwZSBwcm90byB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCWlmIChhcmdjIDwgNikgeworIHBhcnNlX2VycjoKKwkJYmJfZXJyb3JfbXNnKCJwYXJzZSBlcnJvciBvbiBsaW5lICV1LCBsaW5lIGlzIGlnbm9yZWQiLAorCQkJCXBhcnNlci0+bGluZW5vKTsKKwkJZnJlZV9zZXJ2dGFiX3N0cmluZ3Moc2VwKTsKKwkJLyogSnVzdCAiZ290byBtb3JlIiBjYW4gbWFrZSBzZXAgdG8gY2Fycnkgb3ZlciBlLmcuCisJCSAqICJycGMiLW5lc3MgKGJ5IGhhdmluZyBzZV9ycGN2ZXJfbG8gIT0gMCkuCisJCSAqIFdlIHdpbGwgYmUgbW9yZSBwYXJhbm9pZDogKi8KKwkJZnJlZShzZXApOworCQlnb3RvIG5ldzsKKwl9CisKKwl7CisJCXN0YXRpYyBjb25zdCBpbnQ4X3QgU09DS194eHhbXSBBTElHTjEgPSB7CisJCQktMSwKKwkJCVNPQ0tfU1RSRUFNLCBTT0NLX0RHUkFNLCBTT0NLX1JETSwKKwkJCVNPQ0tfU0VRUEFDS0VULCBTT0NLX1JBVworCQl9OworCQlzZXAtPnNlX3NvY2t0eXBlID0gU09DS194eHhbMSArIGluZGV4X2luX3N0cmluZ3MoCisJCQkic3RyZWFtIiJcMCIgImRncmFtIiJcMCIgInJkbSIiXDAiCisJCQkic2VxcGFja2V0IiJcMCIgInJhdyIiXDAiCisJCQksIHRva2VuWzFdKV07CisJfQorCisJLyoge3VuaXgsW3JwYy9de3RjcCx1ZHB9WzZdfSB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCXNlcC0+c2VfcHJvdG8gPSBhcmcgPSB4c3RyZHVwKHRva2VuWzJdKTsKKwlpZiAoc3RyY21wKGFyZywgInVuaXgiKSA9PSAwKSB7CisJCXNlcC0+c2VfZmFtaWx5ID0gQUZfVU5JWDsKKwl9IGVsc2UgeworCQljaGFyICpzaXg7CisJCXNlcC0+c2VfZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2l4ID0gbGFzdF9jaGFyX2lzKGFyZywgJzYnKTsKKwkJaWYgKHNpeCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJCSpzaXggPSAnXDAnOworCQkJc2VwLT5zZV9mYW1pbHkgPSBBRl9JTkVUNjsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coIiVzOiBubyBzdXBwb3J0IGZvciBJUHY2Iiwgc2VwLT5zZV9wcm90byk7CisJCQlnb3RvIHBhcnNlX2VycjsKKyNlbmRpZgorCQl9CisJCWlmIChzdHJuY21wKGFyZywgInJwYy8iLCA0KSA9PSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJCQl1bnNpZ25lZCBuOworCQkJYXJnICs9IDQ7CisJCQlwID0gc3RyY2hyKHNlcC0+c2Vfc2VydmljZSwgJy8nKTsKKwkJCWlmIChwID09IE5VTEwpIHsKKwkJCQliYl9lcnJvcl9tc2coIm5vIHJwYyB2ZXJzaW9uOiAnJXMnIiwgc2VwLT5zZV9zZXJ2aWNlKTsKKwkJCQlnb3RvIHBhcnNlX2VycjsKKwkJCX0KKwkJCSpwKysgPSAnXDAnOworCQkJbiA9IGJiX3N0cnRvdShwLCAmcCwgMTApOworCQkJaWYgKG4gPiBJTlRfTUFYKSB7CisgYmFkX3Zlcl9zcGVjOgorCQkJCWJiX2Vycm9yX21zZygiYmFkIHJwYyB2ZXJzaW9uIik7CisJCQkJZ290byBwYXJzZV9lcnI7CisJCQl9CisJCQlzZXAtPnNlX3JwY3Zlcl9sbyA9IHNlcC0+c2VfcnBjdmVyX2hpID0gbjsKKwkJCWlmICgqcCA9PSAnLScpIHsKKwkJCQlwKys7CisJCQkJbiA9IGJiX3N0cnRvdShwLCAmcCwgMTApOworCQkJCWlmIChuID4gSU5UX01BWCB8fCAoaW50KW4gPCBzZXAtPnNlX3JwY3Zlcl9sbykKKwkJCQkJZ290byBiYWRfdmVyX3NwZWM7CisJCQkJc2VwLT5zZV9ycGN2ZXJfaGkgPSBuOworCQkJfQorCQkJaWYgKCpwICE9ICdcMCcpCisJCQkJZ290byBiYWRfdmVyX3NwZWM7CisjZWxzZQorCQkJYmJfZXJyb3JfbXNnKCJubyBzdXBwb3J0IGZvciBycGMgc2VydmljZXMiKTsKKwkJCWdvdG8gcGFyc2VfZXJyOworI2VuZGlmCisJCX0KKwkJLyogd2UgZG9uJ3QgcmVhbGx5IG5lZWQgZ2V0cHJvdG9ieW5hbWUoKSEgKi8KKwkJaWYgKHN0cmNtcChhcmcsICJ0Y3AiKSA9PSAwKQorCQkJc2VwLT5zZV9wcm90b19ubyA9IElQUFJPVE9fVENQOyAvKiA9IDYgKi8KKwkJaWYgKHN0cmNtcChhcmcsICJ1ZHAiKSA9PSAwKQorCQkJc2VwLT5zZV9wcm90b19ubyA9IElQUFJPVE9fVURQOyAvKiA9IDE3ICovCisJCWlmIChzaXgpCisJCQkqc2l4ID0gJzYnOworCQlpZiAoIXNlcC0+c2VfcHJvdG9fbm8pIC8qIG5vdCB0Y3AvdWRwPz8gKi8KKwkJCWdvdG8gcGFyc2VfZXJyOworCX0KKworCS8qIFtub113YWl0Wy5tYXhdIHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCWFyZyA9IHRva2VuWzNdOworCXNlcC0+c2VfbWF4ID0gbWF4X2NvbmN1cnJlbmN5OworCXAgPSBzdHJjaHIoYXJnLCAnLicpOworCWlmIChwKSB7CisJCSpwKysgPSAnXDAnOworCQlzZXAtPnNlX21heCA9IGJiX3N0cnRvdShwLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubykKKwkJCWdvdG8gcGFyc2VfZXJyOworCX0KKwlzZXAtPnNlX3dhaXQgPSAoYXJnWzBdICE9ICduJyB8fCBhcmdbMV0gIT0gJ28nKTsKKwlpZiAoIXNlcC0+c2Vfd2FpdCkgLyogIm5vIiBzZWVuICovCisJCWFyZyArPSAyOworCWlmIChzdHJjbXAoYXJnLCAid2FpdCIpICE9IDApCisJCWdvdG8gcGFyc2VfZXJyOworCisJLyogdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJc2VwLT5zZV91c2VyID0geHN0cmR1cCh0b2tlbls0XSk7CisJYXJnID0gc3RyY2hyKHNlcC0+c2VfdXNlciwgJy4nKTsKKwlpZiAoYXJnID09IE5VTEwpCisJCWFyZyA9IHN0cmNocihzZXAtPnNlX3VzZXIsICc6Jyk7CisJaWYgKGFyZykgeworCQkqYXJnKysgPSAnXDAnOworCQlzZXAtPnNlX2dyb3VwID0geHN0cmR1cChhcmcpOworCX0KKworCS8qIHByb2cgW2FyZ3NdICovCisJc2VwLT5zZV9wcm9ncmFtID0geHN0cmR1cCh0b2tlbls1XSk7CisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorCWlmIChzdHJjbXAoc2VwLT5zZV9wcm9ncmFtLCAiaW50ZXJuYWwiKSA9PSAwCisJICYmIHN0cmxlbihzZXAtPnNlX3NlcnZpY2UpIDw9IDcKKwkgJiYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0KKwkgICAgIHx8IHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19ER1JBTSkKKwkpIHsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVpbHRpbnMpOyBpKyspCisJCQlpZiAoc3RybmNtcChidWlsdGluc1tpXS5iaV9zZXJ2aWNlNywgc2VwLT5zZV9zZXJ2aWNlLCA3KSA9PSAwKQorCQkJCWdvdG8gZm91bmRfYmk7CisJCWJiX2Vycm9yX21zZygidW5rbm93biBpbnRlcm5hbCBzZXJ2aWNlICVzIiwgc2VwLT5zZV9zZXJ2aWNlKTsKKwkJZ290byBwYXJzZV9lcnI7CisgZm91bmRfYmk6CisJCXNlcC0+c2VfYnVpbHRpbiA9ICZidWlsdGluc1tpXTsKKwkJLyogc3RyZWFtIGJ1aWx0aW5zIG11c3QgYmUgIm5vd2FpdCIsIGRncmFtIG11c3QgYmUgIndhaXQiICovCisJCWlmIChzZXAtPnNlX3dhaXQgIT0gKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19ER1JBTSkpCisJCQlnb3RvIHBhcnNlX2VycjsKKwl9CisjZW5kaWYKKwlhcmdjID0gMDsKKwl3aGlsZSAoKGFyZyA9IHRva2VuWzYrYXJnY10pICE9IE5VTEwgJiYgYXJnYyA8IE1BWEFSR1YpCisJCXNlcC0+c2VfYXJndlthcmdjKytdID0geHN0cmR1cChhcmcpOworCS8qIFNvbWUgaW5ldGQuY29uZiBmaWxlcyBoYXZlIG5vIGFyZ3Yncywgbm90IGV2ZW4gYXJndlswXS4KKwkgKiBGaXggdGhlbSB1cC4KKwkgKiAoVGVjaG5pY2FsbHksIHByb2dyYW1zIGNhbiBiZSBleGVjZWQgd2l0aCBhcmd2WzBdID0gTlVMTCwKKwkgKiBidXQgbWFueSBwcm9ncmFtcyBkbyBub3QgbGlrZSB0aGF0IGF0IGFsbCkgKi8KKwlpZiAoYXJnYyA9PSAwKQorCQlzZXAtPnNlX2FyZ3ZbMF0gPSB4c3RyZHVwKHNlcC0+c2VfcHJvZ3JhbSk7CisKKwkvKiBjYXRjaCBtaXh1cHMuICI8c2VydmljZT4gc3RyZWFtIHVkcCAuLi4iID09IHd0ZiAqLworCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCWlmIChzZXAtPnNlX3Byb3RvX25vID09IElQUFJPVE9fVURQKQorCQkJZ290byBwYXJzZV9lcnI7CisJfQorCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfREdSQU0pIHsKKwkJaWYgKHNlcC0+c2VfcHJvdG9fbm8gPT0gSVBQUk9UT19UQ1ApCisJCQlnb3RvIHBhcnNlX2VycjsKKwl9CisKKy8vCWJiX2luZm9fbXNnKAorLy8JCSJFTlRSWVslc11bJXNdWyVzXVslZF1bJWRdWyVkXVslZF1bJWRdWyVzXVslc11bJXNdIiwKKy8vCQlzZXAtPnNlX2xvY2FsX2hvc3RuYW1lLCBzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8sIHNlcC0+c2Vfd2FpdCwgc2VwLT5zZV9wcm90b19ubywKKy8vCQlzZXAtPnNlX21heCwgc2VwLT5zZV9jb3VudCwgc2VwLT5zZV90aW1lLCBzZXAtPnNlX3VzZXIsIHNlcC0+c2VfZ3JvdXAsIHNlcC0+c2VfcHJvZ3JhbSk7CisKKwkvKiBjaGVjayBpZiB0aGUgaG9zdG5hbWUgc3BlY2lmaWVyIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QKKwkgKiBvZiBob3N0bmFtZXMuIHdlJ2xsIG1ha2UgbmV3IGVudHJpZXMgZm9yIGVhY2ggYWRkcmVzcy4gKi8KKwl3aGlsZSAoKGhvc3RkZWxpbSA9IHN0cnJjaHIoc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSwgJywnKSkgIT0gTlVMTCkgeworCQluc2VwID0gZHVwX3NlcnZ0YWIoc2VwKTsKKwkJLyogTlVMIHRlcm1pbmF0ZSB0aGUgaG9zdG5hbWUgZmllbGQgb2YgdGhlIGV4aXN0aW5nIGVudHJ5LAorCQkgKiBhbmQgbWFrZSBhIGR1cCBmb3IgdGhlIG5ldyBlbnRyeS4gKi8KKwkJKmhvc3RkZWxpbSsrID0gJ1wwJzsKKwkJbnNlcC0+c2VfbG9jYWxfaG9zdG5hbWUgPSB4c3RyZHVwKGhvc3RkZWxpbSk7CisJCW5zZXAtPnNlX25leHQgPSBzZXAtPnNlX25leHQ7CisJCXNlcC0+c2VfbmV4dCA9IG5zZXA7CisJfQorCisJLyogd2FzIGRvaW5nIGl0IGhlcmU6ICovCisJLyogRE5TIHJlc29sdXRpb24sIGNyZWF0ZSBjb3BpZXMgZm9yIGVhY2ggSVAgYWRkcmVzcyAqLworCS8qIElQdjYtaXphdGlvbiBkZXN0cm95ZWQgaXQgOiggKi8KKworCXJldHVybiBzZXA7Cit9CisKK3N0YXRpYyBzZXJ2dGFiX3QgKmluc2VydF9pbl9zZXJ2bGlzdChzZXJ2dGFiX3QgKmNwKQoreworCXNlcnZ0YWJfdCAqc2VwOworCXNpZ3NldF90IG9tYXNrOworCisJc2VwID0gbmV3X3NlcnZ0YWIoKTsKKwkqc2VwID0gKmNwOyAvKiBzdHJ1Y3QgY29weSAqLworCXNlcC0+c2VfZmQgPSAtMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwlzZXAtPnNlX3JwY3Byb2cgPSAtMTsKKyNlbmRpZgorCWJsb2NrX0NITERfSFVQX0FMUk0oJm9tYXNrKTsKKwlzZXAtPnNlX25leHQgPSBzZXJ2X2xpc3Q7CisJc2Vydl9saXN0ID0gc2VwOworCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCXJldHVybiBzZXA7Cit9CisKK3N0YXRpYyBpbnQgc2FtZV9zZXJ2X2FkZHJfcHJvdG8oc2VydnRhYl90ICpvbGQsIHNlcnZ0YWJfdCAqbmV3KQoreworCWlmIChzdHJjbXAob2xkLT5zZV9sb2NhbF9ob3N0bmFtZSwgbmV3LT5zZV9sb2NhbF9ob3N0bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cmNtcChvbGQtPnNlX3NlcnZpY2UsIG5ldy0+c2Vfc2VydmljZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cmNtcChvbGQtPnNlX3Byb3RvLCBuZXctPnNlX3Byb3RvKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmVyZWFkX2NvbmZpZ19maWxlKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXNlcnZ0YWJfdCAqc2VwLCAqY3AsICoqc2VwcDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJc2lnc2V0X3Qgb21hc2s7CisJdW5zaWduZWQgbjsKKwl1aW50MTZfdCBwb3J0OworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisKKwlpZiAoIXJlb3Blbl9jb25maWdfZmlsZSgpKQorCQlnb3RvIHJldDsKKwlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpCisJCXNlcC0+c2VfY2hlY2tlZCA9IDA7CisKKwlnb3RvIGZpcnN0X2xpbmU7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGNwID09IE5VTEwpIHsKKyBmaXJzdF9saW5lOgorCQkJY3AgPSBwYXJzZV9vbmVfbGluZSgpOworCQkJaWYgKGNwID09IE5VTEwpCisJCQkJYnJlYWs7CisJCX0KKwkJZm9yIChzZXAgPSBzZXJ2X2xpc3Q7IHNlcDsgc2VwID0gc2VwLT5zZV9uZXh0KQorCQkJaWYgKHNhbWVfc2Vydl9hZGRyX3Byb3RvKHNlcCwgY3ApKQorCQkJCWdvdG8gZXF1YWxfc2VydnRhYjsKKwkJLyogbm90IGFuICJlcXVhbCIgc2VydnRhYiAqLworCQlzZXAgPSBpbnNlcnRfaW5fc2Vydmxpc3QoY3ApOworCQlnb3RvIGFmdGVyX2NoZWNrOworIGVxdWFsX3NlcnZ0YWI6CisJCXsKKwkJCWludCBpOworCisJCQlibG9ja19DSExEX0hVUF9BTFJNKCZvbWFzayk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJCQlpZiAoaXNfcnBjX3NlcnZpY2Uoc2VwKSkKKwkJCQl1bnJlZ2lzdGVyX3JwYyhzZXApOworCQkJc2VwLT5zZV9ycGN2ZXJfbG8gPSBjcC0+c2VfcnBjdmVyX2xvOworCQkJc2VwLT5zZV9ycGN2ZXJfaGkgPSBjcC0+c2VfcnBjdmVyX2hpOworI2VuZGlmCisJCQlpZiAoY3AtPnNlX3dhaXQgPT0gMCkgeworCQkJCS8qIE5ldyBjb25maWcgc2F5cyAibm93YWl0Ii4gSWYgb2xkIG9uZQorCQkJCSAqIHdhcyAid2FpdCIsIHdlIGN1cnJlbnRseSBtYXkgYmUgd2FpdGluZworCQkJCSAqIGZvciBhIGNoaWxkIChhbmQgbm90IGFjY2VwdGluZyBjb25uZWN0cykuCisJCQkJICogU3RvcCB3YWl0aW5nLCBzdGFydCBsaXN0ZW5pbmcgYWdhaW4uCisJCQkJICogKGlmIGl0J3Mgbm90IHRydWUsIHRoaXMgb3AgaXMgaGFybWxlc3MpICovCisJCQkJYWRkX2ZkX3RvX3NldChzZXAtPnNlX2ZkKTsKKwkJCX0KKwkJCXNlcC0+c2Vfd2FpdCA9IGNwLT5zZV93YWl0OworCQkJc2VwLT5zZV9tYXggPSBjcC0+c2VfbWF4OworCQkJLyogc3RyaW5nIGZpZWxkcyBuZWVkIG1vcmUgbG92ZSAtIHdlIGRvbid0IHdhbnQgdG8gbGVhayB0aGVtICovCisjZGVmaW5lIFNXQVAodHlwZSwgYSwgYikgZG8geyB0eXBlIGMgPSAodHlwZSlhOyBhID0gKHR5cGUpYjsgYiA9ICh0eXBlKWM7IH0gd2hpbGUgKDApCisJCQlTV0FQKGNoYXIqLCBzZXAtPnNlX3VzZXIsIGNwLT5zZV91c2VyKTsKKwkJCVNXQVAoY2hhciosIHNlcC0+c2VfZ3JvdXAsIGNwLT5zZV9ncm91cCk7CisJCQlTV0FQKGNoYXIqLCBzZXAtPnNlX3Byb2dyYW0sIGNwLT5zZV9wcm9ncmFtKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhBUkdWOyBpKyspCisJCQkJU1dBUChjaGFyKiwgc2VwLT5zZV9hcmd2W2ldLCBjcC0+c2VfYXJndltpXSk7CisjdW5kZWYgU1dBUAorCQkJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJCQlmcmVlX3NlcnZ0YWJfc3RyaW5ncyhjcCk7CisJCX0KKyBhZnRlcl9jaGVjazoKKwkJLyogY3AtPnN0cmluZ19maWVsZHMgYXJlIGNvbnN1bWVkIGJ5IGluc2VydF9pbl9zZXJ2bGlzdCgpCisJCSAqIG9yIGZyZWVkIGF0IHRoaXMgcG9pbnQsIGNwIGl0c2VsZiBpcyBub3QgeWV0IGZyZWVkLiAqLworCQlzZXAtPnNlX2NoZWNrZWQgPSAxOworCisJCS8qIGNyZWF0ZSBuZXcgbGVuX2FuZF9zb2NrYWRkciAqLworCQlzd2l0Y2ggKHNlcC0+c2VfZmFtaWx5KSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bjsKKwkJY2FzZSBBRl9VTklYOgorCQkJbHNhID0geHphbGxvY19sc2EoQUZfVU5JWCk7CisJCQlzdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuKikmbHNhLT51LnNhOworCQkJc2FmZV9zdHJuY3B5KHN1bi0+c3VuX3BhdGgsIHNlcC0+c2Vfc2VydmljZSwgc2l6ZW9mKHN1bi0+c3VuX3BhdGgpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IC8qIGNhc2UgQUZfSU5FVCwgY2FzZSBBRl9JTkVUNiAqLworCQkJbiA9IGJiX3N0cnRvdShzZXAtPnNlX3NlcnZpY2UsIE5VTEwsIDEwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCWlmIChpc19ycGNfc2VydmljZShzZXApKSB7CisJCQkJc2VwLT5zZV9ycGNwcm9nID0gbjsKKwkJCQlpZiAoZXJybm8pIHsgLyogc2Vfc2VydmljZSBpcyBub3QgbnVtZXJpYyAqLworCQkJCQlzdHJ1Y3QgcnBjZW50ICpycCA9IGdldHJwY2J5bmFtZShzZXAtPnNlX3NlcnZpY2UpOworCQkJCQlpZiAocnAgPT0gTlVMTCkgeworCQkJCQkJYmJfZXJyb3JfbXNnKCIlczogdW5rbm93biBycGMgc2VydmljZSIsIHNlcC0+c2Vfc2VydmljZSk7CisJCQkJCQlnb3RvIG5leHRfY3A7CisJCQkJCX0KKwkJCQkJc2VwLT5zZV9ycGNwcm9nID0gcnAtPnJfbnVtYmVyOworCQkJCX0KKwkJCQlpZiAoc2VwLT5zZV9mZCA9PSAtMSkKKwkJCQkJcHJlcGFyZV9zb2NrZXRfZmQoc2VwKTsKKwkJCQlpZiAoc2VwLT5zZV9mZCAhPSAtMSkKKwkJCQkJcmVnaXN0ZXJfcnBjKHNlcCk7CisJCQkJZ290byBuZXh0X2NwOworCQkJfQorI2VuZGlmCisJCQkvKiB3aGF0IHBvcnQgdG8gbGlzdGVuIG9uPyAqLworCQkJcG9ydCA9IGh0b25zKG4pOworCQkJaWYgKGVycm5vIHx8IG4gPiAweGZmZmYpIHsgLyogc2Vfc2VydmljZSBpcyBub3QgbnVtZXJpYyAqLworCQkJCWNoYXIgcHJvdG9uYW1lWzRdOworCQkJCXN0cnVjdCBzZXJ2ZW50ICpzcDsKKwkJCQkvKiBjYW4gcmVzdWx0IG9ubHkgaW4gInRjcCIgb3IgInVkcCI6ICovCisJCQkJc2FmZV9zdHJuY3B5KHByb3RvbmFtZSwgc2VwLT5zZV9wcm90bywgNCk7CisJCQkJc3AgPSBnZXRzZXJ2YnluYW1lKHNlcC0+c2Vfc2VydmljZSwgcHJvdG9uYW1lKTsKKwkJCQlpZiAoc3AgPT0gTlVMTCkgeworCQkJCQliYl9lcnJvcl9tc2coIiVzLyVzOiB1bmtub3duIHNlcnZpY2UiLAorCQkJCQkJCXNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90byk7CisJCQkJCWdvdG8gbmV4dF9jcDsKKwkJCQl9CisJCQkJcG9ydCA9IHNwLT5zX3BvcnQ7CisJCQl9CisJCQlpZiAoTE9ORV9DSEFSKHNlcC0+c2VfbG9jYWxfaG9zdG5hbWUsICcqJykpIHsKKwkJCQlsc2EgPSB4emFsbG9jX2xzYShzZXAtPnNlX2ZhbWlseSk7CisJCQkJc2V0X25wb3J0KCZsc2EtPnUuc2EsIHBvcnQpOworCQkJfSBlbHNlIHsKKwkJCQlsc2EgPSBob3N0X2FuZF9hZjJzb2NrYWRkcihzZXAtPnNlX2xvY2FsX2hvc3RuYW1lLAorCQkJCQkJbnRvaHMocG9ydCksIHNlcC0+c2VfZmFtaWx5KTsKKwkJCQlpZiAoIWxzYSkgeworCQkJCQliYl9lcnJvcl9tc2coIiVzLyVzOiB1bmtub3duIGhvc3QgJyVzJyIsCisJCQkJCQlzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8sCisJCQkJCQlzZXAtPnNlX2xvY2FsX2hvc3RuYW1lKTsKKwkJCQkJZ290byBuZXh0X2NwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9IC8qIGVuZCBvZiAic3dpdGNoIChzZXAtPnNlX2ZhbWlseSkiICovCisKKwkJLyogZGlkIGxzYSBjaGFuZ2U/IFRoZW4gY2xvc2Uvb3BlbiAqLworCQlpZiAoc2VwLT5zZV9sc2EgPT0gTlVMTAorCQkgfHwgbHNhLT5sZW4gIT0gc2VwLT5zZV9sc2EtPmxlbgorCQkgfHwgbWVtY21wKCZsc2EtPnUuc2EsICZzZXAtPnNlX2xzYS0+dS5zYSwgbHNhLT5sZW4pICE9IDAKKwkJKSB7CisJCQlyZW1vdmVfZmRfZnJvbV9zZXQoc2VwLT5zZV9mZCk7CisJCQltYXliZV9jbG9zZShzZXAtPnNlX2ZkKTsKKwkJCWZyZWUoc2VwLT5zZV9sc2EpOworCQkJc2VwLT5zZV9sc2EgPSBsc2E7CisJCQlzZXAtPnNlX2ZkID0gLTE7CisJCX0gZWxzZSB7CisJCQlmcmVlKGxzYSk7CisJCX0KKwkJaWYgKHNlcC0+c2VfZmQgPT0gLTEpCisJCQlwcmVwYXJlX3NvY2tldF9mZChzZXApOworIG5leHRfY3A6CisJCXNlcCA9IGNwLT5zZV9uZXh0OworCQlmcmVlKGNwKTsKKwkJY3AgPSBzZXA7CisJfSAvKiBlbmQgb2YgIndoaWxlICgxKSBwYXJzZSBsaW5lcyIgKi8KKwljbG9zZV9jb25maWdfZmlsZSgpOworCisJLyogUHVyZ2UgYW55dGhpbmcgbm90IGxvb2tlZCBhdCBhYm92ZSAtIHRoZXNlIGFyZSBzdGFsZSBlbnRyaWVzLAorCSAqIG5ldyBjb25maWcgZmlsZSBkb2VzbnQgaGF2ZSB0aGVtLiAqLworCWJsb2NrX0NITERfSFVQX0FMUk0oJm9tYXNrKTsKKwlzZXBwID0gJnNlcnZfbGlzdDsKKwl3aGlsZSAoKHNlcCA9ICpzZXBwKSkgeworCQlpZiAoc2VwLT5zZV9jaGVja2VkKSB7CisJCQlzZXBwID0gJnNlcC0+c2VfbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpzZXBwID0gc2VwLT5zZV9uZXh0OworCQlyZW1vdmVfZmRfZnJvbV9zZXQoc2VwLT5zZV9mZCk7CisJCW1heWJlX2Nsb3NlKHNlcC0+c2VfZmQpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCQlpZiAoaXNfcnBjX3NlcnZpY2Uoc2VwKSkKKwkJCXVucmVnaXN0ZXJfcnBjKHNlcCk7CisjZW5kaWYKKwkJaWYgKHNlcC0+c2VfZmFtaWx5ID09IEFGX1VOSVgpCisJCQl1bmxpbmsoc2VwLT5zZV9zZXJ2aWNlKTsKKwkJZnJlZV9zZXJ2dGFiX3N0cmluZ3Moc2VwKTsKKwkJZnJlZShzZXApOworCX0KKwlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKyByZXQ6CisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCitzdGF0aWMgdm9pZCByZWFwX2NoaWxkKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCXNlcnZ0YWJfdCAqc2VwOworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisKKwlmb3IgKDs7KSB7CisJCXBpZCA9IHdhaXRfYW55X25vaGFuZygmc3RhdHVzKTsKKwkJaWYgKHBpZCA8PSAwKQorCQkJYnJlYWs7CisJCWZvciAoc2VwID0gc2Vydl9saXN0OyBzZXA7IHNlcCA9IHNlcC0+c2VfbmV4dCkgeworCQkJaWYgKHNlcC0+c2Vfd2FpdCAhPSBwaWQpCisJCQkJY29udGludWU7CisJCQkvKiBPbmUgb2Ygb3VyICJ3YWl0IiBzZXJ2aWNlcyAqLworCQkJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykpCisJCQkJYmJfZXJyb3JfbXNnKCIlczogZXhpdCBzdGF0dXMgJXUiLAorCQkJCQkJc2VwLT5zZV9wcm9ncmFtLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKwkJCWVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQkJYmJfZXJyb3JfbXNnKCIlczogZXhpdCBzaWduYWwgJXUiLAorCQkJCQkJc2VwLT5zZV9wcm9ncmFtLCBXVEVSTVNJRyhzdGF0dXMpKTsKKwkJCXNlcC0+c2Vfd2FpdCA9IDE7CisJCQlhZGRfZmRfdG9fc2V0KHNlcC0+c2VfZmQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCitzdGF0aWMgdm9pZCByZXRyeV9uZXR3b3JrX3NldHVwKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisJc2VydnRhYl90ICpzZXA7CisKKwlhbGFybV9hcm1lZCA9IDA7CisJZm9yIChzZXAgPSBzZXJ2X2xpc3Q7IHNlcDsgc2VwID0gc2VwLT5zZV9uZXh0KSB7CisJCWlmIChzZXAtPnNlX2ZkID09IC0xKSB7CisJCQlwcmVwYXJlX3NvY2tldF9mZChzZXApOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCQkJaWYgKHNlcC0+c2VfZmQgIT0gLTEgJiYgaXNfcnBjX3NlcnZpY2Uoc2VwKSkKKwkJCQlyZWdpc3Rlcl9ycGMoc2VwKTsKKyNlbmRpZgorCQl9CisJfQorCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworc3RhdGljIHZvaWQgY2xlYW5fdXBfYW5kX2V4aXQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2VydnRhYl90ICpzZXA7CisKKwkvKiBYWFggc2lnbmFsIHJhY2Ugd2Fsa2luZyBzZXAgbGlzdCAqLworCWZvciAoc2VwID0gc2Vydl9saXN0OyBzZXA7IHNlcCA9IHNlcC0+c2VfbmV4dCkgeworCQlpZiAoc2VwLT5zZV9mZCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoc2VwLT5zZV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9VTklYOgorCQkJdW5saW5rKHNlcC0+c2Vfc2VydmljZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogY2FzZSBBRl9JTkVULCBBRl9JTkVUNiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCQkJaWYgKHNlcC0+c2Vfd2FpdCA9PSAxICYmIGlzX3JwY19zZXJ2aWNlKHNlcCkpCisJCQkJdW5yZWdpc3Rlcl9ycGMoc2VwKTsgICAvKiBYWFggc2lnbmFsIHJhY2UgKi8KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJY2xvc2Uoc2VwLT5zZV9mZCk7CisJfQorCXJlbW92ZV9waWRmaWxlKF9QQVRIX0lORVREUElEKTsKKwlleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK2ludCBpbmV0ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaW5ldGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2EsIHNhdmVkX3BpcGVfaGFuZGxlcjsKKwlzZXJ2dGFiX3QgKnNlcCwgKnNlcDI7CisJc3RydWN0IHBhc3N3ZCAqcHdkOworCXN0cnVjdCBncm91cCAqZ3JwID0gZ3JwOyAvKiBmb3IgY29tcGlsZXIgKi8KKwlpbnQgb3B0OworCXBpZF90IHBpZDsKKwlzaWdzZXRfdCBvbWFzazsKKworCUlOSVRfRygpOworCisJcmVhbF91aWQgPSBnZXR1aWQoKTsKKwlpZiAocmVhbF91aWQgIT0gMCkgLyogcnVuIGJ5IG5vbi1yb290IHVzZXIgKi8KKwkJY29uZmlnX2ZpbGVuYW1lID0gTlVMTDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIlIrOnErIjsgLyogLXEgTiwgLVIgTiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJSOmZlcToiLCAmbWF4X2NvbmN1cnJlbmN5LCAmZ2xvYmFsX3F1ZXVlbGVuKTsKKwlhcmd2ICs9IG9wdGluZDsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWlmIChhcmd2WzBdKQorCQljb25maWdfZmlsZW5hbWUgPSBhcmd2WzBdOworCWlmIChjb25maWdfZmlsZW5hbWUgPT0gTlVMTCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vbi1yb290IG11c3Qgc3BlY2lmeSBjb25maWcgZmlsZSIpOworCWlmICghKG9wdCAmIDIpKQorCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoMCwgYXJndiAtIG9wdGluZCk7CisJZWxzZQorCQliYl9zYW5pdGl6ZV9zdGRpbygpOworCWlmICghKG9wdCAmIDQpKSB7CisJCS8qIExPR19OREVMQVk6IGNvbm5lY3QgdG8gc3lzbG9nIGRhZW1vbiBOT1cuCisJCSAqIE90aGVyd2lzZSwgd2UgbWF5IG9wZW4gc3lzbG9nIHNvY2tldAorCQkgKiBpbiB2Zm9ya2VkIGNoaWxkLCBtYWtpbmcgb3BlbmVkIGZkcyBhbmQgc3lzbG9nKCkKKwkJICogaW50ZXJuYWwgc3RhdGUgaW5jb25zaXN0ZW50LgorCQkgKiBUaGlzIHdhcyBvYnNlcnZlZCB0byBsZWFrIGZpbGUgZGVzY3JpcHRvcnMuICovCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQgfCBMT0dfTkRFTEFZLCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCX0KKworCWlmIChyZWFsX3VpZCA9PSAwKSB7CisJCS8qIHJ1biBieSByb290LCBlbnN1cmUgZ3JvdXBzIHZlY3RvciBnZXRzIHRyYXNoZWQgKi8KKwkJZ2lkX3QgZ2lkID0gZ2V0Z2lkKCk7CisJCXNldGdyb3VwcygxLCAmZ2lkKTsKKwl9CisKKwl3cml0ZV9waWRmaWxlKF9QQVRIX0lORVREUElEKTsKKworCS8qIG5ldmVyIGZhaWxzIHVuZGVyIExpbnV4IChleGNlcHQgaWYgeW91IHBhc3MgaXQgYmFkIGFyZ3VtZW50cykgKi8KKwlnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsaW1fb2ZpbGUpOworCXJsaW1fb2ZpbGVfY3VyID0gcmxpbV9vZmlsZS5ybGltX2N1cjsKKwlpZiAocmxpbV9vZmlsZV9jdXIgPT0gUkxJTV9JTkZJTklUWSkgICAgLyogISAqLworCQlybGltX29maWxlX2N1ciA9IE9QRU5fTUFYOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJLypzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7IC0gbWVtc2V0IGRpZCBpdCAqLworCXNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHQUxSTSk7CisJc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdDSExEKTsKKwlzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR0hVUCk7CisvL0ZJWE1FOiBleHBsYWluIHdoeSBubyBTQV9SRVNUQVJUCisvL0ZJWE1FOiByZXRyeV9uZXR3b3JrX3NldHVwIGlzIHVuc2FmZSB0byBydW4gaW4gc2lnbmFsIGhhbmRsZXIgKG1hbnkgcmVhc29ucykhCisJc2Euc2FfaGFuZGxlciA9IHJldHJ5X25ldHdvcmtfc2V0dXA7CisJc2lnYWN0aW9uX3NldChTSUdBTFJNLCAmc2EpOworLy9GSVhNRTogcmVyZWFkX2NvbmZpZ19maWxlIGlzIHVuc2FmZSB0byBydW4gaW4gc2lnbmFsIGhhbmRsZXIobWFueSByZWFzb25zKSEKKwlzYS5zYV9oYW5kbGVyID0gcmVyZWFkX2NvbmZpZ19maWxlOworCXNpZ2FjdGlvbl9zZXQoU0lHSFVQLCAmc2EpOworLy9GSVhNRTogcmVhcF9jaGlsZCBpcyB1bnNhZmUgdG8gcnVuIGluIHNpZ25hbCBoYW5kbGVyICh1c2VzIHN0ZGlvKSEKKwlzYS5zYV9oYW5kbGVyID0gcmVhcF9jaGlsZDsKKwlzaWdhY3Rpb25fc2V0KFNJR0NITEQsICZzYSk7CisvL0ZJWE1FOiBjbGVhbl91cF9hbmRfZXhpdCBpcyB1bnNhZmUgdG8gcnVuIGluIHNpZ25hbCBoYW5kbGVyICh1c2VzIHN0ZGlvKSEKKwlzYS5zYV9oYW5kbGVyID0gY2xlYW5fdXBfYW5kX2V4aXQ7CisJc2lnYWN0aW9uX3NldChTSUdURVJNLCAmc2EpOworCXNhLnNhX2hhbmRsZXIgPSBjbGVhbl91cF9hbmRfZXhpdDsKKwlzaWdhY3Rpb25fc2V0KFNJR0lOVCwgJnNhKTsKKwlzYS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKwlzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCAmc2F2ZWRfcGlwZV9oYW5kbGVyKTsKKworCXJlcmVhZF9jb25maWdfZmlsZShTSUdIVVApOyAvKiBsb2FkIGNvbmZpZyBmcm9tIGZpbGUgKi8KKworCWZvciAoOzspIHsKKwkJaW50IHJlYWR5X2ZkX2NudDsKKwkJaW50IGN0cmwsIGFjY2VwdGVkX2ZkLCBuZXdfdWRwX2ZkOworCQlmZF9zZXQgcmVhZGFibGU7CisKKwkJaWYgKG1heHNvY2sgPCAwKQorCQkJcmVjYWxjdWxhdGVfbWF4c29jaygpOworCisJCXJlYWRhYmxlID0gYWxsc29jazsgLyogc3RydWN0IGNvcHkgKi8KKwkJLyogaWYgdGhlcmUgYXJlIG5vIGZkcyB0byB3YWl0IG9uLCB3ZSB3aWxsIGJsb2NrCisJCSAqIHVudGlsIHNpZ25hbCB3YWtlcyB1cyB1cCAobWF4c29jayA9PSAwLCBidXQgcmVhZGFibGUKKwkJICogbmV2ZXIgY29udGFpbnMgZmRzIDAgYW5kIDEuLi4pICovCisJCXJlYWR5X2ZkX2NudCA9IHNlbGVjdChtYXhzb2NrICsgMSwgJnJlYWRhYmxlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJlYWR5X2ZkX2NudCA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikgeworCQkJCWJiX3BlcnJvcl9tc2coInNlbGVjdCIpOworCQkJCXNsZWVwKDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgcmVhZHlfZmRfY250ICYmIHNlcDsgc2VwID0gc2VwLT5zZV9uZXh0KSB7CisJCQlpZiAoc2VwLT5zZV9mZCA9PSAtMSB8fCAhRkRfSVNTRVQoc2VwLT5zZV9mZCwgJnJlYWRhYmxlKSkKKwkJCQljb250aW51ZTsKKworCQkJcmVhZHlfZmRfY250LS07CisJCQljdHJsID0gc2VwLT5zZV9mZDsKKwkJCWFjY2VwdGVkX2ZkID0gLTE7CisJCQluZXdfdWRwX2ZkID0gLTE7CisJCQlpZiAoIXNlcC0+c2Vfd2FpdCkgeworCQkJCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCQkJCWN0cmwgPSBhY2NlcHRlZF9mZCA9IGFjY2VwdChzZXAtPnNlX2ZkLCBOVUxMLCBOVUxMKTsKKwkJCQkJaWYgKGN0cmwgPCAwKSB7CisJCQkJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJCQkJYmJfcGVycm9yX21zZygiYWNjZXB0IChmb3IgJXMpIiwgc2VwLT5zZV9zZXJ2aWNlKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCS8qICJub3dhaXQiIHVkcCAqLworCQkJCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfREdSQU0KKwkJCQkgJiYgc2VwLT5zZV9mYW1pbHkgIT0gQUZfVU5JWAorCQkJCSkgeworLyogSG93IHVkcCAibm93YWl0IiB3b3JrczoKKyAqIGNoaWxkIHBlZWtzIGF0IChyZWNlaXZlZCBhbmQgYnVmZmVyZWQgYnkga2VybmVsKSBVRFAgcGFja2V0LAorICogcGVyZm9ybXMgY29ubmVjdCgpIG9uIHRoZSBzb2NrZXQgc28gdGhhdCBpdCBpcyBsaW5rZWQgb25seQorICogdG8gdGhpcyBwZWVyLiBCdXQgdGhpcyBhbHNvIGFmZmVjdHMgcGFyZW50LCBiZWNhdXNlIGRlc2NyaXB0b3JzCisgKiBhcmUgc2hhcmVkIGFmdGVyIGZvcmsoKSBhLWxhIGR1cCgpLiBXaGVuIHBhcmVudCBwZXJmb3JtcworICogc2VsZWN0KCksIGl0IHdpbGwgc2VlIHRoaXMgZGVzY3JpcHRvciBjb25uZWN0ZWQgdG8gdGhlIHBlZXIgKCEpCisgKiBhbmQgc3RpbGwgcmVhZGFibGUsIHdpbGwgYWN0IG9uIGl0IGFuZCBtZXNzIHRoaW5ncyB1cAorICogKGNhbiBjcmVhdGUgbWFueSBjb3BpZXMgb2Ygc2FtZSBjaGlsZCwgZXRjKS4KKyAqIFBhcmVudCBtdXN0IGNyZWF0ZSBhbmQgdXNlIG5ldyBzb2NrZXQgaW5zdGVhZC4gKi8KKwkJCQkJbmV3X3VkcF9mZCA9IHNvY2tldChzZXAtPnNlX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJCQkJCWlmIChuZXdfdWRwX2ZkIDwgMCkgeyAvKiBlcnJvcjogZWF0IHBhY2tldCwgZm9yZ2V0IGFib3V0IGl0ICovCisgdWRwX2VycjoKKwkJCQkJCXJlY3Yoc2VwLT5zZV9mZCwgbGluZSwgTElORV9TSVpFLCBNU0dfRE9OVFdBSVQpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJc2V0c29ja29wdF9yZXVzZWFkZHIobmV3X3VkcF9mZCk7CisJCQkJCS8qIFRPRE86IGJldHRlciBkbyBiaW5kIGFmdGVyIHZmb3JrIGluIHBhcmVudCwKKwkJCQkJICogc28gdGhhdCB3ZSBkb24ndCBoYXZlIHR3byB3aWxkY2FyZCBib3VuZCBzb2NrZXRzCisJCQkJCSAqIGV2ZW4gZm9yIGEgYnJpZWYgbW9tZW50PyAqLworCQkJCQlpZiAoYmluZChuZXdfdWRwX2ZkLCAmc2VwLT5zZV9sc2EtPnUuc2EsIHNlcC0+c2VfbHNhLT5sZW4pIDwgMCkgeworCQkJCQkJY2xvc2UobmV3X3VkcF9mZCk7CisJCQkJCQlnb3RvIHVkcF9lcnI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJsb2NrX0NITERfSFVQX0FMUk0oJm9tYXNrKTsKKwkJCXBpZCA9IDA7CisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorCQkJLyogZG8gd2UgbmVlZCB0byBmb3JrPyAqLworCQkJaWYgKHNlcC0+c2VfYnVpbHRpbiA9PSBOVUxMCisJCQkgfHwgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0KKwkJCSAgICAgJiYgc2VwLT5zZV9idWlsdGluLT5iaV9mb3JrKSkKKyNlbmRpZgorCQkJeworCQkJCWlmIChzZXAtPnNlX21heCAhPSAwKSB7CisJCQkJCWlmICgrK3NlcC0+c2VfY291bnQgPT0gMSkKKwkJCQkJCXNlcC0+c2VfdGltZSA9IG1vbm90b25pY19zZWMoKTsKKwkJCQkJZWxzZSBpZiAoc2VwLT5zZV9jb3VudCA+PSBzZXAtPnNlX21heCkgeworCQkJCQkJdW5zaWduZWQgbm93ID0gbW9ub3RvbmljX3NlYygpOworCQkJCQkJLyogZGlkIHdlIGFjY3VtdWxhdGUgc2VfbWF4IGNvbm5lY3RzIHRvbyBxdWlja2x5PyAqLworCQkJCQkJaWYgKG5vdyAtIHNlcC0+c2VfdGltZSA8PSBDTlRfSU5URVJWQUwpIHsKKwkJCQkJCQliYl9lcnJvcl9tc2coIiVzLyVzOiB0b28gbWFueSBjb25uZWN0aW9ucywgcGF1c2luZyIsCisJCQkJCQkJCQlzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8pOworCQkJCQkJCXJlbW92ZV9mZF9mcm9tX3NldChzZXAtPnNlX2ZkKTsKKwkJCQkJCQljbG9zZShzZXAtPnNlX2ZkKTsKKwkJCQkJCQlzZXAtPnNlX2ZkID0gLTE7CisJCQkJCQkJc2VwLT5zZV9jb3VudCA9IDA7CisJCQkJCQkJcmVhcm1fYWxhcm0oKTsgLyogd2lsbCByZXZpdmUgaXQgaW4gUkVUUllUSU1FIHNlYyAqLworCQkJCQkJCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCQkJCQkJCW1heWJlX2Nsb3NlKG5ld191ZHBfZmQpOworCQkJCQkJCW1heWJlX2Nsb3NlKGFjY2VwdGVkX2ZkKTsKKwkJCQkJCQljb250aW51ZTsgLyogLT4gY2hlY2sgbmV4dCBmZCBpbiBmZCBzZXQgKi8KKwkJCQkJCX0KKwkJCQkJCXNlcC0+c2VfY291bnQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCS8qIG9uIE5PTU1VLCBzdHJlYW1lZCBjaGFyZ2VuCisJCQkJICogYnVpbHRpbiB3b3VsZG4ndCB3b3JrLCBidXQgaXQgaXMKKwkJCQkgKiBub3QgYWxsb3dlZCBvbiBOT01NVSAoaWZkZWZlZCBvdXQpICovCisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorCQkJCWlmIChCQl9NTVUgJiYgc2VwLT5zZV9idWlsdGluKQorCQkJCQlwaWQgPSBmb3JrKCk7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJCXBpZCA9IHZmb3JrKCk7CisKKwkJCQlpZiAocGlkIDwgMCkgeyAvKiBmb3JrIGVycm9yICovCisJCQkJCWJiX3BlcnJvcl9tc2coInZmb3JrIisxKTsKKwkJCQkJc2xlZXAoMSk7CisJCQkJCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCQkJCQltYXliZV9jbG9zZShuZXdfdWRwX2ZkKTsKKwkJCQkJbWF5YmVfY2xvc2UoYWNjZXB0ZWRfZmQpOworCQkJCQljb250aW51ZTsgLyogLT4gY2hlY2sgbmV4dCBmZCBpbiBmZCBzZXQgKi8KKwkJCQl9CisJCQkJaWYgKHBpZCA9PSAwKQorCQkJCQlwaWQtLTsgLyogLTE6ICJ3ZSBkaWQgZm9yayBhbmQgd2UgYXJlIGNoaWxkIiAqLworCQkJfQorCQkJLyogaWYgcGlkID09IDAgaGVyZSwgd2UgZGlkbid0IGZvcmsgKi8KKworCQkJaWYgKHBpZCA+IDApIHsgLyogcGFyZW50ICovCisJCQkJaWYgKHNlcC0+c2Vfd2FpdCkgeworCQkJCQkvKiB3YWl0OiB3ZSBwYXNzZWQgc29ja2V0IHRvIGNoaWxkLAorCQkJCQkgKiB3aWxsIHdhaXQgZm9yIGNoaWxkIHRvIHRlcm1pbmF0ZSAqLworCQkJCQlzZXAtPnNlX3dhaXQgPSBwaWQ7CisJCQkJCXJlbW92ZV9mZF9mcm9tX3NldChzZXAtPnNlX2ZkKTsKKwkJCQl9CisJCQkJaWYgKG5ld191ZHBfZmQgPj0gMCkgeworCQkJCQkvKiB1ZHAgbm93YWl0OiBjaGlsZCBjb25uZWN0ZWQgdGhlIHNvY2tldCwKKwkJCQkJICogd2UgY3JlYXRlZCBhbmQgd2lsbCB1c2UgbmV3LCB1bmNvbm5lY3RlZCBvbmUgKi8KKwkJCQkJeG1vdmVfZmQobmV3X3VkcF9mZCwgc2VwLT5zZV9mZCk7CisJCQkJfQorCQkJCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCQkJCW1heWJlX2Nsb3NlKGFjY2VwdGVkX2ZkKTsKKwkJCQljb250aW51ZTsgLyogLT4gY2hlY2sgbmV4dCBmZCBpbiBmZCBzZXQgKi8KKwkJCX0KKworCQkJLyogd2UgYXJlIGVpdGhlciBjaGlsZCBvciBkaWRuJ3QgdmZvcmsgYXQgYWxsICovCisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorCQkJaWYgKHNlcC0+c2VfYnVpbHRpbikgeworCQkJCWlmIChwaWQpIHsgLyogInBpZCIgaXMgLTE6IHdlIGRpZCB2Zm9yayAqLworCQkJCQljbG9zZShzZXAtPnNlX2ZkKTsgLyogbGlzdGVuaW5nIHNvY2tldCAqLworCQkJCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOyAvKiBtYWtlIHh3cml0ZSBldGMgc2lsZW50ICovCisJCQkJfQorCQkJCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCQkJCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKQorCQkJCQlzZXAtPnNlX2J1aWx0aW4tPmJpX3N0cmVhbV9mbihjdHJsLCBzZXApOworCQkJCWVsc2UKKwkJCQkJc2VwLT5zZV9idWlsdGluLT5iaV9kZ3JhbV9mbihjdHJsLCBzZXApOworCQkJCWlmIChwaWQpIC8qIHdlIGRpZCB2Zm9yayAqLworCQkJCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJCW1heWJlX2Nsb3NlKGFjY2VwdGVkX2ZkKTsKKwkJCQljb250aW51ZTsgLyogLT4gY2hlY2sgbmV4dCBmZCBpbiBmZCBzZXQgKi8KKwkJCX0KKyNlbmRpZgorCQkJLyogY2hpbGQgKi8KKwkJCXNldHNpZCgpOworCQkJLyogIm5vd2FpdCIgdWRwICovCisJCQlpZiAobmV3X3VkcF9mZCA+PSAwKSB7CisJCQkJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCQkJCWludCByOworCisJCQkJY2xvc2UobmV3X3VkcF9mZCk7CisJCQkJbHNhID0geHphbGxvY19sc2Eoc2VwLT5zZV9mYW1pbHkpOworCQkJCS8qIHBlZWsgYXQgdGhlIHBhY2tldCBhbmQgcmVtZW1iZXIgcGVlciBhZGRyICovCisJCQkJciA9IHJlY3Zmcm9tKGN0cmwsIE5VTEwsIDAsIE1TR19QRUVLfE1TR19ET05UV0FJVCwKKwkJCQkJJmxzYS0+dS5zYSwgJmxzYS0+bGVuKTsKKwkJCQlpZiAociA8IDApCisJCQkJCWdvdG8gZG9fZXhpdDE7CisJCQkJLyogbWFrZSB0aGlzIHNvY2tldCAiY29ubmVjdGVkIiB0byBwZWVyIGFkZHI6CisJCQkJICogb25seSBwYWNrZXRzIGZyb20gdGhpcyBwZWVyIHdpbGwgYmUgcmVjdidlZCwKKwkJCQkgKiBhbmQgYmFyZSB3cml0ZSgpL3NlbmQoKSB3aWxsIHdvcmsgb24gaXQgKi8KKwkJCQljb25uZWN0KGN0cmwsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKwkJCQlmcmVlKGxzYSk7CisJCQl9CisJCQkvKiBwcmVwYXJlIGVudiBhbmQgZXhlYyBwcm9ncmFtICovCisJCQlwd2QgPSBnZXRwd25hbShzZXAtPnNlX3VzZXIpOworCQkJaWYgKHB3ZCA9PSBOVUxMKSB7CisJCQkJYmJfZXJyb3JfbXNnKCIlczogbm8gc3VjaCAlcyIsIHNlcC0+c2VfdXNlciwgInVzZXIiKTsKKwkJCQlnb3RvIGRvX2V4aXQxOworCQkJfQorCQkJaWYgKHNlcC0+c2VfZ3JvdXAgJiYgKGdycCA9IGdldGdybmFtKHNlcC0+c2VfZ3JvdXApKSA9PSBOVUxMKSB7CisJCQkJYmJfZXJyb3JfbXNnKCIlczogbm8gc3VjaCAlcyIsIHNlcC0+c2VfZ3JvdXAsICJncm91cCIpOworCQkJCWdvdG8gZG9fZXhpdDE7CisJCQl9CisJCQlpZiAocmVhbF91aWQgIT0gMCAmJiByZWFsX3VpZCAhPSBwd2QtPnB3X3VpZCkgeworCQkJCS8qIGEgdXNlciBydW5uaW5nIHByaXZhdGUgaW5ldGQgKi8KKwkJCQliYl9lcnJvcl9tc2coIm5vbi1yb290IG11c3QgcnVuIHNlcnZpY2VzIGFzIGhpbXNlbGYiKTsKKwkJCQlnb3RvIGRvX2V4aXQxOworCQkJfQorCQkJaWYgKHB3ZC0+cHdfdWlkKSB7CisJCQkJaWYgKHNlcC0+c2VfZ3JvdXApCisJCQkJCXB3ZC0+cHdfZ2lkID0gZ3JwLT5ncl9naWQ7CisJCQkJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQ6ICovCisJCQkJY2hhbmdlX2lkZW50aXR5KHB3ZCk7CisJCQl9IGVsc2UgaWYgKHNlcC0+c2VfZ3JvdXApIHsKKwkJCQl4c2V0Z2lkKGdycC0+Z3JfZ2lkKTsKKwkJCQlzZXRncm91cHMoMSwgJmdycC0+Z3JfZ2lkKTsKKwkJCX0KKwkJCWlmIChybGltX29maWxlLnJsaW1fY3VyICE9IHJsaW1fb2ZpbGVfY3VyKQorCQkJCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsaW1fb2ZpbGUpIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZygic2V0cmxpbWl0Iik7CisKKwkJCS8qIGNsb3NlbG9nKCk7IC0gV1JPTkcuIHdlIGFyZSBhZnRlciB2Zm9yaywKKwkJCSAqIHRoaXMgbWF5IGNvbmZ1c2Ugc3lzbG9nKCkgaW50ZXJuYWwgc3RhdGUuCisJCQkgKiBMZXQncyBob3BlIGxpYmMgc2V0cyBzeXNsb2cgZmQgdG8gQ0xPRVhFQy4uLgorCQkJICovCisJCQl4bW92ZV9mZChjdHJsLCBTVERJTl9GSUxFTk8pOworCQkJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwkJCS8qIG1hbnBhZ2VzIG9mIGluZXRkIEkgbWFuYWdlZCB0byBmaW5kIGVpdGhlciBzYXkKKwkJCSAqIHRoYXQgc3RkZXJyIGlzIGFsc28gcmVkaXJlY3RlZCB0byB0aGUgbmV0d29yaywKKwkJCSAqIG9yIGRvIG5vdCB0YWxrIGFib3V0IHJlZGlyZWN0aW9uIGF0IGFsbCAoISkgKi8KKwkJCWlmICghc2VwLT5zZV93YWl0KSAvKiBvbmx5IGZvciB1c3VhbCAidGNwIG5vd2FpdCIgKi8KKwkJCQl4ZHVwMihTVERJTl9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCQkJLyogTkI6IGFtb25nIG90aGVycywgdGhpcyBsb29wIGNsb3NlcyBsaXN0ZW5pbmcgc29ja2V0cworCQkJICogZm9yIG5vd2FpdCBzdHJlYW0gY2hpbGRyZW4gKi8KKwkJCWZvciAoc2VwMiA9IHNlcnZfbGlzdDsgc2VwMjsgc2VwMiA9IHNlcDItPnNlX25leHQpCisJCQkJaWYgKHNlcDItPnNlX2ZkICE9IGN0cmwpCisJCQkJCW1heWJlX2Nsb3NlKHNlcDItPnNlX2ZkKTsKKwkJCXNpZ2FjdGlvbl9zZXQoU0lHUElQRSwgJnNhdmVkX3BpcGVfaGFuZGxlcik7CisJCQlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKwkJCUJCX0VYRUNWUChzZXAtPnNlX3Byb2dyYW0sIHNlcC0+c2VfYXJndik7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBleGVjdXRlICclcyciLCBzZXAtPnNlX3Byb2dyYW0pOworIGRvX2V4aXQxOgorCQkJLyogZWF0IHBhY2tldCBpbiB1ZHAgY2FzZSAqLworCQkJaWYgKHNlcC0+c2Vfc29ja3R5cGUgIT0gU09DS19TVFJFQU0pCisJCQkJcmVjdigwLCBsaW5lLCBMSU5FX1NJWkUsIE1TR19ET05UV0FJVCk7CisJCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCQl9IC8qIGZvciAoc2VwID0gc2VydnRhYi4uLikgKi8KKwl9IC8qIGZvciAoOzspICovCit9CisKKyNpZiAhQkJfTU1VCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2F0X2FyZ3NbXSA9IHsgImNhdCIsIE5VTEwgfTsKKyNlbmRpZgorCisvKgorICogSW50ZXJuZXQgc2VydmljZXMgcHJvdmlkZWQgaW50ZXJuYWxseSBieSBpbmV0ZDoKKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPCisvKiBFY2hvIHNlcnZpY2UgLS0gZWNobyBkYXRhIGJhY2suICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGVjaG9fc3RyZWFtKGludCBzLCBzZXJ2dGFiX3QgKnNlcCBVTlVTRURfUEFSQU0pCit7CisjaWYgQkJfTU1VCisJd2hpbGUgKDEpIHsKKwkJc3NpemVfdCBzeiA9IHNhZmVfcmVhZChzLCBsaW5lLCBMSU5FX1NJWkUpOworCQlpZiAoc3ogPD0gMCkKKwkJCWJyZWFrOworCQl4d3JpdGUocywgbGluZSwgc3opOworCX0KKyNlbHNlCisJLyogV2UgYXJlIGFmdGVyIHZmb3JrIGhlcmUhICovCisJLyogbW92ZSBuZXR3b3JrIHNvY2tldCB0byBzdGRpbi9zdGRvdXQgKi8KKwl4bW92ZV9mZChzLCBTVERJTl9GSUxFTk8pOworCXhkdXAyKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisJLyogbm8gZXJyb3IgbWVzc2FnZXMgcGxlYXNlLi4uICovCisJY2xvc2UoU1RERVJSX0ZJTEVOTyk7CisJeG9wZW4oYmJfZGV2X251bGwsIE9fV1JPTkxZKTsKKwlCQl9FWEVDVlAoImNhdCIsIChjaGFyKiopY2F0X2FyZ3MpOworCS8qIG9uIGZhaWx1cmUgd2UgcmV0dXJuIHRvIG1haW4sIHdoaWNoIGRvZXMgZXhpdChFWElUX0ZBSUxVUkUpICovCisjZW5kaWYKK30KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBlY2hvX2RnKGludCBzLCBzZXJ2dGFiX3QgKnNlcCkKK3sKKwllbnVtIHsgQlVGU0laRSA9IDEyKjEwMjQgfTsgLyogZm9yIGp1bWJvIHNpemVkIHBhY2tldHMhIDopICovCisJY2hhciAqYnVmID0geG1hbGxvYyhCVUZTSVpFKTsgLyogdG9vIGJpZyBmb3Igc3RhY2sgKi8KKwlpbnQgc3o7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhID0gYWxsb2NhKExTQV9MRU5fU0laRSArIHNlcC0+c2VfbHNhLT5sZW4pOworCisJbHNhLT5sZW4gPSBzZXAtPnNlX2xzYS0+bGVuOworCS8qIGRncmFtIGJ1aWx0aW5zIGFyZSBub24tZm9ya2luZyAtIERPTlQgQkxPQ0shICovCisJc3ogPSByZWN2ZnJvbShzLCBidWYsIEJVRlNJWkUsIE1TR19ET05UV0FJVCwgJmxzYS0+dS5zYSwgJmxzYS0+bGVuKTsKKwlpZiAoc3ogPiAwKQorCQlzZW5kdG8ocywgYnVmLCBzeiwgMCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCWZyZWUoYnVmKTsKK30KKyNlbmRpZiAgLyogRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITyAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRAorLyogRGlzY2FyZCBzZXJ2aWNlIC0tIGlnbm9yZSBkYXRhLiAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkaXNjYXJkX3N0cmVhbShpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworI2lmIEJCX01NVQorCXdoaWxlIChzYWZlX3JlYWQocywgbGluZSwgTElORV9TSVpFKSA+IDApCisJCWNvbnRpbnVlOworI2Vsc2UKKwkvKiBXZSBhcmUgYWZ0ZXIgdmZvcmsgaGVyZSEgKi8KKwkvKiBtb3ZlIG5ldHdvcmsgc29ja2V0IHRvIHN0ZGluICovCisJeG1vdmVfZmQocywgU1RESU5fRklMRU5PKTsKKwkvKiBkaXNjYXJkIG91dHB1dCAqLworCWNsb3NlKFNURE9VVF9GSUxFTk8pOworCXhvcGVuKGJiX2Rldl9udWxsLCBPX1dST05MWSk7CisJLyogbm8gZXJyb3IgbWVzc2FnZXMgcGxlYXNlLi4uICovCisJeGR1cDIoU1RET1VUX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7CisJQkJfRVhFQ1ZQKCJjYXQiLCAoY2hhcioqKWNhdF9hcmdzKTsKKwkvKiBvbiBmYWlsdXJlIHdlIHJldHVybiB0byBtYWluLCB3aGljaCBkb2VzIGV4aXQoRVhJVF9GQUlMVVJFKSAqLworI2VuZGlmCit9CisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRpc2NhcmRfZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBkZ3JhbSBidWlsdGlucyBhcmUgbm9uLWZvcmtpbmcgLSBET05UIEJMT0NLISAqLworCXJlY3YocywgbGluZSwgTElORV9TSVpFLCBNU0dfRE9OVFdBSVQpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KKyNkZWZpbmUgTElORVNJWiA3Mgorc3RhdGljIHZvaWQgaW5pdF9yaW5nKHZvaWQpCit7CisJaW50IGk7CisKKwllbmRfcmluZyA9IHJpbmc7CisJZm9yIChpID0gJyAnOyBpIDwgMTI3OyBpKyspCisJCSplbmRfcmluZysrID0gaTsKK30KKy8qIENoYXJhY3RlciBnZW5lcmF0b3IuIE1NVSBhcmNoZXMgb25seS4gKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9zdHJlYW0oaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyICpyczsKKwlpbnQgbGVuOworCWNoYXIgdGV4dFtMSU5FU0laICsgMl07CisKKwlpZiAoIWVuZF9yaW5nKSB7CisJCWluaXRfcmluZygpOworCQlycyA9IHJpbmc7CisJfQorCisJdGV4dFtMSU5FU0laXSA9ICdccic7CisJdGV4dFtMSU5FU0laICsgMV0gPSAnXG4nOworCXJzID0gcmluZzsKKwlmb3IgKDs7KSB7CisJCWxlbiA9IGVuZF9yaW5nIC0gcnM7CisJCWlmIChsZW4gPj0gTElORVNJWikKKwkJCW1lbW1vdmUodGV4dCwgcnMsIExJTkVTSVopOworCQllbHNlIHsKKwkJCW1lbW1vdmUodGV4dCwgcnMsIGxlbik7CisJCQltZW1tb3ZlKHRleHQgKyBsZW4sIHJpbmcsIExJTkVTSVogLSBsZW4pOworCQl9CisJCWlmICgrK3JzID09IGVuZF9yaW5nKQorCQkJcnMgPSByaW5nOworCQl4d3JpdGUocywgdGV4dCwgc2l6ZW9mKHRleHQpKTsKKwl9Cit9CisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNoYXJnZW5fZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCWludCBsZW47CisJY2hhciB0ZXh0W0xJTkVTSVogKyAyXTsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBhbGxvY2EoTFNBX0xFTl9TSVpFICsgc2VwLT5zZV9sc2EtPmxlbik7CisKKwkvKiBFYXQgVURQIHBhY2tldCB3aGljaCBzdGFydGVkIGl0IGFsbCAqLworCS8qIGRncmFtIGJ1aWx0aW5zIGFyZSBub24tZm9ya2luZyAtIERPTlQgQkxPQ0shICovCisJbHNhLT5sZW4gPSBzZXAtPnNlX2xzYS0+bGVuOworCWlmIChyZWN2ZnJvbShzLCB0ZXh0LCBzaXplb2YodGV4dCksIE1TR19ET05UV0FJVCwgJmxzYS0+dS5zYSwgJmxzYS0+bGVuKSA8IDApCisJCXJldHVybjsKKworCWlmICghZW5kX3JpbmcpIHsKKwkJaW5pdF9yaW5nKCk7CisJCXJpbmdfcG9zID0gcmluZzsKKwl9CisKKwlsZW4gPSBlbmRfcmluZyAtIHJpbmdfcG9zOworCWlmIChsZW4gPj0gTElORVNJWikKKwkJbWVtbW92ZSh0ZXh0LCByaW5nX3BvcywgTElORVNJWik7CisJZWxzZSB7CisJCW1lbW1vdmUodGV4dCwgcmluZ19wb3MsIGxlbik7CisJCW1lbW1vdmUodGV4dCArIGxlbiwgcmluZywgTElORVNJWiAtIGxlbik7CisJfQorCWlmICgrK3JpbmdfcG9zID09IGVuZF9yaW5nKQorCQlyaW5nX3BvcyA9IHJpbmc7CisJdGV4dFtMSU5FU0laXSA9ICdccic7CisJdGV4dFtMSU5FU0laICsgMV0gPSAnXG4nOworCXNlbmR0byhzLCB0ZXh0LCBzaXplb2YodGV4dCksIDAsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FCisvKgorICogUmV0dXJuIGEgbWFjaGluZSByZWFkYWJsZSBkYXRlIGFuZCB0aW1lLCBpbiB0aGUgZm9ybSBvZiB0aGUKKyAqIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW4gMSwgMTkwMC4gIFNpbmNlIGdldHRpbWVvZmRheQorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbiAxLCAxOTcwLAorICogd2UgbXVzdCBhZGQgMjIwODk4ODgwMCBzZWNvbmRzIHRvIHRoaXMgZmlndXJlIHRvIG1ha2UgdXAgZm9yCisgKiBzb21lIHNldmVudHkgeWVhcnMgQmVsbCBMYWJzIHdhcyBhc2xlZXAuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBtYWNodGltZSh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmV0dXJuIGh0b25sKCh1aW50MzJfdCkodHYudHZfc2VjICsgMjIwODk4ODgwMCkpOworfQorLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBtYWNodGltZV9zdHJlYW0oaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKwl1aW50MzJfdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBtYWNodGltZSgpOworCWZ1bGxfd3JpdGUocywgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworfQorc3RhdGljIHZvaWQgRkFTVF9GVU5DIG1hY2h0aW1lX2RnKGludCBzLCBzZXJ2dGFiX3QgKnNlcCkKK3sKKwl1aW50MzJfdCByZXN1bHQ7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhID0gYWxsb2NhKExTQV9MRU5fU0laRSArIHNlcC0+c2VfbHNhLT5sZW4pOworCisJbHNhLT5sZW4gPSBzZXAtPnNlX2xzYS0+bGVuOworCWlmIChyZWN2ZnJvbShzLCBsaW5lLCBMSU5FX1NJWkUsIE1TR19ET05UV0FJVCwgJmxzYS0+dS5zYSwgJmxzYS0+bGVuKSA8IDApCisJCXJldHVybjsKKworCXJlc3VsdCA9IG1hY2h0aW1lKCk7CisJc2VuZHRvKHMsICZyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAwLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRQorLyogUmV0dXJuIGh1bWFuLXJlYWRhYmxlIHRpbWUgb2YgZGF5ICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRheXRpbWVfc3RyZWFtKGludCBzLCBzZXJ2dGFiX3QgKnNlcCBVTlVTRURfUEFSQU0pCit7CisJdGltZV90IHQ7CisKKwl0ID0gdGltZShOVUxMKTsKKwlmZHByaW50ZihzLCAiJS4yNHNcclxuIiwgY3RpbWUoJnQpKTsKK30KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXl0aW1lX2RnKGludCBzLCBzZXJ2dGFiX3QgKnNlcCkKK3sKKwl0aW1lX3QgdDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBhbGxvY2EoTFNBX0xFTl9TSVpFICsgc2VwLT5zZV9sc2EtPmxlbik7CisKKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJaWYgKHJlY3Zmcm9tKHMsIGxpbmUsIExJTkVfU0laRSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pIDwgMCkKKwkJcmV0dXJuOworCisJdCA9IHRpbWUoTlVMTCk7CisJc3ByaW50ZihsaW5lLCAiJS4yNHNcclxuIiwgY3RpbWUoJnQpKTsKKwlzZW5kdG8ocywgbGluZSwgc3RybGVuKGxpbmUpLCAwLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRSAqLwpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9pbnRlcmZhY2UuYyBiL25ldHdvcmtpbmcvaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMzIyZQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwxMjMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzdG9sZW4gZnJvbSBuZXQtdG9vbHMtMS41OSBhbmQgc3RyaXBwZWQgZG93biBmb3IgYnVzeWJveCBieQorICoJCQlFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogSGVhdmlseSBtb2RpZmllZCBieSBNYW51ZWwgTm92b2EgSUlJICAgICAgIE1hciAxMiwgMjAwMQorICoKKyAqIEFkZGVkIHByaW50X2J5dGVzX3NjYWxlZCBmdW5jdGlvbiB0byByZWR1Y2UgY29kZSBzaXplLgorICogQWRkZWQgc29tZSAocG90ZW50aWFsbHkpIG1pc3NpbmcgZGVmaW5lcy4KKyAqIEltcHJvdmVkIGRpc3BsYXkgc3VwcG9ydCBmb3IgLWEgYW5kIGZvciBhIG5hbWVkIGludGVyZmFjZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGlmY29uZmlnICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kCisgKiAgICAgICAgICAgICAgdGhhdCBlaXRoZXIgZGlzcGxheXMgb3Igc2V0cyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mCisgKiAgICAgICAgICAgICAgb25lIG9yIG1vcmUgb2YgdGhlIHN5c3RlbSdzIG5ldHdvcmtpbmcgaW50ZXJmYWNlcy4KKyAqCisgKgorICogQXV0aG9yOiAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICogICAgICAgICAgICAgIGFuZCBvdGhlcnMuICBDb3B5cmlnaHQgMTk5MyBNaWNyb1dhbHQgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFBhdGNoZWQgdG8gc3VwcG9ydCAnYWRkJyBhbmQgJ2RlbCcga2V5d29yZHMgZm9yIElORVQoNCkgYWRkcmVzc2VzCisgKiBieSBNcnMuIEJyaXNieSA8bXJzLmJyaXNieUBuaW1oLm9yZz4KKyAqCisgKiB7MS4zNH0gLSAxOTk4MDYzMCAtIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogICAgICAgICAgICAgICAgICAgICAtIGdldHRleHQgaW5zdGVhZCBvZiBjYXRnZXRzIGZvciBpMThuCisgKiAgICAgICAgICAxMC8xOTk4ICAtIEFuZGkgS2xlZW4uIFVzZSBpbnRlcmZhY2UgbGlzdCBwcmltaXRpdmVzLgorICoJICAgIDIwMDAxMDA4IC0gQmVybmQgRWNrZW5mZWxzLCBQYXRjaCBmcm9tIFJIIGZvciBzZXR0aW5nIG10dQorICoJCQkoZGVmYXVsdCBBRiB3YXMgd3JvbmcpCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiaW5ldF9jb21tb24uaCIKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaWZkZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorIyBpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFdJQgorLyogI2luY2x1ZGUgPGxpbnV4L2lmX2luZmluaWJhbmQuaD4gKi8KKyMgdW5kZWYgSU5GSU5JQkFORF9BTEVOCisjIGRlZmluZSBJTkZJTklCQU5EX0FMRU4gMjAKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorIyBkZWZpbmUgSEFWRV9BRklORVQ2IDEKKyNlbHNlCisjIHVuZGVmIEhBVkVfQUZJTkVUNgorI2VuZGlmCisKKyNkZWZpbmUgX1BBVEhfUFJPQ05FVF9ERVYgICAgICAgICAgICAgICAiL3Byb2MvbmV0L2RldiIKKyNkZWZpbmUgX1BBVEhfUFJPQ05FVF9JRklORVQ2ICAgICAgICAgICAiL3Byb2MvbmV0L2lmX2luZXQ2IgorCisjaWZkZWYgSEFWRV9BRklORVQ2CisjIGlmbmRlZiBfTElOVVhfSU42X0gKKy8qCisgKiBUaGlzIGlzIGZyb20gbGludXgvaW5jbHVkZS9uZXQvaXB2Ni5oCisgKi8KK3N0cnVjdCBpbjZfaWZyZXEgeworCXN0cnVjdCBpbjZfYWRkciBpZnI2X2FkZHI7CisJdWludDMyX3QgaWZyNl9wcmVmaXhsZW47CisJdW5zaWduZWQgaW50IGlmcjZfaWZpbmRleDsKK307CisjIGVuZGlmCisjZW5kaWYgLyogSEFWRV9BRklORVQ2ICovCisKKy8qIERlZmluZXMgZm9yIGdsaWJjMi4wIHVzZXJzLiAqLworI2lmbmRlZiBTSU9DU0lGVFhRTEVOCisjIGRlZmluZSBTSU9DU0lGVFhRTEVOICAgICAgMHg4OTQzCisjIGRlZmluZSBTSU9DR0lGVFhRTEVOICAgICAgMHg4OTQyCisjZW5kaWYKKworLyogaWZyX3FsZW4gaXMgaWZydV9pdmFsdWUsIGJ1dCBpdCBpc24ndCBwcmVzZW50IGluIDIuMCBrZXJuZWwgaGVhZGVycyAqLworI2lmbmRlZiBpZnJfcWxlbgorIyBkZWZpbmUgaWZyX3FsZW4gICAgICAgIGlmcl9pZnJ1LmlmcnVfbXR1CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1RYUVVFVUVMRU4KKyMgZGVmaW5lIEhBVkVfVFhRVUVVRUxFTiAxCisjZW5kaWYKKworI2lmbmRlZiBJRkZfRFlOQU1JQworIyBkZWZpbmUgSUZGX0RZTkFNSUMgICAgIDB4ODAwMCAvKiBkaWFsdXAgZGV2aWNlIHdpdGggY2hhbmdpbmcgYWRkcmVzc2VzICovCisjZW5kaWYKKworLyogRGlzcGxheSBhbiBJbnRlcm5ldCBzb2NrZXQgYWRkcmVzcy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBGQVNUX0ZVTkMgSU5FVF9zcHJpbnQoc3RydWN0IHNvY2thZGRyICpzYXAsIGludCBudW1lcmljKQoreworCXN0YXRpYyBjaGFyICpidWZmOyAvKiBkZWZhdWx0cyB0byBOVUxMICovCisKKwlmcmVlKGJ1ZmYpOworCWlmIChzYXAtPnNhX2ZhbWlseSA9PSAweEZGRkYgfHwgc2FwLT5zYV9mYW1pbHkgPT0gMCkKKwkJcmV0dXJuICJbTk9ORSBTRVRdIjsKKwlidWZmID0gSU5FVF9ycmVzb2x2ZSgoc3RydWN0IHNvY2thZGRyX2luICopIHNhcCwgbnVtZXJpYywgMHhmZmZmZmYwMCk7CisJcmV0dXJuIGJ1ZmY7Cit9CisKKyNpZmRlZiBVTlVTRURfQU5EX0JVR0dZCitzdGF0aWMgaW50IElORVRfZ2V0c29jayhjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwljaGFyICpzcCA9IGJ1ZnAsICpicDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCB2YWw7CisJc3RydWN0IHNvY2thZGRyX2luICpzb2NrX2luOworCisJc29ja19pbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2FwOworCXNvY2tfaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNvY2tfaW4tPnNpbl9wb3J0ID0gMDsKKworCXZhbCA9IDA7CisJYnAgPSAoY2hhciAqKSAmdmFsOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29ja19pbi0+c2luX2FkZHIuc19hZGRyKTsgaSsrKSB7CisJCSpzcCA9IHRvdXBwZXIoKnNwKTsKKworCQlpZiAoKHVuc2lnbmVkKSgqc3AgLSAnQScpIDw9IDUpCisJCQlicFtpXSB8PSAoaW50KSAoKnNwIC0gKCdBJyAtIDEwKSk7CisJCWVsc2UgaWYgKGlzZGlnaXQoKnNwKSkKKwkJCWJwW2ldIHw9IChpbnQpICgqc3AgLSAnMCcpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisKKwkJYnBbaV0gPDw9IDQ7CisJCXNwKys7CisJCSpzcCA9IHRvdXBwZXIoKnNwKTsKKworCQlpZiAoKHVuc2lnbmVkKSgqc3AgLSAnQScpIDw9IDUpCisJCQlicFtpXSB8PSAoaW50KSAoKnNwIC0gKCdBJyAtIDEwKSk7CisJCWVsc2UgaWYgKGlzZGlnaXQoKnNwKSkKKwkJCWJwW2ldIHw9IChpbnQpICgqc3AgLSAnMCcpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisKKwkJc3ArKzsKKwl9CisJc29ja19pbi0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwodmFsKTsKKworCXJldHVybiAoc3AgLSBidWZwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBJTkVUX2lucHV0KC8qaW50IHR5cGUsKi8gY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJcmV0dXJuIElORVRfcmVzb2x2ZShidWZwLCAoc3RydWN0IHNvY2thZGRyX2luICopIHNhcCwgMCk7CisvKgorCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIChJTkVUX2dldHNvY2soYnVmcCwgc2FwKSk7CisJY2FzZSAyNTY6CisJCXJldHVybiAoSU5FVF9yZXNvbHZlKGJ1ZnAsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2FwLCAxKSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChJTkVUX3Jlc29sdmUoYnVmcCwgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYXAsIDApKTsKKwl9CisqLworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmdHlwZSBpbmV0X2FmdHlwZSA9IHsKKwkubmFtZSAgID0gImluZXQiLAorCS50aXRsZSAgPSAiREFSUEEgSW50ZXJuZXQiLAorCS5hZiAgICAgPSBBRl9JTkVULAorCS5hbGVuICAgPSA0LAorCS5zcHJpbnQgPSBJTkVUX3NwcmludCwKKwkuaW5wdXQgID0gSU5FVF9pbnB1dCwKK307CisKKyNpZmRlZiBIQVZFX0FGSU5FVDYKKworLyogRGlzcGxheSBhbiBJbnRlcm5ldCBzb2NrZXQgYWRkcmVzcy4gKi8KKy8qIGRpcnR5ISBzdHJ1Y3Qgc29ja2FkZHIgdXN1YWxseSBkb2Vzbid0IHN1ZmZlciBmb3IgaW5ldDYgYWRkcmVzc2VzLCBmc3QuICovCitzdGF0aWMgY29uc3QgY2hhciogRkFTVF9GVU5DIElORVQ2X3NwcmludChzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgaW50IG51bWVyaWMpCit7CisJc3RhdGljIGNoYXIgKmJ1ZmY7CisKKwlmcmVlKGJ1ZmYpOworCWlmIChzYXAtPnNhX2ZhbWlseSA9PSAweEZGRkYgfHwgc2FwLT5zYV9mYW1pbHkgPT0gMCkKKwkJcmV0dXJuICJbTk9ORSBTRVRdIjsKKwlidWZmID0gSU5FVDZfcnJlc29sdmUoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc2FwLCBudW1lcmljKTsKKwlyZXR1cm4gYnVmZjsKK30KKworI2lmZGVmIFVOVVNFRAorc3RhdGljIGludCBJTkVUNl9nZXRzb2NrKGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisKKwlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc2FwOworCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJc2luNi0+c2luNl9wb3J0ID0gMDsKKworCWlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGJ1ZnAsIHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyKSA8PSAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMTY7CQkJLyogPzspICovCit9CisjZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgSU5FVDZfaW5wdXQoLyppbnQgdHlwZSwqLyBjb25zdCBjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlyZXR1cm4gSU5FVDZfcmVzb2x2ZShidWZwLCAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYXApOworLyoKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDE6CisJCXJldHVybiAoSU5FVDZfZ2V0c29jayhidWZwLCBzYXApKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKElORVQ2X3Jlc29sdmUoYnVmcCwgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc2FwKSk7CisJfQorKi8KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnR5cGUgaW5ldDZfYWZ0eXBlID0geworCS5uYW1lICAgPSAiaW5ldDYiLAorCS50aXRsZSAgPSAiSVB2NiIsCisJLmFmICAgICA9IEFGX0lORVQ2LAorCS5hbGVuICAgPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKKwkuc3ByaW50ID0gSU5FVDZfc3ByaW50LAorCS5pbnB1dCAgPSBJTkVUNl9pbnB1dCwKK307CisKKyNlbmRpZiAvKiBIQVZFX0FGSU5FVDYgKi8KKworLyogRGlzcGxheSBhbiBVTlNQRUMgYWRkcmVzcy4gKi8KK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgVU5TUEVDX3ByaW50KHVuc2lnbmVkIGNoYXIgKnB0cikKK3sKKwlzdGF0aWMgY2hhciAqYnVmZjsKKworCWNoYXIgKnBvczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghYnVmZikKKwkJYnVmZiA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiAzICsgMSk7CisJcG9zID0gYnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7IGkrKykgeworCQkvKiBjYXJlZnVsIC0tIG5vdCBldmVyeSBsaWJjJ3Mgc3ByaW50ZiByZXR1cm5zICMgYnl0ZXMgd3JpdHRlbiAqLworCQlzcHJpbnRmKHBvcywgIiUwMlgtIiwgKCpwdHIrKyAmIDAzNzcpKTsKKwkJcG9zICs9IDM7CisJfQorCS8qIEVyYXNlIHRyYWlsaW5nICItIi4gIFdvcmtzIGFzIGxvbmcgYXMgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgIT0gMCAqLworCSotLXBvcyA9ICdcMCc7CisJcmV0dXJuIGJ1ZmY7Cit9CisKKy8qIERpc3BsYXkgYW4gVU5TUEVDIHNvY2tldCBhZGRyZXNzLiAqLworc3RhdGljIGNvbnN0IGNoYXIqIEZBU1RfRlVOQyBVTlNQRUNfc3ByaW50KHN0cnVjdCBzb2NrYWRkciAqc2FwLCBpbnQgbnVtZXJpYyBVTlVTRURfUEFSQU0pCit7CisJaWYgKHNhcC0+c2FfZmFtaWx5ID09IDB4RkZGRiB8fCBzYXAtPnNhX2ZhbWlseSA9PSAwKQorCQlyZXR1cm4gIltOT05FIFNFVF0iOworCXJldHVybiBVTlNQRUNfcHJpbnQoKHVuc2lnbmVkIGNoYXIgKilzYXAtPnNhX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmdHlwZSB1bnNwZWNfYWZ0eXBlID0geworCS5uYW1lICAgPSAidW5zcGVjIiwKKwkudGl0bGUgID0gIlVOU1BFQyIsCisJLmFmICAgICA9IEFGX1VOU1BFQywKKwkuYWxlbiAgID0gMCwKKwkucHJpbnQgID0gVU5TUEVDX3ByaW50LAorCS5zcHJpbnQgPSBVTlNQRUNfc3ByaW50LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnR5cGUgKmNvbnN0IGFmdHlwZXNbXSA9IHsKKwkmaW5ldF9hZnR5cGUsCisjaWZkZWYgSEFWRV9BRklORVQ2CisJJmluZXQ2X2FmdHlwZSwKKyNlbmRpZgorCSZ1bnNwZWNfYWZ0eXBlLAorCU5VTEwKK307CisKKy8qIENoZWNrIG91ciBwcm90b2NvbCBmYW1pbHkgdGFibGUgZm9yIHRoaXMgZmFtaWx5LiAqLworY29uc3Qgc3RydWN0IGFmdHlwZSogRkFTVF9GVU5DIGdldF9hZnR5cGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgYWZ0eXBlICpjb25zdCAqYWZwOworCisJYWZwID0gYWZ0eXBlczsKKwl3aGlsZSAoKmFmcCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKCgqYWZwKS0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gKCphZnApOworCQlhZnArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIG91ciBwcm90b2NvbCBmYW1pbHkgdGFibGUgZm9yIHRoaXMgZmFtaWx5LiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnR5cGUgKmdldF9hZm50eXBlKGludCBhZikKK3sKKwljb25zdCBzdHJ1Y3QgYWZ0eXBlICpjb25zdCAqYWZwOworCisJYWZwID0gYWZ0eXBlczsKKwl3aGlsZSAoKmFmcCAhPSBOVUxMKSB7CisJCWlmICgoKmFmcCktPmFmID09IGFmKQorCQkJcmV0dXJuICphZnA7CisJCWFmcCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHVzZXJfbmV0X2RldmljZV9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X3BhY2tldHM7CS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgdHhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZCAgICAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9ieXRlczsJLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyB0eF9ieXRlczsJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfZXJyb3JzOwkvKiBiYWQgcGFja2V0cyByZWNlaXZlZCAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9lcnJvcnM7CS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcyAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eCAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X211bHRpY2FzdDsJLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfY29tcHJlc3NlZDsKKwl1bnNpZ25lZCBsb25nIHR4X2NvbXByZXNzZWQ7CisJdW5zaWduZWQgbG9uZyBjb2xsaXNpb25zOworCisJLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworCXVuc2lnbmVkIGxvbmcgcnhfbGVuZ3RoX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHJ4X292ZXJfZXJyb3JzOwkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgICovCisJdW5zaWduZWQgbG9uZyByeF9jcmNfZXJyb3JzOwkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yICAgICovCisJdW5zaWduZWQgbG9uZyByeF9mcmFtZV9lcnJvcnM7CS8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2ZpZm9fZXJyb3JzOwkvKiByZWN2J3IgZmlmbyBvdmVycnVuICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9taXNzZWRfZXJyb3JzOwkvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0ICAgICAqLworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCXVuc2lnbmVkIGxvbmcgdHhfYWJvcnRlZF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyB0eF9jYXJyaWVyX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHR4X2ZpZm9fZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgdHhfaGVhcnRiZWF0X2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHR4X3dpbmRvd19lcnJvcnM7Cit9OworCitzdHJ1Y3QgaW50ZXJmYWNlIHsKKwlzdHJ1Y3QgaW50ZXJmYWNlICpuZXh0LCAqcHJldjsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOyAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIG5hbWUgICAgICAgICovCisJc2hvcnQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHR5cGUgICAgICAgICAgICAgICAqLworCXNob3J0IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIGZsYWdzICAgICAgICAgKi8KKwlpbnQgbWV0cmljOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcm91dGluZyBtZXRyaWMgICAgICAgICovCisJaW50IG10dTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1UVSB2YWx1ZSAgICAgICAgICAgICAqLworCWludCB0eF9xdWV1ZV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc21pdCBxdWV1ZSBsZW5ndGggKi8KKwlzdHJ1Y3QgaWZtYXAgbWFwOyAgICAgICAgICAgICAgICAgICAgICAgLyogaGFyZHdhcmUgc2V0dXAgICAgICAgICovCisJc3RydWN0IHNvY2thZGRyIGFkZHI7ICAgICAgICAgICAgICAgICAgIC8qIElQIGFkZHJlc3MgICAgICAgICAgICAqLworCXN0cnVjdCBzb2NrYWRkciBkc3RhZGRyOyAgICAgICAgICAgICAgICAvKiBQLVAgSVAgYWRkcmVzcyAgICAgICAgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgYnJvYWRhZGRyOyAgICAgICAgICAgICAgLyogSVAgYnJvYWRjYXN0IGFkZHJlc3MgICovCisJc3RydWN0IHNvY2thZGRyIG5ldG1hc2s7ICAgICAgICAgICAgICAgIC8qIElQIG5ldHdvcmsgbWFzayAgICAgICAqLworCWludCBoYXNfaXA7CisJY2hhciBod2FkZHJbMzJdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhXIGFkZHJlc3MgICAgICAgICAgICAqLworCWludCBzdGF0aXN0aWNzX3ZhbGlkOworCXN0cnVjdCB1c2VyX25ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7ICAgICAvKiBzdGF0aXN0aWNzICAgICAgICAgICAgKi8KKwlpbnQga2VlcGFsaXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoga2VlcGFsaXZlIHZhbHVlIGZvciBTTElQICovCisJaW50IG91dGZpbGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dGZpbGwgdmFsdWUgZm9yIFNMSVAgKi8KK307CisKKworc21hbGxpbnQgaW50ZXJmYWNlX29wdF9hOwkvKiBzaG93IGFsbCBpbnRlcmZhY2VzICovCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJmYWNlICppbnRfbGlzdCwgKmludF9sYXN0OworCisKKyNpZiAwCisvKiBsaWtlIHN0cmNtcCgpLCBidXQga25vd3MgYWJvdXQgbnVtYmVycyAqLworZXhjZXB0IHRoYXQgdGhlIGZyZXNobHkgYWRkZWQgY2FsbHMgdG8geGF0b3VsKCkgYnJmIG9uIGV0aGVybmV0IGFsaWFzZXMgd2l0aAordUNsaWJjIHdpdGggZS5nLjogaWZlLT5uYW1lPSdsbycgIG5hbWU9J2V0aDA6MScKK3N0YXRpYyBpbnQgbnN0cmNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCWNvbnN0IGNoYXIgKmFfcHRyID0gYTsKKwljb25zdCBjaGFyICpiX3B0ciA9IGI7CisKKwl3aGlsZSAoKmEgPT0gKmIpIHsKKwkJaWYgKCphID09ICdcMCcpIHsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghaXNkaWdpdCgqYSkgJiYgaXNkaWdpdCgqKGErMSkpKSB7CisJCQlhX3B0ciA9IGErMTsKKwkJCWJfcHRyID0gYisxOworCQl9CisJCWErKzsKKwkJYisrOworCX0KKworCWlmIChpc2RpZ2l0KCphKSAmJiBpc2RpZ2l0KCpiKSkgeworCQlyZXR1cm4geGF0b3VsKGFfcHRyKSA+IHhhdG91bChiX3B0cikgPyAxIDogLTE7CisJfQorCXJldHVybiAqYSAtICpiOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJmYWNlICphZGRfaW50ZXJmYWNlKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGludGVyZmFjZSAqaWZlLCAqKm5leHRwLCAqbmV3OworCisJZm9yIChpZmUgPSBpbnRfbGFzdDsgaWZlOyBpZmUgPSBpZmUtPnByZXYpIHsKKwkJaW50IG4gPSAvKm4qL3N0cmNtcChpZmUtPm5hbWUsIG5hbWUpOworCisJCWlmIChuID09IDApCisJCQlyZXR1cm4gaWZlOworCQlpZiAobiA8IDApCisJCQlicmVhazsKKwl9CisKKwluZXcgPSB4emFsbG9jKHNpemVvZigqbmV3KSk7CisJc3RybmNweV9JRk5BTVNJWihuZXctPm5hbWUsIG5hbWUpOworCW5leHRwID0gaWZlID8gJmlmZS0+bmV4dCA6ICZpbnRfbGlzdDsKKwluZXctPnByZXYgPSBpZmU7CisJbmV3LT5uZXh0ID0gKm5leHRwOworCWlmIChuZXctPm5leHQpCisJCW5ldy0+bmV4dC0+cHJldiA9IG5ldzsKKwllbHNlCisJCWludF9sYXN0ID0gbmV3OworCSpuZXh0cCA9IG5ldzsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgY2hhciAqZ2V0X25hbWUoY2hhciAqbmFtZSwgY2hhciAqcCkKK3sKKwkvKiBFeHRyYWN0IDxuYW1lPiBmcm9tIG51bC10ZXJtaW5hdGVkIHAgd2hlcmUgcCBtYXRjaGVzCisJICogPG5hbWU+OiBhZnRlciBsZWFkaW5nIHdoaXRlc3BhY2UuCisJICogSWYgbWF0Y2ggaXMgbm90IG1hZGUsIHNldCBuYW1lIGVtcHR5IGFuZCByZXR1cm4gdW5jaGFuZ2VkIHAKKwkgKi8KKwljaGFyICpuYW1lZW5kOworCWNoYXIgKm5hbWVzdGFydCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKworCW5hbWVlbmQgPSBuYW1lc3RhcnQ7CisJd2hpbGUgKCpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc6JyAmJiAhaXNzcGFjZSgqbmFtZWVuZCkpCisJCW5hbWVlbmQrKzsKKwlpZiAoKm5hbWVlbmQgPT0gJzonKSB7CisJCWlmICgobmFtZWVuZCAtIG5hbWVzdGFydCkgPCBJRk5BTVNJWikgeworCQkJbWVtY3B5KG5hbWUsIG5hbWVzdGFydCwgbmFtZWVuZCAtIG5hbWVzdGFydCk7CisJCQluYW1lW25hbWVlbmQgLSBuYW1lc3RhcnRdID0gJ1wwJzsKKwkJCXAgPSBuYW1lZW5kOworCQl9IGVsc2UgeworCQkJLyogSW50ZXJmYWNlIG5hbWUgdG9vIGxhcmdlICovCisJCQluYW1lWzBdID0gJ1wwJzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRyYWlsaW5nICc6JyBub3QgZm91bmQgLSByZXR1cm4gZW1wdHkgKi8KKwkJbmFtZVswXSA9ICdcMCc7CisJfQorCXJldHVybiBwICsgMTsKK30KKworLyogSWYgc2NhbmYgc3VwcG9ydHMgc2l6ZSBxdWFsaWZpZXJzIGZvciAlbiBjb252ZXJzaW9ucywgdGhlbiB3ZSBjYW4KKyAqIHVzZSBhIG1vZGlmaWVkIGZtdCB0aGF0IHNpbXBseSBzdG9yZXMgdGhlIHBvc2l0aW9uIGluIHRoZSBmaWVsZHMKKyAqIGhhdmluZyBubyBhc3NvY2lhdGVkIGZpZWxkcyBpbiB0aGUgcHJvYyBzdHJpbmcuICBPZiBjb3Vyc2UsIHdlIG5lZWQKKyAqIHRvIHplcm8gdGhlbSBhZ2FpbiB3aGVuIHdlJ3JlIGRvbmUuICBCdXQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gdGhlCisgKiBvbGQgYXBwcm9hY2ggb2YgbXVsdGlwbGUgc2NhbmYgb2NjdXJyZW5jZXMgd2l0aCBsYXJnZSBudW1iZXJzIG9mCisgKiBhcmdzLiAqLworCisvKiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3NfZm10W10gPSB7ICovCisvKgkiJWxsbiVsbHUlbHUlbHUlbHUlbHUlbG4lbG4lbGxuJWxsdSVsdSVsdSVsdSVsdSVsdSIsICovCisvKgkiJWxsdSVsbHUlbHUlbHUlbHUlbHUlbG4lbG4lbGx1JWxsdSVsdSVsdSVsdSVsdSVsdSIsICovCisvKgkiJWxsdSVsbHUlbHUlbHUlbHUlbHUlbHUlbHUlbGx1JWxsdSVsdSVsdSVsdSVsdSVsdSVsdSIgKi8KKy8qIH07ICovCisKKwkvKiBMaWUgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGludCBwb2ludGVkIHRvIGZvciAlbi4gKi8KKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3NfZm10W10gPSB7CisJIiVuJWxsdSV1JXUldSV1JW4lbiVuJWxsdSV1JXUldSV1JXUiLAorCSIlbGx1JWxsdSV1JXUldSV1JW4lbiVsbHUlbGx1JXUldSV1JXUldSIsCisJIiVsbHUlbGx1JXUldSV1JXUldSV1JWxsdSVsbHUldSV1JXUldSV1JXUiCit9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzc19mbXRbXSA9IHsKKwkiJW4lbGx1JWx1JWx1JWx1JWx1JW4lbiVuJWxsdSVsdSVsdSVsdSVsdSVsdSIsCisJIiVsbHUlbGx1JWx1JWx1JWx1JWx1JW4lbiVsbHUlbGx1JWx1JWx1JWx1JWx1JWx1IiwKKwkiJWxsdSVsbHUlbHUlbHUlbHUlbHUlbHUlbHUlbGx1JWxsdSVsdSVsdSVsdSVsdSVsdSVsdSIKK307CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfZGV2X2ZpZWxkcyhjaGFyICpicCwgc3RydWN0IGludGVyZmFjZSAqaWZlLCBpbnQgcHJvY25ldGRldl92c24pCit7CisJbWVtc2V0KCZpZmUtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHVzZXJfbmV0X2RldmljZV9zdGF0cykpOworCisJc3NjYW5mKGJwLCBzc19mbXRbcHJvY25ldGRldl92c25dLAorCQkgICAmaWZlLT5zdGF0cy5yeF9ieXRlcywgLyogbWlzc2luZyBmb3IgMCAqLworCQkgICAmaWZlLT5zdGF0cy5yeF9wYWNrZXRzLAorCQkgICAmaWZlLT5zdGF0cy5yeF9lcnJvcnMsCisJCSAgICZpZmUtPnN0YXRzLnJ4X2Ryb3BwZWQsCisJCSAgICZpZmUtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzLAorCQkgICAmaWZlLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMsCisJCSAgICZpZmUtPnN0YXRzLnJ4X2NvbXByZXNzZWQsIC8qIG1pc3NpbmcgZm9yIDw9IDEgKi8KKwkJICAgJmlmZS0+c3RhdHMucnhfbXVsdGljYXN0LCAvKiBtaXNzaW5nIGZvciA8PSAxICovCisJCSAgICZpZmUtPnN0YXRzLnR4X2J5dGVzLCAvKiBtaXNzaW5nIGZvciAwICovCisJCSAgICZpZmUtPnN0YXRzLnR4X3BhY2tldHMsCisJCSAgICZpZmUtPnN0YXRzLnR4X2Vycm9ycywKKwkJICAgJmlmZS0+c3RhdHMudHhfZHJvcHBlZCwKKwkJICAgJmlmZS0+c3RhdHMudHhfZmlmb19lcnJvcnMsCisJCSAgICZpZmUtPnN0YXRzLmNvbGxpc2lvbnMsCisJCSAgICZpZmUtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzLAorCQkgICAmaWZlLT5zdGF0cy50eF9jb21wcmVzc2VkIC8qIG1pc3NpbmcgZm9yIDw9IDEgKi8KKwkJICAgKTsKKworCWlmIChwcm9jbmV0ZGV2X3ZzbiA8PSAxKSB7CisJCWlmIChwcm9jbmV0ZGV2X3ZzbiA9PSAwKSB7CisJCQlpZmUtPnN0YXRzLnJ4X2J5dGVzID0gMDsKKwkJCWlmZS0+c3RhdHMudHhfYnl0ZXMgPSAwOworCQl9CisJCWlmZS0+c3RhdHMucnhfbXVsdGljYXN0ID0gMDsKKwkJaWZlLT5zdGF0cy5yeF9jb21wcmVzc2VkID0gMDsKKwkJaWZlLT5zdGF0cy50eF9jb21wcmVzc2VkID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvY25ldGRldl92ZXJzaW9uKGNoYXIgKmJ1ZikKK3sKKwlpZiAoc3Ryc3RyKGJ1ZiwgImNvbXByZXNzZWQiKSkKKwkJcmV0dXJuIDI7CisJaWYgKHN0cnN0cihidWYsICJieXRlcyIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZl9yZWFkY29uZih2b2lkKQoreworCWludCBudW1yZXFzID0gMzA7CisJc3RydWN0IGlmY29uZiBpZmM7CisJc3RydWN0IGlmcmVxICppZnI7CisJaW50IG4sIGVyciA9IC0xOworCWludCBza2ZkOworCisJaWZjLmlmY19idWYgPSBOVUxMOworCisJLyogU0lPQ0dJRkNPTkYgY3VycmVudGx5IHNlZW1zIHRvIG9ubHkgd29yayBwcm9wZXJseSBvbiBBRl9JTkVUIHNvY2tldHMKKwkgICAoYXMgb2YgMi4xLjEyOCkgKi8KKwlza2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChza2ZkIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJlcnJvcjogbm8gaW5ldCBzb2NrZXQgYXZhaWxhYmxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWlmYy5pZmNfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZnJlcSkgKiBudW1yZXFzOworCQlpZmMuaWZjX2J1ZiA9IHhyZWFsbG9jKGlmYy5pZmNfYnVmLCBpZmMuaWZjX2xlbik7CisKKwkJaWYgKGlvY3RsX29yX3dhcm4oc2tmZCwgU0lPQ0dJRkNPTkYsICZpZmMpIDwgMCkgeworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGlmYy5pZmNfbGVuID09IChpbnQpKHNpemVvZihzdHJ1Y3QgaWZyZXEpICogbnVtcmVxcykpIHsKKwkJCS8qIGFzc3VtZSBpdCBvdmVyZmxvd2VkIGFuZCB0cnkgYWdhaW4gKi8KKwkJCW51bXJlcXMgKz0gMTA7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZnIgPSBpZmMuaWZjX3JlcTsKKwlmb3IgKG4gPSAwOyBuIDwgaWZjLmlmY19sZW47IG4gKz0gc2l6ZW9mKHN0cnVjdCBpZnJlcSkpIHsKKwkJYWRkX2ludGVyZmFjZShpZnItPmlmcl9uYW1lKTsKKwkJaWZyKys7CisJfQorCWVyciA9IDA7CisKKyBvdXQ6CisJY2xvc2Uoc2tmZCk7CisJZnJlZShpZmMuaWZjX2J1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZl9yZWFkbGlzdF9wcm9jKGNoYXIgKnRhcmdldCkKK3sKKwlzdGF0aWMgc21hbGxpbnQgcHJvY19yZWFkOworCisJRklMRSAqZmg7CisJY2hhciBidWZbNTEyXTsKKwlzdHJ1Y3QgaW50ZXJmYWNlICppZmU7CisJaW50IGVyciwgcHJvY25ldGRldl92c247CisKKwlpZiAocHJvY19yZWFkKQorCQlyZXR1cm4gMDsKKwlpZiAoIXRhcmdldCkKKwkJcHJvY19yZWFkID0gMTsKKworCWZoID0gZm9wZW5fb3Jfd2FybihfUEFUSF9QUk9DTkVUX0RFViwgInIiKTsKKwlpZiAoIWZoKSB7CisJCXJldHVybiBpZl9yZWFkY29uZigpOworCX0KKwlmZ2V0cyhidWYsIHNpemVvZiBidWYsIGZoKTsJLyogZWF0IGxpbmUgKi8KKwlmZ2V0cyhidWYsIHNpemVvZiBidWYsIGZoKTsKKworCXByb2NuZXRkZXZfdnNuID0gcHJvY25ldGRldl92ZXJzaW9uKGJ1Zik7CisKKwllcnIgPSAwOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZiBidWYsIGZoKSkgeworCQljaGFyICpzLCBuYW1lWzEyOF07CisKKwkJcyA9IGdldF9uYW1lKG5hbWUsIGJ1Zik7CisJCWlmZSA9IGFkZF9pbnRlcmZhY2UobmFtZSk7CisJCWdldF9kZXZfZmllbGRzKHMsIGlmZSwgcHJvY25ldGRldl92c24pOworCQlpZmUtPnN0YXRpc3RpY3NfdmFsaWQgPSAxOworCQlpZiAodGFyZ2V0ICYmICFzdHJjbXAodGFyZ2V0LCBuYW1lKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoZmVycm9yKGZoKSkgeworCQliYl9wZXJyb3JfbXNnKF9QQVRIX1BST0NORVRfREVWKTsKKwkJZXJyID0gLTE7CisJCXByb2NfcmVhZCA9IDA7CisJfQorCWZjbG9zZShmaCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZl9yZWFkbGlzdCh2b2lkKQoreworCWludCBlcnIgPSBpZl9yZWFkbGlzdF9wcm9jKE5VTEwpOworCS8qIE5lZWRlZCBpbiBvcmRlciB0byBnZXQgZXRoTjpNIGFsaWFzZXMgKi8KKwlpZiAoIWVycikKKwkJZXJyID0gaWZfcmVhZGNvbmYoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGZXRjaCB0aGUgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUga2VybmVsLiAqLworc3RhdGljIGludCBpZl9mZXRjaChzdHJ1Y3QgaW50ZXJmYWNlICppZmUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwljaGFyICppZm5hbWUgPSBpZmUtPm5hbWU7CisJaW50IHNrZmQ7CisKKwlza2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpIDwgMCkgeworCQljbG9zZShza2ZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZmUtPmZsYWdzID0gaWZyLmlmcl9mbGFnczsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCW1lbXNldChpZmUtPmh3YWRkciwgMCwgMzIpOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKSA+PSAwKQorCQltZW1jcHkoaWZlLT5od2FkZHIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIDgpOworCisJaWZlLT50eXBlID0gaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5OworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaWZlLT5tZXRyaWMgPSAwOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGTUVUUklDLCAmaWZyKSA+PSAwKQorCQlpZmUtPm1ldHJpYyA9IGlmci5pZnJfbWV0cmljOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaWZlLT5tdHUgPSAwOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGTVRVLCAmaWZyKSA+PSAwKQorCQlpZmUtPm10dSA9IGlmci5pZnJfbXR1OworCisJbWVtc2V0KCZpZmUtPm1hcCwgMCwgc2l6ZW9mKHN0cnVjdCBpZm1hcCkpOworI2lmZGVmIFNJT0NHSUZNQVAKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRk1BUCwgJmlmcikgPT0gMCkKKwkJaWZlLT5tYXAgPSBpZnIuaWZyX21hcDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9UWFFVRVVFTEVOCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaWZlLT50eF9xdWV1ZV9sZW4gPSAtMTsJLyogdW5rbm93biB2YWx1ZSAqLworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGVFhRTEVOLCAmaWZyKSA+PSAwKQorCQlpZmUtPnR4X3F1ZXVlX2xlbiA9IGlmci5pZnJfcWxlbjsKKyNlbHNlCisJaWZlLT50eF9xdWV1ZV9sZW4gPSAtMTsJLyogdW5rbm93biB2YWx1ZSAqLworI2VuZGlmCisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwlpZnIuaWZyX2FkZHIuc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwltZW1zZXQoJmlmZS0+YWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGQUREUiwgJmlmcikgPT0gMCkgeworCQlpZmUtPmhhc19pcCA9IDE7CisJCWlmZS0+YWRkciA9IGlmci5pZnJfYWRkcjsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJCW1lbXNldCgmaWZlLT5kc3RhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGRFNUQUREUiwgJmlmcikgPj0gMCkKKwkJCWlmZS0+ZHN0YWRkciA9IGlmci5pZnJfZHN0YWRkcjsKKworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwkJbWVtc2V0KCZpZmUtPmJyb2FkYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRkJSREFERFIsICZpZnIpID49IDApCisJCQlpZmUtPmJyb2FkYWRkciA9IGlmci5pZnJfYnJvYWRhZGRyOworCisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCQltZW1zZXQoJmlmZS0+bmV0bWFzaywgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRk5FVE1BU0ssICZpZnIpID49IDApCisJCQlpZmUtPm5ldG1hc2sgPSBpZnIuaWZyX25ldG1hc2s7CisJfQorCisJY2xvc2Uoc2tmZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9faWZfZmV0Y2goc3RydWN0IGludGVyZmFjZSAqaWZlKQoreworCWlmIChpZl9mZXRjaChpZmUpIDwgMCkgeworCQljb25zdCBjaGFyICplcnJtc2c7CisKKwkJaWYgKGVycm5vID09IEVOT0RFVikgeworCQkJLyogR2l2ZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBjYXNlLiAqLworCQkJZXJybXNnID0gIkRldmljZSBub3QgZm91bmQiOworCQl9IGVsc2UgeworCQkJZXJybXNnID0gc3RyZXJyb3IoZXJybm8pOworCQl9CisJCWJiX2Vycm9yX21zZygiJXM6IGVycm9yIGZldGNoaW5nIGludGVyZmFjZSBpbmZvcm1hdGlvbjogJXMiLAorCQkJCWlmZS0+bmFtZSwgZXJybXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBod3R5cGUgdW5zcGVjX2h3dHlwZSA9IHsKKwkubmFtZSA9CQkidW5zcGVjIiwKKwkudGl0bGUgPQkiVU5TUEVDIiwKKwkudHlwZSA9CQktMSwKKwkucHJpbnQgPQlVTlNQRUNfcHJpbnQKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlIGxvb3BfaHd0eXBlID0geworCS5uYW1lID0JCSJsb29wIiwKKwkudGl0bGUgPQkiTG9jYWwgTG9vcGJhY2siLAorCS50eXBlID0JCUFSUEhSRF9MT09QQkFDSworfTsKKworLyogRGlzcGxheSBhbiBFdGhlcm5ldCBhZGRyZXNzIGluIHJlYWRhYmxlIGZvcm1hdC4gKi8KK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgZXRoZXJfcHJpbnQodW5zaWduZWQgY2hhciAqcHRyKQoreworCXN0YXRpYyBjaGFyICpidWZmOworCisJZnJlZShidWZmKTsKKwlidWZmID0geGFzcHJpbnRmKCIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisJCQkgKHB0clswXSAmIDAzNzcpLCAocHRyWzFdICYgMDM3NyksIChwdHJbMl0gJiAwMzc3KSwKKwkJCSAocHRyWzNdICYgMDM3NyksIChwdHJbNF0gJiAwMzc3KSwgKHB0cls1XSAmIDAzNzcpCisJCSk7CisJcmV0dXJuIGJ1ZmY7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGV0aGVyX2lucHV0KGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod3R5cGUgZXRoZXJfaHd0eXBlID0geworCS5uYW1lICA9ICJldGhlciIsCisJLnRpdGxlID0gIkV0aGVybmV0IiwKKwkudHlwZSAgPSBBUlBIUkRfRVRIRVIsCisJLmFsZW4gID0gRVRIX0FMRU4sCisJLnByaW50ID0gZXRoZXJfcHJpbnQsCisJLmlucHV0ID0gZXRoZXJfaW5wdXQKK307CisKK3N0YXRpYyB1bnNpZ25lZCBoZXhjaGFyMmludChjaGFyIGMpCit7CisJaWYgKGlzZGlnaXQoYykpCisJCXJldHVybiBjIC0gJzAnOworCWMgJj0gfjB4MjA7IC8qIGEgLT4gQSAqLworCWlmICgodW5zaWduZWQpKGMgLSAnQScpIDw9IDUpCisJCXJldHVybiBjIC0gKCdBJyAtIDEwKTsKKwlyZXR1cm4gfjBVOworfQorCisvKiBJbnB1dCBhbiBFdGhlcm5ldCBhZGRyZXNzIGFuZCBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGV0aGVyX2lucHV0KGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwljaGFyIGM7CisJaW50IGk7CisJdW5zaWduZWQgdmFsOworCisJc2FwLT5zYV9mYW1pbHkgPSBldGhlcl9od3R5cGUudHlwZTsKKwlwdHIgPSAodW5zaWduZWQgY2hhciopIHNhcC0+c2FfZGF0YTsKKworCWkgPSAwOworCXdoaWxlICgoKmJ1ZnAgIT0gJ1wwJykgJiYgKGkgPCBFVEhfQUxFTikpIHsKKwkJdmFsID0gaGV4Y2hhcjJpbnQoKmJ1ZnArKykgKiAweDEwOworCQlpZiAodmFsID4gMHhmZikgeworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYyA9ICpidWZwOworCQlpZiAoYyA9PSAnOicgfHwgYyA9PSAwKQorCQkJdmFsID4+PSA0OworCQllbHNlIHsKKwkJCXZhbCB8PSBoZXhjaGFyMmludChjKTsKKwkJCWlmICh2YWwgPiAweGZmKSB7CisJCQkJZXJybm8gPSBFSU5WQUw7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChjICE9IDApCisJCQlidWZwKys7CisJCSpwdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSB2YWw7CisJCWkrKzsKKworCQkvKiBXZSBtaWdodCBnZXQgYSBzZW1pY29sb24gaGVyZSAtIG5vdCByZXF1aXJlZC4gKi8KKwkJaWYgKCpidWZwID09ICc6JykgeworCQkJYnVmcCsrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSBwcHBfaHd0eXBlID0geworCS5uYW1lID0JCSJwcHAiLAorCS50aXRsZSA9CSJQb2ludC10by1Qb2ludCBQcm90b2NvbCIsCisJLnR5cGUgPQkJQVJQSFJEX1BQUAorfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlIHNpdF9od3R5cGUgPSB7CisJLm5hbWUgPQkJCSJzaXQiLAorCS50aXRsZSA9CQkiSVB2Ni1pbi1JUHY0IiwKKwkudHlwZSA9CQkJQVJQSFJEX1NJVCwKKwkucHJpbnQgPQkJVU5TUEVDX3ByaW50LAorCS5zdXBwcmVzc19udWxsX2FkZHIgPQkxCit9OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFdJQgorc3RhdGljIGNvbnN0IHN0cnVjdCBod3R5cGUgaWJfaHd0eXBlID0geworCS5uYW1lICA9ICJpbmZpbmliYW5kIiwKKwkudGl0bGUgPSAiSW5maW5pQmFuZCIsCisJLnR5cGUgID0gQVJQSFJEX0lORklOSUJBTkQsCisJLmFsZW4gID0gSU5GSU5JQkFORF9BTEVOLAorCS5wcmludCA9IFVOU1BFQ19wcmludCwKKwkuaW5wdXQgPSBpbl9pYiwKK307CisjZW5kaWYKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSAqY29uc3QgaHd0eXBlc1tdID0geworCSZsb29wX2h3dHlwZSwKKwkmZXRoZXJfaHd0eXBlLAorCSZwcHBfaHd0eXBlLAorCSZ1bnNwZWNfaHd0eXBlLAorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkmc2l0X2h3dHlwZSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hXSUIKKwkmaWJfaHd0eXBlLAorI2VuZGlmCisJTlVMTAorfTsKKworI2lmZGVmIElGRl9QT1JUU0VMCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaWZfcG9ydF90ZXh0W10gPSB7CisJLyogS2VlcCBpbiBzdGVwIHdpdGggPGxpbnV4L25ldGRldmljZS5oPiAqLworCSJ1bmtub3duIiwKKwkiMTBiYXNlMiIsCisJIjEwYmFzZVQiLAorCSJBVUkiLAorCSIxMDBiYXNlVCIsCisJIjEwMGJhc2VUWCIsCisJIjEwMGJhc2VGWCIsCisJTlVMTAorfTsKKyNlbmRpZgorCisvKiBDaGVjayBvdXIgaGFyZHdhcmUgdHlwZSB0YWJsZSBmb3IgdGhpcyB0eXBlLiAqLworY29uc3Qgc3RydWN0IGh3dHlwZSogRkFTVF9GVU5DIGdldF9od3R5cGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgaHd0eXBlICpjb25zdCAqaHdwOworCisJaHdwID0gaHd0eXBlczsKKwl3aGlsZSAoKmh3cCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKCgqaHdwKS0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gKCpod3ApOworCQlod3ArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIG91ciBoYXJkd2FyZSB0eXBlIHRhYmxlIGZvciB0aGlzIHR5cGUuICovCitjb25zdCBzdHJ1Y3QgaHd0eXBlKiBGQVNUX0ZVTkMgZ2V0X2h3bnR5cGUoaW50IHR5cGUpCit7CisJY29uc3Qgc3RydWN0IGh3dHlwZSAqY29uc3QgKmh3cDsKKworCWh3cCA9IGh3dHlwZXM7CisJd2hpbGUgKCpod3AgIT0gTlVMTCkgeworCQlpZiAoKCpod3ApLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gKmh3cDsKKwkJaHdwKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiByZXR1cm4gMSBpZiBhZGRyZXNzIGlzIGFsbCB6ZXJvcyAqLworc3RhdGljIGludCBod19udWxsX2FkZHJlc3MoY29uc3Qgc3RydWN0IGh3dHlwZSAqaHcsIHZvaWQgKmFwKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmFkZHJlc3MgPSAodW5zaWduZWQgY2hhciAqKSBhcDsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YWxlbjsgaSsrKQorCQlpZiAoYWRkcmVzc1tpXSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciBUUmV4dFtdIEFMSUdOMSA9ICJcMFwwXDBLaVwwTWlcMEdpXDBUaSI7CisKK3N0YXRpYyB2b2lkIHByaW50X2J5dGVzX3NjYWxlZCh1bnNpZ25lZCBsb25nIGxvbmcgdWxsLCBjb25zdCBjaGFyICplbmQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGludF9wYXJ0OworCWNvbnN0IGNoYXIgKmV4dDsKKwl1bnNpZ25lZCBpbnQgZnJhY19wYXJ0OworCWludCBpOworCisJZnJhY19wYXJ0ID0gMDsKKwlleHQgPSBUUmV4dDsKKwlpbnRfcGFydCA9IHVsbDsKKwlpID0gNDsKKwlkbyB7CisJCWlmIChpbnRfcGFydCA+PSAxMDI0KSB7CisJCQlmcmFjX3BhcnQgPSAoKCgodW5zaWduZWQgaW50KSBpbnRfcGFydCkgJiAoMTAyNC0xKSkgKiAxMCkgLyAxMDI0OworCQkJaW50X3BhcnQgLz0gMTAyNDsKKwkJCWV4dCArPSAzOwkvKiBLaUIsIE1pQiwgR2lCLCBUaUIgKi8KKwkJfQorCQktLWk7CisJfSB3aGlsZSAoaSk7CisKKwlwcmludGYoIlggYnl0ZXM6JWxsdSAoJWxsdS4ldSAlc0IpJXMiLCB1bGwsIGludF9wYXJ0LCBmcmFjX3BhcnQsIGV4dCwgZW5kKTsKK30KKworCisjaWZkZWYgSEFWRV9BRklORVQ2CisjZGVmaW5lIElQVjZfQUREUl9BTlkgICAgICAgICAgIDB4MDAwMFUKKworI2RlZmluZSBJUFY2X0FERFJfVU5JQ0FTVCAgICAgICAweDAwMDFVCisjZGVmaW5lIElQVjZfQUREUl9NVUxUSUNBU1QgICAgIDB4MDAwMlUKKyNkZWZpbmUgSVBWNl9BRERSX0FOWUNBU1QgICAgICAgMHgwMDA0VQorCisjZGVmaW5lIElQVjZfQUREUl9MT09QQkFDSyAgICAgIDB4MDAxMFUKKyNkZWZpbmUgSVBWNl9BRERSX0xJTktMT0NBTCAgICAgMHgwMDIwVQorI2RlZmluZSBJUFY2X0FERFJfU0lURUxPQ0FMICAgICAweDAwNDBVCisKKyNkZWZpbmUgSVBWNl9BRERSX0NPTVBBVHY0ICAgICAgMHgwMDgwVQorCisjZGVmaW5lIElQVjZfQUREUl9TQ09QRV9NQVNLICAgIDB4MDBmMFUKKworI2RlZmluZSBJUFY2X0FERFJfTUFQUEVEICAgICAgICAweDEwMDBVCisjZGVmaW5lIElQVjZfQUREUl9SRVNFUlZFRCAgICAgIDB4MjAwMFUJLyogcmVzZXJ2ZWQgYWRkcmVzcyBzcGFjZSAqLworCisKK3N0YXRpYyB2b2lkIGlmZV9wcmludDYoc3RydWN0IGludGVyZmFjZSAqcHRyKQoreworCUZJTEUgKmY7CisJY2hhciBhZGRyNls0MF0sIGRldm5hbWVbMjBdOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2FwOworCWludCBwbGVuLCBzY29wZSwgZGFkX3N0YXR1cywgaWZfaWR4OworCWNoYXIgYWRkcjZwWzhdWzVdOworCisJZiA9IGZvcGVuX2Zvcl9yZWFkKF9QQVRIX1BST0NORVRfSUZJTkVUNik7CisJaWYgKGYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJd2hpbGUgKGZzY2FuZgorCQkgICAoZiwgIiU0cyU0cyU0cyU0cyU0cyU0cyU0cyU0cyAlMDh4ICUwMnggJTAyeCAlMDJ4ICUyMHNcbiIsCisJCQlhZGRyNnBbMF0sIGFkZHI2cFsxXSwgYWRkcjZwWzJdLCBhZGRyNnBbM10sIGFkZHI2cFs0XSwKKwkJCWFkZHI2cFs1XSwgYWRkcjZwWzZdLCBhZGRyNnBbN10sICZpZl9pZHgsICZwbGVuLCAmc2NvcGUsCisJCQkmZGFkX3N0YXR1cywgZGV2bmFtZSkgIT0gRU9GCisJKSB7CisJCWlmICghc3RyY21wKGRldm5hbWUsIHB0ci0+bmFtZSkpIHsKKwkJCXNwcmludGYoYWRkcjYsICIlczolczolczolczolczolczolczolcyIsCisJCQkJCWFkZHI2cFswXSwgYWRkcjZwWzFdLCBhZGRyNnBbMl0sIGFkZHI2cFszXSwKKwkJCQkJYWRkcjZwWzRdLCBhZGRyNnBbNV0sIGFkZHI2cFs2XSwgYWRkcjZwWzddKTsKKwkJCWluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjYsCisJCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FwLnNpbjZfYWRkcik7CisJCQlzYXAuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCXByaW50ZigiICAgICAgICAgIGluZXQ2IGFkZHI6ICVzLyVkIiwKKwkJCQkgICBJTkVUNl9zcHJpbnQoKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FwLCAxKSwKKwkJCQkgICBwbGVuKTsKKwkJCXByaW50ZigiIFNjb3BlOiIpOworCQkJc3dpdGNoIChzY29wZSAmIElQVjZfQUREUl9TQ09QRV9NQVNLKSB7CisJCQljYXNlIDA6CisJCQkJcHV0cygiR2xvYmFsIik7CisJCQkJYnJlYWs7CisJCQljYXNlIElQVjZfQUREUl9MSU5LTE9DQUw6CisJCQkJcHV0cygiTGluayIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFY2X0FERFJfU0lURUxPQ0FMOgorCQkJCXB1dHMoIlNpdGUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBWNl9BRERSX0NPTVBBVHY0OgorCQkJCXB1dHMoIkNvbXBhdCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFY2X0FERFJfTE9PUEJBQ0s6CisJCQkJcHV0cygiSG9zdCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwdXRzKCJVbmtub3duIik7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGYpOworfQorI2Vsc2UKKyNkZWZpbmUgaWZlX3ByaW50NihhKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpZmVfcHJpbnQoc3RydWN0IGludGVyZmFjZSAqcHRyKQoreworCWNvbnN0IHN0cnVjdCBhZnR5cGUgKmFwOworCWNvbnN0IHN0cnVjdCBod3R5cGUgKmh3OworCWludCBoZjsKKwlpbnQgY2FuX2NvbXByZXNzID0gMDsKKworCWFwID0gZ2V0X2FmbnR5cGUocHRyLT5hZGRyLnNhX2ZhbWlseSk7CisJaWYgKGFwID09IE5VTEwpCisJCWFwID0gZ2V0X2FmbnR5cGUoMCk7CisKKwloZiA9IHB0ci0+dHlwZTsKKworCWlmIChoZiA9PSBBUlBIUkRfQ1NMSVAgfHwgaGYgPT0gQVJQSFJEX0NTTElQNikKKwkJY2FuX2NvbXByZXNzID0gMTsKKworCWh3ID0gZ2V0X2h3bnR5cGUoaGYpOworCWlmIChodyA9PSBOVUxMKQorCQlodyA9IGdldF9od250eXBlKC0xKTsKKworCXByaW50ZigiJS05cyBMaW5rIGVuY2FwOiVzICAiLCBwdHItPm5hbWUsIGh3LT50aXRsZSk7CisJLyogRm9yIHNvbWUgaGFyZHdhcmUgdHlwZXMgKGVnIEFzaCwgQVRNKSB3ZSBkb24ndCBwcmludCB0aGUKKwkgICBoYXJkd2FyZSBhZGRyZXNzIGlmIGl0J3MgbnVsbC4gICovCisJaWYgKGh3LT5wcmludCAhPSBOVUxMCisJICYmICEoaHdfbnVsbF9hZGRyZXNzKGh3LCBwdHItPmh3YWRkcikgJiYgaHctPnN1cHByZXNzX251bGxfYWRkcikKKwkpIHsKKwkJcHJpbnRmKCJIV2FkZHIgJXMgICIsIGh3LT5wcmludCgodW5zaWduZWQgY2hhciAqKXB0ci0+aHdhZGRyKSk7CisJfQorI2lmZGVmIElGRl9QT1JUU0VMCisJaWYgKHB0ci0+ZmxhZ3MgJiBJRkZfUE9SVFNFTCkgeworCQlwcmludGYoIk1lZGlhOiVzIiwgaWZfcG9ydF90ZXh0W3B0ci0+bWFwLnBvcnRdIC8qIFswXSAqLyk7CisJCWlmIChwdHItPmZsYWdzICYgSUZGX0FVVE9NRURJQSkKKwkJCXByaW50ZigiKGF1dG8pIik7CisJfQorI2VuZGlmCisJYmJfcHV0Y2hhcignXG4nKTsKKworCWlmIChwdHItPmhhc19pcCkgeworCQlwcmludGYoIiAgICAgICAgICAlcyBhZGRyOiVzICIsIGFwLT5uYW1lLAorCQkJICAgYXAtPnNwcmludCgmcHRyLT5hZGRyLCAxKSk7CisJCWlmIChwdHItPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSB7CisJCQlwcmludGYoIiBQLXQtUDolcyAiLCBhcC0+c3ByaW50KCZwdHItPmRzdGFkZHIsIDEpKTsKKwkJfQorCQlpZiAocHRyLT5mbGFncyAmIElGRl9CUk9BRENBU1QpIHsKKwkJCXByaW50ZigiIEJjYXN0OiVzICIsIGFwLT5zcHJpbnQoJnB0ci0+YnJvYWRhZGRyLCAxKSk7CisJCX0KKwkJcHJpbnRmKCIgTWFzazolc1xuIiwgYXAtPnNwcmludCgmcHRyLT5uZXRtYXNrLCAxKSk7CisJfQorCisJaWZlX3ByaW50NihwdHIpOworCisJcHJpbnRmKCIgICAgICAgICAgIik7CisJLyogRE9OVCBGT1JHRVQgVE8gQUREIFRIRSBGTEFHUyBJTiBpZmVfcHJpbnRfc2hvcnQsIHRvbyAqLworCisJaWYgKHB0ci0+ZmxhZ3MgPT0gMCkgeworCQlwcmludGYoIltOTyBGTEFHU10gIik7CisJfSBlbHNlIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgaWZlX3ByaW50X2ZsYWdzX3N0cnNbXSBBTElHTjEgPQorCQkJIlVQXDAiCisJCQkiQlJPQURDQVNUXDAiCisJCQkiREVCVUdcMCIKKwkJCSJMT09QQkFDS1wwIgorCQkJIlBPSU5UT1BPSU5UXDAiCisJCQkiTk9UUkFJTEVSU1wwIgorCQkJIlJVTk5JTkdcMCIKKwkJCSJOT0FSUFwwIgorCQkJIlBST01JU0NcMCIKKwkJCSJBTExNVUxUSVwwIgorCQkJIlNMQVZFXDAiCisJCQkiTUFTVEVSXDAiCisJCQkiTVVMVElDQVNUXDAiCisjaWZkZWYgSEFWRV9EWU5BTUlDCisJCQkiRFlOQU1JQ1wwIgorI2VuZGlmCisJCQk7CisJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpZmVfcHJpbnRfZmxhZ3NfbWFza1tdIEFMSUdOMiA9IHsKKwkJCUlGRl9VUCwKKwkJCUlGRl9CUk9BRENBU1QsCisJCQlJRkZfREVCVUcsCisJCQlJRkZfTE9PUEJBQ0ssCisJCQlJRkZfUE9JTlRPUE9JTlQsCisJCQlJRkZfTk9UUkFJTEVSUywKKwkJCUlGRl9SVU5OSU5HLAorCQkJSUZGX05PQVJQLAorCQkJSUZGX1BST01JU0MsCisJCQlJRkZfQUxMTVVMVEksCisJCQlJRkZfU0xBVkUsCisJCQlJRkZfTUFTVEVSLAorCQkJSUZGX01VTFRJQ0FTVAorI2lmZGVmIEhBVkVfRFlOQU1JQworCQkJLElGRl9EWU5BTUlDCisjZW5kaWYKKwkJfTsKKwkJY29uc3QgdW5zaWduZWQgc2hvcnQgKm1hc2sgPSBpZmVfcHJpbnRfZmxhZ3NfbWFzazsKKwkJY29uc3QgY2hhciAqc3RyID0gaWZlX3ByaW50X2ZsYWdzX3N0cnM7CisJCWRvIHsKKwkJCWlmIChwdHItPmZsYWdzICYgKm1hc2spIHsKKwkJCQlwcmludGYoIiVzICIsIHN0cik7CisJCQl9CisJCQltYXNrKys7CisJCQlzdHIgKz0gc3RybGVuKHN0cikgKyAxOworCQl9IHdoaWxlICgqc3RyKTsKKwl9CisKKwkvKiBET05UIEZPUkdFVCBUTyBBREQgVEhFIEZMQUdTIElOIGlmZV9wcmludF9zaG9ydCAqLworCXByaW50ZigiIE1UVTolZCAgTWV0cmljOiVkIiwgcHRyLT5tdHUsIHB0ci0+bWV0cmljID8gcHRyLT5tZXRyaWMgOiAxKTsKKyNpZmRlZiBTSU9DU0tFRVBBTElWRQorCWlmIChwdHItPm91dGZpbGwgfHwgcHRyLT5rZWVwYWxpdmUpCisJCXByaW50ZigiICBPdXRmaWxsOiVkICBLZWVwYWxpdmU6JWQiLCBwdHItPm91dGZpbGwsIHB0ci0+a2VlcGFsaXZlKTsKKyNlbmRpZgorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwkvKiBJZiBuZWVkZWQsIGRpc3BsYXkgdGhlIGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworCisJaWYgKHB0ci0+c3RhdGlzdGljc192YWxpZCkgeworCQkvKiBYWFg6IHN0YXRpc3RpY3MgYXJlIGN1cnJlbnRseSBvbmx5IHByaW50ZWQgZm9yIHRoZSBwcmltYXJ5IGFkZHJlc3MsCisJCSAqICAgICAgbm90IGZvciB0aGUgYWxpYXNlcywgYWx0aG91Z2ggc3RyaWN0bHkgc3BlYWtpbmcgdGhleSdyZSBzaGFyZWQKKwkJICogICAgICBieSBhbGwgYWRkcmVzc2VzLgorCQkgKi8KKwkJcHJpbnRmKCIgICAgICAgICAgIik7CisKKwkJcHJpbnRmKCJSWCBwYWNrZXRzOiVsbHUgZXJyb3JzOiVsdSBkcm9wcGVkOiVsdSBvdmVycnVuczolbHUgZnJhbWU6JWx1XG4iLAorCQkJICAgcHRyLT5zdGF0cy5yeF9wYWNrZXRzLCBwdHItPnN0YXRzLnJ4X2Vycm9ycywKKwkJCSAgIHB0ci0+c3RhdHMucnhfZHJvcHBlZCwgcHRyLT5zdGF0cy5yeF9maWZvX2Vycm9ycywKKwkJCSAgIHB0ci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKTsKKwkJaWYgKGNhbl9jb21wcmVzcykKKwkJCXByaW50ZigiICAgICAgICAgICAgIGNvbXByZXNzZWQ6JWx1XG4iLAorCQkJCSAgIHB0ci0+c3RhdHMucnhfY29tcHJlc3NlZCk7CisJCXByaW50ZigiICAgICAgICAgICIpOworCQlwcmludGYoIlRYIHBhY2tldHM6JWxsdSBlcnJvcnM6JWx1IGRyb3BwZWQ6JWx1IG92ZXJydW5zOiVsdSBjYXJyaWVyOiVsdVxuIiwKKwkJCSAgIHB0ci0+c3RhdHMudHhfcGFja2V0cywgcHRyLT5zdGF0cy50eF9lcnJvcnMsCisJCQkgICBwdHItPnN0YXRzLnR4X2Ryb3BwZWQsIHB0ci0+c3RhdHMudHhfZmlmb19lcnJvcnMsCisJCQkgICBwdHItPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKTsKKwkJcHJpbnRmKCIgICAgICAgICAgY29sbGlzaW9uczolbHUgIiwgcHRyLT5zdGF0cy5jb2xsaXNpb25zKTsKKwkJaWYgKGNhbl9jb21wcmVzcykKKwkJCXByaW50ZigiY29tcHJlc3NlZDolbHUgIiwgcHRyLT5zdGF0cy50eF9jb21wcmVzc2VkKTsKKwkJaWYgKHB0ci0+dHhfcXVldWVfbGVuICE9IC0xKQorCQkJcHJpbnRmKCJ0eHF1ZXVlbGVuOiVkICIsIHB0ci0+dHhfcXVldWVfbGVuKTsKKwkJcHJpbnRmKCJcbiAgICAgICAgICBSIik7CisJCXByaW50X2J5dGVzX3NjYWxlZChwdHItPnN0YXRzLnJ4X2J5dGVzLCAiICBUIik7CisJCXByaW50X2J5dGVzX3NjYWxlZChwdHItPnN0YXRzLnR4X2J5dGVzLCAiXG4iKTsKKwl9CisKKwlpZiAocHRyLT5tYXAuaXJxIHx8IHB0ci0+bWFwLm1lbV9zdGFydAorCSB8fCBwdHItPm1hcC5kbWEgfHwgcHRyLT5tYXAuYmFzZV9hZGRyCisJKSB7CisJCXByaW50ZigiICAgICAgICAgICIpOworCQlpZiAocHRyLT5tYXAuaXJxKQorCQkJcHJpbnRmKCJJbnRlcnJ1cHQ6JWQgIiwgcHRyLT5tYXAuaXJxKTsKKwkJaWYgKHB0ci0+bWFwLmJhc2VfYWRkciA+PSAweDEwMCkJLyogT25seSBwcmludCBkZXZpY2VzIHVzaW5nIGl0IGZvcgorCQkJCQkJCQkJCQkgICBJL08gbWFwcyAqLworCQkJcHJpbnRmKCJCYXNlIGFkZHJlc3M6MHglbHggIiwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgcHRyLT5tYXAuYmFzZV9hZGRyKTsKKwkJaWYgKHB0ci0+bWFwLm1lbV9zdGFydCkgeworCQkJcHJpbnRmKCJNZW1vcnk6JWx4LSVseCAiLCBwdHItPm1hcC5tZW1fc3RhcnQsCisJCQkJICAgcHRyLT5tYXAubWVtX2VuZCk7CisJCX0KKwkJaWYgKHB0ci0+bWFwLmRtYSkKKwkJCXByaW50ZigiRE1BIGNoYW46JXggIiwgcHRyLT5tYXAuZG1hKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIGludCBkb19pZl9wcmludChzdHJ1Y3QgaW50ZXJmYWNlICppZmUpIC8qLCBpbnQgKm9wdF9hKSovCit7CisJaW50IHJlczsKKworCXJlcyA9IGRvX2lmX2ZldGNoKGlmZSk7CisJaWYgKHJlcyA+PSAwKSB7CisJCWlmICgoaWZlLT5mbGFncyAmIElGRl9VUCkgfHwgaW50ZXJmYWNlX29wdF9hKQorCQkJaWZlX3ByaW50KGlmZSk7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJmYWNlICpsb29rdXBfaW50ZXJmYWNlKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGludGVyZmFjZSAqaWZlID0gTlVMTDsKKworCWlmIChpZl9yZWFkbGlzdF9wcm9jKG5hbWUpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWZlID0gYWRkX2ludGVyZmFjZShuYW1lKTsKKwlyZXR1cm4gaWZlOworfQorCisjaWZkZWYgVU5VU0VECitzdGF0aWMgaW50IGZvcl9hbGxfaW50ZXJmYWNlcyhpbnQgKCpkb2l0KSAoc3RydWN0IGludGVyZmFjZSAqLCB2b2lkICopLAorCQkJCQkJCSAgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBpbnRlcmZhY2UgKmlmZTsKKworCWlmICghaW50X2xpc3QgJiYgKGlmX3JlYWRsaXN0KCkgPCAwKSkKKwkJcmV0dXJuIC0xOworCWZvciAoaWZlID0gaW50X2xpc3Q7IGlmZTsgaWZlID0gaWZlLT5uZXh0KSB7CisJCWludCBlcnIgPSBkb2l0KGlmZSwgY29va2llKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIGZvciBpcHY0IGFkZC9kZWwgbW9kZXMgKi8KK3N0YXRpYyBpbnQgaWZfcHJpbnQoY2hhciAqaWZuYW1lKQoreworCXN0cnVjdCBpbnRlcmZhY2UgKmlmZTsKKwlpbnQgcmVzOworCisJaWYgKCFpZm5hbWUpIHsKKwkJLypyZXMgPSBmb3JfYWxsX2ludGVyZmFjZXMoZG9faWZfcHJpbnQsICZpbnRlcmZhY2Vfb3B0X2EpOyovCisJCWlmICghaW50X2xpc3QgJiYgKGlmX3JlYWRsaXN0KCkgPCAwKSkKKwkJCXJldHVybiAtMTsKKwkJZm9yIChpZmUgPSBpbnRfbGlzdDsgaWZlOyBpZmUgPSBpZmUtPm5leHQpIHsKKwkJCWludCBlcnIgPSBkb19pZl9wcmludChpZmUpOyAvKiwgJmludGVyZmFjZV9vcHRfYSk7Ki8KKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWZlID0gbG9va3VwX2ludGVyZmFjZShpZm5hbWUpOworCXJlcyA9IGRvX2lmX2ZldGNoKGlmZSk7CisJaWYgKHJlcyA+PSAwKQorCQlpZmVfcHJpbnQoaWZlKTsKKwlyZXR1cm4gcmVzOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFdJQgorLyogSW5wdXQgYW4gSW5maW5pYmFuZCBhZGRyZXNzIGFuZCBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KK2ludCBGQVNUX0ZVTkMgaW5faWIoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJc2FwLT5zYV9mYW1pbHkgPSBpYl9od3R5cGUudHlwZTsKKy8vVE9ETzogZXJyb3IgY2hlY2s/CisJaGV4MmJpbigoY2hhciopc2FwLT5zYV9kYXRhLCBidWZwLCBJTkZJTklCQU5EX0FMRU4pOworIyBpZmRlZiBIV0lCX0RFQlVHCisJZnByaW50ZihzdGRlcnIsICJpbl9pYiglcyk6ICVzXG4iLCBidWZwLCBVTlNQRUNfcHJpbnQoc2FwLT5zYV9kYXRhKSk7CisjIGVuZGlmCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IEZBU1RfRlVOQyBkaXNwbGF5X2ludGVyZmFjZXMoY2hhciAqaWZuYW1lKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpZl9wcmludChpZm5hbWUpOworCisJcmV0dXJuIChzdGF0dXMgPCAwKTsgLyogc3RhdHVzIDwgMCA9PSAxIC0tIGVycm9yICovCit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lwLmMgYi9uZXR3b3JraW5nL2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyZjVlMgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaXAuYwpAQCAtMCwwICsxLDE3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogQ2hhbmdlczoKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5Mjk6IHJlc29sdmUgYWRkcmVzc2VzCisgKiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgcmV3cm90ZSB0byB1c2UgaW5kZXhfaW5fc3Vic3RyX2FycmF5CisgKi8KKworLyogd291bGQgbmVlZCB0byBtYWtlIHRoZSAiIHwgIiBvcHRpb25hbCBkZXBlbmRpbmcgb24gbW9yZSB0aGFuIG9uZSBzZWxlY3RlZDogKi8KKy8vdXNhZ2U6I2RlZmluZSBpcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIHsiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX0FERFJFU1MoImFkZHJlc3MgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9ST1VURSgicm91dGUgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9MSU5LKCJsaW5rIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfVFVOTkVMKCJ0dW5uZWwgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9SVUxFKCJydWxlIikKKy8vdXNhZ2U6ICAgICAgICJ9IHtDT01NQU5EfSIKKy8vdXNhZ2U6I2RlZmluZSBpcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwIFtPUFRJT05TXSBPQkpFQ1Qge0NPTU1BTkR9XG4iCisvL3VzYWdlOiAgICAgICAid2hlcmUgT0JKRUNUIDo9IHsiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX0FERFJFU1MoImFkZHJlc3MgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9ST1VURSgicm91dGUgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9MSU5LKCJsaW5rIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfVFVOTkVMKCJ0dW5uZWwgfCAiKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9SVUxFKCJydWxlIikKKy8vdXNhZ2U6ICAgICAgICJ9XG4iCisvL3VzYWdlOiAgICAgICAiT1BUSU9OUyA6PSB7IC1mW2FtaWx5XSB7IGluZXQgfCBpbmV0NiB8IGxpbmsgfSB8IC1vW25lbGluZV0gfSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaXBhZGRyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7IHthZGR8ZGVsfSBJRkFERFIgZGV2IFNUUklORyB8IHtzaG93fGZsdXNofVxuIgorLy91c2FnZTogICAgICAgIgkJW2RldiBTVFJJTkddIFt0byBQUkVGSVhdIH0iCisvL3VzYWdlOiNkZWZpbmUgaXBhZGRyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiaXBhZGRyIHthZGR8ZGVsZXRlfSBJRkFERFIgZGV2IFNUUklOR1xuIgorLy91c2FnZTogICAgICAgImlwYWRkciB7c2hvd3xmbHVzaH0gW2RldiBTVFJJTkddIFtzY29wZSBTQ09QRS1JRF1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW3RvIFBSRUZJWF0gW2xhYmVsIFBBVFRFUk5dXG4iCisvL3VzYWdlOiAgICAgICAiCUlGQUREUiA6PSBQUkVGSVggfCBBRERSIHBlZXIgUFJFRklYXG4iCisvL3VzYWdlOiAgICAgICAiCVticm9hZGNhc3QgQUREUl0gW2FueWNhc3QgQUREUl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW2xhYmVsIFNUUklOR10gW3Njb3BlIFNDT1BFLUlEXVxuIgorLy91c2FnZTogICAgICAgIglTQ09QRS1JRCA6PSBbaG9zdCB8IGxpbmsgfCBnbG9iYWwgfCBOVU1CRVJdIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBpcGxpbmtfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInsgc2V0IERFVklDRSB7IHVwIHwgZG93biB8IGFycCB7IG9uIHwgb2ZmIH0gfCBzaG93IFtERVZJQ0VdIH0iCisvL3VzYWdlOiNkZWZpbmUgaXBsaW5rX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiaXBsaW5rIHNldCBERVZJQ0UgeyB1cCB8IGRvd24gfCBhcnAgfCBtdWx0aWNhc3QgeyBvbiB8IG9mZiB9IHxcbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlkeW5hbWljIHsgb24gfCBvZmYgfSB8XG4iCisvL3VzYWdlOiAgICAgICAiCQkJbXR1IE1UVSB9XG4iCisvL3VzYWdlOiAgICAgICAiaXBsaW5rIHNob3cgW0RFVklDRV0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwcm91dGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInsgbGlzdCB8IGZsdXNoIHwgeyBhZGQgfCBkZWwgfCBjaGFuZ2UgfCBhcHBlbmQgfFxuIgorLy91c2FnZTogICAgICAgIgkJcmVwbGFjZSB8IG1vbml0b3IgfSBST1VURSB9IgorLy91c2FnZTojZGVmaW5lIGlwcm91dGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJvdXRlIHsgbGlzdCB8IGZsdXNoIH0gU0VMRUNUT1JcbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJvdXRlIGdldCBBRERSRVNTIFtmcm9tIEFERFJFU1MgaWlmIFNUUklOR11cbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlbb2lmIFNUUklOR10gW3RvcyBUT1NdXG4iCisvL3VzYWdlOiAgICAgICAiaXByb3V0ZSB7IGFkZCB8IGRlbCB8IGNoYW5nZSB8IGFwcGVuZCB8IHJlcGxhY2UgfCBtb25pdG9yIH0gUk9VVEVcbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlTRUxFQ1RPUiA6PSBbcm9vdCBQUkVGSVhdIFttYXRjaCBQUkVGSVhdIFtwcm90byBSVFBST1RPXVxuIgorLy91c2FnZTogICAgICAgIgkJCVJPVVRFIDo9IFtUWVBFXSBQUkVGSVggW3RvcyBUT1NdIFtwcm90byBSVFBST1RPXVxuIgorLy91c2FnZTogICAgICAgIgkJCQlbbWV0cmljIE1FVFJJQ10iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwcnVsZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAie1tsaXN0IHwgYWRkIHwgZGVsXSBSVUxFfSIKKy8vdXNhZ2U6I2RlZmluZSBpcHJ1bGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJ1bGUgW2xpc3QgfCBhZGQgfCBkZWxdIFNFTEVDVE9SIEFDVElPTlxuIgorLy91c2FnZTogICAgICAgIglTRUxFQ1RPUiA6PSBbZnJvbSBQUkVGSVhdIFt0byBQUkVGSVhdIFt0b3MgVE9TXSBbZndtYXJrIEZXTUFSS11cbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlbZGV2IFNUUklOR10gW3ByZWYgTlVNQkVSXVxuIgorLy91c2FnZTogICAgICAgIglBQ1RJT04gOj0gW3RhYmxlIFRBQkxFX0lEXSBbbmF0IEFERFJFU1NdXG4iCisvL3VzYWdlOiAgICAgICAiCQkJW3Byb2hpYml0IHwgcmVqZWN0IHwgdW5yZWFjaGFibGVdXG4iCisvL3VzYWdlOiAgICAgICAiCQkJW3JlYWxtcyBbU1JDUkVBTE0vXURTVFJFQUxNXVxuIgorLy91c2FnZTogICAgICAgIglUQUJMRV9JRCA6PSBbbG9jYWwgfCBtYWluIHwgZGVmYXVsdCB8IE5VTUJFUl0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwdHVubmVsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7IGFkZCB8IGNoYW5nZSB8IGRlbCB8IHNob3cgfSBbTkFNRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW21vZGUgeyBpcGlwIHwgZ3JlIHwgc2l0IH1dXG4iCisvL3VzYWdlOiAgICAgICAiCVtyZW1vdGUgQUREUl0gW2xvY2FsIEFERFJdIFt0dGwgVFRMXSIKKy8vdXNhZ2U6I2RlZmluZSBpcHR1bm5lbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwdHVubmVsIHsgYWRkIHwgY2hhbmdlIHwgZGVsIHwgc2hvdyB9IFtOQU1FXVxuIgorLy91c2FnZTogICAgICAgIglbbW9kZSB7IGlwaXAgfCBncmUgfCBzaXQgfV0gW3JlbW90ZSBBRERSXSBbbG9jYWwgQUREUl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW1tpfG9dc2VxXSBbW2l8b11rZXkgS0VZXSBbW2l8b11jc3VtXVxuIgorLy91c2FnZTogICAgICAgIglbdHRsIFRUTF0gW3RvcyBUT1NdIFtbbm9dcG10dWRpc2NdIFtkZXYgUEhZU19ERVZdIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgImxpYmlwcm91dGUvdXRpbHMuaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL2lwX2NvbW1vbi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfQUREUkVTUyBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfUk9VVEUgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX0xJTksgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX1RVTk5FTCBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBpcF9wcmludF9oZWxwKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwliYl9zaG93X3VzYWdlKCk7Cit9CisKK3R5cGVkZWYgaW50IEZBU1RfRlVOQyAoKmlwX2Z1bmNfcHRyX3QpKGNoYXIqKik7CisKK3N0YXRpYyBpbnQgaXBfZG8oaXBfZnVuY19wdHJfdCBpcF9mdW5jLCBjaGFyICoqYXJndikKK3sKKwlhcmd2ID0gaXBfcGFyc2VfY29tbW9uX2FyZ3MoYXJndiArIDEpOworCXJldHVybiBpcF9mdW5jKGFyZ3YpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfQUREUkVTUworaW50IGlwYWRkcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBhZGRyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gaXBfZG8oZG9faXBhZGRyLCBhcmd2KTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX0xJTksKK2ludCBpcGxpbmtfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwbGlua19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGlwX2RvKGRvX2lwbGluaywgYXJndik7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9ST1VURQoraW50IGlwcm91dGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwcm91dGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBpcF9kbyhkb19pcHJvdXRlLCBhcmd2KTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JVTEUKK2ludCBpcHJ1bGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwcnVsZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGlwX2RvKGRvX2lwcnVsZSwgYXJndik7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9UVU5ORUwKK2ludCBpcHR1bm5lbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXB0dW5uZWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBpcF9kbyhkb19pcHR1bm5lbCwgYXJndik7Cit9CisjZW5kaWYKKworCitpbnQgaXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCUlGX0ZFQVRVUkVfSVBfQUREUkVTUygiYWRkcmVzc1wwIikKKwkJSUZfRkVBVFVSRV9JUF9ST1VURSgicm91dGVcMCIpCisJCUlGX0ZFQVRVUkVfSVBfUk9VVEUoInJcMCIpCisJCUlGX0ZFQVRVUkVfSVBfTElOSygibGlua1wwIikKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoInR1bm5lbFwwIikKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoInR1bmxcMCIpCisJCUlGX0ZFQVRVUkVfSVBfUlVMRSgicnVsZVwwIikKKwkJOworCXN0YXRpYyBjb25zdCBpcF9mdW5jX3B0cl90IGlwX2Z1bmNfcHRyc1tdID0geworCQlpcF9wcmludF9oZWxwLAorCQlJRl9GRUFUVVJFX0lQX0FERFJFU1MoZG9faXBhZGRyLCkKKwkJSUZfRkVBVFVSRV9JUF9ST1VURShkb19pcHJvdXRlLCkKKwkJSUZfRkVBVFVSRV9JUF9ST1VURShkb19pcHJvdXRlLCkKKwkJSUZfRkVBVFVSRV9JUF9MSU5LKGRvX2lwbGluaywpCisJCUlGX0ZFQVRVUkVfSVBfVFVOTkVMKGRvX2lwdHVubmVsLCkKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoZG9faXB0dW5uZWwsKQorCQlJRl9GRUFUVVJFX0lQX1JVTEUoZG9faXBydWxlLCkKKwl9OworCWlwX2Z1bmNfcHRyX3QgaXBfZnVuYzsKKwlpbnQga2V5OworCisJYXJndiA9IGlwX3BhcnNlX2NvbW1vbl9hcmdzKGFyZ3YgKyAxKTsKKwlrZXkgPSAqYXJndiA/IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KyspIDogLTE7CisJaXBfZnVuYyA9IGlwX2Z1bmNfcHRyc1trZXkgKyAxXTsKKworCXJldHVybiBpcF9mdW5jKGFyZ3YpOworfQorCisjZW5kaWYgLyogYW55IG9mIEVOQUJMRV9GRUFUVVJFX0lQX3h4eCBpcyAxICovCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lwY2FsYy5jIGIvbmV0d29ya2luZy9pcGNhbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhiOGJmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pcGNhbGMuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBpcGNhbGMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBCeSBKb3JkYW4gQ3JvdXNlIDxqb3JkYW5AY29zbWljcGVuZ3Vpbi5uZXQ+CisgKiAgICBTdGVwaGFuIExpbnogIDxsaW56QGxpLXByby5uZXQ+CisgKgorICogVGhpcyBpcyBhIGNvbXBsZXRlIHJlaW1wbGVtZW50YXRpb24gb2YgdGhlIGlwY2FsYyBwcm9ncmFtCisgKiBmcm9tIFJlZCBIYXQuICBJIGRpZG4ndCBsb29rIGF0IHRoZWlyIHNvdXJjZSBjb2RlLCBidXQgdGhlcmUKKyAqIGlzIG5vIGRlbnlpbmcgdGhhdCB0aGlzIGlzIGEgbG92aW5nIHJlaW1wbGVtZW50YXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpcGNhbGNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBBRERSRVNTW1svXU5FVE1BU0tdIFtORVRNQVNLXSIKKy8vdXNhZ2U6I2RlZmluZSBpcGNhbGNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDYWxjdWxhdGUgSVAgbmV0d29yayBzZXR0aW5ncyBmcm9tIGEgSVAgYWRkcmVzc1xuIgorLy91c2FnZToJSUZfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYiwtLWJyb2FkY2FzdAlEaXNwbGF5IGNhbGN1bGF0ZWQgYnJvYWRjYXN0IGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1uLC0tbmV0d29yawlEaXNwbGF5IGNhbGN1bGF0ZWQgbmV0d29yayBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktbSwtLW5ldG1hc2sJRGlzcGxheSBkZWZhdWx0IG5ldG1hc2sgZm9yIElQIgorLy91c2FnZToJSUZfRkVBVFVSRV9JUENBTENfRkFOQ1koCisvL3VzYWdlOiAgICAgIlxuCS1wLC0tcHJlZml4CURpc3BsYXkgdGhlIHByZWZpeCBmb3IgSVAvTkVUTUFTSyIKKy8vdXNhZ2U6ICAgICAiXG4JLWgsLS1ob3N0bmFtZQlEaXNwbGF5IGZpcnN0IHJlc29sdmVkIGhvc3QgbmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zaWxlbnQJRG9uJ3QgZXZlciBkaXNwbGF5IGVycm9yIG1lc3NhZ2VzIgorLy91c2FnZToJKQorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWIJRGlzcGxheSBjYWxjdWxhdGVkIGJyb2FkY2FzdCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktbglEaXNwbGF5IGNhbGN1bGF0ZWQgbmV0d29yayBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktbQlEaXNwbGF5IGRlZmF1bHQgbmV0bWFzayBmb3IgSVAiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQQ0FMQ19GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLXAJRGlzcGxheSB0aGUgcHJlZml4IGZvciBJUC9ORVRNQVNLIgorLy91c2FnZTogICAgICJcbgktaAlEaXNwbGF5IGZpcnN0IHJlc29sdmVkIGhvc3QgbmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRG9uJ3QgZXZlciBkaXNwbGF5IGVycm9yIG1lc3NhZ2VzIgorLy91c2FnZToJKQorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIGJlY2F1c2Ugb24gc29tZSBzeXN0ZW1zIGl0IG5lZWRzIG90aGVyIGluY2x1ZGVzICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNkZWZpbmUgQ0xBU1NfQV9ORVRNQVNLIG50b2hsKDB4RkYwMDAwMDApCisjZGVmaW5lIENMQVNTX0JfTkVUTUFTSyBudG9obCgweEZGRkYwMDAwKQorI2RlZmluZSBDTEFTU19DX05FVE1BU0sgbnRvaGwoMHhGRkZGRkYwMCkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X25ldG1hc2sodW5zaWduZWQgbG9uZyBpcGFkZHIpCit7CisJaXBhZGRyID0gaHRvbmwoaXBhZGRyKTsKKworCWlmICgoaXBhZGRyICYgMHhDMDAwMDAwMCkgPT0gMHhDMDAwMDAwMCkKKwkJcmV0dXJuIENMQVNTX0NfTkVUTUFTSzsKKwllbHNlIGlmICgoaXBhZGRyICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKwkJcmV0dXJuIENMQVNTX0JfTkVUTUFTSzsKKwllbHNlIGlmICgoaXBhZGRyICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJcmV0dXJuIENMQVNTX0FfTkVUTUFTSzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZCitzdGF0aWMgaW50IGdldF9wcmVmaXgodW5zaWduZWQgbG9uZyBuZXRtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgbXNrID0gMHg4MDAwMDAwMDsKKwlpbnQgcmV0ID0gMDsKKworCW5ldG1hc2sgPSBodG9ubChuZXRtYXNrKTsKKwl3aGlsZSAobXNrKSB7CisJCWlmIChuZXRtYXNrICYgbXNrKQorCQkJcmV0Kys7CisJCW1zayA+Pj0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitpbnQgZ2V0X3ByZWZpeCh1bnNpZ25lZCBsb25nIG5ldG1hc2spOworI2VuZGlmCisKKworI2RlZmluZSBORVRNQVNLICAgMHgwMQorI2RlZmluZSBCUk9BRENBU1QgMHgwMgorI2RlZmluZSBORVRXT1JLICAgMHgwNAorI2RlZmluZSBORVRQUkVGSVggMHgwOAorI2RlZmluZSBIT1NUTkFNRSAgMHgxMAorI2RlZmluZSBTSUxFTlQgICAgMHgyMAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIGlwY2FsY19sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJuZXRtYXNrXDAiICAgTm9fYXJndW1lbnQgIm0iIC8vIG5ldG1hc2sgZnJvbSBJUCAoYXNzdW1pbmcgY29tcGxldGUgY2xhc3MgQSwgQiwgb3IgQyBuZXR3b3JrKQorCQkiYnJvYWRjYXN0XDAiIE5vX2FyZ3VtZW50ICJiIiAvLyBicm9hZGNhc3QgZnJvbSBJUCBbbmV0bWFza10KKwkJIm5ldHdvcmtcMCIgICBOb19hcmd1bWVudCAibiIgLy8gbmV0d29yayBmcm9tIElQIFtuZXRtYXNrXQorIyBpZiBFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kKKwkJInByZWZpeFwwIiAgICBOb19hcmd1bWVudCAicCIgLy8gcHJlZml4IGZyb20gSVBbL3ByZWZpeF0gW25ldG1hc2tdCisJCSJob3N0bmFtZVwwIiAgTm9fYXJndW1lbnQgImgiIC8vIGhvc3RuYW1lIGZyb20gSVAKKwkJInNpbGVudFwwIiAgICBOb19hcmd1bWVudCAicyIgLy8gZG9u4oCZdCBldmVyIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMKKyMgZW5kaWYKKwkJOworI2VuZGlmCisKK2ludCBpcGNhbGNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwY2FsY19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWJvb2wgaGF2ZV9uZXRtYXNrID0gMDsKKwlzdHJ1Y3QgaW5fYWRkciBzX25ldG1hc2ssIHNfYnJvYWRjYXN0LCBzX25ldHdvcmssIHNfaXBhZGRyOworCS8qIHN0cnVjdCBpbl9hZGRyIHsgaW5fYWRkcl90IHNfYWRkcjsgfSAgYW5kICBpbl9hZGRyX3QKKwkgKiAod2hpY2ggaW4gdHVybiBpcyBqdXN0IGEgdHlwZWRlZiB0byB1aW50MzJfdCkKKwkgKiBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgdHlwZS4gQSBmZXcgbWFjcm9zIGZvciBsZXNzIHZlcmJvc2l0eTogKi8KKyNkZWZpbmUgbmV0bWFzayAgIChzX25ldG1hc2suc19hZGRyKQorI2RlZmluZSBicm9hZGNhc3QgKHNfYnJvYWRjYXN0LnNfYWRkcikKKyNkZWZpbmUgbmV0d29yayAgIChzX25ldHdvcmsuc19hZGRyKQorI2RlZmluZSBpcGFkZHIgICAgKHNfaXBhZGRyLnNfYWRkcikKKwljaGFyICppcHN0cjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gaXBjYWxjX2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6PzIiOyAvKiBtaW5pbXVtIDEgYXJnLCBtYXhpbXVtIDIgYXJncyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJtYm4iIElGX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZKCJwaHMiKSk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIFNJTEVOVCkKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsgLyogc3VwcHJlc3MgZXJyb3JfbXNnKCkgb3V0cHV0ICovCisJb3B0ICY9IH5TSUxFTlQ7CisJaWYgKCEob3B0ICYgKEJST0FEQ0FTVCB8IE5FVFdPUksgfCBORVRQUkVGSVgpKSkgeworCQkvKiBpZiBubyBvcHRpb25zIGF0IGFsbCBvcgorCQkgKiAobm8gYnJvYWRjYXN0LG5ldHdvcmsscHJlZml4KSBhbmQgKHR3byBhcmdzKS4uLiAqLworCQlpZiAoIW9wdCB8fCBhcmd2WzFdKQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlwc3RyID0gYXJndlswXTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZKSB7CisJCXVuc2lnbmVkIGxvbmcgbmV0cHJlZml4ID0gMDsKKwkJY2hhciAqcHJlZml4c3RyOworCisJCXByZWZpeHN0ciA9IGlwc3RyOworCisJCXdoaWxlICgqcHJlZml4c3RyKSB7CisJCQlpZiAoKnByZWZpeHN0ciA9PSAnLycpIHsKKwkJCQkqcHJlZml4c3RyKysgPSAnXDAnOworCQkJCWlmICgqcHJlZml4c3RyKSB7CisJCQkJCXVuc2lnbmVkIG1zazsKKwkJCQkJbmV0cHJlZml4ID0geGF0b3VsX3JhbmdlKHByZWZpeHN0ciwgMCwgMzIpOworCQkJCQluZXRtYXNrID0gMDsKKwkJCQkJbXNrID0gMHg4MDAwMDAwMDsKKwkJCQkJd2hpbGUgKG5ldHByZWZpeCA+IDApIHsKKwkJCQkJCW5ldG1hc2sgfD0gbXNrOworCQkJCQkJbXNrID4+PSAxOworCQkJCQkJbmV0cHJlZml4LS07CisJCQkJCX0KKwkJCQkJbmV0bWFzayA9IGh0b25sKG5ldG1hc2spOworCQkJCQkvKiBFdmVuIGlmIGl0IHdhcyAwLCB3ZSB3aWxsIHNpZ25pZnkgdGhhdCB3ZSBoYXZlIGEgbmV0bWFzay4gVGhpcyBhbGxvd3MgKi8KKwkJCQkJLyogZm9yIHNwZWNpZmljYXRpb24gb2YgZGVmYXVsdCByb3V0ZXMsIGV0YyB3aGljaCBoYXZlIGEgMCBuZXRtYXNrL3ByZWZpeCAqLworCQkJCQloYXZlX25ldG1hc2sgPSAxOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCXByZWZpeHN0cisrOworCQl9CisJfQorCisJaWYgKGluZXRfYXRvbihpcHN0ciwgJnNfaXBhZGRyKSA9PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgSVAgYWRkcmVzczogJXMiLCBhcmd2WzBdKTsKKwl9CisKKwlpZiAoYXJndlsxXSkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZICYmIGhhdmVfbmV0bWFzaykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVzZSBwcmVmaXggb3IgbmV0bWFzaywgbm90IGJvdGgiKTsKKwkJfQorCQlpZiAoaW5ldF9hdG9uKGFyZ3ZbMV0sICZzX25ldG1hc2spID09IDApIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgbmV0bWFzazogJXMiLCBhcmd2WzFdKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEpIQyAtIElmIHRoZSBuZXRtYXNrIHdhc24ndCBwcm92aWRlZCB0aGVuIGNhbGN1bGF0ZSBpdCAqLworCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0lQQ0FMQ19GQU5DWSB8fCAhaGF2ZV9uZXRtYXNrKQorCQkJbmV0bWFzayA9IGdldF9uZXRtYXNrKGlwYWRkcik7CisJfQorCisJaWYgKG9wdCAmIE5FVE1BU0spIHsKKwkJcHJpbnRmKCJORVRNQVNLPSVzXG4iLCBpbmV0X250b2Eoc19uZXRtYXNrKSk7CisJfQorCisJaWYgKG9wdCAmIEJST0FEQ0FTVCkgeworCQlicm9hZGNhc3QgPSAoaXBhZGRyICYgbmV0bWFzaykgfCB+bmV0bWFzazsKKwkJcHJpbnRmKCJCUk9BRENBU1Q9JXNcbiIsIGluZXRfbnRvYShzX2Jyb2FkY2FzdCkpOworCX0KKworCWlmIChvcHQgJiBORVRXT1JLKSB7CisJCW5ldHdvcmsgPSBpcGFkZHIgJiBuZXRtYXNrOworCQlwcmludGYoIk5FVFdPUks9JXNcbiIsIGluZXRfbnRvYShzX25ldHdvcmspKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZKSB7CisJCWlmIChvcHQgJiBORVRQUkVGSVgpIHsKKwkJCXByaW50ZigiUFJFRklYPSVpXG4iLCBnZXRfcHJlZml4KG5ldG1hc2spKTsKKwkJfQorCisJCWlmIChvcHQgJiBIT1NUTkFNRSkgeworCQkJc3RydWN0IGhvc3RlbnQgKmhvc3RpbmZvOworCisJCQlob3N0aW5mbyA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikgJmlwYWRkciwgc2l6ZW9mKGlwYWRkciksIEFGX0lORVQpOworCQkJaWYgKCFob3N0aW5mbykgeworCQkJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBob3N0bmFtZSBmb3IgJXMiLCBhcmd2WzBdKTsKKwkJCX0KKwkJCXN0cl90b2xvd2VyKGhvc3RpbmZvLT5oX25hbWUpOworCisJCQlwcmludGYoIkhPU1ROQU1FPSVzXG4iLCBob3N0aW5mby0+aF9uYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lzcnYuYyBiL25ldHdvcmtpbmcvaXNydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjQ5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2lzcnYuYwpAQCAtMCwwICsxLDMzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogR2VuZXJpYyBub24tZm9ya2luZyBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUuCisgKiBJbnRlbmRlZCB0byBtYWtlIHdyaXRpbmcgdGVsbmV0ZC10eXBlIHNlcnZlcnMgZWFzaWVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiaXNydi5oIgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHCisjZGVmaW5lIERQUklOVEYoYXJncy4uLikgYmJfZXJyb3JfbXNnKGFyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRGKGFyZ3MuLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8qIEhlbHBlcnMgKi8KKworLyogT3BhcXVlIHN0cnVjdHVyZSAqLworCitzdHJ1Y3QgaXNydl9zdGF0ZV90IHsKKwlzaG9ydCAgKmZkMnBlZXI7IC8qIG9uZSBwZXIgcmVnaXN0ZXJlZCBmZCAqLworCXZvaWQgICoqcGFyYW1fdGJsOyAvKiBvbmUgcGVyIHJlZ2lzdGVyZWQgcGVlciAqLworCS8qIG9uZSBwZXIgcmVnaXN0ZXJlZCBwZWVyOyBkb2Vzbid0IGV4aXN0IGlmICF0aW1lb3V0ICovCisJdGltZV90ICp0aW1lb190Ymw7CisJaW50ICAgKCpuZXdfcGVlcikoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKTsKKwl0aW1lX3QgIGN1cnRpbWU7CisJaW50ICAgICB0aW1lb3V0OworCWludCAgICAgZmRfY291bnQ7CisJaW50ICAgICBwZWVyX2NvdW50OworCWludCAgICAgd3JfY291bnQ7CisJZmRfc2V0ICByZDsKKwlmZF9zZXQgIHdyOworfTsKKyNkZWZpbmUgRkQyUEVFUiAgICAoc3RhdGUtPmZkMnBlZXIpCisjZGVmaW5lIFBBUkFNX1RCTCAgKHN0YXRlLT5wYXJhbV90YmwpCisjZGVmaW5lIFRJTUVPX1RCTCAgKHN0YXRlLT50aW1lb190YmwpCisjZGVmaW5lIENVUlRJTUUgICAgKHN0YXRlLT5jdXJ0aW1lKQorI2RlZmluZSBUSU1FT1VUICAgIChzdGF0ZS0+dGltZW91dCkKKyNkZWZpbmUgRkRfQ09VTlQgICAoc3RhdGUtPmZkX2NvdW50KQorI2RlZmluZSBQRUVSX0NPVU5UIChzdGF0ZS0+cGVlcl9jb3VudCkKKyNkZWZpbmUgV1JfQ09VTlQgICAoc3RhdGUtPndyX2NvdW50KQorCisvKiBjYWxsYmFjayAqLwordm9pZCBpc3J2X3dhbnRfcmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCUZEX1NFVChmZCwgJnN0YXRlLT5yZCk7Cit9CisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfd2FudF93cihpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJaWYgKCFGRF9JU1NFVChmZCwgJnN0YXRlLT53cikpIHsKKwkJV1JfQ09VTlQrKzsKKwkJRkRfU0VUKGZkLCAmc3RhdGUtPndyKTsKKwl9Cit9CisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfZG9udF93YW50X3JkKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCkKK3sKKwlGRF9DTFIoZmQsICZzdGF0ZS0+cmQpOworfQorCisvKiBjYWxsYmFjayAqLwordm9pZCBpc3J2X2RvbnRfd2FudF93cihpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJaWYgKEZEX0lTU0VUKGZkLCAmc3RhdGUtPndyKSkgeworCQlXUl9DT1VOVC0tOworCQlGRF9DTFIoZmQsICZzdGF0ZS0+d3IpOworCX0KK30KKworLyogY2FsbGJhY2sgKi8KK2ludCBpc3J2X3JlZ2lzdGVyX2ZkKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBwZWVyLCBpbnQgZmQpCit7CisJaW50IG47CisKKwlEUFJJTlRGKCJyZWdpc3Rlcl9mZChwZWVyOiVkLGZkOiVkKSIsIHBlZXIsIGZkKTsKKworCWlmIChGRF9DT1VOVCA+PSBGRF9TRVRTSVpFKSByZXR1cm4gLTE7CisJaWYgKEZEX0NPVU5UIDw9IGZkKSB7CisJCW4gPSBGRF9DT1VOVDsKKwkJRkRfQ09VTlQgPSBmZCArIDE7CisKKwkJRFBSSU5URigicmVnaXN0ZXJfZmQ6IEZEX0NPVU5UICVkIiwgRkRfQ09VTlQpOworCisJCUZEMlBFRVIgPSB4cmVhbGxvYyhGRDJQRUVSLCBGRF9DT1VOVCAqIHNpemVvZihGRDJQRUVSWzBdKSk7CisJCXdoaWxlIChuIDwgZmQpIEZEMlBFRVJbbisrXSA9IC0xOworCX0KKworCURQUklOVEYoInJlZ2lzdGVyX2ZkOiBGRDJQRUVSWyVkXSA9ICVkIiwgZmQsIHBlZXIpOworCisJRkQyUEVFUltmZF0gPSBwZWVyOworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayAqLwordm9pZCBpc3J2X2Nsb3NlX2ZkKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCkKK3sKKwlEUFJJTlRGKCJjbG9zZV9mZCglZCkiLCBmZCk7CisKKwljbG9zZShmZCk7CisJaXNydl9kb250X3dhbnRfcmQoc3RhdGUsIGZkKTsKKwlpZiAoV1JfQ09VTlQpIGlzcnZfZG9udF93YW50X3dyKHN0YXRlLCBmZCk7CisKKwlGRDJQRUVSW2ZkXSA9IC0xOworCWlmIChmZCA9PSBGRF9DT1VOVC0xKSB7CisJCWRvIGZkLS07IHdoaWxlIChmZCA+PSAwICYmIEZEMlBFRVJbZmRdID09IC0xKTsKKwkJRkRfQ09VTlQgPSBmZCArIDE7CisKKwkJRFBSSU5URigiY2xvc2VfZmQ6IEZEX0NPVU5UICVkIiwgRkRfQ09VTlQpOworCisJCUZEMlBFRVIgPSB4cmVhbGxvYyhGRDJQRUVSLCBGRF9DT1VOVCAqIHNpemVvZihGRDJQRUVSWzBdKSk7CisJfQorfQorCisvKiBjYWxsYmFjayAqLworaW50IGlzcnZfcmVnaXN0ZXJfcGVlcihpc3J2X3N0YXRlX3QgKnN0YXRlLCB2b2lkICpwYXJhbSkKK3sKKwlpbnQgbjsKKworCWlmIChQRUVSX0NPVU5UID49IEZEX1NFVFNJWkUpIHJldHVybiAtMTsKKwluID0gUEVFUl9DT1VOVCsrOworCisJRFBSSU5URigicmVnaXN0ZXJfcGVlcjogUEVFUl9DT1VOVCAlZCIsIFBFRVJfQ09VTlQpOworCisJUEFSQU1fVEJMID0geHJlYWxsb2MoUEFSQU1fVEJMLCBQRUVSX0NPVU5UICogc2l6ZW9mKFBBUkFNX1RCTFswXSkpOworCVBBUkFNX1RCTFtuXSA9IHBhcmFtOworCWlmIChUSU1FT1VUKSB7CisJCVRJTUVPX1RCTCA9IHhyZWFsbG9jKFRJTUVPX1RCTCwgUEVFUl9DT1VOVCAqIHNpemVvZihUSU1FT19UQkxbMF0pKTsKKwkJVElNRU9fVEJMW25dID0gQ1VSVElNRTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9wZWVyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBwZWVyKQoreworCWludCBtb3Zlc2l6ZTsKKwlpbnQgZmQ7CisKKwlEUFJJTlRGKCJyZW1vdmVfcGVlciglZCkiLCBwZWVyKTsKKworCWZkID0gRkRfQ09VTlQgLSAxOworCXdoaWxlIChmZCA+PSAwKSB7CisJCWlmIChGRDJQRUVSW2ZkXSA9PSBwZWVyKSB7CisJCQlpc3J2X2Nsb3NlX2ZkKHN0YXRlLCBmZCk7CisJCQlmZC0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKEZEMlBFRVJbZmRdID4gcGVlcikKKwkJCUZEMlBFRVJbZmRdLS07CisJCWZkLS07CisJfQorCisJUEVFUl9DT1VOVC0tOworCURQUklOVEYoInJlbW92ZV9wZWVyOiBQRUVSX0NPVU5UICVkIiwgUEVFUl9DT1VOVCk7CisKKwltb3Zlc2l6ZSA9IChQRUVSX0NPVU5UIC0gcGVlcikgKiBzaXplb2Yodm9pZCopOworCWlmIChtb3Zlc2l6ZSA+IDApIHsKKwkJbWVtY3B5KCZQQVJBTV9UQkxbcGVlcl0sICZQQVJBTV9UQkxbcGVlcisxXSwgbW92ZXNpemUpOworCQlpZiAoVElNRU9VVCkKKwkJCW1lbWNweSgmVElNRU9fVEJMW3BlZXJdLCAmVElNRU9fVEJMW3BlZXIrMV0sIG1vdmVzaXplKTsKKwl9CisJUEFSQU1fVEJMID0geHJlYWxsb2MoUEFSQU1fVEJMLCBQRUVSX0NPVU5UICogc2l6ZW9mKFBBUkFNX1RCTFswXSkpOworCWlmIChUSU1FT1VUKQorCQlUSU1FT19UQkwgPSB4cmVhbGxvYyhUSU1FT19UQkwsIFBFRVJfQ09VTlQgKiBzaXplb2YoVElNRU9fVEJMWzBdKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9hY2NlcHQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCWludCBuLCBuZXdmZDsKKworCS8qIHN1cHByZXNzIGdjYyB3YXJuaW5nICJjYXN0IGZyb20gcHRyIHRvIGludCBvZiBkaWZmZXJlbnQgc2l6ZSIgKi8KKwlmY250bChmZCwgRl9TRVRGTCwgKGludCkocHRyZGlmZl90KShQQVJBTV9UQkxbMF0pIHwgT19OT05CTE9DSyk7CisJbmV3ZmQgPSBhY2NlcHQoZmQsIE5VTEwsIDApOworCWZjbnRsKGZkLCBGX1NFVEZMLCAoaW50KShwdHJkaWZmX3QpKFBBUkFNX1RCTFswXSkpOworCWlmIChuZXdmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVBR0FJTikgcmV0dXJuOworCQkvKiBNb3N0IHByb2JhYmx5IHNvbWVvbmUgZ2F2ZSB1cyB3cm9uZyBmZCB0eXBlCisJCSAqIChmb3IgZXhhbXBsZSwgbm9uLXNvY2tldCkuIERvbid0IHdhbnQKKwkJICogdG8gbG9vcCBmb3JldmVyLiAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFjY2VwdCIpOworCX0KKworCURQUklOVEYoIm5ld19wZWVyKCVkKSIsIG5ld2ZkKTsKKwluID0gc3RhdGUtPm5ld19wZWVyKHN0YXRlLCBuZXdmZCk7CisJaWYgKG4pCisJCXJlbW92ZV9wZWVyKHN0YXRlLCBuKTsgLyogdW5zdWNjZXNmdWwgcGVlciBzdGFydCAqLworfQorCit2b2lkIEJVR19zaXplb2ZfZmRfc2V0X2lzX3N0cmFuZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCBoYW5kbGVfZmRfc2V0KGlzcnZfc3RhdGVfdCAqc3RhdGUsIGZkX3NldCAqZmRzLCBpbnQgKCpoKShpbnQsIHZvaWQgKiopKQoreworCWVudW0geyBMT05HX0NOVCA9IHNpemVvZihmZF9zZXQpIC8gc2l6ZW9mKGxvbmcpIH07CisJaW50IGZkc19wb3M7CisJaW50IGZkLCBwZWVyOworCS8qIG5lZWQgdG8ga25vdyB2YWx1ZSBhdCBfdGhlIGJlZ2lubmluZ18gb2YgdGhpcyByb3V0aW5lICovCisJaW50IGZkX2NudCA9IEZEX0NPVU5UOworCisJaWYgKExPTkdfQ05UICogc2l6ZW9mKGxvbmcpICE9IHNpemVvZihmZF9zZXQpKQorCQlCVUdfc2l6ZW9mX2ZkX3NldF9pc19zdHJhbmdlKCk7CisKKwlmZHNfcG9zID0gMDsKKwl3aGlsZSAoMSkgeworCQkvKiBGaW5kIG5leHQgbm9uemVybyBiaXQgKi8KKwkJd2hpbGUgKGZkc19wb3MgPCBMT05HX0NOVCkgeworCQkJaWYgKCgobG9uZyopZmRzKVtmZHNfcG9zXSA9PSAwKSB7CisJCQkJZmRzX3BvcysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogRm91bmQgbm9uLXplcm8gd29yZCAqLworCQkJZmQgPSBmZHNfcG9zICogc2l6ZW9mKGxvbmcpKjg7IC8qIHdvcmQjIC0+IGJpdCMgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKEZEX0lTU0VUKGZkLCBmZHMpKSB7CisJCQkJCUZEX0NMUihmZCwgZmRzKTsKKwkJCQkJZ290byBmb3VuZF9mZDsKKwkJCQl9CisJCQkJZmQrKzsKKwkJCX0KKwkJfQorCQlicmVhazsgLyogYWxsIHdvcmRzIGFyZSB6ZXJvICovCisgZm91bmRfZmQ6CisJCWlmIChmZCA+PSBmZF9jbnQpIHsgLyogcGFyYW5vaWEgKi8KKwkJCURQUklOVEYoImhhbmRsZV9mZF9zZXQ6IGZkID4gZmRfY250Pz8gKCVkID4gJWQpIiwKKwkJCQkJZmQsIGZkX2NudCk7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRGKCJoYW5kbGVfZmRfc2V0OiBmZCAlZCBpcyBhY3RpdmUiLCBmZCk7CisJCXBlZXIgPSBGRDJQRUVSW2ZkXTsKKwkJaWYgKHBlZXIgPCAwKQorCQkJY29udGludWU7IC8qIHBlZXIgaXMgYWxyZWFkeSBnb25lICovCisJCWlmIChwZWVyID09IDApIHsKKwkJCWhhbmRsZV9hY2NlcHQoc3RhdGUsIGZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCURQUklOVEYoImgoZmQ6JWQpIiwgZmQpOworCQlpZiAoaChmZCwgJlBBUkFNX1RCTFtwZWVyXSkpIHsKKwkJCS8qIHRoaXMgcGVlciBpcyBnb25lICovCisJCQlyZW1vdmVfcGVlcihzdGF0ZSwgcGVlcik7CisJCX0gZWxzZSBpZiAoVElNRU9VVCkgeworCQkJVElNRU9fVEJMW3BlZXJdID0gbW9ub3RvbmljX3NlYygpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfdGltZW91dChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgKCpkb190aW1lb3V0KSh2b2lkICoqKSkKK3sKKwlpbnQgbiwgcGVlcjsKKwlwZWVyID0gUEVFUl9DT1VOVC0xOworCS8qIHBlZXIgMCBpcyBub3QgY2hlY2tlZCAqLworCXdoaWxlIChwZWVyID4gMCkgeworCQlEUFJJTlRGKCJwZWVyICVkOiB0aW1lIGRpZmYgJWQiLCBwZWVyLAorCQkJCShpbnQpKENVUlRJTUUgLSBUSU1FT19UQkxbcGVlcl0pKTsKKwkJaWYgKChDVVJUSU1FIC0gVElNRU9fVEJMW3BlZXJdKSA+PSBUSU1FT1VUKSB7CisJCQlEUFJJTlRGKCJwZWVyICVkOiBkb190aW1lb3V0KCkiLCBwZWVyKTsKKwkJCW4gPSBkb190aW1lb3V0KCZQQVJBTV9UQkxbcGVlcl0pOworCQkJaWYgKG4pCisJCQkJcmVtb3ZlX3BlZXIoc3RhdGUsIHBlZXIpOworCQl9CisJCXBlZXItLTsKKwl9Cit9CisKKy8qIERyaXZlciAqLwordm9pZCBpc3J2X3J1bigKKwlpbnQgbGlzdGVuX2ZkLAorCWludCAoKm5ld19wZWVyKShpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpLAorCWludCAoKmRvX3JkKShpbnQgZmQsIHZvaWQgKiopLAorCWludCAoKmRvX3dyKShpbnQgZmQsIHZvaWQgKiopLAorCWludCAoKmRvX3RpbWVvdXQpKHZvaWQgKiopLAorCWludCB0aW1lb3V0LAorCWludCBsaW5nZXJfdGltZW91dCkKK3sKKwlpc3J2X3N0YXRlX3QgKnN0YXRlID0geHphbGxvYyhzaXplb2YoKnN0YXRlKSk7CisJc3RhdGUtPm5ld19wZWVyID0gbmV3X3BlZXI7CisJc3RhdGUtPnRpbWVvdXQgID0gdGltZW91dDsKKworCS8qIHJlZ2lzdGVyICJwZWVyIiAjMCAtIGl0IHdpbGwgYWNjZXB0IG5ldyBjb25uZWN0aW9ucyAqLworCWlzcnZfcmVnaXN0ZXJfcGVlcihzdGF0ZSwgTlVMTCk7CisJaXNydl9yZWdpc3Rlcl9mZChzdGF0ZSwgLypwZWVyOiovIDAsIGxpc3Rlbl9mZCk7CisJaXNydl93YW50X3JkKHN0YXRlLCBsaXN0ZW5fZmQpOworCS8qIHJlbWVtYmVyIGZsYWdzIHRvIG1ha2UgYmxvY2tpbmc8LT5ub25ibG9ja2luZyBzd2l0Y2ggZmFzdGVyICovCisJLyogKHN1cHByZXNzIGdjYyB3YXJuaW5nICJjYXN0IGZyb20gcHRyIHRvIGludCBvZiBkaWZmZXJlbnQgc2l6ZSIpICovCisJUEFSQU1fVEJMWzBdID0gKHZvaWQqKShwdHJkaWZmX3QpKGZjbnRsKGxpc3Rlbl9mZCwgRl9HRVRGTCkpOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCWZkX3NldCByZDsKKwkJZmRfc2V0IHdyOworCQlmZF9zZXQgKndycCA9IE5VTEw7CisJCWludCBuOworCisJCXR2LnR2X3NlYyA9IHRpbWVvdXQ7CisJCWlmIChQRUVSX0NPVU5UIDw9IDEpCisJCQl0di50dl9zZWMgPSBsaW5nZXJfdGltZW91dDsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXJkID0gc3RhdGUtPnJkOworCQlpZiAoV1JfQ09VTlQpIHsKKwkJCXdyID0gc3RhdGUtPndyOworCQkJd3JwID0gJndyOworCQl9CisKKwkJRFBSSU5URigicnVuOiBzZWxlY3QoRkRfQ09VTlQ6JWQsdGltZW91dDolZCkuLi4iLAorCQkJCUZEX0NPVU5ULCAoaW50KXR2LnR2X3NlYyk7CisJCW4gPSBzZWxlY3QoRkRfQ09VTlQsICZyZCwgd3JwLCBOVUxMLCB0di50dl9zZWMgPyAmdHYgOiBOVUxMKTsKKwkJRFBSSU5URigicnVuOiAuLi5zZWxlY3Q6JWQiLCBuKTsKKworCQlpZiAobiA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQliYl9wZXJyb3JfbXNnKCJzZWxlY3QiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG4gPT0gMCAmJiBsaW5nZXJfdGltZW91dCAmJiBQRUVSX0NPVU5UIDw9IDEpCisJCQlicmVhazsKKworCQlpZiAodGltZW91dCkgeworCQkJdGltZV90IHQgPSBtb25vdG9uaWNfc2VjKCk7CisJCQlpZiAodCAhPSBDVVJUSU1FKSB7CisJCQkJQ1VSVElNRSA9IHQ7CisJCQkJaGFuZGxlX3RpbWVvdXQoc3RhdGUsIGRvX3RpbWVvdXQpOworCQkJfQorCQl9CisJCWlmIChuID4gMCkgeworCQkJaGFuZGxlX2ZkX3NldChzdGF0ZSwgJnJkLCBkb19yZCk7CisJCQlpZiAod3JwKQorCQkJCWhhbmRsZV9mZF9zZXQoc3RhdGUsIHdycCwgZG9fd3IpOworCQl9CisJfQorCURQUklOVEYoInJ1bjogYmFpbG91dCIpOworCS8qIE5COiBhY2NlcHQgc29ja2V0IGlzIG5vdCBjbG9zZWQuIENhbGxlciBpcyB0byBkZWNpZGUgd2hhdCB0byBkbyAqLworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9pc3J2LmggYi9uZXR3b3JraW5nL2lzcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdlMDFkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pc3J2LmgKQEAgLTAsMCArMSwzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogR2VuZXJpYyBub24tZm9ya2luZyBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUuCisgKiBJbnRlbmRlZCB0byBtYWtlIHdyaXRpbmcgdGVsbmV0ZC10eXBlIHNlcnZlcnMgZWFzaWVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIG9wYXF1ZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpc3J2X3N0YXRlX3Q7Cit0eXBlZGVmIHN0cnVjdCBpc3J2X3N0YXRlX3QgaXNydl9zdGF0ZV90OworCisvKiBjYWxsYmFja3MgKi8KK3ZvaWQgaXNydl93YW50X3JkKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7Cit2b2lkIGlzcnZfd2FudF93cihpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOwordm9pZCBpc3J2X2RvbnRfd2FudF9yZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOwordm9pZCBpc3J2X2RvbnRfd2FudF93cihpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOworaW50IGlzcnZfcmVnaXN0ZXJfZmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IHBlZXIsIGludCBmZCk7Cit2b2lkIGlzcnZfY2xvc2VfZmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKTsKK2ludCBpc3J2X3JlZ2lzdGVyX3BlZXIoaXNydl9zdGF0ZV90ICpzdGF0ZSwgdm9pZCAqcGFyYW0pOworCisvKiBkcml2ZXIgKi8KK3ZvaWQgaXNydl9ydW4oCisJaW50IGxpc3Rlbl9mZCwKKwlpbnQgKCpuZXdfcGVlcikoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKSwKKwlpbnQgKCpkb19yZCkoaW50IGZkLCB2b2lkICoqKSwKKwlpbnQgKCpkb193cikoaW50IGZkLCB2b2lkICoqKSwKKwlpbnQgKCpkb190aW1lb3V0KSh2b2lkICoqKSwKKwlpbnQgdGltZW91dCwKKwlpbnQgbGluZ2VyX3RpbWVvdXQKKyk7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lzcnZfaWRlbnRkLmMgYi9uZXR3b3JraW5nL2lzcnZfaWRlbnRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxNDA1YwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaXNydl9pZGVudGQuYwpAQCAtMCwwICsxLDE1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogRmFrZSBpZGVudGQgc2VydmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZha2VpZGVudGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZml3XSBbLWIgQUREUl0gW1NUUklOR10iCisvL3VzYWdlOiNkZWZpbmUgZmFrZWlkZW50ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByb3ZpZGUgZmFrZSBpZGVudCAoYXV0aCkgc2VydmljZVxuIgorLy91c2FnZTogICAgICJcbgktZglSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSW5ldGQgbW9kZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJSW5ldGQgJ3dhaXQnIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1iIEFERFIJQmluZCB0byBzcGVjaWZpZWQgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JU1RSSU5HCUlkZW50IGFuc3dlciBzdHJpbmcgKGRlZmF1bHQ6IG5vYm9keSkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgImlzcnYuaCIKKworZW51bSB7IFRJTUVPVVQgPSAyMCB9OworCit0eXBlZGVmIHN0cnVjdCBpZGVudGRfYnVmX3QgeworCWludCBwb3M7CisJaW50IGZkX2ZsYWc7CisJY2hhciBidWZbNjQgLSAyKnNpemVvZihpbnQpXTsKK30gaWRlbnRkX2J1Zl90OworCisjZGVmaW5lIGJvZ291c2VyIGJiX2NvbW1vbl9idWZzaXoxCisKK3N0YXRpYyBpbnQgbmV3X3BlZXIoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCWludCBwZWVyOworCWlkZW50ZF9idWZfdCAqYnVmID0geHphbGxvYyhzaXplb2YoKmJ1ZikpOworCisJcGVlciA9IGlzcnZfcmVnaXN0ZXJfcGVlcihzdGF0ZSwgYnVmKTsKKwlpZiAocGVlciA8IDApCisJCXJldHVybiAwOyAvKiBmYWlsdXJlICovCisJaWYgKGlzcnZfcmVnaXN0ZXJfZmQoc3RhdGUsIHBlZXIsIGZkKSA8IDApCisJCXJldHVybiBwZWVyOyAvKiBmYWlsdXJlLCB1bnJlZ2lzdGVyIHBlZXIgKi8KKworCWJ1Zi0+ZmRfZmxhZyA9IGZjbnRsKGZkLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0s7CisJaXNydl93YW50X3JkKHN0YXRlLCBmZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmQoaW50IGZkLCB2b2lkICoqcGFyYW1wKQoreworCWlkZW50ZF9idWZfdCAqYnVmID0gKnBhcmFtcDsKKwljaGFyICpjdXIsICpwOworCWludCByZXR2YWwgPSAwOyAvKiBzZXNzaW9uIGlzIG9rIChzbyBmYXIpICovCisJaW50IHN6OworCisJY3VyID0gYnVmLT5idWYgKyBidWYtPnBvczsKKworCWlmIChidWYtPmZkX2ZsYWcgJiBPX05PTkJMT0NLKQorCQlmY250bChmZCwgRl9TRVRGTCwgYnVmLT5mZF9mbGFnKTsKKwlzeiA9IHNhZmVfcmVhZChmZCwgY3VyLCBzaXplb2YoYnVmLT5idWYpIC0gYnVmLT5wb3MpOworCisJaWYgKHN6IDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJZ290byB0ZXJtOyAvKiB0ZXJtaW5hdGUgdGhpcyBzZXNzaW9uIGlmICFFQUdBSU4gKi8KKwkJZ290byBvazsKKwl9CisKKwlidWYtPnBvcyArPSBzejsKKwlidWYtPmJ1ZltidWYtPnBvc10gPSAnXDAnOworCXAgPSBzdHJwYnJrKGN1ciwgIlxyXG4iKTsKKwlpZiAocCkKKwkJKnAgPSAnXDAnOworCWlmICghcCAmJiBzeiAmJiBidWYtPnBvcyA8PSAoaW50KXNpemVvZihidWYtPmJ1ZikpCisJCWdvdG8gb2s7CisJLyogVGVybWluYXRlIHNlc3Npb24uIElmIHdlIGFyZSBpbiBzZXJ2ZXIgbW9kZSwgdGhlbgorCSAqIGZkIGlzIHN0aWxsIGluIG5vbmJsb2NraW5nIG1vZGUgLSB3ZSBuZXZlciBibG9jayBoZXJlICovCisJaWYgKGZkID09IDApIGZkKys7IC8qIGluZXRkIG1vZGU/IHRoZW4gd3JpdGUgdG8gZmQgMSAqLworCWZkcHJpbnRmKGZkLCAiJXMgOiBVU0VSSUQgOiBVTklYIDogJXNcclxuIiwgYnVmLT5idWYsIGJvZ291c2VyKTsKKyB0ZXJtOgorCWZyZWUoYnVmKTsKKwlyZXR2YWwgPSAxOyAvKiB0ZXJtaW5hdGUgKi8KKyBvazoKKwlpZiAoYnVmLT5mZF9mbGFnICYgT19OT05CTE9DSykKKwkJZmNudGwoZmQsIEZfU0VURkwsIGJ1Zi0+ZmRfZmxhZyAmIH5PX05PTkJMT0NLKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGRvX3RpbWVvdXQodm9pZCAqKnBhcmFtcCBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDE7IC8qIHRlcm1pbmF0ZSBzZXNzaW9uICovCit9CisKK3N0YXRpYyB2b2lkIGluZXRkX21vZGUodm9pZCkKK3sKKwlpZGVudGRfYnVmX3QgKmJ1ZiA9IHh6YWxsb2Moc2l6ZW9mKCpidWYpKTsKKwkvKiBidWYtPnBvcyA9IDA7IC0geHphbGxvYyBkaWQgaXQgKi8KKwkvKiBXZSBkbyBOT1Qgd2FudCBub25ibG9ja2luZyBJL08gaGVyZSEgKi8KKwkvKiBidWYtPmZkX2ZsYWcgPSAwOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJZG8KKwkJYWxhcm0oVElNRU9VVCk7CisJd2hpbGUgKGRvX3JkKDAsICh2b2lkKikmYnVmKSA9PSAwKTsKK30KKworaW50IGZha2VpZGVudGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZha2VpZGVudGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfZm9yZWdyb3VuZCA9IDB4MSwKKwkJT1BUX2luZXRkICAgICAgPSAweDIsCisJCU9QVF9pbmV0ZHdhaXQgID0gMHg0LAorCQlPUFRfZml3ICAgICAgICA9IDB4NywKKwkJT1BUX2JpbmRhZGRyICAgPSAweDgsCisJfTsKKworCWNvbnN0IGNoYXIgKmJpbmRfYWRkcmVzcyA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWludCBmZDsKKworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmaXdiOiIsICZiaW5kX2FkZHJlc3MpOworCXN0cmNweShib2dvdXNlciwgIm5vYm9keSIpOworCWlmIChhcmd2W29wdGluZF0pCisJCXN0cm5jcHkoYm9nb3VzZXIsIGFyZ3Zbb3B0aW5kXSwgc2l6ZW9mKGJvZ291c2VyKSk7CisKKwkvKiBEYWVtb25pemUgaWYgbm8gLWYgYW5kIG5vIC1pIGFuZCBubyAtdyAqLworCWlmICghKG9wdCAmIE9QVF9maXcpKQorCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoMCwgYXJndik7CisKKwkvKiBXaGVyZSB0byBsb2cgaW4gaW5ldGQgbW9kZXM/ICJDbGFzc2ljIiBpbmV0ZAorCSAqIHByb2JhYmx5IGhhcyBpdHMgc3RkZXJyIC9kZXYvbnVsbCdlZCAod2UgbmVlZCBsb2cgdG8gc3lzbG9nPyksCisJICogYnV0IGRhZW1vbnRvb2xzLWxpa2UgdXRpbGl0aWVzIHVzdWFsbHkgZXhwZWN0IHRoYXQgY2hpbGRyZW4KKwkgKiBsb2cgdG8gc3RkZXJyLiBJIGxpa2UgZGFlbW9udG9vbHMgbW9yZS4gR28gdGhlaXIgd2F5LgorCSAqIChPciBtYXliZSB3ZSBuZWVkIHlldCBhbm90aGVyIG9wdGlvbiAibG9nIHRvIHN5c2xvZyIpICovCisJaWYgKCEob3B0ICYgT1BUX2ZpdykgLyogfHwgKG9wdCAmIE9QVF9zeXNsb2cpICovKSB7CisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19EQUVNT04pOworCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJaWYgKG9wdCAmIE9QVF9pbmV0ZCkgeworCQlpbmV0ZF9tb2RlKCk7CisJCXJldHVybiAwOworCX0KKworCS8qIElnbm9yZSBjbG9zZWQgY29ubmVjdGlvbnMgd2hlbiB3cml0aW5nICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJZmQgPSAwOworCWlmICghKG9wdCAmIE9QVF9pbmV0ZHdhaXQpKSB7CisJCWZkID0gY3JlYXRlX2FuZF9iaW5kX3N0cmVhbV9vcl9kaWUoYmluZF9hZGRyZXNzLAorCQkJCWJiX2xvb2t1cF9wb3J0KCJpZGVudGQiLCAidGNwIiwgMTEzKSk7CisJCXhsaXN0ZW4oZmQsIDUpOworCX0KKworCWlzcnZfcnVuKGZkLCBuZXdfcGVlciwgZG9fcmQsIC8qZG9fd3I6Ki8gTlVMTCwgZG9fdGltZW91dCwKKwkJCVRJTUVPVVQsIChvcHQgJiBPUFRfaW5ldGR3YWl0KSA/IFRJTUVPVVQgOiAwKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9LYnVpbGQuc3JjIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3OGYzYwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNjYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorIworCitsaWIteTo9CisKK0lOU0VSVAorCitsaWItJChDT05GSUdfU0xBVFRBQ0gpICs9IFwKKwl1dGlscy5vCisKK2xpYi0kKENPTkZJR19JUCkgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWxpYm5ldGxpbmsubyBcCisJbGxfYWRkci5vIFwKKwlsbF9tYXAubyBcCisJbGxfcHJvdG8ubyBcCisJbGxfdHlwZXMubyBcCisJcnRfbmFtZXMubyBcCisJcnRtX21hcC5vIFwKKwl1dGlscy5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MpICs9IFwKKwlpcF9wYXJzZV9jb21tb25fYXJncy5vIFwKKwlpcGFkZHJlc3MubyBcCisJbGlibmV0bGluay5vIFwKKwlsbF9hZGRyLm8gXAorCWxsX21hcC5vIFwKKwlsbF90eXBlcy5vIFwKKwlydF9uYW1lcy5vIFwKKwl1dGlscy5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX0lQX0xJTkspICs9IFwKKwlpcF9wYXJzZV9jb21tb25fYXJncy5vIFwKKwlpcGFkZHJlc3MubyBcCisJaXBsaW5rLm8gXAorCWxpYm5ldGxpbmsubyBcCisJbGxfYWRkci5vIFwKKwlsbF9tYXAubyBcCisJbGxfdHlwZXMubyBcCisJcnRfbmFtZXMubyBcCisJdXRpbHMubworCitsaWItJChDT05GSUdfRkVBVFVSRV9JUF9ST1VURSkgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwcm91dGUubyBcCisJbGlibmV0bGluay5vIFwKKwlsbF9tYXAubyBcCisJcnRfbmFtZXMubyBcCisJcnRtX21hcC5vIFwKKwl1dGlscy5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX0lQX1RVTk5FTCkgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwdHVubmVsLm8gXAorCXJ0X25hbWVzLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSkgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwcnVsZS5vIFwKKwlydF9uYW1lcy5vIFwKKwl1dGlscy5vCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBfY29tbW9uLmggYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjN2U1OQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9jb21tb24uaApAQCAtMCwwICsxLDM2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgSVBfQ09NTU9OX0gKKyNkZWZpbmUgSVBfQ09NTU9OX0ggMQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaWYgIWRlZmluZWQgSUZBX1JUQQorI2luY2x1ZGUgPGxpbnV4L2lmX2FkZHIuaD4KKyNlbmRpZgorI2lmICFkZWZpbmVkIElGTEFfUlRBCisjaW5jbHVkZSA8bGludXgvaWZfbGluay5oPgorI2VuZGlmCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitjaGFyIEZBU1RfRlVOQyAqKmlwX3BhcnNlX2NvbW1vbl9hcmdzKGNoYXIgKiphcmd2KTsKKy8vaW50IEZBU1RfRlVOQyBwcmludF9uZWlnaChzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpOworaW50IEZBU1RfRlVOQyBpcGFkZHJfbGlzdF9vcl9mbHVzaChjaGFyICoqYXJndiwgaW50IGZsdXNoKTsKKy8vaW50IEZBU1RfRlVOQyBpcHJvdXRlX21vbml0b3IoY2hhciAqKmFyZ3YpOworLy92b2lkIEZBU1RfRlVOQyBpcG5laWdoX3Jlc2V0X2ZpbHRlcih2b2lkKTsKKworaW50IEZBU1RfRlVOQyBkb19pcGFkZHIoY2hhciAqKmFyZ3YpOworaW50IEZBU1RfRlVOQyBkb19pcHJvdXRlKGNoYXIgKiphcmd2KTsKK2ludCBGQVNUX0ZVTkMgZG9faXBydWxlKGNoYXIgKiphcmd2KTsKKy8vaW50IEZBU1RfRlVOQyBkb19pcG5laWdoKGNoYXIgKiphcmd2KTsKK2ludCBGQVNUX0ZVTkMgZG9faXB0dW5uZWwoY2hhciAqKmFyZ3YpOworaW50IEZBU1RfRlVOQyBkb19pcGxpbmsoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIGRvX2lwbW9uaXRvcihjaGFyICoqYXJndik7CisvL2ludCBGQVNUX0ZVTkMgZG9fbXVsdGlhZGRyKGNoYXIgKiphcmd2KTsKKy8vaW50IEZBU1RfRlVOQyBkb19tdWx0aXJvdXRlKGNoYXIgKiphcmd2KTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBfcGFyc2VfY29tbW9uX2FyZ3MuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9wYXJzZV9jb21tb25fYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Yzc1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBfcGFyc2VfY29tbW9uX2FyZ3MuYwpAQCAtMCwwICsxLDgxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5Mjk6IHJlc29sdmUgYWRkcmVzc2VzCisgKi8KKworI2luY2x1ZGUgImlwX2NvbW1vbi5oIiAgLyogI2luY2x1ZGUgImxpYmJiLmgiIGlzIGluc2lkZSAqLworI2luY2x1ZGUgInV0aWxzLmgiCisKK2ZhbWlseV90IHByZWZlcnJlZF9mYW1pbHkgPSBBRl9VTlNQRUM7CitzbWFsbGludCBvbmVsaW5lOworY2hhciBfU0xfOworCitjaGFyKiogRkFTVF9GVU5DIGlwX3BhcnNlX2NvbW1vbl9hcmdzKGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGlwX2NvbW1vbl9jb21tYW5kc1tdIEFMSUdOMSA9CisJCSJvbmVsaW5lIiAiXDAiCisJCSJmYW1pbHkiICJcMCIKKwkJIjQiICJcMCIKKwkJIjYiICJcMCIKKwkJIjAiICJcMCIKKwkJOworCWVudW0geworCQlBUkdfb25lbGluZSwKKwkJQVJHX2ZhbWlseSwKKwkJQVJHX0lQdjQsCisJCUFSR19JUHY2LAorCQlBUkdfcGFja2V0LAorCX07CisJc3RhdGljIGNvbnN0IGZhbWlseV90IGFmX251bWJlcnNbXSA9IHsgQUZfSU5FVCwgQUZfSU5FVDYsIEFGX1BBQ0tFVCB9OworCWludCBhcmc7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJY2hhciAqb3B0ID0gKmFyZ3Y7CisKKwkJaWYgKG9wdFswXSAhPSAnLScpCisJCQlicmVhazsKKwkJb3B0Kys7CisJCWlmIChvcHRbMF0gPT0gJy0nKSB7CisJCQlvcHQrKzsKKwkJCWlmICghb3B0WzBdKSB7IC8qICItLSIgKi8KKwkJCQlhcmd2Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhpcF9jb21tb25fY29tbWFuZHMsIG9wdCk7CisJCWlmIChhcmcgPCAwKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoYXJnID09IEFSR19vbmVsaW5lKSB7CisJCQlvbmVsaW5lID0gMTsKKwkJCWFyZ3YrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChhcmcgPT0gQVJHX2ZhbWlseSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgZmFtaWxpZXNbXSBBTElHTjEgPQorCQkJCSJpbmV0IiAiXDAiICJpbmV0NiIgIlwwIiAibGluayIgIlwwIjsKKwkJCWFyZ3YrKzsKKwkJCWlmICghKmFyZ3YpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJYXJnID0gaW5kZXhfaW5fc3RyaW5ncyhmYW1pbGllcywgKmFyZ3YpOworCQkJaWYgKGFyZyA8IDApCisJCQkJaW52YXJnKCphcmd2LCAicHJvdG9jb2wgZmFtaWx5Iik7CisJCQkvKiBub3cgYXJnID09IDAsIDEgb3IgMiAqLworCQl9IGVsc2UgeworCQkJYXJnIC09IEFSR19JUHY0OworCQkJLyogbm93IGFyZyA9PSAwLCAxIG9yIDIgKi8KKwkJfQorCQlwcmVmZXJyZWRfZmFtaWx5ID0gYWZfbnVtYmVyc1thcmddOworCQlhcmd2Kys7CisJfQorCV9TTF8gPSBvbmVsaW5lID8gJ1xcJyA6ICdcbic7CisJcmV0dXJuIGFyZ3Y7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBhZGRyZXNzLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBhZGRyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3NDhlOAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGFkZHJlc3MuYwpAQCAtMCwwICsxLDc2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogQ2hhbmdlczoKKyAqIExhc3psbyBWYWxrbyA8dmFsa29AbGludXgua2FyaW50aHkuaHU+IDk5MDIyMzogYWRkcmVzcyBsYWJlbCBtdXN0IGJlIHplcm8gdGVybWluYXRlZAorICovCisKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWZuZGVmIElGRl9MT1dFUl9VUAorLyogZnJvbSBsaW51eC9pZi5oICovCisjZGVmaW5lIElGRl9MT1dFUl9VUCAgMHgxMDAwMCAgLyogZHJpdmVyIHNpZ25hbHMgTDEgdXAgKi8KKyNlbmRpZgorCitzdHJ1Y3QgZmlsdGVyX3QgeworCWNoYXIgKmxhYmVsOworCWNoYXIgKmZsdXNoYjsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aDsKKwlpbnQgc2NvcGUsIHNjb3BlbWFzazsKKwlpbnQgZmxhZ3MsIGZsYWdtYXNrOworCWludCBmbHVzaHA7CisJaW50IGZsdXNoZTsKKwlpbnQgaWZpbmRleDsKKwlmYW1pbHlfdCBmYW1pbHk7CisJc21hbGxpbnQgc2hvd3F1ZXVlOworCXNtYWxsaW50IG9uZWxpbmU7CisJc21hbGxpbnQgdXA7CisJc21hbGxpbnQgZmx1c2hlZDsKKwlpbmV0X3ByZWZpeCBwZng7Cit9IEZJWF9BTElBU0lORzsKK3R5cGVkZWYgc3RydWN0IGZpbHRlcl90IGZpbHRlcl90OworCisjZGVmaW5lIEdfZmlsdGVyICgqKGZpbHRlcl90KikmYmJfY29tbW9uX2J1ZnNpejEpCisKKworc3RhdGljIHZvaWQgcHJpbnRfbGlua19mbGFncyh1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgbWRvd24pCit7CisJc3RhdGljIGNvbnN0IGludCBmbGFnX21hc2tzW10gPSB7CisJCUlGRl9MT09QQkFDSywgSUZGX0JST0FEQ0FTVCwgSUZGX1BPSU5UT1BPSU5ULAorCQlJRkZfTVVMVElDQVNULCBJRkZfTk9BUlAsIElGRl9VUCwgSUZGX0xPV0VSX1VQIH07CisJc3RhdGljIGNvbnN0IGNoYXIgZmxhZ19sYWJlbHNbXSBBTElHTjEgPQorCQkiTE9PUEJBQ0tcMCIiQlJPQURDQVNUXDAiIlBPSU5UT1BPSU5UXDAiCisJCSJNVUxUSUNBU1RcMCIiTk9BUlBcMCIiVVBcMCIiTE9XRVJfVVBcMCI7CisKKwliYl9wdXRjaGFyKCc8Jyk7CisJaWYgKGZsYWdzICYgSUZGX1VQICYmICEoZmxhZ3MgJiBJRkZfUlVOTklORykpCisJCXByaW50ZigiTk8tQ0FSUklFUiwiKTsKKwlmbGFncyAmPSB+SUZGX1JVTk5JTkc7CisjaWYgMAorCV9QRihBTExNVUxUSSk7CisJX1BGKFBST01JU0MpOworCV9QRihNQVNURVIpOworCV9QRihTTEFWRSk7CisJX1BGKERFQlVHKTsKKwlfUEYoRFlOQU1JQyk7CisJX1BGKEFVVE9NRURJQSk7CisJX1BGKFBPUlRTRUwpOworCV9QRihOT1RSQUlMRVJTKTsKKyNlbmRpZgorCWZsYWdzID0gcHJpbnRfZmxhZ3Nfc2VwYXJhdGVkKGZsYWdfbWFza3MsIGZsYWdfbGFiZWxzLCBmbGFncywgIiwiKTsKKwlpZiAoZmxhZ3MpCisJCXByaW50ZigiJXgiLCBmbGFncyk7CisJaWYgKG1kb3duKQorCQlwcmludGYoIixNLURPV04iKTsKKwlwcmludGYoIj4gIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3F1ZXVlbGVuKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgczsKKworCXMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCWlmIChzIDwgMCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgbmFtZSk7CisJaWYgKGlvY3RsX29yX3dhcm4ocywgU0lPQ0dJRlRYUUxFTiwgJmlmcikgPCAwKSB7CisJCWNsb3NlKHMpOworCQlyZXR1cm47CisJfQorCWNsb3NlKHMpOworCisJaWYgKGlmci5pZnJfcWxlbikKKwkJcHJpbnRmKCJxbGVuICVkIiwgaWZyLmlmcl9xbGVuKTsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCBwcmludF9saW5raW5mbyhjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQShuKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltJRkxBX01BWCsxXTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0xJTksgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMTElOSykKKwkJcmV0dXJuIDA7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqaWZpKSk7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChHX2ZpbHRlci5pZmluZGV4ICYmIGlmaS0+aWZpX2luZGV4ICE9IEdfZmlsdGVyLmlmaW5kZXgpCisJCXJldHVybiAwOworCWlmIChHX2ZpbHRlci51cCAmJiAhKGlmaS0+aWZpX2ZsYWdzICYgSUZGX1VQKSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQodGIsIDAsIHNpemVvZih0YikpOworCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksIGxlbik7CisJaWYgKHRiW0lGTEFfSUZOQU1FXSA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZygibmlsIGlmbmFtZSIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChHX2ZpbHRlci5sYWJlbAorCSAmJiAoIUdfZmlsdGVyLmZhbWlseSB8fCBHX2ZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKQorCSAmJiBmbm1hdGNoKEdfZmlsdGVyLmxhYmVsLCBSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pLCAwKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMTElOSykKKwkJcHJpbnRmKCJEZWxldGVkICIpOworCisJcHJpbnRmKCIlZDogJXMiLCBpZmktPmlmaV9pbmRleCwKKwkJLyp0YltJRkxBX0lGTkFNRV0gPyAoY2hhciopUlRBX0RBVEEodGJbSUZMQV9JRk5BTUVdKSA6ICI8bmlsPiIgLSB3ZSBjaGVja2VkIHRiW0lGTEFfSUZOQU1FXSBhYm92ZSovCisJCShjaGFyKilSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pCisJKTsKKworCXsKKwkJdW5zaWduZWQgbV9mbGFnID0gMDsKKwkJaWYgKHRiW0lGTEFfTElOS10pIHsKKwkJCVNQUklOVF9CVUYoYjEpOworCQkJaW50IGlmbGluayA9ICooaW50KilSVEFfREFUQSh0YltJRkxBX0xJTktdKTsKKwkJCWlmIChpZmxpbmsgPT0gMCkKKwkJCQlwcmludGYoIkBOT05FOiAiKTsKKwkJCWVsc2UgeworCQkJCXByaW50ZigiQCVzOiAiLCBsbF9pZHhfbjJhKGlmbGluaywgYjEpKTsKKwkJCQltX2ZsYWcgPSBsbF9pbmRleF90b19mbGFncyhpZmxpbmspOworCQkJCW1fZmxhZyA9ICEobV9mbGFnICYgSUZGX1VQKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiOiAiKTsKKwkJfQorCQlwcmludF9saW5rX2ZsYWdzKGlmaS0+aWZpX2ZsYWdzLCBtX2ZsYWcpOworCX0KKworCWlmICh0YltJRkxBX01UVV0pCisJCXByaW50ZigibXR1ICV1ICIsICooaW50KilSVEFfREFUQSh0YltJRkxBX01UVV0pKTsKKwlpZiAodGJbSUZMQV9RRElTQ10pCisJCXByaW50ZigicWRpc2MgJXMgIiwgKGNoYXIqKVJUQV9EQVRBKHRiW0lGTEFfUURJU0NdKSk7CisjaWZkZWYgSUZMQV9NQVNURVIKKwlpZiAodGJbSUZMQV9NQVNURVJdKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlwcmludGYoIm1hc3RlciAlcyAiLCBsbF9pZHhfbjJhKCooaW50KilSVEFfREFUQSh0YltJRkxBX01BU1RFUl0pLCBiMSkpOworCX0KKyNlbmRpZgorLyogSUZMQV9PUEVSU1RBVEUgd2FzIGFkZGVkIHRvIGtlcm5lbCB3aXRoIHRoZSBzYW1lIGNvbW1pdCBhcyBJRkZfRE9STUFOVCAqLworI2lmZGVmIElGRl9ET1JNQU5UCisJaWYgKHRiW0lGTEFfT1BFUlNUQVRFXSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBvcGVyc3RhdGVfbGFiZWxzW10gQUxJR04xID0KKwkJCSJVTktOT1dOXDAiIk5PVFBSRVNFTlRcMCIiRE9XTlwwIiJMT1dFUkxBWUVSRE9XTlwwIgorCQkJIlRFU1RJTkdcMCIiRE9STUFOVFwwIiJVUFwwIjsKKwkJcHJpbnRmKCJzdGF0ZSAlcyAiLCBudGhfc3RyaW5nKG9wZXJzdGF0ZV9sYWJlbHMsCisJCQkJCSoodWludDhfdCAqKVJUQV9EQVRBKHRiW0lGTEFfT1BFUlNUQVRFXSkpKTsKKwl9CisjZW5kaWYKKwlpZiAoR19maWx0ZXIuc2hvd3F1ZXVlKQorCQlwcmludF9xdWV1ZWxlbigoY2hhciopUlRBX0RBVEEodGJbSUZMQV9JRk5BTUVdKSk7CisKKwlpZiAoIUdfZmlsdGVyLmZhbWlseSB8fCBHX2ZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlwcmludGYoIiVjICAgIGxpbmsvJXMgIiwgX1NMXywgbGxfdHlwZV9uMmEoaWZpLT5pZmlfdHlwZSwgYjEpKTsKKworCQlpZiAodGJbSUZMQV9BRERSRVNTXSkgeworCQkJZnB1dHMobGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9BRERSRVNTXSksCisJCQkJCQkgICAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0FERFJFU1NdKSwKKwkJCQkJCSAgICAgIGlmaS0+aWZpX3R5cGUsCisJCQkJCQkgICAgICBiMSwgc2l6ZW9mKGIxKSksIHN0ZG91dCk7CisJCX0KKwkJaWYgKHRiW0lGTEFfQlJPQURDQVNUXSkgeworCQkJaWYgKGlmaS0+aWZpX2ZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKQorCQkJCXByaW50ZigiIHBlZXIgIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIgYnJkICIpOworCQkJZnB1dHMobGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9CUk9BRENBU1RdKSwKKwkJCQkJCSAgICAgIFJUQV9QQVlMT0FEKHRiW0lGTEFfQlJPQURDQVNUXSksCisJCQkJCQkgICAgICBpZmktPmlmaV90eXBlLAorCQkJCQkJICAgICAgYjEsIHNpemVvZihiMSkpLCBzdGRvdXQpOworCQl9CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJLypmZmx1c2hfYWxsKCk7Ki8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbHVzaF91cGRhdGUodm9pZCkKK3sKKwlpZiAocnRubF9zZW5kKEdfZmlsdGVyLnJ0aCwgR19maWx0ZXIuZmx1c2hiLCBHX2ZpbHRlci5mbHVzaHApIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZW5kIGZsdXNoIHJlcXVlc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlHX2ZpbHRlci5mbHVzaHAgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcmludF9hZGRyaW5mbyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHJ0YV90YltJRkFfTUFYKzFdOworCWNoYXIgYWJ1ZlsyNTZdOworCVNQUklOVF9CVUYoYjEpOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0FERFIgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMQUREUikKKwkJcmV0dXJuIDA7CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKmlmYSkpOworCWlmIChsZW4gPCAwKSB7CisJCWJiX2Vycm9yX21zZygid3Jvbmcgbmxtc2cgbGVuICVkIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChHX2ZpbHRlci5mbHVzaGIgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXQUREUikKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQocnRhX3RiLCAwLCBzaXplb2YocnRhX3RiKSk7CisJcGFyc2VfcnRhdHRyKHJ0YV90YiwgSUZBX01BWCwgSUZBX1JUQShpZmEpLCBuLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmEpKSk7CisKKwlpZiAoIXJ0YV90YltJRkFfTE9DQUxdKQorCQlydGFfdGJbSUZBX0xPQ0FMXSA9IHJ0YV90YltJRkFfQUREUkVTU107CisJaWYgKCFydGFfdGJbSUZBX0FERFJFU1NdKQorCQlydGFfdGJbSUZBX0FERFJFU1NdID0gcnRhX3RiW0lGQV9MT0NBTF07CisKKwlpZiAoR19maWx0ZXIuaWZpbmRleCAmJiBHX2ZpbHRlci5pZmluZGV4ICE9IGlmYS0+aWZhX2luZGV4KQorCQlyZXR1cm4gMDsKKwlpZiAoKEdfZmlsdGVyLnNjb3BlIF4gaWZhLT5pZmFfc2NvcGUpICYgR19maWx0ZXIuc2NvcGVtYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoKEdfZmlsdGVyLmZsYWdzIF4gaWZhLT5pZmFfZmxhZ3MpICYgR19maWx0ZXIuZmxhZ21hc2spCisJCXJldHVybiAwOworCWlmIChHX2ZpbHRlci5sYWJlbCkgeworCQljb25zdCBjaGFyICpsYWJlbDsKKwkJaWYgKHJ0YV90YltJRkFfTEFCRUxdKQorCQkJbGFiZWwgPSBSVEFfREFUQShydGFfdGJbSUZBX0xBQkVMXSk7CisJCWVsc2UKKwkJCWxhYmVsID0gbGxfaWR4X24yYShpZmEtPmlmYV9pbmRleCwgYjEpOworCQlpZiAoZm5tYXRjaChHX2ZpbHRlci5sYWJlbCwgbGFiZWwsIDApICE9IDApCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLnBmeC5mYW1pbHkpIHsKKwkJaWYgKHJ0YV90YltJRkFfTE9DQUxdKSB7CisJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOworCQkJZHN0LmZhbWlseSA9IGlmYS0+aWZhX2ZhbWlseTsKKwkJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwgUlRBX1BBWUxPQUQocnRhX3RiW0lGQV9MT0NBTF0pKTsKKwkJCWlmIChpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJkdfZmlsdGVyLnBmeCwgR19maWx0ZXIucGZ4LmJpdGxlbikpCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoR19maWx0ZXIuZmx1c2hiKSB7CisJCXN0cnVjdCBubG1zZ2hkciAqZm47CisJCWlmIChOTE1TR19BTElHTihHX2ZpbHRlci5mbHVzaHApICsgbi0+bmxtc2dfbGVuID4gR19maWx0ZXIuZmx1c2hlKSB7CisJCQlpZiAoZmx1c2hfdXBkYXRlKCkpCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWZuID0gKHN0cnVjdCBubG1zZ2hkciopKEdfZmlsdGVyLmZsdXNoYiArIE5MTVNHX0FMSUdOKEdfZmlsdGVyLmZsdXNocCkpOworCQltZW1jcHkoZm4sIG4sIG4tPm5sbXNnX2xlbik7CisJCWZuLT5ubG1zZ190eXBlID0gUlRNX0RFTEFERFI7CisJCWZuLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJCWZuLT5ubG1zZ19zZXEgPSArK0dfZmlsdGVyLnJ0aC0+c2VxOworCQlHX2ZpbHRlci5mbHVzaHAgPSAoKChjaGFyKilmbikgKyBuLT5ubG1zZ19sZW4pIC0gR19maWx0ZXIuZmx1c2hiOworCQlHX2ZpbHRlci5mbHVzaGVkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTEFERFIpCisJCXByaW50ZigiRGVsZXRlZCAiKTsKKworCWlmIChHX2ZpbHRlci5vbmVsaW5lKQorCQlwcmludGYoIiV1OiAlcyIsIGlmYS0+aWZhX2luZGV4LCBsbF9pbmRleF90b19uYW1lKGlmYS0+aWZhX2luZGV4KSk7CisJaWYgKGlmYS0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlwcmludGYoIiAgICBpbmV0ICIpOworCWVsc2UgaWYgKGlmYS0+aWZhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJcHJpbnRmKCIgICAgaW5ldDYgIik7CisJZWxzZQorCQlwcmludGYoIiAgICBmYW1pbHkgJWQgIiwgaWZhLT5pZmFfZmFtaWx5KTsKKworCWlmIChydGFfdGJbSUZBX0xPQ0FMXSkgeworCQlmcHV0cyhydF9hZGRyX24yYShpZmEtPmlmYV9mYW1pbHksCisJCQkJCSAgICAgIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwKKwkJCQkJICAgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwgc3Rkb3V0KTsKKworCQlpZiAocnRhX3RiW0lGQV9BRERSRVNTXSA9PSBOVUxMCisJCSB8fCBtZW1jbXAoUlRBX0RBVEEocnRhX3RiW0lGQV9BRERSRVNTXSksIFJUQV9EQVRBKHJ0YV90YltJRkFfTE9DQUxdKSwgNCkgPT0gMAorCQkpIHsKKwkJCXByaW50ZigiLyVkICIsIGlmYS0+aWZhX3ByZWZpeGxlbik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiBwZWVyICVzLyVkICIsCisJCQkJcnRfYWRkcl9uMmEoaWZhLT5pZmFfZmFtaWx5LAorCQkJCQkgICAgUlRBX0RBVEEocnRhX3RiW0lGQV9BRERSRVNTXSksCisJCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpLAorCQkJCWlmYS0+aWZhX3ByZWZpeGxlbik7CisJCX0KKwl9CisKKwlpZiAocnRhX3RiW0lGQV9CUk9BRENBU1RdKSB7CisJCXByaW50ZigiYnJkICVzICIsCisJCQlydF9hZGRyX24yYShpZmEtPmlmYV9mYW1pbHksCisJCQkJICAgIFJUQV9EQVRBKHJ0YV90YltJRkFfQlJPQURDQVNUXSksCisJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSkpOworCX0KKwlpZiAocnRhX3RiW0lGQV9BTllDQVNUXSkgeworCQlwcmludGYoImFueSAlcyAiLAorCQkJcnRfYWRkcl9uMmEoaWZhLT5pZmFfZmFtaWx5LAorCQkJCSAgICBSVEFfREFUQShydGFfdGJbSUZBX0FOWUNBU1RdKSwKKwkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCXByaW50Zigic2NvcGUgJXMgIiwgcnRubF9ydHNjb3BlX24yYShpZmEtPmlmYV9zY29wZSwgYjEpKTsKKwlpZiAoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9TRUNPTkRBUlkpIHsKKwkJaWZhLT5pZmFfZmxhZ3MgJj0gfklGQV9GX1NFQ09OREFSWTsKKwkJcHJpbnRmKCJzZWNvbmRhcnkgIik7CisJfQorCWlmIChpZmEtPmlmYV9mbGFncyAmIElGQV9GX1RFTlRBVElWRSkgeworCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfVEVOVEFUSVZFOworCQlwcmludGYoInRlbnRhdGl2ZSAiKTsKKwl9CisJaWYgKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfREVQUkVDQVRFRCkgeworCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfREVQUkVDQVRFRDsKKwkJcHJpbnRmKCJkZXByZWNhdGVkICIpOworCX0KKwlpZiAoIShpZmEtPmlmYV9mbGFncyAmIElGQV9GX1BFUk1BTkVOVCkpIHsKKwkJcHJpbnRmKCJkeW5hbWljICIpOworCX0gZWxzZQorCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfUEVSTUFORU5UOworCWlmIChpZmEtPmlmYV9mbGFncykKKwkJcHJpbnRmKCJmbGFncyAlMDJ4ICIsIGlmYS0+aWZhX2ZsYWdzKTsKKwlpZiAocnRhX3RiW0lGQV9MQUJFTF0pCisJCWZwdXRzKChjaGFyKilSVEFfREFUQShydGFfdGJbSUZBX0xBQkVMXSksIHN0ZG91dCk7CisJaWYgKHJ0YV90YltJRkFfQ0FDSEVJTkZPXSkgeworCQlzdHJ1Y3QgaWZhX2NhY2hlaW5mbyAqY2kgPSBSVEFfREFUQShydGFfdGJbSUZBX0NBQ0hFSU5GT10pOworCQljaGFyIGJ1ZlsxMjhdOworCQliYl9wdXRjaGFyKF9TTF8pOworCQlpZiAoY2ktPmlmYV92YWxpZCA9PSAweEZGRkZGRkZGVSkKKwkJCXNwcmludGYoYnVmLCAidmFsaWRfbGZ0IGZvcmV2ZXIiKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICJ2YWxpZF9sZnQgJWRzZWMiLCBjaS0+aWZhX3ZhbGlkKTsKKwkJaWYgKGNpLT5pZmFfcHJlZmVyZWQgPT0gMHhGRkZGRkZGRlUpCisJCQlzcHJpbnRmKGJ1ZitzdHJsZW4oYnVmKSwgIiBwcmVmZXJyZWRfbGZ0IGZvcmV2ZXIiKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYrc3RybGVuKGJ1ZiksICIgcHJlZmVycmVkX2xmdCAlZHNlYyIsIGNpLT5pZmFfcHJlZmVyZWQpOworCQlwcmludGYoIiAgICAgICAlcyIsIGJ1Zik7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJLypmZmx1c2hfYWxsKCk7Ki8KKwlyZXR1cm4gMDsKK30KKworCitzdHJ1Y3Qgbmxtc2dfbGlzdCB7CisJc3RydWN0IG5sbXNnX2xpc3QgKm5leHQ7CisJc3RydWN0IG5sbXNnaGRyICAgaDsKK307CisKK3N0YXRpYyBpbnQgcHJpbnRfc2VsZWN0ZWRfYWRkcmluZm8oaW50IGlmaW5kZXgsIHN0cnVjdCBubG1zZ19saXN0ICphaW5mbykKK3sKKwlmb3IgKDsgYWluZm87IGFpbmZvID0gYWluZm8tPm5leHQpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpuID0gJmFpbmZvLT5oOworCQlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCisJCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdBRERSKQorCQkJY29udGludWU7CisJCWlmIChuLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKGlmYSkpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoaWZhLT5pZmFfaW5kZXggIT0gaWZpbmRleAorCQkgfHwgKEdfZmlsdGVyLmZhbWlseSAmJiBHX2ZpbHRlci5mYW1pbHkgIT0gaWZhLT5pZmFfZmFtaWx5KQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50X2FkZHJpbmZvKE5VTEwsIG4sIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdG9yZV9ubG1zZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IG5sbXNnX2xpc3QgKipsaW5mbyA9IChzdHJ1Y3Qgbmxtc2dfbGlzdCoqKWFyZzsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqaDsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqKmxwOworCisJaCA9IHh6YWxsb2Mobi0+bmxtc2dfbGVuICsgc2l6ZW9mKHZvaWQqKSk7CisKKwltZW1jcHkoJmgtPmgsIG4sIG4tPm5sbXNnX2xlbik7CisJLypoLT5uZXh0ID0gTlVMTDsgLSB4emFsbG9jIGRpZCBpdCAqLworCisJZm9yIChscCA9IGxpbmZvOyAqbHA7IGxwID0gJigqbHApLT5uZXh0KQorCQljb250aW51ZTsKKwkqbHAgPSBoOworCisJbGxfcmVtZW1iZXJfaW5kZXgod2hvLCBuLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXBhZGRyX3Jlc2V0X2ZpbHRlcihpbnQgX29uZWxpbmUpCit7CisJbWVtc2V0KCZHX2ZpbHRlciwgMCwgc2l6ZW9mKEdfZmlsdGVyKSk7CisJR19maWx0ZXIub25lbGluZSA9IF9vbmVsaW5lOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGlwYWRkcl9saXN0X29yX2ZsdXNoKGNoYXIgKiphcmd2LCBpbnQgZmx1c2gpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uW10gQUxJR04xID0gInRvXDAiInNjb3BlXDAiInVwXDAiImxhYmVsXDAiImRldlwwIjsKKworCXN0cnVjdCBubG1zZ19saXN0ICpsaW5mbyA9IE5VTEw7CisJc3RydWN0IG5sbXNnX2xpc3QgKmFpbmZvID0gTlVMTDsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCWNoYXIgKmZpbHRlcl9kZXYgPSBOVUxMOworCWludCBub19saW5rID0gMDsKKworCWlwYWRkcl9yZXNldF9maWx0ZXIob25lbGluZSk7CisJR19maWx0ZXIuc2hvd3F1ZXVlID0gMTsKKworCWlmIChHX2ZpbHRlci5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlHX2ZpbHRlci5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKGZsdXNoKSB7CisJCWlmICghKmFyZ3YpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICJmbHVzaCIpOworCQl9CisJCWlmIChHX2ZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmx1c2ggbGluayBhZGRyZXNzZXMiKTsKKwkJfQorCX0KKworCXdoaWxlICgqYXJndikgeworCQljb25zdCBzbWFsbHVpbnQga2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb24sICphcmd2KTsKKwkJaWYgKGtleSA9PSAwKSB7IC8qIHRvICovCisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIucGZ4LCAqYXJndiwgR19maWx0ZXIuZmFtaWx5KTsKKwkJCWlmIChHX2ZpbHRlci5mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJR19maWx0ZXIuZmFtaWx5ID0gR19maWx0ZXIucGZ4LmZhbWlseTsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gMSkgeyAvKiBzY29wZSAqLworCQkJdWludDMyX3Qgc2NvcGUgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCUdfZmlsdGVyLnNjb3BlbWFzayA9IC0xOworCQkJaWYgKHJ0bmxfcnRzY29wZV9hMm4oJnNjb3BlLCAqYXJndikpIHsKKwkJCQlpZiAoc3RyY21wKCphcmd2LCAiYWxsIikgIT0gMCkgeworCQkJCQlpbnZhcmcoKmFyZ3YsICJzY29wZSIpOworCQkJCX0KKwkJCQlzY29wZSA9IFJUX1NDT1BFX05PV0hFUkU7CisJCQkJR19maWx0ZXIuc2NvcGVtYXNrID0gMDsKKwkJCX0KKwkJCUdfZmlsdGVyLnNjb3BlID0gc2NvcGU7CisJCX0gZWxzZSBpZiAoa2V5ID09IDIpIHsgLyogdXAgKi8KKwkJCUdfZmlsdGVyLnVwID0gMTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gMykgeyAvKiBsYWJlbCAqLworCQkJTkVYVF9BUkcoKTsKKwkJCUdfZmlsdGVyLmxhYmVsID0gKmFyZ3Y7CisJCX0gZWxzZSB7CisJCQlpZiAoa2V5ID09IDQpIC8qIGRldiAqLworCQkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZmlsdGVyX2RldikKKwkJCQlkdXBhcmcyKCJkZXYiLCAqYXJndik7CisJCQlmaWx0ZXJfZGV2ID0gKmFyZ3Y7CisJCX0KKwkJYXJndisrOworCX0KKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIHByZWZlcnJlZF9mYW1pbHksIFJUTV9HRVRMSU5LKTsKKwl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBzdG9yZV9ubG1zZywgJmxpbmZvKTsKKworCWlmIChmaWx0ZXJfZGV2KSB7CisJCUdfZmlsdGVyLmlmaW5kZXggPSB4bGxfbmFtZV90b19pbmRleChmaWx0ZXJfZGV2KTsKKwl9CisKKwlpZiAoZmx1c2gpIHsKKwkJY2hhciBmbHVzaGJbNDA5Ni01MTJdOworCisJCUdfZmlsdGVyLmZsdXNoYiA9IGZsdXNoYjsKKwkJR19maWx0ZXIuZmx1c2hwID0gMDsKKwkJR19maWx0ZXIuZmx1c2hlID0gc2l6ZW9mKGZsdXNoYik7CisJCUdfZmlsdGVyLnJ0aCA9ICZydGg7CisKKwkJZm9yICg7OykgeworCQkJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBHX2ZpbHRlci5mYW1pbHksIFJUTV9HRVRBRERSKTsKKwkJCUdfZmlsdGVyLmZsdXNoZWQgPSAwOworCQkJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfYWRkcmluZm8sIE5VTEwpOworCQkJaWYgKEdfZmlsdGVyLmZsdXNoZWQgPT0gMCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGZsdXNoX3VwZGF0ZSgpIDwgMCkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJaWYgKEdfZmlsdGVyLmZhbWlseSAhPSBBRl9QQUNLRVQpIHsKKwkJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBHX2ZpbHRlci5mYW1pbHksIFJUTV9HRVRBRERSKTsKKwkJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgc3RvcmVfbmxtc2csICZhaW5mbyk7CisJfQorCisKKwlpZiAoR19maWx0ZXIuZmFtaWx5ICYmIEdfZmlsdGVyLmZhbWlseSAhPSBBRl9QQUNLRVQpIHsKKwkJc3RydWN0IG5sbXNnX2xpc3QgKipscDsKKwkJbHAgPSAmbGluZm87CisKKwkJaWYgKEdfZmlsdGVyLm9uZWxpbmUpCisJCQlub19saW5rID0gMTsKKworCQl3aGlsZSAoKGwgPSAqbHApICE9IE5VTEwpIHsKKwkJCWludCBvayA9IDA7CisJCQlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKCZsLT5oKTsKKwkJCXN0cnVjdCBubG1zZ19saXN0ICphOworCisJCQlmb3IgKGEgPSBhaW5mbzsgYTsgYSA9IGEtPm5leHQpIHsKKwkJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4gPSAmYS0+aDsKKwkJCQlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCisJCQkJaWYgKGlmYS0+aWZhX2luZGV4ICE9IGlmaS0+aWZpX2luZGV4CisJCQkJIHx8IChHX2ZpbHRlci5mYW1pbHkgJiYgR19maWx0ZXIuZmFtaWx5ICE9IGlmYS0+aWZhX2ZhbWlseSkKKwkJCQkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICgoR19maWx0ZXIuc2NvcGUgXiBpZmEtPmlmYV9zY29wZSkgJiBHX2ZpbHRlci5zY29wZW1hc2spCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoR19maWx0ZXIuZmxhZ3MgXiBpZmEtPmlmYV9mbGFncykgJiBHX2ZpbHRlci5mbGFnbWFzaykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKEdfZmlsdGVyLnBmeC5mYW1pbHkgfHwgR19maWx0ZXIubGFiZWwpIHsKKwkJCQkJc3RydWN0IHJ0YXR0ciAqdGJbSUZBX01BWCsxXTsKKwkJCQkJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwkJCQkJcGFyc2VfcnRhdHRyKHRiLCBJRkFfTUFYLCBJRkFfUlRBKGlmYSksIElGQV9QQVlMT0FEKG4pKTsKKwkJCQkJaWYgKCF0YltJRkFfTE9DQUxdKQorCQkJCQkJdGJbSUZBX0xPQ0FMXSA9IHRiW0lGQV9BRERSRVNTXTsKKworCQkJCQlpZiAoR19maWx0ZXIucGZ4LmZhbWlseSAmJiB0YltJRkFfTE9DQUxdKSB7CisJCQkJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQkJCQltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOworCQkJCQkJZHN0LmZhbWlseSA9IGlmYS0+aWZhX2ZhbWlseTsKKwkJCQkJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHRiW0lGQV9MT0NBTF0pLCBSVEFfUEFZTE9BRCh0YltJRkFfTE9DQUxdKSk7CisJCQkJCQlpZiAoaW5ldF9hZGRyX21hdGNoKCZkc3QsICZHX2ZpbHRlci5wZngsIEdfZmlsdGVyLnBmeC5iaXRsZW4pKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWlmIChHX2ZpbHRlci5sYWJlbCkgeworCQkJCQkJU1BSSU5UX0JVRihiMSk7CisJCQkJCQljb25zdCBjaGFyICpsYWJlbDsKKwkJCQkJCWlmICh0YltJRkFfTEFCRUxdKQorCQkJCQkJCWxhYmVsID0gUlRBX0RBVEEodGJbSUZBX0xBQkVMXSk7CisJCQkJCQllbHNlCisJCQkJCQkJbGFiZWwgPSBsbF9pZHhfbjJhKGlmYS0+aWZhX2luZGV4LCBiMSk7CisJCQkJCQlpZiAoZm5tYXRjaChHX2ZpbHRlci5sYWJlbCwgbGFiZWwsIDApICE9IDApCisJCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlvayA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIW9rKQorCQkJCSpscCA9IGwtPm5leHQ7CisJCQllbHNlCisJCQkJbHAgPSAmbC0+bmV4dDsKKwkJfQorCX0KKworCWZvciAobCA9IGxpbmZvOyBsOyBsID0gbC0+bmV4dCkgeworCQlpZiAobm9fbGluayB8fCBwcmludF9saW5raW5mbygmbC0+aCkgPT0gMCkgeworCQkJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQSgmbC0+aCk7CisJCQlpZiAoR19maWx0ZXIuZmFtaWx5ICE9IEFGX1BBQ0tFVCkKKwkJCQlwcmludF9zZWxlY3RlZF9hZGRyaW5mbyhpZmktPmlmaV9pbmRleCwgYWluZm8pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zY29wZShpbmV0X3ByZWZpeCAqbGNsKQoreworCWlmIChsY2wtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCWlmIChsY2wtPmJ5dGVsZW4gPj0gMSAmJiAqKHVpbnQ4X3QqKSZsY2wtPmRhdGEgPT0gMTI3KQorCQkJcmV0dXJuIFJUX1NDT1BFX0hPU1Q7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwYWRkcl9tb2RpZnkoaW50IGNtZCwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uW10gQUxJR04xID0KKwkJInBlZXJcMCIicmVtb3RlXDAiImJyb2FkY2FzdFwwIiJicmRcMCIKKwkJImFueWNhc3RcMCIic2NvcGVcMCIiZGV2XDAiImxhYmVsXDAiImxvY2FsXDAiOworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyICBuOworCQlzdHJ1Y3QgaWZhZGRybXNnIGlmYTsKKwkJY2hhciAgICAgICAgICAgICBidWZbMjU2XTsKKwl9IHJlcTsKKwljaGFyICpkID0gTlVMTDsKKwljaGFyICpsID0gTlVMTDsKKwlpbmV0X3ByZWZpeCBsY2w7CisJaW5ldF9wcmVmaXggcGVlcjsKKwlpbnQgbG9jYWxfbGVuID0gMDsKKwlpbnQgcGVlcl9sZW4gPSAwOworCWludCBicmRfbGVuID0gMDsKKwlpbnQgYW55X2xlbiA9IDA7CisJYm9vbCBzY29wZWQgPSAwOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpOworCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwlyZXEubi5ubG1zZ190eXBlID0gY21kOworCXJlcS5pZmEuaWZhX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJY29uc3Qgc21hbGx1aW50IGFyZyA9IGluZGV4X2luX3N0cmluZ3Mob3B0aW9uLCAqYXJndik7CisJCWlmIChhcmcgPD0gMSkgeyAvKiBwZWVyLCByZW1vdGUgKi8KKwkJCU5FWFRfQVJHKCk7CisKKwkJCWlmIChwZWVyX2xlbikgeworCQkJCWR1cGFyZygicGVlciIsICphcmd2KTsKKwkJCX0KKwkJCWdldF9wcmVmaXgoJnBlZXIsICphcmd2LCByZXEuaWZhLmlmYV9mYW1pbHkpOworCQkJcGVlcl9sZW4gPSBwZWVyLmJ5dGVsZW47CisJCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJCXJlcS5pZmEuaWZhX2ZhbWlseSA9IHBlZXIuZmFtaWx5OworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9BRERSRVNTLCAmcGVlci5kYXRhLCBwZWVyLmJ5dGVsZW4pOworCQkJcmVxLmlmYS5pZmFfcHJlZml4bGVuID0gcGVlci5iaXRsZW47CisJCX0gZWxzZSBpZiAoYXJnIDw9IDMpIHsgLyogYnJvYWRjYXN0LCBicmQgKi8KKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGJyZF9sZW4pIHsKKwkJCQlkdXBhcmcoImJyb2FkY2FzdCIsICphcmd2KTsKKwkJCX0KKwkJCWlmIChMT05FX0NIQVIoKmFyZ3YsICcrJykpIHsKKwkJCQlicmRfbGVuID0gLTE7CisJCQl9IGVsc2UgaWYgKExPTkVfREFTSCgqYXJndikpIHsKKwkJCQlicmRfbGVuID0gLTI7CisJCQl9IGVsc2UgeworCQkJCWdldF9hZGRyKCZhZGRyLCAqYXJndiwgcmVxLmlmYS5pZmFfZmFtaWx5KTsKKwkJCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9CUk9BRENBU1QsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQkJYnJkX2xlbiA9IGFkZHIuYnl0ZWxlbjsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcmcgPT0gNCkgeyAvKiBhbnljYXN0ICovCisJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChhbnlfbGVuKSB7CisJCQkJZHVwYXJnKCJhbnljYXN0IiwgKmFyZ3YpOworCQkJfQorCQkJZ2V0X2FkZHIoJmFkZHIsICphcmd2LCByZXEuaWZhLmlmYV9mYW1pbHkpOworCQkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQlyZXEuaWZhLmlmYV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCX0KKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQU5ZQ0FTVCwgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCWFueV9sZW4gPSBhZGRyLmJ5dGVsZW47CisJCX0gZWxzZSBpZiAoYXJnID09IDUpIHsgLyogc2NvcGUgKi8KKwkJCXVpbnQzMl90IHNjb3BlID0gMDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHNjb3BlX2Eybigmc2NvcGUsICphcmd2KSkgeworCQkJCWludmFyZygqYXJndiwgInNjb3BlIik7CisJCQl9CisJCQlyZXEuaWZhLmlmYV9zY29wZSA9IHNjb3BlOworCQkJc2NvcGVkID0gMTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gNikgeyAvKiBkZXYgKi8KKwkJCU5FWFRfQVJHKCk7CisJCQlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoYXJnID09IDcpIHsgLyogbGFiZWwgKi8KKwkJCU5FWFRfQVJHKCk7CisJCQlsID0gKmFyZ3Y7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZBX0xBQkVMLCBsLCBzdHJsZW4obCkgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhcmcgPT0gOCkgLyogbG9jYWwgKi8KKwkJCQlORVhUX0FSRygpOworCQkJaWYgKGxvY2FsX2xlbikgeworCQkJCWR1cGFyZzIoImxvY2FsIiwgKmFyZ3YpOworCQkJfQorCQkJZ2V0X3ByZWZpeCgmbGNsLCAqYXJndiwgcmVxLmlmYS5pZmFfZmFtaWx5KTsKKwkJCWlmIChyZXEuaWZhLmlmYV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gbGNsLmZhbWlseTsKKwkJCX0KKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfTE9DQUwsICZsY2wuZGF0YSwgbGNsLmJ5dGVsZW4pOworCQkJbG9jYWxfbGVuID0gbGNsLmJ5dGVsZW47CisJCX0KKwkJYXJndisrOworCX0KKworCWlmICghZCkgeworCQkvKiBUaGVyZSB3YXMgbm8gImRldiBJRkFDRSIsIGJ1dCB3ZSBuZWVkIHRoYXQgKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgXCJkZXYgSUZBQ0VcIiIpOworCX0KKwlpZiAobCAmJiBzdHJuY21wKGQsIGwsIHN0cmxlbihkKSkgIT0gMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXCJkZXZcIiAoJXMpIG11c3QgbWF0Y2ggXCJsYWJlbFwiICglcykiLCBkLCBsKTsKKwl9CisKKwlpZiAocGVlcl9sZW4gPT0gMCAmJiBsb2NhbF9sZW4gJiYgY21kICE9IFJUTV9ERUxBRERSKSB7CisJCXBlZXIgPSBsY2w7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQUREUkVTUywgJmxjbC5kYXRhLCBsY2wuYnl0ZWxlbik7CisJfQorCWlmIChyZXEuaWZhLmlmYV9wcmVmaXhsZW4gPT0gMCkKKwkJcmVxLmlmYS5pZmFfcHJlZml4bGVuID0gbGNsLmJpdGxlbjsKKworCWlmIChicmRfbGVuIDwgMCAmJiBjbWQgIT0gUlRNX0RFTEFERFIpIHsKKwkJaW5ldF9wcmVmaXggYnJkOworCQlpbnQgaTsKKwkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYnJvYWRjYXN0IGNhbiBiZSBzZXQgb25seSBmb3IgSVB2NCBhZGRyZXNzZXMiKTsKKwkJfQorCQlicmQgPSBwZWVyOworCQlpZiAoYnJkLmJpdGxlbiA8PSAzMCkgeworCQkJZm9yIChpPTMxOyBpPj1icmQuYml0bGVuOyBpLS0pIHsKKwkJCQlpZiAoYnJkX2xlbiA9PSAtMSkKKwkJCQkJYnJkLmRhdGFbMF0gfD0gaHRvbmwoMTw8KDMxLWkpKTsKKwkJCQllbHNlCisJCQkJCWJyZC5kYXRhWzBdICY9IH5odG9ubCgxPDwoMzEtaSkpOworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9CUk9BRENBU1QsICZicmQuZGF0YSwgYnJkLmJ5dGVsZW4pOworCQkJYnJkX2xlbiA9IGJyZC5ieXRlbGVuOworCQl9CisJfQorCWlmICghc2NvcGVkICYmIGNtZCAhPSBSVE1fREVMQUREUikKKwkJcmVxLmlmYS5pZmFfc2NvcGUgPSBkZWZhdWx0X3Njb3BlKCZsY2wpOworCisJeHJ0bmxfb3BlbigmcnRoKTsKKworCWxsX2luaXRfbWFwKCZydGgpOworCisJcmVxLmlmYS5pZmFfaW5kZXggPSB4bGxfbmFtZV90b19pbmRleChkKTsKKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApCisJCXJldHVybiAyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK2ludCBGQVNUX0ZVTkMgZG9faXBhZGRyKGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGNvbW1hbmRzW10gQUxJR04xID0KKwkJImFkZFwwIiJkZWxldGVcMCIibGlzdFwwIiJzaG93XDAiImxzdFwwIiJmbHVzaFwwIjsKKwlzbWFsbHVpbnQgY21kID0gMjsKKwlpZiAoKmFyZ3YpIHsKKwkJY21kID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhjb21tYW5kcywgKmFyZ3YpOworCQlpZiAoY21kID4gNSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgKmFyZ3YsIGFwcGxldF9uYW1lKTsKKwkJYXJndisrOworCQlpZiAoY21kIDw9IDEpCisJCQlyZXR1cm4gaXBhZGRyX21vZGlmeSgoY21kID09IDApID8gUlRNX05FV0FERFIgOiBSVE1fREVMQUREUiwgYXJndik7CisJfQorCS8qIDIgPT0gbGlzdCwgMyA9PSBzaG93LCA0ID09IGxzdCAqLworCXJldHVybiBpcGFkZHJfbGlzdF9vcl9mbHVzaChhcmd2LCBjbWQgPT0gNSk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBsaW5rLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkMjAxNwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGxpbmsuYwpAQCAtMCwwICsxLDM4NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgImlwX2NvbW1vbi5oIiAgLyogI2luY2x1ZGUgImxpYmJiLmgiIGlzIGluc2lkZSAqLworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2lmbmRlZiBJRkxBX0xJTktJTkZPCisjIGRlZmluZSBJRkxBX0xJTktJTkZPIDE4CisjIGRlZmluZSBJRkxBX0lORk9fS0lORCAxCisjZW5kaWYKKworLyogdGFrZW4gZnJvbSBsaW51eC9zb2NraW9zLmggKi8KKyNkZWZpbmUgU0lPQ1NJRk5BTUUgIDB4ODkyMyAgLyogc2V0IGludGVyZmFjZSBuYW1lICovCisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgaW50IGdldF9jdGxfZmQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPj0gMCkKKwkJcmV0dXJuIGZkOworCWZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkID49IDApCisJCXJldHVybiBmZDsKKwlyZXR1cm4geHNvY2tldChQRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBkb19jaGZsYWdzKGNoYXIgKmRldiwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IG1hc2spCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwlmZCA9IGdldF9jdGxfZmQoKTsKKwl4aW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgJmlmcik7CisJaWYgKChpZnIuaWZyX2ZsYWdzIF4gZmxhZ3MpICYgbWFzaykgeworCQlpZnIuaWZyX2ZsYWdzICY9IH5tYXNrOworCQlpZnIuaWZyX2ZsYWdzIHw9IG1hc2sgJiBmbGFnczsKKwkJeGlvY3RsKGZkLCBTSU9DU0lGRkxBR1MsICZpZnIpOworCX0KKwljbG9zZShmZCk7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBkb19jaGFuZ2VuYW1lKGNoYXIgKmRldiwgY2hhciAqbmV3ZGV2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25ld25hbWUsIG5ld2Rldik7CisJZmQgPSBnZXRfY3RsX2ZkKCk7CisJeGlvY3RsKGZkLCBTSU9DU0lGTkFNRSwgJmlmcik7CisJY2xvc2UoZmQpOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgc2V0X3FsZW4oY2hhciAqZGV2LCBpbnQgcWxlbikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBzOworCisJcyA9IGdldF9jdGxfZmQoKTsKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCWlmci5pZnJfcWxlbiA9IHFsZW47CisJeGlvY3RsKHMsIFNJT0NTSUZUWFFMRU4sICZpZnIpOworCWNsb3NlKHMpOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgc2V0X210dShjaGFyICpkZXYsIGludCBtdHUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgczsKKworCXMgPSBnZXRfY3RsX2ZkKCk7CisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwlpZnIuaWZyX210dSA9IG10dTsKKwl4aW9jdGwocywgU0lPQ1NJRk1UVSwgJmlmcik7CisJY2xvc2Uocyk7Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgaW50IGdldF9hZGRyZXNzKGNoYXIgKmRldiwgaW50ICpodHlwZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cnVjdCBzb2NrYWRkcl9sbCBtZTsKKwlzb2NrbGVuX3QgYWxlbjsKKwlpbnQgczsKKworCXMgPSB4c29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgMCk7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCXhpb2N0bChzLCBTSU9DR0lGSU5ERVgsICZpZnIpOworCisJbWVtc2V0KCZtZSwgMCwgc2l6ZW9mKG1lKSk7CisJbWUuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwltZS5zbGxfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwltZS5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9MT09QKTsKKwl4YmluZChzLCAoc3RydWN0IHNvY2thZGRyKikmbWUsIHNpemVvZihtZSkpOworCWFsZW4gPSBzaXplb2YobWUpOworCWdldHNvY2tuYW1lKHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZtZSwgJmFsZW4pOworCS8vbmV2ZXIgaGFwcGVuczoKKwkvL2lmIChnZXRzb2NrbmFtZShzLCAoc3RydWN0IHNvY2thZGRyKikmbWUsICZhbGVuKSA9PSAtMSkKKwkvLwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldHNvY2tuYW1lIik7CisJY2xvc2Uocyk7CisJKmh0eXBlID0gbWUuc2xsX2hhdHlwZTsKKwlyZXR1cm4gbWUuc2xsX2hhbGVuOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgcGFyc2VfYWRkcmVzcyhjaGFyICpkZXYsIGludCBoYXR5cGUsIGludCBoYWxlbiwgY2hhciAqbGxhLCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlpbnQgYWxlbjsKKworCW1lbXNldChpZnIsIDAsIHNpemVvZigqaWZyKSk7CisJc3RybmNweV9JRk5BTVNJWihpZnItPmlmcl9uYW1lLCBkZXYpOworCWlmci0+aWZyX2h3YWRkci5zYV9mYW1pbHkgPSBoYXR5cGU7CisKKwlhbGVuID0gaGF0eXBlID09IDEvKkFSUEhSRF9FVEhFUiovID8gMTQvKkVUSF9ITEVOKi8gOiAxOS8qSU5GSU5JQkFORF9ITEVOKi87CisJYWxlbiA9IGxsX2FkZHJfYTJuKCh1bnNpZ25lZCBjaGFyICopKGlmci0+aWZyX2h3YWRkci5zYV9kYXRhKSwgYWxlbiwgbGxhKTsKKwlpZiAoYWxlbiA8IDApCisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwlpZiAoYWxlbiAhPSBoYWxlbikgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3JvbmcgYWRkcmVzcyAoJXMpIGxlbmd0aDogZXhwZWN0ZWQgJWQgYnl0ZXMiLCBsbGEsIGhhbGVuKTsKKwl9Cit9CisKKy8qIEV4aXRzIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBzZXRfYWRkcmVzcyhzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGJyZCkKK3sKKwlpbnQgczsKKworCXMgPSBnZXRfY3RsX2ZkKCk7CisJaWYgKGJyZCkKKwkJeGlvY3RsKHMsIFNJT0NTSUZIV0JST0FEQ0FTVCwgaWZyKTsKKwllbHNlCisJCXhpb2N0bChzLCBTSU9DU0lGSFdBRERSLCBpZnIpOworCWNsb3NlKHMpOworfQorCisKK3N0YXRpYyB2b2lkIGRpZV9tdXN0X2JlX29uX29mZihjb25zdCBjaGFyICptc2cpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZGllX211c3RfYmVfb25fb2ZmKGNvbnN0IGNoYXIgKm1zZykKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXJndW1lbnQgb2YgXCIlc1wiIG11c3QgYmUgXCJvblwiIG9yIFwib2ZmXCIiLCBtc2cpOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGRvX3NldChjaGFyICoqYXJndikKK3sKKwljaGFyICpkZXYgPSBOVUxMOworCXVpbnQzMl90IG1hc2sgPSAwOworCXVpbnQzMl90IGZsYWdzID0gMDsKKwlpbnQgcWxlbiA9IC0xOworCWludCBtdHUgPSAtMTsKKwljaGFyICpuZXdhZGRyID0gTlVMTDsKKwljaGFyICpuZXdicmQgPSBOVUxMOworCXN0cnVjdCBpZnJlcSBpZnIwLCBpZnIxOworCWNoYXIgKm5ld25hbWUgPSBOVUxMOworCWludCBodHlwZSwgaGFsZW47CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkidXBcMCIiZG93blwwIiJuYW1lXDAiIm10dVwwIiJxbGVuXDAiIm11bHRpY2FzdFwwIgorCQkiYXJwXDAiImFkZHJlc3NcMCIiZGV2XDAiOworCWVudW0geyBBUkdfdXAgPSAwLCBBUkdfZG93biwgQVJHX25hbWUsIEFSR19tdHUsIEFSR19xbGVuLCBBUkdfbXVsdGljYXN0LAorCQlBUkdfYXJwLCBBUkdfYWRkciwgQVJHX2RldiB9OworCXN0YXRpYyBjb25zdCBjaGFyIHN0cl9vbl9vZmZbXSBBTElHTjEgPSAib25cMCIib2ZmXDAiOworCWVudW0geyBQQVJNX29uID0gMCwgUEFSTV9vZmYgfTsKKwlzbWFsbHVpbnQga2V5OworCisJd2hpbGUgKCphcmd2KSB7CisJCS8qIHN1YnN0cmluZyBzZWFyY2ggZW5zdXJlcyB0aGF0IGUuZy4gImFkZHIiIGFuZCAiYWRkcmVzcyIKKwkJICogYXJlIGJvdGggYWNjZXB0ZWQgKi8KKwkJa2V5ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoa2V5ID09IEFSR191cCkgeworCQkJbWFzayB8PSBJRkZfVVA7CisJCQlmbGFncyB8PSBJRkZfVVA7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19kb3duKSB7CisJCQltYXNrIHw9IElGRl9VUDsKKwkJCWZsYWdzICY9IH5JRkZfVVA7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19uYW1lKSB7CisJCQlORVhUX0FSRygpOworCQkJbmV3bmFtZSA9ICphcmd2OworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfbXR1KSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG10dSAhPSAtMSkKKwkJCQlkdXBhcmcoIm10dSIsICphcmd2KTsKKwkJCW10dSA9IGdldF91bnNpZ25lZCgqYXJndiwgIm10dSIpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfcWxlbikgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChxbGVuICE9IC0xKQorCQkJCWR1cGFyZygicWxlbiIsICphcmd2KTsKKwkJCXFsZW4gPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJxbGVuIik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19hZGRyKSB7CisJCQlORVhUX0FSRygpOworCQkJbmV3YWRkciA9ICphcmd2OworCQl9IGVsc2UgaWYgKGtleSA+PSBBUkdfZGV2KSB7CisJCQlpZiAoa2V5ID09IEFSR19kZXYpIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKGRldikKKwkJCQlkdXBhcmcyKCJkZXYiLCAqYXJndik7CisJCQlkZXYgPSAqYXJndjsKKwkJfSBlbHNlIHsKKwkJCWludCBwYXJhbTsKKwkJCU5FWFRfQVJHKCk7CisJCQlwYXJhbSA9IGluZGV4X2luX3N0cmluZ3Moc3RyX29uX29mZiwgKmFyZ3YpOworCQkJaWYgKGtleSA9PSBBUkdfbXVsdGljYXN0KSB7CisJCQkJaWYgKHBhcmFtIDwgMCkKKwkJCQkJZGllX211c3RfYmVfb25fb2ZmKCJtdWx0aWNhc3QiKTsKKwkJCQltYXNrIHw9IElGRl9NVUxUSUNBU1Q7CisJCQkJaWYgKHBhcmFtID09IFBBUk1fb24pCisJCQkJCWZsYWdzIHw9IElGRl9NVUxUSUNBU1Q7CisJCQkJZWxzZQorCQkJCQlmbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19hcnApIHsKKwkJCQlpZiAocGFyYW0gPCAwKQorCQkJCQlkaWVfbXVzdF9iZV9vbl9vZmYoImFycCIpOworCQkJCW1hc2sgfD0gSUZGX05PQVJQOworCQkJCWlmIChwYXJhbSA9PSBQQVJNX29uKQorCQkJCQlmbGFncyAmPSB+SUZGX05PQVJQOworCQkJCWVsc2UKKwkJCQkJZmxhZ3MgfD0gSUZGX05PQVJQOworCQkJfQorCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoIWRldikgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCAiXCJkZXZcIiIpOworCX0KKworCWlmIChuZXdhZGRyIHx8IG5ld2JyZCkgeworCQloYWxlbiA9IGdldF9hZGRyZXNzKGRldiwgJmh0eXBlKTsKKwkJaWYgKG5ld2FkZHIpIHsKKwkJCXBhcnNlX2FkZHJlc3MoZGV2LCBodHlwZSwgaGFsZW4sIG5ld2FkZHIsICZpZnIwKTsKKwkJCXNldF9hZGRyZXNzKCZpZnIwLCAwKTsKKwkJfQorCQlpZiAobmV3YnJkKSB7CisJCQlwYXJzZV9hZGRyZXNzKGRldiwgaHR5cGUsIGhhbGVuLCBuZXdicmQsICZpZnIxKTsKKwkJCXNldF9hZGRyZXNzKCZpZnIxLCAxKTsKKwkJfQorCX0KKworCWlmIChuZXduYW1lICYmIHN0cmNtcChkZXYsIG5ld25hbWUpKSB7CisJCWRvX2NoYW5nZW5hbWUoZGV2LCBuZXduYW1lKTsKKwkJZGV2ID0gbmV3bmFtZTsKKwl9CisJaWYgKHFsZW4gIT0gLTEpIHsKKwkJc2V0X3FsZW4oZGV2LCBxbGVuKTsKKwl9CisJaWYgKG10dSAhPSAtMSkgeworCQlzZXRfbXR1KGRldiwgbXR1KTsKKwl9CisJaWYgKG1hc2spCisJCWRvX2NoZmxhZ3MoZGV2LCBmbGFncywgbWFzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhZGRyX2xpc3RfbGluayhjaGFyICoqYXJndikKK3sKKwlwcmVmZXJyZWRfZmFtaWx5ID0gQUZfUEFDS0VUOworCXJldHVybiBpcGFkZHJfbGlzdF9vcl9mbHVzaChhcmd2LCAwKTsKK30KKworI2lmbmRlZiBOTE1TR19UQUlMCisjZGVmaW5lIE5MTVNHX1RBSUwobm1zZykgXAorCSgoc3RydWN0IHJ0YXR0ciAqKSAoKCh2b2lkICopIChubXNnKSkgKyBOTE1TR19BTElHTigobm1zZyktPm5sbXNnX2xlbikpKQorI2VuZGlmCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGRvX2NoYW5nZShjaGFyICoqYXJndiwgY29uc3QgdW5zaWduZWQgcnRtKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJImxpbmtcMCIibmFtZVwwIiJ0eXBlXDAiImRldlwwIjsKKwllbnVtIHsKKwkJQVJHX2xpbmssCisJCUFSR19uYW1lLAorCQlBUkdfdHlwZSwKKwkJQVJHX2RldiwKKwl9OworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyICBuOworCQlzdHJ1Y3QgaWZpbmZvbXNnIGk7CisJCWNoYXIgICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCXNtYWxsdWludCBhcmc7CisJY2hhciAqbmFtZV9zdHIgPSBOVUxMLCAqbGlua19zdHIgPSBOVUxMLCAqdHlwZV9zdHIgPSBOVUxMLCAqZGV2X3N0ciA9IE5VTEw7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCXJlcS5uLm5sbXNnX3R5cGUgPSBydG07CisJcmVxLmkuaWZpX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJaWYgKHJ0bSA9PSBSVE1fTkVXTElOSykKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgfD0gTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0w7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoYXJnID09IEFSR19saW5rKSB7CisJCQlORVhUX0FSRygpOworCQkJbGlua19zdHIgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX25hbWUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQluYW1lX3N0ciA9ICphcmd2OworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfdHlwZSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXR5cGVfc3RyID0gKmFyZ3Y7CisJCX0gZWxzZSB7CisJCQlpZiAoYXJnID09IEFSR19kZXYpIHsKKwkJCQlpZiAoZGV2X3N0cikKKwkJCQkJZHVwYXJnKCphcmd2LCAiZGV2Iik7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWRldl9zdHIgPSAqYXJndjsKKwkJfQorCQlhcmd2Kys7CisJfQorCXhydG5sX29wZW4oJnJ0aCk7CisJbGxfaW5pdF9tYXAoJnJ0aCk7CisJaWYgKHR5cGVfc3RyKSB7CisJCXN0cnVjdCBydGF0dHIgKmxpbmtpbmZvID0gTkxNU0dfVEFJTCgmcmVxLm4pOworCisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0xJTktJTkZPLCBOVUxMLCAwKTsKKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfSU5GT19LSU5ELCB0eXBlX3N0ciwKKwkJCQlzdHJsZW4odHlwZV9zdHIpKTsKKwkJbGlua2luZm8tPnJ0YV9sZW4gPSAodm9pZCAqKU5MTVNHX1RBSUwoJnJlcS5uKSAtICh2b2lkICopbGlua2luZm87CisJfQorCWlmIChydG0gIT0gUlRNX05FV0xJTkspIHsKKwkJaWYgKCFkZXZfc3RyKQorCQkJcmV0dXJuIDE7IC8qIE5lZWQgYSBkZXZpY2UgdG8gZGVsZXRlICovCisJCXJlcS5pLmlmaV9pbmRleCA9IHhsbF9uYW1lX3RvX2luZGV4KGRldl9zdHIpOworCX0gZWxzZSB7CisJCWlmICghbmFtZV9zdHIpCisJCQluYW1lX3N0ciA9IGRldl9zdHI7CisJCWlmIChsaW5rX3N0cikgeworCQkJaW50IGlkeCA9IHhsbF9uYW1lX3RvX2luZGV4KGxpbmtfc3RyKTsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0xJTkssICZpZHgsIDQpOworCQl9CisJfQorCWlmIChuYW1lX3N0cikgeworCQljb25zdCBzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4obmFtZV9zdHIpICsgMTsKKwkJaWYgKG5hbWVfbGVuIDwgMiB8fCBuYW1lX2xlbiA+IElGTkFNU0laKQorCQkJaW52YXJnKG5hbWVfc3RyLCAibmFtZSIpOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9JRk5BTUUsIG5hbWVfc3RyLCBuYW1lX2xlbik7CisJfQorCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApCisJCXJldHVybiAyOworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGRvX2lwbGluayhjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiZGVsZXRlXDAiInNldFwwIiJzaG93XDAiImxzdFwwIiJsaXN0XDAiOworCWlmICgqYXJndikgeworCQlzbWFsbHVpbnQga2V5ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoa2V5ID4gNSkgLyogaW52YWxpZCBhcmd1bWVudCAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJCWlmIChrZXkgPD0gMSkgLyogYWRkL2RlbGV0ZSAqLworCQkJcmV0dXJuIGRvX2NoYW5nZShhcmd2LCBrZXkgPyBSVE1fREVMTElOSyA6IFJUTV9ORVdMSU5LKTsKKwkJZWxzZSBpZiAoa2V5ID09IDIpIC8qIHNldCAqLworCQkJcmV0dXJuIGRvX3NldChhcmd2KTsKKwl9CisJLyogc2hvdywgbHN0LCBsaXN0ICovCisJcmV0dXJuIGlwYWRkcl9saXN0X2xpbmsoYXJndik7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXByb3V0ZS5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE2N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwcm91dGUuYwpAQCAtMCwwICsxLDk0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogQ2hhbmdlczoKKyAqCisgKiBSYW5pIEFzc2FmIDxyYW5pQG1hZ2ljLm1ldGF3aXJlLmNvbT4gOTgwOTI5OiByZXNvbHZlIGFkZHJlc3NlcworICogS3VuaWhpcm8gSXNoaWd1cm8gPGt1bmloaXJvQHplYnJhLm9yZz4gMDAxMTAyOiBydG5oX2lmaW5kZXggd2FzIG5vdCBpbml0aWFsaXplZAorICovCisKKyNpbmNsdWRlICJpcF9jb21tb24uaCIgIC8qICNpbmNsdWRlICJsaWJiYi5oIiBpcyBpbnNpZGUgKi8KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpZm5kZWYgUlRBWF9SVFRWQVIKKyNkZWZpbmUgUlRBWF9SVFRWQVIgUlRBWF9IT1BTCisjZW5kaWYKKworCitzdHJ1Y3QgZmlsdGVyX3QgeworCWludCB0YjsKKwlzbWFsbGludCBmbHVzaGVkOworCWNoYXIgKmZsdXNoYjsKKwlpbnQgZmx1c2hwOworCWludCBmbHVzaGU7CisJc3RydWN0IHJ0bmxfaGFuZGxlICpydGg7CisJLy9pbnQgcHJvdG9jb2wsIHByb3RvY29sbWFzazsgLSB3cml0ZS1vbmx5IGZpZWxkcz8hCisJLy9pbnQgc2NvcGUsIHNjb3BlbWFzazsgLSB1bnVzZWQKKwkvL2ludCB0eXBlOyAtIHJlYWQtb25seQorCS8vaW50IHR5cGVtYXNrOyAtIHVudXNlZAorCS8vaW50IHRvcywgdG9zbWFzazsgLSB1bnVzZWQKKwlpbnQgaWlmOworCWludCBvaWY7CisJLy9pbnQgcmVhbG0sIHJlYWxtbWFzazsgLSB1bnVzZWQKKwkvL2luZXRfcHJlZml4IHJwcmVmc3JjOyAtIHJlYWQtb25seQorCWluZXRfcHJlZml4IHJ2aWE7CisJaW5ldF9wcmVmaXggcmRzdDsKKwlpbmV0X3ByZWZpeCBtZHN0OworCWluZXRfcHJlZml4IHJzcmM7CisJaW5ldF9wcmVmaXggbXNyYzsKK30gRklYX0FMSUFTSU5HOwordHlwZWRlZiBzdHJ1Y3QgZmlsdGVyX3QgZmlsdGVyX3Q7CisKKyNkZWZpbmUgR19maWx0ZXIgKCooZmlsdGVyX3QqKSZiYl9jb21tb25fYnVmc2l6MSkKKworc3RhdGljIGludCBmbHVzaF91cGRhdGUodm9pZCkKK3sKKwlpZiAocnRubF9zZW5kKEdfZmlsdGVyLnJ0aCwgR19maWx0ZXIuZmx1c2hiLCBHX2ZpbHRlci5mbHVzaHApIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZW5kIGZsdXNoIHJlcXVlc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlHX2ZpbHRlci5mbHVzaHAgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0X2h6KHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGh6X2ludGVybmFsOworCUZJTEUgKmZwOworCisJaWYgKGh6X2ludGVybmFsKQorCQlyZXR1cm4gaHpfaW50ZXJuYWw7CisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9uZXQvcHNjaGVkIik7CisJaWYgKGZwKSB7CisJCXVuc2lnbmVkIG5vbSwgZGVub207CisKKwkJaWYgKGZzY2FuZihmcCwgIiUqMDh4JSowOHglMDh4JTA4eCIsICZub20sICZkZW5vbSkgPT0gMikKKwkJCWlmIChub20gPT0gMTAwMDAwMCkKKwkJCQloel9pbnRlcm5hbCA9IGRlbm9tOworCQlmY2xvc2UoZnApOworCX0KKwlpZiAoIWh6X2ludGVybmFsKQorCQloel9pbnRlcm5hbCA9IHN5c2NvbmYoX1NDX0NMS19UQ0spOworCXJldHVybiBoel9pbnRlcm5hbDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcHJpbnRfcm91dGUoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8gVU5VU0VEX1BBUkFNLAorCQlzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKnRiW1JUQV9NQVgrMV07CisJY2hhciBhYnVmWzI1Nl07CisJaW5ldF9wcmVmaXggZHN0OworCWluZXRfcHJlZml4IHNyYzsKKwlpbnQgaG9zdF9sZW4gPSAtMTsKKwlTUFJJTlRfQlVGKGIxKTsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdST1VURSAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ERUxST1VURSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIHJvdXRlOiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCW4tPm5sbXNnX2xlbiwgbi0+bmxtc2dfdHlwZSwgbi0+bmxtc2dfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLmZsdXNoYiAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdST1VURSkKKwkJcmV0dXJuIDA7CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwlpZiAobGVuIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndyb25nIG5sbXNnIGxlbiAlZCIsIGxlbik7CisKKwlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJaG9zdF9sZW4gPSAxMjg7CisJZWxzZSBpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlob3N0X2xlbiA9IDMyOworCisJaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJaWYgKEdfZmlsdGVyLnRiKSB7CisJCQlpZiAoR19maWx0ZXIudGIgPCAwKSB7CisJCQkJaWYgKCEoci0+cnRtX2ZsYWdzICYgUlRNX0ZfQ0xPTkVEKSkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChyLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmIChHX2ZpbHRlci50YiA9PSBSVF9UQUJMRV9MT0NBTCkgeworCQkJCQlpZiAoci0+cnRtX3R5cGUgIT0gUlROX0xPQ0FMKSB7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoR19maWx0ZXIudGIgPT0gUlRfVEFCTEVfTUFJTikgeworCQkJCQlpZiAoci0+cnRtX3R5cGUgPT0gUlROX0xPQ0FMKSB7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChHX2ZpbHRlci50YiA+IDAgJiYgR19maWx0ZXIudGIgIT0gci0+cnRtX3RhYmxlKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoR19maWx0ZXIucmRzdC5mYW1pbHkKKwkgJiYgKHItPnJ0bV9mYW1pbHkgIT0gR19maWx0ZXIucmRzdC5mYW1pbHkgfHwgR19maWx0ZXIucmRzdC5iaXRsZW4gPiByLT5ydG1fZHN0X2xlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5tZHN0LmZhbWlseQorCSAmJiAoci0+cnRtX2ZhbWlseSAhPSBHX2ZpbHRlci5tZHN0LmZhbWlseQorCSAgICB8fCAoR19maWx0ZXIubWRzdC5iaXRsZW4gPj0gMCAmJiBHX2ZpbHRlci5tZHN0LmJpdGxlbiA8IHItPnJ0bV9kc3RfbGVuKQorCSAgICApCisJKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIucnNyYy5mYW1pbHkKKwkgJiYgKHItPnJ0bV9mYW1pbHkgIT0gR19maWx0ZXIucnNyYy5mYW1pbHkgfHwgR19maWx0ZXIucnNyYy5iaXRsZW4gPiByLT5ydG1fc3JjX2xlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5tc3JjLmZhbWlseQorCSAmJiAoci0+cnRtX2ZhbWlseSAhPSBHX2ZpbHRlci5tc3JjLmZhbWlseQorCSAgICB8fCAoR19maWx0ZXIubXNyYy5iaXRsZW4gPj0gMCAmJiBHX2ZpbHRlci5tc3JjLmJpdGxlbiA8IHItPnJ0bV9zcmNfbGVuKQorCSAgICApCisJKSB7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJbWVtc2V0KCZzcmMsIDAsIHNpemVvZihzcmMpKTsKKwltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOworCXBhcnNlX3J0YXR0cih0YiwgUlRBX01BWCwgUlRNX1JUQShyKSwgbGVuKTsKKworCWlmICh0YltSVEFfU1JDXSkgeworCQlzcmMuYml0bGVuID0gci0+cnRtX3NyY19sZW47CisJCXNyYy5ieXRlbGVuID0gKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYgPyAxNiA6IDQpOworCQltZW1jcHkoc3JjLmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9TUkNdKSwgc3JjLmJ5dGVsZW4pOworCX0KKwlpZiAodGJbUlRBX0RTVF0pIHsKKwkJZHN0LmJpdGxlbiA9IHItPnJ0bV9kc3RfbGVuOworCQlkc3QuYnl0ZWxlbiA9IChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2ID8gMTYgOiA0KTsKKwkJbWVtY3B5KGRzdC5kYXRhLCBSVEFfREFUQSh0YltSVEFfRFNUXSksIGRzdC5ieXRlbGVuKTsKKwl9CisKKwlpZiAoR19maWx0ZXIucmRzdC5mYW1pbHkKKwkgJiYgaW5ldF9hZGRyX21hdGNoKCZkc3QsICZHX2ZpbHRlci5yZHN0LCBHX2ZpbHRlci5yZHN0LmJpdGxlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5tZHN0LmZhbWlseQorCSAmJiBHX2ZpbHRlci5tZHN0LmJpdGxlbiA+PSAwCisJICYmIGluZXRfYWRkcl9tYXRjaCgmZHN0LCAmR19maWx0ZXIubWRzdCwgci0+cnRtX2RzdF9sZW4pCisJKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIucnNyYy5mYW1pbHkKKwkgJiYgaW5ldF9hZGRyX21hdGNoKCZzcmMsICZHX2ZpbHRlci5yc3JjLCBHX2ZpbHRlci5yc3JjLmJpdGxlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5tc3JjLmZhbWlseSAmJiBHX2ZpbHRlci5tc3JjLmJpdGxlbiA+PSAwCisJICYmIGluZXRfYWRkcl9tYXRjaCgmc3JjLCAmR19maWx0ZXIubXNyYywgci0+cnRtX3NyY19sZW4pCisJKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIub2lmICE9IDApIHsKKwkJaWYgKCF0YltSVEFfT0lGXSkKKwkJCXJldHVybiAwOworCQlpZiAoR19maWx0ZXIub2lmICE9ICooaW50KilSVEFfREFUQSh0YltSVEFfT0lGXSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoR19maWx0ZXIuZmx1c2hiKSB7CisJCXN0cnVjdCBubG1zZ2hkciAqZm47CisKKwkJLyogV2UgYXJlIGNyZWF0aW5nIHJvdXRlIGZsdXNoIGNvbW1hbmRzICovCisKKwkJaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYKKwkJICYmIHItPnJ0bV9kc3RfbGVuID09IDAKKwkJICYmIHItPnJ0bV90eXBlID09IFJUTl9VTlJFQUNIQUJMRQorCQkgJiYgdGJbUlRBX1BSSU9SSVRZXQorCQkgJiYgKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9QUklPUklUWV0pID09IC0xCisJCSkgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoTkxNU0dfQUxJR04oR19maWx0ZXIuZmx1c2hwKSArIG4tPm5sbXNnX2xlbiA+IEdfZmlsdGVyLmZsdXNoZSkgeworCQkJaWYgKGZsdXNoX3VwZGF0ZSgpKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmbHVzaCIpOworCQl9CisJCWZuID0gKHZvaWQqKShHX2ZpbHRlci5mbHVzaGIgKyBOTE1TR19BTElHTihHX2ZpbHRlci5mbHVzaHApKTsKKwkJbWVtY3B5KGZuLCBuLCBuLT5ubG1zZ19sZW4pOworCQlmbi0+bmxtc2dfdHlwZSA9IFJUTV9ERUxST1VURTsKKwkJZm4tPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJZm4tPm5sbXNnX3NlcSA9ICsrR19maWx0ZXIucnRoLT5zZXE7CisJCUdfZmlsdGVyLmZsdXNocCA9ICgoKGNoYXIqKWZuKSArIG4tPm5sbXNnX2xlbikgLSBHX2ZpbHRlci5mbHVzaGI7CisJCUdfZmlsdGVyLmZsdXNoZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSBhcmUgcHJpbnRpbmcgcm91dGVzICovCisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMUk9VVEUpIHsKKwkJcHJpbnRmKCJEZWxldGVkICIpOworCX0KKwlpZiAoci0+cnRtX3R5cGUgIT0gUlROX1VOSUNBU1QgLyogJiYgIUdfZmlsdGVyLnR5cGUgLSBhbHdheXMgMCAqLykgeworCQlwcmludGYoIiVzICIsIHJ0bmxfcnRudHlwZV9uMmEoci0+cnRtX3R5cGUsIGIxKSk7CisJfQorCisJaWYgKHRiW1JUQV9EU1RdKSB7CisJCWlmIChyLT5ydG1fZHN0X2xlbiAhPSBob3N0X2xlbikgeworCQkJcHJpbnRmKCIlcy8ldSAiLCBydF9hZGRyX24yYShyLT5ydG1fZmFtaWx5LAorCQkJCQkJUlRBX0RBVEEodGJbUlRBX0RTVF0pLAorCQkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCQkJci0+cnRtX2RzdF9sZW4KKwkJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXMgIiwgZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJCVJUQV9QQVlMT0FEKHRiW1JUQV9EU1RdKSwKKwkJCQkJCVJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCWFidWYsIHNpemVvZihhYnVmKSkKKwkJCQkJKTsKKwkJfQorCX0gZWxzZSBpZiAoci0+cnRtX2RzdF9sZW4pIHsKKwkJcHJpbnRmKCIwLyVkICIsIHItPnJ0bV9kc3RfbGVuKTsKKwl9IGVsc2UgeworCQlwcmludGYoImRlZmF1bHQgIik7CisJfQorCWlmICh0YltSVEFfU1JDXSkgeworCQlpZiAoci0+cnRtX3NyY19sZW4gIT0gaG9zdF9sZW4pIHsKKwkJCXByaW50ZigiZnJvbSAlcy8ldSAiLCBydF9hZGRyX24yYShyLT5ydG1fZmFtaWx5LAorCQkJCQkJUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCQkJci0+cnRtX3NyY19sZW4KKwkJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiZnJvbSAlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJUlRBX1BBWUxPQUQodGJbUlRBX1NSQ10pLAorCQkJCQkJUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKQorCQkJCQkpOworCQl9CisJfSBlbHNlIGlmIChyLT5ydG1fc3JjX2xlbikgeworCQlwcmludGYoImZyb20gMC8ldSAiLCByLT5ydG1fc3JjX2xlbik7CisJfQorCWlmICh0YltSVEFfR0FURVdBWV0gJiYgR19maWx0ZXIucnZpYS5iaXRsZW4gIT0gaG9zdF9sZW4pIHsKKwkJcHJpbnRmKCJ2aWEgJXMgIiwgZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJUlRBX1BBWUxPQUQodGJbUlRBX0dBVEVXQVldKSwKKwkJCQkJUlRBX0RBVEEodGJbUlRBX0dBVEVXQVldKSwKKwkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJfQorCWlmICh0YltSVEFfT0lGXSkgeworCQlwcmludGYoImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKCooaW50KilSVEFfREFUQSh0YltSVEFfT0lGXSkpKTsKKwl9CisKKwkvKiBUb2RvOiBwYXJzZSAmIHNob3cgInByb3RvIGtlcm5lbCIsICJzY29wZSBsaW5rIiBoZXJlICovCisKKwlpZiAodGJbUlRBX1BSRUZTUkNdICYmIC8qR19maWx0ZXIucnByZWZzcmMuYml0bGVuIC0gYWx3YXlzIDAqLyAwICE9IGhvc3RfbGVuKSB7CisJCS8qIERvIG5vdCB1c2UgZm9ybWF0X2hvc3QoKS4gSXQgaXMgb3VyIGxvY2FsIGFkZHIKKwkJICAgYW5kIHN5bWJvbGljIG5hbWUgd2lsbCBub3QgYmUgdXNlZnVsLgorCQkgKi8KKwkJcHJpbnRmKCIgc3JjICVzICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCVJUQV9EQVRBKHRiW1JUQV9QUkVGU1JDXSksCisJCQkJCWFidWYsIHNpemVvZihhYnVmKSkpOworCX0KKwlpZiAodGJbUlRBX1BSSU9SSVRZXSkgeworCQlwcmludGYoIiBtZXRyaWMgJWQgIiwgKih1aW50MzJfdCopUlRBX0RBVEEodGJbUlRBX1BSSU9SSVRZXSkpOworCX0KKwlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3QgcnRhX2NhY2hlaW5mbyAqY2kgPSBOVUxMOworCQlpZiAodGJbUlRBX0NBQ0hFSU5GT10pIHsKKwkJCWNpID0gUlRBX0RBVEEodGJbUlRBX0NBQ0hFSU5GT10pOworCQl9CisJCWlmICgoci0+cnRtX2ZsYWdzICYgUlRNX0ZfQ0xPTkVEKSB8fCAoY2kgJiYgY2ktPnJ0YV9leHBpcmVzKSkgeworCQkJaWYgKHItPnJ0bV9mbGFncyAmIFJUTV9GX0NMT05FRCkgeworCQkJCXByaW50ZigiJWMgICAgY2FjaGUgIiwgX1NMXyk7CisJCQl9CisJCQlpZiAoY2ktPnJ0YV9leHBpcmVzKSB7CisJCQkJcHJpbnRmKCIgZXhwaXJlcyAlZHNlYyIsIGNpLT5ydGFfZXhwaXJlcyAvIGdldF9oeigpKTsKKwkJCX0KKwkJCWlmIChjaS0+cnRhX2Vycm9yICE9IDApIHsKKwkJCQlwcmludGYoIiBlcnJvciAlZCIsIGNpLT5ydGFfZXJyb3IpOworCQkJfQorCQl9IGVsc2UgaWYgKGNpKSB7CisJCQlpZiAoY2ktPnJ0YV9lcnJvciAhPSAwKQorCQkJCXByaW50ZigiIGVycm9yICVkIiwgY2ktPnJ0YV9lcnJvcik7CisJCX0KKwl9CisJaWYgKHRiW1JUQV9JSUZdICYmIEdfZmlsdGVyLmlpZiA9PSAwKSB7CisJCXByaW50ZigiIGlpZiAlcyIsIGxsX2luZGV4X3RvX25hbWUoKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9JSUZdKSkpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwcm91dGVfbW9kaWZ5KGludCBjbWQsIHVuc2lnbmVkIGZsYWdzLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJzcmNcMCIidmlhXDAiIm10dVwwIiJsb2NrXDAiInByb3RvY29sXDAiSUZfRkVBVFVSRV9JUF9SVUxFKCJ0YWJsZVwwIikKKwkJImRldlwwIiJvaWZcMCIidG9cMCIibWV0cmljXDAiOworCWVudW0geworCQlBUkdfc3JjLAorCQlBUkdfdmlhLAorCQlBUkdfbXR1LCBQQVJNX2xvY2ssCisJCUFSR19wcm90b2NvbCwKK0lGX0ZFQVRVUkVfSVBfUlVMRShBUkdfdGFibGUsKQorCQlBUkdfZGV2LAorCQlBUkdfb2lmLAorCQlBUkdfdG8sCisJCUFSR19tZXRyaWMsCisJfTsKKwllbnVtIHsKKwkJZ3dfb2sgPSAxIDw8IDAsCisJCWRzdF9vayA9IDEgPDwgMSwKKwkJcHJvdG9fb2sgPSAxIDw8IDIsCisJCXR5cGVfb2sgPSAxIDw8IDMKKwl9OworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydG1zZyAgICByOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCWNoYXIgbXhidWZbMjU2XTsKKwlzdHJ1Y3QgcnRhdHRyICogbXhydGEgPSAodm9pZCopbXhidWY7CisJdW5zaWduZWQgbXhsb2NrID0gMDsKKwljaGFyICpkID0gTlVMTDsKKwlzbWFsbHVpbnQgb2sgPSAwOworCWludCBhcmc7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBmbGFnczsKKwlyZXEubi5ubG1zZ190eXBlID0gY21kOworCXJlcS5yLnJ0bV9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCWlmIChSVF9UQUJMRV9NQUlOKSAvKiBpZiBpdCBpcyB6ZXJvLCBtZW1zZXQgYWxyZWFkeSBkaWQgaXQgKi8KKwkJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKwlpZiAoUlRfU0NPUEVfTk9XSEVSRSkKKwkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKworCWlmIChjbWQgIT0gUlRNX0RFTFJPVVRFKSB7CisJCXJlcS5yLnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9CT09UOworCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwkJcmVxLnIucnRtX3R5cGUgPSBSVE5fVU5JQ0FTVDsKKwl9CisKKwlteHJ0YS0+cnRhX3R5cGUgPSBSVEFfTUVUUklDUzsKKwlteHJ0YS0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoMCk7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoYXJnID09IEFSR19zcmMpIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X2FkZHIoJmFkZHIsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSRUZTUkMsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR192aWEpIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlvayB8PSBnd19vazsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJcmVxLnIucnRtX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9HQVRFV0FZLCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfbXR1KSB7CisJCQl1bnNpZ25lZCBtdHU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KSA9PSBQQVJNX2xvY2spIHsKKwkJCQlteGxvY2sgfD0gKDEgPDwgUlRBWF9NVFUpOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQltdHUgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJtdHUiKTsKKwkJCXJ0YV9hZGRhdHRyMzIobXhydGEsIHNpemVvZihteGJ1ZiksIFJUQVhfTVRVLCBtdHUpOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfcHJvdG9jb2wpIHsKKwkJCXVpbnQzMl90IHByb3Q7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfcnRwcm90X2EybigmcHJvdCwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInByb3RvY29sIik7CisJCQlyZXEuci5ydG1fcHJvdG9jb2wgPSBwcm90OworCQkJb2sgfD0gcHJvdG9fb2s7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfdGFibGUpIHsKKwkJCXVpbnQzMl90IHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAidGFibGUiKTsKKwkJCXJlcS5yLnJ0bV90YWJsZSA9IHRpZDsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfZGV2IHx8IGFyZyA9PSBBUkdfb2lmKSB7CisJCQlORVhUX0FSRygpOworCQkJZCA9ICphcmd2OworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfbWV0cmljKSB7CisJCQl1aW50MzJfdCBtZXRyaWM7CisJCQlORVhUX0FSRygpOworCQkJbWV0cmljID0gZ2V0X3UzMigqYXJndiwgIm1ldHJpYyIpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9QUklPUklUWSwgbWV0cmljKTsKKwkJfSBlbHNlIHsKKwkJCWludCB0eXBlOworCQkJaW5ldF9wcmVmaXggZHN0OworCisJCQlpZiAoYXJnID09IEFSR190bykgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoKCoqYXJndiA8ICcwJyB8fCAqKmFyZ3YgPiAnOScpCisJCQkgJiYgcnRubF9ydG50eXBlX2EybigmdHlwZSwgKmFyZ3YpID09IDAKKwkJCSkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJcmVxLnIucnRtX3R5cGUgPSB0eXBlOworCQkJCW9rIHw9IHR5cGVfb2s7CisJCQl9CisKKwkJCWlmIChvayAmIGRzdF9vaykgeworCQkJCWR1cGFyZzIoInRvIiwgKmFyZ3YpOworCQkJfQorCQkJZ2V0X3ByZWZpeCgmZHN0LCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gZHN0LmZhbWlseTsKKwkJCX0KKwkJCXJlcS5yLnJ0bV9kc3RfbGVuID0gZHN0LmJpdGxlbjsKKwkJCW9rIHw9IGRzdF9vazsKKwkJCWlmIChkc3QuYnl0ZWxlbikgeworCQkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfRFNULCAmZHN0LmRhdGEsIGRzdC5ieXRlbGVuKTsKKwkJCX0KKwkJfQorCQlhcmd2Kys7CisJfQorCisJeHJ0bmxfb3BlbigmcnRoKTsKKworCWlmIChkKSAgeworCQlpbnQgaWR4OworCisJCWxsX2luaXRfbWFwKCZydGgpOworCisJCWlmIChkKSB7CisJCQlpZHggPSB4bGxfbmFtZV90b19pbmRleChkKTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfT0lGLCBpZHgpOworCQl9CisJfQorCisJaWYgKG14cnRhLT5ydGFfbGVuID4gUlRBX0xFTkdUSCgwKSkgeworCQlpZiAobXhsb2NrKSB7CisJCQlydGFfYWRkYXR0cjMyKG14cnRhLCBzaXplb2YobXhidWYpLCBSVEFYX0xPQ0ssIG14bG9jayk7CisJCX0KKwkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9NRVRSSUNTLCBSVEFfREFUQShteHJ0YSksIFJUQV9QQVlMT0FEKG14cnRhKSk7CisJfQorCisJaWYgKHJlcS5yLnJ0bV90eXBlID09IFJUTl9MT0NBTCB8fCByZXEuci5ydG1fdHlwZSA9PSBSVE5fTkFUKQorCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9IT1NUOworCWVsc2UKKwlpZiAocmVxLnIucnRtX3R5cGUgPT0gUlROX0JST0FEQ0FTVAorCSB8fCByZXEuci5ydG1fdHlwZSA9PSBSVE5fTVVMVElDQVNUCisJIHx8IHJlcS5yLnJ0bV90eXBlID09IFJUTl9BTllDQVNUCisJKSB7CisJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX0xJTks7CisJfQorCWVsc2UgaWYgKHJlcS5yLnJ0bV90eXBlID09IFJUTl9VTklDQVNUIHx8IHJlcS5yLnJ0bV90eXBlID09IFJUTl9VTlNQRUMpIHsKKwkJaWYgKGNtZCA9PSBSVE1fREVMUk9VVEUpCisJCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOworCQllbHNlIGlmICghKG9rICYgZ3dfb2spKQorCQkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKwl9CisKKwlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisJfQorCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkgeworCQlyZXR1cm4gMjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydG5sX3J0Y2FjaGVfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IGZhbWlseSkKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbmxoOworCQlzdHJ1Y3QgcnRtc2cgcnRtOworCX0gcmVxOworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisKKwlyZXEubmxoLm5sbXNnX2xlbiA9IHNpemVvZihyZXEpOworCWlmIChSVE1fR0VUUk9VVEUpCisJCXJlcS5ubGgubmxtc2dfdHlwZSA9IFJUTV9HRVRST1VURTsKKwlpZiAoTkxNX0ZfUk9PVCB8IE5MTV9GX1JFUVVFU1QpCisJCXJlcS5ubGgubmxtc2dfZmxhZ3MgPSBOTE1fRl9ST09UIHwgTkxNX0ZfUkVRVUVTVDsKKwkvKnJlcS5ubGgubmxtc2dfcGlkID0gMDsgLSBtZW1zZXQgZGlkIGl0IGFscmVhZHkgKi8KKwlyZXEubmxoLm5sbXNnX3NlcSA9IHJ0aC0+ZHVtcCA9ICsrcnRoLT5zZXE7CisJcmVxLnJ0bS5ydG1fZmFtaWx5ID0gZmFtaWx5OworCWlmIChSVE1fRl9DTE9ORUQpCisJCXJlcS5ydG0ucnRtX2ZsYWdzID0gUlRNX0ZfQ0xPTkVEOworCisJcmV0dXJuIHhzZW5kdG8ocnRoLT5mZCwgKHZvaWQqKSZyZXEsIHNpemVvZihyZXEpLCAoc3RydWN0IHNvY2thZGRyKikmbmxhZGRyLCBzaXplb2YobmxhZGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGlwcm91dGVfZmx1c2hfY2FjaGUodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBmbltdIEFMSUdOMSA9ICIvcHJvYy9zeXMvbmV0L2lwdjQvcm91dGUvZmx1c2giOworCWludCBmbHVzaF9mZCA9IG9wZW5fb3Jfd2FybihmbiwgT19XUk9OTFkpOworCisJaWYgKGZsdXNoX2ZkIDwgMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKHdyaXRlKGZsdXNoX2ZkLCAiLTEiLCAyKSA8IDIpIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgZmx1c2ggcm91dGluZyBjYWNoZSIpOworCQlyZXR1cm47CisJfQorCWNsb3NlKGZsdXNoX2ZkKTsKK30KKworc3RhdGljIHZvaWQgaXByb3V0ZV9yZXNldF9maWx0ZXIodm9pZCkKK3sKKwltZW1zZXQoJkdfZmlsdGVyLCAwLCBzaXplb2YoR19maWx0ZXIpKTsKKwlHX2ZpbHRlci5tZHN0LmJpdGxlbiA9IC0xOworCUdfZmlsdGVyLm1zcmMuYml0bGVuID0gLTE7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXByb3V0ZV9saXN0X29yX2ZsdXNoKGNoYXIgKiphcmd2LCBpbnQgZmx1c2gpCit7CisJaW50IGRvX2lwdjYgPSBwcmVmZXJyZWRfZmFtaWx5OworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJY2hhciAqaWQgPSBOVUxMOworCWNoYXIgKm9kID0gTlVMTDsKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCS8qICJpcCByb3V0ZSBsaXN0L2ZsdXNoIiBwYXJhbWV0ZXJzOiAqLworCQkicHJvdG9jb2xcMCIgImRldlwwIiAgICJvaWZcMCIgICAiaWlmXDAiCisJCSJ2aWFcMCIgICAgICAidGFibGVcMCIgImNhY2hlXDAiCisJCSJmcm9tXDAiICAgICAidG9cMCIKKwkJLyogYW5kIHBvc3NpYmxlIGZ1cnRoZXIga2V5d29yZHMgKi8KKwkJImFsbFwwIgorCQkicm9vdFwwIgorCQkibWF0Y2hcMCIKKwkJImV4YWN0XDAiCisJCSJtYWluXDAiCisJCTsKKwllbnVtIHsKKwkJS1dfcHJvdG8sIEtXX2RldiwgICBLV19vaWYsICBLV19paWYsCisJCUtXX3ZpYSwgICBLV190YWJsZSwgS1dfY2FjaGUsCisJCUtXX2Zyb20sICBLV190bywKKwkJLyogKi8KKwkJS1dfYWxsLAorCQlLV19yb290LAorCQlLV19tYXRjaCwKKwkJS1dfZXhhY3QsCisJCUtXX21haW4sCisJfTsKKwlpbnQgYXJnLCBwYXJtOworCisJaXByb3V0ZV9yZXNldF9maWx0ZXIoKTsKKwlHX2ZpbHRlci50YiA9IFJUX1RBQkxFX01BSU47CisKKwlpZiAoZmx1c2ggJiYgISphcmd2KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCAiXCJpcCByb3V0ZSBmbHVzaFwiIik7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoYXJnID09IEtXX3Byb3RvKSB7CisJCQl1aW50MzJfdCBwcm90ID0gMDsKKwkJCU5FWFRfQVJHKCk7CisJCQkvL0dfZmlsdGVyLnByb3RvY29sbWFzayA9IC0xOworCQkJaWYgKHJ0bmxfcnRwcm90X2EybigmcHJvdCwgKmFyZ3YpKSB7CisJCQkJaWYgKGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KSAhPSBLV19hbGwpCisJCQkJCWludmFyZygqYXJndiwgInByb3RvY29sIik7CisJCQkJcHJvdCA9IDA7CisJCQkJLy9HX2ZpbHRlci5wcm90b2NvbG1hc2sgPSAwOworCQkJfQorCQkJLy9HX2ZpbHRlci5wcm90b2NvbCA9IHByb3Q7CisJCX0gZWxzZSBpZiAoYXJnID09IEtXX2RldiB8fCBhcmcgPT0gS1dfb2lmKSB7CisJCQlORVhUX0FSRygpOworCQkJb2QgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChhcmcgPT0gS1dfaWlmKSB7CisJCQlORVhUX0FSRygpOworCQkJaWQgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChhcmcgPT0gS1dfdmlhKSB7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIucnZpYSwgKmFyZ3YsIGRvX2lwdjYpOworCQl9IGVsc2UgaWYgKGFyZyA9PSBLV190YWJsZSkgeyAvKiB0YWJsZSBhbGwvY2FjaGUvbWFpbiAqLworCQkJTkVYVF9BUkcoKTsKKwkJCXBhcm0gPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAocGFybSA9PSBLV19jYWNoZSkKKwkJCQlHX2ZpbHRlci50YiA9IC0xOworCQkJZWxzZSBpZiAocGFybSA9PSBLV19hbGwpCisJCQkJR19maWx0ZXIudGIgPSAwOworCQkJZWxzZSBpZiAocGFybSAhPSBLV19tYWluKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorCQkJCXVpbnQzMl90IHRpZDsKKwkJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpCisJCQkJCWludmFyZygqYXJndiwgInRhYmxlIik7CisJCQkJR19maWx0ZXIudGIgPSB0aWQ7CisjZWxzZQorCQkJCWludmFyZygqYXJndiwgInRhYmxlIik7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIGlmIChhcmcgPT0gS1dfY2FjaGUpIHsKKwkJCS8qIFRoZSBjb21tYW5kICdpcCByb3V0ZSBmbHVzaCBjYWNoZScgaXMgdXNlZCBieSBPcGVuU1dBTi4KKwkJCSAqIEFzc3VtaW5nIGl0J3MgYSBzeW5vbnltIGZvciAnaXAgcm91dGUgZmx1c2ggdGFibGUgY2FjaGUnICovCisJCQlHX2ZpbHRlci50YiA9IC0xOworCQl9IGVsc2UgaWYgKGFyZyA9PSBLV19mcm9tKSB7CisJCQlORVhUX0FSRygpOworCQkJcGFybSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChwYXJtID09IEtXX3Jvb3QpIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLnJzcmMsICphcmd2LCBkb19pcHY2KTsKKwkJCX0gZWxzZSBpZiAocGFybSA9PSBLV19tYXRjaCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIubXNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGFybSA9PSBLV19leGFjdCkKKwkJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5tc3JjLCAqYXJndiwgZG9faXB2Nik7CisJCQkJR19maWx0ZXIucnNyYyA9IEdfZmlsdGVyLm1zcmM7CisJCQl9CisJCX0gZWxzZSB7IC8qICJ0byIgaXMgdGhlIGRlZmF1bHQgcGFyYW1ldGVyICovCisJCQlpZiAoYXJnID09IEtXX3RvKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQl9CisJCQkvKiBwYXJtID0gYXJnOyAtIHdvdWxkIGJlIG1vcmUgcGxhdXNpYmxlLCBidXQgd2UgcmV1c2UgJ2FyZycgaGVyZSAqLworCQkJaWYgKGFyZyA9PSBLV19yb290KSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5yZHN0LCAqYXJndiwgZG9faXB2Nik7CisJCQl9IGVsc2UgaWYgKGFyZyA9PSBLV19tYXRjaCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIubWRzdCwgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIHsgLyogInRvIGV4YWN0IiBpcyB0aGUgZGVmYXVsdCAqLworCQkJCWlmIChhcmcgPT0gS1dfZXhhY3QpCisJCQkJCU5FWFRfQVJHKCk7CisJCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIubWRzdCwgKmFyZ3YsIGRvX2lwdjYpOworCQkJCUdfZmlsdGVyLnJkc3QgPSBHX2ZpbHRlci5tZHN0OworCQkJfQorCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoZG9faXB2NiA9PSBBRl9VTlNQRUMgJiYgR19maWx0ZXIudGIpIHsKKwkJZG9faXB2NiA9IEFGX0lORVQ7CisJfQorCisJeHJ0bmxfb3BlbigmcnRoKTsKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCWlmIChpZCB8fCBvZCkgIHsKKwkJaW50IGlkeDsKKworCQlpZiAoaWQpIHsKKwkJCWlkeCA9IHhsbF9uYW1lX3RvX2luZGV4KGlkKTsKKwkJCUdfZmlsdGVyLmlpZiA9IGlkeDsKKwkJfQorCQlpZiAob2QpIHsKKwkJCWlkeCA9IHhsbF9uYW1lX3RvX2luZGV4KG9kKTsKKwkJCUdfZmlsdGVyLm9pZiA9IGlkeDsKKwkJfQorCX0KKworCWlmIChmbHVzaCkgeworCQljaGFyIGZsdXNoYls0MDk2LTUxMl07CisKKwkJaWYgKEdfZmlsdGVyLnRiID09IC0xKSB7IC8qICJmbHVzaCB0YWJsZSBjYWNoZSIgKi8KKwkJCWlmIChkb19pcHY2ICE9IEFGX0lORVQ2KQorCQkJCWlwcm91dGVfZmx1c2hfY2FjaGUoKTsKKwkJCWlmIChkb19pcHY2ID09IEFGX0lORVQpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlHX2ZpbHRlci5mbHVzaGIgPSBmbHVzaGI7CisJCUdfZmlsdGVyLmZsdXNocCA9IDA7CisJCUdfZmlsdGVyLmZsdXNoZSA9IHNpemVvZihmbHVzaGIpOworCQlHX2ZpbHRlci5ydGggPSAmcnRoOworCisJCWZvciAoOzspIHsKKwkJCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgZG9faXB2NiwgUlRNX0dFVFJPVVRFKTsKKwkJCUdfZmlsdGVyLmZsdXNoZWQgPSAwOworCQkJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfcm91dGUsIE5VTEwpOworCQkJaWYgKEdfZmlsdGVyLmZsdXNoZWQgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChmbHVzaF91cGRhdGUoKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChHX2ZpbHRlci50YiAhPSAtMSkgeworCQl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIGRvX2lwdjYsIFJUTV9HRVRST1VURSk7CisJfSBlbHNlIGlmIChydG5sX3J0Y2FjaGVfcmVxdWVzdCgmcnRoLCBkb19pcHY2KSA8IDApIHsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCX0KKwl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9yb3V0ZSwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwcm91dGVfZ2V0KGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydG1zZyAgICByOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCWNoYXIgKmlkZXYgPSBOVUxMOworCWNoYXIgKm9kZXYgPSBOVUxMOworCWJvb2wgY29ubmVjdGVkID0gMDsKKwlib29sIGZyb21fb2sgPSAwOworCXN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCQkiZnJvbVwwIiJpaWZcMCIib2lmXDAiImRldlwwIiJub3RpZnlcMCIiY29ubmVjdGVkXDAiInRvXDAiOworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCWlwcm91dGVfcmVzZXRfZmlsdGVyKCk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpOworCWlmIChOTE1fRl9SRVFVRVNUKQorCQlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJaWYgKFJUTV9HRVRST1VURSkKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRST1VURTsKKwlyZXEuci5ydG1fZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwkvKnJlcS5yLnJ0bV90YWJsZSA9IDA7IC0gbWVtc2V0IGRpZCB0aGlzIGFscmVhZHkgKi8KKwkvKnJlcS5yLnJ0bV9wcm90b2NvbCA9IDA7Ki8KKwkvKnJlcS5yLnJ0bV9zY29wZSA9IDA7Ki8KKwkvKnJlcS5yLnJ0bV90eXBlID0gMDsqLworCS8qcmVxLnIucnRtX3NyY19sZW4gPSAwOyovCisJLypyZXEuci5ydG1fZHN0X2xlbiA9IDA7Ki8KKwkvKnJlcS5yLnJ0bV90b3MgPSAwOyovCisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJc3dpdGNoIChpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsICphcmd2KSkgeworCQkJY2FzZSAwOiAvKiBmcm9tICovCisJCQl7CisJCQkJaW5ldF9wcmVmaXggYWRkcjsKKwkJCQlORVhUX0FSRygpOworCQkJCWZyb21fb2sgPSAxOworCQkJCWdldF9wcmVmaXgoJmFkZHIsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCQlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQkJcmVxLnIucnRtX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJCX0KKwkJCQlpZiAoYWRkci5ieXRlbGVuKSB7CisJCQkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfU1JDLCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJCX0KKwkJCQlyZXEuci5ydG1fc3JjX2xlbiA9IGFkZHIuYml0bGVuOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAxOiAvKiBpaWYgKi8KKwkJCQlORVhUX0FSRygpOworCQkJCWlkZXYgPSAqYXJndjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjogLyogb2lmICovCisJCQljYXNlIDM6IC8qIGRldiAqLworCQkJCU5FWFRfQVJHKCk7CisJCQkJb2RldiA9ICphcmd2OworCQkJCWJyZWFrOworCQkJY2FzZSA0OiAvKiBub3RpZnkgKi8KKwkJCQlyZXEuci5ydG1fZmxhZ3MgfD0gUlRNX0ZfTk9USUZZOworCQkJCWJyZWFrOworCQkJY2FzZSA1OiAvKiBjb25uZWN0ZWQgKi8KKwkJCQljb25uZWN0ZWQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSA2OiAvKiB0byAqLworCQkJCU5FWFRfQVJHKCk7CisJCQlkZWZhdWx0OgorCQkJeworCQkJCWluZXRfcHJlZml4IGFkZHI7CisJCQkJZ2V0X3ByZWZpeCgmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQkJfQorCQkJCWlmIChhZGRyLmJ5dGVsZW4pIHsKKwkJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9EU1QsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQkJfQorCQkJCXJlcS5yLnJ0bV9kc3RfbGVuID0gYWRkci5iaXRsZW47CisJCQl9CisJCX0KKwkJYXJndisrOworCX0KKworCWlmIChyZXEuci5ydG1fZHN0X2xlbiA9PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZWVkIGF0IGxlYXN0IGRlc3RpbmF0aW9uIGFkZHJlc3MiKTsKKwl9CisKKwl4cnRubF9vcGVuKCZydGgpOworCisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlpZiAoaWRldiB8fCBvZGV2KSAgeworCQlpbnQgaWR4OworCisJCWlmIChpZGV2KSB7CisJCQlpZHggPSB4bGxfbmFtZV90b19pbmRleChpZGV2KTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfSUlGLCBpZHgpOworCQl9CisJCWlmIChvZGV2KSB7CisJCQlpZHggPSB4bGxfbmFtZV90b19pbmRleChvZGV2KTsKKwkJCWFkZGF0dHIzMigmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfT0lGLCBpZHgpOworCQl9CisJfQorCisJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCXJlcS5yLnJ0bV9mYW1pbHkgPSBBRl9JTkVUOworCX0KKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAwLCAwLCAmcmVxLm4sIE5VTEwsIE5VTEwpIDwgMCkgeworCQlyZXR1cm4gMjsKKwl9CisKKwlpZiAoY29ubmVjdGVkICYmICFmcm9tX29rKSB7CisJCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEoJnJlcS5uKTsKKwkJaW50IGxlbiA9IHJlcS5uLm5sbXNnX2xlbjsKKwkJc3RydWN0IHJ0YXR0ciAqIHRiW1JUQV9NQVgrMV07CisKKwkJcHJpbnRfcm91dGUoTlVMTCwgJnJlcS5uLCBOVUxMKTsKKworCQlpZiAocmVxLm4ubmxtc2dfdHlwZSAhPSBSVE1fTkVXUk9VVEUpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgYSByb3V0ZT8iKTsKKwkJfQorCQlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCQlpZiAobGVuIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndyb25nIGxlbiAlZCIsIGxlbik7CisJCX0KKworCQltZW1zZXQodGIsIDAsIHNpemVvZih0YikpOworCQlwYXJzZV9ydGF0dHIodGIsIFJUQV9NQVgsIFJUTV9SVEEociksIGxlbik7CisKKwkJaWYgKHRiW1JUQV9QUkVGU1JDXSkgeworCQkJdGJbUlRBX1BSRUZTUkNdLT5ydGFfdHlwZSA9IFJUQV9TUkM7CisJCQlyLT5ydG1fc3JjX2xlbiA9IDgqUlRBX1BBWUxPQUQodGJbUlRBX1BSRUZTUkNdKTsKKwkJfSBlbHNlIGlmICghdGJbUlRBX1NSQ10pIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjb25uZWN0IHRoZSByb3V0ZSIpOworCQl9CisJCWlmICghb2RldiAmJiB0YltSVEFfT0lGXSkgeworCQkJdGJbUlRBX09JRl0tPnJ0YV90eXBlID0gMDsKKwkJfQorCQlpZiAodGJbUlRBX0dBVEVXQVldKSB7CisJCQl0YltSVEFfR0FURVdBWV0tPnJ0YV90eXBlID0gMDsKKwkJfQorCQlpZiAoIWlkZXYgJiYgdGJbUlRBX0lJRl0pIHsKKwkJCXRiW1JUQV9JSUZdLT5ydGFfdHlwZSA9IDA7CisJCX0KKwkJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlyZXEubi5ubG1zZ190eXBlID0gUlRNX0dFVFJPVVRFOworCisJCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAwLCAwLCAmcmVxLm4sIE5VTEwsIE5VTEwpIDwgMCkgeworCQkJcmV0dXJuIDI7CisJCX0KKwl9CisJcHJpbnRfcm91dGUoTlVMTCwgJnJlcS5uLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworaW50IEZBU1RfRlVOQyBkb19pcHJvdXRlKGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGlwX3JvdXRlX2NvbW1hbmRzW10gQUxJR04xID0KKwkvKjAtMyovCSJhZGRcMCIiYXBwZW5kXDAiImNoYW5nZVwwIiJjaGdcMCIKKwkvKjQtNyovCSJkZWxldGVcMCIiZ2V0XDAiImxpc3RcMCIic2hvd1wwIgorCS8qOC4uKi8JInByZXBlbmRcMCIicmVwbGFjZVwwIiJ0ZXN0XDAiImZsdXNoXDAiOworCWludCBjb21tYW5kX251bTsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisJaW50IGNtZCA9IFJUTV9ORVdST1VURTsKKworCWlmICghKmFyZ3YpCisJCXJldHVybiBpcHJvdXRlX2xpc3Rfb3JfZmx1c2goYXJndiwgMCk7CisKKwkvKiAiU3RhbmRhcmQiICdpcCByIGEnIHRyZWF0cyAnYScgYXMgJ2FkZCcsIG5vdCAnYXBwZW5kJyAqLworCS8qIEl0IHByb2JhYmx5IG1lYW5zIHRoYXQgaXQgaXMgdXNpbmcgImZpcnN0IG1hdGNoIiBydWxlICovCisJY29tbWFuZF9udW0gPSBpbmRleF9pbl9zdWJzdHJpbmdzKGlwX3JvdXRlX2NvbW1hbmRzLCAqYXJndik7CisKKwlzd2l0Y2ggKGNvbW1hbmRfbnVtKSB7CisJCWNhc2UgMDogLyogYWRkICovCisJCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogYXBwZW5kICovCisJCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9BUFBFTkQ7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBjaGFuZ2UgKi8KKwkJY2FzZSAzOiAvKiBjaGcgKi8KKwkJCWZsYWdzID0gTkxNX0ZfUkVQTEFDRTsKKwkJCWJyZWFrOworCQljYXNlIDQ6IC8qIGRlbGV0ZSAqLworCQkJY21kID0gUlRNX0RFTFJPVVRFOworCQkJYnJlYWs7CisJCWNhc2UgNTogLyogZ2V0ICovCisJCQlyZXR1cm4gaXByb3V0ZV9nZXQoYXJndisxKTsKKwkJY2FzZSA2OiAvKiBsaXN0ICovCisJCWNhc2UgNzogLyogc2hvdyAqLworCQkJcmV0dXJuIGlwcm91dGVfbGlzdF9vcl9mbHVzaChhcmd2KzEsIDApOworCQljYXNlIDg6IC8qIHByZXBlbmQgKi8KKwkJCWZsYWdzID0gTkxNX0ZfQ1JFQVRFOworCQkJYnJlYWs7CisJCWNhc2UgOTogLyogcmVwbGFjZSAqLworCQkJZmxhZ3MgPSBOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRTsKKwkJCWJyZWFrOworCQljYXNlIDEwOiAvKiB0ZXN0ICovCisJCQlmbGFncyA9IE5MTV9GX0VYQ0w7CisJCQlicmVhazsKKwkJY2FzZSAxMTogLyogZmx1c2ggKi8KKwkJCXJldHVybiBpcHJvdXRlX2xpc3Rfb3JfZmx1c2goYXJndisxLCAxKTsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIGNvbW1hbmQgJXMiLCAqYXJndik7CisJfQorCisJcmV0dXJuIGlwcm91dGVfbW9kaWZ5KGNtZCwgZmxhZ3MsIGFyZ3YrMSk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBydWxlLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBydWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzMjY1YwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHJ1bGUuYwpAQCAtMCwwICsxLDMxNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogQ2hhbmdlczoKKyAqCisgKiBSYW5pIEFzc2FmIDxyYW5pQG1hZ2ljLm1ldGF3aXJlLmNvbT4gOTgwOTI5OiByZXNvbHZlIGFkZHJlc3NlcworICogaW5pdGlhbGx5IGludGVncmF0ZWQgaW50byBidXN5Ym94IGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICovCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisvKgorc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpcCBydWxlIFsgbGlzdCB8IGFkZCB8IGRlbCBdIFNFTEVDVE9SIEFDVElPTlxuIik7CisJZnByaW50ZihzdGRlcnIsICJTRUxFQ1RPUiA6PSBbIGZyb20gUFJFRklYIF0gWyB0byBQUkVGSVggXSBbIHRvcyBUT1MgXSBbIGZ3bWFyayBGV01BUksgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICBbIGRldiBTVFJJTkcgXSBbIHByZWYgTlVNQkVSIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiQUNUSU9OIDo9IFsgdGFibGUgVEFCTEVfSUQgXSBbIG5hdCBBRERSRVNTIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgIFsgcHJvaGliaXQgfCByZWplY3QgfCB1bnJlYWNoYWJsZSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIHJlYWxtcyBbU1JDUkVBTE0vXURTVFJFQUxNIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiVEFCTEVfSUQgOj0gWyBsb2NhbCB8IG1haW4gfCBkZWZhdWx0IHwgTlVNQkVSIF1cbiIpOworCWV4aXQoLTEpOworfQorKi8KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcHJpbnRfcnVsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCQkJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJaW50IGhvc3RfbGVuID0gLTE7CisJc3RydWN0IHJ0YXR0ciAqIHRiW1JUQV9NQVgrMV07CisJY2hhciBhYnVmWzI1Nl07CisJU1BSSU5UX0JVRihiMSk7CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXUlVMRSkKKwkJcmV0dXJuIDA7CisKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQodGIsIDAsIHNpemVvZih0YikpOworCXBhcnNlX3J0YXR0cih0YiwgUlRBX01BWCwgUlRNX1JUQShyKSwgbGVuKTsKKworCWlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQpCisJCWhvc3RfbGVuID0gMzI7CisJZWxzZSBpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJaG9zdF9sZW4gPSAxMjg7CisvKgllbHNlIGlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0RFQ25ldCkKKwkJaG9zdF9sZW4gPSAxNjsKKwllbHNlIGlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lQWCkKKwkJaG9zdF9sZW4gPSA4MDsKKyovCisJcHJpbnRmKCIldTpcdCIsIHRiW1JUQV9QUklPUklUWV0gPworCQkJCQkqKHVuc2lnbmVkKilSVEFfREFUQSh0YltSVEFfUFJJT1JJVFldKQorCQkJCQk6IDApOworCXByaW50ZigiZnJvbSAiKTsKKwlpZiAodGJbUlRBX1NSQ10pIHsKKwkJaWYgKHItPnJ0bV9zcmNfbGVuICE9IGhvc3RfbGVuKSB7CisJCQlwcmludGYoIiVzLyV1IiwgcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkJCQkgUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJCSBhYnVmLCBzaXplb2YoYWJ1ZikpLAorCQkJCXItPnJ0bV9zcmNfbGVuCisJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCWZwdXRzKGZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCQkgICAgICAgUlRBX1BBWUxPQUQodGJbUlRBX1NSQ10pLAorCQkJCQkJICAgICAgIFJUQV9EQVRBKHRiW1JUQV9TUkNdKSwKKwkJCQkJCSAgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpLCBzdGRvdXQpOworCQl9CisJfSBlbHNlIGlmIChyLT5ydG1fc3JjX2xlbikgeworCQlwcmludGYoIjAvJWQiLCByLT5ydG1fc3JjX2xlbik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJhbGwiKTsKKwl9CisJYmJfcHV0Y2hhcignICcpOworCisJaWYgKHRiW1JUQV9EU1RdKSB7CisJCWlmIChyLT5ydG1fZHN0X2xlbiAhPSBob3N0X2xlbikgeworCQkJcHJpbnRmKCJ0byAlcy8ldSAiLCBydF9hZGRyX24yYShyLT5ydG1fZmFtaWx5LAorCQkJCQkJCSBSVEFfREFUQSh0YltSVEFfRFNUXSksCisJCQkJCQkJIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJci0+cnRtX2RzdF9sZW4KKwkJCQkpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJ0byAlcyAiLCBmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJICAgICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9EU1RdKSwKKwkJCQkJCSAgICAgICBSVEFfREFUQSh0YltSVEFfRFNUXSksCisJCQkJCQkgICAgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9kc3RfbGVuKSB7CisJCXByaW50ZigidG8gMC8lZCAiLCByLT5ydG1fZHN0X2xlbik7CisJfQorCisJaWYgKHItPnJ0bV90b3MpIHsKKwkJcHJpbnRmKCJ0b3MgJXMgIiwgcnRubF9kc2ZpZWxkX24yYShyLT5ydG1fdG9zLCBiMSkpOworCX0KKwlpZiAodGJbUlRBX1BST1RPSU5GT10pIHsKKwkJcHJpbnRmKCJmd21hcmsgJSN4ICIsICoodWludDMyX3QqKVJUQV9EQVRBKHRiW1JUQV9QUk9UT0lORk9dKSk7CisJfQorCisJaWYgKHRiW1JUQV9JSUZdKSB7CisJCXByaW50ZigiaWlmICVzICIsIChjaGFyKilSVEFfREFUQSh0YltSVEFfSUlGXSkpOworCX0KKworCWlmIChyLT5ydG1fdGFibGUpCisJCXByaW50ZigibG9va3VwICVzICIsIHJ0bmxfcnR0YWJsZV9uMmEoci0+cnRtX3RhYmxlLCBiMSkpOworCisJaWYgKHRiW1JUQV9GTE9XXSkgeworCQl1aW50MzJfdCB0byA9ICoodWludDMyX3QqKVJUQV9EQVRBKHRiW1JUQV9GTE9XXSk7CisJCXVpbnQzMl90IGZyb20gPSB0bz4+MTY7CisJCXRvICY9IDB4RkZGRjsKKwkJaWYgKGZyb20pIHsKKwkJCXByaW50ZigicmVhbG1zICVzLyIsCisJCQkJcnRubF9ydHJlYWxtX24yYShmcm9tLCBiMSkpOworCQl9CisJCXByaW50ZigiJXMgIiwKKwkJCXJ0bmxfcnRyZWFsbV9uMmEodG8sIGIxKSk7CisJfQorCisJaWYgKHItPnJ0bV90eXBlID09IFJUTl9OQVQpIHsKKwkJaWYgKHRiW1JUQV9HQVRFV0FZXSkgeworCQkJcHJpbnRmKCJtYXAtdG8gJXMgIiwKKwkJCQlmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkgICAgUlRBX1BBWUxPQUQodGJbUlRBX0dBVEVXQVldKSwKKwkJCQkJICAgIFJUQV9EQVRBKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJCSAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIm1hc3F1ZXJhZGUiKTsKKwl9IGVsc2UgaWYgKHItPnJ0bV90eXBlICE9IFJUTl9VTklDQVNUKQorCQlmcHV0cyhydG5sX3J0bnR5cGVfbjJhKHItPnJ0bV90eXBlLCBiMSksIHN0ZG91dCk7CisKKwliYl9wdXRjaGFyKCdcbicpOworCS8qZmZsdXNoX2FsbCgpOyovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXBydWxlX2xpc3QoY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlpbnQgYWYgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKGFmID09IEFGX1VOU1BFQykKKwkJYWYgPSBBRl9JTkVUOworCisJaWYgKCphcmd2KSB7CisJCS8vYmJfZXJyb3JfbXNnKCJcInJ1bGUgc2hvd1wiIG5lZWRzIG5vIGFyZ3VtZW50cyIpOworCQliYl93YXJuX2lnbm9yaW5nX2FyZ3MoKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCisJeHJ0bmxfb3BlbigmcnRoKTsKKworCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgYWYsIFJUTV9HRVRSVUxFKTsKKwl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9ydWxlLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwcnVsZV9tb2RpZnkoaW50IGNtZCwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkiZnJvbVwwIiJ0b1wwIiJwcmVmZXJlbmNlXDAiIm9yZGVyXDAiInByaW9yaXR5XDAiCisJCSJ0b3NcMCIiZndtYXJrXDAiInJlYWxtc1wwIiJ0YWJsZVwwIiJsb29rdXBcMCIiZGV2XDAiCisJCSJpaWZcMCIibmF0XDAiIm1hcC10b1wwIiJ0eXBlXDAiImhlbHBcMCI7CisJZW51bSB7CisJCUFSR19mcm9tID0gMSwgQVJHX3RvLCBBUkdfcHJlZmVyZW5jZSwgQVJHX29yZGVyLCBBUkdfcHJpb3JpdHksCisJCUFSR190b3MsIEFSR19md21hcmssIEFSR19yZWFsbXMsIEFSR190YWJsZSwgQVJHX2xvb2t1cCwgQVJHX2RldiwKKwkJQVJHX2lpZiwgQVJHX25hdCwgQVJHX21hcF90bywgQVJHX3R5cGUsIEFSR19oZWxwCisJfTsKKwlib29sIHRhYmxlX29rID0gMDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBuOworCQlzdHJ1Y3QgcnRtc2cgICAgcjsKKwkJY2hhciAgICAgICAgICAgIGJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwlzbWFsbHVpbnQga2V5OworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLnIucnRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJcmVxLnIucnRtX3Byb3RvY29sID0gUlRQUk9UX0JPT1Q7CisJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7CisJcmVxLnIucnRtX3RhYmxlID0gMDsKKwlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTlNQRUM7CisKKwlpZiAoY21kID09IFJUTV9ORVdSVUxFKSB7CisJCXJlcS5uLm5sbXNnX2ZsYWdzIHw9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOworCQlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOworCX0KKworCXdoaWxlICgqYXJndikgeworCQlrZXkgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndikgKyAxOworCQlpZiAoa2V5ID09IDApIC8qIG5vIG1hdGNoIGZvdW5kIGluIGtleXdvcmRzIGFycmF5LCBiYWlsIG91dC4gKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgKmFyZ3YsIGFwcGxldF9uYW1lKTsKKwkJaWYgKGtleSA9PSBBUkdfZnJvbSkgeworCQkJaW5ldF9wcmVmaXggZHN0OworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJcmVxLnIucnRtX3NyY19sZW4gPSBkc3QuYml0bGVuOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9TUkMsICZkc3QuZGF0YSwgZHN0LmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfdG8pIHsKKwkJCWluZXRfcHJlZml4IGRzdDsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfcHJlZml4KCZkc3QsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCXJlcS5yLnJ0bV9kc3RfbGVuID0gZHN0LmJpdGxlbjsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfRFNULCAmZHN0LmRhdGEsIGRzdC5ieXRlbGVuKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3ByZWZlcmVuY2UgfHwKKwkJCSAgIGtleSA9PSBBUkdfb3JkZXIgfHwKKwkJCSAgIGtleSA9PSBBUkdfcHJpb3JpdHkKKwkJKSB7CisJCQl1aW50MzJfdCBwcmVmOworCQkJTkVYVF9BUkcoKTsKKwkJCXByZWYgPSBnZXRfdTMyKCphcmd2LCAicHJlZmVyZW5jZSIpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9QUklPUklUWSwgcHJlZik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR190b3MpIHsKKwkJCXVpbnQzMl90IHRvczsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9kc2ZpZWxkX2EybigmdG9zLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAiVE9TIik7CisJCQlyZXEuci5ydG1fdG9zID0gdG9zOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfZndtYXJrKSB7CisJCQl1aW50MzJfdCBmd21hcms7CisJCQlORVhUX0FSRygpOworCQkJZndtYXJrID0gZ2V0X3UzMigqYXJndiwgImZ3bWFyayIpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9QUk9UT0lORk8sIGZ3bWFyayk7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19yZWFsbXMpIHsKKwkJCXVpbnQzMl90IHJlYWxtOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChnZXRfcnRfcmVhbG1zKCZyZWFsbSwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInJlYWxtcyIpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9GTE9XLCByZWFsbSk7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR190YWJsZSB8fAorCQkJICAga2V5ID09IEFSR19sb29rdXAKKwkJKSB7CisJCQl1aW50MzJfdCB0aWQ7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfcnR0YWJsZV9hMm4oJnRpZCwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInRhYmxlIElEIik7CisJCQlyZXEuci5ydG1fdGFibGUgPSB0aWQ7CisJCQl0YWJsZV9vayA9IDE7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19kZXYgfHwKKwkJCSAgIGtleSA9PSBBUkdfaWlmCisJCSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfSUlGLCAqYXJndiwgc3RybGVuKCphcmd2KSsxKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX25hdCB8fAorCQkJICAga2V5ID09IEFSR19tYXBfdG8KKwkJKSB7CisJCQlORVhUX0FSRygpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9HQVRFV0FZLCBnZXRfYWRkcjMyKCphcmd2KSk7CisJCQlyZXEuci5ydG1fdHlwZSA9IFJUTl9OQVQ7CisJCX0gZWxzZSB7CisJCQlpbnQgdHlwZTsKKworCQkJaWYgKGtleSA9PSBBUkdfdHlwZSkgeworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQlpZiAoa2V5ID09IEFSR19oZWxwKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCWlmIChydG5sX3J0bnR5cGVfYTJuKCZ0eXBlLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAidHlwZSIpOworCQkJcmVxLnIucnRtX3R5cGUgPSB0eXBlOworCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCXJlcS5yLnJ0bV9mYW1pbHkgPSBBRl9JTkVUOworCisJaWYgKCF0YWJsZV9vayAmJiBjbWQgPT0gUlRNX05FV1JVTEUpCisJCXJlcS5yLnJ0bV90YWJsZSA9IFJUX1RBQkxFX01BSU47CisKKwl4cnRubF9vcGVuKCZydGgpOworCisJaWYgKHJ0bmxfdGFsaygmcnRoLCAmcmVxLm4sIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIDI7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworaW50IEZBU1RfRlVOQyBkb19pcHJ1bGUoY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaXBfcnVsZV9jb21tYW5kc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiZGVsZXRlXDAiImxpc3RcMCIic2hvd1wwIjsKKwlpZiAoKmFyZ3YpIHsKKwkJc21hbGx1aW50IGNtZCA9IGluZGV4X2luX3N1YnN0cmluZ3MoaXBfcnVsZV9jb21tYW5kcywgKmFyZ3YpOworCQlpZiAoY21kID4gMykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgKmFyZ3YsIGFwcGxldF9uYW1lKTsKKwkJYXJndisrOworCQlpZiAoY21kIDwgMikKKwkJCXJldHVybiBpcHJ1bGVfbW9kaWZ5KChjbWQgPT0gMCkgPyBSVE1fTkVXUlVMRSA6IFJUTV9ERUxSVUxFLCBhcmd2KTsKKwl9CisJcmV0dXJuIGlwcnVsZV9saXN0KGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwdHVubmVsLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXB0dW5uZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQyZmVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwdHVubmVsLmMKQEAgLTAsMCArMSw1NzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5MzA6IGRvIG5vdCBhbGxvdyBrZXkgZm9yIGlwaXAvc2l0CisgKiBQaGlsIEthcm4gPGthcm5Aa2E5cS5hbXByLm9yZz4gICAgICAgOTkwNDA4OiAicG10dWRpc2MiIGZsYWcKKyAqLworCisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmbmRlZiBfX2NvbnN0YW50X2h0b25zCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMgaHRvbnMKKyNlbmRpZgorCisvLyBGWUk6ICNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgMHg4OUYwCisKKy8qIEZyb20gbGludXgvaWZfdHVubmVsLmguICNpbmNsdWRpbmcgaXQgcHJvdmVkIHRyb3VibGVzb21lCisgKiAocmVkZWZpbml0b24gZXJyb3JzIGR1ZSB0byBuYW1lIGNvbGxpc2lvbnMgaW4gbGludXgvIGFuZCBuZXRbaW5ldF0vKSAqLworI2RlZmluZSBTSU9DR0VUVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMCkKKyNkZWZpbmUgU0lPQ0FERFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NERUxUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DQ0hHVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMykKKy8vI2RlZmluZSBTSU9DR0VUUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNCkKKy8vI2RlZmluZSBTSU9DQUREUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNSkKKy8vI2RlZmluZSBTSU9DREVMUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNikKKy8vI2RlZmluZSBTSU9DQ0hHUFJMICAgICAgKFNJT0NERVZQUklWQVRFICsgNykKKyNkZWZpbmUgR1JFX0NTVU0gICAgICAgIF9fY29uc3RhbnRfaHRvbnMoMHg4MDAwKQorLy8jZGVmaW5lIEdSRV9ST1VUSU5HICAgICBfX2NvbnN0YW50X2h0b25zKDB4NDAwMCkKKyNkZWZpbmUgR1JFX0tFWSAgICAgICAgIF9fY29uc3RhbnRfaHRvbnMoMHgyMDAwKQorI2RlZmluZSBHUkVfU0VRICAgICAgICAgX19jb25zdGFudF9odG9ucygweDEwMDApCisvLyNkZWZpbmUgR1JFX1NUUklDVCAgICAgIF9fY29uc3RhbnRfaHRvbnMoMHgwODAwKQorLy8jZGVmaW5lIEdSRV9SRUMgICAgICAgICBfX2NvbnN0YW50X2h0b25zKDB4MDcwMCkKKy8vI2RlZmluZSBHUkVfRkxBR1MgICAgICAgX19jb25zdGFudF9odG9ucygweDAwRjgpCisvLyNkZWZpbmUgR1JFX1ZFUlNJT04gICAgIF9fY29uc3RhbnRfaHRvbnMoMHgwMDA3KQorc3RydWN0IGlwX3R1bm5lbF9wYXJtIHsKKwljaGFyICAgICAgICAgICAgbmFtZVtJRk5BTVNJWl07CisJaW50ICAgICAgICAgICAgIGxpbms7CisJdWludDE2X3QgICAgICAgIGlfZmxhZ3M7CisJdWludDE2X3QgICAgICAgIG9fZmxhZ3M7CisJdWludDMyX3QgICAgICAgIGlfa2V5OworCXVpbnQzMl90ICAgICAgICBvX2tleTsKKwlzdHJ1Y3QgaXBoZHIgICAgaXBoOworfTsKKy8qIFNJVC1tb2RlIGlfZmxhZ3MgKi8KKy8vI2RlZmluZSBTSVRfSVNBVEFQIDB4MDAwMQorLy9zdHJ1Y3QgaXBfdHVubmVsX3BybCB7CisvLwl1aW50MzJfdCAgICAgICAgICBhZGRyOworLy8JdWludDE2X3QgICAgICAgICAgZmxhZ3M7CisvLwl1aW50MTZfdCAgICAgICAgICBfX3Jlc2VydmVkOworLy8JdWludDMyX3QgICAgICAgICAgZGF0YWxlbjsKKy8vCXVpbnQzMl90ICAgICAgICAgIF9fcmVzZXJ2ZWQyOworLy8JLyogZGF0YSBmb2xsb3dzICovCisvL307CisvLy8qIFBSTCBmbGFncyAqLworLy8jZGVmaW5lIFBSTF9ERUZBVUxUIDB4MDAwMQorCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisKKy8qIERpZXMgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgZG9faW9jdGxfZ2V0X2lmaW5kZXgoY2hhciAqZGV2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCXhpb2N0bChmZCwgU0lPQ0dJRklOREVYLCAmaWZyKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGlmci5pZnJfaWZpbmRleDsKK30KKworc3RhdGljIGludCBkb19pb2N0bF9nZXRfaWZ0eXBlKGNoYXIgKmRldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKwlpbnQgZXJyOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWVyciA9IGlvY3RsX29yX3dhcm4oZmQsIFNJT0NHSUZIV0FERFIsICZpZnIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gZXJyID8gLTEgOiBpZnIuaWZyX2FkZHIuc2FfZmFtaWx5OworfQorCitzdGF0aWMgY2hhciAqZG9faW9jdGxfZ2V0X2lmbmFtZShpbnQgaWR4KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWludCBlcnI7CisKKwlpZnIuaWZyX2lmaW5kZXggPSBpZHg7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWVyciA9IGlvY3RsX29yX3dhcm4oZmQsIFNJT0NHSUZOQU1FLCAmaWZyKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGVyciA/IE5VTEwgOiB4c3RybmR1cChpZnIuaWZyX25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKK30KKworc3RhdGljIGludCBkb19nZXRfaW9jdGwoY29uc3QgY2hhciAqYmFzZWRldiwgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWludCBlcnI7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgYmFzZWRldik7CisJaWZyLmlmcl9pZnJ1LmlmcnVfZGF0YSA9ICh2b2lkKilwOworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwllcnIgPSBpb2N0bF9vcl93YXJuKGZkLCBTSU9DR0VUVFVOTkVMLCAmaWZyKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGVycjsKK30KKworLyogRGllcyBvbiBlcnJvciwgb3RoZXJ3aXNlIHJldHVybnMgMCAqLworc3RhdGljIGludCBkb19hZGRfaW9jdGwoaW50IGNtZCwgY29uc3QgY2hhciAqYmFzZWRldiwgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCisJaWYgKGNtZCA9PSBTSU9DQ0hHVFVOTkVMICYmIHAtPm5hbWVbMF0pIHsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIHAtPm5hbWUpOworCX0gZWxzZSB7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBiYXNlZGV2KTsKKwl9CisJaWZyLmlmcl9pZnJ1LmlmcnVfZGF0YSA9ICh2b2lkKilwOworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyNpZiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUgorCS8qICNkZWZpbmUgbWFnaWMgd2lsbCB0dXJuIGlvY3RsIyBpbnRvIHN0cmluZyAqLworCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCkKKwkJeGlvY3RsKGZkLCBTSU9DQ0hHVFVOTkVMLCAmaWZyKTsKKwllbHNlCisJCXhpb2N0bChmZCwgU0lPQ0FERFRVTk5FTCwgJmlmcik7CisjZWxzZQorCXhpb2N0bChmZCwgY21kLCAmaWZyKTsKKyNlbmRpZgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gMDsKK30KKworLyogRGllcyBvbiBlcnJvciwgb3RoZXJ3aXNlIHJldHVybnMgMCAqLworc3RhdGljIGludCBkb19kZWxfaW9jdGwoY29uc3QgY2hhciAqYmFzZWRldiwgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCisJaWYgKHAtPm5hbWVbMF0pIHsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIHAtPm5hbWUpOworCX0gZWxzZSB7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBiYXNlZGV2KTsKKwl9CisJaWZyLmlmcl9pZnJ1LmlmcnVfZGF0YSA9ICh2b2lkKilwOworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwl4aW9jdGwoZmQsIFNJT0NERUxUVU5ORUwsICZpZnIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gMDsKK30KKworLyogRGllcyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgcGFyc2VfYXJncyhjaGFyICoqYXJndiwgaW50IGNtZCwgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJIm1vZGVcMCIiaXBpcFwwIiJpcC9pcFwwIiJncmVcMCIiZ3JlL2lwXDAiInNpdFwwIiJpcHY2L2lwXDAiCisJCSJrZXlcMCIiaWtleVwwIiJva2V5XDAiInNlcVwwIiJpc2VxXDAiIm9zZXFcMCIKKwkJImNzdW1cMCIiaWNzdW1cMCIib2NzdW1cMCIibm9wbXR1ZGlzY1wwIiJwbXR1ZGlzY1wwIgorCQkicmVtb3RlXDAiImFueVwwIiJsb2NhbFwwIiJkZXZcMCIKKwkJInR0bFwwIiJpbmhlcml0XDAiInRvc1wwIiJkc2ZpZWxkXDAiCisJCSJuYW1lXDAiOworCWVudW0geworCQlBUkdfbW9kZSwgQVJHX2lwaXAsIEFSR19pcF9pcCwgQVJHX2dyZSwgQVJHX2dyZV9pcCwgQVJHX3NpdCwgQVJHX2lwNl9pcCwKKwkJQVJHX2tleSwgQVJHX2lrZXksIEFSR19va2V5LCBBUkdfc2VxLCBBUkdfaXNlcSwgQVJHX29zZXEsCisJCUFSR19jc3VtLCBBUkdfaWNzdW0sIEFSR19vY3N1bSwgQVJHX25vcG10dWRpc2MsIEFSR19wbXR1ZGlzYywKKwkJQVJHX3JlbW90ZSwgQVJHX2FueSwgQVJHX2xvY2FsLCBBUkdfZGV2LAorCQlBUkdfdHRsLCBBUkdfaW5oZXJpdCwgQVJHX3RvcywgQVJHX2RzZmllbGQsCisJCUFSR19uYW1lCisJfTsKKwlpbnQgY291bnQgPSAwOworCWNoYXIgbWVkaXVtW0lGTkFNU0laXTsKKwlpbnQga2V5OworCisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCW1lZGl1bVswXSA9ICdcMCc7CisKKwlwLT5pcGgudmVyc2lvbiA9IDQ7CisJcC0+aXBoLmlobCA9IDU7CisjaWZuZGVmIElQX0RGCisjZGVmaW5lIElQX0RGIDB4NDAwMCAgLyogRmxhZzogIkRvbid0IEZyYWdtZW50IiAqLworI2VuZGlmCisJcC0+aXBoLmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCisJd2hpbGUgKCphcmd2KSB7CisJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGtleSA9PSBBUkdfbW9kZSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChrZXkgPT0gQVJHX2lwaXAgfHwKKwkJCSAgICBrZXkgPT0gQVJHX2lwX2lwCisJCQkpIHsKKwkJCQlpZiAocC0+aXBoLnByb3RvY29sICYmIHAtPmlwaC5wcm90b2NvbCAhPSBJUFBST1RPX0lQSVApIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHR1bm5lbCBtb2RlIiwgInlvdSBtYW5hZ2VkIHRvIGFzayBmb3IgbW9yZSB0aGFuIG9uZSIpOworCQkJCX0KKwkJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CisJCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfZ3JlIHx8CisJCQkJICAga2V5ID09IEFSR19ncmVfaXAKKwkJCSkgeworCQkJCWlmIChwLT5pcGgucHJvdG9jb2wgJiYgcC0+aXBoLnByb3RvY29sICE9IElQUFJPVE9fR1JFKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB0dW5uZWwgbW9kZSIsICJ5b3UgbWFuYWdlZCB0byBhc2sgZm9yIG1vcmUgdGhhbiBvbmUiKTsKKwkJCQl9CisJCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19HUkU7CisJCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfc2l0IHx8CisJCQkJICAga2V5ID09IEFSR19pcDZfaXAKKwkJCSkgeworCQkJCWlmIChwLT5pcGgucHJvdG9jb2wgJiYgcC0+aXBoLnByb3RvY29sICE9IElQUFJPVE9fSVBWNikgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdHVubmVsIG1vZGUiLCAieW91IG1hbmFnZWQgdG8gYXNrIGZvciBtb3JlIHRoYW4gb25lIik7CisJCQkJfQorCQkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBWNjsKKwkJCX0gZWxzZSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHR1bm5lbCBtb2RlIiwgImNhbid0IGd1ZXNzIik7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19rZXkpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJcC0+aV9mbGFncyB8PSBHUkVfS0VZOworCQkJcC0+b19mbGFncyB8PSBHUkVfS0VZOworCQkJaWYgKHN0cmNocigqYXJndiwgJy4nKSkKKwkJCQlwLT5pX2tleSA9IHAtPm9fa2V5ID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQllbHNlIHsKKwkJCQl1dmFsID0gZ2V0X3Vuc2lnbmVkKCphcmd2LCAia2V5Iik7CisJCQkJcC0+aV9rZXkgPSBwLT5vX2tleSA9IGh0b25sKHV2YWwpOworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfaWtleSkgeworCQkJdW5zaWduZWQgdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlwLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXAtPm9fa2V5ID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQllbHNlIHsKKwkJCQl1dmFsID0gZ2V0X3Vuc2lnbmVkKCphcmd2LCAiaWtleSIpOworCQkJCXAtPmlfa2V5ID0gaHRvbmwodXZhbCk7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19va2V5KSB7CisJCQl1bnNpZ25lZCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJcC0+b19rZXkgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJCWVsc2UgeworCQkJCXV2YWwgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJva2V5Iik7CisJCQkJcC0+b19rZXkgPSBodG9ubCh1dmFsKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3NlcSkgeworCQkJcC0+aV9mbGFncyB8PSBHUkVfU0VROworCQkJcC0+b19mbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfaXNlcSkgeworCQkJcC0+aV9mbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfb3NlcSkgeworCQkJcC0+b19mbGFncyB8PSBHUkVfU0VROworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfY3N1bSkgeworCQkJcC0+aV9mbGFncyB8PSBHUkVfQ1NVTTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19pY3N1bSkgeworCQkJcC0+aV9mbGFncyB8PSBHUkVfQ1NVTTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX29jc3VtKSB7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfbm9wbXR1ZGlzYykgeworCQkJcC0+aXBoLmZyYWdfb2ZmID0gMDsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3BtdHVkaXNjKSB7CisJCQlwLT5pcGguZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19yZW1vdGUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAoa2V5ICE9IEFSR19hbnkpCisJCQkJcC0+aXBoLmRhZGRyID0gZ2V0X2FkZHIzMigqYXJndik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19sb2NhbCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChrZXkgIT0gQVJHX2FueSkKKwkJCQlwLT5pcGguc2FkZHIgPSBnZXRfYWRkcjMyKCphcmd2KTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2RldikgeworCQkJTkVYVF9BUkcoKTsKKwkJCXN0cm5jcHlfSUZOQU1TSVoobWVkaXVtLCAqYXJndik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR190dGwpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKGtleSAhPSBBUkdfaW5oZXJpdCkgeworCQkJCXV2YWwgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJUVEwiKTsKKwkJCQlpZiAodXZhbCA+IDI1NSkKKwkJCQkJaW52YXJnKCphcmd2LCAiVFRMIG11c3QgYmUgPD0yNTUiKTsKKwkJCQlwLT5pcGgudHRsID0gdXZhbDsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3RvcyB8fAorCQkJICAga2V5ID09IEFSR19kc2ZpZWxkCisJCSkgeworCQkJdWludDMyX3QgdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAoa2V5ICE9IEFSR19pbmhlcml0KSB7CisJCQkJaWYgKHJ0bmxfZHNmaWVsZF9hMm4oJnV2YWwsICphcmd2KSkKKwkJCQkJaW52YXJnKCphcmd2LCAiVE9TIik7CisJCQkJcC0+aXBoLnRvcyA9IHV2YWw7CisJCQl9IGVsc2UKKwkJCQlwLT5pcGgudG9zID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChrZXkgPT0gQVJHX25hbWUpIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKHAtPm5hbWVbMF0pCisJCQkJZHVwYXJnMigibmFtZSIsICphcmd2KTsKKwkJCXN0cm5jcHlfSUZOQU1TSVoocC0+bmFtZSwgKmFyZ3YpOworCQkJaWYgKGNtZCA9PSBTSU9DQ0hHVFVOTkVMICYmIGNvdW50ID09IDApIHsKKwkJCQlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gb2xkX3A7CisJCQkJbWVtc2V0KCZvbGRfcCwgMCwgc2l6ZW9mKG9sZF9wKSk7CisJCQkJaWYgKGRvX2dldF9pb2N0bCgqYXJndiwgJm9sZF9wKSkKKwkJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJCSpwID0gb2xkX3A7CisJCQl9CisJCX0KKwkJY291bnQrKzsKKwkJYXJndisrOworCX0KKworCWlmIChwLT5pcGgucHJvdG9jb2wgPT0gMCkgeworCQlpZiAobWVtY21wKHAtPm5hbWUsICJncmUiLCAzKSA9PSAwKQorCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19HUkU7CisJCWVsc2UgaWYgKG1lbWNtcChwLT5uYW1lLCAiaXBpcCIsIDQpID09IDApCisJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CisJCWVsc2UgaWYgKG1lbWNtcChwLT5uYW1lLCAic2l0IiwgMykgPT0gMCkKKwkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBWNjsKKwl9CisKKwlpZiAocC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fSVBJUCB8fCBwLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19JUFY2KSB7CisJCWlmICgocC0+aV9mbGFncyAmIEdSRV9LRVkpIHx8IChwLT5vX2ZsYWdzICYgR1JFX0tFWSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJrZXlzIGFyZSBub3QgYWxsb3dlZCB3aXRoIGlwaXAgYW5kIHNpdCIpOworCQl9CisJfQorCisJaWYgKG1lZGl1bVswXSkgeworCQlwLT5saW5rID0gZG9faW9jdGxfZ2V0X2lmaW5kZXgobWVkaXVtKTsKKwl9CisKKwlpZiAocC0+aV9rZXkgPT0gMCAmJiBJTl9NVUxUSUNBU1QobnRvaGwocC0+aXBoLmRhZGRyKSkpIHsKKwkJcC0+aV9rZXkgPSBwLT5pcGguZGFkZHI7CisJCXAtPmlfZmxhZ3MgfD0gR1JFX0tFWTsKKwl9CisJaWYgKHAtPm9fa2V5ID09IDAgJiYgSU5fTVVMVElDQVNUKG50b2hsKHAtPmlwaC5kYWRkcikpKSB7CisJCXAtPm9fa2V5ID0gcC0+aXBoLmRhZGRyOworCQlwLT5vX2ZsYWdzIHw9IEdSRV9LRVk7CisJfQorCWlmIChJTl9NVUxUSUNBU1QobnRvaGwocC0+aXBoLmRhZGRyKSkgJiYgIXAtPmlwaC5zYWRkcikgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYnJvYWRjYXN0IHR1bm5lbCByZXF1aXJlcyBhIHNvdXJjZSBhZGRyZXNzIik7CisJfQorfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGRvX2FkZChpbnQgY21kLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKKworCXBhcnNlX2FyZ3MoYXJndiwgY21kLCAmcCk7CisKKwlpZiAocC5pcGgudHRsICYmIHAuaXBoLmZyYWdfb2ZmID09IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInR0bCAhPSAwIGFuZCBub3B0bXVkaXNjIGFyZSBpbmNvbXBhdGlibGUiKTsKKwl9CisKKwlzd2l0Y2ggKHAuaXBoLnByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX0lQSVA6CisJCXJldHVybiBkb19hZGRfaW9jdGwoY21kLCAidHVubDAiLCAmcCk7CisJY2FzZSBJUFBST1RPX0dSRToKKwkJcmV0dXJuIGRvX2FkZF9pb2N0bChjbWQsICJncmUwIiwgJnApOworCWNhc2UgSVBQUk9UT19JUFY2OgorCQlyZXR1cm4gZG9fYWRkX2lvY3RsKGNtZCwgInNpdDAiLCAmcCk7CisJZGVmYXVsdDoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGRldGVybWluZSB0dW5uZWwgbW9kZSAoaXBpcCwgZ3JlIG9yIHNpdCkiKTsKKwl9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgZG9fZGVsKGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCisJcGFyc2VfYXJncyhhcmd2LCBTSU9DREVMVFVOTkVMLCAmcCk7CisKKwlzd2l0Y2ggKHAuaXBoLnByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX0lQSVA6CisJCXJldHVybiBkb19kZWxfaW9jdGwoInR1bmwwIiwgJnApOworCWNhc2UgSVBQUk9UT19HUkU6CisJCXJldHVybiBkb19kZWxfaW9jdGwoImdyZTAiLCAmcCk7CisJY2FzZSBJUFBST1RPX0lQVjY6CisJCXJldHVybiBkb19kZWxfaW9jdGwoInNpdDAiLCAmcCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGRvX2RlbF9pb2N0bChwLm5hbWUsICZwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3R1bm5lbChzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnApCit7CisJY2hhciBzMVsyNTZdOworCWNoYXIgczJbMjU2XTsKKwljaGFyIHMzWzY0XTsKKwljaGFyIHM0WzY0XTsKKworCWZvcm1hdF9ob3N0KEFGX0lORVQsIDQsICZwLT5pcGguZGFkZHIsIHMxLCBzaXplb2YoczEpKTsKKwlmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmcC0+aXBoLnNhZGRyLCBzMiwgc2l6ZW9mKHMyKSk7CisJaW5ldF9udG9wKEFGX0lORVQsICZwLT5pX2tleSwgczMsIHNpemVvZihzMykpOworCWluZXRfbnRvcChBRl9JTkVULCAmcC0+b19rZXksIHM0LCBzaXplb2YoczQpKTsKKworCXByaW50ZigiJXM6ICVzL2lwICByZW1vdGUgJXMgIGxvY2FsICVzICIsCisJICAgICAgIHAtPm5hbWUsCisJICAgICAgIHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQSVAgPyAiaXAiIDoKKwkgICAgICAgKHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0dSRSA/ICJncmUiIDoKKwkJKHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQVjYgPyAiaXB2NiIgOiAidW5rbm93biIpKSwKKwkgICAgICAgcC0+aXBoLmRhZGRyID8gczEgOiAiYW55IiwgcC0+aXBoLnNhZGRyID8gczIgOiAiYW55Iik7CisJaWYgKHAtPmxpbmspIHsKKwkJY2hhciAqbiA9IGRvX2lvY3RsX2dldF9pZm5hbWUocC0+bGluayk7CisJCWlmIChuKSB7CisJCQlwcmludGYoIiBkZXYgJXMgIiwgbik7CisJCQlmcmVlKG4pOworCQl9CisJfQorCWlmIChwLT5pcGgudHRsKQorCQlwcmludGYoIiB0dGwgJWQgIiwgcC0+aXBoLnR0bCk7CisJZWxzZQorCQlwcmludGYoIiB0dGwgaW5oZXJpdCAiKTsKKwlpZiAocC0+aXBoLnRvcykgeworCQlTUFJJTlRfQlVGKGIxKTsKKwkJcHJpbnRmKCIgdG9zIik7CisJCWlmIChwLT5pcGgudG9zICYgMSkKKwkJCXByaW50ZigiIGluaGVyaXQiKTsKKwkJaWYgKHAtPmlwaC50b3MgJiB+MSkKKwkJCXByaW50ZigiJWMlcyAiLCBwLT5pcGgudG9zICYgMSA/ICcvJyA6ICcgJywKKwkJCSAgICAgICBydG5sX2RzZmllbGRfbjJhKHAtPmlwaC50b3MgJiB+MSwgYjEpKTsKKwl9CisJaWYgKCEocC0+aXBoLmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkKKwkJcHJpbnRmKCIgbm9wbXR1ZGlzYyIpOworCisJaWYgKChwLT5pX2ZsYWdzICYgR1JFX0tFWSkgJiYgKHAtPm9fZmxhZ3MgJiBHUkVfS0VZKSAmJiBwLT5vX2tleSA9PSBwLT5pX2tleSkKKwkJcHJpbnRmKCIga2V5ICVzIiwgczMpOworCWVsc2UgaWYgKChwLT5pX2ZsYWdzIHwgcC0+b19mbGFncykgJiBHUkVfS0VZKSB7CisJCWlmIChwLT5pX2ZsYWdzICYgR1JFX0tFWSkKKwkJCXByaW50ZigiIGlrZXkgJXMgIiwgczMpOworCQlpZiAocC0+b19mbGFncyAmIEdSRV9LRVkpCisJCQlwcmludGYoIiBva2V5ICVzICIsIHM0KTsKKwl9CisKKwlpZiAocC0+aV9mbGFncyAmIEdSRV9TRVEpCisJCXByaW50ZigiJWMgIERyb3AgcGFja2V0cyBvdXQgb2Ygc2VxdWVuY2UuXG4iLCBfU0xfKTsKKwlpZiAocC0+aV9mbGFncyAmIEdSRV9DU1VNKQorCQlwcmludGYoIiVjICBDaGVja3N1bSBpbiByZWNlaXZlZCBwYWNrZXQgaXMgcmVxdWlyZWQuIiwgX1NMXyk7CisJaWYgKHAtPm9fZmxhZ3MgJiBHUkVfU0VRKQorCQlwcmludGYoIiVjICBTZXF1ZW5jZSBwYWNrZXRzIG9uIG91dHB1dC4iLCBfU0xfKTsKKwlpZiAocC0+b19mbGFncyAmIEdSRV9DU1VNKQorCQlwcmludGYoIiVjICBDaGVja3N1bSBvdXRwdXQgcGFja2V0cy4iLCBfU0xfKTsKK30KKworc3RhdGljIHZvaWQgZG9fdHVubmVsc19saXN0KHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKK3sKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXMsIHJ4X3BhY2tldHMsIHJ4X2VycnMsIHJ4X2Ryb3BzLAorCQlyeF9maWZvLCByeF9mcmFtZSwKKwkJdHhfYnl0ZXMsIHR4X3BhY2tldHMsIHR4X2VycnMsIHR4X2Ryb3BzLAorCQl0eF9maWZvLCB0eF9jb2xscywgdHhfY2FycmllciwgcnhfbXVsdGk7CisJaW50IHR5cGU7CisJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHAxOworCWNoYXIgYnVmWzUxMl07CisJRklMRSAqZnAgPSBmb3Blbl9vcl93YXJuKCIvcHJvYy9uZXQvZGV2IiwgInIiKTsKKworCWlmIChmcCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJLyogc2tpcCBoZWFkZXJzICovCisJZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApOworCWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgIT0gTlVMTCkgeworCQljaGFyICpwdHI7CisKKwkJLypidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7IC0gZmdldHMgaXMgc2FmZSBhbnl3YXkgKi8KKwkJcHRyID0gc3RyY2hyKGJ1ZiwgJzonKTsKKwkJaWYgKHB0ciA9PSBOVUxMIHx8CisJCSAgICAoKnB0cisrID0gMCwgc3NjYW5mKGJ1ZiwgIiVzIiwgbmFtZSkgIT0gMSkKKwkJKSB7CisJCQliYl9lcnJvcl9tc2coIndyb25nIGZvcm1hdCBvZiAvcHJvYy9uZXQvZGV2Iik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHNzY2FuZihwdHIsICIlbHUlbHUlbHUlbHUlbHUlbHUlbHUlKmQlbHUlbHUlbHUlbHUlbHUlbHUlbHUiLAorCQkJICAgJnJ4X2J5dGVzLCAmcnhfcGFja2V0cywgJnJ4X2VycnMsICZyeF9kcm9wcywKKwkJCSAgICZyeF9maWZvLCAmcnhfZnJhbWUsICZyeF9tdWx0aSwKKwkJCSAgICZ0eF9ieXRlcywgJnR4X3BhY2tldHMsICZ0eF9lcnJzLCAmdHhfZHJvcHMsCisJCQkgICAmdHhfZmlmbywgJnR4X2NvbGxzLCAmdHhfY2FycmllcikgIT0gMTQpCisJCQljb250aW51ZTsKKwkJaWYgKHAtPm5hbWVbMF0gJiYgc3RyY21wKHAtPm5hbWUsIG5hbWUpKQorCQkJY29udGludWU7CisJCXR5cGUgPSBkb19pb2N0bF9nZXRfaWZ0eXBlKG5hbWUpOworCQlpZiAodHlwZSA9PSAtMSkgeworCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBnZXQgdHlwZSBvZiBbJXNdIiwgbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodHlwZSAhPSBBUlBIUkRfVFVOTkVMICYmIHR5cGUgIT0gQVJQSFJEX0lQR1JFICYmIHR5cGUgIT0gQVJQSFJEX1NJVCkKKwkJCWNvbnRpbnVlOworCQltZW1zZXQoJnAxLCAwLCBzaXplb2YocDEpKTsKKwkJaWYgKGRvX2dldF9pb2N0bChuYW1lLCAmcDEpKQorCQkJY29udGludWU7CisJCWlmICgocC0+bGluayAmJiBwMS5saW5rICE9IHAtPmxpbmspIHx8CisJCSAgICAocC0+bmFtZVswXSAmJiBzdHJjbXAocDEubmFtZSwgcC0+bmFtZSkpIHx8CisJCSAgICAocC0+aXBoLmRhZGRyICYmIHAxLmlwaC5kYWRkciAhPSBwLT5pcGguZGFkZHIpIHx8CisJCSAgICAocC0+aXBoLnNhZGRyICYmIHAxLmlwaC5zYWRkciAhPSBwLT5pcGguc2FkZHIpIHx8CisJCSAgICAocC0+aV9rZXkgJiYgcDEuaV9rZXkgIT0gcC0+aV9rZXkpCisJCSkgeworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRfdHVubmVsKCZwMSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGRvX3Nob3coY2hhciAqKmFyZ3YpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKKworCXBhcnNlX2FyZ3MoYXJndiwgU0lPQ0dFVFRVTk5FTCwgJnApOworCisJc3dpdGNoIChwLmlwaC5wcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19JUElQOgorCQllcnIgPSBkb19nZXRfaW9jdGwocC5uYW1lWzBdID8gcC5uYW1lIDogInR1bmwwIiwgJnApOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fR1JFOgorCQllcnIgPSBkb19nZXRfaW9jdGwocC5uYW1lWzBdID8gcC5uYW1lIDogImdyZTAiLCAmcCk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19JUFY2OgorCQllcnIgPSBkb19nZXRfaW9jdGwocC5uYW1lWzBdID8gcC5uYW1lIDogInNpdDAiLCAmcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRvX3R1bm5lbHNfbGlzdCgmcCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gLTE7CisKKwlwcmludF90dW5uZWwoJnApOworCWJiX3B1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK2ludCBGQVNUX0ZVTkMgZG9faXB0dW5uZWwoY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkiYWRkXDAiImNoYW5nZVwwIiJkZWxldGVcMCIic2hvd1wwIiJsaXN0XDAiImxzdFwwIjsKKwllbnVtIHsgQVJHX2FkZCA9IDAsIEFSR19jaGFuZ2UsIEFSR19kZWwsIEFSR19zaG93LCBBUkdfbGlzdCwgQVJHX2xzdCB9OworCisJaWYgKCphcmd2KSB7CisJCXNtYWxsdWludCBrZXkgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChrZXkgPiA1KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJCWlmIChrZXkgPT0gQVJHX2FkZCkKKwkJCXJldHVybiBkb19hZGQoU0lPQ0FERFRVTk5FTCwgYXJndik7CisJCWlmIChrZXkgPT0gQVJHX2NoYW5nZSkKKwkJCXJldHVybiBkb19hZGQoU0lPQ0NIR1RVTk5FTCwgYXJndik7CisJCWlmIChrZXkgPT0gQVJHX2RlbCkKKwkJCXJldHVybiBkb19kZWwoYXJndik7CisJfQorCXJldHVybiBkb19zaG93KGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xpYm5ldGxpbmsuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9saWJuZXRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1MzNhNAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9saWJuZXRsaW5rLmMKQEAgLTAsMCArMSw0MDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisKK3ZvaWQgRkFTVF9GVU5DIHhydG5sX29wZW4oc3RydWN0IHJ0bmxfaGFuZGxlICpydGgvKiwgdW5zaWduZWQgc3Vic2NyaXB0aW9ucyovKQoreworCXNvY2tsZW5fdCBhZGRyX2xlbjsKKworCW1lbXNldChydGgsIDAsIHNpemVvZigqcnRoKSk7CisJcnRoLT5mZCA9IHhzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfUk9VVEUpOworCXJ0aC0+bG9jYWwubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwkvKnJ0aC0+bG9jYWwubmxfZ3JvdXBzID0gc3Vic2NyaXB0aW9uczsqLworCisJeGJpbmQocnRoLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnJ0aC0+bG9jYWwsIHNpemVvZihydGgtPmxvY2FsKSk7CisJYWRkcl9sZW4gPSBzaXplb2YocnRoLT5sb2NhbCk7CisJZ2V0c29ja25hbWUocnRoLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnJ0aC0+bG9jYWwsICZhZGRyX2xlbik7CisKKy8qIHRvbyBtdWNoIHBhcmFub2lhCisJaWYgKGdldHNvY2tuYW1lKHJ0aC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZydGgtPmxvY2FsLCAmYWRkcl9sZW4pIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSIpOworCWlmIChhZGRyX2xlbiAhPSBzaXplb2YocnRoLT5sb2NhbCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3cm9uZyBhZGRyZXNzIGxlbmd0aCAlZCIsIGFkZHJfbGVuKTsKKwlpZiAocnRoLT5sb2NhbC5ubF9mYW1pbHkgIT0gQUZfTkVUTElOSykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndyb25nIGFkZHJlc3MgZmFtaWx5ICVkIiwgcnRoLT5sb2NhbC5ubF9mYW1pbHkpOworKi8KKwlydGgtPnNlcSA9IHRpbWUoTlVMTCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IGZhbWlseSwgaW50IHR5cGUpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG5saDsKKwkJc3RydWN0IHJ0Z2VubXNnIGc7CisJfSByZXE7CisKKwlyZXEubmxoLm5sbXNnX2xlbiA9IHNpemVvZihyZXEpOworCXJlcS5ubGgubmxtc2dfdHlwZSA9IHR5cGU7CisJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0h8TkxNX0ZfUkVRVUVTVDsKKwlyZXEubmxoLm5sbXNnX3BpZCA9IDA7CisJcmVxLm5saC5ubG1zZ19zZXEgPSBydGgtPmR1bXAgPSArK3J0aC0+c2VxOworCXJlcS5nLnJ0Z2VuX2ZhbWlseSA9IGZhbWlseTsKKworCXJldHVybiBydG5sX3NlbmQocnRoLCAodm9pZCopJnJlcSwgc2l6ZW9mKHJlcSkpOworfQorCisvL1RPRE86IHBhc3MgcnRoLT5mZCBpbnN0ZWFkIG9mIGZ1bGwgcnRoPworaW50IEZBU1RfRlVOQyBydG5sX3NlbmQoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwlubGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKworCXJldHVybiB4c2VuZHRvKHJ0aC0+ZmQsIGJ1ZiwgbGVuLCAoc3RydWN0IHNvY2thZGRyKikmbmxhZGRyLCBzaXplb2YobmxhZGRyKSk7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRubF9kdW1wX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCB0eXBlLCB2b2lkICpyZXEsIGludCBsZW4pCit7CisJc3RydWN0IG5sbXNnaGRyIG5saDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCBpb3ZlYyBpb3ZbMl0gPSB7IHsgJm5saCwgc2l6ZW9mKG5saCkgfSwgeyByZXEsIGxlbiB9IH07CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCSh2b2lkKikmbmxhZGRyLCBzaXplb2YobmxhZGRyKSwKKwkJaW92LCAgMiwKKwkJTlVMTCwgMCwKKwkJMAorCX07CisKKwltZW1zZXQoJm5sYWRkciwgMCwgc2l6ZW9mKG5sYWRkcikpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJbmxoLm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChsZW4pOworCW5saC5ubG1zZ190eXBlID0gdHlwZTsKKwlubGgubmxtc2dfZmxhZ3MgPSBOTE1fRl9ST09UfE5MTV9GX01BVENIfE5MTV9GX1JFUVVFU1Q7CisJbmxoLm5sbXNnX3BpZCA9IDA7CisJbmxoLm5sbXNnX3NlcSA9IHJ0aC0+ZHVtcCA9ICsrcnRoLT5zZXE7CisKKwlyZXR1cm4gc2VuZG1zZyhydGgtPmZkLCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBydG5sX2R1bXBfZmlsdGVyKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLAorCQlpbnQgKCpmaWx0ZXIpKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKikgRkFTVF9GVU5DLAorCQl2b2lkICphcmcxLyosCisJCWludCAoKmp1bmspKHN0cnVjdCBzb2NrYWRkcl9ubCAqLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKiksCisJCXZvaWQgKmFyZzIqLykKK3sKKwlpbnQgcmV0dmFsID0gLTE7CisJY2hhciAqYnVmID0geG1hbGxvYyg4KjEwMjQpOyAvKiBhdm9pZCBiaWcgc3RhY2sgYnVmZmVyICovCisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwlzdHJ1Y3QgaW92ZWMgaW92ID0geyBidWYsIDgqMTAyNCB9OworCisJd2hpbGUgKDEpIHsKKwkJaW50IHN0YXR1czsKKwkJc3RydWN0IG5sbXNnaGRyICpoOworCisJCXN0cnVjdCBtc2doZHIgbXNnID0geworCQkJKHZvaWQqKSZubGFkZHIsIHNpemVvZihubGFkZHIpLAorCQkJJmlvdiwgMSwKKwkJCU5VTEwsIDAsCisJCQkwCisJCX07CisKKwkJc3RhdHVzID0gcmVjdm1zZyhydGgtPmZkLCAmbXNnLCAwKTsKKworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJYmJfcGVycm9yX21zZygiT1ZFUlJVTiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQliYl9lcnJvcl9tc2coIkVPRiBvbiBuZXRsaW5rIik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAobXNnLm1zZ19uYW1lbGVuICE9IHNpemVvZihubGFkZHIpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VuZGVyIGFkZHJlc3MgbGVuZ3RoID09ICVkIiwgbXNnLm1zZ19uYW1lbGVuKTsKKwkJfQorCisJCWggPSAoc3RydWN0IG5sbXNnaGRyKilidWY7CisJCXdoaWxlIChOTE1TR19PSyhoLCBzdGF0dXMpKSB7CisJCQlpbnQgZXJyOworCisJCQlpZiAobmxhZGRyLm5sX3BpZCAhPSAwIHx8CisJCQkgICAgaC0+bmxtc2dfcGlkICE9IHJ0aC0+bG9jYWwubmxfcGlkIHx8CisJCQkgICAgaC0+bmxtc2dfc2VxICE9IHJ0aC0+ZHVtcAorCQkJKSB7CisvLwkJCQlpZiAoanVuaykgeworLy8JCQkJCWVyciA9IGp1bmsoJm5sYWRkciwgaCwgYXJnMik7CisvLwkJCQkJaWYgKGVyciA8IDApIHsKKy8vCQkJCQkJcmV0dmFsID0gZXJyOworLy8JCQkJCQlnb3RvIHJldDsKKy8vCQkJCQl9CisvLwkJCQl9CisJCQkJZ290byBza2lwX2l0OworCQkJfQorCisJCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSB7CisJCQkJZ290byByZXRfMDsKKwkJCX0KKwkJCWlmIChoLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSB7CisJCQkJc3RydWN0IG5sbXNnZXJyICpsX2VyciA9IChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEoaCk7CisJCQkJaWYgKGgtPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJFUlJPUiB0cnVuY2F0ZWQiKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnJubyA9IC1sX2Vyci0+ZXJyb3I7CisJCQkJCWJiX3BlcnJvcl9tc2coIlJUTkVUTElOSyBhbnN3ZXJzIik7CisJCQkJfQorCQkJCWdvdG8gcmV0OworCQkJfQorCQkJZXJyID0gZmlsdGVyKCZubGFkZHIsIGgsIGFyZzEpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlyZXR2YWwgPSBlcnI7CisJCQkJZ290byByZXQ7CisJCQl9CisKKyBza2lwX2l0OgorCQkJaCA9IE5MTVNHX05FWFQoaCwgc3RhdHVzKTsKKwkJfQorCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJYmJfZXJyb3JfbXNnKCJtZXNzYWdlIHRydW5jYXRlZCIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXR1cykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlbW5hbnQgb2Ygc2l6ZSAlZCEiLCBzdGF0dXMpOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKyByZXRfMDoKKwlyZXR2YWwrKzsgLyogPSAwICovCisgcmV0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgRkFTVF9GVU5DIHhydG5sX2R1bXBfZmlsdGVyKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLAorCQlpbnQgKCpmaWx0ZXIpKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqLCBzdHJ1Y3Qgbmxtc2doZHIgKiwgdm9pZCAqKSBGQVNUX0ZVTkMsCisJCXZvaWQgKmFyZzEpCit7CisJaW50IHJldCA9IHJ0bmxfZHVtcF9maWx0ZXIocnRoLCBmaWx0ZXIsIGFyZzEvKiwgTlVMTCwgTlVMTCovKTsKKwlpZiAocmV0IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImR1bXAgdGVybWluYXRlZCIpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRubF90YWxrKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRubCwgc3RydWN0IG5sbXNnaGRyICpuLAorCQlwaWRfdCBwZWVyLCB1bnNpZ25lZCBncm91cHMsCisJCXN0cnVjdCBubG1zZ2hkciAqYW5zd2VyLAorCQlpbnQgKCpqdW5rKShzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwgc3RydWN0IG5sbXNnaGRyICosIHZvaWQgKiksCisJCXZvaWQgKmphcmcpCit7CisvKiBiYm94IGRvZXNuJ3QgdXNlIHBhcmFtZXRlcnMgbm8uIDMsIDQsIDYsIDcsIHRoZXkgYXJlIHN0dWJiZWQgb3V0ICovCisjZGVmaW5lIHBlZXIgICAwCisjZGVmaW5lIGdyb3VwcyAwCisjZGVmaW5lIGp1bmsgICBOVUxMCisjZGVmaW5lIGphcmcgICBOVUxMCisJaW50IHJldHZhbCA9IC0xOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgc2VxOworCXN0cnVjdCBubG1zZ2hkciAqaDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7ICh2b2lkKiluLCBuLT5ubG1zZ19sZW4gfTsKKwljaGFyICAgKmJ1ZiA9IHhtYWxsb2MoOCoxMDI0KTsgLyogYXZvaWQgYmlnIHN0YWNrIGJ1ZmZlciAqLworCXN0cnVjdCBtc2doZHIgbXNnID0geworCQkodm9pZCopJm5sYWRkciwgc2l6ZW9mKG5sYWRkciksCisJCSZpb3YsIDEsCisJCU5VTEwsIDAsCisJCTAKKwl9OworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwlubGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKy8vCW5sYWRkci5ubF9waWQgPSBwZWVyOworLy8JbmxhZGRyLm5sX2dyb3VwcyA9IGdyb3VwczsKKworCW4tPm5sbXNnX3NlcSA9IHNlcSA9ICsrcnRubC0+c2VxOworCWlmIChhbnN3ZXIgPT0gTlVMTCkgeworCQluLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9BQ0s7CisJfQorCXN0YXR1cyA9IHNlbmRtc2cocnRubC0+ZmQsICZtc2csIDApOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgdGFsayB0byBydG5ldGxpbmsiKTsKKwkJZ290byByZXQ7CisJfQorCisJaW92Lmlvdl9iYXNlID0gYnVmOworCisJd2hpbGUgKDEpIHsKKwkJaW92Lmlvdl9sZW4gPSA4KjEwMjQ7CisJCXN0YXR1cyA9IHJlY3Ztc2cocnRubC0+ZmQsICZtc2csIDApOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJiX3BlcnJvcl9tc2coIk9WRVJSVU4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJFT0Ygb24gbmV0bGluayIpOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKG1zZy5tc2dfbmFtZWxlbiAhPSBzaXplb2YobmxhZGRyKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNlbmRlciBhZGRyZXNzIGxlbmd0aCA9PSAlZCIsIG1zZy5tc2dfbmFtZWxlbik7CisJCX0KKwkJZm9yIChoID0gKHN0cnVjdCBubG1zZ2hkciopYnVmOyBzdGF0dXMgPj0gKGludClzaXplb2YoKmgpOyApIHsKKy8vCQkJaW50IGxfZXJyOworCQkJaW50IGxlbiA9IGgtPm5sbXNnX2xlbjsKKwkJCWludCBsID0gbGVuIC0gc2l6ZW9mKCpoKTsKKworCQkJaWYgKGwgPCAwIHx8IGxlbiA+IHN0YXR1cykgeworCQkJCWlmIChtc2cubXNnX2ZsYWdzICYgTVNHX1RSVU5DKSB7CisJCQkJCWJiX2Vycm9yX21zZygidHJ1bmNhdGVkIG1lc3NhZ2UiKTsKKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYWxmb3JtZWQgbWVzc2FnZTogbGVuPSVkISIsIGxlbik7CisJCQl9CisKKwkJCWlmIChubGFkZHIubmxfcGlkICE9IHBlZXIgfHwKKwkJCSAgICBoLT5ubG1zZ19waWQgIT0gcnRubC0+bG9jYWwubmxfcGlkIHx8CisJCQkgICAgaC0+bmxtc2dfc2VxICE9IHNlcQorCQkJKSB7CisvLwkJCQlpZiAoanVuaykgeworLy8JCQkJCWxfZXJyID0ganVuaygmbmxhZGRyLCBoLCBqYXJnKTsKKy8vCQkJCQlpZiAobF9lcnIgPCAwKSB7CisvLwkJCQkJCXJldHZhbCA9IGxfZXJyOworLy8JCQkJCQlnb3RvIHJldDsKKy8vCQkJCQl9CisvLwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChoLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSB7CisJCQkJc3RydWN0IG5sbXNnZXJyICplcnIgPSAoc3RydWN0IG5sbXNnZXJyKilOTE1TR19EQVRBKGgpOworCQkJCWlmIChsIDwgKGludClzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkgeworCQkJCQliYl9lcnJvcl9tc2coIkVSUk9SIHRydW5jYXRlZCIpOworCQkJCX0gZWxzZSB7CisJCQkJCWVycm5vID0gLSBlcnItPmVycm9yOworCQkJCQlpZiAoZXJybm8gPT0gMCkgeworCQkJCQkJaWYgKGFuc3dlcikgeworCQkJCQkJCW1lbWNweShhbnN3ZXIsIGgsIGgtPm5sbXNnX2xlbik7CisJCQkJCQl9CisJCQkJCQlnb3RvIHJldF8wOworCQkJCQl9CisJCQkJCWJiX3BlcnJvcl9tc2coIlJUTkVUTElOSyBhbnN3ZXJzIik7CisJCQkJfQorCQkJCWdvdG8gcmV0OworCQkJfQorCQkJaWYgKGFuc3dlcikgeworCQkJCW1lbWNweShhbnN3ZXIsIGgsIGgtPm5sbXNnX2xlbik7CisJCQkJZ290byByZXRfMDsKKwkJCX0KKworCQkJYmJfZXJyb3JfbXNnKCJ1bmV4cGVjdGVkIHJlcGx5ISIpOworCisJCQlzdGF0dXMgLT0gTkxNU0dfQUxJR04obGVuKTsKKwkJCWggPSAoc3RydWN0IG5sbXNnaGRyKikoKGNoYXIqKWggKyBOTE1TR19BTElHTihsZW4pKTsKKwkJfQorCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJYmJfZXJyb3JfbXNnKCJtZXNzYWdlIHRydW5jYXRlZCIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXR1cykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlbW5hbnQgb2Ygc2l6ZSAlZCEiLCBzdGF0dXMpOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKyByZXRfMDoKKwlyZXR2YWwrKzsgLyogPSAwICovCisgcmV0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgRkFTVF9GVU5DIGFkZGF0dHIzMihzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCB1aW50MzJfdCBkYXRhKQoreworCWludCBsZW4gPSBSVEFfTEVOR1RIKDQpOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKworCWlmICgoaW50KShOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pICsgbGVuKSA+IG1heGxlbikgeworCQlyZXR1cm4gLTE7CisJfQorCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKiluKSArIE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikpOworCXJ0YS0+cnRhX3R5cGUgPSB0eXBlOworCXJ0YS0+cnRhX2xlbiA9IGxlbjsKKwltb3ZlX3RvX3VuYWxpZ25lZDMyKFJUQV9EQVRBKHJ0YSksIGRhdGEpOworCW4tPm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikgKyBsZW47CisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgYWRkYXR0cl9sKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBhbGVuKQoreworCWludCBsZW4gPSBSVEFfTEVOR1RIKGFsZW4pOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKworCWlmICgoaW50KShOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pICsgbGVuKSA+IG1heGxlbikgeworCQlyZXR1cm4gLTE7CisJfQorCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKiluKSArIE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikpOworCXJ0YS0+cnRhX3R5cGUgPSB0eXBlOworCXJ0YS0+cnRhX2xlbiA9IGxlbjsKKwltZW1jcHkoUlRBX0RBVEEocnRhKSwgZGF0YSwgYWxlbik7CisJbi0+bmxtc2dfbGVuID0gTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSArIGxlbjsKKwlyZXR1cm4gMDsKK30KKworaW50IEZBU1RfRlVOQyBydGFfYWRkYXR0cjMyKHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIHVpbnQzMl90IGRhdGEpCit7CisJaW50IGxlbiA9IFJUQV9MRU5HVEgoNCk7CisJc3RydWN0IHJ0YXR0ciAqc3VicnRhOworCisJaWYgKFJUQV9BTElHTihydGEtPnJ0YV9sZW4pICsgbGVuID4gbWF4bGVuKSB7CisJCXJldHVybiAtMTsKKwl9CisJc3VicnRhID0gKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKXJ0YSkgKyBSVEFfQUxJR04ocnRhLT5ydGFfbGVuKSk7CisJc3VicnRhLT5ydGFfdHlwZSA9IHR5cGU7CisJc3VicnRhLT5ydGFfbGVuID0gbGVuOworCW1vdmVfdG9fdW5hbGlnbmVkMzIoUlRBX0RBVEEoc3VicnRhKSwgZGF0YSk7CisJcnRhLT5ydGFfbGVuID0gTkxNU0dfQUxJR04ocnRhLT5ydGFfbGVuKSArIGxlbjsKKwlyZXR1cm4gMDsKK30KKworaW50IEZBU1RfRlVOQyBydGFfYWRkYXR0cl9sKHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBhbGVuKQoreworCXN0cnVjdCBydGF0dHIgKnN1YnJ0YTsKKwlpbnQgbGVuID0gUlRBX0xFTkdUSChhbGVuKTsKKworCWlmIChSVEFfQUxJR04ocnRhLT5ydGFfbGVuKSArIGxlbiA+IG1heGxlbikgeworCQlyZXR1cm4gLTE7CisJfQorCXN1YnJ0YSA9IChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKilydGEpICsgUlRBX0FMSUdOKHJ0YS0+cnRhX2xlbikpOworCXN1YnJ0YS0+cnRhX3R5cGUgPSB0eXBlOworCXN1YnJ0YS0+cnRhX2xlbiA9IGxlbjsKKwltZW1jcHkoUlRBX0RBVEEoc3VicnRhKSwgZGF0YSwgYWxlbik7CisJcnRhLT5ydGFfbGVuID0gTkxNU0dfQUxJR04ocnRhLT5ydGFfbGVuKSArIGxlbjsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIEZBU1RfRlVOQyBwYXJzZV9ydGF0dHIoc3RydWN0IHJ0YXR0ciAqdGJbXSwgaW50IG1heCwgc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbGVuKQoreworCXdoaWxlIChSVEFfT0socnRhLCBsZW4pKSB7CisJCWlmIChydGEtPnJ0YV90eXBlIDw9IG1heCkgeworCQkJdGJbcnRhLT5ydGFfdHlwZV0gPSBydGE7CisJCX0KKwkJcnRhID0gUlRBX05FWFQocnRhLCBsZW4pOworCX0KKwlpZiAobGVuKSB7CisJCWJiX2Vycm9yX21zZygiZGVmaWNpdCAlZCwgcnRhX2xlbj0lZCEiLCBsZW4sIHJ0YS0+cnRhX2xlbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xpYm5ldGxpbmsuaCBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9saWJuZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiZWUyZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9saWJuZXRsaW5rLmgKQEAgLTAsMCArMSw0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIExJQk5FVExJTktfSAorI2RlZmluZSBMSUJORVRMSU5LX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8qIFdlIG5lZWQgbGludXgvdHlwZXMuaCBiZWNhdXNlIG9sZGVyIGtlcm5lbHMgdXNlIF9fdTMyIGV0YworICogaW4gbGludXgvW3J0XW5ldGxpbmsuaC4gMi42LjE5IHNlZW1zIHRvIGJlIG9rLCB0aG91Z2ggKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitzdHJ1Y3QgcnRubF9oYW5kbGUgeworCWludCAgICAgICAgICAgICAgICBmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbG9jYWw7CisJc3RydWN0IHNvY2thZGRyX25sIHBlZXI7CisJdWludDMyX3QgICAgICAgICAgIHNlcTsKKwl1aW50MzJfdCAgICAgICAgICAgZHVtcDsKK307CisKK2V4dGVybiB2b2lkIHhydG5sX29wZW4oc3RydWN0IHJ0bmxfaGFuZGxlICpydGgpIEZBU1RfRlVOQzsKKyNkZWZpbmUgcnRubF9jbG9zZShydGgpIChjbG9zZSgocnRoKS0+ZmQpKQorZXh0ZXJuIGludCB4cnRubF93aWxkZHVtcF9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgZmFtLCBpbnQgdHlwZSkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydG5sX2R1bXBfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IHR5cGUsIHZvaWQgKnJlcSwgaW50IGxlbikgRkFTVF9GVU5DOworZXh0ZXJuIGludCB4cnRubF9kdW1wX2ZpbHRlcihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwKKwkJaW50ICgqZmlsdGVyKShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwqLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQqKSBGQVNUX0ZVTkMsCisJCXZvaWQgKmFyZzEpIEZBU1RfRlVOQzsKKworLyogYmJveCBkb2Vzbid0IHVzZSBwYXJhbWV0ZXJzIG5vLiAzLCA0LCA2LCA3LCBzdHViIHRoZW0gb3V0ICovCisjZGVmaW5lIHJ0bmxfdGFsayhydG5sLCBuLCBwZWVyLCBncm91cHMsIGFuc3dlciwganVuaywgamFyZykgXAorCXJ0bmxfdGFsayhydG5sLCBuLCBhbnN3ZXIpCitleHRlcm4gaW50IHJ0bmxfdGFsayhzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0bmwsIHN0cnVjdCBubG1zZ2hkciAqbiwgcGlkX3QgcGVlciwKKwkJdW5zaWduZWQgZ3JvdXBzLCBzdHJ1Y3Qgbmxtc2doZHIgKmFuc3dlciwKKwkJaW50ICgqanVuaykoc3RydWN0IHNvY2thZGRyX25sICosc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICopLAorCQl2b2lkICpqYXJnKSBGQVNUX0ZVTkM7CisKK2V4dGVybiBpbnQgcnRubF9zZW5kKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBjaGFyICpidWYsIGludCkgRkFTVF9GVU5DOworCisKK2V4dGVybiBpbnQgYWRkYXR0cjMyKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIHVpbnQzMl90IGRhdGEpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgYWRkYXR0cl9sKHN0cnVjdCBubG1zZ2hkciAqbiwgaW50IG1heGxlbiwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBhbGVuKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0YV9hZGRhdHRyMzIoc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdWludDMyX3QgZGF0YSkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydGFfYWRkYXR0cl9sKHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBhbGVuKSBGQVNUX0ZVTkM7CisKK2V4dGVybiB2b2lkIHBhcnNlX3J0YXR0cihzdHJ1Y3QgcnRhdHRyICp0YltdLCBpbnQgbWF4LCBzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBsZW4pIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfYWRkci5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2E1NGVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX2FkZHIuYwpAQCAtMCwwICsxLDc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGxsX2FkZHJfbjJhKHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBhbGVuLCBpbnQgdHlwZSwgY2hhciAqYnVmLCBpbnQgYmxlbikKK3sKKwlpbnQgaTsKKwlpbnQgbDsKKworCWlmIChhbGVuID09IDQKKwkgJiYgKHR5cGUgPT0gQVJQSFJEX1RVTk5FTCB8fCB0eXBlID09IEFSUEhSRF9TSVQgfHwgdHlwZSA9PSBBUlBIUkRfSVBHUkUpCisJKSB7CisJCXJldHVybiBpbmV0X250b3AoQUZfSU5FVCwgYWRkciwgYnVmLCBibGVuKTsKKwl9CisJbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGFsZW47IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQlzbnByaW50ZihidWYgKyBsLCBibGVuLCAiOiUwMngiKzEsIGFkZHJbaV0pOworCQkJYmxlbiAtPSAyOworCQkJbCArPSAyOworCQl9IGVsc2UgeworCQkJc25wcmludGYoYnVmICsgbCwgYmxlbiwgIjolMDJ4IiwgYWRkcltpXSk7CisJCQlibGVuIC09IDM7CisJCQlsICs9IDM7CisJCX0KKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IEZBU1RfRlVOQyBsbF9hZGRyX2Eybih1bnNpZ25lZCBjaGFyICpsbGFkZHIsIGludCBsZW4sIGNoYXIgKmFyZykKK3sKKwlpbnQgaTsKKworCWlmIChzdHJjaHIoYXJnLCAnLicpKSB7CisJCWluZXRfcHJlZml4IHBmeDsKKwkJaWYgKGdldF9hZGRyXzEoJnBmeCwgYXJnLCBBRl9JTkVUKSkgeworCQkJYmJfZXJyb3JfbXNnKCJcIiVzXCIgaXMgaW52YWxpZCBsbGFkZHIiLCBhcmcpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChsZW4gPCA0KSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtY3B5KGxsYWRkciwgcGZ4LmRhdGEsIDQpOworCQlyZXR1cm4gNDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IHRlbXA7CisJCWNoYXIgKmNwID0gc3RyY2hyKGFyZywgJzonKTsKKwkJaWYgKGNwKSB7CisJCQkqY3AgPSAwOworCQkJY3ArKzsKKwkJfQorCQlpZiAoc3NjYW5mKGFyZywgIiV4IiwgJnRlbXApICE9IDEgfHwgKHRlbXAgPCAwIHx8IHRlbXAgPiAyNTUpKSB7CisJCQliYl9lcnJvcl9tc2coIlwiJXNcIiBpcyBpbnZhbGlkIGxsYWRkciIsIGFyZyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbGxhZGRyW2ldID0gdGVtcDsKKwkJaWYgKCFjcCkgeworCQkJYnJlYWs7CisJCX0KKwkJYXJnID0gY3A7CisJfQorCXJldHVybiBpKzE7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfbWFwLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjZDkwZgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuYwpAQCAtMCwwICsxLDIwMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPG5ldC9pZi5oPiAgLyogc3RydWN0IGlmcmVxIGFuZCBjby4gKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGlibmV0bGluay5oIgorI2luY2x1ZGUgImxsX21hcC5oIgorCitzdHJ1Y3QgaWR4bWFwIHsKKwlzdHJ1Y3QgaWR4bWFwICpuZXh0OworCWludCAgICAgICAgICAgIGluZGV4OworCWludCAgICAgICAgICAgIHR5cGU7CisJaW50ICAgICAgICAgICAgYWxlbjsKKwl1bnNpZ25lZCAgICAgICBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICBhZGRyWzhdOworCWNoYXIgICAgICAgICAgIG5hbWVbMTZdOworfTsKKworc3RhdGljIHN0cnVjdCBpZHhtYXAgKippZHhtYXA7IC8qIHRyZWF0IGFzICppZHhtYXBbMTZdICovCisKK3N0YXRpYyBzdHJ1Y3QgaWR4bWFwICpmaW5kX2J5X2luZGV4KGludCBpZHgpCit7CisJc3RydWN0IGlkeG1hcCAqaW07CisKKwlpZiAoaWR4bWFwKQorCQlmb3IgKGltID0gaWR4bWFwW2lkeCAmIDB4Rl07IGltOyBpbSA9IGltLT5uZXh0KQorCQkJaWYgKGltLT5pbmRleCA9PSBpZHgpCisJCQkJcmV0dXJuIGltOworCXJldHVybiBOVUxMOworfQorCitpbnQgRkFTVF9GVU5DIGxsX3JlbWVtYmVyX2luZGV4KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvIFVOVVNFRF9QQVJBTSwKKwkJc3RydWN0IG5sbXNnaGRyICpuLAorCQl2b2lkICphcmcgVU5VU0VEX1BBUkFNKQoreworCWludCBoOworCXN0cnVjdCBpZmluZm9tc2cgKmlmaSA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IGlkeG1hcCAqaW0sICoqaW1wOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYKzFdOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0xJTkspCisJCXJldHVybiAwOworCisJaWYgKG4tPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2YoaWZpKSkpCisJCXJldHVybiAtMTsKKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoaWZpKSwgSUZMQV9QQVlMT0FEKG4pKTsKKwlpZiAodGJbSUZMQV9JRk5BTUVdID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKCFpZHhtYXApCisJCWlkeG1hcCA9IHh6YWxsb2Moc2l6ZW9mKGlkeG1hcFswXSkgKiAxNik7CisKKwloID0gaWZpLT5pZmlfaW5kZXggJiAweEY7CisJZm9yIChpbXAgPSAmaWR4bWFwW2hdOyAoaW0gPSAqaW1wKSAhPSBOVUxMOyBpbXAgPSAmaW0tPm5leHQpCisJCWlmIChpbS0+aW5kZXggPT0gaWZpLT5pZmlfaW5kZXgpCisJCQlnb3RvIGZvdW5kOworCisJaW0gPSB4bWFsbG9jKHNpemVvZigqaW0pKTsKKwlpbS0+bmV4dCA9ICppbXA7CisJaW0tPmluZGV4ID0gaWZpLT5pZmlfaW5kZXg7CisJKmltcCA9IGltOworIGZvdW5kOgorCWltLT50eXBlID0gaWZpLT5pZmlfdHlwZTsKKwlpbS0+ZmxhZ3MgPSBpZmktPmlmaV9mbGFnczsKKwlpZiAodGJbSUZMQV9BRERSRVNTXSkgeworCQlpbnQgYWxlbjsKKwkJaW0tPmFsZW4gPSBhbGVuID0gUlRBX1BBWUxPQUQodGJbSUZMQV9BRERSRVNTXSk7CisJCWlmIChhbGVuID4gKGludClzaXplb2YoaW0tPmFkZHIpKQorCQkJYWxlbiA9IHNpemVvZihpbS0+YWRkcik7CisJCW1lbWNweShpbS0+YWRkciwgUlRBX0RBVEEodGJbSUZMQV9BRERSRVNTXSksIGFsZW4pOworCX0gZWxzZSB7CisJCWltLT5hbGVuID0gMDsKKwkJbWVtc2V0KGltLT5hZGRyLCAwLCBzaXplb2YoaW0tPmFkZHIpKTsKKwl9CisJc3RyY3B5KGltLT5uYW1lLCBSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pKTsKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciBGQVNUX0ZVTkMgKmxsX2lkeF9uMmEoaW50IGlkeCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpZHhtYXAgKmltOworCisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm4gIioiOworCWltID0gZmluZF9ieV9pbmRleChpZHgpOworCWlmIChpbSkKKwkJcmV0dXJuIGltLT5uYW1lOworCXNucHJpbnRmKGJ1ZiwgMTYsICJpZiVkIiwgaWR4KTsKKwlyZXR1cm4gYnVmOworfQorCisKK2NvbnN0IGNoYXIgRkFTVF9GVU5DICpsbF9pbmRleF90b19uYW1lKGludCBpZHgpCit7CisJc3RhdGljIGNoYXIgbmJ1ZlsxNl07CisKKwlyZXR1cm4gbGxfaWR4X24yYShpZHgsIG5idWYpOworfQorCisjaWZkZWYgVU5VU0VECitpbnQgbGxfaW5kZXhfdG9fdHlwZShpbnQgaWR4KQoreworCXN0cnVjdCBpZHhtYXAgKmltOworCisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm4gLTE7CisJaW0gPSBmaW5kX2J5X2luZGV4KGlkeCk7CisJaWYgKGltKQorCQlyZXR1cm4gaW0tPnR5cGU7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKK3Vuc2lnbmVkIEZBU1RfRlVOQyBsbF9pbmRleF90b19mbGFncyhpbnQgaWR4KQoreworCXN0cnVjdCBpZHhtYXAgKmltOworCisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpbSA9IGZpbmRfYnlfaW5kZXgoaWR4KTsKKwlpZiAoaW0pCisJCXJldHVybiBpbS0+ZmxhZ3M7CisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgeGxsX25hbWVfdG9faW5kZXgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgc29ja19mZDsKKworLyogY2FjaGluZyBpcyBub3Qgd2FycmFudGVkIC0gbm8gdXNlcnMgd2hpY2ggcmVwZWF0ZWRseSBjYWxsIGl0ICovCisjaWZkZWYgVU5VU0VECisJc3RhdGljIGNoYXIgbmNhY2hlWzE2XTsKKwlzdGF0aWMgaW50IGljYWNoZTsKKworCXN0cnVjdCBpZHhtYXAgKmltOworCWludCBpOworCisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKGljYWNoZSAmJiBzdHJjbXAobmFtZSwgbmNhY2hlKSA9PSAwKSB7CisJCXJldCA9IGljYWNoZTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChpZHhtYXApIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWZvciAoaW0gPSBpZHhtYXBbaV07IGltOyBpbSA9IGltLT5uZXh0KSB7CisJCQkJaWYgKHN0cmNtcChpbS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJCQlpY2FjaGUgPSBpbS0+aW5kZXg7CisJCQkJCXN0cmNweShuY2FjaGUsIG5hbWUpOworCQkJCQlyZXQgPSBpbS0+aW5kZXg7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiBXZSBoYXZlIG5vdCBmb3VuZCB0aGUgaW50ZXJmYWNlIGluIG91ciBjYWNoZSwgYnV0IHRoZSBrZXJuZWwKKwkgKiBtYXkgc3RpbGwga25vdyBhYm91dCBpdC4gT25lIHJlYXNvbiBpcyB0aGF0IHdlIG1heSBiZSB1c2luZworCSAqIG1vZHVsZSBvbi1kZW1hbmQgbG9hZGluZywgd2hpY2ggbWVhbnMgdGhhdCB0aGUga2VybmVsIHdpbGwKKwkgKiBsb2FkIHRoZSBtb2R1bGUgYW5kIG1ha2UgdGhlIGludGVyZmFjZSBleGlzdCBvbmx5IHdoZW4KKwkgKiB3ZSBleHBsaWNpdGVseSByZXF1ZXN0IGl0IChjaGVjayBmb3IgZGV2X2xvYWQoKSBpbiBuZXQvY29yZS9kZXYuYykuCisJICogSSBjYW4gdGhpbmsgb2Ygb3RoZXIgc2ltaWxhciBzY2VuYXJpbywgYnV0IHRoZXkgYXJlIGxlc3MgY29tbW9uLi4uCisJICogSmVhbiBJSSAqLworI2VuZGlmCisKKwlzb2NrX2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChzb2NrX2ZkID49IDApIHsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJaW50IHRtcDsKKworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgbmFtZSk7CisJCWlmci5pZnJfaWZpbmRleCA9IC0xOworCQl0bXAgPSBpb2N0bChzb2NrX2ZkLCBTSU9DR0lGSU5ERVgsICZpZnIpOworCQljbG9zZShzb2NrX2ZkKTsKKwkJaWYgKHRtcCA+PSAwKQorCQkJLyogSW4gdGhlb3J5LCB3ZSBzaG91bGQgcmVkdW1wIHRoZSBpbnRlcmZhY2UgbGlzdAorCQkJICogdG8gdXBkYXRlIG91ciBjYWNoZSwgdGhpcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlCisJCQkgKiB0byB0aGUgcmVhZGVyLi4uIEplYW4gSUkgKi8KKwkJCXJldCA9IGlmci5pZnJfaWZpbmRleDsKKwl9CisvKiBvdXQ6Ki8KKwlpZiAocmV0IDw9IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIGRldmljZSAnJXMnIiwgbmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IEZBU1RfRlVOQyBsbF9pbml0X21hcChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCkKK3sKKwl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KHJ0aCwgQUZfVU5TUEVDLCBSVE1fR0VUTElOSyk7CisJeHJ0bmxfZHVtcF9maWx0ZXIocnRoLCBsbF9yZW1lbWJlcl9pbmRleCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfbWFwLmggYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkMzgzNAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuaApAQCAtMCwwICsxLDE3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgTExfTUFQX0gKKyNkZWZpbmUgTExfTUFQX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworaW50IGxsX3JlbWVtYmVyX2luZGV4KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykgRkFTVF9GVU5DOworaW50IGxsX2luaXRfbWFwKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKSBGQVNUX0ZVTkM7CitpbnQgeGxsX25hbWVfdG9faW5kZXgoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY29uc3QgY2hhciAqbGxfaW5kZXhfdG9fbmFtZShpbnQgaWR4KSBGQVNUX0ZVTkM7Citjb25zdCBjaGFyICpsbF9pZHhfbjJhKGludCBpZHgsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworLyogaW50IGxsX2luZGV4X3RvX3R5cGUoaW50IGlkeCk7ICovCit1bnNpZ25lZCBsbF9pbmRleF90b19mbGFncyhpbnQgaWR4KSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3Byb3RvLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWFjODM2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3Byb3RvLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworI2lmICFFTkFCTEVfV0VSUk9SCisjd2FybmluZyBkZS1ibG9hdAorI2VuZGlmCisvKiBCZWZvcmUgcmUtZW5hYmxpbmcgdGhpcywgcGxlYXNlICgxKSBjb25kaXRpb25hbGl6ZSBleG90aWMgcHJvdG9jb2xzCisgKiBvbiBDT05GSUdfc29tZXRoaW5nLCBhbmQgKDIpIGRlY291cGxlIHN0cmluZ3MgYW5kIG51bWJlcnMKKyAqICh1c2UgbGxwcm90b19pZHNbXSA9IG4sbixuLi47IGFuZCBsbHByb3RvX25hbWVzW10gPSAibG9vcFwwIiAicHVwXDAiIC4uLjspCisgKi8KKworI2RlZmluZSBfX1BGKGYsbikgeyBFVEhfUF8jI2YsICNuIH0sCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKK30gbGxwcm90b19uYW1lc1tdID0geworX19QRihMT09QLGxvb3ApCitfX1BGKFBVUCxwdXApCisjaWZkZWYgRVRIX1BfUFVQQVQKK19fUEYoUFVQQVQscHVwYXQpCisjZW5kaWYKK19fUEYoSVAsaXApCitfX1BGKFgyNSx4MjUpCitfX1BGKEFSUCxhcnApCitfX1BGKEJQUSxicHEpCisjaWZkZWYgRVRIX1BfSUVFRVBVUAorX19QRihJRUVFUFVQLGllZWVwdXApCisjZW5kaWYKKyNpZmRlZiBFVEhfUF9JRUVFUFVQQVQKK19fUEYoSUVFRVBVUEFULGllZWVwdXBhdCkKKyNlbmRpZgorX19QRihERUMsZGVjKQorX19QRihETkFfREwsZG5hX2RsKQorX19QRihETkFfUkMsZG5hX3JjKQorX19QRihETkFfUlQsZG5hX3J0KQorX19QRihMQVQsbGF0KQorX19QRihESUFHLGRpYWcpCitfX1BGKENVU1QsY3VzdCkKK19fUEYoU0NBLHNjYSkKK19fUEYoUkFSUCxyYXJwKQorX19QRihBVEFMSyxhdGFsaykKK19fUEYoQUFSUCxhYXJwKQorX19QRihJUFgsaXB4KQorX19QRihJUFY2LGlwdjYpCisjaWZkZWYgRVRIX1BfUFBQX0RJU0MKK19fUEYoUFBQX0RJU0MscHBwX2Rpc2MpCisjZW5kaWYKKyNpZmRlZiBFVEhfUF9QUFBfU0VTCitfX1BGKFBQUF9TRVMscHBwX3NlcykKKyNlbmRpZgorI2lmZGVmIEVUSF9QX0FUTU1QT0EKK19fUEYoQVRNTVBPQSxhdG1tcG9hKQorI2VuZGlmCisjaWZkZWYgRVRIX1BfQVRNRkFURQorX19QRihBVE1GQVRFLGF0bWZhdGUpCisjZW5kaWYKKworX19QRig4MDJfMyw4MDJfMykKK19fUEYoQVgyNSxheDI1KQorX19QRihBTEwsYWxsKQorX19QRig4MDJfMiw4MDJfMikKK19fUEYoU05BUCxzbmFwKQorX19QRihERENNUCxkZGNtcCkKK19fUEYoV0FOX1BQUCx3YW5fcHBwKQorX19QRihQUFBfTVAscHBwX21wKQorX19QRihMT0NBTFRBTEssbG9jYWx0YWxrKQorX19QRihQUFBUQUxLLHBwcHRhbGspCitfX1BGKFRSXzgwMl8yLHRyXzgwMl8yKQorX19QRihNT0JJVEVYLG1vYml0ZXgpCitfX1BGKENPTlRST0wsY29udHJvbCkKK19fUEYoSVJEQSxpcmRhKQorI2lmZGVmIEVUSF9QX0VDT05FVAorX19QRihFQ09ORVQsZWNvbmV0KQorI2VuZGlmCisKK3sgMHg4MTAwLCAiODAyLjFRIiB9LAoreyBFVEhfUF9JUCwgImlwdjQiIH0sCit9OworI3VuZGVmIF9fUEYKKworCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbGxfcHJvdG9fbjJhKHVuc2lnbmVkIHNob3J0IGlkLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdW5zaWduZWQgaTsKKwlpZCA9IG50b2hzKGlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbHByb3RvX25hbWVzKTsgaSsrKSB7CisJCSBpZiAobGxwcm90b19uYW1lc1tpXS5pZCA9PSBpZCkKKwkJCXJldHVybiBsbHByb3RvX25hbWVzW2ldLm5hbWU7CisJfQorCXNucHJpbnRmKGJ1ZiwgbGVuLCAiWyVkXSIsIGlkKTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgRkFTVF9GVU5DIGxsX3Byb3RvX2Eybih1bnNpZ25lZCBzaG9ydCAqaWQsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxscHJvdG9fbmFtZXMpOyBpKyspIHsKKwkJIGlmIChzdHJjYXNlY21wKGxscHJvdG9fbmFtZXNbaV0ubmFtZSwgYnVmKSA9PSAwKSB7CisJCQkgaSA9IGxscHJvdG9fbmFtZXNbaV0uaWQ7CisJCQkgZ290byBnb29kOworCQkgfQorCX0KKwlpID0gYmJfc3RydG91KGJ1ZiwgTlVMTCwgMCk7CisJaWYgKGVycm5vIHx8IGkgPiAweGZmZmYpCisJCXJldHVybiAtMTsKKyBnb29kOgorCSppZCA9IGh0b25zKGkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3R5cGVzLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQyZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3R5cGVzLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAvKiBsaW51eC9pZl9hcnAuaCBuZWVkcyBpdCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGxsX3R5cGVfbjJhKGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgYXJwaHJkX25hbWVbXSA9CisJLyogMCwgICAgICAgICAgICAgICAgICAqLyAiZ2VuZXJpYyIgIlwwIgorCS8qIEFSUEhSRF9MT09QQkFDSywgICAgKi8gImxvb3BiYWNrIiAiXDAiCisJLyogQVJQSFJEX0VUSEVSLCAgICAgICAqLyAiZXRoZXIiICJcMCIKKyNpZmRlZiBBUlBIUkRfSU5GSU5JQkFORAorCS8qIEFSUEhSRF9JTkZJTklCQU5ELCAgKi8gImluZmluaWJhbmQiICJcMCIKKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFODAyX1RSCisJLyogQVJQSFJEX0lFRUU4MDIsICAgICAqLyAiaWVlZTgwMiIgIlwwIgorCS8qIEFSUEhSRF9JRUVFODAyX1RSLCAgKi8gInRyIiAiXDAiCisjZWxzZQorCS8qIEFSUEhSRF9JRUVFODAyLCAgICAgKi8gInRyIiAiXDAiCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTgwMjExCisJLyogQVJQSFJEX0lFRUU4MDIxMSwgICAqLyAiaWVlZTgwMi4xMSIgIlwwIgorI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUUxMzk0CisJLyogQVJQSFJEX0lFRUUxMzk0LCAgICAqLyAiaWVlZTEzOTQiICJcMCIKKyNlbmRpZgorCS8qIEFSUEhSRF9JUkRBLCAgICAgICAgKi8gImlyZGEiICJcMCIKKwkvKiBBUlBIUkRfU0xJUCwgICAgICAgICovICJzbGlwIiAiXDAiCisJLyogQVJQSFJEX0NTTElQLCAgICAgICAqLyAiY3NsaXAiICJcMCIKKwkvKiBBUlBIUkRfU0xJUDYsICAgICAgICovICJzbGlwNiIgIlwwIgorCS8qIEFSUEhSRF9DU0xJUDYsICAgICAgKi8gImNzbGlwNiIgIlwwIgorCS8qIEFSUEhSRF9QUFAsICAgICAgICAgKi8gInBwcCIgIlwwIgorCS8qIEFSUEhSRF9UVU5ORUwsICAgICAgKi8gImlwaXAiICJcMCIKKwkvKiBBUlBIUkRfVFVOTkVMNiwgICAgICovICJ0dW5uZWw2IiAiXDAiCisJLyogQVJQSFJEX1NJVCwgICAgICAgICAqLyAic2l0IiAiXDAiCisJLyogQVJQSFJEX0lQR1JFLCAgICAgICAqLyAiZ3JlIiAiXDAiCisjaWZkZWYgQVJQSFJEX1ZPSUQKKwkvKiBBUlBIUkRfVk9JRCwgICAgICAgICovICJ2b2lkIiAiXDAiCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTCisJLyogQVJQSFJEX0VFVEhFUiwgICAgICAqLyAiZWV0aGVyIiAiXDAiCisJLyogQVJQSFJEX0FYMjUsICAgICAgICAqLyAiYXgyNSIgIlwwIgorCS8qIEFSUEhSRF9QUk9ORVQsICAgICAgKi8gInByb25ldCIgIlwwIgorCS8qIEFSUEhSRF9DSEFPUywgICAgICAgKi8gImNoYW9zIiAiXDAiCisJLyogQVJQSFJEX0FSQ05FVCwgICAgICAqLyAiYXJjbmV0IiAiXDAiCisJLyogQVJQSFJEX0FQUExFVExLLCAgICAqLyAiYXRhbGsiICJcMCIKKwkvKiBBUlBIUkRfRExDSSwgICAgICAgICovICJkbGNpIiAiXDAiCisjaWZkZWYgQVJQSFJEX0FUTQorCS8qIEFSUEhSRF9BVE0sICAgICAgICAgKi8gImF0bSIgIlwwIgorI2VuZGlmCisJLyogQVJQSFJEX01FVFJJQ09NLCAgICAqLyAibWV0cmljb20iICJcMCIKKwkvKiBBUlBIUkRfUlNSVkQsICAgICAgICovICJyc3J2ZCIgIlwwIgorCS8qIEFSUEhSRF9BREFQVCwgICAgICAgKi8gImFkYXB0IiAiXDAiCisJLyogQVJQSFJEX1JPU0UsICAgICAgICAqLyAicm9zZSIgIlwwIgorCS8qIEFSUEhSRF9YMjUsICAgICAgICAgKi8gIngyNSIgIlwwIgorI2lmZGVmIEFSUEhSRF9IV1gyNQorCS8qIEFSUEhSRF9IV1gyNSwgICAgICAgKi8gImh3eDI1IiAiXDAiCisjZW5kaWYKKwkvKiBBUlBIUkRfSERMQywgICAgICAgICovICJoZGxjIiAiXDAiCisJLyogQVJQSFJEX0xBUEIsICAgICAgICAqLyAibGFwYiIgIlwwIgorI2lmZGVmIEFSUEhSRF9ERENNUAorCS8qIEFSUEhSRF9ERENNUCwgICAgICAgKi8gImRkY21wIiAiXDAiCisJLyogQVJQSFJEX1JBV0hETEMsICAgICAqLyAicmF3aGRsYyIgIlwwIgorI2VuZGlmCisJLyogQVJQSFJEX0ZSQUQsICAgICAgICAqLyAiZnJhZCIgIlwwIgorCS8qIEFSUEhSRF9TS0lQLCAgICAgICAgKi8gInNraXAiICJcMCIKKwkvKiBBUlBIUkRfTE9DQUxUTEssICAgICovICJsdGFsayIgIlwwIgorCS8qIEFSUEhSRF9GRERJLCAgICAgICAgKi8gImZkZGkiICJcMCIKKwkvKiBBUlBIUkRfQklGLCAgICAgICAgICovICJiaWYiICJcMCIKKwkvKiBBUlBIUkRfSVBERFAsICAgICAgICovICJpcC9kZHAiICJcMCIKKwkvKiBBUlBIUkRfUElNUkVHLCAgICAgICovICJwaW1yZWciICJcMCIKKwkvKiBBUlBIUkRfSElQUEksICAgICAgICovICJoaXBwaSIgIlwwIgorCS8qIEFSUEhSRF9BU0gsICAgICAgICAgKi8gImFzaCIgIlwwIgorCS8qIEFSUEhSRF9FQ09ORVQsICAgICAgKi8gImVjb25ldCIgIlwwIgorCS8qIEFSUEhSRF9GQ1BQLCAgICAgICAgKi8gImZjcHAiICJcMCIKKwkvKiBBUlBIUkRfRkNBTCwgICAgICAgICovICJmY2FsIiAiXDAiCisJLyogQVJQSFJEX0ZDUEwsICAgICAgICAqLyAiZmNwbCIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQywgICAgKi8gImZjZmIwIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzEsICAqLyAiZmNmYjEiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrMiwgICovICJmY2ZiMiIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQyszLCAgKi8gImZjZmIzIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzQsICAqLyAiZmNmYjQiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrNSwgICovICJmY2ZiNSIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQys2LCAgKi8gImZjZmI2IiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzcsICAqLyAiZmNmYjciICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrOCwgICovICJmY2ZiOCIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQys5LCAgKi8gImZjZmI5IiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzEwLCAqLyAiZmNmYjEwIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzExLCAqLyAiZmNmYjExIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzEyLCAqLyAiZmNmYjEyIiAiXDAiCisjZW5kaWYgLyogRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyAqLworCTsKKworCS8qIEtlZXAgdGhlc2UgYXJyYXlzIGluIHN5bmMhICovCisKKwlzdGF0aWMgY29uc3QgdWludDE2X3QgYXJwaHJkX3R5cGVbXSA9IHsKKwkwLCAgICAgICAgICAgICAgICAgIC8qICJnZW5lcmljIiAiXDAiICovCisJQVJQSFJEX0xPT1BCQUNLLCAgICAvKiAibG9vcGJhY2siICJcMCIgKi8KKwlBUlBIUkRfRVRIRVIsICAgICAgIC8qICJldGhlciIgIlwwIiAqLworI2lmZGVmIEFSUEhSRF9JTkZJTklCQU5ECisJQVJQSFJEX0lORklOSUJBTkQsICAvKiAiaW5maW5pYmFuZCIgIlwwIiAqLworI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUU4MDJfVFIKKwlBUlBIUkRfSUVFRTgwMiwgICAgIC8qICJpZWVlODAyIiAiXDAiICovCisJQVJQSFJEX0lFRUU4MDJfVFIsICAvKiAidHIiICJcMCIgKi8KKyNlbHNlCisJQVJQSFJEX0lFRUU4MDIsICAgICAvKiAidHIiICJcMCIgKi8KKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFODAyMTEKKwlBUlBIUkRfSUVFRTgwMjExLCAgIC8qICJpZWVlODAyLjExIiAiXDAiICovCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTEzOTQKKwlBUlBIUkRfSUVFRTEzOTQsICAgIC8qICJpZWVlMTM5NCIgIlwwIiAqLworI2VuZGlmCisJQVJQSFJEX0lSREEsICAgICAgICAvKiAiaXJkYSIgIlwwIiAqLworCUFSUEhSRF9TTElQLCAgICAgICAgLyogInNsaXAiICJcMCIgKi8KKwlBUlBIUkRfQ1NMSVAsICAgICAgIC8qICJjc2xpcCIgIlwwIiAqLworCUFSUEhSRF9TTElQNiwgICAgICAgLyogInNsaXA2IiAiXDAiICovCisJQVJQSFJEX0NTTElQNiwgICAgICAvKiAiY3NsaXA2IiAiXDAiICovCisJQVJQSFJEX1BQUCwgICAgICAgICAvKiAicHBwIiAiXDAiICovCisJQVJQSFJEX1RVTk5FTCwgICAgICAvKiAiaXBpcCIgIlwwIiAqLworCUFSUEhSRF9UVU5ORUw2LCAgICAgLyogInR1bm5lbDYiICJcMCIgKi8KKwlBUlBIUkRfU0lULCAgICAgICAgIC8qICJzaXQiICJcMCIgKi8KKwlBUlBIUkRfSVBHUkUsICAgICAgIC8qICJncmUiICJcMCIgKi8KKyNpZmRlZiBBUlBIUkRfVk9JRAorCUFSUEhSRF9WT0lELCAgICAgICAgLyogInZvaWQiICJcMCIgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMKKwlBUlBIUkRfRUVUSEVSLCAgICAgIC8qICJlZXRoZXIiICJcMCIgKi8KKwlBUlBIUkRfQVgyNSwgICAgICAgIC8qICJheDI1IiAiXDAiICovCisJQVJQSFJEX1BST05FVCwgICAgICAvKiAicHJvbmV0IiAiXDAiICovCisJQVJQSFJEX0NIQU9TLCAgICAgICAvKiAiY2hhb3MiICJcMCIgKi8KKwlBUlBIUkRfQVJDTkVULCAgICAgIC8qICJhcmNuZXQiICJcMCIgKi8KKwlBUlBIUkRfQVBQTEVUTEssICAgIC8qICJhdGFsayIgIlwwIiAqLworCUFSUEhSRF9ETENJLCAgICAgICAgLyogImRsY2kiICJcMCIgKi8KKyNpZmRlZiBBUlBIUkRfQVRNCisJQVJQSFJEX0FUTSwgICAgICAgICAvKiAiYXRtIiAiXDAiICovCisjZW5kaWYKKwlBUlBIUkRfTUVUUklDT00sICAgIC8qICJtZXRyaWNvbSIgIlwwIiAqLworCUFSUEhSRF9SU1JWRCwgICAgICAgLyogInJzcnZkIiAiXDAiICovCisJQVJQSFJEX0FEQVBULCAgICAgICAvKiAiYWRhcHQiICJcMCIgKi8KKwlBUlBIUkRfUk9TRSwgICAgICAgIC8qICJyb3NlIiAiXDAiICovCisJQVJQSFJEX1gyNSwgICAgICAgICAvKiAieDI1IiAiXDAiICovCisjaWZkZWYgQVJQSFJEX0hXWDI1CisJQVJQSFJEX0hXWDI1LCAgICAgICAvKiAiaHd4MjUiICJcMCIgKi8KKyNlbmRpZgorCUFSUEhSRF9IRExDLCAgICAgICAgLyogImhkbGMiICJcMCIgKi8KKwlBUlBIUkRfTEFQQiwgICAgICAgIC8qICJsYXBiIiAiXDAiICovCisjaWZkZWYgQVJQSFJEX0REQ01QCisJQVJQSFJEX0REQ01QLCAgICAgICAvKiAiZGRjbXAiICJcMCIgKi8KKwlBUlBIUkRfUkFXSERMQywgICAgIC8qICJyYXdoZGxjIiAiXDAiICovCisjZW5kaWYKKwlBUlBIUkRfRlJBRCwgICAgICAgIC8qICJmcmFkIiAiXDAiICovCisJQVJQSFJEX1NLSVAsICAgICAgICAvKiAic2tpcCIgIlwwIiAqLworCUFSUEhSRF9MT0NBTFRMSywgICAgLyogImx0YWxrIiAiXDAiICovCisJQVJQSFJEX0ZEREksICAgICAgICAvKiAiZmRkaSIgIlwwIiAqLworCUFSUEhSRF9CSUYsICAgICAgICAgLyogImJpZiIgIlwwIiAqLworCUFSUEhSRF9JUEREUCwgICAgICAgLyogImlwL2RkcCIgIlwwIiAqLworCUFSUEhSRF9QSU1SRUcsICAgICAgLyogInBpbXJlZyIgIlwwIiAqLworCUFSUEhSRF9ISVBQSSwgICAgICAgLyogImhpcHBpIiAiXDAiICovCisJQVJQSFJEX0FTSCwgICAgICAgICAvKiAiYXNoIiAiXDAiICovCisJQVJQSFJEX0VDT05FVCwgICAgICAvKiAiZWNvbmV0IiAiXDAiICovCisJQVJQSFJEX0ZDUFAsICAgICAgICAvKiAiZmNwcCIgIlwwIiAqLworCUFSUEhSRF9GQ0FMLCAgICAgICAgLyogImZjYWwiICJcMCIgKi8KKwlBUlBIUkRfRkNQTCwgICAgICAgIC8qICJmY3BsIiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDLCAgICAvKiAiZmNmYjAiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMSwgIC8qICJmY2ZiMSIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQysyLCAgLyogImZjZmIyIiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzMsICAvKiAiZmNmYjMiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrNCwgIC8qICJmY2ZiNCIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQys1LCAgLyogImZjZmI1IiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzYsICAvKiAiZmNmYjYiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrNywgIC8qICJmY2ZiNyIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQys4LCAgLyogImZjZmI4IiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzksICAvKiAiZmNmYjkiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMTAsIC8qICJmY2ZiMTAiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMTEsIC8qICJmY2ZiMTEiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMTIsIC8qICJmY2ZiMTIiICJcMCIgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTICovCisJfTsKKworCXVuc2lnbmVkIGk7CisJY29uc3QgY2hhciAqYW5hbWUgPSBhcnBocmRfbmFtZTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcnBocmRfdHlwZSk7IGkrKykgeworCQlpZiAoYXJwaHJkX3R5cGVbaV0gPT0gdHlwZSkKKwkJCXJldHVybiBhbmFtZTsKKwkJYW5hbWUgKz0gc3RybGVuKGFuYW1lKSArIDE7CisJfQorCXNwcmludGYoYnVmLCAiWyVkXSIsIHR5cGUpOworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzRhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHJ0bmxfdGFiX3QgeworCWNvbnN0IGNoYXIgKmNhY2hlZF9zdHI7CisJdW5zaWduZWQgY2FjaGVkX3Jlc3VsdDsKKwljb25zdCBjaGFyICp0YWJbMjU2XTsKK30gcnRubF90YWJfdDsKKworc3RhdGljIHZvaWQgcnRubF90YWJfaW5pdGlhbGl6ZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICoqdGFiKQoreworCWNoYXIgKnRva2VuWzJdOworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoZmlsZSwgZm9wZW5fZm9yX3JlYWQpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDIsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQl1bnNpZ25lZCBpZCA9IGJiX3N0cnRvdSh0b2tlblswXSwgTlVMTCwgMCk7CisJCWlmIChpZCA+IDI1NikgeworCQkJYmJfZXJyb3JfbXNnKCJkYXRhYmFzZSAlcyBpcyBjb3JydXB0ZWQgYXQgbGluZSAlZCIsCisJCQkJZmlsZSwgcGFyc2VyLT5saW5lbm8pOworCQkJYnJlYWs7CisJCX0KKwkJdGFiW2lkXSA9IHhzdHJkdXAodG9rZW5bMV0pOworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKK30KKworc3RhdGljIGludCBydG5sX2EybihydG5sX3RhYl90ICp0YWIsIHVpbnQzMl90ICppZCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBpOworCisJaWYgKHRhYi0+Y2FjaGVkX3N0ciAmJiBzdHJjbXAodGFiLT5jYWNoZWRfc3RyLCBhcmcpID09IDApIHsKKwkJKmlkID0gdGFiLT5jYWNoZWRfcmVzdWx0OworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaWYgKHRhYi0+dGFiW2ldCisJCSAmJiBzdHJjbXAodGFiLT50YWJbaV0sIGFyZykgPT0gMAorCQkpIHsKKwkJCXRhYi0+Y2FjaGVkX3N0ciA9IHRhYi0+dGFiW2ldOworCQkJdGFiLT5jYWNoZWRfcmVzdWx0ID0gaTsKKwkJCSppZCA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWkgPSBiYl9zdHJ0b3UoYXJnLCBOVUxMLCBiYXNlKTsKKwlpZiAoaSA+IDI1NSkKKwkJcmV0dXJuIC0xOworCSppZCA9IGk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnRwcm90X3RhYjsKKworc3RhdGljIHZvaWQgcnRubF9ydHByb3RfaW5pdGlhbGl6ZSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpbml0X3RhYltdID0geworCQkibm9uZSIsCisJCSJyZWRpcmVjdCIsCisJCSJrZXJuZWwiLAorCQkiYm9vdCIsCisJCSJzdGF0aWMiLAorCQlOVUxMLAorCQlOVUxMLAorCQlOVUxMLAorCQkiZ2F0ZWQiLAorCQkicmEiLAorCQkibXJ0IiwKKwkJInplYnJhIiwKKwkJImJpcmQiLAorCX07CisKKwlpZiAocnRubF9ydHByb3RfdGFiKQorCQlyZXR1cm47CisJcnRubF9ydHByb3RfdGFiID0geHphbGxvYyhzaXplb2YoKnJ0bmxfcnRwcm90X3RhYikpOworCW1lbWNweShydG5sX3J0cHJvdF90YWItPnRhYiwgaW5pdF90YWIsIHNpemVvZihpbml0X3RhYikpOworCXJ0bmxfdGFiX2luaXRpYWxpemUoIi9ldGMvaXByb3V0ZTIvcnRfcHJvdG9zIiwgcnRubF9ydHByb3RfdGFiLT50YWIpOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcnRubF9ydHByb3RfbjJhKGludCBpZCwgY2hhciAqYnVmKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCisJcnRubF9ydHByb3RfaW5pdGlhbGl6ZSgpOworCisJaWYgKHJ0bmxfcnRwcm90X3RhYi0+dGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnRwcm90X3RhYi0+dGFiW2lkXTsKKwkvKiBidWYgaXMgU1BSSU5UX0JTSVpFIGJpZyAqLworCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX3J0cHJvdF9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpCit7CisJcnRubF9ydHByb3RfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0cHJvdF90YWIsIGlkLCBhcmcsIDApOworfQorCisKK3N0YXRpYyBydG5sX3RhYl90ICpydG5sX3J0c2NvcGVfdGFiOworCitzdGF0aWMgdm9pZCBydG5sX3J0c2NvcGVfaW5pdGlhbGl6ZSh2b2lkKQoreworCWlmIChydG5sX3J0c2NvcGVfdGFiKQorCQlyZXR1cm47CisJcnRubF9ydHNjb3BlX3RhYiA9IHh6YWxsb2Moc2l6ZW9mKCpydG5sX3J0c2NvcGVfdGFiKSk7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzBdID0gImdsb2JhbCI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzI1NV0gPSAibm93aGVyZSI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzI1NF0gPSAiaG9zdCI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzI1M10gPSAibGluayI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzIwMF0gPSAic2l0ZSI7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgiL2V0Yy9pcHJvdXRlMi9ydF9zY29wZXMiLCBydG5sX3J0c2NvcGVfdGFiLT50YWIpOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcnRubF9ydHNjb3BlX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoaWQgPCAwIHx8IGlkID49IDI1NikgeworCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCQlyZXR1cm4gYnVmOworCX0KKworCXJ0bmxfcnRzY29wZV9pbml0aWFsaXplKCk7CisKKwlpZiAocnRubF9ydHNjb3BlX3RhYi0+dGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnRzY29wZV90YWItPnRhYltpZF07CisJLyogYnVmIGlzIFNQUklOVF9CU0laRSBiaWcgKi8KKwlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRubF9ydHNjb3BlX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykKK3sKKwlydG5sX3J0c2NvcGVfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0c2NvcGVfdGFiLCBpZCwgYXJnLCAwKTsKK30KKworCitzdGF0aWMgcnRubF90YWJfdCAqcnRubF9ydHJlYWxtX3RhYjsKKworc3RhdGljIHZvaWQgcnRubF9ydHJlYWxtX2luaXRpYWxpemUodm9pZCkKK3sKKwlpZiAocnRubF9ydHJlYWxtX3RhYikgcmV0dXJuOworCXJ0bmxfcnRyZWFsbV90YWIgPSB4emFsbG9jKHNpemVvZigqcnRubF9ydHJlYWxtX3RhYikpOworCXJ0bmxfcnRyZWFsbV90YWItPnRhYlswXSA9ICJ1bmtub3duIjsKKwlydG5sX3RhYl9pbml0aWFsaXplKCIvZXRjL2lwcm91dGUyL3J0X3JlYWxtcyIsIHJ0bmxfcnRyZWFsbV90YWItPnRhYik7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRubF9ydHJlYWxtX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykKK3sKKwlydG5sX3J0cmVhbG1faW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0cmVhbG1fdGFiLCBpZCwgYXJnLCAwKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JVTEUKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBydG5sX3J0cmVhbG1fbjJhKGludCBpZCwgY2hhciAqYnVmKQoreworCWlmIChpZCA8IDAgfHwgaWQgPj0gMjU2KSB7CisJCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJCXJldHVybiBidWY7CisJfQorCisJcnRubF9ydHJlYWxtX2luaXRpYWxpemUoKTsKKworCWlmIChydG5sX3J0cmVhbG1fdGFiLT50YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydHJlYWxtX3RhYi0+dGFiW2lkXTsKKwkvKiBidWYgaXMgU1BSSU5UX0JTSVpFIGJpZyAqLworCXNwcmludGYoYnVmLCAiJWQiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBydG5sX3RhYl90ICpydG5sX3J0ZHNmaWVsZF90YWI7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnRkc2ZpZWxkX2luaXRpYWxpemUodm9pZCkKK3sKKwlpZiAocnRubF9ydGRzZmllbGRfdGFiKSByZXR1cm47CisJcnRubF9ydGRzZmllbGRfdGFiID0geHphbGxvYyhzaXplb2YoKnJ0bmxfcnRkc2ZpZWxkX3RhYikpOworCXJ0bmxfcnRkc2ZpZWxkX3RhYi0+dGFiWzBdID0gIjAiOworCXJ0bmxfdGFiX2luaXRpYWxpemUoIi9ldGMvaXByb3V0ZTIvcnRfZHNmaWVsZCIsIHJ0bmxfcnRkc2ZpZWxkX3RhYi0+dGFiKTsKK30KKworY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfZHNmaWVsZF9uMmEoaW50IGlkLCBjaGFyICpidWYpCit7CisJaWYgKGlkIDwgMCB8fCBpZCA+PSAyNTYpIHsKKwkJc3ByaW50ZihidWYsICIlZCIsIGlkKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlydG5sX3J0ZHNmaWVsZF9pbml0aWFsaXplKCk7CisKKwlpZiAocnRubF9ydGRzZmllbGRfdGFiLT50YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydGRzZmllbGRfdGFiLT50YWJbaWRdOworCS8qIGJ1ZiBpcyBTUFJJTlRfQlNJWkUgYmlnICovCisJc3ByaW50ZihidWYsICIweCUwMngiLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX2RzZmllbGRfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKQoreworCXJ0bmxfcnRkc2ZpZWxkX2luaXRpYWxpemUoKTsKKwlyZXR1cm4gcnRubF9hMm4ocnRubF9ydGRzZmllbGRfdGFiLCBpZCwgYXJnLCAxNik7Cit9CisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JVTEUKK3N0YXRpYyBydG5sX3RhYl90ICpydG5sX3J0dGFibGVfdGFiOworCitzdGF0aWMgdm9pZCBydG5sX3J0dGFibGVfaW5pdGlhbGl6ZSh2b2lkKQoreworCWlmIChydG5sX3J0ZHNmaWVsZF90YWIpIHJldHVybjsKKwlydG5sX3J0dGFibGVfdGFiID0geHphbGxvYyhzaXplb2YoKnJ0bmxfcnR0YWJsZV90YWIpKTsKKwlydG5sX3J0dGFibGVfdGFiLT50YWJbMF0gPSAidW5zcGVjIjsKKwlydG5sX3J0dGFibGVfdGFiLT50YWJbMjU1XSA9ICJsb2NhbCI7CisJcnRubF9ydHRhYmxlX3RhYi0+dGFiWzI1NF0gPSAibWFpbiI7CisJcnRubF9ydHRhYmxlX3RhYi0+dGFiWzI1M10gPSAiZGVmYXVsdCI7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgiL2V0Yy9pcHJvdXRlMi9ydF90YWJsZXMiLCBydG5sX3J0dGFibGVfdGFiLT50YWIpOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcnRubF9ydHRhYmxlX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoaWQgPCAwIHx8IGlkID49IDI1NikgeworCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCQlyZXR1cm4gYnVmOworCX0KKworCXJ0bmxfcnR0YWJsZV9pbml0aWFsaXplKCk7CisKKwlpZiAocnRubF9ydHRhYmxlX3RhYi0+dGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnR0YWJsZV90YWItPnRhYltpZF07CisJLyogYnVmIGlzIFNQUklOVF9CU0laRSBiaWcgKi8KKwlzcHJpbnRmKGJ1ZiwgIiVkIiwgaWQpOworCXJldHVybiBidWY7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRubF9ydHRhYmxlX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykKK3sKKwlydG5sX3J0dGFibGVfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0dGFibGVfdGFiLCBpZCwgYXJnLCAwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuaCBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2FhODUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuaApAQCAtMCwwICsxLDMwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgUlRfTkFNRVNfSAorI2RlZmluZSBSVF9OQU1FU19IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIGJ1ZiBpcyBTUFJJTlRfQlNJWkUgYmlnICovCitleHRlcm4gY29uc3QgY2hhciogcnRubF9ydHByb3RfbjJhKGludCBpZCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CitleHRlcm4gY29uc3QgY2hhciogcnRubF9ydHNjb3BlX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworZXh0ZXJuIGNvbnN0IGNoYXIqIHJ0bmxfcnRyZWFsbV9uMmEoaW50IGlkLCBjaGFyICpidWYpIEZBU1RfRlVOQzsKK2V4dGVybiBjb25zdCBjaGFyKiBydG5sX2RzZmllbGRfbjJhKGludCBpZCwgY2hhciAqYnVmKSBGQVNUX0ZVTkM7CitleHRlcm4gY29uc3QgY2hhciogcnRubF9ydHRhYmxlX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydG5sX3J0cHJvdF9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRubF9ydHNjb3BlX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydG5sX3J0cmVhbG1fYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0bmxfZHNmaWVsZF9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRubF9ydHRhYmxlX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykgRkFTVF9GVU5DOworCitleHRlcm4gY29uc3QgY2hhciogbGxfdHlwZV9uMmEoaW50IHR5cGUsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworCitleHRlcm4gY29uc3QgY2hhciogbGxfYWRkcl9uMmEodW5zaWduZWQgY2hhciAqYWRkciwgaW50IGFsZW4sIGludCB0eXBlLAorCQkJCWNoYXIgKmJ1ZiwgaW50IGJsZW4pIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgbGxfYWRkcl9hMm4odW5zaWduZWQgY2hhciAqbGxhZGRyLCBpbnQgbGVuLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIGxsX3Byb3RvX24yYSh1bnNpZ25lZCBzaG9ydCBpZCwgY2hhciAqYnVmLCBpbnQgbGVuKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGxsX3Byb3RvX2Eybih1bnNpZ25lZCBzaG9ydCAqaWQsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydG1fbWFwLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRtX21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWI1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRtX21hcC5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBydG5sX3J0bnR5cGVfbjJhKGludCBpZCwgY2hhciAqYnVmKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFJUTl9VTlNQRUM6CisJCXJldHVybiAibm9uZSI7CisJY2FzZSBSVE5fVU5JQ0FTVDoKKwkJcmV0dXJuICJ1bmljYXN0IjsKKwljYXNlIFJUTl9MT0NBTDoKKwkJcmV0dXJuICJsb2NhbCI7CisJY2FzZSBSVE5fQlJPQURDQVNUOgorCQlyZXR1cm4gImJyb2FkY2FzdCI7CisJY2FzZSBSVE5fQU5ZQ0FTVDoKKwkJcmV0dXJuICJhbnljYXN0IjsKKwljYXNlIFJUTl9NVUxUSUNBU1Q6CisJCXJldHVybiAibXVsdGljYXN0IjsKKwljYXNlIFJUTl9CTEFDS0hPTEU6CisJCXJldHVybiAiYmxhY2tob2xlIjsKKwljYXNlIFJUTl9VTlJFQUNIQUJMRToKKwkJcmV0dXJuICJ1bnJlYWNoYWJsZSI7CisJY2FzZSBSVE5fUFJPSElCSVQ6CisJCXJldHVybiAicHJvaGliaXQiOworCWNhc2UgUlROX1RIUk9XOgorCQlyZXR1cm4gInRocm93IjsKKwljYXNlIFJUTl9OQVQ6CisJCXJldHVybiAibmF0IjsKKwljYXNlIFJUTl9YUkVTT0xWRToKKwkJcmV0dXJuICJ4cmVzb2x2ZSI7CisJZGVmYXVsdDoKKwkJLyogYnVmIGlzIFNQUklOVF9CU0laRSBiaWcgKi8KKwkJc3ByaW50ZihidWYsICIlZCIsIGlkKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9Cit9CisKKworaW50IEZBU1RfRlVOQyBydG5sX3J0bnR5cGVfYTJuKGludCAqaWQsIGNoYXIgKmFyZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJsb2NhbFwwIiJuYXRcMCIiYnJvYWRjYXN0XDAiImJyZFwwIiJhbnljYXN0XDAiCisJCSJtdWx0aWNhc3RcMCIicHJvaGliaXRcMCIidW5yZWFjaGFibGVcMCIiYmxhY2tob2xlXDAiCisJCSJ4cmVzb2x2ZVwwIiJ1bmljYXN0XDAiInRocm93XDAiOworCWVudW0geworCQlBUkdfbG9jYWwgPSAxLCBBUkdfbmF0LCBBUkdfYnJvYWRjYXN0LCBBUkdfYnJkLCBBUkdfYW55Y2FzdCwKKwkJQVJHX211bHRpY2FzdCwgQVJHX3Byb2hpYml0LCBBUkdfdW5yZWFjaGFibGUsIEFSR19ibGFja2hvbGUsCisJCUFSR194cmVzb2x2ZSwgQVJHX3VuaWNhc3QsIEFSR190aHJvdworCX07CisJY29uc3Qgc21hbGx1aW50IGtleSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsIGFyZykgKyAxOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHJlczsKKworCWlmIChrZXkgPT0gQVJHX2xvY2FsKQorCQlyZXMgPSBSVE5fTE9DQUw7CisJZWxzZSBpZiAoa2V5ID09IEFSR19uYXQpCisJCXJlcyA9IFJUTl9OQVQ7CisJZWxzZSBpZiAoa2V5ID09IEFSR19icm9hZGNhc3QgfHwga2V5ID09IEFSR19icmQpCisJCXJlcyA9IFJUTl9CUk9BRENBU1Q7CisJZWxzZSBpZiAoa2V5ID09IEFSR19hbnljYXN0KQorCQlyZXMgPSBSVE5fQU5ZQ0FTVDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX211bHRpY2FzdCkKKwkJcmVzID0gUlROX01VTFRJQ0FTVDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX3Byb2hpYml0KQorCQlyZXMgPSBSVE5fUFJPSElCSVQ7CisJZWxzZSBpZiAoa2V5ID09IEFSR191bnJlYWNoYWJsZSkKKwkJcmVzID0gUlROX1VOUkVBQ0hBQkxFOworCWVsc2UgaWYgKGtleSA9PSBBUkdfYmxhY2tob2xlKQorCQlyZXMgPSBSVE5fQkxBQ0tIT0xFOworCWVsc2UgaWYgKGtleSA9PSBBUkdfeHJlc29sdmUpCisJCXJlcyA9IFJUTl9YUkVTT0xWRTsKKwllbHNlIGlmIChrZXkgPT0gQVJHX3VuaWNhc3QpCisJCXJlcyA9IFJUTl9VTklDQVNUOworCWVsc2UgaWYgKGtleSA9PSBBUkdfdGhyb3cpCisJCXJlcyA9IFJUTl9USFJPVzsKKwllbHNlIHsKKwkJcmVzID0gc3RydG91bChhcmcsICZlbmQsIDApOworCQlpZiAoZW5kID09IGFyZyB8fCAqZW5kIHx8IHJlcyA+IDI1NSkKKwkJCXJldHVybiAtMTsKKwl9CisJKmlkID0gcmVzOworCXJldHVybiAwOworfQorCitpbnQgRkFTVF9GVU5DIGdldF9ydF9yZWFsbXModWludDMyX3QgKnJlYWxtcywgY2hhciAqYXJnKQoreworCXVpbnQzMl90IHJlYWxtID0gMDsKKwljaGFyICpwID0gc3RyY2hyKGFyZywgJy8nKTsKKworCSpyZWFsbXMgPSAwOworCWlmIChwKSB7CisJCSpwID0gMDsKKwkJaWYgKHJ0bmxfcnRyZWFsbV9hMm4ocmVhbG1zLCBhcmcpKSB7CisJCQkqcCA9ICcvJzsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqcmVhbG1zIDw8PSAxNjsKKwkJKnAgPSAnLyc7CisJCWFyZyA9IHArMTsKKwl9CisJaWYgKCphcmcgJiYgcnRubF9ydHJlYWxtX2EybigmcmVhbG0sIGFyZykpCisJCXJldHVybiAtMTsKKwkqcmVhbG1zIHw9IHJlYWxtOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0bV9tYXAuaCBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydG1fbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3N2JkNQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydG1fbWFwLmgKQEAgLTAsMCArMSwxNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIFJUTV9NQVBfSAorI2RlZmluZSBSVE1fTUFQX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworY29uc3QgY2hhciAqcnRubF9ydG50eXBlX24yYShpbnQgaWQsIGNoYXIgKmJ1ZikgRkFTVF9GVU5DOworaW50IHJ0bmxfcnRudHlwZV9hMm4oaW50ICppZCwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisKK2ludCBnZXRfcnRfcmVhbG1zKHVpbnQzMl90ICpyZWFsbXMsIGNoYXIgKmFyZykgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS91dGlscy5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmZTMwNgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS91dGlscy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5Mjk6IHJlc29sdmUgYWRkcmVzc2VzCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCit1bnNpZ25lZCBnZXRfdW5zaWduZWQoY2hhciAqYXJnLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCphcmcpIHsKKwkJcmVzID0gc3RydG91bChhcmcsICZwdHIsIDApOworLy9GSVhNRTogIiIgd2lsbCBiZSBhY2NlcHRlZCB0b28sIGlzIGl0IGNvcnJlY3Q/IQorCQlpZiAoISpwdHIgJiYgcmVzIDw9IFVJTlRfTUFYKSB7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCWludmFyZyhhcmcsIGVycm1zZyk7IC8qIGRvZXMgbm90IHJldHVybiAqLworfQorCit1aW50MzJfdCBnZXRfdTMyKGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKQoreworCXVuc2lnbmVkIGxvbmcgcmVzOworCWNoYXIgKnB0cjsKKworCWlmICgqYXJnKSB7CisJCXJlcyA9IHN0cnRvdWwoYXJnLCAmcHRyLCAwKTsKKy8vRklYTUU6ICIiIHdpbGwgYmUgYWNjZXB0ZWQgdG9vLCBpcyBpdCBjb3JyZWN0PyEKKwkJaWYgKCEqcHRyICYmIHJlcyA8PSAweEZGRkZGRkZGVUwpIHsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisJaW52YXJnKGFyZywgZXJybXNnKTsgLyogZG9lcyBub3QgcmV0dXJuICovCit9CisKK3VpbnQxNl90IGdldF91MTYoY2hhciAqYXJnLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCphcmcpIHsKKwkJcmVzID0gc3RydG91bChhcmcsICZwdHIsIDApOworLy9GSVhNRTogIiIgd2lsbCBiZSBhY2NlcHRlZCB0b28sIGlzIGl0IGNvcnJlY3Q/IQorCQlpZiAoISpwdHIgJiYgcmVzIDw9IDB4RkZGRikgeworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpbnZhcmcoYXJnLCBlcnJtc2cpOyAvKiBkb2VzIG5vdCByZXR1cm4gKi8KK30KKworaW50IGdldF9hZGRyXzEoaW5ldF9wcmVmaXggKmFkZHIsIGNoYXIgKm5hbWUsIGludCBmYW1pbHkpCit7CisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZigqYWRkcikpOworCisJaWYgKHN0cmNtcChuYW1lLCAiZGVmYXVsdCIpID09IDAKKwkgfHwgc3RyY21wKG5hbWUsICJhbGwiKSA9PSAwCisJIHx8IHN0cmNtcChuYW1lLCAiYW55IikgPT0gMAorCSkgeworCQlhZGRyLT5mYW1pbHkgPSBmYW1pbHk7CisJCWFkZHItPmJ5dGVsZW4gPSAoZmFtaWx5ID09IEFGX0lORVQ2ID8gMTYgOiA0KTsKKwkJYWRkci0+Yml0bGVuID0gLTE7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjaHIobmFtZSwgJzonKSkgeworCQlhZGRyLT5mYW1pbHkgPSBBRl9JTkVUNjsKKwkJaWYgKGZhbWlseSAhPSBBRl9VTlNQRUMgJiYgZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJcmV0dXJuIC0xOworCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBuYW1lLCBhZGRyLT5kYXRhKSA8PSAwKQorCQkJcmV0dXJuIC0xOworCQlhZGRyLT5ieXRlbGVuID0gMTY7CisJCWFkZHItPmJpdGxlbiA9IC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBmYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC0xOworCisJLyogVHJ5IHRvIHBhcnNlIGl0IGFzIElQdjQgKi8KKwlhZGRyLT5mYW1pbHkgPSBBRl9JTkVUOworI2lmIDAgLyogRG9lc24ndCBoYW5kbGUgZS5nLiAiMTAuMTAiLCBmb3IgZXhhbXBsZSwgImlwIHIgbCByb290IDEwLjEwLzE2IiAqLworCWlmIChpbmV0X3B0b24oQUZfSU5FVCwgbmFtZSwgYWRkci0+ZGF0YSkgPD0gMCkKKwkJcmV0dXJuIC0xOworI2Vsc2UKKwl7CisJCXVuc2lnbmVkIGkgPSAwOworCQl1bnNpZ25lZCBuID0gMDsKKwkJY29uc3QgY2hhciAqY3AgPSBuYW1lIC0gMTsKKwkJd2hpbGUgKCorK2NwKSB7CisJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKCpjcCAtICcwJykgPD0gOSkgeworCQkJCW4gPSAxMCAqIG4gKyAodW5zaWduZWQgY2hhcikoKmNwIC0gJzAnKTsKKwkJCQlpZiAobiA+PSAyNTYpCisJCQkJCXJldHVybiAtMTsKKwkJCQkoKHVpbnQ4X3QqKWFkZHItPmRhdGEpW2ldID0gbjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgqY3AgPT0gJy4nICYmICsraSA8PSAzKSB7CisJCQkJbiA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisjZW5kaWYKKwlhZGRyLT5ieXRlbGVuID0gNDsKKwlhZGRyLT5iaXRsZW4gPSAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfcHJlZml4XzEoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KQoreworCWNoYXIgKnNsYXNoOworCisJbWVtc2V0KGRzdCwgMCwgc2l6ZW9mKCpkc3QpKTsKKworCWlmIChzdHJjbXAoYXJnLCAiZGVmYXVsdCIpID09IDAKKwkgfHwgc3RyY21wKGFyZywgImFsbCIpID09IDAKKwkgfHwgc3RyY21wKGFyZywgImFueSIpID09IDAKKwkpIHsKKwkJZHN0LT5mYW1pbHkgPSBmYW1pbHk7CisJCS8qZHN0LT5ieXRlbGVuID0gMDsgLSBkb25lIGJ5IG1lbXNldCAqLworCQkvKmRzdC0+Yml0bGVuID0gMDsqLworCQlyZXR1cm47CisJfQorCisJc2xhc2ggPSBzdHJjaHIoYXJnLCAnLycpOworCWlmIChzbGFzaCkKKwkJKnNsYXNoID0gJ1wwJzsKKworCWlmIChnZXRfYWRkcl8xKGRzdCwgYXJnLCBmYW1pbHkpID09IDApIHsKKwkJZHN0LT5iaXRsZW4gPSAoZHN0LT5mYW1pbHkgPT0gQUZfSU5FVDYpID8gMTI4IDogMzI7CisJCWlmIChzbGFzaCkgeworCQkJdW5zaWduZWQgcGxlbjsKKwkJCWluZXRfcHJlZml4IG5ldG1hc2tfcGZ4OworCisJCQluZXRtYXNrX3BmeC5mYW1pbHkgPSBBRl9VTlNQRUM7CisJCQlwbGVuID0gYmJfc3RydG91KHNsYXNoICsgMSwgTlVMTCwgMCk7CisJCQlpZiAoKGVycm5vIHx8IHBsZW4gPiBkc3QtPmJpdGxlbikKKwkJCSAmJiBnZXRfYWRkcl8xKCZuZXRtYXNrX3BmeCwgc2xhc2ggKyAxLCBmYW1pbHkpICE9IDAKKwkJCSkgeworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKG5ldG1hc2tfcGZ4LmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQkJLyogZmlsbCBpbiBwcmVmaXggbGVuZ3RoIG9mIGRvdHRlZCBxdWFkICovCisJCQkJdWludDMyX3QgbWFzayA9IG50b2hsKG5ldG1hc2tfcGZ4LmRhdGFbMF0pOworCQkJCXVpbnQzMl90IGhvc3QgPSB+bWFzazsKKworCQkJCS8qIGEgdmFsaWQgbmV0bWFzayBtdXN0IGJlIDJebiAtIDEgKi8KKwkJCQlpZiAoaG9zdCAmIChob3N0ICsgMSkpCisJCQkJCWdvdG8gYmFkOworCisJCQkJZm9yIChwbGVuID0gMDsgbWFzazsgbWFzayA8PD0gMSkKKwkJCQkJKytwbGVuOworCQkJCWlmIChwbGVuID4gZHN0LT5iaXRsZW4pCisJCQkJCWdvdG8gYmFkOworCQkJCS8qIGRzdC0+ZmxhZ3MgfD0gUFJFRklYTEVOX1NQRUNJRklFRDsgKi8KKwkJCX0KKwkJCWRzdC0+Yml0bGVuID0gcGxlbjsKKwkJfQorCX0KKworCWlmIChzbGFzaCkKKwkJKnNsYXNoID0gJy8nOworCXJldHVybjsKKyBiYWQ6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFuICVzICVzIGlzIGV4cGVjdGVkIHJhdGhlciB0aGFuIFwiJXNcIiIsICJpbmV0IiwgInByZWZpeCIsIGFyZyk7Cit9CisKK2ludCBnZXRfYWRkcihpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpCit7CisJaWYgKGZhbWlseSA9PSBBRl9QQUNLRVQpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlwiJXNcIiBtYXkgYmUgaW5ldCAlcywgYnV0IGl0IGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dCIsIGFyZywgImFkZHJlc3MiKTsKKwl9CisJaWYgKGdldF9hZGRyXzEoZHN0LCBhcmcsIGZhbWlseSkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFuICVzICVzIGlzIGV4cGVjdGVkIHJhdGhlciB0aGFuIFwiJXNcIiIsICJpbmV0IiwgImFkZHJlc3MiLCBhcmcpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBnZXRfcHJlZml4KGluZXRfcHJlZml4ICpkc3QsIGNoYXIgKmFyZywgaW50IGZhbWlseSkKK3sKKwlpZiAoZmFtaWx5ID09IEFGX1BBQ0tFVCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXCIlc1wiIG1heSBiZSBpbmV0ICVzLCBidXQgaXQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0IiwgYXJnLCAicHJlZml4Iik7CisJfQorCWdldF9wcmVmaXhfMShkc3QsIGFyZywgZmFtaWx5KTsKK30KKwordWludDMyX3QgZ2V0X2FkZHIzMihjaGFyICpuYW1lKQoreworCWluZXRfcHJlZml4IGFkZHI7CisKKwlpZiAoZ2V0X2FkZHJfMSgmYWRkciwgbmFtZSwgQUZfSU5FVCkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFuICVzICVzIGlzIGV4cGVjdGVkIHJhdGhlciB0aGFuIFwiJXNcIiIsICJJUCIsICJhZGRyZXNzIiwgbmFtZSk7CisJfQorCXJldHVybiBhZGRyLmRhdGFbMF07Cit9CisKK3ZvaWQgaW5jb21wbGV0ZV9jb21tYW5kKHZvaWQpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvbW1hbmQgbGluZSBpcyBub3QgY29tcGxldGUsIHRyeSBvcHRpb24gXCJoZWxwXCIiKTsKK30KKwordm9pZCBpbnZhcmcoY29uc3QgY2hhciAqYXJnLCBjb25zdCBjaGFyICpvcHQpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCBhcmcsIG9wdCk7Cit9CisKK3ZvaWQgZHVwYXJnKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqYXJnKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdXBsaWNhdGUgXCIlc1wiOiBcIiVzXCIgaXMgdGhlIHNlY29uZCB2YWx1ZSIsIGtleSwgYXJnKTsKK30KKwordm9pZCBkdXBhcmcyKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqYXJnKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlaXRoZXIgXCIlc1wiIGlzIGR1cGxpY2F0ZSwgb3IgXCIlc1wiIGlzIGdhcmJhZ2UiLCBrZXksIGFyZyk7Cit9CisKK2ludCBpbmV0X2FkZHJfbWF0Y2goY29uc3QgaW5ldF9wcmVmaXggKmEsIGNvbnN0IGluZXRfcHJlZml4ICpiLCBpbnQgYml0cykKK3sKKwljb25zdCB1aW50MzJfdCAqYTEgPSBhLT5kYXRhOworCWNvbnN0IHVpbnQzMl90ICphMiA9IGItPmRhdGE7CisJaW50IHdvcmRzID0gYml0cyA+PiA1OworCisJYml0cyAmPSAweDFmOworCisJaWYgKHdvcmRzKQorCQlpZiAobWVtY21wKGExLCBhMiwgd29yZHMgPDwgMikpCisJCQlyZXR1cm4gLTE7CisKKwlpZiAoYml0cykgeworCQl1aW50MzJfdCB3MSwgdzI7CisJCXVpbnQzMl90IG1hc2s7CisKKwkJdzEgPSBhMVt3b3Jkc107CisJCXcyID0gYTJbd29yZHNdOworCisJCW1hc2sgPSBodG9ubCgoMHhmZmZmZmZmZikgPDwgKDB4MjAgLSBiaXRzKSk7CisKKwkJaWYgKCh3MSBeIHcyKSAmIG1hc2spCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqcnRfYWRkcl9uMmEoaW50IGFmLAorCQl2b2lkICphZGRyLCBjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJc3dpdGNoIChhZikgeworCWNhc2UgQUZfSU5FVDoKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gaW5ldF9udG9wKGFmLCBhZGRyLCBidWYsIGJ1Zmxlbik7CisJZGVmYXVsdDoKKwkJcmV0dXJuICI/Pz8iOworCX0KK30KKworI2lmZGVmIFJFU09MVkVfSE9TVE5BTUVTCitjb25zdCBjaGFyICpmb3JtYXRfaG9zdChpbnQgYWYsIGludCBsZW4sIHZvaWQgKmFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlpZiAocmVzb2x2ZV9ob3N0cykgeworCQlzdHJ1Y3QgaG9zdGVudCAqaF9lbnQ7CisKKwkJaWYgKGxlbiA8PSAwKSB7CisJCQlzd2l0Y2ggKGFmKSB7CisJCQljYXNlIEFGX0lORVQ6CisJCQkJbGVuID0gNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJbGVuID0gMTY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OjsKKwkJCX0KKwkJfQorCQlpZiAobGVuID4gMCkgeworCQkJaF9lbnQgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGxlbiwgYWYpOworCQkJaWYgKGhfZW50ICE9IE5VTEwpIHsKKwkJCQlzYWZlX3N0cm5jcHkoYnVmLCBoX2VudC0+aF9uYW1lLCBidWZsZW4pOworCQkJCXJldHVybiBidWY7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJ0X2FkZHJfbjJhKGFmLCBhZGRyLCBidWYsIGJ1Zmxlbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS91dGlscy5oIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiNGE4NgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS91dGlscy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBVVElMU19ICisjZGVmaW5lIFVUSUxTX0ggMQorCisjaW5jbHVkZSAibGlibmV0bGluay5oIgorI2luY2x1ZGUgImxsX21hcC5oIgorI2luY2x1ZGUgInJ0bV9tYXAuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2V4dGVybiBmYW1pbHlfdCBwcmVmZXJyZWRfZmFtaWx5OworZXh0ZXJuIHNtYWxsaW50IHNob3dfc3RhdHM7ICAgIC8qIFVOVVNFRCAqLworZXh0ZXJuIHNtYWxsaW50IHNob3dfZGV0YWlsczsgIC8qIFVOVVNFRCAqLworZXh0ZXJuIHNtYWxsaW50IHNob3dfcmF3OyAgICAgIC8qIFVOVVNFRCAqLworZXh0ZXJuIHNtYWxsaW50IHJlc29sdmVfaG9zdHM7IC8qIFVOVVNFRCAqLworZXh0ZXJuIHNtYWxsaW50IG9uZWxpbmU7CitleHRlcm4gY2hhciBfU0xfOworCisjaWZuZGVmIElQUFJPVE9fRVNQCisjZGVmaW5lIElQUFJPVE9fRVNQICA1MAorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fQUgKKyNkZWZpbmUgSVBQUk9UT19BSCAgNTEKKyNlbmRpZgorCisjZGVmaW5lIFNQUklOVF9CU0laRSA2NAorI2RlZmluZSBTUFJJTlRfQlVGKHgpICBjaGFyIHhbU1BSSU5UX0JTSVpFXQorCitleHRlcm4gdm9pZCBpbmNvbXBsZXRlX2NvbW1hbmQodm9pZCkgTk9SRVRVUk47CisKKyNkZWZpbmUgTkVYVF9BUkcoKSBkbyB7IGlmICghKisrYXJndikgaW5jb21wbGV0ZV9jb21tYW5kKCk7IH0gd2hpbGUgKDApCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGZhbWlseTsKKwl1aW50OF90IGJ5dGVsZW47CisJaW50MTZfdCBiaXRsZW47CisJdWludDMyX3QgZGF0YVs0XTsKK30gaW5ldF9wcmVmaXg7CisKKyNkZWZpbmUgUFJFRklYTEVOX1NQRUNJRklFRCAxCisKKyNkZWZpbmUgRE5fTUFYQURETCAyMAorI2lmbmRlZiBBRl9ERUNuZXQKKyNkZWZpbmUgQUZfREVDbmV0IDEyCisjZW5kaWYKKworc3RydWN0IGRuX25hZGRyIHsKKwl1bnNpZ25lZCBzaG9ydCBhX2xlbjsKKwl1bnNpZ25lZCBjaGFyICBhX2FkZHJbRE5fTUFYQURETF07Cit9OworCisjZGVmaW5lIElQWF9OT0RFX0xFTiA2CisKK3N0cnVjdCBpcHhfYWRkciB7CisJdWludDMyX3QgaXB4X25ldDsKKwl1aW50OF90ICBpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworfTsKKworZXh0ZXJuIHVpbnQzMl90IGdldF9hZGRyMzIoY2hhciAqbmFtZSk7CitleHRlcm4gaW50IGdldF9hZGRyXzEoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsKKy8qZXh0ZXJuIHZvaWQgZ2V0X3ByZWZpeF8xKGluZXRfcHJlZml4ICpkc3QsIGNoYXIgKmFyZywgaW50IGZhbWlseSk7Ki8KK2V4dGVybiBpbnQgZ2V0X2FkZHIoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsKK2V4dGVybiB2b2lkIGdldF9wcmVmaXgoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsKKworZXh0ZXJuIHVuc2lnbmVkIGdldF91bnNpZ25lZChjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZyk7CitleHRlcm4gdWludDMyX3QgZ2V0X3UzMihjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZyk7CitleHRlcm4gdWludDE2X3QgZ2V0X3UxNihjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZyk7CisKK2V4dGVybiBjb25zdCBjaGFyICpydF9hZGRyX24yYShpbnQgYWYsIHZvaWQgKmFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisjaWZkZWYgUkVTT0xWRV9IT1NUTkFNRVMKK2V4dGVybiBjb25zdCBjaGFyICpmb3JtYXRfaG9zdChpbnQgYWYsIGludCBsZW4sIHZvaWQgKmFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisjZWxzZQorI2RlZmluZSBmb3JtYXRfaG9zdChhZiwgbGVuLCBhZGRyLCBidWYsIGJ1ZmxlbikgXAorCXJ0X2FkZHJfbjJhKGFmLCBhZGRyLCBidWYsIGJ1ZmxlbikKKyNlbmRpZgorCit2b2lkIGludmFyZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgTk9SRVRVUk47Cit2b2lkIGR1cGFyZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgTk9SRVRVUk47Cit2b2lkIGR1cGFyZzIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopIE5PUkVUVVJOOworaW50IGluZXRfYWRkcl9tYXRjaChjb25zdCBpbmV0X3ByZWZpeCAqYSwgY29uc3QgaW5ldF9wcmVmaXggKmIsIGludCBiaXRzKTsKKworY29uc3QgY2hhciAqZG5ldF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqYWRkciwgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2ludCBkbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmFkZHIpOworCitjb25zdCBjaGFyICppcHhfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKmFkZHIsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7CitpbnQgaXB4X3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmFkZHIpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbmFtZWlmLmMgYi9uZXR3b3JraW5nL25hbWVpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkN2U4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL25hbWVpZi5jCkBAIC0wLDAgKzEsMzI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBuYW1laWYuYyAtIE5hbWluZyBJbnRlcmZhY2VzIGJhc2VkIG9uIE1BQyBhZGRyZXNzIGZvciBidXN5Ym94LgorICoKKyAqIFdyaXR0ZW4gMjAwMCBieSBBbmRpIEtsZWVuLgorICogQnVzeWJveCBwb3J0IDIwMDIgYnkgTmljayBGZWRjaGlrIDxuaWNrQGZlZGNoaWsub3JnLnVhPgorICoJCQlHbGVubiBNY0dyYXRoCisgKiBFeHRlbmRlZCBtYXRjaGluZyBzdXBwb3J0IDIwMDggYnkgTmljbyBFcmZ1cnRoIDxtYXN0YUBwZXJsZ29sZi5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBOQU1FSUYKKy8vY29uZmlnOglib29sICJuYW1laWYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgbmFtZWlmIGlzIHVzZWQgdG8gcmVuYW1lIG5ldHdvcmsgaW50ZXJmYWNlIGJ5IGl0cyBNQUMgYWRkcmVzcy4KKy8vY29uZmlnOgkgIFJlbmFtZWQgaW50ZXJmYWNlcyBNVVNUIGJlIGluIHRoZSBkb3duIHN0YXRlLgorLy9jb25maWc6CSAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGEgZmlsZSAoZGVmYXVsdDogL2V0Yy9tYWN0YWIpCisvL2NvbmZpZzoJICB3aXRoIGxpc3Qgb2YgbmV3IGludGVyZmFjZSBuYW1lcyBhbmQgTUFDcy4KKy8vY29uZmlnOgkgIE1heGltdW0gaW50ZXJmYWNlIG5hbWUgbGVuZ3RoOiBJRk5BTVNJWiA9IDE2CisvL2NvbmZpZzoJICBGaWxlIGZpZWxkcyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlIG9yIHRhYi4KKy8vY29uZmlnOgkgIEZpbGUgZm9ybWF0OgorLy9jb25maWc6CSAgIyBDb21tZW50CisvL2NvbmZpZzoJICBuZXdfaW50ZXJmYWNlX25hbWUgICAgWFg6WFg6WFg6WFg6WFg6WFgKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisvL2NvbmZpZzoJYm9vbCAiRXh0ZW5kZWQgbmFtZWlmIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTkFNRUlGCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBleHRlbmRzIHRoZSBuYW1laWYgc3ludGF4IHRvIHN1cHBvcnQgdGhlIGJ1c19pbmZvLCBkcml2ZXIsCisvL2NvbmZpZzoJICBwaHlhZGRyIHNlbGVjdG9ycy4gVGhlIHN5bnRheCBpcyBjb21wYXRpYmxlIHRvIHRoZSBub3JtYWwgbmFtZWlmLgorLy9jb25maWc6CSAgRmlsZSBmb3JtYXQ6CisvL2NvbmZpZzoJICAgIG5ld19pbnRlcmZhY2VfbmFtZSAgZHJpdmVyPWFzaXggYnVzPXVzYi0wMDAwOjAwOjA4LjItMworLy9jb25maWc6CSAgICBuZXdfaW50ZXJmYWNlX25hbWUgIGJ1cz11c2ItMDAwMDowMDowOC4yLTMgMDA6ODA6Qzg6Mzg6OTE6QjUKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBwaHlfYWRkcmVzcz0yIDAwOjgwOkM4OjM4OjkxOkI1CisvL2NvbmZpZzoJICAgIG5ld19pbnRlcmZhY2VfbmFtZSAgbWFjPTAwOjgwOkM4OjM4OjkxOkI1CisvL2NvbmZpZzoJICAgIG5ld19pbnRlcmZhY2VfbmFtZSAgMDA6ODA6Qzg6Mzg6OTE6QjUKKworLy91c2FnZTojZGVmaW5lIG5hbWVpZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOgkJIlstc10gWy1jIEZJTEVdIFtJRk5BTUUgSFdBRERSXS4uLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEKAorLy91c2FnZToJCSJbLXNdIFstYyBGSUxFXSBbSUZOQU1FIFNFTEVDVE9SXS4uLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSBuYW1laWZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJSZW5hbWUgbmV0d29yayBpbnRlcmZhY2Ugd2hpbGUgaXQgaW4gdGhlIGRvd24gc3RhdGUuIgorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEKAorLy91c2FnZTogICAgICJcblRoZSBkZXZpY2Ugd2l0aCBhZGRyZXNzIEhXQUREUiBpcyByZW5hbWVkIHRvIElGQUNFLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEKAorLy91c2FnZTogICAgICJcblRoZSBkZXZpY2UgbWF0Y2hlZCBieSBTRUxFQ1RPUiBpcyByZW5hbWVkIHRvIElGQUNFLiIKKy8vdXNhZ2U6ICAgICAiXG5TRUxFQ1RPUiBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZjoiCisvL3VzYWdlOiAgICAgIlxuCWRyaXZlcj1TVFJJTkciCisvL3VzYWdlOiAgICAgIlxuCWJ1cz1TVFJJTkciCisvL3VzYWdlOiAgICAgIlxuCXBoeV9hZGRyZXNzPU5VTSIKKy8vdXNhZ2U6ICAgICAiXG4JW21hYz1dWFg6WFg6WFg6WFg6WFg6WFgiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgktYyBGSUxFCUNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdDogL2V0Yy9tYWN0YWIpIgorLy91c2FnZTogICAgICJcbgktcwlMb2cgdG8gc3lzbG9nIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBuYW1laWZfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbmFtZWlmIC1zIGRtejAgMDA6QTA6Qzk6OEM6RjY6M0ZcbiIKKy8vdXNhZ2U6ICAgICAgICIgb3JcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG5hbWVpZiAtYyAvZXRjL215X21hY3RhYl9maWxlXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvKiBUYWtlbiBmcm9tIGxpbnV4L3NvY2tpb3MuaCAqLworI2RlZmluZSBTSU9DU0lGTkFNRSAgMHg4OTIzICAvKiBzZXQgaW50ZXJmYWNlIG5hbWUgKi8KKworLyogT2N0ZXRzIGluIG9uZSBFdGhlcm5ldCBhZGRyLCBmcm9tIDxsaW51eC9pZl9ldGhlci5oPiAqLworI2RlZmluZSBFVEhfQUxFTiAgICAgNgorCisjaWZuZGVmIGlmcl9uZXduYW1lCisjZGVmaW5lIGlmcl9uZXduYW1lIGlmcl9pZnJ1LmlmcnVfc2xhdmUKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBldGh0YWJsZV9zIHsKKwlzdHJ1Y3QgZXRodGFibGVfcyAqbmV4dDsKKwlzdHJ1Y3QgZXRodGFibGVfcyAqcHJldjsKKwljaGFyICppZm5hbWU7CisJc3RydWN0IGV0aGVyX2FkZHIgKm1hYzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwljaGFyICpidXNfaW5mbzsKKwljaGFyICpkcml2ZXI7CisJaW50MzJfdCBwaHlfYWRkcmVzczsKKyNlbmRpZgorfSBldGh0YWJsZV90OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisvKiBDdXQnbidwYXN0ZSBmcm9tIGV0aHRvb2wuaCAqLworI2RlZmluZSBFVEhUT09MX0JVU0lORk9fTEVOIDMyCisvKiB0aGVzZSBzdHJpbmdzIGFyZSBzZXQgdG8gd2hhdGV2ZXIgdGhlIGRyaXZlciBhdXRob3IgZGVjaWRlcy4uLiAqLworc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyB7CisJdWludDMyX3QgY21kOworCWNoYXIgIGRyaXZlclszMl07IC8qIGRyaXZlciBzaG9ydCBuYW1lLCAidHVsaXAiLCAiZWVwcm8xMDAiICovCisJY2hhciAgdmVyc2lvblszMl07ICAvKiBkcml2ZXIgdmVyc2lvbiBzdHJpbmcgKi8KKwljaGFyICBmd192ZXJzaW9uWzMyXTsgLyogZmlybXdhcmUgdmVyc2lvbiBzdHJpbmcsIGlmIGFwcGxpY2FibGUgKi8KKwljaGFyICBidXNfaW5mb1tFVEhUT09MX0JVU0lORk9fTEVOXTsgIC8qIEJ1cyBpbmZvIGZvciB0aGlzIElGLiAqLworCS8qIEZvciBQQ0kgZGV2aWNlcywgdXNlIHBjaV9kZXYtPnNsb3RfbmFtZS4gKi8KKwljaGFyICByZXNlcnZlZDFbMzJdOworCWNoYXIgIHJlc2VydmVkMlsxNl07CisJdWludDMyX3Qgbl9zdGF0czsgIC8qIG51bWJlciBvZiB1NjQncyBmcm9tIEVUSFRPT0xfR1NUQVRTICovCisJdWludDMyX3QgdGVzdGluZm9fbGVuOworCXVpbnQzMl90IGVlZHVtcF9sZW47IC8qIFNpemUgb2YgZGF0YSBmcm9tIEVUSFRPT0xfR0VFUFJPTSAoYnl0ZXMpICovCisJdWludDMyX3QgcmVnZHVtcF9sZW47ICAvKiBTaXplIG9mIGRhdGEgZnJvbSBFVEhUT09MX0dSRUdTIChieXRlcykgKi8KK307CisKK3N0cnVjdCBldGh0b29sX2NtZCB7CisJdWludDMyX3QgICBjbWQ7CisJdWludDMyX3QgICBzdXBwb3J0ZWQ7ICAgICAgLyogRmVhdHVyZXMgdGhpcyBpbnRlcmZhY2Ugc3VwcG9ydHMgKi8KKwl1aW50MzJfdCAgIGFkdmVydGlzaW5nOyAgICAvKiBGZWF0dXJlcyB0aGlzIGludGVyZmFjZSBhZHZlcnRpc2VzICovCisJdWludDE2X3QgICBzcGVlZDsgICAgICAgICAgLyogVGhlIGZvcmNlZCBzcGVlZCwgMTBNYiwgMTAwTWIsIGdpZ2FiaXQgKi8KKwl1aW50OF90ICAgIGR1cGxleDsgICAgICAgICAvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbCAqLworCXVpbnQ4X3QgICAgcG9ydDsgICAgICAgICAgIC8qIFdoaWNoIGNvbm5lY3RvciBwb3J0ICovCisJdWludDhfdCAgICBwaHlfYWRkcmVzczsKKwl1aW50OF90ICAgIHRyYW5zY2VpdmVyOyAgICAvKiBXaGljaCB0cmFuc2NlaXZlciB0byB1c2UgKi8KKwl1aW50OF90ICAgIGF1dG9uZWc7ICAgICAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvbmVnb3RpYXRpb24gKi8KKwl1aW50MzJfdCAgIG1heHR4cGt0OyAgICAgICAvKiBUeCBwa3RzIGJlZm9yZSBnZW5lcmF0aW5nIHR4IGludCAqLworCXVpbnQzMl90ICAgbWF4cnhwa3Q7ICAgICAgIC8qIFJ4IHBrdHMgYmVmb3JlIGdlbmVyYXRpbmcgcnggaW50ICovCisJdWludDE2X3QgICBzcGVlZF9oaTsKKwl1aW50MTZfdCAgIHJlc2VydmVkMjsKKwl1aW50MzJfdCAgIHJlc2VydmVkWzNdOworfTsKKworI2RlZmluZSBFVEhUT09MX0dTRVQgICAgICAweDAwMDAwMDAxIC8qIEdldCBzZXR0aW5ncy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HRFJWSU5GTyAgMHgwMDAwMDAwMyAvKiBHZXQgZHJpdmVyIGluZm8uICovCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBuYW1laWZfcGFyc2Vfc2VsZWN0b3IoZXRodGFibGVfdCAqY2gsIGNoYXIgKnNlbGVjdG9yKQoreworCXN0cnVjdCBldGhlcl9hZGRyICpsbWFjOworI2lmIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCWludCBmb3VuZF9zZWxlY3RvciA9IDA7CisKKwl3aGlsZSAoKnNlbGVjdG9yKSB7CisJCWNoYXIgKm5leHQ7CisjZW5kaWYKKwkJc2VsZWN0b3IgPSBza2lwX3doaXRlc3BhY2Uoc2VsZWN0b3IpOworI2lmIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCQljaC0+cGh5X2FkZHJlc3MgPSAtMTsKKwkJaWYgKCpzZWxlY3RvciA9PSAnXDAnKQorCQkJYnJlYWs7CisJCS8qIFNlYXJjaCBmb3IgdGhlIGVuZCAuLi4uICovCisJCW5leHQgPSBza2lwX25vbl93aGl0ZXNwYWNlKHNlbGVjdG9yKTsKKwkJaWYgKCpuZXh0KQorCQkJKm5leHQrKyA9ICdcMCc7CisJCS8qIENoZWNrIGZvciBzZWxlY3RvcnMsIG1hYz0gaXMgYXNzdW1lZCAqLworCQlpZiAoc3RybmNtcChzZWxlY3RvciwgImJ1cz0iLCA0KSA9PSAwKSB7CisJCQljaC0+YnVzX2luZm8gPSB4c3RyZHVwKHNlbGVjdG9yICsgNCk7CisJCQlmb3VuZF9zZWxlY3RvcisrOworCQl9IGVsc2UgaWYgKHN0cm5jbXAoc2VsZWN0b3IsICJkcml2ZXI9IiwgNykgPT0gMCkgeworCQkJY2gtPmRyaXZlciA9IHhzdHJkdXAoc2VsZWN0b3IgKyA3KTsKKwkJCWZvdW5kX3NlbGVjdG9yKys7CisJCX0gZWxzZSBpZiAoc3RybmNtcChzZWxlY3RvciwgInBoeWFkZHI9IiwgOCkgPT0gMCkgeworCQkJY2gtPnBoeV9hZGRyZXNzID0geGF0b2lfcG9zaXRpdmUoc2VsZWN0b3IgKyA4KTsKKwkJCWZvdW5kX3NlbGVjdG9yKys7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJCWxtYWMgPSB4bWFsbG9jKEVUSF9BTEVOKTsKKwkJCWNoLT5tYWMgPSBldGhlcl9hdG9uX3Ioc2VsZWN0b3IgKyAoc3RybmNtcChzZWxlY3RvciwgIm1hYz0iLCA0KSAhPSAwID8gMCA6IDQpLCBsbWFjKTsKKwkJCWlmIChjaC0+bWFjID09IE5VTEwpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHBhcnNlICVzIiwgc2VsZWN0b3IpOworI2lmICBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwkJCWZvdW5kX3NlbGVjdG9yKys7CisJCX07CisJCXNlbGVjdG9yID0gbmV4dDsKKwl9CisJaWYgKGZvdW5kX3NlbGVjdG9yID09IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBzZWxlY3RvcnMgZm91bmQgZm9yICVzIiwgY2gtPmlmbmFtZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcHJlcGVuZF9uZXdfZXRoX3RhYmxlKGV0aHRhYmxlX3QgKipjbGlzdCwgY2hhciAqaWZuYW1lLCBjaGFyICpzZWxlY3RvcikKK3sKKwlldGh0YWJsZV90ICpjaDsKKwlpZiAoc3RybGVuKGlmbmFtZSkgPj0gSUZOQU1TSVopCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcmZhY2UgbmFtZSAnJXMnIHRvbyBsb25nIiwgaWZuYW1lKTsKKwljaCA9IHh6YWxsb2Moc2l6ZW9mKCpjaCkpOworCWNoLT5pZm5hbWUgPSB4c3RyZHVwKGlmbmFtZSk7CisJbmFtZWlmX3BhcnNlX3NlbGVjdG9yKGNoLCBzZWxlY3Rvcik7CisJY2gtPm5leHQgPSAqY2xpc3Q7CisJaWYgKCpjbGlzdCkKKwkJKCpjbGlzdCktPnByZXYgPSBjaDsKKwkqY2xpc3QgPSBjaDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBkZWxldGVfZXRoX3RhYmxlKGV0aHRhYmxlX3QgKmNoKQoreworCWZyZWUoY2gtPmlmbmFtZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJZnJlZShjaC0+YnVzX2luZm8pOworCWZyZWUoY2gtPmRyaXZlcik7CisjZW5kaWYKKwlmcmVlKGNoLT5tYWMpOworCWZyZWUoY2gpOworfTsKKyNlbHNlCit2b2lkIGRlbGV0ZV9ldGhfdGFibGUoZXRodGFibGVfdCAqY2gpOworI2VuZGlmCisKK2ludCBuYW1laWZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5hbWVpZl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZXRodGFibGVfdCAqY2xpc3QgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZuYW1lID0gIi9ldGMvbWFjdGFiIjsKKwlpbnQgY3RsX3NrOworCWV0aHRhYmxlX3QgKmNoOworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5bMl07CisKKwlpZiAoMSAmIGdldG9wdDMyKGFyZ3YsICJzYzoiLCAmZm5hbWUpKSB7CisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19MT0NBTDApOworCQkvKiBXaHkgbm90IGp1c3QgIj0iPyBJIGFzc3VtZSBsb2dnaW5nIHRvIHN0ZGVycgorCQkgKiBjYW4ndCBodXJ0LiAyPi9kZXYvbnVsbCBpZiB5b3UgZG9uJ3QgbGlrZSBpdDogKi8KKwkJbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoYXJndlswXSkgeworCQlkbyB7CisJCQlpZiAoIWFyZ3ZbMV0pCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJcHJlcGVuZF9uZXdfZXRoX3RhYmxlKCZjbGlzdCwgYXJndlswXSwgYXJndlsxXSk7CisJCQlhcmd2ICs9IDI7CisJCX0gd2hpbGUgKCphcmd2KTsKKwl9IGVsc2UgeworCQlwYXJzZXIgPSBjb25maWdfb3BlbihmbmFtZSk7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpCisJCQlwcmVwZW5kX25ld19ldGhfdGFibGUoJmNsaXN0LCB0b2tlblswXSwgdG9rZW5bMV0pOworCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9CisKKwljdGxfc2sgPSB4c29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCXBhcnNlciA9IGNvbmZpZ19vcGVuMigiL3Byb2MvbmV0L2RldiIsIHhmb3Blbl9mb3JfcmVhZCk7CisKKwl3aGlsZSAoY2xpc3QgJiYgY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIlwwOiBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKyNpZiAgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJ2aW5mbzsKKwkJc3RydWN0IGV0aHRvb2xfY21kIGV0aF9zZXR0aW5nczsKKyNlbmRpZgorCQlpZiAocGFyc2VyLT5saW5lbm8gPD0gMikKKwkJCWNvbnRpbnVlOyAvKiBTa2lwIHRoZSBmaXJzdCB0d28gbGluZXMgKi8KKworCQkvKiBGaW5kIHRoZSBjdXJyZW50IGludGVyZmFjZSBuYW1lIGFuZCBjb3B5IGl0IHRvIGlmci5pZnJfbmFtZSAqLworCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpOworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgdG9rZW5bMF0pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCS8qIENoZWNrIGZvciBwaHkgYWRkcmVzcyAqLworCQltZW1zZXQoJmV0aF9zZXR0aW5ncywgMCwgc2l6ZW9mKGV0aF9zZXR0aW5ncykpOworCQlldGhfc2V0dGluZ3MuY21kID0gRVRIVE9PTF9HU0VUOworCQlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkgJmV0aF9zZXR0aW5nczsKKwkJaW9jdGwoY3RsX3NrLCBTSU9DRVRIVE9PTCwgJmlmcik7CisKKwkJLyogQ2hlY2sgZm9yIGRyaXZlciBldGMuICovCisJCW1lbXNldCgmZHJ2aW5mbywgMCwgc2l6ZW9mKGRydmluZm8pKTsKKwkJZHJ2aW5mby5jbWQgPSBFVEhUT09MX0dEUlZJTkZPOworCQlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkgJmRydmluZm87CisJCS8qIEdldCBkcml2ZXIgYW5kIGJ1c2luZm8gZmlyc3QsIHNvIHdlIGhhdmUgaXQgaW4gZHJ2aW5mbyAqLworCQlpb2N0bChjdGxfc2ssIFNJT0NFVEhUT09MLCAmaWZyKTsKKyNlbmRpZgorCQlpb2N0bChjdGxfc2ssIFNJT0NHSUZIV0FERFIsICZpZnIpOworCisJCS8qIFNlYXJjaCB0aGUgbGlzdCBmb3IgYSBtYXRjaGluZyBkZXZpY2UgKi8KKwkJZm9yIChjaCA9IGNsaXN0OyBjaDsgY2ggPSBjaC0+bmV4dCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCQkJaWYgKGNoLT5idXNfaW5mbyAmJiBzdHJjbXAoY2gtPmJ1c19pbmZvLCBkcnZpbmZvLmJ1c19pbmZvKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoLT5kcml2ZXIgJiYgc3RyY21wKGNoLT5kcml2ZXIsIGRydmluZm8uZHJpdmVyKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoLT5waHlfYWRkcmVzcyAhPSAtMSAmJiBjaC0+cGh5X2FkZHJlc3MgIT0gZXRoX3NldHRpbmdzLnBoeV9hZGRyZXNzKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQlpZiAoY2gtPm1hYyAmJiBtZW1jbXAoY2gtPm1hYywgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pICE9IDApCisJCQkJY29udGludWU7CisJCQkvKiBpZiB3ZSBjYW1lIGhlcmUsIGFsbCBzZWxlY3RvcnMgaGF2ZSBtYXRjaGVkICovCisJCQlicmVhazsKKwkJfQorCQkvKiBOb3RoaW5nIGZvdW5kIGZvciBjdXJyZW50IGludGVyZmFjZSAqLworCQlpZiAoIWNoKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChpZnIuaWZyX25hbWUsIGNoLT5pZm5hbWUpICE9IDApIHsKKwkJCXN0cmNweShpZnIuaWZyX25ld25hbWUsIGNoLT5pZm5hbWUpOworCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoY3RsX3NrLCBTSU9DU0lGTkFNRSwgJmlmciwKKwkJCQkJImNhbid0IGNoYW5nZSBpZm5hbWUgJXMgdG8gJXMiLAorCQkJCQlpZnIuaWZyX25hbWUsIGNoLT5pZm5hbWUpOworCQl9CisJCS8qIFJlbW92ZSBsaXN0IGVudHJ5IG9mIHJlbmFtZWQgaW50ZXJmYWNlICovCisJCWlmIChjaC0+cHJldiAhPSBOVUxMKQorCQkJY2gtPnByZXYtPm5leHQgPSBjaC0+bmV4dDsKKwkJZWxzZQorCQkJY2xpc3QgPSBjaC0+bmV4dDsKKwkJaWYgKGNoLT5uZXh0ICE9IE5VTEwpCisJCQljaC0+bmV4dC0+cHJldiA9IGNoLT5wcmV2OworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlkZWxldGVfZXRoX3RhYmxlKGNoKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoY2ggPSBjbGlzdDsgY2g7IGNoID0gY2gtPm5leHQpCisJCQlkZWxldGVfZXRoX3RhYmxlKGNoKTsKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJfTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9uYmQtY2xpZW50LmMgYi9uZXR3b3JraW5nL25iZC1jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRkYTUyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9uYmQtY2xpZW50LmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworLy9hcHBsZXQ6SUZfTkJEQ0xJRU5UKEFQUExFVF9PREROQU1FKG5iZC1jbGllbnQsIG5iZGNsaWVudCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIG5iZGNsaWVudCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19OQkRDTElFTlQpICs9IG5iZC1jbGllbnQubworCisvL2NvbmZpZzpjb25maWcgTkJEQ0xJRU5UCisvL2NvbmZpZzoJYm9vbCAibmJkLWNsaWVudCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBOZXR3b3JrIGJsb2NrIGRldmljZSBjbGllbnQKKworI2RlZmluZSBOQkRfU0VUX1NPQ0sgICAgICAgICAgX0lPKDB4YWIsIDApCisjZGVmaW5lIE5CRF9TRVRfQkxLU0laRSAgICAgICBfSU8oMHhhYiwgMSkKKyNkZWZpbmUgTkJEX1NFVF9TSVpFICAgICAgICAgIF9JTygweGFiLCAyKQorI2RlZmluZSBOQkRfRE9fSVQgICAgICAgICAgICAgX0lPKDB4YWIsIDMpCisjZGVmaW5lIE5CRF9DTEVBUl9TT0NLICAgICAgICBfSU8oMHhhYiwgNCkKKyNkZWZpbmUgTkJEX0NMRUFSX1FVRVVFICAgICAgIF9JTygweGFiLCA1KQorI2RlZmluZSBOQkRfUFJJTlRfREVCVUcgICAgICAgX0lPKDB4YWIsIDYpCisjZGVmaW5lIE5CRF9TRVRfU0laRV9CTE9DS1MgICBfSU8oMHhhYiwgNykKKyNkZWZpbmUgTkJEX0RJU0NPTk5FQ1QgICAgICAgIF9JTygweGFiLCA4KQorI2RlZmluZSBOQkRfU0VUX1RJTUVPVVQgICAgICAgX0lPKDB4YWIsIDkpCisKKy8vdXNhZ2U6I2RlZmluZSBuYmRjbGllbnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkhPU1QgUE9SVCBCTE9DS0RFViIKKy8vdXNhZ2U6I2RlZmluZSBuYmRjbGllbnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb25uZWN0IHRvIEhPU1QgYW5kIHByb3ZpZGUgYSBuZXR3b3JrIGJsb2NrIGRldmljZSBvbiBCTE9DS0RFViIKKworLy9UT0RPOiBtb3JlIGNvbXBhdCB3aXRoIG5iZC1jbGllbnQgdmVyc2lvbiAyLjkuMTMgLQorLy9Vc2FnZTogbmJkLWNsaWVudCBbYnM9YmxvY2tzaXplXSBbdGltZW91dD1zZWNdIGhvc3QgcG9ydCBuYmRfZGV2aWNlIFstc3dhcF0gWy1wZXJzaXN0XSBbLW5vZm9ya10KKy8vT3IgICA6IG5iZC1jbGllbnQgLWQgbmJkX2RldmljZQorLy9PciAgIDogbmJkLWNsaWVudCAtYyBuYmRfZGV2aWNlCisvL0RlZmF1bHQgdmFsdWUgZm9yIGJsb2Nrc2l6ZSBpcyAxMDI0IChyZWNvbW1lbmRlZCBmb3IgZXRoZXJuZXQpCisvL0FsbG93ZWQgdmFsdWVzIGZvciBibG9ja3NpemUgYXJlIDUxMiwxMDI0LDIwNDgsNDA5NgorLy9Ob3RlLCB0aGF0IGtlcm5lbCAyLjQuMiBhbmQgb2xkZXIgb25lcyBkbyBub3Qgd29yayBjb3JyZWN0bHkgd2l0aAorLy9ibG9ja3NpemVzIG90aGVyIHRoYW4gMTAyNCB3aXRob3V0IHBhdGNoZXMKKworaW50IG5iZGNsaWVudF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmJkY2xpZW50X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDA7CisjaWYgQkJfTU1VCisJaW50IG5vZm9yayA9IDA7CisjZW5kaWYKKwljaGFyICpob3N0LCAqcG9ydCwgKmRldmljZTsKKwlzdHJ1Y3QgbmJkX2hlYWRlcl90IHsKKwkJdWludDY0X3QgbWFnaWMxOyAvLyAiTkJETUFHSUMiCisJCXVpbnQ2NF90IG1hZ2ljMjsgLy8gMHg0MjAyODE4NjEyNTMgYmlnIGVuZGlhbgorCQl1aW50NjRfdCBkZXZzaXplOworCQl1aW50MzJfdCBmbGFnczsKKwkJY2hhciBkYXRhWzEyNF07CisJfSBuYmRfaGVhZGVyOworCXN0cnVjdCBidWdfY2hlY2sgeworCQljaGFyIGNbb2Zmc2V0b2Yoc3RydWN0IG5iZF9oZWFkZXJfdCwgZGF0YSkgPT0gOCs4KzgrNCA/IDEgOiAtMV07CisJfTsKKworCS8vIFBhcnNlIGNvbW1hbmQgbGluZSBzdHVmZiAoanVzdCBhIHN0dWIgbm93KQorCWlmIChhcmdjICE9IDQpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworI2lmICFCQl9NTVUKKwliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NMT1NFX0VYVFJBX0ZEUywgYXJndik7CisjZW5kaWYKKworCWhvc3QgPSBhcmd2WzFdOworCXBvcnQgPSBhcmd2WzJdOworCWRldmljZSA9IGFyZ3ZbM107CisKKwkvLyBSZXBlYXQgdW50aWwgc3BhbmtlZCAoLXBlcnNpc3QgYmVoYXZpb3IpCisJZm9yICg7OykgeworCQlpbnQgc29jaywgbmJkOworCQlpbnQgcm87CisKKwkJLy8gTWFrZSBzdXJlIHRoZSAvZGV2L25iZCBleGlzdHMKKwkJbmJkID0geG9wZW4oZGV2aWNlLCBPX1JEV1IpOworCisJCS8vIEZpbmQgYW5kIGNvbm5lY3QgdG8gc2VydmVyCisJCXNvY2sgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShob3N0LCB4YXRvdTE2KHBvcnQpKTsKKwkJc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisKKwkJLy8gTG9nIG9uIHRvIHRoZSBzZXJ2ZXIKKwkJeHJlYWQoc29jaywgJm5iZF9oZWFkZXIsIDgrOCs4KzQgKyAxMjQpOworCQlpZiAobWVtY21wKCZuYmRfaGVhZGVyLm1hZ2ljMSwgIk5CRE1BR0lDIiJceDAwXHgwMFx4NDJceDAyXHg4MVx4ODZceDEyXHg1MyIsIDE2KSAhPSAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImxvZ2luIGZhaWxlZCIpOworCisJCS8vIFNldCA0ayBibG9jayBzaXplLiAgRXZlcnl0aGluZyB1c2VzIHRoYXQgdGhlc2UgZGF5cworCQlpb2N0bChuYmQsIE5CRF9TRVRfQkxLU0laRSwgNDA5Nik7CisJCWlvY3RsKG5iZCwgTkJEX1NFVF9TSVpFX0JMT0NLUywgU1dBUF9CRTY0KG5iZF9oZWFkZXIuZGV2c2l6ZSkgLyA0MDk2KTsKKwkJaW9jdGwobmJkLCBOQkRfQ0xFQVJfU09DSyk7CisKKwkJLy8gSWYgdGhlIHN1Y2tlciB3YXMgZXhwb3J0ZWQgcmVhZCBvbmx5LCByZXNwZWN0IHRoYXQgbG9jYWxseQorCQlybyA9IChuYmRfaGVhZGVyLmZsYWdzICYgU1dBUF9CRTMyKDIpKSAvIFNXQVBfQkUzMigyKTsKKwkJaWYgKGlvY3RsKG5iZCwgQkxLUk9TRVQsICZybykgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJCTEtST1NFVCIpOworCisJCWlmICh0aW1lb3V0KQorCQkJaWYgKGlvY3RsKG5iZCwgTkJEX1NFVF9USU1FT1VULCB0aW1lb3V0KSkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIk5CRF9TRVRfVElNRU9VVCIpOworCQlpZiAoaW9jdGwobmJkLCBOQkRfU0VUX1NPQ0ssIHNvY2spKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJOQkRfU0VUX1NPQ0siKTsKKworCQkvLyBpZiAoc3dhcCkgbWxvY2thbGwoTUNMX0NVUlJFTlR8TUNMX0ZVVFVSRSk7CisKKyNpZiBCQl9NTVUKKwkJLy8gT3BlbiB0aGUgZGV2aWNlIHRvIGZvcmNlIHJlcmVhZCBvZiB0aGUgcGFydGl0aW9uIHRhYmxlLgorCQkvLyBOZWVkIHRvIGRvIGl0IGluIGEgc2VwYXJhdGUgcHJvY2Vzcywgc2luY2Ugb3BlbihkZXZpY2UpCisJCS8vIG5lZWRzIHNvbWUgb3RoZXIgcHJvY2VzcyB0byBzaXQgaW4gaW9jdGwobmJkLCBOQkRfRE9fSVQpLgorCQlpZiAoZm9yaygpID09IDApIHsKKwkJCWNoYXIgKnMgPSBzdHJyY2hyKGRldmljZSwgJy8nKTsKKwkJCXNwcmludGYobmJkX2hlYWRlci5kYXRhLCAiL3N5cy9ibG9jay8lLjMycy9waWQiLCBzID8gcyArIDEgOiBkZXZpY2UpOworCQkJLy8gSXMgaXQgdXAgeWV0PworCQkJZm9yICg7OykgeworCQkJCWludCBmZCA9IG9wZW4obmJkX2hlYWRlci5kYXRhLCBPX1JET05MWSk7CisJCQkJaWYgKGZkID49IDApIHsKKwkJCQkJLy9jbG9zZShmZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzbGVlcCgxKTsKKwkJCX0KKwkJCW9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8vIERhZW1vbml6ZSBoZXJlCisJCWlmICghbm9mb3JrKSB7CisJCQlkYWVtb24oMCwgMCk7CisJCQlub2ZvcmsgPSAxOworCQl9CisjZW5kaWYKKworCQkvLyBUaGlzIHR1cm5zIHVzICh0aGUgcHJvY2VzcyB0aGF0IGNhbGxzIHRoaXMgaW9jdGwpCisJCS8vIGludG8gYSBkZWRpY2F0ZWQgTkJEIHJlcXVlc3QgaGFuZGxlci4KKwkJLy8gV2UgYmxvY2sgaGVyZSBmb3IgYSBsb25nIHRpbWUuCisJCS8vIFdoZW4gZXhhY3RseSBpb2N0bCByZXR1cm5zPyBPbiBhIHNpZ25hbCwKKwkJLy8gb3IgaWYgc29tZW9uZSBkb2VzIGlvY3RsKE5CRF9ESVNDT05ORUNUKSBbbmJkLWNsaWVudCAtZF0uCisJCWlmIChpb2N0bChuYmQsIE5CRF9ET19JVCkgPj0gMCB8fCBlcnJubyA9PSBFQkFEUikgeworCQkJLy8gRmx1c2ggcXVldWUgYW5kIGV4aXQKKwkJCWlvY3RsKG5iZCwgTkJEX0NMRUFSX1FVRVVFKTsKKwkJCWlvY3RsKG5iZCwgTkJEX0NMRUFSX1NPQ0spOworCQkJYnJlYWs7CisJCX0KKworCQljbG9zZShzb2NrKTsKKwkJY2xvc2UobmJkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbmMuYyBiL25ldHdvcmtpbmcvbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjMyZTNhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9uYy5jCkBAIC0wLDAgKzEsMjc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIG5jOiBtaW5pLW5ldGNhdCAtIGJ1aWx0IGZyb20gdGhlIGdyb3VuZCB1cCBmb3IgTFJQCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5ICBDaGFybGVzIFAuIFdyaWdodAorICogQ29weXJpZ2h0IChDKSAxOTk4ICBEYXZlIENpbmVnZQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vY29uZmlnOmNvbmZpZyBOQworLy9jb25maWc6CWJvb2wgIm5jIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEEgc2ltcGxlIFVuaXggdXRpbGl0eSB3aGljaCByZWFkcyBhbmQgd3JpdGVzIGRhdGEgYWNyb3NzIG5ldHdvcmsKKy8vY29uZmlnOgkgIGNvbm5lY3Rpb25zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgTkNfU0VSVkVSCisvL2NvbmZpZzoJYm9vbCAiTmV0Y2F0IHNlcnZlciBvcHRpb25zICgtbCkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBOQworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFsbG93IG5ldGNhdCB0byBhY3QgYXMgYSBzZXJ2ZXIuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBOQ19FWFRSQQorLy9jb25maWc6CWJvb2wgIk5ldGNhdCBleHRlbnNpb25zICgtZWl3IGFuZCBmaWxlbmFtZSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBOQworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFkZCAtZSAoc3VwcG9ydCBmb3IgZXhlY3V0aW5nIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIKKy8vY29uZmlnOgkgIG1ha2luZyBvciByZWNlaXZpbmcgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24pLCAtaSAoZGVsYXkgaW50ZXJ2YWwgZm9yCisvL2NvbmZpZzoJICBsaW5lcyBzZW50KSwgLXcgKHRpbWVvdXQgZm9yIGluaXRpYWwgY29ubmVjdGlvbikuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBOQ18xMTBfQ09NUEFUCisvL2NvbmZpZzoJYm9vbCAiTmV0Y2F0IDEuMTAgY29tcGF0aWJpbGl0eSAoKzIuNWspIgorLy9jb25maWc6CWRlZmF1bHQgbiAgIyBvZmYgc3BlY2lhbGx5IGZvciBSb2IKKy8vY29uZmlnOglkZXBlbmRzIG9uIE5DCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gbWFrZXMgbmMgY2xvc2VseSBmb2xsb3cgb3JpZ2luYWwgbmMtMS4xMC4KKy8vY29uZmlnOgkgIFRoZSBjb2RlIGlzIGFib3V0IDIuNWsgYmlnZ2VyLiBJdCBlbmFibGVzCisvL2NvbmZpZzoJICAtcyBBRERSLCAtbiwgLXUsIC12LCAtbyBGSUxFLCAteiBvcHRpb25zLCBidXQgbG9zZXMKKy8vY29uZmlnOgkgIGJ1c3lib3gtc3BlY2lmaWMgZXh0ZW5zaW9uczogLWYgRklMRSBhbmQgLWxsLgorCisjaWYgRU5BQkxFX05DXzExMF9DT01QQVQKKyMgaW5jbHVkZSAibmNfYmxvYXR5LmMiCisjZWxzZQorCisvL3VzYWdlOiNpZiAhRU5BQkxFX05DXzExMF9DT01QQVQKKy8vdXNhZ2U6CisvL3VzYWdlOiNpZiBFTkFCTEVfTkNfU0VSVkVSIHx8IEVOQUJMRV9OQ19FWFRSQQorLy91c2FnZTojZGVmaW5lIE5DX09QVElPTlNfU1RSICJcbiIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6I2RlZmluZSBOQ19PUFRJT05TX1NUUgorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbmNfdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfTkNfRVhUUkEoIlstaU5dIFstd05dICIpSUZfTkNfU0VSVkVSKCJbLWxdIFstcCBQT1JUXSAiKQorLy91c2FnZTogICAgICAgIlsiSUZfTkNfRVhUUkEoIi1mIEZJTEV8IikiSVBBRERSIFBPUlRdIklGX05DX0VYVFJBKCIgWy1lIFBST0ddIikKKy8vdXNhZ2U6I2RlZmluZSBuY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk9wZW4gYSBwaXBlIHRvIElQOlBPUlQiIElGX05DX0VYVFJBKCIgb3IgRklMRSIpCisvL3VzYWdlOglOQ19PUFRJT05TX1NUUgorLy91c2FnZToJSUZfTkNfRVhUUkEoCisvL3VzYWdlOiAgICAgIlxuCS1lIFBST0cJUnVuIFBST0cgYWZ0ZXIgY29ubmVjdCIKKy8vdXNhZ2U6CUlGX05DX1NFUlZFUigKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdGVuIG1vZGUsIGZvciBpbmJvdW5kIGNvbm5lY3RzIgorLy91c2FnZToJSUZfTkNfRVhUUkEoCisvL3VzYWdlOiAgICAgIlxuCQkodXNlIC1sIHR3aWNlIHdpdGggLWUgZm9yIHBlcnNpc3RlbnQgc2VydmVyKSIpCisvL3VzYWdlOiAgICAgIlxuCS1wIFBPUlQJTG9jYWwgcG9ydCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXcgU0VDCVRpbWVvdXQgZm9yIGNvbm5lY3QiCisvL3VzYWdlOiAgICAgIlxuCS1pIFNFQwlEZWxheSBpbnRlcnZhbCBmb3IgbGluZXMgc2VudCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlVc2UgZmlsZSAoYWxhIC9kZXYvdHR5UzApIGluc3RlYWQgb2YgbmV0d29yayIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbmNfbm90ZXNfdXNhZ2UgIiIKKy8vdXNhZ2U6CUlGX05DX0VYVFJBKAorLy91c2FnZTogICAgICAgIlRvIHVzZSBuZXRjYXQgYXMgYSB0ZXJtaW5hbCBlbXVsYXRvciBvbiBhIHNlcmlhbCBwb3J0OlxuXG4iCisvL3VzYWdlOiAgICAgICAiJCBzdHR5IDExNTIwMCAtRiAvZGV2L3R0eVMwXG4iCisvL3VzYWdlOiAgICAgICAiJCBzdHR5IHJhdyAtZWNobyAtY3RsZWNobyAmJiBuYyAtZiAvZGV2L3R0eVMwXG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5jX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG5jIGZvb2Jhci5zb21lZG9tYWluLmNvbSAyNVxuIgorLy91c2FnZTogICAgICAgIjIyMCBmb29iYXIgRVNNVFAgRXhpbSAzLjEyICMxIFNhdCwgMTUgQXByIDIwMDAgMDA6MDM6MDIgLTA2MDBcbiIKKy8vdXNhZ2U6ICAgICAgICJoZWxwXG4iCisvL3VzYWdlOiAgICAgICAiMjE0LUNvbW1hbmRzIHN1cHBvcnRlZDpcbiIKKy8vdXNhZ2U6ICAgICAgICIyMTQtICAgIEhFTE8gRUhMTyBNQUlMIFJDUFQgREFUQSBBVVRIXG4iCisvL3VzYWdlOiAgICAgICAiMjE0ICAgICBOT09QIFFVSVQgUlNFVCBIRUxQXG4iCisvL3VzYWdlOiAgICAgICAicXVpdFxuIgorLy91c2FnZTogICAgICAgIjIyMSBmb29iYXIgY2xvc2luZyBjb25uZWN0aW9uXG4iCisvL3VzYWdlOgorLy91c2FnZTojZW5kaWYKKworLyogTG90cyBvZiBzbWFsbCBkaWZmZXJlbmNlcyBpbiBmZWF0dXJlcworICogd2hlbiBjb21wYXJlZCB0byAic3RhbmRhcmQiIG5jCisgKi8KKworc3RhdGljIHZvaWQgdGltZW91dChpbnQgc2lnbnVtIFVOVVNFRF9QQVJBTSkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZWQgb3V0Iik7Cit9CisKK2ludCBuY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyogc2ZkIHNpdHMgX2hlcmVfIG9ubHkgYmVjYXVzZSBvZiAicmVwZWF0IiBvcHRpb24gKC1sIC1sKS4gKi8KKwlpbnQgc2ZkID0gc2ZkOyAvKiBmb3IgZ2NjICovCisJaW50IGNmZCA9IDA7CisJdW5zaWduZWQgbHBvcnQgPSAwOworCUlGX05PVF9OQ19TRVJWRVIoY29uc3QpIHVuc2lnbmVkIGRvX2xpc3RlbiA9IDA7CisJSUZfTk9UX05DX0VYVFJBIChjb25zdCkgdW5zaWduZWQgd3NlY3MgPSAwOworCUlGX05PVF9OQ19FWFRSQSAoY29uc3QpIHVuc2lnbmVkIGRlbGF5ID0gMDsKKwlJRl9OT1RfTkNfRVhUUkEgKGNvbnN0IGludCBleGVjcGFyYW0gPSAwOykKKwlJRl9OQ19FWFRSQSAgICAgKGNoYXIgKipleGVjcGFyYW0gPSBOVUxMOykKKwlmZF9zZXQgcmVhZGZkcywgdGVzdGZkczsKKwlpbnQgb3B0OyAvKiBtdXN0IGJlIHNpZ25lZCAoZ2V0b3B0IHJldHVybnMgLTEpICovCisKKwlpZiAoRU5BQkxFX05DX1NFUlZFUiB8fCBFTkFCTEVfTkNfRVhUUkEpIHsKKwkJLyogZ2V0b3B0MzIgaXMgX2FsbW9zdF8gdXNhYmxlOgorCQkqKiBpdCBjYW5ub3QgaGFuZGxlICIuLi4gLWUgUFJPRyAtcHJvZy1vcHQiICovCisJCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsCisJCSAgICAgICAgIiIgSUZfTkNfU0VSVkVSKCJscDoiKSBJRl9OQ19FWFRSQSgidzppOmY6ZToiKSApKSA+IDAKKwkJKSB7CisJCQlpZiAoRU5BQkxFX05DX1NFUlZFUiAmJiBvcHQgPT0gJ2wnKQorCQkJCUlGX05DX1NFUlZFUihkb19saXN0ZW4rKyk7CisJCQllbHNlIGlmIChFTkFCTEVfTkNfU0VSVkVSICYmIG9wdCA9PSAncCcpCisJCQkJSUZfTkNfU0VSVkVSKGxwb3J0ID0gYmJfbG9va3VwX3BvcnQob3B0YXJnLCAidGNwIiwgMCkpOworCQkJZWxzZSBpZiAoRU5BQkxFX05DX0VYVFJBICYmIG9wdCA9PSAndycpCisJCQkJSUZfTkNfRVhUUkEoIHdzZWNzID0geGF0b3Uob3B0YXJnKSk7CisJCQllbHNlIGlmIChFTkFCTEVfTkNfRVhUUkEgJiYgb3B0ID09ICdpJykKKwkJCQlJRl9OQ19FWFRSQSggZGVsYXkgPSB4YXRvdShvcHRhcmcpKTsKKwkJCWVsc2UgaWYgKEVOQUJMRV9OQ19FWFRSQSAmJiBvcHQgPT0gJ2YnKQorCQkJCUlGX05DX0VYVFJBKCBjZmQgPSB4b3BlbihvcHRhcmcsIE9fUkRXUikpOworCQkJZWxzZSBpZiAoRU5BQkxFX05DX0VYVFJBICYmIG9wdCA9PSAnZScgJiYgb3B0aW5kIDw9IGFyZ2MpIHsKKwkJCQkvKiBXZSBjYW5ub3QganVzdCAnYnJlYWsnLiBXZSBzaG91bGQgbGV0IGdldG9wdCBmaW5pc2guCisJCQkJKiogT3IgZWxzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIGZpbmQgd2hlcmUKKwkJCQkqKiAnaG9zdCcgYW5kICdwb3J0JyBwYXJhbXMgYXJlCisJCQkJKiogKHRoaW5rICJuYyAtdyA2MCBob3N0IHBvcnQgLWUgUFJPRyIpLiAqLworCQkJCUlGX05DX0VYVFJBKAorCQkJCQljaGFyICoqcDsKKwkJCQkJLy8gKzI6IG9uZSBmb3IgcHJvZ25hbWUgKG9wdGFyZykgYW5kIG9uZSBmb3IgTlVMTAorCQkJCQlleGVjcGFyYW0gPSB4emFsbG9jKHNpemVvZihjaGFyKikgKiAoYXJnYyAtIG9wdGluZCArIDIpKTsKKwkJCQkJcCA9IGV4ZWNwYXJhbTsKKwkJCQkJKnArKyA9IG9wdGFyZzsKKwkJCQkJd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKKwkJCQkJCSpwKysgPSBhcmd2W29wdGluZCsrXTsKKwkJCQkJfQorCQkJCSkKKwkJCQkvKiBvcHRpbmQgcG9pbnRzIHRvIGFyZ3ZbYXJ2Y10gKE5VTEwpIG5vdy4KKwkJCQkqKiBGSVhNRTogd2UgYXNzdW1lIHRoYXQgZ2V0b3B0IHdpbGwgbm90IGNvdW50IG9wdGlvbnMKKwkJCQkqKiBwb3NzaWJseSBwcmVzZW50IG9uICItZSBQUk9HIEFSR1MiIGFuZCB3aWxsIG5vdAorCQkJCSoqIGluY2x1ZGUgdGhlbSBpbnRvIGZpbmFsIHZhbHVlIG9mIG9wdGluZAorCQkJCSoqIHdoaWNoIGlzIHRvIGJlIHVzZWQgLi4uICAqLworCQkJfSBlbHNlIGJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCQlhcmd2ICs9IG9wdGluZDsgLyogLi4uIGhlcmUhICovCisJCWFyZ2MgLT0gb3B0aW5kOworCQkvLyAtbCBhbmQgLWYgZG9uJ3QgbWl4CisJCWlmIChkb19saXN0ZW4gJiYgY2ZkKSBiYl9zaG93X3VzYWdlKCk7CisJCS8vIEZpbGUgbW9kZSBuZWVkcyBuZWVkIHplcm8gYXJndW1lbnRzLCBsaXN0ZW4gbW9kZSBuZWVkcyB6ZXJvIG9yIG9uZSwKKwkJLy8gY2xpZW50IG1vZGUgbmVlZHMgb25lIG9yIHR3bworCQlpZiAoY2ZkKSB7CisJCQlpZiAoYXJnYykgYmJfc2hvd191c2FnZSgpOworCQl9IGVsc2UgaWYgKGRvX2xpc3RlbikgeworCQkJaWYgKGFyZ2MgPiAxKSBiYl9zaG93X3VzYWdlKCk7CisJCX0gZWxzZSB7CisJCQlpZiAoIWFyZ2MgfHwgYXJnYyA+IDIpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhcmdjICE9IDMpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJfQorCisJaWYgKHdzZWNzKSB7CisJCXNpZ25hbChTSUdBTFJNLCB0aW1lb3V0KTsKKwkJYWxhcm0od3NlY3MpOworCX0KKworCWlmICghY2ZkKSB7CisJCWlmIChkb19saXN0ZW4pIHsKKwkJCXNmZCA9IGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKGFyZ3ZbMF0sIGxwb3J0KTsKKwkJCXhsaXN0ZW4oc2ZkLCBkb19saXN0ZW4pOyAvKiBjYW4gYmUgPiAxICovCisjaWYgMCAgLyogbmMtMS4xMCBkb2VzIG5vdCBkbyB0aGlzICh3aXRob3V0IC12KSAqLworCQkJLyogSWYgd2UgZGlkbid0IHNwZWNpZnkgYSBwb3J0IG51bWJlciwKKwkJCSAqIHF1ZXJ5IGFuZCBwcmludCBpdCBhZnRlciBsaXN0ZW4oKSAqLworCQkJaWYgKCFscG9ydCkgeworCQkJCWxlbl9hbmRfc29ja2FkZHIgbHNhOworCQkJCWxzYS5sZW4gPSBMU0FfU0laRU9GX1NBOworCQkJCWdldHNvY2tuYW1lKHNmZCwgJmxzYS51LnNhLCAmbHNhLmxlbik7CisJCQkJbHBvcnQgPSBnZXRfbnBvcnQoJmxzYS51LnNhKTsKKwkJCQlmZHByaW50ZigyLCAiJWRcbiIsIG50b2hzKGxwb3J0KSk7CisJCQl9CisjZW5kaWYKKwkJCWNsb3NlX29uX2V4ZWNfb24oc2ZkKTsKKyBhY2NlcHRfYWdhaW46CisJCQljZmQgPSBhY2NlcHQoc2ZkLCBOVUxMLCAwKTsKKwkJCWlmIChjZmQgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYWNjZXB0Iik7CisJCQlpZiAoIWV4ZWNwYXJhbSkKKwkJCQljbG9zZShzZmQpOworCQl9IGVsc2UgeworCQkJY2ZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoYXJndlswXSwKKwkJCQlhcmd2WzFdID8gYmJfbG9va3VwX3BvcnQoYXJndlsxXSwgInRjcCIsIDApIDogMCk7CisJCX0KKwl9CisKKwlpZiAod3NlY3MpIHsKKwkJYWxhcm0oMCk7CisJCS8qIE5vbi1pZ25vcmVkIHNpZ25hbHMgcmV2ZXJ0IHRvIFNJR19ERkwgb24gZXhlYyBhbnl3YXkgKi8KKwkJLypzaWduYWwoU0lHQUxSTSwgU0lHX0RGTCk7Ki8KKwl9CisKKwkvKiAtZSBnaXZlbj8gKi8KKwlpZiAoZXhlY3BhcmFtKSB7CisJCXBpZF90IHBpZDsKKwkJLyogV2l0aCBtb3JlIHRoYW4gb25lIC1sLCByZXBlYXRlZGx5IGFjdCBhcyBzZXJ2ZXIgKi8KKwkJaWYgKGRvX2xpc3RlbiA+IDEgJiYgKHBpZCA9IHh2Zm9yaygpKSAhPSAwKSB7CisJCQkvKiBwYXJlbnQgKi8KKwkJCS8qIHByZXZlbnQgem9tYmllcyAqLworCQkJc2lnbmFsKFNJR0NITEQsIFNJR19JR04pOworCQkJY2xvc2UoY2ZkKTsKKwkJCWdvdG8gYWNjZXB0X2FnYWluOworCQl9CisJCS8qIGNoaWxkLCBvciBtYWluIHRocmVhZCBpZiBvbmx5IG9uZSAtbCAqLworCQl4bW92ZV9mZChjZmQsIDApOworCQl4ZHVwMigwLCAxKTsKKwkJeGR1cDIoMCwgMik7CisJCUlGX05DX0VYVFJBKEJCX0VYRUNWUChleGVjcGFyYW1bMF0sIGV4ZWNwYXJhbSk7KQorCQkvKiBEb24ndCBwcmludCBzdHVmZiBvciBpdCB3aWxsIGdvIG92ZXIgdGhlIHdpcmUuLi4gKi8KKwkJX2V4aXQoMTI3KTsKKwl9CisKKwkvKiBTZWxlY3QgbG9vcCBjb3B5aW5nIHN0ZGluIHRvIGNmZCwgYW5kIGNmZCB0byBzdGRvdXQgKi8KKworCUZEX1pFUk8oJnJlYWRmZHMpOworCUZEX1NFVChjZmQsICZyZWFkZmRzKTsKKwlGRF9TRVQoU1RESU5fRklMRU5PLCAmcmVhZGZkcyk7CisKKwlmb3IgKDs7KSB7CisJCWludCBmZDsKKwkJaW50IG9mZDsKKwkJaW50IG5yZWFkOworCisJCXRlc3RmZHMgPSByZWFkZmRzOworCisJCWlmIChzZWxlY3QoY2ZkICsgMSwgJnRlc3RmZHMsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VsZWN0Iik7CisKKyNkZWZpbmUgaW9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJZmQgPSBTVERJTl9GSUxFTk87CisJCXdoaWxlICgxKSB7CisJCQlpZiAoRkRfSVNTRVQoZmQsICZ0ZXN0ZmRzKSkgeworCQkJCW5yZWFkID0gc2FmZV9yZWFkKGZkLCBpb2J1Ziwgc2l6ZW9mKGlvYnVmKSk7CisJCQkJaWYgKGZkID09IGNmZCkgeworCQkJCQlpZiAobnJlYWQgPCAxKQorCQkJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJCQlvZmQgPSBTVERPVVRfRklMRU5POworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChucmVhZCA8IDEpIHsKKwkJCQkJCS8qIENsb3NlIG91dGdvaW5nIGhhbGYtY29ubmVjdGlvbiBzbyB0aGV5IGdldCBFT0YsCisJCQkJCQkgKiBidXQgbGVhdmUgaW5jb21pbmcgYWxvbmUgc28gd2UgY2FuIHNlZSByZXNwb25zZSAqLworCQkJCQkJc2h1dGRvd24oY2ZkLCAxKTsKKwkJCQkJCUZEX0NMUihTVERJTl9GSUxFTk8sICZyZWFkZmRzKTsKKwkJCQkJfQorCQkJCQlvZmQgPSBjZmQ7CisJCQkJfQorCQkJCXh3cml0ZShvZmQsIGlvYnVmLCBucmVhZCk7CisJCQkJaWYgKGRlbGF5ID4gMCkKKwkJCQkJc2xlZXAoZGVsYXkpOworCQkJfQorCQkJaWYgKGZkID09IGNmZCkKKwkJCQlicmVhazsKKwkJCWZkID0gY2ZkOworCQl9CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL25jX2Jsb2F0eS5jIGIvbmV0d29ya2luZy9uY19ibG9hdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFhZDEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9uY19ibG9hdHkuYwpAQCAtMCwwICsxLDg4NyBAQAorLyogQmFzZWQgb24gbmV0Y2F0IDEuMTAgUkVMRUFTRSA5NjAzMjAgd3JpdHRlbiBieSBob2JiaXRAYXZpYW4ub3JnLgorICogUmVsZWFzZWQgaW50byBwdWJsaWMgZG9tYWluIGJ5IHRoZSBhdXRob3IuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQXV0aG9yJ3MgY29tbWVudHMgZnJvbSBuYyAxLjEwOgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiBOZXRjYXQgaXMgZW50aXJlbHkgbXkgb3duIGNyZWF0aW9uLCBhbHRob3VnaCBwbGVudHkgb2Ygb3RoZXIgY29kZSB3YXMgdXNlZCBhcworICogZXhhbXBsZXMuICBJdCBpcyBmcmVlbHkgZ2l2ZW4gYXdheSB0byB0aGUgSW50ZXJuZXQgY29tbXVuaXR5IGluIHRoZSBob3BlIHRoYXQKKyAqIGl0IHdpbGwgYmUgdXNlZnVsLCB3aXRoIG5vIHJlc3RyaWN0aW9ucyBleGNlcHQgZ2l2aW5nIGNyZWRpdCB3aGVyZSBpdCBpcyBkdWUuCisgKiBObyBHUExzLCBCZXJrZWxleSBjb3B5cmlnaHRzIG9yIGFueSBvZiB0aGF0IG5vbnNlbnNlLiAgVGhlIGF1dGhvciBhc3N1bWVzIE5PCisgKiByZXNwb25zaWJpbGl0eSBmb3IgaG93IGFueW9uZSB1c2VzIGl0LiAgSWYgbmV0Y2F0IG1ha2VzIHlvdSByaWNoIHNvbWVob3cgYW5kCisgKiB5b3UncmUgZmVlbGluZyBnZW5lcm91cywgbWFpbCBtZSBhIGNoZWNrLiAgSWYgeW91IGFyZSBhZmZpbGlhdGVkIGluIGFueSB3YXkKKyAqIHdpdGggTWljcm9zb2Z0IE5ldHdvcmssIGdldCBhIGxpZmUuICBBbHdheXMgc2tpIGluIGNvbnRyb2wuICBDb21tZW50cywKKyAqIHF1ZXN0aW9ucywgYW5kIHBhdGNoZXMgdG8gaG9iYml0QGF2aWFuLm9yZy4KKyAqIC4uLgorICogTmV0Y2F0IGFuZCB0aGUgYXNzb2NpYXRlZCBwYWNrYWdlIGlzIGEgcHJvZHVjdCBvZiBBdmlhbiBSZXNlYXJjaCwgYW5kIGlzIGZyZWVseQorICogYXZhaWxhYmxlIGluIGZ1bGwgc291cmNlIGZvcm0gd2l0aCBubyByZXN0cmljdGlvbnMgc2F2ZSBhbiBvYmxpZ2F0aW9uIHRvIGdpdmUKKyAqIGNyZWRpdCB3aGVyZSBkdWUuCisgKiAuLi4KKyAqIEEgZGFtbiB1c2VmdWwgbGl0dGxlICJiYWNrZW5kIiB1dGlsaXR5IGJlZ3VuIDk1MDkxNSBvciB0aGVyZWFib3V0cywKKyAqIGFzICpIb2JiaXQqJ3MgZmlyc3QgcmVhbCBzdGFiIGF0IHNvbWUgc29ja2V0cyBwcm9ncmFtbWluZy4gIFNvbWV0aGluZyB0aGF0CisgKiBzaG91bGQgaGF2ZSBhbmQgaW5kZWVkIG1heSBoYXZlIGV4aXN0ZWQgdGVuIHllYXJzIGFnbywgYnV0IG5ldmVyIGJlY2FtZSBhCisgKiBzdGFuZGFyZCBVbml4IHV0aWxpdHkuICBJTUhPLCAibmMiIGNvdWxkIHRha2UgaXRzIHBsYWNlIHJpZ2h0IG5leHQgdG8gY2F0LAorICogY3AsIHJtLCBtdiwgZGQsIGxzLCBhbmQgYWxsIHRob3NlIG90aGVyIGNyeXB0aWMgYW5kIFVuaXgtbGlrZSB0aGluZ3MuCisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBNdWNoIG9mIGF1dGhvcidzIGNvbW1lbnRzIGFyZSBzdGlsbCByZXRhaW5lZCBpbiB0aGUgY29kZS4KKyAqCisgKiBGdW5jdGlvbmFsaXR5IHJlbW92ZWQgKHJhdGlvbmFsZSk6CisgKiAtIG1pbHRpcGxlLXBvcnQgcmFuZ2VzLCByYW5kb21pemVkIHBvcnQgc2Nhbm5pbmcgKHVzZSBubWFwKQorICogLSB0ZWxuZXQgc3VwcG9ydCAodXNlIHRlbG5ldCkKKyAqIC0gc291cmNlIHJvdXRpbmcKKyAqIC0gbXVsdGlwbGUgRE5TIGNoZWNrcworICogRnVuY3Rpb25hbHR5IHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIG5jIDEuMTA6CisgKiAtIFBST0cgaW4gJy1lIFBST0cnIGNhbiBoYXZlIEFSR1MgKGFuZCBvcHRpb25zKS4KKyAqICAgQmVjYXVzZSBvZiB0aGlzIC1lIG9wdGlvbiBtdXN0IGJlIGxhc3QuCisvL1RPRE86IHJlbW92ZSAtZSBpbmNvbXBhdGliaWxpdHk/CisgKiAtIHdlIGRvbid0IHJlZGlyZWN0IHN0ZGVyciB0byB0aGUgbmV0d29yayBzb2NrZXQgZm9yIHRoZSAtZSBQUk9HLgorICogICAoUFJPRyBjYW4gZG8gaXQgaXRzZWxmIGlmIG5lZWRlZCwgYnV0IHNvbWV0aW1lcyBpdCBpcyBOT1Qgd2FudGVkISkKKyAqIC0gbnVtZXJpYyBhZGRyZXNzZXMgYXJlIHByaW50ZWQgaW4gKCksIG5vdCBbXSAoSVB2NiBsb29rcyBiZXR0ZXIpLAorICogICBwb3J0IG51bWJlcnMgYXJlIGluc2lkZSAoKTogKDEuMi4zLjQ6NTY3OCkKKyAqIC0gbmV0d29yayByZWFkIGVycm9ycyBhcmUgcmVwb3J0ZWQgb24gdmVyYm9zZSBsZXZlbHMgPiAxCisgKiAgIChuYyAxLjEwIHRyZWF0cyB0aGVtIGFzIEVPRikKKyAqIC0gVENQIGNvbm5lY3RzIGZyb20gd3JvbmcgaXAvcG9ydHMgKGlmIHBlZXIgaXA6cG9ydCBpcyBzcGVjaWZpZWQKKyAqICAgb24gdGhlIGNvbW1hbmQgbGluZSwgYnV0IGFjY2VwdCgpIHNheXMgdGhhdCBpdCBjYW1lIGZyb20gZGlmZmVyZW50IGFkZHIpCisgKiAgIGFyZSBjbG9zZWQsIGJ1dCB3ZSBkb24ndCBleGl0IC0gd2UgY29udGludWUgdG8gbGlzdGVuL2FjY2VwdC4KKyAqLworCisvKiBkb25lIGluIG5jLmM6ICNpbmNsdWRlICJsaWJiYi5oIiAqLworCisvL3VzYWdlOiNpZiBFTkFCTEVfTkNfMTEwX0NPTVBBVAorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBuY190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QgUE9SVCAgLSBjb25uZWN0IgorLy91c2FnZToJSUZfTkNfU0VSVkVSKCJcbiIKKy8vdXNhZ2U6ICAgICAgICJuYyBbT1BUSU9OU10gLWwgLXAgUE9SVCBbSE9TVF0gW1BPUlRdICAtIGxpc3RlbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSBuY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktZSBQUk9HCVJ1biBQUk9HIGFmdGVyIGNvbm5lY3QgKG11c3QgYmUgbGFzdCkiCisvL3VzYWdlOglJRl9OQ19TRVJWRVIoCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3RlbiBtb2RlLCBmb3IgaW5ib3VuZCBjb25uZWN0cyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUE9SVAlMb2NhbCBwb3J0IgorLy91c2FnZTogICAgICJcbgktcyBBRERSCUxvY2FsIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS13IFNFQwlUaW1lb3V0IGZvciBjb25uZWN0cyBhbmQgZmluYWwgbmV0IHJlYWRzIgorLy91c2FnZToJSUZfTkNfRVhUUkEoCisvL3VzYWdlOiAgICAgIlxuCS1pIFNFQwlEZWxheSBpbnRlcnZhbCBmb3IgbGluZXMgc2VudCIgLyogIiwgcG9ydHMgc2Nhbm5lZCIgKi8KKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgZG8gRE5TIHJlc29sdXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS11CVVEUCBtb2RlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZToJSUZfTkNfRVhUUkEoCisvL3VzYWdlOiAgICAgIlxuCS1vIEZJTEUJSGV4IGR1bXAgdHJhZmZpYyIKKy8vdXNhZ2U6ICAgICAiXG4JLXoJWmVyby1JL08gbW9kZSAoc2Nhbm5pbmcpIgorLy91c2FnZToJKQorLy91c2FnZTojZW5kaWYKKworLyogICAiXG4JLXIJCVJhbmRvbWl6ZSBsb2NhbCBhbmQgcmVtb3RlIHBvcnRzIiAqLworLyogICAiXG4JLWcgZ2F0ZXdheQlTb3VyY2Utcm91dGluZyBob3AgcG9pbnRbc10sIHVwIHRvIDgiICovCisvKiAgICJcbgktRyBudW0JCVNvdXJjZS1yb3V0aW5nIHBvaW50ZXI6IDQsIDgsIDEyLCAuLi4iICovCisvKiAgICJcbnBvcnQgbnVtYmVycyBjYW4gYmUgaW5kaXZpZHVhbCBvciByYW5nZXM6IGxvLWhpIFtpbmNsdXNpdmVdIiAqLworCisvKiAtZSBQUk9HIGNhbiB0YWtlIEFSR1MgdG9vOiAibmMgLi4uIC1lIGxzIC1sIiwgYnV0IHdlIGRvbid0IGRvY3VtZW50IGl0CisgKiBpbiBoZWxwIHRleHQ6IG5jIDEuMTAgZG9lcyBub3QgYWxsb3cgdGhhdC4gV2UgZG9uJ3Qgd2FudCB0byBlbnRpY2UKKyAqIHVzZXJzIHRvIHVzZSB0aGlzIGluY29tcGF0aWJpbGl0eSAqLworCitlbnVtIHsKKwlTTEVBWkVfUE9SVCA9IDMxMzM3LCAgICAgICAgICAgICAgIC8qIGZvciBVRFAtc2NhbiBSVFQgdHJpY2ssIGNoYW5nZSBpZiB5YSB3YW50ICovCisJQklHU0laID0gODE5MiwgICAgICAgICAgICAgICAgICAgICAvKiBiaWcgYnVmZmVycyAqLworCisJbmV0ZmQgPSAzLAorCW9mZCA9IDQsCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogZ2xvYmFsIGNtZCBmbGFnczogKi8KKwl1bnNpZ25lZCBvX3ZlcmJvc2U7CisJdW5zaWduZWQgb193YWl0OworI2lmIEVOQUJMRV9OQ19FWFRSQQorCXVuc2lnbmVkIG9faW50ZXJ2YWw7CisjZW5kaWYKKworCS8qaW50IG5ldGZkOyovCisJLyppbnQgb2ZkOyovICAgICAgICAgICAgICAgICAgICAgLyogaGV4ZHVtcCBvdXRwdXQgZmQgKi8KKyNpZiBFTkFCTEVfTEZTCisjZGVmaW5lIFNFTlRfTl9SRUNWX00gInNlbnQgJWxsdSwgcmN2ZCAlbGx1XG4iCisJdW5zaWduZWQgbG9uZyBsb25nIHdyb3RlX291dDsgICAgICAgICAgLyogdG90YWwgc3Rkb3V0IGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyBsb25nIHdyb3RlX25ldDsgICAgICAgICAgLyogdG90YWwgbmV0IGJ5dGVzICovCisjZWxzZQorI2RlZmluZSBTRU5UX05fUkVDVl9NICJzZW50ICV1LCByY3ZkICV1XG4iCisJdW5zaWduZWQgd3JvdGVfb3V0OyAgICAgICAgICAvKiB0b3RhbCBzdGRvdXQgYnl0ZXMgKi8KKwl1bnNpZ25lZCB3cm90ZV9uZXQ7ICAgICAgICAgIC8qIHRvdGFsIG5ldCBieXRlcyAqLworI2VuZGlmCisJLyogb3VyYWRkciBpcyBuZXZlciBOVUxMIGFuZCBnb2VzIHRocm91Z2ggdGhyZWUgc3RhdGVzIGFzIHdlIHByb2dyZXNzOgorCSAxIC0gbG9jYWwgYWRkcmVzcyBiZWZvcmUgYmluZCAoSVAvcG9ydCBwb3NzaWJseSB6ZXJvKQorCSAyIC0gbG9jYWwgYWRkcmVzcyBhZnRlciBiaW5kIChwb3J0IGlzIG5vbnplcm8pCisJIDMgLSBsb2NhbCBhZGRyZXNzIGFmdGVyIGNvbm5lY3Q/Py9yZWN2L2FjY2VwdCAoSVAgYW5kIHBvcnQgYXJlIG5vbnplcm8pICovCisJc3RydWN0IGxlbl9hbmRfc29ja2FkZHIgKm91cmFkZHI7CisJLyogdGhlbWFkZHIgaXMgTlVMTCBpZiBubyBwZWVyIGhvc3RuYW1lWzpwb3J0XSBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lICovCisJc3RydWN0IGxlbl9hbmRfc29ja2FkZHIgKnRoZW1hZGRyOworCS8qIHJlbWVuZCBpcyBzZXQgYWZ0ZXIgY29ubmVjdC9yZWN2L2FjY2VwdCB0byB0aGUgYWN0dWFsIGlwOnBvcnQgb2YgcGVlciAqLworCXN0cnVjdCBsZW5fYW5kX3NvY2thZGRyIHJlbWVuZDsKKworCWptcF9idWYgamJ1ZjsgICAgICAgICAgICAgICAgLyogdGltZXIgY3J1ZCAqLworCisJLyogd2lsbCBtYWxsb2MgdXAgdGhlIGZvbGxvd2luZyBnbG9iYWxzOiAqLworCWZkX3NldCBkaW5nMTsgICAgICAgICAgICAgICAgLyogZm9yIHNlbGVjdCBsb29wICovCisJZmRfc2V0IGRpbmcyOworCWNoYXIgYmlnYnVmX2luW0JJR1NJWl07ICAgICAgLyogZGF0YSBidWZmZXJzICovCisJY2hhciBiaWdidWZfbmV0W0JJR1NJWl07Cit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgd3JvdGVfb3V0ICAoRy53cm90ZV9vdXQgKQorI2RlZmluZSB3cm90ZV9uZXQgIChHLndyb3RlX25ldCApCisjZGVmaW5lIG91cmFkZHIgICAgKEcub3VyYWRkciAgICkKKyNkZWZpbmUgdGhlbWFkZHIgICAoRy50aGVtYWRkciAgKQorI2RlZmluZSByZW1lbmQgICAgIChHLnJlbWVuZCAgICApCisjZGVmaW5lIGpidWYgICAgICAgKEcuamJ1ZiAgICAgICkKKyNkZWZpbmUgZGluZzEgICAgICAoRy5kaW5nMSAgICAgKQorI2RlZmluZSBkaW5nMiAgICAgIChHLmRpbmcyICAgICApCisjZGVmaW5lIGJpZ2J1Zl9pbiAgKEcuYmlnYnVmX2luICkKKyNkZWZpbmUgYmlnYnVmX25ldCAoRy5iaWdidWZfbmV0KQorI2RlZmluZSBvX3ZlcmJvc2UgIChHLm9fdmVyYm9zZSApCisjZGVmaW5lIG9fd2FpdCAgICAgKEcub193YWl0ICAgICkKKyNpZiBFTkFCTEVfTkNfRVhUUkEKKyNkZWZpbmUgb19pbnRlcnZhbCAoRy5vX2ludGVydmFsKQorI2Vsc2UKKyNkZWZpbmUgb19pbnRlcnZhbCAwCisjZW5kaWYKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworLyogTXVzdCBtYXRjaCBnZXRvcHQzMiBjYWxsISAqLworZW51bSB7CisJT1BUX2ggPSAoMSA8PCAwKSwKKwlPUFRfbiA9ICgxIDw8IDEpLAorCU9QVF9wID0gKDEgPDwgMiksCisJT1BUX3MgPSAoMSA8PCAzKSwKKwlPUFRfdSA9ICgxIDw8IDQpLAorCU9QVF92ID0gKDEgPDwgNSksCisJT1BUX3cgPSAoMSA8PCA2KSwKKwlPUFRfbCA9ICgxIDw8IDcpICogRU5BQkxFX05DX1NFUlZFUiwKKwlPUFRfaSA9ICgxIDw8ICg3K0VOQUJMRV9OQ19TRVJWRVIpKSAqIEVOQUJMRV9OQ19FWFRSQSwKKwlPUFRfbyA9ICgxIDw8ICg4K0VOQUJMRV9OQ19TRVJWRVIpKSAqIEVOQUJMRV9OQ19FWFRSQSwKKwlPUFRfeiA9ICgxIDw8ICg5K0VOQUJMRV9OQ19TRVJWRVIpKSAqIEVOQUJMRV9OQ19FWFRSQSwKK307CisKKyNkZWZpbmUgb19uZmxhZyAgIChvcHRpb25fbWFzazMyICYgT1BUX24pCisjZGVmaW5lIG9fdWRwbW9kZSAob3B0aW9uX21hc2szMiAmIE9QVF91KQorI2lmIEVOQUJMRV9OQ19TRVJWRVIKKyNkZWZpbmUgb19saXN0ZW4gIChvcHRpb25fbWFzazMyICYgT1BUX2wpCisjZWxzZQorI2RlZmluZSBvX2xpc3RlbiAgMAorI2VuZGlmCisjaWYgRU5BQkxFX05DX0VYVFJBCisjZGVmaW5lIG9fb2ZpbGUgICAob3B0aW9uX21hc2szMiAmIE9QVF9vKQorI2RlZmluZSBvX3plcm8gICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeikKKyNlbHNlCisjZGVmaW5lIG9fb2ZpbGUgICAwCisjZGVmaW5lIG9femVybyAgICAwCisjZW5kaWYKKworLyogRGVidWc6IHNxdWlydCB3aGF0ZXZlciBtZXNzYWdlIGFuZCBzbGVlcCBhIGJpdCBzbyB3ZSBjYW4gc2VlIGl0IGdvIGJ5LiAqLworLyogQmV3YXJlOiB3cml0ZXMgdG8gc3RkT1VULi4uICovCisjaWYgMAorI2RlZmluZSBEZWJ1ZyguLi4pIGRvIHsgcHJpbnRmKF9fVkFfQVJHU19fKTsgcHJpbnRmKCJcbiIpOyBmZmx1c2hfYWxsKCk7IHNsZWVwKDEpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRGVidWcoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBob2xsZXJfZXJyb3IoLi4uKSAgZG8geyBpZiAob192ZXJib3NlKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2RlZmluZSBob2xsZXJfcGVycm9yKC4uLikgZG8geyBpZiAob192ZXJib3NlKSBiYl9wZXJyb3JfbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKworLyogY2F0Y2g6IG5vLWJyYWluZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGNhdGNoKGludCBzaWcpCit7CisJaWYgKG9fdmVyYm9zZSA+IDEpICAgICAgICAgICAgICAgIC8qIG5vcm1hbGx5IHdlIGRvbid0IGNhcmUgKi8KKwkJZnByaW50ZihzdGRlcnIsIFNFTlRfTl9SRUNWX00sIHdyb3RlX25ldCwgd3JvdGVfb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwgInB1bnQhXG4iKTsKKwlraWxsX215c2VsZl93aXRoX3NpZyhzaWcpOworfQorCisvKiB1bmFybSAgKi8KK3N0YXRpYyB2b2lkIHVuYXJtKHZvaWQpCit7CisJc2lnbmFsKFNJR0FMUk0sIFNJR19JR04pOworCWFsYXJtKDApOworfQorCisvKiB0aW1lb3V0IGFuZCBvdGhlciBzaWduYWwgaGFuZGxpbmcgY3J1ZnQgKi8KK3N0YXRpYyB2b2lkIHRtdHJhdmVsKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXVuYXJtKCk7CisJbG9uZ2ptcChqYnVmLCAxKTsKK30KKworLyogYXJtOiBzZXQgdGhlIHRpbWVyLiAgKi8KK3N0YXRpYyB2b2lkIGFybSh1bnNpZ25lZCBzZWNzKQoreworCXNpZ25hbChTSUdBTFJNLCB0bXRyYXZlbCk7CisJYWxhcm0oc2Vjcyk7Cit9CisKKy8qIGZpbmRsaW5lOgorIGZpbmQgdGhlIG5leHQgbmV3bGluZSBpbiBhIGJ1ZmZlcjsgcmV0dXJuIGluY2x1c2l2ZSBzaXplIG9mIHRoYXQgImxpbmUiLAorIG9yIHRoZSBlbnRpcmUgYnVmZmVyIHNpemUsIHNvIHRoZSBjYWxsZXIga25vd3MgaG93IG11Y2ggdG8gdGhlbiB3cml0ZSgpLgorIE5vdCBkaXN0aW5ndWlzaGluZyBcbiB2cyBcclxuIGZvciB0aGUgbm9uY2U7IGl0IGp1c3Qgd29ya3MgYXMgaXMuLi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBmaW5kbGluZShjaGFyICpidWYsIHVuc2lnbmVkIHNpeikKK3sKKwljaGFyICogcDsKKwlpbnQgeDsKKwlpZiAoIWJ1ZikgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIHNhbml0eSBjaGVja3MuLi4gKi8KKwkJcmV0dXJuIDA7CisJaWYgKHNpeiA+IEJJR1NJWikKKwkJcmV0dXJuIDA7CisJeCA9IHNpejsKKwlmb3IgKHAgPSBidWY7IHggPiAwOyB4LS0pIHsKKwkJaWYgKCpwID09ICdcbicpIHsKKwkJCXggPSAoaW50KSAocCAtIGJ1Zik7CisJCQl4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogJ3Nva2F5IGlmIGl0IHBvaW50cyBqdXN0IHBhc3QgdGhlIGVuZCEgKi8KK0RlYnVnKCJmaW5kbGluZSByZXR1cm5pbmcgJWQiLCB4KTsKKwkJCXJldHVybiB4OworCQl9CisJCXArKzsKKwl9IC8qIGZvciAqLworRGVidWcoImZpbmRsaW5lIHJldHVybmluZyB3aG9sZSB0aGluZzogJWQiLCBzaXopOworCXJldHVybiBzaXo7Cit9IC8qIGZpbmRsaW5lICovCisKKy8qIGRvZXhlYzoKKyBmaWRkbGUgYWxsIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGFyb3VuZCwgYW5kIGhhbmQgb2ZmIHRvIGFub3RoZXIgcHJvZy4gIFNvcnQKKyBvZiBsaWtlIGEgb25lLW9mZiAicG9vciBtYW4ncyBpbmV0ZCIuICBUaGlzIGlzIHRoZSBvbmx5IHNlY3Rpb24gb2YgY29kZQorIHRoYXQgd291bGQgYmUgc2VjdXJpdHktY3JpdGljYWwsIHdoaWNoIGlzIHdoeSBpdCdzIGlmZGVmZWQgb3V0IGJ5IGRlZmF1bHQuCisgVXNlIGF0IHlvdXIgb3duIGhhaXJ5IHJpc2s7IGlmIHlvdSBsZWF2ZSBzaGVsbHMgbHlpbmcgYXJvdW5kIGJlaGluZCBvcGVuCisgbGlzdGVuaW5nIHBvcnRzIHlvdSBkZXNlcnZlIHRvIGxvc2UhISAqLworc3RhdGljIGludCBkb2V4ZWMoY2hhciAqKnByb2dnaWUpIE5PUkVUVVJOOworc3RhdGljIGludCBkb2V4ZWMoY2hhciAqKnByb2dnaWUpCit7CisJeG1vdmVfZmQobmV0ZmQsIDApOworCWR1cDIoMCwgMSk7CisJLyogZHVwMigwLCAyKTsgLSBkbyB3ZSAqcmVhbGx5KiB3YW50IHRoaXM/IE5PIQorCSAqIGV4ZWMnZWQgcHJvZyBjYW4gZG8gaXQgeW91cnNlbGYsIGlmIG5lZWRlZCAqLworCUJCX0VYRUNWUF9vcl9kaWUocHJvZ2dpZSk7Cit9CisKKy8qIGNvbm5lY3Rfd190aW1lb3V0OgorIHJldHVybiBhbiBmZCBmb3Igb25lIG9mCisgYW4gb3BlbiBvdXRib3VuZCBUQ1AgY29ubmVjdGlvbiwgYSBVRFAgc3R1Yi1zb2NrZXQgdGhpbmdpZSwgb3IKKyBhbiB1bmNvbm5lY3RlZCBUQ1Agb3IgVURQIHNvY2tldCB0byBsaXN0ZW4gb24uCisgRXhhbWluZXMgdmFyaW91cyBnbG9iYWwgb19ibGFoIGZsYWdzIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkby4KKyBsYWQgY2FuIGJlIE5VTEwsIHRoZW4gc29ja2V0IGlzIG5vdCBib3VuZCB0byBhbnkgbG9jYWwgaXBbOnBvcnRdICovCitzdGF0aWMgaW50IGNvbm5lY3Rfd190aW1lb3V0KGludCBmZCkKK3sKKwlpbnQgcnI7CisKKwkvKiB3cmFwIGNvbm5lY3QgaW5zaWRlIGEgdGltZXIsIGFuZCBoaXQgaXQgKi8KKwlhcm0ob193YWl0KTsKKwlpZiAoc2V0am1wKGpidWYpID09IDApIHsKKwkJcnIgPSBjb25uZWN0KGZkLCAmdGhlbWFkZHItPnUuc2EsIHRoZW1hZGRyLT5sZW4pOworCQl1bmFybSgpOworCX0gZWxzZSB7IC8qIHNldGptcDogY29ubmVjdCBmYWlsZWQuLi4gKi8KKwkJcnIgPSAtMTsKKwkJZXJybm8gPSBFVElNRURPVVQ7IC8qIGZha2UgaXQgKi8KKwl9CisJcmV0dXJuIHJyOworfQorCisvKiBkb2xpc3RlbjoKKyBsaXN0ZW5zIGZvcgorIGluY29taW5nIGFuZCByZXR1cm5zIGFuIG9wZW4gY29ubmVjdGlvbiAqZnJvbSogc29tZXBsYWNlLiAgSWYgd2Ugd2VyZQorIGdpdmVuIGhvc3QvcG9ydCBhcmdzLCBhbnkgY29ubmVjdGlvbnMgZnJvbSBlbHNld2hlcmUgYXJlIHJlamVjdGVkLiAgVGhpcworIGluIGNvbmp1bmN0aW9uIHdpdGggbG9jYWwtYWRkcmVzcyBiaW5kaW5nIHNob3VsZCBsaW1pdCB0aGluZ3MgbmljZWx5Li4uICovCitzdGF0aWMgdm9pZCBkb2xpc3Rlbih2b2lkKQoreworCWludCBycjsKKworCWlmICghb191ZHBtb2RlKQorCQl4bGlzdGVuKG5ldGZkLCAxKTsgLyogVENQOiBnb3R0YSBsaXN0ZW4oKSBiZWZvcmUgd2UgY2FuIGdldCAqLworCisJLyogVmFyaW91cyB0aGluZ3MgdGhhdCBmb2xsb3cgdGVtcG9yYXJpbHkgdHJhc2ggYmlnYnVmX25ldCwgd2hpY2ggbWlnaHQgY29udGFpbgorCSBhIGNvcHkgb2YgYW55IHJlY3Zmcm9tKCllZCBwYWNrZXQsIGJ1dCB3ZSdsbCByZWFkKCkgYW5vdGhlciBjb3B5IGxhdGVyLiAqLworCisJLyogSSBjYW4ndCBiZWxpZXZlIEkgaGF2ZSB0byBkbyBhbGwgdGhpcyB0byBnZXQgbXkgb3duIGdvZGRhbW4gYm91bmQgYWRkcmVzcworCSBhbmQgcG9ydCBudW1iZXIuICBJdCBzaG91bGQganVzdCBnZXQgZmlsbGVkIGluIGR1cmluZyBiaW5kKCkgb3Igc29tZXRoaW5nLgorCSBBbGwgdGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB3ZSBkaWRuJ3Qgc2F5IC1wIGZvciBsaXN0ZW5pbmcsIHNpbmNlIGlmIHdlCisJIHNhaWQgLXAgd2UgKmtub3cqIHdoYXQgcG9ydCB3ZSdyZSBsaXN0ZW5pbmcgb24uICBBdCBhbnkgcmF0ZSB3ZSB3b24ndCBib3RoZXIKKwkgd2l0aCBpdCBhbGwgdW5sZXNzIHdlIHdhbnRlZCB0byBzZWUgaXQsIGFsdGhvdWdoIGxpc3RlbmluZyBxdWlldGx5IG9uIGEKKwkgcmFuZG9tIHVua25vd24gcG9ydCBpcyBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwgd2l0aG91dCAibmV0c3RhdCIuICovCisJaWYgKG9fdmVyYm9zZSkgeworCQljaGFyICphZGRyOworCQlnZXRzb2NrbmFtZShuZXRmZCwgJm91cmFkZHItPnUuc2EsICZvdXJhZGRyLT5sZW4pOworCQkvL2lmIChyciA8IDApCisJCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUgYWZ0ZXIgYmluZCIpOworCQlhZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJm91cmFkZHItPnUuc2EpOworCQlmcHJpbnRmKHN0ZGVyciwgImxpc3RlbmluZyBvbiAlcyAuLi5cbiIsIGFkZHIpOworCQlmcmVlKGFkZHIpOworCX0KKworCWlmIChvX3VkcG1vZGUpIHsKKwkJLyogVURQIGlzIGEgc3BlZWVlZWNpYWwgY2FzZSAtLSB3ZSBoYXZlIHRvIGRvIEkvTyAqYW5kKiBnZXQgdGhlIGNhbGxpbmcKKwkJIHBhcnR5J3MgcGFydGljdWxhcnMgYWxsIGF0IG9uY2UsIGxpc3RlbigpIGFuZCBhY2NlcHQoKSBkb24ndCBhcHBseS4KKwkJIEF0IGxlYXN0IGluIHRoZSBCU0QgdW5pdmVyc2UsIGhvd2V2ZXIsIHJlY3Zmcm9tL1BFRUsgaXMgZW5vdWdoIHRvIHRlbGwKKwkJIHVzIHNvbWV0aGluZyBjYW1lIGluLCBhbmQgd2UgY2FuIHNldCB0aGluZ3MgdXAgc28gc3RyYWlnaHQgcmVhZC93cml0ZQorCQkgYWN0dWFsbHkgZG9lcyB3b3JrIGFmdGVyIGFsbC4gIFlvdy4gIFlNTVYgb24gc3RyYW5nZSBwbGF0Zm9ybXMhICAqLworCisJCS8qIEknbSBub3QgY29tcGxldGVseSBjbGVhciBvbiBob3cgdGhpcyB3b3JrcyAtLSBCU0Qgc2VlbXMgdG8gbWFrZSBVRFAKKwkJIGp1c3QgbWFnaWNhbGx5IHdvcmsgaW4gYSBjb25uZWN0KCllZCBjb250ZXh0LCBidXQgd2UnbGwgdW5kb3VidGVkbHkgcnVuCisJCSBpbnRvIHN5c3RlbXMgdGhpcyBkZWFsIGRvZXNuJ3Qgd29yayBvbi4gIEZvciBub3csIHdlIGFwcGFyZW50bHkgaGF2ZSB0bworCQkgaXNzdWUgYSBjb25uZWN0KCkgb24gb3VyIGp1c3QtdGlja2xlZCBzb2NrZXQgc28gd2UgY2FuIHdyaXRlKCkgYmFjay4KKwkJIEFnYWluLCB3aHkgdGhlIGZ1Y2sgZG9lc24ndCBpdCBqdXN0IGdldCBmaWxsZWQgaW4gYW5kIHRha2VuIGNhcmUgb2Y/IQorCQkgVGhpcyBoYWNrIGlzIGFueXRoaW5nIGJ1dCBvcHRpbWFsLiAgQmFzaWNhbGx5LCBpZiB5b3Ugd2FudCB5b3VyIGxpc3RlbmVyCisJCSB0byBhbHNvIGJlIGFibGUgdG8gc2VuZCBkYXRhIGJhY2ssIHlvdSBuZWVkIHRoaXMgY29ubmVjdCgpIGxpbmUsIHdoaWNoCisJCSBhbHNvIGhhcyB0aGUgc2lkZSBlZmZlY3QgdGhhdCBub3cgYW55dGhpbmcgZnJvbSBhIGRpZmZlcmVudCBzb3VyY2Ugb3IgZXZlbiBhCisJCSBkaWZmZXJlbnQgcG9ydCBvbiB0aGUgb3RoZXIgZW5kIHdvbid0IHNob3cgdXAgYW5kIHdpbGwgY2F1c2UgSUNNUCBlcnJvcnMuCisJCSBJIGd1ZXNzIHRoYXQncyB3aGF0IHRoZXkgbWVhbnQgYnkgImNvbm5lY3QiLgorCQkgTGV0J3MgdHJ5IHRvIHJlbWVtYmVyIHdoYXQgdGhlICJVIiBpcyAqcmVhbGx5KiBmb3IsIGVoPyAqLworCisJCS8qIElmIHBlZXIgYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGNvbm5lY3QgdG8gaXQgKi8KKwkJcmVtZW5kLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCWlmICh0aGVtYWRkcikgeworCQkJcmVtZW5kID0gKnRoZW1hZGRyOworCQkJeGNvbm5lY3QobmV0ZmQsICZ0aGVtYWRkci0+dS5zYSwgdGhlbWFkZHItPmxlbik7CisJCX0KKwkJLyogcGVlayBmaXJzdCBwYWNrZXQgYW5kIHJlbWVtYmVyIHBlZXIgYWRkciAqLworCQlhcm0ob193YWl0KTsgICAgICAgICAgICAgICAgLyogbWlnaHQgYXMgd2VsbCB0aW1lb3V0IHRoaXMsIHRvbyAqLworCQlpZiAoc2V0am1wKGpidWYpID09IDApIHsgICAgICAgLyogZG8gdGltZW91dCBmb3IgaW5pdGlhbCBjb25uZWN0ICovCisJCQkvKiAoKm91cmFkZHIpIGlzIHByZWZpbGxlZCB3aXRoICJkZWZhdWx0IiBhZGRyZXNzICovCisJCQkvKiBhbmQgaGVyZSB3ZSBibG9jay4uLiAqLworCQkJcnIgPSByZWN2X2Zyb21fdG8obmV0ZmQsIE5VTEwsIDAsIE1TR19QRUVLLCAvKndhcyBiaWdidWZfbmV0LCBCSUdTSVoqLworCQkJCSZyZW1lbmQudS5zYSwgJm91cmFkZHItPnUuc2EsIG91cmFkZHItPmxlbik7CisJCQlpZiAocnIgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicmVjdmZyb20iKTsKKwkJCXVuYXJtKCk7CisJCX0gZWxzZQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWVvdXQiKTsKKy8qIE5vdyB3ZSBsZWFybmVkICp0byB3aGljaCBJUCogcGVlciBoYXMgY29ubmVjdGVkLCBhbmQgd2Ugd2FudCB0byBhbmNob3IKK291ciBzb2NrZXQgb24gaXQsIHNvIHRoYXQgb3VyIG91dGJvdW5kIHBhY2tldHMgd2lsbCBoYXZlIGNvcnJlY3QgbG9jYWwgSVAuCitVbmZvcnR1bmF0ZWx5LCBiaW5kKCkgb24gYWxyZWFkeSBib3VuZCBzb2NrZXQgd2lsbCBmYWlsIG5vdyAoRUlOVkFMKToKKwl4YmluZChuZXRmZCwgJm91cmFkZHItPnUuc2EsIG91cmFkZHItPmxlbik7CitOZWVkIHRvIHJlYWQgdGhlIHBhY2tldCwgc2F2ZSBkYXRhLCBjbG9zZSB0aGlzIHNvY2tldCBhbmQKK2NyZWF0ZSBuZXcgb25lLCBhbmQgYmluZCgpIGl0LiBUT0RPICovCisJCWlmICghdGhlbWFkZHIpCisJCQl4Y29ubmVjdChuZXRmZCwgJnJlbWVuZC51LnNhLCBvdXJhZGRyLT5sZW4pOworCX0gZWxzZSB7CisJCS8qIFRDUCAqLworCQlhcm0ob193YWl0KTsgLyogd3JhcCB0aGlzIGluIGEgdGltZXIsIHRvbzsgMCA9IGZvcmV2ZXIgKi8KKwkJaWYgKHNldGptcChqYnVmKSA9PSAwKSB7CisgYWdhaW46CisJCQlyZW1lbmQubGVuID0gTFNBX1NJWkVPRl9TQTsKKwkJCXJyID0gYWNjZXB0KG5ldGZkLCAmcmVtZW5kLnUuc2EsICZyZW1lbmQubGVuKTsKKwkJCWlmIChyciA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhY2NlcHQiKTsKKwkJCWlmICh0aGVtYWRkcikgeworCQkJCWludCBzdl9wb3J0LCBwb3J0LCByOworCisJCQkJc3ZfcG9ydCA9IGdldF9ucG9ydCgmcmVtZW5kLnUuc2EpOyAvKiBzYXZlICovCisJCQkJcG9ydCA9IGdldF9ucG9ydCgmdGhlbWFkZHItPnUuc2EpOworCQkJCWlmIChwb3J0ID09IDApIHsKKwkJCQkJLyogIm5jIC1ubCAtcCBMUE9SVCBSSE9TVCIgKHcvbyBSUE9SVCEpOgorCQkJCQkgKiB3ZSBzaG91bGQgYWNjZXB0IGFueSByZW1vdGUgcG9ydCAqLworCQkJCQlzZXRfbnBvcnQoJnJlbWVuZC51LnNhLCAwKTsgLyogYmxvdCBvdXQgcmVtb3RlIHBvcnQjICovCisJCQkJfQorCQkJCXIgPSBtZW1jbXAoJnJlbWVuZC51LnNhLCAmdGhlbWFkZHItPnUuc2EsIHJlbWVuZC5sZW4pOworCQkJCXNldF9ucG9ydCgmcmVtZW5kLnUuc2EsIHN2X3BvcnQpOyAvKiByZXN0b3JlICovCisJCQkJaWYgKHIgIT0gMCkgeworCQkJCQkvKiBuYyAxLjEwIGJhaWxzIG91dCBpbnN0ZWFkLCBhbmQgaXRzIGVycm9yIG1lc3NhZ2UKKwkJCQkJICogaXMgbm90IHN1cHByZXNzZWQgYnkgb192ZXJib3NlICovCisJCQkJCWlmIChvX3ZlcmJvc2UpIHsKKwkJCQkJCWNoYXIgKnJlbWFkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmcmVtZW5kLnUuc2EpOworCQkJCQkJYmJfZXJyb3JfbXNnKCJjb25uZWN0IGZyb20gd3JvbmcgaXAvcG9ydCAlcyBpZ25vcmVkIiwgcmVtYWRkcik7CisJCQkJCQlmcmVlKHJlbWFkZHIpOworCQkJCQl9CisJCQkJCWNsb3NlKHJyKTsKKwkJCQkJZ290byBhZ2FpbjsKKwkJCQl9CisJCQl9CisJCQl1bmFybSgpOworCQl9IGVsc2UKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0aW1lb3V0Iik7CisJCXhtb3ZlX2ZkKHJyLCBuZXRmZCk7IC8qIGR1bXAgdGhlIG9sZCBzb2NrZXQsIGhlcmUncyBvdXIgbmV3IG9uZSAqLworCQkvKiBmaW5kIG91dCB3aGF0IGFkZHJlc3MgdGhlIGNvbm5lY3Rpb24gd2FzICp0byogb24gb3VyIGVuZCwgaW4gY2FzZSB3ZSdyZQorCQkgZG9pbmcgYSBsaXN0ZW4tb24tYW55IG9uIGEgbXVsdGlob21lZCBtYWNoaW5lLiAgVGhpcyBhbGxvd3Mgb25lIHRvCisJCSBvZmZlciBkaWZmZXJlbnQgc2VydmljZXMgdmlhIGRpZmZlcmVudCBhbGlhcyBhZGRyZXNzZXMsIHN1Y2ggYXMgdGhlCisJCSAidmlydHVhbCB3ZWIgc2l0ZSIgaGFjay4gKi8KKwkJZ2V0c29ja25hbWUobmV0ZmQsICZvdXJhZGRyLT51LnNhLCAmb3VyYWRkci0+bGVuKTsKKwkJLy9pZiAocnIgPCAwKQorCQkvLwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldHNvY2tuYW1lIGFmdGVyIGFjY2VwdCIpOworCX0KKworCWlmIChvX3ZlcmJvc2UpIHsKKwkJY2hhciAqbGNsYWRkciwgKnJlbWFkZHIsICpyZW1ob3N0bmFtZTsKKworI2lmIEVOQUJMRV9OQ19FWFRSQSAmJiBkZWZpbmVkKElQX09QVElPTlMpCisJLyogSWYgd2UgY2FuLCBsb29rIGZvciBhbnkgSVAgb3B0aW9ucy4gIFVzZWZ1bCBmb3IgdGVzdGluZyB0aGUgcmVjZWl2aW5nIGVuZCBvZgorCSBzdWNoIHRoaW5ncywgYW5kIGlzIGEgZ29vZCBleGVyY2lzZSBpbiBkZWFsaW5nIHdpdGggaXQuICBXZSBkbyB0aGlzIGJlZm9yZQorCSB0aGUgY29ubmVjdCBtZXNzYWdlLCB0byBlbnN1cmUgdGhhdCB0aGUgY29ubmVjdCBtc2cgaXMgdW5pZm9ybWx5IHRoZSBMQVNUCisJIHRoaW5nIHRvIGVtZXJnZSBhZnRlciBhbGwgdGhlIGludGVydmVuaW5nIGNydWQuICBEb2Vzbid0IHdvcmsgZm9yIFVEUCBvbgorCSBhbnkgbWFjaGluZXMgSSd2ZSB0ZXN0ZWQsIGJ1dCBmZWVsIGZyZWUgdG8gc3VycHJpc2UgbWUuICovCisJCWNoYXIgb3B0YnVmWzQwXTsKKwkJc29ja2xlbl90IHggPSBzaXplb2Yob3B0YnVmKTsKKworCQlyciA9IGdldHNvY2tvcHQobmV0ZmQsIElQUFJPVE9fSVAsIElQX09QVElPTlMsIG9wdGJ1ZiwgJngpOworCQlpZiAocnIgPj0gMCAmJiB4KSB7ICAgIC8qIHdlJ3ZlIGdvdCBvcHRpb25zLCBsZXNzZWUgZW0uLi4gKi8KKwkJCWJpbjJoZXgoYmlnYnVmX25ldCwgb3B0YnVmLCB4KTsKKwkJCWJpZ2J1Zl9uZXRbMip4XSA9ICdcMCc7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklQIG9wdGlvbnM6ICVzXG4iLCBiaWdidWZfbmV0KTsKKwkJfQorI2VuZGlmCisKKwkvKiBub3cgY2hlY2sgb3V0IHdobyBpdCBpcy4gIFdlIGRvbid0IGNhcmUgYWJvdXQgbWlzbWF0Y2hlZCBETlMgbmFtZXMgaGVyZSwKKwkgYnV0IGFueSBBRERSIGFuZCBQT1JUIHdlIHNwZWNpZmllZCBoYWQgYmV0dGVyIGZ1Y2tpbmcgd2VsbCBtYXRjaCB0aGUgY2FsbGVyLgorCSBDb252ZXJ0aW5nIGZyb20gYWRkciB0byBpbmV0X250b2EgYW5kIGJhY2sgYWdhaW4gaXMgYSBiaXQgb2YgYSBrbHVkZ2UsIGJ1dAorCSBnZXRob3N0cG9vcCB3YW50cyBhIHN0cmluZyBhbmQgdGhlcmUncyBtdWNoIGduYXJsaWVyIGNvZGUgb3V0IHRoZXJlIGFscmVhZHksCisJIHNvIEkgZG9uJ3QgZmVlbCBiYWQuCisJIFRoZSAqcmVhbCogcXVlc3Rpb24gaXMgd2h5IEJGRCBzb2NrZXRzIHdhc24ndCBkZXNpZ25lZCB0byBhbGxvdyBsaXN0ZW5zIGZvcgorCSBjb25uZWN0aW9ucyAqZnJvbSogc3BlY2lmaWMgaG9zdHMvcG9ydHMsIGluc3RlYWQgb2YgcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8KKwkgYWNjZXB0IHRoZSBjb25uZWN0aW9uIGFuZCB0aGVuIHJlamVjdCB1bmRlc2lyZWFibGUgb25lcyBieSBjbG9zaW5nLgorCSBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCBhIFRDUCBNU0dfUEVFSy4gKi8KKwkvKiBiYm94OiByZW1vdmVkIG1vc3Qgb2YgaXQgKi8KKwkJbGNsYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZvdXJhZGRyLT51LnNhKTsKKwkJcmVtYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZyZW1lbmQudS5zYSk7CisJCXJlbWhvc3RuYW1lID0gb19uZmxhZyA/IHJlbWFkZHIgOiB4bWFsbG9jX3NvY2thZGRyMmhvc3QoJnJlbWVuZC51LnNhKTsKKwkJZnByaW50ZihzdGRlcnIsICJjb25uZWN0IHRvICVzIGZyb20gJXMgKCVzKVxuIiwKKwkJCQlsY2xhZGRyLCByZW1ob3N0bmFtZSwgcmVtYWRkcik7CisJCWZyZWUobGNsYWRkcik7CisJCWZyZWUocmVtYWRkcik7CisJCWlmICghb19uZmxhZykKKwkJCWZyZWUocmVtaG9zdG5hbWUpOworCX0KK30KKworLyogdWRwdGVzdDoKKyBmaXJlIGEgY291cGxlIG9mIHBhY2tldHMgYXQgYSBVRFAgdGFyZ2V0IHBvcnQsIGp1c3QgdG8gc2VlIGlmIGl0J3MgcmVhbGx5CisgdGhlcmUuICBPbiBCU0Qga2VybmVscywgSUNNUCBob3N0L3BvcnQtdW5yZWFjaGFibGUgZXJyb3JzIGdldCBkZWxpdmVyZWQgdG8KKyBvdXIgc29ja2V0IGFzIEVDT05OUkVGVVNFRCB3cml0ZSBlcnJvcnMuICBPbiBTViBrZXJuZWxzLCB3ZSBsb3NlOyB3ZSdsbCBoYXZlCisgdG8gY29sbGVjdCBhbmQgYW5hbHl6ZSByYXcgSUNNUCBvdXJzZWx2ZXMgYSBsYSBzYXRhbidzIHByb2JlX3VkcF9wb3J0cworIGJhY2tlbmQuICBHdWVzcyB3aGVyZSBvbmUgY291bGQgc3dpcGUgdGhlIGFwcHJvcHJpYXRlIGNvZGUgZnJvbS4uLgorCisgVXNlIHRoZSB0aW1lIGRlbGF5IGJldHdlZW4gd3JpdGVzIGlmIGdpdmVuLCBvdGhlcndpc2UgdXNlIHRoZSAidGNwIHBpbmciCisgdHJpY2sgZm9yIGdldHRpbmcgdGhlIFJUVC4gIFtJIGdvdCB0aGF0IGlkZWEgZnJvbSBwbHV2aXVzLCBhbmQgd2FycGVkIGl0Ll0KKyBSZXR1cm4gZWl0aGVyIHRoZSBvcmlnaW5hbCBmZCwgb3IgY2xlYW4gdXAgYW5kIHJldHVybiAtMS4gKi8KKyNpZiBFTkFCTEVfTkNfRVhUUkEKK3N0YXRpYyBpbnQgdWRwdGVzdCh2b2lkKQoreworCWludCBycjsKKworCXJyID0gd3JpdGUobmV0ZmQsIGJpZ2J1Zl9pbiwgMSk7CisJaWYgKHJyICE9IDEpCisJCWJiX3BlcnJvcl9tc2coInVkcHRlc3QgZmlyc3Qgd3JpdGUiKTsKKworCWlmIChvX3dhaXQpCisJCXNsZWVwKG9fd2FpdCk7IC8vIGNhbiBiZSBpbnRlcnJ1cHRlZCEgd2hpbGUgKHQpIG5hbm9zbGVlcCgmdCk/CisJZWxzZSB7CisJLyogdXNlIHRoZSB0Y3AtcGluZyB0cmljazogdHJ5IGNvbm5lY3RpbmcgdG8gYSBub3JtYWxseSByZWZ1c2VkIHBvcnQsIHdoaWNoCisJIGNhdXNlcyB1cyB0byBibG9jayBmb3IgdGhlIHRpbWUgdGhhdCBTWU4gZ2V0cyB0aGVyZSBhbmQgUlNUIGdldHMgYmFjay4KKwkgTm90IGNvbXBsZXRlbHkgcmVsaWFibGUsIGJ1dCBpdCAqZG9lcyogbW9zdGx5IHdvcmsuICovCisJLyogU2V0IGEgdGVtcG9yYXJ5IGNvbm5lY3QgdGltZW91dCwgc28gcGFja2V0IGZpbHRyYXRpb24gZG9lc250IGNhdXNlCisJIHVzIHRvIGhhbmcgZm9yZXZlciwgYW5kIGhpdCBpdCAqLworCQlvX3dhaXQgPSA1OyAgICAgICAgICAgICAgICAgICAgIC8qIGVub3VnaCB0aGF0IHdlJ2xsIG5vdGljZT8/ICovCisJCXJyID0geHNvY2tldChvdXJhZGRyLT51LnNhLnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworCQlzZXRfbnBvcnQoJnRoZW1hZGRyLT51LnNhLCBodG9ucyhTTEVBWkVfUE9SVCkpOworCQljb25uZWN0X3dfdGltZW91dChycik7CisJCS8qIGRvbid0IG5lZWQgdG8gcmVzdG9yZSB0aGVtYWRkcidzIHBvcnQsIGl0J3Mgbm90IHVzZWQgYW55bW9yZSAqLworCQljbG9zZShycik7CisJCW9fd2FpdCA9IDA7IC8qIHJlc3RvcmUgKi8KKwl9CisKKwlyciA9IHdyaXRlKG5ldGZkLCBiaWdidWZfaW4sIDEpOworCXJldHVybiAocnIgIT0gMSk7IC8qIGlmIHJyID09IDEsIHJldHVybiAwIChzdWNjZXNzKSAqLworfQorI2Vsc2UKK2ludCB1ZHB0ZXN0KHZvaWQpOworI2VuZGlmCisKKy8qIG9wcmludDoKKyBIZXhkdW1wIGJ5dGVzIHNob3ZlbGVkIGVpdGhlciB3YXkgdG8gYSBydW5uaW5nIGxvZ2ZpbGUsIGluIHRoZSBmb3JtYXQ6CisgRCBvZmZzZXQgICAgICAgLSAgLSAtIC0gLS0tIDE2IGJ5dGVzIC0tLSAtIC0gLSAgLSAgICAgIyAuLi4uIGFzY2lpIC4uLi4uCisgd2hlcmUgIndoaWNoIiBzZXRzIHRoZSBkaXJlY3Rpb24gaW5kaWNhdG9yLCBEOgorIDAgLS0gc2VudCB0byBuZXR3b3JrLCBvciAiPiIKKyAxIC0tIHJjdmQgYW5kIHByaW50ZWQgdG8gc3Rkb3V0LCBvciAiPCIKKyBhbmQgImJ1ZiIgYW5kICJuIiBhcmUgZGF0YS1ibG9jayBhbmQgbGVuZ3RoLiAgSWYgdGhlIGN1cnJlbnQgYmxvY2sgZ2VuZXJhdGVzCisgYSBwYXJ0aWFsIGxpbmUsIHNvIGJlIGl0OyB3ZSAqd2FudCogdGhhdCBsb2Nrc3RlcCBpbmRpY2F0aW9uIG9mIHdobyBzZW50Cisgd2hhdCB3aGVuLiAgQWRhcHRlZCBmcm9tIGRnYXVkZXQncyBvcmlnaW5hbCBleGFtcGxlIC0tIGJ1dCBtdXN0IGJlIHJpcHBpbmcKKyAqZmFzdCosIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gYmUgdG9vIGRpc2stYm91bmQuLi4gKi8KKyNpZiBFTkFCTEVfTkNfRVhUUkEKK3N0YXRpYyB2b2lkIG9wcmludChpbnQgZGlyZWN0aW9uLCB1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBiYykKK3sKKwl1bnNpZ25lZCBvYmM7ICAgICAgICAgICAvKiBjdXJyZW50ICJnbG9iYWwiIG9mZnNldCAqLworCXVuc2lnbmVkIHg7CisJdW5zaWduZWQgY2hhciAqb3A7ICAgICAgLyogb3V0IGhleGR1bXAgcHRyICovCisJdW5zaWduZWQgY2hhciAqYXA7ICAgICAgLyogb3V0IGFzYy1kdW1wIHB0ciAqLworCXVuc2lnbmVkIGNoYXIgc3RhZ2VbMTAwXTsKKworCWlmIChiYyA9PSAwKQorCQlyZXR1cm47CisKKwlvYmMgPSB3cm90ZV9uZXQ7IC8qIHVzZSB0aGUgZ2xvYmFscyEgKi8KKwlpZiAoZGlyZWN0aW9uID09ICc8JykKKwkJb2JjID0gd3JvdGVfb3V0OworCXN0YWdlWzBdID0gZGlyZWN0aW9uOworCXN0YWdlWzU5XSA9ICcjJzsgLyogcHJlbG9hZCBzZXBhcmF0b3IgKi8KKwlzdGFnZVs2MF0gPSAnICc7CisKKwlkbyB7ICAgIC8qIGZvciBjaHVuay1vLWRhdGEgLi4uICovCisJCXggPSAxNjsKKwkJaWYgKGJjIDwgMTYpIHsKKwkJCS8qIG1lbXNldCgmc3RhZ2VbYmMqMyArIDExXSwgJyAnLCAxNiozIC0gYmMqMyk7ICovCisJCQltZW1zZXQoJnN0YWdlWzExXSwgJyAnLCAxNiozKTsKKwkJCXggPSBiYzsKKwkJfQorCQlzcHJpbnRmKChjaGFyICopJnN0YWdlWzFdLCAiICU4Ljh4ICIsIG9iYyk7ICAvKiB4eHg6IHN0aWxsIHNsb3c/ICovCisJCWJjIC09IHg7ICAgICAgICAgIC8qIGZpeCBjdXJyZW50IGNvdW50ICovCisJCW9iYyArPSB4OyAgICAgICAgIC8qIGZpeCBjdXJyZW50IG9mZnNldCAqLworCQlvcCA9ICZzdGFnZVsxMV07ICAvKiB3aGVyZSBoZXggc3RhcnRzICovCisJCWFwID0gJnN0YWdlWzYxXTsgIC8qIHdoZXJlIGFzY2lpIHN0YXJ0cyAqLworCisJCWRvIHsgIC8qIGZvciBsaW5lIG9mIGR1bXAsIGhvd2V2ZXIgbG9uZyAuLi4gKi8KKwkJCSpvcCsrID0gMHgyMCB8IGJiX2hleGRpZ2l0c191cGNhc2VbKnAgPj4gNF07CisJCQkqb3ArKyA9IDB4MjAgfCBiYl9oZXhkaWdpdHNfdXBjYXNlWypwICYgMHgwZl07CisJCQkqb3ArKyA9ICcgJzsKKwkJCWlmICgoKnAgPiAzMSkgJiYgKCpwIDwgMTI3KSkKKwkJCQkqYXAgPSAqcDsgICAvKiBwcmludGluZyAqLworCQkJZWxzZQorCQkJCSphcCA9ICcuJzsgIC8qIG5vbnByaW50aW5nLCBsb29zZSBkZWYgKi8KKwkJCWFwKys7CisJCQlwKys7CisJCX0gd2hpbGUgKC0teCk7CisJCSphcCsrID0gJ1xuJzsgIC8qIGZpbmlzaCB0aGUgbGluZSAqLworCQl4d3JpdGUob2ZkLCBzdGFnZSwgYXAgLSBzdGFnZSk7CisJfSB3aGlsZSAoYmMpOworfQorI2Vsc2UKK3ZvaWQgb3ByaW50KGludCBkaXJlY3Rpb24sIHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGJjKTsKKyNlbmRpZgorCisvKiByZWFkd3JpdGU6CisgaGFuZGxlIHN0ZGluL3N0ZG91dC9uZXR3b3JrIEkvTy4gIEJ3YWhhaGEhISAtLSB0aGUgc2VsZWN0IGxvb3AgZnJvbSBoZWxsLgorIEluIHRoaXMgaW5zdGFuY2UsIHJldHVybiB3aGF0IG1pZ2h0IGJlY29tZSBvdXIgZXhpdCBzdGF0dXMuICovCitzdGF0aWMgaW50IHJlYWR3cml0ZSh2b2lkKQoreworCWludCBycjsKKwljaGFyICp6cCA9IHpwOyAvKiBnY2MgKi8gIC8qIHN0ZGluIGJ1ZiBwdHIgKi8KKwljaGFyICpucCA9IG5wOyAgICAgICAgICAgIC8qIG5ldC1pbiBidWYgcHRyICovCisJdW5zaWduZWQgcnpsZWZ0OworCXVuc2lnbmVkIHJubGVmdDsKKwl1bnNpZ25lZCBuZXRyZXRyeTsgICAgICAgICAgICAgIC8qIG5ldC1yZWFkIHJldHJ5IGNvdW50ZXIgKi8KKwl1bnNpZ25lZCB3cmV0cnk7ICAgICAgICAgICAgICAgIC8qIG5ldC13cml0ZSBzYW5pdHkgY291bnRlciAqLworCXVuc2lnbmVkIHdmaXJzdDsgICAgICAgICAgICAgICAgLyogb25lLXNob3QgZmxhZyB0byBza2lwIGZpcnN0IG5ldCByZWFkICovCisKKwkvKiBpZiB5b3UgZG9uJ3QgaGF2ZSBhbGwgdGhpcyBGRF8qIG1hY3JvIGhhaXIgaW4gc3lzL3R5cGVzLmgsIHlvdSdsbCBoYXZlIHRvCisJIGVpdGhlciBmaW5kIGl0IG9yIGRvIHlvdXIgb3duIGJpdC1iYXNoaW5nOiAqZGluZzEgfD0gKDEgPDwgZmQpLCBldGMuLi4gKi8KKwlGRF9TRVQobmV0ZmQsICZkaW5nMSk7ICAgICAgICAgICAgICAgIC8qIGdsb2JhbDogdGhlIG5ldCBpcyBvcGVuICovCisJbmV0cmV0cnkgPSAyOworCXdmaXJzdCA9IDA7CisJcnpsZWZ0ID0gcm5sZWZ0ID0gMDsKKwlpZiAob19pbnRlcnZhbCkKKwkJc2xlZXAob19pbnRlcnZhbCk7ICAgICAgICAgICAgICAgIC8qIHBhdXNlICpiZWZvcmUqIHNlbmRpbmcgc3R1ZmYsIHRvbyAqLworCisJZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGZyb20gc2xlZXAsIGNsb3NlLCB3aGF0ZXZlciAqLworCS8qIGFuZCBub3cgdGhlIGJpZyBvbCcgc2VsZWN0IHNob3ZlbGluZyBsb29wIC4uLiAqLworCXdoaWxlIChGRF9JU1NFVChuZXRmZCwgJmRpbmcxKSkgeyAgICAgICAgLyogaS5lLiB0aWxsIHRoZSAqbmV0KiBjbG9zZXMhICovCisJCXdyZXRyeSA9IDgyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9yZSB0aGFuIHdlJ2xsIGV2ZXIgaGFmdGEgd3JpdGUgKi8KKwkJaWYgKHdmaXJzdCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFueSBzYXZlZCBzdGRpbiBidWZmZXI/ICovCisJCQl3Zmlyc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGZsYWcgZm9yIHRoZSBkdXJhdGlvbiAqLworCQkJZ290byBzaG92ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGdvIGhhbmRsZSBpdCBmaXJzdCAqLworCQl9CisJCWRpbmcyID0gZGluZzE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRkRfQ09QWSBhaW4ndCBwb3J0YWJsZS4uLiAqLworCS8qIHNvbWUgc3lzdGVtcywgbm90YWJseSBsaW51eCwgY3JhcCBpbnRvIHRoZWlyIHNlbGVjdCB0aW1lcnMgb24gcmV0dXJuLCBzbworCSB3ZSBjcmVhdGUgYSBleHBlbmRhYmxlIGNvcHkgYW5kIGdpdmUgKnRoYXQqIHRvIHNlbGVjdC4gICovCisJCWlmIChvX3dhaXQpIHsKKwkJCXN0cnVjdCB0aW1ldmFsIHRtcF90aW1lcjsKKwkJCXRtcF90aW1lci50dl9zZWMgPSBvX3dhaXQ7CisJCQl0bXBfdGltZXIudHZfdXNlYyA9IDA7CisJCS8qIGhpZ2hlc3QgcG9zc2libGUgZmQgaXMgbmV0ZmQgKDMpICovCisJCQlyciA9IHNlbGVjdChuZXRmZCsxLCAmZGluZzIsIE5VTEwsIE5VTEwsICZ0bXBfdGltZXIpOworCQl9IGVsc2UKKwkJCXJyID0gc2VsZWN0KG5ldGZkKzEsICZkaW5nMiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWlmIChyciA8IDAgJiYgZXJybm8gIT0gRUlOVFIpIHsgICAgICAgICAgICAgICAgLyogbWlnaHQgaGF2ZSBnb3R0ZW4gXlplZCwgZXRjICovCisJCQlob2xsZXJfcGVycm9yKCJzZWxlY3QiKTsKKwkJCWNsb3NlKG5ldGZkKTsKKwkJCXJldHVybiAxOworCQl9CisJLyogaWYgd2UgaGF2ZSBhIHRpbWVvdXQgQU5EIHN0ZGluIGlzIGNsb3NlZCBBTkQgd2UgaGF2ZW4ndCBoZWFyZCBhbnl0aGluZworCSBmcm9tIHRoZSBuZXQgZHVyaW5nIHRoYXQgdGltZSwgYXNzdW1lIGl0J3MgZGVhZCBhbmQgY2xvc2UgaXQgdG9vLiAqLworCQlpZiAocnIgPT0gMCkgeworCQkJaWYgKCFGRF9JU1NFVChTVERJTl9GSUxFTk8sICZkaW5nMSkpCisJCQkJbmV0cmV0cnktLTsgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhY3R1YWxseSB0cnkgYSBjb3VwbGEgdGltZXMuICovCisJCQlpZiAoIW5ldHJldHJ5KSB7CisJCQkJaWYgKG9fdmVyYm9zZSA+IDEpICAgICAgICAgICAgICAgIC8qIG5vcm1hbGx5IHdlIGRvbid0IGNhcmUgKi8KKwkJCQkJZnByaW50ZihzdGRlcnIsICJuZXQgdGltZW91dFxuIik7CisJCQkJY2xvc2UobmV0ZmQpOworCQkJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBlcnJvciEgKi8KKwkJCX0KKwkJfSAvKiBzZWxlY3QgdGltZW91dCAqLworCS8qIHh4eDogc2hvdWxkIHdlIGNoZWNrIHRoZSBleGNlcHRpb24gZmRzIHRvbz8gIFRoZSByZWFkIGZkcyBzZWVtIHRvIGdpdmUKKwkgdXMgdGhlIHJpZ2h0IGluZm8sIGFuZCBub25lIG9mIHRoZSBleGFtcGxlcyBJIGZvdW5kIGJvdGhlcmVkLiAqLworCisJLyogRGluZyEhICBTb21ldGhpbmcgYXJyaXZlZCwgZ28gY2hlY2sgYWxsIHRoZSBpbmNvbWluZyBob3BwZXJzLCBuZXQgZmlyc3QgKi8KKwkJaWYgKEZEX0lTU0VUKG5ldGZkLCAmZGluZzIpKSB7ICAgICAgICAgICAgICAgIC8qIG5ldDogZGluZyEgKi8KKwkJCXJyID0gcmVhZChuZXRmZCwgYmlnYnVmX25ldCwgQklHU0laKTsKKwkJCWlmIChyciA8PSAwKSB7CisJCQkJaWYgKHJyIDwgMCAmJiBvX3ZlcmJvc2UgPiAxKSB7CisJCQkJCS8qIG5jIDEuMTAgZG9lc24ndCBkbyB0aGlzICovCisJCQkJCWJiX3BlcnJvcl9tc2coIm5ldCByZWFkIik7CisJCQkJfQorCQkJCUZEX0NMUihuZXRmZCwgJmRpbmcxKTsgICAgICAgICAgICAgICAgLyogbmV0IGNsb3NlZCwgd2UnbGwgZmluaXNoIHVwLi4uICovCisJCQkJcnpsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYW4ndCB3cml0ZSBhbnltb3JlOiBicm9rZW4gcGlwZSAqLworCQkJfSBlbHNlIHsKKwkJCQlybmxlZnQgPSBycjsKKwkJCQlucCA9IGJpZ2J1Zl9uZXQ7CisJCQl9CitEZWJ1ZygiZ290ICVkIGZyb20gdGhlIG5ldCwgZXJybm8gJWQiLCByciwgZXJybm8pOworCQl9IC8qIG5ldDpkaW5nICovCisKKwkvKiBpZiB3ZSdyZSBpbiAic2xvd2x5IiBtb2RlIHRoZXJlJ3MgcHJvYmFibHkgc3RpbGwgc3R1ZmYgaW4gdGhlIHN0ZGluCisJIGJ1ZmZlciwgc28gZG9uJ3QgcmVhZCB1bmxlc3Mgd2UgcmVhbGx5IG5lZWQgTU9SRSBJTlBVVCEgIE1PUkUgSU5QVVQhICovCisJCWlmIChyemxlZnQpCisJCQlnb3RvIHNob3ZlbDsKKworCS8qIG9rYXksIHN1Y2sgbW9yZSBzdGRpbiAqLworCQlpZiAoRkRfSVNTRVQoU1RESU5fRklMRU5PLCAmZGluZzIpKSB7ICAgICAgICAgICAgICAgIC8qIHN0ZGluOiBkaW5nISAqLworCQkJcnIgPSByZWFkKFNURElOX0ZJTEVOTywgYmlnYnVmX2luLCBCSUdTSVopOworCS8qIENvbnNpZGVyZWQgbWFraW5nIHJlYWRzIGhlcmUgc21hbGxlciBmb3IgVURQIG1vZGUsIGJ1dCA4MTkyLWJ5dGUKKwkgbW9ieWdyYW1zIGFyZSBraW5kYSBmdW4gYW5kIGV4ZXJjaXNlIHRoZSByZWFzc2VtYmxlci4gKi8KKwkJCWlmIChyciA8PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYXQgZW5kLCBvciBmdWt0LCBvciAuLi4gKi8KKwkJCQlGRF9DTFIoU1RESU5fRklMRU5PLCAmZGluZzEpOyAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGFuZCBjbG9zZSBzdGRpbiAqLworCQkJCWNsb3NlKFNURElOX0ZJTEVOTyk7CisvLyBEb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gc2h1dGRvd24obmV0X2ZkLCBTSFVUX1dSKQorLy8gdG8gbGV0IG90aGVyIHNpZGUga25vdyB0aGF0IHdlIHdvbid0IHdyaXRlIGFueXRoaW5nIGFueW1vcmU/CisvLyAoYW5kIHdoYXQgYWJvdXQga2VlcGluZyBjb21wYXQgaWYgd2UgZG8gdGhhdD8pCisJCQl9IGVsc2UgeworCQkJCXJ6bGVmdCA9IHJyOworCQkJCXpwID0gYmlnYnVmX2luOworCQkJfQorCQl9IC8qIHN0ZGluOmRpbmcgKi8KKyBzaG92ZWw6CisJLyogbm93IHRoYXQgd2UndmUgZGluZ2RvbmdlZCBhbGwgb3VyIHRoaW5nZGluZ3MsIHNlbmQgb2ZmIHRoZSByZXN1bHRzLgorCSBHZWV6LCB3aHkgZG9lcyB0aGlzIGxvb2sgYW4gYXdmdWwgbG90IGxpa2UgdGhlIGJpZyBsb29wIGluICJyc2giPyAuLi4KKwkgbm90IHN1cmUgaWYgdGhlIG9yZGVyIG9mIHRoaXMgbWF0dGVycywgYnV0IHdyaXRlIG5ldCAtPiBzdGRvdXQgZmlyc3QuICovCisKKwkvKiBzYW5pdHkgY2hlY2suICBXb3JrcyBiZWNhdXNlIHRoZXkncmUgYm90aCB1bnNpZ25lZC4uLiAqLworCQlpZiAoKHJ6bGVmdCA+IDgyMDApIHx8IChybmxlZnQgPiA4MjAwKSkgeworCQkJaG9sbGVyX2Vycm9yKCJib2d1cyBidWZmZXJzOiAldSwgJXUiLCByemxlZnQsIHJubGVmdCk7CisJCQlyemxlZnQgPSBybmxlZnQgPSAwOworCQl9CisJLyogbmV0IHdyaXRlIHJldHJpZXMgc29tZXRpbWVzIGhhcHBlbiBvbiBVRFAgY29ubmVjdGlvbnMgKi8KKwkJaWYgKCF3cmV0cnkpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBzb21ldGhpbmcgaHVuZz8gKi8KKwkJCWhvbGxlcl9lcnJvcigidG9vIG1hbnkgb3V0cHV0IHJldHJpZXMiKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChybmxlZnQpIHsKKwkJCXJyID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgbnAsIHJubGVmdCk7CisJCQlpZiAocnIgPiAwKSB7CisJCQkJaWYgKG9fb2ZpbGUpIC8qIGxvZyB0aGUgc3Rkb3V0ICovCisJCQkJCW9wcmludCgnPCcsICh1bnNpZ25lZCBjaGFyICopbnAsIHJyKTsKKwkJCQlucCArPSBycjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXggdXAgcHRycyBhbmQgd2hhdG5vdCAqLworCQkJCXJubGVmdCAtPSBycjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aWxsIGdldCBzYW5pdHktY2hlY2tlZCBhYm92ZSAqLworCQkJCXdyb3RlX291dCArPSBycjsgICAgICAgICAgICAgICAgLyogZ2xvYmFsIGNvdW50ICovCisJCQl9CitEZWJ1Zygid3JvdGUgJWQgdG8gc3Rkb3V0LCBlcnJubyAlZCIsIHJyLCBlcnJubyk7CisJCX0gLyogcm5sZWZ0ICovCisJCWlmIChyemxlZnQpIHsKKwkJCWlmIChvX2ludGVydmFsKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICJzbG93bHkiIG1vZGUgPz8gKi8KKwkJCQlyciA9IGZpbmRsaW5lKHpwLCByemxlZnQpOworCQkJZWxzZQorCQkJCXJyID0gcnpsZWZ0OworCQkJcnIgPSB3cml0ZShuZXRmZCwgenAsIHJyKTsgICAgICAgIC8qIG9uZSBsaW5lLCBvciB0aGUgd2hvbGUgYnVmZmVyICovCisJCQlpZiAocnIgPiAwKSB7CisJCQkJaWYgKG9fb2ZpbGUpIC8qIGxvZyB3aGF0IGdvdCBzZW50ICovCisJCQkJCW9wcmludCgnPicsICh1bnNpZ25lZCBjaGFyICopenAsIHJyKTsKKwkJCQl6cCArPSBycjsKKwkJCQlyemxlZnQgLT0gcnI7CisJCQkJd3JvdGVfbmV0ICs9IHJyOyAgICAgICAgICAgICAgICAvKiBnbG9iYWwgY291bnQgKi8KKwkJCX0KK0RlYnVnKCJ3cm90ZSAlZCB0byBuZXQsIGVycm5vICVkIiwgcnIsIGVycm5vKTsKKwkJfSAvKiByemxlZnQgKi8KKwkJaWYgKG9faW50ZXJ2YWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeWNsZSBiZXR3ZWVuIHNsb3cgbGluZXMsIG9yIC4uLiAqLworCQkJc2xlZXAob19pbnRlcnZhbCk7CisJCQllcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgZnJvbSBzbGVlcCAqLworCQkJY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4ud2l0aCBoYWlyeSBzZWxlY3QgbG9vcC4uLiAqLworCQl9CisJCWlmICgocnpsZWZ0KSB8fCAocm5sZWZ0KSkgeyAgICAgICAgICAgICAgICAvKiBzaG92ZWwgdGhhdCBzaGl0IHRpbGwgdGhleSBhaW4ndCAqLworCQkJd3JldHJ5LS07ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9uZSBsZWZ0LCBhbmQgZ2V0IGFub3RoZXIgbG9hZCAqLworCQkJZ290byBzaG92ZWw7CisJCX0KKwl9IC8qIHdoaWxlIGRpbmcxOm5ldGZkIGlzIG9wZW4gKi8KKworCS8qIFhYWDogbWF5YmUgd2FudCBhIG1vcmUgZ3JhY2VmdWwgc2h1dGRvd24oKSBoZXJlLCBvciBzY3JldyBhcm91bmQgd2l0aAorCSBsaW5nZXIgdGltZXM/PyAgSSBzdXNwZWN0IHRoYXQgSSBkb24ndCBuZWVkIHRvIHNpbmNlIEknbSBhbHdheXMgZG9pbmcKKwkgYmxvY2tpbmcgcmVhZHMgYW5kIHdyaXRlcyBhbmQgbXkgb3duIG1hbnVhbCAibGFzdCBkaXRjaCIgZWZmb3J0cyB0byByZWFkCisJIHRoZSBuZXQgYWdhaW4gYWZ0ZXIgYSB0aW1lb3V0LiAgSSBoYXZlbid0IHNlZW4gYW55IHNjcmV3dXBzIHlldCwgYnV0IGl0J3MKKwkgbm90IGxpa2UgbXkgdGVzdCBuZXR3b3JrIGlzIHBhcnRpY3VsYXJseSBidXN5Li4uICovCisJY2xvc2UobmV0ZmQpOworCXJldHVybiAwOworfSAvKiByZWFkd3JpdGUgKi8KKworLyogbWFpbjogbm93IHdlIHB1bGwgaXQgYWxsIHRvZ2V0aGVyLi4uICovCitpbnQgbmNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5jX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpzdHJfcCwgKnN0cl9zOworCUlGX05DX0VYVFJBKGNoYXIgKnN0cl9pLCAqc3RyX287KQorCWNoYXIgKnRoZW1kb3R0ZWQgPSB0aGVtZG90dGVkOyAvKiBnY2MgKi8KKwljaGFyICoqcHJvZ2dpZTsKKwlpbnQgeDsKKwl1bnNpZ25lZCBvX2xwb3J0ID0gMDsKKworCUlOSVRfRygpOworCisJLyogY2F0Y2ggYSBzaWduYWwgb3IgdHdvIGZvciBjbGVhbnVwICovCisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1FVSVQpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJLCBjYXRjaCk7CisJLyogYW5kIHN1cHByZXNzIG90aGVycy4uLiAqLworCWJiX3NpZ25hbHMoMAorI2lmZGVmIFNJR1VSRworCQkrICgxIDw8IFNJR1VSRykKKyNlbmRpZgorCQkrICgxIDw8IFNJR1BJUEUpIC8qIGltcG9ydGFudCEgKi8KKwkJLCBTSUdfSUdOKTsKKworCXByb2dnaWUgPSBhcmd2OworCXdoaWxlICgqKytwcm9nZ2llKSB7CisJCWlmIChzdHJjbXAoKnByb2dnaWUsICItZSIpID09IDApIHsKKwkJCSpwcm9nZ2llID0gTlVMTDsKKwkJCXByb2dnaWUrKzsKKwkJCWdvdG8gZV9mb3VuZDsKKwkJfQorCX0KKwlwcm9nZ2llID0gTlVMTDsKKyBlX2ZvdW5kOgorCisJLy8gLWcgLUcgLXQgLXIgZGVsZXRlZCwgdW5pbXBsZW1lbnRlZCAtYSBkZWxldGVkIHRvbworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8yOnZ2OncrIjsgLyogbWF4IDIgcGFyYW1zOyAtdiBpcyBhIGNvdW50ZXI7IC13IE4gKi8KKwlnZXRvcHQzMihhcmd2LCAiaG5wOnM6dXZ3OiIgSUZfTkNfU0VSVkVSKCJsIikKKwkJCUlGX05DX0VYVFJBKCJpOm86eiIpLAorCQkJJnN0cl9wLCAmc3RyX3MsICZvX3dhaXQKKwkJCUlGX05DX0VYVFJBKCwgJnN0cl9pLCAmc3RyX28pLCAmb192ZXJib3NlKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNpZiBFTkFCTEVfTkNfRVhUUkEKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9pKSAvKiBsaW5lLWludGVydmFsIHRpbWUgKi8KKwkJb19pbnRlcnZhbCA9IHhhdG91X3JhbmdlKHN0cl9pLCAxLCAweGZmZmYpOworI2VuZGlmCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF9sKSAvKiBsaXN0ZW4gbW9kZSAqLworCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikgLyogbnVtZXJpYy1vbmx5LCBubyBETlMgbG9va3VwcyAqLworCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbykgLyogaGV4ZHVtcCBsb2cgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9wKSB7IC8qIGxvY2FsIHNvdXJjZSBwb3J0ICovCisJCW9fbHBvcnQgPSBiYl9sb29rdXBfcG9ydChzdHJfcCwgb191ZHBtb2RlID8gInVkcCIgOiAidGNwIiwgMCk7CisJCWlmICghb19scG9ydCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgbG9jYWwgcG9ydCAnJXMnIiwgc3RyX3ApOworCX0KKwkvL2lmIChvcHRpb25fbWFzazMyICYgT1BUX3IpIC8qIHJhbmRvbWl6ZSB2YXJpb3VzIHRoaW5ncyAqLworCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdSkgLyogdXNlIFVEUCAqLworCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikgLyogdmVyYm9zZSAqLworCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdykgLyogd2FpdCB0aW1lICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF96KSAvKiBsaXR0bGUgb3Igbm8gZGF0YSB4ZmVyICovCisKKwkvKiBXZSBtYW5hZ2Ugb3VyIGZkJ3Mgc28gdGhhdCB0aGV5IGFyZSBuZXZlciAwLDEsMiAqLworCS8qYmJfc2FuaXRpemVfc3RkaW8oKTsgLSBub3QgbmVlZGVkICovCisKKwlpZiAoYXJndlswXSkgeworCQl0aGVtYWRkciA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sCisJCQlhcmd2WzFdCisJCQk/IGJiX2xvb2t1cF9wb3J0KGFyZ3ZbMV0sIG9fdWRwbW9kZSA/ICJ1ZHAiIDogInRjcCIsIDApCisJCQk6IDApOworCX0KKworCS8qIGNyZWF0ZSAmIGJpbmQgbmV0d29yayBzb2NrZXQgKi8KKwl4ID0gKG9fdWRwbW9kZSA/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTSk7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcykgeyAvKiBsb2NhbCBhZGRyZXNzICovCisJCS8qIGlmIG9fbHBvcnQgaXMgc3RpbGwgMCwgdGhlbiB3ZSB3aWxsIHVzZSByYW5kb20gcG9ydCAqLworCQlvdXJhZGRyID0geGhvc3Qyc29ja2FkZHIoc3RyX3MsIG9fbHBvcnQpOworI2lmZGVmIEJMT0FUCisJCS8qIHByZXZlbnQgc3B1cmlvdXMgIlVEUCBsaXN0ZW4gbmVlZHMgITAgcG9ydCIgKi8KKwkJb19scG9ydCA9IGdldF9ucG9ydChvdXJhZGRyKTsKKwkJb19scG9ydCA9IG50b2hzKG9fbHBvcnQpOworI2VuZGlmCisJCXggPSB4c29ja2V0KG91cmFkZHItPnUuc2Euc2FfZmFtaWx5LCB4LCAwKTsKKwl9IGVsc2UgeworCQkvKiBXZSB0cnkgSVB2NiwgdGhlbiBJUHY0LCB1bmxlc3MgYWRkciBmYW1pbHkgaXMKKwkJICogaW1wbGljaXRseSBzZXQgYnkgd2F5IG9mIHJlbW90ZSBhZGRyL3BvcnQgc3BlYyAqLworCQl4ID0geHNvY2tldF90eXBlKCZvdXJhZGRyLAorCQkJCSh0aGVtYWRkciA/IHRoZW1hZGRyLT51LnNhLnNhX2ZhbWlseSA6IEFGX1VOU1BFQyksCisJCQkJeCk7CisJCWlmIChvX2xwb3J0KQorCQkJc2V0X25wb3J0KCZvdXJhZGRyLT51LnNhLCBodG9ucyhvX2xwb3J0KSk7CisJfQorCXhtb3ZlX2ZkKHgsIG5ldGZkKTsKKwlzZXRzb2Nrb3B0X3JldXNlYWRkcihuZXRmZCk7CisJaWYgKG9fdWRwbW9kZSkKKwkJc29ja2V0X3dhbnRfcGt0aW5mbyhuZXRmZCk7CisJaWYgKCFFTkFCTEVfRkVBVFVSRV9VTklYX0xPQ0FMCisJIHx8IG9fbGlzdGVuCisJIHx8IG91cmFkZHItPnUuc2Euc2FfZmFtaWx5ICE9IEFGX1VOSVgKKwkpIHsKKwkJeGJpbmQobmV0ZmQsICZvdXJhZGRyLT51LnNhLCBvdXJhZGRyLT5sZW4pOworCX0KKyNpZiAwCisJc2V0c29ja29wdChuZXRmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmb19yY3ZidWYsIHNpemVvZiBvX3JjdmJ1Zik7CisJc2V0c29ja29wdChuZXRmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmb19zbmRidWYsIHNpemVvZiBvX3NuZGJ1Zik7CisjZW5kaWYKKworI2lmZGVmIEJMT0FUCisJaWYgKE9QVF9sICYmIChvcHRpb25fbWFzazMyICYgKE9QVF91fE9QVF9sKSkgPT0gKE9QVF91fE9QVF9sKSkgeworCQkvKiBhcHBhcmVudGx5IFVEUCBjYW4gbGlzdGVuIE9OICJwb3J0IDAiLAorCQkgYnV0IHRoYXQncyBub3QgdXNlZnVsICovCisJCWlmICghb19scG9ydCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJVRFAgbGlzdGVuIG5lZWRzIG5vbnplcm8gLXAgcG9ydCIpOworCX0KKyNlbmRpZgorCisJRkRfU0VUKFNURElOX0ZJTEVOTywgJmRpbmcxKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGRpbiAqaXMqIGluaXRpYWxseSBvcGVuICovCisJaWYgKHByb2dnaWUpIHsKKwkJY2xvc2UoMCk7IC8qIHdvbid0IG5lZWQgc3RkaW4gKi8KKwkJb3B0aW9uX21hc2szMiAmPSB+T1BUX287IC8qIC1vIHdpdGggLWUgaXMgbWVhbmluZ2xlc3MhICovCisJfQorI2lmIEVOQUJMRV9OQ19FWFRSQQorCWlmIChvX29maWxlKQorCQl4bW92ZV9mZCh4b3BlbihzdHJfbywgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DKSwgb2ZkKTsKKyNlbmRpZgorCisJaWYgKG9fbGlzdGVuKSB7CisJCWRvbGlzdGVuKCk7CisJCS8qIGRvbGlzdGVuIGRvZXMgaXRzIG93biBjb25uZWN0IHJlcG9ydGluZyAqLworCQlpZiAocHJvZ2dpZSkgLyogLWUgZ2l2ZW4/ICovCisJCQlkb2V4ZWMocHJvZ2dpZSk7CisJCXggPSByZWFkd3JpdGUoKTsgLyogaXQgZXZlbiB3b3JrcyB3aXRoIFVEUCEgKi8KKwl9IGVsc2UgeworCQkvKiBPdXRib3VuZCBjb25uZWN0cy4gIE5vdyB3ZSdyZSBtb3JlIHBpY2t5IGFib3V0IGFyZ3MuLi4gKi8KKwkJaWYgKCF0aGVtYWRkcikKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQlyZW1lbmQgPSAqdGhlbWFkZHI7CisJCWlmIChvX3ZlcmJvc2UpCisJCQl0aGVtZG90dGVkID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJnRoZW1hZGRyLT51LnNhKTsKKworCQl4ID0gY29ubmVjdF93X3RpbWVvdXQobmV0ZmQpOworCQlpZiAob196ZXJvICYmIHggPT0gMCAmJiBvX3VkcG1vZGUpICAgICAgICAvKiBpZiBVRFAgc2Nhbm5pbmcuLi4gKi8KKwkJCXggPSB1ZHB0ZXN0KCk7CisJCWlmICh4ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBZb3csIGFyZSB3ZSBPUEVOIFlFVD8hICovCisJCQlpZiAob192ZXJib3NlKQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgKCVzKSBvcGVuXG4iLCBhcmd2WzBdLCB0aGVtZG90dGVkKTsKKwkJCWlmIChwcm9nZ2llKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4ZWMgaXMgdmFsaWQgZm9yIG91dGJvdW5kLCB0b28gKi8KKwkJCQlkb2V4ZWMocHJvZ2dpZSk7CisJCQlpZiAoIW9femVybykKKwkJCQl4ID0gcmVhZHdyaXRlKCk7CisJCX0gZWxzZSB7IC8qIGNvbm5lY3Qgb3IgdWRwdGVzdCB3YXNuJ3Qgc3VjY2Vzc2Z1bCAqLworCQkJeCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0IHN0YXR1cyAqLworCQkJLyogaWYgd2UncmUgc2Nhbm5pbmcgYXQgYSAib25lIC12IiB2ZXJib3NpdHkgbGV2ZWwsIGRvbid0IHByaW50IHJlZnVzYWxzLgorCQkJIEdpdmUgaXQgYW5vdGhlciAtdiBpZiB5b3Ugd2FudCB0byBzZWUgZXZlcnl0aGluZy4gKi8KKwkJCWlmIChvX3ZlcmJvc2UgPiAxIHx8IChvX3ZlcmJvc2UgJiYgZXJybm8gIT0gRUNPTk5SRUZVU0VEKSkKKwkJCQliYl9wZXJyb3JfbXNnKCIlcyAoJXMpIiwgYXJndlswXSwgdGhlbWRvdHRlZCk7CisJCX0KKwl9CisJaWYgKG9fdmVyYm9zZSA+IDEpICAgICAgICAgICAgICAgIC8qIG5vcm1hbGx5IHdlIGRvbid0IGNhcmUgKi8KKwkJZnByaW50ZihzdGRlcnIsIFNFTlRfTl9SRUNWX00sIHdyb3RlX25ldCwgd3JvdGVfb3V0KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbmV0c3RhdC5jIGIvbmV0d29ya2luZy9uZXRzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyMzk1NwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbmV0c3RhdC5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG5ldHN0YXQgaW1wbGVtZW50YXRpb24ocykgZm9yIGJ1c3lib3gKKyAqIGJhc2VkIGluIHBhcnQgb24gdGhlIG5ldHN0YXQgaW1wbGVtZW50YXRpb24gZnJvbSBuZXQtdG9vbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEJhcnQgVmlzc2NoZXIgPG1hZ2lja0BsaW51eC1mYW4uY29tPgorICoKKyAqIDIwMDItMDQtMjAKKyAqIElQVjYgc3VwcG9ydCBhZGRlZCBieSBCYXJ0IFZpc3NjaGVyIDxtYWdpY2tAbGludXgtZmFuLmNvbT4KKyAqCisgKiAyMDA4LTA3LTEwCisgKiBvcHRpb25hbCAnLXAnIGZsYWcgc3VwcG9ydCBwb3J0ZWQgZnJvbSBuZXQtdG9vbHMgYnkgRy4gU29tbG8gPHNvbWxvQGNtdS5lZHU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisvL3VzYWdlOiNkZWZpbmUgbmV0c3RhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy0iSUZfUk9VVEUoInIiKSJhbF0gWy10dXd4XSBbLWVuIklGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKCJXIilJRl9GRUFUVVJFX05FVFNUQVRfUFJHKCJwIikiXSIKKy8vdXNhZ2U6I2RlZmluZSBuZXRzdGF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBuZXR3b3JraW5nIGluZm9ybWF0aW9uXG4iCisvL3VzYWdlOglJRl9ST1VURSgKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUm91dGluZyB0YWJsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWEJQWxsIHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3RlbmluZyBzb2NrZXRzIgorLy91c2FnZTogICAgICJcbgkJRWxzZTogY29ubmVjdGVkIHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS10CVRDUCBzb2NrZXRzIgorLy91c2FnZTogICAgICJcbgktdQlVRFAgc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJUmF3IHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS14CVVuaXggc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JCUVsc2U6IGFsbCBzb2NrZXQgdHlwZXMiCisvL3VzYWdlOiAgICAgIlxuCS1lCU90aGVyL21vcmUgaW5mb3JtYXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHJlc29sdmUgbmFtZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX05FVFNUQVRfV0lERSgKKy8vdXNhZ2U6ICAgICAiXG4JLVcJV2lkZSBkaXNwbGF5IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9ORVRTVEFUX1BSRygKKy8vdXNhZ2U6ICAgICAiXG4JLXAJU2hvdyBQSUQvcHJvZ3JhbSBuYW1lIGZvciBzb2NrZXRzIgorLy91c2FnZToJKQorCisjZGVmaW5lIE5FVFNUQVRfT1BUUyAibGFlbnR1d3giIFwKKwlJRl9ST1VURSggICAgICAgICAgICAgICAiciIpIFwKKwlJRl9GRUFUVVJFX05FVFNUQVRfV0lERSgiVyIpIFwKKwlJRl9GRUFUVVJFX05FVFNUQVRfUFJHKCAicCIpCisKK2VudW0geworCU9QVF9zb2NrX2xpc3RlbiA9IDEgPDwgMCwgLy8gbAorCU9QVF9zb2NrX2FsbCAgICA9IDEgPDwgMSwgLy8gYQorCU9QVF9leHRlbmRlZCAgICA9IDEgPDwgMiwgLy8gZQorCU9QVF9ub3Jlc29sdmUgICA9IDEgPDwgMywgLy8gbgorCU9QVF9zb2NrX3RjcCAgICA9IDEgPDwgNCwgLy8gdAorCU9QVF9zb2NrX3VkcCAgICA9IDEgPDwgNSwgLy8gdQorCU9QVF9zb2NrX3JhdyAgICA9IDEgPDwgNiwgLy8gdworCU9QVF9zb2NrX3VuaXggICA9IDEgPDwgNywgLy8geAorCU9QVEJJVF94ICAgICAgICA9IDcsCisJSUZfUk9VVEUoICAgICAgICAgICAgICAgT1BUQklUX1JPVVRFLCkKKwlJRl9GRUFUVVJFX05FVFNUQVRfV0lERShPUFRCSVRfV0lERSAsKQorCUlGX0ZFQVRVUkVfTkVUU1RBVF9QUkcoIE9QVEJJVF9QUkcgICwpCisJT1BUX3JvdXRlICAgICAgID0gSUZfUk9VVEUoICAgICAgICAgICAgICAgKDEgPDwgT1BUQklUX1JPVVRFKSkgKyAwLCAvLyByCisJT1BUX3dpZGUgICAgICAgID0gSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoKDEgPDwgT1BUQklUX1dJREUgKSkgKyAwLCAvLyBXCisJT1BUX3ByZyAgICAgICAgID0gSUZfRkVBVFVSRV9ORVRTVEFUX1BSRyggKDEgPDwgT1BUQklUX1BSRyAgKSkgKyAwLCAvLyBwCit9OworCisjZGVmaW5lIE5FVFNUQVRfQ09OTkVDVEVEIDB4MDEKKyNkZWZpbmUgTkVUU1RBVF9MSVNURU5JTkcgMHgwMgorI2RlZmluZSBORVRTVEFUX05VTUVSSUMgICAweDA0CisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIG9wdGlvbiBzdHJpbmcgKi8KKyNkZWZpbmUgTkVUU1RBVF9UQ1AgICAgICAgMHgxMAorI2RlZmluZSBORVRTVEFUX1VEUCAgICAgICAweDIwCisjZGVmaW5lIE5FVFNUQVRfUkFXICAgICAgIDB4NDAKKyNkZWZpbmUgTkVUU1RBVF9VTklYICAgICAgMHg4MAorI2RlZmluZSBORVRTVEFUX0FMTFBST1RPICAoTkVUU1RBVF9UQ1B8TkVUU1RBVF9VRFB8TkVUU1RBVF9SQVd8TkVUU1RBVF9VTklYKQorCisKK2VudW0geworCVRDUF9FU1RBQkxJU0hFRCA9IDEsCisJVENQX1NZTl9TRU5ULAorCVRDUF9TWU5fUkVDViwKKwlUQ1BfRklOX1dBSVQxLAorCVRDUF9GSU5fV0FJVDIsCisJVENQX1RJTUVfV0FJVCwKKwlUQ1BfQ0xPU0UsCisJVENQX0NMT1NFX1dBSVQsCisJVENQX0xBU1RfQUNLLAorCVRDUF9MSVNURU4sCisJVENQX0NMT1NJTkcsIC8qIG5vdyBhIHZhbGlkIHN0YXRlICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGNwX3N0YXRlW10gPSB7CisJIiIsCisJIkVTVEFCTElTSEVEIiwKKwkiU1lOX1NFTlQiLAorCSJTWU5fUkVDViIsCisJIkZJTl9XQUlUMSIsCisJIkZJTl9XQUlUMiIsCisJIlRJTUVfV0FJVCIsCisJIkNMT1NFIiwKKwkiQ0xPU0VfV0FJVCIsCisJIkxBU1RfQUNLIiwKKwkiTElTVEVOIiwKKwkiQ0xPU0lORyIKK307CisKK3R5cGVkZWYgZW51bSB7CisJU1NfRlJFRSA9IDAsICAgICAvKiBub3QgYWxsb2NhdGVkICAgICAgICAgICAgICAgICovCisJU1NfVU5DT05ORUNURUQsICAvKiB1bmNvbm5lY3RlZCB0byBhbnkgc29ja2V0ICAgICovCisJU1NfQ09OTkVDVElORywgICAvKiBpbiBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgICAgICovCisJU1NfQ09OTkVDVEVELCAgICAvKiBjb25uZWN0ZWQgdG8gc29ja2V0ICAgICAgICAgICovCisJU1NfRElTQ09OTkVDVElORyAvKiBpbiBwcm9jZXNzIG9mIGRpc2Nvbm5lY3RpbmcgICovCit9IHNvY2tldF9zdGF0ZTsKKworI2RlZmluZSBTT19BQ0NFUFRDT04gKDE8PDE2KSAgLyogcGVyZm9ybWVkIGEgbGlzdGVuICAgICAgICAgICAqLworI2RlZmluZSBTT19XQUlUREFUQSAgKDE8PDE3KSAgLyogd2FpdCBkYXRhIHRvIHJlYWQgICAgICAgICAgICAqLworI2RlZmluZSBTT19OT1NQQUNFICAgKDE8PDE4KSAgLyogbm8gc3BhY2UgdG8gd3JpdGUgICAgICAgICAgICAqLworCisjZGVmaW5lIEFERFJfTk9STUFMX1dJRFRIICAgICAgICAyMworLyogV2hlbiB0aGVyZSBhcmUgSVB2NiBjb25uZWN0aW9ucyB0aGUgSVB2NiBhZGRyZXNzZXMgd2lsbCBiZQorICogdHJ1bmNhdGVkIHRvIG5vbmUtcmVjb2duaXRpb24uIFRoZSAnLVcnIG9wdGlvbiBtYWtlcyB0aGUKKyAqIGFkZHJlc3MgY29sdW1ucyB3aWRlIGVub3VnaCB0byBhY2NvbW9kYXRlIGZvciBsb25nZXN0IHBvc3NpYmxlCisgKiBJUHY2IGFkZHJlc3NlcywgaS5lLiBhZGRyZXNzZXMgb2YgdGhlIGZvcm0KKyAqIHh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDp4eHh4OmRkZC5kZGQuZGRkLmRkZAorICovCisjZGVmaW5lIEFERFJfV0lERSAgICAgICAgICAgICAgICA1MSAgLyogSU5FVDZfQUREUlNUUkxFTiArIDUgZm9yIHRoZSBwb3J0IG51bWJlciAqLworI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfV0lERQorIyBkZWZpbmUgRk1UX05FVF9DT05OX0RBVEEgICAgICAgIiVzICAgJTZsZCAlNmxkICUtKnMgJS0qcyAlLTEycyIKKyMgZGVmaW5lIEZNVF9ORVRfQ09OTl9IRUFERVIgICAgICJcblByb3RvIFJlY3YtUSBTZW5kLVEgJS0qcyAlLSpzIFN0YXRlICAgICAgICVzXG4iCisjZWxzZQorIyBkZWZpbmUgRk1UX05FVF9DT05OX0RBVEEgICAgICAgIiVzICAgJTZsZCAlNmxkICUtMjNzICUtMjNzICUtMTJzIgorIyBkZWZpbmUgRk1UX05FVF9DT05OX0hFQURFUiAgICAgIlxuUHJvdG8gUmVjdi1RIFNlbmQtUSAlLTIzcyAlLTIzcyBTdGF0ZSAgICAgICAlc1xuIgorI2VuZGlmCisKKyNkZWZpbmUgUFJPR05BTUVfV0lEVEggICAgIDIwCisjZGVmaW5lIFBST0dOQU1FX1dJRFRIX1NUUiAiMjAiCisvKiBQUk9HTkFNRV9XSURUSCBjaGFyczogMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgKi8KKyNkZWZpbmUgUFJPR05BTUVfQkFOTkVSICJQSUQvUHJvZ3JhbSBuYW1lICAgICIKKworc3RydWN0IHByZ19ub2RlIHsKKwlzdHJ1Y3QgcHJnX25vZGUgKm5leHQ7CisJbG9uZyBpbm9kZTsKKwljaGFyIG5hbWVbUFJPR05BTUVfV0lEVEhdOworfTsKKworI2RlZmluZSBQUkdfSEFTSF9TSVpFIDIxMQorCitzdHJ1Y3QgZ2xvYmFscyB7CisJc21hbGxpbnQgZmxhZ3M7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwlzbWFsbGludCBwcmdfY2FjaGVfbG9hZGVkOworCXN0cnVjdCBwcmdfbm9kZSAqcHJnX2hhc2hbUFJHX0hBU0hfU0laRV07CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1BSRworCWNvbnN0IGNoYXIgKnByb2duYW1lX2Jhbm5lcjsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfV0lERQorCXVuc2lnbmVkIGFkZHJfd2lkdGg7CisjZW5kaWYKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgZmxhZ3MgICAgICAgICAgICAoRy5mbGFncyAgICAgICAgICAgKQorI2RlZmluZSBwcmdfY2FjaGVfbG9hZGVkIChHLnByZ19jYWNoZV9sb2FkZWQpCisjZGVmaW5lIHByZ19oYXNoICAgICAgICAgKEcucHJnX2hhc2ggICAgICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1BSRworIyBkZWZpbmUgcHJvZ25hbWVfYmFubmVyIChHLnByb2duYW1lX2Jhbm5lciApCisjZWxzZQorIyBkZWZpbmUgcHJvZ25hbWVfYmFubmVyICIiCisjZW5kaWYKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlmbGFncyA9IE5FVFNUQVRfQ09OTkVDVEVEIHwgTkVUU1RBVF9BTExQUk9UTzsgXAorfSB3aGlsZSAoMCkKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKworLyogRGVsaWJlcmF0ZWx5IHRydW5jYXRpbmcgbG9uZyB0byB1bnNpZ25lZCAqaW50KiAqLworI2RlZmluZSBQUkdfSEFTSElUKHgpICgodW5zaWduZWQpKHgpICUgUFJHX0hBU0hfU0laRSkKKworc3RhdGljIHZvaWQgcHJnX2NhY2hlX2FkZChsb25nIGlub2RlLCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGhpID0gUFJHX0hBU0hJVChpbm9kZSk7CisJc3RydWN0IHByZ19ub2RlICoqcG5wLCAqcG47CisKKwlwcmdfY2FjaGVfbG9hZGVkID0gMjsKKwlmb3IgKHBucCA9IHByZ19oYXNoICsgaGk7IChwbiA9ICpwbnApICE9IE5VTEw7IHBucCA9ICZwbi0+bmV4dCkgeworCQlpZiAocG4tPmlub2RlID09IGlub2RlKSB7CisJCQkvKiBTb21lIHdhcm5pbmcgc2hvdWxkIGJlIGFwcHJvcHJpYXRlIGhlcmUKKwkJCSAgIGFzIHdlIGdvdCBtdWx0aXBsZSBwcm9jZXNzZXMgZm9yIG9uZSBpLW5vZGUgKi8KKwkJCXJldHVybjsKKwkJfQorCX0KKwkqcG5wID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHByZ19ub2RlKSk7CisJcG4gPSAqcG5wOworCXBuLT5pbm9kZSA9IGlub2RlOworCXNhZmVfc3RybmNweShwbi0+bmFtZSwgbmFtZSwgUFJPR05BTUVfV0lEVEgpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJnX2NhY2hlX2dldChsb25nIGlub2RlKQoreworCXVuc2lnbmVkIGhpID0gUFJHX0hBU0hJVChpbm9kZSk7CisJc3RydWN0IHByZ19ub2RlICpwbjsKKworCWZvciAocG4gPSBwcmdfaGFzaFtoaV07IHBuOyBwbiA9IHBuLT5uZXh0KQorCQlpZiAocG4tPmlub2RlID09IGlub2RlKQorCQkJcmV0dXJuIHBuLT5uYW1lOworCXJldHVybiAiLSI7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorc3RhdGljIHZvaWQgcHJnX2NhY2hlX2NsZWFyKHZvaWQpCit7CisJc3RydWN0IHByZ19ub2RlICoqcG5wLCAqcG47CisKKwlmb3IgKHBucCA9IHByZ19oYXNoOyBwbnAgPCBwcmdfaGFzaCArIFBSR19IQVNIX1NJWkU7IHBucCsrKSB7CisJCXdoaWxlICgocG4gPSAqcG5wKSAhPSBOVUxMKSB7CisJCQkqcG5wID0gcG4tPm5leHQ7CisJCQlmcmVlKHBuKTsKKwkJfQorCX0KK30KKyNlbHNlCisjZGVmaW5lIHByZ19jYWNoZV9jbGVhcigpICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyBsb25nIGV4dHJhY3Rfc29ja2V0X2lub2RlKGNvbnN0IGNoYXIgKmxuYW1lKQoreworCWxvbmcgaW5vZGUgPSAtMTsKKworCWlmIChzdHJuY21wKGxuYW1lLCAic29ja2V0OlsiLCBzaXplb2YoInNvY2tldDpbIiktMSkgPT0gMCkgeworCQkvKiAic29ja2V0OlsxMjM0NV0iLCBleHRyYWN0IHRoZSAiMTIzNDUiIGFzIGlub2RlICovCisJCWlub2RlID0gYmJfc3RydG91bChsbmFtZSArIHNpemVvZigic29ja2V0OlsiKS0xLCAoY2hhcioqKSZsbmFtZSwgMCk7CisJCWlmICgqbG5hbWUgIT0gJ10nKQorCQkJaW5vZGUgPSAtMTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAobG5hbWUsICJbMDAwMF06Iiwgc2l6ZW9mKCJbMDAwMF06IiktMSkgPT0gMCkgeworCQkvKiAiWzAwMDBdOjEyMzQ1IiwgZXh0cmFjdCB0aGUgIjEyMzQ1IiBhcyBpbm9kZSAqLworCQlpbm9kZSA9IGJiX3N0cnRvdWwobG5hbWUgKyBzaXplb2YoIlswMDAwXToiKS0xLCBOVUxMLCAwKTsKKwkJaWYgKGVycm5vKSAvKiBub3QgTlVMIHRlcm1pbmF0ZWQ/ICovCisJCQlpbm9kZSA9IC0xOworCX0KKworI2lmIDAgLyogYmJfc3RydG9sIHJldHVybnMgYWxsLW9uZXMgYml0IHBhdHRlcm4gb24gRVJBTkdFIGFueXdheSAqLworCWlmIChlcnJubyA9PSBFUkFOR0UpCisJCWlub2RlID0gLTE7CisjZW5kaWYKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGFkZF90b19wcmdfY2FjaGVfaWZfc29ja2V0KGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCXZvaWQgKnBpZF9zbGFzaF9wcm9nbmFtZSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyICpsaW5rbmFtZTsKKwlsb25nIGlub2RlOworCisJbGlua25hbWUgPSB4bWFsbG9jX3JlYWRsaW5rKGZpbGVOYW1lKTsKKwlpZiAobGlua25hbWUgIT0gTlVMTCkgeworCQlpbm9kZSA9IGV4dHJhY3Rfc29ja2V0X2lub2RlKGxpbmtuYW1lKTsKKwkJZnJlZShsaW5rbmFtZSk7CisJCWlmIChpbm9kZSA+PSAwKQorCQkJcHJnX2NhY2hlX2FkZChpbm9kZSwgKGNoYXIgKilwaWRfc2xhc2hfcHJvZ25hbWUpOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgZGlyX2FjdChjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCkKK3sKKwljb25zdCBjaGFyICpwaWQ7CisJY2hhciAqcGlkX3NsYXNoX3Byb2duYW1lOworCWNoYXIgcHJvY19waWRfZm5hbWVbc2l6ZW9mKCIvcHJvYy8ldS9jbWRsaW5lIikgKyBzaXplb2YobG9uZykqM107CisJY2hhciBjbWRsaW5lX2J1Zls1MTJdOworCWludCBuLCBsZW47CisKKwlpZiAoZGVwdGggPT0gMCkgLyogIi9wcm9jIiBpdHNlbGYgKi8KKwkJcmV0dXJuIFRSVUU7IC8qIGNvbnRpbnVlIGxvb2tpbmcgb25lIGxldmVsIGJlbG93IC9wcm9jICovCisKKwlwaWQgPSBmaWxlTmFtZSArIHNpemVvZigiL3Byb2MvIiktMTsgLyogcG9pbnQgYWZ0ZXIgIi9wcm9jLyIgKi8KKwlpZiAoIWlzZGlnaXQocGlkWzBdKSkgLyogc2tpcCAvcHJvYyBlbnRyaWVzIHdoaWNoIGFyZW4ndCBwcm9jZXNzZXMgKi8KKwkJcmV0dXJuIFNLSVA7CisKKwlsZW4gPSBzbnByaW50Zihwcm9jX3BpZF9mbmFtZSwgc2l6ZW9mKHByb2NfcGlkX2ZuYW1lKSwgIiVzL2NtZGxpbmUiLCBmaWxlTmFtZSk7CisJbiA9IG9wZW5fcmVhZF9jbG9zZShwcm9jX3BpZF9mbmFtZSwgY21kbGluZV9idWYsIHNpemVvZihjbWRsaW5lX2J1ZikgLSAxKTsKKwlpZiAobiA8IDApCisJCXJldHVybiBGQUxTRTsKKwljbWRsaW5lX2J1ZltuXSA9ICdcMCc7CisKKwkvKiBnbyB0aHJvdWdoIGFsbCBmaWxlcyBpbiAvcHJvYy9QSUQvZmQgYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc29ja2V0cyAqLworCXN0cmNweShwcm9jX3BpZF9mbmFtZSArIGxlbiAtIChzaXplb2YoImNtZGxpbmUiKS0xKSwgImZkIik7CisJcGlkX3NsYXNoX3Byb2duYW1lID0gY29uY2F0X3BhdGhfZmlsZShwaWQsIGJiX2Jhc2VuYW1lKGNtZGxpbmVfYnVmKSk7IC8qICJQSUQvYXJndjAiICovCisJbiA9IHJlY3Vyc2l2ZV9hY3Rpb24ocHJvY19waWRfZm5hbWUsCisJCQlBQ1RJT05fUkVDVVJTRSB8IEFDVElPTl9RVUlFVCwKKwkJCWFkZF90b19wcmdfY2FjaGVfaWZfc29ja2V0LAorCQkJTlVMTCwKKwkJCSh2b2lkICopcGlkX3NsYXNoX3Byb2duYW1lLAorCQkJMCk7CisJZnJlZShwaWRfc2xhc2hfcHJvZ25hbWUpOworCisJaWYgKCFuKQorCQlyZXR1cm4gRkFMU0U7IC8qIHNpZ25hbCBwZXJtaXNzaW9ucyBlcnJvciB0byBjYWxsZXIgKi8KKworCXJldHVybiBTS0lQOyAvKiBjYWxsZXIgc2hvdWxkIG5vdCByZWN1cnNlIGZ1cnRoZXIgaW50byB0aGlzIGRpciAqLworfQorCitzdGF0aWMgdm9pZCBwcmdfY2FjaGVfbG9hZCh2b2lkKQoreworCWludCBsb2FkX29rOworCisJcHJnX2NhY2hlX2xvYWRlZCA9IDE7CisJbG9hZF9vayA9IHJlY3Vyc2l2ZV9hY3Rpb24oIi9wcm9jIiwgQUNUSU9OX1JFQ1VSU0UgfCBBQ1RJT05fUVVJRVQsCisJCQkJTlVMTCwgZGlyX2FjdCwgTlVMTCwgMCk7CisJaWYgKGxvYWRfb2spCisJCXJldHVybjsKKworCWlmIChwcmdfY2FjaGVfbG9hZGVkID09IDEpCisJCWJiX2Vycm9yX21zZygiY2FuJ3Qgc2NhbiAvcHJvYyAtIGFyZSB5b3Ugcm9vdD8iKTsKKwllbHNlCisJCWJiX2Vycm9yX21zZygic2hvd2luZyBvbmx5IHByb2Nlc3NlcyB3aXRoIHlvdXIgdXNlciBJRCIpOworfQorCisjZWxzZQorCisjZGVmaW5lIHByZ19jYWNoZV9jbGVhcigpICAgICAgICgodm9pZCkwKQorCisjZW5kaWYgLy9FTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1BSRworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CitzdGF0aWMgdm9pZCBidWlsZF9pcHY2X2FkZHIoY2hhciogbG9jYWxfYWRkciwgc3RydWN0IHNvY2thZGRyX2luNiogbG9jYWxhZGRyKQoreworCWNoYXIgYWRkcjZbSU5FVDZfQUREUlNUUkxFTl07CisJc3RydWN0IGluNl9hZGRyIGluNjsKKworCXNzY2FuZihsb2NhbF9hZGRyLCAiJTA4WCUwOFglMDhYJTA4WCIsCisJCSAgICZpbjYuczZfYWRkcjMyWzBdLCAmaW42LnM2X2FkZHIzMlsxXSwKKwkJICAgJmluNi5zNl9hZGRyMzJbMl0sICZpbjYuczZfYWRkcjMyWzNdKTsKKwlpbmV0X250b3AoQUZfSU5FVDYsICZpbjYsIGFkZHI2LCBzaXplb2YoYWRkcjYpKTsKKwlpbmV0X3B0b24oQUZfSU5FVDYsIGFkZHI2LCAmbG9jYWxhZGRyLT5zaW42X2FkZHIpOworCisJbG9jYWxhZGRyLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJ1aWxkX2lwdjRfYWRkcihjaGFyKiBsb2NhbF9hZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIGxvY2FsYWRkcikKK3sKKwlzc2NhbmYobG9jYWxfYWRkciwgIiVYIiwgJmxvY2FsYWRkci0+c2luX2FkZHIuc19hZGRyKTsKKwlsb2NhbGFkZHItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3NuYW1lKGludCBwb3J0LCBjb25zdCBjaGFyICpwcm90bywgaW50IG51bWVyaWMpCit7CisJaWYgKCFwb3J0KQorCQlyZXR1cm4gIioiOworCWlmICghbnVtZXJpYykgeworCQlzdHJ1Y3Qgc2VydmVudCAqc2UgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvKTsKKwkJaWYgKHNlKQorCQkJcmV0dXJuIHNlLT5zX25hbWU7CisJfQorCS8qIGh1bW1tLCB3ZSBtYXkgcmV0dXJuIHN0YXRpYyBidWZmZXIgaGVyZSEhICovCisJcmV0dXJuIGl0b2EobnRvaHMocG9ydCkpOworfQorCitzdGF0aWMgY2hhciAqaXBfcG9ydF9zdHIoc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgcG9ydCwgY29uc3QgY2hhciAqcHJvdG8sIGludCBudW1lcmljKQoreworCWNoYXIgKmhvc3QsICpob3N0X3BvcnQ7CisKKwkvKiBDb2RlIHdoaWNoIHVzZWQgIioiIGZvciBJTkFERFJfQU5ZIGlzIHJlbW92ZWQ6IGl0J3MgYW1iaWd1b3VzCisJICogaW4gSVB2Niwgd2hpbGUgIjAuMC4wLjAiIGlzIG5vdC4gKi8KKworCWhvc3QgPSBudW1lcmljID8geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KGFkZHIpCisJICAgICAgICAgICAgICAgOiB4bWFsbG9jX3NvY2thZGRyMmhvc3Rfbm9wb3J0KGFkZHIpOworCisJaG9zdF9wb3J0ID0geGFzcHJpbnRmKCIlczolcyIsIGhvc3QsIGdldF9zbmFtZShodG9ucyhwb3J0KSwgcHJvdG8sIG51bWVyaWMpKTsKKwlmcmVlKGhvc3QpOworCXJldHVybiBob3N0X3BvcnQ7Cit9CisKK3N0cnVjdCBpbmV0X3BhcmFtcyB7CisJaW50IGxvY2FsX3BvcnQsIHJlbV9wb3J0LCBzdGF0ZSwgdWlkOworCXVuaW9uIHsKKwkJc3RydWN0IHNvY2thZGRyICAgICBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luICBzaW47CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7CisjZW5kaWYKKwl9IGxvY2FsYWRkciwgcmVtYWRkcjsKKwl1bnNpZ25lZCBsb25nIHJ4cSwgdHhxLCBpbm9kZTsKK307CisKK3N0YXRpYyBpbnQgc2Nhbl9pbmV0X3Byb2NfbGluZShzdHJ1Y3QgaW5ldF9wYXJhbXMgKnBhcmFtLCBjaGFyICpsaW5lKQoreworCWludCBudW07CisJLyogSVB2NiAvcHJvYyBmaWxlcyB1c2UgMzItY2hhciBoZXggcmVwcmVzZW50YXRpb24KKwkgKiBvZiBJUHY2IGFkZHJlc3MsIGZvbGxvd2VkIGJ5IDpQT1JUX0lOX0hFWAorCSAqLworCWNoYXIgbG9jYWxfYWRkclszM10sIHJlbV9hZGRyWzMzXTsgLyogMzIgKyAxIGZvciBOVUwgKi8KKworCW51bSA9IHNzY2FuZihsaW5lLAorCQkJIiUqZDogJTMyWzAtOUEtRmEtZl06JVggIgorCQkJIiUzMlswLTlBLUZhLWZdOiVYICVYICIKKwkJCSIlbFg6JWxYICUqWDolKlggIgorCQkJIiUqWCAlZCAlKmQgJWxkICIsCisJCQlsb2NhbF9hZGRyLCAmcGFyYW0tPmxvY2FsX3BvcnQsCisJCQlyZW1fYWRkciwgJnBhcmFtLT5yZW1fcG9ydCwgJnBhcmFtLT5zdGF0ZSwKKwkJCSZwYXJhbS0+dHhxLCAmcGFyYW0tPnJ4cSwKKwkJCSZwYXJhbS0+dWlkLCAmcGFyYW0tPmlub2RlKTsKKwlpZiAobnVtIDwgOSkgeworCQlyZXR1cm4gMTsgLyogZXJyb3IgKi8KKwl9CisKKwlpZiAoc3RybGVuKGxvY2FsX2FkZHIpID4gOCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJYnVpbGRfaXB2Nl9hZGRyKGxvY2FsX2FkZHIsICZwYXJhbS0+bG9jYWxhZGRyLnNpbjYpOworCQlidWlsZF9pcHY2X2FkZHIocmVtX2FkZHIsICZwYXJhbS0+cmVtYWRkci5zaW42KTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWJ1aWxkX2lwdjRfYWRkcihsb2NhbF9hZGRyLCAmcGFyYW0tPmxvY2FsYWRkci5zaW4pOworCQlidWlsZF9pcHY0X2FkZHIocmVtX2FkZHIsICZwYXJhbS0+cmVtYWRkci5zaW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaW5ldF9saW5lKHN0cnVjdCBpbmV0X3BhcmFtcyAqcGFyYW0sCisJCWNvbnN0IGNoYXIgKnN0YXRlX3N0ciwgY29uc3QgY2hhciAqcHJvdG8sIGludCBpc19jb25uZWN0ZWQpCit7CisJaWYgKChpc19jb25uZWN0ZWQgJiYgKGZsYWdzICYgTkVUU1RBVF9DT05ORUNURUQpKQorCSB8fCAoIWlzX2Nvbm5lY3RlZCAmJiAoZmxhZ3MgJiBORVRTVEFUX0xJU1RFTklORykpCisJKSB7CisJCWNoYXIgKmwgPSBpcF9wb3J0X3N0cigKKwkJCQkmcGFyYW0tPmxvY2FsYWRkci5zYSwgcGFyYW0tPmxvY2FsX3BvcnQsCisJCQkJcHJvdG8sIGZsYWdzICYgTkVUU1RBVF9OVU1FUklDKTsKKwkJY2hhciAqciA9IGlwX3BvcnRfc3RyKAorCQkJCSZwYXJhbS0+cmVtYWRkci5zYSwgcGFyYW0tPnJlbV9wb3J0LAorCQkJCXByb3RvLCBmbGFncyAmIE5FVFNUQVRfTlVNRVJJQyk7CisJCXByaW50ZihGTVRfTkVUX0NPTk5fREFUQSwKKwkJCXByb3RvLCBwYXJhbS0+cnhxLCBwYXJhbS0+dHhxLAorCQkJSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoRy5hZGRyX3dpZHRoLCkgbCwKKwkJCUlGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKEcuYWRkcl93aWR0aCwpIHIsCisJCQlzdGF0ZV9zdHIpOworI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3ByZykKKwkJCXByaW50ZigiJS4iUFJPR05BTUVfV0lEVEhfU1RSInMiLCBwcmdfY2FjaGVfZ2V0KHBhcmFtLT5pbm9kZSkpOworI2VuZGlmCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCWZyZWUobCk7CisJCWZyZWUocik7CisJfQorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB0Y3BfZG9fb25lKGNoYXIgKmxpbmUpCit7CisJc3RydWN0IGluZXRfcGFyYW1zIHBhcmFtOworCisJbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHBhcmFtKSk7CisJaWYgKHNjYW5faW5ldF9wcm9jX2xpbmUoJnBhcmFtLCBsaW5lKSkKKwkJcmV0dXJuIDE7CisKKwlwcmludF9pbmV0X2xpbmUoJnBhcmFtLCB0Y3Bfc3RhdGVbcGFyYW0uc3RhdGVdLCAidGNwIiwgcGFyYW0ucmVtX3BvcnQpOworCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorIyBkZWZpbmUgTk9UX05VTExfQUREUihBKSAoIFwKKwkoIChBLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgXAorCSAgJiYgKEEuc2luNi5zaW42X2FkZHIuczZfYWRkcjMyWzBdIHwgQS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMV0gfCBcCisJICAgICAgQS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMl0gfCBBLnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlszXSkgIFwKKwkpIHx8ICggXAorCSAgKEEuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIFwKKwkgICYmIEEuc2luLnNpbl9hZGRyLnNfYWRkciAhPSAwIFwKKwkpIFwKKykKKyNlbHNlCisjIGRlZmluZSBOT1RfTlVMTF9BRERSKEEpIChBLnNpbi5zaW5fYWRkci5zX2FkZHIpCisjZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgdWRwX2RvX29uZShjaGFyICpsaW5lKQoreworCWludCBoYXZlX3JlbWFkZHI7CisJY29uc3QgY2hhciAqc3RhdGVfc3RyOworCXN0cnVjdCBpbmV0X3BhcmFtcyBwYXJhbTsKKworCW1lbXNldCgmcGFyYW0sIDAsIHNpemVvZihwYXJhbSkpOyAvKiBvdGhlcndpc2Ugd2UgZGlzcGxheSBnYXJiYWdlIElQdjYgc2NvcGVfaWRzICovCisJaWYgKHNjYW5faW5ldF9wcm9jX2xpbmUoJnBhcmFtLCBsaW5lKSkKKwkJcmV0dXJuIDE7CisKKwlzdGF0ZV9zdHIgPSAiVU5LTk9XTiI7CisJc3dpdGNoIChwYXJhbS5zdGF0ZSkgeworCWNhc2UgVENQX0VTVEFCTElTSEVEOgorCQlzdGF0ZV9zdHIgPSAiRVNUQUJMSVNIRUQiOworCQlicmVhazsKKwljYXNlIFRDUF9DTE9TRToKKwkJc3RhdGVfc3RyID0gIiI7CisJCWJyZWFrOworCX0KKworCWhhdmVfcmVtYWRkciA9IE5PVF9OVUxMX0FERFIocGFyYW0ucmVtYWRkcik7CisJcHJpbnRfaW5ldF9saW5lKCZwYXJhbSwgc3RhdGVfc3RyLCAidWRwIiwgaGF2ZV9yZW1hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcmF3X2RvX29uZShjaGFyICpsaW5lKQoreworCWludCBoYXZlX3JlbWFkZHI7CisJc3RydWN0IGluZXRfcGFyYW1zIHBhcmFtOworCisJaWYgKHNjYW5faW5ldF9wcm9jX2xpbmUoJnBhcmFtLCBsaW5lKSkKKwkJcmV0dXJuIDE7CisKKwloYXZlX3JlbWFkZHIgPSBOT1RfTlVMTF9BRERSKHBhcmFtLnJlbWFkZHIpOworCXByaW50X2luZXRfbGluZSgmcGFyYW0sIGl0b2EocGFyYW0uc3RhdGUpLCAicmF3IiwgaGF2ZV9yZW1hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgdW5peF9kb19vbmUoY2hhciAqbGluZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZmNudCwgcHJvdG8sIHVuaXhfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBpbm9kZTsKKwlpbnQgdHlwZSwgc3RhdGU7CisJaW50IG51bSwgcGF0aF9vZnM7CisJY29uc3QgY2hhciAqc3NfcHJvdG8sICpzc19zdGF0ZSwgKnNzX3R5cGU7CisJY2hhciBzc19mbGFnc1szMl07CisKKwkvKiAyLjYuMTUgbWF5IHJlcG9ydCBsaW5lcyBsaWtlICIuLi4gQC90bXAvZmFtLXVzZXItXkBeQF5AXkBeQF5AXkAuLi4iCisJICogT3RoZXIgdXNlcnMgcmVwb3J0IGxvbmcgbGluZXMgZmlsbGVkIGJ5IE5VTCBieXRlcy4KKwkgKiAodGhvc2UgXkAgYXJlIE5VTCBieXRlcyB0b28pLiBXZSBzZWUgdGhlbSBhcyBlbXB0eSBsaW5lcy4gKi8KKwlpZiAoIWxpbmVbMF0pCisJCXJldHVybiAwOworCisJcGF0aF9vZnMgPSAwOyAvKiBwYXJhbm9pYSAqLworCW51bSA9IHNzY2FuZihsaW5lLCAiJSpwOiAlbFggJWxYICVsWCAlWCAlWCAlbHUgJW4iLAorCQkJJnJlZmNudCwgJnByb3RvLCAmdW5peF9mbGFncywgJnR5cGUsICZzdGF0ZSwgJmlub2RlLCAmcGF0aF9vZnMpOworCWlmIChudW0gPCA2KSB7CisJCXJldHVybiAxOyAvKiBlcnJvciAqLworCX0KKwlpZiAoKGZsYWdzICYgKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkgIT0gKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkgeworCQlpZiAoKHN0YXRlID09IFNTX1VOQ09OTkVDVEVEKSAmJiAodW5peF9mbGFncyAmIFNPX0FDQ0VQVENPTikpIHsKKwkJCWlmICghKGZsYWdzICYgTkVUU1RBVF9MSVNURU5JTkcpKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJaWYgKCEoZmxhZ3MgJiBORVRTVEFUX0NPTk5FQ1RFRCkpCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJCWNhc2UgMDoKKwkJCXNzX3Byb3RvID0gInVuaXgiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzc19wcm90byA9ICI/PyI7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgU09DS19TVFJFQU06CisJCQlzc190eXBlID0gIlNUUkVBTSI7CisJCQlicmVhazsKKwkJY2FzZSBTT0NLX0RHUkFNOgorCQkJc3NfdHlwZSA9ICJER1JBTSI7CisJCQlicmVhazsKKwkJY2FzZSBTT0NLX1JBVzoKKwkJCXNzX3R5cGUgPSAiUkFXIjsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfUkRNOgorCQkJc3NfdHlwZSA9ICJSRE0iOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCQlzc190eXBlID0gIlNFUVBBQ0tFVCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNzX3R5cGUgPSAiVU5LTk9XTiI7CisJfQorCisJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNTX0ZSRUU6CisJCQlzc19zdGF0ZSA9ICJGUkVFIjsKKwkJCWJyZWFrOworCQljYXNlIFNTX1VOQ09OTkVDVEVEOgorCQkJLyoKKwkJCSAqIFVuY29ubmVjdGVkIHNvY2tldHMgbWF5IGJlIGxpc3RlbmluZworCQkJICogZm9yIHNvbWV0aGluZy4KKwkJCSAqLworCQkJaWYgKHVuaXhfZmxhZ3MgJiBTT19BQ0NFUFRDT04pIHsKKwkJCQlzc19zdGF0ZSA9ICJMSVNURU5JTkciOworCQkJfSBlbHNlIHsKKwkJCQlzc19zdGF0ZSA9ICIiOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1NfQ09OTkVDVElORzoKKwkJCXNzX3N0YXRlID0gIkNPTk5FQ1RJTkciOworCQkJYnJlYWs7CisJCWNhc2UgU1NfQ09OTkVDVEVEOgorCQkJc3Nfc3RhdGUgPSAiQ09OTkVDVEVEIjsKKwkJCWJyZWFrOworCQljYXNlIFNTX0RJU0NPTk5FQ1RJTkc6CisJCQlzc19zdGF0ZSA9ICJESVNDT05ORUNUSU5HIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3Nfc3RhdGUgPSAiVU5LTk9XTiI7CisJfQorCisJc3RyY3B5KHNzX2ZsYWdzLCAiWyAiKTsKKwlpZiAodW5peF9mbGFncyAmIFNPX0FDQ0VQVENPTikKKwkJc3RyY2F0KHNzX2ZsYWdzLCAiQUNDICIpOworCWlmICh1bml4X2ZsYWdzICYgU09fV0FJVERBVEEpCisJCXN0cmNhdChzc19mbGFncywgIlcgIik7CisJaWYgKHVuaXhfZmxhZ3MgJiBTT19OT1NQQUNFKQorCQlzdHJjYXQoc3NfZmxhZ3MsICJOICIpOworCXN0cmNhdChzc19mbGFncywgIl0iKTsKKworCXByaW50ZigiJS01cyAlLTZsZCAlLTExcyAlLTEwcyAlLTEzcyAlNmx1ICIsCisJCXNzX3Byb3RvLCByZWZjbnQsIHNzX2ZsYWdzLCBzc190eXBlLCBzc19zdGF0ZSwgaW5vZGUKKwkJKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcHJnKQorCQlwcmludGYoIiUtIlBST0dOQU1FX1dJRFRIX1NUUiJzIiwgcHJnX2NhY2hlX2dldChpbm9kZSkpOworI2VuZGlmCisKKwkvKiBUT0RPOiBjdXJyZW50bHkgd2Ugc3RvcCBhdCBmaXJzdCBOVUwgYnl0ZS4gSXMgaXQgYSBwcm9ibGVtPyAqLworCWxpbmUgKz0gcGF0aF9vZnM7CisJKnN0cmNocm51bChsaW5lLCAnXG4nKSA9ICdcMCc7CisJd2hpbGUgKCpsaW5lKQorCQlmcHV0Y19wcmludGFibGUoKmxpbmUrKywgc3Rkb3V0KTsKKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb19pbmZvKGNvbnN0IGNoYXIgKmZpbGUsIGludCBGQVNUX0ZVTkMgKCpwcm9jKShjaGFyICopKQoreworCWludCBsbnI7CisJRklMRSAqcHJvY2luZm87CisJY2hhciAqYnVmZmVyOworCisJLyogX3N0ZGluIGlzIGp1c3QgdG8gc2F2ZSAiciIgcGFyYW0gKi8KKwlwcm9jaW5mbyA9IGZvcGVuX29yX3dhcm5fc3RkaW4oZmlsZSk7CisJaWYgKHByb2NpbmZvID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlsbnIgPSAwOworCS8qIFdoeSB4bWFsbG9jX2ZnZXRzX3N0cj8gYmVjYXVzZSBpdCBkb2Vzbid0IHN0b3Agb24gTlVMcyAqLworCXdoaWxlICgoYnVmZmVyID0geG1hbGxvY19mZ2V0c19zdHIocHJvY2luZm8sICJcbiIpKSAhPSBOVUxMKSB7CisJCS8qIGxpbmUgMCBpcyBza2lwcGVkICovCisJCWlmIChsbnIgJiYgcHJvYyhidWZmZXIpKQorCQkJYmJfZXJyb3JfbXNnKCIlczogYm9ndXMgZGF0YSBvbiBsaW5lICVkIiwgZmlsZSwgbG5yICsgMSk7CisJCWxucisrOworCQlmcmVlKGJ1ZmZlcik7CisJfQorCWZjbG9zZShwcm9jaW5mbyk7Cit9CisKK2ludCBuZXRzdGF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuZXRzdGF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisKKwlJTklUX0coKTsKKworCS8qIE9wdGlvbiBzdHJpbmcgbXVzdCBtYXRjaCBORVRTVEFUX3h4eCBjb25zdGFudHMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBORVRTVEFUX09QVFMpOworCWlmIChvcHQgJiBPUFRfc29ja19saXN0ZW4pIHsgLy8gLWwKKwkJZmxhZ3MgJj0gfk5FVFNUQVRfQ09OTkVDVEVEOworCQlmbGFncyB8PSBORVRTVEFUX0xJU1RFTklORzsKKwl9CisJaWYgKG9wdCAmIE9QVF9zb2NrX2FsbCkgZmxhZ3MgfD0gTkVUU1RBVF9MSVNURU5JTkcgfCBORVRTVEFUX0NPTk5FQ1RFRDsgLy8gLWEKKwkvL2lmIChvcHQgJiBPUFRfZXh0ZW5kZWQpIC8vIC1lCisJaWYgKG9wdCAmIE9QVF9ub3Jlc29sdmUpIGZsYWdzIHw9IE5FVFNUQVRfTlVNRVJJQzsgLy8gLW4KKwkvL2lmIChvcHQgJiBPUFRfc29ja190Y3ApIC8vIC10OiBORVRTVEFUX1RDUAorCS8vaWYgKG9wdCAmIE9QVF9zb2NrX3VkcCkgLy8gLXU6IE5FVFNUQVRfVURQCisJLy9pZiAob3B0ICYgT1BUX3NvY2tfcmF3KSAvLyAtdzogTkVUU1RBVF9SQVcKKwkvL2lmIChvcHQgJiBPUFRfc29ja191bml4KSAvLyAteDogTkVUU1RBVF9VTklYCisjaWYgRU5BQkxFX1JPVVRFCisJaWYgKG9wdCAmIE9QVF9yb3V0ZSkgeyAvLyAtcgorCQliYl9kaXNwbGF5cm91dGVzKGZsYWdzICYgTkVUU1RBVF9OVU1FUklDLCAhKG9wdCAmIE9QVF9leHRlbmRlZCkpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1dJREUKKwlHLmFkZHJfd2lkdGggPSBBRERSX05PUk1BTF9XSURUSDsKKwlpZiAob3B0ICYgT1BUX3dpZGUpIHsgLy8gLVcKKwkJRy5hZGRyX3dpZHRoID0gQUREUl9XSURFOworCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisJcHJvZ25hbWVfYmFubmVyID0gIiI7CisJaWYgKG9wdCAmIE9QVF9wcmcpIHsgLy8gLXAKKwkJcHJvZ25hbWVfYmFubmVyID0gUFJPR05BTUVfQkFOTkVSOworCQlwcmdfY2FjaGVfbG9hZCgpOworCX0KKyNlbmRpZgorCisJb3B0ICY9IE5FVFNUQVRfQUxMUFJPVE87CisJaWYgKG9wdCkgeworCQlmbGFncyAmPSB+TkVUU1RBVF9BTExQUk9UTzsKKwkJZmxhZ3MgfD0gb3B0OworCX0KKwlpZiAoZmxhZ3MgJiAoTkVUU1RBVF9UQ1B8TkVUU1RBVF9VRFB8TkVUU1RBVF9SQVcpKSB7CisJCXByaW50ZigiQWN0aXZlIEludGVybmV0IGNvbm5lY3Rpb25zICIpOyAvKiB4eHggKi8KKworCQlpZiAoKGZsYWdzICYgKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkgPT0gKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkKKwkJCXByaW50ZigiKHNlcnZlcnMgYW5kIGVzdGFibGlzaGVkKSIpOworCQllbHNlIGlmIChmbGFncyAmIE5FVFNUQVRfTElTVEVOSU5HKQorCQkJcHJpbnRmKCIob25seSBzZXJ2ZXJzKSIpOworCQllbHNlCisJCQlwcmludGYoIih3L28gc2VydmVycykiKTsKKwkJcHJpbnRmKEZNVF9ORVRfQ09OTl9IRUFERVIsCisJCQkJSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoRy5hZGRyX3dpZHRoLCkgIkxvY2FsIEFkZHJlc3MiLAorCQkJCUlGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKEcuYWRkcl93aWR0aCwpICJGb3JlaWduIEFkZHJlc3MiLAorCQkJCXByb2duYW1lX2Jhbm5lcgorCQkpOworCX0KKwlpZiAoZmxhZ3MgJiBORVRTVEFUX1RDUCkgeworCQlkb19pbmZvKCIvcHJvYy9uZXQvdGNwIiwgdGNwX2RvX29uZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlkb19pbmZvKCIvcHJvYy9uZXQvdGNwNiIsIHRjcF9kb19vbmUpOworI2VuZGlmCisJfQorCWlmIChmbGFncyAmIE5FVFNUQVRfVURQKSB7CisJCWRvX2luZm8oIi9wcm9jL25ldC91ZHAiLCB1ZHBfZG9fb25lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCWRvX2luZm8oIi9wcm9jL25ldC91ZHA2IiwgdWRwX2RvX29uZSk7CisjZW5kaWYKKwl9CisJaWYgKGZsYWdzICYgTkVUU1RBVF9SQVcpIHsKKwkJZG9faW5mbygiL3Byb2MvbmV0L3JhdyIsIHJhd19kb19vbmUpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJZG9faW5mbygiL3Byb2MvbmV0L3JhdzYiLCByYXdfZG9fb25lKTsKKyNlbmRpZgorCX0KKwlpZiAoZmxhZ3MgJiBORVRTVEFUX1VOSVgpIHsKKwkJcHJpbnRmKCJBY3RpdmUgVU5JWCBkb21haW4gc29ja2V0cyAiKTsKKwkJaWYgKChmbGFncyAmIChORVRTVEFUX0xJU1RFTklOR3xORVRTVEFUX0NPTk5FQ1RFRCkpID09IChORVRTVEFUX0xJU1RFTklOR3xORVRTVEFUX0NPTk5FQ1RFRCkpCisJCQlwcmludGYoIihzZXJ2ZXJzIGFuZCBlc3RhYmxpc2hlZCkiKTsKKwkJZWxzZSBpZiAoZmxhZ3MgJiBORVRTVEFUX0xJU1RFTklORykKKwkJCXByaW50ZigiKG9ubHkgc2VydmVycykiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIody9vIHNlcnZlcnMpIik7CisJCXByaW50ZigiXG5Qcm90byBSZWZDbnQgRmxhZ3MgICAgICAgVHlwZSAgICAgICBTdGF0ZSAgICAgICAgIEktTm9kZSAlc1BhdGhcbiIsIHByb2duYW1lX2Jhbm5lcik7CisJCWRvX2luZm8oIi9wcm9jL25ldC91bml4IiwgdW5peF9kb19vbmUpOworCX0KKwlwcmdfY2FjaGVfY2xlYXIoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbnNsb29rdXAuYyBiL25ldHdvcmtpbmcvbnNsb29rdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZkNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9uc2xvb2t1cC5jCkBAIC0wLDAgKzEsMTg5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG5zbG9va3VwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgYnkgTGluZW8sIGluYy4gYW5kIEpvaG4gQmVwcHUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgSm9obiBCZXBwdSA8YmVwcHVAY29kZXBvZXQub3JnPgorICoKKyAqIENvcnJlY3QgZGVmYXVsdCBuYW1lIHNlcnZlciBkaXNwbGF5IGFuZCBleHBsaWNpdCBuYW1lIHNlcnZlciBvcHRpb24KKyAqIGFkZGVkIGJ5IEJlbiBaZWNrZWwgPGJ6ZWNrZWxAaG1jLmVkdT4gSnVuZSAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbnNsb29rdXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltIT1NUXSBbU0VSVkVSXSIKKy8vdXNhZ2U6I2RlZmluZSBuc2xvb2t1cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlF1ZXJ5IHRoZSBuYW1lc2VydmVyIGZvciB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gSE9TVFxuIgorLy91c2FnZTogICAgICAgIm9wdGlvbmFsbHkgdXNpbmcgYSBzcGVjaWZpZWQgRE5TIHNlcnZlciIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbnNsb29rdXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbnNsb29rdXAgbG9jYWxob3N0XG4iCisvL3VzYWdlOiAgICAgICAiU2VydmVyOiAgICAgZGVmYXVsdFxuIgorLy91c2FnZTogICAgICAgIkFkZHJlc3M6ICAgIGRlZmF1bHRcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJOYW1lOiAgICAgICBkZWJpYW5cbiIKKy8vdXNhZ2U6ICAgICAgICJBZGRyZXNzOiAgICAxMjcuMC4wLjFcbiIKKworI2luY2x1ZGUgPHJlc29sdi5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qCisgKiBJJ20gb25seSBpbXBsZW1lbnRpbmcgbm9uLWludGVyYWN0aXZlIG1vZGU7CisgKiBJIHRvdGFsbHkgZm9yZ290IG5zbG9va3VwIGV2ZW4gaGFkIGFuIGludGVyYWN0aXZlIG1vZGUuCisgKgorICogVGhpcyBhcHBsZXQgaXMgdGhlIG9ubHkgdXNlciBvZiByZXNfaW5pdCgpLiBXaXRob3V0IGl0LAorICogeW91IG1heSBhdm9pZCBwdWxsaW5nIGluIF9yZXMgZ2xvYmFsIGZyb20gbGliYy4KKyAqLworCisvKiBFeGFtcGxlcyBvZiAnc3RhbmRhcmQnIG5zbG9va3VwIG91dHB1dAorICogJCBuc2xvb2t1cCB5YWhvby5jb20KKyAqIFNlcnZlcjogICAgICAgICAxMjguMTkzLjAuMTAKKyAqIEFkZHJlc3M6ICAgICAgICAxMjguMTkzLjAuMTAjNTMKKyAqCisgKiBOb24tYXV0aG9yaXRhdGl2ZSBhbnN3ZXI6CisgKiBOYW1lOiAgIHlhaG9vLmNvbQorICogQWRkcmVzczogMjE2LjEwOS4xMTIuMTM1CisgKiBOYW1lOiAgIHlhaG9vLmNvbQorICogQWRkcmVzczogNjYuOTQuMjM0LjEzCisgKgorICogJCBuc2xvb2t1cCAyMDQuMTUyLjE5MS4zNworICogU2VydmVyOiAgICAgICAgIDEyOC4xOTMuNC4yMAorICogQWRkcmVzczogICAgICAgIDEyOC4xOTMuNC4yMCM1MworICoKKyAqIE5vbi1hdXRob3JpdGF0aXZlIGFuc3dlcjoKKyAqIDM3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYSAgICAgY2Fub25pY2FsIG5hbWUgPSAzNy4zMi0yNy4xOTEuMTUyLjIwNC5pbi1hZGRyLmFycGEuCisgKiAzNy4zMi0yNy4xOTEuMTUyLjIwNC5pbi1hZGRyLmFycGEgICAgICAgbmFtZSA9IHpldXMtcHViMi5rZXJuZWwub3JnLgorICoKKyAqIEF1dGhvcml0YXRpdmUgYW5zd2VycyBjYW4gYmUgZm91bmQgZnJvbToKKyAqIDMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYSAgbmFtZXNlcnZlciA9IG5zMS5rZXJuZWwub3JnLgorICogMzItMjcuMTkxLjE1Mi4yMDQuaW4tYWRkci5hcnBhICBuYW1lc2VydmVyID0gbnMyLmtlcm5lbC5vcmcuCisgKiAzMi0yNy4xOTEuMTUyLjIwNC5pbi1hZGRyLmFycGEgIG5hbWVzZXJ2ZXIgPSBuczMua2VybmVsLm9yZy4KKyAqIG5zMS5rZXJuZWwub3JnICBpbnRlcm5ldCBhZGRyZXNzID0gMTQwLjIxMS4xNjcuMzQKKyAqIG5zMi5rZXJuZWwub3JnICBpbnRlcm5ldCBhZGRyZXNzID0gMjA0LjE1Mi4xOTEuNAorICogbnMzLmtlcm5lbC5vcmcgIGludGVybmV0IGFkZHJlc3MgPSAyMDQuMTUyLjE5MS4zNgorICovCisKK3N0YXRpYyBpbnQgcHJpbnRfaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqaGVhZGVyKQoreworCS8qIFdlIGNhbid0IHVzZSB4aG9zdDJzb2NrYWRkcigpIC0gd2Ugd2FudCB0byBnZXQgQUxMIGFkZHJlc3NlcywKKwkgKiBub3QganVzdCBvbmUgKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKnJlc3VsdCA9IE5VTEw7CisJaW50IHJjOworCXN0cnVjdCBhZGRyaW5mbyBoaW50OworCisJbWVtc2V0KCZoaW50LCAwICwgc2l6ZW9mKGhpbnQpKTsKKwkvKiBoaW50LmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgLSB6ZXJvIGFueXdheSAqLworCS8qIE5lZWRlZC4gT3IgZWxzZSB3ZSB3aWxsIGdldCBlYWNoIGFkZHJlc3MgdGhyaWNlIChvciBtb3JlKQorCSAqIGZvciBlYWNoIHBvc3NpYmxlIHNvY2tldCB0eXBlICh0Y3AsdWRwLHJhdy4uLik6ICovCisJaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCS8vIGhpbnQuYWlfZmxhZ3MgPSBBSV9DQU5PTk5BTUU7CisJcmMgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCAvKnNlcnZpY2UqLywgJmhpbnQsICZyZXN1bHQpOworCisJaWYgKHJjID09IDApIHsKKwkJc3RydWN0IGFkZHJpbmZvICpjdXIgPSByZXN1bHQ7CisJCXVuc2lnbmVkIGNudCA9IDA7CisKKwkJcHJpbnRmKCIlLTEwcyAlc1xuIiwgaGVhZGVyLCBob3N0bmFtZSk7CisJCS8vIHB1dHMoY3VyLT5haV9jYW5vbm5hbWUpOyA/CisJCXdoaWxlIChjdXIpIHsKKwkJCWNoYXIgKmRvdHRlZCwgKnJldmhvc3Q7CisJCQlkb3R0ZWQgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoY3VyLT5haV9hZGRyKTsKKwkJCXJldmhvc3QgPSB4bWFsbG9jX3NvY2thZGRyMmhvc3Rvbmx5X25vcG9ydChjdXItPmFpX2FkZHIpOworCisJCQlwcmludGYoIkFkZHJlc3MgJXU6ICVzJWMiLCArK2NudCwgZG90dGVkLCByZXZob3N0ID8gJyAnIDogJ1xuJyk7CisJCQlpZiAocmV2aG9zdCkgeworCQkJCXB1dHMocmV2aG9zdCk7CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQlmcmVlKHJldmhvc3QpOworCQkJfQorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWZyZWUoZG90dGVkKTsKKwkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKKwkJfQorCX0gZWxzZSB7CisjaWYgRU5BQkxFX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCByZXNvbHZlICclcyc6ICVzIiwgaG9zdG5hbWUsIGdhaV9zdHJlcnJvcihyYykpOworI2Vsc2UKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCByZXNvbHZlICclcyciLCBob3N0bmFtZSk7CisjZW5kaWYKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIHJlc3VsdCkKKwkJZnJlZWFkZHJpbmZvKHJlc3VsdCk7CisJcmV0dXJuIChyYyAhPSAwKTsKK30KKworLyogbG9va3VwIHRoZSBkZWZhdWx0IG5hbWVzZXJ2ZXIgYW5kIGRpc3BsYXkgaXQgKi8KK3N0YXRpYyB2b2lkIHNlcnZlcl9wcmludCh2b2lkKQoreworCWNoYXIgKnNlcnZlcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCXNhID0gKHN0cnVjdCBzb2NrYWRkciopX3Jlcy5fdS5fZXh0Lm5zYWRkcnNbMF07CisJaWYgKCFzYSkKKyNlbmRpZgorCQlzYSA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZfcmVzLm5zYWRkcl9saXN0WzBdOworCXNlcnZlciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChzYSk7CisKKwlwcmludF9ob3N0KHNlcnZlciwgIlNlcnZlcjoiKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoc2VydmVyKTsKKwliYl9wdXRjaGFyKCdcbicpOworfQorCisvKiBhbHRlciB0aGUgZ2xvYmFsIF9yZXMgbmFtZXNlcnZlciBzdHJ1Y3R1cmUgdG8gdXNlCisgICBhbiBleHBsaWNpdCBkbnMgc2VydmVyIGluc3RlYWQgb2Ygd2hhdCBpcyBpbiAvZXRjL3Jlc29sdi5jb25mICovCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9kbnMoY29uc3QgY2hhciAqc2VydmVyKQoreworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCS8qIE5COiB0aGlzIHdvcmtzIGV2ZW4gd2l0aCwgc2F5LCAiWzo6MV06NTM1MyIhIDopICovCisJbHNhID0geGhvc3Qyc29ja2FkZHIoc2VydmVyLCA1Myk7CisKKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCV9yZXMubnNjb3VudCA9IDE7CisJCS8qIHN0cnVjdCBjb3B5ICovCisJCV9yZXMubnNhZGRyX2xpc3RbMF0gPSBsc2EtPnUuc2luOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJLyogSG9wZWQgbGliYyBjYW4gY29wZSB3aXRoIElQdjQgYWRkcmVzcyB0aGVyZSB0b28uCisJICogTm8gc3VjaCBsdWNrLCBnbGliYyAyLjQgc2VnZmF1bHRzIGV2ZW4gd2l0aCBJUHY2LAorCSAqIG1heWJlIEkgbWlzdW5kZXJzdGFuZCBob3cgdG8gbWFrZSBnbGliYyB1c2UgSVB2NiBhZGRyPworCSAqICh1Y2xpYmMgMC45LjMxKyBzaG91bGQgd29yaykgKi8KKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkvLyBnbGliYyBuZWl0aGVyIFNFR1ZzIG5vciBzZW5kcyBhbnkgZGdyYW1zIHdpdGggdGhpcworCQkvLyAoc3RyYWNlIHNob3dzIG5vIHNvY2tldCBvcHMpOgorCQkvL19yZXMubnNjb3VudCA9IDA7CisJCV9yZXMuX3UuX2V4dC5uc2NvdW50ID0gMTsKKwkJLyogc3RvcmUgYSBwb2ludGVyIHRvIHBhcnQgb2YgbWFsbG9jJ2VkIGxzYSAqLworCQlfcmVzLl91Ll9leHQubnNhZGRyc1swXSA9ICZsc2EtPnUuc2luNjsKKwkJLyogbXVzdCBub3QgZnJlZShsc2EpISAqLworCX0KKyNlbmRpZgorfQorCitpbnQgbnNsb29rdXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5zbG9va3VwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCS8qIFdlIGFsbG93IDEgb3IgMiBhcmd1bWVudHMuCisJICogVGhlIGZpcnN0IGlzIHRoZSBuYW1lIHRvIGJlIGxvb2tlZCB1cCBhbmQgdGhlIHNlY29uZCBpcyBhbgorCSAqIG9wdGlvbmFsIEROUyBzZXJ2ZXIgd2l0aCB3aGljaCB0byBkbyB0aGUgbG9va3VwLgorCSAqIE1vcmUgdGhhbiAzIGFyZ3VtZW50cyBpcyBhbiBlcnJvciB0byBmb2xsb3cgdGhlIHBhdHRlcm4gb2YgdGhlCisJICogc3RhbmRhcmQgbnNsb29rdXAgKi8KKwlpZiAoIWFyZ3ZbMV0gfHwgYXJndlsxXVswXSA9PSAnLScgfHwgYXJnYyA+IDMpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIGluaXRpYWxpemUgRE5TIHN0cnVjdHVyZSBfcmVzIHVzZWQgaW4gcHJpbnRpbmcgdGhlIGRlZmF1bHQKKwkgKiBuYW1lIHNlcnZlciBhbmQgaW4gdGhlIGV4cGxpY2l0IG5hbWUgc2VydmVyIG9wdGlvbiBmZWF0dXJlLiAqLworCXJlc19pbml0KCk7CisJLyogcmZjMjEzMyBzYXlzIHRoaXMgZW5hYmxlcyBJUHY2IGxvb2t1cHMgKi8KKwkvKiAoYnV0IGl0IGFsc28gc2F5cyAibWF5IGJlIGVuYWJsZWQgaW4gL2V0Yy9yZXNvbHYuY29uZiIpICovCisJLypfcmVzLm9wdGlvbnMgfD0gUkVTX1VTRV9JTkVUNjsqLworCisJaWYgKGFyZ3ZbMl0pCisJCXNldF9kZWZhdWx0X2Rucyhhcmd2WzJdKTsKKworCXNlcnZlcl9wcmludCgpOworCXJldHVybiBwcmludF9ob3N0KGFyZ3ZbMV0sICJOYW1lOiIpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9udHBkLmMgYi9uZXR3b3JraW5nL250cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDZhZjAwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9udHBkLmMKQEAgLTAsMCArMSwyMjkyIEBACisvKgorICogTlRQIGNsaWVudC9zZXJ2ZXIsIGJhc2VkIG9uIE9wZW5OVFBEIDMuOXAxCisgKgorICogQXV0aG9yOiBBZGFtIFRrYWMgPHZvbnNjaEBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBQYXJ0cyBvZiBPcGVuTlRQRCBjbG9jayBzeW5jcm9uaXphdGlvbiBjb2RlIGlzIHJlcGxhY2VkIGJ5CisgKiBjb2RlIHdoaWNoIGlzIGJhc2VkIG9uIG50cC00LjIuNiwgd2h1Y2ggY2FycmllcyB0aGUgZm9sbG93aW5nCisgKiBjb3B5cmlnaHQgbm90aWNlOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKGMpIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUgMTk5Mi0yMDA5ICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgICAqCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgICAgICoKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgICAgKgorICogY29waWVzIGFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiAgICAgICAqCisgKiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgICAgICAgICoKKyAqIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5ICAgICAgKgorICogcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsICAgICAgICAqCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoZSBVbml2ZXJzaXR5IG9mIERlbGF3YXJlIG1ha2VzIG5vICAgICAgICoKKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55ICAgICAgICAgKgorICogcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCAgICAgICAgICAqCisgKiB3YXJyYW50eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLy91c2FnZTojZGVmaW5lIG50cGRfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstZG5xTnciSUZfRkVBVFVSRV9OVFBEX1NFUlZFUigibCIpIl0gWy1TIFBST0ddIFstcCBQRUVSXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBudHBkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTlRQIGNsaWVudC9zZXJ2ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG8gbm90IGRhZW1vbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJUXVpdCBhZnRlciBjbG9jayBpcyBzZXQiCisvL3VzYWdlOiAgICAgIlxuCS1OCVJ1biBhdCBoaWdoIHByaW9yaXR5IgorLy91c2FnZTogICAgICJcbgktdwlEbyBub3Qgc2V0IHRpbWUgKG9ubHkgcXVlcnkgcGVlcnMpLCBpbXBsaWVzIC1uIgorLy91c2FnZToJSUZfRkVBVFVSRV9OVFBEX1NFUlZFUigKKy8vdXNhZ2U6ICAgICAiXG4JLWwJUnVuIGFzIHNlcnZlciBvbiBwb3J0IDEyMyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLVMgUFJPRwlSdW4gUFJPRyBhZnRlciBzdGVwcGluZyB0aW1lLCBzdHJhdHVtIGNoYW5nZSwgYW5kIGV2ZXJ5IDExIG1pbnMiCisvL3VzYWdlOiAgICAgIlxuCS1wIFBFRVIJT2J0YWluIHRpbWUgZnJvbSBQRUVSIChtYXkgYmUgcmVwZWF0ZWQpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPiAvKiBGb3IgSVBUT1NfTE9XREVMQVkgZGVmaW5pdGlvbiAqLworI2luY2x1ZGUgPHN5cy90aW1leC5oPgorI2lmbmRlZiBJUFRPU19MT1dERUxBWQorIyBkZWZpbmUgSVBUT1NfTE9XREVMQVkgMHgxMAorI2VuZGlmCisjaWZuZGVmIElQX1BLVElORk8KKyMgZXJyb3IgIlNvcnJ5LCB5b3VyIGtlcm5lbCBoYXMgdG8gc3VwcG9ydCBJUF9QS1RJTkZPIgorI2VuZGlmCisKKworLyogVmVyYm9zaXR5IGNvbnRyb2wgKG1heCBsZXZlbCBvZiAtZGRkZCBvcHRpb25zIGFjY2VwdGVkKS4KKyAqIG1heCA1IGlzIHZlcnkgdGFsa2F0aXZlIChhbmQgYmxvYXRlZCkuIDIgaXMgbm9uLWJsb2F0ZWQsCisgKiBwcm9kdWN0aW9uIGxldmVsIHNldHRpbmcuCisgKi8KKyNkZWZpbmUgTUFYX1ZFUkJPU0UgICAgIDIKKworCisvKiBIaWdoLWxldmVsIGRlc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG06CisgKgorICogV2Ugc3RhcnQgcnVubmluZyB3aXRoIHZlcnkgc21hbGwgcG9sbF9leHAsIEJVUlNUUE9MTCwKKyAqIGluIG9yZGVyIHRvIHF1aWNrbHkgYWNjdW11bGF0ZSBJTklUSUFMX1NBTVBMRVMgZGF0YXBvaW50cworICogZm9yIGVhY2ggcGVlci4gVGhlbiwgdGltZSBpcyBzdGVwcGVkIGlmIHRoZSBvZmZzZXQgaXMgbGFyZ2VyCisgKiB0aGFuIFNURVBfVEhSRVNIT0xELCBvdGhlcndpc2UgaXQgaXNuJ3Q7IGFueXdheSwgd2UgZW5sYXJnZQorICogcG9sbF9leHAgdG8gTUlOUE9MTCBhbmQgZW50ZXIgZnJlcXVlbmN5IG1lYXN1cmVtZW50IHN0ZXA6CisgKiB3ZSBjb2xsZWN0IG5ldyBkYXRhcG9pbnRzIGJ1dCBpZ25vcmUgdGhlbSBmb3IgV0FUQ0hfVEhSRVNIT0xECisgKiBzZWNvbmRzLiBBZnRlciBXQVRDSF9USFJFU0hPTEQgc2Vjb25kcyB3ZSBsb29rIGF0IGFjY3VtdWxhdGVkCisgKiBvZmZzZXQgYW5kIGVzdGltYXRlIGZyZXF1ZW5jeSBkcmlmdC4KKyAqCisgKiAoZnJlcXVlbmN5IG1lYXN1cmVtZW50IHN0ZXAgc2VlbXMgdG8gbm90IGJlIHN0cmljdGx5IG5lZWRlZCwKKyAqIGl0IGlzIGNvbmRpdGlvbmFsbHkgZGlzYWJsZWQgd2l0aCBVU0lOR19JTklUSUFMX0ZSRVFfRVNUSU1BVElPTgorICogZGVmaW5lIHNldCB0byAwKQorICoKKyAqIEFmdGVyIHRoaXMsIHdlIGVudGVyICJzdGVhZHkgc3RhdGUiOiB3ZSBjb2xsZWN0IGEgZGF0YXBvaW50LAorICogd2Ugc2VsZWN0IHRoZSBiZXN0IHBlZXIsIGlmIHRoaXMgZGF0YXBvaW50IGlzIG5vdCBhIG5ldyBvbmUKKyAqIChJT1c6IGlmIHRoaXMgZGF0YXBvaW50IGlzbid0IGZvciBzZWxlY3RlZCBwZWVyKSwgc2xlZXAKKyAqIGFuZCBjb2xsZWN0IGFub3RoZXIgb25lOyBvdGhlcndpc2UsIHVzZSBpdHMgb2Zmc2V0IHRvIHVwZGF0ZQorICogZnJlcXVlbmN5IGRyaWZ0LCBpZiBvZmZzZXQgaXMgc29tZXdoYXQgbGFyZ2UsIHJlZHVjZSBwb2xsX2V4cCwKKyAqIG90aGVyd2lzZSBpbmNyZWFzZSBwb2xsX2V4cC4KKyAqCisgKiBJZiBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gU1RFUF9USFJFU0hPTEQsIHdoaWNoIHNob3VsZG4ndCBub3JtYWxseQorICogaGFwcGVuLCB3ZSBhc3N1bWUgdGhhdCBzb21ldGhpbmcgImJhZCIgaGFwcGVuZWQgKGNvbXB1dGVyCisgKiB3YXMgaGliZXJuYXRlZCwgc29tZW9uZSBzZXQgdG90YWxseSB3cm9uZyBkYXRlLCBldGMpLAorICogdGhlbiB0aGUgdGltZSBpcyBzdGVwcGVkLCBhbGwgZGF0YXBvaW50cyBhcmUgZGlzY2FyZGVkLAorICogYW5kIHdlIGdvIGJhY2sgdG8gc3RlYWR5IHN0YXRlLgorICovCisKKyNkZWZpbmUgUkVUUllfSU5URVJWQUwgIDUgICAgICAgLyogb24gZXJyb3IsIHJldHJ5IGluIE4gc2VjcyAqLworI2RlZmluZSBSRVNQT05TRV9JTlRFUlZBTCAxNSAgICAvKiB3YWl0IGZvciByZXBseSB1cCB0byBOIHNlY3MgKi8KKyNkZWZpbmUgSU5JVElBTF9TQU1QTEVTIDQgICAgICAgLyogaG93IG1hbnkgc2FtcGxlcyBkbyB3ZSB3YW50IGZvciBpbml0ICovCisKKy8qIENsb2NrIGRpc2NpcGxpbmUgcGFyYW1ldGVycyBhbmQgY29uc3RhbnRzICovCisKKy8qIFN0ZXAgdGhyZXNob2xkIChzZWMpLiBzdGQgbnRwZCB1c2VzIDAuMTI4LgorICogVXNpbmcgZXhhY3QgcG93ZXIgb2YgMiAoMS84KSByZXN1bHRzIGluIHNtYWxsZXIgY29kZSAqLworI2RlZmluZSBTVEVQX1RIUkVTSE9MRCAgMC4xMjUKKyNkZWZpbmUgV0FUQ0hfVEhSRVNIT0xEIDEyOCAgICAgLyogc3RlcG91dCB0aHJlc2hvbGQgKHNlYykuIHN0ZCBudHBkIHVzZXMgOTAwICgxMSBtaW5zICghKSkgKi8KKy8qIE5COiBzZXQgV0FUQ0hfVEhSRVNIT0xEIHRvIH42MCB3aGVuIGRlYnVnZ2luZyB0byBzYXZlIHRpbWUpICovCisvL1VOVVNFRDogI2RlZmluZSBQQU5JQ19USFJFU0hPTEQgMTAwMCAgICAvKiBwYW5pYyB0aHJlc2hvbGQgKHNlYykgKi8KKworI2RlZmluZSBGUkVRX1RPTEVSQU5DRSAgMC4wMDAwMTUgLyogZnJlcXVlbmN5IHRvbGVyYW5jZSAoMTUgUFBNKSAqLworI2RlZmluZSBCVVJTVFBPTEwgICAgICAgMCAgICAgICAvKiBpbml0aWFsIHBvbGwgKi8KKyNkZWZpbmUgTUlOUE9MTCAgICAgICAgIDUgICAgICAgLyogbWluaW11bSBwb2xsIGludGVydmFsLiBzdGQgbnRwZCB1c2VzIDYgKDY6IDY0IHNlYykgKi8KKyNkZWZpbmUgQklHUE9MTCAgICAgICAgIDEwICAgICAgLyogZHJvcCB0byBsb3dlciBwb2xsIGF0IGFueSB0cm91YmxlICgxMDogMTcgbWluKSAqLworI2RlZmluZSBNQVhQT0xMICAgICAgICAgMTIgICAgICAvKiBtYXhpbXVtIHBvbGwgaW50ZXJ2YWwgKDEyOiAxLjFoLCAxNzogMzYuNGgpLiBzdGQgbnRwZCB1c2VzIDE3ICovCisvKiBBY3RpdmVseSBsb3dlciBwb2xsIHdoZW4gd2Ugc2VlIHN1Y2ggYmlnIG9mZnNldHMuCisgKiBXaXRoIFNURVBfVEhSRVNIT0xEID0gMC4xMjUsIGl0IG1lYW5zIHdlIHRyeSB0byBzeW5jIG1vcmUgYWdncmVzc2l2ZWx5CisgKiBpZiBvZmZzZXQgaW5jcmVhc2VzIG92ZXIgMC4wMyBzZWMgKi8KKyNkZWZpbmUgUE9MTERPV05fT0ZGU0VUIChTVEVQX1RIUkVTSE9MRCAvIDQpCisjZGVmaW5lIE1JTkRJU1AgICAgICAgICAwLjAxICAgIC8qIG1pbmltdW0gZGlzcGVyc2lvbiAoc2VjKSAqLworI2RlZmluZSBNQVhESVNQICAgICAgICAgMTYgICAgICAvKiBtYXhpbXVtIGRpc3BlcnNpb24gKHNlYykgKi8KKyNkZWZpbmUgTUFYU1RSQVQgICAgICAgIDE2ICAgICAgLyogbWF4aW11bSBzdHJhdHVtIChpbmZpbml0eSBtZXRyaWMpICovCisjZGVmaW5lIE1BWERJU1QgICAgICAgICAxICAgICAgIC8qIGRpc3RhbmNlIHRocmVzaG9sZCAoc2VjKSAqLworI2RlZmluZSBNSU5fU0VMRUNURUQgICAgMSAgICAgICAvKiBtaW5pbXVtIGludGVyc2VjdGlvbiBzdXJ2aXZvcnMgKi8KKyNkZWZpbmUgTUlOX0NMVVNURVJFRCAgIDMgICAgICAgLyogbWluaW11bSBjbHVzdGVyIHN1cnZpdm9ycyAqLworCisjZGVmaW5lIE1BWERSSUZUICAgICAgICAwLjAwMDUwMCAvKiBmcmVxdWVuY3kgZHJpZnQgd2UgY2FuIGNvcnJlY3QgKDUwMCBQUE0pICovCisKKy8qIFBvbGwtYWRqdXN0IHRocmVzaG9sZC4KKyAqIFdoZW4gd2Ugc2VlIHRoYXQgb2Zmc2V0IGlzIHNtYWxsIGVub3VnaCBjb21wYXJlZCB0byBkaXNjaXBsaW5lIGppdHRlciwKKyAqIHdlIGdyb3cgYSBjb3VudGVyOiArPSBNSU5QT0xMLiBXaGVuIGl0IGdvZXMgb3ZlciBQT0xMQURKX0xJTUlULAorICogd2UgcG9sbF9leHArKy4gSWYgb2Zmc2V0IGlzbid0IHNtYWxsLCBjb3VudGVyIC09IHBvbGxfZXhwKjIsCisgKiBhbmQgd2hlbiBpdCBnb2VzIGJlbG93IC1QT0xMQURKX0xJTUlULCB3ZSBwb2xsX2V4cC0tCisgKiAoYnVtcGVkIGZyb20gMzAgdG8gMzYgc2luY2Ugb3RoZXJ3aXNlIEkgb2Z0ZW4gc2VlIHBvbGxfZXhwIGdvaW5nICoyKiBzdGVwcyBkb3duKQorICovCisjZGVmaW5lIFBPTExBREpfTElNSVQgICAzNgorLyogSWYgb2Zmc2V0IDwgUE9MTEFESl9HQVRFICogZGlzY2lwbGluZV9qaXR0ZXIsIHRoZW4gd2UgY2FuIGluY3JlYXNlCisgKiBwb2xsIGludGVydmFsICh3ZSB0aGluayB3ZSBjYW4ndCBpbXByb3ZlIHRpbWVrZWVwaW5nCisgKiBieSBzdGF5aW5nIGF0IHNtYWxsZXIgcG9sbCkuCisgKi8KKyNkZWZpbmUgUE9MTEFESl9HQVRFICAgIDQKKy8qIENvbXByb21pc2UgQWxsYW4gaW50ZXJjZXB0IChzZWMpLiBkb2MgdXNlcyAxNTAwLCBzdGQgbnRwZCB1c2VzIDUxMiAqLworI2RlZmluZSBBTExBTiAgICAgICAgICAgNTEyCisvKiBQTEwgbG9vcCBnYWluICovCisjZGVmaW5lIFBMTCAgICAgICAgICAgICA2NTUzNgorLyogRkxMIGxvb3AgZ2FpbiBbd2h5IGl0IGRlcGVuZHMgb24gTUFYUE9MTD8/XSAqLworI2RlZmluZSBGTEwgICAgICAgICAgICAgKE1BWFBPTEwgKyAxKQorLyogUGFyYW1ldGVyIGF2ZXJhZ2luZyBjb25zdGFudCAqLworI2RlZmluZSBBVkcgICAgICAgICAgICAgNAorCisKK2VudW0geworCU5UUF9WRVJTSU9OICAgICA9IDQsCisJTlRQX01BWFNUUkFUVU0gID0gMTUsCisKKwlOVFBfRElHRVNUU0laRSAgICAgPSAxNiwKKwlOVFBfTVNHU0laRV9OT0FVVEggPSA0OCwKKwlOVFBfTVNHU0laRSAgICAgICAgPSAoTlRQX01TR1NJWkVfTk9BVVRIICsgNCArIE5UUF9ESUdFU1RTSVpFKSwKKworCS8qIFN0YXR1cyBNYXNrcyAqLworCU1PREVfTUFTSyAgICAgICA9ICg3IDw8IDApLAorCVZFUlNJT05fTUFTSyAgICA9ICg3IDw8IDMpLAorCVZFUlNJT05fU0hJRlQgICA9IDMsCisJTElfTUFTSyAgICAgICAgID0gKDMgPDwgNiksCisKKwkvKiBMZWFwIFNlY29uZCBDb2RlcyAoaGlnaCBvcmRlciB0d28gYml0cyBvZiBtX3N0YXR1cykgKi8KKwlMSV9OT1dBUk5JTkcgICAgPSAoMCA8PCA2KSwgICAgLyogbm8gd2FybmluZyAqLworCUxJX1BMVVNTRUMgICAgICA9ICgxIDw8IDYpLCAgICAvKiBhZGQgYSBzZWNvbmQgKDYxIHNlY29uZHMpICovCisJTElfTUlOVVNTRUMgICAgID0gKDIgPDwgNiksICAgIC8qIG1pbnVzIGEgc2Vjb25kICg1OSBzZWNvbmRzKSAqLworCUxJX0FMQVJNICAgICAgICA9ICgzIDw8IDYpLCAgICAvKiBhbGFybSBjb25kaXRpb24gKi8KKworCS8qIE1vZGUgdmFsdWVzICovCisJTU9ERV9SRVMwICAgICAgID0gMCwgICAgLyogcmVzZXJ2ZWQgKi8KKwlNT0RFX1NZTV9BQ1QgICAgPSAxLCAgICAvKiBzeW1tZXRyaWMgYWN0aXZlICovCisJTU9ERV9TWU1fUEFTICAgID0gMiwgICAgLyogc3ltbWV0cmljIHBhc3NpdmUgKi8KKwlNT0RFX0NMSUVOVCAgICAgPSAzLCAgICAvKiBjbGllbnQgKi8KKwlNT0RFX1NFUlZFUiAgICAgPSA0LCAgICAvKiBzZXJ2ZXIgKi8KKwlNT0RFX0JST0FEQ0FTVCAgPSA1LCAgICAvKiBicm9hZGNhc3QgKi8KKwlNT0RFX1JFUzEgICAgICAgPSA2LCAgICAvKiByZXNlcnZlZCBmb3IgTlRQIGNvbnRyb2wgbWVzc2FnZSAqLworCU1PREVfUkVTMiAgICAgICA9IDcsICAgIC8qIHJlc2VydmVkIGZvciBwcml2YXRlIHVzZSAqLworfTsKKworLy9UT0RPOiBiZXR0ZXIgYmFzZSBzZWxlY3Rpb24KKyNkZWZpbmUgT0ZGU0VUXzE5MDBfMTk3MCAyMjA4OTg4ODAwVUwgIC8qIDE5NzAgLSAxOTAwIGluIHNlY29uZHMgKi8KKworI2RlZmluZSBOVU1fREFUQVBPSU5UUyAgOAorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgaW50X3BhcnRsOworCXVpbnQzMl90IGZyYWN0aW9ubDsKK30gbF9maXhlZHB0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBpbnRfcGFydHM7CisJdWludDE2X3QgZnJhY3Rpb25zOworfSBzX2ZpeGVkcHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgICAgIG1fc3RhdHVzOyAgICAgLyogc3RhdHVzIG9mIGxvY2FsIGNsb2NrIGFuZCBsZWFwIGluZm8gKi8KKwl1aW50OF90ICAgICBtX3N0cmF0dW07CisJdWludDhfdCAgICAgbV9wcG9sbDsgICAgICAvKiBwb2xsIHZhbHVlICovCisJaW50OF90ICAgICAgbV9wcmVjaXNpb25fZXhwOworCXNfZml4ZWRwdF90IG1fcm9vdGRlbGF5OworCXNfZml4ZWRwdF90IG1fcm9vdGRpc3A7CisJdWludDMyX3QgICAgbV9yZWZpZDsKKwlsX2ZpeGVkcHRfdCBtX3JlZnRpbWU7CisJbF9maXhlZHB0X3QgbV9vcmd0aW1lOworCWxfZml4ZWRwdF90IG1fcmVjdGltZTsKKwlsX2ZpeGVkcHRfdCBtX3htdHRpbWU7CisJdWludDMyX3QgICAgbV9rZXlpZDsKKwl1aW50OF90ICAgICBtX2RpZ2VzdFtOVFBfRElHRVNUU0laRV07Cit9IG1zZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJZG91YmxlIGRfcmVjdl90aW1lOworCWRvdWJsZSBkX29mZnNldDsKKwlkb3VibGUgZF9kaXNwZXJzaW9uOworfSBkYXRhcG9pbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWxlbl9hbmRfc29ja2FkZHIgKnBfbHNhOworCWNoYXIgICAgICAgICAgICAgKnBfZG90dGVkOworCS8qIHdoZW4gdG8gc2VuZCBuZXcgcXVlcnkgKGlmIHBfZmQgPT0gLTEpCisJICogb3Igd2hlbiByZWNlaXZlIHRpbWVzIG91dCAoaWYgcF9mZCA+PSAwKTogKi8KKwlpbnQgICAgICAgICAgICAgIHBfZmQ7CisJaW50ICAgICAgICAgICAgICBkYXRhcG9pbnRfaWR4OworCXVpbnQzMl90ICAgICAgICAgbGFzdHBrdF9yZWZpZDsKKwl1aW50OF90ICAgICAgICAgIGxhc3Rwa3Rfc3RhdHVzOworCXVpbnQ4X3QgICAgICAgICAgbGFzdHBrdF9zdHJhdHVtOworCXVpbnQ4X3QgICAgICAgICAgcmVhY2hhYmxlX2JpdHM7CisJZG91YmxlICAgICAgICAgICBuZXh0X2FjdGlvbl90aW1lOworCWRvdWJsZSAgICAgICAgICAgcF94bXR0aW1lOworCWRvdWJsZSAgICAgICAgICAgbGFzdHBrdF9yZWN2X3RpbWU7CisJZG91YmxlICAgICAgICAgICBsYXN0cGt0X2RlbGF5OworCWRvdWJsZSAgICAgICAgICAgbGFzdHBrdF9yb290ZGVsYXk7CisJZG91YmxlICAgICAgICAgICBsYXN0cGt0X3Jvb3RkaXNwOworCS8qIHByb2R1Y2VkIGJ5IGZpbHRlciBhbGdvcml0aG06ICovCisJZG91YmxlICAgICAgICAgICBmaWx0ZXJfb2Zmc2V0OworCWRvdWJsZSAgICAgICAgICAgZmlsdGVyX2Rpc3BlcnNpb247CisJZG91YmxlICAgICAgICAgICBmaWx0ZXJfaml0dGVyOworCWRhdGFwb2ludF90ICAgICAgZmlsdGVyX2RhdGFwb2ludFtOVU1fREFUQVBPSU5UU107CisJLyogbGFzdCBzZW50IHBhY2tldDogKi8KKwltc2dfdCAgICAgICAgICAgIHBfeG10X21zZzsKK30gcGVlcl90OworCisKKyNkZWZpbmUgVVNJTkdfS0VSTkVMX1BMTF9MT09QICAgICAgICAgIDEKKyNkZWZpbmUgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04gIDAKKworZW51bSB7CisJT1BUX24gPSAoMSA8PCAwKSwKKwlPUFRfcSA9ICgxIDw8IDEpLAorCU9QVF9OID0gKDEgPDwgMiksCisJT1BUX3ggPSAoMSA8PCAzKSwKKwkvKiBJbnNlcnQgbmV3IG9wdGlvbnMgYWJvdmUgdGhpcyBsaW5lLiAqLworCS8qIE5vbi1jb21wYXQgb3B0aW9uczogKi8KKwlPUFRfdyA9ICgxIDw8IDQpLAorCU9QVF9wID0gKDEgPDwgNSksCisJT1BUX1MgPSAoMSA8PCA2KSwKKwlPUFRfbCA9ICgxIDw8IDcpICogRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIsCisJLyogV2UgaGlqYWNrIHNvbWUgYml0cyBmb3Igb3RoZXIgcHVycG9zZXMgKi8KKwlPUFRfcXEgPSAoMSA8PCA4KSwKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlkb3VibGUgICBjdXJfdGltZTsKKwkvKiB0b3RhbCByb3VuZCB0cmlwIGRlbGF5IHRvIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2UgY2xvY2sgKi8KKwlkb3VibGUgICByb290ZGVsYXk7CisJLyogcmVmZXJlbmNlIHRpbWVzdGFtcDogdGltZSB3aGVuIHRoZSBzeXN0ZW0gY2xvY2sgd2FzIGxhc3Qgc2V0IG9yIGNvcnJlY3RlZCAqLworCWRvdWJsZSAgIHJlZnRpbWU7CisJLyogdG90YWwgZGlzcGVyc2lvbiB0byBjdXJyZW50bHkgc2VsZWN0ZWQgcmVmZXJlbmNlIGNsb2NrICovCisJZG91YmxlICAgcm9vdGRpc3A7CisKKwlkb3VibGUgICBsYXN0X3NjcmlwdF9ydW47CisJY2hhciAgICAgKnNjcmlwdF9uYW1lOworCWxsaXN0X3QgICpudHBfcGVlcnM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwlpbnQgICAgICBsaXN0ZW5fZmQ7CisjZW5kaWYKKwl1bnNpZ25lZCB2ZXJib3NlOworCXVuc2lnbmVkIHBlZXJfY250OworCS8qIHJlZmlkOiAzMi1iaXQgY29kZSBpZGVudGlmeWluZyB0aGUgcGFydGljdWxhciBzZXJ2ZXIgb3IgcmVmZXJlbmNlIGNsb2NrCisJICogIGluIHN0cmF0dW0gMCBwYWNrZXRzIHRoaXMgaXMgYSBmb3VyLWNoYXJhY3RlciBBU0NJSSBzdHJpbmcsCisJICogIGNhbGxlZCB0aGUga2lzcyBjb2RlLCB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcKKwkgKiAgaW4gc3RyYXR1bSAxIHBhY2tldHMgdGhpcyBpcyBhIGZvdXItY2hhcmFjdGVyIEFTQ0lJIHN0cmluZworCSAqICBhc3NpZ25lZCB0byB0aGUgcmVmZXJlbmNlIGNsb2NrIGJ5IElBTkEuIEV4YW1wbGU6ICJHUFMgIgorCSAqICBpbiBzdHJhdHVtIDIrIHBhY2tldHMsIGl0J3MgSVB2NCBhZGRyZXNzIG9yIDQgZmlyc3QgYnl0ZXMgb2YgTUQ1IGhhc2ggb2YgSVB2NgorCSAqLworCXVpbnQzMl90IHJlZmlkOworCXVpbnQ4X3QgIG50cF9zdGF0dXM7CisJLyogcHJlY2lzaW9uIGlzIGRlZmluZWQgYXMgdGhlIGxhcmdlciBvZiB0aGUgcmVzb2x1dGlvbiBhbmQgdGltZSB0bworCSAqIHJlYWQgdGhlIGNsb2NrLCBpbiBsb2cyIHVuaXRzLiAgRm9yIGluc3RhbmNlLCB0aGUgcHJlY2lzaW9uIG9mIGEKKwkgKiBtYWlucy1mcmVxdWVuY3kgY2xvY2sgaW5jcmVtZW50aW5nIGF0IDYwIEh6IGlzIDE2IG1zLCBldmVuIHdoZW4gdGhlCisJICogc3lzdGVtIGNsb2NrIGhhcmR3YXJlIHJlcHJlc2VudGF0aW9uIGlzIHRvIHRoZSBuYW5vc2Vjb25kLgorCSAqCisJICogRGVsYXlzLCBqaXR0ZXJzIG9mIHZhcmlvdXMga2luZHMgYXJlIGNsYW1wZXIgZG93biB0byBwcmVjaXNpb24uCisJICoKKwkgKiBJZiBwcmVjaXNpb25fc2VjIGlzIHRvbyBsYXJnZSwgZGlzY2lwbGluZV9qaXR0ZXIgZ2V0cyBjbGFtcGVkIHRvIGl0CisJICogYW5kIGlmIG9mZnNldCBpcyBtdWNoIHNtYWxsZXIgdGhhbiBkaXNjaXBsaW5lX2ppdHRlciwgcG9sbCBpbnRlcnZhbAorCSAqIGdyb3dzIGV2ZW4gdGhvdWdoIHdlIHJlYWxseSBjYW4gYmVuZWZpdCBmcm9tIHN0YXlpbmcgYXQgc21hbGxlciBvbmUsCisJICogY29sbGVjdGluZyBub24tbGFnZ2VkIGRhdGFwb2l0cyBhbmQgY29ycmVjdGluZyB0aGUgb2Zmc2V0LgorCSAqIChMYWdnZWQgZGF0YXBvaXRzIGV4aXN0IHdoZW4gcG9sbF9leHAgaXMgbGFyZ2UgYnV0IHdlIHN0aWxsIGhhdmUKKwkgKiBzeXN0ZW1hdGljIG9mZnNldCBlcnJvciAtIHRoZSB0aW1lIGRpc3RhbmNlIGJldHdlZW4gZGF0YXBvaW50cworCSAqIGlzIHNpZ25pZmljYXQgYW5kIG9sZGVyIGRhdGFwb2ludHMgaGF2ZSBzbWFsbGVyIG9mZnNldHMuCisJICogVGhpcyBtYWtlcyBvdXIgb2Zmc2V0IGVzdGltYXRpb24gYSBiaXQgc21hbGxlciB0aGFuIHJlYWxpdHkpCisJICogRHVlIHRvIHRoaXMgZWZmZWN0LCBzZXR0aW5nIEdfcHJlY2lzaW9uX3NlYyBjbG9zZSB0bworCSAqIFNURVBfVEhSRVNIT0xEIGlzbid0IHN1Y2ggYSBnb29kIGlkZWEgLSBvZmZzZXRzIG1heSBncm93CisJICogdG9vIGJpZyBhbmQgd2Ugd2lsbCBzdGVwLiBJIG9ic2VydmVkIGl0IHdpdGggLTYuCisJICoKKwkgKiBPVE9ILCBzZXR0aW5nIHByZWNpc2lvbiB0b28gc21hbGwgd291bGQgcmVzdWx0IGluIGZ1dGlsZSBhdHRlbXB0cworCSAqIHRvIHN5bmNyb25pemUgdG8gdGhlIHVuYWNoaWV2YWJsZSBwcmVjaXNpb24uCisJICoKKwkgKiAtNiBpcyAxLzY0IHNlYywgLTcgaXMgMS8xMjggc2VjIGFuZCBzbyBvbi4KKwkgKi8KKyNkZWZpbmUgR19wcmVjaXNpb25fZXhwICAtOAorI2RlZmluZSBHX3ByZWNpc2lvbl9zZWMgICgxLjAgLyAoMSA8PCAoLSBHX3ByZWNpc2lvbl9leHApKSkKKwl1aW50OF90ICBzdHJhdHVtOworCS8qIEJvb2wuIEFmdGVyIHNldCB0byAxLCBuZXZlciBnb2VzIGJhY2sgdG8gMDogKi8KKwlzbWFsbGludCBpbml0aWFsX3BvbGxfY29tcGxldGU7CisKKyNkZWZpbmUgU1RBVEVfTlNFVCAgICAgIDAgICAgICAgLyogaW5pdGlhbCBzdGF0ZSwgIm5vdGhpbmcgaXMgc2V0IiAqLworLy8jZGVmaW5lIFNUQVRFX0ZTRVQgICAgMSAgICAgICAvKiBmcmVxdWVuY3kgc2V0IGZyb20gZmlsZSAqLworI2RlZmluZSBTVEFURV9TUElLICAgICAgMiAgICAgICAvKiBzcGlrZSBkZXRlY3RlZCAqLworLy8jZGVmaW5lIFNUQVRFX0ZSRVEgICAgMyAgICAgICAvKiBpbml0aWFsIGZyZXF1ZW5jeSAqLworI2RlZmluZSBTVEFURV9TWU5DICAgICAgNCAgICAgICAvKiBjbG9jayBzeW5jaHJvbml6ZWQgKG5vcm1hbCBvcGVyYXRpb24pICovCisJdWludDhfdCAgZGlzY2lwbGluZV9zdGF0ZTsgICAgICAvLyBkb2MgY2FsbHMgaXQgYy5zdGF0ZQorCXVpbnQ4X3QgIHBvbGxfZXhwOyAgICAgICAgICAgICAgLy8gcy5wb2xsCisJaW50ICAgICAgcG9sbGFkal9jb3VudDsgICAgICAgICAvLyBjLmNvdW50CisJbG9uZyAgICAga2VybmVsX2ZyZXFfZHJpZnQ7CisJcGVlcl90ICAgKmxhc3RfdXBkYXRlX3BlZXI7CisJZG91YmxlICAgbGFzdF91cGRhdGVfb2Zmc2V0OyAgICAvLyBjLmxhc3QKKwlkb3VibGUgICBsYXN0X3VwZGF0ZV9yZWN2X3RpbWU7IC8vIHMudAorCWRvdWJsZSAgIGRpc2NpcGxpbmVfaml0dGVyOyAgICAgLy8gYy5qaXR0ZXIKKwkvL2RvdWJsZSAgIGNsdXN0ZXJfb2Zmc2V0OyAgICAgICAgLy8gcy5vZmZzZXQKKwkvL2RvdWJsZSAgIGNsdXN0ZXJfaml0dGVyOyAgICAgICAgLy8gcy5qaXR0ZXIKKyNpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJZG91YmxlICAgZGlzY2lwbGluZV9mcmVxX2RyaWZ0OyAvLyBjLmZyZXEKKwkvKiBNYXliZSBjb25kaXRpb25hbGx5IGNhbGN1bGF0ZSB3YW5kZXI/IGl0J3MgdXNlZCBvbmx5IGZvciBsb2dnaW5nICovCisJZG91YmxlICAgZGlzY2lwbGluZV93YW5kZXI7ICAgICAvLyBjLndhbmRlcgorI2VuZGlmCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisKK3N0YXRpYyBjb25zdCBpbnQgY29uc3RfSVBUT1NfTE9XREVMQVkgPSBJUFRPU19MT1dERUxBWTsKKworCisjZGVmaW5lIFZFUkIxIGlmIChNQVhfVkVSQk9TRSAmJiBHLnZlcmJvc2UpCisjZGVmaW5lIFZFUkIyIGlmIChNQVhfVkVSQk9TRSA+PSAyICYmIEcudmVyYm9zZSA+PSAyKQorI2RlZmluZSBWRVJCMyBpZiAoTUFYX1ZFUkJPU0UgPj0gMyAmJiBHLnZlcmJvc2UgPj0gMykKKyNkZWZpbmUgVkVSQjQgaWYgKE1BWF9WRVJCT1NFID49IDQgJiYgRy52ZXJib3NlID49IDQpCisjZGVmaW5lIFZFUkI1IGlmIChNQVhfVkVSQk9TRSA+PSA1ICYmIEcudmVyYm9zZSA+PSA1KQorCisKK3N0YXRpYyBkb3VibGUgTE9HMkQoaW50IGEpCit7CisJaWYgKGEgPCAwKQorCQlyZXR1cm4gMS4wIC8gKDFVTCA8PCAtYSk7CisJcmV0dXJuIDFVTCA8PCBhOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgZG91YmxlIFNRVUFSRShkb3VibGUgeCkKK3sKKwlyZXR1cm4geCAqIHg7Cit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBkb3VibGUgTUFYRChkb3VibGUgYSwgZG91YmxlIGIpCit7CisJaWYgKGEgPiBiKQorCQlyZXR1cm4gYTsKKwlyZXR1cm4gYjsKK30KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGRvdWJsZSBNSU5EKGRvdWJsZSBhLCBkb3VibGUgYikKK3sKKwlpZiAoYSA8IGIpCisJCXJldHVybiBhOworCXJldHVybiBiOworfQorc3RhdGljIE5PSU5MSU5FIGRvdWJsZSBteV9TUVJUKGRvdWJsZSBYKQoreworCXVuaW9uIHsKKwkJZmxvYXQgICBmOworCQlpbnQzMl90IGk7CisJfSB2OworCWRvdWJsZSBpbnZzcXJ0OworCWRvdWJsZSBYaGFsZiA9IFggKiAwLjU7CisKKwkvKiBGYXN0IGFuZCBnb29kIGFwcHJveGltYXRpb24gdG8gMS9zcXJ0KFgpLCBibGFjayBtYWdpYyAqLworCXYuZiA9IFg7CisJLyp2LmkgPSAweDVmMzc1OWRmIC0gKHYuaSA+PiAxKTsqLworCXYuaSA9IDB4NWYzNzVhODYgLSAodi5pID4+IDEpOyAvKiAtIHRoaXMgY29uc3RhbnQgaXMgc2xpZ2h0bHkgYmV0dGVyICovCisJaW52c3FydCA9IHYuZjsgLyogYmV0dGVyIHRoYW4gMC4yJSBhY2N1cmFjeSAqLworCisJLyogUmVmaW5pbmcgaXQgdXNpbmcgTmV3dG9uJ3MgbWV0aG9kOiB4MSA9IHgwIC0gZih4MCkvZicoeDApCisJICogZih4KSA9IDEvKHgqeCkgLSBYICAoZj09MCB3aGVuIHggPSAxL3NxcnQoWCkpCisJICogZicoeCkgPSAtMi8oeCp4KngpCisJICogZih4KS9mJyh4KSA9IChYIC0gMS8oeCp4KSkgLyAoMi8oeCp4KngpKSA9IFgqeCp4KngvMiAtIHgvMgorCSAqIHgxID0geDAgLSAoWCp4MCp4MCp4MC8yIC0geDAvMikgPSAxLjUqeDAgLSBYKngwKngwKngwLzIgPSB4MCooMS41IC0gKFgvMikqeDAqeDApCisJICovCisJaW52c3FydCA9IGludnNxcnQgKiAoMS41IC0gWGhhbGYgKiBpbnZzcXJ0ICogaW52c3FydCk7IC8qIH4wLjA1JSBhY2N1cmFjeSAqLworCS8qIGludnNxcnQgPSBpbnZzcXJ0ICogKDEuNSAtIFhoYWxmICogaW52c3FydCAqIGludnNxcnQpOyAybmQgaXRlcjogfjAuMDAwMSUgYWNjdXJhY3kgKi8KKwkvKiBXaXRoIDQgaXRlcmF0aW9ucywgbW9yZSB0aGFuIGhhbGYgcmVzdWx0cyB3aWxsIGJlIGV4YWN0LAorCSAqIGF0IDZ0aCBpdGVyYXRpb25zIHJlc3VsdCBzdGFiaWxpemVzIHdpdGggYWJvdXQgNzIlIHJlc3VsdHMgZXhhY3QuCisJICogV2UgYXJlIHdlbGwgc2F0aXNmaWVkIHdpdGggMC4wNSUgYWNjdXJhY3kuCisJICovCisKKwlyZXR1cm4gWCAqIGludnNxcnQ7IC8qIFggKiAxL3NxcnQoWCkgfj0gc3FydChYKSAqLworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgZG91YmxlIFNRUlQoZG91YmxlIFgpCit7CisJLyogSWYgdGhpcyBhcmNoIGRvZXNuJ3QgdXNlIElFRUUgNzU0IGZsb2F0cywgZmFsbCBiYWNrIHRvIHVzaW5nIGxpYm0gKi8KKwlpZiAoc2l6ZW9mKGZsb2F0KSAhPSA0KQorCQlyZXR1cm4gc3FydChYKTsKKworCS8qIFRoaXMgYXZvaWRzIG5lZWRpbmcgbGlibSwgc2F2ZXMgYWJvdXQgMC41ayBvbiB4ODYtMzIgKi8KKwlyZXR1cm4gbXlfU1FSVChYKTsKK30KKworc3RhdGljIGRvdWJsZQorZ2V0dGltZTE5MDBkKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7IC8qIG5ldmVyIGZhaWxzICovCisJRy5jdXJfdGltZSA9IHR2LnR2X3NlYyArICgxLjBlLTYgKiB0di50dl91c2VjKSArIE9GRlNFVF8xOTAwXzE5NzA7CisJcmV0dXJuIEcuY3VyX3RpbWU7Cit9CisKK3N0YXRpYyB2b2lkCitkX3RvX3R2KGRvdWJsZSBkLCBzdHJ1Y3QgdGltZXZhbCAqdHYpCit7CisJdHYtPnR2X3NlYyA9IChsb25nKWQ7CisJdHYtPnR2X3VzZWMgPSAoZCAtIHR2LT50dl9zZWMpICogMTAwMDAwMDsKK30KKworc3RhdGljIGRvdWJsZQorbGZwX3RvX2QobF9maXhlZHB0X3QgbGZwKQoreworCWRvdWJsZSByZXQ7CisJbGZwLmludF9wYXJ0bCA9IG50b2hsKGxmcC5pbnRfcGFydGwpOworCWxmcC5mcmFjdGlvbmwgPSBudG9obChsZnAuZnJhY3Rpb25sKTsKKwlyZXQgPSAoZG91YmxlKWxmcC5pbnRfcGFydGwgKyAoKGRvdWJsZSlsZnAuZnJhY3Rpb25sIC8gVUlOVF9NQVgpOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgZG91YmxlCitzZnBfdG9fZChzX2ZpeGVkcHRfdCBzZnApCit7CisJZG91YmxlIHJldDsKKwlzZnAuaW50X3BhcnRzID0gbnRvaHMoc2ZwLmludF9wYXJ0cyk7CisJc2ZwLmZyYWN0aW9ucyA9IG50b2hzKHNmcC5mcmFjdGlvbnMpOworCXJldCA9IChkb3VibGUpc2ZwLmludF9wYXJ0cyArICgoZG91YmxlKXNmcC5mcmFjdGlvbnMgLyBVU0hSVF9NQVgpOworCXJldHVybiByZXQ7Cit9CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKK3N0YXRpYyBsX2ZpeGVkcHRfdAorZF90b19sZnAoZG91YmxlIGQpCit7CisJbF9maXhlZHB0X3QgbGZwOworCWxmcC5pbnRfcGFydGwgPSAodWludDMyX3QpZDsKKwlsZnAuZnJhY3Rpb25sID0gKHVpbnQzMl90KSgoZCAtIGxmcC5pbnRfcGFydGwpICogVUlOVF9NQVgpOworCWxmcC5pbnRfcGFydGwgPSBodG9ubChsZnAuaW50X3BhcnRsKTsKKwlsZnAuZnJhY3Rpb25sID0gaHRvbmwobGZwLmZyYWN0aW9ubCk7CisJcmV0dXJuIGxmcDsKK30KK3N0YXRpYyBzX2ZpeGVkcHRfdAorZF90b19zZnAoZG91YmxlIGQpCit7CisJc19maXhlZHB0X3Qgc2ZwOworCXNmcC5pbnRfcGFydHMgPSAodWludDE2X3QpZDsKKwlzZnAuZnJhY3Rpb25zID0gKHVpbnQxNl90KSgoZCAtIHNmcC5pbnRfcGFydHMpICogVVNIUlRfTUFYKTsKKwlzZnAuaW50X3BhcnRzID0gaHRvbnMoc2ZwLmludF9wYXJ0cyk7CisJc2ZwLmZyYWN0aW9ucyA9IGh0b25zKHNmcC5mcmFjdGlvbnMpOworCXJldHVybiBzZnA7Cit9CisjZW5kaWYKKworc3RhdGljIGRvdWJsZQorZGlzcGVyc2lvbihjb25zdCBkYXRhcG9pbnRfdCAqZHApCit7CisJcmV0dXJuIGRwLT5kX2Rpc3BlcnNpb24gKyBGUkVRX1RPTEVSQU5DRSAqIChHLmN1cl90aW1lIC0gZHAtPmRfcmVjdl90aW1lKTsKK30KKworc3RhdGljIGRvdWJsZQorcm9vdF9kaXN0YW5jZShwZWVyX3QgKnApCit7CisJLyogVGhlIHJvb3Qgc3luY2hyb25pemF0aW9uIGRpc3RhbmNlIGlzIHRoZSBtYXhpbXVtIGVycm9yIGR1ZSB0bworCSAqIGFsbCBjYXVzZXMgb2YgdGhlIGxvY2FsIGNsb2NrIHJlbGF0aXZlIHRvIHRoZSBwcmltYXJ5IHNlcnZlci4KKwkgKiBJdCBpcyBkZWZpbmVkIGFzIGhhbGYgdGhlIHRvdGFsIGRlbGF5IHBsdXMgdG90YWwgZGlzcGVyc2lvbgorCSAqIHBsdXMgcGVlciBqaXR0ZXIuCisJICovCisJcmV0dXJuIE1BWEQoTUlORElTUCwgcC0+bGFzdHBrdF9yb290ZGVsYXkgKyBwLT5sYXN0cGt0X2RlbGF5KSAvIDIKKwkJKyBwLT5sYXN0cGt0X3Jvb3RkaXNwCisJCSsgcC0+ZmlsdGVyX2Rpc3BlcnNpb24KKwkJKyBGUkVRX1RPTEVSQU5DRSAqIChHLmN1cl90aW1lIC0gcC0+bGFzdHBrdF9yZWN2X3RpbWUpCisJCSsgcC0+ZmlsdGVyX2ppdHRlcjsKK30KKworc3RhdGljIHZvaWQKK3NldF9uZXh0KHBlZXJfdCAqcCwgdW5zaWduZWQgdCkKK3sKKwlwLT5uZXh0X2FjdGlvbl90aW1lID0gRy5jdXJfdGltZSArIHQ7Cit9CisKKy8qCisgKiBQZWVyIGNsb2NrIGZpbHRlciBhbmQgaXRzIGhlbHBlcnMKKyAqLworc3RhdGljIHZvaWQKK2ZpbHRlcl9kYXRhcG9pbnRzKHBlZXJfdCAqcCkKK3sKKwlpbnQgaSwgaWR4OworCWludCBnb3RfbmV3ZXN0OworCWRvdWJsZSBtaW5vZmYsIG1heG9mZiwgd2F2Zywgc3VtLCB3OworCWRvdWJsZSB4ID0geDsgLyogZm9yIGNvbXBpbGVyICovCisJZG91YmxlIG9sZGVzdF9vZmYgPSBvbGRlc3Rfb2ZmOworCWRvdWJsZSBvbGRlc3RfYWdlID0gb2xkZXN0X2FnZTsKKwlkb3VibGUgbmV3ZXN0X29mZiA9IG5ld2VzdF9vZmY7CisJZG91YmxlIG5ld2VzdF9hZ2UgPSBuZXdlc3RfYWdlOworCisJbWlub2ZmID0gbWF4b2ZmID0gcC0+ZmlsdGVyX2RhdGFwb2ludFswXS5kX29mZnNldDsKKwlmb3IgKGkgPSAxOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQlpZiAobWlub2ZmID4gcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldCkKKwkJCW1pbm9mZiA9IHAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQ7CisJCWlmIChtYXhvZmYgPCBwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0KQorCQkJbWF4b2ZmID0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldDsKKwl9CisKKwlpZHggPSBwLT5kYXRhcG9pbnRfaWR4OyAvKiBtb3N0IHJlY2VudCBkYXRhcG9pbnQgKi8KKwkvKiBBdmVyYWdlIG9mZnNldDoKKwkgKiBEcm9wIHR3byBvdXRsaWVycyBhbmQgdGFrZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSByZXN0OgorCSAqIG1vc3RfcmVjZW50LzIgKyBvbGRlcjEvNCArIG9sZGVyMi84IC4uLiArIG9sZGVyNS8zMiArIG9sZGVyNi8zMgorCSAqIHdlIHVzZSBvbGRlcjYvMzIsIG5vdCBvbGRlcjYvNjQgc2luY2Ugc3VtIG9mIHdlaWdodHMgc2hvdWxkIGJlIDE6CisJICogMS8yICsgMS80ICsgMS84ICsgMS8xNiArIDEvMzIgKyAxLzMyID0gMQorCSAqLworCXdhdmcgPSAwOworCXcgPSAwLjU7CisJLyogICAgICAgICAgICAgICAgICAgICBuLTEKKwkgKiAgICAgICAgICAgICAgICAgICAgIC0tLSAgICBkaXNwZXJzaW9uKGkpCisJICogZmlsdGVyX2Rpc3BlcnNpb24gPSAgXCAgICAgLS0tLS0tLS0tLS0tLQorCSAqICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgKGkrMSkKKwkgKiAgICAgICAgICAgICAgICAgICAgIC0tLSAgICAgMgorCSAqICAgICAgICAgICAgICAgICAgICAgaT0wCisJICovCisJZ290X25ld2VzdCA9IDA7CisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQlWRVJCNCB7CisJCQliYl9lcnJvcl9tc2coImRhdGFwb2ludFslZF06IG9mZjolZiBkaXNwOiVmKCVmKSBhZ2U6JWYlcyIsCisJCQkJaSwKKwkJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9vZmZzZXQsCisJCQkJcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdLmRfZGlzcGVyc2lvbiwgZGlzcGVyc2lvbigmcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdKSwKKwkJCQlHLmN1cl90aW1lIC0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdLmRfcmVjdl90aW1lLAorCQkJCShtaW5vZmYgPT0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdLmRfb2Zmc2V0IHx8IG1heG9mZiA9PSBwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9vZmZzZXQpCisJCQkJCT8gIiAob3V0bGllciBieSBvZmZzZXQpIiA6ICIiCisJCQkpOworCQl9CisKKwkJc3VtICs9IGRpc3BlcnNpb24oJnAtPmZpbHRlcl9kYXRhcG9pbnRbaWR4XSkgLyAoMiA8PCBpKTsKKworCQlpZiAobWlub2ZmID09IHAtPmZpbHRlcl9kYXRhcG9pbnRbaWR4XS5kX29mZnNldCkgeworCQkJbWlub2ZmIC09IDE7IC8qIHNvIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggaXQgZXZlciBhZ2FpbiAqLworCQl9IGVsc2UKKwkJaWYgKG1heG9mZiA9PSBwLT5maWx0ZXJfZGF0YXBvaW50W2lkeF0uZF9vZmZzZXQpIHsKKwkJCW1heG9mZiArPSAxOworCQl9IGVsc2UgeworCQkJb2xkZXN0X29mZiA9IHAtPmZpbHRlcl9kYXRhcG9pbnRbaWR4XS5kX29mZnNldDsKKwkJCW9sZGVzdF9hZ2UgPSBHLmN1cl90aW1lIC0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpZHhdLmRfcmVjdl90aW1lOworCQkJaWYgKCFnb3RfbmV3ZXN0KSB7CisJCQkJZ290X25ld2VzdCA9IDE7CisJCQkJbmV3ZXN0X29mZiA9IG9sZGVzdF9vZmY7CisJCQkJbmV3ZXN0X2FnZSA9IG9sZGVzdF9hZ2U7CisJCQl9CisJCQl4ID0gb2xkZXN0X29mZiAqIHc7CisJCQl3YXZnICs9IHg7CisJCQl3IC89IDI7CisJCX0KKworCQlpZHggPSAoaWR4IC0gMSkgJiAoTlVNX0RBVEFQT0lOVFMgLSAxKTsKKwl9CisJcC0+ZmlsdGVyX2Rpc3BlcnNpb24gPSBzdW07CisJd2F2ZyArPSB4OyAvKiBhZGQgYW5vdGhlciBvbGRlcjYvNjQgdG8gZm9ybSBvbGRlcjYvMzIgKi8KKwkvKiBGaXggc3lzdGVtYXRpYyB1bmRlcmVzdGltYXRpb24gd2l0aCBsYXJnZSBwb2xsIGludGVydmFscy4KKwkgKiBJbWFnaW5lIHRoYXQgd2Ugc3RpbGwgaGF2ZSBhIGJpdCBvZiB1bmNvcnJlY3RlZCBkcmlmdCwKKwkgKiBhbmQgcG9sbCBpbnRlcnZhbCBpcyBiaWcgKHNheSwgMTAwIHNlYykuIE9mZnNldHMgZm9ybSBhIHByb2dyZXNzaW9uOgorCSAqIDAuMCAwLjEgMC4yIDAuMyAwLjQgMC41IDAuNiAwLjcgLSAwLjcgaXMgbW9zdCByZWNlbnQuCisJICogVGhlIGFsZ29yaXRobSBhYm92ZSBkcm9wcyAwLjAgYW5kIDAuNyBhcyBvdXRsaWVycywKKwkgKiBhbmQgdGhlbiB3ZSBoYXZlIHRoaXMgZXN0aW1hdGlvbiwgfjI1JSBvZmYgZnJvbSAwLjc6CisJICogMC4xLzMyICsgMC4yLzMyICsgMC4zLzE2ICsgMC40LzggKyAwLjUvNCArIDAuNi8yID0gMC41MDMxMjUKKwkgKi8KKwl4ID0gb2xkZXN0X2FnZSAtIG5ld2VzdF9hZ2U7CisJaWYgKHggIT0gMCkgeworCQl4ID0gbmV3ZXN0X2FnZSAvIHg7IC8qIGluIGFib3ZlIGV4YW1wbGUsIDEwMCAvICg2MDAgLSAxMDApICovCisJCWlmICh4IDwgMSkgeyAvKiBwYXJhbm9pYSBjaGVjayAqLworCQkJeCA9IChuZXdlc3Rfb2ZmIC0gb2xkZXN0X29mZikgKiB4OyAvKiAwLjUgKiAxMDAvNTAwID0gMC4xICovCisJCQl3YXZnICs9IHg7CisJCX0KKwl9CisJcC0+ZmlsdGVyX29mZnNldCA9IHdhdmc7CisKKwkvKiAgICAgICAgICAgICAgICAgICstLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0rIF4gMS8yCisJICogICAgICAgICAgICAgICAgICB8ICAgICAgIG4tMSAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgfCAgICAgICAtLS0gICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgICAgIHwgIDEgICAgXCAgICAgICAgICAgICAgICAyICB8CisJICogZmlsdGVyX2ppdHRlciA9ICB8IC0tLSAqIC8gIChhdmctb2Zmc2V0X2opICAgfAorCSAqICAgICAgICAgICAgICAgICAgfCAgbiAgICAtLS0gICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgICAgIHwgICAgICAgaj0wICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICArLS0tLS0gICAgICAgICAgICAgICAgIC0tLS0tKworCSAqIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiB2YWxpZCBkYXRhcG9pbnRzIGluIHRoZSBmaWx0ZXIgKG4gPiAxKTsKKwkgKiBpZiBmaWx0ZXJfaml0dGVyIDwgcHJlY2lzaW9uIHRoZW4gZmlsdGVyX2ppdHRlciA9IHByZWNpc2lvbgorCSAqLworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9EQVRBUE9JTlRTOyBpKyspIHsKKwkJc3VtICs9IFNRVUFSRSh3YXZnIC0gcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldCk7CisJfQorCXN1bSA9IFNRUlQoc3VtIC8gTlVNX0RBVEFQT0lOVFMpOworCXAtPmZpbHRlcl9qaXR0ZXIgPSBzdW0gPiBHX3ByZWNpc2lvbl9zZWMgPyBzdW0gOiBHX3ByZWNpc2lvbl9zZWM7CisKKwlWRVJCMyBiYl9lcnJvcl9tc2coImZpbHRlciBvZmZzZXQ6JWYoY29ycjolZSkgZGlzcDolZiBqaXR0ZXI6JWYiLAorCQkJcC0+ZmlsdGVyX29mZnNldCwgeCwKKwkJCXAtPmZpbHRlcl9kaXNwZXJzaW9uLAorCQkJcC0+ZmlsdGVyX2ppdHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9wZWVyX3N0YXRzKHBlZXJfdCAqcCwgZG91YmxlIG9mZnNldCkKK3sKKwlpbnQgaTsKKwlib29sIHNtYWxsX29mcyA9IGZhYnMob2Zmc2V0KSA8IDE2ICogU1RFUF9USFJFU0hPTEQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQlpZiAoc21hbGxfb2ZzKSB7CisJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfcmVjdl90aW1lICs9IG9mZnNldDsKKwkJCWlmIChwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0ICE9IDApIHsKKwkJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0ICs9IG9mZnNldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9yZWN2X3RpbWUgID0gRy5jdXJfdGltZTsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQgICAgID0gMDsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9kaXNwZXJzaW9uID0gTUFYRElTUDsKKwkJfQorCX0KKwlpZiAoc21hbGxfb2ZzKSB7CisJCXAtPmxhc3Rwa3RfcmVjdl90aW1lICs9IG9mZnNldDsKKwl9IGVsc2UgeworCQlwLT5yZWFjaGFibGVfYml0cyA9IDA7CisJCXAtPmxhc3Rwa3RfcmVjdl90aW1lID0gRy5jdXJfdGltZTsKKwl9CisJZmlsdGVyX2RhdGFwb2ludHMocCk7IC8qIHJlY2FsYyBwLT5maWx0ZXJfeHh4ICovCisJVkVSQjUgYmJfZXJyb3JfbXNnKCIlcy0+bGFzdHBrdF9yZWN2X3RpbWU9JWYiLCBwLT5wX2RvdHRlZCwgcC0+bGFzdHBrdF9yZWN2X3RpbWUpOworfQorCitzdGF0aWMgdm9pZAorYWRkX3BlZXJzKGNoYXIgKnMpCit7CisJcGVlcl90ICpwOworCisJcCA9IHh6YWxsb2Moc2l6ZW9mKCpwKSk7CisJcC0+cF9sc2EgPSB4aG9zdDJzb2NrYWRkcihzLCAxMjMpOworCXAtPnBfZG90dGVkID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZwLT5wX2xzYS0+dS5zYSk7CisJcC0+cF9mZCA9IC0xOworCXAtPnBfeG10X21zZy5tX3N0YXR1cyA9IE1PREVfQ0xJRU5UIHwgKE5UUF9WRVJTSU9OIDw8IDMpOworCXAtPm5leHRfYWN0aW9uX3RpbWUgPSBHLmN1cl90aW1lOyAvKiA9IHNldF9uZXh0KHAsIDApOyAqLworCXJlc2V0X3BlZXJfc3RhdHMocCwgMTYgKiBTVEVQX1RIUkVTSE9MRCk7CisKKwlsbGlzdF9hZGRfdG8oJkcubnRwX3BlZXJzLCBwKTsKKwlHLnBlZXJfY250Kys7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3NlbmR0byhpbnQgZmQsCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bywgc29ja2xlbl90IGFkZHJsZW4sCisJCW1zZ190ICptc2csIHNzaXplX3QgbGVuKQoreworCXNzaXplX3QgcmV0OworCisJZXJybm8gPSAwOworCWlmICghZnJvbSkgeworCQlyZXQgPSBzZW5kdG8oZmQsIG1zZywgbGVuLCBNU0dfRE9OVFdBSVQsIHRvLCBhZGRybGVuKTsKKwl9IGVsc2UgeworCQlyZXQgPSBzZW5kX3RvX2Zyb20oZmQsIG1zZywgbGVuLCBNU0dfRE9OVFdBSVQsIHRvLCBmcm9tLCBhZGRybGVuKTsKKwl9CisJaWYgKHJldCAhPSBsZW4pIHsKKwkJYmJfcGVycm9yX21zZygic2VuZCBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfcXVlcnlfdG9fcGVlcihwZWVyX3QgKnApCit7CisJLyogV2h5IGRvIHdlIG5lZWQgdG8gYmluZCgpPworCSAqIFNlZSB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBkb24ndCBiaW5kOgorCSAqCisJICogc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fSVApID0gMworCSAqIHNldHNvY2tvcHQoMywgU09MX0lQLCBJUF9UT1MsIFsxNl0sIDQpID0gMAorCSAqIGdldHRpbWVvZmRheSh7MTI1OTA3MTI2NiwgMzI3ODg1fSwgTlVMTCkgPSAwCisJICogc2VuZHRvKDMsICJ4eHgiLCA0OCwgTVNHX0RPTlRXQUlULCB7c2FfZmFtaWx5PUFGX0lORVQsIHNpbl9wb3J0PWh0b25zKDEyMyksIHNpbl9hZGRyPWluZXRfYWRkcigiMTAuMzQuMzIuMTI1Iil9LCAxNikgPSA0OAorCSAqIF5eXiB3ZSBzZW50IGl0IGZyb20gc29tZSBzb3VyY2UgcG9ydCBwaWNrZWQgYnkga2VybmVsLgorCSAqIHRpbWUoTlVMTCkgICAgICAgICAgICAgID0gMTI1OTA3MTI2NgorCSAqIHdyaXRlKDIsICJudHBkOiBlbnRlcmluZyBwb2xsIDE1IHNlY3NcbiIsIDI4KSA9IDI4CisJICogcG9sbChbe2ZkPTMsIGV2ZW50cz1QT0xMSU59XSwgMSwgMTUwMDApID0gMSAoW3tmZD0zLCByZXZlbnRzPVBPTExJTn1dKQorCSAqIHJlY3YoMywgInl5eSIsIDY4LCBNU0dfRE9OVFdBSVQpID0gNDgKKwkgKiBeXl4gdGhpcyByZWN2IHdpbGwgcmVjZWl2ZSBwYWNrZXRzIHRvIGFueSBsb2NhbCBwb3J0IQorCSAqCisJICogVW5jb21tZW50IHRoaXMgYW5kIHVzZSBzdHJhY2UgdG8gc2VlIGl0IGluIGFjdGlvbjoKKwkgKi8KKyNkZWZpbmUgUFJPQkVfTE9DQUxfQUREUiAvKiB7IGxlbl9hbmRfc29ja2FkZHIgbHNhOyBsc2EubGVuID0gTFNBX1NJWkVPRl9TQTsgZ2V0c29ja25hbWUocC0+cXVlcnkuZmQsICZsc2EudS5zYSwgJmxzYS5sZW4pOyB9ICovCisKKwlpZiAocC0+cF9mZCA9PSAtMSkgeworCQlpbnQgZmQsIGZhbWlseTsKKwkJbGVuX2FuZF9zb2NrYWRkciAqbG9jYWxfbHNhOworCisJCWZhbWlseSA9IHAtPnBfbHNhLT51LnNhLnNhX2ZhbWlseTsKKwkJcC0+cF9mZCA9IGZkID0geHNvY2tldF90eXBlKCZsb2NhbF9sc2EsIGZhbWlseSwgU09DS19ER1JBTSk7CisJCS8qIGxvY2FsX2xzYSBoYXMgIm51bGwiIGFkZHJlc3MgYW5kIHBvcnQgMCBub3cuCisJCSAqIGJpbmQoKSBlbnN1cmVzIHdlIGhhdmUgYSAqcGFydGljdWxhciBwb3J0KiBzZWxlY3RlZCBieSBrZXJuZWwKKwkJICogYW5kIHJlbWVtYmVyZWQgaW4gcC0+cF9mZCwgdGh1cyBsYXRlciByZWN2KHAtPnBfZmQpCisJCSAqIHJlY2VpdmVzIG9ubHkgcGFja2V0cyBzZW50IHRvIHRoaXMgcG9ydC4KKwkJICovCisJCVBST0JFX0xPQ0FMX0FERFIKKwkJeGJpbmQoZmQsICZsb2NhbF9sc2EtPnUuc2EsIGxvY2FsX2xzYS0+bGVuKTsKKwkJUFJPQkVfTE9DQUxfQUREUgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJaWYgKGZhbWlseSA9PSBBRl9JTkVUKQorI2VuZGlmCisJCQlzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX0lQLCBJUF9UT1MsICZjb25zdF9JUFRPU19MT1dERUxBWSwgc2l6ZW9mKGNvbnN0X0lQVE9TX0xPV0RFTEFZKSk7CisJCWZyZWUobG9jYWxfbHNhKTsKKwl9CisKKwkvKgorCSAqIFNlbmQgb3V0IGEgcmFuZG9tIDY0LWJpdCBudW1iZXIgYXMgb3VyIHRyYW5zbWl0IHRpbWUuICBUaGUgTlRQCisJICogc2VydmVyIHdpbGwgY29weSBzYWlkIG51bWJlciBpbnRvIHRoZSBvcmlnaW5hdGUgZmllbGQgb24gdGhlCisJICogcmVzcG9uc2UgdGhhdCBpdCBzZW5kcyB1cy4gIFRoaXMgaXMgdG90YWxseSBsZWdhbCBwZXIgdGhlIFNOVFAgc3BlYy4KKwkgKgorCSAqIFRoZSBpbXBhY3Qgb2YgdGhpcyBpcyB0d28gZm9sZDogd2Ugbm8gbG9uZ2VyIHNlbmQgb3V0IHRoZSBjdXJyZW50CisJICogc3lzdGVtIHRpbWUgZm9yIHRoZSB3b3JsZCB0byBzZWUgKHdoaWNoIG1heSBhaWQgYW4gYXR0YWNrZXIpLCBhbmQKKwkgKiBpdCBnaXZlcyB1cyBhIChub3QgdmVyeSBzZWN1cmUpIHdheSBvZiBrbm93aW5nIHRoYXQgd2UncmUgbm90CisJICogZ2V0dGluZyBzcG9vZmVkIGJ5IGFuIGF0dGFja2VyIHRoYXQgY2FuJ3QgY2FwdHVyZSBvdXIgdHJhZmZpYworCSAqIGJ1dCBjYW4gc3Bvb2YgcGFja2V0cyBmcm9tIHRoZSBOVFAgc2VydmVyIHdlJ3JlIGNvbW11bmljYXRpbmcgd2l0aC4KKwkgKgorCSAqIFNhdmUgdGhlIHJlYWwgdHJhbnNtaXQgdGltZXN0YW1wIGxvY2FsbHkuCisJICovCisJcC0+cF94bXRfbXNnLm1feG10dGltZS5pbnRfcGFydGwgPSByYW5kb20oKTsKKwlwLT5wX3htdF9tc2cubV94bXR0aW1lLmZyYWN0aW9ubCA9IHJhbmRvbSgpOworCXAtPnBfeG10dGltZSA9IGdldHRpbWUxOTAwZCgpOworCisJaWYgKGRvX3NlbmR0byhwLT5wX2ZkLCAvKmZyb206Ki8gTlVMTCwgLyp0bzoqLyAmcC0+cF9sc2EtPnUuc2EsIC8qYWRkcmxlbjoqLyBwLT5wX2xzYS0+bGVuLAorCQkJJnAtPnBfeG10X21zZywgTlRQX01TR1NJWkVfTk9BVVRIKSA9PSAtMQorCSkgeworCQljbG9zZShwLT5wX2ZkKTsKKwkJcC0+cF9mZCA9IC0xOworCQlzZXRfbmV4dChwLCBSRVRSWV9JTlRFUlZBTCk7CisJCXJldHVybjsKKwl9CisKKwlwLT5yZWFjaGFibGVfYml0cyA8PD0gMTsKKwlWRVJCMSBiYl9lcnJvcl9tc2coInNlbnQgcXVlcnkgdG8gJXMiLCBwLT5wX2RvdHRlZCk7CisJc2V0X25leHQocCwgUkVTUE9OU0VfSU5URVJWQUwpOworfQorCisKKy8qIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBwcm92aXNpb24gdG8gcHJldmVudCBzZXZlcmFsIHJ1bl9zY3JpcHRzCisgKiB0byBiZSBkb25lIGluIHF1aWNrIHN1Y2Nlc3Npb24uIEluIGZhY3QsIGl0IGhhcHBlbnMgcmF0aGVyIG9mdGVuCisgKiBpZiBpbml0aWFsIHN5bmNyb25pemF0aW9uIHJlc3VsdHMgaW4gYSBzdGVwLgorICogWW91IHdpbGwgc2VlICJzdGVwIiBhbmQgdGhlbiAic3RyYXR1bSIgc2NyaXB0IHJ1bnMsIHNvbWV0aW1lcworICogYXMgY2xvc2UgYXMgb25seSAwLjAwMiBzZWNvbmRzIGFwYXJ0LgorICogU2NyaXB0IHNob3VsZCBiZSByZWFkeSB0byBkZWFsIHdpdGggdGhpcy4KKyAqLworc3RhdGljIHZvaWQgcnVuX3NjcmlwdChjb25zdCBjaGFyICphY3Rpb24sIGRvdWJsZSBvZmZzZXQpCit7CisJY2hhciAqYXJndlszXTsKKwljaGFyICplbnYxLCAqZW52MiwgKmVudjMsICplbnY0OworCisJaWYgKCFHLnNjcmlwdF9uYW1lKQorCQlyZXR1cm47CisKKwlhcmd2WzBdID0gKGNoYXIqKSBHLnNjcmlwdF9uYW1lOworCWFyZ3ZbMV0gPSAoY2hhciopIGFjdGlvbjsKKwlhcmd2WzJdID0gTlVMTDsKKworCVZFUkIxIGJiX2Vycm9yX21zZygiZXhlY3V0aW5nICclcyAlcyciLCBHLnNjcmlwdF9uYW1lLCBhY3Rpb24pOworCisJZW52MSA9IHhhc3ByaW50ZigiJXM9JXUiLCAic3RyYXR1bSIsIEcuc3RyYXR1bSk7CisJcHV0ZW52KGVudjEpOworCWVudjIgPSB4YXNwcmludGYoIiVzPSVsZCIsICJmcmVxX2RyaWZ0X3BwbSIsIEcua2VybmVsX2ZyZXFfZHJpZnQpOworCXB1dGVudihlbnYyKTsKKwllbnYzID0geGFzcHJpbnRmKCIlcz0ldSIsICJwb2xsX2ludGVydmFsIiwgMSA8PCBHLnBvbGxfZXhwKTsKKwlwdXRlbnYoZW52Myk7CisJZW52NCA9IHhhc3ByaW50ZigiJXM9JWYiLCAib2Zmc2V0Iiwgb2Zmc2V0KTsKKwlwdXRlbnYoZW52NCk7CisJLyogT3RoZXIgaXRlbXMgb2YgcG90ZW50aWFsIGludGVyZXN0OiBzZWxlY3RlZCBwZWVyLAorCSAqIHJvb3RkZWxheSwgcmVmdGltZSwgcm9vdGRpc3AsIHJlZmlkLCBudHBfc3RhdHVzLAorCSAqIGxhc3RfdXBkYXRlX29mZnNldCwgbGFzdF91cGRhdGVfcmVjdl90aW1lLCBkaXNjaXBsaW5lX2ppdHRlciwKKwkgKiBob3cgbWFueSBwZWVycyBoYXZlIHJlYWNoYWJsZV9iaXRzID0gMD8KKwkgKi8KKworCS8qIERvbid0IHdhbnQgdG8gd2FpdDogaXQgbWF5IHJ1biBod2Nsb2NrIC0tc3lzdG9oYywgYW5kIHRoYXQKKwkgKiBtYXkgdGFrZSBzb21lIHRpbWUgKHNlY29uZHMpOiAqLworCS8qc3Bhd25fYW5kX3dhaXQoYXJndik7Ki8KKwlzcGF3bihhcmd2KTsKKworCXVuc2V0ZW52KCJzdHJhdHVtIik7CisJdW5zZXRlbnYoImZyZXFfZHJpZnRfcHBtIik7CisJdW5zZXRlbnYoInBvbGxfaW50ZXJ2YWwiKTsKKwl1bnNldGVudigib2Zmc2V0Iik7CisJZnJlZShlbnYxKTsKKwlmcmVlKGVudjIpOworCWZyZWUoZW52Myk7CisJZnJlZShlbnY0KTsKKworCUcubGFzdF9zY3JpcHRfcnVuID0gRy5jdXJfdGltZTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQKK3N0ZXBfdGltZShkb3VibGUgb2Zmc2V0KQoreworCWxsaXN0X3QgKml0ZW07CisJZG91YmxlIGR0aW1lOworCXN0cnVjdCB0aW1ldmFsIHR2OworCWNoYXIgYnVmWzgwXTsKKwl0aW1lX3QgdHZhbDsKKworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOyAvKiBuZXZlciBmYWlscyAqLworCWR0aW1lID0gb2Zmc2V0ICsgdHYudHZfc2VjOworCWR0aW1lICs9IDEuMGUtNiAqIHR2LnR2X3VzZWM7CisJZF90b190dihkdGltZSwgJnR2KTsKKworCWlmIChzZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXR0aW1lb2ZkYXkiKTsKKworCXR2YWwgPSB0di50dl9zZWM7CisJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgIiVhICViICVlICVIOiVNOiVTICVaICVZIiwgbG9jYWx0aW1lKCZ0dmFsKSk7CisKKwliYl9lcnJvcl9tc2coInNldHRpbmcgY2xvY2sgdG8gJXMgKG9mZnNldCAlZnMpIiwgYnVmLCBvZmZzZXQpOworCisJLyogQ29ycmVjdCB2YXJpb3VzIGZpZWxkcyB3aGljaCBjb250YWluIHRpbWUtcmVsYXRpdmUgdmFsdWVzOiAqLworCisJLyogcC0+bGFzdHBrdF9yZWN2X3RpbWUsIHAtPm5leHRfYWN0aW9uX3RpbWUgYW5kIHN1Y2g6ICovCisJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJcGVlcl90ICpwcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKwkJcmVzZXRfcGVlcl9zdGF0cyhwcCwgb2Zmc2V0KTsKKwkJLy9iYl9lcnJvcl9tc2coIm9mZnNldDolZiBwcC0+bmV4dF9hY3Rpb25fdGltZTolZiAtPiAlZiIsCisJCS8vCW9mZnNldCwgcHAtPm5leHRfYWN0aW9uX3RpbWUsIHBwLT5uZXh0X2FjdGlvbl90aW1lICsgb2Zmc2V0KTsKKwkJcHAtPm5leHRfYWN0aW9uX3RpbWUgKz0gb2Zmc2V0OworCX0KKwkvKiBHbG9iYWxzOiAqLworCUcuY3VyX3RpbWUgKz0gb2Zmc2V0OworCUcubGFzdF91cGRhdGVfcmVjdl90aW1lICs9IG9mZnNldDsKKwlHLmxhc3Rfc2NyaXB0X3J1biArPSBvZmZzZXQ7Cit9CisKKworLyoKKyAqIFNlbGVjdGlvbiBhbmQgY2x1c3RlcmluZywgYW5kIHRoZWlyIGhlbHBlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXBlZXJfdCAqcDsKKwlpbnQgICAgdHlwZTsKKwlkb3VibGUgZWRnZTsKKwlkb3VibGUgb3B0X3JkOyAvKiBvcHRpbWl6YXRpb24gKi8KK30gcG9pbnRfdDsKK3N0YXRpYyBpbnQKK2NvbXBhcmVfcG9pbnRfZWRnZShjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCit7CisJY29uc3QgcG9pbnRfdCAqYSA9IGFhOworCWNvbnN0IHBvaW50X3QgKmIgPSBiYjsKKwlpZiAoYS0+ZWRnZSA8IGItPmVkZ2UpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKGEtPmVkZ2UgPiBiLT5lZGdlKTsKK30KK3R5cGVkZWYgc3RydWN0IHsKKwlwZWVyX3QgKnA7CisJZG91YmxlIG1ldHJpYzsKK30gc3Vydml2b3JfdDsKK3N0YXRpYyBpbnQKK2NvbXBhcmVfc3Vydml2b3JfbWV0cmljKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYikKK3sKKwljb25zdCBzdXJ2aXZvcl90ICphID0gYWE7CisJY29uc3Qgc3Vydml2b3JfdCAqYiA9IGJiOworCWlmIChhLT5tZXRyaWMgPCBiLT5tZXRyaWMpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKGEtPm1ldHJpYyA+IGItPm1ldHJpYyk7Cit9CitzdGF0aWMgaW50CitmaXQocGVlcl90ICpwLCBkb3VibGUgcmQpCit7CisJaWYgKChwLT5yZWFjaGFibGVfYml0cyAmIChwLT5yZWFjaGFibGVfYml0cy0xKSkgPT0gMCkgeworCQkvKiBPbmUgb3IgemVybyBiaXRzIGluIHJlYWNoYWJsZV9iaXRzICovCisJCVZFUkIzIGJiX2Vycm9yX21zZygicGVlciAlcyB1bmZpdCBmb3Igc2VsZWN0aW9uOiB1bnJlYWNoYWJsZSIsIHAtPnBfZG90dGVkKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmIDAgLyogd2UgZmlsdGVyIG91dCBzdWNoIHBhY2tldHMgZWFybGllciAqLworCWlmICgocC0+bGFzdHBrdF9zdGF0dXMgJiBMSV9BTEFSTSkgPT0gTElfQUxBUk0KKwkgfHwgcC0+bGFzdHBrdF9zdHJhdHVtID49IE1BWFNUUkFUCisJKSB7CisJCVZFUkIzIGJiX2Vycm9yX21zZygicGVlciAlcyB1bmZpdCBmb3Igc2VsZWN0aW9uOiBiYWQgc3RhdHVzL3N0cmF0dW0iLCBwLT5wX2RvdHRlZCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCS8qIHJkIGlzIHJvb3RfZGlzdGFuY2UocCkgKi8KKwlpZiAocmQgPiBNQVhESVNUICsgRlJFUV9UT0xFUkFOQ0UgKiAoMSA8PCBHLnBvbGxfZXhwKSkgeworCQlWRVJCMyBiYl9lcnJvcl9tc2coInBlZXIgJXMgdW5maXQgZm9yIHNlbGVjdGlvbjogcm9vdCBkaXN0YW5jZSB0b28gaGlnaCIsIHAtPnBfZG90dGVkKTsKKwkJcmV0dXJuIDA7CisJfQorLy9UT0RPCisvLwkvKiBEbyB3ZSBoYXZlIGEgbG9vcD8gKi8KKy8vCWlmIChwLT5yZWZpZCA9PSBwLT5kc3RhZGRyIHx8IHAtPnJlZmlkID09IHMucmVmaWQpCisvLwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CitzdGF0aWMgcGVlcl90Kgorc2VsZWN0X2FuZF9jbHVzdGVyKHZvaWQpCit7CisJcGVlcl90ICAgICAqcDsKKwlsbGlzdF90ICAgICppdGVtOworCWludCAgICAgICAgaSwgajsKKwlpbnQgICAgICAgIHNpemUgPSAzICogRy5wZWVyX2NudDsKKwkvKiBmb3Igc2VsZWN0aW9uIGFsZ29yaXRobSAqLworCXBvaW50X3QgICAgcG9pbnRbc2l6ZV07CisJdW5zaWduZWQgICBudW1fcG9pbnRzLCBudW1fY2FuZGlkYXRlczsKKwlkb3VibGUgICAgIGxvdywgaGlnaDsKKwl1bnNpZ25lZCAgIG51bV9mYWxzZXRpY2tlcnM7CisJLyogZm9yIGNsdXN0ZXIgYWxnb3JpdGhtICovCisJc3Vydml2b3JfdCBzdXJ2aXZvcltzaXplXTsKKwl1bnNpZ25lZCAgIG51bV9zdXJ2aXZvcnM7CisKKwkvKiBTZWxlY3Rpb24gKi8KKworCW51bV9wb2ludHMgPSAwOworCWl0ZW0gPSBHLm50cF9wZWVyczsKKwlpZiAoRy5pbml0aWFsX3BvbGxfY29tcGxldGUpIHdoaWxlIChpdGVtICE9IE5VTEwpIHsKKwkJZG91YmxlIHJkLCBvZmZzZXQ7CisKKwkJcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKwkJcmQgPSByb290X2Rpc3RhbmNlKHApOworCQlvZmZzZXQgPSBwLT5maWx0ZXJfb2Zmc2V0OworCQlpZiAoIWZpdChwLCByZCkpIHsKKwkJCWl0ZW0gPSBpdGVtLT5saW5rOworCQkJY29udGludWU7CisJCX0KKworCQlWRVJCNCBiYl9lcnJvcl9tc2coImludGVydmFsOiBbJWYgJWYgJWZdICVzIiwKKwkJCQlvZmZzZXQgLSByZCwKKwkJCQlvZmZzZXQsCisJCQkJb2Zmc2V0ICsgcmQsCisJCQkJcC0+cF9kb3R0ZWQKKwkJKTsKKwkJcG9pbnRbbnVtX3BvaW50c10ucCA9IHA7CisJCXBvaW50W251bV9wb2ludHNdLnR5cGUgPSAtMTsKKwkJcG9pbnRbbnVtX3BvaW50c10uZWRnZSA9IG9mZnNldCAtIHJkOworCQlwb2ludFtudW1fcG9pbnRzXS5vcHRfcmQgPSByZDsKKwkJbnVtX3BvaW50cysrOworCQlwb2ludFtudW1fcG9pbnRzXS5wID0gcDsKKwkJcG9pbnRbbnVtX3BvaW50c10udHlwZSA9IDA7CisJCXBvaW50W251bV9wb2ludHNdLmVkZ2UgPSBvZmZzZXQ7CisJCXBvaW50W251bV9wb2ludHNdLm9wdF9yZCA9IHJkOworCQludW1fcG9pbnRzKys7CisJCXBvaW50W251bV9wb2ludHNdLnAgPSBwOworCQlwb2ludFtudW1fcG9pbnRzXS50eXBlID0gMTsKKwkJcG9pbnRbbnVtX3BvaW50c10uZWRnZSA9IG9mZnNldCArIHJkOworCQlwb2ludFtudW1fcG9pbnRzXS5vcHRfcmQgPSByZDsKKwkJbnVtX3BvaW50cysrOworCQlpdGVtID0gaXRlbS0+bGluazsKKwl9CisJbnVtX2NhbmRpZGF0ZXMgPSBudW1fcG9pbnRzIC8gMzsKKwlpZiAobnVtX2NhbmRpZGF0ZXMgPT0gMCkgeworCQlWRVJCMyBiYl9lcnJvcl9tc2coIm5vIHZhbGlkIGRhdGFwb2ludHMsIG5vIHBlZXIgc2VsZWN0ZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorLy9UT0RPOiBzb3J0aW5nIGRvZXMgbm90IHNlZW0gdG8gYmUgZG9uZSBpbiByZWZlcmVuY2UgY29kZQorCXFzb3J0KHBvaW50LCBudW1fcG9pbnRzLCBzaXplb2YocG9pbnRbMF0pLCBjb21wYXJlX3BvaW50X2VkZ2UpOworCisJLyogU3RhcnQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIGFyZSBubyBmYWxzZXRpY2tlcnMuCisJICogQXR0ZW1wdCB0byBmaW5kIGEgbm9uZW1wdHkgaW50ZXJzZWN0aW9uIGludGVydmFsIGNvbnRhaW5pbmcKKwkgKiB0aGUgbWlkcG9pbnRzIG9mIGFsbCB0cnVlY2hpbWVycy4KKwkgKiBJZiBhIG5vbmVtcHR5IGludGVydmFsIGNhbm5vdCBiZSBmb3VuZCwgaW5jcmVhc2UgdGhlIG51bWJlcgorCSAqIG9mIGFzc3VtZWQgZmFsc2V0aWNrZXJzIGJ5IG9uZSBhbmQgdHJ5IGFnYWluLgorCSAqIElmIGEgbm9uZW1wdHkgaW50ZXJ2YWwgaXMgZm91bmQgYW5kIHRoZSBudW1iZXIgb2YgZmFsc2V0aWNrZXJzCisJICogaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgdHJ1ZWNoaW1lcnMsIGEgbWFqb3JpdHkgaGFzIGJlZW4gZm91bmQKKwkgKiBhbmQgdGhlIG1pZHBvaW50IG9mIGVhY2ggdHJ1ZWNoaW1lciByZXByZXNlbnRzCisJICogdGhlIGNhbmRpZGF0ZXMgYXZhaWxhYmxlIHRvIHRoZSBjbHVzdGVyIGFsZ29yaXRobS4KKwkgKi8KKwludW1fZmFsc2V0aWNrZXJzID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKwkJdW5zaWduZWQgbnVtX21pZHBvaW50cyA9IDA7CisKKwkJbG93ID0gMSA8PCA5OworCQloaWdoID0gLSAoMSA8PCA5KTsKKwkJYyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcG9pbnRzOyBpKyspIHsKKwkJCS8qIFdlIHdhbnQgdG8gZG86CisJCQkgKiBpZiAocG9pbnRbaV0udHlwZSA9PSAtMSkgYysrOworCQkJICogaWYgKHBvaW50W2ldLnR5cGUgPT0gMSkgYy0tOworCQkJICogYW5kIGl0J3Mgc2ltcGxlciB0byBkbyBpdCB0aGlzIHdheToKKwkJCSAqLworCQkJYyAtPSBwb2ludFtpXS50eXBlOworCQkJaWYgKGMgPj0gbnVtX2NhbmRpZGF0ZXMgLSBudW1fZmFsc2V0aWNrZXJzKSB7CisJCQkJLyogSWYgaXQgd2FzIGMrKyBhbmQgaXQgZ290IGJpZyBlbm91Z2guLi4gKi8KKwkJCQlsb3cgPSBwb2ludFtpXS5lZGdlOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBvaW50W2ldLnR5cGUgPT0gMCkKKwkJCQludW1fbWlkcG9pbnRzKys7CisJCX0KKwkJYyA9IDA7CisJCWZvciAoaSA9IG51bV9wb2ludHMtMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWMgKz0gcG9pbnRbaV0udHlwZTsKKwkJCWlmIChjID49IG51bV9jYW5kaWRhdGVzIC0gbnVtX2ZhbHNldGlja2VycykgeworCQkJCWhpZ2ggPSBwb2ludFtpXS5lZGdlOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBvaW50W2ldLnR5cGUgPT0gMCkKKwkJCQludW1fbWlkcG9pbnRzKys7CisJCX0KKwkJLyogSWYgdGhlIG51bWJlciBvZiBtaWRwb2ludHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKKwkJICogb2YgYWxsb3dlZCBmYWxzZXRpY2tlcnMsIHRoZSBpbnRlcnNlY3Rpb24gY29udGFpbnMgYXQKKwkJICogbGVhc3Qgb25lIHRydWVjaGltZXIgd2l0aCBubyBtaWRwb2ludCAtIGJhZC4KKwkJICogQWxzbywgaW50ZXJ2YWwgc2hvdWxkIGJlIG5vbmVtcHR5LgorCQkgKi8KKwkJaWYgKG51bV9taWRwb2ludHMgPD0gbnVtX2ZhbHNldGlja2VycyAmJiBsb3cgPCBoaWdoKQorCQkJYnJlYWs7CisJCW51bV9mYWxzZXRpY2tlcnMrKzsKKwkJaWYgKG51bV9mYWxzZXRpY2tlcnMgKiAyID49IG51bV9jYW5kaWRhdGVzKSB7CisJCQlWRVJCMyBiYl9lcnJvcl9tc2coInRvbyBtYW55IGZhbHNldGlja2VyczolZCAoY2FuZGlkYXRlczolZCksIG5vIHBlZXIgc2VsZWN0ZWQiLAorCQkJCQludW1fZmFsc2V0aWNrZXJzLCBudW1fY2FuZGlkYXRlcyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlWRVJCMyBiYl9lcnJvcl9tc2coInNlbGVjdGVkIGludGVydmFsOiBbJWYsICVmXTsgY2FuZGlkYXRlczolZCBmYWxzZXRpY2tlcnM6JWQiLAorCQkJbG93LCBoaWdoLCBudW1fY2FuZGlkYXRlcywgbnVtX2ZhbHNldGlja2Vycyk7CisKKwkvKiBDbHVzdGVyaW5nICovCisKKwkvKiBDb25zdHJ1Y3QgYSBsaXN0IG9mIHN1cnZpdm9ycyAocCwgbWV0cmljKQorCSAqIGZyb20gdGhlIGNoaW1lIGxpc3QsIHdoZXJlIG1ldHJpYyBpcyBkb21pbmF0ZWQKKwkgKiBmaXJzdCBieSBzdHJhdHVtIGFuZCB0aGVuIGJ5IHJvb3QgZGlzdGFuY2UuCisJICogQWxsIG90aGVyIHRoaW5ncyBiZWluZyBlcXVhbCwgdGhpcyBpcyB0aGUgb3JkZXIgb2YgcHJlZmVyZW5jZS4KKwkgKi8KKwludW1fc3Vydml2b3JzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BvaW50czsgaSsrKSB7CisJCWlmIChwb2ludFtpXS5lZGdlIDwgbG93IHx8IHBvaW50W2ldLmVkZ2UgPiBoaWdoKQorCQkJY29udGludWU7CisJCXAgPSBwb2ludFtpXS5wOworCQlzdXJ2aXZvcltudW1fc3Vydml2b3JzXS5wID0gcDsKKwkJLyogeC5vcHRfcmQgPT0gcm9vdF9kaXN0YW5jZShwKTsgKi8KKwkJc3Vydml2b3JbbnVtX3N1cnZpdm9yc10ubWV0cmljID0gTUFYRElTVCAqIHAtPmxhc3Rwa3Rfc3RyYXR1bSArIHBvaW50W2ldLm9wdF9yZDsKKwkJVkVSQjQgYmJfZXJyb3JfbXNnKCJzdXJ2aXZvclslZF0gbWV0cmljOiVmIHBlZXI6JXMiLAorCQkJbnVtX3N1cnZpdm9ycywgc3Vydml2b3JbbnVtX3N1cnZpdm9yc10ubWV0cmljLCBwLT5wX2RvdHRlZCk7CisJCW51bV9zdXJ2aXZvcnMrKzsKKwl9CisJLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBNSU5fU0VMRUNURUQgc3Vydml2b3JzIHRvIHNhdGlzZnkgdGhlCisJICogY29ycmVjdG5lc3MgYXNzZXJ0aW9ucy4gT3JkaW5hcmlseSwgdGhlIEJ5emFudGluZSBjcml0ZXJpYQorCSAqIHJlcXVpcmUgZm91ciBzdXJ2aXZvcnMsIGJ1dCBmb3IgdGhlIGRlbW9uc3RyYXRpb24gaGVyZSwgb25lCisJICogaXMgYWNjZXB0YWJsZS4KKwkgKi8KKwlpZiAobnVtX3N1cnZpdm9ycyA8IE1JTl9TRUxFQ1RFRCkgeworCQlWRVJCMyBiYl9lcnJvcl9tc2coIm51bV9zdXJ2aXZvcnMgJWQgPCAlZCwgbm8gcGVlciBzZWxlY3RlZCIsCisJCQkJbnVtX3N1cnZpdm9ycywgTUlOX1NFTEVDVEVEKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisvL2xvb2tzIGxpa2UgdGhpcyBpcyBPTkxZIHVzZWQgYnkgdGhlIGZhY3QgdGhhdCBsYXRlciB3ZSBwaWNrIHN1cnZpdm9yWzBdLgorLy93ZSBjYW4gYXZvaWQgc29ydGluZyB0aGVuLCBqdXN0IGZpbmQgdGhlIG1pbmltdW0gb25jZSEKKwlxc29ydChzdXJ2aXZvciwgbnVtX3N1cnZpdm9ycywgc2l6ZW9mKHN1cnZpdm9yWzBdKSwgY29tcGFyZV9zdXJ2aXZvcl9tZXRyaWMpOworCisJLyogRm9yIGVhY2ggYXNzb2NpYXRpb24gcCBpbiB0dXJuLCBjYWxjdWxhdGUgdGhlIHNlbGVjdGlvbgorCSAqIGppdHRlciBwLT5zaml0dGVyIGFzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgc3VtIG9mIHNxdWFyZXMKKwkgKiAocC0+b2Zmc2V0IC0gcS0+b2Zmc2V0KSBvdmVyIGFsbCBxIGFzc29jaWF0aW9ucy4gVGhlIGlkZWEgaXMKKwkgKiB0byByZXBlYXRlZGx5IGRpc2NhcmQgdGhlIHN1cnZpdm9yIHdpdGggbWF4aW11bSBzZWxlY3Rpb24KKwkgKiBqaXR0ZXIgdW50aWwgYSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gaXMgbWV0LgorCSAqLworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIG1heF9pZHggPSBtYXhfaWR4OworCQlkb3VibGUgbWF4X3NlbGVjdGlvbl9qaXR0ZXIgPSBtYXhfc2VsZWN0aW9uX2ppdHRlcjsKKwkJZG91YmxlIG1pbl9qaXR0ZXIgPSBtaW5faml0dGVyOworCisJCWlmIChudW1fc3Vydml2b3JzIDw9IE1JTl9DTFVTVEVSRUQpIHsKKwkJCVZFUkIzIGJiX2Vycm9yX21zZygibnVtX3N1cnZpdm9ycyAlZCA8PSAlZCwgbm90IGRpc2NhcmRpbmcgbW9yZSIsCisJCQkJCW51bV9zdXJ2aXZvcnMsIE1JTl9DTFVTVEVSRUQpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUbyBtYWtlIHN1cmUgYSBmZXcgc3Vydml2b3JzIGFyZSBsZWZ0CisJCSAqIGZvciB0aGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gY2hldyBvbiwKKwkJICogd2Ugc3RvcCBpZiB0aGUgbnVtYmVyIG9mIHN1cnZpdm9ycworCQkgKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTUlOX0NMVVNURVJFRCAoMykuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3N1cnZpdm9yczsgaSsrKSB7CisJCQlkb3VibGUgc2VsZWN0aW9uX2ppdHRlcl9zcTsKKworCQkJcCA9IHN1cnZpdm9yW2ldLnA7CisJCQlpZiAoaSA9PSAwIHx8IHAtPmZpbHRlcl9qaXR0ZXIgPCBtaW5faml0dGVyKQorCQkJCW1pbl9qaXR0ZXIgPSBwLT5maWx0ZXJfaml0dGVyOworCisJCQlzZWxlY3Rpb25faml0dGVyX3NxID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCBudW1fc3Vydml2b3JzOyBqKyspIHsKKwkJCQlwZWVyX3QgKnEgPSBzdXJ2aXZvcltqXS5wOworCQkJCXNlbGVjdGlvbl9qaXR0ZXJfc3EgKz0gU1FVQVJFKHAtPmZpbHRlcl9vZmZzZXQgLSBxLT5maWx0ZXJfb2Zmc2V0KTsKKwkJCX0KKwkJCWlmIChpID09IDAgfHwgc2VsZWN0aW9uX2ppdHRlcl9zcSA+IG1heF9zZWxlY3Rpb25faml0dGVyKSB7CisJCQkJbWF4X3NlbGVjdGlvbl9qaXR0ZXIgPSBzZWxlY3Rpb25faml0dGVyX3NxOworCQkJCW1heF9pZHggPSBpOworCQkJfQorCQkJVkVSQjUgYmJfZXJyb3JfbXNnKCJzdXJ2aXZvciAlZCBzZWxlY3Rpb25faml0dGVyXjI6JWYiLAorCQkJCQlpLCBzZWxlY3Rpb25faml0dGVyX3NxKTsKKwkJfQorCQltYXhfc2VsZWN0aW9uX2ppdHRlciA9IFNRUlQobWF4X3NlbGVjdGlvbl9qaXR0ZXIgLyBudW1fc3Vydml2b3JzKTsKKwkJVkVSQjQgYmJfZXJyb3JfbXNnKCJtYXhfc2VsZWN0aW9uX2ppdHRlciAoYXQgJWQpOiVmIG1pbl9qaXR0ZXI6JWYiLAorCQkJCW1heF9pZHgsIG1heF9zZWxlY3Rpb25faml0dGVyLCBtaW5faml0dGVyKTsKKworCQkvKiBJZiB0aGUgbWF4aW11bSBzZWxlY3Rpb24gaml0dGVyIGlzIGxlc3MgdGhhbiB0aGUKKwkJICogbWluaW11bSBwZWVyIGppdHRlciwgdGhlbiB0b3NzaW5nIG91dCBtb3JlIHN1cnZpdm9ycworCQkgKiB3aWxsIG5vdCBsb3dlciB0aGUgbWluaW11bSBwZWVyIGppdHRlciwgc28gd2UgbWlnaHQKKwkJICogYXMgd2VsbCBzdG9wLgorCQkgKi8KKwkJaWYgKG1heF9zZWxlY3Rpb25faml0dGVyIDwgbWluX2ppdHRlcikgeworCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJtYXhfc2VsZWN0aW9uX2ppdHRlcjolZiA8IG1pbl9qaXR0ZXI6JWYsIG51bV9zdXJ2aXZvcnM6JWQsIG5vdCBkaXNjYXJkaW5nIG1vcmUiLAorCQkJCQltYXhfc2VsZWN0aW9uX2ppdHRlciwgbWluX2ppdHRlciwgbnVtX3N1cnZpdm9ycyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERlbGV0ZSBzdXJ2aXZvclttYXhfaWR4XSBmcm9tIHRoZSBsaXN0CisJCSAqIGFuZCBnbyBhcm91bmQgYWdhaW4uCisJCSAqLworCQlWRVJCNSBiYl9lcnJvcl9tc2coImRyb3BwaW5nIHN1cnZpdm9yICVkIiwgbWF4X2lkeCk7CisJCW51bV9zdXJ2aXZvcnMtLTsKKwkJd2hpbGUgKG1heF9pZHggPCBudW1fc3Vydml2b3JzKSB7CisJCQlzdXJ2aXZvclttYXhfaWR4XSA9IHN1cnZpdm9yW21heF9pZHggKyAxXTsKKwkJCW1heF9pZHgrKzsKKwkJfQorCX0KKworCWlmICgwKSB7CisJCS8qIENvbWJpbmUgdGhlIG9mZnNldHMgb2YgdGhlIGNsdXN0ZXJpbmcgYWxnb3JpdGhtIHN1cnZpdm9ycworCQkgKiB1c2luZyBhIHdlaWdodGVkIGF2ZXJhZ2Ugd2l0aCB3ZWlnaHQgZGV0ZXJtaW5lZCBieSB0aGUgcm9vdAorCQkgKiBkaXN0YW5jZS4gQ29tcHV0ZSB0aGUgc2VsZWN0aW9uIGppdHRlciBhcyB0aGUgd2VpZ2h0ZWQgUk1TCisJCSAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmlyc3Qgc3Vydml2b3IgYW5kIHRoZSByZW1haW5pbmcKKwkJICogc3Vydml2b3JzLiBJbiBzb21lIGNhc2VzIHRoZSBpbmhlcmVudCBjbG9jayBqaXR0ZXIgY2FuIGJlCisJCSAqIHJlZHVjZWQgYnkgbm90IHVzaW5nIHRoaXMgYWxnb3JpdGhtLCBlc3BlY2lhbGx5IHdoZW4gZnJlcXVlbnQKKwkJICogY2xvY2tob3BwaW5nIGlzIGludm9sdmVkLiBiYm94OiB0aHVzIHdlIGRvbid0IGRvIGl0LgorCQkgKi8KKwkJZG91YmxlIHgsIHksIHosIHc7CisJCXkgPSB6ID0gdyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fc3Vydml2b3JzOyBpKyspIHsKKwkJCXAgPSBzdXJ2aXZvcltpXS5wOworCQkJeCA9IHJvb3RfZGlzdGFuY2UocCk7CisJCQl5ICs9IDEgLyB4OworCQkJeiArPSBwLT5maWx0ZXJfb2Zmc2V0IC8geDsKKwkJCXcgKz0gU1FVQVJFKHAtPmZpbHRlcl9vZmZzZXQgLSBzdXJ2aXZvclswXS5wLT5maWx0ZXJfb2Zmc2V0KSAvIHg7CisJCX0KKwkJLy9HLmNsdXN0ZXJfb2Zmc2V0ID0geiAvIHk7CisJCS8vRy5jbHVzdGVyX2ppdHRlciA9IFNRUlQodyAvIHkpOworCX0KKworCS8qIFBpY2sgdGhlIGJlc3QgY2xvY2suIElmIHRoZSBvbGQgc3lzdGVtIHBlZXIgaXMgb24gdGhlIGxpc3QKKwkgKiBhbmQgYXQgdGhlIHNhbWUgc3RyYXR1bSBhcyB0aGUgZmlyc3Qgc3Vydml2b3Igb24gdGhlIGxpc3QsCisJICogdGhlbiBkb24ndCBkbyBhIGNsb2NrIGhvcC4gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGZpcnN0CisJICogc3Vydml2b3Igb24gdGhlIGxpc3QgYXMgdGhlIG5ldyBzeXN0ZW0gcGVlci4KKwkgKi8KKwlwID0gc3Vydml2b3JbMF0ucDsKKwlpZiAoRy5sYXN0X3VwZGF0ZV9wZWVyCisJICYmIEcubGFzdF91cGRhdGVfcGVlci0+bGFzdHBrdF9zdHJhdHVtIDw9IHAtPmxhc3Rwa3Rfc3RyYXR1bQorCSkgeworCQkvKiBTdGFydGluZyBmcm9tIDEgaXMgb2sgaGVyZSAqLworCQlmb3IgKGkgPSAxOyBpIDwgbnVtX3N1cnZpdm9yczsgaSsrKSB7CisJCQlpZiAoRy5sYXN0X3VwZGF0ZV9wZWVyID09IHN1cnZpdm9yW2ldLnApIHsKKwkJCQlWRVJCNCBiYl9lcnJvcl9tc2coImtlZXBpbmcgb2xkIHN5bmNlZCBwZWVyIik7CisJCQkJcCA9IEcubGFzdF91cGRhdGVfcGVlcjsKKwkJCQlnb3RvIGtlZXBfb2xkOworCQkJfQorCQl9CisJfQorCUcubGFzdF91cGRhdGVfcGVlciA9IHA7Cisga2VlcF9vbGQ6CisJVkVSQjMgYmJfZXJyb3JfbXNnKCJzZWxlY3RlZCBwZWVyICVzIGZpbHRlcl9vZmZzZXQ6JWYgYWdlOiVmIiwKKwkJCXAtPnBfZG90dGVkLAorCQkJcC0+ZmlsdGVyX29mZnNldCwKKwkJCUcuY3VyX3RpbWUgLSBwLT5sYXN0cGt0X3JlY3ZfdGltZQorCSk7CisJcmV0dXJuIHA7Cit9CisKKworLyoKKyAqIExvY2FsIGNsb2NrIGRpc2NpcGxpbmUgYW5kIGl0cyBoZWxwZXJzCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbmV3X3ZhbHVlcyhpbnQgZGlzY19zdGF0ZSwgZG91YmxlIG9mZnNldCwgZG91YmxlIHJlY3ZfdGltZSkKK3sKKwkvKiBFbnRlciBuZXcgc3RhdGUgYW5kIHNldCBzdGF0ZSB2YXJpYWJsZXMuIE5vdGUgd2UgdXNlIHRoZSB0aW1lCisJICogb2YgdGhlIGxhc3QgY2xvY2sgZmlsdGVyIHNhbXBsZSwgd2hpY2ggbXVzdCBiZSBlYXJsaWVyIHRoYW4KKwkgKiB0aGUgY3VycmVudCB0aW1lLgorCSAqLworCVZFUkIzIGJiX2Vycm9yX21zZygiZGlzY19zdGF0ZT0lZCBsYXN0IHVwZGF0ZSBvZmZzZXQ9JWYgcmVjdl90aW1lPSVmIiwKKwkJCWRpc2Nfc3RhdGUsIG9mZnNldCwgcmVjdl90aW1lKTsKKwlHLmRpc2NpcGxpbmVfc3RhdGUgPSBkaXNjX3N0YXRlOworCUcubGFzdF91cGRhdGVfb2Zmc2V0ID0gb2Zmc2V0OworCUcubGFzdF91cGRhdGVfcmVjdl90aW1lID0gcmVjdl90aW1lOworfQorLyogUmV0dXJuOiAtMTogZGVjcmVhc2UgcG9sbCBpbnRlcnZhbCwgMDogbGVhdmUgYXMgaXMsIDE6IGluY3JlYXNlICovCitzdGF0aWMgTk9JTkxJTkUgaW50Cit1cGRhdGVfbG9jYWxfY2xvY2socGVlcl90ICpwKQoreworCWludCByYzsKKwlzdHJ1Y3QgdGltZXggdG14OworCS8qIE5vdGU6IGNhbiB1c2UgRy5jbHVzdGVyX29mZnNldCBpbnN0ZWFkOiAqLworCWRvdWJsZSBvZmZzZXQgPSBwLT5maWx0ZXJfb2Zmc2V0OworCWRvdWJsZSByZWN2X3RpbWUgPSBwLT5sYXN0cGt0X3JlY3ZfdGltZTsKKwlkb3VibGUgYWJzX29mZnNldDsKKyNpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJZG91YmxlIGZyZXFfZHJpZnQ7CisjZW5kaWYKKwlkb3VibGUgc2luY2VfbGFzdF91cGRhdGU7CisJZG91YmxlIGV0ZW1wLCBkdGVtcDsKKworCWFic19vZmZzZXQgPSBmYWJzKG9mZnNldCk7CisKKyNpZiAwCisJLyogSWYgbmVlZGVkLCAtUyBzY3JpcHQgY2FuIGRvIGl0IGJ5IGxvb2tpbmcgYXQgJG9mZnNldAorCSAqIGVudiB2YXIgYW5kIGtpbGxpbmcgcGFyZW50ICovCisJLyogSWYgdGhlIG9mZnNldCBpcyB0b28gbGFyZ2UsIGdpdmUgdXAgYW5kIGdvIGhvbWUgKi8KKwlpZiAoYWJzX29mZnNldCA+IFBBTklDX1RIUkVTSE9MRCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib2Zmc2V0ICVmIGZhciB0b28gYmlnLCBleGl0aW5nIiwgb2Zmc2V0KTsKKwl9CisjZW5kaWYKKworCS8qIElmIHRoaXMgaXMgYW4gb2xkIHVwZGF0ZSwgZm9yIGluc3RhbmNlIGFzIHRoZSByZXN1bHQKKwkgKiBvZiBhIHN5c3RlbSBwZWVyIGNoYW5nZSwgYXZvaWQgaXQuIFdlIG5ldmVyIHVzZQorCSAqIGFuIG9sZCBzYW1wbGUgb3IgdGhlIHNhbWUgc2FtcGxlIHR3aWNlLgorCSAqLworCWlmIChyZWN2X3RpbWUgPD0gRy5sYXN0X3VwZGF0ZV9yZWN2X3RpbWUpIHsKKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJzYW1lIG9yIG9sZGVyIGRhdGFwb2ludDogJWYgPj0gJWYsIG5vdCB1c2luZyBpdCIsCisJCQkJRy5sYXN0X3VwZGF0ZV9yZWN2X3RpbWUsIHJlY3ZfdGltZSk7CisJCXJldHVybiAwOyAvKiAibGVhdmUgcG9sbCBpbnRlcnZhbCBhcyBpcyIgKi8KKwl9CisKKwkvKiBDbG9jayBzdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24uIFRoaXMgaXMgd2hlcmUgdGhlCisJICogYWN0aW9uIGlzIGFuZCBkZWZpbmVzIGhvdyB0aGUgc3lzdGVtIHJlYWN0cyB0byBsYXJnZSB0aW1lCisJICogYW5kIGZyZXF1ZW5jeSBlcnJvcnMuCisJICovCisJc2luY2VfbGFzdF91cGRhdGUgPSByZWN2X3RpbWUgLSBHLnJlZnRpbWU7CisjaWYgIVVTSU5HX0tFUk5FTF9QTExfTE9PUAorCWZyZXFfZHJpZnQgPSAwOworI2VuZGlmCisjaWYgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKwlpZiAoRy5kaXNjaXBsaW5lX3N0YXRlID09IFNUQVRFX0ZSRVEpIHsKKwkJLyogSWdub3JlIHVwZGF0ZXMgdW50aWwgdGhlIHN0ZXBvdXQgdGhyZXNob2xkICovCisJCWlmIChzaW5jZV9sYXN0X3VwZGF0ZSA8IFdBVENIX1RIUkVTSE9MRCkgeworCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJtZWFzdXJpbmcgZHJpZnQsIGRhdGFwb2ludCBpZ25vcmVkLCAlZiBzZWMgcmVtYWlucyIsCisJCQkJCVdBVENIX1RIUkVTSE9MRCAtIHNpbmNlX2xhc3RfdXBkYXRlKTsKKwkJCXJldHVybiAwOyAvKiAibGVhdmUgcG9sbCBpbnRlcnZhbCBhcyBpcyIgKi8KKwkJfQorIyBpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJCWZyZXFfZHJpZnQgPSAob2Zmc2V0IC0gRy5sYXN0X3VwZGF0ZV9vZmZzZXQpIC8gc2luY2VfbGFzdF91cGRhdGU7CisjIGVuZGlmCisJfQorI2VuZGlmCisKKwkvKiBUaGVyZSBhcmUgdHdvIG1haW4gcmVnaW1lczogd2hlbiB0aGUKKwkgKiBvZmZzZXQgZXhjZWVkcyB0aGUgc3RlcCB0aHJlc2hvbGQgYW5kIHdoZW4gaXQgZG9lcyBub3QuCisJICovCisJaWYgKGFic19vZmZzZXQgPiBTVEVQX1RIUkVTSE9MRCkgeworCQlzd2l0Y2ggKEcuZGlzY2lwbGluZV9zdGF0ZSkgeworCQljYXNlIFNUQVRFX1NZTkM6CisJCQkvKiBUaGUgZmlyc3Qgb3V0bHllcjogaWdub3JlIGl0LCBzd2l0Y2ggdG8gU1BJSyBzdGF0ZSAqLworCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJvZmZzZXQ6JWYgLSBzcGlrZSBkZXRlY3RlZCIsIG9mZnNldCk7CisJCQlHLmRpc2NpcGxpbmVfc3RhdGUgPSBTVEFURV9TUElLOworCQkJcmV0dXJuIC0xOyAvKiAiZGVjcmVhc2UgcG9sbCBpbnRlcnZhbCIgKi8KKworCQljYXNlIFNUQVRFX1NQSUs6CisJCQkvKiBJZ25vcmUgc3VjY2VlZGluZyBvdXRseWVycyB1bnRpbCBlaXRoZXIgYW4gaW5seWVyCisJCQkgKiBpcyBmb3VuZCBvciB0aGUgc3RlcG91dCB0aHJlc2hvbGQgaXMgZXhjZWVkZWQuCisJCQkgKi8KKwkJCWlmIChzaW5jZV9sYXN0X3VwZGF0ZSA8IFdBVENIX1RIUkVTSE9MRCkgeworCQkJCVZFUkIzIGJiX2Vycm9yX21zZygic3Bpa2UgZGV0ZWN0ZWQsIGRhdGFwb2ludCBpZ25vcmVkLCAlZiBzZWMgcmVtYWlucyIsCisJCQkJCQlXQVRDSF9USFJFU0hPTEQgLSBzaW5jZV9sYXN0X3VwZGF0ZSk7CisJCQkJcmV0dXJuIC0xOyAvKiAiZGVjcmVhc2UgcG9sbCBpbnRlcnZhbCIgKi8KKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaDogd2UgbmVlZCB0byBzdGVwICovCisJCX0gLyogc3dpdGNoICovCisKKwkJLyogU3RlcCB0aGUgdGltZSBhbmQgY2xhbXAgZG93biB0aGUgcG9sbCBpbnRlcnZhbC4KKwkJICoKKwkJICogSW4gTlNFVCBzdGF0ZSBhbiBpbml0aWFsIGZyZXF1ZW5jeSBjb3JyZWN0aW9uIGlzCisJCSAqIG5vdCBhdmFpbGFibGUsIHVzdWFsbHkgYmVjYXVzZSB0aGUgZnJlcXVlbmN5IGZpbGUgaGFzCisJCSAqIG5vdCB5ZXQgYmVlbiB3cml0dGVuLiBTaW5jZSB0aGUgdGltZSBpcyBvdXRzaWRlIHRoZQorCQkgKiBjYXB0dXJlIHJhbmdlLCB0aGUgY2xvY2sgaXMgc3RlcHBlZC4gVGhlIGZyZXF1ZW5jeQorCQkgKiB3aWxsIGJlIHNldCBkaXJlY3RseSBmb2xsb3dpbmcgdGhlIHN0ZXBvdXQgaW50ZXJ2YWwuCisJCSAqCisJCSAqIEluIEZTRVQgc3RhdGUgdGhlIGluaXRpYWwgZnJlcXVlbmN5IGhhcyBiZWVuIHNldAorCQkgKiBmcm9tIHRoZSBmcmVxdWVuY3kgZmlsZS4gU2luY2UgdGhlIHRpbWUgaXMgb3V0c2lkZQorCQkgKiB0aGUgY2FwdHVyZSByYW5nZSwgdGhlIGNsb2NrIGlzIHN0ZXBwZWQgaW1tZWRpYXRlbHksCisJCSAqIHJhdGhlciB0aGFuIGFmdGVyIHRoZSBzdGVwb3V0IGludGVydmFsLiBHdXlzIGdldAorCQkgKiBuZXJ2b3VzIGlmIGl0IHRha2VzIDE3IG1pbnV0ZXMgdG8gc2V0IHRoZSBjbG9jayBmb3IKKwkJICogdGhlIGZpcnN0IHRpbWUuCisJCSAqCisJCSAqIEluIFNQSUsgc3RhdGUgdGhlIHN0ZXBvdXQgdGhyZXNob2xkIGhhcyBleHBpcmVkIGFuZAorCQkgKiB0aGUgcGhhc2UgaXMgc3RpbGwgYWJvdmUgdGhlIHN0ZXAgdGhyZXNob2xkLiBOb3RlCisJCSAqIHRoYXQgYSBzaW5nbGUgc3Bpa2UgZ3JlYXRlciB0aGFuIHRoZSBzdGVwIHRocmVzaG9sZAorCQkgKiBpcyBhbHdheXMgc3VwcHJlc3NlZCwgZXZlbiBhdCB0aGUgbG9uZ2VyIHBvbGwKKwkJICogaW50ZXJ2YWxzLgorCQkgKi8KKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJzdGVwcGluZyB0aW1lIGJ5ICVmOyBwb2xsX2V4cD1NSU5QT0xMIiwgb2Zmc2V0KTsKKwkJc3RlcF90aW1lKG9mZnNldCk7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3EpIHsKKwkJCS8qIFdlIHdlcmUgb25seSBhc2tlZCB0byBzZXQgdGltZSBvbmNlLiBEb25lLiAqLworCQkJZXhpdCgwKTsKKwkJfQorCisJCUcucG9sbGFkal9jb3VudCA9IDA7CisJCUcucG9sbF9leHAgPSBNSU5QT0xMOworCQlHLnN0cmF0dW0gPSBNQVhTVFJBVDsKKworCQlydW5fc2NyaXB0KCJzdGVwIiwgb2Zmc2V0KTsKKworI2lmIFVTSU5HX0lOSVRJQUxfRlJFUV9FU1RJTUFUSU9OCisJCWlmIChHLmRpc2NpcGxpbmVfc3RhdGUgPT0gU1RBVEVfTlNFVCkgeworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfRlJFUSwgLypvZmZzZXQ6Ki8gMCwgcmVjdl90aW1lKTsKKwkJCXJldHVybiAxOyAvKiAib2sgdG8gaW5jcmVhc2UgcG9sbCBpbnRlcnZhbCIgKi8KKwkJfQorI2VuZGlmCisJCXNldF9uZXdfdmFsdWVzKFNUQVRFX1NZTkMsIC8qb2Zmc2V0OiovIDAsIHJlY3ZfdGltZSk7CisKKwl9IGVsc2UgeyAvKiBhYnNfb2Zmc2V0IDw9IFNURVBfVEhSRVNIT0xEICovCisKKwkJaWYgKEcucG9sbF9leHAgPCBNSU5QT0xMICYmIEcuaW5pdGlhbF9wb2xsX2NvbXBsZXRlKSB7CisJCQlWRVJCMyBiYl9lcnJvcl9tc2coInNtYWxsIG9mZnNldDolZiwgZGlzYWJsaW5nIGJ1cnN0IG1vZGUiLCBvZmZzZXQpOworCQkJRy5wb2xsYWRqX2NvdW50ID0gMDsKKwkJCUcucG9sbF9leHAgPSBNSU5QT0xMOworCQl9CisKKwkJLyogQ29tcHV0ZSB0aGUgY2xvY2sgaml0dGVyIGFzIHRoZSBSTVMgb2YgZXhwb25lbnRpYWxseQorCQkgKiB3ZWlnaHRlZCBvZmZzZXQgZGlmZmVyZW5jZXMuIFVzZWQgYnkgdGhlIHBvbGwgYWRqdXN0IGNvZGUuCisJCSAqLworCQlldGVtcCA9IFNRVUFSRShHLmRpc2NpcGxpbmVfaml0dGVyKTsKKwkJZHRlbXAgPSBTUVVBUkUoTUFYRChmYWJzKG9mZnNldCAtIEcubGFzdF91cGRhdGVfb2Zmc2V0KSwgR19wcmVjaXNpb25fc2VjKSk7CisJCUcuZGlzY2lwbGluZV9qaXR0ZXIgPSBTUVJUKGV0ZW1wICsgKGR0ZW1wIC0gZXRlbXApIC8gQVZHKTsKKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJkaXNjaXBsaW5lIGppdHRlcj0lZiIsIEcuZGlzY2lwbGluZV9qaXR0ZXIpOworCisJCXN3aXRjaCAoRy5kaXNjaXBsaW5lX3N0YXRlKSB7CisJCWNhc2UgU1RBVEVfTlNFVDoKKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3EpIHsKKwkJCQkvKiBXZSB3ZXJlIG9ubHkgYXNrZWQgdG8gc2V0IHRpbWUgb25jZS4KKwkJCQkgKiBUaGUgY2xvY2sgaXMgcHJlY2lzZSBlbm91Z2gsIG5vIG5lZWQgdG8gc3RlcC4KKwkJCQkgKi8KKwkJCQlleGl0KDApOworCQkJfQorI2lmIFVTSU5HX0lOSVRJQUxfRlJFUV9FU1RJTUFUSU9OCisJCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgcmVjZWl2ZWQgYW5kIHRoZSBmcmVxdWVuY3kKKwkJCSAqIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gVGhlIGZpcnN0IHRoaW5nIHRvIGRvCisJCQkgKiBpcyBkaXJlY3RseSBtZWFzdXJlIHRoZSBvc2NpbGxhdG9yIGZyZXF1ZW5jeS4KKwkJCSAqLworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfRlJFUSwgb2Zmc2V0LCByZWN2X3RpbWUpOworI2Vsc2UKKwkJCXNldF9uZXdfdmFsdWVzKFNUQVRFX1NZTkMsIG9mZnNldCwgcmVjdl90aW1lKTsKKyNlbmRpZgorCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJ0cmFuc2l0aW9uaW5nIHRvIEZSRVEsIGRhdGFwb2ludCBpZ25vcmVkIik7CisJCQlyZXR1cm4gMDsgLyogImxlYXZlIHBvbGwgaW50ZXJ2YWwgYXMgaXMiICovCisKKyNpZiAwIC8qIHRoaXMgaXMgZGVhZCBjb2RlIGZvciBub3cgKi8KKwkJY2FzZSBTVEFURV9GU0VUOgorCQkJLyogVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIGFuZCB0aGUgZnJlcXVlbmN5CisJCQkgKiBoYXMgYmVlbiBpbml0aWFsaXplZC4gQWRqdXN0IHRoZSBwaGFzZSwgYnV0CisJCQkgKiBkb24ndCBhZGp1c3QgdGhlIGZyZXF1ZW5jeSB1bnRpbCB0aGUgbmV4dCB1cGRhdGUuCisJCQkgKi8KKwkJCXNldF9uZXdfdmFsdWVzKFNUQVRFX1NZTkMsIG9mZnNldCwgcmVjdl90aW1lKTsKKwkJCS8qIGZyZXFfZHJpZnQgcmVtYWlucyAwICovCisJCQlicmVhazsKKyNlbmRpZgorCisjaWYgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKwkJY2FzZSBTVEFURV9GUkVROgorCQkJLyogc2luY2VfbGFzdF91cGRhdGUgPj0gV0FUQ0hfVEhSRVNIT0xELCB3ZSB3YWl0ZWQgZW5vdWdoLgorCQkJICogQ29ycmVjdCB0aGUgcGhhc2UgYW5kIGZyZXF1ZW5jeSBhbmQgc3dpdGNoIHRvIFNZTkMgc3RhdGUuCisJCQkgKiBmcmVxX2RyaWZ0IHdhcyBhbHJlYWR5IGVzdGltYXRlZCAoc2VlIGNvZGUgYWJvdmUpCisJCQkgKi8KKwkJCXNldF9uZXdfdmFsdWVzKFNUQVRFX1NZTkMsIG9mZnNldCwgcmVjdl90aW1lKTsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJZGVmYXVsdDoKKyNpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJCQkvKiBDb21wdXRlIGZyZXFfZHJpZnQgZHVlIHRvIFBMTCBhbmQgRkxMIGNvbnRyaWJ1dGlvbnMuCisJCQkgKgorCQkJICogVGhlIEZMTCBhbmQgUExMIGZyZXF1ZW5jeSBnYWluIGNvbnN0YW50cworCQkJICogZGVwZW5kIG9uIHRoZSBwb2xsIGludGVydmFsIGFuZCBBbGxhbgorCQkJICogaW50ZXJjZXB0LiBUaGUgRkxMIGlzIG5vdCB1c2VkIGJlbG93IG9uZS1oYWxmCisJCQkgKiB0aGUgQWxsYW4gaW50ZXJjZXB0LiBBYm92ZSB0aGF0IHRoZSBsb29wIGdhaW4KKwkJCSAqIGluY3JlYXNlcyBpbiBzdGVwcyB0byAxIC8gQVZHLgorCQkJICovCisJCQlpZiAoKDEgPDwgRy5wb2xsX2V4cCkgPiBBTExBTiAvIDIpIHsKKwkJCQlldGVtcCA9IEZMTCAtIEcucG9sbF9leHA7CisJCQkJaWYgKGV0ZW1wIDwgQVZHKQorCQkJCQlldGVtcCA9IEFWRzsKKwkJCQlmcmVxX2RyaWZ0ICs9IChvZmZzZXQgLSBHLmxhc3RfdXBkYXRlX29mZnNldCkgLyAoTUFYRChzaW5jZV9sYXN0X3VwZGF0ZSwgQUxMQU4pICogZXRlbXApOworCQkJfQorCQkJLyogRm9yIHRoZSBQTEwgdGhlIGludGVncmF0aW9uIGludGVydmFsCisJCQkgKiAobnVtZXJhdG9yKSBpcyB0aGUgbWluaW11bSBvZiB0aGUgdXBkYXRlCisJCQkgKiBpbnRlcnZhbCBhbmQgcG9sbCBpbnRlcnZhbC4gVGhpcyBhbGxvd3MKKwkJCSAqIG92ZXJzYW1wbGluZywgYnV0IG5vdCB1bmRlcnNhbXBsaW5nLgorCQkJICovCisJCQlldGVtcCA9IE1JTkQoc2luY2VfbGFzdF91cGRhdGUsICgxIDw8IEcucG9sbF9leHApKTsKKwkJCWR0ZW1wID0gKDQgKiBQTEwpIDw8IEcucG9sbF9leHA7CisJCQlmcmVxX2RyaWZ0ICs9IG9mZnNldCAqIGV0ZW1wIC8gU1FVQVJFKGR0ZW1wKTsKKyNlbmRpZgorCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKEcuc3RyYXR1bSAhPSBwLT5sYXN0cGt0X3N0cmF0dW0gKyAxKSB7CisJCQlHLnN0cmF0dW0gPSBwLT5sYXN0cGt0X3N0cmF0dW0gKyAxOworCQkJcnVuX3NjcmlwdCgic3RyYXR1bSIsIG9mZnNldCk7CisJCX0KKwl9CisKKwlHLnJlZnRpbWUgPSBHLmN1cl90aW1lOworCUcubnRwX3N0YXR1cyA9IHAtPmxhc3Rwa3Rfc3RhdHVzOworCUcucmVmaWQgPSBwLT5sYXN0cGt0X3JlZmlkOworCUcucm9vdGRlbGF5ID0gcC0+bGFzdHBrdF9yb290ZGVsYXkgKyBwLT5sYXN0cGt0X2RlbGF5OworCWR0ZW1wID0gcC0+ZmlsdGVyX2ppdHRlcjsgLy8gU1FSVChTUVVBUkUocC0+ZmlsdGVyX2ppdHRlcikgKyBTUVVBUkUoRy5jbHVzdGVyX2ppdHRlcikpOworCWR0ZW1wICs9IE1BWEQocC0+ZmlsdGVyX2Rpc3BlcnNpb24gKyBGUkVRX1RPTEVSQU5DRSAqIChHLmN1cl90aW1lIC0gcC0+bGFzdHBrdF9yZWN2X3RpbWUpICsgYWJzX29mZnNldCwgTUlORElTUCk7CisJRy5yb290ZGlzcCA9IHAtPmxhc3Rwa3Rfcm9vdGRpc3AgKyBkdGVtcDsKKwlWRVJCMyBiYl9lcnJvcl9tc2coInVwZGF0aW5nIGxlYXAvcmVmaWQvcmVmdGltZS9yb290ZGlzcCBmcm9tIHBlZXIgJXMiLCBwLT5wX2RvdHRlZCk7CisKKwkvKiBXZSBhcmUgaW4gU1RBVEVfU1lOQyBub3csIGJ1dCBkaWQgbm90IGRvIGFkanRpbWV4IHlldC4KKwkgKiAoQW55IG90aGVyIHN0YXRlIGRvZXMgbm90IHJlYWNoIHRoaXMsIHRoZXkgYWxsIHJldHVybiBlYXJsaWVyKQorCSAqIEJ5IHRoaXMgdGltZSwgZnJlcV9kcmlmdCBhbmQgRy5sYXN0X3VwZGF0ZV9vZmZzZXQgYXJlIHNldAorCSAqIHRvIHZhbHVlcyBzdWl0YWJsZSBmb3IgYWRqdGltZXguCisJICovCisjaWYgIVVTSU5HX0tFUk5FTF9QTExfTE9PUAorCS8qIENhbGN1bGF0ZSB0aGUgbmV3IGZyZXF1ZW5jeSBkcmlmdCBhbmQgZnJlcXVlbmN5IHN0YWJpbGl0eSAod2FuZGVyKS4KKwkgKiBDb21wdXRlIHRoZSBjbG9jayB3YW5kZXIgYXMgdGhlIFJNUyBvZiBleHBvbmVudGlhbGx5IHdlaWdodGVkCisJICogZnJlcXVlbmN5IGRpZmZlcmVuY2VzLiBUaGlzIGlzIG5vdCB1c2VkIGRpcmVjdGx5LCBidXQgY2FuLAorCSAqIGFsb25nIHdpdGggdGhlIGppdHRlciwgYmUgYSBoaWdobHkgdXNlZnVsIG1vbml0b3JpbmcgYW5kCisJICogZGVidWdnaW5nIHRvb2wuCisJICovCisJZHRlbXAgPSBHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCArIGZyZXFfZHJpZnQ7CisJRy5kaXNjaXBsaW5lX2ZyZXFfZHJpZnQgPSBNQVhEKE1JTkQoTUFYRFJJRlQsIGR0ZW1wKSwgLU1BWERSSUZUKTsKKwlldGVtcCA9IFNRVUFSRShHLmRpc2NpcGxpbmVfd2FuZGVyKTsKKwlkdGVtcCA9IFNRVUFSRShkdGVtcCk7CisJRy5kaXNjaXBsaW5lX3dhbmRlciA9IFNRUlQoZXRlbXAgKyAoZHRlbXAgLSBldGVtcCkgLyBBVkcpOworCisJVkVSQjMgYmJfZXJyb3JfbXNnKCJkaXNjaXBsaW5lIGZyZXFfZHJpZnQ9JS45ZihpbnQ6JWxkIGNvcnI6JWUpIHdhbmRlcj0lZiIsCisJCQlHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCwKKwkJCShsb25nKShHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCAqIDY1NTM2ZTYpLAorCQkJZnJlcV9kcmlmdCwKKwkJCUcuZGlzY2lwbGluZV93YW5kZXIpOworI2VuZGlmCisJVkVSQjMgeworCQltZW1zZXQoJnRteCwgMCwgc2l6ZW9mKHRteCkpOworCQlpZiAoYWRqdGltZXgoJnRteCkgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhZGp0aW1leCIpOworCQlWRVJCMyBiYl9lcnJvcl9tc2coInAgYWRqdGltZXggZnJlcTolbGQgb2Zmc2V0OiVsZCBjb25zdGFudDolbGQgc3RhdHVzOjB4JXgiLAorCQkJCXRteC5mcmVxLCB0bXgub2Zmc2V0LCB0bXguY29uc3RhbnQsIHRteC5zdGF0dXMpOworCX0KKworCW1lbXNldCgmdG14LCAwLCBzaXplb2YodG14KSk7CisjaWYgMAorLy9kb2Vzbid0IHdvcmssIG9mZnNldCByZW1haW5zIDAgKCEpIGluIGtlcm5lbDoKKy8vbnRwZDogIHNldCBhZGp0aW1leCBmcmVxOjE3ODYwOTcgdG14Lm9mZnNldDo3NzQ4NworLy9udHBkOiBwcmV2IGFkanRpbWV4IGZyZXE6MTc4NjA5NyB0bXgub2Zmc2V0OjAKKy8vbnRwZDogIGN1ciBhZGp0aW1leCBmcmVxOjE3ODYwOTcgdG14Lm9mZnNldDowCisJdG14Lm1vZGVzID0gQURKX0ZSRVFVRU5DWSB8IEFESl9PRkZTRVQ7CisJLyogNjU1MzYgaXMgb25lIHBwbSAqLworCXRteC5mcmVxID0gRy5kaXNjaXBsaW5lX2ZyZXFfZHJpZnQgKiA2NTUzNmU2OworCXRteC5vZmZzZXQgPSBHLmxhc3RfdXBkYXRlX29mZnNldCAqIDEwMDAwMDA7IC8qIHVzZWMgKi8KKyNlbmRpZgorCXRteC5tb2RlcyA9IEFESl9PRkZTRVQgfCBBREpfU1RBVFVTIHwgQURKX1RJTUVDT05TVDsvLyB8IEFESl9NQVhFUlJPUiB8IEFESl9FU1RFUlJPUjsKKwl0bXgub2Zmc2V0ID0gKEcubGFzdF91cGRhdGVfb2Zmc2V0ICogMTAwMDAwMCk7IC8qIHVzZWMgKi8KKwkJCS8qICsgKEcubGFzdF91cGRhdGVfb2Zmc2V0IDwgMCA/IC0wLjUgOiAwLjUpIC0gdG9vIHNtYWxsIHRvIGJvdGhlciAqLworCXRteC5zdGF0dXMgPSBTVEFfUExMOworCWlmIChHLm50cF9zdGF0dXMgJiBMSV9QTFVTU0VDKQorCQl0bXguc3RhdHVzIHw9IFNUQV9JTlM7CisJaWYgKEcubnRwX3N0YXR1cyAmIExJX01JTlVTU0VDKQorCQl0bXguc3RhdHVzIHw9IFNUQV9ERUw7CisJdG14LmNvbnN0YW50ID0gRy5wb2xsX2V4cCAtIDQ7CisJLy90bXguZXN0ZXJyb3IgPSAodV9pbnQzMikoY2xvY2tfaml0dGVyICogMWU2KTsKKwkvL3RteC5tYXhlcnJvciA9ICh1X2ludDMyKSgoc3lzX3Jvb3RkZWxheSAvIDIgKyBzeXNfcm9vdGRpc3ApICogMWU2KTsKKwlyYyA9IGFkanRpbWV4KCZ0bXgpOworCWlmIChyYyA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYWRqdGltZXgiKTsKKwkvKiBOQjogaGVyZSBrZXJuZWwgcmV0dXJucyBjb25zdGFudCA9PSBHLnBvbGxfZXhwLCBub3QgPT0gRy5wb2xsX2V4cCAtIDQuCisJICogTm90IHN1cmUgd2h5LiBQZXJoYXBzIGl0IGlzIG5vcm1hbC4KKwkgKi8KKwlWRVJCMyBiYl9lcnJvcl9tc2coImFkanRpbWV4OiVkIGZyZXE6JWxkIG9mZnNldDolbGQgY29uc3RhbnQ6JWxkIHN0YXR1czoweCV4IiwKKwkJCQlyYywgdG14LmZyZXEsIHRteC5vZmZzZXQsIHRteC5jb25zdGFudCwgdG14LnN0YXR1cyk7CisjaWYgMAorCVZFUkIzIHsKKwkJLyogYWx3YXlzIGdpdmVzIHRoZSBzYW1lIG91dHB1dCBhcyBhYm92ZSBtc2cgKi8KKwkJbWVtc2V0KCZ0bXgsIDAsIHNpemVvZih0bXgpKTsKKwkJaWYgKGFkanRpbWV4KCZ0bXgpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYWRqdGltZXgiKTsKKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJjIGFkanRpbWV4IGZyZXE6JWxkIG9mZnNldDolbGQgY29uc3RhbnQ6JWxkIHN0YXR1czoweCV4IiwKKwkJCQl0bXguZnJlcSwgdG14Lm9mZnNldCwgdG14LmNvbnN0YW50LCB0bXguc3RhdHVzKTsKKwl9CisjZW5kaWYKKwlHLmtlcm5lbF9mcmVxX2RyaWZ0ID0gdG14LmZyZXEgLyA2NTUzNjsKKwlWRVJCMiBiYl9lcnJvcl9tc2coInVwZGF0ZSBwZWVyOiVzLCBvZmZzZXQ6JWYsIGNsb2NrIGRyaWZ0OiVsZCBwcG0iLAorCQkJcC0+cF9kb3R0ZWQsIEcubGFzdF91cGRhdGVfb2Zmc2V0LCBHLmtlcm5lbF9mcmVxX2RyaWZ0KTsKKworCXJldHVybiAxOyAvKiAib2sgdG8gaW5jcmVhc2UgcG9sbCBpbnRlcnZhbCIgKi8KK30KKworCisvKgorICogV2UndmUgZ290IGEgbmV3IHJlcGx5IHBhY2tldCBmcm9tIGEgcGVlciwgcHJvY2VzcyBpdAorICogKGhlbHBlcnMgZmlyc3QpCisgKi8KK3N0YXRpYyB1bnNpZ25lZAorcmV0cnlfaW50ZXJ2YWwodm9pZCkKK3sKKwkvKiBMb2NhbCBwcm9ibGVtLCB3YW50IHRvIHJldHJ5IHNvb24gKi8KKwl1bnNpZ25lZCBpbnRlcnZhbCwgcjsKKwlpbnRlcnZhbCA9IFJFVFJZX0lOVEVSVkFMOworCXIgPSByYW5kb20oKTsKKwlpbnRlcnZhbCArPSByICUgKHVuc2lnbmVkKShSRVRSWV9JTlRFUlZBTCAvIDQpOworCVZFUkIzIGJiX2Vycm9yX21zZygiY2hvc2UgcmV0cnkgaW50ZXJ2YWw6JXUiLCBpbnRlcnZhbCk7CisJcmV0dXJuIGludGVydmFsOworfQorc3RhdGljIHVuc2lnbmVkCitwb2xsX2ludGVydmFsKGludCBleHBvbmVudCkKK3sKKwl1bnNpZ25lZCBpbnRlcnZhbCwgcjsKKwlleHBvbmVudCA9IEcucG9sbF9leHAgKyBleHBvbmVudDsKKwlpZiAoZXhwb25lbnQgPCAwKQorCQlleHBvbmVudCA9IDA7CisJaW50ZXJ2YWwgPSAxIDw8IGV4cG9uZW50OworCXIgPSByYW5kb20oKTsKKwlpbnRlcnZhbCArPSAoKHIgJiAoaW50ZXJ2YWwtMSkpID4+IDQpICsgKChyID4+IDgpICYgMSk7IC8qICsgMS8xNiBvZiBpbnRlcnZhbCwgbWF4ICovCisJVkVSQjMgYmJfZXJyb3JfbXNnKCJjaG9zZSBwb2xsIGludGVydmFsOiV1IChwb2xsX2V4cDolZCBleHA6JWQpIiwgaW50ZXJ2YWwsIEcucG9sbF9leHAsIGV4cG9uZW50KTsKKwlyZXR1cm4gaW50ZXJ2YWw7Cit9CitzdGF0aWMgTk9JTkxJTkUgdm9pZAorcmVjdl9hbmRfcHJvY2Vzc19wZWVyX3BrdChwZWVyX3QgKnApCit7CisJaW50ICAgICAgICAgcmM7CisJc3NpemVfdCAgICAgc2l6ZTsKKwltc2dfdCAgICAgICBtc2c7CisJZG91YmxlICAgICAgVDEsIFQyLCBUMywgVDQ7CisJdW5zaWduZWQgICAgaW50ZXJ2YWw7CisJZGF0YXBvaW50X3QgKmRhdGFwb2ludDsKKwlwZWVyX3QgICAgICAqcTsKKworCS8qIFdlIGNhbiByZWN2ZnJvbSBoZXJlIGFuZCBjaGVjayBmcm9tLklQLCBidXQgc29tZSBtdWx0aWhvbWVkCisJICogbnRwIHNlcnZlcnMgcmVwbHkgZnJvbSB0aGVpciAqb3RoZXIgSVAqLgorCSAqIFRPRE86IG1heWJlIHdlIHNob3VsZCBjaGVjayBhdCBsZWFzdCB3aGF0IHdlIGNhbjogZnJvbS5wb3J0ID09IDEyMz8KKwkgKi8KKwlzaXplID0gcmVjdihwLT5wX2ZkLCAmbXNnLCBzaXplb2YobXNnKSwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoc2l6ZSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJyZWN2KCVzKSBlcnJvciIsIHAtPnBfZG90dGVkKTsKKwkJaWYgKGVycm5vID09IEVIT1NUVU5SRUFDSCB8fCBlcnJubyA9PSBFSE9TVERPV04KKwkJIHx8IGVycm5vID09IEVORVRVTlJFQUNIIHx8IGVycm5vID09IEVORVRET1dOCisJCSB8fCBlcnJubyA9PSBFQ09OTlJFRlVTRUQgfHwgZXJybm8gPT0gRUFERFJOT1RBVkFJTAorCQkgfHwgZXJybm8gPT0gRUFHQUlOCisJCSkgeworLy9UT0RPOiBhbHdheXMgZG8gdGhpcz8KKwkJCWludGVydmFsID0gcmV0cnlfaW50ZXJ2YWwoKTsKKwkJCWdvdG8gc2V0X25leHRfYW5kX2Nsb3NlX3NvY2s7CisJCX0KKwkJeGZ1bmNfZGllKCk7CisJfQorCisJaWYgKHNpemUgIT0gTlRQX01TR1NJWkVfTk9BVVRIICYmIHNpemUgIT0gTlRQX01TR1NJWkUpIHsKKwkJYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgcGFja2V0IHJlY2VpdmVkIGZyb20gJXMiLCBwLT5wX2RvdHRlZCk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAobXNnLm1fb3JndGltZS5pbnRfcGFydGwgIT0gcC0+cF94bXRfbXNnLm1feG10dGltZS5pbnRfcGFydGwKKwkgfHwgbXNnLm1fb3JndGltZS5mcmFjdGlvbmwgIT0gcC0+cF94bXRfbXNnLm1feG10dGltZS5mcmFjdGlvbmwKKwkpIHsKKwkJZ290byBiYWlsOworCX0KKworCWlmICgobXNnLm1fc3RhdHVzICYgTElfQUxBUk0pID09IExJX0FMQVJNCisJIHx8IG1zZy5tX3N0cmF0dW0gPT0gMAorCSB8fCBtc2cubV9zdHJhdHVtID4gTlRQX01BWFNUUkFUVU0KKwkpIHsKKy8vIFRPRE86IHN0cmF0dW0gMCByZXNwb25zZXMgbWF5IGhhdmUgY29tbWFuZHMgaW4gMzItYml0IG1fcmVmaWQgZmllbGQ6CisvLyAiREVOWSIsICJSU1RSIiAtIHBlZXIgZG9lcyBub3QgbGlrZSB1cyBhdCBhbGwKKy8vICJSQVRFIiAtIHBlZXIgaXMgb3ZlcmxvYWRlZCwgcmVkdWNlIHBvbGxpbmcgZnJlcQorCQlpbnRlcnZhbCA9IHBvbGxfaW50ZXJ2YWwoMCk7CisJCWJiX2Vycm9yX21zZygicmVwbHkgZnJvbSAlczogbm90IHN5bmNlZCwgbmV4dCBxdWVyeSBpbiAldXMiLCBwLT5wX2RvdHRlZCwgaW50ZXJ2YWwpOworCQlnb3RvIHNldF9uZXh0X2FuZF9jbG9zZV9zb2NrOworCX0KKworLy8JLyogVmVyaWZ5IHZhbGlkIHJvb3QgZGlzdGFuY2UgKi8KKy8vCWlmIChtc2cubV9yb290ZGVsYXkgLyAyICsgbXNnLm1fcm9vdGRpc3AgPj0gTUFYRElTUCB8fCBwLT5sYXN0cGt0X3JlZnRpbWUgPiBtc2cubV94bXQpCisvLwkJcmV0dXJuOyAgICAgICAgICAgICAgICAgLyogaW52YWxpZCBoZWFkZXIgdmFsdWVzICovCisKKwlwLT5sYXN0cGt0X3N0YXR1cyA9IG1zZy5tX3N0YXR1czsKKwlwLT5sYXN0cGt0X3N0cmF0dW0gPSBtc2cubV9zdHJhdHVtOworCXAtPmxhc3Rwa3Rfcm9vdGRlbGF5ID0gc2ZwX3RvX2QobXNnLm1fcm9vdGRlbGF5KTsKKwlwLT5sYXN0cGt0X3Jvb3RkaXNwID0gc2ZwX3RvX2QobXNnLm1fcm9vdGRpc3ApOworCXAtPmxhc3Rwa3RfcmVmaWQgPSBtc2cubV9yZWZpZDsKKworCS8qCisJICogRnJvbSBSRkMgMjAzMCAod2l0aCBhIGNvcnJlY3Rpb24gdG8gdGhlIGRlbGF5IG1hdGgpOgorCSAqCisJICogVGltZXN0YW1wIE5hbWUgICAgICAgICAgSUQgICBXaGVuIEdlbmVyYXRlZAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIE9yaWdpbmF0ZSBUaW1lc3RhbXAgICAgIFQxICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgY2xpZW50CisJICogUmVjZWl2ZSBUaW1lc3RhbXAgICAgICAgVDIgICB0aW1lIHJlcXVlc3QgcmVjZWl2ZWQgYnkgc2VydmVyCisJICogVHJhbnNtaXQgVGltZXN0YW1wICAgICAgVDMgICB0aW1lIHJlcGx5IHNlbnQgYnkgc2VydmVyCisJICogRGVzdGluYXRpb24gVGltZXN0YW1wICAgVDQgICB0aW1lIHJlcGx5IHJlY2VpdmVkIGJ5IGNsaWVudAorCSAqCisJICogVGhlIHJvdW5kdHJpcCBkZWxheSBhbmQgbG9jYWwgY2xvY2sgb2Zmc2V0IGFyZSBkZWZpbmVkIGFzCisJICoKKwkgKiBkZWxheSA9IChUNCAtIFQxKSAtIChUMyAtIFQyKTsgb2Zmc2V0ID0gKChUMiAtIFQxKSArIChUMyAtIFQ0KSkgLyAyCisJICovCisJVDEgPSBwLT5wX3htdHRpbWU7CisJVDIgPSBsZnBfdG9fZChtc2cubV9yZWN0aW1lKTsKKwlUMyA9IGxmcF90b19kKG1zZy5tX3htdHRpbWUpOworCVQ0ID0gRy5jdXJfdGltZTsKKworCXAtPmxhc3Rwa3RfcmVjdl90aW1lID0gVDQ7CisKKwlWRVJCNSBiYl9lcnJvcl9tc2coIiVzLT5sYXN0cGt0X3JlY3ZfdGltZT0lZiIsIHAtPnBfZG90dGVkLCBwLT5sYXN0cGt0X3JlY3ZfdGltZSk7CisJcC0+ZGF0YXBvaW50X2lkeCA9IHAtPnJlYWNoYWJsZV9iaXRzID8gKHAtPmRhdGFwb2ludF9pZHggKyAxKSAlIE5VTV9EQVRBUE9JTlRTIDogMDsKKwlkYXRhcG9pbnQgPSAmcC0+ZmlsdGVyX2RhdGFwb2ludFtwLT5kYXRhcG9pbnRfaWR4XTsKKwlkYXRhcG9pbnQtPmRfcmVjdl90aW1lID0gVDQ7CisJZGF0YXBvaW50LT5kX29mZnNldCAgICA9ICgoVDIgLSBUMSkgKyAoVDMgLSBUNCkpIC8gMjsKKwkvKiBUaGUgZGVsYXkgY2FsY3VsYXRpb24gaXMgYSBzcGVjaWFsIGNhc2UuIEluIGNhc2VzIHdoZXJlIHRoZQorCSAqIHNlcnZlciBhbmQgY2xpZW50IGNsb2NrcyBhcmUgcnVubmluZyBhdCBkaWZmZXJlbnQgcmF0ZXMgYW5kCisJICogd2l0aCB2ZXJ5IGZhc3QgbmV0d29ya3MsIHRoZSBkZWxheSBjYW4gYXBwZWFyIG5lZ2F0aXZlLiBJbgorCSAqIG9yZGVyIHRvIGF2b2lkIHZpb2xhdGluZyB0aGUgUHJpbmNpcGxlIG9mIExlYXN0IEFzdG9uaXNobWVudCwKKwkgKiB0aGUgZGVsYXkgaXMgY2xhbXBlZCBub3QgbGVzcyB0aGFuIHRoZSBzeXN0ZW0gcHJlY2lzaW9uLgorCSAqLworCXAtPmxhc3Rwa3RfZGVsYXkgPSAoVDQgLSBUMSkgLSAoVDMgLSBUMik7CisJaWYgKHAtPmxhc3Rwa3RfZGVsYXkgPCBHX3ByZWNpc2lvbl9zZWMpCisJCXAtPmxhc3Rwa3RfZGVsYXkgPSBHX3ByZWNpc2lvbl9zZWM7CisJZGF0YXBvaW50LT5kX2Rpc3BlcnNpb24gPSBMT0cyRChtc2cubV9wcmVjaXNpb25fZXhwKSArIEdfcHJlY2lzaW9uX3NlYzsKKwlpZiAoIXAtPnJlYWNoYWJsZV9iaXRzKSB7CisJCS8qIDFzdCBkYXRhcG9pbnQgZXZlciAtIHJlcGxpY2F0ZSBvZmZzZXQgaW4gZXZlcnkgZWxlbWVudCAqLworCQlpbnQgaTsKKwkJZm9yIChpID0gMTsgaSA8IE5VTV9EQVRBUE9JTlRTOyBpKyspIHsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQgPSBkYXRhcG9pbnQtPmRfb2Zmc2V0OworCQl9CisJfQorCisJcC0+cmVhY2hhYmxlX2JpdHMgfD0gMTsKKwlpZiAoKE1BWF9WRVJCT1NFICYmIEcudmVyYm9zZSkgfHwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdykpIHsKKwkJYmJfZXJyb3JfbXNnKCJyZXBseSBmcm9tICVzOiByZWFjaCAweCUwMnggb2Zmc2V0ICVmIGRlbGF5ICVmIHN0YXR1cyAweCUwMnggc3RyYXQgJWQgcmVmaWQgMHglMDh4IHJvb3RkZWxheSAlZiIsCisJCQlwLT5wX2RvdHRlZCwKKwkJCXAtPnJlYWNoYWJsZV9iaXRzLAorCQkJZGF0YXBvaW50LT5kX29mZnNldCwKKwkJCXAtPmxhc3Rwa3RfZGVsYXksCisJCQlwLT5sYXN0cGt0X3N0YXR1cywKKwkJCXAtPmxhc3Rwa3Rfc3RyYXR1bSwKKwkJCXAtPmxhc3Rwa3RfcmVmaWQsCisJCQlwLT5sYXN0cGt0X3Jvb3RkZWxheQorCQkJLyogbm90IHNob3duOiBtX3Bwb2xsLCBtX3ByZWNpc2lvbl9leHAsIG1fcm9vdGRpc3AsCisJCQkgKiBtX3JlZnRpbWUsIG1fb3JndGltZSwgbV9yZWN0aW1lLCBtX3htdHRpbWUKKwkJCSAqLworCQkpOworCX0KKworCS8qIE11Y2sgd2l0aCBzdGF0aWN0aWNzIGFuZCB1cGRhdGUgdGhlIGNsb2NrICovCisJZmlsdGVyX2RhdGFwb2ludHMocCk7CisJcSA9IHNlbGVjdF9hbmRfY2x1c3RlcigpOworCXJjID0gLTE7CisJaWYgKHEpIHsKKwkJcmMgPSAwOworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX3cpKSB7CisJCQlyYyA9IHVwZGF0ZV9sb2NhbF9jbG9jayhxKTsKKwkJCS8qIElmIGRyaWZ0IGlzIGRhbmdlcm91c2x5IGxhcmdlLCBpbW1lZGlhdGVseQorCQkJICogZHJvcCBwb2xsIGludGVydmFsIG9uZSBzdGVwIGRvd24uCisJCQkgKi8KKwkJCWlmIChmYWJzKHEtPmZpbHRlcl9vZmZzZXQpID49IFBPTExET1dOX09GRlNFVCkgeworCQkJCVZFUkIzIGJiX2Vycm9yX21zZygib2Zmc2V0OiVmID4gUE9MTERPV05fT0ZGU0VUIiwgcS0+ZmlsdGVyX29mZnNldCk7CisJCQkJZ290byBwb2xsX2Rvd247CisJCQl9CisJCX0KKwl9CisJLyogZWxzZTogbm8gcGVlciBzZWxlY3RlZCwgcmMgPSAtMTogd2Ugd2FudCB0byBwb2xsIG1vcmUgb2Z0ZW4gKi8KKworCWlmIChyYyAhPSAwKSB7CisJCS8qIEFkanVzdCB0aGUgcG9sbCBpbnRlcnZhbCBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgb2Zmc2V0CisJCSAqIHdpdGggdGhlIGNsb2NrIGppdHRlci4gSWYgdGhlIG9mZnNldCBpcyBsZXNzIHRoYW4KKwkJICogdGhlIGNsb2NrIGppdHRlciB0aW1lcyBhIGNvbnN0YW50LCB0aGVuIHRoZSBhdmVyYWdpbmcgaW50ZXJ2YWwKKwkJICogaXMgaW5jcmVhc2VkLCBvdGhlcndpc2UgaXQgaXMgZGVjcmVhc2VkLiBBIGJpdCBvZiBoeXN0ZXJlc2lzCisJCSAqIGhlbHBzIGNhbG0gdGhlIGRhbmNlLiBXb3JrcyBiZXN0IHVzaW5nIGJ1cnN0IG1vZGUuCisJCSAqLworCQlWRVJCNCBpZiAocmMgPiAwKSB7CisJCQliYl9lcnJvcl9tc2coIm9mZnNldDolZiBQT0xMQURKX0dBVEUqZGlzY2lwbGluZV9qaXR0ZXI6JWYgcG9sbDolcyIsCisJCQkJcS0+ZmlsdGVyX29mZnNldCwgUE9MTEFESl9HQVRFICogRy5kaXNjaXBsaW5lX2ppdHRlciwKKwkJCQlmYWJzKHEtPmZpbHRlcl9vZmZzZXQpIDwgUE9MTEFESl9HQVRFICogRy5kaXNjaXBsaW5lX2ppdHRlcgorCQkJCQk/ICJncm93cyIgOiAiZmFsbHMiCisJCQkpOworCQl9CisJCWlmIChyYyA+IDAgJiYgZmFicyhxLT5maWx0ZXJfb2Zmc2V0KSA8IFBPTExBREpfR0FURSAqIEcuZGlzY2lwbGluZV9qaXR0ZXIpIHsKKwkJCS8qIHdhcyArPSBHLnBvbGxfZXhwIGJ1dCBpdCBpcyBhIGJpdAorCQkJICogdG9vIG9wdGltaXN0aWMgZm9yIG15IHRhc3RlIGF0IGhpZ2ggcG9sbF9leHAncyAqLworCQkJRy5wb2xsYWRqX2NvdW50ICs9IE1JTlBPTEw7CisJCQlpZiAoRy5wb2xsYWRqX2NvdW50ID4gUE9MTEFESl9MSU1JVCkgeworCQkJCUcucG9sbGFkal9jb3VudCA9IDA7CisJCQkJaWYgKEcucG9sbF9leHAgPCBNQVhQT0xMKSB7CisJCQkJCUcucG9sbF9leHArKzsKKwkJCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJwb2xsYWRqOiBkaXNjaXBsaW5lX2ppdHRlcjolZiArK3BvbGxfZXhwPSVkIiwKKwkJCQkJCQlHLmRpc2NpcGxpbmVfaml0dGVyLCBHLnBvbGxfZXhwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVZFUkIzIGJiX2Vycm9yX21zZygicG9sbGFkajogaW5jcjolZCIsIEcucG9sbGFkal9jb3VudCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlHLnBvbGxhZGpfY291bnQgLT0gRy5wb2xsX2V4cCAqIDI7CisJCQlpZiAoRy5wb2xsYWRqX2NvdW50IDwgLVBPTExBREpfTElNSVQgfHwgRy5wb2xsX2V4cCA+PSBCSUdQT0xMKSB7CisgcG9sbF9kb3duOgorCQkJCUcucG9sbGFkal9jb3VudCA9IDA7CisJCQkJaWYgKEcucG9sbF9leHAgPiBNSU5QT0xMKSB7CisJCQkJCWxsaXN0X3QgKml0ZW07CisKKwkJCQkJRy5wb2xsX2V4cC0tOworCQkJCQkvKiBDb3JyZWN0IHAtPm5leHRfYWN0aW9uX3RpbWUgaW4gZWFjaCBwZWVyCisJCQkJCSAqIHdoaWNoIHdhaXRzIGZvciBzZW5kaW5nLCBzbyB0aGF0IHRoZXkgc2VuZCBlYXJsaWVyLgorCQkJCQkgKiBPbGQgcHAtPm5leHRfYWN0aW9uX3RpbWUgYXJlIG9uIHRoZSBvcmRlcgorCQkJCQkgKiBvZiB0ICsgKDEgPDwgb2xkX3BvbGxfZXhwKSArIHNtYWxsX3JhbmRvbSwKKwkJCQkJICogd2Ugc2ltcGx5IG5lZWQgdG8gc3VidHJhY3QgfmhhbGYgb2YgdGhhdC4KKwkJCQkJICovCisJCQkJCWZvciAoaXRlbSA9IEcubnRwX3BlZXJzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5saW5rKSB7CisJCQkJCQlwZWVyX3QgKnBwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCQkJCQkJaWYgKHBwLT5wX2ZkIDwgMCkKKwkJCQkJCQlwcC0+bmV4dF9hY3Rpb25fdGltZSAtPSAoMSA8PCBHLnBvbGxfZXhwKTsKKwkJCQkJfQorCQkJCQlWRVJCMyBiYl9lcnJvcl9tc2coInBvbGxhZGo6IGRpc2NpcGxpbmVfaml0dGVyOiVmIC0tcG9sbF9leHA9JWQiLAorCQkJCQkJCUcuZGlzY2lwbGluZV9qaXR0ZXIsIEcucG9sbF9leHApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJwb2xsYWRqOiBkZWNyOiVkIiwgRy5wb2xsYWRqX2NvdW50KTsKKwkJCX0KKwkJfQorCX0KKworCS8qIERlY2lkZSB3aGVuIHRvIHNlbmQgbmV3IHF1ZXJ5IGZvciB0aGlzIHBlZXIgKi8KKwlpbnRlcnZhbCA9IHBvbGxfaW50ZXJ2YWwoMCk7CisKKyBzZXRfbmV4dF9hbmRfY2xvc2Vfc29jazoKKwlzZXRfbmV4dChwLCBpbnRlcnZhbCk7CisJLyogV2UgZG8gbm90IGV4cGVjdCBhbnkgbW9yZSBwYWNrZXRzIGZyb20gdGhpcyBwZWVyIGZvciBub3cuCisJICogQ2xvc2luZyB0aGUgc29ja2V0IGluZm9ybXMga2VybmVsIGFib3V0IGl0LgorCSAqIFdlIG9wZW4gYSBuZXcgc29ja2V0IHdoZW4gd2Ugc2VuZCBhIG5ldyBxdWVyeS4KKwkgKi8KKwljbG9zZShwLT5wX2ZkKTsKKwlwLT5wX2ZkID0gLTE7CisgYmFpbDoKKwlyZXR1cm47Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorc3RhdGljIE5PSU5MSU5FIHZvaWQKK3JlY3ZfYW5kX3Byb2Nlc3NfY2xpZW50X3BrdCh2b2lkIC8qaW50IGZkKi8pCit7CisJc3NpemVfdCAgICAgICAgICBzaXplOworCS8vdWludDhfdCAgICAgICAgICB2ZXJzaW9uOworCWxlbl9hbmRfc29ja2FkZHIgKnRvOworCXN0cnVjdCBzb2NrYWRkciAgKmZyb207CisJbXNnX3QgICAgICAgICAgICBtc2c7CisJdWludDhfdCAgICAgICAgICBxdWVyeV9zdGF0dXM7CisJbF9maXhlZHB0X3QgICAgICBxdWVyeV94bXR0aW1lOworCisJdG8gPSBnZXRfc29ja19sc2EoRy5saXN0ZW5fZmQpOworCWZyb20gPSB4emFsbG9jKHRvLT5sZW4pOworCisJc2l6ZSA9IHJlY3ZfZnJvbV90byhHLmxpc3Rlbl9mZCwgJm1zZywgc2l6ZW9mKG1zZyksIE1TR19ET05UV0FJVCwgZnJvbSwgJnRvLT51LnNhLCB0by0+bGVuKTsKKwlpZiAoc2l6ZSAhPSBOVFBfTVNHU0laRV9OT0FVVEggJiYgc2l6ZSAhPSBOVFBfTVNHU0laRSkgeworCQljaGFyICphZGRyOworCQlpZiAoc2l6ZSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQkJZ290byBiYWlsOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWN2Iik7CisJCX0KKwkJYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChmcm9tKTsKKwkJYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgcGFja2V0IHJlY2VpdmVkIGZyb20gJXM6IHNpemUgJXUiLCBhZGRyLCAoaW50KXNpemUpOworCQlmcmVlKGFkZHIpOworCQlnb3RvIGJhaWw7CisJfQorCisJcXVlcnlfc3RhdHVzID0gbXNnLm1fc3RhdHVzOworCXF1ZXJ5X3htdHRpbWUgPSBtc2cubV94bXR0aW1lOworCisJLyogQnVpbGQgYSByZXBseSBwYWNrZXQgKi8KKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tX3N0YXR1cyA9IEcuc3RyYXR1bSA8IE1BWFNUUkFUID8gRy5udHBfc3RhdHVzIDogTElfQUxBUk07CisJbXNnLm1fc3RhdHVzIHw9IChxdWVyeV9zdGF0dXMgJiBWRVJTSU9OX01BU0spOworCW1zZy5tX3N0YXR1cyB8PSAoKHF1ZXJ5X3N0YXR1cyAmIE1PREVfTUFTSykgPT0gTU9ERV9DTElFTlQpID8KKwkJCSBNT0RFX1NFUlZFUiA6IE1PREVfU1lNX1BBUzsKKwltc2cubV9zdHJhdHVtID0gRy5zdHJhdHVtOworCW1zZy5tX3Bwb2xsID0gRy5wb2xsX2V4cDsKKwltc2cubV9wcmVjaXNpb25fZXhwID0gR19wcmVjaXNpb25fZXhwOworCS8qIHRoaXMgdGltZSB3YXMgb2J0YWluZWQgYmV0d2VlbiBwb2xsKCkgYW5kIHJlY3YoKSAqLworCW1zZy5tX3JlY3RpbWUgPSBkX3RvX2xmcChHLmN1cl90aW1lKTsKKwltc2cubV94bXR0aW1lID0gZF90b19sZnAoZ2V0dGltZTE5MDBkKCkpOyAvKiB0aGlzIGluc3RhbnQgKi8KKwlpZiAoRy5wZWVyX2NudCA9PSAwKSB7CisJCS8qIHdlIGhhdmUgbm8gcGVlcnM6ICJzdHJhdHVtIDEgc2VydmVyIiBtb2RlLiByZWZ0aW1lID0gb3VyIG93biB0aW1lICovCisJCUcucmVmdGltZSA9IEcuY3VyX3RpbWU7CisJfQorCW1zZy5tX3JlZnRpbWUgPSBkX3RvX2xmcChHLnJlZnRpbWUpOworCW1zZy5tX29yZ3RpbWUgPSBxdWVyeV94bXR0aW1lOworCW1zZy5tX3Jvb3RkZWxheSA9IGRfdG9fc2ZwKEcucm9vdGRlbGF5KTsKKy8vc2ltcGxlIGNvZGUgZG9lcyBub3QgZG8gdGhpcywgZml4IHNpbXBsZSBjb2RlIQorCW1zZy5tX3Jvb3RkaXNwID0gZF90b19zZnAoRy5yb290ZGlzcCk7CisJLy92ZXJzaW9uID0gKHF1ZXJ5X3N0YXR1cyAmIFZFUlNJT05fTUFTSyk7IC8qIC4uLiA+PiBWRVJTSU9OX1NISUZUIC0gZG9uZSBiZWxvdyBpbnN0ZWFkICovCisJbXNnLm1fcmVmaWQgPSBHLnJlZmlkOyAvLyAodmVyc2lvbiA+ICgzIDw8IFZFUlNJT05fU0hJRlQpKSA/IEcucmVmaWQgOiBHLnJlZmlkMzsKKworCS8qIFdlIHJlcGx5IGZyb20gdGhlIGxvY2FsIGFkZHJlc3MgcGFja2V0IHdhcyBzZW50IHRvLAorCSAqIHRoaXMgbWFrZXMgdG8vZnJvbSBsb29rIHN3YXBwZWQgaGVyZTogKi8KKwlkb19zZW5kdG8oRy5saXN0ZW5fZmQsCisJCS8qZnJvbToqLyAmdG8tPnUuc2EsIC8qdG86Ki8gZnJvbSwgLyphZGRybGVuOiovIHRvLT5sZW4sCisJCSZtc2csIHNpemUpOworCisgYmFpbDoKKwlmcmVlKHRvKTsKKwlmcmVlKGZyb20pOworfQorI2VuZGlmCisKKy8qIFVwc3RyZWFtIG50cGQncyBvcHRpb25zOgorICoKKyAqIC00ICAgRm9yY2UgRE5TIHJlc29sdXRpb24gb2YgaG9zdCBuYW1lcyB0byB0aGUgSVB2NCBuYW1lc3BhY2UuCisgKiAtNiAgIEZvcmNlIEROUyByZXNvbHV0aW9uIG9mIGhvc3QgbmFtZXMgdG8gdGhlIElQdjYgbmFtZXNwYWNlLgorICogLWEgICBSZXF1aXJlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24gZm9yIGJyb2FkY2FzdCBjbGllbnQsCisgKiAgICAgIG11bHRpY2FzdCBjbGllbnQgYW5kIHN5bW1ldHJpYyBwYXNzaXZlIGFzc29jaWF0aW9ucy4KKyAqICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KKyAqIC1BICAgRG8gbm90IHJlcXVpcmUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiBmb3IgYnJvYWRjYXN0IGNsaWVudCwKKyAqICAgICAgbXVsdGljYXN0IGNsaWVudCBhbmQgc3ltbWV0cmljIHBhc3NpdmUgYXNzb2NpYXRpb25zLgorICogICAgICBUaGlzIGlzIGFsbW9zdCBuZXZlciBhIGdvb2QgaWRlYS4KKyAqIC1iICAgRW5hYmxlIHRoZSBjbGllbnQgdG8gc3luY2hyb25pemUgdG8gYnJvYWRjYXN0IHNlcnZlcnMuCisgKiAtYyBjb25mZmlsZQorICogICAgICBTcGVjaWZ5IHRoZSBuYW1lIGFuZCBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsCisgKiAgICAgIGRlZmF1bHQgL2V0Yy9udHAuY29uZgorICogLWQgICBTcGVjaWZ5IGRlYnVnZ2luZyBtb2RlLiBUaGlzIG9wdGlvbiBtYXkgb2NjdXIgbW9yZSB0aGFuIG9uY2UsCisgKiAgICAgIHdpdGggZWFjaCBvY2N1cnJlbmNlIGluZGljYXRpbmcgZ3JlYXRlciBkZXRhaWwgb2YgZGlzcGxheS4KKyAqIC1EIGxldmVsCisgKiAgICAgIFNwZWNpZnkgZGVidWdnaW5nIGxldmVsIGRpcmVjdGx5LgorICogLWYgZHJpZnRmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGZyZXF1ZW5jeSBmaWxlLgorICogICAgICBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgImRyaWZ0ZmlsZSBGSUxFIgorICogICAgICBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtZyAgIE5vcm1hbGx5LCBudHBkIGV4aXRzIHdpdGggYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nCisgKiAgICAgIGlmIHRoZSBvZmZzZXQgZXhjZWVkcyB0aGUgcGFuaWMgdGhyZXNob2xkLCB3aGljaCBpcyAxMDAwIHMKKyAqICAgICAgYnkgZGVmYXVsdC4gVGhpcyBvcHRpb24gYWxsb3dzIHRoZSB0aW1lIHRvIGJlIHNldCB0byBhbnkgdmFsdWUKKyAqICAgICAgd2l0aG91dCByZXN0cmljdGlvbjsgaG93ZXZlciwgdGhpcyBjYW4gaGFwcGVuIG9ubHkgb25jZS4KKyAqICAgICAgSWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZCBhZnRlciB0aGF0LCBudHBkIHdpbGwgZXhpdAorICogICAgICB3aXRoIGEgbWVzc2FnZSB0byB0aGUgc3lzdGVtIGxvZy4gVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQKKyAqICAgICAgd2l0aCB0aGUgLXEgYW5kIC14IG9wdGlvbnMuIFNlZSB0aGUgdGlua2VyIGNvbW1hbmQgZm9yIG90aGVyIG9wdGlvbnMuCisgKiAtaSBqYWlsZGlyCisgKiAgICAgIENocm9vdCB0aGUgc2VydmVyIHRvIHRoZSBkaXJlY3RvcnkgamFpbGRpci4gVGhpcyBvcHRpb24gYWxzbyBpbXBsaWVzCisgKiAgICAgIHRoYXQgdGhlIHNlcnZlciBhdHRlbXB0cyB0byBkcm9wIHJvb3QgcHJpdmlsZWdlcyBhdCBzdGFydHVwCisgKiAgICAgIChvdGhlcndpc2UsIGNocm9vdCBnaXZlcyB2ZXJ5IGxpdHRsZSBhZGRpdGlvbmFsIHNlY3VyaXR5KS4KKyAqICAgICAgWW91IG1heSBuZWVkIHRvIGFsc28gc3BlY2lmeSBhIC11IG9wdGlvbi4KKyAqIC1rIGtleWZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgc3ltbWV0cmljIGtleSBmaWxlLAorICogICAgICBkZWZhdWx0IC9ldGMvbnRwL2tleXMuIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uCisgKiAgICAgIGFzIHRoZSAia2V5cyBGSUxFIiBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtbCBsb2dmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGxvZyBmaWxlLiBUaGUgZGVmYXVsdAorICogICAgICBpcyB0aGUgc3lzdGVtIGxvZyBmaWxlLiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcworICogICAgICB0aGUgImxvZ2ZpbGUgRklMRSIgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLUwgICBEbyBub3QgbGlzdGVuIHRvIHZpcnR1YWwgSVBzLiBUaGUgZGVmYXVsdCBpcyB0byBsaXN0ZW4uCisgKiAtbiAgIERvbid0IGZvcmsuCisgKiAtTiAgIFRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICogICAgICBydW4gdGhlIG50cGQgYXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisgKiAtcCBwaWRmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGZpbGUgdXNlZCB0byByZWNvcmQgdGhlIG50cGQKKyAqICAgICAgcHJvY2VzcyBJRC4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlICJwaWRmaWxlIEZJTEUiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1QIHByaW9yaXR5CisgKiAgICAgIFRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICogICAgICBydW4gdGhlIG50cGQgYXQgdGhlIHNwZWNpZmllZCBwcmlvcml0eS4KKyAqIC1xICAgRXhpdCB0aGUgbnRwZCBqdXN0IGFmdGVyIHRoZSBmaXJzdCB0aW1lIHRoZSBjbG9jayBpcyBzZXQuCisgKiAgICAgIFRoaXMgYmVoYXZpb3IgbWltaWNzIHRoYXQgb2YgdGhlIG50cGRhdGUgcHJvZ3JhbSwgd2hpY2ggaXMKKyAqICAgICAgdG8gYmUgcmV0aXJlZC4gVGhlIC1nIGFuZCAteCBvcHRpb25zIGNhbiBiZSB1c2VkIHdpdGggdGhpcyBvcHRpb24uCisgKiAgICAgIE5vdGU6IFRoZSBrZXJuZWwgdGltZSBkaXNjaXBsaW5lIGlzIGRpc2FibGVkIHdpdGggdGhpcyBvcHRpb24uCisgKiAtciBicm9hZGNhc3RkZWxheQorICogICAgICBTcGVjaWZ5IHRoZSBkZWZhdWx0IHByb3BhZ2F0aW9uIGRlbGF5IGZyb20gdGhlIGJyb2FkY2FzdC9tdWx0aWNhc3QKKyAqICAgICAgc2VydmVyIHRvIHRoaXMgY2xpZW50LiBUaGlzIGlzIG5lY2Vzc2FyeSBvbmx5IGlmIHRoZSBkZWxheQorICogICAgICBjYW5ub3QgYmUgY29tcHV0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgcHJvdG9jb2wuCisgKiAtcyBzdGF0c2RpcgorICogICAgICBTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgcGF0aCBmb3IgZmlsZXMgY3JlYXRlZCBieSB0aGUgc3RhdGlzdGljcworICogICAgICBmYWNpbGl0eS4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlICJzdGF0c2RpciBESVIiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC10IGtleQorICogICAgICBBZGQgYSBrZXkgbnVtYmVyIHRvIHRoZSB0cnVzdGVkIGtleSBsaXN0LiBUaGlzIG9wdGlvbiBjYW4gb2NjdXIKKyAqICAgICAgbW9yZSB0aGFuIG9uY2UuCisgKiAtdSB1c2VyWzpncm91cF0KKyAqICAgICAgU3BlY2lmeSBhIHVzZXIsIGFuZCBvcHRpb25hbGx5IGEgZ3JvdXAsIHRvIHN3aXRjaCB0by4KKyAqIC12IHZhcmlhYmxlCisgKiAtViB2YXJpYWJsZQorICogICAgICBBZGQgYSBzeXN0ZW0gdmFyaWFibGUgbGlzdGVkIGJ5IGRlZmF1bHQuCisgKiAteCAgIE5vcm1hbGx5LCB0aGUgdGltZSBpcyBzbGV3ZWQgaWYgdGhlIG9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIHN0ZXAKKyAqICAgICAgdGhyZXNob2xkLCB3aGljaCBpcyAxMjggbXMgYnkgZGVmYXVsdCwgYW5kIHN0ZXBwZWQgaWYgYWJvdmUKKyAqICAgICAgdGhlIHRocmVzaG9sZC4gVGhpcyBvcHRpb24gc2V0cyB0aGUgdGhyZXNob2xkIHRvIDYwMCBzLCB3aGljaCBpcworICogICAgICB3ZWxsIHdpdGhpbiB0aGUgYWNjdXJhY3kgd2luZG93IHRvIHNldCB0aGUgY2xvY2sgbWFudWFsbHkuCisgKiAgICAgIE5vdGU6IHNpbmNlIHRoZSBzbGV3IHJhdGUgb2YgdHlwaWNhbCBVbml4IGtlcm5lbHMgaXMgbGltaXRlZAorICogICAgICB0byAwLjUgbXMvcywgZWFjaCBzZWNvbmQgb2YgYWRqdXN0bWVudCByZXF1aXJlcyBhbiBhbW9ydGl6YXRpb24KKyAqICAgICAgaW50ZXJ2YWwgb2YgMjAwMCBzLiBUaHVzLCBhbiBhZGp1c3RtZW50IGFzIG11Y2ggYXMgNjAwIHMKKyAqICAgICAgd2lsbCB0YWtlIGFsbW9zdCAxNCBkYXlzIHRvIGNvbXBsZXRlLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAorICogICAgICB3aXRoIHRoZSAtZyBhbmQgLXEgb3B0aW9ucy4gU2VlIHRoZSB0aW5rZXIgY29tbWFuZCBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqICAgICAgTm90ZTogVGhlIGtlcm5lbCB0aW1lIGRpc2NpcGxpbmUgaXMgZGlzYWJsZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqLworCisvKiBCeSBkb2luZyBpbml0IGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gd2UgZGVjcmVhc2Ugc3RhY2sgdXNhZ2UKKyAqIGluIG1haW4gbG9vcC4KKyAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgbnRwX2luaXQoY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwlsbGlzdF90ICpwZWVyczsKKworCXNyYW5kb20oZ2V0cGlkKCkpOworCisJaWYgKGdldHVpZCgpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisKKwkvKiBTZXQgc29tZSBnbG9iYWxzICovCisJRy5zdHJhdHVtID0gTUFYU1RSQVQ7CisJaWYgKEJVUlNUUE9MTCAhPSAwKQorCQlHLnBvbGxfZXhwID0gQlVSU1RQT0xMOyAvKiBzcGVlZHMgdXAgaW5pdGlhbCBzeW5jICovCisJRy5sYXN0X3NjcmlwdF9ydW4gPSBHLnJlZnRpbWUgPSBHLmxhc3RfdXBkYXRlX3JlY3ZfdGltZSA9IGdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgdG9vICovCisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJcGVlcnMgPSBOVUxMOworCW9wdF9jb21wbGVtZW50YXJ5ID0gImRkOnA6OnduIjsgLyogZDogY291bnRlcjsgcDogbGlzdDsgLXcgaW1wbGllcyAtbiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkJIm5xTngiIC8qIGNvbXBhdCAqLworCQkJIndwOlM6IklGX0ZFQVRVUkVfTlRQRF9TRVJWRVIoImwiKSAvKiBOT1QgY29tcGF0ICovCisJCQkiZCIgLyogY29tcGF0ICovCisJCQkiNDZhQWJnTCIsIC8qIGNvbXBhdCwgaWdub3JlZCAqLworCQkJJnBlZXJzLCAmRy5zY3JpcHRfbmFtZSwgJkcudmVyYm9zZSk7CisJaWYgKCEob3B0cyAmIChPUFRfcHxPUFRfbCkpKQorCQliYl9zaG93X3VzYWdlKCk7CisvLwlpZiAob3B0cyAmIE9QVF94KSAvKiBkaXNhYmxlIHN0ZXBwaW5nLCBvbmx5IHNsZXcgaXMgYWxsb3dlZCAqLworLy8JCUcudGltZV93YXNfc3RlcHBlZCA9IDE7CisJaWYgKHBlZXJzKSB7CisJCXdoaWxlIChwZWVycykKKwkJCWFkZF9wZWVycyhsbGlzdF9wb3AoJnBlZXJzKSk7CisJfSBlbHNlIHsKKwkJLyogLWwgYnV0IG5vIHBlZXJzOiAic3RyYXR1bSAxIHNlcnZlciIgbW9kZSAqLworCQlHLnN0cmF0dW0gPSAxOworCX0KKwlpZiAoIShvcHRzICYgT1BUX24pKSB7CisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fREVWTlVMTF9TVERJTywgYXJndik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJRy5saXN0ZW5fZmQgPSAtMTsKKwlpZiAob3B0cyAmIE9QVF9sKSB7CisJCUcubGlzdGVuX2ZkID0gY3JlYXRlX2FuZF9iaW5kX2RncmFtX29yX2RpZShOVUxMLCAxMjMpOworCQlzb2NrZXRfd2FudF9wa3RpbmZvKEcubGlzdGVuX2ZkKTsKKwkJc2V0c29ja29wdChHLmxpc3Rlbl9mZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAmY29uc3RfSVBUT1NfTE9XREVMQVksIHNpemVvZihjb25zdF9JUFRPU19MT1dERUxBWSkpOworCX0KKyNlbmRpZgorCS8qIEkgaGVzaXRhdGUgdG8gc2V0IC0yMCBwcmlvLiAtMTUgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIGZvciB0aW1la2VlcGluZyAqLworCWlmIChvcHRzICYgT1BUX04pCisJCXNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgLTE1KTsKKworCS8qIElmIG5ldHdvcmsgaXMgdXAsIHN5bmNyb25pemF0aW9uIG9jY3VycyBpbiB+MTAgc2Vjb25kcy4KKwkgKiBXZSBnaXZlICJudHBkIC1xIiAxMCBzZWNvbmRzIHRvIGdldCBmaXJzdCByZXBseSwKKwkgKiB0aGVuIGFub3RoZXIgNTAgc2Vjb25kcyB0byBmaW5pc2ggc3luY2luZy4KKwkgKgorCSAqIEkgdGVzdGVkIG50cGQgNC4yLjZwMSBhbmQgYXBwYXJlbnRseSBpdCBuZXZlciBleGl0cworCSAqICh3aWxsIHRyeSBmb3JldmVyKSwgYnV0IGl0IGRvZXMgbm90IGZlZWwgcmlnaHQuCisJICogVGhlIGdvYWwgb2YgLXEgaXMgdG8gYWN0IGxpa2UgbnRwZGF0ZTogc2V0IHRpbWUKKwkgKiBhZnRlciBhIHJlYXNvbmFibHkgc21hbGwgcGVyaW9kIG9mIHBvbGxpbmcsIG9yIGZhaWwuCisJICovCisJaWYgKG9wdHMgJiBPUFRfcSkgeworCQlvcHRpb25fbWFzazMyIHw9IE9QVF9xcTsKKwkJYWxhcm0oMTApOworCX0KKworCWJiX3NpZ25hbHMoMAorCQl8ICgxIDw8IFNJR1RFUk0pCisJCXwgKDEgPDwgU0lHSU5UKQorCQl8ICgxIDw8IFNJR0FMUk0pCisJCSwgcmVjb3JkX3NpZ25vCisJKTsKKwliYl9zaWduYWxzKDAKKwkJfCAoMSA8PCBTSUdQSVBFKQorCQl8ICgxIDw8IFNJR0NITEQpCisJCSwgU0lHX0lHTgorCSk7Cit9CisKK2ludCBudHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbnRwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjdW5kZWYgRworCXN0cnVjdCBnbG9iYWxzIEc7CisJc3RydWN0IHBvbGxmZCAqcGZkOworCXBlZXJfdCAqKmlkeDJwZWVyOworCXVuc2lnbmVkIGNudDsKKworCW1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsKKwlTRVRfUFRSX1RPX0dMT0JBTFMoJkcpOworCisJbnRwX2luaXQoYXJndik7CisKKwkvKiBJZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUiwgKyAxIGZvciBsaXN0ZW5fZmQ6ICovCisJY250ID0gRy5wZWVyX2NudCArIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSOworCWlkeDJwZWVyID0geHphbGxvYyhzaXplb2YoaWR4MnBlZXJbMF0pICogY250KTsKKwlwZmQgPSB4emFsbG9jKHNpemVvZihwZmRbMF0pICogY250KTsKKworCS8qIENvdW50ZG93bjogd2UgbmV2ZXIgc3luYyBiZWZvcmUgd2Ugc2VudCBJTklUSUFMX1NBTVBMRVMrMQorCSAqIHBhY2tldHMgdG8gZWFjaCBwZWVyLgorCSAqIE5COiBpZiBzb21lIHBlZXIgaXMgbm90IHJlc3BvbmRpbmcsIHdlIG1heSBlbmQgdXAgc2VuZGluZworCSAqIGZld2VyIHBhY2tldHMgdG8gaXQgYW5kIG1vcmUgdG8gb3RoZXIgcGVlcnMuCisJICogTkIyOiBzeW5jIHVzdWFsbHkgaGFwcGVucyB1c2luZyBJTklUSUFMX1NBTVBMRVMgcGFja2V0cywKKwkgKiBzaW5jZSBsYXN0IHJlcGx5IGRvZXMgbm90IGNvbWUgYmFjayBpbnN0YW50YW5lb3VzbHkuCisJICovCisJY250ID0gRy5wZWVyX2NudCAqIChJTklUSUFMX1NBTVBMRVMgKyAxKTsKKworCXdoaWxlICghYmJfZ290X3NpZ25hbCkgeworCQlsbGlzdF90ICppdGVtOworCQl1bnNpZ25lZCBpLCBqOworCQlpbnQgbmZkcywgdGltZW91dDsKKwkJZG91YmxlIG5leHRhY3Rpb247CisKKwkJLyogTm90aGluZyBiZXR3ZWVuIGhlcmUgYW5kIHBvbGwoKSBibG9ja3MgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lICovCisKKwkJbmV4dGFjdGlvbiA9IEcuY3VyX3RpbWUgKyAzNjAwOworCisJCWkgPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJCWlmIChHLmxpc3Rlbl9mZCAhPSAtMSkgeworCQkJcGZkWzBdLmZkID0gRy5saXN0ZW5fZmQ7CisJCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQkJaSsrOworCQl9CisjZW5kaWYKKwkJLyogUGFzcyBvdmVyIHBlZXIgbGlzdCwgc2VuZCByZXF1ZXN0cywgdGltZSBvdXQgb24gcmVjZWl2ZXMgKi8KKwkJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXBlZXJfdCAqcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKworCQkJaWYgKHAtPm5leHRfYWN0aW9uX3RpbWUgPD0gRy5jdXJfdGltZSkgeworCQkJCWlmIChwLT5wX2ZkID09IC0xKSB7CisJCQkJCS8qIFRpbWUgdG8gc2VuZCBuZXcgcmVxICovCisJCQkJCWlmICgtLWNudCA9PSAwKSB7CisJCQkJCQlHLmluaXRpYWxfcG9sbF9jb21wbGV0ZSA9IDE7CisJCQkJCX0KKwkJCQkJc2VuZF9xdWVyeV90b19wZWVyKHApOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFRpbWVkIG91dCB3YWl0aW5nIGZvciByZXBseSAqLworCQkJCQljbG9zZShwLT5wX2ZkKTsKKwkJCQkJcC0+cF9mZCA9IC0xOworCQkJCQl0aW1lb3V0ID0gcG9sbF9pbnRlcnZhbCgtMik7IC8qIC0yOiB0cnkgYSBiaXQgc29vbmVyICovCisJCQkJCWJiX2Vycm9yX21zZygidGltZWQgb3V0IHdhaXRpbmcgZm9yICVzLCByZWFjaCAweCUwMngsIG5leHQgcXVlcnkgaW4gJXVzIiwKKwkJCQkJCQlwLT5wX2RvdHRlZCwgcC0+cmVhY2hhYmxlX2JpdHMsIHRpbWVvdXQpOworCQkJCQlzZXRfbmV4dChwLCB0aW1lb3V0KTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwLT5uZXh0X2FjdGlvbl90aW1lIDwgbmV4dGFjdGlvbikKKwkJCQluZXh0YWN0aW9uID0gcC0+bmV4dF9hY3Rpb25fdGltZTsKKworCQkJaWYgKHAtPnBfZmQgPj0gMCkgeworCQkJCS8qIFdhaXQgZm9yIHJlcGx5IGZyb20gdGhpcyBwZWVyICovCisJCQkJcGZkW2ldLmZkID0gcC0+cF9mZDsKKwkJCQlwZmRbaV0uZXZlbnRzID0gUE9MTElOOworCQkJCWlkeDJwZWVyW2ldID0gcDsKKwkJCQlpKys7CisJCQl9CisJCX0KKworCQl0aW1lb3V0ID0gbmV4dGFjdGlvbiAtIEcuY3VyX3RpbWU7CisJCWlmICh0aW1lb3V0IDwgMCkKKwkJCXRpbWVvdXQgPSAwOworCQl0aW1lb3V0Kys7IC8qIChuZXh0YWN0aW9uIC0gRy5jdXJfdGltZSkgcm91bmRzIGRvd24sIGNvbXBlbnNhdGluZyAqLworCisJCS8qIEhlcmUgd2UgbWF5IGJsb2NrICovCisJCVZFUkIyIGJiX2Vycm9yX21zZygicG9sbCAldXMsIHNvY2tldHM6JXUsIHBvbGwgaW50ZXJ2YWw6JXVzIiwgdGltZW91dCwgaSwgMSA8PCBHLnBvbGxfZXhwKTsKKwkJbmZkcyA9IHBvbGwocGZkLCBpLCB0aW1lb3V0ICogMTAwMCk7CisJCWdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgKi8KKwkJaWYgKG5mZHMgPD0gMCkgeworCQkJaWYgKEcuc2NyaXB0X25hbWUgJiYgRy5jdXJfdGltZSAtIEcubGFzdF9zY3JpcHRfcnVuID4gMTEqNjApIHsKKwkJCQkvKiBVc2VmdWwgZm9yIHVwZGF0aW5nIGJhdHRlcnktYmFja2VkIFJUQyBhbmQgc3VjaCAqLworCQkJCXJ1bl9zY3JpcHQoInBlcmlvZGljIiwgRy5sYXN0X3VwZGF0ZV9vZmZzZXQpOworCQkJCWdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgKi8KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJvY2VzcyBhbnkgcmVjZWl2ZWQgcGFja2V0cyAqLworCQlqID0gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCQlpZiAoRy5saXN0ZW5fZmQgIT0gLTEpIHsKKwkJCWlmIChwZmRbMF0ucmV2ZW50cyAvKiAmIChQT0xMSU58UE9MTEVSUikqLykgeworCQkJCW5mZHMtLTsKKwkJCQlyZWN2X2FuZF9wcm9jZXNzX2NsaWVudF9wa3QoLypHLmxpc3Rlbl9mZCovKTsKKwkJCQlnZXR0aW1lMTkwMGQoKTsgLyogc2V0cyBHLmN1cl90aW1lICovCisJCQl9CisJCQlqID0gMTsKKwkJfQorI2VuZGlmCisJCWZvciAoOyBuZmRzICE9IDAgJiYgaiA8IGk7IGorKykgeworCQkJaWYgKHBmZFtqXS5yZXZlbnRzIC8qICYgKFBPTExJTnxQT0xMRVJSKSovKSB7CisJCQkJLyoKKwkJCQkgKiBBdCBpbml0LCBhbGFybSB3YXMgc2V0IHRvIDEwIHNlYy4KKwkJCQkgKiBOb3cgd2UgZGlkIGdldCBhIHJlcGx5LgorCQkJCSAqIEluY3JlYXNlIHRpbWVvdXQgdG8gNTAgc2Vjb25kcyB0byBmaW5pc2ggc3luY2luZy4KKwkJCQkgKi8KKwkJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9xcSkgeworCQkJCQlvcHRpb25fbWFzazMyICY9IH5PUFRfcXE7CisJCQkJCWFsYXJtKDUwKTsKKwkJCQl9CisJCQkJbmZkcy0tOworCQkJCXJlY3ZfYW5kX3Byb2Nlc3NfcGVlcl9wa3QoaWR4MnBlZXJbal0pOworCQkJCWdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgKi8KKwkJCX0KKwkJfQorCX0gLyogd2hpbGUgKCFiYl9nb3Rfc2lnbmFsKSAqLworCisJa2lsbF9teXNlbGZfd2l0aF9zaWcoYmJfZ290X3NpZ25hbCk7Cit9CisKKworCisKKworCisvKioqIG9wZW5udHBkLTQuNiB1c2VzIG9ubHkgYWRqdGltZSwgbm90IGFkanRpbWV4ICoqKi8KKworLyoqKiBudHAtNC4yLjYvbnRwZC9udHBfbG9vcGZpbHRlci5jIC0gYWRqdGltZXggdXNhZ2UgKioqLworCisjaWYgMAorc3RhdGljIGRvdWJsZQorZGlyZWN0X2ZyZXEoZG91YmxlIGZwX29mZnNldCkKK3sKKyNpZmRlZiBLRVJORUxfUExMCisJLyoKKwkgKiBJZiB0aGUga2VybmVsIGlzIGVuYWJsZWQsIHdlIG5lZWQgdGhlIHJlc2lkdWFsIG9mZnNldCB0bworCSAqIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IGNvcnJlY3Rpb24uCisJICovCisJaWYgKHBsbF9jb250cm9sICYmIGtlcm5fZW5hYmxlKSB7CisJCW1lbXNldCgmbnR2LCAwLCBzaXplb2YobnR2KSk7CisJCW50cF9hZGp0aW1lKCZudHYpOworI2lmZGVmIFNUQV9OQU5PCisJCWNsb2NrX29mZnNldCA9IG50di5vZmZzZXQgLyAxZTk7CisjZWxzZSAvKiBTVEFfTkFOTyAqLworCQljbG9ja19vZmZzZXQgPSBudHYub2Zmc2V0IC8gMWU2OworI2VuZGlmIC8qIFNUQV9OQU5PICovCisJCWRyaWZ0X2NvbXAgPSBGUkVRVE9EKG50di5mcmVxKTsKKwl9CisjZW5kaWYgLyogS0VSTkVMX1BMTCAqLworCXNldF9mcmVxKChmcF9vZmZzZXQgLSBjbG9ja19vZmZzZXQpIC8gKGN1cnJlbnRfdGltZSAtIGNsb2NrX2Vwb2NoKSArIGRyaWZ0X2NvbXApOworCXdhbmRlcl9yZXNpZCA9IDA7CisJcmV0dXJuIGRyaWZ0X2NvbXA7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZnJlcShkb3VibGUgZnJlcSkgLyogZnJlcXVlbmN5IHVwZGF0ZSAqLworeworCWNoYXIgdGJ1Zls4MF07CisKKwlkcmlmdF9jb21wID0gZnJlcTsKKworI2lmZGVmIEtFUk5FTF9QTEwKKwkvKgorCSAqIElmIHRoZSBrZXJuZWwgaXMgZW5hYmxlZCwgdXBkYXRlIHRoZSBrZXJuZWwgZnJlcXVlbmN5LgorCSAqLworCWlmIChwbGxfY29udHJvbCAmJiBrZXJuX2VuYWJsZSkgeworCQltZW1zZXQoJm50diwgMCwgc2l6ZW9mKG50dikpOworCQludHYubW9kZXMgPSBNT0RfRlJFUVVFTkNZOworCQludHYuZnJlcSA9IERUT0ZSRVEoZHJpZnRfY29tcCk7CisJCW50cF9hZGp0aW1lKCZudHYpOworCQlzbnByaW50Zih0YnVmLCBzaXplb2YodGJ1ZiksICJrZXJuZWwgJS4zZiBQUE0iLCBkcmlmdF9jb21wICogMWU2KTsKKwkJcmVwb3J0X2V2ZW50KEVWTlRfRlNFVCwgTlVMTCwgdGJ1Zik7CisJfSBlbHNlIHsKKwkJc25wcmludGYodGJ1Ziwgc2l6ZW9mKHRidWYpLCAibnRwZCAlLjNmIFBQTSIsIGRyaWZ0X2NvbXAgKiAxZTYpOworCQlyZXBvcnRfZXZlbnQoRVZOVF9GU0VULCBOVUxMLCB0YnVmKTsKKwl9CisjZWxzZSAvKiBLRVJORUxfUExMICovCisJc25wcmludGYodGJ1Ziwgc2l6ZW9mKHRidWYpLCAibnRwZCAlLjNmIFBQTSIsIGRyaWZ0X2NvbXAgKiAxZTYpOworCXJlcG9ydF9ldmVudChFVk5UX0ZTRVQsIE5VTEwsIHRidWYpOworI2VuZGlmIC8qIEtFUk5FTF9QTEwgKi8KK30KKworLi4uCisuLi4KKy4uLgorCisjaWZkZWYgS0VSTkVMX1BMTAorCS8qCisJICogVGhpcyBjb2RlIHNlZ21lbnQgd29ya3Mgd2hlbiBjbG9jayBhZGp1c3RtZW50cyBhcmUgbWFkZSB1c2luZworCSAqIHByZWNpc2lvbiB0aW1lIGtlcm5lbCBzdXBwb3J0IGFuZCB0aGUgbnRwX2FkanRpbWUoKSBzeXN0ZW0KKwkgKiBjYWxsLiBUaGlzIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGluIFNvbGFyaXMgMi42IGFuZCBsYXRlciwKKwkgKiBEaWdpdGFsIFVuaXggNC4wIGFuZCBsYXRlciwgRnJlZUJTRCwgTGludXggYW5kIHNwZWNpYWxseQorCSAqIG1vZGlmaWVkIGtlcm5lbHMgZm9yIEhQLVVYIDkgYW5kIFVsdHJpeCA0LiBJbiB0aGUgY2FzZSBvZiB0aGUKKwkgKiBERUNzdGF0aW9uIDUwMDAvMjQwIGFuZCBBbHBoYSBBWFAsIGFkZGl0aW9uYWwga2VybmVsCisJICogbW9kaWZpY2F0aW9ucyBwcm92aWRlIGEgdHJ1ZSBtaWNyb3NlY29uZCBjbG9jayBhbmQgbmFub3NlY29uZAorCSAqIGNsb2NrLCByZXNwZWN0aXZlbHkuCisJICoKKwkgKiBJbXBvcnRhbnQgbm90ZTogVGhlIGtlcm5lbCBkaXNjaXBsaW5lIGlzIHVzZWQgb25seSBpZiB0aGUKKwkgKiBzdGVwIHRocmVzaG9sZCBpcyBsZXNzIHRoYW4gMC41IHMsIGFzIGFueXRoaW5nIGhpZ2hlciBjYW4KKwkgKiBsZWFkIHRvIG92ZXJmbG93IHByb2JsZW1zLiBUaGlzIG1pZ2h0IG9jY3VyIGlmIHNvbWUgbWlzZ3VpZGVkCisJICogbGFkIHNldCB0aGUgc3RlcCB0aHJlc2hvbGQgdG8gc29tZXRoaW5nIHJpZGljdWxvdXMuCisJICovCisJaWYgKHBsbF9jb250cm9sICYmIGtlcm5fZW5hYmxlKSB7CisKKyNkZWZpbmUgTU9EX0JJVFMgKE1PRF9PRkZTRVQgfCBNT0RfTUFYRVJST1IgfCBNT0RfRVNURVJST1IgfCBNT0RfU1RBVFVTIHwgTU9EX1RJTUVDT05TVCkKKworCQkvKgorCQkgKiBXZSBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBudHBfYWRqdGltZSgpCisJCSAqIHN5c3RlbSBjYWxsLiBXZSBoYXZlIHRvIGNvbnZlcnQgZXZlcnl0aGluZyB0bworCQkgKiBtaWNyb3NlY29uZHMgb3IgbmFub3NlY29uZHMgZmlyc3QuIERvIG5vdCB1cGRhdGUgdGhlCisJCSAqIHN5c3RlbSB2YXJpYWJsZXMgaWYgdGhlIGV4dF9lbmFibGUgZmxhZyBpcyBzZXQuIEluCisJCSAqIHRoaXMgY2FzZSwgdGhlIGV4dGVybmFsIGNsb2NrIGRyaXZlciB3aWxsIHVwZGF0ZSB0aGUKKwkJICogdmFyaWFibGVzLCB3aGljaCB3aWxsIGJlIHJlYWQgbGF0ZXIgYnkgdGhlIGxvY2FsCisJCSAqIGNsb2NrIGRyaXZlci4gQWZ0ZXJ3YXJkcywgcmVtZW1iZXIgdGhlIHRpbWUgYW5kCisJCSAqIGZyZXF1ZW5jeSBvZmZzZXRzIGZvciBqaXR0ZXIgYW5kIHN0YWJpbGl0eSB2YWx1ZXMgYW5kCisJCSAqIHRvIHVwZGF0ZSB0aGUgZnJlcXVlbmN5IGZpbGUuCisJCSAqLworCQltZW1zZXQoJm50diwgIDAsIHNpemVvZihudHYpKTsKKwkJaWYgKGV4dF9lbmFibGUpIHsKKwkJCW50di5tb2RlcyA9IE1PRF9TVEFUVVM7CisJCX0gZWxzZSB7CisjaWZkZWYgU1RBX05BTk8KKwkJCW50di5tb2RlcyA9IE1PRF9CSVRTIHwgTU9EX05BTk87CisjZWxzZSAvKiBTVEFfTkFOTyAqLworCQkJbnR2Lm1vZGVzID0gTU9EX0JJVFM7CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwkJCWlmIChjbG9ja19vZmZzZXQgPCAwKQorCQkJCWR0ZW1wID0gLS41OworCQkJZWxzZQorCQkJCWR0ZW1wID0gLjU7CisjaWZkZWYgU1RBX05BTk8KKwkJCW50di5vZmZzZXQgPSAoaW50MzIpKGNsb2NrX29mZnNldCAqIDFlOSArIGR0ZW1wKTsKKwkJCW50di5jb25zdGFudCA9IHN5c19wb2xsOworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJCW50di5vZmZzZXQgPSAoaW50MzIpKGNsb2NrX29mZnNldCAqIDFlNiArIGR0ZW1wKTsKKwkJCW50di5jb25zdGFudCA9IHN5c19wb2xsIC0gNDsKKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCQkJbnR2LmVzdGVycm9yID0gKHVfaW50MzIpKGNsb2NrX2ppdHRlciAqIDFlNik7CisJCQludHYubWF4ZXJyb3IgPSAodV9pbnQzMikoKHN5c19yb290ZGVsYXkgLyAyICsgc3lzX3Jvb3RkaXNwKSAqIDFlNik7CisJCQludHYuc3RhdHVzID0gU1RBX1BMTDsKKworCQkJLyoKKwkJCSAqIEVuYWJsZS9kaXNhYmxlIHRoZSBQUFMgaWYgcmVxdWVzdGVkLgorCQkJICovCisJCQlpZiAocHBzX2VuYWJsZSkgeworCQkJCWlmICghKHBsbF9zdGF0dXMgJiBTVEFfUFBTVElNRSkpCisJCQkJCXJlcG9ydF9ldmVudChFVk5UX0tFUk4sCisJCQkJCSAgICBOVUxMLCAiUFBTIGVuYWJsZWQiKTsKKwkJCQludHYuc3RhdHVzIHw9IFNUQV9QUFNUSU1FIHwgU1RBX1BQU0ZSRVE7CisJCQl9IGVsc2UgeworCQkJCWlmIChwbGxfc3RhdHVzICYgU1RBX1BQU1RJTUUpCisJCQkJCXJlcG9ydF9ldmVudChFVk5UX0tFUk4sCisJCQkJCSAgICBOVUxMLCAiUFBTIGRpc2FibGVkIik7CisJCQkJbnR2LnN0YXR1cyAmPSB+KFNUQV9QUFNUSU1FIHwKKwkJCQkgICAgU1RBX1BQU0ZSRVEpOworCQkJfQorCQkJaWYgKHN5c19sZWFwID09IExFQVBfQUREU0VDT05EKQorCQkJCW50di5zdGF0dXMgfD0gU1RBX0lOUzsKKwkJCWVsc2UgaWYgKHN5c19sZWFwID09IExFQVBfREVMU0VDT05EKQorCQkJCW50di5zdGF0dXMgfD0gU1RBX0RFTDsKKwkJfQorCisJCS8qCisJCSAqIFBhc3MgdGhlIHN0dWZmIHRvIHRoZSBrZXJuZWwuIElmIGl0IHNxdWVhbHMsIHR1cm4gb2ZmCisJCSAqIHRoZSBwcHMuIEluIGFueSBjYXNlLCBmZXRjaCB0aGUga2VybmVsIG9mZnNldCwKKwkJICogZnJlcXVlbmN5IGFuZCBqaXR0ZXIuCisJCSAqLworCQlpZiAobnRwX2FkanRpbWUoJm50dikgPT0gVElNRV9FUlJPUikgeworCQkJaWYgKCEobnR2LnN0YXR1cyAmIFNUQV9QUFNTSUdOQUwpKQorCQkJCXJlcG9ydF9ldmVudChFVk5UX0tFUk4sIE5VTEwsCisJCQkJICAgICJQUFMgbm8gc2lnbmFsIik7CisJCX0KKwkJcGxsX3N0YXR1cyA9IG50di5zdGF0dXM7CisjaWZkZWYgU1RBX05BTk8KKwkJY2xvY2tfb2Zmc2V0ID0gbnR2Lm9mZnNldCAvIDFlOTsKKyNlbHNlIC8qIFNUQV9OQU5PICovCisJCWNsb2NrX29mZnNldCA9IG50di5vZmZzZXQgLyAxZTY7CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwkJY2xvY2tfZnJlcXVlbmN5ID0gRlJFUVRPRChudHYuZnJlcSk7CisKKwkJLyoKKwkJICogSWYgdGhlIGtlcm5lbCBQUFMgaXMgbGl0LCBtb25pdG9yIGl0cyBwZXJmb3JtYW5jZS4KKwkJICovCisJCWlmIChudHYuc3RhdHVzICYgU1RBX1BQU1RJTUUpIHsKKyNpZmRlZiBTVEFfTkFOTworCQkJY2xvY2tfaml0dGVyID0gbnR2LmppdHRlciAvIDFlOTsKKyNlbHNlIC8qIFNUQV9OQU5PICovCisJCQljbG9ja19qaXR0ZXIgPSBudHYuaml0dGVyIC8gMWU2OworI2VuZGlmIC8qIFNUQV9OQU5PICovCisJCX0KKworI2lmIGRlZmluZWQoU1RBX05BTk8pICYmIE5UUF9BUEkgPT0gNAorCQkvKgorCQkgKiBJZiB0aGUgVEFJIGNoYW5nZXMsIHVwZGF0ZSB0aGUga2VybmVsIFRBSS4KKwkJICovCisJCWlmIChsb29wX3RhaSAhPSBzeXNfdGFpKSB7CisJCQlsb29wX3RhaSA9IHN5c190YWk7CisJCQludHYubW9kZXMgPSBNT0RfVEFJOworCQkJbnR2LmNvbnN0YW50ID0gc3lzX3RhaTsKKwkJCW50cF9hZGp0aW1lKCZudHYpOworCQl9CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwl9CisjZW5kaWYgLyogS0VSTkVMX1BMTCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL250cGRfc2ltcGxlLmMgYi9uZXR3b3JraW5nL250cGRfc2ltcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkNDRlNAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbnRwZF9zaW1wbGUuYwpAQCAtMCwwICsxLDEwMDcgQEAKKy8qCisgKiBOVFAgY2xpZW50L3NlcnZlciwgYmFzZWQgb24gT3Blbk5UUEQgMy45cDEKKyAqCisgKiBBdXRob3I6IEFkYW0gVGthYyA8dm9uc2NoQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+IC8qIEZvciBJUFRPU19MT1dERUxBWSBkZWZpbml0aW9uICovCisjaWZuZGVmIElQVE9TX0xPV0RFTEFZCisjIGRlZmluZSBJUFRPU19MT1dERUxBWSAweDEwCisjZW5kaWYKKyNpZm5kZWYgSVBfUEtUSU5GTworIyBlcnJvciAiU29ycnksIHlvdXIga2VybmVsIGhhcyB0byBzdXBwb3J0IElQX1BLVElORk8iCisjZW5kaWYKKworCisvKiBTeW5jIHRvIHBlZXJzIGV2ZXJ5IE4gc2VjcyAqLworI2RlZmluZSBJTlRFUlZBTF9RVUVSWV9OT1JNQUwgICAgMzAKKyNkZWZpbmUgSU5URVJWQUxfUVVFUllfUEFUSEVUSUMgIDYwCisjZGVmaW5lIElOVEVSVkFMX1FVRVJZX0FHUkVTU0lWRSAgNQorCisvKiBCYWQgaWYgKmxlc3MgdGhhbiogVFJVU1RMRVZFTF9CQURQRUVSICovCisjZGVmaW5lIFRSVVNUTEVWRUxfQkFEUEVFUiAgICAgICAgNgorI2RlZmluZSBUUlVTVExFVkVMX1BBVEhFVElDICAgICAgIDIKKyNkZWZpbmUgVFJVU1RMRVZFTF9BR1JFU1NJVkUgICAgICA4CisjZGVmaW5lIFRSVVNUTEVWRUxfTUFYICAgICAgICAgICAxMAorCisjZGVmaW5lIFFTQ0FMRV9PRkZfTUlOICAgICAgICAgMC4wNQorI2RlZmluZSBRU0NBTEVfT0ZGX01BWCAgICAgICAgIDAuNTAKKworLyogU2luZ2xlIHF1ZXJ5IG1pZ2h0IHRha2UgTiBzZWNzIG1heCAqLworI2RlZmluZSBRVUVSWVRJTUVfTUFYICAgICAgICAgICAgMTUKKy8qIE1pbiBvZmZzZXQgZm9yIHNldHRpbWUgYXQgc3RhcnQuICJtYW4gbnRwZCIgc2F5cyBpdCdzIDEyOCBtcyAqLworI2RlZmluZSBTVEVQVElNRV9NSU5fT0ZGU0VUICAgMC4xMjgKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGludF9wYXJ0bDsKKwl1aW50MzJfdCBmcmFjdGlvbmw7Cit9IGxfZml4ZWRwdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgaW50X3BhcnRzOworCXVpbnQxNl90IGZyYWN0aW9uczsKK30gc19maXhlZHB0X3Q7CisKK2VudW0geworCU5UUF9ESUdFU1RTSVpFICAgICA9IDE2LAorCU5UUF9NU0dTSVpFX05PQVVUSCA9IDQ4LAorCU5UUF9NU0dTSVpFICAgICAgICA9IChOVFBfTVNHU0laRV9OT0FVVEggKyA0ICsgTlRQX0RJR0VTVFNJWkUpLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgICAgIG1fc3RhdHVzOyAgICAgLyogc3RhdHVzIG9mIGxvY2FsIGNsb2NrIGFuZCBsZWFwIGluZm8gKi8KKwl1aW50OF90ICAgICBtX3N0cmF0dW07ICAgIC8qIHN0cmF0dW0gbGV2ZWwgKi8KKwl1aW50OF90ICAgICBtX3Bwb2xsOyAgICAgIC8qIHBvbGwgdmFsdWUgKi8KKwlpbnQ4X3QgICAgICBtX3ByZWNpc2lvbl9leHA7CisJc19maXhlZHB0X3QgbV9yb290ZGVsYXk7CisJc19maXhlZHB0X3QgbV9kaXNwZXJzaW9uOworCXVpbnQzMl90ICAgIG1fcmVmaWQ7CisJbF9maXhlZHB0X3QgbV9yZWZ0aW1lOworCWxfZml4ZWRwdF90IG1fb3JndGltZTsKKwlsX2ZpeGVkcHRfdCBtX3JlY3RpbWU7CisJbF9maXhlZHB0X3QgbV94bXR0aW1lOworCXVpbnQzMl90ICAgIG1fa2V5aWQ7CisJdWludDhfdCAgICAgbV9kaWdlc3RbTlRQX0RJR0VTVFNJWkVdOworfSBtc2dfdDsKKworZW51bSB7CisJTlRQX1ZFUlNJT04gICAgID0gNCwKKwlOVFBfTUFYU1RSQVRVTSAgPSAxNSwKKworCS8qIFN0YXR1cyBNYXNrcyAqLworCU1PREVfTUFTSyAgICAgICA9ICg3IDw8IDApLAorCVZFUlNJT05fTUFTSyAgICA9ICg3IDw8IDMpLAorCVZFUlNJT05fU0hJRlQgICA9IDMsCisJTElfTUFTSyAgICAgICAgID0gKDMgPDwgNiksCisKKwkvKiBMZWFwIFNlY29uZCBDb2RlcyAoaGlnaCBvcmRlciB0d28gYml0cyBvZiBtX3N0YXR1cykgKi8KKwlMSV9OT1dBUk5JTkcgICAgPSAoMCA8PCA2KSwgICAgLyogbm8gd2FybmluZyAqLworCUxJX1BMVVNTRUMgICAgICA9ICgxIDw8IDYpLCAgICAvKiBhZGQgYSBzZWNvbmQgKDYxIHNlY29uZHMpICovCisJTElfTUlOVVNTRUMgICAgID0gKDIgPDwgNiksICAgIC8qIG1pbnVzIGEgc2Vjb25kICg1OSBzZWNvbmRzKSAqLworCUxJX0FMQVJNICAgICAgICA9ICgzIDw8IDYpLCAgICAvKiBhbGFybSBjb25kaXRpb24gKi8KKworCS8qIE1vZGUgdmFsdWVzICovCisJTU9ERV9SRVMwICAgICAgID0gMCwgICAgLyogcmVzZXJ2ZWQgKi8KKwlNT0RFX1NZTV9BQ1QgICAgPSAxLCAgICAvKiBzeW1tZXRyaWMgYWN0aXZlICovCisJTU9ERV9TWU1fUEFTICAgID0gMiwgICAgLyogc3ltbWV0cmljIHBhc3NpdmUgKi8KKwlNT0RFX0NMSUVOVCAgICAgPSAzLCAgICAvKiBjbGllbnQgKi8KKwlNT0RFX1NFUlZFUiAgICAgPSA0LCAgICAvKiBzZXJ2ZXIgKi8KKwlNT0RFX0JST0FEQ0FTVCAgPSA1LCAgICAvKiBicm9hZGNhc3QgKi8KKwlNT0RFX1JFUzEgICAgICAgPSA2LCAgICAvKiByZXNlcnZlZCBmb3IgTlRQIGNvbnRyb2wgbWVzc2FnZSAqLworCU1PREVfUkVTMiAgICAgICA9IDcsICAgIC8qIHJlc2VydmVkIGZvciBwcml2YXRlIHVzZSAqLworfTsKKworI2RlZmluZSBPRkZTRVRfMTkwMF8xOTcwIDIyMDg5ODg4MDBVTCAgLyogMTk3MCAtIDE5MDAgaW4gc2Vjb25kcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJZG91YmxlICAgZF9vZmZzZXQ7CisJZG91YmxlICAgZF9kZWxheTsKKwkvL1VOVVNFRDogZG91YmxlIGRfZXJyb3I7CisJdGltZV90ICAgZF9yY3ZfdGltZTsKKwl1aW50MzJfdCBkX3JlZmlkNDsKKwl1aW50OF90ICBkX2xlYXA7CisJdWludDhfdCAgZF9zdHJhdHVtOworCXVpbnQ4X3QgIGRfZ29vZDsKK30gZGF0YXBvaW50X3Q7CisKKyNkZWZpbmUgTlVNX0RBVEFQT0lOVFMgIDgKK3R5cGVkZWYgc3RydWN0IHsKKwlsZW5fYW5kX3NvY2thZGRyICpwX2xzYTsKKwljaGFyICAgICAgICAgICAgICpwX2RvdHRlZDsKKwkvKiBXaGVuIHRvIHNlbmQgbmV3IHF1ZXJ5IChpZiBwX2ZkID09IC0xKQorCSAqIG9yIHdoZW4gcmVjZWl2ZSB0aW1lcyBvdXQgKGlmIHBfZmQgPj0gMCk6ICovCisJdGltZV90ICAgICAgICAgICBuZXh0X2FjdGlvbl90aW1lOworCWludCAgICAgICAgICAgICAgcF9mZDsKKwl1aW50OF90ICAgICAgICAgIHBfZGF0YXBvaW50X2lkeDsKKwl1aW50OF90ICAgICAgICAgIHBfdHJ1c3RsZXZlbDsKKwlkb3VibGUgICAgICAgICAgIHBfeG10dGltZTsKKwlkYXRhcG9pbnRfdCAgICAgIHVwZGF0ZTsKKwlkYXRhcG9pbnRfdCAgICAgIHBfZGF0YXBvaW50W05VTV9EQVRBUE9JTlRTXTsKKwltc2dfdCAgICAgICAgICAgIHBfeG10X21zZzsKK30gcGVlcl90OworCitlbnVtIHsKKwlPUFRfbiA9ICgxIDw8IDApLAorCU9QVF9xID0gKDEgPDwgMSksCisJT1BUX04gPSAoMSA8PCAyKSwKKwlPUFRfeCA9ICgxIDw8IDMpLAorCS8qIEluc2VydCBuZXcgb3B0aW9ucyBhYm92ZSB0aGlzIGxpbmUuICovCisJLyogTm9uLWNvbXBhdCBvcHRpb25zOiAqLworCU9QVF9wID0gKDEgPDwgNCksCisJT1BUX2wgPSAoMSA8PCA1KSAqIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSLAorfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogdG90YWwgcm91bmQgdHJpcCBkZWxheSB0byBjdXJyZW50bHkgc2VsZWN0ZWQgcmVmZXJlbmNlIGNsb2NrICovCisJZG91YmxlICAgcm9vdGRlbGF5OworCS8qIHJlZmVyZW5jZSB0aW1lc3RhbXA6IHRpbWUgd2hlbiB0aGUgc3lzdGVtIGNsb2NrIHdhcyBsYXN0IHNldCBvciBjb3JyZWN0ZWQgKi8KKwlkb3VibGUgICByZWZ0aW1lOworCWxsaXN0X3QgICpudHBfcGVlcnM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwlpbnQgICAgICBsaXN0ZW5fZmQ7CisjZW5kaWYKKwl1bnNpZ25lZCB2ZXJib3NlOworCXVuc2lnbmVkIHBlZXJfY250OworCXVuc2lnbmVkIHNjYWxlOworCXVpbnQzMl90IHJlZmlkOworCXVpbnQzMl90IHJlZmlkNDsKKwl1aW50OF90ICBzeW5jZWQ7CisJdWludDhfdCAgbGVhcDsKKyNkZWZpbmUgR19wcmVjaXNpb25fZXhwIC02CisvLwlpbnQ4X3QgICBwcmVjaXNpb25fZXhwOworCXVpbnQ4X3QgIHN0cmF0dW07CisJdWludDhfdCAgdGltZV93YXNfc3RlcHBlZDsKKwl1aW50OF90ICBmaXJzdF9hZGpfZG9uZTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKworc3RhdGljIGNvbnN0IGludCBjb25zdF9JUFRPU19MT1dERUxBWSA9IElQVE9TX0xPV0RFTEFZOworCisKK3N0YXRpYyB2b2lkCitzZXRfbmV4dChwZWVyX3QgKnAsIHVuc2lnbmVkIHQpCit7CisJcC0+bmV4dF9hY3Rpb25fdGltZSA9IHRpbWUoTlVMTCkgKyB0OworfQorCitzdGF0aWMgdm9pZAorYWRkX3BlZXJzKGNoYXIgKnMpCit7CisJcGVlcl90ICpwOworCisJcCA9IHh6YWxsb2Moc2l6ZW9mKCpwKSk7CisJcC0+cF9sc2EgPSB4aG9zdDJzb2NrYWRkcihzLCAxMjMpOworCXAtPnBfZG90dGVkID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZwLT5wX2xzYS0+dS5zYSk7CisJcC0+cF9mZCA9IC0xOworCXAtPnBfeG10X21zZy5tX3N0YXR1cyA9IE1PREVfQ0xJRU5UIHwgKE5UUF9WRVJTSU9OIDw8IDMpOworCXAtPnBfdHJ1c3RsZXZlbCA9IFRSVVNUTEVWRUxfUEFUSEVUSUM7CisJcC0+bmV4dF9hY3Rpb25fdGltZSA9IHRpbWUoTlVMTCk7IC8qID0gc2V0X25leHQocCwgMCk7ICovCisKKwlsbGlzdF9hZGRfdG8oJkcubnRwX3BlZXJzLCBwKTsKKwlHLnBlZXJfY250Kys7Cit9CisKK3N0YXRpYyBkb3VibGUKK2dldHRpbWUxOTAwZCh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOyAvKiBuZXZlciBmYWlscyAqLworCXJldHVybiAodHYudHZfc2VjICsgMS4wZS02ICogdHYudHZfdXNlYyArIE9GRlNFVF8xOTAwXzE5NzApOworfQorCitzdGF0aWMgdm9pZAorZF90b190dihkb3VibGUgZCwgc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXR2LT50dl9zZWMgPSAobG9uZylkOworCXR2LT50dl91c2VjID0gKGQgLSB0di0+dHZfc2VjKSAqIDEwMDAwMDA7Cit9CisKK3N0YXRpYyBkb3VibGUKK2xmcF90b19kKGxfZml4ZWRwdF90IGxmcCkKK3sKKwlkb3VibGUgcmV0OworCWxmcC5pbnRfcGFydGwgPSBudG9obChsZnAuaW50X3BhcnRsKTsKKwlsZnAuZnJhY3Rpb25sID0gbnRvaGwobGZwLmZyYWN0aW9ubCk7CisJcmV0ID0gKGRvdWJsZSlsZnAuaW50X3BhcnRsICsgKChkb3VibGUpbGZwLmZyYWN0aW9ubCAvIFVJTlRfTUFYKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWYgMCAvL1VOVVNFRAorc3RhdGljIGRvdWJsZQorc2ZwX3RvX2Qoc19maXhlZHB0X3Qgc2ZwKQoreworCWRvdWJsZSByZXQ7CisJc2ZwLmludF9wYXJ0cyA9IG50b2hzKHNmcC5pbnRfcGFydHMpOworCXNmcC5mcmFjdGlvbnMgPSBudG9ocyhzZnAuZnJhY3Rpb25zKTsKKwlyZXQgPSAoZG91YmxlKXNmcC5pbnRfcGFydHMgKyAoKGRvdWJsZSlzZnAuZnJhY3Rpb25zIC8gVVNIUlRfTUFYKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorc3RhdGljIGxfZml4ZWRwdF90CitkX3RvX2xmcChkb3VibGUgZCkKK3sKKwlsX2ZpeGVkcHRfdCBsZnA7CisJbGZwLmludF9wYXJ0bCA9ICh1aW50MzJfdClkOworCWxmcC5mcmFjdGlvbmwgPSAodWludDMyX3QpKChkIC0gbGZwLmludF9wYXJ0bCkgKiBVSU5UX01BWCk7CisJbGZwLmludF9wYXJ0bCA9IGh0b25sKGxmcC5pbnRfcGFydGwpOworCWxmcC5mcmFjdGlvbmwgPSBodG9ubChsZnAuZnJhY3Rpb25sKTsKKwlyZXR1cm4gbGZwOworfQorCitzdGF0aWMgc19maXhlZHB0X3QKK2RfdG9fc2ZwKGRvdWJsZSBkKQoreworCXNfZml4ZWRwdF90IHNmcDsKKwlzZnAuaW50X3BhcnRzID0gKHVpbnQxNl90KWQ7CisJc2ZwLmZyYWN0aW9ucyA9ICh1aW50MTZfdCkoKGQgLSBzZnAuaW50X3BhcnRzKSAqIFVTSFJUX01BWCk7CisJc2ZwLmludF9wYXJ0cyA9IGh0b25zKHNmcC5pbnRfcGFydHMpOworCXNmcC5mcmFjdGlvbnMgPSBodG9ucyhzZnAuZnJhY3Rpb25zKTsKKwlyZXR1cm4gc2ZwOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZAorZXJyb3JfaW50ZXJ2YWwodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnRlcnZhbCwgcjsKKwlpbnRlcnZhbCA9IElOVEVSVkFMX1FVRVJZX1BBVEhFVElDICogUVNDQUxFX09GRl9NQVggLyBRU0NBTEVfT0ZGX01JTjsKKwlyID0gKHVuc2lnbmVkKXJhbmRvbSgpICUgKHVuc2lnbmVkKShpbnRlcnZhbCAvIDEwKTsKKwlyZXR1cm4gKGludGVydmFsICsgcik7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3NlbmR0byhpbnQgZmQsCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bywgc29ja2xlbl90IGFkZHJsZW4sCisJCW1zZ190ICptc2csIHNzaXplX3QgbGVuKQoreworCXNzaXplX3QgcmV0OworCisJZXJybm8gPSAwOworCWlmICghZnJvbSkgeworCQlyZXQgPSBzZW5kdG8oZmQsIG1zZywgbGVuLCBNU0dfRE9OVFdBSVQsIHRvLCBhZGRybGVuKTsKKwl9IGVsc2UgeworCQlyZXQgPSBzZW5kX3RvX2Zyb20oZmQsIG1zZywgbGVuLCBNU0dfRE9OVFdBSVQsIHRvLCBmcm9tLCBhZGRybGVuKTsKKwl9CisJaWYgKHJldCAhPSBsZW4pIHsKKwkJYmJfcGVycm9yX21zZygic2VuZCBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2VuZF9xdWVyeV90b19wZWVyKHBlZXJfdCAqcCkKK3sKKwkvLyBXaHkgZG8gd2UgbmVlZCB0byBiaW5kKCk/CisJLy8gU2VlIHdoYXQgaGFwcGVucyB3aGVuIHdlIGRvbid0IGJpbmQ6CisJLy8KKwkvLyBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19JUCkgPSAzCisJLy8gc2V0c29ja29wdCgzLCBTT0xfSVAsIElQX1RPUywgWzE2XSwgNCkgPSAwCisJLy8gZ2V0dGltZW9mZGF5KHsxMjU5MDcxMjY2LCAzMjc4ODV9LCBOVUxMKSA9IDAKKwkvLyBzZW5kdG8oMywgInh4eCIsIDQ4LCBNU0dfRE9OVFdBSVQsIHtzYV9mYW1pbHk9QUZfSU5FVCwgc2luX3BvcnQ9aHRvbnMoMTIzKSwgc2luX2FkZHI9aW5ldF9hZGRyKCIxMC4zNC4zMi4xMjUiKX0sIDE2KSA9IDQ4CisJLy8gXl5eIHdlIHNlbnQgaXQgZnJvbSBzb21lIHNvdXJjZSBwb3J0IHBpY2tlZCBieSBrZXJuZWwuCisJLy8gdGltZShOVUxMKSAgICAgICAgICAgICAgPSAxMjU5MDcxMjY2CisJLy8gd3JpdGUoMiwgIm50cGQ6IGVudGVyaW5nIHBvbGwgMTUgc2Vjc1xuIiwgMjgpID0gMjgKKwkvLyBwb2xsKFt7ZmQ9MywgZXZlbnRzPVBPTExJTn1dLCAxLCAxNTAwMCkgPSAxIChbe2ZkPTMsIHJldmVudHM9UE9MTElOfV0pCisJLy8gcmVjdigzLCAieXl5IiwgNjgsIE1TR19ET05UV0FJVCkgPSA0OAorCS8vIF5eXiB0aGlzIHJlY3Ygd2lsbCByZWNlaXZlIHBhY2tldHMgdG8gYW55IGxvY2FsIHBvcnQhCisJLy8KKwkvLyBVbmNvbW1lbnQgdGhpcyBhbmQgdXNlIHN0cmFjZSB0byBzZWUgaXQgaW4gYWN0aW9uOgorI2RlZmluZSBQUk9CRV9MT0NBTF9BRERSIC8vIHsgbGVuX2FuZF9zb2NrYWRkciBsc2E7IGxzYS5sZW4gPSBMU0FfU0laRU9GX1NBOyBnZXRzb2NrbmFtZShwLT5xdWVyeS5mZCwgJmxzYS51LnNhLCAmbHNhLmxlbik7IH0KKworCWlmIChwLT5wX2ZkID09IC0xKSB7CisJCWludCBmZCwgZmFtaWx5OworCQlsZW5fYW5kX3NvY2thZGRyICpsb2NhbF9sc2E7CisKKwkJZmFtaWx5ID0gcC0+cF9sc2EtPnUuc2Euc2FfZmFtaWx5OworCQlwLT5wX2ZkID0gZmQgPSB4c29ja2V0X3R5cGUoJmxvY2FsX2xzYSwgZmFtaWx5LCBTT0NLX0RHUkFNKTsKKwkJLyogbG9jYWxfbHNhIGhhcyAibnVsbCIgYWRkcmVzcyBhbmQgcG9ydCAwIG5vdy4KKwkJICogYmluZCgpIGVuc3VyZXMgd2UgaGF2ZSBhICpwYXJ0aWN1bGFyIHBvcnQqIHNlbGVjdGVkIGJ5IGtlcm5lbAorCQkgKiBhbmQgcmVtZW1iZXJlZCBpbiBwLT5wX2ZkLCB0aHVzIGxhdGVyIHJlY3YocC0+cF9mZCkKKwkJICogcmVjZWl2ZXMgb25seSBwYWNrZXRzIHNlbnQgdG8gdGhpcyBwb3J0LgorCQkgKi8KKwkJUFJPQkVfTE9DQUxfQUREUgorCQl4YmluZChmZCwgJmxvY2FsX2xzYS0+dS5zYSwgbG9jYWxfbHNhLT5sZW4pOworCQlQUk9CRV9MT0NBTF9BRERSCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlpZiAoZmFtaWx5ID09IEFGX0lORVQpCisjZW5kaWYKKwkJCXNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVAsIElQX1RPUywgJmNvbnN0X0lQVE9TX0xPV0RFTEFZLCBzaXplb2YoY29uc3RfSVBUT1NfTE9XREVMQVkpKTsKKwkJZnJlZShsb2NhbF9sc2EpOworCX0KKworCS8qCisJICogU2VuZCBvdXQgYSByYW5kb20gNjQtYml0IG51bWJlciBhcyBvdXIgdHJhbnNtaXQgdGltZS4gIFRoZSBOVFAKKwkgKiBzZXJ2ZXIgd2lsbCBjb3B5IHNhaWQgbnVtYmVyIGludG8gdGhlIG9yaWdpbmF0ZSBmaWVsZCBvbiB0aGUKKwkgKiByZXNwb25zZSB0aGF0IGl0IHNlbmRzIHVzLiAgVGhpcyBpcyB0b3RhbGx5IGxlZ2FsIHBlciB0aGUgU05UUCBzcGVjLgorCSAqCisJICogVGhlIGltcGFjdCBvZiB0aGlzIGlzIHR3byBmb2xkOiB3ZSBubyBsb25nZXIgc2VuZCBvdXQgdGhlIGN1cnJlbnQKKwkgKiBzeXN0ZW0gdGltZSBmb3IgdGhlIHdvcmxkIHRvIHNlZSAod2hpY2ggbWF5IGFpZCBhbiBhdHRhY2tlciksIGFuZAorCSAqIGl0IGdpdmVzIHVzIGEgKG5vdCB2ZXJ5IHNlY3VyZSkgd2F5IG9mIGtub3dpbmcgdGhhdCB3ZSdyZSBub3QKKwkgKiBnZXR0aW5nIHNwb29mZWQgYnkgYW4gYXR0YWNrZXIgdGhhdCBjYW4ndCBjYXB0dXJlIG91ciB0cmFmZmljCisJICogYnV0IGNhbiBzcG9vZiBwYWNrZXRzIGZyb20gdGhlIE5UUCBzZXJ2ZXIgd2UncmUgY29tbXVuaWNhdGluZyB3aXRoLgorCSAqCisJICogU2F2ZSB0aGUgcmVhbCB0cmFuc21pdCB0aW1lc3RhbXAgbG9jYWxseS4KKwkgKi8KKwlwLT5wX3htdF9tc2cubV94bXR0aW1lLmludF9wYXJ0bCA9IHJhbmRvbSgpOworCXAtPnBfeG10X21zZy5tX3htdHRpbWUuZnJhY3Rpb25sID0gcmFuZG9tKCk7CisJcC0+cF94bXR0aW1lID0gZ2V0dGltZTE5MDBkKCk7CisKKwlpZiAoZG9fc2VuZHRvKHAtPnBfZmQsIC8qZnJvbToqLyBOVUxMLCAvKnRvOiovICZwLT5wX2xzYS0+dS5zYSwgLyphZGRybGVuOiovIHAtPnBfbHNhLT5sZW4sCisJCQkmcC0+cF94bXRfbXNnLCBOVFBfTVNHU0laRV9OT0FVVEgpID09IC0xCisJKSB7CisJCWNsb3NlKHAtPnBfZmQpOworCQlwLT5wX2ZkID0gLTE7CisJCXNldF9uZXh0KHAsIElOVEVSVkFMX1FVRVJZX1BBVEhFVElDKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChHLnZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygic2VudCBxdWVyeSB0byAlcyIsIHAtPnBfZG90dGVkKTsKKwlzZXRfbmV4dChwLCBRVUVSWVRJTUVfTUFYKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFRpbWUgaXMgc3RlcHBlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGZpcnN0IHBhY2tldCBmcm9tIGEgcGVlciBpcyByZWNlaXZlZC4KKyAqLworc3RhdGljIHZvaWQKK3N0ZXBfdGltZV9vbmNlKGRvdWJsZSBvZmZzZXQpCit7CisJZG91YmxlIGR0aW1lOworCWxsaXN0X3QgKml0ZW07CisJc3RydWN0IHRpbWV2YWwgdHY7CisJY2hhciBidWZbODBdOworCXRpbWVfdCB0dmFsOworCisJaWYgKEcudGltZV93YXNfc3RlcHBlZCkKKwkJZ290byBiYWlsOworCUcudGltZV93YXNfc3RlcHBlZCA9IDE7CisKKwkvKiBpZiB0aGUgb2Zmc2V0IGlzIHNtYWxsLCBkb24ndCBzdGVwLCBzbGV3IChsYXRlcikgKi8KKwlpZiAob2Zmc2V0IDwgU1RFUFRJTUVfTUlOX09GRlNFVCAmJiBvZmZzZXQgPiAtU1RFUFRJTUVfTUlOX09GRlNFVCkKKwkJZ290byBiYWlsOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7IC8qIG5ldmVyIGZhaWxzICovCisJZHRpbWUgPSBvZmZzZXQgKyB0di50dl9zZWM7CisJZHRpbWUgKz0gMS4wZS02ICogdHYudHZfdXNlYzsKKwlkX3RvX3R2KGR0aW1lLCAmdHYpOworCisJaWYgKHNldHRpbWVvZmRheSgmdHYsIE5VTEwpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHRpbWVvZmRheSIpOworCisJdHZhbCA9IHR2LnR2X3NlYzsKKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJWEgJWIgJWUgJUg6JU06JVMgJVogJVkiLCBsb2NhbHRpbWUoJnR2YWwpKTsKKworCWJiX2Vycm9yX21zZygic2V0dGluZyBjbG9jayB0byAlcyAob2Zmc2V0ICVmcykiLCBidWYsIG9mZnNldCk7CisKKwlmb3IgKGl0ZW0gPSBHLm50cF9wZWVyczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bGluaykgeworCQlwZWVyX3QgKnAgPSAocGVlcl90ICopIGl0ZW0tPmRhdGE7CisJCXAtPm5leHRfYWN0aW9uX3RpbWUgLT0gKHRpbWVfdClvZmZzZXQ7CisJfQorCisgYmFpbDoKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9xKQorCQlleGl0KDApOworfQorCisKKy8qIFRpbWUgaXMgcGVyaW9kaWNhbGx5IHNsZXdlZCB3aGVuIHdlIGNvbGxlY3QgZW5vdWdoCisgKiBnb29kIGRhdGEgcG9pbnRzLgorICovCitzdGF0aWMgaW50Citjb21wYXJlX29mZnNldHMoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKQoreworCWNvbnN0IHBlZXJfdCAqY29uc3QgKmEgPSBhYTsKKwljb25zdCBwZWVyX3QgKmNvbnN0ICpiID0gYmI7CisJaWYgKCgqYSktPnVwZGF0ZS5kX29mZnNldCA8ICgqYiktPnVwZGF0ZS5kX29mZnNldCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAoKCphKS0+dXBkYXRlLmRfb2Zmc2V0ID4gKCpiKS0+dXBkYXRlLmRfb2Zmc2V0KTsKK30KK3N0YXRpYyB1bnNpZ25lZAordXBkYXRlZF9zY2FsZShkb3VibGUgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPCAwKQorCQlvZmZzZXQgPSAtb2Zmc2V0OworCWlmIChvZmZzZXQgPiBRU0NBTEVfT0ZGX01BWCkKKwkJcmV0dXJuIDE7CisJaWYgKG9mZnNldCA8IFFTQ0FMRV9PRkZfTUlOKQorCQlyZXR1cm4gUVNDQUxFX09GRl9NQVggLyBRU0NBTEVfT0ZGX01JTjsKKwlyZXR1cm4gUVNDQUxFX09GRl9NQVggLyBvZmZzZXQ7Cit9CitzdGF0aWMgdm9pZAorc2xld190aW1lKHZvaWQpCit7CisJbGxpc3RfdCAqaXRlbTsKKwlkb3VibGUgb2Zmc2V0X21lZGlhbjsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCXsKKwkJcGVlcl90ICoqcGVlcnMgPSB4emFsbG9jKHNpemVvZihwZWVyc1swXSkgKiBHLnBlZXJfY250KTsKKwkJdW5zaWduZWQgZ29vZHBlZXJfY250ID0gMDsKKwkJdW5zaWduZWQgbWlkZGxlOworCisJCWZvciAoaXRlbSA9IEcubnRwX3BlZXJzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5saW5rKSB7CisJCQlwZWVyX3QgKnAgPSAocGVlcl90ICopIGl0ZW0tPmRhdGE7CisJCQlpZiAocC0+cF90cnVzdGxldmVsIDwgVFJVU1RMRVZFTF9CQURQRUVSKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFwLT51cGRhdGUuZF9nb29kKSB7CisJCQkJZnJlZShwZWVycyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcGVlcnNbZ29vZHBlZXJfY250KytdID0gcDsKKwkJfQorCisJCWlmIChnb29kcGVlcl9jbnQgPT0gMCkgeworCQkJZnJlZShwZWVycyk7CisJCQlnb3RvIGNsZWFyX2dvb2Q7CisJCX0KKworCQlxc29ydChwZWVycywgZ29vZHBlZXJfY250LCBzaXplb2YocGVlcnNbMF0pLCBjb21wYXJlX29mZnNldHMpOworCisJCW1pZGRsZSA9IGdvb2RwZWVyX2NudCAvIDI7CisJCWlmIChtaWRkbGUgIT0gMCAmJiAoZ29vZHBlZXJfY250ICYgMSkgPT0gMCkgeworCQkJb2Zmc2V0X21lZGlhbiA9IChwZWVyc1ttaWRkbGUtMV0tPnVwZGF0ZS5kX29mZnNldCArIHBlZXJzW21pZGRsZV0tPnVwZGF0ZS5kX29mZnNldCkgLyAyOworCQkJRy5yb290ZGVsYXkgPSAocGVlcnNbbWlkZGxlLTFdLT51cGRhdGUuZF9kZWxheSArIHBlZXJzW21pZGRsZV0tPnVwZGF0ZS5kX2RlbGF5KSAvIDI7CisJCQlHLnN0cmF0dW0gPSAxICsgTUFYKHBlZXJzW21pZGRsZS0xXS0+dXBkYXRlLmRfc3RyYXR1bSwgcGVlcnNbbWlkZGxlXS0+dXBkYXRlLmRfc3RyYXR1bSk7CisJCX0gZWxzZSB7CisJCQlvZmZzZXRfbWVkaWFuID0gcGVlcnNbbWlkZGxlXS0+dXBkYXRlLmRfb2Zmc2V0OworCQkJRy5yb290ZGVsYXkgPSBwZWVyc1ttaWRkbGVdLT51cGRhdGUuZF9kZWxheTsKKwkJCUcuc3RyYXR1bSA9IDEgKyBwZWVyc1ttaWRkbGVdLT51cGRhdGUuZF9zdHJhdHVtOworCQl9CisJCUcubGVhcCA9IHBlZXJzW21pZGRsZV0tPnVwZGF0ZS5kX2xlYXA7CisJCUcucmVmaWQ0ID0gcGVlcnNbbWlkZGxlXS0+dXBkYXRlLmRfcmVmaWQ0OworCQlHLnJlZmlkID0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCQlwZWVyc1ttaWRkbGVdLT5wX2xzYS0+dS5zYS5zYV9mYW1pbHkgIT0gQUZfSU5FVCA/CisJCQkJRy5yZWZpZDQgOgorI2VuZGlmCisJCQkJcGVlcnNbbWlkZGxlXS0+cF9sc2EtPnUuc2luLnNpbl9hZGRyLnNfYWRkcjsKKwkJZnJlZShwZWVycyk7CisJfQorLy9UT0RPOiBpZiAob2Zmc2V0X21lZGlhbiA+IEJJRykgc3RlcF90aW1lKG9mZnNldF9tZWRpYW4pPworCisJRy5zY2FsZSA9IHVwZGF0ZWRfc2NhbGUob2Zmc2V0X21lZGlhbik7CisKKwliYl9lcnJvcl9tc2coImFkanVzdGluZyBjbG9jayBieSAlZnMsIG91ciBzdHJhdHVtIGlzICV1LCB0aW1lIHNjYWxlICV1IiwKKwkJCW9mZnNldF9tZWRpYW4sIEcuc3RyYXR1bSwgRy5zY2FsZSk7CisKKwllcnJubyA9IDA7CisJZF90b190dihvZmZzZXRfbWVkaWFuLCAmdHYpOworCWlmIChhZGp0aW1lKCZ0diwgJnR2KSA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhZGp0aW1lIGZhaWxlZCIpOworCWlmIChHLnZlcmJvc2UgPj0gMikKKwkJYmJfZXJyb3JfbXNnKCJvbGQgYWRqdXN0OiAlZC4lMDZ1IiwgKGludCl0di50dl9zZWMsICh1bnNpZ25lZCl0di50dl91c2VjKTsKKworCWlmIChHLmZpcnN0X2Fkal9kb25lKSB7CisJCXVpbnQ4X3Qgc3luY2VkID0gKHR2LnR2X3NlYyA9PSAwICYmIHR2LnR2X3VzZWMgPT0gMCk7CisJCWlmIChzeW5jZWQgIT0gRy5zeW5jZWQpIHsKKwkJCUcuc3luY2VkID0gc3luY2VkOworCQkJYmJfZXJyb3JfbXNnKCJjbG9jayBpcyAlc3N5bmNlZCIsIHN5bmNlZCA/ICIiIDogInVuIik7CisJCX0KKwl9CisJRy5maXJzdF9hZGpfZG9uZSA9IDE7CisKKwlHLnJlZnRpbWUgPSBnZXR0aW1lMTkwMGQoKTsKKworIGNsZWFyX2dvb2Q6CisJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJcGVlcl90ICpwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCQlwLT51cGRhdGUuZF9nb29kID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfcGVlcl9kYXRhKHBlZXJfdCAqcCkKK3sKKwkvKiBDbG9jayBmaWx0ZXIuCisJICogRmluZCB0aGUgZGF0YXBvaW50IHdpdGggdGhlIGxvd2VzdCBkZWxheS4KKwkgKiBVc2UgdGhhdCBhcyB0aGUgcGVlciB1cGRhdGUuCisJICogSW52YWxpZGF0ZSBpdCBhbmQgYWxsIG9sZGVyIG9uZXMuCisJICovCisJaW50IGk7CisJaW50IGJlc3QgPSAtMTsKKwlpbnQgZ29vZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQlpZiAocC0+cF9kYXRhcG9pbnRbaV0uZF9nb29kKSB7CisJCQlnb29kKys7CisJCQlpZiAoYmVzdCA8IDAgfHwgcC0+cF9kYXRhcG9pbnRbaV0uZF9kZWxheSA8IHAtPnBfZGF0YXBvaW50W2Jlc3RdLmRfZGVsYXkpCisJCQkJYmVzdCA9IGk7CisJCX0KKwl9CisKKwlpZiAoZ29vZCA8IDgpIC8vRklYTUU6IHdhcyBpdCBtZWFudCB0byBiZSBOVU1fREFUQVBPSU5UUywgbm90IDg/CisJCXJldHVybjsKKworCXAtPnVwZGF0ZSA9IHAtPnBfZGF0YXBvaW50W2Jlc3RdOyAvKiBzdHJ1Y3QgY29weSAqLworCXNsZXdfdGltZSgpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9EQVRBUE9JTlRTOyBpKyspCisJCWlmIChwLT5wX2RhdGFwb2ludFtpXS5kX3Jjdl90aW1lIDw9IHAtPnBfZGF0YXBvaW50W2Jlc3RdLmRfcmN2X3RpbWUpCisJCQlwLT5wX2RhdGFwb2ludFtpXS5kX2dvb2QgPSAwOworfQorCitzdGF0aWMgdW5zaWduZWQKK3NjYWxlX2ludGVydmFsKHVuc2lnbmVkIHJlcXVlc3RlZCkKK3sKKwl1bnNpZ25lZCBpbnRlcnZhbCwgcjsKKwlpbnRlcnZhbCA9IHJlcXVlc3RlZCAqIEcuc2NhbGU7CisJciA9ICh1bnNpZ25lZClyYW5kb20oKSAlICh1bnNpZ25lZCkoTUFYKDUsIGludGVydmFsIC8gMTApKTsKKwlyZXR1cm4gKGludGVydmFsICsgcik7Cit9CitzdGF0aWMgdm9pZAorcmVjdl9hbmRfcHJvY2Vzc19wZWVyX3BrdChwZWVyX3QgKnApCit7CisJc3NpemVfdCAgICAgc2l6ZTsKKwltc2dfdCAgICAgICBtc2c7CisJZG91YmxlICAgICAgVDEsIFQyLCBUMywgVDQ7CisJdW5zaWduZWQgICAgaW50ZXJ2YWw7CisJZGF0YXBvaW50X3QgKmRhdGFwb2ludDsKKworCS8qIFdlIGNhbiByZWN2ZnJvbSBoZXJlIGFuZCBjaGVjayBmcm9tLklQLCBidXQgc29tZSBtdWx0aWhvbWVkCisJICogbnRwIHNlcnZlcnMgcmVwbHkgZnJvbSB0aGVpciAqb3RoZXIgSVAqLgorCSAqIFRPRE86IG1heWJlIHdlIHNob3VsZCBjaGVjayBhdCBsZWFzdCB3aGF0IHdlIGNhbjogZnJvbS5wb3J0ID09IDEyMz8KKwkgKi8KKwlzaXplID0gcmVjdihwLT5wX2ZkLCAmbXNnLCBzaXplb2YobXNnKSwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoc2l6ZSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJyZWN2KCVzKSBlcnJvciIsIHAtPnBfZG90dGVkKTsKKwkJaWYgKGVycm5vID09IEVIT1NUVU5SRUFDSCB8fCBlcnJubyA9PSBFSE9TVERPV04KKwkJIHx8IGVycm5vID09IEVORVRVTlJFQUNIIHx8IGVycm5vID09IEVORVRET1dOCisJCSB8fCBlcnJubyA9PSBFQ09OTlJFRlVTRUQgfHwgZXJybm8gPT0gRUFERFJOT1RBVkFJTAorCQkgfHwgZXJybm8gPT0gRUFHQUlOCisJCSkgeworLy9UT0RPOiBhbHdheXMgZG8gdGhpcz8KKwkJCXNldF9uZXh0KHAsIGVycm9yX2ludGVydmFsKCkpOworCQkJZ290byBjbG9zZV9zb2NrOworCQl9CisJCXhmdW5jX2RpZSgpOworCX0KKworCWlmIChzaXplICE9IE5UUF9NU0dTSVpFX05PQVVUSCAmJiBzaXplICE9IE5UUF9NU0dTSVpFKSB7CisJCWJiX2Vycm9yX21zZygibWFsZm9ybWVkIHBhY2tldCByZWNlaXZlZCBmcm9tICVzIiwgcC0+cF9kb3R0ZWQpOworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKG1zZy5tX29yZ3RpbWUuaW50X3BhcnRsICE9IHAtPnBfeG10X21zZy5tX3htdHRpbWUuaW50X3BhcnRsCisJIHx8IG1zZy5tX29yZ3RpbWUuZnJhY3Rpb25sICE9IHAtPnBfeG10X21zZy5tX3htdHRpbWUuZnJhY3Rpb25sCisJKSB7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoKG1zZy5tX3N0YXR1cyAmIExJX0FMQVJNKSA9PSBMSV9BTEFSTQorCSB8fCBtc2cubV9zdHJhdHVtID09IDAKKwkgfHwgbXNnLm1fc3RyYXR1bSA+IE5UUF9NQVhTVFJBVFVNCisJKSB7CisvLyBUT0RPOiBzdHJhdHVtIDAgcmVzcG9uc2VzIG1heSBoYXZlIGNvbW1hbmRzIGluIDMyLWJpdCBtX3JlZmlkIGZpZWxkOgorLy8gIkRFTlkiLCAiUlNUUiIgLSBwZWVyIGRvZXMgbm90IGxpa2UgdXMgYXQgYWxsCisvLyAiUkFURSIgLSBwZWVyIGlzIG92ZXJsb2FkZWQsIHJlZHVjZSBwb2xsaW5nIGZyZXEKKwkJaW50ZXJ2YWwgPSBlcnJvcl9pbnRlcnZhbCgpOworCQliYl9lcnJvcl9tc2coInJlcGx5IGZyb20gJXM6IG5vdCBzeW5jZWQsIG5leHQgcXVlcnkgaW4gJXVzIiwgcC0+cF9kb3R0ZWQsIGludGVydmFsKTsKKwkJZ290byBjbG9zZV9zb2NrOworCX0KKworCS8qCisJICogRnJvbSBSRkMgMjAzMCAod2l0aCBhIGNvcnJlY3Rpb24gdG8gdGhlIGRlbGF5IG1hdGgpOgorCSAqCisJICogVGltZXN0YW1wIE5hbWUgICAgICAgICAgSUQgICBXaGVuIEdlbmVyYXRlZAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIE9yaWdpbmF0ZSBUaW1lc3RhbXAgICAgIFQxICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgY2xpZW50CisJICogUmVjZWl2ZSBUaW1lc3RhbXAgICAgICAgVDIgICB0aW1lIHJlcXVlc3QgcmVjZWl2ZWQgYnkgc2VydmVyCisJICogVHJhbnNtaXQgVGltZXN0YW1wICAgICAgVDMgICB0aW1lIHJlcGx5IHNlbnQgYnkgc2VydmVyCisJICogRGVzdGluYXRpb24gVGltZXN0YW1wICAgVDQgICB0aW1lIHJlcGx5IHJlY2VpdmVkIGJ5IGNsaWVudAorCSAqCisJICogVGhlIHJvdW5kdHJpcCBkZWxheSBhbmQgbG9jYWwgY2xvY2sgb2Zmc2V0IGFyZSBkZWZpbmVkIGFzCisJICoKKwkgKiBkZWxheSA9IChUNCAtIFQxKSAtIChUMyAtIFQyKTsgb2Zmc2V0ID0gKChUMiAtIFQxKSArIChUMyAtIFQ0KSkgLyAyCisJICovCisJVDEgPSBwLT5wX3htdHRpbWU7CisJVDIgPSBsZnBfdG9fZChtc2cubV9yZWN0aW1lKTsKKwlUMyA9IGxmcF90b19kKG1zZy5tX3htdHRpbWUpOworCVQ0ID0gZ2V0dGltZTE5MDBkKCk7CisKKwlkYXRhcG9pbnQgPSAmcC0+cF9kYXRhcG9pbnRbcC0+cF9kYXRhcG9pbnRfaWR4XTsKKworCWRhdGFwb2ludC0+ZF9vZmZzZXQgPSAoKFQyIC0gVDEpICsgKFQzIC0gVDQpKSAvIDI7CisJZGF0YXBvaW50LT5kX2RlbGF5ID0gKFQ0IC0gVDEpIC0gKFQzIC0gVDIpOworCWlmIChkYXRhcG9pbnQtPmRfZGVsYXkgPCAwKSB7CisJCWJiX2Vycm9yX21zZygicmVwbHkgZnJvbSAlczogbmVnYXRpdmUgZGVsYXkgJWYiLCBwLT5wX2RvdHRlZCwgZGF0YXBvaW50LT5kX2RlbGF5KTsKKwkJaW50ZXJ2YWwgPSBlcnJvcl9pbnRlcnZhbCgpOworCQlzZXRfbmV4dChwLCBpbnRlcnZhbCk7CisJCWdvdG8gY2xvc2Vfc29jazsKKwl9CisJLy9VTlVTRUQ6IGRhdGFwb2ludC0+ZF9lcnJvciA9IChUMiAtIFQxKSAtIChUMyAtIFQ0KTsKKwlkYXRhcG9pbnQtPmRfcmN2X3RpbWUgPSAodGltZV90KShUNCAtIE9GRlNFVF8xOTAwXzE5NzApOyAvKiA9IHRpbWUoTlVMTCk7ICovCisJZGF0YXBvaW50LT5kX2dvb2QgPSAxOworCisJZGF0YXBvaW50LT5kX2xlYXAgPSAobXNnLm1fc3RhdHVzICYgTElfTUFTSyk7CisJLy9VTlVTRUQ6IGRhdGFwb2ludC0+b19wcmVjaXNpb24gPSBtc2cubV9wcmVjaXNpb25fZXhwOworCS8vVU5VU0VEOiBkYXRhcG9pbnQtPm9fcm9vdGRlbGF5ID0gc2ZwX3RvX2QobXNnLm1fcm9vdGRlbGF5KTsKKwkvL1VOVVNFRDogZGF0YXBvaW50LT5vX3Jvb3RkaXNwZXJzaW9uID0gc2ZwX3RvX2QobXNnLm1fZGlzcGVyc2lvbik7CisJLy9VTlVTRUQ6IGRhdGFwb2ludC0+ZF9yZWZpZCA9IG50b2hsKG1zZy5tX3JlZmlkKTsKKwlkYXRhcG9pbnQtPmRfcmVmaWQ0ID0gbXNnLm1feG10dGltZS5mcmFjdGlvbmw7CisJLy9VTlVTRUQ6IGRhdGFwb2ludC0+b19yZWZ0aW1lID0gbGZwX3RvX2QobXNnLm1fcmVmdGltZSk7CisJLy9VTlVTRUQ6IGRhdGFwb2ludC0+b19wb2xsID0gbXNnLm1fcHBvbGw7CisJZGF0YXBvaW50LT5kX3N0cmF0dW0gPSBtc2cubV9zdHJhdHVtOworCisJaWYgKHAtPnBfdHJ1c3RsZXZlbCA8IFRSVVNUTEVWRUxfUEFUSEVUSUMpCisJCWludGVydmFsID0gc2NhbGVfaW50ZXJ2YWwoSU5URVJWQUxfUVVFUllfUEFUSEVUSUMpOworCWVsc2UgaWYgKHAtPnBfdHJ1c3RsZXZlbCA8IFRSVVNUTEVWRUxfQUdSRVNTSVZFKQorCQlpbnRlcnZhbCA9IHNjYWxlX2ludGVydmFsKElOVEVSVkFMX1FVRVJZX0FHUkVTU0lWRSk7CisJZWxzZQorCQlpbnRlcnZhbCA9IHNjYWxlX2ludGVydmFsKElOVEVSVkFMX1FVRVJZX05PUk1BTCk7CisKKwlzZXRfbmV4dChwLCBpbnRlcnZhbCk7CisKKwkvKiBFdmVyeSByZWNlaXZlZCByZXBseSB3aGljaCB3ZSBkbyBub3QgZGlzY2FyZCBpbmNyZWFzZXMgdHJ1c3QgKi8KKwlpZiAocC0+cF90cnVzdGxldmVsIDwgVFJVU1RMRVZFTF9NQVgpIHsKKwkJcC0+cF90cnVzdGxldmVsKys7CisJCWlmIChwLT5wX3RydXN0bGV2ZWwgPT0gVFJVU1RMRVZFTF9CQURQRUVSKQorCQkJYmJfZXJyb3JfbXNnKCJwZWVyICVzIG5vdyB2YWxpZCIsIHAtPnBfZG90dGVkKTsKKwl9CisKKwlpZiAoRy52ZXJib3NlKQorCQliYl9lcnJvcl9tc2coInJlcGx5IGZyb20gJXM6IG9mZnNldCAlZiBkZWxheSAlZiwgbmV4dCBxdWVyeSBpbiAldXMiLCBwLT5wX2RvdHRlZCwKKwkJCWRhdGFwb2ludC0+ZF9vZmZzZXQsIGRhdGFwb2ludC0+ZF9kZWxheSwgaW50ZXJ2YWwpOworCisJdXBkYXRlX3BlZXJfZGF0YShwKTsKKy8vVE9ETzogZG8gaXQgYWZ0ZXIgYWxsIHBlZXJzIGhhZCBhIGNoYW5jZSB0byByZXR1cm4gYXQgbGVhc3Qgb25lIHJlcGx5PworCXN0ZXBfdGltZV9vbmNlKGRhdGFwb2ludC0+ZF9vZmZzZXQpOworCisJcC0+cF9kYXRhcG9pbnRfaWR4Kys7CisJaWYgKHAtPnBfZGF0YXBvaW50X2lkeCA+PSBOVU1fREFUQVBPSU5UUykKKwkJcC0+cF9kYXRhcG9pbnRfaWR4ID0gMDsKKworIGNsb3NlX3NvY2s6CisJLyogV2UgZG8gbm90IGV4cGVjdCBhbnkgbW9yZSBwYWNrZXRzIGZyb20gdGhpcyBwZWVyIGZvciBub3cuCisJICogQ2xvc2luZyB0aGUgc29ja2V0IGluZm9ybXMga2VybmVsIGFib3V0IGl0LgorCSAqIFdlIG9wZW4gYSBuZXcgc29ja2V0IHdoZW4gd2Ugc2VuZCBhIG5ldyBxdWVyeS4KKwkgKi8KKwljbG9zZShwLT5wX2ZkKTsKKwlwLT5wX2ZkID0gLTE7CisgYmFpbDoKKwlyZXR1cm47Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorc3RhdGljIHZvaWQKK3JlY3ZfYW5kX3Byb2Nlc3NfY2xpZW50X3BrdCh2b2lkIC8qaW50IGZkKi8pCit7CisJc3NpemVfdCAgICAgICAgICBzaXplOworCXVpbnQ4X3QgICAgICAgICAgdmVyc2lvbjsKKwlkb3VibGUgICAgICAgICAgIHJlY3RpbWU7CisJbGVuX2FuZF9zb2NrYWRkciAqdG87CisJc3RydWN0IHNvY2thZGRyICAqZnJvbTsKKwltc2dfdCAgICAgICAgICAgIG1zZzsKKwl1aW50OF90ICAgICAgICAgIHF1ZXJ5X3N0YXR1czsKKwl1aW50OF90ICAgICAgICAgIHF1ZXJ5X3Bwb2xsOworCWxfZml4ZWRwdF90ICAgICAgcXVlcnlfeG10dGltZTsKKworCXRvID0gZ2V0X3NvY2tfbHNhKEcubGlzdGVuX2ZkKTsKKwlmcm9tID0geHphbGxvYyh0by0+bGVuKTsKKworCXNpemUgPSByZWN2X2Zyb21fdG8oRy5saXN0ZW5fZmQsICZtc2csIHNpemVvZihtc2cpLCBNU0dfRE9OVFdBSVQsIGZyb20sICZ0by0+dS5zYSwgdG8tPmxlbik7CisJaWYgKHNpemUgIT0gTlRQX01TR1NJWkVfTk9BVVRIICYmIHNpemUgIT0gTlRQX01TR1NJWkUpIHsKKwkJY2hhciAqYWRkcjsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJCWdvdG8gYmFpbDsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicmVjdiIpOworCQl9CisJCWFkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoZnJvbSk7CisJCWJiX2Vycm9yX21zZygibWFsZm9ybWVkIHBhY2tldCByZWNlaXZlZCBmcm9tICVzOiBzaXplICV1IiwgYWRkciwgKGludClzaXplKTsKKwkJZnJlZShhZGRyKTsKKwkJZ290byBiYWlsOworCX0KKworCXF1ZXJ5X3N0YXR1cyA9IG1zZy5tX3N0YXR1czsKKwlxdWVyeV9wcG9sbCA9IG1zZy5tX3Bwb2xsOworCXF1ZXJ5X3htdHRpbWUgPSBtc2cubV94bXR0aW1lOworCisJLyogQnVpbGQgYSByZXBseSBwYWNrZXQgKi8KKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tX3N0YXR1cyA9IEcuc3luY2VkID8gRy5sZWFwIDogTElfQUxBUk07CisJbXNnLm1fc3RhdHVzIHw9IChxdWVyeV9zdGF0dXMgJiBWRVJTSU9OX01BU0spOworCW1zZy5tX3N0YXR1cyB8PSAoKHF1ZXJ5X3N0YXR1cyAmIE1PREVfTUFTSykgPT0gTU9ERV9DTElFTlQpID8KKwkJCSBNT0RFX1NFUlZFUiA6IE1PREVfU1lNX1BBUzsKKwltc2cubV9zdHJhdHVtID0gRy5zdHJhdHVtOworCW1zZy5tX3Bwb2xsID0gcXVlcnlfcHBvbGw7CisJbXNnLm1fcHJlY2lzaW9uX2V4cCA9IEdfcHJlY2lzaW9uX2V4cDsKKwlyZWN0aW1lID0gZ2V0dGltZTE5MDBkKCk7CisJbXNnLm1feG10dGltZSA9IG1zZy5tX3JlY3RpbWUgPSBkX3RvX2xmcChyZWN0aW1lKTsKKwltc2cubV9yZWZ0aW1lID0gZF90b19sZnAoRy5yZWZ0aW1lKTsKKwkvL21zZy5tX3htdHRpbWUgPSBkX3RvX2xmcChnZXR0aW1lMTkwMGQoKSk7IC8vID0gbXNnLm1fcmVjdGltZQorCW1zZy5tX29yZ3RpbWUgPSBxdWVyeV94bXR0aW1lOworCW1zZy5tX3Jvb3RkZWxheSA9IGRfdG9fc2ZwKEcucm9vdGRlbGF5KTsKKwl2ZXJzaW9uID0gKHF1ZXJ5X3N0YXR1cyAmIFZFUlNJT05fTUFTSyk7IC8qIC4uLiA+PiBWRVJTSU9OX1NISUZUIC0gZG9uZSBiZWxvdyBpbnN0ZWFkICovCisJbXNnLm1fcmVmaWQgPSAodmVyc2lvbiA+ICgzIDw8IFZFUlNJT05fU0hJRlQpKSA/IEcucmVmaWQ0IDogRy5yZWZpZDsKKworCS8qIFdlIHJlcGx5IGZyb20gdGhlIGxvY2FsIGFkZHJlc3MgcGFja2V0IHdhcyBzZW50IHRvLAorCSAqIHRoaXMgbWFrZXMgdG8vZnJvbSBsb29rIHN3YXBwZWQgaGVyZTogKi8KKwlkb19zZW5kdG8oRy5saXN0ZW5fZmQsCisJCS8qZnJvbToqLyAmdG8tPnUuc2EsIC8qdG86Ki8gZnJvbSwgLyphZGRybGVuOiovIHRvLT5sZW4sCisJCSZtc2csIHNpemUpOworCisgYmFpbDoKKwlmcmVlKHRvKTsKKwlmcmVlKGZyb20pOworfQorI2VuZGlmCisKKy8qIFVwc3RyZWFtIG50cGQncyBvcHRpb25zOgorICoKKyAqIC00ICAgRm9yY2UgRE5TIHJlc29sdXRpb24gb2YgaG9zdCBuYW1lcyB0byB0aGUgSVB2NCBuYW1lc3BhY2UuCisgKiAtNiAgIEZvcmNlIEROUyByZXNvbHV0aW9uIG9mIGhvc3QgbmFtZXMgdG8gdGhlIElQdjYgbmFtZXNwYWNlLgorICogLWEgICBSZXF1aXJlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24gZm9yIGJyb2FkY2FzdCBjbGllbnQsCisgKiAgICAgIG11bHRpY2FzdCBjbGllbnQgYW5kIHN5bW1ldHJpYyBwYXNzaXZlIGFzc29jaWF0aW9ucy4KKyAqICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KKyAqIC1BICAgRG8gbm90IHJlcXVpcmUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiBmb3IgYnJvYWRjYXN0IGNsaWVudCwKKyAqICAgICAgbXVsdGljYXN0IGNsaWVudCBhbmQgc3ltbWV0cmljIHBhc3NpdmUgYXNzb2NpYXRpb25zLgorICogICAgICBUaGlzIGlzIGFsbW9zdCBuZXZlciBhIGdvb2QgaWRlYS4KKyAqIC1iICAgRW5hYmxlIHRoZSBjbGllbnQgdG8gc3luY2hyb25pemUgdG8gYnJvYWRjYXN0IHNlcnZlcnMuCisgKiAtYyBjb25mZmlsZQorICogICAgICBTcGVjaWZ5IHRoZSBuYW1lIGFuZCBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsCisgKiAgICAgIGRlZmF1bHQgL2V0Yy9udHAuY29uZgorICogLWQgICBTcGVjaWZ5IGRlYnVnZ2luZyBtb2RlLiBUaGlzIG9wdGlvbiBtYXkgb2NjdXIgbW9yZSB0aGFuIG9uY2UsCisgKiAgICAgIHdpdGggZWFjaCBvY2N1cnJlbmNlIGluZGljYXRpbmcgZ3JlYXRlciBkZXRhaWwgb2YgZGlzcGxheS4KKyAqIC1EIGxldmVsCisgKiAgICAgIFNwZWNpZnkgZGVidWdnaW5nIGxldmVsIGRpcmVjdGx5LgorICogLWYgZHJpZnRmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGZyZXF1ZW5jeSBmaWxlLgorICogICAgICBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgImRyaWZ0ZmlsZSBGSUxFIgorICogICAgICBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtZyAgIE5vcm1hbGx5LCBudHBkIGV4aXRzIHdpdGggYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nCisgKiAgICAgIGlmIHRoZSBvZmZzZXQgZXhjZWVkcyB0aGUgcGFuaWMgdGhyZXNob2xkLCB3aGljaCBpcyAxMDAwIHMKKyAqICAgICAgYnkgZGVmYXVsdC4gVGhpcyBvcHRpb24gYWxsb3dzIHRoZSB0aW1lIHRvIGJlIHNldCB0byBhbnkgdmFsdWUKKyAqICAgICAgd2l0aG91dCByZXN0cmljdGlvbjsgaG93ZXZlciwgdGhpcyBjYW4gaGFwcGVuIG9ubHkgb25jZS4KKyAqICAgICAgSWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZCBhZnRlciB0aGF0LCBudHBkIHdpbGwgZXhpdAorICogICAgICB3aXRoIGEgbWVzc2FnZSB0byB0aGUgc3lzdGVtIGxvZy4gVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQKKyAqICAgICAgd2l0aCB0aGUgLXEgYW5kIC14IG9wdGlvbnMuIFNlZSB0aGUgdGlua2VyIGNvbW1hbmQgZm9yIG90aGVyIG9wdGlvbnMuCisgKiAtaSBqYWlsZGlyCisgKiAgICAgIENocm9vdCB0aGUgc2VydmVyIHRvIHRoZSBkaXJlY3RvcnkgamFpbGRpci4gVGhpcyBvcHRpb24gYWxzbyBpbXBsaWVzCisgKiAgICAgIHRoYXQgdGhlIHNlcnZlciBhdHRlbXB0cyB0byBkcm9wIHJvb3QgcHJpdmlsZWdlcyBhdCBzdGFydHVwCisgKiAgICAgIChvdGhlcndpc2UsIGNocm9vdCBnaXZlcyB2ZXJ5IGxpdHRsZSBhZGRpdGlvbmFsIHNlY3VyaXR5KS4KKyAqICAgICAgWW91IG1heSBuZWVkIHRvIGFsc28gc3BlY2lmeSBhIC11IG9wdGlvbi4KKyAqIC1rIGtleWZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgc3ltbWV0cmljIGtleSBmaWxlLAorICogICAgICBkZWZhdWx0IC9ldGMvbnRwL2tleXMuIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uCisgKiAgICAgIGFzIHRoZSAia2V5cyBGSUxFIiBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtbCBsb2dmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGxvZyBmaWxlLiBUaGUgZGVmYXVsdAorICogICAgICBpcyB0aGUgc3lzdGVtIGxvZyBmaWxlLiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcworICogICAgICB0aGUgImxvZ2ZpbGUgRklMRSIgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLUwgICBEbyBub3QgbGlzdGVuIHRvIHZpcnR1YWwgSVBzLiBUaGUgZGVmYXVsdCBpcyB0byBsaXN0ZW4uCisgKiAtbiAgIERvbid0IGZvcmsuCisgKiAtTiAgIFRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICogICAgICBydW4gdGhlIG50cGQgYXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisgKiAtcCBwaWRmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGZpbGUgdXNlZCB0byByZWNvcmQgdGhlIG50cGQKKyAqICAgICAgcHJvY2VzcyBJRC4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlICJwaWRmaWxlIEZJTEUiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1QIHByaW9yaXR5CisgKiAgICAgIFRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICogICAgICBydW4gdGhlIG50cGQgYXQgdGhlIHNwZWNpZmllZCBwcmlvcml0eS4KKyAqIC1xICAgRXhpdCB0aGUgbnRwZCBqdXN0IGFmdGVyIHRoZSBmaXJzdCB0aW1lIHRoZSBjbG9jayBpcyBzZXQuCisgKiAgICAgIFRoaXMgYmVoYXZpb3IgbWltaWNzIHRoYXQgb2YgdGhlIG50cGRhdGUgcHJvZ3JhbSwgd2hpY2ggaXMKKyAqICAgICAgdG8gYmUgcmV0aXJlZC4gVGhlIC1nIGFuZCAteCBvcHRpb25zIGNhbiBiZSB1c2VkIHdpdGggdGhpcyBvcHRpb24uCisgKiAgICAgIE5vdGU6IFRoZSBrZXJuZWwgdGltZSBkaXNjaXBsaW5lIGlzIGRpc2FibGVkIHdpdGggdGhpcyBvcHRpb24uCisgKiAtciBicm9hZGNhc3RkZWxheQorICogICAgICBTcGVjaWZ5IHRoZSBkZWZhdWx0IHByb3BhZ2F0aW9uIGRlbGF5IGZyb20gdGhlIGJyb2FkY2FzdC9tdWx0aWNhc3QKKyAqICAgICAgc2VydmVyIHRvIHRoaXMgY2xpZW50LiBUaGlzIGlzIG5lY2Vzc2FyeSBvbmx5IGlmIHRoZSBkZWxheQorICogICAgICBjYW5ub3QgYmUgY29tcHV0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgcHJvdG9jb2wuCisgKiAtcyBzdGF0c2RpcgorICogICAgICBTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgcGF0aCBmb3IgZmlsZXMgY3JlYXRlZCBieSB0aGUgc3RhdGlzdGljcworICogICAgICBmYWNpbGl0eS4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhlICJzdGF0c2RpciBESVIiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC10IGtleQorICogICAgICBBZGQgYSBrZXkgbnVtYmVyIHRvIHRoZSB0cnVzdGVkIGtleSBsaXN0LiBUaGlzIG9wdGlvbiBjYW4gb2NjdXIKKyAqICAgICAgbW9yZSB0aGFuIG9uY2UuCisgKiAtdSB1c2VyWzpncm91cF0KKyAqICAgICAgU3BlY2lmeSBhIHVzZXIsIGFuZCBvcHRpb25hbGx5IGEgZ3JvdXAsIHRvIHN3aXRjaCB0by4KKyAqIC12IHZhcmlhYmxlCisgKiAtViB2YXJpYWJsZQorICogICAgICBBZGQgYSBzeXN0ZW0gdmFyaWFibGUgbGlzdGVkIGJ5IGRlZmF1bHQuCisgKiAteCAgIE5vcm1hbGx5LCB0aGUgdGltZSBpcyBzbGV3ZWQgaWYgdGhlIG9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIHN0ZXAKKyAqICAgICAgdGhyZXNob2xkLCB3aGljaCBpcyAxMjggbXMgYnkgZGVmYXVsdCwgYW5kIHN0ZXBwZWQgaWYgYWJvdmUKKyAqICAgICAgdGhlIHRocmVzaG9sZC4gVGhpcyBvcHRpb24gc2V0cyB0aGUgdGhyZXNob2xkIHRvIDYwMCBzLCB3aGljaCBpcworICogICAgICB3ZWxsIHdpdGhpbiB0aGUgYWNjdXJhY3kgd2luZG93IHRvIHNldCB0aGUgY2xvY2sgbWFudWFsbHkuCisgKiAgICAgIE5vdGU6IHNpbmNlIHRoZSBzbGV3IHJhdGUgb2YgdHlwaWNhbCBVbml4IGtlcm5lbHMgaXMgbGltaXRlZAorICogICAgICB0byAwLjUgbXMvcywgZWFjaCBzZWNvbmQgb2YgYWRqdXN0bWVudCByZXF1aXJlcyBhbiBhbW9ydGl6YXRpb24KKyAqICAgICAgaW50ZXJ2YWwgb2YgMjAwMCBzLiBUaHVzLCBhbiBhZGp1c3RtZW50IGFzIG11Y2ggYXMgNjAwIHMKKyAqICAgICAgd2lsbCB0YWtlIGFsbW9zdCAxNCBkYXlzIHRvIGNvbXBsZXRlLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAorICogICAgICB3aXRoIHRoZSAtZyBhbmQgLXEgb3B0aW9ucy4gU2VlIHRoZSB0aW5rZXIgY29tbWFuZCBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqICAgICAgTm90ZTogVGhlIGtlcm5lbCB0aW1lIGRpc2NpcGxpbmUgaXMgZGlzYWJsZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqLworCisvKiBCeSBkb2luZyBpbml0IGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gd2UgZGVjcmVhc2Ugc3RhY2sgdXNhZ2UKKyAqIGluIG1haW4gbG9vcC4KKyAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgbnRwX2luaXQoY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwlsbGlzdF90ICpwZWVyczsKKworCXNyYW5kb20oZ2V0cGlkKCkpOworCisJaWYgKGdldHVpZCgpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisKKwlwZWVycyA9IE5VTEw7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZGQ6cDo6IjsgLyogZDogY291bnRlciwgcDogbGlzdCAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkJIm5xTngiIC8qIGNvbXBhdCAqLworCQkJInA6IklGX0ZFQVRVUkVfTlRQRF9TRVJWRVIoImwiKSAvKiBOT1QgY29tcGF0ICovCisJCQkiZCIgLyogY29tcGF0ICovCisJCQkiNDZhQWJnTCIsIC8qIGNvbXBhdCwgaWdub3JlZCAqLworCQkJJnBlZXJzLCAmRy52ZXJib3NlKTsKKwlpZiAoIShvcHRzICYgKE9QVF9wfE9QVF9sKSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAob3B0cyAmIE9QVF94KSAvKiBkaXNhYmxlIHN0ZXBwaW5nLCBvbmx5IHNsZXcgaXMgYWxsb3dlZCAqLworCQlHLnRpbWVfd2FzX3N0ZXBwZWQgPSAxOworCXdoaWxlIChwZWVycykKKwkJYWRkX3BlZXJzKGxsaXN0X3BvcCgmcGVlcnMpKTsKKwlpZiAoIShvcHRzICYgT1BUX24pKSB7CisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fREVWTlVMTF9TVERJTywgYXJndik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJRy5saXN0ZW5fZmQgPSAtMTsKKwlpZiAob3B0cyAmIE9QVF9sKSB7CisJCUcubGlzdGVuX2ZkID0gY3JlYXRlX2FuZF9iaW5kX2RncmFtX29yX2RpZShOVUxMLCAxMjMpOworCQlzb2NrZXRfd2FudF9wa3RpbmZvKEcubGlzdGVuX2ZkKTsKKwkJc2V0c29ja29wdChHLmxpc3Rlbl9mZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAmY29uc3RfSVBUT1NfTE9XREVMQVksIHNpemVvZihjb25zdF9JUFRPU19MT1dERUxBWSkpOworCX0KKyNlbmRpZgorCS8qIEkgaGVzaXRhdGUgdG8gc2V0IC0yMCBwcmlvLiAtMTUgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIGZvciB0aW1la2VlcGluZyAqLworCWlmIChvcHRzICYgT1BUX04pCisJCXNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgLTE1KTsKKworCS8qIFNldCBzb21lIGdsb2JhbHMgKi8KKyNpZiAwCisJLyogV2l0aCBjb25zdGFudCBiID0gMTAwLCBHLnByZWNpc2lvbl9leHAgaXMgYWxzbyBjb25zdGFudCAtNi4KKwkgKiBVbmNvbW1lbnQgdGhpcyBhbmQgeW91J2xsIHNlZSAqLworCXsKKwkJaW50IHByZWMgPSAwOworCQlpbnQgYjsKKyMgaWYgMAorCQlzdHJ1Y3QgdGltZXNwZWMgdHA7CisJCS8qIFdlIGNhbiB1c2Ugc3lzX2Nsb2NrX2dldHJlcyBidXQgYXNzdW1pbmcgMTBtcyB0aWNrIHNob3VsZCBiZSBmaW5lICovCisJCWNsb2NrX2dldHJlcyhDTE9DS19SRUFMVElNRSwgJnRwKTsKKwkJdHAudHZfc2VjID0gMDsKKwkJdHAudHZfbnNlYyA9IDEwMDAwMDAwOworCQliID0gMTAwMDAwMDAwMCAvIHRwLnR2X25zZWM7ICAvKiBjb252ZXJ0IHRvIEh6ICovCisjIGVsc2UKKwkJYiA9IDEwMDsgLyogYiA9IDEwMDAwMDAwMDAvMTAwMDAwMDAgPSAxMDAgKi8KKyMgZW5kaWYKKwkJd2hpbGUgKGIgPiAxKQorCQkJcHJlYy0tLCBiID4+PSAxOworCQkvL0cucHJlY2lzaW9uX2V4cCA9IHByZWM7CisJCWJiX2Vycm9yX21zZygiRy5wcmVjaXNpb25fZXhwOiVkIiwgcHJlYyk7IC8qIC02ICovCisJfQorI2VuZGlmCisJRy5zY2FsZSA9IDE7CisKKwliYl9zaWduYWxzKCgxIDw8IFNJR1RFUk0pIHwgKDEgPDwgU0lHSU5UKSwgcmVjb3JkX3NpZ25vKTsKKwliYl9zaWduYWxzKCgxIDw8IFNJR1BJUEUpIHwgKDEgPDwgU0lHSFVQKSwgU0lHX0lHTik7Cit9CisKK2ludCBudHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbnRwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdsb2JhbHMgZzsKKwlzdHJ1Y3QgcG9sbGZkICpwZmQ7CisJcGVlcl90ICoqaWR4MnBlZXI7CisKKwltZW1zZXQoJmcsIDAsIHNpemVvZihnKSk7CisJU0VUX1BUUl9UT19HTE9CQUxTKCZnKTsKKworCW50cF9pbml0KGFyZ3YpOworCisJeworCQkvKiBpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUiwgKyAxIGZvciBsaXN0ZW5fZmQ6ICovCisJCXVuc2lnbmVkIGNudCA9IGcucGVlcl9jbnQgKyBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUjsKKwkJaWR4MnBlZXIgPSB4emFsbG9jKHNpemVvZihpZHgycGVlclswXSkgKiBjbnQpOworCQlwZmQgPSB4emFsbG9jKHNpemVvZihwZmRbMF0pICogY250KTsKKwl9CisKKwl3aGlsZSAoIWJiX2dvdF9zaWduYWwpIHsKKwkJbGxpc3RfdCAqaXRlbTsKKwkJdW5zaWduZWQgaSwgajsKKwkJdW5zaWduZWQgc2VudF9jbnQsIHRyaWFsX2NudDsKKwkJaW50IG5mZHMsIHRpbWVvdXQ7CisJCXRpbWVfdCBjdXJfdGltZSwgbmV4dGFjdGlvbjsKKworCQkvKiBOb3RoaW5nIGJldHdlZW4gaGVyZSBhbmQgcG9sbCgpIGJsb2NrcyBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUgKi8KKworCQljdXJfdGltZSA9IHRpbWUoTlVMTCk7CisJCW5leHRhY3Rpb24gPSBjdXJfdGltZSArIDM2MDA7CisKKwkJaSA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwkJaWYgKGcubGlzdGVuX2ZkICE9IC0xKSB7CisJCQlwZmRbMF0uZmQgPSBnLmxpc3Rlbl9mZDsKKwkJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCQlpKys7CisJCX0KKyNlbmRpZgorCQkvKiBQYXNzIG92ZXIgcGVlciBsaXN0LCBzZW5kIHJlcXVlc3RzLCB0aW1lIG91dCBvbiByZWNlaXZlcyAqLworCQlzZW50X2NudCA9IHRyaWFsX2NudCA9IDA7CisJCWZvciAoaXRlbSA9IGcubnRwX3BlZXJzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5saW5rKSB7CisJCQlwZWVyX3QgKnAgPSAocGVlcl90ICopIGl0ZW0tPmRhdGE7CisKKwkJCS8qIE92ZXJmbG93LXNhZmUgImlmIChwLT5uZXh0X2FjdGlvbl90aW1lIDw9IGN1cl90aW1lKSAuLi4iICovCisJCQlpZiAoKGludCkoY3VyX3RpbWUgLSBwLT5uZXh0X2FjdGlvbl90aW1lKSA+PSAwKSB7CisJCQkJaWYgKHAtPnBfZmQgPT0gLTEpIHsKKwkJCQkJLyogVGltZSB0byBzZW5kIG5ldyByZXEgKi8KKwkJCQkJdHJpYWxfY250Kys7CisJCQkJCWlmIChzZW5kX3F1ZXJ5X3RvX3BlZXIocCkgPT0gMCkKKwkJCQkJCXNlbnRfY250Kys7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlcGx5ICovCisJCQkJCWNsb3NlKHAtPnBfZmQpOworCQkJCQlwLT5wX2ZkID0gLTE7CisJCQkJCXRpbWVvdXQgPSBlcnJvcl9pbnRlcnZhbCgpOworCQkJCQliYl9lcnJvcl9tc2coInRpbWVkIG91dCB3YWl0aW5nIGZvciAlcywgIgorCQkJCQkJCSJuZXh0IHF1ZXJ5IGluICV1cyIsIHAtPnBfZG90dGVkLCB0aW1lb3V0KTsKKwkJCQkJaWYgKHAtPnBfdHJ1c3RsZXZlbCA+PSBUUlVTVExFVkVMX0JBRFBFRVIpIHsKKwkJCQkJCXAtPnBfdHJ1c3RsZXZlbCAvPSAyOworCQkJCQkJaWYgKHAtPnBfdHJ1c3RsZXZlbCA8IFRSVVNUTEVWRUxfQkFEUEVFUikKKwkJCQkJCQliYl9lcnJvcl9tc2coInBlZXIgJXMgbm93IGludmFsaWQiLCBwLT5wX2RvdHRlZCk7CisJCQkJCX0KKwkJCQkJc2V0X25leHQocCwgdGltZW91dCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocC0+bmV4dF9hY3Rpb25fdGltZSA8IG5leHRhY3Rpb24pCisJCQkJbmV4dGFjdGlvbiA9IHAtPm5leHRfYWN0aW9uX3RpbWU7CisKKwkJCWlmIChwLT5wX2ZkID49IDApIHsKKwkJCQkvKiBXYWl0IGZvciByZXBseSBmcm9tIHRoaXMgcGVlciAqLworCQkJCXBmZFtpXS5mZCA9IHAtPnBfZmQ7CisJCQkJcGZkW2ldLmV2ZW50cyA9IFBPTExJTjsKKwkJCQlpZHgycGVlcltpXSA9IHA7CisJCQkJaSsrOworCQkJfQorCQl9CisKKwkJaWYgKCh0cmlhbF9jbnQgPiAwICYmIHNlbnRfY250ID09IDApIHx8IGcucGVlcl9jbnQgPT0gMCkKKwkJCXN0ZXBfdGltZV9vbmNlKDApOyAvKiBubyBnb29kIHBlZXJzLCBkb24ndCB3YWl0ICovCisKKwkJdGltZW91dCA9IG5leHRhY3Rpb24gLSBjdXJfdGltZTsKKwkJaWYgKHRpbWVvdXQgPCAxKQorCQkJdGltZW91dCA9IDE7CisKKwkJLyogSGVyZSB3ZSBtYXkgYmxvY2sgKi8KKwkJaWYgKGcudmVyYm9zZSA+PSAyKQorCQkJYmJfZXJyb3JfbXNnKCJwb2xsICV1cywgc29ja2V0czoldSIsIHRpbWVvdXQsIGkpOworCQluZmRzID0gcG9sbChwZmQsIGksIHRpbWVvdXQgKiAxMDAwKTsKKwkJaWYgKG5mZHMgPD0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFByb2Nlc3MgYW55IHJlY2VpdmVkIHBhY2tldHMgKi8KKwkJaiA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIKKwkJaWYgKGcubGlzdGVuX2ZkICE9IC0xKSB7CisJCQlpZiAocGZkWzBdLnJldmVudHMgLyogJiAoUE9MTElOfFBPTExFUlIpKi8pIHsKKwkJCQluZmRzLS07CisJCQkJcmVjdl9hbmRfcHJvY2Vzc19jbGllbnRfcGt0KC8qZy5saXN0ZW5fZmQqLyk7CisJCQl9CisJCQlqID0gMTsKKwkJfQorI2VuZGlmCisJCWZvciAoOyBuZmRzICE9IDAgJiYgaiA8IGk7IGorKykgeworCQkJaWYgKHBmZFtqXS5yZXZlbnRzIC8qICYgKFBPTExJTnxQT0xMRVJSKSovKSB7CisJCQkJbmZkcy0tOworCQkJCXJlY3ZfYW5kX3Byb2Nlc3NfcGVlcl9wa3QoaWR4MnBlZXJbal0pOworCQkJfQorCQl9CisJfSAvKiB3aGlsZSAoIWJiX2dvdF9zaWduYWwpICovCisKKwlraWxsX215c2VsZl93aXRoX3NpZyhiYl9nb3Rfc2lnbmFsKTsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvcGluZy5jIGIvbmV0d29ya2luZy9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkNGYyMQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvcGluZy5jCkBAIC0wLDAgKzEsOTQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHBpbmcgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisgKgorICogQWRhcHRlZCBmcm9tIHRoZSBwaW5nIGluIG5ldGtpdC1iYXNlIDAuMTA6CisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogTWlrZSBNdXVzcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBmcm9tIHBpbmc2LmM6CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyB2ZXJzaW9uIG9mIHBpbmcgaXMgYWRhcHRlZCBmcm9tIHRoZSBwaW5nIGluIG5ldGtpdC1iYXNlIDAuMTAsCisgKiB3aGljaCBpczoKKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIFRoaXMgdmVyc2lvbiBpcyBhbiBhZGFwdGF0aW9uIG9mIHBpbmcuYyBmcm9tIGJ1c3lib3guCisgKiBUaGUgY29kZSB3YXMgbW9kaWZpZWQgYnkgQmFydCBWaXNzY2hlciA8bWFnaWNrQGxpbnV4LWZhbi5jb20+CisgKi8KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZmRlZiBfX0JJT05JQ19fCisvKiBzaG91bGQgYmUgaW4gbmV0aW5ldC9pcF9pY21wLmggKi8KKyMgZGVmaW5lIElDTVBfREVTVF9VTlJFQUNIICAgIDMgIC8qIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlICAqLworIyBkZWZpbmUgSUNNUF9TT1VSQ0VfUVVFTkNIICAgNCAgLyogU291cmNlIFF1ZW5jaCAgICAqLworIyBkZWZpbmUgSUNNUF9SRURJUkVDVCAgICAgICAgNSAgLyogUmVkaXJlY3QgKGNoYW5nZSByb3V0ZSkgICovCisjIGRlZmluZSBJQ01QX0VDSE8gICAgICAgICAgICA4ICAvKiBFY2hvIFJlcXVlc3QgICAgICAqLworIyBkZWZpbmUgSUNNUF9USU1FX0VYQ0VFREVEICAxMSAgLyogVGltZSBFeGNlZWRlZCAgICAqLworIyBkZWZpbmUgSUNNUF9QQVJBTUVURVJQUk9CICAxMiAgLyogUGFyYW1ldGVyIFByb2JsZW0gICAgKi8KKyMgZGVmaW5lIElDTVBfVElNRVNUQU1QICAgICAgMTMgIC8qIFRpbWVzdGFtcCBSZXF1ZXN0ICAgICovCisjIGRlZmluZSBJQ01QX1RJTUVTVEFNUFJFUExZIDE0ICAvKiBUaW1lc3RhbXAgUmVwbHkgICAgKi8KKyMgZGVmaW5lIElDTVBfSU5GT19SRVFVRVNUICAgMTUgIC8qIEluZm9ybWF0aW9uIFJlcXVlc3QgICAgKi8KKyMgZGVmaW5lIElDTVBfSU5GT19SRVBMWSAgICAgMTYgIC8qIEluZm9ybWF0aW9uIFJlcGx5ICAgICovCisjIGRlZmluZSBJQ01QX0FERFJFU1MgICAgICAgIDE3ICAvKiBBZGRyZXNzIE1hc2sgUmVxdWVzdCAgICAqLworIyBkZWZpbmUgSUNNUF9BRERSRVNTUkVQTFkgICAxOCAgLyogQWRkcmVzcyBNYXNrIFJlcGx5ICAgICovCisjZW5kaWYKKworLy9jb25maWc6Y29uZmlnIFBJTkcKKy8vY29uZmlnOglib29sICJwaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHBpbmcgdXNlcyB0aGUgSUNNUCBwcm90b2NvbCdzIG1hbmRhdG9yeSBFQ0hPX1JFUVVFU1QgZGF0YWdyYW0gdG8KKy8vY29uZmlnOgkgIGVsaWNpdCBhbiBJQ01QIEVDSE9fUkVTUE9OU0UgZnJvbSBhIGhvc3Qgb3IgZ2F0ZXdheS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFBJTkc2CisvL2NvbmZpZzoJYm9vbCAicGluZzYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0lQVjYgJiYgUElORworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgd2lsbCBnaXZlIHlvdSBhIHBpbmcgdGhhdCBjYW4gdGFsayBJUHY2LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GQU5DWV9QSU5HCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGZhbmN5IHBpbmcgb3V0cHV0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gUElORworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2UgdGhlIG91dHB1dCBmcm9tIHRoZSBwaW5nIGFwcGxldCBpbmNsdWRlIHN0YXRpc3RpY3MsIGFuZCBhdCB0aGUKKy8vY29uZmlnOgkgIHNhbWUgdGltZSBwcm92aWRlIGZ1bGwgc3VwcG9ydCBmb3IgSUNNUCBwYWNrZXRzLgorCisvKiBOZWVkcyBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fSUNNUCksIHRoZXJlZm9yZSBCQl9TVUlEX01BWUJFOiAqLworLy9hcHBsZXQ6SUZfUElORyhBUFBMRVQocGluZywgQkJfRElSX0JJTiwgQkJfU1VJRF9NQVlCRSkpCisvL2FwcGxldDpJRl9QSU5HNihBUFBMRVQocGluZzYsIEJCX0RJUl9CSU4sIEJCX1NVSURfTUFZQkUpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUElORykgICs9IHBpbmcubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BJTkc2KSArPSBwaW5nLm8KKworLy91c2FnZTojaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX1BJTkcKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiSE9TVCIKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgcGFja2V0cyB0byBuZXR3b3JrIGhvc3RzIgorLy91c2FnZTojIGRlZmluZSBwaW5nNl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiSE9TVCIKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZzZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIElDTVAgRUNIT19SRVFVRVNUIHBhY2tldHMgdG8gbmV0d29yayBob3N0cyIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QiCisvL3VzYWdlOiMgZGVmaW5lIHBpbmdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIElDTVAgRUNIT19SRVFVRVNUIHBhY2tldHMgdG8gbmV0d29yayBob3N0c1xuIgorLy91c2FnZTogICAgICJcbgktNCwtNgkJRm9yY2UgSVAgb3IgSVB2NiBuYW1lIHJlc29sdXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1jIENOVAkJU2VuZCBvbmx5IENOVCBwaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0laRQkJU2VuZCBTSVpFIGRhdGEgYnl0ZXMgaW4gcGFja2V0cyAoZGVmYXVsdDo1NikiCisvL3VzYWdlOiAgICAgIlxuCS10IFRUTAkJU2V0IFRUTCIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgSUZBQ0UvSVAJVXNlIGludGVyZmFjZSBvciBJUCBhZGRyZXNzIGFzIHNvdXJjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVcgU0VDCQlTZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCByZXNwb25zZSAoZGVmYXVsdDoxMCkiCisvL3VzYWdlOiAgICAgIlxuCQkJKGFmdGVyIGFsbCAtYyBDTlQgcGFja2V0cyBhcmUgc2VudCkiCisvL3VzYWdlOiAgICAgIlxuCS13IFNFQwkJU2Vjb25kcyB1bnRpbCBwaW5nIGV4aXRzIChkZWZhdWx0OmluZmluaXRlKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkoY2FuIGV4aXQgZWFybGllciB3aXRoIC1jIENOVCkiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlRdWlldCwgb25seSBkaXNwbGF5cyBvdXRwdXQgYXQgc3RhcnQiCisvL3VzYWdlOiAgICAgIlxuCQkJYW5kIHdoZW4gZmluaXNoZWQiCisvL3VzYWdlOgorLy91c2FnZTojIGRlZmluZSBwaW5nNl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QiCisvL3VzYWdlOiMgZGVmaW5lIHBpbmc2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBJQ01QIEVDSE9fUkVRVUVTVCBwYWNrZXRzIHRvIG5ldHdvcmsgaG9zdHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQ05UCQlTZW5kIG9ubHkgQ05UIHBpbmdzIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTZW5kIFNJWkUgZGF0YSBieXRlcyBpbiBwYWNrZXRzIChkZWZhdWx0OjU2KSIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgSUZBQ0UvSVAJVXNlIGludGVyZmFjZSBvciBJUCBhZGRyZXNzIGFzIHNvdXJjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aWV0LCBvbmx5IGRpc3BsYXlzIG91dHB1dCBhdCBzdGFydCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlhbmQgd2hlbiBmaW5pc2hlZCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbmRpZgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwaW5nX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHBpbmcgbG9jYWxob3N0XG4iCisvL3VzYWdlOiAgICAgICAiUElORyBzbGFnICgxMjcuMC4wLjEpOiA1NiBkYXRhIGJ5dGVzXG4iCisvL3VzYWdlOiAgICAgICAiNjQgYnl0ZXMgZnJvbSAxMjcuMC4wLjE6IGljbXBfc2VxPTAgdHRsPTI1NSB0aW1lPTIwLjEgbXNcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICItLS0gZGViaWFuIHBpbmcgc3RhdGlzdGljcyAtLS1cbiIKKy8vdXNhZ2U6ICAgICAgICIxIHBhY2tldHMgdHJhbnNtaXR0ZWQsIDEgcGFja2V0cyByZWNlaXZlZCwgMCUgcGFja2V0IGxvc3NcbiIKKy8vdXNhZ2U6ICAgICAgICJyb3VuZC10cmlwIG1pbi9hdmcvbWF4ID0gMjAuMS8yMC4xLzIwLjEgbXNcbiIKKy8vdXNhZ2U6I2RlZmluZSBwaW5nNl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwaW5nNiBpcDYtbG9jYWxob3N0XG4iCisvL3VzYWdlOiAgICAgICAiUElORyBpcDYtbG9jYWxob3N0ICg6OjEpOiA1NiBkYXRhIGJ5dGVzXG4iCisvL3VzYWdlOiAgICAgICAiNjQgYnl0ZXMgZnJvbSA6OjE6IGljbXA2X3NlcT0wIHR0bD02NCB0aW1lPTIwLjEgbXNcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICItLS0gaXA2LWxvY2FsaG9zdCBwaW5nIHN0YXRpc3RpY3MgLS0tXG4iCisvL3VzYWdlOiAgICAgICAiMSBwYWNrZXRzIHRyYW5zbWl0dGVkLCAxIHBhY2tldHMgcmVjZWl2ZWQsIDAlIHBhY2tldCBsb3NzXG4iCisvL3VzYWdlOiAgICAgICAicm91bmQtdHJpcCBtaW4vYXZnL21heCA9IDIwLjEvMjAuMS8yMC4xIG1zXG4iCisKKyNpZiBFTkFCTEVfUElORzYKKyMgaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorLyogSSBzZWUgUkVOVU1CRVJFRCBjb25zdGFudHMgaW4gYml0cy9pbi5oIC0gISE/CisgKiBXaGF0IGEgZnVjayBpcyBnb2luZyBvbiB3aXRoIGxpYmM/IElzIGl0IGEgZ2xpYmMgam9rZT8gKi8KKyMgaWZkZWYgSVBWNl8yMjkySE9QTElNSVQKKyMgIHVuZGVmIElQVjZfSE9QTElNSVQKKyMgIGRlZmluZSBJUFY2X0hPUExJTUlUIElQVjZfMjI5MkhPUExJTUlUCisjIGVuZGlmCisjZW5kaWYKKworZW51bSB7CisJREVGREFUQUxFTiA9IDU2LAorCU1BWElQTEVOID0gNjAsCisJTUFYSUNNUExFTiA9IDc2LAorCU1BWF9EVVBfQ0hLID0gKDggKiAxMjgpLAorCU1BWFdBSVQgPSAxMCwKKwlQSU5HSU5URVJWQUwgPSAxLCAvKiAxIHNlY29uZCAqLworfTsKKworLyogQ29tbW9uIHJvdXRpbmVzICovCisKK3N0YXRpYyBpbnQgaW5fY2tzdW0odW5zaWduZWQgc2hvcnQgKmJ1ZiwgaW50IHN6KQoreworCWludCBubGVmdCA9IHN6OworCWludCBzdW0gPSAwOworCXVuc2lnbmVkIHNob3J0ICp3ID0gYnVmOworCXVuc2lnbmVkIHNob3J0IGFucyA9IDA7CisKKwl3aGlsZSAobmxlZnQgPiAxKSB7CisJCXN1bSArPSAqdysrOworCQlubGVmdCAtPSAyOworCX0KKworCWlmIChubGVmdCA9PSAxKSB7CisJCSoodW5zaWduZWQgY2hhciAqKSAoJmFucykgPSAqKHVuc2lnbmVkIGNoYXIgKikgdzsKKwkJc3VtICs9IGFuczsKKwl9CisKKwlzdW0gPSAoc3VtID4+IDE2KSArIChzdW0gJiAweEZGRkYpOworCXN1bSArPSAoc3VtID4+IDE2KTsKKwlhbnMgPSB+c3VtOworCXJldHVybiBhbnM7Cit9CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfUElORworCisvKiBTaW1wbGUgdmVyc2lvbiAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciAqaG9zdG5hbWU7CisJY2hhciBwYWNrZXRbREVGREFUQUxFTiArIE1BWElQTEVOICsgTUFYSUNNUExFTl07Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIG5vcmVzcChpbnQgaWduIFVOVVNFRF9QQVJBTSkKK3sKKwlwcmludGYoIk5vIHJlc3BvbnNlIGZyb20gJXNcbiIsIEcuaG9zdG5hbWUpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQgcGluZzQobGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCXN0cnVjdCBpY21wICpwa3Q7CisJaW50IHBpbmdzb2NrLCBjOworCisJcGluZ3NvY2sgPSBjcmVhdGVfaWNtcF9zb2NrZXQoKTsKKworCXBrdCA9IChzdHJ1Y3QgaWNtcCAqKSBHLnBhY2tldDsKKwltZW1zZXQocGt0LCAwLCBzaXplb2YoRy5wYWNrZXQpKTsKKwlwa3QtPmljbXBfdHlwZSA9IElDTVBfRUNITzsKKwlwa3QtPmljbXBfY2tzdW0gPSBpbl9ja3N1bSgodW5zaWduZWQgc2hvcnQgKikgcGt0LCBzaXplb2YoRy5wYWNrZXQpKTsKKworCXhzZW5kdG8ocGluZ3NvY2ssIEcucGFja2V0LCBERUZEQVRBTEVOICsgSUNNUF9NSU5MRU4sICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKworCS8qIGxpc3RlbiBmb3IgcmVwbGllcyAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBmcm9tOworCQlzb2NrbGVuX3QgZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKKworCQljID0gcmVjdmZyb20ocGluZ3NvY2ssIEcucGFja2V0LCBzaXplb2YoRy5wYWNrZXQpLCAwLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZmcm9tbGVuKTsKKwkJaWYgKGMgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJYmJfcGVycm9yX21zZygicmVjdmZyb20iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID49IDc2KSB7CQkJLyogaXAgKyBpY21wICovCisJCQlzdHJ1Y3QgaXBoZHIgKmlwaGRyID0gKHN0cnVjdCBpcGhkciAqKSBHLnBhY2tldDsKKworCQkJcGt0ID0gKHN0cnVjdCBpY21wICopIChHLnBhY2tldCArIChpcGhkci0+aWhsIDw8IDIpKTsJLyogc2tpcCBpcCBoZHIgKi8KKwkJCWlmIChwa3QtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKHBpbmdzb2NrKTsKK30KKworI2lmIEVOQUJMRV9QSU5HNgorc3RhdGljIHZvaWQgcGluZzYobGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCXN0cnVjdCBpY21wNl9oZHIgKnBrdDsKKwlpbnQgcGluZ3NvY2ssIGM7CisJaW50IHNvY2tvcHQ7CisKKwlwaW5nc29jayA9IGNyZWF0ZV9pY21wNl9zb2NrZXQoKTsKKworCXBrdCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIEcucGFja2V0OworCW1lbXNldChwa3QsIDAsIHNpemVvZihHLnBhY2tldCkpOworCXBrdC0+aWNtcDZfdHlwZSA9IElDTVA2X0VDSE9fUkVRVUVTVDsKKworCXNvY2tvcHQgPSBvZmZzZXRvZihzdHJ1Y3QgaWNtcDZfaGRyLCBpY21wNl9ja3N1bSk7CisJc2V0c29ja29wdChwaW5nc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisKKwl4c2VuZHRvKHBpbmdzb2NrLCBHLnBhY2tldCwgREVGREFUQUxFTiArIHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCisJLyogbGlzdGVuIGZvciByZXBsaWVzICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiBmcm9tOworCQlzb2NrbGVuX3QgZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKKworCQljID0gcmVjdmZyb20ocGluZ3NvY2ssIEcucGFja2V0LCBzaXplb2YoRy5wYWNrZXQpLCAwLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZmcm9tbGVuKTsKKwkJaWYgKGMgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJYmJfcGVycm9yX21zZygicmVjdmZyb20iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID49IElDTVBfTUlOTEVOKSB7CQkJLyogaWNtcDZfaGRyICovCisJCQlwa3QgPSAoc3RydWN0IGljbXA2X2hkciAqKSBHLnBhY2tldDsKKwkJCWlmIChwa3QtPmljbXA2X3R5cGUgPT0gSUNNUDZfRUNIT19SRVBMWSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKHBpbmdzb2NrKTsKK30KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9QSU5HNgorIyBkZWZpbmUgY29tbW9uX3BpbmdfbWFpbihhZiwgYXJndikgY29tbW9uX3BpbmdfbWFpbihhcmd2KQorI2VuZGlmCitzdGF0aWMgaW50IGNvbW1vbl9waW5nX21haW4oc2FfZmFtaWx5X3QgYWYsIGNoYXIgKiphcmd2KQoreworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX1BJTkc2CisJd2hpbGUgKCgrK2FyZ3YpWzBdICYmIGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2WzBdWzFdID09ICc0JykgeworCQkJYWYgPSBBRl9JTkVUOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZ3ZbMF1bMV0gPT0gJzYnKSB7CisJCQlhZiA9IEFGX0lORVQ2OworCQkJY29udGludWU7CisJCX0KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKyNlbHNlCisJYXJndisrOworI2VuZGlmCisKKwlHLmhvc3RuYW1lID0gKmFyZ3Y7CisJaWYgKCFHLmhvc3RuYW1lKQorCQliYl9zaG93X3VzYWdlKCk7CisKKyNpZiBFTkFCTEVfUElORzYKKwlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoRy5ob3N0bmFtZSwgMCwgYWYpOworI2Vsc2UKKwlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoRy5ob3N0bmFtZSwgMCwgQUZfSU5FVCk7CisjZW5kaWYKKwkvKiBTZXQgdGltZXIgX2FmdGVyXyBETlMgcmVzb2x1dGlvbiAqLworCXNpZ25hbChTSUdBTFJNLCBub3Jlc3ApOworCWFsYXJtKDUpOyAvKiBnaXZlIHRoZSBob3N0IDUwMDBtcyB0byByZXNwb25kICovCisKKyNpZiBFTkFCTEVfUElORzYKKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJcGluZzYobHNhKTsKKwllbHNlCisjZW5kaWYKKwkJcGluZzQobHNhKTsKKwlwcmludGYoIiVzIGlzIGFsaXZlIVxuIiwgRy5ob3N0bmFtZSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworCisjZWxzZSAvKiBGRUFUVVJFX0ZBTkNZX1BJTkcgKi8KKworCisvKiBGdWxsKGVyKSB2ZXJzaW9uICovCisKKyNkZWZpbmUgT1BUX1NUUklORyAoInF2YzpzOnQ6dzpXOkk6NCIgSUZfUElORzYoIjYiKSkKK2VudW0geworCU9QVF9RVUlFVCA9IDEgPDwgMCwKKwlPUFRfVkVSQk9TRSA9IDEgPDwgMSwKKwlPUFRfYyA9IDEgPDwgMiwKKwlPUFRfcyA9IDEgPDwgMywKKwlPUFRfdCA9IDEgPDwgNCwKKwlPUFRfdyA9IDEgPDwgNSwKKwlPUFRfVyA9IDEgPDwgNiwKKwlPUFRfSSA9IDEgPDwgNywKKwlPUFRfSVBWNCA9IDEgPDwgOCwKKwlPUFRfSVBWNiA9ICgxIDw8IDkpICogRU5BQkxFX1BJTkc2LAorfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IHBpbmdzb2NrOworCWludCBpZl9pbmRleDsKKwljaGFyICpzdHJfSTsKKwlsZW5fYW5kX3NvY2thZGRyICpzb3VyY2VfbHNhOworCXVuc2lnbmVkIGRhdGFsZW47CisJdW5zaWduZWQgcGluZ2NvdW50OyAvKiBtdXN0IGJlIGludC1zaXplZCAqLworCXVuc2lnbmVkIG9wdF90dGw7CisJdW5zaWduZWQgbG9uZyBudHJhbnNtaXR0ZWQsIG5yZWNlaXZlZCwgbnJlcGVhdHM7CisJdWludDE2X3QgbXlpZDsKKwl1bnNpZ25lZCB0bWluLCB0bWF4OyAvKiBpbiB1cyAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyB0c3VtOyAvKiBpbiB1cywgc3VtIG9mIGFsbCB0aW1lcyAqLworCXVuc2lnbmVkIGRlYWRsaW5lOworCXVuc2lnbmVkIHRpbWVvdXQ7CisJdW5zaWduZWQgdG90YWxfc2VjczsKKwl1bnNpZ25lZCBzaXplb2ZfcmN2X3BhY2tldDsKKwljaGFyICpyY3ZfcGFja2V0OyAvKiBbZGF0YWxlbiArIE1BWElQTEVOICsgTUFYSUNNUExFTl0gKi8KKwl2b2lkICpzbmRfcGFja2V0OyAvKiBbZGF0YWxlbiArIGlwdjQvaXB2Nl9jb25zdF0gKi8KKwljb25zdCBjaGFyICpob3N0bmFtZTsKKwljb25zdCBjaGFyICpkb3R0ZWQ7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisjaWYgRU5BQkxFX1BJTkc2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKKyNlbmRpZgorCX0gcGluZ2FkZHI7CisJY2hhciByY3ZkX3RibFtNQVhfRFVQX0NISyAvIDhdOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgcGluZ3NvY2sgICAgIChHLnBpbmdzb2NrICAgICkKKyNkZWZpbmUgaWZfaW5kZXggICAgIChHLmlmX2luZGV4ICAgICkKKyNkZWZpbmUgc291cmNlX2xzYSAgIChHLnNvdXJjZV9sc2EgICkKKyNkZWZpbmUgc3RyX0kgICAgICAgIChHLnN0cl9JICAgICAgICkKKyNkZWZpbmUgZGF0YWxlbiAgICAgIChHLmRhdGFsZW4gICAgICkKKyNkZWZpbmUgbnRyYW5zbWl0dGVkIChHLm50cmFuc21pdHRlZCkKKyNkZWZpbmUgbnJlY2VpdmVkICAgIChHLm5yZWNlaXZlZCAgICkKKyNkZWZpbmUgbnJlcGVhdHMgICAgIChHLm5yZXBlYXRzICAgICkKKyNkZWZpbmUgcGluZ2NvdW50ICAgIChHLnBpbmdjb3VudCAgICkKKyNkZWZpbmUgb3B0X3R0bCAgICAgIChHLm9wdF90dGwgICAgICkKKyNkZWZpbmUgbXlpZCAgICAgICAgIChHLm15aWQgICAgICAgICkKKyNkZWZpbmUgdG1pbiAgICAgICAgIChHLnRtaW4gICAgICAgICkKKyNkZWZpbmUgdG1heCAgICAgICAgIChHLnRtYXggICAgICAgICkKKyNkZWZpbmUgdHN1bSAgICAgICAgIChHLnRzdW0gICAgICAgICkKKyNkZWZpbmUgZGVhZGxpbmUgICAgIChHLmRlYWRsaW5lICAgICkKKyNkZWZpbmUgdGltZW91dCAgICAgIChHLnRpbWVvdXQgICAgICkKKyNkZWZpbmUgdG90YWxfc2VjcyAgIChHLnRvdGFsX3NlY3MgICkKKyNkZWZpbmUgaG9zdG5hbWUgICAgIChHLmhvc3RuYW1lICAgICkKKyNkZWZpbmUgZG90dGVkICAgICAgIChHLmRvdHRlZCAgICAgICkKKyNkZWZpbmUgcGluZ2FkZHIgICAgIChHLnBpbmdhZGRyICAgICkKKyNkZWZpbmUgcmN2ZF90YmwgICAgIChHLnJjdmRfdGJsICAgICkKK3ZvaWQgQlVHX3BpbmdfZ2xvYmFsc190b29fYmlnKHZvaWQpOworI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlpZiAoc2l6ZW9mKEcpID4gQ09NTU9OX0JVRlNJWkUpIFwKKwkJQlVHX3BpbmdfZ2xvYmFsc190b29fYmlnKCk7IFwKKwlwaW5nc29jayA9IC0xOyBcCisJZGF0YWxlbiA9IERFRkRBVEFMRU47IFwKKwl0aW1lb3V0ID0gTUFYV0FJVDsgXAorCXRtaW4gPSBVSU5UX01BWDsgXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIEEoYml0KQkJcmN2ZF90YmxbKGJpdCk+PjNdCS8qIGlkZW50aWZ5IGJ5dGUgaW4gYXJyYXkgKi8KKyNkZWZpbmUgQihiaXQpCQkoMSA8PCAoKGJpdCkgJiAweDA3KSkJLyogaWRlbnRpZnkgYml0IGluIGJ5dGUgKi8KKyNkZWZpbmUgU0VUKGJpdCkJKEEoYml0KSB8PSBCKGJpdCkpCisjZGVmaW5lIENMUihiaXQpCShBKGJpdCkgJj0gKH5CKGJpdCkpKQorI2RlZmluZSBUU1QoYml0KQkoQShiaXQpICYgQihiaXQpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRzX2FuZF9leGl0KGludCBqdW5rKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRzX2FuZF9leGl0KGludCBqdW5rIFVOVVNFRF9QQVJBTSkKK3sKKwlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKworCXByaW50ZigiXG4tLS0gJXMgcGluZyBzdGF0aXN0aWNzIC0tLVxuIiwgaG9zdG5hbWUpOworCXByaW50ZigiJWx1IHBhY2tldHMgdHJhbnNtaXR0ZWQsICIsIG50cmFuc21pdHRlZCk7CisJcHJpbnRmKCIlbHUgcGFja2V0cyByZWNlaXZlZCwgIiwgbnJlY2VpdmVkKTsKKwlpZiAobnJlcGVhdHMpCisJCXByaW50ZigiJWx1IGR1cGxpY2F0ZXMsICIsIG5yZXBlYXRzKTsKKwlpZiAobnRyYW5zbWl0dGVkKQorCQludHJhbnNtaXR0ZWQgPSAobnRyYW5zbWl0dGVkIC0gbnJlY2VpdmVkKSAqIDEwMCAvIG50cmFuc21pdHRlZDsKKwlwcmludGYoIiVsdSUlIHBhY2tldCBsb3NzXG4iLCBudHJhbnNtaXR0ZWQpOworCWlmICh0bWluICE9IFVJTlRfTUFYKSB7CisJCXVuc2lnbmVkIHRhdmcgPSB0c3VtIC8gKG5yZWNlaXZlZCArIG5yZXBlYXRzKTsKKwkJcHJpbnRmKCJyb3VuZC10cmlwIG1pbi9hdmcvbWF4ID0gJXUuJTAzdS8ldS4lMDN1LyV1LiUwM3UgbXNcbiIsCisJCQl0bWluIC8gMTAwMCwgdG1pbiAlIDEwMDAsCisJCQl0YXZnIC8gMTAwMCwgdGF2ZyAlIDEwMDAsCisJCQl0bWF4IC8gMTAwMCwgdG1heCAlIDEwMDApOworCX0KKwkvKiBpZiBjb25kaXRpb24gaXMgdHJ1ZSwgZXhpdCB3aXRoIDEgLS0gJ2ZhaWx1cmUnICovCisJZXhpdChucmVjZWl2ZWQgPT0gMCB8fCAoZGVhZGxpbmUgJiYgbnJlY2VpdmVkIDwgcGluZ2NvdW50KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRwaW5nX3RhaWwodm9pZCAoKnNwKShpbnQpLCBpbnQgc2l6ZV9wa3QpCit7CisJaW50IHN6OworCisJQ0xSKCh1aW50MTZfdCludHJhbnNtaXR0ZWQgJSBNQVhfRFVQX0NISyk7CisJbnRyYW5zbWl0dGVkKys7CisKKwlzaXplX3BrdCArPSBkYXRhbGVuOworCisJLyogc2l6ZW9mKHBpbmdhZGRyKSBjYW4gYmUgbGFyZ2VyIHRoYW4gcmVhbCBzYSBzaXplLCBidXQgSSB0aGluaworCSAqIGl0IGRvZXNuJ3QgbWF0dGVyICovCisJc3ogPSB4c2VuZHRvKHBpbmdzb2NrLCBHLnNuZF9wYWNrZXQsIHNpemVfcGt0LCAmcGluZ2FkZHIuc2EsIHNpemVvZihwaW5nYWRkcikpOworCWlmIChzeiAhPSBzaXplX3BrdCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3dyaXRlX2Vycm9yKTsKKworCWlmIChwaW5nY291bnQgPT0gMCB8fCBkZWFkbGluZSB8fCBudHJhbnNtaXR0ZWQgPCBwaW5nY291bnQpIHsKKwkJLyogRGlkbid0IHNlbmQgYWxsIHBpbmdzIHlldCAtIHNjaGVkdWxlIG5leHQgaW4gMXMgKi8KKwkJc2lnbmFsKFNJR0FMUk0sIHNwKTsKKwkJaWYgKGRlYWRsaW5lKSB7CisJCQl0b3RhbF9zZWNzICs9IFBJTkdJTlRFUlZBTDsKKwkJCWlmICh0b3RhbF9zZWNzID49IGRlYWRsaW5lKQorCQkJCXNpZ25hbChTSUdBTFJNLCBwcmludF9zdGF0c19hbmRfZXhpdCk7CisJCX0KKwkJYWxhcm0oUElOR0lOVEVSVkFMKTsKKwl9IGVsc2UgeyAvKiAtYyBOTiwgYW5kIGFsbCBOTiBhcmUgc2VudCAoYW5kIG5vIGRlYWRsaW5lKSAqLworCQkvKiBXYWl0IGZvciB0aGUgbGFzdCBwaW5nIHRvIGNvbWUgYmFjay4KKwkJICogLVcgdGltZW91dDogd2FpdCBmb3IgYSByZXNwb25zZSBpbiBzZWNvbmRzLgorCQkgKiBBZmZlY3RzIG9ubHkgdGltZW91dCBpbiBhYnNlbnNlIG9mIGFueSByZXNwb25zZXMsCisJCSAqIG90aGVyd2lzZSBwaW5nIHdhaXRzIGZvciB0d28gUlRUcy4gKi8KKwkJdW5zaWduZWQgZXhwaXJlID0gdGltZW91dDsKKworCQlpZiAobnJlY2VpdmVkKSB7CisJCQkvKiBhcHByb3guIDIqdG1heCwgaW4gc2Vjb25kcyAoMiBSVFQpICovCisJCQlleHBpcmUgPSB0bWF4IC8gKDUxMioxMDI0KTsKKwkJCWlmIChleHBpcmUgPT0gMCkKKwkJCQlleHBpcmUgPSAxOworCQl9CisJCXNpZ25hbChTSUdBTFJNLCBwcmludF9zdGF0c19hbmRfZXhpdCk7CisJCWFsYXJtKGV4cGlyZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kcGluZzQoaW50IGp1bmsgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBpY21wICpwa3QgPSBHLnNuZF9wYWNrZXQ7CisKKwkvL21lbXNldChwa3QsIDAsIGRhdGFsZW4gKyBJQ01QX01JTkxFTiArIDQpOyAtIEcuc25kX3BhY2tldCB3YXMgeHphbGxvY2VkCisJcGt0LT5pY21wX3R5cGUgPSBJQ01QX0VDSE87CisJLypwa3QtPmljbXBfY29kZSA9IDA7Ki8KKwlwa3QtPmljbXBfY2tzdW0gPSAwOyAvKiBja3N1bSBpcyBjYWxjdWxhdGVkIHdpdGggdGhpcyBmaWVsZCBzZXQgdG8gMCAqLworCXBrdC0+aWNtcF9zZXEgPSBodG9ucyhudHJhbnNtaXR0ZWQpOyAvKiBkb24ndCArKyBoZXJlLCBpdCBjYW4gYmUgYSBtYWNybyAqLworCXBrdC0+aWNtcF9pZCA9IG15aWQ7CisKKwkvKiBJZiBkYXRhbGVuIDwgNCwgd2Ugc3RvcmUgdGltZXN0YW1wIF9wYXN0XyB0aGUgcGFja2V0LAorCSAqIGJ1dCBpdCdzIG9rIC0gd2UgYWxsb2NhdGVkIDQgZXh0cmEgYnl0ZXMgaW4geHphbGxvYygpIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwkvKmlmIChkYXRhbGVuID49IDQpKi8KKwkJLyogTm8gaHRvbjogd2UnbGwgcmVhZCBpdCBiYWNrIG9uIHRoZSBzYW1lIG1hY2hpbmUgKi8KKwkJKih1aW50MzJfdCopJnBrdC0+aWNtcF9kdW4gPSBtb25vdG9uaWNfdXMoKTsKKworCXBrdC0+aWNtcF9ja3N1bSA9IGluX2Nrc3VtKCh1bnNpZ25lZCBzaG9ydCAqKSBwa3QsIGRhdGFsZW4gKyBJQ01QX01JTkxFTik7CisKKwlzZW5kcGluZ190YWlsKHNlbmRwaW5nNCwgSUNNUF9NSU5MRU4pOworfQorI2lmIEVOQUJMRV9QSU5HNgorc3RhdGljIHZvaWQgc2VuZHBpbmc2KGludCBqdW5rIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgaWNtcDZfaGRyICpwa3QgPSBHLnNuZF9wYWNrZXQ7CisKKwkvL21lbXNldChwa3QsIDAsIGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2X2hkcikgKyA0KTsKKwlwa3QtPmljbXA2X3R5cGUgPSBJQ01QNl9FQ0hPX1JFUVVFU1Q7CisJLypwa3QtPmljbXA2X2NvZGUgPSAwOyovCisJLypwa3QtPmljbXA2X2Nrc3VtID0gMDsqLworCXBrdC0+aWNtcDZfc2VxID0gaHRvbnMobnRyYW5zbWl0dGVkKTsgLyogZG9uJ3QgKysgaGVyZSwgaXQgY2FuIGJlIGEgbWFjcm8gKi8KKwlwa3QtPmljbXA2X2lkID0gbXlpZDsKKworCS8qaWYgKGRhdGFsZW4gPj0gNCkqLworCQkqKHVpbnQzMl90KikoJnBrdC0+aWNtcDZfZGF0YThbNF0pID0gbW9ub3RvbmljX3VzKCk7CisKKwkvL1RPRE8/IHBrdC0+aWNtcF9ja3N1bSA9IGluX2Nrc3VtKC4uLik7CisKKwlzZW5kcGluZ190YWlsKHNlbmRwaW5nNiwgc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqaWNtcF90eXBlX25hbWUoaW50IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIElDTVBfRUNIT1JFUExZOiAgICAgIHJldHVybiAiRWNobyBSZXBseSI7CisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDogICByZXR1cm4gIkRlc3RpbmF0aW9uIFVucmVhY2hhYmxlIjsKKwljYXNlIElDTVBfU09VUkNFX1FVRU5DSDogIHJldHVybiAiU291cmNlIFF1ZW5jaCI7CisJY2FzZSBJQ01QX1JFRElSRUNUOiAgICAgICByZXR1cm4gIlJlZGlyZWN0IChjaGFuZ2Ugcm91dGUpIjsKKwljYXNlIElDTVBfRUNITzogICAgICAgICAgIHJldHVybiAiRWNobyBSZXF1ZXN0IjsKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDogIHJldHVybiAiVGltZSBFeGNlZWRlZCI7CisJY2FzZSBJQ01QX1BBUkFNRVRFUlBST0I6ICByZXR1cm4gIlBhcmFtZXRlciBQcm9ibGVtIjsKKwljYXNlIElDTVBfVElNRVNUQU1QOiAgICAgIHJldHVybiAiVGltZXN0YW1wIFJlcXVlc3QiOworCWNhc2UgSUNNUF9USU1FU1RBTVBSRVBMWTogcmV0dXJuICJUaW1lc3RhbXAgUmVwbHkiOworCWNhc2UgSUNNUF9JTkZPX1JFUVVFU1Q6ICAgcmV0dXJuICJJbmZvcm1hdGlvbiBSZXF1ZXN0IjsKKwljYXNlIElDTVBfSU5GT19SRVBMWTogICAgIHJldHVybiAiSW5mb3JtYXRpb24gUmVwbHkiOworCWNhc2UgSUNNUF9BRERSRVNTOiAgICAgICAgcmV0dXJuICJBZGRyZXNzIE1hc2sgUmVxdWVzdCI7CisJY2FzZSBJQ01QX0FERFJFU1NSRVBMWTogICByZXR1cm4gIkFkZHJlc3MgTWFzayBSZXBseSI7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gSUNNUCB0eXBlIjsKKwl9Cit9CisjaWYgRU5BQkxFX1BJTkc2CisvKiBSRkMzNTQyIGNoYW5nZWQgc29tZSBkZWZpbml0aW9ucyBmcm9tIFJGQzIyOTIgZm9yIG5vIGdvb2QgcmVhc29uLCB3aGVlIQorICogdGhlIG5ld2VyIDM1NDIgdXNlcyBhIE1MRF8gcHJlZml4IHdoZXJlIGFzIDIyOTIgdXNlcyBJQ01QNl8gcHJlZml4ICovCisjaWZuZGVmIE1MRF9MSVNURU5FUl9RVUVSWQorIyBkZWZpbmUgTUxEX0xJU1RFTkVSX1FVRVJZIElDTVA2X01FTUJFUlNISVBfUVVFUlkKKyNlbmRpZgorI2lmbmRlZiBNTERfTElTVEVORVJfUkVQT1JUCisjIGRlZmluZSBNTERfTElTVEVORVJfUkVQT1JUIElDTVA2X01FTUJFUlNISVBfUkVQT1JUCisjZW5kaWYKKyNpZm5kZWYgTUxEX0xJU1RFTkVSX1JFRFVDVElPTgorIyBkZWZpbmUgTUxEX0xJU1RFTkVSX1JFRFVDVElPTiBJQ01QNl9NRU1CRVJTSElQX1JFRFVDVElPTgorI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciAqaWNtcDZfdHlwZV9uYW1lKGludCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSDogICAgICByZXR1cm4gIkRlc3RpbmF0aW9uIFVucmVhY2hhYmxlIjsKKwljYXNlIElDTVA2X1BBQ0tFVF9UT09fQklHOiAgIHJldHVybiAiUGFja2V0IHRvbyBiaWciOworCWNhc2UgSUNNUDZfVElNRV9FWENFRURFRDogICAgcmV0dXJuICJUaW1lIEV4Y2VlZGVkIjsKKwljYXNlIElDTVA2X1BBUkFNX1BST0I6ICAgICAgIHJldHVybiAiUGFyYW1ldGVyIFByb2JsZW0iOworCWNhc2UgSUNNUDZfRUNIT19SRVBMWTogICAgICAgcmV0dXJuICJFY2hvIFJlcGx5IjsKKwljYXNlIElDTVA2X0VDSE9fUkVRVUVTVDogICAgIHJldHVybiAiRWNobyBSZXF1ZXN0IjsKKwljYXNlIE1MRF9MSVNURU5FUl9RVUVSWTogICAgIHJldHVybiAiTGlzdGVuZXIgUXVlcnkiOworCWNhc2UgTUxEX0xJU1RFTkVSX1JFUE9SVDogICAgcmV0dXJuICJMaXN0ZW5lciBSZXBvcnQiOworCWNhc2UgTUxEX0xJU1RFTkVSX1JFRFVDVElPTjogcmV0dXJuICJMaXN0ZW5lciBSZWR1Y3Rpb24iOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIElDTVAgdHlwZSI7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVucGFja190YWlsKGludCBzeiwgdWludDMyX3QgKnRwLAorCQljb25zdCBjaGFyICpmcm9tX3N0ciwKKwkJdWludDE2X3QgcmVjdl9zZXEsIGludCB0dGwpCit7CisJY29uc3QgY2hhciAqZHVwbXNnID0gIiAoRFVQISkiOworCXVuc2lnbmVkIHRyaXB0aW1lID0gdHJpcHRpbWU7IC8qIGZvciBnY2MgKi8KKworCSsrbnJlY2VpdmVkOworCisJaWYgKHRwKSB7CisJCS8qIChpbnQzMl90KSBjYXN0IGlzIGZvciBoeXBvdGhldGljYWwgNjQtYml0IHVuc2lnbmVkICovCisJCS8qIChkb2Vzbid0IGh1cnQgMzItYml0IHJlYWwtd29ybGQgYW55d2F5KSAqLworCQl0cmlwdGltZSA9IChpbnQzMl90KSAoKHVpbnQzMl90KW1vbm90b25pY191cygpIC0gKnRwKTsKKwkJdHN1bSArPSB0cmlwdGltZTsKKwkJaWYgKHRyaXB0aW1lIDwgdG1pbikKKwkJCXRtaW4gPSB0cmlwdGltZTsKKwkJaWYgKHRyaXB0aW1lID4gdG1heCkKKwkJCXRtYXggPSB0cmlwdGltZTsKKwl9CisKKwlpZiAoVFNUKHJlY3Zfc2VxICUgTUFYX0RVUF9DSEspKSB7CisJCSsrbnJlcGVhdHM7CisJCS0tbnJlY2VpdmVkOworCX0gZWxzZSB7CisJCVNFVChyZWN2X3NlcSAlIE1BWF9EVVBfQ0hLKTsKKwkJZHVwbXNnICs9IDc7CisJfQorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfUVVJRVQpCisJCXJldHVybjsKKworCXByaW50ZigiJWQgYnl0ZXMgZnJvbSAlczogc2VxPSV1IHR0bD0lZCIsIHN6LAorCQlmcm9tX3N0ciwgcmVjdl9zZXEsIHR0bCk7CisJaWYgKHRwKQorCQlwcmludGYoIiB0aW1lPSV1LiUwM3UgbXMiLCB0cmlwdGltZSAvIDEwMDAsIHRyaXB0aW1lICUgMTAwMCk7CisJcHV0cyhkdXBtc2cpOworCWZmbHVzaF9hbGwoKTsKK30KK3N0YXRpYyB2b2lkIHVucGFjazQoY2hhciAqYnVmLCBpbnQgc3osIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSkKK3sKKwlzdHJ1Y3QgaWNtcCAqaWNtcHBrdDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaGRyOworCWludCBobGVuOworCisJLyogZGlzY2FyZCBpZiB0b28gc2hvcnQgKi8KKwlpZiAoc3ogPCAoZGF0YWxlbiArIElDTVBfTUlOTEVOKSkKKwkJcmV0dXJuOworCisJLyogY2hlY2sgSVAgaGVhZGVyICovCisJaXBoZHIgPSAoc3RydWN0IGlwaGRyICopIGJ1ZjsKKwlobGVuID0gaXBoZHItPmlobCA8PCAyOworCXN6IC09IGhsZW47CisJaWNtcHBrdCA9IChzdHJ1Y3QgaWNtcCAqKSAoYnVmICsgaGxlbik7CisJaWYgKGljbXBwa3QtPmljbXBfaWQgIT0gbXlpZCkKKwkJcmV0dXJuOwkJCQkvKiBub3Qgb3VyIHBpbmcgKi8KKworCWlmIChpY21wcGt0LT5pY21wX3R5cGUgPT0gSUNNUF9FQ0hPUkVQTFkpIHsKKwkJdWludDE2X3QgcmVjdl9zZXEgPSBudG9ocyhpY21wcGt0LT5pY21wX3NlcSk7CisJCXVpbnQzMl90ICp0cCA9IE5VTEw7CisKKwkJaWYgKHN6ID49IElDTVBfTUlOTEVOICsgc2l6ZW9mKHVpbnQzMl90KSkKKwkJCXRwID0gKHVpbnQzMl90ICopIGljbXBwa3QtPmljbXBfZGF0YTsKKwkJdW5wYWNrX3RhaWwoc3osIHRwLAorCQkJaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIgKikgJmZyb20tPnNpbl9hZGRyLnNfYWRkciksCisJCQlyZWN2X3NlcSwgaXBoZHItPnR0bCk7CisJfSBlbHNlIGlmIChpY21wcGt0LT5pY21wX3R5cGUgIT0gSUNNUF9FQ0hPKSB7CisJCWJiX2Vycm9yX21zZygid2FybmluZzogZ290IElDTVAgJWQgKCVzKSIsCisJCQkJaWNtcHBrdC0+aWNtcF90eXBlLAorCQkJCWljbXBfdHlwZV9uYW1lKGljbXBwa3QtPmljbXBfdHlwZSkpOworCX0KK30KKyNpZiBFTkFCTEVfUElORzYKK3N0YXRpYyB2b2lkIHVucGFjazYoY2hhciAqcGFja2V0LCBpbnQgc3osIC8qc3RydWN0IHNvY2thZGRyX2luNiAqZnJvbSwqLyBpbnQgaG9wbGltaXQpCit7CisJc3RydWN0IGljbXA2X2hkciAqaWNtcHBrdDsKKwljaGFyIGJ1ZltJTkVUNl9BRERSU1RSTEVOXTsKKworCS8qIGRpc2NhcmQgaWYgdG9vIHNob3J0ICovCisJaWYgKHN6IDwgKGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2X2hkcikpKQorCQlyZXR1cm47CisKKwlpY21wcGt0ID0gKHN0cnVjdCBpY21wNl9oZHIgKikgcGFja2V0OworCWlmIChpY21wcGt0LT5pY21wNl9pZCAhPSBteWlkKQorCQlyZXR1cm47CQkJCS8qIG5vdCBvdXIgcGluZyAqLworCisJaWYgKGljbXBwa3QtPmljbXA2X3R5cGUgPT0gSUNNUDZfRUNIT19SRVBMWSkgeworCQl1aW50MTZfdCByZWN2X3NlcSA9IG50b2hzKGljbXBwa3QtPmljbXA2X3NlcSk7CisJCXVpbnQzMl90ICp0cCA9IE5VTEw7CisKKwkJaWYgKHN6ID49IHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSArIHNpemVvZih1aW50MzJfdCkpCisJCQl0cCA9ICh1aW50MzJfdCAqKSAmaWNtcHBrdC0+aWNtcDZfZGF0YThbNF07CisJCXVucGFja190YWlsKHN6LCB0cCwKKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJnBpbmdhZGRyLnNpbjYuc2luNl9hZGRyLAorCQkJCQlidWYsIHNpemVvZihidWYpKSwKKwkJCXJlY3Zfc2VxLCBob3BsaW1pdCk7CisJfSBlbHNlIGlmIChpY21wcGt0LT5pY21wNl90eXBlICE9IElDTVA2X0VDSE9fUkVRVUVTVCkgeworCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IGdvdCBJQ01QICVkICglcykiLAorCQkJCWljbXBwa3QtPmljbXA2X3R5cGUsCisJCQkJaWNtcDZfdHlwZV9uYW1lKGljbXBwa3QtPmljbXA2X3R5cGUpKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcGluZzQobGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCWludCBzb2Nrb3B0OworCisJcGluZ3NvY2sgPSBjcmVhdGVfaWNtcF9zb2NrZXQoKTsKKwlwaW5nYWRkci5zaW4gPSBsc2EtPnUuc2luOworCWlmIChzb3VyY2VfbHNhKSB7CisJCWlmIChzZXRzb2Nrb3B0KHBpbmdzb2NrLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfSUYsCisJCQkJJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG11bHRpY2FzdCBzb3VyY2UgaW50ZXJmYWNlIik7CisJCXhiaW5kKHBpbmdzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKwl9CisJaWYgKHN0cl9JKQorCQlzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShwaW5nc29jaywgc3RyX0kpOworCisJLyogZW5hYmxlIGJyb2FkY2FzdCBwaW5ncyAqLworCXNldHNvY2tvcHRfYnJvYWRjYXN0KHBpbmdzb2NrKTsKKworCS8qIHNldCByZWN2IGJ1ZiAobmVlZGVkIGlmIHdlIGNhbiBnZXQgbG90cyBvZiByZXNwb25zZXM6IGZsb29kIHBpbmcsCisJICogYnJvYWRjYXN0IHBpbmcgZXRjKSAqLworCXNvY2tvcHQgPSAoZGF0YWxlbiAqIDIpICsgNyAqIDEwMjQ7IC8qIGdpdmluZyBpdCBhIGJpdCBvZiBleHRyYSByb29tICovCisJc2V0c29ja29wdChwaW5nc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKworCWlmIChvcHRfdHRsICE9IDApIHsKKwkJc2V0c29ja29wdChwaW5nc29jaywgSVBQUk9UT19JUCwgSVBfVFRMLCAmb3B0X3R0bCwgc2l6ZW9mKG9wdF90dGwpKTsKKwkJLyogYWJvdmUgZG9lc250IGFmZmVjdCBwYWNrZXRzIHNlbnQgdG8gYmNhc3QgSVAsIHNvLi4uICovCisJCXNldHNvY2tvcHQocGluZ3NvY2ssIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9UVEwsICZvcHRfdHRsLCBzaXplb2Yob3B0X3R0bCkpOworCX0KKworCXNpZ25hbChTSUdJTlQsIHByaW50X3N0YXRzX2FuZF9leGl0KTsKKworCS8qIHN0YXJ0IHRoZSBwaW5nJ3MgZ29pbmcgLi4uICovCisJc2VuZHBpbmc0KDApOworCisJLyogbGlzdGVuIGZvciByZXBsaWVzICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIGZyb207CisJCXNvY2tsZW5fdCBmcm9tbGVuID0gKHNvY2tsZW5fdCkgc2l6ZW9mKGZyb20pOworCQlpbnQgYzsKKworCQljID0gcmVjdmZyb20ocGluZ3NvY2ssIEcucmN2X3BhY2tldCwgRy5zaXplb2ZfcmN2X3BhY2tldCwgMCwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmZnJvbWxlbik7CisJCWlmIChjIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWJiX3BlcnJvcl9tc2coInJlY3Zmcm9tIik7CisJCQljb250aW51ZTsKKwkJfQorCQl1bnBhY2s0KEcucmN2X3BhY2tldCwgYywgJmZyb20pOworCQlpZiAocGluZ2NvdW50ICYmIG5yZWNlaXZlZCA+PSBwaW5nY291bnQpCisJCQlicmVhazsKKwl9Cit9CisjaWYgRU5BQkxFX1BJTkc2CitleHRlcm4gaW50IEJVR19iYWRfb2Zmc2V0b2ZfaWNtcDZfY2tzdW0odm9pZCk7CitzdGF0aWMgdm9pZCBwaW5nNihsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJaW50IHNvY2tvcHQ7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IHNvY2thZGRyX2luNiBmcm9tOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJY2hhciBjb250cm9sX2J1ZltDTVNHX1NQQUNFKDM2KV07CisKKwlwaW5nc29jayA9IGNyZWF0ZV9pY21wNl9zb2NrZXQoKTsKKwlwaW5nYWRkci5zaW42ID0gbHNhLT51LnNpbjY7CisJLyogdW50ZXN0ZWQgd2hldGhlciAiLUkgYWRkciIgcmVhbGx5IHdvcmtzIGZvciBJUHY2OiAqLworCWlmIChzb3VyY2VfbHNhKQorCQl4YmluZChwaW5nc29jaywgJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbik7CisJaWYgKHN0cl9JKQorCQlzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShwaW5nc29jaywgc3RyX0kpOworCisjaWZkZWYgSUNNUDZfRklMVEVSCisJeworCQlzdHJ1Y3QgaWNtcDZfZmlsdGVyIGZpbHQ7CisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfVkVSQk9TRSkpIHsKKwkJCUlDTVA2X0ZJTFRFUl9TRVRCTE9DS0FMTCgmZmlsdCk7CisJCQlJQ01QNl9GSUxURVJfU0VUUEFTUyhJQ01QNl9FQ0hPX1JFUExZLCAmZmlsdCk7CisJCX0gZWxzZSB7CisJCQlJQ01QNl9GSUxURVJfU0VUUEFTU0FMTCgmZmlsdCk7CisJCX0KKwkJaWYgKHNldHNvY2tvcHQocGluZ3NvY2ssIElQUFJPVE9fSUNNUFY2LCBJQ01QNl9GSUxURVIsICZmaWx0LAorCQkJCQkgICBzaXplb2YoZmlsdCkpIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZXRzb2Nrb3B0KElDTVA2X0ZJTFRFUikiKTsKKwl9CisjZW5kaWYgLypJQ01QNl9GSUxURVIqLworCisJLyogZW5hYmxlIGJyb2FkY2FzdCBwaW5ncyAqLworCXNldHNvY2tvcHRfYnJvYWRjYXN0KHBpbmdzb2NrKTsKKworCS8qIHNldCByZWN2IGJ1ZiAobmVlZGVkIGlmIHdlIGNhbiBnZXQgbG90cyBvZiByZXNwb25zZXM6IGZsb29kIHBpbmcsCisJICogYnJvYWRjYXN0IHBpbmcgZXRjKSAqLworCXNvY2tvcHQgPSAoZGF0YWxlbiAqIDIpICsgNyAqIDEwMjQ7IC8qIGdpdmluZyBpdCBhIGJpdCBvZiBleHRyYSByb29tICovCisJc2V0c29ja29wdChwaW5nc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKworCXNvY2tvcHQgPSBvZmZzZXRvZihzdHJ1Y3QgaWNtcDZfaGRyLCBpY21wNl9ja3N1bSk7CisJaWYgKG9mZnNldG9mKHN0cnVjdCBpY21wNl9oZHIsIGljbXA2X2Nrc3VtKSAhPSAyKQorCQlCVUdfYmFkX29mZnNldG9mX2ljbXA2X2Nrc3VtKCk7CisJc2V0c29ja29wdChwaW5nc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisKKwkvKiByZXF1ZXN0IHR0bCBpbmZvIHRvIGJlIHJldHVybmVkIGluIGFuY2lsbGFyeSBkYXRhICovCisJc2V0c29ja29wdChwaW5nc29jaywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisKKwlpZiAoaWZfaW5kZXgpCisJCXBpbmdhZGRyLnNpbjYuc2luNl9zY29wZV9pZCA9IGlmX2luZGV4OworCisJc2lnbmFsKFNJR0lOVCwgcHJpbnRfc3RhdHNfYW5kX2V4aXQpOworCisJLyogc3RhcnQgdGhlIHBpbmcncyBnb2luZyAuLi4gKi8KKwlzZW5kcGluZzYoMCk7CisKKwkvKiBsaXN0ZW4gZm9yIHJlcGxpZXMgKi8KKwltc2cubXNnX25hbWUgPSAmZnJvbTsKKwltc2cubXNnX25hbWVsZW4gPSBzaXplb2YoZnJvbSk7CisJbXNnLm1zZ19pb3YgPSAmaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBjb250cm9sX2J1ZjsKKwlpb3YuaW92X2Jhc2UgPSBHLnJjdl9wYWNrZXQ7CisJaW92Lmlvdl9sZW4gPSBHLnNpemVvZl9yY3ZfcGFja2V0OworCXdoaWxlICgxKSB7CisJCWludCBjOworCQlzdHJ1Y3QgY21zZ2hkciAqbXA7CisJCWludCBob3BsaW1pdCA9IC0xOworCQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbF9idWYpOworCisJCWMgPSByZWN2bXNnKHBpbmdzb2NrLCAmbXNnLCAwKTsKKwkJaWYgKGMgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJYmJfcGVycm9yX21zZygicmVjdmZyb20iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAobXAgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOyBtcDsgbXAgPSBDTVNHX05YVEhEUigmbXNnLCBtcCkpIHsKKwkJCWlmIChtcC0+Y21zZ19sZXZlbCA9PSBTT0xfSVBWNgorCQkJICYmIG1wLT5jbXNnX3R5cGUgPT0gSVBWNl9IT1BMSU1JVAorCQkJIC8qIGRvbid0IGNoZWNrIGxlbiAtIHdlIHRydXN0IHRoZSBrZXJuZWw6ICovCisJCQkgLyogJiYgbXAtPmNtc2dfbGVuID49IENNU0dfTEVOKHNpemVvZihpbnQpKSAqLworCQkJKSB7CisJCQkJLypob3BsaW1pdCA9ICooaW50KilDTVNHX0RBVEEobXApOyAtIHVuYWxpZ25lZCBhY2Nlc3MgKi8KKwkJCQltb3ZlX2Zyb21fdW5hbGlnbmVkX2ludChob3BsaW1pdCwgQ01TR19EQVRBKG1wKSk7CisJCQl9CisJCX0KKwkJdW5wYWNrNihHLnJjdl9wYWNrZXQsIGMsIC8qJmZyb20sKi8gaG9wbGltaXQpOworCQlpZiAocGluZ2NvdW50ICYmIG5yZWNlaXZlZCA+PSBwaW5nY291bnQpCisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcGluZyhsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJcHJpbnRmKCJQSU5HICVzICglcykiLCBob3N0bmFtZSwgZG90dGVkKTsKKwlpZiAoc291cmNlX2xzYSkgeworCQlwcmludGYoIiBmcm9tICVzIiwKKwkJCXhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmc291cmNlX2xzYS0+dS5zYSkpOworCX0KKwlwcmludGYoIjogJWQgZGF0YSBieXRlc1xuIiwgZGF0YWxlbik7CisKKwlHLnNpemVvZl9yY3ZfcGFja2V0ID0gZGF0YWxlbiArIE1BWElQTEVOICsgTUFYSUNNUExFTjsKKwlHLnJjdl9wYWNrZXQgPSB4emFsbG9jKEcuc2l6ZW9mX3Jjdl9wYWNrZXQpOworI2lmIEVOQUJMRV9QSU5HNgorCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCS8qICs0IHJlc2VydmVzIGEgcGxhY2UgZm9yIHRpbWVzdGFtcCwgd2hpY2ggbWF5IGVuZCB1cCBzaXR0aW5nCisJCSAqIF9hZnRlcl8gcGFja2V0LiBTYXZlcyBvbmUgaWYoKSAtIHNlZSBzZW5kcGluZzQvNigpICovCisJCUcuc25kX3BhY2tldCA9IHh6YWxsb2MoZGF0YWxlbiArIHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSArIDQpOworCQlwaW5nNihsc2EpOworCX0gZWxzZQorI2VuZGlmCisJeworCQlHLnNuZF9wYWNrZXQgPSB4emFsbG9jKGRhdGFsZW4gKyBJQ01QX01JTkxFTiArIDQpOworCQlwaW5nNChsc2EpOworCX0KK30KKworc3RhdGljIGludCBjb21tb25fcGluZ19tYWluKGludCBvcHQsIGNoYXIgKiphcmd2KQoreworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwljaGFyICpzdHJfczsKKworCUlOSVRfRygpOworCisJLyogZXhhY3RseSBvbmUgYXJndW1lbnQgbmVlZGVkOyAtdiBhbmQgLXEgZG9uJ3QgbWl4OyAtYyBOVU0sIC10IE5VTSwgLXcgTlVNLCAtVyBOVU0gKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTpxLS12OnYtLXE6Yys6dCs6dys6VysiOworCW9wdCB8PSBnZXRvcHQzMihhcmd2LCBPUFRfU1RSSU5HLCAmcGluZ2NvdW50LCAmc3RyX3MsICZvcHRfdHRsLCAmZGVhZGxpbmUsICZ0aW1lb3V0LCAmc3RyX0kpOworCWlmIChvcHQgJiBPUFRfcykKKwkJZGF0YWxlbiA9IHhhdG91MTYoc3RyX3MpOyAvLyAtcworCWlmIChvcHQgJiBPUFRfSSkgeyAvLyAtSQorCQlpZl9pbmRleCA9IGlmX25hbWV0b2luZGV4KHN0cl9JKTsKKwkJaWYgKCFpZl9pbmRleCkgeworCQkJLyogVE9ETzogSSdtIG5vdCBzdXJlIGl0IHRha2VzIElQdjYgdW5sZXNzIGluIFtYWDpYWC4uXSBmb3JtYXQgKi8KKwkJCXNvdXJjZV9sc2EgPSB4ZG90dGVkMnNvY2thZGRyKHN0cl9JLCAwKTsKKwkJCXN0cl9JID0gTlVMTDsgLyogZG9uJ3QgdHJ5IHRvIGJpbmQgdG8gZGV2aWNlIGxhdGVyICovCisJCX0KKwl9CisJbXlpZCA9ICh1aW50MTZfdCkgZ2V0cGlkKCk7CisJaG9zdG5hbWUgPSBhcmd2W29wdGluZF07CisjaWYgRU5BQkxFX1BJTkc2CisJeworCQlzYV9mYW1pbHlfdCBhZiA9IEFGX1VOU1BFQzsKKwkJaWYgKG9wdCAmIE9QVF9JUFY0KQorCQkJYWYgPSBBRl9JTkVUOworCQlpZiAob3B0ICYgT1BUX0lQVjYpCisJCQlhZiA9IEFGX0lORVQ2OworCQlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoaG9zdG5hbWUsIDAsIGFmKTsKKwl9CisjZWxzZQorCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihob3N0bmFtZSwgMCwgQUZfSU5FVCk7CisjZW5kaWYKKworCWlmIChzb3VyY2VfbHNhICYmIHNvdXJjZV9sc2EtPnUuc2Euc2FfZmFtaWx5ICE9IGxzYS0+dS5zYS5zYV9mYW1pbHkpCisJCS8qIGxlYWtpbmcgaXQgaGVyZS4uLiAqLworCQlzb3VyY2VfbHNhID0gTlVMTDsKKworCWRvdHRlZCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmbHNhLT51LnNhKTsKKwlwaW5nKGxzYSk7CisJcHJpbnRfc3RhdHNfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkvKnJldHVybiBFWElUX1NVQ0NFU1M7Ki8KK30KKyNlbmRpZiAvKiBGRUFUVVJFX0ZBTkNZX1BJTkcgKi8KKworCitpbnQgcGluZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGluZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX1BJTkcKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbihBRl9VTlNQRUMsIGFyZ3YpOworI2Vsc2UKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbigwLCBhcmd2KTsKKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX1BJTkc2CitpbnQgcGluZzZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBpbmc2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKyMgaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX1BJTkcKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbihBRl9JTkVUNiwgYXJndik7CisjIGVsc2UKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbihPUFRfSVBWNiwgYXJndik7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyogZnJvbSBwaW5nNi5jOgorICogQ29weXJpZ2h0IChjKSAxOTg5IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIE1pa2UgTXV1c3MuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gPEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICoJCWZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2U+CisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9wc2Nhbi5jIGIvbmV0d29ya2luZy9wc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDA1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3BzY2FuLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBQc2NhbiBpcyBhIG1pbmkgcG9ydCBzY2FubmVyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IDIwMDcgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHBzY2FuX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNiXSBbLXAgTUlOX1BPUlRdIFstUCBNQVhfUE9SVF0gWy10IFRJTUVPVVRdIFstVCBNSU5fUlRUXSBIT1NUIgorLy91c2FnZTojZGVmaW5lIHBzY2FuX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2NhbiBhIGhvc3QsIHByaW50IGFsbCBvcGVuIHBvcnRzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVNob3cgY2xvc2VkIHBvcnRzIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJU2hvdyBibG9ja2VkIHBvcnRzIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJU2NhbiBmcm9tIHRoaXMgcG9ydCAoZGVmYXVsdCAxKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJU2NhbiB1cCB0byB0aGlzIHBvcnQgKGRlZmF1bHQgMTAyNCkiCisvL3VzYWdlOiAgICAgIlxuCS10CVRpbWVvdXQgKGRlZmF1bHQgNTAwMCBtcykiCisvL3VzYWdlOiAgICAgIlxuCS1UCU1pbmltdW0gcnR0IChkZWZhdWx0IDUgbXMsIGluY3JlYXNlIGZvciBjb25nZXN0ZWQgaG9zdHMpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogZGVidWdnaW5nICovCisjaWZkZWYgREVCVUdfUFNDQU4KKyNkZWZpbmUgRE1TRyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgREVSUiguLi4pIGJiX3BlcnJvcl9tc2coX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBETVNHKC4uLikgKCh2b2lkKTApCisjZGVmaW5lIERFUlIoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqcG9ydF9uYW1lKHVuc2lnbmVkIHBvcnQpCit7CisJc3RydWN0IHNlcnZlbnQgKnNlcnZlcjsKKworCXNlcnZlciA9IGdldHNlcnZieXBvcnQoaHRvbnMocG9ydCksIE5VTEwpOworCWlmIChzZXJ2ZXIpCisJCXJldHVybiBzZXJ2ZXItPnNfbmFtZTsKKwlyZXR1cm4gInVua25vd24iOworfQorCisvKiBXZSBkb24ndCBleHBlY3QgdG8gc2VlIDEwMDArIHNlY29uZHMgZGVsYXksIHVuc2lnbmVkIGlzIGVub3VnaCAqLworI2RlZmluZSBNT05PVE9OSUNfVVMoKSAoKHVuc2lnbmVkKW1vbm90b25pY191cygpKQorCitpbnQgcHNjYW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBzY2FuX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpvcHRfbWF4X3BvcnQgPSAiMTAyNCI7ICAgICAgLyogLVA6IGRlZmF1bHQgbWF4IHBvcnQgKi8KKwljb25zdCBjaGFyICpvcHRfbWluX3BvcnQgPSAiMSI7ICAgICAgICAgLyogLXA6IGRlZmF1bHQgbWluIHBvcnQgKi8KKwljb25zdCBjaGFyICpvcHRfdGltZW91dCA9ICI1MDAwIjsgICAgICAgLyogLXQ6IGRlZmF1bHQgdGltZW91dCBpbiBtc2VjICovCisJLyogV2UgZXN0aW1hdGUgcnR0IGFuZCB3YWl0IHJ0dCo0IGJlZm9yZSBjb25jbHVkaW5nIHRoYXQgcG9ydCBpcworCSAqIHRvdGFsbHkgYmxvY2tlZC4gbWluIHJ0dCBvZiA1IG1zIG1heSBiZSB0b28gbG93IGlmIHlvdSBhcmUKKwkgKiBzY2FubmluZyBhbiBJbnRlcm5ldCBob3N0IGJlaGluZCBzYXR1cmF0ZWQvdHJhZmZpYyBzaGFwZWQgbGluay4KKwkgKiBSdWxlIG9mIHRodW1iOiB3aXRoIG1pbl9ydHQgb2YgTiBtc2VjLCBzY2FubmluZyAxMDAwIHBvcnRzCisJICogd2lsbCB0YWtlIE4gc2Vjb25kcyBhdCBhYnNvbHV0ZSBtaW5pbXVtICovCisJY29uc3QgY2hhciAqb3B0X21pbl9ydHQgPSAiNSI7ICAgICAgICAgIC8qIC1UOiBkZWZhdWx0IG1pbiBydHQgaW4gbXNlYyAqLworCWNvbnN0IGNoYXIgKnJlc3VsdF9zdHI7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhcDsKKwlpbnQgczsKKwl1bnNpZ25lZCBvcHQ7CisJdW5zaWduZWQgcG9ydCwgbWF4X3BvcnQsIG5wb3J0czsKKwl1bnNpZ25lZCBjbG9zZWRfcG9ydHMgPSAwOworCXVuc2lnbmVkIG9wZW5fcG9ydHMgPSAwOworCS8qIGFsbCBpbiB1c2VjICovCisJdW5zaWduZWQgdGltZW91dDsKKwl1bnNpZ25lZCBtaW5fcnR0OworCXVuc2lnbmVkIHJ0dF80OworCXVuc2lnbmVkIHN0YXJ0LCBkaWZmOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBleGFjdGx5IG9uZSBub24tb3B0aW9uICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNicDpQOnQ6VDoiLCAmb3B0X21pbl9wb3J0LCAmb3B0X21heF9wb3J0LCAmb3B0X3RpbWVvdXQsICZvcHRfbWluX3J0dCk7CisJYXJndiArPSBvcHRpbmQ7CisJbWF4X3BvcnQgPSB4YXRvdV9yYW5nZShvcHRfbWF4X3BvcnQsIDEsIDY1NTM1KTsKKwlwb3J0ID0geGF0b3VfcmFuZ2Uob3B0X21pbl9wb3J0LCAxLCBtYXhfcG9ydCk7CisJbnBvcnRzID0gbWF4X3BvcnQgLSBwb3J0ICsgMTsKKwltaW5fcnR0ID0geGF0b3VfcmFuZ2Uob3B0X21pbl9ydHQsIDEsIElOVF9NQVgvMTAwMCAvIDQpICogMTAwMDsKKwl0aW1lb3V0ID0geGF0b3VfcmFuZ2Uob3B0X3RpbWVvdXQsIDEsIElOVF9NQVgvMTAwMCAvIDQpICogMTAwMDsKKwkvKiBJbml0aWFsIHJ0dCBpcyBCSUc6ICovCisJcnR0XzQgPSB0aW1lb3V0OworCisJRE1TRygibWluX3J0dCAldSB0aW1lb3V0ICV1IiwgbWluX3J0dCwgdGltZW91dCk7CisKKwlsc2FwID0geGhvc3Qyc29ja2FkZHIoKmFyZ3YsIHBvcnQpOworCXByaW50ZigiU2Nhbm5pbmcgJXMgcG9ydHMgJXUgdG8gJXVcbiBQb3J0XHRQcm90b1x0U3RhdGVcdFNlcnZpY2VcbiIsCisJCQkqYXJndiwgcG9ydCwgbWF4X3BvcnQpOworCisJZm9yICg7IHBvcnQgPD0gbWF4X3BvcnQ7IHBvcnQrKykgeworCQlETVNHKCJydHQgJXUiLCBydHRfNCk7CisKKwkJLyogVGhlIFNPQ0tfU1RSRUFNIHNvY2tldCB0eXBlIGlzIGltcGxlbWVudGVkIG9uIHRoZSBUQ1AvSVAgcHJvdG9jb2wuICovCisJCXNldF9ucG9ydCgmbHNhcC0+dS5zYSwgaHRvbnMocG9ydCkpOworCQlzID0geHNvY2tldChsc2FwLT51LnNhLnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworCQkvKiBXZSBuZWVkIHVuYmxvY2tpbmcgc29ja2V0IHNvIHdlIGRvbid0IG5lZWQgdG8gd2FpdCBmb3IgRVRJTUVPVVQuICovCisJCS8qIE5vbmJsb2NraW5nIGNvbm5lY3QgdHlwaWNhbGx5ICJmYWlscyIgd2l0aCBlcnJubyA9PSBFSU5QUk9HUkVTUyAqLworCQluZGVsYXlfb24ocyk7CisKKwkJRE1TRygiY29ubmVjdCB0byBwb3J0ICV1IiwgcG9ydCk7CisJCXJlc3VsdF9zdHIgPSBOVUxMOworCQlzdGFydCA9IE1PTk9UT05JQ19VUygpOworCQlpZiAoY29ubmVjdChzLCAmbHNhcC0+dS5zYSwgbHNhcC0+bGVuKSA9PSAwKSB7CisJCQkvKiBVbmxpa2VseSwgZm9yIG1lIGV2ZW4gbG9jYWxob3N0IGZhaWxzIDopICovCisJCQlETVNHKCJjb25uZWN0IHN1Y2NlZWRlZCIpOworCQkJZ290byBvcGVuOworCQl9CisJCS8qIENoZWNrIGZvciB1bnR5cGljYWwgZXJyb3JzLi4uICovCisJCWlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRUlOUFJPR1JFU1MKKwkJICYmIGVycm5vICE9IEVDT05OUkVGVVNFRAorCQkpIHsKKwkJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJCX0KKworCQlkaWZmID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChlcnJubyA9PSBFQ09OTlJFRlVTRUQpIHsKKwkJCQlpZiAob3B0ICYgMSkgLyogLWM6IHNob3cgY2xvc2VkIHRvbyAqLworCQkJCQlyZXN1bHRfc3RyID0gImNsb3NlZCI7CisJCQkJY2xvc2VkX3BvcnRzKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlERVJSKCJwb3J0ICV1IGVycm5vICVkIEAldSIsIHBvcnQsIGVycm5vLCBkaWZmKTsKKworCQkJaWYgKGRpZmYgPiBydHRfNCkgeworCQkJCWlmIChvcHQgJiAyKSAvKiAtYjogc2hvdyBibG9ja2VkIHRvbyAqLworCQkJCQlyZXN1bHRfc3RyID0gImJsb2NrZWQiOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogQ2FuIHNsZWVwIChtdWNoKSBsb25nZXIgdGhhbiBzcGVjaWZpZWQgZGVsYXkuCisJCQkgKiBXZSBjaGVjayBydHQgQkVGT1JFIHdlIHVzbGVlcCwgb3RoZXJ3aXNlCisJCQkgKiBvbiBsb2NhbGhvc3Qgd2UnbGwgaGF2ZSBubyB3cml0ZXMgZG9uZSAoISkKKwkJCSAqIGJlZm9yZSB3ZSBleGNlZWQgKHJhdGhlciBzbWFsbCkgcnR0ICovCisJCQl1c2xlZXAocnR0XzQvOCk7Cisgb3BlbjoKKwkJCWRpZmYgPSBNT05PVE9OSUNfVVMoKSAtIHN0YXJ0OworCQkJRE1TRygid3JpdGUgdG8gcG9ydCAldSBAJXUiLCBwb3J0LCBkaWZmIC0gc3RhcnQpOworCQkJaWYgKHdyaXRlKHMsICIgIiwgMSkgPj0gMCkgeyAvKiBXZSB3ZXJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHNvY2tldCAqLworCQkJCW9wZW5fcG9ydHMrKzsKKwkJCQlyZXN1bHRfc3RyID0gIm9wZW4iOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCURNU0coIm91dCBvZiBsb29wIEAldSIsIGRpZmYpOworCQlpZiAocmVzdWx0X3N0cikKKwkJCXByaW50ZigiJTV1IiAiXHQiICJ0Y3AiICJcdCIgIiVzIiAiXHQiICIlcyIgIlxuIiwKKwkJCQkJcG9ydCwgcmVzdWx0X3N0ciwgcG9ydF9uYW1lKHBvcnQpKTsKKworCQkvKiBFc3RpbWF0ZSBuZXcgcnR0IC0gd2UgZG9uJ3Qgd2FudCB0byB3YWl0IGVudGlyZSB0aW1lb3V0CisJCSAqIGZvciBlYWNoIHBvcnQuICo0IGFsbG93cyBmb3IgcmlzZSBpbiBuZXQgZGVsYXkuCisJCSAqIFdlIGluY3JlYXNlIHJ0dCBxdWlja2x5IChydHRfNCo0KSwgZGVjcmVhc2Ugc2xvd2x5CisJCSAqIChkaWZmIGlzIGF0IGxlYXN0IHJ0dF80LzgsICo0ID09IHJ0dF80LzIpCisJCSAqIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhY2NpZGVudGFsbHkgbWlzcyBwb3J0cy4gKi8KKwkJcnR0XzQgPSBkaWZmICogNDsKKwkJaWYgKHJ0dF80IDwgbWluX3J0dCkKKwkJCXJ0dF80ID0gbWluX3J0dDsKKwkJaWYgKHJ0dF80ID4gdGltZW91dCkKKwkJCXJ0dF80ID0gdGltZW91dDsKKwkJLyogQ2xlYW4gdXAgKi8KKwkJY2xvc2Uocyk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShsc2FwKTsKKworCXByaW50ZigiJWQgY2xvc2VkLCAlZCBvcGVuLCAlZCB0aW1lZCBvdXQgKG9yIGJsb2NrZWQpIHBvcnRzXG4iLAorCQkJCQljbG9zZWRfcG9ydHMsCisJCQkJCW9wZW5fcG9ydHMsCisJCQkJCW5wb3J0cyAtIChjbG9zZWRfcG9ydHMgKyBvcGVuX3BvcnRzKSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvcm91dGUuYyBiL25ldHdvcmtpbmcvcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I1YTAyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9yb3V0ZS5jCkBAIC0wLDAgKzEsNzEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHJvdXRlCisgKgorICogU2ltaWxhciB0byB0aGUgc3RhbmRhcmQgVW5peCByb3V0ZSwgYnV0IHdpdGggb25seSB0aGUgbmVjZXNzYXJ5CisgKiBwYXJ0cyBmb3IgQUZfSU5FVCBhbmQgQUZfSU5FVDYKKyAqCisgKiBCam9ybiBXZXNlbiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICoKKyAqIEF1dGhvciBvZiB0aGUgb3JpZ2luYWwgcm91dGU6CisgKiAgICAgICAgICAgICAgRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKiAgICAgICAgICAgICAgKGRlcml2ZWQgZnJvbSBGdksncyAncm91dGUuYyAgICAgMS43MCAgICAwMS8wNC85NCcpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKgorICogZGlzcGxheXJvdXRlKCkgY29kZSBhZGRlZCBieSBWbGFkaW1pciBOLiBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiBhZGp1c3RtZW50cyBieSBMYXJyeSBEb29saXR0bGUgIDxMUkRvb2xpdHRsZUBsYmwuZ292PgorICoKKyAqIElQVjYgc3VwcG9ydCBhZGRlZCBieSBCYXJ0IFZpc3NjaGVyIDxtYWdpY2tAbGludXgtZmFuLmNvbT4KKyAqLworCisvKiAyMDA0LzAzLzA5ICBNYW51ZWwgTm92b2EgSUlJIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBSZXdyaXR0ZW4gdG8gZml4IHNldmVyYWwgYnVncywgYWRkIGFkZGl0aW9uYWwgZXJyb3IgY2hlY2tpbmcsIGFuZAorICogcmVtb3ZlIHJpZGljdWxvdXMgYW1vdW50cyBvZiBibG9hdC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcm91dGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlt7YWRkfGRlbHxkZWxldGV9XSIKKy8vdXNhZ2U6I2RlZmluZSByb3V0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVkaXQga2VybmVsIHJvdXRpbmcgdGFibGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHJlc29sdmUgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1lCURpc3BsYXkgb3RoZXIvbW9yZSBpbmZvcm1hdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUEgaW5ldCIgSUZfRkVBVFVSRV9JUFY2KCJ7Nn0iKSAiCVNlbGVjdCBhZGRyZXNzIGZhbWlseSIKKworI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisKKyNpZm5kZWYgUlRGX1VQCisvKiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvcm91dGUuaCAqLworI2RlZmluZSBSVEZfVVAgICAgICAgICAgMHgwMDAxCS8qIHJvdXRlIHVzYWJsZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlRGX0dBVEVXQVkgICAgIDB4MDAwMgkvKiBkZXN0aW5hdGlvbiBpcyBhIGdhdGV3YXkgICAgICovCisjZGVmaW5lIFJURl9IT1NUICAgICAgICAweDAwMDQJLyogaG9zdCBlbnRyeSAobmV0IG90aGVyd2lzZSkgICAqLworI2RlZmluZSBSVEZfUkVJTlNUQVRFICAgMHgwMDA4CS8qIHJlaW5zdGF0ZSByb3V0ZSBhZnRlciB0bW91dCAgKi8KKyNkZWZpbmUgUlRGX0RZTkFNSUMgICAgIDB4MDAxMAkvKiBjcmVhdGVkIGR5bi4gKGJ5IHJlZGlyZWN0KSAgICovCisjZGVmaW5lIFJURl9NT0RJRklFRCAgICAweDAwMjAJLyogbW9kaWZpZWQgZHluLiAoYnkgcmVkaXJlY3QpICAqLworI2RlZmluZSBSVEZfTVRVICAgICAgICAgMHgwMDQwCS8qIHNwZWNpZmljIE1UVSBmb3IgdGhpcyByb3V0ZSAgKi8KKyNpZm5kZWYgUlRGX01TUworI2RlZmluZSBSVEZfTVNTICAgICAgICAgUlRGX01UVQkvKiBDb21wYXRpYmlsaXR5IDotKCAgICAgICAgICAgICovCisjZW5kaWYKKyNkZWZpbmUgUlRGX1dJTkRPVyAgICAgIDB4MDA4MAkvKiBwZXIgcm91dGUgd2luZG93IGNsYW1waW5nICAgICovCisjZGVmaW5lIFJURl9JUlRUICAgICAgICAweDAxMDAJLyogSW5pdGlhbCByb3VuZCB0cmlwIHRpbWUgICAgICAqLworI2RlZmluZSBSVEZfUkVKRUNUICAgICAgMHgwMjAwCS8qIFJlamVjdCByb3V0ZSAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTSU9DQUREUlRPTEQpIHx8IGRlZmluZWQoUlRGX0lSVFQpCS8qIHJvdXRlICovCisjZGVmaW5lIEhBVkVfTkVXX0FERFJUIDEKKyNlbmRpZgorCisjaWYgSEFWRV9ORVdfQUREUlQKKyNkZWZpbmUgbWFza19pbl9hZGRyKHgpICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSYoKHgpLnJ0X2dlbm1hc2spKS0+c2luX2FkZHIuc19hZGRyKQorI2RlZmluZSBmdWxsX21hc2soeCkgKHgpCisjZWxzZQorI2RlZmluZSBtYXNrX2luX2FkZHIoeCkgKCh4KS5ydF9nZW5tYXNrKQorI2RlZmluZSBmdWxsX21hc2soeCkgKCgoc3RydWN0IHNvY2thZGRyX2luICopJih4KSktPnNpbl9hZGRyLnNfYWRkcikKKyNlbmRpZgorCisvKiBUaGUgUlRBQ1RJT04gZW50cmllcyBtdXN0IGFncmVlIHdpdGggdGJsX3ZlcmJbXSBiZWxvdyEgKi8KKyNkZWZpbmUgUlRBQ1RJT05fQUREIDEKKyNkZWZpbmUgUlRBQ1RJT05fREVMIDIKKworLyogRm9yIHRoZSB2YXJpb3VzIHRibF8qW10gYXJyYXlzLCB0aGUgMXN0IGJ5dGUgaXMgdGhlIG9mZnNldCB0bworICogdGhlIG5leHQgZW50cnkgYW5kIHRoZSAybmQgYnl0ZSBpcyByZXR1cm4gdmFsdWUuICovCisKKyNkZWZpbmUgTkVUX0ZMQUcgIDEKKyNkZWZpbmUgSE9TVF9GTEFHIDIKKworLyogV2UgcmVtYXAgJy0nIHRvICcjJyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGdldG9wdC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHRibF9oYXNoX25ldF9ob3N0W10gQUxJR04xID0KKwkiXDAwN1wwMDEjbmV0XDAiCisvKgkiXDAxMFwwMDIjaG9zdFwwIiAqLworCSJcMDA3XDAwMiNob3N0IgkJCQkvKiBTaW5jZSBsYXN0LCB3ZSBjYW4gc2F2ZSBhIGJ5dGUuICovCis7CisKKyNkZWZpbmUgS1dfVEFLRVNfQVJHICAgICAgICAgICAgMDIwCisjZGVmaW5lIEtXX1NFVFNfRkxBRyAgICAgICAgICAgIDA0MAorCisjZGVmaW5lIEtXX0lQVnhfTUVUUklDICAgICAgICAgIDAyMAorI2RlZmluZSBLV19JUFZ4X05FVE1BU0sgICAgICAgICAwMjEKKyNkZWZpbmUgS1dfSVBWeF9HQVRFV0FZICAgICAgICAgMDIyCisjZGVmaW5lIEtXX0lQVnhfTVNTICAgICAgICAgICAgIDAyMworI2RlZmluZSBLV19JUFZ4X1dJTkRPVyAgICAgICAgICAwMjQKKyNkZWZpbmUgS1dfSVBWeF9JUlRUICAgICAgICAgICAgMDI1CisjZGVmaW5lIEtXX0lQVnhfREVWSUNFICAgICAgICAgIDAyNgorCisjZGVmaW5lIEtXX0lQVnhfRkxBR19PTkxZICAgICAgIDA0MAorI2RlZmluZSBLV19JUFZ4X1JFSkVDVCAgICAgICAgICAwNDAKKyNkZWZpbmUgS1dfSVBWeF9NT0QgICAgICAgICAgICAgMDQxCisjZGVmaW5lIEtXX0lQVnhfRFlOICAgICAgICAgICAgIDA0MgorI2RlZmluZSBLV19JUFZ4X1JFSU5TVEFURSAgICAgICAwNDMKKworc3RhdGljIGNvbnN0IGNoYXIgdGJsX2lwdnhbXSBBTElHTjEgPQorCS8qIDAyMCBpcyB0aGUgInRha2VzIGFuIGFyZyIgYml0ICovCisjaWYgSEFWRV9ORVdfQUREUlQKKwkiXDAxMVwwMjBtZXRyaWNcMCIKKyNlbmRpZgorCSJcMDEyXDAyMW5ldG1hc2tcMCIKKwkiXDAwNVwwMjJnd1wwIgorCSJcMDEyXDAyMmdhdGV3YXlcMCIKKwkiXDAwNlwwMjNtc3NcMCIKKwkiXDAxMVwwMjR3aW5kb3dcMCIKKyNpZmRlZiBSVEZfSVJUVAorCSJcMDA3XDAyNWlydHRcMCIKKyNlbmRpZgorCSJcMDA2XDAyNmRldlwwIgorCSJcMDExXDAyNmRldmljZVwwIgorCS8qIDA0MCBpcyB0aGUgInNldHMgYSBmbGFnIiBiaXQgLSBNVVNUIG1hdGNoIGZsYWdzX2lwdnhbXSB2YWx1ZXMgYmVsb3cuICovCisjaWZkZWYgUlRGX1JFSkVDVAorCSJcMDExXDA0MHJlamVjdFwwIgorI2VuZGlmCisJIlwwMDZcMDQxbW9kXDAiCisJIlwwMDZcMDQyZHluXDAiCisvKgkiXDAxNFwwNDNyZWluc3RhdGVcMCIgKi8KKwkiXDAxM1wwNDNyZWluc3RhdGUiCQkJLyogU2luY2UgbGFzdCwgd2UgY2FuIHNhdmUgYSBieXRlLiAqLworOworCitzdGF0aWMgY29uc3QgaW50IGZsYWdzX2lwdnhbXSA9IHsgLyogTVVTVCBtYXRjaCB0YmxfaXB2eFtdIHZhbHVlcyBhYm92ZS4gKi8KKyNpZmRlZiBSVEZfUkVKRUNUCisJUlRGX1JFSkVDVCwKKyNlbmRpZgorCVJURl9NT0RJRklFRCwKKwlSVEZfRFlOQU1JQywKKwlSVEZfUkVJTlNUQVRFCit9OworCitzdGF0aWMgaW50IGt3X2xvb2t1cChjb25zdCBjaGFyICprd3RibCwgY2hhciAqKipwYXJncykKK3sKKwlpZiAoKipwYXJncykgeworCQlkbyB7CisJCQlpZiAoc3RyY21wKGt3dGJsKzIsICoqcGFyZ3MpID09IDApIHsgLyogRm91bmQgYSBtYXRjaC4gKi8KKwkJCQkqcGFyZ3MgKz0gMTsKKwkJCQlpZiAoa3d0YmxbMV0gJiBLV19UQUtFU19BUkcpIHsKKwkJCQkJaWYgKCEqKnBhcmdzKSB7CS8qIE5vIG1vcmUgYXJncyEgKi8KKwkJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQkJfQorCQkJCQkqcGFyZ3MgKz0gMTsgLyogQ2FsbGluZyByb3V0aW5lIHdpbGwgdXNlIGFyZ3NbLTFdLiAqLworCQkJCX0KKwkJCQlyZXR1cm4ga3d0YmxbMV07CisJCQl9CisJCQlrd3RibCArPSAqa3d0Ymw7CisJCX0gd2hpbGUgKCprd3RibCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBBZGQgb3IgZGVsZXRlIGEgcm91dGUsIGRlcGVuZGluZyBvbiBhY3Rpb24uICovCisKK3N0YXRpYyBOT0lOTElORSB2b2lkIElORVRfc2V0cm91dGUoaW50IGFjdGlvbiwgY2hhciAqKmFyZ3MpCit7CisJLyogY2hhciBidWZmZXIgaW5zdGVhZCBvZiBib25hLWZpZGUgc3RydWN0IGF2b2lkcyBhbGlhc2luZyB3YXJuaW5nICovCisJY2hhciBydF9idWZbc2l6ZW9mKHN0cnVjdCBydGVudHJ5KV07CisJc3RydWN0IHJ0ZW50cnkgKmNvbnN0IHJ0ID0gKHZvaWQgKilydF9idWY7CisKKwljb25zdCBjaGFyICpuZXRtYXNrID0gTlVMTDsKKwlpbnQgc2tmZCwgaXNuZXQsIHhmbGFnOworCisJLyogR3JhYiB0aGUgLW5ldCBvciAtaG9zdCBvcHRpb25zLiAgUmVtZW1iZXIgdGhleSB3ZXJlIHRyYW5zZm9ybWVkLiAqLworCXhmbGFnID0ga3dfbG9va3VwKHRibF9oYXNoX25ldF9ob3N0LCAmYXJncyk7CisKKwkvKiBJZiB3ZSBkaWQgZ3JhYiAtbmV0IG9yIC1ob3N0LCBtYWtlIHN1cmUgd2Ugc3RpbGwgaGF2ZSBhbiBhcmcgbGVmdC4gKi8KKwlpZiAoKmFyZ3MgPT0gTlVMTCkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogQ2xlYW4gb3V0IHRoZSBSVFJFUSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KHJ0LCAwLCBzaXplb2YoKnJ0KSk7CisKKwl7CisJCWNvbnN0IGNoYXIgKnRhcmdldCA9ICphcmdzKys7CisJCWNoYXIgKnByZWZpeDsKKworCQkvKiByZWNvZ25pemUgeC54LngueC9tYXNrIGZvcm1hdC4gKi8KKwkJcHJlZml4ID0gc3RyY2hyKHRhcmdldCwgJy8nKTsKKwkJaWYgKHByZWZpeCkgeworCQkJaW50IHByZWZpeF9sZW47CisKKwkJCXByZWZpeF9sZW4gPSB4YXRvdWxfcmFuZ2UocHJlZml4KzEsIDAsIDMyKTsKKwkJCW1hc2tfaW5fYWRkcigqcnQpID0gaHRvbmwoIH4oMHhmZmZmZmZmZlVMID4+IHByZWZpeF9sZW4pKTsKKwkJCSpwcmVmaXggPSAnXDAnOworI2lmIEhBVkVfTkVXX0FERFJUCisJCQlydC0+cnRfZ2VubWFzay5zYV9mYW1pbHkgPSBBRl9JTkVUOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQkvKiBEZWZhdWx0IG5ldG1hc2suICovCisJCQluZXRtYXNrID0gImRlZmF1bHQiOworCQl9CisJCS8qIFByZWZlciBob3N0bmFtZSBsb29rdXAgaXMgLWhvc3QgZmxhZyAoeGZsYWc9PTEpIHdhcyBnaXZlbi4gKi8KKwkJaXNuZXQgPSBJTkVUX3Jlc29sdmUodGFyZ2V0LCAoc3RydWN0IHNvY2thZGRyX2luICopICZydC0+cnRfZHN0LAorCQkJCQkJCSAoeGZsYWcgJiBIT1NUX0ZMQUcpKTsKKwkJaWYgKGlzbmV0IDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc29sdmluZyAlcyIsIHRhcmdldCk7CisJCX0KKwkJaWYgKHByZWZpeCkgeworCQkJLyogZG8gbm90IGRlc3Ryb3kgcHJlZml4IGZvciBwcm9jZXNzIGFyZ3MgKi8KKwkJCSpwcmVmaXggPSAnLyc7CisJCX0KKwl9CisKKwlpZiAoeGZsYWcpIHsJCS8qIFJlaW5pdCBpc25ldCBpZiAtbmV0IG9yIC1ob3N0IHdhcyBzcGVjaWZpZWQuICovCisJCWlzbmV0ID0gKHhmbGFnICYgTkVUX0ZMQUcpOworCX0KKworCS8qIEZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4gKi8KKwlydC0+cnRfZmxhZ3MgPSAoKGlzbmV0KSA/IFJURl9VUCA6IChSVEZfVVAgfCBSVEZfSE9TVCkpOworCisJd2hpbGUgKCphcmdzKSB7CisJCWludCBrID0ga3dfbG9va3VwKHRibF9pcHZ4LCAmYXJncyk7CisJCWNvbnN0IGNoYXIgKmFyZ3NfbTEgPSBhcmdzWy0xXTsKKworCQlpZiAoayAmIEtXX0lQVnhfRkxBR19PTkxZKSB7CisJCQlydC0+cnRfZmxhZ3MgfD0gZmxhZ3NfaXB2eFtrICYgM107CisJCQljb250aW51ZTsKKwkJfQorCisjaWYgSEFWRV9ORVdfQUREUlQKKwkJaWYgKGsgPT0gS1dfSVBWeF9NRVRSSUMpIHsKKwkJCXJ0LT5ydF9tZXRyaWMgPSB4YXRvdWwoYXJnc19tMSkgKyAxOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisJCWlmIChrID09IEtXX0lQVnhfTkVUTUFTSykgeworCQkJc3RydWN0IHNvY2thZGRyIG1hc2s7CisKKwkJCWlmIChtYXNrX2luX2FkZHIoKnJ0KSkgeworCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCX0KKworCQkJbmV0bWFzayA9IGFyZ3NfbTE7CisJCQlpc25ldCA9IElORVRfcmVzb2x2ZShuZXRtYXNrLCAoc3RydWN0IHNvY2thZGRyX2luICopICZtYXNrLCAwKTsKKwkJCWlmIChpc25ldCA8IDApIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzb2x2aW5nICVzIiwgbmV0bWFzayk7CisJCQl9CisJCQlydC0+cnRfZ2VubWFzayA9IGZ1bGxfbWFzayhtYXNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGsgPT0gS1dfSVBWeF9HQVRFV0FZKSB7CisJCQlpZiAocnQtPnJ0X2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQl9CisKKwkJCWlzbmV0ID0gSU5FVF9yZXNvbHZlKGFyZ3NfbTEsCisJCQkJCQkoc3RydWN0IHNvY2thZGRyX2luICopICZydC0+cnRfZ2F0ZXdheSwgMSk7CisJCQlydC0+cnRfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisKKwkJCWlmIChpc25ldCkgeworCQkJCWlmIChpc25ldCA8IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc29sdmluZyAlcyIsIGFyZ3NfbTEpOworCQkJCX0KKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2F0ZXdheSAlcyBpcyBhIE5FVFdPUksiLCBhcmdzX20xKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGsgPT0gS1dfSVBWeF9NU1MpIHsJLyogQ2hlY2sgdmFsaWQgTVNTIGJvdW5kcy4gKi8KKwkJCXJ0LT5ydF9mbGFncyB8PSBSVEZfTVNTOworCQkJcnQtPnJ0X21zcyA9IHhhdG91bF9yYW5nZShhcmdzX20xLCA2NCwgMzI3NjgpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoayA9PSBLV19JUFZ4X1dJTkRPVykgewkvKiBDaGVjayB2YWxpZCB3aW5kb3cgYm91bmRzLiAqLworCQkJcnQtPnJ0X2ZsYWdzIHw9IFJURl9XSU5ET1c7CisJCQlydC0+cnRfd2luZG93ID0geGF0b3VsX3JhbmdlKGFyZ3NfbTEsIDEyOCwgSU5UX01BWCk7CisJCQljb250aW51ZTsKKwkJfQorCisjaWZkZWYgUlRGX0lSVFQKKwkJaWYgKGsgPT0gS1dfSVBWeF9JUlRUKSB7CisJCQlydC0+cnRfZmxhZ3MgfD0gUlRGX0lSVFQ7CisJCQlydC0+cnRfaXJ0dCA9IHhhdG91bChhcmdzX20xKTsKKwkJCXJ0LT5ydF9pcnR0ICo9IChzeXNjb25mKF9TQ19DTEtfVENLKSAvIDEwMCk7CS8qIEZJWE1FICovCisjaWYgMAkJCQkJLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gY2hlY2sgYW55dGhpbmcgb2YgdGhpcz8gKi8KKwkJCWlmIChydC0+cnRfaXJ0dCA8IDEgfHwgcnQtPnJ0X2lydHQgPiAoMTIwICogSFopKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBpcnR0Iik7CisJCQl9CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKworCQkvKiBEZXZpY2UgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB0aGUgbGFzdCBhcmcgc3BlY2lmaWVkCisJCSAqIGFuZCBkb2Vzbid0IHJlcXVyZSB0aGUgZGV2L2RldmljZSBrZXl3b3JkIGluIHRoYXQgY2FzZS4gKi8KKwkJaWYgKCFydC0+cnRfZGV2ICYmICgoayA9PSBLV19JUFZ4X0RFVklDRSkgfHwgKCFrICYmICEqKythcmdzKSkpIHsKKwkJCS8qIERvbid0IHVzZSBhcmdzX20xIGhlcmUgc2luY2UgYXJncyBtYXkgaGF2ZSBjaGFuZ2VkISAqLworCQkJcnQtPnJ0X2RldiA9IGFyZ3NbLTFdOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3RoaW5nIG1hdGNoZWQuICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKyNpZmRlZiBSVEZfUkVKRUNUCisJaWYgKChydC0+cnRfZmxhZ3MgJiBSVEZfUkVKRUNUKSAmJiAhcnQtPnJ0X2RldikgeworCQlydC0+cnRfZGV2ID0gKGNoYXIqKSJsbyI7CisJfQorI2VuZGlmCisKKwkvKiBzYW5pdHkgY2hlY2tzLi4gKi8KKwlpZiAobWFza19pbl9hZGRyKCpydCkpIHsKKwkJdWludDMyX3QgbWFzayA9IG1hc2tfaW5fYWRkcigqcnQpOworCisJCW1hc2sgPSB+bnRvaGwobWFzayk7CisJCWlmICgocnQtPnJ0X2ZsYWdzICYgUlRGX0hPU1QpICYmIG1hc2sgIT0gMHhmZmZmZmZmZikgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5ldG1hc2sgJS44eCBhbmQgaG9zdCByb3V0ZSBjb25mbGljdCIsCisJCQkJCQkJCSAodW5zaWduZWQgaW50KSBtYXNrKTsKKwkJfQorCQlpZiAobWFzayAmIChtYXNrICsgMSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJib2d1cyBuZXRtYXNrICVzIiwgbmV0bWFzayk7CisJCX0KKwkJbWFzayA9ICgoc3RydWN0IHNvY2thZGRyX2luICopICZydC0+cnRfZHN0KS0+c2luX2FkZHIuc19hZGRyOworCQlpZiAobWFzayAmIH4odWludDMyX3QpbWFza19pbl9hZGRyKCpydCkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZXRtYXNrIGFuZCByb3V0ZSBhZGRyZXNzIGNvbmZsaWN0Iik7CisJCX0KKwl9CisKKwkvKiBGaWxsIG91dCBuZXRtYXNrIGlmIHN0aWxsIHVuc2V0ICovCisJaWYgKChhY3Rpb24gPT0gUlRBQ1RJT05fQUREKSAmJiAocnQtPnJ0X2ZsYWdzICYgUlRGX0hPU1QpKSB7CisJCW1hc2tfaW5fYWRkcigqcnQpID0gMHhmZmZmZmZmZjsKKwl9CisKKwkvKiBDcmVhdGUgYSBzb2NrZXQgdG8gdGhlIElORVQga2VybmVsLiAqLworCXNrZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisJaWYgKGFjdGlvbiA9PSBSVEFDVElPTl9BREQpCisJCXhpb2N0bChza2ZkLCBTSU9DQUREUlQsIHJ0KTsKKwllbHNlCisJCXhpb2N0bChza2ZkLCBTSU9DREVMUlQsIHJ0KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgY2xvc2Uoc2tmZCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIElORVQ2X3NldHJvdXRlKGludCBhY3Rpb24sIGNoYXIgKiphcmdzKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2E2OworCXN0cnVjdCBpbjZfcnRtc2cgcnQ7CisJaW50IHByZWZpeF9sZW4sIHNrZmQ7CisJY29uc3QgY2hhciAqZGV2bmFtZTsKKworCQkvKiBXZSBrbm93IGFyZ3MgaXNuJ3QgTlVMTCBmcm9tIHRoZSBjaGVjayBpbiByb3V0ZV9tYWluLiAqLworCQljb25zdCBjaGFyICp0YXJnZXQgPSAqYXJncysrOworCisJCWlmIChzdHJjbXAodGFyZ2V0LCAiZGVmYXVsdCIpID09IDApIHsKKwkJCXByZWZpeF9sZW4gPSAwOworCQkJbWVtc2V0KCZzYTYsIDAsIHNpemVvZihzYTYpKTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKmNwOworCQkJY3AgPSBzdHJjaHIodGFyZ2V0LCAnLycpOyAvKiBZZXMuLi4gY29uc3QgdG8gbm9uIGlzIG9rLiAqLworCQkJaWYgKGNwKSB7CisJCQkJKmNwID0gJ1wwJzsKKwkJCQlwcmVmaXhfbGVuID0geGF0b3VsX3JhbmdlKGNwICsgMSwgMCwgMTI4KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJlZml4X2xlbiA9IDEyODsKKwkJCX0KKwkJCWlmIChJTkVUNl9yZXNvbHZlKHRhcmdldCwgKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJnNhNikgPCAwKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc29sdmluZyAlcyIsIHRhcmdldCk7CisJCQl9CisJCX0KKworCS8qIENsZWFuIG91dCB0aGUgUlRSRVEgc3RydWN0dXJlLiAqLworCW1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOworCisJbWVtY3B5KCZydC5ydG1zZ19kc3QsIHNhNi5zaW42X2FkZHIuczZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCisJLyogRmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLiAqLworCXJ0LnJ0bXNnX2RzdF9sZW4gPSBwcmVmaXhfbGVuOworCXJ0LnJ0bXNnX2ZsYWdzID0gKChwcmVmaXhfbGVuID09IDEyOCkgPyAoUlRGX1VQfFJURl9IT1NUKSA6IFJURl9VUCk7CisJcnQucnRtc2dfbWV0cmljID0gMTsKKworCWRldm5hbWUgPSBOVUxMOworCisJd2hpbGUgKCphcmdzKSB7CisJCWludCBrID0ga3dfbG9va3VwKHRibF9pcHZ4LCAmYXJncyk7CisJCWNvbnN0IGNoYXIgKmFyZ3NfbTEgPSBhcmdzWy0xXTsKKworCQlpZiAoKGsgPT0gS1dfSVBWeF9NT0QpIHx8IChrID09IEtXX0lQVnhfRFlOKSkgeworCQkJcnQucnRtc2dfZmxhZ3MgfD0gZmxhZ3NfaXB2eFtrICYgM107CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChrID09IEtXX0lQVnhfTUVUUklDKSB7CisJCQlydC5ydG1zZ19tZXRyaWMgPSB4YXRvdWwoYXJnc19tMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChrID09IEtXX0lQVnhfR0FURVdBWSkgeworCQkJaWYgKHJ0LnJ0bXNnX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQl9CisKKwkJCWlmIChJTkVUNl9yZXNvbHZlKGFyZ3NfbTEsIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZzYTYpIDwgMCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyZXNvbHZpbmcgJXMiLCBhcmdzX20xKTsKKwkJCX0KKwkJCW1lbWNweSgmcnQucnRtc2dfZ2F0ZXdheSwgc2E2LnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCXJ0LnJ0bXNnX2ZsYWdzIHw9IFJURl9HQVRFV0FZOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBEZXZpY2UgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB0aGUgbGFzdCBhcmcgc3BlY2lmaWVkCisJCSAqIGFuZCBkb2Vzbid0IHJlcXVyZSB0aGUgZGV2L2RldmljZSBrZXl3b3JkIGluIHRoYXQgY2FzZS4gKi8KKwkJaWYgKCFkZXZuYW1lICYmICgoayA9PSBLV19JUFZ4X0RFVklDRSkgfHwgKCFrICYmICEqKythcmdzKSkpIHsKKwkJCS8qIERvbid0IHVzZSBhcmdzX20xIGhlcmUgc2luY2UgYXJncyBtYXkgaGF2ZSBjaGFuZ2VkISAqLworCQkJZGV2bmFtZSA9IGFyZ3NbLTFdOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3RoaW5nIG1hdGNoZWQuICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBDcmVhdGUgYSBzb2NrZXQgdG8gdGhlIElORVQ2IGtlcm5lbC4gKi8KKwlza2ZkID0geHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7CisKKwlydC5ydG1zZ19pZmluZGV4ID0gMDsKKworCWlmIChkZXZuYW1lKSB7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXZuYW1lKTsKKwkJeGlvY3RsKHNrZmQsIFNJT0dJRklOREVYLCAmaWZyKTsKKwkJcnQucnRtc2dfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwl9CisKKwkvKiBUZWxsIHRoZSBrZXJuZWwgdG8gYWNjZXB0IHRoaXMgcm91dGUuICovCisJaWYgKGFjdGlvbiA9PSBSVEFDVElPTl9BREQpCisJCXhpb2N0bChza2ZkLCBTSU9DQUREUlQsICZydCk7CisJZWxzZQorCQl4aW9jdGwoc2tmZCwgU0lPQ0RFTFJULCAmcnQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShza2ZkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZmxhZ3ZhbHNbXSA9IHsgLyogTXVzdCBhZ3JlZSB3aXRoIGZsYWdjaGFyc1tdLiAqLworCVJURl9HQVRFV0FZLAorCVJURl9IT1NULAorCVJURl9SRUlOU1RBVEUsCisJUlRGX0RZTkFNSUMsCisJUlRGX01PRElGSUVELAorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlSVEZfREVGQVVMVCwKKwlSVEZfQUREUkNPTkYsCisJUlRGX0NBQ0hFCisjZW5kaWYKK307CisKKyNkZWZpbmUgSVBWNF9NQVNLIChSVEZfR0FURVdBWXxSVEZfSE9TVHxSVEZfUkVJTlNUQVRFfFJURl9EWU5BTUlDfFJURl9NT0RJRklFRCkKKyNkZWZpbmUgSVBWNl9NQVNLIChSVEZfR0FURVdBWXxSVEZfSE9TVHxSVEZfREVGQVVMVHxSVEZfQUREUkNPTkZ8UlRGX0NBQ0hFKQorCisvKiBNdXN0IGFncmVlIHdpdGggZmxhZ3ZhbHNbXS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIGZsYWdjaGFyc1tdIEFMSUdOMSA9CisJIkdIUkRNIgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkiREFDIgorI2VuZGlmCis7CisKK3N0YXRpYyB2b2lkIHNldF9mbGFncyhjaGFyICpmbGFnc3RyLCBpbnQgZmxhZ3MpCit7CisJaW50IGk7CisKKwkqZmxhZ3N0cisrID0gJ1UnOworCisJZm9yIChpID0gMDsgKCpmbGFnc3RyID0gZmxhZ2NoYXJzW2ldKSAhPSAwOyBpKyspIHsKKwkJaWYgKGZsYWdzICYgZmxhZ3ZhbHNbaV0pIHsKKwkJCSsrZmxhZ3N0cjsKKwkJfQorCX0KK30KKworLyogYWxzbyB1c2VkIGluIG5ldHN0YXQgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX2Rpc3BsYXlyb3V0ZXMoaW50IG5vcmVzb2x2ZSwgaW50IG5ldHN0YXRmbXQpCit7CisJY2hhciBkZXZuYW1lWzY0XSwgZmxhZ3NbMTZdLCAqc2Rlc3QsICpzZ3c7CisJdW5zaWduZWQgbG9uZyBkLCBnLCBtOworCWludCBmbGdzLCByZWYsIHVzZSwgbWV0cmljLCBtdHUsIHdpbiwgaXI7CisJc3RydWN0IHNvY2thZGRyX2luIHNfYWRkcjsKKwlzdHJ1Y3QgaW5fYWRkciBtYXNrOworCisJRklMRSAqZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL25ldC9yb3V0ZSIpOworCisJcHJpbnRmKCJLZXJuZWwgSVAgcm91dGluZyB0YWJsZVxuIgorCSAgICAgICAiRGVzdGluYXRpb24gICAgIEdhdGV3YXkgICAgICAgICBHZW5tYXNrICAgICAgICAgRmxhZ3MgJXMgSWZhY2VcbiIsCisJCQluZXRzdGF0Zm10ID8gIiAgTVNTIFdpbmRvdyAgaXJ0dCIgOiAiTWV0cmljIFJlZiAgICBVc2UiKTsKKworCWlmIChmc2NhbmYoZnAsICIlKlteXG5dXG4iKSA8IDApIHsgLyogU2tpcCB0aGUgZmlyc3QgbGluZS4gKi8KKwkJZ290byBFUlJPUjsJCSAgIC8qIEVtcHR5IG9yIG1pc3NpbmcgbGluZSwgb3IgcmVhZCBlcnJvci4gKi8KKwl9CisJd2hpbGUgKDEpIHsKKwkJaW50IHI7CisJCXIgPSBmc2NhbmYoZnAsICIlNjNzJWx4JWx4JVglZCVkJWQlbHglZCVkJWRcbiIsCisJCQkJICAgZGV2bmFtZSwgJmQsICZnLCAmZmxncywgJnJlZiwgJnVzZSwgJm1ldHJpYywgJm0sCisJCQkJICAgJm10dSwgJndpbiwgJmlyKTsKKwkJaWYgKHIgIT0gMTEpIHsKKwkJCWlmICgociA8IDApICYmIGZlb2YoZnApKSB7IC8qIEVPRiB3aXRoIG5vIChub25zcGFjZSkgY2hhcnMgcmVhZC4gKi8KKwkJCQlicmVhazsKKwkJCX0KKyBFUlJPUjoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmc2NhbmYiKTsKKwkJfQorCisJCWlmICghKGZsZ3MgJiBSVEZfVVApKSB7IC8qIFNraXAgaW50ZXJmYWNlcyB0aGF0IGFyZSBkb3duLiAqLworCQkJY29udGludWU7CisJCX0KKworCQlzZXRfZmxhZ3MoZmxhZ3MsIChmbGdzICYgSVBWNF9NQVNLKSk7CisjaWZkZWYgUlRGX1JFSkVDVAorCQlpZiAoZmxncyAmIFJURl9SRUpFQ1QpIHsKKwkJCWZsYWdzWzBdID0gJyEnOworCQl9CisjZW5kaWYKKworCQltZW1zZXQoJnNfYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQlzX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBkOworCQlzZGVzdCA9IElORVRfcnJlc29sdmUoJnNfYWRkciwgKG5vcmVzb2x2ZSB8IDB4ODAwMCksIG0pOyAvKiAnZGVmYXVsdCcgaW5zdGVhZCBvZiAnKicgKi8KKwkJc19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGc7CisJCXNndyA9IElORVRfcnJlc29sdmUoJnNfYWRkciwgKG5vcmVzb2x2ZSB8IDB4NDAwMCksIG0pOyAvKiBIb3N0IGluc3RlYWQgb2YgbmV0ICovCisJCW1hc2suc19hZGRyID0gbTsKKwkJLyogIiUxNS4xNXMiIHRydW5jYXRlcyBob3N0bmFtZXMsIGRvIHdlIHJlYWxseSB3YW50IHRoYXQ/ICovCisJCXByaW50ZigiJS0xNS4xNXMgJS0xNS4xNXMgJS0xNnMlLTZzIiwgc2Rlc3QsIHNndywgaW5ldF9udG9hKG1hc2spLCBmbGFncyk7CisJCWZyZWUoc2Rlc3QpOworCQlmcmVlKHNndyk7CisJCWlmIChuZXRzdGF0Zm10KSB7CisJCQlwcmludGYoIiU1ZCAlLTVkICU2ZCAlc1xuIiwgbXR1LCB3aW4sIGlyLCBkZXZuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJS02ZCAlLTJkICU3ZCAlc1xuIiwgbWV0cmljLCByZWYsIHVzZSwgZGV2bmFtZSk7CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKworc3RhdGljIHZvaWQgSU5FVDZfZGlzcGxheXJvdXRlcyh2b2lkKQoreworCWNoYXIgYWRkcjZbMTI4XSwgKm5hZGRyNjsKKwkvKiBJbiBhZGRyNngsIHdlIHN0b3JlIGJvdGggNDAtYnl0ZSAnOictZGVsaW1pdGVkIGlwdjYgYWRkcmVzc2VzLgorCSAqIFdlIHJlYWQgdGhlIG5vbi1kZWxpbWl0ZWQgc3RyaW5ncyBpbnRvIHRoZSB0YWlsIG9mIHRoZSBidWZmZXIKKwkgKiB1c2luZyBmc2NhbmYgYW5kIHRoZW4gbW9kaWZ5IHRoZSBidWZmZXIgYnkgc2hpZnRpbmcgZm9yd2FyZAorCSAqIHdoaWxlIGluc2VydGluZyAnOidzIGFuZCB0aGUgbnVsIHRlcm1pbmF0b3IgZm9yIHRoZSBmaXJzdCBzdHJpbmcuCisJICogSGVuY2UgdGhlIHN0cmluZ3MgYXJlIGF0IGFkZHI2eCBhbmQgYWRkcjZ4KzQwLiAgVGhpcyBnZW5lcmF0ZXMKKwkgKiBfbXVjaF8gbGVzcyBjb2RlIHRoYW4gdGhlIHByZXZpb3VzICh1cHN0cmVhbSkgYXBwcm9hY2guICovCisJY2hhciBhZGRyNnhbODBdOworCWNoYXIgaWZhY2VbMTZdLCBmbGFnc1sxNl07CisJaW50IGlmbGFncywgbWV0cmljLCByZWZjbnQsIHVzZSwgcHJlZml4X2xlbiwgc2xlbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNuYWRkcjY7CisKKwlGSUxFICpmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2MvbmV0L2lwdjZfcm91dGUiKTsKKworCXByaW50ZigiS2VybmVsIElQdjYgcm91dGluZyB0YWJsZVxuJS00NHMlLTQwcyIKKwkJCSAgIkZsYWdzIE1ldHJpYyBSZWYgICAgVXNlIElmYWNlXG4iLAorCQkJICAiRGVzdGluYXRpb24iLCAiTmV4dCBIb3AiKTsKKworCXdoaWxlICgxKSB7CisJCWludCByOworCQlyID0gZnNjYW5mKGZwLCAiJTMycyV4JSpzJXglMzJzJXgleCV4JXglc1xuIiwKKwkJCQlhZGRyNngrMTQsICZwcmVmaXhfbGVuLCAmc2xlbiwgYWRkcjZ4KzQwKzcsCisJCQkJJm1ldHJpYywgJnVzZSwgJnJlZmNudCwgJmlmbGFncywgaWZhY2UpOworCQlpZiAociAhPSA5KSB7CisJCQlpZiAoKHIgPCAwKSAmJiBmZW9mKGZwKSkgeyAvKiBFT0Ygd2l0aCBubyAobm9uc3BhY2UpIGNoYXJzIHJlYWQuICovCisJCQkJYnJlYWs7CisJCQl9CisgRVJST1I6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZnNjYW5mIik7CisJCX0KKworCQkvKiBEbyB0aGUgYWRkcjZ4IHNoaWZ0LWFuZC1pbnNlcnQgY2hhbmdlcyB0byAnOictZGVsaW1pdCBhZGRyZXNzZXMuCisJCSAqIEZvciBub3csIGFsd2F5cyBkbyB0aGlzIHRvIHZhbGlkYXRlIHRoZSBwcm9jIHJvdXRlIGZvcm1hdCwgZXZlbgorCQkgKiBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24uICovCisJCXsKKwkJCWludCBpID0gMDsKKwkJCWNoYXIgKnAgPSBhZGRyNngrMTQ7CisKKwkJCWRvIHsKKwkJCQlpZiAoISpwKSB7CisJCQkJCWlmIChpID09IDQwKSB7IC8qIG51bCB0ZXJtaW5hdG9yIGZvciAxc3QgYWRkcmVzcz8gKi8KKwkJCQkJCWFkZHI2eFszOV0gPSAwOwkvKiBGaXh1cC4uLiBuZWVkIDAgaW5zdGVhZCBvZiAnOicuICovCisJCQkJCQkrK3A7CS8qIFNraXAgYW5kIGNvbnRpbnVlLiAqLworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQkJYWRkcjZ4W2krK10gPSAqcCsrOworCQkJCWlmICghKChpKzEpICUgNSkpIHsKKwkJCQkJYWRkcjZ4W2krK10gPSAnOic7CisJCQkJfQorCQkJfSB3aGlsZSAoaSA8IDQwKzI4KzcpOworCQl9CisKKwkJaWYgKCEoaWZsYWdzICYgUlRGX1VQKSkgeyAvKiBTa2lwIGludGVyZmFjZXMgdGhhdCBhcmUgZG93bi4gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2V0X2ZsYWdzKGZsYWdzLCAoaWZsYWdzICYgSVBWNl9NQVNLKSk7CisKKwkJciA9IDA7CisJCXdoaWxlICgxKSB7CisJCQlpbmV0X3B0b24oQUZfSU5FVDYsIGFkZHI2eCArIHIsCisJCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc25hZGRyNi5zaW42X2FkZHIpOworCQkJc25hZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJbmFkZHI2ID0gSU5FVDZfcnJlc29sdmUoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJnNuYWRkcjYsCisJCQkJCQkgICAweDBmZmYgLyogQXBwYXJlbnRseSwgdXBzdHJlYW0gbmV2ZXIgcmVzb2x2ZXMuICovCisJCQkJCQkgICApOworCisJCQlpZiAoIXIpIHsJCQkvKiAxc3QgcGFzcyAqLworCQkJCXNucHJpbnRmKGFkZHI2LCBzaXplb2YoYWRkcjYpLCAiJXMvJWQiLCBuYWRkcjYsIHByZWZpeF9sZW4pOworCQkJCXIgKz0gNDA7CisJCQkJZnJlZShuYWRkcjYpOworCQkJfSBlbHNlIHsJCQkvKiAybmQgcGFzcyAqLworCQkJCS8qIFByaW50IHRoZSBpbmZvLiAqLworCQkJCXByaW50ZigiJS00M3MgJS0zOXMgJS01cyAlLTZkICUtMmQgJTdkICUtOHNcbiIsCisJCQkJCQlhZGRyNiwgbmFkZHI2LCBmbGFncywgbWV0cmljLCByZWZjbnQsIHVzZSwgaWZhY2UpOworCQkJCWZyZWUobmFkZHI2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2UoZnApOworfQorCisjZW5kaWYKKworI2RlZmluZSBST1VURV9PUFRfQSAgICAgMHgwMQorI2RlZmluZSBST1VURV9PUFRfbiAgICAgMHgwMgorI2RlZmluZSBST1VURV9PUFRfZSAgICAgMHgwNAorI2RlZmluZSBST1VURV9PUFRfSU5FVDYgMHgwOCAvKiBOb3QgYW4gYWN0dWFsIG9wdGlvbi4gU2VlIGJlbG93LiAqLworCisvKiAxc3QgYnl0ZSBpcyBvZmZzZXQgdG8gbmV4dCBlbnRyeSBvZmZzZXQuICAybmQgYnl0ZSBpcyByZXR1cm4gdmFsdWUuICovCisvKiAybmQgYnl0ZSBtYXRjaGVzIFJUQUNUSU9OXyogY29kZSAqLworc3RhdGljIGNvbnN0IGNoYXIgdGJsX3ZlcmJbXSBBTElHTjEgPQorCSJcMDA2XDAwMWFkZFwwIgorCSJcMDA2XDAwMmRlbFwwIgorLyoJIlwwMTFcMDAyZGVsZXRlXDAiICovCisJIlwwMTBcMDAyZGVsZXRlIiAgLyogU2luY2UgaXQncyBsYXN0LCB3ZSBjYW4gc2F2ZSBhIGJ5dGUuICovCis7CisKK2ludCByb3V0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcm91dGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwlpbnQgd2hhdDsKKwljaGFyICpmYW1pbHk7CisJY2hhciAqKnA7CisKKwkvKiBGaXJzdCwgcmVtYXAgJy1uZXQnIGFuZCAnLWhvc3QnIHRvIGF2b2lkIGdldG9wdCBwcm9ibGVtcy4gKi8KKwlwID0gYXJndjsKKwl3aGlsZSAoKisrcCkgeworCQlpZiAoc3RyY21wKCpwLCAiLW5ldCIpID09IDAgfHwgc3RyY21wKCpwLCAiLWhvc3QiKSA9PSAwKSB7CisJCQlwWzBdWzBdID0gJyMnOworCQl9CisJfQorCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkE6bmUiLCAmZmFtaWx5KTsKKworCWlmICgob3B0ICYgUk9VVEVfT1BUX0EpICYmIHN0cmNtcChmYW1pbHksICJpbmV0IikgIT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJaWYgKHN0cmNtcChmYW1pbHksICJpbmV0NiIpID09IDApIHsKKwkJCW9wdCB8PSBST1VURV9PUFRfSU5FVDY7CS8qIFNldCBmbGFnIGZvciBpcHY2LiAqLworCQl9IGVsc2UKKyNlbmRpZgorCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBObyBtb3JlIGFyZ3MgbWVhbnMgZGlzcGxheSB0aGUgcm91dGluZyB0YWJsZS4gKi8KKwlpZiAoISphcmd2KSB7CisJCWludCBub3Jlc29sdmUgPSAob3B0ICYgUk9VVEVfT1BUX24pID8gMHgwZmZmIDogMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCWlmIChvcHQgJiBST1VURV9PUFRfSU5FVDYpCisJCQlJTkVUNl9kaXNwbGF5cm91dGVzKCk7CisJCWVsc2UKKyNlbmRpZgorCQkJYmJfZGlzcGxheXJvdXRlcyhub3Jlc29sdmUsIG9wdCAmIFJPVVRFX09QVF9lKTsKKworCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisJLyogQ2hlY2sgdmVyYi4gIEF0IHRoZSBtb21lbnQsIG11c3QgYmUgYWRkLCBkZWwsIG9yIGRlbGV0ZS4gKi8KKwl3aGF0ID0ga3dfbG9va3VwKHRibF92ZXJiLCAmYXJndik7CisJaWYgKCF3aGF0IHx8ICEqYXJndikgewkJLyogVW5rbm93biB2ZXJiIG9yIG5vIG1vcmUgYXJncy4gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAob3B0ICYgUk9VVEVfT1BUX0lORVQ2KQorCQlJTkVUNl9zZXRyb3V0ZSh3aGF0LCBhcmd2KTsKKwllbHNlCisjZW5kaWYKKwkJSU5FVF9zZXRyb3V0ZSh3aGF0LCBhcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3NsYXR0YWNoLmMgYi9uZXR3b3JraW5nL3NsYXR0YWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwMGRhNgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvc2xhdHRhY2guYwpAQCAtMCwwICsxLDI1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIG5ldC10b29scyBmb3IgYnVzeWJveC4KKyAqCisgKiBBdXRob3I6IElnbmFjaW8gR2FyY2lhIFBlcmV6IChpZ2dhcnBlIGF0IGdtYWlsIGRvdCBjb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBUaGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlcyBmcm9tIHRoZSBzdGFuZGFyZCBuZXQtdG9vbHMgc2xhdHRhY2g6CisgKgorICogLSBUaGUgLWwgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgKgorICogLSBUaGUgLUYgb3B0aW9ucyBhbGxvd3MgZGlzYWJsaW5nIG9mIFJUUy9DVFMgZmxvdyBjb250cm9sLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzbGF0dGFjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZWhtTEZdIFstcyBTUEVFRF0gWy1wIFBST1RPQ09MXSBERVZJQ0UiCisvL3VzYWdlOiNkZWZpbmUgc2xhdHRhY2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJBdHRhY2ggbmV0d29yayBpbnRlcmZhY2UocykgdG8gc2VyaWFsIGxpbmUocylcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUFJPVAlTZXQgcHJvdG9jb2wgKHNsaXAsIGNzbGlwLCBzbGlwNiwgY2xpc3A2IG9yIGFkYXB0aXZlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU1BECVNldCBsaW5lIHNwZWVkIgorLy91c2FnZTogICAgICJcbgktZQlFeGl0IGFmdGVyIGluaXRpYWxpemluZyBkZXZpY2UiCisvL3VzYWdlOiAgICAgIlxuCS1oCUV4aXQgd2hlbiB0aGUgY2FycmllciBpcyBsb3N0IgorLy91c2FnZTogICAgICJcbgktYyBQUk9HCVJ1biBQUk9HIHdoZW4gdGhlIGxpbmUgaXMgaHVuZyB1cCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JRG8gTk9UIGluaXRpYWxpemUgdGhlIGxpbmUgaW4gcmF3IDggYml0cyBtb2RlIgorLy91c2FnZTogICAgICJcbgktTAlFbmFibGUgMy13aXJlIG9wZXJhdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJRGlzYWJsZSBSVFMvQ1RTIGZsb3cgY29udHJvbCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliaXByb3V0ZS91dGlscy5oIiAvKiBpbnZhcmcoKSAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IGhhbmRsZTsKKwlpbnQgc2F2ZWRfZGlzYzsKKwlzdHJ1Y3QgdGVybWlvcyBzYXZlZF9zdGF0ZTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIGhhbmRsZSAgICAgICAoRy5oYW5kbGUgICAgICApCisjZGVmaW5lIHNhdmVkX2Rpc2MgICAoRy5zYXZlZF9kaXNjICApCisjZGVmaW5lIHNhdmVkX3N0YXRlICAoRy5zYXZlZF9zdGF0ZSApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCisvKgorICogU2F2ZSB0dHkgc3RhdGUgYW5kIGxpbmUgZGlzY2lwbGluZQorICoKKyAqIEl0IGlzIGZpbmUgaGVyZSB0byBiYWlsIG91dCBvbiBlcnJvcnMsIHNpbmNlIHdlIGhhdmVuIG1vZGlmaWVkIGFueXRoaW5nIHlldAorICovCitzdGF0aWMgdm9pZCBzYXZlX3N0YXRlKHZvaWQpCit7CisJLyogU2F2ZSBsaW5lIHN0YXR1cyAqLworCWlmICh0Y2dldGF0dHIoaGFuZGxlLCAmc2F2ZWRfc3RhdGUpIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXQgc3RhdGUiKTsKKworCS8qIFNhdmUgbGluZSBkaXNjaXBsaW5lICovCisJeGlvY3RsKGhhbmRsZSwgVElPQ0dFVEQsICZzYXZlZF9kaXNjKTsKK30KKworc3RhdGljIGludCBzZXRfdGVybWlvc19zdGF0ZV9vcl93YXJuKHN0cnVjdCB0ZXJtaW9zICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdGNzZXRhdHRyKGhhbmRsZSwgVENTQU5PVywgc3RhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coInNldCBzdGF0ZSIpOworCQlyZXR1cm4gMTsgLyogdXNlZCBhcyBleGl0Y29kZSAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlc3RvcmUgc3RhdGUgYW5kIGxpbmUgZGlzY2lwbGluZSBmb3IgQUxMIG1hbmFnZWQgdHR5cworICoKKyAqIFJlc3RvcmluZyBBTEwgbWFuYWdlZCB0dHlzIGlzIHRoZSBvbmx5IHdheSB0byBoYXZlIGEgc2luZ2xlCisgKiBoYW5ndXAgZGVsYXkuCisgKgorICogR28gb24gYWZ0ZXIgZXJyb3JzOiB3ZSB3YW50IHRvIHJlc3RvcmUgYXMgbWFueSBjb250cm9sbGVkIHR0eXMKKyAqIGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgdm9pZCByZXN0b3JlX3N0YXRlX2FuZF9leGl0KGludCBleGl0Y29kZSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCByZXN0b3JlX3N0YXRlX2FuZF9leGl0KGludCBleGl0Y29kZSkKK3sKKwlzdHJ1Y3QgdGVybWlvcyBzdGF0ZTsKKworCS8qIFJlc3RvcmUgbGluZSBkaXNjaXBsaW5lICovCisJaWYgKGlvY3RsX29yX3dhcm4oaGFuZGxlLCBUSU9DU0VURCwgJnNhdmVkX2Rpc2MpIDwgMCkgeworCQlleGl0Y29kZSA9IDE7CisJfQorCisJLyogSGFuZ3VwICovCisJbWVtY3B5KCZzdGF0ZSwgJnNhdmVkX3N0YXRlLCBzaXplb2Yoc3RhdGUpKTsKKwljZnNldGlzcGVlZCgmc3RhdGUsIEIwKTsKKwljZnNldG9zcGVlZCgmc3RhdGUsIEIwKTsKKwlpZiAoc2V0X3Rlcm1pb3Nfc3RhdGVfb3Jfd2Fybigmc3RhdGUpKQorCQlleGl0Y29kZSA9IDE7CisJc2xlZXAoMSk7CisKKwkvKiBSZXN0b3JlIGxpbmUgc3RhdHVzICovCisJaWYgKHNldF90ZXJtaW9zX3N0YXRlX29yX3dhcm4oJnNhdmVkX3N0YXRlKSkKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoaGFuZGxlKTsKKworCWV4aXQoZXhpdGNvZGUpOworfQorCisvKgorICogU2V0IHR0eSBzdGF0ZSwgbGluZSBkaXNjaXBsaW5lIGFuZCBlbmNhcHN1bGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHNldF9zdGF0ZShzdHJ1Y3QgdGVybWlvcyAqc3RhdGUsIGludCBlbmNhcCkKK3sKKwlpbnQgZGlzYzsKKworCS8qIFNldCBsaW5lIHN0YXR1cyAqLworCWlmIChzZXRfdGVybWlvc19zdGF0ZV9vcl93YXJuKHN0YXRlKSkKKwkJZ290byBiYWQ7CisJLyogU2V0IGxpbmUgZGlzY2xpcGxlIChOX1NMSVAgYWx3YXlzKSAqLworCWRpc2MgPSBOX1NMSVA7CisJaWYgKGlvY3RsX29yX3dhcm4oaGFuZGxlLCBUSU9DU0VURCwgJmRpc2MpIDwgMCkgeworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBTZXQgZW5jYXBzdWxhdGlvbiAoU0xJUCwgQ1NMSVAsIGV0YykgKi8KKwlpZiAoaW9jdGxfb3Jfd2FybihoYW5kbGUsIFNJT0NTSUZFTkNBUCwgJmVuY2FwKSA8IDApIHsKKyBiYWQ6CisJCXJlc3RvcmVfc3RhdGVfYW5kX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWdubyBVTlVTRURfUEFSQU0pCit7CisJcmVzdG9yZV9zdGF0ZV9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCitpbnQgc2xhdHRhY2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNsYXR0YWNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkvKiBMaW5lIGRpc2NpcGxpbmUgY29kZSB0YWJsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyIHByb3RvX25hbWVzW10gQUxJR04xID0KKwkJInNsaXBcMCIgICAgICAgIC8qIDAgKi8KKwkJImNzbGlwXDAiICAgICAgIC8qIDEgKi8KKwkJInNsaXA2XDAiICAgICAgIC8qIDIgKi8KKwkJImNzbGlwNlwwIiAgICAgIC8qIDMgKi8KKwkJImFkYXB0aXZlXDAiICAgIC8qIDggKi8KKwkJOworCisJaW50IGksIGVuY2FwLCBvcHQ7CisJc3RydWN0IHRlcm1pb3Mgc3RhdGU7CisJY29uc3QgY2hhciAqcHJvdG8gPSAiY3NsaXAiOworCWNvbnN0IGNoYXIgKmV4dGNtZDsgICAvKiBDb21tYW5kIHRvIGV4ZWN1dGUgYWZ0ZXIgaGFuZ3VwICovCisJY29uc3QgY2hhciAqYmF1ZF9zdHI7CisJaW50IGJhdWRfY29kZSA9IC0xOyAgIC8qIExpbmUgYmF1ZCByYXRlIChzeXN0ZW0gY29kZSkgKi8KKworCWVudW0geworCQlPUFRfcF9wcm90byAgPSAxIDw8IDAsCisJCU9QVF9zX2JhdWQgICA9IDEgPDwgMSwKKwkJT1BUX2NfZXh0Y21kID0gMSA8PCAyLAorCQlPUFRfZV9xdWl0ICAgPSAxIDw8IDMsCisJCU9QVF9oX3dhdGNoICA9IDEgPDwgNCwKKwkJT1BUX21fbm9ucmF3ID0gMSA8PCA1LAorCQlPUFRfTF9sb2NhbCAgPSAxIDw8IDYsCisJCU9QVF9GX25vZmxvdyA9IDEgPDwgNworCX07CisKKwlJTklUX0coKTsKKworCS8qIFBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInA6czpjOmVobUxGIiwgJnByb3RvLCAmYmF1ZF9zdHIsICZleHRjbWQpOworCS8qYXJnYyAtPSBvcHRpbmQ7Ki8KKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWVuY2FwID0gaW5kZXhfaW5fc3RyaW5ncyhwcm90b19uYW1lcywgcHJvdG8pOworCisJaWYgKGVuY2FwIDwgMCkKKwkJaW52YXJnKHByb3RvLCAicHJvdG9jb2wiKTsKKwlpZiAoZW5jYXAgPiAzKQorCQllbmNhcCA9IDg7CisKKwkvKiBXZSB3YW50IHRvIGtub3cgaWYgdGhlIGJhdWQgcmF0ZSBpcyB2YWxpZCBiZWZvcmUgd2Ugc3RhcnQgdG91Y2hpbmcgdGhlIHR0eXMgKi8KKwlpZiAob3B0ICYgT1BUX3NfYmF1ZCkgeworCQliYXVkX2NvZGUgPSB0dHlfdmFsdWVfdG9fYmF1ZCh4YXRvaShiYXVkX3N0cikpOworCQlpZiAoYmF1ZF9jb2RlIDwgMCkKKwkJCWludmFyZyhiYXVkX3N0ciwgImJhdWQgcmF0ZSIpOworCX0KKworCS8qIFRyYXAgc2lnbmFscyBpbiBvcmRlciB0byByZXN0b3JlIHR0eSBzdGF0ZXMgdXBvbiBleGl0ICovCisJaWYgKCEob3B0ICYgT1BUX2VfcXVpdCkpIHsKKwkJYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR0hVUCkKKwkJCSsgKDEgPDwgU0lHSU5UKQorCQkJKyAoMSA8PCBTSUdRVUlUKQorCQkJKyAoMSA8PCBTSUdURVJNKQorCQkJLCBzaWdfaGFuZGxlcik7CisJfQorCisJLyogT3BlbiB0dHkgKi8KKwloYW5kbGUgPSBvcGVuKCphcmd2LCBPX1JEV1IgfCBPX05ERUxBWSk7CisJaWYgKGhhbmRsZSA8IDApIHsKKwkJY2hhciAqYnVmID0gY29uY2F0X3BhdGhfZmlsZSgiL2RldiIsICphcmd2KTsKKwkJaGFuZGxlID0geG9wZW4oYnVmLCBPX1JEV1IgfCBPX05ERUxBWSk7CisJCS8qIG1heWJlIGlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgPz8gKi8KKwkJZnJlZShidWYpOworCX0KKworCS8qIFNhdmUgY3VycmVudCB0dHkgc3RhdGUgKi8KKwlzYXZlX3N0YXRlKCk7CisKKwkvKiBDb25maWd1cmUgdHR5ICovCisJbWVtY3B5KCZzdGF0ZSwgJnNhdmVkX3N0YXRlLCBzaXplb2Yoc3RhdGUpKTsKKwlpZiAoIShvcHQgJiBPUFRfbV9ub25yYXcpKSB7IC8qIHJhdyBub3Qgc3VwcHJlc3NlZCAqLworCQltZW1zZXQoJnN0YXRlLmNfY2MsIDAsIHNpemVvZihzdGF0ZS5jX2NjKSk7CisJCXN0YXRlLmNfY2NbVk1JTl0gPSAxOworCQlzdGF0ZS5jX2lmbGFnID0gSUdOQlJLIHwgSUdOUEFSOworCQlzdGF0ZS5jX29mbGFnID0gMDsKKwkJc3RhdGUuY19sZmxhZyA9IDA7CisJCXN0YXRlLmNfY2ZsYWcgPSBDUzggfCBIVVBDTCB8IENSRUFECisJCSAgICAgICAgICAgICAgfCAoKG9wdCAmIE9QVF9MX2xvY2FsKSA/IENMT0NBTCA6IDApCisJCSAgICAgICAgICAgICAgfCAoKG9wdCAmIE9QVF9GX25vZmxvdykgPyAwIDogQ1JUU0NUUyk7CisJCWNmc2V0aXNwZWVkKCZzdGF0ZSwgY2ZnZXRpc3BlZWQoJnNhdmVkX3N0YXRlKSk7CisJCWNmc2V0b3NwZWVkKCZzdGF0ZSwgY2ZnZXRvc3BlZWQoJnNhdmVkX3N0YXRlKSk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9zX2JhdWQpIHsKKwkJY2ZzZXRpc3BlZWQoJnN0YXRlLCBiYXVkX2NvZGUpOworCQljZnNldG9zcGVlZCgmc3RhdGUsIGJhdWRfY29kZSk7CisJfQorCisJc2V0X3N0YXRlKCZzdGF0ZSwgZW5jYXApOworCisJLyogRXhpdCBub3cgaWYgb3B0aW9uIC1lIHdhcyBwYXNzZWQgKi8KKwlpZiAob3B0ICYgT1BUX2VfcXVpdCkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSdyZSBub3QgcmVxdWVzdGVkIHRvIHdhdGNoLCBqdXN0IGtlZXAgZGVzY3JpcHRvciBvcGVuCisJICogdW50aWwgd2UgYXJlIGtpbGxlZCAqLworCWlmICghKG9wdCAmIE9QVF9oX3dhdGNoKSkKKwkJd2hpbGUgKDEpCisJCQlzbGVlcCgyNCo2MCo2MCk7CisKKwkvKiBXYXRjaCBsaW5lIGZvciBoYW5ndXAgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoaW9jdGwoaGFuZGxlLCBUSU9DTUdFVCwgJmkpIDwgMCB8fCAhKGkgJiBUSU9DTV9DQVIpKQorCQkJZ290byBub19jYXJyaWVyOworCQlzbGVlcCgxNSk7CisJfQorCisgbm9fY2FycmllcjoKKworCS8qIEV4ZWN1dGUgY29tbWFuZCBvbiBoYW5ndXAgKi8KKwlpZiAob3B0ICYgT1BUX2NfZXh0Y21kKQorCQlzeXN0ZW0oZXh0Y21kKTsKKworCS8qIFJlc3RvcmUgc3RhdGVzIGFuZCBleGl0ICovCisJcmVzdG9yZV9zdGF0ZV9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90Yy5jIGIvbmV0d29ya2luZy90Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzQzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RjLmMKQEAgLTAsMCArMSw1NjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIEJlcm5oYXJkIFJldXRuZXItRmlzY2hlciBhZGp1c3RlZCBmb3IgYnVzeWJveAorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0Y190cml2aWFsX3VzYWdlCisvKiAvL3VzYWdlOiAiW09QVElPTlNdIE9CSkVDVCBDTUQgW2RldiBTVFJJTkddIiAqLworLy91c2FnZToJIk9CSkVDVCBDTUQgW2RldiBTVFJJTkddIgorLy91c2FnZTojZGVmaW5lIHRjX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiT0JKRUNUOiB7cWRpc2N8Y2xhc3N8ZmlsdGVyfVxuIgorLy91c2FnZToJIkNNRDoge2FkZHxkZWx8Y2hhbmdlfHJlcGxhY2V8c2hvd31cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJxZGlzYyBbIGhhbmRsZSBRSEFORExFIF0gWyByb290IHwiSUZfRkVBVFVSRV9UQ19JTkdSRVNTKCIgaW5ncmVzcyB8IikiIHBhcmVudCBDTEFTU0lEIF1cbiIKKy8qIC8vdXNhZ2U6ICJbIGVzdGltYXRvciBJTlRFUlZBTCBUSU1FX0NPTlNUQU5UIF1cbiIgKi8KKy8vdXNhZ2U6CSIJWyBbIFFESVNDX0tJTkQgXSBbIGhlbHAgfCBPUFRJT05TIF0gXVxuIgorLy91c2FnZToJIglRRElTQ19LSU5EIDo9IHsgW3B8Yl1maWZvIHwgdGJmIHwgcHJpbyB8IGNicSB8IHJlZCB8IGV0Yy4gfVxuIgorLy91c2FnZToJInFkaXNjIHNob3cgWyBkZXYgU1RSSU5HIF0iSUZfRkVBVFVSRV9UQ19JTkdSRVNTKCIgW2luZ3Jlc3NdIikiXG4iCisvL3VzYWdlOgkiY2xhc3MgWyBjbGFzc2lkIENMQVNTSUQgXSBbIHJvb3QgfCBwYXJlbnQgQ0xBU1NJRCBdXG4iCisvL3VzYWdlOgkiCVsgWyBRRElTQ19LSU5EIF0gWyBoZWxwIHwgT1BUSU9OUyBdIF1cbiIKKy8vdXNhZ2U6CSJjbGFzcyBzaG93IFsgZGV2IFNUUklORyBdIFsgcm9vdCB8IHBhcmVudCBDTEFTU0lEIF1cbiIKKy8vdXNhZ2U6CSJmaWx0ZXIgWyBwcmVmIFBSSU8gXSBbIHByb3RvY29sIFBST1RPIF1cbiIKKy8qIC8vdXNhZ2U6ICJcdFsgZXN0aW1hdG9yIElOVEVSVkFMIFRJTUVfQ09OU1RBTlQgXVxuIiAqLworLy91c2FnZToJIglbIHJvb3QgfCBjbGFzc2lkIENMQVNTSUQgXSBbIGhhbmRsZSBGSUxURVJJRCBdXG4iCisvL3VzYWdlOgkiCVsgWyBGSUxURVJfVFlQRSBdIFsgaGVscCB8IE9QVElPTlMgXSBdXG4iCisvL3VzYWdlOgkiZmlsdGVyIHNob3cgWyBkZXYgU1RSSU5HIF0gWyByb290IHwgcGFyZW50IENMQVNTSUQgXSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpbmNsdWRlICJsaWJpcHJvdXRlL3V0aWxzLmgiCisjaW5jbHVkZSAibGliaXByb3V0ZS9pcF9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL3J0X25hbWVzLmgiCisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+IC8qIGZvciB0aGUgVENfSF8qIG1hY3JvcyAqLworCisjZGVmaW5lIHBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIG1heCwgcnRhKSBcCisJKHBhcnNlX3J0YXR0cigodGIpLCAobWF4KSwgUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSkpCisKKy8qIG51bGxpZmllcyB0YiBvbiBlcnJvciAqLworI2RlZmluZSBfX3BhcnNlX3J0YXR0cl9uZXN0ZWRfY29tcGF0KHRiLCBtYXgsIHJ0YSwgbGVuKSBcCisJKHtpZiAoKFJUQV9QQVlMT0FEKHJ0YSkgPj0gbGVuKSAmJiBcCisJCSAoUlRBX1BBWUxPQUQocnRhKSA+PSBSVEFfQUxJR04obGVuKSArIHNpemVvZihzdHJ1Y3QgcnRhdHRyKSkpIHsgXAorCQkJcnRhID0gUlRBX0RBVEEocnRhKSArIFJUQV9BTElHTihsZW4pOyBcCisJCQlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBtYXgsIHJ0YSk7IFwKKwkgIH0gZWxzZSBcCisJCQltZW1zZXQodGIsIDAsIHNpemVvZihzdHJ1Y3QgcnRhdHRyICopICogKG1heCArIDEpKTsgXAorCX0pCisKKyNkZWZpbmUgcGFyc2VfcnRhdHRyX25lc3RlZF9jb21wYXQodGIsIG1heCwgcnRhLCBkYXRhLCBsZW4pIFwKKwkoe2RhdGEgPSBSVEFfUEFZTE9BRChydGEpID49IGxlbiA/IFJUQV9EQVRBKHJ0YSkgOiBOVUxMOyBcCisJX19wYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgbWF4LCBydGEsIGxlbik7IH0pCisKKyNkZWZpbmUgc2hvd19kZXRhaWxzICgwKSAvKiBub3QgaW1wbGVtZW50ZWQuIERvZXMgYW55b25lIG5lZWQgaXQ/ICovCisjZGVmaW5lIHVzZV9pZWMgKDApIC8qIG5vdCBjdXJyZW50bHkgZG9jdW1lbnRlZCBpbiB0aGUgdXBzdHJlYW0gbWFucGFnZSAqLworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgZmlsdGVyX2lmaW5kZXg7CisJdWludDMyX3QgZmlsdGVyX3FkaXNjOworCXVpbnQzMl90IGZpbHRlcl9wYXJlbnQ7CisJdWludDMyX3QgZmlsdGVyX3ByaW87CisJdWludDMyX3QgZmlsdGVyX3Byb3RvOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK3N0cnVjdCBCVUdfR190b29fYmlnIHsKKyAgICAgICAgY2hhciBCVUdfR190b29fYmlnW3NpemVvZihHKSA8PSBDT01NT05fQlVGU0laRSA/IDEgOiAtMV07Cit9OworI2RlZmluZSBmaWx0ZXJfaWZpbmRleCAoRy5maWx0ZXJfaWZpbmRleCkKKyNkZWZpbmUgZmlsdGVyX3FkaXNjIChHLmZpbHRlcl9xZGlzYykKKyNkZWZpbmUgZmlsdGVyX3BhcmVudCAoRy5maWx0ZXJfcGFyZW50KQorI2RlZmluZSBmaWx0ZXJfcHJpbyAoRy5maWx0ZXJfcHJpbykKKyNkZWZpbmUgZmlsdGVyX3Byb3RvIChHLmZpbHRlcl9wcm90bykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisvKiBBbGxvY2F0ZXMgYSBidWZmZXIgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIGNsYXNzIGlkLgorICogVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIG1lbW9yeS4gICovCitzdGF0aWMgY2hhciogcHJpbnRfdGNfY2xhc3NpZCh1aW50MzJfdCBjaWQpCit7CisjaWYgMCAvKiBJTVBPU1NJQkxFICovCisJaWYgKGNpZCA9PSBUQ19IX1JPT1QpCisJCXJldHVybiB4YXNwcmludGYoInJvb3QiKTsKKwllbHNlCisjZW5kaWYKKwlpZiAoY2lkID09IFRDX0hfVU5TUEVDKQorCQlyZXR1cm4geGFzcHJpbnRmKCJub25lIik7CisJZWxzZSBpZiAoVENfSF9NQUooY2lkKSA9PSAwKQorCQlyZXR1cm4geGFzcHJpbnRmKCI6JXgiLCBUQ19IX01JTihjaWQpKTsKKwllbHNlIGlmIChUQ19IX01JTihjaWQpID09IDApCisJCXJldHVybiB4YXNwcmludGYoIiV4OiIsIFRDX0hfTUFKKGNpZCk+PjE2KTsKKwllbHNlCisJCXJldHVybiB4YXNwcmludGYoIiV4OiV4IiwgVENfSF9NQUooY2lkKT4+MTYsIFRDX0hfTUlOKGNpZCkpOworfQorCisvKiBHZXQgYSBxZGlzYyBoYW5kbGUuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAhMCBvdGhlcndpc2UuICAqLworc3RhdGljIGludCBnZXRfcWRpc2NfaGFuZGxlKHVpbnQzMl90ICpoLCBjb25zdCBjaGFyICpzdHIpIHsKKwl1aW50MzJfdCBtYWo7CisJY2hhciAqcDsKKworCW1haiA9IFRDX0hfVU5TUEVDOworCWlmICghc3RyY21wKHN0ciwgIm5vbmUiKSkKKwkJZ290byBvazsKKwltYWogPSBzdHJ0b3VsKHN0ciwgJnAsIDE2KTsKKwlpZiAocCA9PSBzdHIpCisJCXJldHVybiAxOworCW1haiA8PD0gMTY7CisJaWYgKCpwICE9ICc6JyAmJiAqcCAhPSAnXDAnKQorCQlyZXR1cm4gMTsKKyBvazoKKwkqaCA9IG1hajsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IGNsYXNzIElELiAgUmV0dXJuIDAgb24gc3VjY2VzcywgITAgb3RoZXJ3aXNlLiAgKi8KK3N0YXRpYyBpbnQgZ2V0X3RjX2NsYXNzaWQodWludDMyX3QgKmgsIGNvbnN0IGNoYXIgKnN0cikgeworCXVpbnQzMl90IG1haiwgbWluOworCWNoYXIgKnA7CisKKwltYWogPSBUQ19IX1JPT1Q7CisJaWYgKCFzdHJjbXAoc3RyLCAicm9vdCIpKQorCQlnb3RvIG9rOworCW1haiA9IFRDX0hfVU5TUEVDOworCWlmICghc3RyY21wKHN0ciwgIm5vbmUiKSkKKwkJZ290byBvazsKKwltYWogPSBzdHJ0b3VsKHN0ciwgJnAsIDE2KTsKKwlpZiAocCA9PSBzdHIpIHsKKwkJaWYgKCpwICE9ICc6JykKKwkJCXJldHVybiAxOworCQltYWogPSAwOworCX0KKwlpZiAoKnAgPT0gJzonKSB7CisJCWlmIChtYWogPj0gKDE8PDE2KSkKKwkJCXJldHVybiAxOworCQltYWogPDw9IDE2OworCQlzdHIgPSBwICsgMTsKKwkJbWluID0gc3RydG91bChzdHIsICZwLCAxNik7CisvL0ZJWE1FOiBjaGVjayBmb3IgIiIgdG9vPworCQlpZiAoKnAgIT0gJ1wwJyB8fCBtaW4gPj0gKDE8PDE2KSkKKwkJCXJldHVybiAxOworCQltYWogfD0gbWluOworCX0gZWxzZSBpZiAoKnAgIT0gMCkKKwkJcmV0dXJuIDE7Cisgb2s6CisJKmggPSBtYWo7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JhdGUoY2hhciAqYnVmLCBpbnQgbGVuLCB1aW50MzJfdCByYXRlKQoreworCWRvdWJsZSB0bXAgPSAoZG91YmxlKXJhdGUqODsKKworCWlmICh1c2VfaWVjKSB7CisJCWlmICh0bXAgPj0gMTAwMC4wKjEwMjQuMCoxMDI0LjApCisJCQlzbnByaW50ZihidWYsIGxlbiwgIiUuMGZNaWJpdCIsIHRtcC8xMDI0LjAqMTAyNC4wKTsKKwkJZWxzZSBpZiAodG1wID49IDEwMDAuMCoxMDI0KQorCQkJc25wcmludGYoYnVmLCBsZW4sICIlLjBmS2liaXQiLCB0bXAvMTAyNCk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZmJpdCIsIHRtcCk7CisJfSBlbHNlIHsKKwkJaWYgKHRtcCA+PSAxMDAwLjAqMTAwMDAwMC4wKQorCQkJc25wcmludGYoYnVmLCBsZW4sICIlLjBmTWJpdCIsIHRtcC8xMDAwMDAwLjApOworCQllbHNlIGlmICh0bXAgPj0gMTAwMC4wICogMTAwMC4wKQorCQkJc25wcmludGYoYnVmLCBsZW4sICIlLjBmS2JpdCIsIHRtcC8xMDAwLjApOworCQllbHNlCisJCQlzbnByaW50ZihidWYsIGxlbiwgIiUuMGZiaXQiLCAgdG1wKTsKKwl9Cit9CisKKy8qIFRoaXMgaXMgInBmaWZvX2Zhc3QiLiAgKi8KK3N0YXRpYyBpbnQgcHJpb19wYXJzZV9vcHQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHByaW9fcHJpbnRfb3B0KHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGNfcHJpb19xb3B0ICpxb3B0OworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QUklPX01BWCsxXTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcGFyc2VfcnRhdHRyX25lc3RlZF9jb21wYXQodGIsIFRDQV9QUklPX01BWCwgb3B0LCBxb3B0LCBzaXplb2YoKnFvcHQpKTsKKwlpZiAodGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcHJpbnRmKCJiYW5kcyAldSBwcmlvbWFwICIsIHFvcHQtPmJhbmRzKTsKKwlmb3IgKGk9MDsgaTw9VENfUFJJT19NQVg7IGkrKykKKwkJcHJpbnRmKCIgJWQiLCBxb3B0LT5wcmlvbWFwW2ldKTsKKworCWlmICh0YltUQ0FfUFJJT19NUV0pCisJCXByaW50ZigiIG11bHRpcXVldWU6IG8lcyAiLAorCQkgICAgKih1bnNpZ25lZCBjaGFyICopUlRBX0RBVEEodGJbVENBX1BSSU9fTVFdKSA/ICJuIiA6ICJmZiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENsYXNzIEJhc2VkIFF1ZXVlICovCitzdGF0aWMgaW50IGNicV9wYXJzZV9vcHQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGNicV9wcmludF9vcHQoc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9DQlFfTUFYKzFdOworCXN0cnVjdCB0Y19yYXRlc3BlYyAqciA9IE5VTEw7CisJc3RydWN0IHRjX2NicV9sc3NvcHQgKmxzcyA9IE5VTEw7CisJc3RydWN0IHRjX2NicV93cnJvcHQgKndyciA9IE5VTEw7CisJc3RydWN0IHRjX2NicV9mb3B0ICpmb3B0ID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX292bCAqb3ZsID0gTlVMTDsKKwljb25zdCBjaGFyICpjb25zdCBlcnJvciA9ICJDQlE6IHRvbyBzaG9ydCAlcyBvcHQiOworCWNoYXIgYnVmWzY0XTsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJZ290byBkb25lOworCXBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIFRDQV9DQlFfTUFYLCBvcHQpOworCisJaWYgKHRiW1RDQV9DQlFfUkFURV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfUkFURV0pIDwgc2l6ZW9mKCpyKSkKKwkJCWJiX2Vycm9yX21zZyhlcnJvciwgInJhdGUiKTsKKwkJZWxzZQorCQkJciA9IFJUQV9EQVRBKHRiW1RDQV9DQlFfUkFURV0pOworCX0KKwlpZiAodGJbVENBX0NCUV9MU1NPUFRdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX0xTU09QVF0pIDwgc2l6ZW9mKCpsc3MpKQorCQkJYmJfZXJyb3JfbXNnKGVycm9yLCAibHNzIik7CisJCWVsc2UKKwkJCWxzcyA9IFJUQV9EQVRBKHRiW1RDQV9DQlFfTFNTT1BUXSk7CisJfQorCWlmICh0YltUQ0FfQ0JRX1dSUk9QVF0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfV1JST1BUXSkgPCBzaXplb2YoKndycikpCisJCQliYl9lcnJvcl9tc2coZXJyb3IsICJ3cnIiKTsKKwkJZWxzZQorCQkJd3JyID0gUlRBX0RBVEEodGJbVENBX0NCUV9XUlJPUFRdKTsKKwl9CisJaWYgKHRiW1RDQV9DQlFfRk9QVF0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfRk9QVF0pIDwgc2l6ZW9mKCpmb3B0KSkKKwkJCWJiX2Vycm9yX21zZyhlcnJvciwgImZvcHQiKTsKKwkJZWxzZQorCQkJZm9wdCA9IFJUQV9EQVRBKHRiW1RDQV9DQlFfRk9QVF0pOworCX0KKwlpZiAodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ldKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX09WTF9TVFJBVEVHWV0pIDwgc2l6ZW9mKCpvdmwpKQorCQkJYmJfZXJyb3JfbXNnKCJDQlE6IHRvbyBzaG9ydCBvdmVybGltaXQgc3RyYXRlZ3kgJXUvJXUiLAorCQkJCSh1bnNpZ25lZCkgUlRBX1BBWUxPQUQodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ldKSwKKwkJCQkodW5zaWduZWQpIHNpemVvZigqb3ZsKSk7CisJCWVsc2UKKwkJCW92bCA9IFJUQV9EQVRBKHRiW1RDQV9DQlFfT1ZMX1NUUkFURUdZXSk7CisJfQorCisJaWYgKHIpIHsKKwkJcHJpbnRfcmF0ZShidWYsIHNpemVvZihidWYpLCByLT5yYXRlKTsKKwkJcHJpbnRmKCJyYXRlICVzICIsIGJ1Zik7CisJCWlmIChzaG93X2RldGFpbHMpIHsKKwkJCXByaW50ZigiY2VsbCAldWIgIiwgMTw8ci0+Y2VsbF9sb2cpOworCQkJaWYgKHItPm1wdSkKKwkJCQlwcmludGYoIm1wdSAldWIgIiwgci0+bXB1KTsKKwkJCWlmIChyLT5vdmVyaGVhZCkKKwkJCQlwcmludGYoIm92ZXJoZWFkICV1YiAiLCByLT5vdmVyaGVhZCk7CisJCX0KKwl9CisJaWYgKGxzcyAmJiBsc3MtPmZsYWdzKSB7CisJCWJvb2wgY29tbWEgPSBmYWxzZTsKKwkJYmJfcHV0Y2hhcignKCcpOworCQlpZiAobHNzLT5mbGFncyZUQ0ZfQ0JRX0xTU19CT1VOREVEKSB7CisJCQlwcmludGYoImJvdW5kZWQiKTsKKwkJCWNvbW1hID0gdHJ1ZTsKKwkJfQorCQlpZiAobHNzLT5mbGFncyZUQ0ZfQ0JRX0xTU19JU09MQVRFRCkgeworCQkJaWYgKGNvbW1hKQorCQkJCWJiX3B1dGNoYXIoJywnKTsKKwkJCXByaW50ZigiaXNvbGF0ZWQiKTsKKwkJfQorCQlwcmludGYoIikgIik7CisJfQorCWlmICh3cnIpIHsKKwkJaWYgKHdyci0+cHJpb3JpdHkgIT0gVENfQ0JRX01BWFBSSU8pCisJCQlwcmludGYoInByaW8gJXUiLCB3cnItPnByaW9yaXR5KTsKKwkJZWxzZQorCQkJcHJpbnRmKCJwcmlvIG5vLXRyYW5zbWl0Iik7CisJCWlmIChzaG93X2RldGFpbHMpIHsKKwkJCXByaW50ZigiLyV1ICIsIHdyci0+Y3ByaW9yaXR5KTsKKwkJCWlmICh3cnItPndlaWdodCAhPSAxKSB7CisJCQkJcHJpbnRfcmF0ZShidWYsIHNpemVvZihidWYpLCB3cnItPndlaWdodCk7CisJCQkJcHJpbnRmKCJ3ZWlnaHQgJXMgIiwgYnVmKTsKKwkJCX0KKwkJCWlmICh3cnItPmFsbG90KQorCQkJCXByaW50ZigiYWxsb3QgJXViICIsIHdyci0+YWxsb3QpOworCQl9CisJfQorIGRvbmU6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfcWRpc2MoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8gVU5VU0VEX1BBUkFNLAorCQkJCQkJc3RydWN0IG5sbXNnaGRyICpoZHIsIHZvaWQgKmFyZyBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHRjbXNnICptc2cgPSBOTE1TR19EQVRBKGhkcik7CisJaW50IGxlbiA9IGhkci0+bmxtc2dfbGVuOworCXN0cnVjdCBydGF0dHIgKiB0YltUQ0FfTUFYKzFdOworCWNoYXIgKm5hbWU7CisKKwlpZiAoaGRyLT5ubG1zZ190eXBlICE9IFJUTV9ORVdRRElTQyAmJiBoZHItPm5sbXNnX3R5cGUgIT0gUlRNX0RFTFFESVNDKSB7CisJCS8qIGJiX2Vycm9yX21zZygibm90IGEgcWRpc2MiKTsgKi8KKwkJcmV0dXJuIDA7IC8qID8/PyBtaW1pYyB1cHN0cmVhbTsgc2hvdWxkIHBlcmhhcHMgcmV0dXJuIC0xICovCisJfQorCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCptc2cpKTsKKwlpZiAobGVuIDwgMCkgeworCQkvKiBiYl9lcnJvcl9tc2coIndyb25nIGxlbiAlZCIsIGxlbik7ICovCisJCXJldHVybiAtMTsKKwl9CisJLyogbm90IHRoZSBkZXNpcmVkIGludGVyZmFjZT8gKi8KKwlpZiAoZmlsdGVyX2lmaW5kZXggJiYgZmlsdGVyX2lmaW5kZXggIT0gbXNnLT50Y21faWZpbmRleCkKKwkJcmV0dXJuIDA7CisJbWVtc2V0ICh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FfTUFYLCBUQ0FfUlRBKG1zZyksIGxlbik7CisJaWYgKHRiW1RDQV9LSU5EXSA9PSBOVUxMKSB7CisJCS8qIGJiX2Vycm9yX21zZygiJXM6IE5VTEwga2luZCIsICJxZGlzYyIpOyAqLworCQlyZXR1cm4gLTE7CisJfQorCWlmIChoZHItPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFFESVNDKQorCQlwcmludGYoImRlbGV0ZWQgIik7CisJbmFtZSA9IChjaGFyKilSVEFfREFUQSh0YltUQ0FfS0lORF0pOworCXByaW50ZigicWRpc2MgJXMgJXg6ICIsIG5hbWUsIG1zZy0+dGNtX2hhbmRsZT4+MTYpOworCWlmIChmaWx0ZXJfaWZpbmRleCA9PSAwKQorCQlwcmludGYoImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKG1zZy0+dGNtX2lmaW5kZXgpKTsKKwlpZiAobXNnLT50Y21fcGFyZW50ID09IFRDX0hfUk9PVCkKKwkJcHJpbnRmKCJyb290ICIpOworCWVsc2UgaWYgKG1zZy0+dGNtX3BhcmVudCkgeworCQljaGFyICpjbGFzc2lkID0gcHJpbnRfdGNfY2xhc3NpZChtc2ctPnRjbV9wYXJlbnQpOworCQlwcmludGYoInBhcmVudCAlcyAiLCBjbGFzc2lkKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShjbGFzc2lkKTsKKwl9CisJaWYgKG1zZy0+dGNtX2luZm8gIT0gMSkKKwkJcHJpbnRmKCJyZWZjbnQgJWQgIiwgbXNnLT50Y21faW5mbyk7CisJaWYgKHRiW1RDQV9PUFRJT05TXSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBfcV9bXSBBTElHTjEgPSAicGZpZm9fZmFzdFwwIiJjYnFcMCI7CisJCWludCBxcXEgPSBpbmRleF9pbl9zdHJpbmdzKF9xXywgbmFtZSk7CisJCWlmIChxcXEgPT0gMCkgeyAvKiBwZmlmb19mYXN0IGFrYSBwcmlvICovCisJCQlwcmlvX3ByaW50X29wdCh0YltUQ0FfT1BUSU9OU10pOworCQl9IGVsc2UgaWYgKHFxcSA9PSAxKSB7IC8qIGNsYXNzIGJhc2VkIHF1ZXVpbmcgKi8KKwkJCWNicV9wcmludF9vcHQodGJbVENBX09QVElPTlNdKTsKKwkJfSBlbHNlCisJCQliYl9lcnJvcl9tc2coInVua25vd24gJXMiLCBuYW1lKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9jbGFzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCQkJCQlzdHJ1Y3Qgbmxtc2doZHIgKmhkciwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgdGNtc2cgKm1zZyA9IE5MTVNHX0RBVEEoaGRyKTsKKwlpbnQgbGVuID0gaGRyLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1RDQV9NQVgrMV07CisJY2hhciAqbmFtZSwgKmNsYXNzaWQ7CisKKwkvKlhYWCBFdmVudHVhbGx5IGZhY3RvciBvdXQgY29tbW9uIGNvZGUgKi8KKworCWlmIChoZHItPm5sbXNnX3R5cGUgIT0gUlRNX05FV1RDTEFTUyAmJiBoZHItPm5sbXNnX3R5cGUgIT0gUlRNX0RFTFRDTEFTUykgeworCQkvKiBiYl9lcnJvcl9tc2coIm5vdCBhIGNsYXNzIik7ICovCisJCXJldHVybiAwOyAvKiA/Pz8gbWltaWMgdXBzdHJlYW07IHNob3VsZCBwZXJoYXBzIHJldHVybiAtMSAqLworCX0KKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqbXNnKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJLyogYmJfZXJyb3JfbXNnKCJ3cm9uZyBsZW4gJWQiLCBsZW4pOyAqLworCQlyZXR1cm4gLTE7CisJfQorCS8qIG5vdCB0aGUgZGVzaXJlZCBpbnRlcmZhY2U/ICovCisJaWYgKGZpbHRlcl9xZGlzYyAmJiBUQ19IX01BSihtc2ctPnRjbV9oYW5kbGVeZmlsdGVyX3FkaXNjKSkKKwkJcmV0dXJuIDA7CisJbWVtc2V0ICh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBUQ0FfTUFYLCBUQ0FfUlRBKG1zZyksIGxlbik7CisJaWYgKHRiW1RDQV9LSU5EXSA9PSBOVUxMKSB7CisJCS8qIGJiX2Vycm9yX21zZygiJXM6IE5VTEwga2luZCIsICJjbGFzcyIpOyAqLworCQlyZXR1cm4gLTE7CisJfQorCWlmIChoZHItPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFRDTEFTUykKKwkJcHJpbnRmKCJkZWxldGVkICIpOworCisJbmFtZSA9IChjaGFyKilSVEFfREFUQSh0YltUQ0FfS0lORF0pOworCWNsYXNzaWQgPSAhbXNnLT50Y21faGFuZGxlID8gTlVMTCA6IHByaW50X3RjX2NsYXNzaWQoCisJCQkJZmlsdGVyX3FkaXNjID8gVENfSF9NSU4obXNnLT50Y21fcGFyZW50KSA6IG1zZy0+dGNtX3BhcmVudCk7CisJcHJpbnRmICgiY2xhc3MgJXMgJXMiLCBuYW1lLCBjbGFzc2lkKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoY2xhc3NpZCk7CisKKwlpZiAoZmlsdGVyX2lmaW5kZXggPT0gMCkKKwkJcHJpbnRmKCJkZXYgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZShtc2ctPnRjbV9pZmluZGV4KSk7CisJaWYgKG1zZy0+dGNtX3BhcmVudCA9PSBUQ19IX1JPT1QpCisJCXByaW50Zigicm9vdCAiKTsKKwllbHNlIGlmIChtc2ctPnRjbV9wYXJlbnQpIHsKKwkJY2xhc3NpZCA9IHByaW50X3RjX2NsYXNzaWQoZmlsdGVyX3FkaXNjID8KKwkJCQkJCQkJICAgVENfSF9NSU4obXNnLT50Y21fcGFyZW50KSA6IG1zZy0+dGNtX3BhcmVudCk7CisJCXByaW50ZigicGFyZW50ICVzICIsIGNsYXNzaWQpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGNsYXNzaWQpOworCX0KKwlpZiAobXNnLT50Y21faW5mbykKKwkJcHJpbnRmKCJsZWFmICV4ICIsIG1zZy0+dGNtX2luZm8gPj4gMTYpOworCS8qIERvIHRoYXQgZ2V0X3FkaXNjX2tpbmQoUlRBX0RBVEEodGJbVENBX0tJTkRdKSkuICAqLworCWlmICh0YltUQ0FfT1BUSU9OU10pIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgX3FfW10gQUxJR04xID0gInBmaWZvX2Zhc3RcMCIiY2JxXDAiOworCQlpbnQgcXFxID0gaW5kZXhfaW5fc3RyaW5ncyhfcV8sIG5hbWUpOworCQlpZiAocXFxID09IDApIHsgLyogcGZpZm9fZmFzdCBha2EgcHJpbyAqLworCQkJLyogbm90aGluZy4gKi8gLypwcmlvX3ByaW50X29wdCh0YltUQ0FfT1BUSU9OU10pOyovCisJCX0gZWxzZSBpZiAocXFxID09IDEpIHsgLyogY2xhc3MgYmFzZWQgcXVldWluZyAqLworCQkJLyogY2JxX3ByaW50X2NvcHQoKSBpcyBpZGVudGljYWwgdG8gY2JxX3ByaW50X29wdCgpLiAqLworCQkJY2JxX3ByaW50X29wdCh0YltUQ0FfT1BUSU9OU10pOworCQl9IGVsc2UKKwkJCWJiX2Vycm9yX21zZygidW5rbm93biAlcyIsIG5hbWUpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfZmlsdGVyKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvIFVOVVNFRF9QQVJBTSwKKwkJCQkJCXN0cnVjdCBubG1zZ2hkciAqaGRyLCB2b2lkICphcmcgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0Y21zZyAqbXNnID0gTkxNU0dfREFUQShoZHIpOworCWludCBsZW4gPSBoZHItPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbVENBX01BWCsxXTsKKwlyZXR1cm4gMDsKK30KKworaW50IHRjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0Y19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgb2JqZWN0c1tdIEFMSUdOMSA9CisJCSJxZGlzY1wwIiJjbGFzc1wwIiJmaWx0ZXJcMCIKKwkJOworCWVudW0geyBPQkpfcWRpc2MgPSAwLCBPQkpfY2xhc3MsIE9CSl9maWx0ZXIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciBjb21tYW5kc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiZGVsZXRlXDAiImNoYW5nZVwwIgorCQkibGlua1wwIiAvKiBvbmx5IHFkaXNjICovCisJCSJyZXBsYWNlXDAiCisJCSJzaG93XDAiImxpc3RcMCIKKwkJOworCXN0YXRpYyBjb25zdCBjaGFyIGFyZ3NbXSBBTElHTjEgPQorCQkiZGV2XDAiIC8qIHFkaXNjLCBjbGFzcywgZmlsdGVyICovCisJCSJyb290XDAiIC8qIGNsYXNzLCBmaWx0ZXIgKi8KKwkJInBhcmVudFwwIiAvKiBjbGFzcywgZmlsdGVyICovCisJCSJxZGlzY1wwIiAvKiBjbGFzcyAqLworCQkiaGFuZGxlXDAiIC8qIGNoYW5nZTogcWRpc2MsIGNsYXNzKGNsYXNzaWQpIGxpc3Q6IGZpbHRlciAqLworCQkiY2xhc3NpZFwwIiAvKiBjaGFuZ2U6IGZvciBjbGFzcyB1c2UgImhhbmRsZSIgKi8KKwkJInByZWZlcmVuY2VcMCIicHJpb3JpdHlcMCIicHJvdG9jb2xcMCIgLyogZmlsdGVyICovCisJCTsKKwllbnVtIHsgQ01EX2FkZCA9IDAsIENNRF9kZWwsIENNRF9jaGFuZ2UsIENNRF9saW5rLCBDTURfcmVwbGFjZSwgQ01EX3Nob3cgfTsKKwllbnVtIHsgQVJHX2RldiA9IDAsIEFSR19yb290LCBBUkdfcGFyZW50LCBBUkdfcWRpc2MsCisJCQlBUkdfaGFuZGxlLCBBUkdfY2xhc3NpZCwgQVJHX3ByZWYsIEFSR19wcmlvLCBBUkdfcHJvdG99OworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHRjbXNnIG1zZzsKKwlpbnQgcmV0LCBvYmosIGNtZCwgYXJnOworCWNoYXIgKmRldiA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCWlmICghKisrYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCXhydG5sX29wZW4oJnJ0aCk7CisJcmV0ID0gRVhJVF9TVUNDRVNTOworCisJb2JqID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhvYmplY3RzLCAqYXJndisrKTsKKworCWlmIChvYmogPCBPQkpfcWRpc2MpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoISphcmd2KQorCQljbWQgPSBDTURfc2hvdzsgLyogbGlzdCBpcyB0aGUgZGVmYXVsdCAqLworCWVsc2UgeworCQljbWQgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGNvbW1hbmRzLCAqYXJndik7CisJCWlmIChjbWQgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJfQorCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJbGxfaW5pdF9tYXAoJnJ0aCk7CisJd2hpbGUgKCphcmd2KSB7CisJCWFyZyA9IGluZGV4X2luX3N1YnN0cmluZ3MoYXJncywgKmFyZ3YpOworCQlpZiAoYXJnID09IEFSR19kZXYpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZGV2KQorCQkJCWR1cGFyZzIoImRldiIsICphcmd2KTsKKwkJCWRldiA9ICphcmd2Kys7CisJCQltc2cudGNtX2lmaW5kZXggPSB4bGxfbmFtZV90b19pbmRleChkZXYpOworCQkJaWYgKGNtZCA+PSBDTURfc2hvdykKKwkJCQlmaWx0ZXJfaWZpbmRleCA9IG1zZy50Y21faWZpbmRleDsKKwkJfSBlbHNlCisJCWlmICgoYXJnID09IEFSR19xZGlzYyAmJiBvYmogPT0gT0JKX2NsYXNzICYmIGNtZCA+PSBDTURfc2hvdykKKwkJIHx8IChhcmcgPT0gQVJHX2hhbmRsZSAmJiBvYmogPT0gT0JKX3FkaXNjICYmIGNtZCA9PSBDTURfY2hhbmdlKQorCQkpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQkvKiBXZSBkb24ndCBjYXJlIGFib3V0IGR1cGFyZzIoInFkaXNjIGhhbmRsZSIsKmFyZ3YpIGZvciBub3cgKi8KKwkJCWlmIChnZXRfcWRpc2NfaGFuZGxlKCZmaWx0ZXJfcWRpc2MsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJxZGlzYyIpOworCQl9IGVsc2UKKwkJaWYgKG9iaiAhPSBPQkpfcWRpc2MKKwkJICYmIChhcmcgPT0gQVJHX3Jvb3QKKwkJICAgIHx8IGFyZyA9PSBBUkdfcGFyZW50CisJCSAgICB8fCAob2JqID09IE9CSl9maWx0ZXIgJiYgYXJnID49IEFSR19wcmVmKQorCQkgICAgKQorCQkpIHsKKwkJCS8qIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKKwkJCWludmFyZygqYXJndiwgImNvbW1hbmQiKTsKKwkJfQorCQlORVhUX0FSRygpOworCQlpZiAoYXJnID09IEFSR19yb290KSB7CisJCQlpZiAobXNnLnRjbV9wYXJlbnQpCisJCQkJZHVwYXJnKCJwYXJlbnQiLCAqYXJndik7CisJCQltc2cudGNtX3BhcmVudCA9IFRDX0hfUk9PVDsKKwkJCWlmIChvYmogPT0gT0JKX2ZpbHRlcikKKwkJCQlmaWx0ZXJfcGFyZW50ID0gVENfSF9ST09UOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfcGFyZW50KSB7CisJCQl1aW50MzJfdCBoYW5kbGU7CisJCQlpZiAobXNnLnRjbV9wYXJlbnQpCisJCQkJZHVwYXJnKCphcmd2LCAicGFyZW50Iik7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInBhcmVudCIpOworCQkJbXNnLnRjbV9wYXJlbnQgPSBoYW5kbGU7CisJCQlpZiAob2JqID09IE9CSl9maWx0ZXIpCisJCQkJZmlsdGVyX3BhcmVudCA9IGhhbmRsZTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX2hhbmRsZSkgeyAvKiBmaWx0ZXI6Omxpc3QgKi8KKwkJCWlmIChtc2cudGNtX2hhbmRsZSkKKwkJCQlkdXBhcmcoKmFyZ3YsICJoYW5kbGUiKTsKKwkJCS8qIHJlamVjdCBMT05HX01JTiB8fCBMT05HX01BWCAqLworCQkJLyogVE9ETzogZm9yIGZ3CisJCQkgICBpZiAoKHNsYXNoID0gc3RyY2hyKGhhbmRsZSwgJy8nKSkgIT0gTlVMTCkKKwkJCQkgICAqc2xhc2ggPSAnXDAnOworCQkJICovCisJCQltc2cudGNtX2hhbmRsZSA9IGdldF91MzIoKmFyZ3YsICJoYW5kbGUiKTsKKwkJCS8qIGlmIChzbGFzaCkge2lmIChnZXRfdTMyKHVpbnQzMl90ICZtYXNrLCBzbGFzaCsxLCBOVUxMKSkgaW52IG1hc2s7IGFkZGF0dHIzMihuLCBNQVhfTVNHLCBUQ0FfRldfTUFTSywgbWFzayk7ICovCisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19jbGFzc2lkICYmIG9iaiA9PSBPQkpfY2xhc3MgJiYgY21kID09IENNRF9jaGFuZ2UpeworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfcHJlZiB8fCBhcmcgPT0gQVJHX3ByaW8pIHsgLyogZmlsdGVyOjpsaXN0ICovCisJCQlpZiAoZmlsdGVyX3ByaW8pCisJCQkJZHVwYXJnKCphcmd2LCAicHJpb3JpdHkiKTsKKwkJCWZpbHRlcl9wcmlvID0gZ2V0X3UzMigqYXJndiwgInByaW9yaXR5Iik7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19wcm90bykgeyAvKiBmaWx0ZXI6Omxpc3QgKi8KKwkJCXVpbnQxNl90IHRtcDsKKwkJCWlmIChmaWx0ZXJfcHJvdG8pCisJCQkJZHVwYXJnKCphcmd2LCAicHJvdG9jb2wiKTsKKwkJCWlmIChsbF9wcm90b19hMm4oJnRtcCwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInByb3RvY29sIik7CisJCQlmaWx0ZXJfcHJvdG8gPSB0bXA7CisJCX0KKwl9CisJaWYgKGNtZCA+PSBDTURfc2hvdykgeyAvKiBzaG93IG9yIGxpc3QgKi8KKwkJaWYgKG9iaiA9PSBPQkpfZmlsdGVyKQorCQkJbXNnLnRjbV9pbmZvID0gVENfSF9NQUtFKGZpbHRlcl9wcmlvPDwxNiwgZmlsdGVyX3Byb3RvKTsKKwkJaWYgKHJ0bmxfZHVtcF9yZXF1ZXN0KCZydGgsIG9iaiA9PSBPQkpfcWRpc2MgPyBSVE1fR0VUUURJU0MgOgorCQkJCQkJb2JqID09IE9CSl9jbGFzcyA/IFJUTV9HRVRUQ0xBU1MgOiBSVE1fR0VUVEZJTFRFUiwKKwkJCQkJCSZtc2csIHNpemVvZihtc2cpKSA8IDApCisJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCisJCXhydG5sX2R1bXBfZmlsdGVyKCZydGgsIG9iaiA9PSBPQkpfcWRpc2MgPyBwcmludF9xZGlzYyA6CisJCQkJCQlvYmogPT0gT0JKX2NsYXNzID8gcHJpbnRfY2xhc3MgOiBwcmludF9maWx0ZXIsCisJCQkJCQlOVUxMKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXJ0bmxfY2xvc2UoJnJ0aCk7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3RjcHVkcC5jIGIvbmV0d29ya2luZy90Y3B1ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGY2YTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy90Y3B1ZHAuYwpAQCAtMCwwICsxLDY0NiBAQAorLyogQmFzZWQgb24gaXBzdmQgdXRpbGl0aWVzIHdyaXR0ZW4gYnkgR2Vycml0IFBhcGUgPHBhcGVAc21hcmRlbi5vcmc+CisgKiB3aGljaCBhcmUgcmVsZWFzZWQgaW50byBwdWJsaWMgZG9tYWluIGJ5IHRoZSBhdXRob3IuCisgKiBIb21lcGFnZTogaHR0cDovL3NtYXJkZW4uc3Vuc2l0ZS5kay9pcHN2ZC8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCYXNlZCBvbiBpcHN2ZC0wLjEyLjEuIFRoaXMgdGNwc3ZkIGFjY2VwdHMgYWxsIG9wdGlvbnMKKyAqIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgb25lIGZyb20gaXBzdmQtMC4xMi4xLCBidXQgbm90IGFsbCBhcmUKKyAqIGZ1bmN0aW9uYWwuIFNlZSBoZWxwIHRleHQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUgZm9yIGRldGFpbHMuCisgKgorICogQ29kZSBpbnNpZGUgIiNpZmRlZiBTU0xTVkQiIGlzIGZvciBzc2xzdmQgYW5kIGlzIGN1cnJlbnRseSB1bnVzZWQuCisgKgorICogQnVzeWJveCB2ZXJzaW9uIGV4cG9ydHMgVENQTE9DQUxBRERSIGluc3RlYWQgb2YKKyAqIFRDUExPQ0FMSVAgKyBUQ1BMT0NBTFBPUlQgcGFpci4gQUREUiBtb3JlIGNsb3NlbHkgbWF0Y2hlcyByZWFsaXR5CisgKiAod2hpY2ggaXMgInN0cnVjdCBzb2NrYWRkcl9YWFgiLiBQb3J0IGlzIG5vdCBhIHNlcGFyYXRlIGVudGl0eSwKKyAqIGl0J3MganVzdCBhIHBhcnQgb2YgKEFGX0lORVRbNl0pIHNvY2thZGRyISkuCisgKgorICogVENQT1JJR0RTVEFERFIgaXMgQnVzeWJveC1zcGVjaWZpYyBhZGRpdGlvbi4KKyAqCisgKiB1ZHAgc2VydmVyIGlzIGhhY2tlZCB1cCBieSByZXVzaW5nIFRDUCBjb2RlLiBJdCBoYXMgdGhlIGZvbGxvd2luZworICogbGltaXRhdGlvbiBpbmhlcmVudCBpbiBVbml4IERHUkFNIHNvY2tldHMgaW1wbGVtZW50YXRpb246CisgKiAtIGxvY2FsIElQIGFkZHJlc3MgaXMgcmV0cmlldmVkICh1c2luZyByZWN2bXNnIHZvb2RvbykgYnV0CisgKiAgIGNoaWxkJ3Mgc29ja2V0IGlzIG5vdCBib3VuZCB0byBpdCAoYmluZCBjYW5ub3QgYmUgY2FsbGVkIG9uCisgKiAgIGFscmVhZHkgYm91bmQgc29ja2V0KS4gVGh1cyBpdCBzdGlsbCBjYW4gZW1pdCBvdXRnb2luZyBwYWNrZXRzCisgKiAgIHdpdGggd3Jvbmcgc291cmNlIElQLi4uCisgKiAtIGRvbid0IGtub3cgaG93IHRvIHJldHJpZXZlIE9SSUdEU1QgZm9yIHVkcC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdGNwc3ZkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWhFdl0gWy1jIE5dIFstQyBOWzpNU0ddXSBbLWIgTl0gWy11IFVTRVJdIFstbCBOQU1FXSBJUCBQT1JUIFBST0ciCisvKiB3aXRoIG5vdC1pbXBsZW1lbnRlZCBvcHRpb25zOiAqLworLyogLy91c2FnZTogICAgIlstaHBFdnZdIFstYyBOXSBbLUMgTls6TVNHXV0gWy1iIE5dIFstdSBVU0VSXSBbLWwgTkFNRV0gWy1pIERJUnwteCBDREJdIFstdCBTRUNdIElQIFBPUlQgUFJPRyIgKi8KKy8vdXNhZ2U6I2RlZmluZSB0Y3BzdmRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgVENQIHNvY2tldCwgYmluZCB0byBJUDpQT1JUIGFuZCBsaXN0ZW5cbiIKKy8vdXNhZ2U6ICAgICAgICJmb3IgaW5jb21pbmcgY29ubmVjdGlvbi4gUnVuIFBST0cgZm9yIGVhY2ggY29ubmVjdGlvbi5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JSVAJCUlQIHRvIGxpc3RlbiBvbiwgMCA9IGFsbCIKKy8vdXNhZ2U6ICAgICAiXG4JUE9SVAkJUG9ydCB0byBsaXN0ZW4gb24iCisvL3VzYWdlOiAgICAgIlxuCVBST0cgQVJHUwlQcm9ncmFtIHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTkFNRQkJTG9jYWwgaG9zdG5hbWUgKGVsc2UgbG9va3MgdXAgbG9jYWwgaG9zdG5hbWUgaW4gRE5TKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlDaGFuZ2UgdG8gdXNlci9ncm91cCBhZnRlciBiaW5kIgorLy91c2FnZTogICAgICJcbgktYyBOCQlIYW5kbGUgdXAgdG8gTiBjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgTgkJQWxsb3cgYSBiYWNrbG9nIG9mIGFwcHJveGltYXRlbHkgTiBUQ1AgU1lOcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgTls6TVNHXQlBbGxvdyBvbmx5IHVwIHRvIE4gY29ubmVjdGlvbnMgZnJvbSB0aGUgc2FtZSBJUCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlOZXcgY29ubmVjdGlvbnMgZnJvbSB0aGlzIElQIGFkZHJlc3MgYXJlIGNsb3NlZCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlpbW1lZGlhdGVseS4gTVNHIGlzIHdyaXR0ZW4gdG8gdGhlIHBlZXIgYmVmb3JlIGNsb3NlIgorLy91c2FnZTogICAgICJcbgktaAkJTG9vayB1cCBwZWVyJ3MgaG9zdG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1FCQlEb24ndCBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdWRwc3ZkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWhFdl0gWy1jIE5dIFstdSBVU0VSXSBbLWwgTkFNRV0gSVAgUE9SVCBQUk9HIgorLy91c2FnZTojZGVmaW5lIHVkcHN2ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBVRFAgc29ja2V0LCBiaW5kIHRvIElQOlBPUlQgYW5kIHdhaXRcbiIKKy8vdXNhZ2U6ICAgICAgICJmb3IgaW5jb21pbmcgcGFja2V0cy4gUnVuIFBST0cgZm9yIGVhY2ggcGFja2V0LFxuIgorLy91c2FnZTogICAgICAgInJlZGlyZWN0aW5nIGFsbCBmdXJ0aGVyIHBhY2tldHMgd2l0aCBzYW1lIHBlZXIgaXA6cG9ydCB0byBpdC5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JSVAJCUlQIHRvIGxpc3RlbiBvbiwgMCA9IGFsbCIKKy8vdXNhZ2U6ICAgICAiXG4JUE9SVAkJUG9ydCB0byBsaXN0ZW4gb24iCisvL3VzYWdlOiAgICAgIlxuCVBST0cgQVJHUwlQcm9ncmFtIHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTkFNRQkJTG9jYWwgaG9zdG5hbWUgKGVsc2UgbG9va3MgdXAgbG9jYWwgaG9zdG5hbWUgaW4gRE5TKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlDaGFuZ2UgdG8gdXNlci9ncm91cCBhZnRlciBiaW5kIgorLy91c2FnZTogICAgICJcbgktYyBOCQlIYW5kbGUgdXAgdG8gTiBjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJCUxvb2sgdXAgcGVlcidzIGhvc3RuYW1lIgorLy91c2FnZTogICAgICJcbgktRQkJRG9uJ3Qgc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBXYW50cyA8bGltaXRzLmg+IGV0YywgdGh1cyBpbmNsdWRlZCBhZnRlciBsaWJiYi5oOiAqLworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+IC8qIGZvciBfX2JlMzIgZXRjICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNlbmRpZgorCisvLyBUT0RPOiBtb3ZlIGludG8gdGhpcyBmaWxlOgorI2luY2x1ZGUgInRjcHVkcF9wZXJob3N0LmgiCisKKyNpZmRlZiBTU0xTVkQKKyNpbmNsdWRlICJtYXRyaXhTc2wuaCIKKyNpbmNsdWRlICJzc2xfaW8uaCIKKyNlbmRpZgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgdmVyYm9zZTsKKwl1bnNpZ25lZCBtYXhfcGVyX2hvc3Q7CisJdW5zaWduZWQgY3VyX3Blcl9ob3N0OworCXVuc2lnbmVkIGNudW07CisJdW5zaWduZWQgY21heDsKKwljaGFyICoqZW52X2N1cjsKKwljaGFyICplbnZfdmFyWzFdOyAvKiBhY3R1YWxseSBiaWdnZXIgKi8KK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIHZlcmJvc2UgICAgICAoRy52ZXJib3NlICAgICApCisjZGVmaW5lIG1heF9wZXJfaG9zdCAoRy5tYXhfcGVyX2hvc3QpCisjZGVmaW5lIGN1cl9wZXJfaG9zdCAoRy5jdXJfcGVyX2hvc3QpCisjZGVmaW5lIGNudW0gICAgICAgICAoRy5jbnVtICAgICAgICApCisjZGVmaW5lIGNtYXggICAgICAgICAoRy5jbWF4ICAgICAgICApCisjZGVmaW5lIGVudl9jdXIgICAgICAoRy5lbnZfY3VyICAgICApCisjZGVmaW5lIGVudl92YXIgICAgICAoRy5lbnZfdmFyICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWNtYXggPSAzMDsgXAorCWVudl9jdXIgPSAmZW52X3ZhclswXTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgYWJvdXQgbGVha2luZyBtZW1vcnkgaW4gcmVwZWF0ZWQgc2V0ZW52J3MgKi8KK3N0YXRpYyB2b2lkIHhzZXRlbnZfcGxhaW4oY29uc3QgY2hhciAqbiwgY29uc3QgY2hhciAqdikKK3sKKwljaGFyICp2YXIgPSB4YXNwcmludGYoIiVzPSVzIiwgbiwgdik7CisJKmVudl9jdXIrKyA9IHZhcjsKKwlwdXRlbnYodmFyKTsKK30KKworc3RhdGljIHZvaWQgeHNldGVudl9wcm90byhjb25zdCBjaGFyICpwcm90bywgY29uc3QgY2hhciAqbiwgY29uc3QgY2hhciAqdikKK3sKKwljaGFyICp2YXIgPSB4YXNwcmludGYoIiVzJXM9JXMiLCBwcm90bywgbiwgdik7CisJKmVudl9jdXIrKyA9IHZhcjsKKwlwdXRlbnYodmFyKTsKK30KKworc3RhdGljIHZvaWQgdW5kb194c2V0ZW52KHZvaWQpCit7CisJY2hhciAqKnBwID0gZW52X2N1ciA9ICZlbnZfdmFyWzBdOworCXdoaWxlICgqcHApIHsKKwkJY2hhciAqdmFyID0gKnBwOworCQliYl91bnNldGVudl9hbmRfZnJlZSh2YXIpOworCQkqcHArKyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaWdfdGVybV9oYW5kbGVyKGludCBzaWcpCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygiZ290IHNpZ25hbCAldSwgZXhpdCIsIHNpZyk7CisJa2lsbF9teXNlbGZfd2l0aF9zaWcoc2lnKTsKK30KKworLyogTGl0dGxlIGJsb2F0ZWQsIGJ1dCB0cmllcyB0byBnaXZlIGFjY3VyYXRlIGluZm8gaG93IGNoaWxkIGV4aXRlZC4KKyAqIE1ha2VzIGVhc2llciB0byBzcG90IHNlZ2ZhdWx0aW5nIGNoaWxkcmVuIGV0Yy4uLiAqLworc3RhdGljIHZvaWQgcHJpbnRfd2FpdHN0YXQodW5zaWduZWQgcGlkLCBpbnQgd3N0YXQpCit7CisJdW5zaWduZWQgZSA9IDA7CisJY29uc3QgY2hhciAqY2F1c2UgPSAiP2V4aXQiOworCisJaWYgKFdJRkVYSVRFRCh3c3RhdCkpIHsKKwkJY2F1c2UrKzsKKwkJZSA9IFdFWElUU1RBVFVTKHdzdGF0KTsKKwl9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHdzdGF0KSkgeworCQljYXVzZSA9ICJzaWduYWwiOworCQllID0gV1RFUk1TSUcod3N0YXQpOworCX0KKwliYl9lcnJvcl9tc2coImVuZCAlZCAlcyAlZCIsIHBpZCwgY2F1c2UsIGUpOworfQorCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIGluIG1haW4hICovCitlbnVtIHsKKwlPUFRfYyA9ICgxIDw8IDApLAorCU9QVF9DID0gKDEgPDwgMSksCisJT1BUX2kgPSAoMSA8PCAyKSwKKwlPUFRfeCA9ICgxIDw8IDMpLAorCU9QVF91ID0gKDEgPDwgNCksCisJT1BUX2wgPSAoMSA8PCA1KSwKKwlPUFRfRSA9ICgxIDw8IDYpLAorCU9QVF9iID0gKDEgPDwgNyksCisJT1BUX2ggPSAoMSA8PCA4KSwKKwlPUFRfcCA9ICgxIDw8IDkpLAorCU9QVF90ID0gKDEgPDwgMTApLAorCU9QVF92ID0gKDEgPDwgMTEpLAorCU9QVF9WID0gKDEgPDwgMTIpLAorCU9QVF9VID0gKDEgPDwgMTMpLCAvKiBmcm9tIGhlcmU6IHNzbHN2ZCBvbmx5ICovCisJT1BUX3NsYXNoID0gKDEgPDwgMTQpLAorCU9QVF9aID0gKDEgPDwgMTUpLAorCU9QVF9LID0gKDEgPDwgMTYpLAorfTsKKworc3RhdGljIHZvaWQgY29ubmVjdGlvbl9zdGF0dXModm9pZCkKK3sKKwkvKiAib25seSAxIGNsaWVudCBtYXgiIGRlc24ndCBuZWVkIHRoaXMgKi8KKwlpZiAoY21heCA+IDEpCisJCWJiX2Vycm9yX21zZygic3RhdHVzICV1LyV1IiwgY251bSwgY21heCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19jaGlsZF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCWludCB3c3RhdDsKKwlwaWRfdCBwaWQ7CisKKwl3aGlsZSAoKHBpZCA9IHdhaXRfYW55X25vaGFuZygmd3N0YXQpKSA+IDApIHsKKwkJaWYgKG1heF9wZXJfaG9zdCkKKwkJCWlwc3ZkX3Blcmhvc3RfcmVtb3ZlKHBpZCk7CisJCWlmIChjbnVtKQorCQkJY251bS0tOworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50X3dhaXRzdGF0KHBpZCwgd3N0YXQpOworCX0KKwlpZiAodmVyYm9zZSkKKwkJY29ubmVjdGlvbl9zdGF0dXMoKTsKK30KKworaW50IHRjcHVkcHN2ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGNwdWRwc3ZkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpzdHJfQywgKnN0cl90OworCWNoYXIgKnVzZXI7CisJc3RydWN0IGhjYyAqaGNjcDsKKwljb25zdCBjaGFyICppbnN0cnVjdHM7CisJY2hhciAqbXNnX3Blcl9ob3N0ID0gTlVMTDsKKwl1bnNpZ25lZCBsZW5fcGVyX2hvc3QgPSBsZW5fcGVyX2hvc3Q7IC8qIGdjYyAqLworI2lmbmRlZiBTU0xTVkQKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWdpZDsKKyNlbmRpZgorCWJvb2wgdGNwOworCXVpbnQxNl90IGxvY2FsX3BvcnQ7CisJY2hhciAqcHJlc2V0X2xvY2FsX2hvc3RuYW1lID0gTlVMTDsKKwljaGFyICpyZW1vdGVfaG9zdG5hbWUgPSByZW1vdGVfaG9zdG5hbWU7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKnJlbW90ZV9hZGRyID0gcmVtb3RlX2FkZHI7IC8qIGZvciBjb21waWxlciAqLworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlsZW5fYW5kX3NvY2thZGRyIGxvY2FsLCByZW1vdGU7CisJc29ja2xlbl90IHNhX2xlbjsKKwlpbnQgcGlkOworCWludCBzb2NrOworCWludCBjb25uOworCXVuc2lnbmVkIGJhY2tsb2cgPSAyMDsKKwl1bnNpZ25lZCBvcHRzOworCisJSU5JVF9HKCk7CisKKwl0Y3AgPSAoYXBwbGV0X25hbWVbMF0gPT0gJ3QnKTsKKworCS8qIDMrIGFyZ3MsIC1pIGF0IG1vc3Qgb25jZSwgLXAgaW1wbGllcyAtaCwgLXYgaXMgY291bnRlciwgLWIgTiwgLWMgTiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0zOmktLWk6cGg6dnY6Yis6YysiOworI2lmZGVmIFNTTFNWRAorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiK2M6QzppOng6dTpsOkViOmhwdDp2VTovOlo6SzoiLAorCQkmY21heCwgJnN0cl9DLCAmaW5zdHJ1Y3RzLCAmaW5zdHJ1Y3RzLCAmdXNlciwgJnByZXNldF9sb2NhbF9ob3N0bmFtZSwKKwkJJmJhY2tsb2csICZzdHJfdCwgJnNzbHVzZXIsICZyb290LCAmY2VydCwgJmtleSwgJnZlcmJvc2UKKwkpOworI2Vsc2UKKwkvKiAiKyI6IHN0b3Agb24gZmlyc3Qgbm9uLW9wdGlvbiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiK2M6QzppOng6dTpsOkViOmhwdDp2IiwKKwkJJmNtYXgsICZzdHJfQywgJmluc3RydWN0cywgJmluc3RydWN0cywgJnVzZXIsICZwcmVzZXRfbG9jYWxfaG9zdG5hbWUsCisJCSZiYWNrbG9nLCAmc3RyX3QsICZ2ZXJib3NlCisJKTsKKyNlbmRpZgorCWlmIChvcHRzICYgT1BUX0MpIHsgLyogLUMgbls6bWVzc2FnZV0gKi8KKwkJbWF4X3Blcl9ob3N0ID0gYmJfc3RydG91KHN0cl9DLCAmc3RyX0MsIDEwKTsKKwkJaWYgKHN0cl9DWzBdKSB7CisJCQlpZiAoc3RyX0NbMF0gIT0gJzonKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCW1zZ19wZXJfaG9zdCA9IHN0cl9DICsgMTsKKwkJCWxlbl9wZXJfaG9zdCA9IHN0cmxlbihtc2dfcGVyX2hvc3QpOworCQl9CisJfQorCWlmIChtYXhfcGVyX2hvc3QgPiBjbWF4KQorCQltYXhfcGVyX2hvc3QgPSBjbWF4OworCWlmIChvcHRzICYgT1BUX3UpIHsKKwkJeGdldF91aWRnaWQoJnVnaWQsIHVzZXIpOworCX0KKyNpZmRlZiBTU0xTVkQKKwlpZiAob3B0cyAmIE9QVF9VKSBzc2x1c2VyID0gb3B0YXJnOworCWlmIChvcHRzICYgT1BUX3NsYXNoKSByb290ID0gb3B0YXJnOworCWlmIChvcHRzICYgT1BUX1opIGNlcnQgPSBvcHRhcmc7CisJaWYgKG9wdHMgJiBPUFRfSykga2V5ID0gb3B0YXJnOworI2VuZGlmCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdWzBdIHx8IExPTkVfQ0hBUihhcmd2WzBdLCAnMCcpKQorCQlhcmd2WzBdID0gKGNoYXIqKSIwLjAuMC4wIjsKKworCS8qIFBlci1JUCBmbG9vZCBwcm90ZWN0aW9uIGlzIG5vdCB0aG91Z2h0LW91dCBmb3IgVURQICovCisJaWYgKCF0Y3ApCisJCW1heF9wZXJfaG9zdCA9IDA7CisKKwliYl9zYW5pdGl6ZV9zdGRpbygpOyAvKiBmZCMgMCwxLDIgbXVzdCBiZSBvcGVuZWQgKi8KKworI2lmZGVmIFNTTFNWRAorCXNzbHNlciA9IHVzZXI7CisJY2xpZW50ID0gMDsKKwlpZiAoKGdldHVpZCgpID09IDApICYmICEob3B0cyAmIE9QVF91KSkgeworCQl4ZnVuY19leGl0Y29kZSA9IDEwMDsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCX0KKwlpZiAob3B0cyAmIE9QVF91KQorCQlpZiAoIXVpZGdpZF9nZXQoJnNzbHVnaWQsIHNzbHVzZXIsIDEpKSB7CisJCQlpZiAoZXJybm8pIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCB1c2VyL2dyb3VwOiAlcyIsIHNzbHVzZXIpOworCQkJfQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gdXNlci9ncm91cCAlcyIsIHNzbHVzZXIpOworCQl9CisJaWYgKCFjZXJ0KSBjZXJ0ID0gIi4vY2VydC5wZW0iOworCWlmICgha2V5KSBrZXkgPSBjZXJ0OworCWlmIChtYXRyaXhTc2xPcGVuKCkgPCAwKQorCQlmYXRhbCgiY2FuJ3QgaW5pdGlhbGl6ZSBzc2wiKTsKKwlpZiAobWF0cml4U3NsUmVhZEtleXMoJmtleXMsIGNlcnQsIGtleSwgMCwgY2EpIDwgMCkgeworCQlpZiAoY2xpZW50KQorCQkJZmF0YWwoImNhbid0IHJlYWQgY2VydCwga2V5LCBvciBjYSBmaWxlIik7CisJCWZhdGFsKCJjYW4ndCByZWFkIGNlcnQgb3Iga2V5IGZpbGUiKTsKKwl9CisJaWYgKG1hdHJpeFNzbE5ld1Nlc3Npb24oJnNzbCwga2V5cywgMCwgU1NMX0ZMQUdTX1NFUlZFUikgPCAwKQorCQlmYXRhbCgiY2FuJ3QgY3JlYXRlIHNzbCBzZXNzaW9uIik7CisjZW5kaWYKKworCXNpZ19ibG9jayhTSUdDSExEKTsKKwlzaWduYWwoU0lHQ0hMRCwgc2lnX2NoaWxkX2hhbmRsZXIpOworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgc2lnX3Rlcm1faGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJaWYgKG1heF9wZXJfaG9zdCkKKwkJaXBzdmRfcGVyaG9zdF9pbml0KGNtYXgpOworCisJbG9jYWxfcG9ydCA9IGJiX2xvb2t1cF9wb3J0KGFyZ3ZbMV0sIHRjcCA/ICJ0Y3AiIDogInVkcCIsIDApOworCWxzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIGxvY2FsX3BvcnQpOworCWFyZ3YgKz0gMjsKKworCXNvY2sgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIHRjcCA/IFNPQ0tfU1RSRUFNIDogU09DS19ER1JBTSwgMCk7CisJc2V0c29ja29wdF9yZXVzZWFkZHIoc29jayk7CisJc2FfbGVuID0gbHNhLT5sZW47IC8qIEkgcHJlc3VtZSBzb2NrYWRkciBsZW4gc3RheXMgdGhlIHNhbWUgKi8KKwl4YmluZChzb2NrLCAmbHNhLT51LnNhLCBzYV9sZW4pOworCWlmICh0Y3ApIHsKKwkJeGxpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKwkJY2xvc2Vfb25fZXhlY19vbihzb2NrKTsKKwl9IGVsc2UgeyAvKiB1ZHA6IG5lZWRlZCBmb3IgcmVjdl9mcm9tX3RvIHRvIHdvcms6ICovCisJCXNvY2tldF93YW50X3BrdGluZm8oc29jayk7CisJfQorCS8qIG5kZWxheV9vZmYoc29jayk7IC0gaXQgaXMgdGhlIGRlZmF1bHQgSSB0aGluaz8gKi8KKworI2lmbmRlZiBTU0xTVkQKKwlpZiAob3B0cyAmIE9QVF91KSB7CisJCS8qIGRyb3AgcGVybWlzc2lvbnMgKi8KKwkJeHNldGdpZCh1Z2lkLmdpZCk7CisJCXhzZXR1aWQodWdpZC51aWQpOworCX0KKyNlbmRpZgorCisJaWYgKHZlcmJvc2UpIHsKKwkJY2hhciAqYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZsc2EtPnUuc2EpOworCQlpZiAob3B0cyAmIE9QVF91KQorCQkJYmJfZXJyb3JfbXNnKCJsaXN0ZW5pbmcgb24gJXMsIHN0YXJ0aW5nLCB1aWQgJXUsIGdpZCAldSIsIGFkZHIsCisJCQkJKHVuc2lnbmVkKXVnaWQudWlkLCAodW5zaWduZWQpdWdpZC5naWQpOworCQllbHNlCisJCQliYl9lcnJvcl9tc2coImxpc3RlbmluZyBvbiAlcywgc3RhcnRpbmciLCBhZGRyKTsKKwkJZnJlZShhZGRyKTsKKwl9CisKKwkvKiBNYWluIGFjY2VwdCgpIGxvb3AgKi8KKworIGFnYWluOgorCWhjY3AgPSBOVUxMOworCisJd2hpbGUgKGNudW0gPj0gY21heCkKKwkJd2FpdF9mb3JfYW55X3NpZygpOyAvKiBleHBlY3RpbmcgU0lHQ0hMRCAqLworCisJLyogQWNjZXB0IGEgY29ubmVjdGlvbiB0byBmZCAjMCAqLworIGFnYWluMToKKwljbG9zZSgwKTsKKyBhZ2FpbjI6CisJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisJbG9jYWwubGVuID0gcmVtb3RlLmxlbiA9IHNhX2xlbjsKKwlpZiAodGNwKSB7CisJCWNvbm4gPSBhY2NlcHQoc29jaywgJnJlbW90ZS51LnNhLCAmcmVtb3RlLmxlbik7CisJfSBlbHNlIHsKKwkJLyogSW4gY2FzZSByZWN2X2Zyb21fdG8gd29uJ3QgYmUgYWJsZSB0byByZWNvdmVyIGxvY2FsIGFkZHIuCisJCSAqIEFsc28gc2V0cyBwb3J0IC0gcmVjdl9mcm9tX3RvIGlzIHVuYWJsZSB0byBkbyBpdC4gKi8KKwkJbG9jYWwgPSAqbHNhOworCQljb25uID0gcmVjdl9mcm9tX3RvKHNvY2ssIE5VTEwsIDAsIE1TR19QRUVLLAorCQkJCSZyZW1vdGUudS5zYSwgJmxvY2FsLnUuc2EsIHNhX2xlbik7CisJfQorCXNpZ19ibG9jayhTSUdDSExEKTsKKwlpZiAoY29ubiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJYmJfcGVycm9yX21zZyh0Y3AgPyAiYWNjZXB0IiA6ICJyZWN2Iik7CisJCWdvdG8gYWdhaW4yOworCX0KKwl4bW92ZV9mZCh0Y3AgPyBjb25uIDogc29jaywgMCk7CisKKwlpZiAobWF4X3Blcl9ob3N0KSB7CisJCS8qIERyb3AgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBpZiBjdXJfcGVyX2hvc3QgPiBtYXhfcGVyX2hvc3QKKwkJICogKG1pbmltaXppbmcgbG9hZCB1bmRlciBTWU4gZmxvb2QpICovCisJCXJlbW90ZV9hZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZyZW1vdGUudS5zYSk7CisJCWN1cl9wZXJfaG9zdCA9IGlwc3ZkX3Blcmhvc3RfYWRkKHJlbW90ZV9hZGRyLCBtYXhfcGVyX2hvc3QsICZoY2NwKTsKKwkJaWYgKGN1cl9wZXJfaG9zdCA+IG1heF9wZXJfaG9zdCkgeworCQkJLyogaXBzdmRfcGVyaG9zdF9hZGQgZGV0ZWN0ZWQgdGhhdCBtYXggaXMgZXhjZWVkZWQKKwkJCSAqIChhbmQgZGlkIG5vdCBzdG9yZSBpcCBpbiBjb25uZWN0aW9uIHRhYmxlKSAqLworCQkJZnJlZShyZW1vdGVfYWRkcik7CisJCQlpZiAobXNnX3Blcl9ob3N0KSB7CisJCQkJLyogZG9uJ3QgYmxvY2sgb3IgdGVzdCBmb3IgZXJyb3JzICovCisJCQkJc2VuZCgwLCBtc2dfcGVyX2hvc3QsIGxlbl9wZXJfaG9zdCwgTVNHX0RPTlRXQUlUKTsKKwkJCX0KKwkJCWdvdG8gYWdhaW4xOworCQl9CisJCS8qIE5COiByZW1vdGVfYWRkciBpcyBub3QgbGVha2VkLCBpdCBpcyBzdG9yZWQgaW4gY29ubiB0YWJsZSAqLworCX0KKworCWlmICghdGNwKSB7CisJCS8qIFZvb2RvbyBtYWdpYzogbWFraW5nIHVkcCBzb2NrZXRzIGVhY2ggcmVjZWl2ZSBpdHMgb3duCisJCSAqIHBhY2tldHMgaXMgbm90IHRyaXZpYWwsIGFuZCBJIHN0aWxsIG5vdCBzdXJlCisJCSAqIEkgZG8gaXQgMTAwJSByaWdodC4KKwkJICogMSkgd2UgaGF2ZSB0byBkbyBpdCBiZWZvcmUgZm9yaygpCisJCSAqIDIpIG9yZGVyIGlzIGltcG9ydGFudCAtIGlzIGl0IHJpZ2h0IG5vdz8gKi8KKworCQkvKiBPcGVuIG5ldyBub24tY29ubmVjdGVkIFVEUCBzb2NrZXQgZm9yIGZ1cnRoZXIgY2xpZW50cy4uLiAqLworCQlzb2NrID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKKwkJc2V0c29ja29wdF9yZXVzZWFkZHIoc29jayk7CisJCS8qIE1ha2UgcGxhaW4gd3JpdGUvc2VuZCB3b3JrIGZvciBvbGQgc29ja2V0IGJ5IHN1cHBseWluZyBkZWZhdWx0CisJCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MuIFRoaXMgYWxzbyByZXN0cmljdHMgaW5jb21pbmcgcGFja2V0cworCQkgKiB0byBvbmVzIGNvbWluZyBmcm9tIHRoaXMgcmVtb3RlIElQLiAqLworCQl4Y29ubmVjdCgwLCAmcmVtb3RlLnUuc2EsIHNhX2xlbik7CisJLyogaG9sZT8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHdpbGRjYXJkIHVkcCBzb2NrZXQuLi4KKwkgKiBjYW4gdGhpcyBjYXVzZSBjbGllbnRzIHRvIGdldCAicG9ydCB1bnJlYWNoYWJsZSIgaWNtcD8KKwkgKiBZdXAsIHRpbWUgd2luZG93IGlzIHZlcnkgc21hbGwsIGJ1dCBpdCBleGlzdHMgKGlzIGl0PykgKi8KKwkJLyogLi4uIm9wZW4gbmV3IHNvY2tldCIsIGNvbnRpbnVlZCAqLworCQl4YmluZChzb2NrLCAmbHNhLT51LnNhLCBzYV9sZW4pOworCQlzb2NrZXRfd2FudF9wa3RpbmZvKHNvY2spOworCisJCS8qIERvZXNuJ3Qgd29yazoKKwkJICogd2UgY2Fubm90IHJlcGxhY2UgZmQgIzAgLSB3ZSB3aWxsIGxvc2UgcGVuZGluZyBwYWNrZXQKKwkJICogd2hpY2ggaXMgYWxyZWFkeSBidWZmZXJlZCBmb3IgdXMhIEFuZCB3ZSBjYW5ub3QgdXNlIGZkICMxCisJCSAqIGluc3RlYWQgLSBpdCB3aWxsICJpbnRlcmNlcHQiIGFsbCBmb2xsb3dpbmcgcGFja2V0cywgYnV0IGNoaWxkCisJCSAqIGRvZXMgbm90IGV4cGVjdCBkYXRhIGNvbWluZyAqZnJvbSBmZCAjMSohICovCisjaWYgMAorCQkvKiBNYWtlIGl0IHNvIHRoYXQgbG9jYWwgYWRkciBpcyBmaXhlZCB0byBsb2NhbHAtPnUuc2EKKwkJICogYW5kIHdlIGRvbid0IGFjY2lkZW50YWxseSBhY2NlcHQgcGFja2V0cyB0byBvdGhlciBsb2NhbCBJUHMuICovCisJCS8qIE5COiB3ZSBwb3NzaWJseSBiaW5kIHRvIHRoZSBfdmVyeV8gc2FtZV8gYWRkcmVzcyAmIHBvcnQgYXMgdGhlIG9uZQorCQkgKiBhbHJlYWR5IGJvdW5kIGluIHBhcmVudCEgVGhpcyBzZWVtcyB0byB3b3JrIGluIExpbnV4LgorCQkgKiAob3RoZXJ3aXNlIHdlIGNhbiBtb3ZlIHNvY2tldCB0byBmZCAjMCBvbmx5IGlmIGJpbmQgc3VjY2VlZHMpICovCisJCWNsb3NlKDApOworCQlzZXRfbnBvcnQoJmxvY2FscC0+dS5zYSwgaHRvbnMobG9jYWxfcG9ydCkpOworCQl4bW92ZV9mZCh4c29ja2V0KGxvY2FscC0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIDApLCAwKTsKKwkJc2V0c29ja29wdF9yZXVzZWFkZHIoMCk7IC8qIGNydWNpYWwgKi8KKwkJeGJpbmQoMCwgJmxvY2FscC0+dS5zYSwgbG9jYWxwLT5sZW4pOworI2VuZGlmCisJfQorCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coInZmb3JrIik7CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKHBpZCAhPSAwKSB7CisJCS8qIFBhcmVudCAqLworCQljbnVtKys7CisJCWlmICh2ZXJib3NlKQorCQkJY29ubmVjdGlvbl9zdGF0dXMoKTsKKwkJaWYgKGhjY3ApCisJCQloY2NwLT5waWQgPSBwaWQ7CisJCS8qIGNsZWFuIHVwIGNoYW5nZXMgZG9uZSBieSB2Zm9ya2VkIGNoaWxkICovCisJCXVuZG9feHNldGVudigpOworCQlnb3RvIGFnYWluOworCX0KKworCS8qIENoaWxkOiBwcmVwYXJlIGVudiwgbG9nLCBhbmQgZXhlYyBwcm9nICovCisKKwl7IC8qIHZmb3JrIGFsZXJ0ISBldmVyeSB4bWFsbG9jIGluIHRoaXMgYmxvY2sgc2hvdWxkIGJlIGZyZWVkISAqLworCQljaGFyICpsb2NhbF9ob3N0bmFtZSA9IGxvY2FsX2hvc3RuYW1lOyAvKiBmb3IgY29tcGlsZXIgKi8KKwkJY2hhciAqbG9jYWxfYWRkciA9IE5VTEw7CisJCWNoYXIgKmZyZWVfbWUwID0gTlVMTDsKKwkJY2hhciAqZnJlZV9tZTEgPSBOVUxMOworCQljaGFyICpmcmVlX21lMiA9IE5VTEw7CisKKwkJaWYgKHZlcmJvc2UgfHwgIShvcHRzICYgT1BUX0UpKSB7CisJCQlpZiAoIW1heF9wZXJfaG9zdCkgLyogcmVtb3RlX2FkZHIgaXMgbm90IHlldCBrbm93biAqLworCQkJCWZyZWVfbWUwID0gcmVtb3RlX2FkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmcmVtb3RlLnUuc2EpOworCQkJaWYgKG9wdHMgJiBPUFRfaCkgeworCQkJCWZyZWVfbWUxID0gcmVtb3RlX2hvc3RuYW1lID0geG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydCgmcmVtb3RlLnUuc2EpOworCQkJCWlmICghcmVtb3RlX2hvc3RuYW1lKSB7CisJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgbG9vayB1cCBob3N0bmFtZSBmb3IgJXMiLCByZW1vdGVfYWRkcik7CisJCQkJCXJlbW90ZV9ob3N0bmFtZSA9IHJlbW90ZV9hZGRyOworCQkJCX0KKwkJCX0KKwkJCS8qIEZpbmQgb3V0IGxvY2FsIElQIHBlZXIgY29ubmVjdGVkIHRvLgorCQkJICogRXJyb3JzIGlnbm9yZWQgKEknbSBub3QgcGFyYW5vaWQgZW5vdWdoIHRvIGltYWdpbmUga2VybmVsCisJCQkgKiB3aGljaCBkb2Vzbid0IGtub3cgbG9jYWwgSVApLiAqLworCQkJaWYgKHRjcCkKKwkJCQlnZXRzb2NrbmFtZSgwLCAmbG9jYWwudS5zYSwgJmxvY2FsLmxlbik7CisJCQkvKiBlbHNlOiBmb3IgVURQIGl0IGlzIGRvbmUgZWFybGllciBieSBwYXJlbnQgKi8KKwkJCWxvY2FsX2FkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbG9jYWwudS5zYSk7CisJCQlpZiAob3B0cyAmIE9QVF9oKSB7CisJCQkJbG9jYWxfaG9zdG5hbWUgPSBwcmVzZXRfbG9jYWxfaG9zdG5hbWU7CisJCQkJaWYgKCFsb2NhbF9ob3N0bmFtZSkgeworCQkJCQlmcmVlX21lMiA9IGxvY2FsX2hvc3RuYW1lID0geG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydCgmbG9jYWwudS5zYSk7CisJCQkJCWlmICghbG9jYWxfaG9zdG5hbWUpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgbG9vayB1cCBob3N0bmFtZSBmb3IgJXMiLCBsb2NhbF9hZGRyKTsKKwkJCQl9CisJCQkJLyogZWxzZTogbG9jYWxfaG9zdG5hbWUgaXMgbm90IE5VTEwsIGJ1dCBpcyBOT1QgbWFsbG9jZWQhICovCisJCQl9CisJCX0KKwkJaWYgKHZlcmJvc2UpIHsKKwkJCXBpZCA9IGdldHBpZCgpOworCQkJaWYgKG1heF9wZXJfaG9zdCkgeworCQkJCWJiX2Vycm9yX21zZygiY29uY3VycmVuY3kgJXMgJXUvJXUiLAorCQkJCQlyZW1vdGVfYWRkciwKKwkJCQkJY3VyX3Blcl9ob3N0LCBtYXhfcGVyX2hvc3QpOworCQkJfQorCQkJYmJfZXJyb3JfbXNnKChvcHRzICYgT1BUX2gpCisJCQkJPyAic3RhcnQgJXUgJXMtJXMgKCVzLSVzKSIKKwkJCQk6ICJzdGFydCAldSAlcy0lcyIsCisJCQkJcGlkLAorCQkJCWxvY2FsX2FkZHIsIHJlbW90ZV9hZGRyLAorCQkJCWxvY2FsX2hvc3RuYW1lLCByZW1vdGVfaG9zdG5hbWUpOworCQl9CisKKwkJaWYgKCEob3B0cyAmIE9QVF9FKSkgeworCQkJLyogc2V0dXAgdWNzcGkgZW52ICovCisJCQljb25zdCBjaGFyICpwcm90byA9IHRjcCA/ICJUQ1AiIDogIlVEUCI7CisKKyNpZmRlZiBTT19PUklHSU5BTF9EU1QKKwkJCS8qIEV4dHJhY3QgIm9yaWdpbmFsIiBkZXN0aW5hdGlvbiBhZGRyOnBvcnQKKwkJCSAqIGZyb20gTGludXggZmlyZXdhbGwuIFVzZWZ1bCB3aGVuIHlvdSByZWRpcmVjdAorCQkJICogYW4gb3V0Ym9uZCBjb25uZWN0aW9uIHRvIGxvY2FsIGhhbmRsZXIsIGFuZCBpdCBuZWVkcworCQkJICogdG8ga25vdyB3aGVyZSBpdCBvcmlnaW5hbGx5IHRyaWVkIHRvIGNvbm5lY3QgKi8KKwkJCWlmICh0Y3AgJiYgZ2V0c29ja29wdCgwLCBTT0xfSVAsIFNPX09SSUdJTkFMX0RTVCwgJmxvY2FsLnUuc2EsICZsb2NhbC5sZW4pID09IDApIHsKKwkJCQljaGFyICphZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxvY2FsLnUuc2EpOworCQkJCXhzZXRlbnZfcGxhaW4oIlRDUE9SSUdEU1RBRERSIiwgYWRkcik7CisJCQkJZnJlZShhZGRyKTsKKwkJCX0KKyNlbmRpZgorCQkJeHNldGVudl9wbGFpbigiUFJPVE8iLCBwcm90byk7CisJCQl4c2V0ZW52X3Byb3RvKHByb3RvLCAiTE9DQUxBRERSIiwgbG9jYWxfYWRkcik7CisJCQl4c2V0ZW52X3Byb3RvKHByb3RvLCAiUkVNT1RFQUREUiIsIHJlbW90ZV9hZGRyKTsKKwkJCWlmIChvcHRzICYgT1BUX2gpIHsKKwkJCQl4c2V0ZW52X3Byb3RvKHByb3RvLCAiTE9DQUxIT1NUIiwgbG9jYWxfaG9zdG5hbWUpOworCQkJCXhzZXRlbnZfcHJvdG8ocHJvdG8sICJSRU1PVEVIT1NUIiwgcmVtb3RlX2hvc3RuYW1lKTsKKwkJCX0KKwkJCS8vY29tcGF0PyB4c2V0ZW52X3Byb3RvKHByb3RvLCAiUkVNT1RFSU5GTyIsICIiKTsKKwkJCS8qIGFkZGl0aW9uYWwgKi8KKwkJCWlmIChjdXJfcGVyX2hvc3QgPiAwKSAvKiBjYW4gbm90IGJlIHRydWUgZm9yIHVkcCAqLworCQkJCXhzZXRlbnZfcGxhaW4oIlRDUENPTkNVUlJFTkNZIiwgdXRvYShjdXJfcGVyX2hvc3QpKTsKKwkJfQorCQlmcmVlKGxvY2FsX2FkZHIpOworCQlmcmVlKGZyZWVfbWUwKTsKKwkJZnJlZShmcmVlX21lMSk7CisJCWZyZWUoZnJlZV9tZTIpOworCX0KKworCXhkdXAyKDAsIDEpOworCisJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOyAvKiB0aGlzIG9uZSB3YXMgU0lHX0lHTmVkICovCisJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCS8qc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOyovCisJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisKKyNpZmRlZiBTU0xTVkQKKwlzdHJjcHkoaWQsIHV0b2EocGlkKSk7CisJc3NsX2lvKDAsIGFyZ3YpOworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYXJndlswXSk7CisjZWxzZQorCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisjZW5kaWYKK30KKworLyoKK3RjcHN2ZCBbLWhwRXZ2XSBbLWMgbl0gWy1DIG46bXNnXSBbLWIgbl0gWy11IHVzZXJdIFstbCBuYW1lXQorCVstaSBkaXJ8LXggY2RiXSBbIC10IHNlY10gaG9zdCBwb3J0IHByb2cKKwordGNwc3ZkIGNyZWF0ZXMgYSBUQ1AvSVAgc29ja2V0LCBiaW5kcyBpdCB0byB0aGUgYWRkcmVzcyBob3N0OnBvcnQsCithbmQgbGlzdGVucyBvbiB0aGUgc29ja2V0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4KKworT24gZWFjaCBpbmNvbWluZyBjb25uZWN0aW9uLCB0Y3BzdmQgY29uZGl0aW9uYWxseSBydW5zIGEgcHJvZ3JhbSwKK3dpdGggc3RhbmRhcmQgaW5wdXQgcmVhZGluZyBmcm9tIHRoZSBzb2NrZXQsIGFuZCBzdGFuZGFyZCBvdXRwdXQKK3dyaXRpbmcgdG8gdGhlIHNvY2tldCwgdG8gaGFuZGxlIHRoaXMgY29ubmVjdGlvbi4gdGNwc3ZkIGtlZXBzCitsaXN0ZW5pbmcgb24gdGhlIHNvY2tldCBmb3IgbmV3IGNvbm5lY3Rpb25zLCBhbmQgY2FuIGhhbmRsZQorbXVsdGlwbGUgY29ubmVjdGlvbnMgc2ltdWx0YW5lb3VzbHkuCisKK3RjcHN2ZCBvcHRpb25hbGx5IGNoZWNrcyBmb3Igc3BlY2lhbCBpbnN0cnVjdGlvbnMgZGVwZW5kaW5nCitvbiB0aGUgSVAgYWRkcmVzcyBvciBob3N0bmFtZSBvZiB0aGUgY2xpZW50IHRoYXQgaW5pdGlhdGVkCit0aGUgY29ubmVjdGlvbiwgc2VlIGlwc3ZkLWluc3RydWN0KDUpLgorCitob3N0CisgICAgaG9zdCBlaXRoZXIgaXMgYSBob3N0bmFtZSwgb3IgYSBkb3R0ZWQtZGVjaW1hbCBJUCBhZGRyZXNzLAorICAgIG9yIDAuIElmIGhvc3QgaXMgMCwgdGNwc3ZkIGFjY2VwdHMgY29ubmVjdGlvbnMgdG8gYW55IGxvY2FsCisgICAgSVAgYWRkcmVzcy4KKyAgICAqIGJ1c3lib3ggYWNjZXB0cyBJUHY2IGFkZHJlc3NlcyBhbmQgaG9zdDpwb3J0IHBhaXJzIHRvbworICAgICAgSW4gdGhpcyBjYXNlIHNlY29uZCBwYXJhbWV0ZXIgaXMgaWdub3JlZAorcG9ydAorICAgIHRjcHN2ZCBhY2NlcHRzIGNvbm5lY3Rpb25zIHRvIGhvc3Q6cG9ydC4gcG9ydCBtYXkgYmUgYSBuYW1lCisgICAgZnJvbSAvZXRjL3NlcnZpY2VzIG9yIGEgbnVtYmVyLgorcHJvZworICAgIHByb2cgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgYXJndW1lbnRzLiBGb3IgZWFjaCBjb25uZWN0aW9uLAorICAgIHRjcHN2ZCBub3JtYWxseSBydW5zIHByb2csIHdpdGggZmlsZSBkZXNjcmlwdG9yIDAgcmVhZGluZyBmcm9tCisgICAgdGhlIG5ldHdvcmssIGFuZCBmaWxlIGRlc2NyaXB0b3IgMSB3cml0aW5nIHRvIHRoZSBuZXR3b3JrLgorICAgIEJ5IGRlZmF1bHQgaXQgYWxzbyBzZXRzIHVwIFRDUC1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcywKKyAgICBzZWUgdGNwLWVudmlyb24oNSkKKy1pIGRpcgorICAgIHJlYWQgaW5zdHJ1Y3Rpb25zIGZvciBoYW5kbGluZyBuZXcgY29ubmVjdGlvbnMgZnJvbSB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgZGlyZWN0b3J5IGRpci4gU2VlIGlwc3ZkLWluc3RydWN0KDUpIGZvciBkZXRhaWxzLgorICAgICogaWdub3JlZCBieSBidXN5Ym94ZWQgdmVyc2lvbgorLXggY2RiCisgICAgcmVhZCBpbnN0cnVjdGlvbnMgZm9yIGhhbmRsaW5nIG5ldyBjb25uZWN0aW9ucyBmcm9tIHRoZSBjb25zdGFudCBkYXRhYmFzZQorICAgIGNkYi4gVGhlIGNvbnN0YW50IGRhdGFiYXNlIG5vcm1hbGx5IGlzIGNyZWF0ZWQgZnJvbSBhbiBpbnN0cnVjdGlvbnMKKyAgICBkaXJlY3RvcnkgYnkgcnVubmluZyBpcHN2ZC1jZGIoOCkuCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCistdCBzZWMKKyAgICB0aW1lb3V0LiBUaGlzIG9wdGlvbiBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGUgLWkgb3B0aW9uIGlzIGdpdmVuLgorICAgIFdoaWxlIGNoZWNraW5nIHRoZSBpbnN0cnVjdGlvbnMgZGlyZWN0b3J5LCBjaGVjayB0aGUgdGltZSBvZiBsYXN0IGFjY2VzcworICAgIG9mIHRoZSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgY2xpZW50cyBhZGRyZXNzIG9yIGhvc3RuYW1lIGlmIGFueSwgZGlzY2FyZAorICAgIGFuZCByZW1vdmUgdGhlIGZpbGUgaWYgaXQgd2Fzbid0IGFjY2Vzc2VkIHdpdGhpbiB0aGUgbGFzdCBzZWMgc2Vjb25kczsKKyAgICB0Y3BzdmQgZG9lcyBub3QgZGlzY2FyZCBvciByZW1vdmUgYSBmaWxlIGlmIHRoZSB1c2VyJ3Mgd3JpdGUgcGVybWlzc2lvbgorICAgIGlzIG5vdCBzZXQsIGZvciB0aG9zZSBmaWxlcyB0aGUgdGltZW91dCBpcyBkaXNhYmxlZC4gRGVmYXVsdCBpcyAwLAorICAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHRpbWVvdXQgaXMgZGlzYWJsZWQuCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCistbCBuYW1lCisgICAgbG9jYWwgaG9zdG5hbWUuIERvIG5vdCBsb29rIHVwIHRoZSBsb2NhbCBob3N0bmFtZSBpbiBETlMsIGJ1dCB1c2UgbmFtZQorICAgIGFzIGhvc3RuYW1lLiBUaGlzIG9wdGlvbiBtdXN0IGJlIHNldCBpZiB0Y3BzdmQgbGlzdGVucyBvbiBwb3J0IDUzCisgICAgdG8gYXZvaWQgbG9vcHMuCistdSB1c2VyWzpncm91cF0KKyAgICBkcm9wIHBlcm1pc3Npb25zLiBTd2l0Y2ggdXNlciBJRCB0byB1c2VyJ3MgVUlELCBhbmQgZ3JvdXAgSUQgdG8gdXNlcidzCisgICAgcHJpbWFyeSBHSUQgYWZ0ZXIgY3JlYXRpbmcgYW5kIGJpbmRpbmcgdG8gdGhlIHNvY2tldC4gSWYgdXNlciBpcyBmb2xsb3dlZAorICAgIGJ5IGEgY29sb24gYW5kIGEgZ3JvdXAgbmFtZSwgdGhlIGdyb3VwIElEIGlzIHN3aXRjaGVkIHRvIHRoZSBHSUQgb2YgZ3JvdXAKKyAgICBpbnN0ZWFkLiBBbGwgc3VwcGxlbWVudGFyeSBncm91cHMgYXJlIHJlbW92ZWQuCistYyBuCisgICAgY29uY3VycmVuY3kuIEhhbmRsZSB1cCB0byBuIGNvbm5lY3Rpb25zIHNpbXVsdGFuZW91c2x5LiBEZWZhdWx0IGlzIDMwLgorICAgIElmIHRoZXJlIGFyZSBuIGNvbm5lY3Rpb25zIGFjdGl2ZSwgdGNwc3ZkIGRlZmVycyBhY2NlcHRhbmNlIG9mIGEgbmV3CisgICAgY29ubmVjdGlvbiB1bnRpbCBhbiBhY3RpdmUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCistQyBuWzptc2ddCisgICAgcGVyIGhvc3QgY29uY3VycmVuY3kuIEFsbG93IG9ubHkgdXAgdG8gbiBjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIElQCisgICAgYWRkcmVzcyBzaW11bHRhbmVvdXNseS4gSWYgdGhlcmUgYXJlIG4gYWN0aXZlIGNvbm5lY3Rpb25zIGZyb20gb25lIElQCisgICAgYWRkcmVzcywgbmV3IGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhpcyBJUCBhZGRyZXNzIGFyZSBjbG9zZWQKKyAgICBpbW1lZGlhdGVseS4gSWYgbiBpcyBmb2xsb3dlZCBieSA6bXNnLCB0aGUgbWVzc2FnZSBtc2cgaXMgd3JpdHRlbgorICAgIHRvIHRoZSBjbGllbnQgaWYgcG9zc2libGUsIGJlZm9yZSBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLiBCeSBkZWZhdWx0CisgICAgbXNnIGlzIGVtcHR5LiBTZWUgaXBzdmQtaW5zdHJ1Y3QoNSkgZm9yIHN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2VzIGluIG1zZy4KKworICAgIEZvciBlYWNoIGFjY2VwdGVkIGNvbm5lY3Rpb24sIHRoZSBjdXJyZW50IHBlciBob3N0IGNvbmN1cnJlbmN5IGlzCisgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFRDUENPTkNVUlJFTkNZLiBuIGFuZCBtc2cKKyAgICBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgaXBzdmQoNykgaW5zdHJ1Y3Rpb25zLCBzZWUgaXBzdmQtaW5zdHJ1Y3QoNSkuCisgICAgQnkgZGVmYXVsdCB0Y3BzdmQgZG9lc24ndCBrZWVwIHRyYWNrIG9mIGNvbm5lY3Rpb25zLgorLWgKKyAgICBMb29rIHVwIHRoZSBjbGllbnQncyBob3N0bmFtZSBpbiBETlMuCistcAorICAgIHBhcmFub2lkLiBBZnRlciBsb29raW5nIHVwIHRoZSBjbGllbnQncyBob3N0bmFtZSBpbiBETlMsIGxvb2sgdXAgdGhlIElQCisgICAgYWRkcmVzc2VzIGluIEROUyBmb3IgdGhhdCBob3N0bmFtZSwgYW5kIGZvcmdldCBhYm91dCB0aGUgaG9zdG5hbWUKKyAgICBpZiBub25lIG9mIHRoZSBhZGRyZXNzZXMgbWF0Y2ggdGhlIGNsaWVudCdzIElQIGFkZHJlc3MuIFlvdSBzaG91bGQKKyAgICBzZXQgdGhpcyBvcHRpb24gaWYgeW91IHVzZSBob3N0bmFtZSBiYXNlZCBpbnN0cnVjdGlvbnMuIFRoZSAtcCBvcHRpb24KKyAgICBpbXBsaWVzIHRoZSAtaCBvcHRpb24uCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCistYiBuCisgICAgYmFja2xvZy4gQWxsb3cgYSBiYWNrbG9nIG9mIGFwcHJveGltYXRlbHkgbiBUQ1AgU1lOcy4gT24gc29tZSBzeXN0ZW1zIG4KKyAgICBpcyBzaWxlbnRseSBsaW1pdGVkLiBEZWZhdWx0IGlzIDIwLgorLUUKKyAgICBubyBzcGVjaWFsIGVudmlyb25tZW50LiBEbyBub3Qgc2V0IHVwIFRDUC1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKy12CisgICAgdmVyYm9zZS4gUHJpbnQgdmVyYm9zZSBtZXNzc2FnZXMgdG8gc3RhbmRhcmQgb3V0cHV0LgorLXZ2CisgICAgbW9yZSB2ZXJib3NlLiBQcmludCBtb3JlIHZlcmJvc2UgbWVzc2FnZXMgdG8gc3RhbmRhcmQgb3V0cHV0LgorICAgICogbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIC12IGFuZCAtdnYgaW4gYnVzeWJveGVkIHZlcnNpb24KKyovCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmMgYi9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1NDEwOAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdGNwdWRwX3Blcmhvc3QuYwpAQCAtMCwwICsxLDY1IEBACisvKiBCYXNlZCBvbiBpcHN2ZCB1dGlsaXRpZXMgd3JpdHRlbiBieSBHZXJyaXQgUGFwZSA8cGFwZUBzbWFyZGVuLm9yZz4KKyAqIHdoaWNoIGFyZSByZWxlYXNlZCBpbnRvIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvci4KKyAqIEhvbWVwYWdlOiBodHRwOi8vc21hcmRlbi5zdW5zaXRlLmRrL2lwc3ZkLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInRjcHVkcF9wZXJob3N0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgaGNjICpjYzsKK3N0YXRpYyB1bnNpZ25lZCBjY2xlbjsKKworLyogdG8gYmUgb3B0aW1pemVkICovCisKK3ZvaWQgaXBzdmRfcGVyaG9zdF9pbml0KHVuc2lnbmVkIGMpCit7CisvLwlmcmVlKGNjKTsKKwljYyA9IHh6YWxsb2MoYyAqIHNpemVvZigqY2MpKTsKKwljY2xlbiA9IGM7Cit9CisKK3Vuc2lnbmVkIGlwc3ZkX3Blcmhvc3RfYWRkKGNoYXIgKmlwLCB1bnNpZ25lZCBtYXhjb25uLCBzdHJ1Y3QgaGNjICoqaGNjcHApCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBjb25uID0gMTsKKwlpbnQgZnJlZXBvcyA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IGNjbGVuOyArK2kpIHsKKwkJaWYgKCFjY1tpXS5pcCkgeworCQkJZnJlZXBvcyA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RyY21wKGNjW2ldLmlwLCBpcCkgPT0gMCkgeworCQkJY29ubisrOworCQkJY29udGludWU7CisJCX0KKwl9CisJaWYgKGZyZWVwb3MgPT0gLTEpIHJldHVybiAwOworCWlmIChjb25uIDw9IG1heGNvbm4pIHsKKwkJY2NbZnJlZXBvc10uaXAgPSBpcDsKKwkJKmhjY3BwID0gJmNjW2ZyZWVwb3NdOworCX0KKwlyZXR1cm4gY29ubjsKK30KKwordm9pZCBpcHN2ZF9wZXJob3N0X3JlbW92ZShpbnQgcGlkKQoreworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgaSA8IGNjbGVuOyArK2kpIHsKKwkJaWYgKGNjW2ldLnBpZCA9PSBwaWQpIHsKKwkJCWZyZWUoY2NbaV0uaXApOworCQkJY2NbaV0uaXAgPSBOVUxMOworCQkJY2NbaV0ucGlkID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLy92b2lkIGlwc3ZkX3Blcmhvc3RfZnJlZSh2b2lkKQorLy97CisvLwlmcmVlKGNjKTsKKy8vfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90Y3B1ZHBfcGVyaG9zdC5oIGIvbmV0d29ya2luZy90Y3B1ZHBfcGVyaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNTc1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogQmFzZWQgb24gaXBzdmQgdXRpbGl0aWVzIHdyaXR0ZW4gYnkgR2Vycml0IFBhcGUgPHBhcGVAc21hcmRlbi5vcmc+CisgKiB3aGljaCBhcmUgcmVsZWFzZWQgaW50byBwdWJsaWMgZG9tYWluIGJ5IHRoZSBhdXRob3IuCisgKiBIb21lcGFnZTogaHR0cDovL3NtYXJkZW4uc3Vuc2l0ZS5kay9pcHN2ZC8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworc3RydWN0IGhjYyB7CisJY2hhciAqaXA7CisJaW50IHBpZDsKK307CisKK3ZvaWQgaXBzdmRfcGVyaG9zdF9pbml0KHVuc2lnbmVkKTsKKworLyogUmV0dXJucyBudW1iZXIgb2YgYWxyZWFkeSBvcGVuZWQgY29ubmVjdHMgdG8gdGhpcyBpcHMsIGluY2x1ZGluZyB0aGlzIG9uZS4KKyAqIGlwIHNob3VsZCBiZSBhIG1hbGxvYydlZCBwdHIuCisgKiBJZiByZXR1cm4gdmFsdWUgaXMgPD0gbWF4Y29ubiwgaXAgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdGFibGUKKyAqIGFuZCBwb2ludGVyIHRvIHRhYmxlIGVudHJ5IGlmIHN0b3JlZCBpbiAqaGNjcHAKKyAqICh1c2VmdWwgZm9yIHN0b3JpbmcgcGlkIGxhdGVyKS4KKyAqIEVsc2UgaXAgaXMgTk9UIGluc2VydGVkICh5b3UgbXVzdCB0YWtlIGNhcmUgb2YgaXQgLSBmcmVlKCkgZXRjKSAqLwordW5zaWduZWQgaXBzdmRfcGVyaG9zdF9hZGQoY2hhciAqaXAsIHVuc2lnbmVkIG1heGNvbm4sIHN0cnVjdCBoY2MgKipoY2NwcCk7CisKKy8qIEZpbmRzIGFuZCBmcmVlcyBlbGVtZW50IHdpdGggcGlkICovCit2b2lkIGlwc3ZkX3Blcmhvc3RfcmVtb3ZlKGludCBwaWQpOworCisvL3Vuc2lnbmVkIGlwc3ZkX3Blcmhvc3Rfc2V0cGlkKGludCBwaWQpOworLy92b2lkIGlwc3ZkX3Blcmhvc3RfZnJlZSh2b2lkKTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdGVsbmV0LmMgYi9uZXR3b3JraW5nL3RlbG5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTUxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RlbG5ldC5jCkBAIC0wLDAgKzEsNjcxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0ZWxuZXQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBBdXRob3I6IFRvbWkgT2xsaWxhIDx0b29AaWtpLmZpPgorICogQ29weXJpZ2h0IChDKSAxOTk0LTIwMDAgYnkgVG9taSBPbGxpbGEKKyAqCisgKiBDcmVhdGVkOiBUaHUgQXByICA3IDEzOjI5OjQxIDE5OTQgdG9vCisgKiBMYXN0IG1vZGlmaWVkOiBGcmkgSnVuICA5IDE0OjM0OjI0IDIwMDAgdG9vCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBISVNUT1JZCisgKiBSZXZpc2lvbiAzLjEgIDE5OTQvMDQvMTcgIDExOjMxOjU0ICB0b28KKyAqIGluaXRpYWwgcmV2aXNpb24KKyAqIE1vZGlmaWVkIDIwMDAvMDYvMTMgZm9yIGluY2x1c2lvbiBpbnRvIEJ1c3lCb3ggYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogTW9kaWZpZWQgMjAwMS8wNS8wNyB0byBhZGQgYWJpbGl0eSB0byBwYXNzIFRUWVBFIHRvIHJlbW90ZSBob3N0IGJ5IEppbSBNY1F1aWxsYW4KKyAqIDxqYW1AbHRzcC5vcmc+CisgKiBNb2RpZmllZCAyMDA0LzAyLzExIHRvIGFkZCBhYmlsaXR5IHRvIHBhc3MgdGhlIFVTRVIgdmFyaWFibGUgdG8gcmVtb3RlIGhvc3QKKyAqIGJ5IEZlcm5hbmRvIFNpbHZlaXJhIDxzd3JoQGdteC5uZXQ+CisgKgorICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYV0gWy1sIFVTRVJdIEhPU1QgW1BPUlRdIgorLy91c2FnZTojZGVmaW5lIHRlbG5ldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbm5lY3QgdG8gdGVsbmV0IHNlcnZlclxuIgorLy91c2FnZTogICAgICJcbgktYQlBdXRvbWF0aWMgbG9naW4gd2l0aCAkVVNFUiB2YXJpYWJsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgVVNFUglBdXRvbWF0aWMgbG9naW4gYXMgVVNFUiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiNkZWZpbmUgdGVsbmV0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJIT1NUIFtQT1JUXSIKKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb25uZWN0IHRvIHRlbG5ldCBzZXJ2ZXIiCisvL3VzYWdlOiNlbmRpZgorCisjaW5jbHVkZSA8YXJwYS90ZWxuZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIF9fQklPTklDX18KKy8qIHNob3VsZCBiZSBpbiBhcnBhL3RlbG5ldC5oICovCisjIGRlZmluZSBJQUMgICAgICAgICAyNTUgIC8qIGludGVycHJldCBhcyBjb21tYW5kOiAqLworIyBkZWZpbmUgRE9OVCAgICAgICAgMjU0ICAvKiB5b3UgYXJlIG5vdCB0byB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBETyAgICAgICAgICAyNTMgIC8qIHBsZWFzZSwgeW91IHVzZSBvcHRpb24gKi8KKyMgZGVmaW5lIFdPTlQgICAgICAgIDI1MiAgLyogSSB3b24ndCB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBXSUxMICAgICAgICAyNTEgIC8qIEkgd2lsbCB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBTQiAgICAgICAgICAyNTAgIC8qIGludGVycHJldCBhcyBzdWJuZWdvdGlhdGlvbiAqLworIyBkZWZpbmUgU0UgICAgICAgICAgMjQwICAvKiBlbmQgc3ViIG5lZ290aWF0aW9uICovCisjIGRlZmluZSBURUxPUFRfRUNITyAgIDEgIC8qIGVjaG8gKi8KKyMgZGVmaW5lIFRFTE9QVF9TR0EgICAgMyAgLyogc3VwcHJlc3MgZ28gYWhlYWQgKi8KKyMgZGVmaW5lIFRFTE9QVF9UVFlQRSAyNCAgLyogdGVybWluYWwgdHlwZSAqLworIyBkZWZpbmUgVEVMT1BUX05BV1MgIDMxICAvKiB3aW5kb3cgc2l6ZSAqLworI2VuZGlmCisKKyNpZmRlZiBET1RSQUNFCisjIGRlZmluZSBUUkFDRSh4LCB5KSBkbyB7IGlmICh4KSBwcmludGYgeTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBUUkFDRSh4LCB5KQorI2VuZGlmCisKK2VudW0geworCURBVEFCVUZTSVpFID0gMTI4LAorCUlBQ0JVRlNJWkUgID0gMTI4LAorCisJQ0hNX1RSWSA9IDAsCisJQ0hNX09OID0gMSwKKwlDSE1fT0ZGID0gMiwKKworCVVGX0VDSE8gPSAweDAxLAorCVVGX1NHQSA9IDB4MDIsCisKKwlUU19OT1JNQUwgPSAwLAorCVRTX0NPUFkgPSAxLAorCVRTX0lBQyA9IDIsCisJVFNfT1BUID0gMywKKwlUU19TVUIxID0gNCwKKwlUU19TVUIyID0gNSwKKwlUU19DUiA9IDYsCit9OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKKworZW51bSB7IG5ldGZkID0gMyB9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50CWlhY2xlbjsgLyogY291bGQgZXZlbiB1c2UgYnl0ZSwgYnV0IGl0J3MgYSBsb3NzIG9uIHg4NiAqLworCWJ5dGUJdGVsc3RhdGU7IC8qIHRlbG5ldCBuZWdvdGlhdGlvbiBzdGF0ZSBmcm9tIG5ldHdvcmsgaW5wdXQgKi8KKwlieXRlCXRlbHdpc2g7ICAvKiBETywgRE9OVCwgV0lMTCwgV09OVCAqLworCWJ5dGUgICAgY2hhcm1vZGU7CisJYnl0ZSAgICB0ZWxmbGFnczsKKwlieXRlCWRvX3Rlcm1pb3M7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCisJY2hhcgkqdHR5cGU7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJY29uc3QgY2hhciAqYXV0b2xvZ2luOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICisJdW5zaWduZWQgd2luX3dpZHRoLCB3aW5faGVpZ2h0OworI2VuZGlmCisJLyogc2FtZSBidWZmZXIgdXNlZCBib3RoIGZvciBuZXR3b3JrIGFuZCBjb25zb2xlIHJlYWQvd3JpdGUgKi8KKwljaGFyICAgIGJ1ZltEQVRBQlVGU0laRV07CisJLyogYnVmZmVyIHRvIGhhbmRsZSB0ZWxuZXQgbmVnb3RpYXRpb25zICovCisJY2hhciAgICBpYWNidWZbSUFDQlVGU0laRV07CisJc3RydWN0IHRlcm1pb3MgdGVybWlvc19kZWY7CisJc3RydWN0IHRlcm1pb3MgdGVybWlvc19yYXc7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlzdHJ1Y3QgR19zaXplY2hlY2sgeyBcCisJCWNoYXIgR19zaXplY2hlY2tbc2l6ZW9mKEcpID4gQ09NTU9OX0JVRlNJWkUgPyAtMSA6IDFdOyBcCisJfTsgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCByYXdtb2RlKHZvaWQpOworc3RhdGljIHZvaWQgY29va21vZGUodm9pZCk7CitzdGF0aWMgdm9pZCBkb19saW5lbW9kZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHdpbGxfY2hhcm1vZGUodm9pZCk7CitzdGF0aWMgdm9pZCB0ZWxvcHQoYnl0ZSBjKTsKK3N0YXRpYyB2b2lkIHN1Ym5lZyhieXRlIGMpOworCitzdGF0aWMgdm9pZCBpYWNfZmx1c2godm9pZCkKK3sKKwl3cml0ZShuZXRmZCwgRy5pYWNidWYsIEcuaWFjbGVuKTsKKwlHLmlhY2xlbiA9IDA7Cit9CisKKyNkZWZpbmUgd3JpdGVfc3RyKGZkLCBzdHIpIHdyaXRlKGZkLCBzdHIsIHNpemVvZihzdHIpIC0gMSkKKworc3RhdGljIHZvaWQgZG9leGl0KGludCBldikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBkb2V4aXQoaW50IGV2KQoreworCWNvb2ttb2RlKCk7CisJZXhpdChldik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbl9lc2NhcGUodm9pZCkKK3sKKwljaGFyIGI7CisKKwlpZiAoYmJfZ290X3NpZ25hbCkgLyogY2FtZSBmcm9tIGxpbmUgbW9kZS4uLiBnbyByYXcgKi8KKwkJcmF3bW9kZSgpOworCisJd3JpdGVfc3RyKDEsICJcclxuQ29uc29sZSBlc2NhcGUuIENvbW1hbmRzIGFyZTpcclxuXG4iCisJCQkiIGwJZ28gdG8gbGluZSBtb2RlXHJcbiIKKwkJCSIgYwlnbyB0byBjaGFyYWN0ZXIgbW9kZVxyXG4iCisJCQkiIHoJc3VzcGVuZCB0ZWxuZXRcclxuIgorCQkJIiBlCWV4aXQgdGVsbmV0XHJcbiIpOworCisJaWYgKHJlYWQoU1RESU5fRklMRU5PLCAmYiwgMSkgPD0gMCkKKwkJZG9leGl0KEVYSVRfRkFJTFVSRSk7CisKKwlzd2l0Y2ggKGIpIHsKKwljYXNlICdsJzoKKwkJaWYgKCFiYl9nb3Rfc2lnbmFsKSB7CisJCQlkb19saW5lbW9kZSgpOworCQkJZ290byByZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCWlmIChiYl9nb3Rfc2lnbmFsKSB7CisJCQl3aWxsX2NoYXJtb2RlKCk7CisJCQlnb3RvIHJldDsKKwkJfQorCQlicmVhazsKKwljYXNlICd6JzoKKwkJY29va21vZGUoKTsKKwkJa2lsbCgwLCBTSUdUU1RQKTsKKwkJcmF3bW9kZSgpOworCQlicmVhazsKKwljYXNlICdlJzoKKwkJZG9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisJd3JpdGVfc3RyKDEsICJjb250aW51aW5nLi4uXHJcbiIpOworCisJaWYgKGJiX2dvdF9zaWduYWwpCisJCWNvb2ttb2RlKCk7CisgcmV0OgorCWJiX2dvdF9zaWduYWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbmV0X291dHB1dChpbnQgbGVuKQoreworCS8qIGhlcmUgd2UgY291bGQgZG8gc21hcnQgdHJpY2tzIGhvdyB0byBoYW5kbGUgMHhGRjpzIGluIG91dHB1dAorCSAqIHN0cmVhbSBsaWtlIHdyaXRpbmcgdHdpY2UgZXZlcnkgc2VxdWVuY2Ugb2YgRkY6cyAodGh1cyBkb2luZworCSAqIG1hbnkgd3JpdGUoKXMuIEJ1dCBJIHRoaW5rIGludGVyYWN0aXZlIHRlbG5ldCBhcHBsaWNhdGlvbiBkb2VzCisJICogbm90IG5lZWQgdG8gYmUgMTAwJSA4LWJpdCBjbGVhbiwgc28gY2hhbmdpbmcgZXZlcnkgMHhmZjpzIHRvCisJICogMHg3ZjpzCisJICoKKwkgKiAyMDAyLW1hci0yMSwgUHJ6ZW15c2xhdyBDemVycGFrIChkcnV6dXNAcG9sYm94LmNvbSkKKwkgKiBJIGRvbid0IGFncmVlLgorCSAqIGZpcnN0IC0gSSBjYW5ub3QgdXNlIHByb2dyYW1zIGxpa2Ugc3ovcnoKKwkgKiBzZWNvbmQgLSB0aGUgMHgwRCBpcyBzZW50IGFzIG9uZSBjaGFyYWN0ZXIgYW5kIGlmIHRoZSBuZXh0CisJICoJY2hhciBpcyAweDBBIHRoZW4gaXQncyBlYXRlbiBieSBhIHNlcnZlciBzaWRlLgorCSAqIHRoaXJkIC0gd2h5IGRvIHlvdSBoYXZlIHRvIG1ha2UgJ21hbnkgd3JpdGUoKXMnPworCSAqCUkgZG9uJ3QgdW5kZXJzdGFuZC4KKwkgKiBTbyBJIGltcGxlbWVudGVkIGl0LiBJdCdzIHJlYWxseSB1c2VmdWwgZm9yIG1lLiBJIGhvcGUgdGhhdAorCSAqIG90aGVyIHBlb3BsZSB3aWxsIGZpbmQgaXQgaW50ZXJlc3RpbmcgdG9vLgorCSAqLworCWJ5dGUgb3V0YnVmWzIgKiBEQVRBQlVGU0laRV07CisJYnl0ZSAqcCA9IChieXRlKilHLmJ1ZjsKKwlpbnQgaiA9IDA7CisKKwlmb3IgKDsgbGVuID4gMDsgbGVuLS0sIHArKykgeworCQlieXRlIGMgPSAqcDsKKwkJaWYgKGMgPT0gMHgxZCkgeworCQkJY29uX2VzY2FwZSgpOworCQkJcmV0dXJuOworCQl9CisJCW91dGJ1ZltqKytdID0gYzsKKwkJaWYgKGMgPT0gSUFDKQorCQkJb3V0YnVmW2orK10gPSBjOyAvKiBJQUMgLT4gSUFDIElBQyAqLworCQllbHNlIGlmIChjID09ICdccicpCisJCQlvdXRidWZbaisrXSA9ICdcMCc7IC8qIENSIC0+IENSIE5VTCAqLworCX0KKwlpZiAoaiA+IDApCisJCWZ1bGxfd3JpdGUobmV0ZmQsIG91dGJ1Ziwgaik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9uZXRfaW5wdXQoaW50IGxlbikKK3sKKwlpbnQgaTsKKwlpbnQgY3N0YXJ0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlieXRlIGMgPSBHLmJ1ZltpXTsKKworCQlpZiAoRy50ZWxzdGF0ZSA9PSBUU19OT1JNQUwpIHsgLyogbW9zdCB0eXBpY2FsIHN0YXRlICovCisJCQlpZiAoYyA9PSBJQUMpIHsKKwkJCQljc3RhcnQgPSBpOworCQkJCUcudGVsc3RhdGUgPSBUU19JQUM7CisJCQl9CisJCQllbHNlIGlmIChjID09ICdccicpIHsKKwkJCQljc3RhcnQgPSBpICsgMTsKKwkJCQlHLnRlbHN0YXRlID0gVFNfQ1I7CisJCQl9CisJCQkvKiBObyBJQUNzIHdlcmUgc2VlbiBzbyBmYXIsIG5vIG5lZWQgdG8gY29weQorCQkJICogYnl0ZXMgd2l0aGluIEcuYnVmOiAqLworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKEcudGVsc3RhdGUpIHsKKwkJY2FzZSBUU19DUjoKKwkJCS8qIFByZXYgY2hhciB3YXMgQ1IuIElmIGN1ciBvbmUgaXMgTlVMLCBpZ25vcmUgaXQuCisJCQkgKiBTZWUgUkZDIDExMjMgc2VjdGlvbiAzLjMuMSBmb3IgZGlzY3Vzc2lvbiBvZiB0ZWxuZXQgRU9MIGhhbmRsaW5nLgorCQkJICovCisJCQlHLnRlbHN0YXRlID0gVFNfQ09QWTsKKwkJCWlmIChjID09ICdcMCcpCisJCQkJYnJlYWs7CisJCQkvKiBlbHNlOiBmYWxsIHRocm91Z2ggLSBuZWVkIHRvIGhhbmRsZSBDUiBJQUMgLi4uIHByb3Blcmx5ICovCisKKwkJY2FzZSBUU19DT1BZOiAvKiBQcmV2IGNoYXIgd2FzIG9yZGluYXJ5ICovCisJCQkvKiBTaW1pbGFyIHRvIE5PUk1BTCwgYnV0IGluIFRTX0NPUFkgd2UgbmVlZCB0byBjb3B5IGJ5dGVzICovCisJCQlpZiAoYyA9PSBJQUMpCisJCQkJRy50ZWxzdGF0ZSA9IFRTX0lBQzsKKwkJCWVsc2UKKwkJCQlHLmJ1Zltjc3RhcnQrK10gPSBjOworCQkJaWYgKGMgPT0gJ1xyJykKKwkJCQlHLnRlbHN0YXRlID0gVFNfQ1I7CisJCQlicmVhazsKKworCQljYXNlIFRTX0lBQzogLyogUHJldiBjaGFyIHdhcyBJQUMgKi8KKwkJCWlmIChjID09IElBQykgeyAvKiBJQUMgSUFDIC0+IG9uZSBJQUMgKi8KKwkJCQlHLmJ1Zltjc3RhcnQrK10gPSBjOworCQkJCUcudGVsc3RhdGUgPSBUU19DT1BZOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSAqLworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlIFNCOgorCQkJCUcudGVsc3RhdGUgPSBUU19TVUIxOworCQkJCWJyZWFrOworCQkJY2FzZSBETzoKKwkJCWNhc2UgRE9OVDoKKwkJCWNhc2UgV0lMTDoKKwkJCWNhc2UgV09OVDoKKwkJCQlHLnRlbHdpc2ggPSBjOworCQkJCUcudGVsc3RhdGUgPSBUU19PUFQ7CisJCQkJYnJlYWs7CisJCQkvKiBEQVRBIE1BUksgbXVzdCBiZSBhZGRlZCBsYXRlciAqLworCQkJZGVmYXVsdDoKKwkJCQlHLnRlbHN0YXRlID0gVFNfQ09QWTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFNfT1BUOiAvKiBQcmV2IGNoYXJzIHdlcmUgSUFDIFdJTEwvV09OVC9ETy9ET05UICovCisJCQl0ZWxvcHQoYyk7CisJCQlHLnRlbHN0YXRlID0gVFNfQ09QWTsKKwkJCWJyZWFrOworCisJCWNhc2UgVFNfU1VCMTogLyogU3VibmVnb3RpYXRpb24gKi8KKwkJY2FzZSBUU19TVUIyOiAvKiBTdWJuZWdvdGlhdGlvbiAqLworCQkJc3VibmVnKGMpOyAvKiBjYW4gY2hhbmdlIEcudGVsc3RhdGUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKEcudGVsc3RhdGUgIT0gVFNfTk9STUFMKSB7CisJCS8qIFdlIGhhZCBzb21lIElBQ3MsIG9yIENSICovCisJCWlmIChHLmlhY2xlbikKKwkJCWlhY19mbHVzaCgpOworCQlpZiAoRy50ZWxzdGF0ZSA9PSBUU19DT1BZKSAvKiB3ZSBhcmVuJ3QgaW4gdGhlIG1pZGRsZSBvZiBJQUMgKi8KKwkJCUcudGVsc3RhdGUgPSBUU19OT1JNQUw7CisJCWxlbiA9IGNzdGFydDsKKwl9CisKKwlpZiAobGVuKQorCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIEcuYnVmLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBwdXRfaWFjKGludCBjKQoreworCUcuaWFjYnVmW0cuaWFjbGVuKytdID0gYzsKK30KKworc3RhdGljIHZvaWQgcHV0X2lhYzIoYnl0ZSB3d2RkLCBieXRlIGMpCit7CisJaWYgKEcuaWFjbGVuICsgMyA+IElBQ0JVRlNJWkUpCisJCWlhY19mbHVzaCgpOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMod3dkZCk7CisJcHV0X2lhYyhjKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9UVFlQRQorc3RhdGljIHZvaWQgcHV0X2lhY19zdWJvcHQoYnl0ZSBjLCBjaGFyICpzdHIpCit7CisJaW50IGxlbiA9IHN0cmxlbihzdHIpICsgNjsgICAvLyAoIDIgKyAxICsgMSArIHN0cmxlbiArIDIgKQorCisJaWYgKEcuaWFjbGVuICsgbGVuID4gSUFDQlVGU0laRSkKKwkJaWFjX2ZsdXNoKCk7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyhTQik7CisJcHV0X2lhYyhjKTsKKwlwdXRfaWFjKDApOworCisJd2hpbGUgKCpzdHIpCisJCXB1dF9pYWMoKnN0cisrKTsKKworCXB1dF9pYWMoSUFDKTsKKwlwdXRfaWFjKFNFKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorc3RhdGljIHZvaWQgcHV0X2lhY19zdWJvcHRfYXV0b2xvZ2luKHZvaWQpCit7CisJaW50IGxlbiA9IHN0cmxlbihHLmF1dG9sb2dpbikgKyA2OwkvLyAoMiArIDEgKyAxICsgc3RybGVuICsgMikKKwljb25zdCBjaGFyICpwID0gIlVTRVIiOworCisJaWYgKEcuaWFjbGVuICsgbGVuID4gSUFDQlVGU0laRSkKKwkJaWFjX2ZsdXNoKCk7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyhTQik7CisJcHV0X2lhYyhURUxPUFRfTkVXX0VOVklST04pOworCXB1dF9pYWMoVEVMUVVBTF9JUyk7CisJcHV0X2lhYyhORVdfRU5WX1ZBUik7CisKKwl3aGlsZSAoKnApCisJCXB1dF9pYWMoKnArKyk7CisKKwlwdXRfaWFjKE5FV19FTlZfVkFMVUUpOworCisJcCA9IEcuYXV0b2xvZ2luOworCXdoaWxlICgqcCkKKwkJcHV0X2lhYygqcCsrKTsKKworCXB1dF9pYWMoSUFDKTsKKwlwdXRfaWFjKFNFKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICitzdGF0aWMgdm9pZCBwdXRfaWFjX25hd3MoYnl0ZSBjLCBpbnQgeCwgaW50IHkpCit7CisJaWYgKEcuaWFjbGVuICsgOSA+IElBQ0JVRlNJWkUpCisJCWlhY19mbHVzaCgpOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0IpOworCXB1dF9pYWMoYyk7CisKKwlwdXRfaWFjKCh4ID4+IDgpICYgMHhmZik7CisJcHV0X2lhYyh4ICYgMHhmZik7CisJcHV0X2lhYygoeSA+PiA4KSAmIDB4ZmYpOworCXB1dF9pYWMoeSAmIDB4ZmYpOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0UpOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyIGNvbnN0IGVzY2FwZWNoYXJpc1tdIEFMSUdOMSA9ICJcclxuRXNjYXBlIGNoYXJhY3RlciBpcyAiOworCitzdGF0aWMgdm9pZCBzZXRDb25Nb2RlKHZvaWQpCit7CisJaWYgKEcudGVsZmxhZ3MgJiBVRl9FQ0hPKSB7CisJCWlmIChHLmNoYXJtb2RlID09IENITV9UUlkpIHsKKwkJCUcuY2hhcm1vZGUgPSBDSE1fT047CisJCQlwcmludGYoIlxyXG5FbnRlcmluZyBjaGFyYWN0ZXIgbW9kZSVzJ15dJy5cclxuIiwgZXNjYXBlY2hhcmlzKTsKKwkJCXJhd21vZGUoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChHLmNoYXJtb2RlICE9IENITV9PRkYpIHsKKwkJCUcuY2hhcm1vZGUgPSBDSE1fT0ZGOworCQkJcHJpbnRmKCJcclxuRW50ZXJpbmcgbGluZSBtb2RlJXMnXkMnLlxyXG4iLCBlc2NhcGVjaGFyaXMpOworCQkJY29va21vZGUoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgd2lsbF9jaGFybW9kZSh2b2lkKQoreworCUcuY2hhcm1vZGUgPSBDSE1fVFJZOworCUcudGVsZmxhZ3MgfD0gKFVGX0VDSE8gfCBVRl9TR0EpOworCXNldENvbk1vZGUoKTsKKworCXB1dF9pYWMyKERPLCBURUxPUFRfRUNITyk7CisJcHV0X2lhYzIoRE8sIFRFTE9QVF9TR0EpOworCWlhY19mbHVzaCgpOworfQorCitzdGF0aWMgdm9pZCBkb19saW5lbW9kZSh2b2lkKQoreworCUcuY2hhcm1vZGUgPSBDSE1fVFJZOworCUcudGVsZmxhZ3MgJj0gfihVRl9FQ0hPIHwgVUZfU0dBKTsKKwlzZXRDb25Nb2RlKCk7CisKKwlwdXRfaWFjMihET05ULCBURUxPUFRfRUNITyk7CisJcHV0X2lhYzIoRE9OVCwgVEVMT1BUX1NHQSk7CisJaWFjX2ZsdXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkIHRvX25vdHN1cChjaGFyIGMpCit7CisJaWYgKEcudGVsd2lzaCA9PSBXSUxMKQorCQlwdXRfaWFjMihET05ULCBjKTsKKwllbHNlIGlmIChHLnRlbHdpc2ggPT0gRE8pCisJCXB1dF9pYWMyKFdPTlQsIGMpOworfQorCitzdGF0aWMgdm9pZCB0b19lY2hvKHZvaWQpCit7CisJLyogaWYgc2VydmVyIHJlcXVlc3RzIEVDSE8sIGRvbid0IGFncmVlICovCisJaWYgKEcudGVsd2lzaCA9PSBETykgeworCQlwdXRfaWFjMihXT05ULCBURUxPUFRfRUNITyk7CisJCXJldHVybjsKKwl9CisJaWYgKEcudGVsd2lzaCA9PSBET05UKQorCQlyZXR1cm47CisKKwlpZiAoRy50ZWxmbGFncyAmIFVGX0VDSE8pIHsKKwkJaWYgKEcudGVsd2lzaCA9PSBXSUxMKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAoRy50ZWx3aXNoID09IFdPTlQpCisJCXJldHVybjsKKworCWlmIChHLmNoYXJtb2RlICE9IENITV9PRkYpCisJCUcudGVsZmxhZ3MgXj0gVUZfRUNITzsKKworCWlmIChHLnRlbGZsYWdzICYgVUZfRUNITykKKwkJcHV0X2lhYzIoRE8sIFRFTE9QVF9FQ0hPKTsKKwllbHNlCisJCXB1dF9pYWMyKERPTlQsIFRFTE9QVF9FQ0hPKTsKKworCXNldENvbk1vZGUoKTsKKwlmdWxsX3dyaXRlMV9zdHIoIlxyXG4iKTsgIC8qIHN1ZGRlbiBtb2RlYyAqLworfQorCitzdGF0aWMgdm9pZCB0b19zZ2Eodm9pZCkKK3sKKwkvKiBkYWVtb24gYWx3YXlzIHNlbmRzIHdpbGwvd29udCwgY2xpZW50IGRvL2RvbnQgKi8KKworCWlmIChHLnRlbGZsYWdzICYgVUZfU0dBKSB7CisJCWlmIChHLnRlbHdpc2ggPT0gV0lMTCkKKwkJCXJldHVybjsKKwl9IGVsc2UgaWYgKEcudGVsd2lzaCA9PSBXT05UKQorCQlyZXR1cm47CisKKwlHLnRlbGZsYWdzIF49IFVGX1NHQTsgLyogdG9nZ2xlICovCisJaWYgKEcudGVsZmxhZ3MgJiBVRl9TR0EpCisJCXB1dF9pYWMyKERPLCBURUxPUFRfU0dBKTsKKwllbHNlCisJCXB1dF9pYWMyKERPTlQsIFRFTE9QVF9TR0EpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCitzdGF0aWMgdm9pZCB0b190dHlwZSh2b2lkKQoreworCS8qIFRlbGwgc2VydmVyIHdlIHdpbGwgKG9yIHdvbid0KSBkbyBUVFlQRSAqLworCWlmIChHLnR0eXBlKQorCQlwdXRfaWFjMihXSUxMLCBURUxPUFRfVFRZUEUpOworCWVsc2UKKwkJcHV0X2lhYzIoV09OVCwgVEVMT1BUX1RUWVBFKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorc3RhdGljIHZvaWQgdG9fbmV3X2Vudmlyb24odm9pZCkKK3sKKwkvKiBUZWxsIHNlcnZlciB3ZSB3aWxsIChvciB3aWxsIG5vdCkgZG8gQVVUT0xPR0lOICovCisJaWYgKEcuYXV0b2xvZ2luKQorCQlwdXRfaWFjMihXSUxMLCBURUxPUFRfTkVXX0VOVklST04pOworCWVsc2UKKwkJcHV0X2lhYzIoV09OVCwgVEVMT1BUX05FV19FTlZJUk9OKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICitzdGF0aWMgdm9pZCB0b19uYXdzKHZvaWQpCit7CisJLyogVGVsbCBzZXJ2ZXIgd2Ugd2lsbCBkbyBOQVdTICovCisJcHV0X2lhYzIoV0lMTCwgVEVMT1BUX05BV1MpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRlbG9wdChieXRlIGMpCit7CisJc3dpdGNoIChjKSB7CisJY2FzZSBURUxPUFRfRUNITzoKKwkJdG9fZWNobygpOyBicmVhazsKKwljYXNlIFRFTE9QVF9TR0E6CisJCXRvX3NnYSgpOyBicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfVFRZUEUKKwljYXNlIFRFTE9QVF9UVFlQRToKKwkJdG9fdHR5cGUoKTsgYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJY2FzZSBURUxPUFRfTkVXX0VOVklST046CisJCXRvX25ld19lbnZpcm9uKCk7IGJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICisJY2FzZSBURUxPUFRfTkFXUzoKKwkJdG9fbmF3cygpOworCQlwdXRfaWFjX25hd3MoYywgRy53aW5fd2lkdGgsIEcud2luX2hlaWdodCk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJdG9fbm90c3VwKGMpOworCQlicmVhazsKKwl9Cit9CisKKy8qIHN1Ym5lZ290aWF0aW9uIC0tIGlnbm9yZSBhbGwgKGV4Y2VwdCBUVFlQRSxOQVdTKSAqLworc3RhdGljIHZvaWQgc3VibmVnKGJ5dGUgYykKK3sKKwlzd2l0Y2ggKEcudGVsc3RhdGUpIHsKKwljYXNlIFRTX1NVQjE6CisJCWlmIChjID09IElBQykKKwkJCUcudGVsc3RhdGUgPSBUU19TVUIyOworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9UVFlQRQorCQllbHNlCisJCWlmIChjID09IFRFTE9QVF9UVFlQRSAmJiBHLnR0eXBlKQorCQkJcHV0X2lhY19zdWJvcHQoVEVMT1BUX1RUWVBFLCBHLnR0eXBlKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KKwkJZWxzZQorCQlpZiAoYyA9PSBURUxPUFRfTkVXX0VOVklST04gJiYgRy5hdXRvbG9naW4pCisJCQlwdXRfaWFjX3N1Ym9wdF9hdXRvbG9naW4oKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIFRTX1NVQjI6CisJCWlmIChjID09IFNFKSB7CisJCQlHLnRlbHN0YXRlID0gVFNfQ09QWTsKKwkJCXJldHVybjsKKwkJfQorCQlHLnRlbHN0YXRlID0gVFNfU1VCMTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCByYXdtb2RlKHZvaWQpCit7CisJaWYgKEcuZG9fdGVybWlvcykKKwkJdGNzZXRhdHRyKDAsIFRDU0FEUkFJTiwgJkcudGVybWlvc19yYXcpOworfQorCitzdGF0aWMgdm9pZCBjb29rbW9kZSh2b2lkKQoreworCWlmIChHLmRvX3Rlcm1pb3MpCisJCXRjc2V0YXR0cigwLCBUQ1NBRFJBSU4sICZHLnRlcm1pb3NfZGVmKTsKK30KKworaW50IHRlbG5ldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGVsbmV0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpob3N0OworCWludCBwb3J0OworCWludCBsZW47CisJc3RydWN0IHBvbGxmZCB1ZmRzWzJdOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgKKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZHLndpbl93aWR0aCwgJkcud2luX2hlaWdodCk7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9UVFlQRQorCUcudHR5cGUgPSBnZXRlbnYoIlRFUk0iKTsKKyNlbmRpZgorCisJaWYgKHRjZ2V0YXR0cigwLCAmRy50ZXJtaW9zX2RlZikgPj0gMCkgeworCQlHLmRvX3Rlcm1pb3MgPSAxOworCQlHLnRlcm1pb3NfcmF3ID0gRy50ZXJtaW9zX2RlZjsKKwkJY2ZtYWtlcmF3KCZHLnRlcm1pb3NfcmF3KTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJaWYgKDEgJiBnZXRvcHQzMihhcmd2LCAiYWw6IiwgJkcuYXV0b2xvZ2luKSkKKwkJRy5hdXRvbG9naW4gPSBnZXRlbnYoIlVTRVIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJYXJndisrOworI2VuZGlmCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCWhvc3QgPSAqYXJndisrOworCXBvcnQgPSBiYl9sb29rdXBfcG9ydCgqYXJndiA/ICphcmd2KysgOiAidGVsbmV0IiwgInRjcCIsIDIzKTsKKwlpZiAoKmFyZ3YpIC8qIGV4dHJhIHBhcmFtcz8/ICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXhtb3ZlX2ZkKGNyZWF0ZV9hbmRfY29ubmVjdF9zdHJlYW1fb3JfZGllKGhvc3QsIHBvcnQpLCBuZXRmZCk7CisKKwlzZXRzb2Nrb3B0KG5ldGZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisKKwlzaWduYWwoU0lHSU5ULCByZWNvcmRfc2lnbm8pOworCisJdWZkc1swXS5mZCA9IFNURElOX0ZJTEVOTzsKKwl1ZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKKwl1ZmRzWzFdLmZkID0gbmV0ZmQ7CisJdWZkc1sxXS5ldmVudHMgPSBQT0xMSU47CisKKwl3aGlsZSAoMSkgeworCQlpZiAocG9sbCh1ZmRzLCAyLCAtMSkgPCAwKSB7CisJCQkvKiBlcnJvciwgaWdub3JlIGFuZC9vciBsb2cgc29tZXRoaW5nLCBiYXkgZ28gdG8gbG9vcCAqLworCQkJaWYgKGJiX2dvdF9zaWduYWwpCisJCQkJY29uX2VzY2FwZSgpOworCQkJZWxzZQorCQkJCXNsZWVwKDEpOworCQkJY29udGludWU7CisJCX0KKworLy8gRklYTUU6IHJlYWRzIGNhbiBibG9jay4gTmVlZCBmdWxsIGJpZGlyZWN0aW9uYWwgYnVmZmVyaW5nLgorCisJCWlmICh1ZmRzWzBdLnJldmVudHMpIHsKKwkJCWxlbiA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIEcuYnVmLCBEQVRBQlVGU0laRSk7CisJCQlpZiAobGVuIDw9IDApCisJCQkJZG9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCQlUUkFDRSgwLCAoIlJlYWQgY29uOiAlZFxuIiwgbGVuKSk7CisJCQloYW5kbGVfbmV0X291dHB1dChsZW4pOworCQl9CisKKwkJaWYgKHVmZHNbMV0ucmV2ZW50cykgeworCQkJbGVuID0gc2FmZV9yZWFkKG5ldGZkLCBHLmJ1ZiwgREFUQUJVRlNJWkUpOworCQkJaWYgKGxlbiA8PSAwKSB7CisJCQkJZnVsbF93cml0ZTFfc3RyKCJDb25uZWN0aW9uIGNsb3NlZCBieSBmb3JlaWduIGhvc3RcclxuIik7CisJCQkJZG9leGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlUUkFDRSgwLCAoIlJlYWQgbmV0ZmQgKCVkKTogJWRcbiIsIG5ldGZkLCBsZW4pKTsKKwkJCWhhbmRsZV9uZXRfaW5wdXQobGVuKTsKKwkJfQorCX0gLyogd2hpbGUgKDEpICovCit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3RlbG5ldGQuYyBiL25ldHdvcmtpbmcvdGVsbmV0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDIwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RlbG5ldGQuYwpAQCAtMCwwICsxLDc0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2ltcGxlIHRlbG5ldCBzZXJ2ZXIKKyAqIEJqb3JuIFdlc2VuLCBBeGlzIENvbW11bmljYXRpb25zIEFCIChiam9ybndAYXhpcy5jb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIChDKSBDb3B5cmlnaHQgMjAwMCwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiwgTFVORCwgU1dFREVOCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSB0ZWxuZXRkIG1hbnBhZ2Ugc2F5cyBpdCBhbGw6CisgKgorICogVGVsbmV0ZCBvcGVyYXRlcyBieSBhbGxvY2F0aW5nIGEgcHNldWRvLXRlcm1pbmFsIGRldmljZSAoc2VlIHB0eSg0KSkgZm9yCisgKiBhIGNsaWVudCwgdGhlbiBjcmVhdGluZyBhIGxvZ2luIHByb2Nlc3Mgd2hpY2ggaGFzIHRoZSBzbGF2ZSBzaWRlIG9mIHRoZQorICogcHNldWRvLXRlcm1pbmFsIGFzIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIuIFRlbG5ldGQgbWFuaXB1bGF0ZXMgdGhlCisgKiBtYXN0ZXIgc2lkZSBvZiB0aGUgcHNldWRvLXRlcm1pbmFsLCBpbXBsZW1lbnRpbmcgdGhlIHRlbG5ldCBwcm90b2NvbCBhbmQKKyAqIHBhc3NpbmcgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSByZW1vdGUgY2xpZW50IGFuZCB0aGUgbG9naW4gcHJvY2Vzcy4KKyAqCisgKiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IDIwMDEKKyAqIFNldCBwcm9jZXNzIGdyb3VwIGNvcnJlY3Rpb25zLCBpbml0aWFsIGJ1c3lib3ggcG9ydAorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgdGVsbmV0ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkhhbmRsZSBpbmNvbWluZyB0ZWxuZXQgY29ubmVjdGlvbnMiCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoIiB2aWEgaW5ldGQiKSAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sIExPR0lOCUV4ZWMgTE9HSU4gb24gY29ubmVjdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgSVNTVUVfRklMRQlEaXNwbGF5IElTU1VFX0ZJTEUgaW5zdGVhZCBvZiAvZXRjL2lzc3VlIgorLy91c2FnZTogICAgICJcbgktSwkJQ2xvc2UgY29ubmVjdGlvbiBhcyBzb29uIGFzIGxvZ2luIGV4aXRzIgorLy91c2FnZTogICAgICJcbgkJCShub3JtYWxseSB3YWl0IHVudGlsIGFsbCBwcm9ncmFtcyBjbG9zZSBzbGF2ZSBwdHkpIgorLy91c2FnZToJSUZfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoCisvL3VzYWdlOiAgICAgIlxuCS1wIFBPUlQJCVBvcnQgdG8gbGlzdGVuIG9uIgorLy91c2FnZTogICAgICJcbgktYiBBRERSWzpQT1JUXQlBZGRyZXNzIHRvIGJpbmQgdG8iCisvL3VzYWdlOiAgICAgIlxuCS1GCQlSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCUluZXRkIG1vZGUiCisvL3VzYWdlOglJRl9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVCgKKy8vdXNhZ2U6ICAgICAiXG4JLXcgU0VDCQlJbmV0ZCAnd2FpdCcgbW9kZSwgbGluZ2VyIHRpbWUgU0VDIgorLy91c2FnZTogICAgICJcbgktUwkJTG9nIHRvIHN5c2xvZyAoaW1wbGllZCBieSAtaSBvciB3aXRob3V0IC1GIGFuZCAtdykiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisKKyNkZWZpbmUgREVCVUcgMAorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworI2lmIERFQlVHCisjIGRlZmluZSBURUxDTURTCisjIGRlZmluZSBURUxPUFRTCisjZW5kaWYKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorCisKK3N0cnVjdCB0c2Vzc2lvbiB7CisJc3RydWN0IHRzZXNzaW9uICpuZXh0OworCXBpZF90IHNoZWxsX3BpZDsKKwlpbnQgc29ja2ZkX3JlYWQ7CisJaW50IHNvY2tmZF93cml0ZTsKKwlpbnQgcHR5ZmQ7CisKKwkvKiB0d28gY2lyY3VsYXIgYnVmZmVycyAqLworCS8qY2hhciAqYnVmMSwgKmJ1ZjI7Ki8KKy8qI2RlZmluZSBUU19CVUYxKHRzKSB0cy0+YnVmMSovCisvKiNkZWZpbmUgVFNfQlVGMih0cykgVFNfQlVGMih0cykqLworI2RlZmluZSBUU19CVUYxKHRzKSAoKHVuc2lnbmVkIGNoYXIqKSh0cyArIDEpKQorI2RlZmluZSBUU19CVUYyKHRzKSAoKCh1bnNpZ25lZCBjaGFyKikodHMgKyAxKSkgKyBCVUZTSVpFKQorCWludCByZGlkeDEsIHdyaWR4MSwgc2l6ZTE7CisJaW50IHJkaWR4Miwgd3JpZHgyLCBzaXplMjsKK307CisKKy8qIFR3byBidWZmZXJzIGFyZSBkaXJlY3RseSBhZnRlciB0c2Vzc2lvbiBpbiBtYWxsb2NlZCBtZW1vcnkuCisgKiBNYWtlIHdob2xlIHRoaW5nIGZpdCBpbiA0ayAqLworZW51bSB7IEJVRlNJWkUgPSAoNCAqIDEwMjQgLSBzaXplb2Yoc3RydWN0IHRzZXNzaW9uKSkgLyAyIH07CisKKworLyogR2xvYmFscyAqLworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCB0c2Vzc2lvbiAqc2Vzc2lvbnM7CisJY29uc3QgY2hhciAqbG9naW5wYXRoOworCWNvbnN0IGNoYXIgKmlzc3VlZmlsZTsKKwlpbnQgbWF4ZmQ7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlHLmxvZ2lucGF0aCA9ICIvYmluL2xvZ2luIjsgXAorCUcuaXNzdWVmaWxlID0gIi9ldGMvaXNzdWUubmV0IjsgXAorfSB3aGlsZSAoMCkKKworCisvKgorICAgUmVtb3ZlIGFsbCBJQUMncyBmcm9tIGJ1ZjEgKHJlY2VpdmVkIElBQ3MgYXJlIGlnbm9yZWQgYW5kIG11c3QgYmUgcmVtb3ZlZAorICAgc28gYXMgdG8gbm90IGJlIGludGVycHJldGVkIGJ5IHRoZSB0ZXJtaW5hbCkuICBNYWtlIGFuIHVuaW50ZXJydXB0ZWQKKyAgIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGZpdCBmb3IgdGhlIHRlcm1pbmFsLiAgRG8gdGhpcyBieSBwYWNraW5nCisgICBhbGwgY2hhcmFjdGVycyBtZWFudCBmb3IgdGhlIHRlcm1pbmFsIHNlcXVlbnRpYWxseSB0b3dhcmRzIHRoZSBlbmQgb2YgYnVmLgorCisgICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlcnMgbWVhbnQgZm9yIHRoZSB0ZXJtaW5hbAorICAgYW5kIG1ha2UgKm51bV90b3R0eSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgc2VudCB0bworICAgdGhlIHRlcm1pbmFsLgorCisgICBOb3RlIC0gaWYgYW4gSUFDICgzIGJ5dGUgcXVhbnRpdHkpIHN0YXJ0cyBiZWZvcmUgKGJmICsgbGVuKSBidXQgZXh0ZW5kcworICAgcGFzdCAoYmYgKyBsZW4pIHRoZW4gdGhhdCBJQUMgd2lsbCBiZSBsZWZ0IHVucHJvY2Vzc2VkIGFuZCAqcHJvY2Vzc2VkCisgICB3aWxsIGJlIGxlc3MgdGhhbiBsZW4uCisKKyAgIENSLUxGIC0+J3MgQ1IgbWFwcGluZyBpcyBhbHNvIGRvbmUgaGVyZSwgZm9yIGNvbnZlbmllbmNlLgorCisgICBOQjogbWF5IGZhaWwgdG8gcmVtb3ZlIGlhY3Mgd2hpY2ggd3JhcCBhcm91bmQgYnVmZmVyIQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCityZW1vdmVfaWFjcyhzdHJ1Y3QgdHNlc3Npb24gKnRzLCBpbnQgKnBudW1fdG90dHkpCit7CisJdW5zaWduZWQgY2hhciAqcHRyMCA9IFRTX0JVRjEodHMpICsgdHMtPndyaWR4MTsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBwdHIwOworCXVuc2lnbmVkIGNoYXIgKnRvdHR5ID0gcHRyOworCXVuc2lnbmVkIGNoYXIgKmVuZCA9IHB0ciArIE1JTihCVUZTSVpFIC0gdHMtPndyaWR4MSwgdHMtPnNpemUxKTsKKwlpbnQgbnVtX3RvdHR5OworCisJd2hpbGUgKHB0ciA8IGVuZCkgeworCQlpZiAoKnB0ciAhPSBJQUMpIHsKKwkJCWNoYXIgYyA9ICpwdHI7CisKKwkJCSp0b3R0eSsrID0gYzsKKwkJCXB0cisrOworCQkJLyogV2UgbWFwIFxyXG4gPT0+IFxyIGZvciBwcmFnbWF0aWMgcmVhc29ucy4KKwkJCSAqIE1hbnkgY2xpZW50IGltcGxlbWVudGF0aW9ucyBzZW5kIFxyXG4gd2hlbgorCQkJICogdGhlIHVzZXIgaGl0cyB0aGUgQ2FycmlhZ2VSZXR1cm4ga2V5LgorCQkJICovCisJCQlpZiAoYyA9PSAnXHInICYmIHB0ciA8IGVuZCAmJiAoKnB0ciA9PSAnXG4nIHx8ICpwdHIgPT0gJ1wwJykpCisJCQkJcHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocHRyKzEpID49IGVuZCkKKwkJCWJyZWFrOworCQlpZiAocHRyWzFdID09IE5PUCkgeyAvKiBJZ25vcmU/IChwdXR0eSBrZWVwYWxpdmUsIGV0Yy4pICovCisJCQlwdHIgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwdHJbMV0gPT0gSUFDKSB7IC8qIExpdGVyYWwgSUFDPyAoZW1hY3MgTS1ERUwpICovCisJCQkqdG90dHkrKyA9IHB0clsxXTsKKwkJCXB0ciArPSAyOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBURUxPUFRfTkFXUyBzdXBwb3J0IQorCQkgKi8KKwkJaWYgKChwdHIrMikgPj0gZW5kKSB7CisJCQkvKiBPbmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlIElBQyBpcyBpbiB0aGUKKwkJCWJ1ZmZlciB3ZSB3ZXJlIGFza2VkIHRvIHByb2Nlc3MsIHdlIGNhbid0CisJCQlwcm9jZXNzIHRoaXMgY2hhciAqLworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogSUFDIC0+IFNCIC0+IFRFTE9QVF9OQVdTIC0+IDQtYnl0ZSAtPiBJQUMgLT4gU0UKKwkJICovCisJCWlmIChwdHJbMV0gPT0gU0IgJiYgcHRyWzJdID09IFRFTE9QVF9OQVdTKSB7CisJCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKKwkJCWlmICgocHRyKzgpID49IGVuZCkKKwkJCQlicmVhazsgIC8qIGluY29tcGxldGUsIGNhbid0IHByb2Nlc3MgKi8KKwkJCXdzLndzX2NvbCA9IChwdHJbM10gPDwgOCkgfCBwdHJbNF07CisJCQl3cy53c19yb3cgPSAocHRyWzVdIDw8IDgpIHwgcHRyWzZdOworCQkJaW9jdGwodHMtPnB0eWZkLCBUSU9DU1dJTlNaLCAoY2hhciAqKSZ3cyk7CisJCQlwdHIgKz0gOTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIHNraXAgMy1ieXRlIElBQyBub24tU0IgY21kICovCisjaWYgREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJJZ25vcmluZyBJQUMgJXMsJXNcbiIsCisJCQkJVEVMQ01EKHB0clsxXSksIFRFTE9QVChwdHJbMl0pKTsKKyNlbmRpZgorCQlwdHIgKz0gMzsKKwl9CisKKwludW1fdG90dHkgPSB0b3R0eSAtIHB0cjA7CisJKnBudW1fdG90dHkgPSBudW1fdG90dHk7CisJLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwdHIgYW5kIHRvdHR5IGlzIG51bWJlciBvZiBpYWNzCisJICAgd2UgcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0uIEFkanVzdCBidWYxIGFjY29yZGluZ2x5ICovCisJaWYgKChwdHIgLSB0b3R0eSkgPT0gMCkgLyogOTkuOTk5JSBvZiBjYXNlcyAqLworCQlyZXR1cm4gcHRyMDsKKwl0cy0+d3JpZHgxICs9IHB0ciAtIHRvdHR5OworCXRzLT5zaXplMSAtPSBwdHIgLSB0b3R0eTsKKwkvKiBNb3ZlIGNoYXJzIG1lYW50IGZvciB0aGUgdGVybWluYWwgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwlyZXR1cm4gbWVtbW92ZShwdHIgLSBudW1fdG90dHksIHB0cjAsIG51bV90b3R0eSk7Cit9CisKKy8qCisgKiBDb252ZXJ0aW5nIHNpbmdsZSBJQUMgaW50byBkb3VibGUgb24gb3V0cHV0CisgKi8KK3N0YXRpYyBzaXplX3QgaWFjX3NhZmVfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpJQUNwdHI7CisJc2l6ZV90IHdyLCByYywgdG90YWw7CisKKwl0b3RhbCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm4gdG90YWw7CisJCWlmICgqYnVmID09IChjaGFyKUlBQykgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgSUFDSUFDW10gQUxJR04xID0geyBJQUMsIElBQyB9OworCQkJcmMgPSBzYWZlX3dyaXRlKGZkLCBJQUNJQUMsIDIpOworCQkJaWYgKHJjICE9IDIpCisJCQkJYnJlYWs7CisJCQlidWYrKzsKKwkJCXRvdGFsKys7CisJCQljb3VudC0tOworCQkJY29udGludWU7CisJCX0KKwkJLyogY291bnQgIT0gMCwgKmJ1ZiAhPSBJQUMgKi8KKwkJSUFDcHRyID0gbWVtY2hyKGJ1ZiwgSUFDLCBjb3VudCk7CisJCXdyID0gY291bnQ7CisJCWlmIChJQUNwdHIpCisJCQl3ciA9IElBQ3B0ciAtIGJ1ZjsKKwkJcmMgPSBzYWZlX3dyaXRlKGZkLCBidWYsIHdyKTsKKwkJaWYgKHJjICE9IHdyKQorCQkJYnJlYWs7CisJCWJ1ZiArPSByYzsKKwkJdG90YWwgKz0gcmM7CisJCWNvdW50IC09IHJjOworCX0KKwkvKiBoZXJlOiByYyAtIHJlc3VsdCBvZiBsYXN0IHNob3J0IHdyaXRlICovCisJaWYgKChzc2l6ZV90KXJjIDwgMCkgeyAvKiBlcnJvcj8gKi8KKwkJaWYgKHRvdGFsID09IDApCisJCQlyZXR1cm4gcmM7CisJCXJjID0gMDsKKwl9CisJcmV0dXJuIHRvdGFsICsgcmM7Cit9CisKKy8qIE11c3QgbWF0Y2ggZ2V0b3B0MzIgc3RyaW5nICovCitlbnVtIHsKKwlPUFRfV0FUQ0hDSElMRCA9ICgxIDw8IDIpLCAvKiAtSyAqLworCU9QVF9JTkVURCAgICAgID0gKDEgPDwgMykgKiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUsIC8qIC1pICovCisJT1BUX1BPUlQgICAgICAgPSAoMSA8PCA0KSAqIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSwgLyogLXAgUE9SVCAqLworCU9QVF9GT1JFR1JPVU5EID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUsIC8qIC1GICovCisJT1BUX1NZU0xPRyAgICAgPSAoMSA8PCA3KSAqIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVCwgLyogLVMgKi8KKwlPUFRfV0FJVCAgICAgICA9ICgxIDw8IDgpICogRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlULCAvKiAtdyBTRUMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdHNlc3Npb24gKgorbWFrZV9uZXdfc2Vzc2lvbigKKwkJSUZfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoaW50IHNvY2spCisJCUlGX05PVF9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSh2b2lkKQorKSB7CisjaWYgIUVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCWVudW0geyBzb2NrID0gMCB9OworI2VuZGlmCisJY29uc3QgY2hhciAqbG9naW5fYXJndlsyXTsKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtYnVmOworCWludCBmZCwgcGlkOworCWNoYXIgdHR5X25hbWVbR0VUUFRZX0JVRlNJWkVdOworCXN0cnVjdCB0c2Vzc2lvbiAqdHMgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgdHNlc3Npb24pICsgQlVGU0laRSAqIDIpOworCisJLyp0cy0+YnVmMSA9IChjaGFyICopKHRzICsgMSk7Ki8KKwkvKnRzLT5idWYyID0gdHMtPmJ1ZjEgKyBCVUZTSVpFOyovCisKKwkvKiBHb3QgYSBuZXcgY29ubmVjdGlvbiwgc2V0IHVwIGEgdHR5ICovCisJZmQgPSB4Z2V0cHR5KHR0eV9uYW1lKTsKKwlpZiAoZmQgPiBHLm1heGZkKQorCQlHLm1heGZkID0gZmQ7CisJdHMtPnB0eWZkID0gZmQ7CisJbmRlbGF5X29uKGZkKTsKKwljbG9zZV9vbl9leGVjX29uKGZkKTsKKworCS8qIFNPX0tFRVBBTElWRSBieSBwb3B1bGFyIGRlbWFuZCAqLworCXNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCXRzLT5zb2NrZmRfcmVhZCA9IHNvY2s7CisJbmRlbGF5X29uKHNvY2spOworCWlmIChzb2NrID09IDApIHsgLyogV2UgYXJlIGNhbGxlZCB3aXRoIGZkIDAgLSB3ZSBhcmUgaW4gaW5ldGQgbW9kZSAqLworCQlzb2NrKys7IC8qIHNvIHVzZSBmZCAxIGZvciBvdXRwdXQgKi8KKwkJbmRlbGF5X29uKHNvY2spOworCX0KKwl0cy0+c29ja2ZkX3dyaXRlID0gc29jazsKKwlpZiAoc29jayA+IEcubWF4ZmQpCisJCUcubWF4ZmQgPSBzb2NrOworI2Vsc2UKKwkvKiB0cy0+c29ja2ZkX3JlYWQgPSAwOyAtIGRvbmUgYnkgeHphbGxvYyAqLworCXRzLT5zb2NrZmRfd3JpdGUgPSAxOworCW5kZWxheV9vbigwKTsKKwluZGVsYXlfb24oMSk7CisjZW5kaWYKKworCS8qIE1ha2UgdGhlIHRlbG5ldCBjbGllbnQgdW5kZXJzdGFuZCB3ZSB3aWxsIGVjaG8gY2hhcmFjdGVycyBzbyBpdAorCSAqIHNob3VsZCBub3QgZG8gaXQgbG9jYWxseS4gV2UgZG9uJ3QgdGVsbCB0aGUgY2xpZW50IHRvIHJ1biBsaW5lbW9kZSwKKwkgKiBiZWNhdXNlIHdlIHdhbnQgdG8gaGFuZGxlIGxpbmUgZWRpdGluZyBhbmQgdGFiIGNvbXBsZXRpb24gYW5kIG90aGVyCisJICogc3R1ZmYgdGhhdCByZXF1aXJlcyBjaGFyLWJ5LWNoYXIgc3VwcG9ydC4gKi8KKwl7CisJCXN0YXRpYyBjb25zdCBjaGFyIGlhY3NfdG9fc2VuZFtdIEFMSUdOMSA9IHsKKwkJCUlBQywgRE8sIFRFTE9QVF9FQ0hPLAorCQkJSUFDLCBETywgVEVMT1BUX05BV1MsCisJCQkvKiBUaGlzIHJlcXVpcmVzIHRlbG5ldGQuY3RybFNRLnBhdGNoIChpbmNvbXBsZXRlKSAqLworCQkJLypJQUMsIERPLCBURUxPUFRfTEZMT1csKi8KKwkJCUlBQywgV0lMTCwgVEVMT1BUX0VDSE8sCisJCQlJQUMsIFdJTEwsIFRFTE9QVF9TR0EKKwkJfTsKKwkJLyogVGhpcyBjb25mdXNlcyBpYWNfc2FmZV93cml0ZSgpLCBpdCB3aWxsIHRyeSB0byBkdXBsaWNhdGUKKwkJICogZWFjaCBJQUMuLi4gKi8KKwkJLy9tZW1jcHkoVFNfQlVGMih0cyksIGlhY3NfdG9fc2VuZCwgc2l6ZW9mKGlhY3NfdG9fc2VuZCkpOworCQkvL3RzLT5yZGlkeDIgPSBzaXplb2YoaWFjc190b19zZW5kKTsKKwkJLy90cy0+c2l6ZTIgPSBzaXplb2YoaWFjc190b19zZW5kKTsKKwkJLyogU28ganVzdCBzdHVmZiBpdCBpbnRvIFRDUCBzdHJlYW0hIChubyBlcnJvciBjaGVjay4uLikgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKwkJc2FmZV93cml0ZShzb2NrLCBpYWNzX3RvX3NlbmQsIHNpemVvZihpYWNzX3RvX3NlbmQpKTsKKyNlbHNlCisJCXNhZmVfd3JpdGUoMSwgaWFjc190b19zZW5kLCBzaXplb2YoaWFjc190b19zZW5kKSk7CisjZW5kaWYKKwkJLyp0cy0+cmRpZHgyID0gMDsgLSB4emFsbG9jIGRpZCBpdCAqLworCQkvKnRzLT5zaXplMiA9IDA7Ki8KKwl9CisKKwlmZmx1c2hfYWxsKCk7CisJcGlkID0gdmZvcmsoKTsgLyogTk9NTVUtZnJpZW5kbHkgKi8KKwlpZiAocGlkIDwgMCkgeworCQlmcmVlKHRzKTsKKwkJY2xvc2UoZmQpOworCQkvKiBzb2NrIHdpbGwgYmUgY2xvc2VkIGJ5IGNhbGxlciAqLworCQliYl9wZXJyb3JfbXNnKCJ2Zm9yayIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHBpZCA+IDApIHsKKwkJLyogUGFyZW50ICovCisJCXRzLT5zaGVsbF9waWQgPSBwaWQ7CisJCXJldHVybiB0czsKKwl9CisKKwkvKiBDaGlsZCAqLworCS8qIENhcmVmdWwgLSB3ZSBhcmUgYWZ0ZXIgdmZvcmshICovCisKKwkvKiBSZXN0b3JlIGRlZmF1bHQgc2lnbmFsIGhhbmRsaW5nIEFTQVAgKi8KKwliYl9zaWduYWxzKCgxIDw8IFNJR0NITEQpICsgKDEgPDwgU0lHUElQRSksIFNJR19ERkwpOworCisJcGlkID0gZ2V0cGlkKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVVRNUCkgeworCQlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBnZXRfcGVlcl9sc2Eoc29jayk7CisJCWNoYXIgKmhvc3RuYW1lID0gTlVMTDsKKwkJaWYgKGxzYSkgeworCQkJaG9zdG5hbWUgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbHNhLT51LnNhKTsKKwkJCWZyZWUobHNhKTsKKwkJfQorCQl3cml0ZV9uZXdfdXRtcChwaWQsIExPR0lOX1BST0NFU1MsIHR0eV9uYW1lLCAvKnVzZXJuYW1lOiovICJMT0dJTiIsIGhvc3RuYW1lKTsKKwkJZnJlZShob3N0bmFtZSk7CisJfQorCisJLyogTWFrZSBuZXcgc2Vzc2lvbiBhbmQgcHJvY2VzcyBncm91cCAqLworCXNldHNpZCgpOworCisJLyogT3BlbiB0aGUgY2hpbGQncyBzaWRlIG9mIHRoZSB0dHkgKi8KKwkvKiBOQjogc2V0c2lkKCkgZGlzY29ubmVjdHMgZnJvbSBhbnkgcHJldmlvdXMgY3R0eSdzLiBUaGVyZWZvcmUKKwkgKiB3ZSBtdXN0IG9wZW4gY2hpbGQncyBzaWRlIG9mIHRoZSB0dHkgQUZURVIgc2V0c2lkISAqLworCWNsb3NlKDApOworCXhvcGVuKHR0eV9uYW1lLCBPX1JEV1IpOyAvKiBiZWNvbWVzIG91ciBjdHR5ICovCisJeGR1cDIoMCwgMSk7CisJeGR1cDIoMCwgMik7CisJdGNzZXRwZ3JwKDAsIHBpZCk7IC8qIHN3aXRjaCB0aGlzIHR0eSdzIHByb2Nlc3MgZ3JvdXAgdG8gdXMgKi8KKworCS8qIFRoZSBwc2V1ZG8tdGVybWluYWwgYWxsb2NhdGVkIHRvIHRoZSBjbGllbnQgaXMgY29uZmlndXJlZCB0byBvcGVyYXRlCisJICogaW4gY29va2VkIG1vZGUsIGFuZCB3aXRoIFhUQUJTIENSTU9EIGVuYWJsZWQgKHNlZSB0dHkoNCkpICovCisJdGNnZXRhdHRyKDAsICZ0ZXJtYnVmKTsKKwl0ZXJtYnVmLmNfbGZsYWcgfD0gRUNITzsgLyogaWYgd2UgdXNlIHJlYWRsaW5lIHdlIGRvbnQgd2FudCB0aGlzICovCisJdGVybWJ1Zi5jX29mbGFnIHw9IE9OTENSIHwgWFRBQlM7CisJdGVybWJ1Zi5jX2lmbGFnIHw9IElDUk5MOworCXRlcm1idWYuY19pZmxhZyAmPSB+SVhPRkY7CisJLyp0ZXJtYnVmLmNfbGZsYWcgJj0gfklDQU5PTjsqLworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtYnVmKTsKKworCS8qIFVzZXMgRklMRS1iYXNlZCBJL08gdG8gc3Rkb3V0LCBidXQgZG9lcyBmZmx1c2hfYWxsKCksCisJICogc28gc2hvdWxkIGJlIHNhZmUgd2l0aCB2Zm9yay4KKwkgKiBJIGZlYXIsIHRob3VnaCwgdGhhdCBzb21lIHVzZXJzIHdpbGwgaGF2ZSByaWRpY3Vsb3VzbHkgYmlnCisJICogaXNzdWUgZmlsZXMsIGFuZCB0aGV5IG1heSBibG9jayB3cml0aW5nIHRvIGZkIDEsCisJICogKHBhcmVudCBpcyBzdXBwb3NlZCB0byByZWFkIGl0LCBidXQgcGFyZW50IHdhaXRzCisJICogZm9yIHZmb3JrZWQgY2hpbGQgdG8gZXhlYyEpICovCisJcHJpbnRfbG9naW5faXNzdWUoRy5pc3N1ZWZpbGUsIHR0eV9uYW1lKTsKKworCS8qIEV4ZWMgc2hlbGwgLyBsb2dpbiAvIHdoYXRldmVyICovCisJbG9naW5fYXJndlswXSA9IEcubG9naW5wYXRoOworCWxvZ2luX2FyZ3ZbMV0gPSBOVUxMOworCS8qIGV4ZWMgYnVzeWJveCBhcHBsZXQgKGlmIFBSRUZFUl9BUFBMRVRTPXkpLCBpZiB0aGF0IGZhaWxzLAorCSAqIGV4ZWMgZXh0ZXJuYWwgcHJvZ3JhbS4KKwkgKiBOQjogc29jayBpcyBlaXRoZXIgMCBvciBoYXMgQ0xPRVhFQyBzZXQgb24gaXQuCisJICogZmQgaGFzIENMT0VYRUMgc2V0IG9uIGl0IHRvby4gVGhlc2UgdHdvIGZkcyB3aWxsIGJlIGNsb3NlZCBoZXJlLgorCSAqLworCUJCX0VYRUNWUChHLmxvZ2lucGF0aCwgKGNoYXIgKiopbG9naW5fYXJndik7CisJLyogX2V4aXQgaXMgc2FmZXIgd2l0aCB2Zm9yaywgYW5kIHdlIHNob3VsZG4ndCBzZW5kIG1lc3NhZ2UKKwkgKiB0byByZW1vdGUgY2xpZW50cyBhbnl3YXkgKi8KKwlfZXhpdChFWElUX0ZBSUxVUkUpOyAvKmJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXhlY3YgJXMiLCBHLmxvZ2lucGF0aCk7Ki8KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCitzdGF0aWMgdm9pZAorZnJlZV9zZXNzaW9uKHN0cnVjdCB0c2Vzc2lvbiAqdHMpCit7CisJc3RydWN0IHRzZXNzaW9uICp0OworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfSU5FVEQpCisJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKworCS8qIFVubGluayB0aGlzIHRlbG5ldCBzZXNzaW9uIGZyb20gdGhlIHNlc3Npb24gbGlzdCAqLworCXQgPSBHLnNlc3Npb25zOworCWlmICh0ID09IHRzKQorCQlHLnNlc3Npb25zID0gdHMtPm5leHQ7CisJZWxzZSB7CisJCXdoaWxlICh0LT5uZXh0ICE9IHRzKQorCQkJdCA9IHQtPm5leHQ7CisJCXQtPm5leHQgPSB0cy0+bmV4dDsKKwl9CisKKyNpZiAwCisJLyogSXQgd2FzIHNhaWQgdGhhdCAibm9ybWFsIiB0ZWxuZXRkIGp1c3QgY2xvc2VzIHB0eWZkLAorCSAqIGRvZXNuJ3Qgc2VuZCBTSUdLSUxMLiBXaGVuIHdlIGNsb3NlIHB0eWZkLAorCSAqIGtlcm5lbCBzZW5kcyBTSUdIVVAgdG8gcHJvY2Vzc2VzIGhhdmluZyBzbGF2ZSBzaWRlIG9wZW5lZC4gKi8KKwlraWxsKHRzLT5zaGVsbF9waWQsIFNJR0tJTEwpOworCXdhaXRwaWQodHMtPnNoZWxsX3BpZCwgTlVMTCwgMCk7CisjZW5kaWYKKwljbG9zZSh0cy0+cHR5ZmQpOworCWNsb3NlKHRzLT5zb2NrZmRfcmVhZCk7CisJLyogV2UgZG8gbm90IG5lZWQgdG8gY2xvc2UodHMtPnNvY2tmZF93cml0ZSksIGl0J3MgdGhlIHNhbWUKKwkgKiBhcyBzb2NrZmRfcmVhZCB1bmxlc3Mgd2UgYXJlIGluIGluZXRkIG1vZGUuIEJ1dCBpbiBpbmV0ZCBtb2RlCisJICogd2UgZG8gbm90IHJlYWNoIHRoaXMgKi8KKwlmcmVlKHRzKTsKKworCS8qIFNjYW4gYWxsIHNlc3Npb25zIGFuZCBmaW5kIG5ldyBtYXhmZCAqLworCUcubWF4ZmQgPSAwOworCXRzID0gRy5zZXNzaW9uczsKKwl3aGlsZSAodHMpIHsKKwkJaWYgKEcubWF4ZmQgPCB0cy0+cHR5ZmQpCisJCQlHLm1heGZkID0gdHMtPnB0eWZkOworCQlpZiAoRy5tYXhmZCA8IHRzLT5zb2NrZmRfcmVhZCkKKwkJCUcubWF4ZmQgPSB0cy0+c29ja2ZkX3JlYWQ7CisjaWYgMAorCQkvKiBBZ2Fpbiwgc29ja2ZkX3dyaXRlID09IHNvY2tmZF9yZWFkIGhlcmUgKi8KKwkJaWYgKEcubWF4ZmQgPCB0cy0+c29ja2ZkX3dyaXRlKQorCQkJRy5tYXhmZCA9IHRzLT5zb2NrZmRfd3JpdGU7CisjZW5kaWYKKwkJdHMgPSB0cy0+bmV4dDsKKwl9Cit9CisKKyNlbHNlIC8qICFGRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSAqLworCisvKiBVc2VkIGluIG1haW4oKSBvbmx5LCB0aHVzICJyZXR1cm4gMCIgYWN0dWFsbHkgaXMgZXhpdChFWElUX1NVQ0NFU1MpLiAqLworI2RlZmluZSBmcmVlX3Nlc3Npb24odHMpIHJldHVybiAwCisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoYW5kbGVfc2lnY2hsZChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlwaWRfdCBwaWQ7CisJc3RydWN0IHRzZXNzaW9uICp0czsKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCisJLyogTG9vcGluZzogbW9yZSB0aGFuIG9uZSBjaGlsZCBtYXkgaGF2ZSBleGl0ZWQgKi8KKwl3aGlsZSAoMSkgeworCQlwaWQgPSB3YWl0X2FueV9ub2hhbmcoTlVMTCk7CisJCWlmIChwaWQgPD0gMCkKKwkJCWJyZWFrOworCQl0cyA9IEcuc2Vzc2lvbnM7CisJCXdoaWxlICh0cykgeworCQkJaWYgKHRzLT5zaGVsbF9waWQgPT0gcGlkKSB7CisJCQkJdHMtPnNoZWxsX3BpZCA9IC0xOworLy8gbWFuIHV0bXA6CisvLyBXaGVuIGluaXQoOCkgZmluZHMgdGhhdCBhIHByb2Nlc3MgaGFzIGV4aXRlZCwgaXQgbG9jYXRlcyBpdHMgdXRtcCBlbnRyeQorLy8gYnkgdXRfcGlkLCBzZXRzIHV0X3R5cGUgdG8gREVBRF9QUk9DRVNTLCBhbmQgY2xlYXJzIHV0X3VzZXIsIHV0X2hvc3QKKy8vIGFuZCB1dF90aW1lIHdpdGggbnVsbCBieXRlcy4KKy8vIFtzYW1lIGFwcGxpZXMgdG8gb3RoZXIgcHJvY2Vzc2VzIHdoaWNoIG1haW50YWluIHV0bXAgZW50cmllcywgbGlrZSB0ZWxuZXRkXQorLy8KKy8vIFdlIGRvIG5vdCBib3RoZXIgYWN0dWFsbHkgY2xlYXJpbmcgZmllbGRzOgorLy8gaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8ga25vdyB3aG8gd2FzIGxvZ2dlZCBpbiBhbmQgZnJvbSB3aGVyZQorCQkJCXVwZGF0ZV91dG1wKHBpZCwgREVBRF9QUk9DRVNTLCAvKnR0eV9uYW1lOiovIE5VTEwsIC8qdXNlcm5hbWU6Ki8gTlVMTCwgLypob3N0bmFtZToqLyBOVUxMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRzID0gdHMtPm5leHQ7CisJCX0KKwl9CisKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKK2ludCB0ZWxuZXRkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0ZWxuZXRkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlmZF9zZXQgcmRmZHNldCwgd3JmZHNldDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGNvdW50OworCXN0cnVjdCB0c2Vzc2lvbiAqdHM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisjZGVmaW5lIElTX0lORVREIChvcHQgJiBPUFRfSU5FVEQpCisJaW50IG1hc3Rlcl9mZCA9IG1hc3Rlcl9mZDsgLyogZm9yIGNvbXBpbGVyICovCisJaW50IHNlY19saW5nZXIgPSBzZWNfbGluZ2VyOworCWNoYXIgKm9wdF9iaW5kYWRkciA9IE5VTEw7CisJY2hhciAqb3B0X3BvcnRuYnI7CisjZWxzZQorCWVudW0geworCQlJU19JTkVURCA9IDEsCisJCW1hc3Rlcl9mZCA9IC0xLAorCX07CisjZW5kaWYKKwlJTklUX0coKTsKKworCS8qIC13IE5VTSwgYW5kIGltcGxpZXMgLUYuIC13IGFuZCAtaSBkb24ndCBtaXggKi8KKwlJRl9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVChvcHRfY29tcGxlbWVudGFyeSA9ICJ3Rjp3KzppLS13OnctLWkiOykKKwkvKiBFdmVuIGlmICFTVEFOREFMT05FLCB3ZSBhY2NlcHQgKGFuZCBpZ25vcmUpIC1pLCB0aHVzIHBlb3BsZQorCSAqIGRvbid0IG5lZWQgdG8gZ3Vlc3Mgd2hldGhlciBpdCdzIG9rIHRvIHBhc3MgLWkgdG8gdXMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZjpsOktpIgorCQkJSUZfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoInA6YjpGIikKKwkJCUlGX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUKCJTdzoiKSwKKwkJCSZHLmlzc3VlZmlsZSwgJkcubG9naW5wYXRoCisJCQlJRl9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSgsICZvcHRfcG9ydG5iciwgJm9wdF9iaW5kYWRkcikKKwkJCUlGX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUKCwgJnNlY19saW5nZXIpCisJKTsKKwlpZiAoIUlTX0lORVREIC8qJiYgIXJlX2V4ZWNlZCovKSB7CisJCS8qIGluZm9ybSB0aGF0IHdlIHN0YXJ0IGluIHN0YW5kYWxvbmUgbW9kZT8KKwkJICogTWF5IGJlIHVzZWZ1bCB3aGVuIHBlb3BsZSBmb3JnZXQgdG8gZ2l2ZSAtaSAqLworCQkvKmJiX2Vycm9yX21zZygibGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyIpOyovCisJCWlmICghKG9wdCAmIE9QVF9GT1JFR1JPVU5EKSkgeworCQkJLyogREFFTU9OX0NIRElSX1JPT1Qgd2FzIGdpdmluZyBpbmNvbnNpc3RlbnQKKwkJCSAqIGJlaGF2aW9yIHdpdGgvd2l0aG91dCAtRiwgLWkgKi8KKwkJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwIC8qd2FzIERBRU1PTl9DSERJUl9ST09UKi8sIGFyZ3YpOworCQl9CisJfQorCS8qIFJlZGlyZWN0IGxvZyB0byBzeXNsb2cgZWFybHksIGlmIG5lZWRlZCAqLworCWlmIChJU19JTkVURCB8fCAob3B0ICYgT1BUX1NZU0xPRykgfHwgIShvcHQgJiBPUFRfRk9SRUdST1VORCkpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJaWYgKElTX0lORVREKSB7CisJCUcuc2Vzc2lvbnMgPSBtYWtlX25ld19zZXNzaW9uKDApOworCQlpZiAoIUcuc2Vzc2lvbnMpIC8qIHB0eSBvcGVuaW5nIG9yIHZmb3JrIHByb2JsZW0sIGV4aXQgKi8KKwkJCXJldHVybiAxOyAvKiBtYWtlX25ld19zZXNzaW9uIHByaW50ZWQgZXJyb3IgbWVzc2FnZSAqLworCX0gZWxzZSB7CisJCW1hc3Rlcl9mZCA9IDA7CisJCWlmICghKG9wdCAmIE9QVF9XQUlUKSkgeworCQkJdW5zaWduZWQgcG9ydG5iciA9IDIzOworCQkJaWYgKG9wdCAmIE9QVF9QT1JUKQorCQkJCXBvcnRuYnIgPSB4YXRvdTE2KG9wdF9wb3J0bmJyKTsKKwkJCW1hc3Rlcl9mZCA9IGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKG9wdF9iaW5kYWRkciwgcG9ydG5icik7CisJCQl4bGlzdGVuKG1hc3Rlcl9mZCwgMSk7CisJCX0KKwkJY2xvc2Vfb25fZXhlY19vbihtYXN0ZXJfZmQpOworCX0KKyNlbHNlCisJRy5zZXNzaW9ucyA9IG1ha2VfbmV3X3Nlc3Npb24oKTsKKwlpZiAoIUcuc2Vzc2lvbnMpIC8qIHB0eSBvcGVuaW5nIG9yIHZmb3JrIHByb2JsZW0sIGV4aXQgKi8KKwkJcmV0dXJuIDE7IC8qIG1ha2VfbmV3X3Nlc3Npb24gcHJpbnRlZCBlcnJvciBtZXNzYWdlICovCisjZW5kaWYKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gZGllIGlmIGp1c3Qgb25lIHNlc3Npb24gaXMgYnJva2VuICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJaWYgKG9wdCAmIE9QVF9XQVRDSENISUxEKQorCQlzaWduYWwoU0lHQ0hMRCwgaGFuZGxlX3NpZ2NobGQpOworCWVsc2UgLyogcHJldmVudCBkZWFkIGNoaWxkcmVuIGZyb20gYmVjb21pbmcgem9tYmllcyAqLworCQlzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7CisKKy8qCisgICBUaGlzIGlzIGhvdyB0aGUgYnVmZmVycyBhcmUgdXNlZC4gVGhlIGFycm93cyBpbmRpY2F0ZSBkYXRhIGZsb3cuCisKKyAgICstLS0tLS0tKyAgICAgd3JpZHgxKysgICAgICstLS0tLS0rICAgICByZGlkeDErKyAgICAgKy0tLS0tLS0tLS0rCisgICB8ICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tICB8IGJ1ZjEgfCA8LS0tLS0tLS0tLS0tLS0gIHwgICAgICAgICAgfAorICAgfCAgICAgICB8ICAgICBzaXplMS0tICAgICAgKy0tLS0tLSsgICAgIHNpemUxKysgICAgICB8ICAgICAgICAgIHwKKyAgIHwgIHB0eSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgc29ja2V0ICB8CisgICB8ICAgICAgIHwgICAgIHJkaWR4MisrICAgICArLS0tLS0tKyAgICAgd3JpZHgyKysgICAgIHwgICAgICAgICAgfAorICAgfCAgICAgICB8ICAtLS0tLS0tLS0tLS0tLT4gfCBidWYyIHwgIC0tLS0tLS0tLS0tLS0tPiB8ICAgICAgICAgIHwKKyAgICstLS0tLS0tKyAgICAgc2l6ZTIrKyAgICAgICstLS0tLS0rICAgICBzaXplMi0tICAgICAgKy0tLS0tLS0tLS0rCisKKyAgIHNpemUxOiAiaG93IG1hbnkgYnl0ZXMgYXJlIGJ1ZmZlcmVkIGZvciBwdHkgYmV0d2VlbiByZGlkeDEgYW5kIHdyaWR4MT8iCisgICBzaXplMjogImhvdyBtYW55IGJ5dGVzIGFyZSBidWZmZXJlZCBmb3Igc29ja2V0IGJldHdlZW4gcmRpZHgyIGFuZCB3cmlkeDI/IgorCisgICBFYWNoIHNlc3Npb24gaGFzIGdvdCB0d28gYnVmZmVycy4gQnVmZmVycyBhcmUgY2lyY3VsYXIuIElmIHNpemVOID09IDAsCisgICBidWZmZXIgaXMgZW1wdHkuIElmIHNpemVOID09IEJVRlNJWkUsIGJ1ZmZlciBpcyBmdWxsLiBJbiBib3RoIHRoZXNlIGNhc2VzCisgICByZGlkeE4gPT0gd3JpZHhOLgorKi8KKyBhZ2FpbjoKKwlGRF9aRVJPKCZyZGZkc2V0KTsKKwlGRF9aRVJPKCZ3cmZkc2V0KTsKKworCS8qIFNlbGVjdCBvbiB0aGUgbWFzdGVyIHNvY2tldCwgYWxsIHRlbG5ldCBzb2NrZXRzIGFuZCB0aGVpcgorCSAqIHB0eXMgaWYgdGhlcmUgaXMgcm9vbSBpbiB0aGVpciBzZXNzaW9uIGJ1ZmZlcnMuCisJICogTkI6IHNjYWxhYmlsaXR5IHByb2JsZW06IHdlIHJlY2FsY3VsYXRlIGVudGlyZSBiaXRtYXAKKwkgKiBiZWZvcmUgZWFjaCBzZWxlY3QuIENhbiBiZSBhIHByb2JsZW0gd2l0aCA1MDArIGNvbm5lY3Rpb25zLiAqLworCXRzID0gRy5zZXNzaW9uczsKKwl3aGlsZSAodHMpIHsKKwkJc3RydWN0IHRzZXNzaW9uICpuZXh0ID0gdHMtPm5leHQ7IC8qIGluIGNhc2Ugd2UgZnJlZSB0cyAqLworCQlpZiAodHMtPnNoZWxsX3BpZCA9PSAtMSkgeworCQkJLyogQ2hpbGQgZGllZCBhbmQgd2UgZGV0ZWN0ZWQgdGhhdCAqLworCQkJZnJlZV9zZXNzaW9uKHRzKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0cy0+c2l6ZTEgPiAwKSAgICAgICAvKiBjYW4gd3JpdGUgdG8gcHR5ICovCisJCQkJRkRfU0VUKHRzLT5wdHlmZCwgJndyZmRzZXQpOworCQkJaWYgKHRzLT5zaXplMSA8IEJVRlNJWkUpIC8qIGNhbiByZWFkIGZyb20gc29ja2V0ICovCisJCQkJRkRfU0VUKHRzLT5zb2NrZmRfcmVhZCwgJnJkZmRzZXQpOworCQkJaWYgKHRzLT5zaXplMiA+IDApICAgICAgIC8qIGNhbiB3cml0ZSB0byBzb2NrZXQgKi8KKwkJCQlGRF9TRVQodHMtPnNvY2tmZF93cml0ZSwgJndyZmRzZXQpOworCQkJaWYgKHRzLT5zaXplMiA8IEJVRlNJWkUpIC8qIGNhbiByZWFkIGZyb20gcHR5ICovCisJCQkJRkRfU0VUKHRzLT5wdHlmZCwgJnJkZmRzZXQpOworCQl9CisJCXRzID0gbmV4dDsKKwl9CisJaWYgKCFJU19JTkVURCkgeworCQlGRF9TRVQobWFzdGVyX2ZkLCAmcmRmZHNldCk7CisJCS8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZnJlZV9zZXNzaW9uKCkgZG9lcyBub3QKKwkJICogdGFrZSBtYXN0ZXJfZmQgaW50byBhY2NvdW50IHdoZW4gaXQgZmluZHMgbmV3CisJCSAqIG1heGZkIGFtb25nIHJlbWFpbmluZyBmZCdzICovCisJCWlmIChtYXN0ZXJfZmQgPiBHLm1heGZkKQorCQkJRy5tYXhmZCA9IG1hc3Rlcl9mZDsKKwl9CisKKwl7CisJCXN0cnVjdCB0aW1ldmFsICp0dl9wdHIgPSBOVUxMOworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVAorCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJaWYgKChvcHQgJiBPUFRfV0FJVCkgJiYgIUcuc2Vzc2lvbnMpIHsKKwkJCXR2LnR2X3NlYyA9IHNlY19saW5nZXI7CisJCQl0di50dl91c2VjID0gMDsKKwkJCXR2X3B0ciA9ICZ0djsKKwkJfQorI2VuZGlmCisJCWNvdW50ID0gc2VsZWN0KEcubWF4ZmQgKyAxLCAmcmRmZHNldCwgJndyZmRzZXQsIE5VTEwsIHR2X3B0cik7CisJfQorCWlmIChjb3VudCA9PSAwKSAvKiAidGVsbmV0ZCAtdyBTRUMiIHRpbWVkIG91dCAqLworCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPCAwKQorCQlnb3RvIGFnYWluOyAvKiBFSU5UUiBvciBFTk9NRU0gKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCS8qIENoZWNrIGZvciBhbmQgYWNjZXB0IG5ldyBzZXNzaW9ucyAqLworCWlmICghSVNfSU5FVEQgJiYgRkRfSVNTRVQobWFzdGVyX2ZkLCAmcmRmZHNldCkpIHsKKwkJaW50IGZkOworCQlzdHJ1Y3QgdHNlc3Npb24gKm5ld190czsKKworCQlmZCA9IGFjY2VwdChtYXN0ZXJfZmQsIE5VTEwsIE5VTEwpOworCQlpZiAoZmQgPCAwKQorCQkJZ290byBhZ2FpbjsKKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisKKwkJLyogQ3JlYXRlIGEgbmV3IHNlc3Npb24gYW5kIGxpbmsgaXQgaW50byBhY3RpdmUgbGlzdCAqLworCQluZXdfdHMgPSBtYWtlX25ld19zZXNzaW9uKGZkKTsKKwkJaWYgKG5ld190cykgeworCQkJbmV3X3RzLT5uZXh0ID0gRy5zZXNzaW9uczsKKwkJCUcuc2Vzc2lvbnMgPSBuZXdfdHM7CisJCX0gZWxzZSB7CisJCQljbG9zZShmZCk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFRoZW4gY2hlY2sgZm9yIGRhdGEgdHVubmVsaW5nICovCisJdHMgPSBHLnNlc3Npb25zOworCXdoaWxlICh0cykgeyAvKiBGb3IgYWxsIHNlc3Npb25zLi4uICovCisJCXN0cnVjdCB0c2Vzc2lvbiAqbmV4dCA9IHRzLT5uZXh0OyAvKiBpbiBjYXNlIHdlIGZyZWUgdHMgKi8KKworCQlpZiAoLyp0cy0+c2l6ZTEgJiYqLyBGRF9JU1NFVCh0cy0+cHR5ZmQsICZ3cmZkc2V0KSkgeworCQkJaW50IG51bV90b3R0eTsKKwkJCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwkJCS8qIFdyaXRlIHRvIHB0eSBmcm9tIGJ1ZmZlciAxICovCisJCQlwdHIgPSByZW1vdmVfaWFjcyh0cywgJm51bV90b3R0eSk7CisJCQljb3VudCA9IHNhZmVfd3JpdGUodHMtPnB0eWZkLCBwdHIsIG51bV90b3R0eSk7CisJCQlpZiAoY291bnQgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCQkJZ290byBza2lwMTsKKwkJCQlnb3RvIGtpbGxfc2Vzc2lvbjsKKwkJCX0KKwkJCXRzLT5zaXplMSAtPSBjb3VudDsKKwkJCXRzLT53cmlkeDEgKz0gY291bnQ7CisJCQlpZiAodHMtPndyaWR4MSA+PSBCVUZTSVpFKSAvKiBhY3R1YWxseSA9PSBCVUZTSVpFICovCisJCQkJdHMtPndyaWR4MSA9IDA7CisJCX0KKyBza2lwMToKKwkJaWYgKC8qdHMtPnNpemUyICYmKi8gRkRfSVNTRVQodHMtPnNvY2tmZF93cml0ZSwgJndyZmRzZXQpKSB7CisJCQkvKiBXcml0ZSB0byBzb2NrZXQgZnJvbSBidWZmZXIgMiAqLworCQkJY291bnQgPSBNSU4oQlVGU0laRSAtIHRzLT53cmlkeDIsIHRzLT5zaXplMik7CisJCQljb3VudCA9IGlhY19zYWZlX3dyaXRlKHRzLT5zb2NrZmRfd3JpdGUsICh2b2lkKikoVFNfQlVGMih0cykgKyB0cy0+d3JpZHgyKSwgY291bnQpOworCQkJaWYgKGNvdW50IDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQkJCWdvdG8gc2tpcDI7CisJCQkJZ290byBraWxsX3Nlc3Npb247CisJCQl9CisJCQl0cy0+c2l6ZTIgLT0gY291bnQ7CisJCQl0cy0+d3JpZHgyICs9IGNvdW50OworCQkJaWYgKHRzLT53cmlkeDIgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCQkJCXRzLT53cmlkeDIgPSAwOworCQl9Cisgc2tpcDI6CisJCS8qIFNob3VsZCBub3QgYmUgbmVlZGVkLCBidXQuLi4gcmVtb3ZlX2lhY3MgaXMgYWN0dWFsbHkgYnVnZ3kKKwkJICogKGl0IGNhbm5vdCBwcm9jZXNzIGlhY3Mgd2hpY2ggd3JhcCBhcm91bmQgYnVmZmVyJ3MgZW5kKSEKKwkJICogU2luY2UgcHJvcGVybHkgZml4aW5nIGl0IHJlcXVpcmVzIHdyaXRpbmcgYmlnZ2VyIGNvZGUsCisJCSAqIHdlIHJlbHkgaW5zdGVhZCBvbiB0aGlzIGNvZGUgbWFraW5nIGl0IHZpcnR1YWxseSBpbXBvc3NpYmxlCisJCSAqIHRvIGhhdmUgd3JhcHBlZCBpYWMgKHBlb3BsZSBkb24ndCB0eXBlIGF0IDJrL3NlY29uZCkuCisJCSAqIEl0IGFsc28gYWxsb3dzIGZvciBiaWdnZXIgcmVhZHMgaW4gY29tbW9uIGNhc2UuICovCisJCWlmICh0cy0+c2l6ZTEgPT0gMCkgeworCQkJdHMtPnJkaWR4MSA9IDA7CisJCQl0cy0+d3JpZHgxID0gMDsKKwkJfQorCQlpZiAodHMtPnNpemUyID09IDApIHsKKwkJCXRzLT5yZGlkeDIgPSAwOworCQkJdHMtPndyaWR4MiA9IDA7CisJCX0KKworCQlpZiAoLyp0cy0+c2l6ZTEgPCBCVUZTSVpFICYmKi8gRkRfSVNTRVQodHMtPnNvY2tmZF9yZWFkLCAmcmRmZHNldCkpIHsKKwkJCS8qIFJlYWQgZnJvbSBzb2NrZXQgdG8gYnVmZmVyIDEgKi8KKwkJCWNvdW50ID0gTUlOKEJVRlNJWkUgLSB0cy0+cmRpZHgxLCBCVUZTSVpFIC0gdHMtPnNpemUxKTsKKwkJCWNvdW50ID0gc2FmZV9yZWFkKHRzLT5zb2NrZmRfcmVhZCwgVFNfQlVGMSh0cykgKyB0cy0+cmRpZHgxLCBjb3VudCk7CisJCQlpZiAoY291bnQgPD0gMCkgeworCQkJCWlmIChjb3VudCA8IDAgJiYgZXJybm8gPT0gRUFHQUlOKQorCQkJCQlnb3RvIHNraXAzOworCQkJCWdvdG8ga2lsbF9zZXNzaW9uOworCQkJfQorCQkJLyogSWdub3JlIHRyYWlsaW5nIE5VTCBpZiBpdCBpcyB0aGVyZSAqLworCQkJaWYgKCFUU19CVUYxKHRzKVt0cy0+cmRpZHgxICsgY291bnQgLSAxXSkgeworCQkJCS0tY291bnQ7CisJCQl9CisJCQl0cy0+c2l6ZTEgKz0gY291bnQ7CisJCQl0cy0+cmRpZHgxICs9IGNvdW50OworCQkJaWYgKHRzLT5yZGlkeDEgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCQkJCXRzLT5yZGlkeDEgPSAwOworCQl9Cisgc2tpcDM6CisJCWlmICgvKnRzLT5zaXplMiA8IEJVRlNJWkUgJiYqLyBGRF9JU1NFVCh0cy0+cHR5ZmQsICZyZGZkc2V0KSkgeworCQkJLyogUmVhZCBmcm9tIHB0eSB0byBidWZmZXIgMiAqLworCQkJY291bnQgPSBNSU4oQlVGU0laRSAtIHRzLT5yZGlkeDIsIEJVRlNJWkUgLSB0cy0+c2l6ZTIpOworCQkJY291bnQgPSBzYWZlX3JlYWQodHMtPnB0eWZkLCBUU19CVUYyKHRzKSArIHRzLT5yZGlkeDIsIGNvdW50KTsKKwkJCWlmIChjb3VudCA8PSAwKSB7CisJCQkJaWYgKGNvdW50IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pCisJCQkJCWdvdG8gc2tpcDQ7CisJCQkJZ290byBraWxsX3Nlc3Npb247CisJCQl9CisJCQl0cy0+c2l6ZTIgKz0gY291bnQ7CisJCQl0cy0+cmRpZHgyICs9IGNvdW50OworCQkJaWYgKHRzLT5yZGlkeDIgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCQkJCXRzLT5yZGlkeDIgPSAwOworCQl9Cisgc2tpcDQ6CisJCXRzID0gbmV4dDsKKwkJY29udGludWU7Cisga2lsbF9zZXNzaW9uOgorCQlpZiAodHMtPnNoZWxsX3BpZCA+IDApCisJCQl1cGRhdGVfdXRtcCh0cy0+c2hlbGxfcGlkLCBERUFEX1BST0NFU1MsIC8qdHR5X25hbWU6Ki8gTlVMTCwgLyp1c2VybmFtZToqLyBOVUxMLCAvKmhvc3RuYW1lOiovIE5VTEwpOworCQlmcmVlX3Nlc3Npb24odHMpOworCQl0cyA9IG5leHQ7CisJfQorCisJZ290byBhZ2FpbjsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdGVsbmV0ZC5jdHJsU1EucGF0Y2ggYi9uZXR3b3JraW5nL3RlbG5ldGQuY3RybFNRLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjBlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RlbG5ldGQuY3RybFNRLnBhdGNoCkBAIC0wLDAgKzEsMTc1IEBACitGcm9tOiAiRG91ZyBHcmFoYW0iIDxkZ3JhaGFtQG5vcnRlbC5jb20+CitEYXRlOiAyMDA5LTAxLTIyIDA3OjIwCisKK0hlbGxvLAorCitCdXN5Ym94J3MgdGVsbmV0ZCBkb2VzIG5vdCBkaXNhYmxlIGxvY2FsIChjbGllbnQtc2lkZSkgZmxvdyBjb250cm9sCitwcm9wZXJseS4gIEl0IGRvZXMgbm90IHB1dCB0aGUgcHR5IGludG8gcGFja2V0IG1vZGUgYW5kIHRoZW4gbm90aWZ5IHRoZQorY2xpZW50IHdoZW5ldmVyIGZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCBieSBhbiBhcHBsaWNhdGlvbiBydW5uaW5nIHVuZGVyCitpdHMgY29udHJvbC4gIFRoZSByZXN1bHQgaXMgdGhhdCBeUy9eUSBhcmUgbm90IHBhc3NlZCB0aHJvdWdoIHRvIHRoZQorYXBwbGljYXRpb24sIHdoaWNoIGlzIHBhaW5mdWwgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgYW4gZW1hY3MgdmFyaWFudC4KKworSSBzdXBwb3NlIHRoYXQgc3VwcG9ydCBmb3IgdGhpcyBtaWdodCBiZSBjb25zaWRlcmVkIGJsb2F0LCBidXQgdGhlCitpbmNsdWRlZCBwYXRjaCBvbmx5IGFkZHMgYWJvdXQgMjAwIGJ5dGVzIG9mIHRleHQgdG8geDg2IGJ1c3lib3ggYW5kIDMwMAorYnl0ZXMgdG8gbWlwc2VsIGJ1c3lib3guICBQbGVhc2UgY29uc2lkZXIgYXBwbHlpbmcuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK05COiB0aGUgcGF0Y2ggZG9lc24ndCB3b3JrIGFzLWlzIGJlY2F1c2Ugd2Ugbm93IGhhdmUgaWFjX3NhZmVfd3JpdGUoKQord2hpY2ggcXVvdGVzIElBQ3Mgb24gb3V0cHV0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRG9jczoKKworVGhlIGZvbGxvd2luZyBpb2N0bCgyKSBjYWxscyBhcHBseSBvbmx5IHRvIHBzZXVkbyB0ZXJtaW5hbHM6CisKK1RJT0NTVE9QIFN0b3BzIG91dHB1dCB0byBhIHRlcm1pbmFsIChlLmcuIGxpa2UgdHlwaW5nIF5TKS4gVGFrZXMgbm8gcGFyYW1ldGVyLgorCitUSU9DU1RBUlQgUmVzdGFydHMgb3V0cHV0IChzdG9wcGVkIGJ5IFRJT0NTVE9QIG9yIGJ5IHR5cGluZyBeUykuIFRha2VzIG5vIHBhcmFtZXRlci4KKworVElPQ1BLVCAgICAgICAgIEVuYWJsZS9kaXNhYmxlIHBhY2tldCBtb2RlLiBXaGVuIGFwcGxpZWQgdG8gdGhlIG1hc3RlciBzaWRlIG9mIGEgcHNldWRvIHRlcm1pbmFsLCBlYWNoCitzdWJzZXF1ZW50IHJlYWQoMikgZnJvbSB0aGUgdGVybWluYWwgd2lsbCByZXR1cm4gZGF0YSB3cml0dGVuIG9uIHRoZSBzbGF2ZSBwYXJ0IG9mIHRoZSBwc2V1ZG8gdGVybWluYWwgcHJlY2VkZWQgYnkgYQoremVybyBieXRlIChzeW1ib2xpY2FsbHkgZGVmaW5lZCBhcyBUSU9DUEtUX0RBVEEpLCBvciBhIHNpbmdsZSBieXRlIHJlZmxlY3RpbmcgY29udHJvbCBzdGF0dXMgaW5mb3JtYXRpb24uCitJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBieXRlIGlzIGFuIGluY2x1c2l2ZS1vciBvZiB6ZXJvIG9yIG1vcmUgb2YgdGhlIGJpdHM6CisKK1RJT0NQS1RfRkxVU0hSRUFEICAgICB3aGVuZXZlciB0aGUgcmVhZCBxdWV1ZSBmb3IgdGhlIHRlcm1pbmFsIGlzIGZsdXNoZWQuCitUSU9DUEtUX0ZMVVNIV1JJVEUgICAgd2hlbmV2ZXIgdGhlIHdyaXRlIHF1ZXVlIGZvciB0aGUgdGVybWluYWwgaXMgZmx1c2hlZC4KK1RJT0NQS1RfU1RPUCAgICB3aGVuZXZlciBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsIGlzIHN0b3BwZWQgYSBsYSBeUy4KK1RJT0NQS1RfU1RBUlQgICB3aGVuZXZlciBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsIGlzIHJlc3RhcnRlZC4KK1RJT0NQS1RfRE9TVE9QICB3aGVuZXZlciB0X3N0b3BjIGlzIF5TIGFuZCB0X3N0YXJ0YyBpcyBeUS4KK1RJT0NQS1RfTk9TVE9QICB3aGVuZXZlciB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycyBhcmUgbm90IF5TL15RLgorCitXaGlsZSB0aGlzIG1vZGUgaXMgaW4gdXNlLCB0aGUgcHJlc2VuY2Ugb2YgY29udHJvbCBzdGF0dXMgaW5mb3JtYXRpb24gdG8gYmUgcmVhZCBmcm9tIHRoZSBtYXN0ZXIgc2lkZSBtYXkgYmUgZGV0ZWN0ZWQKK2J5IGEgc2VsZWN0KDIpIGZvciBleGNlcHRpb25hbCBjb25kaXRpb25zLgorCitUaGlzIG1vZGUgaXMgdXNlZCBieSBybG9naW4oMSkgYW5kIHJsb2dpbmQoOCkgdG8gaW1wbGVtZW50IGEgcmVtb3RlLWVjaG9lZCwgbG9jYWxseSBeUy9eUSBmbG93LWNvbnRyb2xsZWQgcmVtb3RlIGxvZ2luCit3aXRoIHByb3BlciBiYWNrLWZsdXNoaW5nIG9mIG91dHB1dDsgaXQgY2FuIGJlIHVzZWQgYnkgb3RoZXIgc2ltaWxhciBwcm9ncmFtcy4KKworVElPQ1VDTlRMICAgICAgIEVuYWJsZS9kaXNhYmxlIGEgbW9kZSB0aGF0IGFsbG93cyBhIHNtYWxsIG51bWJlciBvZiBzaW1wbGUgdXNlciBpb2N0bCgyKSBjb21tYW5kcyB0byBiZSBwYXNzZWQgdGhyb3VnaAordGhlIHBzZXVkby10ZXJtaW5hbCwgdXNpbmcgYSBwcm90b2NvbCBzaW1pbGFyIHRvIHRoYXQgb2YgVElPQ1BLVC4gVGhlIFRJT0NVQ05UTCBhbmQgVElPQ1BLVCBtb2RlcyBhcmUgbXV0dWFsbHkKK2V4Y2x1c2l2ZS4gVGhpcyBtb2RlIGlzIGVuYWJsZWQgZnJvbSB0aGUgbWFzdGVyIHNpZGUgb2YgYSBwc2V1ZG8gdGVybWluYWwuIEVhY2ggc3Vic2VxdWVudCByZWFkKDIpIGZyb20gdGhlIG1hc3RlciBzaWRlCit3aWxsIHJldHVybiBkYXRhIHdyaXR0ZW4gb24gdGhlIHNsYXZlIHBhcnQgb2YgdGhlIHBzZXVkbyB0ZXJtaW5hbCBwcmVjZWRlZCBieSBhIHplcm8gYnl0ZSwgb3IgYSBzaW5nbGUgYnl0ZSByZWZsZWN0aW5nIGEKK3VzZXIgY29udHJvbCBvcGVyYXRpb24gb24gdGhlIHNsYXZlIHNpZGUuIEEgdXNlciBjb250cm9sIGNvbW1hbmQgY29uc2lzdHMgb2YgYSBzcGVjaWFsIGlvY3RsKDIpIG9wZXJhdGlvbiB3aXRoIG5vIGRhdGE7Cit0aGUgY29tbWFuZCBpcyBnaXZlbiBhcyBVSU9DQ01EIChuKSwgd2hlcmUgbiBpcyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgMS0yNTUuIFRoZSBvcGVyYXRpb24gdmFsdWUgbiB3aWxsIGJlIHJlY2VpdmVkIGFzCithIHNpbmdsZSBieXRlIG9uIHRoZSBuZXh0IHJlYWQoMikgZnJvbSB0aGUgbWFzdGVyIHNpZGUuIFRoZSBpb2N0bCgyKSBVSU9DQ01EICgwKSBpcyBhIG5vLW9wIHRoYXQgbWF5IGJlIHVzZWQgdG8gcHJvYmUKK2ZvciB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgZmFjaWxpdHkuIEFzIHdpdGggVElPQ1BLVCBtb2RlLCBjb21tYW5kIG9wZXJhdGlvbnMgbWF5IGJlIGRldGVjdGVkIHdpdGggYSBzZWxlY3QoMikgZm9yCitleGNlcHRpb25hbCBjb25kaXRpb25zLgorCistLS0gYnVzeWJveC0xLjEzLjIvbmV0d29ya2luZy90ZWxuZXRkLmMJMjAwOS8wMS8yMSAyMDowMjozOQkxLjEKKysrKyBidXN5Ym94LTEuMTMuMi9uZXR3b3JraW5nL3RlbG5ldGQuYwkyMDA5LzAxLzIyIDAwOjM1OjI4CitAQCAtMzgsNiArMzgsOSBAQAorIAlpbnQgc29ja2ZkX3JlYWQsIHNvY2tmZF93cml0ZSwgcHR5ZmQ7CisgCWludCBzaGVsbF9waWQ7CisgCisrI2lmZGVmIFRJT0NQS1QKKysJaW50IGZsb3dzdGF0ZTsKKysjZW5kaWYKKyAJLyogdHdvIGNpcmN1bGFyIGJ1ZmZlcnMgKi8KKyAJLypjaGFyICpidWYxLCAqYnVmMjsqLworIC8qI2RlZmluZSBUU19CVUYxIHRzLT5idWYxKi8KK0BAIC0xNzAsNiArMTczLDkgQEAKKyAJaW50IGZkLCBwaWQ7CisgCWNoYXIgdHR5X25hbWVbR0VUUFRZX0JVRlNJWkVdOworIAlzdHJ1Y3QgdHNlc3Npb24gKnRzID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHRzZXNzaW9uKSArIEJVRlNJWkUgKiAyKTsKKysjaWZkZWYgVElPQ1BLVAorKwlpbnQgb24gPSAxOworKyNlbmRpZgorIAorIAkvKnRzLT5idWYxID0gKGNoYXIgKikodHMgKyAxKTsqLworIAkvKnRzLT5idWYyID0gdHMtPmJ1ZjEgKyBCVUZTSVpFOyovCitAQCAtMTgwLDYgKzE4NiwxMCBAQAorIAkJbWF4ZmQgPSBmZDsKKyAJdHMtPnB0eWZkID0gZmQ7CisgCW5kZWxheV9vbihmZCk7CisrI2lmZGVmIFRJT0NQS1QKKysJaW9jdGwoZmQsIFRJT0NQS1QsICZvbik7CisrCXRzLT5mbG93c3RhdGUgPSBUSU9DUEtUX0RPU1RPUDsKKysjZW5kaWYKKyAjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisgCXRzLT5zb2NrZmRfcmVhZCA9IHNvY2s7CisgCS8qIFNPX0tFRVBBTElWRSBieSBwb3B1bGFyIGRlbWFuZCAqLworQEAgLTM4NSw2ICszOTUsMTYgQEAKKyAJCXBvcnRuYnIgPSAyMywKKyAJfTsKKyAjZW5kaWYKKysjaWZkZWYgVElPQ1BLVAorKwlpbnQgY29udHJvbDsKKysJc3RhdGljIGNvbnN0IGNoYXIgbGZsb3dfb25bXSA9CisrCSAgICB7SUFDLCBTQiwgVEVMT1BUX0xGTE9XLCBMRkxPV19PTiwgSUFDLCBTRX07CisrCXN0YXRpYyBjb25zdCBjaGFyIGxmbG93X29mZltdID0KKysJICAgIHtJQUMsIFNCLCBURUxPUFRfTEZMT1csIExGTE9XX09GRiwgSUFDLCBTRX07CisrIyBkZWZpbmUgUkVTRVJWRUQgc2l6ZW9mKGxmbG93X29uKQorKyNlbHNlCisrIyBkZWZpbmUgUkVTRVJWRUQgMAorKyNlbmRpZgorIAkvKiBFdmVuIGlmICFTVEFOREFMT05FLCB3ZSBhY2NlcHQgKGFuZCBpZ25vcmUpIC1pLCB0aHVzIHBlb3BsZQorIAkgKiBkb24ndCBuZWVkIHRvIGd1ZXNzIHdoZXRoZXIgaXQncyBvayB0byBwYXNzIC1pIHRvIHVzICovCisgCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmOmw6S2kiIElGX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FKCJwOmI6RiIpLAorQEAgLTQ3NSw3ICs0OTUsNyBAQAorIAkJCQlGRF9TRVQodHMtPnNvY2tmZF9yZWFkLCAmcmRmZHNldCk7CisgCQkJaWYgKHRzLT5zaXplMiA+IDApICAgICAgIC8qIGNhbiB3cml0ZSB0byBzb2NrZXQgKi8KKyAJCQkJRkRfU0VUKHRzLT5zb2NrZmRfd3JpdGUsICZ3cmZkc2V0KTsKKy0JCQlpZiAodHMtPnNpemUyIDwgQlVGU0laRSkgLyogY2FuIHJlYWQgZnJvbSBwdHkgKi8KKysJCQlpZiAodHMtPnNpemUyIDwgKEJVRlNJWkUgLSBSRVNFUlZFRCkpIC8qIGNhbiByZWFkIGZyb20gcHR5ICovCisgCQkJCUZEX1NFVCh0cy0+cHR5ZmQsICZyZGZkc2V0KTsKKyAJCX0KKyAJCXRzID0gbmV4dDsKK0BAIC01OTMsNiArNjEzLDUyIEBACisgCQkJCQlnb3RvIHNraXA0OworIAkJCQlnb3RvIGtpbGxfc2Vzc2lvbjsKKyAJCQl9CisrI2lmZGVmIFRJT0NQS1QKKysJCQljb250cm9sID0gVFNfQlVGMlt0cy0+cmRpZHgyXTsKKysJCQlpZiAoLS1jb3VudCA+IDAgJiYgY29udHJvbCA9PSBUSU9DUEtUX0RBVEEpIHsKKysJCQkJLyoKKysJCQkJICogSWYgd2UgYXJlIGluIHBhY2tldCBtb2RlLCBhbmQgd2UgaGF2ZQorKwkJCQkgKiBqdXN0IHJlYWQgYSBjaHVuayBvZiBhY3R1YWwgZGF0YSBmcm9tCisrCQkJCSAqIHRoZSBwdHksIHRoZW4gdGhlcmUgaXMgdGhlIFRJT0NQS1RfREFUQQorKwkJCQkgKiBieXRlICh6ZXJvKSB0aGF0IHdlIGhhdmUgZ290IHRvIHJlbW92ZQorKwkJCQkgKiBzb21laG93LiAgSWYgdGhlcmUgd2VyZSBubyBjaGFycyBpbgorKwkJCQkgKiBUU19CVUYyIGJlZm9yZSB3ZSBkaWQgdGhpcyByZWFkLCB0aGVuCisrCQkJCSAqIHdlIGNhbiBvcHRpbWl6ZSBieSBqdXN0IGFkdmFuY2luZyB3cmlkeDIuCisrCQkJCSAqIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGNvcHkgdGhlIG5ldyBkYXRhIGRvd24KKysJCQkJICogdG8gY2xvc2UgdGhlIGdhcCAoQ291bGQgdXNlIHJlYWR2KCkgaW5zdGVhZCkuCisrCQkJCSAqLworKwkJCQlpZiAodHMtPnNpemUyID09IDApCisrCQkJCQl0cy0+d3JpZHgyKys7CisrCQkJCWVsc2UgeworKwkJCQkJbWVtbW92ZShUU19CVUYyICsgdHMtPnJkaWR4MiwKKysJCQkJCQlUU19CVUYyICsgdHMtPnJkaWR4MiArIDEsIGNvdW50KTsKKysJCQkJfQorKwkJCX0KKysKKysJCQkvKgorKwkJCSAqIElmIHRoZSBmbG93IGNvbnRyb2wgc3RhdGUgY2hhbmdlZCwgbm90aWZ5CisrCQkJICogdGhlIGNsaWVudC4gIElmICJjb250cm9sIiBpcyBub3QgVElPQ1BLVF9EQVRBLAorKwkJCSAqIHRoZW4gdGhlcmUgYXJlIG5vIGRhdGEgYnl0ZXMgdG8gd29ycnkgYWJvdXQuCisrCQkJICovCisrCQkJaWYgKChjb250cm9sICYgKFRJT0NQS1RfRE9TVE9QfFRJT0NQS1RfTk9TVE9QKSkgIT0gMAorKwkJCSAmJiB0cy0+Zmxvd3N0YXRlICE9IChjb250cm9sICYgVElPQ1BLVF9ET1NUT1ApKSB7CisrCQkJCWNvbnN0IGNoYXIgKnAgPSB0cy0+Zmxvd3N0YXRlID8gbGZsb3dfb2ZmIDogbGZsb3dfb247CisrCisrCQkJCS8qCisrCQkJCSAqIFdlIGtub3cgd2UgaGF2ZSBlbm91Z2ggZnJlZSBzbG90cyBhdmFpbGFibGUKKysJCQkJICogKHNlZSBSRVNFUlZFRCkgYnV0IHRoZXkgYXJlIG5vdCBuZWNlc3NhcmlseQorKwkJCQkgKiBjb250aWd1b3VzOyB3ZSBtYXkgaGF2ZSB0byB3cmFwLgorKwkJCQkgKi8KKysJCQkJZm9yIChjb3VudCA9IHNpemVvZihsZmxvd19vbik7IGNvdW50ID4gMDsgY291bnQtLSkgeworKwkJCQkJVFNfQlVGMlt0cy0+cmRpZHgyKytdID0gKnArKzsKKysJCQkJCWlmICh0cy0+cmRpZHgyID49IEJVRlNJWkUpCisrCQkJCQkJdHMtPnJkaWR4MiA9IDA7CisrCQkJCQl0cy0+c2l6ZTIrKzsKKysJCQkJfQorKworKwkJCQl0cy0+Zmxvd3N0YXRlID0gY29udHJvbCAmIFRJT0NQS1RfRE9TVE9QOworKwkJCX0KKysjZW5kaWYgLyogVElPQ1BLVCAqLworIAkJCXRzLT5zaXplMiArPSBjb3VudDsKKyAJCQl0cy0+cmRpZHgyICs9IGNvdW50OworIAkJCWlmICh0cy0+cmRpZHgyID49IEJVRlNJWkUpIC8qIGFjdHVhbGx5ID09IEJVRlNJWkUgKi8KKworLS1Eb3VnCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworYnVzeWJveCBtYWlsaW5nIGxpc3QKK2J1c3lib3hAYnVzeWJveC5uZXQKK2h0dHA6Ly9saXN0cy5idXN5Ym94Lm5ldC9tYWlsbWFuL2xpc3RpbmZvL2J1c3lib3gKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdGZ0cC5jIGIvbmV0d29ya2luZy90ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzYjg3OQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdGZ0cC5jCkBAIC0wLDAgKzEsODc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBIHNpbXBsZSB0ZnRwIGNsaWVudC9zZXJ2ZXIgZm9yIGJ1c3lib3guCisgKiBUcmllcyB0byBmb2xsb3cgUkZDMTM1MC4KKyAqIE9ubHkgIm9jdGV0IiBtb2RlIHN1cHBvcnRlZC4KKyAqIE9wdGlvbmFsIGJsb2Nrc2l6ZSBuZWdvdGlhdGlvbiAoUkZDMjM0NyArIFJGQzIzNDgpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+CisgKgorICogUGFydHMgb2YgdGhlIGNvZGUgYmFzZWQgb246CisgKgorICogYXRmdHA6ICBDb3B5cmlnaHQgKEMpIDIwMDAgSmVhbi1QaWVycmUgTGVmZWJ2cmUgPGhlbGl4QHN0ZXAucG9seW10bC5jYT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFJlbWkgTGVmZWJ2cmUgPHJlbWlAZGViaWFuLm9yZz4KKyAqCisgKiB1dGZ0cDogIENvcHlyaWdodCAoQykgMTk5OSBVd2UgT2hzZSA8dXdlQG9oc2UuZGU+CisgKgorICogdGZ0cGQgYWRkZWQgYnkgRGVueXMgVmxhc2Vua28gJiBWbGFkaW1pciBEcm9ubmlrb3YKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0ZnRwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gSE9TVCBbUE9SVF0iCisvL3VzYWdlOiNkZWZpbmUgdGZ0cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlRyYW5zZmVyIGEgZmlsZSBmcm9tL3RvIHRmdHAgc2VydmVyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sIEZJTEUJTG9jYWwgRklMRSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgRklMRQlSZW1vdGUgRklMRSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEZUUF9HRVQoCisvL3VzYWdlOiAgICAgIlxuCS1nCUdldCBmaWxlIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9URlRQX1BVVCgKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHV0IGZpbGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKAorLy91c2FnZTogICAgICJcbgktYiBTSVpFCVRyYW5zZmVyIGJsb2NrcyBvZiBTSVpFIG9jdGV0cyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdGZ0cGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY3JdIFstdSBVU0VSXSBbRElSXSIKKy8vdXNhZ2U6I2RlZmluZSB0ZnRwZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlRyYW5zZmVyIGEgZmlsZSBvbiB0ZnRwIGNsaWVudCdzIHJlcXVlc3RcbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJ0ZnRwZCBzaG91bGQgYmUgdXNlZCBhcyBhbiBpbmV0ZCBzZXJ2aWNlLlxuIgorLy91c2FnZTogICAgICAgInRmdHBkJ3MgbGluZSBmb3IgaW5ldGQuY29uZjpcbiIKKy8vdXNhZ2U6ICAgICAgICIJNjkgZGdyYW0gdWRwIG5vd2FpdCByb290IHRmdHBkIHRmdHBkIC1sIC9maWxlcy90by9zZXJ2ZVxuIgorLy91c2FnZTogICAgICAgIkl0IGFsc28gY2FuIGJlIHJhbiBmcm9tIHVkcHN2ZDpcbiIKKy8vdXNhZ2U6ICAgICAgICIJdWRwc3ZkIC12RSAwLjAuMC4wIDY5IHRmdHBkIC9maWxlcy90by9zZXJ2ZVxuIgorLy91c2FnZTogICAgICJcbgktcglQcm9oaWJpdCB1cGxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS1jCUFsbG93IGZpbGUgY3JlYXRpb24gdmlhIHVwbG9hZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJQWNjZXNzIGZpbGVzIGFzIFVTRVIiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxvZyB0byBzeXNsb2cgKGluZXRkIG1vZGUgcmVxdWlyZXMgdGhpcykiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9HRVQgfHwgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQKKworI2RlZmluZSBURlRQX0JMS1NJWkVfREVGQVVMVCAgICAgICA1MTIgIC8qIGFjY29yZGluZyB0byBSRkMgMTM1MCwgZG9uJ3QgY2hhbmdlICovCisjZGVmaW5lIFRGVFBfQkxLU0laRV9ERUZBVUxUX1NUUiAiNTEyIgorLyogV2FzIDUwIG1zIGJ1dCB1c2VycyBhc2tlZCB0byBidW1wIGl0IHVwIGEgYml0ICovCisjZGVmaW5lIFRGVFBfVElNRU9VVF9NUyAgICAgICAgICAgIDEwMAorI2RlZmluZSBURlRQX01BWFRJTUVPVVRfTVMgICAgICAgIDIwMDAKKyNkZWZpbmUgVEZUUF9OVU1fUkVUUklFUyAgICAgICAgICAgIDEyICAvKiBudW1iZXIgb2YgYmFja2VkLW9mZiByZXRyaWVzICovCisKKy8qIG9wY29kZXMgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBURlRQX1JSUSAgIDEKKyNkZWZpbmUgVEZUUF9XUlEgICAyCisjZGVmaW5lIFRGVFBfREFUQSAgMworI2RlZmluZSBURlRQX0FDSyAgIDQKKyNkZWZpbmUgVEZUUF9FUlJPUiA1CisjZGVmaW5lIFRGVFBfT0FDSyAgNgorCisvKiBlcnJvciBjb2RlcyBzZW50IG92ZXIgbmV0d29yayAod2UgdXNlIG9ubHkgMCwgMSwgMyBhbmQgOCkgKi8KKy8qIGdlbmVyaWMgKGVycm9yIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhlIHBhY2tldCkgKi8KKyNkZWZpbmUgRVJSX1VOU1BFQyAgIDAKKyNkZWZpbmUgRVJSX05PRklMRSAgIDEKKyNkZWZpbmUgRVJSX0FDQ0VTUyAgIDIKKy8qIGRpc2sgZnVsbCBvciBhbGxvY2F0aW9uIGV4Y2VlZGVkICovCisjZGVmaW5lIEVSUl9XUklURSAgICAzCisjZGVmaW5lIEVSUl9PUCAgICAgICA0CisjZGVmaW5lIEVSUl9CQURfSUQgICA1CisjZGVmaW5lIEVSUl9FWElTVCAgICA2CisjZGVmaW5lIEVSUl9CQURfVVNFUiA3CisjZGVmaW5lIEVSUl9CQURfT1BUICA4CisKKy8qIG1hc2tzIGNvbWluZyBmcm9tIGdldG9wdDMyICovCitlbnVtIHsKKwlURlRQX09QVF9HRVQgPSAoMSA8PCAwKSwKKwlURlRQX09QVF9QVVQgPSAoMSA8PCAxKSwKKwkvKiBwc2V1ZG8gb3B0aW9uOiBpZiBzZXQsIGl0J3MgdGZ0cGQgKi8KKwlURlRQRF9PUFQgPSAoMSA8PCA3KSAqIEVOQUJMRV9URlRQRCwKKwlURlRQRF9PUFRfciA9ICgxIDw8IDgpICogRU5BQkxFX1RGVFBELAorCVRGVFBEX09QVF9jID0gKDEgPDwgOSkgKiBFTkFCTEVfVEZUUEQsCisJVEZUUERfT1BUX3UgPSAoMSA8PCAxMCkgKiBFTkFCTEVfVEZUUEQsCisJVEZUUERfT1BUX2wgPSAoMSA8PCAxMSkgKiBFTkFCTEVfVEZUUEQsCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9HRVQgJiYgIUVOQUJMRV9GRUFUVVJFX1RGVFBfUFVUCisjZGVmaW5lIElGX0dFVFBVVCguLi4pCisjZGVmaW5lIENNRF9HRVQoY21kKSAxCisjZGVmaW5lIENNRF9QVVQoY21kKSAwCisjZWxpZiAhRU5BQkxFX0ZFQVRVUkVfVEZUUF9HRVQgJiYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQKKyNkZWZpbmUgSUZfR0VUUFVUKC4uLikKKyNkZWZpbmUgQ01EX0dFVChjbWQpIDAKKyNkZWZpbmUgQ01EX1BVVChjbWQpIDEKKyNlbHNlCisjZGVmaW5lIElGX0dFVFBVVCguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIENNRF9HRVQoY21kKSAoKGNtZCkgJiBURlRQX09QVF9HRVQpCisjZGVmaW5lIENNRF9QVVQoY21kKSAoKGNtZCkgJiBURlRQX09QVF9QVVQpCisjZW5kaWYKKy8qIE5COiBpbiB0aGUgY29kZSBiZWxvdworICogQ01EX0dFVChjbWQpIGFuZCBDTURfUFVUKGNtZCkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorICovCisKKworc3RydWN0IGdsb2JhbHMgeworCS8qIHUxNiBURlRQX0VSUk9SOyB1MTYgcmVhc29uOyBib3RoIG5ldHdvcmstZW5kaWFuLCB0aGVuIGVycm9yIHRleHQ6ICovCisJdWludDhfdCBlcnJvcl9wa3RbNCArIDMyXTsKKwljaGFyICp1c2VyX29wdDsKKwkvKiB1c2VkIGluIHRmdHBkX21haW4oKSwgYSBiaXQgYmlnIGZvciBzdGFjazogKi8KKwljaGFyIGJsb2NrX2J1ZltURlRQX0JMS1NJWkVfREVGQVVMVF07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwlvZmZfdCBwb3M7CisJb2ZmX3Qgc2l6ZTsKKwljb25zdCBjaGFyICpmaWxlOworCWJiX3Byb2dyZXNzX3QgcG10OworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgYmxvY2tfYnVmICAgICAgICAoRy5ibG9ja19idWYgICApCisjZGVmaW5lIHVzZXJfb3B0ICAgICAgICAgKEcudXNlcl9vcHQgICAgKQorI2RlZmluZSBlcnJvcl9wa3QgICAgICAgIChHLmVycm9yX3BrdCAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIGVycm9yX3BrdF9yZWFzb24gKGVycm9yX3BrdFszXSkKKyNkZWZpbmUgZXJyb3JfcGt0X3N0ciAgICAoZXJyb3JfcGt0ICsgNCkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCitzdGF0aWMgdm9pZCB0ZnRwX3Byb2dyZXNzX3VwZGF0ZSh2b2lkKQoreworCWJiX3Byb2dyZXNzX3VwZGF0ZSgmRy5wbXQsIDAsIEcucG9zLCBHLnNpemUpOworfQorc3RhdGljIHZvaWQgdGZ0cF9wcm9ncmVzc19pbml0KHZvaWQpCit7CisJYmJfcHJvZ3Jlc3NfaW5pdCgmRy5wbXQsIEcuZmlsZSk7CisJdGZ0cF9wcm9ncmVzc191cGRhdGUoKTsKK30KK3N0YXRpYyB2b2lkIHRmdHBfcHJvZ3Jlc3NfZG9uZSh2b2lkKQoreworCWlmIChpc19iYl9wcm9ncmVzc19pbml0ZWQoJkcucG10KSkgeworCQl0ZnRwX3Byb2dyZXNzX3VwZGF0ZSgpOworCQliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKwkJYmJfcHJvZ3Jlc3NfZnJlZSgmRy5wbXQpOworCX0KK30KKyNlbHNlCisjIGRlZmluZSB0ZnRwX3Byb2dyZXNzX2luaXQoKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHRmdHBfcHJvZ3Jlc3NfZG9uZSgpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCitzdGF0aWMgaW50IHRmdHBfYmxrc2l6ZV9jaGVjayhjb25zdCBjaGFyICpibGtzaXplX3N0ciwgaW50IG1heHNpemUpCit7CisJLyogQ2hlY2sgaWYgdGhlIGJsa3NpemUgaXMgdmFsaWQ6CisJICogUkZDMjM0OCBzYXlzIGJldHdlZW4gOCBhbmQgNjU0NjQsCisJICogYnV0IG91ciBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBpbXBvc3NpYmxlCisJICogdG8gdXNlIGJsa3NpemVzIHNtYWxsZXIgdGhhbiAyMiBvY3RldHMuICovCisJdW5zaWduZWQgYmxrc2l6ZSA9IGJiX3N0cnRvdShibGtzaXplX3N0ciwgTlVMTCwgMTApOworCWlmIChlcnJubworCSB8fCAoYmxrc2l6ZSA8IDI0KSB8fCAoYmxrc2l6ZSA+IG1heHNpemUpCisJKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGJsb2Nrc2l6ZSAnJXMnIiwgYmxrc2l6ZV9zdHIpOworCQlyZXR1cm4gLTE7CisJfQorIyBpZiBFTkFCTEVfVEZUUF9ERUJVRworCWJiX2Vycm9yX21zZygidXNpbmcgYmxrc2l6ZSAldSIsIGJsa3NpemUpOworIyBlbmRpZgorCXJldHVybiBibGtzaXplOworfQorCitzdGF0aWMgY2hhciAqdGZ0cF9nZXRfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdGlvbiwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBvcHRfdmFsID0gMDsKKwlpbnQgb3B0X2ZvdW5kID0gMDsKKwlpbnQgazsKKworCS8qIGJ1ZiBwb2ludHMgdG86CisJICogIm9wdF9uYW1lPE5VTD5vcHRfdmFsPE5VTD5vcHRfbmFtZTI8TlVMPm9wdF92YWwyPE5VTD4uLi4iICovCisKKwl3aGlsZSAobGVuID4gMCkgeworCQkvKiBNYWtlIHN1cmUgb3B0aW9ucyBhcmUgdGVybWluYXRlZCBjb3JyZWN0bHkgKi8KKwkJZm9yIChrID0gMDsgayA8IGxlbjsgaysrKSB7CisJCQlpZiAoYnVmW2tdID09ICdcMCcpIHsKKwkJCQlnb3RvIG51bF9mb3VuZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gTlVMTDsKKyBudWxfZm91bmQ6CisJCWlmIChvcHRfdmFsID09IDApIHsgLyogaXQncyAibmFtZSIgcGFydCAqLworCQkJaWYgKHN0cmNhc2VjbXAoYnVmLCBvcHRpb24pID09IDApIHsKKwkJCQlvcHRfZm91bmQgPSAxOworCQkJfQorCQl9IGVsc2UgaWYgKG9wdF9mb3VuZCkgeworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCisJCWsrKzsKKwkJYnVmICs9IGs7CisJCWxlbiAtPSBrOworCQlvcHRfdmFsIF49IDE7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHRmdHBfcHJvdG9jb2woCisJCS8qIE5VTEwgaWYgdGZ0cCwgIU5VTEwgaWYgdGZ0cGQ6ICovCisJCWxlbl9hbmRfc29ja2FkZHIgKm91cl9sc2EsCisJCWxlbl9hbmRfc29ja2FkZHIgKnBlZXJfbHNhLAorCQljb25zdCBjaGFyICpsb2NhbF9maWxlCisJCUlGX1RGVFAoLCBjb25zdCBjaGFyICpyZW1vdGVfZmlsZSkKKyNpZiAhRU5BQkxFX1RGVFAKKyMgZGVmaW5lIHJlbW90ZV9maWxlIE5VTEwKKyNlbmRpZgorCQkvKiAxIGZvciB0ZnRwOyAxLzAgZm9yIHRmdHBkIGRlcGVuZGluZyB3aGV0aGVyIGNsaWVudCBhc2tlZCBhYm91dCBpdDogKi8KKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIGludCB3YW50X3RyYW5zZmVyX3NpemUpCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCBpbnQgYmxrc2l6ZSkpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJZW51bSB7IGJsa3NpemUgPSBURlRQX0JMS1NJWkVfREVGQVVMVCB9OworI2VuZGlmCisKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKyNkZWZpbmUgc29ja2V0X2ZkIChwZmRbMF0uZmQpCisJaW50IGxlbjsKKwlpbnQgc2VuZF9sZW47CisJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRShzbWFsbGludCBleHBlY3RfT0FDSyA9IDA7KQorCXNtYWxsaW50IGZpbmlzaGVkID0gMDsKKwl1aW50MTZfdCBvcGNvZGU7CisJdWludDE2X3QgYmxvY2tfbnI7CisJdWludDE2X3QgcmVjdl9ibGs7CisJaW50IG9wZW5fbW9kZSwgbG9jYWxfZmQ7CisJaW50IHJldHJpZXMsIHdhaXR0aW1lX21zOworCWludCBpb19idWZzaXplID0gYmxrc2l6ZSArIDQ7CisJY2hhciAqY3A7CisJLyogQ2FuJ3QgdXNlIFJFU0VSVkVfQ09ORklHX0JVRkZFUiBoZXJlIHNpbmNlIHRoZSBhbGxvY2F0aW9uCisJICogc2l6ZSB2YXJpZXMgbWVhbmluZyBCVUZGRVJTX0dPX09OX1NUQUNLIHdvdWxkIGZhaWwuCisJICoKKwkgKiBXZSBtdXN0IGtlZXAgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgc2VwYXJhdGUKKwkgKiBpbiBjYXNlIHdlIHJjdiBhIGdhcmJhZ2UgcGt0IC0gd2UgbmVlZCB0byByZXhtaXQgdGhlIGxhc3QgcGt0LgorCSAqLworCWNoYXIgKnhidWYgPSB4bWFsbG9jKGlvX2J1ZnNpemUpOworCWNoYXIgKnJidWYgPSB4bWFsbG9jKGlvX2J1ZnNpemUpOworCisJc29ja2V0X2ZkID0geHNvY2tldChwZWVyX2xzYS0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworCXNldHNvY2tvcHRfcmV1c2VhZGRyKHNvY2tldF9mZCk7CisKKwlpZiAoIUVOQUJMRV9URlRQIHx8IG91cl9sc2EpIHsgLyogdGZ0cGQgKi8KKwkJLyogQ3JlYXRlIGEgc29ja2V0IHdoaWNoIGlzOgorCQkgKiAxLiBib3VuZCB0byBJUDpwb3J0IHBlZXIgc2VudCAxc3QgZGF0YWdyYW0gdG8sCisJCSAqIDIuIGNvbm5lY3RlZCB0byBwZWVyJ3MgSVA6cG9ydAorCQkgKiBUaGlzIHdheSB3ZSB3aWxsIGFuc3dlciBmcm9tIHRoZSBJUDpwb3J0IHBlZXIKKwkJICogZXhwZWN0cywgd2lsbCBub3QgZ2V0IGFueSBvdGhlciBwYWNrZXRzIG9uCisJCSAqIHRoZSBzb2NrZXQsIGFuZCBhbHNvIHBsYWluIHJlYWQvd3JpdGUgd2lsbCB3b3JrLiAqLworCQl4YmluZChzb2NrZXRfZmQsICZvdXJfbHNhLT51LnNhLCBvdXJfbHNhLT5sZW4pOworCQl4Y29ubmVjdChzb2NrZXRfZmQsICZwZWVyX2xzYS0+dS5zYSwgcGVlcl9sc2EtPmxlbik7CisKKwkJLyogSXMgdGhlcmUgYW4gZXJyb3IgYWxyZWFkeT8gU2VuZCBwa3QgYW5kIGJhaWwgb3V0ICovCisJCWlmIChlcnJvcl9wa3RfcmVhc29uIHx8IGVycm9yX3BrdF9zdHJbMF0pCisJCQlnb3RvIHNlbmRfZXJyX3BrdDsKKworCQlpZiAodXNlcl9vcHQpIHsKKwkJCXN0cnVjdCBwYXNzd2QgKnB3ID0geGdldHB3bmFtKHVzZXJfb3B0KTsKKwkJCWNoYW5nZV9pZGVudGl0eShwdyk7IC8qIGluaXRncm91cHMsIHNldGdpZCwgc2V0dWlkICovCisJCX0KKwl9CisKKwkvKiBQcmVwYXJlIG9wZW4gbW9kZSAqLworCWlmIChDTURfUFVUKG9wdGlvbl9tYXNrMzIpKSB7CisJCW9wZW5fbW9kZSA9IE9fUkRPTkxZOworCX0gZWxzZSB7CisJCW9wZW5fbW9kZSA9IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQ7CisjaWYgRU5BQkxFX1RGVFBECisJCWlmICgob3B0aW9uX21hc2szMiAmIChURlRQRF9PUFQrVEZUUERfT1BUX2MpKSA9PSBURlRQRF9PUFQpIHsKKwkJCS8qIHRmdHBkIHdpdGhvdXQgLWMgKi8KKwkJCW9wZW5fbW9kZSA9IE9fV1JPTkxZIHwgT19UUlVOQzsKKwkJfQorI2VuZGlmCisJfQorCisJLyogRXhhbXBsZXMgb2YgbmV0d29yayB0cmFmZmljLgorCSAqIE5vdGUgdHdvIGNhc2VzIHdoZW4gQUNLcyB3aXRoIGJsb2NrIyBvZiAwIGFyZSBzZW50LgorCSAqCisJICogRG93bmxvYWQgd2l0aG91dCBvcHRpb25zOgorCSAqIHRmdHAgLT4gIlwwXDFGSUxFTkFNRVwwb2N0ZXRcMCIKKwkgKiAgICAgICAgICJcMFwzXDBcMUZJTEVEQVRBLi4uIiA8LSB0ZnRwZAorCSAqIHRmdHAgLT4gIlwwXDRcMFwxIgorCSAqIC4uLgorCSAqIERvd25sb2FkIHdpdGggb3B0aW9uIG9mIGJsa3NpemUgMTYzODQ6CisJICogdGZ0cCAtPiAiXDBcMUZJTEVOQU1FXDBvY3RldFwwYmxrc2l6ZVwwMDAxNjM4NFwwIgorCSAqICAgICAgICAgIlwwXDZibGtzaXplXDAwMDE2Mzg0XDAiIDwtIHRmdHBkCisJICogdGZ0cCAtPiAiXDBcNFwwXDAiCisJICogICAgICAgICAiXDBcM1wwXDFGSUxFREFUQS4uLiIgPC0gdGZ0cGQKKwkgKiB0ZnRwIC0+ICJcMFw0XDBcMSIKKwkgKiAuLi4KKwkgKiBVcGxvYWQgd2l0aG91dCBvcHRpb25zOgorCSAqIHRmdHAgLT4gIlwwXDJGSUxFTkFNRVwwb2N0ZXRcMCIKKwkgKiAgICAgICAgICJcMFw0XDBcMCIgPC0gdGZ0cGQKKwkgKiB0ZnRwIC0+ICJcMFwzXDBcMUZJTEVEQVRBLi4uIgorCSAqICAgICAgICAgIlwwXDRcMFwxIiA8LSB0ZnRwZAorCSAqIC4uLgorCSAqIFVwbG9hZCB3aXRoIG9wdGlvbiBvZiBibGtzaXplIDE2Mzg0OgorCSAqIHRmdHAgLT4gIlwwXDJGSUxFTkFNRVwwb2N0ZXRcMGJsa3NpemVcMDAwMTYzODRcMCIKKwkgKiAgICAgICAgICJcMFw2Ymxrc2l6ZVwwMDAxNjM4NFwwIiA8LSB0ZnRwZAorCSAqIHRmdHAgLT4gIlwwXDNcMFwxRklMRURBVEEuLi4iCisJICogICAgICAgICAiXDBcNFwwXDEiIDwtIHRmdHBkCisJICogLi4uCisJICovCisJYmxvY2tfbnIgPSAxOworCWNwID0geGJ1ZiArIDI7CisKKwlpZiAoIUVOQUJMRV9URlRQIHx8IG91cl9sc2EpIHsgLyogdGZ0cGQgKi8KKwkJLyogT3BlbiBmaWxlIChtdXN0IGJlIGFmdGVyIGNoYW5naW5nIHVzZXIpICovCisJCWxvY2FsX2ZkID0gb3Blbihsb2NhbF9maWxlLCBvcGVuX21vZGUsIDA2NjYpOworCQlpZiAobG9jYWxfZmQgPCAwKSB7CisJCQllcnJvcl9wa3RfcmVhc29uID0gRVJSX05PRklMRTsKKwkJCXN0cmNweSgoY2hhciopZXJyb3JfcGt0X3N0ciwgImNhbid0IG9wZW4gZmlsZSIpOworCQkJZ290byBzZW5kX2Vycl9wa3Q7CisJCX0KKy8qIGdjYyA0LjMuMSB3b3VsZCBOT1Qgb3B0aW1pemUgaXQgb3V0IGFzIGl0IHNob3VsZCEgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCQlpZiAoYmxrc2l6ZSAhPSBURlRQX0JMS1NJWkVfREVGQVVMVCB8fCB3YW50X3RyYW5zZmVyX3NpemUpIHsKKwkJCS8qIENyZWF0ZSBhbmQgc2VuZCBPQUNLIHBhY2tldC4gKi8KKwkJCS8qIEZvciB0aGUgZG93bmxvYWQgY2FzZSwgYmxvY2tfbnIgaXMgc3RpbGwgMSAtCisJCQkgKiB3ZSBleHBlY3QgMXN0IEFDSyBmcm9tIHBlZXIgdG8gYmUgZm9yIChibG9ja19uci0xKSwKKwkJCSAqIHRoYXQgaXMsIGZvciAiYmxvY2sgMCIgd2hpY2ggaXMgb3VyIE9BQ0sgcGt0ICovCisJCQlvcGNvZGUgPSBURlRQX09BQ0s7CisJCQlnb3RvIGFkZF9ibGtzaXplX29wdDsKKwkJfQorI2VuZGlmCisJCWlmIChDTURfR0VUKG9wdGlvbl9tYXNrMzIpKSB7CisJCQkvKiBJdCdzIHVwbG9hZCBhbmQgd2UgZG9uJ3Qgc2VuZCBPQUNLLgorCQkJICogV2UgbXVzdCBBQ0sgMXN0IHBhY2tldCAod2l0aCBmaWxlbmFtZSkKKwkJCSAqIGFzIGlmIGl0IGlzICJibG9jayAwIiAqLworCQkJYmxvY2tfbnIgPSAwOworCQl9CisKKwl9IGVsc2UgeyAvKiB0ZnRwICovCisJCS8qIE9wZW4gZmlsZSAobXVzdCBiZSBhZnRlciBjaGFuZ2luZyB1c2VyKSAqLworCQlsb2NhbF9mZCA9IENNRF9HRVQob3B0aW9uX21hc2szMikgPyBTVERPVVRfRklMRU5PIDogU1RESU5fRklMRU5POworCQlpZiAoTk9UX0xPTkVfREFTSChsb2NhbF9maWxlKSkKKwkJCWxvY2FsX2ZkID0geG9wZW4obG9jYWxfZmlsZSwgb3Blbl9tb2RlKTsKKy8qIFJlbW92aW5nICNpZiwgb3IgdXNpbmcgaWYoKSBzdGF0ZW1lbnQgaW5zdGVhZCBvZiAjaWYgbWF5IGxlYWQgdG8KKyAqICJ3YXJuaW5nOiBudWxsIGFyZ3VtZW50IHdoZXJlIG5vbi1udWxsIHJlcXVpcmVkIjogKi8KKyNpZiBFTkFCTEVfVEZUUAorCQkvKiB0ZnRwICovCisKKwkJLyogV2UgY2FuJ3QgKGFuZCBkb24ndCByZWFsbHkgbmVlZCB0bykgYmluZCB0aGUgc29ja2V0OgorCQkgKiB3ZSBkb24ndCBrbm93IGZyb20gd2hpY2ggbG9jYWwgSVAgZGF0YWdyYW1zIHdpbGwgYmUgc2VudCwKKwkJICogYnV0IGtlcm5lbCB3aWxsIHBpY2sgdGhlIHNhbWUgSVAgZXZlcnkgdGltZSAodW5sZXNzIHJvdXRpbmcKKwkJICogdGFibGUgaXMgY2hhbmdlZCksIHRodXMgcGVlciB3aWxsIHNlZSBkZ3JhbXMgY29uc2lzdGVudGx5CisJCSAqIGNvbWluZyBmcm9tIHRoZSBzYW1lIElQLgorCQkgKiBXZSB3b3VsZCBsaWtlIHRvIGNvbm5lY3QgdGhlIHNvY2tldCwgYnV0IHNpbmNlIHBlZXIncworCQkgKiBVRFAgY29kZSBjYW4gYmUgbGVzcyBwZXJmZWN0IHRoYW4gb3VycywgX3BlZXInc18gSVA6cG9ydAorCQkgKiBpbiByZXBsaWVzIG1heSBkaWZmZXIgZnJvbSBJUDpwb3J0IHdlIHVzZWQgdG8gc2VuZAorCQkgKiBvdXIgZmlyc3QgcGFja2V0LiBXZSBjYW4gY29ubmVjdCgpIG9ubHkgd2hlbiB3ZSBnZXQKKwkJICogZmlyc3QgcmVwbHkuICovCisKKwkJLyogYnVpbGQgb3Bjb2RlICovCisJCW9wY29kZSA9IFRGVFBfV1JROworCQlpZiAoQ01EX0dFVChvcHRpb25fbWFzazMyKSkgeworCQkJb3Bjb2RlID0gVEZUUF9SUlE7CisJCX0KKwkJLyogYWRkIGZpbGVuYW1lIGFuZCBtb2RlICovCisJCS8qIGZpbGwgaW4gcGFja2V0IGlmIHRoZSBmaWxlbmFtZSBmaXRzIGludG8geGJ1ZiAqLworCQlsZW4gPSBzdHJsZW4ocmVtb3RlX2ZpbGUpICsgMTsKKwkJaWYgKDIgKyBsZW4gKyBzaXplb2YoIm9jdGV0IikgPj0gaW9fYnVmc2l6ZSkgeworCQkJYmJfZXJyb3JfbXNnKCJyZW1vdGUgZmlsZW5hbWUgaXMgdG9vIGxvbmciKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCXN0cmNweShjcCwgcmVtb3RlX2ZpbGUpOworCQljcCArPSBsZW47CisJCS8qIGFkZCAibW9kZSIgcGFydCBvZiB0aGUgcGFja2V0ICovCisJCXN0cmNweShjcCwgIm9jdGV0Iik7CisJCWNwICs9IHNpemVvZigib2N0ZXQiKTsKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCQlpZiAoYmxrc2l6ZSA9PSBURlRQX0JMS1NJWkVfREVGQVVMVCAmJiAhd2FudF90cmFuc2Zlcl9zaXplKQorCQkJZ290byBzZW5kX3BrdDsKKworCQkvKiBOZWVkIHRvIGFkZCBvcHRpb24gdG8gcGt0ICovCisJCWlmICgoJnhidWZbaW9fYnVmc2l6ZSAtIDFdIC0gY3ApIDwgc2l6ZW9mKCJibGtzaXplIE5OTk5OIHRzaXplICIpICsgc2l6ZW9mKG9mZl90KSozKSB7CisJCQliYl9lcnJvcl9tc2coInJlbW90ZSBmaWxlbmFtZSBpcyB0b28gbG9uZyIpOworCQkJZ290byByZXQ7CisJCX0KKwkJZXhwZWN0X09BQ0sgPSAxOworIyBlbmRpZgorI2VuZGlmIC8qIEVOQUJMRV9URlRQICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorIGFkZF9ibGtzaXplX29wdDoKKwkJaWYgKGJsa3NpemUgIT0gVEZUUF9CTEtTSVpFX0RFRkFVTFQpIHsKKwkJCS8qIGFkZCAiYmxrc2l6ZSIsIDxudWw+LCBibGtzaXplLCA8bnVsPiAqLworCQkJc3RyY3B5KGNwLCAiYmxrc2l6ZSIpOworCQkJY3AgKz0gc2l6ZW9mKCJibGtzaXplIik7CisJCQljcCArPSBzbnByaW50ZihjcCwgNiwgIiVkIiwgYmxrc2l6ZSkgKyAxOworCQl9CisJCWlmICh3YW50X3RyYW5zZmVyX3NpemUpIHsKKwkJCS8qIGFkZCAidHNpemUiLCA8bnVsPiwgc2l6ZSwgPG51bD4gKHNlZSBSRkMyMzQ5KSAqLworCQkJLyogaWYgdGZ0cCBhbmQgZG93bmxvYWRpbmcsIHdlIHNlbmQgIjAiIChzaW5jZSB3ZSBvcGVuZWQgbG9jYWxfZmQgd2l0aCBPX1RSVU5DKQorCQkJICogYW5kIHRoaXMgbWFrZXMgc2VydmVyIHRvIHNlbmQgInRzaXplIiBvcHRpb24gd2l0aCB0aGUgc2l6ZSAqLworCQkJLyogaWYgdGZ0cCBhbmQgdXBsb2FkaW5nLCB3ZSBzZW5kIGZpbGUgc2l6ZSAobWF5YmUgZG9udCwgdG8gbm90IGNvbmZ1c2Ugb2xkIHNlcnZlcnM/Pz8pICovCisJCQkvKiBpZiB0ZnRwZCBhbmQgZG93bmxvYWRpbmcsIHdlIGFyZSBhbnN3ZXJpbmcgdG8gY2xpZW50J3MgcmVxdWVzdCAqLworCQkJLyogaWYgdGZ0cGQgYW5kIHVwbG9hZGluZzogIXdhbnRfdHJhbnNmZXJfc2l6ZSwgdGhpcyBjb2RlIGlzIG5vdCBleGVjdXRlZCAqLworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlzdHJjcHkoY3AsICJ0c2l6ZSIpOworCQkJY3AgKz0gc2l6ZW9mKCJ0c2l6ZSIpOworCQkJc3Quc3Rfc2l6ZSA9IDA7CisJCQlmc3RhdChsb2NhbF9mZCwgJnN0KTsKKwkJCWNwICs9IHNwcmludGYoY3AsICIlIk9GRl9GTVQidSIsIChvZmZfdClzdC5zdF9zaXplKSArIDE7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCisJCQkvKiBTYXZlIGZvciBwcm9ncmVzcyBiYXIuIElmIDAgKHRmdHAgZG93bmxvYWRpbmcpLAorCQkJICogd2UgbG9vayBhdCBzZXJ2ZXIncyByZXBseSBsYXRlciAqLworCQkJRy5zaXplID0gc3Quc3Rfc2l6ZTsKKwkJCWlmIChyZW1vdGVfZmlsZSAmJiBzdC5zdF9zaXplKQorCQkJCXRmdHBfcHJvZ3Jlc3NfaW5pdCgpOworIyBlbmRpZgorCQl9CisjZW5kaWYKKwkJLyogRmlyc3QgcGFja2V0IGlzIGJ1aWx0LCBzbyBza2lwIHBhY2tldCBnZW5lcmF0aW9uICovCisJCWdvdG8gc2VuZF9wa3Q7CisJfQorCisJLyogVXNpbmcgbW9zdGx5IGdvdG8ncyAtIGNvbnRpbnVlL2JyZWFrIHdpbGwgYmUgbGVzcyBjbGVhcgorCSAqIGluIHdoZXJlIHdlIGFjdHVhbGx5IGp1bXAgdG8gKi8KKwl3aGlsZSAoMSkgeworCQkvKiBCdWlsZCBBQ0sgb3IgREFUQSAqLworCQljcCA9IHhidWYgKyAyOworCQkqKCh1aW50MTZfdCopY3ApID0gaHRvbnMoYmxvY2tfbnIpOworCQljcCArPSAyOworCQlibG9ja19ucisrOworCQlvcGNvZGUgPSBURlRQX0FDSzsKKwkJaWYgKENNRF9QVVQob3B0aW9uX21hc2szMikpIHsKKwkJCW9wY29kZSA9IFRGVFBfREFUQTsKKwkJCWxlbiA9IGZ1bGxfcmVhZChsb2NhbF9mZCwgY3AsIGJsa3NpemUpOworCQkJaWYgKGxlbiA8IDApIHsKKwkJCQlnb3RvIHNlbmRfcmVhZF9lcnJfcGt0OworCQkJfQorCQkJaWYgKGxlbiAhPSBibGtzaXplKSB7CisJCQkJZmluaXNoZWQgPSAxOworCQkJfQorCQkJY3AgKz0gbGVuOworCQkJSUZfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUihHLnBvcyArPSBsZW47KQorCQl9Cisgc2VuZF9wa3Q6CisJCS8qIFNlbmQgcGFja2V0ICovCisJCSooKHVpbnQxNl90Kil4YnVmKSA9IGh0b25zKG9wY29kZSk7IC8qIGZpbGwgaW4gb3Bjb2RlIHBhcnQgKi8KKwkJc2VuZF9sZW4gPSBjcCAtIHhidWY7CisJCS8qIE5COiBzZW5kX2xlbiB2YWx1ZSBpcyBwcmVzZXJ2ZWQgaW4gY29kZSBiZWxvdworCQkgKiBmb3IgcG90ZW50aWFsIHJlc2VuZCAqLworCisJCXJldHJpZXMgPSBURlRQX05VTV9SRVRSSUVTOyAgLyogcmUtaW5pdGlhbGl6ZSAqLworCQl3YWl0dGltZV9tcyA9IFRGVFBfVElNRU9VVF9NUzsKKworIHNlbmRfYWdhaW46CisjaWYgRU5BQkxFX1RGVFBfREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJzZW5kaW5nICV1IGJ5dGVzXG4iLCBzZW5kX2xlbik7CisJCWZvciAoY3AgPSB4YnVmOyBjcCA8ICZ4YnVmW3NlbmRfbGVuXTsgY3ArKykKKwkJCWZwcmludGYoc3RkZXJyLCAiJTAyeCAiLCAodW5zaWduZWQgY2hhcikgKmNwKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworI2VuZGlmCisJCXhzZW5kdG8oc29ja2V0X2ZkLCB4YnVmLCBzZW5kX2xlbiwgJnBlZXJfbHNhLT51LnNhLCBwZWVyX2xzYS0+bGVuKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCisJCWlmIChpc19iYl9wcm9ncmVzc19pbml0ZWQoJkcucG10KSkKKwkJCXRmdHBfcHJvZ3Jlc3NfdXBkYXRlKCk7CisjZW5kaWYKKwkJLyogV2FzIGl0IGZpbmFsIEFDSz8gdGhlbiBleGl0ICovCisJCWlmIChmaW5pc2hlZCAmJiAob3Bjb2RlID09IFRGVFBfQUNLKSkKKwkJCWdvdG8gcmV0OworCisgcmVjdl9hZ2FpbjoKKwkJLyogUmVjZWl2ZSBwYWNrZXQgKi8KKwkJLypwZmRbMF0uZmQgPSBzb2NrZXRfZmQ7Ki8KKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJc3dpdGNoIChzYWZlX3BvbGwocGZkLCAxLCB3YWl0dGltZV9tcykpIHsKKwkJZGVmYXVsdDoKKwkJCS8qYmJfcGVycm9yX21zZygicG9sbCIpOyAtIGRvbmUgaW4gc2FmZV9wb2xsICovCisJCQlnb3RvIHJldDsKKwkJY2FzZSAwOgorCQkJcmV0cmllcy0tOworCQkJaWYgKHJldHJpZXMgPT0gMCkgeworCQkJCXRmdHBfcHJvZ3Jlc3NfZG9uZSgpOworCQkJCWJiX2Vycm9yX21zZygidGltZW91dCIpOworCQkJCWdvdG8gcmV0OyAvKiBubyBlcnIgcGFja2V0IHNlbnQgKi8KKwkJCX0KKworCQkJLyogZXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGxpbWl0ICovCisJCQl3YWl0dGltZV9tcyArPSB3YWl0dGltZV9tcy8yOworCQkJaWYgKHdhaXR0aW1lX21zID4gVEZUUF9NQVhUSU1FT1VUX01TKSB7CisJCQkJd2FpdHRpbWVfbXMgPSBURlRQX01BWFRJTUVPVVRfTVM7CisJCQl9CisKKwkJCWdvdG8gc2VuZF9hZ2FpbjsgLyogcmVzZW5kIGxhc3Qgc2VudCBwa3QgKi8KKwkJY2FzZSAxOgorCQkJaWYgKCFvdXJfbHNhKSB7CisJCQkJLyogdGZ0cCAobm90IHRmdHBkISkgcmVjZWl2aW5nIDFzdCBwYWNrZXQgKi8KKwkJCQlvdXJfbHNhID0gKCh2b2lkKikocHRyZGlmZl90KS0xKTsgLyogbm90IE5VTEwgKi8KKwkJCQlsZW4gPSByZWN2ZnJvbShzb2NrZXRfZmQsIHJidWYsIGlvX2J1ZnNpemUsIDAsCisJCQkJCQkmcGVlcl9sc2EtPnUuc2EsICZwZWVyX2xzYS0+bGVuKTsKKwkJCQkvKiBPdXIgZmlyc3QgZGdyYW0gd2VudCB0byBwb3J0IDY5CisJCQkJICogYnV0IHJlcGx5IG1heSBjb21lIGZyb20gZGlmZmVyZW50IG9uZS4KKwkJCQkgKiBSZW1lbWJlciBhbmQgdXNlIHRoaXMgbmV3IHBvcnQgKGFuZCBJUCkgKi8KKwkJCQlpZiAobGVuID49IDApCisJCQkJCXhjb25uZWN0KHNvY2tldF9mZCwgJnBlZXJfbHNhLT51LnNhLCBwZWVyX2xzYS0+bGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogdGZ0cGQsIG9yIG5vdCB0aGUgdmVyeSBmaXJzdCBwYWNrZXQ6CisJCQkJICogc29ja2V0IGlzIGNvbm5lY3QoKWVkLCBjYW4ganVzdCByZWFkIGZyb20gaXQuICovCisJCQkJLyogRG9uJ3QgZnVsbF9yZWFkKCkhCisJCQkJICogVGhpcyBpcyBub3QgVENQLCBvbmUgcmVhZCA9PSBvbmUgcGt0ISAqLworCQkJCWxlbiA9IHNhZmVfcmVhZChzb2NrZXRfZmQsIHJidWYsIGlvX2J1ZnNpemUpOworCQkJfQorCQkJaWYgKGxlbiA8IDApIHsKKwkJCQlnb3RvIHNlbmRfcmVhZF9lcnJfcGt0OworCQkJfQorCQkJaWYgKGxlbiA8IDQpIHsgLyogdG9vIHNtYWxsPyAqLworCQkJCWdvdG8gcmVjdl9hZ2FpbjsKKwkJCX0KKwkJfQorCisJCS8qIFByb2Nlc3MgcmVjdidlZCBwYWNrZXQgKi8KKwkJb3Bjb2RlID0gbnRvaHMoICgodWludDE2X3QqKXJidWYpWzBdICk7CisJCXJlY3ZfYmxrID0gbnRvaHMoICgodWludDE2X3QqKXJidWYpWzFdICk7CisjaWYgRU5BQkxFX1RGVFBfREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJyZWNlaXZlZCAlZCBieXRlczogJTA0eCAlMDR4XG4iLCBsZW4sIG9wY29kZSwgcmVjdl9ibGspOworI2VuZGlmCisJCWlmIChvcGNvZGUgPT0gVEZUUF9FUlJPUikgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgZXJyY29kZV9zdHJbXSBBTElHTjEgPQorCQkJCSJcMCIKKwkJCQkiZmlsZSBub3QgZm91bmRcMCIKKwkJCQkiYWNjZXNzIHZpb2xhdGlvblwwIgorCQkJCSJkaXNrIGZ1bGxcMCIKKwkJCQkiYmFkIG9wZXJhdGlvblwwIgorCQkJCSJ1bmtub3duIHRyYW5zZmVyIGlkXDAiCisJCQkJImZpbGUgYWxyZWFkeSBleGlzdHNcMCIKKwkJCQkibm8gc3VjaCB1c2VyXDAiCisJCQkJImJhZCBvcHRpb24iOworCisJCQljb25zdCBjaGFyICptc2cgPSAiIjsKKworCQkJaWYgKGxlbiA+IDQgJiYgcmJ1Zls0XSAhPSAnXDAnKSB7CisJCQkJbXNnID0gJnJidWZbNF07CisJCQkJcmJ1Zltpb19idWZzaXplIC0gMV0gPSAnXDAnOyAvKiBwYXJhbm9pYSAqLworCQkJfSBlbHNlIGlmIChyZWN2X2JsayA8PSA4KSB7CisJCQkJbXNnID0gbnRoX3N0cmluZyhlcnJjb2RlX3N0ciwgcmVjdl9ibGspOworCQkJfQorCQkJYmJfZXJyb3JfbXNnKCJzZXJ2ZXIgZXJyb3I6ICgldSkgJXMiLCByZWN2X2JsaywgbXNnKTsKKwkJCWdvdG8gcmV0OworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCQlpZiAoZXhwZWN0X09BQ0spIHsKKwkJCWV4cGVjdF9PQUNLID0gMDsKKwkJCWlmIChvcGNvZGUgPT0gVEZUUF9PQUNLKSB7CisJCQkJLyogc2VydmVyIHNlZW1zIHRvIHN1cHBvcnQgb3B0aW9ucyAqLworCQkJCWNoYXIgKnJlczsKKworCQkJCXJlcyA9IHRmdHBfZ2V0X29wdGlvbigiYmxrc2l6ZSIsICZyYnVmWzJdLCBsZW4gLSAyKTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCWJsa3NpemUgPSB0ZnRwX2Jsa3NpemVfY2hlY2socmVzLCBibGtzaXplKTsKKwkJCQkJaWYgKGJsa3NpemUgPCAwKSB7CisJCQkJCQllcnJvcl9wa3RfcmVhc29uID0gRVJSX0JBRF9PUFQ7CisJCQkJCQlnb3RvIHNlbmRfZXJyX3BrdDsKKwkJCQkJfQorCQkJCQlpb19idWZzaXplID0gYmxrc2l6ZSArIDQ7CisJCQkJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUgorCQkJCWlmIChyZW1vdGVfZmlsZSAmJiBHLnNpemUgPT0gMCkgeyAvKiBpZiB3ZSBkb24ndCBrbm93IGl0IHlldCAqLworCQkJCQlyZXMgPSB0ZnRwX2dldF9vcHRpb24oInRzaXplIiwgJnJidWZbMl0sIGxlbiAtIDIpOworCQkJCQlpZiAocmVzKSB7CisJCQkJCQlHLnNpemUgPSBiYl9zdHJ0b3VsbChyZXMsIE5VTEwsIDEwKTsKKwkJCQkJCWlmIChHLnNpemUpCisJCQkJCQkJdGZ0cF9wcm9ncmVzc19pbml0KCk7CisJCQkJCX0KKwkJCQl9CisjIGVuZGlmCisJCQkJaWYgKENNRF9HRVQob3B0aW9uX21hc2szMikpIHsKKwkJCQkJLyogV2UnbGwgc2VuZCBBQ0sgZm9yIE9BQ0ssCisJCQkJCSAqIHN1Y2ggQUNLIGhhcyAiYmxvY2sgbm8iIG9mIDAgKi8KKwkJCQkJYmxvY2tfbnIgPSAwOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIHJmYzIzNDc6CisJCQkgKiAiQW4gb3B0aW9uIG5vdCBhY2tub3dsZWRnZWQgYnkgdGhlIHNlcnZlcgorCQkJICogbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBjbGllbnQgYW5kIHNlcnZlcgorCQkJICogYXMgaWYgaXQgd2VyZSBuZXZlciByZXF1ZXN0ZWQuIiAqLworCQkJaWYgKGJsa3NpemUgIT0gVEZUUF9CTEtTSVpFX0RFRkFVTFQpCisJCQkJYmJfZXJyb3JfbXNnKCJmYWxsaW5nIGJhY2sgdG8gYmxvY2tzaXplICJURlRQX0JMS1NJWkVfREVGQVVMVF9TVFIpOworCQkJYmxrc2l6ZSA9IFRGVFBfQkxLU0laRV9ERUZBVUxUOworCQkJaW9fYnVmc2l6ZSA9IFRGVFBfQkxLU0laRV9ERUZBVUxUICsgNDsKKwkJfQorI2VuZGlmCisJCS8qIGJsb2NrX25yIGlzIGFscmVhZHkgYWR2YW5jZWQgdG8gbmV4dCBibG9jayMgd2UgZXhwZWN0CisJCSAqIHRvIGdldCAvIGJsb2NrIyB3ZSBhcmUgYWJvdXQgdG8gc2VuZCBuZXh0IHRpbWUgKi8KKworCQlpZiAoQ01EX0dFVChvcHRpb25fbWFzazMyKSAmJiAob3Bjb2RlID09IFRGVFBfREFUQSkpIHsKKwkJCWlmIChyZWN2X2JsayA9PSBibG9ja19ucikgeworCQkJCWludCBzeiA9IGZ1bGxfd3JpdGUobG9jYWxfZmQsICZyYnVmWzRdLCBsZW4gLSA0KTsKKwkJCQlpZiAoc3ogIT0gbGVuIC0gNCkgeworCQkJCQlzdHJjcHkoKGNoYXIqKWVycm9yX3BrdF9zdHIsIGJiX21zZ193cml0ZV9lcnJvcik7CisJCQkJCWVycm9yX3BrdF9yZWFzb24gPSBFUlJfV1JJVEU7CisJCQkJCWdvdG8gc2VuZF9lcnJfcGt0OworCQkJCX0KKwkJCQlpZiAoc3ogIT0gYmxrc2l6ZSkgeworCQkJCQlmaW5pc2hlZCA9IDE7CisJCQkJfQorCQkJCUlGX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIoRy5wb3MgKz0gc3o7KQorCQkJCWNvbnRpbnVlOyAvKiBzZW5kIEFDSyAqLworCQkJfQorLyogRGlzYWJsZWQgdG8gY29wZSB3aXRoIHNlcnZlcnMgd2l0aCBTb3JjZXJlcidzIEFwcHJlbnRpY2UgU3luZHJvbWUgKi8KKyNpZiAwCisJCQlpZiAocmVjdl9ibGsgPT0gKGJsb2NrX25yIC0gMSkpIHsKKwkJCQkvKiBTZXJ2ZXIgbG9zdCBvdXIgVEZUUF9BQ0suICBSZXNlbmQgaXQgKi8KKwkJCQlibG9ja19uciA9IHJlY3ZfYmxrOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCX0KKworCQlpZiAoQ01EX1BVVChvcHRpb25fbWFzazMyKSAmJiAob3Bjb2RlID09IFRGVFBfQUNLKSkgeworCQkJLyogZGlkIHBlZXIgQUNLIG91ciBsYXN0IERBVEEgcGt0PyAqLworCQkJaWYgKHJlY3ZfYmxrID09ICh1aW50MTZfdCkgKGJsb2NrX25yIC0gMSkpIHsKKwkJCQlpZiAoZmluaXNoZWQpCisJCQkJCWdvdG8gcmV0OworCQkJCWNvbnRpbnVlOyAvKiBzZW5kIG5leHQgYmxvY2sgKi8KKwkJCX0KKwkJfQorCQkvKiBBd3d3Li4uIHJlY3YnZCBwYWNrZXQgaXMgbm90IHJlY29nbml6ZWQhICovCisJCWdvdG8gcmVjdl9hZ2FpbjsKKwkJLyogd2h5IHJlY3ZfYWdhaW4/IC0gcmZjMTEyMyBzYXlzOgorCQkgKiAiVGhlIHNlbmRlciAoaS5lLiwgdGhlIHNpZGUgb3JpZ2luYXRpbmcgdGhlIERBVEEgcGFja2V0cykKKwkJICogIG11c3QgbmV2ZXIgcmVzZW5kIHRoZSBjdXJyZW50IERBVEEgcGFja2V0IG9uIHJlY2VpcHQKKwkJICogIG9mIGEgZHVwbGljYXRlIEFDSyIuCisJCSAqIERBVEEgcGt0cyBhcmUgcmVzZW50IE9OTFkgb24gdGltZW91dC4KKwkJICogVGh1cyAiZ290byBzZW5kX2FnYWluIiB3aWxsIGJhIGEgYmFkIG1pc3Rha2UgYWJvdmUuCisJCSAqIFNlZToKKwkJICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Tb3JjZXJlcidzX0FwcHJlbnRpY2VfU3luZHJvbWUKKwkJICovCisJfSAvKiBlbmQgb2YgIndoaWxlICgxKSIgKi8KKyByZXQ6CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWNsb3NlKGxvY2FsX2ZkKTsKKwkJY2xvc2Uoc29ja2V0X2ZkKTsKKwkJZnJlZSh4YnVmKTsKKwkJZnJlZShyYnVmKTsKKwl9CisJcmV0dXJuIGZpbmlzaGVkID09IDA7IC8qIHJldHVybnMgMSBvbiBmYWlsdXJlICovCisKKyBzZW5kX3JlYWRfZXJyX3BrdDoKKwlzdHJjcHkoKGNoYXIqKWVycm9yX3BrdF9zdHIsIGJiX21zZ19yZWFkX2Vycm9yKTsKKyBzZW5kX2Vycl9wa3Q6CisJaWYgKGVycm9yX3BrdF9zdHJbMF0pCisJCWJiX2Vycm9yX21zZygiJXMiLCAoY2hhciopZXJyb3JfcGt0X3N0cik7CisJZXJyb3JfcGt0WzFdID0gVEZUUF9FUlJPUjsKKwl4c2VuZHRvKHNvY2tldF9mZCwgZXJyb3JfcGt0LCA0ICsgMSArIHN0cmxlbigoY2hhciopZXJyb3JfcGt0X3N0ciksCisJCQkmcGVlcl9sc2EtPnUuc2EsIHBlZXJfbHNhLT5sZW4pOworCXJldHVybiBFWElUX0ZBSUxVUkU7CisjdW5kZWYgcmVtb3RlX2ZpbGUKK30KKworI2lmIEVOQUJMRV9URlRQCisKK2ludCB0ZnRwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0ZnRwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpwZWVyX2xzYTsKKwljb25zdCBjaGFyICpsb2NhbF9maWxlID0gTlVMTDsKKwljb25zdCBjaGFyICpyZW1vdGVfZmlsZSA9IE5VTEw7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJY29uc3QgY2hhciAqYmxrc2l6ZV9zdHIgPSBURlRQX0JMS1NJWkVfREVGQVVMVF9TVFI7CisJaW50IGJsa3NpemU7CisjIGVuZGlmCisJaW50IHJlc3VsdDsKKwlpbnQgcG9ydDsKKwlJRl9HRVRQVVQoaW50IG9wdDspCisKKwlJTklUX0coKTsKKworCS8qIC1wIG9yIC1nIGlzIG1hbmRhdG9yeSwgYW5kIHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIiIgSUZfRkVBVFVSRV9URlRQX0dFVCgiZzoiKSBJRl9GRUFUVVJFX1RGVFBfUFVUKCJwOiIpCisJCQlJRl9HRVRQVVQoImctLXA6cC0tZzoiKTsKKworCUlGX0dFVFBVVChvcHQgPSkgZ2V0b3B0MzIoYXJndiwKKwkJCUlGX0ZFQVRVUkVfVEZUUF9HRVQoImciKSBJRl9GRUFUVVJFX1RGVFBfUFVUKCJwIikKKwkJCQkibDpyOiIgSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgiYjoiKSwKKwkJCSZsb2NhbF9maWxlLCAmcmVtb3RlX2ZpbGUKKwkJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCAmYmxrc2l6ZV9zdHIpKTsKKwlhcmd2ICs9IG9wdGluZDsKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCS8qIENoZWNrIGlmIHRoZSBibGtzaXplIGlzIHZhbGlkOgorCSAqIFJGQzIzNDggc2F5cyBiZXR3ZWVuIDggYW5kIDY1NDY0ICovCisJYmxrc2l6ZSA9IHRmdHBfYmxrc2l6ZV9jaGVjayhibGtzaXplX3N0ciwgNjU1NjQpOworCWlmIChibGtzaXplIDwgMCkgeworCQkvL2JiX2Vycm9yX21zZygiYmFkIGJsb2NrIHNpemUiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisjIGVuZGlmCisKKwlpZiAocmVtb3RlX2ZpbGUpIHsKKwkJaWYgKCFsb2NhbF9maWxlKSB7CisJCQljb25zdCBjaGFyICpzbGFzaCA9IHN0cnJjaHIocmVtb3RlX2ZpbGUsICcvJyk7CisJCQlsb2NhbF9maWxlID0gc2xhc2ggPyBzbGFzaCArIDEgOiByZW1vdGVfZmlsZTsKKwkJfQorCX0gZWxzZSB7CisJCXJlbW90ZV9maWxlID0gbG9jYWxfZmlsZTsKKwl9CisKKwkvKiBFcnJvciBpZiBmaWxlbmFtZSBvciBob3N0IGlzIG5vdCBrbm93biAqLworCWlmICghcmVtb3RlX2ZpbGUgfHwgIWFyZ3ZbMF0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXBvcnQgPSBiYl9sb29rdXBfcG9ydChhcmd2WzFdLCAidWRwIiwgNjkpOworCXBlZXJfbHNhID0geGhvc3Qyc29ja2FkZHIoYXJndlswXSwgcG9ydCk7CisKKyMgaWYgRU5BQkxFX1RGVFBfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgInVzaW5nIHNlcnZlciAnJXMnLCByZW1vdGVfZmlsZSAnJXMnLCBsb2NhbF9maWxlICclcydcbiIsCisJCQl4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmcGVlcl9sc2EtPnUuc2EpLAorCQkJcmVtb3RlX2ZpbGUsIGxvY2FsX2ZpbGUpOworIyBlbmRpZgorCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSCisJRy5maWxlID0gcmVtb3RlX2ZpbGU7CisjIGVuZGlmCisJcmVzdWx0ID0gdGZ0cF9wcm90b2NvbCgKKwkJTlVMTCAvKm91cl9sc2EqLywgcGVlcl9sc2EsCisJCWxvY2FsX2ZpbGUsIHJlbW90ZV9maWxlCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCAxIC8qIHdhbnRfdHJhbnNmZXJfc2l6ZSAqLykKKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIGJsa3NpemUpCisJKTsKKwl0ZnRwX3Byb2dyZXNzX2RvbmUoKTsKKworCWlmIChyZXN1bHQgIT0gRVhJVF9TVUNDRVNTICYmIE5PVF9MT05FX0RBU0gobG9jYWxfZmlsZSkgJiYgQ01EX0dFVChvcHQpKSB7CisJCXVubGluayhsb2NhbF9maWxlKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIEVOQUJMRV9URlRQICovCisKKyNpZiBFTkFCTEVfVEZUUEQKK2ludCB0ZnRwZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGZ0cGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWxlbl9hbmRfc29ja2FkZHIgKm91cl9sc2E7CisJbGVuX2FuZF9zb2NrYWRkciAqcGVlcl9sc2E7CisJY2hhciAqbG9jYWxfZmlsZSwgKm1vZGU7CisJY29uc3QgY2hhciAqZXJyb3JfbXNnOworCWludCBvcHQsIHJlc3VsdCwgb3Bjb2RlOworCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoaW50IGJsa3NpemUgPSBURlRQX0JMS1NJWkVfREVGQVVMVDspCisJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRShpbnQgd2FudF90cmFuc2Zlcl9zaXplID0gMDspCisKKwlJTklUX0coKTsKKworCW91cl9sc2EgPSBnZXRfc29ja19sc2EoU1RESU5fRklMRU5PKTsKKwlpZiAoIW91cl9sc2EpIHsKKwkJLyogVGhpcyBpcyBjb25mdXNpbmc6CisJCSAqYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0ZGluIGlzIG5vdCBhIHNvY2tldCIpOworCQkgKiBCZXR0ZXI6ICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJLyogSGVscCB0ZXh0IHNheXMgdGhhdCB0ZnRwZCBtdXN0IGJlIHVzZWQgYXMgaW5ldGQgc2VydmljZSwKKwkJICogd2hpY2ggaXMgYnkgZmFyIHRoZSBtb3N0IHVzdWFsIGNhdXNlIG9mIGdldF9zb2NrX2xzYQorCQkgKiBmYWlsdXJlICovCisJfQorCXBlZXJfbHNhID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBvdXJfbHNhLT5sZW4pOworCXBlZXJfbHNhLT5sZW4gPSBvdXJfbHNhLT5sZW47CisKKwkvKiBTaGlmdGluZyB0byBub3QgY29sbGlkZSB3aXRoIFRGVFBfT1BUcyAqLworCW9wdCA9IG9wdGlvbl9tYXNrMzIgPSBURlRQRF9PUFQgfCAoZ2V0b3B0MzIoYXJndiwgInJjdTpsIiwgJnVzZXJfb3B0KSA8PCA4KTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgVEZUUERfT1BUX2wpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisJaWYgKGFyZ3ZbMF0pCisJCXhjaGRpcihhcmd2WzBdKTsKKworCXJlc3VsdCA9IHJlY3ZfZnJvbV90byhTVERJTl9GSUxFTk8sIGJsb2NrX2J1Ziwgc2l6ZW9mKGJsb2NrX2J1ZiksCisJCQkwIC8qIGZsYWdzICovLAorCQkJJnBlZXJfbHNhLT51LnNhLCAmb3VyX2xzYS0+dS5zYSwgb3VyX2xzYS0+bGVuKTsKKworCWVycm9yX21zZyA9ICJtYWxmb3JtZWQgcGFja2V0IjsKKwlvcGNvZGUgPSBudG9ocygqKHVpbnQxNl90KilibG9ja19idWYpOworCWlmIChyZXN1bHQgPCA0IHx8IHJlc3VsdCA+PSBzaXplb2YoYmxvY2tfYnVmKQorCSB8fCBibG9ja19idWZbcmVzdWx0LTFdICE9ICdcMCcKKwkgfHwgKElGX0ZFQVRVUkVfVEZUUF9QVVQob3Bjb2RlICE9IFRGVFBfUlJRKSAvKiBub3QgZG93bmxvYWQgKi8KKwkgICAgIElGX0dFVFBVVCgmJikKKwkgICAgIElGX0ZFQVRVUkVfVEZUUF9HRVQob3Bjb2RlICE9IFRGVFBfV1JRKSAvKiBub3QgdXBsb2FkICovCisJICAgICkKKwkpIHsKKwkJZ290byBlcnI7CisJfQorCWxvY2FsX2ZpbGUgPSBibG9ja19idWYgKyAyOworCWlmIChsb2NhbF9maWxlWzBdID09ICcuJyB8fCBzdHJzdHIobG9jYWxfZmlsZSwgIi8uIikpIHsKKwkJZXJyb3JfbXNnID0gImRvdCBpbiBmaWxlIG5hbWUiOworCQlnb3RvIGVycjsKKwl9CisJbW9kZSA9IGxvY2FsX2ZpbGUgKyBzdHJsZW4obG9jYWxfZmlsZSkgKyAxOworCS8qIFJGQyAxMzUwIHNheXMgbW9kZSBzdHJpbmcgaXMgY2FzZSBpbmRlcGVuZGVudCAqLworCWlmIChtb2RlID49IGJsb2NrX2J1ZiArIHJlc3VsdCB8fCBzdHJjYXNlY21wKG1vZGUsICJvY3RldCIpICE9IDApIHsKKwkJZ290byBlcnI7CisJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCXsKKwkJY2hhciAqcmVzOworCQljaGFyICpvcHRfc3RyID0gbW9kZSArIHNpemVvZigib2N0ZXQiKTsKKwkJaW50IG9wdF9sZW4gPSBibG9ja19idWYgKyByZXN1bHQgLSBvcHRfc3RyOworCQlpZiAob3B0X2xlbiA+IDApIHsKKwkJCXJlcyA9IHRmdHBfZ2V0X29wdGlvbigiYmxrc2l6ZSIsIG9wdF9zdHIsIG9wdF9sZW4pOworCQkJaWYgKHJlcykgeworCQkJCWJsa3NpemUgPSB0ZnRwX2Jsa3NpemVfY2hlY2socmVzLCA2NTU2NCk7CisJCQkJaWYgKGJsa3NpemUgPCAwKSB7CisJCQkJCWVycm9yX3BrdF9yZWFzb24gPSBFUlJfQkFEX09QVDsKKwkJCQkJLyogd2lsbCBqdXN0IHNlbmQgZXJyb3IgcGt0ICovCisJCQkJCWdvdG8gZG9fcHJvdG87CisJCQkJfQorCQkJfQorCQkJaWYgKG9wY29kZSAhPSBURlRQX1dSUSAvKiBkb3dubG9hZD8gKi8KKwkJCS8qIGRpZCBjbGllbnQgYXNrIHVzIGFib3V0IGZpbGUgc2l6ZT8gKi8KKwkJCSAmJiB0ZnRwX2dldF9vcHRpb24oInRzaXplIiwgb3B0X3N0ciwgb3B0X2xlbikKKwkJCSkgeworCQkJCXdhbnRfdHJhbnNmZXJfc2l6ZSA9IDE7CisJCQl9CisJCX0KKwl9CisjIGVuZGlmCisKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX1RGVFBfUFVUIHx8IG9wY29kZSA9PSBURlRQX1dSUSkgeworCQlpZiAob3B0ICYgVEZUUERfT1BUX3IpIHsKKwkJCS8qIFRoaXMgd291bGQgbWVhbiAiZGlzayBmdWxsIiAtIG5vdCB0cnVlICovCisJCQkvKmVycm9yX3BrdF9yZWFzb24gPSBFUlJfV1JJVEU7Ki8KKwkJCWVycm9yX21zZyA9IGJiX21zZ193cml0ZV9lcnJvcjsKKwkJCWdvdG8gZXJyOworCQl9CisJCUlGX0dFVFBVVChvcHRpb25fbWFzazMyIHw9IFRGVFBfT1BUX0dFVDspIC8qIHdpbGwgcmVjZWl2ZSBmaWxlJ3MgZGF0YSAqLworCX0gZWxzZSB7CisJCUlGX0dFVFBVVChvcHRpb25fbWFzazMyIHw9IFRGVFBfT1BUX1BVVDspIC8qIHdpbGwgc2VuZCBmaWxlJ3MgZGF0YSAqLworCX0KKworCS8qIE5COiBpZiBlcnJvcl9wa3Rfc3RyIG9yIGVycm9yX3BrdF9yZWFzb24gaXMgc2V0IHVwLAorCSAqIHRmdHBfcHJvdG9jb2woKSBqdXN0IHNlbmRzIG9uZSBlcnJvciBwa3QgYW5kIHJldHVybnMgKi8KKworIGRvX3Byb3RvOgorCWNsb3NlKFNURElOX0ZJTEVOTyk7IC8qIGNsb3NlIG9sZCwgcG9zc2libHkgd2lsZGNhcmQgc29ja2V0ICovCisJLyogdGZ0cF9wcm90b2NvbCgpIHdpbGwgY3JlYXRlIG5ldyBvbmUsIGJvdW5kIHRvIHBhcnRpY3VsYXIgbG9jYWwgSVAgKi8KKwlyZXN1bHQgPSB0ZnRwX3Byb3RvY29sKAorCQlvdXJfbHNhLCBwZWVyX2xzYSwKKwkJbG9jYWxfZmlsZSBJRl9URlRQKCwgTlVMTCAvKnJlbW90ZV9maWxlKi8pCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCB3YW50X3RyYW5zZmVyX3NpemUpCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCBibGtzaXplKQorCSk7CisKKwlyZXR1cm4gcmVzdWx0OworIGVycjoKKwlzdHJjcHkoKGNoYXIqKWVycm9yX3BrdF9zdHIsIGVycm9yX21zZyk7CisJZ290byBkb19wcm90bzsKK30KKworI2VuZGlmIC8qIEVOQUJMRV9URlRQRCAqLworCisjZW5kaWYgLyogRU5BQkxFX0ZFQVRVUkVfVEZUUF9HRVQgfHwgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQgKi8KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdHJhY2Vyb3V0ZS5jIGIvbmV0d29ya2luZy90cmFjZXJvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyMTAzNQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdHJhY2Vyb3V0ZS5jCkBAIC0wLDAgKzEsMTI2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkxLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwCisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJ1c3lib3ggcG9ydCBieSBWbGFkaW1pciBPbGV5bmlrIChDKSAyMDA1IDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qCisgKgl0cmFjZXJvdXRlNgorICoKKyAqICAgICAgTW9kaWZpZWQgZm9yIE5STCA0LjRCU0QgSVB2NiByZWxlYXNlLgorICogICAgICAwNy8zMS85NiBiZ3AKKyAqCisgKglNb2RpZmllZCBmb3IgTGludXggSVB2NiBieSBQZWRybyBSb3F1ZSA8cm9xdWVAZGkuZmMudWwucHQ+CisgKgkzMS8wNy8xOTk2CisgKgorICoJQXMgSUNNUCBlcnJvciBtZXNzYWdlcyBmb3IgSVB2NiBub3cgaW5jbHVkZSBtb3JlIHRoYW4gOCBieXRlcworICoJVURQIGRhdGFncmFtcyBhcmUgbm93IHNlbnQgdmlhIGFuIFVEUCBzb2NrZXQgaW5zdGVhZCBvZiBtYWdpYworICoJUkFXIHNvY2tldCB0cmlja3MuCisgKgorICoJQ29udmVydGVkIHRvIGJ1c3lib3ggYXBwbGV0IGJ5IExlb25pZCBMaXNvdnNraXkgPGxseUBzZi5uZXQ+CisgKgkyMDA5LTExLTE2CisgKi8KKworLyoKKyAqIHRyYWNlcm91dGUgaG9zdCAgLSB0cmFjZSB0aGUgcm91dGUgaXAgcGFja2V0cyBmb2xsb3cgZ29pbmcgdG8gImhvc3QiLgorICoKKyAqIEF0dGVtcHQgdG8gdHJhY2UgdGhlIHJvdXRlIGFuIGlwIHBhY2tldCB3b3VsZCBmb2xsb3cgdG8gc29tZQorICogaW50ZXJuZXQgaG9zdC4gIFdlIGZpbmQgb3V0IGludGVybWVkaWF0ZSBob3BzIGJ5IGxhdW5jaGluZyBwcm9iZQorICogcGFja2V0cyB3aXRoIGEgc21hbGwgdHRsICh0aW1lIHRvIGxpdmUpIHRoZW4gbGlzdGVuaW5nIGZvciBhbgorICogaWNtcCAidGltZSBleGNlZWRlZCIgcmVwbHkgZnJvbSBhIGdhdGV3YXkuICBXZSBzdGFydCBvdXIgcHJvYmVzCisgKiB3aXRoIGEgdHRsIG9mIG9uZSBhbmQgaW5jcmVhc2UgYnkgb25lIHVudGlsIHdlIGdldCBhbiBpY21wICJwb3J0CisgKiB1bnJlYWNoYWJsZSIgKHdoaWNoIG1lYW5zIHdlIGdvdCB0byAiaG9zdCIpIG9yIGhpdCBhIG1heCAod2hpY2gKKyAqIGRlZmF1bHRzIHRvIDMwIGhvcHMgJiBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSAtbSBmbGFnKS4gIFRocmVlCisgKiBwcm9iZXMgKGNoYW5nZSB3aXRoIC1xIGZsYWcpIGFyZSBzZW50IGF0IGVhY2ggdHRsIHNldHRpbmcgYW5kIGEKKyAqIGxpbmUgaXMgcHJpbnRlZCBzaG93aW5nIHRoZSB0dGwsIGFkZHJlc3Mgb2YgdGhlIGdhdGV3YXkgYW5kCisgKiByb3VuZCB0cmlwIHRpbWUgb2YgZWFjaCBwcm9iZS4gIElmIHRoZSBwcm9iZSBhbnN3ZXJzIGNvbWUgZnJvbQorICogZGlmZmVyZW50IGdhdGV3YXlzLCB0aGUgYWRkcmVzcyBvZiBlYWNoIHJlc3BvbmRpbmcgc3lzdGVtIHdpbGwKKyAqIGJlIHByaW50ZWQuICBJZiB0aGVyZSBpcyBubyByZXNwb25zZSB3aXRoaW4gYSA1IHNlYy4gdGltZW91dAorICogaW50ZXJ2YWwgKGNoYW5nZWQgd2l0aCB0aGUgLXcgZmxhZyksIGEgIioiIGlzIHByaW50ZWQgZm9yIHRoYXQKKyAqIHByb2JlLgorICoKKyAqIFByb2JlIHBhY2tldHMgYXJlIFVEUCBmb3JtYXQuICBXZSBkb24ndCB3YW50IHRoZSBkZXN0aW5hdGlvbgorICogaG9zdCB0byBwcm9jZXNzIHRoZW0gc28gdGhlIGRlc3RpbmF0aW9uIHBvcnQgaXMgc2V0IHRvIGFuCisgKiB1bmxpa2VseSB2YWx1ZSAoaWYgc29tZSBjbG9kIG9uIHRoZSBkZXN0aW5hdGlvbiBpcyB1c2luZyB0aGF0CisgKiB2YWx1ZSwgaXQgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgLXAgZmxhZykuCisgKgorICogQSBzYW1wbGUgdXNlIG1pZ2h0IGJlOgorICoKKyAqICAgICBbeWFrIDcxXSUgdHJhY2Vyb3V0ZSBuaXMubnNmLm5ldC4KKyAqICAgICB0cmFjZXJvdXRlIHRvIG5pcy5uc2YubmV0ICgzNS4xLjEuNDgpLCAzMCBob3BzIG1heCwgNTYgYnl0ZSBwYWNrZXQKKyAqICAgICAgMSAgaGVsaW9zLmVlLmxibC5nb3YgKDEyOC4zLjExMi4xKSAgMTkgbXMgIDE5IG1zICAwIG1zCisgKiAgICAgIDIgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDM5IG1zICAzOSBtcyAgMTkgbXMKKyAqICAgICAgMyAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMzkgbXMgIDM5IG1zICAxOSBtcworICogICAgICA0ICBjY25ndy1uZXItY2MuQmVya2VsZXkuRURVICgxMjguMzIuMTM2LjIzKSAgMzkgbXMgIDQwIG1zICAzOSBtcworICogICAgICA1ICBjY24tbmVyaWYyMi5CZXJrZWxleS5FRFUgKDEyOC4zMi4xNjguMjIpICAzOSBtcyAgMzkgbXMgIDM5IG1zCisgKiAgICAgIDYgIDEyOC4zMi4xOTcuNCAoMTI4LjMyLjE5Ny40KSAgNDAgbXMgIDU5IG1zICA1OSBtcworICogICAgICA3ICAxMzEuMTE5LjIuNSAoMTMxLjExOS4yLjUpICA1OSBtcyAgNTkgbXMgIDU5IG1zCisgKiAgICAgIDggIDEyOS4xNDAuNzAuMTMgKDEyOS4xNDAuNzAuMTMpICA5OSBtcyAgOTkgbXMgIDgwIG1zCisgKiAgICAgIDkgIDEyOS4xNDAuNzEuNiAoMTI5LjE0MC43MS42KSAgMTM5IG1zICAyMzkgbXMgIDMxOSBtcworICogICAgIDEwICAxMjkuMTQwLjgxLjcgKDEyOS4xNDAuODEuNykgIDIyMCBtcyAgMTk5IG1zICAxOTkgbXMKKyAqICAgICAxMSAgbmljLm1lcml0LmVkdSAoMzUuMS4xLjQ4KSAgMjM5IG1zICAyMzkgbXMgIDIzOSBtcworICoKKyAqIE5vdGUgdGhhdCBsaW5lcyAyICYgMyBhcmUgdGhlIHNhbWUuICBUaGlzIGlzIGR1ZSB0byBhIGJ1Z2d5CisgKiBrZXJuZWwgb24gdGhlIDJuZCBob3Agc3lzdGVtIC0tIGxibC1jc2FtLmFycGEgLS0gdGhhdCBmb3J3YXJkcworICogcGFja2V0cyB3aXRoIGEgemVybyB0dGwuCisgKgorICogQSBtb3JlIGludGVyZXN0aW5nIGV4YW1wbGUgaXM6CisgKgorICogICAgIFt5YWsgNzJdJSB0cmFjZXJvdXRlIGFsbHNwaWNlLmxjcy5taXQuZWR1LgorICogICAgIHRyYWNlcm91dGUgdG8gYWxsc3BpY2UubGNzLm1pdC5lZHUgKDE4LjI2LjAuMTE1KSwgMzAgaG9wcyBtYXgKKyAqICAgICAgMSAgaGVsaW9zLmVlLmxibC5nb3YgKDEyOC4zLjExMi4xKSAgMCBtcyAgMCBtcyAgMCBtcworICogICAgICAyICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAxOSBtcyAgMTkgbXMgIDE5IG1zCisgKiAgICAgIDMgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDM5IG1zICAxOSBtcyAgMTkgbXMKKyAqICAgICAgNCAgY2NuZ3ctbmVyLWNjLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzNi4yMykgIDE5IG1zICAzOSBtcyAgMzkgbXMKKyAqICAgICAgNSAgY2NuLW5lcmlmMjIuQmVya2VsZXkuRURVICgxMjguMzIuMTY4LjIyKSAgMjAgbXMgIDM5IG1zICAzOSBtcworICogICAgICA2ICAxMjguMzIuMTk3LjQgKDEyOC4zMi4xOTcuNCkgIDU5IG1zICAxMTkgbXMgIDM5IG1zCisgKiAgICAgIDcgIDEzMS4xMTkuMi41ICgxMzEuMTE5LjIuNSkgIDU5IG1zICA1OSBtcyAgMzkgbXMKKyAqICAgICAgOCAgMTI5LjE0MC43MC4xMyAoMTI5LjE0MC43MC4xMykgIDgwIG1zICA3OSBtcyAgOTkgbXMKKyAqICAgICAgOSAgMTI5LjE0MC43MS42ICgxMjkuMTQwLjcxLjYpICAxMzkgbXMgIDEzOSBtcyAgMTU5IG1zCisgKiAgICAgMTAgIDEyOS4xNDAuODEuNyAoMTI5LjE0MC44MS43KSAgMTk5IG1zICAxODAgbXMgIDMwMCBtcworICogICAgIDExICAxMjkuMTQwLjcyLjE3ICgxMjkuMTQwLjcyLjE3KSAgMzAwIG1zICAyMzkgbXMgIDIzOSBtcworICogICAgIDEyICAqICogKgorICogICAgIDEzICAxMjguMTIxLjU0LjcyICgxMjguMTIxLjU0LjcyKSAgMjU5IG1zICA0OTkgbXMgIDI3OSBtcworICogICAgIDE0ICAqICogKgorICogICAgIDE1ICAqICogKgorICogICAgIDE2ICAqICogKgorICogICAgIDE3ICAqICogKgorICogICAgIDE4ICBBTExTUElDRS5MQ1MuTUlULkVEVSAoMTguMjYuMC4xMTUpICAzMzkgbXMgIDI3OSBtcyAgMjc5IG1zCisgKgorICogKEkgc3RhcnQgdG8gc2VlIHdoeSBJJ20gaGF2aW5nIHNvIG11Y2ggdHJvdWJsZSB3aXRoIG1haWwgdG8KKyAqIE1JVC4pICBOb3RlIHRoYXQgdGhlIGdhdGV3YXlzIDEyLCAxNCwgMTUsIDE2ICYgMTcgaG9wcyBhd2F5CisgKiBlaXRoZXIgZG9uJ3Qgc2VuZCBJQ01QICJ0aW1lIGV4Y2VlZGVkIiBtZXNzYWdlcyBvciBzZW5kIHRoZW0KKyAqIHdpdGggYSB0dGwgdG9vIHNtYWxsIHRvIHJlYWNoIHVzLiAgMTQgLSAxNyBhcmUgcnVubmluZyB0aGUKKyAqIE1JVCBDIEdhdGV3YXkgY29kZSB0aGF0IGRvZXNuJ3Qgc2VuZCAidGltZSBleGNlZWRlZCJzLiAgR29kCisgKiBvbmx5IGtub3dzIHdoYXQncyBnb2luZyBvbiB3aXRoIDEyLgorICoKKyAqIFRoZSBzaWxlbnQgZ2F0ZXdheSAxMiBpbiB0aGUgYWJvdmUgbWF5IGJlIHRoZSByZXN1bHQgb2YgYSBidWcgaW4KKyAqIHRoZSA0LlsyM11CU0QgbmV0d29yayBjb2RlIChhbmQgaXRzIGRlcml2YXRpdmVzKTogIDQueCAoeCA8PSAzKQorICogc2VuZHMgYW4gdW5yZWFjaGFibGUgbWVzc2FnZSB1c2luZyB3aGF0ZXZlciB0dGwgcmVtYWlucyBpbiB0aGUKKyAqIG9yaWdpbmFsIGRhdGFncmFtLiAgU2luY2UsIGZvciBnYXRld2F5cywgdGhlIHJlbWFpbmluZyB0dGwgaXMKKyAqIHplcm8sIHRoZSBpY21wICJ0aW1lIGV4Y2VlZGVkIiBpcyBndWFyYW50ZWVkIHRvIG5vdCBtYWtlIGl0IGJhY2sKKyAqIHRvIHVzLiAgVGhlIGJlaGF2aW9yIG9mIHRoaXMgYnVnIGlzIHNsaWdodGx5IG1vcmUgaW50ZXJlc3RpbmcKKyAqIHdoZW4gaXQgYXBwZWFycyBvbiB0aGUgZGVzdGluYXRpb24gc3lzdGVtOgorICoKKyAqICAgICAgMSAgaGVsaW9zLmVlLmxibC5nb3YgKDEyOC4zLjExMi4xKSAgMCBtcyAgMCBtcyAgMCBtcworICogICAgICAyICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAzOSBtcyAgMTkgbXMgIDM5IG1zCisgKiAgICAgIDMgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDE5IG1zICAzOSBtcyAgMTkgbXMKKyAqICAgICAgNCAgY2NuZ3ctbmVyLWNjLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzNi4yMykgIDM5IG1zICA0MCBtcyAgMTkgbXMKKyAqICAgICAgNSAgY2NuLW5lcmlmMzUuQmVya2VsZXkuRURVICgxMjguMzIuMTY4LjM1KSAgMzkgbXMgIDM5IG1zICAzOSBtcworICogICAgICA2ICBjc2d3LkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzMy4yNTQpICAzOSBtcyAgNTkgbXMgIDM5IG1zCisgKiAgICAgIDcgICogKiAqCisgKiAgICAgIDggICogKiAqCisgKiAgICAgIDkgICogKiAqCisgKiAgICAgMTAgICogKiAqCisgKiAgICAgMTEgICogKiAqCisgKiAgICAgMTIgICogKiAqCisgKiAgICAgMTMgIHJpcC5CZXJrZWxleS5FRFUgKDEyOC4zMi4xMzEuMjIpICA1OSBtcyAhICAzOSBtcyAhICAzOSBtcyAhCisgKgorICogTm90aWNlIHRoYXQgdGhlcmUgYXJlIDEyICJnYXRld2F5cyIgKDEzIGlzIHRoZSBmaW5hbAorICogZGVzdGluYXRpb24pIGFuZCBleGFjdGx5IHRoZSBsYXN0IGhhbGYgb2YgdGhlbSBhcmUgIm1pc3NpbmciLgorICogV2hhdCdzIHJlYWxseSBoYXBwZW5pbmcgaXMgdGhhdCByaXAgKGEgU3VuLTMgcnVubmluZyBTdW4gT1MzLjUpCisgKiBpcyB1c2luZyB0aGUgdHRsIGZyb20gb3VyIGFycml2aW5nIGRhdGFncmFtIGFzIHRoZSB0dGwgaW4gaXRzCisgKiBpY21wIHJlcGx5LiAgU28sIHRoZSByZXBseSB3aWxsIHRpbWUgb3V0IG9uIHRoZSByZXR1cm4gcGF0aAorICogKHdpdGggbm8gbm90aWNlIHNlbnQgdG8gYW55b25lIHNpbmNlIGljbXAncyBhcmVuJ3Qgc2VudCBmb3IKKyAqIGljbXAncykgdW50aWwgd2UgcHJvYmUgd2l0aCBhIHR0bCB0aGF0J3MgYXQgbGVhc3QgdHdpY2UgdGhlIHBhdGgKKyAqIGxlbmd0aC4gIEkuZS4sIHJpcCBpcyByZWFsbHkgb25seSA3IGhvcHMgYXdheS4gIEEgcmVwbHkgdGhhdAorICogcmV0dXJucyB3aXRoIGEgdHRsIG9mIDEgaXMgYSBjbHVlIHRoaXMgcHJvYmxlbSBleGlzdHMuCisgKiBUcmFjZXJvdXRlIHByaW50cyBhICIhIiBhZnRlciB0aGUgdGltZSBpZiB0aGUgdHRsIGlzIDw9IDEuCisgKiBTaW5jZSB2ZW5kb3JzIHNoaXAgYSBsb3Qgb2Ygb2Jzb2xldGUgKERFQydzIFVsdHJpeCwgU3VuIDMueCkgb3IKKyAqIG5vbi1zdGFuZGFyZCAoSFBVWCkgc29mdHdhcmUsIGV4cGVjdCB0byBzZWUgdGhpcyBwcm9ibGVtCisgKiBmcmVxdWVudGx5IGFuZC9vciB0YWtlIGNhcmUgcGlja2luZyB0aGUgdGFyZ2V0IGhvc3Qgb2YgeW91cgorICogcHJvYmVzLgorICoKKyAqIE90aGVyIHBvc3NpYmxlIGFubm90YXRpb25zIGFmdGVyIHRoZSB0aW1lIGFyZSAhSCwgIU4sICFQIChnb3QgYSBob3N0LAorICogbmV0d29yayBvciBwcm90b2NvbCB1bnJlYWNoYWJsZSwgcmVzcGVjdGl2ZWx5KSwgIVMgb3IgIUYgKHNvdXJjZQorICogcm91dGUgZmFpbGVkIG9yIGZyYWdtZW50YXRpb24gbmVlZGVkIC0tIG5laXRoZXIgb2YgdGhlc2Ugc2hvdWxkCisgKiBldmVyIG9jY3VyIGFuZCB0aGUgYXNzb2NpYXRlZCBnYXRld2F5IGlzIGJ1c3RlZCBpZiB5b3Ugc2VlIG9uZSkuICBJZgorICogYWxtb3N0IGFsbCB0aGUgcHJvYmVzIHJlc3VsdCBpbiBzb21lIGtpbmQgb2YgdW5yZWFjaGFibGUsIHRyYWNlcm91dGUKKyAqIHdpbGwgZ2l2ZSB1cCBhbmQgZXhpdC4KKyAqCisgKiBOb3RlcworICogLS0tLS0KKyAqIFRoaXMgcHJvZ3JhbSBtdXN0IGJlIHJ1biBieSByb290IG9yIGJlIHNldHVpZC4gIChJIHN1Z2dlc3QgdGhhdAorICogeW91ICpkb24ndCogbWFrZSBpdCBzZXR1aWQgLS0gY2FzdWFsIHVzZSBjb3VsZCByZXN1bHQgaW4gYSBsb3QKKyAqIG9mIHVubmVjZXNzYXJ5IHRyYWZmaWMgb24gb3VyIHBvb3IsIGNvbmdlc3RlZCBuZXRzLikKKyAqCisgKiBUaGlzIHByb2dyYW0gcmVxdWlyZXMgYSBrZXJuZWwgbW9kIHRoYXQgZG9lcyBub3QgYXBwZWFyIGluIGFueQorICogc3lzdGVtIGF2YWlsYWJsZSBmcm9tIEJlcmtlbGV5OiAgQSByYXcgaXAgc29ja2V0IHVzaW5nIHByb3RvCisgKiBJUFBST1RPX1JBVyBtdXN0IGludGVycHJldCB0aGUgZGF0YSBzZW50IGFzIGFuIGlwIGRhdGFncmFtIChhcworICogb3Bwb3NlZCB0byBkYXRhIHRvIGJlIHdyYXBwZWQgaW4gYSBpcCBkYXRhZ3JhbSkuICBTZWUgdGhlIFJFQURNRQorICogZmlsZSB0aGF0IGNhbWUgd2l0aCB0aGUgc291cmNlIHRvIHRoaXMgcHJvZ3JhbSBmb3IgYSBkZXNjcmlwdGlvbgorICogb2YgdGhlIG1vZHMgSSBtYWRlIHRvIC9zeXMvbmV0aW5ldC9yYXdfaXAuYy4gIFlvdXIgbWlsZWFnZSBtYXkKKyAqIHZhcnkuICBCdXQsIGFnYWluLCBBTlkgNC54ICh4IDwgNCkgQlNEIEtFUk5FTCBXSUxMIEhBVkUgVE8gQkUKKyAqIE1PRElGSUVEIFRPIFJVTiBUSElTIFBST0dSQU0uCisgKgorICogVGhlIHVkcCBwb3J0IHVzYWdlIG1heSBhcHBlYXIgYml6YXJyZSAod2VsbCwgb2ssIGl0IGlzIGJpemFycmUpLgorICogVGhlIHByb2JsZW0gaXMgdGhhdCBhbiBpY21wIG1lc3NhZ2Ugb25seSBjb250YWlucyA4IGJ5dGVzIG9mCisgKiBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFncmFtLiAgOCBieXRlcyBpcyB0aGUgc2l6ZSBvZiBhIHVkcAorICogaGVhZGVyIHNvLCBpZiB3ZSB3YW50IHRvIGFzc29jaWF0ZSByZXBsaWVzIHdpdGggdGhlIG9yaWdpbmFsCisgKiBkYXRhZ3JhbSwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBtdXN0IGJlIGVuY29kZWQgaW50byB0aGUKKyAqIHVkcCBoZWFkZXIgKHRoZSBpcCBpZCBjb3VsZCBiZSB1c2VkIGJ1dCB0aGVyZSdzIG5vIHdheSB0bworICogaW50ZXJsb2NrIHdpdGggdGhlIGtlcm5lbCdzIGFzc2lnbm1lbnQgb2YgaXAgaWQncyBhbmQsIGFueXdheSwKKyAqIGl0IHdvdWxkIGhhdmUgdGFrZW4gYSBsb3QgbW9yZSBrZXJuZWwgaGFja2luZyB0byBhbGxvdyB0aGlzCisgKiBjb2RlIHRvIHNldCB0aGUgaXAgaWQpLiAgU28sIHRvIGFsbG93IHR3byBvciBtb3JlIHVzZXJzIHRvCisgKiB1c2UgdHJhY2Vyb3V0ZSBzaW11bHRhbmVvdXNseSwgd2UgdXNlIHRoaXMgdGFzaydzIHBpZCBhcyB0aGUKKyAqIHNvdXJjZSBwb3J0ICh0aGUgaGlnaCBiaXQgaXMgc2V0IHRvIG1vdmUgdGhlIHBvcnQgbnVtYmVyIG91dAorICogb2YgdGhlICJsaWtlbHkiIHJhbmdlKS4gIFRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcHJvYmUgaXMgYmVpbmcKKyAqIHJlcGxpZWQgdG8gKHNvIHRpbWVzIGFuZC9vciBob3AgY291bnRzIGRvbid0IGdldCBjb25mdXNlZCBieSBhCisgKiByZXBseSB0aGF0IHdhcyBkZWxheWVkIGluIHRyYW5zaXQpLCB3ZSBpbmNyZW1lbnQgdGhlIGRlc3RpbmF0aW9uCisgKiBwb3J0IG51bWJlciBiZWZvcmUgZWFjaCBwcm9iZS4KKyAqCisgKiBEb24ndCB1c2UgdGhpcyBhcyBhIGNvZGluZyBleGFtcGxlLiAgSSB3YXMgdHJ5aW5nIHRvIGZpbmQgYQorICogcm91dGluZyBwcm9ibGVtIGFuZCB0aGlzIGNvZGUgc29ydC1vZiBwb3BwZWQgb3V0IGFmdGVyIDQ4IGhvdXJzCisgKiB3aXRob3V0IHNsZWVwLiAgSSB3YXMgYW1hemVkIGl0IGV2ZXIgY29tcGlsZWQsIG11Y2ggbGVzcyByYW4uCisgKgorICogSSBzdG9sZSB0aGUgaWRlYSBmb3IgdGhpcyBwcm9ncmFtIGZyb20gU3RldmUgRGVlcmluZy4gIFNpbmNlCisgKiB0aGUgZmlyc3QgcmVsZWFzZSwgSSd2ZSBsZWFybmVkIHRoYXQgaGFkIEkgYXR0ZW5kZWQgdGhlIHJpZ2h0CisgKiBJRVRGIHdvcmtpbmcgZ3JvdXAgbWVldGluZ3MsIEkgYWxzbyBjb3VsZCBoYXZlIHN0b2xlbiBpdCBmcm9tIEd1eQorICogQWxtZXMgb3IgTWF0dCBNYXRoaXMuICBJIGRvbid0IGtub3cgKG9yIGNhcmUpIHdobyBjYW1lIHVwIHdpdGgKKyAqIHRoZSBpZGVhIGZpcnN0LiAgSSBlbnZ5IHRoZSBvcmlnaW5hdG9ycycgcGVyc3BpY2FjaXR5IGFuZCBJJ20KKyAqIGdsYWQgdGhleSBkaWRuJ3Qga2VlcCB0aGUgaWRlYSBhIHNlY3JldC4KKyAqCisgKiBUaW0gU2VhdmVyLCBLZW4gQWRlbG1hbiBhbmQgQy4gUGhpbGlwIFdvb2QgcHJvdmlkZWQgYnVnIGZpeGVzIGFuZC9vcgorICogZW5oYW5jZW1lbnRzIHRvIHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24uCisgKgorICogSSd2ZSBoYWNrZWQgdXAgYSByb3VuZC10cmlwLXJvdXRlIHZlcnNpb24gb2YgdGhpcyB0aGF0IHdvcmtzIGJ5CisgKiBzZW5kaW5nIGEgbG9vc2Utc291cmNlLXJvdXRlZCB1ZHAgZGF0YWdyYW0gdGhyb3VnaCB0aGUgZGVzdGluYXRpb24KKyAqIGJhY2sgdG8geW91cnNlbGYuICBVbmZvcnR1bmF0ZWx5LCBTTyBtYW55IGdhdGV3YXlzIGJvdGNoIHNvdXJjZQorICogcm91dGluZywgdGhlIHRoaW5nIGlzIGFsbW9zdCB3b3J0aGxlc3MuICBNYXliZSBvbmUgZGF5Li4uCisgKgorICogIC0tIFZhbiBKYWNvYnNvbiAodmFuQGVlLmxibC5nb3YpCisgKiAgICAgVHVlIERlYyAyMCAwMzo1MDoxMyBQU1QgMTk4OAorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0cmFjZXJvdXRlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLSJJRl9UUkFDRVJPVVRFNigiNDYiKSJGSWxkbnJ2XSBbLWYgMVNUX1RUTF0gWy1tIE1BWFRUTF0gWy1wIFBPUlRdIFstcSBQUk9CRVNdXG4iCisvL3VzYWdlOiAgICAgICAiCVstcyBTUkNfSVBdIFstdCBUT1NdIFstdyBXQUlUX1NFQ10gWy1nIEdBVEVXQVldIFstaSBJRkFDRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy16IFBBVVNFX01TRUNdIEhPU1QgW0JZVEVTXSIKKy8vdXNhZ2U6I2RlZmluZSB0cmFjZXJvdXRlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhY2UgdGhlIHJvdXRlIHRvIEhPU1RcbiIKKy8vdXNhZ2U6CUlGX1RSQUNFUk9VVEU2KAorLy91c2FnZTogICAgICJcbgktNCwtNglGb3JjZSBJUCBvciBJUHY2IG5hbWUgcmVzb2x1dGlvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLUYJU2V0IHRoZSBkb24ndCBmcmFnbWVudCBiaXQiCisvL3VzYWdlOiAgICAgIlxuCS1JCVVzZSBJQ01QIEVDSE8gaW5zdGVhZCBvZiBVRFAgZGF0YWdyYW1zIgorLy91c2FnZTogICAgICJcbgktbAlEaXNwbGF5IHRoZSBUVEwgdmFsdWUgb2YgdGhlIHJldHVybmVkIHBhY2tldCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJU2V0IFNPX0RFQlVHIG9wdGlvbnMgdG8gc29ja2V0IgorLy91c2FnZTogICAgICJcbgktbglQcmludCBudW1lcmljIGFkZHJlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJQnlwYXNzIHJvdXRpbmcgdGFibGVzLCBzZW5kIGRpcmVjdGx5IHRvIEhPU1QiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1tCU1heCB0aW1lLXRvLWxpdmUgKG1heCBudW1iZXIgb2YgaG9wcykiCisvL3VzYWdlOiAgICAgIlxuCS1wCUJhc2UgVURQIHBvcnQgbnVtYmVyIHVzZWQgaW4gcHJvYmVzIgorLy91c2FnZTogICAgICJcbgkJKGRlZmF1bHQgMzM0MzQpIgorLy91c2FnZTogICAgICJcbgktcQlOdW1iZXIgb2YgcHJvYmVzIHBlciBUVEwgKGRlZmF1bHQgMykiCisvL3VzYWdlOiAgICAgIlxuCS1zCUlQIGFkZHJlc3MgdG8gdXNlIGFzIHRoZSBzb3VyY2UgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJVHlwZS1vZi1zZXJ2aWNlIGluIHByb2JlIHBhY2tldHMgKGRlZmF1bHQgMCkiCisvL3VzYWdlOiAgICAgIlxuCS13CVRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIHJlc3BvbnNlIChkZWZhdWx0IDMpIgorLy91c2FnZTogICAgICJcbgktZwlMb29zZSBzb3VyY2Ugcm91dGUgZ2F0ZXdheSAoOCBtYXgpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0cmFjZXJvdXRlNl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kbnJ2XSBbLW0gTUFYVFRMXSBbLXAgUE9SVF0gWy1xIFBST0JFU11cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy1zIFNSQ19JUF0gWy10IFRPU10gWy13IFdBSVRfU0VDXSBbLWkgSUZBQ0VdXG4iCisvL3VzYWdlOiAgICAgICAiCUhPU1QgW0JZVEVTXSIKKy8vdXNhZ2U6I2RlZmluZSB0cmFjZXJvdXRlNl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlRyYWNlIHRoZSByb3V0ZSB0byBIT1NUXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCVNldCBTT19ERUJVRyBvcHRpb25zIHRvIHNvY2tldCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgbnVtZXJpYyBhZGRyZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuCS1yCUJ5cGFzcyByb3V0aW5nIHRhYmxlcywgc2VuZCBkaXJlY3RseSB0byBIT1NUIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktbQlNYXggdGltZS10by1saXZlIChtYXggbnVtYmVyIG9mIGhvcHMpIgorLy91c2FnZTogICAgICJcbgktcAlCYXNlIFVEUCBwb3J0IG51bWJlciB1c2VkIGluIHByb2JlcyIKKy8vdXNhZ2U6ICAgICAiXG4JCShkZWZhdWx0IGlzIDMzNDM0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJTnVtYmVyIG9mIHByb2JlcyBwZXIgVFRMIChkZWZhdWx0IDMpIgorLy91c2FnZTogICAgICJcbgktcwlJUCBhZGRyZXNzIHRvIHVzZSBhcyB0aGUgc291cmNlIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS10CVR5cGUtb2Ytc2VydmljZSBpbiBwcm9iZSBwYWNrZXRzIChkZWZhdWx0IDApIgorLy91c2FnZTogICAgICJcbgktdwlUaW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgYSByZXNwb25zZSAoZGVmYXVsdCAzKSIKKworI2RlZmluZSBUUkFDRVJPVVRFX1NPX0RFQlVHIDAKKworLyogVE9ETzogdW5kZWZzIHdlcmUgdW5jb21tZW50ZWQgLSA/PyEgd2UgaGF2ZSBjb25maWcgc3lzdGVtIGZvciB0aGF0ISAqLworLyogcHJvYmFibHkgb2sgdG8gcmVtb3ZlIGFsdG9nZXRoZXIgKi8KKy8vI3VuZGVmIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRQorLy8jZGVmaW5lIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRQorLy8jdW5kZWYgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKy8vI2RlZmluZSBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorLy8jdW5kZWYgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUAorLy8jZGVmaW5lIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVVNFX0lDTVAKKworCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKyMgaW5jbHVkZSA8bmV0aW5ldC9pcDYuaD4KKyMgaW5jbHVkZSA8bmV0aW5ldC9pY21wNi5oPgorIyBpZm5kZWYgU09MX0lQVjYKKyMgIGRlZmluZSBTT0xfSVBWNiBJUFBST1RPX0lQVjYKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisjaWZuZGVmIElQUFJPVE9fSUNNUAorIyBkZWZpbmUgSVBQUk9UT19JQ01QIDEKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0lQCisjIGRlZmluZSBJUFBST1RPX0lQIDAKKyNlbmRpZgorCisKKyNkZWZpbmUgT1BUX1NUUklORyAiRklsbnJkdnh0Omk6bTpwOnE6czp3Ono6ZjoiIFwKKwkJICAgIElGX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUoImc6IikgXAorCQkgICAgIjQiIElGX1RSQUNFUk9VVEU2KCI2IikKK2VudW0geworCU9QVF9ET05UX0ZSQUdNTlQgPSAoMSA8PCAwKSwgICAgLyogRiAqLworCU9QVF9VU0VfSUNNUCAgICAgPSAoMSA8PCAxKSAqIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfVVNFX0lDTVAsIC8qIEkgKi8KKwlPUFRfVFRMX0ZMQUcgICAgID0gKDEgPDwgMiksICAgIC8qIGwgKi8KKwlPUFRfQUREUl9OVU0gICAgID0gKDEgPDwgMyksICAgIC8qIG4gKi8KKwlPUFRfQllQQVNTX1JPVVRFID0gKDEgPDwgNCksICAgIC8qIHIgKi8KKwlPUFRfREVCVUcgICAgICAgID0gKDEgPDwgNSksICAgIC8qIGQgKi8KKwlPUFRfVkVSQk9TRSAgICAgID0gKDEgPDwgNikgKiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UsIC8qIHYgKi8KKwlPUFRfSVBfQ0hLU1VNICAgID0gKDEgPDwgNyksICAgIC8qIHggKi8KKwlPUFRfVE9TICAgICAgICAgID0gKDEgPDwgOCksICAgIC8qIHQgKi8KKwlPUFRfREVWSUNFICAgICAgID0gKDEgPDwgOSksICAgIC8qIGkgKi8KKwlPUFRfTUFYX1RUTCAgICAgID0gKDEgPDwgMTApLCAgIC8qIG0gKi8KKwlPUFRfUE9SVCAgICAgICAgID0gKDEgPDwgMTEpLCAgIC8qIHAgKi8KKwlPUFRfTlBST0JFUyAgICAgID0gKDEgPDwgMTIpLCAgIC8qIHEgKi8KKwlPUFRfU09VUkNFICAgICAgID0gKDEgPDwgMTMpLCAgIC8qIHMgKi8KKwlPUFRfV0FJVFRJTUUgICAgID0gKDEgPDwgMTQpLCAgIC8qIHcgKi8KKwlPUFRfUEFVU0VfTVMgICAgID0gKDEgPDwgMTUpLCAgIC8qIHogKi8KKwlPUFRfRklSU1RfVFRMICAgID0gKDEgPDwgMTYpLCAgIC8qIGYgKi8KKwlPUFRfU09VUkNFX1JPVVRFID0gKDEgPDwgMTcpICogRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUsIC8qIGcgKi8KKwlPUFRfSVBWNCAgICAgICAgID0gKDEgPDwgKDE3K0VOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFKSksICAgLyogNCAqLworCU9QVF9JUFY2ICAgICAgICAgPSAoMSA8PCAoMTgrRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUpKSAqIEVOQUJMRV9UUkFDRVJPVVRFNiwgLyogNiAqLworfTsKKyNkZWZpbmUgdmVyYm9zZSAob3B0aW9uX21hc2szMiAmIE9QVF9WRVJCT1NFKQorCitlbnVtIHsKKwlTSVpFT0ZfSUNNUF9IRFIgPSA4LAorCXJjdnNvY2sgPSAzLCAvKiByZWNlaXZlIChpY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCisJc25kc29jayA9IDQsIC8qIHNlbmQgKHVkcC9pY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCit9OworCisvKiBEYXRhIHNlY3Rpb24gb2YgdGhlIHByb2JlIHBhY2tldCAqLworc3RydWN0IG91dGRhdGFfdCB7CisJdW5zaWduZWQgY2hhciBzZXE7ICAgICAgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgdHRsOyAgICAgICAgICAgICAvKiB0dGwgcGFja2V0IGxlZnQgd2l0aCAqLworLy8gVU5VU0VELiBSZXRhaW5pbmcgdG8gaGF2ZSB0aGUgc2FtZSBwYWNrZXQgc2l6ZS4KKwlzdHJ1Y3QgdGltZXZhbCB0dl9VTlVTRUQgUEFDS0VEOyAvKiB0aW1lIHBhY2tldCBsZWZ0ICovCit9OworCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CitzdHJ1Y3Qgb3V0ZGF0YTZfdCB7CisJdWludDMyX3QgaWRlbnQ2OworCXVpbnQzMl90IHNlcTY7CisJc3RydWN0IHRpbWV2YWwgdHZfVU5VU0VEIFBBQ0tFRDsgLyogdGltZSBwYWNrZXQgbGVmdCAqLworfTsKKyNlbmRpZgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IGlwICpvdXRpcDsKKwlzdHJ1Y3Qgb3V0ZGF0YV90ICpvdXRkYXRhOworCWxlbl9hbmRfc29ja2FkZHIgKmRlc3RfbHNhOworCWludCBwYWNrbGVuOyAgICAgICAgICAgICAgICAgICAgLyogdG90YWwgbGVuZ3RoIG9mIHBhY2tldCAqLworCWludCBwbXR1OyAgICAgICAgICAgICAgICAgICAgICAgLyogUGF0aCBNVFUgRGlzY292ZXJ5IChSRkMxMTkxKSAqLworCXVpbnQzMl90IGlkZW50OworCXVpbnQxNl90IHBvcnQ7IC8vIDMyNzY4ICsgNjY2OyAgLyogc3RhcnQgdWRwIGRlc3QgcG9ydCAjIGZvciBwcm9iZSBwYWNrZXRzICovCisJaW50IHdhaXR0aW1lOyAvLyA1OyAgICAgICAgICAgICAvKiB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIChpbiBzZWNvbmRzKSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisJaW50IG9wdGxlbjsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgaXAgb3B0aW9ucyAqLworI2Vsc2UKKyNkZWZpbmUgb3B0bGVuIDAKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgcmVjdl9wa3RbNTEyXTsgICAgLyogbGFzdCBpbmJvdW5kIChpY21wKSBwYWNrZXQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorCS8qIE1heGltdW0gbnVtYmVyIG9mIGdhdGV3YXlzIChpbmNsdWRlIHJvb20gZm9yIG9uZSBub29wKSAqLworI2RlZmluZSBOR0FURVdBWVMgKChpbnQpKChNQVhfSVBPUFRMRU4gLSBJUE9QVF9NSU5PRkYgLSAxKSAvIHNpemVvZih1aW50MzJfdCkpKQorCS8qIGxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5IGxpc3QgKGluY2x1ZGluZyByb29tIGZvciBmaW5hbCBkZXN0aW5hdGlvbikgKi8KKwl1aW50MzJfdCBnd2xpc3RbTkdBVEVXQVlTICsgMV07CisjZW5kaWYKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBvdXRpcCAgICAgKEcub3V0aXAgICAgKQorI2RlZmluZSBvdXRkYXRhICAgKEcub3V0ZGF0YSAgKQorI2RlZmluZSBkZXN0X2xzYSAgKEcuZGVzdF9sc2EgKQorI2RlZmluZSBwYWNrbGVuICAgKEcucGFja2xlbiAgKQorI2RlZmluZSBwbXR1ICAgICAgKEcucG10dSAgICAgKQorI2RlZmluZSBpZGVudCAgICAgKEcuaWRlbnQgICAgKQorI2RlZmluZSBwb3J0ICAgICAgKEcucG9ydCAgICAgKQorI2RlZmluZSB3YWl0dGltZSAgKEcud2FpdHRpbWUgKQorI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisjIGRlZmluZSBvcHRsZW4gICAoRy5vcHRsZW4gICApCisjZW5kaWYKKyNkZWZpbmUgcmVjdl9wa3QgIChHLnJlY3ZfcGt0ICkKKyNkZWZpbmUgZ3dsaXN0ICAgIChHLmd3bGlzdCAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlwb3J0ID0gMzI3NjggKyA2NjY7IFwKKwl3YWl0dGltZSA9IDU7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgb3V0aWNtcCAoKHN0cnVjdCBpY21wICopKG91dGlwICsgMSkpCisjZGVmaW5lIG91dHVkcCAgKChzdHJ1Y3QgdWRwaGRyICopKG91dGlwICsgMSkpCisKKworLyogbGliYmIgY2FuZGlkYXRlPyB0ZnRwIHVzZXMgdGhpcyBpZGlvbSB0b28gKi8KK3N0YXRpYyBsZW5fYW5kX3NvY2thZGRyKiBkdXBfc29ja2FkZHIoY29uc3QgbGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCWxlbl9hbmRfc29ja2FkZHIgKm5ld19sc2EgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIGxzYS0+bGVuKTsKKwltZW1jcHkobmV3X2xzYSwgbHNhLCBMU0FfTEVOX1NJWkUgKyBsc2EtPmxlbik7CisJcmV0dXJuIG5ld19sc2E7Cit9CisKKworc3RhdGljIGludAord2FpdF9mb3JfcmVwbHkobGVuX2FuZF9zb2NrYWRkciAqZnJvbV9sc2EsIHN0cnVjdCBzb2NrYWRkciAqdG8sIHVuc2lnbmVkICp0aW1lc3RhbXBfdXMsIGludCAqbGVmdF9tcykKK3sKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKwlpbnQgcmVhZF9sZW4gPSAwOworCisJcGZkWzBdLmZkID0gcmN2c29jazsKKwlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCWlmICgqbGVmdF9tcyA+PSAwICYmIHNhZmVfcG9sbChwZmQsIDEsICpsZWZ0X21zKSA+IDApIHsKKwkJdW5zaWduZWQgdDsKKworCQlyZWFkX2xlbiA9IHJlY3ZfZnJvbV90byhyY3Zzb2NrLAorCQkJCXJlY3ZfcGt0LCBzaXplb2YocmVjdl9wa3QpLAorCQkJCS8qZmxhZ3M6Ki8gTVNHX0RPTlRXQUlULAorCQkJCSZmcm9tX2xzYS0+dS5zYSwgdG8sIGZyb21fbHNhLT5sZW4pOworCQl0ID0gbW9ub3RvbmljX3VzKCk7CisJCSpsZWZ0X21zIC09ICh0IC0gKnRpbWVzdGFtcF91cykgLyAxMDAwOworCQkqdGltZXN0YW1wX3VzID0gdDsKKwl9CisKKwlyZXR1cm4gcmVhZF9sZW47Cit9CisKKy8qCisgKiBDaGVja3N1bSByb3V0aW5lIGZvciBJbnRlcm5ldCBQcm90b2NvbCBmYW1pbHkgaGVhZGVycyAoQyBWZXJzaW9uKQorICovCitzdGF0aWMgdWludDE2X3QKK2luX2Nrc3VtKHVpbnQxNl90ICphZGRyLCBpbnQgbGVuKQoreworCWludCBubGVmdCA9IGxlbjsKKwl1aW50MTZfdCAqdyA9IGFkZHI7CisJdWludDE2X3QgYW5zd2VyOworCWludCBzdW0gPSAwOworCisJLyoKKwkgKiBPdXIgYWxnb3JpdGhtIGlzIHNpbXBsZSwgdXNpbmcgYSAzMiBiaXQgYWNjdW11bGF0b3IgKHN1bSksCisJICogd2UgYWRkIHNlcXVlbnRpYWwgMTYgYml0IHdvcmRzIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCwgZm9sZAorCSAqIGJhY2sgYWxsIHRoZSBjYXJyeSBiaXRzIGZyb20gdGhlIHRvcCAxNiBiaXRzIGludG8gdGhlIGxvd2VyCisJICogMTYgYml0cy4KKwkgKi8KKwl3aGlsZSAobmxlZnQgPiAxKSB7CisJCXN1bSArPSAqdysrOworCQlubGVmdCAtPSAyOworCX0KKworCS8qIG1vcCB1cCBhbiBvZGQgYnl0ZSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKG5sZWZ0ID09IDEpCisJCXN1bSArPSAqKHVuc2lnbmVkIGNoYXIgKil3OworCisJLyogYWRkIGJhY2sgY2Fycnkgb3V0cyBmcm9tIHRvcCAxNiBiaXRzIHRvIGxvdyAxNiBiaXRzICovCisJc3VtID0gKHN1bSA+PiAxNikgKyAoc3VtICYgMHhmZmZmKTsgICAgIC8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KKwlzdW0gKz0gKHN1bSA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgLyogYWRkIGNhcnJ5ICovCisJYW5zd2VyID0gfnN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydW5jYXRlIHRvIDE2IGJpdHMgKi8KKwlyZXR1cm4gYW5zd2VyOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9wcm9iZShpbnQgc2VxLCBpbnQgdHRsKQoreworCWludCBsZW4sIHJlczsKKwl2b2lkICpvdXQ7CisKKwkvKiBQYXlsb2FkICovCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJaWYgKGRlc3RfbHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3Qgb3V0ZGF0YTZfdCAqcGt0ID0gKHN0cnVjdCBvdXRkYXRhNl90ICopIG91dGlwOworCQlwa3QtPmlkZW50NiA9IGh0b25sKGlkZW50KTsKKwkJcGt0LT5zZXE2ICAgPSBodG9ubChzZXEpOworCQkvKmdldHRpbWVvZmRheSgmcGt0LT50diwgJnR6KTsqLworCX0gZWxzZQorI2VuZGlmCisJeworCQlvdXRkYXRhLT5zZXEgPSBzZXE7CisJCW91dGRhdGEtPnR0bCA9IHR0bDsKKy8vIFVOVVNFRDogd2FzIHN0b3JpbmcgZ2V0dGltZW9mZGF5J3MgcmVzdWx0IHRoZXJlLCBidXQgbmV2ZXIgZXZlciBjaGVja2VkIGl0CisJCS8qbWVtY3B5KCZvdXRkYXRhLT50diwgdHAsIHNpemVvZihvdXRkYXRhLT50dikpOyovCisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVVNFX0lDTVApIHsKKwkJCW91dGljbXAtPmljbXBfc2VxID0gaHRvbnMoc2VxKTsKKworCQkJLyogQWx3YXlzIGNhbGN1bGF0ZSBjaGVja3N1bSBmb3IgaWNtcCBwYWNrZXRzICovCisJCQlvdXRpY21wLT5pY21wX2Nrc3VtID0gMDsKKwkJCW91dGljbXAtPmljbXBfY2tzdW0gPSBpbl9ja3N1bSgodWludDE2X3QgKilvdXRpY21wLAorCQkJCQkJcGFja2xlbiAtIChzaXplb2YoKm91dGlwKSArIG9wdGxlbikpOworCQkJaWYgKG91dGljbXAtPmljbXBfY2tzdW0gPT0gMCkKKwkJCQlvdXRpY21wLT5pY21wX2Nrc3VtID0gMHhmZmZmOworCQl9CisJfQorCisvL0JVRyEgdmVyYm9zZSBpcyAoeCAmIE9QVF9WRVJCT1NFKSwgbm90IGEgY291bnRlciEKKyNpZiAwIC8vRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisJLyogWFhYIHVuZG9jdW1lbnRlZCBkZWJ1Z2dpbmcgaGFjayAqLworCWlmICh2ZXJib3NlID4gMSkgeworCQljb25zdCB1aW50MTZfdCAqc3A7CisJCWludCBuc2hvcnRzLCBpOworCisJCXNwID0gKHVpbnQxNl90ICopb3V0aXA7CisJCW5zaG9ydHMgPSAodW5zaWduZWQpcGFja2xlbiAvIHNpemVvZih1aW50MTZfdCk7CisJCWkgPSAwOworCQlwcmludGYoIlsgJWQgYnl0ZXMiLCBwYWNrbGVuKTsKKwkJd2hpbGUgKC0tbnNob3J0cyA+PSAwKSB7CisJCQlpZiAoKGkrKyAlIDgpID09IDApCisJCQkJcHJpbnRmKCJcblx0Iik7CisJCQlwcmludGYoIiAlMDR4IiwgbnRvaHMoKnNwKSk7CisJCQlzcCsrOworCQl9CisJCWlmIChwYWNrbGVuICYgMSkgeworCQkJaWYgKChpICUgOCkgPT0gMCkKKwkJCQlwcmludGYoIlxuXHQiKTsKKwkJCXByaW50ZigiICUwMngiLCAqKHVuc2lnbmVkIGNoYXIgKilzcCk7CisJCX0KKwkJcHJpbnRmKCJdXG4iKTsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChkZXN0X2xzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJcmVzID0gc2V0c29ja29wdChzbmRzb2NrLCBTT0xfSVBWNiwgSVBWNl9VTklDQVNUX0hPUFMsICZ0dGwsIHNpemVvZih0dGwpKTsKKwkJaWYgKHJlcyA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHNvY2tvcHQgVU5JQ0FTVF9IT1BTICVkIiwgdHRsKTsKKwkJb3V0ID0gb3V0aXA7CisJCWxlbiA9IHBhY2tsZW47CisJfSBlbHNlCisjZW5kaWYKKwl7CisjaWYgZGVmaW5lZCBJUF9UVEwKKwkJcmVzID0gc2V0c29ja29wdChzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsICZ0dGwsIHNpemVvZih0dGwpKTsKKwkJaWYgKHJlcyA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHNvY2tvcHQgdHRsICVkIiwgdHRsKTsKKyNlbmRpZgorCQlvdXQgPSBvdXRpY21wOworCQlsZW4gPSBwYWNrbGVuIC0gc2l6ZW9mKCpvdXRpcCk7CisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfVVNFX0lDTVApKSB7CisJCQlvdXQgPSBvdXRkYXRhOworCQkJbGVuIC09IHNpemVvZigqb3V0dWRwKTsKKwkJCXNldF9ucG9ydCgmZGVzdF9sc2EtPnUuc2EsIGh0b25zKHBvcnQgKyBzZXEpKTsKKwkJfQorCX0KKworCXJlcyA9IHhzZW5kdG8oc25kc29jaywgb3V0LCBsZW4sICZkZXN0X2xzYS0+dS5zYSwgZGVzdF9sc2EtPmxlbik7CisJaWYgKHJlcyAhPSBsZW4pCisJCWJiX2luZm9fbXNnKCJzZW50ICVkIG9jdGV0cywgcmV0PSVkIiwgbGVuLCByZXMpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisvKgorICogQ29udmVydCBhbiBJQ01QICJ0eXBlIiBmaWVsZCB0byBhIHByaW50YWJsZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3ByX3R5cGUodW5zaWduZWQgY2hhciB0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0dGFiW10gPSB7CisJIkVjaG8gUmVwbHkiLCAgICJJQ01QIDEiLCAgICAgICAiSUNNUCAyIiwgICAgICAgIkRlc3QgVW5yZWFjaGFibGUiLAorCSJTb3VyY2UgUXVlbmNoIiwgIlJlZGlyZWN0IiwgICAgIklDTVAgNiIsICAgICAgICJJQ01QIDciLAorCSJFY2hvIiwgICAgICAgICAiUm91dGVyIEFkdmVydCIsICJSb3V0ZXIgU29saWNpdCIsICJUaW1lIEV4Y2VlZGVkIiwKKwkiUGFyYW0gUHJvYmxlbSIsICJUaW1lc3RhbXAiLCAgICJUaW1lc3RhbXAgUmVwbHkiLCAiSW5mbyBSZXF1ZXN0IiwKKwkiSW5mbyBSZXBseSIsICAgIk1hc2sgUmVxdWVzdCIsICJNYXNrIFJlcGx5IgorCX07CisjIGlmIEVOQUJMRV9UUkFDRVJPVVRFNgorCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0dGFiNltdID0geworWzBdCSJFcnJvciIsICJEZXN0IFVucmVhY2hhYmxlIiwgIlBhY2tldCBUb28gQmlnIiwgIlRpbWUgRXhjZWVkZWQiLAorWzRdCSJQYXJhbSBQcm9ibGVtIiwKK1s4XQkiRWNobyBSZXF1ZXN0IiwgIkVjaG8gUmVwbHkiLCAiTWVtYmVyc2hpcCBRdWVyeSIsICJNZW1iZXJzaGlwIFJlcG9ydCIsCitbMTJdCSJNZW1iZXJzaGlwIFJlZHVjdGlvbiIsICJSb3V0ZXIgU29saWNpdCIsICJSb3V0ZXIgQWR2ZXJ0IiwgIk5laWdoYm9yIFNvbGljaXQiLAorWzE2XQkiTmVpZ2hib3IgQWR2ZXJ0IiwgIlJlZGlyZWN0IiwKKwl9OworCisJaWYgKGRlc3RfbHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlpZiAodCA8IDUpCisJCQlyZXR1cm4gdHRhYjZbdF07CisJCWlmICh0IDwgMTI4IHx8IHQgPiBORF9SRURJUkVDVCkKKwkJCXJldHVybiAiT1VULU9GLVJBTkdFIjsKKwkJcmV0dXJuIHR0YWI2Wyh0ICYgNjMpICsgOF07CisJfQorIyBlbmRpZgorCWlmICh0ID49IEFSUkFZX1NJWkUodHRhYikpCisJCXJldHVybiAiT1VULU9GLVJBTkdFIjsKKworCXJldHVybiB0dGFiW3RdOworfQorI2VuZGlmCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisjZGVmaW5lIHBhY2tldDRfb2socmVhZF9sZW4sIGZyb20sIHNlcSkgXAorCXBhY2tldDRfb2socmVhZF9sZW4sIHNlcSkKKyNlbmRpZgorc3RhdGljIGludAorcGFja2V0NF9vayhpbnQgcmVhZF9sZW4sIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSwgaW50IHNlcSkKK3sKKwljb25zdCBzdHJ1Y3QgaWNtcCAqaWNwOworCXVuc2lnbmVkIGNoYXIgdHlwZSwgY29kZTsKKwlpbnQgaGxlbjsKKwljb25zdCBzdHJ1Y3QgaXAgKmlwOworCisJaXAgPSAoc3RydWN0IGlwICopIHJlY3ZfcGt0OworCWhsZW4gPSBpcC0+aXBfaGwgPDwgMjsKKwlpZiAocmVhZF9sZW4gPCBobGVuICsgSUNNUF9NSU5MRU4pIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoInBhY2tldCB0b28gc2hvcnQgKCVkIGJ5dGVzKSBmcm9tICVzXG4iLCByZWFkX2xlbiwKKwkJCQlpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJcmVhZF9sZW4gLT0gaGxlbjsKKwlpY3AgPSAoc3RydWN0IGljbXAgKikocmVjdl9wa3QgKyBobGVuKTsKKwl0eXBlID0gaWNwLT5pY21wX3R5cGU7CisJY29kZSA9IGljcC0+aWNtcF9jb2RlOworCS8qIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgKi8KKwlwbXR1ID0gMDsKKwlpZiAoY29kZSA9PSBJQ01QX1VOUkVBQ0hfTkVFREZSQUcpCisJCXBtdHUgPSBudG9ocyhpY3AtPmljbXBfbmV4dG10dSk7CisKKwlpZiAoKHR5cGUgPT0gSUNNUF9USU1YQ0VFRCAmJiBjb2RlID09IElDTVBfVElNWENFRURfSU5UUkFOUykKKwkgfHwgdHlwZSA9PSBJQ01QX1VOUkVBQ0gKKwkgfHwgdHlwZSA9PSBJQ01QX0VDSE9SRVBMWQorCSkgeworCQljb25zdCBzdHJ1Y3QgaXAgKmhpcDsKKwkJY29uc3Qgc3RydWN0IHVkcGhkciAqdXA7CisKKwkJaGlwID0gJmljcC0+aWNtcF9pcDsKKwkJaGxlbiA9IGhpcC0+aXBfaGwgPDwgMjsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVVNFX0lDTVApIHsKKwkJCXN0cnVjdCBpY21wICpoaWNtcDsKKworCQkJLyogWFhYICovCisJCQlpZiAodHlwZSA9PSBJQ01QX0VDSE9SRVBMWQorCQkJICYmIGljcC0+aWNtcF9pZCA9PSBodG9ucyhpZGVudCkKKwkJCSAmJiBpY3AtPmljbXBfc2VxID09IGh0b25zKHNlcSkKKwkJCSkgeworCQkJCXJldHVybiBJQ01QX1VOUkVBQ0hfUE9SVCsxOworCQkJfQorCisJCQloaWNtcCA9IChzdHJ1Y3QgaWNtcCAqKSgodW5zaWduZWQgY2hhciAqKWhpcCArIGhsZW4pOworCQkJaWYgKGhsZW4gKyBTSVpFT0ZfSUNNUF9IRFIgPD0gcmVhZF9sZW4KKwkJCSAmJiBoaXAtPmlwX3AgPT0gSVBQUk9UT19JQ01QCisJCQkgJiYgaGljbXAtPmljbXBfaWQgPT0gaHRvbnMoaWRlbnQpCisJCQkgJiYgaGljbXAtPmljbXBfc2VxID09IGh0b25zKHNlcSkKKwkJCSkgeworCQkJCXJldHVybiAodHlwZSA9PSBJQ01QX1RJTVhDRUVEID8gLTEgOiBjb2RlICsgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1cCA9IChzdHJ1Y3QgdWRwaGRyICopKChjaGFyICopaGlwICsgaGxlbik7CisJCQlpZiAoaGxlbiArIDEyIDw9IHJlYWRfbGVuCisJCQkgJiYgaGlwLT5pcF9wID09IElQUFJPVE9fVURQCisvLyBPZmY6IHNpbmNlIHdlIGRvIG5vdCBmb3JtIHRoZSBlbnRpcmUgSVAgcGFja2V0LAorLy8gYnV0IGRlZmVyIGl0IHRvIGtlcm5lbCwgd2UgY2FuJ3Qgc2V0IHNvdXJjZSBwb3J0LAorLy8gYW5kIHRodXMgY2FuJ3QgY2hlY2sgaXQgaGVyZSBpbiB0aGUgcmVwbHkKKwkJCS8qICYmIHVwLT5zb3VyY2UgPT0gaHRvbnMoaWRlbnQpICovCisJCQkgJiYgdXAtPmRlc3QgPT0gaHRvbnMocG9ydCArIHNlcSkKKwkJCSkgeworCQkJCXJldHVybiAodHlwZSA9PSBJQ01QX1RJTVhDRUVEID8gLTEgOiBjb2RlICsgMSk7CisJCQl9CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisJaWYgKHZlcmJvc2UpIHsKKwkJaW50IGk7CisJCXVpbnQzMl90ICpscCA9ICh1aW50MzJfdCAqKSZpY3AtPmljbXBfaXA7CisKKwkJcHJpbnRmKCJcbiVkIGJ5dGVzIGZyb20gJXMgdG8gIgorCQkgICAgICAgIiVzOiBpY21wIHR5cGUgJWQgKCVzKSBjb2RlICVkXG4iLAorCQkJcmVhZF9sZW4sIGluZXRfbnRvYShmcm9tLT5zaW5fYWRkciksCisJCQlpbmV0X250b2EoaXAtPmlwX2RzdCksCisJCQl0eXBlLCBwcl90eXBlKHR5cGUpLCBpY3AtPmljbXBfY29kZSk7CisJCWZvciAoaSA9IDQ7IGkgPCByZWFkX2xlbjsgaSArPSBzaXplb2YoKmxwKSkKKwkJCXByaW50ZigiJTJkOiB4JTguOHhcbiIsIGksICpscCsrKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorIyBpZiAhRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisjZGVmaW5lIHBhY2tldF9vayhyZWFkX2xlbiwgZnJvbV9sc2EsIHRvLCBzZXEpIFwKKwlwYWNrZXRfb2socmVhZF9sZW4sIGZyb21fbHNhLCBzZXEpCisjIGVuZGlmCitzdGF0aWMgaW50CitwYWNrZXRfb2soaW50IHJlYWRfbGVuLCBsZW5fYW5kX3NvY2thZGRyICpmcm9tX2xzYSwKKwkJCXN0cnVjdCBzb2NrYWRkciAqdG8sCisJCQlpbnQgc2VxKQoreworCWNvbnN0IHN0cnVjdCBpY21wNl9oZHIgKmljcDsKKwl1bnNpZ25lZCBjaGFyIHR5cGUsIGNvZGU7CisKKwlpZiAoZnJvbV9sc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpCisJCXJldHVybiBwYWNrZXQ0X29rKHJlYWRfbGVuLCAmZnJvbV9sc2EtPnUuc2luLCBzZXEpOworCisJaWNwID0gKHN0cnVjdCBpY21wNl9oZHIgKikgcmVjdl9wa3Q7CisKKwl0eXBlID0gaWNwLT5pY21wNl90eXBlOworCWNvZGUgPSBpY3AtPmljbXA2X2NvZGU7CisKKwlpZiAoKHR5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRCAmJiBjb2RlID09IElDTVA2X1RJTUVfRVhDRUVEX1RSQU5TSVQpCisJIHx8IHR5cGUgPT0gSUNNUDZfRFNUX1VOUkVBQ0gKKwkpIHsKKwkJc3RydWN0IGlwNl9oZHIgKmhpcDsKKwkJc3RydWN0IHVkcGhkciAqdXA7CisJCWludCBuZXh0aGRyOworCisJCWhpcCA9IChzdHJ1Y3QgaXA2X2hkciAqKShpY3AgKyAxKTsKKwkJdXAgID0gKHN0cnVjdCB1ZHBoZHIgKikgKGhpcCArIDEpOworCQluZXh0aGRyID0gaGlwLT5pcDZfbnh0OworCisJCWlmIChuZXh0aGRyID09IElQUFJPVE9fRlJBR01FTlQpIHsKKwkJCW5leHRoZHIgPSAqKHVuc2lnbmVkIGNoYXIqKXVwOworCQkJdXArKzsKKwkJfQorCQlpZiAobmV4dGhkciA9PSBJUFBST1RPX1VEUCkgeworCQkJc3RydWN0IG91dGRhdGE2X3QgKnBrdDsKKworCQkJcGt0ID0gKHN0cnVjdCBvdXRkYXRhNl90ICopICh1cCArIDEpOworCisJCQlpZiAobnRvaGwocGt0LT5pZGVudDYpID09IGlkZW50CisJCQkgJiYgbnRvaGwocGt0LT5zZXE2KSA9PSBzZXEKKwkJCSkgeworCQkJCXJldHVybiAodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEID8gLTEgOiAoY29kZTw8OCkrMSk7CisJCQl9CisJCX0KKwl9CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisJaWYgKHZlcmJvc2UpIHsKKwkJdW5zaWduZWQgY2hhciAqcDsKKwkJY2hhciBwYTFbTUFYSE9TVE5BTUVMRU5dOworCQljaGFyIHBhMltNQVhIT1NUTkFNRUxFTl07CisJCWludCBpOworCisJCXAgPSAodW5zaWduZWQgY2hhciAqKSAoaWNwICsgMSk7CisKKwkJcHJpbnRmKCJcbiVkIGJ5dGVzIGZyb20gJXMgdG8gIgorCQkgICAgICAgIiVzOiBpY21wIHR5cGUgJWQgKCVzKSBjb2RlICVkXG4iLAorCQkJcmVhZF9sZW4sCisJCQlpbmV0X250b3AoQUZfSU5FVDYsICZmcm9tX2xzYS0+dS5zaW42LnNpbjZfYWRkciwgcGExLCBzaXplb2YocGExKSksCisJCQlpbmV0X250b3AoQUZfSU5FVDYsICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXRvKS0+c2luNl9hZGRyLCBwYTIsIHNpemVvZihwYTIpKSwKKwkJCXR5cGUsIHByX3R5cGUodHlwZSksIGljcC0+aWNtcDZfY29kZSk7CisKKwkJcmVhZF9sZW4gLT0gc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpOworCQlmb3IgKGkgPSAwOyBpIDwgcmVhZF9sZW47IGkrKykgeworCQkJaWYgKGkgJSAxNiA9PSAwKQorCQkJCXByaW50ZigiJTA0eDoiLCBpKTsKKwkJCWlmIChpICUgNCA9PSAwKQorCQkJCWJiX3B1dGNoYXIoJyAnKTsKKwkJCXByaW50ZigiJTAyeCIsIHBbaV0pOworCQkJaWYgKChpICUgMTYgPT0gMTUpICYmIChpICsgMSA8IHJlYWRfbGVuKSkKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorIyBlbmRpZgorCisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiAhRU5BQkxFX1RSQUNFUk9VVEU2ICovCitzdGF0aWMgQUxXQVlTX0lOTElORSBpbnQKK3BhY2tldF9vayhpbnQgcmVhZF9sZW4sCisJCWxlbl9hbmRfc29ja2FkZHIgKmZyb21fbHNhIElGX05PVF9GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRShVTlVTRURfUEFSQU0pLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKnRvIFVOVVNFRF9QQVJBTSwKKwkJaW50IHNlcSkKK3sKKwlyZXR1cm4gcGFja2V0NF9vayhyZWFkX2xlbiwgJmZyb21fbHNhLT51LnNpbiwgc2VxKTsKK30KKyNlbmRpZgorCisvKgorICogQ29uc3RydWN0IGFuIEludGVybmV0IGFkZHJlc3MgcmVwcmVzZW50YXRpb24uCisgKiBJZiB0aGUgLW4gZmxhZyBoYXMgYmVlbiBzdXBwbGllZCwgZ2l2ZQorICogbnVtZXJpYyB2YWx1ZSwgb3RoZXJ3aXNlIHRyeSBmb3Igc3ltYm9saWMgbmFtZS4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2luZXRuYW1lKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSkKK3sKKwljaGFyICppbmEgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoZnJvbSk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9BRERSX05VTSkgeworCQlwcmludGYoIiAgJXMiLCBpbmEpOworCX0gZWxzZSB7CisJCWNoYXIgKm4gPSBOVUxMOworCisJCWlmIChmcm9tLT5zYV9mYW1pbHkgIT0gQUZfSU5FVAorCQkgfHwgKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWZyb20pLT5zaW5fYWRkci5zX2FkZHIgIT0gSU5BRERSX0FOWQorCQkpIHsKKwkJCS8qIFRyeSB0byByZXZlcnNlIHJlc29sdmUgaWYgaXQgaXMgbm90IDAuMC4wLjAgKi8KKwkJCW4gPSB4bWFsbG9jX3NvY2thZGRyMmhvc3Rfbm9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIqKWZyb20pOworCQl9CisJCXByaW50ZigiICAlcyAoJXMpIiwgKG4gPyBuIDogaW5hKSwgaW5hKTsKKwkJZnJlZShuKTsKKwl9CisJZnJlZShpbmEpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnQoaW50IHJlYWRfbGVuLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8pCit7CisJcHJpbnRfaW5ldG5hbWUoZnJvbSk7CisKKwlpZiAodmVyYm9zZSkgeworCQljaGFyICppbmEgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQodG8pOworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCQlpZiAodG8tPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJcmVhZF9sZW4gLT0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJc3RydWN0IGlwICppcDRwYWNrZXQgPSAoc3RydWN0IGlwKilyZWN2X3BrdDsKKwkJCXJlYWRfbGVuIC09IGlwNHBhY2tldC0+aXBfaGwgPDwgMjsKKwkJfQorCQlwcmludGYoIiAlZCBieXRlcyB0byAlcyIsIHJlYWRfbGVuLCBpbmEpOworCQlmcmVlKGluYSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZGVsdGFfbXModW5zaWduZWQgdDFwLCB1bnNpZ25lZCB0MnApCit7CisJdW5zaWduZWQgdHQgPSB0MnAgLSB0MXA7CisJcHJpbnRmKCIgICV1LiUwM3UgbXMiLCB0dCAvIDEwMDAsIHR0ICUgMTAwMCk7Cit9CisKKy8qCisgKiBVc2FnZTogWy1kRklsbnJ2eF0gWy1nIGdhdGV3YXldIFstaSBpZmFjZV0gWy1mIGZpcnN0X3R0bF0KKyAqIFstbSBtYXhfdHRsXSBbIC1wIHBvcnRdIFstcSBucXVlcmllc10gWy1zIHNyY19hZGRyXSBbLXQgdG9zXQorICogWy13IHdhaXR0aW1lXSBbLXogcGF1c2Vtc2Vjc10gaG9zdCBbcGFja2V0bGVuXSIKKyAqLworc3RhdGljIGludAorY29tbW9uX3RyYWNlcm91dGVfbWFpbihpbnQgb3AsIGNoYXIgKiphcmd2KQoreworCWludCBtaW5wYWNrZXQ7CisJaW50IHRvcyA9IDA7CisJaW50IG1heF90dGwgPSAzMDsKKwlpbnQgbnByb2JlcyA9IDM7CisJaW50IGZpcnN0X3R0bCA9IDE7CisJdW5zaWduZWQgcGF1c2Vtc2VjcyA9IDA7CisJY2hhciAqc291cmNlOworCWNoYXIgKmRldmljZTsKKwljaGFyICp0b3Nfc3RyOworCWNoYXIgKm1heF90dGxfc3RyOworCWNoYXIgKnBvcnRfc3RyOworCWNoYXIgKm5wcm9iZXNfc3RyOworCWNoYXIgKndhaXR0aW1lX3N0cjsKKwljaGFyICpwYXVzZW1zZWNzX3N0cjsKKwljaGFyICpmaXJzdF90dGxfc3RyOworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisJbGxpc3RfdCAqc291cmNlX3JvdXRlX2xpc3QgPSBOVUxMOworCWludCBsc3JyID0gMDsKKyNlbmRpZgorI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCXNhX2ZhbWlseV90IGFmOworI2Vsc2UKKwllbnVtIHsgYWYgPSBBRl9JTkVUIH07CisjZW5kaWYKKwlpbnQgdHRsOworCWludCBzZXE7CisJbGVuX2FuZF9zb2NrYWRkciAqZnJvbV9sc2E7CisJc3RydWN0IHNvY2thZGRyICpsYXN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnRvOworCisJSU5JVF9HKCk7CisKKwkvKiBtaW5pbXVtIDEgYXJnICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6eC14IiBJRl9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFKCI6Zzo6Iik7CisJb3AgfD0gZ2V0b3B0MzIoYXJndiwgT1BUX1NUUklORworCQksICZ0b3Nfc3RyLCAmZGV2aWNlLCAmbWF4X3R0bF9zdHIsICZwb3J0X3N0ciwgJm5wcm9iZXNfc3RyCisJCSwgJnNvdXJjZSwgJndhaXR0aW1lX3N0ciwgJnBhdXNlbXNlY3Nfc3RyLCAmZmlyc3RfdHRsX3N0cgorI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisJCSwgJnNvdXJjZV9yb3V0ZV9saXN0CisjZW5kaWYKKwkpOworCWFyZ3YgKz0gb3B0aW5kOworCisjaWYgMCAvKiBJR05PUkVEICovCisJaWYgKG9wICYgT1BUX0lQX0NIS1NVTSkKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBpcCBjaGVja3N1bXMgZGlzYWJsZWQiKTsKKyNlbmRpZgorCWlmIChvcCAmIE9QVF9UT1MpCisJCXRvcyA9IHhhdG91X3JhbmdlKHRvc19zdHIsIDAsIDI1NSk7CisJaWYgKG9wICYgT1BUX01BWF9UVEwpCisJCW1heF90dGwgPSB4YXRvdV9yYW5nZShtYXhfdHRsX3N0ciwgMSwgMjU1KTsKKwlpZiAob3AgJiBPUFRfUE9SVCkKKwkJcG9ydCA9IHhhdG91MTYocG9ydF9zdHIpOworCWlmIChvcCAmIE9QVF9OUFJPQkVTKQorCQlucHJvYmVzID0geGF0b3VfcmFuZ2UobnByb2Jlc19zdHIsIDEsIElOVF9NQVgpOworCWlmIChvcCAmIE9QVF9TT1VSQ0UpIHsKKwkJLyoKKwkJICogc2V0IHRoZSBpcCBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgb3V0Ym91bmQKKwkJICogcHJvYmUgKGUuZy4sIG9uIGEgbXVsdGktaG9tZWQgaG9zdCkuCisJCSAqLworCQlpZiAoZ2V0dWlkKCkgIT0gMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKwl9CisJaWYgKG9wICYgT1BUX1dBSVRUSU1FKQorCQl3YWl0dGltZSA9IHhhdG91X3JhbmdlKHdhaXR0aW1lX3N0ciwgMSwgMjQgKiA2MCAqIDYwKTsKKwlpZiAob3AgJiBPUFRfUEFVU0VfTVMpCisJCXBhdXNlbXNlY3MgPSB4YXRvdV9yYW5nZShwYXVzZW1zZWNzX3N0ciwgMCwgNjAgKiA2MCAqIDEwMDApOworCWlmIChvcCAmIE9QVF9GSVJTVF9UVEwpCisJCWZpcnN0X3R0bCA9IHhhdG91X3JhbmdlKGZpcnN0X3R0bF9zdHIsIDEsIG1heF90dGwpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlpZiAoc291cmNlX3JvdXRlX2xpc3QpIHsKKwkJd2hpbGUgKHNvdXJjZV9yb3V0ZV9saXN0KSB7CisJCQlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisKKwkJCWlmIChsc3JyID49IE5HQVRFV0FZUykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gbW9yZSB0aGFuICVkIGdhdGV3YXlzIiwgTkdBVEVXQVlTKTsKKwkJCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihsbGlzdF9wb3AoJnNvdXJjZV9yb3V0ZV9saXN0KSwgMCwgQUZfSU5FVCk7CisJCQlnd2xpc3RbbHNycl0gPSBsc2EtPnUuc2luLnNpbl9hZGRyLnNfYWRkcjsKKwkJCWZyZWUobHNhKTsKKwkJCSsrbHNycjsKKwkJfQorCQlvcHRsZW4gPSAobHNyciArIDEpICogc2l6ZW9mKGd3bGlzdFswXSk7CisJfQorI2VuZGlmCisKKwkvKiBQcm9jZXNzIGRlc3RpbmF0aW9uIGFuZCBvcHRpb25hbCBwYWNrZXQgc2l6ZSAqLworCW1pbnBhY2tldCA9IHNpemVvZigqb3V0aXApICsgU0laRU9GX0lDTVBfSERSICsgc2l6ZW9mKCpvdXRkYXRhKSArIG9wdGxlbjsKKwlpZiAoIShvcCAmIE9QVF9VU0VfSUNNUCkpCisJCW1pbnBhY2tldCArPSBzaXplb2YoKm91dHVkcCkgLSBTSVpFT0ZfSUNNUF9IRFI7CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJYWYgPSBBRl9VTlNQRUM7CisJaWYgKG9wICYgT1BUX0lQVjQpCisJCWFmID0gQUZfSU5FVDsKKwlpZiAob3AgJiBPUFRfSVBWNikKKwkJYWYgPSBBRl9JTkVUNjsKKwlkZXN0X2xzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihhcmd2WzBdLCBwb3J0LCBhZik7CisJYWYgPSBkZXN0X2xzYS0+dS5zYS5zYV9mYW1pbHk7CisJaWYgKGFmID09IEFGX0lORVQ2KQorCQltaW5wYWNrZXQgPSBzaXplb2Yoc3RydWN0IG91dGRhdGE2X3QpOworI2Vsc2UKKwlkZXN0X2xzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIHBvcnQpOworI2VuZGlmCisJcGFja2xlbiA9IG1pbnBhY2tldDsKKwlpZiAoYXJndlsxXSkKKwkJcGFja2xlbiA9IHhhdG91bF9yYW5nZShhcmd2WzFdLCBtaW5wYWNrZXQsIDMyICogMTAyNCk7CisKKwkvKiBFbnN1cmUgdGhlIHNvY2tldCBmZHMgd29uJ3QgYmUgMCwgMSBvciAyICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpLCByY3Zzb2NrKTsKKyMgaWZkZWYgSVBWNl9SRUNWUEtUSU5GTworCQlzZXRzb2Nrb3B0KHJjdnNvY2ssIFNPTF9JUFY2LCBJUFY2X1JFQ1ZQS1RJTkZPLAorCQkJCSZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisJCXNldHNvY2tvcHQocmN2c29jaywgU09MX0lQVjYsIElQVjZfMjI5MlBLVElORk8sCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKyMgZWxzZQorCQlzZXRzb2Nrb3B0KHJjdnNvY2ssIFNPTF9JUFY2LCBJUFY2X1BLVElORk8sCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKyMgZW5kaWYKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19JQ01QKSwgcmN2c29jayk7CisJfQorCisjaWYgVFJBQ0VST1VURV9TT19ERUJVRworCWlmIChvcCAmIE9QVF9ERUJVRykKKwkJc2V0c29ja29wdChyY3Zzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywKKwkJCQkmY29uc3RfaW50XzEsIHNpemVvZihjb25zdF9pbnRfMSkpOworI2VuZGlmCisJaWYgKG9wICYgT1BUX0JZUEFTU19ST1VURSkKKwkJc2V0c29ja29wdChyY3Zzb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQlzdGF0aWMgY29uc3QgaW50IHR3byA9IDI7CisJCWlmIChzZXRzb2Nrb3B0KHJjdnNvY2ssIFNPTF9SQVcsIElQVjZfQ0hFQ0tTVU0sICZ0d28sIHNpemVvZih0d28pKSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHNvY2tvcHQgUkFXX0NIRUNLU1VNIik7CisJCXhtb3ZlX2ZkKHhzb2NrZXQoYWYsIFNPQ0tfREdSQU0sIDApLCBzbmRzb2NrKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJaWYgKG9wICYgT1BUX1VTRV9JQ01QKQorCQkJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19JQ01QKSwgc25kc29jayk7CisJCWVsc2UKKwkJCXhtb3ZlX2ZkKHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCksIHNuZHNvY2spOworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFICYmIGRlZmluZWQgSVBfT1BUSU9OUworCQlpZiAobHNyciA+IDApIHsKKwkJCXVuc2lnbmVkIGNoYXIgb3B0bGlzdFtNQVhfSVBPUFRMRU5dOworCQkJdW5zaWduZWQgc2l6ZTsKKworCQkJLyogZmluYWwgaG9wICovCisJCQlnd2xpc3RbbHNycl0gPSBkZXN0X2xzYS0+dS5zaW4uc2luX2FkZHIuc19hZGRyOworCQkJKytsc3JyOworCisJCQkvKiBmb3JjZSA0IGJ5dGUgYWxpZ25tZW50ICovCisJCQlvcHRsaXN0WzBdID0gSVBPUFRfTk9QOworCQkJLyogbG9vc2Ugc291cmNlIHJvdXRlIG9wdGlvbiAqLworCQkJb3B0bGlzdFsxXSA9IElQT1BUX0xTUlI7CisJCQlzaXplID0gbHNyciAqIHNpemVvZihnd2xpc3RbMF0pOworCQkJb3B0bGlzdFsyXSA9IHNpemUgKyAzOworCQkJLyogcG9pbnRlciB0byBMU1JSIGFkZHJlc3NlcyAqLworCQkJb3B0bGlzdFszXSA9IElQT1BUX01JTk9GRjsKKwkJCW1lbWNweShvcHRsaXN0ICsgNCwgZ3dsaXN0LCBzaXplKTsKKworCQkJaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfT1BUSU9OUywKKwkJCQkJKGNoYXIgKilvcHRsaXN0LCBzaXplICsgc2l6ZW9mKGd3bGlzdFswXSkpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiSVBfT1BUSU9OUyIpOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKyNpZmRlZiBTT19TTkRCVUYKKwlpZiAoc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZwYWNrbGVuLCBzaXplb2YocGFja2xlbikpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNPX1NOREJVRiIpOworCX0KKyNlbmRpZgorI2lmZGVmIElQX1RPUworCWlmICgob3AgJiBPUFRfVE9TKSAmJiBzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX1RPUywgJnRvcywgc2l6ZW9mKHRvcykpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHNvY2tvcHQgdG9zICVkIiwgdG9zKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBJUF9ET05URlJBRworCWlmIChvcCAmIE9QVF9ET05UX0ZSQUdNTlQpCisJCXNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfRE9OVEZSQUcsCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKyNlbmRpZgorI2lmIFRSQUNFUk9VVEVfU09fREVCVUcKKwlpZiAob3AgJiBPUFRfREVCVUcpCisJCXNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsCisJCQkJJmNvbnN0X2ludF8xLCBzaXplb2YoY29uc3RfaW50XzEpKTsKKyNlbmRpZgorCWlmIChvcCAmIE9QVF9CWVBBU1NfUk9VVEUpCisJCXNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAorCQkJCSZjb25zdF9pbnRfMSwgc2l6ZW9mKGNvbnN0X2ludF8xKSk7CisKKwlvdXRpcCA9IHh6YWxsb2MocGFja2xlbik7CisKKwlpZGVudCA9IGdldHBpZCgpOworCisJaWYgKGFmID09IEFGX0lORVQpIHsKKwkJaWYgKG9wICYgT1BUX1VTRV9JQ01QKSB7CisJCQlpZGVudCB8PSAweDgwMDA7CisJCQlvdXRpY21wLT5pY21wX3R5cGUgPSBJQ01QX0VDSE87CisJCQlvdXRpY21wLT5pY21wX2lkID0gaHRvbnMoaWRlbnQpOworCQkJb3V0ZGF0YSA9IChzdHJ1Y3Qgb3V0ZGF0YV90ICopKChjaGFyICopb3V0aWNtcCArIFNJWkVPRl9JQ01QX0hEUik7CisJCX0gZWxzZSB7CisJCQlvdXRkYXRhID0gKHN0cnVjdCBvdXRkYXRhX3QgKikob3V0dWRwICsgMSk7CisJCX0KKwl9CisKKwlpZiAob3AgJiBPUFRfREVWSUNFKSAvKiBobW0sIGRvIHdlIG5lZWQgZXJyb3IgY2hlY2s/ICovCisJCXNldHNvY2tvcHRfYmluZHRvZGV2aWNlKHNuZHNvY2ssIGRldmljZSk7CisKKwlpZiAob3AgJiBPUFRfU09VUkNFKSB7CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisvLyBUT0RPOiBuZWVkIHhkb3R0ZWRfYW5kX2FmMnNvY2thZGRyPworCQlsZW5fYW5kX3NvY2thZGRyICpzb3VyY2VfbHNhID0geGhvc3RfYW5kX2FmMnNvY2thZGRyKHNvdXJjZSwgMCwgYWYpOworI2Vsc2UKKwkJbGVuX2FuZF9zb2NrYWRkciAqc291cmNlX2xzYSA9IHhkb3R0ZWQyc29ja2FkZHIoc291cmNlLCAwKTsKKyNlbmRpZgorCQkvKiBQaW5nNCBkb2VzIHRoaXMgKHdoeT8pICovCisJCWlmIChhZiA9PSBBRl9JTkVUKQorCQkJaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0lGLAorCQkJCQkmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG11bHRpY2FzdCBzb3VyY2UgaW50ZXJmYWNlIik7CisvL1RPRE86IHdlIGNhbiBxdWVyeSBzb3VyY2UgcG9ydCB3ZSBib3VuZCB0bywKKy8vIGFuZCBjaGVjayBpdCBpbiByZXBsaWVzLi4uIGlmIHdlIGNhcmUgZW5vdWdoCisJCXhiaW5kKHNuZHNvY2ssICZzb3VyY2VfbHNhLT51LnNhLCBzb3VyY2VfbHNhLT5sZW4pOworCQlmcmVlKHNvdXJjZV9sc2EpOworCX0KKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwllbHNlIGlmIChhZiA9PSBBRl9JTkVUNikgeworLy9UT0RPOiB3aHkgd2UgZG9uJ3QgZG8gaXQgZm9yIElQdjQ/CisJCWxlbl9hbmRfc29ja2FkZHIgKnNvdXJjZV9sc2E7CisKKwkJaW50IHByb2JlX2ZkID0geHNvY2tldChhZiwgU09DS19ER1JBTSwgMCk7CisJCWlmIChvcCAmIE9QVF9ERVZJQ0UpCisJCQlzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShwcm9iZV9mZCwgZGV2aWNlKTsKKwkJc2V0X25wb3J0KCZkZXN0X2xzYS0+dS5zYSwgaHRvbnMoMTAyNSkpOworCQkvKiBkdW1teSBjb25uZWN0LiBtYWtlcyBrZXJuZWwgcGljayBzb3VyY2UgSVAgKGFuZCBwb3J0KSAqLworCQl4Y29ubmVjdChwcm9iZV9mZCwgJmRlc3RfbHNhLT51LnNhLCBkZXN0X2xzYS0+bGVuKTsKKwkJc2V0X25wb3J0KCZkZXN0X2xzYS0+dS5zYSwgaHRvbnMocG9ydCkpOworCisJCS8qIHJlYWQgSVAgYW5kIHBvcnQgKi8KKwkJc291cmNlX2xzYSA9IGdldF9zb2NrX2xzYShwcm9iZV9mZCk7CisJCWlmIChzb3VyY2VfbHNhID09IE5VTEwpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IHByb2JlIGFkZHIiKTsKKworCQljbG9zZShwcm9iZV9mZCk7CisKKwkJLyogYmluZCBvdXIgc29ja2V0cyB0byB0aGlzIElQIChidXQgbm90IHBvcnQpICovCisJCXNldF9ucG9ydCgmc291cmNlX2xzYS0+dS5zYSwgMCk7CisJCXhiaW5kKHNuZHNvY2ssICZzb3VyY2VfbHNhLT51LnNhLCBzb3VyY2VfbHNhLT5sZW4pOworCQl4YmluZChyY3Zzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKworCQlmcmVlKHNvdXJjZV9sc2EpOworCX0KKyNlbmRpZgorCisJLyogUmV2ZXJ0IHRvIG5vbi1wcml2aWxlZ2VkIHVzZXIgYWZ0ZXIgb3BlbmluZyBzb2NrZXRzICovCisJeHNldGdpZChnZXRnaWQoKSk7CisJeHNldHVpZChnZXR1aWQoKSk7CisKKwlwcmludGYoInRyYWNlcm91dGUgdG8gJXMgKCVzKSIsIGFyZ3ZbMF0sCisJCQl4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJmRlc3RfbHNhLT51LnNhKSk7CisJaWYgKG9wICYgT1BUX1NPVVJDRSkKKwkJcHJpbnRmKCIgZnJvbSAlcyIsIHNvdXJjZSk7CisJcHJpbnRmKCIsICVkIGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsIG1heF90dGwsIHBhY2tsZW4pOworCisJZnJvbV9sc2EgPSBkdXBfc29ja2FkZHIoZGVzdF9sc2EpOworCWxhc3RhZGRyID0geHphbGxvYyhkZXN0X2xzYS0+bGVuKTsKKwl0byA9IHh6YWxsb2MoZGVzdF9sc2EtPmxlbik7CisJc2VxID0gMDsKKwlmb3IgKHR0bCA9IGZpcnN0X3R0bDsgdHRsIDw9IG1heF90dGw7ICsrdHRsKSB7CisJCWludCBwcm9iZTsKKwkJaW50IHVucmVhY2hhYmxlID0gMDsgLyogY291bnRlciAqLworCQlpbnQgZ290bGFzdGFkZHIgPSAwOyAvKiBmbGFncyAqLworCQlpbnQgZ290X3RoZXJlID0gMDsKKworCQlwcmludGYoIiUyZCIsIHR0bCk7CisJCWZvciAocHJvYmUgPSAwOyBwcm9iZSA8IG5wcm9iZXM7ICsrcHJvYmUpIHsKKwkJCWludCByZWFkX2xlbjsKKwkJCXVuc2lnbmVkIHQxOworCQkJdW5zaWduZWQgdDI7CisJCQlpbnQgbGVmdF9tczsKKwkJCXN0cnVjdCBpcCAqaXA7CisKKwkJCWZmbHVzaF9hbGwoKTsKKwkJCWlmIChwcm9iZSAhPSAwICYmIHBhdXNlbXNlY3MgPiAwKQorCQkJCXVzbGVlcChwYXVzZW1zZWNzICogMTAwMCk7CisKKwkJCXNlbmRfcHJvYmUoKytzZXEsIHR0bCk7CisJCQl0MiA9IHQxID0gbW9ub3RvbmljX3VzKCk7CisKKwkJCWxlZnRfbXMgPSB3YWl0dGltZSAqIDEwMDA7CisJCQl3aGlsZSAoKHJlYWRfbGVuID0gd2FpdF9mb3JfcmVwbHkoZnJvbV9sc2EsIHRvLCAmdDIsICZsZWZ0X21zKSkgIT0gMCkgeworCQkJCWludCBpY21wX2NvZGU7CisKKwkJCQkvKiBSZWN2J2VkIGEgcGFja2V0LCBvciByZWFkIGVycm9yICovCisJCQkJLyogdDIgPSBtb25vdG9uaWNfdXMoKSAtIHNldCBieSB3YWl0X2Zvcl9yZXBseSAqLworCisJCQkJaWYgKHJlYWRfbGVuIDwgMCkKKwkJCQkJY29udGludWU7CisJCQkJaWNtcF9jb2RlID0gcGFja2V0X29rKHJlYWRfbGVuLCBmcm9tX2xzYSwgdG8sIHNlcSk7CisJCQkJLyogU2tpcCBzaG9ydCBwYWNrZXQgKi8KKwkJCQlpZiAoaWNtcF9jb2RlID09IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKCFnb3RsYXN0YWRkcgorCQkJCSB8fCAobWVtY21wKGxhc3RhZGRyLCAmZnJvbV9sc2EtPnUuc2EsIGZyb21fbHNhLT5sZW4pICE9IDApCisJCQkJKSB7CisJCQkJCXByaW50KHJlYWRfbGVuLCAmZnJvbV9sc2EtPnUuc2EsIHRvKTsKKwkJCQkJbWVtY3B5KGxhc3RhZGRyLCAmZnJvbV9sc2EtPnUuc2EsIGZyb21fbHNhLT5sZW4pOworCQkJCQlnb3RsYXN0YWRkciA9IDE7CisJCQkJfQorCisJCQkJcHJpbnRfZGVsdGFfbXModDEsIHQyKTsKKwkJCQlpcCA9IChzdHJ1Y3QgaXAgKilyZWN2X3BrdDsKKworCQkJCWlmIChmcm9tX2xzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCQkJaWYgKG9wICYgT1BUX1RUTF9GTEFHKQorCQkJCQkJcHJpbnRmKCIgKCVkKSIsIGlwLT5pcF90dGwpOworCisJCQkJLyogdGltZSBleGNlZWRlZCBpbiB0cmFuc2l0ICovCisJCQkJaWYgKGljbXBfY29kZSA9PSAtMSkKKwkJCQkJYnJlYWs7CisJCQkJaWNtcF9jb2RlLS07CisJCQkJc3dpdGNoIChpY21wX2NvZGUpIHsKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwkJCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUE9SVCA8PCA4OgorCQkJCQlnb3RfdGhlcmUgPSAxOworCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWNhc2UgSUNNUF9VTlJFQUNIX1BPUlQ6CisJCQkJCWlmIChpcC0+aXBfdHRsIDw9IDEpCisJCQkJCQlwcmludGYoIiAhIik7CisJCQkJCWdvdF90aGVyZSA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfTkVUOgorI2lmIEVOQUJMRV9UUkFDRVJPVVRFNiAmJiAoSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURSAhPSBJQ01QX1VOUkVBQ0hfTkVUKQorCQkJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURSA8PCA4OgorI2VuZGlmCisJCQkJCXByaW50ZigiICFOIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX0hPU1Q6CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJCQkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRERSIDw8IDg6CisjZW5kaWYKKwkJCQkJcHJpbnRmKCIgIUgiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfUFJPVE9DT0w6CisJCQkJCXByaW50ZigiICFQIik7CisJCQkJCWdvdF90aGVyZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX05FRURGUkFHOgorCQkJCQlwcmludGYoIiAhRi0lZCIsIHBtdHUpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9TUkNGQUlMOgorI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCQkJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU4gPDwgODoKKyNlbmRpZgorCQkJCQlwcmludGYoIiAhUyIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9GSUxURVJfUFJPSElCOgorCQkJCWNhc2UgSUNNUF9VTlJFQUNIX05FVF9QUk9ISUI6ICAgLyogbWlzdXNlICovCisJCQkJCXByaW50ZigiICFBIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfUFJPSElCOgorCQkJCQlwcmludGYoIiAhQyIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9IT1NUX1BSRUNFREVOQ0U6CisJCQkJCXByaW50ZigiICFWIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGOgorCQkJCQlwcmludGYoIiAhQyIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9ORVRfVU5LTk9XTjoKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9IT1NUX1VOS05PV046CisJCQkJCXByaW50ZigiICFVIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX0lTT0xBVEVEOgorCQkJCQlwcmludGYoIiAhSSIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9UT1NORVQ6CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfVE9TSE9TVDoKKwkJCQkJcHJpbnRmKCIgIVQiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCIgITwlZD4iLCBpY21wX2NvZGUpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IC8qIHdoaWxlICh3YWl0IGFuZCByZWFkIGEgcGFja2V0KSAqLworCisJCQkvKiB0aGVyZSB3YXMgbm8gcGFja2V0IGF0IGFsbD8gKi8KKwkJCWlmIChyZWFkX2xlbiA9PSAwKQorCQkJCXByaW50ZigiICAqIik7CisJCX0gLyogZm9yIChucHJvYmVzKSAqLworCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCWlmIChnb3RfdGhlcmUKKwkJIHx8ICh1bnJlYWNoYWJsZSA+IDAgJiYgdW5yZWFjaGFibGUgPj0gbnByb2JlcyAtIDEpCisJCSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYWNlcm91dGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRyYWNlcm91dGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBjb21tb25fdHJhY2Vyb3V0ZV9tYWluKDAsIGFyZ3YpOworfQorCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CitpbnQgdHJhY2Vyb3V0ZTZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRyYWNlcm91dGU2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gY29tbW9uX3RyYWNlcm91dGVfbWFpbihPUFRfSVBWNiwgYXJndik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdHVuY3RsLmMgYi9uZXR3b3JraW5nL3R1bmN0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDg3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3R1bmN0bC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0dW4gZGV2aWNlcyBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBPcmlnaW5hbCBjb2RlOgorICogICAgICBKZWZmIERpa2UKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0dW5jdGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZiBkZXZpY2VdIChbLXQgbmFtZV0gfCAtZCBuYW1lKSIgSUZfRkVBVFVSRV9UVU5DVExfVUcoIiBbLXUgb3duZXJdIFstZyBncm91cF0gWy1iXSIpCisvL3VzYWdlOiNkZWZpbmUgdHVuY3RsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIG9yIGRlbGV0ZSB0dW4gaW50ZXJmYWNlc1xuIgorLy91c2FnZTogICAgICJcbgktZiBuYW1lCQl0dW4gZGV2aWNlICgvZGV2L25ldC90dW4pIgorLy91c2FnZTogICAgICJcbgktdCBuYW1lCQlDcmVhdGUgaWZhY2UgJ25hbWUnIgorLy91c2FnZTogICAgICJcbgktZCBuYW1lCQlEZWxldGUgaWZhY2UgJ25hbWUnIgorLy91c2FnZToJSUZfRkVBVFVSRV9UVU5DVExfVUcoCisvL3VzYWdlOiAgICAgIlxuCS11IG93bmVyCVNldCBpZmFjZSBvd25lciIKKy8vdXNhZ2U6ICAgICAiXG4JLWcgZ3JvdXAJU2V0IGlmYWNlIGdyb3VwIgorLy91c2FnZTogICAgICJcbgktYgkJQnJpZWYgb3V0cHV0IgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0dW5jdGxfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiMgdHVuY3RsXG4iCisvL3VzYWdlOiAgICAgICAiIyB0dW5jdGwgLWQgdHVuMFxuIgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bi5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRVTlNFVEdST1VQIGFwcGVhcmVkIGluIDIuNi4yMyAqLworI2lmbmRlZiBUVU5TRVRHUk9VUAorI2RlZmluZSBUVU5TRVRHUk9VUCBfSU9XKCdUJywgMjA2LCBpbnQpCisjZW5kaWYKKworI2RlZmluZSBJT0NUTChhLCBiLCBjKSBpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShhLCBiLCBjLCBOVUxMKQorCisjaWYgMQorCitpbnQgdHVuY3RsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dW5jdGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWNvbnN0IGNoYXIgKm9wdF9uYW1lID0gInRhcCVkIjsKKwljb25zdCBjaGFyICpvcHRfZGV2aWNlID0gIi9kZXYvbmV0L3R1biI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVFVOQ1RMX1VHCisJY29uc3QgY2hhciAqb3B0X3VzZXIsICpvcHRfZ3JvdXA7CisJbG9uZyB1c2VyID0gLTEsIGdyb3VwID0gLTE7CisjZW5kaWYKKwl1bnNpZ25lZCBvcHRzOworCisJZW51bSB7CisJCU9QVF9mID0gMSA8PCAwLCAvLyBjb250cm9sIGRldmljZSBuYW1lICgvZGV2L25ldC90dW4pCisJCU9QVF90ID0gMSA8PCAxLCAvLyBjcmVhdGUgbmFtZWQgaW50ZXJmYWNlCisJCU9QVF9kID0gMSA8PCAyLCAvLyBkZWxldGUgbmFtZWQgaW50ZXJmYWNlCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFVOQ1RMX1VHCisJCU9QVF91ID0gMSA8PCAzLCAvLyBzZXQgbmV3IGludGVyZmFjZSBvd25lcgorCQlPUFRfZyA9IDEgPDwgNCwgLy8gc2V0IG5ldyBpbnRlcmZhY2UgZ3JvdXAKKwkJT1BUX2IgPSAxIDw8IDUsIC8vIGJyaWVmIG91dHB1dAorI2VuZGlmCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0wOnQtLWQ6ZC0tdCI7IC8vIG5vIGFyZ3VtZW50czsgdCBeIGQKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImY6dDpkOiIgSUZfRkVBVFVSRV9UVU5DVExfVUcoInU6ZzpiIiksCisJCQkmb3B0X2RldmljZSwgJm9wdF9uYW1lLCAmb3B0X25hbWUKKwkJCUlGX0ZFQVRVUkVfVFVOQ1RMX1VHKCwgJm9wdF91c2VyLCAmb3B0X2dyb3VwKSk7CisKKwkvLyBzZWxlY3QgZGV2aWNlCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlpZnIuaWZyX2ZsYWdzID0gSUZGX1RBUCB8IElGRl9OT19QSTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgb3B0X25hbWUpOworCisJLy8gb3BlbiBkZXZpY2UKKwlmZCA9IHhvcGVuKG9wdF9kZXZpY2UsIE9fUkRXUik7CisJSU9DVEwoZmQsIFRVTlNFVElGRiwgKHZvaWQgKikmaWZyKTsKKworCS8vIGRlbGV0ZT8KKwlpZiAob3B0cyAmIE9QVF9kKSB7CisJCUlPQ1RMKGZkLCBUVU5TRVRQRVJTSVNULCAodm9pZCAqKSh1aW50cHRyX3QpMCk7CisJCWJiX2luZm9fbXNnKCJTZXQgJyVzJyAlc3BlcnNpc3RlbnQiLCBpZnIuaWZyX25hbWUsICJub24iKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvLyBjcmVhdGUKKyNpZiBFTkFCTEVfRkVBVFVSRV9UVU5DVExfVUcKKwlpZiAob3B0cyAmIE9QVF9nKSB7CisJCWdyb3VwID0geGdyb3VwMmdpZChvcHRfZ3JvdXApOworCQlJT0NUTChmZCwgVFVOU0VUR1JPVVAsICh2b2lkICopKHVpbnRwdHJfdClncm91cCk7CisJfSBlbHNlCisJCXVzZXIgPSBnZXRldWlkKCk7CisJaWYgKG9wdHMgJiBPUFRfdSkKKwkJdXNlciA9IHh1bmFtZTJ1aWQob3B0X3VzZXIpOworCUlPQ1RMKGZkLCBUVU5TRVRPV05FUiwgKHZvaWQgKikodWludHB0cl90KXVzZXIpOworI2VuZGlmCisJSU9DVEwoZmQsIFRVTlNFVFBFUlNJU1QsICh2b2lkICopKHVpbnRwdHJfdCkxKTsKKworCS8vIHNob3cgaW5mbworI2lmIEVOQUJMRV9GRUFUVVJFX1RVTkNUTF9VRworCWlmIChvcHRzICYgT1BUX2IpIHsKKwkJcHV0cyhpZnIuaWZyX25hbWUpOworCX0gZWxzZSB7CisJCXByaW50ZigiU2V0ICclcycgJXNwZXJzaXN0ZW50IiwgaWZyLmlmcl9uYW1lLCAiIik7CisJCXByaW50ZigiIGFuZCBvd25lZCBieSB1aWQgJWxkIiwgdXNlcik7CisJCWlmIChncm91cCAhPSAtMSkKKwkJCXByaW50ZigiIGdpZCAlbGQiLCBncm91cCk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorI2Vsc2UKKwlwdXRzKGlmci5pZnJfbmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisjZWxzZQorCisvKiAtMjEwIGJ5dGVzOiAqLworCitpbnQgdHVuY3RsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dW5jdGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWNvbnN0IGNoYXIgKm9wdF9uYW1lID0gInRhcCVkIjsKKwljb25zdCBjaGFyICpvcHRfZGV2aWNlID0gIi9kZXYvbmV0L3R1biI7CisJdW5zaWduZWQgb3B0czsKKworCWVudW0geworCQlPUFRfZiA9IDEgPDwgMCwgLy8gY29udHJvbCBkZXZpY2UgbmFtZSAoL2Rldi9uZXQvdHVuKQorCQlPUFRfdCA9IDEgPDwgMSwgLy8gY3JlYXRlIG5hbWVkIGludGVyZmFjZQorCQlPUFRfZCA9IDEgPDwgMiwgLy8gZGVsZXRlIG5hbWVkIGludGVyZmFjZQorCX07CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MDp0LS1kOmQtLXQiOyAvLyBubyBhcmd1bWVudHM7IHQgXiBkCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmOnQ6ZDp1Omc6YiIsIC8vIHUsIGcsIGIgYWNjZXB0ZWQgYW5kIGlnbm9yZWQKKwkJCSZvcHRfZGV2aWNlLCAmb3B0X25hbWUsICZvcHRfbmFtZSwgTlVMTCwgTlVMTCk7CisKKwkvLyBzZXQgaW50ZXJmYWNlIG5hbWUKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCWlmci5pZnJfZmxhZ3MgPSBJRkZfVEFQIHwgSUZGX05PX1BJOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBvcHRfbmFtZSk7CisKKwkvLyBvcGVuIGRldmljZQorCWZkID0geG9wZW4ob3B0X2RldmljZSwgT19SRFdSKTsKKwlJT0NUTChmZCwgVFVOU0VUSUZGLCAodm9pZCAqKSZpZnIpOworCisJLy8gY3JlYXRlIG9yIGRlbGV0ZSBpbnRlcmZhY2UKKwlJT0NUTChmZCwgVFVOU0VUUEVSU0lTVCwgKHZvaWQgKikodWludHB0cl90KSgwID09IChvcHRzICYgT1BUX2QpKSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvQ29uZmlnLmluIGIvbmV0d29ya2luZy91ZGhjcC9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmZjRlOAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvQ29uZmlnLmluCkBAIC0wLDAgKzEsMTU1IEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworCisKK2NvbmZpZyBVREhDUEQKKwlib29sICJ1ZGhjcCBzZXJ2ZXIgKHVkaGNwZCkiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgdWRoY3BkIGlzIGEgREhDUCBzZXJ2ZXIgZ2VhcmVkIHByaW1hcmlseSB0b3dhcmQgZW1iZWRkZWQgc3lzdGVtcywKKwkgIHdoaWxlIHN0cml2aW5nIHRvIGJlIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIFJGQyBjb21wbGlhbnQuCisKK2NvbmZpZyBESENQUkVMQVkKKwlib29sICJkaGNwcmVsYXkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICBkaGNwcmVsYXkgbGlzdGVucyBmb3IgZGhjcCByZXF1ZXN0cyBvbiBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzCisJICBhbmQgZm9yd2FyZHMgdGhlc2UgcmVxdWVzdHMgdG8gYSBkaWZmZXJlbnQgaW50ZXJmYWNlIG9yIGRoY3AKKwkgIHNlcnZlci4KKworY29uZmlnIERVTVBMRUFTRVMKKwlib29sICJMZWFzZSBkaXNwbGF5IHV0aWxpdHkgKGR1bXBsZWFzZXMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgZHVtcGxlYXNlcyBkaXNwbGF5cyB0aGUgbGVhc2VzIHdyaXR0ZW4gb3V0IGJ5IHRoZSB1ZGhjcGQgc2VydmVyLgorCSAgTGVhc2UgdGltZXMgYXJlIHN0b3JlZCBpbiB0aGUgZmlsZSBieSB0aW1lIHJlbWFpbmluZyBpbiBsZWFzZSwgb3IKKwkgIGJ5IHRoZSBhYnNvbHV0ZSB0aW1lIHRoYXQgaXQgZXhwaXJlcyBpbiBzZWNvbmRzIGZyb20gZXBvY2guCisKK2NvbmZpZyBGRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkKKwlib29sICJSZXdyaXRlIHRoZSBsZWFzZSBmaWxlIGF0IGV2ZXJ5IG5ldyBhY2tub3dsZWRnZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQRAorCWhlbHAKKwkgIElmIHNlbGVjdGVkLCB1ZGhjcGQgd2lsbCB3cml0ZSBhIG5ldyBmaWxlIHdpdGggbGVhc2VzIGV2ZXJ5CisJICB0aW1lIGEgbmV3IGxlYXNlIGhhcyBiZWVuIGFjY2VwdGVkLCB0aHVzIGVsaW1pbmF0aW5nIHRoZSBuZWVkCisJICB0byBzZW5kIFNJR1VTUjEgZm9yIHRoZSBpbml0aWFsIHdyaXRpbmcgb3IgdXBkYXRpbmcuIEFueSB0aW1lZAorCSAgcmV3cml0aW5nIHJlbWFpbnMgdW5kaXN0dXJiZWQuCisKK2NvbmZpZyBGRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQworCWJvb2wgIlNlbGVjdCBJUCBhZGRyZXNzIGJhc2VkIG9uIGNsaWVudCBNQUMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgdWRoY3BkIHdpbGwgYmFzZSBpdHMgc2VsZWN0aW9uIG9mIElQIGFkZHJlc3MgdG8gb2ZmZXIKKwkgIG9uIHRoZSBjbGllbnQncyBoYXJkd2FyZSBhZGRyZXNzLiBPdGhlcndpc2UgdWRoY3BkIHVzZXMgdGhlIG5leHQKKwkgIGNvbnNlY3V0aXZlIGZyZWUgYWRkcmVzcy4KKworCSAgVGhpcyByZWR1Y2VzIHRoZSBmcmVxdWVuY3kgb2YgSVAgYWRkcmVzcyBjaGFuZ2VzIGZvciBjbGllbnRzCisJICB3aGljaCBsZXQgdGhlaXIgbGVhc2UgZXhwaXJlLCBhbmQgbWFrZXMgY29uc2VjdXRpdmUgREhDUE9GRkVSUworCSAgZm9yIHRoZSBzYW1lIGNsaWVudCB0byAoYWxtb3N0IGFsd2F5cykgY29udGFpbiB0aGUgc2FtZQorCSAgSVAgYWRkcmVzcy4KKworY29uZmlnIERIQ1BEX0xFQVNFU19GSUxFCisJc3RyaW5nICJBYnNvbHV0ZSBwYXRoIHRvIGxlYXNlIGZpbGUiCisJZGVmYXVsdCAiL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzIgorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgdWRoY3BkIHN0b3JlcyBhZGRyZXNzZXMgaW4gYSBsZWFzZSBmaWxlLiBUaGlzIGlzIHRoZSBhYnNvbHV0ZSBwYXRoCisJICBvZiB0aGUgZmlsZS4gTm9ybWFsbHkgaXQgaXMgc2FmZSB0byBsZWF2ZSBpdCB1bnRvdWNoZWQuCisKK2NvbmZpZyBVREhDUEMKKwlib29sICJ1ZGhjcCBjbGllbnQgKHVkaGNwYykiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgdWRoY3BjIGlzIGEgREhDUCBjbGllbnQgZ2VhcmVkIHByaW1hcmlseSB0b3dhcmQgZW1iZWRkZWQgc3lzdGVtcywKKwkgIHdoaWxlIHN0cml2aW5nIHRvIGJlIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIFJGQyBjb21wbGlhbnQuCisKKwkgIFRoZSB1ZGhjcCBjbGllbnQgbmVnb3RpYXRlcyBhIGxlYXNlIHdpdGggdGhlIERIQ1Agc2VydmVyIGFuZAorCSAgcnVucyBhIHNjcmlwdCB3aGVuIGEgbGVhc2UgaXMgb2J0YWluZWQgb3IgbG9zdC4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BDX0FSUElORworCWJvb2wgIlZlcmlmeSB0aGF0IHRoZSBvZmZlcmVkIGFkZHJlc3MgaXMgZnJlZSwgdXNpbmcgQVJQIHBpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEMKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgdWRoY3BjIHdpbGwgc2VuZCBBUlAgcHJvYmVzIGFuZCBtYWtlIHN1cmUKKwkgIHRoZSBvZmZlcmVkIGFkZHJlc3MgaXMgcmVhbGx5IG5vdCBpbiB1c2UgYnkgYW55b25lLiBUaGUgY2xpZW50CisJICB3aWxsIERIQ1BERUNMSU5FIHRoZSBvZmZlciBpZiB0aGUgYWRkcmVzcyBpcyBpbiB1c2UsCisJICBhbmQgcmVzdGFydCB0aGUgZGlzY292ZXIgcHJvY2Vzcy4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BfUE9SVAorCWJvb2wgIkVuYWJsZSAnLVAgcG9ydCcgb3B0aW9uIGZvciB1ZGhjcGQgYW5kIHVkaGNwYyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVESENQRCB8fCBVREhDUEMKKwloZWxwCisJICBBdCB0aGUgY29zdCBvZiB+MzAwIGJ5dGVzLCBlbmFibGVzIC1QIHBvcnQgb3B0aW9uLgorCSAgVGhpcyBmZWF0dXJlIGlzIHR5cGljYWxseSBub3QgbmVlZGVkLgorCitjb25maWcgVURIQ1BfREVCVUcKKwlpbnQgIk1heGltdW0gdmVyYm9zaXR5IGxldmVsIGZvciB1ZGhjcCBhcHBsZXRzICgwLi45KSIKKwlkZWZhdWx0IDkKKwlyYW5nZSAwIDkKKwlkZXBlbmRzIG9uIFVESENQRCB8fCBVREhDUEMgfHwgREhDUFJFTEFZCisJaGVscAorCSAgVmVyYm9zaXR5IGNhbiBiZSBpbmNyZWFzZWQgd2l0aCBtdWx0aXBsZSAtdiBvcHRpb25zLgorCSAgVGhpcyBvcHRpb24gY29udHJvbHMgaG93IGhpZ2ggaXQgY2FuIGJlIGNyYW5rZWQgdXAuCisKKwkgIEJpZ2dlciB2YWx1ZXMgcmVzdWx0IGluIGJpZ2dlciBjb2RlLiBMZXZlbHMgYWJvdmUgMQorCSAgYXJlIHZlcnkgdmVyYm9zZSBhbmQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb25seS4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BfUkZDMzM5NworCWJvb2wgIlN1cHBvcnQgZm9yIFJGQzMzOTcgZG9tYWluIHNlYXJjaCAoZXhwZXJpbWVudGFsKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQRCB8fCBVREhDUEMKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgYm90aCBjbGllbnQgYW5kIHNlcnZlciB3aWxsIHN1cHBvcnQgcGFzc2luZyBvZiBkb21haW4KKwkgIHNlYXJjaCBsaXN0cyB2aWEgb3B0aW9uIDExOSwgc3BlY2lmaWVkIGluIFJGQyAzMzk3LAorCSAgYW5kIFNJUCBzZXJ2ZXJzIG9wdGlvbiAxMjAsIHNwZWNpZmllZCBpbiBSRkMgMzM2MS4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BfODAyMVEKKwlib29sICJTdXBwb3J0IGZvciA4MDIuMVEgVkxBTiBwYXJhbWV0ZXJzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQworCWhlbHAKKwkgIElmIHNlbGVjdGVkLCBib3RoIGNsaWVudCBhbmQgc2VydmVyIHdpbGwgc3VwcG9ydCBwYXNzaW5nIG9mIFZMQU4KKwkgIElEIGFuZCBwcmlvcml0eSB2aWEgb3B0aW9ucyAxMzIgYW5kIDEzMyBhcyBwZXIgODAyLjFRLgorCitjb25maWcgVURIQ1BDX0RFRkFVTFRfU0NSSVBUCisJc3RyaW5nICJBYnNvbHV0ZSBwYXRoIHRvIGNvbmZpZyBzY3JpcHQiCisJZGVmYXVsdCAiL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCisJZGVwZW5kcyBvbiBVREhDUEMKKwloZWxwCisJICBUaGlzIHNjcmlwdCBpcyBjYWxsZWQgYWZ0ZXIgdWRoY3BjIHJlY2VpdmVzIGFuIGFuc3dlci4gU2VlCisJICBleGFtcGxlcy91ZGhjcCBmb3IgYSB3b3JraW5nIGV4YW1wbGUuIE5vcm1hbGx5IGl0IGlzIHNhZmUKKwkgIHRvIGxlYXZlIHRoaXMgdW50b3VjaGVkLgorCitjb25maWcgVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTCisJaW50ICJESENQIG9wdGlvbnMgc2xhY2sgYnVmZmVyIHNpemUiCisJZGVmYXVsdCA4MAorCXJhbmdlIDAgOTI0CisJZGVwZW5kcyBvbiBVREhDUEQgfHwgVURIQ1BDCisJaGVscAorCSAgU29tZSBidWdneSBESENQIHNlcnZlcnMgc2VuZCBESENQIG9mZmVyIHBhY2tldHMgd2l0aCBvcHRpb24KKwkgIGZpZWxkIGxhcmdlciB0aGFuIHdlIGV4cGVjdCAod2hpY2ggbWlnaHQgYWxzbyBiZSBjb25zaWRlcmVkIGEKKwkgIGJ1ZmZlciBvdmVyZmxvdyBhdHRlbXB0KS4gVGhlc2UgcGFja2V0cyBhcmUgbm9ybWFsbHkgZGlzY2FyZGVkLgorCSAgSWYgY2lyY3Vtc3RhbmNlcyBiZXlvbmQgeW91ciBjb250cm9sIGZvcmNlIHlvdSB0byBzdXBwb3J0IHN1Y2gKKwkgIHNlcnZlcnMsIHRoaXMgbWF5IGhlbHAuIFRoZSB1cHBlciBsaW1pdCAoOTI0KSBtYWtlcyBkaGNwYyBhY2NlcHQKKwkgIGV2ZW4gMTUwMCBieXRlIHBhY2tldHMgKG1heGltdW0tc2l6ZWQgZXRoZXJuZXQgcGFja2V0cykuCisKKwkgIFRoaXMgb3B0aW9uIGRvZXMgbm90IG1ha2UgZGhjcFtjZF0gZW1pdCBub24tc3RhbmRhcmQKKwkgIHNpemVkIHBhY2tldHMuCisKKwkgIEtub3duIGJ1Z2d5IERIQ1Agc2VydmVyczoKKwkgIDNDb20gT2ZmaWNlQ29ubmVjdCBSZW1vdGUgODEyIEFEU0wgUm91dGVyOgorCSAgICBzZWVtcyB0byBjb25mdXNlIG1heGltdW0gYWxsb3dlZCBVRFAgcGFja2V0IHNpemUgd2l0aAorCSAgICBtYXhpbXVtIHNpemUgb2YgZW50aXJlIElQIHBhY2tldCwgYW5kIHNlbmRzIHBhY2tldHMgd2hpY2ggYXJlCisJICAgIDI4IGJ5dGVzIHRvbyBsYXJnZS4KKwkgIFNlZWRuZXQgKElTUCkgVkRTTDogc2VuZHMgcGFja2V0cyAyIGJ5dGVzIHRvbyBsYXJnZS4KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvQ29uZmlnLnNyYyBiL25ldHdvcmtpbmcvdWRoY3AvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmZhMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTU0IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCitJTlNFUlQKKworY29uZmlnIFVESENQRAorCWJvb2wgInVkaGNwIHNlcnZlciAodWRoY3BkKSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICB1ZGhjcGQgaXMgYSBESENQIHNlcnZlciBnZWFyZWQgcHJpbWFyaWx5IHRvd2FyZCBlbWJlZGRlZCBzeXN0ZW1zLAorCSAgd2hpbGUgc3RyaXZpbmcgdG8gYmUgZnVsbHkgZnVuY3Rpb25hbCBhbmQgUkZDIGNvbXBsaWFudC4KKworY29uZmlnIERIQ1BSRUxBWQorCWJvb2wgImRoY3ByZWxheSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQRAorCWhlbHAKKwkgIGRoY3ByZWxheSBsaXN0ZW5zIGZvciBkaGNwIHJlcXVlc3RzIG9uIG9uZSBvciBtb3JlIGludGVyZmFjZXMKKwkgIGFuZCBmb3J3YXJkcyB0aGVzZSByZXF1ZXN0cyB0byBhIGRpZmZlcmVudCBpbnRlcmZhY2Ugb3IgZGhjcAorCSAgc2VydmVyLgorCitjb25maWcgRFVNUExFQVNFUworCWJvb2wgIkxlYXNlIGRpc3BsYXkgdXRpbGl0eSAoZHVtcGxlYXNlcykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICBkdW1wbGVhc2VzIGRpc3BsYXlzIHRoZSBsZWFzZXMgd3JpdHRlbiBvdXQgYnkgdGhlIHVkaGNwZCBzZXJ2ZXIuCisJICBMZWFzZSB0aW1lcyBhcmUgc3RvcmVkIGluIHRoZSBmaWxlIGJ5IHRpbWUgcmVtYWluaW5nIGluIGxlYXNlLCBvcgorCSAgYnkgdGhlIGFic29sdXRlIHRpbWUgdGhhdCBpdCBleHBpcmVzIGluIHNlY29uZHMgZnJvbSBlcG9jaC4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWQorCWJvb2wgIlJld3JpdGUgdGhlIGxlYXNlIGZpbGUgYXQgZXZlcnkgbmV3IGFja25vd2xlZGdlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgSWYgc2VsZWN0ZWQsIHVkaGNwZCB3aWxsIHdyaXRlIGEgbmV3IGZpbGUgd2l0aCBsZWFzZXMgZXZlcnkKKwkgIHRpbWUgYSBuZXcgbGVhc2UgaGFzIGJlZW4gYWNjZXB0ZWQsIHRodXMgZWxpbWluYXRpbmcgdGhlIG5lZWQKKwkgIHRvIHNlbmQgU0lHVVNSMSBmb3IgdGhlIGluaXRpYWwgd3JpdGluZyBvciB1cGRhdGluZy4gQW55IHRpbWVkCisJICByZXdyaXRpbmcgcmVtYWlucyB1bmRpc3R1cmJlZC4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDCisJYm9vbCAiU2VsZWN0IElQIGFkZHJlc3MgYmFzZWQgb24gY2xpZW50IE1BQyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVESENQRAorCWhlbHAKKwkgIElmIHNlbGVjdGVkLCB1ZGhjcGQgd2lsbCBiYXNlIGl0cyBzZWxlY3Rpb24gb2YgSVAgYWRkcmVzcyB0byBvZmZlcgorCSAgb24gdGhlIGNsaWVudCdzIGhhcmR3YXJlIGFkZHJlc3MuIE90aGVyd2lzZSB1ZGhjcGQgdXNlcyB0aGUgbmV4dAorCSAgY29uc2VjdXRpdmUgZnJlZSBhZGRyZXNzLgorCisJICBUaGlzIHJlZHVjZXMgdGhlIGZyZXF1ZW5jeSBvZiBJUCBhZGRyZXNzIGNoYW5nZXMgZm9yIGNsaWVudHMKKwkgIHdoaWNoIGxldCB0aGVpciBsZWFzZSBleHBpcmUsIGFuZCBtYWtlcyBjb25zZWN1dGl2ZSBESENQT0ZGRVJTCisJICBmb3IgdGhlIHNhbWUgY2xpZW50IHRvIChhbG1vc3QgYWx3YXlzKSBjb250YWluIHRoZSBzYW1lCisJICBJUCBhZGRyZXNzLgorCitjb25maWcgREhDUERfTEVBU0VTX0ZJTEUKKwlzdHJpbmcgIkFic29sdXRlIHBhdGggdG8gbGVhc2UgZmlsZSIKKwlkZWZhdWx0ICIvdmFyL2xpYi9taXNjL3VkaGNwZC5sZWFzZXMiCisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICB1ZGhjcGQgc3RvcmVzIGFkZHJlc3NlcyBpbiBhIGxlYXNlIGZpbGUuIFRoaXMgaXMgdGhlIGFic29sdXRlIHBhdGgKKwkgIG9mIHRoZSBmaWxlLiBOb3JtYWxseSBpdCBpcyBzYWZlIHRvIGxlYXZlIGl0IHVudG91Y2hlZC4KKworY29uZmlnIFVESENQQworCWJvb2wgInVkaGNwIGNsaWVudCAodWRoY3BjKSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICB1ZGhjcGMgaXMgYSBESENQIGNsaWVudCBnZWFyZWQgcHJpbWFyaWx5IHRvd2FyZCBlbWJlZGRlZCBzeXN0ZW1zLAorCSAgd2hpbGUgc3RyaXZpbmcgdG8gYmUgZnVsbHkgZnVuY3Rpb25hbCBhbmQgUkZDIGNvbXBsaWFudC4KKworCSAgVGhlIHVkaGNwIGNsaWVudCBuZWdvdGlhdGVzIGEgbGVhc2Ugd2l0aCB0aGUgREhDUCBzZXJ2ZXIgYW5kCisJICBydW5zIGEgc2NyaXB0IHdoZW4gYSBsZWFzZSBpcyBvYnRhaW5lZCBvciBsb3N0LgorCitjb25maWcgRkVBVFVSRV9VREhDUENfQVJQSU5HCisJYm9vbCAiVmVyaWZ5IHRoYXQgdGhlIG9mZmVyZWQgYWRkcmVzcyBpcyBmcmVlLCB1c2luZyBBUlAgcGluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQQworCWhlbHAKKwkgIElmIHNlbGVjdGVkLCB1ZGhjcGMgd2lsbCBzZW5kIEFSUCBwcm9iZXMgYW5kIG1ha2Ugc3VyZQorCSAgdGhlIG9mZmVyZWQgYWRkcmVzcyBpcyByZWFsbHkgbm90IGluIHVzZSBieSBhbnlvbmUuIFRoZSBjbGllbnQKKwkgIHdpbGwgREhDUERFQ0xJTkUgdGhlIG9mZmVyIGlmIHRoZSBhZGRyZXNzIGlzIGluIHVzZSwKKwkgIGFuZCByZXN0YXJ0IHRoZSBkaXNjb3ZlciBwcm9jZXNzLgorCitjb25maWcgRkVBVFVSRV9VREhDUF9QT1JUCisJYm9vbCAiRW5hYmxlICctUCBwb3J0JyBvcHRpb24gZm9yIHVkaGNwZCBhbmQgdWRoY3BjIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQworCWhlbHAKKwkgIEF0IHRoZSBjb3N0IG9mIH4zMDAgYnl0ZXMsIGVuYWJsZXMgLVAgcG9ydCBvcHRpb24uCisJICBUaGlzIGZlYXR1cmUgaXMgdHlwaWNhbGx5IG5vdCBuZWVkZWQuCisKK2NvbmZpZyBVREhDUF9ERUJVRworCWludCAiTWF4aW11bSB2ZXJib3NpdHkgbGV2ZWwgZm9yIHVkaGNwIGFwcGxldHMgKDAuLjkpIgorCWRlZmF1bHQgOQorCXJhbmdlIDAgOQorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQyB8fCBESENQUkVMQVkKKwloZWxwCisJICBWZXJib3NpdHkgY2FuIGJlIGluY3JlYXNlZCB3aXRoIG11bHRpcGxlIC12IG9wdGlvbnMuCisJICBUaGlzIG9wdGlvbiBjb250cm9scyBob3cgaGlnaCBpdCBjYW4gYmUgY3JhbmtlZCB1cC4KKworCSAgQmlnZ2VyIHZhbHVlcyByZXN1bHQgaW4gYmlnZ2VyIGNvZGUuIExldmVscyBhYm92ZSAxCisJICBhcmUgdmVyeSB2ZXJib3NlIGFuZCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvbmx5LgorCitjb25maWcgRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJYm9vbCAiU3VwcG9ydCBmb3IgUkZDMzM5NyBkb21haW4gc2VhcmNoIChleHBlcmltZW50YWwpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQworCWhlbHAKKwkgIElmIHNlbGVjdGVkLCBib3RoIGNsaWVudCBhbmQgc2VydmVyIHdpbGwgc3VwcG9ydCBwYXNzaW5nIG9mIGRvbWFpbgorCSAgc2VhcmNoIGxpc3RzIHZpYSBvcHRpb24gMTE5LCBzcGVjaWZpZWQgaW4gUkZDIDMzOTcsCisJICBhbmQgU0lQIHNlcnZlcnMgb3B0aW9uIDEyMCwgc3BlY2lmaWVkIGluIFJGQyAzMzYxLgorCitjb25maWcgRkVBVFVSRV9VREhDUF84MDIxUQorCWJvb2wgIlN1cHBvcnQgZm9yIDgwMi4xUSBWTEFOIHBhcmFtZXRlcnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQgfHwgVURIQ1BDCisJaGVscAorCSAgSWYgc2VsZWN0ZWQsIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgd2lsbCBzdXBwb3J0IHBhc3Npbmcgb2YgVkxBTgorCSAgSUQgYW5kIHByaW9yaXR5IHZpYSBvcHRpb25zIDEzMiBhbmQgMTMzIGFzIHBlciA4MDIuMVEuCisKK2NvbmZpZyBVREhDUENfREVGQVVMVF9TQ1JJUFQKKwlzdHJpbmcgIkFic29sdXRlIHBhdGggdG8gY29uZmlnIHNjcmlwdCIKKwlkZWZhdWx0ICIvdXNyL3NoYXJlL3VkaGNwYy9kZWZhdWx0LnNjcmlwdCIKKwlkZXBlbmRzIG9uIFVESENQQworCWhlbHAKKwkgIFRoaXMgc2NyaXB0IGlzIGNhbGxlZCBhZnRlciB1ZGhjcGMgcmVjZWl2ZXMgYW4gYW5zd2VyLiBTZWUKKwkgIGV4YW1wbGVzL3VkaGNwIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gTm9ybWFsbHkgaXQgaXMgc2FmZQorCSAgdG8gbGVhdmUgdGhpcyB1bnRvdWNoZWQuCisKK2NvbmZpZyBVREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMKKwlpbnQgIkRIQ1Agb3B0aW9ucyBzbGFjayBidWZmZXIgc2l6ZSIKKwlkZWZhdWx0IDgwCisJcmFuZ2UgMCA5MjQKKwlkZXBlbmRzIG9uIFVESENQRCB8fCBVREhDUEMKKwloZWxwCisJICBTb21lIGJ1Z2d5IERIQ1Agc2VydmVycyBzZW5kIERIQ1Agb2ZmZXIgcGFja2V0cyB3aXRoIG9wdGlvbgorCSAgZmllbGQgbGFyZ2VyIHRoYW4gd2UgZXhwZWN0ICh3aGljaCBtaWdodCBhbHNvIGJlIGNvbnNpZGVyZWQgYQorCSAgYnVmZmVyIG92ZXJmbG93IGF0dGVtcHQpLiBUaGVzZSBwYWNrZXRzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQuCisJICBJZiBjaXJjdW1zdGFuY2VzIGJleW9uZCB5b3VyIGNvbnRyb2wgZm9yY2UgeW91IHRvIHN1cHBvcnQgc3VjaAorCSAgc2VydmVycywgdGhpcyBtYXkgaGVscC4gVGhlIHVwcGVyIGxpbWl0ICg5MjQpIG1ha2VzIGRoY3BjIGFjY2VwdAorCSAgZXZlbiAxNTAwIGJ5dGUgcGFja2V0cyAobWF4aW11bS1zaXplZCBldGhlcm5ldCBwYWNrZXRzKS4KKworCSAgVGhpcyBvcHRpb24gZG9lcyBub3QgbWFrZSBkaGNwW2NkXSBlbWl0IG5vbi1zdGFuZGFyZAorCSAgc2l6ZWQgcGFja2V0cy4KKworCSAgS25vd24gYnVnZ3kgREhDUCBzZXJ2ZXJzOgorCSAgM0NvbSBPZmZpY2VDb25uZWN0IFJlbW90ZSA4MTIgQURTTCBSb3V0ZXI6CisJICAgIHNlZW1zIHRvIGNvbmZ1c2UgbWF4aW11bSBhbGxvd2VkIFVEUCBwYWNrZXQgc2l6ZSB3aXRoCisJICAgIG1heGltdW0gc2l6ZSBvZiBlbnRpcmUgSVAgcGFja2V0LCBhbmQgc2VuZHMgcGFja2V0cyB3aGljaCBhcmUKKwkgICAgMjggYnl0ZXMgdG9vIGxhcmdlLgorCSAgU2VlZG5ldCAoSVNQKSBWRFNMOiBzZW5kcyBwYWNrZXRzIDIgYnl0ZXMgdG9vIGxhcmdlLgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9LYnVpbGQuc3JjIGIvbmV0d29ya2luZy91ZGhjcC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzY3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisjCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19VREhDUEMpICAgICArPSBjb21tb24ubyBwYWNrZXQubyBzaWduYWxwaXBlLm8gc29ja2V0Lm8KK2xpYi0kKENPTkZJR19VREhDUEQpICAgICArPSBjb21tb24ubyBwYWNrZXQubyBzaWduYWxwaXBlLm8gc29ja2V0Lm8KKworbGliLSQoQ09ORklHX1VESENQQykgICAgICs9IGRoY3BjLm8KK2xpYi0kKENPTkZJR19VREhDUEQpICAgICArPSBkaGNwZC5vIGFycHBpbmcubyBmaWxlcy5vIGxlYXNlcy5vIHN0YXRpY19sZWFzZXMubworbGliLSQoQ09ORklHX0RVTVBMRUFTRVMpICs9IGR1bXBsZWFzZXMubworbGliLSQoQ09ORklHX0RIQ1BSRUxBWSkgICs9IGRoY3ByZWxheS5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcpICs9IGFycHBpbmcubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NykgKz0gZG9tYWluX2NvZGVjLm8KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvYXJwcGluZy5jIGIvbmV0d29ya2luZy91ZGhjcC9hcnBwaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2MzQ3OAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvYXJwcGluZy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNb3N0bHkgc3RvbGVuIGZyb206IGRoY3BjZCAtIERIQ1AgY2xpZW50IGRhZW1vbgorICogYnkgWW9pY2hpIEhhcmlndWNoaSA8eW9pY2hpQGZvcmUuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKworc3RydWN0IGFycE1zZyB7CisJLyogRXRoZXJuZXQgaGVhZGVyICovCisJdWludDhfdCAgaF9kZXN0WzZdOyAgICAgLyogMDAgZGVzdGluYXRpb24gZXRoZXIgYWRkciAqLworCXVpbnQ4X3QgIGhfc291cmNlWzZdOyAgIC8qIDA2IHNvdXJjZSBldGhlciBhZGRyICovCisJdWludDE2X3QgaF9wcm90bzsgICAgICAgLyogMGMgcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KKworCS8qIEFSUCBwYWNrZXQgKi8KKwl1aW50MTZfdCBodHlwZTsgICAgICAgICAvKiAwZSBoYXJkd2FyZSB0eXBlIChtdXN0IGJlIEFSUEhSRF9FVEhFUikgKi8KKwl1aW50MTZfdCBwdHlwZTsgICAgICAgICAvKiAxMCBwcm90b2NvbCB0eXBlIChtdXN0IGJlIEVUSF9QX0lQKSAqLworCXVpbnQ4X3QgIGhsZW47ICAgICAgICAgIC8qIDEyIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoIChtdXN0IGJlIDYpICovCisJdWludDhfdCAgcGxlbjsgICAgICAgICAgLyogMTMgcHJvdG9jb2wgYWRkcmVzcyBsZW5ndGggKG11c3QgYmUgNCkgKi8KKwl1aW50MTZfdCBvcGVyYXRpb247ICAgICAvKiAxNCBBUlAgb3Bjb2RlICovCisJdWludDhfdCAgc0hhZGRyWzZdOyAgICAgLyogMTYgc2VuZGVyJ3MgaGFyZHdhcmUgYWRkcmVzcyAqLworCXVpbnQ4X3QgIHNJbmFkZHJbNF07ICAgIC8qIDFjIHNlbmRlcidzIElQIGFkZHJlc3MgKi8KKwl1aW50OF90ICB0SGFkZHJbNl07ICAgICAvKiAyMCB0YXJnZXQncyBoYXJkd2FyZSBhZGRyZXNzICovCisJdWludDhfdCAgdEluYWRkcls0XTsgICAgLyogMjYgdGFyZ2V0J3MgSVAgYWRkcmVzcyAqLworCXVpbnQ4X3QgIHBhZFsxOF07ICAgICAgIC8qIDJhIHBhZCBmb3IgbWluLiBldGhlcm5ldCBwYXlsb2FkICg2MCBieXRlcykgKi8KK30gUEFDS0VEOworCitlbnVtIHsKKwlBUlBfTVNHX1NJWkUgPSAweDJhCit9OworCisvKiBSZXR1cm5zIDEgaWYgbm8gcmVwbHkgcmVjZWl2ZWQgKi8KK2ludCBGQVNUX0ZVTkMgYXJwcGluZyh1aW50MzJfdCB0ZXN0X25pcCwKKwkJY29uc3QgdWludDhfdCAqc2FmZV9tYWMsCisJCXVpbnQzMl90IGZyb21faXAsCisJCXVpbnQ4X3QgKmZyb21fbWFjLAorCQljb25zdCBjaGFyICppbnRlcmZhY2UpCit7CisJaW50IHRpbWVvdXRfbXM7CisJc3RydWN0IHBvbGxmZCBwZmRbMV07CisjZGVmaW5lIHMgKHBmZFswXS5mZCkgICAgICAgICAgIC8qIHNvY2tldCAqLworCWludCBydiA9IDE7ICAgICAgICAgICAgIC8qICJubyByZXBseSByZWNlaXZlZCIgeWV0ICovCisJc3RydWN0IHNvY2thZGRyIGFkZHI7ICAgLyogZm9yIGludGVyZmFjZSBuYW1lICovCisJc3RydWN0IGFycE1zZyBhcnA7CisKKwlzID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19QQUNLRVQsIGh0b25zKEVUSF9QX0FSUCkpOworCWlmIChzID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNldHNvY2tvcHRfYnJvYWRjYXN0KHMpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IGVuYWJsZSBiY2FzdCBvbiByYXcgc29ja2V0Iik7CisJCWdvdG8gcmV0OworCX0KKworCS8qIHNlbmQgYXJwIHJlcXVlc3QgKi8KKwltZW1zZXQoJmFycCwgMCwgc2l6ZW9mKGFycCkpOworCW1lbXNldChhcnAuaF9kZXN0LCAweGZmLCA2KTsgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBEQSAqLworCW1lbWNweShhcnAuaF9zb3VyY2UsIGZyb21fbWFjLCA2KTsgICAgICAgICAgICAgIC8qIE1BQyBTQSAqLworCWFycC5oX3Byb3RvID0gaHRvbnMoRVRIX1BfQVJQKTsgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIHR5cGUgKEV0aGVybmV0KSAqLworCWFycC5odHlwZSA9IGh0b25zKEFSUEhSRF9FVEhFUik7ICAgICAgICAgICAgICAgIC8qIGhhcmR3YXJlIHR5cGUgKi8KKwlhcnAucHR5cGUgPSBodG9ucyhFVEhfUF9JUCk7ICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCB0eXBlIChBUlAgbWVzc2FnZSkgKi8KKwlhcnAuaGxlbiA9IDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCWFycC5wbGVuID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIGFkZHJlc3MgbGVuZ3RoICovCisJYXJwLm9wZXJhdGlvbiA9IGh0b25zKEFSUE9QX1JFUVVFU1QpOyAgICAgICAgICAgLyogQVJQIG9wIGNvZGUgKi8KKwltZW1jcHkoYXJwLnNIYWRkciwgZnJvbV9tYWMsIDYpOyAgICAgICAgICAgICAgICAvKiBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcyAqLworCW1lbWNweShhcnAuc0luYWRkciwgJmZyb21faXAsIHNpemVvZihmcm9tX2lwKSk7IC8qIHNvdXJjZSBJUCBhZGRyZXNzICovCisJLyogdEhhZGRyIGlzIHplcm8tZmlsbGVkICovICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKwltZW1jcHkoYXJwLnRJbmFkZHIsICZ0ZXN0X25pcCwgc2l6ZW9mKHRlc3RfbmlwKSk7LyogdGFyZ2V0IElQIGFkZHJlc3MgKi8KKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlzYWZlX3N0cm5jcHkoYWRkci5zYV9kYXRhLCBpbnRlcmZhY2UsIHNpemVvZihhZGRyLnNhX2RhdGEpKTsKKwlpZiAoc2VuZHRvKHMsICZhcnAsIHNpemVvZihhcnApLCAwLCAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJLy8gVE9ETzogZXJyb3IgbWVzc2FnZT8gY2FsbGVyIGRpZG4ndCBleHBlY3QgdXMgdG8gZmFpbCwKKwkJLy8ganVzdCByZXR1cm5pbmcgMSAibm8gcmVwbHkgcmVjZWl2ZWQiIG1pc2xlYWRzIGl0LgorCQlnb3RvIHJldDsKKwl9CisKKwkvKiB3YWl0IGZvciBhcnAgcmVwbHksIGFuZCBjaGVjayBpdCAqLworCXRpbWVvdXRfbXMgPSAyMDAwOworCWRvIHsKKwkJdHlwZWRlZiB1aW50MzJfdCBhbGlhc2VkX3VpbnQzMl90IEZJWF9BTElBU0lORzsKKwkJaW50IHI7CisJCXVuc2lnbmVkIHByZXZUaW1lID0gbW9ub3RvbmljX21zKCk7CisKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJciA9IHNhZmVfcG9sbChwZmQsIDEsIHRpbWVvdXRfbXMpOworCQlpZiAociA8IDApCisJCQlicmVhazsKKwkJaWYgKHIpIHsKKwkJCXIgPSBzYWZlX3JlYWQocywgJmFycCwgc2l6ZW9mKGFycCkpOworCQkJaWYgKHIgPCAwKQorCQkJCWJyZWFrOworCisJCQkvL2xvZzMoInNIYWRkciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkvLwlhcnAuc0hhZGRyWzBdLCBhcnAuc0hhZGRyWzFdLCBhcnAuc0hhZGRyWzJdLAorCQkJLy8JYXJwLnNIYWRkclszXSwgYXJwLnNIYWRkcls0XSwgYXJwLnNIYWRkcls1XSk7CisKKwkJCWlmIChyID49IEFSUF9NU0dfU0laRQorCQkJICYmIGFycC5vcGVyYXRpb24gPT0gaHRvbnMoQVJQT1BfUkVQTFkpCisJCQkgLyogZG9uJ3QgY2hlY2sgaXQ6IExpbnV4IGRvZXNuJ3QgcmV0dXJuIHByb3BlciB0SGFkZHIgKGZpeGVkIGluIDIuNi4yND8pICovCisJCQkgLyogJiYgbWVtY21wKGFycC50SGFkZHIsIGZyb21fbWFjLCA2KSA9PSAwICovCisJCQkgJiYgKihhbGlhc2VkX3VpbnQzMl90KilhcnAuc0luYWRkciA9PSB0ZXN0X25pcAorCQkJKSB7CisJCQkJLyogaWYgQVJQIHNvdXJjZSBNQUMgbWF0Y2hlcyBzYWZlX21hYworCQkJCSAqICh3aGljaCBpcyBjbGllbnQncyBNQUMpLCB0aGVuIGl0J3Mgbm90IGEgY29uZmxpY3QKKwkJCQkgKiAoY2xpZW50IHNpbXBseSBhbHJlYWR5IGhhcyB0aGlzIElQIGFuZCByZXBsaWVzIHRvIEFSUHMhKQorCQkJCSAqLworCQkJCWlmICghc2FmZV9tYWMgfHwgbWVtY21wKHNhZmVfbWFjLCBhcnAuc0hhZGRyLCA2KSAhPSAwKQorCQkJCQlydiA9IDA7CisJCQkJLy9lbHNlIGxvZzIoInNIYWRkciA9PSBzYWZlX21hYyIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXRpbWVvdXRfbXMgLT0gKHVuc2lnbmVkKW1vbm90b25pY19tcygpIC0gcHJldlRpbWU7CisJfSB3aGlsZSAodGltZW91dF9tcyA+IDApOworCisgcmV0OgorCWNsb3NlKHMpOworCWxvZzEoIiVzcnAgcmVwbHkgcmVjZWl2ZWQgZm9yIHRoaXMgYWRkcmVzcyIsIHJ2ID8gIk5vIGEiIDogIkEiKTsKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5jIGIvbmV0d29ya2luZy91ZGhjcC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdlMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9jb21tb24uYwpAQCAtMCwwICsxLDUzOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUmV3cml0ZSBieSBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQordW5zaWduZWQgZGhjcF92ZXJib3NlOworI2VuZGlmCisKK2NvbnN0IHVpbnQ4X3QgTUFDX0JDQVNUX0FERFJbNl0gQUxJR04yID0geworCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKK307CisKKy8qIFN1cHBvcnRlZCBvcHRpb25zIGFyZSBlYXNpbHkgYWRkZWQgaGVyZS4KKyAqIFNlZSBSRkMyMTMyIGZvciBtb3JlIG9wdGlvbnMuCisgKiBPUFRJT05fUkVROiB0aGVzZSBvcHRpb25zIGFyZSByZXF1ZXN0ZWQgYnkgdWRoY3BjICh1bmxlc3MgLW8pLgorICovCitjb25zdCBzdHJ1Y3QgZGhjcF9vcHRmbGFnIGRoY3Bfb3B0ZmxhZ3NbXSA9IHsKKwkvKiBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgKi8KKwl7IE9QVElPTl9JUCAgICAgICAgICAgICAgICAgICB8IE9QVElPTl9SRVEsIDB4MDEgfSwgLyogREhDUF9TVUJORVQgICAgICAgICovCisJeyBPUFRJT05fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDAyIH0sIC8qIERIQ1BfVElNRV9PRkZTRVQgICAqLworCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgIHwgT1BUSU9OX1JFUSwgMHgwMyB9LCAvKiBESENQX1JPVVRFUiAgICAgICAgKi8KKy8vCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgwNCB9LCAvKiBESENQX1RJTUVfU0VSVkVSICAgKi8KKy8vCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgwNSB9LCAvKiBESENQX05BTUVfU0VSVkVSICAgKi8KKwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICB8IE9QVElPTl9SRVEsIDB4MDYgfSwgLyogREhDUF9ETlNfU0VSVkVSICAgICovCisvLwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICAgICAgICAgICAgICAsIDB4MDcgfSwgLyogREhDUF9MT0dfU0VSVkVSICAgICovCisvLwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICAgICAgICAgICAgICAsIDB4MDggfSwgLyogREhDUF9DT09LSUVfU0VSVkVSICovCisJeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgICAgICAgICAgICAgLCAweDA5IH0sIC8qIERIQ1BfTFBSX1NFUlZFUiAgICAqLworCXsgT1BUSU9OX1NUUklOR19IT1NUICAgICAgICAgIHwgT1BUSU9OX1JFUSwgMHgwYyB9LCAvKiBESENQX0hPU1RfTkFNRSAgICAgKi8KKwl7IE9QVElPTl9VMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MGQgfSwgLyogREhDUF9CT09UX1NJWkUgICAgICovCisJeyBPUFRJT05fU1RSSU5HX0hPU1QgICAgICAgICAgfCBPUFRJT05fUkVRLCAweDBmIH0sIC8qIERIQ1BfRE9NQUlOX05BTUUgICAqLworCXsgT1BUSU9OX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgxMCB9LCAvKiBESENQX1NXQVBfU0VSVkVSICAgKi8KKwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MTEgfSwgLyogREhDUF9ST09UX1BBVEggICAgICovCisJeyBPUFRJT05fVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDE3IH0sIC8qIERIQ1BfSVBfVFRMICAgICAgICAqLworCXsgT1BUSU9OX1UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgxYSB9LCAvKiBESENQX01UVSAgICAgICAgICAgKi8KKwl7IE9QVElPTl9JUCAgICAgICAgICAgICAgICAgICB8IE9QVElPTl9SRVEsIDB4MWMgfSwgLyogREhDUF9CUk9BRENBU1QgICAgICovCisJeyBPUFRJT05fSVBfUEFJUiB8IE9QVElPTl9MSVNUICAgICAgICAgICAgLCAweDIxIH0sIC8qIERIQ1BfUk9VVEVTICAgICAgICAqLworCXsgT1BUSU9OX1NUUklOR19IT1NUICAgICAgICAgICAgICAgICAgICAgICwgMHgyOCB9LCAvKiBESENQX05JU19ET01BSU4gICAgKi8KKwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICAgICAgICAgICAgICAsIDB4MjkgfSwgLyogREhDUF9OSVNfU0VSVkVSICAgICovCisJeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgfCBPUFRJT05fUkVRLCAweDJhIH0sIC8qIERIQ1BfTlRQX1NFUlZFUiAgICAqLworCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgyYyB9LCAvKiBESENQX1dJTlNfU0VSVkVSICAgKi8KKwl7IE9QVElPTl9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzMgfSwgLyogREhDUF9MRUFTRV9USU1FICAgICovCisJeyBPUFRJT05fSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDM2IH0sIC8qIERIQ1BfU0VSVkVSX0lEICAgICAqLworCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzOCB9LCAvKiBESENQX0VSUl9NRVNTQUdFICAgKi8KKy8vVE9ETzogbXVzdCBiZSBjb21iaW5lZCB3aXRoICdzbmFtZScgYW5kICdmaWxlJyBoYW5kbGluZzoKKwl7IE9QVElPTl9TVFJJTkdfSE9TVCAgICAgICAgICAgICAgICAgICAgICAsIDB4NDIgfSwgLyogREhDUF9URlRQX1NFUlZFUl9OQU1FICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDQzIH0sIC8qIERIQ1BfQk9PVF9GSUxFICAgICAqLworLy9UT0RPOiBub3QgYSBzdHJpbmcsIGJ1dCBhIHNldCBvZiBMQVNDSUkgc3RyaW5nczoKKy8vCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg0RCB9LCAvKiBESENQX1VTRVJfQ0xBU1MgICAgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJeyBPUFRJT05fRE5TX1NUUklORyB8IE9QVElPTl9MSVNUICAgICAgICAgLCAweDc3IH0sIC8qIERIQ1BfRE9NQUlOX1NFQVJDSCAqLworCXsgT1BUSU9OX1NJUF9TRVJWRVJTICAgICAgICAgICAgICAgICAgICAgICwgMHg3OCB9LCAvKiBESENQX1NJUF9TRVJWRVJTICAgKi8KKyNlbmRpZgorCXsgT1BUSU9OX1NUQVRJQ19ST1VURVMgICAgICAgICAgICAgICAgICAgICwgMHg3OSB9LCAvKiBESENQX1NUQVRJQ19ST1VURVMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF84MDIxUQorCXsgT1BUSU9OX1UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg4NCB9LCAvKiBESENQX1ZMQU5fSUQgICAgICAgKi8KKwl7IE9QVElPTl9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4ODUgfSwgLyogREhDUF9WTEFOX1BSSU9SSVRZICovCisjZW5kaWYKKwl7IE9QVElPTl9TVEFUSUNfUk9VVEVTICAgICAgICAgICAgICAgICAgICAsIDB4ZjkgfSwgLyogREhDUF9NU19TVEFUSUNfUk9VVEVTICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweGZjIH0sIC8qIERIQ1BfV1BBRCAgICAgICAgICAqLworCisJLyogT3B0aW9ucyBiZWxvdyBoYXZlIG5vIG1hdGNoIGluIGRoY3Bfb3B0aW9uX3N0cmluZ3NbXSwKKwkgKiBhcmUgbm90IHBhc3NlZCB0byBkaGNwYyBzY3JpcHRzLCBhbmQgY2Fubm90IGJlIHNwZWNpZmllZAorCSAqIHdpdGggIm9wdGlvbiBYWFggWVlZIiBzeW50YXggaW4gZGhjcGQgY29uZmlnIGZpbGUuCisJICogVGhlc2UgZW50cmllcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgYnkgdWRoY3BbY2RdCisJICogdG8gY29ycmVjdGx5IGVuY29kZSBvcHRpb25zIGludG8gcGFja2V0cy4KKwkgKi8KKworCXsgT1BUSU9OX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzMiB9LCAvKiBESENQX1JFUVVFU1RFRF9JUCAgKi8KKwl7IE9QVElPTl9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzUgfSwgLyogREhDUF9NRVNTQUdFX1RZUEUgICovCisJeyBPUFRJT05fVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDM5IH0sIC8qIERIQ1BfTUFYX1NJWkUgICAgICAqLworLy9sb29rcyBsaWtlIHRoZXNlIG9wdHMgd2lsbCB3b3JrIGp1c3QgZmluZSBldmVuIHdpdGhvdXQgdGhlc2UgZGVmczoKKy8vCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzYyB9LCAvKiBESENQX1ZFTkRPUiAgICAgICAgKi8KKy8vCS8qIG5vdCByZWFsbHkgYSBzdHJpbmc6ICovCisvLwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4M2QgfSwgLyogREhDUF9DTElFTlRfSUQgICAgICovCisJeyAwLCAwIH0gLyogemVyb2VkIHRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisvKiBVc2VkIGZvciBjb252ZXJ0aW5nIG9wdGlvbnMgZnJvbSBpbmNvbWluZyBwYWNrZXRzIHRvIGVudiB2YXJpYWJsZXMKKyAqIGZvciB1ZGhjcGMgc3RyaXB0LCBhbmQgZm9yIHNldHRpbmcgb3B0aW9ucyBmb3IgdWRoY3BkIHZpYQorICogIm9wdCBPUFRJT05fTkFNRSBPUFRJT05fVkFMVUUiIGRpcmVjdGl2ZXMgaW4gdWRoY3BkLmNvbmYgZmlsZS4KKyAqLworLyogTXVzdCBtYXRjaCBkaGNwX29wdGZsYWdzW10gb3JkZXIgKi8KK2NvbnN0IGNoYXIgZGhjcF9vcHRpb25fc3RyaW5nc1tdIEFMSUdOMSA9CisJInN1Ym5ldCIgIlwwIiAgICAgIC8qIERIQ1BfU1VCTkVUICAgICAgICAgKi8KKwkidGltZXpvbmUiICJcMCIgICAgLyogREhDUF9USU1FX09GRlNFVCAgICAqLworCSJyb3V0ZXIiICJcMCIgICAgICAvKiBESENQX1JPVVRFUiAgICAgICAgICovCisvLwkidGltZXNydiIgIlwwIiAgICAgLyogREhDUF9USU1FX1NFUlZFUiAgICAqLworLy8JIm5hbWVzcnYiICJcMCIgICAgIC8qIERIQ1BfTkFNRV9TRVJWRVIgICAgKi8KKwkiZG5zIiAiXDAiICAgICAgICAgLyogREhDUF9ETlNfU0VSVkVSICAgICAqLworLy8JImxvZ3NydiIgIlwwIiAgICAgIC8qIERIQ1BfTE9HX1NFUlZFUiAgICAgKi8KKy8vCSJjb29raWVzcnYiICJcMCIgICAvKiBESENQX0NPT0tJRV9TRVJWRVIgICovCisJImxwcnNydiIgIlwwIiAgICAgIC8qIERIQ1BfTFBSX1NFUlZFUiAgICAgKi8KKwkiaG9zdG5hbWUiICJcMCIgICAgLyogREhDUF9IT1NUX05BTUUgICAgICAqLworCSJib290c2l6ZSIgIlwwIiAgICAvKiBESENQX0JPT1RfU0laRSAgICAgICovCisJImRvbWFpbiIgIlwwIiAgICAgIC8qIERIQ1BfRE9NQUlOX05BTUUgICAgKi8KKwkic3dhcHNydiIgIlwwIiAgICAgLyogREhDUF9TV0FQX1NFUlZFUiAgICAqLworCSJyb290cGF0aCIgIlwwIiAgICAvKiBESENQX1JPT1RfUEFUSCAgICAgICovCisJImlwdHRsIiAiXDAiICAgICAgIC8qIERIQ1BfSVBfVFRMICAgICAgICAgKi8KKwkibXR1IiAiXDAiICAgICAgICAgLyogREhDUF9NVFUgICAgICAgICAgICAqLworCSJicm9hZGNhc3QiICJcMCIgICAvKiBESENQX0JST0FEQ0FTVCAgICAgICovCisJInJvdXRlcyIgIlwwIiAgICAgIC8qIERIQ1BfUk9VVEVTICAgICAgICAgKi8KKwkibmlzZG9tYWluIiAiXDAiICAgLyogREhDUF9OSVNfRE9NQUlOICAgICAqLworCSJuaXNzcnYiICJcMCIgICAgICAvKiBESENQX05JU19TRVJWRVIgICAgICovCisJIm50cHNydiIgIlwwIiAgICAgIC8qIERIQ1BfTlRQX1NFUlZFUiAgICAgKi8KKwkid2lucyIgIlwwIiAgICAgICAgLyogREhDUF9XSU5TX1NFUlZFUiAgICAqLworCSJsZWFzZSIgIlwwIiAgICAgICAvKiBESENQX0xFQVNFX1RJTUUgICAgICovCisJInNlcnZlcmlkIiAiXDAiICAgIC8qIERIQ1BfU0VSVkVSX0lEICAgICAgKi8KKwkibWVzc2FnZSIgIlwwIiAgICAgLyogREhDUF9FUlJfTUVTU0FHRSAgICAqLworCSJ0ZnRwIiAiXDAiICAgICAgICAvKiBESENQX1RGVFBfU0VSVkVSX05BTUUgKi8KKwkiYm9vdGZpbGUiICJcMCIgICAgLyogREhDUF9CT09UX0ZJTEUgICAgICAqLworLy8JInVzZXJjbGFzcyIgIlwwIiAgIC8qIERIQ1BfVVNFUl9DTEFTUyAgICAgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJInNlYXJjaCIgIlwwIiAgICAgIC8qIERIQ1BfRE9NQUlOX1NFQVJDSCAgKi8KKy8vIGRvZXNuJ3Qgd29yayBpbiB1ZGhjcGQuY29uZiBzaW5jZSBPUFRJT05fU0lQX1NFUlZFUlMKKy8vIGlzIG5vdCBoYW5kbGVkIHlldCBieSAic3RyaW5nLT5vcHRpb24iIGNvbnZlcnNpb24gY29kZToKKwkic2lwc3J2IiAiXDAiICAgICAgLyogREhDUF9TSVBfU0VSVkVSUyAgICAqLworI2VuZGlmCisvLyBkb2Vzbid0IHdvcmsgaW4gdWRoY3BkLmNvbmYgc2luY2UgT1BUSU9OX1NUQVRJQ19ST1VURVMKKy8vIGlzIG5vdCBoYW5kbGVkIHlldCBieSAic3RyaW5nLT5vcHRpb24iIGNvbnZlcnNpb24gY29kZToKKwkic3RhdGljcm91dGVzIiAiXDAiLyogREhDUF9TVEFUSUNfUk9VVEVTICAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQXzgwMjFRCisJInZsYW5pZCIgIlwwIiAgICAgIC8qIERIQ1BfVkxBTl9JRCAgICAgICAgKi8KKwkidmxhbnByaW9yaXR5IiAiXDAiLyogREhDUF9WTEFOX1BSSU9SSVRZICAqLworI2VuZGlmCisJIm1zc3RhdGljcm91dGVzIiJcMCIvKiBESENQX01TX1NUQVRJQ19ST1VURVMgKi8KKwkid3BhZCIgIlwwIiAgICAgICAgLyogREhDUF9XUEFEICAgICAgICAgICAqLworCTsKKworLyogTGVuZ3RocyBvZiB0aGUgb3B0aW9uIHR5cGVzIGluIGJpbmFyeSBmb3JtLgorICogVXNlZCBieToKKyAqIHVkaGNwX3N0cjJvcHRzZXQ6IHRvIGRldGVybWluZSBob3cgbWFueSBieXRlcyB0byBhbGxvY2F0ZS4KKyAqIHhtYWxsb2Nfb3B0bmFtZV9vcHR2YWw6IHRvIGVzdGltYXRlIHN0cmluZyBsZW5ndGgKKyAqIGZyb20gYmluYXJ5IG9wdGlvbiBsZW5ndGg6IChvcHRpb25bTEVOXSAvIGRoY3Bfb3B0aW9uX2xlbmd0aHNbb3B0X3R5cGVdKQorICogaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cywgbXVsdGlwbHkgaW4gYnkgb25lIGVsZW1lbnQncyBzdHJpbmcgd2lkdGgKKyAqIChsZW5fb2Zfb3B0aW9uX2FzX3N0cmluZ1tvcHRfdHlwZV0pIGFuZCB5b3Uga25vdyBob3cgd2lkZSBzdHJpbmcgeW91IG5lZWQuCisgKi8KK2NvbnN0IHVpbnQ4X3QgZGhjcF9vcHRpb25fbGVuZ3Roc1tdIEFMSUdOMSA9IHsKKwlbT1BUSU9OX0lQXSA9ICAgICAgNCwKKwlbT1BUSU9OX0lQX1BBSVJdID0gOCwKKy8vCVtPUFRJT05fQk9PTEVBTl0gPSAxLAorCVtPUFRJT05fU1RSSU5HXSA9ICAxLCAgLyogaWdub3JlZCBieSB1ZGhjcF9zdHIyb3B0c2V0ICovCisJW09QVElPTl9TVFJJTkdfSE9TVF0gPSAxLCAgLyogaWdub3JlZCBieSB1ZGhjcF9zdHIyb3B0c2V0ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NworCVtPUFRJT05fRE5TX1NUUklOR10gPSAxLCAgLyogaWdub3JlZCBieSBib3RoIHVkaGNwX3N0cjJvcHRzZXQgYW5kIHhtYWxsb2Nfb3B0bmFtZV9vcHR2YWwgKi8KKwlbT1BUSU9OX1NJUF9TRVJWRVJTXSA9IDEsCisjZW5kaWYKKwlbT1BUSU9OX1U4XSA9ICAgICAgMSwKKwlbT1BUSU9OX1UxNl0gPSAgICAgMiwKKy8vCVtPUFRJT05fUzE2XSA9ICAgICAyLAorCVtPUFRJT05fVTMyXSA9ICAgICA0LAorCVtPUFRJT05fUzMyXSA9ICAgICA0LAorCS8qIEp1c3QgbGlrZSBPUFRJT05fU1RSSU5HLCB3ZSB1c2UgbWluaW11bSBsZW5ndGggaGVyZSAqLworCVtPUFRJT05fU1RBVElDX1JPVVRFU10gPSA1LAorfTsKKworCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDIKK3N0YXRpYyB2b2lkIGxvZ19vcHRpb24oY29uc3QgY2hhciAqcGZ4LCBjb25zdCB1aW50OF90ICpvcHQpCit7CisJaWYgKGRoY3BfdmVyYm9zZSA+PSAyKSB7CisJCWNoYXIgYnVmWzI1NiAqIDIgKyAyXTsKKwkJKmJpbjJoZXgoYnVmLCAodm9pZCopIChvcHQgKyBPUFRfREFUQSksIG9wdFtPUFRfTEVOXSkgPSAnXDAnOworCQliYl9pbmZvX21zZygiJXM6IDB4JTAyeCAlcyIsIHBmeCwgb3B0W09QVF9DT0RFXSwgYnVmKTsKKwl9Cit9CisjZWxzZQorIyBkZWZpbmUgbG9nX29wdGlvbihwZngsIG9wdCkgKCh2b2lkKTApCisjZW5kaWYKKwordW5zaWduZWQgRkFTVF9GVU5DIHVkaGNwX29wdGlvbl9pZHgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbiA9IGluZGV4X2luX3N0cmluZ3MoZGhjcF9vcHRpb25fc3RyaW5ncywgbmFtZSk7CisJaWYgKG4gPj0gMCkKKwkJcmV0dXJuIG47CisKKwl7CisJCWNoYXIgYnVmW3NpemVvZihkaGNwX29wdGlvbl9zdHJpbmdzKV07CisJCWNoYXIgKmQgPSBidWY7CisJCWNvbnN0IGNoYXIgKnMgPSBkaGNwX29wdGlvbl9zdHJpbmdzOworCQl3aGlsZSAocyA8IGRoY3Bfb3B0aW9uX3N0cmluZ3MgKyBzaXplb2YoZGhjcF9vcHRpb25fc3RyaW5ncykgLSAyKSB7CisJCQkqZCsrID0gKCpzID09ICdcMCcgPyAnICcgOiAqcyk7CisJCQlzKys7CisJCX0KKwkJKmQgPSAnXDAnOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBvcHRpb24gJyVzJywga25vd24gb3B0aW9uczogJXMiLCBuYW1lLCBidWYpOworCX0KK30KKworLyogR2V0IGFuIG9wdGlvbiB3aXRoIGJvdW5kcyBjaGVja2luZyAod2FybmluZywgcmVzdWx0IGlzIG5vdCBhbGlnbmVkKSAqLwordWludDhfdCogRkFTVF9GVU5DIHVkaGNwX2dldF9vcHRpb24oc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGludCBjb2RlKQoreworCXVpbnQ4X3QgKm9wdGlvbnB0cjsKKwlpbnQgbGVuOworCWludCByZW07CisJaW50IG92ZXJsb2FkID0gMDsKKwllbnVtIHsKKwkJRklMRV9GSUVMRDEwMSAgPSBGSUxFX0ZJRUxEICAqIDB4MTAxLAorCQlTTkFNRV9GSUVMRDEwMSA9IFNOQU1FX0ZJRUxEICogMHgxMDEsCisJfTsKKworCS8qIG9wdGlvbiBieXRlczogW2NvZGVdW2xlbl1bZGF0YTFdW2RhdGEyXS4uW2RhdGFMRU5dICovCisJb3B0aW9ucHRyID0gcGFja2V0LT5vcHRpb25zOworCXJlbSA9IHNpemVvZihwYWNrZXQtPm9wdGlvbnMpOworCXdoaWxlICgxKSB7CisJCWlmIChyZW0gPD0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJiYWQgcGFja2V0LCBtYWxmb3JtZWQgb3B0aW9uIGZpZWxkIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAob3B0aW9ucHRyW09QVF9DT0RFXSA9PSBESENQX1BBRERJTkcpIHsKKwkJCXJlbS0tOworCQkJb3B0aW9ucHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob3B0aW9ucHRyW09QVF9DT0RFXSA9PSBESENQX0VORCkgeworCQkJaWYgKChvdmVybG9hZCAmIEZJTEVfRklFTEQxMDEpID09IEZJTEVfRklFTEQpIHsKKwkJCQkvKiBjYW4gdXNlIHBhY2tldC0+ZmlsZSwgYW5kIGRpZG4ndCBsb29rIGF0IGl0IHlldCAqLworCQkJCW92ZXJsb2FkIHw9IEZJTEVfRklFTEQxMDE7IC8qICJ3ZSBsb29rZWQgYXQgaXQiICovCisJCQkJb3B0aW9ucHRyID0gcGFja2V0LT5maWxlOworCQkJCXJlbSA9IHNpemVvZihwYWNrZXQtPmZpbGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChvdmVybG9hZCAmIFNOQU1FX0ZJRUxEMTAxKSA9PSBTTkFNRV9GSUVMRCkgeworCQkJCS8qIGNhbiB1c2UgcGFja2V0LT5zbmFtZSwgYW5kIGRpZG4ndCBsb29rIGF0IGl0IHlldCAqLworCQkJCW92ZXJsb2FkIHw9IFNOQU1FX0ZJRUxEMTAxOyAvKiAid2UgbG9va2VkIGF0IGl0IiAqLworCQkJCW9wdGlvbnB0ciA9IHBhY2tldC0+c25hbWU7CisJCQkJcmVtID0gc2l6ZW9mKHBhY2tldC0+c25hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJbGVuID0gMiArIG9wdGlvbnB0cltPUFRfTEVOXTsKKwkJcmVtIC09IGxlbjsKKwkJaWYgKHJlbSA8IDApCisJCQljb250aW51ZTsgLyogY29tcGxhaW4gYW5kIHJldHVybiBOVUxMICovCisKKwkJaWYgKG9wdGlvbnB0cltPUFRfQ09ERV0gPT0gY29kZSkgeworCQkJbG9nX29wdGlvbigiT3B0aW9uIGZvdW5kIiwgb3B0aW9ucHRyKTsKKwkJCXJldHVybiBvcHRpb25wdHIgKyBPUFRfREFUQTsKKwkJfQorCisJCWlmIChvcHRpb25wdHJbT1BUX0NPREVdID09IERIQ1BfT1BUSU9OX09WRVJMT0FEKSB7CisJCQlvdmVybG9hZCB8PSBvcHRpb25wdHJbT1BUX0RBVEFdOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCX0KKwkJb3B0aW9ucHRyICs9IGxlbjsKKwl9CisKKwkvKiBsb2czIGJlY2F1c2UgdWRoY3BjIHVzZXMgaXQgYSBsb3QgLSB2ZXJ5IG5vaXN5ICovCisJbG9nMygiT3B0aW9uIDB4JTAyeCBub3QgZm91bmQiLCBjb2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgJ2VuZCcgb3B0aW9uIChubyBib3VuZHMgY2hlY2tpbmcpICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX2VuZF9vcHRpb24odWludDhfdCAqb3B0aW9ucHRyKQoreworCWludCBpID0gMDsKKworCXdoaWxlIChvcHRpb25wdHJbaV0gIT0gREhDUF9FTkQpIHsKKwkJaWYgKG9wdGlvbnB0cltpXSAhPSBESENQX1BBRERJTkcpCisJCQlpICs9IG9wdGlvbnB0cltpICsgT1BUX0xFTl0gKyBPUFRfREFUQS0xOworCQlpKys7CisJfQorCXJldHVybiBpOworfQorCisvKiBBZGQgYW4gb3B0aW9uIChzdXBwbGllZCBpbiBiaW5hcnkgZm9ybSkgdG8gdGhlIG9wdGlvbnMuCisgKiBPcHRpb24gZm9ybWF0OiBbY29kZV1bbGVuXVtkYXRhMV1bZGF0YTJdLi5bZGF0YUxFTl0KKyAqLwordm9pZCBGQVNUX0ZVTkMgdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24oc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIHVpbnQ4X3QgKmFkZG9wdCkKK3sKKwl1bnNpZ25lZCBsZW47CisJdWludDhfdCAqb3B0aW9ucHRyID0gcGFja2V0LT5vcHRpb25zOworCXVuc2lnbmVkIGVuZCA9IHVkaGNwX2VuZF9vcHRpb24ob3B0aW9ucHRyKTsKKworCWxlbiA9IE9QVF9EQVRBICsgYWRkb3B0W09QVF9MRU5dOworCS8qIGVuZCBwb3NpdGlvbiArIChvcHRpb24gY29kZS9sZW5ndGggKyBhZGRvcHQgbGVuZ3RoKSArIGVuZCBvcHRpb24gKi8KKwlpZiAoZW5kICsgbGVuICsgMSA+PSBESENQX09QVElPTlNfQlVGU0laRSkgeworLy9UT0RPOiBsZWFybiBob3cgdG8gdXNlIG92ZXJmbG93IG9wdGlvbiBpZiB3ZSBleGhhdXN0IHBhY2tldC0+b3B0aW9uc1tdCisJCWJiX2Vycm9yX21zZygib3B0aW9uIDB4JTAyeCBkaWQgbm90IGZpdCBpbnRvIHRoZSBwYWNrZXQiLAorCQkJCWFkZG9wdFtPUFRfQ09ERV0pOworCQlyZXR1cm47CisJfQorCWxvZ19vcHRpb24oIkFkZGluZyBvcHRpb24iLCBhZGRvcHQpOworCW1lbWNweShvcHRpb25wdHIgKyBlbmQsIGFkZG9wdCwgbGVuKTsKKwlvcHRpb25wdHJbZW5kICsgbGVuXSA9IERIQ1BfRU5EOworfQorCisvKiBBZGQgYW4gb25lIHRvIGZvdXIgYnl0ZSBvcHRpb24gdG8gYSBwYWNrZXQgKi8KK3ZvaWQgRkFTVF9GVU5DIHVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCB1aW50OF90IGNvZGUsIHVpbnQzMl90IGRhdGEpCit7CisJY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqZGg7CisKKwlmb3IgKGRoID0gZGhjcF9vcHRmbGFnczsgZGgtPmNvZGU7IGRoKyspIHsKKwkJaWYgKGRoLT5jb2RlID09IGNvZGUpIHsKKwkJCXVpbnQ4X3Qgb3B0aW9uWzZdLCBsZW47CisKKwkJCW9wdGlvbltPUFRfQ09ERV0gPSBjb2RlOworCQkJbGVuID0gZGhjcF9vcHRpb25fbGVuZ3Roc1tkaC0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLXTsKKwkJCW9wdGlvbltPUFRfTEVOXSA9IGxlbjsKKwkJCWlmIChCQl9CSUdfRU5ESUFOKQorCQkJCWRhdGEgPDw9IDggKiAoNCAtIGxlbik7CisJCQkvKiBBc3NpZ25tZW50IGlzIHVuYWxpZ25lZCEgKi8KKwkJCW1vdmVfdG9fdW5hbGlnbmVkMzIoJm9wdGlvbltPUFRfREFUQV0sIGRhdGEpOworCQkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBvcHRpb24pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJYmJfZXJyb3JfbXNnKCJjYW4ndCBhZGQgb3B0aW9uIDB4JTAyeCIsIGNvZGUpOworfQorCisvKiBGaW5kIG9wdGlvbiAnY29kZScgaW4gb3B0X2xpc3QgKi8KK3N0cnVjdCBvcHRpb25fc2V0KiBGQVNUX0ZVTkMgdWRoY3BfZmluZF9vcHRpb24oc3RydWN0IG9wdGlvbl9zZXQgKm9wdF9saXN0LCB1aW50OF90IGNvZGUpCit7CisJd2hpbGUgKG9wdF9saXN0ICYmIG9wdF9saXN0LT5kYXRhW09QVF9DT0RFXSA8IGNvZGUpCisJCW9wdF9saXN0ID0gb3B0X2xpc3QtPm5leHQ7CisKKwlpZiAob3B0X2xpc3QgJiYgb3B0X2xpc3QtPmRhdGFbT1BUX0NPREVdID09IGNvZGUpCisJCXJldHVybiBvcHRfbGlzdDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogUGFyc2Ugc3RyaW5nIHRvIElQIGluIG5ldHdvcmsgb3JkZXIgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3RyMm5pcChjb25zdCBjaGFyICpzdHIsIHZvaWQgKmFyZykKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisKKwlsc2EgPSBob3N0X2FuZF9hZjJzb2NrYWRkcihzdHIsIDAsIEFGX0lORVQpOworCWlmICghbHNhKQorCQlyZXR1cm4gMDsKKwkqKHVpbnQzMl90KilhcmcgPSBsc2EtPnUuc2luLnNpbl9hZGRyLnNfYWRkcjsKKwlmcmVlKGxzYSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIHVkaGNwX3N0cjJvcHRzZXQ6CisgKiBQYXJzZSBzdHJpbmcgb3B0aW9uIHJlcHJlc2VudGF0aW9uIHRvIGJpbmFyeSBmb3JtIGFuZCBhZGQgaXQgdG8gb3B0X2xpc3QuCisgKiBDYWxsZWQgdG8gcGFyc2UgInVkaGNwYyAteCBPUFROQU1FOk9QVFZBTCIKKyAqIGFuZCB0byBwYXJzZSB1ZGhjcGQuY29uZidzICJvcHQgT1BUTkFNRSBPUFRWQUwiIGRpcmVjdGl2ZXMuCisgKi8KKy8qIGhlbHBlciBmb3IgdGhlIGhlbHBlciAqLworc3RhdGljIGNoYXIgKmFsbG9jYXRlX3RlbXBvcHRfaWZfbmVlZGVkKAorCQljb25zdCBzdHJ1Y3QgZGhjcF9vcHRmbGFnICpvcHRmbGFnLAorCQljaGFyICpidWZmZXIsCisJCWludCAqbGVuZ3RoX3ApCit7CisJY2hhciAqYWxsb2NhdGVkID0gTlVMTDsKKwlpZiAoKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSykgPT0gT1BUSU9OX0JJTikgeworCQljb25zdCBjaGFyICplbmQ7CisJCWFsbG9jYXRlZCA9IHhzdHJkdXAoYnVmZmVyKTsgLyogbW9yZSB0aGFuIGVub3VnaCAqLworCQllbmQgPSBoZXgyYmluKGFsbG9jYXRlZCwgYnVmZmVyLCAyNTUpOworCQlpZiAoZXJybm8pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWFsZm9ybWVkIGhleCBzdHJpbmcgJyVzJyIsIGJ1ZmZlcik7CisJCSpsZW5ndGhfcCA9IGVuZCAtIGFsbG9jYXRlZDsKKwl9CisJcmV0dXJuIGFsbG9jYXRlZDsKK30KKy8qIGhlbHBlcjogYWRkIGFuIG9wdGlvbiB0byB0aGUgb3B0X2xpc3QgKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIGF0dGFjaF9vcHRpb24oCisJCXN0cnVjdCBvcHRpb25fc2V0ICoqb3B0X2xpc3QsCisJCWNvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgKm9wdGZsYWcsCisJCWNoYXIgKmJ1ZmZlciwKKwkJaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqZXhpc3RpbmcsICpuZXcsICoqY3VycjsKKwljaGFyICphbGxvY2F0ZWQgPSBOVUxMOworCisJZXhpc3RpbmcgPSB1ZGhjcF9maW5kX29wdGlvbigqb3B0X2xpc3QsIG9wdGZsYWctPmNvZGUpOworCWlmICghZXhpc3RpbmcpIHsKKwkJbG9nMigiQXR0YWNoaW5nIG9wdGlvbiAlMDJ4IHRvIGxpc3QiLCBvcHRmbGFnLT5jb2RlKTsKKwkJYWxsb2NhdGVkID0gYWxsb2NhdGVfdGVtcG9wdF9pZl9uZWVkZWQob3B0ZmxhZywgYnVmZmVyLCAmbGVuZ3RoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJCWlmICgob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLKSA9PSBPUFRJT05fRE5TX1NUUklORykgeworCQkJLyogcmV1c2UgYnVmZmVyIGFuZCBsZW5ndGggZm9yIFJGQzEwMzUtZm9ybWF0dGVkIHN0cmluZyAqLworCQkJYWxsb2NhdGVkID0gYnVmZmVyID0gKGNoYXIgKilkbmFtZV9lbmMoTlVMTCwgMCwgYnVmZmVyLCAmbGVuZ3RoKTsKKwkJfQorI2VuZGlmCisJCS8qIG1ha2UgYSBuZXcgb3B0aW9uICovCisJCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKwkJbmV3LT5kYXRhID0geG1hbGxvYyhsZW5ndGggKyBPUFRfREFUQSk7CisJCW5ldy0+ZGF0YVtPUFRfQ09ERV0gPSBvcHRmbGFnLT5jb2RlOworCQluZXctPmRhdGFbT1BUX0xFTl0gPSBsZW5ndGg7CisJCW1lbWNweShuZXctPmRhdGEgKyBPUFRfREFUQSwgKGFsbG9jYXRlZCA/IGFsbG9jYXRlZCA6IGJ1ZmZlciksIGxlbmd0aCk7CisKKwkJY3VyciA9IG9wdF9saXN0OworCQl3aGlsZSAoKmN1cnIgJiYgKCpjdXJyKS0+ZGF0YVtPUFRfQ09ERV0gPCBvcHRmbGFnLT5jb2RlKQorCQkJY3VyciA9ICYoKmN1cnIpLT5uZXh0OworCisJCW5ldy0+bmV4dCA9ICpjdXJyOworCQkqY3VyciA9IG5ldzsKKwkJZ290byByZXQ7CisJfQorCisJaWYgKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX0xJU1QpIHsKKwkJdW5zaWduZWQgb2xkX2xlbjsKKworCQkvKiBhZGQgaXQgdG8gYW4gZXhpc3Rpbmcgb3B0aW9uICovCisJCWxvZzIoIkF0dGFjaGluZyBvcHRpb24gJTAyeCB0byBleGlzdGluZyBtZW1iZXIgb2YgbGlzdCIsIG9wdGZsYWctPmNvZGUpOworCQlhbGxvY2F0ZWQgPSBhbGxvY2F0ZV90ZW1wb3B0X2lmX25lZWRlZChvcHRmbGFnLCBidWZmZXIsICZsZW5ndGgpOworCQlvbGRfbGVuID0gZXhpc3RpbmctPmRhdGFbT1BUX0xFTl07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NworCQlpZiAoKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSykgPT0gT1BUSU9OX0ROU19TVFJJTkcpIHsKKwkJCS8qIHJldXNlIGJ1ZmZlciBhbmQgbGVuZ3RoIGZvciBSRkMxMDM1LWZvcm1hdHRlZCBzdHJpbmcgKi8KKwkJCWFsbG9jYXRlZCA9IGJ1ZmZlciA9IChjaGFyICopZG5hbWVfZW5jKGV4aXN0aW5nLT5kYXRhICsgT1BUX0RBVEEsIG9sZF9sZW4sIGJ1ZmZlciwgJmxlbmd0aCk7CisJCX0KKyNlbmRpZgorCQlpZiAob2xkX2xlbiArIGxlbmd0aCA8IDI1NSkgeworCQkJLyogYWN0dWFsbHkgMjU1IGlzIG9rIHRvbywgYnV0IGFkZGluZyBhIHNwYWNlIGNhbiBvdmVybG93IGl0ICovCisKKwkJCWV4aXN0aW5nLT5kYXRhID0geHJlYWxsb2MoZXhpc3RpbmctPmRhdGEsIE9QVF9EQVRBICsgMSArIG9sZF9sZW4gKyBsZW5ndGgpOworCQkJaWYgKChvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0spID09IE9QVElPTl9TVFJJTkcKKwkJCSB8fCAob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLKSA9PSBPUFRJT05fU1RSSU5HX0hPU1QKKwkJCSkgeworCQkJCS8qIGFkZCBzcGFjZSBzZXBhcmF0b3IgYmV0d2VlbiBTVFJJTkcgb3B0aW9ucyBpbiBhIGxpc3QgKi8KKwkJCQlleGlzdGluZy0+ZGF0YVtPUFRfREFUQSArIG9sZF9sZW5dID0gJyAnOworCQkJCW9sZF9sZW4rKzsKKwkJCX0KKwkJCW1lbWNweShleGlzdGluZy0+ZGF0YSArIE9QVF9EQVRBICsgb2xkX2xlbiwgYnVmZmVyLCBsZW5ndGgpOworCQkJZXhpc3RpbmctPmRhdGFbT1BUX0xFTl0gPSBvbGRfbGVuICsgbGVuZ3RoOworCQl9IC8qIGVsc2UsIGlnbm9yZSB0aGUgZGF0YSwgd2UgY291bGQgcHV0IHRoaXMgaW4gYSBzZWNvbmQgb3B0aW9uIGluIHRoZSBmdXR1cmUgKi8KKwl9IC8qIGVsc2UsIGlnbm9yZSB0aGUgbmV3IGRhdGEgKi8KKworIHJldDoKKwlmcmVlKGFsbG9jYXRlZCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3RyMm9wdHNldChjb25zdCBjaGFyICpjb25zdF9zdHIsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqKm9wdF9saXN0ID0gYXJnOworCWNoYXIgKm9wdCwgKnZhbCwgKmVuZHB0cjsKKwljaGFyICpzdHI7CisJY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqb3B0ZmxhZzsKKwlzdHJ1Y3QgZGhjcF9vcHRmbGFnIGJpbl9vcHRmbGFnOworCXVuc2lnbmVkIG9wdGNvZGU7CisJaW50IHJldHZhbCwgbGVuZ3RoOworCWNoYXIgYnVmZmVyWzhdIEFMSUdORUQoNCk7CisJdWludDE2X3QgKnJlc3VsdF91MTYgPSAodWludDE2X3QgKikgYnVmZmVyOworCXVpbnQzMl90ICpyZXN1bHRfdTMyID0gKHVpbnQzMl90ICopIGJ1ZmZlcjsKKworCS8qIENoZWF0LCB0aGUgb25seSAqY29uc3QqIHN0ciBwb3NzaWJsZSBpcyAiIiAqLworCXN0ciA9IChjaGFyICopIGNvbnN0X3N0cjsKKwlvcHQgPSBzdHJ0b2soc3RyLCAiIFx0PSIpOworCWlmICghb3B0KQorCQlyZXR1cm4gMDsKKworCW9wdGNvZGUgPSBiYl9zdHJ0b3Uob3B0LCBOVUxMLCAwKTsKKwlpZiAoIWVycm5vICYmIG9wdGNvZGUgPCAyNTUpIHsKKwkJLyogUmF3IChudW1lcmljKSBvcHRpb24gY29kZSAqLworCQliaW5fb3B0ZmxhZy5mbGFncyA9IE9QVElPTl9CSU47CisJCWJpbl9vcHRmbGFnLmNvZGUgPSBvcHRjb2RlOworCQlvcHRmbGFnID0gJmJpbl9vcHRmbGFnOworCX0gZWxzZSB7CisJCW9wdGZsYWcgPSAmZGhjcF9vcHRmbGFnc1t1ZGhjcF9vcHRpb25faWR4KG9wdCldOworCX0KKworCXJldHZhbCA9IDA7CisJZG8geworCQl2YWwgPSBzdHJ0b2soTlVMTCwgIiwgXHQiKTsKKwkJaWYgKCF2YWwpCisJCQlicmVhazsKKwkJbGVuZ3RoID0gZGhjcF9vcHRpb25fbGVuZ3Roc1tvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0tdOworCQlyZXR2YWwgPSAwOworCQlvcHQgPSBidWZmZXI7IC8qIG5ldyBtZWFuaW5nIGZvciB2YXJpYWJsZSBvcHQgKi8KKwkJc3dpdGNoIChvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0spIHsKKwkJY2FzZSBPUFRJT05fSVA6CisJCQlyZXR2YWwgPSB1ZGhjcF9zdHIybmlwKHZhbCwgYnVmZmVyKTsKKwkJCWJyZWFrOworCQljYXNlIE9QVElPTl9JUF9QQUlSOgorCQkJcmV0dmFsID0gdWRoY3Bfc3RyMm5pcCh2YWwsIGJ1ZmZlcik7CisJCQl2YWwgPSBzdHJ0b2soTlVMTCwgIiwgXHQvLSIpOworCQkJaWYgKCF2YWwpCisJCQkJcmV0dmFsID0gMDsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dmFsID0gdWRoY3Bfc3RyMm5pcCh2YWwsIGJ1ZmZlciArIDQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BUSU9OX1NUUklORzoKKwkJY2FzZSBPUFRJT05fU1RSSU5HX0hPU1Q6CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NworCQljYXNlIE9QVElPTl9ETlNfU1RSSU5HOgorI2VuZGlmCisJCQlsZW5ndGggPSBzdHJubGVuKHZhbCwgMjU0KTsKKwkJCWlmIChsZW5ndGggPiAwKSB7CisJCQkJb3B0ID0gdmFsOworCQkJCXJldHZhbCA9IDE7CisJCQl9CisJCQlicmVhazsKKy8vCQljYXNlIE9QVElPTl9CT09MRUFOOiB7CisvLwkJCXN0YXRpYyBjb25zdCBjaGFyIG5vX3llc1tdIEFMSUdOMSA9ICJub1wweWVzXDAiOworLy8JCQlidWZmZXJbMF0gPSByZXR2YWwgPSBpbmRleF9pbl9zdHJpbmdzKG5vX3llcywgdmFsKTsKKy8vCQkJcmV0dmFsKys7IC8qIDAgLSBiYWQ7IDE6ICJubyIgMjogInllcyIgKi8KKy8vCQkJYnJlYWs7CisvLwkJfQorCQljYXNlIE9QVElPTl9VODoKKwkJCWJ1ZmZlclswXSA9IHN0cnRvdWwodmFsLCAmZW5kcHRyLCAwKTsKKwkJCXJldHZhbCA9IChlbmRwdHJbMF0gPT0gJ1wwJyk7CisJCQlicmVhazsKKwkJLyogaHRvblggYXJlIG1hY3JvcyBpbiBvbGRlciBsaWJjJ3MsIHVzaW5nIHRlbXAgdmFyCisJCSAqIGluIGNvZGUgYmVsb3cgZm9yIHNhZmV0eSAqLworCQkvKiBUT0RPOiB1c2UgYmJfc3RydG9YPyAqLworCQljYXNlIE9QVElPTl9VMTY6IHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1wID0gc3RydG91bCh2YWwsICZlbmRwdHIsIDApOworCQkJKnJlc3VsdF91MTYgPSBodG9ucyh0bXApOworCQkJcmV0dmFsID0gKGVuZHB0clswXSA9PSAnXDAnIC8qJiYgdG1wIDwgMHgxMDAwMCovKTsKKwkJCWJyZWFrOworCQl9CisvLwkJY2FzZSBPUFRJT05fUzE2OiB7CisvLwkJCWxvbmcgdG1wID0gc3RydG9sKHZhbCwgJmVuZHB0ciwgMCk7CisvLwkJCSpyZXN1bHRfdTE2ID0gaHRvbnModG1wKTsKKy8vCQkJcmV0dmFsID0gKGVuZHB0clswXSA9PSAnXDAnKTsKKy8vCQkJYnJlYWs7CisvLwkJfQorCQljYXNlIE9QVElPTl9VMzI6IHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1wID0gc3RydG91bCh2YWwsICZlbmRwdHIsIDApOworCQkJKnJlc3VsdF91MzIgPSBodG9ubCh0bXApOworCQkJcmV0dmFsID0gKGVuZHB0clswXSA9PSAnXDAnKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT1BUSU9OX1MzMjogeworCQkJbG9uZyB0bXAgPSBzdHJ0b2wodmFsLCAmZW5kcHRyLCAwKTsKKwkJCSpyZXN1bHRfdTMyID0gaHRvbmwodG1wKTsKKwkJCXJldHZhbCA9IChlbmRwdHJbMF0gPT0gJ1wwJyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QVElPTl9CSU46IC8qIGhhbmRsZWQgaW4gYXR0YWNoX29wdGlvbigpICovCisJCQlvcHQgPSB2YWw7CisJCQlyZXR2YWwgPSAxOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldHZhbCkKKwkJCWF0dGFjaF9vcHRpb24ob3B0X2xpc3QsIG9wdGZsYWcsIG9wdCwgbGVuZ3RoKTsKKwl9IHdoaWxlIChyZXR2YWwgJiYgb3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fTElTVCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9jb21tb24uaCBiL25ldHdvcmtpbmcvdWRoY3AvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZGQ5MwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvY29tbW9uLmgKQEAgLTAsMCArMSwzMTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IFNlcHRlbWJlciAyMDAxCisgKiBSZXdyaXR0ZW4gYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAoQykgMjAwMworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVURIQ1BfQ09NTU9OX0gKKyNkZWZpbmUgVURIQ1BfQ09NTU9OX0ggMQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2V4dGVybiBjb25zdCB1aW50OF90IE1BQ19CQ0FTVF9BRERSWzZdOyAvKiBzaXggYWxsLW9uZXMgKi8KKworCisvKioqIERIQ1AgcGFja2V0ICoqKi8KKworLyogREhDUCBwcm90b2NvbC4gU2VlIFJGQyAyMTMxICovCisjZGVmaW5lIERIQ1BfTUFHSUMgICAgICAgICAgICAgIDB4NjM4MjUzNjMKKyNkZWZpbmUgREhDUF9PUFRJT05TX0JVRlNJWkUgICAgMzA4CisjZGVmaW5lIEJPT1RSRVFVRVNUICAgICAgICAgICAgIDEKKyNkZWZpbmUgQk9PVFJFUExZICAgICAgICAgICAgICAgMgorCisvL1RPRE86IHJlbmFtZSBjaWFkZHIveWlhZGRyL2NoYWRkcgorc3RydWN0IGRoY3BfcGFja2V0IHsKKwl1aW50OF90IG9wOyAgICAgIC8qIEJPT1RSRVFVRVNUIG9yIEJPT1RSRVBMWSAqLworCXVpbnQ4X3QgaHR5cGU7ICAgLyogaGFyZHdhcmUgYWRkcmVzcyB0eXBlLiAxID0gMTBtYiBldGhlcm5ldCAqLworCXVpbnQ4X3QgaGxlbjsgICAgLyogaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKwl1aW50OF90IGhvcHM7ICAgIC8qIHVzZWQgYnkgcmVsYXkgYWdlbnRzIG9ubHkgKi8KKwl1aW50MzJfdCB4aWQ7ICAgIC8qIHVuaXF1ZSBpZCAqLworCXVpbnQxNl90IHNlY3M7ICAgLyogZWxhcHNlZCBzaW5jZSBjbGllbnQgYmVnYW4gYWNxdWlzaXRpb24vcmVuZXdhbCAqLworCXVpbnQxNl90IGZsYWdzOyAgLyogb25seSBvbmUgZmxhZyBzbyBmYXI6ICovCisjZGVmaW5lIEJST0FEQ0FTVF9GTEFHIDB4ODAwMCAvKiAiSSBuZWVkIGJyb2FkY2FzdCByZXBsaWVzIiAqLworCXVpbnQzMl90IGNpYWRkcjsgLyogY2xpZW50IElQIChpZiBjbGllbnQgaXMgaW4gQk9VTkQsIFJFTkVXIG9yIFJFQklORElORyBzdGF0ZSkgKi8KKwl1aW50MzJfdCB5aWFkZHI7IC8qICd5b3VyJyAoY2xpZW50KSBJUCBhZGRyZXNzICovCisJLyogSVAgYWRkcmVzcyBvZiBuZXh0IHNlcnZlciB0byB1c2UgaW4gYm9vdHN0cmFwLCByZXR1cm5lZCBpbiBESENQT0ZGRVIsIERIQ1BBQ0sgYnkgc2VydmVyICovCisJdWludDMyX3Qgc2lhZGRyX25pcDsKKwl1aW50MzJfdCBnYXRld2F5X25pcDsgLyogcmVsYXkgYWdlbnQgSVAgYWRkcmVzcyAqLworCXVpbnQ4X3QgY2hhZGRyWzE2XTsgICAvKiBsaW5rLWxheWVyIGNsaWVudCBoYXJkd2FyZSBhZGRyZXNzIChNQUMpICovCisJdWludDhfdCBzbmFtZVs2NF07ICAgIC8qIHNlcnZlciBob3N0IG5hbWUgKEFTQ0laKSAqLworCXVpbnQ4X3QgZmlsZVsxMjhdOyAgICAvKiBib290IGZpbGUgbmFtZSAoQVNDSVopICovCisJdWludDMyX3QgY29va2llOyAgICAgIC8qIGZpeGVkIGZpcnN0IGZvdXIgb3B0aW9uIGJ5dGVzICg5OSwxMzAsODMsOTkgZGVjKSAqLworCXVpbnQ4X3Qgb3B0aW9uc1tESENQX09QVElPTlNfQlVGU0laRSArIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlNdOworfSBQQUNLRUQ7CisjZGVmaW5lIERIQ1BfUEtUX1NOQU1FX0xFTiAgICAgIDY0CisjZGVmaW5lIERIQ1BfUEtUX0ZJTEVfTEVOICAgICAgMTI4CisjZGVmaW5lIERIQ1BfUEtUX1NOQU1FX0xFTl9TVFIgIjY0IgorI2RlZmluZSBESENQX1BLVF9GSUxFX0xFTl9TVFIgIjEyOCIKKworc3RydWN0IGlwX3VkcF9kaGNwX3BhY2tldCB7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXN0cnVjdCBkaGNwX3BhY2tldCBkYXRhOworfSBQQUNLRUQ7CisKK3N0cnVjdCB1ZHBfZGhjcF9wYWNrZXQgeworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXN0cnVjdCBkaGNwX3BhY2tldCBkYXRhOworfSBQQUNLRUQ7CisKK2VudW0geworCUlQX1VEUF9ESENQX1NJWkUgPSBzaXplb2Yoc3RydWN0IGlwX3VkcF9kaGNwX3BhY2tldCkgLSBDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTLAorCVVEUF9ESENQX1NJWkUgICAgPSBzaXplb2Yoc3RydWN0IHVkcF9kaGNwX3BhY2tldCkgLSBDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTLAorCURIQ1BfU0laRSAgICAgICAgPSBzaXplb2Yoc3RydWN0IGRoY3BfcGFja2V0KSAtIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMsCit9OworCisvKiBMZXQncyBzZWUgd2hldGhlciBjb21waWxlciB1bmRlcnN0b29kIHVzIHJpZ2h0ICovCitzdHJ1Y3QgQlVHX2JhZF9zaXplb2Zfc3RydWN0X2lwX3VkcF9kaGNwX3BhY2tldCB7CisJY2hhciBjW0lQX1VEUF9ESENQX1NJWkUgPT0gNTc2ID8gMSA6IC0xXTsKK307CisKKworLyoqKiBPcHRpb25zICoqKi8KKworZW51bSB7CisJT1BUSU9OX0lQID0gMSwKKwlPUFRJT05fSVBfUEFJUiwKKwlPUFRJT05fU1RSSU5HLAorCS8qIE9wdHMgb2YgU1RSSU5HX0hPU1QgdHlwZSB3aWxsIGJlIHNhbml0aXplZCBiZWZvcmUgdGhleSBhcmUgcGFzc2VkCisJICogdG8gdWRoY3BjIHNjcmlwdCdzIGVudmlyb25tZW50OiAqLworCU9QVElPTl9TVFJJTkdfSE9TVCwKKy8vCU9QVElPTl9CT09MRUFOLAorCU9QVElPTl9VOCwKKwlPUFRJT05fVTE2LAorLy8JT1BUSU9OX1MxNiwKKwlPUFRJT05fVTMyLAorCU9QVElPTl9TMzIsCisJT1BUSU9OX0JJTiwKKwlPUFRJT05fU1RBVElDX1JPVVRFUywKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJT1BUSU9OX0ROU19TVFJJTkcsICAvKiBSRkMxMDM1IGNvbXByZXNzZWQgZG9tYWluIG5hbWUgbGlzdCAqLworCU9QVElPTl9TSVBfU0VSVkVSUywKKyNlbmRpZgorCisJT1BUSU9OX1RZUEVfTUFTSyA9IDB4MGYsCisJLyogQ2xpZW50IHJlcXVlc3RzIHRoaXMgb3B0aW9uIGJ5IGRlZmF1bHQgKi8KKwlPUFRJT05fUkVRICA9IDB4MTAsCisJLyogVGhlcmUgY2FuIGJlIGEgbGlzdCBvZiAxIG9yIG1vcmUgb2YgdGhlc2UgKi8KKwlPUFRJT05fTElTVCA9IDB4MjAsCit9OworCisvKiBESENQIG9wdGlvbiBjb2RlcyAocGFydGlhbCBsaXN0KS4gU2VlIFJGQyAyMTMyIGFuZAorICogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9ib290cC1kaGNwLXBhcmFtZXRlcnMvCisgKiBDb21tZW50ZWQgb3V0IG9wdGlvbnMgYXJlIGhhbmRsZWQgYnkgY29tbW9uIG9wdGlvbiBtYWNoaW5lcnksCisgKiB1bmNvbW1lbnRlZCBvbmVzIGhhdmUgc3BhY2lhbCBjYXNlcyAoZ3JlcCBmb3IgdGhlbSB0byBzZWUpLgorICovCisjZGVmaW5lIERIQ1BfUEFERElORyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgREhDUF9TVUJORVQgICAgICAgICAgICAgMHgwMQorLy8jZGVmaW5lIERIQ1BfVElNRV9PRkZTRVQgICAgICAweDAyIC8qIChsb2NhbHRpbWUgLSBVVENfdGltZSkgaW4gc2Vjb25kcy4gc2lnbmVkICovCisvLyNkZWZpbmUgREhDUF9ST1VURVIgICAgICAgICAgIDB4MDMKKy8vI2RlZmluZSBESENQX1RJTUVfU0VSVkVSICAgICAgMHgwNCAvKiBSRkMgODY4IHRpbWUgc2VydmVyICgzMi1iaXQsIDAgPSAxLjEuMTkwMCkgKi8KKy8vI2RlZmluZSBESENQX05BTUVfU0VSVkVSICAgICAgMHgwNSAvKiBJRU4gMTE2IF9yZWFsbHlfIGFuY2llbnQga2luZCBvZiBOUyAqLworLy8jZGVmaW5lIERIQ1BfRE5TX1NFUlZFUiAgICAgICAweDA2CisvLyNkZWZpbmUgREhDUF9MT0dfU0VSVkVSICAgICAgIDB4MDcgLyogcG9ydCA3MDQgVURQIGxvZyAobm90IHN5c2xvZykKKy8vI2RlZmluZSBESENQX0NPT0tJRV9TRVJWRVIgICAgMHgwOCAvKiAicXVvdGUgb2YgdGhlIGRheSIgc2VydmVyICovCisvLyNkZWZpbmUgREhDUF9MUFJfU0VSVkVSICAgICAgIDB4MDkKKyNkZWZpbmUgREhDUF9IT1NUX05BTUUgICAgICAgICAgMHgwYyAvKiBlaXRoZXIgY2xpZW50IGluZm9ybXMgc2VydmVyIG9yIHNlcnZlciBnaXZlcyBuYW1lIHRvIGNsaWVudCAqLworLy8jZGVmaW5lIERIQ1BfQk9PVF9TSVpFICAgICAgICAweDBkCisvLyNkZWZpbmUgREhDUF9ET01BSU5fTkFNRSAgICAgIDB4MGYgLyogc2VydmVyIGdpdmVzIGRvbWFpbiBzdWZmaXggKi8KKy8vI2RlZmluZSBESENQX1NXQVBfU0VSVkVSICAgICAgMHgxMAorLy8jZGVmaW5lIERIQ1BfUk9PVF9QQVRIICAgICAgICAweDExCisvLyNkZWZpbmUgREhDUF9JUF9UVEwgICAgICAgICAgIDB4MTcKKy8vI2RlZmluZSBESENQX01UVSAgICAgICAgICAgICAgMHgxYQorLy8jZGVmaW5lIERIQ1BfQlJPQURDQVNUICAgICAgICAweDFjCisvLyNkZWZpbmUgREhDUF9ST1VURVMgICAgICAgICAgIDB4MjEKKy8vI2RlZmluZSBESENQX05JU19ET01BSU4gICAgICAgMHgyOAorLy8jZGVmaW5lIERIQ1BfTklTX1NFUlZFUiAgICAgICAweDI5CisvLyNkZWZpbmUgREhDUF9OVFBfU0VSVkVSICAgICAgIDB4MmEKKy8vI2RlZmluZSBESENQX1dJTlNfU0VSVkVSICAgICAgMHgyYworI2RlZmluZSBESENQX1JFUVVFU1RFRF9JUCAgICAgICAweDMyIC8qIHNlbnQgYnkgY2xpZW50IGlmIHNwZWNpZmljIElQIGlzIHdhbnRlZCAqLworI2RlZmluZSBESENQX0xFQVNFX1RJTUUgICAgICAgICAweDMzCisjZGVmaW5lIERIQ1BfT1BUSU9OX09WRVJMT0FEICAgIDB4MzQKKyNkZWZpbmUgREhDUF9NRVNTQUdFX1RZUEUgICAgICAgMHgzNQorI2RlZmluZSBESENQX1NFUlZFUl9JRCAgICAgICAgICAweDM2IC8qIGJ5IGRlZmF1bHQgc2VydmVyJ3MgSVAgKi8KKyNkZWZpbmUgREhDUF9QQVJBTV9SRVEgICAgICAgICAgMHgzNyAvKiBsaXN0IG9mIG9wdGlvbnMgY2xpZW50IHdhbnRzICovCisvLyNkZWZpbmUgREhDUF9FUlJfTUVTU0FHRSAgICAgIDB4MzggLyogZXJyb3IgbWVzc2FnZSB3aGVuIHNlbmRpbmcgTkFLIGV0YyAqLworI2RlZmluZSBESENQX01BWF9TSVpFICAgICAgICAgICAweDM5CisjZGVmaW5lIERIQ1BfVkVORE9SICAgICAgICAgICAgIDB4M2MgLyogY2xpZW50J3MgdmVuZG9yIChhIHN0cmluZykgKi8KKyNkZWZpbmUgREhDUF9DTElFTlRfSUQgICAgICAgICAgMHgzZCAvKiBieSBkZWZhdWx0IGNsaWVudCdzIE1BQyBhZGRyLCBidXQgbWF5IGJlIGFyYml0cmFyaWx5IGxvbmcgKi8KKy8vI2RlZmluZSBESENQX1RGVFBfU0VSVkVSX05BTUUgMHg0MiAvKiBzYW1lIGFzICdzbmFtZScgZmllbGQgKi8KKy8vI2RlZmluZSBESENQX0JPT1RfRklMRSAgICAgICAgMHg0MyAvKiBzYW1lIGFzICdmaWxlJyBmaWVsZCAqLworLy8jZGVmaW5lIERIQ1BfVVNFUl9DTEFTUyAgICAgICAweDRkIC8qIFJGQyAzMDA0LiBzZXQgb2YgTEFTQ0lJIHN0cmluZ3MuICJJIGFtIGEgcHJpbnRlciIgZXRjICovCisjZGVmaW5lIERIQ1BfRlFETiAgICAgICAgICAgICAgIDB4NTEgLyogY2xpZW50IGFza3MgdG8gdXBkYXRlIEROUyB0byBtYXAgaXRzIEZRRE4gdG8gaXRzIG5ldyBJUCAqLworLy8jZGVmaW5lIERIQ1BfRE9NQUlOX1NFQVJDSCAgICAweDc3IC8qIFJGQyAzMzk3LiBzZXQgb2YgQVNDSVogc3RyaW5nLCBETlMtc3R5bGUgY29tcHJlc3NlZCAqLworLy8jZGVmaW5lIERIQ1BfU0lQX1NFUlZFUlMgICAgICAweDc4IC8qIFJGQyAzMzYxLiBmbGFnIGJ5dGUsIHRoZW46IDA6IGRvbWFpbiBuYW1lcywgMTogSVAgYWRkcnMgKi8KKy8vI2RlZmluZSBESENQX1NUQVRJQ19ST1VURVMgICAgMHg3OSAvKiBSRkMgMzQ0Mi4gKG1hc2ssaXAscm91dGVyKSB0dXBsZXMgKi8KKyNkZWZpbmUgREhDUF9WTEFOX0lEICAgICAgICAgICAgMHg4NCAvKiA4MDIuMVAgVkxBTiBJRCAqLworI2RlZmluZSBESENQX1ZMQU5fUFJJT1JJVFkgICAgICAweDg1IC8qIDgwMi4xUSBWTEFOIHByaW9yaXR5ICovCisvLyNkZWZpbmUgREhDUF9NU19TVEFUSUNfUk9VVEVTIDB4ZjkgLyogTWljcm9zb2Z0J3MgcHJlLVJGQyAzNDQyIGNvZGUgZm9yIDB4Nzk/ICovCisvLyNkZWZpbmUgREhDUF9XUEFEICAgICAgICAgICAgIDB4ZmMgLyogTVNJRSdzIFdlYiBQcm94eSBBdXRvZGlzY292ZXJ5IFByb3RvY29sICovCisjZGVmaW5lIERIQ1BfRU5EICAgICAgICAgICAgICAgIDB4ZmYKKworLyogT2Zmc2V0cyBpbiBvcHRpb24gYnl0ZSBzZXF1ZW5jZSAqLworI2RlZmluZSBPUFRfQ09ERSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE9QVF9MRU4gICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgT1BUX0RBVEEgICAgICAgICAgICAgICAgMgorLyogQml0cyBpbiAib3ZlcmxvYWQiIG9wdGlvbiAqLworI2RlZmluZSBPUFRJT05fRklFTEQgICAgICAgICAgICAwCisjZGVmaW5lIEZJTEVfRklFTEQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU05BTUVfRklFTEQgICAgICAgICAgICAgMgorCisvKiBESENQX01FU1NBR0VfVFlQRSB2YWx1ZXMgKi8KKyNkZWZpbmUgREhDUERJU0NPVkVSICAgICAgICAgICAgMSAvKiBjbGllbnQgLT4gc2VydmVyICovCisjZGVmaW5lIERIQ1BPRkZFUiAgICAgICAgICAgICAgIDIgLyogY2xpZW50IDwtIHNlcnZlciAqLworI2RlZmluZSBESENQUkVRVUVTVCAgICAgICAgICAgICAzIC8qIGNsaWVudCAtPiBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUERFQ0xJTkUgICAgICAgICAgICAgNCAvKiBjbGllbnQgLT4gc2VydmVyICovCisjZGVmaW5lIERIQ1BBQ0sgICAgICAgICAgICAgICAgIDUgLyogY2xpZW50IDwtIHNlcnZlciAqLworI2RlZmluZSBESENQTkFLICAgICAgICAgICAgICAgICA2IC8qIGNsaWVudCA8LSBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUFJFTEVBU0UgICAgICAgICAgICAgNyAvKiBjbGllbnQgLT4gc2VydmVyICovCisjZGVmaW5lIERIQ1BJTkZPUk0gICAgICAgICAgICAgIDggLyogY2xpZW50IC0+IHNlcnZlciAqLworI2RlZmluZSBESENQX01JTlRZUEUgREhDUERJU0NPVkVSCisjZGVmaW5lIERIQ1BfTUFYVFlQRSBESENQSU5GT1JNCisKK3N0cnVjdCBkaGNwX29wdGZsYWcgeworCXVpbnQ4X3QgZmxhZ3M7CisJdWludDhfdCBjb2RlOworfTsKKworc3RydWN0IG9wdGlvbl9zZXQgeworCXVpbnQ4X3QgKmRhdGE7CisJc3RydWN0IG9wdGlvbl9zZXQgKm5leHQ7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyBkaGNwX29wdGZsYWdzW107CitleHRlcm4gY29uc3QgY2hhciBkaGNwX29wdGlvbl9zdHJpbmdzW107CitleHRlcm4gY29uc3QgdWludDhfdCBkaGNwX29wdGlvbl9sZW5ndGhzW107CisKK3Vuc2lnbmVkIEZBU1RfRlVOQyB1ZGhjcF9vcHRpb25faWR4KGNvbnN0IGNoYXIgKm5hbWUpOworCit1aW50OF90ICp1ZGhjcF9nZXRfb3B0aW9uKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBpbnQgY29kZSkgRkFTVF9GVU5DOworaW50IHVkaGNwX2VuZF9vcHRpb24odWludDhfdCAqb3B0aW9ucHRyKSBGQVNUX0ZVTkM7Cit2b2lkIHVkaGNwX2FkZF9iaW5hcnlfb3B0aW9uKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCB1aW50OF90ICphZGRvcHQpIEZBU1RfRlVOQzsKK3ZvaWQgdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIHVpbnQ4X3QgY29kZSwgdWludDMyX3QgZGF0YSkgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKK2NoYXIgKmRuYW1lX2RlYyhjb25zdCB1aW50OF90ICpjc3RyLCBpbnQgY2xlbiwgY29uc3QgY2hhciAqcHJlKSBGQVNUX0ZVTkM7Cit1aW50OF90ICpkbmFtZV9lbmMoY29uc3QgdWludDhfdCAqY3N0ciwgaW50IGNsZW4sIGNvbnN0IGNoYXIgKnNyYywgaW50ICpyZXRsZW4pIEZBU1RfRlVOQzsKKyNlbmRpZgorc3RydWN0IG9wdGlvbl9zZXQgKnVkaGNwX2ZpbmRfb3B0aW9uKHN0cnVjdCBvcHRpb25fc2V0ICpvcHRfbGlzdCwgdWludDhfdCBjb2RlKSBGQVNUX0ZVTkM7CisKKworLy8gUkZDIDIxMzEgIFRhYmxlIDU6IEZpZWxkcyBhbmQgb3B0aW9ucyB1c2VkIGJ5IERIQ1AgY2xpZW50cworLy8KKy8vIEZpZWxkcyAnaG9wcycsICd5aWFkZHInLCAnc2lhZGRyJywgJ2dpYWRkcicgYXJlIGFsd2F5cyB6ZXJvCisvLworLy8gRmllbGQgICAgICBESENQRElTQ09WRVIgICAgICAgICAgREhDUElORk9STSAgICAgICAgICAgIERIQ1BSRVFVRVNUICAgICAgICAgICBESENQREVDTElORSAgICAgICAgIERIQ1BSRUxFQVNFCisvLyAtLS0tLSAgICAgIC0tLS0tLS0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0gICAgICAgICAgIC0tLS0tLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLS0KKy8vICd4aWQnICAgICAgc2VsZWN0ZWQgYnkgY2xpZW50ICAgIHNlbGVjdGVkIGJ5IGNsaWVudCAgICAneGlkJyBmcm9tIHNlcnZlciAgICAgc2VsZWN0ZWQgYnkgY2xpZW50ICBzZWxlY3RlZCBieSBjbGllbnQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESENQT0ZGRVIgbWVzc2FnZQorLy8gJ3NlY3MnICAgICAwIG9yIHNlY29uZHMgc2luY2UgICAgMCBvciBzZWNvbmRzIHNpbmNlICAgIDAgb3Igc2Vjb25kcyBzaW5jZSAgICAwICAgICAgICAgICAgICAgICAgIDAKKy8vICAgICAgICAgICAgREhDUCBwcm9jZXNzIHN0YXJ0ZWQgIERIQ1AgcHJvY2VzcyBzdGFydGVkICBESENQIHByb2Nlc3Mgc3RhcnRlZAorLy8gJ2ZsYWdzJyAgICBTZXQgJ0JST0FEQ0FTVCcgICAgICAgU2V0ICdCUk9BRENBU1QnICAgICAgIFNldCAnQlJPQURDQVNUJyAgICAgICAwICAgICAgICAgICAgICAgICAgIDAKKy8vICAgICAgICAgICAgZmxhZyBpZiBjbGllbnQgICAgICAgIGZsYWcgaWYgY2xpZW50ICAgICAgICBmbGFnIGlmIGNsaWVudAorLy8gICAgICAgICAgICByZXF1aXJlcyBicm9hZGNhc3QgICAgcmVxdWlyZXMgYnJvYWRjYXN0ICAgIHJlcXVpcmVzIGJyb2FkY2FzdAorLy8gICAgICAgICAgICByZXBseSAgICAgICAgICAgICAgICAgcmVwbHkgICAgICAgICAgICAgICAgIHJlcGx5CisvLyAnY2lhZGRyJyAgIDAgICAgICAgICAgICAgICAgICAgICBjbGllbnQncyBJUCAgICAgICAgICAgMCBvciBjbGllbnQncyBJUCAgICAgIDAgICAgICAgICAgICAgICAgICAgY2xpZW50J3MgSVAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQk9VTkQvUkVORVcvUkVCSU5EKQorLy8gJ2NoYWRkcicgICBjbGllbnQncyBNQUMgICAgICAgICAgY2xpZW50J3MgTUFDICAgICAgICAgIGNsaWVudCdzIE1BQyAgICAgICAgICBjbGllbnQncyBNQUMgICAgICAgIGNsaWVudCdzIE1BQworLy8gJ3NuYW1lJyAgICBvcHRpb25zIG9yIHNuYW1lICAgICAgb3B0aW9ucyBvciBzbmFtZSAgICAgIG9wdGlvbnMgb3Igc25hbWUgICAgICAodW51c2VkKSAgICAgICAgICAgICh1bnVzZWQpCisvLyAnZmlsZScgICAgIG9wdGlvbnMgb3IgZmlsZSAgICAgICBvcHRpb25zIG9yIGZpbGUgICAgICAgb3B0aW9ucyBvciBmaWxlICAgICAgICh1bnVzZWQpICAgICAgICAgICAgKHVudXNlZCkKKy8vICdvcHRpb25zJyAgb3B0aW9ucyAgICAgICAgICAgICAgIG9wdGlvbnMgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgICAgICAgbWVzc2FnZSB0eXBlIG9wdCAgICBtZXNzYWdlIHR5cGUgb3B0CisvLworLy8gT3B0aW9uICAgICAgICAgICAgICAgICAgICAgREhDUERJU0NPVkVSICBESENQSU5GT1JNICBESENQUkVRVUVTVCAgICAgIERIQ1BERUNMSU5FICBESENQUkVMRUFTRQorLy8gLS0tLS0tICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tICAtLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLQorLy8gUmVxdWVzdGVkIElQIGFkZHJlc3MgICAgICAgTUFZICAgICAgICAgICBNVVNUIE5PVCAgICBNVVNUIChpbiAgICAgICAgIE1VU1QgICAgICAgICBNVVNUIE5PVAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RJTkcgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVC1SRUJPT1QpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VU1QgTk9UIChpbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT1VORCBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU5FV0lORykKKy8vIElQIGFkZHJlc3MgbGVhc2UgdGltZSAgICAgIE1BWSAgICAgICAgICAgTVVTVCBOT1QgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIFVzZSAnZmlsZScvJ3NuYW1lJyBmaWVsZHMgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNQVkgICAgICAgICAgTUFZCisvLyBDbGllbnQgaWRlbnRpZmllciAgICAgICAgICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTUFZICAgICAgICAgIE1BWQorLy8gVmVuZG9yIGNsYXNzIGlkZW50aWZpZXIgICAgTUFZICAgICAgICAgICBNQVkgICAgICAgICBNQVkgICAgICAgICAgICAgIE1VU1QgTk9UICAgICBNVVNUIE5PVAorLy8gU2VydmVyIGlkZW50aWZpZXIgICAgICAgICAgTVVTVCBOT1QgICAgICBNVVNUIE5PVCAgICBNVVNUIChhZnRlciAgICAgIE1VU1QgICAgICAgICBNVVNUCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVElORykKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVTVCBOT1QgKGFmdGVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVQtUkVCT09ULAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT1VORCwgUkVORVdJTkcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgUkVCSU5ESU5HKQorLy8gUGFyYW1ldGVyIHJlcXVlc3QgbGlzdCAgICAgTUFZICAgICAgICAgICBNQVkgICAgICAgICBNQVkgICAgICAgICAgICAgIE1VU1QgTk9UICAgICBNVVNUIE5PVAorLy8gTWF4aW11bSBtZXNzYWdlIHNpemUgICAgICAgTUFZICAgICAgICAgICBNQVkgICAgICAgICBNQVkgICAgICAgICAgICAgIE1VU1QgTk9UICAgICBNVVNUIE5PVAorLy8gTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgU0hPVUxEIE5PVCAgICBTSE9VTEQgTk9UICBTSE9VTEQgTk9UICAgICAgIFNIT1VMRCAgICAgICBTSE9VTEQKKy8vIFNpdGUtc3BlY2lmaWMgICAgICAgICAgICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIEFsbCBvdGhlcnMgICAgICAgICAgICAgICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKworCisvKioqIExvZ2dpbmcgKioqLworCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKK2V4dGVybiB1bnNpZ25lZCBkaGNwX3ZlcmJvc2U7CisjIGRlZmluZSBsb2cxKC4uLikgZG8geyBpZiAoZGhjcF92ZXJib3NlID49IDEpIGJiX2luZm9fbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyMgaWYgQ09ORklHX1VESENQX0RFQlVHID49IDIKK3ZvaWQgdWRoY3BfZHVtcF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpIEZBU1RfRlVOQzsKKyMgIGRlZmluZSBsb2cyKC4uLikgZG8geyBpZiAoZGhjcF92ZXJib3NlID49IDIpIGJiX2luZm9fbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgZGVmaW5lIHVkaGNwX2R1bXBfcGFja2V0KC4uLikgKCh2b2lkKTApCisjICBkZWZpbmUgbG9nMiguLi4pICgodm9pZCkwKQorIyBlbmRpZgorIyBpZiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMworIyAgZGVmaW5lIGxvZzMoLi4uKSBkbyB7IGlmIChkaGNwX3ZlcmJvc2UgPj0gMykgYmJfaW5mb19tc2coX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorIyBlbHNlCisjICBkZWZpbmUgbG9nMyguLi4pICgodm9pZCkwKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIHVkaGNwX2R1bXBfcGFja2V0KC4uLikgKCh2b2lkKTApCisjIGRlZmluZSBsb2cxKC4uLikgKCh2b2lkKTApCisjIGRlZmluZSBsb2cyKC4uLikgKCh2b2lkKTApCisjIGRlZmluZSBsb2czKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworCisvKioqIE90aGVyIHNoYXJlZCBmdW5jdGlvbnMgKioqLworCisvKiAybmQgcGFyYW0gaXMgInVpbnQzMl90KiIgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3RyMm5pcChjb25zdCBjaGFyICpzdHIsIHZvaWQgKmFyZyk7CisvKiAybmQgcGFyYW0gaXMgInN0cnVjdCBvcHRpb25fc2V0KioiICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX3N0cjJvcHRzZXQoY29uc3QgY2hhciAqc3RyLCB2b2lkICphcmcpOworCit1aW50MTZfdCB1ZGhjcF9jaGVja3N1bSh2b2lkICphZGRyLCBpbnQgY291bnQpIEZBU1RfRlVOQzsKKwordm9pZCB1ZGhjcF9pbml0X2hlYWRlcihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgY2hhciB0eXBlKSBGQVNUX0ZVTkM7CisKK2ludCB1ZGhjcF9yZWN2X2tlcm5lbF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGludCBmZCkgRkFTVF9GVU5DOworCitpbnQgdWRoY3Bfc2VuZF9yYXdfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsCisJCXVpbnQzMl90IHNvdXJjZV9uaXAsIGludCBzb3VyY2VfcG9ydCwKKwkJdWludDMyX3QgZGVzdF9uaXAsIGludCBkZXN0X3BvcnQsIGNvbnN0IHVpbnQ4X3QgKmRlc3RfYXJwLAorCQlpbnQgaWZpbmRleCkgRkFTVF9GVU5DOworCitpbnQgdWRoY3Bfc2VuZF9rZXJuZWxfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsCisJCXVpbnQzMl90IHNvdXJjZV9uaXAsIGludCBzb3VyY2VfcG9ydCwKKwkJdWludDMyX3QgZGVzdF9uaXAsIGludCBkZXN0X3BvcnQpIEZBU1RfRlVOQzsKKwordm9pZCB1ZGhjcF9zcF9zZXR1cCh2b2lkKSBGQVNUX0ZVTkM7CitpbnQgdWRoY3Bfc3BfZmRfc2V0KGZkX3NldCAqcmZkcywgaW50IGV4dHJhX2ZkKSBGQVNUX0ZVTkM7CitpbnQgdWRoY3Bfc3BfcmVhZChjb25zdCBmZF9zZXQgKnJmZHMpIEZBU1RfRlVOQzsKKworaW50IHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmludGVyZmFjZSwgaW50ICppZmluZGV4LCB1aW50MzJfdCAqbmlwLCB1aW50OF90ICptYWMpIEZBU1RfRlVOQzsKKworaW50IHVkaGNwX2xpc3Rlbl9zb2NrZXQoLyp1aW50MzJfdCBpcCwqLyBpbnQgcG9ydCwgY29uc3QgY2hhciAqaW5mKSBGQVNUX0ZVTkM7CisKKy8qIFJldHVybnMgMSBpZiBubyByZXBseSByZWNlaXZlZCAqLworaW50IGFycHBpbmcodWludDMyX3QgdGVzdF9uaXAsCisJCWNvbnN0IHVpbnQ4X3QgKnNhZmVfbWFjLAorCQl1aW50MzJfdCBmcm9tX2lwLAorCQl1aW50OF90ICpmcm9tX21hYywKKwkJY29uc3QgY2hhciAqaW50ZXJmYWNlKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODdkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3BjLmMKQEAgLTAsMCArMSwxNjMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1ZGhjcCBjbGllbnQKKyAqCisgKiBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPHN5c2xvZy5oPgorLyogT3ZlcnJpZGUgRU5BQkxFX0ZFQVRVUkVfUElERklMRSAtIGlmdXBkb3duIG5lZWRzIG91ciBwaWRmaWxlIHRvIGFsd2F5cyBleGlzdCAqLworI2RlZmluZSBXQU5UX1BJREZJTEUgMQorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisjaW5jbHVkZSAiZGhjcGMuaCIKKworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKKy8qIHN0cnVjdCBjbGllbnRfY29uZmlnX3QgY2xpZW50X2NvbmZpZyBpcyBpbiBiYl9jb21tb25fYnVmc2l6MSAqLworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIGNvbnN0IGNoYXIgdWRoY3BjX2xvbmdvcHRzW10gQUxJR04xID0KKwkiY2xpZW50aWQtbm9uZVwwIiAgTm9fYXJndW1lbnQgICAgICAgIkMiCisJInZlbmRvcmNsYXNzXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJWIgorCSJob3N0bmFtZVwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiSCIKKwkiZnFkblwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkYiCisJImludGVyZmFjZVwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJpIgorCSJub3dcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAibiIKKwkicGlkZmlsZVwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInAiCisJInF1aXRcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCSJyZWxlYXNlXDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkicmVxdWVzdFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInIiCisJInNjcmlwdFwwIiAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJzIgorCSJ0aW1lb3V0XDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiVCIKKwkidmVyc2lvblwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJInJldHJpZXNcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJ0cnlhZ2FpblwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiQSIKKwkic3lzbG9nXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlMiCisJInJlcXVlc3Qtb3B0aW9uXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJPIgorCSJuby1kZWZhdWx0LW9wdGlvbnNcMCIgTm9fYXJndW1lbnQgICAibyIKKwkiZm9yZWdyb3VuZFwwIiAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJImJhY2tncm91bmRcMCIgICAgIE5vX2FyZ3VtZW50ICAgICAgICJiIgorCSJicm9hZGNhc3RcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiQiIKKwlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoImFycGluZ1wwIglOb19hcmd1bWVudCAgICAgICAiYSIpCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKCJjbGllbnQtcG9ydFwwIglSZXF1aXJlZF9hcmd1bWVudCAiUCIpCisJOworI2VuZGlmCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIG9wdGlvbiBzdHJpbmcgb3JkZXIgKi8KK2VudW0geworCU9QVF9DID0gMSA8PCAwLAorCU9QVF9WID0gMSA8PCAxLAorCU9QVF9IID0gMSA8PCAyLAorCU9QVF9oID0gMSA8PCAzLAorCU9QVF9GID0gMSA8PCA0LAorCU9QVF9pID0gMSA8PCA1LAorCU9QVF9uID0gMSA8PCA2LAorCU9QVF9wID0gMSA8PCA3LAorCU9QVF9xID0gMSA8PCA4LAorCU9QVF9SID0gMSA8PCA5LAorCU9QVF9yID0gMSA8PCAxMCwKKwlPUFRfcyA9IDEgPDwgMTEsCisJT1BUX1QgPSAxIDw8IDEyLAorCU9QVF90ID0gMSA8PCAxMywKKwlPUFRfUyA9IDEgPDwgMTQsCisJT1BUX0EgPSAxIDw8IDE1LAorCU9QVF9PID0gMSA8PCAxNiwKKwlPUFRfbyA9IDEgPDwgMTcsCisJT1BUX3ggPSAxIDw8IDE4LAorCU9QVF9mID0gMSA8PCAxOSwKKwlPUFRfQiA9IDEgPDwgMjAsCisvKiBUaGUgcmVzdCBoYXMgdmFyaWFibGUgYml0IHBvc2l0aW9ucywgbmVlZCB0byBiZSBjbGV2ZXIgKi8KKwlPUFRCSVRfQiA9IDIwLAorCVVTRV9GT1JfTU1VKCAgICAgICAgICAgICBPUFRCSVRfYiwpCisJSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKE9QVEJJVF9hLCkKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoICAgT1BUQklUX1AsKQorCVVTRV9GT1JfTU1VKCAgICAgICAgICAgICBPUFRfYiA9IDEgPDwgT1BUQklUX2IsKQorCUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORyhPUFRfYSA9IDEgPDwgT1BUQklUX2EsKQorCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCggICBPUFRfUCA9IDEgPDwgT1BUQklUX1AsKQorfTsKKworCisvKioqIFNjcmlwdCBleGVjdXRpb24gY29kZSAqKiovCisKKy8qIGdldCBhIHJvdWdoIGlkZWEgb2YgaG93IGxvbmcgYW4gb3B0aW9uIHdpbGwgYmUgKHJvdW5kaW5nIHVwLi4uKSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGVuX29mX29wdGlvbl9hc19zdHJpbmdbXSA9IHsKKwlbT1BUSU9OX0lQICAgICAgICAgICAgICBdID0gc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUgIiksCisJW09QVElPTl9JUF9QQUlSICAgICAgICAgXSA9IHNpemVvZigiMjU1LjI1NS4yNTUuMjU1ICIpICogMiwKKwlbT1BUSU9OX1NUQVRJQ19ST1VURVMgICBdID0gc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUvMzIgMjU1LjI1NS4yNTUuMjU1ICIpLAorCVtPUFRJT05fU1RSSU5HICAgICAgICAgIF0gPSAxLAorCVtPUFRJT05fU1RSSU5HX0hPU1QgICAgIF0gPSAxLAorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwlbT1BUSU9OX0ROU19TVFJJTkcgICAgICBdID0gMSwgLyogdW51c2VkICovCisJLyogSG1tbSwgdGhpcyBzZXZlcmVseSBvdmVyZXN0aW1hdGVzIHNpemUgaWYgU0lQX1NFUlZFUlMgb3B0aW9uCisJICogaXMgaW4gZG9tYWluIG5hbWUgZm9ybTogTi1ieXRlIG9wdGlvbiBpbiBiaW5hcnkgZm9ybQorCSAqIG1hbGxvY3MgfjE2Kk4gYnl0ZXMuIEJ1dCBpdCBpcyBmcmVlZCBhbG1vc3QgYXQgb25jZS4KKwkgKi8KKwlbT1BUSU9OX1NJUF9TRVJWRVJTICAgICBdID0gc2l6ZW9mKCIyNTUuMjU1LjI1NS4yNTUgIiksCisjZW5kaWYKKy8vCVtPUFRJT05fQk9PTEVBTiAgICAgICAgIF0gPSBzaXplb2YoInllcyAiKSwKKwlbT1BUSU9OX1U4ICAgICAgICAgICAgICBdID0gc2l6ZW9mKCIyNTUgIiksCisJW09QVElPTl9VMTYgICAgICAgICAgICAgXSA9IHNpemVvZigiNjU1MzUgIiksCisvLwlbT1BUSU9OX1MxNiAgICAgICAgICAgICBdID0gc2l6ZW9mKCItMzI3NjggIiksCisJW09QVElPTl9VMzIgICAgICAgICAgICAgXSA9IHNpemVvZigiNDI5NDk2NzI5NSAiKSwKKwlbT1BUSU9OX1MzMiAgICAgICAgICAgICBdID0gc2l6ZW9mKCItMjE0NzQ4MzY4NCAiKSwKK307CisKKy8qIG5vdGU6IGlwIGlzIGEgcG9pbnRlciB0byBhbiBJUCBpbiBuZXR3b3JrIG9yZGVyLCBwb3NzaWJseSBtaXNhbGlnZWQgKi8KK3N0YXRpYyBpbnQgc3ByaW50X25pcChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpwcmUsIGNvbnN0IHVpbnQ4X3QgKmlwKQoreworCXJldHVybiBzcHJpbnRmKGRlc3QsICIlcyV1LiV1LiV1LiV1IiwgcHJlLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7Cit9CisKKy8qIHJlYWxseSBzaW1wbGUgaW1wbGVtZW50YXRpb24sIGp1c3QgY291bnQgdGhlIGJpdHMgKi8KK3N0YXRpYyBpbnQgbXRvbih1aW50MzJfdCBtYXNrKQoreworCWludCBpID0gMDsKKwltYXNrID0gbnRvaGwobWFzayk7IC8qIDExMTExMDAwMC1saWtlIGJpdCBwYXR0ZXJuICovCisJd2hpbGUgKG1hc2spIHsKKwkJaSsrOworCQltYXNrIDw8PSAxOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogQ2hlY2sgaWYgYSBnaXZlbiBsYWJlbCByZXByZXNlbnRzIGEgdmFsaWQgRE5TIGxhYmVsCisgKiBSZXR1cm4gcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYWJlbCB1cG9uIHN1Y2Nlc3MsCisgKiBOVUxMIG90aGVyd2lzZS4KKyAqIFNlZSBSRkMxMDM1LCAyLjMuMQorICovCisvKiBXZSBkb24ndCBuZWVkIHRvIGJlIHBhcnRpY3VsYXJseSBhbmFsLiBGb3IgZXhhbXBsZSwgYWxsb3dpbmcgXywgaHlwaGVuCisgKiBhdCB0aGUgZW5kLCBvciBsZWFkaW5nIGFuZCB0cmFpbGluZyBkb3RzIHdvdWxkIGJlIG9rLCBzaW5jZSBpdAorICogY2FuJ3QgYmUgdXNlZCBmb3IgYXR0YWNrcy4gKExlYWRpbmcgaHlwaGVuIGNhbiBiZSwgaWYgc29tZW9uZSB1c2VzCisgKiBjbWQgIiRob3N0bmFtZSIKKyAqIGluIHRoZSBzY3JpcHQ6IHRoZW4gaG9zdG5hbWUgbWF5IGJlIHRyZWF0ZWQgYXMgYW4gb3B0aW9uKQorICovCitzdGF0aWMgY29uc3QgY2hhciAqdmFsaWRfZG9tYWluX2xhYmVsKGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJdW5zaWduZWQgcG9zID0gMDsKKworCWZvciAoOzspIHsKKwkJY2ggPSAqbGFiZWw7CisJCWlmICgoY2h8MHgyMCkgPCAnYScgfHwgKGNofDB4MjApID4gJ3onKSB7CisJCQlpZiAocG9zID09IDApIHsKKwkJCQkvKiBsYWJlbCBtdXN0IGJlZ2luIHdpdGggbGV0dGVyICovCisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsKKwkJCQlpZiAoY2ggPT0gJ1wwJyB8fCBjaCA9PSAnLicpCisJCQkJCXJldHVybiBsYWJlbDsKKwkJCQkvKiBETlMgYWxsb3dzIG9ubHkgJy0nLCBidXQgd2UgYXJlIG1vcmUgcGVybWlzc2l2ZSAqLworCQkJCWlmIChjaCAhPSAnLScgJiYgY2ggIT0gJ18nKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlsYWJlbCsrOworCQlwb3MrKzsKKwkJLy9EbyB3ZSB3YW50IHRoaXM/CisJCS8vaWYgKHBvcyA+IDYzKSAvKiBOU19NQVhMQUJFTDsgbGFiZWxzIG11c3QgYmUgNjMgY2hhcnMgb3IgbGVzcyAqLworCQkvLwlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qIENoZWNrIGlmIGEgZ2l2ZW4gbmFtZSByZXByZXNlbnRzIGEgdmFsaWQgRE5TIG5hbWUgKi8KKy8qIFNlZSBSRkMxMDM1LCAyLjMuMSAqLworc3RhdGljIGludCBnb29kX2hvc3RuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLy9jb25zdCBjaGFyICpzdGFydCA9IG5hbWU7CisKKwlmb3IgKDs7KSB7CisJCW5hbWUgPSB2YWxpZF9kb21haW5fbGFiZWwobmFtZSk7CisJCWlmICghbmFtZSkKKwkJCXJldHVybiAwOworCQlpZiAoIW5hbWVbMF0pCisJCQlyZXR1cm4gMTsKKwkJCS8vRG8gd2Ugd2FudCB0aGlzPworCQkJLy9yZXR1cm4gKChuYW1lIC0gc3RhcnQpIDwgMTAyNSk7IC8qIE5TX01BWEROQU1FICovCisJCW5hbWUrKzsKKwl9Cit9CisKKy8qIENyZWF0ZSAib3B0X25hbWU9b3B0X3ZhbHVlIiBzdHJpbmcgKi8KK3N0YXRpYyBOT0lOTElORSBjaGFyICp4bWFsbG9jX29wdG5hbWVfb3B0dmFsKHVpbnQ4X3QgKm9wdGlvbiwgY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqb3B0ZmxhZywgY29uc3QgY2hhciAqb3B0X25hbWUpCit7CisJdW5zaWduZWQgdXBwZXJfbGVuZ3RoOworCWludCBsZW4sIHR5cGUsIG9wdGxlbjsKKwljaGFyICpkZXN0LCAqcmV0OworCisJLyogb3B0aW9uIHBvaW50cyB0byBPUFRfREFUQSwgbmVlZCB0byBnbyBiYWNrIHRvIGdldCBPUFRfTEVOICovCisJbGVuID0gb3B0aW9uWy1PUFRfREFUQSArIE9QVF9MRU5dOworCisJdHlwZSA9IG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSzsKKwlvcHRsZW4gPSBkaGNwX29wdGlvbl9sZW5ndGhzW3R5cGVdOworCXVwcGVyX2xlbmd0aCA9IGxlbl9vZl9vcHRpb25fYXNfc3RyaW5nW3R5cGVdCisJCSogKCh1bnNpZ25lZCkobGVuICsgb3B0bGVuIC0gMSkgLyAodW5zaWduZWQpb3B0bGVuKTsKKworCWRlc3QgPSByZXQgPSB4bWFsbG9jKHVwcGVyX2xlbmd0aCArIHN0cmxlbihvcHRfbmFtZSkgKyAyKTsKKwlkZXN0ICs9IHNwcmludGYocmV0LCAiJXM9Iiwgb3B0X25hbWUpOworCisJd2hpbGUgKGxlbiA+PSBvcHRsZW4pIHsKKwkJdW5zaWduZWQgaXBfb2ZzID0gMDsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBPUFRJT05fSVBfUEFJUjoKKwkJCWRlc3QgKz0gc3ByaW50X25pcChkZXN0LCAiIiwgb3B0aW9uKTsKKwkJCSpkZXN0KysgPSAnLyc7CisJCQlpcF9vZnMgPSA0OworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgT1BUSU9OX0lQOgorCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsICIiLCBvcHRpb24gKyBpcF9vZnMpOworCQkJYnJlYWs7CisvLwkJY2FzZSBPUFRJT05fQk9PTEVBTjoKKy8vCQkJZGVzdCArPSBzcHJpbnRmKGRlc3QsICpvcHRpb24gPyAieWVzIiA6ICJubyIpOworLy8JCQlicmVhazsKKwkJY2FzZSBPUFRJT05fVTg6CisJCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgIiV1IiwgKm9wdGlvbik7CisJCQlicmVhazsKKy8vCQljYXNlIE9QVElPTl9TMTY6CisJCWNhc2UgT1BUSU9OX1UxNjogeworCQkJdWludDE2X3QgdmFsX3UxNjsKKwkJCW1vdmVfZnJvbV91bmFsaWduZWQxNih2YWxfdTE2LCBvcHRpb24pOworCQkJZGVzdCArPSBzcHJpbnRmKGRlc3QsICIldSIsIG50b2hzKHZhbF91MTYpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT1BUSU9OX1MzMjoKKwkJY2FzZSBPUFRJT05fVTMyOiB7CisJCQl1aW50MzJfdCB2YWxfdTMyOworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHZhbF91MzIsIG9wdGlvbik7CisJCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgdHlwZSA9PSBPUFRJT05fVTMyID8gIiVsdSIgOiAiJWxkIiwgKHVuc2lnbmVkIGxvbmcpIG50b2hsKHZhbF91MzIpKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIE5vdGU6IG9wdGlvbnMgd2hpY2ggdXNlICdyZXR1cm4nIGluc3RlYWQgb2YgJ2JyZWFrJworCQkgKiAoZm9yIGV4YW1wbGUsIE9QVElPTl9TVFJJTkcpIHNraXAgdGhlIGNvZGUgd2hpY2ggaGFuZGxlcworCQkgKiB0aGUgY2FzZSBvZiBsaXN0IG9mIG9wdGlvbnMuCisJCSAqLworCQljYXNlIE9QVElPTl9TVFJJTkc6CisJCWNhc2UgT1BUSU9OX1NUUklOR19IT1NUOgorCQkJbWVtY3B5KGRlc3QsIG9wdGlvbiwgbGVuKTsKKwkJCWRlc3RbbGVuXSA9ICdcMCc7CisJCQlpZiAodHlwZSA9PSBPUFRJT05fU1RSSU5HX0hPU1QgJiYgIWdvb2RfaG9zdG5hbWUoZGVzdCkpCisJCQkJc2FmZV9zdHJuY3B5KGRlc3QsICJiYWQiLCBsZW4pOworCQkJcmV0dXJuIHJldDsKKwkJY2FzZSBPUFRJT05fU1RBVElDX1JPVVRFUzogeworCQkJLyogT3B0aW9uIGJpbmFyeSBmb3JtYXQ6CisJCQkgKiBtYXNrIFtvbmUgYnl0ZSwgMC4uMzJdCisJCQkgKiBpcCBbYmlnIGVuZGlhbiwgMC4uNCBieXRlcyBkZXBlbmRpbmcgb24gbWFza10KKwkJCSAqIHJvdXRlciBbYmlnIGVuZGlhbiwgNCBieXRlc10KKwkJCSAqIG1heSBiZSByZXBlYXRlZAorCQkJICoKKwkJCSAqIFdlIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcgIklQL01BU0sgUk9VVEVSIElQMi9NQVNLMiBST1VURVIyIgorCQkJICovCisJCQljb25zdCBjaGFyICpwZnggPSAiIjsKKworCQkJd2hpbGUgKGxlbiA+PSAxICsgNCkgeyAvKiBtYXNrICsgMC1ieXRlIGlwICsgcm91dGVyICovCisJCQkJdWludDMyX3QgbmlwOworCQkJCXVpbnQ4X3QgKnA7CisJCQkJdW5zaWduZWQgbWFzazsKKwkJCQlpbnQgYnl0ZXM7CisKKwkJCQltYXNrID0gKm9wdGlvbisrOworCQkJCWlmIChtYXNrID4gMzIpCisJCQkJCWJyZWFrOworCQkJCWxlbi0tOworCisJCQkJbmlwID0gMDsKKwkJCQlwID0gKHZvaWQqKSAmbmlwOworCQkJCWJ5dGVzID0gKG1hc2sgKyA3KSAvIDg7IC8qIDAgLT4gMCwgMS4uOCAtPiAxLCA5Li4xNiAtPiAyIGV0YyAqLworCQkJCXdoaWxlICgtLWJ5dGVzID49IDApIHsKKwkJCQkJKnArKyA9ICpvcHRpb24rKzsKKwkJCQkJbGVuLS07CisJCQkJfQorCQkJCWlmIChsZW4gPCA0KQorCQkJCQlicmVhazsKKworCQkJCS8qIHByaW50IGlwL21hc2sgKi8KKwkJCQlkZXN0ICs9IHNwcmludF9uaXAoZGVzdCwgcGZ4LCAodm9pZCopICZuaXApOworCQkJCXBmeCA9ICIgIjsKKwkJCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgIi8ldSAiLCBtYXNrKTsKKwkJCQkvKiBwcmludCByb3V0ZXIgKi8KKwkJCQlkZXN0ICs9IHNwcmludF9uaXAoZGVzdCwgIiIsIG9wdGlvbik7CisJCQkJb3B0aW9uICs9IDQ7CisJCQkJbGVuIC09IDQ7CisJCQl9CisKKwkJCXJldHVybiByZXQ7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJCWNhc2UgT1BUSU9OX0ROU19TVFJJTkc6CisJCQkvKiB1bnBhY2sgb3B0aW9uIGludG8gZGVzdDsgdXNlIHJldCBmb3IgcHJlZml4IChpLmUuLCAib3B0bmFtZT0iKSAqLworCQkJZGVzdCA9IGRuYW1lX2RlYyhvcHRpb24sIGxlbiwgcmV0KTsKKwkJCWlmIChkZXN0KSB7CisJCQkJZnJlZShyZXQpOworCQkJCXJldHVybiBkZXN0OworCQkJfQorCQkJLyogZXJyb3IuIHJldHVybiAib3B0bmFtZT0iIHN0cmluZyAqLworCQkJcmV0dXJuIHJldDsKKwkJY2FzZSBPUFRJT05fU0lQX1NFUlZFUlM6CisJCQkvKiBPcHRpb24gYmluYXJ5IGZvcm1hdDoKKwkJCSAqIHR5cGU6IGJ5dGUKKwkJCSAqIHR5cGU9MDogZG9tYWluIG5hbWVzLCBkbnMtY29tcHJlc3NlZAorCQkJICogdHlwZT0xOiBJUCBhZGRycworCQkJICovCisJCQlvcHRpb24rKzsKKwkJCWxlbi0tOworCQkJaWYgKG9wdGlvblstMV0gPT0gMCkgeworCQkJCWRlc3QgPSBkbmFtZV9kZWMob3B0aW9uLCBsZW4sIHJldCk7CisJCQkJaWYgKGRlc3QpIHsKKwkJCQkJZnJlZShyZXQpOworCQkJCQlyZXR1cm4gZGVzdDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCWlmIChvcHRpb25bLTFdID09IDEpIHsKKwkJCQljb25zdCBjaGFyICpwZnggPSAiIjsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlsZW4gLT0gNDsKKwkJCQkJaWYgKGxlbiA8IDApCisJCQkJCQlicmVhazsKKwkJCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsIHBmeCwgb3B0aW9uKTsKKwkJCQkJcGZ4ID0gIiAiOworCQkJCQlvcHRpb24gKz0gNDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmV0OworI2VuZGlmCisJCX0gLyogc3dpdGNoICovCisKKwkJLyogSWYgd2UgYXJlIGhlcmUsIHRyeSB0byBmb3JtYXQgYW55IHJlbWFpbmluZyBkYXRhCisJCSAqIGluIHRoZSBvcHRpb24gYXMgYW5vdGhlciwgc2ltaWxhcmx5LWZvcm1hdHRlZCBvcHRpb24KKwkJICovCisJCW9wdGlvbiArPSBvcHRsZW47CisJCWxlbiAtPSBvcHRsZW47CisvLyBUT0RPOiBpdCBjYW4gYmUgYSBsaXN0IG9ubHkgaWYgKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX0xJU1QpLgorLy8gU2hvdWxkIHdlIGJhaWwgb3V0L3dhcm4gaWYgd2Ugc2VlIG11bHRpLWlwIG9wdGlvbiB3aGljaCBpcworLy8gbm90IGFsbG93ZWQgdG8gYmUgc3VjaCAoZm9yIGV4YW1wbGUsIERIQ1BfQlJPQURDQVNUKT8gLQorCQlpZiAobGVuIDwgb3B0bGVuIC8qIHx8ICEob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fTElTVCkgKi8pCisJCQlicmVhazsKKwkJKmRlc3QrKyA9ICcgJzsKKwkJKmRlc3QgPSAnXDAnOworCX0gLyogd2hpbGUgKi8KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHB1dCBhbGwgdGhlIHBhcmFtZXRlcnMgaW50byB0aGUgZW52aXJvbm1lbnQgKi8KK3N0YXRpYyBjaGFyICoqZmlsbF9lbnZwKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCWludCBlbnZjOworCWludCBpOworCWNoYXIgKiplbnZwLCAqKmN1cnI7CisJY29uc3QgY2hhciAqb3B0X25hbWU7CisJdWludDhfdCAqdGVtcDsKKwl1aW50OF90IG92ZXJsb2FkID0gMDsKKworI2RlZmluZSBCSVRNQVAgdW5zaWduZWQKKyNkZWZpbmUgQkJJVFMgKHNpemVvZihCSVRNQVApICogOCkKKyNkZWZpbmUgQk1BU0soaSkgKDEgPDwgKGkgJiAoc2l6ZW9mKEJJVE1BUCkgKiA4IC0gMSkpKQorI2RlZmluZSBGT1VORF9PUFRTKGkpIChmb3VuZF9vcHRzWyh1bnNpZ25lZClpIC8gQkJJVFNdKQorCUJJVE1BUCBmb3VuZF9vcHRzWzI1NiAvIEJCSVRTXTsKKworCW1lbXNldChmb3VuZF9vcHRzLCAwLCBzaXplb2YoZm91bmRfb3B0cykpOworCisJLyogV2UgbmVlZCA2IGVsZW1lbnRzIGZvcjoKKwkgKiAiaW50ZXJmYWNlPUlGQUNFIgorCSAqICJpcD1OLk4uTi5OIiBmcm9tIHBhY2tldC0+eWlhZGRyCisJICogInNpYWRkcj1JUCIgZnJvbSBwYWNrZXQtPnNpYWRkcl9uaXAgKHVubGVzcyAwKQorCSAqICJib290X2ZpbGU9RklMRSIgZnJvbSBwYWNrZXQtPmZpbGUgKHVubGVzcyBvdmVybG9hZGVkKQorCSAqICJzbmFtZT1TRVJWRVJfSE9TVE5BTUUiIGZyb20gcGFja2V0LT5zbmFtZSAodW5sZXNzIG92ZXJsb2FkZWQpCisJICogdGVybWluYXRpbmcgTlVMTAorCSAqLworCWVudmMgPSA2OworCS8qICsxIGVsZW1lbnQgZm9yIGVhY2ggb3B0aW9uLCArMiBmb3Igc3VibmV0IG9wdGlvbjogKi8KKwlpZiAocGFja2V0KSB7CisJCS8qIG5vdGU6IGRvIG5vdCBzZWFyY2ggZm9yICJwYWQiICgwKSBhbmQgImVuZCIgKDI1NSkgb3B0aW9ucyAqLworLy9UT0RPOiBjaGFuZ2UgbG9naWMgdG8gc2NhbiBwYWNrZXQgX29uY2VfCisJCWZvciAoaSA9IDE7IGkgPCAyNTU7IGkrKykgeworCQkJdGVtcCA9IHVkaGNwX2dldF9vcHRpb24ocGFja2V0LCBpKTsKKwkJCWlmICh0ZW1wKSB7CisJCQkJaWYgKGkgPT0gREhDUF9PUFRJT05fT1ZFUkxPQUQpCisJCQkJCW92ZXJsb2FkID0gKnRlbXA7CisJCQkJZWxzZSBpZiAoaSA9PSBESENQX1NVQk5FVCkKKwkJCQkJZW52YysrOyAvKiBmb3IgbXRvbiAqLworCQkJCWVudmMrKzsKKwkJCQkvKmlmIChpICE9IERIQ1BfTUVTU0FHRV9UWVBFKSovCisJCQkJRk9VTkRfT1BUUyhpKSB8PSBCTUFTSyhpKTsKKwkJCX0KKwkJfQorCX0KKwljdXJyID0gZW52cCA9IHh6YWxsb2Moc2l6ZW9mKGVudnBbMF0pICogZW52Yyk7CisKKwkqY3VyciA9IHhhc3ByaW50ZigiaW50ZXJmYWNlPSVzIiwgY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UpOworCXB1dGVudigqY3VycisrKTsKKworCWlmICghcGFja2V0KQorCQlyZXR1cm4gZW52cDsKKworCSpjdXJyID0geG1hbGxvYyhzaXplb2YoImlwPTI1NS4yNTUuMjU1LjI1NSIpKTsKKwlzcHJpbnRfbmlwKCpjdXJyLCAiaXA9IiwgKHVpbnQ4X3QgKikgJnBhY2tldC0+eWlhZGRyKTsKKwlwdXRlbnYoKmN1cnIrKyk7CisKKwlvcHRfbmFtZSA9IGRoY3Bfb3B0aW9uX3N0cmluZ3M7CisJaSA9IDA7CisJd2hpbGUgKCpvcHRfbmFtZSkgeworCQl1aW50OF90IGNvZGUgPSBkaGNwX29wdGZsYWdzW2ldLmNvZGU7CisJCUJJVE1BUCAqZm91bmRfcHRyID0gJkZPVU5EX09QVFMoY29kZSk7CisJCUJJVE1BUCBmb3VuZF9tYXNrID0gQk1BU0soY29kZSk7CisJCWlmICghKCpmb3VuZF9wdHIgJiBmb3VuZF9tYXNrKSkKKwkJCWdvdG8gbmV4dDsKKwkJKmZvdW5kX3B0ciAmPSB+Zm91bmRfbWFzazsgLyogbGVhdmUgb25seSB1bmtub3duIG9wdGlvbnMgKi8KKwkJdGVtcCA9IHVkaGNwX2dldF9vcHRpb24ocGFja2V0LCBjb2RlKTsKKwkJKmN1cnIgPSB4bWFsbG9jX29wdG5hbWVfb3B0dmFsKHRlbXAsICZkaGNwX29wdGZsYWdzW2ldLCBvcHRfbmFtZSk7CisJCXB1dGVudigqY3VycisrKTsKKwkJaWYgKGNvZGUgPT0gREhDUF9TVUJORVQpIHsKKwkJCS8qIFN1Ym5ldCBvcHRpb246IG1ha2UgdGhpbmdzIGxpa2UgIiRpcC8kbWFzayIgcG9zc2libGUgKi8KKwkJCXVpbnQzMl90IHN1Ym5ldDsKKwkJCW1vdmVfZnJvbV91bmFsaWduZWQzMihzdWJuZXQsIHRlbXApOworCQkJKmN1cnIgPSB4YXNwcmludGYoIm1hc2s9JWQiLCBtdG9uKHN1Ym5ldCkpOworCQkJcHV0ZW52KCpjdXJyKyspOworCQl9CisgbmV4dDoKKwkJb3B0X25hbWUgKz0gc3RybGVuKG9wdF9uYW1lKSArIDE7CisJCWkrKzsKKwl9CisJaWYgKHBhY2tldC0+c2lhZGRyX25pcCkgeworCQkqY3VyciA9IHhtYWxsb2Moc2l6ZW9mKCJzaWFkZHI9MjU1LjI1NS4yNTUuMjU1IikpOworCQlzcHJpbnRfbmlwKCpjdXJyLCAic2lhZGRyPSIsICh1aW50OF90ICopICZwYWNrZXQtPnNpYWRkcl9uaXApOworCQlwdXRlbnYoKmN1cnIrKyk7CisJfQorCWlmICghKG92ZXJsb2FkICYgRklMRV9GSUVMRCkgJiYgcGFja2V0LT5maWxlWzBdKSB7CisJCS8qIHdhdGNoIG91dCBmb3IgaW52YWxpZCBwYWNrZXRzICovCisJCSpjdXJyID0geGFzcHJpbnRmKCJib290X2ZpbGU9JS4iREhDUF9QS1RfRklMRV9MRU5fU1RSInMiLCBwYWNrZXQtPmZpbGUpOworCQlwdXRlbnYoKmN1cnIrKyk7CisJfQorCWlmICghKG92ZXJsb2FkICYgU05BTUVfRklFTEQpICYmIHBhY2tldC0+c25hbWVbMF0pIHsKKwkJLyogd2F0Y2ggb3V0IGZvciBpbnZhbGlkIHBhY2tldHMgKi8KKwkJKmN1cnIgPSB4YXNwcmludGYoInNuYW1lPSUuIkRIQ1BfUEtUX1NOQU1FX0xFTl9TVFIicyIsIHBhY2tldC0+c25hbWUpOworCQlwdXRlbnYoKmN1cnIrKyk7CisJfQorCS8qIEhhbmRsZSB1bmtub3duIG9wdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OykgeworCQlCSVRNQVAgYml0bWFwID0gRk9VTkRfT1BUUyhpKTsKKwkJaWYgKCFiaXRtYXApIHsKKwkJCWkgKz0gQkJJVFM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYml0bWFwICYgQk1BU0soaSkpIHsKKwkJCXVuc2lnbmVkIGxlbiwgb2ZzOworCisJCQl0ZW1wID0gdWRoY3BfZ2V0X29wdGlvbihwYWNrZXQsIGkpOworCQkJLyogdWRoY3BfZ2V0X29wdGlvbiByZXR1cm5zIHB0ciB0byBkYXRhIHBvcnRpb24sCisJCQkgKiBuZWVkIHRvIGdvIGJhY2sgdG8gZ2V0IGxlbgorCQkJICovCisJCQlsZW4gPSB0ZW1wWy1PUFRfREFUQSArIE9QVF9MRU5dOworCQkJKmN1cnIgPSB4bWFsbG9jKHNpemVvZigib3B0Tk5OPSIpICsgMSArIGxlbioyKTsKKwkJCW9mcyA9IHNwcmludGYoKmN1cnIsICJvcHQldT0iLCBpKTsKKwkJCWJpbjJoZXgoKmN1cnIgKyBvZnMsICh2b2lkKikgdGVtcCwgbGVuKVswXSA9ICdcMCc7CisJCQlwdXRlbnYoKmN1cnIrKyk7CisJCX0KKwkJaSsrOworCX0KKwlyZXR1cm4gZW52cDsKK30KKworLyogQ2FsbCBhIHNjcmlwdCB3aXRoIGEgcGFyIGZpbGUgYW5kIGVudiB2YXJzICovCitzdGF0aWMgdm9pZCB1ZGhjcF9ydW5fc2NyaXB0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKiplbnZwLCAqKmN1cnI7CisJY2hhciAqYXJndlszXTsKKworCWlmIChjbGllbnRfY29uZmlnLnNjcmlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwllbnZwID0gZmlsbF9lbnZwKHBhY2tldCk7CisKKwkvKiBjYWxsIHNjcmlwdCAqLworCWxvZzEoIkV4ZWN1dGluZyAlcyAlcyIsIGNsaWVudF9jb25maWcuc2NyaXB0LCBuYW1lKTsKKwlhcmd2WzBdID0gKGNoYXIqKSBjbGllbnRfY29uZmlnLnNjcmlwdDsKKwlhcmd2WzFdID0gKGNoYXIqKSBuYW1lOworCWFyZ3ZbMl0gPSBOVUxMOworCXNwYXduX2FuZF93YWl0KGFyZ3YpOworCisJZm9yIChjdXJyID0gZW52cDsgKmN1cnI7IGN1cnIrKykgeworCQlsb2cyKCIgJXMiLCAqY3Vycik7CisJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKCpjdXJyKTsKKwl9CisJZnJlZShlbnZwKTsKK30KKworCisvKioqIFNlbmRpbmcvcmVjZWl2aW5nIHBhY2tldHMgKioqLworCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCByYW5kb21feGlkKHZvaWQpCit7CisJcmV0dXJuIHJhbmQoKTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgcGFja2V0IHdpdGggdGhlIHByb3BlciBkZWZhdWx0cyAqLworc3RhdGljIHZvaWQgaW5pdF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGNoYXIgdHlwZSkKK3sKKwl1aW50MTZfdCBzZWNzOworCisJLyogRmlsbCBpbjogb3AsIGh0eXBlLCBobGVuLCBjb29raWUgZmllbGRzOyBtZXNzYWdlIHR5cGUgb3B0aW9uOiAqLworCXVkaGNwX2luaXRfaGVhZGVyKHBhY2tldCwgdHlwZSk7CisKKwlwYWNrZXQtPnhpZCA9IHJhbmRvbV94aWQoKTsKKworCWNsaWVudF9jb25maWcubGFzdF9zZWNzID0gbW9ub3RvbmljX3NlYygpOworCWlmIChjbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPT0gMCkKKwkJY2xpZW50X2NvbmZpZy5maXJzdF9zZWNzID0gY2xpZW50X2NvbmZpZy5sYXN0X3NlY3M7CisJc2VjcyA9IGNsaWVudF9jb25maWcubGFzdF9zZWNzIC0gY2xpZW50X2NvbmZpZy5maXJzdF9zZWNzOworCXBhY2tldC0+c2VjcyA9IGh0b25zKHNlY3MpOworCisJbWVtY3B5KHBhY2tldC0+Y2hhZGRyLCBjbGllbnRfY29uZmlnLmNsaWVudF9tYWMsIDYpOworCWlmIChjbGllbnRfY29uZmlnLmNsaWVudGlkKQorCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGNsaWVudF9jb25maWcuY2xpZW50aWQpOworfQorCitzdGF0aWMgdm9pZCBhZGRfY2xpZW50X29wdGlvbnMoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpCit7CisJdWludDhfdCBjOworCWludCBpLCBlbmQsIGxlbjsKKworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHBhY2tldCwgREhDUF9NQVhfU0laRSwgaHRvbnMoSVBfVURQX0RIQ1BfU0laRSkpOworCisJLyogQWRkIGEgInBhcmFtIHJlcSIgb3B0aW9uIHdpdGggdGhlIGxpc3Qgb2Ygb3B0aW9ucyB3ZSdkIGxpa2UgdG8gaGF2ZQorCSAqIGZyb20gc3R1YmJvcm4gREhDUCBzZXJ2ZXJzLiBQdWxsIHRoZSBkYXRhIGZyb20gdGhlIHN0cnVjdCBpbiBjb21tb24uYy4KKwkgKiBObyBib3VuZHMgY2hlY2tpbmcgYmVjYXVzZSBpdCBnb2VzIHRvd2FyZHMgdGhlIGhlYWQgb2YgdGhlIHBhY2tldC4gKi8KKwllbmQgPSB1ZGhjcF9lbmRfb3B0aW9uKHBhY2tldC0+b3B0aW9ucyk7CisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyAoYyA9IGRoY3Bfb3B0ZmxhZ3NbaV0uY29kZSkgIT0gMDsgaSsrKSB7CisJCWlmICgoICAgKGRoY3Bfb3B0ZmxhZ3NbaV0uZmxhZ3MgJiBPUFRJT05fUkVRKQorCQkgICAgICYmICFjbGllbnRfY29uZmlnLm5vX2RlZmF1bHRfb3B0aW9ucworCQkgICAgKQorCQkgfHwgKGNsaWVudF9jb25maWcub3B0X21hc2tbYyA+PiAzXSAmICgxIDw8IChjICYgNykpKQorCQkpIHsKKwkJCXBhY2tldC0+b3B0aW9uc1tlbmQgKyBPUFRfREFUQSArIGxlbl0gPSBjOworCQkJbGVuKys7CisJCX0KKwl9CisJaWYgKGxlbikgeworCQlwYWNrZXQtPm9wdGlvbnNbZW5kICsgT1BUX0NPREVdID0gREhDUF9QQVJBTV9SRVE7CisJCXBhY2tldC0+b3B0aW9uc1tlbmQgKyBPUFRfTEVOXSA9IGxlbjsKKwkJcGFja2V0LT5vcHRpb25zW2VuZCArIE9QVF9EQVRBICsgbGVuXSA9IERIQ1BfRU5EOworCX0KKworCWlmIChjbGllbnRfY29uZmlnLnZlbmRvcmNsYXNzKQorCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGNsaWVudF9jb25maWcudmVuZG9yY2xhc3MpOworCWlmIChjbGllbnRfY29uZmlnLmhvc3RuYW1lKQorCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGNsaWVudF9jb25maWcuaG9zdG5hbWUpOworCWlmIChjbGllbnRfY29uZmlnLmZxZG4pCisJCXVkaGNwX2FkZF9iaW5hcnlfb3B0aW9uKHBhY2tldCwgY2xpZW50X2NvbmZpZy5mcWRuKTsKKworCS8qIFJlcXVlc3QgYnJvYWRjYXN0IHJlcGxpZXMgaWYgd2UgaGF2ZSBubyBJUCBhZGRyICovCisJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX0IpICYmIHBhY2tldC0+Y2lhZGRyID09IDApCisJCXBhY2tldC0+ZmxhZ3MgfD0gaHRvbnMoQlJPQURDQVNUX0ZMQUcpOworCisJLyogQWRkIC14IG9wdGlvbnMgaWYgYW55ICovCisJeworCQlzdHJ1Y3Qgb3B0aW9uX3NldCAqY3VyciA9IGNsaWVudF9jb25maWcub3B0aW9uczsKKwkJd2hpbGUgKGN1cnIpIHsKKwkJCXVkaGNwX2FkZF9iaW5hcnlfb3B0aW9uKHBhY2tldCwgY3Vyci0+ZGF0YSk7CisJCQljdXJyID0gY3Vyci0+bmV4dDsKKwkJfQorLy8JCWlmIChjbGllbnRfY29uZmlnLnNuYW1lKQorLy8JCQlzdHJuY3B5KChjaGFyKilwYWNrZXQtPnNuYW1lLCBjbGllbnRfY29uZmlnLnNuYW1lLCBzaXplb2YocGFja2V0LT5zbmFtZSkgLSAxKTsKKy8vCQlpZiAoY2xpZW50X2NvbmZpZy5ib290X2ZpbGUpCisvLwkJCXN0cm5jcHkoKGNoYXIqKXBhY2tldC0+ZmlsZSwgY2xpZW50X2NvbmZpZy5ib290X2ZpbGUsIHNpemVvZihwYWNrZXQtPmZpbGUpIC0gMSk7CisJfQorfQorCisvKiBSRkMgMjEzMQorICogNC40LjQgVXNlIG9mIGJyb2FkY2FzdCBhbmQgdW5pY2FzdAorICoKKyAqIFRoZSBESENQIGNsaWVudCBicm9hZGNhc3RzIERIQ1BESVNDT1ZFUiwgREhDUFJFUVVFU1QgYW5kIERIQ1BJTkZPUk0KKyAqIG1lc3NhZ2VzLCB1bmxlc3MgdGhlIGNsaWVudCBrbm93cyB0aGUgYWRkcmVzcyBvZiBhIERIQ1Agc2VydmVyLgorICogVGhlIGNsaWVudCB1bmljYXN0cyBESENQUkVMRUFTRSBtZXNzYWdlcyB0byB0aGUgc2VydmVyLiBCZWNhdXNlCisgKiB0aGUgY2xpZW50IGlzIGRlY2xpbmluZyB0aGUgdXNlIG9mIHRoZSBJUCBhZGRyZXNzIHN1cHBsaWVkIGJ5IHRoZSBzZXJ2ZXIsCisgKiB0aGUgY2xpZW50IGJyb2FkY2FzdHMgREhDUERFQ0xJTkUgbWVzc2FnZXMuCisgKgorICogV2hlbiB0aGUgREhDUCBjbGllbnQga25vd3MgdGhlIGFkZHJlc3Mgb2YgYSBESENQIHNlcnZlciwgaW4gZWl0aGVyCisgKiBJTklUIG9yIFJFQk9PVElORyBzdGF0ZSwgdGhlIGNsaWVudCBtYXkgdXNlIHRoYXQgYWRkcmVzcworICogaW4gdGhlIERIQ1BESVNDT1ZFUiBvciBESENQUkVRVUVTVCByYXRoZXIgdGhhbiB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MuCisgKiBUaGUgY2xpZW50IG1heSBhbHNvIHVzZSB1bmljYXN0IHRvIHNlbmQgREhDUElORk9STSBtZXNzYWdlcworICogdG8gYSBrbm93biBESENQIHNlcnZlci4gSWYgdGhlIGNsaWVudCByZWNlaXZlcyBubyByZXNwb25zZSB0byBESENQCisgKiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJUCBhZGRyZXNzIG9mIGEga25vd24gREhDUCBzZXJ2ZXIsIHRoZSBESENQCisgKiBjbGllbnQgcmV2ZXJ0cyB0byB1c2luZyB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MuCisgKi8KKworc3RhdGljIGludCByYXdfYmNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpCit7CisJcmV0dXJuIHVkaGNwX3NlbmRfcmF3X3BhY2tldChwYWNrZXQsCisJCS8qc3JjKi8gSU5BRERSX0FOWSwgQ0xJRU5UX1BPUlQsCisJCS8qZHN0Ki8gSU5BRERSX0JST0FEQ0FTVCwgU0VSVkVSX1BPUlQsIE1BQ19CQ0FTVF9BRERSLAorCQljbGllbnRfY29uZmlnLmlmaW5kZXgpOworfQorCisvKiBCcm9hZGNhc3QgYSBESENQIGRpc2NvdmVyIHBhY2tldCB0byB0aGUgbmV0d29yaywgd2l0aCBhbiBvcHRpb25hbGx5IHJlcXVlc3RlZCBJUCAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZW5kX2Rpc2NvdmVyKHVpbnQzMl90IHhpZCwgdWludDMyX3QgcmVxdWVzdGVkKQoreworCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisKKwkvKiBGaWxsIGluOiBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSwgY2hhZGRyIGZpZWxkcywKKwkgKiByYW5kb20geGlkIGZpZWxkICh3ZSBvdmVycmlkZSBpdCBiZWxvdyksCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQRElTQ09WRVIpOworCisJcGFja2V0LnhpZCA9IHhpZDsKKwlpZiAocmVxdWVzdGVkKQorCQl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX1JFUVVFU1RFRF9JUCwgcmVxdWVzdGVkKTsKKworCS8qIEFkZCBvcHRpb25zOiBtYXhzaXplLAorCSAqIG9wdGlvbmFsbHk6IGhvc3RuYW1lLCBmcWRuLCB2ZW5kb3JjbGFzcywKKwkgKiAicGFyYW0gcmVxIiBvcHRpb24gYWNjb3JkaW5nIHRvIC1PLCBvcHRpb25zIHNwZWNpZmllZCB3aXRoIC14CisJICovCisJYWRkX2NsaWVudF9vcHRpb25zKCZwYWNrZXQpOworCisJYmJfaW5mb19tc2coIlNlbmRpbmcgZGlzY292ZXIuLi4iKTsKKwlyZXR1cm4gcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQpOworfQorCisvKiBCcm9hZGNhc3QgYSBESENQIHJlcXVlc3QgbWVzc2FnZSAqLworLyogUkZDIDIxMzEgMy4xIHBhcmFncmFwaCAzOgorICogIlRoZSBjbGllbnQgX2Jyb2FkY2FzdHNfIGEgREhDUFJFUVVFU1QgbWVzc2FnZS4uLiIKKyAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZW5kX3NlbGVjdCh1aW50MzJfdCB4aWQsIHVpbnQzMl90IHNlcnZlciwgdWludDMyX3QgcmVxdWVzdGVkKQoreworCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKworLyoKKyAqIFJGQyAyMTMxIDQuMy4yIERIQ1BSRVFVRVNUIG1lc3NhZ2UKKyAqIC4uLgorICogSWYgdGhlIERIQ1BSRVFVRVNUIG1lc3NhZ2UgY29udGFpbnMgYSAnc2VydmVyIGlkZW50aWZpZXInCisgKiBvcHRpb24sIHRoZSBtZXNzYWdlIGlzIGluIHJlc3BvbnNlIHRvIGEgREhDUE9GRkVSIG1lc3NhZ2UuCisgKiBPdGhlcndpc2UsIHRoZSBtZXNzYWdlIGlzIGEgcmVxdWVzdCB0byB2ZXJpZnkgb3IgZXh0ZW5kIGFuCisgKiBleGlzdGluZyBsZWFzZS4gSWYgdGhlIGNsaWVudCB1c2VzIGEgJ2NsaWVudCBpZGVudGlmaWVyJworICogaW4gYSBESENQUkVRVUVTVCBtZXNzYWdlLCBpdCBNVVNUIHVzZSB0aGF0IHNhbWUgJ2NsaWVudCBpZGVudGlmaWVyJworICogaW4gYWxsIHN1YnNlcXVlbnQgbWVzc2FnZXMuIElmIHRoZSBjbGllbnQgaW5jbHVkZWQgYSBsaXN0CisgKiBvZiByZXF1ZXN0ZWQgcGFyYW1ldGVycyBpbiBhIERIQ1BESVNDT1ZFUiBtZXNzYWdlLCBpdCBNVVNUCisgKiBpbmNsdWRlIHRoYXQgbGlzdCBpbiBhbGwgc3Vic2VxdWVudCBtZXNzYWdlcy4KKyAqLworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llLCBjaGFkZHIgZmllbGRzLAorCSAqIHJhbmRvbSB4aWQgZmllbGQgKHdlIG92ZXJyaWRlIGl0IGJlbG93KSwKKwkgKiBjbGllbnQtaWQgb3B0aW9uICh1bmxlc3MgLUMpLCBtZXNzYWdlIHR5cGUgb3B0aW9uOgorCSAqLworCWluaXRfcGFja2V0KCZwYWNrZXQsIERIQ1BSRVFVRVNUKTsKKworCXBhY2tldC54aWQgPSB4aWQ7CisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9SRVFVRVNURURfSVAsIHJlcXVlc3RlZCk7CisKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX1NFUlZFUl9JRCwgc2VydmVyKTsKKworCS8qIEFkZCBvcHRpb25zOiBtYXhzaXplLAorCSAqIG9wdGlvbmFsbHk6IGhvc3RuYW1lLCBmcWRuLCB2ZW5kb3JjbGFzcywKKwkgKiAicGFyYW0gcmVxIiBvcHRpb24gYWNjb3JkaW5nIHRvIC1PLCBhbmQgb3B0aW9ucyBzcGVjaWZpZWQgd2l0aCAteAorCSAqLworCWFkZF9jbGllbnRfb3B0aW9ucygmcGFja2V0KTsKKworCWFkZHIuc19hZGRyID0gcmVxdWVzdGVkOworCWJiX2luZm9fbXNnKCJTZW5kaW5nIHNlbGVjdCBmb3IgJXMuLi4iLCBpbmV0X250b2EoYWRkcikpOworCXJldHVybiByYXdfYmNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgoJnBhY2tldCk7Cit9CisKKy8qIFVuaWNhc3Qgb3IgYnJvYWRjYXN0IGEgREhDUCByZW5ldyBtZXNzYWdlICovCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHNlbmRfcmVuZXcodWludDMyX3QgeGlkLCB1aW50MzJfdCBzZXJ2ZXIsIHVpbnQzMl90IGNpYWRkcikKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisvKgorICogUkZDIDIxMzEgNC4zLjIgREhDUFJFUVVFU1QgbWVzc2FnZQorICogLi4uCisgKiBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIFJFTkVXSU5HIHN0YXRlOgorICoKKyAqICdzZXJ2ZXIgaWRlbnRpZmllcicgTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnCisgKiBvcHRpb24gTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAnY2lhZGRyJyBNVVNUIGJlIGZpbGxlZCBpbiB3aXRoCisgKiBjbGllbnQncyBJUCBhZGRyZXNzLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGNsaWVudCBpcyBjb21wbGV0ZWx5CisgKiBjb25maWd1cmVkLCBhbmQgaXMgdHJ5aW5nIHRvIGV4dGVuZCBpdHMgbGVhc2UuIFRoaXMgbWVzc2FnZSB3aWxsCisgKiBiZSB1bmljYXN0LCBzbyBubyByZWxheSBhZ2VudHMgd2lsbCBiZSBpbnZvbHZlZCBpbiBpdHMKKyAqIHRyYW5zbWlzc2lvbi4gIEJlY2F1c2UgJ2dpYWRkcicgaXMgdGhlcmVmb3JlIG5vdCBmaWxsZWQgaW4sIHRoZQorICogREhDUCBzZXJ2ZXIgd2lsbCB0cnVzdCB0aGUgdmFsdWUgaW4gJ2NpYWRkcicsIGFuZCB1c2UgaXQgd2hlbgorICogcmVwbHlpbmcgdG8gdGhlIGNsaWVudC4KKyAqLworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llLCBjaGFkZHIgZmllbGRzLAorCSAqIHJhbmRvbSB4aWQgZmllbGQgKHdlIG92ZXJyaWRlIGl0IGJlbG93KSwKKwkgKiBjbGllbnQtaWQgb3B0aW9uICh1bmxlc3MgLUMpLCBtZXNzYWdlIHR5cGUgb3B0aW9uOgorCSAqLworCWluaXRfcGFja2V0KCZwYWNrZXQsIERIQ1BSRVFVRVNUKTsKKworCXBhY2tldC54aWQgPSB4aWQ7CisJcGFja2V0LmNpYWRkciA9IGNpYWRkcjsKKworCS8qIEFkZCBvcHRpb25zOiBtYXhzaXplLAorCSAqIG9wdGlvbmFsbHk6IGhvc3RuYW1lLCBmcWRuLCB2ZW5kb3JjbGFzcywKKwkgKiAicGFyYW0gcmVxIiBvcHRpb24gYWNjb3JkaW5nIHRvIC1PLCBhbmQgb3B0aW9ucyBzcGVjaWZpZWQgd2l0aCAteAorCSAqLworCWFkZF9jbGllbnRfb3B0aW9ucygmcGFja2V0KTsKKworCWJiX2luZm9fbXNnKCJTZW5kaW5nIHJlbmV3Li4uIik7CisJaWYgKHNlcnZlcikKKwkJcmV0dXJuIHVkaGNwX3NlbmRfa2VybmVsX3BhY2tldCgmcGFja2V0LAorCQkJY2lhZGRyLCBDTElFTlRfUE9SVCwKKwkJCXNlcnZlciwgU0VSVkVSX1BPUlQpOworCXJldHVybiByYXdfYmNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgoJnBhY2tldCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUENfQVJQSU5HCisvKiBCcm9hZGNhc3QgYSBESENQIGRlY2xpbmUgbWVzc2FnZSAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZW5kX2RlY2xpbmUodWludDMyX3QgeGlkLCB1aW50MzJfdCBzZXJ2ZXIsIHVpbnQzMl90IHJlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisJLyogRmlsbCBpbjogb3AsIGh0eXBlLCBobGVuLCBjb29raWUsIGNoYWRkciwgcmFuZG9tIHhpZCBmaWVsZHMsCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQREVDTElORSk7CisKKwkvKiBSRkMgMjEzMSBzYXlzIERIQ1BERUNMSU5FJ3MgeGlkIGlzIHJhbmRvbWx5IHNlbGVjdGVkIGJ5IGNsaWVudCwKKwkgKiBidXQgaW4gY2FzZSB0aGUgc2VydmVyIGlzIGJ1Z2d5IGFuZCB3YW50cyBESENQREVDTElORSdzIHhpZAorCSAqIHRvIG1hdGNoIHRoZSB4aWQgd2hpY2ggc3RhcnRlZCBlbnRpcmUgaGFuZHNoYWtlLAorCSAqIHdlIHVzZSB0aGUgc2FtZSB4aWQgd2UgdXNlZCBpbiBpbml0aWFsIERIQ1BESVNDT1ZFUjoKKwkgKi8KKwlwYWNrZXQueGlkID0geGlkOworCS8qIERIQ1BERUNMSU5FIHVzZXMgInJlcXVlc3RlZCBpcCIsIG5vdCBjaWFkZHIsIHRvIHN0b3JlIG9mZmVyZWQgSVAgKi8KKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX1JFUVVFU1RFRF9JUCwgcmVxdWVzdGVkKTsKKworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKCZwYWNrZXQsIERIQ1BfU0VSVkVSX0lELCBzZXJ2ZXIpOworCisJYmJfaW5mb19tc2coIlNlbmRpbmcgZGVjbGluZS4uLiIpOworCXJldHVybiByYXdfYmNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgoJnBhY2tldCk7Cit9CisjZW5kaWYKKworLyogVW5pY2FzdCBhIERIQ1AgcmVsZWFzZSBtZXNzYWdlICovCitzdGF0aWMgaW50IHNlbmRfcmVsZWFzZSh1aW50MzJfdCBzZXJ2ZXIsIHVpbnQzMl90IGNpYWRkcikKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisJLyogRmlsbCBpbjogb3AsIGh0eXBlLCBobGVuLCBjb29raWUsIGNoYWRkciwgcmFuZG9tIHhpZCBmaWVsZHMsCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQUkVMRUFTRSk7CisKKwkvKiBESENQUkVMRUFTRSB1c2VzIGNpYWRkciwgbm90ICJyZXF1ZXN0ZWQgaXAiLCB0byBzdG9yZSBJUCBiZWluZyByZWxlYXNlZCAqLworCXBhY2tldC5jaWFkZHIgPSBjaWFkZHI7CisKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX1NFUlZFUl9JRCwgc2VydmVyKTsKKworCWJiX2luZm9fbXNnKCJTZW5kaW5nIHJlbGVhc2UuLi4iKTsKKwlyZXR1cm4gdWRoY3Bfc2VuZF9rZXJuZWxfcGFja2V0KCZwYWNrZXQsIGNpYWRkciwgQ0xJRU5UX1BPUlQsIHNlcnZlciwgU0VSVkVSX1BPUlQpOworfQorCisvKiBSZXR1cm5zIC0xIG9uIGVycm9ycyB0aGF0IGFyZSBmYXRhbCBmb3IgdGhlIHNvY2tldCwgLTIgZm9yIHRob3NlIHRoYXQgYXJlbid0ICovCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHVkaGNwX3JlY3ZfcmF3X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LCBpbnQgZmQpCit7CisJaW50IGJ5dGVzOworCXN0cnVjdCBpcF91ZHBfZGhjcF9wYWNrZXQgcGFja2V0OworCXVpbnQxNl90IGNoZWNrOworCisJbWVtc2V0KCZwYWNrZXQsIDAsIHNpemVvZihwYWNrZXQpKTsKKwlieXRlcyA9IHNhZmVfcmVhZChmZCwgJnBhY2tldCwgc2l6ZW9mKHBhY2tldCkpOworCWlmIChieXRlcyA8IDApIHsKKwkJbG9nMSgiUGFja2V0IHJlYWQgZXJyb3IsIGlnbm9yaW5nIik7CisJCS8qIE5COiBwb3NzaWJsZSBkb3duIGludGVyZmFjZSwgZXRjLiBDYWxsZXIgc2hvdWxkIHBhdXNlLiAqLworCQlyZXR1cm4gYnl0ZXM7IC8qIHJldHVybnMgLTEgKi8KKwl9CisKKwlpZiAoYnl0ZXMgPCAoaW50KSAoc2l6ZW9mKHBhY2tldC5pcCkgKyBzaXplb2YocGFja2V0LnVkcCkpKSB7CisJCWxvZzEoIlBhY2tldCBpcyB0b28gc2hvcnQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAoYnl0ZXMgPCBudG9ocyhwYWNrZXQuaXAudG90X2xlbikpIHsKKwkJLyogcGFja2V0IGlzIGJpZ2dlciB0aGFuIHNpemVvZihwYWNrZXQpLCB3ZSBkaWQgcGFydGlhbCByZWFkICovCisJCWxvZzEoIk92ZXJzaXplZCBwYWNrZXQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwkvKiBpZ25vcmUgYW55IGV4dHJhIGdhcmJhZ2UgYnl0ZXMgKi8KKwlieXRlcyA9IG50b2hzKHBhY2tldC5pcC50b3RfbGVuKTsKKworCS8qIG1ha2Ugc3VyZSBpdHMgdGhlIHJpZ2h0IHBhY2tldCBmb3IgdXMsIGFuZCB0aGF0IGl0IHBhc3NlcyBzYW5pdHkgY2hlY2tzICovCisJaWYgKHBhY2tldC5pcC5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCB8fCBwYWNrZXQuaXAudmVyc2lvbiAhPSBJUFZFUlNJT04KKwkgfHwgcGFja2V0LmlwLmlobCAhPSAoc2l6ZW9mKHBhY2tldC5pcCkgPj4gMikKKwkgfHwgcGFja2V0LnVkcC5kZXN0ICE9IGh0b25zKENMSUVOVF9QT1JUKQorCS8qIHx8IGJ5dGVzID4gKGludCkgc2l6ZW9mKHBhY2tldCkgLSBjYW4ndCBoYXBwZW4gKi8KKwkgfHwgbnRvaHMocGFja2V0LnVkcC5sZW4pICE9ICh1aW50MTZfdCkoYnl0ZXMgLSBzaXplb2YocGFja2V0LmlwKSkKKwkpIHsKKwkJbG9nMSgiVW5yZWxhdGVkL2JvZ3VzIHBhY2tldCwgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKworCS8qIHZlcmlmeSBJUCBjaGVja3N1bSAqLworCWNoZWNrID0gcGFja2V0LmlwLmNoZWNrOworCXBhY2tldC5pcC5jaGVjayA9IDA7CisJaWYgKGNoZWNrICE9IHVkaGNwX2NoZWNrc3VtKCZwYWNrZXQuaXAsIHNpemVvZihwYWNrZXQuaXApKSkgeworCQlsb2cxKCJCYWQgSVAgaGVhZGVyIGNoZWNrc3VtLCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorCisJLyogdmVyaWZ5IFVEUCBjaGVja3N1bS4gSVAgaGVhZGVyIGhhcyB0byBiZSBtb2RpZmllZCBmb3IgdGhpcyAqLworCW1lbXNldCgmcGFja2V0LmlwLCAwLCBvZmZzZXRvZihzdHJ1Y3QgaXBoZHIsIHByb3RvY29sKSk7CisJLyogaXAueHggZmllbGRzIHdoaWNoIGFyZSBub3QgbWVtc2V0OiBwcm90b2NvbCwgY2hlY2ssIHNhZGRyLCBkYWRkciAqLworCXBhY2tldC5pcC50b3RfbGVuID0gcGFja2V0LnVkcC5sZW47IC8qIHllcywgdGhpcyBpcyBuZWVkZWQgKi8KKwljaGVjayA9IHBhY2tldC51ZHAuY2hlY2s7CisJcGFja2V0LnVkcC5jaGVjayA9IDA7CisJaWYgKGNoZWNrICYmIGNoZWNrICE9IHVkaGNwX2NoZWNrc3VtKCZwYWNrZXQsIGJ5dGVzKSkgeworCQlsb2cxKCJQYWNrZXQgd2l0aCBiYWQgVURQIGNoZWNrc3VtIHJlY2VpdmVkLCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorCisJbWVtY3B5KGRoY3BfcGt0LCAmcGFja2V0LmRhdGEsIGJ5dGVzIC0gKHNpemVvZihwYWNrZXQuaXApICsgc2l6ZW9mKHBhY2tldC51ZHApKSk7CisKKwlpZiAoZGhjcF9wa3QtPmNvb2tpZSAhPSBodG9ubChESENQX01BR0lDKSkgeworCQliYl9pbmZvX21zZygiUGFja2V0IHdpdGggYmFkIG1hZ2ljLCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorCWxvZzEoIkdvdCB2YWxpZCBESENQIHBhY2tldCIpOworCXVkaGNwX2R1bXBfcGFja2V0KGRoY3BfcGt0KTsKKwlyZXR1cm4gYnl0ZXMgLSAoc2l6ZW9mKHBhY2tldC5pcCkgKyBzaXplb2YocGFja2V0LnVkcCkpOworfQorCisKKy8qKiogTWFpbiAqKiovCisKK3N0YXRpYyBpbnQgc29ja2ZkID0gLTE7CisKKyNkZWZpbmUgTElTVEVOX05PTkUgICAwCisjZGVmaW5lIExJU1RFTl9LRVJORUwgMQorI2RlZmluZSBMSVNURU5fUkFXICAgIDIKK3N0YXRpYyBzbWFsbGludCBsaXN0ZW5fbW9kZTsKKworLyogaW5pdGlhbCBzdGF0ZTogKHJlKXN0YXJ0IERIQ1AgbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgSU5JVF9TRUxFQ1RJTkcgIDAKKy8qIGRpc2NvdmVyIHdhcyBzZW50LCBESENQT0ZGRVIgcmVwbHkgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUkVRVUVTVElORyAgICAgIDEKKy8qIHNlbGVjdC9yZW5ldyB3YXMgc2VudCwgREhDUEFDSyByZXBseSByZWNlaXZlZCAqLworI2RlZmluZSBCT1VORCAgICAgICAgICAgMgorLyogaGFsZiBvZiBsZWFzZSBwYXNzZWQsIHdhbnQgdG8gcmVuZXcgaXQgYnkgc2VuZGluZyB1bmljYXN0IHJlbmV3IHJlcXVlc3RzICovCisjZGVmaW5lIFJFTkVXSU5HICAgICAgICAzCisvKiByZW5ldyByZXF1ZXN0cyB3ZXJlIG5vdCBhbnN3ZXJlZCwgbGVhc2UgaXMgYWxtb3N0IG92ZXIsIHNlbmQgYnJvYWRjYXN0IHJlbmV3ICovCisjZGVmaW5lIFJFQklORElORyAgICAgICA0CisvKiBtYW51YWxseSByZXF1ZXN0ZWQgcmVuZXcgKFNJR1VTUjEpICovCisjZGVmaW5lIFJFTkVXX1JFUVVFU1RFRCA1CisvKiByZWxlYXNlLCBwb3NzaWJseSBtYW51YWxseSByZXF1ZXN0ZWQgKFNJR1VTUjIpICovCisjZGVmaW5lIFJFTEVBU0VEICAgICAgICA2CitzdGF0aWMgc21hbGxpbnQgc3RhdGU7CisKK3N0YXRpYyBpbnQgdWRoY3BfcmF3X3NvY2tldChpbnQgaWZpbmRleCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHNvY2thZGRyX2xsIHNvY2s7CisKKwkvKgorCSAqIENvbW1lbnQ6CisJICoKKwkgKglJJ3ZlIHNlbGVjdGVkIG5vdCB0byBzZWUgTEwgaGVhZGVyLCBzbyBCUEYgZG9lc24ndCBzZWUgaXQsIHRvby4KKwkgKglUaGUgZmlsdGVyIG1heSBhbHNvIHBhc3Mgbm9uLUlQIGFuZCBub24tQVJQIHBhY2tldHMsIGJ1dCB3ZSBkbworCSAqCWEgbW9yZSBjb21wbGV0ZSBjaGVjayB3aGVuIHJlY2VpdmluZyB0aGUgbWVzc2FnZSBpbiB1c2Vyc3BhY2UuCisJICoKKwkgKiBhbmQgZmlsdGVyIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tOgorCSAqCisJICoJaHR0cDovL3d3dy5mbGFtZXdhcm1hc3Rlci5kZS9zb2Z0d2FyZS9kaGNwY2xpZW50LworCSAqCisJICogVGhlcmUgYXJlIGEgZmV3IG90aGVyIGludGVyZXN0aW5nIGlkZWFzIG9uIHRoYXQgcGFnZSAobG9vayB1bmRlcgorCSAqICJNb3RpdmF0aW9uIikuICBVc2Ugb2YgbmV0bGluayBldmVudHMgaXMgbW9zdCBpbnRlcmVzdGluZy4gIFRoaW5rCisJICogb2YgdmFyaW91cyBuZXR3b3JrIHNlcnZlcnMgbGlzdGVuaW5nIGZvciBldmVudHMgYW5kIHJlY29uZmlndXJpbmcuCisJICogVGhhdCB3b3VsZCBvYnNvbGV0ZSBzZW5kaW5nIEhVUCBzaWduYWxzIGFuZC9vciBtYWtlIHVzZSBvZiByZXN0YXJ0cy4KKwkgKgorCSAqIENvcHlyaWdodDogMjAwNiwgMjAwNyBTdGVmYW4gUm9tcGYgPHN1eEBsb3Bsb2YuZGU+LgorCSAqIExpY2Vuc2U6IEdQTCB2Mi4KKwkgKgorCSAqIFRPRE86IG1ha2UgY29uZGl0aW9uYWw/CisJICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NrX2ZpbHRlciBmaWx0ZXJfaW5zdHJbXSA9IHsKKwkJLyogbG9hZCA5dGggYnl0ZSAocHJvdG9jb2wpICovCisJCUJQRl9TVE1UKEJQRl9MRHxCUEZfQnxCUEZfQUJTLCA5KSwKKwkJLyoganVtcCB0byBMMSBpZiBpdCBpcyBJUFBST1RPX1VEUCwgZWxzZSB0byBMNCAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIElQUFJPVE9fVURQLCAwLCA2KSwKKwkJLyogTDE6IGxvYWQgaGFsZndvcmQgZnJvbSBvZmZzZXQgNiAoZmxhZ3MgYW5kIGZyYWcgb2Zmc2V0KSAqLworCQlCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0FCUywgNiksCisJCS8qIGp1bXAgdG8gTDQgaWYgYW55IGJpdHMgaW4gZnJhZyBvZmZzZXQgZmllbGQgYXJlIHNldCwgZWxzZSB0byBMMiAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KU0VUfEJQRl9LLCAweDFmZmYsIDQsIDApLAorCQkvKiBMMjogc2tpcCBJUCBoZWFkZXIgKGxvYWQgaW5kZXggcmVnIHdpdGggaGVhZGVyIGxlbikgKi8KKwkJQlBGX1NUTVQoQlBGX0xEWHxCUEZfQnxCUEZfTVNILCAwKSwKKwkJLyogbG9hZCB1ZHAgZGVzdGluYXRpb24gcG9ydCBmcm9tIGhhbGZ3b3JkW2hlYWRlcl9sZW4gKyAyXSAqLworCQlCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0lORCwgMiksCisJCS8qIGp1bXAgdG8gTDMgaWYgdWRwIGRwb3J0IGlzIENMSUVOVF9QT1JULCBlbHNlIHRvIEw0ICovCisJCUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgNjgsIDAsIDEpLAorCQkvKiBMMzogYWNjZXB0IHBhY2tldCAqLworCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCAweGZmZmZmZmZmKSwKKwkJLyogTDQ6IGRpc2NhcmQgcGFja2V0ICovCisJCUJQRl9TVE1UKEJQRl9SRVR8QlBGX0ssIDApLAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NrX2Zwcm9nIGZpbHRlcl9wcm9nID0geworCQkubGVuID0gc2l6ZW9mKGZpbHRlcl9pbnN0cikgLyBzaXplb2YoZmlsdGVyX2luc3RyWzBdKSwKKwkJLyogY2FzdGluZyBjb25zdCBhd2F5OiAqLworCQkuZmlsdGVyID0gKHN0cnVjdCBzb2NrX2ZpbHRlciAqKSBmaWx0ZXJfaW5zdHIsCisJfTsKKworCWxvZzEoIk9wZW5pbmcgcmF3IHNvY2tldCBvbiBpZmluZGV4ICVkIiwgaWZpbmRleCk7IC8vbG9nMj8KKworCWZkID0geHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zKEVUSF9QX0lQKSk7CisJbG9nMSgiR290IHJhdyBzb2NrZXQgZmQgJWQiLCBmZCk7IC8vbG9nMj8KKworCXNvY2suc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwlzb2NrLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwlzb2NrLnNsbF9pZmluZGV4ID0gaWZpbmRleDsKKwl4YmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc29jaywgc2l6ZW9mKHNvY2spKTsKKworCWlmIChDTElFTlRfUE9SVCA9PSA2OCkgeworCQkvKiBVc2Ugb25seSBpZiBzdGFuZGFyZCBwb3J0IGlzIGluIHVzZSAqLworCQkvKiBJZ25vcmluZyBlcnJvciAoa2VybmVsIG1heSBsYWNrIHN1cHBvcnQgZm9yIHRoaXMpICovCisJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19BVFRBQ0hfRklMVEVSLCAmZmlsdGVyX3Byb2csCisJCQkJc2l6ZW9mKGZpbHRlcl9wcm9nKSkgPj0gMCkKKwkJCWxvZzEoIkF0dGFjaGVkIGZpbHRlciB0byByYXcgc29ja2V0IGZkICVkIiwgZmQpOyAvLyBsb2c/CisJfQorCisJbG9nMSgiQ3JlYXRlZCByYXcgc29ja2V0Iik7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9saXN0ZW5fbW9kZShpbnQgbmV3X21vZGUpCit7CisJbG9nMSgiRW50ZXJpbmcgbGlzdGVuIG1vZGU6ICVzIiwKKwkJbmV3X21vZGUgIT0gTElTVEVOX05PTkUKKwkJCT8gKG5ld19tb2RlID09IExJU1RFTl9LRVJORUwgPyAia2VybmVsIiA6ICJyYXciKQorCQkJOiAibm9uZSIKKwkpOworCisJbGlzdGVuX21vZGUgPSBuZXdfbW9kZTsKKwlpZiAoc29ja2ZkID49IDApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJc29ja2ZkID0gLTE7CisJfQorCWlmIChuZXdfbW9kZSA9PSBMSVNURU5fS0VSTkVMKQorCQlzb2NrZmQgPSB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qSU5BRERSX0FOWSwqLyBDTElFTlRfUE9SVCwgY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UpOworCWVsc2UgaWYgKG5ld19tb2RlICE9IExJU1RFTl9OT05FKQorCQlzb2NrZmQgPSB1ZGhjcF9yYXdfc29ja2V0KGNsaWVudF9jb25maWcuaWZpbmRleCk7CisJLyogZWxzZSBMSVNURU5fTk9ORTogc29ja2ZkIHN0YXlzIGNsb3NlZCAqLworfQorCisvKiBDYWxsZWQgb25seSBvbiBTSUdVU1IxICovCitzdGF0aWMgdm9pZCBwZXJmb3JtX3JlbmV3KHZvaWQpCit7CisJYmJfaW5mb19tc2coIlBlcmZvcm1pbmcgYSBESENQIHJlbmV3Iik7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQk9VTkQ6CisJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fS0VSTkVMKTsKKwljYXNlIFJFTkVXSU5HOgorCWNhc2UgUkVCSU5ESU5HOgorCQlzdGF0ZSA9IFJFTkVXX1JFUVVFU1RFRDsKKwkJYnJlYWs7CisJY2FzZSBSRU5FV19SRVFVRVNURUQ6IC8qIGltcGF0aWVudCBhcmUgd2U/IGZpbmUsIHNxdWFyZSAxICovCisJCXVkaGNwX3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJY2FzZSBSRVFVRVNUSU5HOgorCWNhc2UgUkVMRUFTRUQ6CisJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJYnJlYWs7CisJY2FzZSBJTklUX1NFTEVDVElORzoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwZXJmb3JtX3JlbGVhc2UodWludDMyX3QgcmVxdWVzdGVkX2lwLCB1aW50MzJfdCBzZXJ2ZXJfYWRkcikKK3sKKwljaGFyIGJ1ZmZlcltzaXplb2YoIjI1NS4yNTUuMjU1LjI1NSIpXTsKKwlzdHJ1Y3QgaW5fYWRkciB0ZW1wX2FkZHI7CisKKwkvKiBzZW5kIHJlbGVhc2UgcGFja2V0ICovCisJaWYgKHN0YXRlID09IEJPVU5EIHx8IHN0YXRlID09IFJFTkVXSU5HIHx8IHN0YXRlID09IFJFQklORElORykgeworCQl0ZW1wX2FkZHIuc19hZGRyID0gc2VydmVyX2FkZHI7CisJCXN0cmNweShidWZmZXIsIGluZXRfbnRvYSh0ZW1wX2FkZHIpKTsKKwkJdGVtcF9hZGRyLnNfYWRkciA9IHJlcXVlc3RlZF9pcDsKKwkJYmJfaW5mb19tc2coIlVuaWNhc3RpbmcgYSByZWxlYXNlIG9mICVzIHRvICVzIiwKKwkJCQlpbmV0X250b2EodGVtcF9hZGRyKSwgYnVmZmVyKTsKKwkJc2VuZF9yZWxlYXNlKHNlcnZlcl9hZGRyLCByZXF1ZXN0ZWRfaXApOyAvKiB1bmljYXN0ICovCisJCXVkaGNwX3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJfQorCWJiX2luZm9fbXNnKCJFbnRlcmluZyByZWxlYXNlZCBzdGF0ZSIpOworCisJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9OT05FKTsKKwlzdGF0ZSA9IFJFTEVBU0VEOworfQorCitzdGF0aWMgdWludDhfdCogYWxsb2NfZGhjcF9vcHRpb24oaW50IGNvZGUsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGV4dHJhKQoreworCXVpbnQ4X3QgKnN0b3JhZ2U7CisJaW50IGxlbiA9IHN0cm5sZW4oc3RyLCAyNTUpOworCXN0b3JhZ2UgPSB4emFsbG9jKGxlbiArIGV4dHJhICsgT1BUX0RBVEEpOworCXN0b3JhZ2VbT1BUX0NPREVdID0gY29kZTsKKwlzdG9yYWdlW09QVF9MRU5dID0gbGVuICsgZXh0cmE7CisJbWVtY3B5KHN0b3JhZ2UgKyBleHRyYSArIE9QVF9EQVRBLCBzdHIsIGxlbik7CisJcmV0dXJuIHN0b3JhZ2U7Cit9CisKKyNpZiBCQl9NTVUKK3N0YXRpYyB2b2lkIGNsaWVudF9iYWNrZ3JvdW5kKHZvaWQpCit7CisJYmJfZGFlbW9uaXplKDApOworCWxvZ21vZGUgJj0gfkxPR01PREVfU1RESU87CisJLyogcmV3cml0ZSBwaWRmaWxlLCBhcyBvdXIgcGlkIGlzIGRpZmZlcmVudCBub3cgKi8KKwl3cml0ZV9waWRmaWxlKGNsaWVudF9jb25maWcucGlkZmlsZSk7Cit9CisjZW5kaWYKKworLy91c2FnZTojaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKKy8vdXNhZ2U6IyBkZWZpbmUgSUZfVURIQ1BfVkVSQk9TRSguLi4pIF9fVkFfQVJHU19fCisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiMgZGVmaW5lIElGX1VESENQX1ZFUkJPU0UoLi4uKQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2RlZmluZSB1ZGhjcGNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmJucSJJRl9VREhDUF9WRVJCT1NFKCJ2Iikib0NSQl0gWy1pIElGQUNFXSBbLXIgSVBdIFstcyBQUk9HXSBbLXAgUElERklMRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy1IIEhPU1ROQU1FXSBbLVYgVkVORE9SXSBbLXggT1BUOlZBTF0uLi4gWy1PIE9QVF0uLi4iIElGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiIFstUCBOXSIpCisvL3VzYWdlOiNkZWZpbmUgdWRoY3BjX2Z1bGxfdXNhZ2UgIlxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktaSwtLWludGVyZmFjZSBJRkFDRQlJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApIgorLy91c2FnZTogICAgICJcbgktcCwtLXBpZGZpbGUgRklMRQlDcmVhdGUgcGlkZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zY3JpcHQgUFJPRwlSdW4gUFJPRyBhdCBESENQIGV2ZW50cyAoZGVmYXVsdCAiQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCIpIgorLy91c2FnZTogICAgICJcbgktQiwtLWJyb2FkY2FzdAkJUmVxdWVzdCBicm9hZGNhc3QgcmVwbGllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS1yZXRyaWVzIE4JCVNlbmQgdXAgdG8gTiBkaXNjb3ZlciBwYWNrZXRzIgorLy91c2FnZTogICAgICJcbgktVCwtLXRpbWVvdXQgTgkJUGF1c2UgYmV0d2VlbiBwYWNrZXRzIChkZWZhdWx0IDMgc2Vjb25kcykiCisvL3VzYWdlOiAgICAgIlxuCS1BLC0tdHJ5YWdhaW4gTgkJV2FpdCBOIHNlY29uZHMgYWZ0ZXIgZmFpbHVyZSAoZGVmYXVsdCAyMCkiCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tZm9yZWdyb3VuZAkJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOglVU0VfRk9SX01NVSgKKy8vdXNhZ2U6ICAgICAiXG4JLWIsLS1iYWNrZ3JvdW5kCQlCYWNrZ3JvdW5kIGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4sLS1ub3cJCUV4aXQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkIgorLy91c2FnZTogICAgICJcbgktcSwtLXF1aXQJCUV4aXQgYWZ0ZXIgb2J0YWluaW5nIGxlYXNlIgorLy91c2FnZTogICAgICJcbgktUiwtLXJlbGVhc2UJCVJlbGVhc2UgSVAgb24gZXhpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMsLS1zeXNsb2cJCUxvZyB0byBzeXNsb2cgdG9vIgorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUF9QT1JUKAorLy91c2FnZTogICAgICJcbgktUCwtLWNsaWVudC1wb3J0IE4JVXNlIHBvcnQgTiAoZGVmYXVsdCA2OCkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoCisvL3VzYWdlOiAgICAgIlxuCS1hLC0tYXJwaW5nCQlVc2UgYXJwaW5nIHRvIHZhbGlkYXRlIG9mZmVyZWQgYWRkcmVzcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLU8sLS1yZXF1ZXN0LW9wdGlvbiBPUFQJUmVxdWVzdCBvcHRpb24gT1BUIGZyb20gc2VydmVyIChjdW11bGF0aXZlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8sLS1uby1kZWZhdWx0LW9wdGlvbnMJRG9uJ3QgcmVxdWVzdCBhbnkgb3B0aW9ucyAodW5sZXNzIC1PIGlzIGdpdmVuKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yZXF1ZXN0IElQCQlSZXF1ZXN0IHRoaXMgSVAgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXggT1BUOlZBTAkJSW5jbHVkZSBvcHRpb24gT1BUIGluIHNlbnQgcGFja2V0cyAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJCUV4YW1wbGVzIG9mIHN0cmluZywgbnVtZXJpYywgYW5kIGhleCBieXRlIG9wdHM6IgorLy91c2FnZTogICAgICJcbgkJCQkteCBob3N0bmFtZTpiYm94IC0gb3B0aW9uIDEyIgorLy91c2FnZTogICAgICJcbgkJCQkteCBsZWFzZTozNjAwIC0gb3B0aW9uIDUxIChsZWFzZSB0aW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLXggMHgzZDowMTAwQkVFRkMwRkZFRSAtIG9wdGlvbiA2MSAoY2xpZW50IGlkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUYsLS1mcWRuIE5BTUUJCUFzayBzZXJ2ZXIgdG8gdXBkYXRlIEROUyBtYXBwaW5nIGZvciBOQU1FIgorLy91c2FnZTogICAgICJcbgktSCwtaCwtLWhvc3RuYW1lIE5BTUUJU2VuZCBOQU1FIGFzIGNsaWVudCBob3N0bmFtZSAoZGVmYXVsdCBub25lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVYsLS12ZW5kb3JjbGFzcyBWRU5ET1IJVmVuZG9yIGlkZW50aWZpZXIgKGRlZmF1bHQgJ3VkaGNwIFZFUlNJT04nKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUMsLS1jbGllbnRpZC1ub25lCURvbid0IHNlbmQgTUFDIGFzIGNsaWVudCBpZGVudGlmaWVyIgorLy91c2FnZToJSUZfVURIQ1BfVkVSQk9TRSgKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCQlWZXJib3NlIgorLy91c2FnZToJKQorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWkgSUZBQ0UJSW50ZXJmYWNlIHRvIHVzZSAoZGVmYXVsdCBldGgwKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRklMRQkJQ3JlYXRlIHBpZGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1zIFBST0cJCVJ1biBQUk9HIGF0IERIQ1AgZXZlbnRzIChkZWZhdWx0ICJDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUIikiCisvL3VzYWdlOiAgICAgIlxuCS1CCQlSZXF1ZXN0IGJyb2FkY2FzdCByZXBsaWVzIgorLy91c2FnZTogICAgICJcbgktdCBOCQlTZW5kIHVwIHRvIE4gZGlzY292ZXIgcGFja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLVQgTgkJUGF1c2UgYmV0d2VlbiBwYWNrZXRzIChkZWZhdWx0IDMgc2Vjb25kcykiCisvL3VzYWdlOiAgICAgIlxuCS1BIE4JCVdhaXQgTiBzZWNvbmRzIChkZWZhdWx0IDIwKSBhZnRlciBmYWlsdXJlIgorLy91c2FnZTogICAgICJcbgktZgkJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOglVU0VfRk9SX01NVSgKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCUJhY2tncm91bmQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbgkJRXhpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlFeGl0IGFmdGVyIG9idGFpbmluZyBsZWFzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJCVJlbGVhc2UgSVAgb24gZXhpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJCUxvZyB0byBzeXNsb2cgdG9vIgorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUF9QT1JUKAorLy91c2FnZTogICAgICJcbgktUCBOCQlVc2UgcG9ydCBOIChkZWZhdWx0IDY4KSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORygKKy8vdXNhZ2U6ICAgICAiXG4JLWEJCVVzZSBhcnBpbmcgdG8gdmFsaWRhdGUgb2ZmZXJlZCBhZGRyZXNzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTyBPUFQJCVJlcXVlc3Qgb3B0aW9uIE9QVCBmcm9tIHNlcnZlciAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCS1vCQlEb24ndCByZXF1ZXN0IGFueSBvcHRpb25zICh1bmxlc3MgLU8gaXMgZ2l2ZW4pIgorLy91c2FnZTogICAgICJcbgktciBJUAkJUmVxdWVzdCB0aGlzIElQIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS14IE9QVDpWQUwJSW5jbHVkZSBvcHRpb24gT1BUIGluIHNlbnQgcGFja2V0cyAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJRXhhbXBsZXMgb2Ygc3RyaW5nLCBudW1lcmljLCBhbmQgaGV4IGJ5dGUgb3B0czoiCisvL3VzYWdlOiAgICAgIlxuCQkJLXggaG9zdG5hbWU6YmJveCAtIG9wdGlvbiAxMiIKKy8vdXNhZ2U6ICAgICAiXG4JCQkteCBsZWFzZTozNjAwIC0gb3B0aW9uIDUxIChsZWFzZSB0aW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkteCAweDNkOjAxMDBCRUVGQzBGRkVFIC0gb3B0aW9uIDYxIChjbGllbnQgaWQpIgorLy91c2FnZTogICAgICJcbgktRiBOQU1FCQlBc2sgc2VydmVyIHRvIHVwZGF0ZSBETlMgbWFwcGluZyBmb3IgTkFNRSIKKy8vdXNhZ2U6ICAgICAiXG4JLUgsLWggTkFNRQlTZW5kIE5BTUUgYXMgY2xpZW50IGhvc3RuYW1lIChkZWZhdWx0IG5vbmUpIgorLy91c2FnZTogICAgICJcbgktViBWRU5ET1IJVmVuZG9yIGlkZW50aWZpZXIgKGRlZmF1bHQgJ3VkaGNwIFZFUlNJT04nKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJCURvbid0IHNlbmQgTUFDIGFzIGNsaWVudCBpZGVudGlmaWVyIgorLy91c2FnZToJSUZfVURIQ1BfVkVSQk9TRSgKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuU2lnbmFsczoiCisvL3VzYWdlOiAgICAgIlxuCVVTUjEJUmVuZXcgY3VycmVudCBsZWFzZSIKKy8vdXNhZ2U6ICAgICAiXG4JVVNSMglSZWxlYXNlIGN1cnJlbnQgbGVhc2UiCisKKworaW50IHVkaGNwY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdWRoY3BjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1aW50OF90ICp0ZW1wLCAqbWVzc2FnZTsKKwljb25zdCBjaGFyICpzdHJfViwgKnN0cl9oLCAqc3RyX0YsICpzdHJfcjsKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoY2hhciAqc3RyX1A7KQorCXZvaWQgKmNsaWVudGlkX21hY19wdHI7CisJbGxpc3RfdCAqbGlzdF9PID0gTlVMTDsKKwlsbGlzdF90ICpsaXN0X3ggPSBOVUxMOworCWludCB0cnlhZ2Fpbl90aW1lb3V0ID0gMjA7CisJaW50IGRpc2NvdmVyX3RpbWVvdXQgPSAzOworCWludCBkaXNjb3Zlcl9yZXRyaWVzID0gMzsKKwl1aW50MzJfdCBzZXJ2ZXJfYWRkciA9IHNlcnZlcl9hZGRyOyAvKiBmb3IgY29tcGlsZXIgKi8KKwl1aW50MzJfdCByZXF1ZXN0ZWRfaXAgPSAwOworCXVpbnQzMl90IHhpZCA9IDA7CisJdWludDMyX3QgbGVhc2Vfc2Vjb25kcyA9IDA7IC8qIGNhbiBiZSBnaXZlbiBhcyAzMi1iaXQgcXVhbnRpdHkgKi8KKwlpbnQgcGFja2V0X251bTsKKwlpbnQgdGltZW91dDsgLyogbXVzdCBiZSBzaWduZWQgKi8KKwl1bnNpZ25lZCBhbHJlYWR5X3dhaXRlZF9zZWM7CisJdW5zaWduZWQgb3B0OworCWludCBtYXhfZmQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCWZkX3NldCByZmRzOworCisJLyogRGVmYXVsdCBvcHRpb25zICovCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKFNFUlZFUl9QT1JUID0gNjc7KQorCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVChDTElFTlRfUE9SVCA9IDY4OykKKwljbGllbnRfY29uZmlnLmludGVyZmFjZSA9ICJldGgwIjsKKwljbGllbnRfY29uZmlnLnNjcmlwdCA9IENPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ7CisJc3RyX1YgPSAidWRoY3AgIkJCX1ZFUjsKKworCS8qIFBhcnNlIGNvbW1hbmQgbGluZSAqLworCS8qIE8seDogbGlzdDsgLVQsLXQsLUEgdGFrZSBudW1lcmljIHBhcmFtICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiTzo6eDo6VCs6dCs6QSsiCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKKwkJIjp2diIKKyNlbmRpZgorCQk7CisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSB1ZGhjcGNfbG9uZ29wdHM7KQorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJDVjpIOmg6RjppOm5wOnFScjpzOlQ6dDpTQTpPOm94OmZCIgorCQlVU0VfRk9SX01NVSgiYiIpCisJCUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORygiYSIpCisJCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiUDoiKQorCQkidiIKKwkJLCAmc3RyX1YsICZzdHJfaCwgJnN0cl9oLCAmc3RyX0YKKwkJLCAmY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UsICZjbGllbnRfY29uZmlnLnBpZGZpbGUsICZzdHJfciAvKiBpLHAgKi8KKwkJLCAmY2xpZW50X2NvbmZpZy5zY3JpcHQgLyogcyAqLworCQksICZkaXNjb3Zlcl90aW1lb3V0LCAmZGlzY292ZXJfcmV0cmllcywgJnRyeWFnYWluX3RpbWVvdXQgLyogVCx0LEEgKi8KKwkJLCAmbGlzdF9PCisJCSwgJmxpc3RfeAorCQlJRl9GRUFUVVJFX1VESENQX1BPUlQoLCAmc3RyX1ApCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKKwkJLCAmZGhjcF92ZXJib3NlCisjZW5kaWYKKwkJKTsKKwlpZiAob3B0ICYgKE9QVF9ofE9QVF9IKSkKKwkJY2xpZW50X2NvbmZpZy5ob3N0bmFtZSA9IGFsbG9jX2RoY3Bfb3B0aW9uKERIQ1BfSE9TVF9OQU1FLCBzdHJfaCwgMCk7CisJaWYgKG9wdCAmIE9QVF9GKSB7CisJCS8qIEZRRE4gb3B0aW9uIGZvcm1hdDogWzB4NTFdW2xlbl1bZmxhZ3NdWzBdWzBdPGZxZG4+ICovCisJCWNsaWVudF9jb25maWcuZnFkbiA9IGFsbG9jX2RoY3Bfb3B0aW9uKERIQ1BfRlFETiwgc3RyX0YsIDMpOworCQkvKiBGbGFnIGJpdHM6IDAwMDBORU9TCisJCSAqIFM6IDEgPSBDbGllbnQgcmVxdWVzdHMgc2VydmVyIHRvIHVwZGF0ZSBBIFJSIGluIEROUyBhcyB3ZWxsIGFzIFBUUgorCQkgKiBPOiAxID0gU2VydmVyIGluZGljYXRlcyB0byBjbGllbnQgdGhhdCBETlMgaGFzIGJlZW4gdXBkYXRlZCByZWdhcmRsZXNzCisJCSAqIEU6IDEgPSBOYW1lIGlzIGluIEROUyBmb3JtYXQsIGkuZS4gPDQ+aG9zdDw2PmRvbWFpbjwzPmNvbTwwPiwKKwkJICogICAgbm90ICJob3N0LmRvbWFpbi5jb20iLiBGb3JtYXQgMCBpcyBvYnNvbGV0ZS4KKwkJICogTjogMSA9IENsaWVudCByZXF1ZXN0cyBzZXJ2ZXIgdG8gbm90IHVwZGF0ZSBETlMgKFMgbXVzdCBiZSAwIHRoZW4pCisJCSAqIFR3byBbMF0gYnl0ZXMgd2hpY2ggZm9sbG93IGFyZSBkZXByZWNhdGVkIGFuZCBtdXN0IGJlIDAuCisJCSAqLworCQljbGllbnRfY29uZmlnLmZxZG5bT1BUX0RBVEEgKyAwXSA9IDB4MTsKKwkJLypjbGllbnRfY29uZmlnLmZxZG5bT1BUX0RBVEEgKyAxXSA9IDA7IC0geHphbGxvYyBkaWQgaXQgKi8KKwkJLypjbGllbnRfY29uZmlnLmZxZG5bT1BUX0RBVEEgKyAyXSA9IDA7ICovCisJfQorCWlmIChvcHQgJiBPUFRfcikKKwkJcmVxdWVzdGVkX2lwID0gaW5ldF9hZGRyKHN0cl9yKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9QT1JUCisJaWYgKG9wdCAmIE9QVF9QKSB7CisJCUNMSUVOVF9QT1JUID0geGF0b3UxNihzdHJfUCk7CisJCVNFUlZFUl9QT1JUID0gQ0xJRU5UX1BPUlQgLSAxOworCX0KKyNlbmRpZgorCWlmIChvcHQgJiBPUFRfbykKKwkJY2xpZW50X2NvbmZpZy5ub19kZWZhdWx0X29wdGlvbnMgPSAxOworCXdoaWxlIChsaXN0X08pIHsKKwkJY2hhciAqb3B0c3RyID0gbGxpc3RfcG9wKCZsaXN0X08pOworCQl1bnNpZ25lZCBuID0gYmJfc3RydG91KG9wdHN0ciwgTlVMTCwgMCk7CisJCWlmIChlcnJubyB8fCBuID4gMjU0KSB7CisJCQluID0gdWRoY3Bfb3B0aW9uX2lkeChvcHRzdHIpOworCQkJbiA9IGRoY3Bfb3B0ZmxhZ3Nbbl0uY29kZTsKKwkJfQorCQljbGllbnRfY29uZmlnLm9wdF9tYXNrW24gPj4gM10gfD0gMSA8PCAobiAmIDcpOworCX0KKwl3aGlsZSAobGlzdF94KSB7CisJCWNoYXIgKm9wdHN0ciA9IGxsaXN0X3BvcCgmbGlzdF94KTsKKwkJY2hhciAqY29sb24gPSBzdHJjaHIob3B0c3RyLCAnOicpOworCQlpZiAoY29sb24pCisJCQkqY29sb24gPSAnICc7CisJCS8qIG5vdyBpdCBsb29rcyBzaW1pbGFyIHRvIHVkaGNwZCdzIGNvbmZpZyBmaWxlIGxpbmU6CisJCSAqICJvcHRuYW1lIG9wdHZhbCIsIHVzaW5nIHRoZSBjb21tb24gcm91dGluZTogKi8KKwkJdWRoY3Bfc3RyMm9wdHNldChvcHRzdHIsICZjbGllbnRfY29uZmlnLm9wdGlvbnMpOworCX0KKworCWlmICh1ZGhjcF9yZWFkX2ludGVyZmFjZShjbGllbnRfY29uZmlnLmludGVyZmFjZSwKKwkJCSZjbGllbnRfY29uZmlnLmlmaW5kZXgsCisJCQlOVUxMLAorCQkJY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjKQorCSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwljbGllbnRpZF9tYWNfcHRyID0gTlVMTDsKKwlpZiAoIShvcHQgJiBPUFRfQykgJiYgIXVkaGNwX2ZpbmRfb3B0aW9uKGNsaWVudF9jb25maWcub3B0aW9ucywgREhDUF9DTElFTlRfSUQpKSB7CisJCS8qIG5vdCBzdXBwcmVzc2VkIGFuZCBub3Qgc2V0LCBzZXQgdGhlIGRlZmF1bHQgY2xpZW50IElEICovCisJCWNsaWVudF9jb25maWcuY2xpZW50aWQgPSBhbGxvY19kaGNwX29wdGlvbihESENQX0NMSUVOVF9JRCwgIiIsIDcpOworCQljbGllbnRfY29uZmlnLmNsaWVudGlkW09QVF9EQVRBXSA9IDE7IC8qIHR5cGU6IGV0aGVybmV0ICovCisJCWNsaWVudGlkX21hY19wdHIgPSBjbGllbnRfY29uZmlnLmNsaWVudGlkICsgT1BUX0RBVEErMTsKKwkJbWVtY3B5KGNsaWVudGlkX21hY19wdHIsIGNsaWVudF9jb25maWcuY2xpZW50X21hYywgNik7CisJfQorCWlmIChzdHJfVlswXSAhPSAnXDAnKQorCQljbGllbnRfY29uZmlnLnZlbmRvcmNsYXNzID0gYWxsb2NfZGhjcF9vcHRpb24oREhDUF9WRU5ET1IsIHN0cl9WLCAwKTsKKyNpZiAhQkJfTU1VCisJLyogb24gTk9NTVUgcmVleGVjIChpLmUuLCBiYWNrZ3JvdW5kKSBlYXJseSAqLworCWlmICghKG9wdCAmIE9QVF9mKSkgeworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoMCAvKiBmbGFncyAqLywgYXJndik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJfQorI2VuZGlmCisJaWYgKG9wdCAmIE9QVF9TKSB7CisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19EQUVNT04pOworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKworCS8qIE1ha2Ugc3VyZSBmZCAwLDEsMiBhcmUgb3BlbiAqLworCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisJLyogRXF1aXZhbGVudCBvZiBkb2luZyBhIGZmbHVzaCBhZnRlciBldmVyeSBcbiAqLworCXNldGxpbmVidWYoc3Rkb3V0KTsKKwkvKiBDcmVhdGUgcGlkZmlsZSAqLworCXdyaXRlX3BpZGZpbGUoY2xpZW50X2NvbmZpZy5waWRmaWxlKTsKKwkvKiBHb2VzIHRvIHN0ZG91dCAodW5sZXNzIE5PTU1VKSBhbmQgcG9zc2libHkgc3lzbG9nICovCisJYmJfaW5mb19tc2coIiVzICh2IkJCX1ZFUiIpIHN0YXJ0ZWQiLCBhcHBsZXRfbmFtZSk7CisJLyogU2V0IHVwIHRoZSBzaWduYWwgcGlwZSAqLworCXVkaGNwX3NwX3NldHVwKCk7CisJLyogV2Ugd2FudCByYW5kb21feGlkIHRvIGJlIHJhbmRvbS4uLiAqLworCXNyYW5kKG1vbm90b25pY191cygpKTsKKworCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJcGFja2V0X251bSA9IDA7CisJdGltZW91dCA9IDA7CisJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKworCS8qIE1haW4gZXZlbnQgbG9vcC4gc2VsZWN0KCkgd2FpdHMgb24gc2lnbmFsIHBpcGUgYW5kIHBvc3NpYmx5CisJICogb24gc29ja2ZkLgorCSAqICJjb250aW51ZSIgc3RhdGVtZW50cyBpbiBjb2RlIGJlbG93IGp1bXAgdG8gdGhlIHRvcCBvZiB0aGUgbG9vcC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCS8qIHNpbGVuY2UgInVuaW5pdGlhbGl6ZWQhIiB3YXJuaW5nICovCisJCXVuc2lnbmVkIHRpbWVzdGFtcF9iZWZvcmVfd2FpdCA9IHRpbWVzdGFtcF9iZWZvcmVfd2FpdDsKKworCQkvL2JiX2Vycm9yX21zZygic29ja2ZkOiVkLCBsaXN0ZW5fbW9kZTolZCIsIHNvY2tmZCwgbGlzdGVuX21vZGUpOworCisJCS8qIFdhcyBvcGVuaW5nIHJhdyBvciB1ZHAgc29ja2V0IGhlcmUKKwkJICogaWYgKGxpc3Rlbl9tb2RlICE9IExJU1RFTl9OT05FICYmIHNvY2tmZCA8IDApLAorCQkgKiBidXQgb24gZmFzdCBuZXR3b3JrIHJlbmV3IHJlc3BvbnNlcyByZXR1cm4gZmFzdGVyCisJCSAqIHRoYW4gd2Ugb3BlbiBzb2NrZXRzLiBUaHVzIHRoaXMgY29kZSBpcyBtb3ZlZAorCQkgKiB0byBjaGFuZ2VfbGlzdGVuX21vZGUoKS4gVGh1cyB3ZSBvcGVuIGxpc3RlbiBzb2NrZXQKKwkJICogQkVGT1JFIHdlIHNlbmQgcmVuZXcgcmVxdWVzdCAoc2VlICJjYXNlIEJPVU5EOiIpLiAqLworCisJCW1heF9mZCA9IHVkaGNwX3NwX2ZkX3NldCgmcmZkcywgc29ja2ZkKTsKKworCQl0di50dl9zZWMgPSB0aW1lb3V0IC0gYWxyZWFkeV93YWl0ZWRfc2VjOworCQl0di50dl91c2VjID0gMDsKKwkJcmV0dmFsID0gMDsKKwkJLyogSWYgd2UgYWxyZWFkeSB0aW1lZCBvdXQsIGZhbGwgdGhyb3VnaCB3aXRoIHJldHZhbCA9IDAsIGVsc2UuLi4gKi8KKwkJaWYgKChpbnQpdHYudHZfc2VjID4gMCkgeworCQkJdGltZXN0YW1wX2JlZm9yZV93YWl0ID0gKHVuc2lnbmVkKW1vbm90b25pY19zZWMoKTsKKwkJCWxvZzEoIldhaXRpbmcgb24gc2VsZWN0Li4uIik7CisJCQlyZXR2YWwgPSBzZWxlY3QobWF4X2ZkICsgMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCS8qIEVJTlRSPyBBIHNpZ25hbCB3YXMgY2F1Z2h0LCBkb24ndCBwYW5pYyAqLworCQkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCQlhbHJlYWR5X3dhaXRlZF9zZWMgKz0gKHVuc2lnbmVkKW1vbm90b25pY19zZWMoKSAtIHRpbWVzdGFtcF9iZWZvcmVfd2FpdDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEVsc2U6IGFuIGVycm9yIG9jY3VyZWQsIHBhbmljISAqLworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VsZWN0Iik7CisJCQl9CisJCX0KKworCQkvKiBJZiB0aW1lb3V0IGRyb3BwZWQgdG8gemVybywgdGltZSB0byBiZWNvbWUgYWN0aXZlOgorCQkgKiByZXNlbmQgZGlzY292ZXIvcmVuZXcvd2hhdGV2ZXIKKwkJICovCisJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJLyogV2hlbiBydW5uaW5nIG9uIGEgYnJpZGdlLCB0aGUgaWZpbmRleCBtYXkgaGF2ZSBjaGFuZ2VkCisJCQkgKiAoZS5nLiBpZiBtZW1iZXIgaW50ZXJmYWNlcyB3ZXJlIGFkZGVkL3JlbW92ZWQKKwkJCSAqIG9yIGlmIHRoZSBzdGF0dXMgb2YgdGhlIGJyaWRnZSBjaGFuZ2VkKS4KKwkJCSAqIFJlZnJlc2ggaWZpbmRleCBhbmQgY2xpZW50X21hYzoKKwkJCSAqLworCQkJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNsaWVudF9jb25maWcuaW50ZXJmYWNlLAorCQkJCQkmY2xpZW50X2NvbmZpZy5pZmluZGV4LAorCQkJCQlOVUxMLAorCQkJCQljbGllbnRfY29uZmlnLmNsaWVudF9tYWMpCisJCQkpIHsKKwkJCQlyZXR1cm4gMTsgLyogaWZhY2UgaXMgZ29uZT8gKi8KKwkJCX0KKwkJCWlmIChjbGllbnRpZF9tYWNfcHRyKQorCQkJCW1lbWNweShjbGllbnRpZF9tYWNfcHRyLCBjbGllbnRfY29uZmlnLmNsaWVudF9tYWMsIDYpOworCisJCQkvKiBXZSB3aWxsIHJlc3RhcnQgdGhlIHdhaXQgaW4gYW55IGNhc2UgKi8KKwkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisKKwkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWNhc2UgSU5JVF9TRUxFQ1RJTkc6CisJCQkJaWYgKHBhY2tldF9udW0gPCBkaXNjb3Zlcl9yZXRyaWVzKSB7CisJCQkJCWlmIChwYWNrZXRfbnVtID09IDApCisJCQkJCQl4aWQgPSByYW5kb21feGlkKCk7CisJCQkJCS8qIGJyb2FkY2FzdCAqLworCQkJCQlzZW5kX2Rpc2NvdmVyKHhpZCwgcmVxdWVzdGVkX2lwKTsKKwkJCQkJdGltZW91dCA9IGRpc2NvdmVyX3RpbWVvdXQ7CisJCQkJCXBhY2tldF9udW0rKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorIGxlYXNlZmFpbDoKKwkJCQl1ZGhjcF9ydW5fc2NyaXB0KE5VTEwsICJsZWFzZWZhaWwiKTsKKyNpZiBCQl9NTVUgLyogLWIgaXMgbm90IHN1cHBvcnRlZCBvbiBOT01NVSAqLworCQkJCWlmIChvcHQgJiBPUFRfYikgeyAvKiBiYWNrZ3JvdW5kIGlmIG5vIGxlYXNlICovCisJCQkJCWJiX2luZm9fbXNnKCJObyBsZWFzZSwgZm9ya2luZyB0byBiYWNrZ3JvdW5kIik7CisJCQkJCWNsaWVudF9iYWNrZ3JvdW5kKCk7CisJCQkJCS8qIGRvIG5vdCBiYWNrZ3JvdW5kIGFnYWluISAqLworCQkJCQlvcHQgPSAoKG9wdCAmIH5PUFRfYikgfCBPUFRfZik7CisJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQlpZiAob3B0ICYgT1BUX24pIHsgLyogYWJvcnQgaWYgbm8gbGVhc2UgKi8KKwkJCQkJYmJfaW5mb19tc2coIk5vIGxlYXNlLCBmYWlsaW5nIik7CisJCQkJCXJldHZhbCA9IDE7CisJCQkJCWdvdG8gcmV0OworCQkJCX0KKwkJCQkvKiB3YWl0IGJlZm9yZSB0cnlpbmcgYWdhaW4gKi8KKwkJCQl0aW1lb3V0ID0gdHJ5YWdhaW5fdGltZW91dDsKKwkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgUkVRVUVTVElORzoKKwkJCQlpZiAocGFja2V0X251bSA8IGRpc2NvdmVyX3JldHJpZXMpIHsKKwkJCQkJLyogc2VuZCBicm9hZGNhc3Qgc2VsZWN0IHBhY2tldCAqLworCQkJCQlzZW5kX3NlbGVjdCh4aWQsIHNlcnZlcl9hZGRyLCByZXF1ZXN0ZWRfaXApOworCQkJCQl0aW1lb3V0ID0gZGlzY292ZXJfdGltZW91dDsKKwkJCQkJcGFja2V0X251bSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogVGltZWQgb3V0LCBnbyBiYWNrIHRvIGluaXQgc3RhdGUuCisJCQkJICogImRpc2NvdmVyLi4uc2VsZWN0Li4uZGlzY292ZXIuLi4iIGxvb3BzCisJCQkJICogd2VyZSBzZWVuIGluIHRoZSB3aWxkLiBUcmVhdCB0aGVtIHNpbWlsYXJseQorCQkJCSAqIHRvICJubyByZXNwb25zZSB0byBkaXNjb3ZlciIgY2FzZSAqLworCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwkJCQlzdGF0ZSA9IElOSVRfU0VMRUNUSU5HOworCQkJCWdvdG8gbGVhc2VmYWlsOworCQkJY2FzZSBCT1VORDoKKwkJCQkvKiAxLzIgbGVhc2UgcGFzc2VkLCBlbnRlciByZW5ld2luZyBzdGF0ZSAqLworCQkJCXN0YXRlID0gUkVORVdJTkc7CisJCQkJY2xpZW50X2NvbmZpZy5maXJzdF9zZWNzID0gMDsgLyogbWFrZSBzZWNzIGZpZWxkIGNvdW50IGZyb20gMCAqLworCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fS0VSTkVMKTsKKwkJCQlsb2cxKCJFbnRlcmluZyByZW5ldyBzdGF0ZSIpOworCQkJCS8qIGZhbGwgcmlnaHQgdGhyb3VnaCAqLworCQkJY2FzZSBSRU5FV19SRVFVRVNURUQ6IC8qIG1hbnVhbCAoU0lHVVNSMSkgcmVuZXcgKi8KKwkJCWNhc2VfUkVORVdfUkVRVUVTVEVEOgorCQkJY2FzZSBSRU5FV0lORzoKKwkJCQlpZiAodGltZW91dCA+IDYwKSB7CisJCQkJCS8qIHNlbmQgYW4gdW5pY2FzdCByZW5ldyByZXF1ZXN0ICovCisJCQkvKiBTb21ldGltZXMgb2JzZXJ2ZWQgdG8gZmFpbCAoRUFERFJOT1RBVkFJTCkgdG8gYmluZAorCQkJICogYSBuZXcgVURQIHNvY2tldCBmb3Igc2VuZGluZyBpbnNpZGUgc2VuZF9yZW5ldy4KKwkJCSAqIEkgaGF6YXJkIHRvIGd1ZXNzIGV4aXN0aW5nIGxpc3RlbmluZyBzb2NrZXQKKwkJCSAqIGlzIHNvbWVob3cgY29uZmxpY3Rpbmcgd2l0aCBpdCwgYnV0IHdoeSBpcyBpdAorCQkJICogbm90IGRldGVybWluaXN0aWMgdGhlbj8hIFN0cmFuZ2UuCisJCQkgKiBBbnl3YXksIGl0IGRvZXMgcmVjb3ZlciBieSBldmVudHVhbGx5IGZhaWxpbmcgdGhyb3VnaAorCQkJICogaW50byBJTklUX1NFTEVDVElORyBzdGF0ZS4KKwkJCSAqLworCQkJCQlzZW5kX3JlbmV3KHhpZCwgc2VydmVyX2FkZHIsIHJlcXVlc3RlZF9pcCk7CisJCQkJCXRpbWVvdXQgPj49IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBUaW1lZCBvdXQsIGVudGVyIHJlYmluZGluZyBzdGF0ZSAqLworCQkJCWxvZzEoIkVudGVyaW5nIHJlYmluZGluZyBzdGF0ZSIpOworCQkJCXN0YXRlID0gUkVCSU5ESU5HOworCQkJCS8qIGZhbGwgcmlnaHQgdGhyb3VnaCAqLworCQkJY2FzZSBSRUJJTkRJTkc6CisJCQkJLyogU3dpdGNoIHRvIGJjYXN0IHJlY2VpdmUgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJLyogTGVhc2UgaXMgKnJlYWxseSogYWJvdXQgdG8gcnVuIG91dCwKKwkJCQkgKiB0cnkgdG8gZmluZCBESENQIHNlcnZlciB1c2luZyBicm9hZGNhc3QgKi8KKwkJCQlpZiAodGltZW91dCA+IDApIHsKKwkJCQkJLyogc2VuZCBhIGJyb2FkY2FzdCByZW5ldyByZXF1ZXN0ICovCisJCQkJCXNlbmRfcmVuZXcoeGlkLCAwIC8qSU5BRERSX0FOWSovLCByZXF1ZXN0ZWRfaXApOworCQkJCQl0aW1lb3V0ID4+PSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogVGltZWQgb3V0LCBlbnRlciBpbml0IHN0YXRlICovCisJCQkJYmJfaW5mb19tc2coIkxlYXNlIGxvc3QsIGVudGVyaW5nIGluaXQgc3RhdGUiKTsKKwkJCQl1ZGhjcF9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCQkJCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJCQkJY2xpZW50X2NvbmZpZy5maXJzdF9zZWNzID0gMDsgLyogbWFrZSBzZWNzIGZpZWxkIGNvdW50IGZyb20gMCAqLworCQkJCS8qdGltZW91dCA9IDA7IC0gYWxyZWFkeSBpcyAqLworCQkJCXBhY2tldF9udW0gPSAwOworCQkJCWNvbnRpbnVlOworCQkJLyogY2FzZSBSRUxFQVNFRDogKi8KKwkJCX0KKwkJCS8qIHlhaCwgSSBrbm93LCAqeW91KiBzYXkgaXQgd291bGQgbmV2ZXIgaGFwcGVuICovCisJCQl0aW1lb3V0ID0gSU5UX01BWDsKKwkJCWNvbnRpbnVlOyAvKiBiYWNrIHRvIG1haW4gbG9vcCAqLworCQl9IC8qIGlmIHNlbGVjdCB0aW1lZCBvdXQgKi8KKworCQkvKiBzZWxlY3QoKSBkaWRuJ3QgdGltZW91dCwgc29tZXRoaW5nIGhhcHBlbmVkICovCisKKwkJLyogSXMgaXQgYSBzaWduYWw/ICovCisJCS8qIG5vdGU6IHVkaGNwX3NwX3JlYWQgY2hlY2tzIEZEX0lTU0VUIGJlZm9yZSByZWFkaW5nICovCisJCXN3aXRjaCAodWRoY3Bfc3BfcmVhZCgmcmZkcykpIHsKKwkJY2FzZSBTSUdVU1IxOgorCQkJY2xpZW50X2NvbmZpZy5maXJzdF9zZWNzID0gMDsgLyogbWFrZSBzZWNzIGZpZWxkIGNvdW50IGZyb20gMCAqLworCQkJcGVyZm9ybV9yZW5ldygpOworCQkJaWYgKHN0YXRlID09IFJFTkVXX1JFUVVFU1RFRCkKKwkJCQlnb3RvIGNhc2VfUkVORVdfUkVRVUVTVEVEOworCQkJLyogU3RhcnQgdGhpbmdzIG92ZXIgKi8KKwkJCXBhY2tldF9udW0gPSAwOworCQkJLyogS2lsbCBhbnkgdGltZW91dHMsIHVzZXIgd2FudHMgdGhpcyB0byBodXJyeSBhbG9uZyAqLworCQkJdGltZW91dCA9IDA7CisJCQljb250aW51ZTsKKwkJY2FzZSBTSUdVU1IyOgorCQkJcGVyZm9ybV9yZWxlYXNlKHJlcXVlc3RlZF9pcCwgc2VydmVyX2FkZHIpOworCQkJdGltZW91dCA9IElOVF9NQVg7CisJCQljb250aW51ZTsKKwkJY2FzZSBTSUdURVJNOgorCQkJYmJfaW5mb19tc2coIlJlY2VpdmVkIFNJR1RFUk0iKTsKKwkJCWlmIChvcHQgJiBPUFRfUikgLyogcmVsZWFzZSBvbiBxdWl0ICovCisJCQkJcGVyZm9ybV9yZWxlYXNlKHJlcXVlc3RlZF9pcCwgc2VydmVyX2FkZHIpOworCQkJZ290byByZXQwOworCQl9CisKKwkJLyogSXMgaXQgYSBwYWNrZXQ/ICovCisJCWlmIChsaXN0ZW5fbW9kZSA9PSBMSVNURU5fTk9ORSB8fCAhRkRfSVNTRVQoc29ja2ZkLCAmcmZkcykpCisJCQljb250aW51ZTsgLyogbm8gKi8KKworCQl7CisJCQlpbnQgbGVuOworCisJCQkvKiBBIHBhY2tldCBpcyByZWFkeSwgcmVhZCBpdCAqLworCQkJaWYgKGxpc3Rlbl9tb2RlID09IExJU1RFTl9LRVJORUwpCisJCQkJbGVuID0gdWRoY3BfcmVjdl9rZXJuZWxfcGFja2V0KCZwYWNrZXQsIHNvY2tmZCk7CisJCQllbHNlCisJCQkJbGVuID0gdWRoY3BfcmVjdl9yYXdfcGFja2V0KCZwYWNrZXQsIHNvY2tmZCk7CisJCQlpZiAobGVuID09IC0xKSB7CisJCQkJLyogRXJyb3IgaXMgc2V2ZXJlLCByZW9wZW4gc29ja2V0ICovCisJCQkJYmJfaW5mb19tc2coIlJlYWQgZXJyb3I6ICVzLCByZW9wZW5pbmcgc29ja2V0Iiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzbGVlcChkaXNjb3Zlcl90aW1lb3V0KTsgLyogMyBzZWNvbmRzIGJ5IGRlZmF1bHQgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUobGlzdGVuX21vZGUpOyAvKiBqdXN0IGNsb3NlIGFuZCByZW9wZW4gKi8KKwkJCX0KKwkJCS8qIElmIHRoaXMgcGFja2V0IHdpbGwgdHVybiBvdXQgdG8gYmUgdW5yZWxhdGVkL2JvZ3VzLAorCQkJICogd2Ugd2lsbCBnbyBiYWNrIGFuZCB3YWl0IGZvciBuZXh0IG9uZS4KKwkJCSAqIEJlIHN1cmUgdGltZW91dCBpcyBwcm9wZXJseSBkZWNyZWFzZWQuICovCisJCQlhbHJlYWR5X3dhaXRlZF9zZWMgKz0gKHVuc2lnbmVkKW1vbm90b25pY19zZWMoKSAtIHRpbWVzdGFtcF9iZWZvcmVfd2FpdDsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBhY2tldC54aWQgIT0geGlkKSB7CisJCQlsb2cxKCJ4aWQgJXggKG91ciBpcyAleCksIGlnbm9yaW5nIHBhY2tldCIsCisJCQkJKHVuc2lnbmVkKXBhY2tldC54aWQsICh1bnNpZ25lZCl4aWQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgcGFja2V0cyB0aGF0IGFyZW4ndCBmb3IgdXMgKi8KKwkJaWYgKHBhY2tldC5obGVuICE9IDYKKwkJIHx8IG1lbWNtcChwYWNrZXQuY2hhZGRyLCBjbGllbnRfY29uZmlnLmNsaWVudF9tYWMsIDYpICE9IDAKKwkJKSB7CisvL0ZJWE1FOiBuZWVkIHRvIGFsc28gY2hlY2sgdGhhdCBsYXN0IDEwIGJ5dGVzIGFyZSB6ZXJvCisJCQlsb2cxKCJjaGFkZHIgZG9lcyBub3QgbWF0Y2gsIGlnbm9yaW5nIHBhY2tldCIpOyAvLyBsb2cyPworCQkJY29udGludWU7CisJCX0KKworCQltZXNzYWdlID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX01FU1NBR0VfVFlQRSk7CisJCWlmIChtZXNzYWdlID09IE5VTEwpIHsKKwkJCWJiX2Vycm9yX21zZygibm8gbWVzc2FnZSB0eXBlIG9wdGlvbiwgaWdub3JpbmcgcGFja2V0Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBJTklUX1NFTEVDVElORzoKKwkJCS8qIE11c3QgYmUgYSBESENQT0ZGRVIgdG8gb25lIG9mIG91ciB4aWQncyAqLworCQkJaWYgKCptZXNzYWdlID09IERIQ1BPRkZFUikgeworCQkvKiBUT0RPOiB3aHkgd2UgZG9uJ3QganVzdCBmZXRjaCBzZXJ2ZXIncyBJUCBmcm9tIElQIGhlYWRlcj8gKi8KKwkJCQl0ZW1wID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX1NFUlZFUl9JRCk7CisJCQkJaWYgKCF0ZW1wKSB7CisJCQkJCWJiX2Vycm9yX21zZygibm8gc2VydmVyIElELCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCQkJY29udGludWU7CisJCQkJCS8qIHN0aWxsIHNlbGVjdGluZyAtIHRoaXMgc2VydmVyIGxvb2tzIGJhZCAqLworCQkJCX0KKwkJCQkvKiBpdCBJUyB1bmFsaWduZWQgc29tZXRpbWVzLCBkb24ndCAib3B0aW1pemUiICovCisJCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHNlcnZlcl9hZGRyLCB0ZW1wKTsKKwkJCQkvKnhpZCA9IHBhY2tldC54aWQ7IC0gYWxyZWFkeSBpcyAqLworCQkJCXJlcXVlc3RlZF9pcCA9IHBhY2tldC55aWFkZHI7CisKKwkJCQkvKiBlbnRlciByZXF1ZXN0aW5nIHN0YXRlICovCisJCQkJc3RhdGUgPSBSRVFVRVNUSU5HOworCQkJCXRpbWVvdXQgPSAwOworCQkJCXBhY2tldF9udW0gPSAwOworCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJY2FzZSBSRVFVRVNUSU5HOgorCQljYXNlIFJFTkVXSU5HOgorCQljYXNlIFJFTkVXX1JFUVVFU1RFRDoKKwkJY2FzZSBSRUJJTkRJTkc6CisJCQlpZiAoKm1lc3NhZ2UgPT0gREhDUEFDSykgeworCQkJCXRlbXAgPSB1ZGhjcF9nZXRfb3B0aW9uKCZwYWNrZXQsIERIQ1BfTEVBU0VfVElNRSk7CisJCQkJaWYgKCF0ZW1wKSB7CisJCQkJCWJiX2Vycm9yX21zZygibm8gbGVhc2UgdGltZSB3aXRoIEFDSywgdXNpbmcgMSBob3VyIGxlYXNlIik7CisJCQkJCWxlYXNlX3NlY29uZHMgPSA2MCAqIDYwOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGl0IElTIHVuYWxpZ25lZCBzb21ldGltZXMsIGRvbid0ICJvcHRpbWl6ZSIgKi8KKwkJCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKGxlYXNlX3NlY29uZHMsIHRlbXApOworCQkJCQlsZWFzZV9zZWNvbmRzID0gbnRvaGwobGVhc2Vfc2Vjb25kcyk7CisJCQkJCWxlYXNlX3NlY29uZHMgJj0gMHgwZmZmZmZmZjsgLyogcGFyYW5vaWE6IG11c3Qgbm90IGJlIHByb25lIHRvIG92ZXJmbG93cyAqLworCQkJCQlpZiAobGVhc2Vfc2Vjb25kcyA8IDEwKSAvKiBhbmQgbm90IHRvbyBzbWFsbCAqLworCQkJCQkJbGVhc2Vfc2Vjb25kcyA9IDEwOworCQkJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUENfQVJQSU5HCisJCQkJaWYgKG9wdCAmIE9QVF9hKSB7CisvKiBSRkMgMjEzMSAzLjEgcGFyYWdyYXBoIDU6CisgKiAiVGhlIGNsaWVudCByZWNlaXZlcyB0aGUgREhDUEFDSyBtZXNzYWdlIHdpdGggY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVycy4gVGhlIGNsaWVudCBTSE9VTEQgcGVyZm9ybSBhIGZpbmFsIGNoZWNrIG9uIHRoZQorICogcGFyYW1ldGVycyAoZS5nLiwgQVJQIGZvciBhbGxvY2F0ZWQgbmV0d29yayBhZGRyZXNzKSwgYW5kIG5vdGVzCisgKiB0aGUgZHVyYXRpb24gb2YgdGhlIGxlYXNlIHNwZWNpZmllZCBpbiB0aGUgREhDUEFDSyBtZXNzYWdlLiBBdCB0aGlzCisgKiBwb2ludCwgdGhlIGNsaWVudCBpcyBjb25maWd1cmVkLiBJZiB0aGUgY2xpZW50IGRldGVjdHMgdGhhdCB0aGUKKyAqIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiB1c2UgKGUuZy4sIHRocm91Z2ggdGhlIHVzZSBvZiBBUlApLAorICogdGhlIGNsaWVudCBNVVNUIHNlbmQgYSBESENQREVDTElORSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlc3RhcnRzCisgKiB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLi4uIiAqLworCQkJCQlpZiAoIWFycHBpbmcocGFja2V0LnlpYWRkciwKKwkJCQkJCQlOVUxMLAorCQkJCQkJCSh1aW50MzJfdCkgMCwKKwkJCQkJCQljbGllbnRfY29uZmlnLmNsaWVudF9tYWMsCisJCQkJCQkJY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UpCisJCQkJCSkgeworCQkJCQkJYmJfaW5mb19tc2coIk9mZmVyZWQgYWRkcmVzcyBpcyBpbiB1c2UgIgorCQkJCQkJCSIoZ290IEFSUCByZXBseSksIGRlY2xpbmluZyIpOworCQkJCQkJc2VuZF9kZWNsaW5lKHhpZCwgc2VydmVyX2FkZHIsIHBhY2tldC55aWFkZHIpOworCisJCQkJCQlpZiAoc3RhdGUgIT0gUkVRVUVTVElORykKKwkJCQkJCQl1ZGhjcF9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCQkJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9SQVcpOworCQkJCQkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQkJCXJlcXVlc3RlZF9pcCA9IDA7CisJCQkJCQl0aW1lb3V0ID0gdHJ5YWdhaW5fdGltZW91dDsKKwkJCQkJCXBhY2tldF9udW0gPSAwOworCQkJCQkJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKwkJCQkJCWNvbnRpbnVlOyAvKiBiYWNrIHRvIG1haW4gbG9vcCAqLworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJLyogZW50ZXIgYm91bmQgc3RhdGUgKi8KKwkJCQl0aW1lb3V0ID0gbGVhc2Vfc2Vjb25kcyAvIDI7CisJCQkJeworCQkJCQlzdHJ1Y3QgaW5fYWRkciB0ZW1wX2FkZHI7CisJCQkJCXRlbXBfYWRkci5zX2FkZHIgPSBwYWNrZXQueWlhZGRyOworCQkJCQliYl9pbmZvX21zZygiTGVhc2Ugb2YgJXMgb2J0YWluZWQsIGxlYXNlIHRpbWUgJXUiLAorCQkJCQkJaW5ldF9udG9hKHRlbXBfYWRkciksICh1bnNpZ25lZClsZWFzZV9zZWNvbmRzKTsKKwkJCQl9CisJCQkJcmVxdWVzdGVkX2lwID0gcGFja2V0LnlpYWRkcjsKKwkJCQl1ZGhjcF9ydW5fc2NyaXB0KCZwYWNrZXQsIHN0YXRlID09IFJFUVVFU1RJTkcgPyAiYm91bmQiIDogInJlbmV3Iik7CisKKwkJCQlzdGF0ZSA9IEJPVU5EOworCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fTk9ORSk7CisJCQkJaWYgKG9wdCAmIE9QVF9xKSB7IC8qIHF1aXQgYWZ0ZXIgbGVhc2UgKi8KKwkJCQkJaWYgKG9wdCAmIE9QVF9SKSAvKiByZWxlYXNlIG9uIHF1aXQgKi8KKwkJCQkJCXBlcmZvcm1fcmVsZWFzZShyZXF1ZXN0ZWRfaXAsIHNlcnZlcl9hZGRyKTsKKwkJCQkJZ290byByZXQwOworCQkJCX0KKwkJCQkvKiBmdXR1cmUgcmVuZXcgZmFpbHVyZXMgc2hvdWxkIG5vdCBleGl0IChKTSkgKi8KKwkJCQlvcHQgJj0gfk9QVF9uOworI2lmIEJCX01NVSAvKiBOT01NVSBjYXNlIGJhY2tncm91bmRlZCBlYXJsaWVyICovCisJCQkJaWYgKCEob3B0ICYgT1BUX2YpKSB7CisJCQkJCWNsaWVudF9iYWNrZ3JvdW5kKCk7CisJCQkJCS8qIGRvIG5vdCBiYWNrZ3JvdW5kIGFnYWluISAqLworCQkJCQlvcHQgPSAoKG9wdCAmIH5PUFRfYikgfCBPUFRfZik7CisJCQkJfQorI2VuZGlmCisJCQkJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKwkJCQljb250aW51ZTsgLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwkJCX0KKwkJCWlmICgqbWVzc2FnZSA9PSBESENQTkFLKSB7CisJCQkJLyogcmV0dXJuIHRvIGluaXQgc3RhdGUgKi8KKwkJCQliYl9pbmZvX21zZygiUmVjZWl2ZWQgREhDUCBOQUsiKTsKKwkJCQl1ZGhjcF9ydW5fc2NyaXB0KCZwYWNrZXQsICJuYWsiKTsKKwkJCQlpZiAoc3RhdGUgIT0gUkVRVUVTVElORykKKwkJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJc2xlZXAoMyk7IC8qIGF2b2lkIGV4Y2Vzc2l2ZSBuZXR3b3JrIHRyYWZmaWMgKi8KKwkJCQlzdGF0ZSA9IElOSVRfU0VMRUNUSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQlyZXF1ZXN0ZWRfaXAgPSAwOworCQkJCXRpbWVvdXQgPSAwOworCQkJCXBhY2tldF9udW0gPSAwOworCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJLyogY2FzZSBCT1VORDogLSBpZ25vcmUgYWxsIHBhY2tldHMgKi8KKwkJLyogY2FzZSBSRUxFQVNFRDogLSBpZ25vcmUgYWxsIHBhY2tldHMgKi8KKwkJfQorCQkvKiBiYWNrIHRvIG1haW4gbG9vcCAqLworCX0gLyogZm9yICg7OykgLSBtYWluIGxvb3AgZW5kcyAqLworCisgcmV0MDoKKwlyZXR2YWwgPSAwOworIHJldDoKKwkvKmlmIChjbGllbnRfY29uZmlnLnBpZGZpbGUpIC0gcmVtb3ZlX3BpZGZpbGUgaGFzIGl0cyBvd24gY2hlY2sgKi8KKwkJcmVtb3ZlX3BpZGZpbGUoY2xpZW50X2NvbmZpZy5waWRmaWxlKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5oIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzU5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3BjLmgKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBVREhDUF9ESENQQ19ICisjZGVmaW5lIFVESENQX0RIQ1BDX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworc3RydWN0IGNsaWVudF9jb25maWdfdCB7CisJdWludDhfdCBjbGllbnRfbWFjWzZdOyAgICAgICAgICAvKiBPdXIgbWFjIGFkZHJlc3MgKi8KKwljaGFyIG5vX2RlZmF1bHRfb3B0aW9uczsgICAgICAgIC8qIERvIG5vdCBpbmNsdWRlIGRlZmF1bHQgb3B0aW9ucyBpbiByZXF1ZXN0ICovCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKHVpbnQxNl90IHBvcnQ7KQorCWludCBpZmluZGV4OyAgICAgICAgICAgICAgICAgICAgLyogSW5kZXggbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UgdG8gdXNlICovCisJdWludDhfdCBvcHRfbWFza1syNTYgLyA4XTsgICAgICAvKiBCaXRtYXNrIG9mIG9wdGlvbnMgdG8gc2VuZCAoLU8gb3B0aW9uKSAqLworCWNvbnN0IGNoYXIgKmludGVyZmFjZTsgICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0byB1c2UgKi8KKwljaGFyICpwaWRmaWxlOyAgICAgICAgICAgICAgICAgIC8qIE9wdGlvbmFsbHkgc3RvcmUgdGhlIHByb2Nlc3MgSUQgKi8KKwljb25zdCBjaGFyICpzY3JpcHQ7ICAgICAgICAgICAgIC8qIFVzZXIgc2NyaXB0IHRvIHJ1biBhdCBkaGNwIGV2ZW50cyAqLworCXN0cnVjdCBvcHRpb25fc2V0ICpvcHRpb25zOyAgICAgLyogbGlzdCBvZiBESENQIG9wdGlvbnMgdG8gc2VuZCB0byBzZXJ2ZXIgKi8KKwl1aW50OF90ICpjbGllbnRpZDsgICAgICAgICAgICAgIC8qIE9wdGlvbmFsIGNsaWVudCBpZCB0byB1c2UgKi8KKwl1aW50OF90ICp2ZW5kb3JjbGFzczsgICAgICAgICAgIC8qIE9wdGlvbmFsIHZlbmRvciBjbGFzcy1pZCB0byB1c2UgKi8KKwl1aW50OF90ICpob3N0bmFtZTsgICAgICAgICAgICAgIC8qIE9wdGlvbmFsIGhvc3RuYW1lIHRvIHVzZSAqLworCXVpbnQ4X3QgKmZxZG47ICAgICAgICAgICAgICAgICAgLyogT3B0aW9uYWwgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIHRvIHVzZSAqLworCisJdWludDE2X3QgZmlyc3Rfc2VjczsKKwl1aW50MTZfdCBsYXN0X3NlY3M7Cit9IEZJWF9BTElBU0lORzsKKworLyogc2VydmVyX2NvbmZpZyBzaXRzIGluIDFzdCBoYWxmIG9mIGJiX2NvbW1vbl9idWZzaXoxICovCisjZGVmaW5lIGNsaWVudF9jb25maWcgKCooc3RydWN0IGNsaWVudF9jb25maWdfdCopKCZiYl9jb21tb25fYnVmc2l6MVtDT01NT05fQlVGU0laRSAvIDJdKSkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKyNkZWZpbmUgQ0xJRU5UX1BPUlQgKGNsaWVudF9jb25maWcucG9ydCkKKyNlbHNlCisjZGVmaW5lIENMSUVOVF9QT1JUIDY4CisjZW5kaWYKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2RoY3BkLmMgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3BkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NDcyZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuYwpAQCAtMCwwICsxLDY2NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdWRoY3Agc2VydmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTWF0dGhldyBSYW1zYXkgPG1hdHRoZXdyQG1vcmV0b24uY29tLmF1PgorICoJCQlDaHJpcyBUcmV3IDxjdHJld0Btb3JldG9uLmNvbS5hdT4KKyAqCisgKiBSZXdyaXRlIGJ5IFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1ZGhjcGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZlNdIiBJRl9GRUFUVVJFX1VESENQX1BPUlQoIiBbLVAgTl0iKSAiIFtDT05GRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgdWRoY3BkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiREhDUCBzZXJ2ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOiAgICAgIlxuCS1TCUxvZyB0byBzeXNsb2cgdG9vIgorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUF9QT1JUKAorLy91c2FnZTogICAgICJcbgktUCBOCVVzZSBwb3J0IE4gKGRlZmF1bHQgNjcpIgorLy91c2FnZToJKQorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGMuaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorCisKKy8qIFNlbmQgYSBwYWNrZXQgdG8gYSBzcGVjaWZpYyBtYWMgYWRkcmVzcyBhbmQgaXAgYWRkcmVzcyBieSBjcmVhdGluZyBvdXIgb3duIGlwIHBhY2tldCAqLworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRfdG9fY2xpZW50KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsIGludCBmb3JjZV9icm9hZGNhc3QpCit7CisJY29uc3QgdWludDhfdCAqY2hhZGRyOworCXVpbnQzMl90IGNpYWRkcjsKKworCS8vIFdhczoKKwkvL2lmIChmb3JjZV9icm9hZGNhc3QpIHsgLyogYnJvYWRjYXN0ICovIH0KKwkvL2Vsc2UgaWYgKGRoY3BfcGt0LT5jaWFkZHIpIHsgLyogdW5pY2FzdCB0byBkaGNwX3BrdC0+Y2lhZGRyICovIH0KKwkvL2Vsc2UgaWYgKGRoY3BfcGt0LT5mbGFncyAmIGh0b25zKEJST0FEQ0FTVF9GTEFHKSkgeyAvKiBicm9hZGNhc3QgKi8gfQorCS8vZWxzZSB7IC8qIHVuaWNhc3QgdG8gZGhjcF9wa3QtPnlpYWRkciAqLyB9CisJLy8gQnV0IHRoaXMgaXMgd3Jvbmc6IHlpYWRkciBpcyBfb3VyXyBpZGVhIHdoYXQgY2xpZW50J3MgSVAgaXMKKwkvLyAoZm9yIGV4YW1wbGUsIGZyb20gbGVhc2UgZmlsZSkuIENsaWVudCBtYXkgbm90IGtub3cgdGhhdCwKKwkvLyBhbmQgbWF5IG5vdCBoYXZlIFVEUCBzb2NrZXQgbGlzdGVuaW5nIG9uIHRoYXQgSVAhCisJLy8gV2Ugc2hvdWxkIG5ldmVyIHVuaWNhc3QgdG8gZGhjcF9wa3QtPnlpYWRkciEKKwkvLyBkaGNwX3BrdC0+Y2lhZGRyLCBPVE9ILCBjb21lcyBmcm9tIGNsaWVudCdzIHJlcXVlc3QgcGFja2V0LAorCS8vIGFuZCBjYW4gYmUgdXNlZC4KKworCWlmIChmb3JjZV9icm9hZGNhc3QKKwkgfHwgKGRoY3BfcGt0LT5mbGFncyAmIGh0b25zKEJST0FEQ0FTVF9GTEFHKSkKKwkgfHwgZGhjcF9wa3QtPmNpYWRkciA9PSAwCisJKSB7CisJCWxvZzEoIkJyb2FkY2FzdGluZyBwYWNrZXQgdG8gY2xpZW50Iik7CisJCWNpYWRkciA9IElOQUREUl9CUk9BRENBU1Q7CisJCWNoYWRkciA9IE1BQ19CQ0FTVF9BRERSOworCX0gZWxzZSB7CisJCWxvZzEoIlVuaWNhc3RpbmcgcGFja2V0IHRvIGNsaWVudCBjaWFkZHIiKTsKKwkJY2lhZGRyID0gZGhjcF9wa3QtPmNpYWRkcjsKKwkJY2hhZGRyID0gZGhjcF9wa3QtPmNoYWRkcjsKKwl9CisKKwl1ZGhjcF9zZW5kX3Jhd19wYWNrZXQoZGhjcF9wa3QsCisJCS8qc3JjKi8gc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwLCBTRVJWRVJfUE9SVCwKKwkJLypkc3QqLyBjaWFkZHIsIENMSUVOVF9QT1JULCBjaGFkZHIsCisJCXNlcnZlcl9jb25maWcuaWZpbmRleCk7Cit9CisKKy8qIFNlbmQgYSBwYWNrZXQgdG8gZ2F0ZXdheV9uaXAgdXNpbmcgdGhlIGtlcm5lbCBpcCBzdGFjayAqLworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRfdG9fcmVsYXkoc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwX3BrdCkKK3sKKwlsb2cxKCJGb3J3YXJkaW5nIHBhY2tldCB0byByZWxheSIpOworCisJdWRoY3Bfc2VuZF9rZXJuZWxfcGFja2V0KGRoY3BfcGt0LAorCQkJc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwLCBTRVJWRVJfUE9SVCwKKwkJCWRoY3BfcGt0LT5nYXRld2F5X25pcCwgU0VSVkVSX1BPUlQpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LCBpbnQgZm9yY2VfYnJvYWRjYXN0KQoreworCWlmIChkaGNwX3BrdC0+Z2F0ZXdheV9uaXApCisJCXNlbmRfcGFja2V0X3RvX3JlbGF5KGRoY3BfcGt0KTsKKwllbHNlCisJCXNlbmRfcGFja2V0X3RvX2NsaWVudChkaGNwX3BrdCwgZm9yY2VfYnJvYWRjYXN0KTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIHN0cnVjdCBkaGNwX3BhY2tldCAqb2xkcGFja2V0LCBjaGFyIHR5cGUpCit7CisJLyogU2V0cyBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSBmaWVsZHMKKwkgKiBhbmQgYWRkcyBESENQX01FU1NBR0VfVFlQRSBvcHRpb24gKi8KKwl1ZGhjcF9pbml0X2hlYWRlcihwYWNrZXQsIHR5cGUpOworCisJcGFja2V0LT54aWQgPSBvbGRwYWNrZXQtPnhpZDsKKwltZW1jcHkocGFja2V0LT5jaGFkZHIsIG9sZHBhY2tldC0+Y2hhZGRyLCBzaXplb2Yob2xkcGFja2V0LT5jaGFkZHIpKTsKKwlwYWNrZXQtPmZsYWdzID0gb2xkcGFja2V0LT5mbGFnczsKKwlwYWNrZXQtPmdhdGV3YXlfbmlwID0gb2xkcGFja2V0LT5nYXRld2F5X25pcDsKKwlwYWNrZXQtPmNpYWRkciA9IG9sZHBhY2tldC0+Y2lhZGRyOworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHBhY2tldCwgREhDUF9TRVJWRVJfSUQsIHNlcnZlcl9jb25maWcuc2VydmVyX25pcCk7Cit9CisKKy8qIEZpbGwgb3B0aW9ucyBmaWVsZCwgc2lhZGRyX25pcCwgYW5kIHNuYW1lIGFuZCBib290X2ZpbGUgZmllbGRzLgorICogVE9ETzogdGVhY2ggdGhpcyBjb2RlIHRvIHVzZSBvdmVybG9hZCBvcHRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9zZXJ2ZXJfb3B0aW9ucyhzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCkKK3sKKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqY3VyciA9IHNlcnZlcl9jb25maWcub3B0aW9uczsKKworCXdoaWxlIChjdXJyKSB7CisJCWlmIChjdXJyLT5kYXRhW09QVF9DT0RFXSAhPSBESENQX0xFQVNFX1RJTUUpCisJCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGN1cnItPmRhdGEpOworCQljdXJyID0gY3Vyci0+bmV4dDsKKwl9CisKKwlwYWNrZXQtPnNpYWRkcl9uaXAgPSBzZXJ2ZXJfY29uZmlnLnNpYWRkcl9uaXA7CisKKwlpZiAoc2VydmVyX2NvbmZpZy5zbmFtZSkKKwkJc3RybmNweSgoY2hhciopcGFja2V0LT5zbmFtZSwgc2VydmVyX2NvbmZpZy5zbmFtZSwgc2l6ZW9mKHBhY2tldC0+c25hbWUpIC0gMSk7CisJaWYgKHNlcnZlcl9jb25maWcuYm9vdF9maWxlKQorCQlzdHJuY3B5KChjaGFyKilwYWNrZXQtPmZpbGUsIHNlcnZlcl9jb25maWcuYm9vdF9maWxlLCBzaXplb2YocGFja2V0LT5maWxlKSAtIDEpOworfQorCitzdGF0aWMgdWludDMyX3Qgc2VsZWN0X2xlYXNlX3RpbWUoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpCit7CisJdWludDMyX3QgbGVhc2VfdGltZV9zZWMgPSBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWM7CisJdWludDhfdCAqbGVhc2VfdGltZV9vcHQgPSB1ZGhjcF9nZXRfb3B0aW9uKHBhY2tldCwgREhDUF9MRUFTRV9USU1FKTsKKwlpZiAobGVhc2VfdGltZV9vcHQpIHsKKwkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKGxlYXNlX3RpbWVfc2VjLCBsZWFzZV90aW1lX29wdCk7CisJCWxlYXNlX3RpbWVfc2VjID0gbnRvaGwobGVhc2VfdGltZV9zZWMpOworCQlpZiAobGVhc2VfdGltZV9zZWMgPiBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWMpCisJCQlsZWFzZV90aW1lX3NlYyA9IHNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYzsKKwkJaWYgKGxlYXNlX3RpbWVfc2VjIDwgc2VydmVyX2NvbmZpZy5taW5fbGVhc2Vfc2VjKQorCQkJbGVhc2VfdGltZV9zZWMgPSBzZXJ2ZXJfY29uZmlnLm1pbl9sZWFzZV9zZWM7CisJfQorCXJldHVybiBsZWFzZV90aW1lX3NlYzsKK30KKworLyogV2UgZ290IGEgREhDUCBESVNDT1ZFUi4gU2VuZCBhbiBPRkZFUi4gKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIHNlbmRfb2ZmZXIoc3RydWN0IGRoY3BfcGFja2V0ICpvbGRwYWNrZXQsCisJCXVpbnQzMl90IHN0YXRpY19sZWFzZV9uaXAsCisJCXN0cnVjdCBkeW5fbGVhc2UgKmxlYXNlLAorCQl1aW50OF90ICpyZXF1ZXN0ZWRfaXBfb3B0KQoreworCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisJdWludDMyX3QgbGVhc2VfdGltZV9zZWM7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKworCWluaXRfcGFja2V0KCZwYWNrZXQsIG9sZHBhY2tldCwgREhDUE9GRkVSKTsKKworCS8qIElmIGl0IGlzIGEgc3RhdGljIGxlYXNlLCB1c2UgaXRzIElQICovCisJcGFja2V0LnlpYWRkciA9IHN0YXRpY19sZWFzZV9uaXA7CisJLyogRWxzZTogKi8KKwlpZiAoIXN0YXRpY19sZWFzZV9uaXApIHsKKwkJLyogV2UgaGF2ZSBubyBzdGF0aWMgbGVhc2UgZm9yIGNsaWVudCdzIGNoYWRkciAqLworCQl1aW50MzJfdCByZXFfbmlwOworCQljb25zdCBjaGFyICpwX2hvc3RfbmFtZTsKKworCQlpZiAobGVhc2UpIHsKKwkJCS8qIFdlIGhhdmUgYSBkeW5hbWljIGxlYXNlIGZvciBjbGllbnQncyBjaGFkZHIuCisJCQkgKiBSZXVzZSBpdHMgSVAgKGV2ZW4gaWYgbGVhc2UgaXMgZXhwaXJlZCkuCisJCQkgKiBOb3RlIHRoYXQgd2UgaWdub3JlIHJlcXVlc3RlZCBJUCBpbiB0aGlzIGNhc2UuCisJCQkgKi8KKwkJCXBhY2tldC55aWFkZHIgPSBsZWFzZS0+bGVhc2VfbmlwOworCQl9CisJCS8qIE9yOiBpZiBjbGllbnQgaGFzIHJlcXVlc3RlZCBhbiBJUCAqLworCQllbHNlIGlmIChyZXF1ZXN0ZWRfaXBfb3B0ICE9IE5VTEwKKwkJIC8qIChyZWFkIElQKSAqLworCQkgJiYgKG1vdmVfZnJvbV91bmFsaWduZWQzMihyZXFfbmlwLCByZXF1ZXN0ZWRfaXBfb3B0KSwgMSkKKwkJIC8qIGFuZCB0aGUgSVAgaXMgaW4gdGhlIGxlYXNlIHJhbmdlICovCisJCSAmJiBudG9obChyZXFfbmlwKSA+PSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwCisJCSAmJiBudG9obChyZXFfbmlwKSA8PSBzZXJ2ZXJfY29uZmlnLmVuZF9pcAorCQkgLyogYW5kICovCisJCSAmJiAoICAhKGxlYXNlID0gZmluZF9sZWFzZV9ieV9uaXAocmVxX25pcCkpIC8qIGlzIG5vdCBhbHJlYWR5IHRha2VuICovCisJCSAgICB8fCBpc19leHBpcmVkX2xlYXNlKGxlYXNlKSAvKiBvciBpcyB0YWtlbiwgYnV0IGV4cGlyZWQgKi8KKwkJICAgICkKKwkJKSB7CisJCQlwYWNrZXQueWlhZGRyID0gcmVxX25pcDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIE90aGVyd2lzZSwgZmluZCBhIGZyZWUgSVAgKi8KKwkJCXBhY2tldC55aWFkZHIgPSBmaW5kX2ZyZWVfb3JfZXhwaXJlZF9uaXAob2xkcGFja2V0LT5jaGFkZHIpOworCQl9CisKKwkJaWYgKCFwYWNrZXQueWlhZGRyKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIGZyZWUgSVAgYWRkcmVzc2VzLiBPRkZFUiBhYmFuZG9uZWQiKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBSZXNlcnZlIHRoZSBJUCBmb3IgYSBzaG9ydCB0aW1lIGhvcGluZyB0byBnZXQgREhDUFJFUVVFU1Qgc29vbiAqLworCQlwX2hvc3RfbmFtZSA9IChjb25zdCBjaGFyKikgdWRoY3BfZ2V0X29wdGlvbihvbGRwYWNrZXQsIERIQ1BfSE9TVF9OQU1FKTsKKwkJbGVhc2UgPSBhZGRfbGVhc2UocGFja2V0LmNoYWRkciwgcGFja2V0LnlpYWRkciwKKwkJCQlzZXJ2ZXJfY29uZmlnLm9mZmVyX3RpbWUsCisJCQkJcF9ob3N0X25hbWUsCisJCQkJcF9ob3N0X25hbWUgPyAodW5zaWduZWQgY2hhcilwX2hvc3RfbmFtZVtPUFRfTEVOIC0gT1BUX0RBVEFdIDogMAorCQkpOworCQlpZiAoIWxlYXNlKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIGZyZWUgSVAgYWRkcmVzc2VzLiBPRkZFUiBhYmFuZG9uZWQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWxlYXNlX3RpbWVfc2VjID0gc2VsZWN0X2xlYXNlX3RpbWUob2xkcGFja2V0KTsKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX0xFQVNFX1RJTUUsIGh0b25sKGxlYXNlX3RpbWVfc2VjKSk7CisJYWRkX3NlcnZlcl9vcHRpb25zKCZwYWNrZXQpOworCisJYWRkci5zX2FkZHIgPSBwYWNrZXQueWlhZGRyOworCWJiX2luZm9fbXNnKCJTZW5kaW5nIE9GRkVSIG9mICVzIiwgaW5ldF9udG9hKGFkZHIpKTsKKwkvKiBzZW5kX3BhY2tldCBlbWl0cyBlcnJvciBtZXNzYWdlIGl0c2VsZiBpZiBpdCBkZXRlY3RzIGZhaWx1cmUgKi8KKwlzZW5kX3BhY2tldCgmcGFja2V0LCAvKmZvcmNlX2JjYXN0OiovIDApOworfQorCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzZW5kX05BSyhzdHJ1Y3QgZGhjcF9wYWNrZXQgKm9sZHBhY2tldCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgb2xkcGFja2V0LCBESENQTkFLKTsKKworCWxvZzEoIlNlbmRpbmcgTkFLIik7CisJc2VuZF9wYWNrZXQoJnBhY2tldCwgLypmb3JjZV9iY2FzdDoqLyAxKTsKK30KKworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2VuZF9BQ0soc3RydWN0IGRoY3BfcGFja2V0ICpvbGRwYWNrZXQsIHVpbnQzMl90IHlpYWRkcikKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCXVpbnQzMl90IGxlYXNlX3RpbWVfc2VjOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJY29uc3QgY2hhciAqcF9ob3N0X25hbWU7CisKKwlpbml0X3BhY2tldCgmcGFja2V0LCBvbGRwYWNrZXQsIERIQ1BBQ0spOworCXBhY2tldC55aWFkZHIgPSB5aWFkZHI7CisKKwlsZWFzZV90aW1lX3NlYyA9IHNlbGVjdF9sZWFzZV90aW1lKG9sZHBhY2tldCk7CisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9MRUFTRV9USU1FLCBodG9ubChsZWFzZV90aW1lX3NlYykpOworCisJYWRkX3NlcnZlcl9vcHRpb25zKCZwYWNrZXQpOworCisJYWRkci5zX2FkZHIgPSB5aWFkZHI7CisJYmJfaW5mb19tc2coIlNlbmRpbmcgQUNLIHRvICVzIiwgaW5ldF9udG9hKGFkZHIpKTsKKwlzZW5kX3BhY2tldCgmcGFja2V0LCAvKmZvcmNlX2JjYXN0OiovIDApOworCisJcF9ob3N0X25hbWUgPSAoY29uc3QgY2hhciopIHVkaGNwX2dldF9vcHRpb24ob2xkcGFja2V0LCBESENQX0hPU1RfTkFNRSk7CisJYWRkX2xlYXNlKHBhY2tldC5jaGFkZHIsIHBhY2tldC55aWFkZHIsCisJCWxlYXNlX3RpbWVfc2VjLAorCQlwX2hvc3RfbmFtZSwKKwkJcF9ob3N0X25hbWUgPyAodW5zaWduZWQgY2hhcilwX2hvc3RfbmFtZVtPUFRfTEVOIC0gT1BUX0RBVEFdIDogMAorCSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkpIHsKKwkJLyogcmV3cml0ZSB0aGUgZmlsZSB3aXRoIGxlYXNlcyBhdCBldmVyeSBuZXcgYWNjZXB0YW5jZSAqLworCQl3cml0ZV9sZWFzZXMoKTsKKwl9Cit9CisKKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIHNlbmRfaW5mb3JtKHN0cnVjdCBkaGNwX3BhY2tldCAqb2xkcGFja2V0KQoreworCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisKKwkvKiAiSWYgYSBjbGllbnQgaGFzIG9idGFpbmVkIGEgbmV0d29yayBhZGRyZXNzIHRocm91Z2ggc29tZSBvdGhlciBtZWFucworCSAqIChlLmcuLCBtYW51YWwgY29uZmlndXJhdGlvbiksIGl0IG1heSB1c2UgYSBESENQSU5GT1JNIHJlcXVlc3QgbWVzc2FnZQorCSAqIHRvIG9idGFpbiBvdGhlciBsb2NhbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICBTZXJ2ZXJzIHJlY2VpdmluZyBhCisJICogREhDUElORk9STSBtZXNzYWdlIGNvbnN0cnVjdCBhIERIQ1BBQ0sgbWVzc2FnZSB3aXRoIGFueSBsb2NhbAorCSAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcHByb3ByaWF0ZSBmb3IgdGhlIGNsaWVudCB3aXRob3V0OgorCSAqIGFsbG9jYXRpbmcgYSBuZXcgYWRkcmVzcywgY2hlY2tpbmcgZm9yIGFuIGV4aXN0aW5nIGJpbmRpbmcsIGZpbGxpbmcKKwkgKiBpbiAneWlhZGRyJyBvciBpbmNsdWRpbmcgbGVhc2UgdGltZSBwYXJhbWV0ZXJzLiAgVGhlIHNlcnZlcnMgU0hPVUxECisJICogdW5pY2FzdCB0aGUgREhDUEFDSyByZXBseSB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgJ2NpYWRkcicgZmllbGQKKwkgKiBvZiB0aGUgREhDUElORk9STSBtZXNzYWdlLgorCSAqIC4uLgorCSAqIFRoZSBzZXJ2ZXIgcmVzcG9uZHMgdG8gYSBESENQSU5GT1JNIG1lc3NhZ2UgYnkgc2VuZGluZyBhIERIQ1BBQ0sKKwkgKiBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBhZGRyZXNzIGdpdmVuIGluIHRoZSAnY2lhZGRyJyBmaWVsZAorCSAqIG9mIHRoZSBESENQSU5GT1JNIG1lc3NhZ2UuICBUaGUgc2VydmVyIE1VU1QgTk9UIHNlbmQgYSBsZWFzZQorCSAqIGV4cGlyYXRpb24gdGltZSB0byB0aGUgY2xpZW50IGFuZCBTSE9VTEQgTk9UIGZpbGwgaW4gJ3lpYWRkcicuIgorCSAqLworLy9UT0RPOiBkbyBhIGZldyBzYW5pdHkgY2hlY2tzOiBpcyBjaWFkZHIgc2V0PworLy9CZXR0ZXIgeWV0OiBpcyBjaWFkZHIgPT0gSVAgc291cmNlIGFkZHI/CisJaW5pdF9wYWNrZXQoJnBhY2tldCwgb2xkcGFja2V0LCBESENQQUNLKTsKKwlhZGRfc2VydmVyX29wdGlvbnMoJnBhY2tldCk7CisKKwlzZW5kX3BhY2tldCgmcGFja2V0LCAvKmZvcmNlX2JjYXN0OiovIDApOworfQorCisKKy8qIGdsb2JhbHMgKi8KK3N0cnVjdCBkeW5fbGVhc2UgKmdfbGVhc2VzOworLyogc3RydWN0IHNlcnZlcl9jb25maWdfdCBzZXJ2ZXJfY29uZmlnIGlzIGluIGJiX2NvbW1vbl9idWZzaXoxICovCisKKworaW50IHVkaGNwZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdWRoY3BkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2VydmVyX3NvY2tldCA9IC0xLCByZXR2YWwsIG1heF9zb2NrOworCXVpbnQ4X3QgKnN0YXRlOworCXVuc2lnbmVkIHRpbWVvdXRfZW5kOworCXVuc2lnbmVkIG51bV9pcHM7CisJdW5zaWduZWQgb3B0OworCXN0cnVjdCBvcHRpb25fc2V0ICpvcHRpb247CisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKGNoYXIgKnN0cl9QOykKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKwlTRVJWRVJfUE9SVCA9IDY3OworCUNMSUVOVF9QT1JUID0gNjg7CisjZW5kaWYKKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidnYiOworI2VuZGlmCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImZTdiIKKwkJSUZfRkVBVFVSRV9VREhDUF9QT1JUKCJQOiIsICZzdHJfUCkKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQorCQksICZkaGNwX3ZlcmJvc2UKKyNlbmRpZgorCQkpOworCWlmICghKG9wdCAmIDEpKSB7IC8qIG5vIC1mICovCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwl9CisJLyogdXBkYXRlIGFyZ3YgYWZ0ZXIgdGhlIHBvc3NpYmxlIHZmb3JrK2V4ZWMgaW4gZGFlbW9uaXplICovCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIDIpIHsgLyogLVMgKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKwlpZiAob3B0ICYgOCkgeyAvKiAtUCAqLworCQlTRVJWRVJfUE9SVCA9IHhhdG91MTYoc3RyX1ApOworCQlDTElFTlRfUE9SVCA9IFNFUlZFUl9QT1JUICsgMTsKKwl9CisjZW5kaWYKKwkvKiBXb3VsZCByYXRoZXIgbm90IGRvIHJlYWRfY29uZmlnIGJlZm9yZSBkYWVtb25pemF0aW9uIC0KKwkgKiBvdGhlcndpc2UgTk9NTVUgbWFjaGluZXMgd2lsbCBwYXJzZSBjb25maWcgdHdpY2UgKi8KKwlyZWFkX2NvbmZpZyhhcmd2WzBdID8gYXJndlswXSA6IERIQ1BEX0NPTkZfRklMRSk7CisKKwkvKiBNYWtlIHN1cmUgZmQgMCwxLDIgYXJlIG9wZW4gKi8KKwliYl9zYW5pdGl6ZV9zdGRpbygpOworCS8qIEVxdWl2YWxlbnQgb2YgZG9pbmcgYSBmZmx1c2ggYWZ0ZXIgZXZlcnkgXG4gKi8KKwlzZXRsaW5lYnVmKHN0ZG91dCk7CisKKwkvKiBDcmVhdGUgcGlkZmlsZSAqLworCXdyaXRlX3BpZGZpbGUoc2VydmVyX2NvbmZpZy5waWRmaWxlKTsKKwkvKiBpZiAoIS4uKSBiYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgcGlkZmlsZSAlcyIsIHBpZGZpbGUpOyAqLworCisJYmJfaW5mb19tc2coIiVzICh2IkJCX1ZFUiIpIHN0YXJ0ZWQiLCBhcHBsZXRfbmFtZSk7CisKKwlvcHRpb24gPSB1ZGhjcF9maW5kX29wdGlvbihzZXJ2ZXJfY29uZmlnLm9wdGlvbnMsIERIQ1BfTEVBU0VfVElNRSk7CisJc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjID0gREVGQVVMVF9MRUFTRV9USU1FOworCWlmIChvcHRpb24pIHsKKwkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYywgb3B0aW9uLT5kYXRhICsgT1BUX0RBVEEpOworCQlzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWMgPSBudG9obChzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWMpOworCX0KKworCS8qIFNhbml0eSBjaGVjayAqLworCW51bV9pcHMgPSBzZXJ2ZXJfY29uZmlnLmVuZF9pcCAtIHNlcnZlcl9jb25maWcuc3RhcnRfaXAgKyAxOworCWlmIChzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXMgPiBudW1faXBzKSB7CisJCWJiX2Vycm9yX21zZygibWF4X2xlYXNlcz0ldSBpcyB0b28gYmlnLCBzZXR0aW5nIHRvICV1IiwKKwkJCSh1bnNpZ25lZClzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXMsIG51bV9pcHMpOworCQlzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXMgPSBudW1faXBzOworCX0KKworCWdfbGVhc2VzID0geHphbGxvYyhzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXMgKiBzaXplb2YoZ19sZWFzZXNbMF0pKTsKKwlyZWFkX2xlYXNlcyhzZXJ2ZXJfY29uZmlnLmxlYXNlX2ZpbGUpOworCisJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKHNlcnZlcl9jb25maWcuaW50ZXJmYWNlLAorCQkJJnNlcnZlcl9jb25maWcuaWZpbmRleCwKKwkJCSZzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXAsCisJCQlzZXJ2ZXJfY29uZmlnLnNlcnZlcl9tYWMpCisJKSB7CisJCXJldHZhbCA9IDE7CisJCWdvdG8gcmV0OworCX0KKworCS8qIFNldHVwIHRoZSBzaWduYWwgcGlwZSAqLworCXVkaGNwX3NwX3NldHVwKCk7CisKKwl0aW1lb3V0X2VuZCA9IG1vbm90b25pY19zZWMoKSArIHNlcnZlcl9jb25maWcuYXV0b190aW1lOworCXdoaWxlICgxKSB7IC8qIGxvb3AgdW50aWwgdW5pdmVyc2UgY29sbGFwc2VzICovCisJCWZkX3NldCByZmRzOworCQlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCQlpbnQgYnl0ZXM7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQl1aW50OF90ICpzZXJ2ZXJfaWRfb3B0OworCQl1aW50OF90ICpyZXF1ZXN0ZWRfaXBfb3B0OworCQl1aW50MzJfdCByZXF1ZXN0ZWRfbmlwID0gcmVxdWVzdGVkX25pcDsgLyogZm9yIGNvbXBpbGVyICovCisJCXVpbnQzMl90IHN0YXRpY19sZWFzZV9uaXA7CisJCXN0cnVjdCBkeW5fbGVhc2UgKmxlYXNlLCBmYWtlX2xlYXNlOworCisJCWlmIChzZXJ2ZXJfc29ja2V0IDwgMCkgeworCQkJc2VydmVyX3NvY2tldCA9IHVkaGNwX2xpc3Rlbl9zb2NrZXQoLypJTkFERFJfQU5ZLCovIFNFUlZFUl9QT1JULAorCQkJCQlzZXJ2ZXJfY29uZmlnLmludGVyZmFjZSk7CisJCX0KKworCQltYXhfc29jayA9IHVkaGNwX3NwX2ZkX3NldCgmcmZkcywgc2VydmVyX3NvY2tldCk7CisJCWlmIChzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZSkgeworCQkJdHYudHZfc2VjID0gdGltZW91dF9lbmQgLSBtb25vdG9uaWNfc2VjKCk7CisJCQl0di50dl91c2VjID0gMDsKKwkJfQorCQlyZXR2YWwgPSAwOworCQlpZiAoIXNlcnZlcl9jb25maWcuYXV0b190aW1lIHx8IHR2LnR2X3NlYyA+IDApIHsKKwkJCXJldHZhbCA9IHNlbGVjdChtYXhfc29jayArIDEsICZyZmRzLCBOVUxMLCBOVUxMLAorCQkJCQlzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZSA/ICZ0diA6IE5VTEwpOworCQl9CisJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJd3JpdGVfbGVhc2VzKCk7CisJCQl0aW1lb3V0X2VuZCA9IG1vbm90b25pY19zZWMoKSArIHNlcnZlcl9jb25maWcuYXV0b190aW1lOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJldHZhbCA8IDAgJiYgZXJybm8gIT0gRUlOVFIpIHsKKwkJCWxvZzEoIkVycm9yIG9uIHNlbGVjdCIpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKHVkaGNwX3NwX3JlYWQoJnJmZHMpKSB7CisJCWNhc2UgU0lHVVNSMToKKwkJCWJiX2luZm9fbXNnKCJSZWNlaXZlZCBTSUdVU1IxIik7CisJCQl3cml0ZV9sZWFzZXMoKTsKKwkJCS8qIHdoeSBub3QganVzdCByZXNldCB0aGUgdGltZW91dCwgZWggKi8KKwkJCXRpbWVvdXRfZW5kID0gbW9ub3RvbmljX3NlYygpICsgc2VydmVyX2NvbmZpZy5hdXRvX3RpbWU7CisJCQljb250aW51ZTsKKwkJY2FzZSBTSUdURVJNOgorCQkJYmJfaW5mb19tc2coIlJlY2VpdmVkIFNJR1RFUk0iKTsKKwkJCWdvdG8gcmV0MDsKKwkJY2FzZSAwOiAvKiBubyBzaWduYWw6IHJlYWQgYSBwYWNrZXQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBzaWduYWwgb3IgZXJyb3IgKHByb2JhYmx5IEVJTlRSKTogYmFjayB0byBzZWxlY3QgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYnl0ZXMgPSB1ZGhjcF9yZWN2X2tlcm5lbF9wYWNrZXQoJnBhY2tldCwgc2VydmVyX3NvY2tldCk7CisJCWlmIChieXRlcyA8IDApIHsKKwkJCS8qIGJ5dGVzIGNhbiBhbHNvIGJlIC0yICgiYmFkIHBhY2tldCBkYXRhIikgKi8KKwkJCWlmIChieXRlcyA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikgeworCQkJCWxvZzEoIlJlYWQgZXJyb3I6ICVzLCByZW9wZW5pbmcgc29ja2V0Iiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbG9zZShzZXJ2ZXJfc29ja2V0KTsKKwkJCQlzZXJ2ZXJfc29ja2V0ID0gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocGFja2V0LmhsZW4gIT0gNikgeworCQkJYmJfZXJyb3JfbXNnKCJNQUMgbGVuZ3RoICE9IDYsIGlnbm9yaW5nIHBhY2tldCIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBhY2tldC5vcCAhPSBCT09UUkVRVUVTVCkgeworCQkJYmJfZXJyb3JfbXNnKCJub3QgYSBSRVFVRVNULCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN0YXRlID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX01FU1NBR0VfVFlQRSk7CisJCWlmIChzdGF0ZSA9PSBOVUxMIHx8IHN0YXRlWzBdIDwgREhDUF9NSU5UWVBFIHx8IHN0YXRlWzBdID4gREhDUF9NQVhUWVBFKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIG9yIGJhZCBtZXNzYWdlIHR5cGUgb3B0aW9uLCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogR2V0IFNFUlZFUl9JRCBpZiBwcmVzZW50ICovCisJCXNlcnZlcl9pZF9vcHQgPSB1ZGhjcF9nZXRfb3B0aW9uKCZwYWNrZXQsIERIQ1BfU0VSVkVSX0lEKTsKKwkJaWYgKHNlcnZlcl9pZF9vcHQpIHsKKwkJCXVpbnQzMl90IHNlcnZlcl9pZF9uZXR3b3JrX29yZGVyOworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHNlcnZlcl9pZF9uZXR3b3JrX29yZGVyLCBzZXJ2ZXJfaWRfb3B0KTsKKwkJCWlmIChzZXJ2ZXJfaWRfbmV0d29ya19vcmRlciAhPSBzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXApIHsKKwkJCQkvKiBjbGllbnQgdGFsa3MgdG8gc29tZWJvZHkgZWxzZSAqLworCQkJCWxvZzEoInNlcnZlciBJRCBkb2Vzbid0IG1hdGNoLCBpZ25vcmluZyIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogTG9vayBmb3IgYSBzdGF0aWMvZHluYW1pYyBsZWFzZSAqLworCQlzdGF0aWNfbGVhc2VfbmlwID0gZ2V0X3N0YXRpY19uaXBfYnlfbWFjKHNlcnZlcl9jb25maWcuc3RhdGljX2xlYXNlcywgJnBhY2tldC5jaGFkZHIpOworCQlpZiAoc3RhdGljX2xlYXNlX25pcCkgeworCQkJYmJfaW5mb19tc2coIkZvdW5kIHN0YXRpYyBsZWFzZTogJXgiLCBzdGF0aWNfbGVhc2VfbmlwKTsKKwkJCW1lbWNweSgmZmFrZV9sZWFzZS5sZWFzZV9tYWMsICZwYWNrZXQuY2hhZGRyLCA2KTsKKwkJCWZha2VfbGVhc2UubGVhc2VfbmlwID0gc3RhdGljX2xlYXNlX25pcDsKKwkJCWZha2VfbGVhc2UuZXhwaXJlcyA9IDA7CisJCQlsZWFzZSA9ICZmYWtlX2xlYXNlOworCQl9IGVsc2UgeworCQkJbGVhc2UgPSBmaW5kX2xlYXNlX2J5X21hYyhwYWNrZXQuY2hhZGRyKTsKKwkJfQorCisJCS8qIEdldCBSRVFVRVNURURfSVAgaWYgcHJlc2VudCAqLworCQlyZXF1ZXN0ZWRfaXBfb3B0ID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX1JFUVVFU1RFRF9JUCk7CisJCWlmIChyZXF1ZXN0ZWRfaXBfb3B0KSB7CisJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIocmVxdWVzdGVkX25pcCwgcmVxdWVzdGVkX2lwX29wdCk7CisJCX0KKworCQlzd2l0Y2ggKHN0YXRlWzBdKSB7CisKKwkJY2FzZSBESENQRElTQ09WRVI6CisJCQlsb2cxKCJSZWNlaXZlZCBESVNDT1ZFUiIpOworCisJCQlzZW5kX29mZmVyKCZwYWNrZXQsIHN0YXRpY19sZWFzZV9uaXAsIGxlYXNlLCByZXF1ZXN0ZWRfaXBfb3B0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgREhDUFJFUVVFU1Q6CisJCQlsb2cxKCJSZWNlaXZlZCBSRVFVRVNUIik7CisvKiBSRkMgMjEzMToKKworbyBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIFNFTEVDVElORyBzdGF0ZToKKworICAgQ2xpZW50IGluc2VydHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIHNlcnZlciBpbiAnc2VydmVyCisgICBpZGVudGlmaWVyJywgJ2NpYWRkcicgTVVTVCBiZSB6ZXJvLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnIE1VU1QgYmUKKyAgIGZpbGxlZCBpbiB3aXRoIHRoZSB5aWFkZHIgdmFsdWUgZnJvbSB0aGUgY2hvc2VuIERIQ1BPRkZFUi4KKworICAgTm90ZSB0aGF0IHRoZSBjbGllbnQgbWF5IGNob29zZSB0byBjb2xsZWN0IHNldmVyYWwgREhDUE9GRkVSCisgICBtZXNzYWdlcyBhbmQgc2VsZWN0IHRoZSAiYmVzdCIgb2ZmZXIuICBUaGUgY2xpZW50IGluZGljYXRlcyBpdHMKKyAgIHNlbGVjdGlvbiBieSBpZGVudGlmeWluZyB0aGUgb2ZmZXJpbmcgc2VydmVyIGluIHRoZSBESENQUkVRVUVTVAorICAgbWVzc2FnZS4gIElmIHRoZSBjbGllbnQgcmVjZWl2ZXMgbm8gYWNjZXB0YWJsZSBvZmZlcnMsIHRoZSBjbGllbnQKKyAgIG1heSBjaG9vc2UgdG8gdHJ5IGFub3RoZXIgREhDUERJU0NPVkVSIG1lc3NhZ2UuICBUaGVyZWZvcmUsIHRoZQorICAgc2VydmVycyBtYXkgbm90IHJlY2VpdmUgYSBzcGVjaWZpYyBESENQUkVRVUVTVCBmcm9tIHdoaWNoIHRoZXkgY2FuCisgICBkZWNpZGUgd2hldGhlciBvciBub3QgdGhlIGNsaWVudCBoYXMgYWNjZXB0ZWQgdGhlIG9mZmVyLgorCitvIERIQ1BSRVFVRVNUIGdlbmVyYXRlZCBkdXJpbmcgSU5JVC1SRUJPT1Qgc3RhdGU6CisKKyAgICdzZXJ2ZXIgaWRlbnRpZmllcicgTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnCisgICBvcHRpb24gTVVTVCBiZSBmaWxsZWQgaW4gd2l0aCBjbGllbnQncyBub3Rpb24gb2YgaXRzIHByZXZpb3VzbHkKKyAgIGFzc2lnbmVkIGFkZHJlc3MuICdjaWFkZHInIE1VU1QgYmUgemVyby4gVGhlIGNsaWVudCBpcyBzZWVraW5nIHRvCisgICB2ZXJpZnkgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCwgY2FjaGVkIGNvbmZpZ3VyYXRpb24uIFNlcnZlciBTSE9VTEQKKyAgIHNlbmQgYSBESENQTkFLIG1lc3NhZ2UgdG8gdGhlIGNsaWVudCBpZiB0aGUgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJworICAgaXMgaW5jb3JyZWN0LCBvciBpcyBvbiB0aGUgd3JvbmcgbmV0d29yay4KKworICAgRGV0ZXJtaW5pbmcgd2hldGhlciBhIGNsaWVudCBpbiB0aGUgSU5JVC1SRUJPT1Qgc3RhdGUgaXMgb24gdGhlCisgICBjb3JyZWN0IG5ldHdvcmsgaXMgZG9uZSBieSBleGFtaW5pbmcgdGhlIGNvbnRlbnRzIG9mICdnaWFkZHInLCB0aGUKKyAgICdyZXF1ZXN0ZWQgSVAgYWRkcmVzcycgb3B0aW9uLCBhbmQgYSBkYXRhYmFzZSBsb29rdXAuIElmIHRoZSBESENQCisgICBzZXJ2ZXIgZGV0ZWN0cyB0aGF0IHRoZSBjbGllbnQgaXMgb24gdGhlIHdyb25nIG5ldCAoaS5lLiwgdGhlCisgICByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGxvY2FsIHN1Ym5ldCBtYXNrIG9yIHJlbW90ZSBzdWJuZXQgbWFzayAoaWYKKyAgICdnaWFkZHInIGlzIG5vdCB6ZXJvKSB0byAncmVxdWVzdGVkIElQIGFkZHJlc3MnIG9wdGlvbiB2YWx1ZQorICAgZG9lc24ndCBtYXRjaCByZWFsaXR5KSwgdGhlbiB0aGUgc2VydmVyIFNIT1VMRCBzZW5kIGEgREhDUE5BSworICAgbWVzc2FnZSB0byB0aGUgY2xpZW50LgorCisgICBJZiB0aGUgbmV0d29yayBpcyBjb3JyZWN0LCB0aGVuIHRoZSBESENQIHNlcnZlciBzaG91bGQgY2hlY2sgaWYKKyAgIHRoZSBjbGllbnQncyBub3Rpb24gb2YgaXRzIElQIGFkZHJlc3MgaXMgY29ycmVjdC4gSWYgbm90LCB0aGVuIHRoZQorICAgc2VydmVyIFNIT1VMRCBzZW5kIGEgREhDUE5BSyBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIElmIHRoZSBESENQCisgICBzZXJ2ZXIgaGFzIG5vIHJlY29yZCBvZiB0aGlzIGNsaWVudCwgdGhlbiBpdCBNVVNUIHJlbWFpbiBzaWxlbnQsCisgICBhbmQgTUFZIG91dHB1dCBhIHdhcm5pbmcgdG8gdGhlIG5ldHdvcmsgYWRtaW5pc3RyYXRvci4gVGhpcworICAgYmVoYXZpb3IgaXMgbmVjZXNzYXJ5IGZvciBwZWFjZWZ1bCBjb2V4aXN0ZW5jZSBvZiBub24tCisgICBjb21tdW5pY2F0aW5nIERIQ1Agc2VydmVycyBvbiB0aGUgc2FtZSB3aXJlLgorCisgICBJZiAnZ2lhZGRyJyBpcyAweDAgaW4gdGhlIERIQ1BSRVFVRVNUIG1lc3NhZ2UsIHRoZSBjbGllbnQgaXMgb24KKyAgIHRoZSBzYW1lIHN1Ym5ldCBhcyB0aGUgc2VydmVyLiAgVGhlIHNlcnZlciBNVVNUIGJyb2FkY2FzdCB0aGUKKyAgIERIQ1BOQUsgbWVzc2FnZSB0byB0aGUgMHhmZmZmZmZmZiBicm9hZGNhc3QgYWRkcmVzcyBiZWNhdXNlIHRoZQorICAgY2xpZW50IG1heSBub3QgaGF2ZSBhIGNvcnJlY3QgbmV0d29yayBhZGRyZXNzIG9yIHN1Ym5ldCBtYXNrLCBhbmQKKyAgIHRoZSBjbGllbnQgbWF5IG5vdCBiZSBhbnN3ZXJpbmcgQVJQIHJlcXVlc3RzLgorCisgICBJZiAnZ2lhZGRyJyBpcyBzZXQgaW4gdGhlIERIQ1BSRVFVRVNUIG1lc3NhZ2UsIHRoZSBjbGllbnQgaXMgb24gYQorICAgZGlmZmVyZW50IHN1Ym5ldC4gIFRoZSBzZXJ2ZXIgTVVTVCBzZXQgdGhlIGJyb2FkY2FzdCBiaXQgaW4gdGhlCisgICBESENQTkFLLCBzbyB0aGF0IHRoZSByZWxheSBhZ2VudCB3aWxsIGJyb2FkY2FzdCB0aGUgREhDUE5BSyB0byB0aGUKKyAgIGNsaWVudCwgYmVjYXVzZSB0aGUgY2xpZW50IG1heSBub3QgaGF2ZSBhIGNvcnJlY3QgbmV0d29yayBhZGRyZXNzCisgICBvciBzdWJuZXQgbWFzaywgYW5kIHRoZSBjbGllbnQgbWF5IG5vdCBiZSBhbnN3ZXJpbmcgQVJQIHJlcXVlc3RzLgorCitvIERIQ1BSRVFVRVNUIGdlbmVyYXRlZCBkdXJpbmcgUkVORVdJTkcgc3RhdGU6CisKKyAgICdzZXJ2ZXIgaWRlbnRpZmllcicgTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnCisgICBvcHRpb24gTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAnY2lhZGRyJyBNVVNUIGJlIGZpbGxlZCBpbiB3aXRoCisgICBjbGllbnQncyBJUCBhZGRyZXNzLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGNsaWVudCBpcyBjb21wbGV0ZWx5CisgICBjb25maWd1cmVkLCBhbmQgaXMgdHJ5aW5nIHRvIGV4dGVuZCBpdHMgbGVhc2UuIFRoaXMgbWVzc2FnZSB3aWxsCisgICBiZSB1bmljYXN0LCBzbyBubyByZWxheSBhZ2VudHMgd2lsbCBiZSBpbnZvbHZlZCBpbiBpdHMKKyAgIHRyYW5zbWlzc2lvbi4gIEJlY2F1c2UgJ2dpYWRkcicgaXMgdGhlcmVmb3JlIG5vdCBmaWxsZWQgaW4sIHRoZQorICAgREhDUCBzZXJ2ZXIgd2lsbCB0cnVzdCB0aGUgdmFsdWUgaW4gJ2NpYWRkcicsIGFuZCB1c2UgaXQgd2hlbgorICAgcmVwbHlpbmcgdG8gdGhlIGNsaWVudC4KKworICAgQSBjbGllbnQgTUFZIGNob29zZSB0byByZW5ldyBvciBleHRlbmQgaXRzIGxlYXNlIHByaW9yIHRvIFQxLiAgVGhlCisgICBzZXJ2ZXIgbWF5IGNob29zZSBub3QgdG8gZXh0ZW5kIHRoZSBsZWFzZSAoYXMgYSBwb2xpY3kgZGVjaXNpb24gYnkKKyAgIHRoZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IpLCBidXQgc2hvdWxkIHJldHVybiBhIERIQ1BBQ0sgbWVzc2FnZQorICAgcmVnYXJkbGVzcy4KKworbyBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIFJFQklORElORyBzdGF0ZToKKworICAgJ3NlcnZlciBpZGVudGlmaWVyJyBNVVNUIE5PVCBiZSBmaWxsZWQgaW4sICdyZXF1ZXN0ZWQgSVAgYWRkcmVzcycKKyAgIG9wdGlvbiBNVVNUIE5PVCBiZSBmaWxsZWQgaW4sICdjaWFkZHInIE1VU1QgYmUgZmlsbGVkIGluIHdpdGgKKyAgIGNsaWVudCdzIElQIGFkZHJlc3MuIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgY2xpZW50IGlzIGNvbXBsZXRlbHkKKyAgIGNvbmZpZ3VyZWQsIGFuZCBpcyB0cnlpbmcgdG8gZXh0ZW5kIGl0cyBsZWFzZS4gVGhpcyBtZXNzYWdlIE1VU1QKKyAgIGJlIGJyb2FkY2FzdCB0byB0aGUgMHhmZmZmZmZmZiBJUCBicm9hZGNhc3QgYWRkcmVzcy4gIFRoZSBESENQCisgICBzZXJ2ZXIgU0hPVUxEIGNoZWNrICdjaWFkZHInIGZvciBjb3JyZWN0bmVzcyBiZWZvcmUgcmVwbHlpbmcgdG8KKyAgIHRoZSBESENQUkVRVUVTVC4KKworICAgVGhlIERIQ1BSRVFVRVNUIGZyb20gYSBSRUJJTkRJTkcgY2xpZW50IGlzIGludGVuZGVkIHRvIGFjY29tbW9kYXRlCisgICBzaXRlcyB0aGF0IGhhdmUgbXVsdGlwbGUgREhDUCBzZXJ2ZXJzIGFuZCBhIG1lY2hhbmlzbSBmb3IKKyAgIG1haW50YWluaW5nIGNvbnNpc3RlbmN5IGFtb25nIGxlYXNlcyBtYW5hZ2VkIGJ5IG11bHRpcGxlIHNlcnZlcnMuCisgICBBIERIQ1Agc2VydmVyIE1BWSBleHRlbmQgYSBjbGllbnQncyBsZWFzZSBvbmx5IGlmIGl0IGhhcyBsb2NhbAorICAgYWRtaW5pc3RyYXRpdmUgYXV0aG9yaXR5IHRvIGRvIHNvLgorKi8KKwkJCWlmICghcmVxdWVzdGVkX2lwX29wdCkgeworCQkJCXJlcXVlc3RlZF9uaXAgPSBwYWNrZXQuY2lhZGRyOworCQkJCWlmIChyZXF1ZXN0ZWRfbmlwID09IDApIHsKKwkJCQkJbG9nMSgibm8gcmVxdWVzdGVkIElQIGFuZCBubyBjaWFkZHIsIGlnbm9yaW5nIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChsZWFzZSAmJiByZXF1ZXN0ZWRfbmlwID09IGxlYXNlLT5sZWFzZV9uaXApIHsKKwkJCQkvKiBjbGllbnQgcmVxdWVzdGVkIG9yIGNvbmZpZ3VyZWQgSVAgbWF0Y2hlcyB0aGUgbGVhc2UuCisJCQkJICogQUNLIGl0LCBhbmQgYnVtcCBsZWFzZSBleHBpcmF0aW9uIHRpbWUuICovCisJCQkJc2VuZF9BQ0soJnBhY2tldCwgbGVhc2UtPmxlYXNlX25pcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBObyBsZWFzZSBmb3IgdGhpcyBNQUMsIG9yIGxlYXNlIElQICE9IHJlcXVlc3RlZCBJUCAqLworCisJCQlpZiAoc2VydmVyX2lkX29wdCAgICAvKiBjbGllbnQgaXMgaW4gU0VMRUNUSU5HIHN0YXRlICovCisJCQkgfHwgcmVxdWVzdGVkX2lwX29wdCAvKiBjbGllbnQgaXMgaW4gSU5JVC1SRUJPT1Qgc3RhdGUgKi8KKwkJCSkgeworCQkJCS8qICJObywgd2UgZG9uJ3QgaGF2ZSB0aGlzIElQIGZvciB5b3UiICovCisJCQkJc2VuZF9OQUsoJnBhY2tldCk7CisJCQl9IC8qIGVsc2U6IGNsaWVudCBpcyBpbiBSRU5FV0lORyBvciBSRUJJTkRJTkcsIGRvIG5vdCBhbnN3ZXIgKi8KKworCQkJYnJlYWs7CisKKwkJY2FzZSBESENQREVDTElORToKKwkJCS8qIFJGQyAyMTMxOgorCQkJICogIklmIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSBESENQREVDTElORSBtZXNzYWdlLAorCQkJICogdGhlIGNsaWVudCBoYXMgZGlzY292ZXJlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMKKwkJCSAqIHRoYXQgdGhlIHN1Z2dlc3RlZCBuZXR3b3JrIGFkZHJlc3MgaXMgYWxyZWFkeQorCQkJICogaW4gdXNlLiBUaGUgc2VydmVyIE1VU1QgbWFyayB0aGUgbmV0d29yayBhZGRyZXNzCisJCQkgKiBhcyBub3QgYXZhaWxhYmxlIGFuZCBTSE9VTEQgbm90aWZ5IHRoZSBsb2NhbAorCQkJICogc3lzYWRtaW4gb2YgYSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIHByb2JsZW0uIgorCQkJICoKKwkJCSAqIFNFUlZFUl9JRCBtdXN0IGJlIHByZXNlbnQsCisJCQkgKiBSRVFVRVNURURfSVAgbXVzdCBiZSBwcmVzZW50LAorCQkJICogY2hhZGRyIG11c3QgYmUgZmlsbGVkIGluLAorCQkJICogY2lhZGRyIG11c3QgYmUgMCAod2UgZG8gbm90IGNoZWNrIHRoaXMpCisJCQkgKi8KKwkJCWxvZzEoIlJlY2VpdmVkIERFQ0xJTkUiKTsKKwkJCWlmIChzZXJ2ZXJfaWRfb3B0CisJCQkgJiYgcmVxdWVzdGVkX2lwX29wdAorCQkJICYmIGxlYXNlICAvKiBjaGFkZHIgbWF0Y2hlcyB0aGlzIGxlYXNlICovCisJCQkgJiYgcmVxdWVzdGVkX25pcCA9PSBsZWFzZS0+bGVhc2VfbmlwCisJCQkpIHsKKwkJCQltZW1zZXQobGVhc2UtPmxlYXNlX21hYywgMCwgc2l6ZW9mKGxlYXNlLT5sZWFzZV9tYWMpKTsKKwkJCQlsZWFzZS0+ZXhwaXJlcyA9IHRpbWUoTlVMTCkgKyBzZXJ2ZXJfY29uZmlnLmRlY2xpbmVfdGltZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgREhDUFJFTEVBU0U6CisJCQkvKiAiVXBvbiByZWNlaXB0IG9mIGEgREhDUFJFTEVBU0UgbWVzc2FnZSwgdGhlIHNlcnZlcgorCQkJICogbWFya3MgdGhlIG5ldHdvcmsgYWRkcmVzcyBhcyBub3QgYWxsb2NhdGVkLiIKKwkJCSAqCisJCQkgKiBTRVJWRVJfSUQgbXVzdCBiZSBwcmVzZW50LAorCQkJICogUkVRVUVTVEVEX0lQIG11c3Qgbm90IGJlIHByZXNlbnQgKHdlIGRvIG5vdCBjaGVjayB0aGlzKSwKKwkJCSAqIGNoYWRkciBtdXN0IGJlIGZpbGxlZCBpbiwKKwkJCSAqIGNpYWRkciBtdXN0IGJlIGZpbGxlZCBpbgorCQkJICovCisJCQlsb2cxKCJSZWNlaXZlZCBSRUxFQVNFIik7CisJCQlpZiAoc2VydmVyX2lkX29wdAorCQkJICYmIGxlYXNlICAvKiBjaGFkZHIgbWF0Y2hlcyB0aGlzIGxlYXNlICovCisJCQkgJiYgcGFja2V0LmNpYWRkciA9PSBsZWFzZS0+bGVhc2VfbmlwCisJCQkpIHsKKwkJCQlsZWFzZS0+ZXhwaXJlcyA9IHRpbWUoTlVMTCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERIQ1BJTkZPUk06CisJCQlsb2cxKCJSZWNlaXZlZCBJTkZPUk0iKTsKKwkJCXNlbmRfaW5mb3JtKCZwYWNrZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisgcmV0MDoKKwlyZXR2YWwgPSAwOworIHJldDoKKwkvKmlmIChzZXJ2ZXJfY29uZmlnLnBpZGZpbGUpIC0gc2VydmVyX2NvbmZpZy5waWRmaWxlIGlzIG5ldmVyIE5VTEwgKi8KKwkJcmVtb3ZlX3BpZGZpbGUoc2VydmVyX2NvbmZpZy5waWRmaWxlKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5oIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODAxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3BkLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVURIQ1BfREhDUERfSAorI2RlZmluZSBVREhDUF9ESENQRF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIERlZmF1bHRzIHlvdSBtYXkgd2FudCB0byB0d2VhayAqLworLyogRGVmYXVsdCBtYXhfbGVhc2Vfc2VjICovCisjZGVmaW5lIERFRkFVTFRfTEVBU0VfVElNRSAgICAgICg2MCo2MCoyNCAqIDEwKQorI2RlZmluZSBMRUFTRVNfRklMRSAgICAgICAgICAgICBDT05GSUdfREhDUERfTEVBU0VTX0ZJTEUKKy8qIFdoZXJlIHRvIGZpbmQgdGhlIERIQ1Agc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworI2RlZmluZSBESENQRF9DT05GX0ZJTEUgICAgICAgICAiL2V0Yy91ZGhjcGQuY29uZiIKKworCitzdHJ1Y3Qgc3RhdGljX2xlYXNlIHsKKwlzdHJ1Y3Qgc3RhdGljX2xlYXNlICpuZXh0OworCXVpbnQzMl90IG5pcDsKKwl1aW50OF90IG1hY1s2XTsKK307CisKK3N0cnVjdCBzZXJ2ZXJfY29uZmlnX3QgeworCWNoYXIgKmludGVyZmFjZTsgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIHRvIHVzZSAqLworLy9UT0RPOiBpZmluZGV4LCBzZXJ2ZXJfbmlwLCBzZXJ2ZXJfbWFjCisvLyBhcmUgb2J0YWluZWQgZnJvbSBpbnRlcmZhY2UgbmFtZS4KKy8vIEluc3RlYWQgb2YgcXVlcnlpbmcgdGhlbSAqb25jZSosIGNyZWF0ZSB1cGRhdGVfc2VydmVyX25ldHdvcmtfZGF0YV9jYWNoZSgpCisvLyBhbmQgY2FsbCBpdCBiZWZvcmUgYW55IHVzYWdlIG9mIHRoZXNlIGZpZWxkcy4KKy8vIHVwZGF0ZV9zZXJ2ZXJfbmV0d29ya19kYXRhX2NhY2hlKCkgbXVzdCByZS1xdWVyeSBkYXRhCisvLyBpZiBtb3JlIHRoYW4gTiBzZWNvbmRzIGhhdmUgcGFzc2VkIGFmdGVyIGxhc3QgdXNlLgorCWludCBpZmluZGV4OworCXVpbnQzMl90IHNlcnZlcl9uaXA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUE9SVAorCXVpbnQxNl90IHBvcnQ7CisjZW5kaWYKKwl1aW50OF90IHNlcnZlcl9tYWNbNl07ICAgICAgICAgIC8qIG91ciBNQUMgYWRkcmVzcyAodXNlZCBvbmx5IGZvciBBUlAgcHJvYmluZykgKi8KKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0aW9uczsgICAgIC8qIGxpc3Qgb2YgREhDUCBvcHRpb25zIGxvYWRlZCBmcm9tIHRoZSBjb25maWcgZmlsZSAqLworCS8qIHN0YXJ0LGVuZCBhcmUgaW4gaG9zdCBvcmRlcjogd2UgbmVlZCB0byBjb21wYXJlIHN0YXJ0IDw9IGlwIDw9IGVuZCAqLworCXVpbnQzMl90IHN0YXJ0X2lwOyAgICAgICAgICAgICAgLyogc3RhcnQgYWRkcmVzcyBvZiBsZWFzZXMsIGluIGhvc3Qgb3JkZXIgKi8KKwl1aW50MzJfdCBlbmRfaXA7ICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBsZWFzZXMsIGluIGhvc3Qgb3JkZXIgKi8KKwl1aW50MzJfdCBtYXhfbGVhc2Vfc2VjOyAgICAgICAgIC8qIG1heGltdW0gbGVhc2UgdGltZSAoaG9zdCBvcmRlcikgKi8KKwl1aW50MzJfdCBtaW5fbGVhc2Vfc2VjOyAgICAgICAgIC8qIG1pbmltdW0gbGVhc2UgdGltZSBhIGNsaWVudCBjYW4gcmVxdWVzdCAqLworCXVpbnQzMl90IG1heF9sZWFzZXM7ICAgICAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgbGVhc2VzIChpbmNsdWRpbmcgcmVzZXJ2ZWQgYWRkcmVzc2VzKSAqLworCXVpbnQzMl90IGF1dG9fdGltZTsgICAgICAgICAgICAgLyogaG93IGxvbmcgc2hvdWxkIHVkaGNwZCB3YWl0IGJlZm9yZSB3cml0aW5nIGEgY29uZmlnIGZpbGUuCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiB0aGlzIGlzIHplcm8sIGl0IHdpbGwgb25seSB3cml0ZSBvbmUgb24gU0lHVVNSMSAqLworCXVpbnQzMl90IGRlY2xpbmVfdGltZTsgICAgICAgICAgLyogaG93IGxvbmcgYW4gYWRkcmVzcyBpcyByZXNlcnZlZCBpZiBhIGNsaWVudCByZXR1cm5zIGEKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlY2xpbmUgbWVzc2FnZSAqLworCXVpbnQzMl90IGNvbmZsaWN0X3RpbWU7ICAgICAgICAgLyogaG93IGxvbmcgYW4gYXJwIGNvbmZsaWN0IG9mZmVuZGVyIGlzIGxlYXNlZCBmb3IgKi8KKwl1aW50MzJfdCBvZmZlcl90aW1lOyAgICAgICAgICAgIC8qIGhvdyBsb25nIGFuIG9mZmVyZWQgYWRkcmVzcyBpcyByZXNlcnZlZCAqLworCXVpbnQzMl90IHNpYWRkcl9uaXA7ICAgICAgICAgICAgLyogIm5leHQgc2VydmVyIiBib290cCBvcHRpb24gKi8KKwljaGFyICpsZWFzZV9maWxlOworCWNoYXIgKnBpZGZpbGU7CisJY2hhciAqbm90aWZ5X2ZpbGU7ICAgICAgICAgICAgICAvKiB3aGF0IHRvIHJ1biB3aGVuZXZlciBsZWFzZXMgYXJlIHdyaXR0ZW4gKi8KKwljaGFyICpzbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qIGJvb3RwIHNlcnZlciBuYW1lICovCisJY2hhciAqYm9vdF9maWxlOyAgICAgICAgICAgICAgICAvKiBib290cCBib290IGZpbGUgb3B0aW9uICovCisJc3RydWN0IHN0YXRpY19sZWFzZSAqc3RhdGljX2xlYXNlczsgLyogTGlzdCBvZiBpcC9tYWMgcGFpcnMgdG8gYXNzaWduIHN0YXRpYyBsZWFzZXMgKi8KK30gRklYX0FMSUFTSU5HOworCisjZGVmaW5lIHNlcnZlcl9jb25maWcgKCooc3RydWN0IHNlcnZlcl9jb25maWdfdCopJmJiX2NvbW1vbl9idWZzaXoxKQorLyogY2xpZW50X2NvbmZpZyBzaXRzIGluIDJuZCBoYWxmIG9mIGJiX2NvbW1vbl9idWZzaXoxICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9QT1JUCisjZGVmaW5lIFNFUlZFUl9QT1JUIChzZXJ2ZXJfY29uZmlnLnBvcnQpCisjZWxzZQorI2RlZmluZSBTRVJWRVJfUE9SVCA2NworI2VuZGlmCisKKwordHlwZWRlZiB1aW50MzJfdCBsZWFzZXRpbWVfdDsKK3R5cGVkZWYgaW50MzJfdCBzaWduZWRfbGVhc2V0aW1lX3Q7CisKK3N0cnVjdCBkeW5fbGVhc2UgeworCS8qIFVuaXggdGltZSB3aGVuIGxlYXNlIGV4cGlyZXMuIEtlcHQgaW4gbWVtb3J5IGluIGhvc3Qgb3JkZXIuCisJICogV2hlbiB3cml0dGVuIHRvIGZpbGUsIGNvbnZlcnRlZCB0byBuZXR3b3JrIG9yZGVyCisJICogYW5kIGFkanVzdGVkIChjdXJyZW50IHRpbWUgc3VidHJhY3RlZCkgKi8KKwlsZWFzZXRpbWVfdCBleHBpcmVzOworCS8qICJuaXAiOiBJUCBpbiBuZXR3b3JrIG9yZGVyICovCisJdWludDMyX3QgbGVhc2VfbmlwOworCS8qIFdlIHVzZSBsZWFzZV9tYWNbNl0sIHNpbmNlIGUuZy4gQVJQIHByb2JpbmcgdXNlcworCSAqIG9ubHkgNiBmaXJzdCBieXRlcyBhbnl3YXkuIFdlIGNoZWNrIHJlY2VpdmVkIGRoY3AgcGFja2V0cworCSAqIHRoYXQgdGhlaXIgaGxlbiA9PSA2IGFuZCB0aHVzIGNoYWRkciBoYXMgb25seSA2IHNpZ25pZmljYW50IGJ5dGVzCisJICogKGRoY3AgcGFja2V0IGhhcyBjaGFkZHJbMTZdLCBub3QgWzZdKQorCSAqLworCXVpbnQ4X3QgbGVhc2VfbWFjWzZdOworCWNoYXIgaG9zdG5hbWVbMjBdOworCXVpbnQ4X3QgcGFkWzJdOworCS8qIHRvdGFsIHNpemUgaXMgYSBtdWx0aXBseSBvZiA0ICovCit9IFBBQ0tFRDsKKworZXh0ZXJuIHN0cnVjdCBkeW5fbGVhc2UgKmdfbGVhc2VzOworCitzdHJ1Y3QgZHluX2xlYXNlICphZGRfbGVhc2UoCisJCWNvbnN0IHVpbnQ4X3QgKmNoYWRkciwgdWludDMyX3QgeWlhZGRyLAorCQlsZWFzZXRpbWVfdCBsZWFzZXRpbWUsCisJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLCBpbnQgaG9zdG5hbWVfbGVuCisJCSkgRkFTVF9GVU5DOworaW50IGlzX2V4cGlyZWRfbGVhc2Uoc3RydWN0IGR5bl9sZWFzZSAqbGVhc2UpIEZBU1RfRlVOQzsKK3N0cnVjdCBkeW5fbGVhc2UgKmZpbmRfbGVhc2VfYnlfbWFjKGNvbnN0IHVpbnQ4X3QgKm1hYykgRkFTVF9GVU5DOworc3RydWN0IGR5bl9sZWFzZSAqZmluZF9sZWFzZV9ieV9uaXAodWludDMyX3QgbmlwKSBGQVNUX0ZVTkM7Cit1aW50MzJfdCBmaW5kX2ZyZWVfb3JfZXhwaXJlZF9uaXAoY29uc3QgdWludDhfdCAqc2FmZV9tYWMpIEZBU1RfRlVOQzsKKworCisvKiBDb25maWcgZmlsZSBwYXJzZXIgd2lsbCBwYXNzIHN0YXRpYyBsZWFzZSBpbmZvIHRvIHRoaXMgZnVuY3Rpb24KKyAqIHdoaWNoIHdpbGwgYWRkIGl0IHRvIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjYW4gYmUgc2VhcmNoZWQgbGF0ZXIgKi8KK3ZvaWQgYWRkX3N0YXRpY19sZWFzZShzdHJ1Y3Qgc3RhdGljX2xlYXNlICoqc3RfbGVhc2VfcHAsIHVpbnQ4X3QgKm1hYywgdWludDMyX3QgbmlwKSBGQVNUX0ZVTkM7CisvKiBGaW5kIHN0YXRpYyBsZWFzZSBJUCBieSBtYWMgKi8KK3VpbnQzMl90IGdldF9zdGF0aWNfbmlwX2J5X21hYyhzdHJ1Y3Qgc3RhdGljX2xlYXNlICpzdF9sZWFzZSwgdm9pZCAqYXJnKSBGQVNUX0ZVTkM7CisvKiBDaGVjayB0byBzZWUgaWYgYW4gSVAgaXMgcmVzZXJ2ZWQgYXMgYSBzdGF0aWMgSVAgKi8KK2ludCBpc19uaXBfcmVzZXJ2ZWQoc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2UsIHVpbnQzMl90IG5pcCkgRkFTVF9GVU5DOworLyogUHJpbnQgb3V0IHN0YXRpYyBsZWFzZXMganVzdCB0byBjaGVjayB3aGF0J3MgZ29pbmcgb24gKGRlYnVnIGNvZGUpICovCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDIKK3ZvaWQgbG9nX3N0YXRpY19sZWFzZXMoc3RydWN0IHN0YXRpY19sZWFzZSAqKnN0X2xlYXNlX3BwKSBGQVNUX0ZVTkM7CisjZWxzZQorIyBkZWZpbmUgbG9nX3N0YXRpY19sZWFzZXMoc3RfbGVhc2VfcHApICgodm9pZCkwKQorI2VuZGlmCisKKwordm9pZCByZWFkX2NvbmZpZyhjb25zdCBjaGFyICpmaWxlKSBGQVNUX0ZVTkM7Cit2b2lkIHdyaXRlX2xlYXNlcyh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIHJlYWRfbGVhc2VzKGNvbnN0IGNoYXIgKmZpbGUpIEZBU1RfRlVOQzsKKworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvZGhjcHJlbGF5LmMgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3ByZWxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmFjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3ByZWxheS5jCkBAIC0wLDAgKzEsMzczIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIFBvcnQgdG8gQnVzeWJveCBDb3B5cmlnaHQgKEMpIDIwMDYgSmVzc2UgRHV0dG9uIDxqZXNzZWR1dHRvbkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBESENQIFJlbGF5IGZvciAnREhDUHY0IENvbmZpZ3VyYXRpb24gb2YgSVBTZWMgVHVubmVsIE1vZGUnIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNYXJpbyBTdHJhc3NlciA8bWFzdEBnbXgubmV0PiwKKyAqICAgICAgICAgICAgICAgICAgIFp1ZXJjaGVyIEhvY2hzY2h1bGUgV2ludGVydGh1ciwKKyAqICAgICAgICAgICAgICAgICAgIE5ldGJlYXQgQUcKKyAqIFVwc3RyZWFtIGhhcyBHUEwgdjIgb3IgbGF0ZXIKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGhjcHJlbGF5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJDTElFTlRfSUZBQ0VbLENMSUVOVF9JRkFDRTJdLi4uIFNFUlZFUl9JRkFDRSBbU0VSVkVSX0lQXSIKKy8vdXNhZ2U6I2RlZmluZSBkaGNwcmVsYXlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWxheSBESENQIHJlcXVlc3RzIGJldHdlZW4gY2xpZW50cyBhbmQgc2VydmVyIgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNkZWZpbmUgU0VSVkVSX1BPUlQgICAgNjcKKworLyogbGlmZXRpbWUgb2YgYW4geGlkIGVudHJ5IGluIHNlYy4gKi8KKyNkZWZpbmUgTUFYX0xJRkVUSU1FICAgMio2MAorLyogc2VsZWN0IHRpbWVvdXQgaW4gc2VjLiAqLworI2RlZmluZSBTRUxFQ1RfVElNRU9VVCAoTUFYX0xJRkVUSU1FIC8gOCkKKworLyogVGhpcyBsaXN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGNsaWVudHMuIFRoZSB4aWRfKiBmdW5jdGlvbnMgbWFuaXB1bGF0ZSB0aGlzIGxpc3QuICovCitzdHJ1Y3QgeGlkX2l0ZW0geworCXVuc2lnbmVkIHRpbWVzdGFtcDsKKwlpbnQgY2xpZW50OworCXVpbnQzMl90IHhpZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gaXA7CisJc3RydWN0IHhpZF9pdGVtICpuZXh0OworfSBGSVhfQUxJQVNJTkc7CisKKyNkZWZpbmUgZGhjcHJlbGF5X3hpZF9saXN0ICgqKHN0cnVjdCB4aWRfaXRlbSopJmJiX2NvbW1vbl9idWZzaXoxKQorCitzdGF0aWMgc3RydWN0IHhpZF9pdGVtICp4aWRfYWRkKHVpbnQzMl90IHhpZCwgc3RydWN0IHNvY2thZGRyX2luICppcCwgaW50IGNsaWVudCkKK3sKKwlzdHJ1Y3QgeGlkX2l0ZW0gKml0ZW07CisKKwkvKiBjcmVhdGUgbmV3IHhpZCBlbnRyeSAqLworCWl0ZW0gPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgeGlkX2l0ZW0pKTsKKworCS8qIGFkZCB4aWQgZW50cnkgKi8KKwlpdGVtLT5pcCA9ICppcDsKKwlpdGVtLT54aWQgPSB4aWQ7CisJaXRlbS0+Y2xpZW50ID0gY2xpZW50OworCWl0ZW0tPnRpbWVzdGFtcCA9IG1vbm90b25pY19zZWMoKTsKKwlpdGVtLT5uZXh0ID0gZGhjcHJlbGF5X3hpZF9saXN0Lm5leHQ7CisJZGhjcHJlbGF5X3hpZF9saXN0Lm5leHQgPSBpdGVtOworCisJcmV0dXJuIGl0ZW07Cit9CisKK3N0YXRpYyB2b2lkIHhpZF9leHBpcmUodm9pZCkKK3sKKwlzdHJ1Y3QgeGlkX2l0ZW0gKml0ZW0gPSBkaGNwcmVsYXlfeGlkX2xpc3QubmV4dDsKKwlzdHJ1Y3QgeGlkX2l0ZW0gKmxhc3QgPSAmZGhjcHJlbGF5X3hpZF9saXN0OworCXVuc2lnbmVkIGN1cnJlbnRfdGltZSA9IG1vbm90b25pY19zZWMoKTsKKworCXdoaWxlIChpdGVtICE9IE5VTEwpIHsKKwkJaWYgKChjdXJyZW50X3RpbWUgLSBpdGVtLT50aW1lc3RhbXApID4gTUFYX0xJRkVUSU1FKSB7CisJCQlsYXN0LT5uZXh0ID0gaXRlbS0+bmV4dDsKKwkJCWZyZWUoaXRlbSk7CisJCQlpdGVtID0gbGFzdC0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCWxhc3QgPSBpdGVtOworCQkJaXRlbSA9IGl0ZW0tPm5leHQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGlkX2l0ZW0gKnhpZF9maW5kKHVpbnQzMl90IHhpZCkKK3sKKwlzdHJ1Y3QgeGlkX2l0ZW0gKml0ZW0gPSBkaGNwcmVsYXlfeGlkX2xpc3QubmV4dDsKKwl3aGlsZSAoaXRlbSAhPSBOVUxMKSB7CisJCWlmIChpdGVtLT54aWQgPT0geGlkKSB7CisJCQlicmVhazsKKwkJfQorCQlpdGVtID0gaXRlbS0+bmV4dDsKKwl9CisJcmV0dXJuIGl0ZW07Cit9CisKK3N0YXRpYyB2b2lkIHhpZF9kZWwodWludDMyX3QgeGlkKQoreworCXN0cnVjdCB4aWRfaXRlbSAqaXRlbSA9IGRoY3ByZWxheV94aWRfbGlzdC5uZXh0OworCXN0cnVjdCB4aWRfaXRlbSAqbGFzdCA9ICZkaGNwcmVsYXlfeGlkX2xpc3Q7CisJd2hpbGUgKGl0ZW0gIT0gTlVMTCkgeworCQlpZiAoaXRlbS0+eGlkID09IHhpZCkgeworCQkJbGFzdC0+bmV4dCA9IGl0ZW0tPm5leHQ7CisJCQlmcmVlKGl0ZW0pOworCQkJaXRlbSA9IGxhc3QtPm5leHQ7CisJCX0gZWxzZSB7CisJCQlsYXN0ID0gaXRlbTsKKwkJCWl0ZW0gPSBpdGVtLT5uZXh0OworCQl9CisJfQorfQorCisvKioKKyAqIGdldF9kaGNwX3BhY2tldF90eXBlIC0gZ2V0cyB0aGUgbWVzc2FnZSB0eXBlIG9mIGEgZGhjcCBwYWNrZXQKKyAqIHAgLSBwb2ludGVyIHRvIHRoZSBkaGNwIHBhY2tldAorICogcmV0dXJucyB0aGUgbWVzc2FnZSB0eXBlIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGdldF9kaGNwX3BhY2tldF90eXBlKHN0cnVjdCBkaGNwX3BhY2tldCAqcCkKK3sKKwl1aW50OF90ICpvcDsKKworCS8qIGl0IG11c3QgYmUgZWl0aGVyIGEgQk9PVFJFUVVFU1Qgb3IgYSBCT09UUkVQTFkgKi8KKwlpZiAocC0+b3AgIT0gQk9PVFJFUVVFU1QgJiYgcC0+b3AgIT0gQk9PVFJFUExZKQorCQlyZXR1cm4gLTE7CisJLyogZ2V0IG1lc3NhZ2UgdHlwZSBvcHRpb24gKi8KKwlvcCA9IHVkaGNwX2dldF9vcHRpb24ocCwgREhDUF9NRVNTQUdFX1RZUEUpOworCWlmIChvcCAhPSBOVUxMKQorCQlyZXR1cm4gb3BbMF07CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIG1ha2VfaWZhY2VfbGlzdCAtIHBhcnNlcyBjbGllbnQvc2VydmVyIGludGVyZmFjZSBuYW1lcworICogcmV0dXJucyBhcnJheQorICovCitzdGF0aWMgY2hhciAqKm1ha2VfaWZhY2VfbGlzdChjaGFyICoqY2xpZW50X2FuZF9zZXJ2ZXJfaWZhY2VzLCBpbnQgKmNsaWVudF9udW1iZXIpCit7CisJY2hhciAqcywgKippZmFjZV9saXN0OworCWludCBpLCBjbjsKKworCS8qIGdldCBudW1iZXIgb2YgaXRlbXMgKi8KKwljbiA9IDI7IC8qIDEgc2VydmVyIGlmYWNlICsgYXQgbGVhc3QgMSBjbGllbnQgb25lICovCisJcyA9IGNsaWVudF9hbmRfc2VydmVyX2lmYWNlc1swXTsgLyogbGlzdCBvZiBjbGllbnQgaWZhY2VzICovCisJd2hpbGUgKCpzKSB7CisJCWlmICgqcyA9PSAnLCcpCisJCQljbisrOworCQlzKys7CisJfQorCSpjbGllbnRfbnVtYmVyID0gY247CisKKwkvKiBjcmVhdGUgdmVjdG9yIG9mIHBvaW50ZXJzICovCisJaWZhY2VfbGlzdCA9IHh6YWxsb2MoY24gKiBzaXplb2YoaWZhY2VfbGlzdFswXSkpOworCisJaWZhY2VfbGlzdFswXSA9IGNsaWVudF9hbmRfc2VydmVyX2lmYWNlc1sxXTsgLyogc2VydmVyIGlmYWNlICovCisKKwlpID0gMTsKKwlzID0geHN0cmR1cChjbGllbnRfYW5kX3NlcnZlcl9pZmFjZXNbMF0pOyAvKiBsaXN0IG9mIGNsaWVudCBpZmFjZXMgKi8KKwlnb3RvIHN0b3JlX2NsaWVudF9pZmFjZV9uYW1lOworCisJd2hpbGUgKGkgPCBjbikgeworCQlpZiAoKnMrKyA9PSAnLCcpIHsKKwkJCXNbLTFdID0gJ1wwJzsKKyBzdG9yZV9jbGllbnRfaWZhY2VfbmFtZToKKwkJCWlmYWNlX2xpc3RbaSsrXSA9IHM7CisJCX0KKwl9CisKKwlyZXR1cm4gaWZhY2VfbGlzdDsKK30KKworLyogQ3JlYXRlcyBsaXN0ZW4gc29ja2V0cyAoaW4gZmRzKSBib3VuZCB0byBjbGllbnQgYW5kIHNlcnZlciBpZmFjZXMsCisgKiBhbmQgcmV0dXJucyBudW1lcmljYWxseSBtYXggZmQuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zb2NrZXRzKGNoYXIgKippZmFjZV9saXN0LCBpbnQgbnVtX2NsaWVudHMsIGludCAqZmRzKQoreworCWludCBpLCBuOworCisJbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9jbGllbnRzOyBpKyspIHsKKwkJZmRzW2ldID0gdWRoY3BfbGlzdGVuX3NvY2tldCgvKklOQUREUl9BTlksKi8gU0VSVkVSX1BPUlQsIGlmYWNlX2xpc3RbaV0pOworCQlpZiAobiA8IGZkc1tpXSkKKwkJCW4gPSBmZHNbaV07CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHNlbmR0b19pcDQoaW50IHNvY2ssIGNvbnN0IHZvaWQgKm1zZywgaW50IG1zZ19sZW4sIHN0cnVjdCBzb2NrYWRkcl9pbiAqdG8pCit7CisJaW50IGVycjsKKworCWVycm5vID0gMDsKKwllcnIgPSBzZW5kdG8oc29jaywgbXNnLCBtc2dfbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyKikgdG8sIHNpemVvZigqdG8pKTsKKwllcnIgLT0gbXNnX2xlbjsKKwlpZiAoZXJyKQorCQliYl9wZXJyb3JfbXNnKCJzZW5kdG8iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHBhc3NfdG9fc2VydmVyKCkgLSBmb3J3YXJkcyBkaGNwIHBhY2tldHMgZnJvbSBjbGllbnQgdG8gc2VydmVyCisgKiBwIC0gcGFja2V0IHRvIHNlbmQKKyAqIGNsaWVudCAtIG51bWJlciBvZiB0aGUgY2xpZW50CisgKi8KK3N0YXRpYyB2b2lkIHBhc3NfdG9fc2VydmVyKHN0cnVjdCBkaGNwX3BhY2tldCAqcCwgaW50IHBhY2tldF9sZW4sIGludCBjbGllbnQsIGludCAqZmRzLAorCQkJc3RydWN0IHNvY2thZGRyX2luICpjbGllbnRfYWRkciwgc3RydWN0IHNvY2thZGRyX2luICpzZXJ2ZXJfYWRkcikKK3sKKwlpbnQgdHlwZTsKKworCS8qIGNoZWNrIHBhY2tldF90eXBlICovCisJdHlwZSA9IGdldF9kaGNwX3BhY2tldF90eXBlKHApOworCWlmICh0eXBlICE9IERIQ1BESVNDT1ZFUiAmJiB0eXBlICE9IERIQ1BSRVFVRVNUCisJICYmIHR5cGUgIT0gREhDUERFQ0xJTkUgJiYgdHlwZSAhPSBESENQUkVMRUFTRQorCSAmJiB0eXBlICE9IERIQ1BJTkZPUk0KKwkpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGNyZWF0ZSBuZXcgeGlkIGVudHJ5ICovCisJeGlkX2FkZChwLT54aWQsIGNsaWVudF9hZGRyLCBjbGllbnQpOworCisJLyogZm9yd2FyZCByZXF1ZXN0IHRvIHNlcnZlciAqLworCS8qIG5vdGUgdGhhdCB3ZSBzZW5kIGZyb20gZmRzWzBdIHdoaWNoIGlzIGJvdW5kIHRvIFNFUlZFUl9QT1JUICg2NykuCisJICogSU9XOiB3ZSBzZW5kIF9mcm9tXyBTRVJWRVJfUE9SVCEgQWx0aG91Z2ggdGhpcyBtYXkgbG9vayBzdHJhbmdlLAorCSAqIFJGQyAxNTQyIG5vdCBvbmx5IGFsbG93cywgYnV0IHByZXNjcmliZXMgdGhpcyBmb3IgQk9PVFAgcmVsYXlzLgorCSAqLworCXNlbmR0b19pcDQoZmRzWzBdLCBwLCBwYWNrZXRfbGVuLCBzZXJ2ZXJfYWRkcik7Cit9CisKKy8qKgorICogcGFzc190b19jbGllbnQoKSAtIGZvcndhcmRzIGRoY3AgcGFja2V0cyBmcm9tIHNlcnZlciB0byBjbGllbnQKKyAqIHAgLSBwYWNrZXQgdG8gc2VuZAorICovCitzdGF0aWMgdm9pZCBwYXNzX3RvX2NsaWVudChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnAsIGludCBwYWNrZXRfbGVuLCBpbnQgKmZkcykKK3sKKwlpbnQgdHlwZTsKKwlzdHJ1Y3QgeGlkX2l0ZW0gKml0ZW07CisKKwkvKiBjaGVjayB4aWQgKi8KKwlpdGVtID0geGlkX2ZpbmQocC0+eGlkKTsKKwlpZiAoIWl0ZW0pIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGNoZWNrIHBhY2tldCB0eXBlICovCisJdHlwZSA9IGdldF9kaGNwX3BhY2tldF90eXBlKHApOworCWlmICh0eXBlICE9IERIQ1BPRkZFUiAmJiB0eXBlICE9IERIQ1BBQ0sgJiYgdHlwZSAhPSBESENQTkFLKSB7CisJCXJldHVybjsKKwl9CisKKy8vVE9ETzogYWxzbyBkbyBpdCBpZiAocC0+ZmxhZ3MgJiBodG9ucyhCUk9BRENBU1RfRkxBRykpIGlzIHNldCEKKwlpZiAoaXRlbS0+aXAuc2luX2FkZHIuc19hZGRyID09IGh0b25sKElOQUREUl9BTlkpKQorCQlpdGVtLT5pcC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQlJPQURDQVNUKTsKKworCWlmIChzZW5kdG9faXA0KGZkc1tpdGVtLT5jbGllbnRdLCBwLCBwYWNrZXRfbGVuLCAmaXRlbS0+aXApICE9IDApIHsKKwkJcmV0dXJuOyAvKiBzZW5kIGVycm9yIG9jY3VycmVkICovCisJfQorCisJLyogcmVtb3ZlIHhpZCBlbnRyeSAqLworCXhpZF9kZWwocC0+eGlkKTsKK30KKworaW50IGRoY3ByZWxheV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGhjcHJlbGF5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXJfYWRkcjsKKwljaGFyICoqaWZhY2VfbGlzdDsKKwlpbnQgKmZkczsKKwlpbnQgbnVtX3NvY2tldHMsIG1heF9zb2NrZXQ7CisJdWludDMyX3Qgb3VyX25pcDsKKworCXNlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9CUk9BRENBU1QpOworCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0VSVkVSX1BPUlQpOworCisJLyogZGhjcHJlbGF5IENMSUVOVF9JRkFDRTFbLENMSUVOVF9JRkFDRTIuLi5dIFNFUlZFUl9JRkFDRSBbU0VSVkVSX0lQXSAqLworCWlmIChhcmdjID09IDQpIHsKKwkJaWYgKCFpbmV0X2F0b24oYXJndlszXSwgJnNlcnZlcl9hZGRyLnNpbl9hZGRyKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHNlcnZlciBJUCIpOworCX0gZWxzZSBpZiAoYXJnYyAhPSAzKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZmFjZV9saXN0ID0gbWFrZV9pZmFjZV9saXN0KGFyZ3YgKyAxLCAmbnVtX3NvY2tldHMpOworCisJZmRzID0geG1hbGxvYyhudW1fc29ja2V0cyAqIHNpemVvZihmZHNbMF0pKTsKKworCS8qIENyZWF0ZSBzb2NrZXRzIGFuZCBiaW5kIG9uZSB0byBldmVyeSBpZmFjZSAqLworCW1heF9zb2NrZXQgPSBpbml0X3NvY2tldHMoaWZhY2VfbGlzdCwgbnVtX3NvY2tldHMsIGZkcyk7CisKKwkvKiBHZXQgb3VyIElQIG9uIHNlcnZlcl9pZmFjZSAqLworCWlmICh1ZGhjcF9yZWFkX2ludGVyZmFjZShhcmd2WzJdLCBOVUxMLCAmb3VyX25pcCwgTlVMTCkpCisJCXJldHVybiAxOworCisJLyogTWFpbiBsb29wICovCisJd2hpbGUgKDEpIHsKKy8vIHJlaW5pdCBzdHVmZiBmcm9tIHRpbWUgdG8gdGltZT8gZ28gYmFjayB0byBtYWtlX2lmYWNlX2xpc3QKKy8vIGV2ZXJ5IE4gbWludXRlcz8KKwkJZmRfc2V0IHJmZHM7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlpbnQgaTsKKworCQlGRF9aRVJPKCZyZmRzKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9zb2NrZXRzOyBpKyspCisJCQlGRF9TRVQoZmRzW2ldLCAmcmZkcyk7CisJCXR2LnR2X3NlYyA9IFNFTEVDVF9USU1FT1VUOworCQl0di50dl91c2VjID0gMDsKKwkJaWYgKHNlbGVjdChtYXhfc29ja2V0ICsgMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dikgPiAwKSB7CisJCQlpbnQgcGFja2xlbjsKKwkJCXN0cnVjdCBkaGNwX3BhY2tldCBkaGNwX21zZzsKKworCQkJLyogc2VydmVyICovCisJCQlpZiAoRkRfSVNTRVQoZmRzWzBdLCAmcmZkcykpIHsKKwkJCQlwYWNrbGVuID0gdWRoY3BfcmVjdl9rZXJuZWxfcGFja2V0KCZkaGNwX21zZywgZmRzWzBdKTsKKwkJCQlpZiAocGFja2xlbiA+IDApIHsKKwkJCQkJcGFzc190b19jbGllbnQoJmRoY3BfbXNnLCBwYWNrbGVuLCBmZHMpOworCQkJCX0KKwkJCX0KKworCQkJLyogY2xpZW50cyAqLworCQkJZm9yIChpID0gMTsgaSA8IG51bV9zb2NrZXRzOyBpKyspIHsKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpZW50X2FkZHI7CisJCQkJc29ja2xlbl90IGFkZHJfc2l6ZTsKKworCQkJCWlmICghRkRfSVNTRVQoZmRzW2ldLCAmcmZkcykpCisJCQkJCWNvbnRpbnVlOworCisJCQkJYWRkcl9zaXplID0gc2l6ZW9mKGNsaWVudF9hZGRyKTsKKwkJCQlwYWNrbGVuID0gcmVjdmZyb20oZmRzW2ldLCAmZGhjcF9tc2csIHNpemVvZihkaGNwX21zZyksIDAsCisJCQkJCQkoc3RydWN0IHNvY2thZGRyICopKCZjbGllbnRfYWRkciksICZhZGRyX3NpemUpOworCQkJCWlmIChwYWNrbGVuIDw9IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyogR2V0IG91ciBJUCBvbiBjb3JyZXNwb25kaW5nIGNsaWVudF9pZmFjZSAqLworLy8gUkZDIDE1NDIKKy8vIDQuMSBHZW5lcmFsIEJPT1RQIFByb2Nlc3NpbmcgZm9yIFJlbGF5IEFnZW50cworLy8gNC4xLjEgQk9PVFJFUVVFU1QgTWVzc2FnZXMKKy8vICAgSWYgdGhlIHJlbGF5IGFnZW50IGRvZXMgZGVjaWRlIHRvIHJlbGF5IHRoZSByZXF1ZXN0LCBpdCBNVVNUIGV4YW1pbmUKKy8vICAgdGhlICdnaWFkZHInICgiZ2F0ZXdheSIgSVAgYWRkcmVzcykgZmllbGQuICBJZiB0aGlzIGZpZWxkIGlzIHplcm8sCisvLyAgIHRoZSByZWxheSBhZ2VudCBNVVNUIGZpbGwgdGhpcyBmaWVsZCB3aXRoIHRoZSBJUCBhZGRyZXNzIG9mIHRoZQorLy8gICBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLiAgSWYgdGhlIGludGVyZmFjZSBoYXMKKy8vICAgbW9yZSB0aGFuIG9uZSBJUCBhZGRyZXNzIGxvZ2ljYWxseSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZSByZWxheQorLy8gICBhZ2VudCBTSE9VTEQgY2hvb3NlIG9uZSBJUCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGludGVyZmFjZSBhbmQKKy8vICAgdXNlIGl0IGNvbnNpc3RlbnRseSBmb3IgYWxsIEJPT1RQIG1lc3NhZ2VzIGl0IHJlbGF5cy4gIElmIHRoZQorLy8gICAnZ2lhZGRyJyBmaWVsZCBjb250YWlucyBzb21lIG5vbi16ZXJvIHZhbHVlLCB0aGUgJ2dpYWRkcicgZmllbGQgTVVTVAorLy8gICBOT1QgYmUgbW9kaWZpZWQuICBUaGUgcmVsYXkgYWdlbnQgTVVTVCBOT1QsIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLAorLy8gICBmaWxsIHRoZSAnZ2lhZGRyJyBmaWVsZCB3aXRoIGEgYnJvYWRjYXN0IGFkZHJlc3MgYXMgaXMgc3VnZ2VzdGVkIGluCisvLyAgIFsxXSAoU2VjdGlvbiA4LCBzaXh0aCBwYXJhZ3JhcGgpLgorCisvLyBidXQgd2h5PyB3aGF0IGlmIHNlcnZlciBjYW4ndCByb3V0ZSBzdWNoIElQPyBDbGllbnQgaWZhY2VzIG1heSBiZSwgc2F5LCBOQVRlZCEKKworLy8gNC4xLjIgQk9PVFJFUExZIE1lc3NhZ2VzCisvLyAgIEJPT1RQIHJlbGF5IGFnZW50cyByZWxheSBCT09UUkVQTFkgbWVzc2FnZXMgb25seSB0byBCT09UUCBjbGllbnRzLgorLy8gICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgQk9PVFAgc2VydmVycyB0byBzZW5kIEJPT1RSRVBMWSBtZXNzYWdlcworLy8gICBkaXJlY3RseSB0byB0aGUgcmVsYXkgYWdlbnQgaWRlbnRpZmllZCBpbiB0aGUgJ2dpYWRkcicgZmllbGQuCisvLyAoeWVhaCByaWdodCwgdW5sZXNzIGl0IGlzIGltcG9zc2libGUuLi4gc2VlIGNvbW1lbnQgYWJvdmUpCisvLyAgIFRoZXJlZm9yZSwgYSByZWxheSBhZ2VudCBtYXkgYXNzdW1lIHRoYXQgYWxsIEJPT1RSRVBMWSBtZXNzYWdlcyBpdAorLy8gICByZWNlaXZlcyBhcmUgaW50ZW5kZWQgZm9yIEJPT1RQIGNsaWVudHMgb24gaXRzIGRpcmVjdGx5LWNvbm5lY3RlZAorLy8gICBuZXR3b3Jrcy4KKy8vCisvLyAgIFdoZW4gYSByZWxheSBhZ2VudCByZWNlaXZlcyBhIEJPT1RSRVBMWSBtZXNzYWdlLCBpdCBzaG91bGQgZXhhbWluZQorLy8gICB0aGUgQk9PVFAgJ2dpYWRkcicsICd5aWFkZHInLCAnY2hhZGRyJywgJ2h0eXBlJywgYW5kICdobGVuJyBmaWVsZHMuCisvLyAgIFRoZXNlIGZpZWxkcyBzaG91bGQgcHJvdmlkZSBhZGVxdWF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlbGF5IGFnZW50CisvLyAgIHRvIGRlbGl2ZXIgdGhlIEJPT1RSRVBMWSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisvLworLy8gICBUaGUgJ2dpYWRkcicgZmllbGQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGxvZ2ljYWwgaW50ZXJmYWNlIGZyb20KKy8vICAgd2hpY2ggdGhlIHJlcGx5IG11c3QgYmUgc2VudCAoaS5lLiwgdGhlIGhvc3Qgb3Igcm91dGVyIGludGVyZmFjZQorLy8gICBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgbmV0d29yayBhcyB0aGUgQk9PVFAgY2xpZW50KS4gIElmIHRoZSBjb250ZW50CisvLyAgIG9mIHRoZSAnZ2lhZGRyJyBmaWVsZCBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlIHJlbGF5IGFnZW50J3MKKy8vICAgZGlyZWN0bHktY29ubmVjdGVkIGxvZ2ljYWwgaW50ZXJmYWNlcywgdGhlIEJPT1RSRVBMWSBtZXNzc2FnZSBNVVNUIGJlCisvLyAgIHNpbGVudGx5IGRpc2NhcmRlZC4KKwkJCQlpZiAodWRoY3BfcmVhZF9pbnRlcmZhY2UoaWZhY2VfbGlzdFtpXSwgTlVMTCwgJmRoY3BfbXNnLmdhdGV3YXlfbmlwLCBOVUxMKSkgeworCQkJCQkvKiBGYWxsIGJhY2sgdG8gb3VyIElQIG9uIHNlcnZlciBpZmFjZSAqLworLy8gdGhpcyBtYWtlcyBtb3JlIHNlbnNlIQorCQkJCQlkaGNwX21zZy5nYXRld2F5X25pcCA9IG91cl9uaXA7CisJCQkJfQorLy8gbWF5YmUgZGhjcF9tc2cuaG9wcysrPyBkcm9wIHBhY2tldHMgd2l0aCB0b28gbWFueSBob3BzIChSRkMgMTU0MiBzYXlzIDQgb3IgMTYpPworCQkJCXBhc3NfdG9fc2VydmVyKCZkaGNwX21zZywgcGFja2xlbiwgaSwgZmRzLCAmY2xpZW50X2FkZHIsICZzZXJ2ZXJfYWRkcik7CisJCQl9CisJCX0KKwkJeGlkX2V4cGlyZSgpOworCX0gLyogd2hpbGUgKDEpICovCisKKwkvKiByZXR1cm4gMDsgLSBub3QgcmVhY2hlZCAqLworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kb21haW5fY29kZWMuYyBiL25ldHdvcmtpbmcvdWRoY3AvZG9tYWluX2NvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzMjVkOAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvZG9tYWluX2NvZGVjLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworCisvKiBSRkMxMDM1IGRvbWFpbiBjb21wcmVzc2lvbiByb3V0aW5lcyAoQykgMjAwNyBHYWJyaWVsIFNvbWxvIDxzb21sbyBhdCBjbXUuZWR1PgorICoKKyAqIExvb3NlbHkgYmFzZWQgb24gdGhlIGlzYy1kaGNwZCBpbXBsZW1lbnRhdGlvbiBieSBkaGFua2luc0Bpc2Mub3JnCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmZGVmIEROU19DT01QUl9URVNUSU5HCisjIGRlZmluZSBGQVNUX0ZVTkMgLyogbm90aGluZyAqLworIyBkZWZpbmUgeG1hbGxvYyBtYWxsb2MKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGludC5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbHNlCisjIGluY2x1ZGUgImNvbW1vbi5oIgorI2VuZGlmCisKKyNkZWZpbmUgTlNfTUFYRE5BTUUgIDEwMjUJLyogbWF4IGRvbWFpbiBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBOU19NQVhDRE5BTUUgIDI1NQkvKiBtYXggY29tcHJlc3NlZCBkb21haW4gbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTlNfTUFYTEFCRUwgICAgNjMJLyogbWF4IGxhYmVsIGxlbmd0aCAqLworI2RlZmluZSBOU19NQVhETlNSQ0ggICAgNgkvKiBtYXggZG9tYWlucyBpbiBzZWFyY2ggcGF0aCAqLworI2RlZmluZSBOU19DTVBSU0ZMR1MgMHhjMAkvKiBuYW1lIGNvbXByZXNzaW9uIHBvaW50ZXIgZmxhZyAqLworCisKKy8qIEV4cGFuZCBhIFJGQzEwMzUtY29tcHJlc3NlZCBsaXN0IG9mIGRvbWFpbiBuYW1lcyAiY3N0ciIsIG9mIGxlbmd0aCAiY2xlbiI7CisgKiByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBzcGFjZS1zZXBhcmF0ZWQgZG9tYWlucywKKyAqIHByZWZpeGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHN0cmluZyBwcmUsIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCitjaGFyKiBGQVNUX0ZVTkMgZG5hbWVfZGVjKGNvbnN0IHVpbnQ4X3QgKmNzdHIsIGludCBjbGVuLCBjb25zdCBjaGFyICpwcmUpCit7CisJY2hhciAqcmV0ID0gcmV0OyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICpkc3QgPSBOVUxMOworCisJLyogV2UgbWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIGNzdHIgc3RyaW5nLiBGaXJzdCwgd2UgY29tcHV0ZQorCSAqIGhvdyBsb25nIHRoZSByZXN1bHRpbmcgc3RyaW5nIHdvdWxkIGJlLiBUaGVuIHdlIGFsbG9jYXRlIGEKKwkgKiBuZXcgYnVmZmVyIG9mIHRoZSByZXF1aXJlZCBsZW5ndGgsIGFuZCBmaWxsIGl0IGluIHdpdGggdGhlCisJICogZXhwYW5kZWQgY29udGVudC4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIG5vdAorCSAqIGhhdmluZyB0byBkZWFsIHdpdGggcmVxdWlyaW5nIGNhbGxlcnMgdG8gc3VwcGx5IHRoZWlyIG93bgorCSAqIGJ1ZmZlciwgdGhlbiBoYXZpbmcgdG8gY2hlY2sgaWYgaXQncyBzdWZmaWNpZW50bHkgbGFyZ2UsIGV0Yy4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQkvKiBub3RlOiAicmV0dXJuIE5VTEwiIGJlbG93IGFyZSBsZWFrLXNhZmUgc2luY2UKKwkJICogZHN0IGlzbid0IHlldCBhbGxvY2F0ZWQgKi8KKwkJY29uc3QgdWludDhfdCAqYzsKKwkJdW5zaWduZWQgY3J0cG9zLCByZXRwb3MsIGRlcHRoLCBsZW47CisKKwkJY3J0cG9zID0gcmV0cG9zID0gZGVwdGggPSBsZW4gPSAwOworCQl3aGlsZSAoY3J0cG9zIDwgY2xlbikgeworCQkJYyA9IGNzdHIgKyBjcnRwb3M7CisKKwkJCWlmICgoKmMgJiBOU19DTVBSU0ZMR1MpID09IE5TX0NNUFJTRkxHUykgeworCQkJCS8qIHBvaW50ZXIgKi8KKwkJCQlpZiAoY3J0cG9zICsgMiA+IGNsZW4pIC8qIG5vIG9mZnNldCB0byBqdW1wIHRvPyBhYm9ydCAqLworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlpZiAocmV0cG9zID09IDApIC8qIHRvcGxldmVsPyBzYXZlIHJldHVybiBzcG90ICovCisJCQkJCXJldHBvcyA9IGNydHBvcyArIDI7CisJCQkJZGVwdGgrKzsKKwkJCQljcnRwb3MgPSAoKGNbMF0gJiAweDNmKSA8PCA4KSB8IGNbMV07IC8qIGp1bXAgKi8KKwkJCX0gZWxzZSBpZiAoKmMpIHsKKwkJCQkvKiBsYWJlbCAqLworCQkJCWlmIChjcnRwb3MgKyAqYyArIDEgPiBjbGVuKSAvKiBsYWJlbCB0b28gbG9uZz8gYWJvcnQgKi8KKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJaWYgKGRzdCkKKwkJCQkJbWVtY3B5KGRzdCArIGxlbiwgYyArIDEsICpjKTsKKwkJCQlsZW4gKz0gKmMgKyAxOworCQkJCWNydHBvcyArPSAqYyArIDE7CisJCQkJaWYgKGRzdCkKKwkJCQkJZHN0W2xlbiAtIDFdID0gJy4nOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOVUw6IGVuZCBvZiBjdXJyZW50IGRvbWFpbiBuYW1lICovCisJCQkJaWYgKHJldHBvcyA9PSAwKSB7CisJCQkJCS8qIHRvcGxldmVsPyBrZWVwIGdvaW5nICovCisJCQkJCWNydHBvcysrOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIHJldHVybiB0byB0b3BsZXZlbCBzYXZlZCBzcG90ICovCisJCQkJCWNydHBvcyA9IHJldHBvczsKKwkJCQkJcmV0cG9zID0gZGVwdGggPSAwOworCQkJCX0KKwkJCQlpZiAoZHN0KQorCQkJCQlkc3RbbGVuIC0gMV0gPSAnICc7CisJCQl9CisKKwkJCWlmIChkZXB0aCA+IE5TX01BWEROU1JDSCAvKiB0b28gbWFueSBqdW1wcz8gYWJvcnQsIGl0J3MgYSBsb29wICovCisJCQkgfHwgbGVuID4gTlNfTUFYRE5BTUUgKiBOU19NQVhETlNSQ0ggLyogcmVzdWx0IHRvbyBsb25nPyBhYm9ydCAqLworCQkJKSB7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCQlpZiAoIWxlbikgLyogZXhwYW5kZWQgc3RyaW5nIGhhcyAwIGxlbmd0aD8gYWJvcnQgKi8KKwkJCXJldHVybiBOVUxMOworCisJCWlmICghZHN0KSB7IC8qIGZpcnN0IHBhc3M/ICovCisJCQkvKiBhbGxvY2F0ZSBkc3QgYnVmZmVyIGFuZCBjb3B5IHByZSAqLworCQkJdW5zaWduZWQgcGxlbiA9IHN0cmxlbihwcmUpOworCQkJcmV0ID0gZHN0ID0geG1hbGxvYyhwbGVuICsgbGVuKTsKKwkJCW1lbWNweShkc3QsIHByZSwgcGxlbik7CisJCQlkc3QgKz0gcGxlbjsKKwkJfSBlbHNlIHsKKwkJCWRzdFtsZW4gLSAxXSA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIENvbnZlcnQgYSBkb21haW4gbmFtZSAoc3JjKSBmcm9tIGh1bWFuLXJlYWRhYmxlICJmb28uYmxhaC5jb20iIGZvcm1hdCBpbnRvCisgKiBSRkMxMDM1IGVuY29kaW5nICJcMDAzZm9vXDAwNGJsYWhcMDAzY29tXDAwMCIuIFJldHVybiBhbGxvY2F0ZWQgc3RyaW5nLCBvcgorICogTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyB1aW50OF90ICpjb252ZXJ0X2RuYW1lKGNvbnN0IGNoYXIgKnNyYykKK3sKKwl1aW50OF90IGMsICpyZXMsICpsZW5wdHIsICpkc3Q7CisJaW50IGxlbjsKKworCXJlcyA9IHhtYWxsb2Moc3RybGVuKHNyYykgKyAyKTsKKwlkc3QgPSBsZW5wdHIgPSByZXM7CisJZHN0Kys7CisKKwlmb3IgKDs7KSB7CisJCWMgPSAodWludDhfdCkqc3JjKys7CisJCWlmIChjID09ICcuJyB8fCBjID09ICdcMCcpIHsgIC8qIGVuZCBvZiBsYWJlbCAqLworCQkJbGVuID0gZHN0IC0gbGVucHRyIC0gMTsKKwkJCS8qIGxhYmVsIHRvbyBsb25nLCB0b28gc2hvcnQsIG9yIHR3byAnLidzIGluIGEgcm93PyBhYm9ydCAqLworCQkJaWYgKGxlbiA+IE5TX01BWExBQkVMIHx8IGxlbiA9PSAwIHx8IChjID09ICcuJyAmJiAqc3JjID09ICcuJykpIHsKKwkJCQlmcmVlKHJlcyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkqbGVucHRyID0gbGVuOworCQkJaWYgKGMgPT0gJ1wwJyB8fCAqc3JjID09ICdcMCcpCS8qICIiIG9yICIuIjogZW5kIG9mIHNyYyAqLworCQkJCWJyZWFrOworCQkJbGVucHRyID0gZHN0Kys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpICAvKiB1cHBlcmNhc2U/IGNvbnZlcnQgdG8gbG93ZXIgKi8KKwkJCWMgKz0gKCdhJyAtICdBJyk7CisJCSpkc3QrKyA9IGM7CisJfQorCisJaWYgKGRzdCAtIHJlcyA+PSBOU19NQVhDRE5BTUUpIHsgIC8qIGRuYW1lIHRvbyBsb25nPyBhYm9ydCAqLworCQlmcmVlKHJlcyk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpkc3QgPSAwOworCXJldHVybiByZXM7Cit9CisKKy8qIFJldHVybnMgdGhlIG9mZnNldCB3aXRoaW4gY3N0ciBhdCB3aGljaCBkbmFtZSBjYW4gYmUgZm91bmQsIG9yIC0xICovCitzdGF0aWMgaW50IGZpbmRfb2Zmc2V0KGNvbnN0IHVpbnQ4X3QgKmNzdHIsIGludCBjbGVuLCBjb25zdCB1aW50OF90ICpkbmFtZSkKK3sKKwljb25zdCB1aW50OF90ICpjLCAqZDsKKwlpbnQgb2ZmOworCisJLyogZmluZCBhbGwgbGFiZWxzIGluIGNzdHIgKi8KKwlvZmYgPSAwOworCXdoaWxlIChvZmYgPCBjbGVuKSB7CisJCWMgPSBjc3RyICsgb2ZmOworCisJCWlmICgoKmMgJiBOU19DTVBSU0ZMR1MpID09IE5TX0NNUFJTRkxHUykgeyAgLyogcG9pbnRlciwgc2tpcCAqLworCQkJb2ZmICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKmMpIHsgIC8qIGxhYmVsLCB0cnkgbWF0Y2hpbmcgZG5hbWUgKi8KKwkJCWQgPSBkbmFtZTsKKwkJCXdoaWxlICgxKSB7CisJCQkJdW5zaWduZWQgbGVuMSA9ICpjICsgMTsKKwkJCQlpZiAobWVtY21wKGMsIGQsIGxlbjEpICE9IDApCisJCQkJCWJyZWFrOworCQkJCWlmIChsZW4xID09IDEpICAvKiBhdCB0ZXJtaW5hdGluZyBOVUwgLSBtYXRjaCwgcmV0dXJuIG9mZnNldCAqLworCQkJCQlyZXR1cm4gb2ZmOworCQkJCWQgKz0gbGVuMTsKKwkJCQljICs9IGxlbjE7CisJCQkJaWYgKCgqYyAmIE5TX0NNUFJTRkxHUykgPT0gTlNfQ01QUlNGTEdTKSAgLyogcG9pbnRlciwganVtcCAqLworCQkJCQljID0gY3N0ciArICgoKGNbMF0gJiAweDNmKSA8PCA4KSB8IGNbMV0pOworCQkJfQorCQkJb2ZmICs9IGNzdHJbb2ZmXSArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBOVUwsIHNraXAgKi8KKwkJb2ZmKys7CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKiBDb21wdXRlcyBzdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8gY3N0ciBzbyB0aGF0IHNyYyB3b3VsZCBiZSBhZGRlZCB0bworICogdGhlIGNvbXByZXNzaW9uIChiZXN0IGNhc2UsIGl0J3MgYSAyLWJ5dGUgcG9pbnRlciB0byBzb21lIG9mZnNldCB3aXRoaW4KKyAqIGNzdHI7IHdvcnN0IGNhc2UsIGl0J3MgYWxsIG9mIHNyYywgY29udmVydGVkIHRvIDw0Pmhvc3Q8Mz5jb208MD4gZm9ybWF0KS4KKyAqIFRoZSBjb21wdXRlZCBzdHJpbmcgaXMgcmV0dXJuZWQgZGlyZWN0bHk7IGl0cyBsZW5ndGggaXMgcmV0dXJuZWQgdmlhIHJldGxlbjsKKyAqIE5VTEwgYW5kIDAsIHJlc3BlY3RpdmVseSwgYXJlIHJldHVybmVkIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAqLwordWludDhfdCogRkFTVF9GVU5DIGRuYW1lX2VuYyhjb25zdCB1aW50OF90ICpjc3RyLCBpbnQgY2xlbiwgY29uc3QgY2hhciAqc3JjLCBpbnQgKnJldGxlbikKK3sKKwl1aW50OF90ICpkLCAqZG5hbWU7CisJaW50IG9mZjsKKworCWRuYW1lID0gY29udmVydF9kbmFtZShzcmMpOworCWlmIChkbmFtZSA9PSBOVUxMKSB7CisJCSpyZXRsZW4gPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkID0gZG5hbWU7CisJd2hpbGUgKCpkKSB7CisJCWlmIChjc3RyKSB7CisJCQlvZmYgPSBmaW5kX29mZnNldChjc3RyLCBjbGVuLCBkKTsKKwkJCWlmIChvZmYgPj0gMCkgewkvKiBmb3VuZCBhIG1hdGNoLCBhZGQgcG9pbnRlciBhbmQgcmV0dXJuICovCisJCQkJKmQrKyA9IE5TX0NNUFJTRkxHUyB8IChvZmYgPj4gOCk7CisJCQkJKmQgPSBvZmY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZCArPSAqZCArIDE7CisJfQorCisJKnJldGxlbiA9IGQgLSBkbmFtZSArIDE7CisJcmV0dXJuIGRuYW1lOworfQorCisjaWZkZWYgRE5TX0NPTVBSX1RFU1RJTkcKKy8qIGdjYyAtV2FsbCAtREROU19DT01QUl9URVNUSU5HIGRvbWFpbl9jb2RlYy5jIC1vIGRvbWFpbl9jb2RlYyAmJiAuL2RvbWFpbl9jb2RlYyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBsZW47CisJdWludDhfdCAqZW5jb2RlZDsKKworI2RlZmluZSBETkFNRV9ERUMoZW5jb2RlZCxwcmUpIGRuYW1lX2RlYygodWludDhfdCopKGVuY29kZWQpLCBzaXplb2YoZW5jb2RlZCksIChwcmUpKQorCXByaW50ZigiJyVzJ1xuIiwgICAgICAgRE5BTUVfREVDKCJcNGhvc3RcM2NvbVwwIiwgInRlc3QxOiIpKTsKKwlwcmludGYoInRlc3QyOiclcydcbiIsIEROQU1FX0RFQygiXDRob3N0XDNjb21cMFw0aG9zdFwzY29tXDAiLCAiIikpOworCXByaW50ZigidGVzdDM6JyVzJ1xuIiwgRE5BTUVfREVDKCJcNGhvc3RcM2NvbVwwXHhDMFwwIiwgIiIpKTsKKwlwcmludGYoInRlc3Q0OiclcydcbiIsIEROQU1FX0RFQygiXDRob3N0XDNjb21cMFx4QzBcNSIsICIiKSk7CisJcHJpbnRmKCJ0ZXN0NTonJXMnXG4iLCBETkFNRV9ERUMoIlw0aG9zdFwzY29tXDBceEMwXDVcMXpceEMwXHhBIiwgIiIpKTsKKworI2RlZmluZSBETkFNRV9FTkMoY2FjaGUsc291cmNlLGxlbnApIGRuYW1lX2VuYygodWludDhfdCopKGNhY2hlKSwgc2l6ZW9mKGNhY2hlKSwgKHNvdXJjZSksIChsZW5wKSkKKwllbmNvZGVkID0gZG5hbWVfZW5jKE5VTEwsIDAsICJ0ZXN0Lm5ldCIsICZsZW4pOworCXByaW50ZigidGVzdDY6JyVzJyBsZW46JWRcbiIsIGRuYW1lX2RlYyhlbmNvZGVkLCBsZW4sICIiKSwgbGVuKTsKKwllbmNvZGVkID0gRE5BTUVfRU5DKCJcM25ldFwwIiwgInRlc3QubmV0IiwgJmxlbik7CisJcHJpbnRmKCJ0ZXN0NzonJXMnIGxlbjolZFxuIiwgZG5hbWVfZGVjKGVuY29kZWQsIGxlbiwgIiIpLCBsZW4pOworCWVuY29kZWQgPSBETkFNRV9FTkMoIlw0dGVzdFwzbmV0XDAiLCAidGVzdC5uZXQiLCAmbGVuKTsKKwlwcmludGYoInRlc3Q4OiclcycgbGVuOiVkXG4iLCBkbmFtZV9kZWMoZW5jb2RlZCwgbGVuLCAiIiksIGxlbik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvZHVtcGxlYXNlcy5jIGIvbmV0d29ya2luZy91ZGhjcC9kdW1wbGVhc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjZDczZQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvZHVtcGxlYXNlcy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkdW1wbGVhc2VzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXJ8LWFdIFstZiBMRUFTRUZJTEVdIgorLy91c2FnZTojZGVmaW5lIGR1bXBsZWFzZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IERIQ1AgbGVhc2VzIGdyYW50ZWQgYnkgdWRoY3BkXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tZmlsZT1GSUxFCUxlYXNlIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1yLC0tcmVtYWluaW5nCVNob3cgcmVtYWluaW5nIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1hLC0tYWJzb2x1dGUJU2hvdyBleHBpcmF0aW9uIHRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktZiBGSUxFCUxlYXNlIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1yCVNob3cgcmVtYWluaW5nIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1hCVNob3cgZXhwaXJhdGlvbiB0aW1lIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKK2ludCBkdW1wbGVhc2VzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkdW1wbGVhc2VzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJaW50IGk7CisJdW5zaWduZWQgb3B0OworCWludDY0X3Qgd3JpdHRlbl9hdCwgY3VyciwgZXhwaXJlc19hYnM7CisJY29uc3QgY2hhciAqZmlsZSA9IExFQVNFU19GSUxFOworCXN0cnVjdCBkeW5fbGVhc2UgbGVhc2U7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKworCWVudW0geworCQlPUFRfYSA9IDB4MSwgLy8gLWEKKwkJT1BUX3IgPSAweDIsIC8vIC1yCisJCU9QVF9mID0gMHg0LCAvLyAtZgorCX07CisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIGR1bXBsZWFzZXNfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkiYWJzb2x1dGVcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCQkicmVtYWluaW5nXDAiIE5vX2FyZ3VtZW50ICAgICAgICJyIgorCQkiZmlsZVwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJmIgorCQk7CisKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZHVtcGxlYXNlc19sb25nb3B0czsKKyNlbmRpZgorCWluaXRfdW5pY29kZSgpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTA6YS0tcjpyLS1hIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYXJmOiIsICZmaWxlKTsKKworCWZkID0geG9wZW4oZmlsZSwgT19SRE9OTFkpOworCisJcHJpbnRmKCJNYWMgQWRkcmVzcyAgICAgICBJUCBBZGRyZXNzICAgICAgSG9zdCBOYW1lICAgICAgICAgICBFeHBpcmVzICVzXG4iLCAob3B0ICYgT1BUX2EpID8gImF0IiA6ICJpbiIpOworCS8qICAgICAiMDA6MDA6MDA6MDA6MDA6MDAgMjU1LjI1NS4yNTUuMjU1IEFCQ0RFRkdISUpLTE1OT1BRUlMgV2VkIEp1biAzMCAyMTo0OTowOCAxOTkzIiAqLworCS8qICAgICAiMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAqLworCisJeHJlYWQoZmQsICZ3cml0dGVuX2F0LCBzaXplb2Yod3JpdHRlbl9hdCkpOworCXdyaXR0ZW5fYXQgPSBTV0FQX0JFNjQod3JpdHRlbl9hdCk7CisJY3VyciA9IHRpbWUoTlVMTCk7CisJaWYgKGN1cnIgPCB3cml0dGVuX2F0KQorCQl3cml0dGVuX2F0ID0gY3VycjsgLyogbGVhc2UgZmlsZSBmcm9tIGZ1dHVyZSEgOikgKi8KKworCXdoaWxlIChmdWxsX3JlYWQoZmQsICZsZWFzZSwgc2l6ZW9mKGxlYXNlKSkgPT0gc2l6ZW9mKGxlYXNlKSkgeworCQljb25zdCBjaGFyICpmbXQgPSAiOiUwMngiICsgMTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJcHJpbnRmKGZtdCwgbGVhc2UubGVhc2VfbWFjW2ldKTsKKwkJCWZtdCA9ICI6JTAyeCI7CisJCX0KKwkJYWRkci5zX2FkZHIgPSBsZWFzZS5sZWFzZV9uaXA7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQl7CisJCQljaGFyICp1bmlfbmFtZSA9IHVuaWNvZGVfY29udl90b19wcmludGFibGVfZml4ZWR3aWR0aCgvKk5VTEwsKi8gbGVhc2UuaG9zdG5hbWUsIDE5KTsKKwkJCXByaW50ZigiICUtMTZzJXMgIiwgaW5ldF9udG9hKGFkZHIpLCB1bmlfbmFtZSk7CisJCQlmcmVlKHVuaV9uYW1lKTsKKwkJfQorI2Vsc2UKKwkJLyogYWN0dWFsbHksIDE1KzEgYW5kIDE5KzEsICsxIGlzIGEgc3BhY2UgYmV0d2VlbiBjb2x1bW5zICovCisJCS8qIGxlYXNlLmhvc3RuYW1lIGlzIGNoYXJbMjBdIGFuZCBpcyBhbHdheXMgTlVMIHRlcm1pbmF0ZWQgKi8KKwkJcHJpbnRmKCIgJS0xNnMlLTIwcyIsIGluZXRfbnRvYShhZGRyKSwgbGVhc2UuaG9zdG5hbWUpOworI2VuZGlmCisJCWV4cGlyZXNfYWJzID0gbnRvaGwobGVhc2UuZXhwaXJlcykgKyB3cml0dGVuX2F0OworCQlpZiAoZXhwaXJlc19hYnMgPD0gY3VycikgeworCQkJcHV0cygiZXhwaXJlZCIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEob3B0ICYgT1BUX2EpKSB7IC8qIG5vIC1hICovCisJCQl1bnNpZ25lZCBkLCBoLCBtOworCQkJdW5zaWduZWQgZXhwaXJlcyA9IGV4cGlyZXNfYWJzIC0gY3VycjsKKwkJCWQgPSBleHBpcmVzIC8gKDI0KjYwKjYwKTsgZXhwaXJlcyAlPSAoMjQqNjAqNjApOworCQkJaCA9IGV4cGlyZXMgLyAoNjAqNjApOyBleHBpcmVzICU9ICg2MCo2MCk7CisJCQltID0gZXhwaXJlcyAvIDYwOyBleHBpcmVzICU9IDYwOworCQkJaWYgKGQpCisJCQkJcHJpbnRmKCIldSBkYXlzICIsIGQpOworCQkJcHJpbnRmKCIlMDJ1OiUwMnU6JTAydVxuIiwgaCwgbSwgKHVuc2lnbmVkKWV4cGlyZXMpOworCQl9IGVsc2UgeyAvKiAtYSAqLworCQkJdGltZV90IHQgPSBleHBpcmVzX2FiczsKKwkJCWZwdXRzKGN0aW1lKCZ0KSwgc3Rkb3V0KTsKKwkJfQorCX0KKwkvKiBjbG9zZShmZCk7ICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvZmlsZXMuYyBiL25ldHdvcmtpbmcvdWRoY3AvZmlsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQwZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9maWxlcy5jCkBAIC0wLDAgKzEsMjE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBESENQIHNlcnZlciBjb25maWcgYW5kIGxlYXNlIGZpbGUgbWFuaXB1bGF0aW9uCisgKgorICogUmV3cml0ZSBieSBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKworLyogb24gdGhlc2UgZnVuY3Rpb25zLCBtYWtlIHN1cmUgeW91ciBkYXRhdHlwZSBtYXRjaGVzICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyByZWFkX3N0cihjb25zdCBjaGFyICpsaW5lLCB2b2lkICphcmcpCit7CisJY2hhciAqKmRlc3QgPSBhcmc7CisKKwlmcmVlKCpkZXN0KTsKKwkqZGVzdCA9IHhzdHJkdXAobGluZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHJlYWRfdTMyKGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKmFyZykKK3sKKwkqKHVpbnQzMl90KilhcmcgPSBiYl9zdHJ0b3UzMihsaW5lLCBOVUxMLCAxMCk7CisJcmV0dXJuIGVycm5vID09IDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHJlYWRfc3RhdGljbGVhc2UoY29uc3QgY2hhciAqY29uc3RfbGluZSwgdm9pZCAqYXJnKQoreworCWNoYXIgKmxpbmU7CisJY2hhciAqbWFjX3N0cmluZzsKKwljaGFyICppcF9zdHJpbmc7CisJc3RydWN0IGV0aGVyX2FkZHIgbWFjX2J5dGVzOyAvKiBpdCdzICJzdHJ1Y3QgeyB1aW50OF90IG1hY1s2XTsgfSIgKi8KKwl1aW50MzJfdCBuaXA7CisKKwkvKiBSZWFkIG1hYyAqLworCWxpbmUgPSAoY2hhciAqKSBjb25zdF9saW5lOworCW1hY19zdHJpbmcgPSBzdHJ0b2tfcihsaW5lLCAiIFx0IiwgJmxpbmUpOworCWlmICghbWFjX3N0cmluZyB8fCAhZXRoZXJfYXRvbl9yKG1hY19zdHJpbmcsICZtYWNfYnl0ZXMpKQorCQlyZXR1cm4gMDsKKworCS8qIFJlYWQgaXAgKi8KKwlpcF9zdHJpbmcgPSBzdHJ0b2tfcihOVUxMLCAiIFx0IiwgJmxpbmUpOworCWlmICghaXBfc3RyaW5nIHx8ICF1ZGhjcF9zdHIybmlwKGlwX3N0cmluZywgJm5pcCkpCisJCXJldHVybiAwOworCisJYWRkX3N0YXRpY19sZWFzZShhcmcsICh1aW50OF90KikgJm1hY19ieXRlcywgbmlwKTsKKworCWxvZ19zdGF0aWNfbGVhc2VzKGFyZyk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdHJ1Y3QgY29uZmlnX2tleXdvcmQgeworCWNvbnN0IGNoYXIgKmtleXdvcmQ7CisJaW50ICgqaGFuZGxlcikoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqdmFyKSBGQVNUX0ZVTkM7CisJdm9pZCAqdmFyOworCWNvbnN0IGNoYXIgKmRlZjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX2tleXdvcmQga2V5d29yZHNbXSA9IHsKKwkvKiBrZXl3b3JkICAgICAgICBoYW5kbGVyICAgICAgICAgICB2YXJpYWJsZSBhZGRyZXNzICAgICAgICAgICAgICAgZGVmYXVsdCAqLworCXsic3RhcnQiICAgICAgICAsIHVkaGNwX3N0cjJuaXAgICAsICZzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwICAgICAsICIxOTIuMTY4LjAuMjAifSwKKwl7ImVuZCIgICAgICAgICAgLCB1ZGhjcF9zdHIybmlwICAgLCAmc2VydmVyX2NvbmZpZy5lbmRfaXAgICAgICAgLCAiMTkyLjE2OC4wLjI1NCJ9LAorCXsiaW50ZXJmYWNlIiAgICAsIHJlYWRfc3RyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLmludGVyZmFjZSAgICAsICJldGgwIn0sCisJLyogQXZvaWQgIm1heF9sZWFzZXMgdmFsdWUgbm90IHNhbmUiIHdhcm5pbmcgYnkgc2V0dGluZyBkZWZhdWx0CisJICogdG8gZGVmYXVsdF9lbmRfaXAgLSBkZWZhdWx0X3N0YXJ0X2lwICsgMTogKi8KKwl7Im1heF9sZWFzZXMiICAgLCByZWFkX3UzMiAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzICAgLCAiMjM1In0sCisJeyJhdXRvX3RpbWUiICAgICwgcmVhZF91MzIgICAgICAgICwgJnNlcnZlcl9jb25maWcuYXV0b190aW1lICAgICwgIjcyMDAifSwKKwl7ImRlY2xpbmVfdGltZSIgLCByZWFkX3UzMiAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5kZWNsaW5lX3RpbWUgLCAiMzYwMCJ9LAorCXsiY29uZmxpY3RfdGltZSIsIHJlYWRfdTMyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLmNvbmZsaWN0X3RpbWUsICIzNjAwIn0sCisJeyJvZmZlcl90aW1lIiAgICwgcmVhZF91MzIgICAgICAgICwgJnNlcnZlcl9jb25maWcub2ZmZXJfdGltZSAgICwgIjYwIn0sCisJeyJtaW5fbGVhc2UiICAgICwgcmVhZF91MzIgICAgICAgICwgJnNlcnZlcl9jb25maWcubWluX2xlYXNlX3NlYywgIjYwIn0sCisJeyJsZWFzZV9maWxlIiAgICwgcmVhZF9zdHIgICAgICAgICwgJnNlcnZlcl9jb25maWcubGVhc2VfZmlsZSAgICwgTEVBU0VTX0ZJTEV9LAorCXsicGlkZmlsZSIgICAgICAsIHJlYWRfc3RyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLnBpZGZpbGUgICAgICAsICIvdmFyL3J1bi91ZGhjcGQucGlkIn0sCisJeyJzaWFkZHIiICAgICAgICwgdWRoY3Bfc3RyMm5pcCAgICwgJnNlcnZlcl9jb25maWcuc2lhZGRyX25pcCAgICwgIjAuMC4wLjAifSwKKwkvKiBrZXl3b3JkcyB3aXRoIG5vIGRlZmF1bHRzIG11c3QgYmUgbGFzdCEgKi8KKwl7Im9wdGlvbiIgICAgICAgLCB1ZGhjcF9zdHIyb3B0c2V0LCAmc2VydmVyX2NvbmZpZy5vcHRpb25zICAgICAgLCAiIn0sCisJeyJvcHQiICAgICAgICAgICwgdWRoY3Bfc3RyMm9wdHNldCwgJnNlcnZlcl9jb25maWcub3B0aW9ucyAgICAgICwgIiJ9LAorCXsibm90aWZ5X2ZpbGUiICAsIHJlYWRfc3RyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLm5vdGlmeV9maWxlICAsIE5VTEx9LAorCXsic25hbWUiICAgICAgICAsIHJlYWRfc3RyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLnNuYW1lICAgICAgICAsIE5VTEx9LAorCXsiYm9vdF9maWxlIiAgICAsIHJlYWRfc3RyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLmJvb3RfZmlsZSAgICAsIE5VTEx9LAorCXsic3RhdGljX2xlYXNlIiAsIHJlYWRfc3RhdGljbGVhc2UsICZzZXJ2ZXJfY29uZmlnLnN0YXRpY19sZWFzZXMsICIifSwKK307CitlbnVtIHsgS1dTX1dJVEhfREVGQVVMVFMgPSBBUlJBWV9TSVpFKGtleXdvcmRzKSAtIDYgfTsKKwordm9pZCBGQVNUX0ZVTkMgcmVhZF9jb25maWcoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNvbnN0IHN0cnVjdCBjb25maWdfa2V5d29yZCAqazsKKwl1bnNpZ25lZCBpOworCWNoYXIgKnRva2VuWzJdOworCisJZm9yIChpID0gMDsgaSA8IEtXU19XSVRIX0RFRkFVTFRTOyBpKyspCisJCWtleXdvcmRzW2ldLmhhbmRsZXIoa2V5d29yZHNbaV0uZGVmLCBrZXl3b3Jkc1tpXS52YXIpOworCisJcGFyc2VyID0gY29uZmlnX29wZW4oZmlsZSk7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDIsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlmb3IgKGsgPSBrZXl3b3JkcywgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtleXdvcmRzKTsgaysrLCBpKyspIHsKKwkJCWlmIChzdHJjYXNlY21wKHRva2VuWzBdLCBrLT5rZXl3b3JkKSA9PSAwKSB7CisJCQkJaWYgKCFrLT5oYW5kbGVyKHRva2VuWzFdLCBrLT52YXIpKSB7CisJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgcGFyc2UgbGluZSAldSBpbiAlcyIsCisJCQkJCQkJcGFyc2VyLT5saW5lbm8sIGZpbGUpOworCQkJCQkvKiByZXNldCBiYWNrIHRvIHRoZSBkZWZhdWx0IHZhbHVlICovCisJCQkJCWstPmhhbmRsZXIoay0+ZGVmLCBrLT52YXIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKworCXNlcnZlcl9jb25maWcuc3RhcnRfaXAgPSBudG9obChzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwKTsKKwlzZXJ2ZXJfY29uZmlnLmVuZF9pcCA9IG50b2hsKHNlcnZlcl9jb25maWcuZW5kX2lwKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgd3JpdGVfbGVhc2VzKHZvaWQpCit7CisJaW50IGZkOworCXVuc2lnbmVkIGk7CisJbGVhc2V0aW1lX3QgY3VycjsKKwlpbnQ2NF90IHdyaXR0ZW5fYXQ7CisKKwlmZCA9IG9wZW5fb3Jfd2FybihzZXJ2ZXJfY29uZmlnLmxlYXNlX2ZpbGUsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQyk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCisJY3VyciA9IHdyaXR0ZW5fYXQgPSB0aW1lKE5VTEwpOworCisJd3JpdHRlbl9hdCA9IFNXQVBfQkU2NCh3cml0dGVuX2F0KTsKKwlmdWxsX3dyaXRlKGZkLCAmd3JpdHRlbl9hdCwgc2l6ZW9mKHdyaXR0ZW5fYXQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXM7IGkrKykgeworCQlsZWFzZXRpbWVfdCB0bXBfdGltZTsKKworCQlpZiAoZ19sZWFzZXNbaV0ubGVhc2VfbmlwID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBTY3JldyB3aXRoIHRoZSB0aW1lIGluIHRoZSBzdHJ1Y3QsIGZvciBlYXNpZXIgd3JpdGluZyAqLworCQl0bXBfdGltZSA9IGdfbGVhc2VzW2ldLmV4cGlyZXM7CisKKwkJZ19sZWFzZXNbaV0uZXhwaXJlcyAtPSBjdXJyOworCQlpZiAoKHNpZ25lZF9sZWFzZXRpbWVfdCkgZ19sZWFzZXNbaV0uZXhwaXJlcyA8IDApCisJCQlnX2xlYXNlc1tpXS5leHBpcmVzID0gMDsKKwkJZ19sZWFzZXNbaV0uZXhwaXJlcyA9IGh0b25sKGdfbGVhc2VzW2ldLmV4cGlyZXMpOworCisJCS8qIE5vIGVycm9yIGNoZWNrLiBJZiB0aGUgZmlsZSBnZXRzIHRydW5jYXRlZCwKKwkJICogd2UgbG9zZSBzb21lIGxlYXNlcyBvbiByZXN0YXJ0LiBPaCB3ZWxsLiAqLworCQlmdWxsX3dyaXRlKGZkLCAmZ19sZWFzZXNbaV0sIHNpemVvZihnX2xlYXNlc1tpXSkpOworCisJCS8qIFRoZW4gcmVzdG9yZSBpdCB3aGVuIGRvbmUgKi8KKwkJZ19sZWFzZXNbaV0uZXhwaXJlcyA9IHRtcF90aW1lOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAoc2VydmVyX2NvbmZpZy5ub3RpZnlfZmlsZSkgeworCQljaGFyICphcmd2WzNdOworCQlhcmd2WzBdID0gc2VydmVyX2NvbmZpZy5ub3RpZnlfZmlsZTsKKwkJYXJndlsxXSA9IHNlcnZlcl9jb25maWcubGVhc2VfZmlsZTsKKwkJYXJndlsyXSA9IE5VTEw7CisJCXNwYXduX2FuZF93YWl0KGFyZ3YpOworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgcmVhZF9sZWFzZXMoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgZHluX2xlYXNlIGxlYXNlOworCWludDY0X3Qgd3JpdHRlbl9hdCwgdGltZV9wYXNzZWQ7CisJaW50IGZkOworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisJdW5zaWduZWQgaSA9IDA7CisjZW5kaWYKKworCWZkID0gb3Blbl9vcl93YXJuKGZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoZnVsbF9yZWFkKGZkLCAmd3JpdHRlbl9hdCwgc2l6ZW9mKHdyaXR0ZW5fYXQpKSAhPSBzaXplb2Yod3JpdHRlbl9hdCkpCisJCWdvdG8gcmV0OworCXdyaXR0ZW5fYXQgPSBTV0FQX0JFNjQod3JpdHRlbl9hdCk7CisKKwl0aW1lX3Bhc3NlZCA9IHRpbWUoTlVMTCkgLSB3cml0dGVuX2F0OworCS8qIFN0cmFuZ2Ugd3JpdHRlbl9hdCwgb3IgbGVhc2UgZmlsZSBmcm9tIG9sZCB2ZXJzaW9uIG9mIHVkaGNwZAorCSAqIHdoaWNoIGhhZCBubyAid3JpdHRlbl9hdCIgZmllbGQ/ICovCisJaWYgKCh1aW50NjRfdCl0aW1lX3Bhc3NlZCA+IDEyICogNjAgKiA2MCkKKwkJZ290byByZXQ7CisKKwl3aGlsZSAoZnVsbF9yZWFkKGZkLCAmbGVhc2UsIHNpemVvZihsZWFzZSkpID09IHNpemVvZihsZWFzZSkpIHsKKy8vRklYTUU6IHdoYXQgaWYgaXQgbWF0Y2hlcyBzb21lIHN0YXRpYyBsZWFzZT8KKwkJdWludDMyX3QgeSA9IG50b2hsKGxlYXNlLmxlYXNlX25pcCk7CisJCWlmICh5ID49IHNlcnZlcl9jb25maWcuc3RhcnRfaXAgJiYgeSA8PSBzZXJ2ZXJfY29uZmlnLmVuZF9pcCkgeworCQkJc2lnbmVkX2xlYXNldGltZV90IGV4cGlyZXMgPSBudG9obChsZWFzZS5leHBpcmVzKSAtIChzaWduZWRfbGVhc2V0aW1lX3QpdGltZV9wYXNzZWQ7CisJCQlpZiAoZXhwaXJlcyA8PSAwKQorCQkJCWNvbnRpbnVlOworCQkJLyogTkI6IGFkZF9sZWFzZSB0YWtlcyAicmVsYXRpdmUgdGltZSIsIElPVywKKwkJCSAqIGxlYXNlIGR1cmF0aW9uLCBub3QgbGVhc2UgZGVhZGxpbmUuICovCisJCQlpZiAoYWRkX2xlYXNlKGxlYXNlLmxlYXNlX21hYywgbGVhc2UubGVhc2VfbmlwLAorCQkJCQlleHBpcmVzLAorCQkJCQlsZWFzZS5ob3N0bmFtZSwgc2l6ZW9mKGxlYXNlLmhvc3RuYW1lKQorCQkJCSkgPT0gMAorCQkJKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJ0b28gbWFueSBsZWFzZXMgd2hpbGUgbG9hZGluZyAlcyIsIGZpbGUpOworCQkJCWJyZWFrOworCQkJfQorI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisJCQlpKys7CisjZW5kaWYKKwkJfQorCX0KKwlsb2cxKCJSZWFkICVkIGxlYXNlcyIsIGkpOworIHJldDoKKwljbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2xlYXNlcy5jIGIvbmV0d29ya2luZy91ZGhjcC9sZWFzZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI2MGIxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9sZWFzZXMuYwpAQCAtMCwwICsxLDIwMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gSnVseSAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisKKy8qIEZpbmQgdGhlIG9sZGVzdCBleHBpcmVkIGxlYXNlLCBOVUxMIGlmIHRoZXJlIGFyZSBubyBleHBpcmVkIGxlYXNlcyAqLworc3RhdGljIHN0cnVjdCBkeW5fbGVhc2UgKm9sZGVzdF9leHBpcmVkX2xlYXNlKHZvaWQpCit7CisJc3RydWN0IGR5bl9sZWFzZSAqb2xkZXN0X2xlYXNlID0gTlVMTDsKKwlsZWFzZXRpbWVfdCBvbGRlc3RfdGltZSA9IHRpbWUoTlVMTCk7CisJdW5zaWduZWQgaTsKKworCS8qIFVuZXhwaXJlZCBsZWFzZXMgaGF2ZSBnX2xlYXNlc1tpXS5leHBpcmVzID49IGN1cnJlbnQgdGltZQorCSAqIGFuZCB0aGVyZWZvcmUgY2FuJ3QgZXZlciBtYXRjaCAqLworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXM7IGkrKykgeworCQlpZiAoZ19sZWFzZXNbaV0uZXhwaXJlcyA8IG9sZGVzdF90aW1lKSB7CisJCQlvbGRlc3RfdGltZSA9IGdfbGVhc2VzW2ldLmV4cGlyZXM7CisJCQlvbGRlc3RfbGVhc2UgPSAmZ19sZWFzZXNbaV07CisJCX0KKwl9CisJcmV0dXJuIG9sZGVzdF9sZWFzZTsKK30KKworLyogQ2xlYXIgb3V0IGFsbCBsZWFzZXMgd2l0aCBtYXRjaGluZyBub256ZXJvIGNoYWRkciBPUiB5aWFkZHIuCisgKiBJZiBjaGFkZHIgPT0gTlVMTCwgdGhpcyBpcyBhIGNvbmZsaWN0IGxlYXNlLgorICovCitzdGF0aWMgdm9pZCBjbGVhcl9sZWFzZXMoY29uc3QgdWludDhfdCAqY2hhZGRyLCB1aW50MzJfdCB5aWFkZHIpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXM7IGkrKykgeworCQlpZiAoKGNoYWRkciAmJiBtZW1jbXAoZ19sZWFzZXNbaV0ubGVhc2VfbWFjLCBjaGFkZHIsIDYpID09IDApCisJCSB8fCAoeWlhZGRyICYmIGdfbGVhc2VzW2ldLmxlYXNlX25pcCA9PSB5aWFkZHIpCisJCSkgeworCQkJbWVtc2V0KCZnX2xlYXNlc1tpXSwgMCwgc2l6ZW9mKGdfbGVhc2VzW2ldKSk7CisJCX0KKwl9Cit9CisKKy8qIEFkZCBhIGxlYXNlIGludG8gdGhlIHRhYmxlLCBjbGVhcmluZyBvdXQgYW55IG9sZCBvbmVzLgorICogSWYgY2hhZGRyID09IE5VTEwsIHRoaXMgaXMgYSBjb25mbGljdCBsZWFzZS4KKyAqLworc3RydWN0IGR5bl9sZWFzZSogRkFTVF9GVU5DIGFkZF9sZWFzZSgKKwkJY29uc3QgdWludDhfdCAqY2hhZGRyLCB1aW50MzJfdCB5aWFkZHIsCisJCWxlYXNldGltZV90IGxlYXNldGltZSwKKwkJY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBob3N0bmFtZV9sZW4pCit7CisJc3RydWN0IGR5bl9sZWFzZSAqb2xkZXN0OworCisJLyogY2xlYW4gb3V0IGFueSBvbGQgb25lcyAqLworCWNsZWFyX2xlYXNlcyhjaGFkZHIsIHlpYWRkcik7CisKKwlvbGRlc3QgPSBvbGRlc3RfZXhwaXJlZF9sZWFzZSgpOworCisJaWYgKG9sZGVzdCkgeworCQltZW1zZXQob2xkZXN0LCAwLCBzaXplb2YoKm9sZGVzdCkpOworCQlpZiAoaG9zdG5hbWUpIHsKKwkJCWNoYXIgKnA7CisKKwkJCWhvc3RuYW1lX2xlbisrOyAvKiBpbmNsdWRlIE5VTCAqLworCQkJaWYgKGhvc3RuYW1lX2xlbiA+IHNpemVvZihvbGRlc3QtPmhvc3RuYW1lKSkKKwkJCQlob3N0bmFtZV9sZW4gPSBzaXplb2Yob2xkZXN0LT5ob3N0bmFtZSk7CisJCQlwID0gc2FmZV9zdHJuY3B5KG9sZGVzdC0+aG9zdG5hbWUsIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOworCQkJLyogc2FuaXRpemF0aW9uIChzL25vbi1BU0NJSS9eL2cpICovCisJCQl3aGlsZSAoKnApIHsKKwkJCQlpZiAoKnAgPCAnICcgfHwgKnAgPiAxMjYpCisJCQkJCSpwID0gJ14nOworCQkJCXArKzsKKwkJCX0KKwkJfQorCQlpZiAoY2hhZGRyKQorCQkJbWVtY3B5KG9sZGVzdC0+bGVhc2VfbWFjLCBjaGFkZHIsIDYpOworCQlvbGRlc3QtPmxlYXNlX25pcCA9IHlpYWRkcjsKKwkJb2xkZXN0LT5leHBpcmVzID0gdGltZShOVUxMKSArIGxlYXNldGltZTsKKwl9CisKKwlyZXR1cm4gb2xkZXN0OworfQorCisvKiBUcnVlIGlmIGEgbGVhc2UgaGFzIGV4cGlyZWQgKi8KK2ludCBGQVNUX0ZVTkMgaXNfZXhwaXJlZF9sZWFzZShzdHJ1Y3QgZHluX2xlYXNlICpsZWFzZSkKK3sKKwlyZXR1cm4gKGxlYXNlLT5leHBpcmVzIDwgKGxlYXNldGltZV90KSB0aW1lKE5VTEwpKTsKK30KKworLyogRmluZCB0aGUgZmlyc3QgbGVhc2UgdGhhdCBtYXRjaGVzIE1BQywgTlVMTCBpZiBubyBtYXRjaCAqLworc3RydWN0IGR5bl9sZWFzZSogRkFTVF9GVU5DIGZpbmRfbGVhc2VfYnlfbWFjKGNvbnN0IHVpbnQ4X3QgKm1hYykKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IHNlcnZlcl9jb25maWcubWF4X2xlYXNlczsgaSsrKQorCQlpZiAobWVtY21wKGdfbGVhc2VzW2ldLmxlYXNlX21hYywgbWFjLCA2KSA9PSAwKQorCQkJcmV0dXJuICZnX2xlYXNlc1tpXTsKKworCXJldHVybiBOVUxMOworfQorCisvKiBGaW5kIHRoZSBmaXJzdCBsZWFzZSB0aGF0IG1hdGNoZXMgSVAsIE5VTEwgaXMgbm8gbWF0Y2ggKi8KK3N0cnVjdCBkeW5fbGVhc2UqIEZBU1RfRlVOQyBmaW5kX2xlYXNlX2J5X25pcCh1aW50MzJfdCBuaXApCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXM7IGkrKykKKwkJaWYgKGdfbGVhc2VzW2ldLmxlYXNlX25pcCA9PSBuaXApCisJCQlyZXR1cm4gJmdfbGVhc2VzW2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBJUCBpcyB0YWtlbjsgaWYgaXQgaXMsIGFkZCBpdCB0byB0aGUgbGVhc2UgdGFibGUgKi8KK3N0YXRpYyBpbnQgbm9ib2R5X3Jlc3BvbmRzX3RvX2FycCh1aW50MzJfdCBuaXAsIGNvbnN0IHVpbnQ4X3QgKnNhZmVfbWFjKQoreworCXN0cnVjdCBpbl9hZGRyIHRlbXA7CisJaW50IHI7CisKKwlyID0gYXJwcGluZyhuaXAsIHNhZmVfbWFjLAorCQkJc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwLAorCQkJc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbWFjLAorCQkJc2VydmVyX2NvbmZpZy5pbnRlcmZhY2UpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXRlbXAuc19hZGRyID0gbmlwOworCWJiX2luZm9fbXNnKCIlcyBiZWxvbmdzIHRvIHNvbWVvbmUsIHJlc2VydmluZyBpdCBmb3IgJXUgc2Vjb25kcyIsCisJCWluZXRfbnRvYSh0ZW1wKSwgKHVuc2lnbmVkKXNlcnZlcl9jb25maWcuY29uZmxpY3RfdGltZSk7CisJYWRkX2xlYXNlKE5VTEwsIG5pcCwgc2VydmVyX2NvbmZpZy5jb25mbGljdF90aW1lLCBOVUxMLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmluZCBhIG5ldyB1c2FibGUgKHdlIHRoaW5rKSBhZGRyZXNzICovCit1aW50MzJfdCBGQVNUX0ZVTkMgZmluZF9mcmVlX29yX2V4cGlyZWRfbmlwKGNvbnN0IHVpbnQ4X3QgKnNhZmVfbWFjKQoreworCXVpbnQzMl90IGFkZHI7CisJc3RydWN0IGR5bl9sZWFzZSAqb2xkZXN0X2xlYXNlID0gTlVMTDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQworCXVpbnQzMl90IHN0b3A7CisJdW5zaWduZWQgaSwgaGFzaDsKKworCS8qIGhhc2ggaHdhZGRyOiB1c2UgdGhlIFNEQk0gaGFzaGluZyBhbGdvcml0aG0uICBTZWVtcyB0byBnaXZlIGdvb2QKKwkgKiBkaXNwZXJzYWwgZXZlbiB3aXRoIHNpbWlsYXJseS12YWx1ZWQgInN0cmluZ3MiLgorCSAqLworCWhhc2ggPSAwOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWhhc2ggKz0gc2FmZV9tYWNbaV0gKyAoaGFzaCA8PCA2KSArIChoYXNoIDw8IDE2KSAtIGhhc2g7CisKKwkvKiBwaWNrIGEgc2VlZCBiYXNlZCBvbiBod2FkZHIgdGhlbiBpdGVyYXRlIHVudGlsIHdlIGZpbmQgYSBmcmVlIGFkZHJlc3MuICovCisJYWRkciA9IHNlcnZlcl9jb25maWcuc3RhcnRfaXAKKwkJKyAoaGFzaCAlICgxICsgc2VydmVyX2NvbmZpZy5lbmRfaXAgLSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwKSk7CisJc3RvcCA9IGFkZHI7CisjZWxzZQorCWFkZHIgPSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwOworI2RlZmluZSBzdG9wIChzZXJ2ZXJfY29uZmlnLmVuZF9pcCArIDEpCisjZW5kaWYKKwlkbyB7CisJCXVpbnQzMl90IG5pcDsKKwkJc3RydWN0IGR5bl9sZWFzZSAqbGVhc2U7CisKKwkJLyogaWUsIDE5Mi4xNjguNTUuMCAqLworCQlpZiAoKGFkZHIgJiAweGZmKSA9PSAwKQorCQkJZ290byBuZXh0X2FkZHI7CisJCS8qIGllLCAxOTIuMTY4LjU1LjI1NSAqLworCQlpZiAoKGFkZHIgJiAweGZmKSA9PSAweGZmKQorCQkJZ290byBuZXh0X2FkZHI7CisJCW5pcCA9IGh0b25sKGFkZHIpOworCQkvKiBza2lwIG91ciBvd24gYWRkcmVzcyAqLworCQlpZiAobmlwID09IHNlcnZlcl9jb25maWcuc2VydmVyX25pcCkKKwkJCWdvdG8gbmV4dF9hZGRyOworCQkvKiBpcyB0aGlzIGEgc3RhdGljIGxlYXNlIGFkZHI/ICovCisJCWlmIChpc19uaXBfcmVzZXJ2ZWQoc2VydmVyX2NvbmZpZy5zdGF0aWNfbGVhc2VzLCBuaXApKQorCQkJZ290byBuZXh0X2FkZHI7CisKKwkJbGVhc2UgPSBmaW5kX2xlYXNlX2J5X25pcChuaXApOworCQlpZiAoIWxlYXNlKSB7CisvL1RPRE86IERIQ1Agc2VydmVycyBkbyBub3QgYWx3YXlzIHNpdCBvbiB0aGUgc2FtZSBzdWJuZXQgYXMgY2xpZW50czogc2hvdWxkICpwaW5nKiwgbm90IGFycC1waW5nIQorCQkJaWYgKG5vYm9keV9yZXNwb25kc190b19hcnAobmlwLCBzYWZlX21hYykpCisJCQkJcmV0dXJuIG5pcDsKKwkJfSBlbHNlIHsKKwkJCWlmICghb2xkZXN0X2xlYXNlIHx8IGxlYXNlLT5leHBpcmVzIDwgb2xkZXN0X2xlYXNlLT5leHBpcmVzKQorCQkJCW9sZGVzdF9sZWFzZSA9IGxlYXNlOworCQl9CisKKyBuZXh0X2FkZHI6CisJCWFkZHIrKzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUERfQkFTRV9JUF9PTl9NQUMKKwkJaWYgKGFkZHIgPiBzZXJ2ZXJfY29uZmlnLmVuZF9pcCkKKwkJCWFkZHIgPSBzZXJ2ZXJfY29uZmlnLnN0YXJ0X2lwOworI2VuZGlmCisJfSB3aGlsZSAoYWRkciAhPSBzdG9wKTsKKworCWlmIChvbGRlc3RfbGVhc2UKKwkgJiYgaXNfZXhwaXJlZF9sZWFzZShvbGRlc3RfbGVhc2UpCisJICYmIG5vYm9keV9yZXNwb25kc190b19hcnAob2xkZXN0X2xlYXNlLT5sZWFzZV9uaXAsIHNhZmVfbWFjKQorCSkgeworCQlyZXR1cm4gb2xkZXN0X2xlYXNlLT5sZWFzZV9uaXA7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL3BhY2tldC5jIGIvbmV0d29ya2luZy91ZGhjcC9wYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI0MmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9wYWNrZXQuYwpAQCAtMCwwICsxLDI4NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUGFja2V0IG9wcworICoKKyAqIFJld3JpdGUgYnkgUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gSnVseSAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisKK3ZvaWQgRkFTVF9GVU5DIHVkaGNwX2luaXRfaGVhZGVyKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBjaGFyIHR5cGUpCit7CisJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKCpwYWNrZXQpKTsKKwlwYWNrZXQtPm9wID0gQk9PVFJFUVVFU1Q7IC8qIGlmIGNsaWVudCB0byBhIHNlcnZlciAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgREhDUE9GRkVSOgorCWNhc2UgREhDUEFDSzoKKwljYXNlIERIQ1BOQUs6CisJCXBhY2tldC0+b3AgPSBCT09UUkVQTFk7IC8qIGlmIHNlcnZlciB0byBjbGllbnQgKi8KKwl9CisJcGFja2V0LT5odHlwZSA9IDE7IC8qIGV0aGVybmV0ICovCisJcGFja2V0LT5obGVuID0gNjsKKwlwYWNrZXQtPmNvb2tpZSA9IGh0b25sKERIQ1BfTUFHSUMpOworCWlmIChESENQX0VORCAhPSAwKQorCQlwYWNrZXQtPm9wdGlvbnNbMF0gPSBESENQX0VORDsKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbihwYWNrZXQsIERIQ1BfTUVTU0FHRV9UWVBFLCB0eXBlKTsKK30KKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAyCit2b2lkIEZBU1RfRlVOQyB1ZGhjcF9kdW1wX3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCkKK3sKKwljaGFyIGJ1ZltzaXplb2YocGFja2V0LT5jaGFkZHIpKjIgKyAxXTsKKworCWlmIChkaGNwX3ZlcmJvc2UgPCAyKQorCQlyZXR1cm47CisKKwliYl9pbmZvX21zZygKKwkJLy8iIG9wICV4IgorCQkvLyIgaHR5cGUgJXgiCisJCSIgaGxlbiAleCIKKwkJLy8iIGhvcHMgJXgiCisJCSIgeGlkICV4IgorCQkvLyIgc2VjcyAleCIKKwkJLy8iIGZsYWdzICV4IgorCQkiIGNpYWRkciAleCIKKwkJIiB5aWFkZHIgJXgiCisJCSIgc2lhZGRyICV4IgorCQkiIGdpYWRkciAleCIKKwkJLy8iIGNoYWRkciAlcyIKKwkJLy8iIHNuYW1lICVzIgorCQkvLyIgZmlsZSAlcyIKKwkJLy8iIGNvb2tpZSAleCIKKwkJLy8iIG9wdGlvbnMgJXMiCisJCS8vLCBwYWNrZXQtPm9wCisJCS8vLCBwYWNrZXQtPmh0eXBlCisJCSwgcGFja2V0LT5obGVuCisJCS8vLCBwYWNrZXQtPmhvcHMKKwkJLCBwYWNrZXQtPnhpZAorCQkvLywgcGFja2V0LT5zZWNzCisJCS8vLCBwYWNrZXQtPmZsYWdzCisJCSwgcGFja2V0LT5jaWFkZHIKKwkJLCBwYWNrZXQtPnlpYWRkcgorCQksIHBhY2tldC0+c2lhZGRyX25pcAorCQksIHBhY2tldC0+Z2F0ZXdheV9uaXAKKwkJLy8sIHBhY2tldC0+Y2hhZGRyWzE2XQorCQkvLywgcGFja2V0LT5zbmFtZVs2NF0KKwkJLy8sIHBhY2tldC0+ZmlsZVsxMjhdCisJCS8vLCBwYWNrZXQtPmNvb2tpZQorCQkvLywgcGFja2V0LT5vcHRpb25zW10KKwkpOworCSpiaW4yaGV4KGJ1ZiwgKHZvaWQgKikgcGFja2V0LT5jaGFkZHIsIHNpemVvZihwYWNrZXQtPmNoYWRkcikpID0gJ1wwJzsKKwliYl9pbmZvX21zZygiIGNoYWRkciAlcyIsIGJ1Zik7Cit9CisjZW5kaWYKKworLyogUmVhZCBhIHBhY2tldCBmcm9tIHNvY2tldCBmZCwgcmV0dXJuIC0xIG9uIHJlYWQgZXJyb3IsIC0yIG9uIHBhY2tldCBlcnJvciAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9yZWN2X2tlcm5lbF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGludCBmZCkKK3sKKwlpbnQgYnl0ZXM7CisJdW5zaWduZWQgY2hhciAqdmVuZG9yOworCisJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKCpwYWNrZXQpKTsKKwlieXRlcyA9IHNhZmVfcmVhZChmZCwgcGFja2V0LCBzaXplb2YoKnBhY2tldCkpOworCWlmIChieXRlcyA8IDApIHsKKwkJbG9nMSgiUGFja2V0IHJlYWQgZXJyb3IsIGlnbm9yaW5nIik7CisJCXJldHVybiBieXRlczsgLyogcmV0dXJucyAtMSAqLworCX0KKworCWlmIChwYWNrZXQtPmNvb2tpZSAhPSBodG9ubChESENQX01BR0lDKSkgeworCQliYl9pbmZvX21zZygiUGFja2V0IHdpdGggYmFkIG1hZ2ljLCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorCWxvZzEoIlJlY2VpdmVkIGEgcGFja2V0Iik7CisJdWRoY3BfZHVtcF9wYWNrZXQocGFja2V0KTsKKworCWlmIChwYWNrZXQtPm9wID09IEJPT1RSRVFVRVNUKSB7CisJCXZlbmRvciA9IHVkaGNwX2dldF9vcHRpb24ocGFja2V0LCBESENQX1ZFTkRPUik7CisJCWlmICh2ZW5kb3IpIHsKKyNpZiAwCisJCQlzdGF0aWMgY29uc3QgY2hhciBicm9rZW5fdmVuZG9yc1tdWzhdID0geworCQkJCSJNU0ZUIDk4IiwKKwkJCQkiIgorCQkJfTsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgYnJva2VuX3ZlbmRvcnNbaV1bMF07IGkrKykgeworCQkJCWlmICh2ZW5kb3JbT1BUX0xFTiAtIE9QVF9EQVRBXSA9PSAodWludDhfdClzdHJsZW4oYnJva2VuX3ZlbmRvcnNbaV0pCisJCQkJICYmIHN0cm5jbXAoKGNoYXIqKXZlbmRvciwgYnJva2VuX3ZlbmRvcnNbaV0sIHZlbmRvcltPUFRfTEVOIC0gT1BUX0RBVEFdKSA9PSAwCisJCQkJKSB7CisJCQkJCWxvZzEoIkJyb2tlbiBjbGllbnQgKCVzKSwgZm9yY2luZyBicm9hZGNhc3QgcmVwbGllcyIsCisJCQkJCQlicm9rZW5fdmVuZG9yc1tpXSk7CisJCQkJCXBhY2tldC0+ZmxhZ3MgfD0gaHRvbnMoQlJPQURDQVNUX0ZMQUcpOworCQkJCX0KKwkJCX0KKyNlbHNlCisJCQlpZiAodmVuZG9yW09QVF9MRU4gLSBPUFRfREFUQV0gPT0gKHVpbnQ4X3QpKHNpemVvZigiTVNGVCA5OCIpLTEpCisJCQkgJiYgbWVtY21wKHZlbmRvciwgIk1TRlQgOTgiLCBzaXplb2YoIk1TRlQgOTgiKS0xKSA9PSAwCisJCQkpIHsKKwkJCQlsb2cxKCJCcm9rZW4gY2xpZW50ICglcyksIGZvcmNpbmcgYnJvYWRjYXN0IHJlcGxpZXMiLCAiTVNGVCA5OCIpOworCQkJCXBhY2tldC0+ZmxhZ3MgfD0gaHRvbnMoQlJPQURDQVNUX0ZMQUcpOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3VpbnQxNl90IEZBU1RfRlVOQyB1ZGhjcF9jaGVja3N1bSh2b2lkICphZGRyLCBpbnQgY291bnQpCit7CisJLyogQ29tcHV0ZSBJbnRlcm5ldCBDaGVja3N1bSBmb3IgImNvdW50IiBieXRlcworCSAqIGJlZ2lubmluZyBhdCBsb2NhdGlvbiAiYWRkciIuCisJICovCisJaW50MzJfdCBzdW0gPSAwOworCXVpbnQxNl90ICpzb3VyY2UgPSAodWludDE2X3QgKikgYWRkcjsKKworCXdoaWxlIChjb3VudCA+IDEpICB7CisJCS8qICBUaGlzIGlzIHRoZSBpbm5lciBsb29wICovCisJCXN1bSArPSAqc291cmNlKys7CisJCWNvdW50IC09IDI7CisJfQorCisJLyogIEFkZCBsZWZ0LW92ZXIgYnl0ZSwgaWYgYW55ICovCisJaWYgKGNvdW50ID4gMCkgeworCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbGVmdC1vdmVyIGJ5dGUgaXMgYWRkZWQgY29ycmVjdGx5IGJvdGgKKwkJICogd2l0aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gaG9zdHMgKi8KKwkJdWludDE2X3QgdG1wID0gMDsKKwkJKih1aW50OF90KikmdG1wID0gKih1aW50OF90Kilzb3VyY2U7CisJCXN1bSArPSB0bXA7CisJfQorCS8qICBGb2xkIDMyLWJpdCBzdW0gdG8gMTYgYml0cyAqLworCXdoaWxlIChzdW0gPj4gMTYpCisJCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7CisKKwlyZXR1cm4gfnN1bTsKK30KKworLyogQ29uc3RydWN0IGEgaXAvdWRwIGhlYWRlciBmb3IgYSBwYWNrZXQsIHNlbmQgcGFja2V0ICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX3NlbmRfcmF3X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LAorCQl1aW50MzJfdCBzb3VyY2VfbmlwLCBpbnQgc291cmNlX3BvcnQsCisJCXVpbnQzMl90IGRlc3RfbmlwLCBpbnQgZGVzdF9wb3J0LCBjb25zdCB1aW50OF90ICpkZXN0X2FycCwKKwkJaW50IGlmaW5kZXgpCit7CisJc3RydWN0IHNvY2thZGRyX2xsIGRlc3Rfc2xsOworCXN0cnVjdCBpcF91ZHBfZGhjcF9wYWNrZXQgcGFja2V0OworCXVuc2lnbmVkIHBhZGRpbmc7CisJaW50IGZkOworCWludCByZXN1bHQgPSAtMTsKKwljb25zdCBjaGFyICptc2c7CisKKwlmZCA9IHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zKEVUSF9QX0lQKSk7CisJaWYgKGZkIDwgMCkgeworCQltc2cgPSAic29ja2V0KCVzKSI7CisJCWdvdG8gcmV0X21zZzsKKwl9CisKKwltZW1zZXQoJmRlc3Rfc2xsLCAwLCBzaXplb2YoZGVzdF9zbGwpKTsKKwltZW1zZXQoJnBhY2tldCwgMCwgb2Zmc2V0b2Yoc3RydWN0IGlwX3VkcF9kaGNwX3BhY2tldCwgZGF0YSkpOworCXBhY2tldC5kYXRhID0gKmRoY3BfcGt0OyAvKiBzdHJ1Y3QgY29weSAqLworCisJZGVzdF9zbGwuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwlkZXN0X3NsbC5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJZGVzdF9zbGwuc2xsX2lmaW5kZXggPSBpZmluZGV4OworCWRlc3Rfc2xsLnNsbF9oYWxlbiA9IDY7CisJbWVtY3B5KGRlc3Rfc2xsLnNsbF9hZGRyLCBkZXN0X2FycCwgNik7CisKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZkZXN0X3NsbCwgc2l6ZW9mKGRlc3Rfc2xsKSkgPCAwKSB7CisJCW1zZyA9ICJiaW5kKCVzKSI7CisJCWdvdG8gcmV0X2Nsb3NlOworCX0KKworCS8qIFdlIHdlcmUgc2VuZGluZyBmdWxsLXNpemVkIERIQ1AgcGFja2V0cyAoemVybyBwYWRkZWQpLAorCSAqIGJ1dCBzb21lIGJhZGx5IGNvbmZpZ3VyZWQgc2VydmVycyB3ZXJlIHNlZW4gZHJvcHBpbmcgdGhlbS4KKwkgKiBBcHBhcmVudGx5IHRoZXkgZHJvcCBhbGwgREhDUCBwYWNrZXRzID41NzYgKmV0aGVybmV0KiBvY3RldHMgYmlnLAorCSAqIHdoZXJlYXMgdGhleSBtYXkgb25seSBkcm9wIHBhY2tldHMgPjU3NiAqSVAqIG9jdGV0cyBiaWcKKwkgKiAod2hpY2ggZm9yIHR5cGljYWwgRXRoZXJuZXQgSUkgbWVhbnMgNTkwIG9jdGV0czogNis2KzIgKyA1NzYpLgorCSAqCisJICogSW4gb3JkZXIgdG8gd29yayB3aXRoIHRob3NlIGJ1Z2d5IHNlcnZlcnMsCisJICogd2UgdHJ1bmNhdGUgcGFja2V0cyBhZnRlciBlbmQgb3B0aW9uIGJ5dGUuCisJICovCisJcGFkZGluZyA9IERIQ1BfT1BUSU9OU19CVUZTSVpFIC0gMSAtIHVkaGNwX2VuZF9vcHRpb24ocGFja2V0LmRhdGEub3B0aW9ucyk7CisKKwlwYWNrZXQuaXAucHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKwlwYWNrZXQuaXAuc2FkZHIgPSBzb3VyY2VfbmlwOworCXBhY2tldC5pcC5kYWRkciA9IGRlc3RfbmlwOworCXBhY2tldC51ZHAuc291cmNlID0gaHRvbnMoc291cmNlX3BvcnQpOworCXBhY2tldC51ZHAuZGVzdCA9IGh0b25zKGRlc3RfcG9ydCk7CisJLyogc2l6ZSwgZXhjbHVkaW5nIElQIGhlYWRlcjogKi8KKwlwYWNrZXQudWRwLmxlbiA9IGh0b25zKFVEUF9ESENQX1NJWkUgLSBwYWRkaW5nKTsKKwkvKiBmb3IgVURQIGNoZWNrc3VtbWluZywgaXAubGVuIGlzIHNldCB0byBVRFAgcGFja2V0IGxlbiAqLworCXBhY2tldC5pcC50b3RfbGVuID0gcGFja2V0LnVkcC5sZW47CisJcGFja2V0LnVkcC5jaGVjayA9IHVkaGNwX2NoZWNrc3VtKCZwYWNrZXQsIElQX1VEUF9ESENQX1NJWkUgLSBwYWRkaW5nKTsKKwkvKiBidXQgZm9yIHNlbmRpbmcsIGl0IGlzIHNldCB0byBJUCBwYWNrZXQgbGVuICovCisJcGFja2V0LmlwLnRvdF9sZW4gPSBodG9ucyhJUF9VRFBfREhDUF9TSVpFIC0gcGFkZGluZyk7CisJcGFja2V0LmlwLmlobCA9IHNpemVvZihwYWNrZXQuaXApID4+IDI7CisJcGFja2V0LmlwLnZlcnNpb24gPSBJUFZFUlNJT047CisJcGFja2V0LmlwLnR0bCA9IElQREVGVFRMOworCXBhY2tldC5pcC5jaGVjayA9IHVkaGNwX2NoZWNrc3VtKCZwYWNrZXQuaXAsIHNpemVvZihwYWNrZXQuaXApKTsKKworCXVkaGNwX2R1bXBfcGFja2V0KGRoY3BfcGt0KTsKKwlyZXN1bHQgPSBzZW5kdG8oZmQsICZwYWNrZXQsIElQX1VEUF9ESENQX1NJWkUgLSBwYWRkaW5nLCAvKmZsYWdzOiovIDAsCisJCQkoc3RydWN0IHNvY2thZGRyICopICZkZXN0X3NsbCwgc2l6ZW9mKGRlc3Rfc2xsKSk7CisJbXNnID0gInNlbmR0byI7CisgcmV0X2Nsb3NlOgorCWNsb3NlKGZkKTsKKwlpZiAocmVzdWx0IDwgMCkgeworIHJldF9tc2c6CisJCWJiX3BlcnJvcl9tc2cobXNnLCAiUEFDS0VUIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIExldCB0aGUga2VybmVsIGRvIGFsbCB0aGUgd29yayBmb3IgcGFja2V0IGdlbmVyYXRpb24gKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc2VuZF9rZXJuZWxfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsCisJCXVpbnQzMl90IHNvdXJjZV9uaXAsIGludCBzb3VyY2VfcG9ydCwKKwkJdWludDMyX3QgZGVzdF9uaXAsIGludCBkZXN0X3BvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGNsaWVudDsKKwl1bnNpZ25lZCBwYWRkaW5nOworCWludCBmZDsKKwlpbnQgcmVzdWx0ID0gLTE7CisJY29uc3QgY2hhciAqbXNnOworCisJZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChmZCA8IDApIHsKKwkJbXNnID0gInNvY2tldCglcykiOworCQlnb3RvIHJldF9tc2c7CisJfQorCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKworCW1lbXNldCgmY2xpZW50LCAwLCBzaXplb2YoY2xpZW50KSk7CisJY2xpZW50LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWNsaWVudC5zaW5fcG9ydCA9IGh0b25zKHNvdXJjZV9wb3J0KTsKKwljbGllbnQuc2luX2FkZHIuc19hZGRyID0gc291cmNlX25pcDsKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGllbnQsIHNpemVvZihjbGllbnQpKSA9PSAtMSkgeworCQltc2cgPSAiYmluZCglcykiOworCQlnb3RvIHJldF9jbG9zZTsKKwl9CisKKwltZW1zZXQoJmNsaWVudCwgMCwgc2l6ZW9mKGNsaWVudCkpOworCWNsaWVudC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwljbGllbnQuc2luX3BvcnQgPSBodG9ucyhkZXN0X3BvcnQpOworCWNsaWVudC5zaW5fYWRkci5zX2FkZHIgPSBkZXN0X25pcDsKKwlpZiAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGllbnQsIHNpemVvZihjbGllbnQpKSA9PSAtMSkgeworCQltc2cgPSAiY29ubmVjdCI7CisJCWdvdG8gcmV0X2Nsb3NlOworCX0KKworCXVkaGNwX2R1bXBfcGFja2V0KGRoY3BfcGt0KTsKKworCXBhZGRpbmcgPSBESENQX09QVElPTlNfQlVGU0laRSAtIDEgLSB1ZGhjcF9lbmRfb3B0aW9uKGRoY3BfcGt0LT5vcHRpb25zKTsKKwlyZXN1bHQgPSBzYWZlX3dyaXRlKGZkLCBkaGNwX3BrdCwgREhDUF9TSVpFIC0gcGFkZGluZyk7CisJbXNnID0gIndyaXRlIjsKKyByZXRfY2xvc2U6CisJY2xvc2UoZmQpOworCWlmIChyZXN1bHQgPCAwKSB7CisgcmV0X21zZzoKKwkJYmJfcGVycm9yX21zZyhtc2csICJVRFAiKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3Avc2lnbmFscGlwZS5jIGIvbmV0d29ya2luZy91ZGhjcC9zaWduYWxwaXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3Avc2lnbmFscGlwZS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNpZ25hbCBwaXBlIGluZnJhc3RydWN0dXJlLiBBIHJlbGlhYmxlIHdheSBvZiBkZWxpdmVyaW5nIHNpZ25hbHMuCisgKgorICogUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gRGVjZW1iZXIgMjAwMworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qIEdsb2JhbCB2YXJpYWJsZTogd2UgYWNjZXNzIGl0IGZyb20gc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZmRfcGFpciBzaWduYWxfcGlwZTsKKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoID0gc2lnOyAvKiB1c2UgY2hhciwgYXZvaWQgZGVhbGluZyB3aXRoIHBhcnRpYWwgd3JpdGVzICovCisJaWYgKHdyaXRlKHNpZ25hbF9waXBlLndyLCAmY2gsIDEpICE9IDEpCisJCWJiX3BlcnJvcl9tc2coImNhbid0IHNlbmQgc2lnbmFsIik7Cit9CisKKy8qIENhbGwgdGhpcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gU2V0cyB1cCB0aGUgc29ja2V0IHBhaXIKKyAqIGFuZCBpbnN0YWxscyB0aGUgc2lnbmFsIGhhbmRsZXIgKi8KK3ZvaWQgRkFTVF9GVU5DIHVkaGNwX3NwX3NldHVwKHZvaWQpCit7CisJLyogd2FzIHNvY2tldHBhaXIsIGJ1dCBpdCBuZWVkcyBBRl9VTklYIGluIGtlcm5lbCAqLworCXhwaXBlZF9wYWlyKHNpZ25hbF9waXBlKTsKKwljbG9zZV9vbl9leGVjX29uKHNpZ25hbF9waXBlLnJkKTsKKwljbG9zZV9vbl9leGVjX29uKHNpZ25hbF9waXBlLndyKTsKKwluZGVsYXlfb24oc2lnbmFsX3BpcGUud3IpOworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR1VTUjEpCisJCSsgKDEgPDwgU0lHVVNSMikKKwkJKyAoMSA8PCBTSUdURVJNKQorCQksIHNpZ25hbF9oYW5kbGVyKTsKK30KKworLyogUXVpY2sgbGl0dGxlIGZ1bmN0aW9uIHRvIHNldHVwIHRoZSByZmRzLiBXaWxsIHJldHVybiB0aGUKKyAqIG1heF9mZCBmb3IgdXNlIHdpdGggc2VsZWN0LiBMaW1pdGVkIGluIHRoYXQgeW91IGNhbiBvbmx5IHBhc3MKKyAqIG9uZSBleHRyYSBmZCAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9zcF9mZF9zZXQoZmRfc2V0ICpyZmRzLCBpbnQgZXh0cmFfZmQpCit7CisJRkRfWkVSTyhyZmRzKTsKKwlGRF9TRVQoc2lnbmFsX3BpcGUucmQsIHJmZHMpOworCWlmIChleHRyYV9mZCA+PSAwKSB7CisJCWNsb3NlX29uX2V4ZWNfb24oZXh0cmFfZmQpOworCQlGRF9TRVQoZXh0cmFfZmQsIHJmZHMpOworCX0KKwlyZXR1cm4gc2lnbmFsX3BpcGUucmQgPiBleHRyYV9mZCA/IHNpZ25hbF9waXBlLnJkIDogZXh0cmFfZmQ7Cit9CisKKy8qIFJlYWQgYSBzaWduYWwgZnJvbSB0aGUgc2lnbmFsIHBpcGUuIFJldHVybnMgMCBpZiB0aGVyZSBpcworICogbm8gc2lnbmFsLCAtMSBvbiBlcnJvciAoYW5kIHNldHMgZXJybm8gYXBwcm9wcmlhdGVseSksIGFuZAorICogeW91ciBzaWduYWwgb24gc3VjY2VzcyAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9zcF9yZWFkKGNvbnN0IGZkX3NldCAqcmZkcykKK3sKKwl1bnNpZ25lZCBjaGFyIHNpZzsKKworCWlmICghRkRfSVNTRVQoc2lnbmFsX3BpcGUucmQsIHJmZHMpKQorCQlyZXR1cm4gMDsKKworCWlmIChzYWZlX3JlYWQoc2lnbmFsX3BpcGUucmQsICZzaWcsIDEpICE9IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiBzaWc7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL3NvY2tldC5jIGIvbmV0d29ya2luZy91ZGhjcC9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTIyMGJhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9zb2NrZXQuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogREhDUCBzZXJ2ZXIgY2xpZW50L3NlcnZlciBzb2NrZXQgY3JlYXRpb24KKyAqCisgKiB1ZGhjcCBjbGllbnQvc2VydmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTWF0dGhldyBSYW1zYXkgPG1hdHRoZXdyQG1vcmV0b24uY29tLmF1PgorICoJCQlDaHJpcyBUcmV3IDxjdHJld0Btb3JldG9uLmNvbS5hdT4KKyAqCisgKiBSZXdyaXRlIGJ5IFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSA8bmV0L2lmLmg+CisKK2ludCBGQVNUX0ZVTkMgdWRoY3BfcmVhZF9pbnRlcmZhY2UoY29uc3QgY2hhciAqaW50ZXJmYWNlLCBpbnQgKmlmaW5kZXgsIHVpbnQzMl90ICpuaXAsIHVpbnQ4X3QgKm1hYykKK3sKKwkvKiBjaGFyIGJ1ZmZlciBpbnN0ZWFkIG9mIGJvbmEtZmlkZSBzdHJ1Y3QgYXZvaWRzIGFsaWFzaW5nIHdhcm5pbmcgKi8KKwljaGFyIGlmcl9idWZbc2l6ZW9mKHN0cnVjdCBpZnJlcSldOworCXN0cnVjdCBpZnJlcSAqY29uc3QgaWZyID0gKHZvaWQgKilpZnJfYnVmOworCisJaW50IGZkOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqb3VyX2lwOworCisJbWVtc2V0KGlmciwgMCwgc2l6ZW9mKCppZnIpKTsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKKworCWlmci0+aWZyX2FkZHIuc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci0+aWZyX25hbWUsIGludGVyZmFjZSk7CisJaWYgKG5pcCkgeworCQlpZiAoaW9jdGxfb3JfcGVycm9yKGZkLCBTSU9DR0lGQUREUiwgaWZyLAorCQkJImlzIGludGVyZmFjZSAlcyB1cCBhbmQgY29uZmlndXJlZD8iLCBpbnRlcmZhY2UpCisJCSkgeworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW91cl9pcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmlmci0+aWZyX2FkZHI7CisJCSpuaXAgPSBvdXJfaXAtPnNpbl9hZGRyLnNfYWRkcjsKKwkJbG9nMSgiSVAgJXMiLCBpbmV0X250b2Eob3VyX2lwLT5zaW5fYWRkcikpOworCX0KKworCWlmIChpZmluZGV4KSB7CisJCWlmIChpb2N0bF9vcl93YXJuKGZkLCBTSU9DR0lGSU5ERVgsIGlmcikgIT0gMCkgeworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWxvZzEoIkFkYXB0ZXIgaW5kZXggJWQiLCBpZnItPmlmcl9pZmluZGV4KTsKKwkJKmlmaW5kZXggPSBpZnItPmlmcl9pZmluZGV4OworCX0KKworCWlmIChtYWMpIHsKKwkJaWYgKGlvY3RsX29yX3dhcm4oZmQsIFNJT0NHSUZIV0FERFIsIGlmcikgIT0gMCkgeworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweShtYWMsIGlmci0+aWZyX2h3YWRkci5zYV9kYXRhLCA2KTsKKwkJbG9nMSgiTUFDICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCX0KKworCWNsb3NlKGZkKTsKKwlyZXR1cm4gMDsKK30KKworLyogMS4gTm9uZSBvZiB0aGUgY2FsbGVycyBleHBlY3RzIGl0IHRvIGV2ZXIgZmFpbCAqLworLyogMi4gaXAgd2FzIGFsd2F5cyBJTkFERFJfQU5ZICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX2xpc3Rlbl9zb2NrZXQoLyp1aW50MzJfdCBpcCwqLyBpbnQgcG9ydCwgY29uc3QgY2hhciAqaW5mKQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKworCWxvZzEoIk9wZW5pbmcgbGlzdGVuIHNvY2tldCBvbiAqOiVkICVzIiwgcG9ydCwgaW5mKTsKKwlmZCA9IHhzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCWlmIChzZXRzb2Nrb3B0X2Jyb2FkY2FzdChmZCkgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU09fQlJPQURDQVNUIik7CisKKwkvKiBOQjogYnVnIDEwMzIgc2F5cyB0aGlzIGRvZXNuJ3Qgd29yayBvbiBldGhlcm5ldCBhbGlhc2VzIChldGhOOk0pICovCisJaWYgKHNldHNvY2tvcHRfYmluZHRvZGV2aWNlKGZkLCBpbmYpKQorCQl4ZnVuY19kaWUoKTsgLyogd2FybmluZyBpcyBhbHJlYWR5IHByaW50ZWQgKi8KKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkvKiBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGlwOyAtIGFsbC16ZXJvcyBpcyBJTkFERFJfQU5ZICovCisJeGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworCXJldHVybiBmZDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3Avc3RhdGljX2xlYXNlcy5jIGIvbmV0d29ya2luZy91ZGhjcC9zdGF0aWNfbGVhc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMjRhYgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3Avc3RhdGljX2xlYXNlcy5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFN0b3JpbmcgYW5kIHJldHJpZXZpbmcgZGF0YSBmb3Igc3RhdGljIGxlYXNlcworICoKKyAqIFdhZGUgQmVycmllciA8d2JlcnJpZXJAbXlyZWFsYm94LmNvbT4gU2VwdGVtYmVyIDIwMDQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKworLyogVGFrZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXRpY19sZWFzZXMgbGlua2VkIGxpc3QsCisgKiBhZGRyZXNzIHRvIGEgNiBieXRlIG1hYyBhZGRyZXNzLAorICogNCBieXRlIElQIGFkZHJlc3MgKi8KK3ZvaWQgRkFTVF9GVU5DIGFkZF9zdGF0aWNfbGVhc2Uoc3RydWN0IHN0YXRpY19sZWFzZSAqKnN0X2xlYXNlX3BwLAorCQl1aW50OF90ICptYWMsCisJCXVpbnQzMl90IG5pcCkKK3sKKwlzdHJ1Y3Qgc3RhdGljX2xlYXNlICpzdF9sZWFzZTsKKworCS8qIEZpbmQgdGhlIHRhaWwgb2YgdGhlIGxpc3QgKi8KKwl3aGlsZSAoKHN0X2xlYXNlID0gKnN0X2xlYXNlX3BwKSAhPSBOVUxMKSB7CisJCXN0X2xlYXNlX3BwID0gJnN0X2xlYXNlLT5uZXh0OworCX0KKworCS8qIEFkZCBuZXcgbm9kZSAqLworCSpzdF9sZWFzZV9wcCA9IHN0X2xlYXNlID0geHphbGxvYyhzaXplb2YoKnN0X2xlYXNlKSk7CisJbWVtY3B5KHN0X2xlYXNlLT5tYWMsIG1hYywgNik7CisJc3RfbGVhc2UtPm5pcCA9IG5pcDsKKwkvKnN0X2xlYXNlLT5uZXh0ID0gTlVMTDsqLworfQorCisvKiBGaW5kIHN0YXRpYyBsZWFzZSBJUCBieSBtYWMgKi8KK3VpbnQzMl90IEZBU1RfRlVOQyBnZXRfc3RhdGljX25pcF9ieV9tYWMoc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2UsIHZvaWQgKm1hYykKK3sKKwl3aGlsZSAoc3RfbGVhc2UpIHsKKwkJaWYgKG1lbWNtcChzdF9sZWFzZS0+bWFjLCBtYWMsIDYpID09IDApCisJCQlyZXR1cm4gc3RfbGVhc2UtPm5pcDsKKwkJc3RfbGVhc2UgPSBzdF9sZWFzZS0+bmV4dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIGFuIElQIGlzIHJlc2VydmVkIGFzIGEgc3RhdGljIElQICovCitpbnQgRkFTVF9GVU5DIGlzX25pcF9yZXNlcnZlZChzdHJ1Y3Qgc3RhdGljX2xlYXNlICpzdF9sZWFzZSwgdWludDMyX3QgbmlwKQoreworCXdoaWxlIChzdF9sZWFzZSkgeworCQlpZiAoc3RfbGVhc2UtPm5pcCA9PSBuaXApCisJCQlyZXR1cm4gMTsKKwkJc3RfbGVhc2UgPSBzdF9sZWFzZS0+bmV4dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAyCisvKiBQcmludCBvdXQgc3RhdGljIGxlYXNlcyBqdXN0IHRvIGNoZWNrIHdoYXQncyBnb2luZyBvbiAqLworLyogVGFrZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXRpY19sZWFzZXMgbGlua2VkIGxpc3QgKi8KK3ZvaWQgRkFTVF9GVU5DIGxvZ19zdGF0aWNfbGVhc2VzKHN0cnVjdCBzdGF0aWNfbGVhc2UgKipzdF9sZWFzZV9wcCkKK3sKKwlzdHJ1Y3Qgc3RhdGljX2xlYXNlICpjdXI7CisKKwlpZiAoZGhjcF92ZXJib3NlIDwgMikKKwkJcmV0dXJuOworCisJY3VyID0gKnN0X2xlYXNlX3BwOworCXdoaWxlIChjdXIpIHsKKwkJYmJfaW5mb19tc2coInN0YXRpYyBsZWFzZTogbWFjOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IG5pcDoleCIsCisJCQljdXItPm1hY1swXSwgY3VyLT5tYWNbMV0sIGN1ci0+bWFjWzJdLAorCQkJY3VyLT5tYWNbM10sIGN1ci0+bWFjWzRdLCBjdXItPm1hY1s1XSwKKwkJCWN1ci0+bmlwCisJCSk7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdmNvbmZpZy5jIGIvbmV0d29ya2luZy92Y29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiNDVkOQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdmNvbmZpZy5jCkBAIC0wLDAgKzEsMTczIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB2Y29uZmlnIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgKi8KKworLy91c2FnZTojZGVmaW5lIHZjb25maWdfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkNPTU1BTkQgW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIHZjb25maWdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgYW5kIHJlbW92ZSB2aXJ0dWFsIGV0aGVybmV0IGRldmljZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JYWRkCQlbaW50ZXJmYWNlLW5hbWVdIFt2bGFuX2lkXSIKKy8vdXNhZ2U6ICAgICAiXG4JcmVtCQlbdmxhbi1uYW1lXSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0X2ZsYWcJW2ludGVyZmFjZS1uYW1lXSBbZmxhZy1udW1dIFswIHwgMV0iCisvL3VzYWdlOiAgICAgIlxuCXNldF9lZ3Jlc3NfbWFwCVt2bGFuLW5hbWVdIFtza2JfcHJpb3JpdHldIFt2bGFuX3Fvc10iCisvL3VzYWdlOiAgICAgIlxuCXNldF9pbmdyZXNzX21hcAlbdmxhbi1uYW1lXSBbc2tiX3ByaW9yaXR5XSBbdmxhbl9xb3NdIgorLy91c2FnZTogICAgICJcbglzZXRfbmFtZV90eXBlCVtuYW1lLXR5cGVdIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworLyogU3R1ZmYgZnJvbSBsaW51eC9pZl92bGFuLmgsIGtlcm5lbCB2ZXJzaW9uIDIuNC4yMyAqLworZW51bSB2bGFuX2lvY3RsX2NtZHMgeworCUFERF9WTEFOX0NNRCwKKwlERUxfVkxBTl9DTUQsCisJU0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsCisJU0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRCwKKwlHRVRfVkxBTl9JTkdSRVNTX1BSSU9SSVRZX0NNRCwKKwlHRVRfVkxBTl9FR1JFU1NfUFJJT1JJVFlfQ01ELAorCVNFVF9WTEFOX05BTUVfVFlQRV9DTUQsCisJU0VUX1ZMQU5fRkxBR19DTUQKK307CitlbnVtIHZsYW5fbmFtZV90eXBlcyB7CisJVkxBTl9OQU1FX1RZUEVfUExVU19WSUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICB2bGFuMDAwNSAqLworCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRCwgLyogbmFtZSB3aWxsIGxvb2sgbGlrZTogIGV0aDEuMDAwNSAqLworCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklEX05PX1BBRCwgLyogTmFtZSB3aWxsIGxvb2sgbGlrZTogIHZsYW41ICovCisJVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklEX05PX1BBRCwgLyogTmFtZSB3aWxsIGxvb2sgbGlrZTogIGV0aDAuNSAqLworCVZMQU5fTkFNRV9UWVBFX0hJR0hFU1QKK307CisKK3N0cnVjdCB2bGFuX2lvY3RsX2FyZ3MgeworCWludCBjbWQ7IC8qIFNob3VsZCBiZSBvbmUgb2YgdGhlIHZsYW5faW9jdGxfY21kcyBlbnVtIGFib3ZlLiAqLworCWNoYXIgZGV2aWNlMVsyNF07CisKKwl1bmlvbiB7CisJCWNoYXIgZGV2aWNlMlsyNF07CisJCWludCBWSUQ7CisJCXVuc2lnbmVkIGludCBza2JfcHJpb3JpdHk7CisJCXVuc2lnbmVkIGludCBuYW1lX3R5cGU7CisJCXVuc2lnbmVkIGludCBiaW5kX3R5cGU7CisJCXVuc2lnbmVkIGludCBmbGFnOyAvKiBNYXRjaGVzIHZsYW5fZGV2X2luZm8gZmxhZ3MgKi8KKwl9IHU7CisKKwlzaG9ydCB2bGFuX3FvczsKK307CisKKyNkZWZpbmUgVkxBTl9HUk9VUF9BUlJBWV9MRU4gIDQwOTYKKyNkZWZpbmUgU0lPQ1NJRlZMQU4gICAgICAgICAgIDB4ODk4MyAgLyogU2V0IDgwMi4xUSBWTEFOIG9wdGlvbnMgKi8KKworLyogT24gZW50cnksIHRhYmxlIHBvaW50cyB0byB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHN0cmluZworICogcGx1cyBOVUwgdGVybWluYXRvciBwbHVzIGRhdGEgbGVuZ3RoIGZvciB0aGUgc3Vic2VxdWVudCBlbnRyeS4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxhc3QgZGF0YSBlbnRyeSBmb3IgdGhlIG1hdGNoaW5nIHN0cmluZy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICp4ZmluZF9zdHIoY29uc3QgY2hhciAqdGFibGUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoc3RyY2FzZWNtcChzdHIsIHRhYmxlKzEpICE9IDApIHsKKwkJdGFibGUgKz0gdGFibGVbMF07CisJCWlmICghKnRhYmxlKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisJcmV0dXJuIHRhYmxlIC0gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgY21kc1tdIEFMSUdOMSA9IHsKKwk0LCBBRERfVkxBTl9DTUQsIDcsCisJJ2EnLCAnZCcsICdkJywgMCwKKwkzLCBERUxfVkxBTl9DTUQsIDcsCisJJ3InLCAnZScsICdtJywgMCwKKwkzLCBTRVRfVkxBTl9OQU1FX1RZUEVfQ01ELCAxNywKKwkncycsICdlJywgJ3QnLCAnXycsCisJJ24nLCAnYScsICdtJywgJ2UnLCAnXycsCisJJ3QnLCAneScsICdwJywgJ2UnLCAwLAorCTUsIFNFVF9WTEFOX0ZMQUdfQ01ELCAxMiwKKwkncycsICdlJywgJ3QnLCAnXycsCisJJ2YnLCAnbCcsICdhJywgJ2cnLCAwLAorCTUsIFNFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQsIDE4LAorCSdzJywgJ2UnLCAndCcsICdfJywKKwknZScsICdnJywgJ3InLCAnZScsICdzJywgJ3MnLCAnXycsCisJJ20nLCAnYScsICdwJywgMCwKKwk1LCBTRVRfVkxBTl9JTkdSRVNTX1BSSU9SSVRZX0NNRCwgMTYsCisJJ3MnLCAnZScsICd0JywgJ18nLAorCSdpJywgJ24nLCAnZycsICdyJywgJ2UnLCAncycsICdzJywgJ18nLAorCSdtJywgJ2EnLCAncCcsIDAsCit9OworCitzdGF0aWMgY29uc3QgY2hhciBuYW1lX3R5cGVzW10gQUxJR04xID0geworCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklELCAxNiwKKwknVicsICdMJywgJ0EnLCAnTicsCisJJ18nLCAnUCcsICdMJywgJ1UnLCAnUycsICdfJywgJ1YnLCAnSScsICdEJywKKwkwLAorCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklEX05PX1BBRCwgMjIsCisJJ1YnLCAnTCcsICdBJywgJ04nLAorCSdfJywgJ1AnLCAnTCcsICdVJywgJ1MnLCAnXycsICdWJywgJ0knLCAnRCcsCisJJ18nLCAnTicsICdPJywgJ18nLCAnUCcsICdBJywgJ0QnLCAwLAorCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRCwgMTUsCisJJ0QnLCAnRScsICdWJywKKwknXycsICdQJywgJ0wnLCAnVScsICdTJywgJ18nLCAnVicsICdJJywgJ0QnLAorCTAsCisJVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklEX05PX1BBRCwgMjAsCisJJ0QnLCAnRScsICdWJywKKwknXycsICdQJywgJ0wnLCAnVScsICdTJywgJ18nLCAnVicsICdJJywgJ0QnLAorCSdfJywgJ04nLCAnTycsICdfJywgJ1AnLCAnQScsICdEJywgMCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbmZfZmlsZV9uYW1lW10gQUxJR04xID0gIi9wcm9jL25ldC92bGFuL2NvbmZpZyI7CisKK2ludCB2Y29uZmlnX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB2Y29uZmlnX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB2bGFuX2lvY3RsX2FyZ3MgaWZyOworCWNvbnN0IGNoYXIgKnA7CisJaW50IGZkOworCisJaWYgKGFyZ2MgPCAzKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBEb24ndCBib3RoZXIgY2xvc2luZyB0aGUgZmlsZWRlcy4gIEl0IHdpbGwgYmUgY2xvc2VkIG9uIGNsZWFudXAuICovCisJLyogV2lsbCBkaWUgaWYgODAyLjFxIGlzIG5vdCBwcmVzZW50ICovCisJeG9wZW4oY29uZl9maWxlX25hbWUsIE9fUkRPTkxZKTsKKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisKKwkrK2FyZ3Y7CisJcCA9IHhmaW5kX3N0cihjbWRzKzIsICphcmd2KTsKKwlpZnIuY21kID0gKnA7CisJaWYgKGFyZ2MgIT0gcFstMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChpZnIuY21kID09IFNFVF9WTEFOX05BTUVfVFlQRV9DTUQpIHsgLyogc2V0X25hbWVfdHlwZSAqLworCQlpZnIudS5uYW1lX3R5cGUgPSAqeGZpbmRfc3RyKG5hbWVfdHlwZXMrMSwgYXJndlsxXSk7CisJfSBlbHNlIHsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuZGV2aWNlMSwgYXJndlsxXSk7CisJCXAgPSBhcmd2WzJdOworCisJCS8qIEkgc3VwcG9zZSBvbmUgY291bGQgdHJ5IHRvIGNvbWJpbmUgc29tZSBvZiB0aGUgZnVuY3Rpb24gY2FsbHMgYmVsb3csCisJCSAqIHNpbmNlIGlmci51LmZsYWcsIGlmci51LlZJRCwgYW5kIGlmci51LnNrYl9wcmlvcml0eSBhcmUgYWxsIHNhbWUtc2l6ZWQKKwkJICogKHVuc2lnbmVkKSBpbnQgbWVtYmVycyBvZiBhIHVuaW9ucy4gIEJ1dCBiZWNhdXNlIG9mIHRoZSByYW5nZSBjaGVja2luZywKKwkJICogZG9pbmcgc28gd291bGRuJ3Qgc2F2ZSB0aGF0IG11Y2ggc3BhY2UgYW5kIHdvdWxkIGFsc28gbWFrZSBtYWludGFpbmVuY2UKKwkJICogbW9yZSBvZiBhIHBhaW4uICovCisJCWlmIChpZnIuY21kID09IFNFVF9WTEFOX0ZMQUdfQ01EKSB7IC8qIHNldF9mbGFnICovCisJCQlpZnIudS5mbGFnID0geGF0b3VsX3JhbmdlKHAsIDAsIDEpOworCQkJLyogRE06IGluIG9yZGVyIHRvIHNldCByZW9yZGVyIGhlYWRlciwgcW9zIG11c3QgYmUgc2V0ICovCisJCQlpZnIudmxhbl9xb3MgPSB4YXRvdWxfcmFuZ2UoYXJndlszXSwgMCwgNyk7CisJCX0gZWxzZSBpZiAoaWZyLmNtZCA9PSBBRERfVkxBTl9DTUQpIHsgLyogYWRkICovCisJCQlpZnIudS5WSUQgPSB4YXRvdWxfcmFuZ2UocCwgMCwgVkxBTl9HUk9VUF9BUlJBWV9MRU4tMSk7CisJCX0gZWxzZSBpZiAoaWZyLmNtZCAhPSBERUxfVkxBTl9DTUQpIHsgLyogc2V0X3tlZ3Jlc3N8aW5ncmVzc31fbWFwICovCisJCQlpZnIudS5za2JfcHJpb3JpdHkgPSB4YXRvdShwKTsKKwkJCWlmci52bGFuX3FvcyA9IHhhdG91bF9yYW5nZShhcmd2WzNdLCAwLCA3KTsKKwkJfQorCX0KKworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsIFNJT0NTSUZWTEFOLCAmaWZyLAorCQkJCQkJImlvY3RsIGVycm9yIGZvciAlcyIsICphcmd2KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy93Z2V0LmMgYi9uZXR3b3JraW5nL3dnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI4YTJlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy93Z2V0LmMKQEAgLTAsMCArMSw5NDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdnZXQgLSByZXRyaWV2ZSBhIGZpbGUgdXNpbmcgSFRUUCBvciBGVFAKKyAqCisgKiBDaGlwIFJvc2VudGhhbCBDb3ZhZCBDb21tdW5pY2F0aW9ucyA8Y2hpcEBsYXNlcmxpbmsubmV0PgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQnJhZGxleSBNLiBLdWhuIDxia3VobkBlYmIub3JnPgorICogS3VobidzIGNvcHlyaWdodHMgYXJlIGxpY2Vuc2VkIEdQTHYyLW9yLWxhdGVyLiAgRmlsZSBhcyBhIHdob2xlIHJlbWFpbnMgR1BMdjIuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHdnZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJbLWN8LS1jb250aW51ZV0gWy1zfC0tc3BpZGVyXSBbLXF8LS1xdWlldF0gWy1PfC0tb3V0cHV0LWRvY3VtZW50IEZJTEVdXG4iCisvL3VzYWdlOiAgICAgICAiCVstLWhlYWRlciAnaGVhZGVyOiB2YWx1ZSddIFstWXwtLXByb3h5IG9uL29mZl0gWy1QIERJUl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy0tbm8tY2hlY2stY2VydGlmaWNhdGVdIFstVXwtLXVzZXItYWdlbnQgQUdFTlRdIgorLy91c2FnZToJCQlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgiIFstVCBTRUNdIikgIiBVUkwuLi4iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJbLWNzcV0gWy1PIEZJTEVdIFstWSBvbi9vZmZdIFstUCBESVJdIFstVSBBR0VOVF0iCisvL3VzYWdlOgkJCUlGX0ZFQVRVUkVfV0dFVF9USU1FT1VUKCIgWy1UIFNFQ10iKSAiIFVSTC4uLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSB3Z2V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmV0cmlldmUgZmlsZXMgdmlhIEhUVFAgb3IgRlRQXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVNwaWRlciBtb2RlIC0gb25seSBjaGVjayBmaWxlIGV4aXN0ZW5jZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ29udGludWUgcmV0cmlldmFsIG9mIGFib3J0ZWQgdHJhbnNmZXIiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktUCBESVIJU2F2ZSB0byBESVIgKGRlZmF1bHQgLikiCisvL3VzYWdlOglJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgKKy8vdXNhZ2U6ICAgICAiXG4JLVQgU0VDCU5ldHdvcmsgcmVhZCB0aW1lb3V0IGlzIFNFQyBzZWNvbmRzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTyBGSUxFCVNhdmUgdG8gRklMRSAoJy0nIGZvciBzdGRvdXQpIgorLy91c2FnZTogICAgICJcbgktVSBTVFIJVXNlIFNUUiBmb3IgVXNlci1BZ2VudCBoZWFkZXIiCisvL3VzYWdlOiAgICAgIlxuCS1ZCVVzZSBwcm94eSAoJ29uJyBvciAnb2ZmJykiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvLyNkZWZpbmUgbG9nX2lvKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2RlZmluZSBsb2dfaW8oLi4uKSAoKHZvaWQpMCkKKworCitzdHJ1Y3QgaG9zdF9pbmZvIHsKKwljaGFyICphbGxvY2F0ZWQ7CisJY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCBjaGFyICp1c2VyOworCWNoYXIgICAgICAgKmhvc3Q7CisJaW50ICAgICAgICAgcG9ydDsKKwlzbWFsbGludCAgICBpc19mdHA7Cit9OworCisKKy8qIEdsb2JhbHMgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlvZmZfdCBjb250ZW50X2xlbjsgICAgICAgIC8qIENvbnRlbnQtbGVuZ3RoIG9mIHRoZSBmaWxlICovCisJb2ZmX3QgYmVnX3JhbmdlOyAgICAgICAgICAvKiBSYW5nZSBhdCB3aGljaCBjb250aW51ZSBiZWdpbnMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUgorCW9mZl90IHRyYW5zZmVycmVkOyAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhciAqLworCWNvbnN0IGNoYXIgKmN1cmZpbGU7ICAgICAgLyogTmFtZSBvZiBjdXJyZW50IGZpbGUgYmVpbmcgdHJhbnNmZXJyZWQgKi8KKwliYl9wcm9ncmVzc190IHBtdDsKKyNlbmRpZgorICAgICAgICBjaGFyICpkaXJfcHJlZml4OworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisgICAgICAgIGNoYXIgKnBvc3RfZGF0YTsKKyAgICAgICAgY2hhciAqZXh0cmFfaGVhZGVyczsKKyNlbmRpZgorICAgICAgICBjaGFyICpmbmFtZV9vdXQ7ICAgICAgICAvKiB3aGVyZSB0byBkaXJlY3Qgb3V0cHV0ICgtTykgKi8KKyAgICAgICAgY29uc3QgY2hhciAqcHJveHlfZmxhZzsgLyogVXNlIHByb3hpZXMgaWYgZW52IHZhcnMgYXJlIHNldCAqLworICAgICAgICBjb25zdCBjaGFyICp1c2VyX2FnZW50OyAvKiAiVXNlci1BZ2VudCIgaGVhZGVyIGZpZWxkICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJdW5zaWduZWQgdGltZW91dF9zZWNvbmRzOworI2VuZGlmCisJaW50IG91dHB1dF9mZDsKKwlpbnQgb19mbGFnczsKKwlzbWFsbGludCBjaHVua2VkOyAgICAgICAgIC8qIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgKi8KKwlzbWFsbGludCBnb3RfY2xlbjsgICAgICAgIC8qIGdvdCBjb250ZW50LWxlbmd0aDogZnJvbSBzZXJ2ZXIgICovCisJLyogTG9jYWwgZG93bmxvYWRzIGRvIGJlbmVmaXQgZnJvbSBiaWcgYnVmZmVyLgorCSAqIFdpdGggNTEyIGJ5dGUgYnVmZmVyLCBpdCB3YXMgbWVhc3VyZWQgdG8gYmUKKwkgKiBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2xvd2VyIHRoYW4gd2l0aCBiaWcgb25lLgorCSAqLworCXVpbnQ2NF90IGp1c3RfdG9fYWxpZ25fbmV4dF9tZW1iZXI7CisJY2hhciB3Z2V0X2J1ZltDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCKjEwMjRdOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisgICAgICAgIFNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoRy50aW1lb3V0X3NlY29uZHMgPSA5MDA7KSBcCit9IHdoaWxlICgwKQorCisKKy8qIE11c3QgbWF0Y2ggb3B0aW9uIHN0cmluZyEgKi8KK2VudW0geworCVdHRVRfT1BUX0NPTlRJTlVFICAgPSAoMSA8PCAwKSwKKwlXR0VUX09QVF9TUElERVIgICAgID0gKDEgPDwgMSksCisJV0dFVF9PUFRfUVVJRVQgICAgICA9ICgxIDw8IDIpLAorCVdHRVRfT1BUX09VVE5BTUUgICAgPSAoMSA8PCAzKSwKKwlXR0VUX09QVF9QUkVGSVggICAgID0gKDEgPDwgNCksCisJV0dFVF9PUFRfUFJPWFkgICAgICA9ICgxIDw8IDUpLAorCVdHRVRfT1BUX1VTRVJfQUdFTlQgPSAoMSA8PCA2KSwKKwlXR0VUX09QVF9ORVRXT1JLX1JFQURfVElNRU9VVCA9ICgxIDw8IDcpLAorCVdHRVRfT1BUX1JFVFJJRVMgICAgPSAoMSA8PCA4KSwKKwlXR0VUX09QVF9QQVNTSVZFICAgID0gKDEgPDwgOSksCisJV0dFVF9PUFRfSEVBREVSICAgICA9ICgxIDw8IDEwKSAqIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TLAorCVdHRVRfT1BUX1BPU1RfREFUQSAgPSAoMSA8PCAxMSkgKiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUywKK307CisKK2VudW0geworCVBST0dSRVNTX1NUQVJUID0gLTEsCisJUFJPR1JFU1NfRU5EICAgPSAwLAorCVBST0dSRVNTX0JVTVAgID0gMSwKK307CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIKK3N0YXRpYyB2b2lkIHByb2dyZXNzX21ldGVyKGludCBmbGFnKQoreworCWlmIChvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfUVVJRVQpCisJCXJldHVybjsKKworCWlmIChmbGFnID09IFBST0dSRVNTX1NUQVJUKQorCQliYl9wcm9ncmVzc19pbml0KCZHLnBtdCwgRy5jdXJmaWxlKTsKKworCWJiX3Byb2dyZXNzX3VwZGF0ZSgmRy5wbXQsCisJCQlHLmJlZ19yYW5nZSwKKwkJCUcudHJhbnNmZXJyZWQsCisJCQkoRy5jaHVua2VkIHx8ICFHLmdvdF9jbGVuKSA/IDAgOiBHLmJlZ19yYW5nZSArIEcudHJhbnNmZXJyZWQgKyBHLmNvbnRlbnRfbGVuCisJKTsKKworCWlmIChmbGFnID09IFBST0dSRVNTX0VORCkgeworCQliYl9wcm9ncmVzc19mcmVlKCZHLnBtdCk7CisJCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCQlHLnRyYW5zZmVycmVkID0gMDsKKwl9Cit9CisjZWxzZQorc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBwcm9ncmVzc19tZXRlcihpbnQgZmxhZyBVTlVTRURfUEFSQU0pIHsgfQorI2VuZGlmCisKKworLyogSVB2NiBrbm93cyBzY29wZWQgYWRkcmVzcyB0eXBlcyBpLmUuIGxpbmsgYW5kIHNpdGUgbG9jYWwgYWRkcmVzc2VzLiBMaW5rCisgKiBsb2NhbCBhZGRyZXNzZXMgY2FuIGhhdmUgYSBzY29wZSBpZGVudGlmaWVyIHRvIHNwZWNpZnkgdGhlCisgKiBpbnRlcmZhY2UvbGluayBhbiBhZGRyZXNzIGlzIHZhbGlkIG9uIChlLmcuIGZlODA6OjElZXRoMCkuIFRoaXMgc2NvcGUKKyAqIGlkZW50aWZpZXIgaXMgb25seSB2YWxpZCBvbiBhIHNpbmdsZSBub2RlLgorICoKKyAqIFJGQyA0MDA3IHNheXMgdGhhdCB0aGUgc2NvcGUgaWRlbnRpZmllciBNVVNUIE5PVCBiZSBzZW50IGFjcm9zcyB0aGUgd2lyZSwKKyAqIHVubGVzcyBhbGwgbm9kZXMgYWdyZWUgb24gdGhlIHNlbWFudGljLiBBcGFjaGUgZS5nLiByZWdhcmRzIHpvbmUgaWRlbnRpZmllcnMKKyAqIGluIHRoZSBIb3N0IGhlYWRlciBhcyBpbnZhbGlkIHJlcXVlc3RzLCBzZWUKKyAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1MTIyCisgKi8KK3N0YXRpYyB2b2lkIHN0cmlwX2lwdjZfc2NvcGVfaWQoY2hhciAqaG9zdCkKK3sKKwljaGFyICpzY29wZSwgKmNwOworCisJLyogYmJveCB3Z2V0IGFjdHVhbGx5IGhhbmRsZXMgSVB2NiBhZGRyZXNzZXMgd2l0aG91dCBbXSwgbGlrZQorCSAqIHdnZXQgImh0dHA6Ly86OjEveHh4IiwgYnV0IHRoaXMgaXMgbm90IHN0YW5kYXJkLgorCSAqIFRvIHNhdmUgY29kZSwgX2hlcmVfIHdlIGRvIG5vdCBzdXBwb3J0IGl0LiAqLworCisJaWYgKGhvc3RbMF0gIT0gJ1snKQorCQlyZXR1cm47IC8qIG5vdCBJUHY2ICovCisKKwlzY29wZSA9IHN0cmNocihob3N0LCAnJScpOworCWlmICghc2NvcGUpCisJCXJldHVybjsKKworCS8qIFJlbW92ZSB0aGUgSVB2NiB6b25lIGlkZW50aWZpZXIgZnJvbSB0aGUgaG9zdCBhZGRyZXNzICovCisJY3AgPSBzdHJjaHIoaG9zdCwgJ10nKTsKKwlpZiAoIWNwIHx8IChjcFsxXSAhPSAnOicgJiYgY3BbMV0gIT0gJ1wwJykpIHsKKwkJLyogbWFsZm9ybWVkIGFkZHJlc3MgKG5vdCAiW3h4XTpubiIgb3IgIlt4eF0iKSAqLworCQlyZXR1cm47CisJfQorCisJLyogY3AgcG9pbnRzIHRvICJdLi4uIiwgc2NvcGUgcG9pbnRzIHRvICIlZXRoMF0uLi4iICovCisJb3ZlcmxhcHBpbmdfc3RyY3B5KHNjb3BlLCBjcCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OCisvKiBCYXNlNjQtZW5jb2RlIGNoYXJhY3RlciBzdHJpbmcuICovCitzdGF0aWMgY2hhciAqYmFzZTY0ZW5jKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsZW4gPSBzdHJsZW4oc3RyKTsKKwlpZiAobGVuID4gc2l6ZW9mKEcud2dldF9idWYpLzQqMyAtIDEwKSAvKiBwYXJhbm9pYSAqLworCQlsZW4gPSBzaXplb2YoRy53Z2V0X2J1ZikvNCozIC0gMTA7CisJYmJfdXVlbmNvZGUoRy53Z2V0X2J1Ziwgc3RyLCBsZW4sIGJiX3V1ZW5jX3RibF9iYXNlNjQpOworCXJldHVybiBHLndnZXRfYnVmOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyKiBzYW5pdGl6ZV9zdHJpbmcoY2hhciAqcykKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gKHZvaWQgKikgczsKKwl3aGlsZSAoKnAgPj0gJyAnKQorCQlwKys7CisJKnAgPSAnXDAnOworCXJldHVybiBzOworfQorCitzdGF0aWMgRklMRSAqb3Blbl9zb2NrZXQobGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCUZJTEUgKmZwOworCisJLyogZ2xpYmMgMi40IHNlZW1zIHRvIHRyeSBzZWVraW5nIG9uIGl0IC0gPz8hICovCisJLyogaG9wZWZ1bGx5IGl0IHVuZGVyc3RhbmRzIHdoYXQgRVNQSVBFIG1lYW5zLi4uICovCisJZnAgPSBmZG9wZW4oeGNvbm5lY3Rfc3RyZWFtKGxzYSksICJyKyIpOworCWlmIChmcCA9PSBOVUxMKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCisJcmV0dXJuIGZwOworfQorCisvKiBSZXR1cm5zICdcbicgaWYgaXQgd2FzIHNlZW4sIGVsc2UgJ1wwJy4gVHJpbXMgYXQgZmlyc3QgJ1xyJyBvciAnXG4nICovCitzdGF0aWMgY2hhciBmZ2V0c19hbmRfdHJpbShGSUxFICpmcCkKK3sKKwljaGFyIGM7CisJY2hhciAqYnVmX3B0cjsKKworCWlmIChmZ2V0cyhHLndnZXRfYnVmLCBzaXplb2YoRy53Z2V0X2J1ZikgLSAxLCBmcCkgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciBnZXR0aW5nIHJlc3BvbnNlIik7CisKKwlidWZfcHRyID0gc3RyY2hybnVsKEcud2dldF9idWYsICdcbicpOworCWMgPSAqYnVmX3B0cjsKKwkqYnVmX3B0ciA9ICdcMCc7CisJYnVmX3B0ciA9IHN0cmNocm51bChHLndnZXRfYnVmLCAnXHInKTsKKwkqYnVmX3B0ciA9ICdcMCc7CisKKwlsb2dfaW8oIjwgJXMiLCBHLndnZXRfYnVmKTsKKworCXJldHVybiBjOworfQorCitzdGF0aWMgaW50IGZ0cGNtZChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIEZJTEUgKmZwKQoreworCWludCByZXN1bHQ7CisJaWYgKHMxKSB7CisJCWlmICghczIpCisJCQlzMiA9ICIiOworCQlmcHJpbnRmKGZwLCAiJXMlc1xyXG4iLCBzMSwgczIpOworCQlmZmx1c2goZnApOworCQlsb2dfaW8oIj4gJXMlcyIsIHMxLCBzMik7CisJfQorCisJZG8geworCQlmZ2V0c19hbmRfdHJpbShmcCk7CisJfSB3aGlsZSAoIWlzZGlnaXQoRy53Z2V0X2J1ZlswXSkgfHwgRy53Z2V0X2J1ZlszXSAhPSAnICcpOworCisJRy53Z2V0X2J1ZlszXSA9ICdcMCc7CisJcmVzdWx0ID0geGF0b2lfcG9zaXRpdmUoRy53Z2V0X2J1Zik7CisJRy53Z2V0X2J1ZlszXSA9ICcgJzsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBwYXJzZV91cmwoY29uc3QgY2hhciAqc3JjX3VybCwgc3RydWN0IGhvc3RfaW5mbyAqaCkKK3sKKwljaGFyICp1cmwsICpwLCAqc3A7CisKKwlmcmVlKGgtPmFsbG9jYXRlZCk7CisJaC0+YWxsb2NhdGVkID0gdXJsID0geHN0cmR1cChzcmNfdXJsKTsKKworCWlmIChzdHJuY21wKHVybCwgImh0dHA6Ly8iLCA3KSA9PSAwKSB7CisJCWgtPnBvcnQgPSBiYl9sb29rdXBfcG9ydCgiaHR0cCIsICJ0Y3AiLCA4MCk7CisJCWgtPmhvc3QgPSB1cmwgKyA3OworCQloLT5pc19mdHAgPSAwOworCX0gZWxzZSBpZiAoc3RybmNtcCh1cmwsICJmdHA6Ly8iLCA2KSA9PSAwKSB7CisJCWgtPnBvcnQgPSBiYl9sb29rdXBfcG9ydCgiZnRwIiwgInRjcCIsIDIxKTsKKwkJaC0+aG9zdCA9IHVybCArIDY7CisJCWgtPmlzX2Z0cCA9IDE7CisJfSBlbHNlCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgYW4gaHR0cCBvciBmdHAgdXJsOiAlcyIsIHNhbml0aXplX3N0cmluZyh1cmwpKTsKKworCS8vIEZZSToKKwkvLyAiUmVhbCIgd2dldCAnaHR0cDovL2J1c3lib3gubmV0P3Zhcj1hL2InIHNlbmRzIHRoaXMgcmVxdWVzdDoKKwkvLyAgICdHRVQgLz92YXI9YS9iIEhUVFAgMS4wJworCS8vICAgYW5kIHNhdmVzICdpbmRleC5odG1sP3Zhcj1hJTJGYicgKHdlIHNhdmUgJ2InKQorCS8vIHdnZXQgJ2h0dHA6Ly9idXN5Ym94Lm5ldD9sb2dpbj1qb2huQGRvZSc6CisJLy8gICByZXF1ZXN0OiAnR0VUIC8/bG9naW49am9obkBkb2UgSFRUUC8xLjAnCisJLy8gICBzYXZlczogJ2luZGV4Lmh0bWw/bG9naW49am9obkBkb2UnICh3ZSBzYXZlICc/bG9naW49am9obkBkb2UnKQorCS8vIHdnZXQgJ2h0dHA6Ly9idXN5Ym94Lm5ldCN0ZXN0L3Rlc3QnOgorCS8vICAgcmVxdWVzdDogJ0dFVCAvIEhUVFAvMS4wJworCS8vICAgc2F2ZXM6ICdpbmRleC5odG1sJyAod2Ugc2F2ZSAndGVzdCcpCisJLy8KKwkvLyBXZSBhbHNvIGRvbid0IGFkZCB1bmlxdWUgLk4gc3VmZml4IGlmIGZpbGUgZXhpc3RzLi4uCisJc3AgPSBzdHJjaHIoaC0+aG9zdCwgJy8nKTsKKwlwID0gc3RyY2hyKGgtPmhvc3QsICc/Jyk7IGlmICghc3AgfHwgKHAgJiYgc3AgPiBwKSkgc3AgPSBwOworCXAgPSBzdHJjaHIoaC0+aG9zdCwgJyMnKTsgaWYgKCFzcCB8fCAocCAmJiBzcCA+IHApKSBzcCA9IHA7CisJaWYgKCFzcCkgeworCQloLT5wYXRoID0gIiI7CisJfSBlbHNlIGlmICgqc3AgPT0gJy8nKSB7CisJCSpzcCA9ICdcMCc7CisJCWgtPnBhdGggPSBzcCArIDE7CisJfSBlbHNlIHsgLy8gJyMnIG9yICc/JworCQkvLyBodHRwOi8vYnVzeWJveC5uZXQ/bG9naW49am9obkBkb2UgaXMgYSB2YWxpZCBVUkwKKwkJLy8gbWVtbW92ZSBjb252ZXJ0cyB0bzoKKwkJLy8gaHR0cDovYnVzeWJveC5uZXR0P2xvZ2luPWpvaG5AZG9lLi4uCisJCW1lbW1vdmUoaC0+aG9zdCAtIDEsIGgtPmhvc3QsIHNwIC0gaC0+aG9zdCk7CisJCWgtPmhvc3QtLTsKKwkJc3BbLTFdID0gJ1wwJzsKKwkJaC0+cGF0aCA9IHNwOworCX0KKworCS8vIFdlIHVzZWQgdG8gc2V0IGgtPnVzZXIgdG8gTlVMTCBoZXJlLCBidXQgdGhpcyBpbnRlcmZlcmVzCisJLy8gd2l0aCBoYW5kbGluZyBvZiBjb2RlIDMwMiAoIm9iamVjdCB3YXMgbW92ZWQiKQorCisJc3AgPSBzdHJyY2hyKGgtPmhvc3QsICdAJyk7CisJaWYgKHNwICE9IE5VTEwpIHsKKwkJaC0+dXNlciA9IGgtPmhvc3Q7CisJCSpzcCA9ICdcMCc7CisJCWgtPmhvc3QgPSBzcCArIDE7CisJfQorCisJc3AgPSBoLT5ob3N0OworfQorCitzdGF0aWMgY2hhciAqZ2V0aGRyKEZJTEUgKmZwKQoreworCWNoYXIgKnMsICpoZHJ2YWw7CisJaW50IGM7CisKKwkvKiAqaXN0cnVuYyA9IDA7ICovCisKKwkvKiByZXRyaWV2ZSBoZWFkZXIgbGluZSAqLworCWMgPSBmZ2V0c19hbmRfdHJpbShmcCk7CisKKwkvKiBlbmQgb2YgdGhlIGhlYWRlcnM/ICovCisJaWYgKEcud2dldF9idWZbMF0gPT0gJ1wwJykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb252ZXJ0IHRoZSBoZWFkZXIgbmFtZSB0byBsb3dlciBjYXNlICovCisJZm9yIChzID0gRy53Z2V0X2J1ZjsgaXNhbG51bSgqcykgfHwgKnMgPT0gJy0nIHx8ICpzID09ICcuJzsgKytzKSB7CisJCS8qIHRvbG93ZXIgZm9yICJBLVoiLCBuby1vcCBmb3IgIjAtOWEtei0uIiAqLworCQkqcyB8PSAweDIwOworCX0KKworCS8qIHZlcmlmeSB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIG5hbWUgKi8KKwlpZiAoKnMgIT0gJzonKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGhlYWRlciBsaW5lOiAlcyIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmKSk7CisKKwkvKiBsb2NhdGUgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXIgdmFsdWUgKi8KKwkqcysrID0gJ1wwJzsKKwloZHJ2YWwgPSBza2lwX3doaXRlc3BhY2Uocyk7CisKKwlpZiAoYyAhPSAnXG4nKSB7CisJCS8qIFJhdHMhIFRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUgaGVhZGVyIHZhbHVlICovCisJCXdoaWxlIChjID0gZ2V0YyhmcCksIGMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCX0KKworCXJldHVybiBoZHJ2YWw7Cit9CisKK3N0YXRpYyBGSUxFKiBwcmVwYXJlX2Z0cF9zZXNzaW9uKEZJTEUgKipkZnBwLCBzdHJ1Y3QgaG9zdF9pbmZvICp0YXJnZXQsIGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKK3sKKwlGSUxFICpzZnA7CisJY2hhciAqc3RyOworCWludCBwb3J0OworCisJaWYgKCF0YXJnZXQtPnVzZXIpCisJCXRhcmdldC0+dXNlciA9IHhzdHJkdXAoImFub255bW91czpidXN5Ym94QCIpOworCisJc2ZwID0gb3Blbl9zb2NrZXQobHNhKTsKKwlpZiAoZnRwY21kKE5VTEwsIE5VTEwsIHNmcCkgIT0gMjIwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZiArIDQpKTsKKworCS8qCisJICogU3BsaXR0aW5nIHVzZXJuYW1lOnBhc3N3b3JkIHBhaXIsCisJICogdHJ5aW5nIHRvIGxvZyBpbgorCSAqLworCXN0ciA9IHN0cmNocih0YXJnZXQtPnVzZXIsICc6Jyk7CisJaWYgKHN0cikKKwkJKnN0cisrID0gJ1wwJzsKKwlzd2l0Y2ggKGZ0cGNtZCgiVVNFUiAiLCB0YXJnZXQtPnVzZXIsIHNmcCkpIHsKKwljYXNlIDIzMDoKKwkJYnJlYWs7CisJY2FzZSAzMzE6CisJCWlmIChmdHBjbWQoIlBBU1MgIiwgc3RyLCBzZnApID09IDIzMCkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKGZhaWxlZCBsb2dpbikgKi8KKwlkZWZhdWx0OgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZnRwIGxvZ2luOiAlcyIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmICsgNCkpOworCX0KKworCWZ0cGNtZCgiVFlQRSBJIiwgTlVMTCwgc2ZwKTsKKworCS8qCisJICogUXVlcnlpbmcgZmlsZSBzaXplCisJICovCisJaWYgKGZ0cGNtZCgiU0laRSAiLCB0YXJnZXQtPnBhdGgsIHNmcCkgPT0gMjEzKSB7CisJCUcuY29udGVudF9sZW4gPSBCQl9TVFJUT09GRihHLndnZXRfYnVmICsgNCwgTlVMTCwgMTApOworCQlpZiAoRy5jb250ZW50X2xlbiA8IDAgfHwgZXJybm8pIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTSVpFIHZhbHVlIGlzIGdhcmJhZ2UiKTsKKwkJfQorCQlHLmdvdF9jbGVuID0gMTsKKwl9CisKKwkvKgorCSAqIEVudGVyaW5nIHBhc3NpdmUgbW9kZQorCSAqLworCWlmIChmdHBjbWQoIlBBU1YiLCBOVUxMLCBzZnApICE9IDIyNykgeworIHBhc3ZfZXJyb3I6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgcmVzcG9uc2UgdG8gJXM6ICVzIiwgIlBBU1YiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZikpOworCX0KKwkvLyBSZXNwb25zZSBpcyAiMjI3IGdhcmJhZ2VOMSxOMixOMyxONCxQMSxQMlspZ2FyYmFnZV0KKwkvLyBTZXJ2ZXIncyBJUCBpcyBOMS5OMi5OMy5ONCAod2UgaWdub3JlIGl0KQorCS8vIFNlcnZlcidzIHBvcnQgZm9yIGRhdGEgY29ubmVjdGlvbiBpcyBQMSoyNTYrUDIKKwlzdHIgPSBzdHJyY2hyKEcud2dldF9idWYsICcpJyk7CisJaWYgKHN0cikgc3RyWzBdID0gJ1wwJzsKKwlzdHIgPSBzdHJyY2hyKEcud2dldF9idWYsICcsJyk7CisJaWYgKCFzdHIpIGdvdG8gcGFzdl9lcnJvcjsKKwlwb3J0ID0geGF0b3VfcmFuZ2Uoc3RyKzEsIDAsIDI1NSk7CisJKnN0ciA9ICdcMCc7CisJc3RyID0gc3RycmNocihHLndnZXRfYnVmLCAnLCcpOworCWlmICghc3RyKSBnb3RvIHBhc3ZfZXJyb3I7CisJcG9ydCArPSB4YXRvdV9yYW5nZShzdHIrMSwgMCwgMjU1KSAqIDI1NjsKKwlzZXRfbnBvcnQoJmxzYS0+dS5zYSwgaHRvbnMocG9ydCkpOworCisJKmRmcHAgPSBvcGVuX3NvY2tldChsc2EpOworCisJaWYgKEcuYmVnX3JhbmdlKSB7CisJCXNwcmludGYoRy53Z2V0X2J1ZiwgIlJFU1QgJSJPRkZfRk1UInUiLCBHLmJlZ19yYW5nZSk7CisJCWlmIChmdHBjbWQoRy53Z2V0X2J1ZiwgTlVMTCwgc2ZwKSA9PSAzNTApCisJCQlHLmNvbnRlbnRfbGVuIC09IEcuYmVnX3JhbmdlOworCX0KKworCWlmIChmdHBjbWQoIlJFVFIgIiwgdGFyZ2V0LT5wYXRoLCBzZnApID4gMTUwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHJlc3BvbnNlIHRvICVzOiAlcyIsICJSRVRSIiwgc2FuaXRpemVfc3RyaW5nKEcud2dldF9idWYpKTsKKworCXJldHVybiBzZnA7Cit9CisKK3N0YXRpYyB2b2lkIE5PSU5MSU5FIHJldHJpZXZlX2ZpbGVfZGF0YShGSUxFICpkZnApCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgfHwgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisjIGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCXVuc2lnbmVkIHNlY29uZF9jbnQ7CisjIGVuZGlmCisJc3RydWN0IHBvbGxmZCBwb2xsZGF0YTsKKworCXBvbGxkYXRhLmZkID0gZmlsZW5vKGRmcCk7CisJcG9sbGRhdGEuZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSTsKKyNlbmRpZgorCXByb2dyZXNzX21ldGVyKFBST0dSRVNTX1NUQVJUKTsKKworCWlmIChHLmNodW5rZWQpCisJCWdvdG8gZ2V0X2NsZW47CisKKwkvKiBMb29wcyBvbmx5IGlmIGNodW5rZWQgKi8KKwl3aGlsZSAoMSkgeworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgfHwgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCS8qIE11c3QgdXNlIG5vbmJsb2NraW5nIEkvTywgb3RoZXJ3aXNlIGZyZWFkIHdpbGwgbG9vcAorCQkgKiBhbmQgKmJsb2NrKiB1bnRpbCBpdCByZWFkcyBmdWxsIGJ1ZmZlciwKKwkJICogd2hpY2ggbWVzc2VzIHVwIHByb2dyZXNzIGJhciBhbmQvb3IgdGltZW91dCBsb2dpYy4KKwkJICogQmVjYXVzZSBvZiBub25ibG9ja2luZyBJL08sIHdlIG5lZWQgdG8gZGFuY2UKKwkJICogdmVyeSBjYXJlZnVsbHkgYXJvdW5kIEVBR0FJTi4gU2VlIGV4cGxhbmF0aW9uIGF0CisJCSAqIGNsZWFyZXJyKCkgY2FsbC4KKwkJICovCisJCW5kZWxheV9vbihwb2xsZGF0YS5mZCk7CisjZW5kaWYKKwkJd2hpbGUgKDEpIHsKKwkJCWludCBuOworCQkJdW5zaWduZWQgcmRzejsKKworCQkJcmRzeiA9IHNpemVvZihHLndnZXRfYnVmKTsKKwkJCWlmIChHLmdvdF9jbGVuKSB7CisJCQkJaWYgKEcuY29udGVudF9sZW4gPCAob2ZmX3Qpc2l6ZW9mKEcud2dldF9idWYpKSB7CisJCQkJCWlmICgoaW50KUcuY29udGVudF9sZW4gPD0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQlyZHN6ID0gKHVuc2lnbmVkKUcuY29udGVudF9sZW47CisJCQkJfQorCQkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgfHwgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisjIGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQkJc2Vjb25kX2NudCA9IEcudGltZW91dF9zZWNvbmRzOworIyBlbmRpZgorCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoc2FmZV9wb2xsKCZwb2xsZGF0YSwgMSwgMTAwMCkgIT0gMCkKKwkJCQkJYnJlYWs7IC8qIGVycm9yLCBFT0YsIG9yIGRhdGEgaXMgYXZhaWxhYmxlICovCisjIGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQkJCWlmIChzZWNvbmRfY250ICE9IDAgJiYgLS1zZWNvbmRfY250ID09IDApIHsKKwkJCQkJcHJvZ3Jlc3NfbWV0ZXIoUFJPR1JFU1NfRU5EKTsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImRvd25sb2FkIHRpbWVkIG91dCIpOworCQkJCX0KKyMgZW5kaWYKKwkJCQkvKiBOZWVkZWQgZm9yICJzdGFsbGVkIiBpbmRpY2F0b3IgKi8KKwkJCQlwcm9ncmVzc19tZXRlcihQUk9HUkVTU19CVU1QKTsKKwkJCX0KKworCQkJLyogZnJlYWQgaW50ZXJuYWxseSB1c2VzIHJlYWQgbG9vcCwgd2hpY2ggaW4gb3VyIGNhc2UKKwkJCSAqIGlzIHVzdWFsbHkgZXhpdGVkIHdoZW4gd2UgZ2V0IEVBR0FJTi4KKwkJCSAqIEluIHRoaXMgY2FzZSwgbGliYyBzZXRzIGVycm9yIG1hcmtlciBvbiB0aGUgc3RyZWFtLgorCQkJICogTmVlZCB0byBjbGVhciBpdCBiZWZvcmUgbmV4dCBmcmVhZCB0byBhdm9pZCBwb3NzaWJsZQorCQkJICogcmFyZSBmYWxzZSBwb3NpdGl2ZSBmZXJyb3IgYmVsb3cuIFJhcmUgYmVjYXVzZSB1c3VhbGx5CisJCQkgKiBmcmVhZCBnZXRzIG1vcmUgdGhhbiB6ZXJvIGJ5dGVzLCBhbmQgd2UgZG9uJ3QgZmFsbAorCQkJICogaW50byBpZiAobiA8PSAwKSAuLi4KKwkJCSAqLworCQkJY2xlYXJlcnIoZGZwKTsKKwkJCWVycm5vID0gMDsKKyNlbmRpZgorCQkJbiA9IGZyZWFkKEcud2dldF9idWYsIDEsIHJkc3osIGRmcCk7CisJCQkvKiBtYW4gZnJlYWQ6CisJCQkgKiBJZiBlcnJvciBvY2N1cnMsIG9yIEVPRiBpcyByZWFjaGVkLCB0aGUgcmV0dXJuIHZhbHVlCisJCQkgKiBpcyBhIHNob3J0IGl0ZW0gY291bnQgKG9yIHplcm8pLgorCQkJICogZnJlYWQgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBFT0YgYW5kIGVycm9yLgorCQkJICovCisJCQlpZiAobiA8PSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgfHwgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCQkJaWYgKGVycm5vID09IEVBR0FJTikgLyogcG9sbCBsaWVkLCB0aGVyZSBpcyBubyBkYXRhPyAqLworCQkJCQljb250aW51ZTsgLyogeWVzICovCisjZW5kaWYKKwkJCQlpZiAoZmVycm9yKGRmcCkpCisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJYnJlYWs7IC8qIEVPRiwgbm90IGVycm9yICovCisJCQl9CisKKwkJCXh3cml0ZShHLm91dHB1dF9mZCwgRy53Z2V0X2J1Ziwgbik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUgorCQkJRy50cmFuc2ZlcnJlZCArPSBuOworCQkJcHJvZ3Jlc3NfbWV0ZXIoUFJPR1JFU1NfQlVNUCk7CisjZW5kaWYKKwkJCWlmIChHLmdvdF9jbGVuKSB7CisJCQkJRy5jb250ZW50X2xlbiAtPSBuOworCQkJCWlmIChHLmNvbnRlbnRfbGVuID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgfHwgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCWNsZWFyZXJyKGRmcCk7CisJCW5kZWxheV9vZmYocG9sbGRhdGEuZmQpOyAvKiBlbHNlIGZnZXRzIGNhbiBnZXQgdmVyeSB1bmhhcHB5ICovCisjZW5kaWYKKwkJaWYgKCFHLmNodW5rZWQpCisJCQlicmVhazsKKworCQlmZ2V0c19hbmRfdHJpbShkZnApOyAvKiBFYXQgZW1wdHkgbGluZSAqLworIGdldF9jbGVuOgorCQlmZ2V0c19hbmRfdHJpbShkZnApOworCQlHLmNvbnRlbnRfbGVuID0gU1RSVE9PRkYoRy53Z2V0X2J1ZiwgTlVMTCwgMTYpOworCQkvKiBGSVhNRTogZXJyb3IgY2hlY2s/ICovCisJCWlmIChHLmNvbnRlbnRfbGVuID09IDApCisJCQlicmVhazsgLyogYWxsIGRvbmUhICovCisJCUcuZ290X2NsZW4gPSAxOworCX0KKworCS8qIERyYXcgZnVsbCBiYXIgYW5kIGZyZWUgaXRzIHJlc291cmNlcyAqLworCUcuY2h1bmtlZCA9IDA7ICAvKiBtYWtlcyBpdCBzaG93IDEwMCUgZXZlbiBmb3IgY2h1bmtlZCBkb3dubG9hZCAqLworCUcuZ290X2NsZW4gPSAxOyAvKiBtYWtlcyBpdCBzaG93IDEwMCUgZXZlbiBmb3IgZG93bmxvYWQgb2YgKGZvcm1lcmx5KSB1bmtub3duIHNpemUgKi8KKwlwcm9ncmVzc19tZXRlcihQUk9HUkVTU19FTkQpOworfQorCitzdGF0aWMgdm9pZCBkb3dubG9hZF9vbmVfdXJsKGNvbnN0IGNoYXIgKnVybCkKK3sKKwlib29sIHVzZV9wcm94eTsgICAgICAgICAgICAgICAgIC8qIFVzZSBwcm94aWVzIGlmIGVudiB2YXJzIGFyZSBzZXQgICovCisJaW50IHJlZGlyX2xpbWl0OworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlGSUxFICpzZnA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNvY2tldCB0byB3ZWIvZnRwIHNlcnZlciAgICAgICAgICovCisJRklMRSAqZGZwOyAgICAgICAgICAgICAgICAgICAgICAvKiBzb2NrZXQgdG8gZnRwIHNlcnZlciAoZGF0YSkgICAgICAqLworCWNoYXIgKnByb3h5ID0gTlVMTDsKKwljaGFyICpmbmFtZV9vdXRfYWxsb2M7CisJY2hhciAqcmVkaXJlY3RlZF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgaG9zdF9pbmZvIHNlcnZlcjsKKwlzdHJ1Y3QgaG9zdF9pbmZvIHRhcmdldDsKKworCXNlcnZlci5hbGxvY2F0ZWQgPSBOVUxMOworCXRhcmdldC5hbGxvY2F0ZWQgPSBOVUxMOworCXNlcnZlci51c2VyID0gTlVMTDsKKwl0YXJnZXQudXNlciA9IE5VTEw7CisKKwlwYXJzZV91cmwodXJsLCAmdGFyZ2V0KTsKKworCS8qIFVzZSB0aGUgcHJveHkgaWYgbmVjZXNzYXJ5ICovCisJdXNlX3Byb3h5ID0gKHN0cmNtcChHLnByb3h5X2ZsYWcsICJvZmYiKSAhPSAwKTsKKwlpZiAodXNlX3Byb3h5KSB7CisJCXByb3h5ID0gZ2V0ZW52KHRhcmdldC5pc19mdHAgPyAiZnRwX3Byb3h5IiA6ICJodHRwX3Byb3h5Iik7CisJCXVzZV9wcm94eSA9IChwcm94eSAmJiBwcm94eVswXSk7CisJCWlmICh1c2VfcHJveHkpCisJCQlwYXJzZV91cmwocHJveHksICZzZXJ2ZXIpOworCX0KKwlpZiAoIXVzZV9wcm94eSkgeworCQlzZXJ2ZXIucG9ydCA9IHRhcmdldC5wb3J0OworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBWNikgeworCQkJLy9mcmVlKHNlcnZlci5hbGxvY2F0ZWQpOyAtIGNhbid0IGJlIG5vbi1OVUxMCisJCQlzZXJ2ZXIuaG9zdCA9IHNlcnZlci5hbGxvY2F0ZWQgPSB4c3RyZHVwKHRhcmdldC5ob3N0KTsKKwkJfSBlbHNlIHsKKwkJCXNlcnZlci5ob3N0ID0gdGFyZ2V0Lmhvc3Q7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBWNikKKwkJc3RyaXBfaXB2Nl9zY29wZV9pZCh0YXJnZXQuaG9zdCk7CisKKwkvKiBJZiB0aGVyZSB3YXMgbm8gLU8gRklMRSwgZ3Vlc3Mgb3V0cHV0IGZpbGVuYW1lICovCisJZm5hbWVfb3V0X2FsbG9jID0gTlVMTDsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfT1VUTkFNRSkpIHsKKwkJRy5mbmFtZV9vdXQgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHRhcmdldC5wYXRoKTsKKwkJLyogaGFuZGxlICJ3Z2V0IGh0dHA6Ly9rZXJuZWwub3JnLy8iICovCisJCWlmIChHLmZuYW1lX291dFswXSA9PSAnLycgfHwgIUcuZm5hbWVfb3V0WzBdKQorCQkJRy5mbmFtZV9vdXQgPSAoY2hhciopImluZGV4Lmh0bWwiOworCQkvKiAtUCBESVIgaXMgY29uc2lkZXJlZCBvbmx5IGlmIHRoZXJlIHdhcyBubyAtTyBGSUxFICovCisJCWVsc2UgeworCQkJaWYgKEcuZGlyX3ByZWZpeCkKKwkJCQlHLmZuYW1lX291dCA9IGZuYW1lX291dF9hbGxvYyA9IGNvbmNhdF9wYXRoX2ZpbGUoRy5kaXJfcHJlZml4LCBHLmZuYW1lX291dCk7CisJCQllbHNlIHsKKwkJCQkvKiByZWRpcmVjdHMgbWF5IGZyZWUgdGFyZ2V0LnBhdGggbGF0ZXIsIG5lZWQgdG8gbWFrZSBhIGNvcHkgKi8KKwkJCQlHLmZuYW1lX291dCA9IGZuYW1lX291dF9hbGxvYyA9IHhzdHJkdXAoRy5mbmFtZV9vdXQpOworCQkJfQorCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSCisJRy5jdXJmaWxlID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChHLmZuYW1lX291dCk7CisjZW5kaWYKKworCS8qIERldGVybWluZSB3aGVyZSB0byBzdGFydCB0cmFuc2ZlciAqLworCUcuYmVnX3JhbmdlID0gMDsKKwlpZiAob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX0NPTlRJTlVFKSB7CisJCUcub3V0cHV0X2ZkID0gb3BlbihHLmZuYW1lX291dCwgT19XUk9OTFkpOworCQlpZiAoRy5vdXRwdXRfZmQgPj0gMCkgeworCQkJRy5iZWdfcmFuZ2UgPSB4bHNlZWsoRy5vdXRwdXRfZmQsIDAsIFNFRUtfRU5EKTsKKwkJfQorCQkvKiBGaWxlIGRvZXNuJ3QgZXhpc3QuIFdlIGRvIG5vdCBjcmVhdGUgZmlsZSBoZXJlIHlldC4KKwkJICogV2UgYXJlIG5vdCBzdXJlIGl0IGV4aXN0cyBvbiByZW1vdGUgc2lkZSAqLworCX0KKworCXJlZGlyX2xpbWl0ID0gNTsKKyByZXNvbHZlX2xzYToKKwlsc2EgPSB4aG9zdDJzb2NrYWRkcihzZXJ2ZXIuaG9zdCwgc2VydmVyLnBvcnQpOworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9RVUlFVCkpIHsKKwkJY2hhciAqcyA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZsc2EtPnUuc2EpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RpbmcgdG8gJXMgKCVzKVxuIiwgc2VydmVyLmhvc3QsIHMpOworCQlmcmVlKHMpOworCX0KKyBlc3RhYmxpc2hfc2Vzc2lvbjoKKwkvKkcuY29udGVudF9sZW4gPSAwOyAtIHJlZHVuZGFudCwgZ290X2NsZW4gPSAwIGlzIGVub3VnaCAqLworCUcuZ290X2NsZW4gPSAwOworCUcuY2h1bmtlZCA9IDA7CisJaWYgKHVzZV9wcm94eSB8fCAhdGFyZ2V0LmlzX2Z0cCkgeworCQkvKgorCQkgKiAgSFRUUCBzZXNzaW9uCisJCSAqLworCQljaGFyICpzdHI7CisJCWludCBzdGF0dXM7CisKKworCQkvKiBPcGVuIHNvY2tldCB0byBodHRwIHNlcnZlciAqLworCQlzZnAgPSBvcGVuX3NvY2tldChsc2EpOworCisJCS8qIFNlbmQgSFRUUCByZXF1ZXN0ICovCisJCWlmICh1c2VfcHJveHkpIHsKKwkJCWZwcmludGYoc2ZwLCAiR0VUICVzdHA6Ly8lcy8lcyBIVFRQLzEuMVxyXG4iLAorCQkJCXRhcmdldC5pc19mdHAgPyAiZiIgOiAiaHQiLCB0YXJnZXQuaG9zdCwKKwkJCQl0YXJnZXQucGF0aCk7CisJCX0gZWxzZSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX1BPU1RfREFUQSkKKwkJCQlmcHJpbnRmKHNmcCwgIlBPU1QgLyVzIEhUVFAvMS4xXHJcbiIsIHRhcmdldC5wYXRoKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKHNmcCwgIkdFVCAvJXMgSFRUUC8xLjFcclxuIiwgdGFyZ2V0LnBhdGgpOworCQl9CisKKwkJZnByaW50ZihzZnAsICJIb3N0OiAlc1xyXG5Vc2VyLUFnZW50OiAlc1xyXG4iLAorCQkJdGFyZ2V0Lmhvc3QsIEcudXNlcl9hZ2VudCk7CisKKwkJLyogQXNrIHNlcnZlciB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhcyBzb29uIGFzIHdlIGFyZSBkb25lCisJCSAqIChJT1c6IHdlIGRvIG5vdCBpbnRlbmQgdG8gc2VuZCBtb3JlIHJlcXVlc3RzKQorCQkgKi8KKwkJZnByaW50ZihzZnAsICJDb25uZWN0aW9uOiBjbG9zZVxyXG4iKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKwkJaWYgKHRhcmdldC51c2VyKSB7CisvL1RPRE86IFVSTC1kZWNvZGUgInVzZXI6cGFzc3dvcmQiIHN0cmluZyBiZWZvcmUgYmFzZTY0LWVuY29kaW5nOgorLy93Z2V0IGh0dHA6Ly90ZXN0Om15JTIwcGFzc0BleGFtcGxlLmNvbSBzaG91bGQgc2VuZAorLy8gQXV0aG9yaXphdGlvbjogQmFzaWMgZEdWemREcHRlU0J3WVhOegorLy93aGljaCBkZWNvZGVzIHRvICJ0ZXN0Om15IHBhc3MiLCBpbnN0ZWFkIG9mIHdoYXQgd2Ugc2VuZCBub3c6CisvLyBBdXRob3JpemF0aW9uOiBCYXNpYyBkR1Z6ZERwdGVTVXlNSEJoYzNNPQorLy9DYW4gcmV1c2UgZGVjb2RlU3RyaW5nKCkgZnJvbSBodHRwZC5jCisJCQlmcHJpbnRmKHNmcCwgIlByb3h5LUF1dGhvcml6YXRpb246IEJhc2ljICVzXHJcbiIrNiwKKwkJCQliYXNlNjRlbmModGFyZ2V0LnVzZXIpKTsKKwkJfQorCQlpZiAodXNlX3Byb3h5ICYmIHNlcnZlci51c2VyKSB7CisJCQlmcHJpbnRmKHNmcCwgIlByb3h5LUF1dGhvcml6YXRpb246IEJhc2ljICVzXHJcbiIsCisJCQkJYmFzZTY0ZW5jKHNlcnZlci51c2VyKSk7CisJCX0KKyNlbmRpZgorCisJCWlmIChHLmJlZ19yYW5nZSkKKwkJCWZwcmludGYoc2ZwLCAiUmFuZ2U6IGJ5dGVzPSUiT0ZGX0ZNVCJ1LVxyXG4iLCBHLmJlZ19yYW5nZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUworCQlpZiAoRy5leHRyYV9oZWFkZXJzKQorCQkJZnB1dHMoRy5leHRyYV9oZWFkZXJzLCBzZnApOworCisJCWlmIChvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfUE9TVF9EQVRBKSB7CisJCQlmcHJpbnRmKHNmcCwKKwkJCQkiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIgorCQkJCSJDb250ZW50LUxlbmd0aDogJXVcclxuIgorCQkJCSJcclxuIgorCQkJCSIlcyIsCisJCQkJKGludCkgc3RybGVuKEcucG9zdF9kYXRhKSwgRy5wb3N0X2RhdGEKKwkJCSk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCWZwcmludGYoc2ZwLCAiXHJcbiIpOworCQl9CisKKwkJZmZsdXNoKHNmcCk7CisKKwkJLyoKKwkJICogUmV0cmlldmUgSFRUUCByZXNwb25zZSBsaW5lIGFuZCBjaGVjayBmb3IgIjIwMCIgc3RhdHVzIGNvZGUuCisJCSAqLworIHJlYWRfcmVzcG9uc2U6CisJCWZnZXRzX2FuZF90cmltKHNmcCk7CisKKwkJc3RyID0gRy53Z2V0X2J1ZjsKKwkJc3RyID0gc2tpcF9ub25fd2hpdGVzcGFjZShzdHIpOworCQlzdHIgPSBza2lwX3doaXRlc3BhY2Uoc3RyKTsKKwkJLy8gRklYTUU6IG5vIGVycm9yIGNoZWNrCisJCS8vIHhhdG91IHdvdWxkbid0IHdvcms6ICIyMDAgT0siCisJCXN0YXR1cyA9IGF0b2koc3RyKTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSAwOgorCQljYXNlIDEwMDoKKwkJCXdoaWxlIChnZXRoZHIoc2ZwKSAhPSBOVUxMKQorCQkJCS8qIGVhdCBhbGwgcmVtYWluaW5nIGhlYWRlcnMgKi87CisJCQlnb3RvIHJlYWRfcmVzcG9uc2U7CisJCWNhc2UgMjAwOgorLyoKK1Jlc3BvbnNlIDIwNCBkb2Vzbid0IHNheSAibnVsbCBmaWxlIiwgaXQgc2F5cyAibWV0YWRhdGEKK2hhcyBjaGFuZ2VkIGJ1dCBkYXRhIGRpZG4ndCI6CisKKyIxMC4yLjUgMjA0IE5vIENvbnRlbnQKK1RoZSBzZXJ2ZXIgaGFzIGZ1bGZpbGxlZCB0aGUgcmVxdWVzdCBidXQgZG9lcyBub3QgbmVlZCB0byByZXR1cm4KK2FuIGVudGl0eS1ib2R5LCBhbmQgbWlnaHQgd2FudCB0byByZXR1cm4gdXBkYXRlZCBtZXRhaW5mb3JtYXRpb24uCitUaGUgcmVzcG9uc2UgTUFZIGluY2x1ZGUgbmV3IG9yIHVwZGF0ZWQgbWV0YWluZm9ybWF0aW9uIGluIHRoZSBmb3JtCitvZiBlbnRpdHktaGVhZGVycywgd2hpY2ggaWYgcHJlc2VudCBTSE9VTEQgYmUgYXNzb2NpYXRlZCB3aXRoCit0aGUgcmVxdWVzdGVkIHZhcmlhbnQuCisKK0lmIHRoZSBjbGllbnQgaXMgYSB1c2VyIGFnZW50LCBpdCBTSE9VTEQgTk9UIGNoYW5nZSBpdHMgZG9jdW1lbnQKK3ZpZXcgZnJvbSB0aGF0IHdoaWNoIGNhdXNlZCB0aGUgcmVxdWVzdCB0byBiZSBzZW50LiBUaGlzIHJlc3BvbnNlCitpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYWxsb3cgaW5wdXQgZm9yIGFjdGlvbnMgdG8gdGFrZSBwbGFjZQord2l0aG91dCBjYXVzaW5nIGEgY2hhbmdlIHRvIHRoZSB1c2VyIGFnZW50J3MgYWN0aXZlIGRvY3VtZW50IHZpZXcsCithbHRob3VnaCBhbnkgbmV3IG9yIHVwZGF0ZWQgbWV0YWluZm9ybWF0aW9uIFNIT1VMRCBiZSBhcHBsaWVkCit0byB0aGUgZG9jdW1lbnQgY3VycmVudGx5IGluIHRoZSB1c2VyIGFnZW50J3MgYWN0aXZlIHZpZXcuCisKK1RoZSAyMDQgcmVzcG9uc2UgTVVTVCBOT1QgaW5jbHVkZSBhIG1lc3NhZ2UtYm9keSwgYW5kIHRodXMKK2lzIGFsd2F5cyB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBlbXB0eSBsaW5lIGFmdGVyIHRoZSBoZWFkZXIgZmllbGRzLiIKKworSG93ZXZlciwgaW4gcmVhbCB3b3JsZCBpdCB3YXMgb2JzZXJ2ZWQgdGhhdCBzb21lIHdlYiBzZXJ2ZXJzCisoZS5nLiBCb2EvMC45NC4xNHJjMjEpIHNpbXBseSB1c2UgY29kZSAyMDQgd2hlbiBmaWxlIHNpemUgaXMgemVyby4KKyovCisJCWNhc2UgMjA0OgorCQkJYnJlYWs7CisJCWNhc2UgMzAwOiAgLyogcmVkaXJlY3Rpb24gKi8KKwkJY2FzZSAzMDE6CisJCWNhc2UgMzAyOgorCQljYXNlIDMwMzoKKwkJCWJyZWFrOworCQljYXNlIDIwNjoKKwkJCWlmIChHLmJlZ19yYW5nZSkKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNlcnZlciByZXR1cm5lZCBlcnJvcjogJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZikpOworCQl9CisKKwkJLyoKKwkJICogUmV0cmlldmUgSFRUUCBoZWFkZXJzLgorCQkgKi8KKwkJd2hpbGUgKChzdHIgPSBnZXRoZHIoc2ZwKSkgIT0gTlVMTCkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkJCSJjb250ZW50LWxlbmd0aFwwIiJ0cmFuc2Zlci1lbmNvZGluZ1wwIiJsb2NhdGlvblwwIjsKKwkJCWVudW0geworCQkJCUtFWV9jb250ZW50X2xlbmd0aCA9IDEsIEtFWV90cmFuc2Zlcl9lbmNvZGluZywgS0VZX2xvY2F0aW9uCisJCQl9OworCQkJc21hbGx1aW50IGtleTsKKworCQkJLyogZ2V0aGRyIGNvbnZlcnRlZCAiRk9POiIgc3RyaW5nIHRvIGxvd2VyY2FzZSAqLworCisJCQkvKiBzdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJCQljaGFyICpzID0gc3RyY2hybnVsKHN0ciwgJ1wwJykgLSAxOworCQkJd2hpbGUgKHMgPj0gc3RyICYmICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykpIHsKKwkJCQkqcyA9ICdcMCc7CisJCQkJcy0tOworCQkJfQorCQkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgRy53Z2V0X2J1ZikgKyAxOworCQkJaWYgKGtleSA9PSBLRVlfY29udGVudF9sZW5ndGgpIHsKKwkJCQlHLmNvbnRlbnRfbGVuID0gQkJfU1RSVE9PRkYoc3RyLCBOVUxMLCAxMCk7CisJCQkJaWYgKEcuY29udGVudF9sZW4gPCAwIHx8IGVycm5vKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb250ZW50LWxlbmd0aCAlcyBpcyBnYXJiYWdlIiwgc2FuaXRpemVfc3RyaW5nKHN0cikpOworCQkJCX0KKwkJCQlHLmdvdF9jbGVuID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChrZXkgPT0gS0VZX3RyYW5zZmVyX2VuY29kaW5nKSB7CisJCQkJaWYgKHN0cmNtcChzdHJfdG9sb3dlcihzdHIpLCAiY2h1bmtlZCIpICE9IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0cmFuc2ZlciBlbmNvZGluZyAnJXMnIGlzIG5vdCBzdXBwb3J0ZWQiLCBzYW5pdGl6ZV9zdHJpbmcoc3RyKSk7CisJCQkJRy5jaHVua2VkID0gMTsKKwkJCX0KKwkJCWlmIChrZXkgPT0gS0VZX2xvY2F0aW9uICYmIHN0YXR1cyA+PSAzMDApIHsKKwkJCQlpZiAoLS1yZWRpcl9saW1pdCA9PSAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgcmVkaXJlY3Rpb25zIik7CisJCQkJZmNsb3NlKHNmcCk7CisJCQkJaWYgKHN0clswXSA9PSAnLycpIHsKKwkJCQkJZnJlZShyZWRpcmVjdGVkX3BhdGgpOworCQkJCQl0YXJnZXQucGF0aCA9IHJlZGlyZWN0ZWRfcGF0aCA9IHhzdHJkdXAoc3RyKzEpOworCQkJCQkvKiBsc2Egc3RheXMgdGhlIHNhbWU6IGl0J3Mgb24gdGhlIHNhbWUgc2VydmVyICovCisJCQkJfSBlbHNlIHsKKwkJCQkJcGFyc2VfdXJsKHN0ciwgJnRhcmdldCk7CisJCQkJCWlmICghdXNlX3Byb3h5KSB7CisJCQkJCQlmcmVlKHNlcnZlci5hbGxvY2F0ZWQpOworCQkJCQkJc2VydmVyLmFsbG9jYXRlZCA9IE5VTEw7CisJCQkJCQlzZXJ2ZXIuaG9zdCA9IHRhcmdldC5ob3N0OworCQkJCQkJLyogc3RyaXBfaXB2Nl9zY29wZV9pZCh0YXJnZXQuaG9zdCk7IC0gbm8hICovCisJCQkJCQkvKiB3ZSBhc3N1bWUgcmVtb3RlIG5ldmVyIGdpdmVzIHVzIElQdjYgYWRkciB3aXRoIHNjb3BlIGlkICovCisJCQkJCQlzZXJ2ZXIucG9ydCA9IHRhcmdldC5wb3J0OworCQkJCQkJZnJlZShsc2EpOworCQkJCQkJZ290byByZXNvbHZlX2xzYTsKKwkJCQkJfSAvKiBlbHNlOiBsc2Egc3RheXMgdGhlIHNhbWU6IHdlIHVzZSBwcm94eSAqLworCQkJCX0KKwkJCQlnb3RvIGVzdGFibGlzaF9zZXNzaW9uOworCQkJfQorCQl9CisvLwkJaWYgKHN0YXR1cyA+PSAzMDApCisvLwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgcmVkaXJlY3Rpb24gKG5vIExvY2F0aW9uOiBoZWFkZXIgZnJvbSBzZXJ2ZXIpIik7CisKKwkJLyogRm9yIEhUVFAsIGRhdGEgaXMgcHVtcGVkIG92ZXIgdGhlIHNhbWUgY29ubmVjdGlvbiAqLworCQlkZnAgPSBzZnA7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiAgRlRQIHNlc3Npb24KKwkJICovCisJCXNmcCA9IHByZXBhcmVfZnRwX3Nlc3Npb24oJmRmcCwgJnRhcmdldCwgbHNhKTsKKwl9CisKKwlmcmVlKGxzYSk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfU1BJREVSKSkgeworCQlpZiAoRy5vdXRwdXRfZmQgPCAwKQorCQkJRy5vdXRwdXRfZmQgPSB4b3BlbihHLmZuYW1lX291dCwgRy5vX2ZsYWdzKTsKKwkJcmV0cmlldmVfZmlsZV9kYXRhKGRmcCk7CisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9PVVROQU1FKSkgeworCQkJeGNsb3NlKEcub3V0cHV0X2ZkKTsKKwkJCUcub3V0cHV0X2ZkID0gLTE7CisJCX0KKwl9CisKKwlpZiAoZGZwICE9IHNmcCkgeworCQkvKiBJdCdzIGZ0cC4gQ2xvc2UgZGF0YSBjb25uZWN0aW9uIHByb3Blcmx5ICovCisJCWZjbG9zZShkZnApOworCQlpZiAoZnRwY21kKE5VTEwsIE5VTEwsIHNmcCkgIT0gMjI2KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZ0cCBlcnJvcjogJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZiArIDQpKTsKKwkJLyogZnRwY21kKCJRVUlUIiwgTlVMTCwgc2ZwKTsgLSB3aHkgYm90aGVyPyAqLworCX0KKwlmY2xvc2Uoc2ZwKTsKKworCWZyZWUoc2VydmVyLmFsbG9jYXRlZCk7CisJZnJlZSh0YXJnZXQuYWxsb2NhdGVkKTsKKwlmcmVlKGZuYW1lX291dF9hbGxvYyk7CisJZnJlZShyZWRpcmVjdGVkX3BhdGgpOworfQorCitpbnQgd2dldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2dldF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciB3Z2V0X2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJjb250aW51ZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJjIgorLy9GSVhNRTogLXMgaXNuJ3QgLS1zcGlkZXIsIGl0J3MgLS1zYXZlLWhlYWRlcnMhCisJCSJzcGlkZXJcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkicXVpZXRcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkJIm91dHB1dC1kb2N1bWVudFwwIiAgUmVxdWlyZWRfYXJndW1lbnQgIk8iCisJCSJkaXJlY3RvcnktcHJlZml4XDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJQIgorCQkicHJveHlcMCIgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWSIKKwkJInVzZXItYWdlbnRcMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlUiCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCSJ0aW1lb3V0XDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJUIgorI2VuZGlmCisJCS8qIElnbm9yZWQ6ICovCisJCS8vICJ0cmllc1wwIiAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQkvKiBJZ25vcmVkICh3ZSBhbHdheXMgdXNlIFBBU1YpOiAqLworCQkicGFzc2l2ZS1mdHBcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKwkJImhlYWRlclwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmUiCisJCSJwb3N0LWRhdGFcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJceGZkIgorCQkvKiBJZ25vcmVkICh3ZSBkb24ndCBkbyBzc2wpICovCisJCSJuby1jaGVjay1jZXJ0aWZpY2F0ZVwwIiBOb19hcmd1bWVudCAgICJceGZjIgorCQk7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJbGxpc3RfdCAqaGVhZGVyc19sbGlzdCA9IE5VTEw7CisjZW5kaWYKKworCUlOSVRfRygpOworCisJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoRy50aW1lb3V0X3NlY29uZHMgPSA5MDA7KQorCUcucHJveHlfZmxhZyA9ICJvbiI7ICAgLyogdXNlIHByb3hpZXMgaWYgZW52IHZhcnMgYXJlIHNldCAqLworCUcudXNlcl9hZ2VudCA9ICJXZ2V0IjsgLyogIlVzZXItQWdlbnQiIGhlYWRlciBmaWVsZCAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gd2dldF9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiBJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgiOlQrIikgSUZfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUygiOlx4ZmU6OiIpOworCWdldG9wdDMyKGFyZ3YsICJjc3FPOlA6WTpVOlQ6IiAvKmlnbm9yZWQ6Ki8gInQ6IiwKKwkJJkcuZm5hbWVfb3V0LCAmRy5kaXJfcHJlZml4LAorCQkmRy5wcm94eV9mbGFnLCAmRy51c2VyX2FnZW50LAorCQlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgmRy50aW1lb3V0X3NlY29uZHMpIElGX05PVF9GRUFUVVJFX1dHRVRfVElNRU9VVChOVUxMKSwKKwkJTlVMTCAvKiAtdCBSRVRSSUVTICovCisJCUlGX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoLCAmaGVhZGVyc19sbGlzdCkKKwkJSUZfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUygsICZHLnBvc3RfZGF0YSkKKwkpOworCWFyZ3YgKz0gb3B0aW5kOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlpZiAoaGVhZGVyc19sbGlzdCkgeworCQlpbnQgc2l6ZSA9IDE7CisJCWNoYXIgKmNwOworCQlsbGlzdF90ICpsbCA9IGhlYWRlcnNfbGxpc3Q7CisJCXdoaWxlIChsbCkgeworCQkJc2l6ZSArPSBzdHJsZW4obGwtPmRhdGEpICsgMjsKKwkJCWxsID0gbGwtPmxpbms7CisJCX0KKwkJRy5leHRyYV9oZWFkZXJzID0gY3AgPSB4bWFsbG9jKHNpemUpOworCQl3aGlsZSAoaGVhZGVyc19sbGlzdCkgeworCQkJY3AgKz0gc3ByaW50ZihjcCwgIiVzXHJcbiIsIChjaGFyKilsbGlzdF9wb3AoJmhlYWRlcnNfbGxpc3QpKTsKKwkJfQorCX0KKyNlbmRpZgorCisJRy5vdXRwdXRfZmQgPSAtMTsKKwlHLm9fZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19FWENMOworCWlmIChHLmZuYW1lX291dCkgeyAvKiAtTyBGSUxFID8gKi8KKwkJaWYgKExPTkVfREFTSChHLmZuYW1lX291dCkpIHsgLyogLU8gLSA/ICovCisJCQlHLm91dHB1dF9mZCA9IDE7CisJCQlvcHRpb25fbWFzazMyICY9IH5XR0VUX09QVF9DT05USU5VRTsKKwkJfQorCQkvKiBjb21wYXQgd2l0aCB3Z2V0OiAtTyBGSUxFIGNhbiBvdmVyd3JpdGUgKi8KKwkJRy5vX2ZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwl9CisKKwl3aGlsZSAoKmFyZ3YpCisJCWRvd25sb2FkX29uZV91cmwoKmFyZ3YrKyk7CisKKwlpZiAoRy5vdXRwdXRfZmQgPj0gMCkKKwkJeGNsb3NlKEcub3V0cHV0X2ZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3dob2lzLmMgYi9uZXR3b3JraW5nL3dob2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzMzAzMwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvd2hvaXMuYwpAQCAtMCwwICsxLDY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3aG9pcyAtIHRpbnkgY2xpZW50IGZvciB0aGUgd2hvaXMgZGlyZWN0b3J5IHNlcnZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGVyZSBPcmdhIDxnb3RydW5rc0BnbWFpbC5jb20+CisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBUT0RPCisgKiBBZGQgaXB2NiBzdXBwb3J0CisgKiBBZGQgcHJveHkgc3VwcG9ydAorICovCisKKy8vY29uZmlnOmNvbmZpZyBXSE9JUworLy9jb25maWc6CWJvb2wgIndob2lzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHdob2lzIGlzIGEgY2xpZW50IGZvciB0aGUgd2hvaXMgZGlyZWN0b3J5IHNlcnZpY2UKKworLy9hcHBsZXQ6SUZfV0hPSVMoQVBQTEVUKHdob2lzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1dIT0lTKSArPSB3aG9pcy5vCisKKy8vdXNhZ2U6I2RlZmluZSB3aG9pc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1oIFNFUlZFUl0gWy1wIFBPUlRdIE5BTUUuLi4iCisvL3VzYWdlOiNkZWZpbmUgd2hvaXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJRdWVyeSBXSE9JUyBpbmZvIGFib3V0IE5BTUVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWgsLXAJU2VydmVyIHRvIHF1ZXJ5IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIHZvaWQgcGlwZV9vdXQoaW50IGZkKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzEwMjRdOworCisJZnAgPSB4ZmRvcGVuX2Zvcl9yZWFkKGZkKTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWNoYXIgKnAgPSBzdHJwYnJrKGJ1ZiwgIlxyXG4iKTsKKwkJaWYgKHApCisJCQkqcCA9ICdcMCc7CisJCXB1dHMoYnVmKTsKKwl9CisKKwlmY2xvc2UoZnApOyAvKiBjbG9zZXMgZmQgdG9vICovCit9CisKK2ludCB3aG9pc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2hvaXNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBwb3J0ID0gNDM7CisJY29uc3QgY2hhciAqaG9zdCA9ICJ3aG9pcy1zZXJ2ZXJzLm5ldCI7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpwKyI7CisJZ2V0b3B0MzIoYXJndiwgImg6cDoiLCAmaG9zdCwgJnBvcnQpOworCisJYXJndiArPSBvcHRpbmQ7CisJZG8geworCQlpbnQgZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShob3N0LCBwb3J0KTsKKwkJZmRwcmludGYoZmQsICIlc1xyXG4iLCAqYXJndik7CisJCXBpcGVfb3V0KGZkKTsKKwl9CisJd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvemNpcC5jIGIvbmV0d29ya2luZy96Y2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNWVjYQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvemNpcC5jCkBAIC0wLDAgKzEsNTc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSRkMzOTI3IFplcm9Db25mIElQdjQgTGluay1Mb2NhbCBhZGRyZXNzaW5nCisgKiAoc2VlIDxodHRwOi8vd3d3Lnplcm9jb25mLm9yZy8+KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBcnRodXIgdmFuIEhvZmYgKGF2aEBzdHJhbmdlYmVycnkuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IERhdmlkIEJyb3duZWxsCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogWkNJUCBqdXN0IG1hbmFnZXMgdGhlIDE2OS4yNTQuKi4qIGFkZHJlc3Nlcy4gIFRoYXQgbmV0d29yayBpcyBub3QKKyAqIHJvdXRlZCBhdCB0aGUgSVAgbGV2ZWwsIHRob3VnaCB2YXJpb3VzIHByb3hpZXMgb3IgYnJpZGdlcyBjYW4KKyAqIGNlcnRhaW5seSBiZSB1c2VkLiAgSXRzIG5hbWluZyBpcyBidWlsdCBvdmVyIG11bHRpY2FzdCBETlMuCisgKi8KKworLy8jZGVmaW5lIERFQlVHCisKKy8vIFRPRE86CisvLyAtIG1vcmUgcmVhbC13b3JsZCB1c2FnZS90ZXN0aW5nLCBlc3BlY2lhbGx5IGRhZW1vbiBtb2RlCisvLyAtIGtlcm5lbCBwYWNrZXQgZmlsdGVycyB0byByZWR1Y2Ugc2NoZWR1bGluZyBub2lzZQorLy8gLSBhdm9pZCBzaWxlbnQgc2NyaXB0IGZhaWx1cmVzLCBlc3BlY2lhbGx5IHVuZGVyIGxvYWQuLi4KKy8vIC0gbGluayBzdGF0dXMgbW9uaXRvcmluZyAocmVzdGFydCBvbiBsaW5rLXVwOyBzdG9wIG9uIGxpbmstZG93bikKKworLy91c2FnZTojZGVmaW5lIHpjaXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBJRkFDRSBTQ1JJUFQiCisvL3VzYWdlOiNkZWZpbmUgemNpcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1hbmFnZSBhIFplcm9Db25mIElQdjQgbGluay1sb2NhbCBhZGRyZXNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCQlSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aXQgYWZ0ZXIgb2J0YWluaW5nIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1yIDE2OS4yNTQueC54CVJlcXVlc3QgdGhpcyBhZGRyZXNzIGZpcnN0IgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuV2l0aCBubyAtcSwgcnVucyBjb250aW51b3VzbHkgbW9uaXRvcmluZyBmb3IgQVJQIGNvbmZsaWN0cywiCisvL3VzYWdlOiAgICAgIlxuZXhpdHMgb25seSBvbiBJL08gZXJyb3JzIChsaW5rIGRvd24gZXRjKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworLyogV2UgZG9uJ3QgbmVlZCBtb3JlIHRoYW4gMzIgYml0cyBvZiB0aGUgY291bnRlciAqLworI2RlZmluZSBNT05PVE9OSUNfVVMoKSAoKHVuc2lnbmVkKW1vbm90b25pY191cygpKQorCitzdHJ1Y3QgYXJwX3BhY2tldCB7CisJc3RydWN0IGV0aGVyX2hlYWRlciBldGg7CisJc3RydWN0IGV0aGVyX2FycCBhcnA7Cit9IFBBQ0tFRDsKKworZW51bSB7CisvKiAxNjkuMjU0LjAuMCAqLworCUxJTktMT0NBTF9BRERSID0gMHhhOWZlMDAwMCwKKworLyogcHJvdG9jb2wgdGltZW91dCBwYXJhbWV0ZXJzLCBzcGVjaWZpZWQgaW4gc2Vjb25kcyAqLworCVBST0JFX1dBSVQgPSAxLAorCVBST0JFX01JTiA9IDEsCisJUFJPQkVfTUFYID0gMiwKKwlQUk9CRV9OVU0gPSAzLAorCU1BWF9DT05GTElDVFMgPSAxMCwKKwlSQVRFX0xJTUlUX0lOVEVSVkFMID0gNjAsCisJQU5OT1VOQ0VfV0FJVCA9IDIsCisJQU5OT1VOQ0VfTlVNID0gMiwKKwlBTk5PVU5DRV9JTlRFUlZBTCA9IDIsCisJREVGRU5EX0lOVEVSVkFMID0gMTAKK307CisKKy8qIFN0YXRlcyBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gKi8KK2VudW0geworCVBST0JFID0gMCwKKwlSQVRFX0xJTUlUX1BST0JFLAorCUFOTk9VTkNFLAorCU1PTklUT1IsCisJREVGRU5ECit9OworCisjZGVmaW5lIFZEQkcoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisKKworZW51bSB7CisJc29ja19mZCA9IDMKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3Qgc29ja2FkZHIgc2FkZHI7CisJc3RydWN0IGV0aGVyX2FkZHIgZXRoX2FkZHI7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBzYWRkciAgICAoRy5zYWRkciAgICkKKyNkZWZpbmUgZXRoX2FkZHIgKEcuZXRoX2FkZHIpCisKKworLyoqCisgKiBQaWNrIGEgcmFuZG9tIGxpbmsgbG9jYWwgSVAgYWRkcmVzcyBvbiAxNjkuMjU0LzE2LCBleGNlcHQgdGhhdAorICogdGhlIGZpcnN0IGFuZCBsYXN0IDI1NiBhZGRyZXNzZXMgYXJlIHJlc2VydmVkLgorICovCitzdGF0aWMgdWludDMyX3QgcGljayh2b2lkKQoreworCXVuc2lnbmVkIHRtcDsKKworCWRvIHsKKwkJdG1wID0gcmFuZCgpICYgSU5fQ0xBU1NCX0hPU1Q7CisJfSB3aGlsZSAodG1wID4gKElOX0NMQVNTQl9IT1NUIC0gMHgwMjAwKSk7CisJcmV0dXJuIGh0b25sKChMSU5LTE9DQUxfQUREUiArIDB4MDEwMCkgKyB0bXApOworfQorCisvKioKKyAqIEJyb2FkY2FzdCBhbiBBUlAgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCBhcnAoCisJLyogaW50IG9wLCAtIGFsd2F5cyBBUlBPUF9SRVFVRVNUICovCisJLyogY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKnNvdXJjZV9ldGgsIC0gYWx3YXlzICZldGhfYWRkciAqLworCQkJCQlzdHJ1Y3QgaW5fYWRkciBzb3VyY2VfaXAsCisJY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKnRhcmdldF9ldGgsIHN0cnVjdCBpbl9hZGRyIHRhcmdldF9pcCkKK3sKKwllbnVtIHsgb3AgPSBBUlBPUF9SRVFVRVNUIH07CisjZGVmaW5lIHNvdXJjZV9ldGggKCZldGhfYWRkcikKKworCXN0cnVjdCBhcnBfcGFja2V0IHA7CisJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOworCisJLy8gZXRoZXIgaGVhZGVyCisJcC5ldGguZXRoZXJfdHlwZSA9IGh0b25zKEVUSEVSVFlQRV9BUlApOworCW1lbWNweShwLmV0aC5ldGhlcl9zaG9zdCwgc291cmNlX2V0aCwgRVRIX0FMRU4pOworCW1lbXNldChwLmV0aC5ldGhlcl9kaG9zdCwgMHhmZiwgRVRIX0FMRU4pOworCisJLy8gYXJwIHJlcXVlc3QKKwlwLmFycC5hcnBfaHJkID0gaHRvbnMoQVJQSFJEX0VUSEVSKTsKKwlwLmFycC5hcnBfcHJvID0gaHRvbnMoRVRIRVJUWVBFX0lQKTsKKwlwLmFycC5hcnBfaGxuID0gRVRIX0FMRU47CisJcC5hcnAuYXJwX3BsbiA9IDQ7CisJcC5hcnAuYXJwX29wID0gaHRvbnMob3ApOworCW1lbWNweSgmcC5hcnAuYXJwX3NoYSwgc291cmNlX2V0aCwgRVRIX0FMRU4pOworCW1lbWNweSgmcC5hcnAuYXJwX3NwYSwgJnNvdXJjZV9pcCwgc2l6ZW9mKHAuYXJwLmFycF9zcGEpKTsKKwltZW1jcHkoJnAuYXJwLmFycF90aGEsIHRhcmdldF9ldGgsIEVUSF9BTEVOKTsKKwltZW1jcHkoJnAuYXJwLmFycF90cGEsICZ0YXJnZXRfaXAsIHNpemVvZihwLmFycC5hcnBfdHBhKSk7CisKKwkvLyBzZW5kIGl0CisJLy8gRXZlbiB0aG91Z2ggc29ja19mZCBpcyBhbHJlYWR5IGJvdW5kIHRvIHNhZGRyLCBqdXN0IHNlbmQoKQorCS8vIHdvbid0IHdvcmssIGJlY2F1c2UgInNvY2tldCBpcyBub3QgY29ubmVjdGVkIgorCS8vIChhbmQgY29ubmVjdCgpIHdvbid0IGZpeCB0aGF0LCAib3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiKS4KKwkvLyBUaHVzIHdlIHNlbmR0bygpIHRvIHNhZGRyLiBJIHdvbmRlciB3aGljaCBzb2NrYWRkcgorCS8vIChmcm9tIGJpbmQoKSBvciBmcm9tIHNlbmR0bygpPykga2VybmVsIGFjdHVhbGx5IHVzZXMKKwkvLyB0byBkZXRlcm1pbmUgaWZhY2UgdG8gZW1pdCB0aGUgcGFja2V0IGZyb20uLi4KKwl4c2VuZHRvKHNvY2tfZmQsICZwLCBzaXplb2YocCksICZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisjdW5kZWYgc291cmNlX2V0aAorfQorCisvKioKKyAqIFJ1biBhIHNjcmlwdC4KKyAqIGFyZ3ZbMF06aW50ZiBhcmd2WzFdOnNjcmlwdF9uYW1lIGFyZ3ZbMl06anVuayBhcmd2WzNdOk5VTEwKKyAqLworc3RhdGljIGludCBydW4oY2hhciAqYXJndlszXSwgY29uc3QgY2hhciAqcGFyYW0sIHN0cnVjdCBpbl9hZGRyICppcCkKK3sKKwlpbnQgc3RhdHVzOworCWNoYXIgKmFkZHIgPSBhZGRyOyAvKiBmb3IgZ2NjICovCisJY29uc3QgY2hhciAqZm10ID0gIiVzICVzICVzIiArIDM7CisKKwlhcmd2WzJdID0gKGNoYXIqKXBhcmFtOworCisJVkRCRygiJXMgcnVuICVzICVzXG4iLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCWlmIChpcCkgeworCQlhZGRyID0gaW5ldF9udG9hKCppcCk7CisJCXhzZXRlbnYoImlwIiwgYWRkcik7CisJCWZtdCAtPSAzOworCX0KKwliYl9pbmZvX21zZyhmbXQsIGFyZ3ZbMl0sIGFyZ3ZbMF0sIGFkZHIpOworCisJc3RhdHVzID0gc3Bhd25fYW5kX3dhaXQoYXJndiArIDEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIiVzICVzICVzIiArIDMsIGFyZ3ZbMl0sIGFyZ3ZbMF0pOworCQlyZXR1cm4gLWVycm5vOworCX0KKwlpZiAoc3RhdHVzICE9IDApCisJCWJiX2Vycm9yX21zZygic2NyaXB0ICVzICVzIGZhaWxlZCwgZXhpdGNvZGU9JWQiLCBhcmd2WzFdLCBhcmd2WzJdLCBzdGF0dXMgJiAweGZmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFJldHVybiBtaWxsaXNlY29uZHMgb2YgcmFuZG9tIGRlbGF5LCB1cCB0byAic2VjcyIgc2Vjb25kcy4KKyAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgcmFuZG9tX2RlbGF5X21zKHVuc2lnbmVkIHNlY3MpCit7CisJcmV0dXJuIHJhbmQoKSAlIChzZWNzICogMTAwMCk7Cit9CisKKy8qKgorICogbWFpbiBwcm9ncmFtCisgKi8KK2ludCB6Y2lwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB6Y2lwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdGU7CisJY2hhciAqcl9vcHQ7CisJdW5zaWduZWQgb3B0czsKKworCS8vIHVnbHkgdHJpY2ssIGJ1dCBJIHdhbnQgdGhlc2UgemVyb2VkIGluIG9uZSBnbworCXN0cnVjdCB7CisJCWNvbnN0IHN0cnVjdCBpbl9hZGRyIG51bGxfaXA7CisJCWNvbnN0IHN0cnVjdCBldGhlcl9hZGRyIG51bGxfYWRkcjsKKwkJc3RydWN0IGluX2FkZHIgaXA7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCWludCB0aW1lb3V0X21zOyAvKiBtdXN0IGJlIHNpZ25lZCAqLworCQl1bnNpZ25lZCBjb25mbGljdHM7CisJCXVuc2lnbmVkIG5wcm9iZXM7CisJCXVuc2lnbmVkIG5jbGFpbXM7CisJCWludCByZWFkeTsKKwkJaW50IHZlcmJvc2U7CisJfSBMOworI2RlZmluZSBudWxsX2lwICAgIChMLm51bGxfaXAgICApCisjZGVmaW5lIG51bGxfYWRkciAgKEwubnVsbF9hZGRyICkKKyNkZWZpbmUgaXAgICAgICAgICAoTC5pcCAgICAgICAgKQorI2RlZmluZSBpZnIgICAgICAgIChMLmlmciAgICAgICApCisjZGVmaW5lIHRpbWVvdXRfbXMgKEwudGltZW91dF9tcykKKyNkZWZpbmUgY29uZmxpY3RzICAoTC5jb25mbGljdHMgKQorI2RlZmluZSBucHJvYmVzICAgIChMLm5wcm9iZXMgICApCisjZGVmaW5lIG5jbGFpbXMgICAgKEwubmNsYWltcyAgICkKKyNkZWZpbmUgcmVhZHkgICAgICAoTC5yZWFkeSAgICAgKQorI2RlZmluZSB2ZXJib3NlICAgIChMLnZlcmJvc2UgICApCisKKwltZW1zZXQoJkwsIDAsIHNpemVvZihMKSk7CisKKyNkZWZpbmUgRk9SRUdST1VORCAob3B0cyAmIDEpCisjZGVmaW5lIFFVSVQgICAgICAgKG9wdHMgJiAyKQorCS8vIHBhcnNlIGNvbW1hbmRsaW5lOiBwcm9nIFtvcHRpb25zXSBpZm5hbWUgc2NyaXB0CisJLy8gZXhhY3RseSAyIGFyZ3M7IC12IGFjY3VtdWxhdGVzIGFuZCBpbXBsaWVzIC1mCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTI6dnY6dmYiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZnFyOnYiLCAmcl9vcHQsICZ2ZXJib3NlKTsKKyNpZiAhQkJfTU1VCisJLy8gb24gTk9NTVUgcmVleGVjIGVhcmx5IChvciBlbHNlIHdlIHdpbGwgcmVydW4gdGhpbmdzIHR3aWNlKQorCWlmICghRk9SRUdST1VORCkKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAgLyp3YXM6IERBRU1PTl9DSERJUl9ST09UKi8sIGFyZ3YpOworI2VuZGlmCisJLy8gb3BlbiBhbiBBUlAgc29ja2V0CisJLy8gKG5lZWQgdG8gZG8gaXQgYmVmb3JlIG9wZW5sb2cgdG8gcHJldmVudCBvcGVubG9nIGZyb20gdGFraW5nCisJLy8gZmQgMyAoc29ja19mZD09MykpCisJeG1vdmVfZmQoeHNvY2tldChBRl9QQUNLRVQsIFNPQ0tfUEFDS0VULCBodG9ucyhFVEhfUF9BUlApKSwgc29ja19mZCk7CisJaWYgKCFGT1JFR1JPVU5EKSB7CisJCS8vIGRvIGl0IGJlZm9yZSBhbGwgYmJfeHhfbXNnIGNhbGxzCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19EQUVNT04pOworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKwlpZiAob3B0cyAmIDQpIHsgLy8gLXIgbi5uLm4ubgorCQlpZiAoaW5ldF9hdG9uKHJfb3B0LCAmaXApID09IDAKKwkJIHx8IChudG9obChpcC5zX2FkZHIpICYgSU5fQ0xBU1NCX05FVCkgIT0gTElOS0xPQ0FMX0FERFIKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBsaW5rIGFkZHJlc3MiKTsKKwkJfQorCX0KKwlhcmd2ICs9IG9wdGluZCAtIDE7CisKKwkvKiBOb3c6IGFyZ3ZbMF06anVuayBhcmd2WzFdOmludGYgYXJndlsyXTpzY3JpcHQgYXJndlszXTpOVUxMICovCisJLyogV2UgbmVlZCB0byBtYWtlIHNwYWNlIGZvciBzY3JpcHQgYXJndW1lbnQ6ICovCisJYXJndlswXSA9IGFyZ3ZbMV07CisJYXJndlsxXSA9IGFyZ3ZbMl07CisJLyogTm93OiBhcmd2WzBdOmludGYgYXJndlsxXTpzY3JpcHQgYXJndlsyXTpqdW5rIGFyZ3ZbM106TlVMTCAqLworI2RlZmluZSBhcmd2X2ludGYgKGFyZ3ZbMF0pCisKKwl4c2V0ZW52KCJpbnRlcmZhY2UiLCBhcmd2X2ludGYpOworCisJLy8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlIChtb2Rwcm9iZSwgaWZ1cCwgZXRjKQorCWlmIChydW4oYXJndiwgImluaXQiLCBOVUxMKSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworCS8vIGluaXRpYWxpemUgc2FkZHIKKwkvLyBzYWRkciBpczogeyB1MTYgc2FfZmFtaWx5OyB1OCBzYV9kYXRhWzE0XTsgfQorCS8vbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisJLy9UT0RPOiBhcmUgd2UgbGVhdmluZyBzYV9mYW1pbHkgPT0gMCAoQUZfVU5TUEVDKT8hCisJc2FmZV9zdHJuY3B5KHNhZGRyLnNhX2RhdGEsIGFyZ3ZfaW50Ziwgc2l6ZW9mKHNhZGRyLnNhX2RhdGEpKTsKKworCS8vIGJpbmQgdG8gdGhlIGludGVyZmFjZSdzIEFSUCBzb2NrZXQKKwl4YmluZChzb2NrX2ZkLCAmc2FkZHIsIHNpemVvZihzYWRkcikpOworCisJLy8gZ2V0IHRoZSBpbnRlcmZhY2UncyBldGhlcm5ldCBhZGRyZXNzCisJLy9tZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBhcmd2X2ludGYpOworCXhpb2N0bChzb2NrX2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKTsKKwltZW1jcHkoJmV0aF9hZGRyLCAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCisJLy8gc3RhcnQgd2l0aCBzb21lIHN0YWJsZSBpcCBhZGRyZXNzLCBlaXRoZXIgYSBmdW5jdGlvbiBvZgorCS8vIHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9yIGVsc2UgdGhlIGxhc3QgYWRkcmVzcyB3ZSB1c2VkLgorCS8vIHdlIGFyZSB0YWtpbmcgbG93LW9yZGVyIGZvdXIgYnl0ZXMsIGFzIHRvcC1vcmRlciBvbmVzCisJLy8gYXJlbid0IHJhbmRvbSBlbm91Z2guCisJLy8gTk9URTogdGhlIHNlcXVlbmNlIG9mIGFkZHJlc3NlcyB3ZSB0cnkgY2hhbmdlcyBvbmx5CisJLy8gZGVwZW5kaW5nIG9uIHdoZW4gd2UgZGV0ZWN0IGNvbmZsaWN0cy4KKwl7CisJCXVpbnQzMl90IHQ7CisJCW1vdmVfZnJvbV91bmFsaWduZWQzMih0LCAoKGNoYXIgKikmZXRoX2FkZHIgKyAyKSk7CisJCXNyYW5kKHQpOworCX0KKwlpZiAoaXAuc19hZGRyID09IDApCisJCWlwLnNfYWRkciA9IHBpY2soKTsKKworCS8vIEZJWE1FIGNhc2VzIHRvIGhhbmRsZToKKwkvLyAgLSB6Y2lwIGFscmVhZHkgcnVubmluZyEKKwkvLyAgLSBsaW5rIGFscmVhZHkgaGFzIGxvY2FsIGFkZHJlc3MuLi4ganVzdCBkZWZlbmQvdXBkYXRlCisKKwkvLyBkYWVtb25pemUgbm93OyBkb24ndCBkZWxheSBzeXN0ZW0gc3RhcnR1cAorCWlmICghRk9SRUdST1VORCkgeworI2lmIEJCX01NVQorCQliYl9kYWVtb25pemUoMCAvKndhczogREFFTU9OX0NIRElSX1JPT1QqLyk7CisjZW5kaWYKKwkJYmJfaW5mb19tc2coInN0YXJ0LCBpbnRlcmZhY2UgJXMiLCBhcmd2X2ludGYpOworCX0KKworCS8vIHJ1biB0aGUgZHluYW1pYyBhZGRyZXNzIG5lZ290aWF0aW9uIHByb3RvY29sLAorCS8vIHJlc3RhcnRpbmcgYWZ0ZXIgYWRkcmVzcyBjb25mbGljdHM6CisJLy8gIC0gc3RhcnQgd2l0aCBzb21lIGFkZHJlc3Mgd2Ugd2FudCB0byB0cnkKKwkvLyAgLSBzaG9ydCByYW5kb20gZGVsYXkKKwkvLyAgLSBhcnAgcHJvYmVzIHRvIHNlZSBpZiBhbm90aGVyIGhvc3QgdXNlcyBpdAorCS8vICAtIGFycCBhbm5vdW5jZW1lbnRzIHRoYXQgd2UncmUgY2xhaW1pbmcgaXQKKwkvLyAgLSB1c2UgaXQKKwkvLyAgLSBkZWZlbmQgaXQsIHdpdGhpbiBsaW1pdHMKKwkvLyBleGl0IGlmOgorCS8vIC0gYWRkcmVzcyBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQgYW5kIC1xIHdhcyBnaXZlbjoKKwkvLyAgIHJ1biAiPHNjcmlwdD4gY29uZmlnIiwgdGhlbiBleGl0IHdpdGggZXhpdGNvZGUgMAorCS8vIC0gcG9sbCBlcnJvciAod2hlbiBkb2VzIHRoaXMgaGFwcGVuPykKKwkvLyAtIHJlYWQgZXJyb3IgKHdoZW4gZG9lcyB0aGlzIGhhcHBlbj8pCisJLy8gLSBzZW5kdG8gZXJyb3IgKGluIGFycCgpKSAod2hlbiBkb2VzIHRoaXMgaGFwcGVuPykKKwkvLyAtIHJldmVudHMgJiBQT0xMRVJSIChsaW5rIGRvd24pLiBydW4gIjxzY3JpcHQ+IGRlY29uZmlnIiBmaXJzdAorCXN0YXRlID0gUFJPQkU7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHBvbGxmZCBmZHNbMV07CisJCXVuc2lnbmVkIGRlYWRsaW5lX3VzOworCQlzdHJ1Y3QgYXJwX3BhY2tldCBwOworCQlpbnQgc291cmNlX2lwX2NvbmZsaWN0OworCQlpbnQgdGFyZ2V0X2lwX2NvbmZsaWN0OworCisJCWZkc1swXS5mZCA9IHNvY2tfZmQ7CisJCWZkc1swXS5ldmVudHMgPSBQT0xMSU47CisJCWZkc1swXS5yZXZlbnRzID0gMDsKKworCQkvLyBwb2xsLCBiZWluZyByZWFkeSB0byBhZGp1c3QgY3VycmVudCB0aW1lb3V0CisJCWlmICghdGltZW91dF9tcykgeworCQkJdGltZW91dF9tcyA9IHJhbmRvbV9kZWxheV9tcyhQUk9CRV9XQUlUKTsKKwkJCS8vIEZJWE1FIHNldHNvY2tvcHQoc29ja19mZCwgU09fQVRUQUNIX0ZJTFRFUiwgLi4uKSB0bworCQkJLy8gbWFrZSB0aGUga2VybmVsIGZpbHRlciBvdXQgYWxsIHBhY2tldHMgZXhjZXB0CisJCQkvLyBvbmVzIHdlJ2QgY2FyZSBhYm91dC4KKwkJfQorCQkvLyBzZXQgZGVhZGxpbmVfdXMgdG8gdGhlIHBvaW50IGluIHRpbWUgd2hlbiB3ZSB0aW1lb3V0CisJCWRlYWRsaW5lX3VzID0gTU9OT1RPTklDX1VTKCkgKyB0aW1lb3V0X21zICogMTAwMDsKKworCQlWREJHKCIuLi53YWl0ICVkICVzIG5wcm9iZXM9JXUsIG5jbGFpbXM9JXVcbiIsCisJCQkJdGltZW91dF9tcywgYXJndl9pbnRmLCBucHJvYmVzLCBuY2xhaW1zKTsKKworCQlzd2l0Y2ggKHNhZmVfcG9sbChmZHMsIDEsIHRpbWVvdXRfbXMpKSB7CisKKwkJZGVmYXVsdDoKKwkJCS8vYmJfcGVycm9yX21zZygicG9sbCIpOyAtIGRvbmUgaW4gc2FmZV9wb2xsCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJCS8vIHRpbWVvdXQKKwkJY2FzZSAwOgorCQkJVkRCRygic3RhdGUgPSAlZFxuIiwgc3RhdGUpOworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBQUk9CRToKKwkJCQkvLyB0aW1lb3V0cyBpbiB0aGUgUFJPQkUgc3RhdGUgbWVhbiBubyBjb25mbGljdGluZyBBUlAgcGFja2V0cworCQkJCS8vIGhhdmUgYmVlbiByZWNlaXZlZCwgc28gd2UgY2FuIHByb2dyZXNzIHRocm91Z2ggdGhlIHN0YXRlcworCQkJCWlmIChucHJvYmVzIDwgUFJPQkVfTlVNKSB7CisJCQkJCW5wcm9iZXMrKzsKKwkJCQkJVkRCRygicHJvYmUvJXUgJXNAJXNcbiIsCisJCQkJCQkJbnByb2JlcywgYXJndl9pbnRmLCBpbmV0X250b2EoaXApKTsKKwkJCQkJYXJwKC8qIEFSUE9QX1JFUVVFU1QsICovCisJCQkJCQkJLyogJmV0aF9hZGRyLCAqLyBudWxsX2lwLAorCQkJCQkJCSZudWxsX2FkZHIsIGlwKTsKKwkJCQkJdGltZW91dF9tcyA9IFBST0JFX01JTiAqIDEwMDA7CisJCQkJCXRpbWVvdXRfbXMgKz0gcmFuZG9tX2RlbGF5X21zKFBST0JFX01BWCAtIFBST0JFX01JTik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvLyBTd2l0Y2ggdG8gYW5ub3VuY2Ugc3RhdGUuCisJCQkJCXN0YXRlID0gQU5OT1VOQ0U7CisJCQkJCW5jbGFpbXMgPSAwOworCQkJCQlWREJHKCJhbm5vdW5jZS8ldSAlc0Alc1xuIiwKKwkJCQkJCQluY2xhaW1zLCBhcmd2X2ludGYsIGluZXRfbnRvYShpcCkpOworCQkJCQlhcnAoLyogQVJQT1BfUkVRVUVTVCwgKi8KKwkJCQkJCQkvKiAmZXRoX2FkZHIsICovIGlwLAorCQkJCQkJCSZldGhfYWRkciwgaXApOworCQkJCQl0aW1lb3V0X21zID0gQU5OT1VOQ0VfSU5URVJWQUwgKiAxMDAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUkFURV9MSU1JVF9QUk9CRToKKwkJCQkvLyB0aW1lb3V0cyBpbiB0aGUgUkFURV9MSU1JVF9QUk9CRSBzdGF0ZSBtZWFuIG5vIGNvbmZsaWN0aW5nIEFSUCBwYWNrZXRzCisJCQkJLy8gaGF2ZSBiZWVuIHJlY2VpdmVkLCBzbyB3ZSBjYW4gbW92ZSBpbW1lZGlhdGVseSB0byB0aGUgYW5ub3VuY2Ugc3RhdGUKKwkJCQlzdGF0ZSA9IEFOTk9VTkNFOworCQkJCW5jbGFpbXMgPSAwOworCQkJCVZEQkcoImFubm91bmNlLyV1ICVzQCVzXG4iLAorCQkJCQkJbmNsYWltcywgYXJndl9pbnRmLCBpbmV0X250b2EoaXApKTsKKwkJCQlhcnAoLyogQVJQT1BfUkVRVUVTVCwgKi8KKwkJCQkJCS8qICZldGhfYWRkciwgKi8gaXAsCisJCQkJCQkmZXRoX2FkZHIsIGlwKTsKKwkJCQl0aW1lb3V0X21zID0gQU5OT1VOQ0VfSU5URVJWQUwgKiAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBBTk5PVU5DRToKKwkJCQkvLyB0aW1lb3V0cyBpbiB0aGUgQU5OT1VOQ0Ugc3RhdGUgbWVhbiBubyBjb25mbGljdGluZyBBUlAgcGFja2V0cworCQkJCS8vIGhhdmUgYmVlbiByZWNlaXZlZCwgc28gd2UgY2FuIHByb2dyZXNzIHRocm91Z2ggdGhlIHN0YXRlcworCQkJCWlmIChuY2xhaW1zIDwgQU5OT1VOQ0VfTlVNKSB7CisJCQkJCW5jbGFpbXMrKzsKKwkJCQkJVkRCRygiYW5ub3VuY2UvJXUgJXNAJXNcbiIsCisJCQkJCQkJbmNsYWltcywgYXJndl9pbnRmLCBpbmV0X250b2EoaXApKTsKKwkJCQkJYXJwKC8qIEFSUE9QX1JFUVVFU1QsICovCisJCQkJCQkJLyogJmV0aF9hZGRyLCAqLyBpcCwKKwkJCQkJCQkmZXRoX2FkZHIsIGlwKTsKKwkJCQkJdGltZW91dF9tcyA9IEFOTk9VTkNFX0lOVEVSVkFMICogMTAwMDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8vIFN3aXRjaCB0byBtb25pdG9yIHN0YXRlLgorCQkJCQlzdGF0ZSA9IE1PTklUT1I7CisJCQkJCS8vIGxpbmsgaXMgb2sgdG8gdXNlIGVhcmxpZXIKKwkJCQkJLy8gRklYTUUgdXBkYXRlIGZpbHRlcnMKKwkJCQkJcnVuKGFyZ3YsICJjb25maWciLCAmaXApOworCQkJCQlyZWFkeSA9IDE7CisJCQkJCWNvbmZsaWN0cyA9IDA7CisJCQkJCXRpbWVvdXRfbXMgPSAtMTsgLy8gTmV2ZXIgdGltZW91dCBpbiB0aGUgbW9uaXRvciBzdGF0ZS4KKworCQkJCQkvLyBOT1RFOiBhbGwgb3RoZXIgZXhpdCBwYXRocworCQkJCQkvLyBzaG91bGQgZGVjb25maWcgLi4uCisJCQkJCWlmIChRVUlUKQorCQkJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERFRkVORDoKKwkJCQkvLyBXZSB3b24hICBObyBBUlAgcmVwbGllcywgc28ganVzdCBnbyBiYWNrIHRvIG1vbml0b3IuCisJCQkJc3RhdGUgPSBNT05JVE9SOworCQkJCXRpbWVvdXRfbXMgPSAtMTsKKwkJCQljb25mbGljdHMgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBJbnZhbGlkLCBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgUmVzdGFydCB0aGUgd2hvbGUgcHJvdG9jb2wuCisJCQkJc3RhdGUgPSBQUk9CRTsKKwkJCQlpcC5zX2FkZHIgPSBwaWNrKCk7CisJCQkJdGltZW91dF9tcyA9IDA7CisJCQkJbnByb2JlcyA9IDA7CisJCQkJbmNsYWltcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9IC8vIHN3aXRjaCAoc3RhdGUpCisJCQlicmVhazsgLy8gY2FzZSAwICh0aW1lb3V0KQorCisJCS8vIHBhY2tldHMgYXJyaXZpbmcsIG9yIGxpbmsgd2VudCBkb3duCisJCWNhc2UgMToKKwkJCS8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0aW1lb3V0IGluIGNhc2Ugd2UgZGlkbid0IHJlY2VpdmUKKwkJCS8vIGEgY29uZmxpY3RpbmcgcGFja2V0LgorCQkJaWYgKHRpbWVvdXRfbXMgPiAwKSB7CisJCQkJdW5zaWduZWQgZGlmZiA9IGRlYWRsaW5lX3VzIC0gTU9OT1RPTklDX1VTKCk7CisJCQkJaWYgKChpbnQpKGRpZmYpIDwgMCkgeworCQkJCQkvLyBDdXJyZW50IHRpbWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBleHBlY3RlZCB0aW1lb3V0IHRpbWUuCisJCQkJCS8vIFNob3VsZCBuZXZlciBoYXBwZW4uCisJCQkJCVZEQkcoIm1pc3NlZCBhbiBleHBlY3RlZCB0aW1lb3V0XG4iKTsKKwkJCQkJdGltZW91dF9tcyA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJVkRCRygiYWRqdXN0aW5nIHRpbWVvdXRcbiIpOworCQkJCQl0aW1lb3V0X21zID0gKGRpZmYgLyAxMDAwKSB8IDE7IC8qIG5ldmVyIDAgKi8KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pID09IDApIHsKKwkJCQlpZiAoZmRzWzBdLnJldmVudHMgJiBQT0xMRVJSKSB7CisJCQkJCS8vIEZJWE1FOiBsaW5rcyByb3V0aW5lbHkgZ28gZG93bjsKKwkJCQkJLy8gdGhpcyBzaG91bGRuJ3QgbmVjZXNzYXJpbHkgZXhpdC4KKwkJCQkJYmJfZXJyb3JfbXNnKCJpZmFjZSAlcyBpcyBkb3duIiwgYXJndl9pbnRmKTsKKwkJCQkJaWYgKHJlYWR5KSB7CisJCQkJCQlydW4oYXJndiwgImRlY29uZmlnIiwgJmlwKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gcmVhZCBBUlAgcGFja2V0CisJCQlpZiAoc2FmZV9yZWFkKHNvY2tfZmQsICZwLCBzaXplb2YocCkpIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQl9CisJCQlpZiAocC5ldGguZXRoZXJfdHlwZSAhPSBodG9ucyhFVEhFUlRZUEVfQVJQKSkKKwkJCQljb250aW51ZTsKKyNpZmRlZiBERUJVRworCQkJeworCQkJCXN0cnVjdCBldGhlcl9hZGRyICpzaGEgPSAoc3RydWN0IGV0aGVyX2FkZHIgKikgcC5hcnAuYXJwX3NoYTsKKwkJCQlzdHJ1Y3QgZXRoZXJfYWRkciAqdGhhID0gKHN0cnVjdCBldGhlcl9hZGRyICopIHAuYXJwLmFycF90aGE7CisJCQkJc3RydWN0IGluX2FkZHIgKnNwYSA9IChzdHJ1Y3QgaW5fYWRkciAqKSBwLmFycC5hcnBfc3BhOworCQkJCXN0cnVjdCBpbl9hZGRyICp0cGEgPSAoc3RydWN0IGluX2FkZHIgKikgcC5hcnAuYXJwX3RwYTsKKwkJCQlWREJHKCIlcyByZWN2IGFycCB0eXBlPSVkLCBvcD0lZCxcbiIsCisJCQkJCWFyZ3ZfaW50ZiwgbnRvaHMocC5ldGguZXRoZXJfdHlwZSksCisJCQkJCW50b2hzKHAuYXJwLmFycF9vcCkpOworCQkJCVZEQkcoIlx0c291cmNlPSVzICVzXG4iLAorCQkJCQlldGhlcl9udG9hKHNoYSksCisJCQkJCWluZXRfbnRvYSgqc3BhKSk7CisJCQkJVkRCRygiXHR0YXJnZXQ9JXMgJXNcbiIsCisJCQkJCWV0aGVyX250b2EodGhhKSwKKwkJCQkJaW5ldF9udG9hKCp0cGEpKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHAuYXJwLmFycF9vcCAhPSBodG9ucyhBUlBPUF9SRVFVRVNUKQorCQkJICYmIHAuYXJwLmFycF9vcCAhPSBodG9ucyhBUlBPUF9SRVBMWSkpCisJCQkJY29udGludWU7CisKKwkJCXNvdXJjZV9pcF9jb25mbGljdCA9IDA7CisJCQl0YXJnZXRfaXBfY29uZmxpY3QgPSAwOworCisJCQlpZiAobWVtY21wKHAuYXJwLmFycF9zcGEsICZpcC5zX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDAKKwkJCSAmJiBtZW1jbXAoJnAuYXJwLmFycF9zaGEsICZldGhfYWRkciwgRVRIX0FMRU4pICE9IDAKKwkJCSkgeworCQkJCXNvdXJjZV9pcF9jb25mbGljdCA9IDE7CisJCQl9CisJCQlpZiAocC5hcnAuYXJwX29wID09IGh0b25zKEFSUE9QX1JFUVVFU1QpCisJCQkgJiYgbWVtY21wKHAuYXJwLmFycF90cGEsICZpcC5zX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDAKKwkJCSAmJiBtZW1jbXAoJnAuYXJwLmFycF90aGEsICZldGhfYWRkciwgRVRIX0FMRU4pICE9IDAKKwkJCSkgeworCQkJCXRhcmdldF9pcF9jb25mbGljdCA9IDE7CisJCQl9CisKKwkJCVZEQkcoInN0YXRlID0gJWQsIHNvdXJjZSBpcCBjb25mbGljdCA9ICVkLCB0YXJnZXQgaXAgY29uZmxpY3QgPSAlZFxuIiwKKwkJCQlzdGF0ZSwgc291cmNlX2lwX2NvbmZsaWN0LCB0YXJnZXRfaXBfY29uZmxpY3QpOworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBQUk9CRToKKwkJCWNhc2UgQU5OT1VOQ0U6CisJCQkJLy8gV2hlbiBwcm9iaW5nIG9yIGFubm91bmNpbmcsIGNoZWNrIGZvciBzb3VyY2UgSVAgY29uZmxpY3RzCisJCQkJLy8gYW5kIG90aGVyIGhvc3RzIGRvaW5nIEFSUCBwcm9iZXMgKHRhcmdldCBJUCBjb25mbGljdHMpLgorCQkJCWlmIChzb3VyY2VfaXBfY29uZmxpY3QgfHwgdGFyZ2V0X2lwX2NvbmZsaWN0KSB7CisJCQkJCWNvbmZsaWN0cysrOworCQkJCQlpZiAoY29uZmxpY3RzID49IE1BWF9DT05GTElDVFMpIHsKKwkJCQkJCVZEQkcoIiVzIHJhdGVsaW1pdFxuIiwgYXJndl9pbnRmKTsKKwkJCQkJCXRpbWVvdXRfbXMgPSBSQVRFX0xJTUlUX0lOVEVSVkFMICogMTAwMDsKKwkJCQkJCXN0YXRlID0gUkFURV9MSU1JVF9QUk9CRTsKKwkJCQkJfQorCisJCQkJCS8vIHJlc3RhcnQgdGhlIHdob2xlIHByb3RvY29sCisJCQkJCWlwLnNfYWRkciA9IHBpY2soKTsKKwkJCQkJdGltZW91dF9tcyA9IDA7CisJCQkJCW5wcm9iZXMgPSAwOworCQkJCQluY2xhaW1zID0gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIE1PTklUT1I6CisJCQkJLy8gSWYgYSBjb25mbGljdCwgd2UgdHJ5IHRvIGRlZmVuZCB3aXRoIGEgc2luZ2xlIEFSUCBwcm9iZS4KKwkJCQlpZiAoc291cmNlX2lwX2NvbmZsaWN0KSB7CisJCQkJCVZEQkcoIm1vbml0b3IgY29uZmxpY3QgLS0gZGVmZW5kaW5nXG4iKTsKKwkJCQkJc3RhdGUgPSBERUZFTkQ7CisJCQkJCXRpbWVvdXRfbXMgPSBERUZFTkRfSU5URVJWQUwgKiAxMDAwOworCQkJCQlhcnAoLyogQVJQT1BfUkVRVUVTVCwgKi8KKwkJCQkJCS8qICZldGhfYWRkciwgKi8gaXAsCisJCQkJCQkmZXRoX2FkZHIsIGlwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIERFRkVORDoKKwkJCQkvLyBXZWxsLCB3ZSB0cmllZC4gIFN0YXJ0IG92ZXIgKG9uIGNvbmZsaWN0KS4KKwkJCQlpZiAoc291cmNlX2lwX2NvbmZsaWN0KSB7CisJCQkJCXN0YXRlID0gUFJPQkU7CisJCQkJCVZEQkcoImRlZmVuZCBjb25mbGljdCAtLSBzdGFydGluZyBvdmVyXG4iKTsKKwkJCQkJcmVhZHkgPSAwOworCQkJCQlydW4oYXJndiwgImRlY29uZmlnIiwgJmlwKTsKKworCQkJCQkvLyByZXN0YXJ0IHRoZSB3aG9sZSBwcm90b2NvbAorCQkJCQlpcC5zX2FkZHIgPSBwaWNrKCk7CisJCQkJCXRpbWVvdXRfbXMgPSAwOworCQkJCQlucHJvYmVzID0gMDsKKwkJCQkJbmNsYWltcyA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBJbnZhbGlkLCBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgUmVzdGFydCB0aGUgd2hvbGUgcHJvdG9jb2wuCisJCQkJVkRCRygiaW52YWxpZCBzdGF0ZSAtLSBzdGFydGluZyBvdmVyXG4iKTsKKwkJCQlzdGF0ZSA9IFBST0JFOworCQkJCWlwLnNfYWRkciA9IHBpY2soKTsKKwkJCQl0aW1lb3V0X21zID0gMDsKKwkJCQlucHJvYmVzID0gMDsKKwkJCQluY2xhaW1zID0gMDsKKwkJCQlicmVhazsKKwkJCX0gLy8gc3dpdGNoIHN0YXRlCisJCQlicmVhazsgLy8gY2FzZSAxIChwYWNrZXRzIGFycml2aW5nKQorCQl9IC8vIHN3aXRjaCBwb2xsCisJfSAvLyB3aGlsZSAoMSkKKyN1bmRlZiBhcmd2X2ludGYKK30KZGlmZiAtLWdpdCBhL3ByaW50dXRpbHMvQ29uZmlnLmluIGIvcHJpbnR1dGlscy9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2NmJkZgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50dXRpbHMvQ29uZmlnLmluCkBAIC0wLDAgKzEsMjkgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJQcmludCBVdGlsaXRpZXMiCisKKworCitjb25maWcgTFBECisJYm9vbCAibHBkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwZCBpcyBhIHByaW50IHNwb29saW5nIGRhZW1vbi4KKworY29uZmlnIExQUgorCWJvb2wgImxwciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBscHIgc2VuZHMgZmlsZXMgKG9yIHN0YW5kYXJkIGlucHV0KSB0byBhIHByaW50IHNwb29saW5nIGRhZW1vbi4KKworY29uZmlnIExQUQorCWJvb2wgImxwcSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBscHEgaXMgYSBwcmludCBzcG9vbCBxdWV1ZSBleGFtaW5hdGlvbiBhbmQgbWFuaXB1bGF0aW9uIHByb2dyYW0uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3ByaW50dXRpbHMvQ29uZmlnLnNyYyBiL3ByaW50dXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRhYjhkCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnR1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlByaW50IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBMUEQKKwlib29sICJscGQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbHBkIGlzIGEgcHJpbnQgc3Bvb2xpbmcgZGFlbW9uLgorCitjb25maWcgTFBSCisJYm9vbCAibHByIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwciBzZW5kcyBmaWxlcyAob3Igc3RhbmRhcmQgaW5wdXQpIHRvIGEgcHJpbnQgc3Bvb2xpbmcgZGFlbW9uLgorCitjb25maWcgTFBRCisJYm9vbCAibHBxIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwcSBpcyBhIHByaW50IHNwb29sIHF1ZXVlIGV4YW1pbmF0aW9uIGFuZCBtYW5pcHVsYXRpb24gcHJvZ3JhbS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvcHJpbnR1dGlscy9LYnVpbGQuc3JjIGIvcHJpbnR1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGZlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludHV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15IDo9CisKK2xpYi0kKENPTkZJR19MUEQpICs9IGxwZC5vCitsaWItJChDT05GSUdfTFBSKSArPSBscHIubworbGliLSQoQ09ORklHX0xQUSkgKz0gbHByLm8KZGlmZiAtLWdpdCBhL3ByaW50dXRpbHMvbHBkLmMgYi9wcmludHV0aWxzL2xwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MmU4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludHV0aWxzL2xwZC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtaWNybyBscGQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIEEgdHlwaWNhbCB1c2FnZSBvZiBCQiBscGQgbG9va3MgYXMgZm9sbG93czoKKyAqICMgdGNwc3ZkIC1FIDAgNTE1IGxwZCBbU1BPT0xESVJdIFtIRUxQRVItUFJPRyBbQVJHUy4uLl1dCisgKgorICogVGhpcyBzdGFydHMgVENQIGxpc3RlbmVyIG9uIHBvcnQgNTE1IChkZWZhdWx0IGZvciBMUCBwcm90b2NvbCkuCisgKiBXaGVuIGEgY2xpZW50IGNvbm5lY3Rpb24gaXMgbWFkZSAodmlhIGxwcikgbHBkIGZpcnN0IGNoYW5nZXMgaXRzCisgKiB3b3JraW5nIGRpcmVjdG9yeSB0byBTUE9PTERJUiAoY3VycmVudCBkaXIgaXMgdGhlIGRlZmF1bHQpLgorICoKKyAqIFNQT09MRElSIGlzIHRoZSBzcG9vbCBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgcHJpbnRpbmcgcXVldWVzCisgKiBhbmQgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKgorICogU1BPT0xESVIvCisgKiAgICAgIDxxdWV1ZTE+CisgKiAgICAgIC4uLgorICogICAgICA8cXVldWVOPgorICoKKyAqIDxxdWV1ZVg+IGNhbiBiZSBvZiB0d28gdHlwZXM6CisgKiAgICAgIEEuIGEgcHJpbnRlciBjaGFyYWN0ZXIgZGV2aWNlLCBhbiBvcmRpbmFyeSBmaWxlIG9yIGEgbGluayB0byBzdWNoOworICogICAgICBCLiBhIGRpcmVjdG9yeS4KKyAqCisgKiBJbiBjYXNlIEEgbHBkIGp1c3QgZHVtcHMgdGhlIGRhdGEgaXQgcmVjZWl2ZXMgZnJvbSBjbGllbnQgKGxwcikgdG8gdGhlCisgKiBlbmQgb2YgcXVldWUgZmlsZS9kZXZpY2UuIFRoaXMgaXMgbm9uLXNwb29saW5nIG1vZGUuCisgKgorICogSW4gY2FzZSBCIGxwZCBlbnRlcnMgc3Bvb2xpbmcgbW9kZS4gSXQgcmVsaWFibHkgc2F2ZXMgY2xpZW50IGRhdGEgYWxvbmcKKyAqIHdpdGggY29udHJvbCBpbmZvIGluIHR3byB1bmlxdWUgZmlsZXMgdW5kZXIgdGhlIHF1ZXVlIGRpcmVjdG9yeS4gVGhlc2UKKyAqIGZpbGVzIGFyZSBuYW1lZCBkZkFYWFhISEhIIGFuZCBjZkFYWFhISEhILCB3aGVyZSBYWFggaXMgdGhlIGpvYiBudW1iZXIKKyAqIGFuZCBISEhIIGlzIHRoZSBjbGllbnQgaG9zdG5hbWUuIFVubGVzcyBhIHByaW50aW5nIGhlbHBlciBhcHBsaWNhdGlvbgorICogaXMgc3BlY2lmaWVkIGxwZCBpcyBkb25lIGF0IHRoaXMgcG9pbnQuCisgKgorICogTkI6IGZpbGUgbmFtZXMgYXJlIHByb2R1Y2VkIGJ5IHBlZXIhIFRoZXkgYWN0dWFsbHkgbWF5IGJlIGFueXRoaW5nIGF0IGFsbC4KKyAqIGxwZCBvbmx5IHNhbml0aXplcyB0aGVtIChieSByZW1vdmluZyBtb3N0IG5vbi1hbHBoYW51bWVyaWNzKS4KKyAqCisgKiBJZiBIRUxQRVItUFJPRyAod2l0aCBvcHRpb25hbCBhcmd1bWVudHMpIGlzIHNwZWNpZmllZCB0aGVuIGxwZCBjb250aW51ZXMKKyAqIHRvIHByb2Nlc3MgY2xpZW50IGRhdGE6CisgKiAgICAgIDEuIGl0IHJlYWRzIGFuZCBwYXJzZXMgY29udHJvbCBmaWxlIChjZkEuLi4pLiBUaGUgcGFyc2UgcHJvY2VzcworICogICAgICByZXN1bHRzIGluIHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdob3NlIHZhbHVlcyB3ZXJlIHBhc3NlZAorICogICAgICBpbiBjb250cm9sIGZpbGU7IHdoZW4gcGFyc2luZyBpcyBjb21wbGV0ZSwgbHBkIGRlbGV0ZXMgY29udHJvbCBmaWxlLgorICogICAgICAyLiBpdCBzcGF3bnMgc3BlY2lmaWVkIGhlbHBlciBhcHBsaWNhdGlvbi4gSXQgaXMgdGhlbgorICogICAgICB0aGUgaGVscGVyIGFwcGxpY2F0aW9uIHdobyBpcyByZXNwb25zaWJsZSBmb3IgYm90aCBhY3R1YWwgcHJpbnRpbmcKKyAqICAgICAgYW5kIGRlbGV0aW5nIG9mIHByb2Nlc3NlZCBkYXRhIGZpbGUuCisgKgorICogQSBnb29kIGxwciBwYXNzZXMgY29udHJvbCBmaWxlcyB3aGljaCB3aGVuIHBhcnNlZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCisgKiB2YXJpYWJsZXM6CisgKiAkSCA9IGhvc3Qgd2hpY2ggaXNzdWVzIHRoZSBqb2IKKyAqICRQID0gdXNlciB3aG8gcHJpbnRzCisgKiAkQyA9IGNsYXNzIG9mIHByaW50aW5nICh3aGF0IGlzIHByaW50ZWQgb24gYmFubmVyIHBhZ2UpCisgKiAkSiA9IHRoZSBuYW1lIG9mIHRoZSBqb2IKKyAqICRMID0gcHJpbnQgYmFubmVyIHBhZ2UKKyAqICRNID0gdGhlIHVzZXIgdG8gd2hvbSBhIG1haWwgc2hvdWxkIGJlIHNlbnQgaWYgYSBwcm9ibGVtIG9jY3VycworICoKKyAqIFdlIHNwZWNpZmljYWxseSBmaWx0ZXIgb3V0IGFuZCBOT1QgcHJvdmlkZToKKyAqICRsID0gbmFtZSBvZiBkYXRhZmlsZSAoImRmQXh4eCIpIC0gZmlsZSB3aG9zZSBjb250ZW50IGFyZSB0byBiZSBwcmludGVkCisgKgorICogbHBkIHByb3ZpZGVzICREQVRBRklMRSBpbnN0ZWFkIC0gdGhlIEFDVFVBTCBuYW1lCisgKiBvZiB0aGUgZGF0YWZpbGUgdW5kZXIgd2hpY2ggaXQgd2FzIHNhdmVkLgorICogJGwgd291bGQgYmUgbm90IHJlbGlhYmxlICh5b3Ugd291bGQgYmUgYXQgbWVyY3kgb2YgcmVtb3RlIHBlZXIpLgorICoKKyAqIFRodXMsIGEgdHlwaWNhbCBoZWxwZXIgY2FuIGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKiAjIS9iaW4vc2gKKyAqIGNhdCAuLyIkREFUQUZJTEUiID4vZGV2L2xwMAorICogbXYgLWYgLi8iJERBVEFGSUxFIiBzYXZlLworICovCisKKy8vdXNhZ2U6I2RlZmluZSBscGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNQT09MRElSIFtIRUxQRVIgW0FSR1NdXSIKKy8vdXNhZ2U6I2RlZmluZSBscGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTUE9PTERJUiBtdXN0IGNvbnRhaW4gKHN5bWxpbmtzIHRvKSBkZXZpY2Ugbm9kZXMgb3IgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxud2l0aCBuYW1lcyBtYXRjaGluZyBwcmludCBxdWV1ZSBuYW1lcy4gSW4gdGhlIGZpcnN0IGNhc2UsIGpvYnMgYXJlIgorLy91c2FnZTogICAgICJcbnNlbnQgZGlyZWN0bHkgdG8gdGhlIGRldmljZS4gT3RoZXJ3aXNlIGVhY2ggam9iIGlzIHN0b3JlZCBpbiBxdWV1ZSIKKy8vdXNhZ2U6ICAgICAiXG5kaXJlY3RvcnkgYW5kIEhFTFBFUiBwcm9ncmFtIGlzIGNhbGxlZC4gTmFtZSBvZiBmaWxlIHRvIHByaW50IgorLy91c2FnZTogICAgICJcbmlzIHBhc3NlZCBpbiAkREFUQUZJTEUgdmFyaWFibGUuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGU6IgorLy91c2FnZTogICAgICJcbgl0Y3BzdmQgLUUgMCA1MTUgc29mdGxpbWl0IC1tIDk5OTk5OSBscGQgL3Zhci9zcG9vbCAuL3ByaW50IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8gc3RyaXAgYXJndW1lbnQgb2YgYmFkIGNoYXJzCitzdGF0aWMgY2hhciAqc2FuZShjaGFyICpzdHIpCit7CisJY2hhciAqcyA9IHN0cjsKKwljaGFyICpwID0gczsKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKGlzYWxudW0oKnMpIHx8ICctJyA9PSAqcyB8fCAnXycgPT0gKnMpIHsKKwkJCSpwKysgPSAqczsKKwkJfQorCQlzKys7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqeG1hbGxvY19yZWFkX3N0ZGluKHZvaWQpCit7CisJLy8gU0VDVVJJVFk6CisJc2l6ZV90IG1heCA9IDQgKiAxMDI0OyAvLyBtb3JlIHRoYW4gZW5vdWdoIGZvciBjb21tYW5kcyEKKwlyZXR1cm4geG1hbGxvY19yZWFkcyhTVERJTl9GSUxFTk8sICZtYXgpOworfQorCitpbnQgbHBkX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICphcmd2W10pCit7CisJaW50IHNwb29saW5nID0gc3Bvb2xpbmc7IC8vIGZvciBjb21waWxlcgorCWNoYXIgKnMsICpxdWV1ZTsKKwljaGFyICpmaWxlbmFtZXNbMl07CisKKwkvLyBnb3RvIHNwb29sIGRpcmVjdG9yeQorCWlmICgqKythcmd2KQorCQl4Y2hkaXIoKmFyZ3YrKyk7CisKKwkvLyBlcnJvciBtZXNzYWdlcyBvZiB4ZnVuY3Mgd2lsbCBiZSBzZW50IG92ZXIgbmV0d29yaworCXhkdXAyKFNURE9VVF9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCisJLy8gbnVsbGlmeSBjdHJsL2RhdGEgZmlsZW5hbWVzCisJbWVtc2V0KGZpbGVuYW1lcywgMCwgc2l6ZW9mKGZpbGVuYW1lcykpOworCisJLy8gcmVhZCBjb21tYW5kCisJcyA9IHF1ZXVlID0geG1hbGxvY19yZWFkX3N0ZGluKCk7CisJLy8gd2UgdW5kZXJzdGFuZCBvbmx5ICJyZWNlaXZlIGpvYiIgY29tbWFuZAorCWlmICgyICE9ICpxdWV1ZSkgeworIHVuc3VwcG9ydGVkX2NtZDoKKwkJcHJpbnRmKCJDb21tYW5kICUwMnggJXNcbiIsCisJCQkodW5zaWduZWQgY2hhcilzWzBdLCAiaXMgbm90IHN1cHBvcnRlZCIpOworCQlnb3RvIGVycl9leGl0OworCX0KKworCS8vIHBhcnNlIGNvbW1hbmQ6ICIyIHwgUVVFVUVfTkFNRSB8ICdcbiciCisJcXVldWUrKzsKKwkvLyBwcm90ZWN0IGFnYWluc3QgIi8uLi8iIGF0dGFja3MKKwkvLyAqc3RyY2hybnVsKHF1ZXVlLCAnXG4nKSA9ICdcMCc7IC0gcmVkdW5kYW50LCBzYW5lKCkgd2lsbCBkbworCWlmICghKnNhbmUocXVldWUpKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJLy8gcXVldWUgaXMgYSBkaXJlY3RvcnkgLT4gY2hkaXIgdG8gaXQgYW5kIGVudGVyIHNwb29saW5nIG1vZGUKKwlzcG9vbGluZyA9IGNoZGlyKHF1ZXVlKSArIDE7IC8vIDA6IGNhbm5vdCBjaGRpciwgMTogZG9uZQorCS8vIHdlIGRvbid0IGZyZWUocyksIHdlIG1pZ2h0IG5lZWQgInF1ZXVlIiB2YXIgbGF0ZXIKKworCXdoaWxlICgxKSB7CisJCWNoYXIgKmZuYW1lOworCQlpbnQgZmQ7CisJCS8vIGludCBpcyBlYXNpZXIgdGhhbiBzc2l6ZV90OiBjYW4gdXNlIHhhdG9pX3Bvc2l0aXZlLAorCQkvLyBhbmQgY2FuIGNvcnJlY3RseSBkaXNwbGF5IGVycm9yIHJldHVybnMgKC0xKQorCQlpbnQgZXhwZWN0ZWRfbGVuLCByZWFsX2xlbjsKKworCQkvLyBzaWduYWwgT0sKKwkJc2FmZV93cml0ZShTVERPVVRfRklMRU5PLCAiIiwgMSk7CisKKwkJLy8gZ2V0IHN1YmNvbW1hbmQKKwkJLy8gdmFsaWQgcyBtdXN0IGJlIG9mIGZvcm06ICJTVUJDTUQgfCBMRU4gfCBzcGFjZSB8IEZOQU1FIgorCQkvLyBOLkIuIHdlIGJhaWwgb3V0IG9uIGFueSBlcnJvcgorCQlzID0geG1hbGxvY19yZWFkX3N0ZGluKCk7CisJCWlmICghcykgeyAvLyAocHJvYmFibHkpIEVPRgorCQkJY2hhciAqcCwgKnEsIHZhclsyXTsKKworCQkJLy8gbm9uLXNwb29saW5nIG1vZGUgb3Igbm8gc3Bvb2wgaGVscGVyIHNwZWNpZmllZAorCQkJaWYgKCFzcG9vbGluZyB8fCAhKmFyZ3YpCisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLy8gdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKKwkJCS8vIHNwb29saW5nIG1vZGUgYnV0IHdlIGRpZG4ndCBzZWUgYm90aCBjdHJsZmlsZSAmIGRhdGFmaWxlCisJCQlpZiAoc3Bvb2xpbmcgIT0gNykKKwkJCQlnb3RvIGVycl9leGl0OyAvLyByZWplY3Qgam9iCisKKwkJCS8vIHNwb29saW5nIG1vZGUgYW5kIHNwb29sIGhlbHBlciBzcGVjaWZpZWQgLT4gZXhlYyBzcG9vbCBoZWxwZXIKKwkJCS8vICh3ZSBleGl0IDEyNyBpZiBoZWxwZXIgY2Fubm90IGJlIGV4ZWN1dGVkKQorCQkJdmFyWzFdID0gJ1wwJzsKKwkJCS8vIHJlYWQgYW5kIGRlbGV0ZSBjdHJsZmlsZQorCQkJcSA9IHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShmaWxlbmFtZXNbMF0sIE5VTEwpOworCQkJdW5saW5rKGZpbGVuYW1lc1swXSk7CisJCQkvLyBwcm92aWRlIGRhdGFmaWxlIG5hbWUKKwkJCS8vIHdlIGNhbiB1c2UgbGVha3kgc2V0ZW52IHNpbmNlIHdlIGFyZSBhYm91dCB0byBleGVjIG9yIGV4aXQKKwkJCXhzZXRlbnYoIkRBVEFGSUxFIiwgZmlsZW5hbWVzWzFdKTsKKwkJCS8vIHBhcnNlIGNvbnRyb2wgZmlsZSBieSAiXG4iCisJCQl3aGlsZSAoKHAgPSBzdHJjaHIocSwgJ1xuJykpICE9IE5VTEwgJiYgaXNhbHBoYSgqcSkpIHsKKwkJCQkqcCsrID0gJ1wwJzsKKwkJCQkvLyBxIGlzIGEgbGluZSBvZiA8U1lNPjxWQUxVRT4sCisJCQkJLy8gd2UgYXJlIHNldHRpbmcgZW52aXJvbm1lbnQgc3RyaW5nIDxTWU0+PTxWQUxVRT4uCisJCQkJLy8gSWdub3JpbmcgImw8ZGF0YWZpbGU+IiwgZXhwb3J0aW5nIG90aGVyczoKKwkJCQlpZiAoKnEgIT0gJ2wnKSB7CisJCQkJCXZhclswXSA9ICpxKys7CisJCQkJCXhzZXRlbnYodmFyLCBxKTsKKwkJCQl9CisJCQkJcSA9IHA7IC8vIG5leHQgbGluZQorCQkJfQorCQkJLy8gaGVscGVyIHNob3VsZCBub3QgdGFsayBvdmVyIG5ldHdvcmsuCisJCQkvLyB0aGlzIGNhbGwgcmVvcGVucyBzdGRpbyBmZHMgdG8gIi9kZXYvbnVsbCIKKwkJCS8vIChubyBkYWVtb25pemF0aW9uIGlzIGRvbmUpCisJCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0RFVk5VTExfU1RESU8gfCBEQUVNT05fT05MWV9TQU5JVElaRSwgTlVMTCk7CisJCQlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworCQl9CisKKwkJLy8gdmFsaWRhdGUgaW5wdXQuCisJCS8vIHdlIHVuZGVyc3RhbmQgb25seSAiY29udHJvbCBmaWxlIiBvciAiZGF0YSBmaWxlIiBjbWRzCisJCWlmICgyICE9IHNbMF0gJiYgMyAhPSBzWzBdKQorCQkJZ290byB1bnN1cHBvcnRlZF9jbWQ7CisJCWlmIChzcG9vbGluZyAmICgxIDw8IChzWzBdLTEpKSkgeworCQkJcHJpbnRmKCJEdXBsaWNhdGVkIHN1YmNvbW1hbmRcbiIpOworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCQkvLyBnZXQgZmlsZW5hbWUKKwkJKnN0cmNocm51bChzLCAnXG4nKSA9ICdcMCc7CisJCWZuYW1lID0gc3RyY2hyKHMsICcgJyk7CisJCWlmICghZm5hbWUpIHsKKy8vIGJhZF9mbmFtZToKKwkJCXByaW50ZigiTm8gb3IgYmFkIGZpbGVuYW1lXG4iKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJKmZuYW1lKysgPSAnXDAnOworLy8JCS8vIHNbMF09PTI6IGN0cmxmaWxlLCBtdXN0IHN0YXJ0IHdpdGggJ2MnCisvLwkJLy8gc1swXT09MzogZGF0YWZpbGUsIG11c3Qgc3RhcnQgd2l0aCAnZCcKKy8vCQlpZiAoZm5hbWVbMF0gIT0gc1swXSArICgnYyctMikpCisvLwkJCWdvdG8gYmFkX2ZuYW1lOworCQkvLyBnZXQgbGVuZ3RoCisJCWV4cGVjdGVkX2xlbiA9IGJiX3N0cnRvdShzICsgMSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgZXhwZWN0ZWRfbGVuIDwgMCkgeworCQkJcHJpbnRmKCJCYWQgbGVuZ3RoXG4iKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJaWYgKDIgPT0gc1swXSAmJiBleHBlY3RlZF9sZW4gPiAxNiAqIDEwMjQpIHsKKwkJCS8vIFNFQ1VSSVRZOgorCQkJLy8gY3RybGZpbGUgY2FuJ3QgYmUgYmlnICh3ZSB3YW50IHRvIHJlYWQgaXQgYmFjayBsYXRlciEpCisJCQlwcmludGYoIkZpbGUgaXMgdG9vIGJpZ1xuIik7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisKKwkJLy8gb3BlbiB0aGUgZmlsZQorCQlpZiAoc3Bvb2xpbmcpIHsKKwkJCS8vIHNwb29saW5nIG1vZGU6IGR1bXAgYm90aCBmaWxlcworCQkJLy8gam9iIGluIGZsaWdodCBoYXMgbW9kZSAwMjAwICJvbmx5IHdyaXRhYmxlIgorCQkJc2FuZShmbmFtZSk7CisJCQlmZCA9IG9wZW4zX29yX3dhcm4oZm5hbWUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0VYQ0wsIDAyMDApOworCQkJaWYgKGZkIDwgMCkKKwkJCQlnb3RvIGVycl9leGl0OworCQkJZmlsZW5hbWVzW3NbMF0gLSAyXSA9IHhzdHJkdXAoZm5hbWUpOworCQl9IGVsc2UgeworCQkJLy8gbm9uLXNwb29saW5nIG1vZGU6CisJCQkvLyAyOiBjb250cm9sIGZpbGUgKGlnbm9yaW5nKSwgMzogZGF0YSBmaWxlCisJCQlmZCA9IC0xOworCQkJaWYgKDMgPT0gc1swXSkKKwkJCQlmZCA9IHhvcGVuKHF1ZXVlLCBPX1JEV1IgfCBPX0FQUEVORCk7CisJCX0KKworCQkvLyBzaWduYWwgT0sKKwkJc2FmZV93cml0ZShTVERPVVRfRklMRU5PLCAiIiwgMSk7CisKKwkJLy8gY29weSB0aGUgZmlsZQorCQlyZWFsX2xlbiA9IGJiX2NvcHlmZF9zaXplKFNURElOX0ZJTEVOTywgZmQsIGV4cGVjdGVkX2xlbik7CisJCWlmIChyZWFsX2xlbiAhPSBleHBlY3RlZF9sZW4pIHsKKwkJCXByaW50ZigiRXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCBieXRlc1xuIiwKKwkJCQlleHBlY3RlZF9sZW4sIHJlYWxfbGVuKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJLy8gZ2V0IEVPRiBpbmRpY2F0b3IsIHNlZSB3aGV0aGVyIGl0IGlzIE5VTCAob2spCisJCS8vIChhbmQgZG9uJ3QgdHJhc2ggc1swXSEpCisJCWlmIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCAmc1sxXSwgMSkgIT0gMSB8fCBzWzFdICE9IDApIHsKKwkJCS8vIGRvbid0IHNlbmQgZXJyb3IgbXNnIHRvIHBlZXIgLSBpdCBvYnZpb3VzbHkKKwkJCS8vIGRvZXNuJ3QgZm9sbG93IHRoZSBwcm90b2NvbCwgc28gcHJvYmFibHkKKwkJCS8vIGl0IGNhbid0IHVuZGVyc3RhbmQgdXMgZWl0aGVyCisJCQlnb3RvIGVycl9leGl0OworCQl9CisKKwkJaWYgKHNwb29saW5nKSB7CisJCQkvLyBjaG1vZCBjb21wbGV0ZWx5IGRvd25sb2FkZWQgZmlsZSBhcyAicmVhZGFibGUrd3JpdGFibGUiCisJCQlmY2htb2QoZmQsIDA2MDApOworCQkJLy8gYWNjdW11bGF0ZSBkdW1wIHN0YXRlCisJCQkvLyBOLkIuIGFmdGVyIGFsbCBmaWxlcyBhcmUgZHVtcGVkIHNwb29saW5nIHNob3VsZCBiZSAxKzIrND09NworCQkJc3Bvb2xpbmcgfD0gKDEgPDwgKHNbMF0tMSkpOyAvLyBiaXQgMTogY3RybGZpbGU7IGJpdCAyOiBkYXRhZmlsZQorCQl9CisKKwkJZnJlZShzKTsKKwkJY2xvc2UoZmQpOyAvLyBOQjogY2FuIGRvIGNsb3NlKC0xKS4gV2hvIGNhcmVzPworCisJCS8vIE5COiBkb24ndCBkbyAic2lnbmFsIE9LIiB3cml0ZSBoZXJlLCBpdCB3aWxsIGJlIGRvbmUKKwkJLy8gYXQgdGhlIHRvcCBvZiB0aGUgbG9vcAorCX0gLy8gd2hpbGUgKDEpCisKKyBlcnJfZXhpdDoKKwkvLyBkb24ndCBrZWVwIGNvcnJ1cHRlZCBmaWxlcworCWlmIChzcG9vbGluZykgeworI2RlZmluZSBpIHNwb29saW5nCisJCWZvciAoaSA9IDI7IC0taSA+PSAwOyApCisJCQlpZiAoZmlsZW5hbWVzW2ldKQorCQkJCXVubGluayhmaWxlbmFtZXNbaV0pOworCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvcHJpbnR1dGlscy9scHIuYyBiL3ByaW50dXRpbHMvbHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2YmNhOQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50dXRpbHMvbHByLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJhcmUgYm9uZXMgdmVyc2lvbiBvZiBscHIgJiBscHE6IEJTRCBwcmludGluZyB1dGlsaXRpZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIE9yaWdpbmFsIGlkZWEgYW5kIGNvZGU6CisgKiAgICAgIFdhbHRlciBIYXJtcyA8V0hhcm1zQGJmcy5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFNlZSBSRkMgMTE3OSBmb3IgcHJvdG9jb2wgZGVzY3JpcHRpb24uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxwcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLVAgcXVldWVbQGhvc3RbOnBvcnRdXSAtVSBVU0VSTkFNRSAtSiBUSVRMRSAtVm1oIFtGSUxFXS4uLiIKKy8qIC1DIENMQVNTIGV4aXN0cyB0b28sIG5vdCBzaG93bi4KKyAqIENMQVNTIGlzIHN1cHBvc2VkIHRvIGJlIHByaW50ZWQgb24gYmFubmVyIHBhZ2UsIGlmIG9uZSBpcyByZXF1ZXN0ZWQgKi8KKy8vdXNhZ2U6I2RlZmluZSBscHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLVAJbHAgc2VydmljZSB0byBjb25uZWN0IHRvIChlbHNlIHVzZXMgJFBSSU5URVIpIgorLy91c2FnZTogICAgICJcbgktbQlTZW5kIG1haWwgb24gY29tcGxldGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJUHJpbnQgYmFubmVyIHBhZ2UgdG9vIgorLy91c2FnZTogICAgICJcbgktVglWZXJib3NlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBscHFfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUCBxdWV1ZVtAaG9zdFs6cG9ydF1dXSBbLVUgVVNFUk5BTUVdIFstZCBKT0JJRF0uLi4gWy1mc10iCisvL3VzYWdlOiNkZWZpbmUgbHBxX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1QCWxwIHNlcnZpY2UgdG8gY29ubmVjdCB0byAoZWxzZSB1c2VzICRQUklOVEVSKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVsZXRlIGpvYnMiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIGFueSB3YWl0aW5nIGpvYiB0byBiZSBwcmludGVkIgorLy91c2FnZTogICAgICJcbgktcwlTaG9ydCBkaXNwbGF5IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIExQRCByZXR1cm5zIGJpbmFyeSAwIG9uIHN1Y2Nlc3MuCisgKiBPdGhlcndpc2UgaXQgcmV0dXJucyBlcnJvciBtZXNzYWdlLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoaW50IGZkLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJc3NpemVfdCBzejsKKwljaGFyIGJ1ZlsxMjhdOworCisJYnVmWzBdID0gJyAnOworCXN6ID0gc2FmZV9yZWFkKGZkLCBidWYsIDEpOworCWlmICgnXDAnICE9IGJ1ZlswXSkgeworCQkvLyByZXF1ZXN0IGhhcyBmYWlsZWQKKwkJLy8gdHJ5IHRvIG1ha2Ugc3VyZSBsYXN0IGNoYXIgaXMgJ1xuJywgYnV0IGRvIG5vdCBhZGQKKwkJLy8gc3VwZXJmbHVvdXMgb25lCisJCXN6ID0gZnVsbF9yZWFkKGZkLCBidWYgKyAxLCAxMjYpOworCQliYl9lcnJvcl9tc2coImVycm9yIHdoaWxlICVzJXMiLCBlcnJtc2csCisJCQkJKHN6ID4gMCA/ICIuIFNlcnZlciBzYWlkOiIgOiAiIikpOworCQlpZiAoc3ogPiAwKSB7CisJCQkvLyBzeiA9IChieXRlcyBpbiBidWYpIC0gMQorCQkJaWYgKGJ1Zltzel0gIT0gJ1xuJykKKwkJCQlidWZbKytzel0gPSAnXG4nOworCQkJc2FmZV93cml0ZShTVERFUlJfRklMRU5PLCBidWYsIHN6ICsgMSk7CisJCX0KKwkJeGZ1bmNfZGllKCk7CisJfQorfQorCitpbnQgbHBxcl9tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxwcXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKmFyZ3ZbXSkKK3sKKwllbnVtIHsKKwkJT1BUX1AgICAgICAgICAgID0gMSA8PCAwLCAvLyAtUCBxdWV1ZVtAaG9zdFs6cG9ydF1dLiBJZiBubyAtUCBpcyBnaXZlbiB1c2UgJFBSSU5URVIsIHRoZW4gImxwQGxvY2FsaG9zdDo1MTUiCisJCU9QVF9VICAgICAgICAgICA9IDEgPDwgMSwgLy8gLVUgdXNlcm5hbWUKKworCQlMUFJfViAgICAgICAgICAgPSAxIDw8IDIsIC8vIC1WOiBiZSB2ZXJib3NlCisJCUxQUl9oICAgICAgICAgICA9IDEgPDwgMywgLy8gLWg6IHdhbnQgYmFubmVyIHByaW50ZWQKKwkJTFBSX0MgICAgICAgICAgID0gMSA8PCA0LCAvLyAtQyBjbGFzczogam9iICJjbGFzcyIgKD8gc3VwcG9zZWRseSBwcmludGVkIG9uIGJhbm5lcikKKwkJTFBSX0ogICAgICAgICAgID0gMSA8PCA1LCAvLyAtSiB0aXRsZTogdGhlIGpvYiB0aXRsZSBmb3IgdGhlIGJhbm5lciBwYWdlCisJCUxQUl9tICAgICAgICAgICA9IDEgPDwgNiwgLy8gLW06IHNlbmQgbWFpbCBiYWNrIHRvIHVzZXIKKworCQlMUFFfU0hPUlRfRk1UICAgPSAxIDw8IDIsIC8vIC1zOiBzaG9ydCBsaXN0aW5nIGZvcm1hdAorCQlMUFFfREVMRVRFICAgICAgPSAxIDw8IDMsIC8vIC1kOiBkZWxldGUgam9iKHMpCisJCUxQUV9GT1JDRSAgICAgICA9IDEgPDwgNCwgLy8gLWY6IGZvcmNlIHdhaXRpbmcgam9iKHMpIHRvIGJlIHByaW50ZWQKKwl9OworCWNoYXIgdGVtcGZpbGVbc2l6ZW9mKCIvdG1wL2xwclhYWFhYWCIpXTsKKwljb25zdCBjaGFyICpqb2JfdGl0bGU7CisJY29uc3QgY2hhciAqcHJpbnRlcl9jbGFzcyA9ICIiOyAgIC8vIHByaW50ZXIgY2xhc3MsIG1heCAzMiBjaGFyCisJY29uc3QgY2hhciAqcXVldWU7ICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgcHJpbnRlciBxdWV1ZQorCWNvbnN0IGNoYXIgKnNlcnZlciA9ICJsb2NhbGhvc3QiOyAvLyBzZXJ2ZXJbOnBvcnRdIG9mIHByaW50ZXIgcXVldWUKKwljaGFyICpob3N0bmFtZTsKKwkvLyBOLkIuIElNSE8gZ2V0ZW52KCJVU0VSIikgY2FuIGJlIHdheSBlYXNpbHkgc3Bvb2ZlZCEKKwljb25zdCBjaGFyICp1c2VyID0geHVpZDJ1bmFtZShnZXR1aWQoKSk7CisJdW5zaWduZWQgam9iOworCXVuc2lnbmVkIG9wdHM7CisJaW50IGZkOworCisJLy8gcGFyc2Ugb3B0aW9ucworCS8vIFRPRE86IHNldCBvcHRfY29tcGxlbWVudGFyeTogcyxkLGYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkoLypscCovJ3InID09IGFwcGxldF9uYW1lWzJdKSA/ICJQOlU6VmhDOko6bSIgOiAiUDpVOnNkZiIKKwkJLCAmcXVldWUsICZ1c2VyCisJCSwgJnByaW50ZXJfY2xhc3MsICZqb2JfdGl0bGUKKwkpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gaWYgcXVldWUgaXMgbm90IHNwZWNpZmllZCAtPiB1c2UgJFBSSU5URVIKKwlpZiAoIShvcHRzICYgT1BUX1ApKQorCQlxdWV1ZSA9IGdldGVudigiUFJJTlRFUiIpOworCS8vIGlmIHF1ZXVlIGlzIHN0aWxsIG5vdCBzcGVjaWZpZWQgLT4KKwlpZiAoIXF1ZXVlKSB7CisJCS8vIC4uLiBxdWV1ZSBkZWZhdWx0cyB0byAibHAiCisJCS8vIHNlcnZlciBkZWZhdWx0cyB0byAibG9jYWxob3N0IgorCQlxdWV1ZSA9ICJscCI7CisJLy8gaWYgcXVldWUgaXMgc3BlY2lmaWVkIC0+CisJfSBlbHNlIHsKKwkJLy8gcXVldWUgbmFtZSBpcyB0byB0aGUgbGVmdCBvZiAnQCcKKwkJY2hhciAqcyA9IHN0cmNocihxdWV1ZSwgJ0AnKTsKKwkJaWYgKHMpIHsKKwkJCS8vIHNlcnZlciBuYW1lIGlzIHRvIHRoZSByaWdodCBvZiAnQCcKKwkJCSpzID0gJ1wwJzsKKwkJCXNlcnZlciA9IHMgKyAxOworCQl9CisJfQorCisJLy8gZG8gY29ubmVjdAorCWZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoc2VydmVyLCA1MTUpOworCisJLy8KKwkvLyBMUFEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlpZiAoLypscCovJ3EnID09IGFwcGxldF9uYW1lWzJdKSB7CisJCWNoYXIgY21kOworCQkvLyBmb3JjZSBwcmludGluZyBvZiBldmVyeSBqb2Igc3RpbGwgaW4gcXVldWUKKwkJaWYgKG9wdHMgJiBMUFFfRk9SQ0UpIHsKKwkJCWNtZCA9IDE7CisJCQlnb3RvIGNvbW1hbmQ7CisJCS8vIGRlbGV0ZSBqb2IocykKKwkJfSBlbHNlIGlmIChvcHRzICYgTFBRX0RFTEVURSkgeworCQkJZmRwcmludGYoZmQsICJceDUiICIlcyAlcyIsIHF1ZXVlLCB1c2VyKTsKKwkJCXdoaWxlICgqYXJndikgeworCQkJCWZkcHJpbnRmKGZkLCAiICVzIiwgKmFyZ3YrKyk7CisJCQl9CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkvLyBkdW1wIGN1cnJlbnQgam9icyBzdGF0dXMKKwkJLy8gTi5CLiBwZXJpb2RpY2FsIHBvbGxpbmcgc2hvdWxkIGJlIGFjaGlldmVkCisJCS8vIHZpYSAid2F0Y2ggLW4gZGVsYXkgbHBxIgorCQkvLyBUaGV5IHNheSBpdCdzIHRoZSBVTklYLXdheSA6KQorCQl9IGVsc2UgeworCQkJY21kID0gKG9wdHMgJiBMUFFfU0hPUlRfRk1UKSA/IDMgOiA0OworIGNvbW1hbmQ6CisJCQlmZHByaW50ZihmZCwgIiVjIiAiJXNcbiIsIGNtZCwgcXVldWUpOworCQkJYmJfY29weWZkX2VvZihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCX0KKworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8vCisJLy8gTFBSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJaWYgKG9wdHMgJiBMUFJfVikKKwkJYmJfZXJyb3JfbXNnKCJjb25uZWN0ZWQgdG8gc2VydmVyIik7CisKKwlqb2IgPSBnZXRwaWQoKSAlIDEwMDA7CisJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisKKwkvLyBubyBmaWxlcyBnaXZlbiBvbiBjb21tYW5kIGxpbmU/IC0+IHVzZSBzdGRpbgorCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciAqKSItIjsKKworCWZkcHJpbnRmKGZkLCAiXHgyIiAiJXNcbiIsIHF1ZXVlKTsKKwlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZXR0aW5nIHF1ZXVlIik7CisKKwkvLyBwcm9jZXNzIGZpbGVzCisJZG8geworCQl1bnNpZ25lZCBjZmxlbjsKKwkJaW50IGRmZDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIgKmM7CisJCWNoYXIgKnJlbW90ZV9maWxlbmFtZTsKKwkJY2hhciAqY29udHJvbGZpbGU7CisKKwkJLy8gaWYgZGF0YSBmaWxlIGlzIHN0ZGluLCB3ZSBuZWVkIHRvIGR1bXAgaXQgZmlyc3QKKwkJaWYgKExPTkVfREFTSCgqYXJndikpIHsKKwkJCXN0cmNweSh0ZW1wZmlsZSwgIi90bXAvbHByWFhYWFhYIik7CisJCQlkZmQgPSB4bWtzdGVtcCh0ZW1wZmlsZSk7CisJCQliYl9jb3B5ZmRfZW9mKFNURElOX0ZJTEVOTywgZGZkKTsKKwkJCXhsc2VlayhkZmQsIDAsIFNFRUtfU0VUKTsKKwkJCSphcmd2ID0gKGNoYXIqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJfSBlbHNlIHsKKwkJCWRmZCA9IHhvcGVuKCphcmd2LCBPX1JET05MWSk7CisJCX0KKworCQkvKiAiVGhlIG5hbWUgLi4uIHNob3VsZCBzdGFydCB3aXRoIEFTQ0lJICJjZkEiLAorCQkgKiBmb2xsb3dlZCBieSBhIHRocmVlIGRpZ2l0IGpvYiBudW1iZXIsIGZvbGxvd2VkCisJCSAqIGJ5IHRoZSBob3N0IG5hbWUgd2hpY2ggaGFzIGNvbnN0cnVjdGVkIHRoZSBmaWxlLiIKKwkJICogV2Ugc3VwcGx5ICdjJyBvciAnZCcgYXMgbmVlZGVkIGZvciBjb250cm9sL2RhdGEgZmlsZS4gKi8KKwkJcmVtb3RlX2ZpbGVuYW1lID0geGFzcHJpbnRmKCJmQSUwM3UlcyIsIGpvYiwgaG9zdG5hbWUpOworCisJCS8vIGNyZWF0ZSBjb250cm9sIGZpbGUKKwkJLy8gVE9ETzogYWxsIGxpbmVzIGJ1dCAyIGxhc3QgYXJlIGNvbnN0YW50cyEgSG93IHdlIGNhbiB1c2UgdGhpcyBmYWN0PworCQljb250cm9sZmlsZSA9IHhhc3ByaW50ZigKKwkJCSJIIiAiJS4zMnNcbiIgIlAiICIlLjMyc1xuIiAvKiBIIEhPU1QsIFAgVVNFUiAqLworCQkJIkMiICIlLjMyc1xuIiAvKiBDIENMQVNTIC0gcHJpbnRlZCBvbiBiYW5uZXIgcGFnZSAoaWYgTCBjbWQgaXMgYWxzbyBnaXZlbikgKi8KKwkJCSJKIiAiJS45OXNcbiIgLyogSiBKT0JOQU1FICovCisJCQkvKiAiY2xhc3MgbmFtZSBmb3IgYmFubmVyIHBhZ2UgYW5kIGpvYiBuYW1lCisJCQkgKiBmb3IgYmFubmVyIHBhZ2UgY29tbWFuZHMgbXVzdCBwcmVjZWRlIEwgY29tbWFuZCIgKi8KKwkJCSJMIiAiJS4zMnNcbiIgLyogTCBVU0VSIC0gcHJpbnQgYmFubmVyIHBhZ2UsIHdpdGggZ2l2ZW4gdXNlcidzIG5hbWUgKi8KKwkJCSJNIiAiJS4zMnNcbiIgLyogTSBXSE9NX1RPX01BSUwgKi8KKwkJCSJsIiAiZCUuMzFzXG4iIC8qIGwgREFUQV9GSUxFX05BTUUgKCJkZkF4eHgiKSAqLworCQkJLCBob3N0bmFtZSwgdXNlcgorCQkJLCBwcmludGVyX2NsYXNzIC8qIGNhbiBiZSAiIiAqLworCQkJLCAoKG9wdHMgJiBMUFJfSikgPyBqb2JfdGl0bGUgOiAqYXJndikKKwkJCSwgKG9wdHMgJiBMUFJfaCkgPyB1c2VyIDogIiIKKwkJCSwgKG9wdHMgJiBMUFJfbSkgPyB1c2VyIDogIiIKKwkJCSwgcmVtb3RlX2ZpbGVuYW1lCisJCSk7CisJCS8vIGRlbGV0ZSBwb3NzaWJsZSAiXG5YXG4iIHBhdHRlcm5zCisJCWMgPSBjb250cm9sZmlsZTsKKwkJY2ZsZW4gPSAodW5zaWduZWQpc3RybGVuKGNvbnRyb2xmaWxlKTsKKwkJd2hpbGUgKChjID0gc3RyY2hyKGMsICdcbicpKSAhPSBOVUxMKSB7CisJCQlpZiAoY1sxXSAmJiBjWzJdID09ICdcbicpIHsKKwkJCQkvKiBjYW4ndCB1c2Ugc3RyY3B5LCByZXN1bHRzIGFyZSB1bmRlZmluZWQgKi8KKwkJCQltZW1tb3ZlKGMsIGMrMiwgY2ZsZW4gLSAoYy1jb250cm9sZmlsZSkgLSAxKTsKKwkJCQljZmxlbiAtPSAyOworCQkJfSBlbHNlIHsKKwkJCQljKys7CisJCQl9CisJCX0KKworCQkvLyBzZW5kIGNvbnRyb2wgZmlsZQorCQlpZiAob3B0cyAmIExQUl9WKQorCQkJYmJfZXJyb3JfbXNnKCJzZW5kaW5nIGNvbnRyb2wgZmlsZSIpOworCQkvKiAiQWNrbm93bGVkZ2VtZW50IHByb2Nlc3NpbmcgbXVzdCBvY2N1ciBhcyB1c3VhbAorCQkgKiBhZnRlciB0aGUgY29tbWFuZCBpcyBzZW50LiIgKi8KKwkJZmRwcmludGYoZmQsICJceDIiICIldSBjJXNcbiIsIGNmbGVuLCByZW1vdGVfZmlsZW5hbWUpOworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGNvbnRyb2wgZmlsZSIpOworCQkvKiAiT25jZSBhbGwgb2YgdGhlIGNvbnRlbnRzIGhhdmUKKwkJICogYmVlbiBkZWxpdmVyZWQsIGFuIG9jdGV0IG9mIHplcm8gYml0cyBpcyBzZW50IGFzCisJCSAqIGFuIGluZGljYXRpb24gdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGlzIGNvbXBsZXRlLgorCQkgKiBBIHNlY29uZCBsZXZlbCBvZiBhY2tub3dsZWRnZW1lbnQgcHJvY2Vzc2luZworCQkgKiBtdXN0IG9jY3VyIGF0IHRoaXMgcG9pbnQuIiAqLworCQlmdWxsX3dyaXRlKGZkLCBjb250cm9sZmlsZSwgY2ZsZW4gKyAxKTsgLyogd3JpdGVzIE5VTCBieXRlIHRvbyAqLworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGNvbnRyb2wgZmlsZSIpOworCisJCS8vIHNlbmQgZGF0YSBmaWxlLCB3aXRoIG5hbWUgImRmYVhYWCIKKwkJaWYgKG9wdHMgJiBMUFJfVikKKwkJCWJiX2Vycm9yX21zZygic2VuZGluZyBkYXRhIGZpbGUiKTsKKwkJc3Quc3Rfc2l6ZSA9IDA7IC8qIHBhcmFub2lhOiBmc3RhdCBtYXkgdGhlb3JldGljYWxseSBmYWlsICovCisJCWZzdGF0KGRmZCwgJnN0KTsKKwkJZmRwcmludGYoZmQsICJceDMiICIlIk9GRl9GTVQidSBkJXNcbiIsIHN0LnN0X3NpemUsIHJlbW90ZV9maWxlbmFtZSk7CisJCWdldF9yZXNwb25zZV9vcl9zYXlfYW5kX2RpZShmZCwgInNlbmRpbmcgZGF0YSBmaWxlIik7CisJCWlmIChiYl9jb3B5ZmRfc2l6ZShkZmQsIGZkLCBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplKSB7CisJCQkvLyBXZSdyZSBzY3Jld2VkLiBXZSBzZW50IGxlc3MgYnl0ZXMgdGhhbiB3ZSBhZHZlcnRpc2VkLgorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImxvY2FsIGZpbGUgY2hhbmdlZCBzaXplPyEiKTsKKwkJfQorCQl3cml0ZShmZCwgIiIsIDEpOyAvLyBzZW5kIEFDSworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGRhdGEgZmlsZSIpOworCisJCS8vIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZSBpZiB3ZSBkdW1wZWQgc3RkaW4KKwkJaWYgKCphcmd2ID09IChjaGFyKiliYl9tc2dfc3RhbmRhcmRfaW5wdXQpCisJCQl1bmxpbmsodGVtcGZpbGUpOworCisJCS8vIGNsZWFudXAKKwkJY2xvc2UoZmQpOworCQlmcmVlKHJlbW90ZV9maWxlbmFtZSk7CisJCWZyZWUoY29udHJvbGZpbGUpOworCisJCS8vIHNheSBqb2IgYWNjZXB0ZWQKKwkJaWYgKG9wdHMgJiBMUFJfVikKKwkJCWJiX2Vycm9yX21zZygiam9iIGFjY2VwdGVkIik7CisKKwkJLy8gbmV4dCwgcGxlYXNlIQorCQlqb2IgPSAoam9iICsgMSkgJSAxMDAwOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9Db25maWcuaW4gYi9wcm9jcHMvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmEzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvQ29uZmlnLmluCkBAIC0wLDAgKzEsMjYwIEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiUHJvY2VzcyBVdGlsaXRpZXMiCisKK2NvbmZpZyBJT1NUQVQKKwlib29sICJpb3N0YXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUmVwb3J0IENQVSBhbmQgSS9PIHN0YXRpc3RpY3MKK2NvbmZpZyBNUFNUQVQKKwlib29sICJtcHN0YXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUGVyLXByb2Nlc3NvciBzdGF0aXN0aWNzCitjb25maWcgTk1FVEVSCisJYm9vbCAibm1ldGVyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50cyBzZWxlY3RlZCBzeXN0ZW0gc3RhdHMgY29udGludW91c2x5LCBvbmUgbGluZSBwZXIgdXBkYXRlLgorY29uZmlnIFBNQVAKKyAgICAgICBib29sICJwbWFwIgorICAgICAgIGRlZmF1bHQgeQorICAgICAgIGhlbHAKKyAgICAgICAgIERpc3BsYXkgcHJvY2Vzc2VzJyBtZW1vcnkgbWFwcGluZ3MuCitjb25maWcgUE9XRVJUT1AKKwlib29sICJwb3dlcnRvcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBBbmFseXplIHBvd2VyIGNvbnN1bXB0aW9uIG9uIEludGVsLWJhc2VkIGxhcHRvcHMKK2NvbmZpZyBQU1RSRUUKKwlib29sICJwc3RyZWUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRGlzcGxheSBhIHRyZWUgb2YgcHJvY2Vzc2VzLgorY29uZmlnIFBXRFgKKwlib29sICJwd2R4IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJlcG9ydCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIGEgcHJvY2VzcworY29uZmlnIFNNRU1DQVAKKwlib29sICJzbWVtY2FwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNtZW1jYXAgaXMgYSB0b29sIGZvciBjYXB0dXJpbmcgcHJvY2VzcyBkYXRhIGZvciBzbWVtLAorCSAgYSBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljIHRvb2wuCitjb25maWcgVVBUSU1FCisJYm9vbCAidXB0aW1lIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWCAjc3lzaW5mbygpCisJaGVscAorCSAgdXB0aW1lIGdpdmVzIGEgb25lIGxpbmUgZGlzcGxheSBvZiB0aGUgY3VycmVudCB0aW1lLCBob3cgbG9uZworCSAgdGhlIHN5c3RlbSBoYXMgYmVlbiBydW5uaW5nLCBob3cgbWFueSB1c2VycyBhcmUgY3VycmVudGx5IGxvZ2dlZAorCSAgb24sIGFuZCB0aGUgc3lzdGVtIGxvYWQgYXZlcmFnZXMgZm9yIHRoZSBwYXN0IDEsIDUsIGFuZCAxNSBtaW51dGVzLgorCitjb25maWcgRkVBVFVSRV9VUFRJTUVfVVRNUF9TVVBQT1JUCisJYm9vbCAiU3VwcG9ydCBmb3Igc2hvd2luZyB0aGUgbnVtYmVyIG9mIHVzZXJzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVVBUSU1FICYmIEZFQVRVUkVfVVRNUAorCWhlbHAKKwkgIE1ha2VzIHVwdGltZSBkaXNwbGF5IHRoZSBudW1iZXIgb2YgdXNlcnMgY3VycmVudGx5IGxvZ2dlZCBvbi4KKworY29uZmlnIEZSRUUKKwlib29sICJmcmVlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWCAjc3lzaW5mbygpCisJaGVscAorCSAgZnJlZSBkaXNwbGF5cyB0aGUgdG90YWwgYW1vdW50IG9mIGZyZWUgYW5kIHVzZWQgcGh5c2ljYWwgYW5kIHN3YXAKKwkgIG1lbW9yeSBpbiB0aGUgc3lzdGVtLCBhcyB3ZWxsIGFzIHRoZSBidWZmZXJzIHVzZWQgYnkgdGhlIGtlcm5lbC4KKwkgIFRoZSBzaGFyZWQgbWVtb3J5IGNvbHVtbiBzaG91bGQgYmUgaWdub3JlZDsgaXQgaXMgb2Jzb2xldGUuCisKK2NvbmZpZyBGVVNFUgorCWJvb2wgImZ1c2VyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZ1c2VyIGxpc3RzIGFsbCBQSURzIChQcm9jZXNzIElEcykgdGhhdCBjdXJyZW50bHkgaGF2ZSBhIGdpdmVuCisJICBmaWxlIG9wZW4uIGZ1c2VyIGNhbiBhbHNvIGxpc3QgYWxsIFBJRHMgdGhhdCBoYXZlIGEgZ2l2ZW4gbmV0d29yaworCSAgKFRDUCBvciBVRFApIHBvcnQgb3Blbi4KKworY29uZmlnIEtJTEwKKwlib29sICJraWxsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBjb21tYW5kIGtpbGwgc2VuZHMgdGhlIHNwZWNpZmllZCBzaWduYWwgdG8gdGhlIHNwZWNpZmllZAorCSAgcHJvY2VzcyBvciBwcm9jZXNzIGdyb3VwLiBJZiBubyBzaWduYWwgaXMgc3BlY2lmaWVkLCB0aGUgVEVSTQorCSAgc2lnbmFsIGlzIHNlbnQuCisKK2NvbmZpZyBLSUxMQUxMCisJYm9vbCAia2lsbGFsbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEtJTEwKKwloZWxwCisJICBraWxsYWxsIHNlbmRzIGEgc2lnbmFsIHRvIGFsbCBwcm9jZXNzZXMgcnVubmluZyBhbnkgb2YgdGhlCisJICBzcGVjaWZpZWQgY29tbWFuZHMuIElmIG5vIHNpZ25hbCBuYW1lIGlzIHNwZWNpZmllZCwgU0lHVEVSTSBpcworCSAgc2VudC4KKworY29uZmlnIEtJTExBTEw1CisJYm9vbCAia2lsbGFsbDUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBLSUxMCisKK2NvbmZpZyBQR1JFUAorCWJvb2wgInBncmVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIExvb2sgZm9yIHByb2Nlc3NlcyBieSBuYW1lLgorCitjb25maWcgUElET0YKKwlib29sICJwaWRvZiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQaWRvZiBmaW5kcyB0aGUgcHJvY2VzcyBpZCdzIChwaWRzKSBvZiB0aGUgbmFtZWQgcHJvZ3JhbXMuIEl0IHByaW50cworCSAgdGhvc2UgaWQncyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCitjb25maWcgRkVBVFVSRV9QSURPRl9TSU5HTEUKKwlib29sICJFbmFibGUgYXJndW1lbnQgZm9yIHNpbmdsZSBzaG90ICgtcykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQSURPRgorCWhlbHAKKwkgIFN1cHBvcnQgYXJndW1lbnQgJy1zJyBmb3IgcmV0dXJuaW5nIG9ubHkgdGhlIGZpcnN0IHBpZCBmb3VuZC4KKworY29uZmlnIEZFQVRVUkVfUElET0ZfT01JVAorCWJvb2wgIkVuYWJsZSBhcmd1bWVudCBmb3Igb21pdHRpbmcgcGlkcyAoLW8pIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUElET0YKKwloZWxwCisJICBTdXBwb3J0IGFyZ3VtZW50ICctbycgZm9yIG9taXR0aW5nIHRoZSBnaXZlbiBwaWRzIGluIG91dHB1dC4KKwkgIFRoZSBzcGVjaWFsIHBpZCAlUFBJRCBjYW4gYmUgdXNlZCB0byBuYW1lIHRoZSBwYXJlbnQgcHJvY2VzcworCSAgb2YgdGhlIHBpZG9mLCBpbiBvdGhlciB3b3JkcyB0aGUgY2FsbGluZyBzaGVsbCBvciBzaGVsbCBzY3JpcHQuCisKK2NvbmZpZyBQS0lMTAorCWJvb2wgInBraWxsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNlbmQgc2lnbmFscyB0byBwcm9jZXNzZXMgYnkgbmFtZS4KKworY29uZmlnIFBTCisJYm9vbCAicHMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcHMgZ2l2ZXMgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBwcm9jZXNzZXMuCisKK2NvbmZpZyBGRUFUVVJFX1BTX1dJREUKKwlib29sICJFbmFibGUgd2lkZSBvdXRwdXQgb3B0aW9uICgtdykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUworCWhlbHAKKwkgIFN1cHBvcnQgYXJndW1lbnQgJ3cnIGZvciB3aWRlIG91dHB1dC4KKwkgIElmIGdpdmVuIG9uY2UsIDEzMiBjaGFycyBhcmUgcHJpbnRlZCwgYW5kIGlmIGdpdmVuIG1vcmUKKwkgIHRoYW4gb25jZSwgdGhlIGxlbmd0aCBpcyB1bmxpbWl0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX1BTX1RJTUUKKwlib29sICJFbmFibGUgdGltZSBhbmQgZWxhcHNlZCB0aW1lIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTICYmIERFU0tUT1AKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTdXBwb3J0IC1vIHRpbWUgYW5kIC1vIGV0aW1lIG91dHB1dCBzcGVjaWZpZXJzLgorCitjb25maWcgRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMKKwlib29sICJFbmFibGUgYWRkaXRpb25hbCBwcyBjb2x1bW5zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFMgJiYgREVTS1RPUAorCWhlbHAKKwkgIFN1cHBvcnQgLW8gcmdyb3VwLCAtbyBydXNlciwgLW8gbmljZSBvdXRwdXQgc3BlY2lmaWVycy4KKworY29uZmlnIEZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TCisJYm9vbCAiU3VwcG9ydCBMaW51eCBwcmlvciB0byAyLjQuMCBhbmQgbm9uLUVMRiBzeXN0ZW1zIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV9QU19USU1FCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBtZWFzdXJpbmcgSFogb24gb2xkIGtlcm5lbHMgYW5kIG5vbi1FTEYgc3lzdGVtcworCSAgKGlmIHlvdSBhcmUgb24gTGludXggMi40LjArIGFuZCB1c2UgRUxGLCB5b3UgZG9uJ3QgbmVlZCB0aGlzKQorCitjb25maWcgUkVOSUNFCisJYm9vbCAicmVuaWNlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJlbmljZSBhbHRlcnMgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgb2Ygb25lIG9yIG1vcmUgcnVubmluZworCSAgcHJvY2Vzc2VzLgorCitjb25maWcgQkJfU1lTQ1RMCisJYm9vbCAic3lzY3RsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbmZpZ3VyZSBrZXJuZWwgcGFyYW1ldGVycyBhdCBydW50aW1lLgorCitjb25maWcgVE9QCisJYm9vbCAidG9wIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSB0b3AgcHJvZ3JhbSBwcm92aWRlcyBhIGR5bmFtaWMgcmVhbC10aW1lIHZpZXcgb2YgYSBydW5uaW5nCisJICBzeXN0ZW0uCisKK2NvbmZpZyBGRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCWJvb2wgIlNob3cgQ1BVIHBlci1wcm9jZXNzIHVzYWdlIHBlcmNlbnRhZ2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUT1AKKwloZWxwCisJICBNYWtlIHRvcCBkaXNwbGF5IENQVSB1c2FnZSBmb3IgZWFjaCBwcm9jZXNzLgorCSAgVGhpcyBhZGRzIGFib3V0IDJrLgorCitjb25maWcgRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUworCWJvb2wgIlNob3cgQ1BVIGdsb2JhbCB1c2FnZSBwZXJjZW50YWdlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwloZWxwCisJICBNYWtlcyB0b3AgZGlzcGxheSAiQ1BVOiBOTiUgdXNyIE5OJSBzeXMuLi4iIGxpbmUuCisJICBUaGlzIGFkZHMgYWJvdXQgMC41ay4KKworY29uZmlnIEZFQVRVUkVfVE9QX1NNUF9DUFUKKwlib29sICJTTVAgQ1BVIHVzYWdlIGRpc3BsYXkgKCdjJyBrZXkpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUworCWhlbHAKKwkgIEFsbG93ICdjJyBrZXkgdG8gc3dpdGNoIGJldHdlZW4gaW5kaXZpZHVhbC9jdW11bGF0aXZlIENQVSBzdGF0cworCSAgVGhpcyBhZGRzIGFib3V0IDAuNWsuCisKK2NvbmZpZyBGRUFUVVJFX1RPUF9ERUNJTUFMUworCWJvb2wgIlNob3cgMS8xMHRoIG9mIGEgcGVyY2VudCBpbiBDUFUvbWVtIHN0YXRpc3RpY3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCWhlbHAKKwkgIFNob3cgMS8xMHRoIG9mIGEgcGVyY2VudCBpbiBDUFUvbWVtIHN0YXRpc3RpY3MuCisJICBUaGlzIGFkZHMgYWJvdXQgMC4zay4KKworY29uZmlnIEZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJYm9vbCAiU2hvdyBDUFUgcHJvY2VzcyBydW5zIG9uICgnaicgZmllbGQpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVE9QCisJaGVscAorCSAgU2hvdyBDUFUgd2hlcmUgcHJvY2VzcyB3YXMgbGFzdCBmb3VuZCBydW5uaW5nIG9uLgorCSAgVGhpcyBpcyB0aGUgJ2onIGZpZWxkLgorCitjb25maWcgRkVBVFVSRV9UT1BNRU0KKwlib29sICJUb3BtZW0gY29tbWFuZCAoJ3MnIGtleSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUT1AKKwloZWxwCisJICBFbmFibGUgJ3MnIGluIHRvcCAoZ2l2ZXMgbG90cyBvZiBtZW1vcnkgaW5mbykuCisKK2NvbmZpZyBGRUFUVVJFX1NIT1dfVEhSRUFEUworCWJvb2wgIlN1cHBvcnQgZm9yIHNob3dpbmcgdGhyZWFkcyBpbiBwcy9wc3RyZWUvdG9wIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFMgfHwgVE9QIHx8IFBTVFJFRQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIHBzIC1UIG9wdGlvbiwgc2hvd2luZyBvZiB0aHJlYWRzIGluIHBzdHJlZSwKKwkgIGFuZCAnaCcgY29tbWFuZCBpbiB0b3AuCisKK2NvbmZpZyBXQVRDSAorCWJvb2wgIndhdGNoIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHdhdGNoIGlzIHVzZWQgdG8gZXhlY3V0ZSBhIHByb2dyYW0gcGVyaW9kaWNhbGx5LCBzaG93aW5nCisJICBvdXRwdXQgdG8gdGhlIHNjcmVlbi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvcHJvY3BzL0NvbmZpZy5zcmMgYi9wcm9jcHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBiMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwyMDQgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlByb2Nlc3MgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIEZSRUUKKwlib29sICJmcmVlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWCAjc3lzaW5mbygpCisJaGVscAorCSAgZnJlZSBkaXNwbGF5cyB0aGUgdG90YWwgYW1vdW50IG9mIGZyZWUgYW5kIHVzZWQgcGh5c2ljYWwgYW5kIHN3YXAKKwkgIG1lbW9yeSBpbiB0aGUgc3lzdGVtLCBhcyB3ZWxsIGFzIHRoZSBidWZmZXJzIHVzZWQgYnkgdGhlIGtlcm5lbC4KKwkgIFRoZSBzaGFyZWQgbWVtb3J5IGNvbHVtbiBzaG91bGQgYmUgaWdub3JlZDsgaXQgaXMgb2Jzb2xldGUuCisKK2NvbmZpZyBGVVNFUgorCWJvb2wgImZ1c2VyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZ1c2VyIGxpc3RzIGFsbCBQSURzIChQcm9jZXNzIElEcykgdGhhdCBjdXJyZW50bHkgaGF2ZSBhIGdpdmVuCisJICBmaWxlIG9wZW4uIGZ1c2VyIGNhbiBhbHNvIGxpc3QgYWxsIFBJRHMgdGhhdCBoYXZlIGEgZ2l2ZW4gbmV0d29yaworCSAgKFRDUCBvciBVRFApIHBvcnQgb3Blbi4KKworY29uZmlnIEtJTEwKKwlib29sICJraWxsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBjb21tYW5kIGtpbGwgc2VuZHMgdGhlIHNwZWNpZmllZCBzaWduYWwgdG8gdGhlIHNwZWNpZmllZAorCSAgcHJvY2VzcyBvciBwcm9jZXNzIGdyb3VwLiBJZiBubyBzaWduYWwgaXMgc3BlY2lmaWVkLCB0aGUgVEVSTQorCSAgc2lnbmFsIGlzIHNlbnQuCisKK2NvbmZpZyBLSUxMQUxMCisJYm9vbCAia2lsbGFsbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEtJTEwKKwloZWxwCisJICBraWxsYWxsIHNlbmRzIGEgc2lnbmFsIHRvIGFsbCBwcm9jZXNzZXMgcnVubmluZyBhbnkgb2YgdGhlCisJICBzcGVjaWZpZWQgY29tbWFuZHMuIElmIG5vIHNpZ25hbCBuYW1lIGlzIHNwZWNpZmllZCwgU0lHVEVSTSBpcworCSAgc2VudC4KKworY29uZmlnIEtJTExBTEw1CisJYm9vbCAia2lsbGFsbDUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBLSUxMCisKK2NvbmZpZyBQR1JFUAorCWJvb2wgInBncmVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIExvb2sgZm9yIHByb2Nlc3NlcyBieSBuYW1lLgorCitjb25maWcgUElET0YKKwlib29sICJwaWRvZiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQaWRvZiBmaW5kcyB0aGUgcHJvY2VzcyBpZCdzIChwaWRzKSBvZiB0aGUgbmFtZWQgcHJvZ3JhbXMuIEl0IHByaW50cworCSAgdGhvc2UgaWQncyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCitjb25maWcgRkVBVFVSRV9QSURPRl9TSU5HTEUKKwlib29sICJFbmFibGUgYXJndW1lbnQgZm9yIHNpbmdsZSBzaG90ICgtcykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQSURPRgorCWhlbHAKKwkgIFN1cHBvcnQgYXJndW1lbnQgJy1zJyBmb3IgcmV0dXJuaW5nIG9ubHkgdGhlIGZpcnN0IHBpZCBmb3VuZC4KKworY29uZmlnIEZFQVRVUkVfUElET0ZfT01JVAorCWJvb2wgIkVuYWJsZSBhcmd1bWVudCBmb3Igb21pdHRpbmcgcGlkcyAoLW8pIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUElET0YKKwloZWxwCisJICBTdXBwb3J0IGFyZ3VtZW50ICctbycgZm9yIG9taXR0aW5nIHRoZSBnaXZlbiBwaWRzIGluIG91dHB1dC4KKwkgIFRoZSBzcGVjaWFsIHBpZCAlUFBJRCBjYW4gYmUgdXNlZCB0byBuYW1lIHRoZSBwYXJlbnQgcHJvY2VzcworCSAgb2YgdGhlIHBpZG9mLCBpbiBvdGhlciB3b3JkcyB0aGUgY2FsbGluZyBzaGVsbCBvciBzaGVsbCBzY3JpcHQuCisKK2NvbmZpZyBQS0lMTAorCWJvb2wgInBraWxsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNlbmQgc2lnbmFscyB0byBwcm9jZXNzZXMgYnkgbmFtZS4KKworY29uZmlnIFBTCisJYm9vbCAicHMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcHMgZ2l2ZXMgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBwcm9jZXNzZXMuCisKK2NvbmZpZyBGRUFUVVJFX1BTX1dJREUKKwlib29sICJFbmFibGUgd2lkZSBvdXRwdXQgb3B0aW9uICgtdykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUworCWhlbHAKKwkgIFN1cHBvcnQgYXJndW1lbnQgJ3cnIGZvciB3aWRlIG91dHB1dC4KKwkgIElmIGdpdmVuIG9uY2UsIDEzMiBjaGFycyBhcmUgcHJpbnRlZCwgYW5kIGlmIGdpdmVuIG1vcmUKKwkgIHRoYW4gb25jZSwgdGhlIGxlbmd0aCBpcyB1bmxpbWl0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX1BTX1RJTUUKKwlib29sICJFbmFibGUgdGltZSBhbmQgZWxhcHNlZCB0aW1lIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTICYmIERFU0tUT1AKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTdXBwb3J0IC1vIHRpbWUgYW5kIC1vIGV0aW1lIG91dHB1dCBzcGVjaWZpZXJzLgorCitjb25maWcgRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMKKwlib29sICJFbmFibGUgYWRkaXRpb25hbCBwcyBjb2x1bW5zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFMgJiYgREVTS1RPUAorCWhlbHAKKwkgIFN1cHBvcnQgLW8gcmdyb3VwLCAtbyBydXNlciwgLW8gbmljZSBvdXRwdXQgc3BlY2lmaWVycy4KKworY29uZmlnIEZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TCisJYm9vbCAiU3VwcG9ydCBMaW51eCBwcmlvciB0byAyLjQuMCBhbmQgbm9uLUVMRiBzeXN0ZW1zIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV9QU19USU1FCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBtZWFzdXJpbmcgSFogb24gb2xkIGtlcm5lbHMgYW5kIG5vbi1FTEYgc3lzdGVtcworCSAgKGlmIHlvdSBhcmUgb24gTGludXggMi40LjArIGFuZCB1c2UgRUxGLCB5b3UgZG9uJ3QgbmVlZCB0aGlzKQorCitjb25maWcgUkVOSUNFCisJYm9vbCAicmVuaWNlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJlbmljZSBhbHRlcnMgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgb2Ygb25lIG9yIG1vcmUgcnVubmluZworCSAgcHJvY2Vzc2VzLgorCitjb25maWcgQkJfU1lTQ1RMCisJYm9vbCAic3lzY3RsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENvbmZpZ3VyZSBrZXJuZWwgcGFyYW1ldGVycyBhdCBydW50aW1lLgorCitjb25maWcgVE9QCisJYm9vbCAidG9wIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSB0b3AgcHJvZ3JhbSBwcm92aWRlcyBhIGR5bmFtaWMgcmVhbC10aW1lIHZpZXcgb2YgYSBydW5uaW5nCisJICBzeXN0ZW0uCisKK2NvbmZpZyBGRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCWJvb2wgIlNob3cgQ1BVIHBlci1wcm9jZXNzIHVzYWdlIHBlcmNlbnRhZ2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUT1AKKwloZWxwCisJICBNYWtlIHRvcCBkaXNwbGF5IENQVSB1c2FnZSBmb3IgZWFjaCBwcm9jZXNzLgorCSAgVGhpcyBhZGRzIGFib3V0IDJrLgorCitjb25maWcgRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUworCWJvb2wgIlNob3cgQ1BVIGdsb2JhbCB1c2FnZSBwZXJjZW50YWdlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwloZWxwCisJICBNYWtlcyB0b3AgZGlzcGxheSAiQ1BVOiBOTiUgdXNyIE5OJSBzeXMuLi4iIGxpbmUuCisJICBUaGlzIGFkZHMgYWJvdXQgMC41ay4KKworY29uZmlnIEZFQVRVUkVfVE9QX1NNUF9DUFUKKwlib29sICJTTVAgQ1BVIHVzYWdlIGRpc3BsYXkgKCdjJyBrZXkpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUworCWhlbHAKKwkgIEFsbG93ICdjJyBrZXkgdG8gc3dpdGNoIGJldHdlZW4gaW5kaXZpZHVhbC9jdW11bGF0aXZlIENQVSBzdGF0cworCSAgVGhpcyBhZGRzIGFib3V0IDAuNWsuCisKK2NvbmZpZyBGRUFUVVJFX1RPUF9ERUNJTUFMUworCWJvb2wgIlNob3cgMS8xMHRoIG9mIGEgcGVyY2VudCBpbiBDUFUvbWVtIHN0YXRpc3RpY3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCWhlbHAKKwkgIFNob3cgMS8xMHRoIG9mIGEgcGVyY2VudCBpbiBDUFUvbWVtIHN0YXRpc3RpY3MuCisJICBUaGlzIGFkZHMgYWJvdXQgMC4zay4KKworY29uZmlnIEZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJYm9vbCAiU2hvdyBDUFUgcHJvY2VzcyBydW5zIG9uICgnaicgZmllbGQpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVE9QCisJaGVscAorCSAgU2hvdyBDUFUgd2hlcmUgcHJvY2VzcyB3YXMgbGFzdCBmb3VuZCBydW5uaW5nIG9uLgorCSAgVGhpcyBpcyB0aGUgJ2onIGZpZWxkLgorCitjb25maWcgRkVBVFVSRV9UT1BNRU0KKwlib29sICJUb3BtZW0gY29tbWFuZCAoJ3MnIGtleSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUT1AKKwloZWxwCisJICBFbmFibGUgJ3MnIGluIHRvcCAoZ2l2ZXMgbG90cyBvZiBtZW1vcnkgaW5mbykuCisKK2NvbmZpZyBGRUFUVVJFX1NIT1dfVEhSRUFEUworCWJvb2wgIlN1cHBvcnQgZm9yIHNob3dpbmcgdGhyZWFkcyBpbiBwcy9wc3RyZWUvdG9wIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFMgfHwgVE9QIHx8IFBTVFJFRQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIHBzIC1UIG9wdGlvbiwgc2hvd2luZyBvZiB0aHJlYWRzIGluIHBzdHJlZSwKKwkgIGFuZCAnaCcgY29tbWFuZCBpbiB0b3AuCisKK2NvbmZpZyBXQVRDSAorCWJvb2wgIndhdGNoIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHdhdGNoIGlzIHVzZWQgdG8gZXhlY3V0ZSBhIHByb2dyYW0gcGVyaW9kaWNhbGx5LCBzaG93aW5nCisJICBvdXRwdXQgdG8gdGhlIHNjcmVlbi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvcHJvY3BzL0tidWlsZC5zcmMgYi9wcm9jcHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWIxY2MwCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfRlJFRSkJKz0gZnJlZS5vCitsaWItJChDT05GSUdfRlVTRVIpCSs9IGZ1c2VyLm8KK2xpYi0kKENPTkZJR19LSUxMKQkrPSBraWxsLm8KK2xpYi0kKENPTkZJR19BU0gpCSs9IGtpbGwubyAgIyB1c2VkIGZvciBidWlsdC1pbiBraWxsIGJ5IGFzaAorbGliLSQoQ09ORklHX1BHUkVQKQkrPSBwZ3JlcC5vCitsaWItJChDT05GSUdfUEtJTEwpCSs9IHBncmVwLm8KK2xpYi0kKENPTkZJR19QSURPRikJKz0gcGlkb2YubworbGliLSQoQ09ORklHX1BTKQkrPSBwcy5vCitsaWItJChDT05GSUdfUkVOSUNFKQkrPSByZW5pY2UubworbGliLSQoQ09ORklHX0JCX1NZU0NUTCkJKz0gc3lzY3RsLm8KK2xpYi0kKENPTkZJR19UT1ApCSs9IHRvcC5vCitsaWItJChDT05GSUdfVVBUSU1FKQkrPSB1cHRpbWUubworbGliLSQoQ09ORklHX1dBVENIKSAgICAgKz0gd2F0Y2gubwpkaWZmIC0tZ2l0IGEvcHJvY3BzL2ZyZWUuYyBiL3Byb2Nwcy9mcmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMmZjMwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9mcmVlLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZnJlZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGdldG9wdCBub3QgbmVlZGVkICovCisKKy8vdXNhZ2U6I2RlZmluZSBmcmVlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiIElGX0RFU0tUT1AoIlstYi9rL20vZ10iKQorLy91c2FnZTojZGVmaW5lIGZyZWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHRoZSBhbW91bnQgb2YgZnJlZSBhbmQgdXNlZCBzeXN0ZW0gbWVtb3J5IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmcmVlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGZyZWVcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgICAgICAgICAgIHRvdGFsICAgICAgICAgdXNlZCAgICAgICAgIGZyZWUgICAgICAgc2hhcmVkICAgICAgYnVmZmVyc1xuIgorLy91c2FnZTogICAgICAgIiAgTWVtOiAgICAgICAyNTc2MjggICAgICAgMjQ4NzI0ICAgICAgICAgODkwNCAgICAgICAgNTk2NDQgICAgICAgIDkzMTI0XG4iCisvL3VzYWdlOiAgICAgICAiIFN3YXA6ICAgICAgIDEyODUxNiAgICAgICAgIDg0MDQgICAgICAgMTIwMTEyXG4iCisvL3VzYWdlOiAgICAgICAiVG90YWw6ICAgICAgIDM4NjE0NCAgICAgICAyNTcxMjggICAgICAgMTI5MDE2XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorI2VuZGlmCisKK3N0cnVjdCBnbG9iYWxzIHsKKwl1bnNpZ25lZCBtZW1fdW5pdDsKKyNpZiBFTkFCTEVfREVTS1RPUAorCXVuc2lnbmVkIHVuaXRfc3RlcHM7CisjIGRlZmluZSBHX3VuaXRfc3RlcHMgRy51bml0X3N0ZXBzCisjZWxzZQorIyBkZWZpbmUgR191bml0X3N0ZXBzIDEwCisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNjYWxlKHVuc2lnbmVkIGxvbmcgZCkKK3sKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nIGxvbmcpZCAqIEcubWVtX3VuaXQpID4+IEdfdW5pdF9zdGVwczsKK30KKworCitpbnQgZnJlZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZnJlZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgSUZfTk9UX0RFU0tUT1AoVU5VU0VEX1BBUkFNKSkKK3sKKwlzdHJ1Y3Qgc3lzaW5mbyBpbmZvOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfREVTS1RPUAorCUcudW5pdF9zdGVwcyA9IDEwOworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXJndlsxXVsxXSkgeworCQljYXNlICdiJzoKKwkJCUcudW5pdF9zdGVwcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnayc6IC8qIDJeMTAgKi8KKwkJCS8qIEcudW5pdF9zdGVwcyA9IDEwOyAtIGFscmVhZHkgaXMgKi8KKwkJCWJyZWFrOworCQljYXNlICdtJzogLyogMl4oMioxMCkgKi8KKwkJCUcudW5pdF9zdGVwcyA9IDIwOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOiAvKiAyXigzKjEwKSAqLworCQkJRy51bml0X3N0ZXBzID0gMzA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKyNlbmRpZgorCisJc3lzaW5mbygmaW5mbyk7CisKKwkvKiBLZXJuZWxzIHByaW9yIHRvIDIuNC54IHdpbGwgcmV0dXJuIGluZm8ubWVtX3VuaXQ9PTAsIHNvIGNvcGUuLi4gKi8KKwlHLm1lbV91bml0ID0gKGluZm8ubWVtX3VuaXQgPyBpbmZvLm1lbV91bml0IDogMSk7CisKKwlwcmludGYoIiAgICAgJTEzcyUxM3MlMTNzJTEzcyUxM3NcbiIsCisJCSJ0b3RhbCIsCisJCSJ1c2VkIiwKKwkJImZyZWUiLAorCQkic2hhcmVkIiwgImJ1ZmZlcnMiIC8qIHN3YXAgYW5kIHRvdGFsIGRvbid0IGhhdmUgdGhlc2UgY29sdW1ucyAqLworCQkvKiBwcm9jcHMgdmVyc2lvbiAzLjIuOCBhbHNvIHNob3dzICJjYWNoZWQiIGNvbHVtbiwgYnV0CisJCSAqIHN5c2luZm8oKSBkb2VzIG5vdCBwcm92aWRlIHRoaXMgdmFsdWUsIG5lZWQgdG8gcGFyc2UKKwkJICogL3Byb2MvbWVtaW5mbyBpbnN0ZWFkIGFuZCBnZXQgIkNhY2hlZDogTk5OIGtCIiBmcm9tIHRoZXJlLgorCQkgKi8KKwkpOworCisjZGVmaW5lIEZJRUxEU181ICIlMTNsbHUlMTNsbHUlMTNsbHUlMTNsbHUlMTNsbHVcbiIKKyNkZWZpbmUgRklFTERTXzMgKEZJRUxEU181ICsgMio2KQorI2RlZmluZSBGSUVMRFNfMiAoRklFTERTXzUgKyAzKjYpCisKKwlwcmludGYoIk1lbTogIik7CisJcHJpbnRmKEZJRUxEU181LAorCQlzY2FsZShpbmZvLnRvdGFscmFtKSwKKwkJc2NhbGUoaW5mby50b3RhbHJhbSAtIGluZm8uZnJlZXJhbSksCisJCXNjYWxlKGluZm8uZnJlZXJhbSksCisJCXNjYWxlKGluZm8uc2hhcmVkcmFtKSwKKwkJc2NhbGUoaW5mby5idWZmZXJyYW0pCisJKTsKKwkvKiBTaG93IGFsdGVybmF0ZSwgbW9yZSBtZWFuaW5nZnVsIGJ1c3kvZnJlZSBudW1iZXJzIGJ5IGNvdW50aW5nCisJICogYnVmZmVyIGNhY2hlIGFzIGZyZWUgbWVtb3J5IChtYWtlIGl0ICItLysgYnVmZmVycy9jYWNoZSIKKwkgKiBpZi93aGVuIHdlIGFkZCBzdXBwb3J0IGZvciAiY2FjaGVkIiBjb2x1bW4pOiAqLworCXByaW50ZigiLS8rIGJ1ZmZlcnM6ICAgICAgIik7CisJcHJpbnRmKEZJRUxEU18yLAorCQlzY2FsZShpbmZvLnRvdGFscmFtIC0gaW5mby5mcmVlcmFtIC0gaW5mby5idWZmZXJyYW0pLAorCQlzY2FsZShpbmZvLmZyZWVyYW0gKyBpbmZvLmJ1ZmZlcnJhbSkKKwkpOworI2lmIEJCX01NVQorCXByaW50ZigiU3dhcDoiKTsKKwlwcmludGYoRklFTERTXzMsCisJCXNjYWxlKGluZm8udG90YWxzd2FwKSwKKwkJc2NhbGUoaW5mby50b3RhbHN3YXAgLSBpbmZvLmZyZWVzd2FwKSwKKwkJc2NhbGUoaW5mby5mcmVlc3dhcCkKKwkpOworI2VuZGlmCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9mdXNlci5jIGIvcHJvY3BzL2Z1c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViNTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9mdXNlci5jCkBAIC0wLDAgKzEsMzIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0aW55IGZ1c2VyIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IDIwMDQgVG9ueSBKLiBXaGl0ZQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZ1c2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gRklMRSBvciBQT1JUL1BST1RPIgorLy91c2FnZTojZGVmaW5lIGZ1c2VyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRmluZCBwcm9jZXNzZXMgd2hpY2ggdXNlIEZJTEVzIG9yIFBPUlRzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1tCUZpbmQgcHJvY2Vzc2VzIHdoaWNoIHVzZSBzYW1lIGZzIGFzIEZJTEVzIgorLy91c2FnZTogICAgICJcbgktNCwtNglTZWFyY2ggb25seSBJUHY0L0lQdjYgc3BhY2UiCisvL3VzYWdlOiAgICAgIlxuCS1zCURvbid0IGRpc3BsYXkgUElEcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJS2lsbCBmb3VuZCBwcm9jZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuCS1TSUdOQUwJU2lnbmFsIHRvIHNlbmQgKGRlZmF1bHQ6IEtJTEwpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBNQVhfTElORSAyNTUKKworI2RlZmluZSBPUFRJT05fU1RSSU5HICJta3M2NCIKK2VudW0geworCU9QVF9NT1VOVCAgPSAoMSA8PCAwKSwKKwlPUFRfS0lMTCAgID0gKDEgPDwgMSksCisJT1BUX1NJTEVOVCA9ICgxIDw8IDIpLAorCU9QVF9JUDYgICAgPSAoMSA8PCAzKSwKKwlPUFRfSVA0ICAgID0gKDEgPDwgNCksCit9OworCit0eXBlZGVmIHN0cnVjdCBpbm9kZV9saXN0IHsKKwlzdHJ1Y3QgaW5vZGVfbGlzdCAqbmV4dDsKKwlpbm9fdCBpbm9kZTsKKwlkZXZfdCBkZXY7Cit9IGlub2RlX2xpc3Q7CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgcmVjdXJzaW9uX2RlcHRoOworCXBpZF90IG15cGlkOworCWlub2RlX2xpc3QgKmlub2RlX2xpc3RfaGVhZDsKKwlzbWFsbGludCBraWxsX2ZhaWxlZDsKKwlpbnQga2lsbHNpZzsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcubXlwaWQgPSBnZXRwaWQoKTsgXAorCUcua2lsbHNpZyA9IFNJR0tJTEw7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGFkZF9pbm9kZShjb25zdCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisJaW5vZGVfbGlzdCAqKmN1cnIgPSAmRy5pbm9kZV9saXN0X2hlYWQ7CisKKwl3aGlsZSAoKmN1cnIpIHsKKwkJaWYgKCgqY3VyciktPmRldiA9PSBzdC0+c3RfZGV2CisJCSAmJiAoKmN1cnIpLT5pbm9kZSA9PSBzdC0+c3RfaW5vCisJCSkgeworCQkJcmV0dXJuOworCQl9CisJCWN1cnIgPSAmKCpjdXJyKS0+bmV4dDsKKwl9CisKKwkqY3VyciA9IHh6YWxsb2Moc2l6ZW9mKGlub2RlX2xpc3QpKTsKKwkoKmN1cnIpLT5kZXYgPSBzdC0+c3RfZGV2OworCSgqY3VyciktPmlub2RlID0gc3QtPnN0X2lubzsKK30KKworc3RhdGljIHNtYWxsaW50IHNlYXJjaF9kZXZfaW5vZGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0KQoreworCWlub2RlX2xpc3QgKmlsaXN0ID0gRy5pbm9kZV9saXN0X2hlYWQ7CisKKwl3aGlsZSAoaWxpc3QpIHsKKwkJaWYgKGlsaXN0LT5kZXYgPT0gc3QtPnN0X2RldikgeworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfTU9VTlQpCisJCQkJcmV0dXJuIDE7CisJCQlpZiAoaWxpc3QtPmlub2RlID09IHN0LT5zdF9pbm8pCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJaWxpc3QgPSBpbGlzdC0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2VudW0geworCVBST0NfTkVUID0gMCwKKwlQUk9DX0RJUiwKKwlQUk9DX0RJUl9MSU5LUywKKwlQUk9DX1NVQkRJUl9MSU5LUywKK307CisKK3N0YXRpYyBzbWFsbGludCBzY2FuX3Byb2NfbmV0X29yX21hcHMoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgcG9ydCkKK3sKKwlGSUxFICpmOworCWNoYXIgbGluZVtNQVhfTElORSArIDFdLCBhZGRyWzY4XTsKKwlpbnQgbWFqb3IsIG1pbm9yLCByOworCWxvbmcgbG9uZyB1aW50NjRfaW5vZGU7CisJdW5zaWduZWQgdG1wX3BvcnQ7CisJc21hbGxpbnQgcmV0dmFsOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJY29uc3QgY2hhciAqZm10OworCXZvaWQgKmZhZywgKnNhZzsKKworCWYgPSBmb3Blbl9mb3JfcmVhZChwYXRoKTsKKwlpZiAoIWYpCisJCXJldHVybiAwOworCisJaWYgKEcucmVjdXJzaW9uX2RlcHRoID09IFBST0NfTkVUKSB7CisJCWludCBmZDsKKworCQkvKiBmaW5kIHNvY2tldCBkZXYgKi8KKwkJc3RhdGJ1Zi5zdF9kZXYgPSAwOworCQlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWZzdGF0KGZkLCAmc3RhdGJ1Zik7CisJCQljbG9zZShmZCk7CisJCX0KKworCQlmbXQgPSAiJSpkOiAlNjRbMC05QS1GYS1mXToleCAlKng6JSp4ICUqeCAiCisJCQkiJSp4OiUqeCAlKng6JSp4ICUqeCAlKmQgJSpkICVsbHUiOworCQlmYWcgPSBhZGRyOworCQlzYWcgPSAmdG1wX3BvcnQ7CisJfSBlbHNlIHsKKwkJZm10ID0gIiUqcyAlKnMgJSpzICV4OiV4ICVsbHUiOworCQlmYWcgPSAmbWFqb3I7CisJCXNhZyA9ICZtaW5vcjsKKwl9CisKKwlyZXR2YWwgPSAwOworCXdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfTElORSwgZikpIHsKKwkJciA9IHNzY2FuZihsaW5lLCBmbXQsIGZhZywgc2FnLCAmdWludDY0X2lub2RlKTsKKwkJaWYgKHIgIT0gMykKKwkJCWNvbnRpbnVlOworCisJCXN0YXRidWYuc3RfaW5vID0gdWludDY0X2lub2RlOworCQlpZiAoRy5yZWN1cnNpb25fZGVwdGggPT0gUFJPQ19ORVQpIHsKKwkJCXIgPSBzdHJsZW4oYWRkcik7CisJCQlpZiAociA9PSA4ICYmIChvcHRpb25fbWFzazMyICYgT1BUX0lQNikpCisJCQkJY29udGludWU7CisJCQlpZiAociA+IDggJiYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfSVA0KSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh0bXBfcG9ydCA9PSBwb3J0KQorCQkJCWFkZF9pbm9kZSgmc3RhdGJ1Zik7CisJCX0gZWxzZSB7CisJCQlpZiAobWFqb3IgIT0gMCAmJiBtaW5vciAhPSAwICYmIHN0YXRidWYuc3RfaW5vICE9IDApIHsKKwkJCQlzdGF0YnVmLnN0X2RldiA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKKwkJCQlyZXR2YWwgPSBzZWFyY2hfZGV2X2lub2RlKCZzdGF0YnVmKTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2UoZik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc21hbGxpbnQgc2Nhbl9yZWN1cnNpdmUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlESVIgKmQ7CisJc3RydWN0IGRpcmVudCAqZF9lbnQ7CisJc21hbGxpbnQgc3RvcF9zY2FuOworCXNtYWxsaW50IHJldHZhbDsKKworCWQgPSBvcGVuZGlyKHBhdGgpOworCWlmIChkID09IE5VTEwpCisJCXJldHVybiAwOworCisJRy5yZWN1cnNpb25fZGVwdGgrKzsKKwlyZXR2YWwgPSAwOworCXN0b3Bfc2NhbiA9IDA7CisJd2hpbGUgKCFzdG9wX3NjYW4gJiYgKGRfZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQlwaWRfdCBwaWQ7CisJCWNoYXIgKnN1YnBhdGg7CisKKwkJc3VicGF0aCA9IGNvbmNhdF9zdWJwYXRoX2ZpbGUocGF0aCwgZF9lbnQtPmRfbmFtZSk7CisJCWlmIChzdWJwYXRoID09IE5VTEwpCisJCQljb250aW51ZTsgLyogLiBvciAuLiAqLworCisJCXN3aXRjaCAoRy5yZWN1cnNpb25fZGVwdGgpIHsKKwkJY2FzZSBQUk9DX0RJUjoKKwkJCXBpZCA9IChwaWRfdCliYl9zdHJ0b3UoZF9lbnQtPmRfbmFtZSwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vICE9IDAKKwkJCSB8fCBwaWQgPT0gRy5teXBpZAorCQkJLyogInRoaXMgUElEIGRvZXNuJ3QgdXNlIHNwZWNpZmllZCBGSUxFcyBvciBQT1JUL1BST1RPIjogKi8KKwkJCSB8fCBzY2FuX3JlY3Vyc2l2ZShzdWJwYXRoKSA9PSAwCisJCQkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0tJTEwpIHsKKwkJCQlpZiAoa2lsbChwaWQsIEcua2lsbHNpZykgIT0gMCkgeworCQkJCQliYl9wZXJyb3JfbXNnKCJraWxsIHBpZCAlcyIsIGRfZW50LT5kX25hbWUpOworCQkJCQlHLmtpbGxfZmFpbGVkID0gMTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1NJTEVOVCkpCisJCQkJcHJpbnRmKCIlcyAiLCBkX2VudC0+ZF9uYW1lKTsKKwkJCXJldHZhbCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBST0NfRElSX0xJTktTOgorCQkJc3dpdGNoICgKKwkJCQlpbmRleF9pbl9zdWJzdHJpbmdzKAorCQkJCQkiY3dkIiAgIlwwIiAiZXhlIiAgIlwwIgorCQkJCQkicm9vdCIgIlwwIiAiZmQiICAgIlwwIgorCQkJCQkibGliIiAgIlwwIiAibW1hcCIgIlwwIgorCQkJCQkibWFwcyIgIlwwIiwKKwkJCQkJZF9lbnQtPmRfbmFtZQorCQkJCSkKKwkJCSkgeworCQkJZW51bSB7CisJCQkJQ1dEX0xJTkssCisJCQkJRVhFX0xJTkssCisJCQkJUk9PVF9MSU5LLAorCQkJCUZEX0RJUl9MSU5LUywKKwkJCQlMSUJfRElSX0xJTktTLAorCQkJCU1NQVBfRElSX0xJTktTLAorCQkJCU1BUFMsCisJCQl9OworCQkJY2FzZSBDV0RfTElOSzoKKwkJCWNhc2UgRVhFX0xJTks6CisJCQljYXNlIFJPT1RfTElOSzoKKwkJCQlnb3RvIHNjYW5fbGluazsKKwkJCWNhc2UgRkRfRElSX0xJTktTOgorCQkJY2FzZSBMSUJfRElSX0xJTktTOgorCQkJY2FzZSBNTUFQX0RJUl9MSU5LUzoKKwkJCQlzdG9wX3NjYW4gPSBzY2FuX3JlY3Vyc2l2ZShzdWJwYXRoKTsKKwkJCQlpZiAoc3RvcF9zY2FuKQorCQkJCQlyZXR2YWwgPSBzdG9wX3NjYW47CisJCQkJYnJlYWs7CisJCQljYXNlIE1BUFM6CisJCQkJc3RvcF9zY2FuID0gc2Nhbl9wcm9jX25ldF9vcl9tYXBzKHN1YnBhdGgsIDApOworCQkJCWlmIChzdG9wX3NjYW4pCisJCQkJCXJldHZhbCA9IHN0b3Bfc2NhbjsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1NVQkRJUl9MSU5LUzoKKyAgc2Nhbl9saW5rOgorCQkJaWYgKHN0YXQoc3VicGF0aCwgJnN0YXRidWYpIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0b3Bfc2NhbiA9IHNlYXJjaF9kZXZfaW5vZGUoJnN0YXRidWYpOworCQkJaWYgKHN0b3Bfc2NhbikKKwkJCQlyZXR2YWwgPSBzdG9wX3NjYW47CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlmcmVlKHN1YnBhdGgpOworCX0KKwljbG9zZWRpcihkKTsKKwlHLnJlY3Vyc2lvbl9kZXB0aC0tOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBmdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZnVzZXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipwcDsKKworCUlOSVRfRygpOworCisJLyogSGFuZGxlIC1TSUdOQUwuIE9oIG15Li4uICovCisJcHAgPSBhcmd2OworCXdoaWxlICgqKytwcCkgeworCQlpbnQgc2lnOworCQljaGFyICphcmcgPSAqcHA7CisKKwkJaWYgKGFyZ1swXSAhPSAnLScpCisJCQljb250aW51ZTsKKwkJaWYgKGFyZ1sxXSA9PSAnLScgJiYgYXJnWzJdID09ICdcMCcpIC8qICItLSIgKi8KKwkJCWJyZWFrOworCQlpZiAoKGFyZ1sxXSA9PSAnNCcgfHwgYXJnWzFdID09ICc2JykgJiYgYXJnWzJdID09ICdcMCcpCisJCQljb250aW51ZTsgLyogaXQncyAiLTQiIG9yICItNiIgKi8KKwkJc2lnID0gZ2V0X3NpZ251bSgmYXJnWzFdKTsKKwkJaWYgKHNpZyA8IDApCisJCQljb250aW51ZTsKKwkJLyogIi1TSUdOQUwiIG9wdGlvbiBmb3VuZC4gUmVtb3ZlIGl0IGFuZCBiYWlsIG91dCAqLworCQlHLmtpbGxzaWcgPSBzaWc7CisJCWRvIHsKKwkJCXBwWzBdID0gYXJnID0gcHBbMV07CisJCQlwcCsrOworCQl9IHdoaWxlIChhcmcpOworCQlicmVhazsKKwl9CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIGF0IGxlYXN0IG9uZSBwYXJhbSAqLworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFJJTkcpOworCWFyZ3YgKz0gb3B0aW5kOworCisJcHAgPSBhcmd2OworCXdoaWxlICgqcHApIHsKKwkJLyogcGFyc2UgbmV0IGFyZyAqLworCQl1bnNpZ25lZCBwb3J0OworCQljaGFyIHBhdGhbc2l6ZW9mKCIvcHJvYy9uZXQvVENQNiIpXTsKKworCQlzdHJjcHkocGF0aCwgIi9wcm9jL25ldC8iKTsKKwkJaWYgKHNzY2FuZigqcHAsICIldS8lNHMiLCAmcG9ydCwgcGF0aCArIHNpemVvZigiL3Byb2MvbmV0LyIpLTEpID09IDIKKwkJICYmIGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwCisJCSkgeworCQkJLyogUE9SVC9QUk9UTyAqLworCQkJc2Nhbl9wcm9jX25ldF9vcl9tYXBzKHBhdGgsIHBvcnQpOworCQl9IGVsc2UgeworCQkJLyogRklMRSAqLworCQkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwkJCXhzdGF0KCpwcCwgJnN0YXRidWYpOworCQkJYWRkX2lub2RlKCZzdGF0YnVmKTsKKwkJfQorCQlwcCsrOworCX0KKworCWlmIChzY2FuX3JlY3Vyc2l2ZSgiL3Byb2MiKSkgeworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1NJTEVOVCkpCisJCQliYl9wdXRjaGFyKCdcbicpOworCQlyZXR1cm4gRy5raWxsX2ZhaWxlZDsKKwl9CisKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL2lvc3RhdC5jIGIvcHJvY3BzL2lvc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGQyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvaW9zdGF0LmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJlcG9ydCBDUFUgYW5kIEkvTyBzdGF0cywgYmFzZWQgb24gc3lzc3RhdCB2ZXJzaW9uIDkuMS4yIGJ5IFNlYmFzdGllbiBHb2RhcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBJT1NUQVQKKy8vY29uZmlnOglib29sICJpb3N0YXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmVwb3J0IENQVSBhbmQgSS9PIHN0YXRpc3RpY3MKKworLy9hcHBsZXQ6SUZfSU9TVEFUKEFQUExFVChpb3N0YXQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19JT1NUQVQpICs9IGlvc3RhdC5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+ICAvKiBzdHJ1Y3QgdXRzbmFtZSAqLworCisvLyNkZWZpbmUgZGVidWcoZm10LCAuLi4pIGZwcmludGYoc3RkZXJyLCBmbXQsICMjIF9fVkFfQVJHU19fKQorI2RlZmluZSBkZWJ1ZyhmbXQsIC4uLikgKCh2b2lkKTApCisKKyNkZWZpbmUgTUFYX0RFVklDRV9OQU1FIDEyCisjZGVmaW5lIE1BWF9ERVZJQ0VfTkFNRV9TVFIgIjEyIgorCisjaWYgMQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgY3B1dGltZV90OwordHlwZWRlZiBsb25nIGxvbmcgaWNwdXRpbWVfdDsKKyMgZGVmaW5lIEZNVF9EQVRBICJsbCIKKyMgZGVmaW5lIENQVVRJTUVfTUFYICh+MFVMTCkKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY3B1dGltZV90OwordHlwZWRlZiBsb25nIGljcHV0aW1lX3Q7CisjIGRlZmluZSBGTVRfREFUQSAibCIKKyMgZGVmaW5lIENQVVRJTUVfTUFYICh+MFVMKQorI2VuZGlmCisKK2VudW0geworCVNUQVRTX0NQVV9VU0VSLAorCVNUQVRTX0NQVV9OSUNFLAorCVNUQVRTX0NQVV9TWVNURU0sCisJU1RBVFNfQ1BVX0lETEUsCisJU1RBVFNfQ1BVX0lPV0FJVCwKKwlTVEFUU19DUFVfSVJRLAorCVNUQVRTX0NQVV9TT0ZUSVJRLAorCVNUQVRTX0NQVV9TVEVBTCwKKwlTVEFUU19DUFVfR1VFU1QsCisKKwlHTE9CQUxfVVBUSU1FLAorCVNNUF9VUFRJTUUsCisKKwlOX1NUQVRTX0NQVSwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwljcHV0aW1lX3QgdmVjdG9yW05fU1RBVFNfQ1BVXTsKK30gc3RhdHNfY3B1X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdGF0c19jcHVfdCAqcHJldjsKKwlzdGF0c19jcHVfdCAqY3VycjsKKwljcHV0aW1lX3QgaXR2OworfSBzdGF0c19jcHVfcGFpcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBsb25nIHJkX3NlY3RvcnM7CisJdW5zaWduZWQgbG9uZyBsb25nIHdyX3NlY3RvcnM7CisJdW5zaWduZWQgbG9uZyByZF9vcHM7CisJdW5zaWduZWQgbG9uZyB3cl9vcHM7Cit9IHN0YXRzX2Rldl9kYXRhX3Q7CisKK3R5cGVkZWYgc3RydWN0IHN0YXRzX2RldiB7CisJc3RydWN0IHN0YXRzX2RldiAqbmV4dDsKKwljaGFyIGRuYW1lW01BWF9ERVZJQ0VfTkFNRSArIDFdOworCXN0YXRzX2Rldl9kYXRhX3QgcHJldl9kYXRhOworCXN0YXRzX2Rldl9kYXRhX3QgY3Vycl9kYXRhOworfSBzdGF0c19kZXZfdDsKKworLyogR2xvYmFscy4gU29ydCBieSBzaXplIGFuZCBhY2Nlc3MgZnJlcXVlbmN5LiAqLworc3RydWN0IGdsb2JhbHMgeworCXNtYWxsaW50IHNob3dfYWxsOworCXVuc2lnbmVkIHRvdGFsX2NwdXM7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIENQVXMgKi8KKwl1bnNpZ25lZCBjbGtfdGNrOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBjbG9jayB0aWNrcyBwZXIgc2Vjb25kICovCisJbGxpc3RfdCAqZGV2X25hbWVfbGlzdDsgICAgICAgICAvKiBMaXN0IG9mIGRldmljZXMgZW50ZXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lICovCisJc3RhdHNfZGV2X3QgKnN0YXRzX2Rldl9saXN0OworCXN0cnVjdCB0bSB0bXRpbWU7CisJc3RydWN0IHsKKwkJY29uc3QgY2hhciAqc3RyOworCQl1bnNpZ25lZCBkaXY7CisJfSB1bml0OworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUcudW5pdC5zdHIgPSAiQmxrIjsgXAorCUcudW5pdC5kaXYgPSAxOyBcCit9IHdoaWxlICgwKQorCisvKiBNdXN0IG1hdGNoIG9wdGlvbiBzdHJpbmchICovCitlbnVtIHsKKwlPUFRfYyA9IDEgPDwgMCwKKwlPUFRfZCA9IDEgPDwgMSwKKwlPUFRfdCA9IDEgPDwgMiwKKwlPUFRfeiA9IDEgPDwgMywKKwlPUFRfayA9IDEgPDwgNCwKKwlPUFRfbSA9IDEgPDwgNSwKK307CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGdldF91c2VyX2h6KHZvaWQpCit7CisJcmV0dXJuIHN5c2NvbmYoX1NDX0NMS19UQ0spOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSBpbnQgdGhpc19pc19zbXAodm9pZCkKK3sKKwlyZXR1cm4gKEcudG90YWxfY3B1cyA+IDEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWFkZXIodm9pZCkKK3sKKwljaGFyIGJ1ZlszMl07CisJc3RydWN0IHV0c25hbWUgdXRzOworCisJdW5hbWUoJnV0cyk7IC8qIG5ldmVyIGZhaWxzICovCisKKwkvKiBEYXRlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgKi8KKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJXgiLCAmRy50bXRpbWUpOworCisJcHJpbnRmKCIlcyAlcyAoJXMpIFx0JXMgXHRfJXNfXHQoJXUgQ1BVKVxuXG4iLAorCQkJdXRzLnN5c25hbWUsIHV0cy5yZWxlYXNlLCB1dHMubm9kZW5hbWUsCisJCQlidWYsIHV0cy5tYWNoaW5lLCBHLnRvdGFsX2NwdXMpOworfQorCitzdGF0aWMgdm9pZCBnZXRfbG9jYWx0aW1lKHN0cnVjdCB0bSAqcHRtKQoreworCXRpbWVfdCB0aW1lcjsKKwl0aW1lKCZ0aW1lcik7CisJbG9jYWx0aW1lX3IoJnRpbWVyLCBwdG0pOworfQorCitzdGF0aWMgdm9pZCBwcmludF90aW1lc3RhbXAodm9pZCkKK3sKKwljaGFyIGJ1Zls2NF07CisJLyogJXg6IGRhdGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZSAqLworCS8qICVYOiB0aW1lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgKi8KKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJXggJVgiLCAmRy50bXRpbWUpOworCXByaW50ZigiJXNcbiIsIGJ1Zik7Cit9CisKK3N0YXRpYyBjcHV0aW1lX3QgZ2V0X3NtcF91cHRpbWUodm9pZCkKK3sKKwlGSUxFICpmcDsKKwl1bnNpZ25lZCBsb25nIHNlYywgZGVjOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL3VwdGltZSIpOworCisJaWYgKGZzY2FuZihmcCwgIiVsdS4lbHUiLCAmc2VjLCAmZGVjKSAhPSAyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVhZCAnJXMnIiwgIi9wcm9jL3VwdGltZSIpOworCisJZmNsb3NlKGZwKTsKKworCXJldHVybiAoY3B1dGltZV90KXNlYyAqIEcuY2xrX3RjayArIGRlYyAqIEcuY2xrX3RjayAvIDEwMDsKK30KKworLyogRmV0Y2ggQ1BVIHN0YXRpc3RpY3MgZnJvbSAvcHJvYy9zdGF0ICovCitzdGF0aWMgdm9pZCBnZXRfY3B1X3N0YXRpc3RpY3Moc3RhdHNfY3B1X3QgKnNjKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzEwMjRdOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL3N0YXQiKTsKKworCW1lbXNldChzYywgMCwgc2l6ZW9mKCpzYykpOworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQlpbnQgaTsKKwkJY2hhciAqaWJ1ZjsKKworCQkvKiBEb2VzIHRoZSBsaW5lIHN0YXJ0IHdpdGggImNwdSAiPyAqLworCQlpZiAoIXN0YXJ0c193aXRoX2NwdShidWYpIHx8IGJ1ZlszXSAhPSAnICcpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlidWYgPSBidWYgKyA0OworCQlmb3IgKGkgPSBTVEFUU19DUFVfVVNFUjsgaSA8PSBTVEFUU19DUFVfR1VFU1Q7IGkrKykgeworCQkJaWJ1ZiA9IHNraXBfd2hpdGVzcGFjZShpYnVmKTsKKwkJCXNzY2FuZihpYnVmLCAiJSJGTVRfREFUQSJ1IiwgJnNjLT52ZWN0b3JbaV0pOworCQkJaWYgKGkgIT0gU1RBVFNfQ1BVX0dVRVNUKSB7CisJCQkJc2MtPnZlY3RvcltHTE9CQUxfVVBUSU1FXSArPSBzYy0+dmVjdG9yW2ldOworCQkJfQorCQkJaWJ1ZiA9IHNraXBfbm9uX3doaXRlc3BhY2UoaWJ1Zik7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKHRoaXNfaXNfc21wKCkpIHsKKwkJc2MtPnZlY3RvcltTTVBfVVBUSU1FXSA9IGdldF9zbXBfdXB0aW1lKCk7CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgY3B1dGltZV90IGdldF9pbnRlcnZhbChjcHV0aW1lX3Qgb2xkLCBjcHV0aW1lX3QgbmV3KQoreworCWNwdXRpbWVfdCBpdHYgPSBuZXcgLSBvbGQ7CisKKwlyZXR1cm4gKGl0diA9PSAwKSA/IDEgOiBpdHY7Cit9CisKKyNpZiBDUFVUSU1FX01BWCA+IDB4ZmZmZmZmZmYKKy8qCisgKiBIYW5kbGUgb3ZlcmZsb3cgY29uZGl0aW9ucyBwcm9wZXJseSBmb3IgY291bnRlcnMgd2hpY2ggY2FuIGhhdmUKKyAqIGxlc3MgYml0cyB0aGFuIGNwdXRpbWVfdCwgZGVwZW5kaW5nIG9uIHRoZSBrZXJuZWwgdmVyc2lvbi4KKyAqLworLyogU3VycHJpc2luZ2x5LCBvbiAzMmJpdCBpbmxpbmluZyBpcyBhIHNpemUgd2luICovCitzdGF0aWMgQUxXQVlTX0lOTElORSBjcHV0aW1lX3Qgb3ZlcmZsb3dfc2FmZV9zdWIoY3B1dGltZV90IHByZXYsIGNwdXRpbWVfdCBjdXJyKQoreworCWNwdXRpbWVfdCB2ID0gY3VyciAtIHByZXY7CisKKwlpZiAoKGljcHV0aW1lX3QpdiA8IDAgICAgIC8qIGN1cnIgPCBwcmV2IC0gY291bnRlciBvdmVyZmxvdz8gKi8KKwkgJiYgcHJldiA8PSAweGZmZmZmZmZmIC8qIGtlcm5lbCB1c2VzIDMyYml0IHZhbHVlIGZvciB0aGUgY291bnRlcj8gKi8KKwkpIHsKKwkJLyogQWRkIDMzdGggYml0IHNldCB0byAxIHRvIGN1cnIsIGNvbXBlbnNhdGluZyBmb3IgdGhlIG92ZXJmbG93ICovCisJCS8qIGRvdWJsZSBzaGlmdCBkZWZlYXRzICJ3YXJuaW5nOiBsZWZ0IHNoaWZ0IGNvdW50ID49IHdpZHRoIG9mIHR5cGUiICovCisJCXYgKz0gKChjcHV0aW1lX3QpMSA8PCAxNikgPDwgMTY7CisJfQorCXJldHVybiB2OworfQorI2Vsc2UKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGNwdXRpbWVfdCBvdmVyZmxvd19zYWZlX3N1YihjcHV0aW1lX3QgcHJldiwgY3B1dGltZV90IGN1cnIpCit7CisJcmV0dXJuIGN1cnIgLSBwcmV2OworfQorI2VuZGlmCisKK3N0YXRpYyBkb3VibGUgcGVyY2VudF92YWx1ZShjcHV0aW1lX3QgcHJldiwgY3B1dGltZV90IGN1cnIsIGNwdXRpbWVfdCBpdHYpCit7CisJcmV0dXJuICgoZG91YmxlKW92ZXJmbG93X3NhZmVfc3ViKHByZXYsIGN1cnIpKSAvIGl0diAqIDEwMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHNfY3B1X3N0cnVjdChzdGF0c19jcHVfcGFpcl90ICpzdGF0cykKK3sKKwljcHV0aW1lX3QgKnAgPSBzdGF0cy0+cHJldi0+dmVjdG9yOworCWNwdXRpbWVfdCAqYyA9IHN0YXRzLT5jdXJyLT52ZWN0b3I7CisJcHJpbnRmKCIgICAgICAgICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmXG4iLAorCQlwZXJjZW50X3ZhbHVlKHBbU1RBVFNfQ1BVX1VTRVJdICAsIGNbU1RBVFNfQ1BVX1VTRVJdICAsIHN0YXRzLT5pdHYpLAorCQlwZXJjZW50X3ZhbHVlKHBbU1RBVFNfQ1BVX05JQ0VdICAsIGNbU1RBVFNfQ1BVX05JQ0VdICAsIHN0YXRzLT5pdHYpLAorCQlwZXJjZW50X3ZhbHVlKHBbU1RBVFNfQ1BVX1NZU1RFTV0gKyBwW1NUQVRTX0NQVV9TT0ZUSVJRXSArIHBbU1RBVFNfQ1BVX0lSUV0sCisJCQljW1NUQVRTX0NQVV9TWVNURU1dICsgY1tTVEFUU19DUFVfU09GVElSUV0gKyBjW1NUQVRTX0NQVV9JUlFdLCBzdGF0cy0+aXR2KSwKKwkJcGVyY2VudF92YWx1ZShwW1NUQVRTX0NQVV9JT1dBSVRdLCBjW1NUQVRTX0NQVV9JT1dBSVRdLCBzdGF0cy0+aXR2KSwKKwkJcGVyY2VudF92YWx1ZShwW1NUQVRTX0NQVV9TVEVBTF0gLCBjW1NUQVRTX0NQVV9TVEVBTF0gLCBzdGF0cy0+aXR2KSwKKwkJcGVyY2VudF92YWx1ZShwW1NUQVRTX0NQVV9JRExFXSAgLCBjW1NUQVRTX0NQVV9JRExFXSAgLCBzdGF0cy0+aXR2KQorCSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9yZXBvcnQoc3RhdHNfY3B1X3BhaXJfdCAqc3RhdHMpCit7CisJLyogQWx3YXlzIHByaW50IGEgaGVhZGVyICovCisJcHV0cygiYXZnLWNwdTogICV1c2VyICAgJW5pY2UgJXN5c3RlbSAlaW93YWl0ICAlc3RlYWwgICAlaWRsZSIpOworCisJLyogUHJpbnQgY3VycmVudCBzdGF0aXN0aWNzICovCisJcHJpbnRfc3RhdHNfY3B1X3N0cnVjdChzdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRzX2Rldl9zdHJ1Y3Qoc3RhdHNfZGV2X3QgKnN0YXRzX2RldiwgY3B1dGltZV90IGl0dikKK3sKKwlzdGF0c19kZXZfZGF0YV90ICpwID0gJnN0YXRzX2Rldi0+cHJldl9kYXRhOworCXN0YXRzX2Rldl9kYXRhX3QgKmMgPSAmc3RhdHNfZGV2LT5jdXJyX2RhdGE7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeikKKwkJaWYgKHAtPnJkX29wcyA9PSBjLT5yZF9vcHMgJiYgcC0+d3Jfb3BzID09IGMtPndyX29wcykKKwkJCXJldHVybjsKKworCXByaW50ZigiJS0xM3MgJTguMmYgJTEyLjJmICUxMi4yZiAlMTBsbHUgJTEwbGx1XG4iLAorCQlzdGF0c19kZXYtPmRuYW1lLAorCQlwZXJjZW50X3ZhbHVlKHAtPnJkX29wcyArIHAtPndyX29wcywgYy0+cmRfb3BzICsgYy0+d3Jfb3BzLCBpdHYpLAorCQlwZXJjZW50X3ZhbHVlKHAtPnJkX3NlY3RvcnMsIGMtPnJkX3NlY3RvcnMsIGl0dikgLyBHLnVuaXQuZGl2LAorCQlwZXJjZW50X3ZhbHVlKHAtPndyX3NlY3RvcnMsIGMtPndyX3NlY3RvcnMsIGl0dikgLyBHLnVuaXQuZGl2LAorCQkoYy0+cmRfc2VjdG9ycyAtIHAtPnJkX3NlY3RvcnMpIC8gRy51bml0LmRpdiwKKwkJKGMtPndyX3NlY3RvcnMgLSBwLT53cl9zZWN0b3JzKSAvIEcudW5pdC5kaXYKKwkpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9kZXZzdGF0X2hlYWRlcih2b2lkKQoreworCXByaW50ZigiRGV2aWNlOiUxNXMlNnMlcy9zJTZzJXMvcyU2cyVzJTZzJXNcbiIsCisJCSJ0cHMiLAorCQlHLnVuaXQuc3RyLCAiX3JlYWQiLCBHLnVuaXQuc3RyLCAiX3dydG4iLAorCQlHLnVuaXQuc3RyLCAiX3JlYWQiLCBHLnVuaXQuc3RyLCAiX3dydG4iCisJKTsKK30KKworLyoKKyAqIElzIGlucHV0IHBhcnRpdGlvbiBvZiBmb3JtYXQgW3NkYU5dPworICovCitzdGF0aWMgaW50IGlzX3BhcnRpdGlvbihjb25zdCBjaGFyICpkZXYpCit7CisJLyogT2ssIHRoaXMgaXMgbmFpdmUuLi4gKi8KKwlyZXR1cm4gKChkZXZbMF0gLSAncycpIHwgKGRldlsxXSAtICdkJykgfCAoZGV2WzJdIC0gJ2EnKSkgPT0gMCAmJiBpc2RpZ2l0KGRldlszXSk7Cit9CisKK3N0YXRpYyBzdGF0c19kZXZfdCAqc3RhdHNfZGV2X2ZpbmRfb3JfbmV3KGNvbnN0IGNoYXIgKmRldl9uYW1lKQoreworCXN0YXRzX2Rldl90ICoqY3VyciA9ICZHLnN0YXRzX2Rldl9saXN0OworCisJd2hpbGUgKCpjdXJyICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcCgoKmN1cnIpLT5kbmFtZSwgZGV2X25hbWUpID09IDApCisJCQlyZXR1cm4gKmN1cnI7CisJCWN1cnIgPSAmKCpjdXJyKS0+bmV4dDsKKwl9CisKKwkqY3VyciA9IHh6YWxsb2Moc2l6ZW9mKHN0YXRzX2Rldl90KSk7CisJc3RybmNweSgoKmN1cnIpLT5kbmFtZSwgZGV2X25hbWUsIE1BWF9ERVZJQ0VfTkFNRSk7CisJcmV0dXJuICpjdXJyOworfQorCitzdGF0aWMgdm9pZCBzdGF0c19kZXZfZnJlZShzdGF0c19kZXZfdCAqc3RhdHNfZGV2KQoreworCWlmIChzdGF0c19kZXYpIHsKKwkJc3RhdHNfZGV2X2ZyZWUoc3RhdHNfZGV2LT5uZXh0KTsKKwkJZnJlZShzdGF0c19kZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgZG9fZGlza19zdGF0aXN0aWNzKGNwdXRpbWVfdCBpdHYpCit7CisJY2hhciBidWZbMTI4XTsKKwljaGFyIGRldl9uYW1lW01BWF9ERVZJQ0VfTkFNRSArIDFdOworCXVuc2lnbmVkIGxvbmcgbG9uZyByZF9zZWNfb3JfZHVtbXk7CisJdW5zaWduZWQgbG9uZyBsb25nIHdyX3NlY19vcl9kdW1teTsKKwlzdGF0c19kZXZfZGF0YV90ICpjdXJyX2RhdGE7CisJc3RhdHNfZGV2X3QgKnN0YXRzX2RldjsKKwlGSUxFICpmcDsKKwlpbnQgcmM7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2MvZGlza3N0YXRzIik7CisJLyogUmVhZCBhbmQgcG9zc2libHkgcHJpbnQgc3RhdHMgZnJvbSAvcHJvYy9kaXNrc3RhdHMgKi8KKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCXNzY2FuZihidWYsICIlKnMgJSpzICUiTUFYX0RFVklDRV9OQU1FX1NUUiJzIiwgZGV2X25hbWUpOworCQlpZiAoRy5kZXZfbmFtZV9saXN0KSB7CisJCQkvKiBJcyBkZXZpY2UgbmFtZSBpbiBsaXN0PyAqLworCQkJaWYgKCFsbGlzdF9maW5kX3N0cihHLmRldl9uYW1lX2xpc3QsIGRldl9uYW1lKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChpc19wYXJ0aXRpb24oZGV2X25hbWUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN0YXRzX2RldiA9IHN0YXRzX2Rldl9maW5kX29yX25ldyhkZXZfbmFtZSk7CisJCWN1cnJfZGF0YSA9ICZzdGF0c19kZXYtPmN1cnJfZGF0YTsKKworCQlyYyA9IHNzY2FuZihidWYsICIlKnMgJSpzICUqcyAlbHUgJWxsdSAlbGx1ICVsbHUgJWx1ICUqcyAlbGx1IiwKKwkJCSZjdXJyX2RhdGEtPnJkX29wcywKKwkJCSZyZF9zZWNfb3JfZHVtbXksCisJCQkmY3Vycl9kYXRhLT5yZF9zZWN0b3JzLAorCQkJJndyX3NlY19vcl9kdW1teSwKKwkJCSZjdXJyX2RhdGEtPndyX29wcywKKwkJCSZjdXJyX2RhdGEtPndyX3NlY3RvcnMpOworCQlpZiAocmMgIT0gNikgeworCQkJY3Vycl9kYXRhLT5yZF9zZWN0b3JzID0gcmRfc2VjX29yX2R1bW15OworCQkJY3Vycl9kYXRhLT53cl9zZWN0b3JzID0gd3Jfc2VjX29yX2R1bW15OworCQkJLy9jdXJyX2RhdGEtPnJkX29wcyA9IDsKKwkJCWN1cnJfZGF0YS0+d3Jfb3BzID0gKHVuc2lnbmVkIGxvbmcpY3Vycl9kYXRhLT5yZF9zZWN0b3JzOworCQl9CisKKwkJaWYgKCFHLmRldl9uYW1lX2xpc3QgLyogVXNlciBkaWRuJ3Qgc3BlY2lmeSBkZXZpY2UgKi8KKwkJICYmICFHLnNob3dfYWxsCisJCSAmJiBjdXJyX2RhdGEtPnJkX29wcyA9PSAwCisJCSAmJiBjdXJyX2RhdGEtPndyX29wcyA9PSAwCisJCSkgeworCQkJLyogRG9uJ3QgcHJpbnQgdW51c2VkIGRldmljZSAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQcmludCBjdXJyZW50IHN0YXRpc3RpY3MgKi8KKwkJcHJpbnRfc3RhdHNfZGV2X3N0cnVjdChzdGF0c19kZXYsIGl0dik7CisJCXN0YXRzX2Rldi0+cHJldl9kYXRhID0gKmN1cnJfZGF0YTsKKwl9CisKKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgdm9pZCBkZXZfcmVwb3J0KGNwdXRpbWVfdCBpdHYpCit7CisJLyogQWx3YXlzIHByaW50IGEgaGVhZGVyICovCisJcHJpbnRfZGV2c3RhdF9oZWFkZXIoKTsKKworCS8qIEZldGNoIGN1cnJlbnQgZGlzayBzdGF0aXN0aWNzICovCisJZG9fZGlza19zdGF0aXN0aWNzKGl0dik7Cit9CisKKy8vdXNhZ2U6I2RlZmluZSBpb3N0YXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY10gWy1kXSBbLXRdIFstel0gWy1rfC1tXSBbQUxMfEJMT0NLREVWLi4uXSBbSU5URVJWQUwgW0NPVU5UXV0iCisvL3VzYWdlOiNkZWZpbmUgaW9zdGF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVwb3J0IENQVSBhbmQgSS9PIHN0YXRpc3RpY3NcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJU2hvdyBDUFUgdXRpbGl6YXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1kCVNob3cgZGV2aWNlIHV0aWxpemF0aW9uIgorLy91c2FnZTogICAgICJcbgktdAlQcmludCBjdXJyZW50IHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS16CU9taXQgZGV2aWNlcyB3aXRoIG5vIGFjdGl2aXR5IgorLy91c2FnZTogICAgICJcbgktawlVc2Uga2IvcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JVXNlIE1iL3MiCisKK2ludCBpb3N0YXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlvc3RhdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdDsKKwl1bnNpZ25lZCBpbnRlcnZhbDsKKwlpbnQgY291bnQ7CisJc3RhdHNfY3B1X3Qgc3RhdHNfZGF0YVsyXTsKKwlzbWFsbGludCBjdXJyZW50X3N0YXRzOworCisJSU5JVF9HKCk7CisKKwltZW1zZXQoJnN0YXRzX2RhdGEsIDAsIHNpemVvZihzdGF0c19kYXRhKSk7CisKKwkvKiBHZXQgbnVtYmVyIG9mIGNsb2NrIHRpY2tzIHBlciBzZWMgKi8KKwlHLmNsa190Y2sgPSBnZXRfdXNlcl9oeigpOworCisJLyogRGV0ZXJtaW5lIG51bWJlciBvZiBDUFVzICovCisJRy50b3RhbF9jcHVzID0gZ2V0X2NwdV9jb3VudCgpOworCWlmIChHLnRvdGFsX2NwdXMgPT0gMCkKKwkJRy50b3RhbF9jcHVzID0gMTsKKworCS8qIFBhcnNlIGFuZCBwcm9jZXNzIGFyZ3VtZW50cyAqLworCS8qIC1rIGFuZCAtbSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiay0tbTptLS1rIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2R0emttIik7CisJaWYgKCEob3B0ICYgKE9QVF9jICsgT1BUX2QpKSkKKwkJLyogRGVmYXVsdCBpcyAtY2QgKi8KKwkJb3B0IHw9IE9QVF9jICsgT1BUX2Q7CisKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIFN0b3JlIGRldmljZSBuYW1lcyBpbnRvIGRldmljZSBsaXN0ICovCisJd2hpbGUgKCphcmd2ICYmICFpc2RpZ2l0KCphcmd2WzBdKSkgeworCQlpZiAoc3RyY21wKCphcmd2LCAiQUxMIikgIT0gMCkgeworCQkJLyogSWYgbm90IEFMTCwgc2F2ZSBkZXZpY2UgbmFtZSAqLworCQkJY2hhciAqZGV2X25hbWUgPSBza2lwX2Rldl9wZngoKmFyZ3YpOworCQkJaWYgKCFsbGlzdF9maW5kX3N0cihHLmRldl9uYW1lX2xpc3QsIGRldl9uYW1lKSkgeworCQkJCWxsaXN0X2FkZF90bygmRy5kZXZfbmFtZV9saXN0LCBkZXZfbmFtZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlHLnNob3dfYWxsID0gMTsKKwkJfQorCQlhcmd2Kys7CisJfQorCisJaW50ZXJ2YWwgPSAwOworCWNvdW50ID0gMTsKKwlpZiAoKmFyZ3YpIHsKKwkJLyogR2V0IGludGVydmFsICovCisJCWludGVydmFsID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCQljb3VudCA9IChpbnRlcnZhbCAhPSAwID8gLTEgOiAxKTsKKwkJYXJndisrOworCQlpZiAoKmFyZ3YpCisJCQkvKiBHZXQgY291bnQgdmFsdWUgKi8KKwkJCWNvdW50ID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCX0KKworCWlmIChvcHQgJiBPUFRfbSkgeworCQlHLnVuaXQuc3RyID0gIiBNQiI7CisJCUcudW5pdC5kaXYgPSAyMDQ4OworCX0KKworCWlmIChvcHQgJiBPUFRfaykgeworCQlHLnVuaXQuc3RyID0gIiBrQiI7CisJCUcudW5pdC5kaXYgPSAyOworCX0KKworCWdldF9sb2NhbHRpbWUoJkcudG10aW1lKTsKKworCS8qIERpc3BsYXkgaGVhZGVyICovCisJcHJpbnRfaGVhZGVyKCk7CisKKwljdXJyZW50X3N0YXRzID0gMDsKKwkvKiBNYWluIGxvb3AgKi8KKwlmb3IgKDs7KSB7CisJCXN0YXRzX2NwdV9wYWlyX3Qgc3RhdHM7CisKKwkJc3RhdHMucHJldiA9ICZzdGF0c19kYXRhW2N1cnJlbnRfc3RhdHMgXiAxXTsKKwkJc3RhdHMuY3VyciA9ICZzdGF0c19kYXRhW2N1cnJlbnRfc3RhdHNdOworCisJCS8qIEZpbGwgdGhlIHRpbWUgc3RydWN0dXJlICovCisJCWdldF9sb2NhbHRpbWUoJkcudG10aW1lKTsKKworCQkvKiBGZXRjaCBjdXJyZW50IENQVSBzdGF0aXN0aWNzICovCisJCWdldF9jcHVfc3RhdGlzdGljcyhzdGF0cy5jdXJyKTsKKworCQkvKiBHZXQgaW50ZXJ2YWwgKi8KKwkJc3RhdHMuaXR2ID0gZ2V0X2ludGVydmFsKAorCQkJc3RhdHMucHJldi0+dmVjdG9yW0dMT0JBTF9VUFRJTUVdLAorCQkJc3RhdHMuY3Vyci0+dmVjdG9yW0dMT0JBTF9VUFRJTUVdCisJCSk7CisKKwkJaWYgKG9wdCAmIE9QVF90KQorCQkJcHJpbnRfdGltZXN0YW1wKCk7CisKKwkJaWYgKG9wdCAmIE9QVF9jKSB7CisJCQljcHVfcmVwb3J0KCZzdGF0cyk7CisJCQlpZiAob3B0ICYgT1BUX2QpCisJCQkJLyogU2VwYXJhdGUgb3V0cHV0cyBieSBhIG5ld2xpbmUgKi8KKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisKKwkJaWYgKG9wdCAmIE9QVF9kKSB7CisJCQlpZiAodGhpc19pc19zbXAoKSkgeworCQkJCXN0YXRzLml0diA9IGdldF9pbnRlcnZhbCgKKwkJCQkJc3RhdHMucHJldi0+dmVjdG9yW1NNUF9VUFRJTUVdLAorCQkJCQlzdGF0cy5jdXJyLT52ZWN0b3JbU01QX1VQVElNRV0KKwkJCQkpOworCQkJfQorCQkJZGV2X3JlcG9ydChzdGF0cy5pdHYpOworCQl9CisKKwkJYmJfcHV0Y2hhcignXG4nKTsKKworCQlpZiAoY291bnQgPiAwKSB7CisJCQlpZiAoLS1jb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogU3dhcCBzdGF0cyAqLworCQljdXJyZW50X3N0YXRzIF49IDE7CisKKwkJc2xlZXAoaW50ZXJ2YWwpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlsbGlzdF9mcmVlKEcuZGV2X25hbWVfbGlzdCwgTlVMTCk7CisJCXN0YXRzX2Rldl9mcmVlKEcuc3RhdHNfZGV2X2xpc3QpOworCQlmcmVlKCZHKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL2tpbGwuYyBiL3Byb2Nwcy9raWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ZTVhZAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9raWxsLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkga2lsbC9raWxsYWxsWzVdIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IEJydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPi4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBraWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxdIFstU0lHXSBQSUQuLi4iCisvL3VzYWdlOiNkZWZpbmUga2lsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgYSBzaWduYWwgKGRlZmF1bHQ6IFRFUk0pIHRvIGdpdmVuIFBJRHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBhbGwgc2lnbmFsIG5hbWVzIGFuZCBudW1iZXJzIgorLyogLy91c2FnZTogICJcbgktcyBTSUcJWWV0IGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgU0lHIiAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBraWxsX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHBzIHwgZ3JlcCBhcGFjaGVcbiIKKy8vdXNhZ2U6ICAgICAgICIyNTIgcm9vdCAgICAgcm9vdCAgICAgUyBbYXBhY2hlXVxuIgorLy91c2FnZTogICAgICAgIjI2MyB3d3ctZGF0YSB3d3ctZGF0YSBTIFthcGFjaGVdXG4iCisvL3VzYWdlOiAgICAgICAiMjY0IHd3dy1kYXRhIHd3dy1kYXRhIFMgW2FwYWNoZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIyNjUgd3d3LWRhdGEgd3d3LWRhdGEgUyBbYXBhY2hlXVxuIgorLy91c2FnZTogICAgICAgIjI2NiB3d3ctZGF0YSB3d3ctZGF0YSBTIFthcGFjaGVdXG4iCisvL3VzYWdlOiAgICAgICAiMjY3IHd3dy1kYXRhIHd3dy1kYXRhIFMgW2FwYWNoZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGtpbGwgMjUyXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGtpbGxhbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbF0gWy1xXSBbLVNJR10gUFJPQ0VTU19OQU1FLi4uIgorLy91c2FnZTojZGVmaW5lIGtpbGxhbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIGEgc2lnbmFsIChkZWZhdWx0OiBURVJNKSB0byBnaXZlbiBwcm9jZXNzZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBhbGwgc2lnbmFsIG5hbWVzIGFuZCBudW1iZXJzIgorLyogLy91c2FnZTogICJcbgktcyBTSUcJWWV0IGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgU0lHIiAqLworLy91c2FnZTogICAgICJcbgktcQlEb24ndCBjb21wbGFpbiBpZiBubyBwcm9jZXNzZXMgd2VyZSBraWxsZWQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGtpbGxhbGxfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQga2lsbGFsbCBhcGFjaGVcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUga2lsbGFsbDVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbF0gWy1TSUddIFstbyBQSURdLi4uIgorLy91c2FnZTojZGVmaW5lIGtpbGxhbGw1X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBhIHNpZ25hbCAoZGVmYXVsdDogVEVSTSkgdG8gYWxsIHByb2Nlc3NlcyBvdXRzaWRlIGN1cnJlbnQgc2Vzc2lvblxuIgorLy91c2FnZTogICAgICJcbgktbAlMaXN0IGFsbCBzaWduYWwgbmFtZXMgYW5kIG51bWJlcnMiCisvL3VzYWdlOiAgICAgIlxuCS1vIFBJRAlEb24ndCBzaWduYWwgdGhpcyBQSUQiCisvKiAvL3VzYWdlOiAgIlxuCS1zIFNJRwlZZXQgYW5vdGhlciB3YXkgb2Ygc3BlY2lmeWluZyBTSUciICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBOb3RlOiBraWxsX21haW4gaXMgZGlyZWN0bHkgY2FsbGVkIGZyb20gc2hlbGwgaW4gb3JkZXIgdG8gaW1wbGVtZW50CisgKiBraWxsIGJ1aWx0LWluLiBTaGVsbCBzdWJzdGl0dXRlcyBqb2IgaWRzIHdpdGggcHJvY2VzcyBncm91cHMgZmlyc3QuCisgKgorICogVGhpcyBicmluZ3Mgc29tZSBjb21wbGljYXRpb25zOgorICoKKyAqICsgd2UgY2FuJ3QgdXNlIHhmdW5jIGhlcmUKKyAqICsgd2UgY2FuJ3QgdXNlIGFwcGxldF9uYW1lCisgKiArIHdlIGNhbid0IHVzZSBiYl9zaG93X3VzYWdlCisgKiAoQWJvdmUgZG9lc24ndCBhcHBseSBmb3Iga2lsbGFsbFs1XSBjYXNlcykKKyAqCisgKiBraWxsICVuIGdldHMgdHJhbnNsYXRlZCBpbnRvIGtpbGwgJyAtPHByb2Nlc3MgZ3JvdXA+JyBieSBzaGVsbCAobm90ZSBzcGFjZSEpCisgKiBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBraWxsIC05IC4uLiBzeW50YXgKKyAqLworCitpbnQga2lsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICphcmc7CisJcGlkX3QgcGlkOworCWludCBzaWdubyA9IFNJR1RFUk0sIGVycm9ycyA9IDAsIHF1aWV0ID0gMDsKKyNpZiAhRU5BQkxFX0tJTExBTEwgJiYgIUVOQUJMRV9LSUxMQUxMNQorI2RlZmluZSBraWxsYWxsIDAKKyNkZWZpbmUga2lsbGFsbDUgMAorI2Vsc2UKKy8qIEhvdyB0byBkZXRlcm1pbmUgd2hvIHdlIGFyZT8gZmluZCAzcmQgY2hhciBmcm9tIHRoZSBlbmQ6CisgKiBraWxsLCBraWxsYWxsLCBraWxsYWxsNQorICogIF5pICAgICAgIF5hICAgICAgICBebCAgLSBpdCdzIHVuaXF1ZQorICogKGNoZWNraW5nIGZyb20gdGhlIHN0YXJ0IGlzIGNvbXBsaWNhdGVkIGJ5IC9iaW4va2lsbC4uLiBjYXNlKSAqLworCWNvbnN0IGNoYXIgY2hhcjMgPSBhcmd2WzBdW3N0cmxlbihhcmd2WzBdKSAtIDNdOworI2RlZmluZSBraWxsYWxsIChFTkFCTEVfS0lMTEFMTCAmJiBjaGFyMyA9PSAnYScpCisjZGVmaW5lIGtpbGxhbGw1IChFTkFCTEVfS0lMTEFMTDUgJiYgY2hhcjMgPT0gJ2wnKQorI2VuZGlmCisKKwkvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLworCWFyZ2MtLTsKKwlhcmcgPSAqKythcmd2OworCisJaWYgKGFyZ2MgPCAxIHx8IGFyZ1swXSAhPSAnLScpIHsKKwkJZ290byBkb19pdF9ub3c7CisJfQorCisJLyogVGhlIC1sIG9wdGlvbiwgd2hpY2ggcHJpbnRzIG91dCBzaWduYWwgbmFtZXMuCisJICogSW50ZW5kZWQgdXNhZ2UgaW4gc2hlbGw6CisJICogZWNobyAiRGllZCBvZiBTSUdga2lsbCAtbCAkP2AiCisJICogV2UgdHJ5IHRvIG1pbWljIHdoYXQga2lsbCBmcm9tIGNvcmV1dGlscy02LjggZG9lcyAqLworCWlmIChhcmdbMV0gPT0gJ2wnICYmIGFyZ1syXSA9PSAnXDAnKSB7CisJCWlmIChhcmdjID09IDEpIHsKKwkJCS8qIFByaW50IHRoZSB3aG9sZSBzaWduYWwgbGlzdCAqLworCQkJcHJpbnRfc2lnbmFtZXMoKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIC1sIDxzaWcgbGlzdD4gKi8KKwkJd2hpbGUgKChhcmcgPSAqKythcmd2KSkgeworCQkJaWYgKGlzZGlnaXQoYXJnWzBdKSkgeworCQkJCXNpZ25vID0gYmJfc3RydG91KGFyZywgTlVMTCwgMTApOworCQkJCWlmIChlcnJubykgeworCQkJCQliYl9lcnJvcl9tc2coInVua25vd24gc2lnbmFsICclcyciLCBhcmcpOworCQkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQkvKiBFeGl0Y29kZXMgPj0gMHg4MCBhcmUgdG8gYmUgdHJlYXRlZAorCQkJCSAqIGFzICJraWxsZWQgYnkgc2lnbmFsIChleGl0Y29kZSAmIDB4N2YpIiAqLworCQkJCXB1dHMoZ2V0X3NpZ25hbWUoc2lnbm8gJiAweDdmKSk7CisJCQkJLyogVE9ETzogJ2JhZCcgc2lnbmFsIyAtIGNvcmV1dGlscyBzYXlzOgorCQkJCSAqIGtpbGw6IDEyNzogaW52YWxpZCBzaWduYWwKKwkJCQkgKiB3ZSBqdXN0IHByaW50ICIxMjciIGluc3RlYWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJc2lnbm8gPSBnZXRfc2lnbnVtKGFyZyk7CisJCQkJaWYgKHNpZ25vIDwgMCkgeworCQkJCQliYl9lcnJvcl9tc2coInVua25vd24gc2lnbmFsICclcyciLCBhcmcpOworCQkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQlwcmludGYoIiVkXG4iLCBzaWdubyk7CisJCQl9CisJCX0KKwkJLyogSWYgdGhleSBzcGVjaWZpZWQgLWwsIHdlIGFyZSBhbGwgZG9uZSAqLworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFRoZSAtcSBxdWlldCBvcHRpb24gKi8KKwlpZiAoa2lsbGFsbCAmJiBhcmdbMV0gPT0gJ3EnICYmIGFyZ1syXSA9PSAnXDAnKSB7CisJCXF1aWV0ID0gMTsKKwkJYXJnID0gKisrYXJndjsKKwkJYXJnYy0tOworCQlpZiAoYXJnYyA8IDEpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJZ290byBkb19pdF9ub3c7CisJfQorCisJYXJnKys7IC8qIHNraXAgJy0nICovCisKKwkvKiAtbyBQSUQ/IChpZiBwcmVzZW50LCBpdCBhbHdheXMgaXMgYXQgdGhlIGVuZCBvZiBjb21tYW5kIGxpbmUpICovCisJaWYgKGtpbGxhbGw1ICYmIGFyZ1swXSA9PSAnbycpCisJCWdvdG8gZG9faXRfbm93OworCisJaWYgKGFyZ2MgPiAxICYmIGFyZ1swXSA9PSAncycgJiYgYXJnWzFdID09ICdcMCcpIHsgLyogLXMgU0lHPyAqLworCQlhcmdjLS07CisJCWFyZyA9ICorK2FyZ3Y7CisJfSAvKiBlbHNlIGl0IG11c3QgYmUgLVNJRyAqLworCXNpZ25vID0gZ2V0X3NpZ251bShhcmcpOworCWlmIChzaWdubyA8IDApIHsgLyogfHwgc2lnbm8gPiBNQVhfU0lHTlVNID8gKi8KKwkJYmJfZXJyb3JfbXNnKCJiYWQgc2lnbmFsIG5hbWUgJyVzJyIsIGFyZyk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWFyZyA9ICorK2FyZ3Y7CisJYXJnYy0tOworCisgZG9faXRfbm93OgorCXBpZCA9IGdldHBpZCgpOworCisJaWYgKGtpbGxhbGw1KSB7CisJCXBpZF90IHNpZDsKKwkJcHJvY3BzX3N0YXR1c190KiBwID0gTlVMTDsKKwkJaW50IHJldCA9IDA7CisKKwkJLyogRmluZCBvdXQgb3VyIHNlc3Npb24gaWQgKi8KKwkJc2lkID0gZ2V0c2lkKHBpZCk7CisJCS8qIFN0b3AgYWxsIHByb2Nlc3NlcyAqLworCQlraWxsKC0xLCBTSUdTVE9QKTsKKwkJLyogU2lnbmFsIGFsbCBwcm9jZXNzZXMgZXhjZXB0IHRob3NlIGluIG91ciBzZXNzaW9uICovCisJCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIFBTU0NBTl9QSUR8UFNTQ0FOX1NJRCkpKSB7CisJCQlpbnQgaTsKKworCQkJaWYgKHAtPnNpZCA9PSAodW5zaWduZWQpc2lkCisJCQkgfHwgcC0+cGlkID09ICh1bnNpZ25lZClwaWQKKwkJCSB8fCBwLT5waWQgPT0gMSkKKwkJCQljb250aW51ZTsKKworCQkJLyogQWxsIHJlbWFpbmluZyBhcmdzIG11c3QgYmUgLW8gUElEIG9wdGlvbnMuCisJCQkgKiBDaGVjayBwLT5waWQgYWdhaW5zdCB0aGVtLiAqLworCQkJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQkJCXBpZF90IG9taXQ7CisKKwkJCQlhcmcgPSBhcmd2W2ldOworCQkJCWlmIChhcmdbMF0gIT0gJy0nIHx8IGFyZ1sxXSAhPSAnbycpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJiYWQgb3B0aW9uICclcyciLCBhcmcpOworCQkJCQlyZXQgPSAxOworCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQl9CisJCQkJYXJnICs9IDI7CisJCQkJaWYgKCFhcmdbMF0gJiYgYXJndlsrK2ldKQorCQkJCQlhcmcgPSBhcmd2W2ldOworCQkJCW9taXQgPSBiYl9zdHJ0b2koYXJnLCBOVUxMLCAxMCk7CisJCQkJaWYgKGVycm5vKSB7CisJCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisJCQkJCXJldCA9IDE7CisJCQkJCWdvdG8gcmVzdW1lOworCQkJCX0KKwkJCQlpZiAocC0+cGlkID09IG9taXQpCisJCQkJCWdvdG8gZG9udF9raWxsOworCQkJfQorCQkJa2lsbChwLT5waWQsIHNpZ25vKTsKKyBkb250X2tpbGw6IDsKKwkJfQorIHJlc3VtZToKKwkJLyogQW5kIGxldCB0aGVtIGNvbnRpbnVlICovCisJCWtpbGwoLTEsIFNJR0NPTlQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFBpZCBvciBuYW1lIGlzIHJlcXVpcmVkIGZvciBraWxsL2tpbGxhbGwgKi8KKwlpZiAoYXJnYyA8IDEpIHsKKwkJYmJfZXJyb3JfbXNnKCJ5b3UgbmVlZCB0byBzcGVjaWZ5IHdob20gdG8ga2lsbCIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCWlmIChraWxsYWxsKSB7CisJCS8qIExvb2tzIGxpa2UgdGhleSB3YW50IHRvIGRvIGEga2lsbGFsbC4gIERvIHRoYXQgKi8KKwkJd2hpbGUgKGFyZykgeworCQkJcGlkX3QqIHBpZExpc3Q7CisKKwkJCXBpZExpc3QgPSBmaW5kX3BpZF9ieV9uYW1lKGFyZyk7CisJCQlpZiAoKnBpZExpc3QgPT0gMCkgeworCQkJCWVycm9ycysrOworCQkJCWlmICghcXVpZXQpCisJCQkJCWJiX2Vycm9yX21zZygiJXM6IG5vIHByb2Nlc3Mga2lsbGVkIiwgYXJnKTsKKwkJCX0gZWxzZSB7CisJCQkJcGlkX3QgKnBsOworCisJCQkJZm9yIChwbCA9IHBpZExpc3Q7ICpwbDsgcGwrKykgeworCQkJCQlpZiAoKnBsID09IHBpZCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoa2lsbCgqcGwsIHNpZ25vKSA9PSAwKQorCQkJCQkJY29udGludWU7CisJCQkJCWVycm9ycysrOworCQkJCQlpZiAoIXF1aWV0KQorCQkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qga2lsbCBwaWQgJWQiLCAoaW50KSpwbCk7CisJCQkJfQorCQkJfQorCQkJZnJlZShwaWRMaXN0KTsKKwkJCWFyZyA9ICorK2FyZ3Y7CisJCX0KKwkJcmV0dXJuIGVycm9yczsKKwl9CisKKwkvKiBMb29rcyBsaWtlIHRoZXkgd2FudCB0byBkbyBhIGtpbGwuIERvIHRoYXQgKi8KKwl3aGlsZSAoYXJnKSB7CisjaWYgRU5BQkxFX0FTSCB8fCBFTkFCTEVfSFVTSAorCQkvKgorCQkgKiBXZSBuZWVkIHRvIHN1cHBvcnQgc2hlbGwncyAiaGFjayBmb3JtYXRzIiBvZgorCQkgKiAiIC1QUkdQX0lEIiAoeWVzLCB3aXRoIGEgbGVhZGluZyBzcGFjZSkKKwkJICogYW5kICIgUElEMSBQSUQyIFBJRDMiICh3aXRoIGRlZ2VuZXJhdGUgY2FzZSAiIikKKwkJICovCisJCXdoaWxlICgqYXJnICE9ICdcMCcpIHsKKwkJCWNoYXIgKmVuZDsKKwkJCWlmICgqYXJnID09ICcgJykKKwkJCQlhcmcrKzsKKwkJCXBpZCA9IGJiX3N0cnRvaShhcmcsICZlbmQsIDEwKTsKKwkJCWlmIChlcnJubyAmJiAoZXJybm8gIT0gRUlOVkFMIHx8ICplbmQgIT0gJyAnKSkgeworCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisJCQkJKmVuZCA9ICdcMCc7CisJCQkJZXJyb3JzKys7CisJCQl9IGVsc2UgaWYgKGtpbGwocGlkLCBzaWdubykgIT0gMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGtpbGwgcGlkICVkIiwgKGludClwaWQpOworCQkJCWVycm9ycysrOworCQkJfQorCQkJYXJnID0gZW5kOyAvKiBjYW4gb25seSBwb2ludCB0byAnICcgb3IgJ1wwJyBub3cgKi8KKwkJfQorI2Vsc2UKKwkJcGlkID0gYmJfc3RydG9pKGFyZywgTlVMTCwgMTApOworCQlpZiAoZXJybm8pIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisJCQllcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChraWxsKHBpZCwgc2lnbm8pICE9IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGtpbGwgcGlkICVkIiwgKGludClwaWQpOworCQkJZXJyb3JzKys7CisJCX0KKyNlbmRpZgorCQlhcmcgPSAqKythcmd2OworCX0KKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL21wc3RhdC5jIGIvcHJvY3BzL21wc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNWE1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvbXBzdGF0LmMKQEAgLTAsMCArMSw5NzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFBlci1wcm9jZXNzb3Igc3RhdGlzdGljcywgYmFzZWQgb24gc3lzc3RhdCB2ZXJzaW9uIDkuMS4yIGJ5IFNlYmFzdGllbiBHb2RhcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX01QU1RBVChBUFBMRVQobXBzdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfTVBTVEFUKSArPSBtcHN0YXQubworCisvL2NvbmZpZzpjb25maWcgTVBTVEFUCisvL2NvbmZpZzoJYm9vbCAibXBzdGF0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFBlci1wcm9jZXNzb3Igc3RhdGlzdGljcworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAgLyogc3RydWN0IHV0c25hbWUgKi8KKworLy8jZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGVidWcoZm10LCAuLi4pICgodm9pZCkwKQorCisvKiBTaXplIG9mIC9wcm9jL2ludGVycnVwdHMgbGluZSwgQ1BVIGRhdGEgZXhjbHVkZWQgKi8KKyNkZWZpbmUgSU5URVJSVVBUU19MSU5FICAgIDY0CisvKiBNYXhpbXVtIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIE5SX0lSUVMgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTlJfSVJRQ1BVX1BSRUFMTE9DIDMKKyNkZWZpbmUgTUFYX0lSUU5BTUVfTEVOICAgIDE2CisjZGVmaW5lIE1BWF9QRl9OQU1FICAgICAgICA1MTIKKy8qIHN5c3N0YXQgOS4wLjYgdXNlcyB3aWR0aCA4LCBidXQgbmV3ZXIgY29kZSB3aGljaCBhbHNvIHByaW50cyAvcHJvYy9zb2Z0aXJxcworICogZGF0YSBuZWVkcyBtb3JlOiAiaW50ZXJydXB0cyIgaW4gL3Byb2Mvc29mdGlycXMgaGF2ZSBsb25nZXIgbmFtZXMsCisgKiBtb3N0IGFyZSB1cCB0byA4IGNoYXJzLCBvbmUgKEJMT0NLX0lPUE9MTCkgaXMgZXZlbiBsb25nZXIuCisgKiBXZSBhcmUgcHJpbnRpbmcgaGVhZGVycyBpbiB0aGUgIiBJUlFOQU1FL3MiIGZvcm0sIGV4cGVyaW1lbnRhbGx5CisgKiBhbnl0aGluZyBzbWFsbGVyIHRoYW4gMTAgY2hhcnMgbG9va3MgdWdseSBmb3IgL3Byb2Mvc29mdGlycXMgc3RhdHMuCisgKi8KKyNkZWZpbmUgSU5UUkFURV9TQ1JXSURUSCAgICAgIDEwCisjZGVmaW5lIElOVFJBVEVfU0NSV0lEVEhfU1RSICIxMCIKKworLyogU3lzdGVtIGZpbGVzICovCisjZGVmaW5lIFBST0NGU19TVEFUICAgICAgICIvcHJvYy9zdGF0IgorI2RlZmluZSBQUk9DRlNfSU5URVJSVVBUUyAiL3Byb2MvaW50ZXJydXB0cyIKKyNkZWZpbmUgUFJPQ0ZTX1NPRlRJUlFTICAgIi9wcm9jL3NvZnRpcnFzIgorI2RlZmluZSBQUk9DRlNfVVBUSU1FICAgICAiL3Byb2MvdXB0aW1lIgorCisKKyNpZiAxCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpZGF0YV90OworI2RlZmluZSBGTVRfREFUQSAibGwiCisjZGVmaW5lIERBVEFfTUFYIFVMTE9OR19NQVgKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZGF0YV90OwordHlwZWRlZiBsb25nIGlkYXRhX3Q7CisjZGVmaW5lIEZNVF9EQVRBICJsIgorI2RlZmluZSBEQVRBX01BWCBVTE9OR19NQVgKKyNlbmRpZgorCisKK3N0cnVjdCBzdGF0c19pcnFjcHUgeworCXVuc2lnbmVkIGludGVycnVwdHM7CisJY2hhciBpcnFfbmFtZVtNQVhfSVJRTkFNRV9MRU5dOworfTsKKworc3RydWN0IHN0YXRzX2NwdSB7CisJZGF0YV90IGNwdV91c2VyOworCWRhdGFfdCBjcHVfbmljZTsKKwlkYXRhX3QgY3B1X3N5c3RlbTsKKwlkYXRhX3QgY3B1X2lkbGU7CisJZGF0YV90IGNwdV9pb3dhaXQ7CisJZGF0YV90IGNwdV9zdGVhbDsKKwlkYXRhX3QgY3B1X2lycTsKKwlkYXRhX3QgY3B1X3NvZnRpcnE7CisJZGF0YV90IGNwdV9ndWVzdDsKK307CisKK3N0cnVjdCBzdGF0c19pcnEgeworCWRhdGFfdCBpcnFfbnI7Cit9OworCisKKy8qIEdsb2JhbHMuIFNvcnQgYnkgc2l6ZSBhbmQgYWNjZXNzIGZyZXF1ZW5jeS4gKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgaW50ZXJ2YWw7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNwdV9ucjsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIENQVXMgKi8KKwl1bnNpZ25lZCBpcnFjcHVfbnI7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBDUFUgKi8KKwl1bnNpZ25lZCBzb2Z0aXJxY3B1X25yOyAgICAgICAgIC8qIE51bWJlciBvZiBzb2Z0IGludGVycnVwdHMgcGVyIENQVSAqLworCXVuc2lnbmVkIG9wdGlvbnM7CisJdW5zaWduZWQgaHo7CisJdW5zaWduZWQgY3B1X2JpdG1hcF9sZW47CisJc21hbGxpbnQgcF9vcHRpb247CisJLy8gOS4wLjYgZG9lcyBub3QgZG8gaXQuIFRyeSAibXBzdGF0IC1BIDEgMiIgLSBoZWFkZXJzIGFyZSByZXBlYXRlZCEKKwkvL3NtYWxsaW50IGhlYWRlcl9kb25lOworCS8vc21hbGxpbnQgYXZnX2hlYWRlcl9kb25lOworCXVuc2lnbmVkIGNoYXIgKmNwdV9iaXRtYXA7ICAgICAgLyogQml0IDA6IGdsb2JhbCwgYml0IDE6IDFzdCBwcm9jLi4uICovCisJZGF0YV90IGdsb2JhbF91cHRpbWVbM107CisJZGF0YV90IHBlcl9jcHVfdXB0aW1lWzNdOworCXN0cnVjdCBzdGF0c19jcHUgKnN0X2NwdVszXTsKKwlzdHJ1Y3Qgc3RhdHNfaXJxICpzdF9pcnFbM107CisJc3RydWN0IHN0YXRzX2lycWNwdSAqc3RfaXJxY3B1WzNdOworCXN0cnVjdCBzdGF0c19pcnFjcHUgKnN0X3NvZnRpcnFjcHVbM107CisJc3RydWN0IHRtIHRpbWVzdGFtcFszXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIFRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzIHN0YXRpc3RpY3MgKGJpdHMgaW4gRy5vcHRpb25zKSAqLworZW51bSB7CisJRF9DUFUgICAgICA9IDEgPDwgMCwKKwlEX0lSUV9TVU0gID0gMSA8PCAxLAorCURfSVJRX0NQVSAgPSAxIDw8IDIsCisJRF9TT0ZUSVJRUyA9IDEgPDwgMywKK307CisKKworLyogSXMgb3B0aW9uIG9uPyAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGRpc3BsYXlfb3B0KGludCBvcHQpCit7CisJcmV0dXJuIChvcHQgJiBHLm9wdGlvbnMpOworfQorCisjaWYgREFUQV9NQVggPiAweGZmZmZmZmZmCisvKgorICogSGFuZGxlIG92ZXJmbG93IGNvbmRpdGlvbnMgcHJvcGVybHkgZm9yIGNvdW50ZXJzIHdoaWNoIGNhbiBoYXZlCisgKiBsZXNzIGJpdHMgdGhhbiBkYXRhX3QsIGRlcGVuZGluZyBvbiB0aGUga2VybmVsIHZlcnNpb24uCisgKi8KKy8qIFN1cnByaXNpbmdseSwgb24gMzJiaXQgaW5saW5pbmcgaXMgYSBzaXplIHdpbiAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgZGF0YV90IG92ZXJmbG93X3NhZmVfc3ViKGRhdGFfdCBwcmV2LCBkYXRhX3QgY3VycikKK3sKKwlkYXRhX3QgdiA9IGN1cnIgLSBwcmV2OworCisJaWYgKChpZGF0YV90KXYgPCAwICAgICAvKiBjdXJyIDwgcHJldiAtIGNvdW50ZXIgb3ZlcmZsb3c/ICovCisJICYmIHByZXYgPD0gMHhmZmZmZmZmZiAvKiBrZXJuZWwgdXNlcyAzMmJpdCB2YWx1ZSBmb3IgdGhlIGNvdW50ZXI/ICovCisJKSB7CisJCS8qIEFkZCAzM3RoIGJpdCBzZXQgdG8gMSB0byBjdXJyLCBjb21wZW5zYXRpbmcgZm9yIHRoZSBvdmVyZmxvdyAqLworCQkvKiBkb3VibGUgc2hpZnQgZGVmZWF0cyAid2FybmluZzogbGVmdCBzaGlmdCBjb3VudCA+PSB3aWR0aCBvZiB0eXBlIiAqLworCQl2ICs9ICgoZGF0YV90KTEgPDwgMTYpIDw8IDE2OworCX0KKwlyZXR1cm4gdjsKK30KKyNlbHNlCitzdGF0aWMgQUxXQVlTX0lOTElORSBkYXRhX3Qgb3ZlcmZsb3dfc2FmZV9zdWIoZGF0YV90IHByZXYsIGRhdGFfdCBjdXJyKQoreworCXJldHVybiBjdXJyIC0gcHJldjsKK30KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlIHBlcmNlbnRfdmFsdWUoZGF0YV90IHByZXYsIGRhdGFfdCBjdXJyLCBkYXRhX3QgaXR2KQoreworCXJldHVybiAoKGRvdWJsZSlvdmVyZmxvd19zYWZlX3N1YihwcmV2LCBjdXJyKSkgLyBpdHYgKiAxMDA7Cit9CisKK3N0YXRpYyBkb3VibGUgaHpfdmFsdWUoZGF0YV90IHByZXYsIGRhdGFfdCBjdXJyLCBkYXRhX3QgaXR2KQoreworCS8vYmJfZXJyb3JfbXNnKCJjdXJyOiVsbGQgcHJldjolbGxkIEcuaHo6JXUiLCBjdXJyLCBwcmV2LCBHLmh6KTsKKwlyZXR1cm4gKChkb3VibGUpb3ZlcmZsb3dfc2FmZV9zdWIocHJldiwgY3VycikpIC8gaXR2ICogRy5oejsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgZGF0YV90IGppZmZpZXNfZGlmZihkYXRhX3Qgb2xkLCBkYXRhX3QgbmV3KQoreworCWRhdGFfdCBkaWZmID0gbmV3IC0gb2xkOworCXJldHVybiAoZGlmZiA9PSAwKSA/IDEgOiBkaWZmOworfQorCitzdGF0aWMgaW50IGlzX2NwdV9pbl9iaXRtYXAodW5zaWduZWQgY3B1KQoreworCXJldHVybiBHLmNwdV9iaXRtYXBbY3B1ID4+IDNdICYgKDEgPDwgKGNwdSAmIDcpKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfaXJxY3B1X3N0YXRzKHN0cnVjdCBzdGF0c19pcnFjcHUgKnBlcl9jcHVfc3RhdHNbXSwKKwkJaW50IHRvdGFsX2lycXMsCisJCWRhdGFfdCBpdHYsCisJCWludCBwcmV2LCBpbnQgY3VycmVudCwKKwkJY29uc3QgY2hhciAqcHJldl9zdHIsIGNvbnN0IGNoYXIgKmN1cnJlbnRfc3RyKQoreworCWludCBqOworCWludCBvZmZzZXQsIGNwdTsKKwlzdHJ1Y3Qgc3RhdHNfaXJxY3B1ICpwMCwgKnEwOworCisJLyogQ2hlY2sgaWYgbnVtYmVyIG9mIElSUXMgaGFzIGNoYW5nZWQgKi8KKwlpZiAoRy5pbnRlcnZhbCAhPSAwKSB7CisJCWZvciAoaiA9IDA7IGogPD0gdG90YWxfaXJxczsgaisrKSB7CisJCQlwMCA9ICZwZXJfY3B1X3N0YXRzW2N1cnJlbnRdW2pdOworCQkJaWYgKHAwLT5pcnFfbmFtZVswXSAhPSAnXDAnKSB7CisJCQkJcTAgPSAmcGVyX2NwdV9zdGF0c1twcmV2XVtqXTsKKwkJCQlpZiAoc3RyY21wKHAwLT5pcnFfbmFtZSwgcTAtPmlycV9uYW1lKSAhPSAwKSB7CisJCQkJCS8qIFN0cmluZ3MgYXJlIGRpZmZlcmVudCAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBQcmludCBoZWFkZXIgKi8KKwlwcmludGYoIlxuJS0xMXMgIENQVSIsIHByZXZfc3RyKTsKKwl7CisJCS8qIEEgYml0IGNvbXBsZXggY29kZSB0byAiYnV5IGJhY2siIHNwYWNlIGlmIG9uZSBoZWFkZXIgaXMgdG9vIHdpZGUuCisJCSAqIEhlcmUncyBob3cgaXQgbG9va3MgbGlrZS4gQkxPQ0tfSU9QT0xMIGVhdHMgdG9vIG11Y2ggc3BhY2UsCisJCSAqIGFuZCBsYXR0ZXIgaGVhZGVycyB1c2Ugc21hbGxlciB3aWR0aCB0byBjb21wZW5zYXRlOgorCQkgKiAuLi5CTE9DSy9zIEJMT0NLX0lPUE9MTC9zIFRBU0tMRVQvcyBTQ0hFRC9zIEhSVElNRVIvcyAgUkNVL3MKKwkJICogLi4uICAgMi4zMiAgICAgIDAuMDAgICAgICAwLjAxICAgICAxNy41OCAgICAgIDAuMTQgICAgMTQxLjk2CisJCSAqLworCQlpbnQgZXhwZWN0ZWRfbGVuID0gMDsKKwkJaW50IHByaW50ZWRfbGVuID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IHRvdGFsX2lycXM7IGorKykgeworCQkJcDAgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtqXTsKKwkJCWlmIChwMC0+aXJxX25hbWVbMF0gIT0gJ1wwJykgeworCQkJCWludCBuID0gKElOVFJBVEVfU0NSV0lEVEgtMykgLSAocHJpbnRlZF9sZW4gLSBleHBlY3RlZF9sZW4pOworCQkJCXByaW50ZWRfbGVuICs9IHByaW50ZigiICUqcy9zIiwgbiA+IDAgPyBuIDogMCwgc2tpcF93aGl0ZXNwYWNlKHAwLT5pcnFfbmFtZSkpOworCQkJCWV4cGVjdGVkX2xlbiArPSBJTlRSQVRFX1NDUldJRFRIOworCQkJfQorCQl9CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlmb3IgKGNwdSA9IDE7IGNwdSA8PSBHLmNwdV9ucjsgY3B1KyspIHsKKwkJLyogQ2hlY2sgaWYgd2Ugd2FudCBzdGF0cyBhYm91dCB0aGlzIENQVSAqLworCQlpZiAoIWlzX2NwdV9pbl9iaXRtYXAoY3B1KSAmJiBHLnBfb3B0aW9uKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50ZigiJS0xMXMgJTR1IiwgY3VycmVudF9zdHIsIGNwdSAtIDEpOworCisJCWZvciAoaiA9IDA7IGogPCB0b3RhbF9pcnFzOyBqKyspIHsKKwkJCS8qIElSUSBmaWVsZCBzZXQgb25seSBmb3IgcHJvYyAwICovCisJCQlwMCA9ICZwZXJfY3B1X3N0YXRzW2N1cnJlbnRdW2pdOworCisJCQkvKgorCQkJICogQW4gZW1wdHkgc3RyaW5nIGZvciBpcnEgbmFtZSBtZWFucyB0aGF0CisJCQkgKiBpbnRlcnJ1cHQgaXMgbm8gbG9uZ2VyIHVzZWQuCisJCQkgKi8KKwkJCWlmIChwMC0+aXJxX25hbWVbMF0gIT0gJ1wwJykgeworCQkJCW9mZnNldCA9IGo7CisJCQkJcTAgPSAmcGVyX2NwdV9zdGF0c1twcmV2XVtvZmZzZXRdOworCisJCQkJLyoKKwkJCQkgKiBJZiB3ZSB3YW50IHN0YXRzIGZvciB0aGUgdGltZSBzaW5jZSBib290CisJCQkJICogd2UgaGF2ZSBwMC0+aXJxICE9IHEwLT5pcnEuCisJCQkJICovCisJCQkJaWYgKHN0cmNtcChwMC0+aXJxX25hbWUsIHEwLT5pcnFfbmFtZSkgIT0gMAorCQkJCSAmJiBHLmludGVydmFsICE9IDAKKwkJCQkpIHsKKwkJCQkJaWYgKGopIHsKKwkJCQkJCW9mZnNldCA9IGogLSAxOworCQkJCQkJcTAgPSAmcGVyX2NwdV9zdGF0c1twcmV2XVtvZmZzZXRdOworCQkJCQl9CisJCQkJCWlmIChzdHJjbXAocDAtPmlycV9uYW1lLCBxMC0+aXJxX25hbWUpICE9IDAKKwkJCQkJICYmIChqICsgMSA8IHRvdGFsX2lycXMpCisJCQkJCSkgeworCQkJCQkJb2Zmc2V0ID0gaiArIDE7CisJCQkJCQlxMCA9ICZwZXJfY3B1X3N0YXRzW3ByZXZdW29mZnNldF07CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoc3RyY21wKHAwLT5pcnFfbmFtZSwgcTAtPmlycV9uYW1lKSA9PSAwCisJCQkJIHx8IEcuaW50ZXJ2YWwgPT0gMAorCQkJCSkgeworCQkJCQlzdHJ1Y3Qgc3RhdHNfaXJxY3B1ICpwLCAqcTsKKwkJCQkJcCA9ICZwZXJfY3B1X3N0YXRzW2N1cnJlbnRdWyhjcHUgLSAxKSAqIHRvdGFsX2lycXMgKyBqXTsKKwkJCQkJcSA9ICZwZXJfY3B1X3N0YXRzW3ByZXZdWyhjcHUgLSAxKSAqIHRvdGFsX2lycXMgKyBvZmZzZXRdOworCQkJCQlwcmludGYoIiUiSU5UUkFURV9TQ1JXSURUSF9TVFIiLjJmIiwKKwkJCQkJCShkb3VibGUpKHAtPmludGVycnVwdHMgLSBxLT5pbnRlcnJ1cHRzKSAvIGl0diAqIEcuaHopOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZigiICAgICAgICBOL0EiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK3N0YXRpYyBkYXRhX3QgZ2V0X3Blcl9jcHVfaW50ZXJ2YWwoY29uc3Qgc3RydWN0IHN0YXRzX2NwdSAqc2NjLAorCQljb25zdCBzdHJ1Y3Qgc3RhdHNfY3B1ICpzY3ApCit7CisJcmV0dXJuICgoc2NjLT5jcHVfdXNlciArIHNjYy0+Y3B1X25pY2UgKworCQkgc2NjLT5jcHVfc3lzdGVtICsgc2NjLT5jcHVfaW93YWl0ICsKKwkJIHNjYy0+Y3B1X2lkbGUgKyBzY2MtPmNwdV9zdGVhbCArCisJCSBzY2MtPmNwdV9pcnEgKyBzY2MtPmNwdV9zb2Z0aXJxKSAtCisJCShzY3AtPmNwdV91c2VyICsgc2NwLT5jcHVfbmljZSArCisJCSBzY3AtPmNwdV9zeXN0ZW0gKyBzY3AtPmNwdV9pb3dhaXQgKworCQkgc2NwLT5jcHVfaWRsZSArIHNjcC0+Y3B1X3N0ZWFsICsKKwkJIHNjcC0+Y3B1X2lycSArIHNjcC0+Y3B1X3NvZnRpcnEpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHNfY3B1X3N0cnVjdChjb25zdCBzdHJ1Y3Qgc3RhdHNfY3B1ICpwLAorCQljb25zdCBzdHJ1Y3Qgc3RhdHNfY3B1ICpjLAorCQlkYXRhX3QgaXR2KQoreworCXByaW50ZigiICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmICU3LjJmXG4iLAorCQlwZXJjZW50X3ZhbHVlKHAtPmNwdV91c2VyIC0gcC0+Y3B1X2d1ZXN0LAorCQkvKiovICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jcHVfdXNlciAtIGMtPmNwdV9ndWVzdCwgaXR2KSwKKwkJcGVyY2VudF92YWx1ZShwLT5jcHVfbmljZSAgICwgYy0+Y3B1X25pY2UgICAsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+Y3B1X3N5c3RlbSAsIGMtPmNwdV9zeXN0ZW0gLCBpdHYpLAorCQlwZXJjZW50X3ZhbHVlKHAtPmNwdV9pb3dhaXQgLCBjLT5jcHVfaW93YWl0ICwgaXR2KSwKKwkJcGVyY2VudF92YWx1ZShwLT5jcHVfaXJxICAgICwgYy0+Y3B1X2lycSAgICAsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+Y3B1X3NvZnRpcnEsIGMtPmNwdV9zb2Z0aXJxLCBpdHYpLAorCQlwZXJjZW50X3ZhbHVlKHAtPmNwdV9zdGVhbCAgLCBjLT5jcHVfc3RlYWwgICwgaXR2KSwKKwkJcGVyY2VudF92YWx1ZShwLT5jcHVfZ3Vlc3QgICwgYy0+Y3B1X2d1ZXN0ICAsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+Y3B1X2lkbGUgICAsIGMtPmNwdV9pZGxlICAgLCBpdHYpCisJKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfc3RhdHNfY29yZShpbnQgcHJldiwgaW50IGN1cnJlbnQsCisJCWNvbnN0IGNoYXIgKnByZXZfc3RyLCBjb25zdCBjaGFyICpjdXJyZW50X3N0cikKK3sKKwlzdHJ1Y3Qgc3RhdHNfY3B1ICpzY2MsICpzY3A7CisJZGF0YV90IGl0diwgZ2xvYmFsX2l0djsKKwlpbnQgY3B1OworCisJLyogQ29tcHV0ZSB0aW1lIGludGVydmFsICovCisJaXR2ID0gZ2xvYmFsX2l0diA9IGppZmZpZXNfZGlmZihHLmdsb2JhbF91cHRpbWVbcHJldl0sIEcuZ2xvYmFsX3VwdGltZVtjdXJyZW50XSk7CisKKwkvKiBSZWR1Y2UgaW50ZXJ2YWwgdG8gb25lIENQVSAqLworCWlmIChHLmNwdV9uciA+IDEpCisJCWl0diA9IGppZmZpZXNfZGlmZihHLnBlcl9jcHVfdXB0aW1lW3ByZXZdLCBHLnBlcl9jcHVfdXB0aW1lW2N1cnJlbnRdKTsKKworCS8qIFByaW50IENQVSBzdGF0cyAqLworCWlmIChkaXNwbGF5X29wdChEX0NQVSkpIHsKKworCQkvLy8qIFRoaXMgaXMgZG9uZSBleGFjdGx5IG9uY2UgKi8KKwkJLy9pZiAoIUcuaGVhZGVyX2RvbmUpIHsKKwkJCXByaW50ZigiXG4lLTExcyAgQ1BVICAgICUldXNyICAgJSVuaWNlICAgICUlc3lzICUlaW93YWl0ICAgICUlaXJxICAgJSVzb2Z0ICAlJXN0ZWFsICAlJWd1ZXN0ICAgJSVpZGxlXG4iLAorCQkJCXByZXZfc3RyCisJCQkpOworCQkvLwlHLmhlYWRlcl9kb25lID0gMTsKKwkJLy99CisKKwkJZm9yIChjcHUgPSAwOyBjcHUgPD0gRy5jcHVfbnI7IGNwdSsrKSB7CisJCQlkYXRhX3QgcGVyX2NwdV9pdHY7CisKKwkJCS8qIFByaW50IHN0YXRzIGFib3V0IHRoaXMgcGFydGljdWxhciBDUFU/ICovCisJCQlpZiAoIWlzX2NwdV9pbl9iaXRtYXAoY3B1KSkKKwkJCQljb250aW51ZTsKKworCQkJc2NjID0gJkcuc3RfY3B1W2N1cnJlbnRdW2NwdV07CisJCQlzY3AgPSAmRy5zdF9jcHVbcHJldl1bY3B1XTsKKwkJCXBlcl9jcHVfaXR2ID0gZ2xvYmFsX2l0djsKKworCQkJcHJpbnRmKChjcHUgPyAiJS0xMXMgJTR1IiA6ICIlLTExcyAgYWxsIiksIGN1cnJlbnRfc3RyLCBjcHUgLSAxKTsKKwkJCWlmIChjcHUpIHsKKwkJCQlkb3VibGUgaWRsZTsKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBDUFUgaXMgb2ZmbGluZSwgdGhlbiBpdCBpc24ndCBpbiAvcHJvYy9zdGF0LAorCQkJCSAqIHNvIGFsbCB2YWx1ZXMgYXJlIDAuCisJCQkJICogTkI6IEd1ZXN0IHRpbWUgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB1c2VyIHRpbWUuCisJCQkJICovCisJCQkJaWYgKChzY2MtPmNwdV91c2VyIHwgc2NjLT5jcHVfbmljZSB8IHNjYy0+Y3B1X3N5c3RlbSB8CisJCQkJICAgICBzY2MtPmNwdV9pb3dhaXQgfCBzY2MtPmNwdV9pZGxlIHwgc2NjLT5jcHVfc3RlYWwgfAorCQkJCSAgICAgc2NjLT5jcHVfaXJxIHwgc2NjLT5jcHVfc29mdGlycSkgPT0gMAorCQkJCSkgeworCQkJCQkvKgorCQkJCQkgKiBTZXQgY3VycmVudCBzdHJ1Y3QgZmllbGRzIHRvIHZhbHVlcyBmcm9tIHByZXYuCisJCQkJCSAqIGl0ZXJhdGlvbi4gVGhlbiB0aGVpciB2YWx1ZXMgd29uJ3QganVtcCBmcm9tCisJCQkJCSAqIHplcm8sIHdoZW4gdGhlIENQVSBjb21lcyBiYWNrIG9ubGluZS4KKwkJCQkJICovCisJCQkJCSpzY2MgPSAqc2NwOworCQkJCQlpZGxlID0gMC4wOworCQkJCQlnb3RvIHByaW50X3plcm9zOworCQkJCX0KKwkJCQkvKiBDb21wdXRlIGludGVydmFsIGFnYWluIGZvciBjdXJyZW50IHByb2MgKi8KKwkJCQlwZXJfY3B1X2l0diA9IGdldF9wZXJfY3B1X2ludGVydmFsKHNjYywgc2NwKTsKKwkJCQlpZiAocGVyX2NwdV9pdHYgPT0gMCkgeworCQkJCQkvKgorCQkJCQkgKiBJZiB0aGUgQ1BVIGlzIHRpY2tsZXNzIHRoZW4gdGhlcmUgaXMgbm8gY2hhbmdlIGluIENQVSB2YWx1ZXMKKwkJCQkJICogYnV0IHRoZSBzdW0gb2YgdmFsdWVzIGlzIG5vdCB6ZXJvLgorCQkJCQkgKi8KKwkJCQkJaWRsZSA9IDEwMC4wOworIHByaW50X3plcm9zOgorCQkJCQlwcmludGYoIiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZiAlNy4yZlxuIiwKKwkJCQkJCTAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCBpZGxlKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJcHJpbnRfc3RhdHNfY3B1X3N0cnVjdChzY3AsIHNjYywgcGVyX2NwdV9pdHYpOworCQl9CisJfQorCisJLyogUHJpbnQgdG90YWwgbnVtYmVyIG9mIElSUXMgcGVyIENQVSAqLworCWlmIChkaXNwbGF5X29wdChEX0lSUV9TVU0pKSB7CisKKwkJLy8vKiBQcmludCBhdmVyYWdlIGhlYWRlciwgdGhpcyBpcyBkb25lIGV4YWN0bHkgb25jZSAqLworCQkvL2lmICghRy5hdmdfaGVhZGVyX2RvbmUpIHsKKwkJCXByaW50ZigiXG4lLTExcyAgQ1BVICAgIGludHIvc1xuIiwgcHJldl9zdHIpOworCQkvLwlHLmF2Z19oZWFkZXJfZG9uZSA9IDE7CisJCS8vfQorCisJCWZvciAoY3B1ID0gMDsgY3B1IDw9IEcuY3B1X25yOyBjcHUrKykgeworCQkJZGF0YV90IHBlcl9jcHVfaXR2OworCisJCQkvKiBQcmludCBzdGF0cyBhYm91dCB0aGlzIENQVT8gKi8KKwkJCWlmICghaXNfY3B1X2luX2JpdG1hcChjcHUpKQorCQkJCWNvbnRpbnVlOworCisJCQlwZXJfY3B1X2l0diA9IGl0djsKKwkJCXByaW50ZigoY3B1ID8gIiUtMTFzICU0dSIgOiAiJS0xMXMgIGFsbCIpLCBjdXJyZW50X3N0ciwgY3B1IC0gMSk7CisJCQlpZiAoY3B1KSB7CisJCQkJc2NjID0gJkcuc3RfY3B1W2N1cnJlbnRdW2NwdV07CisJCQkJc2NwID0gJkcuc3RfY3B1W3ByZXZdW2NwdV07CisJCQkJLyogQ29tcHV0ZSBpbnRlcnZhbCBhZ2FpbiBmb3IgY3VycmVudCBwcm9jICovCisJCQkJcGVyX2NwdV9pdHYgPSBnZXRfcGVyX2NwdV9pbnRlcnZhbChzY2MsIHNjcCk7CisJCQkJaWYgKHBlcl9jcHVfaXR2ID09IDApIHsKKwkJCQkJcHJpbnRmKCIgJTkuMmZcbiIsIDAuMCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCS8vYmJfZXJyb3JfbXNnKCJHLnN0X2lycVsldV1bJXVdLmlycV9ucjolbGxkIC0gRy5zdF9pcnFbJXVdWyV1XS5pcnFfbnI6JWxsZCIsCisJCQkvLyBjdXJyZW50LCBjcHUsIEcuc3RfaXJxW3ByZXZdW2NwdV0uaXJxX25yLCBwcmV2LCBjcHUsIEcuc3RfaXJxW2N1cnJlbnRdW2NwdV0uaXJxX25yKTsKKwkJCXByaW50ZigiICU5LjJmXG4iLCBoel92YWx1ZShHLnN0X2lycVtwcmV2XVtjcHVdLmlycV9uciwgRy5zdF9pcnFbY3VycmVudF1bY3B1XS5pcnFfbnIsIHBlcl9jcHVfaXR2KSk7CisJCX0KKwl9CisKKwlpZiAoZGlzcGxheV9vcHQoRF9JUlFfQ1BVKSkgeworCQl3cml0ZV9pcnFjcHVfc3RhdHMoRy5zdF9pcnFjcHUsIEcuaXJxY3B1X25yLAorCQkJCWl0diwKKwkJCQlwcmV2LCBjdXJyZW50LAorCQkJCXByZXZfc3RyLCBjdXJyZW50X3N0cgorCQkpOworCX0KKworCWlmIChkaXNwbGF5X29wdChEX1NPRlRJUlFTKSkgeworCQl3cml0ZV9pcnFjcHVfc3RhdHMoRy5zdF9zb2Z0aXJxY3B1LCBHLnNvZnRpcnFjcHVfbnIsCisJCQkJaXR2LAorCQkJCXByZXYsIGN1cnJlbnQsCisJCQkJcHJldl9zdHIsIGN1cnJlbnRfc3RyCisJCSk7CisJfQorfQorCisvKgorICogUHJpbnQgdGhlIHN0YXRpc3RpY3MKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfc3RhdHMoaW50IGN1cnJlbnQpCit7CisJY2hhciBwcmV2X3RpbWVbMTZdOworCWNoYXIgY3Vycl90aW1lWzE2XTsKKworCXN0cmZ0aW1lKHByZXZfdGltZSwgc2l6ZW9mKHByZXZfdGltZSksICIlWCIsICZHLnRpbWVzdGFtcFshY3VycmVudF0pOworCXN0cmZ0aW1lKGN1cnJfdGltZSwgc2l6ZW9mKGN1cnJfdGltZSksICIlWCIsICZHLnRpbWVzdGFtcFtjdXJyZW50XSk7CisKKwl3cml0ZV9zdGF0c19jb3JlKCFjdXJyZW50LCBjdXJyZW50LCBwcmV2X3RpbWUsIGN1cnJfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXRzX2F2ZyhpbnQgY3VycmVudCkKK3sKKwl3cml0ZV9zdGF0c19jb3JlKDIsIGN1cnJlbnQsICJBdmVyYWdlOiIsICJBdmVyYWdlOiIpOworfQorCisvKgorICogUmVhZCBDUFUgc3RhdGlzdGljcworICovCitzdGF0aWMgdm9pZCBnZXRfY3B1X3N0YXRpc3RpY3Moc3RydWN0IHN0YXRzX2NwdSAqY3B1LCBkYXRhX3QgKnVwLCBkYXRhX3QgKnVwMCkKK3sKKwlGSUxFICpmcDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKFBST0NGU19TVEFUKTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJZGF0YV90IHN1bTsKKwkJdW5zaWduZWQgY3B1X251bWJlcjsKKwkJc3RydWN0IHN0YXRzX2NwdSAqY3A7CisKKwkJaWYgKCFzdGFydHNfd2l0aF9jcHUoYnVmKSkKKwkJCWNvbnRpbnVlOyAvKiBub3QgImNwdSIgKi8KKworCQljcCA9IGNwdTsgLyogZm9yICJjcHUgIiBjYXNlICovCisJCWlmIChidWZbM10gIT0gJyAnKSB7CisJCQkvKiAiY3B1TiAiICovCisJCQlpZiAoRy5jcHVfbnIgPT0gMAorCQkJIHx8IHNzY2FuZihidWYgKyAzLCAiJXUgIiwgJmNwdV9udW1iZXIpICE9IDEKKwkJCSB8fCBjcHVfbnVtYmVyID49IEcuY3B1X25yCisJCQkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNwID0gJmNwdVtjcHVfbnVtYmVyICsgMV07CisJCX0KKworCQkvKiBSZWFkIHRoZSBjb3VudGVycywgc2F2ZSB0aGVtICovCisJCS8qIE5vdCBhbGwgZmllbGRzIGhhdmUgdG8gYmUgcHJlc2VudCAqLworCQltZW1zZXQoY3AsIDAsIHNpemVvZigqY3ApKTsKKwkJc3NjYW5mKGJ1ZiwgIiUqcyIKKwkJCSIgJSJGTVRfREFUQSJ1ICUiRk1UX0RBVEEidSAlIkZNVF9EQVRBInUiCisJCQkiICUiRk1UX0RBVEEidSAlIkZNVF9EQVRBInUgJSJGTVRfREFUQSJ1IgorCQkJIiAlIkZNVF9EQVRBInUgJSJGTVRfREFUQSJ1ICUiRk1UX0RBVEEidSIsCisJCQkmY3AtPmNwdV91c2VyLCAmY3AtPmNwdV9uaWNlLCAmY3AtPmNwdV9zeXN0ZW0sCisJCQkmY3AtPmNwdV9pZGxlLCAmY3AtPmNwdV9pb3dhaXQsICZjcC0+Y3B1X2lycSwKKwkJCSZjcC0+Y3B1X3NvZnRpcnEsICZjcC0+Y3B1X3N0ZWFsLCAmY3AtPmNwdV9ndWVzdAorCQkpOworCQkvKgorCQkgKiBDb21wdXRlIHVwdGltZSBpbiBqaWZmaWVzICgxL0haKSwgaXQnbGwgYmUgdGhlIHN1bSBvZgorCQkgKiBpbmRpdmlkdWFsIENQVSdzIHVwdGltZXMuCisJCSAqIE5COiBXZSBoYXZlIHRvIG9taXQgY3B1X2d1ZXN0LCBiZWNhdXNlIGNwdV91c2VyIGluY2x1ZGVzIGl0LgorCQkgKi8KKwkJc3VtID0gY3AtPmNwdV91c2VyICsgY3AtPmNwdV9uaWNlICsgY3AtPmNwdV9zeXN0ZW0gKworCQkJY3AtPmNwdV9pZGxlICsgY3AtPmNwdV9pb3dhaXQgKyBjcC0+Y3B1X2lycSArCisJCQljcC0+Y3B1X3NvZnRpcnEgKyBjcC0+Y3B1X3N0ZWFsOworCisJCWlmIChidWZbM10gPT0gJyAnKSB7CisJCQkvKiAiY3B1ICIgKi8KKwkJCSp1cCA9IHN1bTsKKwkJfSBlbHNlIHsKKwkJCS8qICJjcHVOICIgKi8KKwkJCWlmIChjcHVfbnVtYmVyID09IDAgJiYgKnVwMCAhPSAwKSB7CisJCQkJLyogQ29tcHV0ZSB1cHRpbWUgb2Ygc2luZ2xlIENQVSAqLworCQkJCSp1cDAgPSBzdW07CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKK30KKworLyoKKyAqIFJlYWQgSVJRcyBmcm9tIC9wcm9jL3N0YXQKKyAqLworc3RhdGljIHZvaWQgZ2V0X2lycXNfZnJvbV9zdGF0KHN0cnVjdCBzdGF0c19pcnEgKmlycSkKK3sKKwlGSUxFICpmcDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWZwID0gZm9wZW5fZm9yX3JlYWQoUFJPQ0ZTX1NUQVQpOworCWlmICghZnApCisJCXJldHVybjsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJLy9iYl9lcnJvcl9tc2coIi9wcm9jL3N0YXQ6JyVzJyIsIGJ1Zik7CisJCWlmIChzdHJuY21wKGJ1ZiwgImludHIgIiwgNSkgPT0gMCkgeworCQkJLyogUmVhZCB0b3RhbCBudW1iZXIgb2YgSVJRcyBzaW5jZSBzeXN0ZW0gYm9vdCAqLworCQkJc3NjYW5mKGJ1ZiArIDUsICIlIkZNVF9EQVRBInUiLCAmaXJxLT5pcnFfbnIpOworCQl9CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworLyoKKyAqIFJlYWQgc3RhdHMgZnJvbSAvcHJvYy9pbnRlcnJ1cHRzIG9yIC9wcm9jL3NvZnRpcnFzCisgKi8KK3N0YXRpYyB2b2lkIGdldF9pcnFzX2Zyb21faW50ZXJydXB0cyhjb25zdCBjaGFyICpmbmFtZSwKKwkJc3RydWN0IHN0YXRzX2lycWNwdSAqcGVyX2NwdV9zdGF0c1tdLAorCQlpbnQgaXJxc19wZXJfY3B1LCBpbnQgY3VycmVudCkKK3sKKwlGSUxFICpmcDsKKwlzdHJ1Y3Qgc3RhdHNfaXJxICppcnFfaTsKKwlzdHJ1Y3Qgc3RhdHNfaXJxY3B1ICppYzsKKwljaGFyICpidWY7CisJdW5zaWduZWQgYnVmbGVuOworCXVuc2lnbmVkIGNwdTsKKwl1bnNpZ25lZCBpcnE7CisJaW50IGNwdV9pbmRleFtHLmNwdV9ucl07CisJaW50IGlpbmRleDsKKworLy8gTW92ZWQgdG8gY2FsbGVyLgorLy8gT3RoZXJ3aXNlIHJlYWRpbmcgb2YgL3Byb2Mvc29mdGlycXMKKy8vIHdhcyByZXNldHRpbmcgY291bnRzIHRvIDAgYWZ0ZXIgd2UgcGFpbnN0YWtpbmdseSBjb2xsZWN0ZWQgdGhlbSBmcm9tCisvLyAvcHJvYy9pbnRlcnJ1cHRzLiBXaGljaCByZXN1bHRlZCBpbjoKKy8vIDAxOjMyOjQ3IFBNICBDUFUgICAgaW50ci9zCisvLyAwMTozMjo0NyBQTSAgYWxsICAgIDU5MS40NworLy8gMDE6MzI6NDcgUE0gICAgMCAgICAgIDAuMDAgPD0gPz8/CisvLyAwMTozMjo0NyBQTSAgICAxICAgICAgMC4wMCA8PSA/Pz8KKy8vCWZvciAoY3B1ID0gMTsgY3B1IDw9IEcuY3B1X25yOyBjcHUrKykgeworLy8JCUcuc3RfaXJxW2N1cnJlbnRdW2NwdV0uaXJxX25yID0gMDsKKy8vCQkvL2JiX2Vycm9yX21zZygiRy5zdF9pcnFbJXVdWyV1XS5pcnFfbnI9MCIsIGN1cnJlbnQsIGNwdSk7CisvLwl9CisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKGZuYW1lKTsKKwlpZiAoIWZwKQorCQlyZXR1cm47CisKKwlidWZsZW4gPSBJTlRFUlJVUFRTX0xJTkUgKyAxNiAqIEcuY3B1X25yOworCWJ1ZiA9IHhtYWxsb2MoYnVmbGVuKTsKKworCS8qIFBhcnNlIGhlYWRlciBhbmQgZGV0ZXJtaW5lLCB3aGljaCBDUFVzIGFyZSBvbmxpbmUgKi8KKwlpaW5kZXggPSAwOworCXdoaWxlIChmZ2V0cyhidWYsIGJ1ZmxlbiwgZnApKSB7CisJCWNoYXIgKmNwLCAqbmV4dDsKKwkJbmV4dCA9IGJ1ZjsKKwkJd2hpbGUgKChjcCA9IHN0cnN0cihuZXh0LCAiQ1BVIikpICE9IE5VTEwKKwkJICYmIGlpbmRleCA8IEcuY3B1X25yCisJCSkgeworCQkJY3B1ID0gc3RydG91bChjcCArIDMsICZuZXh0LCAxMCk7CisJCQljcHVfaW5kZXhbaWluZGV4KytdID0gY3B1OworCQl9CisJCWlmIChpaW5kZXgpIC8qIFdlIGZvdW5kIGhlYWRlciAqLworCQkJYnJlYWs7CisJfQorCisJaXJxID0gMDsKKwl3aGlsZSAoZmdldHMoYnVmLCBidWZsZW4sIGZwKQorCSAmJiBpcnEgPCBpcnFzX3Blcl9jcHUKKwkpIHsKKwkJaW50IGxlbjsKKwkJY2hhciBsYXN0X2NoYXI7CisJCWNoYXIgKmNwOworCisJCS8qIFNraXAgb3ZlciAiSVJRTkFNRToiICovCisJCWNwID0gc3RyY2hyKGJ1ZiwgJzonKTsKKwkJaWYgKCFjcCkKKwkJCWNvbnRpbnVlOworCQlsYXN0X2NoYXIgPSBjcFstMV07CisKKwkJaWMgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtpcnFdOworCQlsZW4gPSBjcCAtIGJ1ZjsKKwkJaWYgKGxlbiA+PSBzaXplb2YoaWMtPmlycV9uYW1lKSkgeworCQkJbGVuID0gc2l6ZW9mKGljLT5pcnFfbmFtZSkgLSAxOworCQl9CisJCXNhZmVfc3RybmNweShpYy0+aXJxX25hbWUsIGJ1ZiwgbGVuICsgMSk7CisJCS8vYmJfZXJyb3JfbXNnKCIlczogaXJxJWQ6JyVzJyBidWY6JyVzJyIsIGZuYW1lLCBpcnEsIGljLT5pcnFfbmFtZSwgYnVmKTsKKwkJY3ArKzsKKworCQlmb3IgKGNwdSA9IDA7IGNwdSA8IGlpbmRleDsgY3B1KyspIHsKKwkJCWNoYXIgKm5leHQ7CisJCQlpYyA9ICZwZXJfY3B1X3N0YXRzW2N1cnJlbnRdW2NwdV9pbmRleFtjcHVdICogaXJxc19wZXJfY3B1ICsgaXJxXTsKKwkJCWlycV9pID0gJkcuc3RfaXJxW2N1cnJlbnRdW2NwdV9pbmRleFtjcHVdICsgMV07CisJCQlpYy0+aW50ZXJydXB0cyA9IHN0cnRvdWwoY3AsICZuZXh0LCAxMCk7CisJCQkvKiBDb3VudCBvbmx5IG51bWVyaWNhbCBJUlFzICovCisJCQlpZiAoaXNkaWdpdChsYXN0X2NoYXIpKSB7CisJCQkJaXJxX2ktPmlycV9uciArPSBpYy0+aW50ZXJydXB0czsKKwkJCQkvL2JiX2Vycm9yX21zZygiRy5zdF9pcnFbJXVdWyV1XS5pcnFfbnIgKyAldSA9ICVsbGQiLAorCQkJCS8vIGN1cnJlbnQsIGNwdV9pbmRleFtjcHVdICsgMSwgaWMtPmludGVycnVwdHMsIGlycV9pLT5pcnFfbnIpOworCQkJfQorCQkJY3AgPSBuZXh0OworCQl9CisJCWlycSsrOworCX0KKwlmY2xvc2UoZnApOworCWZyZWUoYnVmKTsKKworCXdoaWxlIChpcnEgPCBpcnFzX3Blcl9jcHUpIHsKKwkJLyogTnVtYmVyIG9mIGludGVycnVwdHMgcGVyIENQVSBoYXMgY2hhbmdlZCAqLworCQlpYyA9ICZwZXJfY3B1X3N0YXRzW2N1cnJlbnRdW2lycV07CisJCWljLT5pcnFfbmFtZVswXSA9ICdcMCc7IC8qIEZhbHNlIGludGVycnVwdCAqLworCQlpcnErKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF91cHRpbWUoZGF0YV90ICp1cHRpbWUpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbc2l6ZW9mKGxvbmcpKjMgKiAyICsgNF07IC8qIGVub3VnaCBmb3IgbG9uZy5sb25nICovCisJdW5zaWduZWQgbG9uZyB1cHRpbWVfc2VjLCBkZWNpbWFsOworCisJZnAgPSBmb3Blbl9mb3JfcmVhZChQUk9DRlNfVVBUSU1FKTsKKwlpZiAoIWZwKQorCQlyZXR1cm47CisJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQlpZiAoc3NjYW5mKGJ1ZiwgIiVsdS4lbHUiLCAmdXB0aW1lX3NlYywgJmRlY2ltYWwpID09IDIpIHsKKwkJCSp1cHRpbWUgPSAoZGF0YV90KXVwdGltZV9zZWMgKiBHLmh6ICsgZGVjaW1hbCAqIEcuaHogLyAxMDA7CisJCX0KKwl9CisKKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgdm9pZCBnZXRfbG9jYWx0aW1lKHN0cnVjdCB0bSAqdG0pCit7CisJdGltZV90IHRpbWVyOworCXRpbWUoJnRpbWVyKTsKKwlsb2NhbHRpbWVfcigmdGltZXIsIHRtKTsKK30KKworc3RhdGljIHZvaWQgYWxhcm1faGFuZGxlcihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzaWduYWwoU0lHQUxSTSwgYWxhcm1faGFuZGxlcik7CisJYWxhcm0oRy5pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIG1haW5fbG9vcCh2b2lkKQoreworCXVuc2lnbmVkIGN1cnJlbnQ7CisJdW5zaWduZWQgY3B1czsKKworCS8qIFJlYWQgdGhlIHN0YXRzICovCisJaWYgKEcuY3B1X25yID4gMSkgeworCQlHLnBlcl9jcHVfdXB0aW1lWzBdID0gMDsKKwkJZ2V0X3VwdGltZSgmRy5wZXJfY3B1X3VwdGltZVswXSk7CisJfQorCisJZ2V0X2NwdV9zdGF0aXN0aWNzKEcuc3RfY3B1WzBdLCAmRy5nbG9iYWxfdXB0aW1lWzBdLCAmRy5wZXJfY3B1X3VwdGltZVswXSk7CisKKwlpZiAoZGlzcGxheV9vcHQoRF9JUlFfU1VNKSkKKwkJZ2V0X2lycXNfZnJvbV9zdGF0KEcuc3RfaXJxWzBdKTsKKworCWlmIChkaXNwbGF5X29wdChEX0lSUV9TVU0gfCBEX0lSUV9DUFUpKQorCQlnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoUFJPQ0ZTX0lOVEVSUlVQVFMsIEcuc3RfaXJxY3B1LAorCQkJCQlHLmlycWNwdV9uciwgMCk7CisKKwlpZiAoZGlzcGxheV9vcHQoRF9TT0ZUSVJRUykpCisJCWdldF9pcnFzX2Zyb21faW50ZXJydXB0cyhQUk9DRlNfU09GVElSUVMsIEcuc3Rfc29mdGlycWNwdSwKKwkJCQkJRy5zb2Z0aXJxY3B1X25yLCAwKTsKKworCWlmIChHLmludGVydmFsID09IDApIHsKKwkJLyogRGlzcGxheSBzaW5jZSBib290IHRpbWUgKi8KKwkJY3B1cyA9IEcuY3B1X25yICsgMTsKKwkJRy50aW1lc3RhbXBbMV0gPSBHLnRpbWVzdGFtcFswXTsKKwkJbWVtc2V0KEcuc3RfY3B1WzFdLCAwLCBzaXplb2YoRy5zdF9jcHVbMV1bMF0pICogY3B1cyk7CisJCW1lbXNldChHLnN0X2lycVsxXSwgMCwgc2l6ZW9mKEcuc3RfaXJxWzFdWzBdKSAqIGNwdXMpOworCQltZW1zZXQoRy5zdF9pcnFjcHVbMV0sIDAsIHNpemVvZihHLnN0X2lycWNwdVsxXVswXSkgKiBjcHVzICogRy5pcnFjcHVfbnIpOworCQltZW1zZXQoRy5zdF9zb2Z0aXJxY3B1WzFdLCAwLCBzaXplb2YoRy5zdF9zb2Z0aXJxY3B1WzFdWzBdKSAqIGNwdXMgKiBHLnNvZnRpcnFjcHVfbnIpOworCisJCXdyaXRlX3N0YXRzKDApOworCisJCS8qIEFuZCB3ZSdyZSBkb25lICovCisJCXJldHVybjsKKwl9CisKKwkvKiBTZXQgYSBoYW5kbGVyIGZvciBTSUdBTFJNICovCisJYWxhcm1faGFuZGxlcigwKTsKKworCS8qIFNhdmUgdGhlIHN0YXRzIHdlIGFscmVhZHkgaGF2ZS4gV2UgbmVlZCB0aGVtIHRvIGNvbXB1dGUgdGhlIGF2ZXJhZ2UgKi8KKwlHLnRpbWVzdGFtcFsyXSA9IEcudGltZXN0YW1wWzBdOworCUcuZ2xvYmFsX3VwdGltZVsyXSA9IEcuZ2xvYmFsX3VwdGltZVswXTsKKwlHLnBlcl9jcHVfdXB0aW1lWzJdID0gRy5wZXJfY3B1X3VwdGltZVswXTsKKwljcHVzID0gRy5jcHVfbnIgKyAxOworCW1lbWNweShHLnN0X2NwdVsyXSwgRy5zdF9jcHVbMF0sIHNpemVvZihHLnN0X2NwdVswXVswXSkgKiBjcHVzKTsKKwltZW1jcHkoRy5zdF9pcnFbMl0sIEcuc3RfaXJxWzBdLCBzaXplb2YoRy5zdF9pcnFbMF1bMF0pICogY3B1cyk7CisJbWVtY3B5KEcuc3RfaXJxY3B1WzJdLCBHLnN0X2lycWNwdVswXSwgc2l6ZW9mKEcuc3RfaXJxY3B1WzBdWzBdKSAqIGNwdXMgKiBHLmlycWNwdV9ucik7CisJaWYgKGRpc3BsYXlfb3B0KERfU09GVElSUVMpKSB7CisJCW1lbWNweShHLnN0X3NvZnRpcnFjcHVbMl0sIEcuc3Rfc29mdGlycWNwdVswXSwKKwkJCXNpemVvZihHLnN0X3NvZnRpcnFjcHVbMF1bMF0pICogY3B1cyAqIEcuc29mdGlycWNwdV9ucik7CisJfQorCisJY3VycmVudCA9IDE7CisJd2hpbGUgKDEpIHsKKwkJLyogU3VzcGVuZCB1bnRpbCBhIHNpZ25hbCBpcyByZWNlaXZlZCAqLworCQlwYXVzZSgpOworCisJCS8qIFNldCBzdHJ1Y3R1cmVzIHRvIDAgdG8gZGlzdGluZ3Vpc2ggb2ZmL29ubGluZSBDUFVzICovCisJCW1lbXNldCgmRy5zdF9jcHVbY3VycmVudF1bLypjcHU6Ki8gMV0sIDAsIHNpemVvZihHLnN0X2NwdVswXVswXSkgKiBHLmNwdV9ucik7CisKKwkJZ2V0X2xvY2FsdGltZSgmRy50aW1lc3RhbXBbY3VycmVudF0pOworCisJCS8qIFJlYWQgc3RhdHMgKi8KKwkJaWYgKEcuY3B1X25yID4gMSkgeworCQkJRy5wZXJfY3B1X3VwdGltZVtjdXJyZW50XSA9IDA7CisJCQlnZXRfdXB0aW1lKCZHLnBlcl9jcHVfdXB0aW1lW2N1cnJlbnRdKTsKKwkJfQorCQlnZXRfY3B1X3N0YXRpc3RpY3MoRy5zdF9jcHVbY3VycmVudF0sICZHLmdsb2JhbF91cHRpbWVbY3VycmVudF0sICZHLnBlcl9jcHVfdXB0aW1lW2N1cnJlbnRdKTsKKworCQlpZiAoZGlzcGxheV9vcHQoRF9JUlFfU1VNKSkKKwkJCWdldF9pcnFzX2Zyb21fc3RhdChHLnN0X2lycVtjdXJyZW50XSk7CisKKwkJaWYgKGRpc3BsYXlfb3B0KERfSVJRX1NVTSB8IERfSVJRX0NQVSkpIHsKKwkJCWludCBjcHU7CisJCQlmb3IgKGNwdSA9IDE7IGNwdSA8PSBHLmNwdV9ucjsgY3B1KyspIHsKKwkJCQlHLnN0X2lycVtjdXJyZW50XVtjcHVdLmlycV9uciA9IDA7CisJCQl9CisJCQkvKiBhY2N1bXVsYXRlcyAuaXJxX25yICovCisJCQlnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoUFJPQ0ZTX0lOVEVSUlVQVFMsIEcuc3RfaXJxY3B1LAorCQkJCQlHLmlycWNwdV9uciwgY3VycmVudCk7CisJCX0KKworCQlpZiAoZGlzcGxheV9vcHQoRF9TT0ZUSVJRUykpCisJCQlnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoUFJPQ0ZTX1NPRlRJUlFTLAorCQkJCQlHLnN0X3NvZnRpcnFjcHUsCisJCQkJCUcuc29mdGlycWNwdV9uciwgY3VycmVudCk7CisKKwkJd3JpdGVfc3RhdHMoY3VycmVudCk7CisKKwkJaWYgKEcuY291bnQgPiAwKSB7CisJCQlpZiAoLS1HLmNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQljdXJyZW50IF49IDE7CisJfQorCisJLyogUHJpbnQgYXZlcmFnZSBzdGF0aXN0aWNzICovCisJd3JpdGVfc3RhdHNfYXZnKGN1cnJlbnQpOworfQorCisvKiBJbml0aWFsaXphdGlvbiAqLworCisvKiBHZXQgbnVtYmVyIG9mIGNsb2NrIHRpY2tzIHBlciBzZWMgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVuc2lnbmVkIGdldF9oeih2b2lkKQoreworCXJldHVybiBzeXNjb25mKF9TQ19DTEtfVENLKTsKK30KKworc3RhdGljIHZvaWQgYWxsb2Nfc3RydWN0KGludCBjcHVzKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJRy5zdF9jcHVbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X2NwdVtpXVswXSkgKiBjcHVzKTsKKwkJRy5zdF9pcnFbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X2lycVtpXVswXSkgKiBjcHVzKTsKKwkJRy5zdF9pcnFjcHVbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X2lycWNwdVtpXVswXSkgKiBjcHVzICogRy5pcnFjcHVfbnIpOworCQlHLnN0X3NvZnRpcnFjcHVbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X3NvZnRpcnFjcHVbaV1bMF0pICogY3B1cyAqIEcuc29mdGlycWNwdV9ucik7CisJfQorCUcuY3B1X2JpdG1hcF9sZW4gPSAoY3B1cyA+PiAzKSArIDE7CisJRy5jcHVfYml0bWFwID0geHphbGxvYyhHLmNwdV9iaXRtYXBfbGVuKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVhZGVyKHN0cnVjdCB0bSAqdCkKK3sKKwljaGFyIGN1cl9kYXRlWzE2XTsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisKKwkvKiBHZXQgc3lzdGVtIG5hbWUsIHJlbGVhc2UgbnVtYmVyIGFuZCBob3N0bmFtZSAqLworCXVuYW1lKCZ1dHMpOworCisJc3RyZnRpbWUoY3VyX2RhdGUsIHNpemVvZihjdXJfZGF0ZSksICIleCIsIHQpOworCisJcHJpbnRmKCIlcyAlcyAoJXMpXHQlc1x0XyVzX1x0KCV1IENQVSlcbiIsCisJCXV0cy5zeXNuYW1lLCB1dHMucmVsZWFzZSwgdXRzLm5vZGVuYW1lLCBjdXJfZGF0ZSwgdXRzLm1hY2hpbmUsIEcuY3B1X25yKTsKK30KKworLyoKKyAqIEdldCBudW1iZXIgb2YgaW50ZXJydXB0cyBhdmFpbGFibGUgcGVyIHByb2Nlc3NvcgorICovCitzdGF0aWMgaW50IGdldF9pcnFjcHVfbnIoY29uc3QgY2hhciAqZiwgaW50IG1heF9pcnFzKQoreworCUZJTEUgKmZwOworCWNoYXIgKmxpbmU7CisJdW5zaWduZWQgbGluZWxlbjsKKwl1bnNpZ25lZCBpcnE7CisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKGYpOworCWlmICghZnApICAvKiBObyBpbnRlcnJ1cHRzIGZpbGUgKi8KKwkJcmV0dXJuIDA7CisKKwlsaW5lbGVuID0gSU5URVJSVVBUU19MSU5FICsgMTYgKiBHLmNwdV9ucjsKKwlsaW5lID0geG1hbGxvYyhsaW5lbGVuKTsKKworCWlycSA9IDA7CisJd2hpbGUgKGZnZXRzKGxpbmUsIGxpbmVsZW4sIGZwKQorCSAmJiBpcnEgPCBtYXhfaXJxcworCSkgeworCQlpbnQgcCA9IHN0cmNzcG4obGluZSwgIjoiKTsKKwkJaWYgKChwID4gMCkgJiYgKHAgPCAxNikpCisJCQlpcnErKzsKKwl9CisKKwlmY2xvc2UoZnApOworCWZyZWUobGluZSk7CisKKwlyZXR1cm4gaXJxOworfQorCisvL3VzYWdlOiNkZWZpbmUgbXBzdGF0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUFdIFstSSBTVU18Q1BVfEFMTHxTQ1BVXSBbLXVdIFstUCBudW18QUxMXSBbSU5URVJWQUwgW0NPVU5UXV0iCisvL3VzYWdlOiNkZWZpbmUgbXBzdGF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUGVyLXByb2Nlc3NvciBzdGF0aXN0aWNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1BCQkJU2FtZSBhcyAtSSBBTEwgLXUgLVAgQUxMIgorLy91c2FnZTogICAgICJcbgktSSBTVU18Q1BVfEFMTHxTQ1BVCVJlcG9ydCBpbnRlcnJ1cHQgc3RhdGlzdGljcyIKKy8vdXNhZ2U6ICAgICAiXG4JLVAgbnVtfEFMTAkJUHJvY2Vzc29yIHRvIG1vbml0b3IiCisvL3VzYWdlOiAgICAgIlxuCS11CQkJUmVwb3J0IENQVSB1dGlsaXphdGlvbiIKKworaW50IG1wc3RhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXBzdGF0X21haW4oaW50IFVOVVNFRF9QQVJBTSBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpvcHRfaXJxX2ZtdDsKKwljaGFyICpvcHRfc2V0X2NwdTsKKwlpbnQgaSwgb3B0OworCWVudW0geworCQlPUFRfQUxMICAgID0gMSA8PCAwLCAvKiAtQSAqLworCQlPUFRfSU5UUyAgID0gMSA8PCAxLCAvKiAtSSAqLworCQlPUFRfU0VUQ1BVID0gMSA8PCAyLCAvKiAtUCAqLworCQlPUFRfVVRJTCAgID0gMSA8PCAzLCAvKiAtdSAqLworCX07CisKKwkvKiBEb250IGJ1ZmZlciBkYXRhIGlmIHJlZGlyZWN0ZWQgdG8gYSBwaXBlICovCisJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisKKwlJTklUX0coKTsKKworCUcuaW50ZXJ2YWwgPSAtMTsKKworCS8qIEdldCBudW1iZXIgb2YgcHJvY2Vzc29ycyAqLworCUcuY3B1X25yID0gZ2V0X2NwdV9jb3VudCgpOworCisJLyogR2V0IG51bWJlciBvZiBjbG9jayB0aWNrcyBwZXIgc2VjICovCisJRy5oeiA9IGdldF9oeigpOworCisJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBwcm9jZXNzb3IgKi8KKwlHLmlycWNwdV9uciA9IGdldF9pcnFjcHVfbnIoUFJPQ0ZTX0lOVEVSUlVQVFMsIE5SX0lSUVMpICsgTlJfSVJRQ1BVX1BSRUFMTE9DOworCisJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBzb2Z0IGludGVycnVwdHMgcGVyIHByb2Nlc3NvciAqLworCUcuc29mdGlycWNwdV9uciA9IGdldF9pcnFjcHVfbnIoUFJPQ0ZTX1NPRlRJUlFTLCBOUl9JUlFTKSArIE5SX0lSUUNQVV9QUkVBTExPQzsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBzdHJ1Y3R1cmVzLiArIDEgZm9yIGdsb2JhbCBzdHJ1Y3R1cmUuICovCisJYWxsb2Nfc3RydWN0KEcuY3B1X25yICsgMSk7CisKKwkvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiQUk6UDp1IiwgJm9wdF9pcnFfZm10LCAmb3B0X3NldF9jcHUpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCphcmd2KSB7CisJCS8qIEdldCBpbnRlcnZhbCAqLworCQlHLmludGVydmFsID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCQlHLmNvdW50ID0gLTE7CisJCWFyZ3YrKzsKKwkJaWYgKCphcmd2KSB7CisJCQkvKiBHZXQgY291bnQgdmFsdWUgKi8KKwkJCWlmIChHLmludGVydmFsID09IDApCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJRy5jb3VudCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJCS8vaWYgKCorK2FyZ3YpCisJCQkvLwliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisJaWYgKEcuaW50ZXJ2YWwgPCAwKQorCQlHLmludGVydmFsID0gMDsKKworCWlmIChvcHQgJiBPUFRfQUxMKSB7CisJCUcucF9vcHRpb24gPSAxOworCQlHLm9wdGlvbnMgfD0gRF9DUFUgKyBEX0lSUV9TVU0gKyBEX0lSUV9DUFUgKyBEX1NPRlRJUlFTOworCQkvKiBTZWxlY3QgZXZlcnkgQ1BVICovCisJCW1lbXNldChHLmNwdV9iaXRtYXAsIDB4ZmYsIEcuY3B1X2JpdG1hcF9sZW4pOworCX0KKworCWlmIChvcHQgJiBPUFRfSU5UUykgeworCQlzdGF0aWMgY29uc3QgY2hhciB2W10gPSB7CisJCQlEX0lSUV9DUFUsIERfSVJRX1NVTSwgRF9TT0ZUSVJRUywKKwkJCURfSVJRX1NVTSArIERfSVJRX0NQVSArIERfU09GVElSUVMKKwkJfTsKKwkJaSA9IGluZGV4X2luX3N0cmluZ3MoIkNQVVwwU1VNXDBTQ1BVXDBBTExcMCIsIG9wdF9pcnFfZm10KTsKKwkJaWYgKGkgPT0gLTEpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCUcub3B0aW9ucyB8PSB2W2ldOworCX0KKworCWlmICgob3B0ICYgT1BUX1VUSUwpIC8qIC11PyAqLworCSB8fCBHLm9wdGlvbnMgPT0gMCAgLyogbm90aGluZz8gKHVzZSBkZWZhdWx0IHRoZW4pICovCisJKSB7CisJCUcub3B0aW9ucyB8PSBEX0NQVTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX1NFVENQVSkgeworCQljaGFyICp0OworCQlHLnBfb3B0aW9uID0gMTsKKworCQlmb3IgKHQgPSBzdHJ0b2sob3B0X3NldF9jcHUsICIsIik7IHQ7IHQgPSBzdHJ0b2soTlVMTCwgIiwiKSkgeworCQkJaWYgKHN0cmNtcCh0LCAiQUxMIikgPT0gMCkgeworCQkJCS8qIFNlbGVjdCBldmVyeSBDUFUgKi8KKwkJCQltZW1zZXQoRy5jcHVfYml0bWFwLCAweGZmLCBHLmNwdV9iaXRtYXBfbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogR2V0IENQVSBudW1iZXIgKi8KKwkJCQl1bnNpZ25lZCBuID0geGF0b2lfcG9zaXRpdmUodCk7CisJCQkJaWYgKG4gPj0gRy5jcHVfbnIpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgdGhhdCBtYW55IHByb2Nlc3NvcnMiKTsKKwkJCQluKys7CisJCQkJRy5jcHVfYml0bWFwW24gPj4gM10gfD0gMSA8PCAobiAmIDcpOworCQkJfQorCQl9CisJfQorCisJaWYgKCFHLnBfb3B0aW9uKQorCQkvKiBEaXNwbGF5IGdsb2JhbCBzdGF0cyAqLworCQlHLmNwdV9iaXRtYXBbMF0gPSAxOworCisJLyogR2V0IHRpbWUgKi8KKwlnZXRfbG9jYWx0aW1lKCZHLnRpbWVzdGFtcFswXSk7CisKKwkvKiBEaXNwbGF5IGhlYWRlciAqLworCXByaW50X2hlYWRlcigmRy50aW1lc3RhbXBbMF0pOworCisJLyogVGhlIG1haW4gbG9vcCAqLworCW1haW5fbG9vcCgpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCS8qIENsZWFuIHVwICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWZyZWUoRy5zdF9jcHVbaV0pOworCQkJZnJlZShHLnN0X2lycVtpXSk7CisJCQlmcmVlKEcuc3RfaXJxY3B1W2ldKTsKKwkJCWZyZWUoRy5zdF9zb2Z0aXJxY3B1W2ldKTsKKwkJfQorCQlmcmVlKEcuY3B1X2JpdG1hcCk7CisJCWZyZWUoJkcpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvbm1ldGVyLmMgYi9wcm9jcHMvbm1ldGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5OTU1OQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9ubWV0ZXIuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQmFzZWQgb24gbmFub3RvcC5jIGZyb20gZmxvcHB5ZncgcHJvamVjdAorICoKKyAqIENvbnRhY3QgbWU6IHZkYS5saW51eEBnb29nbGVtYWlsLmNvbQorICovCisKKy8vY29uZmlnOmNvbmZpZyBOTUVURVIKKy8vY29uZmlnOglib29sICJubWV0ZXIiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUHJpbnRzIHNlbGVjdGVkIHN5c3RlbSBzdGF0cyBjb250aW51b3VzbHksIG9uZSBsaW5lIHBlciB1cGRhdGUuCisKKy8vYXBwbGV0OklGX05NRVRFUihBUFBMRVQobm1ldGVyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX05NRVRFUikgKz0gbm1ldGVyLm8KKworLy91c2FnZTojZGVmaW5lIG5tZXRlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIE1TRUNdIEZPUk1BVF9TVFJJTkciCisvL3VzYWdlOiNkZWZpbmUgbm1ldGVyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTW9uaXRvciBzeXN0ZW0gaW4gcmVhbCB0aW1lIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4gLWQgTVNFQwlNaWxsaXNlY29uZHMgYmV0d2VlbiB1cGRhdGVzIChkZWZhdWx0OjEwMDApIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5Gb3JtYXQgc3BlY2lmaWVyczoiCisvL3VzYWdlOiAgICAgIlxuICVOYyBvciAlW2NOXQlDUFUuIE4gLSBiYXIgc2l6ZSAoZGVmYXVsdDoxMCkiCisvL3VzYWdlOiAgICAgIlxuCQkoZGlzcGxheXM6IFM6c3lzdGVtIFU6dXNlciBOOm5pY2VkIEQ6aW93YWl0IEk6aXJxIGk6c29mdGlycSkiCisvL3VzYWdlOiAgICAgIlxuICVbbklOVEVSRkFDRV0JTmV0d29yayBJTlRFUkZBQ0UiCisvL3VzYWdlOiAgICAgIlxuICVtCQlBbGxvY2F0ZWQgbWVtb3J5IgorLy91c2FnZTogICAgICJcbiAlW21mXQkJRnJlZSBtZW1vcnkiCisvL3VzYWdlOiAgICAgIlxuICVbbXRdCQlUb3RhbCBtZW1vcnkiCisvL3VzYWdlOiAgICAgIlxuICVzCQlBbGxvY2F0ZWQgc3dhcCIKKy8vdXNhZ2U6ICAgICAiXG4gJWYJCU51bWJlciBvZiB1c2VkIGZpbGUgZGVzY3JpcHRvcnMiCisvL3VzYWdlOiAgICAgIlxuICVOaQkJVG90YWwvc3BlY2lmaWMgSVJRIHJhdGUiCisvL3VzYWdlOiAgICAgIlxuICV4CQlDb250ZXh0IHN3aXRjaCByYXRlIgorLy91c2FnZTogICAgICJcbiAlcAkJRm9ya3MiCisvL3VzYWdlOiAgICAgIlxuICVbcG5dCQkjIG9mIHByb2Nlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4gJWIJCUJsb2NrIGlvIgorLy91c2FnZTogICAgICJcbiAlTnQJCVRpbWUgKHdpdGggTiBkZWNpbWFsIHBvaW50cykiCisvL3VzYWdlOiAgICAgIlxuICVyCQlQcmludCA8Y3I+IGluc3RlYWQgb2YgPGxmPiBhdCBFT0wiCisKKy8vVE9ETzoKKy8vIHNpbXBsaWZ5IGNvZGUKKy8vIC9wcm9jL2xvY2tzCisvLyAvcHJvYy9zdGF0OgorLy8gZGlza19pbzogKDMsMCk6KDIyMjcyLDE3ODk3LDQxMDcwMiw0Mzc1LDU0NzUwKQorLy8gYnRpbWUgMTA1OTQwMTk2MgorLy9UT0RPOiB1c2Ugc3lzaW5mbyBsaWJjIGNhbGwvc3lzY2FsbCwgaWYgYXBwcm9wcmlhdGUKKy8vIChmYXN0ZXIgdGhhbiBvcGVuL3JlYWQvY2xvc2UpOgorLy8gc3lzaW5mbyh7dXB0aW1lPTE1MDE3LCBsb2Fkcz1bNTcyOCwgMTUwNDAsIDE2NDgwXQorLy8gIHRvdGFscmFtPTIxMDc0MTY1NzYsIGZyZWVyYW09MjExNTI1NjMyLCBzaGFyZWRyYW09MCwgYnVmZmVycmFtPTE1NzIwNDQ4MH0KKy8vICB0b3RhbHN3YXA9MTM0MjA5NTM2LCBmcmVlc3dhcD0xMzQyMDk1MzYsIHByb2NzPTE1N30pCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxvbmc7CisKK2VudW0geyAgLyogUHJlZmVyYWJseSB1c2UgcG93ZXJzIG9mIDIgKi8KKwlQUk9DX01JTl9GSUxFX1NJWkUgPSAyNTYsCisJUFJPQ19NQVhfRklMRV9TSVpFID0gMTYgKiAxMDI0LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgcHJvY19maWxlIHsKKwljaGFyICpmaWxlOworCWludCBmaWxlX3N6OworCXNtYWxsaW50IGxhc3RfZ2VuOworfSBwcm9jX2ZpbGU7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcm9jX25hbWVbXSA9IHsKKwkic3RhdCIsCQkvLyBNdXN0IG1hdGNoIHRoZSBvcmRlciBvZiBwcm9jX2ZpbGUncyEKKwkibG9hZGF2ZyIsCisJIm5ldC9kZXYiLAorCSJtZW1pbmZvIiwKKwkiZGlza3N0YXRzIiwKKwkic3lzL2ZzL2ZpbGUtbnIiCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLy8gU2FtcGxlIGdlbmVyYXRpb24gZmxpcC1mbG9wCisJc21hbGxpbnQgZ2VuOworCS8vIExpbnV4IDIuNj8gKG90aGVyd2lzZSBhc3N1bWVzIDIuNCkKKwlzbWFsbGludCBpczI2OworCS8vIDEgaWYgc2FtcGxlIGRlbGF5IGlzIG5vdCBhbiBpbnRlZ2VyIGZyYWN0aW9uIG9mIGEgc2Vjb25kCisJc21hbGxpbnQgbmVlZF9zZWNvbmRzOworCWNoYXIgKmN1cl9vdXRidWY7CisJY29uc3QgY2hhciAqZmluYWxfc3RyOworCWludCBkZWx0YTsKKwlpbnQgZGVsdGFuejsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKyNkZWZpbmUgZmlyc3RfcHJvY19maWxlIHByb2Nfc3RhdAorCXByb2NfZmlsZSBwcm9jX3N0YXQ7CS8vIE11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHByb2NfbmFtZSdzIQorCXByb2NfZmlsZSBwcm9jX2xvYWRhdmc7CisJcHJvY19maWxlIHByb2NfbmV0X2RldjsKKwlwcm9jX2ZpbGUgcHJvY19tZW1pbmZvOworCXByb2NfZmlsZSBwcm9jX2Rpc2tzdGF0czsKKwlwcm9jX2ZpbGUgcHJvY19zeXNfZnNfZmlsZW5yOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBnZW4gICAgICAgICAgICAgICAgKEcuZ2VuICAgICAgICAgICAgICAgKQorI2RlZmluZSBpczI2ICAgICAgICAgICAgICAgKEcuaXMyNiAgICAgICAgICAgICAgKQorI2RlZmluZSBuZWVkX3NlY29uZHMgICAgICAgKEcubmVlZF9zZWNvbmRzICAgICAgKQorI2RlZmluZSBjdXJfb3V0YnVmICAgICAgICAgKEcuY3VyX291dGJ1ZiAgICAgICAgKQorI2RlZmluZSBmaW5hbF9zdHIgICAgICAgICAgKEcuZmluYWxfc3RyICAgICAgICAgKQorI2RlZmluZSBkZWx0YSAgICAgICAgICAgICAgKEcuZGVsdGEgICAgICAgICAgICAgKQorI2RlZmluZSBkZWx0YW56ICAgICAgICAgICAgKEcuZGVsdGFueiAgICAgICAgICAgKQorI2RlZmluZSB0diAgICAgICAgICAgICAgICAgKEcudHYgICAgICAgICAgICAgICAgKQorI2RlZmluZSBwcm9jX3N0YXQgICAgICAgICAgKEcucHJvY19zdGF0ICAgICAgICAgKQorI2RlZmluZSBwcm9jX2xvYWRhdmcgICAgICAgKEcucHJvY19sb2FkYXZnICAgICAgKQorI2RlZmluZSBwcm9jX25ldF9kZXYgICAgICAgKEcucHJvY19uZXRfZGV2ICAgICAgKQorI2RlZmluZSBwcm9jX21lbWluZm8gICAgICAgKEcucHJvY19tZW1pbmZvICAgICAgKQorI2RlZmluZSBwcm9jX2Rpc2tzdGF0cyAgICAgKEcucHJvY19kaXNrc3RhdHMgICAgKQorI2RlZmluZSBwcm9jX3N5c19mc19maWxlbnIgKEcucHJvY19zeXNfZnNfZmlsZW5yKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWN1cl9vdXRidWYgPSBvdXRidWY7IFwKKwlmaW5hbF9zdHIgPSAiXG4iOyBcCisJZGVsdGFueiA9IGRlbHRhID0gMTAwMDAwMDsgXAorfSB3aGlsZSAoMCkKKworLy8gV2UgZGVwZW5kIG9uIHRoaXMgYmVpbmcgYSBjaGFyW10sIG5vdCBjaGFyKiAtIHdlIHRha2Ugc2l6ZW9mKCkgb2YgaXQKKyNkZWZpbmUgb3V0YnVmIGJiX2NvbW1vbl9idWZzaXoxCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9vdXRidWYodm9pZCkKK3sKKwljdXJfb3V0YnVmID0gb3V0YnVmOworfQorCitzdGF0aWMgaW5saW5lIGludCBvdXRidWZfY291bnQodm9pZCkKK3sKKwlyZXR1cm4gY3VyX291dGJ1ZiAtIG91dGJ1ZjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfb3V0YnVmKHZvaWQpCit7CisJaW50IHN6ID0gY3VyX291dGJ1ZiAtIG91dGJ1ZjsKKwlpZiAoc3ogPiAwKSB7CisJCXh3cml0ZShTVERPVVRfRklMRU5PLCBvdXRidWYsIHN6KTsKKwkJY3VyX291dGJ1ZiA9IG91dGJ1ZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB1dChjb25zdCBjaGFyICpzKQoreworCWludCBzeiA9IHN0cmxlbihzKTsKKwlpZiAoc3ogPiBvdXRidWYgKyBzaXplb2Yob3V0YnVmKSAtIGN1cl9vdXRidWYpCisJCXN6ID0gb3V0YnVmICsgc2l6ZW9mKG91dGJ1ZikgLSBjdXJfb3V0YnVmOworCW1lbWNweShjdXJfb3V0YnVmLCBzLCBzeik7CisJY3VyX291dGJ1ZiArPSBzejsKK30KKworc3RhdGljIHZvaWQgcHV0X2MoY2hhciBjKQoreworCWlmIChjdXJfb3V0YnVmIDwgb3V0YnVmICsgc2l6ZW9mKG91dGJ1ZikpCisJCSpjdXJfb3V0YnVmKysgPSBjOworfQorCitzdGF0aWMgdm9pZCBwdXRfcXVlc3Rpb25fbWFya3MoaW50IGNvdW50KQoreworCXdoaWxlIChjb3VudC0tKQorCQlwdXRfYygnPycpOworfQorCitzdGF0aWMgdm9pZCByZWFkZmlsZV96KHByb2NfZmlsZSAqcGYsIGNvbnN0IGNoYXIqIGZuYW1lKQoreworLy8gb3Blbl9yZWFkX2Nsb3NlKCkgd2lsbCBkbyB0d28gcmVhZHMgaW4gb3JkZXIgdG8gYmUgc3VyZSB3ZSBhcmUgYXQgRU9GLAorLy8gYW5kIHdlIGRvbid0IG5lZWQvd2FudCB0aGF0LgorCWludCBmZDsKKwlpbnQgc3osIHJkc3o7CisJY2hhciAqYnVmOworCisJc3ogPSBwZi0+ZmlsZV9zejsKKwlidWYgPSBwZi0+ZmlsZTsKKwlpZiAoIWJ1ZikgeworCQlidWYgPSB4bWFsbG9jKFBST0NfTUlOX0ZJTEVfU0laRSk7CisJCXN6ID0gUFJPQ19NSU5fRklMRV9TSVpFOworCX0KKyBhZ2FpbjoKKwlmZCA9IHhvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJYnVmWzBdID0gJ1wwJzsKKwlyZHN6ID0gcmVhZChmZCwgYnVmLCBzei0xKTsKKwljbG9zZShmZCk7CisJaWYgKHJkc3ogPiAwKSB7CisJCWlmIChyZHN6ID09IHN6LTEgJiYgc3ogPCBQUk9DX01BWF9GSUxFX1NJWkUpIHsKKwkJCXN6ICo9IDI7CisJCQlidWYgPSB4cmVhbGxvYyhidWYsIHN6KTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJYnVmW3Jkc3pdID0gJ1wwJzsKKwl9CisJcGYtPmZpbGVfc3ogPSBzejsKKwlwZi0+ZmlsZSA9IGJ1ZjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGdldF9maWxlKHByb2NfZmlsZSAqcGYpCit7CisJaWYgKHBmLT5sYXN0X2dlbiAhPSBnZW4pIHsKKwkJcGYtPmxhc3RfZ2VuID0gZ2VuOworCQlyZWFkZmlsZV96KHBmLCBwcm9jX25hbWVbcGYgLSAmZmlyc3RfcHJvY19maWxlXSk7CisJfQorCXJldHVybiBwZi0+ZmlsZTsKK30KKworc3RhdGljIHVsbG9uZyByZWFkX2FmdGVyX3NsYXNoKGNvbnN0IGNoYXIgKnApCit7CisJcCA9IHN0cmNocihwLCAnLycpOworCWlmICghcCkgcmV0dXJuIDA7CisJcmV0dXJuIHN0cnRvdWxsKHArMSwgTlVMTCwgMTApOworfQorCitlbnVtIGNvbnZfdHlwZSB7IGNvbnZfZGVjaW1hbCwgY29udl9zbGFzaCB9OworCisvLyBSZWFkcyBkZWNpbWFsIHZhbHVlcyBmcm9tIGxpbmUuIFZhbHVlcyBzdGFydCBhZnRlciBrZXksIGZvciBleGFtcGxlOgorLy8gImNwdSAgNjQ5MzY5IDAgMzQxMjk3IDQzMzY3NjkuLi4iIC0ga2V5IGlzICJjcHUiIGhlcmUuCisvLyBWYWx1ZXMgYXJlIHN0b3JlZCBpbiB2ZWNbXS4gYXJnX3B0ciBoYXMgbGlzdCBvZiBwb3NpdGlvbnMKKy8vIHdlIGFyZSBpbnRlcmVzdGVkIGluOiBmb3IgZXhhbXBsZTogMSwyLDUgLSB3ZSB3YW50IDFzdCwgMm5kIGFuZCA1dGggdmFsdWUuCitzdGF0aWMgaW50IHZyZHZhbChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBrZXksCisJZW51bSBjb252X3R5cGUgY29udiwgdWxsb25nICp2ZWMsIHZhX2xpc3QgYXJnX3B0cikKK3sKKwlpbnQgaW5kZXhsaW5lOworCWludCBpbmRleG5leHQ7CisKKwlwID0gc3Ryc3RyKHAsIGtleSk7CisJaWYgKCFwKSByZXR1cm4gMTsKKworCXAgKz0gc3RybGVuKGtleSk7CisJaW5kZXhsaW5lID0gMTsKKwlpbmRleG5leHQgPSB2YV9hcmcoYXJnX3B0ciwgaW50KTsKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpIHArKzsKKwkJaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1wwJykgYnJlYWs7CisKKwkJaWYgKGluZGV4bGluZSA9PSBpbmRleG5leHQpIHsgLy8gcmVhZCB0aGlzIHZhbHVlCisJCQkqdmVjKysgPSBjb252PT1jb252X2RlY2ltYWwgPworCQkJCXN0cnRvdWxsKHAsIE5VTEwsIDEwKSA6CisJCQkJcmVhZF9hZnRlcl9zbGFzaChwKTsKKwkJCWluZGV4bmV4dCA9IHZhX2FyZyhhcmdfcHRyLCBpbnQpOworCQl9CisJCXdoaWxlICgqcCA+ICcgJykgcCsrOyAvLyBza2lwIG92ZXIgdmFsdWUKKwkJaW5kZXhsaW5lKys7CisJfQorCXJldHVybiAwOworfQorCisvLyBQYXJzZXMgZmlsZXMgd2l0aCBsaW5lcyBsaWtlICJjcHUwIDIxNzI3IDAgMTU3MTggMTgxMzg1NiA5NDYxIDEwNDg1IDAgMCI6CisvLyByZHZhbChmaWxlX2NvbnRlbnRzLCAic3RyaW5nX3RvX2ZpbmQiLCByZXN1bHRfdmVjdG9yLCB2YWx1ZSMsIHZhbHVlIy4uLikKKy8vIHZhbHVlIyBzdGFydCB3aXRoIDEKK3N0YXRpYyBpbnQgcmR2YWwoY29uc3QgY2hhciogcCwgY29uc3QgY2hhcioga2V5LCB1bGxvbmcgKnZlYywgLi4uKQoreworCXZhX2xpc3QgYXJnX3B0cjsKKwlpbnQgcmVzdWx0OworCisJdmFfc3RhcnQoYXJnX3B0ciwgdmVjKTsKKwlyZXN1bHQgPSB2cmR2YWwocCwga2V5LCBjb252X2RlY2ltYWwsIHZlYywgYXJnX3B0cik7CisJdmFfZW5kKGFyZ19wdHIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUGFyc2VzIGZpbGVzIHdpdGggbGluZXMgbGlrZSAiLi4uIC4uLiAuLi4gMy8xNDggLi4uLiIKK3N0YXRpYyBpbnQgcmR2YWxfbG9hZGF2Zyhjb25zdCBjaGFyKiBwLCB1bGxvbmcgKnZlYywgLi4uKQoreworCXZhX2xpc3QgYXJnX3B0cjsKKwlpbnQgcmVzdWx0OworCisJdmFfc3RhcnQoYXJnX3B0ciwgdmVjKTsKKwlyZXN1bHQgPSB2cmR2YWwocCwgIiIsIGNvbnZfc2xhc2gsIHZlYywgYXJnX3B0cik7CisJdmFfZW5kKGFyZ19wdHIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUGFyc2VzIC9wcm9jL2Rpc2tzdGF0cworLy8gICAxICAyIDMgICA0CSA1ICAgICAgICA2KHJkKSAgNyAgICAgIDggICAgIDkgICAgIDEwKHdyKSAxMSAgICAgMTIgMTMgICAgIDE0CisvLyAgIDMgIDAgaGRhIDUxMjkyIDE0NDQxIDg0MTc4MyA5MjYwNTIgMjU3MTcgNzk2NTAgODQzMjU2IDMwMjk4MDQgMCAxNDg0NTkgMzk1NjkzMworLy8gICAzICAxIGhkYTEgMCAwIDAgMCA8LSBpZ25vcmUgaWYgb25seSA0IGZpZWxkcworc3RhdGljIGludCByZHZhbF9kaXNrc3RhdHMoY29uc3QgY2hhciogcCwgdWxsb25nICp2ZWMpCit7CisJdWxsb25nIHJkID0gcmQ7IC8vIGZvciBjb21waWxlcgorCWludCBpbmRleGxpbmUgPSAwOworCXZlY1swXSA9IDA7CisJdmVjWzFdID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbmRleGxpbmUrKzsKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisJCWlmICgqcCA9PSAnXDAnKSBicmVhazsKKwkJaWYgKCpwID09ICdcbicpIHsKKwkJCWluZGV4bGluZSA9IDA7CisJCQlwKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaW5kZXhsaW5lID09IDYpIHsKKwkJCXJkID0gc3RydG91bGwocCwgTlVMTCwgMTApOworCQl9IGVsc2UgaWYgKGluZGV4bGluZSA9PSAxMCkgeworCQkJdmVjWzBdICs9IHJkOyAgLy8gVE9ETzogKnNlY3RvcnNpemUgKGRvbid0IGtub3cgaG93IHRvIGZpbmQgb3V0IHNlY3RvcnNpemUpCisJCQl2ZWNbMV0gKz0gc3RydG91bGwocCwgTlVMTCwgMTApOworCQkJd2hpbGUgKCpwICE9ICdcbicgJiYgKnAgIT0gJ1wwJykgcCsrOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKCpwID4gJyAnKSBwKys7IC8vIHNraXAgb3ZlciB2YWx1ZQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NhbGUodWxsb25nIHVsKQoreworCWNoYXIgYnVmWzVdOworCisJLyogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVyYSAqLworCXNtYXJ0X3VsbHRvYTQodWwsIGJ1ZiwgIiBrbWd0cGV6eSIpOworCWJ1Zls0XSA9ICdcMCc7CisJcHV0KGJ1Zik7Cit9CisKKworI2RlZmluZSBTX1NUQVQoYSkgXAordHlwZWRlZiBzdHJ1Y3QgYSB7IFwKKwlzdHJ1Y3Qgc19zdGF0ICpuZXh0OyBcCisJdm9pZCAoKmNvbGxlY3QpKHN0cnVjdCBhICpzKSBGQVNUX0ZVTkM7IFwKKwljb25zdCBjaGFyICpsYWJlbDsKKyNkZWZpbmUgU19TVEFUX0VORChhKSB9IGE7CisKK1NfU1RBVChzX3N0YXQpCitTX1NUQVRfRU5EKHNfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfbGl0ZXJhbChzX3N0YXQgKnMgVU5VU0VEX1BBUkFNKQoreworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2xpdGVyYWwodm9pZCkKK3sKKwlzX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2xpdGVyYWw7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfZGVsYXkoY29uc3QgY2hhciAqcGFyYW0pCit7CisJZGVsdGEgPSBzdHJ0b3VsKHBhcmFtLCBOVUxMLCAwKSAqIDEwMDA7IC8qIHBhcmFtIGNhbiBiZSAiIiAqLworCWRlbHRhbnogPSBkZWx0YSA+IDAgPyBkZWx0YSA6IDE7CisJbmVlZF9zZWNvbmRzID0gKDEwMDAwMDAlZGVsdGFueikgIT0gMDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9jcihjb25zdCBjaGFyICpwYXJhbSBVTlVTRURfUEFSQU0pCit7CisJZmluYWxfc3RyID0gIlxyIjsKKwlyZXR1cm4gKHNfc3RhdCopMDsKK30KKworCisvLyAgICAgdXNlciBuaWNlIHN5c3RlbSBpZGxlICBpb3dhaXQgaXJxICBzb2Z0aXJxIChsYXN0IDMgb25seSBpbiAyLjYpCisvL2NwdSAgNjQ5MzY5IDAgMzQxMjk3IDQzMzY3NjkgMTE2NDAgNzEyMiAxMTgzCisvL2NwdU4gNjQ5MzY5IDAgMzQxMjk3IDQzMzY3NjkgMTE2NDAgNzEyMiAxMTgzCitlbnVtIHsgQ1BVX0ZJRUxEQ05UID0gNyB9OworU19TVEFUKGNwdV9zdGF0KQorCXVsbG9uZyBvbGRbQ1BVX0ZJRUxEQ05UXTsKKwlpbnQgYmFyX3N6OworCWNoYXIgKmJhcjsKK1NfU1RBVF9FTkQoY3B1X3N0YXQpCisKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfY3B1KGNwdV9zdGF0ICpzKQoreworCXVsbG9uZyBkYXRhW0NQVV9GSUVMRENOVF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1bnNpZ25lZCBmcmFjW0NQVV9GSUVMRENOVF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1bGxvbmcgYWxsID0gMDsKKwlpbnQgbm9ybV9hbGwgPSAwOworCWludCBiYXJfc3ogPSBzLT5iYXJfc3o7CisJY2hhciAqYmFyID0gcy0+YmFyOworCWludCBpOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX3N0YXQpLCAiY3B1ICIsIGRhdGEsIDEsIDIsIDMsIDQsIDUsIDYsIDcpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyhiYXJfc3opOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IENQVV9GSUVMRENOVDsgaSsrKSB7CisJCXVsbG9uZyBvbGQgPSBzLT5vbGRbaV07CisJCWlmIChkYXRhW2ldIDwgb2xkKSBvbGQgPSBkYXRhW2ldOwkJLy9zYW5pdGl6ZQorCQlzLT5vbGRbaV0gPSBkYXRhW2ldOworCQlhbGwgKz0gKGRhdGFbaV0gLT0gb2xkKTsKKwl9CisKKwlpZiAoYWxsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDUFVfRklFTERDTlQ7IGkrKykgeworCQkJdWxsb25nIHQgPSBiYXJfc3ogKiBkYXRhW2ldOworCQkJbm9ybV9hbGwgKz0gZGF0YVtpXSA9IHQgLyBhbGw7CisJCQlmcmFjW2ldID0gdCAlIGFsbDsKKwkJfQorCisJCXdoaWxlIChub3JtX2FsbCA8IGJhcl9zeikgeworCQkJdW5zaWduZWQgbWF4ID0gZnJhY1swXTsKKwkJCWludCBwb3MgPSAwOworCQkJZm9yIChpID0gMTsgaSA8IENQVV9GSUVMRENOVDsgaSsrKSB7CisJCQkJaWYgKGZyYWNbaV0gPiBtYXgpIG1heCA9IGZyYWNbaV0sIHBvcyA9IGk7CisJCQl9CisJCQlmcmFjW3Bvc10gPSAwOwkvL2F2b2lkIGJ1bXBpbmcgdXAgc2FtZSB2YWx1ZSB0d2ljZQorCQkJZGF0YVtwb3NdKys7CisJCQlub3JtX2FsbCsrOworCQl9CisKKwkJbWVtc2V0KGJhciwgJy4nLCBiYXJfc3opOworCQltZW1zZXQoYmFyLCAnUycsIGRhdGFbMl0pOyBiYXIgKz0gZGF0YVsyXTsgLy9zeXMKKwkJbWVtc2V0KGJhciwgJ1UnLCBkYXRhWzBdKTsgYmFyICs9IGRhdGFbMF07IC8vdXNyCisJCW1lbXNldChiYXIsICdOJywgZGF0YVsxXSk7IGJhciArPSBkYXRhWzFdOyAvL25pY2UKKwkJbWVtc2V0KGJhciwgJ0QnLCBkYXRhWzRdKTsgYmFyICs9IGRhdGFbNF07IC8vaW93YWl0CisJCW1lbXNldChiYXIsICdJJywgZGF0YVs1XSk7IGJhciArPSBkYXRhWzVdOyAvL2lycQorCQltZW1zZXQoYmFyLCAnaScsIGRhdGFbNl0pOyBiYXIgKz0gZGF0YVs2XTsgLy9zb2Z0aXJxCisJfSBlbHNlIHsKKwkJbWVtc2V0KGJhciwgJz8nLCBiYXJfc3opOworCX0KKwlwdXQocy0+YmFyKTsKK30KKworCitzdGF0aWMgc19zdGF0KiBpbml0X2NwdShjb25zdCBjaGFyICpwYXJhbSkKK3sKKwlpbnQgc3o7CisJY3B1X3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2NwdTsKKwlzeiA9IHN0cnRvdWwocGFyYW0sIE5VTEwsIDApOyAvKiBwYXJhbSBjYW4gYmUgIiIgKi8KKwlpZiAoc3ogPCAxMCkgc3ogPSAxMDsKKwlpZiAoc3ogPiAxMDAwKSBzeiA9IDEwMDA7CisJcy0+YmFyID0geHphbGxvYyhzeisxKTsKKwkvKnMtPmJhcltzel0gPSAnXDAnOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJcy0+YmFyX3N6ID0gc3o7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKGludF9zdGF0KQorCXVsbG9uZyBvbGQ7CisJaW50IG5vOworU19TVEFUX0VORChpbnRfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfaW50KGludF9zdGF0ICpzKQoreworCXVsbG9uZyBkYXRhWzFdOworCXVsbG9uZyBvbGQ7CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2Nfc3RhdCksICJpbnRyIiwgZGF0YSwgcy0+bm8pKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKworCW9sZCA9IHMtPm9sZDsKKwlpZiAoZGF0YVswXSA8IG9sZCkgb2xkID0gZGF0YVswXTsJCS8vc2FuaXRpemUKKwlzLT5vbGQgPSBkYXRhWzBdOworCXNjYWxlKGRhdGFbMF0gLSBvbGQpOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2ludChjb25zdCBjaGFyICpwYXJhbSkKK3sKKwlpbnRfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfaW50OworCWlmIChwYXJhbVswXSA9PSAnXDAnKSB7CisJCXMtPm5vID0gMTsKKwl9IGVsc2UgeworCQlpbnQgbiA9IHhhdG9pX3Bvc2l0aXZlKHBhcmFtKTsKKwkJcy0+bm8gPSBuICsgMjsKKwl9CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKGN0eF9zdGF0KQorCXVsbG9uZyBvbGQ7CitTX1NUQVRfRU5EKGN0eF9zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9jdHgoY3R4X3N0YXQgKnMpCit7CisJdWxsb25nIGRhdGFbMV07CisJdWxsb25nIG9sZDsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19zdGF0KSwgImN0eHQiLCBkYXRhLCAxKSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisKKwlvbGQgPSBzLT5vbGQ7CisJaWYgKGRhdGFbMF0gPCBvbGQpIG9sZCA9IGRhdGFbMF07CQkvL3Nhbml0aXplCisJcy0+b2xkID0gZGF0YVswXTsKKwlzY2FsZShkYXRhWzBdIC0gb2xkKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9jdHgoY29uc3QgY2hhciAqcGFyYW0gVU5VU0VEX1BBUkFNKQoreworCWN0eF9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9jdHg7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKGJsa19zdGF0KQorCWNvbnN0IGNoYXIqIGxvb2tmb3I7CisJdWxsb25nIG9sZFsyXTsKK1NfU1RBVF9FTkQoYmxrX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2JsayhibGtfc3RhdCAqcykKK3sKKwl1bGxvbmcgZGF0YVsyXTsKKwlpbnQgaTsKKworCWlmIChpczI2KSB7CisJCWkgPSByZHZhbF9kaXNrc3RhdHMoZ2V0X2ZpbGUoJnByb2NfZGlza3N0YXRzKSwgZGF0YSk7CisJfSBlbHNlIHsKKwkJaSA9IHJkdmFsKGdldF9maWxlKCZwcm9jX3N0YXQpLCBzLT5sb29rZm9yLCBkYXRhLCAxLCAyKTsKKwkJLy8gTGludXggMi40IHJlcG9ydHMgYmlvIGluIEtieXRlcywgY29udmVydCB0byBzZWN0b3JzOgorCQlkYXRhWzBdICo9IDI7CisJCWRhdGFbMV0gKj0gMjsKKwl9CisJaWYgKGkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDkpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpPTA7IGk8MjsgaSsrKSB7CisJCXVsbG9uZyBvbGQgPSBzLT5vbGRbaV07CisJCWlmIChkYXRhW2ldIDwgb2xkKSBvbGQgPSBkYXRhW2ldOwkJLy9zYW5pdGl6ZQorCQlzLT5vbGRbaV0gPSBkYXRhW2ldOworCQlkYXRhW2ldIC09IG9sZDsKKwl9CisJc2NhbGUoZGF0YVswXSo1MTIpOyAvLyBUT0RPOiAqc2VjdG9yc2l6ZQorCXB1dF9jKCcgJyk7CisJc2NhbGUoZGF0YVsxXSo1MTIpOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2Jsayhjb25zdCBjaGFyICpwYXJhbSBVTlVTRURfUEFSQU0pCit7CisJYmxrX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2JsazsKKwlzLT5sb29rZm9yID0gInBhZ2UiOworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChmb3JrX3N0YXQpCisJdWxsb25nIG9sZDsKK1NfU1RBVF9FTkQoZm9ya19zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF90aHJlYWRfbnIoZm9ya19zdGF0ICpzIFVOVVNFRF9QQVJBTSkKK3sKKwl1bGxvbmcgZGF0YVsxXTsKKworCWlmIChyZHZhbF9sb2FkYXZnKGdldF9maWxlKCZwcm9jX2xvYWRhdmcpLCBkYXRhLCA0KSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisJc2NhbGUoZGF0YVswXSk7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2ZvcmsoZm9ya19zdGF0ICpzKQoreworCXVsbG9uZyBkYXRhWzFdOworCXVsbG9uZyBvbGQ7CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2Nfc3RhdCksICJwcm9jZXNzZXMiLCBkYXRhLCAxKSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisKKwlvbGQgPSBzLT5vbGQ7CisJaWYgKGRhdGFbMF0gPCBvbGQpIG9sZCA9IGRhdGFbMF07CS8vc2FuaXRpemUKKwlzLT5vbGQgPSBkYXRhWzBdOworCXNjYWxlKGRhdGFbMF0gLSBvbGQpOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2ZvcmsoY29uc3QgY2hhciAqcGFyYW0pCit7CisJZm9ya19zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlpZiAoKnBhcmFtID09ICduJykgeworCQlzLT5jb2xsZWN0ID0gY29sbGVjdF90aHJlYWRfbnI7CisJfSBlbHNlIHsKKwkJcy0+Y29sbGVjdCA9IGNvbGxlY3RfZm9yazsKKwl9CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKGlmX3N0YXQpCisJdWxsb25nIG9sZFs0XTsKKwljb25zdCBjaGFyICpkZXZpY2U7CisJY2hhciAqZGV2aWNlX2NvbG9uOworU19TVEFUX0VORChpZl9zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9pZihpZl9zdGF0ICpzKQoreworCXVsbG9uZyBkYXRhWzRdOworCWludCBpOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX25ldF9kZXYpLCBzLT5kZXZpY2VfY29sb24sIGRhdGEsIDEsIDMsIDksIDExKSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoMTApOworCQlyZXR1cm47CisJfQorCisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCXVsbG9uZyBvbGQgPSBzLT5vbGRbaV07CisJCWlmIChkYXRhW2ldIDwgb2xkKSBvbGQgPSBkYXRhW2ldOwkJLy9zYW5pdGl6ZQorCQlzLT5vbGRbaV0gPSBkYXRhW2ldOworCQlkYXRhW2ldIC09IG9sZDsKKwl9CisJcHV0X2MoZGF0YVsxXSA/ICcqJyA6ICcgJyk7CisJc2NhbGUoZGF0YVswXSk7CisJcHV0X2MoZGF0YVszXSA/ICcqJyA6ICcgJyk7CisJc2NhbGUoZGF0YVsyXSk7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfaWYoY29uc3QgY2hhciAqZGV2aWNlKQoreworCWlmX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCisJaWYgKCFkZXZpY2UgfHwgIWRldmljZVswXSkKKwkJYmJfc2hvd191c2FnZSgpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2lmOworCisJcy0+ZGV2aWNlID0gZGV2aWNlOworCXMtPmRldmljZV9jb2xvbiA9IHhhc3ByaW50ZigiJXM6IiwgZGV2aWNlKTsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQobWVtX3N0YXQpCisJY2hhciBvcHQ7CitTX1NUQVRfRU5EKG1lbV9zdGF0KQorCisvLyAiTWVtb3J5IiB2YWx1ZSBzaG91bGQgbm90IGluY2x1ZGUgYW55IGNhY2hlcy4KKy8vIElPVzogbmVpdGhlciAibHMgLWxhUiAvIiBub3IgaGVhdnkgcmVhZC93cml0ZSBhY3Rpdml0eQorLy8gICAgICBzaG91bGQgYWZmZWN0IGl0LiBXZSdkIGxpa2UgdG8gYWxzbyBpbmNsdWRlIGFueQorLy8gICAgICBsb25nLXRlcm0gYWxsb2NhdGVkIGtlcm5lbC1zaWRlIG1lbSwgYnV0IGl0IGlzIGhhcmQKKy8vICAgICAgdG8gZmlndXJlIG91dC4gRm9yIG5vdywgYnVmcywgY2FjaGVkICYgc2xhYiBhcmUKKy8vICAgICAgY291bnRlZCBhcyAiZnJlZSIgbWVtb3J5CisvLzIuNi4xNjoKKy8vTWVtVG90YWw6ICAgICAgIDc3MzI4MCBrQgorLy9NZW1GcmVlOiAgICAgICAgIDI1OTEyIGtCIC0gZ2VudWluZWx5IGZyZWUKKy8vQnVmZmVyczogICAgICAgIDMyMDY3MiBrQiAtIGNhY2hlCisvL0NhY2hlZDogICAgICAgICAxNDYzOTYga0IgLSBjYWNoZQorLy9Td2FwQ2FjaGVkOiAgICAgICAgICAwIGtCCisvL0FjdGl2ZTogICAgICAgICAxODMwNjQga0IKKy8vSW5hY3RpdmU6ICAgICAgIDM1Njg5MiBrQgorLy9IaWdoVG90YWw6ICAgICAgICAgICAwIGtCCisvL0hpZ2hGcmVlOiAgICAgICAgICAgIDAga0IKKy8vTG93VG90YWw6ICAgICAgIDc3MzI4MCBrQgorLy9Mb3dGcmVlOiAgICAgICAgIDI1OTEyIGtCCisvL1N3YXBUb3RhbDogICAgICAxMzEwNjQga0IKKy8vU3dhcEZyZWU6ICAgICAgIDEzMTA2NCBrQgorLy9EaXJ0eTogICAgICAgICAgICAgIDQ4IGtCCisvL1dyaXRlYmFjazogICAgICAgICAgIDAga0IKKy8vTWFwcGVkOiAgICAgICAgICA5NjYyMCBrQgorLy9TbGFiOiAgICAgICAgICAgMjAwNjY4IGtCIC0gdGFrZXMgNyBNYiBvbiBteSBib3ggZnJlc2ggYWZ0ZXIgYm9vdCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpbmNsdWRlcyBkZW50cmllcyBhbmQgaW5vZGVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPT0gY2FuIHRha2UgYXJiaXRyYXJ5IGFtb3VudCBvZiBtZW0pCisvL0NvbW1pdExpbWl0OiAgICA1MTc3MDQga0IKKy8vQ29tbWl0dGVkX0FTOiAgIDIzNjc3NiBrQgorLy9QYWdlVGFibGVzOiAgICAgICAxMjQ4IGtCCisvL1ZtYWxsb2NUb3RhbDogICA1MTYwNTIga0IKKy8vVm1hbGxvY1VzZWQ6ICAgICAgMzg1MiBrQgorLy9WbWFsbG9jQ2h1bms6ICAgNTEyMDk2IGtCCisvL0h1Z2VQYWdlc19Ub3RhbDogICAgIDAKKy8vSHVnZVBhZ2VzX0ZyZWU6ICAgICAgMAorLy9IdWdlcGFnZXNpemU6ICAgICA0MDk2IGtCCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9tZW0obWVtX3N0YXQgKnMpCit7CisJdWxsb25nIG1fdG90YWwgPSAwOworCXVsbG9uZyBtX2ZyZWUgPSAwOworCXVsbG9uZyBtX2J1ZnMgPSAwOworCXVsbG9uZyBtX2NhY2hlZCA9IDA7CisJdWxsb25nIG1fc2xhYiA9IDA7CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2NfbWVtaW5mbyksICJNZW1Ub3RhbDoiLCAmbV90b3RhbCwgMSkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCWlmIChzLT5vcHQgPT0gJ3QnKSB7CisJCXNjYWxlKG1fdG90YWwgPDwgMTApOworCQlyZXR1cm47CisJfQorCisJaWYgKHJkdmFsKHByb2NfbWVtaW5mby5maWxlLCAiTWVtRnJlZToiLCAmbV9mcmVlICAsIDEpCisJIHx8IHJkdmFsKHByb2NfbWVtaW5mby5maWxlLCAiQnVmZmVyczoiLCAmbV9idWZzICAsIDEpCisJIHx8IHJkdmFsKHByb2NfbWVtaW5mby5maWxlLCAiQ2FjaGVkOiIsICAmbV9jYWNoZWQsIDEpCisJIHx8IHJkdmFsKHByb2NfbWVtaW5mby5maWxlLCAiU2xhYjoiLCAgICAmbV9zbGFiICAsIDEpCisJKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKworCW1fZnJlZSArPSBtX2J1ZnMgKyBtX2NhY2hlZCArIG1fc2xhYjsKKwlzd2l0Y2ggKHMtPm9wdCkgeworCWNhc2UgJ2YnOgorCQlzY2FsZShtX2ZyZWUgPDwgMTApOyBicmVhazsKKwlkZWZhdWx0OgorCQlzY2FsZSgobV90b3RhbCAtIG1fZnJlZSkgPDwgMTApOyBicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfbWVtKGNvbnN0IGNoYXIgKnBhcmFtKQoreworCW1lbV9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9tZW07CisJcy0+b3B0ID0gcGFyYW1bMF07CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKHN3cF9zdGF0KQorU19TVEFUX0VORChzd3Bfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3Rfc3dwKHN3cF9zdGF0ICpzIFVOVVNFRF9QQVJBTSkKK3sKKwl1bGxvbmcgc190b3RhbFsxXTsKKwl1bGxvbmcgc19mcmVlWzFdOworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19tZW1pbmZvKSwgIlN3YXBUb3RhbDoiLCBzX3RvdGFsLCAxKQorCSB8fCByZHZhbChwcm9jX21lbWluZm8uZmlsZSwgICAgICAgIlN3YXBGcmVlOiIgLCBzX2ZyZWUsICAxKQorCSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisJc2NhbGUoKHNfdG90YWxbMF0tc19mcmVlWzBdKSA8PCAxMCk7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfc3dwKGNvbnN0IGNoYXIgKnBhcmFtIFVOVVNFRF9QQVJBTSkKK3sKKwlzd3Bfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3Rfc3dwOworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChmZF9zdGF0KQorU19TVEFUX0VORChmZF9zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9mZChmZF9zdGF0ICpzIFVOVVNFRF9QQVJBTSkKK3sKKwl1bGxvbmcgZGF0YVsyXTsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19zeXNfZnNfZmlsZW5yKSwgIiIsIGRhdGEsIDEsIDIpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKworCXNjYWxlKGRhdGFbMF0gLSBkYXRhWzFdKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9mZChjb25zdCBjaGFyICpwYXJhbSBVTlVTRURfUEFSQU0pCit7CisJZmRfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfZmQ7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKHRpbWVfc3RhdCkKKwlpbnQgcHJlYzsKKwlpbnQgc2NhbGU7CitTX1NUQVRfRU5EKHRpbWVfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfdGltZSh0aW1lX3N0YXQgKnMpCit7CisJY2hhciBidWZbc2l6ZW9mKCIxMjozNDo1Ni4xMjM0NTYiKV07CisJc3RydWN0IHRtKiB0bTsKKwlpbnQgdXMgPSB0di50dl91c2VjICsgcy0+c2NhbGUvMjsKKwl0aW1lX3QgdCA9IHR2LnR2X3NlYzsKKworCWlmICh1cyA+PSAxMDAwMDAwKSB7CisJCXQrKzsKKwkJdXMgLT0gMTAwMDAwMDsKKwl9CisJdG0gPSBsb2NhbHRpbWUoJnQpOworCisJc3ByaW50ZihidWYsICIlMDJkOiUwMmQ6JTAyZCIsIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKwlpZiAocy0+cHJlYykKKwkJc3ByaW50ZihidWYrOCwgIi4lMCpkIiwgcy0+cHJlYywgdXMgLyBzLT5zY2FsZSk7CisJcHV0KGJ1Zik7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfdGltZShjb25zdCBjaGFyICpwYXJhbSkKK3sKKwlpbnQgcHJlYzsKKwl0aW1lX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfdGltZTsKKwlwcmVjID0gcGFyYW1bMF0gLSAnMCc7CisJaWYgKHByZWMgPCAwKSBwcmVjID0gMDsKKwllbHNlIGlmIChwcmVjID4gNikgcHJlYyA9IDY7CisJcy0+cHJlYyA9IHByZWM7CisJcy0+c2NhbGUgPSAxOworCXdoaWxlIChwcmVjKysgPCA2KQorCQlzLT5zY2FsZSAqPSAxMDsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfaW5mbyhzX3N0YXQgKnMpCit7CisJZ2VuIF49IDE7CisJd2hpbGUgKHMpIHsKKwkJcHV0KHMtPmxhYmVsKTsKKwkJcy0+Y29sbGVjdChzKTsKKwkJcyA9IHMtPm5leHQ7CisJfQorfQorCisKK3R5cGVkZWYgc19zdGF0KiBpbml0X2Z1bmMoY29uc3QgY2hhciAqcGFyYW0pOworCisvLyBEZXByZWNhdGVkICVOTk5kIGlzIHRvIGJlIHJlbW92ZWQsIC1kIE1TRUMgc3VwZXJzZWRlcyBpdAorc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uc1tdIEFMSUdOMSA9ICJuY21zZml4cHRiZHIiOworc3RhdGljIGluaXRfZnVuYyAqY29uc3QgaW5pdF9mdW5jdGlvbnNbXSA9IHsKKwlpbml0X2lmLAorCWluaXRfY3B1LAorCWluaXRfbWVtLAorCWluaXRfc3dwLAorCWluaXRfZmQsCisJaW5pdF9pbnQsCisJaW5pdF9jdHgsCisJaW5pdF9mb3JrLAorCWluaXRfdGltZSwKKwlpbml0X2JsaywKKwlpbml0X2RlbGF5LAorCWluaXRfY3IKK307CisKK2ludCBubWV0ZXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5tZXRlcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciBidWZbMzJdOworCXNfc3RhdCAqZmlyc3QgPSBOVUxMOworCXNfc3RhdCAqbGFzdCA9IE5VTEw7CisJc19zdGF0ICpzOworCWNoYXIgKm9wdF9kOworCWNoYXIgKmN1ciwgKnByZXY7CisKKwlJTklUX0coKTsKKworCXhjaGRpcigiL3Byb2MiKTsKKworCWlmIChvcGVuX3JlYWRfY2xvc2UoInZlcnNpb24iLCBidWYsIHNpemVvZihidWYpLTEpID4gMCkgeworCQlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCQlpczI2ID0gKHN0cnN0cihidWYsICIgMi40LiIpID09IE5VTEwpOworCX0KKworCWlmIChnZXRvcHQzMihhcmd2LCAiZDoiLCAmb3B0X2QpKQorCQlpbml0X2RlbGF5KG9wdF9kKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghYXJndlswXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLy8gQ2FuIHVzZSBhcmd2WzBdIGRpcmVjdGx5LCBidXQgdGhpcyB3aWxsIG1lc3MgdXAKKwkvLyBwYXJhbWV0ZXJzIGFzIHNlZW4gYnkgZS5nLiBwcy4gTWFraW5nIGEgY29weS4uLgorCWN1ciA9IHhzdHJkdXAoYXJndlswXSk7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqcGFyYW0sICpwOworCQlwcmV2ID0gY3VyOworIGFnYWluOgorCQljdXIgPSBzdHJjaHIoY3VyLCAnJScpOworCQlpZiAoIWN1cikKKwkJCWJyZWFrOworCQlpZiAoY3VyWzFdID09ICclJykgewkvLyAlJQorCQkJb3ZlcmxhcHBpbmdfc3RyY3B5KGN1ciwgY3VyICsgMSk7CisJCQljdXIrKzsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJKmN1cisrID0gJ1wwJzsJCS8vIG92ZXJ3cml0ZSAlCisJCWlmIChjdXJbMF0gPT0gJ1snKSB7CisJCQkvLyBmb3JtYXQ6ICVbZm9wdHN0cmluZ10KKwkJCWN1cisrOworCQkJcCA9IHN0cmNocihvcHRpb25zLCBjdXJbMF0pOworCQkJcGFyYW0gPSBjdXIrMTsKKwkJCXdoaWxlIChjdXJbMF0gIT0gJ10nKSB7CisJCQkJaWYgKCFjdXJbMF0pCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQljdXIrKzsKKwkJCX0KKwkJCSpjdXIrKyA9ICdcMCc7CS8vIG92ZXJ3cml0ZSBbCisJCX0gZWxzZSB7CisJCQkvLyBmb3JtYXQ6ICVOTk5OTk5mCisJCQlwYXJhbSA9IGN1cjsKKwkJCXdoaWxlIChjdXJbMF0gPj0gJzAnICYmIGN1clswXSA8PSAnOScpCisJCQkJY3VyKys7CisJCQlpZiAoIWN1clswXSkKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlwID0gc3RyY2hyKG9wdGlvbnMsIGN1clswXSk7CisJCQkqY3VyKysgPSAnXDAnOwkvLyBvdmVyd3JpdGUgZm9ybWF0IGNoYXIKKwkJfQorCQlpZiAoIXApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCXMgPSBpbml0X2Z1bmN0aW9uc1twLW9wdGlvbnNdKHBhcmFtKTsKKwkJaWYgKHMpIHsKKwkJCXMtPmxhYmVsID0gcHJldjsKKwkJCS8qcy0+bmV4dCA9IE5VTEw7IC0gYWxsIGluaXRYWFggZnVuY3MgdXNlIHh6YWxsb2MgKi8KKwkJCWlmICghZmlyc3QpCisJCQkJZmlyc3QgPSBzOworCQkJZWxzZQorCQkJCWxhc3QtPm5leHQgPSBzOworCQkJbGFzdCA9IHM7CisJCX0gZWxzZSB7CisJCQkvLyAlTk5OTmQgb3IgJXIgb3B0aW9uLiByZW1vdmUgaXQgZnJvbSBzdHJpbmcKKwkJCXN0cmNweShwcmV2ICsgc3RybGVuKHByZXYpLCBjdXIpOworCQkJY3VyID0gcHJldjsKKwkJfQorCX0KKwlpZiAocHJldlswXSkgeworCQlzID0gaW5pdF9saXRlcmFsKCk7CisJCXMtPmxhYmVsID0gcHJldjsKKwkJLypzLT5uZXh0ID0gTlVMTDsgLSBhbGwgaW5pdFhYWCBmdW5jcyB1c2UgeHphbGxvYyAqLworCQlpZiAoIWZpcnN0KQorCQkJZmlyc3QgPSBzOworCQllbHNlCisJCQlsYXN0LT5uZXh0ID0gczsKKwkJbGFzdCA9IHM7CisJfQorCisJLy8gR2VuZXJhdGUgZmlyc3Qgc2FtcGxlcyBidXQgZG8gbm90IHByaW50IHRoZW0sIHRoZXkncmUgYm9ndXMKKwljb2xsZWN0X2luZm8oZmlyc3QpOworCXJlc2V0X291dGJ1ZigpOworCWlmIChkZWx0YSA+PSAwKSB7CisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQl1c2xlZXAoZGVsdGEgPiAxMDAwMDAwID8gMTAwMDAwMCA6IGRlbHRhIC0gdHYudHZfdXNlYyVkZWx0YW56KTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJY29sbGVjdF9pbmZvKGZpcnN0KTsKKwkJcHV0KGZpbmFsX3N0cik7CisJCXByaW50X291dGJ1ZigpOworCisJCS8vIE5lZ2F0aXZlIGRlbHRhIC0+IG5vIHVzbGVlcCBhdCBhbGwKKwkJLy8gVGhpcyB3aWxsIGhvZyB0aGUgQ1BVIGJ1dCB5b3UgY2FuIGhhdmUgUkVBTExZIEdPT0QKKwkJLy8gdGltZSByZXNvbHV0aW9uIDspCisJCS8vIFRPRE86IGRldGVjdCBhbmQgYXZvaWQgdXNlbGVzcyB1cGRhdGVzCisJCS8vIChsaWtlOiBub3RoaW5nIGhhcHBlbnMgZXhjZXB0IHRpbWUpCisJCWlmIChkZWx0YSA+PSAwKSB7CisJCQlpbnQgcmVtOworCQkJLy8gY2FuIGJlIGNvbW1lbnRlZCBvdXQsIHdpbGwgc2FjcmlmaWNlIHNsZWVwIHRpbWUgcHJlY2lzaW9uIGEgYml0CisJCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJCWlmIChuZWVkX3NlY29uZHMpCisJCQkJcmVtID0gZGVsdGEgLSAoKHVsbG9uZyl0di50dl9zZWMqMTAwMDAwMCArIHR2LnR2X3VzZWMpICUgZGVsdGFuejsKKwkJCWVsc2UKKwkJCQlyZW0gPSBkZWx0YSAtIHR2LnR2X3VzZWMlZGVsdGFuejsKKwkJCS8vIFNvbWV0aW1lcyBrZXJuZWwgd2FrZXMgdXMgdXAganVzdCBhIHRpbnkgYml0IGVhcmxpZXIgdGhhbiBhc2tlZAorCQkJLy8gRG8gbm90IGdvIHRvIHZlcnkgc2hvcnQgc2xlZXAgaW4gdGhpcyBjYXNlCisJCQlpZiAocmVtIDwgZGVsdGEvMTI4KSB7CisJCQkJcmVtICs9IGRlbHRhOworCQkJfQorCQkJdXNsZWVwKHJlbSk7CisJCX0KKwl9CisKKwkvKnJldHVybiAwOyovCit9CmRpZmYgLS1naXQgYS9wcm9jcHMvcGdyZXAuYyBiL3Byb2Nwcy9wZ3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2ZmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvcGdyZXAuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBwZ3JlcC9wa2lsbCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBMb2ljIEdyZW5pZSA8bG9pYy5ncmVuaWVAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHBncmVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWZsbm92eF0gWy1zIFNJRHwtUCBQUElEfFBBVFRFUk5dIgorLy91c2FnZTojZGVmaW5lIHBncmVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBwcm9jZXNzKGVzKSBzZWxlY3RlZCBieSByZWdleCBQQVRURVJOXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCVNob3cgY29tbWFuZCBuYW1lIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJTWF0Y2ggYWdhaW5zdCBlbnRpcmUgY29tbWFuZCBsaW5lIgorLy91c2FnZTogICAgICJcbgktbglTaG93IHRoZSBuZXdlc3QgcHJvY2VzcyBvbmx5IgorLy91c2FnZTogICAgICJcbgktbwlTaG93IHRoZSBvbGRlc3QgcHJvY2VzcyBvbmx5IgorLy91c2FnZTogICAgICJcbgktdglOZWdhdGUgdGhlIG1hdGNoIgorLy91c2FnZTogICAgICJcbgkteAlNYXRjaCB3aG9sZSBuYW1lIChub3Qgc3Vic3RyaW5nKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTWF0Y2ggc2Vzc2lvbiBJRCAoMCBmb3IgY3VycmVudCkiCisvL3VzYWdlOiAgICAgIlxuCS1QCU1hdGNoIHBhcmVudCBwcm9jZXNzIElEIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwa2lsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1sfC1TSUdOQUxdIFstZm5vdnhdIFstcyBTSUR8LVAgUFBJRHxQQVRURVJOXSIKKy8vdXNhZ2U6I2RlZmluZSBwa2lsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgYSBzaWduYWwgdG8gcHJvY2Vzcyhlcykgc2VsZWN0ZWQgYnkgcmVnZXggUEFUVEVSTlxuIgorLy91c2FnZTogICAgICJcbgktbAlMaXN0IGFsbCBzaWduYWxzIgorLy91c2FnZTogICAgICJcbgktZglNYXRjaCBhZ2FpbnN0IGVudGlyZSBjb21tYW5kIGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1uCVNpZ25hbCB0aGUgbmV3ZXN0IHByb2Nlc3Mgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JU2lnbmFsIHRoZSBvbGRlc3QgcHJvY2VzcyBvbmx5IgorLy91c2FnZTogICAgICJcbgktdglOZWdhdGUgdGhlIG1hdGNoIgorLy91c2FnZTogICAgICJcbgkteAlNYXRjaCB3aG9sZSBuYW1lIChub3Qgc3Vic3RyaW5nKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTWF0Y2ggc2Vzc2lvbiBJRCAoMCBmb3IgY3VycmVudCkiCisvL3VzYWdlOiAgICAgIlxuCS1QCU1hdGNoIHBhcmVudCBwcm9jZXNzIElEIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworLyogSWRlYSB0YWtlbiBmcm9tIGtpbGwuYyAqLworI2RlZmluZSBwZ3JlcCAoRU5BQkxFX1BHUkVQICYmIGFwcGxldF9uYW1lWzFdID09ICdnJykKKyNkZWZpbmUgcGtpbGwgKEVOQUJMRV9QS0lMTCAmJiBhcHBsZXRfbmFtZVsxXSA9PSAnaycpCisKK2VudW0geworCS8qICJ2bGZ4b25zOlA6IiAqLworCU9QVEJJVF9WID0gMCwgLyogbXVzdCBiZSBmaXJzdCwgd2UgbmVlZCBPUFRfSU5WRVJUID0gMC8xICovCisJT1BUQklUX0wsCisJT1BUQklUX0YsCisJT1BUQklUX1gsCisJT1BUQklUX08sCisJT1BUQklUX04sCisJT1BUQklUX1MsCisJT1BUQklUX1AsCit9OworCisjZGVmaW5lIE9QVF9JTlZFUlQJKG9wdCAmICgxIDw8IE9QVEJJVF9WKSkKKyNkZWZpbmUgT1BUX0xJU1QJKG9wdCAmICgxIDw8IE9QVEJJVF9MKSkKKyNkZWZpbmUgT1BUX0ZVTEwJKG9wdCAmICgxIDw8IE9QVEJJVF9GKSkKKyNkZWZpbmUgT1BUX0FOQ0hPUgkob3B0ICYgKDEgPDwgT1BUQklUX1gpKQorI2RlZmluZSBPUFRfRklSU1QJKG9wdCAmICgxIDw8IE9QVEJJVF9PKSkKKyNkZWZpbmUgT1BUX0xBU1QJKG9wdCAmICgxIDw8IE9QVEJJVF9OKSkKKyNkZWZpbmUgT1BUX1NJRAkJKG9wdCAmICgxIDw8IE9QVEJJVF9TKSkKKyNkZWZpbmUgT1BUX1BQSUQJKG9wdCAmICgxIDw8IE9QVEJJVF9QKSkKKworc3RhdGljIHZvaWQgYWN0KHVuc2lnbmVkIHBpZCwgY2hhciAqY21kLCBpbnQgc2lnbm8pCit7CisJaWYgKHBncmVwKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgKDEgPDwgT1BUQklUX0wpKSAvKiBPUFRfTElTVCAqLworCQkJcHJpbnRmKCIlZCAlc1xuIiwgcGlkLCBjbWQpOworCQllbHNlCisJCQlwcmludGYoIiVkXG4iLCBwaWQpOworCX0gZWxzZQorCQlraWxsKHBpZCwgc2lnbm8pOworfQorCitpbnQgcGdyZXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBncmVwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBwaWQ7CisJaW50IHNpZ25vOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgc2Nhbl9tYXNrOworCWludCBtYXRjaGVkX3BpZDsKKwlpbnQgc2lkMm1hdGNoLCBwcGlkMm1hdGNoOworCWNoYXIgKmNtZF9sYXN0OworCXByb2Nwc19zdGF0dXNfdCAqcHJvYzsKKwkvKiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgdG8gMCAqLworCXN0cnVjdCB7CisJCXJlZ2V4X3QgcmVfYnVmZmVyOworCQlyZWdtYXRjaF90IHJlX21hdGNoWzFdOworCX0gWjsKKyNkZWZpbmUgcmVfYnVmZmVyIChaLnJlX2J1ZmZlcikKKyNkZWZpbmUgcmVfbWF0Y2ggIChaLnJlX21hdGNoICkKKworCW1lbXNldCgmWiwgMCwgc2l6ZW9mKFopKTsKKworCS8qIFBhcnNlIC1TSUdOQUwgZm9yIHBraWxsLiBNdXN0IGJlIGZpcnN0IG9wdGlvbiwgaWYgcHJlc2VudCAqLworCXNpZ25vID0gU0lHVEVSTTsKKwlpZiAocGtpbGwgJiYgYXJndlsxXSAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlpbnQgdGVtcCA9IGdldF9zaWdudW0oYXJndlsxXSsxKTsKKwkJaWYgKHRlbXAgIT0gLTEpIHsKKwkJCXNpZ25vID0gdGVtcDsKKwkJCWFyZ3YrKzsKKwkJfQorCX0KKworCS8qIFBhcnNlIHJlbWFpbmluZyBvcHRpb25zICovCisJcHBpZDJtYXRjaCA9IC0xOworCXNpZDJtYXRjaCA9IC0xOworCW9wdF9jb21wbGVtZW50YXJ5ID0gInMrOlArIjsgLyogbnVtZXJpYyBvcHRzICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInZsZnhvbnM6UDoiLCAmc2lkMm1hdGNoLCAmcHBpZDJtYXRjaCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAocGtpbGwgJiYgT1BUX0xJU1QpIHsgLyogLWw6IHByaW50IHRoZSB3aG9sZSBzaWduYWwgbGlzdCAqLworCQlwcmludF9zaWduYW1lcygpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwaWQgPSBnZXRwaWQoKTsKKwlpZiAoc2lkMm1hdGNoID09IDApCisJCXNpZDJtYXRjaCA9IGdldHNpZChwaWQpOworCisJc2Nhbl9tYXNrID0gUFNTQ0FOX0NPTU0gfCBQU1NDQU5fQVJHVjA7CisJaWYgKE9QVF9GVUxMKQorCQlzY2FuX21hc2sgfD0gUFNTQ0FOX0FSR1ZOOworCisJLyogT25lIHBhdHRlcm4gaXMgcmVxdWlyZWQsIGlmIG5vIC1zIGFuZCBubyAtUCAqLworCWlmICgoc2lkMm1hdGNoICYgcHBpZDJtYXRjaCkgPCAwICYmICghYXJndlswXSB8fCBhcmd2WzFdKSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKGFyZ3ZbMF0pCisJCXhyZWdjb21wKCZyZV9idWZmZXIsIGFyZ3ZbMF0sIFJFR19FWFRFTkRFRCB8IFJFR19OT1NVQik7CisKKwltYXRjaGVkX3BpZCA9IDA7CisJY21kX2xhc3QgPSBOVUxMOworCXByb2MgPSBOVUxMOworCXdoaWxlICgocHJvYyA9IHByb2Nwc19zY2FuKHByb2MsIHNjYW5fbWFzaykpICE9IE5VTEwpIHsKKwkJY2hhciAqY21kOworCisJCWlmIChwcm9jLT5waWQgPT0gcGlkKQorCQkJY29udGludWU7CisKKwkJY21kID0gcHJvYy0+YXJndjA7CisJCWlmICghY21kKSB7CisJCQljbWQgPSBwcm9jLT5jb21tOworCQl9IGVsc2UgeworCQkJaW50IGkgPSBwcm9jLT5hcmd2X2xlbjsKKwkJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJCWlmICgodW5zaWduZWQgY2hhciljbWRbaV0gPCAnICcpCisJCQkJCWNtZFtpXSA9ICcgJzsKKwkJCX0KKwkJfQorCisJCWlmIChwcGlkMm1hdGNoID49IDAgJiYgcHBpZDJtYXRjaCAhPSBwcm9jLT5wcGlkKQorCQkJY29udGludWU7CisJCWlmIChzaWQybWF0Y2ggPj0gMCAgJiYgc2lkMm1hdGNoICE9IHByb2MtPnNpZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIE5COiBPUFRfSU5WRVJUIGlzIGFsd2F5cyAwIG9yIDEgKi8KKwkJaWYgKCFhcmd2WzBdCisJCSB8fCAocmVnZXhlYygmcmVfYnVmZmVyLCBjbWQsIDEsIHJlX21hdGNoLCAwKSA9PSAwIC8qIG1hdGNoIGZvdW5kICovCisJCSAgICAmJiAoIU9QVF9BTkNIT1IgfHwgKHJlX21hdGNoWzBdLnJtX3NvID09IDAgJiYgcmVfbWF0Y2hbMF0ucm1fZW8gPT0gKHJlZ29mZl90KXN0cmxlbihjbWQpKSkKKwkJICAgICkgXiBPUFRfSU5WRVJUCisJCSkgeworCQkJbWF0Y2hlZF9waWQgPSBwcm9jLT5waWQ7CisJCQlpZiAoT1BUX0xBU1QpIHsKKwkJCQlmcmVlKGNtZF9sYXN0KTsKKwkJCQljbWRfbGFzdCA9IHhzdHJkdXAoY21kKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFjdChwcm9jLT5waWQsIGNtZCwgc2lnbm8pOworCQkJaWYgKE9QVF9GSVJTVCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChjbWRfbGFzdCkgeworCQlhY3QobWF0Y2hlZF9waWQsIGNtZF9sYXN0LCBzaWdubyk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoY21kX2xhc3QpOworCX0KKwlyZXR1cm4gbWF0Y2hlZF9waWQgPT0gMDsgLyogcmV0dXJuIDEgaWYgbm8gcHJvY2Vzc2VzIGxpc3RlZC9zaWduYWxlZCAqLworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL3BpZG9mLmMgYi9wcm9jcHMvcGlkb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdiNTkxCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BpZG9mLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBpZG9mIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojaWYgKEVOQUJMRV9GRUFUVVJFX1BJRE9GX1NJTkdMRSB8fCBFTkFCTEVfRkVBVFVSRV9QSURPRl9PTUlUKQorLy91c2FnZTojZGVmaW5lIHBpZG9mX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW05BTUVdLi4uIgorLy91c2FnZTojZGVmaW5lIFVTQUdFX1BJRE9GICJcbiIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6I2RlZmluZSBwaWRvZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW05BTUVdLi4uIgorLy91c2FnZTojZGVmaW5lIFVTQUdFX1BJRE9GIC8qIG5vbmUgKi8KKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOiNkZWZpbmUgcGlkb2ZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IFBJRHMgb2YgYWxsIHByb2Nlc3NlcyB3aXRoIG5hbWVzIHRoYXQgbWF0Y2ggTkFNRXMiCisvL3VzYWdlOglVU0FHRV9QSURPRgorLy91c2FnZToJSUZfRkVBVFVSRV9QSURPRl9TSU5HTEUoCisvL3VzYWdlOiAgICAgIlxuCS1zCVNob3cgb25seSBvbmUgUElEIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9QSURPRl9PTUlUKAorLy91c2FnZTogICAgICJcbgktbyBQSUQJT21pdCBnaXZlbiBwaWQiCisvL3VzYWdlOiAgICAgIlxuCQlVc2UgJVBQSUQgdG8gb21pdCBwaWQgb2YgcGlkb2YncyBwYXJlbnQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBpZG9mX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHBpZG9mIGluaXRcbiIKKy8vdXNhZ2U6ICAgICAgICIxXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1BJRE9GX09NSVQoCisvL3VzYWdlOiAgICAgICAiJCBwaWRvZiAvYmluL3NoXG4yMDM1MSA1OTczIDU5NTBcbiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1BJRE9GX09NSVQoCisvL3VzYWdlOiAgICAgICAiJCBwaWRvZiAvYmluL3NoIC1vICVQUElEXG4yMDM1MSA1OTUwIikKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCUlGX0ZFQVRVUkVfUElET0ZfU0lOR0xFKE9QVEJJVF9TSU5HTEUsKQorCUlGX0ZFQVRVUkVfUElET0ZfT01JVCggIE9QVEJJVF9PTUlUICAsKQorCU9QVF9TSU5HTEUgPSBJRl9GRUFUVVJFX1BJRE9GX1NJTkdMRSgoMTw8T1BUQklUX1NJTkdMRSkpICsgMCwKKwlPUFRfT01JVCAgID0gSUZfRkVBVFVSRV9QSURPRl9PTUlUKCAgKDE8PE9QVEJJVF9PTUlUICApKSArIDAsCit9OworCitpbnQgcGlkb2ZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBpZG9mX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBmaXJzdCA9IDE7CisJdW5zaWduZWQgb3B0OworI2lmIEVOQUJMRV9GRUFUVVJFX1BJRE9GX09NSVQKKwlsbGlzdF90ICpvbWl0cyA9IE5VTEw7IC8qIGxpc3Qgb2YgcGlkcyB0byBvbWl0ICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibzo6IjsKKyNlbmRpZgorCisJLyogZG8gdW5jb25kaXRpb25hbCBvcHRpb24gcGFyc2luZyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIiCisJCQlJRl9GRUFUVVJFX1BJRE9GX1NJTkdMRSAoInMiKQorCQkJSUZfRkVBVFVSRV9QSURPRl9PTUlUKCJvOiIsICZvbWl0cykpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElET0ZfT01JVAorCS8qIGZpbGwgb21pdCBsaXN0LiAgKi8KKwl7CisJCWxsaXN0X3QgKm9taXRzX3AgPSBvbWl0czsKKwkJd2hpbGUgKDEpIHsKKwkJCW9taXRzX3AgPSBsbGlzdF9maW5kX3N0cihvbWl0c19wLCAiJVBQSUQiKTsKKwkJCWlmICghb21pdHNfcCkKKwkJCQlicmVhazsKKwkJCS8qIGFyZSB3ZSBhc2tlZCB0byBleGNsdWRlIHRoZSBwYXJlbnQncyBwcm9jZXNzIElEPyAgKi8KKwkJCW9taXRzX3AtPmRhdGEgPSB1dG9hKCh1bnNpZ25lZClnZXRwcGlkKCkpOworCQl9CisJfQorI2VuZGlmCisJLyogTG9va3MgbGlrZSBldmVyeXRoaW5nIGlzIHNldCB0byBnby4gICovCisJYXJndiArPSBvcHRpbmQ7CisJd2hpbGUgKCphcmd2KSB7CisJCXBpZF90ICpwaWRMaXN0OworCQlwaWRfdCAqcGw7CisKKwkJLyogcmV2ZXJzZSB0aGUgcGlkbGlzdCBsaWtlIEdOVSBwaWRvZiBkb2VzLiAgKi8KKwkJcGlkTGlzdCA9IHBpZGxpc3RfcmV2ZXJzZShmaW5kX3BpZF9ieV9uYW1lKCphcmd2KSk7CisJCWZvciAocGwgPSBwaWRMaXN0OyAqcGw7IHBsKyspIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURPRl9PTUlUCisJCQlpZiAob3B0ICYgT1BUX09NSVQpIHsKKwkJCQlsbGlzdF90ICpvbWl0c19wID0gb21pdHM7CisJCQkJd2hpbGUgKG9taXRzX3ApIHsKKwkJCQkJaWYgKHhhdG91bChvbWl0c19wLT5kYXRhKSA9PSAodW5zaWduZWQgbG9uZykoKnBsKSkgeworCQkJCQkJZ290byBvbWl0dGluZzsKKwkJCQkJfQorCQkJCQlvbWl0c19wID0gb21pdHNfcC0+bGluazsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCXByaW50ZigiICV1IiArIGZpcnN0LCAodW5zaWduZWQpKnBsKTsKKwkJCWZpcnN0ID0gMDsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9QSURPRl9TSU5HTEUgJiYgKG9wdCAmIE9QVF9TSU5HTEUpKQorCQkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1BJRE9GX09NSVQKKyBvbWl0dGluZzogOworI2VuZGlmCisJCX0KKwkJZnJlZShwaWRMaXN0KTsKKwkJYXJndisrOworCX0KKwlpZiAoIWZpcnN0KQorCQliYl9wdXRjaGFyKCdcbicpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElET0ZfT01JVAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJbGxpc3RfZnJlZShvbWl0cywgTlVMTCk7CisjZW5kaWYKKwlyZXR1cm4gZmlyc3Q7IC8qIDEgKGZhaWx1cmUpIC0gbm8gcHJvY2Vzc2VzIGZvdW5kICovCit9CmRpZmYgLS1naXQgYS9wcm9jcHMvcG1hcC5jIGIvcHJvY3BzL3BtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDk5NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BtYXAuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIHBtYXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IEFsZXhhbmRlciBTaGlzaGtpbiA8dmlydHVvc29Ac2xpbmQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGlzIHNvdXJjZSB0cmVlCisgKiBmb3IgZGV0YWlscy4KKyAqLworCisvL2NvbmZpZzpjb25maWcgUE1BUAorLy9jb25maWc6ICAgICAgIGJvb2wgInBtYXAiCisvL2NvbmZpZzogICAgICAgZGVmYXVsdCB5CisvL2NvbmZpZzogICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICAgRGlzcGxheSBwcm9jZXNzZXMnIG1lbW9yeSBtYXBwaW5ncy4KKworLy9hcHBsZXQ6SUZfUE1BUChBUFBMRVQocG1hcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfUE1BUCkgKz0gcG1hcC5vCisKKy8vdXNhZ2U6I2RlZmluZSBwbWFwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXhxXSBQSUQiCisvL3VzYWdlOiNkZWZpbmUgcG1hcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgZGV0YWlsZWQgcHJvY2VzcyBtZW1vcnkgdXNhZ2UiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgkteAlTaG93IGRldGFpbHMiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIFVMT05HX01BWCA9PSAweGZmZmZmZmZmCisjIGRlZmluZSBUQUJTICJcdCIKKyMgZGVmaW5lIEFGTVQgIjgiCisjIGRlZmluZSBEQVNIRVMgIiIKKyNlbHNlCisjIGRlZmluZSBUQUJTICJcdFx0IgorIyBkZWZpbmUgQUZNVCAiMTYiCisjIGRlZmluZSBEQVNIRVMgIi0tLS0tLS0tIgorI2VuZGlmCisKK2VudW0geworCU9QVF94ID0gMSA8PCAwLAorCU9QVF9xID0gMSA8PCAxLAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfc21hcHJlYyhzdHJ1Y3Qgc21hcHJlYyAqY3VycmVjLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIG9wdCA9ICh1aW50cHRyX3QpZGF0YTsKKworCXByaW50ZigiJTAiIEFGTVQgImx4ICIsIGN1cnJlYy0+c21hcF9zdGFydCk7CisKKwlpZiAob3B0ICYgT1BUX3gpCisJCXByaW50ZigiJTdsdSAlN2x1ICU3bHUgJTdsdSAiLAorCQkJY3VycmVjLT5zbWFwX3NpemUsCisJCQljdXJyZWMtPnNtYXBfcHNzLAorCQkJY3VycmVjLT5wcml2YXRlX2RpcnR5LAorCQkJY3VycmVjLT5zbWFwX3N3YXApOworCWVsc2UKKwkJcHJpbnRmKCIlN2x1SyIsIGN1cnJlYy0+c21hcF9zaXplKTsKKworCXByaW50ZigiICUuNHMgICVzXG4iLCBjdXJyZWMtPnNtYXBfbW9kZSwgY3VycmVjLT5zbWFwX25hbWUpOworfQorCitzdGF0aWMgaW50IHByb2Nwc19nZXRfbWFwcyhwaWRfdCBwaWQsIHVuc2lnbmVkIG9wdCkKK3sKKwlzdHJ1Y3Qgc21hcHJlYyB0b3RhbDsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzI1Nl07CisKKwlyZWFkX2NtZGxpbmUoYnVmLCBzaXplb2YoYnVmKSwgcGlkLCAibm8gc3VjaCBwcm9jZXNzIik7CisJcHJpbnRmKCIldTogJXNcbiIsIChpbnQpcGlkLCBidWYpOworCisJaWYgKCEob3B0ICYgT1BUX3EpICYmIChvcHQgJiBPUFRfeCkpCisJCXB1dHMoIkFkZHJlc3MiIFRBQlMgIiAgS2J5dGVzICAgICBQU1MgICBEaXJ0eSAgICBTd2FwICBNb2RlICBNYXBwaW5nIik7CisKKwltZW1zZXQoJnRvdGFsLCAwLCBzaXplb2YodG90YWwpKTsKKworCXJldCA9IHByb2Nwc19yZWFkX3NtYXBzKHBpZCwgJnRvdGFsLCBwcmludF9zbWFwcmVjLCAodm9pZCopKHVpbnRwdHJfdClvcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIShvcHQgJiBPUFRfcSkpIHsKKwkJaWYgKG9wdCAmIE9QVF94KQorCQkJcHJpbnRmKCItLS0tLS0tLSIgREFTSEVTICIgIC0tLS0tLSAgLS0tLS0tICAtLS0tLS0gIC0tLS0tLVxuIgorCQkJCSJ0b3RhbCIgVEFCUyAiICU3bHUgJTdsdSAlN2x1ICU3bHVcbiIsCisJCQkJdG90YWwuc21hcF9zaXplLCB0b3RhbC5zbWFwX3BzcywgdG90YWwucHJpdmF0ZV9kaXJ0eSwgdG90YWwuc21hcF9zd2FwKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJtYXBwZWQ6ICVsdUtcbiIsIHRvdGFsLnNtYXBfc2l6ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwbWFwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwbWFwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWludCByZXQ7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInhxIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXQgPSAwOworCXdoaWxlICgqYXJndikgeworCQlwaWRfdCBwaWQgPSB4YXRvaV9wb3NpdGl2ZSgqYXJndisrKTsKKwkJLyogR05VIHBtYXAgcmV0dXJucyA0MiBpZiBhbnkgb2YgdGhlIHBpZHMgZmFpbGVkICovCisJCWlmIChwcm9jcHNfZ2V0X21hcHMocGlkLCBvcHRzKSAhPSAwKQorCQkJcmV0ID0gNDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9wb3dlcnRvcC5jIGIvcHJvY3BzL3Bvd2VydG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4Y2RmYwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9wb3dlcnRvcC5jCkBAIC0wLDAgKzEsODU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBIG1pbmkgJ3Bvd2VydG9wJyB1dGlsaXR5OgorICogICBBbmFseXplIHBvd2VyIGNvbnN1bXB0aW9uIG9uIEludGVsLWJhc2VkIGxhcHRvcHMuCisgKiBCYXNlZCBvbiBwb3dlcnRvcCAxLjExLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJlayBQb2xhY2VrIDxtbXBvbGFjZWtAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfUE9XRVJUT1AoQVBQTEVUKHBvd2VydG9wLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUE9XRVJUT1ApICs9IHBvd2VydG9wLm8KKworLy9jb25maWc6Y29uZmlnIFBPV0VSVE9QCisvL2NvbmZpZzoJYm9vbCAicG93ZXJ0b3AiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQW5hbHl6ZSBwb3dlciBjb25zdW1wdGlvbiBvbiBJbnRlbC1iYXNlZCBsYXB0b3BzCisKKy8vIFhYWCBUaGlzIHNob3VsZCBiZSBjb25maWd1cmFibGUKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUSAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKKy8vI2RlZmluZSBkZWJ1ZyhmbXQsIC4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSAoKHZvaWQpMCkKKworCisjZGVmaW5lIEJMT0FUWV9IUEVUX0lSUV9OVU1fREVURUNUSU9OIDAKKyNkZWZpbmUgTUFYX0NTVEFURV9DT1VOVCAgIDgKKyNkZWZpbmUgSVJRQ09VTlQgICAgICAgICAgIDQwCisKKworI2RlZmluZSBERUZBVUxUX1NMRUVQICAgICAgMTAKKyNkZWZpbmUgREVGQVVMVF9TTEVFUF9TVFIgIjEwIgorCisvKiBGcmVxdWVuY3kgb2YgdGhlIEFDUEkgdGltZXIgKi8KKyNkZWZpbmUgRlJFUV9BQ1BJICAgICAgICAgIDM1NzkuNTQ1CisjZGVmaW5lIEZSRVFfQUNQSV8xMDAwICAgICAzNTc5NTQ1CisKKy8qIE1heCBmaWxlbmFtZSBsZW5ndGggb2YgZW50cnkgaW4gL3N5cy9kZXZpY2VzIHN1YnN5c3RlbSAqLworI2RlZmluZSBCSUdfU1lTTkFNRV9MRU4gICAgMTYKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsb25nOworCitzdHJ1Y3QgbGluZSB7CisJY2hhciAqc3RyaW5nOworCWludCBjb3VudDsKKwkvKmludCBkaXNrX2NvdW50OyovCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUQorc3RydWN0IGlycWRhdGEgeworCXNtYWxsaW50IGFjdGl2ZTsKKwlpbnQgbnVtYmVyOworCXVsbG9uZyBjb3VudDsKKwljaGFyIGlycV9kZXNjWzMyXTsKK307CisjZW5kaWYKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBsaW5lICpsaW5lczsgLyogdGhlIG1vc3Qgb2Z0ZW4gdXNlZCBtZW1iZXIgKi8KKwlpbnQgbGluZXNfY250OworCWludCBsaW5lc19jdW11bGF0aXZlX2NvdW50OworCWludCBtYXhjc3RhdGU7CisJdW5zaWduZWQgdG90YWxfY3B1czsKKwlzbWFsbGludCBjYW50X2VuYWJsZV90aW1lcl9zdGF0czsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRCisjIGlmIEJMT0FUWV9IUEVUX0lSUV9OVU1fREVURUNUSU9OCisJc21hbGxpbnQgc2Nhbm5lZF90aW1lcl9saXN0OworCWludCBwZXJjcHVfaHBldF9zdGFydDsKKwlpbnQgcGVyY3B1X2hwZXRfZW5kOworIyBlbmRpZgorCWludCBpbnRlcnJ1cHRfMDsKKwlpbnQgdG90YWxfaW50ZXJydXB0OworCXN0cnVjdCBpcnFkYXRhIGludGVycnVwdHNbSVJRQ09VTlRdOworI2VuZGlmCisJdWxsb25nIHN0YXJ0X3VzYWdlW01BWF9DU1RBVEVfQ09VTlRdOworCXVsbG9uZyBsYXN0X3VzYWdlW01BWF9DU1RBVEVfQ09VTlRdOworCXVsbG9uZyBzdGFydF9kdXJhdGlvbltNQVhfQ1NUQVRFX0NPVU5UXTsKKwl1bGxvbmcgbGFzdF9kdXJhdGlvbltNQVhfQ1NUQVRFX0NPVU5UXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXN0cnVjdCB0ZXJtaW9zIGluaXRfc2V0dGluZ3M7CisjZW5kaWYKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworc3RhdGljIHZvaWQgcmVzZXRfdGVybSh2b2lkKQoreworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZHLmluaXRfc2V0dGluZ3MpOworfQorCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnbm8gVU5VU0VEX1BBUkFNKQoreworCXJlc2V0X3Rlcm0oKTsKKwlfZXhpdChFWElUX0ZBSUxVUkUpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyX3RvX2ZpbGUoY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlGSUxFICpmcCA9IGZvcGVuX2Zvcl93cml0ZShmbmFtZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuIDE7CisJZnB1dHMoc3RyLCBmcCk7CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworLyogTWFrZSBpdCBtb3JlIHJlYWRhYmxlICovCisjZGVmaW5lIHN0YXJ0X3RpbWVyKCkgd3JpdGVfc3RyX3RvX2ZpbGUoIi9wcm9jL3RpbWVyX3N0YXRzIiwgIjFcbiIpCisjZGVmaW5lIHN0b3BfdGltZXIoKSAgd3JpdGVfc3RyX3RvX2ZpbGUoIi9wcm9jL3RpbWVyX3N0YXRzIiwgIjBcbiIpCisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGNsZWFyX2xpbmVzKHZvaWQpCit7CisJaW50IGk7CisJaWYgKEcubGluZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IEcubGluZXNfY250OyBpKyspCisJCQlmcmVlKEcubGluZXNbaV0uc3RyaW5nKTsKKwkJZnJlZShHLmxpbmVzKTsKKwkJRy5saW5lc19jbnQgPSAwOworCQlHLmxpbmVzID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9saW5lc19jdW11bGF0aXZlX2NvdW50KHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEcubGluZXNfY250OyBpKyspCisJCUcubGluZXNfY3VtdWxhdGl2ZV9jb3VudCArPSBHLmxpbmVzW2ldLmNvdW50OworfQorCitzdGF0aWMgaW50IGxpbmVfY29tcGFyZShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJY29uc3Qgc3RydWN0IGxpbmUgKmEgPSBwMTsKKwljb25zdCBzdHJ1Y3QgbGluZSAqYiA9IHAyOworCXJldHVybiAoYi0+Y291bnQgLyorIDUwICogYi0+ZGlza19jb3VudCovKSAtIChhLT5jb3VudCAvKisgNTAgKiBhLT5kaXNrX2NvdW50Ki8pOworfQorCitzdGF0aWMgdm9pZCBzb3J0X2xpbmVzKHZvaWQpCit7CisJcXNvcnQoRy5saW5lcywgRy5saW5lc19jbnQsIHNpemVvZihHLmxpbmVzWzBdKSwgbGluZV9jb21wYXJlKTsKK30KKworLyogU2F2ZSBDLXN0YXRlIHVzYWdlIGFuZCBkdXJhdGlvbi4gQWxzbyB1cGRhdGUgbWF4Y3N0YXRlLiAqLworc3RhdGljIHZvaWQgcmVhZF9jc3RhdGVfY291bnRzKHVsbG9uZyAqdXNhZ2UsIHVsbG9uZyAqZHVyYXRpb24pCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKworCWRpciA9IG9wZW5kaXIoIi9wcm9jL2FjcGkvcHJvY2Vzc29yIik7CisJaWYgKCFkaXIpCisJCXJldHVybjsKKworCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlGSUxFICpmcDsKKwkJY2hhciBidWZbMTkyXTsKKwkJaW50IGxldmVsOworCQlpbnQgbGVuOworCisJCWxlbiA9IHN0cmxlbihkLT5kX25hbWUpOyAvKiAiQ1BVbm4iICovCisJCWlmIChsZW4gPCAzIHx8IGxlbiA+IEJJR19TWVNOQU1FX0xFTikKKwkJCWNvbnRpbnVlOworCisJCXNwcmludGYoYnVmLCAiJXMvJXMvcG93ZXIiLCAiL3Byb2MvYWNwaS9wcm9jZXNzb3IiLCBkLT5kX25hbWUpOworCQlmcCA9IGZvcGVuX2Zvcl9yZWFkKGJ1Zik7CisJCWlmICghZnApCisJCQljb250aW51ZTsKKworLy8gRXhhbXBsZSBmaWxlIGNvbnRlbnRzOgorLy8gYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIEMwCisvLyBtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQzgKKy8vIG1heGltdW0gYWxsb3dlZCBsYXRlbmN5OiAyMDAwMDAwMDAwIHVzZWMKKy8vIHN0YXRlczoKKy8vICAgICBDMTogICAgICAgICAgICAgICAgICB0eXBlW0MxXSBwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSBsYXRlbmN5WzAwMV0gdXNhZ2VbMDAwMDYxNzNdIGR1cmF0aW9uWzAwMDAwMDAwMDAwMDAwMDAwMDAwXQorLy8gICAgIEMyOiAgICAgICAgICAgICAgICAgIHR5cGVbQzJdIHByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dIGxhdGVuY3lbMDAxXSB1c2FnZVswMDA4NTE5MV0gZHVyYXRpb25bMDAwMDAwMDAwMDAwODMwMjQ5MDddCisvLyAgICAgQzM6ICAgICAgICAgICAgICAgICAgdHlwZVtDM10gcHJvbW90aW9uWy0tXSBkZW1vdGlvblstLV0gbGF0ZW5jeVswMTddIHVzYWdlWzAxMDE3NjIyXSBkdXJhdGlvblswMDAwMDAwMDAxNzkyMTMyNzE4Ml0KKwkJbGV2ZWwgPSAwOworCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCQljaGFyICpwID0gc3Ryc3RyKGJ1ZiwgImFnZVsiKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCXAgKz0gNDsKKwkJCXVzYWdlW2xldmVsXSArPSBiYl9zdHJ0b3VsbChwLCBOVUxMLCAxMCkgKyAxOworCQkJcCA9IHN0cnN0cihidWYsICJhdGlvblsiKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCXAgKz0gNjsKKwkJCWR1cmF0aW9uW2xldmVsXSArPSBiYl9zdHJ0b3VsbChwLCBOVUxMLCAxMCk7CisKKwkJCWlmIChsZXZlbCA+PSBNQVhfQ1NUQVRFX0NPVU5ULTEpCisJCQkJYnJlYWs7CisJCQlsZXZlbCsrOworCQkJaWYgKGxldmVsID4gRy5tYXhjc3RhdGUpICAvKiB1cGRhdGUgbWF4Y3N0YXRlICovCisJCQkJRy5tYXhjc3RhdGUgPSBsZXZlbDsKKwkJfQorCQlmY2xvc2UoZnApOworCX0KKwljbG9zZWRpcihkaXIpOworfQorCisvKiBBZGQgbGluZSBhbmQvb3IgdXBkYXRlIGNvdW50ICovCitzdGF0aWMgdm9pZCBzYXZlX2xpbmUoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEcubGluZXNfY250OyBpKyspIHsKKwkJaWYgKHN0cmNtcChzdHJpbmcsIEcubGluZXNbaV0uc3RyaW5nKSA9PSAwKSB7CisJCQkvKiBJdCdzIGFscmVhZHkgdGhlcmUsIG9ubHkgdXBkYXRlIGNvdW50ICovCisJCQlHLmxpbmVzW2ldLmNvdW50ICs9IGNvdW50OworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogQWRkIG5ldyBsaW5lICovCisJRy5saW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihHLmxpbmVzLCA0LCBHLmxpbmVzX2NudCk7CisJRy5saW5lc1tHLmxpbmVzX2NudF0uc3RyaW5nID0geHN0cmR1cChzdHJpbmcpOworCUcubGluZXNbRy5saW5lc19jbnRdLmNvdW50ID0gY291bnQ7CisJLypHLmxpbmVzW0cubGluZXNfY250XS5kaXNrX2NvdW50ID0gMDsqLworCUcubGluZXNfY250Kys7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRCitzdGF0aWMgaW50IGlzX2hwZXRfaXJxKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqcDsKKyMgaWYgQkxPQVRZX0hQRVRfSVJRX05VTV9ERVRFQ1RJT04KKwlsb25nIGhwZXRfY2hhbjsKKworCS8qIExlYXJuIHRoZSByYW5nZSBvZiBleGlzdGluZyBocGV0IHRpbWVycy4gVGhpcyBpcyBkb25lIG9uY2UgKi8KKwlpZiAoIUcuc2Nhbm5lZF90aW1lcl9saXN0KSB7CisJCUZJTEUgKmZwOworCQljaGFyIGJ1Zls4MF07CisKKwkJRy5zY2FubmVkX3RpbWVyX2xpc3QgPSB0cnVlOworCQlmcCA9IGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy90aW1lcl9saXN0Iik7CisJCWlmICghZnApCisJCQlyZXR1cm4gMDsKKworCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCQlwID0gc3Ryc3RyKGJ1ZiwgIkNsb2NrIEV2ZW50IERldmljZTogaHBldCIpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJcCArPSBzaXplb2YoIkNsb2NrIEV2ZW50IERldmljZTogaHBldCIpLTE7CisJCQlpZiAoIWlzZGlnaXQoKnApKQorCQkJCWNvbnRpbnVlOworCQkJaHBldF9jaGFuID0geGF0b2lfcG9zaXRpdmUocCk7CisJCQlpZiAoaHBldF9jaGFuIDwgRy5wZXJjcHVfaHBldF9zdGFydCkKKwkJCQlHLnBlcmNwdV9ocGV0X3N0YXJ0ID0gaHBldF9jaGFuOworCQkJaWYgKGhwZXRfY2hhbiA+IEcucGVyY3B1X2hwZXRfZW5kKQorCQkJCUcucGVyY3B1X2hwZXRfZW5kID0gaHBldF9jaGFuOworCQl9CisJCWZjbG9zZShmcCk7CisJfQorIyBlbmRpZgorLy9UT0RPOiBvcHRpbWl6ZQorCXAgPSBzdHJzdHIobmFtZSwgImhwZXQiKTsKKwlpZiAoIXApCisJCXJldHVybiAwOworCXAgKz0gNDsKKwlpZiAoIWlzZGlnaXQoKnApKQorCQlyZXR1cm4gMDsKKyMgaWYgQkxPQVRZX0hQRVRfSVJRX05VTV9ERVRFQ1RJT04KKwlocGV0X2NoYW4gPSB4YXRvaV9wb3NpdGl2ZShwKTsKKwlpZiAoaHBldF9jaGFuIDwgRy5wZXJjcHVfaHBldF9zdGFydCB8fCBocGV0X2NoYW4gPiBHLnBlcmNwdV9ocGV0X2VuZCkKKwkJcmV0dXJuIDA7CisjIGVuZGlmCisJcmV0dXJuIDE7Cit9CisKKy8qIFNhdmUgbmV3IElSUSBjb3VudCwgcmV0dXJuIGRlbHRhIGZyb20gb2xkIG9uZSAqLworc3RhdGljIGludCBzYXZlX2lycV9jb3VudChpbnQgaXJxLCB1bGxvbmcgY291bnQpCit7CisJaW50IHVudXNlZCA9IElSUUNPVU5UOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBJUlFDT1VOVDsgaSsrKSB7CisJCWlmIChHLmludGVycnVwdHNbaV0uYWN0aXZlICYmIEcuaW50ZXJydXB0c1tpXS5udW1iZXIgPT0gaXJxKSB7CisJCQl1bGxvbmcgb2xkID0gRy5pbnRlcnJ1cHRzW2ldLmNvdW50OworCQkJRy5pbnRlcnJ1cHRzW2ldLmNvdW50ID0gY291bnQ7CisJCQlyZXR1cm4gY291bnQgLSBvbGQ7CisJCX0KKwkJaWYgKCFHLmludGVycnVwdHNbaV0uYWN0aXZlICYmIHVudXNlZCA+IGkpCisJCQl1bnVzZWQgPSBpOworCX0KKwlpZiAodW51c2VkIDwgSVJRQ09VTlQpIHsKKwkJRy5pbnRlcnJ1cHRzW3VudXNlZF0uYWN0aXZlID0gMTsKKwkJRy5pbnRlcnJ1cHRzW3VudXNlZF0uY291bnQgPSBjb3VudDsKKwkJRy5pbnRlcnJ1cHRzW3VudXNlZF0ubnVtYmVyID0gaXJxOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIFJlYWQgL3Byb2MvaW50ZXJydXB0cywgc2F2ZSBJUlEgY291bnRzIGFuZCBJUlEgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfaXJxX2NvdW50cyh2b2lkKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzEyOF07CisKKwkvKiBSZXNldCB2YWx1ZXMgKi8KKwlHLmludGVycnVwdF8wID0gMDsKKwlHLnRvdGFsX2ludGVycnVwdCA9IDA7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2MvaW50ZXJydXB0cyIpOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJY2hhciBpcnFfZGVzY1tzaXplb2YoIiAgIDxrZXJuZWwgSVBJPiA6ICIpICsgc2l6ZW9mKGJ1ZildOworCQljaGFyICpwOworCQljb25zdCBjaGFyICpuYW1lOworCQlpbnQgbnI7CisJCXVsbG9uZyBjb3VudDsKKwkJdWxsb25nIGRlbHRhOworCisJCXAgPSBzdHJjaHIoYnVmLCAnOicpOworCQlpZiAoIXApCisJCQljb250aW51ZTsKKwkJLyogIDA6ICAxNDM2NDYwNDUgIDE1MzkwMTAwNyAgIElPLUFQSUMtZWRnZSAgICAgIHRpbWVyCisJCSAqICAgXgorCQkgKi8KKwkJKnAgPSAnXDAnOworCQkvKiBEZWFsIHdpdGggbm9uLW1hc2thYmxlIGludGVycnVwdHMgLS0gbWFrZSB1cCBmYWtlIG51bWJlcnMgKi8KKwkJbnIgPSBpbmRleF9pbl9zdHJpbmdzKCJOTUlcMFJFU1wwQ0FMXDBUTEJcMFRSTVwwVEhSXDBTUFVcMCIsIGJ1Zik7CisJCWlmIChuciA+PSAwKSB7CisJCQluciArPSAyMDAwMDsKKwkJfSBlbHNlIHsKKwkJCS8qIGJiX3N0cnRvdSBkb2Vzbid0IGVhdCBsZWFkaW5nIHNwYWNlcywgdXNpbmcgc3RydG91bCAqLworCQkJZXJybm8gPSAwOworCQkJbnIgPSBzdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXArKzsKKwkJLyogIDA6ICAxNDM2NDYwNDUgIDE1MzkwMTAwNyAgIElPLUFQSUMtZWRnZSAgICAgIHRpbWVyCisJCSAqICAgIF4KKwkJICovCisJCS8qIFN1bSBjb3VudHMgZm9yIHRoaXMgSVJRICovCisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWNoYXIgKnRtcDsKKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCk7CisJCQlpZiAoIWlzZGlnaXQoKnApKQorCQkJCWJyZWFrOworCQkJY291bnQgKz0gYmJfc3RydG91bGwocCwgJnRtcCwgMTApOworCQkJcCA9IHRtcDsKKwkJfQorCQkvKiAgIDA6ICAxNDM2NDYwNDUgIDE1MzkwMTAwNyAgIElPLUFQSUMtZWRnZSAgICAgIHRpbWVyCisJCSAqIE5NSTogICAgICAgICAgMSAgICAgICAgICAyICAgTm9uLW1hc2thYmxlIGludGVycnVwdHMKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisJCSAqLworCQlpZiAobnIgPCAyMDAwMCkgeworCQkJLyogU2tpcCB0byB0aGUgaW50ZXJydXB0IG5hbWUsIGUuZy4gJ3RpbWVyJyAqLworCQkJcCA9IHN0cmNocihwLCAnICcpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKwkJfQorCisJCW5hbWUgPSBwOworCQlzdHJjaHJudWwobmFtZSwgJ1xuJylbMF0gPSAnXDAnOworCQkvKiBTYXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgKi8KKwkJaWYgKG5yID49IDIwMDAwKQorCQkJc3ByaW50ZihpcnFfZGVzYywgIiAgIDxrZXJuZWwgSVBJPiA6ICVzIiwgbmFtZSk7CisJCWVsc2UKKwkJCXNwcmludGYoaXJxX2Rlc2MsICIgICAgPGludGVycnVwdD4gOiAlcyIsIG5hbWUpOworCisJCWRlbHRhID0gc2F2ZV9pcnFfY291bnQobnIsIGNvdW50KTsKKworCQkvKiBTa2lwIHBlciBDUFUgdGltZXIgaW50ZXJydXB0cyAqLworCQlpZiAoaXNfaHBldF9pcnEobmFtZSkpCisJCQljb250aW51ZTsKKworCQlpZiAobnIgIT0gMCAmJiBkZWx0YSAhPSAwKQorCQkJc2F2ZV9saW5lKGlycV9kZXNjLCBkZWx0YSk7CisKKwkJaWYgKG5yID09IDApCisJCQlHLmludGVycnVwdF8wID0gZGVsdGE7CisJCWVsc2UKKwkJCUcudG90YWxfaW50ZXJydXB0ICs9IGRlbHRhOworCX0KKworCWZjbG9zZShmcCk7Cit9CisjZWxzZSAvKiAhRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUSAqLworIyBkZWZpbmUgcHJvY2Vzc19pcnFfY291bnRzKCkgICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyBOT0lOTElORSBpbnQgcHJvY2Vzc190aW1lcl9zdGF0cyh2b2lkKQoreworCWNoYXIgYnVmWzEyOF07CisJY2hhciBsaW5lWzE1ICsgMyArIDEyOF07CisJaW50IG47CisJRklMRSAqZnA7CisKKwlidWZbMF0gPSAnXDAnOworCisJbiA9IDA7CisJZnAgPSBOVUxMOworCWlmICghRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cykKKwkJZnAgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2MvdGltZXJfc3RhdHMiKTsKKwlpZiAoZnApIHsKKy8vIEV4YW1wbGUgZmlsZSBjb250ZW50czoKKy8vIFRpbWVyIFN0YXRzIFZlcnNpb246IHYwLjIKKy8vIFNhbXBsZSBwZXJpb2Q6IDEuMzI5IHMKKy8vICAgIDc2LCAgICAgMCBzd2FwcGVyICAgICAgICAgIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMgKHRpY2tfc2NoZWRfdGltZXIpCisvLyAgICA4OCwgICAgIDAgc3dhcHBlciAgICAgICAgICBocnRpbWVyX3N0YXJ0X3JhbmdlX25zICh0aWNrX3NjaGVkX3RpbWVyKQorLy8gICAgMjQsICAzNzg3IGZpcmVmb3ggICAgICAgICAgaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisvLyAgIDQ2RCwgIDExMzYga29uZGVtYW5kLzEgICAgICBkb19kYnNfdGltZXIgKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKy8vIC4uLgorLy8gICAgIDEsICAxNjU2IFhvcmcgICAgICAgICAgICAgaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisvLyAgICAgMSwgIDIxNTkgdWRpc2tzLWRhZW1vbiAgICBocnRpbWVyX3N0YXJ0X3JhbmdlX25zIChocnRpbWVyX3dha2V1cCkKKy8vIDMzMSB0b3RhbCBldmVudHMsIDI0OS4wNTkgZXZlbnRzL3NlYworCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCQljb25zdCBjaGFyICpjb3VudCwgKnByb2Nlc3MsICpmdW5jOworCQkJY2hhciAqcDsKKwkJCWludCBpZHg7CisJCQl1bnNpZ25lZCBjbnQ7CisKKwkJCWNvdW50ID0gc2tpcF93aGl0ZXNwYWNlKGJ1Zik7CisJCQlwID0gc3RyY2hyKGNvdW50LCAnLCcpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9ICdcMCc7CisJCQljbnQgPSBiYl9zdHJ0b3UoY291bnQsIE5VTEwsIDEwKTsKKwkJCWlmIChzdHJjbXAoc2tpcF9ub25fd2hpdGVzcGFjZShjb3VudCksICIgdG90YWwgZXZlbnRzIikgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKKwkJCQluID0gY250IC8gRy50b3RhbF9jcHVzOworCQkJCWlmIChuID4gMCAmJiBuIDwgRy5pbnRlcnJ1cHRfMCkgeworCQkJCQlzcHJpbnRmKGxpbmUsICIgICAgPGludGVycnVwdD4gOiAlcyIsICJleHRyYSB0aW1lciBpbnRlcnJ1cHQiKTsKKwkJCQkJc2F2ZV9saW5lKGxpbmUsIEcuaW50ZXJydXB0XzAgLSBuKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjaHIoY291bnQsICdEJykpCisJCQkJY29udGludWU7IC8qIGRlZmVycmVkICovCisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOyAvKiBwb2ludHMgdG8gcGlkIG5vdyAqLworCQkJcHJvY2VzcyA9IE5VTEw7CisgZ2V0X2Z1bmNfbmFtZToKKwkJCXAgPSBzdHJjaHIocCwgJyAnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAnXDAnOworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKwkJCWlmIChwcm9jZXNzID09IE5VTEwpIHsKKwkJCQlwcm9jZXNzID0gcDsKKwkJCQlnb3RvIGdldF9mdW5jX25hbWU7CisJCQl9CisJCQlmdW5jID0gcDsKKworCQkJLy9pZiAoc3RyY21wKHByb2Nlc3MsICJzd2FwcGVyIikgPT0gMAorCQkJLy8gJiYgc3RyY21wKGZ1bmMsICJocnRpbWVyX3N0YXJ0X3JhbmdlX25zICh0aWNrX3NjaGVkX3RpbWVyKVxuIikgPT0gMAorCQkJLy8pIHsKKwkJCS8vCXByb2Nlc3MgPSAiW2tlcm5lbCBzY2hlZHVsZXJdIjsKKwkJCS8vCWZ1bmMgPSAiTG9hZCBiYWxhbmNpbmcgdGljayI7CisJCQkvL30KKworCQkJaWYgKHN0cm5jbXAoZnVuYywgInRpY2tfbm9oel8iLCAxMCkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdHJuY21wKGZ1bmMsICJ0aWNrX3NldHVwX3NjaGVkX3RpbWVyIiwgMjApID09IDApCisJCQkJY29udGludWU7CisJCQkvL2lmIChzdHJjbXAocHJvY2VzcywgInBvd2VydG9wIikgPT0gMCkKKwkJCS8vCWNvbnRpbnVlOworCisJCQlpZHggPSBpbmRleF9pbl9zdHJpbmdzKCJpbnNtb2RcMG1vZHByb2JlXDBzd2FwcGVyXDAiLCBwcm9jZXNzKTsKKwkJCWlmIChpZHggIT0gLTEpIHsKKwkJCQlwcm9jZXNzID0gaWR4IDwgMiA/ICJba2VybmVsIG1vZHVsZV0iIDogIjxrZXJuZWwgY29yZT4iOworCQkJfQorCisJCQlzdHJjaHJudWwocCwgJ1xuJylbMF0gPSAnXDAnOworCisJCQkvLyA0NkRcMDExMzZcMGtvbmRlbWFuZC8xXDBkb19kYnNfdGltZXIgKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKwkJCS8vIF4gICAgICAgICAgXiAgICAgICAgICAgIF4KKwkJCS8vIGNvdW50ICAgICAgcHJvY2VzcyAgICAgIGZ1bmMKKworCQkJLy9pZiAoc3RyY2hyKHByb2Nlc3MsICdbJykpCisJCQkJc3ByaW50ZihsaW5lLCAiJTE1LjE1cyA6ICVzIiwgcHJvY2VzcywgZnVuYyk7CisJCQkvL2Vsc2UKKwkJCS8vCXNwcmludGYobGluZSwgIiVzIiwgcHJvY2Vzcyk7CisJCQlzYXZlX2xpbmUobGluZSwgY250KTsKKwkJfQorCQlmY2xvc2UoZnApOworCX0KKworCXJldHVybiBuOworfQorCisjaWZkZWYgX19pMzg2X18KKy8qCisgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgQ1BVIHVzaW5nIENQVUlEIG9wY29kZS4KKyAqLworc3RhdGljIHZvaWQgY3B1aWQodW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LCB1bnNpZ25lZCBpbnQgKmVjeCwKKwkJCQkgIHVuc2lnbmVkIGludCAqZWR4KQoreworCS8qIEVBWCB2YWx1ZSBzcGVjaWZpZXMgd2hhdCBpbmZvcm1hdGlvbiB0byByZXR1cm4gKi8KKwlfX2FzbV9fKAorCQkiCXB1c2hsICUlZWJ4XG4iICAgICAvKiBTYXZlIEVCWCAqLworCQkiCWNwdWlkXG4iCisJCSIJbW92bCAlJWVieCwgJTFcbiIgIC8qIFNhdmUgY29udGVudCBvZiBFQlggKi8KKwkJIglwb3BsICUlZWJ4XG4iICAgICAgLyogUmVzdG9yZSBFQlggKi8KKwkJOiAiPWEiKCplYXgpLCAvKiBPdXRwdXQgKi8KKwkJICAiPXIiKCplYngpLAorCQkgICI9YyIoKmVjeCksCisJCSAgIj1kIigqZWR4KQorCQk6ICIwIigqZWF4KSwgIC8qIElucHV0ICovCisJCSAgIjEiKCplYngpLAorCQkgICIyIigqZWN4KSwKKwkJICAiMyIoKmVkeCkKKwkJLyogTm8gY2xvYmJlcmVkIHJlZ2lzdGVycyAqLworCSk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9faTM4Nl9fCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBwcmludF9pbnRlbF9jc3RhdGVzKHZvaWQpCit7CisJaW50IGJpb3NfdGFibGVbOF0gPSB7IDAgfTsKKwlpbnQgbmJpb3MgPSAwOworCURJUiAqY3B1ZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisJaW50IGk7CisJdW5zaWduZWQgZWF4LCBlYngsIGVjeCwgZWR4OworCisJY3B1ZGlyID0gb3BlbmRpcigiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUiKTsKKwlpZiAoIWNwdWRpcikKKwkJcmV0dXJuOworCisJLyogTG9vcCBvdmVyIGNwdU4gZW50cmllcyAqLworCXdoaWxlICgoZCA9IHJlYWRkaXIoY3B1ZGlyKSkgIT0gTlVMTCkgeworCQlESVIgKmRpcjsKKwkJaW50IGxlbjsKKwkJY2hhciBmbmFtZVtzaXplb2YoIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1Ly9jcHVpZGxlLy9kZXNjIikgKyAyKkJJR19TWVNOQU1FX0xFTl07CisKKwkJbGVuID0gc3RybGVuKGQtPmRfbmFtZSk7CisJCWlmIChsZW4gPCAzIHx8IGxlbiA+IEJJR19TWVNOQU1FX0xFTikKKwkJCWNvbnRpbnVlOworCisJCWlmICghaXNkaWdpdChkLT5kX25hbWVbM10pKQorCQkJY29udGludWU7CisKKwkJbGVuID0gc3ByaW50ZihmbmFtZSwgIiVzLyVzL2NwdWlkbGUiLCAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUiLCBkLT5kX25hbWUpOworCQlkaXIgPSBvcGVuZGlyKGZuYW1lKTsKKwkJaWYgKCFkaXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBFdmVyeSBDLXN0YXRlIGhhcyBpdHMgb3duIHN0YXRlTiBkaXJlY3RvcnksIHRoYXQKKwkJICogY29udGFpbnMgYSAndGltZScgYW5kIGEgJ3VzYWdlJyBmaWxlLgorCQkgKi8KKwkJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQlGSUxFICpmcDsKKwkJCWNoYXIgYnVmWzY0XTsKKwkJCWludCBuOworCisJCQluID0gc3RybGVuKGQtPmRfbmFtZSk7CisJCQlpZiAobiA8IDMgfHwgbiA+IEJJR19TWVNOQU1FX0xFTikKKwkJCQljb250aW51ZTsKKworCQkJc3ByaW50ZihmbmFtZSArIGxlbiwgIi8lcy9kZXNjIiwgZC0+ZF9uYW1lKTsKKwkJCWZwID0gZm9wZW5fZm9yX3JlYWQoZm5hbWUpOworCQkJaWYgKGZwKSB7CisJCQkJY2hhciAqcCA9IGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKTsKKwkJCQlmY2xvc2UoZnApOworCQkJCWlmICghcCkKKwkJCQkJYnJlYWs7CisJCQkJcCA9IHN0cnN0cihwLCAiTVdBSVQgIik7CisJCQkJaWYgKHApIHsKKwkJCQkJaW50IHBvczsKKwkJCQkJcCArPSBzaXplb2YoIk1XQUlUICIpIC0gMTsKKwkJCQkJcG9zID0gKGJiX3N0cnRvdWxsKHAsIE5VTEwsIDE2KSA+PiA0KSArIDE7CisJCQkJCWlmIChwb3MgPj0gQVJSQVlfU0laRShiaW9zX3RhYmxlKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQliaW9zX3RhYmxlW3Bvc10rKzsKKwkJCQkJbmJpb3MrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJY2xvc2VkaXIoZGlyKTsKKwl9CisJY2xvc2VkaXIoY3B1ZGlyKTsKKworCWlmICghbmJpb3MpCisJCXJldHVybjsKKworCWVheCA9IDU7CisJZWJ4ID0gZWN4ID0gZWR4ID0gMDsKKwljcHVpZCgmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlpZiAoIWVkeCB8fCAhKGVjeCAmIDEpKQorCQlyZXR1cm47CisKKwlwcmludGYoIllvdXIgQ1BVIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQy1zdGF0ZXM6ICIpOworCWkgPSAwOworCXdoaWxlIChlZHgpIHsKKwkJaWYgKGVkeCAmIDcpCisJCQlwcmludGYoIkMldSAiLCBpKTsKKwkJZWR4ID4+PSA0OworCQlpKys7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwkvKiBQcmludCBCSU9TIEMtU3RhdGVzICovCisJcHJpbnRmKCJZb3VyIEJJT1MgcmVwb3J0cyB0aGUgZm9sbG93aW5nIEMtc3RhdGVzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShiaW9zX3RhYmxlKTsgaSsrKQorCQlpZiAoYmlvc190YWJsZVtpXSkKKwkJCXByaW50ZigiQyV1ICIsIGkpOworCisJYmJfcHV0Y2hhcignXG4nKTsKK30KKyNlbHNlCisjIGRlZmluZSBwcmludF9pbnRlbF9jc3RhdGVzKCkgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2hvd190aW1lcnN0YXRzKHZvaWQpCit7CisJdW5zaWduZWQgbGluZXM7CisKKwkvKiBHZXQgdGVybWluYWwgaGVpZ2h0ICovCisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERPVVRfRklMRU5PLCBOVUxMLCAmbGluZXMpOworCisJLyogV2UgZG9uJ3QgaGF2ZSB3aG9sZSB0ZXJtaW5hbCBqdXN0IGZvciB0aW1lcnN0YXRzICovCisJbGluZXMgLT0gMTI7CisKKwlpZiAoIUcuY2FudF9lbmFibGVfdGltZXJfc3RhdHMpIHsKKwkJaW50IGksIG4gPSAwOworCQljaGFyIHN0cmJ1ZjZbNl07CisKKwkJc3RyYnVmNls1XSA9ICdcMCc7CisJCXB1dHMoIlxuVG9wIGNhdXNlcyBmb3Igd2FrZXVwczoiKTsKKwkJZm9yIChpID0gMDsgaSA8IEcubGluZXNfY250OyBpKyspIHsKKwkJCWlmICgoRy5saW5lc1tpXS5jb3VudCA+IDAgLyp8fCBHLmxpbmVzW2ldLmRpc2tfY291bnQgPiAwKi8pCisJCQkgJiYgbisrIDwgbGluZXMKKwkJCSkgeworCQkJCS8qIE5COiB1cHN0cmVhbSBwb3dlcnRvcCBwcmludHMgIih3YWtldXBzL3NlYykiLAorCQkJCSAqIHdlIHByaW50IGp1c3QgIih3YWtldXAgY291bnRzKSIuCisJCQkJICovCisJCQkJLypjaGFyIGMgPSAnICc7CisJCQkJaWYgKEcubGluZXNbaV0uZGlza19jb3VudCkKKwkJCQkJYyA9ICdEJzsqLworCQkJCXNtYXJ0X3VsbHRvYTUoRy5saW5lc1tpXS5jb3VudCwgc3RyYnVmNiwgIiBLTUdUUEVaWSIpOworCQkJCXByaW50ZigvKiIgJTUuMWYlJSAoJXMpJWMgICVzXG4iKi8KKwkJCQkJIiAlNS4xZiUlICglcykgICAlc1xuIiwKKwkJCQkJRy5saW5lc1tpXS5jb3VudCAqIDEwMC4wIC8gRy5saW5lc19jdW11bGF0aXZlX2NvdW50LAorCQkJCQlzdHJidWY2LCAvKmMsKi8KKwkJCQkJRy5saW5lc1tpXS5zdHJpbmcpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJYmJfZXJyb3JfbXNnKCJubyBzdGF0cyBhdmFpbGFibGU7IHJ1biBhcyByb290IG9yIgorCQkJCSIgZW5hYmxlIHRoZSBjcHVmcmVxX3N0YXRzIG1vZHVsZSIpOworCX0KK30KKworLy8gRXhhbXBsZSBkaXNwbGF5IGZyb20gcG93ZXJ0b3AgdmVyc2lvbiAxLjExCisvLyBDbiAgICAgICAgICAgICAgICBBdmcgcmVzaWRlbmN5ICAgICAgIFAtc3RhdGVzIChmcmVxdWVuY2llcykKKy8vIEMwIChjcHUgcnVubmluZykgICAgICAgICggMC41JSkgICAgICAgICAyLjAwIEdoeiAgICAgMC4wJQorLy8gcG9sbGluZyAgICAgICAgICAgMC4wbXMgKCAwLjAlKSAgICAgICAgIDEuNjcgR2h6ICAgICAwLjAlCisvLyBDMSBtd2FpdCAgICAgICAgICAwLjBtcyAoIDAuMCUpICAgICAgICAgMTMzMyBNaHogICAgIDAuMSUKKy8vIEMyIG13YWl0ICAgICAgICAgIDAuMW1zICggMC4xJSkgICAgICAgICAxMDAwIE1oeiAgICA5OS45JQorLy8gQzMgbXdhaXQgICAgICAgICAxMi4xbXMgKDk5LjQlKQorLy8KKy8vIFdha2V1cHMtZnJvbS1pZGxlIHBlciBzZWNvbmQgOiA5My42ICAgICBpbnRlcnZhbDogMTUuMHMKKy8vIG5vIEFDUEkgcG93ZXIgdXNhZ2UgZXN0aW1hdGUgYXZhaWxhYmxlCisvLworLy8gVG9wIGNhdXNlcyBmb3Igd2FrZXVwczoKKy8vICAgMzIuNCUgKCAyNi43KSAgICAgICA8aW50ZXJydXB0PiA6IGV4dHJhIHRpbWVyIGludGVycnVwdAorLy8gICAyOS4wJSAoIDIzLjkpICAgICA8a2VybmVsIGNvcmU+IDogaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAodGlja19zY2hlZF90aW1lcikKKy8vICAgIDkuMCUgKCAgNy41KSAgICAgPGtlcm5lbCBjb3JlPiA6IGhydGltZXJfc3RhcnQgKHRpY2tfc2NoZWRfdGltZXIpCisvLyAgICA2LjUlICggIDUuMykgICAgICAgPGludGVycnVwdD4gOiBhdGFfcGlpeAorLy8gICAgNS4wJSAoICA0LjEpICAgICAgICAgICAgIGluZXRkIDogaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisKKy8vdXNhZ2U6I2RlZmluZSBwb3dlcnRvcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHBvd2VydG9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQW5hbHl6ZSBwb3dlciBjb25zdW1wdGlvbiBvbiBJbnRlbC1iYXNlZCBsYXB0b3BzXG4iCisKK2ludCBwb3dlcnRvcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcG93ZXJ0b3BfbWFpbihpbnQgVU5VU0VEX1BBUkFNIGFyZ2MsIGNoYXIgVU5VU0VEX1BBUkFNICoqYXJndikKK3sKKwl1bGxvbmcgY3VyX3VzYWdlW01BWF9DU1RBVEVfQ09VTlRdOworCXVsbG9uZyBjdXJfZHVyYXRpb25bTUFYX0NTVEFURV9DT1VOVF07CisJY2hhciBjc3RhdGVfbGluZXNbTUFYX0NTVEFURV9DT1VOVCArIDJdWzY0XTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXN0cnVjdCB0ZXJtaW9zIG5ld19zZXR0aW5nczsKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKworCXBmZFswXS5mZCA9IDA7CisJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRICYmIEJMT0FUWV9IUEVUX0lSUV9OVU1fREVURUNUSU9OCisJRy5wZXJjcHVfaHBldF9zdGFydCA9IElOVF9NQVg7CisJRy5wZXJjcHVfaHBldF9lbmQgPSBJTlRfTUlOOworI2VuZGlmCisKKwkvKiBQcmludCB3YXJuaW5nIHdoZW4gd2UgZG9uJ3QgaGF2ZSBzdXBlcnVzZXIgcHJpdmlsZWdlcyAqLworCWlmIChnZXRldWlkKCkgIT0gMCkKKwkJYmJfZXJyb3JfbXNnKCJydW4gYXMgcm9vdCB0byBjb2xsZWN0IGVub3VnaCBpbmZvcm1hdGlvbiIpOworCisJLyogR2V0IG51bWJlciBvZiBDUFVzICovCisJRy50b3RhbF9jcHVzID0gZ2V0X2NwdV9jb3VudCgpOworCisJcHJpbnRmKCJDb2xsZWN0aW5nIGRhdGEgZm9yICJERUZBVUxUX1NMRUVQX1NUUiIgc2Vjb25kc1xuIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXRjZ2V0YXR0cigwLCAodm9pZCAqKSZHLmluaXRfc2V0dGluZ3MpOworCW1lbWNweSgmbmV3X3NldHRpbmdzLCAmRy5pbml0X3NldHRpbmdzLCBzaXplb2YobmV3X3NldHRpbmdzKSk7CisJLyogVHVybiBvbiB1bmJ1ZmZlcmVkIGlucHV0LCB0dXJuIG9mZiBlY2hvaW5nICovCisJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfihJU0lHIHwgSUNBTk9OIHwgRUNITyB8IEVDSE9OTCk7CisJLyogU28gd2UgZG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRlcm0gc2V0dGluZ3MgKi8KKwlhdGV4aXQocmVzZXRfdGVybSk7CisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBzaWdfaGFuZGxlcik7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJm5ld19zZXR0aW5ncyk7CisjZW5kaWYKKworCS8qIENvbGxlY3QgaW5pdGlhbCBkYXRhICovCisJcHJvY2Vzc19pcnFfY291bnRzKCk7CisKKwkvKiBSZWFkIGluaXRpYWwgdXNhZ2UgYW5kIGR1cmF0aW9uICovCisJcmVhZF9jc3RhdGVfY291bnRzKEcuc3RhcnRfdXNhZ2UsIEcuc3RhcnRfZHVyYXRpb24pOworCisJLyogQ29weSB0aGVtIHRvICJsYXN0IiAqLworCW1lbWNweShHLmxhc3RfdXNhZ2UsIEcuc3RhcnRfdXNhZ2UsIHNpemVvZihHLmxhc3RfdXNhZ2UpKTsKKwltZW1jcHkoRy5sYXN0X2R1cmF0aW9uLCBHLnN0YXJ0X2R1cmF0aW9uLCBzaXplb2YoRy5sYXN0X2R1cmF0aW9uKSk7CisKKwkvKiBEaXNwbGF5IEMtc3RhdGVzICovCisJcHJpbnRfaW50ZWxfY3N0YXRlcygpOworCisJRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cyB8PSBzdG9wX3RpbWVyKCk7IC8qIDEgb24gZXJyb3IgKi8KKworCS8qIFRoZSBtYWluIGxvb3AgKi8KKwlmb3IgKDs7KSB7CisJCS8vZG91YmxlIG1heHNsZWVwID0gMC4wOworCQl1bGxvbmcgdG90YWx0aWNrcywgdG90YWxldmVudHM7CisJCWludCBpOworCisJCUcuY2FudF9lbmFibGVfdGltZXJfc3RhdHMgfD0gc3RhcnRfdGltZXIoKTsgLyogMSBvbiBlcnJvciAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCQlzbGVlcChERUZBVUxUX1NMRUVQKTsKKyNlbHNlCisJCWlmIChzYWZlX3BvbGwocGZkLCAxLCBERUZBVUxUX1NMRUVQICogMTAwMCkgPiAwKSB7CisJCQl1bnNpZ25lZCBjaGFyIGM7CisJCQlpZiAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpICE9IDEpCisJCQkJYnJlYWs7IC8qIEVPRi9lcnJvciAqLworCQkJaWYgKGMgPT0gRy5pbml0X3NldHRpbmdzLmNfY2NbVklOVFJdKQorCQkJCWJyZWFrOyAvKiBeQyAqLworCQkJaWYgKChjIHwgMHgyMCkgPT0gJ3EnKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cyB8PSBzdG9wX3RpbWVyKCk7IC8qIDEgb24gZXJyb3IgKi8KKworCQljbGVhcl9saW5lcygpOworCQlwcm9jZXNzX2lycV9jb3VudHMoKTsKKworCQkvKiBDbGVhciB0aGUgc3RhdHMgKi8KKwkJbWVtc2V0KGN1cl9kdXJhdGlvbiwgMCwgc2l6ZW9mKGN1cl9kdXJhdGlvbikpOworCQltZW1zZXQoY3VyX3VzYWdlLCAwLCBzaXplb2YoY3VyX3VzYWdlKSk7CisKKwkJLyogUmVhZCB0aGVtICovCisJCXJlYWRfY3N0YXRlX2NvdW50cyhjdXJfdXNhZ2UsIGN1cl9kdXJhdGlvbik7CisKKwkJLyogQ291bnQgdG90YWx0aWNrcyBhbmQgdG90YWxldmVudHMgKi8KKwkJdG90YWx0aWNrcyA9IHRvdGFsZXZlbnRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DU1RBVEVfQ09VTlQ7IGkrKykgeworCQkJaWYgKGN1cl91c2FnZVtpXSAhPSAwKSB7CisJCQkJdG90YWx0aWNrcyArPSBjdXJfZHVyYXRpb25baV0gLSBHLmxhc3RfZHVyYXRpb25baV07CisJCQkJdG90YWxldmVudHMgKz0gY3VyX3VzYWdlW2ldIC0gRy5sYXN0X3VzYWdlW2ldOworCQkJfQorCQl9CisKKwkJLyogQ2xlYXIgdGhlIHNjcmVlbiAqLworCQlwcmludGYoIlwwMzNbSFwwMzNbSiIpOworCisJCS8qIENsZWFyIEMtc3RhdGUgbGluZXMgKi8KKwkJbWVtc2V0KCZjc3RhdGVfbGluZXMsIDAsIHNpemVvZihjc3RhdGVfbGluZXMpKTsKKworCQlpZiAodG90YWxldmVudHMgPT0gMCAmJiBHLm1heGNzdGF0ZSA8PSAxKSB7CisJCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJCQlzdHJjcHkoY3N0YXRlX2xpbmVzWzBdLCAiQy1zdGF0ZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRvdWJsZSBwZXJjZW50YWdlOworCQkJdW5zaWduZWQgbmV3dGlja3M7CisKKwkJCW5ld3RpY2tzID0gRy50b3RhbF9jcHVzICogREVGQVVMVF9TTEVFUCAqIEZSRVFfQUNQSV8xMDAwIC0gdG90YWx0aWNrczsKKwkJCS8qIEhhbmRsZSByb3VuZGluZyBlcnJvcnM6IGRvIG5vdCBkaXNwbGF5IG5lZ2F0aXZlIHZhbHVlcyAqLworCQkJaWYgKChpbnQpbmV3dGlja3MgPCAwKQorCQkJCW5ld3RpY2tzID0gMDsKKworCQkJc3ByaW50Zihjc3RhdGVfbGluZXNbMF0sICJDblx0XHQgIEF2ZyByZXNpZGVuY3lcbiIpOworCQkJcGVyY2VudGFnZSA9IG5ld3RpY2tzICogMTAwLjAgLyAoRy50b3RhbF9jcHVzICogREVGQVVMVF9TTEVFUCAqIEZSRVFfQUNQSV8xMDAwKTsKKwkJCXNwcmludGYoY3N0YXRlX2xpbmVzWzFdLCAiQzAgKGNwdSBydW5uaW5nKSAgICAgICAgKCU0LjFmJSUpXG4iLCBwZXJjZW50YWdlKTsKKworCQkJLyogQ29tcHV0ZSB2YWx1ZXMgZm9yIGluZGl2aWR1YWwgQy1zdGF0ZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1NUQVRFX0NPVU5UOyBpKyspIHsKKwkJCQlpZiAoY3VyX3VzYWdlW2ldICE9IDApIHsKKwkJCQkJZG91YmxlIHNsZXB0OworCQkJCQlzbGVwdCA9IChjdXJfZHVyYXRpb25baV0gLSBHLmxhc3RfZHVyYXRpb25baV0pCisJCQkJCQkvIChjdXJfdXNhZ2VbaV0gLSBHLmxhc3RfdXNhZ2VbaV0gKyAwLjEpIC8gRlJFUV9BQ1BJOworCQkJCQlwZXJjZW50YWdlID0gKGN1cl9kdXJhdGlvbltpXSAtIEcubGFzdF9kdXJhdGlvbltpXSkgKiAxMDAKKwkJCQkJCS8gKEcudG90YWxfY3B1cyAqIERFRkFVTFRfU0xFRVAgKiBGUkVRX0FDUElfMTAwMCk7CisJCQkJCXNwcmludGYoY3N0YXRlX2xpbmVzW2kgKyAyXSwgIkMldVx0XHQlNS4xZm1zICglNC4xZiUlKVxuIiwKKwkJCQkJCWkgKyAxLCBzbGVwdCwgcGVyY2VudGFnZSk7CisJCQkJCS8vaWYgKG1heHNsZWVwIDwgc2xlcHQpCisJCQkJCS8vCW1heHNsZWVwID0gc2xlcHQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DU1RBVEVfQ09VTlQgKyAyOyBpKyspCisJCQlpZiAoY3N0YXRlX2xpbmVzW2ldWzBdKQorCQkJCWZwdXRzKGNzdGF0ZV9saW5lc1tpXSwgc3Rkb3V0KTsKKworCQlpID0gcHJvY2Vzc190aW1lcl9zdGF0cygpOworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKKwkJaWYgKHRvdGFsZXZlbnRzID09IDApIHsKKwkJCS8qIE5vIEMtc3RhdGUgaW5mbyBhdmFpbGFibGUsIHVzZSB0aW1lcnN0YXRzICovCisJCQl0b3RhbGV2ZW50cyA9IGkgKiBHLnRvdGFsX2NwdXMgKyBHLnRvdGFsX2ludGVycnVwdDsKKwkJCWlmIChpIDwgMCkKKwkJCQl0b3RhbGV2ZW50cyArPSBHLmludGVycnVwdF8wIC0gaTsKKwkJfQorI2VuZGlmCisJCS8qIFVwc3RyZWFtIHBvd2VydG9wIHByaW50cyB3YWtldXBzIHBlciBzZWMgcGVyIENQVSwKKwkJICogd2UgcHJpbnQganVzdCByYXcgd2FrZXVwIGNvdW50cy4KKwkJICovCisvL1RPRE86IHNob3cgcmVhbCBzZWNvbmRzICh0aGluayBhYm91dCBtYW51YWwgcmVmcmVzaCkKKwkJcHJpbnRmKCJcbldha2V1cHMtZnJvbS1pZGxlIGluICV1IHNlY29uZHM6ICVsbHVcbiIsCisJCQlERUZBVUxUX1NMRUVQLAorCQkJdG90YWxldmVudHMKKwkJKTsKKworCQl1cGRhdGVfbGluZXNfY3VtdWxhdGl2ZV9jb3VudCgpOworCQlzb3J0X2xpbmVzKCk7CisJCXNob3dfdGltZXJzdGF0cygpOworCQlmZmx1c2goc3Rkb3V0KTsKKworCQkvKiBDbGVhciB0aGUgc3RhdHMgKi8KKwkJbWVtc2V0KGN1cl9kdXJhdGlvbiwgMCwgc2l6ZW9mKGN1cl9kdXJhdGlvbikpOworCQltZW1zZXQoY3VyX3VzYWdlLCAwLCBzaXplb2YoY3VyX3VzYWdlKSk7CisKKwkJLyogR2V0IG5ldyB2YWx1ZXMgKi8KKwkJcmVhZF9jc3RhdGVfY291bnRzKGN1cl91c2FnZSwgY3VyX2R1cmF0aW9uKTsKKworCQkvKiBTYXZlIHRoZW0gKi8KKwkJbWVtY3B5KEcubGFzdF91c2FnZSwgY3VyX3VzYWdlLCBzaXplb2YoRy5sYXN0X3VzYWdlKSk7CisJCW1lbWNweShHLmxhc3RfZHVyYXRpb24sIGN1cl9kdXJhdGlvbiwgc2l6ZW9mKEcubGFzdF9kdXJhdGlvbikpOworCX0gLyogZm9yICg7OykgKi8KKworCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL3BzLmMgYi9wcm9jcHMvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2MwZjdiCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BzLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcHMgaW1wbGVtZW50YXRpb24ocykgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBGaXggZm9yIFNFTGludXggU3VwcG9ydDooYykyMDA3IEhpcm9zaGkgU2hpbmppIDxzaGlyb3NoaUBteS5lbWFpbC5uZS5qcD4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChjKTIwMDcgWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNpZiBFTkFCTEVfREVTS1RPUAorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vIENPTDEsQ09MMj1IRUFERVJdIiBJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUygiIFstVF0iKQorLy91c2FnZTojZGVmaW5lIHBzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdyBsaXN0IG9mIHByb2Nlc3Nlc1xuIgorLy91c2FnZTogICAgICJcbgktbyBDT0wxLENPTDI9SEVBREVSCVNlbGVjdCBjb2x1bW5zIGZvciBkaXNwbGF5IgorLy91c2FnZToJSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoCisvL3VzYWdlOiAgICAgIlxuCS1UCQkJU2hvdyB0aHJlYWRzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2Vsc2UgLyogIUVOQUJMRV9ERVNLVE9QICovCisvL3VzYWdlOgorLy91c2FnZTojaWYgIUVOQUJMRV9TRUxJTlVYICYmICFFTkFCTEVfRkVBVFVSRV9QU19XSURFCisvL3VzYWdlOiNkZWZpbmUgVVNBR0VfUFMgIlxuVGhpcyB2ZXJzaW9uIG9mIHBzIGFjY2VwdHMgbm8gb3B0aW9ucyIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6I2RlZmluZSBVU0FHRV9QUyAiIgorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcHNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBwc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgbGlzdCBvZiBwcm9jZXNzZXNcbiIKKy8vdXNhZ2U6CVVTQUdFX1BTCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTaG93IHNlbGludXggY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUFNfV0lERSgKKy8vdXNhZ2U6ICAgICAiXG4JdwlXaWRlIG91dHB1dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbmRpZiAvKiBFTkFCTEVfREVTS1RPUCAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwc19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwc1xuIgorLy91c2FnZTogICAgICAgIiAgUElEICBVaWQgICAgICBHaWQgU3RhdGUgQ29tbWFuZFxuIgorLy91c2FnZTogICAgICAgIiAgICAxIHJvb3QgICAgIHJvb3QgICAgIFMgaW5pdFxuIgorLy91c2FnZTogICAgICAgIiAgICAyIHJvb3QgICAgIHJvb3QgICAgIFMgW2tmbHVzaGRdXG4iCisvL3VzYWdlOiAgICAgICAiICAgIDMgcm9vdCAgICAgcm9vdCAgICAgUyBba3VwZGF0ZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgNCByb290ICAgICByb290ICAgICBTIFtrcGlvZF1cbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgNSByb290ICAgICByb290ICAgICBTIFtrc3dhcGRdXG4iCisvL3VzYWdlOiAgICAgICAiICA3NDIgYW5kZXJzZW4gYW5kZXJzZW4gUyBbYmFzaF1cbiIKKy8vdXNhZ2U6ICAgICAgICIgIDc0MyBhbmRlcnNlbiBhbmRlcnNlbiBTIC1iYXNoXG4iCisvL3VzYWdlOiAgICAgICAiICA3NDUgcm9vdCAgICAgcm9vdCAgICAgUyBbZ2V0dHldXG4iCisvL3VzYWdlOiAgICAgICAiIDI5OTAgYW5kZXJzZW4gYW5kZXJzZW4gUiBwc1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogQWJzb2x1dGUgbWF4aW11bSBvbiBvdXRwdXQgbGluZSBsZW5ndGggKi8KK2VudW0geyBNQVhfV0lEVEggPSAyKjEwMjQgfTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPiAvKiBmb3IgdGltZXMoKSAqLworI2lmbmRlZiBBVF9DTEtUQ0sKKyMgZGVmaW5lIEFUX0NMS1RDSyAxNworI2VuZGlmCisKKy8qIFRPRE86CisgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcHMuaHRtbAorICogc3BlY2lmaWVzIChmb3IgWFNJLWNvbmZvcm1hbnQgc3lzdGVtcykgZm9sbG93aW5nIGRlZmF1bHQgY29sdW1ucworICogKGwgYW5kIGYgbWFyayBjb2x1bW5zIHNob3duIHdpdGggLWwgYW5kIC1mIHJlc3BlY3RpdmVseSk6CisgKiBGICAgICBsICAgRmxhZ3MgKG9jdGFsIGFuZCBhZGRpdGl2ZSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzICg/PykKKyAqIFMgICAgIGwgICBUaGUgc3RhdGUgb2YgdGhlIHByb2Nlc3MKKyAqIFVJRCAgIGYsbCBUaGUgdXNlciBJRDsgdGhlIGxvZ2luIG5hbWUgaXMgcHJpbnRlZCB3aXRoIC1mCisgKiBQSUQgICAgICAgVGhlIHByb2Nlc3MgSUQKKyAqIFBQSUQgIGYsbCBUaGUgcGFyZW50IHByb2Nlc3MKKyAqIEMgICAgIGYsbCBQcm9jZXNzb3IgdXRpbGl6YXRpb24KKyAqIFBSSSAgIGwgICBUaGUgcHJpb3JpdHkgb2YgdGhlIHByb2Nlc3M7IGhpZ2hlciBudW1iZXJzIG1lYW4gbG93ZXIgcHJpb3JpdHkKKyAqIE5JICAgIGwgICBOaWNlIHZhbHVlCisgKiBBRERSICBsICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHByb2Nlc3MKKyAqIFNaICAgIGwgICBUaGUgc2l6ZSBpbiBibG9ja3Mgb2YgdGhlIGNvcmUgaW1hZ2Ugb2YgdGhlIHByb2Nlc3MKKyAqIFdDSEFOIGwgICBUaGUgZXZlbnQgZm9yIHdoaWNoIHRoZSBwcm9jZXNzIGlzIHdhaXRpbmcgb3Igc2xlZXBpbmcKKyAqIFNUSU1FIGYgICBTdGFydGluZyB0aW1lIG9mIHRoZSBwcm9jZXNzCisgKiBUVFkgICAgICAgVGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGZvciB0aGUgcHJvY2VzcworICogVElNRSAgICAgIFRoZSBjdW11bGF0aXZlIGV4ZWN1dGlvbiB0aW1lIGZvciB0aGUgcHJvY2VzcworICogQ01EICAgICAgIFRoZSBjb21tYW5kIG5hbWU7IHRoZSBmdWxsIGNvbW1hbmQgbGluZSBpcyBzaG93biB3aXRoIC1mCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCB3aWR0aDsKKwljaGFyIG5hbWU2WzZdOworCWNvbnN0IGNoYXIgKmhlYWRlcjsKKwl2b2lkICgqZikoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcyk7CisJaW50IHBzX2ZsYWdzOworfSBwc19vdXRfdDsKKworc3RydWN0IGdsb2JhbHMgeworCXBzX291dF90KiBvdXQ7CisJaW50IG91dF9jbnQ7CisJaW50IHByaW50X2hlYWRlcjsKKwlpbnQgbmVlZF9mbGFnczsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgdGVybWluYWxfd2lkdGg7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRQorCXVuc2lnbmVkIGtlcm5lbF9IWjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2Vjb25kc19zaW5jZV9ib290OworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBvdXQgICAgICAgICAgICAgICAgKEcub3V0ICAgICAgICAgICAgICAgKQorI2RlZmluZSBvdXRfY250ICAgICAgICAgICAgKEcub3V0X2NudCAgICAgICAgICAgKQorI2RlZmluZSBwcmludF9oZWFkZXIgICAgICAgKEcucHJpbnRfaGVhZGVyICAgICAgKQorI2RlZmluZSBuZWVkX2ZsYWdzICAgICAgICAgKEcubmVlZF9mbGFncyAgICAgICAgKQorI2RlZmluZSBidWZmZXIgICAgICAgICAgICAgKEcuYnVmZmVyICAgICAgICAgICAgKQorI2RlZmluZSB0ZXJtaW5hbF93aWR0aCAgICAgKEcudGVybWluYWxfd2lkdGggICAgKQorI2RlZmluZSBrZXJuZWxfSFogICAgICAgICAgKEcua2VybmVsX0haICAgICAgICAgKQorI2RlZmluZSBzZWNvbmRzX3NpbmNlX2Jvb3QgKEcuc2Vjb25kc19zaW5jZV9ib290KQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19USU1FCisvKiBmb3IgRUxGIGV4ZWN1dGFibGVzLCBub3RlcyBhcmUgcHVzaGVkIGJlZm9yZSBlbnZpcm9ubWVudCBhbmQgYXJncyAqLworc3RhdGljIHB0cmRpZmZfdCBmaW5kX2VsZl9ub3RlKHB0cmRpZmZfdCBmaW5kbWUpCit7CisJcHRyZGlmZl90ICplcCA9IChwdHJkaWZmX3QgKikgZW52aXJvbjsKKworCXdoaWxlICgqZXArKykKKwkJY29udGludWU7CisJd2hpbGUgKCplcCkgeworCQlpZiAoZXBbMF0gPT0gZmluZG1lKSB7CisJCQlyZXR1cm4gZXBbMV07CisJCX0KKwkJZXAgKz0gMjsKKwl9CisJcmV0dXJuIC0xOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TCitzdGF0aWMgdW5zaWduZWQgZ2V0X0haX2J5X3dhaXRpbmcodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djEsIHR2MjsKKwl1bnNpZ25lZCB0MSwgdDIsIHIsIGh6OworCXVuc2lnbmVkIGNudCA9IGNudDsgLyogZm9yIGNvbXBpbGVyICovCisJaW50IGRpZmY7CisKKwlyID0gMDsKKworCS8qIFdhaXQgZm9yIHRpbWVzKCkgdG8gcmVhY2ggbmV3IHRpY2sgKi8KKwl0MSA9IHRpbWVzKE5VTEwpOworCWRvIHsKKwkJdDIgPSB0aW1lcyhOVUxMKTsKKwl9IHdoaWxlICh0MiA9PSB0MSk7CisJZ2V0dGltZW9mZGF5KCZ0djIsIE5VTEwpOworCisJZG8geworCQl0MSA9IHQyOworCQl0djEudHZfdXNlYyA9IHR2Mi50dl91c2VjOworCisJCS8qIFdhaXQgZXhhY3RseSBvbmUgdGltZXMoKSB0aWNrICovCisJCWRvIHsKKwkJCXQyID0gdGltZXMoTlVMTCk7CisJCX0gd2hpbGUgKHQyID09IHQxKTsKKwkJZ2V0dGltZW9mZGF5KCZ0djIsIE5VTEwpOworCisJCS8qIENhbGN1bGF0ZSB0aWNrcyBwZXIgc2VjLCByb3VuZGluZyB1cCB0byBldmVuICovCisJCWRpZmYgPSB0djIudHZfdXNlYyAtIHR2MS50dl91c2VjOworCQlpZiAoZGlmZiA8PSAwKSBkaWZmICs9IDEwMDAwMDA7CisJCWh6ID0gMTAwMDAwMHUgLyAodW5zaWduZWQpZGlmZjsKKwkJaHogPSAoaHorMSkgJiB+MTsKKworCQkvKiBDb3VudCBob3cgbWFueSBzYW1lIGh6IHZhbHVlcyB3ZSBzYXcgKi8KKwkJaWYgKHIgIT0gaHopIHsKKwkJCXIgPSBoejsKKwkJCWNudCA9IDA7CisJCX0KKwkJY250Kys7CisJfSB3aGlsZSAoY250IDwgMyk7IC8qIGV4aXQgaWYgc2F3IDMgc2FtZSB2YWx1ZXMgKi8KKworCXJldHVybiByOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X0haX2J5X3dhaXRpbmcodm9pZCkKK3sKKwkvKiBCZXR0ZXIgbWV0aG9kPyAqLworCXJldHVybiAxMDA7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGdldF9rZXJuZWxfSFoodm9pZCkKK3sKKwkvL2NoYXIgYnVmWzY0XTsKKwlzdHJ1Y3Qgc3lzaW5mbyBpbmZvOworCisJaWYgKGtlcm5lbF9IWikKKwkJcmV0dXJuIGtlcm5lbF9IWjsKKworCS8qIFdvcmtzIGZvciBFTEYgb25seSwgTGludXggMi40LjArICovCisJa2VybmVsX0haID0gZmluZF9lbGZfbm90ZShBVF9DTEtUQ0spOworCWlmIChrZXJuZWxfSFogPT0gKHVuc2lnbmVkKS0xKQorCQlrZXJuZWxfSFogPSBnZXRfSFpfYnlfd2FpdGluZygpOworCisJLy9pZiAob3Blbl9yZWFkX2Nsb3NlKCIvcHJvYy91cHRpbWUiLCBidWYsIHNpemVvZihidWYpKSA8PSAwKQorCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVhZCAlcyIsICIvcHJvYy91cHRpbWUiKTsKKwkvL2J1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisJLy8vc3NjYW5mKGJ1ZiwgIiVsbHUiLCAmc2Vjb25kc19zaW5jZV9ib290KTsKKwlzeXNpbmZvKCZpbmZvKTsKKwlzZWNvbmRzX3NpbmNlX2Jvb3QgPSBpbmZvLnVwdGltZTsKKworCXJldHVybiBrZXJuZWxfSFo7Cit9CisjZW5kaWYKKworLyogUHJpbnQgdmFsdWUgdG8gYnVmLCBtYXggc2l6ZSsxIGNoYXJzIChpbmNsdWRpbmcgdHJhaWxpbmcgJ1wwJykgKi8KKworc3RhdGljIHZvaWQgZnVuY191c2VyKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisjaWYgMQorCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfdXNlcm5hbWUocHMtPnVpZCksIHNpemUrMSk7CisjZWxzZQorCS8qICJjb21wYXRpYmxlIiB2ZXJzaW9uLCBidXQgaXQncyBsYXJnZXIgKi8KKwkvKiBwcm9jcHMgMi4xOCBzaG93cyBudW1lcmljIFVJRCBpZiBuYW1lIG92ZXJmbG93cyB0aGUgZmllbGQgKi8KKwkvKiBUT0RPOiBnZXRfY2FjaGVkX3VzZXJuYW1lKCkgcmV0dXJucyBudW1lcmljIHN0cmluZyBpZgorCSAqIHVzZXIgaGFzIG5vIHBhc3N3ZCByZWNvcmQsIHdlIHdpbGwgZGlzcGxheSBpdAorCSAqIGxlZnQtanVzdGlmaWVkIGhlcmU7IHRvbyBsb25nIHVzZXJuYW1lcyBhcmUgc2hvd24KKwkgKiBhcyBfcmlnaHQtanVzdGlmaWVkXyBJRHMuIElzIGl0IHdvcnRoIGZpeGluZz8gKi8KKwljb25zdCBjaGFyICp1c2VyID0gZ2V0X2NhY2hlZF91c2VybmFtZShwcy0+dWlkKTsKKwlpZiAoc3RybGVuKHVzZXIpIDw9IHNpemUpCisJCXNhZmVfc3RybmNweShidWYsIHVzZXIsIHNpemUrMSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIiUqdSIsIHNpemUsICh1bnNpZ25lZClwcy0+dWlkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmdW5jX2dyb3VwKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgZ2V0X2NhY2hlZF9ncm91cG5hbWUocHMtPmdpZCksIHNpemUrMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfY29tbShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIHBzLT5jb21tLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3N0YXRlKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgcHMtPnN0YXRlLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX2FyZ3MoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlyZWFkX2NtZGxpbmUoYnVmLCBzaXplKzEsIHBzLT5waWQsIHBzLT5jb21tKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19waWQoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzcHJpbnRmKGJ1ZiwgIiUqdSIsIHNpemUsIHBzLT5waWQpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3BwaWQoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzcHJpbnRmKGJ1ZiwgIiUqdSIsIHNpemUsIHBzLT5wcGlkKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19wZ2lkKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc3ByaW50ZihidWYsICIlKnUiLCBzaXplLCBwcy0+cGdpZCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9sdShjaGFyICpidWYsIGludCBzaXplLCB1bnNpZ25lZCBsb25nIHUpCit7CisJY2hhciBidWY0WzVdOworCisJLyogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVyYSAqLworCXNtYXJ0X3VsbHRvYTQodSwgYnVmNCwgIiBtZ3RwZXp5Iik7CisJYnVmNFs0XSA9ICdcMCc7CisJc3ByaW50ZihidWYsICIlLipzIiwgc2l6ZSwgYnVmNCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfdnN6KGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJcHV0X2x1KGJ1Ziwgc2l6ZSwgcHMtPnZzeik7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfcnNzKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJcHV0X2x1KGJ1Ziwgc2l6ZSwgcHMtPnJzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfdHR5KGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJYnVmWzBdID0gJz8nOworCWJ1ZlsxXSA9ICdcMCc7CisJaWYgKHBzLT50dHlfbWFqb3IpIC8qIHR0eSBmaWVsZCBvZiAiMCIgbWVhbnMgIm5vIHR0eSIgKi8KKwkJc25wcmludGYoYnVmLCBzaXplKzEsICIldSwldSIsIHBzLT50dHlfbWFqb3IsIHBzLT50dHlfbWlub3IpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisKK3N0YXRpYyB2b2lkIGZ1bmNfcmdyb3VwKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgZ2V0X2NhY2hlZF9ncm91cG5hbWUocHMtPnJnaWQpLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3J1c2VyKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgZ2V0X2NhY2hlZF91c2VybmFtZShwcy0+cnVpZCksIHNpemUrMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfbmljZShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNwcmludGYoYnVmLCAiJSpkIiwgc2l6ZSwgcHMtPm5pY2VuZXNzKTsKK30KKworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19USU1FCisKK3N0YXRpYyB2b2lkIGZ1bmNfZXRpbWUoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwkvKiBlbGFwc2VkIHRpbWUgW1tkZC1daGg6XW1tOnNzOyBoZXJlIG9ubHkgbW06c3MgKi8KKwl1bnNpZ25lZCBsb25nIG1tOworCXVuc2lnbmVkIHNzOworCisJbW0gPSBwcy0+c3RhcnRfdGltZSAvIGdldF9rZXJuZWxfSFooKTsKKwkvKiBtdXN0IGJlIGFmdGVyIGdldF9rZXJuZWxfSFooKSEgKi8KKwltbSA9IHNlY29uZHNfc2luY2VfYm9vdCAtIG1tOworCXNzID0gbW0gJSA2MDsKKwltbSAvPSA2MDsKKwlzbnByaW50ZihidWYsIHNpemUrMSwgIiUzbHU6JTAydSIsIG1tLCBzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfdGltZShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCS8qIGN1bXVsYXRpdmUgdGltZSBbW2RkLV1oaDpdbW06c3M7IGhlcmUgb25seSBtbTpzcyAqLworCXVuc2lnbmVkIGxvbmcgbW07CisJdW5zaWduZWQgc3M7CisKKwltbSA9IChwcy0+dXRpbWUgKyBwcy0+c3RpbWUpIC8gZ2V0X2tlcm5lbF9IWigpOworCXNzID0gbW0gJSA2MDsKKwltbSAvPSA2MDsKKwlzbnByaW50ZihidWYsIHNpemUrMSwgIiUzbHU6JTAydSIsIG1tLCBzcyk7Cit9CisKKyNlbmRpZgorCisjaWYgRU5BQkxFX1NFTElOVVgKK3N0YXRpYyB2b2lkIGZ1bmNfbGFiZWwoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzYWZlX3N0cm5jcHkoYnVmLCBwcy0+Y29udGV4dCA/IHBzLT5jb250ZXh0IDogInVua25vd24iLCBzaXplKzEpOworfQorI2VuZGlmCisKKy8qCitzdGF0aWMgdm9pZCBmdW5jX25pY2UoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlwcy0+Pz8/Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfcGNwdShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworfQorKi8KKworc3RhdGljIGNvbnN0IHBzX291dF90IG91dF9zcGVjW10gPSB7CisvKiBNYW5kYXRlZCBieSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcHMuaHRtbDogKi8KKwl7IDggICAgICAgICAgICAgICAgICAsICJ1c2VyIiAgLCJVU0VSIiAgICxmdW5jX3VzZXIgICxQU1NDQU5fVUlER0lEICB9LAorCXsgOCAgICAgICAgICAgICAgICAgICwgImdyb3VwIiAsIkdST1VQIiAgLGZ1bmNfZ3JvdXAgLFBTU0NBTl9VSURHSUQgIH0sCisJeyAxNiAgICAgICAgICAgICAgICAgLCAiY29tbSIgICwiQ09NTUFORCIsZnVuY19jb21tICAsUFNTQ0FOX0NPTU0gICAgfSwKKwl7IE1BWF9XSURUSCAgICAgICAgICAsICJhcmdzIiAgLCJDT01NQU5EIixmdW5jX2FyZ3MgICxQU1NDQU5fQ09NTSAgICB9LAorCXsgNSAgICAgICAgICAgICAgICAgICwgInBpZCIgICAsIlBJRCIgICAgLGZ1bmNfcGlkICAgLFBTU0NBTl9QSUQgICAgIH0sCisJeyA1ICAgICAgICAgICAgICAgICAgLCAicHBpZCIgICwiUFBJRCIgICAsZnVuY19wcGlkICAsUFNTQ0FOX1BQSUQgICAgfSwKKwl7IDUgICAgICAgICAgICAgICAgICAsICJwZ2lkIiAgLCJQR0lEIiAgICxmdW5jX3BnaWQgICxQU1NDQU5fUEdJRCAgICB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX1BTX1RJTUUKKwl7IHNpemVvZigiRUxBUFNFRCIpLTEsICJldGltZSIgLCJFTEFQU0VEIixmdW5jX2V0aW1lICxQU1NDQU5fU1RBUlRfVElNRSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJeyA1ICAgICAgICAgICAgICAgICAgLCAibmljZSIgICwiTkkiICAgICAsZnVuY19uaWNlICAsUFNTQ0FOX05JQ0UgICAgfSwKKwl7IDggICAgICAgICAgICAgICAgICAsICJyZ3JvdXAiLCJSR1JPVVAiICxmdW5jX3Jncm91cCxQU1NDQU5fUlVJREdJRCB9LAorCXsgOCAgICAgICAgICAgICAgICAgICwgInJ1c2VyIiAsIlJVU0VSIiAgLGZ1bmNfcnVzZXIgLFBTU0NBTl9SVUlER0lEIH0sCisvLwl7IDUgICAgICAgICAgICAgICAgICAsICJwY3B1IiAgLCIlQ1BVIiAgICxmdW5jX3BjcHUgICxQU1NDQU5fICAgICAgICB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRQorCXsgNiAgICAgICAgICAgICAgICAgICwgInRpbWUiICAsIlRJTUUiICAgLGZ1bmNfdGltZSAgLFBTU0NBTl9TVElNRSB8IFBTU0NBTl9VVElNRSB9LAorI2VuZGlmCisJeyA2ICAgICAgICAgICAgICAgICAgLCAidHR5IiAgICwiVFQiICAgICAsZnVuY190dHkgICAsUFNTQ0FOX1RUWSAgICAgfSwKKwl7IDQgICAgICAgICAgICAgICAgICAsICJ2c3oiICAgLCJWU1oiICAgICxmdW5jX3ZzeiAgICxQU1NDQU5fVlNaICAgICB9LAorLyogTm90IG1hbmRhdGVkLCBidXQgdXNlZnVsOiAqLworCXsgNCAgICAgICAgICAgICAgICAgICwgInN0YXQiICAsIlNUQVQiICAgLGZ1bmNfc3RhdGUgLFBTU0NBTl9TVEFURSAgIH0sCisJeyA0ICAgICAgICAgICAgICAgICAgLCAicnNzIiAgICwiUlNTIiAgICAsZnVuY19yc3MgICAsUFNTQ0FOX1JTUyAgICAgfSwKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXsgMzUgICAgICAgICAgICAgICAgICwgImxhYmVsIiAsIkxBQkVMIiAgLGZ1bmNfbGFiZWwgLFBTU0NBTl9DT05URVhUIH0sCisjZW5kaWYKK307CisKK3N0YXRpYyBwc19vdXRfdCogbmV3X291dF90KHZvaWQpCit7CisJb3V0ID0geHJlYWxsb2NfdmVjdG9yKG91dCwgMiwgb3V0X2NudCk7CisJcmV0dXJuICZvdXRbb3V0X2NudCsrXTsKK30KKworc3RhdGljIGNvbnN0IHBzX291dF90KiBmaW5kX291dF9zcGVjKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaTsKKwljaGFyIGJ1ZltBUlJBWV9TSVpFKG91dF9zcGVjKSo3ICsgMV07CisJY2hhciAqcCA9IGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG91dF9zcGVjKTsgaSsrKSB7CisJCWlmIChzdHJuY21wKG5hbWUsIG91dF9zcGVjW2ldLm5hbWU2LCA2KSA9PSAwKQorCQkJcmV0dXJuICZvdXRfc3BlY1tpXTsKKwkJcCArPSBzcHJpbnRmKHAsICIlLjZzLCIsIG91dF9zcGVjW2ldLm5hbWU2KTsKKwl9CisJcFstMV0gPSAnXDAnOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgLW8gYXJndW1lbnQgJyVzJywgc3VwcG9ydGVkIGFyZ3VtZW50czogJXMiLCBuYW1lLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9vKGNoYXIqIG9wdCkKK3sKKwlwc19vdXRfdCogbmV3OworCS8vIFBPU0lYOiAiLW8gaXMgYmxhbmstIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IiAoRklYTUUpCisJY2hhciAqY29tbWEsICplcXVhbDsKKwl3aGlsZSAoMSkgeworCQljb21tYSA9IHN0cmNocihvcHQsICcsJyk7CisJCWVxdWFsID0gc3RyY2hyKG9wdCwgJz0nKTsKKwkJaWYgKGNvbW1hICYmICghZXF1YWwgfHwgZXF1YWwgPiBjb21tYSkpIHsKKwkJCSpjb21tYSA9ICdcMCc7CisJCQkqbmV3X291dF90KCkgPSAqZmluZF9vdXRfc3BlYyhvcHQpOworCQkJKmNvbW1hID0gJywnOworCQkJb3B0ID0gY29tbWEgKyAxOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCS8vIG9wdCBwb2ludHMgdG8gbGFzdCBzcGVjIGluIGNvbW1hIHNlcGFyYXRlZCBsaXN0LgorCS8vIFRoaXMgb25lIGNhbiBoYXZlID1IRUFERVIgcGFydC4KKwluZXcgPSBuZXdfb3V0X3QoKTsKKwlpZiAoZXF1YWwpCisJCSplcXVhbCA9ICdcMCc7CisJKm5ldyA9ICpmaW5kX291dF9zcGVjKG9wdCk7CisJaWYgKGVxdWFsKSB7CisJCSplcXVhbCA9ICc9JzsKKwkJbmV3LT5oZWFkZXIgPSBlcXVhbCArIDE7CisJCS8vIFBPU0lYOiB0aGUgZmllbGQgd2lkdGhzIHNoYWxsIGJlIC4uLiBhdCBsZWFzdCBhcyB3aWRlIGFzCisJCS8vIHRoZSBoZWFkZXIgdGV4dCAoZGVmYXVsdCBvciBvdmVycmlkZGVuIHZhbHVlKS4KKwkJLy8gSWYgdGhlIGhlYWRlciB0ZXh0IGlzIG51bGwsIHN1Y2ggYXMgLW8gdXNlcj0sCisJCS8vIHRoZSBmaWVsZCB3aWR0aCBzaGFsbCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHRoZQorCQkvLyBkZWZhdWx0IGhlYWRlciB0ZXh0CisJCWlmIChuZXctPmhlYWRlclswXSkgeworCQkJbmV3LT53aWR0aCA9IHN0cmxlbihuZXctPmhlYWRlcik7CisJCQlwcmludF9oZWFkZXIgPSAxOworCQl9CisJfSBlbHNlCisJCXByaW50X2hlYWRlciA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX2xpbmVfYnVmZmVyKHZvaWQpCit7CisJaW50IGk7CisJaW50IHdpZHRoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb3V0X2NudDsgaSsrKSB7CisJCW5lZWRfZmxhZ3MgfD0gb3V0W2ldLnBzX2ZsYWdzOworCQlpZiAob3V0W2ldLmhlYWRlclswXSkgeworCQkJcHJpbnRfaGVhZGVyID0gMTsKKwkJfQorCQl3aWR0aCArPSBvdXRbaV0ud2lkdGggKyAxOyAvKiAiRklFTEQgIiAqLworCQlpZiAoKGludCkod2lkdGggLSB0ZXJtaW5hbF93aWR0aCkgPiAwKSB7CisJCQkvKiBUaGUgcmVzdCBkb2VzIG5vdCBmaXQgb24gdGhlIHNjcmVlbiAqLworCQkJLy9vdXRbaV0ud2lkdGggLT0gKHdpZHRoIC0gdGVybWluYWxfd2lkdGggLSAxKTsKKwkJCW91dF9jbnQgPSBpICsgMTsKKwkJCWJyZWFrOworCQl9CisJfQorI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkKKwkJbmVlZF9mbGFncyAmPSB+UFNTQ0FOX0NPTlRFWFQ7CisjZW5kaWYKKwlidWZmZXIgPSB4bWFsbG9jKHdpZHRoICsgMSk7IC8qIGZvciB0cmFpbGluZyBcMCAqLworfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfaGVhZGVyKHZvaWQpCit7CisJaW50IGk7CisJcHNfb3V0X3QqIG9wOworCWNoYXIgKnA7CisKKwlpZiAoIXByaW50X2hlYWRlcikKKwkJcmV0dXJuOworCXAgPSBidWZmZXI7CisJaSA9IDA7CisJaWYgKG91dF9jbnQpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCW9wID0gJm91dFtpXTsKKwkJCWlmICgrK2kgPT0gb3V0X2NudCkgLyogZG8gbm90IHBhZCBsYXN0IGZpZWxkICovCisJCQkJYnJlYWs7CisJCQlwICs9IHNwcmludGYocCwgIiUtKnMgIiwgb3AtPndpZHRoLCBvcC0+aGVhZGVyKTsKKwkJfQorCQlzdHJjcHkocCwgb3AtPmhlYWRlcik7CisJfQorCXByaW50ZigiJS4qc1xuIiwgdGVybWluYWxfd2lkdGgsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9wcm9jZXNzKGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJaW50IGksIGxlbjsKKwljaGFyICpwID0gYnVmZmVyOworCWkgPSAwOworCWlmIChvdXRfY250KSB3aGlsZSAoMSkgeworCQlvdXRbaV0uZihwLCBvdXRbaV0ud2lkdGgsIHBzKTsKKwkJLy8gUE9TSVg6IEFueSBmaWVsZCBuZWVkIG5vdCBiZSBtZWFuaW5nZnVsIGluIGFsbAorCQkvLyBpbXBsZW1lbnRhdGlvbnMuIEluIHN1Y2ggYSBjYXNlIGEgaHlwaGVuICggJy0nICkKKwkJLy8gc2hvdWxkIGJlIG91dHB1dCBpbiBwbGFjZSBvZiB0aGUgZmllbGQgdmFsdWUuCisJCWlmICghcFswXSkgeworCQkJcFswXSA9ICctJzsKKwkJCXBbMV0gPSAnXDAnOworCQl9CisJCWxlbiA9IHN0cmxlbihwKTsKKwkJcCArPSBsZW47CisJCWxlbiA9IG91dFtpXS53aWR0aCAtIGxlbiArIDE7CisJCWlmICgrK2kgPT0gb3V0X2NudCkgLyogZG8gbm90IHBhZCBsYXN0IGZpZWxkICovCisJCQlicmVhazsKKwkJcCArPSBzcHJpbnRmKHAsICIlKnMiLCBsZW4sICIiKTsKKwl9CisJcHJpbnRmKCIlLipzXG4iLCB0ZXJtaW5hbF93aWR0aCwgYnVmZmVyKTsKK30KKworI2lmIEVOQUJMRV9TRUxJTlVYCisjIGRlZmluZSBTRUxJTlVYX09fUFJFRklYICJsYWJlbCwiCisjIGRlZmluZSBERUZBVUxUX09fU1RSICAgIChTRUxJTlVYX09fUFJFRklYICJwaWQsdXNlciIgSUZfRkVBVFVSRV9QU19USU1FKCIsdGltZSIpICIsYXJncyIpCisjZWxzZQorIyBkZWZpbmUgREVGQVVMVF9PX1NUUiAgICAoInBpZCx1c2VyIiBJRl9GRUFUVVJFX1BTX1RJTUUoIix0aW1lIikgIixhcmdzIikKKyNlbmRpZgorCitpbnQgcHNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwcm9jcHNfc3RhdHVzX3QgKnA7CisJbGxpc3RfdCogb3B0X28gPSBOVUxMOworCWNoYXIgZGVmYXVsdF9vW3NpemVvZihERUZBVUxUX09fU1RSKV07CisJaW50IG9wdDsKKwllbnVtIHsKKwkJT1BUX1ogPSAoMSA8PCAwKSwKKwkJT1BUX28gPSAoMSA8PCAxKSwKKwkJT1BUX2EgPSAoMSA8PCAyKSwKKwkJT1BUX0EgPSAoMSA8PCAzKSwKKwkJT1BUX2QgPSAoMSA8PCA0KSwKKwkJT1BUX2UgPSAoMSA8PCA1KSwKKwkJT1BUX2YgPSAoMSA8PCA2KSwKKwkJT1BUX2wgPSAoMSA8PCA3KSwKKwkJT1BUX1QgPSAoMSA8PCA4KSAqIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUywKKwl9OworCisJSU5JVF9HKCk7CisKKwkvLyBQT1NJWDoKKwkvLyAtYSAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRlcm1pbmFscworCS8vICAgICBJbXBsZW1lbnRhdGlvbnMgbWF5IG9taXQgc2Vzc2lvbiBsZWFkZXJzIGZyb20gdGhpcyBsaXN0CisJLy8gLUEgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzCisJLy8gLWQgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzLCBleGNlcHQgc2Vzc2lvbiBsZWFkZXJzCisJLy8gLWUgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzIChlcXVpdmFsZW50IHRvIC1BKQorCS8vIC1mICBHZW5lcmF0ZSBhIGZ1bGwgbGlzdGluZworCS8vIC1sICBHZW5lcmF0ZSBhIGxvbmcgbGlzdGluZworCS8vIC1vIGNvbDEsY29sMixjb2wzPWhlYWRlcgorCS8vICAgICBTZWxlY3Qgd2hpY2ggY29sdW1ucyB0byBkaXNwbGF5CisJLyogV2UgYWxsb3cgKGFuZCBpZ25vcmUpIG1vc3Qgb2YgdGhlIGFib3ZlLiBGSVhNRS4KKwkgKiAtVCBpcyBwaWNrZWQgZm9yIHRocmVhZHMgKFBPU0lYIGhhc24ndCBpdCBzdGFuZGFyZGl6ZWQpLgorCSAqIHByb2NwcyB2My4yLjcgc3VwcG9ydHMgLVQgYW5kIHNob3dzIHRpZHMgYXMgU1BJRCBjb2x1bW4sCisJICogaXQgYWxzbyBzdXBwb3J0cyAtTCB3aGVyZSBpdCBzaG93cyB0aWRzIGFzIExXUCBjb2x1bW4uCisJICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibzo6IjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiWm86YUFkZWZsIklGX0ZFQVRVUkVfU0hPV19USFJFQURTKCJUIiksICZvcHRfbyk7CisJaWYgKG9wdF9vKSB7CisJCWRvIHsKKwkJCXBhcnNlX28obGxpc3RfcG9wKCZvcHRfbykpOworCQl9IHdoaWxlIChvcHRfbyk7CisJfSBlbHNlIHsKKwkJLyogQmVsb3c6IHBhcnNlX28oKSBuZWVkcyBjaGFyKiwgTk9UIGNvbnN0IGNoYXIqLCBjYW4ndCBnaXZlIGl0IGRlZmF1bHRfbyAqLworI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmICghKG9wdCAmIE9QVF9aKSB8fCAhaXNfc2VsaW51eF9lbmFibGVkKCkpIHsKKwkJCS8qIG5vIC1aIG9yIG5vIFNFTGludXg6IGRvIG5vdCBzaG93IExBQkVMICovCisJCQlzdHJjcHkoZGVmYXVsdF9vLCBERUZBVUxUX09fU1RSICsgc2l6ZW9mKFNFTElOVVhfT19QUkVGSVgpLTEpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlzdHJjcHkoZGVmYXVsdF9vLCBERUZBVUxUX09fU1RSKTsKKwkJfQorCQlwYXJzZV9vKGRlZmF1bHRfbyk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCWlmIChvcHQgJiBPUFRfVCkKKwkJbmVlZF9mbGFncyB8PSBQU1NDQU5fVEFTS1M7CisjZW5kaWYKKworCS8qIFdhcyBJTlRfTUFYLCBidXQgc29tZSBsaWJjJ3MgZ28gYmVsbHkgdXAgd2l0aCBwcmludGYoIiUuKnMiKQorCSAqIGFuZCBzdWNoIGxhcmdlIHdpZHRocyAqLworCXRlcm1pbmFsX3dpZHRoID0gTUFYX1dJRFRIOworCWlmIChpc2F0dHkoMSkpIHsKKwkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmdGVybWluYWxfd2lkdGgsIE5VTEwpOworCQlpZiAoLS10ZXJtaW5hbF93aWR0aCA+IE1BWF9XSURUSCkKKwkJCXRlcm1pbmFsX3dpZHRoID0gTUFYX1dJRFRIOworCX0KKwlhbGxvY19saW5lX2J1ZmZlcigpOworCWZvcm1hdF9oZWFkZXIoKTsKKworCXAgPSBOVUxMOworCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIG5lZWRfZmxhZ3MpKSAhPSBOVUxMKSB7CisJCWZvcm1hdF9wcm9jZXNzKHApOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKworI2Vsc2UgLyogIUVOQUJMRV9ERVNLVE9QICovCisKKworaW50IHBzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXByb2Nwc19zdGF0dXNfdCAqcDsKKwlpbnQgcHNzY2FuX2ZsYWdzID0gUFNTQ0FOX1BJRCB8IFBTU0NBTl9VSURHSUQKKwkJCXwgUFNTQ0FOX1NUQVRFIHwgUFNTQ0FOX1ZTWiB8IFBTU0NBTl9DT01NOworCXVuc2lnbmVkIHRlcm1pbmFsX3dpZHRoIElGX05PVF9GRUFUVVJFX1BTX1dJREUoPSA3OSk7CisJZW51bSB7CisJCU9QVF9aID0gKDEgPDwgMCkgKiBFTkFCTEVfU0VMSU5VWCwKKwkJT1BUX1QgPSAoMSA8PCBFTkFCTEVfU0VMSU5VWCkgKiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMsCisJfTsKKwlpbnQgb3B0cyA9IDA7CisJLyogSWYgd2Ugc3VwcG9ydCBhbnkgb3B0aW9ucywgcGFyc2UgYXJndiAqLworI2lmIEVOQUJMRV9TRUxJTlVYIHx8IEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUyB8fCBFTkFCTEVfRkVBVFVSRV9QU19XSURFCisjIGlmIEVOQUJMRV9GRUFUVVJFX1BTX1dJREUKKwkvKiAtdyBpcyBhIGJpdCBjb21wbGljYXRlZCAqLworCWludCB3X2NvdW50ID0gMDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItOnd3IjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgSUZfU0VMSU5VWCgiWiIpSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoIlQiKSJ3IiwgJndfY291bnQpOworCS8qIGlmIHcgaXMgZ2l2ZW4gb25jZSwgR05VIHBzIHNldHMgdGhlIHdpZHRoIHRvIDEzMiwKKwkgKiBpZiB3IGlzIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBpdCBpcyAidW5saW1pdGVkIgorCSAqLworCWlmICh3X2NvdW50KSB7CisJCXRlcm1pbmFsX3dpZHRoID0gKHdfY291bnQgPT0gMSkgPyAxMzIgOiBNQVhfV0lEVEg7CisJfSBlbHNlIHsKKwkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmdGVybWluYWxfd2lkdGgsIE5VTEwpOworCQkvKiBHbyBvbmUgbGVzcy4uLiAqLworCQlpZiAoLS10ZXJtaW5hbF93aWR0aCA+IE1BWF9XSURUSCkKKwkJCXRlcm1pbmFsX3dpZHRoID0gTUFYX1dJRFRIOworCX0KKyMgZWxzZQorCS8qIC13IGlzIG5vdCBzdXBwb3J0ZWQsIG9ubHkgLVogYW5kL29yIC1UICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLSI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIElGX1NFTElOVVgoIloiKUlGX0ZFQVRVUkVfU0hPV19USFJFQURTKCJUIikpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmICgob3B0cyAmIE9QVF9aKSAmJiBpc19zZWxpbnV4X2VuYWJsZWQoKSkgeworCQlwc3NjYW5fZmxhZ3MgPSBQU1NDQU5fUElEIHwgUFNTQ0FOX0NPTlRFWFQKKwkJCQl8IFBTU0NBTl9TVEFURSB8IFBTU0NBTl9DT01NOworCQlwdXRzKCIgIFBJRCBDT05URVhUICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUIENPTU1BTkQiKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJcHV0cygiICBQSUQgVVNFUiAgICAgICBWU1ogU1RBVCBDT01NQU5EIik7CisJfQorCWlmIChvcHRzICYgT1BUX1QpIHsKKwkJcHNzY2FuX2ZsYWdzIHw9IFBTU0NBTl9UQVNLUzsKKwl9CisKKwlwID0gTlVMTDsKKwl3aGlsZSAoKHAgPSBwcm9jcHNfc2NhbihwLCBwc3NjYW5fZmxhZ3MpKSAhPSBOVUxMKSB7CisJCWludCBsZW47CisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKHBzc2Nhbl9mbGFncyAmIFBTU0NBTl9DT05URVhUKSB7CisJCQlsZW4gPSBwcmludGYoIiU1dSAlLTMyLjMycyAlcyAgIiwKKwkJCQkJcC0+cGlkLAorCQkJCQlwLT5jb250ZXh0ID8gcC0+Y29udGV4dCA6ICJ1bmtub3duIiwKKwkJCQkJcC0+c3RhdGUpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQljb25zdCBjaGFyICp1c2VyID0gZ2V0X2NhY2hlZF91c2VybmFtZShwLT51aWQpOworCQkJLy9pZiAocC0+dnN6ID09IDApCisJCQkvLwlsZW4gPSBwcmludGYoIiU1dSAlLTguOHMgICAgICAgICVzICIsCisJCQkvLwkJcC0+cGlkLCB1c2VyLCBwLT5zdGF0ZSk7CisJCQkvL2Vsc2UKKwkJCXsKKwkJCQljaGFyIGJ1ZjZbNl07CisJCQkJc21hcnRfdWxsdG9hNShwLT52c3osIGJ1ZjYsICIgbWd0cGV6eSIpOworCQkJCWJ1ZjZbNV0gPSAnXDAnOworCQkJCWxlbiA9IHByaW50ZigiJTV1ICUtOC44cyAlcyAlcyAgIiwKKwkJCQkJcC0+cGlkLCB1c2VyLCBidWY2LCBwLT5zdGF0ZSk7CisJCQl9CisJCX0KKworCQl7CisJCQlpbnQgc3ogPSB0ZXJtaW5hbF93aWR0aCAtIGxlbjsKKwkJCWNoYXIgYnVmW3N6ICsgMV07CisJCQlyZWFkX2NtZGxpbmUoYnVmLCBzeiwgcC0+cGlkLCBwLT5jb21tKTsKKwkJCXB1dHMoYnVmKTsKKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsZWFyX3VzZXJuYW1lX2NhY2hlKCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworI2VuZGlmIC8qICFFTkFCTEVfREVTS1RPUCAqLwpkaWZmIC0tZ2l0IGEvcHJvY3BzL3BzLnBvc2l4IGIvcHJvY3BzL3BzLnBvc2l4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjRmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvcHMucG9zaXgKQEAgLTAsMCArMSwxNzUgQEAKK1RoaXMgaXMgd2hhdCBQT1NJWCAyMDAzIHNheXMgYWJvdXQgcHM6CisKK0J5IGRlZmF1bHQsIHBzIHNoYWxsIHNlbGVjdCAgYWxsIHByb2Nlc3NlcyB3aXRoIHRoZSBzYW1lIGVmZmVjdGl2ZSB1c2VyCitJRCBhcyB0aGUgY3VycmVudCB1c2VyIGFuZCB0aGUgc2FtZSBjb250cm9sbGluZyB0ZXJtaW5hbCBhcyB0aGUgaW52b2tlcgorCitwcyBbLWFBXVstZGVmbF1bLUcgZ3JvdXBsaXN0XVstbyBmb3JtYXRdLi4uWy1wIHByb2NsaXN0XVstdCB0ZXJtbGlzdF0KK1stVSB1c2VybGlzdF1bLWcgZ3JvdXBsaXN0XVstbiBuYW1lbGlzdF1bLXUgdXNlcmxpc3RdCisKKy1hICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3NlcyBhc3NvY2lhdGVkICB3aXRoICB0ZXJtaW5hbHMuCisgICAgICAgSW1wbGVtZW50YXRpb25zIG1heSBvbWl0IHNlc3Npb24gbGVhZGVycyBmcm9tIHRoaXMgbGlzdC4KKworLUEgICAgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzLgorCistZCAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMsIGV4Y2VwdCBzZXNzaW9uIGxlYWRlcnMuCisKKy1lICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3Nlcy4gIChFcXVpdmFsZW50IHRvIC1BLikKKworLWYgICAgIEdlbmVyYXRlICBhICBmdWxsICBsaXN0aW5nLiAoU2VlIHRoZSBTVERPVVQgc2VjdGlvbiBmb3IgdGhlIGNvbi0KKyAgICAgICB0ZW50cyBvZiBhIGZ1bGwgbGlzdGluZy4pCisKKy1nICBncm91cGxpc3QKKyAgICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgcHJvY2Vzc2VzIHdob3NlIHNlc3Npb24gbGVhZGVycyBhcmUgIGdpdmVuCisgICAgICAgaW4gZ3JvdXBsaXN0LiBUaGUgYXBwbGljYXRpb24gc2hhbGwgZW5zdXJlIHRoYXQgdGhlIGdyb3VwbGlzdCBpcworICAgICAgIGEgc2luZ2xlIGFyZ3VtZW50IGluIHRoZSBmb3JtIG9mIGEgIDxibGFuaz4gIG9yICBjb21tYS1zZXBhcmF0ZWQKKyAgICAgICBsaXN0LgorCistRyAgZ3JvdXBsaXN0CisgICAgICAgV3JpdGUgIGluZm9ybWF0aW9uIGZvciBwcm9jZXNzZXMgd2hvc2UgcmVhbCBncm91cCBJRCBudW1iZXJzIGFyZQorICAgICAgIGdpdmVuIGluIGdyb3VwbGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSB0aGF0IHRoZSAgZ3JvdS0KKyAgICAgICBwbGlzdCAgaXMgIGEgIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhIDxibGFuaz4gb3IgY29tbWEtCisgICAgICAgc2VwYXJhdGVkIGxpc3QuCisKKy1sICAgICBHZW5lcmF0ZSBhIGxvbmcgbGlzdGluZy4gKFNlZSBTVERPVVQgZm9yIHRoZSBjb250ZW50cyBvZiBhICBsb25nCisgICAgICAgbGlzdGluZy4pCisKKy1uICBuYW1lbGlzdAorICAgICAgIFNwZWNpZnkgdGhlIG5hbWUgb2YgYW4gYWx0ZXJuYXRpdmUgc3lzdGVtIG5hbWVsaXN0IGZpbGUgaW4gcGxhY2UKKyAgICAgICBvZiB0aGUgZGVmYXVsdC4gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgZmlsZSBhbmQgdGhlIGZvcm1hdCBvZiBhCisgICAgICAgbmFtZWxpc3QgZmlsZSBhcmUgdW5zcGVjaWZpZWQuCisKKy1vICBmb3JtYXQKKyAgICAgICBXcml0ZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGdpdmVuIGluCisgICAgICAgZm9ybWF0LiAgTXVsdGlwbGUgLW8gb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkOyB0aGUgZm9ybWF0IHNwZWNpLQorICAgICAgIGZpY2F0aW9uIHNoYWxsIGJlIGludGVycHJldGVkIGFzIHRoZSAgPHNwYWNlPi1zZXBhcmF0ZWQgY29uY2F0ZS0KKyAgICAgICBuYXRpb24gb2YgYWxsIHRoZSBmb3JtYXQgb3B0aW9uLWFyZ3VtZW50cy4KKworLXAgIHByb2NsaXN0CisgICAgICAgV3JpdGUgIGluZm9ybWF0aW9uICBmb3IgIHByb2Nlc3NlcyAgd2hvc2UgcHJvY2VzcyBJRCBudW1iZXJzIGFyZQorICAgICAgIGdpdmVuIGluIHByb2NsaXN0LiBUaGUgYXBwbGljYXRpb24gc2hhbGwgZW5zdXJlICB0aGF0ICB0aGUgIHByby0KKyAgICAgICBjbGlzdCAgaXMgIGEgIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhIDxibGFuaz4gb3IgY29tbWEtCisgICAgICAgc2VwYXJhdGVkIGxpc3QuCisKKy10ICB0ZXJtbGlzdAorICAgICAgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBwcm9jZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRlcm1pbmFscyAgZ2l2ZW4KKyAgICAgICBpbiB0ZXJtbGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSB0aGF0IHRoZSB0ZXJtbGlzdCBpcyBhCisgICAgICAgc2luZ2xlIGFyZ3VtZW50IGluIHRoZSBmb3JtICBvZiAgYSAgPGJsYW5rPiAgb3IgIGNvbW1hLXNlcGFyYXRlZAorICAgICAgIGxpc3QuICBUZXJtaW5hbCBpZGVudGlmaWVycyBzaGFsbCBiZSBnaXZlbiBpbiBhbiBpbXBsZW1lbnRhdGlvbi0KKyAgICAgICBkZWZpbmVkIGZvcm1hdC4gICAgT24gIFhTSS1jb25mb3JtYW50ICBzeXN0ZW1zLCAgdGhleSAgc2hhbGwgIGJlCisgICAgICAgZ2l2ZW4gIGluICBvbmUgb2YgdHdvIGZvcm1zOiB0aGUgZGV2aWNlJ3MgZmlsZW5hbWUgKGZvciBleGFtcGxlLAorICAgICAgIHR0eTA0KSBvciwgaWYgdGhlIGRldmljZSdzIGZpbGVuYW1lIHN0YXJ0cyB3aXRoICB0dHksICBqdXN0ICB0aGUKKyAgICAgICBpZGVudGlmaWVyIGZvbGxvd2luZyB0aGUgY2hhcmFjdGVycyB0dHkgKGZvciBleGFtcGxlLCAiMDQiICkuCisKKy11ICB1c2VybGlzdAorICAgICAgIFdyaXRlICBpbmZvcm1hdGlvbiAgZm9yIHByb2Nlc3NlcyB3aG9zZSB1c2VyIElEIG51bWJlcnMgb3IgbG9naW4KKyAgICAgICBuYW1lcyBhcmUgZ2l2ZW4gaW4gdXNlcmxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCAgZW5zdXJlICB0aGF0CisgICAgICAgdGhlICB1c2VybGlzdCAgaXMgIGEgc2luZ2xlIGFyZ3VtZW50IGluIHRoZSBmb3JtIG9mIGEgPGJsYW5rPiBvcgorICAgICAgIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBJbiB0aGUgIGxpc3RpbmcsICB0aGUgIG51bWVyaWNhbCAgdXNlciAgSUQKKyAgICAgICBzaGFsbCBiZSB3cml0dGVuIHVubGVzcyB0aGUgLWYgb3B0aW9uIGlzIHVzZWQsIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICAgbG9naW4gbmFtZSBzaGFsbCBiZSB3cml0dGVuLgorCistVSAgdXNlcmxpc3QKKyAgICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgcHJvY2Vzc2VzIHdob3NlIHJlYWwgdXNlciAgSUQgIG51bWJlcnMgIG9yCisgICAgICAgbG9naW4gIG5hbWVzIGFyZSBnaXZlbiBpbiB1c2VybGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZQorICAgICAgIHRoYXQgdGhlIHVzZXJsaXN0IGlzIGEgc2luZ2xlIGFyZ3VtZW50IGluIHRoZSBmb3JtIG9mIGEgIDxibGFuaz4KKyAgICAgICBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KKworV2l0aCAgdGhlICBleGNlcHRpb24gb2YgLW8gZm9ybWF0LCBhbGwgb2YgdGhlIG9wdGlvbnMgc2hvd24gYXJlIHVzZWQgdG8KK3NlbGVjdCBwcm9jZXNzZXMuIElmIGFueSBhcmUgIHNwZWNpZmllZCwgIHRoZSAgZGVmYXVsdCAgbGlzdCAgc2hhbGwgIGJlCitpZ25vcmVkICBhbmQgcHMgc2hhbGwgc2VsZWN0IHRoZSBwcm9jZXNzZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGluY2x1c2l2ZQorT1Igb2YgYWxsIHRoZSBzZWxlY3Rpb24tY3JpdGVyaWEgb3B0aW9ucy4KKworVGhlICAtbyBvcHRpb24gYWxsb3dzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGJlIHNwZWNpZmllZCB1bmRlciB1c2VyIGNvbi0KK3Ryb2wuCisKK1RoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUgdGhhdCB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgYSBsaXN0IG9mCituYW1lcyAgcHJlc2VudGVkIGFzIGEgc2luZ2xlIGFyZ3VtZW50LCA8Ymxhbms+IG9yIGNvbW1hLXNlcGFyYXRlZC4gRWFjaAordmFyaWFibGUgaGFzIGEgZGVmYXVsdCBoZWFkZXIuIFRoZSBkZWZhdWx0IGhlYWRlciBjYW4gYmUgb3ZlcnJpZGRlbiAgYnkKK2FwcGVuZGluZyAgYW4gIGVxdWFscyAgc2lnbiBhbmQgdGhlIG5ldyB0ZXh0IG9mIHRoZSBoZWFkZXIuIFRoZSByZXN0IG9mCit0aGUgY2hhcmFjdGVycyBpbiB0aGUgYXJndW1lbnQgc2hhbGwgYmUgdXNlZCBhcyB0aGUgIGhlYWRlciAgdGV4dC4gIFRoZQorZmllbGRzIHNwZWNpZmllZCBzaGFsbCBiZSB3cml0dGVuIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQKK2xpbmUsIGFuZCBzaG91bGQgYmUgYXJyYW5nZWQgaW4gY29sdW1ucyBpbiB0aGUgb3V0cHV0LiBUaGUgZmllbGQgd2lkdGhzCitzaGFsbCAgYmUgIHNlbGVjdGVkICBieSB0aGUgc3lzdGVtIHRvIGJlIGF0IGxlYXN0IGFzIHdpZGUgYXMgdGhlIGhlYWRlcgordGV4dCAoZGVmYXVsdCBvciBvdmVycmlkZGVuIHZhbHVlKS4gSWYgdGhlIGhlYWRlciB0ZXh0IGlzIG51bGwsIHN1Y2ggYXMKKy1vICB1c2VyPSwgIHRoZSAgZmllbGQgIHdpZHRoICBzaGFsbCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHRoZSBkZWZhdWx0CitoZWFkZXIgdGV4dC4gSWYgYWxsIGhlYWRlciB0ZXh0IGZpZWxkcyBhcmUgbnVsbCwgbm8gaGVhZGVyICBsaW5lICBzaGFsbAorYmUgd3JpdHRlbi4KKworcnVzZXIgIFRoZSAgcmVhbCB1c2VyIElEIG9mIHRoZSBwcm9jZXNzLiBUaGlzIHNoYWxsIGJlIHRoZSB0ZXh0dWFsIHVzZXIKKyAgICAgICBJRCwgaWYgaXQgY2FuIGJlIG9idGFpbmVkIGFuZCB0aGUgZmllbGQgd2lkdGggcGVybWl0cywgb3IgYSBkZWMtCisgICAgICAgaW1hbCByZXByZXNlbnRhdGlvbiBvdGhlcndpc2UuCisKK3VzZXIgICBUaGUgIGVmZmVjdGl2ZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzLiBUaGlzIHNoYWxsIGJlIHRoZSB0ZXh0dWFsCisgICAgICAgdXNlciBJRCwgaWYgaXQgY2FuIGJlIG9idGFpbmVkIGFuZCB0aGUgZmllbGQgd2lkdGggcGVybWl0cywgb3IgYQorICAgICAgIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb3RoZXJ3aXNlLgorCityZ3JvdXAgVGhlICByZWFsICBncm91cCAgSUQgIG9mICB0aGUgcHJvY2Vzcy4gVGhpcyBzaGFsbCBiZSB0aGUgdGV4dHVhbAorICAgICAgIGdyb3VwIElELCBpZiBpdCBjYW4gYmUgb2J0YWluZWQgYW5kIHRoZSBmaWVsZCB3aWR0aCBwZXJtaXRzLCAgb3IKKyAgICAgICBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb3RoZXJ3aXNlLgorCitncm91cCAgVGhlIGVmZmVjdGl2ZSBncm91cCBJRCBvZiB0aGUgcHJvY2Vzcy4gVGhpcyBzaGFsbCBiZSB0aGUgdGV4dHVhbAorICAgICAgIGdyb3VwIElELCBpZiBpdCBjYW4gYmUgb2J0YWluZWQgYW5kIHRoZSBmaWVsZCB3aWR0aCBwZXJtaXRzLCAgb3IKKyAgICAgICBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb3RoZXJ3aXNlLgorCitwaWQgICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHByb2Nlc3MgSUQuCisKK3BwaWQgICBUaGUgZGVjaW1hbCB2YWx1ZSBvZiB0aGUgcGFyZW50IHByb2Nlc3MgSUQuCisKK3BnaWQgICBUaGUgZGVjaW1hbCB2YWx1ZSBvZiB0aGUgcHJvY2VzcyBncm91cCBJRC4KKworcGNwdSAgIFRoZSByYXRpbyBvZiBDUFUgdGltZSB1c2VkIHJlY2VudGx5IHRvIENQVSB0aW1lIGF2YWlsYWJsZSBpbiB0aGUKKyAgICAgICBzYW1lICBwZXJpb2QsICBleHByZXNzZWQgIGFzICBhICBwZXJjZW50YWdlLiAgVGhlICAgbWVhbmluZyAgIG9mCisgICAgICAgInJlY2VudGx5IiAgaW4gIHRoaXMgY29udGV4dCBpcyB1bnNwZWNpZmllZC4gVGhlIENQVSB0aW1lIGF2YWlsLQorICAgICAgIGFibGUgaXMgZGV0ZXJtaW5lZCBpbiBhbiB1bnNwZWNpZmllZCBtYW5uZXIuCisKK3ZzeiAgICBUaGUgc2l6ZSBvZiB0aGUgcHJvY2VzcyBpbiAodmlydHVhbCkgbWVtb3J5IGluIDEwMjQgIGJ5dGUgIHVuaXRzCisgICAgICAgYXMgYSBkZWNpbWFsIGludGVnZXIuCisKK25pY2UgICBUaGUgZGVjaW1hbCB2YWx1ZSBvZiB0aGUgbmljZSB2YWx1ZSBvZiB0aGUgcHJvY2Vzczsgc2VlIG5pY2UoKSAuCisKK2V0aW1lICBJbiB0aGUgUE9TSVggbG9jYWxlLCB0aGUgZWxhcHNlZCAgdGltZSAgc2luY2UgIHRoZSAgcHJvY2VzcyAgd2FzCisgICAgICAgc3RhcnRlZCwgaW4gdGhlIGZvcm06IFtbZGQtXWhoOl1tbTpzcworCit0aW1lICAgSW4gdGhlIFBPU0lYIGxvY2FsZSwgdGhlIGN1bXVsYXRpdmUgQ1BVIHRpbWUgb2YgdGhlICBwcm9jZXNzICBpbgorICAgICAgIHRoZSBmb3JtOiBbZGQtXWhoOm1tOnNzCisKK3R0eSAgICBUaGUgbmFtZSBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgb2YgdGhlIHByb2Nlc3MgKGlmIGFueSkgIGluCisgICAgICAgdGhlIHNhbWUgZm9ybWF0IHVzZWQgYnkgdGhlIHdobyB1dGlsaXR5LgorCitjb21tICAgVGhlICBuYW1lICBvZiAgdGhlICBjb21tYW5kIGJlaW5nIGV4ZWN1dGVkICggYXJndlswXSB2YWx1ZSkgYXMgYQorICAgICAgIHN0cmluZy4KKworYXJncyAgIFRoZSBjb21tYW5kIHdpdGggYWxsIGl0cyBhcmd1bWVudHMgYXMgYSBzdHJpbmcuIFRoZSAgaW1wbGVtZW50YS0KKyAgICAgICB0aW9uIG1heSB0cnVuY2F0ZSB0aGlzIHZhbHVlIHRvIHRoZSBmaWVsZCB3aWR0aDsgaXQgaXMgaW1wbGVtZW4tCisgICAgICAgdGF0aW9uLWRlZmluZWQgd2hldGhlciBhbnkgIGZ1cnRoZXIgIHRydW5jYXRpb24gIG9jY3Vycy4gIEl0ICBpcworICAgICAgIHVuc3BlY2lmaWVkICB3aGV0aGVyICB0aGUgc3RyaW5nIHJlcHJlc2VudGVkIGlzIGEgdmVyc2lvbiBvZiB0aGUKKyAgICAgICBhcmd1bWVudCBsaXN0IGFzIGl0IHdhcyBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgd2hlbiAgaXQgIHN0YXJ0ZWQsCisgICAgICAgb3IgIGlzIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnRzIGFzIHRoZXkgbWF5IGhhdmUgYmVlbiBtb2RpZmllZAorICAgICAgIGJ5IHRoZSBhcHBsaWNhdGlvbi4gQXBwbGljYXRpb25zIGNhbm5vdCBkZXBlbmQgb24gYmVpbmcgYWJsZSAgdG8KKyAgICAgICBtb2RpZnkgIHRoZWlyICBhcmd1bWVudCAgbGlzdCAgYW5kICBoYXZpbmcgIHRoYXQgbW9kaWZpY2F0aW9uIGJlCisgICAgICAgcmVmbGVjdGVkIGluIHRoZSBvdXRwdXQgb2YgcHMuCisKK0FueSBmaWVsZCBuZWVkIG5vdCBiZSBtZWFuaW5nZnVsIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuIEluIHN1Y2ggYSBjYXNlCithIGh5cGhlbiAoICctJyApIHNob3VsZCBiZSBvdXRwdXQgaW4gcGxhY2Ugb2YgdGhlIGZpZWxkIHZhbHVlLgorCitPbmx5ICBjb21tICBhbmQgIGFyZ3MgIHNoYWxsIGJlIGFsbG93ZWQgdG8gY29udGFpbiA8Ymxhbms+czsgYWxsIG90aGVycworc2hhbGwgbm90LgorCitUaGUgZm9sbG93aW5nIHRhYmxlIHNwZWNpZmllcyB0aGUgZGVmYXVsdCBoZWFkZXIgIHRvICBiZSAgdXNlZCAgaW4gIHRoZQorUE9TSVggbG9jYWxlIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBmb3JtYXQgc3BlY2lmaWVyLgorCisgICAgRm9ybWF0IFNwZWNpZmllciBEZWZhdWx0IEhlYWRlciBGb3JtYXQgU3BlY2lmaWVyIERlZmF1bHQgSGVhZGVyCisgICAgYXJncyAgICAgICAgICAgICBDT01NQU5EICAgICAgICBwcGlkICAgICAgICAgICAgIFBQSUQKKyAgICBjb21tICAgICAgICAgICAgIENPTU1BTkQgICAgICAgIHJncm91cCAgICAgICAgICAgUkdST1VQCisgICAgZXRpbWUgICAgICAgICAgICBFTEFQU0VEICAgICAgICBydXNlciAgICAgICAgICAgIFJVU0VSCisgICAgZ3JvdXAgICAgICAgICAgICBHUk9VUCAgICAgICAgICB0aW1lICAgICAgICAgICAgIFRJTUUKKyAgICBuaWNlICAgICAgICAgICAgIE5JICAgICAgICAgICAgIHR0eSAgICAgICAgICAgICAgVFQKKyAgICBwY3B1ICAgICAgICAgICAgICVDUFUgICAgICAgICAgIHVzZXIgICAgICAgICAgICAgVVNFUgorICAgIHBnaWQgICAgICAgICAgICAgUEdJRCAgICAgICAgICAgdnN6ICAgICAgICAgICAgICBWU1oKKyAgICBwaWQgICAgICAgICAgICAgIFBJRAorCitUaGVyZSAgaXMgbm8gc3BlY2lhbCBxdW90aW5nIG1lY2hhbmlzbSBmb3IgaGVhZGVyIHRleHQuIFRoZSBoZWFkZXIgdGV4dAoraXMgdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50LiBJZiBtdWx0aXBsZSAgaGVhZGVyICBjaGFuZ2VzICBhcmUgIG5lZWRlZCwKK211bHRpcGxlIC1vIG9wdGlvbnMgY2FuIGJlIHVzZWQsIHN1Y2ggYXM6CisKKyAgICAgICAgcHMgLW8gInVzZXI9VXNlciBOYW1lIiAtbyBwaWQ9UHJvY2Vzc1wgSUQKZGlmZiAtLWdpdCBhL3Byb2Nwcy9wc3RyZWUuYyBiL3Byb2Nwcy9wc3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmEzMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BzdHJlZS5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogcHN0cmVlLmMgLSBkaXNwbGF5IHByb2Nlc3MgdHJlZQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5My0yMDAyIFdlcm5lciBBbG1lc2JlcmdlcgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDkgQ3JhaWcgU21hbGwKKyAqIENvcHlyaWdodCAoQykgMjAxMCBMYXVyaSBLYXNhbmVuCisgKgorICogQmFzZWQgb24gcHN0cmVlIChQU21pc2MpIDIyLjEzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFBTVFJFRQorLy9jb25maWc6CWJvb2wgInBzdHJlZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBEaXNwbGF5IGEgdHJlZSBvZiBwcm9jZXNzZXMuCisKKy8vYXBwbGV0OklGX1BTVFJFRShBUFBMRVQocHN0cmVlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BTVFJFRSkgKz0gcHN0cmVlLm8KKworLy91c2FnZTojZGVmaW5lIHBzdHJlZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1wXSBbUElEfFVTRVJdIgorLy91c2FnZTojZGVmaW5lIHBzdHJlZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgcHJvY2VzcyB0cmVlLCBvcHRpb25hbGx5IHN0YXJ0IGZyb20gVVNFUiBvciBQSURcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJU2hvdyBwaWRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBQUk9DX0JBU0UgIi9wcm9jIgorCisjZGVmaW5lIE9QVF9QSUQgICgxIDw8IDApCisKK3N0cnVjdCBjaGlsZDsKKwordHlwZWRlZiBzdHJ1Y3QgcHJvYyB7CisJY2hhciBjb21tW0NPTU1fTEVOICsgMV07CisvLwljaGFyIGZsYWdzOyAtIHVudXNlZCwgZGVsZXRlPworCXBpZF90IHBpZDsKKwl1aWRfdCB1aWQ7CisJc3RydWN0IGNoaWxkICpjaGlsZHJlbjsKKwlzdHJ1Y3QgcHJvYyAqcGFyZW50OworCXN0cnVjdCBwcm9jICpuZXh0OworfSBQUk9DOworCisvKiBGb3IgZmxhZ3MgYWJvdmUgKi8KKy8vI2RlZmluZSBQRkxBR19USFJFQUQgIDB4MDEKKwordHlwZWRlZiBzdHJ1Y3QgY2hpbGQgeworCVBST0MgKmNoaWxkOworCXN0cnVjdCBjaGlsZCAqbmV4dDsKK30gQ0hJTEQ7CisKKyNkZWZpbmUgZW1wdHlfMiAgIiAgIgorI2RlZmluZSBicmFuY2hfMiAifC0iCisjZGVmaW5lIHZlcnRfMiAgICJ8ICIKKyNkZWZpbmUgbGFzdF8yICAgImAtIgorI2RlZmluZSBzaW5nbGVfMyAiLS0tIgorI2RlZmluZSBmaXJzdF8zICAiLSstIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogMC1iYXNlZC4gSU9XOiB0aGUgbnVtYmVyIG9mIGNoYXJzIHdlIHByaW50ZWQgb24gY3VycmVudCBsaW5lICovCisJdW5zaWduZWQgY3VyX3g7CisJdW5zaWduZWQgb3V0cHV0X3dpZHRoOworCisJLyogVGhlIGJ1ZmZlcnMgd2lsbCBiZSBkeW5hbWljYWxseSBpbmNyZWFzZWQgaW4gc2l6ZSBhcyBuZWVkZWQgKi8KKwl1bnNpZ25lZCBjYXBhY2l0eTsKKwl1bnNpZ25lZCAqd2lkdGg7CisJdWludDhfdCAqbW9yZTsKKworCVBST0MgKmxpc3Q7CisKKwlzbWFsbGludCBkdW1wZWQ7IC8qIHVzZWQgYnkgZHVtcF9ieV91c2VyICovCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBBbGxvY2F0ZXMgYWRkaXRpb25hbCBidWZmZXIgc3BhY2UgZm9yIHdpZHRoIGFuZCBtb3JlIGFzIG5lZWRlZC4KKyAqIFRoZSBmaXJzdCBjYWxsIHdpbGwgYWxsb2NhdGUgdGhlIGZpcnN0IGJ1ZmZlci4KKyAqCisgKiBidWZpbmRleCAgdGhlIGluZGV4IHRoYXQgd2lsbCBiZSB1c2VkIGFmdGVyIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGVuc3VyZV9idWZmZXJfY2FwYWNpdHkoaW50IGJ1ZmluZGV4KQoreworCWlmIChidWZpbmRleCA+PSBHLmNhcGFjaXR5KSB7CisJCUcuY2FwYWNpdHkgKz0gMHgxMDA7CisJCUcud2lkdGggPSB4cmVhbGxvYyhHLndpZHRoLCBHLmNhcGFjaXR5ICogc2l6ZW9mKEcud2lkdGhbMF0pKTsKKwkJRy5tb3JlID0geHJlYWxsb2MoRy5tb3JlLCBHLmNhcGFjaXR5ICogc2l6ZW9mKEcubW9yZVswXSkpOworCX0KK30KKworLyogTkI6IHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkIHdpdGggImJhZCIgY2hhcnMKKyAqIChjb250cm9sIGNoYXJzIG9yIGNoYXJzID49IDB4N2YpCisgKi8KK3N0YXRpYyB2b2lkIG91dF9jaGFyKGNoYXIgYykKK3sKKwlHLmN1cl94Kys7CisJaWYgKEcuY3VyX3ggPiBHLm91dHB1dF93aWR0aCkKKwkJcmV0dXJuOworCWlmIChHLmN1cl94ID09IEcub3V0cHV0X3dpZHRoKQorCQljID0gJysnOworCXB1dGNoYXIoYyk7Cit9CisKKy8qIE5COiB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCB3aXRoICJiYWQiIGNoYXJzCisgKiAoY29udHJvbCBjaGFycyBvciBjaGFycyA+PSAweDdmKQorICovCitzdGF0aWMgdm9pZCBvdXRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoKnN0cikKKwkJb3V0X2NoYXIoKnN0cisrKTsKK30KKworc3RhdGljIHZvaWQgb3V0X25ld2xpbmUodm9pZCkKK3sKKwlwdXRjaGFyKCdcbicpOworCUcuY3VyX3ggPSAwOworfQorCitzdGF0aWMgUFJPQyAqZmluZF9wcm9jKHBpZF90IHBpZCkKK3sKKwlQUk9DICp3YWxrOworCisJZm9yICh3YWxrID0gRy5saXN0OyB3YWxrOyB3YWxrID0gd2Fsay0+bmV4dCkKKwkJaWYgKHdhbGstPnBpZCA9PSBwaWQpCisJCQlicmVhazsKKworCXJldHVybiB3YWxrOworfQorCitzdGF0aWMgUFJPQyAqbmV3X3Byb2MoY29uc3QgY2hhciAqY29tbSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpCit7CisJUFJPQyAqbmV3ID0geHphbGxvYyhzaXplb2YoKm5ldykpOworCisJc3RyY3B5KG5ldy0+Y29tbSwgY29tbSk7CisJbmV3LT5waWQgPSBwaWQ7CisJbmV3LT51aWQgPSB1aWQ7CisJbmV3LT5uZXh0ID0gRy5saXN0OworCisJRy5saXN0ID0gbmV3OworCXJldHVybiBHLmxpc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jaGlsZChQUk9DICpwYXJlbnQsIFBST0MgKmNoaWxkKQoreworCUNISUxEICpuZXcsICoqd2FsazsKKwlpbnQgY21wOworCisJbmV3ID0geG1hbGxvYyhzaXplb2YoKm5ldykpOworCisJbmV3LT5jaGlsZCA9IGNoaWxkOworCWZvciAod2FsayA9ICZwYXJlbnQtPmNoaWxkcmVuOyAqd2Fsazsgd2FsayA9ICYoKndhbGspLT5uZXh0KSB7CisJCWNtcCA9IHN0cmNtcCgoKndhbGspLT5jaGlsZC0+Y29tbSwgY2hpbGQtPmNvbW0pOworCQlpZiAoY21wID4gMCkKKwkJCWJyZWFrOworCQlpZiAoY21wID09IDAgJiYgKCp3YWxrKS0+Y2hpbGQtPnVpZCA+IGNoaWxkLT51aWQpCisJCQlicmVhazsKKwl9CisJbmV3LT5uZXh0ID0gKndhbGs7CisJKndhbGsgPSBuZXc7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcm9jKGNvbnN0IGNoYXIgKmNvbW0sIHBpZF90IHBpZCwgcGlkX3QgcHBpZCwKKwkJCXVpZF90IHVpZCAvKiwgY2hhciBpc3RocmVhZCovKQoreworCVBST0MgKnRoaXMsICpwYXJlbnQ7CisKKwl0aGlzID0gZmluZF9wcm9jKHBpZCk7CisJaWYgKCF0aGlzKQorCQl0aGlzID0gbmV3X3Byb2MoY29tbSwgcGlkLCB1aWQpOworCWVsc2UgeworCQlzdHJjcHkodGhpcy0+Y29tbSwgY29tbSk7CisJCXRoaXMtPnVpZCA9IHVpZDsKKwl9CisKKwlpZiAocGlkID09IHBwaWQpCisJCXBwaWQgPSAwOworLy8JaWYgKGlzdGhyZWFkKQorLy8JCXRoaXMtPmZsYWdzIHw9IFBGTEFHX1RIUkVBRDsKKworCXBhcmVudCA9IGZpbmRfcHJvYyhwcGlkKTsKKwlpZiAoIXBhcmVudCkKKwkJcGFyZW50ID0gbmV3X3Byb2MoIj8iLCBwcGlkLCAwKTsKKworCWFkZF9jaGlsZChwYXJlbnQsIHRoaXMpOworCXRoaXMtPnBhcmVudCA9IHBhcmVudDsKK30KKworc3RhdGljIGludCB0cmVlX2VxdWFsKGNvbnN0IFBST0MgKmEsIGNvbnN0IFBST0MgKmIpCit7CisJY29uc3QgQ0hJTEQgKndhbGtfYSwgKndhbGtfYjsKKworCWlmIChzdHJjbXAoYS0+Y29tbSwgYi0+Y29tbSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChvcHRpb25fbWFzazMyIC8qJiBPUFRfUElEKi8pICYmIGEtPnBpZCAhPSBiLT5waWQpCisJCXJldHVybiAwOworCisJZm9yICh3YWxrX2EgPSBhLT5jaGlsZHJlbiwgd2Fsa19iID0gYi0+Y2hpbGRyZW47CisJICB3YWxrX2EgJiYgd2Fsa19iOworCSAgd2Fsa19hID0gd2Fsa19hLT5uZXh0LCB3YWxrX2IgPSB3YWxrX2ItPm5leHQKKwkpIHsKKwkJaWYgKCF0cmVlX2VxdWFsKHdhbGtfYS0+Y2hpbGQsIHdhbGtfYi0+Y2hpbGQpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuICEod2Fsa19hIHx8IHdhbGtfYik7Cit9CisKK3N0YXRpYyBpbnQgb3V0X2FyZ3MoY29uc3QgY2hhciAqbXlzdHIpCit7CisJY29uc3QgY2hhciAqaGVyZTsKKwlpbnQgc3RyY291bnQgPSAwOworCWNoYXIgdG1wc3RyWzVdOworCisJZm9yIChoZXJlID0gbXlzdHI7ICpoZXJlOyBoZXJlKyspIHsKKwkJaWYgKCpoZXJlID09ICdcXCcpIHsKKwkJCW91dF9zdHJpbmcoIlxcXFwiKTsKKwkJCXN0cmNvdW50ICs9IDI7CisJCX0gZWxzZSBpZiAoKmhlcmUgPj0gJyAnICYmICpoZXJlIDwgMHg3ZikgeworCQkJb3V0X2NoYXIoKmhlcmUpOworCQkJc3RyY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCXNwcmludGYodG1wc3RyLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGNoYXIpICpoZXJlKTsKKwkJCW91dF9zdHJpbmcodG1wc3RyKTsKKwkJCXN0cmNvdW50ICs9IDQ7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RyY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3RyZWUoUFJPQyAqY3VycmVudCwgaW50IGxldmVsLCBpbnQgcmVwLCBpbnQgbGVhZiwgaW50IGxhc3QsIGludCBjbG9zaW5nKQoreworCUNISUxEICp3YWxrLCAqbmV4dCwgKipzY2FuOworCWludCBsdmwsIGksIGFkZCwgb2Zmc2V0LCBjb3VudCwgY29tbV9sZW4sIGZpcnN0OworCWNoYXIgdG1wW3NpemVvZihpbnQpKjMgKyA0XTsKKworCWlmICghY3VycmVudCkKKwkJcmV0dXJuOworCisJaWYgKCFsZWFmKSB7CisJCWZvciAobHZsID0gMDsgbHZsIDwgbGV2ZWw7IGx2bCsrKSB7CisJCQlpID0gRy53aWR0aFtsdmxdICsgMTsKKwkJCXdoaWxlICgtLWkgPj0gMCkKKwkJCQlvdXRfY2hhcignICcpOworCisJCQlpZiAobHZsID09IGxldmVsIC0gMSkgeworCQkJCWlmIChsYXN0KSB7CisJCQkJCW91dF9zdHJpbmcobGFzdF8yKTsKKwkJCQl9IGVsc2UgeworCQkJCQlvdXRfc3RyaW5nKGJyYW5jaF8yKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChHLm1vcmVbbHZsICsgMV0pIHsKKwkJCQkJb3V0X3N0cmluZyh2ZXJ0XzIpOworCQkJCX0gZWxzZSB7CisJCQkJCW91dF9zdHJpbmcoZW1wdHlfMik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJYWRkID0gMDsKKwlpZiAocmVwID4gMSkgeworCQlhZGQgKz0gc3ByaW50Zih0bXAsICIlZCpbIiwgcmVwKTsKKwkJb3V0X3N0cmluZyh0bXApOworCX0KKwljb21tX2xlbiA9IG91dF9hcmdzKGN1cnJlbnQtPmNvbW0pOworCWlmIChvcHRpb25fbWFzazMyIC8qJiBPUFRfUElEKi8pIHsKKwkJY29tbV9sZW4gKz0gc3ByaW50Zih0bXAsICIoJWQpIiwgKGludCljdXJyZW50LT5waWQpOworCQlvdXRfc3RyaW5nKHRtcCk7CisJfQorCW9mZnNldCA9IEcuY3VyX3g7CisKKwlpZiAoIWN1cnJlbnQtPmNoaWxkcmVuKQl7CisJCXdoaWxlIChjbG9zaW5nLS0pCisJCQlvdXRfY2hhcignXScpOworCQlvdXRfbmV3bGluZSgpOworCX0KKwllbnN1cmVfYnVmZmVyX2NhcGFjaXR5KGxldmVsKTsKKwlHLm1vcmVbbGV2ZWxdID0gIWxhc3Q7CisKKwlHLndpZHRoW2xldmVsXSA9IGNvbW1fbGVuICsgRy5jdXJfeCAtIG9mZnNldCArIGFkZDsKKwlpZiAoRy5jdXJfeCA+PSBHLm91dHB1dF93aWR0aCkgeworCQkvL291dF9zdHJpbmcoZmlyc3RfMyk7IC0gd2h5PyBpdCB3b24ndCBwcmludCBhbnl0aGluZworCQkvL291dF9jaGFyKCcrJyk7CisJCW91dF9uZXdsaW5lKCk7CisJCXJldHVybjsKKwl9CisKKwlmaXJzdCA9IDE7CisJZm9yICh3YWxrID0gY3VycmVudC0+Y2hpbGRyZW47IHdhbGs7IHdhbGsgPSBuZXh0KSB7CisJCWNvdW50ID0gMDsKKwkJbmV4dCA9IHdhbGstPm5leHQ7CisJCXNjYW4gPSAmd2Fsay0+bmV4dDsKKwkJd2hpbGUgKCpzY2FuKSB7CisJCQlpZiAoIXRyZWVfZXF1YWwod2Fsay0+Y2hpbGQsICgqc2NhbiktPmNoaWxkKSkKKwkJCQlzY2FuID0gJigqc2NhbiktPm5leHQ7CisJCQllbHNlIHsKKwkJCQlpZiAobmV4dCA9PSAqc2NhbikKKwkJCQkJbmV4dCA9ICgqc2NhbiktPm5leHQ7CisJCQkJY291bnQrKzsKKwkJCQkqc2NhbiA9ICgqc2NhbiktPm5leHQ7CisJCQl9CisJCX0KKwkJaWYgKGZpcnN0KSB7CisJCQlvdXRfc3RyaW5nKG5leHQgPyBmaXJzdF8zIDogc2luZ2xlXzMpOworCQkJZmlyc3QgPSAwOworCQl9CisKKwkJZHVtcF90cmVlKHdhbGstPmNoaWxkLCBsZXZlbCArIDEsIGNvdW50ICsgMSwKKwkJCQl3YWxrID09IGN1cnJlbnQtPmNoaWxkcmVuLCAhbmV4dCwKKwkJCQljbG9zaW5nICsgKGNvdW50ID8gMSA6IDApKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYnlfdXNlcihQUk9DICpjdXJyZW50LCB1aWRfdCB1aWQpCit7CisJY29uc3QgQ0hJTEQgKndhbGs7CisKKwlpZiAoIWN1cnJlbnQpCisJCXJldHVybjsKKworCWlmIChjdXJyZW50LT51aWQgPT0gdWlkKSB7CisJCWlmIChHLmR1bXBlZCkKKwkJCXB1dGNoYXIoJ1xuJyk7CisJCWR1bXBfdHJlZShjdXJyZW50LCAwLCAxLCAxLCAxLCAwKTsKKwkJRy5kdW1wZWQgPSAxOworCQlyZXR1cm47CisJfQorCWZvciAod2FsayA9IGN1cnJlbnQtPmNoaWxkcmVuOyB3YWxrOyB3YWxrID0gd2Fsay0+bmV4dCkKKwkJZHVtcF9ieV91c2VyKHdhbGstPmNoaWxkLCB1aWQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCitzdGF0aWMgdm9pZCBoYW5kbGVfdGhyZWFkKGNvbnN0IGNoYXIgKmNvbW0sIHBpZF90IHBpZCwgcGlkX3QgcHBpZCwgdWlkX3QgdWlkKQoreworCWNoYXIgdGhyZWFkbmFtZVtDT01NX0xFTiArIDJdOworCXNwcmludGYodGhyZWFkbmFtZSwgInslLipzfSIsIENPTU1fTEVOIC0gMiwgY29tbSk7CisJYWRkX3Byb2ModGhyZWFkbmFtZSwgcGlkLCBwcGlkLCB1aWQvKiwgMSovKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtcmVhZF9wcm9jKHZvaWQpCit7CisJcHJvY3BzX3N0YXR1c190ICpwID0gTlVMTDsKKwlwaWRfdCBwYXJlbnQgPSAwOworCWludCBmbGFncyA9IFBTU0NBTl9DT01NIHwgUFNTQ0FOX1BJRCB8IFBTU0NBTl9QUElEIHwgUFNTQ0FOX1VJREdJRCB8IFBTU0NBTl9UQVNLUzsKKworCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIGZsYWdzKSkgIT0gTlVMTCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCQlpZiAocC0+cGlkICE9IHAtPm1haW5fdGhyZWFkX3BpZCkKKwkJCWhhbmRsZV90aHJlYWQocC0+Y29tbSwgcC0+cGlkLCBwYXJlbnQsIHAtPnVpZCk7CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCQlhZGRfcHJvYyhwLT5jb21tLCBwLT5waWQsIHAtPnBwaWQsIHAtPnVpZC8qLCAwKi8pOworCQkJcGFyZW50ID0gcC0+cGlkOworCQl9CisJfQorfQorCitpbnQgcHN0cmVlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwc3RyZWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZCA9IDE7CisJbG9uZyB1aWQgPSAwOworCisJSU5JVF9HKCk7CisKKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZHLm91dHB1dF93aWR0aCwgTlVMTCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7CisJZ2V0b3B0MzIoYXJndiwgInAiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWlmIChhcmd2WzBdWzBdID49ICcwJyAmJiBhcmd2WzBdWzBdIDw9ICc5JykgeworCQkJcGlkID0geGF0b2koYXJndlswXSk7CisJCX0gZWxzZSB7CisJCQl1aWQgPSB4dW5hbWUydWlkKGFyZ3ZbMF0pOworCQl9CisJfQorCisJbXJlYWRfcHJvYygpOworCisJaWYgKCF1aWQpCisJCWR1bXBfdHJlZShmaW5kX3Byb2MocGlkKSwgMCwgMSwgMSwgMSwgMCk7CisJZWxzZSB7CisJCWR1bXBfYnlfdXNlcihmaW5kX3Byb2MoMSksIHVpZCk7CisJCWlmICghRy5kdW1wZWQpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBwcm9jZXNzZXMgZm91bmQiKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKEcud2lkdGgpOworCQlmcmVlKEcubW9yZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL3B3ZHguYyBiL3Byb2Nwcy9wd2R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxODEwNAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9wd2R4LmMKQEAgLTAsMCArMSw2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcHdkeCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBOaWNob2xhcyBNaWVsbAorICogcG9ydGVkIGZyb20gcHJvY3BzIGJ5IFBlcmUgT3JnYSA8Z290cnVua3NAZ21haWwuY29tPiAyMDExCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgUFdEWAorLy9jb25maWc6CWJvb2wgInB3ZHgiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmVwb3J0IGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgYSBwcm9jZXNzCisKKy8vYXBwbGV0OklGX1BXRFgoQVBQTEVUKHB3ZHgsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUFdEWCkgKz0gcHdkeC5vCisKKy8vdXNhZ2U6I2RlZmluZSBwd2R4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJQSUQuLi4iCisvL3VzYWdlOiNkZWZpbmUgcHdkeF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgY3VycmVudCBkaXJlY3RvcnkgZm9yIFBJRHNcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBwd2R4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwd2R4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7CisJZ2V0b3B0MzIoYXJndiwgIiIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJZG8geworCQljaGFyIGJ1ZltzaXplb2YoIi9wcm9jLyV1L2N3ZCIpICsgc2l6ZW9mKGludCkqM107CisJCXVuc2lnbmVkIHBpZDsKKwkJY2hhciAqczsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJLy8gQWxsb3dlZCBvbiB0aGUgY29tbWFuZCBsaW5lOgorCQkvLyAvcHJvYy9OVU0KKwkJLy8gTlVNCisJCWlmIChzdHJuY21wKGFyZywgIi9wcm9jLyIsIDYpID09IDApCisJCQlhcmcgKz0gNjsKKworCQlwaWQgPSBiYl9zdHJ0b3UoYXJnLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHByb2Nlc3MgaWQ6ICclcyciLCBhcmcpOworCisJCXNwcmludGYoYnVmLCAiL3Byb2MvJXUvY3dkIiwgcGlkKTsKKworCQlzID0geG1hbGxvY19yZWFkbGluayhidWYpOworCQkvLyAicHdkeCAvcHJvYy8xIiBzYXlzICIvcHJvYy8xOiBESVIiLCBub3QgIjE6IERJUiIKKwkJcHJpbnRmKCIlczogJXNcbiIsICphcmd2LCBzID8gcyA6IHN0cmVycm9yKGVycm5vID09IEVOT0VOVCA/IEVTUkNIIDogZXJybm8pKTsKKwkJZnJlZShzKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvcmVuaWNlLmMgYi9wcm9jcHMvcmVuaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmNDAwYQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9yZW5pY2UuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmVuaWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBOb3RlczoKKyAqICAgU2V0dGluZyBhbiBhYnNvbHV0ZSBwcmlvcml0eSB3YXMgb2Jzb2xldGVkIGluIFNVU3YyIGFuZCByZW1vdmVkCisgKiAgIGluIFNVU3YzLiAgSG93ZXZlciwgdGhlIGNvbW1vbiBsaW51eCB2ZXJzaW9uIG9mIHJlbmljZSBkb2VzCisgKiAgIGFic29sdXRlIGFuZCBub3QgcmVsYXRpdmUuICBTbyB3ZSdsbCBjb250aW51ZSBzdXBwb3J0aW5nIGFic29sdXRlLAorICogICBhbHRob3VnaCB0aGUgc3Rkb3V0IGxvZ2dpbmcgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBib3RoIFNVU3YyIGFuZAorICogICBTVVN2MyBzcGVjaWZ5IHRoYXQgc3Rkb3V0IGlzbid0IHVzZWQuCisgKgorICogICBUaGlzIHZlcnNpb24gaXMgbGVuaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBhbnkgSURzLiAgVGhlCisgKiAgIG9wdGlvbnMgLXAsIC1nLCBhbmQgLXUgYXJlIHRyZWF0ZWQgYXMgbW9kZSBzd2l0Y2hlcyBmb3IgdGhlCisgKiAgIGZvbGxvd2luZyBJRHMgKGlmIGFueSkuICBNdWx0aXBsZSBzd2l0Y2hlcyBhcmUgYWxsb3dlZC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcmVuaWNlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7ey1uIElOQ1JFTUVOVH0gfCBQUklPUklUWX0gW1stcCB8IC1nIHwgLXVdIElELi4uXSIKKy8vdXNhZ2U6I2RlZmluZSByZW5pY2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2Ugc2NoZWR1bGluZyBwcmlvcml0eSBmb3IgYSBydW5uaW5nIHByb2Nlc3NcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JQWRqdXN0IGN1cnJlbnQgbmljZSB2YWx1ZSAoc21hbGxlciBpcyBmYXN0ZXIpIgorLy91c2FnZTogICAgICJcbgktcAlQcm9jZXNzIGlkKHMpIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLWcJUHJvY2VzcyBncm91cCBpZChzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJUHJvY2VzcyB1c2VyIG5hbWUocykgYW5kL29yIGlkKHMpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKwordm9pZCBCVUdfYmFkX1BSSU9fUFJPQ0VTUyh2b2lkKTsKK3ZvaWQgQlVHX2JhZF9QUklPX1BHUlAodm9pZCk7Cit2b2lkIEJVR19iYWRfUFJJT19VU0VSKHZvaWQpOworCitpbnQgcmVuaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZW5pY2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIFhldHByaW9yaXR5X21zZ1tdIEFMSUdOMSA9ICIlY2V0cHJpb3JpdHkiOworCisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgd2hpY2ggPSBQUklPX1BST0NFU1M7ICAvKiBEZWZhdWx0ICd3aGljaCcgdmFsdWUuICovCisJaW50IHVzZV9yZWxhdGl2ZSA9IDA7CisJaW50IGFkanVzdG1lbnQsIG5ld19wcmlvcml0eTsKKwl1bnNpZ25lZCB3aG87CisJY2hhciAqYXJnOworCisJLyogWWVzLCB0aGV5IGFyZSBub3QgI2RlZmluZXMgaW4gZ2xpYmMgMi40ISAjaWYgd29uJ3Qgd29yayAqLworCWlmIChQUklPX1BST0NFU1MgPCBDSEFSX01JTiB8fCBQUklPX1BST0NFU1MgPiBDSEFSX01BWCkKKwkJQlVHX2JhZF9QUklPX1BST0NFU1MoKTsKKwlpZiAoUFJJT19QR1JQIDwgQ0hBUl9NSU4gfHwgUFJJT19QR1JQID4gQ0hBUl9NQVgpCisJCUJVR19iYWRfUFJJT19QR1JQKCk7CisJaWYgKFBSSU9fVVNFUiA8IENIQVJfTUlOIHx8IFBSSU9fVVNFUiA+IENIQVJfTUFYKQorCQlCVUdfYmFkX1BSSU9fVVNFUigpOworCisJYXJnID0gKisrYXJndjsKKworCS8qIENoZWNrIGlmIHdlIGFyZSB1c2luZyBhIHJlbGF0aXZlIGFkanVzdG1lbnQuICovCisJaWYgKGFyZyAmJiBhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnbicpIHsKKwkJdXNlX3JlbGF0aXZlID0gMTsKKwkJaWYgKCFhcmdbMl0pCisJCQlhcmcgPSAqKythcmd2OworCQllbHNlCisJCQlhcmcgKz0gMjsKKwl9CisKKwlpZiAoIWFyZykgeyAgLyogTm8gYXJncz8gIFRoZW4gc2hvdyB1c2FnZS4gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIEdldCB0aGUgcHJpb3JpdHkgYWRqdXN0bWVudCAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpLiAqLworCWFkanVzdG1lbnQgPSB4YXRvaV9yYW5nZShhcmcsIElOVF9NSU4vMiwgSU5UX01BWC8yKTsKKworCXdoaWxlICgoYXJnID0gKisrYXJndikgIT0gTlVMTCkgeworCQkvKiBDaGVjayBmb3IgYSBtb2RlIHN3aXRjaC4gKi8KKwkJaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBvcHRzW10gQUxJR04xID0geworCQkJCSdwJywgJ2cnLCAndScsIDAsIFBSSU9fUFJPQ0VTUywgUFJJT19QR1JQLCBQUklPX1VTRVIKKwkJCX07CisJCQljb25zdCBjaGFyICpwID0gc3RyY2hyKG9wdHMsIGFyZ1sxXSk7CisJCQlpZiAocCkgeworCQkJCXdoaWNoID0gcFs0XTsKKwkJCQlpZiAoIWFyZ1syXSkKKwkJCQkJY29udGludWU7CisJCQkJYXJnICs9IDI7CisJCQl9CisJCX0KKworCQkvKiBQcm9jZXNzIGFuIElEIGFyZy4gKi8KKwkJaWYgKHdoaWNoID09IFBSSU9fVVNFUikgeworCQkJc3RydWN0IHBhc3N3ZCAqcDsKKwkJCXAgPSBnZXRwd25hbShhcmcpOworCQkJaWYgKCFwKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHVzZXIgJXMiLCBhcmcpOworCQkJCWdvdG8gSEFEX0VSUk9SOworCQkJfQorCQkJd2hvID0gcC0+cHdfdWlkOworCQl9IGVsc2UgeworCQkJd2hvID0gYmJfc3RydG91KGFyZywgTlVMTCwgMTApOworCQkJaWYgKGVycm5vKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG51bWJlciAnJXMnIiwgYXJnKTsKKwkJCQlnb3RvIEhBRF9FUlJPUjsKKwkJCX0KKwkJfQorCisJCS8qIEdldCBwcmlvcml0eSB0byB1c2UsIGFuZCBzZXQgaXQuICovCisJCWlmICh1c2VfcmVsYXRpdmUpIHsKKwkJCWludCBvbGRfcHJpb3JpdHk7CisKKwkJCWVycm5vID0gMDsgIC8qIE5lZWRlZCBmb3IgZ2V0cHJpb3JpdHkgZXJyb3IgZGV0ZWN0aW9uLiAqLworCQkJb2xkX3ByaW9yaXR5ID0gZ2V0cHJpb3JpdHkod2hpY2gsIHdobyk7CisJCQlpZiAoZXJybm8pIHsKKwkJCQliYl9wZXJyb3JfbXNnKFhldHByaW9yaXR5X21zZywgJ2cnKTsKKwkJCQlnb3RvIEhBRF9FUlJPUjsKKwkJCX0KKworCQkJbmV3X3ByaW9yaXR5ID0gb2xkX3ByaW9yaXR5ICsgYWRqdXN0bWVudDsKKwkJfSBlbHNlIHsKKwkJCW5ld19wcmlvcml0eSA9IGFkanVzdG1lbnQ7CisJCX0KKworCQlpZiAoc2V0cHJpb3JpdHkod2hpY2gsIHdobywgbmV3X3ByaW9yaXR5KSA9PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJiX3BlcnJvcl9tc2coWGV0cHJpb3JpdHlfbXNnLCAncycpOworIEhBRF9FUlJPUjoKKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIE5vIG5lZWQgdG8gY2hlY2sgZm9yIGVycm9ycyBvdXRwdXRpbmcgdG8gc3RkZXJyIHNpbmNlLCBpZiBpdAorCSAqIHdhcyB1c2VkLCB0aGUgSEFEX0VSUk9SIGxhYmVsIHdhcyByZWFjaGVkIGFuZCByZXR2YWwgd2FzIHNldC4gKi8KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvc21lbWNhcC5jIGIvcHJvY3BzL3NtZW1jYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTA4ZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3NtZW1jYXAuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyBzbWVtY2FwIC0gYSB0b29sIGZvciBtZWFuaW5nZnVsIG1lbW9yeSByZXBvcnRpbmcKKworIENvcHlyaWdodCAyMDA4LTIwMDkgTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CisKKyBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvciBsYXRlciwgaW5jb3Jwb3JhdGVkCisgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyovCisKKy8vYXBwbGV0OklGX1NNRU1DQVAoQVBQTEVUKHNtZW1jYXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfU01FTUNBUCkgKz0gc21lbWNhcC5vCisKKy8vY29uZmlnOmNvbmZpZyBTTUVNQ0FQCisvL2NvbmZpZzoJYm9vbCAic21lbWNhcCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBzbWVtY2FwIGlzIGEgdG9vbCBmb3IgY2FwdHVyaW5nIHByb2Nlc3MgZGF0YSBmb3Igc21lbSwKKy8vY29uZmlnOgkgIGEgbWVtb3J5IHVzYWdlIHN0YXRpc3RpYyB0b29sLgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJhcmNoaXZlLmgiCisKK3N0cnVjdCBmaWxlYmxvY2sgeworCXN0cnVjdCBmaWxlYmxvY2sgKm5leHQ7CisJY2hhciBkYXRhW1RBUl9CTE9DS19TSVpFXTsKK307CisKK3N0YXRpYyB2b2lkIHdyaXRlaGVhZGVyKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IHRhcl9oZWFkZXJfdCBoZWFkZXI7CisJaW50IGksIHN1bTsKKworCW1lbXNldCgmaGVhZGVyLCAwLCBUQVJfQkxPQ0tfU0laRSk7CisJc3RyY3B5KGhlYWRlci5uYW1lLCBwYXRoKTsKKwlzcHJpbnRmKGhlYWRlci5tb2RlLCAiJW8iLCBzYi0+c3RfbW9kZSAmIDA3NzcpOworCS8qIGNhcmVmdWwgdG8gbm90IG92ZXJmbG93IGZpZWxkcyEgKi8KKwlzcHJpbnRmKGhlYWRlci51aWQsICIlbyIsIHNiLT5zdF91aWQgJiAwNzc3Nzc3Nyk7CisJc3ByaW50ZihoZWFkZXIuZ2lkLCAiJW8iLCBzYi0+c3RfZ2lkICYgMDc3Nzc3NzcpOworCXNwcmludGYoaGVhZGVyLnNpemUsICIlbyIsICh1bnNpZ25lZClzYi0+c3Rfc2l6ZSk7CisJc3ByaW50ZihoZWFkZXIubXRpbWUsICIlbGxvIiwgc2ItPnN0X210aW1lICYgMDc3Nzc3Nzc3Nzc3TEwpOworCWhlYWRlci50eXBlZmxhZyA9IHR5cGU7CisJc3RyY3B5KGhlYWRlci5tYWdpYywgInVzdGFyICAiKTsgLyogbGlrZSBHTlUgdGFyICovCisKKwkvKiBDYWxjdWxhdGUgYW5kIHN0b3JlIHRoZSBjaGVja3N1bSAodGhlIHN1bSBvZiBhbGwgb2YgdGhlIGJ5dGVzIG9mCisJICogdGhlIGhlYWRlcikuIFRoZSBjaGVja3N1bSBmaWVsZCBtdXN0IGJlIGZpbGxlZCB3aXRoIGJsYW5rcyBmb3IgdGhlCisJICogY2FsY3VsYXRpb24uIFRoZSBjaGVja3N1bSBmaWVsZCBpcyBmb3JtYXR0ZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUKKwkgKiBvdGhlciBmaWVsZHM6IGl0IGhhcyA2IGRpZ2l0cywgYSBOVUwsIHRoZW4gYSBzcGFjZSAtLSByYXRoZXIgdGhhbgorCSAqIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBOVUwgbGlrZSB0aGUgb3RoZXIgZmllbGRzLi4uICovCisJaGVhZGVyLmNoa3N1bVs3XSA9ICcgJzsKKwlzdW0gPSAnICcgKiA3OworCWZvciAoaSA9IDA7IGkgPCBUQVJfQkxPQ0tfU0laRTsgaSsrKQorCQlzdW0gKz0gKCh1bnNpZ25lZCBjaGFyKikmaGVhZGVyKVtpXTsKKwlzcHJpbnRmKGhlYWRlci5jaGtzdW0sICIlMDZvIiwgc3VtKTsKKworCXh3cml0ZShTVERPVVRfRklMRU5PLCAmaGVhZGVyLCBUQVJfQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGFyY2hpdmVmaWxlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGZpbGVibG9jayAqc3RhcnQsICpjdXI7CisJc3RydWN0IGZpbGVibG9jayAqKnByZXYgPSAmc3RhcnQ7CisJaW50IGZkLCByOworCXVuc2lnbmVkIHNpemUgPSAwOworCXN0cnVjdCBzdGF0IHM7CisKKwkvKiBidWZmZXIgdGhlIGZpbGUgKi8KKwlmZCA9IHhvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlkbyB7CisJCWN1ciA9IHh6YWxsb2Moc2l6ZW9mKCpjdXIpKTsKKwkJKnByZXYgPSBjdXI7CisJCXByZXYgPSAmY3VyLT5uZXh0OworCQlyID0gZnVsbF9yZWFkKGZkLCBjdXItPmRhdGEsIFRBUl9CTE9DS19TSVpFKTsKKwkJaWYgKHIgPiAwKQorCQkJc2l6ZSArPSByOworCX0gd2hpbGUgKHIgPT0gVEFSX0JMT0NLX1NJWkUpOworCisJLyogd3JpdGUgYXJjaGl2ZSBoZWFkZXIgKi8KKwlmc3RhdChmZCwgJnMpOworCWNsb3NlKGZkKTsKKwlzLnN0X3NpemUgPSBzaXplOworCXdyaXRlaGVhZGVyKHBhdGgsICZzLCAnMCcpOworCisJLyogZHVtcCBmaWxlIGNvbnRlbnRzICovCisJZm9yIChjdXIgPSBzdGFydDsgKGludClzaXplID4gMDsgc2l6ZSAtPSBUQVJfQkxPQ0tfU0laRSkgeworCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgY3VyLT5kYXRhLCBUQVJfQkxPQ0tfU0laRSk7CisJCXN0YXJ0ID0gY3VyOworCQljdXIgPSBjdXItPm5leHQ7CisJCWZyZWUoc3RhcnQpOworCX0KK30KKworc3RhdGljIHZvaWQgYXJjaGl2ZWpvaW4oY29uc3QgY2hhciAqc3ViLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgcGF0aFtzaXplb2YobG9uZyBsb25nKSozICsgc2l6ZW9mKCIvY21kbGluZSIpXTsKKwlzcHJpbnRmKHBhdGgsICIlcy8lcyIsIHN1YiwgbmFtZSk7CisJYXJjaGl2ZWZpbGUocGF0aCk7Cit9CisKKy8vdXNhZ2U6I2RlZmluZSBzbWVtY2FwX3RyaXZpYWxfdXNhZ2UgIj5TTUVNREFUQS5UQVIiCisvL3VzYWdlOiNkZWZpbmUgc21lbWNhcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbGxlY3QgbWVtb3J5IHVzYWdlIGRhdGEgaW4gL3Byb2MgYW5kIHdyaXRlIGl0IHRvIHN0ZG91dCIKKworaW50IHNtZW1jYXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNtZW1jYXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlESVIgKmQ7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwl4Y2hkaXIoIi9wcm9jIik7CisJZCA9IHhvcGVuZGlyKCIuIik7CisKKwlhcmNoaXZlZmlsZSgibWVtaW5mbyIpOworCWFyY2hpdmVmaWxlKCJ2ZXJzaW9uIik7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJaWYgKGlzZGlnaXQoZGUtPmRfbmFtZVswXSkpIHsKKwkJCXN0cnVjdCBzdGF0IHM7CisJCQltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisJCQlzLnN0X21vZGUgPSAwNTU1OworCQkJd3JpdGVoZWFkZXIoZGUtPmRfbmFtZSwgJnMsICc1Jyk7CisJCQlhcmNoaXZlam9pbihkZS0+ZF9uYW1lLCAic21hcHMiKTsKKwkJCWFyY2hpdmVqb2luKGRlLT5kX25hbWUsICJjbWRsaW5lIik7CisJCQlhcmNoaXZlam9pbihkZS0+ZF9uYW1lLCAic3RhdCIpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZWRpcihkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvc3lzY3RsLmMgYi9wcm9jcHMvc3lzY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYjZhMgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9zeXNjdGwuYwpAQCAtMCwwICsxLDI3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3lzY3RsIDEuMDEgLSBBIHV0aWxpdHkgdG8gcmVhZCBhbmQgbWFuaXB1bGF0ZSB0aGUgc3lzY3RsIHBhcmFtZXRlcnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OSBHZW9yZ2UgU3RhaWtvcworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ2hhbmdlbG9nOgorICogdjEuMDEgICAtIGFkZGVkIC1wIDxwcmVsb2FkPiB0byBwcmVsb2FkIHZhbHVlcyBmcm9tIGEgZmlsZQorICogdjEuMDEuMSAtIGJ1c3lib3ggYXBwbGV0IGF3YXJlIGJ5IDxzb2xhckBnZW50b28ub3JnPgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzeXNjdGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbVkFMVUVdLi4uIgorLy91c2FnZTojZGVmaW5lIHN5c2N0bF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbmZpZ3VyZSBrZXJuZWwgcGFyYW1ldGVycyBhdCBydW50aW1lXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHByaW50IGtleSBuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJRG9uJ3Qgd2FybiBhYm91dCB1bmtub3duIGtleXMiCisvL3VzYWdlOiAgICAgIlxuCS13CUNoYW5nZSBzeXNjdGwgc2V0dGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRklMRQlMb2FkIHN5c2N0bCBzZXR0aW5ncyBmcm9tIEZJTEUgKGRlZmF1bHQgL2V0Yy9zeXNjdGwuY29uZikiCisvL3VzYWdlOiAgICAgIlxuCS1hCURpc3BsYXkgYWxsIHZhbHVlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUEJRGlzcGxheSBhbGwgdmFsdWVzIGluIHRhYmxlIGZvcm0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHN5c2N0bF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSB2YXJpYWJsZS4uLlxuIgorLy91c2FnZTogICAgICAgInN5c2N0bCBbLW5dIFstZV0gLXcgdmFyaWFibGU9dmFsdWUuLi5cbiIKKy8vdXNhZ2U6ICAgICAgICJzeXNjdGwgWy1uXSBbLWVdIC1hXG4iCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSAtcCBmaWxlCShkZWZhdWx0IC9ldGMvc3lzY3RsLmNvbmYpXG4iCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSAtQVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7CisJRkxBR19TSE9XX0tFWVMgICAgICAgPSAxIDw8IDAsCisJRkxBR19TSE9XX0tFWV9FUlJPUlMgPSAxIDw8IDEsCisJRkxBR19UQUJMRV9GT1JNQVQgICAgPSAxIDw8IDIsIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUZMQUdfU0hPV19BTEwgICAgICAgID0gMSA8PCAzLAorCUZMQUdfUFJFTE9BRF9GSUxFICAgID0gMSA8PCA0LAorCUZMQUdfV1JJVEUgICAgICAgICAgID0gMSA8PCA1LAorfTsKKyNkZWZpbmUgT1BUSU9OX1NUUiAibmVBYXB3IgorCitzdGF0aWMgdm9pZCBzeXNjdGxfZG90c190b19zbGFzaGVzKGNoYXIgKm5hbWUpCit7CisJY2hhciAqY3B0ciwgKmxhc3RfZ29vZCwgKmVuZDsKKworCS8qIENvbnZlcnQgbWluaW11bSBudW1iZXIgb2YgJy4nIHRvICcvJyBzbyB0aGF0CisJICogd2UgZW5kIHVwIHdpdGggZXhpc3RpbmcgZmlsZSdzIG5hbWUuCisJICoKKwkgKiBFeGFtcGxlIGZyb20gYnVnIDM4OTQ6CisJICogbmV0LmlwdjQuY29uZi5ldGgwLjEwMC5tY19mb3J3YXJkaW5nIC0+CisJICogbmV0L2lwdjQvY29uZi9ldGgwLjEwMC9tY19mb3J3YXJkaW5nCisJICogTkI6IG5ldC9pcHY0L2NvbmYvZXRoMC9tY19mb3J3YXJkaW5nICphbHNvIGV4aXN0cyosCisJICogdGhlcmVmb3JlIHdlIG11c3Qgc3RhcnQgZnJvbSB0aGUgZW5kLCBhbmQgaWYKKwkgKiB3ZSByZXBsYWNlZCBldmVuIG9uZSAuIC0+IC8sIHN0YXJ0IG92ZXIgYWdhaW4sCisJICogYnV0IG5ldmVyIHJlcGxhY2UgZG90cyBiZWZvcmUgdGhlIHBvc2l0aW9uCisJICogd2hlcmUgbGFzdCByZXBsYWNlbWVudCBvY2N1cnJlZC4KKwkgKgorCSAqIEFub3RoZXIgYnVnIHdlIGxhdGVyIGhhZCBpcyB0aGF0CisJICogbmV0LmlwdjQuY29uZi5ldGgwLjEwMAorCSAqICh3aXRob3V0IC5tY19mb3J3YXJkaW5nKSB3YXMgbWlzaGFuZGxlZC4KKwkgKgorCSAqIFRvIHNldCB1cCB0ZXN0aW5nOiBtb2Rwcm9iZSA4MDIxcTsgdmNvbmZpZyBhZGQgZXRoMCAxMDAKKwkgKi8KKwllbmQgPSBuYW1lICsgc3RybGVuKG5hbWUpOworCWxhc3RfZ29vZCA9IG5hbWUgLSAxOworCSplbmQgPSAnLic7IC8qIHRyaWNrIHRoZSBsb29wIGludG8gdHJ5aW5nIGZ1bGwgbmFtZSB0b28gKi8KKworIGFnYWluOgorCWNwdHIgPSBlbmQ7CisJd2hpbGUgKGNwdHIgPiBsYXN0X2dvb2QpIHsKKwkJaWYgKCpjcHRyID09ICcuJykgeworCQkJKmNwdHIgPSAnXDAnOworCQkJLy9iYl9lcnJvcl9tc2coInRyeWluZzonJXMnIiwgbmFtZSk7CisJCQlpZiAoYWNjZXNzKG5hbWUsIEZfT0spID09IDApIHsKKwkJCQkqY3B0ciA9ICcvJzsKKwkJCQkvL2JiX2Vycm9yX21zZygicmVwbGFjZWQ6JyVzJyIsIG5hbWUpOworCQkJCWxhc3RfZ29vZCA9IGNwdHI7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCSpjcHRyID0gJy4nOworCQl9CisJCWNwdHItLTsKKwl9CisJKmVuZCA9ICdcMCc7Cit9CisKK3N0YXRpYyBpbnQgc3lzY3RsX2FjdF9vbl9zZXR0aW5nKGNoYXIgKnNldHRpbmcpCit7CisJaW50IGZkLCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisJY2hhciAqY3B0ciwgKm91dG5hbWU7CisJY2hhciAqdmFsdWUgPSB2YWx1ZTsgLyogZm9yIGNvbXBpbGVyICovCisKKwlvdXRuYW1lID0geHN0cmR1cChzZXR0aW5nKTsKKworCWNwdHIgPSBvdXRuYW1lOworCXdoaWxlICgqY3B0cikgeworCQlpZiAoKmNwdHIgPT0gJy8nKQorCQkJKmNwdHIgPSAnLic7CisJCWNwdHIrKzsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfV1JJVEUpIHsKKwkJY3B0ciA9IHN0cmNocihzZXR0aW5nLCAnPScpOworCQlpZiAoY3B0ciA9PSBOVUxMKSB7CisJCQliYl9lcnJvcl9tc2coImVycm9yOiAnJXMnIG11c3QgYmUgb2YgdGhlIGZvcm0gbmFtZT12YWx1ZSIsCisJCQkJb3V0bmFtZSk7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQlnb3RvIGVuZDsKKwkJfQorCQl2YWx1ZSA9IGNwdHIgKyAxOyAgLyogcG9pbnQgdG8gdGhlIHZhbHVlIGluIG5hbWU9dmFsdWUgKi8KKwkJaWYgKHNldHRpbmcgPT0gY3B0ciB8fCAhKnZhbHVlKSB7CisJCQliYl9lcnJvcl9tc2coImVycm9yOiBtYWxmb3JtZWQgc2V0dGluZyAnJXMnIiwgb3V0bmFtZSk7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQlnb3RvIGVuZDsKKwkJfQorCQkqY3B0ciA9ICdcMCc7CisJCW91dG5hbWVbY3B0ciAtIHNldHRpbmddID0gJ1wwJzsKKwkJLyogcHJvY3BzIDMuMi43IGFjdHVhbGx5IHVzZXMgdGhlc2UgZmxhZ3MgKi8KKwkJZmQgPSBvcGVuKHNldHRpbmcsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CisJfSBlbHNlIHsKKwkJZmQgPSBvcGVuKHNldHRpbmcsIE9fUkRPTkxZKTsKKwl9CisKKwlpZiAoZmQgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFTk9FTlQ6CisJCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfU0hPV19LRVlfRVJST1JTKQorCQkJCWJiX2Vycm9yX21zZygiZXJyb3I6ICclcycgaXMgYW4gdW5rbm93biBrZXkiLCBvdXRuYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfcGVycm9yX21zZygiZXJyb3IgJXNpbmcga2V5ICclcyciLAorCQkJCQlvcHRpb25fbWFzazMyICYgRkxBR19XUklURSA/CisJCQkJCQkic2V0dCIgOiAicmVhZCIsCisJCQkJCW91dG5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfV1JJVEUpIHsKKy8vVE9ETzogcHJvY3BzIDMuMi43IHdyaXRlcyAidmFsdWVcbiIsIG5vdGUgdHJhaWxpbmcgIlxuIgorCQl4d3JpdGVfc3RyKGZkLCB2YWx1ZSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1NIT1dfS0VZUykKKwkJCXByaW50ZigiJXMgPSAiLCBvdXRuYW1lKTsKKwkJcHV0cyh2YWx1ZSk7CisJfSBlbHNlIHsKKwkJY2hhciBjOworCisJCXZhbHVlID0gY3B0ciA9IHhtYWxsb2NfcmVhZChmZCwgTlVMTCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJCWJiX3BlcnJvcl9tc2coImVycm9yIHJlYWRpbmcga2V5ICclcyciLCBvdXRuYW1lKTsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJLyogZGV2LmNkcm9tLmluZm8gYW5kIHN1bnJwYy50cmFuc3BvcnRzLCBmb3IgZXhhbXBsZSwKKwkJICogYXJlIG11bHRpLWxpbmUuIFRyeSAic3lzY3RsIHN1bnJwYy50cmFuc3BvcnRzIgorCQkgKi8KKwkJd2hpbGUgKChjID0gKmNwdHIpICE9ICdcMCcpIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19TSE9XX0tFWVMpCisJCQkJcHJpbnRmKCIlcyA9ICIsIG91dG5hbWUpOworCQkJd2hpbGUgKDEpIHsKKwkJCQlmcHV0YyhjLCBzdGRvdXQpOworCQkJCWNwdHIrKzsKKwkJCQlpZiAoYyA9PSAnXG4nKQorCQkJCQlicmVhazsKKwkJCQljID0gKmNwdHI7CisJCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZnJlZSh2YWx1ZSk7CisJfQorIGVuZDoKKwlmcmVlKG91dG5hbWUpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc3lzY3RsX2FjdF9yZWN1cnNpdmUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlESVIgKmRpcnA7CisJc3RydWN0IHN0YXQgYnVmOworCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCWNoYXIgKm5leHQ7CisJaW50IHJldHZhbCA9IDA7CisKKwlzdGF0KHBhdGgsICZidWYpOworCWlmIChTX0lTRElSKGJ1Zi5zdF9tb2RlKSAmJiAhKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1dSSVRFKSkgeworCQlkaXJwID0gb3BlbmRpcihwYXRoKTsKKwkJaWYgKGRpcnAgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKwkJCW5leHQgPSBjb25jYXRfc3VicGF0aF9maWxlKHBhdGgsIGVudHJ5LT5kX25hbWUpOworCQkJaWYgKG5leHQgPT0gTlVMTCkKKwkJCQljb250aW51ZTsgLyogZF9uYW1lIGlzICIuIiBvciAiLi4iICovCisJCQkvKiBpZiBwYXRoIHdhcyAiLiIsIGRyb3AgIi4vIiBwcmVmaXg6ICovCisJCQlyZXR2YWwgfD0gc3lzY3RsX2FjdF9yZWN1cnNpdmUoKG5leHRbMF0gPT0gJy4nICYmIG5leHRbMV0gPT0gJy8nKSA/CisJCQkJCSAgICBuZXh0ICsgMiA6IG5leHQpOworCQkJZnJlZShuZXh0KTsKKwkJfQorCQljbG9zZWRpcihkaXJwKTsKKwl9IGVsc2UgeworCQljaGFyICpuYW1lID0geHN0cmR1cChwYXRoKTsKKwkJcmV0dmFsIHw9IHN5c2N0bF9hY3Rfb25fc2V0dGluZyhuYW1lKTsKKwkJZnJlZShuYW1lKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBTZXQgc3lzY3RsJ3MgZnJvbSBhIGNvbmYgZmlsZS4gRm9ybWF0IGV4YW1wbGU6CisgKiAjIENvbnRyb2xzIElQIHBhY2tldCBmb3J3YXJkaW5nCisgKiBuZXQuaXB2NC5pcF9mb3J3YXJkID0gMAorICovCitzdGF0aWMgaW50IHN5c2N0bF9oYW5kbGVfcHJlbG9hZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgKnRva2VuWzJdOworCXBhcnNlcl90ICpwYXJzZXI7CisKKwlwYXJzZXIgPSBjb25maWdfb3BlbihmaWxlbmFtZSk7CisJLyogTXVzdCBkbyBpdCBfYWZ0ZXJfIGNvbmZpZ19vcGVuKCk6ICovCisJeGNoZGlyKCIvcHJvYy9zeXMiKTsKKwkvKiB4Y2hyb290KCIuIikgLSBpZiB5b3UgYXJlIHBhcmFub2lkICovCisKKy8vVE9ETzogJzsnIGlzIGNvbW1lbnQgY2hhciB0b28KKy8vVE9ETzogY29tbWVudCBtYXkgYmUgb25seSBhdCBsaW5lIHN0YXJ0LiAidmFyPTEgI2FiYyIgLSAiMSAjYWJjIiBpcyB0aGUgdmFsdWUKKy8vIChidXQgX3doaXRlc3BhY2VfIGZyb20gZW5kcyBzaG91bGQgYmUgdHJpbW1lZCBmaXJzdCAoYW5kIHdlIGRvIGl0IHJpZ2h0KSkKKy8vVE9ETzogInZhcj09MSIgaXMgbWlzaGFuZGxlZCAobXVzdCB1c2UgIj0xIiBhcyBhIHZhbHVlLCBidXQgdXNlcyAiMSIpCisvLyBjYW4gaXQgYmUgZml4ZWQgYnkgcmVtb3ZpbmcgUEFSU0VfQ09MTEFQU0UgYml0PworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdD0iLCBQQVJTRV9OT1JNQUwpKSB7CisJCWNoYXIgKnRwOworCQlzeXNjdGxfZG90c190b19zbGFzaGVzKHRva2VuWzBdKTsKKwkJdHAgPSB4YXNwcmludGYoIiVzPSVzIiwgdG9rZW5bMF0sIHRva2VuWzFdKTsKKwkJc3lzY3RsX2FjdF9yZWN1cnNpdmUodHApOworCQlmcmVlKHRwKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN5c2N0bF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3lzY3RsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsOworCWludCBvcHQ7CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiKyIgT1BUSU9OX1NUUik7IC8qICcrJyAtIHN0b3Agb24gZmlyc3Qgbm9uLW9wdGlvbiAqLworCWFyZ3YgKz0gb3B0aW5kOworCW9wdCBePSAoRkxBR19TSE9XX0tFWVMgfCBGTEFHX1NIT1dfS0VZX0VSUk9SUyk7CisJb3B0aW9uX21hc2szMiA9IG9wdDsKKworCWlmIChvcHQgJiBGTEFHX1BSRUxPQURfRklMRSkgeworCQlvcHRpb25fbWFzazMyIHw9IEZMQUdfV1JJVEU7CisJCS8qIHhjaGRpcigiL3Byb2Mvc3lzIikgaXMgaW5zaWRlICovCisJCXJldHVybiBzeXNjdGxfaGFuZGxlX3ByZWxvYWRfZmlsZSgqYXJndiA/ICphcmd2IDogIi9ldGMvc3lzY3RsLmNvbmYiKTsKKwl9CisJeGNoZGlyKCIvcHJvYy9zeXMiKTsKKwkvKiB4Y2hyb290KCIuIikgLSBpZiB5b3UgYXJlIHBhcmFub2lkICovCisJaWYgKG9wdCAmIChGTEFHX1RBQkxFX0ZPUk1BVCB8IEZMQUdfU0hPV19BTEwpKSB7CisJCXJldHVybiBzeXNjdGxfYWN0X3JlY3Vyc2l2ZSgiLiIpOworCX0KKworCXJldHZhbCA9IDA7CisJd2hpbGUgKCphcmd2KSB7CisJCXN5c2N0bF9kb3RzX3RvX3NsYXNoZXMoKmFyZ3YpOworCQlyZXR2YWwgfD0gc3lzY3RsX2FjdF9yZWN1cnNpdmUoKmFyZ3YpOworCQlhcmd2Kys7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy90b3AuYyBiL3Byb2Nwcy90b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFiYmYxCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3RvcC5jCkBAIC0wLDAgKzEsMTE5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQSB0aW55ICd0b3AnIHV0aWxpdHkuCisgKgorICogVGhpcyBpcyB3cml0dGVuIHNwZWNpZmljYWxseSBmb3IgdGhlIGxpbnV4IC9wcm9jLzxQSUQ+L3N0YXQobSkKKyAqIGZpbGVzIGZvcm1hdC4KKyAqCisgKiBUaGlzIHJlYWRzIHRoZSBQSURzIG9mIGFsbCBwcm9jZXNzZXMgYW5kIHRoZWlyIHN0YXR1cyBhbmQgc2hvd3MKKyAqIHRoZSBzdGF0dXMgb2YgcHJvY2Vzc2VzIChmaXJzdCBvbmVzIHRoYXQgZml0IHRvIHNjcmVlbikgYXQgZ2l2ZW4KKyAqIGludGVydmFscy4KKyAqCisgKiBOT1RFUzoKKyAqIC0gQXQgc3RhcnR1cCB0aGlzIGNoYW5nZXMgdG8gL3Byb2MsIGFsbCB0aGUgcmVhZHMgYXJlIHRoZW4KKyAqICAgcmVsYXRpdmUgdG8gdGhhdC4KKyAqCisgKiAoQykgRWVybyBUYW1taW5lbiA8b2FrIGF0IHdlbGhvIGRvdCBjb20+CisgKgorICogUmV3cml0dGVuIGJ5IFZsYWRpbWlyIE9sZXluaWsgKEMpIDIwMDIgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBTZXB0IDIwMDg6IFZpbmVldCBHdXB0YSA8dmluZWV0Lmd1cHRhQGFyYy5jb20+CisgKiBBZGRlZCBTdXBwb3J0IGZvciByZXBvcnRpbmcgU01QIEluZm9ybWF0aW9uCisgKiAtIENQVSB3aGVyZSBwcm9jZXNzIHdhcyBsYXN0IHNlZW4gcnVubmluZworICogICAodG8gc2VlIGVmZmVjdCBvZiBzY2hlZF9zZXRhZmZpbml0eSgpIGV0YykKKyAqIC0gQ1BVIHRpbWUgc3BsaXQgKGlkbGUvSU8vd2FpdCBldGMpIHBlciBDUFUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIgQnJhbmtvIExhbmtlc3RlcgorICogQ29weXJpZ2h0IChjKSAxOTkyIFJvZ2VyIEJpbm5zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiBDaGFybGVzIEwuIEJsYWtlLgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTggTWljaGFlbCBLLiBKb2huc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyogSG93IHRvIHNuYXBzaG90IC9wcm9jIGZvciBkZWJ1Z2dpbmcgdG9wIHByb2JsZW1zOgorICogZm9yIGYgaW4gL3Byb2MvWzAtOV0qIiIvc3RhdDsgZG8KKyAqICAgICAgICAgbj0ke2YjL3Byb2MvfQorICogICAgICAgICBuPSR7biUvc3RhdH1fc3RhdAorICogICAgICAgICBjcCAkZiAkbgorICogZG9uZQorICogY3AgL3Byb2Mvc3RhdCAvcHJvYy9tZW1pbmZvIC9wcm9jL2xvYWRhdmcgLgorICogdG9wIC1ibjEgPnRvcC5vdXQKKyAqCisgKiAuLi5hbmQgaG93IHRvIHJ1biB0b3Agb24gaXQgb24gYW5vdGhlciBtYWNoaW5lOgorICogcm0gLXJmIHByb2M7IG1rZGlyIHByb2MKKyAqIGZvciBmIGluIFswLTldKl9zdGF0OyBkbworICogICAgICAgICBwPSR7ZiVfc3RhdH0KKyAqICAgICAgICAgbWtkaXIgLXAgcHJvYy8kcAorICogICAgICAgICBjcCAkZiBwcm9jLyRwL3N0YXQKKyAqIGRvbmUKKyAqIGNwIHN0YXQgbWVtaW5mbyBsb2FkYXZnIHByb2MKKyAqIGNocm9vdCAuIC4vdG9wIC1ibjEgPnRvcDEub3V0CisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgdG9wX3N0YXR1c190IHsKKwl1bnNpZ25lZCBsb25nIHZzejsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwl1bnNpZ25lZCBsb25nIHRpY2tzOworCXVuc2lnbmVkIHBjcHU7IC8qIGRlbHRhIG9mIHRpY2tzICovCisjZW5kaWYKKwl1bnNpZ25lZCBwaWQsIHBwaWQ7CisJdW5zaWduZWQgdWlkOworCWNoYXIgc3RhdGVbNF07CisJY2hhciBjb21tW0NPTU1fTEVOXTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwlpbnQgbGFzdF9zZWVuX29uX2NwdTsKKyNlbmRpZgorfSB0b3Bfc3RhdHVzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGppZmZ5X2NvdW50c190IHsKKwkvKiBMaW51eCAyLjQueCBoYXMgb25seSBmaXJzdCBmb3VyICovCisJdW5zaWduZWQgbG9uZyBsb25nIHVzciwgbmljLCBzeXMsIGlkbGU7CisJdW5zaWduZWQgbG9uZyBsb25nIGlvd2FpdCwgaXJxLCBzb2Z0aXJxLCBzdGVhbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWw7CisJdW5zaWduZWQgbG9uZyBsb25nIGJ1c3k7Cit9IGppZmZ5X2NvdW50c190OworCisvKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgc29tZSBjcml0aWNhbCBpbmZvcm1hdGlvbiBmcm9tIG9uZSBmcmFtZSB0bworICAgdGhlIG5leHQuIFVzZWQgZm9yIGZpbmRpbmcgZGVsdGFzLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc2F2ZV9oaXN0IHsKKwl1bnNpZ25lZCBsb25nIHRpY2tzOworCXBpZF90IHBpZDsKK30gc2F2ZV9oaXN0OworCit0eXBlZGVmIGludCAoKmNtcF9mdW5jcCkodG9wX3N0YXR1c190ICpQLCB0b3Bfc3RhdHVzX3QgKlEpOworCisKK2VudW0geyBTT1JUX0RFUFRIID0gMyB9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwl0b3Bfc3RhdHVzX3QgKnRvcDsKKwlpbnQgbnRvcDsKKwlzbWFsbGludCBpbnZlcnRlZDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwlzbWFsbGludCBzb3J0X2ZpZWxkOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwlzbWFsbGludCBzbXBfY3B1X2luZm87IC8qIG9uZS9tYW55IGNwdSBpbmZvIGxpbmVzPyAqLworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwlzdHJ1Y3QgdGVybWlvcyBpbml0aWFsX3NldHRpbmdzOworI2VuZGlmCisjaWYgIUVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCWNtcF9mdW5jcCBzb3J0X2Z1bmN0aW9uWzFdOworI2Vsc2UKKwljbXBfZnVuY3Agc29ydF9mdW5jdGlvbltTT1JUX0RFUFRIXTsKKwlzdHJ1Y3Qgc2F2ZV9oaXN0ICpwcmV2X2hpc3Q7CisJaW50IHByZXZfaGlzdF9jb3VudDsKKwlqaWZmeV9jb3VudHNfdCBjdXJfamlmLCBwcmV2X2ppZjsKKwkvKiBpbnQgaGlzdF9pdGVyYXRpb25zOyAqLworCXVuc2lnbmVkIHRvdGFsX3BjcHU7CisJLyogdW5zaWduZWQgbG9uZyB0b3RhbF92c3o7ICovCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCS8qIFBlciBDUFUgc2FtcGxlczogY3VycmVudCBhbmQgbGFzdCAqLworCWppZmZ5X2NvdW50c190ICpjcHVfamlmLCAqY3B1X3ByZXZfamlmOworCWludCBudW1fY3B1czsKKyNlbmRpZgorCWNoYXIgbGluZV9idWZbODBdOworfTsgLy9GSVhfQUxJQVNJTkc7IC0gbGFyZ2UgY29kZSBncm93dGgKK2VudW0geyBMSU5FX0JVRl9TSVpFID0gQ09NTU9OX0JVRlNJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFscywgbGluZV9idWYpIH07CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK3N0cnVjdCBCVUdfYmFkX3NpemUgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworCWNoYXIgQlVHX2xpbmVfYnVmX3Rvb19zbWFsbFtMSU5FX0JVRl9TSVpFID4gODAgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0b3AgICAgICAgICAgICAgIChHLnRvcCAgICAgICAgICAgICAgICkKKyNkZWZpbmUgbnRvcCAgICAgICAgICAgICAoRy5udG9wICAgICAgICAgICAgICApCisjZGVmaW5lIHNvcnRfZmllbGQgICAgICAgKEcuc29ydF9maWVsZCAgICAgICAgKQorI2RlZmluZSBpbnZlcnRlZCAgICAgICAgIChHLmludmVydGVkICAgICAgICAgICkKKyNkZWZpbmUgc21wX2NwdV9pbmZvICAgICAoRy5zbXBfY3B1X2luZm8gICAgICApCisjZGVmaW5lIGluaXRpYWxfc2V0dGluZ3MgKEcuaW5pdGlhbF9zZXR0aW5ncyAgKQorI2RlZmluZSBzb3J0X2Z1bmN0aW9uICAgIChHLnNvcnRfZnVuY3Rpb24gICAgICkKKyNkZWZpbmUgcHJldl9oaXN0ICAgICAgICAoRy5wcmV2X2hpc3QgICAgICAgICApCisjZGVmaW5lIHByZXZfaGlzdF9jb3VudCAgKEcucHJldl9oaXN0X2NvdW50ICAgKQorI2RlZmluZSBjdXJfamlmICAgICAgICAgIChHLmN1cl9qaWYgICAgICAgICAgICkKKyNkZWZpbmUgcHJldl9qaWYgICAgICAgICAoRy5wcmV2X2ppZiAgICAgICAgICApCisjZGVmaW5lIGNwdV9qaWYgICAgICAgICAgKEcuY3B1X2ppZiAgICAgICAgICAgKQorI2RlZmluZSBjcHVfcHJldl9qaWYgICAgIChHLmNwdV9wcmV2X2ppZiAgICAgICkKKyNkZWZpbmUgbnVtX2NwdXMgICAgICAgICAoRy5udW1fY3B1cyAgICAgICAgICApCisjZGVmaW5lIHRvdGFsX3BjcHUgICAgICAgKEcudG90YWxfcGNwdSAgICAgICAgKQorI2RlZmluZSBsaW5lX2J1ZiAgICAgICAgIChHLmxpbmVfYnVmICAgICAgICAgICkKKworZW51bSB7CisJT1BUX2QgPSAoMSA8PCAwKSwKKwlPUFRfbiA9ICgxIDw8IDEpLAorCU9QVF9iID0gKDEgPDwgMiksCisJT1BUX20gPSAoMSA8PCAzKSwKKwlPUFRfRU9GID0gKDEgPDwgNCksIC8qIHBzZXVkbzogIndlIHNhdyBFT0YgaW4gc3RkaW4iICovCit9OworI2RlZmluZSBPUFRfQkFUQ0hfTU9ERSAob3B0aW9uX21hc2szMiAmIE9QVF9iKQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworc3RhdGljIGludCBwaWRfc29ydCh0b3Bfc3RhdHVzX3QgKlAsIHRvcF9zdGF0dXNfdCAqUSkKK3sKKwkvKiBCdWdneSB3cnQgcGlkcyB3aXRoIGhpZ2ggYml0IHNldCAqLworCS8qIChsaW51eCBwaWRzIGFyZSBpbiBbMS4uMl4xNS0xXSkgKi8KKwlyZXR1cm4gKFEtPnBpZCAtIFAtPnBpZCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtZW1fc29ydCh0b3Bfc3RhdHVzX3QgKlAsIHRvcF9zdGF0dXNfdCAqUSkKK3sKKwkvKiBXZSB3YW50IHRvIGF2b2lkIHVuc2lnbmVkLT5zaWduZWQgYW5kIHRydW5jYXRpb24gZXJyb3JzICovCisJaWYgKFEtPnZzeiA8IFAtPnZzeikgcmV0dXJuIC0xOworCXJldHVybiBRLT52c3ogIT0gUC0+dnN6OyAvKiAwIGlmID09LCAxIGlmID4gKi8KK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisKK3N0YXRpYyBpbnQgcGNwdV9zb3J0KHRvcF9zdGF0dXNfdCAqUCwgdG9wX3N0YXR1c190ICpRKQoreworCS8qIEJ1Z2d5IHdydCB0aWNrcyB3aXRoIGhpZ2ggYml0IHNldCAqLworCS8qIEFmZmVjdHMgb25seSBwcm9jZXNzZXMgZm9yIHdoaWNoIHRpY2tzIG92ZXJmbG93ICovCisJcmV0dXJuIChpbnQpUS0+cGNwdSAtIChpbnQpUC0+cGNwdTsKK30KKworc3RhdGljIGludCB0aW1lX3NvcnQodG9wX3N0YXR1c190ICpQLCB0b3Bfc3RhdHVzX3QgKlEpCit7CisJLyogV2Ugd2FudCB0byBhdm9pZCB1bnNpZ25lZC0+c2lnbmVkIGFuZCB0cnVuY2F0aW9uIGVycm9ycyAqLworCWlmIChRLT50aWNrcyA8IFAtPnRpY2tzKSByZXR1cm4gLTE7CisJcmV0dXJuIFEtPnRpY2tzICE9IFAtPnRpY2tzOyAvKiAwIGlmID09LCAxIGlmID4gKi8KK30KKworc3RhdGljIGludCBtdWx0X2x2bF9jbXAodm9pZCogYSwgdm9pZCogYikKK3sKKwlpbnQgaSwgY21wX3ZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBTT1JUX0RFUFRIOyBpKyspIHsKKwkJY21wX3ZhbCA9ICgqc29ydF9mdW5jdGlvbltpXSkoYSwgYik7CisJCWlmIChjbXBfdmFsICE9IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGludmVydGVkID8gLWNtcF92YWwgOiBjbXBfdmFsOworfQorCitzdGF0aWMgTk9JTkxJTkUgaW50IHJlYWRfY3B1X2ppZmZ5KEZJTEUgKmZwLCBqaWZmeV9jb3VudHNfdCAqcF9qaWYpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiY3B1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSI7CisjZWxzZQorCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gImNwJSpzICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSI7CisjZW5kaWYKKwlpbnQgcmV0OworCisJaWYgKCFmZ2V0cyhsaW5lX2J1ZiwgTElORV9CVUZfU0laRSwgZnApIHx8IGxpbmVfYnVmWzBdICE9ICdjJyAvKiBub3QgImNwdSIgKi8pCisJCXJldHVybiAwOworCXJldCA9IHNzY2FuZihsaW5lX2J1ZiwgZm10LAorCQkJJnBfamlmLT51c3IsICZwX2ppZi0+bmljLCAmcF9qaWYtPnN5cywgJnBfamlmLT5pZGxlLAorCQkJJnBfamlmLT5pb3dhaXQsICZwX2ppZi0+aXJxLCAmcF9qaWYtPnNvZnRpcnEsCisJCQkmcF9qaWYtPnN0ZWFsKTsKKwlpZiAocmV0ID49IDQpIHsKKwkJcF9qaWYtPnRvdGFsID0gcF9qaWYtPnVzciArIHBfamlmLT5uaWMgKyBwX2ppZi0+c3lzICsgcF9qaWYtPmlkbGUKKwkJCSsgcF9qaWYtPmlvd2FpdCArIHBfamlmLT5pcnEgKyBwX2ppZi0+c29mdGlycSArIHBfamlmLT5zdGVhbDsKKwkJLyogcHJvY3BzIDIueCBkb2VzIG5vdCBjb3VudCBpb3dhaXQgYXMgYnVzeSB0aW1lICovCisJCXBfamlmLT5idXN5ID0gcF9qaWYtPnRvdGFsIC0gcF9qaWYtPmlkbGUgLSBwX2ppZi0+aW93YWl0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9qaWZmeV9jb3VudHModm9pZCkKK3sKKwlGSUxFKiBmcCA9IHhmb3Blbl9mb3JfcmVhZCgic3RhdCIpOworCisJLyogV2UgbmVlZCB0byBwYXJzZSBjdW11bGF0aXZlIGNvdW50cyBldmVuIGlmIFNNUCBDUFUgZGlzcGxheSBpcyBvbiwKKwkgKiB0aGV5IGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSBwZXIgcHJvY2VzcyBDUFUlICovCisJcHJldl9qaWYgPSBjdXJfamlmOworCWlmIChyZWFkX2NwdV9qaWZmeShmcCwgJmN1cl9qaWYpIDwgNCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgL3Byb2Mvc3RhdCIpOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJZmNsb3NlKGZwKTsKKwlyZXR1cm47CisjZWxzZQorCWlmICghc21wX2NwdV9pbmZvKSB7CisJCWZjbG9zZShmcCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW51bV9jcHVzKSB7CisJCS8qIEZpcnN0IHRpbWUgaGVyZS4gSG93IG1hbnkgQ1BVcz8KKwkJICogVGhlcmUgd2lsbCBiZSBhdCBsZWFzdCAxIC9wcm9jL3N0YXQgbGluZSB3aXRoIGNwdSVkCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJY3B1X2ppZiA9IHhyZWFsbG9jX3ZlY3RvcihjcHVfamlmLCAxLCBudW1fY3B1cyk7CisJCQlpZiAocmVhZF9jcHVfamlmZnkoZnAsICZjcHVfamlmW251bV9jcHVzXSkgPD0gNCkKKwkJCQlicmVhazsKKwkJCW51bV9jcHVzKys7CisJCX0KKwkJaWYgKG51bV9jcHVzID09IDApIC8qIC9wcm9jL3N0YXQgd2l0aCBvbmx5ICJjcHUgLi4uIiBsaW5lPyEgKi8KKwkJCXNtcF9jcHVfaW5mbyA9IDA7CisKKwkJY3B1X3ByZXZfamlmID0geHphbGxvYyhzaXplb2YoY3B1X3ByZXZfamlmWzBdKSAqIG51bV9jcHVzKTsKKworCQkvKiBPdGhlcndpc2UgdGhlIGZpcnN0IHBlciBjcHUgZGlzcGxheSBzaG93cyBhbGwgMTAwJSBpZGxlcyAqLworCQl1c2xlZXAoNTAwMDApOworCX0gZWxzZSB7IC8qIE5vbiBmaXJzdCB0aW1lIGludm9jYXRpb24gKi8KKwkJamlmZnlfY291bnRzX3QgKnRtcDsKKwkJaW50IGk7CisKKwkJLyogRmlyc3Qgc3dpdGNoIHRoZSBzYW1wbGUgcG9pbnRlcnM6IG5vIG5lZWQgdG8gY29weSAqLworCQl0bXAgPSBjcHVfcHJldl9qaWY7CisJCWNwdV9wcmV2X2ppZiA9IGNwdV9qaWY7CisJCWNwdV9qaWYgPSB0bXA7CisKKwkJLyogR2V0IHRoZSBuZXcgc2FtcGxlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NwdXM7IGkrKykKKwkJCXJlYWRfY3B1X2ppZmZ5KGZwLCAmY3B1X2ppZltpXSk7CisJfQorI2VuZGlmCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgZG9fc3RhdHModm9pZCkKK3sKKwl0b3Bfc3RhdHVzX3QgKmN1cjsKKwlwaWRfdCBwaWQ7CisJaW50IGksIGxhc3RfaSwgbjsKKwlzdHJ1Y3Qgc2F2ZV9oaXN0ICpuZXdfaGlzdDsKKworCWdldF9qaWZmeV9jb3VudHMoKTsKKwl0b3RhbF9wY3B1ID0gMDsKKwkvKiB0b3RhbF92c3ogPSAwOyAqLworCW5ld19oaXN0ID0geG1hbGxvYyhzaXplb2YobmV3X2hpc3RbMF0pICogbnRvcCk7CisJLyoKKwkgKiBNYWtlIGEgcGFzcyB0aHJvdWdoIHRoZSBkYXRhIHRvIGdldCBzdGF0cy4KKwkgKi8KKwkvKiBoaXN0X2l0ZXJhdGlvbnMgPSAwOyAqLworCWkgPSAwOworCWZvciAobiA9IDA7IG4gPCBudG9wOyBuKyspIHsKKwkJY3VyID0gdG9wICsgbjsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGltZSBpbiBjdXIgcHJvY2Vzcy4gIFRpbWUgaXMgc3VtIG9mIHVzZXIgdGltZQorCQkgKiBhbmQgc3lzdGVtIHRpbWUKKwkJICovCisJCXBpZCA9IGN1ci0+cGlkOworCQluZXdfaGlzdFtuXS50aWNrcyA9IGN1ci0+dGlja3M7CisJCW5ld19oaXN0W25dLnBpZCA9IHBpZDsKKworCQkvKiBmaW5kIG1hdGNoaW5nIGVudHJ5IGZyb20gcHJldmlvdXMgcGFzcyAqLworCQljdXItPnBjcHUgPSAwOworCQkvKiBkbyBub3Qgc3RhcnQgYXQgaW5kZXggMCwgY29udGludWUgYXQgbGFzdCB1c2VkIG9uZQorCQkgKiAoYnJvdWdodCBoaXN0X2l0ZXJhdGlvbnMgZnJvbSB+MTQwMDAgZG93biB0byAxNzIpICovCisJCWxhc3RfaSA9IGk7CisJCWlmIChwcmV2X2hpc3RfY291bnQpIGRvIHsKKwkJCWlmIChwcmV2X2hpc3RbaV0ucGlkID09IHBpZCkgeworCQkJCWN1ci0+cGNwdSA9IGN1ci0+dGlja3MgLSBwcmV2X2hpc3RbaV0udGlja3M7CisJCQkJdG90YWxfcGNwdSArPSBjdXItPnBjcHU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpID0gKGkrMSkgJSBwcmV2X2hpc3RfY291bnQ7CisJCQkvKiBoaXN0X2l0ZXJhdGlvbnMrKzsgKi8KKwkJfSB3aGlsZSAoaSAhPSBsYXN0X2kpOworCQkvKiB0b3RhbF92c3ogKz0gY3VyLT52c3o7ICovCisJfQorCisJLyoKKwkgKiBTYXZlIGN1ciBmcmFtZSdzIGluZm9ybWF0aW9uLgorCSAqLworCWZyZWUocHJldl9oaXN0KTsKKwlwcmV2X2hpc3QgPSBuZXdfaGlzdDsKKwlwcmV2X2hpc3RfY291bnQgPSBudG9wOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTICYmIEVOQUJMRV9GRUFUVVJFX1RPUF9ERUNJTUFMUworLyogZm9ybWF0cyA3IGNoYXIgc3RyaW5nICg4IHdpdGggdGVybWluYXRpbmcgTlVMKSAqLworc3RhdGljIGNoYXIgKmZtdF8xMDBwZXJjZW50XzgoY2hhciBwYnVmWzhdLCB1bnNpZ25lZCB2YWx1ZSwgdW5zaWduZWQgdG90YWwpCit7CisJdW5zaWduZWQgdDsKKwlpZiAodmFsdWUgPj0gdG90YWwpIHsgLyogMTAwJSA/ICovCisJCXN0cmNweShwYnVmLCAiICAxMDAlICIpOworCQlyZXR1cm4gcGJ1ZjsKKwl9CisJLyogZWxzZSBnZW5lcmF0ZSAiIFtOL3NwYWNlXU4uTiUgIiBzdHJpbmcgKi8KKwl2YWx1ZSA9IDEwMDAgKiB2YWx1ZSAvIHRvdGFsOworCXQgPSB2YWx1ZSAvIDEwMDsKKwl2YWx1ZSA9IHZhbHVlICUgMTAwOworCXBidWZbMF0gPSAnICc7CisJcGJ1ZlsxXSA9IHQgPyB0ICsgJzAnIDogJyAnOworCXBidWZbMl0gPSAnMCcgKyAodmFsdWUgLyAxMCk7CisJcGJ1ZlszXSA9ICcuJzsKKwlwYnVmWzRdID0gJzAnICsgKHZhbHVlICUgMTApOworCXBidWZbNV0gPSAnJSc7CisJcGJ1Zls2XSA9ICcgJzsKKwlwYnVmWzddID0gJ1wwJzsKKwlyZXR1cm4gcGJ1ZjsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMKK3N0YXRpYyB2b2lkIGRpc3BsYXlfY3B1cyhpbnQgc2NyX3dpZHRoLCBjaGFyICpzY3JidWYsIGludCAqbGluZXNfcmVtX3ApCit7CisJLyoKKwkgKiB4eHglID0gKGN1cl9qaWYueHh4IC0gcHJldl9qaWYueHh4KSAvIChjdXJfamlmLnRvdGFsIC0gcHJldl9qaWYudG90YWwpICogMTAwJQorCSAqLworCXVuc2lnbmVkIHRvdGFsX2RpZmY7CisJamlmZnlfY291bnRzX3QgKnBfamlmLCAqcF9wcmV2X2ppZjsKKwlpbnQgaTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwlpbnQgbl9jcHVfbGluZXM7CisjIGVuZGlmCisKKwkvKiB1c2luZyAodW5zaWduZWQpIGNhc3RzIHRvIG1ha2Ugb3BlcmF0aW9ucyBjaGVhcGVyICovCisjIGRlZmluZSAgQ0FMQ19UT1RBTF9ESUZGIGRvIHsgXAorCXRvdGFsX2RpZmYgPSAodW5zaWduZWQpKHBfamlmLT50b3RhbCAtIHBfcHJldl9qaWYtPnRvdGFsKTsgXAorCWlmICh0b3RhbF9kaWZmID09IDApIHRvdGFsX2RpZmYgPSAxOyBcCit9IHdoaWxlICgwKQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9ERUNJTUFMUworIyAgZGVmaW5lIENBTENfU1RBVCh4eHgpIGNoYXIgeHh4WzhdCisjICBkZWZpbmUgU0hPV19TVEFUKHh4eCkgZm10XzEwMHBlcmNlbnRfOCh4eHgsICh1bnNpZ25lZCkocF9qaWYtPnh4eCAtIHBfcHJldl9qaWYtPnh4eCksIHRvdGFsX2RpZmYpCisjICBkZWZpbmUgRk1UICIlcyIKKyMgZWxzZQorIyAgZGVmaW5lIENBTENfU1RBVCh4eHgpIHVuc2lnbmVkIHh4eCA9IDEwMCAqICh1bnNpZ25lZCkocF9qaWYtPnh4eCAtIHBfcHJldl9qaWYtPnh4eCkgLyB0b3RhbF9kaWZmCisjICBkZWZpbmUgU0hPV19TVEFUKHh4eCkgeHh4CisjICBkZWZpbmUgRk1UICIlNHUlJSAiCisjIGVuZGlmCisKKyMgaWYgIUVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJeworCQlpID0gMTsKKwkJcF9qaWYgPSAmY3VyX2ppZjsKKwkJcF9wcmV2X2ppZiA9ICZwcmV2X2ppZjsKKyMgZWxzZQorCS8qIExvb3AgdGhydSBDUFUocykgKi8KKwluX2NwdV9saW5lcyA9IHNtcF9jcHVfaW5mbyA/IG51bV9jcHVzIDogMTsKKwlpZiAobl9jcHVfbGluZXMgPiAqbGluZXNfcmVtX3ApCisJCW5fY3B1X2xpbmVzID0gKmxpbmVzX3JlbV9wOworCisJZm9yIChpID0gMDsgaSA8IG5fY3B1X2xpbmVzOyBpKyspIHsKKwkJcF9qaWYgPSAmY3B1X2ppZltpXTsKKwkJcF9wcmV2X2ppZiA9ICZjcHVfcHJldl9qaWZbaV07CisjIGVuZGlmCisJCUNBTENfVE9UQUxfRElGRjsKKworCQl7IC8qIE5lZWQgYSBibG9jazogQ0FMQ19TVEFUIGFyZSBkZWNsYXJhdGlvbnMgKi8KKwkJCUNBTENfU1RBVCh1c3IpOworCQkJQ0FMQ19TVEFUKHN5cyk7CisJCQlDQUxDX1NUQVQobmljKTsKKwkJCUNBTENfU1RBVChpZGxlKTsKKwkJCUNBTENfU1RBVChpb3dhaXQpOworCQkJQ0FMQ19TVEFUKGlycSk7CisJCQlDQUxDX1NUQVQoc29mdGlycSk7CisJCQkvKkNBTENfU1RBVChzdGVhbCk7Ki8KKworCQkJc25wcmludGYoc2NyYnVmLCBzY3Jfd2lkdGgsCisJCQkJLyogQmFyZWx5IGZpdHMgaW4gNzkgY2hhcnMgd2hlbiBpbiAiZGVjaW1hbHMiIG1vZGUuICovCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJCQkJIkNQVSVzOiJGTVQidXNyIkZNVCJzeXMiRk1UIm5pYyJGTVQiaWRsZSJGTVQiaW8iRk1UImlycSJGTVQic2lycSIsCisJCQkJKHNtcF9jcHVfaW5mbyA/IHV0b2EoaSkgOiAiIiksCisjIGVsc2UKKwkJCQkiQ1BVOiJGTVQidXNyIkZNVCJzeXMiRk1UIm5pYyJGTVQiaWRsZSJGTVQiaW8iRk1UImlycSJGTVQic2lycSIsCisjIGVuZGlmCisJCQkJU0hPV19TVEFUKHVzciksIFNIT1dfU1RBVChzeXMpLCBTSE9XX1NUQVQobmljKSwgU0hPV19TVEFUKGlkbGUpLAorCQkJCVNIT1dfU1RBVChpb3dhaXQpLCBTSE9XX1NUQVQoaXJxKSwgU0hPV19TVEFUKHNvZnRpcnEpCisJCQkJLyosIFNIT1dfU1RBVChzdGVhbCkgLSB3aGF0IGlzIHRoaXMgJ3N0ZWFsJyB0aGluZz8gKi8KKwkJCQkvKiBJIGRvdWJ0IGFueW9uZSB3YW50cyB0byBrbm93IGl0ICovCisJCQkpOworCQkJcHV0cyhzY3JidWYpOworCQl9CisJfQorIyB1bmRlZiBTSE9XX1NUQVQKKyMgdW5kZWYgQ0FMQ19TVEFUCisjIHVuZGVmIEZNVAorCSpsaW5lc19yZW1fcCAtPSBpOworfQorI2Vsc2UgIC8qICFFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUyAqLworIyBkZWZpbmUgZGlzcGxheV9jcHVzKHNjcl93aWR0aCwgc2NyYnVmLCBsaW5lc19yZW0pICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRpc3BsYXlfaGVhZGVyKGludCBzY3Jfd2lkdGgsIGludCAqbGluZXNfcmVtX3ApCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbODBdOworCWNoYXIgc2NyYnVmWzgwXTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsLCB1c2VkLCBtZnJlZSwgc2hhcmVkLCBidWZmZXJzLCBjYWNoZWQ7CisKKwkvKiByZWFkIG1lbW9yeSBpbmZvICovCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIm1lbWluZm8iKTsKKworCS8qCisJICogT2xkIGtlcm5lbHMgKHN1Y2ggYXMgMi40LngpIGhhZCBhIG5pY2Ugc3VtbWFyeSBvZiBtZW1vcnkgaW5mbyB0aGF0CisJICogd2UgY291bGQgcGFyc2UsIGhvd2V2ZXIgdGhpcyBpcyBnb25lIGVudGlyZWx5IGluIDIuNi4gVHJ5IHBhcnNpbmcKKwkgKiB0aGUgb2xkIHdheSBmaXJzdCwgYW5kIGlmIHRoYXQgZmFpbHMsIHBhcnNlIGVhY2ggZmllbGQgbWFudWFsbHkuCisJICoKKwkgKiBGaXJzdCwgd2UgcmVhZCBpbiB0aGUgZmlyc3QgbGluZS4gT2xkIGtlcm5lbHMgd2lsbCBoYXZlIGJvZ3VzCisJICogc3RyaW5ncyB3ZSBkb24ndCBjYXJlIGFib3V0LCB3aGVyZWFzIG5ldyBrZXJuZWxzIHdpbGwgc3RhcnQgcmlnaHQKKwkgKiBvdXQgd2l0aCBNZW1Ub3RhbDoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFBGTS4KKwkgKi8KKwlpZiAoZnNjYW5mKGZwLCAiTWVtVG90YWw6ICVsdSAlc1xuIiwgJnRvdGFsLCBidWYpICE9IDIpIHsKKwkJZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApOyAgICAvKiBza2lwIGZpcnN0IGxpbmUgKi8KKworCQlmc2NhbmYoZnAsICJNZW06ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1IiwKKwkJCSZ0b3RhbCwgJnVzZWQsICZtZnJlZSwgJnNoYXJlZCwgJmJ1ZmZlcnMsICZjYWNoZWQpOworCQkvKiBjb252ZXJ0IHRvIGtpbG9ieXRlcyAqLworCQl1c2VkIC89IDEwMjQ7CisJCW1mcmVlIC89IDEwMjQ7CisJCXNoYXJlZCAvPSAxMDI0OworCQlidWZmZXJzIC89IDEwMjQ7CisJCWNhY2hlZCAvPSAxMDI0OworCQl0b3RhbCAvPSAxMDI0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJldmVydCB0byBtYW51YWwgcGFyc2luZywgd2hpY2ggaW5jaWRlbnRhbGx5IGFscmVhZHkgaGFzIHRoZQorCQkgKiBzaXplcyBpbiBraWxvYnl0ZXMuIFRoaXMgc2hvdWxkIGJlIHNhZmUgZm9yIGJvdGggMi40IGFuZAorCQkgKiAyLjYuCisJCSAqLworCQlmc2NhbmYoZnAsICJNZW1GcmVlOiAlbHUgJXNcbiIsICZtZnJlZSwgYnVmKTsKKworCQkvKgorCQkgKiBNZW1TaGFyZWQ6IGlzIG5vIGxvbmdlciBwcmVzZW50IGluIDIuNi4gUmVwb3J0IHRoaXMgYXMgMCwKKwkJICogdG8gbWFpbnRhaW4gY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIG5vcm1hbCBwcm9jcHMuCisJCSAqLworCQlpZiAoZnNjYW5mKGZwLCAiTWVtU2hhcmVkOiAlbHUgJXNcbiIsICZzaGFyZWQsIGJ1ZikgIT0gMikKKwkJCXNoYXJlZCA9IDA7CisKKwkJZnNjYW5mKGZwLCAiQnVmZmVyczogJWx1ICVzXG4iLCAmYnVmZmVycywgYnVmKTsKKwkJZnNjYW5mKGZwLCAiQ2FjaGVkOiAlbHUgJXNcbiIsICZjYWNoZWQsIGJ1Zik7CisKKwkJdXNlZCA9IHRvdGFsIC0gbWZyZWU7CisJfQorCWZjbG9zZShmcCk7CisKKwkvKiBvdXRwdXQgbWVtb3J5IGluZm8gKi8KKwlpZiAoc2NyX3dpZHRoID4gKGludClzaXplb2Yoc2NyYnVmKSkKKwkJc2NyX3dpZHRoID0gc2l6ZW9mKHNjcmJ1Zik7CisJc25wcmludGYoc2NyYnVmLCBzY3Jfd2lkdGgsCisJCSJNZW06ICVsdUsgdXNlZCwgJWx1SyBmcmVlLCAlbHVLIHNocmQsICVsdUsgYnVmZiwgJWx1SyBjYWNoZWQiLAorCQl1c2VkLCBtZnJlZSwgc2hhcmVkLCBidWZmZXJzLCBjYWNoZWQpOworCS8qIGdvIHRvIHRvcCAmIGNsZWFyIHRvIHRoZSBlbmQgb2Ygc2NyZWVuICovCisJcHJpbnRmKE9QVF9CQVRDSF9NT0RFID8gIiVzXG4iIDogIlwwMzNbSFwwMzNbSiVzXG4iLCBzY3JidWYpOworCSgqbGluZXNfcmVtX3ApLS07CisKKwkvKiBEaXNwbGF5IENQVSB0aW1lIHNwbGl0IGFzIHBlcmNlbnRhZ2Ugb2YgdG90YWwgdGltZQorCSAqIFRoaXMgZGlzcGxheXMgZWl0aGVyIGEgY3VtdWxhdGl2ZSBsaW5lIG9yIG9uZSBsaW5lIHBlciBDUFUKKwkgKi8KKwlkaXNwbGF5X2NwdXMoc2NyX3dpZHRoLCBzY3JidWYsIGxpbmVzX3JlbV9wKTsKKworCS8qIHJlYWQgbG9hZCBhdmVyYWdlIGFzIGEgc3RyaW5nICovCisJYnVmWzBdID0gJ1wwJzsKKwlvcGVuX3JlYWRfY2xvc2UoImxvYWRhdmciLCBidWYsIHNpemVvZihidWYpIC0gMSk7CisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXG4nOworCSpzdHJjaHIoYnVmLCAnXG4nKSA9ICdcMCc7CisJc25wcmludGYoc2NyYnVmLCBzY3Jfd2lkdGgsICJMb2FkIGF2ZXJhZ2U6ICVzIiwgYnVmKTsKKwlwdXRzKHNjcmJ1Zik7CisJKCpsaW5lc19yZW1fcCktLTsKKworCXJldHVybiB0b3RhbDsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZGlzcGxheV9wcm9jZXNzX2xpc3QoaW50IGxpbmVzX3JlbSwgaW50IHNjcl93aWR0aCkKK3sKKwllbnVtIHsKKwkJQklUU19QRVJfSU5UID0gc2l6ZW9mKGludCkgKiA4CisJfTsKKworCXRvcF9zdGF0dXNfdCAqczsKKwljaGFyIHZzel9zdHJfYnVmWzhdOworCXVuc2lnbmVkIGxvbmcgdG90YWxfbWVtb3J5ID0gZGlzcGxheV9oZWFkZXIoc2NyX3dpZHRoLCAmbGluZXNfcmVtKTsgLyogb3IgdXNlIHRvdGFsX3Zzej8gKi8KKwkvKiB4eHhfc2hpZnQgYW5kIHh4eF9zY2FsZSB2YXJpYWJsZXMgYWxsb3cgdXMgdG8gcmVwbGFjZQorCSAqIGV4cGVuc2l2ZSBkaXZpZGVzIHdpdGggbXVsdGlwbHkgYW5kIHNoaWZ0ICovCisJdW5zaWduZWQgcG1lbV9zaGlmdCwgcG1lbV9zY2FsZSwgcG1lbV9oYWxmOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCXVuc2lnbmVkIHRtcF91bnNpZ25lZDsKKwl1bnNpZ25lZCBwY3B1X3NoaWZ0LCBwY3B1X3NjYWxlLCBwY3B1X2hhbGY7CisJdW5zaWduZWQgYnVzeV9qaWZzOworI2VuZGlmCisKKwkvKiB3aGF0IGluZm8gb2YgdGhlIHByb2Nlc3NlcyBpcyBzaG93biAqLworCXByaW50ZihPUFRfQkFUQ0hfTU9ERSA/ICIlLipzIiA6ICJcMDMzWzdtJS4qc1wwMzNbMG0iLCBzY3Jfd2lkdGgsCisJCSIgIFBJRCAgUFBJRCBVU0VSICAgICBTVEFUICAgVlNaICVWU1oiCisJCUlGX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTKCIgQ1BVIikKKwkJSUZfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UoIiAlQ1BVIikKKwkJIiBDT01NQU5EIik7CisJbGluZXNfcmVtLS07CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfREVDSU1BTFMKKyMgZGVmaW5lIFVQU0NBTEUgMTAwMAorIyBkZWZpbmUgQ0FMQ19TVEFUKG5hbWUsIHZhbCkgZGl2X3QgbmFtZSA9IGRpdigodmFsKSwgMTApCisjIGRlZmluZSBTSE9XX1NUQVQobmFtZSkgbmFtZS5xdW90LCAnMCcrbmFtZS5yZW0KKyMgZGVmaW5lIEZNVCAiJTN1LiVjIgorI2Vsc2UKKyMgZGVmaW5lIFVQU0NBTEUgMTAwCisjIGRlZmluZSBDQUxDX1NUQVQobmFtZSwgdmFsKSB1bnNpZ25lZCBuYW1lID0gKHZhbCkKKyMgZGVmaW5lIFNIT1dfU1RBVChuYW1lKSBuYW1lCisjIGRlZmluZSBGTVQgIiU0dSUlIgorI2VuZGlmCisJLyoKKwkgKiAlVlNaID0gcy0+dnN6L01lbVRvdGFsCisJICovCisJcG1lbV9zaGlmdCA9IEJJVFNfUEVSX0lOVC0xMTsKKwlwbWVtX3NjYWxlID0gVVBTQ0FMRSooMVU8PChCSVRTX1BFUl9JTlQtMTEpKSAvIHRvdGFsX21lbW9yeTsKKwkvKiBzLT52c3ogaXMgaW4ga2IuIHdlIHdhbnQgKHMtPnZzeiAqIHBtZW1fc2NhbGUpIHRvIG5ldmVyIG92ZXJmbG93ICovCisJd2hpbGUgKHBtZW1fc2NhbGUgPj0gNTEyKSB7CisJCXBtZW1fc2NhbGUgLz0gNDsKKwkJcG1lbV9zaGlmdCAtPSAyOworCX0KKwlwbWVtX2hhbGYgPSAoMVUgPDwgcG1lbV9zaGlmdCkgLyAoRU5BQkxFX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTID8gMjAgOiAyKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwlidXN5X2ppZnMgPSBjdXJfamlmLmJ1c3kgLSBwcmV2X2ppZi5idXN5OworCS8qIFRoaXMgaGFwcGVucyBpZiB0aGVyZSB3ZXJlIGxvdHMgb2Ygc2hvcnQtbGl2ZWQgcHJvY2Vzc2VzCisJICogYmV0d2VlbiB0d28gdG9wIHVwZGF0ZXMgKGUuZy4gY29tcGlsYXRpb24pICovCisJaWYgKHRvdGFsX3BjcHUgPCBidXN5X2ppZnMpIHRvdGFsX3BjcHUgPSBidXN5X2ppZnM7CisKKwkvKgorCSAqIENQVSUgPSBzLT5wY3B1L3N1bShzLT5wY3B1KSAqIGJ1c3lfY3B1X3RpY2tzL3RvdGFsX2NwdV90aWNrcworCSAqIChwY3B1IGlzIGRlbHRhIG9mIHN5cyt1c2VyIHRpbWUgYmV0d2VlbiBzYW1wbGVzKQorCSAqLworCS8qIChjdXJfamlmLnh4eCAtIHByZXZfamlmLnh4eCkgYW5kIHMtPnBjcHUgYXJlCisJICogaW4gMC4ufjY0MDAwIHJhbmdlIChIWip1cGRhdGVfaW50ZXJ2YWwpLgorCSAqIHdlIGFzc3VtZSB0aGF0IHVuc2lnbmVkIGlzIGF0IGxlYXN0IDMyLWJpdC4KKwkgKi8KKwlwY3B1X3NoaWZ0ID0gNjsKKwlwY3B1X3NjYWxlID0gVVBTQ0FMRSo2NCAqICh1aW50MTZfdClidXN5X2ppZnM7CisJaWYgKHBjcHVfc2NhbGUgPT0gMCkKKwkJcGNwdV9zY2FsZSA9IDE7CisJd2hpbGUgKHBjcHVfc2NhbGUgPCAoMVUgPDwgKEJJVFNfUEVSX0lOVC0yKSkpIHsKKwkJcGNwdV9zY2FsZSAqPSA0OworCQlwY3B1X3NoaWZ0ICs9IDI7CisJfQorCXRtcF91bnNpZ25lZCA9ICh1aW50MTZfdCkoY3VyX2ppZi50b3RhbCAtIHByZXZfamlmLnRvdGFsKSAqIHRvdGFsX3BjcHU7CisJaWYgKHRtcF91bnNpZ25lZCAhPSAwKQorCQlwY3B1X3NjYWxlIC89IHRtcF91bnNpZ25lZDsKKwkvKiB3ZSB3YW50IChzLT5wY3B1ICogcGNwdV9zY2FsZSkgdG8gbmV2ZXIgb3ZlcmZsb3cgKi8KKwl3aGlsZSAocGNwdV9zY2FsZSA+PSAxMDI0KSB7CisJCXBjcHVfc2NhbGUgLz0gNDsKKwkJcGNwdV9zaGlmdCAtPSAyOworCX0KKwlwY3B1X2hhbGYgPSAoMVUgPDwgcGNwdV9zaGlmdCkgLyAoRU5BQkxFX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTID8gMjAgOiAyKTsKKwkvKiBwcmludGYoIiBwbWVtX3NjYWxlPSV1IHBjcHVfc2NhbGU9JXUgIiwgcG1lbV9zY2FsZSwgcGNwdV9zY2FsZSk7ICovCisjZW5kaWYKKworCS8qIE9rLCBhbGwgcHJlbGltaW5hcnkgZGF0YSBpcyByZWFkeSwgZ28gdGhyb3VnaCB0aGUgbGlzdCAqLworCXNjcl93aWR0aCArPSAyOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nICdcbicgYW5kIHRyYWlsaW5nIE5VTCAqLworCWlmIChsaW5lc19yZW0gPiBudG9wKQorCQlsaW5lc19yZW0gPSBudG9wOworCXMgPSB0b3A7CisJd2hpbGUgKC0tbGluZXNfcmVtID49IDApIHsKKwkJdW5zaWduZWQgY29sOworCQlDQUxDX1NUQVQocG1lbSwgKHMtPnZzeipwbWVtX3NjYWxlICsgcG1lbV9oYWxmKSA+PiBwbWVtX3NoaWZ0KTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwkJQ0FMQ19TVEFUKHBjcHUsIChzLT5wY3B1KnBjcHVfc2NhbGUgKyBwY3B1X2hhbGYpID4+IHBjcHVfc2hpZnQpOworI2VuZGlmCisKKwkJaWYgKHMtPnZzeiA+PSAxMDAwMDApCisJCQlzcHJpbnRmKHZzel9zdHJfYnVmLCAiJTZsZG0iLCBzLT52c3ovMTAyNCk7CisJCWVsc2UKKwkJCXNwcmludGYodnN6X3N0cl9idWYsICIlN2xkIiwgcy0+dnN6KTsKKwkJLyogUElEIFBQSUQgVVNFUiBTVEFUIFZTWiAlVlNaIFslQ1BVXSBDT01NQU5EICovCisJCWNvbCA9IHNucHJpbnRmKGxpbmVfYnVmLCBzY3Jfd2lkdGgsCisJCQkJIlxuIiAiJTV1JTZ1ICUtOC44cyAlcyVzIiBGTVQKKwkJCQlJRl9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUygiICUzZCIpCisJCQkJSUZfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UoRk1UKQorCQkJCSIgIiwKKwkJCQlzLT5waWQsIHMtPnBwaWQsIGdldF9jYWNoZWRfdXNlcm5hbWUocy0+dWlkKSwKKwkJCQlzLT5zdGF0ZSwgdnN6X3N0cl9idWYsCisJCQkJU0hPV19TVEFUKHBtZW0pCisJCQkJSUZfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MoLCBzLT5sYXN0X3NlZW5fb25fY3B1KQorCQkJCUlGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCwgU0hPV19TVEFUKHBjcHUpKQorCQkpOworCQlpZiAoKGludCkoY29sICsgMSkgPCBzY3Jfd2lkdGgpCisJCQlyZWFkX2NtZGxpbmUobGluZV9idWYgKyBjb2wsIHNjcl93aWR0aCAtIGNvbCwgcy0+cGlkLCBzLT5jb21tKTsKKwkJZnB1dHMobGluZV9idWYsIHN0ZG91dCk7CisJCS8qIHByaW50ZigiICVkLyVkICVsbGQvJWxsZCIsIHMtPnBjcHUsIHRvdGFsX3BjcHUsCisJCQljdXJfamlmLmJ1c3kgLSBwcmV2X2ppZi5idXN5LCBjdXJfamlmLnRvdGFsIC0gcHJldl9qaWYudG90YWwpOyAqLworCQlzKys7CisJfQorCS8qIHByaW50ZigiICVkIiwgaGlzdF9pdGVyYXRpb25zKTsgKi8KKwliYl9wdXRjaGFyKE9QVF9CQVRDSF9NT0RFID8gJ1xuJyA6ICdccicpOworCWZmbHVzaF9hbGwoKTsKK30KKyN1bmRlZiBVUFNDQUxFCisjdW5kZWYgU0hPV19TVEFUCisjdW5kZWYgQ0FMQ19TVEFUCisjdW5kZWYgRk1UCisKK3N0YXRpYyB2b2lkIGNsZWFybWVtcyh2b2lkKQoreworCWNsZWFyX3VzZXJuYW1lX2NhY2hlKCk7CisJZnJlZSh0b3ApOworCXRvcCA9IE5VTEw7CisJbnRvcCA9IDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCitzdGF0aWMgdm9pZCByZXNldF90ZXJtKHZvaWQpCit7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJmluaXRpYWxfc2V0dGluZ3MpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbGVhcm1lbXMoKTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCWZyZWUocHJldl9oaXN0KTsKKyMgZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19jYXRjaGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXJlc2V0X3Rlcm0oKTsKKwlfZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9VU0VfVEVSTUlPUyAqLworCisvKgorICogVE9QTUVNIHN1cHBvcnQKKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHRvcG1lbV9zdGF0dXNfdCB7CisJdW5zaWduZWQgcGlkOworCWNoYXIgY29tbVtDT01NX0xFTl07CisJLyogdnN6IGRvZXNuJ3QgY291bnQgL2Rldi94eHggbWFwcGluZ3MgZXhjZXB0IC9kZXYvemVybyAqLworCW1lbV90IHZzeiAgICAgOworCW1lbV90IHZzenJ3ICAgOworCW1lbV90IHJzcyAgICAgOworCW1lbV90IHJzc19zaCAgOworCW1lbV90IGRpcnR5ICAgOworCW1lbV90IGRpcnR5X3NoOworCW1lbV90IHN0YWNrICAgOworfSB0b3BtZW1fc3RhdHVzX3Q7CisKK2VudW0geyBOVU1fU09SVF9GSUVMRCA9IDcgfTsKKworI2RlZmluZSB0b3BtZW0gKCh0b3BtZW1fc3RhdHVzX3QqKXRvcCkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCitzdGF0aWMgaW50IHRvcG1lbV9zb3J0KGNoYXIgKmEsIGNoYXIgKmIpCit7CisJaW50IG47CisJbWVtX3QgbCwgcjsKKworCW4gPSBvZmZzZXRvZih0b3BtZW1fc3RhdHVzX3QsIHZzeikgKyAoc29ydF9maWVsZCAqIHNpemVvZihtZW1fdCkpOworCWwgPSAqKG1lbV90KikoYSArIG4pOworCXIgPSAqKG1lbV90KikoYiArIG4pOworCWlmIChsID09IHIpIHsKKwkJbCA9ICgodG9wbWVtX3N0YXR1c190KilhKS0+ZGlydHk7CisJCXIgPSAoKHRvcG1lbV9zdGF0dXNfdCopYiktPmRpcnR5OworCX0KKwkvKiBXZSB3YW50IHRvIGF2b2lkIHVuc2lnbmVkLT5zaWduZWQgYW5kIHRydW5jYXRpb24gZXJyb3JzICovCisJLyogbD5yOiAtMSwgbD1yOiAwLCBsPHI6IDEgKi8KKwluID0gKGwgPiByKSA/IC0xIDogKGwgIT0gcik7CisJcmV0dXJuIGludmVydGVkID8gLW4gOiBuOworfQorCisvKiBkaXNwbGF5IGhlYWRlciBpbmZvIChtZW1pbmZvIC8gbG9hZGF2ZykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfdG9wbWVtX2hlYWRlcihpbnQgc2NyX3dpZHRoLCBpbnQgKmxpbmVzX3JlbV9wKQoreworCWVudW0geworCQlUT1RBTCA9IDAsIE1GUkVFLCBCVUYsIENBQ0hFLAorCQlTV0FQVE9UQUwsIFNXQVBGUkVFLCBESVJUWSwKKwkJTVdSSVRFLCBBTk9OLCBNQVAsIFNMQUIsCisJCU5VTV9GSUVMRFMKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIG1hdGNoW05VTV9GSUVMRFNdWzEyXSA9IHsKKwkJIlx4MDkiICJNZW1Ub3RhbDoiLCAgLy8gVE9UQUwKKwkJIlx4MDgiICJNZW1GcmVlOiIsICAgLy8gTUZSRUUKKwkJIlx4MDgiICJCdWZmZXJzOiIsICAgLy8gQlVGCisJCSJceDA3IiAiQ2FjaGVkOiIsICAgIC8vIENBQ0hFCisJCSJceDBhIiAiU3dhcFRvdGFsOiIsIC8vIFNXQVBUT1RBTAorCQkiXHgwOSIgIlN3YXBGcmVlOiIsICAvLyBTV0FQRlJFRQorCQkiXHgwNiIgIkRpcnR5OiIsICAgICAvLyBESVJUWQorCQkiXHgwYSIgIldyaXRlYmFjazoiLCAvLyBNV1JJVEUKKwkJIlx4MGEiICJBbm9uUGFnZXM6IiwgLy8gQU5PTgorCQkiXHgwNyIgIk1hcHBlZDoiLCAgICAvLyBNQVAKKwkJIlx4MDUiICJTbGFiOiIsICAgICAgLy8gU0xBQgorCX07CisJY2hhciBtZW1pbmZvX2J1Zls0ICogMTAyNF07CisJY29uc3QgY2hhciAqWltOVU1fRklFTERTXTsKKwl1bnNpZ25lZCBpOworCWludCBzejsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRklFTERTOyBpKyspCisJCVpbaV0gPSAiPyI7CisKKwkvKiByZWFkIG1lbW9yeSBpbmZvICovCisJc3ogPSBvcGVuX3JlYWRfY2xvc2UoIm1lbWluZm8iLCBtZW1pbmZvX2J1Ziwgc2l6ZW9mKG1lbWluZm9fYnVmKSAtIDEpOworCWlmIChzeiA+PSAwKSB7CisJCWNoYXIgKnAgPSBtZW1pbmZvX2J1ZjsKKwkJbWVtaW5mb19idWZbc3pdID0gJ1wwJzsKKwkJLyogTm90ZSB0aGF0IGZpZWxkcyBhbHdheXMgYXBwZWFyIGluIHRoZSBtYXRjaFtdIG9yZGVyICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRklFTERTOyBpKyspIHsKKwkJCWNoYXIgKmZvdW5kID0gc3Ryc3RyKHAsIG1hdGNoW2ldICsgMSk7CisJCQlpZiAoZm91bmQpIHsKKwkJCQkvKiBDdXQgIk5OTk4iIG91dCBvZiAiICAgIE5OTk4ga2IiICovCisJCQkJY2hhciAqcyA9IHNraXBfd2hpdGVzcGFjZShmb3VuZCArIG1hdGNoW2ldWzBdKTsKKwkJCQlwID0gc2tpcF9ub25fd2hpdGVzcGFjZShzKTsKKwkJCQkqcCsrID0gJ1wwJzsKKwkJCQlaW2ldID0gczsKKwkJCX0KKwkJfQorCX0KKworCXNucHJpbnRmKGxpbmVfYnVmLCBMSU5FX0JVRl9TSVpFLAorCQkiTWVtIHRvdGFsOiVzIGFub246JXMgbWFwOiVzIGZyZWU6JXMiLAorCQlaW1RPVEFMXSwgWltBTk9OXSwgWltNQVBdLCBaW01GUkVFXSk7CisJcHJpbnRmKE9QVF9CQVRDSF9NT0RFID8gIiUuKnNcbiIgOiAiXDAzM1tIXDAzM1tKJS4qc1xuIiwgc2NyX3dpZHRoLCBsaW5lX2J1Zik7CisKKwlzbnByaW50ZihsaW5lX2J1ZiwgTElORV9CVUZfU0laRSwKKwkJIiBzbGFiOiVzIGJ1ZjolcyBjYWNoZTolcyBkaXJ0eTolcyB3cml0ZTolcyIsCisJCVpbU0xBQl0sIFpbQlVGXSwgWltDQUNIRV0sIFpbRElSVFldLCBaW01XUklURV0pOworCXByaW50ZigiJS4qc1xuIiwgc2NyX3dpZHRoLCBsaW5lX2J1Zik7CisKKwlzbnByaW50ZihsaW5lX2J1ZiwgTElORV9CVUZfU0laRSwKKwkJIlN3YXAgdG90YWw6JXMgZnJlZTolcyIsIC8vIFRPRE86ICUgdXNlZD8KKwkJWltTV0FQVE9UQUxdLCBaW1NXQVBGUkVFXSk7CisJcHJpbnRmKCIlLipzXG4iLCBzY3Jfd2lkdGgsIGxpbmVfYnVmKTsKKworCSgqbGluZXNfcmVtX3ApIC09IDM7Cit9CisKK3N0YXRpYyB2b2lkIHVsbHRvYTZfYW5kX3NwYWNlKHVuc2lnbmVkIGxvbmcgbG9uZyB1bCwgY2hhciBidWZbNl0pCit7CisJLyogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVyYSAqLworCXNtYXJ0X3VsbHRvYTUodWwsIGJ1ZiwgIiBtZ3RwZXp5Iik7CisJYnVmWzVdID0gJyAnOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBkaXNwbGF5X3RvcG1lbV9wcm9jZXNzX2xpc3QoaW50IGxpbmVzX3JlbSwgaW50IHNjcl93aWR0aCkKK3sKKyNkZWZpbmUgSERSX1NUUiAiICBQSUQgICBWU1ogVlNaUlcgICBSU1MgKFNIUikgRElSVFkgKFNIUikgU1RBQ0siCisjZGVmaW5lIE1JTl9XSURUSCBzaXplb2YoSERSX1NUUikKKwljb25zdCB0b3BtZW1fc3RhdHVzX3QgKnMgPSB0b3BtZW07CisKKwlkaXNwbGF5X3RvcG1lbV9oZWFkZXIoc2NyX3dpZHRoLCAmbGluZXNfcmVtKTsKKwlzdHJjcHkobGluZV9idWYsIEhEUl9TVFIgIiBDT01NQU5EIik7CisJbGluZV9idWZbMTEgKyBzb3J0X2ZpZWxkICogNl0gPSAiXl8iW2ludmVydGVkXTsKKwlwcmludGYoT1BUX0JBVENIX01PREUgPyAiJS4qcyIgOiAiXGVbN20lLipzXGVbMG0iLCBzY3Jfd2lkdGgsIGxpbmVfYnVmKTsKKwlsaW5lc19yZW0tLTsKKworCWlmIChsaW5lc19yZW0gPiBudG9wKQorCQlsaW5lc19yZW0gPSBudG9wOworCXdoaWxlICgtLWxpbmVzX3JlbSA+PSAwKSB7CisJCS8qIFBJRCBWU1ogVlNaUlcgUlNTIChTSFIpIERJUlRZIChTSFIpIENPTU1BTkQgKi8KKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+cGlkICAgICAsICZsaW5lX2J1ZlswKjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+dnN6ICAgICAsICZsaW5lX2J1ZlsxKjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+dnN6cncgICAsICZsaW5lX2J1ZlsyKjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+cnNzICAgICAsICZsaW5lX2J1ZlszKjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+cnNzX3NoICAsICZsaW5lX2J1Zls0KjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+ZGlydHkgICAsICZsaW5lX2J1Zls1KjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+ZGlydHlfc2gsICZsaW5lX2J1Zls2KjZdKTsKKwkJdWxsdG9hNl9hbmRfc3BhY2Uocy0+c3RhY2sgICAsICZsaW5lX2J1Zls3KjZdKTsKKwkJbGluZV9idWZbOCo2XSA9ICdcMCc7CisJCWlmIChzY3Jfd2lkdGggPiAoaW50KU1JTl9XSURUSCkgeworCQkJcmVhZF9jbWRsaW5lKCZsaW5lX2J1Zls4KjZdLCBzY3Jfd2lkdGggLSBNSU5fV0lEVEgsIHMtPnBpZCwgcy0+Y29tbSk7CisJCX0KKwkJcHJpbnRmKCJcbiIiJS4qcyIsIHNjcl93aWR0aCwgbGluZV9idWYpOworCQlzKys7CisJfQorCWJiX3B1dGNoYXIoT1BUX0JBVENIX01PREUgPyAnXG4nIDogJ1xyJyk7CisJZmZsdXNoX2FsbCgpOworI3VuZGVmIEhEUl9TVFIKKyN1bmRlZiBNSU5fV0lEVEgKK30KKworI2Vsc2UKK3ZvaWQgZGlzcGxheV90b3BtZW1fcHJvY2Vzc19saXN0KGludCBsaW5lc19yZW0sIGludCBzY3Jfd2lkdGgpOworaW50IHRvcG1lbV9zb3J0KGNoYXIgKmEsIGNoYXIgKmIpOworI2VuZGlmIC8qIFRPUE1FTSAqLworCisvKgorICogZW5kIFRPUE1FTSBzdXBwb3J0CisgKi8KKworZW51bSB7CisJVE9QX01BU0sgPSAwCisJCXwgUFNTQ0FOX1BJRAorCQl8IFBTU0NBTl9QUElECisJCXwgUFNTQ0FOX1ZTWgorCQl8IFBTU0NBTl9TVElNRQorCQl8IFBTU0NBTl9VVElNRQorCQl8IFBTU0NBTl9TVEFURQorCQl8IFBTU0NBTl9DT01NCisJCXwgUFNTQ0FOX0NQVQorCQl8IFBTU0NBTl9VSURHSUQsCisJVE9QTUVNX01BU0sgPSAwCisJCXwgUFNTQ0FOX1BJRAorCQl8IFBTU0NBTl9TTUFQUworCQl8IFBTU0NBTl9DT01NLAorCUVYSVRfTUFTSyA9ICh1bnNpZ25lZCktMSwKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworc3RhdGljIHVuc2lnbmVkIGhhbmRsZV9pbnB1dCh1bnNpZ25lZCBzY2FuX21hc2ssIHVuc2lnbmVkIGludGVydmFsKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKworCXBmZFswXS5mZCA9IDA7CisJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKworCXdoaWxlICgxKSB7CisJCWlmIChzYWZlX3BvbGwocGZkLCAxLCBpbnRlcnZhbCAqIDEwMDApIDw9IDApCisJCQlyZXR1cm4gc2Nhbl9tYXNrOworCQlpbnRlcnZhbCA9IDA7CisKKwkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSAhPSAxKSB7IC8qIGVycm9yL0VPRj8gKi8KKwkJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX0VPRjsKKwkJCXJldHVybiBzY2FuX21hc2s7CisJCX0KKworCQlpZiAoYyA9PSBpbml0aWFsX3NldHRpbmdzLmNfY2NbVklOVFJdKQorCQkJcmV0dXJuIEVYSVRfTUFTSzsKKwkJaWYgKGMgPT0gaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZFT0ZdKQorCQkJcmV0dXJuIEVYSVRfTUFTSzsKKwkJYyB8PSAweDIwOyAvKiBsb3dlcmNhc2UgKi8KKwkJaWYgKGMgPT0gJ3EnKQorCQkJcmV0dXJuIEVYSVRfTUFTSzsKKworCQlpZiAoYyA9PSAnbicpIHsKKwkJCUlGX0ZFQVRVUkVfVE9QTUVNKHNjYW5fbWFzayA9IFRPUF9NQVNLOykKKwkJCXNvcnRfZnVuY3Rpb25bMF0gPSBwaWRfc29ydDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdtJykgeworCQkJSUZfRkVBVFVSRV9UT1BNRU0oc2Nhbl9tYXNrID0gVE9QX01BU0s7KQorCQkJc29ydF9mdW5jdGlvblswXSA9IG1lbV9zb3J0OworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwkJCXNvcnRfZnVuY3Rpb25bMV0gPSBwY3B1X3NvcnQ7CisJCQlzb3J0X2Z1bmN0aW9uWzJdID0gdGltZV9zb3J0OworIyBlbmRpZgorCQkJY29udGludWU7CisJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJCWlmIChjID09ICdoJworCQkgSUZfRkVBVFVSRV9UT1BNRU0oJiYgc2Nhbl9tYXNrICE9IFRPUE1FTV9NQVNLKQorCQkpIHsKKwkJCXNjYW5fbWFzayBePSBQU1NDQU5fVEFTS1M7CisJCQljb250aW51ZTsKKwkJfQorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwkJaWYgKGMgPT0gJ3AnKSB7CisJCQlJRl9GRUFUVVJFX1RPUE1FTShzY2FuX21hc2sgPSBUT1BfTUFTSzspCisJCQlzb3J0X2Z1bmN0aW9uWzBdID0gcGNwdV9zb3J0OworCQkJc29ydF9mdW5jdGlvblsxXSA9IG1lbV9zb3J0OworCQkJc29ydF9mdW5jdGlvblsyXSA9IHRpbWVfc29ydDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICd0JykgeworCQkJSUZfRkVBVFVSRV9UT1BNRU0oc2Nhbl9tYXNrID0gVE9QX01BU0s7KQorCQkJc29ydF9mdW5jdGlvblswXSA9IHRpbWVfc29ydDsKKwkJCXNvcnRfZnVuY3Rpb25bMV0gPSBtZW1fc29ydDsKKwkJCXNvcnRfZnVuY3Rpb25bMl0gPSBwY3B1X3NvcnQ7CisJCQljb250aW51ZTsKKwkJfQorIyAgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJCWlmIChjID09ICdzJykgeworCQkJc2Nhbl9tYXNrID0gVE9QTUVNX01BU0s7CisJCQlmcmVlKHByZXZfaGlzdCk7CisJCQlwcmV2X2hpc3QgPSBOVUxMOworCQkJcHJldl9oaXN0X2NvdW50ID0gMDsKKwkJCXNvcnRfZmllbGQgPSAoc29ydF9maWVsZCArIDEpICUgTlVNX1NPUlRfRklFTEQ7CisJCQljb250aW51ZTsKKwkJfQorIyAgZW5kaWYKKwkJaWYgKGMgPT0gJ3InKSB7CisJCQlpbnZlcnRlZCBePSAxOworCQkJY29udGludWU7CisJCX0KKyMgIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJCS8qIHByb2Nwcy0yLjAuMTggdXNlcyAnQycsIDMuMi43IHVzZXMgJzEnICovCisJCWlmIChjID09ICdjJyB8fCBjID09ICcxJykgeworCQkJLyogVXNlciB3YW50cyB0byB0b2dnbGUgcGVyIGNwdSA8PiBhZ2dyZWdhdGUgKi8KKwkJCWlmIChzbXBfY3B1X2luZm8pIHsKKwkJCQlmcmVlKGNwdV9wcmV2X2ppZik7CisJCQkJZnJlZShjcHVfamlmKTsKKwkJCQljcHVfamlmID0gJmN1cl9qaWY7CisJCQkJY3B1X3ByZXZfamlmID0gJnByZXZfamlmOworCQkJfSBlbHNlIHsKKwkJCQkvKiBQcmVwYXJlIGZvciB4cmVhbGxvYygpICovCisJCQkJY3B1X2ppZiA9IGNwdV9wcmV2X2ppZiA9IE5VTEw7CisJCQl9CisJCQludW1fY3B1cyA9IDA7CisJCQlzbXBfY3B1X2luZm8gPSAhc21wX2NwdV9pbmZvOworCQkJZ2V0X2ppZmZ5X2NvdW50cygpOworCQkJY29udGludWU7CisJCX0KKyMgIGVuZGlmCisjIGVuZGlmCisJCWJyZWFrOyAvKiB1bmtub3duIGtleSAtPiBmb3JjZSByZWZyZXNoICovCisJfQorCisJcmV0dXJuIHNjYW5fbWFzazsKK30KKyNlbmRpZgorCisvL3VzYWdlOiNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMgfHwgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKy8vdXNhZ2U6IyBkZWZpbmUgSUZfU0hPV19USFJFQURTX09SX1RPUF9TTVAoLi4uKSBfX1ZBX0FSR1NfXworLy91c2FnZTojZWxzZQorLy91c2FnZTojIGRlZmluZSBJRl9TSE9XX1RIUkVBRFNfT1JfVE9QX1NNUCguLi4pCisvL3VzYWdlOiNlbmRpZgorLy91c2FnZTojZGVmaW5lIHRvcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1iXSBbLW5DT1VOVF0gWy1kU0VDT05EU10iIElGX0ZFQVRVUkVfVE9QTUVNKCIgWy1tXSIpCisvL3VzYWdlOiNkZWZpbmUgdG9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJvdmlkZSBhIHZpZXcgb2YgcHJvY2VzcyBhY3Rpdml0eSBpbiByZWFsIHRpbWUuIgorLy91c2FnZTogICAiXG4iIlJlYWQgdGhlIHN0YXR1cyBvZiBhbGwgcHJvY2Vzc2VzIGZyb20gL3Byb2MgZWFjaCBTRUNPTkRTIgorLy91c2FnZTogICAiXG4iImFuZCBkaXNwbGF5IGEgc2NyZWVuZnVsIG9mIHRoZW0uIgorLy91c2FnZTogICAiXG4iIktleXM6IgorLy91c2FnZTogICAiXG4iIglOL00iCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSgiL1AiKQorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UoIi9UIikKKy8vdXNhZ2U6ICAgICAgICAgICAiOiAiIElGX0ZFQVRVUkVfVE9QTUVNKCJzaG93IENQVSB1c2FnZSwgIikgInNvcnQgYnkgcGlkL21lbSIKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCIvY3B1IikKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCIvdGltZSIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RPUE1FTSgKKy8vdXNhZ2U6ICAgIlxuIiIJUzogc2hvdyBtZW1vcnkiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICJcbiIiCVI6IHJldmVyc2Ugc29ydCIKKy8vdXNhZ2U6CUlGX1NIT1dfVEhSRUFEU19PUl9UT1BfU01QKAorLy91c2FnZTogICAiXG4iIgkiCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUygiSDogdG9nZ2xlIHRocmVhZHMiKQorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoSUZfRkVBVFVSRV9UT1BfU01QX0NQVSgiLCAiKSkKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfVE9QX1NNUF9DUFUoIjE6IHRvZ2dsZSBTTVAiKQorLy91c2FnZToJKQorLy91c2FnZTogICAiXG4iIglRLF5DOiBleGl0IgorLy91c2FnZTogICAiXG4iCisvL3VzYWdlOiAgICJcbiIiT3B0aW9uczoiCisvL3VzYWdlOiAgICJcbiIiCS1iCUJhdGNoIG1vZGUiCisvL3VzYWdlOiAgICJcbiIiCS1uIE4JRXhpdCBhZnRlciBOIGl0ZXJhdGlvbnMiCisvL3VzYWdlOiAgICJcbiIiCS1kIE4JRGVsYXkgYmV0d2VlbiB1cGRhdGVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9UT1BNRU0oCisvL3VzYWdlOiAgICJcbiIiCS1tCVNhbWUgYXMgJ3MnIGtleSIKKy8vdXNhZ2U6CSkKKworLyogSW50ZXJhY3RpdmUgdGVzdGluZzoKKyAqIGVjaG8gc3NzIHwgLi9idXN5Ym94IHRvcAorICogLSBzaG93cyBtZW1vcnkgc2NyZWVuCisgKiBlY2hvIHNzcyB8IC4vYnVzeWJveCB0b3AgLWJuMSA+bWVtCisgKiAtIHNhdmVzIG1lbW9yeSBzY3JlZW4gLSB0aGUgKndob2xlKiBsaXN0LCBub3QgZmlyc3QgTlJPV1MgcHJvY2Vzc2VzIQorICogZWNobyAubS5zLnMucy5zLnMucy5xIHwgLi9idXN5Ym94IHRvcCAtYiA+egorICogLSBzYXZlcyBzZXZlcmFsIGRpZmZlcmVudCBzY3JlZW5zLCBhbmQgZXhpdHMKKyAqCisgKiBUT0RPOiAtaSBTVFJJTkcgcGFyYW0gYXMgYSBiZXR0ZXIgYWx0ZXJuYXRpdmU/CisgKi8KKworaW50IHRvcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdG9wX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaXRlcmF0aW9uczsKKwl1bnNpZ25lZCBsaW5lcywgY29sOworCXVuc2lnbmVkIGludGVydmFsOworCWNoYXIgKnN0cl9pbnRlcnZhbCwgKnN0cl9pdGVyYXRpb25zOworCXVuc2lnbmVkIHNjYW5fbWFzayA9IFRPUF9NQVNLOworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJc3RydWN0IHRlcm1pb3MgbmV3X3NldHRpbmdzOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCWludGVydmFsID0gNTsgLyogZGVmYXVsdCB1cGRhdGUgaW50ZXJ2YWwgaXMgNSBzZWNvbmRzICovCisJaXRlcmF0aW9ucyA9IDA7IC8qIGluZmluaXRlICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwkvKm51bV9jcHVzID0gMDsqLworCS8qc21wX2NwdV9pbmZvID0gMDsqLyAgLyogdG8gc3RhcnQgd2l0aCBzaG93IGFnZ3JlZ2F0ZSAqLworCWNwdV9qaWYgPSAmY3VyX2ppZjsKKwljcHVfcHJldl9qaWYgPSAmcHJldl9qaWY7CisjZW5kaWYKKworCS8qIGFsbCBhcmdzIGFyZSBvcHRpb25zOyAtbiBOVU0gKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItIjsgLyogb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIHcvbyBkYXNoICovCisJY29sID0gZ2V0b3B0MzIoYXJndiwgImQ6bjpiIklGX0ZFQVRVUkVfVE9QTUVNKCJtIiksICZzdHJfaW50ZXJ2YWwsICZzdHJfaXRlcmF0aW9ucyk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJaWYgKGNvbCAmIE9QVF9tKSAvKiAtbSAoYnVzeWJveCBzcGVjaWZpYykgKi8KKwkJc2Nhbl9tYXNrID0gVE9QTUVNX01BU0s7CisjZW5kaWYKKwlpZiAoY29sICYgT1BUX2QpIHsKKwkJLyogd29yayBhcm91bmQgZm9yICItZCAxIiAtPiAiLWQgLTEiIGRvbmUgYnkgZ2V0b3B0MzIKKwkJICogKG9wdF9jb21wbGVtZW50YXJ5ID09ICItIiBkb2VzIHRoaXMpICovCisJCWlmIChzdHJfaW50ZXJ2YWxbMF0gPT0gJy0nKQorCQkJc3RyX2ludGVydmFsKys7CisJCS8qIE5lZWQgdG8gbGltaXQgaXQgdG8gbm90IG92ZXJmbG93IHBvbGwgdGltZW91dCAqLworCQlpbnRlcnZhbCA9IHhhdG91MTYoc3RyX2ludGVydmFsKTsKKwl9CisJaWYgKGNvbCAmIE9QVF9uKSB7CisJCWlmIChzdHJfaXRlcmF0aW9uc1swXSA9PSAnLScpCisJCQlzdHJfaXRlcmF0aW9ucysrOworCQlpdGVyYXRpb25zID0geGF0b3Uoc3RyX2l0ZXJhdGlvbnMpOworCX0KKworCS8qIGNoYW5nZSB0byAvcHJvYyAqLworCXhjaGRpcigiL3Byb2MiKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCXNvcnRfZnVuY3Rpb25bMF0gPSBwY3B1X3NvcnQ7CisJc29ydF9mdW5jdGlvblsxXSA9IG1lbV9zb3J0OworCXNvcnRfZnVuY3Rpb25bMl0gPSB0aW1lX3NvcnQ7CisjZWxzZQorCXNvcnRfZnVuY3Rpb25bMF0gPSBtZW1fc29ydDsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwl0Y2dldGF0dHIoMCwgKHZvaWQgKikgJmluaXRpYWxfc2V0dGluZ3MpOworCW1lbWNweSgmbmV3X3NldHRpbmdzLCAmaW5pdGlhbF9zZXR0aW5ncywgc2l6ZW9mKG5ld19zZXR0aW5ncykpOworCWlmICghT1BUX0JBVENIX01PREUpIHsKKwkJLyogdW5idWZmZXJlZCBpbnB1dCwgdHVybiBvZmYgZWNobyAqLworCQluZXdfc2V0dGluZ3MuY19sZmxhZyAmPSB+KElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT05MKTsKKwkJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJm5ld19zZXR0aW5ncyk7CisJfQorCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBzaWdfY2F0Y2hlcik7CisKKwkvKiBFYXQgaW5pdGlhbCBpbnB1dCwgaWYgYW55ICovCisJc2Nhbl9tYXNrID0gaGFuZGxlX2lucHV0KHNjYW5fbWFzaywgMCk7CisjZW5kaWYKKworCXdoaWxlIChzY2FuX21hc2sgIT0gRVhJVF9NQVNLKSB7CisJCXByb2Nwc19zdGF0dXNfdCAqcCA9IE5VTEw7CisKKwkJaWYgKE9QVF9CQVRDSF9NT0RFKSB7CisJCQlsaW5lcyA9IElOVF9NQVg7CisJCQljb2wgPSBMSU5FX0JVRl9TSVpFIC0gMjsgLyogKzIgYnl0ZXMgZm9yICdcbicsIE5VTCAqLworCQl9IGVsc2UgeworCQkJbGluZXMgPSAyNDsgLyogZGVmYXVsdCAqLworCQkJY29sID0gNzk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwkJCS8qIFdlIG91dHB1dCB0byBzdGRvdXQsIHdlIG5lZWQgc2l6ZSBvZiBzdGRvdXQgKG5vdCBzdGRpbikhICovCisJCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURE9VVF9GSUxFTk8sICZjb2wsICZsaW5lcyk7CisJCQlpZiAobGluZXMgPCA1IHx8IGNvbCA8IDEwKSB7CisJCQkJc2xlZXAoaW50ZXJ2YWwpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAoY29sID4gTElORV9CVUZfU0laRSAtIDIpCisJCQkJY29sID0gTElORV9CVUZfU0laRSAtIDI7CisJCX0KKworCQkvKiByZWFkIHByb2Nlc3MgSURzICYgc3RhdHVzIGZvciBhbGwgdGhlIHByb2Nlc3NlcyAqLworCQl3aGlsZSAoKHAgPSBwcm9jcHNfc2NhbihwLCBzY2FuX21hc2spKSAhPSBOVUxMKSB7CisJCQlpbnQgbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwkJCWlmIChzY2FuX21hc2sgIT0gVE9QTUVNX01BU0spCisjZW5kaWYKKwkJCXsKKwkJCQluID0gbnRvcDsKKwkJCQl0b3AgPSB4cmVhbGxvY192ZWN0b3IodG9wLCA2LCBudG9wKyspOworCQkJCXRvcFtuXS5waWQgPSBwLT5waWQ7CisJCQkJdG9wW25dLnBwaWQgPSBwLT5wcGlkOworCQkJCXRvcFtuXS52c3ogPSBwLT52c3o7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCQkJdG9wW25dLnRpY2tzID0gcC0+c3RpbWUgKyBwLT51dGltZTsKKyNlbmRpZgorCQkJCXRvcFtuXS51aWQgPSBwLT51aWQ7CisJCQkJc3RyY3B5KHRvcFtuXS5zdGF0ZSwgcC0+c3RhdGUpOworCQkJCXN0cmNweSh0b3Bbbl0uY29tbSwgcC0+Y29tbSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJCQkJdG9wW25dLmxhc3Rfc2Vlbl9vbl9jcHUgPSBwLT5sYXN0X3NlZW5fb25fY3B1OworI2VuZGlmCisJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJCQllbHNlIHsgLyogVE9QTUVNICovCisJCQkJaWYgKCEocC0+c21hcHMubWFwcGVkX3JvIHwgcC0+c21hcHMubWFwcGVkX3J3KSkKKwkJCQkJY29udGludWU7IC8qIGtlcm5lbCB0aHJlYWRzIGFyZSBpZ25vcmVkICovCisJCQkJbiA9IG50b3A7CisJCQkJLyogTm8gYnVnIGhlcmUgLSB0b3AgYW5kIHRvcG1lbSBhcmUgdGhlIHNhbWUgKi8KKwkJCQl0b3AgPSB4cmVhbGxvY192ZWN0b3IodG9wbWVtLCA2LCBudG9wKyspOworCQkJCXN0cmNweSh0b3BtZW1bbl0uY29tbSwgcC0+Y29tbSk7CisJCQkJdG9wbWVtW25dLnBpZCAgICAgID0gcC0+cGlkOworCQkJCXRvcG1lbVtuXS52c3ogICAgICA9IHAtPnNtYXBzLm1hcHBlZF9ydyArIHAtPnNtYXBzLm1hcHBlZF9ybzsKKwkJCQl0b3BtZW1bbl0udnN6cncgICAgPSBwLT5zbWFwcy5tYXBwZWRfcnc7CisJCQkJdG9wbWVtW25dLnJzc19zaCAgID0gcC0+c21hcHMuc2hhcmVkX2NsZWFuICsgcC0+c21hcHMuc2hhcmVkX2RpcnR5OworCQkJCXRvcG1lbVtuXS5yc3MgICAgICA9IHAtPnNtYXBzLnByaXZhdGVfY2xlYW4gKyBwLT5zbWFwcy5wcml2YXRlX2RpcnR5ICsgdG9wbWVtW25dLnJzc19zaDsKKwkJCQl0b3BtZW1bbl0uZGlydHkgICAgPSBwLT5zbWFwcy5wcml2YXRlX2RpcnR5ICsgcC0+c21hcHMuc2hhcmVkX2RpcnR5OworCQkJCXRvcG1lbVtuXS5kaXJ0eV9zaCA9IHAtPnNtYXBzLnNoYXJlZF9kaXJ0eTsKKwkJCQl0b3BtZW1bbl0uc3RhY2sgICAgPSBwLT5zbWFwcy5zdGFjazsKKwkJCX0KKyNlbmRpZgorCQl9IC8qIGVuZCBvZiAid2hpbGUgd2UgcmVhZCAvcHJvYyIgKi8KKwkJaWYgKG50b3AgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJubyBwcm9jZXNzIGluZm8gaW4gL3Byb2MiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNjYW5fbWFzayAhPSBUT1BNRU1fTUFTSykgeworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCQkJaWYgKCFwcmV2X2hpc3RfY291bnQpIHsKKwkJCQlkb19zdGF0cygpOworCQkJCXVzbGVlcCgxMDAwMDApOworCQkJCWNsZWFybWVtcygpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZG9fc3RhdHMoKTsKKwkJCS8qIFRPRE86IHdlIGRvbid0IG5lZWQgdG8gc29ydCBhbGwgMTAwMDAgcHJvY2Vzc2VzLCB3ZSBuZWVkIHRvIGZpbmQgdG9wIDI0ISAqLworCQkJcXNvcnQodG9wLCBudG9wLCBzaXplb2YodG9wX3N0YXR1c190KSwgKHZvaWQqKW11bHRfbHZsX2NtcCk7CisjZWxzZQorCQkJcXNvcnQodG9wLCBudG9wLCBzaXplb2YodG9wX3N0YXR1c190KSwgKHZvaWQqKShzb3J0X2Z1bmN0aW9uWzBdKSk7CisjZW5kaWYKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCQllbHNlIHsgLyogVE9QTUVNICovCisJCQlxc29ydCh0b3BtZW0sIG50b3AsIHNpemVvZih0b3BtZW1fc3RhdHVzX3QpLCAodm9pZCopdG9wbWVtX3NvcnQpOworCQl9CisjZW5kaWYKKwkJaWYgKHNjYW5fbWFzayAhPSBUT1BNRU1fTUFTSykKKwkJCWRpc3BsYXlfcHJvY2Vzc19saXN0KGxpbmVzLCBjb2wpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCQllbHNlCisJCQlkaXNwbGF5X3RvcG1lbV9wcm9jZXNzX2xpc3QobGluZXMsIGNvbCk7CisjZW5kaWYKKwkJY2xlYXJtZW1zKCk7CisJCWlmIChpdGVyYXRpb25zID49IDAgJiYgIS0taXRlcmF0aW9ucykKKwkJCWJyZWFrOworI2lmICFFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCQlzbGVlcChpbnRlcnZhbCk7CisjZWxzZQorCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9FT0YpCisJCQkvKiBFT0Ygb24gc3RkaW4gKCJ0b3AgPC9kZXYvbnVsbCIpICovCisJCQlzbGVlcChpbnRlcnZhbCk7CisJCWVsc2UKKwkJCXNjYW5fbWFzayA9IGhhbmRsZV9pbnB1dChzY2FuX21hc2ssIGludGVydmFsKTsKKyNlbmRpZiAvKiBGRUFUVVJFX1VTRV9URVJNSU9TICovCisJfSAvKiBlbmQgb2YgIndoaWxlIChub3QgUSkiICovCisKKwliYl9wdXRjaGFyKCdcbicpOworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJcmVzZXRfdGVybSgpOworI2VuZGlmCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy91cHRpbWUuYyBiL3Byb2Nwcy91cHRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg4MTJhCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3VwdGltZS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHVwdGltZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIDIwMTEJCVBlcmUgT3JnYSA8Z290cnVua3NAZ21haWwuY29tPgorICoKKyAqIEFkZGVkIEZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVCBmbGFnLgorICovCisKKy8qIGdldG9wdCBub3QgbmVlZGVkICovCisKKy8vY29uZmlnOmNvbmZpZyBVUFRJTUUKKy8vY29uZmlnOglib29sICJ1cHRpbWUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYICNzeXNpbmZvKCkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB1cHRpbWUgZ2l2ZXMgYSBvbmUgbGluZSBkaXNwbGF5IG9mIHRoZSBjdXJyZW50IHRpbWUsIGhvdyBsb25nCisvL2NvbmZpZzoJICB0aGUgc3lzdGVtIGhhcyBiZWVuIHJ1bm5pbmcsIGhvdyBtYW55IHVzZXJzIGFyZSBjdXJyZW50bHkgbG9nZ2VkCisvL2NvbmZpZzoJICBvbiwgYW5kIHRoZSBzeXN0ZW0gbG9hZCBhdmVyYWdlcyBmb3IgdGhlIHBhc3QgMSwgNSwgYW5kIDE1IG1pbnV0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1VQVElNRV9VVE1QX1NVUFBPUlQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGZvciBzaG93aW5nIHRoZSBudW1iZXIgb2YgdXNlcnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBVUFRJTUUgJiYgRkVBVFVSRV9VVE1QCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZXMgdXB0aW1lIGRpc3BsYXkgdGhlIG51bWJlciBvZiB1c2VycyBjdXJyZW50bHkgbG9nZ2VkIG9uLgorCisvL3VzYWdlOiNkZWZpbmUgdXB0aW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgdXB0aW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSB0aGUgdGltZSBzaW5jZSB0aGUgbGFzdCBib290IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1cHRpbWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdXB0aW1lXG4iCisvL3VzYWdlOiAgICAgICAiICAxOjU1cG0gIHVwICAyOjMwLCBsb2FkIGF2ZXJhZ2U6IDAuMDksIDAuMDQsIDAuMDBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWZkZWYgX19saW51eF9fCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjZW5kaWYKKworCisjaWZuZGVmIEZTSElGVAorIyBkZWZpbmUgRlNISUZUIDE2ICAgICAgICAgICAgICAvKiBuciBvZiBiaXRzIG9mIHByZWNpc2lvbiAqLworI2VuZGlmCisjZGVmaW5lIEZJWEVEXzEgICAgICAoMSA8PCBGU0hJRlQpICAgICAvKiAxLjAgYXMgZml4ZWQtcG9pbnQgKi8KKyNkZWZpbmUgTE9BRF9JTlQoeCkgICh1bnNpZ25lZCkoKHgpID4+IEZTSElGVCkKKyNkZWZpbmUgTE9BRF9GUkFDKHgpIExPQURfSU5UKCgoeCkgJiAoRklYRURfMSAtIDEpKSAqIDEwMCkKKworCitpbnQgdXB0aW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1cHRpbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwl1bnNpZ25lZCB1cGRheXMsIHVwaG91cnMsIHVwbWludXRlczsKKwlzdHJ1Y3Qgc3lzaW5mbyBpbmZvOworCXN0cnVjdCB0bSAqY3VycmVudF90aW1lOworCXRpbWVfdCBjdXJyZW50X3NlY3M7CisKKwl0aW1lKCZjdXJyZW50X3NlY3MpOworCWN1cnJlbnRfdGltZSA9IGxvY2FsdGltZSgmY3VycmVudF9zZWNzKTsKKworCXN5c2luZm8oJmluZm8pOworCisJcHJpbnRmKCIgJTAydTolMDJ1OiUwMnUgdXAgIiwKKwkJCWN1cnJlbnRfdGltZS0+dG1faG91ciwgY3VycmVudF90aW1lLT50bV9taW4sIGN1cnJlbnRfdGltZS0+dG1fc2VjKTsKKwl1cGRheXMgPSAodW5zaWduZWQpIGluZm8udXB0aW1lIC8gKHVuc2lnbmVkKSg2MCo2MCoyNCk7CisJaWYgKHVwZGF5cykKKwkJcHJpbnRmKCIldSBkYXklcywgIiwgdXBkYXlzLCAodXBkYXlzICE9IDEpID8gInMiIDogIiIpOworCXVwbWludXRlcyA9ICh1bnNpZ25lZCkgaW5mby51cHRpbWUgLyAodW5zaWduZWQpNjA7CisJdXBob3VycyA9ICh1cG1pbnV0ZXMgLyAodW5zaWduZWQpNjApICUgKHVuc2lnbmVkKTI0OworCXVwbWludXRlcyAlPSA2MDsKKwlpZiAodXBob3VycykKKwkJcHJpbnRmKCIlMnU6JTAydSIsIHVwaG91cnMsIHVwbWludXRlcyk7CisJZWxzZQorCQlwcmludGYoIiV1IG1pbiIsIHVwbWludXRlcyk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VUFRJTUVfVVRNUF9TVVBQT1JUCisJeworCQlzdHJ1Y3QgdXRtcCAqdXQ7CisJCXVuc2lnbmVkIHVzZXJzID0gMDsKKwkJd2hpbGUgKCh1dCA9IGdldHV0ZW50KCkpICE9IE5VTEwpIHsKKwkJCWlmICgodXQtPnV0X3R5cGUgPT0gVVNFUl9QUk9DRVNTKSAmJiAodXQtPnV0X25hbWVbMF0gIT0gJ1wwJykpCisJCQkJdXNlcnMrKzsKKwkJfQorCQlwcmludGYoIiwgICV1IHVzZXJzIiwgdXNlcnMpOworCX0KKyNlbmRpZgorCisJcHJpbnRmKCIsICBsb2FkIGF2ZXJhZ2U6ICV1LiUwMnUsICV1LiUwMnUsICV1LiUwMnVcbiIsCisJCQlMT0FEX0lOVChpbmZvLmxvYWRzWzBdKSwgTE9BRF9GUkFDKGluZm8ubG9hZHNbMF0pLAorCQkJTE9BRF9JTlQoaW5mby5sb2Fkc1sxXSksIExPQURfRlJBQyhpbmZvLmxvYWRzWzFdKSwKKwkJCUxPQURfSU5UKGluZm8ubG9hZHNbMl0pLCBMT0FEX0ZSQUMoaW5mby5sb2Fkc1syXSkpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy93YXRjaC5jIGIvcHJvY3BzL3dhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy93YXRjaC5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgd2F0Y2ggaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgTWljaGFlbCBIYWJlcm1hbm4gPG1oYWJlcm1hbm5AZ214LmRlPgorICogQ29weXJpZ2p0IChDKSBNYXIgMTYsIDIwMDMgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAqLworLyogQkJfQVVESVQgR05VIGRlZmVjdHMgLS0gb25seSBvcHRpb24gLW4gaXMgc3VwcG9ydGVkLiAqLworCisvL3VzYWdlOiNkZWZpbmUgd2F0Y2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbiBTRUNdIFstdF0gUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIHdhdGNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIFBST0cgcGVyaW9kaWNhbGx5XG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCUxvb3AgcGVyaW9kIGluIHNlY29uZHMgKGRlZmF1bHQgMikiCisvL3VzYWdlOiAgICAgIlxuCS10CURvbid0IHByaW50IGhlYWRlciIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgd2F0Y2hfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgd2F0Y2ggZGF0ZVxuIgorLy91c2FnZTogICAgICAgIk1vbiBEZWMgMTcgMTA6MzE6NDAgR01UIDIwMDBcbiIKKy8vdXNhZ2U6ICAgICAgICJNb24gRGVjIDE3IDEwOjMxOjQyIEdNVCAyMDAwXG4iCisvL3VzYWdlOiAgICAgICAiTW9uIERlYyAxNyAxMDozMTo0NCBHTVQgMjAwMCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vIHByb2NwcyAyLjAuMTg6CisvLyB3YXRjaCBbLWRdIFstbiBzZWNvbmRzXQorLy8gICBbLS1kaWZmZXJlbmNlc1s9Y3VtdWxhdGl2ZV1dIFstLWludGVydmFsPXNlY29uZHNdIGNvbW1hbmQKKy8vCisvLyBwcm9jcHMtMy4yLjM6CisvLyB3YXRjaCBbLWR0XSBbLW4gc2Vjb25kc10KKy8vICAgWy0tZGlmZmVyZW5jZXNbPWN1bXVsYXRpdmVdXSBbLS1pbnRlcnZhbD1zZWNvbmRzXSBbLS1uby10aXRsZV0gY29tbWFuZAorLy8KKy8vIChwcm9jcHMgMy54IGFuZCBwcm9jcHMgMi54IGFyZSBmb3Jrcywgbm90IG5ld2VyL29sZGVyIHZlcnNpb25zIG9mIHRoZSBzYW1lKQorCitpbnQgd2F0Y2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHdhdGNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJdW5zaWduZWQgcGVyaW9kID0gMjsKKwl1bnNpZ25lZCB3aWR0aCwgbmV3X3dpZHRoOworCWNoYXIgKmhlYWRlcjsKKwljaGFyICpjbWQ7CisKKyNpZiAwIC8vIG1heWJlIEVOQUJMRV9ERVNLVE9QPworCS8vIHByb2NwczMgY29tcGF0IC0gImVjaG8gVEVTVCB8IHdhdGNoIGNhdCIgZG9lc24ndCBzaG93IFRFU1Q6CisJY2xvc2UoU1RESU5fRklMRU5PKTsKKwl4b3BlbigiL2Rldi9udWxsIiwgT19SRE9OTFkpOworI2VuZGlmCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpuKyI7IC8vIGF0IGxlYXN0IG9uZSBwYXJhbTsgLW4gTlVNCisJLy8gIisiOiBzdG9wIGF0IGZpcnN0IG5vbi1vcHRpb24gKHByb2NwcyAzLnggb25seSkKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK2R0bjoiLCAmcGVyaW9kKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIHdhdGNoIGZyb20gYm90aCBwcm9jcHMgMi54IGFuZCAzLnggZG9lcyBjb25jYXRlbmF0aW9uLiBFeGFtcGxlOgorCS8vIHdhdGNoIGxzIC1sICJhIC90bXAiICIyPiYxIiAtIGxzIHdvbid0IHNlZSAiYSAvdG1wIiBhcyBvbmUgcGFyYW0KKwljbWQgPSAqYXJndjsKKwl3aGlsZSAoKisrYXJndikKKwkJY21kID0geGFzcHJpbnRmKCIlcyAlcyIsIGNtZCwgKmFyZ3YpOyAvLyBsZWFrcyBjbWQKKworCXdpZHRoID0gKHVuc2lnbmVkKS0xOyAvLyBtYWtlIHN1cmUgZmlyc3QgdGltZSBuZXdfd2lkdGggIT0gd2lkdGgKKwloZWFkZXIgPSBOVUxMOworCXdoaWxlICgxKSB7CisJCS8qIGhvbWU7IGNsZWFyIHRvIHRoZSBlbmQgb2Ygc2NyZWVuICovCisJCXByaW50ZigiXDAzM1tIIiJcMDMzW0oiKTsKKwkJaWYgKCEob3B0ICYgMHgyKSkgeyAvLyBubyAtdAorCQkJY29uc3QgdW5zaWduZWQgdGltZV9sZW4gPSBzaXplb2YoIjEyMzQtNjctOTAgMjM6NTY6ODkiKTsKKwkJCXRpbWVfdCB0OworCisJCQkvLyBTVERFUlJfRklMRU5PIGlzIHByb2NwczMgY29tcGF0OgorCQkJLy8gIndhdGNoIGxzIDI+L2Rldi9udWxsIiBkb2VzIG5vdCBkZXRlY3QgdHR5IHNpemUKKwkJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoU1RERVJSX0ZJTEVOTywgJm5ld193aWR0aCwgTlVMTCk7CisJCQlpZiAobmV3X3dpZHRoICE9IHdpZHRoKSB7CisJCQkJd2lkdGggPSBuZXdfd2lkdGg7CisJCQkJZnJlZShoZWFkZXIpOworCQkJCWhlYWRlciA9IHhhc3ByaW50ZigiRXZlcnkgJXVzOiAlLSpzIiwgcGVyaW9kLCAoaW50KXdpZHRoLCBjbWQpOworCQkJfQorCQkJdGltZSgmdCk7CisJCQlpZiAodGltZV9sZW4gPCB3aWR0aCkKKwkJCQlzdHJmdGltZShoZWFkZXIgKyB3aWR0aCAtIHRpbWVfbGVuLCB0aW1lX2xlbiwKKwkJCQkJIiVZLSVtLSVkICVIOiVNOiVTIiwgbG9jYWx0aW1lKCZ0KSk7CisKKwkJCS8vIGNvbXBhdDogZW1wdHkgbGluZSBiZXR3ZWVuIGhlYWRlciBhbmQgY21kIG91dHB1dAorCQkJcHJpbnRmKCIlc1xuXG4iLCBoZWFkZXIpOworCQl9CisJCWZmbHVzaF9hbGwoKTsKKwkJLy8gVE9ETzogJ3JlYWwnIHdhdGNoIHBpcGVzIGNtZCdzIG91dHB1dCB0byBpdHNlbGYKKwkJLy8gYW5kIGRvZXMgbm90IGFsbG93IGl0IHRvIG92ZXJmbG93IHRoZSBzY3JlZW4KKwkJLy8gKHRha2luZyBpbnRvIGFjY291bnQgbGluZXdyYXAhKQorCQlzeXN0ZW0oY21kKTsKKwkJc2xlZXAocGVyaW9kKTsKKwl9CisJcmV0dXJuIDA7IC8vIGdjYyB0aGlua3Mgd2UgY2FuIHJlYWNoIHRoaXMgOikKK30KZGlmZiAtLWdpdCBhL3J1bml0L0NvbmZpZy5pbiBiL3J1bml0L0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjBjNTdiCi0tLSAvZGV2L251bGwKKysrIGIvcnVuaXQvQ29uZmlnLmluCkBAIC0wLDAgKzEsOTAgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJSdW5pdCBVdGlsaXRpZXMiCisKKworCitjb25maWcgUlVOU1YKKwlib29sICJydW5zdiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW5zdiBzdGFydHMgYW5kIG1vbml0b3JzIGEgc2VydmljZSBhbmQgb3B0aW9uYWxseSBhbiBhcHBlbmRhbnQgbG9nCisJICBzZXJ2aWNlLgorCitjb25maWcgUlVOU1ZESVIKKwlib29sICJydW5zdmRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW5zdmRpciBzdGFydHMgYSBydW5zdiBwcm9jZXNzIGZvciBlYWNoIHN1YmRpcmVjdG9yeSwgb3Igc3ltbGluayB0bworCSAgYSBkaXJlY3RvcnksIGluIHRoZSBzZXJ2aWNlcyBkaXJlY3RvcnkgZGlyLCB1cCB0byBhIGxpbWl0IG9mIDEwMDAKKwkgIHN1YmRpcmVjdG9yaWVzLCBhbmQgcmVzdGFydHMgYSBydW5zdiBwcm9jZXNzIGlmIGl0IHRlcm1pbmF0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX1JVTlNWRElSX0xPRworCWJvb2wgIkVuYWJsZSBzY3JvbGxpbmcgYXJndW1lbnQgbG9nIgorCWRlcGVuZHMgb24gUlVOU1ZESVIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgZmVhdHVyZSB3aGVyZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHJ1bnN2ZGlyIGhvbGRzIGxhc3QgZXJyb3IKKwkgIG1lc3NhZ2UgKHZpZXdhYmxlIHZpYSB0b3AvcHMpLiBPdGhlcndpc2UgKGZlYXR1cmUgaXMgb2ZmCisJICBvciBubyBwYXJhbWV0ZXIpLCBlcnJvciBtZXNzYWdlcyBnbyB0byBzdGRlcnIgb25seS4KKworY29uZmlnIFNWCisJYm9vbCAic3YiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3YgcmVwb3J0cyB0aGUgY3VycmVudCBzdGF0dXMgYW5kIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBzZXJ2aWNlcworCSAgbW9uaXRvcmVkIGJ5IHRoZSBydW5zdiBzdXBlcnZpc29yLgorCitjb25maWcgU1ZfREVGQVVMVF9TRVJWSUNFX0RJUgorCXN0cmluZyAiRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHNlcnZpY2VzIgorCWRlZmF1bHQgIi92YXIvc2VydmljZSIKKwlkZXBlbmRzIG9uIFNWCisJaGVscAorCSAgRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHNlcnZpY2VzLgorCSAgRGVmYXVsdHMgdG8gIi92YXIvc2VydmljZSIKKworY29uZmlnIFNWTE9HRAorCWJvb2wgInN2bG9nZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzdmxvZ2QgY29udGludW91c2x5IHJlYWRzIGxvZyBkYXRhIGZyb20gaXRzIHN0YW5kYXJkIGlucHV0LCBvcHRpb25hbGx5CisJICBmaWx0ZXJzIGxvZyBtZXNzYWdlcywgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byBvbmUgb3IgbW9yZSBhdXRvbWF0aWNhbGx5CisJICByb3RhdGVkIGxvZ3MuCisKK2NvbmZpZyBDSFBTVAorCWJvb2wgImNocHN0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNocHN0IGNoYW5nZXMgdGhlIHByb2Nlc3Mgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBvcHRpb25zLCBhbmQKKwkgIGV4ZWNzIHNwZWNpZmllZCBwcm9ncmFtLgorCitjb25maWcgU0VUVUlER0lECisJYm9vbCAic2V0dWlkZ2lkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNldHMgc29mdCByZXNvdXJjZSBsaW1pdHMgYXMgc3BlY2lmaWVkIGJ5IG9wdGlvbnMKKworY29uZmlnIEVOVlVJREdJRAorCWJvb2wgImVudnVpZGdpZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzICRVSUQgdG8gYWNjb3VudCdzIHVpZCBhbmQgJEdJRCB0byBhY2NvdW50J3MgZ2lkCisKK2NvbmZpZyBFTlZESVIKKwlib29sICJlbnZkaXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2V0cyB2YXJpb3VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXMKKwkgIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkKKworY29uZmlnIFNPRlRMSU1JVAorCWJvb2wgInNvZnRsaW1pdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzIHNvZnQgcmVzb3VyY2UgbGltaXRzIGFzIHNwZWNpZmllZCBieSBvcHRpb25zCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3J1bml0L0NvbmZpZy5zcmMgYi9ydW5pdC9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjk3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5pdC9Db25maWcuc3JjCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlJ1bml0IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBSVU5TVgorCWJvb2wgInJ1bnN2IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJ1bnN2IHN0YXJ0cyBhbmQgbW9uaXRvcnMgYSBzZXJ2aWNlIGFuZCBvcHRpb25hbGx5IGFuIGFwcGVuZGFudCBsb2cKKwkgIHNlcnZpY2UuCisKK2NvbmZpZyBSVU5TVkRJUgorCWJvb2wgInJ1bnN2ZGlyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJ1bnN2ZGlyIHN0YXJ0cyBhIHJ1bnN2IHByb2Nlc3MgZm9yIGVhY2ggc3ViZGlyZWN0b3J5LCBvciBzeW1saW5rIHRvCisJICBhIGRpcmVjdG9yeSwgaW4gdGhlIHNlcnZpY2VzIGRpcmVjdG9yeSBkaXIsIHVwIHRvIGEgbGltaXQgb2YgMTAwMAorCSAgc3ViZGlyZWN0b3JpZXMsIGFuZCByZXN0YXJ0cyBhIHJ1bnN2IHByb2Nlc3MgaWYgaXQgdGVybWluYXRlcy4KKworY29uZmlnIEZFQVRVUkVfUlVOU1ZESVJfTE9HCisJYm9vbCAiRW5hYmxlIHNjcm9sbGluZyBhcmd1bWVudCBsb2ciCisJZGVwZW5kcyBvbiBSVU5TVkRJUgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSBmZWF0dXJlIHdoZXJlIHNlY29uZCBwYXJhbWV0ZXIgb2YgcnVuc3ZkaXIgaG9sZHMgbGFzdCBlcnJvcgorCSAgbWVzc2FnZSAodmlld2FibGUgdmlhIHRvcC9wcykuIE90aGVyd2lzZSAoZmVhdHVyZSBpcyBvZmYKKwkgIG9yIG5vIHBhcmFtZXRlciksIGVycm9yIG1lc3NhZ2VzIGdvIHRvIHN0ZGVyciBvbmx5LgorCitjb25maWcgU1YKKwlib29sICJzdiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzdiByZXBvcnRzIHRoZSBjdXJyZW50IHN0YXR1cyBhbmQgY29udHJvbHMgdGhlIHN0YXRlIG9mIHNlcnZpY2VzCisJICBtb25pdG9yZWQgYnkgdGhlIHJ1bnN2IHN1cGVydmlzb3IuCisKK2NvbmZpZyBTVl9ERUZBVUxUX1NFUlZJQ0VfRElSCisJc3RyaW5nICJEZWZhdWx0IGRpcmVjdG9yeSBmb3Igc2VydmljZXMiCisJZGVmYXVsdCAiL3Zhci9zZXJ2aWNlIgorCWRlcGVuZHMgb24gU1YKKwloZWxwCisJICBEZWZhdWx0IGRpcmVjdG9yeSBmb3Igc2VydmljZXMuCisJICBEZWZhdWx0cyB0byAiL3Zhci9zZXJ2aWNlIgorCitjb25maWcgU1ZMT0dECisJYm9vbCAic3Zsb2dkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN2bG9nZCBjb250aW51b3VzbHkgcmVhZHMgbG9nIGRhdGEgZnJvbSBpdHMgc3RhbmRhcmQgaW5wdXQsIG9wdGlvbmFsbHkKKwkgIGZpbHRlcnMgbG9nIG1lc3NhZ2VzLCBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIG9uZSBvciBtb3JlIGF1dG9tYXRpY2FsbHkKKwkgIHJvdGF0ZWQgbG9ncy4KKworY29uZmlnIENIUFNUCisJYm9vbCAiY2hwc3QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hwc3QgY2hhbmdlcyB0aGUgcHJvY2VzcyBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIG9wdGlvbnMsIGFuZAorCSAgZXhlY3Mgc3BlY2lmaWVkIHByb2dyYW0uCisKK2NvbmZpZyBTRVRVSURHSUQKKwlib29sICJzZXR1aWRnaWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2V0cyBzb2Z0IHJlc291cmNlIGxpbWl0cyBhcyBzcGVjaWZpZWQgYnkgb3B0aW9ucworCitjb25maWcgRU5WVUlER0lECisJYm9vbCAiZW52dWlkZ2lkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNldHMgJFVJRCB0byBhY2NvdW50J3MgdWlkIGFuZCAkR0lEIHRvIGFjY291bnQncyBnaWQKKworY29uZmlnIEVOVkRJUgorCWJvb2wgImVudmRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzIHZhcmlvdXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNwZWNpZmllZCBieSBmaWxlcworCSAgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeQorCitjb25maWcgU09GVExJTUlUCisJYm9vbCAic29mdGxpbWl0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNldHMgc29mdCByZXNvdXJjZSBsaW1pdHMgYXMgc3BlY2lmaWVkIGJ5IG9wdGlvbnMKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvcnVuaXQvS2J1aWxkLnNyYyBiL3J1bml0L0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjZTk1NQotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19SVU5TVikgKz0gcnVuc3YubworbGliLSQoQ09ORklHX1JVTlNWRElSKSArPSBydW5zdmRpci5vCitsaWItJChDT05GSUdfU1YpICs9IHN2Lm8KK2xpYi0kKENPTkZJR19TVkxPR0QpICs9IHN2bG9nZC5vCitsaWItJChDT05GSUdfQ0hQU1QpICs9IGNocHN0Lm8KKworbGliLSQoQ09ORklHX0VOVkRJUikgKz0gY2hwc3QubworbGliLSQoQ09ORklHX0VOVlVJREdJRCkgKz0gY2hwc3QubworbGliLSQoQ09ORklHX1NFVFVJREdJRCkgKz0gY2hwc3QubworbGliLSQoQ09ORklHX1NPRlRMSU1JVCkgKz0gY2hwc3QubwpkaWZmIC0tZ2l0IGEvcnVuaXQvY2hwc3QuYyBiL3J1bml0L2NocHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1NzA2MAotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L2NocHN0LmMKQEAgLTAsMCArMSw0NDcgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPiAqLworLyogRGVwZW5kZW5jaWVzIG9uIHJ1bml0X2xpYi5jIHJlbW92ZWQgKi8KKworLy91c2FnZTojZGVmaW5lIGNocHN0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXZQMDEyXSBbLXUgVVNFUls6R1JQXV0gWy1VIFVTRVJbOkdSUF1dIFstZSBESVJdXG4iCisvL3VzYWdlOiAgICAgICAiCVstLyBESVJdIFstbiBOSUNFXSBbLW0gQllURVNdIFstZCBCWVRFU10gWy1vIE5dXG4iCisvL3VzYWdlOiAgICAgICAiCVstcCBOXSBbLWYgQllURVNdIFstYyBCWVRFU10gUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIGNocHN0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHRoZSBwcm9jZXNzIHN0YXRlLCBydW4gUFJPR1xuIgorLy91c2FnZTogICAgICJcbgktdSBVU0VSWzpHUlBdCVNldCB1aWQgYW5kIGdpZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVUgVVNFUls6R1JQXQlTZXQgJFVJRCBhbmQgJEdJRCBpbiBlbnZpcm9ubWVudCIKKy8vdXNhZ2U6ICAgICAiXG4JLWUgRElSCQlTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNwZWNpZmllZCBieSBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JCQlpbiBESVI6IGZpbGU9MXN0X2xpbmVfb2ZfZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLS8gRElSCQlDaHJvb3QgdG8gRElSIgorLy91c2FnZTogICAgICJcbgktbiBOSUNFCQlBZGQgTklDRSB0byBuaWNlIHZhbHVlIgorLy91c2FnZTogICAgICJcbgktbSBCWVRFUwlTYW1lIGFzIC1kIEJZVEVTIC1zIEJZVEVTIC1sIEJZVEVTIgorLy91c2FnZTogICAgICJcbgktZCBCWVRFUwlMaW1pdCBkYXRhIHNlZ21lbnQiCisvL3VzYWdlOiAgICAgIlxuCS1vIE4JCUxpbWl0IG51bWJlciBvZiBvcGVuIGZpbGVzIHBlciBwcm9jZXNzIgorLy91c2FnZTogICAgICJcbgktcCBOCQlMaW1pdCBudW1iZXIgb2YgcHJvY2Vzc2VzIHBlciB1aWQiCisvL3VzYWdlOiAgICAgIlxuCS1mIEJZVEVTCUxpbWl0IG91dHB1dCBmaWxlIHNpemVzIgorLy91c2FnZTogICAgICJcbgktYyBCWVRFUwlMaW1pdCBjb3JlIGZpbGUgc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1QCQlDcmVhdGUgbmV3IHByb2Nlc3MgZ3JvdXAiCisvL3VzYWdlOiAgICAgIlxuCS0wCQlDbG9zZSBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4JLTEJCUNsb3NlIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLTIJCUNsb3NlIHN0ZGVyciIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZW52ZGlyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJESVIgUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIGVudmRpcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCB2YXJpb3VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXNcbiIKKy8vdXNhZ2U6ICAgICAgICJpbiB0aGUgZGlyZWN0b3J5IERJUiwgcnVuIFBST0ciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGVudnVpZGdpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVVNFUiBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgZW52dWlkZ2lkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2V0ICRVSUQgdG8gVVNFUidzIHVpZCBhbmQgJEdJRCB0byBVU0VSJ3MgZ2lkLCBydW4gUFJPRyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2V0dWlkZ2lkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJVU0VSIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBzZXR1aWRnaWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZXQgdWlkIGFuZCBnaWQgdG8gVVNFUidzIHVpZCBhbmQgZ2lkLCBkcm9wIHN1cHBsZW1lbnRhcnkgZ3JvdXAgaWRzLFxuIgorLy91c2FnZTogICAgICAgInJ1biBQUk9HIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzb2Z0bGltaXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYSBCWVRFU10gWy1tIEJZVEVTXSBbLWQgQllURVNdIFstcyBCWVRFU10gWy1sIEJZVEVTXVxuIgorLy91c2FnZTogICAgICAgIglbLWYgQllURVNdIFstYyBCWVRFU10gWy1yIEJZVEVTXSBbLW8gTl0gWy1wIE5dIFstdCBOXVxuIgorLy91c2FnZTogICAgICAgIglQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc29mdGxpbWl0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2V0IHNvZnQgcmVzb3VyY2UgbGltaXRzLCB0aGVuIHJ1biBQUk9HXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hIEJZVEVTCUxpbWl0IHRvdGFsIHNpemUgb2YgYWxsIHNlZ21lbnRzIgorLy91c2FnZTogICAgICJcbgktbSBCWVRFUwlTYW1lIGFzIC1kIEJZVEVTIC1zIEJZVEVTIC1sIEJZVEVTIC1hIEJZVEVTIgorLy91c2FnZTogICAgICJcbgktZCBCWVRFUwlMaW1pdCBkYXRhIHNlZ21lbnQiCisvL3VzYWdlOiAgICAgIlxuCS1zIEJZVEVTCUxpbWl0IHN0YWNrIHNlZ21lbnQiCisvL3VzYWdlOiAgICAgIlxuCS1sIEJZVEVTCUxpbWl0IGxvY2tlZCBtZW1vcnkgc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gTgkJTGltaXQgbnVtYmVyIG9mIG9wZW4gZmlsZXMgcGVyIHByb2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1wIE4JCUxpbWl0IG51bWJlciBvZiBwcm9jZXNzZXMgcGVyIHVpZCIKKy8vdXNhZ2U6ICAgICAiXG5PcHRpb25zIGNvbnRyb2xsaW5nIGZpbGUgc2l6ZXM6IgorLy91c2FnZTogICAgICJcbgktZiBCWVRFUwlMaW1pdCBvdXRwdXQgZmlsZSBzaXplcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQllURVMJTGltaXQgY29yZSBmaWxlIHNpemUiCisvL3VzYWdlOiAgICAgIlxuRWZmaWNpZW5jeSBvcHRzOiIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgQllURVMJTGltaXQgcmVzaWRlbnQgc2V0IHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS10IE4JCUxpbWl0IENQVSB0aW1lLCBwcm9jZXNzIHJlY2VpdmVzIgorLy91c2FnZTogICAgICJcbgkJCWEgU0lHWENQVSBhZnRlciBOIHNlY29uZHMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorRml2ZSBhcHBsZXRzIGhlcmU6IGNocHN0LCBlbnZkaXIsIGVudnVpZGdpZCwgc2V0dWlkZ2lkLCBzb2Z0bGltaXQuCisKK09ubHkgc29mdGxpbWl0IGFuZCBjaHBzdCBhcmUgdGFraW5nIG9wdGlvbnM6CisKKyMgY29tbW9uCistbyBOICAgICAgICAgICAgTGltaXQgbnVtYmVyIG9mIG9wZW4gZmlsZXMgcGVyIHByb2Nlc3MKKy1wIE4gICAgICAgICAgICBMaW1pdCBudW1iZXIgb2YgcHJvY2Vzc2VzIHBlciB1aWQKKy1tIEJZVEVTICAgICAgICBTYW1lIGFzIC1kIEJZVEVTIC1zIEJZVEVTIC1sIEJZVEVTIFstYSBCWVRFU10KKy1kIEJZVEVTICAgICAgICBMaW1pdCBkYXRhIHNlZ21lbnQKKy1mIEJZVEVTICAgICAgICBMaW1pdCBvdXRwdXQgZmlsZSBzaXplcworLWMgQllURVMgICAgICAgIExpbWl0IGNvcmUgZmlsZSBzaXplCisjIHNvZnRsaW1pdAorLWEgQllURVMgICAgICAgIExpbWl0IHRvdGFsIHNpemUgb2YgYWxsIHNlZ21lbnRzCistcyBCWVRFUyAgICAgICAgTGltaXQgc3RhY2sgc2VnbWVudAorLWwgQllURVMgICAgICAgIExpbWl0IGxvY2tlZCBtZW1vcnkgc2l6ZQorLXIgQllURVMgICAgICAgIExpbWl0IHJlc2lkZW50IHNldCBzaXplCistdCBOICAgICAgICAgICAgTGltaXQgQ1BVIHRpbWUKKyMgY2hwc3QKKy11IFVTRVJbOkdSUF0gICBTZXQgdWlkIGFuZCBnaWQKKy1VIFVTRVJbOkdSUF0gICBTZXQgJFVJRCBhbmQgJEdJRCBpbiBlbnZpcm9ubWVudAorLWUgRElSICAgICAgICAgIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc3BlY2lmaWVkIGJ5IGZpbGVzIGluIERJUgorLS8gRElSICAgICAgICAgIENocm9vdCB0byBESVIKKy1uIE5JQ0UgICAgICAgICBBZGQgTklDRSB0byBuaWNlIHZhbHVlCistdiAgICAgICAgICAgICAgVmVyYm9zZQorLVAgICAgICAgICAgICAgIENyZWF0ZSBuZXcgcHJvY2VzcyBncm91cAorLTAgLTEgLTIgICAgICAgIENsb3NlIGZkIDAsMSwyCisKK0V2ZW4gdGhvdWdoIHdlIGFjY2VwdCBhbGwgdGhlc2Ugb3B0aW9ucyBmb3IgYm90aCBzb2Z0bGltaXQgYW5kIGNocHN0LAordGhleSBhcmUgbm90IHRvIGJlIGFkdmVydGlzZWQgb24gdGhlaXIgaGVscCB0ZXh0cy4KK1dlIGhhdmUgZW5vdWdoIHByb2JsZW1zIHdpdGggZmVhdHVyZSBjcmVlcCBpbiBvdGhlciBwZW9wbGUncworc29mdHdhcmUsIGRvbid0IHdhbnQgdG8gYWRkIG91ciBvd24uCisKK2VudmRpciwgZW52dWlkZ2lkLCBzZXR1aWRnaWQgdGFrZSBubyBvcHRpb25zLCBidXQgdGhleSByZXVzZSBjb2RlIHdoaWNoCitoYW5kbGVzIC1lLCAtVSBhbmQgLXUuCisqLworCitlbnVtIHsKKwlPUFRfYSA9ICgxIDw8IDApICogRU5BQkxFX1NPRlRMSU1JVCwKKwlPUFRfYyA9ICgxIDw8IDEpICogKEVOQUJMRV9TT0ZUTElNSVQgfHwgRU5BQkxFX0NIUFNUKSwKKwlPUFRfZCA9ICgxIDw8IDIpICogKEVOQUJMRV9TT0ZUTElNSVQgfHwgRU5BQkxFX0NIUFNUKSwKKwlPUFRfZiA9ICgxIDw8IDMpICogKEVOQUJMRV9TT0ZUTElNSVQgfHwgRU5BQkxFX0NIUFNUKSwKKwlPUFRfbCA9ICgxIDw8IDQpICogRU5BQkxFX1NPRlRMSU1JVCwKKwlPUFRfbSA9ICgxIDw8IDUpICogKEVOQUJMRV9TT0ZUTElNSVQgfHwgRU5BQkxFX0NIUFNUKSwKKwlPUFRfbyA9ICgxIDw8IDYpICogKEVOQUJMRV9TT0ZUTElNSVQgfHwgRU5BQkxFX0NIUFNUKSwKKwlPUFRfcCA9ICgxIDw8IDcpICogKEVOQUJMRV9TT0ZUTElNSVQgfHwgRU5BQkxFX0NIUFNUKSwKKwlPUFRfciA9ICgxIDw8IDgpICogRU5BQkxFX1NPRlRMSU1JVCwKKwlPUFRfcyA9ICgxIDw8IDkpICogRU5BQkxFX1NPRlRMSU1JVCwKKwlPUFRfdCA9ICgxIDw8IDEwKSAqIEVOQUJMRV9TT0ZUTElNSVQsCisJT1BUX3UgPSAoMSA8PCAxMSkgKiAoRU5BQkxFX0NIUFNUIHx8IEVOQUJMRV9TRVRVSURHSUQpLAorCU9QVF9VID0gKDEgPDwgMTIpICogKEVOQUJMRV9DSFBTVCB8fCBFTkFCTEVfRU5WVUlER0lEKSwKKwlPUFRfZSA9ICgxIDw8IDEzKSAqIChFTkFCTEVfQ0hQU1QgfHwgRU5BQkxFX0VOVkRJUiksCisJT1BUX3Jvb3QgPSAoMSA8PCAxNCkgKiBFTkFCTEVfQ0hQU1QsCisJT1BUX24gPSAoMSA8PCAxNSkgKiBFTkFCTEVfQ0hQU1QsCisJT1BUX3YgPSAoMSA8PCAxNikgKiBFTkFCTEVfQ0hQU1QsCisJT1BUX1AgPSAoMSA8PCAxNykgKiBFTkFCTEVfQ0hQU1QsCisJT1BUXzAgPSAoMSA8PCAxOCkgKiBFTkFCTEVfQ0hQU1QsCisJT1BUXzEgPSAoMSA8PCAxOSkgKiBFTkFCTEVfQ0hQU1QsCisJT1BUXzIgPSAoMSA8PCAyMCkgKiBFTkFCTEVfQ0hQU1QsCit9OworCisvKiBUT0RPOiB1c2UgcmVjdXJzaXZlX2FjdGlvbj8gKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIGVkaXIoY29uc3QgY2hhciAqZGlyZWN0b3J5X25hbWUpCit7CisJaW50IHdkaXI7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlpbnQgZmQ7CisKKwl3ZGlyID0geG9wZW4oIi4iLCBPX1JET05MWSB8IE9fTkRFTEFZKTsKKwl4Y2hkaXIoZGlyZWN0b3J5X25hbWUpOworCWRpciA9IHhvcGVuZGlyKCIuIik7CisJZm9yICg7OykgeworCQljaGFyIGJ1ZlsyNTZdOworCQljaGFyICp0YWlsOworCQlpbnQgc2l6ZTsKKworCQllcnJubyA9IDA7CisJCWQgPSByZWFkZGlyKGRpcik7CisJCWlmICghZCkgeworCQkJaWYgKGVycm5vKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicmVhZGRpciAlcyIsCisJCQkJCQlkaXJlY3RvcnlfbmFtZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZC0+ZF9uYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCQlmZCA9IG9wZW4oZC0+ZF9uYW1lLCBPX1JET05MWSB8IE9fTkRFTEFZKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJaWYgKChlcnJubyA9PSBFSVNESVIpICYmIGRpcmVjdG9yeV9uYW1lKSB7CisJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikKKwkJCQkJYmJfcGVycm9yX21zZygid2FybmluZzogJXMvJXMgaXMgYSBkaXJlY3RvcnkiLAorCQkJCQkJZGlyZWN0b3J5X25hbWUsIGQtPmRfbmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm9wZW4gJXMvJXMiLAorCQkJCQkJZGlyZWN0b3J5X25hbWUsIGQtPmRfbmFtZSk7CisJCX0KKwkJc2l6ZSA9IGZ1bGxfcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKS0xKTsKKwkJY2xvc2UoZmQpOworCQlpZiAoc2l6ZSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJlYWQgJXMvJXMiLAorCQkJCQlkaXJlY3RvcnlfbmFtZSwgZC0+ZF9uYW1lKTsKKwkJaWYgKHNpemUgPT0gMCkgeworCQkJdW5zZXRlbnYoZC0+ZF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ1ZltzaXplXSA9ICdcbic7CisJCXRhaWwgPSBzdHJjaHIoYnVmLCAnXG4nKTsKKwkJLyogc2tpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJCXdoaWxlICgxKSB7CisJCQkqdGFpbCA9ICdcMCc7CisJCQl0YWlsLS07CisJCQlpZiAodGFpbCA8IGJ1ZiB8fCAhaXNzcGFjZSgqdGFpbCkpCisJCQkJYnJlYWs7CisJCX0KKwkJeHNldGVudihkLT5kX25hbWUsIGJ1Zik7CisJfQorCWNsb3NlZGlyKGRpcik7CisJaWYgKGZjaGRpcih3ZGlyKSA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJmY2hkaXIiKTsKKwljbG9zZSh3ZGlyKTsKK30KKworc3RhdGljIHZvaWQgbGltaXQoaW50IHdoYXQsIGxvbmcgbCkKK3sKKwlzdHJ1Y3QgcmxpbWl0IHI7CisKKwkvKiBOZXZlciBmYWlscyB1bmRlciBMaW51eCAoZXhjZXB0IGlmIHlvdSBwYXNzIGl0IGJhZCBhcmd1bWVudHMpICovCisJZ2V0cmxpbWl0KHdoYXQsICZyKTsKKwlpZiAoKGwgPCAwKSB8fCAobCA+IHIucmxpbV9tYXgpKQorCQlyLnJsaW1fY3VyID0gci5ybGltX21heDsKKwllbHNlCisJCXIucmxpbV9jdXIgPSBsOworCWlmIChzZXRybGltaXQod2hhdCwgJnIpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHJsaW1pdCIpOworfQorCitpbnQgY2hwc3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNocHN0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWdpZDsKKwljaGFyICpzZXRfdXNlciA9IHNldF91c2VyOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICplbnZfdXNlciA9IGVudl91c2VyOworCWNoYXIgKmVudl9kaXIgPSBlbnZfZGlyOworCWNoYXIgKnJvb3Q7CisJY2hhciAqbmljZXN0cjsKKwl1bnNpZ25lZCBsaW1pdGE7CisJdW5zaWduZWQgbGltaXRjOworCXVuc2lnbmVkIGxpbWl0ZDsKKwl1bnNpZ25lZCBsaW1pdGY7CisJdW5zaWduZWQgbGltaXRsOworCXVuc2lnbmVkIGxpbWl0bTsKKwl1bnNpZ25lZCBsaW1pdG87CisJdW5zaWduZWQgbGltaXRwOworCXVuc2lnbmVkIGxpbWl0cjsKKwl1bnNpZ25lZCBsaW1pdHM7CisJdW5zaWduZWQgbGltaXR0OworCXVuc2lnbmVkIG9wdDsKKworCWlmICgoRU5BQkxFX0NIUFNUICYmIGFwcGxldF9uYW1lWzBdID09ICdjJykKKwkgfHwgKEVOQUJMRV9TT0ZUTElNSVQgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ28nKQorCSkgeworCQkvLyBGSVhNRTogY2FuIHdlIGxpdmUgd2l0aCBpbnQtc2l6ZWQgbGltaXRzPworCQkvLyBjYW4gd2UgbGl2ZSB3aXRoIDQwMDAwIGRheXM/CisJCS8vIGlmIHllcyAtPiBnZXRvcHQgY29udmVydHMgc3RyaW5ncyB0byBudW1iZXJzIGZvciB1cworCQlvcHRfY29tcGxlbWVudGFyeSA9ICItMTphKzpjKzpkKzpmKzpsKzptKzpvKzpwKzpyKzpzKzp0KyI7CisJCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrYTpjOmQ6ZjpsOm06bzpwOnI6czp0OnU6VTplOiIKKwkJCUlGX0NIUFNUKCIvOm46dlAwMTIiKSwKKwkJCSZsaW1pdGEsICZsaW1pdGMsICZsaW1pdGQsICZsaW1pdGYsICZsaW1pdGwsCisJCQkmbGltaXRtLCAmbGltaXRvLCAmbGltaXRwLCAmbGltaXRyLCAmbGltaXRzLCAmbGltaXR0LAorCQkJJnNldF91c2VyLCAmZW52X3VzZXIsICZlbnZfZGlyCisJCQlJRl9DSFBTVCgsICZyb290LCAmbmljZXN0cikpOworCQlhcmd2ICs9IG9wdGluZDsKKwkJaWYgKG9wdCAmIE9QVF9tKSB7IC8vIC1tIG1lYW5zIC1hc2xkCisJCQlsaW1pdGEgPSBsaW1pdHMgPSBsaW1pdGwgPSBsaW1pdGQgPSBsaW1pdG07CisJCQlvcHQgfD0gKE9QVF9zIHwgT1BUX2wgfCBPUFRfYSB8IE9QVF9kKTsKKwkJfQorCX0gZWxzZSB7CisJCW9wdGlvbl9tYXNrMzIgPSBvcHQgPSAwOworCQlhcmd2Kys7CisJCWlmICghKmFyZ3YpCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLy8gZW52ZGlyPworCWlmIChFTkFCTEVfRU5WRElSICYmIGFwcGxldF9uYW1lWzNdID09ICdkJykgeworCQllbnZfZGlyID0gKmFyZ3YrKzsKKwkJb3B0IHw9IE9QVF9lOworCX0KKworCS8vIHNldHVpZGdpZD8KKwlpZiAoRU5BQkxFX1NFVFVJREdJRCAmJiBhcHBsZXRfbmFtZVsxXSA9PSAnZScpIHsKKwkJc2V0X3VzZXIgPSAqYXJndisrOworCQlvcHQgfD0gT1BUX3U7CisJfQorCisJLy8gZW52dWlkZ2lkPworCWlmIChFTkFCTEVfRU5WVUlER0lEICYmIGFwcGxldF9uYW1lWzBdID09ICdlJyAmJiBhcHBsZXRfbmFtZVszXSA9PSAndScpIHsKKwkJZW52X3VzZXIgPSAqYXJndisrOworCQlvcHQgfD0gT1BUX1U7CisJfQorCisJLy8gd2UgbXVzdCBoYXZlIFBST0cgW0FSR1NdCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJLy8gc2V0IGxpbWl0cworCWlmIChvcHQgJiBPUFRfZCkgeworI2lmZGVmIFJMSU1JVF9EQVRBCisJCWxpbWl0KFJMSU1JVF9EQVRBLCBsaW1pdGQpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJEQVRBIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9zKSB7CisjaWZkZWYgUkxJTUlUX1NUQUNLCisJCWxpbWl0KFJMSU1JVF9TVEFDSywgbGltaXRzKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiU1RBQ0siKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX2wpIHsKKyNpZmRlZiBSTElNSVRfTUVNTE9DSworCQlsaW1pdChSTElNSVRfTUVNTE9DSywgbGltaXRsKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiTUVNTE9DSyIpOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfYSkgeworI2lmZGVmIFJMSU1JVF9WTUVNCisJCWxpbWl0KFJMSU1JVF9WTUVNLCBsaW1pdGEpOworI2Vsc2UKKyNpZmRlZiBSTElNSVRfQVMKKwkJbGltaXQoUkxJTUlUX0FTLCBsaW1pdGEpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJWTUVNIik7CisjZW5kaWYKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX28pIHsKKyNpZmRlZiBSTElNSVRfTk9GSUxFCisJCWxpbWl0KFJMSU1JVF9OT0ZJTEUsIGxpbWl0byk7CisjZWxzZQorI2lmZGVmIFJMSU1JVF9PRklMRQorCQlsaW1pdChSTElNSVRfT0ZJTEUsIGxpbWl0byk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIk5PRklMRSIpOworI2VuZGlmCisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9wKSB7CisjaWZkZWYgUkxJTUlUX05QUk9DCisJCWxpbWl0KFJMSU1JVF9OUFJPQywgbGltaXRwKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiTlBST0MiKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX2YpIHsKKyNpZmRlZiBSTElNSVRfRlNJWkUKKwkJbGltaXQoUkxJTUlUX0ZTSVpFLCBsaW1pdGYpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJGU0laRSIpOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfYykgeworI2lmZGVmIFJMSU1JVF9DT1JFCisJCWxpbWl0KFJMSU1JVF9DT1JFLCBsaW1pdGMpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJDT1JFIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9yKSB7CisjaWZkZWYgUkxJTUlUX1JTUworCQlsaW1pdChSTElNSVRfUlNTLCBsaW1pdHIpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJSU1MiKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX3QpIHsKKyNpZmRlZiBSTElNSVRfQ1BVCisJCWxpbWl0KFJMSU1JVF9DUFUsIGxpbWl0dCk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIkNQVSIpOworI2VuZGlmCisJfQorCisJaWYgKG9wdCAmIE9QVF9QKQorCQlzZXRzaWQoKTsKKworCWlmIChvcHQgJiBPUFRfZSkKKwkJZWRpcihlbnZfZGlyKTsKKworCS8vIEZJWE1FOiBjaHJvb3RlZCBqYWlsIG11c3QgaGF2ZSAvZXRjL3Bhc3N3ZCBpZiB3ZSBtb3ZlIHRoaXMgYWZ0ZXIgY2hyb290IQorCS8vIE9UT0ggY2hyb290IGZhaWxzIGZvciBub24tcm9vdHMhCisJLy8gU09MVVRJT046IGNhY2hlIHVpZC9naWQgYmVmb3JlIGNocm9vdCwgYXBwbHkgdWlkL2dpZCBhZnRlcgorCWlmIChvcHQgJiBPUFRfVSkgeworCQl4Z2V0X3VpZGdpZCgmdWdpZCwgZW52X3VzZXIpOworCQl4c2V0ZW52KCJHSUQiLCB1dG9hKHVnaWQuZ2lkKSk7CisJCXhzZXRlbnYoIlVJRCIsIHV0b2EodWdpZC51aWQpKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX3UpIHsKKwkJeGdldF91aWRnaWQoJnVnaWQsIHNldF91c2VyKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX3Jvb3QpIHsKKwkJeGNoZGlyKHJvb3QpOworCQl4Y2hyb290KCIuIik7CisJfQorCisJaWYgKG9wdCAmIE9QVF91KSB7CisJCWlmIChzZXRncm91cHMoMSwgJnVnaWQuZ2lkKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0Z3JvdXBzIik7CisJCXhzZXRnaWQodWdpZC5naWQpOworCQl4c2V0dWlkKHVnaWQudWlkKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX24pIHsKKwkJZXJybm8gPSAwOworCQlpZiAobmljZSh4YXRvaShuaWNlc3RyKSkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm5pY2UiKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUXzApCisJCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJaWYgKG9wdCAmIE9QVF8xKQorCQljbG9zZShTVERPVVRfRklMRU5PKTsKKwlpZiAob3B0ICYgT1BUXzIpCisJCWNsb3NlKFNUREVSUl9GSUxFTk8pOworCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL3J1bml0L3J1bml0X2xpYi5oIGIvcnVuaXQvcnVuaXRfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2ZWE0YwotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L3J1bml0X2xpYi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKgorICogcnVuc3YgLyBzdXBlcnZpc2UgLyBzdiBzdHVmZgorICovCit0eXBlZGVmIHN0cnVjdCBzdnN0YXR1c190IHsKKwl1aW50NjRfdCB0aW1lX2JlNjQgUEFDS0VEOworCXVpbnQzMl90IHRpbWVfbnNlY19iZTMyIFBBQ0tFRDsKKwl1aW50MzJfdCBwaWRfbGUzMiBQQUNLRUQ7CisJdWludDhfdCAgcGF1c2VkOworCXVpbnQ4X3QgIHdhbnQ7IC8qICd1JyBvciAnZCcgKi8KKwl1aW50OF90ICBnb3RfdGVybTsKKwl1aW50OF90ICBydW5fb3JfZmluaXNoOworfSBzdnN0YXR1c190Oworc3RydWN0IEVSUl9zdnN0YXR1c19tdXN0X2JlXzIwX2J5dGVzIHsKKwljaGFyIEVSUl9zdnN0YXR1c19tdXN0X2JlXzIwX2J5dGVzW3NpemVvZihzdnN0YXR1c190KSA9PSAyMCA/IDEgOiAtMV07Cit9OworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQpkaWZmIC0tZ2l0IGEvcnVuaXQvcnVuc3YuYyBiL3J1bml0L3J1bnN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZDg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L3J1bnN2LmMKQEAgLTAsMCArMSw2NzEgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPiAqLworLyogVE9ETzogZGVwZW5kcyBvbiBydW5pdF9saWIuYyAtIHJldmlldyBhbmQgcmVkdWNlL2VsaW1pbmF0ZSAqLworCisvL3VzYWdlOiNkZWZpbmUgcnVuc3ZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkRJUiIKKy8vdXNhZ2U6I2RlZmluZSBydW5zdl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlN0YXJ0IGFuZCBtb25pdG9yIGEgc2VydmljZSBhbmQgb3B0aW9uYWxseSBhbiBhcHBlbmRhbnQgbG9nIHNlcnZpY2UiCisKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydW5pdF9saWIuaCIKKworI2lmIEVOQUJMRV9NT05PVE9OSUNfU1lTQ0FMTAorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKy8qIGxpYmMgaGFzIGluY3JlZGlibHkgbWVzc3kgd2F5IG9mIGRvaW5nIHRoaXMsCisgKiB0eXBpY2FsbHkgcmVxdWlyaW5nIC1scnQuIFdlIGp1c3Qgc2tpcCBhbGwgdGhpcyBtZXNzICovCitzdGF0aWMgdm9pZCBnZXR0aW1lb2ZkYXlfbnMoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzeXNjYWxsKF9fTlJfY2xvY2tfZ2V0dGltZSwgQ0xPQ0tfUkVBTFRJTUUsIHRzKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBnZXR0aW1lb2ZkYXlfbnMoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlpZiAoc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSA9PSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKQorCSAmJiBzaXplb2YoKChzdHJ1Y3QgdGltZXZhbCopdHMpLT50dl91c2VjKSA9PSBzaXplb2YodHMtPnR2X25zZWMpCisJKSB7CisJCS8qIENoZWF0ICovCisJCWdldHRpbWVvZmRheSgodm9pZCopdHMsIE5VTEwpOworCQl0cy0+dHZfbnNlYyAqPSAxMDAwOworCX0gZWxzZSB7CisJCWV4dGVybiB2b2lkIEJVR19uZWVkX3RvX2ltcGxlbWVudF9nZXR0aW1lb2ZkYXlfbnModm9pZCk7CisJCUJVR19uZWVkX3RvX2ltcGxlbWVudF9nZXR0aW1lb2ZkYXlfbnMoKTsKKwl9Cit9CisjZW5kaWYKKworLyogQ29tcGFyZSBwb3NzaWJseSBvdmVyZmxvd2luZyB1bnNpZ25lZCBjb3VudGVycyAqLworI2RlZmluZSBMRVNTKGEsYikgKChpbnQpKCh1bnNpZ25lZCkoYikgLSAodW5zaWduZWQpKGEpKSA+IDApCisKKy8qIHN0YXRlICovCisjZGVmaW5lIFNfRE9XTiAwCisjZGVmaW5lIFNfUlVOIDEKKyNkZWZpbmUgU19GSU5JU0ggMgorLyogY3RybCAqLworI2RlZmluZSBDX05PT1AgMAorI2RlZmluZSBDX1RFUk0gMQorI2RlZmluZSBDX1BBVVNFIDIKKy8qIHdhbnQgKi8KKyNkZWZpbmUgV19VUCAwCisjZGVmaW5lIFdfRE9XTiAxCisjZGVmaW5lIFdfRVhJVCAyCisKK3N0cnVjdCBzdmRpciB7CisJaW50IHBpZDsKKwlzbWFsbGludCBzdGF0ZTsKKwlzbWFsbGludCBjdHJsOworCXNtYWxsaW50IHNkX3dhbnQ7CisJc21hbGxpbnQgaXNsb2c7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0OworCWludCBmZGxvY2s7CisJaW50IGZkY29udHJvbDsKKwlpbnQgZmRjb250cm9sd3JpdGU7CisJaW50IHdzdGF0OworfTsKKworc3RydWN0IGdsb2JhbHMgeworCXNtYWxsaW50IGhhc2xvZzsKKwlzbWFsbGludCBzaWd0ZXJtOworCXNtYWxsaW50IHBpZGNoYW5nZWQ7CisJc3RydWN0IGZkX3BhaXIgc2VsZnBpcGU7CisJc3RydWN0IGZkX3BhaXIgbG9ncGlwZTsKKwljaGFyICpkaXI7CisJc3RydWN0IHN2ZGlyIHN2ZFsyXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIGhhc2xvZyAgICAgICAoRy5oYXNsb2cgICAgICApCisjZGVmaW5lIHNpZ3Rlcm0gICAgICAoRy5zaWd0ZXJtICAgICApCisjZGVmaW5lIHBpZGNoYW5nZWQgICAoRy5waWRjaGFuZ2VkICApCisjZGVmaW5lIHNlbGZwaXBlICAgICAoRy5zZWxmcGlwZSAgICApCisjZGVmaW5lIGxvZ3BpcGUgICAgICAoRy5sb2dwaXBlICAgICApCisjZGVmaW5lIGRpciAgICAgICAgICAoRy5kaXIgICAgICAgICApCisjZGVmaW5lIHN2ZCAgICAgICAgICAoRy5zdmQgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCXBpZGNoYW5nZWQgPSAxOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBmYXRhbDJfY2Fubm90KGNvbnN0IGNoYXIgKm0xLCBjb25zdCBjaGFyICptMikKK3sKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBmYXRhbDogY2Fubm90ICVzJXMiLCBkaXIsIG0xLCBtMik7CisJLyogd2FzIGV4aXRpbmcgMTExICovCit9CitzdGF0aWMgdm9pZCBmYXRhbF9jYW5ub3QoY29uc3QgY2hhciAqbSkKK3sKKwlmYXRhbDJfY2Fubm90KG0sICIiKTsKKwkvKiB3YXMgZXhpdGluZyAxMTEgKi8KK30KK3N0YXRpYyB2b2lkIGZhdGFsMnhfY2Fubm90KGNvbnN0IGNoYXIgKm0xLCBjb25zdCBjaGFyICptMikKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IGZhdGFsOiBjYW5ub3QgJXMlcyIsIGRpciwgbTEsIG0yKTsKKwkvKiB3YXMgZXhpdGluZyAxMTEgKi8KK30KK3N0YXRpYyB2b2lkIHdhcm5fY2Fubm90KGNvbnN0IGNoYXIgKm0pCit7CisJYmJfcGVycm9yX21zZygiJXM6IHdhcm5pbmc6IGNhbm5vdCAlcyIsIGRpciwgbSk7Cit9CisKK3N0YXRpYyB2b2lkIHNfY2hpbGQoaW50IHNpZ19ubyBVTlVTRURfUEFSQU0pCit7CisJd3JpdGUoc2VsZnBpcGUud3IsICIiLCAxKTsKK30KKworc3RhdGljIHZvaWQgc190ZXJtKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCXNpZ3Rlcm0gPSAxOworCXdyaXRlKHNlbGZwaXBlLndyLCAiIiwgMSk7IC8qIFhYWCAqLworfQorCitzdGF0aWMgaW50IG9wZW5fdHJ1bmNfb3Jfd2Fybihjb25zdCBjaGFyICpuYW1lKQoreworCS8qIFdoeSBPX05ERUxBWT8gKi8KKwlpbnQgZmQgPSBvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19OREVMQVkgfCBPX1RSVU5DIHwgT19DUkVBVCwgMDY0NCk7CisJaWYgKGZkIDwgMCkKKwkJYmJfcGVycm9yX21zZygiJXM6IHdhcm5pbmc6IGNhbm5vdCBvcGVuICVzIiwKKwkJCQlkaXIsIG5hbWUpOworCXJldHVybiBmZDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXR1cyhzdHJ1Y3Qgc3ZkaXIgKnMpCit7CisJc3NpemVfdCBzejsKKwlpbnQgZmQ7CisJc3ZzdGF0dXNfdCBzdGF0dXM7CisKKwkvKiBwaWQgKi8KKwlpZiAocGlkY2hhbmdlZCkgeworCQlmZCA9IG9wZW5fdHJ1bmNfb3Jfd2Fybigic3VwZXJ2aXNlL3BpZC5uZXciKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKHMtPnBpZCkgeworCQkJY2hhciBzcGlkW3NpemVvZihpbnQpKjMgKyAyXTsKKwkJCWludCBzaXplID0gc3ByaW50ZihzcGlkLCAiJXVcbiIsICh1bnNpZ25lZClzLT5waWQpOworCQkJd3JpdGUoZmQsIHNwaWQsIHNpemUpOworCQl9CisJCWNsb3NlKGZkKTsKKwkJaWYgKHJlbmFtZV9vcl93YXJuKCJzdXBlcnZpc2UvcGlkLm5ldyIsCisJCSAgICBzLT5pc2xvZyA/ICJsb2cvc3VwZXJ2aXNlL3BpZCIgOiAibG9nL3N1cGVydmlzZS9waWQiKzQpKQorCQkJcmV0dXJuOworCQlwaWRjaGFuZ2VkID0gMDsKKwl9CisKKwkvKiBzdGF0ICovCisJZmQgPSBvcGVuX3RydW5jX29yX3dhcm4oInN1cGVydmlzZS9zdGF0Lm5ldyIpOworCWlmIChmZCA8IC0xKQorCQlyZXR1cm47CisKKwl7CisJCWNoYXIgc3RhdF9idWZbc2l6ZW9mKCJmaW5pc2gsIHBhdXNlZCwgZ290IFRFUk0sIHdhbnQgZG93blxuIildOworCQljaGFyICpwID0gc3RhdF9idWY7CisJCXN3aXRjaCAocy0+c3RhdGUpIHsKKwkJY2FzZSBTX0RPV046CisJCQlwID0gc3RwY3B5KHAsICJkb3duIik7CisJCQlicmVhazsKKwkJY2FzZSBTX1JVTjoKKwkJCXAgPSBzdHBjcHkocCwgInJ1biIpOworCQkJYnJlYWs7CisJCWNhc2UgU19GSU5JU0g6CisJCQlwID0gc3RwY3B5KHAsICJmaW5pc2giKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzLT5jdHJsICYgQ19QQVVTRSkKKwkJCXAgPSBzdHBjcHkocCwgIiwgcGF1c2VkIik7CisJCWlmIChzLT5jdHJsICYgQ19URVJNKQorCQkJcCA9IHN0cGNweShwLCAiLCBnb3QgVEVSTSIpOworCQlpZiAocy0+c3RhdGUgIT0gU19ET1dOKQorCQkJc3dpdGNoIChzLT5zZF93YW50KSB7CisJCQljYXNlIFdfRE9XTjoKKwkJCQlwID0gc3RwY3B5KHAsICIsIHdhbnQgZG93biIpOworCQkJCWJyZWFrOworCQkJY2FzZSBXX0VYSVQ6CisJCQkJcCA9IHN0cGNweShwLCAiLCB3YW50IGV4aXQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJKnArKyA9ICdcbic7CisJCXdyaXRlKGZkLCBzdGF0X2J1ZiwgcCAtIHN0YXRfYnVmKTsKKwkJY2xvc2UoZmQpOworCX0KKworCXJlbmFtZV9vcl93YXJuKCJzdXBlcnZpc2Uvc3RhdC5uZXciLAorCQlzLT5pc2xvZyA/ICJsb2cvc3VwZXJ2aXNlL3N0YXQiIDogImxvZy9zdXBlcnZpc2Uvc3RhdCIrNCk7CisKKwkvKiBzdXBlcnZpc2UgY29tcGF0aWJpbGl0eSAqLworCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7CisJc3RhdHVzLnRpbWVfYmU2NCA9IFNXQVBfQkU2NChzLT5zdGFydC50dl9zZWMgKyAweDQwMDAwMDAwMDAwMDAwMGFVTEwpOworCXN0YXR1cy50aW1lX25zZWNfYmUzMiA9IFNXQVBfQkUzMihzLT5zdGFydC50dl9uc2VjKTsKKwlzdGF0dXMucGlkX2xlMzIgPSBTV0FQX0xFMzIocy0+cGlkKTsKKwlpZiAocy0+Y3RybCAmIENfUEFVU0UpCisJCXN0YXR1cy5wYXVzZWQgPSAxOworCWlmIChzLT5zZF93YW50ID09IFdfVVApCisJCXN0YXR1cy53YW50ID0gJ3UnOworCWVsc2UKKwkJc3RhdHVzLndhbnQgPSAnZCc7CisJaWYgKHMtPmN0cmwgJiBDX1RFUk0pCisJCXN0YXR1cy5nb3RfdGVybSA9IDE7CisJc3RhdHVzLnJ1bl9vcl9maW5pc2ggPSBzLT5zdGF0ZTsKKwlmZCA9IG9wZW5fdHJ1bmNfb3Jfd2Fybigic3VwZXJ2aXNlL3N0YXR1cy5uZXciKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisJc3ogPSB3cml0ZShmZCwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworCWNsb3NlKGZkKTsKKwlpZiAoc3ogIT0gc2l6ZW9mKHN0YXR1cykpIHsKKwkJd2Fybl9jYW5ub3QoIndyaXRlIHN1cGVydmlzZS9zdGF0dXMubmV3Iik7CisJCXVubGluaygic3VwZXJ2aXNlL3N0YXR1cy5uZXciKTsKKwkJcmV0dXJuOworCX0KKwlyZW5hbWVfb3Jfd2Fybigic3VwZXJ2aXNlL3N0YXR1cy5uZXciLAorCQlzLT5pc2xvZyA/ICJsb2cvc3VwZXJ2aXNlL3N0YXR1cyIgOiAibG9nL3N1cGVydmlzZS9zdGF0dXMiKzQpOworfQorCitzdGF0aWMgdW5zaWduZWQgY3VzdG9tKHN0cnVjdCBzdmRpciAqcywgY2hhciBjKQoreworCXBpZF90IHBpZDsKKwlpbnQgdzsKKwljaGFyIGFbMTBdOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHMtPmlzbG9nKQorCQlyZXR1cm4gMDsKKwlzdHJjcHkoYSwgImNvbnRyb2wvPyIpOworCWFbOF0gPSBjOyAvKiByZXBsYWNlICc/JyAqLworCWlmIChzdGF0KGEsICZzdCkgPT0gMCkgeworCQlpZiAoc3Quc3RfbW9kZSAmIFNfSVhVU1IpIHsKKwkJCXBpZCA9IHZmb3JrKCk7CisJCQlpZiAocGlkID09IC0xKSB7CisJCQkJd2Fybl9jYW5ub3QoInZmb3JrIGZvciBjb250cm9sLz8iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChwaWQgPT0gMCkgeworCQkJCS8qIGNoaWxkICovCisJCQkJaWYgKGhhc2xvZyAmJiBkdXAyKGxvZ3BpcGUud3IsIDEpID09IC0xKQorCQkJCQl3YXJuX2Nhbm5vdCgic2V0dXAgc3Rkb3V0IGZvciBjb250cm9sLz8iKTsKKwkJCQlleGVjbChhLCBhLCAoY2hhciAqKSBOVUxMKTsKKwkJCQlmYXRhbF9jYW5ub3QoInJ1biBjb250cm9sLz8iKTsKKwkJCX0KKwkJCS8qIHBhcmVudCAqLworCQkJaWYgKHNhZmVfd2FpdHBpZChwaWQsICZ3LCAwKSA9PSAtMSkgeworCQkJCXdhcm5fY2Fubm90KCJ3YWl0IGZvciBjaGlsZCBjb250cm9sLz8iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiBXRVhJVFNUQVRVUyh3KSA9PSAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCXdhcm5fY2Fubm90KCJzdGF0IGNvbnRyb2wvPyIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RvcHNlcnZpY2Uoc3RydWN0IHN2ZGlyICpzKQoreworCWlmIChzLT5waWQgJiYgIWN1c3RvbShzLCAndCcpKSB7CisJCWtpbGwocy0+cGlkLCBTSUdURVJNKTsKKwkJcy0+Y3RybCB8PSBDX1RFUk07CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJfQorCWlmIChzLT5zZF93YW50ID09IFdfRE9XTikgeworCQlraWxsKHMtPnBpZCwgU0lHQ09OVCk7CisJCWN1c3RvbShzLCAnZCcpOworCQlyZXR1cm47CisJfQorCWlmIChzLT5zZF93YW50ID09IFdfRVhJVCkgeworCQlraWxsKHMtPnBpZCwgU0lHQ09OVCk7CisJCWN1c3RvbShzLCAneCcpOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRzZXJ2aWNlKHN0cnVjdCBzdmRpciAqcykKK3sKKwlpbnQgcDsKKwljb25zdCBjaGFyICphcmdbNF07CisJY2hhciBleGl0Y29kZVtzaXplb2YoaW50KSozICsgMl07CisKKwlpZiAocy0+c3RhdGUgPT0gU19GSU5JU0gpIHsKKy8qIFR3byBhcmd1bWVudHMgYXJlIGdpdmVuIHRvIC4vZmluaXNoLiBUaGUgZmlyc3Qgb25lIGlzIC4vcnVuIGV4aXQgY29kZSwKKyAqIG9yIC0xIGlmIC4vcnVuIGRpZG50IGV4aXQgbm9ybWFsbHkuIFRoZSBzZWNvbmQgb25lIGlzCisgKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgZXhpdCBzdGF0dXMgYXMgZGV0ZXJtaW5lZCBieSB3YWl0cGlkOworICogZm9yIGluc3RhbmNlIGl0IGlzIDAgaWYgLi9ydW4gZXhpdGVkIG5vcm1hbGx5LCBhbmQgdGhlIHNpZ25hbCBudW1iZXIKKyAqIGlmIC4vcnVuIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiBJZiBydW5zdiBjYW5ub3Qgc3RhcnQgLi9ydW4KKyAqIGZvciBzb21lIHJlYXNvbiwgdGhlIGV4aXQgY29kZSBpcyAxMTEgYW5kIHRoZSBzdGF0dXMgaXMgMC4KKyAqLworCQlhcmdbMF0gPSAiLi9maW5pc2giOworCQlhcmdbMV0gPSAiLTEiOworCQlpZiAoV0lGRVhJVEVEKHMtPndzdGF0KSkgeworCQkJKnV0b2FfdG9fYnVmKFdFWElUU1RBVFVTKHMtPndzdGF0KSwgZXhpdGNvZGUsIHNpemVvZihleGl0Y29kZSkpID0gJ1wwJzsKKwkJCWFyZ1sxXSA9IGV4aXRjb2RlOworCQl9CisJCS8vYXJnWzJdID0gIjAiOworCQkvL2lmIChXSUZTSUdOQUxFRChzLT53c3RhdCkpIHsKKwkJCWFyZ1syXSA9IHV0b2EoV1RFUk1TSUcocy0+d3N0YXQpKTsKKwkJLy99CisJCWFyZ1szXSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJYXJnWzBdID0gIi4vcnVuIjsKKwkJYXJnWzFdID0gTlVMTDsKKwkJY3VzdG9tKHMsICd1Jyk7CisJfQorCisJaWYgKHMtPnBpZCAhPSAwKQorCQlzdG9wc2VydmljZShzKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCXdoaWxlICgocCA9IHZmb3JrKCkpID09IC0xKSB7CisJCXdhcm5fY2Fubm90KCJ2Zm9yaywgc2xlZXBpbmciKTsKKwkJc2xlZXAoNSk7CisJfQorCWlmIChwID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJaWYgKGhhc2xvZykgeworCQkJLyogTkI6IGJ1ZyBhbGVydCEgcmlnaHQgb3JkZXIgaXMgY2xvc2UsIHRoZW4gZHVwMiAqLworCQkJaWYgKHMtPmlzbG9nKSB7CisJCQkJeGNoZGlyKCIuL2xvZyIpOworCQkJCWNsb3NlKGxvZ3BpcGUud3IpOworCQkJCXhkdXAyKGxvZ3BpcGUucmQsIDApOworCQkJfSBlbHNlIHsKKwkJCQljbG9zZShsb2dwaXBlLnJkKTsKKwkJCQl4ZHVwMihsb2dwaXBlLndyLCAxKTsKKwkJCX0KKwkJfQorCQkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJCS8qYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR0NITEQpCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQksIFNJR19ERkwpOyovCisJCXNpZ191bmJsb2NrKFNJR0NITEQpOworCQlzaWdfdW5ibG9jayhTSUdURVJNKTsKKwkJZXhlY3YoYXJnWzBdLCAoY2hhcioqKSBhcmcpOworCQlmYXRhbDJfY2Fubm90KHMtPmlzbG9nID8gInN0YXJ0IGxvZy8iIDogInN0YXJ0ICIsIGFyZ1swXSk7CisJfQorCS8qIHBhcmVudCAqLworCWlmIChzLT5zdGF0ZSAhPSBTX0ZJTklTSCkgeworCQlnZXR0aW1lb2ZkYXlfbnMoJnMtPnN0YXJ0KTsKKwkJcy0+c3RhdGUgPSBTX1JVTjsKKwl9CisJcy0+cGlkID0gcDsKKwlwaWRjaGFuZ2VkID0gMTsKKwlzLT5jdHJsID0gQ19OT09QOworCXVwZGF0ZV9zdGF0dXMocyk7Cit9CisKK3N0YXRpYyBpbnQgY3RybChzdHJ1Y3Qgc3ZkaXIgKnMsIGNoYXIgYykKK3sKKwlpbnQgc2lnOworCisJc3dpdGNoIChjKSB7CisJY2FzZSAnZCc6IC8qIGRvd24gKi8KKwkJcy0+c2Rfd2FudCA9IFdfRE9XTjsKKwkJdXBkYXRlX3N0YXR1cyhzKTsKKwkJaWYgKHMtPnBpZCAmJiBzLT5zdGF0ZSAhPSBTX0ZJTklTSCkKKwkJCXN0b3BzZXJ2aWNlKHMpOworCQlicmVhazsKKwljYXNlICd1JzogLyogdXAgKi8KKwkJcy0+c2Rfd2FudCA9IFdfVVA7CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCWlmIChzLT5waWQgPT0gMCkKKwkJCXN0YXJ0c2VydmljZShzKTsKKwkJYnJlYWs7CisJY2FzZSAneCc6IC8qIGV4aXQgKi8KKwkJaWYgKHMtPmlzbG9nKQorCQkJYnJlYWs7CisJCXMtPnNkX3dhbnQgPSBXX0VYSVQ7CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAndCc6IC8qIHNpZyB0ZXJtICovCisJCWlmIChzLT5waWQgJiYgcy0+c3RhdGUgIT0gU19GSU5JU0gpCisJCQlzdG9wc2VydmljZShzKTsKKwkJYnJlYWs7CisJY2FzZSAnayc6IC8qIHNpZyBraWxsICovCisJCWlmIChzLT5waWQgJiYgIWN1c3RvbShzLCBjKSkKKwkJCWtpbGwocy0+cGlkLCBTSUdLSUxMKTsKKwkJcy0+c3RhdGUgPSBTX0RPV047CisJCWJyZWFrOworCWNhc2UgJ3AnOiAvKiBzaWcgcGF1c2UgKi8KKwkJaWYgKHMtPnBpZCAmJiAhY3VzdG9tKHMsIGMpKQorCQkJa2lsbChzLT5waWQsIFNJR1NUT1ApOworCQlzLT5jdHJsIHw9IENfUEFVU0U7CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCWJyZWFrOworCWNhc2UgJ2MnOiAvKiBzaWcgY29udCAqLworCQlpZiAocy0+cGlkICYmICFjdXN0b20ocywgYykpCisJCQlraWxsKHMtPnBpZCwgU0lHQ09OVCk7CisJCXMtPmN0cmwgJj0gfkNfUEFVU0U7CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCWJyZWFrOworCWNhc2UgJ28nOiAvKiBvbmNlICovCisJCXMtPnNkX3dhbnQgPSBXX0RPV047CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCWlmICghcy0+cGlkKQorCQkJc3RhcnRzZXJ2aWNlKHMpOworCQlicmVhazsKKwljYXNlICdhJzogLyogc2lnIGFsYXJtICovCisJCXNpZyA9IFNJR0FMUk07CisJCWdvdG8gc2VuZHNpZzsKKwljYXNlICdoJzogLyogc2lnIGh1cCAqLworCQlzaWcgPSBTSUdIVVA7CisJCWdvdG8gc2VuZHNpZzsKKwljYXNlICdpJzogLyogc2lnIGludCAqLworCQlzaWcgPSBTSUdJTlQ7CisJCWdvdG8gc2VuZHNpZzsKKwljYXNlICdxJzogLyogc2lnIHF1aXQgKi8KKwkJc2lnID0gU0lHUVVJVDsKKwkJZ290byBzZW5kc2lnOworCWNhc2UgJzEnOiAvKiBzaWcgdXNyMSAqLworCQlzaWcgPSBTSUdVU1IxOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAnMic6IC8qIHNpZyB1c3IyICovCisJCXNpZyA9IFNJR1VTUjI7CisJCWdvdG8gc2VuZHNpZzsKKwl9CisJcmV0dXJuIDE7Cisgc2VuZHNpZzoKKwlpZiAocy0+cGlkICYmICFjdXN0b20ocywgYykpCisJCWtpbGwocy0+cGlkLCBzaWcpOworCXJldHVybiAxOworfQorCitpbnQgcnVuc3ZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJ1bnN2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCWludCBmZDsKKwlpbnQgcjsKKwljaGFyIGJ1ZlsyNTZdOworCisJSU5JVF9HKCk7CisKKwlkaXIgPSBzaW5nbGVfYXJndihhcmd2KTsKKworCXhwaXBlZF9wYWlyKHNlbGZwaXBlKTsKKwljbG9zZV9vbl9leGVjX29uKHNlbGZwaXBlLnJkKTsKKwljbG9zZV9vbl9leGVjX29uKHNlbGZwaXBlLndyKTsKKwluZGVsYXlfb24oc2VsZnBpcGUucmQpOworCW5kZWxheV9vbihzZWxmcGlwZS53cik7CisKKwlzaWdfYmxvY2soU0lHQ0hMRCk7CisJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KDEgPDwgU0lHQ0hMRCwgc19jaGlsZCk7CisJc2lnX2Jsb2NrKFNJR1RFUk0pOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR1RFUk0sIHNfdGVybSk7CisKKwl4Y2hkaXIoZGlyKTsKKwkvKiBic3M6IHN2ZFswXS5waWQgPSAwOyAqLworCWlmIChTX0RPV04pIHN2ZFswXS5zdGF0ZSA9IFNfRE9XTjsgLyogb3RoZXJ3aXNlIGFscmVhZHkgMCAoYnNzKSAqLworCWlmIChDX05PT1ApIHN2ZFswXS5jdHJsID0gQ19OT09QOworCWlmIChXX1VQKSBzdmRbMF0uc2Rfd2FudCA9IFdfVVA7CisJLyogYnNzOiBzdmRbMF0uaXNsb2cgPSAwOyAqLworCS8qIGJzczogc3ZkWzFdLnBpZCA9IDA7ICovCisJZ2V0dGltZW9mZGF5X25zKCZzdmRbMF0uc3RhcnQpOworCWlmIChzdGF0KCJkb3duIiwgJnMpICE9IC0xKQorCQlzdmRbMF0uc2Rfd2FudCA9IFdfRE9XTjsKKworCWlmIChzdGF0KCJsb2ciLCAmcykgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCXdhcm5fY2Fubm90KCJzdGF0IC4vbG9nIik7CisJfSBlbHNlIHsKKwkJaWYgKCFTX0lTRElSKHMuc3RfbW9kZSkpIHsKKwkJCWVycm5vID0gMDsKKwkJCXdhcm5fY2Fubm90KCJzdGF0IGxvZy9kb3duOiBsb2cgaXMgbm90IGEgZGlyZWN0b3J5Iik7CisJCX0gZWxzZSB7CisJCQloYXNsb2cgPSAxOworCQkJc3ZkWzFdLnN0YXRlID0gU19ET1dOOworCQkJc3ZkWzFdLmN0cmwgPSBDX05PT1A7CisJCQlzdmRbMV0uc2Rfd2FudCA9IFdfVVA7CisJCQlzdmRbMV0uaXNsb2cgPSAxOworCQkJZ2V0dGltZW9mZGF5X25zKCZzdmRbMV0uc3RhcnQpOworCQkJaWYgKHN0YXQoImxvZy9kb3duIiwgJnMpICE9IC0xKQorCQkJCXN2ZFsxXS5zZF93YW50ID0gV19ET1dOOworCQkJeHBpcGVkX3BhaXIobG9ncGlwZSk7CisJCQljbG9zZV9vbl9leGVjX29uKGxvZ3BpcGUucmQpOworCQkJY2xvc2Vfb25fZXhlY19vbihsb2dwaXBlLndyKTsKKwkJfQorCX0KKworCWlmIChta2Rpcigic3VwZXJ2aXNlIiwgMDcwMCkgPT0gLTEpIHsKKwkJciA9IHJlYWRsaW5rKCJzdXBlcnZpc2UiLCBidWYsIHNpemVvZihidWYpKTsKKwkJaWYgKHIgIT0gLTEpIHsKKwkJCWlmIChyID09IHNpemVvZihidWYpKQorCQkJCWZhdGFsMnhfY2Fubm90KCJyZWFkbGluayAuL3N1cGVydmlzZSIsICI6IG5hbWUgdG9vIGxvbmciKTsKKwkJCWJ1ZltyXSA9IDA7CisJCQlta2RpcihidWYsIDA3MDApOworCQl9IGVsc2UgeworCQkJaWYgKChlcnJubyAhPSBFTk9FTlQpICYmIChlcnJubyAhPSBFSU5WQUwpKQorCQkJCWZhdGFsX2Nhbm5vdCgicmVhZGxpbmsgLi9zdXBlcnZpc2UiKTsKKwkJfQorCX0KKwlzdmRbMF0uZmRsb2NrID0geG9wZW4zKCJsb2cvc3VwZXJ2aXNlL2xvY2siKzQsCisJCQlPX1dST05MWXxPX05ERUxBWXxPX0FQUEVORHxPX0NSRUFULCAwNjAwKTsKKwlpZiAoZmxvY2soc3ZkWzBdLmZkbG9jaywgTE9DS19FWCB8IExPQ0tfTkIpID09IC0xKQorCQlmYXRhbF9jYW5ub3QoImxvY2sgc3VwZXJ2aXNlL2xvY2siKTsKKwljbG9zZV9vbl9leGVjX29uKHN2ZFswXS5mZGxvY2spOworCWlmIChoYXNsb2cpIHsKKwkJaWYgKG1rZGlyKCJsb2cvc3VwZXJ2aXNlIiwgMDcwMCkgPT0gLTEpIHsKKwkJCXIgPSByZWFkbGluaygibG9nL3N1cGVydmlzZSIsIGJ1ZiwgMjU2KTsKKwkJCWlmIChyICE9IC0xKSB7CisJCQkJaWYgKHIgPT0gMjU2KQorCQkJCQlmYXRhbDJ4X2Nhbm5vdCgicmVhZGxpbmsgLi9sb2cvc3VwZXJ2aXNlIiwgIjogbmFtZSB0b28gbG9uZyIpOworCQkJCWJ1ZltyXSA9IDA7CisJCQkJZmQgPSB4b3BlbigiLiIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJCQl4Y2hkaXIoIi4vbG9nIik7CisJCQkJbWtkaXIoYnVmLCAwNzAwKTsKKwkJCQlpZiAoZmNoZGlyKGZkKSA9PSAtMSkKKwkJCQkJZmF0YWxfY2Fubm90KCJjaGFuZ2UgYmFjayB0byBzZXJ2aWNlIGRpcmVjdG9yeSIpOworCQkJCWNsb3NlKGZkKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmICgoZXJybm8gIT0gRU5PRU5UKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkKKwkJCQkJZmF0YWxfY2Fubm90KCJyZWFkbGluayAuL2xvZy9zdXBlcnZpc2UiKTsKKwkJCX0KKwkJfQorCQlzdmRbMV0uZmRsb2NrID0geG9wZW4zKCJsb2cvc3VwZXJ2aXNlL2xvY2siLAorCQkJCU9fV1JPTkxZfE9fTkRFTEFZfE9fQVBQRU5EfE9fQ1JFQVQsIDA2MDApOworCQlpZiAoZmxvY2soc3ZkWzFdLmZkbG9jaywgTE9DS19FWCkgPT0gLTEpCisJCQlmYXRhbF9jYW5ub3QoImxvY2sgbG9nL3N1cGVydmlzZS9sb2NrIik7CisJCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzFdLmZkbG9jayk7CisJfQorCisJbWtmaWZvKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiKzQsIDA2MDApOworCXN2ZFswXS5mZGNvbnRyb2wgPSB4b3BlbigibG9nL3N1cGVydmlzZS9jb250cm9sIis0LCBPX1JET05MWXxPX05ERUxBWSk7CisJY2xvc2Vfb25fZXhlY19vbihzdmRbMF0uZmRjb250cm9sKTsKKwlzdmRbMF0uZmRjb250cm9sd3JpdGUgPSB4b3BlbigibG9nL3N1cGVydmlzZS9jb250cm9sIis0LCBPX1dST05MWXxPX05ERUxBWSk7CisJY2xvc2Vfb25fZXhlY19vbihzdmRbMF0uZmRjb250cm9sd3JpdGUpOworCXVwZGF0ZV9zdGF0dXMoJnN2ZFswXSk7CisJaWYgKGhhc2xvZykgeworCQlta2ZpZm8oImxvZy9zdXBlcnZpc2UvY29udHJvbCIsIDA2MDApOworCQlzdmRbMV0uZmRjb250cm9sID0geG9wZW4oImxvZy9zdXBlcnZpc2UvY29udHJvbCIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJY2xvc2Vfb25fZXhlY19vbihzdmRbMV0uZmRjb250cm9sKTsKKwkJc3ZkWzFdLmZkY29udHJvbHdyaXRlID0geG9wZW4oImxvZy9zdXBlcnZpc2UvY29udHJvbCIsIE9fV1JPTkxZfE9fTkRFTEFZKTsKKwkJY2xvc2Vfb25fZXhlY19vbihzdmRbMV0uZmRjb250cm9sd3JpdGUpOworCQl1cGRhdGVfc3RhdHVzKCZzdmRbMV0pOworCX0KKwlta2ZpZm8oImxvZy9zdXBlcnZpc2Uvb2siKzQsIDA2MDApOworCWZkID0geG9wZW4oImxvZy9zdXBlcnZpc2Uvb2siKzQsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwljbG9zZV9vbl9leGVjX29uKGZkKTsKKwlpZiAoaGFzbG9nKSB7CisJCW1rZmlmbygibG9nL3N1cGVydmlzZS9vayIsIDA2MDApOworCQlmZCA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL29rIiwgT19SRE9OTFl8T19OREVMQVkpOworCQljbG9zZV9vbl9leGVjX29uKGZkKTsKKwl9CisJZm9yICg7OykgeworCQlzdHJ1Y3QgcG9sbGZkIHhbM107CisJCXVuc2lnbmVkIGRlYWRsaW5lOworCQljaGFyIGNoOworCisJCWlmIChoYXNsb2cpCisJCQlpZiAoIXN2ZFsxXS5waWQgJiYgc3ZkWzFdLnNkX3dhbnQgPT0gV19VUCkKKwkJCQlzdGFydHNlcnZpY2UoJnN2ZFsxXSk7CisJCWlmICghc3ZkWzBdLnBpZCkKKwkJCWlmIChzdmRbMF0uc2Rfd2FudCA9PSBXX1VQIHx8IHN2ZFswXS5zdGF0ZSA9PSBTX0ZJTklTSCkKKwkJCQlzdGFydHNlcnZpY2UoJnN2ZFswXSk7CisKKwkJeFswXS5mZCA9IHNlbGZwaXBlLnJkOworCQl4WzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJeFsxXS5mZCA9IHN2ZFswXS5mZGNvbnRyb2w7CisJCXhbMV0uZXZlbnRzID0gUE9MTElOOworCQkvKiB4WzJdIGlzIHVzZWQgb25seSBpZiBoYXNsb2cgPT0gMSAqLworCQl4WzJdLmZkID0gc3ZkWzFdLmZkY29udHJvbDsKKwkJeFsyXS5ldmVudHMgPSBQT0xMSU47CisJCXNpZ191bmJsb2NrKFNJR1RFUk0pOworCQlzaWdfdW5ibG9jayhTSUdDSExEKTsKKwkJcG9sbCh4LCAyICsgaGFzbG9nLCAzNjAwKjEwMDApOworCQlzaWdfYmxvY2soU0lHVEVSTSk7CisJCXNpZ19ibG9jayhTSUdDSExEKTsKKworCQl3aGlsZSAocmVhZChzZWxmcGlwZS5yZCwgJmNoLCAxKSA9PSAxKQorCQkJY29udGludWU7CisKKwkJZm9yICg7OykgeworCQkJcGlkX3QgY2hpbGQ7CisJCQlpbnQgd3N0YXQ7CisKKwkJCWNoaWxkID0gd2FpdF9hbnlfbm9oYW5nKCZ3c3RhdCk7CisJCQlpZiAoIWNoaWxkKQorCQkJCWJyZWFrOworCQkJaWYgKChjaGlsZCA9PSAtMSkgJiYgKGVycm5vICE9IEVJTlRSKSkKKwkJCQlicmVhazsKKwkJCWlmIChjaGlsZCA9PSBzdmRbMF0ucGlkKSB7CisJCQkJc3ZkWzBdLndzdGF0ID0gd3N0YXQ7CisJCQkJc3ZkWzBdLnBpZCA9IDA7CisJCQkJcGlkY2hhbmdlZCA9IDE7CisJCQkJc3ZkWzBdLmN0cmwgJj0gfkNfVEVSTTsKKwkJCQlpZiAoc3ZkWzBdLnN0YXRlICE9IFNfRklOSVNIKSB7CisJCQkJCWZkID0gb3BlbigiZmluaXNoIiwgT19SRE9OTFl8T19OREVMQVkpOworCQkJCQlpZiAoZmQgIT0gLTEpIHsKKwkJCQkJCWNsb3NlKGZkKTsKKwkJCQkJCXN2ZFswXS5zdGF0ZSA9IFNfRklOSVNIOworCQkJCQkJdXBkYXRlX3N0YXR1cygmc3ZkWzBdKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCXN2ZFswXS5zdGF0ZSA9IFNfRE9XTjsKKwkJCQlkZWFkbGluZSA9IHN2ZFswXS5zdGFydC50dl9zZWMgKyAxOworCQkJCWdldHRpbWVvZmRheV9ucygmc3ZkWzBdLnN0YXJ0KTsKKwkJCQl1cGRhdGVfc3RhdHVzKCZzdmRbMF0pOworCQkJCWlmIChMRVNTKHN2ZFswXS5zdGFydC50dl9zZWMsIGRlYWRsaW5lKSkKKwkJCQkJc2xlZXAoMSk7CisJCQl9CisJCQlpZiAoaGFzbG9nKSB7CisJCQkJaWYgKGNoaWxkID09IHN2ZFsxXS5waWQpIHsKKwkJCQkJc3ZkWzBdLndzdGF0ID0gd3N0YXQ7CisJCQkJCXN2ZFsxXS5waWQgPSAwOworCQkJCQlwaWRjaGFuZ2VkID0gMTsKKwkJCQkJc3ZkWzFdLnN0YXRlID0gU19ET1dOOworCQkJCQlzdmRbMV0uY3RybCAmPSB+Q19URVJNOworCQkJCQlkZWFkbGluZSA9IHN2ZFsxXS5zdGFydC50dl9zZWMgKyAxOworCQkJCQlnZXR0aW1lb2ZkYXlfbnMoJnN2ZFsxXS5zdGFydCk7CisJCQkJCXVwZGF0ZV9zdGF0dXMoJnN2ZFsxXSk7CisJCQkJCWlmIChMRVNTKHN2ZFsxXS5zdGFydC50dl9zZWMsIGRlYWRsaW5lKSkKKwkJCQkJCXNsZWVwKDEpOworCQkJCX0KKwkJCX0KKwkJfSAvKiBmb3IgKDs7KSAqLworCQlpZiAocmVhZChzdmRbMF0uZmRjb250cm9sLCAmY2gsIDEpID09IDEpCisJCQljdHJsKCZzdmRbMF0sIGNoKTsKKwkJaWYgKGhhc2xvZykKKwkJCWlmIChyZWFkKHN2ZFsxXS5mZGNvbnRyb2wsICZjaCwgMSkgPT0gMSkKKwkJCQljdHJsKCZzdmRbMV0sIGNoKTsKKworCQlpZiAoc2lndGVybSkgeworCQkJY3RybCgmc3ZkWzBdLCAneCcpOworCQkJc2lndGVybSA9IDA7CisJCX0KKworCQlpZiAoc3ZkWzBdLnNkX3dhbnQgPT0gV19FWElUICYmIHN2ZFswXS5zdGF0ZSA9PSBTX0RPV04pIHsKKwkJCWlmIChzdmRbMV0ucGlkID09IDApCisJCQkJX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkJCWlmIChzdmRbMV0uc2Rfd2FudCAhPSBXX0VYSVQpIHsKKwkJCQlzdmRbMV0uc2Rfd2FudCA9IFdfRVhJVDsKKwkJCQkvKiBzdG9wc2VydmljZSgmc3ZkWzFdKTsgKi8KKwkJCQl1cGRhdGVfc3RhdHVzKCZzdmRbMV0pOworCQkJCWNsb3NlKGxvZ3BpcGUud3IpOworCQkJCWNsb3NlKGxvZ3BpcGUucmQpOworCQkJfQorCQl9CisJfSAvKiBmb3IgKDs7KSAqLworCS8qIG5vdCByZWFjaGVkICovCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ydW5pdC9ydW5zdmRpci5jIGIvcnVuaXQvcnVuc3ZkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk1YTJhCi0tLSAvZGV2L251bGwKKysrIGIvcnVuaXQvcnVuc3ZkaXIuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBHZXJyaXQgUGFwZQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyogQnVzeWJveGVkIGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+ICovCisvKiBUT0RPOiBkZXBlbmRzIG9uIHJ1bml0X2xpYi5jIC0gcmV2aWV3IGFuZCByZWR1Y2UvZWxpbWluYXRlICovCisKKy8vdXNhZ2U6I2RlZmluZSBydW5zdmRpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1QXSBbLXMgU0NSSVBUXSBESVIiCisvL3VzYWdlOiNkZWZpbmUgcnVuc3ZkaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBhIHJ1bnN2IHByb2Nlc3MgZm9yIGVhY2ggc3ViZGlyZWN0b3J5LiBJZiBpdCBleGl0cywgcmVzdGFydCBpdC5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJCVB1dCBlYWNoIHJ1bnN2IGluIGEgbmV3IHNlc3Npb24iCisvL3VzYWdlOiAgICAgIlxuCS1zIFNDUklQVAlSdW4gU0NSSVBUIDxzaWdubz4gYWZ0ZXIgc2lnbmFsIGlzIHByb2Nlc3NlZCIKKworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ1bml0X2xpYi5oIgorCisjZGVmaW5lIE1BWFNFUlZJQ0VTIDEwMDAKKworLyogU2hvdWxkIGJlIG5vdCBuZWVkZWQgLSBhbGwgZGlycyBhcmUgb24gc2FtZSBGUywgcmlnaHQ/ICovCisjZGVmaW5lIENIRUNLX0RFVk5PX1RPTyAwCisKK3N0cnVjdCBzZXJ2aWNlIHsKKyNpZiBDSEVDS19ERVZOT19UT08KKwlkZXZfdCBkZXY7CisjZW5kaWYKKwlpbm9fdCBpbm87CisJcGlkX3QgcGlkOworCXNtYWxsaW50IGlzZ29uZTsKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3Qgc2VydmljZSAqc3Y7CisJY2hhciAqc3ZkaXI7CisJaW50IHN2bnVtOworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTlNWRElSX0xPRworCWNoYXIgKnJwbG9nOworCWludCBycGxvZ2xlbjsKKwlzdHJ1Y3QgZmRfcGFpciBsb2dwaXBlOworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCXVuc2lnbmVkIHN0YW1wbG9nOworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBzdiAgICAgICAgICAoRy5zdiAgICAgICAgICApCisjZGVmaW5lIHN2ZGlyICAgICAgIChHLnN2ZGlyICAgICAgICkKKyNkZWZpbmUgc3ZudW0gICAgICAgKEcuc3ZudW0gICAgICAgKQorI2RlZmluZSBycGxvZyAgICAgICAoRy5ycGxvZyAgICAgICApCisjZGVmaW5lIHJwbG9nbGVuICAgIChHLnJwbG9nbGVuICAgICkKKyNkZWZpbmUgbG9ncGlwZSAgICAgKEcubG9ncGlwZSAgICAgKQorI2RlZmluZSBwZmQgICAgICAgICAoRy5wZmQgICAgICAgICApCisjZGVmaW5lIHN0YW1wbG9nICAgIChHLnN0YW1wbG9nICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBmYXRhbDJfY2Fubm90KGNvbnN0IGNoYXIgKm0xLCBjb25zdCBjaGFyICptMikKK3sKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBmYXRhbDogY2FuJ3QgJXMlcyIsIHN2ZGlyLCBtMSwgbTIpOworCS8qIHdhcyBleGl0aW5nIDEwMCAqLworfQorc3RhdGljIHZvaWQgd2FybjN4KGNvbnN0IGNoYXIgKm0xLCBjb25zdCBjaGFyICptMiwgY29uc3QgY2hhciAqbTMpCit7CisJYmJfZXJyb3JfbXNnKCIlczogd2FybmluZzogJXMlcyVzIiwgc3ZkaXIsIG0xLCBtMiwgbTMpOworfQorc3RhdGljIHZvaWQgd2FybjJfY2Fubm90KGNvbnN0IGNoYXIgKm0xLCBjb25zdCBjaGFyICptMikKK3sKKwl3YXJuM3goImNhbid0ICIsIG0xLCBtMik7Cit9CisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOU1ZESVJfTE9HCitzdGF0aWMgdm9pZCB3YXJueChjb25zdCBjaGFyICptMSkKK3sKKwl3YXJuM3gobTEsICIiLCAiIik7Cit9CisjZW5kaWYKKworLyogaW5saW5pbmcgKyB2Zm9yayAtPiBiaWdnZXIgY29kZSAqLworc3RhdGljIE5PSU5MSU5FIHBpZF90IHJ1bnN2KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcGlkX3QgcGlkOworCisJLyogSWYgd2UgZ290IHNpZ25hbGVkLCBzdG9wIHNwYXduaW5nIGNoaWxkcmVuIGF0IG9uY2UhICovCisJaWYgKGJiX2dvdF9zaWduYWwpCisJCXJldHVybiAwOworCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IC0xKSB7CisJCXdhcm4yX2Nhbm5vdCgidmZvcmsiLCAiIik7CisJCXJldHVybiAwOworCX0KKwlpZiAocGlkID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiAxKSAvKiAtUCBvcHRpb24/ICovCisJCQlzZXRzaWQoKTsKKy8qIG1hbiBleGVjdjoKKyAqICJTaWduYWxzIHNldCB0byBiZSBjYXVnaHQgYnkgdGhlIGNhbGxpbmcgcHJvY2VzcyBpbWFnZQorICogIHNoYWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCBhY3Rpb24gaW4gdGhlIG5ldyBwcm9jZXNzIGltYWdlLiIKKyAqIFRoZXJlZm9yZSwgd2UgZG8gbm90IG5lZWQgdGhpczogKi8KKyNpZiAwCisJCWJiX3NpZ25hbHMoMAorCQkJfCAoMSA8PCBTSUdIVVApCisJCQl8ICgxIDw8IFNJR1RFUk0pCisJCQksIFNJR19ERkwpOworI2VuZGlmCisJCWV4ZWNscCgicnVuc3YiLCAicnVuc3YiLCBuYW1lLCAoY2hhciAqKSBOVUxMKTsKKwkJZmF0YWwyX2Nhbm5vdCgic3RhcnQgcnVuc3YgIiwgbmFtZSk7CisJfQorCXJldHVybiBwaWQ7Cit9CisKKy8qIGdjYyA0LjMuMCBkb2VzIGJldHRlciB3aXRoIE5PSU5MSU5FICovCitzdGF0aWMgTk9JTkxJTkUgaW50IGRvX3Jlc2Nhbih2b2lkKQoreworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisJaW50IGk7CisJc3RydWN0IHN0YXQgczsKKwlpbnQgbmVlZF9yZXNjYW4gPSAwOworCisJZGlyID0gb3BlbmRpcigiLiIpOworCWlmICghZGlyKSB7CisJCXdhcm4yX2Nhbm5vdCgib3BlbiBkaXJlY3RvcnkgIiwgc3ZkaXIpOworCQlyZXR1cm4gMTsgLyogbmVlZCB0byByZXNjYW4gYWdhaW4gc29vbiAqLworCX0KKwlmb3IgKGkgPSAwOyBpIDwgc3ZudW07IGkrKykKKwkJc3ZbaV0uaXNnb25lID0gMTsKKworCXdoaWxlICgxKSB7CisJCWVycm5vID0gMDsKKwkJZCA9IHJlYWRkaXIoZGlyKTsKKwkJaWYgKCFkKQorCQkJYnJlYWs7CisJCWlmIChkLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJY29udGludWU7CisJCWlmIChzdGF0KGQtPmRfbmFtZSwgJnMpID09IC0xKSB7CisJCQl3YXJuMl9jYW5ub3QoInN0YXQgIiwgZC0+ZF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghU19JU0RJUihzLnN0X21vZGUpKQorCQkJY29udGludWU7CisJCS8qIERvIHdlIGhhdmUgdGhpcyBzZXJ2aWNlIGxpc3RlZCBhbHJlYWR5PyAqLworCQlmb3IgKGkgPSAwOyBpIDwgc3ZudW07IGkrKykgeworCQkJaWYgKChzdltpXS5pbm8gPT0gcy5zdF9pbm8pCisjaWYgQ0hFQ0tfREVWTk9fVE9PCisJCQkgJiYgKHN2W2ldLmRldiA9PSBzLnN0X2RldikKKyNlbmRpZgorCQkJKSB7CisJCQkJaWYgKHN2W2ldLnBpZCA9PSAwKSAvKiByZXN0YXJ0IGlmIGl0IGhhcyBkaWVkICovCisJCQkJCWdvdG8gcnVuX2l0aF9zdjsKKwkJCQlzdltpXS5pc2dvbmUgPSAwOyAvKiAid2Ugc3RpbGwgc2VlIHlvdSIgKi8KKwkJCQlnb3RvIG5leHRfZGVudHJ5OworCQkJfQorCQl9CisJCXsgLyogTm90IGZvdW5kLCBtYWtlIG5ldyBzZXJ2aWNlICovCisJCQlzdHJ1Y3Qgc2VydmljZSAqc3ZuZXcgPSByZWFsbG9jKHN2LCAoaSsxKSAqIHNpemVvZigqc3YpKTsKKwkJCWlmICghc3ZuZXcpIHsKKwkJCQl3YXJuMl9jYW5ub3QoInN0YXJ0IHJ1bnN2ICIsIGQtPmRfbmFtZSk7CisJCQkJbmVlZF9yZXNjYW4gPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3YgPSBzdm5ldzsKKwkJCXN2bnVtKys7CisjaWYgQ0hFQ0tfREVWTk9fVE9PCisJCQlzdltpXS5kZXYgPSBzLnN0X2RldjsKKyNlbmRpZgorCQkJc3ZbaV0uaW5vID0gcy5zdF9pbm87CisgcnVuX2l0aF9zdjoKKwkJCXN2W2ldLnBpZCA9IHJ1bnN2KGQtPmRfbmFtZSk7CisJCQlzdltpXS5pc2dvbmUgPSAwOworCQl9CisgbmV4dF9kZW50cnk6IDsKKwl9CisJaSA9IGVycm5vOworCWNsb3NlZGlyKGRpcik7CisJaWYgKGkpIHsgLyogcmVhZGRpciBmYWlsZWQgKi8KKwkJd2FybjJfY2Fubm90KCJyZWFkIGRpcmVjdG9yeSAiLCBzdmRpcik7CisJCXJldHVybiAxOyAvKiBuZWVkIHRvIHJlc2NhbiBhZ2FpbiBzb29uICovCisJfQorCisJLyogU2VuZCBTSUdURVJNIHRvIHJ1bnN2IHdob3NlIGRpcmVjdG9yaWVzCisJICogd2VyZSBubyBsb25nZXIgZm91bmQgKC0+IG11c3QgaGF2ZSBiZWVuIHJlbW92ZWQpICovCisJZm9yIChpID0gMDsgaSA8IHN2bnVtOyBpKyspIHsKKwkJaWYgKCFzdltpXS5pc2dvbmUpCisJCQljb250aW51ZTsKKwkJaWYgKHN2W2ldLnBpZCkKKwkJCWtpbGwoc3ZbaV0ucGlkLCBTSUdURVJNKTsKKwkJc3ZudW0tLTsKKwkJc3ZbaV0gPSBzdltzdm51bV07CisJCWktLTsgLyogc28gdGhhdCB3ZSBkb24ndCBza2lwIG5ldyBzdltpXSAoYnVnIHdhcyBoZXJlISkgKi8KKwl9CisJcmV0dXJuIG5lZWRfcmVzY2FuOworfQorCitpbnQgcnVuc3ZkaXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJ1bnN2ZGlyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCWRldl90IGxhc3RfZGV2ID0gbGFzdF9kZXY7IC8qIGZvciBnY2MgKi8KKwlpbm9fdCBsYXN0X2lubyA9IGxhc3RfaW5vOyAvKiBmb3IgZ2NjICovCisJdGltZV90IGxhc3RfbXRpbWUgPSAwOworCWludCB3c3RhdDsKKwlpbnQgY3VyZGlyOworCXBpZF90IHBpZDsKKwl1bnNpZ25lZCBkZWFkbGluZTsKKwl1bnNpZ25lZCBub3c7CisJdW5zaWduZWQgc3RhbXBjaGVjazsKKwlpbnQgaTsKKwlpbnQgbmVlZF9yZXNjYW4gPSAxOworCWNoYXIgKm9wdF9zX2FyZ3ZbM107CisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsKKwlvcHRfc19hcmd2WzBdID0gTlVMTDsKKwlvcHRfc19hcmd2WzJdID0gTlVMTDsKKwlnZXRvcHQzMihhcmd2LCAiUHM6IiwgJm9wdF9zX2FyZ3ZbMF0pOworCWFyZ3YgKz0gb3B0aW5kOworCisJYmJfc2lnbmFscygwCisJCXwgKDEgPDwgU0lHVEVSTSkKKwkJfCAoMSA8PCBTSUdIVVApCisJCS8qIEZvciBidXN5Ym94J3MgaW5pdCwgU0lHVEVSTSA9PSByZWJvb3QsCisJCSAqIFNJR1VTUjEgPT0gaGFsdAorCQkgKiBTSUdVU1IyID09IHBvd2Vyb2ZmCisJCSAqIHNvIHdlIG5lZWQgdG8gaW50ZXJjZXB0IFNJR1VTUm4gdG9vLgorCQkgKiBOb3RlIHRoYXQgd2UgZG8gbm90IGltcGxlbWVudCBhY3R1YWwgcmVib290CisJCSAqIChraWxsYWxsKFRFUk0pICsgdW1vdW50LCBldGMpLCB3ZSBqdXN0IHBhdXNlCisJCSAqIHJlc3Bhd2luZyBhbmQgYXZvaWQgZXhpdGluZyAoLT4gbWFraW5nIGtlcm5lbCBvb3BzKS4KKwkJICogVGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSByZXN0LiAqLworCQl8IChnZXRwaWQoKSA9PSAxID8gKCgxIDw8IFNJR1VTUjEpIHwgKDEgPDwgU0lHVVNSMikpIDogMCkKKwkJLCByZWNvcmRfc2lnbm8pOworCXN2ZGlyID0gKmFyZ3YrKzsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTlNWRElSX0xPRworCS8qIHNldHVwIGxvZyAqLworCWlmICgqYXJndikgeworCQlycGxvZyA9ICphcmd2OworCQlycGxvZ2xlbiA9IHN0cmxlbihycGxvZyk7CisJCWlmIChycGxvZ2xlbiA8IDcpIHsKKwkJCXdhcm54KCJsb2cgbXVzdCBoYXZlIGF0IGxlYXN0IHNldmVuIGNoYXJhY3RlcnMiKTsKKwkJfSBlbHNlIGlmIChwaXBlZF9wYWlyKGxvZ3BpcGUpKSB7CisJCQl3YXJueCgiY2FuJ3QgY3JlYXRlIHBpcGUgZm9yIGxvZyIpOworCQl9IGVsc2UgeworCQkJY2xvc2Vfb25fZXhlY19vbihsb2dwaXBlLnJkKTsKKwkJCWNsb3NlX29uX2V4ZWNfb24obG9ncGlwZS53cik7CisJCQluZGVsYXlfb24obG9ncGlwZS5yZCk7CisJCQluZGVsYXlfb24obG9ncGlwZS53cik7CisJCQlpZiAoZHVwMihsb2dwaXBlLndyLCAyKSA9PSAtMSkgeworCQkJCXdhcm54KCJjYW4ndCBzZXQgZmlsZWRlc2NyaXB0b3IgZm9yIGxvZyIpOworCQkJfSBlbHNlIHsKKwkJCQlwZmRbMF0uZmQgPSBsb2dwaXBlLnJkOworCQkJCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJCQkJc3RhbXBsb2cgPSBtb25vdG9uaWNfc2VjKCk7CisJCQkJZ290byBydW47CisJCQl9CisJCX0KKwkJcnBsb2cgPSBOVUxMOworCQl3YXJueCgibG9nIHNlcnZpY2UgZGlzYWJsZWQiKTsKKwl9CisgcnVuOgorI2VuZGlmCisJY3VyZGlyID0gb3BlbigiLiIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwlpZiAoY3VyZGlyID09IC0xKQorCQlmYXRhbDJfY2Fubm90KCJvcGVuIGN1cnJlbnQgZGlyZWN0b3J5IiwgIiIpOworCWNsb3NlX29uX2V4ZWNfb24oY3VyZGlyKTsKKworCXN0YW1wY2hlY2sgPSBtb25vdG9uaWNfc2VjKCk7CisKKwlmb3IgKDs7KSB7CisJCS8qIGNvbGxlY3QgY2hpbGRyZW4gKi8KKwkJZm9yICg7OykgeworCQkJcGlkID0gd2FpdF9hbnlfbm9oYW5nKCZ3c3RhdCk7CisJCQlpZiAocGlkIDw9IDApCisJCQkJYnJlYWs7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3ZudW07IGkrKykgeworCQkJCWlmIChwaWQgPT0gc3ZbaV0ucGlkKSB7CisJCQkJCS8qIHJ1bnN2IGhhcyBkaWVkICovCisJCQkJCXN2W2ldLnBpZCA9IDA7CisJCQkJCW5lZWRfcmVzY2FuID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlub3cgPSBtb25vdG9uaWNfc2VjKCk7CisJCWlmICgoaW50KShub3cgLSBzdGFtcGNoZWNrKSA+PSAwKSB7CisJCQkvKiB3YWl0IGF0IGxlYXN0IGEgc2Vjb25kICovCisJCQlzdGFtcGNoZWNrID0gbm93ICsgMTsKKworCQkJaWYgKHN0YXQoc3ZkaXIsICZzKSAhPSAtMSkgeworCQkJCWlmIChuZWVkX3Jlc2NhbiB8fCBzLnN0X210aW1lICE9IGxhc3RfbXRpbWUKKwkJCQkgfHwgcy5zdF9pbm8gIT0gbGFzdF9pbm8gfHwgcy5zdF9kZXYgIT0gbGFzdF9kZXYKKwkJCQkpIHsKKwkJCQkJLyogc3ZkaXIgbW9kaWZpZWQgKi8KKwkJCQkJaWYgKGNoZGlyKHN2ZGlyKSAhPSAtMSkgeworCQkJCQkJbGFzdF9tdGltZSA9IHMuc3RfbXRpbWU7CisJCQkJCQlsYXN0X2RldiA9IHMuc3RfZGV2OworCQkJCQkJbGFzdF9pbm8gPSBzLnN0X2lubzsKKwkJCQkJCS8qIGlmIHRoZSBzdmRpciBjaGFuZ2VkIHRoaXMgdmVyeSBzZWNvbmQsIHdhaXQgdW50aWwgdGhlCisJCQkJCQkgKiBuZXh0IHNlY29uZCwgYmVjYXVzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCBtb3JlCisJCQkJCQkgKiBjaGFuZ2VzIHdpdGhpbiB0aGlzIHNlY29uZCAqLworCQkJCQkJd2hpbGUgKHRpbWUoTlVMTCkgPT0gbGFzdF9tdGltZSkKKwkJCQkJCQl1c2xlZXAoMTAwMDAwKTsKKwkJCQkJCW5lZWRfcmVzY2FuID0gZG9fcmVzY2FuKCk7CisJCQkJCQl3aGlsZSAoZmNoZGlyKGN1cmRpcikgPT0gLTEpIHsKKwkJCQkJCQl3YXJuMl9jYW5ub3QoImNoYW5nZSBkaXJlY3RvcnksIHBhdXNpbmciLCAiIik7CisJCQkJCQkJc2xlZXAoNSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQl3YXJuMl9jYW5ub3QoImNoYW5nZSBkaXJlY3RvcnkgdG8gIiwgc3ZkaXIpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl3YXJuMl9jYW5ub3QoInN0YXQgIiwgc3ZkaXIpOworCQkJfQorCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKKwkJaWYgKHJwbG9nKSB7CisJCQlpZiAoKGludCkobm93IC0gc3RhbXBsb2cpID49IDApIHsKKwkJCQl3cml0ZShsb2dwaXBlLndyLCAiLiIsIDEpOworCQkJCXN0YW1wbG9nID0gbm93ICsgOTAwOworCQkJfQorCQl9CisJCXBmZFswXS5yZXZlbnRzID0gMDsKKyNlbmRpZgorCQlkZWFkbGluZSA9IChuZWVkX3Jlc2NhbiA/IDEgOiA1KTsKKwkJc2lnX2Jsb2NrKFNJR0NITEQpOworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTlNWRElSX0xPRworCQlpZiAocnBsb2cpCisJCQlwb2xsKHBmZCwgMSwgZGVhZGxpbmUqMTAwMCk7CisJCWVsc2UKKyNlbmRpZgorCQkJc2xlZXAoZGVhZGxpbmUpOworCQlzaWdfdW5ibG9jayhTSUdDSExEKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTlNWRElSX0xPRworCQlpZiAocGZkWzBdLnJldmVudHMgJiBQT0xMSU4pIHsKKwkJCWNoYXIgY2g7CisJCQl3aGlsZSAocmVhZChsb2dwaXBlLnJkLCAmY2gsIDEpID4gMCkgeworCQkJCWlmIChjaCA8ICcgJykKKwkJCQkJY2ggPSAnICc7CisJCQkJZm9yIChpID0gNjsgaSA8IHJwbG9nbGVuOyBpKyspCisJCQkJCXJwbG9nW2ktMV0gPSBycGxvZ1tpXTsKKwkJCQlycGxvZ1tycGxvZ2xlbi0xXSA9IGNoOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKCFiYl9nb3Rfc2lnbmFsKQorCQkJY29udGludWU7CisKKwkJLyogLXMgU0NSSVBUOiB1c2VmdWwgaWYgd2UgYXJlIGluaXQuCisJCSAqIEluIHRoaXMgY2FzZSB0eXBpY2FsbHkgc2NyaXB0IG5ldmVyIHJldHVybnMsCisJCSAqIGl0IGhhbHRzL3Bvd2VycyBvZmYvcmVib290cyB0aGUgc3lzdGVtLiAqLworCQlpZiAob3B0X3NfYXJndlswXSkgeworCQkJLyogU2luZ2xlIHBhcmFtZXRlcjogc2lnbmFsIyAqLworCQkJb3B0X3NfYXJndlsxXSA9IHV0b2EoYmJfZ290X3NpZ25hbCk7CisJCQlwaWQgPSBzcGF3bihvcHRfc19hcmd2KTsKKwkJCWlmIChwaWQgPiAwKSB7CisJCQkJLyogUmVtZW1iZXJpbmcgdG8gd2FpdCBmb3IgX2FueV8gY2hpbGRyZW4sCisJCQkJICogbm90IGp1c3QgcGlkICovCisJCQkJd2hpbGUgKHdhaXQoTlVMTCkgIT0gcGlkKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmIChiYl9nb3Rfc2lnbmFsID09IFNJR0hVUCkgeworCQkJZm9yIChpID0gMDsgaSA8IHN2bnVtOyBpKyspCisJCQkJaWYgKHN2W2ldLnBpZCkKKwkJCQkJa2lsbChzdltpXS5waWQsIFNJR1RFUk0pOworCQl9CisJCS8qIFNJR0hVUCBvciBTSUdURVJNIChvciBTSUdVU1JuIGlmIHdlIGFyZSBpbml0KSAqLworCQkvKiBFeGl0IHVubGVzcyB3ZSBhcmUgaW5pdCAqLworCQlpZiAoZ2V0cGlkKCkgIT0gMSkKKwkJCXJldHVybiAoU0lHSFVQID09IGJiX2dvdF9zaWduYWwpID8gMTExIDogRVhJVF9TVUNDRVNTOworCisJCS8qIGluaXQgY29udGludWVzIHRvIG1vbml0b3Igc2VydmljZXMgZm9yZXZlciAqLworCQliYl9nb3Rfc2lnbmFsID0gMDsKKwl9IC8qIGZvciAoOzspICovCit9CmRpZmYgLS1naXQgYS9ydW5pdC9zdi5jIGIvcnVuaXQvc3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjAxYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvcnVuaXQvc3YuYwpAQCAtMCwwICsxLDYxOCBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBHZXJyaXQgUGFwZQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyogVGFrZW4gZnJvbSBodHRwOi8vc21hcmRlbi5zdW5zaXRlLmRrL3J1bml0L3N2LjguaHRtbDoKKworc3YgLSBjb250cm9sIGFuZCBtYW5hZ2Ugc2VydmljZXMgbW9uaXRvcmVkIGJ5IHJ1bnN2CisKK3N2IFstdl0gWy13IHNlY10gY29tbWFuZCBzZXJ2aWNlcworL2V0Yy9pbml0LmQvc2VydmljZSBbLXcgc2VjXSBjb21tYW5kCisKK1RoZSBzdiBwcm9ncmFtIHJlcG9ydHMgdGhlIGN1cnJlbnQgc3RhdHVzIGFuZCBjb250cm9scyB0aGUgc3RhdGUgb2Ygc2VydmljZXMKK21vbml0b3JlZCBieSB0aGUgcnVuc3YoOCkgc3VwZXJ2aXNvci4KKworc2VydmljZXMgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgYXJndW1lbnRzLCBlYWNoIGFyZ3VtZW50IG5hbWluZyBhIGRpcmVjdG9yeQorc2VydmljZSB1c2VkIGJ5IHJ1bnN2KDgpLiBJZiBzZXJ2aWNlIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRvdCBvciBzbGFzaCwKK2l0IGlzIHNlYXJjaGVkIGluIHRoZSBkZWZhdWx0IHNlcnZpY2VzIGRpcmVjdG9yeSAvdmFyL3NlcnZpY2UvLCBvdGhlcndpc2UKK3JlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworY29tbWFuZCBpcyBvbmUgb2YgdXAsIGRvd24sIHN0YXR1cywgb25jZSwgcGF1c2UsIGNvbnQsIGh1cCwgYWxhcm0sIGludGVycnVwdCwKKzEsIDIsIHRlcm0sIGtpbGwsIG9yIGV4aXQsIG9yIHN0YXJ0LCBzdG9wLCByZXN0YXJ0LCBzaHV0ZG93biwgZm9yY2Utc3RvcCwKK2ZvcmNlLXJlbG9hZCwgZm9yY2UtcmVzdGFydCwgZm9yY2Utc2h1dGRvd24uCisKK1RoZSBzdiBwcm9ncmFtIGNhbiBiZSBzeW0tbGlua2VkIHRvIC9ldGMvaW5pdC5kLyB0byBwcm92aWRlIGFuIExTQiBpbml0CitzY3JpcHQgaW50ZXJmYWNlLiBUaGUgc2VydmljZSB0byBiZSBjb250cm9sbGVkIHRoZW4gaXMgc3BlY2lmaWVkIGJ5IHRoZQorYmFzZSBuYW1lIG9mIHRoZSAiaW5pdCBzY3JpcHQiLgorCitzdGF0dXMKKyAgICBSZXBvcnQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBzZXJ2aWNlLCBhbmQgdGhlIGFwcGVuZGFudCBsb2cgc2VydmljZQorICAgIGlmIGF2YWlsYWJsZSwgdG8gc3RhbmRhcmQgb3V0cHV0LgordXAKKyAgICBJZiB0aGUgc2VydmljZSBpcyBub3QgcnVubmluZywgc3RhcnQgaXQuIElmIHRoZSBzZXJ2aWNlIHN0b3BzLCByZXN0YXJ0IGl0LgorZG93bgorICAgIElmIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcsIHNlbmQgaXQgdGhlIFRFUk0gc2lnbmFsLCBhbmQgdGhlIENPTlQgc2lnbmFsLgorICAgIElmIC4vcnVuIGV4aXRzLCBzdGFydCAuL2ZpbmlzaCBpZiBpdCBleGlzdHMuIEFmdGVyIGl0IHN0b3BzLCBkbyBub3QKKyAgICByZXN0YXJ0IHNlcnZpY2UuCitvbmNlCisgICAgSWYgdGhlIHNlcnZpY2UgaXMgbm90IHJ1bm5pbmcsIHN0YXJ0IGl0LiBEbyBub3QgcmVzdGFydCBpdCBpZiBpdCBzdG9wcy4KK3BhdXNlIGNvbnQgaHVwIGFsYXJtIGludGVycnVwdCBxdWl0IDEgMiB0ZXJtIGtpbGwKKyAgICBJZiB0aGUgc2VydmljZSBpcyBydW5uaW5nLCBzZW5kIGl0IHRoZSBTVE9QLCBDT05ULCBIVVAsIEFMUk0sIElOVCwgUVVJVCwKKyAgICBVU1IxLCBVU1IyLCBURVJNLCBvciBLSUxMIHNpZ25hbCByZXNwZWN0aXZlbHkuCitleGl0CisgICAgSWYgdGhlIHNlcnZpY2UgaXMgcnVubmluZywgc2VuZCBpdCB0aGUgVEVSTSBzaWduYWwsIGFuZCB0aGUgQ09OVCBzaWduYWwuCisgICAgRG8gbm90IHJlc3RhcnQgdGhlIHNlcnZpY2UuIElmIHRoZSBzZXJ2aWNlIGlzIGRvd24sIGFuZCBubyBsb2cgc2VydmljZQorICAgIGV4aXN0cywgcnVuc3YoOCkgZXhpdHMuIElmIHRoZSBzZXJ2aWNlIGlzIGRvd24gYW5kIGEgbG9nIHNlcnZpY2UgZXhpc3RzLAorICAgIHNlbmQgdGhlIFRFUk0gc2lnbmFsIHRvIHRoZSBsb2cgc2VydmljZS4gSWYgdGhlIGxvZyBzZXJ2aWNlIGlzIGRvd24sCisgICAgcnVuc3YoOCkgZXhpdHMuIFRoaXMgY29tbWFuZCBpcyBpZ25vcmVkIGlmIGl0IGlzIGdpdmVuIHRvIGFuIGFwcGVuZGFudAorICAgIGxvZyBzZXJ2aWNlLgorCitzdiBhY3R1YWxseSBsb29rcyBvbmx5IGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYWJvdmUgY29tbWFuZHMuCisKK0NvbW1hbmRzIGNvbXBhdGlibGUgdG8gTFNCIGluaXQgc2NyaXB0IGFjdGlvbnM6CisKK3N0YXR1cworICAgIFNhbWUgYXMgc3RhdHVzLgorc3RhcnQKKyAgICBTYW1lIGFzIHVwLCBidXQgd2FpdCB1cCB0byA3IHNlY29uZHMgZm9yIHRoZSBjb21tYW5kIHRvIHRha2UgZWZmZWN0LgorICAgIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMgb3IgdGltZW91dC4gSWYgdGhlIHNjcmlwdCAuL2NoZWNrIGV4aXN0cyBpbgorICAgIHRoZSBzZXJ2aWNlIGRpcmVjdG9yeSwgc3YgcnVucyB0aGlzIHNjcmlwdCB0byBjaGVjayB3aGV0aGVyIHRoZSBzZXJ2aWNlCisgICAgaXMgdXAgYW5kIGF2YWlsYWJsZTsgaXQncyBjb25zaWRlcmVkIHRvIGJlIGF2YWlsYWJsZSBpZiAuL2NoZWNrIGV4aXRzCisgICAgd2l0aCAwLgorc3RvcAorICAgIFNhbWUgYXMgZG93biwgYnV0IHdhaXQgdXAgdG8gNyBzZWNvbmRzIGZvciB0aGUgc2VydmljZSB0byBiZWNvbWUgZG93bi4KKyAgICBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzIG9yIHRpbWVvdXQuCityZXN0YXJ0CisgICAgU2VuZCB0aGUgY29tbWFuZHMgdGVybSwgY29udCwgYW5kIHVwIHRvIHRoZSBzZXJ2aWNlLCBhbmQgd2FpdCB1cCB0bworICAgIDcgc2Vjb25kcyBmb3IgdGhlIHNlcnZpY2UgdG8gcmVzdGFydC4gVGhlbiByZXBvcnQgdGhlIHN0YXR1cyBvciB0aW1lb3V0LgorICAgIElmIHRoZSBzY3JpcHQgLi9jaGVjayBleGlzdHMgaW4gdGhlIHNlcnZpY2UgZGlyZWN0b3J5LCBzdiBydW5zIHRoaXMgc2NyaXB0CisgICAgdG8gY2hlY2sgd2hldGhlciB0aGUgc2VydmljZSBpcyB1cCBhbmQgYXZhaWxhYmxlIGFnYWluOyBpdCdzIGNvbnNpZGVyZWQKKyAgICB0byBiZSBhdmFpbGFibGUgaWYgLi9jaGVjayBleGl0cyB3aXRoIDAuCitzaHV0ZG93bgorICAgIFNhbWUgYXMgZXhpdCwgYnV0IHdhaXQgdXAgdG8gNyBzZWNvbmRzIGZvciB0aGUgcnVuc3YoOCkgcHJvY2VzcworICAgIHRvIHRlcm1pbmF0ZS4gVGhlbiByZXBvcnQgdGhlIHN0YXR1cyBvciB0aW1lb3V0LgorZm9yY2Utc3RvcAorICAgIFNhbWUgYXMgZG93biwgYnV0IHdhaXQgdXAgdG8gNyBzZWNvbmRzIGZvciB0aGUgc2VydmljZSB0byBiZWNvbWUgZG93bi4KKyAgICBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzLCBhbmQgb24gdGltZW91dCBzZW5kIHRoZSBzZXJ2aWNlIHRoZSBraWxsIGNvbW1hbmQuCitmb3JjZS1yZWxvYWQKKyAgICBTZW5kIHRoZSBzZXJ2aWNlIHRoZSB0ZXJtIGFuZCBjb250IGNvbW1hbmRzLCBhbmQgd2FpdCB1cCB0bworICAgIDcgc2Vjb25kcyBmb3IgdGhlIHNlcnZpY2UgdG8gcmVzdGFydC4gVGhlbiByZXBvcnQgdGhlIHN0YXR1cywKKyAgICBhbmQgb24gdGltZW91dCBzZW5kIHRoZSBzZXJ2aWNlIHRoZSBraWxsIGNvbW1hbmQuCitmb3JjZS1yZXN0YXJ0CisgICAgU2VuZCB0aGUgc2VydmljZSB0aGUgdGVybSwgY29udCBhbmQgdXAgY29tbWFuZHMsIGFuZCB3YWl0IHVwIHRvCisgICAgNyBzZWNvbmRzIGZvciB0aGUgc2VydmljZSB0byByZXN0YXJ0LiBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzLCBhbmQKKyAgICBvbiB0aW1lb3V0IHNlbmQgdGhlIHNlcnZpY2UgdGhlIGtpbGwgY29tbWFuZC4gSWYgdGhlIHNjcmlwdCAuL2NoZWNrCisgICAgZXhpc3RzIGluIHRoZSBzZXJ2aWNlIGRpcmVjdG9yeSwgc3YgcnVucyB0aGlzIHNjcmlwdCB0byBjaGVjayB3aGV0aGVyCisgICAgdGhlIHNlcnZpY2UgaXMgdXAgYW5kIGF2YWlsYWJsZSBhZ2FpbjsgaXQncyBjb25zaWRlcmVkIHRvIGJlIGF2YWlsYWJsZQorICAgIGlmIC4vY2hlY2sgZXhpdHMgd2l0aCAwLgorZm9yY2Utc2h1dGRvd24KKyAgICBTYW1lIGFzIGV4aXQsIGJ1dCB3YWl0IHVwIHRvIDcgc2Vjb25kcyBmb3IgdGhlIHJ1bnN2KDgpIHByb2Nlc3MgdG8KKyAgICB0ZXJtaW5hdGUuIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMsIGFuZCBvbiB0aW1lb3V0IHNlbmQgdGhlIHNlcnZpY2UKKyAgICB0aGUga2lsbCBjb21tYW5kLgorCitBZGRpdGlvbmFsIENvbW1hbmRzCisKK2NoZWNrCisgICAgQ2hlY2sgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIGluIHRoZSBzdGF0ZSB0aGF0J3MgYmVlbiByZXF1ZXN0ZWQuIFdhaXQgdXAgdG8KKyAgICA3IHNlY29uZHMgZm9yIHRoZSBzZXJ2aWNlIHRvIHJlYWNoIHRoZSByZXF1ZXN0ZWQgc3RhdGUsIHRoZW4gcmVwb3J0CisgICAgdGhlIHN0YXR1cyBvciB0aW1lb3V0LiBJZiB0aGUgcmVxdWVzdGVkIHN0YXRlIG9mIHRoZSBzZXJ2aWNlIGlzIHVwLAorICAgIGFuZCB0aGUgc2NyaXB0IC4vY2hlY2sgZXhpc3RzIGluIHRoZSBzZXJ2aWNlIGRpcmVjdG9yeSwgc3YgcnVucworICAgIHRoaXMgc2NyaXB0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlcnZpY2UgaXMgdXAgYW5kIHJ1bm5pbmc7CisgICAgaXQncyBjb25zaWRlcmVkIHRvIGJlIHVwIGlmIC4vY2hlY2sgZXhpdHMgd2l0aCAwLgorCitPcHRpb25zCisKKy12CisgICAgd2FpdCB1cCB0byA3IHNlY29uZHMgZm9yIHRoZSBjb21tYW5kIHRvIHRha2UgZWZmZWN0LgorICAgIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMgb3IgdGltZW91dC4KKy13IHNlYworICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHRpbWVvdXQgb2YgNyBzZWNvbmRzIHdpdGggc2VjIHNlY29uZHMuIEltcGxpZXMgLXYuCisKK0Vudmlyb25tZW50CisKK1NWRElSCisgICAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICRTVkRJUiBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2VydmljZXMgZGlyZWN0b3J5CisgICAgL3Zhci9zZXJ2aWNlLgorU1ZXQUlUCisgICAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICRTVldBSVQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IDcgc2Vjb25kcyB0byB3YWl0CisgICAgZm9yIGEgY29tbWFuZCB0byB0YWtlIGVmZmVjdC4gSXQgaXMgb3ZlcnJpZGRlbiBieSB0aGUgLXcgb3B0aW9uLgorCitFeGl0IENvZGVzCisgICAgc3YgZXhpdHMgMCwgaWYgdGhlIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFsbCBzZXJ2aWNlcywgYW5kLAorICAgIGlmIGl0IHdhcyB0b2xkIHRvIHdhaXQsIHRoZSBjb21tYW5kIGhhcyB0YWtlbiBlZmZlY3QgdG8gYWxsIHNlcnZpY2VzLgorCisgICAgRm9yIGVhY2ggc2VydmljZSB0aGF0IGNhdXNlZCBhbiBlcnJvciAoZS5nLiB0aGUgZGlyZWN0b3J5IGlzIG5vdAorICAgIGNvbnRyb2xsZWQgYnkgYSBydW5zdig4KSBwcm9jZXNzLCBvciBzdiB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyksCisgICAgc3YgaW5jcmVhc2VzIHRoZSBleGl0IGNvZGUgYnkgb25lIGFuZCBleGl0cyBub24gemVyby4gVGhlIG1heGltdW0KKyAgICBpcyA5OS4gc3YgZXhpdHMgMTAwIG9uIGVycm9yLgorKi8KKworLyogQnVzeWJveGVkIGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+ICovCisvKiBUT0RPOiBkZXBlbmRzIG9uIHJ1bml0X2xpYi5jIC0gcmV2aWV3IGFuZCByZWR1Y2UvZWxpbWluYXRlICovCisKKy8vdXNhZ2U6I2RlZmluZSBzdl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12XSBbLXcgU0VDXSBDTUQgU0VSVklDRV9ESVIuLi4iCisvL3VzYWdlOiNkZWZpbmUgc3ZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb250cm9sIHNlcnZpY2VzIG1vbml0b3JlZCBieSBydW5zdiBzdXBlcnZpc29yLlxuIgorLy91c2FnZTogICAgICAgIkNvbW1hbmRzIChvbmx5IGZpcnN0IGNoYXJhY3RlciBpcyBlbm91Z2gpOlxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgInN0YXR1czogcXVlcnkgc2VydmljZSBzdGF0dXNcbiIKKy8vdXNhZ2U6ICAgICAgICJ1cDogaWYgc2VydmljZSBpc24ndCBydW5uaW5nLCBzdGFydCBpdC4gSWYgc2VydmljZSBzdG9wcywgcmVzdGFydCBpdFxuIgorLy91c2FnZTogICAgICAgIm9uY2U6IGxpa2UgJ3VwJywgYnV0IGlmIHNlcnZpY2Ugc3RvcHMsIGRvbid0IHJlc3RhcnQgaXRcbiIKKy8vdXNhZ2U6ICAgICAgICJkb3duOiBzZW5kIFRFUk0gYW5kIENPTlQgc2lnbmFscy4gSWYgLi9ydW4gZXhpdHMsIHN0YXJ0IC4vZmluaXNoXG4iCisvL3VzYWdlOiAgICAgICAiCWlmIGl0IGV4aXN0cy4gQWZ0ZXIgaXQgc3RvcHMsIGRvbid0IHJlc3RhcnQgc2VydmljZVxuIgorLy91c2FnZTogICAgICAgImV4aXQ6IHNlbmQgVEVSTSBhbmQgQ09OVCBzaWduYWxzIHRvIHNlcnZpY2UgYW5kIGxvZyBzZXJ2aWNlLiBJZiB0aGV5IGV4aXQsXG4iCisvL3VzYWdlOiAgICAgICAiCXJ1bnN2IGV4aXRzIHRvb1xuIgorLy91c2FnZTogICAgICAgInBhdXNlLCBjb250LCBodXAsIGFsYXJtLCBpbnRlcnJ1cHQsIHF1aXQsIDEsIDIsIHRlcm0sIGtpbGw6IHNlbmRcbiIKKy8vdXNhZ2U6ICAgICAgICJTVE9QLCBDT05ULCBIVVAsIEFMUk0sIElOVCwgUVVJVCwgVVNSMSwgVVNSMiwgVEVSTSwgS0lMTCBzaWduYWwgdG8gc2VydmljZSIKKworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ1bml0X2xpYi5oIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJY29uc3QgY2hhciAqYWN0czsKKwljaGFyICoqc2VydmljZTsKKwl1bnNpZ25lZCByYzsKKy8qICJCZXJuc3RlaW4iIHRpbWUgZm9ybWF0OiB1bml4ICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMICovCisJdWludDY0X3QgdHN0YXJ0LCB0bm93OworCXN2c3RhdHVzX3Qgc3ZzdGF0dXM7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBhY3RzICAgICAgICAgKEcuYWN0cyAgICAgICAgKQorI2RlZmluZSBzZXJ2aWNlICAgICAgKEcuc2VydmljZSAgICAgKQorI2RlZmluZSByYyAgICAgICAgICAgKEcucmMgICAgICAgICAgKQorI2RlZmluZSB0c3RhcnQgICAgICAgKEcudHN0YXJ0ICAgICAgKQorI2RlZmluZSB0bm93ICAgICAgICAgKEcudG5vdyAgICAgICAgKQorI2RlZmluZSBzdnN0YXR1cyAgICAgKEcuc3ZzdGF0dXMgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKworI2RlZmluZSBzdHJfZXF1YWwocyx0KSAoIXN0cmNtcCgocyksICh0KSkpCisKKworc3RhdGljIHZvaWQgZmF0YWxfY2Fubm90KGNvbnN0IGNoYXIgKm0xKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGZhdGFsX2Nhbm5vdChjb25zdCBjaGFyICptMSkKK3sKKwliYl9wZXJyb3JfbXNnKCJmYXRhbDogY2FuJ3QgJXMiLCBtMSk7CisJX2V4aXQoMTUxKTsKK30KKworc3RhdGljIHZvaWQgb3V0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKm0xKQoreworCXByaW50ZigiJXMlczogJXMiLCBwLCAqc2VydmljZSwgbTEpOworCWlmIChlcnJubykgeworCQlwcmludGYoIjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOyAvKiB3aWxsIGFsc28gZmx1c2ggdGhlIG91dHB1dCAqLworfQorCisjZGVmaW5lIFdBUk4gICAgIndhcm5pbmc6ICIKKyNkZWZpbmUgT0sgICAgICAib2s6ICIKKworc3RhdGljIHZvaWQgZmFpbChjb25zdCBjaGFyICptMSkKK3sKKwkrK3JjOworCW91dCgiZmFpbDogIiwgbTEpOworfQorc3RhdGljIHZvaWQgZmFpbHgoY29uc3QgY2hhciAqbTEpCit7CisJZXJybm8gPSAwOworCWZhaWwobTEpOworfQorc3RhdGljIHZvaWQgd2Fybihjb25zdCBjaGFyICptMSkKK3sKKwkrK3JjOworCS8qICJ3YXJuaW5nOiA8c2VydmljZT46IDxtMT5cbiIgKi8KKwlvdXQoIndhcm5pbmc6ICIsIG0xKTsKK30KK3N0YXRpYyB2b2lkIG9rKGNvbnN0IGNoYXIgKm0xKQoreworCWVycm5vID0gMDsKKwlvdXQoT0ssIG0xKTsKK30KKworc3RhdGljIGludCBzdnN0YXR1c19nZXQodm9pZCkKK3sKKwlpbnQgZmQsIHI7CisKKwlmZCA9IG9wZW4oInN1cGVydmlzZS9vayIsIE9fV1JPTkxZfE9fTkRFTEFZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVOT0RFVikgeworCQkJKmFjdHMgPT0gJ3gnID8gb2soInJ1bnN2IG5vdCBydW5uaW5nIikKKwkJCSAgICAgICAgICAgICA6IGZhaWx4KCJydW5zdiBub3QgcnVubmluZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJd2FybigiY2FuJ3Qgb3BlbiBzdXBlcnZpc2Uvb2siKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShmZCk7CisJZmQgPSBvcGVuKCJzdXBlcnZpc2Uvc3RhdHVzIiwgT19SRE9OTFl8T19OREVMQVkpOworCWlmIChmZCA9PSAtMSkgeworCQl3YXJuKCJjYW4ndCBvcGVuIHN1cGVydmlzZS9zdGF0dXMiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyID0gcmVhZChmZCwgJnN2c3RhdHVzLCAyMCk7CisJY2xvc2UoZmQpOworCXN3aXRjaCAocikgeworCWNhc2UgMjA6CisJCWJyZWFrOworCWNhc2UgLTE6CisJCXdhcm4oImNhbid0IHJlYWQgc3VwZXJ2aXNlL3N0YXR1cyIpOworCQlyZXR1cm4gLTE7CisJZGVmYXVsdDoKKwkJZXJybm8gPSAwOworCQl3YXJuKCJjYW4ndCByZWFkIHN1cGVydmlzZS9zdGF0dXM6IGJhZCBmb3JtYXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIHN2c3RhdHVzX3ByaW50KGNvbnN0IGNoYXIgKm0pCit7CisJaW50IGRpZmY7CisJaW50IHBpZDsKKwlpbnQgbm9ybWFsbHl1cCA9IDA7CisJc3RydWN0IHN0YXQgczsKKwl1aW50NjRfdCB0aW1lc3RhbXA7CisKKwlpZiAoc3RhdCgiZG93biIsICZzKSA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQliYl9wZXJyb3JfbXNnKFdBUk4iY2FuJ3Qgc3RhdCAlcy9kb3duIiwgKnNlcnZpY2UpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbm9ybWFsbHl1cCA9IDE7CisJfQorCXBpZCA9IFNXQVBfTEUzMihzdnN0YXR1cy5waWRfbGUzMik7CisJdGltZXN0YW1wID0gU1dBUF9CRTY0KHN2c3RhdHVzLnRpbWVfYmU2NCk7CisJaWYgKHBpZCkgeworCQlzd2l0Y2ggKHN2c3RhdHVzLnJ1bl9vcl9maW5pc2gpIHsKKwkJY2FzZSAxOiBwcmludGYoInJ1bjogIik7IGJyZWFrOworCQljYXNlIDI6IHByaW50ZigiZmluaXNoOiAiKTsgYnJlYWs7CisJCX0KKwkJcHJpbnRmKCIlczogKHBpZCAlZCkgIiwgbSwgcGlkKTsKKwl9IGVsc2UgeworCQlwcmludGYoImRvd246ICVzOiAiLCBtKTsKKwl9CisJZGlmZiA9IHRub3cgLSB0aW1lc3RhbXA7CisJcHJpbnRmKCIldXMiLCAoZGlmZiA8IDAgPyAwIDogZGlmZikpOworCWlmIChwaWQpIHsKKwkJaWYgKCFub3JtYWxseXVwKSBwcmludGYoIiwgbm9ybWFsbHkgZG93biIpOworCQlpZiAoc3ZzdGF0dXMucGF1c2VkKSBwcmludGYoIiwgcGF1c2VkIik7CisJCWlmIChzdnN0YXR1cy53YW50ID09ICdkJykgcHJpbnRmKCIsIHdhbnQgZG93biIpOworCQlpZiAoc3ZzdGF0dXMuZ290X3Rlcm0pIHByaW50ZigiLCBnb3QgVEVSTSIpOworCX0gZWxzZSB7CisJCWlmIChub3JtYWxseXVwKSBwcmludGYoIiwgbm9ybWFsbHkgdXAiKTsKKwkJaWYgKHN2c3RhdHVzLndhbnQgPT0gJ3UnKSBwcmludGYoIiwgd2FudCB1cCIpOworCX0KKwlyZXR1cm4gcGlkID8gMSA6IDI7Cit9CisKK3N0YXRpYyBpbnQgc3RhdHVzKGNvbnN0IGNoYXIgKnVudXNlZCBVTlVTRURfUEFSQU0pCit7CisJaW50IHI7CisKKwlpZiAoc3ZzdGF0dXNfZ2V0KCkgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gc3ZzdGF0dXNfcHJpbnQoKnNlcnZpY2UpOworCWlmIChjaGRpcigibG9nIikgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJcHJpbnRmKCI7IGxvZzogIldBUk4iY2FuJ3QgY2hhbmdlIHRvIGxvZyBzZXJ2aWNlIGRpcmVjdG9yeTogJXMiLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQl9CisJfSBlbHNlIGlmIChzdnN0YXR1c19nZXQoKSkgeworCQlwcmludGYoIjsgIik7CisJCXN2c3RhdHVzX3ByaW50KCJsb2ciKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsgLyogd2lsbCBhbHNvIGZsdXNoIHRoZSBvdXRwdXQgKi8KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBjaGVja3NjcmlwdCh2b2lkKQoreworCWNoYXIgKnByb2dbMl07CisJc3RydWN0IHN0YXQgczsKKwlpbnQgcGlkLCB3OworCisJaWYgKHN0YXQoImNoZWNrIiwgJnMpID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpIHJldHVybiAxOworCQliYl9wZXJyb3JfbXNnKFdBUk4iY2FuJ3Qgc3RhdCAlcy9jaGVjayIsICpzZXJ2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGlmICghKHMuc3RfbW9kZSAmIFNfSVhVU1IpKSByZXR1cm4gMTsgKi8KKwlwcm9nWzBdID0gKGNoYXIqKSIuL2NoZWNrIjsKKwlwcm9nWzFdID0gTlVMTDsKKwlwaWQgPSBzcGF3bihwcm9nKTsKKwlpZiAocGlkIDw9IDApIHsKKwkJYmJfcGVycm9yX21zZyhXQVJOImNhbid0ICVzIGNoaWxkICVzL2NoZWNrIiwgInJ1biIsICpzZXJ2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChzYWZlX3dhaXRwaWQocGlkLCAmdywgMCkgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZyhXQVJOImNhbid0ICVzIGNoaWxkICVzL2NoZWNrIiwgIndhaXQgZm9yIiwgKnNlcnZpY2UpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIFdFWElUU1RBVFVTKHcpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqYSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBwaWRfbGUzMjsKKwl1aW50NjRfdCB0aW1lc3RhbXA7CisKKwlyID0gc3ZzdGF0dXNfZ2V0KCk7CisJaWYgKHIgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAociA9PSAwKSB7CisJCWlmICgqYSA9PSAneCcpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC0xOworCX0KKwlwaWRfbGUzMiA9IHN2c3RhdHVzLnBpZF9sZTMyOworCXN3aXRjaCAoKmEpIHsKKwljYXNlICd4JzoKKwkJcmV0dXJuIDA7CisJY2FzZSAndSc6CisJCWlmICghcGlkX2xlMzIgfHwgc3ZzdGF0dXMucnVuX29yX2ZpbmlzaCAhPSAxKSByZXR1cm4gMDsKKwkJaWYgKCFjaGVja3NjcmlwdCgpKSByZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCWlmIChwaWRfbGUzMikgcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgJ2MnOgorCQlpZiAocGlkX2xlMzIgJiYgIWNoZWNrc2NyaXB0KCkpIHJldHVybiAwOworCQlicmVhazsKKwljYXNlICd0JzoKKwkJaWYgKCFwaWRfbGUzMiAmJiBzdnN0YXR1cy53YW50ID09ICdkJykgYnJlYWs7CisJCXRpbWVzdGFtcCA9IFNXQVBfQkU2NChzdnN0YXR1cy50aW1lX2JlNjQpOworCQlpZiAoKHRzdGFydCA+IHRpbWVzdGFtcCkgfHwgIXBpZF9sZTMyIHx8IHN2c3RhdHVzLmdvdF90ZXJtIHx8ICFjaGVja3NjcmlwdCgpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgJ28nOgorCQl0aW1lc3RhbXAgPSBTV0FQX0JFNjQoc3ZzdGF0dXMudGltZV9iZTY0KTsKKwkJaWYgKCghcGlkX2xlMzIgJiYgdHN0YXJ0ID4gdGltZXN0YW1wKSB8fCAocGlkX2xlMzIgJiYgc3ZzdGF0dXMud2FudCAhPSAnZCcpKQorCQkJcmV0dXJuIDA7CisJfQorCXByaW50ZihPSyk7CisJc3ZzdGF0dXNfcHJpbnQoKnNlcnZpY2UpOworCWJiX3B1dGNoYXIoJ1xuJyk7IC8qIHdpbGwgYWxzbyBmbHVzaCB0aGUgb3V0cHV0ICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbChjb25zdCBjaGFyICphKQoreworCWludCBmZCwgciwgbDsKKworLyogSXMgaXQgYW4gb3B0aW1pemF0aW9uPworICAgSXQgY2F1c2VzIHByb2JsZW1zIHdpdGggInN2IG8gU1JWOyAuLi47IHN2IGQgU1JWIgorICAgKCdkJyBpcyBub3QgcGFzc2VkIHRvIFNSViBiZWNhdXNlIGl0cyAud2FudCA9PSAnZCcpOgorCWlmIChzdnN0YXR1c19nZXQoKSA8PSAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHN2c3RhdHVzLndhbnQgPT0gKmEpCisJCXJldHVybiAwOworKi8KKwlmZCA9IG9wZW4oInN1cGVydmlzZS9jb250cm9sIiwgT19XUk9OTFl8T19OREVMQVkpOworCWlmIChmZCA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PREVWKQorCQkJd2FybigiY2FuJ3Qgb3BlbiBzdXBlcnZpc2UvY29udHJvbCIpOworCQllbHNlCisJCQkqYSA9PSAneCcgPyBvaygicnVuc3Ygbm90IHJ1bm5pbmciKSA6IGZhaWx4KCJydW5zdiBub3QgcnVubmluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCWwgPSBzdHJsZW4oYSk7CisJciA9IHdyaXRlKGZkLCBhLCBsKTsKKwljbG9zZShmZCk7CisJaWYgKHIgIT0gbCkgeworCQl3YXJuKCJjYW4ndCB3cml0ZSB0byBzdXBlcnZpc2UvY29udHJvbCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAxOworfQorCitpbnQgc3ZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICp4OworCWNoYXIgKmFjdGlvbjsKKwljb25zdCBjaGFyICp2YXJzZXJ2aWNlID0gQ09ORklHX1NWX0RFRkFVTFRfU0VSVklDRV9ESVI7CisJdW5zaWduZWQgd2FpdHNlYyA9IDc7CisJc21hbGxpbnQga2xsID0gMDsKKwlpbnQgdmVyYm9zZSA9IDA7CisJaW50ICgqYWN0KShjb25zdCBjaGFyKik7CisJaW50ICgqY2JrKShjb25zdCBjaGFyKik7CisJaW50IGN1cmRpcjsKKworCUlOSVRfRygpOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMTAwOworCisJeCA9IGdldGVudigiU1ZESVIiKTsKKwlpZiAoeCkgdmFyc2VydmljZSA9IHg7CisJeCA9IGdldGVudigiU1ZXQUlUIik7CisJaWYgKHgpIHdhaXRzZWMgPSB4YXRvdSh4KTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIncrOnZ2IjsgLyogLXcgTiwgLXYgaXMgYSBjb3VudGVyICovCisJZ2V0b3B0MzIoYXJndiwgInc6diIsICZ3YWl0c2VjLCAmdmVyYm9zZSk7CisJYXJndiArPSBvcHRpbmQ7CisJYWN0aW9uID0gKmFyZ3YrKzsKKwlpZiAoIWFjdGlvbiB8fCAhKmFyZ3YpIGJiX3Nob3dfdXNhZ2UoKTsKKworCXRub3cgPSB0aW1lKE5VTEwpICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMOworCXRzdGFydCA9IHRub3c7CisJY3VyZGlyID0gb3BlbigiLiIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwlpZiAoY3VyZGlyID09IC0xKQorCQlmYXRhbF9jYW5ub3QoIm9wZW4gY3VycmVudCBkaXJlY3RvcnkiKTsKKworCWFjdCA9ICZjb250cm9sOworCWFjdHMgPSAicyI7CisJY2JrID0gJmNoZWNrOworCisJc3dpdGNoICgqYWN0aW9uKSB7CisJY2FzZSAneCc6CisJY2FzZSAnZSc6CisJCWFjdHMgPSAieCI7CisJCWlmICghdmVyYm9zZSkgY2JrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAnWCc6CisJY2FzZSAnRSc6CisJCWFjdHMgPSAieCI7CisJCWtsbCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ0QnOgorCQlhY3RzID0gImQiOworCQlrbGwgPSAxOworCQlicmVhazsKKwljYXNlICdUJzoKKwkJYWN0cyA9ICJ0YyI7CisJCWtsbCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ2MnOgorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgImNoZWNrIikpIHsKKwkJCWFjdCA9IE5VTEw7CisJCQlhY3RzID0gImMiOworCQkJYnJlYWs7CisJCX0KKwljYXNlICd1JzogY2FzZSAnZCc6IGNhc2UgJ28nOiBjYXNlICd0JzogY2FzZSAncCc6IGNhc2UgJ2gnOgorCWNhc2UgJ2EnOiBjYXNlICdpJzogY2FzZSAnayc6IGNhc2UgJ3EnOiBjYXNlICcxJzogY2FzZSAnMic6CisJCWFjdGlvblsxXSA9ICdcMCc7CisJCWFjdHMgPSBhY3Rpb247CisJCWlmICghdmVyYm9zZSkgY2JrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAic2h1dGRvd24iKSkgeworCQkJYWN0cyA9ICJ4IjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAic3RhcnQiKSkgeworCQkJYWN0cyA9ICJ1IjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAic3RvcCIpKSB7CisJCQlhY3RzID0gImQiOworCQkJYnJlYWs7CisJCX0KKwkJLyogInN0YXR1cyIgKi8KKwkJYWN0ID0gJnN0YXR1czsKKwkJY2JrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAncic6CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAicmVzdGFydCIpKSB7CisJCQlhY3RzID0gInRjdSI7CisJCQlicmVhazsKKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisJY2FzZSAnZic6CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2UtcmVsb2FkIikpIHsKKwkJCWFjdHMgPSAidGMiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2UtcmVzdGFydCIpKSB7CisJCQlhY3RzID0gInRjdSI7CisJCQlrbGwgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0cl9lcXVhbChhY3Rpb24sICJmb3JjZS1zaHV0ZG93biIpKSB7CisJCQlhY3RzID0gIngiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2Utc3RvcCIpKSB7CisJCQlhY3RzID0gImQiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXNlcnZpY2UgPSBhcmd2OworCXdoaWxlICgoeCA9ICpzZXJ2aWNlKSAhPSBOVUxMKSB7CisJCWlmICh4WzBdICE9ICcvJyAmJiB4WzBdICE9ICcuJykgeworCQkJaWYgKGNoZGlyKHZhcnNlcnZpY2UpID09IC0xKQorCQkJCWdvdG8gY2hkaXJfZmFpbGVkXzA7CisJCX0KKwkJaWYgKGNoZGlyKHgpID09IC0xKSB7CisgY2hkaXJfZmFpbGVkXzA6CisJCQlmYWlsKCJjYW4ndCBjaGFuZ2UgdG8gc2VydmljZSBkaXJlY3RvcnkiKTsKKwkJCWdvdG8gbnVsbGlmeV9zZXJ2aWNlXzA7CisJCX0KKwkJaWYgKGFjdCAmJiAoYWN0KGFjdHMpID09IC0xKSkgeworIG51bGxpZnlfc2VydmljZV8wOgorCQkJKnNlcnZpY2UgPSAoY2hhciopIC0xTDsgLyogImRlYWQiICovCisJCX0KKwkJaWYgKGZjaGRpcihjdXJkaXIpID09IC0xKQorCQkJZmF0YWxfY2Fubm90KCJjaGFuZ2UgdG8gb3JpZ2luYWwgZGlyZWN0b3J5Iik7CisJCXNlcnZpY2UrKzsKKwl9CisKKwlpZiAoY2JrKSB3aGlsZSAoMSkgeworCQlpbnQgd2FudF9leGl0OworCQlpbnQgZGlmZjsKKworCQlkaWZmID0gdG5vdyAtIHRzdGFydDsKKwkJc2VydmljZSA9IGFyZ3Y7CisJCXdhbnRfZXhpdCA9IDE7CisJCXdoaWxlICgoeCA9ICpzZXJ2aWNlKSAhPSBOVUxMKSB7CisJCQlpZiAoeCA9PSAoY2hhciopIC0xTCkgLyogImRlYWQiICovCisJCQkJZ290byBuZXh0OworCQkJaWYgKHhbMF0gIT0gJy8nICYmIHhbMF0gIT0gJy4nKSB7CisJCQkJaWYgKGNoZGlyKHZhcnNlcnZpY2UpID09IC0xKQorCQkJCQlnb3RvIGNoZGlyX2ZhaWxlZDsKKwkJCX0KKwkJCWlmIChjaGRpcih4KSA9PSAtMSkgeworIGNoZGlyX2ZhaWxlZDoKKwkJCQlmYWlsKCJjYW4ndCBjaGFuZ2UgdG8gc2VydmljZSBkaXJlY3RvcnkiKTsKKwkJCQlnb3RvIG51bGxpZnlfc2VydmljZTsKKwkJCX0KKwkJCWlmIChjYmsoYWN0cykgIT0gMCkKKwkJCQlnb3RvIG51bGxpZnlfc2VydmljZTsKKwkJCXdhbnRfZXhpdCA9IDA7CisJCQlpZiAoZGlmZiA+PSB3YWl0c2VjKSB7CisJCQkJcHJpbnRmKGtsbCA/ICJraWxsOiAiIDogInRpbWVvdXQ6ICIpOworCQkJCWlmIChzdnN0YXR1c19nZXQoKSA+IDApIHsKKwkJCQkJc3ZzdGF0dXNfcHJpbnQoeCk7CisJCQkJCSsrcmM7CisJCQkJfQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7IC8qIHdpbGwgYWxzbyBmbHVzaCB0aGUgb3V0cHV0ICovCisJCQkJaWYgKGtsbCkKKwkJCQkJY29udHJvbCgiayIpOworIG51bGxpZnlfc2VydmljZToKKwkJCQkqc2VydmljZSA9IChjaGFyKikgLTFMOyAvKiAiZGVhZCIgKi8KKwkJCX0KKwkJCWlmIChmY2hkaXIoY3VyZGlyKSA9PSAtMSkKKwkJCQlmYXRhbF9jYW5ub3QoImNoYW5nZSB0byBvcmlnaW5hbCBkaXJlY3RvcnkiKTsKKyBuZXh0OgorCQkJc2VydmljZSsrOworCQl9CisJCWlmICh3YW50X2V4aXQpIGJyZWFrOworCQl1c2xlZXAoNDIwMDAwKTsKKwkJdG5vdyA9IHRpbWUoTlVMTCkgKyAweDQwMDAwMDAwMDAwMDAwMGFVTEw7CisJfQorCXJldHVybiByYyA+IDk5ID8gOTkgOiByYzsKK30KZGlmZiAtLWdpdCBhL3J1bml0L3N2bG9nZC5jIGIvcnVuaXQvc3Zsb2dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiYTIxYgotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L3N2bG9nZC5jCkBAIC0wLDAgKzEsMTIzMiBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBHZXJyaXQgUGFwZQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyogQnVzeWJveGVkIGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+ICovCisvKiBUT0RPOiBkZXBlbmRzIG9uIHJ1bml0X2xpYi5jIC0gcmV2aWV3IGFuZCByZWR1Y2UvZWxpbWluYXRlICovCisKKy8qCitDb25maWcgZmlsZXMKKworT24gc3RhcnR1cCwgYW5kIGFmdGVyIHJlY2VpdmluZyBhIEhVUCBzaWduYWwsIHN2bG9nZCBjaGVja3MgZm9yIGVhY2gKK2xvZyBkaXJlY3RvcnkgbG9nIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbG9nL2NvbmZpZyBleGlzdHMsCithbmQgaWYgc28sIHJlYWRzIHRoZSBmaWxlIGxpbmUgYnkgbGluZSBhbmQgYWRqdXN0cyBjb25maWd1cmF0aW9uCitmb3IgbG9nIGFzIGZvbGxvd3M6CisKK0lmIHRoZSBsaW5lIGlzIGVtcHR5LCBvciBzdGFydHMgd2l0aCBhICMsIGl0IGlzIGlnbm9yZWQuIEEgbGluZQorb2YgdGhlIGZvcm0KKworc3NpemUKKyAgICBzZXRzIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiBjdXJyZW50IHdoZW4gc3Zsb2dkIHNob3VsZCByb3RhdGUKKyAgICB0aGUgY3VycmVudCBsb2cgZmlsZSB0byBzaXplIGJ5dGVzLiBEZWZhdWx0IGlzIDEwMDAwMDAuCisgICAgSWYgc2l6ZSBpcyB6ZXJvLCBzdmxvZ2QgZG9lc250IHJvdGF0ZSBsb2cgZmlsZXMKKyAgICBZb3Ugc2hvdWxkIHNldCBzaXplIHRvIGF0IGxlYXN0ICgyICogbGVuKS4KK25udW0KKyAgICBzZXRzIHRoZSBudW1iZXIgb2Ygb2xkIGxvZyBmaWxlcyBzdmxvZ2Qgc2hvdWxkIG1haW50YWluIHRvIG51bS4KKyAgICBJZiBzdmxvZ2Qgc2VlcyBtb3JlIHRoYXQgbnVtIG9sZCBsb2cgZmlsZXMgaW4gbG9nIGFmdGVyIGxvZyBmaWxlCisgICAgcm90YXRpb24sIGl0IGRlbGV0ZXMgdGhlIG9sZGVzdCBvbmUuIERlZmF1bHQgaXMgMTAuCisgICAgSWYgbnVtIGlzIHplcm8sIHN2bG9nZCBkb2VzbnQgcmVtb3ZlIG9sZCBsb2cgZmlsZXMuCitObWluCisgICAgc2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2Ygb2xkIGxvZyBmaWxlcyBzdmxvZ2Qgc2hvdWxkIG1haW50YWluCisgICAgdG8gbWluLiBtaW4gbXVzdCBiZSBsZXNzIHRoYW4gbnVtLiBJZiBtaW4gaXMgc2V0LCBhbmQgc3Zsb2dkCisgICAgY2Fubm90IHdyaXRlIHRvIGN1cnJlbnQgYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBmdWxsLAorICAgIGFuZCBpdCBzZWVzIG1vcmUgdGhhbiBtaW4gb2xkIGxvZyBmaWxlcywgaXQgZGVsZXRlcyB0aGUgb2xkZXN0IG9uZS4KK3R0aW1lb3V0CisgICAgc2V0cyB0aGUgbWF4aW11bSBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9nIGZpbGUgd2hlbiBzdmxvZ2Qgc2hvdWxkCisgICAgcm90YXRlIHRoZSBjdXJyZW50IGxvZyBmaWxlIHRvIHRpbWVvdXQgc2Vjb25kcy4gSWYgY3VycmVudAorICAgIGlzIHRpbWVvdXQgc2Vjb25kcyBvbGQsIGFuZCBpcyBub3QgZW1wdHksIHN2bG9nZCBmb3JjZXMgbG9nIGZpbGUgcm90YXRpb24uCishcHJvY2Vzc29yCisgICAgdGVsbHMgc3Zsb2dkIHRvIGZlZWQgZWFjaCByZWNlbnQgbG9nIGZpbGUgdGhyb3VnaCBwcm9jZXNzb3IKKyAgICAoc2VlIGFib3ZlKSBvbiBsb2cgZmlsZSByb3RhdGlvbi4gQnkgZGVmYXVsdCBsb2cgZmlsZXMgYXJlIG5vdCBwcm9jZXNzZWQuCit1YS5iLmMuZFs6cG9ydF0KKyAgICB0ZWxscyBzdmxvZ2QgdG8gdHJhbnNtaXQgdGhlIGZpcnN0IGxlbiBjaGFyYWN0ZXJzIG9mIHNlbGVjdGVkCisgICAgbG9nIG1lc3NhZ2VzIHRvIHRoZSBJUCBhZGRyZXNzIGEuYi5jLmQsIHBvcnQgbnVtYmVyIHBvcnQuCisgICAgSWYgcG9ydCBpc250IHNldCwgdGhlIGRlZmF1bHQgcG9ydCBmb3Igc3lzbG9nIGlzIHVzZWQgKDUxNCkuCisgICAgbGVuIGNhbiBiZSBzZXQgdGhyb3VnaCB0aGUgLWwgb3B0aW9uLCBzZWUgYmVsb3cuIElmIHN2bG9nZAorICAgIGhhcyB0cm91YmxlIHNlbmRpbmcgdWRwIHBhY2tldHMsIGl0IHdyaXRlcyBlcnJvciBtZXNzYWdlcworICAgIHRvIHRoZSBsb2cgZGlyZWN0b3J5LiBBdHRlbnRpb246IGxvZ2dpbmcgdGhyb3VnaCB1ZHAgaXMgdW5yZWxpYWJsZSwKKyAgICBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gcHJpdmF0ZSBuZXR3b3JrcyBvbmx5LgorVWEuYi5jLmRbOnBvcnRdCisgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHUgbGluZSBhYm92ZSwgYnV0IHRoZSBsb2cgbWVzc2FnZXMgYXJlIG5vIGxvbmdlcgorICAgIHdyaXR0ZW4gdG8gdGhlIGxvZyBkaXJlY3RvcnksIGJ1dCB0cmFuc21pdHRlZCB0aHJvdWdoIHVkcCBvbmx5LgorICAgIEVycm9yIG1lc3NhZ2VzIGZyb20gc3Zsb2dkIGNvbmNlcm5pbmcgc2VuZGluZyB1ZHAgcGFja2FnZXMgc3RpbGwgZ28KKyAgICB0byB0aGUgbG9nIGRpcmVjdG9yeS4KK3BwcmVmaXgKKyAgICB0ZWxscyBzdmxvZ2QgdG8gcHJlZml4IGVhY2ggbGluZSB0byBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZGlyZWN0b3J5LAorICAgIHRvIHN0YW5kYXJkIGVycm9yLCBvciB0aHJvdWdoIFVEUCwgd2l0aCBwcmVmaXguCisKK0lmIGEgbGluZSBzdGFydHMgd2l0aCBhIC0sICssIGUsIG9yIEUsIHN2bG9nZCBtYXRjaGVzIHRoZSBmaXJzdCBsZW4gY2hhcmFjdGVycworb2YgZWFjaCBsb2cgbWVzc2FnZSBhZ2FpbnN0IHBhdHRlcm4gYW5kIGFjdHMgYWNjb3JkaW5nbHk6CisKKy1wYXR0ZXJuCisgICAgdGhlIGxvZyBtZXNzYWdlIGlzIGRlc2VsZWN0ZWQuCisrcGF0dGVybgorICAgIHRoZSBsb2cgbWVzc2FnZSBpcyBzZWxlY3RlZC4KK2VwYXR0ZXJuCisgICAgdGhlIGxvZyBtZXNzYWdlIGlzIHNlbGVjdGVkIHRvIGJlIHByaW50ZWQgdG8gc3RhbmRhcmQgZXJyb3IuCitFcGF0dGVybgorICAgIHRoZSBsb2cgbWVzc2FnZSBpcyBkZXNlbGVjdGVkIHRvIGJlIHByaW50ZWQgdG8gc3RhbmRhcmQgZXJyb3IuCisKK0luaXRpYWxseSBlYWNoIGxpbmUgaXMgc2VsZWN0ZWQgdG8gYmUgd3JpdHRlbiB0byBsb2cvY3VycmVudC4gRGVzZWxlY3RlZAorbG9nIG1lc3NhZ2VzIGFyZSBkaXNjYXJkZWQgZnJvbSBsb2cuIEluaXRpYWxseSBlYWNoIGxpbmUgaXMgZGVzZWxlY3RlZAordG8gYmUgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnIuIExvZyBtZXNzYWdlcyBzZWxlY3RlZCBmb3Igc3RhbmRhcmQgZXJyb3IKK2FyZSB3cml0dGVuIHRvIHN0YW5kYXJkIGVycm9yLgorCitQYXR0ZXJuIE1hdGNoaW5nCisKK3N2bG9nZCBtYXRjaGVzIGEgbG9nIG1lc3NhZ2UgYWdhaW5zdCB0aGUgc3RyaW5nIHBhdHRlcm4gYXMgZm9sbG93czoKKworcGF0dGVybiBpcyBhcHBsaWVkIHRvIHRoZSBsb2cgbWVzc2FnZSBvbmUgY2hhcmFjdGVyIGJ5IG9uZSwgc3RhcnRpbmcKK3dpdGggdGhlIGZpcnN0LiBBIGNoYXJhY3RlciBub3QgYSBzdGFyICgqKSBhbmQgbm90IGEgcGx1cyAoKykgbWF0Y2hlcyBpdHNlbGYuCitBIHBsdXMgbWF0Y2hlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gcGF0dGVybiBpbiB0aGUgbG9nIG1lc3NhZ2Ugb25lCitvciBtb3JlIHRpbWVzLiBBIHN0YXIgYmVmb3JlIHRoZSBlbmQgb2YgcGF0dGVybiBtYXRjaGVzIGFueSBzdHJpbmcKK2luIHRoZSBsb2cgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIG5leHQgY2hhcmFjdGVyIGluIHBhdHRlcm4uCitBIHN0YXIgYXQgdGhlIGVuZCBvZiBwYXR0ZXJuIG1hdGNoZXMgYW55IHN0cmluZy4KKworVGltZXN0YW1wcyBvcHRpb25hbGx5IGFkZGVkIGJ5IHN2bG9nZCBhcmUgbm90IGNvbnNpZGVyZWQgcGFydAorb2YgdGhlIGxvZyBtZXNzYWdlLgorCitBbiBzdmxvZ2QgcGF0dGVybiBpcyBub3QgYSByZWd1bGFyIGV4cHJlc3Npb24uIEZvciBleGFtcGxlIGNvbnNpZGVyCithIGxvZyBtZXNzYWdlIGxpa2UgdGhpcworCisyMDA1LTEyLTE4XzA5OjEzOjUwLjk3NjE4IHRjcHN2ZDogaW5mbzogcGlkIDE5NzcgZnJvbSAxMC40LjEuMTQKKworVGhlIGZvbGxvd2luZyBwYXR0ZXJuIGRvZXNudCBtYXRjaAorCistKnBpZCoKKworYmVjYXVzZSB0aGUgZmlyc3Qgc3RhciBtYXRjaGVzIHVwIHRvIHRoZSBmaXJzdCBwIGluIHRjcHN2ZCwKK2FuZCB0aGVuIHRoZSBtYXRjaCBmYWlscyBiZWNhdXNlIGkgaXMgbm90IHMuIFRvIG1hdGNoIHRoaXMKK2xvZyBtZXNzYWdlLCB5b3UgY2FuIHVzZSBhIHBhdHRlcm4gbGlrZSB0aGlzIGluc3RlYWQKKworLSo6ICo6IHBpZCAqCisqLworCisvL3VzYWdlOiNkZWZpbmUgc3Zsb2dkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXR0dl0gWy1yIENdIFstUiBDSEFSU10gWy1sIE1BVENITEVOXSBbLWIgQlVGTEVOXSBESVIuLi4iCisvL3VzYWdlOiNkZWZpbmUgc3Zsb2dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29udGludW91c2x5IHJlYWQgbG9nIGRhdGEgZnJvbSBzdGRpbiBhbmQgd3JpdGUgdG8gcm90YXRlZCBsb2cgZmlsZXMgaW4gRElScyIKKy8vdXNhZ2U6ICAgIlxuIgorLy91c2FnZTogICAiXG4iIkRJUi9jb25maWcgZmlsZSBtb2RpZmllcyBiZWhhdmlvcjoiCisvL3VzYWdlOiAgICJcbiIic1NJWkUgLSB3aGVuIHRvIHJvdGF0ZSBsb2dzIgorLy91c2FnZTogICAiXG4iIm5OVU0gLSBudW1iZXIgb2YgZmlsZXMgdG8gcmV0YWluIgorLyp1c2FnZTogICAiXG4iIk5OVU0gLSBtaW4gbnVtYmVyIGZpbGVzIHRvIHJldGFpbiIgLSBjb25mdXNpbmcgKi8KKy8qdXNhZ2U6ICAgIlxuIiJ0U0VDIC0gcm90YXRlIGZpbGUgaWYgaXQgZ2V0IFNFQyBzZWNvbmRzIG9sZCIgLSBjb25mdXNpbmcgKi8KKy8vdXNhZ2U6ICAgIlxuIiIhUFJPRyAtIHByb2Nlc3Mgcm90YXRlZCBsb2cgd2l0aCBQUk9HIgorLyp1c2FnZTogICAiXG4iInVJUEFERFIgLSBzZW5kIGxvZyBvdmVyIFVEUCIgLSB1bnN1cHBvcnRlZCAqLworLyp1c2FnZTogICAiXG4iIlVJUEFERFIgLSBzZW5kIGxvZyBvdmVyIFVEUCBhbmQgRE9OVCBsb2ciIC0gdW5zdXBwb3J0ZWQgKi8KKy8qdXNhZ2U6ICAgIlxuIiJwUEZYIC0gcHJlZml4IGVhY2ggbGluZSB3aXRoIFBGWCIgLSB1bnN1cHBvcnRlZCAqLworLy91c2FnZTogICAiXG4iIissLVBBVFRFUk4gLSAoZGUpc2VsZWN0IGxpbmUgZm9yIGxvZ2dpbmciCisvL3VzYWdlOiAgICJcbiIiRSxlUEFUVEVSTiAtIChkZSlzZWxlY3QgbGluZSBmb3Igc3RkZXJyIgorCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnVuaXRfbGliLmgiCisKKyNkZWZpbmUgTEVTUyhhLGIpICgoaW50KSgodW5zaWduZWQpKGIpIC0gKHVuc2lnbmVkKShhKSkgPiAwKQorCisjZGVmaW5lIEZNVF9QVElNRSAzMAorCitzdHJ1Y3QgbG9nZGlyIHsKKwkvLy8vY2hhciAqYnRtcDsKKwkvKiBwYXR0ZXJuIGxpc3QgdG8gbWF0Y2gsIGluICJhYVwwYmJcMFxjY1wwXDAiIGZvcm0gKi8KKwljaGFyICppbnN0OworCWNoYXIgKnByb2Nlc3NvcjsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIHNpemU7CisJdW5zaWduZWQgc2l6ZW1heDsKKwl1bnNpZ25lZCBubWF4OworCXVuc2lnbmVkIG5taW47CisJdW5zaWduZWQgcm90YXRlX3BlcmlvZDsKKwlpbnQgcHBpZDsKKwlpbnQgZmRkaXI7CisJaW50IGZkY3VyOworCUZJTEUqIGZpbGVjdXI7IC8vLy8KKwlpbnQgZmRsb2NrOworCXVuc2lnbmVkIG5leHRfcm90YXRlOworCWNoYXIgZm5zYXZlW0ZNVF9QVElNRV07CisJY2hhciBtYXRjaDsKKwljaGFyIG1hdGNoZXJyOworfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IGxvZ2RpciAqZGlyOworCXVuc2lnbmVkIHZlcmJvc2U7CisJaW50IGxpbmVtYXg7CisJLy8vL2ludCBidWZsZW47CisJaW50IGxpbmVsZW47CisKKwlpbnQgZmR3ZGlyOworCWNoYXIgKipmbmRpcjsKKwlpbnQgd3N0YXQ7CisJdW5zaWduZWQgbmVhcmVzdF9yb3RhdGU7CisKKwl2b2lkKiAoKm1lbVJjaHIpKGNvbnN0IHZvaWQgKiwgaW50LCBzaXplX3QpOworCWNoYXIgKnNoZWxsOworCisJc21hbGxpbnQgZXhpdGFzYXA7CisJc21hbGxpbnQgcm90YXRlYXNhcDsKKwlzbWFsbGludCByZW9wZW5hc2FwOworCXNtYWxsaW50IGxpbmVjb21wbGV0ZTsKKwlzbWFsbGludCB0bWF4ZmxhZzsKKworCWNoYXIgcmVwbDsKKwljb25zdCBjaGFyICpyZXBsYWNlOworCWludCBmbF9mbGFnXzA7CisJdW5zaWduZWQgZGlybjsKKworCXNpZ3NldF90IGJsb2NrZWRfc2lnc2V0OworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBkaXIgICAgICAgICAgICAoRy5kaXIgICAgICAgICAgICkKKyNkZWZpbmUgdmVyYm9zZSAgICAgICAgKEcudmVyYm9zZSAgICAgICApCisjZGVmaW5lIGxpbmVtYXggICAgICAgIChHLmxpbmVtYXggICAgICAgKQorI2RlZmluZSBidWZsZW4gICAgICAgICAoRy5idWZsZW4gICAgICAgICkKKyNkZWZpbmUgbGluZWxlbiAgICAgICAgKEcubGluZWxlbiAgICAgICApCisjZGVmaW5lIGZuZGlyICAgICAgICAgIChHLmZuZGlyICAgICAgICAgKQorI2RlZmluZSBmZHdkaXIgICAgICAgICAoRy5mZHdkaXIgICAgICAgICkKKyNkZWZpbmUgd3N0YXQgICAgICAgICAgKEcud3N0YXQgICAgICAgICApCisjZGVmaW5lIG1lbVJjaHIgICAgICAgIChHLm1lbVJjaHIgICAgICAgKQorI2RlZmluZSBuZWFyZXN0X3JvdGF0ZSAoRy5uZWFyZXN0X3JvdGF0ZSkKKyNkZWZpbmUgZXhpdGFzYXAgICAgICAgKEcuZXhpdGFzYXAgICAgICApCisjZGVmaW5lIHJvdGF0ZWFzYXAgICAgIChHLnJvdGF0ZWFzYXAgICAgKQorI2RlZmluZSByZW9wZW5hc2FwICAgICAoRy5yZW9wZW5hc2FwICAgICkKKyNkZWZpbmUgbGluZWNvbXBsZXRlICAgKEcubGluZWNvbXBsZXRlICApCisjZGVmaW5lIHRtYXhmbGFnICAgICAgIChHLnRtYXhmbGFnICAgICAgKQorI2RlZmluZSByZXBsICAgICAgICAgICAoRy5yZXBsICAgICAgICAgICkKKyNkZWZpbmUgcmVwbGFjZSAgICAgICAgKEcucmVwbGFjZSAgICAgICApCisjZGVmaW5lIGJsb2NrZWRfc2lnc2V0IChHLmJsb2NrZWRfc2lnc2V0KQorI2RlZmluZSBmbF9mbGFnXzAgICAgICAoRy5mbF9mbGFnXzAgICAgICkKKyNkZWZpbmUgZGlybiAgICAgICAgICAgKEcuZGlybiAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJbGluZW1heCA9IDEwMDA7IFwKKwkvKmJ1ZmxlbiA9IDEwMjQ7Ki8gXAorCWxpbmVjb21wbGV0ZSA9IDE7IFwKKwlyZXBsYWNlID0gIiI7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgbGluZSBiYl9jb21tb25fYnVmc2l6MQorCisKKyNkZWZpbmUgRkFUQUwgImZhdGFsOiAiCisjZGVmaW5lIFdBUk5JTkcgIndhcm5pbmc6ICIKKyNkZWZpbmUgUEFVU0UgInBhdXNpbmc6ICIKKyNkZWZpbmUgSU5GTyAiaW5mbzogIgorCitzdGF0aWMgdm9pZCBmYXRhbHgoY29uc3QgY2hhciAqbTApCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoRkFUQUwiJXMiLCBtMCk7Cit9CitzdGF0aWMgdm9pZCB3YXJuKGNvbnN0IGNoYXIgKm0wKQoreworCWJiX3BlcnJvcl9tc2coV0FSTklORyIlcyIsIG0wKTsKK30KK3N0YXRpYyB2b2lkIHdhcm4yKGNvbnN0IGNoYXIgKm0wLCBjb25zdCBjaGFyICptMSkKK3sKKwliYl9wZXJyb3JfbXNnKFdBUk5JTkciJXM6ICVzIiwgbTAsIG0xKTsKK30KK3N0YXRpYyB2b2lkIHdhcm54KGNvbnN0IGNoYXIgKm0wLCBjb25zdCBjaGFyICptMSkKK3sKKwliYl9lcnJvcl9tc2coV0FSTklORyIlczogJXMiLCBtMCwgbTEpOworfQorc3RhdGljIHZvaWQgcGF1c2Vfbm9tZW0odm9pZCkKK3sKKwliYl9lcnJvcl9tc2coUEFVU0Uib3V0IG9mIG1lbW9yeSIpOworCXNsZWVwKDMpOworfQorc3RhdGljIHZvaWQgcGF1c2UxY2Fubm90KGNvbnN0IGNoYXIgKm0wKQoreworCWJiX3BlcnJvcl9tc2coUEFVU0UiY2FuJ3QgJXMiLCBtMCk7CisJc2xlZXAoMyk7Cit9CitzdGF0aWMgdm9pZCBwYXVzZTJjYW5ub3QoY29uc3QgY2hhciAqbTAsIGNvbnN0IGNoYXIgKm0xKQoreworCWJiX3BlcnJvcl9tc2coUEFVU0UiY2FuJ3QgJXMgJXMiLCBtMCwgbTEpOworCXNsZWVwKDMpOworfQorCitzdGF0aWMgY2hhciogd3N0cmR1cChjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqczsKKwl3aGlsZSAoIShzID0gc3RyZHVwKHN0cikpKQorCQlwYXVzZV9ub21lbSgpOworCXJldHVybiBzOworfQorCitzdGF0aWMgdW5zaWduZWQgcG1hdGNoKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxlbikKK3sKKwlmb3IgKDs7KSB7CisJCWNoYXIgYyA9ICpwKys7CisJCWlmICghYykgcmV0dXJuICFsZW47CisJCXN3aXRjaCAoYykgeworCQljYXNlICcqJzoKKwkJCWMgPSAqcDsKKwkJCWlmICghYykgcmV0dXJuIDE7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCFsZW4pIHJldHVybiAwOworCQkJCWlmICgqcyA9PSBjKSBicmVhazsKKwkJCQkrK3M7CisJCQkJLS1sZW47CisJCQl9CisJCQljb250aW51ZTsKKwkJY2FzZSAnKyc6CisJCQljID0gKnArKzsKKwkJCWlmIChjICE9ICpzKSByZXR1cm4gMDsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoIWxlbikgcmV0dXJuIDE7CisJCQkJaWYgKCpzICE9IGMpIGJyZWFrOworCQkJCSsrczsKKwkJCQktLWxlbjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQkJLyoKKwkJY2FzZSAnPyc6CisJCQlpZiAoKnAgPT0gJz8nKSB7CisJCQkJaWYgKCpzICE9ICc/JykgcmV0dXJuIDA7CisJCQkJKytwOworCQkJfQorCQkJKytzOyAtLWxlbjsKKwkJCWNvbnRpbnVlOworCQkJKi8KKwkJZGVmYXVsdDoKKwkJCWlmICghbGVuKSByZXR1cm4gMDsKKwkJCWlmICgqcyAhPSBjKSByZXR1cm4gMDsKKwkJCSsrczsKKwkJCS0tbGVuOworCQkJY29udGludWU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKiogZXggZm10X3B0aW1lLltjaF0gKioqLworCisvKiBOVUwgdGVybWluYXRlZCAqLworc3RhdGljIHZvaWQgZm10X3RpbWVfaHVtYW5fMzBudWwoY2hhciAqcykKK3sKKwlzdHJ1Y3QgdG0gKnB0bTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCXB0bSA9IGdtdGltZSgmdHYudHZfc2VjKTsKKwlzcHJpbnRmKHMsICIlMDR1LSUwMnUtJTAydV8lMDJ1OiUwMnU6JTAydS4lMDZ1MDAwIiwKKwkJKHVuc2lnbmVkKSgxOTAwICsgcHRtLT50bV95ZWFyKSwKKwkJKHVuc2lnbmVkKShwdG0tPnRtX21vbiArIDEpLAorCQkodW5zaWduZWQpKHB0bS0+dG1fbWRheSksCisJCSh1bnNpZ25lZCkocHRtLT50bV9ob3VyKSwKKwkJKHVuc2lnbmVkKShwdG0tPnRtX21pbiksCisJCSh1bnNpZ25lZCkocHRtLT50bV9zZWMpLAorCQkodW5zaWduZWQpKHR2LnR2X3VzZWMpCisJKTsKKwkvKiA0KzEgKyAyKzEgKyAyKzEgKyAyKzEgKyAyKzEgKyAyKzEgKyA5ID0gKi8KKwkvKiA1ICAgKyAzICAgKyAzICAgKyAzICAgKyAzICAgKyAzICAgKyA5ID0gKi8KKwkvKiAyMCAodXAgdG8gJy4nIGluY2x1c2l2ZSkgKyA5IChub3QgaW5jbHVkaW5nICdcMCcpICovCit9CisKKy8qIE5PVCB0ZXJtaW5hdGVkISAqLworc3RhdGljIHZvaWQgZm10X3RpbWVfYmVybnN0ZWluXzI1KGNoYXIgKnMpCit7CisJdWludDMyX3QgcGFja1szXTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl1bnNpZ25lZCBzZWNfaGk7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlzZWNfaGkgPSAoMHg0MDAwMDAwMDAwMDAwMDBhVUxMICsgdHYudHZfc2VjKSA+PiAzMjsKKwl0di50dl9zZWMgPSAodGltZV90KSgweDQwMDAwMDAwMDAwMDAwMGFVTEwpICsgdHYudHZfc2VjOworCXR2LnR2X3VzZWMgKj0gMTAwMDsKKwkvKiBOZXR3b3JrIG9yZGVyIGlzIGJpZy1lbmRpYW46IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4KKwkgKiBUaGlzIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50IGhlcmUgKi8KKwlwYWNrWzBdID0gaHRvbmwoc2VjX2hpKTsKKwlwYWNrWzFdID0gaHRvbmwodHYudHZfc2VjKTsKKwlwYWNrWzJdID0gaHRvbmwodHYudHZfdXNlYyk7CisJKnMrKyA9ICdAJzsKKwliaW4yaGV4KHMsIChjaGFyKilwYWNrLCAxMik7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NvcnN0YXJ0KHN0cnVjdCBsb2dkaXIgKmxkKQoreworCWNoYXIgc3ZfY2g7CisJaW50IHBpZDsKKworCWlmICghbGQtPnByb2Nlc3NvcikgcmV0dXJuOworCWlmIChsZC0+cHBpZCkgeworCQl3YXJueCgicHJvY2Vzc29yIGFscmVhZHkgcnVubmluZyIsIGxkLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHZmb3JrJ2VkIGNoaWxkIHRyYXNoZXMgdGhpcyBieXRlLCBzYXZlLi4uICovCisJc3ZfY2ggPSBsZC0+Zm5zYXZlWzI2XTsKKworCWlmICghRy5zaGVsbCkKKwkJRy5zaGVsbCA9IHhzdHJkdXAoZ2V0X3NoZWxsX25hbWUoKSk7CisKKwl3aGlsZSAoKHBpZCA9IHZmb3JrKCkpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInZmb3JrIGZvciBwcm9jZXNzb3IiLCBsZC0+bmFtZSk7CisJaWYgKCFwaWQpIHsKKwkJaW50IGZkOworCisJCS8qIGNoaWxkICovCisJCS8qIE5vbi1pZ25vcmVkIHNpZ25hbHMgcmV2ZXJ0IHRvIFNJR19ERkwgb24gZXhlYyBhbnl3YXkgKi8KKwkJLypiYl9zaWduYWxzKDAKKwkJCSsgKDEgPDwgU0lHVEVSTSkKKwkJCSsgKDEgPDwgU0lHQUxSTSkKKwkJCSsgKDEgPDwgU0lHSFVQKQorCQkJLCBTSUdfREZMKTsqLworCQlzaWdfdW5ibG9jayhTSUdURVJNKTsKKwkJc2lnX3VuYmxvY2soU0lHQUxSTSk7CisJCXNpZ191bmJsb2NrKFNJR0hVUCk7CisKKwkJaWYgKHZlcmJvc2UpCisJCQliYl9lcnJvcl9tc2coSU5GTyJwcm9jZXNzaW5nOiAlcy8lcyIsIGxkLT5uYW1lLCBsZC0+Zm5zYXZlKTsKKwkJZmQgPSB4b3BlbihsZC0+Zm5zYXZlLCBPX1JET05MWXxPX05ERUxBWSk7CisJCXhtb3ZlX2ZkKGZkLCAwKTsKKwkJbGQtPmZuc2F2ZVsyNl0gPSAndCc7IC8qIDwtIHRoYXQncyB3aHkgd2UgbmVlZCBzdl9jaCEgKi8KKwkJZmQgPSB4b3BlbihsZC0+Zm5zYXZlLCBPX1dST05MWXxPX05ERUxBWXxPX1RSVU5DfE9fQ1JFQVQpOworCQl4bW92ZV9mZChmZCwgMSk7CisJCWZkID0gb3Blbigic3RhdGUiLCBPX1JET05MWXxPX05ERUxBWSk7CisJCWlmIChmZCA9PSAtMSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoRkFUQUwiY2FuJ3QgJXMgcHJvY2Vzc29yICVzIiwgIm9wZW4gc3RhdGUgZm9yIiwgbGQtPm5hbWUpOworCQkJY2xvc2UoeG9wZW4oInN0YXRlIiwgT19XUk9OTFl8T19OREVMQVl8T19UUlVOQ3xPX0NSRUFUKSk7CisJCQlmZCA9IHhvcGVuKCJzdGF0ZSIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJfQorCQl4bW92ZV9mZChmZCwgNCk7CisJCWZkID0geG9wZW4oIm5ld3N0YXRlIiwgT19XUk9OTFl8T19OREVMQVl8T19UUlVOQ3xPX0NSRUFUKTsKKwkJeG1vdmVfZmQoZmQsIDUpOworCisJCWV4ZWNsKEcuc2hlbGwsIEcuc2hlbGwsICItYyIsIGxkLT5wcm9jZXNzb3IsIChjaGFyKikgTlVMTCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShGQVRBTCJjYW4ndCAlcyBwcm9jZXNzb3IgJXMiLCAicnVuIiwgbGQtPm5hbWUpOworCX0KKwlsZC0+Zm5zYXZlWzI2XSA9IHN2X2NoOyAvKiAuLi5yZXN0b3JlICovCisJbGQtPnBwaWQgPSBwaWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBwcm9jZXNzb3JzdG9wKHN0cnVjdCBsb2dkaXIgKmxkKQoreworCWNoYXIgZlsyOF07CisKKwlpZiAobGQtPnBwaWQpIHsKKwkJc2lnX3VuYmxvY2soU0lHSFVQKTsKKwkJd2hpbGUgKHNhZmVfd2FpdHBpZChsZC0+cHBpZCwgJndzdGF0LCAwKSA9PSAtMSkKKwkJCXBhdXNlMmNhbm5vdCgid2FpdCBmb3IgcHJvY2Vzc29yIiwgbGQtPm5hbWUpOworCQlzaWdfYmxvY2soU0lHSFVQKTsKKwkJbGQtPnBwaWQgPSAwOworCX0KKwlpZiAobGQtPmZkZGlyID09IC0xKQorCQlyZXR1cm4gMTsKKwl3aGlsZSAoZmNoZGlyKGxkLT5mZGRpcikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgiY2hhbmdlIGRpcmVjdG9yeSwgd2FudCBwcm9jZXNzb3IiLCBsZC0+bmFtZSk7CisJaWYgKFdFWElUU1RBVFVTKHdzdGF0KSAhPSAwKSB7CisJCXdhcm54KCJwcm9jZXNzb3IgZmFpbGVkLCByZXN0YXJ0IiwgbGQtPm5hbWUpOworCQlsZC0+Zm5zYXZlWzI2XSA9ICd0JzsKKwkJdW5saW5rKGxkLT5mbnNhdmUpOworCQlsZC0+Zm5zYXZlWzI2XSA9ICd1JzsKKwkJcHJvY2Vzc29yc3RhcnQobGQpOworCQl3aGlsZSAoZmNoZGlyKGZkd2RpcikgPT0gLTEpCisJCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCXJldHVybiBsZC0+cHJvY2Vzc29yID8gMCA6IDE7CisJfQorCWxkLT5mbnNhdmVbMjZdID0gJ3QnOworCW1lbWNweShmLCBsZC0+Zm5zYXZlLCAyNik7CisJZlsyNl0gPSAncyc7CisJZlsyN10gPSAnXDAnOworCXdoaWxlIChyZW5hbWUobGQtPmZuc2F2ZSwgZikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgicmVuYW1lIHByb2Nlc3NlZCIsIGxkLT5uYW1lKTsKKwl3aGlsZSAoY2htb2QoZiwgMDc0NCkgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgic2V0IG1vZGUgb2YgcHJvY2Vzc2VkIiwgbGQtPm5hbWUpOworCWxkLT5mbnNhdmVbMjZdID0gJ3UnOworCWlmICh1bmxpbmsobGQtPmZuc2F2ZSkgPT0gLTEpCisJCWJiX2Vycm9yX21zZyhXQVJOSU5HImNhbid0IHVubGluazogJXMvJXMiLCBsZC0+bmFtZSwgbGQtPmZuc2F2ZSk7CisJd2hpbGUgKHJlbmFtZSgibmV3c3RhdGUiLCAic3RhdGUiKSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJyZW5hbWUgc3RhdGUiLCBsZC0+bmFtZSk7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZyhJTkZPInByb2Nlc3NlZDogJXMvJXMiLCBsZC0+bmFtZSwgZik7CisJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJtb2xkZXN0KHN0cnVjdCBsb2dkaXIgKmxkKQoreworCURJUiAqZDsKKwlzdHJ1Y3QgZGlyZW50ICpmOworCWNoYXIgb2xkZXN0W0ZNVF9QVElNRV07CisJaW50IG4gPSAwOworCisJb2xkZXN0WzBdID0gJ0EnOyBvbGRlc3RbMV0gPSBvbGRlc3RbMjddID0gMDsKKwl3aGlsZSAoIShkID0gb3BlbmRpcigiLiIpKSkKKwkJcGF1c2UyY2Fubm90KCJvcGVuIGRpcmVjdG9yeSwgd2FudCByb3RhdGUiLCBsZC0+bmFtZSk7CisJZXJybm8gPSAwOworCXdoaWxlICgoZiA9IHJlYWRkaXIoZCkpKSB7CisJCWlmICgoZi0+ZF9uYW1lWzBdID09ICdAJykgJiYgKHN0cmxlbihmLT5kX25hbWUpID09IDI3KSkgeworCQkJaWYgKGYtPmRfbmFtZVsyNl0gPT0gJ3QnKSB7CisJCQkJaWYgKHVubGluayhmLT5kX25hbWUpID09IC0xKQorCQkJCQl3YXJuMigiY2FuJ3QgdW5saW5rIHByb2Nlc3NvciBsZWZ0b3ZlciIsIGYtPmRfbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCSsrbjsKKwkJCQlpZiAoc3RyY21wKGYtPmRfbmFtZSwgb2xkZXN0KSA8IDApCisJCQkJCW1lbWNweShvbGRlc3QsIGYtPmRfbmFtZSwgMjcpOworCQkJfQorCQkJZXJybm8gPSAwOworCQl9CisJfQorCWlmIChlcnJubykKKwkJd2FybjIoImNhbid0IHJlYWQgZGlyZWN0b3J5IiwgbGQtPm5hbWUpOworCWNsb3NlZGlyKGQpOworCisJaWYgKGxkLT5ubWF4ICYmIChuID4gbGQtPm5tYXgpKSB7CisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKElORk8iZGVsZXRlOiAlcy8lcyIsIGxkLT5uYW1lLCBvbGRlc3QpOworCQlpZiAoKCpvbGRlc3QgPT0gJ0AnKSAmJiAodW5saW5rKG9sZGVzdCkgPT0gLTEpKQorCQkJd2FybjIoImNhbid0IHVubGluayBvbGRlc3QgbG9nZmlsZSIsIGxkLT5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCByb3RhdGUoc3RydWN0IGxvZ2RpciAqbGQpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgbm93OworCisJaWYgKGxkLT5mZGRpciA9PSAtMSkgeworCQlsZC0+cm90YXRlX3BlcmlvZCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAobGQtPnBwaWQpCisJCXdoaWxlICghcHJvY2Vzc29yc3RvcChsZCkpCisJCQljb250aW51ZTsKKworCXdoaWxlIChmY2hkaXIobGQtPmZkZGlyKSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJjaGFuZ2UgZGlyZWN0b3J5LCB3YW50IHJvdGF0ZSIsIGxkLT5uYW1lKTsKKworCS8qIGNyZWF0ZSBuZXcgZmlsZW5hbWUgKi8KKwlsZC0+Zm5zYXZlWzI1XSA9ICcuJzsKKwlsZC0+Zm5zYXZlWzI2XSA9ICdzJzsKKwlpZiAobGQtPnByb2Nlc3NvcikKKwkJbGQtPmZuc2F2ZVsyNl0gPSAndSc7CisJbGQtPmZuc2F2ZVsyN10gPSAnXDAnOworCWRvIHsKKwkJZm10X3RpbWVfYmVybnN0ZWluXzI1KGxkLT5mbnNhdmUpOworCQllcnJubyA9IDA7CisJCXN0YXQobGQtPmZuc2F2ZSwgJnN0KTsKKwl9IHdoaWxlIChlcnJubyAhPSBFTk9FTlQpOworCisJbm93ID0gbW9ub3RvbmljX3NlYygpOworCWlmIChsZC0+cm90YXRlX3BlcmlvZCAmJiBMRVNTKGxkLT5uZXh0X3JvdGF0ZSwgbm93KSkgeworCQlsZC0+bmV4dF9yb3RhdGUgPSBub3cgKyBsZC0+cm90YXRlX3BlcmlvZDsKKwkJaWYgKExFU1MobGQtPm5leHRfcm90YXRlLCBuZWFyZXN0X3JvdGF0ZSkpCisJCQluZWFyZXN0X3JvdGF0ZSA9IGxkLT5uZXh0X3JvdGF0ZTsKKwl9CisKKwlpZiAobGQtPnNpemUgPiAwKSB7CisJCXdoaWxlIChmZmx1c2gobGQtPmZpbGVjdXIpIHx8IGZzeW5jKGxkLT5mZGN1cikgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoImZzeW5jIGN1cnJlbnQgbG9nZmlsZSIsIGxkLT5uYW1lKTsKKwkJd2hpbGUgKGZjaG1vZChsZC0+ZmRjdXIsIDA3NDQpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJzZXQgbW9kZSBvZiBjdXJyZW50IiwgbGQtPm5hbWUpOworCQkvLy8vY2xvc2UobGQtPmZkY3VyKTsKKwkJZmNsb3NlKGxkLT5maWxlY3VyKTsKKworCQlpZiAodmVyYm9zZSkgeworCQkJYmJfZXJyb3JfbXNnKElORk8icmVuYW1lOiAlcy9jdXJyZW50ICVzICV1IiwgbGQtPm5hbWUsCisJCQkJCWxkLT5mbnNhdmUsIGxkLT5zaXplKTsKKwkJfQorCQl3aGlsZSAocmVuYW1lKCJjdXJyZW50IiwgbGQtPmZuc2F2ZSkgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoInJlbmFtZSBjdXJyZW50IiwgbGQtPm5hbWUpOworCQl3aGlsZSAoKGxkLT5mZGN1ciA9IG9wZW4oImN1cnJlbnQiLCBPX1dST05MWXxPX05ERUxBWXxPX0FQUEVORHxPX0NSRUFULCAwNjAwKSkgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoImNyZWF0ZSBuZXcgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJd2hpbGUgKChsZC0+ZmlsZWN1ciA9IGZkb3BlbihsZC0+ZmRjdXIsICJhIikpID09IE5VTEwpIC8vLy8KKwkJCXBhdXNlMmNhbm5vdCgiY3JlYXRlIG5ldyBjdXJyZW50IiwgbGQtPm5hbWUpOyAvKiB2ZXJ5IHVubGlrZWx5ICovCisJCXNldHZidWYobGQtPmZpbGVjdXIsIE5VTEwsIF9JT0ZCRiwgbGluZWxlbik7IC8vLy8KKwkJY2xvc2Vfb25fZXhlY19vbihsZC0+ZmRjdXIpOworCQlsZC0+c2l6ZSA9IDA7CisJCXdoaWxlIChmY2htb2QobGQtPmZkY3VyLCAwNjQ0KSA9PSAtMSkKKwkJCXBhdXNlMmNhbm5vdCgic2V0IG1vZGUgb2YgY3VycmVudCIsIGxkLT5uYW1lKTsKKworCQlybW9sZGVzdChsZCk7CisJCXByb2Nlc3NvcnN0YXJ0KGxkKTsKKwl9CisKKwl3aGlsZSAoZmNoZGlyKGZkd2RpcikgPT0gLTEpCisJCXBhdXNlMWNhbm5vdCgiY2hhbmdlIHRvIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBidWZmZXJfcHdyaXRlKGludCBuLCBjaGFyICpzLCB1bnNpZ25lZCBsZW4pCit7CisJaW50IGk7CisJc3RydWN0IGxvZ2RpciAqbGQgPSAmZGlyW25dOworCisJaWYgKGxkLT5zaXplbWF4KSB7CisJCWlmIChsZC0+c2l6ZSA+PSBsZC0+c2l6ZW1heCkKKwkJCXJvdGF0ZShsZCk7CisJCWlmIChsZW4gPiAobGQtPnNpemVtYXggLSBsZC0+c2l6ZSkpCisJCQlsZW4gPSBsZC0+c2l6ZW1heCAtIGxkLT5zaXplOworCX0KKwl3aGlsZSAoMSkgeworCQkvLy8vaSA9IGZ1bGxfd3JpdGUobGQtPmZkY3VyLCBzLCBsZW4pOworCQkvLy8vaWYgKGkgIT0gLTEpIGJyZWFrOworCQlpID0gZndyaXRlKHMsIDEsIGxlbiwgbGQtPmZpbGVjdXIpOworCQlpZiAoaSA9PSBsZW4pIGJyZWFrOworCisJCWlmICgoZXJybm8gPT0gRU5PU1BDKSAmJiAobGQtPm5taW4gPCBsZC0+bm1heCkpIHsKKwkJCURJUiAqZDsKKwkJCXN0cnVjdCBkaXJlbnQgKmY7CisJCQljaGFyIG9sZGVzdFtGTVRfUFRJTUVdOworCQkJaW50IGogPSAwOworCisJCQl3aGlsZSAoZmNoZGlyKGxkLT5mZGRpcikgPT0gLTEpCisJCQkJcGF1c2UyY2Fubm90KCJjaGFuZ2UgZGlyZWN0b3J5LCB3YW50IHJlbW92ZSBvbGQgbG9nZmlsZSIsCisJCQkJCQkJIGxkLT5uYW1lKTsKKwkJCW9sZGVzdFswXSA9ICdBJzsKKwkJCW9sZGVzdFsxXSA9IG9sZGVzdFsyN10gPSAnXDAnOworCQkJd2hpbGUgKCEoZCA9IG9wZW5kaXIoIi4iKSkpCisJCQkJcGF1c2UyY2Fubm90KCJvcGVuIGRpcmVjdG9yeSwgd2FudCByZW1vdmUgb2xkIGxvZ2ZpbGUiLAorCQkJCQkJCSBsZC0+bmFtZSk7CisJCQllcnJubyA9IDA7CisJCQl3aGlsZSAoKGYgPSByZWFkZGlyKGQpKSkKKwkJCQlpZiAoKGYtPmRfbmFtZVswXSA9PSAnQCcpICYmIChzdHJsZW4oZi0+ZF9uYW1lKSA9PSAyNykpIHsKKwkJCQkJKytqOworCQkJCQlpZiAoc3RyY21wKGYtPmRfbmFtZSwgb2xkZXN0KSA8IDApCisJCQkJCQltZW1jcHkob2xkZXN0LCBmLT5kX25hbWUsIDI3KTsKKwkJCQl9CisJCQlpZiAoZXJybm8pIHdhcm4yKCJjYW4ndCByZWFkIGRpcmVjdG9yeSwgd2FudCByZW1vdmUgb2xkIGxvZ2ZpbGUiLAorCQkJCQlsZC0+bmFtZSk7CisJCQljbG9zZWRpcihkKTsKKwkJCWVycm5vID0gRU5PU1BDOworCQkJaWYgKGogPiBsZC0+bm1pbikgeworCQkJCWlmICgqb2xkZXN0ID09ICdAJykgeworCQkJCQliYl9lcnJvcl9tc2coV0FSTklORyJvdXQgb2YgZGlzayBzcGFjZSwgZGVsZXRlOiAlcy8lcyIsCisJCQkJCQkJbGQtPm5hbWUsIG9sZGVzdCk7CisJCQkJCWVycm5vID0gMDsKKwkJCQkJaWYgKHVubGluayhvbGRlc3QpID09IC0xKSB7CisJCQkJCQl3YXJuMigiY2FuJ3QgdW5saW5rIG9sZGVzdCBsb2dmaWxlIiwgbGQtPm5hbWUpOworCQkJCQkJZXJybm8gPSBFTk9TUEM7CisJCQkJCX0KKwkJCQkJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQkJCQkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZXJybm8pCisJCQlwYXVzZTJjYW5ub3QoIndyaXRlIHRvIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJfQorCisJbGQtPnNpemUgKz0gaTsKKwlpZiAobGQtPnNpemVtYXgpCisJCWlmIChzW2ktMV0gPT0gJ1xuJykKKwkJCWlmIChsZC0+c2l6ZSA+PSAobGQtPnNpemVtYXggLSBsaW5lbWF4KSkKKwkJCQlyb3RhdGUobGQpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBsb2dkaXJfY2xvc2Uoc3RydWN0IGxvZ2RpciAqbGQpCit7CisJaWYgKGxkLT5mZGRpciA9PSAtMSkKKwkJcmV0dXJuOworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJjbG9zZTogJXMiLCBsZC0+bmFtZSk7CisJY2xvc2UobGQtPmZkZGlyKTsKKwlsZC0+ZmRkaXIgPSAtMTsKKwlpZiAobGQtPmZkY3VyID09IC0xKQorCQlyZXR1cm47IC8qIGltcG9zc2libGUgKi8KKwl3aGlsZSAoZmZsdXNoKGxkLT5maWxlY3VyKSB8fCBmc3luYyhsZC0+ZmRjdXIpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoImZzeW5jIGN1cnJlbnQgbG9nZmlsZSIsIGxkLT5uYW1lKTsKKwl3aGlsZSAoZmNobW9kKGxkLT5mZGN1ciwgMDc0NCkgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgic2V0IG1vZGUgb2YgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkvLy8vY2xvc2UobGQtPmZkY3VyKTsKKwlmY2xvc2UobGQtPmZpbGVjdXIpOworCWxkLT5mZGN1ciA9IC0xOworCWlmIChsZC0+ZmRsb2NrID09IC0xKQorCQlyZXR1cm47IC8qIGltcG9zc2libGUgKi8KKwljbG9zZShsZC0+ZmRsb2NrKTsKKwlsZC0+ZmRsb2NrID0gLTE7CisJZnJlZShsZC0+cHJvY2Vzc29yKTsKKwlsZC0+cHJvY2Vzc29yID0gTlVMTDsKK30KKworc3RhdGljIE5PSU5MSU5FIHVuc2lnbmVkIGxvZ2Rpcl9vcGVuKHN0cnVjdCBsb2dkaXIgKmxkLCBjb25zdCBjaGFyICpmbikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCXVuc2lnbmVkIG5vdzsKKwljaGFyICpuZXcsICpzLCAqbnA7CisJaW50IGk7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlub3cgPSBtb25vdG9uaWNfc2VjKCk7CisKKwlsZC0+ZmRkaXIgPSBvcGVuKGZuLCBPX1JET05MWXxPX05ERUxBWSk7CisJaWYgKGxkLT5mZGRpciA9PSAtMSkgeworCQl3YXJuMigiY2FuJ3Qgb3BlbiBsb2cgZGlyZWN0b3J5IiwgKGNoYXIqKWZuKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlX29uX2V4ZWNfb24obGQtPmZkZGlyKTsKKwlpZiAoZmNoZGlyKGxkLT5mZGRpcikgPT0gLTEpIHsKKwkJbG9nZGlyX2Nsb3NlKGxkKTsKKwkJd2FybjIoImNhbid0IGNoYW5nZSBkaXJlY3RvcnkiLCAoY2hhciopZm4pOworCQlyZXR1cm4gMDsKKwl9CisJbGQtPmZkbG9jayA9IG9wZW4oImxvY2siLCBPX1dST05MWXxPX05ERUxBWXxPX0FQUEVORHxPX0NSRUFULCAwNjAwKTsKKwlpZiAoKGxkLT5mZGxvY2sgPT0gLTEpCisJIHx8IChmbG9jayhsZC0+ZmRsb2NrLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gLTEpCisJKSB7CisJCWxvZ2Rpcl9jbG9zZShsZCk7CisJCXdhcm4yKCJjYW4ndCBsb2NrIGRpcmVjdG9yeSIsIChjaGFyKilmbik7CisJCXdoaWxlIChmY2hkaXIoZmR3ZGlyKSA9PSAtMSkKKwkJCXBhdXNlMWNhbm5vdCgiY2hhbmdlIHRvIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkiKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlX29uX2V4ZWNfb24obGQtPmZkbG9jayk7CisKKwlsZC0+c2l6ZSA9IDA7CisJbGQtPnNpemVtYXggPSAxMDAwMDAwOworCWxkLT5ubWF4ID0gbGQtPm5taW4gPSAxMDsKKwlsZC0+cm90YXRlX3BlcmlvZCA9IDA7CisJbGQtPm5hbWUgPSAoY2hhciopZm47CisJbGQtPnBwaWQgPSAwOworCWxkLT5tYXRjaCA9ICcrJzsKKwlmcmVlKGxkLT5pbnN0KTsgbGQtPmluc3QgPSBOVUxMOworCWZyZWUobGQtPnByb2Nlc3Nvcik7IGxkLT5wcm9jZXNzb3IgPSBOVUxMOworCisJLyogcmVhZCBjb25maWcgKi8KKwlpID0gb3Blbl9yZWFkX2Nsb3NlKCJjb25maWciLCBidWYsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkKKwkJYmJfcGVycm9yX21zZyhXQVJOSU5HIiVzL2NvbmZpZyIsIGxkLT5uYW1lKTsKKwlpZiAoaSA+IDApIHsKKwkJYnVmW2ldID0gJ1wwJzsKKwkJaWYgKHZlcmJvc2UpCisJCQliYl9lcnJvcl9tc2coSU5GTyJyZWFkOiAlcy9jb25maWciLCBsZC0+bmFtZSk7CisJCXMgPSBidWY7CisJCXdoaWxlIChzKSB7CisJCQlucCA9IHN0cmNocihzLCAnXG4nKTsKKwkJCWlmIChucCkKKwkJCQkqbnArKyA9ICdcMCc7CisJCQlzd2l0Y2ggKHNbMF0pIHsKKwkJCWNhc2UgJysnOgorCQkJY2FzZSAnLSc6CisJCQljYXNlICdlJzoKKwkJCWNhc2UgJ0UnOgorCQkJCS8qIEZpbHRlcmluZyByZXF1aXJlcyBvbmUtbGluZSBidWZmZXJpbmcsCisJCQkJICogcmVzZXR0aW5nIHRoZSAiZmluZCBuZXdsaW5lIiBmdW5jdGlvbgorCQkJCSAqIGFjY29yZGluZ2x5ICovCisJCQkJbWVtUmNociA9IG1lbWNocjsKKwkJCQkvKiBBZGQgJ1xuJy10ZXJtaW5hdGVkIGxpbmUgdG8gbGQtPmluc3QgKi8KKwkJCQl3aGlsZSAoMSkgeworCQkJCQlpbnQgbCA9IGFzcHJpbnRmKCZuZXcsICIlcyVzXG4iLCBsZC0+aW5zdCA/IGxkLT5pbnN0IDogIiIsIHMpOworCQkJCQlpZiAobCA+PSAwICYmIG5ldykKKwkJCQkJCWJyZWFrOworCQkJCQlwYXVzZV9ub21lbSgpOworCQkJCX0KKwkJCQlmcmVlKGxkLT5pbnN0KTsKKwkJCQlsZC0+aW5zdCA9IG5ldzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOiB7CisJCQkJc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBrbV9zdWZmaXhlc1tdID0geworCQkJCQl7ICJrIiwgMTAyNCB9LAorCQkJCQl7ICJtIiwgMTAyNCoxMDI0IH0sCisJCQkJCXsgIiIsIDAgfQorCQkJCX07CisJCQkJbGQtPnNpemVtYXggPSB4YXRvdV9zZngoJnNbMV0sIGttX3N1ZmZpeGVzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ24nOgorCQkJCWxkLT5ubWF4ID0geGF0b2lfcG9zaXRpdmUoJnNbMV0pOworCQkJCWJyZWFrOworCQkJY2FzZSAnTic6CisJCQkJbGQtPm5taW4gPSB4YXRvaV9wb3NpdGl2ZSgmc1sxXSk7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzogeworCQkJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgbWhfc3VmZml4ZXNbXSA9IHsKKwkJCQkJeyAibSIsIDYwIH0sCisJCQkJCXsgImgiLCA2MCo2MCB9LAorCQkJCQkvKnsgImQiLCAyNCo2MCo2MCB9LCovCisJCQkJCXsgIiIsIDAgfQorCQkJCX07CisJCQkJbGQtPnJvdGF0ZV9wZXJpb2QgPSB4YXRvdV9zZngoJnNbMV0sIG1oX3N1ZmZpeGVzKTsKKwkJCQlpZiAobGQtPnJvdGF0ZV9wZXJpb2QpIHsKKwkJCQkJbGQtPm5leHRfcm90YXRlID0gbm93ICsgbGQtPnJvdGF0ZV9wZXJpb2Q7CisJCQkJCWlmICghdG1heGZsYWcgfHwgTEVTUyhsZC0+bmV4dF9yb3RhdGUsIG5lYXJlc3Rfcm90YXRlKSkKKwkJCQkJCW5lYXJlc3Rfcm90YXRlID0gbGQtPm5leHRfcm90YXRlOworCQkJCQl0bWF4ZmxhZyA9IDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAnISc6CisJCQkJaWYgKHNbMV0pIHsKKwkJCQkJZnJlZShsZC0+cHJvY2Vzc29yKTsKKwkJCQkJbGQtPnByb2Nlc3NvciA9IHdzdHJkdXAocyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJcyA9IG5wOworCQl9CisJCS8qIENvbnZlcnQgImFhXG5iYlxuY2NcblwwIiB0byAiYWFcMGJiXDBjY1wwXDAiICovCisJCXMgPSBsZC0+aW5zdDsKKwkJd2hpbGUgKHMpIHsKKwkJCW5wID0gc3RyY2hyKHMsICdcbicpOworCQkJaWYgKG5wKQorCQkJCSpucCsrID0gJ1wwJzsKKwkJCXMgPSBucDsKKwkJfQorCX0KKworCS8qIG9wZW4gY3VycmVudCAqLworCWkgPSBzdGF0KCJjdXJyZW50IiwgJnN0KTsKKwlpZiAoaSAhPSAtMSkgeworCQlpZiAoc3Quc3Rfc2l6ZSAmJiAhKHN0LnN0X21vZGUgJiBTX0lYVVNSKSkgeworCQkJbGQtPmZuc2F2ZVsyNV0gPSAnLic7CisJCQlsZC0+Zm5zYXZlWzI2XSA9ICd1JzsKKwkJCWxkLT5mbnNhdmVbMjddID0gJ1wwJzsKKwkJCWRvIHsKKwkJCQlmbXRfdGltZV9iZXJuc3RlaW5fMjUobGQtPmZuc2F2ZSk7CisJCQkJZXJybm8gPSAwOworCQkJCXN0YXQobGQtPmZuc2F2ZSwgJnN0KTsKKwkJCX0gd2hpbGUgKGVycm5vICE9IEVOT0VOVCk7CisJCQl3aGlsZSAocmVuYW1lKCJjdXJyZW50IiwgbGQtPmZuc2F2ZSkgPT0gLTEpCisJCQkJcGF1c2UyY2Fubm90KCJyZW5hbWUgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJCXJtb2xkZXN0KGxkKTsKKwkJCWkgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN0LnN0X3NpemUgY2FuIGJlIG5vdCBqdXN0IGJpZ2dlciwgYnV0IFdJREVSIQorCQkJICogVGhpcyBjb2RlIGlzIHNhZmU6IGlmIHN0LnN0X3NpemUgPiA0R0IsIHdlIHNlbGVjdAorCQkJICogbGQtPnNpemVtYXggKGJlY2F1c2UgaXQncyAidW5zaWduZWQiKSAqLworCQkJbGQtPnNpemUgPSAoc3Quc3Rfc2l6ZSA+IGxkLT5zaXplbWF4KSA/IGxkLT5zaXplbWF4IDogc3Quc3Rfc2l6ZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWxvZ2Rpcl9jbG9zZShsZCk7CisJCQl3YXJuMigiY2FuJ3Qgc3RhdCBjdXJyZW50IiwgbGQtPm5hbWUpOworCQkJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQkJCXBhdXNlMWNhbm5vdCgiY2hhbmdlIHRvIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXdoaWxlICgobGQtPmZkY3VyID0gb3BlbigiY3VycmVudCIsIE9fV1JPTkxZfE9fTkRFTEFZfE9fQVBQRU5EfE9fQ1JFQVQsIDA2MDApKSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJvcGVuIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJd2hpbGUgKChsZC0+ZmlsZWN1ciA9IGZkb3BlbihsZC0+ZmRjdXIsICJhIikpID09IE5VTEwpCisJCXBhdXNlMmNhbm5vdCgib3BlbiBjdXJyZW50IiwgbGQtPm5hbWUpOyAvLy8vCisJc2V0dmJ1ZihsZC0+ZmlsZWN1ciwgTlVMTCwgX0lPRkJGLCBsaW5lbGVuKTsgLy8vLworCisJY2xvc2Vfb25fZXhlY19vbihsZC0+ZmRjdXIpOworCXdoaWxlIChmY2htb2QobGQtPmZkY3VyLCAwNjQ0KSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJzZXQgbW9kZSBvZiBjdXJyZW50IiwgbGQtPm5hbWUpOworCisJaWYgKHZlcmJvc2UpIHsKKwkJaWYgKGkgPT0gMCkgYmJfZXJyb3JfbXNnKElORk8iYXBwZW5kOiAlcy9jdXJyZW50IiwgbGQtPm5hbWUpOworCQllbHNlIGJiX2Vycm9yX21zZyhJTkZPIm5ldzogJXMvY3VycmVudCIsIGxkLT5uYW1lKTsKKwl9CisKKwl3aGlsZSAoZmNoZGlyKGZkd2RpcikgPT0gLTEpCisJCXBhdXNlMWNhbm5vdCgiY2hhbmdlIHRvIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbG9nZGlyc19yZW9wZW4odm9pZCkKK3sKKwlpbnQgbDsKKwlpbnQgb2sgPSAwOworCisJdG1heGZsYWcgPSAwOworCWZvciAobCA9IDA7IGwgPCBkaXJuOyArK2wpIHsKKwkJbG9nZGlyX2Nsb3NlKCZkaXJbbF0pOworCQlpZiAobG9nZGlyX29wZW4oJmRpcltsXSwgZm5kaXJbbF0pKQorCQkJb2sgPSAxOworCX0KKwlpZiAoIW9rKQorCQlmYXRhbHgoIm5vIGZ1bmN0aW9uYWwgbG9nIGRpcmVjdG9yaWVzIik7Cit9CisKKy8qIFdpbGwgbG9vayBnb29kIGluIGxpYmJiIG9uZSBkYXkgKi8KK3N0YXRpYyBzc2l6ZV90IG5kZWxheV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKCEoZmxfZmxhZ18wICYgT19OT05CTE9DSykpCisJCWZjbnRsKGZkLCBGX1NFVEZMLCBmbF9mbGFnXzAgfCBPX05PTkJMT0NLKTsKKwljb3VudCA9IHNhZmVfcmVhZChmZCwgYnVmLCBjb3VudCk7CisJaWYgKCEoZmxfZmxhZ18wICYgT19OT05CTE9DSykpCisJCWZjbnRsKGZkLCBGX1NFVEZMLCBmbF9mbGFnXzApOworCXJldHVybiBjb3VudDsKK30KKworLyogVXNlZCBmb3IgcmVhZGluZyBzdGRpbiAqLworc3RhdGljIGludCBidWZmZXJfcHJlYWQoLyppbnQgZmQsICovY2hhciAqcywgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIG5vdzsKKwlzdHJ1Y3QgcG9sbGZkIGlucHV0OworCWludCBpOworCisJaW5wdXQuZmQgPSBTVERJTl9GSUxFTk87CisJaW5wdXQuZXZlbnRzID0gUE9MTElOOworCisJZG8geworCQlpZiAocm90YXRlYXNhcCkgeworCQkJZm9yIChpID0gMDsgaSA8IGRpcm47ICsraSkKKwkJCQlyb3RhdGUoZGlyICsgaSk7CisJCQlyb3RhdGVhc2FwID0gMDsKKwkJfQorCQlpZiAoZXhpdGFzYXApIHsKKwkJCWlmIChsaW5lY29tcGxldGUpCisJCQkJcmV0dXJuIDA7CisJCQlsZW4gPSAxOworCQl9CisJCWlmIChyZW9wZW5hc2FwKSB7CisJCQlsb2dkaXJzX3Jlb3BlbigpOworCQkJcmVvcGVuYXNhcCA9IDA7CisJCX0KKwkJbm93ID0gbW9ub3RvbmljX3NlYygpOworCQluZWFyZXN0X3JvdGF0ZSA9IG5vdyArICg0NSAqIDYwICsgNDUpOworCQlmb3IgKGkgPSAwOyBpIDwgZGlybjsgKytpKSB7CisJCQlpZiAoZGlyW2ldLnJvdGF0ZV9wZXJpb2QpIHsKKwkJCQlpZiAoTEVTUyhkaXJbaV0ubmV4dF9yb3RhdGUsIG5vdykpCisJCQkJCXJvdGF0ZShkaXIgKyBpKTsKKwkJCQlpZiAoTEVTUyhkaXJbaV0ubmV4dF9yb3RhdGUsIG5lYXJlc3Rfcm90YXRlKSkKKwkJCQkJbmVhcmVzdF9yb3RhdGUgPSBkaXJbaV0ubmV4dF9yb3RhdGU7CisJCQl9CisJCX0KKworCQlzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywgJmJsb2NrZWRfc2lnc2V0LCBOVUxMKTsKKwkJaSA9IG5lYXJlc3Rfcm90YXRlIC0gbm93OworCQlpZiAoaSA+IDEwMDAwMDApCisJCQlpID0gMTAwMDAwMDsKKwkJaWYgKGkgPD0gMCkKKwkJCWkgPSAxOworCQlwb2xsKCZpbnB1dCwgMSwgaSAqIDEwMDApOworCQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZibG9ja2VkX3NpZ3NldCwgTlVMTCk7CisKKwkJaSA9IG5kZWxheV9yZWFkKFNURElOX0ZJTEVOTywgcywgbGVuKTsKKwkJaWYgKGkgPj0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikgeworCQkJd2FybigiY2FuJ3QgcmVhZCBzdGFuZGFyZCBpbnB1dCIpOworCQkJYnJlYWs7CisJCX0KKwkJLyogZWxzZTogRUFHQUlOIC0gbm9ybWFsLCByZXBlYXQgc2lsZW50bHkgKi8KKwl9IHdoaWxlICghZXhpdGFzYXApOworCisJaWYgKGkgPiAwKSB7CisJCWludCBjbnQ7CisJCWxpbmVjb21wbGV0ZSA9IChzW2ktMV0gPT0gJ1xuJyk7CisJCWlmICghcmVwbCkKKwkJCXJldHVybiBpOworCisJCWNudCA9IGk7CisJCXdoaWxlICgtLWNudCA+PSAwKSB7CisJCQljaGFyIGNoID0gKnM7CisJCQlpZiAoY2ggIT0gJ1xuJykgeworCQkJCWlmIChjaCA8IDMyIHx8IGNoID4gMTI2KQorCQkJCQkqcyA9IHJlcGw7CisJCQkJZWxzZSB7CisJCQkJCWludCBqOworCQkJCQlmb3IgKGogPSAwOyByZXBsYWNlW2pdOyArK2opIHsKKwkJCQkJCWlmIChjaCA9PSByZXBsYWNlW2pdKSB7CisJCQkJCQkJKnMgPSByZXBsOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcysrOworCQl9CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBzaWdfdGVybV9oYW5kbGVyKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJzaWclcyByZWNlaXZlZCIsICJ0ZXJtIik7CisJZXhpdGFzYXAgPSAxOworfQorCitzdGF0aWMgdm9pZCBzaWdfY2hpbGRfaGFuZGxlcihpbnQgc2lnX25vIFVOVVNFRF9QQVJBTSkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IGw7CisKKwlpZiAodmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKElORk8ic2lnJXMgcmVjZWl2ZWQiLCAiY2hpbGQiKTsKKwl3aGlsZSAoKHBpZCA9IHdhaXRfYW55X25vaGFuZygmd3N0YXQpKSA+IDApIHsKKwkJZm9yIChsID0gMDsgbCA8IGRpcm47ICsrbCkgeworCQkJaWYgKGRpcltsXS5wcGlkID09IHBpZCkgeworCQkJCWRpcltsXS5wcGlkID0gMDsKKwkJCQlwcm9jZXNzb3JzdG9wKCZkaXJbbF0pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzaWdfYWxhcm1faGFuZGxlcihpbnQgc2lnX25vIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAodmVyYm9zZSkKKwkJYmJfZXJyb3JfbXNnKElORk8ic2lnJXMgcmVjZWl2ZWQiLCAiYWxhcm0iKTsKKwlyb3RhdGVhc2FwID0gMTsKK30KKworc3RhdGljIHZvaWQgc2lnX2hhbmd1cF9oYW5kbGVyKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJzaWclcyByZWNlaXZlZCIsICJoYW5ndXAiKTsKKwlyZW9wZW5hc2FwID0gMTsKK30KKworc3RhdGljIHZvaWQgbG9nbWF0Y2goc3RydWN0IGxvZ2RpciAqbGQpCit7CisJY2hhciAqczsKKworCWxkLT5tYXRjaCA9ICcrJzsKKwlsZC0+bWF0Y2hlcnIgPSAnRSc7CisJcyA9IGxkLT5pbnN0OworCXdoaWxlIChzICYmIHNbMF0pIHsKKwkJc3dpdGNoIChzWzBdKSB7CisJCWNhc2UgJysnOgorCQljYXNlICctJzoKKwkJCWlmIChwbWF0Y2gocysxLCBsaW5lLCBsaW5lbGVuKSkKKwkJCQlsZC0+bWF0Y2ggPSBzWzBdOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQljYXNlICdFJzoKKwkJCWlmIChwbWF0Y2gocysxLCBsaW5lLCBsaW5lbGVuKSkKKwkJCQlsZC0+bWF0Y2hlcnIgPSBzWzBdOworCQkJYnJlYWs7CisJCX0KKwkJcyArPSBzdHJsZW4ocykgKyAxOworCX0KK30KKworaW50IHN2bG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3Zsb2dkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnIsICpsLCAqYjsKKwlzc2l6ZV90IHN0ZGluX2NudCA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgb3B0OworCXVuc2lnbmVkIHRpbWVzdGFtcCA9IDA7CisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInR0OnZ2IjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicjpSOmw6Yjp0diIsCisJCQkmciwgJnJlcGxhY2UsICZsLCAmYiwgJnRpbWVzdGFtcCwgJnZlcmJvc2UpOworCWlmIChvcHQgJiAxKSB7IC8vIC1yCisJCXJlcGwgPSByWzBdOworCQlpZiAoIXJlcGwgfHwgclsxXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisJaWYgKG9wdCAmIDIpIGlmICghcmVwbCkgcmVwbCA9ICdfJzsgLy8gLVIKKwlpZiAob3B0ICYgNCkgeyAvLyAtbAorCQlsaW5lbWF4ID0geGF0b3VfcmFuZ2UobCwgMCwgQlVGU0laLTI2KTsKKwkJaWYgKGxpbmVtYXggPT0gMCkKKwkJCWxpbmVtYXggPSBCVUZTSVotMjY7CisJCWlmIChsaW5lbWF4IDwgMjU2KQorCQkJbGluZW1heCA9IDI1NjsKKwl9CisJLy8vL2lmIChvcHQgJiA4KSB7IC8vIC1iCisJLy8vLwlidWZsZW4gPSB4YXRvaV9wb3NpdGl2ZShiKTsKKwkvLy8vCWlmIChidWZsZW4gPT0gMCkgYnVmbGVuID0gMTAyNDsKKwkvLy8vfQorCS8vaWYgKG9wdCAmIDB4MTApIHRpbWVzdGFtcCsrOyAvLyAtdAorCS8vaWYgKG9wdCAmIDB4MjApIHZlcmJvc2UrKzsgLy8gLXYKKwkvL2lmICh0aW1lc3RhbXAgPiAyKSB0aW1lc3RhbXAgPSAyOworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJZGlybiA9IGFyZ2M7CisJaWYgKGRpcm4gPD0gMCkKKwkJYmJfc2hvd191c2FnZSgpOworCS8vLy9pZiAoYnVmbGVuIDw9IGxpbmVtYXgpIGJiX3Nob3dfdXNhZ2UoKTsKKwlmZHdkaXIgPSB4b3BlbigiLiIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwljbG9zZV9vbl9leGVjX29uKGZkd2Rpcik7CisJZGlyID0geHphbGxvYyhkaXJuICogc2l6ZW9mKGRpclswXSkpOworCWZvciAoaSA9IDA7IGkgPCBkaXJuOyArK2kpIHsKKwkJZGlyW2ldLmZkZGlyID0gLTE7CisJCWRpcltpXS5mZGN1ciA9IC0xOworCQkvLy8vZGlyW2ldLmJ0bXAgPSB4bWFsbG9jKGJ1Zmxlbik7CisJCS8qZGlyW2ldLnBwaWQgPSAwOyovCisJfQorCS8qIGxpbmUgPSB4bWFsbG9jKGxpbmVtYXggKyAodGltZXN0YW1wID8gMjYgOiAwKSk7ICovCisJZm5kaXIgPSBhcmd2OworCS8qIFdlIGNhbm5vdCBzZXQgTk9OQkxPQ0sgb24gZmQgIzAgcGVybWFuZW50bHkgLSB0aGlzIHNldHRpbmcKKwkgKiBfaXNuJ3RfIHBlci1wcm9jZXNzISBJdCBpcyBzaGFyZWQgYW1vbmcgYWxsIG90aGVyIHByb2Nlc3NlcworCSAqIHdpdGggdGhlIHNhbWUgc3RkaW4gKi8KKwlmbF9mbGFnXzAgPSBmY250bCgwLCBGX0dFVEZMKTsKKworCXNpZ2VtcHR5c2V0KCZibG9ja2VkX3NpZ3NldCk7CisJc2lnYWRkc2V0KCZibG9ja2VkX3NpZ3NldCwgU0lHVEVSTSk7CisJc2lnYWRkc2V0KCZibG9ja2VkX3NpZ3NldCwgU0lHQ0hMRCk7CisJc2lnYWRkc2V0KCZibG9ja2VkX3NpZ3NldCwgU0lHQUxSTSk7CisJc2lnYWRkc2V0KCZibG9ja2VkX3NpZ3NldCwgU0lHSFVQKTsKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZibG9ja2VkX3NpZ3NldCwgTlVMTCk7CisJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KDEgPDwgU0lHVEVSTSwgc2lnX3Rlcm1faGFuZGxlcik7CisJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KDEgPDwgU0lHQ0hMRCwgc2lnX2NoaWxkX2hhbmRsZXIpOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR0FMUk0sIHNpZ19hbGFybV9oYW5kbGVyKTsKKwliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMSA8PCBTSUdIVVAsIHNpZ19oYW5ndXBfaGFuZGxlcik7CisKKwkvKiBXaXRob3V0IHRpbWVzdGFtcHMsIHdlIGRvbid0IGhhdmUgdG8gcHJpbnQgZWFjaCBsaW5lCisJICogc2VwYXJhdGVseSwgc28gd2UgY2FuIGxvb2sgZm9yIF9sYXN0XyBuZXdsaW5lLCBub3QgZmlyc3QsCisJICogdGh1cyBiYXRjaGluZyB3cml0ZXMuIElmIGZpbHRlcmluZyBpcyBlbmFibGVkIGluIGNvbmZpZywKKwkgKiBsb2dkaXJzX3Jlb3BlbiByZXNldHMgaXQgdG8gbWVtY2hyLgorCSAqLworCW1lbVJjaHIgPSAodGltZXN0YW1wID8gbWVtY2hyIDogbWVtcmNocik7CisKKwlsb2dkaXJzX3Jlb3BlbigpOworCisJc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT0ZCRiwgbGluZWxlbik7CisKKwkvKiBFYWNoIGl0ZXJhdGlvbiBwcm9jZXNzZXMgb25lIG9yIG1vcmUgbGluZXMgKi8KKwl3aGlsZSAoMSkgeworCQljaGFyIHN0YW1wW0ZNVF9QVElNRV07CisJCWNoYXIgKmxpbmVwdHI7CisJCWNoYXIgKnByaW50cHRyOworCQljaGFyICpucDsKKwkJaW50IHByaW50bGVuOworCQljaGFyIGNoOworCisJCWxpbmVwdHIgPSBsaW5lOworCQlpZiAodGltZXN0YW1wKQorCQkJbGluZXB0ciArPSAyNjsKKworCQkvKiBsaW5lcHRyWzAuLmxpbmVtYXgtMV0gLSBidWZmZXIgZm9yIHN0ZGluICovCisJCS8qIChwb3NzaWJseSBoYXMgc29tZSB1bnByb2Nlc3NlZCBkYXRhIGZyb20gcHJldiBsb29wKSAqLworCisJCS8qIFJlZmlsbCB0aGUgYnVmZmVyIGlmIG5lZWRlZCAqLworCQlucCA9IG1lbVJjaHIobGluZXB0ciwgJ1xuJywgc3RkaW5fY250KTsKKwkJaWYgKCFucCAmJiAhZXhpdGFzYXApIHsKKwkJCWkgPSBsaW5lbWF4IC0gc3RkaW5fY250OyAvKiBhdmFpbC4gYnl0ZXMgYXQgdGFpbCAqLworCQkJaWYgKGkgPj0gMTI4KSB7CisJCQkJaSA9IGJ1ZmZlcl9wcmVhZCgvKjAsICovbGluZXB0ciArIHN0ZGluX2NudCwgaSk7CisJCQkJaWYgKGkgPD0gMCkgLyogRU9GIG9yIGVycm9yIG9uIHN0ZGluICovCisJCQkJCWV4aXRhc2FwID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJbnAgPSBtZW1SY2hyKGxpbmVwdHIgKyBzdGRpbl9jbnQsICdcbicsIGkpOworCQkJCQlzdGRpbl9jbnQgKz0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHN0ZGluX2NudCA8PSAwICYmIGV4aXRhc2FwKQorCQkJYnJlYWs7CisKKwkJLyogU2VhcmNoIGZvciAnXG4nIChpbiBmYWN0LCBucCBhbHJlYWR5IGhvbGRzIHRoZSByZXN1bHQpICovCisJCWxpbmVsZW4gPSBzdGRpbl9jbnQ7CisJCWlmIChucCkgeworIHByaW50X3RvX25sOgorCQkJLyogTkI6IHN0YXJ0aW5nIGZyb20gaGVyZSBsaW5lcHRyIG1heSBwb2ludAorCQkJICogZmFydGhlciBvdXQgaW50byBsaW5lW10gKi8KKwkJCWxpbmVsZW4gPSBucCAtIGxpbmVwdHIgKyAxOworCQl9CisJCS8qIGxpbmVsZW4gPT0gbm8gb2YgY2hhcnMgaW5jbC4gJ1xuJyAob3IgPT0gc3RkaW5fY250KSAqLworCQljaCA9IGxpbmVwdHJbbGluZWxlbi0xXTsKKworCQkvKiBCaWdnZXN0IHBlcmZvcm1hbmNlIGhpdCB3YXMgY29taW5nIGZyb20gdGhlIGZhY3QKKwkJICogdGhhdCB3ZSBkaWQgbm90IGJ1ZmZlciB3cml0ZXMuIFdlIHdlcmUgcmVhZGluZyBtYW55IGxpbmVzCisJCSAqIGluIG9uZSByZWFkKCkgYWJvdmUsIGJ1dCB3cm90ZSBvbmUgbGluZSBwZXIgd3JpdGUoKS4KKwkJICogV2UgYXJlIHVzaW5nIHN0ZGlvIHRvIGZpeCB0aGF0ICovCisKKwkJLyogd3JpdGUgb3V0IGxpbmVwdHJbMC4ubGluZWxlbi0xXSB0byBlYWNoIGxvZyBkZXN0aW5hdGlvbgorCQkgKiAob3IgbGluZXB0clstMjYuLmxpbmVsZW4tMV0gaWYgdGltZXN0YW1waW5nKSAqLworCQlwcmludGxlbiA9IGxpbmVsZW47CisJCXByaW50cHRyID0gbGluZXB0cjsKKwkJaWYgKHRpbWVzdGFtcCkgeworCQkJaWYgKHRpbWVzdGFtcCA9PSAxKQorCQkJCWZtdF90aW1lX2Jlcm5zdGVpbl8yNShzdGFtcCk7CisJCQllbHNlIC8qIDI6ICovCisJCQkJZm10X3RpbWVfaHVtYW5fMzBudWwoc3RhbXApOworCQkJcHJpbnRsZW4gKz0gMjY7CisJCQlwcmludHB0ciAtPSAyNjsKKwkJCW1lbWNweShwcmludHB0ciwgc3RhbXAsIDI1KTsKKwkJCXByaW50cHRyWzI1XSA9ICcgJzsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgZGlybjsgKytpKSB7CisJCQlzdHJ1Y3QgbG9nZGlyICpsZCA9ICZkaXJbaV07CisJCQlpZiAobGQtPmZkZGlyID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxkLT5pbnN0KQorCQkJCWxvZ21hdGNoKGxkKTsKKwkJCWlmIChsZC0+bWF0Y2hlcnIgPT0gJ2UnKSB7CisJCQkJLyogcnVuaXQtMS44LjAgY29tcGF0OiBpZiB0aW1lc3RhbXBpbmcsIGRvIGl0IG9uIHN0ZGVyciB0b28gKi8KKwkJCQkvLy8vZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBwcmludHB0ciwgcHJpbnRsZW4pOworCQkJCWZ3cml0ZShwcmludHB0ciwgMSwgcHJpbnRsZW4sIHN0ZGVycik7CisJCQl9CisJCQlpZiAobGQtPm1hdGNoICE9ICcrJykKKwkJCQljb250aW51ZTsKKwkJCWJ1ZmZlcl9wd3JpdGUoaSwgcHJpbnRwdHIsIHByaW50bGVuKTsKKwkJfQorCisJCS8qIElmIHdlIGRpZG4ndCBzZWUgJ1xuJyAobG9uZyBpbnB1dCBsaW5lKSwgKi8KKwkJLyogcmVhZC93cml0ZSByZXBlYXRlZGx5IHVudGlsIHdlIHNlZSBpdCAqLworCQl3aGlsZSAoY2ggIT0gJ1xuJykgeworCQkJLyogbGluZXB0ciBpcyBlbXB0aWVkIG5vdywgc2FmZSB0byB1c2UgYXMgYnVmZmVyICovCisJCQlzdGRpbl9jbnQgPSBleGl0YXNhcCA/IC0xIDogYnVmZmVyX3ByZWFkKC8qMCwgKi9saW5lcHRyLCBsaW5lbWF4KTsKKwkJCWlmIChzdGRpbl9jbnQgPD0gMCkgeyAvKiBFT0Ygb3IgZXJyb3Igb24gc3RkaW4gKi8KKwkJCQlleGl0YXNhcCA9IDE7CisJCQkJbGluZXB0clswXSA9IGNoID0gJ1xuJzsKKwkJCQlsaW5lbGVuID0gMTsKKwkJCQlzdGRpbl9jbnQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlsaW5lbGVuID0gc3RkaW5fY250OworCQkJCW5wID0gbWVtUmNocihsaW5lcHRyLCAnXG4nLCBzdGRpbl9jbnQpOworCQkJCWlmIChucCkKKwkJCQkJbGluZWxlbiA9IG5wIC0gbGluZXB0ciArIDE7CisJCQkJY2ggPSBsaW5lcHRyW2xpbmVsZW4tMV07CisJCQl9CisJCQkvKiBsaW5lbGVuID09IG5vIG9mIGNoYXJzIGluY2wuICdcbicgKG9yID09IHN0ZGluX2NudCkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBkaXJuOyArK2kpIHsKKwkJCQlpZiAoZGlyW2ldLmZkZGlyID09IC0xKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZGlyW2ldLm1hdGNoZXJyID09ICdlJykgeworCQkJCQkvLy8vZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBsaW5lcHRyLCBsaW5lbGVuKTsKKwkJCQkJZndyaXRlKGxpbmVwdHIsIDEsIGxpbmVsZW4sIHN0ZGVycik7CisJCQkJfQorCQkJCWlmIChkaXJbaV0ubWF0Y2ggIT0gJysnKQorCQkJCQljb250aW51ZTsKKwkJCQlidWZmZXJfcHdyaXRlKGksIGxpbmVwdHIsIGxpbmVsZW4pOworCQkJfQorCQl9CisKKwkJc3RkaW5fY250IC09IGxpbmVsZW47CisJCWlmIChzdGRpbl9jbnQgPiAwKSB7CisJCQlsaW5lcHRyICs9IGxpbmVsZW47CisJCQkvKiBJZiB3ZSBzZWUgYW5vdGhlciAnXG4nLCB3ZSBkb24ndCBuZWVkIHRvIHJlYWQKKwkJCSAqIG5leHQgcGllY2Ugb2YgaW5wdXQ6IGNhbiBwcmludCB3aGF0IHdlIGhhdmUgKi8KKwkJCW5wID0gbWVtUmNocihsaW5lcHRyLCAnXG4nLCBzdGRpbl9jbnQpOworCQkJaWYgKG5wKQorCQkJCWdvdG8gcHJpbnRfdG9fbmw7CisJCQkvKiBNb3ZlIHVucHJvY2Vzc2VkIGRhdGEgdG8gdGhlIGZyb250IG9mIGxpbmUgKi8KKwkJCW1lbW1vdmUoKHRpbWVzdGFtcCA/IGxpbmUrMjYgOiBsaW5lKSwgbGluZXB0ciwgc3RkaW5fY250KTsKKwkJfQorCQlmZmx1c2hfYWxsKCk7Ly8vLworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkaXJuOyArK2kpIHsKKwkJaWYgKGRpcltpXS5wcGlkKQorCQkJd2hpbGUgKCFwcm9jZXNzb3JzdG9wKCZkaXJbaV0pKQorCQkJCWNvbnRpbnVlOworCQlsb2dkaXJfY2xvc2UoJmRpcltpXSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZSBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjMTgwOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKQEAgLTAsMCArMSwxNTQgQEAKKyMjIyMKKyMga2J1aWxkOiBHZW5lcmljIGRlZmluaXRpb25zCisKKyMgQ29udmluaWVudCB2YXJpYWJsZXMKK2NvbW1hICAgOj0gLAorc3F1b3RlICA6PSAnCitlbXB0eSAgIDo9CitzcGFjZSAgIDo9ICQoZW1wdHkpICQoZW1wdHkpCisKKyMjIworIyBUaGUgdGVtcG9yYXJ5IGZpbGUgdG8gc2F2ZSBnY2MgLU1EIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgbXVzdCBub3QKKyMgY29udGFpbiBhIGNvbW1hCitkZXBmaWxlID0gJChzdWJzdCAkKGNvbW1hKSxfLCQoQEQpLy4kKEBGKS5kKQorCisjIyMKKyMgRXNjYXBlIHNpbmdsZSBxdW90ZSBmb3IgdXNlIGluIGVjaG8gc3RhdGVtZW50cworZXNjc3EgPSAkKHN1YnN0ICQoc3F1b3RlKSwnXCQoc3F1b3RlKScsJDEpCisKKyMjIworIyBmaWxlY2hrIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvbnRlbnQgb2YgYSBnZW5lcmF0ZWQgZmlsZSBpcyB1cGRhdGVkLgorIyBTYW1wbGUgdXNhZ2U6CisjIGRlZmluZSBmaWxlY2hrX3NhbXBsZQorIwllY2hvICRLRVJORUxSRUxFQVNFCisjIGVuZGVmCisjIHZlcnNpb24uaCA6IE1ha2VmaWxlCisjCSQoY2FsbCBmaWxlY2hrLHNhbXBsZSkKKyMgVGhlIHJ1bGUgZGVmaW5lZCBzaGFsbCB3cml0ZSB0byBzdGRvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBmaWxlLgorIyBUaGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlIGNvbXBhcmVkIHdpdGggdGhlIG5ldyBvbmUuCisjIC0gSWYgbm8gZmlsZSBleGlzdCBpdCBpcyBjcmVhdGVkCisjIC0gSWYgdGhlIGNvbnRlbnQgZGlmZmVyIHRoZSBuZXcgZmlsZSBpcyB1c2VkCisjIC0gSWYgdGhleSBhcmUgZXF1YWwgbm8gY2hhbmdlLCBhbmQgbm8gdGltZXN0YW1wIHVwZGF0ZQorIyAtIHN0ZGluIGlzIHBpcGVkIGluIGZyb20gdGhlIGZpcnN0IHByZXJlcXVpc2l0ZSAoJDwpIHNvIG9uZSBoYXMKKyMgICB0byBzcGVjaWZ5IGEgdmFsaWQgZmlsZSBhcyBmaXJzdCBwcmVyZXF1aXNpdGUgKG9mdGVuIHRoZSBrYnVpbGQgZmlsZSkKK2RlZmluZSBmaWxlY2hrCisJJChRKXNldCAtZTsJCQkJXAorCWVjaG8gJyAgQ0hLICAgICAkQCc7CQkJXAorCW1rZGlyIC1wICQoZGlyICRAKTsJCQlcCisJJChmaWxlY2hrXyQoMSkpIDwgJDwgPiAkQC50bXA7CQlcCisJaWYgWyAtciAkQCBdICYmIGNtcCAtcyAkQCAkQC50bXA7IHRoZW4JXAorCQlybSAtZiAkQC50bXA7CQkJXAorCWVsc2UJCQkJCVwKKwkJZWNobyAnICBVUEQgICAgICRAJzsJCVwKKwkJbXYgLWYgJEAudG1wICRAOwkJXAorCWZpCitlbmRlZgorCisjIyMjIyMKKyMgZ2NjIHN1cHBvcnQgZnVuY3Rpb25zCisjIFNlZSBkb2N1bWVudGF0aW9uIGluIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKKworIyBhcy1vcHRpb24KKyMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBhcy1vcHRpb24sIC1XYSQoY29tbWEpLWlzYT1mb28sKQorCithcy1vcHRpb24gPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAkKDEpIC1XYSwtWiAtYyAtbyAvZGV2L251bGwgXAorCSAgICAgLXhhc3NlbWJsZXIgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAiJCgxKSI7IFwKKwkgICAgIGVsc2UgZWNobyAiJCgyKSI7IGZpIDspCisKKyMgY2Mtb3B0aW9uCisjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtbWFyY2g9d2luY2hpcC1jNiwgLW1hcmNoPWk1ODYpCisKK2NjLW9wdGlvbiA9ICQoc2hlbGwgaWYgJChDQykgJChDRkxBR1MpICQoMSkgLVMgLW8gL2Rldi9udWxsIC14YyAvZGV2L251bGwgXAorICAgICAgICAgICAgID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAiJCgxKSI7IGVsc2UgZWNobyAiJCgyKSI7IGZpIDspCisKKyMgaG9zdGNjLW9wdGlvbgorIyBVc2FnZTogaG9zdGNmbGFncy15ICs9ICQoY2FsbCBob3N0Y2Mtb3B0aW9uLCAtbWFyY2g9d2luY2hpcC1jNiwgLW1hcmNoPWk1ODYpCisKK2hvc3RjYy1vcHRpb24gPSAkKHNoZWxsIGlmICQoSE9TVENDKSAkKEhPU1RDRkxBR1MpICQoMSkgLVMgLW8gL2Rldi9udWxsIC14YyAvZGV2L251bGwgXAorICAgICAgICAgICAgID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAiJCgxKSI7IGVsc2UgZWNobyAiJCgyKSI7IGZpIDspCisKKyMgY2Mtb3B0aW9uLXluCisjIFVzYWdlOiBmbGFnIDo9ICQoY2FsbCBjYy1vcHRpb24teW4sIC1tYXJjaD13aW5jaGlwLWM2KQorY2Mtb3B0aW9uLXluID0gJChzaGVsbCBpZiAkKENDKSAkKENGTEFHUykgJCgxKSAtUyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCBcCisgICAgICAgICAgICAgICAgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICJ5IjsgZWxzZSBlY2hvICJuIjsgZmk7KQorCisjIGNjLW9wdGlvbi1hbGlnbgorIyBQcmVmaXggYWxpZ24gd2l0aCBlaXRoZXIgLWZhbGlnbiBvciAtbWFsaWduCitjYy1vcHRpb24tYWxpZ24gPSAkKHN1YnN0IC1mdW5jdGlvbnM9MCwsXAorCSQoY2FsbCBjYy1vcHRpb24sLWZhbGlnbi1mdW5jdGlvbnM9MCwtbWFsaWduLWZ1bmN0aW9ucz0wKSkKKworIyBjYy12ZXJzaW9uCisjIFVzYWdlIGdjYy12ZXIgOj0gJChjYWxsIGNjLXZlcnNpb24sICQoQ0MpKQorY2MtdmVyc2lvbiA9ICQoc2hlbGwgUEFUSD0iJChQQVRIKSIgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCBcCisgICAgICAgICAgICAgICQoaWYgJCgxKSwgJCgxKSwgJChDQykpKQorCisjIGNjLWlmdmVyc2lvbgorIyBVc2FnZTogIEVYVFJBX0NGTEFHUyArPSAkKGNhbGwgY2MtaWZ2ZXJzaW9uLCAtbHQsIDA0MDIsIC1PMSkKK2NjLWlmdmVyc2lvbiA9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbiwgJChDQykpICQoMSkgJCgyKSBdOyB0aGVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkKDMpOyBmaTspCisKKyMjIworIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqPQorIyBVc2FnZToKKyMgJChRKSQoTUFLRSkgJChidWlsZCk9ZGlyCitidWlsZCA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmoKKworIyBQcmVmaXggLUkgd2l0aCAkKHNyY3RyZWUpIGlmIGl0IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoCithZGR0cmVlID0gJChpZiAkKGZpbHRlci1vdXQgLUkvJSwkKDEpKSwkKHBhdHN1YnN0IC1JJSwtSSQoc3JjdHJlZSkvJSwkKDEpKSkgJCgxKQorIyBGaW5kIGFsbCAtSSBvcHRpb25zIGFuZCBjYWxsIGFkZHRyZWUKK2ZsYWdzID0gJChmb3JlYWNoIG8sJCgkKDEpKSwkKGlmICQoZmlsdGVyIC1JJSwkKG8pKSwkKGNhbGwgYWRkdHJlZSwkKG8pKSwkKG8pKSkKKworIyBJZiBxdWlldCBpcyBzZXQsIG9ubHkgcHJpbnQgc2hvcnQgdmVyc2lvbiBvZiBjb21tYW5kCitjbWQgPSBAJChlY2hvLWNtZCkgJChjbWRfJCgxKSkKKworIyBBZGQgJChvYmopLyBmb3IgcGF0aHMgdGhhdCBpcyBub3QgYWJzb2x1dGUKK29iamVjdGlmeSA9ICQoZm9yZWFjaCBvLCQoMSksJChpZiAkKGZpbHRlciAvJSwkKG8pKSwkKG8pLCQob2JqKS8kKG8pKSkKKworIyMjCisjIGlmX2NoYW5nZWQgICAgICAtIGV4ZWN1dGUgY29tbWFuZCBpZiBhbnkgcHJlcmVxdWlzaXRlIGlzIG5ld2VyIHRoYW4KKyMgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBvciBjb21tYW5kIGxpbmUgaGFzIGNoYW5nZWQKKyMgaWZfY2hhbmdlZF9kZXAgIC0gYXMgaWZfY2hhbmdlZCwgYnV0IHVzZXMgZml4ZGVwIHRvIHJldmVhbCBkZXBlbmRlbmNpZXMKKyMgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHVzZWQgY29uZmlnIHN5bWJvbHMKKyMgaWZfY2hhbmdlZF9ydWxlIC0gYXMgaWZfY2hhbmdlZCBidXQgZXhlY3V0ZSBydWxlIGluc3RlYWQKKyMgU2VlIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQgZm9yIG1vcmUgaW5mbworCitpZm5lcSAoJChLQlVJTERfTk9DTURERVApLDEpCisjIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGhhcyBzYW1lIGFyZ3VtZW50cy4gUmVzdWx0IGluIGVtcHR5IHN0cmluZyBpZiBlcXVhbAorIyBVc2VyIG1heSBvdmVycmlkZSB0aGlzIGNoZWNrIHVzaW5nIG1ha2UgS0JVSUxEX05PQ01EREVQPTEKK2FyZy1jaGVjayA9ICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoMSksICQoMikpICQoZmlsdGVyLW91dCAkKDIpLCAkKDEpKSApCitlbmRpZgorCisjIGVjaG8gY29tbWFuZC4gU2hvcnQgdmVyc2lvbiBpcyAkKHF1aWV0KSBlcXVhbHMgcXVpZXQsIG90aGVyd2lzZSBmdWxsIGNvbW1hbmQKK2VjaG8tY21kID0gJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLCBcCisJZWNobyAnICAkKGNhbGwgZXNjc3EsJCgkKHF1aWV0KWNtZF8kKDEpKSknOykKKworbWFrZS1jbWQgPSAkKHN1YnN0IFwjLFxcXCMsJChzdWJzdCAkJCwkJCQkLCQoY2FsbCBlc2NzcSwkKGNtZF8kKDEpKSkpKQorCisjIGZ1bmN0aW9uIHRvIG9ubHkgZXhlY3V0ZSB0aGUgcGFzc2VkIGNvbW1hbmQgaWYgbmVjZXNzYXJ5CisjID4nPCBzdWJzdGl0dXRpb24gaXMgZm9yIGVjaG8gdG8gd29yaywgPiQ8IHN1YnN0aXR1dGlvbiB0byBwcmVzZXJ2ZSAkIHdoZW4gcmVsb2FkaW5nIC5jbWQgZmlsZQorIyBub3RlOiB3aGVuIHVzaW5nIGlubGluZSBwZXJsIHNjcmlwdHMgW3BlcmwgLWUgJy4uLiQkdD0xOy4uLiddIGluICQoY21kX3h4eCkgZG91YmxlICQkIHlvdXIgcGVybCB2YXJzCisjCitpZl9jaGFuZ2VkID0gJChpZiAkKHN0cmlwICQoZmlsdGVyLW91dCAkKFBIT05ZKSwkPykgICAgICAgICAgXAorCQkkKGNhbGwgYXJnLWNoZWNrLCAkKGNtZF8kKDEpKSwgJChjbWRfJEApKSApLCBcCisJQHNldCAtZTsgXAorCSQoZWNoby1jbWQpICQoY21kXyQoMSkpOyBcCisJZWNobyAnY21kXyRAIDo9ICQobWFrZS1jbWQpJyA+ICQoQEQpLy4kKEBGKS5jbWQpCisKKyMgZXhlY3V0ZSB0aGUgY29tbWFuZCBhbmQgYWxzbyBwb3N0cHJvY2VzcyBnZW5lcmF0ZWQgLmQgZGVwZW5kZW5jaWVzCisjIGZpbGUKK2lmX2NoYW5nZWRfZGVwID0gJChpZiAkKHN0cmlwICQoZmlsdGVyLW91dCAkKFBIT05ZKSwkPykgIFwKKwkJJChmaWx0ZXItb3V0IEZPUkNFICQod2lsZGNhcmQgJF4pLCReKSAgICBcCisJJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSwgICAgIFwKKwlAc2V0IC1lOyBcCisJJChlY2hvLWNtZCkgJChjbWRfJCgxKSk7IFwKKwlzY3JpcHRzL2Jhc2ljL2ZpeGRlcCAkKGRlcGZpbGUpICRAICckKG1ha2UtY21kKScgPiAkKEBEKS8uJChARikudG1wOyBcCisJcm0gLWYgJChkZXBmaWxlKTsgXAorCW12IC1mICQoQEQpLy4kKEBGKS50bXAgJChARCkvLiQoQEYpLmNtZCkKKworIyBVc2FnZTogJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxmb28pCisjIHdpbGwgY2hlY2sgaWYgJChjbWRfZm9vKSBjaGFuZ2VkLCBvciBhbnkgb2YgdGhlIHByZXF1aXNpdGVzIGNoYW5nZWQsCisjIGFuZCBpZiBzbyB3aWxsIGV4ZWN1dGUgJChydWxlX2ZvbykKK2lmX2NoYW5nZWRfcnVsZSA9ICQoaWYgJChzdHJpcCAkKGZpbHRlci1vdXQgJChQSE9OWSksJD8pICAgICAgICAgICAgXAorCQkJJChjYWxsIGFyZy1jaGVjaywgJChjbWRfJCgxKSksICQoY21kXyRAKSkgKSxcCisJCQlAc2V0IC1lOyBcCisJCQkkKHJ1bGVfJCgxKSkpCmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5zcmMgYi9zY3JpcHRzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDcgQEAKKyMjIworIyBzY3JpcHRzIGNvbnRhaW5zIHNvdXJjZXMgZm9yIHZhcmlvdXMgaGVscGVyIHByb2dyYW1zIHVzZWQgdGhyb3VnaG91dAorIyB0aGUga2VybmVsIGZvciB0aGUgYnVpbGQgcHJvY2Vzcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTGV0IGNsZWFuIGRlc2NlbmQgaW50byBzdWJkaXJzCitzdWJkaXItICs9IGJhc2ljIGtjb25maWcKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuSU1BIGIvc2NyaXB0cy9NYWtlZmlsZS5JTUEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjZWQyOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuSU1BCkBAIC0wLDAgKzEsMjA4IEBACisjIFRoaXMgaXMgY29tcGxldGVseSB1bnN1cHBvcnRlZC4KKyMKKyMgVWFzZ2U6IG1ha2UgLWYgc2NyaXB0cy9NYWtlZmlsZS5JTUEKKyMKKyMgRml4IENPTUJJTkVEX0NPTVBJTEUgdXBzdHJlYW0gKGluIHRoZSBLYnVpbGQpIGFuZCBwcm9wYWdhdGUKKyMgdGhlIGNoYW5nZXMgYmFjaworc3JjdHJlZQkJOj0gJChpZiAkKEtCVUlMRF9TUkMpLCQoS0JVSUxEX1NSQyksJChDVVJESVIpKQorb2JqdHJlZQkJOj0gJChDVVJESVIpCitzcmMJCTo9ICQoc3JjdHJlZSkKK29iagkJOj0gJChvYmp0cmVlKQorCisjIE1ha2UgZ2VuZXJhdGVkIGZpbGVzCitEVU1NWSA6PSAkKHNoZWxsICQoUSkkKHNyY3RyZWUpL3NjcmlwdHMvZ2VuX2J1aWxkX2ZpbGVzLnNoICQoc3JjdHJlZSkgJChvYmp0cmVlKSA+JjIpCisKKyMgTG9vayBmb3IgbWFrZSBpbmNsdWRlIGZpbGVzIHJlbGF0aXZlIHRvIHJvb3Qgb2Ygc3JjCitNQUtFRkxBR1MgKz0gLS1pbmNsdWRlLWRpcj0kKHNyY3RyZWUpCisKK2RlZmF1bHQ6IGJ1c3lib3gKKworaW5jbHVkZSAuY29uZmlnCisKKyMgQ3Jvc3MgY29tcGlsaW5nIGFuZCBzZWxlY3RpbmcgZGlmZmVyZW50IHNldCBvZiBnY2MvYmluLXV0aWxzCitpZmVxICgkKENST1NTX0NPTVBJTEUpLCkKK0NST1NTX0NPTVBJTEUgOj0gJChzdWJzdCAiLCwkKENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVgpKQorZW5kaWYKKworaWZuZXEgKCQoQ1JPU1NfQ09NUElMRSksKQorU1VCQVJDSCA6PSAkKHNoZWxsIGVjaG8gJChDUk9TU19DT01QSUxFKSB8IGN1dCAtZC0gLWYxKQorZWxzZQorU1VCQVJDSCA6PSAkKHNoZWxsIHVuYW1lIC1tKQorZW5kaWYKK1NVQkFSQ0ggOj0gJChzaGVsbCBlY2hvICQoU1VCQVJDSCkgfCBzZWQgLWUgcy9pLjg2L2kzODYvIC1lIHMvc3VuNHUvc3BhcmM2NC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZSBzL2FybS4qL2FybS8gLWUgcy9zYTExMC9hcm0vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgcy9zMzkweC9zMzkwLyAtZSBzL3BhcmlzYzY0L3BhcmlzYy8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZSBzL3BwYy4qL3Bvd2VycGMvIC1lIHMvbWlwcy4qL21pcHMvICkKK0FSQ0ggPz0gJChTVUJBUkNIKQorCitpZm5kZWYgSE9TVENDCitIT1NUQ0MgPSBjYworZW5kaWYKK0FTICAgICAgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlhcworQ0MgICAgICAgICAgICAgID0gJChDUk9TU19DT01QSUxFKWdjYworTEQgICAgICAgICAgICAgID0gJChDQykgLW5vc3RkbGliCitDUFAgICAgICAgICAgICAgPSAkKENDKSAtRQorQVIgICAgICAgICAgICAgID0gJChDUk9TU19DT01QSUxFKWFyCitOTSAgICAgICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpbm0KK1NUUklQICAgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlzdHJpcAorT0JKQ09QWSAgICAgICAgID0gJChDUk9TU19DT01QSUxFKW9iamNvcHkKK09CSkRVTVAgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlvYmpkdW1wCisKK0NGTEFHUyAgIDo9ICQoQ0ZMQUdTKQorQ1BQRkxBR1MgKz0gLUQiS0JVSUxEX1NUUihzKT1cI3MiICMtUQorCisjIFdlIG5lZWQgc29tZSBnZW5lcmljIGRlZmluaXRpb25zCitpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorCitpbmNsdWRlIE1ha2VmaWxlLmZsYWdzCisKKy1pbmNsdWRlICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL01ha2VmaWxlCitpZmRlZiBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRQordXNhZ2Vfc3R1ZmYgPSBpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaAorZW5kaWYKKworaWZuZGVmIEJCX1ZFUgorQkJfVkVSOj0iIgorZW5kaWYKKworV0hPTEVfUFJPR1JBTTo9JChjYWxsIGNjLW9wdGlvbiwtZndob2xlLXByb2dyYW0sKQorCisjIHB1bGwgaW4gdGhlIGNvbmZpZyBzdHVmZgorbGliLWFsbC15IDo9IGFwcGxldHMvYXBwbGV0cy5vCitsaWIteTo9CitpbmNsdWRlIHByb2Nwcy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUscHJvY3BzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbmV0d29ya2luZy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbmV0d29ya2luZy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIG5ldHdvcmtpbmcvdWRoY3AvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLG5ldHdvcmtpbmcvdWRoY3AvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBuZXR3b3JraW5nL2xpYmlwcm91dGUvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLG5ldHdvcmtpbmcvbGliaXByb3V0ZS8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGxvZ2ludXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGxvZ2ludXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBhcmNoaXZhbC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsYXJjaGl2YWwvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBhcmNoaXZhbC9saWJhcmNoaXZlL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxhcmNoaXZhbC9saWJhcmNoaXZlLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgYXBwbGV0cy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsYXBwbGV0cy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGUyZnNwcm9ncy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZTJmc3Byb2dzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KKyNpbmNsdWRlIGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL0tidWlsZAorI2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvJSwkKHNvcnQgJChsaWIteSkpKQorI2xpYi15Oj0KKyNpbmNsdWRlIGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy9LYnVpbGQKKyNsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2V4dDJmcy8lLCQoc29ydCAkKGxpYi15KSkpCisjbGliLXk6PQorI2luY2x1ZGUgZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvYmxraWQvS2J1aWxkCisjbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC8lLCQoc29ydCAkKGxpYi15KSkpCisjbGliLXk6PQorI2luY2x1ZGUgZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC9LYnVpbGQKKyNsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL3V1aWQvJSwkKHNvcnQgJChsaWIteSkpKQorI2xpYi15Oj0KKyNpbmNsdWRlIGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC9LYnVpbGQKKyNsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2UycC8lLCQoc29ydCAkKGxpYi15KSkpCisjbGliLXk6PQoraW5jbHVkZSBkZWJpYW51dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZGViaWFudXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBydW5pdC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUscnVuaXQvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBtb2R1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbW9kdXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBtaXNjdXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLG1pc2N1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIG1haWx1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbWFpbHV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgY29yZXV0aWxzL2xpYmNvcmV1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsY29yZXV0aWxzL2xpYmNvcmV1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGNvcmV1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsY29yZXV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgc3lza2xvZ2QvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHN5c2tsb2dkLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgc2hlbGwvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHNoZWxsLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgY29uc29sZS10b29scy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsY29uc29sZS10b29scy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGZpbmR1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZmluZHV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgdXRpbC1saW51eC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsdXRpbC1saW51eC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHV0aWwtbGludXgvdm9sdW1lX2lkL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSx1dGlsLWxpbnV4L3ZvbHVtZV9pZC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGluaXQvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGluaXQvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBsaWJwd2RncnAvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGxpYnB3ZGdycC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGVkaXRvcnMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGVkaXRvcnMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBwcmludHV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxwcmludHV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgc2VsaW51eC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsc2VsaW51eC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHNjcmlwdHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHNjcmlwdHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBsaWJiYi9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbGliYmIvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQorCitjb21tYTo9LAorYnVzeWJveF91bnN0cmlwcGVkLm86ICQodXNhZ2Vfc3R1ZmYpIGluY2x1ZGUvYXBwbGV0X3RhYmxlcy5oIGluY2x1ZGUvTlVNX0FQUExFVFMuaCBpbmNsdWRlL2F1dG9jb25mLmgKKwkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpIFwKKwkJJChwYXRzdWJzdCAlLC1XbCQoY29tbWEpJSwkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykpIFwKKwkJLURHQ0NfQ09NQklORT0xIFwKKwkJLS1jb21iaW5lICQoV0hPTEVfUFJPR1JBTSkgXAorCQktZnVuaXQtYXQtYS10aW1lIC1Xbm8tZXJyb3IgLXN0ZD1nbnU5OSAgXAorCQktYyAtbyBidXN5Ym94X3Vuc3RyaXBwZWQubyBcCisJCSQobGliLWFsbC15Oi5vPS5jKQorCitidXN5Ym94OiBidXN5Ym94X3Vuc3RyaXBwZWQubworCSQoc3JjdHJlZSkvc2NyaXB0cy90cnlsaW5rIFwKKwkJYnVzeWJveF91bnN0cmlwcGVkIFwKKwkJIiQoQ0MpICQoQ0ZMQUdTX2J1c3lib3gpIiBcCisJCSIkKENGTEFHUykiIFwKKwkJIiQoTERGTEFHUykiIFwKKwkJImJ1c3lib3hfdW5zdHJpcHBlZC5vIiBcCisJCSIiIFwKKwkJImNyeXB0IG0iCisJY3AgLWYgJChAKV91bnN0cmlwcGVkICRACisJLSQoU1RSSVApIC1zIC1SIC5ub3RlIC1SIC5jb21tZW50IC1SIC52ZXJzaW9uICRACisKKyMgSWYgLmNvbmZpZyBpcyBuZXdlciB0aGFuIGluY2x1ZGUvYXV0b2NvbmYuaCwgc29tZW9uZSB0aW5rZXJlZAorIyB3aXRoIGl0IGFuZCBmb3Jnb3QgdG8gcnVuIG1ha2Ugb2xkY29uZmlnLgoraW5jbHVkZS9hdXRvY29uZi5oOiAuY29uZmlnCisJJChNQUtFKSAtZiAkKHNyY3RyZWUpL01ha2VmaWxlIHNpbGVudG9sZGNvbmZpZworCisjIE92ZXJyaWRlIHJ1bGVzIGZvciBob3N0IGNvbXBpbGUKK2FwcGxldHMvdXNhZ2U6IGluY2x1ZGUvYXV0b2NvbmYuaAorCSQoSE9TVENDKSAtV2FsbCAtTzIgLUkkKHNyY3RyZWUpL2luY2x1ZGUgLW8gYXBwbGV0cy91c2FnZSBhcHBsZXRzL3VzYWdlLmMKKworYXBwbGV0cy9hcHBsZXRfdGFibGVzOiBpbmNsdWRlL2F1dG9jb25mLmgKKwkkKEhPU1RDQykgLVdhbGwgLU8yIC1JJChzcmN0cmVlKS9pbmNsdWRlIC1vIGFwcGxldHMvYXBwbGV0X3RhYmxlcyBhcHBsZXRzL2FwcGxldF90YWJsZXMuYwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4NWI1YgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTAsMCArMSwzNDMgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGRpbmcKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCitQSE9OWSA6PSBfX2J1aWxkCitfX2J1aWxkOgorCisjIFJlYWQgLmNvbmZpZyBpZiBpdCBleGlzdCwgb3RoZXJ3aXNlIGlnbm9yZQorLWluY2x1ZGUgLmNvbmZpZworCitpbmNsdWRlIHNjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKworIyBUaGUgZmlsZW5hbWUgS2J1aWxkIGhhcyBwcmVjZWRlbmNlIG92ZXIgTWFrZWZpbGUKKyMgYmJveDogd2UgYWxzbyB0cnkgdG8gaW5jbHVkZSBLYnVpbGQgZmlsZSBpbiBvYmogdHJlZSBmaXJzdAora2J1aWxkLWRpciA6PSAkKGlmICQoZmlsdGVyIC8lLCQoc3JjKSksJChzcmMpLCQoc3JjdHJlZSkvJChzcmMpKQoraW5jbHVkZSAkKGlmICQod2lsZGNhcmQgJChzcmMpL0tidWlsZCksICQoc3JjKS9LYnVpbGQsIFwKKwkJJChpZiAkKHdpbGRjYXJkICQoa2J1aWxkLWRpcikvS2J1aWxkKSwgJChrYnVpbGQtZGlyKS9LYnVpbGQsIFwKKwkJCSQoa2J1aWxkLWRpcikvTWFrZWZpbGUgXAorCQkpIFwKKwkpCisKK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5saWIKKworaWZkZWYgaG9zdC1wcm9ncworaWZuZXEgKCQoaG9zdHByb2dzLXkpLCQoaG9zdC1wcm9ncykpCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBob3N0LXByb2dzIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSByZXBsYWNlIHdpdGggaG9zdHByb2dzLXkhKQoraG9zdHByb2dzLXkgKz0gJChob3N0LXByb2dzKQorZW5kaWYKK2VuZGlmCisKKyMgRG8gbm90IGluY2x1ZGUgaG9zdCBydWxlcyB1bmxlcyBuZWVkZWQKK2lmbmVxICgkKGhvc3Rwcm9ncy15KSQoaG9zdHByb2dzLW0pLCkKK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5ob3N0CitlbmRpZgorCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisjIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKK19kdW1teSA6PSAkKHNoZWxsIFsgLWQgJChvYmopIF0gfHwgbWtkaXIgLXAgJChvYmopKQorCisjIENyZWF0ZSBkaXJlY3RvcmllcyBmb3Igb2JqZWN0IGZpbGVzIGlmIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAorIyBOZWVkZWQgd2hlbiBvYmoteSA6PSBkaXIvZmlsZS5vIHN5bnRheCBpcyB1c2VkCitfZHVtbXkgOj0gJChmb3JlYWNoIGQsJChvYmotZGlycyksICQoc2hlbGwgWyAtZCAkKGQpIF0gfHwgbWtkaXIgLXAgJChkKSkpCitlbmRpZgorCisKK2lmZGVmIEVYVFJBX1RBUkdFVFMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIEVYVFJBX1RBUkdFVFMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGJ1aWxkLXRhcmdldHMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIGJ1aWxkLXRhcmdldHMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGV4cG9ydC1vYmpzCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBleHBvcnQtb2JqcyBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgT19UQVJHRVQKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIE9fVEFSR0VUIDo9ICQoT19UQVJHRVQpIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBMX1RBUkdFVAorJChlcnJvciBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzZSBvZiBMX1RBUkdFVCBpcyByZXBsYWNlZCBieSBsaWIteSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgbGlzdC1tdWx0aQorJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gbGlzdC1tdWx0aSA6PSAkKGxpc3QtbXVsdGkpIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZm5kZWYgb2JqCiskKHdhcm5pbmcga2J1aWxkOiBNYWtlZmlsZS5idWlsZCBpcyBpbmNsdWRlZCBpbXByb3Blcmx5KQorZW5kaWYKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaWZuZXEgKCQoc3RyaXAgJChsaWIteSkgJChsaWItbSkgJChsaWItbikgJChsaWItKSksKQorbGliLXRhcmdldCA6PSAkKG9iaikvbGliLmEKK2VuZGlmCisKK2lmbmVxICgkKHN0cmlwICQob2JqLXkpICQob2JqLW0pICQob2JqLW4pICQob2JqLSkgJChsaWItdGFyZ2V0KSksKQorYnVpbHRpbi10YXJnZXQgOj0gJChvYmopL2J1aWx0LWluLm8KK2VuZGlmCisKKyMgV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIG1vZHVsZXMgaW4gJChNT0RWRVJESVIpCisKK19fYnVpbGQ6ICQoaWYgJChLQlVJTERfQlVJTFRJTiksJChidWlsdGluLXRhcmdldCkgJChsaWItdGFyZ2V0KSAkKGV4dHJhLXkpKSBcCisJICQoaWYgJChLQlVJTERfTU9EVUxFUyksJChvYmotbSkpIFwKKwkgJChzdWJkaXIteW0pICQoYWx3YXlzKQorCUA6CisKKyMgTGludXMnIGtlcm5lbCBzYW5pdHkgY2hlY2tpbmcgdG9vbAoraWZuZXEgKCQoS0JVSUxEX0NIRUNLU1JDKSwwKQorICBpZmVxICgkKEtCVUlMRF9DSEVDS1NSQyksMikKKyAgICBxdWlldF9jbWRfZm9yY2VfY2hlY2tzcmMgPSBDSEVDSyAgICQ8CisgICAgICAgICAgY21kX2ZvcmNlX2NoZWNrc3JjID0gJChDSEVDSykgJChDSEVDS0ZMQUdTKSAkKGNfZmxhZ3MpICQ8IDsKKyAgZWxzZQorICAgICAgcXVpZXRfY21kX2NoZWNrc3JjICAgICA9IENIRUNLICAgJDwKKyAgICAgICAgICAgIGNtZF9jaGVja3NyYyAgICAgPSAkKENIRUNLKSAkKENIRUNLRkxBR1MpICQoY19mbGFncykgJDwgOworICBlbmRpZgorZW5kaWYKKworCisjIENvbXBpbGUgQyBzb3VyY2VzICguYykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgRGVmYXVsdCBpcyBidWlsdC1pbiwgdW5sZXNzIHdlIGtub3cgb3RoZXJ3aXNlCittb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19LRVJORUwpCitxdWlldF9tb2R0YWcgOj0gJChlbXB0eSkgICAkKGVtcHR5KQorCiskKHJlYWwtb2Jqcy1tKSAgICAgICAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5pKSAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5zKSAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5sc3QpOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCisKKyQocmVhbC1vYmpzLW0pICAgICAgICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LmkpICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LnMpICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LmxzdCk6IHF1aWV0X21vZHRhZyA6PSBbTV0KKworJChvYmotbSkgICAgICAgICAgICAgIDogcXVpZXRfbW9kdGFnIDo9IFtNXQorCisjIERlZmF1bHQgZm9yIG5vdCBtdWx0aS1wYXJ0IG1vZHVsZXMKK21vZG5hbWUgPSAkKCpGKQorCiskKG11bHRpLW9ianMtbSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0ucykgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0ucykgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCisKK3F1aWV0X2NtZF9jY19zX2MgPSBDQyAkKHF1aWV0X21vZHRhZykgICRACitjbWRfY2Nfc19jICAgICAgID0gJChDQykgJChjX2ZsYWdzKSAtZnZlcmJvc2UtYXNtIC1TIC1vICRAICQ8CisKKyUuczogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX3NfYykKKworcXVpZXRfY21kX2NjX2lfYyA9IENQUCAkKHF1aWV0X21vZHRhZykgJEAKK2NtZF9jY19pX2MgICAgICAgPSAkKENQUCkgJChjX2ZsYWdzKSAgIC1vICRAICQ8CisKKyUuaTogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX2lfYykKKworIyBDICguYykgZmlsZXMKKyMgVGhlIEMgZmlsZSBpcyBjb21waWxlZCBhbmQgdXBkYXRlZCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGlzIGdlbmVyYXRlZC4KKyMgKFNlZSBjbWRfY2Nfb19jICsgcmVsZXZhbnQgcGFydCBvZiBydWxlX2NjX29fYykKKworcXVpZXRfY21kX2NjX29fYyA9IENDICQocXVpZXRfbW9kdGFnKSAgJEAKKworaWZuZGVmIENPTkZJR19NT0RWRVJTSU9OUworY21kX2NjX29fYyA9ICQoQ0MpICQoY19mbGFncykgLWMgLW8gJEAgJDwKKworZWxzZQorIyBXaGVuIG1vZHVsZSB2ZXJzaW9uaW5nIGlzIGVuYWJsZWQgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgZXhlY3V0ZWQ6CisjIG8gY29tcGlsZSBhIC50bXBfPGZpbGU+Lm8gZnJvbSA8ZmlsZT4uYworIyBvIGlmIC50bXBfPGZpbGU+Lm8gZG9lc24ndCBjb250YWluIGEgX19rc3ltdGFiIHZlcnNpb24sIGkuZS4gZG9lcworIyAgIG5vdCBleHBvcnQgc3ltYm9scywgd2UganVzdCByZW5hbWUgLnRtcF88ZmlsZT4ubyB0byA8ZmlsZT4ubyBhbmQKKyMgICBhcmUgZG9uZS4KKyMgbyBvdGhlcndpc2UsIHdlIGNhbGN1bGF0ZSBzeW1ib2wgdmVyc2lvbnMgdXNpbmcgdGhlIGdvb2Qgb2xkCisjICAgZ2Vua3N5bXMgb24gdGhlIHByZXByb2Nlc3NlZCBzb3VyY2UgYW5kIHBvc3Rwcm9jZXNzIHRoZW0gaW4gYSB3YXkKKyMgICB0aGF0IHRoZXkgYXJlIHVzYWJsZSBhcyBhIGxpbmtlciBzY3JpcHQKKyMgbyBnZW5lcmF0ZSA8ZmlsZT4ubyBmcm9tIC50bXBfPGZpbGU+Lm8gdXNpbmcgdGhlIGxpbmtlciB0bworIyAgIHJlcGxhY2UgdGhlIHVucmVzb2x2ZWQgc3ltYm9scyBfX2NyY19leHBvcnRlZF9zeW1ib2wgd2l0aAorIyAgIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGNoZWNrc3VtIGdlbmVyYXRlZCBieSBnZW5rc3ltcworCitjbWRfY2Nfb19jID0gJChDQykgJChjX2ZsYWdzKSAtYyAtbyAkKEBEKS8udG1wXyQoQEYpICQ8CitjbWRfbW9kdmVyc2lvbnMgPQkJCQkJCQlcCisJaWYgJChPQkpEVU1QKSAtaCAkKEBEKS8udG1wXyQoQEYpIHwgZ3JlcCAtcSBfX2tzeW10YWI7IHRoZW4JXAorCQkkKENQUCkgLURfX0dFTktTWU1TX18gJChjX2ZsYWdzKSAkPAkJCVwKKwkJfCAkKEdFTktTWU1TKSAtYSAkKEFSQ0gpCQkJCVwKKwkJPiAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CQkJCVwKKwkJCQkJCQkJCVwKKwkJJChMRCkgJChMREZMQUdTKSAtciAtbyAkQCAkKEBEKS8udG1wXyQoQEYpIAkJXAorCQkJLVQgJChARCkvLnRtcF8kKEBGOi5vPS52ZXIpOwkJCVwKKwkJcm0gLWYgJChARCkvLnRtcF8kKEBGKSAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CVwKKwllbHNlCQkJCQkJCQlcCisJCW12IC1mICQoQEQpLy50bXBfJChARikgJEA7CQkJCVwKKwlmaTsKK2VuZGlmCisKK2RlZmluZSBydWxlX2NjX29fYworCSQoY2FsbCBlY2hvLWNtZCxjaGVja3NyYykgJChjbWRfY2hlY2tzcmMpCQkJICBcCisJJChjYWxsIGVjaG8tY21kLGNjX29fYykgJChjbWRfY2Nfb19jKTsJCQkJICBcCisJJChjbWRfbW9kdmVyc2lvbnMpCQkJCQkJICBcCisJc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChjYWxsIG1ha2UtY21kLGNjX29fYyknID4gJChARCkvLiQoQEYpLnRtcDsgIFwKKwlybSAtZiAkKGRlcGZpbGUpOwkJCQkJCSAgXAorCW12IC1mICQoQEQpLy4kKEBGKS50bXAgJChARCkvLiQoQEYpLmNtZAorZW5kZWYKKworIyBCdWlsdC1pbiBhbmQgY29tcG9zaXRlIG1vZHVsZSBwYXJ0cworCislLm86ICUuYyBGT1JDRQorCSQoY2FsbCBjbWQsZm9yY2VfY2hlY2tzcmMpCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxjY19vX2MpCisKKyMgU2luZ2xlLXBhcnQgbW9kdWxlcyBhcmUgc3BlY2lhbCBzaW5jZSB3ZSBuZWVkIHRvIG1hcmsgdGhlbSBpbiAkKE1PRFZFUkRJUikKKworJChzaW5nbGUtdXNlZC1tKTogJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgY21kLGZvcmNlX2NoZWNrc3JjKQorCSQoY2FsbCBpZl9jaGFuZ2VkX3J1bGUsY2Nfb19jKQorCUB7IGVjaG8gJChAOi5vPS5rbyk7IGVjaG8gJEA7IH0gPiAkKE1PRFZFUkRJUikvJChARjoubz0ubW9kKQorCitxdWlldF9jbWRfY2NfbHN0X2MgPSBNS0xTVCAgICRACisgICAgICBjbWRfY2NfbHN0X2MgPSAkKENDKSAkKGNfZmxhZ3MpIC1nIC1jIC1vICQqLm8gJDwgJiYgXAorCQkgICAgICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvbWFrZWxzdCAkKi5vIFwKKwkJCQkgICAgIFN5c3RlbS5tYXAgJChPQkpEVU1QKSA+ICRACisKKyUubHN0OiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2NfbHN0X2MpCisKKyMgQ29tcGlsZSBhc3NlbWJsZXIgc291cmNlcyAoLlMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19LRVJORUwpCisKKyQocmVhbC1vYmpzLW0pICAgICAgOiBtb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5zKTogbW9ka2Vybl9hZmxhZ3MgOj0gJChBRkxBR1NfTU9EVUxFKQorCitxdWlldF9jbWRfYXNfc19TID0gQ1BQICQocXVpZXRfbW9kdGFnKSAkQAorY21kX2FzX3NfUyAgICAgICA9ICQoQ1BQKSAkKGFfZmxhZ3MpICAgLW8gJEAgJDwKKworJS5zOiAlLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfc19TKQorCitxdWlldF9jbWRfYXNfb19TID0gQVMgJChxdWlldF9tb2R0YWcpICAkQAorY21kX2FzX29fUyAgICAgICA9ICQoQ0MpICQoYV9mbGFncykgLWMgLW8gJEAgJDwKKworJS5vOiAlLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfb19TKQorCit0YXJnZXRzICs9ICQocmVhbC1vYmpzLXkpICQocmVhbC1vYmpzLW0pICQobGliLXkpCit0YXJnZXRzICs9ICQoZXh0cmEteSkgJChNQUtFQ01ER09BTFMpICQoYWx3YXlzKQorCisjIExpbmtlciBzY3JpcHRzIHByZXByb2Nlc3NvciAoLmxkcy5TIC0+IC5sZHMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcXVpZXRfY21kX2NwcF9sZHNfUyA9IExEUyAgICAgJEAKKyAgICAgIGNtZF9jcHBfbGRzX1MgPSAkKENQUCkgJChjcHBfZmxhZ3MpIC1EX19BU1NFTUJMWV9fIC1vICRAICQ8CisKKyUubGRzOiAlLmxkcy5TIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNwcF9sZHNfUykKKworIyBCdWlsZCB0aGUgY29tcGlsZWQtaW4gdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUbyBidWlsZCBvYmplY3RzIGluIHN1YmRpcnMsIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvIHRoZSBkaXJlY3RvcmllcworJChzb3J0ICQoc3ViZGlyLW9iai15KSk6ICQoc3ViZGlyLXltKSA7CisKKyMKKyMgUnVsZSB0byBjb21waWxlIGEgc2V0IG9mIC5vIGZpbGVzIGludG8gb25lIC5vIGZpbGUKKyMKK2lmZGVmIGJ1aWx0aW4tdGFyZ2V0CitxdWlldF9jbWRfbGlua19vX3RhcmdldCA9IExEICAgICAgJEAKKyMgSWYgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBsaW5rIGlzIGVtcHR5LCBqdXN0IGNyZWF0ZSBhbiBlbXB0eSBidWlsdC1pbi5vCitjbWRfbGlua19vX3RhcmdldCA9ICQoaWYgJChzdHJpcCAkKG9iai15KSksXAorCQkkKExEKSAkKGxkX2ZsYWdzKSAtciAtbyAkQCAkKGZpbHRlciAkKG9iai15KSwgJF4pLFwKKwkJcm0gLWYgJEA7ICQoQVIpIHJjcyAkQCkKKworJChidWlsdGluLXRhcmdldCk6ICQob2JqLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19vX3RhcmdldCkKKwordGFyZ2V0cyArPSAkKGJ1aWx0aW4tdGFyZ2V0KQorZW5kaWYgIyBidWlsdGluLXRhcmdldAorCisjCisjIFJ1bGUgdG8gY29tcGlsZSBhIHNldCBvZiAubyBmaWxlcyBpbnRvIG9uZSAuYSBmaWxlCisjCitpZmRlZiBsaWItdGFyZ2V0CitxdWlldF9jbWRfbGlua19sX3RhcmdldCA9IEFSICAgICAgJEAKK2NtZF9saW5rX2xfdGFyZ2V0ID0gcm0gLWYgJEA7ICQoQVIpICQoRVhUUkFfQVJGTEFHUykgcmNzICRAICQobGliLXkpCisKKyQobGliLXRhcmdldCk6ICQobGliLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19sX3RhcmdldCkKKwordGFyZ2V0cyArPSAkKGxpYi10YXJnZXQpCitlbmRpZgorCisjCisjIFJ1bGUgdG8gbGluayBjb21wb3NpdGUgb2JqZWN0cworIworIyAgQ29tcG9zaXRlIG9iamVjdHMgYXJlIHNwZWNpZmllZCBpbiBrYnVpbGQgbWFrZWZpbGUgYXMgZm9sbG93czoKKyMgICAgPGNvbXBvc2l0ZS1vYmplY3Q+LW9ianMgOj0gPGxpc3Qgb2YgLm8gZmlsZXM+CisjICBvcgorIyAgICA8Y29tcG9zaXRlLW9iamVjdD4teSAgICA6PSA8bGlzdCBvZiAubyBmaWxlcz4KK2xpbmtfbXVsdGlfZGVwcyA9ICAgICAgICAgICAgICAgICAgICAgXAorJChmaWx0ZXIgJChhZGRwcmVmaXggJChvYmopLywgICAgICAgICBcCiskKCQoc3Vic3QgJChvYmopLywsJChAOi5vPS1vYmpzKSkpICAgIFwKKyQoJChzdWJzdCAkKG9iaikvLCwkKEA6Lm89LXkpKSkpLCAkXikKKworcXVpZXRfY21kX2xpbmtfbXVsdGkteSA9IExEICAgICAgJEAKK2NtZF9saW5rX211bHRpLXkgPSAkKExEKSAkKGxkX2ZsYWdzKSAtciAtbyAkQCAkKGxpbmtfbXVsdGlfZGVwcykKKworcXVpZXRfY21kX2xpbmtfbXVsdGktbSA9IExEIFtNXSAgJEAKK2NtZF9saW5rX211bHRpLW0gPSAkKExEKSAkKGxkX2ZsYWdzKSAkKExERkxBR1NfTU9EVUxFKSAtbyAkQCAkKGxpbmtfbXVsdGlfZGVwcykKKworIyBXZSB3b3VsZCByYXRoZXIgaGF2ZSBhIGxpc3Qgb2YgcnVsZXMgbGlrZQorIyAJZm9vLm86ICQoZm9vLW9ianMpCisjIGJ1dCB0aGF0J3Mgbm90IHNvIGVhc3ksIHNvIHdlIHJhdGhlciBtYWtlIGFsbCBjb21wb3NpdGUgb2JqZWN0cyBkZXBlbmQKKyMgb24gdGhlIHNldCBvZiBhbGwgdGhlaXIgcGFydHMKKyQobXVsdGktdXNlZC15KSA6ICUubzogJChtdWx0aS1vYmpzLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19tdWx0aS15KQorCiskKG11bHRpLXVzZWQtbSkgOiAlLm86ICQobXVsdGktb2Jqcy1tKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbXVsdGktbSkKKwlAeyBlY2hvICQoQDoubz0ua28pOyBlY2hvICQobGlua19tdWx0aV9kZXBzKTsgfSA+ICQoTU9EVkVSRElSKS8kKEBGOi5vPS5tb2QpCisKK3RhcmdldHMgKz0gJChtdWx0aS11c2VkLXkpICQobXVsdGktdXNlZC1tKQorCisKKyMgRGVzY2VuZGluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUEhPTlkgKz0gJChzdWJkaXIteW0pCiskKHN1YmRpci15bSk6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JEAKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUEhPTlkgKz0gRk9SQ0UKKworRk9SQ0U6CisKKyMgUmVhZCBhbGwgc2F2ZWQgY29tbWFuZCBsaW5lcyBhbmQgZGVwZW5kZW5jaWVzIGZvciB0aGUgJCh0YXJnZXRzKSB3ZQorIyBtYXkgYmUgYnVpbGRpbmcgYWJvdmUsIHVzaW5nICQoaWZfY2hhbmdlZHssX2RlcH0pLiBBcyBhbgorIyBvcHRpbWl6YXRpb24sIHdlIGRvbid0IG5lZWQgdG8gcmVhZCB0aGVtIGlmIHRoZSB0YXJnZXQgZG9lcyBub3QKKyMgZXhpc3QsIHdlIHdpbGwgcmVidWlsZCBhbnl3YXkgaW4gdGhhdCBjYXNlLgorCit0YXJnZXRzIDo9ICQod2lsZGNhcmQgJChzb3J0ICQodGFyZ2V0cykpKQorY21kX2ZpbGVzIDo9ICQod2lsZGNhcmQgJChmb3JlYWNoIGYsJCh0YXJnZXRzKSwkKGRpciAkKGYpKS4kKG5vdGRpciAkKGYpKS5jbWQpKQorCitpZm5lcSAoJChjbWRfZmlsZXMpLCkKKyAgaW5jbHVkZSAkKGNtZF9maWxlcykKK2VuZGlmCisKKworIyBEZWNsYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgLlBIT05ZIHZhcmlhYmxlIGFzIHBob255LiAgV2Uga2VlcCB0aGF0CisjIGluZm9ybWF0aW9uIGluIGEgdmFyaWFibGUgc2Ugd2UgY2FuIHVzZSBpdCBpbiBpZl9jaGFuZ2VkIGFuZCBmcmllbmRzLgorCisuUEhPTlk6ICQoUEhPTlkpCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmNsZWFuIGIvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2UzOTdmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbgpAQCAtMCwwICsxLDEwMiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDbGVhbmluZyB1cAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzcmMgOj0gJChvYmopCisKK1BIT05ZIDo9IF9fY2xlYW4KK19fY2xlYW46CisKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSBzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iaj1kaXIKKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoY2xlYW4pPWRpcgorY2xlYW4gOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqCisKKyMgVGhlIGZpbGVuYW1lIEtidWlsZCBoYXMgcHJlY2VkZW5jZSBvdmVyIE1ha2VmaWxlCitrYnVpbGQtZGlyIDo9ICQoaWYgJChmaWx0ZXIgLyUsJChzcmMpKSwkKHNyYyksJChzcmN0cmVlKS8kKHNyYykpCistaW5jbHVkZSAkKGlmICQod2lsZGNhcmQgJChrYnVpbGQtZGlyKS9LYnVpbGQpLCAkKGtidWlsZC1kaXIpL0tidWlsZCwgJChrYnVpbGQtZGlyKS9NYWtlZmlsZSkKKworIyBGaWd1cmUgb3V0IHdoYXQgd2UgbmVlZCB0byBidWlsZCBmcm9tIHRoZSB2YXJpb3VzIHZhcmlhYmxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitfX3N1YmRpci15CTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmoteSkpKQorc3ViZGlyLXkJKz0gJChfX3N1YmRpci15KQorX19zdWJkaXItbQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLW0pKSkKK3N1YmRpci1tCSs9ICQoX19zdWJkaXItbSkKK19fc3ViZGlyLW4JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1uKSkpCitzdWJkaXItbgkrPSAkKF9fc3ViZGlyLW4pCitfX3N1YmRpci0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai0pKSkKK3N1YmRpci0JCSs9ICQoX19zdWJkaXItKQorCisjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCisKK3N1YmRpci15bQk6PSAkKHNvcnQgJChzdWJkaXIteSkgJChzdWJkaXItbSkpCitzdWJkaXIteW1uICAgICAgOj0gJChzb3J0ICQoc3ViZGlyLXltKSAkKHN1YmRpci1uKSAkKHN1YmRpci0pKQorCisjIEFkZCBzdWJkaXIgcGF0aAorCitzdWJkaXIteW1uCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzdWJkaXIteW1uKSkKKworIyBidWlsZCBhIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLCB1c3VhbGx5IHJlbGVhdGl2ZSB0byB0aGUgY3VycmVudAorIyBkaXJlY3RvcnkKKworX19jbGVhbi1maWxlcwk6PSAkKGV4dHJhLXkpICQoRVhUUkFfVEFSR0VUUykgJChhbHdheXMpIFwKKwkJICAgJCh0YXJnZXRzKSAkKGNsZWFuLWZpbGVzKSAgICAgICAgICAgICBcCisJCSAgICQoaG9zdC1wcm9ncykgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAkKGhvc3Rwcm9ncy15KSAkKGhvc3Rwcm9ncy1tKSAkKGhvc3Rwcm9ncy0pCisKKyMgYXMgY2xlYW4tZmlsZXMgaXMgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGlzIGFkZHMKKyMgYSAkKG9iaikgcHJlZml4LCBleGNlcHQgZm9yIGFic29sdXRlIHBhdGhzCisKK19fY2xlYW4tZmlsZXMgICA6PSAkKHdpbGRjYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChvYmopLywgJChmaWx0ZXItb3V0IC8lLCAkKF9fY2xlYW4tZmlsZXMpKSkgXAorCQkgICAkKGZpbHRlciAvJSwgJChfX2NsZWFuLWZpbGVzKSkpCisKKyMgYXMgY2xlYW4tZGlycyBpcyBnaXZlbiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksIHRoaXMgYWRkcworIyBhICQob2JqKSBwcmVmaXgsIGV4Y2VwdCBmb3IgYWJzb2x1dGUgcGF0aHMKKworX19jbGVhbi1kaXJzICAgIDo9ICQod2lsZGNhcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGZpbHRlci1vdXQgLyUsICQoY2xlYW4tZGlycykpKSAgICBcCisJCSAgICQoZmlsdGVyIC8lLCAkKGNsZWFuLWRpcnMpKSkKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitxdWlldF9jbWRfY2xlYW4gICAgPSBDTEVBTiAgICQob2JqKQorICAgICAgY21kX2NsZWFuICAgID0gcm0gLWYgJChfX2NsZWFuLWZpbGVzKQorcXVpZXRfY21kX2NsZWFuZGlyID0gQ0xFQU4gICAkKF9fY2xlYW4tZGlycykKKyAgICAgIGNtZF9jbGVhbmRpciA9IHJtIC1yZiAkKF9fY2xlYW4tZGlycykKKworCitfX2NsZWFuOiAkKHN1YmRpci15bW4pCitpZm5lcSAoJChzdHJpcCAkKF9fY2xlYW4tZmlsZXMpKSwpCisJKyQoY2FsbCBjbWQsY2xlYW4pCitlbmRpZgoraWZuZXEgKCQoc3RyaXAgJChfX2NsZWFuLWRpcnMpKSwpCisJKyQoY2FsbCBjbWQsY2xlYW5kaXIpCitlbmRpZgoraWZuZXEgKCQoc3RyaXAgJChjbGVhbi1ydWxlKSksKQorCSskKGNsZWFuLXJ1bGUpCitlbmRpZgorCUA6CisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgR2VuZXJpYyBzdHVmZgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBEZXNjZW5kaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQSE9OWSArPSAkKHN1YmRpci15bW4pCiskKHN1YmRpci15bW4pOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSRACisKKyMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAorCitjbWQgPSBAJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLGVjaG8gJyAgJCgkKHF1aWV0KWNtZF8kKDEpKScgJiYpICQoY21kXyQoMSkpCisKKworIyBEZWNsYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgLlBIT05ZIHZhcmlhYmxlIGFzIHBob255LiAgV2Uga2VlcCB0aGF0CisjIGluZm9ybWF0aW9uIGluIGEgdmFyaWFibGUgc2Ugd2UgY2FuIHVzZSBpdCBpbiBpZl9jaGFuZ2VkIGFuZCBmcmllbmRzLgorCisuUEhPTlk6ICQoUEhPTlkpCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmhvc3QgYi9zY3JpcHRzL01ha2VmaWxlLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2Mjg1MAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuaG9zdApAQCAtMCwwICsxLDE1NSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZGluZyBiaW5hcmllcyBvbiB0aGUgaG9zdCBzeXN0ZW0KKyMgQmluYXJpZXMgYXJlIHVzZWQgZHVyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUga2VybmVsLCBmb3IgZXhhbXBsZQorIyB0byBwcmVwcm9jZXNzIGEgZGF0YSBmaWxlLgorIworIyBCb3RoIEMgYW5kIEMrKyBpcyBzdXBwb3J0ZWQsIGJ1dCBwcmVmZXJyZWQgbGFuZ3VhZ2UgaXMgQyBmb3Igc3VjaCB1dGlsaXRpZXMuCisjCisjIFNhbWxlIHN5bnRheCAoc2VlIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlLnR4dCBmb3IgcmVmZXJlbmNlKQorIyBob3N0cHJvZ3MteSA6PSBiaW4yaGV4CisjIFdpbGwgY29tcGlsZSBiaW4yaGV4LmMgYW5kIGNyZWF0ZSBhbiBleGVjdXRhYmxlIG5hbWVkIGJpbjJoZXgKKyMKKyMgaG9zdHByb2dzLXkgICAgOj0gbHhkaWFsb2cKKyMgbHhkaWFsb2ctb2JqcyA6PSBjaGVja2xpc3QubyBseGRpYWxvZy5vCisjIFdpbGwgY29tcGlsZSBseGRpYWxvZy5jIGFuZCBjaGVja2xpc3QuYywgYW5kIHRoZW4gbGluayB0aGUgZXhlY3V0YWJsZQorIyBseGRpYWxvZywgYmFzZWQgb24gY2hlY2tsaXN0Lm8gYW5kIGx4ZGlhbG9nLm8KKyMKKyMgaG9zdHByb2dzLXkgICAgICA6PSBxY29uZgorIyBxY29uZi1jeHhvYmpzICAgOj0gcWNvbmYubworIyBxY29uZi1vYmpzICAgICAgOj0gbWVudS5vCisjIFdpbGwgY29tcGlsZSBxY29uZiBhcyBhIEMrKyBwcm9ncmFtLCBhbmQgbWVudSBhcyBhIEMgcHJvZ3JhbS4KKyMgVGhleSBhcmUgbGlua2VkIGFzIEMrKyBjb2RlIHRvIHRoZSBleGVjdXRhYmxlIHFjb25mCisKKyMgaG9zdHByb2dzLXkgOj0gY29uZgorIyBjb25mLW9ianMgIDo9IGNvbmYubyBsaWJrY29uZmlnLnNvCisjIGxpYmtjb25maWctb2JqcyA6PSBleHByLm8gdHlwZS5vCisjIFdpbGwgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgbmFtZWQgbGlia2NvbmZpZy5zbyB0aGF0IGNvbnNpc3Qgb2YKKyMgZXhwci5vIGFuZCB0eXBlLm8gKHRoZXkgYXJlIGJvdGggY29tcGlsZWQgYXMgQyBjb2RlIGFuZCB0aGUgb2JqZWN0IGZpbGUKKyMgYXJlIG1hZGUgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSkuCisjIGNvbmYuYyBpcyBjb21waWxlZCBhcyBhIGMgcHJvZ3JhbSwgYW5kIGNvbmYubyBpcyBsaW5rZWQgdG9nZXRoZXIgd2l0aAorIyBsaWJrY29uZmlnLnNvIGFzIHRoZSBleGVjdXRhYmxlIGNvbmYuCisjIE5vdGU6IFNoYXJlZCBsaWJyYXJpZXMgY29uc2lzdGluZyBvZiBDKysgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKworX19ob3N0cHJvZ3MgOj0gJChzb3J0ICQoaG9zdHByb2dzLXkpJChob3N0cHJvZ3MtbSkpCisKKyMgaG9zdHByb2dzLXkgOj0gdG9vbHMvYnVpbGQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQuIFJldHJlaXZlIGRpcmVjdG9yeQorb2JqLWRpcnMgKz0gJChmb3JlYWNoIGYsJChfX2hvc3Rwcm9ncyksICQoaWYgJChkaXIgJChmKSksJChkaXIgJChmKSkpKQorb2JqLWRpcnMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IC4vLCQob2JqLWRpcnMpKSkpCisKKworIyBDIGNvZGUKKyMgRXhlY3V0YWJsZXMgY29tcGlsZWQgZnJvbSBhIHNpbmdsZSAuYyBmaWxlCitob3N0LWNzaW5nbGUJOj0gJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJChpZiAkKCQobSktb2JqcyksLCQobSkpKQorCisjIEMgZXhlY3V0YWJsZXMgbGlua2VkIGJhc2VkIG9uIHNldmVyYWwgLm8gZmlsZXMKK2hvc3QtY211bHRpCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLFwKKwkJICAgJChpZiAkKCQobSktY3h4b2JqcyksLCQoaWYgJCgkKG0pLW9ianMpLCQobSkpKSkKKworIyBPYmplY3QgKC5vKSBmaWxlcyBjb21waWxlZCBmcm9tIC5jIGZpbGVzCitob3N0LWNvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKF9faG9zdHByb2dzKSwkKCQobSktb2JqcykpKQorCisjIEMrKyBjb2RlCisjIEMrKyBleGVjdXRhYmxlcyBjb21waWxlZCBmcm9tIGF0IGxlYXN0IG9uIC5jYyBmaWxlCisjIGFuZCB6ZXJvIG9yIG1vcmUgLmMgZmlsZXMKK2hvc3QtY3h4bXVsdGkJOj0gJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJChpZiAkKCQobSktY3h4b2JqcyksJChtKSkpCisKKyMgQysrIE9iamVjdCAoLm8pIGZpbGVzIGNvbXBpbGVkIGZyb20gLmNjIGZpbGVzCitob3N0LWN4eG9ianMJOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQoaG9zdC1jeHhtdWx0aSksJCgkKG0pLWN4eG9ianMpKSkKKworIyBTaGFyZWQgbGliYXJpZXMgKG9ubHkgLmMgc3VwcG9ydGVkKQorIyBTaGFyZWQgbGlicmFyaWVzICguc28pIC0gYWxsIC5zbyBmaWxlcyByZWZlcmVuY2VkIGluICJ4eHgtb2JqcyIKK2hvc3QtY3NobGliCTo9ICQoc29ydCAkKGZpbHRlciAlLnNvLCAkKGhvc3QtY29ianMpKSkKKyMgUmVtb3ZlIC5zbyBmaWxlcyBmcm9tICJ4eHgtb2JqcyIKK2hvc3QtY29ianMJOj0gJChmaWx0ZXItb3V0ICUuc28sJChob3N0LWNvYmpzKSkKKworI09iamVjdCAoLm8pIGZpbGVzIHVzZWQgYnkgdGhlIHNoYXJlZCBsaWJhcmllcworaG9zdC1jc2hvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKGhvc3QtY3NobGliKSwkKCQobTouc289LW9ianMpKSkpCisKK19faG9zdHByb2dzICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoX19ob3N0cHJvZ3MpKQoraG9zdC1jc2luZ2xlCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaW5nbGUpKQoraG9zdC1jbXVsdGkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY211bHRpKSkKK2hvc3QtY29ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY29ianMpKQoraG9zdC1jeHhtdWx0aQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jeHhtdWx0aSkpCitob3N0LWN4eG9ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3h4b2JqcykpCitob3N0LWNzaGxpYgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2hsaWIpKQoraG9zdC1jc2hvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaG9ianMpKQorb2JqLWRpcnMgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmotZGlycykpCisKKyMjIyMjCisjIEhhbmRsZSBvcHRpb25zIHRvIGdjYy4gU3VwcG9ydCBidWlsZGluZyB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKKworX2hvc3RjX2ZsYWdzICAgPSAkKEhPU1RDRkxBR1MpICAgJChIT1NUX0VYVFJBQ0ZMQUdTKSAgICQoSE9TVENGTEFHU18kKCpGKS5vKQorX2hvc3RjeHhfZmxhZ3MgPSAkKEhPU1RDWFhGTEFHUykgJChIT1NUX0VYVFJBQ1hYRkxBR1MpICQoSE9TVENYWEZMQUdTXyQoKkYpLm8pCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorX19ob3N0Y19mbGFncwk9ICQoX2hvc3RjX2ZsYWdzKQorX19ob3N0Y3h4X2ZsYWdzCT0gJChfaG9zdGN4eF9mbGFncykKK2Vsc2UKK19faG9zdGNfZmxhZ3MJPSAtSSQob2JqKSAkKGNhbGwgZmxhZ3MsX2hvc3RjX2ZsYWdzKQorX19ob3N0Y3h4X2ZsYWdzCT0gLUkkKG9iaikgJChjYWxsIGZsYWdzLF9ob3N0Y3h4X2ZsYWdzKQorZW5kaWYKKworaG9zdGNfZmxhZ3MgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChfX2hvc3RjX2ZsYWdzKQoraG9zdGN4eF9mbGFncyAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChfX2hvc3RjeHhfZmxhZ3MpCisKKyMjIyMjCisjIENvbXBpbGUgcHJvZ3JhbXMgb24gdGhlIGhvc3QKKworIyBDcmVhdGUgZXhlY3V0YWJsZSBmcm9tIGEgc2luZ2xlIC5jIGZpbGUKKyMgaG9zdC1jc2luZ2xlIC0+IEV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWNzaW5nbGUgCT0gSE9TVENDICAkQAorICAgICAgY21kX2hvc3QtY3NpbmdsZQk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAtbyAkQCAkPCBcCisJCQkgICQoSE9TVF9MT0FETElCRVMpICQoSE9TVExPQURMSUJFU18kKEBGKSkKKyQoaG9zdC1jc2luZ2xlKTogJTogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGhvc3QtY3NpbmdsZSkKKworIyBMaW5rIGFuIGV4ZWN1dGFibGUgYmFzZWQgb24gbGlzdCBvZiAubyBmaWxlcywgYWxsIHBsYWluIGMKKyMgaG9zdC1jbXVsdGkgLT4gZXhlY3V0YWJsZQorcXVpZXRfY21kX2hvc3QtY211bHRpCT0gSE9TVExEICAkQAorICAgICAgY21kX2hvc3QtY211bHRpCT0gJChIT1NUQ0MpICQoSE9TVExERkxBR1MpIC1vICRAIFwKKwkJCSAgJChhZGRwcmVmaXggJChvYmopLywkKCQoQEYpLW9ianMpKSBcCisJCQkgICQoSE9TVF9MT0FETElCRVMpICQoSE9TVExPQURMSUJFU18kKEBGKSkKKyQoaG9zdC1jbXVsdGkpOiAlOiAkKGhvc3QtY29ianMpICQoaG9zdC1jc2hsaWIpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsaG9zdC1jbXVsdGkpCisKKyMgQ3JlYXRlIC5vIGZpbGUgZnJvbSBhIHNpbmdsZSAuYyBmaWxlCisjIGhvc3QtY29ianMgLT4gLm8KK3F1aWV0X2NtZF9ob3N0LWNvYmpzCT0gSE9TVENDICAkQAorICAgICAgY21kX2hvc3QtY29ianMJPSAkKEhPU1RDQykgJChob3N0Y19mbGFncykgLWMgLW8gJEAgJDwKKyQoaG9zdC1jb2Jqcyk6ICUubzogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGhvc3QtY29ianMpCisKKyMgTGluayBhbiBleGVjdXRhYmxlIGJhc2VkIG9uIGxpc3Qgb2YgLm8gZmlsZXMsIGEgbWl4dHVyZSBvZiAuYyBhbmQgLmNjCisjIGhvc3QtY3h4bXVsdGkgLT4gZXhlY3V0YWJsZQorcXVpZXRfY21kX2hvc3QtY3h4bXVsdGkJPSBIT1NUTEQgICRACisgICAgICBjbWRfaG9zdC1jeHhtdWx0aQk9ICQoSE9TVENYWCkgJChIT1NUTERGTEFHUykgLW8gJEAgXAorCQkJICAkKGZvcmVhY2ggbyxvYmpzIGN4eG9ianMsXAorCQkJICAkKGFkZHByZWZpeCAkKG9iaikvLCQoJChARiktJChvKSkpKSBcCisJCQkgICQoSE9TVF9MT0FETElCRVMpICQoSE9TVExPQURMSUJFU18kKEBGKSkKKyQoaG9zdC1jeHhtdWx0aSk6ICU6ICQoaG9zdC1jb2JqcykgJChob3N0LWN4eG9ianMpICQoaG9zdC1jc2hsaWIpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsaG9zdC1jeHhtdWx0aSkKKworIyBDcmVhdGUgLm8gZmlsZSBmcm9tIGEgc2luZ2xlIC5jYyAoQysrKSBmaWxlCitxdWlldF9jbWRfaG9zdC1jeHhvYmpzCT0gSE9TVENYWCAkQAorICAgICAgY21kX2hvc3QtY3h4b2Jqcwk9ICQoSE9TVENYWCkgJChob3N0Y3h4X2ZsYWdzKSAtYyAtbyAkQCAkPAorJChob3N0LWN4eG9ianMpOiAlLm86ICUuY2MgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jeHhvYmpzKQorCisjIENvbXBpbGUgLmMgZmlsZSwgY3JlYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IC5vIGZpbGUKKyMgaG9zdC1jc2hvYmpzIC0+IC5vCitxdWlldF9jbWRfaG9zdC1jc2hvYmpzCT0gSE9TVENDICAtZlBJQyAkQAorICAgICAgY21kX2hvc3QtY3Nob2Jqcwk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAtZlBJQyAtYyAtbyAkQCAkPAorJChob3N0LWNzaG9ianMpOiAlLm86ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWNzaG9ianMpCisKKyMgTGluayBhIHNoYXJlZCBsaWJyYXJ5LCBiYXNlZCBvbiBwb3NpdGlvbiBpbmRlcGVuZGVudCAubyBmaWxlcworIyAqLm8gLT4gLnNvIHNoYXJlZCBsaWJyYXJ5IChob3N0LWNzaGxpYikKK3F1aWV0X2NtZF9ob3N0LWNzaGxpYgk9IEhPU1RMTEQgLXNoYXJlZCAkQAorICAgICAgY21kX2hvc3QtY3NobGliCT0gJChIT1NUQ0MpICQoSE9TVExERkxBR1MpIC1zaGFyZWQgLW8gJEAgXAorCQkJICAkKGFkZHByZWZpeCAkKG9iaikvLCQoJChARjouc289LW9ianMpKSkgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY3NobGliKTogJTogJChob3N0LWNzaG9ianMpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsaG9zdC1jc2hsaWIpCisKK3RhcmdldHMgKz0gJChob3N0LWNzaW5nbGUpICAkKGhvc3QtY211bHRpKSAkKGhvc3QtY29ianMpXAorCSAgICQoaG9zdC1jeHhtdWx0aSkgJChob3N0LWN4eG9ianMpICQoaG9zdC1jc2hsaWIpICQoaG9zdC1jc2hvYmpzKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5saWIgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU0ZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTAsMCArMSwxNzAgQEAKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIHRvIGJlIHJlbW92ZWQuLi4KK2V4dHJhLXkJKz0gJChFWFRSQV9UQVJHRVRTKQorIyBGaWd1cmUgb3V0IHdoYXQgd2UgbmVlZCB0byBidWlsZCBmcm9tIHRoZSB2YXJpb3VzIHZhcmlhYmxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBXaGVuIGFuIG9iamVjdCBpcyBsaXN0ZWQgdG8gYmUgYnVpbHQgY29tcGlsZWQtaW4gYW5kIG1vZHVsYXIsCisjIG9ubHkgYnVpbGQgdGhlIGNvbXBpbGVkLWluIHZlcnNpb24KKworb2JqLW0gOj0gJChmaWx0ZXItb3V0ICQob2JqLXkpLCQob2JqLW0pKQorCisjIExpYnJhcmllcyBhcmUgYWx3YXlzIGNvbGxlY3RlZCBpbiBvbmUgbGliIGZpbGUuCisjIEZpbHRlciBvdXQgb2JqZWN0cyBhbHJlYWR5IGJ1aWx0LWluCisKK2xpYi15IDo9ICQoZmlsdGVyLW91dCAkKG9iai15KSwgJChzb3J0ICQobGliLXkpICQobGliLW0pKSkKKworCisjIEhhbmRsZSBvYmplY3RzIGluIHN1YmRpcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmoteSksIHJlcGxhY2UgaXQgYnkgZm9vL2J1aWx0LWluLm8KKyMgICBhbmQgYWRkIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlycyB0byBkZXNjZW5kIGludG86ICQoc3ViZGlyLXkpCisjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmotbSksIHJlbW92ZSBpdCBmcm9tICQob2JqLW0pCisjICAgYW5kIGFkZCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcnMgdG8gZGVzY2VuZCBpbnRvOiAkKHN1YmRpci1tKQorCitfX3N1YmRpci15CTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmoteSkpKQorc3ViZGlyLXkJKz0gJChfX3N1YmRpci15KQorX19zdWJkaXItbQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLW0pKSkKK3N1YmRpci1tCSs9ICQoX19zdWJkaXItbSkKK29iai15CQk6PSAkKHBhdHN1YnN0ICUvLCAlL2J1aWx0LWluLm8sICQob2JqLXkpKQorb2JqLW0JCTo9ICQoZmlsdGVyLW91dCAlLywgJChvYmotbSkpCisKKyMgU3ViZGlyZWN0b3JpZXMgd2UgbmVlZCB0byBkZXNjZW5kIGludG8KKworc3ViZGlyLXltCTo9ICQoc29ydCAkKHN1YmRpci15KSAkKHN1YmRpci1tKSkKKworIyBpZiAkKGZvby1vYmpzKSBleGlzdHMsIGZvby5vIGlzIGEgY29tcG9zaXRlIG9iamVjdAorbXVsdGktdXNlZC15IDo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKG9iai15KSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksICQobSkpKSkKK211bHRpLXVzZWQtbSA6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChvYmotbSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCAkKG0pKSkpCittdWx0aS11c2VkICAgOj0gJChtdWx0aS11c2VkLXkpICQobXVsdGktdXNlZC1tKQorc2luZ2xlLXVzZWQtbSA6PSAkKHNvcnQgJChmaWx0ZXItb3V0ICQobXVsdGktdXNlZC1tKSwkKG9iai1tKSkpCisKKyMgQnVpbGQgbGlzdCBvZiB0aGUgcGFydHMgb2Ygb3VyIGNvbXBvc2l0ZSBvYmplY3RzLCBvdXIgY29tcG9zaXRlCisjIG9iamVjdHMgZGVwZW5kIG9uIHRob3NlIChvYnZpb3VzbHkpCittdWx0aS1vYmpzLXkgOj0gJChmb3JlYWNoIG0sICQobXVsdGktdXNlZC15KSwgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKQorbXVsdGktb2Jqcy1tIDo9ICQoZm9yZWFjaCBtLCAkKG11bHRpLXVzZWQtbSksICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSkKK211bHRpLW9ianMgICA6PSAkKG11bHRpLW9ianMteSkgJChtdWx0aS1vYmpzLW0pCisKKyMgJChzdWJkaXItb2JqLXkpIGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gJChvYmoteSkgd2hpY2ggZG8gbm90IGxpdmUKKyMgaW4gdGhlIGxvY2FsIGRpcmVjdG9yeQorc3ViZGlyLW9iai15IDo9ICQoZm9yZWFjaCBvLCQob2JqLXkpLCQoaWYgJChmaWx0ZXItb3V0ICQobyksJChub3RkaXIgJChvKSkpLCQobykpKQorCisjICQob2JqLWRpcnMpIGlzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gb2JqZWN0IGZpbGVzCitvYmotZGlycyA6PSAkKGRpciAkKG11bHRpLW9ianMpICQoc3ViZGlyLW9iai15KSkKKworIyBSZXBsYWNlIG11bHRpLXBhcnQgb2JqZWN0cyBieSB0aGVpciBpbmRpdmlkdWFsIHBhcnRzLCBsb29rIGF0IGxvY2FsIGRpciBvbmx5CityZWFsLW9ianMteSA6PSAkKGZvcmVhY2ggbSwgJChmaWx0ZXItb3V0ICQoc3ViZGlyLW9iai15KSwgJChvYmoteSkpLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSksJChtKSkpICQoZXh0cmEteSkKK3JlYWwtb2Jqcy1tIDo9ICQoZm9yZWFjaCBtLCAkKG9iai1tKSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpLCQobSkpKQorCisjIEFkZCBzdWJkaXIgcGF0aAorCitleHRyYS15CQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoZXh0cmEteSkpCithbHdheXMJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChhbHdheXMpKQordGFyZ2V0cwkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKHRhcmdldHMpKQorb2JqLXkJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmoteSkpCitvYmotbQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG9iai1tKSkKK2xpYi15CQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobGliLXkpKQorc3ViZGlyLW9iai15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzdWJkaXItb2JqLXkpKQorcmVhbC1vYmpzLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKHJlYWwtb2Jqcy15KSkKK3JlYWwtb2Jqcy1tCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChyZWFsLW9ianMtbSkpCitzaW5nbGUtdXNlZC1tCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzaW5nbGUtdXNlZC1tKSkKK211bHRpLXVzZWQteQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobXVsdGktdXNlZC15KSkKK211bHRpLXVzZWQtbQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobXVsdGktdXNlZC1tKSkKK211bHRpLW9ianMteQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobXVsdGktb2Jqcy15KSkKK211bHRpLW9ianMtbQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobXVsdGktb2Jqcy1tKSkKK3N1YmRpci15bQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltKSkKK29iai1kaXJzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmotZGlycykpCisKKyMgVGhlc2UgZmxhZ3MgYXJlIG5lZWRlZCBmb3IgbW9kdmVyc2lvbnMgYW5kIGNvbXBpbGluZywgc28gd2UgZGVmaW5lIHRoZW0gaGVyZQorIyBhbHJlYWR5CisjICQobW9kbmFtZV9mbGFncykgI2RlZmluZXMgS0JVSUxEX01PRE5BTUUgYXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBpdCB3aWxsCisjIGVuZCB1cCBpbiAob3Igd291bGQsIGlmIGl0IGdldHMgY29tcGlsZWQgaW4pCisjIE5vdGU6IEl0J3MgcG9zc2libGUgdGhhdCBvbmUgb2JqZWN0IGdldHMgcG90ZW50aWFsbHkgbGlua2VkIGludG8gbW9yZQorIyAgICAgICB0aGFuIG9uZSBtb2R1bGUuIEluIHRoYXQgY2FzZSBLQlVJTERfTU9ETkFNRSB3aWxsIGJlIHNldCB0byBmb29fYmFyLAorIyAgICAgICB3aGVyZSBmb28gYW5kIGJhciBhcmUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZXMuCituYW1lLWZpeCA9ICQoc3Vic3QgJChjb21tYSksXywkKHN1YnN0IC0sXywkMSkpCitiYXNlbmFtZV9mbGFncyA9IC1EIktCVUlMRF9CQVNFTkFNRT1LQlVJTERfU1RSKCQoY2FsbCBuYW1lLWZpeCwkKCpGKSkpIgorbW9kbmFtZV9mbGFncyAgPSAkKGlmICQoZmlsdGVyIDEsJCh3b3JkcyAkKG1vZG5hbWUpKSksXAorICAgICAgICAgICAgICAgICAtRCJLQlVJTERfTU9ETkFNRT1LQlVJTERfU1RSKCQoY2FsbCBuYW1lLWZpeCwkKG1vZG5hbWUpKSkiKQorCitfY19mbGFncyAgICAgICA9ICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykgJChDRkxBR1NfJCgqRikubykKK19hX2ZsYWdzICAgICAgID0gJChBRkxBR1MpICQoRVhUUkFfQUZMQUdTKSAkKEFGTEFHU18kKCpGKS5vKQorX2NwcF9mbGFncyAgICAgPSAkKENQUEZMQUdTKSAkKEVYVFJBX0NQUEZMQUdTKSAkKENQUEZMQUdTXyQoQEYpKQorCisjIElmIGJ1aWxkaW5nIHRoZSBrZXJuZWwgaW4gYSBzZXBhcmF0ZSBvYmp0cmVlIGV4cGFuZCBhbGwgb2NjdXJyZW5jZXMKKyMgb2YgLUlkaXIgdG8gLUkkKHNyY3RyZWUpL2RpciBleGNlcHQgZm9yIGFic29sdXRlIHBhdGhzIChzdGFydGluZyB3aXRoICcvJykuCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorX19jX2ZsYWdzCT0gJChfY19mbGFncykKK19fYV9mbGFncwk9ICQoX2FfZmxhZ3MpCitfX2NwcF9mbGFncyAgICAgPSAkKF9jcHBfZmxhZ3MpCitlbHNlCisKKyMgLUkkKG9iaikgbG9jYXRlcyBnZW5lcmF0ZWQgLmggZmlsZXMKKyMgJChjYWxsIGFkZHRyZWUsLUkkKG9iaikpIGxvY2F0ZXMgLmggZmlsZXMgaW4gc3JjdHJlZSwgZnJvbSBnZW5lcmF0ZWQgLmMgZmlsZXMKKyMgICBhbmQgbG9jYXRlcyBnZW5lcmF0ZWQgLmggZmlsZXMKKyMgRklYTUU6IFJlcGxhY2UgYm90aCB3aXRoIHNwZWNpZmljIENGTEFHUyogc3RhdGVtZW50cyBpbiB0aGUgbWFrZWZpbGVzCitfX2NfZmxhZ3MJPSAkKGNhbGwgYWRkdHJlZSwtSSQob2JqKSkgJChjYWxsIGZsYWdzLF9jX2ZsYWdzKQorX19hX2ZsYWdzCT0gICAgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBmbGFncyxfYV9mbGFncykKK19fY3BwX2ZsYWdzICAgICA9ICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZmxhZ3MsX2NwcF9mbGFncykKK2VuZGlmCisKK2NfZmxhZ3MgICAgICAgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoTk9TVERJTkNfRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkJICQoX19jX2ZsYWdzKSAkKG1vZGtlcm5fY2ZsYWdzKSBcCisJCSAtRCJLQlVJTERfU1RSKHMpPVwjcyIgJChiYXNlbmFtZV9mbGFncykgJChtb2RuYW1lX2ZsYWdzKQorCithX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fYV9mbGFncykgJChtb2RrZXJuX2FmbGFncykKKworY3BwX2ZsYWdzICAgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChOT1NURElOQ19GTEFHUykgJChfX2NwcF9mbGFncykKKworIyBTZWVtcyB0byBiZSBhIHdyb25nIHRoaW5nIHRvIGRvLiBMREZMQUdTIGNvbnRhaW5zIGdjYydzIGZsYWdzLAorIyB5ZXQgbGRfZmxhZ3MgaXMgZmVkIHRvIGxkLgorI2xkX2ZsYWdzICAgICAgID0gJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpCisjIFJlbW92ZSB0aGUgLVdsLCBwcmVmaXggZnJvbSBsaW5rZXIgb3B0aW9ucyBub3JtYWxseSBwYXNzZWQgdGhyb3VnaCBnY2MKK2xkX2ZsYWdzICAgICAgID0gJChmaWx0ZXItb3V0IC1XbCQoY29tbWEpJSwkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykpCisKKworIyBGaW5kcyB0aGUgbXVsdGktcGFydCBvYmplY3QgdGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgbGlua2VkIGludG8KK21vZG5hbWUtbXVsdGkgPSAkKHNvcnQgJChmb3JlYWNoIG0sJChtdWx0aS11c2VkKSxcCisJCSQoaWYgJChmaWx0ZXIgJChzdWJzdCAkKG9iaikvLCwkKi5vKSwgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwkKG06Lm89KSkpKQorCisjIFNoaXBwZWQgZmlsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3F1aWV0X2NtZF9zaGlwcGVkID0gU0hJUFBFRCAkQAorY21kX3NoaXBwZWQgPSBjYXQgJDwgPiAkQAorCiskKG9iaikvJTo6ICQoc3JjKS8lX3NoaXBwZWQKKwkkKGNhbGwgY21kLHNoaXBwZWQpCisKKyMgQ29tbWFuZHMgdXNlZnVsIGZvciBidWlsZGluZyBhIGJvb3QgaW1hZ2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjCVVzZSBhcyBmb2xsb3dpbmc6CisjCisjCXRhcmdldDogc291cmNlKHMpIEZPUkNFCisjCQkkKGlmX2NoYW5nZWQsbGQvb2JqY29weS9nemlwKQorIworIwlhbmQgYWRkIHRhcmdldCB0byBFWFRSQV9UQVJHRVRTIHNvIHRoYXQgd2Uga25vdyB3ZSBoYXZlIHRvCisjCXJlYWQgaW4gdGhlIHNhdmVkIGNvbW1hbmQgbGluZQorCisjIExpbmtpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVE9ETzogTERGTEFHUyB1c3VhbGx5IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gZ2NjJ3MgZmxhZ3MsIG5vdCBsZCdzLgorIyBidXQgaGVyZSB3ZSBmZWVkIHRoZW0gdG8gbGQhCitxdWlldF9jbWRfbGQgPSBMRCAgICAgICRACitjbWRfbGQgPSAkKExEKSAkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykgJChMREZMQUdTXyQoQEYpKSBcCisJICAgICAgICQoZmlsdGVyLW91dCBGT1JDRSwkXikgLW8gJEAKKworIyBPYmpjb3B5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitxdWlldF9jbWRfb2JqY29weSA9IE9CSkNPUFkgJEAKK2NtZF9vYmpjb3B5ID0gJChPQkpDT1BZKSAkKE9CSkNPUFlGTEFHUykgJChPQkpDT1BZRkxBR1NfJChARikpICQ8ICRACisKKyMgR3ppcAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcXVpZXRfY21kX2d6aXAgPSBHWklQICAgICRACitjbWRfZ3ppcCA9IGd6aXAgLWYgLTkgPCAkPCA+ICRACmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlIGIvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTlmMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZQpAQCAtMCwwICsxLDE4IEBACisjIyMKKyMgTWFrZWZpbGUuYmFzaWMgbGlzdCB0aGUgbW9zdCBiYXNpYyBwcm9ncmFtcyB1c2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4KKyMgVGhlIHByb2dyYW1zIGxpc3RlZCBoZXJlaW4gaXMgd2hhdCBpcyBuZWVkZWQgdG8gZG8gdGhlIGJhc2ljIHN0dWZmLAorIyBzdWNoIGFzIHNwbGl0dGluZyAuY29uZmlnIGFuZCBmaXggZGVwZW5kZW5jeSBmaWxlLgorIyBUaGlzIGluaXRpYWwgc3RlcCBpcyBuZWVkZWQgdG8gYXZvaWQgZmlsZXMgdG8gYmUgcmVjb21waWxlZAorIyB3aGVuIGJ1c3lib3ggY29uZmlndXJhdGlvbiBjaGFuZ2VzICh3aGljaCBpcyB3aGF0IGhhcHBlbnMgd2hlbgorIyAuY29uZmlnIGlzIGluY2x1ZGVkIGJ5IG1haW4gTWFrZWZpbGUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmaXhkZXA6IAkgVXNlZCB0byBnZW5lcmF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGR1cmluZyBidWlsZCBwcm9jZXNzCisjIHNwbGl0LWluY2x1ZGU6IERpdmlkZSBhbGwgY29uZmlnIHN5bWJvbHMgdXAgaW4gYSBudW1iZXIgb2YgZmlsZXMgaW4KKyMgICAgICAgICAgICAgICAgaW5jbHVkZS9jb25maWcvLi4uCisjIGRvY3Byb2M6CSBVc2VkIGluIERvY3VtZW50YXRpb24vZG9jYm9vaworCitob3N0cHJvZ3MteQk6PSBmaXhkZXAgc3BsaXQtaW5jbHVkZSBkb2Nwcm9jCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCisKKyMgZml4ZGVwIGlzIG5lZWRlZCB0byBjb21waWxlIG90aGVyIGhvc3QgcHJvZ3JhbXMKKyQoYWRkcHJlZml4ICQob2JqKS8sJChmaWx0ZXItb3V0IGZpeGRlcCwkKGFsd2F5cykpKTogJChvYmopL2ZpeGRlcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMgYi9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg0ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKglkb2Nwcm9jIGlzIGEgc2ltcGxlIHByZXByb2Nlc3NvciBmb3IgdGhlIHRlbXBsYXRlIGZpbGVzCisgKiAgICAgIHVzZWQgYXMgcGxhY2Vob2xkZXJzIGZvciB0aGUga2VybmVsIGludGVybmFsIGRvY3VtZW50YXRpb24uCisgKglkb2Nwcm9jIGlzIHVzZWQgZm9yIGRvY3VtZW50YXRpb24tZnJvbnRlbmQgYW5kCisgKiAgICAgIGRlcGVuZGVuY3ktZ2VuZXJhdG9yLgorICoJVGhlIHR3byB1c2FnZXMgaGF2ZSBpbiBjb21tb24gdGhhdCB0aGV5IHJlcXVpcmUKKyAqCXNvbWUga25vd2xlZGdlIG9mIHRoZSAudG1wbCBzeW50YXgsIHRoZXJlZm9yZSB0aGV5CisgKglhcmUga2VwdCB0b2dldGhlci4KKyAqCisgKglkb2N1bWVudGF0aW9uLWZyb250ZW5kCisgKgkJU2NhbnMgdGhlIHRlbXBsYXRlIGZpbGUgYW5kIGNhbGwga2VybmVsLWRvYyBmb3IKKyAqCQlhbGwgb2NjdXJyZW5jZXMgb2YgIVtFSUZdZmlsZQorICoJCUJlZm9yZWhhbmQgZWFjaCByZWZlcmVuY2VkIGZpbGUgYXJlIHNjYW5uZWQgZm9yCisgKgkJYW55IGV4cG9ydGVkIHN5bXBvbHMgIkVYUE9SVF9TWU1CT0woKSIgc3RhdGVtZW50cy4KKyAqCQlUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIHByb3BlciAtZnVuY3Rpb24gYW5kCisgKgkJLW5vZnVuY3Rpb24gYXJndW1lbnRzIGluIGNhbGxzIHRvIGtlcm5lbC1kb2MuCisgKgkJVXNhZ2U6IGRvY3Byb2MgZG9jIGZpbGUudG1wbAorICoKKyAqCWRlcGVuZGVuY3ktZ2VuZXJhdG9yOgorICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBsaXN0IGFsbCBmaWxlcworICoJCXJlZmVyZW5jZWQgaW4gYSBmb3JtYXQgcmVjb2duaXplZCBieSBtYWtlLgorICoJCVVzYWdlOglkb2Nwcm9jIGRlcGVuZCBmaWxlLnRtcGwKKyAqCQlXcml0ZXMgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0byBzdGRvdXQKKyAqCQlpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqCQlmaWxlLnRtcGwgc3JjLmMJc3JjMi5jCisgKgkJVGhlIGZpbGVuYW1lcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdHM6CisgKgkJIUVmaWxlbmFtZQorICoJCSFJZmlsZW5hbWUKKyAqCQkhRGZpbGVuYW1lCisgKgkJIUZmaWxlbmFtZQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKy8qIGV4aXRzdGF0dXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGFueSBmYWlsaW5nIGNhbGxzIHRvIGtlcm5lbC1kb2MsCisgKiBidXQgZXhlY3V0aW9uIGNvbnRpbnVlcy4gKi8KK2ludCBleGl0c3RhdHVzID0gMDsKKwordHlwZWRlZiB2b2lkIERGTChjaGFyICopOworREZMICpkZWZhdWx0bGluZTsKKwordHlwZWRlZiB2b2lkIEZJTEVPTkxZKGNoYXIgKiBmaWxlKTsKK0ZJTEVPTkxZICppbnRlcm5hbGZ1bmN0aW9uczsKK0ZJTEVPTkxZICpleHRlcm5hbGZ1bmN0aW9uczsKK0ZJTEVPTkxZICpzeW1ib2xzb25seTsKKwordHlwZWRlZiB2b2lkIEZJTEVMSU5FKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSk7CitGSUxFTElORSAqIHNpbmdsZWZ1bmN0aW9uczsKK0ZJTEVMSU5FICogZW50aXR5X3N5c3RlbTsKKworI2RlZmluZSBNQVhMSU5FU1ogICAgIDIwNDgKKyNkZWZpbmUgTUFYRklMRVMgICAgICAyNTAKKyNkZWZpbmUgS0VSTkVMRE9DUEFUSCAic2NyaXB0cy8iCisjZGVmaW5lIEtFUk5FTERPQyAgICAgImtlcm5lbC1kb2MiCisjZGVmaW5lIERPQ0JPT0sgICAgICAgIi1kb2Nib29rIgorI2RlZmluZSBGVU5DVElPTiAgICAgICItZnVuY3Rpb24iCisjZGVmaW5lIE5PRlVOQ1RJT04gICAgIi1ub2Z1bmN0aW9uIgorCit2b2lkIHVzYWdlICh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGRvY3Byb2Mge2RvY3xkZXBlbmR9IGZpbGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiSW5wdXQgaXMgcmVhZCBmcm9tIGZpbGUudG1wbC4gT3V0cHV0IGlzIHNlbnQgdG8gc3Rkb3V0XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImRvYzogZnJvbnRlbmQgd2hlbiBnZW5lcmF0aW5nIGtlcm5lbCBkb2N1bWVudGF0aW9uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImRlcGVuZDogZ2VuZXJhdGUgbGlzdCBvZiBmaWxlcyByZWZlcmVuY2VkIHdpdGhpbiBmaWxlXG4iKTsKK30KKworLyoKKyAqIEV4ZWN1dGUga2VybmVsLWRvYyB3aXRoIHBhcmFtZXRlcnMgZ2l2aW4gaW4gc3ZlYworICovCit2b2lkIGV4ZWNfa2VybmVsX2RvYyhjaGFyICoqc3ZlYykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHJldDsKKwljaGFyICpyZWFsX2ZpbGVuYW1lOworCWludCByZmxlbjsKKworCS8qIE1ha2Ugc3VyZSBvdXRwdXQgZ2VuZXJhdGVkIHNvIGZhciBhcmUgZmx1c2hlZCAqLworCWZmbHVzaChzdGRvdXQpOworCXN3aXRjaChwaWQ9Zm9yaygpKSB7CisJCWNhc2UgLTE6CisJCQlwZXJyb3IoInZmb3JrIisxKTsKKwkJCWV4aXQoMSk7CisJCWNhc2UgIDA6CisJCQlyZmxlbiAgPSBzdHJsZW4oZ2V0ZW52KCJTUkNUUkVFIikpOworCQkJcmZsZW4gKz0gc3RybGVuKEtFUk5FTERPQ1BBVEggS0VSTkVMRE9DKTsKKwkJCXJlYWxfZmlsZW5hbWUgPSBhbGxvY2EocmZsZW4gKyAxKTsKKwkJCXN0cmNweShyZWFsX2ZpbGVuYW1lLCBnZXRlbnYoIlNSQ1RSRUUiKSk7CisJCQlzdHJjYXQocmVhbF9maWxlbmFtZSwgS0VSTkVMRE9DUEFUSCBLRVJORUxET0MpOworCQkJZXhlY3ZwKHJlYWxfZmlsZW5hbWUsIHN2ZWMpOworCQkJZnByaW50ZihzdGRlcnIsICJleGVjICIpOworCQkJcGVycm9yKHJlYWxfZmlsZW5hbWUpOworCQkJZXhpdCgxKTsKKwkJZGVmYXVsdDoKKwkJCXdhaXRwaWQocGlkLCAmcmV0ICwwKTsKKwl9CisJaWYgKFdJRkVYSVRFRChyZXQpKQorCQlleGl0c3RhdHVzIHw9IFdFWElUU1RBVFVTKHJldCk7CisJZWxzZQorCQlleGl0c3RhdHVzID0gMHhmZjsKK30KKworLyogVHlwZXMgdXNlZCB0byBjcmVhdGUgbGlzdCBvZiBhbGwgZXhwb3J0ZWQgc3ltYm9scyBpbiBhIG51bWJlciBvZiBmaWxlcyAqLworc3RydWN0IHN5bWJvbHMKK3sKKwljaGFyICpuYW1lOworfTsKKworc3RydWN0IHN5bWZpbGUKK3sKKwljaGFyICpmaWxlbmFtZTsKKwlzdHJ1Y3Qgc3ltYm9scyAqc3ltYm9sbGlzdDsKKwlpbnQgc3ltYm9sY250OworfTsKKworc3RydWN0IHN5bWZpbGUgc3ltZmlsZWxpc3RbTUFYRklMRVNdOworaW50IHN5bWZpbGVjbnQgPSAwOworCit2b2lkIGFkZF9uZXdfc3ltYm9sKHN0cnVjdCBzeW1maWxlICpzeW0sIGNoYXIgKiBzeW1uYW1lKQoreworCXN5bS0+c3ltYm9sbGlzdCA9CisJICByZWFsbG9jKHN5bS0+c3ltYm9sbGlzdCwgKHN5bS0+c3ltYm9sY250ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CisJc3ltLT5zeW1ib2xsaXN0W3N5bS0+c3ltYm9sY250KytdLm5hbWUgPSBzdHJkdXAoc3ltbmFtZSk7Cit9CisKKy8qIEFkZCBhIGZpbGVuYW1lIHRvIHRoZSBsaXN0ICovCitzdHJ1Y3Qgc3ltZmlsZSAqIGFkZF9uZXdfZmlsZShjaGFyICogZmlsZW5hbWUpCit7CisJc3ltZmlsZWxpc3Rbc3ltZmlsZWNudCsrXS5maWxlbmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisJcmV0dXJuICZzeW1maWxlbGlzdFtzeW1maWxlY250IC0gMV07Cit9CisvKiBDaGVjayBpZiBmaWxlIGFscmVhZHkgYXJlIHByZXNlbnQgaW4gdGhlIGxpc3QgKi8KK3N0cnVjdCBzeW1maWxlICogZmlsZW5hbWVfZXhpc3QoY2hhciAqIGZpbGVuYW1lKQoreworCWludCBpOworCWZvciAoaT0wOyBpIDwgc3ltZmlsZWNudDsgaSsrKQorCQlpZiAoc3RyY21wKHN5bWZpbGVsaXN0W2ldLmZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkKKwkJCXJldHVybiAmc3ltZmlsZWxpc3RbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBMaXN0IGFsbCBmaWxlcyByZWZlcmVuY2VkIHdpdGhpbiB0aGUgdGVtcGxhdGUgZmlsZS4KKyAqIEZpbGVzIGFyZSBzZXBhcmF0ZWQgYnkgdGFicy4KKyAqLwordm9pZCBhZGRkZXAoY2hhciAqIGZpbGUpCQkgICB7IHByaW50ZigiXHQlcyIsIGZpbGUpOyB9Cit2b2lkIGFkZGRlcDIoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKSAgICAgeyBsaW5lID0gbGluZTsgYWRkZGVwKGZpbGUpOyB9Cit2b2lkIG5vYWN0aW9uKGNoYXIgKiBsaW5lKQkJICAgeyBsaW5lID0gbGluZTsgfQordm9pZCBub2FjdGlvbjIoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKSAgIHsgZmlsZSA9IGZpbGU7IGxpbmUgPSBsaW5lOyB9CisKKy8qIEVjaG8gdGhlIGxpbmUgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiAqLwordm9pZCBwcmludGxpbmUoY2hhciAqIGxpbmUpICAgICAgICAgICAgICAgeyBwcmludGYoIiVzIiwgbGluZSk7IH0KKworLyoKKyAqIEZpbmQgYWxsIHN5bWJvbHMgZXhwb3J0ZWQgd2l0aCBFWFBPUlRfU1lNQk9MIGFuZCBFWFBPUlRfU1lNQk9MX0dQTAorICogaW4gZmlsZW5hbWUuCisgKiBBbGwgc3ltYm9scyBsb2NhdGVkIGFyZSBzdG9yZWQgaW4gc3ltZmlsZWxpc3QuCisgKi8KK3ZvaWQgZmluZF9leHBvcnRfc3ltYm9scyhjaGFyICogZmlsZW5hbWUpCit7CisJRklMRSAqIGZwOworCXN0cnVjdCBzeW1maWxlICpzeW07CisJY2hhciBsaW5lW01BWExJTkVTWl07CisJaWYgKGZpbGVuYW1lX2V4aXN0KGZpbGVuYW1lKSA9PSBOVUxMKSB7CisJCWludCByZmxlbiA9IHN0cmxlbihnZXRlbnYoIlNSQ1RSRUUiKSkgKyBzdHJsZW4oZmlsZW5hbWUpOworCQljaGFyICpyZWFsX2ZpbGVuYW1lID0gYWxsb2NhKHJmbGVuICsgMSk7CisJCXN0cmNweShyZWFsX2ZpbGVuYW1lLCBnZXRlbnYoIlNSQ1RSRUUiKSk7CisJCXN0cmNhdChyZWFsX2ZpbGVuYW1lLCBmaWxlbmFtZSk7CisJCXN5bSA9IGFkZF9uZXdfZmlsZShmaWxlbmFtZSk7CisJCWZwID0gZm9wZW4ocmVhbF9maWxlbmFtZSwgInIiKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CisJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CisJCX0KKwkJd2hpbGUgKGZnZXRzKGxpbmUsIE1BWExJTkVTWiwgZnApKSB7CisJCQljaGFyICpwOworCQkJY2hhciAqZTsKKwkJCWlmICgoKHAgPSBzdHJzdHIobGluZSwgIkVYUE9SVF9TWU1CT0xfR1BMIikpICE9IDApIHx8CisJCQkgICAgKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MIikpICE9IDApKSB7CisJCQkJLyogU2tpcCBFWFBPUlRfU1lNQk9Me19HUEx9ICovCisJCQkJd2hpbGUgKGlzYWxudW0oKnApIHx8ICpwID09ICdfJykKKwkJCQkJcCsrOworCQkJCS8qIFJlbW92ZSBwYXJhbnRlc2VzIGFuZCBhZGRpdGlvbmFsIHdzICovCisJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQorCQkJCQlwKys7CisJCQkJaWYgKCpwICE9ICcoJykKKwkJCQkJY29udGludWU7IC8qIFN5bnRheCBlcnJvcj8gKi8KKwkJCQllbHNlCisJCQkJCXArKzsKKwkJCQl3aGlsZSAoaXNzcGFjZSgqcCkpCisJCQkJCXArKzsKKwkJCQllID0gcDsKKwkJCQl3aGlsZSAoaXNhbG51bSgqZSkgfHwgKmUgPT0gJ18nKQorCQkJCQllKys7CisJCQkJKmUgPSAnXDAnOworCQkJCWFkZF9uZXdfc3ltYm9sKHN5bSwgcCk7CisJCQl9CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9Cit9CisKKy8qCisgKiBEb2N1bWVudCBhbGwgZXh0ZXJuYWwgb3IgaW50ZXJuYWwgZnVuY3Rpb25zIGluIGEgZmlsZS4KKyAqIENhbGwga2VybmVsLWRvYyB3aXRoIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtbm9mdW5jdGlvbiBmdW5jdGlvbl9uYW1lMSBmaWxlbmFtZQorICogZnVuY3Rpb24gbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gYWxsIHRoZSBzcmMgZmlsZXMKKyAqIGJ5IGZpbmRfZXhwb3J0X3N5bWJvbHMuCisgKiBpbnRmdW5jIHVzZXMgLW5vZnVuY3Rpb24KKyAqIGV4dGZ1bmMgdXNlcyAtZnVuY3Rpb24KKyAqLwordm9pZCBkb2NmdW5jdGlvbnMoY2hhciAqIGZpbGVuYW1lLCBjaGFyICogdHlwZSkKK3sKKwlpbnQgaSxqOworCWludCBzeW1jbnQgPSAwOworCWludCBpZHggPSAwOworCWNoYXIgKip2ZWM7CisKKwlmb3IgKGk9MDsgaSA8PSBzeW1maWxlY250OyBpKyspCisJCXN5bWNudCArPSBzeW1maWxlbGlzdFtpXS5zeW1ib2xjbnQ7CisJdmVjID0gbWFsbG9jKCgyICsgMiAqIHN5bWNudCArIDIpICogc2l6ZW9mKGNoYXIqKSk7CisJaWYgKHZlYyA9PSBOVUxMKSB7CisJCXBlcnJvcigiZG9jcHJvYzogIik7CisJCWV4aXQoMSk7CisJfQorCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisJZm9yIChpPTA7IGkgPCBzeW1maWxlY250OyBpKyspIHsKKwkJc3RydWN0IHN5bWZpbGUgKiBzeW0gPSAmc3ltZmlsZWxpc3RbaV07CisJCWZvciAoaj0wOyBqIDwgc3ltLT5zeW1ib2xjbnQ7IGorKykgeworCQkJdmVjW2lkeCsrXSAgICAgPSB0eXBlOworCQkJdmVjW2lkeCsrXSA9IHN5bS0+c3ltYm9sbGlzdFtqXS5uYW1lOworCQl9CisJfQorCXZlY1tpZHgrK10gICAgID0gZmlsZW5hbWU7CisJdmVjW2lkeF0gPSBOVUxMOworCXByaW50ZigiPCEtLSAlcyAtLT5cbiIsIGZpbGVuYW1lKTsKKwlleGVjX2tlcm5lbF9kb2ModmVjKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlmcmVlKHZlYyk7Cit9Cit2b2lkIGludGZ1bmMoY2hhciAqIGZpbGVuYW1lKSB7CWRvY2Z1bmN0aW9ucyhmaWxlbmFtZSwgTk9GVU5DVElPTik7IH0KK3ZvaWQgZXh0ZnVuYyhjaGFyICogZmlsZW5hbWUpIHsgZG9jZnVuY3Rpb25zKGZpbGVuYW1lLCBGVU5DVElPTik7ICAgfQorCisvKgorICogRG9jdW1lbnQgc3BlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgorICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQorICovCit2b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgY2hhciAqIGxpbmUpCit7CisJY2hhciAqdmVjWzIwMF07IC8qIEVub3VnaCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25zICovCisJaW50IGksIGlkeCA9IDA7CisJaW50IHN0YXJ0b2ZzeW0gPSAxOworCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisKKwkvKiBTcGxpdCBsaW5lIHVwIGluIGluZGl2aWR1YWwgcGFyYW1ldGVycyBwcmVjZWVkZWQgYnkgRlVOQ1RJT04gKi8KKwlmb3IgKGk9MDsgbGluZVtpXTsgaSsrKSB7CisJCWlmIChpc3NwYWNlKGxpbmVbaV0pKSB7CisJCQlsaW5lW2ldID0gJ1wwJzsKKwkJCXN0YXJ0b2ZzeW0gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXJ0b2ZzeW0pIHsKKwkJCXN0YXJ0b2ZzeW0gPSAwOworCQkJdmVjW2lkeCsrXSA9IEZVTkNUSU9OOworCQkJdmVjW2lkeCsrXSA9ICZsaW5lW2ldOworCQl9CisJfQorCXZlY1tpZHgrK10gPSBmaWxlbmFtZTsKKwl2ZWNbaWR4XSA9IE5VTEw7CisJZXhlY19rZXJuZWxfZG9jKHZlYyk7Cit9CisKKy8qCisgKiBQYXJzZSBmaWxlLCBjYWxsaW5nIGFjdGlvbiBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yOgorICogMSkgTGluZXMgY29udGFpbmluZyAhRQorICogMikgTGluZXMgY29udGFpbmluZyAhSQorICogMykgTGluZXMgY29udGFpbmluZyAhRAorICogNCkgTGluZXMgY29udGFpbmluZyAhRgorICogNSkgRGVmYXVsdCBsaW5lcyAtIGxpbmVzIG5vdCBtYXRjaGluZyB0aGUgYWJvdmUKKyAqLwordm9pZCBwYXJzZV9maWxlKEZJTEUgKmluZmlsZSkKK3sKKwljaGFyIGxpbmVbTUFYTElORVNaXTsKKwljaGFyICogczsKKwl3aGlsZSAoZmdldHMobGluZSwgTUFYTElORVNaLCBpbmZpbGUpKSB7CisJCWlmIChsaW5lWzBdID09ICchJykgeworCQkJcyA9IGxpbmUgKyAyOworCQkJc3dpdGNoIChsaW5lWzFdKSB7CisJCQkJY2FzZSAnRSc6CisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKwkJCQkJKnMgPSAnXDAnOworCQkJCQlleHRlcm5hbGZ1bmN0aW9ucyhsaW5lKzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdJJzoKKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCWludGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0QnOgorCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzID0gJ1wwJzsKKwkJCQkJc3ltYm9sc29ubHkobGluZSsyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRic6CisJCQkJCS8qIGZpbGVuYW1lICovCisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKwkJCQkJKnMrKyA9ICdcMCc7CisJCQkJCS8qIGZ1bmN0aW9uIG5hbWVzICovCisJCQkJCXdoaWxlIChpc3NwYWNlKCpzKSkKKwkJCQkJCXMrKzsKKwkJCQkJc2luZ2xlZnVuY3Rpb25zKGxpbmUgKzIsIHMpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlkZWZhdWx0bGluZShsaW5lKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWRlZmF1bHRsaW5lKGxpbmUpOworCQl9CisJfQorCWZmbHVzaChzdGRvdXQpOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICogaW5maWxlOworCWlmIChhcmdjICE9IDMpIHsKKwkJdXNhZ2UoKTsKKwkJZXhpdCgxKTsKKwl9CisJLyogT3BlbiBmaWxlLCBleGl0IG9uIGVycm9yICovCisJaW5maWxlID0gZm9wZW4oYXJndlsyXSwgInIiKTsKKwlpZiAoaW5maWxlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkb2Nwcm9jOiAiKTsKKwkJcGVycm9yKGFyZ3ZbMl0pOworCQlleGl0KDIpOworCX0KKworCWlmIChzdHJjbXAoImRvYyIsIGFyZ3ZbMV0pID09IDApCisJeworCQkvKiBOZWVkIHRvIGRvIHRoaXMgaW4gdHdvIHBhc3Nlcy4KKwkJICogRmlyc3QgcGFzcyBpcyB1c2VkIHRvIGNvbGxlY3QgYWxsIHN5bWJvbHMgZXhwb3J0ZWQKKwkJICogaW4gdGhlIHZhcmlvdXMgZmlsZXMuCisJCSAqIFNlY29uZCBwYXNzIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorCQkgKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZnVuY3Rpb24gYXJlIGRlY2xhcmVkCisJCSAqIGFuZCBleHBvcnRlZCBpbiBkaWZmZXJlbnQgZmlsZXMgOi0oKAorCQkgKi8KKwkJLyogQ29sbGVjdCBzeW1ib2xzICovCisJCWRlZmF1bHRsaW5lICAgICAgID0gbm9hY3Rpb247CisJCWludGVybmFsZnVuY3Rpb25zID0gZmluZF9leHBvcnRfc3ltYm9sczsKKwkJZXh0ZXJuYWxmdW5jdGlvbnMgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOworCQlzeW1ib2xzb25seSAgICAgICA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CisJCXNpbmdsZWZ1bmN0aW9ucyAgID0gbm9hY3Rpb24yOworCQlwYXJzZV9maWxlKGluZmlsZSk7CisKKwkJLyogUmV3aW5kIHRvIHN0YXJ0IGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgYWdhaW4gKi8KKwkJZnNlZWsoaW5maWxlLCAwLCBTRUVLX1NFVCk7CisJCWRlZmF1bHRsaW5lICAgICAgID0gcHJpbnRsaW5lOworCQlpbnRlcm5hbGZ1bmN0aW9ucyA9IGludGZ1bmM7CisJCWV4dGVybmFsZnVuY3Rpb25zID0gZXh0ZnVuYzsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBwcmludGxpbmU7CisJCXNpbmdsZWZ1bmN0aW9ucyAgID0gc2luZ2Z1bmM7CisKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCX0KKwllbHNlIGlmIChzdHJjbXAoImRlcGVuZCIsIGFyZ3ZbMV0pID09IDApCisJeworCQkvKiBDcmVhdGUgZmlyc3QgcGFydCBvZiBkZXBlbmRlbmN5IGNoYWluCisJCSAqIGZpbGUudG1wbCAqLworCQlwcmludGYoIiVzXHQiLCBhcmd2WzJdKTsKKwkJZGVmYXVsdGxpbmUgICAgICAgPSBub2FjdGlvbjsKKwkJaW50ZXJuYWxmdW5jdGlvbnMgPSBhZGRkZXA7CisJCWV4dGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOworCQlzeW1ib2xzb25seSAgICAgICA9IGFkZGRlcDsKKwkJc2luZ2xlZnVuY3Rpb25zICAgPSBhZGRkZXAyOworCQlwYXJzZV9maWxlKGluZmlsZSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJZWxzZQorCXsKKwkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDEpOworCX0KKwlmY2xvc2UoaW5maWxlKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlyZXR1cm4gZXhpdHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyN2ExNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogIk9wdGltaXplIiBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGFzIHNwaXQgb3V0IGJ5IGdjYyAtTUQKKyAqIGZvciB0aGUga2VybmVsIGJ1aWxkCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBdXRob3IgICAgICAgS2FpIEdlcm1hc2NoZXdza2kKKyAqIENvcHlyaWdodCAgICAyMDAyIGJ5IEthaSBHZXJtYXNjaGV3c2tpICA8a2FpLmdlcm1hc2NoZXdza2lAZ214LmRlPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoKKyAqIEludHJvZHVjdGlvbjoKKyAqCisgKiBnY2MgcHJvZHVjZXMgYSB2ZXJ5IG5pY2UgYW5kIGNvcnJlY3QgbGlzdCBvZiBkZXBlbmRlbmNpZXMgd2hpY2gKKyAqIHRlbGxzIG1ha2Ugd2hlbiB0byByZW1ha2UgYSBmaWxlLgorICoKKyAqIFRvIHVzZSB0aGlzIGxpc3QgYXMtaXMgaG93ZXZlciBoYXMgdGhlIGRyYXdiYWNrIHRoYXQgdmlydHVhbGx5CisgKiBldmVyeSBmaWxlIGluIHRoZSBrZXJuZWwgaW5jbHVkZXMgPGxpbnV4L2NvbmZpZy5oPiB3aGljaCB0aGVuIGFnYWluCisgKiBpbmNsdWRlcyA8bGludXgvYXV0b2NvbmYuaD4KKyAqCisgKiBJZiB0aGUgdXNlciByZS1ydW5zIG1ha2UgKmNvbmZpZywgbGludXgvYXV0b2NvbmYuaCB3aWxsIGJlCisgKiByZWdlbmVyYXRlZC4gIG1ha2Ugbm90aWNlcyB0aGF0IGFuZCB3aWxsIHJlYnVpbGQgZXZlcnkgZmlsZSB3aGljaAorICogaW5jbHVkZXMgYXV0b2NvbmYuaCwgaS5lLiBiYXNpY2FsbHkgYWxsIGZpbGVzLiBUaGlzIGlzIGV4dHJlbWVseQorICogYW5ub3lpbmcgaWYgdGhlIHVzZXIganVzdCBjaGFuZ2VkIENPTkZJR19ISVNfRFJJVkVSIGZyb20gbiB0byBtLgorICoKKyAqIFNvIHdlIHBsYXkgdGhlIHNhbWUgdHJpY2sgdGhhdCAibWtkZXAiIHBsYXllZCBiZWZvcmUuIFdlIHJlcGxhY2UKKyAqIHRoZSBkZXBlbmRlbmN5IG9uIGxpbnV4L2F1dG9jb25mLmggYnkgYSBkZXBlbmRlbmN5IG9uIGV2ZXJ5IGNvbmZpZworICogb3B0aW9uIHdoaWNoIGlzIG1lbnRpb25lZCBpbiBhbnkgb2YgdGhlIGxpc3RlZCBwcmVxdWlzaXRlcy4KKyAqCisgKiBUbyBiZSBleGFjdCwgc3BsaXQtaW5jbHVkZSBwb3B1bGF0ZXMgYSB0cmVlIGluIGluY2x1ZGUvY29uZmlnLywKKyAqIGUuZy4gaW5jbHVkZS9jb25maWcvaGlzL2RyaXZlci5oLCB3aGljaCBjb250YWlucyB0aGUgI2RlZmluZS8jdW5kZWYKKyAqIGZvciB0aGUgQ09ORklHX0hJU19EUklWRVIgb3B0aW9uLgorICoKKyAqIFNvIGlmIHRoZSB1c2VyIGNoYW5nZXMgaGlzIENPTkZJR19ISVNfRFJJVkVSIG9wdGlvbiwgb25seSB0aGUgb2JqZWN0cworICogd2hpY2ggZGVwZW5kIG9uICJpbmNsdWRlL2xpbnV4L2NvbmZpZy9oaXMvZHJpdmVyLmgiIHdpbGwgYmUgcmVidWlsdCwKKyAqIHNvIG1vc3QgbGlrZWx5IG9ubHkgaGlzIGRyaXZlciA7LSkKKyAqCisgKiBUaGUgaWRlYSBhYm92ZSBkYXRlcywgYnkgdGhlIHdheSwgYmFjayB0byBNaWNoYWVsIEUgQ2hhc3RhaW4sIEFGQUlLLgorICoKKyAqIFNvIHRvIGdldCBkZXBlbmRlbmNpZXMgcmlnaHQsIHRoZXJlIGFyZSB0d28gaXNzdWVzOgorICogbyBpZiBhbnkgb2YgdGhlIGZpbGVzIHRoZSBjb21waWxlciByZWFkIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVidWlsZAorICogbyBpZiB0aGUgY29tbWFuZCBsaW5lIGdpdmVuIHRvIHRoZSBjb21waWxlIHRoZSBmaWxlIGNoYW5nZWQsIHdlCisgKiAgIGJldHRlciByZWJ1aWxkIGFzIHdlbGwuCisgKgorICogVGhlIGZvcm1lciBpcyBoYW5kbGVkIGJ5IHVzaW5nIHRoZSAtTUQgb3V0cHV0LCB0aGUgbGF0ZXIgYnkgc2F2aW5nCisgKiB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gY29tcGlsZSB0aGUgb2xkIG9iamVjdCBhbmQgY29tcGFyaW5nIGl0CisgKiB0byB0aGUgb25lIHdlIHdvdWxkIG5vdyB1c2UuCisgKgorICogQWdhaW4sIGFsc28gdGhpcyBpZGVhIGlzIHByZXR0eSBvbGQgYW5kIGhhcyBiZWVuIGRpc2N1c3NlZCBvbgorICoga2J1aWxkLWRldmVsIGEgbG9uZyB0aW1lIGFnby4gSSBkb24ndCBoYXZlIGEgc2Vuc2libHkgd29ya2luZworICogaW50ZXJuZXQgY29ubmVjdGlvbiByaWdodCBub3csIHNvIEkgcmF0aGVyIGRvbid0IG1lbnRpb24gbmFtZXMKKyAqIHdpdGhvdXQgZG91YmxlIGNoZWNraW5nLgorICoKKyAqIFRoaXMgY29kZSBoZXJlIGhhcyBiZWVuIGJhc2VkIHBhcnRpYWxseSBiYXNlZCBvbiBta2RlcC5jLCB3aGljaAorICogc2F5cyB0aGUgZm9sbG93aW5nIGFib3V0IGl0cyBoaXN0b3J5OgorICoKKyAqICAgQ29weXJpZ2h0IGFiYW5kb25lZCwgTWljaGFlbCBDaGFzdGFpbiwgPG1haWx0bzptZWNAc2hvdXQubmV0Pi4KKyAqICAgVGhpcyBpcyBhIEMgdmVyc2lvbiBvZiBzeW5jZGVwLnBsIGJ5IFdlcm5lciBBbG1lc2Jlcmdlci4KKyAqCisgKgorICogSXQgaXMgaW52b2tlZCBhcworICoKKyAqICAgZml4ZGVwIDxkZXBmaWxlPiA8dGFyZ2V0PiA8Y21kbGluZT4KKyAqCisgKiBhbmQgd2lsbCByZWFkIHRoZSBkZXBlbmRlbmN5IGZpbGUgPGRlcGZpbGU+CisgKgorICogVGhlIHRyYW5zZm9ybWVkIGRlcGVuZGVuY3kgc25pcHBlZCBpcyB3cml0dGVuIHRvIHN0ZG91dC4KKyAqCisgKiBJdCBmaXJzdCBnZW5lcmF0ZXMgYSBsaW5lCisgKgorICogICBjbWRfPHRhcmdldD4gPSA8Y21kbGluZT4KKyAqCisgKiBhbmQgdGhlbiBiYXNpY2FsbHkgY29waWVzIHRoZSAuPHRhcmdldD4uZCBmaWxlIHRvIHN0ZG91dCwgaW4gdGhlCisgKiBwcm9jZXNzIGZpbHRlcmluZyBvdXQgdGhlIGRlcGVuZGVuY3kgb24gbGludXgvYXV0b2NvbmYuaCBhbmQgYWRkaW5nCisgKiBkZXBlbmRlbmNpZXMgb24gaW5jbHVkZS9jb25maWcvbXkvb3B0aW9uLmggZm9yIGV2ZXJ5CisgKiBDT05GSUdfTVlfT1BUSU9OIGVuY291bnRlcmVkIGluIGFueSBvZiB0aGUgcHJlcXVpc2l0ZXMuCisgKgorICogSXQgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWxsIHRoZSBkZXBlbmRlbmNpZXMgb24gKi52ZXIuIFdlIG5lZWQKKyAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgdmVyc2lvbiBjaGVja3N1bSBhcmUgZ2xvYmFsbHkgdXAKKyAqIHRvIGRhdGUgYmVmb3JlIGV2ZW4gc3RhcnRpbmcgdGhlIHJlY3Vyc2l2ZSBidWlsZCwgc28gaXQncyB0b28gbGF0ZQorICogYXQgdGhpcyBwb2ludCBhbnl3YXkuCisgKgorICogVGhlIGFsZ29yaXRobSB0byBncmVwIGZvciAiQ09ORklHXy4uLiIgaXMgYml0IHVudXN1YWwsIGJ1dCBzaG91bGQKKyAqIGJlIGZhc3QgOy0pIFdlIGRvbid0IGV2ZW4gdHJ5IHRvIHJlYWxseSBwYXJzZSB0aGUgaGVhZGVyIGZpbGVzLCBidXQKKyAqIG1lcmVseSBncmVwLCBpLmUuIGlmIENPTkZJR19GT08gaXMgbWVudGlvbmVkIGluIGEgY29tbWVudCwgaXQgd2lsbAorICogYmUgcGlja2VkIHVwIGFzIHdlbGwuIEl0J3Mgbm90IGEgcHJvYmxlbSB3aXRoIHJlc3BlY3QgdG8KKyAqIGNvcnJlY3RuZXNzLCBzaW5jZSB0aGF0IGNhbiBvbmx5IGdpdmUgdG9vIG1hbnkgZGVwZW5kZW5jaWVzLCB0aHVzCisgKiB3ZSBjYW5ub3QgbWlzcyBhIHJlYnVpbGQuIFNpbmNlIHBlb3BsZSB0ZW5kIHRvIG5vdCBtZW50aW9uIHRvdGFsbHkKKyAqIHVucmVsYXRlZCBDT05GSUdfIG9wdGlvbnMgYWxsIG92ZXIgdGhlIHBsYWNlLCBpdCdzIG5vdCBhbgorICogZWZmaWNpZW5jeSBwcm9ibGVtIGVpdGhlci4KKyAqCisgKiAoTm90ZTogaXQnZCBiZSBlYXN5IHRvIHBvcnQgb3ZlciB0aGUgY29tcGxldGUgbWtkZXAgc3RhdGUgbWFjaGluZSwKKyAqICBidXQgSSBkb24ndCB0aGluayB0aGUgYWRkZWQgY29tcGxleGl0eSBpcyB3b3J0aCBpdCkKKyAqLworLyoKKyAqIE5vdGUgMjogaWYgc29tZWJvZHkgd3JpdGVzIEhFTExPX0NPTkZJR19CT09NIGluIGEgZmlsZSwgaXQgd2lsbCBkZXBlbmQgb250bworICogQ09ORklHX0JPT00uIFRoaXMgY291bGQgc2VlbSBhIGJ1ZyAobm90IHRvbyBoYXJkIHRvIGZpeCksIGJ1dCBwbGVhc2UgZG8gbm90CisgKiBmaXggaXQhIFNvbWUgVXNlck1vZGVMaW51eCBmaWxlcyAobG9vayBhdCBhcmNoL3VtLykgY2FsbCBDT05GSUdfQk9PTSBhcworICogVU1MX0NPTkZJR19CT09NLCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCAvdXNyL2luY2x1ZGUvbGludXgvYXV0b2NvbmYuaCwKKyAqIHRocm91Z2ggYXJjaC91bS9pbmNsdWRlL3VtbC1jb25maWcuaDsgdGhpcyBmaXhkZXAgImJ1ZyIgbWFrZXMgc3VyZSB0aGF0CisgKiB0aG9zZSBmaWxlcyB3aWxsIGhhdmUgY29ycmVjdCBkZXBlbmRlbmNpZXMuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworLyogYmJveDogbm90IG5lZWRlZAorI2RlZmluZSBJTlRfQ09ORiBudG9obCgweDQzNGY0ZTQ2KQorI2RlZmluZSBJTlRfT05GSSBudG9obCgweDRmNGU0NjQ5KQorI2RlZmluZSBJTlRfTkZJRyBudG9obCgweDRlNDY0OTQ3KQorI2RlZmluZSBJTlRfRklHXyBudG9obCgweDQ2NDk0NzVmKQorKi8KKworY2hhciAqdGFyZ2V0OworY2hhciAqZGVwZmlsZTsKK2NoYXIgKmNtZGxpbmU7CisKK3ZvaWQgdXNhZ2Uodm9pZCkKKworeworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGZpeGRlcCA8ZGVwZmlsZT4gPHRhcmdldD4gPGNtZGxpbmU+XG4iKTsKKwlleGl0KDEpOworfQorCisvKgorICogUHJpbnQgb3V0IHRoZSBjb21tYW5kbGluZSBwcmVmaXhlZCB3aXRoIGNtZF88dGFyZ2V0IGZpbGVuYW1lPiA6PQorICovCit2b2lkIHByaW50X2NtZGxpbmUodm9pZCkKK3sKKwlwcmludGYoImNtZF8lcyA6PSAlc1xuXG4iLCB0YXJnZXQsIGNtZGxpbmUpOworfQorCitjaGFyICogc3RyX2NvbmZpZyAgPSBOVUxMOworaW50ICAgIHNpemVfY29uZmlnID0gMDsKK2ludCAgICBsZW5fY29uZmlnICA9IDA7CisKKy8qCisgKiBHcm93IHRoZSBjb25maWd1cmF0aW9uIHN0cmluZyB0byBhIGRlc2lyZWQgbGVuZ3RoLgorICogVXN1YWxseSB0aGUgZmlyc3QgZ3Jvd3RoIGlzIHBsZW50eS4KKyAqLwordm9pZCBncm93X2NvbmZpZyhpbnQgbGVuKQoreworCXdoaWxlIChsZW5fY29uZmlnICsgbGVuID4gc2l6ZV9jb25maWcpIHsKKwkJaWYgKHNpemVfY29uZmlnID09IDApCisJCQlzaXplX2NvbmZpZyA9IDIwNDg7CisJCXN0cl9jb25maWcgPSByZWFsbG9jKHN0cl9jb25maWcsIHNpemVfY29uZmlnICo9IDIpOworCQlpZiAoc3RyX2NvbmZpZyA9PSBOVUxMKQorCQkJeyBwZXJyb3IoImZpeGRlcDptYWxsb2MiKTsgZXhpdCgxKTsgfQorCX0KK30KKworCisKKy8qCisgKiBMb29rdXAgYSB2YWx1ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcuCisgKi8KK2ludCBpc19kZWZpbmVkX2NvbmZpZyhjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICogcGNvbmZpZzsKKwljb25zdCBjaGFyICogcGxhc3QgPSBzdHJfY29uZmlnICsgbGVuX2NvbmZpZyAtIGxlbjsKKwlmb3IgKCBwY29uZmlnID0gc3RyX2NvbmZpZyArIDE7IHBjb25maWcgPCBwbGFzdDsgcGNvbmZpZysrICkgeworCQlpZiAocGNvbmZpZ1sgLTFdID09ICdcbicKKwkJJiYgIHBjb25maWdbbGVuXSA9PSAnXG4nCisJCSYmICAhbWVtY21wKHBjb25maWcsIG5hbWUsIGxlbikpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgYSBuZXcgdmFsdWUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgorICovCit2b2lkIGRlZmluZV9jb25maWcoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4pCit7CisJZ3Jvd19jb25maWcobGVuICsgMSk7CisKKwltZW1jcHkoc3RyX2NvbmZpZytsZW5fY29uZmlnLCBuYW1lLCBsZW4pOworCWxlbl9jb25maWcgKz0gbGVuOworCXN0cl9jb25maWdbbGVuX2NvbmZpZysrXSA9ICdcbic7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gc3RyaW5ncy4KKyAqLwordm9pZCBjbGVhcl9jb25maWcodm9pZCkKK3sKKwlsZW5fY29uZmlnID0gMDsKKwlkZWZpbmVfY29uZmlnKCIiLCAwKTsKK30KKworLyoKKyAqIFJlY29yZCB0aGUgdXNlIG9mIGEgQ09ORklHXyogd29yZC4KKyAqLwordm9pZCB1c2VfY29uZmlnKGNoYXIgKm0sIGludCBzbGVuKQoreworCWNoYXIgKnMgPSBhbGxvY2Eoc2xlbisxKTsKKwljaGFyICpwOworCisJaWYgKGlzX2RlZmluZWRfY29uZmlnKG0sIHNsZW4pKQorCSAgICByZXR1cm47CisKKwlkZWZpbmVfY29uZmlnKG0sIHNsZW4pOworCisJbWVtY3B5KHMsIG0sIHNsZW4pOyBzW3NsZW5dID0gMDsKKworCWZvciAocCA9IHM7IHAgPCBzICsgc2xlbjsgcCsrKSB7CisJCWlmICgqcCA9PSAnXycpCisJCQkqcCA9ICcvJzsKKwkJZWxzZQorCQkJKnAgPSB0b2xvd2VyKChpbnQpKnApOworCX0KKwlwcmludGYoIiAgICAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnLyVzLmgpIFxcXG4iLCBzKTsKK30KKwordm9pZCBwYXJzZV9jb25maWdfZmlsZShjaGFyICptYXAsIHNpemVfdCBsZW4pCit7CisJLyogbW9kaWZpZWQgZm9yIGJib3ggKi8KKwljaGFyICplbmRfMyA9IG1hcCArIGxlbiAtIDM7IC8qIDMgPT0gbGVuZ3RoIG9mICJJRl8iICovCisJY2hhciAqZW5kXzcgPSBtYXAgKyBsZW4gLSA3OworCWNoYXIgKnAgPSBtYXA7CisJY2hhciAqcTsKKwlpbnQgb2ZmOworCisJZm9yICg7IHAgPD0gZW5kXzM7IHArKykgeworCQkvKiBGaW5kIG5leHQgaWRlbnRpZmllcidzIGJlZ2lubmluZyAqLworCQlpZiAoIShpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgaXQgKi8KKwkJaWYgKHAgPCBlbmRfNyAmJiBwWzZdID09ICdfJykgeworCQkJaWYgKCFtZW1jbXAocCwgIkNPTkZJRyIsIDYpKSBnb3RvIGNvbmY3OworCQkJaWYgKCFtZW1jbXAocCwgIkVOQUJMRSIsIDYpKSBnb3RvIGNvbmY3OworCQkJaWYgKCFtZW1jbXAocCwgIklGX05PVCIsIDYpKSBnb3RvIGNvbmY3OworCQl9CisJCS8qIHdlIGhhdmUgYXQgbGVhc3QgMyBjaGFycyBiZWNhdXNlIG9mIHAgPD0gZW5kXzMgKi8KKwkJLyppZiAoIW1lbWNtcChwLCAiSUZfIiwgMykpIC4uLiovCisJCWlmIChwWzBdID09ICdJJyAmJiBwWzFdID09ICdGJyAmJiBwWzJdID09ICdfJykgeworCQkJb2ZmID0gMzsKKwkJCWdvdG8gY29uZjsKKwkJfQorCisJCS8qIFRoaXMgaWRlbnRpZmllciBpcyBub3QgaW50ZXJlc3RpbmcsIHNraXAgaXQgKi8KKwkJd2hpbGUgKHAgPD0gZW5kXzMgJiYgKGlzYWxudW0oKnApIHx8ICpwID09ICdfJykpCisJCQlwKys7CisJCWNvbnRpbnVlOworCisJY29uZjc6CW9mZiA9IDc7CisJY29uZjoKKwkJcCArPSBvZmY7CisJCWZvciAocSA9IHA7IHEgPCBlbmRfMyszOyBxKyspIHsKKwkJCWlmICghKGlzYWxudW0oKnEpIHx8ICpxID09ICdfJykpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHEgIT0gcCkgeworCQkJdXNlX2NvbmZpZyhwLCBxLXApOworCQl9CisJfQorfQorCisvKiB0ZXN0IGlzIHMgZW5kcyBpbiBzdWIgKi8KK2ludCBzdHJyY21wKGNoYXIgKnMsIGNoYXIgKnN1YikKK3sKKwlpbnQgc2xlbiA9IHN0cmxlbihzKTsKKwlpbnQgc3VibGVuID0gc3RybGVuKHN1Yik7CisKKwlpZiAoc3VibGVuID4gc2xlbikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gbWVtY21wKHMgKyBzbGVuIC0gc3VibGVuLCBzdWIsIHN1Ymxlbik7Cit9CisKK3ZvaWQgZG9fY29uZmlnX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCXZvaWQgKm1hcDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlwZXJyb3IoZmlsZW5hbWUpOworCQlleGl0KDIpOworCX0KKwlmc3RhdChmZCwgJnN0KTsKKwlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoKGxvbmcpIG1hcCA9PSAtMSkgeworCQlwZXJyb3IoImZpeGRlcDogbW1hcCIpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZV9jb25maWdfZmlsZShtYXAsIHN0LnN0X3NpemUpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgcGFyc2VfZGVwX2ZpbGUodm9pZCAqbWFwLCBzaXplX3QgbGVuKQoreworCWNoYXIgKm0gPSBtYXA7CisJY2hhciAqZW5kID0gbSArIGxlbjsKKwljaGFyICpwOworCWNoYXIgKnMgPSBhbGxvY2EobGVuKTsKKworCXAgPSBtZW1jaHIobSwgJzonLCBsZW4pOworCWlmICghcCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZpeGRlcDogcGFyc2UgZXJyb3JcbiIpOworCQlleGl0KDEpOworCX0KKwltZW1jcHkocywgbSwgcC1tKTsgc1twLW1dID0gMDsKKwlwcmludGYoImRlcHNfJXMgOj0gXFxcbiIsIHRhcmdldCk7CisJbSA9IHArMTsKKworCWNsZWFyX2NvbmZpZygpOworCisJd2hpbGUgKG0gPCBlbmQpIHsKKwkJd2hpbGUgKG0gPCBlbmQgJiYgKCptID09ICcgJyB8fCAqbSA9PSAnXFwnIHx8ICptID09ICdcbicgfHwgKm0gPT0gJ1xyJykpCisJCQltKys7CisJCXAgPSBtOworCQl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAnICcpIHArKzsKKwkJaWYgKHAgPT0gZW5kKSB7CisJCQlkbyBwLS07IHdoaWxlICghaXNhbG51bSgqcCkpOworCQkJcCsrOworCQl9CisJCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOworCQlpZiAoc3RycmNtcChzLCAiaW5jbHVkZS9hdXRvY29uZi5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgImFyY2gvdW0vaW5jbHVkZS91bWwtY29uZmlnLmgiKSAmJgorCQkgICAgc3RycmNtcChzLCAiLnZlciIpKSB7CisJCQlwcmludGYoIiAgJXMgXFxcbiIsIHMpOworCQkJZG9fY29uZmlnX2ZpbGUocyk7CisJCX0KKwkJbSA9IHAgKyAxOworCX0KKwlwcmludGYoIlxuJXM6ICQoZGVwc18lcylcblxuIiwgdGFyZ2V0LCB0YXJnZXQpOworCXByaW50ZigiJChkZXBzXyVzKTpcbiIsIHRhcmdldCk7Cit9CisKK3ZvaWQgcHJpbnRfZGVwcyh2b2lkKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwl2b2lkICptYXA7CisKKwlmZCA9IG9wZW4oZGVwZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlwZXJyb3IoZGVwZmlsZSk7CisJCWV4aXQoMik7CisJfQorCWZzdGF0KGZkLCAmc3QpOworCWlmIChzdC5zdF9zaXplID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImZpeGRlcDogJXMgaXMgZW1wdHlcbiIsZGVwZmlsZSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoKGxvbmcpIG1hcCA9PSAtMSkgeworCQlwZXJyb3IoImZpeGRlcDogbW1hcCIpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZV9kZXBfZmlsZShtYXAsIHN0LnN0X3NpemUpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgdHJhcHModm9pZCkKK3sKKy8qIGJib3g6IG5vdCBuZWVkZWQKKwlzdGF0aWMgY2hhciB0ZXN0W10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YoaW50KSkpKSA9ICJDT05GIjsKKworCWlmICgqKGludCAqKXRlc3QgIT0gSU5UX0NPTkYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IHNpemVvZihpbnQpICE9IDQgb3Igd3JvbmcgZW5kaWFuZXNzPyAlI3hcbiIsCisJCQkqKGludCAqKXRlc3QpOworCQlleGl0KDIpOworCX0KKyovCit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl0cmFwcygpOworCisJaWYgKGFyZ2MgIT0gNCkKKwkJdXNhZ2UoKTsKKworCWRlcGZpbGUgPSBhcmd2WzFdOworCXRhcmdldCA9IGFyZ3ZbMl07CisJY21kbGluZSA9IGFyZ3ZbM107CisKKwlwcmludF9jbWRsaW5lKCk7CisJcHJpbnRfZGVwcygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYyBiL3NjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjg3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIHNwbGl0LWluY2x1ZGUuYworICoKKyAqIENvcHlyaWdodCBhYmFuZG9uZWQsIE1pY2hhZWwgQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCisgKiBUaGlzIGlzIGEgQyB2ZXJzaW9uIG9mIHN5bmNkZXAucGwgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSB0YWtlcyBhdXRvY29uZi5oIGFzIGlucHV0IGFuZCBvdXRwdXRzIGEgZGlyZWN0b3J5IGZ1bGwKKyAqIG9mIG9uZS1saW5lIGluY2x1ZGUgZmlsZXMsIG1lcmdpbmcgb250byB0aGUgb2xkIHZhbHVlcy4KKyAqCisgKiBUaGluayBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzIGtleS12YWx1ZSBwYWlycy4gIFRoZW4gdGhlcmUKKyAqIGFyZSBmaXZlIGNhc2VzOgorICoKKyAqICAgIGtleSAgICAgIG9sZCB2YWx1ZSAgIG5ldyB2YWx1ZSAgIGFjdGlvbgorICoKKyAqICAgIEtFWS0xICAgIFZBTFVFLTEgICAgIFZBTFVFLTEgICAgIGxlYXZlIGZpbGUgYWxvbmUKKyAqICAgIEtFWS0yICAgIFZBTFVFLTJBICAgIFZBTFVFLTJCICAgIHdyaXRlIFZBTFVFLTJCIGludG8gZmlsZQorICogICAgS0VZLTMgICAgLSAgICAgICAgICAgVkFMVUUtMyAgICAgd3JpdGUgVkFMVUUtMyAgaW50byBmaWxlCisgKiAgICBLRVktNCAgICBWQUxVRS00ICAgICAtICAgICAgICAgICB3cml0ZSBhbiBlbXB0eSBmaWxlCisgKiAgICBLRVktNSAgICAoZW1wdHkpICAgICAtICAgICAgICAgICBsZWF2ZSBvbGQgZW1wdHkgZmlsZSBhbG9uZQorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBFUlJPUl9FWElUKHN0ckV4aXQpCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJY29uc3QgaW50IGVycm5vU2F2ZSA9IGVycm5vOwkJCQkJXAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHN0cl9teV9uYW1lKTsJCQkJXAorCWVycm5vID0gZXJybm9TYXZlOwkJCQkJCVwKKwlwZXJyb3IoKHN0ckV4aXQpKTsJCQkJCQlcCisJZXhpdCgxKTsJCQkJCQkJXAorICAgIH0KKworCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndiBbXSkKK3sKKyAgICBjb25zdCBjaGFyICogc3RyX215X25hbWU7CisgICAgY29uc3QgY2hhciAqIHN0cl9maWxlX2F1dG9jb25mOworICAgIGNvbnN0IGNoYXIgKiBzdHJfZGlyX2NvbmZpZzsKKworICAgIEZJTEUgKiBmcF9jb25maWc7CisgICAgRklMRSAqIGZwX3RhcmdldDsKKyAgICBGSUxFICogZnBfZmluZDsKKworICAgIGludCBidWZmZXJfc2l6ZTsKKworICAgIGNoYXIgKiBsaW5lOworICAgIGNoYXIgKiBvbGRfbGluZTsKKyAgICBjaGFyICogbGlzdF90YXJnZXQ7CisgICAgY2hhciAqIHB0YXJnZXQ7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKworICAgIC8qIENoZWNrIGFyZyBjb3VudC4gKi8KKyAgICBpZiAoYXJnYyAhPSAzKQorICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLlxuIiwgYXJndlswXSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBzdHJfbXlfbmFtZSAgICAgICA9IGFyZ3ZbMF07CisgICAgc3RyX2ZpbGVfYXV0b2NvbmYgPSBhcmd2WzFdOworICAgIHN0cl9kaXJfY29uZmlnICAgID0gYXJndlsyXTsKKworICAgIC8qIEZpbmQgYSBidWZmZXIgc2l6ZS4gKi8KKyAgICBpZiAoc3RhdChzdHJfZmlsZV9hdXRvY29uZiwgJnN0YXRfYnVmKSAhPSAwKQorCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOworICAgIGJ1ZmZlcl9zaXplID0gMiAqIHN0YXRfYnVmLnN0X3NpemUgKyA0MDk2OworCisgICAgLyogQWxsb2NhdGUgYnVmZmVycy4gKi8KKyAgICBpZiAoIChsaW5lICAgICAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKKyAgICB8fCAgIChvbGRfbGluZSAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKKyAgICB8fCAgIChsaXN0X3RhcmdldCA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwgKQorCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOworCisgICAgLyogT3BlbiBhdXRvY29uZmlnIGZpbGUuICovCisgICAgaWYgKChmcF9jb25maWcgPSBmb3BlbihzdHJfZmlsZV9hdXRvY29uZiwgInIiKSkgPT0gTlVMTCkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKworICAgIC8qIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeSBpZiBuZWVkZWQuICovCisgICAgaWYgKHN0YXQoc3RyX2Rpcl9jb25maWcsICZzdGF0X2J1ZikgIT0gMCkKKyAgICB7CisJaWYgKG1rZGlyKHN0cl9kaXJfY29uZmlnLCAwNzU1KSAhPSAwKQorCSAgICBFUlJPUl9FWElUKHN0cl9kaXJfY29uZmlnKTsKKyAgICB9CisKKyAgICAvKiBDaGFuZ2UgdG8gb3V0cHV0IGRpcmVjdG9yeS4gKi8KKyAgICBpZiAoY2hkaXIoc3RyX2Rpcl9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZGlyX2NvbmZpZyk7CisKKyAgICAvKiBQdXQgaW5pdGlhbCBzZXBhcmF0b3IgaW50byB0YXJnZXQgbGlzdC4gKi8KKyAgICBwdGFyZ2V0ID0gbGlzdF90YXJnZXQ7CisgICAgKnB0YXJnZXQrKyA9ICdcbic7CisKKyAgICAvKiBSZWFkIGNvbmZpZyBsaW5lcy4gKi8KKyAgICB3aGlsZSAoZmdldHMobGluZSwgYnVmZmVyX3NpemUsIGZwX2NvbmZpZykpCisgICAgeworCWNvbnN0IGNoYXIgKiBzdHJfY29uZmlnOworCWludCBpc19zYW1lOworCWludCBpdGFyZ2V0OworCisJaWYgKGxpbmVbMF0gIT0gJyMnKQorCSAgICBjb250aW51ZTsKKwlpZiAoKHN0cl9jb25maWcgPSBzdHJzdHIobGluZSwgIiBDT05GSUdfIikpID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJLyogV2UgZm91bmQgI2RlZmluZSBDT05GSUdfZm9vIG9yICN1bmRlZiBDT05GSUdfZm9vLgorCSAqIE1ha2UgdGhlIG91dHB1dCBmaWxlIG5hbWUuICovCisJc3RyX2NvbmZpZyArPSBzaXplb2YoIiBDT05GSUdfIikgLSAxOworCWZvciAoaXRhcmdldCA9IDA7ICFpc3NwYWNlKHN0cl9jb25maWdbaXRhcmdldF0pOyBpdGFyZ2V0KyspCisJeworCSAgICBpbnQgYyA9ICh1bnNpZ25lZCBjaGFyKSBzdHJfY29uZmlnW2l0YXJnZXRdOworCSAgICBpZiAoaXN1cHBlcihjKSkgYyA9IHRvbG93ZXIoYyk7CisJICAgIGlmIChjID09ICdfJykgICBjID0gJy8nOworCSAgICBwdGFyZ2V0W2l0YXJnZXRdID0gYzsKKwl9CisJcHRhcmdldFtpdGFyZ2V0KytdID0gJy4nOworCXB0YXJnZXRbaXRhcmdldCsrXSA9ICdoJzsKKwlwdGFyZ2V0W2l0YXJnZXQrK10gPSAnXDAnOworCisJLyogQ2hlY2sgZm9yIGV4aXN0aW5nIGZpbGUuICovCisJaXNfc2FtZSA9IDA7CisJaWYgKChmcF90YXJnZXQgPSBmb3BlbihwdGFyZ2V0LCAiciIpKSAhPSBOVUxMKQorCXsKKwkgICAgZmdldHMob2xkX2xpbmUsIGJ1ZmZlcl9zaXplLCBmcF90YXJnZXQpOworCSAgICBpZiAoZmNsb3NlKGZwX3RhcmdldCkgIT0gMCkKKwkJRVJST1JfRVhJVChwdGFyZ2V0KTsKKwkgICAgaWYgKCFzdHJjbXAobGluZSwgb2xkX2xpbmUpKQorCQlpc19zYW1lID0gMTsKKwl9CisKKwlpZiAoIWlzX3NhbWUpCisJeworCSAgICAvKiBBdXRvLWNyZWF0ZSBkaXJlY3Rvcmllcy4gKi8KKwkgICAgaW50IGlzbGFzaDsKKwkgICAgZm9yIChpc2xhc2ggPSAwOyBpc2xhc2ggPCBpdGFyZ2V0OyBpc2xhc2grKykKKwkgICAgeworCQlpZiAocHRhcmdldFtpc2xhc2hdID09ICcvJykKKwkJeworCQkgICAgcHRhcmdldFtpc2xhc2hdID0gJ1wwJzsKKwkJICAgIGlmIChzdGF0KHB0YXJnZXQsICZzdGF0X2J1ZikgIT0gMAorCQkgICAgJiYgIG1rZGlyKHB0YXJnZXQsIDA3NTUpICAgICAhPSAwKQorCQkJRVJST1JfRVhJVCggcHRhcmdldCApOworCQkgICAgcHRhcmdldFtpc2xhc2hdID0gJy8nOworCQl9CisJICAgIH0KKworCSAgICAvKiBXcml0ZSB0aGUgZmlsZS4gKi8KKwkgICAgaWYgKChmcF90YXJnZXQgPSBmb3BlbihwdGFyZ2V0LCAgInciKSkgPT0gTlVMTCkKKwkJRVJST1JfRVhJVChwdGFyZ2V0KTsKKwkgICAgZnB1dHMobGluZSwgZnBfdGFyZ2V0KTsKKwkgICAgaWYgKGZlcnJvcihmcF90YXJnZXQpIHx8IGZjbG9zZShmcF90YXJnZXQpICE9IDApCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJfQorCisJLyogVXBkYXRlIHRhcmdldCBsaXN0ICovCisJcHRhcmdldCArPSBpdGFyZ2V0OworCSoocHRhcmdldC0xKSA9ICdcbic7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbG9zZSBhdXRvY29uZmlnIGZpbGUuCisgICAgICogVGVybWluYXRlIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgKi8KKyAgICBpZiAoZmNsb3NlKGZwX2NvbmZpZykgIT0gMCkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKyAgICAqcHRhcmdldCA9ICdcMCc7CisKKyAgICAvKgorICAgICAqIEZpeCB1cCBleGlzdGluZyBmaWxlcyB3aGljaCBoYXZlIG5vIG5ldyB2YWx1ZS4KKyAgICAgKiBUaGlzIGlzIENhc2UgNCBhbmQgQ2FzZSA1LgorICAgICAqCisgICAgICogSSByZS1yZWFkIHRoZSB0cmVlIGFuZCBmaWx0ZXIgaXQgYWdhaW5zdCBsaXN0X3RhcmdldC4KKyAgICAgKiBUaGlzIGlzIGNydWRlLiAgQnV0IGl0IGF2b2lkcyBkYXRhIGNvcGllcy4gIEFsc28sIGxpc3RfdGFyZ2V0CisgICAgICogaXMgY29tcGFjdCBhbmQgY29udGlndW91cywgc28gaXQgZWFzaWx5IGZpdHMgaW50byBjYWNoZS4KKyAgICAgKgorICAgICAqIE5vdGljZSB0aGF0IGxpc3RfdGFyZ2V0IGNvbnRhaW5zIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IFxuLAorICAgICAqIHdpdGggYSBcbiBiZWZvcmUgdGhlIGZpcnN0IHN0cmluZyBhbmQgYWZ0ZXIgdGhlIGxhc3QuCisgICAgICogZmdldHMgZ2l2ZXMgdGhlIGluY29taW5nIG5hbWVzIGEgdGVybWluYXRpbmcgXG4uCisgICAgICogU28gYnkgaGF2aW5nIGFuIGluaXRpYWwgXG4sIHN0cnN0ciB3aWxsIGZpbmQgZXhhY3QgbWF0Y2hlcy4KKyAgICAgKi8KKworICAgIGZwX2ZpbmQgPSBwb3BlbigiZmluZCAqIC10eXBlIGYgLW5hbWUgXCIqLmhcIiAtcHJpbnQiLCAiciIpOworICAgIGlmIChmcF9maW5kID09IDApCisJRVJST1JfRVhJVCggImZpbmQiICk7CisKKyAgICBsaW5lWzBdID0gJ1xuJzsKKyAgICB3aGlsZSAoZmdldHMobGluZSsxLCBidWZmZXJfc2l6ZSwgZnBfZmluZCkpCisgICAgeworCWlmIChzdHJzdHIobGlzdF90YXJnZXQsIGxpbmUpID09IE5VTEwpCisJeworCSAgICAvKgorCSAgICAgKiBUaGlzIGlzIGFuIG9sZCBmaWxlIHdpdGggbm8gQ09ORklHXyogZmxhZyBpbiBhdXRvY29uZi5oLgorCSAgICAgKi8KKworCSAgICAvKiBGaXJzdCBzdHJpcCB0aGUgXG4uICovCisJICAgIGxpbmVbc3RybGVuKGxpbmUpLTFdID0gJ1wwJzsKKworCSAgICAvKiBHcmFiIHNpemUuICovCisJICAgIGlmIChzdGF0KGxpbmUrMSwgJnN0YXRfYnVmKSAhPSAwKQorCQlFUlJPUl9FWElUKGxpbmUpOworCisJICAgIC8qIElmIGZpbGUgaXMgbm90IGVtcHR5LCBtYWtlIGl0IGVtcHR5IGFuZCBnaXZlIGl0IGEgZnJlc2ggZGF0ZS4gKi8KKwkgICAgaWYgKHN0YXRfYnVmLnN0X3NpemUgIT0gMCkKKwkgICAgeworCQlpZiAoKGZwX3RhcmdldCA9IGZvcGVuKGxpbmUrMSwgInciKSkgPT0gTlVMTCkKKwkJICAgIEVSUk9SX0VYSVQobGluZSk7CisJCWlmIChmY2xvc2UoZnBfdGFyZ2V0KSAhPSAwKQorCQkgICAgRVJST1JfRVhJVChsaW5lKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAocGNsb3NlKGZwX2ZpbmQpICE9IDApCisJRVJST1JfRVhJVCgiZmluZCIpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2JiX3JlbGVhc2UgYi9zY3JpcHRzL2JiX3JlbGVhc2UKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGFhMzgwNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmJfcmVsZWFzZQpAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vc2gKKworIyBDcmVhdGUgc2lnbmVkIHJlbGVhc2UgdGFyYmFsbHMgYW5kIHNpZ25hdHVyZSBmaWxlcyBmcm9tIGN1cnJlbnQgc3ZuLgorIyBTaW5jZSB5b3UgZG9uJ3QgaGF2ZSBteSBncGcga2V5LCB0aGlzIGRvZXNuJ3QgZG8geW91IG11Y2ggZ29vZCwKKyMgYnV0IGlmIEkgZ2V0IGhpdCBieSBhIGJ1cyB0aGUgbmV4dCBtYWludGFpbmVyIG1pZ2h0IGZpbmQgdGhpcyB1c2VmdWwuCisjIFJ1biB0aGlzIGluIGFuIGVtcHR5IGRpcmVjdG9yeS4gIFRoZSBWRVJTSU9OPSBsaW5lIGNhbiBnZXQgY29uZnVzZWQKKyMgb3RoZXJ3aXNlLgorCisjc3ZuIGNvIHN2bjovL2J1c3lib3gubmV0L3RydW5rL2J1c3lib3gKK2NkIGJ1c3lib3ggfHwgeyBlY2hvICJjZCBidXN5Ym94IGZhaWxlZCI7IGV4aXQgMTsgfQorbWFrZSByZWxlYXNlIHx8IHsgZWNobyAibWFrZSByZWxlYXNlIGZhaWxlZCI7IGV4aXQgMTsgfQorY2QgLi4KKworVkVSU0lPTj1gbHMgYnVzeWJveC0qLnRhci5neiB8IHNlZCAncy9idXN5Ym94LVwoLipcKVwudGFyXC5nei9cMS8nYAorCit6Y2F0IGJ1c3lib3gtJFZFUlNJT04udGFyLmd6IHwgYnppcDIgPiBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIKKwordGVzdCAtZiBidXN5Ym94LSRWRVJTSU9OLnRhci5neiB8fCB7IGVjaG8gIm5vIGJ1c3lib3gtJFZFUlNJT04udGFyLmd6IjsgZXhpdCAxOyB9Cit0ZXN0IC1mIGJ1c3lib3gtJFZFUlNJT04udGFyLmJ6MiB8fCB7IGVjaG8gIm5vIGJ1c3lib3gtJFZFUlNJT04udGFyLmJ6MiI7IGV4aXQgMTsgfQorCitzaWduaXQoKQoreworZWNobyAiJDEgcmVsZWFzZWQgYGRhdGUgLXIgJDEgLVJgCisKK01ENTogIGBtZDVzdW0gJDFgCitTSEExOiBgc2hhMXN1bSAkMWAKKworVG8gdmVyaWZ5IHRoaXMgc2lnbmF0dXJlLCB5b3UgY2FuIG9idGFpbiBteSBwdWJsaWMga2V5Citmcm9tIGh0dHA6Ly9idXN5Ym94Lm5ldC9+dmRhL3ZkYV9wdWJrZXkuZ3BnCisiIHwgZ3BnIC0tY2xlYXJzaWduID4gIiQxLnNpZ24iCit9CisKK3NpZ25pdCBidXN5Ym94LSRWRVJTSU9OLnRhci5negorc2lnbml0IGJ1c3lib3gtJFZFUlNJT04udGFyLmJ6MgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ibG9hdC1vLW1ldGVyIGIvc2NyaXB0cy9ibG9hdC1vLW1ldGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkM2ZmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIKQEAgLTAsMCArMSwxMzkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNCBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKyMKKyMgSW5zcGlyZWQgYnkgcGVybCBCbG9hdC1PLU1ldGVyIChjKSAxOTk3IGJ5IEFuZGkgS2xlZW4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCitpbXBvcnQgc3lzLCBvcyMsIHJlCisKK2RlZiB1c2FnZSgpOgorICAgIHN5cy5zdGRlcnIud3JpdGUoInVzYWdlOiAlcyBbLXRdIGZpbGUxIGZpbGUyXG4iICUgc3lzLmFyZ3ZbMF0pCisgICAgc3lzLmV4aXQoLTEpCisKK2YxLCBmMiA9IChOb25lLCBOb25lKQorZmxhZ190aW1pbmcsIGRhc2hlcyA9IChGYWxzZSwgRmFsc2UpCisKK2ZvciBmIGluIHN5cy5hcmd2WzE6XToKKyAgICBpZiBmLnN0YXJ0c3dpdGgoIi0iKToKKyAgICAgICAgaWYgZiA9PSAiLS0iOiAjIHN5bV9hcmdzCisgICAgICAgICAgICBkYXNoZXMgPSBUcnVlCisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBmID09ICItdCI6ICMgdGltaW5ncworICAgICAgICAgICAgZmxhZ190aW1pbmcgPSBUcnVlCisgICAgZWxzZToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGYpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRXJyb3I6IGZpbGUgJyVzJyBkb2VzIG5vdCBleGlzdFxuIiAlIGYpCisgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgIGlmIGYxIGlzIE5vbmU6CisgICAgICAgICAgICBmMSA9IGYKKyAgICAgICAgZWxpZiBmMiBpcyBOb25lOgorICAgICAgICAgICAgZjIgPSBmCitpZiBmbGFnX3RpbWluZzoKKyAgICBpbXBvcnQgdGltZQoraWYgZjEgaXMgTm9uZSBvciBmMiBpcyBOb25lOgorICAgIHVzYWdlKCkKKworc3ltX2FyZ3MgPSAiICIuam9pbihzeXMuYXJndlszICsgZmxhZ190aW1pbmcgKyBkYXNoZXM6XSkKK2RlZiBnZXRzaXplcyhmaWxlKToKKyAgICBzeW0sIGFsaWFzLCBsdXQgPSB7fSwge30sIHt9CisgICAgI2R5bnN5bV9maWx0ZXIgPSByZS5jb21waWxlKCJeXGQrOlxzK1tcZEEtRmEtZl0rXHMrXGQrXHMrXHcrXHMrXHcrXHMrXHcrXHMrXHcrXHMrXHcrJCIpCisgICAgZm9yIGwgaW4gb3MucG9wZW4oInJlYWRlbGYgLVcgLXMgJXMgJXMiICUgKHN5bV9hcmdzLCBmaWxlKSkucmVhZGxpbmVzKCk6CisgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICBsID0gbC5zdHJpcCgpCisgICAgICAgICAgICBpZiBub3QgKGxlbihsKSBhbmQgbFswXS5pc2RpZ2l0KCkgYW5kIGxlbihsLnNwbGl0KCkpID09IDgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBudW0sIHZhbHVlLCBzaXplLCB0eXAsIGJpbmQsIHZpcywgbmR4LCBuYW1lID0gbC5zcGxpdCgpCisgICAgICAgICAgICBpZiBuZHggPT0gIlVORCI6IGNvbnRpbnVlICMgc2tpcCB1bmRlZmluZWQKKyAgICAgICAgICAgIGlmIHR5cCBpbiBbIlNFQ1RJT04iLCAiRklMRVMiXTogY29udGludWUgIyBza2lwIHNlY3Rpb25zIGFuZCBmaWxlcworICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICBsID0gbC5zdHJpcCgpCisgICAgICAgICMgICAgbWF0Y2ggPSBkeW5zeW1fZmlsdGVyLm1hdGNoKGwpCisgICAgICAgICMgICAgaWYgbm90IG1hdGNoOiBjb250aW51ZQorICAgICAgICAjICAgIHgsIHZhbHVlLCBzaXplLCB0eXAsIGJpbmQsIHgsIG5keCwgbmFtZSA9IGwuc3BsaXQoKQorICAgICAgICAjICAgIGlmIG5keCA9PSAiVU5EIjogY29udGludWUgIyBza2lwIHVuZGVmaW5lZAorICAgICAgICAjICAgIGlmIHR5cCBpbiBbIlNFQ1RJT04iLCAiRklMRVMiXTogY29udGludWUgIyBza2lwIHNlY3Rpb25zIGFuZCBmaWxlcworICAgICAgICBpZiAiLiIgaW4gbmFtZTogbmFtZSA9ICJzdGF0aWMuIiArIG5hbWUuc3BsaXQoIi4iKVswXQorICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSwgMTYpCisgICAgICAgIHNpemUgPSBpbnQoc2l6ZSkKKyAgICAgICAgaWYgdmlzICE9ICJERUZBVUxUIiBhbmQgYmluZCAhPSAiR0xPQkFMIjogIyBzZWUgaWYgaXQgaXMgYW4gYWxpYXMKKyAgICAgICAgICAgIGFsaWFzWyh2YWx1ZSwgc2l6ZSldID0geyJuYW1lIiA6IG5hbWV9CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeW1bbmFtZV0gPSB7ImFkZHIiIDogdmFsdWUsICJzaXplIjogIHNpemV9CisgICAgICAgICAgICBsdXRbKHZhbHVlLCBzaXplKV0gPSAwCisgICAgZm9yIGFkZHIsIHN6IGluIGl0ZXIoYWxpYXMua2V5cygpKToKKyAgICAgICAgIyBJZiB0aGUgbm9uLUdMT0JBTCBzeW0gaGFzIGFuIGltcGxlbWVudGF0aW9uIGVsc2V3aGVyZSB0aGVuCisgICAgICAgICMgaXQncyBhbiBhbGlhcywgZGlzcmVnYXJkIGl0LgorICAgICAgICBpZiBub3QgKGFkZHIsIHN6KSBpbiBsdXQ6CisgICAgICAgICAgICAjIElmIHRoaXMgbm9uLUdMT0JBTCBzeW0gZG9lcyBub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBhdAorICAgICAgICAgICAgIyBhbm90aGVyIGFkZHJlc3MsIHRoZW4gdHJlYXQgaXQgYXMgYSBub3JtYWwgc3ltYm9sLgorICAgICAgICAgICAgc3ltW2FsaWFzWyhhZGRyLCBzeildWyJuYW1lIl1dID0geyJhZGRyIiA6IGFkZHIsICJzaXplIjogc3p9CisgICAgZm9yIGwgaW4gb3MucG9wZW4oInJlYWRlbGYgLVcgLVMgIiArIGZpbGUpLnJlYWRsaW5lcygpOgorICAgICAgICB4ID0gbC5zcGxpdCgpCisgICAgICAgIGlmIGxlbih4KTw2OiBjb250aW51ZQorICAgICAgICAjIFNob3VsZCB0YWtlIHRoZXNlIGludG8gYWNjb3VudCB0b28hCisgICAgICAgICNpZiB4WzFdIG5vdCBpbiBbIi50ZXh0IiwgIi5yb2RhdGEiLCAiLnN5bXRhYiIsICIuc3RydGFiIl06IGNvbnRpbnVlCisgICAgICAgIGlmIHhbMV0gbm90IGluIFsiLnJvZGF0YSJdOiBjb250aW51ZQorICAgICAgICBzeW1beFsxXV0gPSB7ImFkZHIiIDogaW50KHhbM10sIDE2KSwgInNpemUiIDogaW50KHhbNV0sIDE2KX0KKyAgICByZXR1cm4gc3ltCisKK2lmIGZsYWdfdGltaW5nOgorICAgIHN0YXJ0X3QxID0gaW50KHRpbWUudGltZSgpICogMWU5KQorb2xkID0gZ2V0c2l6ZXMoZjEpCitpZiBmbGFnX3RpbWluZzoKKyAgICBlbmRfdDEgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCisgICAgc3RhcnRfdDIgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCituZXcgPSBnZXRzaXplcyhmMikKK2lmIGZsYWdfdGltaW5nOgorICAgIGVuZF90MiA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKKyAgICBzdGFydF90MyA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKK2dyb3csIHNocmluaywgYWRkLCByZW1vdmUsIHVwLCBkb3duID0gMCwgMCwgMCwgMCwgMCwgMAorZGVsdGEsIGNvbW1vbiA9IFtdLCB7fQorCitmb3IgbmFtZSBpbiBpdGVyKG9sZC5rZXlzKCkpOgorICAgIGlmIG5hbWUgaW4gbmV3OgorICAgICAgICBjb21tb25bbmFtZV0gPSAxCisKK2ZvciBuYW1lIGluIG9sZDoKKyAgICBpZiBuYW1lIG5vdCBpbiBjb21tb246CisgICAgICAgIHJlbW92ZSArPSAxCisgICAgICAgIHN6ID0gb2xkW25hbWVdWyJzaXplIl0KKyAgICAgICAgZG93biArPSBzegorICAgICAgICBkZWx0YS5hcHBlbmQoKC1zeiwgbmFtZSkpCisKK2ZvciBuYW1lIGluIG5ldzoKKyAgICBpZiBuYW1lIG5vdCBpbiBjb21tb246CisgICAgICAgIGFkZCArPSAxCisgICAgICAgIHN6ID0gbmV3W25hbWVdWyJzaXplIl0KKyAgICAgICAgdXAgKz0gc3oKKyAgICAgICAgZGVsdGEuYXBwZW5kKChzeiwgbmFtZSkpCisKK2ZvciBuYW1lIGluIGNvbW1vbjoKKyAgICAgICAgZCA9IG5ld1tuYW1lXS5nZXQoInNpemUiLCAwKSAtIG9sZFtuYW1lXS5nZXQoInNpemUiLCAwKQorICAgICAgICBpZiBkPjA6IGdyb3csIHVwID0gZ3JvdysxLCB1cCtkCisgICAgICAgIGVsaWYgZDwwOiBzaHJpbmssIGRvd24gPSBzaHJpbmsrMSwgZG93bi1kCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBkZWx0YS5hcHBlbmQoKGQsIG5hbWUpKQorCitkZWx0YS5zb3J0KCkKK2RlbHRhLnJldmVyc2UoKQoraWYgZmxhZ190aW1pbmc6CisgICAgZW5kX3QzID0gaW50KHRpbWUudGltZSgpICogMWU5KQorCitwcmludCgiJS00OHMgJTdzICU3cyAlKzdzIiAlICgiZnVuY3Rpb24iLCAib2xkIiwgIm5ldyIsICJkZWx0YSIpKQorZm9yIGQsIG4gaW4gZGVsdGE6CisgICAgaWYgZDoKKyAgICAgICAgb2xkX3N6ID0gb2xkLmdldChuLCB7fSkuZ2V0KCJzaXplIiwgIi0iKQorICAgICAgICBuZXdfc3ogPSBuZXcuZ2V0KG4sIHt9KS5nZXQoInNpemUiLCAiLSIpCisgICAgICAgIHByaW50KCIlLTQ4cyAlN3MgJTdzICUrN2QiICUgKG4sIG9sZF9zeiwgbmV3X3N6LCBkKSkKK3ByaW50KCItIio3OCkKK3RvdGFsPSIoYWRkL3JlbW92ZTogJXMvJXMgZ3Jvdy9zaHJpbms6ICVzLyVzIHVwL2Rvd246ICVzLyVzKSUlc1RvdGFsOiAlcyBieXRlcyJcCisgICAgJSAoYWRkLCByZW1vdmUsIGdyb3csIHNocmluaywgdXAsIC1kb3duLCB1cC1kb3duKQorcHJpbnQodG90YWwgJSAoIiAiKig4MC1sZW4odG90YWwpKSkpCitpZiBmbGFnX3RpbWluZzoKKyAgICBwcmludCgiXG4lZC8lZDsgJWQgUGFyc2Ugb3JpZ2luL25ldzsgcHJvY2Vzc2luZyBuc2VjcyIgJQorICAgICAgICAoZW5kX3QxLXN0YXJ0X3QxLCBlbmRfdDItc3RhcnRfdDIsIGVuZF90My1zdGFydF90MykpCisgICAgcHJpbnQoInRvdGFsIG5zZWNzOiAlZCIgJSAoZW5kX3QzLXN0YXJ0X3QxKSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2toZWxwLmF3ayBiL3NjcmlwdHMvY2hlY2toZWxwLmF3awpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDg0M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVja2hlbHAuYXdrCkBAIC0wLDAgKzEsNDAgQEAKKyMhL3Vzci9iaW4vYXdrIC1mCisjIEFXSyBzY3JpcHQgdG8gY2hlY2sgZm9yIG1pc3NpbmcgaGVscCBlbnRyaWVzIGZvciBjb25maWcgb3B0aW9ucworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisjIE1JVC9YIHB1YmxpYyBsaWNlbnNlcy4gU2VlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5odG1sCisjIGFuZCBub3RpY2UgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2UtbGlzdC5odG1sI1gxMUxpY2Vuc2UKKworCisvXmNob2ljZS8geyBpc19jaG9pY2UgPSAxOyB9CisvXmVuZGNob2ljZS8geyBpc19jaG9pY2UgPSAwOyB9CisvXmNvbmZpZy8geworCXBvcysrOworCWNvbmZbcG9zXSA9ICQyOworCWZpbGVbcG9zXSA9IEZJTEVOQU1FOworCWlmIChpc19jaG9pY2UpIHsKKwkJaGVscFtwb3NdID0gMTsgIyBkbyBub3Qgd2FybiBhYm91dCAnY2hvaWNlJyBjb25maWcgZW50cmllcy4KKwl9IGVsc2UgeworCQloZWxwW3Bvc10gPSAwOworCX0KK30KKy9eWyBcdF0qaGVscFsgXHRdKiQvIHsKKwloZWxwW3Bvc10gPSAxOworfQorL15bIFx0XSpib29sWyBcdF0qJC8geworCWhlbHBbcG9zXSA9IDE7ICMgaWdub3JlIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBzZWxlY3RhYmxlCit9CitCRUdJTiB7CisJcG9zID0gLTE7CisJaXNfY2hvaWNlID0gMDsKK30KK0VORCB7CisJZm9yIChpID0gMDsgaSA8PSBwb3M7IGkrKykgeworIwlwcmludGYoIiVzOiBoZWxwIGZvciAjJWkgJyVzJyA9PSAlaVxuIiwgZmlsZVtpXSwgaSwgY29uZltpXSwgaGVscFtpXSk7CisJCWlmIChoZWxwW2ldID09IDApIHsKKwkJCXByaW50ZigiJXM6IE5vIGhlbHB0ZXh0IGZvciAnJXMnXG4iLCBmaWxlW2ldLCBjb25mW2ldKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2tzdGFjay5wbCBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NWNkZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVja3N0YWNrLnBsCkBAIC0wLDAgKzEsMTQxIEBACisjIS91c3IvYmluL3BlcmwKKworIyBTdG9sZW4gZnJvbSBMaW51eCBrZXJuZWwgOikKKworIwlDaGVjayB0aGUgc3RhY2sgdXNhZ2Ugb2YgZnVuY3Rpb25zCisjCisjCUNvcHlyaWdodCBKb2VybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CisjCUluc3BpcmVkIGJ5IExpbnVzIFRvcnZhbGRzCisjCU9yaWdpbmFsIGlkZWEgbWF5YmUgZnJvbSBLZWl0aCBPd2VucworIwlzMzkwIHBvcnQgYW5kIGJpZyBzcGVlZHVwIGJ5IEFybmQgQmVyZ21hbm4gPGFybmRAYmVyZ21hbm4tZGFsbGRvcmYuZGU+CisjCU1pcHMgcG9ydCBieSBKdWFuIFF1aW50ZWxhIDxxdWludGVsYUBtYW5kcmFrZXNvZnQuY29tPgorIwlJQTY0IHBvcnQgdmlhIEFuZHJlYXMgRGlsZ2VyCisjCUFybSBwb3J0IGJ5IEhvbGdlciBTY2h1cmlnCisjCXNoNjQgcG9ydCBieSBQYXVsIE11bmR0CisjCVJhbmRvbSBiaXRzIGJ5IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorIwlNNjhrIHBvcnQgYnkgR2VlcnQgVXl0dGVyaG9ldmVuIGFuZCBBbmRyZWFzIFNjaHdhYgorIworIwlVc2FnZToKKyMJb2JqZHVtcCAtZCB2bWxpbnV4IHwgY2hlY2tzdGFjay5wbCBbYXJjaF0KKyMKKyMJVE9ETyA6CVBvcnQgdG8gYWxsIGFyY2hpdGVjdHVyZXMgKG9uZSByZWdleCBwZXIgYXJjaCkKKworIyBjaGVjayBmb3IgYXJjaAorIworIyAkcmUgaXMgdXNlZCBmb3IgdHdvIG1hdGNoZXM6CisjICQmICh3aG9sZSByZSkgbWF0Y2hlcyB0aGUgY29tcGxldGUgb2JqZHVtcCBsaW5lIHdpdGggdGhlIHN0YWNrIGdyb3d0aAorIyAkMSAoZmlyc3QgYnJhY2tldCkgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgZ3Jvd3RoCisjCisjIHVzZSBhbnl0aGluZyBlbHNlIGFuZCBmZWVsIHRoZSBwYWluIDspCitteSAoQHN0YWNrLCAkcmUsICR4LCAkeHMpOworeworCW15ICRhcmNoID0gc2hpZnQ7CisJaWYgKCRhcmNoIGVxICIiKSB7CisJCSRhcmNoID0gYHVuYW1lIC1tYDsKKwl9CisKKwkkeAk9ICJbMC05YS1mXSI7CSMgaGV4IGNoYXJhY3RlcgorCSR4cwk9ICJbMC05YS1mIF0iOwkjIGhleCBjaGFyYWN0ZXIgb3Igc3BhY2UKKwlpZiAoJGFyY2ggZXEgJ2FybScpIHsKKwkJI2MwMDA4ZmZjOgllMjRkZDA2NAlzdWIJc3AsIHNwLCAjMTAwCTsgMHg2NAorCQkkcmUgPSBxci8uKnN1Yi4qc3AsIHNwLCAjKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnYmxhY2tmaW4nKSB7CisJCSMgICAgICA1MjogICAgICAgMDAgZTggMDMgMDAgICAgIExJTksgMHhjOworCQkkcmUgPSBxci8uKkxJTksgKDB4JHh7MSw1fSk7JC9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9eaVszNDU2XTg2JC8pIHsKKwkJI2MwMTA1MjM0OiAgICAgICA4MSBlYyBhYyAwNSAwMCAwMCAgICAgICBzdWIgICAgJDB4NWFjLCVlc3AKKwkJJHJlID0gcXIvXi4qW2FzXVtkdV1bZGJdICAgIFwkKDB4JHh7MSw4fSksXCVlc3AkL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3g4Nl82NCcpIHsKKwkJIyAgICAyZjYwOgk0OCA4MSBlYyBlOCAwNSAwMCAwMCAJc3ViICAgICQweDVlOCwlcnNwCisJCSRyZSA9IHFyL14uKlthc11bZHVdW2RiXSAgICBcJCgweCR4ezEsOH0pLFwlcnNwJC9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdpYTY0JykgeworCQkjZTAwMDAwMDAwNDQwMTFmYzogICAgICAgMDEgMGYgZmMgOGMgICAgIGFkZHMgcjEyPS0zODQscjEyCisJCSRyZSA9IHFyLy4qYWRkcy4qcjEyPS0oKFswLTldezJ9fFszLTldKVswLTldezJ9KSxyMTIvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnbTY4aycpIHsKKwkJIyAgICAyYjZjOiAgICAgICA0ZTU2IGZiNzAgICAgICAgbGlua3cgJWZwLCMtMTE2OAorCQkjICAxZGY3NzA6ICAgICAgIGRlZmMgZmZlNCAgICAgICBhZGRhdyAjLTI4LCVzcAorCQkkcmUgPSBxci8uKig/Omxpbmt3ICVmcCx8YWRkYXcgKSMtKFswLTldezEsNH0pKD86LCVzcCk/JC9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdtaXBzNjQnKSB7CisJCSM4ODAwNDAyYzogICAgICAgNjdiZGZmZjAgICAgICAgIGRhZGRpdSAgc3Asc3AsLTE2CisJCSRyZSA9IHFyLy4qZGFkZGl1LipzcCxzcCwtKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnbWlwcycpIHsKKwkJIzg4MDAzMjU0OiAgICAgICAyN2JkZmZlMCAgICAgICAgYWRkaXUgICBzcCxzcCwtMzIKKwkJJHJlID0gcXIvLiphZGRpdS4qc3Asc3AsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3BwYycpIHsKKwkJI2MwMDAyOWY0OiAgICAgICA5NCAyMSBmZiAzMCAgICAgc3R3dSAgICByMSwtMjA4KHIxKQorCQkkcmUgPSBxci8uKnN0d3UuKnIxLC0oJHh7MSw4fSlcKHIxXCkvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAncHBjNjQnKSB7CisJCSNYWFgKKwkJJHJlID0gcXIvLipzdGR1LipyMSwtKCR4ezEsOH0pXChyMVwpL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3Bvd2VycGMnKSB7CisJCSRyZSA9IHFyLy4qc3RbZHdddS4qcjEsLSgkeHsxLDh9KVwocjFcKS9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9eczM5MHg/JC8pIHsKKwkJIyAgIDExMTYwOiAgICAgICBhNyBmYiBmZiA2MCAgICAgICAgICAgICBhZ2hpICAgJXIxNSwtMTYwCisJCSRyZSA9IHFyLy4qYWc/aGkuKlwlcjE1LC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9ec2g2NCQvKSB7CisJCSNYWFg6IHdlIG9ubHkgY2hlY2sgZm9yIHRoZSBpbW1lZGlhdGUgY2FzZSBwcmVzZW50bHksCisJCSMgICAgIHRob3VnaCB3ZSB3aWxsIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBtb3ZpL3N1YgorCQkjICAgICBwYWlyIGZvciBsYXJnZXIgdXNlcnMuIC0tIFBGTS4KKwkJI2EwMDA0OGUwOiAgICAgICBkNGZjNDBmMCAgICAgICAgYWRkaS5sICByMTUsLTI0MCxyMTUKKwkJJHJlID0gcXIvLiphZGRpXC5sLipyMTUsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pLHIxNS9vOworCX0gZWxzZSB7CisJCXByaW50KCJ3cm9uZyBvciB1bmtub3duIGFyY2hpdGVjdHVyZVxuIik7CisJCWV4aXQKKwl9Cit9CisKK3N1YiBieXNpemUoJCkgeworCW15ICgkYXNpemUsICRic2l6ZSk7CisJKCRhc2l6ZSA9ICRhKSA9fiBzLy4qOgkqKC4qKSQvJDEvOworCSgkYnNpemUgPSAkYikgPX4gcy8uKjoJKiguKikkLyQxLzsKKwkkYnNpemUgPD0+ICRhc2l6ZQorfQorCisjCisjIG1haW4oKQorIworbXkgJGZ1bmNyZSA9IHFyL14keCogPCguKik+OiQvOworbXkgJGZ1bmM7CitteSAkZmlsZSwgJGxhc3RzbGFzaDsKKword2hpbGUgKG15ICRsaW5lID0gPFNURElOPikgeworCWlmICgkbGluZSA9fiBtLyRmdW5jcmUvKSB7CisJCSRmdW5jID0gJDE7CisJfQorCWVsc2lmICgkbGluZSA9fiBtLyguKik6XHMqZmlsZSBmb3JtYXQvKSB7CisJCSRmaWxlID0gJDE7CisJCSRmaWxlID1+IHMvXC5rby8vOworCQkkbGFzdHNsYXNoID0gcmluZGV4KCRmaWxlLCAiLyIpOworCQlpZiAoJGxhc3RzbGFzaCAhPSAtMSkgeworCQkJJGZpbGUgPSBzdWJzdHIoJGZpbGUsICRsYXN0c2xhc2ggKyAxKTsKKwkJfQorCX0KKwllbHNpZiAoJGxpbmUgPX4gbS8kcmUvKSB7CisJCW15ICRzaXplID0gJDE7CisJCSRzaXplID0gaGV4KCRzaXplKSBpZiAoJHNpemUgPX4gL14weC8pOworCisJCWlmICgkc2l6ZSA+IDB4ZjAwMDAwMDApIHsKKwkJCSRzaXplID0gLSAkc2l6ZTsKKwkJCSRzaXplICs9IDB4ODAwMDAwMDA7CisJCQkkc2l6ZSArPSAweDgwMDAwMDAwOworCQl9CisJCW5leHQgaWYgKCRzaXplID4gMHgxMDAwMDAwMCk7CisKKwkJbmV4dCBpZiAkbGluZSAhfiBtL14oJHhzKikvOworCQlteSAkYWRkciA9ICQxOworCQkkYWRkciA9fiBzLyAvMC9nOworCQkkYWRkciA9ICIweCRhZGRyIjsKKworCQkjIGJib3g6IHdhczogbXkgJGludHJvID0gIiRhZGRyICRmdW5jIFskZmlsZV06IjsKKwkJbXkgJGludHJvID0gIiRmdW5jIFskZmlsZV06IjsKKwkJbXkgJHBhZGxlbiA9IDU2IC0gbGVuZ3RoKCRpbnRybyk7CisJCXdoaWxlICgkcGFkbGVuID4gMCkgeworCQkJJGludHJvIC49ICcJJzsKKwkJCSRwYWRsZW4gLT0gODsKKwkJfQorCQluZXh0IGlmICgkc2l6ZSA8IDEwMCk7CisJCXB1c2ggQHN0YWNrLCAiJGludHJvJHNpemVcbiI7CisJfQorfQorCitwcmludCBzb3J0IGJ5c2l6ZSBAc3RhY2s7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NsZWFudXBfcHJpbnRmMnB1dHMgYi9zY3JpcHRzL2NsZWFudXBfcHJpbnRmMnB1dHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDAxOTNhOAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY2xlYW51cF9wcmludGYycHV0cwpAQCAtMCwwICsxLDkgQEAKKyMhL2Jpbi9zaAorCisjIFByb2Nlc3NlcyBjdXJyZW50IGRpcmVjdG9yeSByZWN1cnNpdmVseToKKyMgcHJpbnRmKCJhYmNcbiIpIC0+IHB1dHMoImFiYyIpLiBCZXdhcmUgb2YgZnByaW50ZiBldGMuLi4KKworIyBCVFcsIGdjYyA0LjEuMiBhbHJlYWR5IGRvZXMgdGhlIHNhbWUhIENhbid0IGJlbGlldmUgaXQuLi4KKworZ3JlcCAtbHIgJ3ByaW50ZlwoW14lJV0qXFxuIlwpJyAuIHwgZ3JlcCAnLltjaF0kJyB8IHhhcmdzIC1uMSBcCisgICAgc2VkIC1lICdzL1woW15BLVphLXowLTlfXVwpcHJpbnRmKFwoICoiW14lXSpcKVxcbiIpL1wxcHV0cyhcMiIpLycgLWkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZWNoby5jIGIvc2NyaXB0cy9lY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyMDdhZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZWNoby5jCkBAIC0wLDAgKzEsMjMwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBlY2hvIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94IC0gdXNlZCBhcyBhIGhlbHBlciBmb3IgdGVzdHN1aXRlLyoKKyAqIG9uIHN5c3RlbXMgbGFja2luZyAiZWNobyAtZW4iCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50IC0tIHVubGVzcyBjb25maWd1cmVkIGFzIGZhbmN5IGVjaG8uICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2VjaG8uaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIEJlY2F1c2Ugb2YgYmVoYXZpb3JhbCBkaWZmZXJlbmNlcywgaW1wbGVtZW50ZWQgY29uZmlndXJhYmxlIFNVU3YzCisgKiBvciAnZmFuY3knIGdudS1pc2ggYmVoYXZpb3JzLiAgQWxzbywgcmVkdWNlZCBzaXplIGFuZCBmaXhlZCBidWdzLgorICogMSkgSW4gaGFuZGxpbmcgJ1xjJyBlc2NhcGUsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9ubHkgc3VwcHJlc3NlZCB0aGUKKyAqICAgICB0cmFpbGluZyBuZXdsaW5lLiAgU1VTdjMgc3BlY2lmaWVzIF9ub18gb3V0cHV0IGFmdGVyICdcYycuCisgKiAyKSBTVVN2MyBzcGVjaWZpZXMgdGhhdCBvY3RhbCBlc2NhcGVzIGFyZSBvZiB0aGUgZm9ybSBcMHsjeyN7I319fS4KKyAqICAgIFRoZSBwcmV2aW91cyB2ZXJzaW9uIGRpZCBub3QgYWxsb3cgNC1kaWdpdCBvY3RhbHMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgV0FOVF9IRVhfRVNDQVBFUyAxCisKKy8qIFVzdWFsICJ0aGlzIG9ubHkgd29ya3MgZm9yIGFzY2lpIGNvbXBhdGlibGUgZW5jb2RpbmdzIiBkaXNjbGFpbWVyLiAqLworI3VuZGVmIF90b2xvd2VyCisjZGVmaW5lIF90b2xvd2VyKFgpICgoWCl8KChjaGFyKSAweDIwKSkKKworc3RhdGljIGNoYXIgYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoY29uc3QgY2hhciAqKnB0cikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjaGFybWFwW10gPSB7CisJCSdhJywgICdiJywgICdmJywgICduJywgICdyJywgICd0JywgICd2JywgICdcXCcsIDAsCisJCSdcYScsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsICdcdicsICdcXCcsICdcXCcgfTsKKworCWNvbnN0IGNoYXIgKnA7CisJY29uc3QgY2hhciAqcTsKKwl1bnNpZ25lZCBpbnQgbnVtX2RpZ2l0czsKKwl1bnNpZ25lZCBpbnQgcjsKKwl1bnNpZ25lZCBpbnQgbjsKKwl1bnNpZ25lZCBpbnQgZDsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKworCW51bV9kaWdpdHMgPSBuID0gMDsKKwliYXNlID0gODsKKwlxID0gKnB0cjsKKworI2lmZGVmIFdBTlRfSEVYX0VTQ0FQRVMKKwlpZiAoKnEgPT0gJ3gnKSB7CisJCSsrcTsKKwkJYmFzZSA9IDE2OworCQkrK251bV9kaWdpdHM7CisJfQorI2VuZGlmCisKKwlkbyB7CisJCWQgPSAodW5zaWduZWQgY2hhcikoKnEpIC0gJzAnOworI2lmZGVmIFdBTlRfSEVYX0VTQ0FQRVMKKwkJaWYgKGQgPj0gMTApIHsKKwkJCWQgPSAodW5zaWduZWQgY2hhcikoX3RvbG93ZXIoKnEpKSAtICdhJyArIDEwOworCQl9CisjZW5kaWYKKworCQlpZiAoZCA+PSBiYXNlKSB7CisjaWZkZWYgV0FOVF9IRVhfRVNDQVBFUworCQkJaWYgKChiYXNlID09IDE2KSAmJiAoIS0tbnVtX2RpZ2l0cykpIHsKKy8qCQkJCXJldHVybiAnXFwnOyAqLworCQkJCS0tcTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlyID0gbiAqIGJhc2UgKyBkOworCQlpZiAociA+IFVDSEFSX01BWCkgeworCQkJYnJlYWs7CisJCX0KKworCQluID0gcjsKKwkJKytxOworCX0gd2hpbGUgKCsrbnVtX2RpZ2l0cyA8IDMpOworCisJaWYgKG51bV9kaWdpdHMgPT0gMCkgewkvKiBtbmVtb25pYyBlc2NhcGUgc2VxdWVuY2U/ICovCisJCXAgPSBjaGFybWFwOworCQlkbyB7CisJCQlpZiAoKnAgPT0gKnEpIHsKKwkJCQlxKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKCorK3ApOworCQluID0gKihwICsgKHNpemVvZihjaGFybWFwKS8yKSk7CisJfQorCisJKnB0ciA9IHE7CisKKwlyZXR1cm4gKGNoYXIpIG47Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmFyZzsKKwljb25zdCBjaGFyICpwOworCWNoYXIgbmZsYWcgPSAxOworCWNoYXIgZWZsYWcgPSAwOworCisJLyogV2UgbXVzdCBjaGVjayB0aGF0IHN0ZG91dCBpcyBub3QgY2xvc2VkLiAqLworCWlmIChkdXAyKDEsIDEpICE9IDEpCisJCXJldHVybiAtMTsKKworCXdoaWxlICgxKSB7CisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmICghYXJnKQorCQkJZ290byBuZXdsaW5lX3JldDsKKwkJaWYgKCphcmcgIT0gJy0nKQorCQkJYnJlYWs7CisKKwkJLyogSWYgaXQgYXBwZWFycyB0aGF0IHdlIGFyZSBoYW5kbGluZyBvcHRpb25zLCB0aGVuIG1ha2Ugc3VyZQorCQkgKiB0aGF0IGFsbCBvZiB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYXJlIGFjdHVhbGx5IHZhbGlkLgorCQkgKiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgc2hvdWxkIGp1c3QgYmUgZWNob2VkLgorCQkgKi8KKwkJcCA9IGFyZyArIDE7CisJCWlmICghKnApCS8qIEEgc2luZ2xlICctJywgc28gZWNobyBpdC4gKi8KKwkJCWdvdG8ganVzdF9lY2hvOworCisJCWRvIHsKKwkJCWlmICghc3RycmNocigibmVFIiwgKnApKQorCQkJCWdvdG8ganVzdF9lY2hvOworCQl9IHdoaWxlICgqKytwKTsKKworCQkvKiBBbGwgb2YgdGhlIG9wdGlvbnMgaW4gdGhpcyBhcmcgYXJlIHZhbGlkLCBzbyBoYW5kbGUgdGhlbS4gKi8KKwkJcCA9IGFyZyArIDE7CisJCWRvIHsKKwkJCWlmICgqcCA9PSAnbicpCisJCQkJbmZsYWcgPSAwOworCQkJaWYgKCpwID09ICdlJykKKwkJCQllZmxhZyA9ICdcXCc7CisJCX0gd2hpbGUgKCorK3ApOworCX0KKyBqdXN0X2VjaG86CisJd2hpbGUgKDEpIHsKKwkJLyogYXJnIGlzIGFscmVhZHkgPT0gKmFyZ3YgYW5kIGlzbid0IE5VTEwgKi8KKwkJaW50IGM7CisKKwkJaWYgKCFlZmxhZykgeworCQkJLyogb3B0aW1pemF0aW9uIGZvciB2ZXJ5IGNvbW1vbiBjYXNlICovCisJCQlmcHV0cyhhcmcsIHN0ZG91dCk7CisJCX0gZWxzZSB3aGlsZSAoKGMgPSAqYXJnKyspKSB7CisJCQlpZiAoYyA9PSBlZmxhZykgewkvKiBDaGVjayBmb3IgZXNjYXBlIHNlcS4gKi8KKwkJCQlpZiAoKmFyZyA9PSAnYycpIHsKKwkJCQkJLyogJ1xjJyBtZWFucyBjYW5jZWwgbmV3bGluZSBhbmQKKwkJCQkJICogaWdub3JlIGFsbCBzdWJzZXF1ZW50IGNoYXJzLiAqLworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQkJeworCQkJCQkvKiBTaW5jZSBTVVN2MyBtYW5kYXRlcyBhIGZpcnN0IGRpZ2l0IG9mIDAsIDQtZGlnaXQgb2N0YWxzCisJCQkJCSogb2YgdGhlIGZvcm0gXDAjIyMgYXJlIGFjY2VwdGVkLiAqLworCQkJCQlpZiAoKmFyZyA9PSAnMCcpIHsKKwkJCQkJCS8qIE5COiBkb24ndCB0dXJuICIuLi5cMCIgaW50byAiLi4uXCIgKi8KKwkJCQkJCWlmIChhcmdbMV0gJiYgKCh1bnNpZ25lZCBjaGFyKShhcmdbMV0pIC0gJzAnKSA8IDgpIHsKKwkJCQkJCQlhcmcrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKiBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSBoYW5kbGVzIE5VTCBjb3JyZWN0bHkKKwkJCQkJICogKCIuLi5cIiBjYXNlLiAqLworCQkJCQljID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoJmFyZyk7CisJCQkJfQorCQkJfQorCQkJcHV0Y2hhcihjKTsKKwkJfQorCisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmICghYXJnKQorCQkJYnJlYWs7CisJCXB1dGNoYXIoJyAnKTsKKwl9CisKKyBuZXdsaW5lX3JldDoKKwlpZiAobmZsYWcpIHsKKwkJcHV0Y2hhcignXG4nKTsKKwl9CisgcmV0OgorCXJldHVybiBmZmx1c2goTlVMTCk7Cit9CisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gPEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICogICAgICAgICAgICAgIGZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2U+CisgKgorICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogICAgICBAKCMpZWNoby5jICAgICAgOC4xIChCZXJrZWxleSkgNS8zMS85MworICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2ZpbmRfYmFkX2NvbW1vbl9idWZzaXogYi9zY3JpcHRzL2ZpbmRfYmFkX2NvbW1vbl9idWZzaXoKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTgwY2Y2MgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZmluZF9iYWRfY29tbW9uX2J1ZnNpegpAQCAtMCwwICsxLDEzIEBACisjIS9iaW4vc2gKKworIyBUaGlzIHNjcmlwdCBmaW5kcyBhcHBsZXRzIHdpdGggbXVsdGlwbGUgdXNlcyBvZiBiYl9jb21tb25fYnVmc2l6MQorIyAoPT0gcG9zc2libGUgYnVncykuCisjIEN1cnJlbnRseSAoMjAwNy0wNi0wNCkgcmVwb3J0cyAzIGZhbHNlIHBvc2l0aXZlczoKKyMgLi9jb3JldXRpbHMvZGlmZi5jOjcKKyMgLi9sb2dpbnV0aWxzL2dldHR5LmM6MgorIyAuL3V0aWwtbGludXgvbW91bnQuYzo1CisKK2ZpbmQgLW5hbWUgJyouYycgXAorfCB3aGlsZSByZWFkIG5hbWU7IGRvCisgICAgZ3JlcCAtSGMgYmJfY29tbW9uX2J1ZnNpejEgIiRuYW1lIgorZG9uZSB8IGdyZXAgLXYgJzpbMDFdJCcKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZmluZF9zdHJheV9jb21tb25fdmFycyBiL3NjcmlwdHMvZmluZF9zdHJheV9jb21tb25fdmFycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTI1ZDdhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9maW5kX3N0cmF5X2NvbW1vbl92YXJzCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9zaAorCisjIENvbW1vbiB2YXJpYWJsZXMgYXJlIGVsdXNpdmUsIHRoZXkgZG9uJ3Qgc2hvdyB1cCBpbiBzaXplIG91dHB1dCEKKyMgVGhpcyBzY3JpcHQgd2lsbCBzaG93IGFsbCBjb21tb25zIGluICoubywgc29ydGVkIGJ5IHNpemUKKworZmluZCAhIC1wYXRoICcuL3NjcmlwdHMvKicgLWEgISAtbmFtZSBidWlsdC1pbi5vIC1hIC1uYW1lICcqLm8nIFwKK3wgd2hpbGUgcmVhZCBuYW1lOyBkbworICAgIGI9YGJhc2VuYW1lICIkbmFtZSJgCisgICAgbm0gIiRuYW1lIiB8IHNlZCAicy9eLyRiOiAvIgorZG9uZSB8IGdyZXAgLWkgJyBjICcgfCBzb3J0IC1rMgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9maW5kX3N0cmF5X2VtcHR5X2xpbmVzIGIvc2NyaXB0cy9maW5kX3N0cmF5X2VtcHR5X2xpbmVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhZTE4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2ZpbmRfc3RyYXlfZW1wdHlfbGluZXMKQEAgLTAsMCArMSwxOSBAQAorIyEvYmluL3NoCisKK2dyZXAgLW4gLUIxIC1yICQnXlx0Kn0kJyAuIHwgZ3JlcCAtQTEgJy5bY2hdLVswLTldKi0kJworZ3JlcCAtbiAtQTEgLXIgJCdeXHQqeyQnIC4gfCBncmVwIC1CMSAnLltjaF0tWzAtOV0qLSQnCisjIG9yIChsZXNzIHN1cmVmaXJlIG9uZXMpOgorZ3JlcCAtbiAtQjEgLXIgJCdeXHQqfScgLiB8IGdyZXAgLUExICcuW2NoXS1bMC05XSotJCcKK2dyZXAgLW4gLUExIC1yICQnXlx0KnsnIC4gfCBncmVwIC1CMSAnLltjaF0tWzAtOV0qLSQnCisKKyMgZmluZCB0cmFpbGluZyBlbXB0eSBsaW5lcworZmluZCAtdHlwZSBmIHwgd2hpbGUgcmVhZCBmaWxlOyBkbworICAgICAgICB0ZXN0IHgiJGZpbGUiID0geCIiICYmIGNvbnRpbnVlCisgICAgICAgIHRhaWwgLW4xICRmaWxlIHwgd2hpbGUgcmVhZCBsYXN0bGluZQorICAgICAgICBkbworICAgICAgICAgICNlY2hvICJ8JGZpbGV8JGxhc3RsaW5lIgorICAgICAgICAgIGlmIHRlc3QgeCIkbGFzdGxpbmUiID0geCIiOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiJGZpbGUiCisgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorZG9uZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9maXhfd3Muc2ggYi9zY3JpcHRzL2ZpeF93cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lN2NmNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9maXhfd3Muc2gKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL2Jhc2gKKyMgV2hpdGVzcGFjZSBmaXhlcgorIyBVc2FnZTogZml4X3dzIFtkaXJdLi4uCisKK3RlbXA9Ii90bXAvZml4X3dzLiQkLiRSQU5ET00iCisKKyMgVXNpbmcgJCd4eHgnIGJhc2hpc20KK2JlZ2luOHNwX3RhYj0kJ3MvXiAgICAgICAgL1x0LycKK2JlZ2luY2hhcjdzcF9jaGFydGFiPSQncy9eXFwoW14gXHRdXFwpICAgICAgIC9cXDFcdC8nCit0YWI4c3BfdGFidGFiPSQncy9cdCAgICAgICAgL1x0XHQvZycKK3RhYjhzcHRhYl90YWJ0YWJ0YWI9JCdzL1x0ICAgICAgICBcdC9cdFx0XHQvZycKK2JlZ2luMTdzcHRhYl90YWI9JCdzL14gXFx7MSw3XFx9XHQvXHQvJwordGFiMTdzcHRhYl90YWJ0YWI9JCdzL1x0IFxcezEsN1xcfVx0L1x0XHQvZycKK3RyYWlsaW5nd3NfPSQncy9bIFx0XSokLy8nCisKKyM+Zml4X3dzLmRpZmYKKworZmluZCAiJEAiIC10eXBlIGYgXAorfCB3aGlsZSByZWFkIG5hbWU7IGRvCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5iejIvWUVTfSIgJiYgY29udGludWUKKyAgICB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLmd6L1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5wbmcvWUVTfSIgJiYgY29udGludWUKKyAgICB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLmdpZi9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyouanBnL1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5kaWZmL1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5wYXRjaC9ZRVN9IiAmJiBjb250aW51ZQorICAgICMgc2hlbGwgdGVzdHN1aXRlIGVudHJpZXMgYXJlIG5vdCB0byBiZSB0b3VjaGVkIHRvbworICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyoucmlnaHQvWUVTfSIgJiYgY29udGludWUKKworICAgIGlmIHRlc3QgIllFUyIgPSAiJHtuYW1lLyouW2Noc1NdL1lFU30iIFwKKwktbyAiWUVTIiA9ICIke25hbWUvKi5zaC9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyoudHh0L1lFU30iIFwKKwktbyAiWUVTIiA9ICIke25hbWUvKi5odG1sL1lFU30iIFwKKwktbyAiWUVTIiA9ICIke25hbWUvKi5odG0vWUVTfSIgXAorCS1vICJZRVMiID0gIiR7bmFtZS8qQ29uZmlnLmluKi9ZRVN9IiBcCisgICAgOyB0aGVuCisgICAgIyBNb3JlIGFnZ3Jlc3NpdmUgd2hpdGVzcGFjZSBmaXhlcyBmb3Iga25vd24gZmlsZSB0eXBlcworCWVjaG8gIkZvcm1hdHRpbmc6ICRuYW1lIiA+JjIKKwljYXQgIiRuYW1lIiBcCisJfCBzZWQgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIFwKKwkgICAgICAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgXAorCXwgc2VkICIkYmVnaW4xN3NwdGFiX3RhYiIgXAorCXwgc2VkIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIFwKKwkgICAgICAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiBcCisJICAgICAgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgXAorCXwgc2VkICIkdHJhaWxpbmd3c18iCisgICAgZWxpZiB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qTWFrZWZpbGUqL1lFU30iIFwKKwktbyAiWUVTIiA9ICIke25hbWUvKktidWlsZCovWUVTfSIgXAorICAgIDsgdGhlbgorICAgICMgRm9yIE1ha2VmaWxlcywgbmV2ZXIgY29udmVydCAiMS03c3BhY2VzK3RhYiIgaW50byAidGFidGFiIgorCWVjaG8gIk1ha2VmaWxlOiAkbmFtZSIgPiYyCisJY2F0ICIkbmFtZSIgXAorCXwgc2VkIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiBcCisJICAgICAgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIFwKKwl8IHNlZCAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiBcCisJICAgICAgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIFwKKwl8IHNlZCAiJHRyYWlsaW5nd3NfIgorICAgIGVsc2UKKyAgICAjIE9ubHkgcmVtb3ZlIHRyYWlsaW5nIFdTIGZvciB0aGUgcmVzdAorCWVjaG8gIlJlbW92aW5nIHRyYWlsaW5nIHdoaXRlc3BhY2U6ICRuYW1lIiA+JjIKKwljYXQgIiRuYW1lIiBcCisJfCBzZWQgIiR0cmFpbGluZ3dzXyIKKyAgICBmaSA+IiR0ZW1wIgorCisjICAgIGRpZmYgLXUgIiR0ZW1wIiAiJG5hbWUiID4+Zml4X3dzLmRpZmYKKworICAgICMgQ29uc2VydmUgbW9kZS9zeW1saW5rOgorICAgIGNhdCAiJHRlbXAiID4iJG5hbWUiCitkb25lCitybSAiJHRlbXAiIDI+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9zY3JpcHRzL2djYy12ZXJzaW9uLnNoIGIvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDUxMDgwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKyMKKyMgZ2NjLXZlcnNpb24gZ2NjLWNvbW1hbmQKKyMKKyMgUHJpbnRzIHRoZSBnY2MgdmVyc2lvbiBvZiBgZ2NjLWNvbW1hbmQnIGluIGEgY2Fub25pY2FsIDQtZGlnaXQgZm9ybQorIyBzdWNoIGFzIGAwMjk1JyBmb3IgZ2NjLTIuOTUsIGAwMzAzJyBmb3IgZ2NjLTMuMywgZXRjLgorIworCitjb21waWxlcj0iJCoiCisKK01BSl9NSU49JChlY2hvIF9fR05VQ19fIF9fR05VQ19NSU5PUl9fIHwgJGNvbXBpbGVyIC1FIC14YyAtIHwgdGFpbCAtbiAxKQorcHJpbnRmICclMDJkJTAyZFxuJyAkTUFKX01JTgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5fYnVpbGRfZmlsZXMuc2ggYi9zY3JpcHRzL2dlbl9idWlsZF9maWxlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNTE4YTkwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5fYnVpbGRfZmlsZXMuc2gKQEAgLTAsMCArMSw5OSBAQAorIyEvYmluL3NoCisKKyMgTm90ZTogd2FzIHVzaW5nIHNlZCBPUFRTIENNRCAtLSBGSUxFUworIyBidXQgdXNlcnMgY29tcGxhaW4gdGhhdCBtYW55IHNlZCBpbXBsZW1lbnRhdGlvbnMKKyMgYXJlIG1pc2ludGVycHJldGluZyAtLS4KKwordGVzdCAkIyAtZ2UgMiB8fCB7IGVjaG8gIlN5bnRheDogJDAgU1JDVFJFRSBPQkpUUkVFIjsgZXhpdCAxOyB9CisKKyMgY2QgdG8gb2JqdHJlZQorY2QgLS0gIiQyIiB8fCB7IGVjaG8gIlN5bnRheDogJDAgU1JDVFJFRSBPQkpUUkVFIjsgZXhpdCAxOyB9CisjIEluIHNlcGFyYXRlIG9ianRyZWUgYnVpbGQsIGluY2x1ZGUvIG1pZ2h0IG5vdCBleGlzdCB5ZXQKK21rZGlyIGluY2x1ZGUgMj4vZGV2L251bGwKKworc3JjdHJlZT0iJDEiCisKK3N0YXR1cygpIHsgcHJpbnRmICcgICUtOHMlc1xuJyAiJDEiICIkMiI7IH0KK2dlbigpIHsgc3RhdHVzICJHRU4iICIkQCI7IH0KK2NoaygpIHsgc3RhdHVzICJDSEsiICIkQCI7IH0KKworZ2VuZXJhdGUoKQoreworCWxvY2FsIHNyYz0iJDEiIGRzdD0iJDIiIGhlYWRlcj0iJDMiIGluc2VydD0iJDQiCisJI2NoayAiJHtkc3R9IgorCSgKKwkJIyBOZWVkIHRvIHVzZSBwcmludGY6IGRpZmZlcmVudCBzaGVsbHMgaGF2ZSBpbmNvbnNpc3RlbnQKKwkJIyBydWxlcyByZSBoYW5kbGluZyBvZiAiXG4iIGluIGVjaG8gcGFyYW1zLAorCQkjIGFuZCAke2luc2VydH0gZGVmaW5pdGVseSBjb250YWlucyAiXG4iLgorCQkjIFRoZXJlZm9yZSwgZWNobyAiJHtoZWFkZXJ9IiB3b3VsZCBub3Qgd29yazoKKwkJcHJpbnRmICIlc1xuIiAiJHtoZWFkZXJ9IgorCQlpZiBncmVwIC1xcyAnXklOU0VSVCQnICIke3NyY30iOyB0aGVuCisJCQlzZWQgLW4gJzEsL15JTlNFUlQkL3AnICIke3NyY30iCisJCQlwcmludGYgIiVzXG4iICIke2luc2VydH0iCisJCQlzZWQgLW4gJy9eSU5TRVJUJC8sJHAnICIke3NyY30iCisJCWVsc2UKKwkJCWlmIFsgLW4gIiR7aW5zZXJ0fSIgXTsgdGhlbgorCQkJCXByaW50ZiAiJXNcbiIgIkVSUk9SOiBJTlNFUlQgbGluZSBtaXNzaW5nIGluOiAke3NyY30iIDE+JjIKKwkJCWZpCisJCQljYXQgIiR7c3JjfSIKKwkJZmkKKwkpIHwgc2VkICcvXklOU0VSVCQvZCcgPiAiJHtkc3R9LnRtcCIKKwlpZiAhIGNtcCAtcyAiJHtkc3R9IiAiJHtkc3R9LnRtcCI7IHRoZW4KKwkJZ2VuICIke2RzdH0iCisJCW12ICIke2RzdH0udG1wIiAiJHtkc3R9IgorCWVsc2UKKwkJcm0gLWYgIiR7ZHN0fS50bXAiCisJZmkKK30KKworIyAoUmUpZ2VuZXJhdGUgaW5jbHVkZS9hcHBsZXRzLmgKK3M9YHNlZCAtbiAnc0BeLy9hcHBsZXQ6QEBwJyAiJHNyY3RyZWUiLyovKi5jICIkc3JjdHJlZSIvKi8qLyouY2AKK2dlbmVyYXRlIFwKKwkiJHNyY3RyZWUvaW5jbHVkZS9hcHBsZXRzLnNyYy5oIiBcCisJImluY2x1ZGUvYXBwbGV0cy5oIiBcCisJIi8qIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYXBwbGV0cy5zcmMuaCAqLyIgXAorCSIke3N9IgorCisjIChSZSlnZW5lcmF0ZSBpbmNsdWRlL3VzYWdlLmgKKyMgV2UgYWRkIGxpbmUgY29udGludWF0aW9uIGJhY2tzbGFzaCBhZnRlciBlYWNoIGxpbmUsCisjIGFuZCBpbnNlcnQgZW1wdHkgbGluZSBiZWZvcmUgZWFjaCBsaW5lIHdoaWNoIGRvZXNuJ3Qgc3RhcnQKKyMgd2l0aCBzcGFjZSBvciB0YWIKKyMgKG5vdGU6IHdlIG5lZWQgdG8gdXNlIFxcXFwgYmVjYXVzZSBvZiBgYCkKK3M9YHNlZCAtbiAtZSAnc0BeLy91c2FnZTpcKFsgXHRdLipcKSRAXDEgXFxcXEBwJyAtZSAnc0BeLy91c2FnZTpcKFteIFx0XS4qXCkkQFxuXDEgXFxcXEBwJyAiJHNyY3RyZWUiLyovKi5jICIkc3JjdHJlZSIvKi8qLyouY2AKK2dlbmVyYXRlIFwKKwkiJHNyY3RyZWUvaW5jbHVkZS91c2FnZS5zcmMuaCIgXAorCSJpbmNsdWRlL3VzYWdlLmgiIFwKKwkiLyogRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSB1c2FnZS5zcmMuaCAqLyIgXAorCSIke3N9IgorCisjIChSZSlnZW5lcmF0ZSAqL0tidWlsZCBhbmQgKi9Db25maWcuaW4KK3sgY2QgLS0gIiRzcmN0cmVlIiAmJiBmaW5kIC4gLXR5cGUgZDsgfSB8IHdoaWxlIHJlYWQgLXIgZDsgZG8KKwlkPSIke2QjLi99IgorCisJc3JjPSIkc3JjdHJlZS8kZC9LYnVpbGQuc3JjIgorCWRzdD0iJGQvS2J1aWxkIgorCWlmIHRlc3QgLWYgIiRzcmMiOyB0aGVuCisJCW1rZGlyIC1wIC0tICIkZCIgMj4vZGV2L251bGwKKworCQlzPWBzZWQgLW4gJ3NAXi8va2J1aWxkOkBAcCcgIiRzcmN0cmVlLyRkIi8qLmNgCisJCWdlbmVyYXRlIFwKKwkJCSIke3NyY30iICIke2RzdH0iIFwKKwkJCSIjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gS2J1aWxkLnNyYyIgXAorCQkJIiR7c30iCisJZmkKKworCXNyYz0iJHNyY3RyZWUvJGQvQ29uZmlnLnNyYyIKKwlkc3Q9IiRkL0NvbmZpZy5pbiIKKwlpZiB0ZXN0IC1mICIkc3JjIjsgdGhlbgorCQlta2RpciAtcCAtLSAiJGQiIDI+L2Rldi9udWxsCisKKwkJcz1gc2VkIC1uICdzQF4vL2NvbmZpZzpAQHAnICIkc3JjdHJlZS8kZCIvKi5jYAorCQlnZW5lcmF0ZSBcCisJCQkiJHtzcmN9IiAiJHtkc3R9IiBcCisJCQkiIyBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIENvbmZpZy5zcmMiIFwKKwkJCSIke3N9IgorCWZpCitkb25lCisKKyMgTGFzdCByZWFkIGZhaWxlZC4gVGhpcyBpcyBub3JtYWwuIERvbid0IGV4aXQgd2l0aCBpdHMgZXJyb3IgY29kZToKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTEzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTAsMCArMSwyNzEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEtlcm5lbCBjb25maWd1cmF0aW9uIHRhcmdldHMKKyMgVGhlc2UgdGFyZ2V0cyBhcmUgdXNlZCBmcm9tIHRvcC1sZXZlbCBtYWtlZmlsZQorCitQSE9OWSArPSBvbGRjb25maWcgeGNvbmZpZyBnY29uZmlnIG1lbnVjb25maWcgY29uZmlnIHNpbGVudG9sZGNvbmZpZyB1cGRhdGUtcG8tY29uZmlnCisKK3hjb25maWc6ICQob2JqKS9xY29uZgorCSQ8IENvbmZpZy5pbgorCitnY29uZmlnOiAkKG9iaikvZ2NvbmYKKwkkPCBDb25maWcuaW4KKworbWVudWNvbmZpZzogJChvYmopL21jb25mCisJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nCisJJDwgQ29uZmlnLmluCisKK2NvbmZpZzogJChvYmopL2NvbmYKKwkkPCBDb25maWcuaW4KKworIyBNdGltZSBncmFudWxhcml0eSBwcm9ibGVtLgorIyBJdCB3YXMgb2JzZXJ2ZWQgdGhhdCB0aGVzZSBjb21tYW5kczoKKyMgbWFrZSBhbGxub2NvbmZpZzsgc2VkIC1pIC1lICcvQ09ORklHX1RSVUUvcy8uKi9DT05GSUdfVFJVRT15LycgLmNvbmZpZzsgbWFrZQorIyBzb21ldGltZXMgcHJvZHVjZSBidXN5Ym94IHdpdGggInRydWUiIGFwcGxldCBzdGlsbCBkaXNhYmxlZC4KKyMgVGhpcyBpcyBjYXVzZWQgYnkgLmNvbmZpZyB1cGRhdGVkIGJ5IHNlZCBoYXZpbmcgbXRpbWUgd2hpY2ggaXMgc3RpbGwKKyMgZXF1YWwgdG8gKG5vdCBiaWdnZXIgdGhhbikgaW5jbHVkZS9hdXRvY29uZi5oJ3MgbXRpbWUsCisjIGFuZCB0aHVzIDJuZCBtYWtlIGRvZXMgbm90IHJlZ2VuZXJhdGUgaW5jbHVkZS9hdXRvY29uZi5oLgorIyBXYWl0aW5nIGZvciAxIHNlY29uZCBhZnRlciBub24taW50ZXJhY3RpdmUgIm1ha2UgWFhYWGNvbmZpZyIKKyMgcHJldmVudHMgdGhpcyBmcm9tIGhhcHBlbmluZy4KKyMKKyMgV2UnZCBsaWtlIHRvIGRldGVjdCB3aGV0aGVyIGZpbGVzeXN0ZW0gd2UgYXJlIG9uIGhhcyBjb2Fyc2UgbXRpbWVzLAorIyBidXQgY2FuJ3QgZG8gaXQgeWV0LCBiYm94IGxzIGhhc24ndCBnb3QgLS1mdWxsLXRpbWUuCisjTVRJTUVfSVNfQ09BUlNFOj1AbHMgLS1mdWxsLXRpbWUgLWxkIHwgZ3JlcCAtRiAuMDAwID4vZGV2L251bGwKK01USU1FX0lTX0NPQVJTRTo9QHRydWUKKworb2xkY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1vIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKK3NpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtcyBDb25maWcuaW4KKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCit1cGRhdGUtcG8tY29uZmlnOiAkKG9iaikva3hnZXR0ZXh0CisJeGdldHRleHQgLS1kZWZhdWx0LWRvbWFpbj1saW51eCBcCisgICAgICAgICAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKKyAgICAgICAgICAtLWZpbGVzLWZyb209c2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluIFwKKyAgICAgICAgICAtLW91dHB1dCBzY3JpcHRzL2tjb25maWcvY29uZmlnLnBvdAorCSQoUSlsbiAtZnMgS2NvbmZpZ19pMzg2IGFyY2gvdW0vS2NvbmZpZ19hcmNoCisJJChRKWZvciBpIGluIGBscyBhcmNoL2A7IFwKKwlkbyBcCisJICBzY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0IGFyY2gvJCRpL0tjb25maWcgXAorCSAgICB8IG1zZ3VuaXEgLW8gc2NyaXB0cy9rY29uZmlnL2xpbnV4XyQke2l9LnBvdDsgXAorCWRvbmUKKwkkKFEpbXNnY2F0IHNjcmlwdHMva2NvbmZpZy9jb25maWcucG90IFwKKwkgIGBmaW5kIHNjcmlwdHMva2NvbmZpZy8gLXR5cGUgZiAtbmFtZSBsaW51eF8qLnBvdGAgXAorCSAgLS1vdXRwdXQgc2NyaXB0cy9rY29uZmlnL2xpbnV4X3Jhdy5wb3QKKwkkKFEpbXNndW5pcSAtLXNvcnQtYnktZmlsZSBzY3JpcHRzL2tjb25maWcvbGludXhfcmF3LnBvdCBcCisJICAgIC0tb3V0cHV0IHNjcmlwdHMva2NvbmZpZy9saW51eC5wb3QKKwkkKFEpcm0gLWYgYXJjaC91bS9LY29uZmlnX2FyY2gKKwkkKFEpcm0gLWYgc2NyaXB0cy9rY29uZmlnL2xpbnV4XyoucG90IHNjcmlwdHMva2NvbmZpZy9jb25maWcucG90CisKK1BIT05ZICs9IHJhbmRjb25maWcgYWxseWVzY29uZmlnIGFsbG5vY29uZmlnIGFsbG1vZGNvbmZpZyBkZWZjb25maWcKKworcmFuZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtciBDb25maWcuaW4KKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCithbGx5ZXNjb25maWc6ICQob2JqKS9jb25mCisJJDwgLXkgQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKworYWxsbm9jb25maWc6ICQob2JqKS9jb25mCisJJDwgLW4gQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKworYWxsbW9kY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1tIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKK2RlZmNvbmZpZzogJChvYmopL2NvbmYKK2lmZXEgKCQoS0JVSUxEX0RFRkNPTkZJRyksKQorCSQ8IC1kIENvbmZpZy5pbgorZWxzZQorCUBlY2hvICoqKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24gJyQoS0JVSUxEX0RFRkNPTkZJRyknCisJJChRKSQ8IC1EICQoS0JVSUxEX0RFRkNPTkZJRykgQ29uZmlnLmluCitlbmRpZgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKKyVfZGVmY29uZmlnOiAkKG9iaikvY29uZgorCSQoUSkkPCAtRCBjb25maWdzLyRAIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKKyMgSGVscCB0ZXh0IHVzZWQgYnkgbWFrZSBoZWxwCitoZWxwOgorCUBlY2hvICAnICBjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBsaW5lLW9yaWVudGVkIHByb2dyYW0nCisJQGVjaG8gICcgIG1lbnVjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBtZW51IGJhc2VkIHByb2dyYW0nCisJQGVjaG8gICcgIHhjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBRVCBiYXNlZCBmcm9udC1lbmQnCisJQGVjaG8gICcgIGdjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBHVEsgYmFzZWQgZnJvbnQtZW5kJworCUBlY2hvICAnICBvbGRjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBwcm92aWRlZCAuY29uZmlnIGFzIGJhc2UnCisJQGVjaG8gICcgIHJhbmRjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCByYW5kb20gYW5zd2VyIHRvIGFsbCBvcHRpb25zJworCUBlY2hvICAnICBkZWZjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCBkZWZhdWx0IGFuc3dlciB0byBhbGwgb3B0aW9ucycKKwlAZWNobyAgJyAgYWxsbW9kY29uZmlnCSAgLSBOZXcgY29uZmlnIHNlbGVjdGluZyBtb2R1bGVzIHdoZW4gcG9zc2libGUnCisJQGVjaG8gICcgIGFsbHllc2NvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYWNjZXB0ZWQgd2l0aCB5ZXMnCisJQGVjaG8gICcgIGFsbG5vY29uZmlnCSAgLSBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG5vJworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBTaGFyZWQgTWFrZWZpbGUgZm9yIHRoZSB2YXJpb3VzIGtjb25maWcgZXhlY3V0YWJsZXM6CisjIGNvbmY6CSAgVXNlZCBmb3IgZGVmY29uZmlnLCBvbGRjb25maWcgYW5kIHJlbGF0ZWQgdGFyZ2V0cworIyBtY29uZjogIFVzZWQgZm9yIHRoZSBtY29uZmlnIHRhcmdldC4KKyMgICAgICAgICBVdGlsaXplcyB0aGUgbHhkaWFsb2cgcGFja2FnZQorIyBxY29uZjogIFVzZWQgZm9yIHRoZSB4Y29uZmlnIHRhcmdldAorIyAgICAgICAgIEJhc2VkIG9uIFFUIHdoaWNoIG5lZWRzIHRvIGJlIGluc3RhbGxlZCB0byBjb21waWxlIGl0CisjIGdjb25mOiAgVXNlZCBmb3IgdGhlIGdjb25maWcgdGFyZ2V0CisjICAgICAgICAgQmFzZWQgb24gR1RLIHdoaWNoIG5lZWRzIHRvIGJlIGluc3RhbGxlZCB0byBjb21waWxlIGl0CisjIG9iamVjdCBmaWxlcyB1c2VkIGJ5IGFsbCBrY29uZmlnIGZsYXZvdXJzCisKK2hvc3Rwcm9ncy15CTo9IGNvbmYgbWNvbmYgcWNvbmYgZ2NvbmYga3hnZXR0ZXh0Citjb25mLW9ianMJOj0gY29uZi5vICB6Y29uZi50YWIubworbWNvbmYtb2Jqcwk6PSBtY29uZi5vIHpjb25mLnRhYi5vCitreGdldHRleHQtb2Jqcwk6PSBreGdldHRleHQubyB6Y29uZi50YWIubworCitpZmVxICgkKE1BS0VDTURHT0FMUykseGNvbmZpZykKKwlxY29uZi10YXJnZXQgOj0gMQorZW5kaWYKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxnY29uZmlnKQorCWdjb25mLXRhcmdldCA6PSAxCitlbmRpZgorCisKK2lmZXEgKCQocWNvbmYtdGFyZ2V0KSwxKQorcWNvbmYtY3h4b2Jqcwk6PSBxY29uZi5vCitxY29uZi1vYmpzCTo9IGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitlbmRpZgorCitpZmVxICgkKGdjb25mLXRhcmdldCksMSkKK2djb25mLW9ianMJOj0gZ2NvbmYubyBrY29uZmlnX2xvYWQubyB6Y29uZi50YWIubworZW5kaWYKKworY2xlYW4tZmlsZXMJOj0gbGtjX2RlZnMuaCBxY29uZi5tb2MgLnRtcF9xdGNoZWNrIFwKKwkJICAgLnRtcF9ndGtjaGVjayB6Y29uZi50YWIuYyBsZXguemNvbmYuYyB6Y29uZi5oYXNoLmMKK3N1YmRpci0gKz0gbHhkaWFsb2cKKworIyBBZGQgZW52aXJvbm1lbnQgc3BlY2lmaWMgZmxhZ3MKK0hPU1RfRVhUUkFDRkxBR1MgKz0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS8kKHNyYykvY2hlY2suc2ggJChIT1NUQ0MpICQoSE9TVENGTEFHUykpCisKKyMgZ2VuZXJhdGVkIGZpbGVzIHNlZW0gdG8gbmVlZCB0aGlzIHRvIGZpbmQgbG9jYWwgaW5jbHVkZSBmaWxlcworSE9TVENGTEFHU19sZXguemNvbmYubwk6PSAtSSQoc3JjKQorSE9TVENGTEFHU196Y29uZi50YWIubwk6PSAtSSQoc3JjKQorCitIT1NUTE9BRExJQkVTX3Fjb25mCT0gJChLQ19RVF9MSUJTKSAtbGRsCitIT1NUQ1hYRkxBR1NfcWNvbmYubwk9ICQoS0NfUVRfQ0ZMQUdTKSAtRCBMS0NfRElSRUNUX0xJTksKKworSE9TVExPQURMSUJFU19nY29uZgk9IGBwa2ctY29uZmlnIC0tbGlicyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgCitIT1NUQ0ZMQUdTX2djb25mLm8JPSBgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUQgTEtDX0RJUkVDVF9MSU5LCisKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvLnRtcF9xdGNoZWNrCisKK2lmZXEgKCQocWNvbmYtdGFyZ2V0KSwxKQorJChvYmopLy50bXBfcXRjaGVjazogJChzcmMpL01ha2VmaWxlCistaW5jbHVkZSAkKG9iaikvLnRtcF9xdGNoZWNrCisKKyMgUVQgbmVlZHMgc29tZSBleHRyYSBlZmZvcnQuLi4KKyQob2JqKS8udG1wX3F0Y2hlY2s6CisJQHNldCAtZTsgZWNobyAiICBDSEVDSyAgIHF0IjsgZGlyPSIiOyBwa2c9IiI7IFwKKwlwa2ctY29uZmlnIC0tZXhpc3RzIHF0IDI+IC9kZXYvbnVsbCAmJiBwa2c9cXQ7IFwKKwlwa2ctY29uZmlnIC0tZXhpc3RzIHF0LW10IDI+IC9kZXYvbnVsbCAmJiBwa2c9cXQtbXQ7IFwKKwlpZiBbIC1uICIkJHBrZyIgXTsgdGhlbiBcCisJICBjZmxhZ3M9IlwkJChzaGVsbCBwa2ctY29uZmlnICQkcGtnIC0tY2ZsYWdzKSI7IFwKKwkgIGxpYnM9IlwkJChzaGVsbCBwa2ctY29uZmlnICQkcGtnIC0tbGlicykiOyBcCisJICBtb2M9IlwkJChzaGVsbCBwa2ctY29uZmlnICQkcGtnIC0tdmFyaWFibGU9cHJlZml4KS9iaW4vbW9jIjsgXAorCSAgZGlyPSIkJChwa2ctY29uZmlnICQkcGtnIC0tdmFyaWFibGU9cHJlZml4KSI7IFwKKwllbHNlIFwKKwkgIGZvciBkIGluICQkUVRESVIgL3Vzci9zaGFyZS9xdCogL3Vzci9saWIvcXQqOyBkbyBcCisJICAgIGlmIFsgLWYgJCRkL2luY2x1ZGUvcWNvbmZpZy5oIF07IHRoZW4gZGlyPSQkZDsgYnJlYWs7IGZpOyBcCisJICBkb25lOyBcCisJICBpZiBbIC16ICIkJGRpciIgXTsgdGhlbiBcCisJICAgIGVjaG8gIioiOyBcCisJICAgIGVjaG8gIiogVW5hYmxlIHRvIGZpbmQgdGhlIFFUIGluc3RhbGxhdGlvbi4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IjsgXAorCSAgICBlY2hvICIqIHRoZSBRVCBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQgYW5kIjsgXAorCSAgICBlY2hvICIqIGVpdGhlciBpbnN0YWxsIHBrZy1jb25maWcgb3Igc2V0IHRoZSBRVERJUiBlbnZpcm9ubWVudCI7IFwKKwkgICAgZWNobyAiKiB2YXJpYWJsZSB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4iOyBcCisJICAgIGVjaG8gIioiOyBcCisJICAgIGZhbHNlOyBcCisJICBmaTsgXAorCSAgbGlicGF0aD0kJGRpci9saWI7IGxpYj1xdDsgb3NkaXI9IiI7IFwKKwkgICQoSE9TVENYWCkgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSA+IC9kZXYvbnVsbCAyPiYxICYmIFwKKwkgICAgb3NkaXI9eCQkKCQoSE9TVENYWCkgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSk7IFwKKwkgIHRlc3QgLWQgJCRsaWJwYXRoLyQkb3NkaXIgJiYgbGlicGF0aD0kJGxpYnBhdGgvJCRvc2RpcjsgXAorCSAgdGVzdCAtZiAkJGxpYnBhdGgvbGlicXQtbXQuc28gJiYgbGliPXF0LW10OyBcCisJICBjZmxhZ3M9Ii1JJCRkaXIvaW5jbHVkZSI7IFwKKwkgIGxpYnM9Ii1MJCRsaWJwYXRoIC1XbCwtcnBhdGgsJCRsaWJwYXRoIC1sJCRsaWIiOyBcCisJICBtb2M9IiQkZGlyL2Jpbi9tb2MiOyBcCisJZmk7IFwKKwlpZiBbICEgLXggJCRkaXIvYmluL21vYyAtYSAteCAvdXNyL2Jpbi9tb2MgXTsgdGhlbiBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiKiBVbmFibGUgdG8gZmluZCAkJGRpci9iaW4vbW9jLCB1c2luZyAvdXNyL2Jpbi9tb2MgaW5zdGVhZC4iOyBcCisJICBlY2hvICIqIjsgXAorCSAgbW9jPSIvdXNyL2Jpbi9tb2MiOyBcCisJZmk7IFwKKwllY2hvICJLQ19RVF9DRkxBR1M9JCRjZmxhZ3MiID4gJEA7IFwKKwllY2hvICJLQ19RVF9MSUJTPSQkbGlicyIgPj4gJEA7IFwKKwllY2hvICJLQ19RVF9NT0M9JCRtb2MiID4+ICRACitlbmRpZgorCiskKG9iaikvZ2NvbmYubzogJChvYmopLy50bXBfZ3RrY2hlY2sKKworaWZlcSAoJChnY29uZi10YXJnZXQpLDEpCistaW5jbHVkZSAkKG9iaikvLnRtcF9ndGtjaGVjaworCisjIEdUSyBuZWVkcyBzb21lIGV4dHJhIGVmZm9ydCwgdG9vLi4uCiskKG9iaikvLnRtcF9ndGtjaGVjazoKKwlAaWYgYHBrZy1jb25maWcgLS1leGlzdHMgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wYDsgdGhlbgkJXAorCQlpZiBgcGtnLWNvbmZpZyAtLWF0bGVhc3QtdmVyc2lvbj0yLjAuMCBndGsrLTIuMGA7IHRoZW4JCQlcCisJCQl0b3VjaCAkQDsJCQkJCQkJCVwKKwkJZWxzZQkJCQkJCQkJCVwKKwkJCWVjaG8gIioiOyAJCQkJCQkJXAorCQkJZWNobyAiKiBHVEsrIGlzIHByZXNlbnQgYnV0IHZlcnNpb24gPj0gMi4wLjAgaXMgcmVxdWlyZWQuIjsJXAorCQkJZWNobyAiKiI7CQkJCQkJCVwKKwkJCWZhbHNlOwkJCQkJCQkJXAorCQlmaQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCVwKKwkJZWNobyAiKiI7IAkJCQkJCQkJXAorCQllY2hvICIqIFVuYWJsZSB0byBmaW5kIHRoZSBHVEsrIGluc3RhbGxhdGlvbi4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IjsgCVwKKwkJZWNobyAiKiB0aGUgR1RLKyAyLjAgZGV2ZWxvcG1lbnQgcGFja2FnZSBpcyBjb3JyZWN0bHkgaW5zdGFsbGVkLi4uIjsgCVwKKwkJZWNobyAiKiBZb3UgbmVlZCBndGsrLTIuMCwgZ2xpYi0yLjAgYW5kIGxpYmdsYWRlLTIuMC4iOyAJCVwKKwkJZWNobyAiKiI7IAkJCQkJCQkJXAorCQlmYWxzZTsJCQkJCQkJCQlcCisJZmkKK2VuZGlmCisKKyQob2JqKS96Y29uZi50YWIubzogJChvYmopL2xleC56Y29uZi5jICQob2JqKS96Y29uZi5oYXNoLmMKKworJChvYmopL2tjb25maWdfbG9hZC5vOiAkKG9iaikvbGtjX2RlZnMuaAorCiskKG9iaikvcWNvbmYubzogJChvYmopL3Fjb25mLm1vYyAkKG9iaikvbGtjX2RlZnMuaAorCiskKG9iaikvZ2NvbmYubzogJChvYmopL2xrY19kZWZzLmgKKworJChvYmopLyUubW9jOiAkKHNyYykvJS5oCisJJChLQ19RVF9NT0MpIC1pICQ8IC1vICRACisKKyQob2JqKS9sa2NfZGVmcy5oOiAkKHNyYykvbGtjX3Byb3RvLmgKKwlzZWQgPCAkPCA+ICRAICdzL1AoXChbXixdKlwpLC4qLyNkZWZpbmUgXDEgKFwqXDFfcCkvJworCisKKyMjIworIyBUaGUgZm9sbG93aW5nIHJlcXVpcmVzIGZsZXgvYmlzb24vZ3BlcmYKKyMgQnkgZGVmYXVsdCB3ZSB1c2UgdGhlIF9zaGlwcGVkIHZlcnNpb25zLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIGlmCisjIHlvdSBhcmUgbW9kaWZ5aW5nIHRoZSBmbGV4L2Jpc29uIHNyYy4KKyMgTEtDX0dFTlBBUlNFUiA6PSAxCisKK2lmZGVmIExLQ19HRU5QQVJTRVIKKworJChvYmopL3pjb25mLnRhYi5jOiAkKHNyYykvemNvbmYueQorJChvYmopL2xleC56Y29uZi5jOiAkKHNyYykvemNvbmYubAorJChvYmopL3pjb25mLmhhc2guYzogJChzcmMpL3pjb25mLmdwZXJmCisKKyUudGFiLmM6ICUueQorCWJpc29uIC1sIC1iICQqIC1wICQobm90ZGlyICQqKSAkPAorCWNwICRAICRAX3NoaXBwZWQKKworbGV4LiUuYzogJS5sCisJZmxleCAtTCAtUCQobm90ZGlyICQqKSAtbyRAICQ8CisJY3AgJEAgJEBfc2hpcHBlZAorCislLmhhc2guYzogJS5ncGVyZgorCWdwZXJmIDwgJDwgPiAkQAorCWNwICRAICRAX3NoaXBwZWQKKworZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9QT1RGSUxFUy5pbiBiL3NjcmlwdHMva2NvbmZpZy9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk0ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluCkBAIC0wLDAgKzEsNSBAQAorc2NyaXB0cy9rY29uZmlnL21jb25mLmMKK3NjcmlwdHMva2NvbmZpZy9jb25mLmMKK3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCitzY3JpcHRzL2tjb25maWcvZ2NvbmYuYworc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY2hlY2suc2ggYi9zY3JpcHRzL2tjb25maWcvY2hlY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTVmYzI5NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jaGVjay5zaApAQCAtMCwwICsxLDEzIEBACisjIS9iaW4vc2gKKyMgTmVlZGVkIGZvciBzeXN0ZW1zIHdpdGhvdXQgZ2V0dGV4dAorJCogLXhjIC1vIC9kZXYvbnVsbCAtID4gL2Rldi9udWxsIDI+JjEgPDwgRU9GCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKQoreworCWdldHRleHQoIiIpOworCXJldHVybiAwOworfQorRU9GCitpZiBbICEgIiQ/IiAtZXEgIjAiICBdOyB0aGVuCisJZWNobyAtREtCVUlMRF9OT19OTFM7CitmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNDQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNzAwCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY2hlY2tfY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CisKK2VudW0geworCWFza19hbGwsCisJYXNrX25ldywKKwlhc2tfc2lsZW50LAorCXNldF9kZWZhdWx0LAorCXNldF95ZXMsCisJc2V0X21vZCwKKwlzZXRfbm8sCisJc2V0X3JhbmRvbQorfSBpbnB1dF9tb2RlID0gYXNrX2FsbDsKK2NoYXIgKmRlZmNvbmZpZ19maWxlOworCitzdGF0aWMgaW50IGluZGVudCA9IDE7CitzdGF0aWMgaW50IHZhbGlkX3N0ZGluID0gMTsKK3N0YXRpYyBpbnQgY29uZl9jbnQ7CitzdGF0aWMgY2hhciBsaW5lWzEyOF07CitzdGF0aWMgc3RydWN0IG1lbnUgKnJvb3RFbnRyeTsKKworc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9IE5fKCJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIHlldC5cbiIpOworCitzdGF0aWMgdm9pZCBzdHJpcChjaGFyICpzdHIpCit7CisJY2hhciAqcCA9IHN0cjsKKwlpbnQgbDsKKworCXdoaWxlICgoaXNzcGFjZSgqcCkpKQorCQlwKys7CisJbCA9IHN0cmxlbihwKTsKKwlpZiAocCAhPSBzdHIpCisJCW1lbW1vdmUoc3RyLCBwLCBsICsgMSk7CisJaWYgKCFsKQorCQlyZXR1cm47CisJcCA9IHN0ciArIGwgLSAxOworCXdoaWxlICgoaXNzcGFjZSgqcCkpKQorCQkqcC0tID0gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfc3RkaW4odm9pZCkKK3sKKwlpZiAoIXZhbGlkX3N0ZGluICYmIGlucHV0X21vZGUgPT0gYXNrX3NpbGVudCkgeworCQlwcmludGYoXygiYWJvcnRlZCFcblxuIikpOworCQlwcmludGYoXygiQ29uc29sZSBpbnB1dC9vdXRwdXQgaXMgcmVkaXJlY3RlZC4gIikpOworCQlwcmludGYoXygiUnVuICdtYWtlIG9sZGNvbmZpZycgdG8gdXBkYXRlIGNvbmZpZ3VyYXRpb24uXG5cbiIpKTsKKwkJZXhpdCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfYXNrdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpkZWYpCit7CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJdHJpc3RhdGUgdmFsOworCisJaWYgKCFzeW1faGFzX3ZhbHVlKHN5bSkpCisJCXByaW50ZigiKE5FVykgIik7CisKKwlsaW5lWzBdID0gJ1xuJzsKKwlsaW5lWzFdID0gMDsKKworCWlmICghc3ltX2lzX2NoYW5nYWJsZShzeW0pKSB7CisJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCWxpbmVbMF0gPSAnXG4nOworCQlsaW5lWzFdID0gMDsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCWNhc2Ugc2V0X25vOgorCWNhc2Ugc2V0X21vZDoKKwljYXNlIHNldF95ZXM6CisJY2FzZSBzZXRfcmFuZG9tOgorCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKSB7CisJCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgYXNrX25ldzoKKwljYXNlIGFza19zaWxlbnQ6CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCQlyZXR1cm47CisJCX0KKwkJY2hlY2tfc3RkaW4oKTsKKwljYXNlIGFza19hbGw6CisJCWZmbHVzaChzdGRvdXQpOworCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKKwkJcmV0dXJuOworCWNhc2Ugc2V0X2RlZmF1bHQ6CisJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCTsKKwl9CisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfeWVzOgorCQlpZiAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpIHsKKwkJCWxpbmVbMF0gPSAneSc7CisJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCWxpbmVbMl0gPSAwOworCQkJYnJlYWs7CisJCX0KKwljYXNlIHNldF9tb2Q6CisJCWlmICh0eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSkgeworCQkJCWxpbmVbMF0gPSAnbSc7CisJCQkJbGluZVsxXSA9ICdcbic7CisJCQkJbGluZVsyXSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpIHsKKwkJCQlsaW5lWzBdID0gJ3knOworCQkJCWxpbmVbMV0gPSAnXG4nOworCQkJCWxpbmVbMl0gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJY2FzZSBzZXRfbm86CisJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pKSB7CisJCQlsaW5lWzBdID0gJ24nOworCQkJbGluZVsxXSA9ICdcbic7CisJCQlsaW5lWzJdID0gMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBzZXRfcmFuZG9tOgorCQlkbyB7CisJCQl2YWwgPSAodHJpc3RhdGUpKHJhbmRvbSgpICUgMyk7CisJCX0gd2hpbGUgKCFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgdmFsKSk7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2Ugbm86IGxpbmVbMF0gPSAnbic7IGJyZWFrOworCQljYXNlIG1vZDogbGluZVswXSA9ICdtJzsgYnJlYWs7CisJCWNhc2UgeWVzOiBsaW5lWzBdID0gJ3knOyBicmVhazsKKwkJfQorCQlsaW5lWzFdID0gJ1xuJzsKKwkJbGluZVsyXSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlwcmludGYoIiVzIiwgbGluZSk7Cit9CisKK2ludCBjb25mX3N0cmluZyhzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJY29uc3QgY2hhciAqZGVmOworCisJd2hpbGUgKDEpIHsKKwkJcHJpbnRmKCIlKnMlcyAiLCBpbmRlbnQgLSAxLCAiIiwgbWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJcHJpbnRmKCIoJXMpICIsIHN5bS0+bmFtZSk7CisJCWRlZiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKQorCQkJcHJpbnRmKCJbJXNdICIsIGRlZik7CisJCWNvbmZfYXNrdmFsdWUoc3ltLCBkZWYpOworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnXG4nOgorCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJLyogcHJpbnQgaGVscCAqLworCQkJaWYgKGxpbmVbMV0gPT0gJ1xuJykgeworCQkJCXByaW50ZigiXG4lc1xuIiwgbWVudS0+c3ltLT5oZWxwID8gbWVudS0+c3ltLT5oZWxwIDogbm9oZWxwX3RleHQpOworCQkJCWRlZiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlsaW5lW3N0cmxlbihsaW5lKS0xXSA9IDA7CisJCQlkZWYgPSBsaW5lOworCQl9CisJCWlmIChkZWYgJiYgc3ltX3NldF9zdHJpbmdfdmFsdWUoc3ltLCBkZWYpKQorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGNvbmZfc3ltKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwl0cmlzdGF0ZSBvbGR2YWwsIG5ld3ZhbDsKKwljb25zdCBjaGFyICpoZWxwOworCisJd2hpbGUgKDEpIHsKKwkJcHJpbnRmKCIlKnMlcyAiLCBpbmRlbnQgLSAxLCAiIiwgbWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJaWYgKHN5bS0+bmFtZSkKKwkJCXByaW50ZigiKCVzKSAiLCBzeW0tPm5hbWUpOworCQlwdXRjaGFyKCdbJyk7CisJCW9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChvbGR2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXB1dGNoYXIoJ04nKTsKKwkJCWJyZWFrOworCQljYXNlIG1vZDoKKwkJCXB1dGNoYXIoJ00nKTsKKwkJCWJyZWFrOworCQljYXNlIHllczoKKwkJCXB1dGNoYXIoJ1knKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvbGR2YWwgIT0gbm8gJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSkKKwkJCXByaW50ZigiL24iKTsKKwkJaWYgKG9sZHZhbCAhPSBtb2QgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkpCisJCQlwcmludGYoIi9tIik7CisJCWlmIChvbGR2YWwgIT0geWVzICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKQorCQkJcHJpbnRmKCIveSIpOworCQlpZiAoc3ltLT5oZWxwKQorCQkJcHJpbnRmKCIvPyIpOworCQlwcmludGYoIl0gIik7CisJCWNvbmZfYXNrdmFsdWUoc3ltLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKwkJc3RyaXAobGluZSk7CisKKwkJc3dpdGNoIChsaW5lWzBdKSB7CisJCWNhc2UgJ24nOgorCQljYXNlICdOJzoKKwkJCW5ld3ZhbCA9IG5vOworCQkJaWYgKCFsaW5lWzFdIHx8ICFzdHJjbXAoJmxpbmVbMV0sICJvIikpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAnbSc6CisJCWNhc2UgJ00nOgorCQkJbmV3dmFsID0gbW9kOworCQkJaWYgKCFsaW5lWzFdKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgJ3knOgorCQljYXNlICdZJzoKKwkJCW5ld3ZhbCA9IHllczsKKwkJCWlmICghbGluZVsxXSB8fCAhc3RyY21wKCZsaW5lWzFdLCAiZXMiKSkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQluZXd2YWwgPSBvbGR2YWw7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlnb3RvIGhlbHA7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCkpCisJCQlyZXR1cm4gMDsKK2hlbHA6CisJCWhlbHAgPSBub2hlbHBfdGV4dDsKKwkJaWYgKHN5bS0+aGVscCkKKwkJCWhlbHAgPSBzeW0tPmhlbHA7CisJCXByaW50ZigiXG4lc1xuIiwgaGVscCk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSwgKmRlZl9zeW07CisJc3RydWN0IG1lbnUgKmNoaWxkOworCWJvb2wgaXNfbmV3OworCisJc3ltID0gbWVudS0+c3ltOworCWlzX25ldyA9ICFzeW1faGFzX3ZhbHVlKHN5bSk7CisJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkgeworCQljb25mX3N5bShtZW51KTsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAxOworCQljYXNlIG1vZDoKKwkJCXJldHVybiAwOworCQljYXNlIHllczoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAxOworCQljYXNlIG1vZDoKKwkJCXByaW50ZigiJSpzJXNcbiIsIGluZGVudCAtIDEsICIiLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgeWVzOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgY250LCBkZWY7CisKKwkJcHJpbnRmKCIlKnMlc1xuIiwgaW5kZW50IC0gMSwgIiIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCWRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQljbnQgPSBkZWYgPSAwOworCQlsaW5lWzBdID0gMDsKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAoIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNoaWxkLT5zeW0pIHsKKwkJCQlwcmludGYoIiUqYyAlc1xuIiwgaW5kZW50LCAnKicsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY250Kys7CisJCQlpZiAoY2hpbGQtPnN5bSA9PSBkZWZfc3ltKSB7CisJCQkJZGVmID0gY250OworCQkJCXByaW50ZigiJSpjIiwgaW5kZW50LCAnPicpOworCQkJfSBlbHNlCisJCQkJcHJpbnRmKCIlKmMiLCBpbmRlbnQsICcgJyk7CisJCQlwcmludGYoIiAlZC4gJXMiLCBjbnQsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJaWYgKGNoaWxkLT5zeW0tPm5hbWUpCisJCQkJcHJpbnRmKCIgKCVzKSIsIGNoaWxkLT5zeW0tPm5hbWUpOworCQkJaWYgKCFzeW1faGFzX3ZhbHVlKGNoaWxkLT5zeW0pKQorCQkJCXByaW50ZigiIChORVcpIik7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwkJcHJpbnRmKCIlKnNjaG9pY2UiLCBpbmRlbnQgLSAxLCAiIik7CisJCWlmIChjbnQgPT0gMSkgeworCQkJcHJpbnRmKCJbMV06IDFcbiIpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQlwcmludGYoIlsxLSVkIiwgY250KTsKKwkJaWYgKHN5bS0+aGVscCkKKwkJCXByaW50ZigiPyIpOworCQlwcmludGYoIl06ICIpOworCQlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwkJY2FzZSBhc2tfbmV3OgorCQljYXNlIGFza19zaWxlbnQ6CisJCQlpZiAoIWlzX25ldykgeworCQkJCWNudCA9IGRlZjsKKwkJCQlwcmludGYoIiVkXG4iLCBjbnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2hlY2tfc3RkaW4oKTsKKwkJY2FzZSBhc2tfYWxsOgorCQkJZmZsdXNoKHN0ZG91dCk7CisJCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKKwkJCXN0cmlwKGxpbmUpOworCQkJaWYgKGxpbmVbMF0gPT0gJz8nKSB7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPworCQkJCQltZW51LT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWxpbmVbMF0pCisJCQkJY250ID0gZGVmOworCQkJZWxzZSBpZiAoaXNkaWdpdChsaW5lWzBdKSkKKwkJCQljbnQgPSBhdG9pKGxpbmUpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2Ugc2V0X3JhbmRvbToKKwkJCWRlZiA9IChyYW5kb20oKSAlIGNudCkgKyAxOworCQljYXNlIHNldF9kZWZhdWx0OgorCQljYXNlIHNldF95ZXM6CisJCWNhc2Ugc2V0X21vZDoKKwkJY2FzZSBzZXRfbm86CisJCQljbnQgPSBkZWY7CisJCQlwcmludGYoIiVkXG4iLCBjbnQpOworCQkJYnJlYWs7CisJCX0KKworCWNvbmZfY2hpbGRzOgorCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghY2hpbGQtPnN5bSB8fCAhbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghLS1jbnQpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFjaGlsZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RybGVuKGxpbmUpID4gMCAmJiBsaW5lW3N0cmxlbihsaW5lKSAtIDFdID09ICc/JykgeworCQkJcHJpbnRmKCJcbiVzXG4iLCBjaGlsZC0+c3ltLT5oZWxwID8KKwkJCQljaGlsZC0+c3ltLT5oZWxwIDogbm9oZWxwX3RleHQpOworCQkJY29udGludWU7CisJCX0KKwkJc3ltX3NldF9jaG9pY2VfdmFsdWUoc3ltLCBjaGlsZC0+c3ltKTsKKwkJaWYgKGNoaWxkLT5saXN0KSB7CisJCQlpbmRlbnQgKz0gMjsKKwkJCWNvbmYoY2hpbGQtPmxpc3QpOworCQkJaW5kZW50IC09IDI7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCisJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCXJldHVybjsKKworCXN5bSA9IG1lbnUtPnN5bTsKKwlwcm9wID0gbWVudS0+cHJvbXB0OworCWlmIChwcm9wKSB7CisJCWNvbnN0IGNoYXIgKnByb21wdDsKKworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX01FTlU6CisJCQlpZiAoaW5wdXRfbW9kZSA9PSBhc2tfc2lsZW50ICYmIHJvb3RFbnRyeSAhPSBtZW51KSB7CisJCQkJY2hlY2tfY29uZihtZW51KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCWNhc2UgUF9DT01NRU5UOgorCQkJcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJaWYgKHByb21wdCkKKwkJCQlwcmludGYoIiUqY1xuJSpjICVzXG4lKmNcbiIsCisJCQkJCWluZGVudCwgJyonLAorCQkJCQlpbmRlbnQsICcqJywgcHJvbXB0LAorCQkJCQlpbmRlbnQsICcqJyk7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKwl9CisKKwlpZiAoIXN5bSkKKwkJZ290byBjb25mX2NoaWxkczsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJY29uZl9jaG9pY2UobWVudSk7CisJCWlmIChzeW0tPmN1cnIudHJpICE9IG1vZCkKKwkJCXJldHVybjsKKwkJZ290byBjb25mX2NoaWxkczsKKwl9CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQljb25mX3N0cmluZyhtZW51KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29uZl9zeW0obWVudSk7CisJCWJyZWFrOworCX0KKworY29uZl9jaGlsZHM6CisJaWYgKHN5bSkKKwkJaW5kZW50ICs9IDI7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQljb25mKGNoaWxkKTsKKwlpZiAoc3ltKQorCQlpbmRlbnQgLT0gMjsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IG1lbnUgKmNoaWxkOworCisJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCXJldHVybjsKKworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoc3ltICYmICFzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSB8fAorCQkgICAgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgPT0geWVzKSkgeworCQkJaWYgKCFjb25mX2NudCsrKQorCQkJCXByaW50ZihfKCIqXG4qIFJlc3RhcnQgY29uZmlnLi4uXG4qXG4iKSk7CisJCQlyb290RW50cnkgPSBtZW51X2dldF9wYXJlbnRfbWVudShtZW51KTsKKwkJCWNvbmYocm9vdEVudHJ5KTsKKwkJfQorCX0KKworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJY2hlY2tfY29uZihjaGlsZCk7Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBpID0gMTsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzdGF0IHRtcHN0YXQ7CisKKwlpZiAoYWMgPiBpICYmIGF2W2ldWzBdID09ICctJykgeworCQlzd2l0Y2ggKGF2W2krK11bMV0pIHsKKwkJY2FzZSAnbyc6CisJCQlpbnB1dF9tb2RlID0gYXNrX25ldzsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlucHV0X21vZGUgPSBhc2tfc2lsZW50OworCQkJdmFsaWRfc3RkaW4gPSBpc2F0dHkoMCk7IC8vYmJveDogJiYgaXNhdHR5KDEpICYmIGlzYXR0eSgyKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJCWRlZmNvbmZpZ19maWxlID0gYXZbaSsrXTsKKwkJCWlmICghZGVmY29uZmlnX2ZpbGUpIHsKKwkJCQlwcmludGYoXygiJXM6IE5vIGRlZmF1bHQgY29uZmlnIGZpbGUgc3BlY2lmaWVkXG4iKSwKKwkJCQkJYXZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlpbnB1dF9tb2RlID0gc2V0X25vOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaW5wdXRfbW9kZSA9IHNldF9tb2Q7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlpbnB1dF9tb2RlID0gc2V0X3llczsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfcmFuZG9tOworCQkJc3JhbmRvbSh0aW1lKE5VTEwpKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIlNlZSBSRUFETUUgZm9yIHVzYWdlIGluZm9cbiIpOworCQkJZXhpdCgwKTsKKwkJfQorCX0KKwluYW1lID0gYXZbaV07CisJaWYgKCFuYW1lKSB7CisJCXByaW50ZihfKCIlczogS2NvbmZpZyBmaWxlIG1pc3NpbmdcbiIpLCBhdlswXSk7CisJfQorCWNvbmZfcGFyc2UobmFtZSk7CisJLy96Y29uZmR1bXAoc3Rkb3V0KTsKKwlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwljYXNlIHNldF9kZWZhdWx0OgorCQlpZiAoIWRlZmNvbmZpZ19maWxlKQorCQkJZGVmY29uZmlnX2ZpbGUgPSBjb25mX2dldF9kZWZhdWx0X2NvbmZuYW1lKCk7CisJCWlmIChjb25mX3JlYWQoZGVmY29uZmlnX2ZpbGUpKSB7CisJCQlwcmludGYoIioqKlxuIgorCQkJCSIqKiogQ2FuJ3QgZmluZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gXCIlc1wiIVxuIgorCQkJCSIqKipcbiIsIGRlZmNvbmZpZ19maWxlKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBhc2tfc2lsZW50OgorCQlpZiAoc3RhdCgiLmNvbmZpZyIsICZ0bXBzdGF0KSkgeworCQkJcHJpbnRmKF8oIioqKlxuIgorCQkJCSIqKiogWW91IGhhdmUgbm90IHlldCBjb25maWd1cmVkIGJ1c3lib3ghXG4iCisJCQkJIioqKlxuIgorCQkJCSIqKiogUGxlYXNlIHJ1biBzb21lIGNvbmZpZ3VyYXRvciAoZS5nLiBcIm1ha2Ugb2xkY29uZmlnXCIgb3JcbiIKKwkJCQkiKioqIFwibWFrZSBtZW51Y29uZmlnXCIgb3IgXCJtYWtlIGRlZmNvbmZpZ1wiKS5cbiIKKwkJCQkiKioqXG4iKSk7CisJCQlleGl0KDEpOworCQl9CisJY2FzZSBhc2tfYWxsOgorCWNhc2UgYXNrX25ldzoKKwkJY29uZl9yZWFkKE5VTEwpOworCQlicmVhazsKKwljYXNlIHNldF9ubzoKKwljYXNlIHNldF9tb2Q6CisJY2FzZSBzZXRfeWVzOgorCWNhc2Ugc2V0X3JhbmRvbToKKwkJbmFtZSA9IGdldGVudigiS0NPTkZJR19BTExDT05GSUciKTsKKwkJaWYgKG5hbWUgJiYgIXN0YXQobmFtZSwgJnRtcHN0YXQpKSB7CisJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJCWNhc2Ugc2V0X25vOgkgbmFtZSA9ICJhbGxuby5jb25maWciOyBicmVhazsKKwkJY2FzZSBzZXRfbW9kOgkgbmFtZSA9ICJhbGxtb2QuY29uZmlnIjsgYnJlYWs7CisJCWNhc2Ugc2V0X3llczoJIG5hbWUgPSAiYWxseWVzLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIHNldF9yYW5kb206IG5hbWUgPSAiYWxscmFuZG9tLmNvbmZpZyI7IGJyZWFrOworCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCQlpZiAoIXN0YXQobmFtZSwgJnRtcHN0YXQpKQorCQkJY29uZl9yZWFkX3NpbXBsZShuYW1lKTsKKwkJZWxzZSBpZiAoIXN0YXQoImFsbC5jb25maWciLCAmdG1wc3RhdCkpCisJCQljb25mX3JlYWRfc2ltcGxlKCJhbGwuY29uZmlnIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChpbnB1dF9tb2RlICE9IGFza19zaWxlbnQpIHsKKwkJcm9vdEVudHJ5ID0gJnJvb3RtZW51OworCQljb25mKCZyb290bWVudSk7CisJCWlmIChpbnB1dF9tb2RlID09IGFza19hbGwpIHsKKwkJCWlucHV0X21vZGUgPSBhc2tfc2lsZW50OworCQkJdmFsaWRfc3RkaW4gPSAxOworCQl9CisJfQorCWRvIHsKKwkJY29uZl9jbnQgPSAwOworCQljaGVja19jb25mKCZyb290bWVudSk7CisJfSB3aGlsZSAoY29uZl9jbnQpOworCWlmIChjb25mX3dyaXRlKE5VTEwpKSB7CisJCWZwcmludGYoc3RkZXJyLCBfKCJcbioqKiBFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUgY29uZmlndXJhdGlvbi5cblxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmQ3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwpAQCAtMCwwICsxLDU3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKK3N0YXRpYyB2b2lkIGNvbmZfd2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25mX2ZpbGVuYW1lOworc3RhdGljIGludCBjb25mX2xpbmVubywgY29uZl93YXJuaW5ncywgY29uZl91bnNhdmVkOworCitjb25zdCBjaGFyIGNvbmZfZGVmX2ZpbGVuYW1lW10gPSAiLmNvbmZpZyI7CisKK2NvbnN0IGNoYXIgY29uZl9kZWZuYW1lW10gPSAiL2Rldi9udWxsIjsgLy9iYm94CisKK2NvbnN0IGNoYXIgKmNvbmZfY29uZm5hbWVzW10gPSB7CisJY29uZl9kZWZfZmlsZW5hbWUsCisJY29uZl9kZWZuYW1lLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBjb25mX3dhcm5pbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIGNvbmZfZmlsZW5hbWUsIGNvbmZfbGluZW5vKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQoYXApOworCWNvbmZfd2FybmluZ3MrKzsKK30KKworc3RhdGljIGNoYXIgKmNvbmZfZXhwYW5kX3ZhbHVlKGNvbnN0IGNoYXIgKmluKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwljb25zdCBjaGFyICpzcmM7CisJc3RhdGljIGNoYXIgcmVzX3ZhbHVlW1NZTUJPTF9NQVhMRU5HVEhdOworCWNoYXIgKmRzdCwgbmFtZVtTWU1CT0xfTUFYTEVOR1RIXTsKKworCXJlc192YWx1ZVswXSA9IDA7CisJZHN0ID0gbmFtZTsKKwl3aGlsZSAoKHNyYyA9IHN0cmNocihpbiwgJyQnKSkpIHsKKwkJc3RybmNhdChyZXNfdmFsdWUsIGluLCBzcmMgLSBpbik7CisJCXNyYysrOworCQlkc3QgPSBuYW1lOworCQl3aGlsZSAoaXNhbG51bSgqc3JjKSB8fCAqc3JjID09ICdfJykKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJKmRzdCA9IDA7CisJCXN5bSA9IHN5bV9sb29rdXAobmFtZSwgMCk7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXN0cmNhdChyZXNfdmFsdWUsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlpbiA9IHNyYzsKKwl9CisJc3RyY2F0KHJlc192YWx1ZSwgaW4pOworCisJcmV0dXJuIHJlc192YWx1ZTsKK30KKworY2hhciAqY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSh2b2lkKQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlzdGF0aWMgY2hhciAqZnVsbG5hbWUgPSBOVUxMOworCWNoYXIgKmVudiwgKm5hbWU7CisKKwluYW1lID0gY29uZl9leHBhbmRfdmFsdWUoY29uZl9kZWZuYW1lKTsKKwllbnYgPSBnZXRlbnYoU1JDVFJFRSk7CisJaWYgKGVudikgeworCQlmdWxsbmFtZSA9IHJlYWxsb2MoZnVsbG5hbWUsIHN0cmxlbihlbnYpICsgc3RybGVuKG5hbWUpICsgMik7CisJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7CisJCWlmICghc3RhdChmdWxsbmFtZSwgJmJ1ZikpCisJCQlyZXR1cm4gZnVsbG5hbWU7CisJfQorCXJldHVybiBuYW1lOworfQorCitpbnQgY29uZl9yZWFkX3NpbXBsZShjb25zdCBjaGFyICpuYW1lKQoreworCUZJTEUgKmluID0gTlVMTDsKKwljaGFyIGxpbmVbMTAyNF07CisJY2hhciAqcCwgKnAyOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWlmIChuYW1lKSB7CisJCWluID0gemNvbmZfZm9wZW4obmFtZSk7CisJfSBlbHNlIHsKKwkJY29uc3QgY2hhciAqKm5hbWVzID0gY29uZl9jb25mbmFtZXM7CisJCXdoaWxlICgobmFtZSA9ICpuYW1lcysrKSkgeworCQkJbmFtZSA9IGNvbmZfZXhwYW5kX3ZhbHVlKG5hbWUpOworCQkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwkJCWlmIChpbikgeworCQkJCXByaW50ZihfKCIjXG4iCisJCQkJICAgICAgICAgIiMgdXNpbmcgZGVmYXVsdHMgZm91bmQgaW4gJXNcbiIKKwkJCQkgICAgICAgICAiI1xuIiksIG5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmICghaW4pCisJCXJldHVybiAxOworCisJY29uZl9maWxlbmFtZSA9IG5hbWU7CisJY29uZl9saW5lbm8gPSAwOworCWNvbmZfd2FybmluZ3MgPSAwOworCWNvbmZfdW5zYXZlZCA9IDA7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX05FVyB8IFNZTUJPTF9DSEFOR0VEOworCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfSU5UOgorCQljYXNlIFNfSEVYOgorCQljYXNlIFNfU1RSSU5HOgorCQkJaWYgKHN5bS0+dXNlci52YWwpCisJCQkJZnJlZShzeW0tPnVzZXIudmFsKTsKKwkJZGVmYXVsdDoKKwkJCXN5bS0+dXNlci52YWwgPSBOVUxMOworCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQl9CisJfQorCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CisJCWNvbmZfbGluZW5vKys7CisJCXN5bSA9IE5VTEw7CisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICcjJzoKKwkJCWlmIChtZW1jbXAobGluZSArIDIsICJDT05GSUdfIiwgNykpCisJCQkJY29udGludWU7CisJCQlwID0gc3RyY2hyKGxpbmUgKyA5LCAnICcpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9IDA7CisJCQlpZiAoc3RybmNtcChwLCAiaXMgbm90IHNldCIsIDEwKSkKKwkJCQljb250aW51ZTsKKwkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyA5KTsKKwkJCWlmICghc3ltKSB7CisJCQkJY29uZl93YXJuaW5nKCJ0cnlpbmcgdG8gYXNzaWduIG5vbmV4aXN0ZW50IHN5bWJvbCAlcyIsIGxpbmUgKyA5KTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX05FVykpIHsKKwkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byByZWFzc2lnbiBzeW1ib2wgJXMiLCBzeW0tPm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCXN5bS0+dXNlci50cmkgPSBubzsKKwkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQlpZiAobWVtY21wKGxpbmUsICJDT05GSUdfIiwgNykpIHsKKwkJCQljb25mX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGF0YSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcCA9IHN0cmNocihsaW5lICsgNywgJz0nKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAwOworCQkJcDIgPSBzdHJjaHIocCwgJ1xuJyk7CisJCQlpZiAocDIpCisJCQkJKnAyID0gMDsKKwkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyA3KTsKKwkJCWlmICghc3ltKSB7CisJCQkJY29uZl93YXJuaW5nKCJ0cnlpbmcgdG8gYXNzaWduIG5vbmV4aXN0ZW50IHN5bWJvbCAlcyIsIGxpbmUgKyA3KTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX05FVykpIHsKKwkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byByZWFzc2lnbiBzeW1ib2wgJXMiLCBzeW0tPm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlpZiAocFswXSA9PSAnbScpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IG1vZDsKKwkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJaWYgKHBbMF0gPT0gJ3knKSB7CisJCQkJCXN5bS0+dXNlci50cmkgPSB5ZXM7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAocFswXSA9PSAnbicpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY29uZl93YXJuaW5nKCJzeW1ib2wgdmFsdWUgJyVzJyBpbnZhbGlkIGZvciAlcyIsIHAsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfU1RSSU5HOgorCQkJCWlmICgqcCsrICE9ICciJykKKwkJCQkJYnJlYWs7CisJCQkJZm9yIChwMiA9IHA7IChwMiA9IHN0cnBicmsocDIsICJcIlxcIikpOyBwMisrKSB7CisJCQkJCWlmICgqcDIgPT0gJyInKSB7CisJCQkJCQkqcDIgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbWVtbW92ZShwMiwgcDIgKyAxLCBzdHJsZW4ocDIpKTsKKwkJCQl9CisJCQkJaWYgKCFwMikgeworCQkJCQljb25mX3dhcm5pbmcoImludmFsaWQgc3RyaW5nIGZvdW5kIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWNhc2UgU19JTlQ6CisJCQljYXNlIFNfSEVYOgorCQkJCWlmIChzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgcCkpIHsKKwkJCQkJc3ltLT51c2VyLnZhbCA9IHN0cmR1cChwKTsKKwkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocFswXSkgLyogYmJveCAqLworCQkJCQkJY29uZl93YXJuaW5nKCJzeW1ib2wgdmFsdWUgJyVzJyBpbnZhbGlkIGZvciAlcyIsIHAsIHN5bS0+bmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29uZl93YXJuaW5nKCJ1bmV4cGVjdGVkIGRhdGEiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKSB7CisJCQlzdHJ1Y3Qgc3ltYm9sICpjcyA9IHByb3BfZ2V0X3N5bWJvbChzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSkpOworCQkJc3dpdGNoIChzeW0tPnVzZXIudHJpKSB7CisJCQljYXNlIG5vOgorCQkJCWJyZWFrOworCQkJY2FzZSBtb2Q6CisJCQkJaWYgKGNzLT51c2VyLnRyaSA9PSB5ZXMpIHsKKwkJCQkJY29uZl93YXJuaW5nKCIlcyBjcmVhdGVzIGluY29uc2lzdGVudCBjaG9pY2Ugc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJCQljcy0+ZmxhZ3MgfD0gU1lNQk9MX05FVzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIHllczoKKwkJCQlpZiAoY3MtPnVzZXIudHJpICE9IG5vKSB7CisJCQkJCWNvbmZfd2FybmluZygiJXMgY3JlYXRlcyBpbmNvbnNpc3RlbnQgY2hvaWNlIHN0YXRlIiwgc3ltLT5uYW1lKTsKKwkJCQkJY3MtPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQkJfSBlbHNlCisJCQkJCWNzLT51c2VyLnZhbCA9IHN5bTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNzLT51c2VyLnRyaSA9IEVfT1IoY3MtPnVzZXIudHJpLCBzeW0tPnVzZXIudHJpKTsKKwkJfQorCX0KKwlmY2xvc2UoaW4pOworCisJaWYgKG1vZHVsZXNfc3ltKQorCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25mX3JlYWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICplOworCWludCBpOworCisJaWYgKGNvbmZfcmVhZF9zaW1wbGUobmFtZSkpCisJCXJldHVybiAxOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pIHx8IChzeW0tPmZsYWdzICYgU1lNQk9MX0FVVE8pKQorCQkJZ290byBzeW1fb2s7CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkgJiYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKSB7CisJCQkvKiBjaGVjayB0aGF0IGNhbGN1bGF0ZWQgdmFsdWUgYWdyZWVzIHdpdGggc2F2ZWQgdmFsdWUgKi8KKwkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlpZiAoc3ltLT51c2VyLnRyaSAhPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpCisJCQkJCWJyZWFrOworCQkJCWlmICghc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJCQlnb3RvIHN5bV9vazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCFzdHJjbXAoc3ltLT5jdXJyLnZhbCwgc3ltLT51c2VyLnZhbCkpCisJCQkJCWdvdG8gc3ltX29rOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKCFzeW1faGFzX3ZhbHVlKHN5bSkgJiYgIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSkKKwkJCS8qIG5vIHByZXZpb3VzIHZhbHVlIGFuZCBub3Qgc2F2ZWQgKi8KKwkJCWdvdG8gc3ltX29rOworCQljb25mX3Vuc2F2ZWQrKzsKKwkJLyogbWF5YmUgcHJpbnQgdmFsdWUgaW4gdmVyYm9zZSBtb2RlLi4uICovCisJc3ltX29rOgorCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pICYmICFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKKwkJCWlmIChzeW0tPnZpc2libGUgPT0gbm8pCisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQljYXNlIFNfSU5UOgorCQkJY2FzZSBTX0hFWDoKKwkJCQlpZiAoIXN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN5bSwgc3ltLT51c2VyLnZhbCkpIHsKKwkJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfVkFMSUQ7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWNvbnRpbnVlOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKQorCQkJaWYgKGUtPnJpZ2h0LnN5bS0+dmlzaWJsZSAhPSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IGUtPnJpZ2h0LnN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXOworCX0KKworCXN5bV9jaGFuZ2VfY291bnQgPSBjb25mX3dhcm5pbmdzIHx8IGNvbmZfdW5zYXZlZDsKKworCXJldHVybiAwOworfQorCitpbnQgY29uZl93cml0ZShjb25zdCBjaGFyICpuYW1lKQoreworCUZJTEUgKm91dCwgKm91dF9oOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwljb25zdCBjaGFyICpiYXNlbmFtZTsKKwljaGFyIGRpcm5hbWVbMTI4XSwgdG1wbmFtZVsxMjhdLCBuZXduYW1lWzEyOF07CisJaW50IHR5cGUsIGw7CisJY29uc3QgY2hhciAqc3RyOworCXRpbWVfdCBub3c7CisJaW50IHVzZV90aW1lc3RhbXAgPSAxOworCWNoYXIgKmVudjsKKworCWRpcm5hbWVbMF0gPSAwOworCWlmIChuYW1lICYmIG5hbWVbMF0pIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIgKnNsYXNoOworCisJCWlmICghc3RhdChuYW1lLCAmc3QpICYmIFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCXN0cmNweShkaXJuYW1lLCBuYW1lKTsKKwkJCXN0cmNhdChkaXJuYW1lLCAiLyIpOworCQkJYmFzZW5hbWUgPSBjb25mX2RlZl9maWxlbmFtZTsKKwkJfSBlbHNlIGlmICgoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKSB7CisJCQlpbnQgc2l6ZSA9IHNsYXNoIC0gbmFtZSArIDE7CisJCQltZW1jcHkoZGlybmFtZSwgbmFtZSwgc2l6ZSk7CisJCQlkaXJuYW1lW3NpemVdID0gMDsKKwkJCWlmIChzbGFzaFsxXSkKKwkJCQliYXNlbmFtZSA9IHNsYXNoICsgMTsKKwkJCWVsc2UKKwkJCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQl9IGVsc2UKKwkJCWJhc2VuYW1lID0gbmFtZTsKKwl9IGVsc2UKKwkJYmFzZW5hbWUgPSBjb25mX2RlZl9maWxlbmFtZTsKKworCXNwcmludGYobmV3bmFtZSwgIiVzLnRtcGNvbmZpZy4lZCIsIGRpcm5hbWUsIChpbnQpZ2V0cGlkKCkpOworCW91dCA9IGZvcGVuKG5ld25hbWUsICJ3Iik7CisJaWYgKCFvdXQpCisJCXJldHVybiAxOworCW91dF9oID0gTlVMTDsKKwlpZiAoIW5hbWUpIHsKKwkJb3V0X2ggPSBmb3BlbigiLnRtcGNvbmZpZy5oIiwgInciKTsKKwkJaWYgKCFvdXRfaCkKKwkJCXJldHVybiAxOworCQlmaWxlX3dyaXRlX2RlcChOVUxMKTsKKwl9CisJc3ltID0gc3ltX2xvb2t1cCgiS0VSTkVMVkVSU0lPTiIsIDApOworCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJdGltZSgmbm93KTsKKwllbnYgPSBnZXRlbnYoIktDT05GSUdfTk9USU1FU1RBTVAiKTsKKwlpZiAoZW52ICYmICplbnYpCisJCXVzZV90aW1lc3RhbXAgPSAwOworCisJZnByaW50ZihvdXQsIF8oIiNcbiIKKwkJICAgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCSAgICAgICAiIyBCdXN5Ym94IHZlcnNpb246ICVzXG4iCisJCSAgICAgICAiJXMlcyIKKwkJICAgICAgICIjXG4iKSwKKwkJICAgICBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLAorCQkgICAgIHVzZV90aW1lc3RhbXAgPyAiIyAiIDogIiIsCisJCSAgICAgdXNlX3RpbWVzdGFtcCA/IGN0aW1lKCZub3cpIDogIiIpOworCWlmIChvdXRfaCkgeworCQljaGFyIGJ1ZltzaXplb2YoIiNkZWZpbmUgQVVUT0NPTkZfVElNRVNUQU1QICIKKwkJCQkiXCJZWVlZLU1NLUREIEhIOk1NOlNTIHNvbWVfdGltZXpvbmVcIlxuIildOworCQlidWZbMF0gPSAnXDAnOworCQlpZiAodXNlX3RpbWVzdGFtcCkgeworCQkJc2l6ZV90IHJldCA9IFwKKwkJCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiI2RlZmluZSBBVVRPQ09ORl9USU1FU1RBTVAgIgorCQkJCQkiXCIlWS0lbS0lZCAlSDolTTolUyAlWlwiXG4iLCBsb2NhbHRpbWUoJm5vdykpOworCQkJLyogaWYgdXNlciBoYXMgRmFjdG9yeSB0aW1lem9uZSBvciBzb21lIG90aGVyIG9kZCBpbnN0YWxsLCB0aGUKKwkJCSAqICVaIGFib3ZlIHdpbGwgb3ZlcmZsb3cgdGhlIHN0cmluZyBsZWF2aW5nIHVzIHdpdGggdW5kZWZpbmVkCisJCQkgKiByZXN1bHRzIC4uLiBzbyBsZXQncyB0cnkgYWdhaW4gd2l0aG91dCB0aGUgdGltZXpvbmUuCisJCQkgKi8KKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiI2RlZmluZSBBVVRPQ09ORl9USU1FU1RBTVAgIgorCQkJCQkiXCIlWS0lbS0lZCAlSDolTTolU1wiXG4iLCBsb2NhbHRpbWUoJm5vdykpOworCQl9IGVsc2UgeyAvKiBiYm94ICovCisJCQlzdHJjcHkoYnVmLCAiI2RlZmluZSBBVVRPQ09ORl9USU1FU1RBTVAgXCJcIlxuIik7CisJCX0KKwkJZnByaW50ZihvdXRfaCwgIi8qXG4iCisJCQkgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEMgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCQkgICAgICAgIiAqIEJ1c3lib3ggdmVyc2lvbjogJXNcbiIKKwkJCSAgICAgICAiICovXG4iCisJCQkgICAgICAgIiVzIgorCQkJICAgICAgICJcbiIsCisJCQkgICAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKKwkJCSAgICAgICBidWYpOworCX0KKwlpZiAoIXN5bV9jaGFuZ2VfY291bnQpCisJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCXN5bSA9IG1lbnUtPnN5bTsKKwkJaWYgKCFzeW0pIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQkJCWdvdG8gbmV4dDsKKwkJCXN0ciA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCWZwcmludGYob3V0LCAiXG4iCisJCQkJICAgICAiI1xuIgorCQkJCSAgICAgIiMgJXNcbiIKKwkJCQkgICAgICIjXG4iLCBzdHIpOworCQkJaWYgKG91dF9oKQorCQkJCWZwcmludGYob3V0X2gsICJcbiIKKwkJCQkJICAgICAgICIvKlxuIgorCQkJCQkgICAgICAgIiAqICVzXG4iCisJCQkJCSAgICAgICAiICovXG4iLCBzdHIpOworCQl9IGVsc2UgaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9DSE9JQ0UpKSB7CisJCQlzeW1fY2FsY192YWx1ZShzeW0pOworLyogYmJveDogd2Ugd2FudCB0byBzZWUgYWxsIHN5bXMKKwkJCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKQorCQkJCWdvdG8gbmV4dDsKKyovCisJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfV1JJVEU7CisJCQl0eXBlID0gc3ltLT50eXBlOworCQkJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQkJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwkJCQlpZiAobW9kdWxlc19zeW0tPmN1cnIudHJpID09IG5vKQorCQkJCQl0eXBlID0gU19CT09MRUFOOworCQkJfQorCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgeworCQkJCWNhc2Ugbm86CisJCQkJCWZwcmludGYob3V0LCAiIyBDT05GSUdfJXMgaXMgbm90IHNldFxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJaWYgKG91dF9oKSB7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI3VuZGVmIENPTkZJR18lc1xuIiwgc3ltLT5uYW1lKTsKKwkJCQkJCS8qIGJib3ggKi8KKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIEVOQUJMRV8lcyAwXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfJXMoLi4uKVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIElGX05PVF8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgbW9kOgorCQkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1tXG4iLCBzeW0tPm5hbWUpOworCQkJCQlpZiAob3V0X2gpCisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXNfTU9EVUxFIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgeWVzOgorCQkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz15XG4iLCBzeW0tPm5hbWUpOworCQkJCQlpZiAob3V0X2gpIHsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJLyogYmJveCAqLworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgRU5BQkxFXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLilcbiIsIHN5bS0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTX1NUUklORzoKKwkJCQkvLyBmaXggbWUKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPVwiIiwgc3ltLT5uYW1lKTsKKwkJCQlpZiAob3V0X2gpCisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyBcIiIsIHN5bS0+bmFtZSk7CisJCQkJZG8geworCQkJCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7CisJCQkJCWlmIChsKSB7CisJCQkJCQlmd3JpdGUoc3RyLCBsLCAxLCBvdXQpOworCQkJCQkJaWYgKG91dF9oKQorCQkJCQkJCWZ3cml0ZShzdHIsIGwsIDEsIG91dF9oKTsKKwkJCQkJfQorCQkJCQlzdHIgKz0gbDsKKwkJCQkJd2hpbGUgKCpzdHIgPT0gJ1xcJyB8fCAqc3RyID09ICciJykgeworCQkJCQkJZnByaW50ZihvdXQsICJcXCVjIiwgKnN0cik7CisJCQkJCQlpZiAob3V0X2gpCisJCQkJCQkJZnByaW50ZihvdXRfaCwgIlxcJWMiLCAqc3RyKTsKKwkJCQkJCXN0cisrOworCQkJCQl9CisJCQkJfSB3aGlsZSAoKnN0cik7CisJCQkJZnB1dHMoIlwiXG4iLCBvdXQpOworCQkJCWlmIChvdXRfaCkgeworCQkJCQlmcHV0cygiXCJcbiIsIG91dF9oKTsKKwkJCQkJLyogYmJveCAqLworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBFTkFCTEVfJXMgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfJXMoLi4uKSBfX1ZBX0FSR1NfX1xuIiwgc3ltLT5uYW1lKTsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLilcbiIsIHN5bS0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTX0hFWDoKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWlmIChzdHJbMF0gIT0gJzAnIHx8IChzdHJbMV0gIT0gJ3gnICYmIHN0clsxXSAhPSAnWCcpKSB7CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCWlmIChvdXRfaCkgeworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDB4JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQkJCS8qIGJib3ggKi8KKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIEVOQUJMRV8lcyAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfJXMoLi4uKSBfX1ZBX0FSR1NfX1xuIiwgc3ltLT5uYW1lKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIElGX05PVF8lcyguLi4pXG4iLCBzeW0tPm5hbWUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWNhc2UgU19JTlQ6CisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlpZiAoIXN0clswXSkKKwkJCQkJc3RyID0gIjAiOworCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJaWYgKG91dF9oKSB7CisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyAlc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJCQkvKiBiYm94ICovCisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIEVOQUJMRV8lcyAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl9OT1RfJXMoLi4uKVxuIiwgc3ltLT5uYW1lKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCW5leHQ6CisJCWlmIChtZW51LT5saXN0KSB7CisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtZW51LT5uZXh0KQorCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2Uob3V0KTsKKwlpZiAob3V0X2gpIHsKKwkJZmNsb3NlKG91dF9oKTsKKwkJcmVuYW1lKCIudG1wY29uZmlnLmgiLCAiaW5jbHVkZS9hdXRvY29uZi5oIik7CisJfQorCWlmICghbmFtZSB8fCBiYXNlbmFtZSAhPSBjb25mX2RlZl9maWxlbmFtZSkgeworCQlpZiAoIW5hbWUpCisJCQluYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCXNwcmludGYodG1wbmFtZSwgIiVzLm9sZCIsIG5hbWUpOworCQlyZW5hbWUobmFtZSwgdG1wbmFtZSk7CisJfQorCXNwcmludGYodG1wbmFtZSwgIiVzJXMiLCBkaXJuYW1lLCBiYXNlbmFtZSk7CisJaWYgKHJlbmFtZShuZXduYW1lLCB0bXBuYW1lKSkKKwkJcmV0dXJuIDE7CisKKwlzeW1fY2hhbmdlX2NvdW50ID0gMDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzOWU3YQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKQEAgLTAsMCArMSwxMDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgREVCVUdfRVhQUgkwCisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwllLT5sZWZ0LnN5bSA9IHN5bTsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb25lKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICpjZSkKK3sKKwlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKKwltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJZS0+dHlwZSA9IHR5cGU7CisJZS0+bGVmdC5leHByID0gY2U7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3R3byhlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKKwltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJZS0+dHlwZSA9IHR5cGU7CisJZS0+bGVmdC5leHByID0gZTE7CisJZS0+cmlnaHQuZXhwciA9IGUyOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19jb21wKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnMxLCBzdHJ1Y3Qgc3ltYm9sICpzMikKK3sKKwlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKKwltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJZS0+dHlwZSA9IHR5cGU7CisJZS0+bGVmdC5zeW0gPSBzMTsKKwllLT5yaWdodC5zeW0gPSBzMjsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCWlmICghZTEpCisJCXJldHVybiBlMjsKKwlyZXR1cm4gZTIgPyBleHByX2FsbG9jX3R3byhFX0FORCwgZTEsIGUyKSA6IGUxOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vcihzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlpZiAoIWUxKQorCQlyZXR1cm4gZTI7CisJcmV0dXJuIGUyID8gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKSA6IGUxOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9jb3B5KHN0cnVjdCBleHByICpvcmcpCit7CisJc3RydWN0IGV4cHIgKmU7CisKKwlpZiAoIW9yZykKKwkJcmV0dXJuIE5VTEw7CisKKwllID0gbWFsbG9jKHNpemVvZigqb3JnKSk7CisJbWVtY3B5KGUsIG9yZywgc2l6ZW9mKCpvcmcpKTsKKwlzd2l0Y2ggKG9yZy0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCWUtPmxlZnQgPSBvcmctPmxlZnQ7CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfY29weShvcmctPmxlZnQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJZS0+bGVmdC5zeW0gPSBvcmctPmxlZnQuc3ltOworCQllLT5yaWdodC5zeW0gPSBvcmctPnJpZ2h0LnN5bTsKKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJY2FzZSBFX0NIT0lDRToKKwkJZS0+bGVmdC5leHByID0gZXhwcl9jb3B5KG9yZy0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfY29weShvcmctPnJpZ2h0LmV4cHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoImNhbid0IGNvcHkgdHlwZSAlZFxuIiwgZS0+dHlwZSk7CisJCWZyZWUoZSk7CisJCWUgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZTsKK30KKwordm9pZCBleHByX2ZyZWUoc3RydWN0IGV4cHIgKmUpCit7CisJaWYgKCFlKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQlicmVhazsKKwljYXNlIEVfTk9UOgorCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJcmV0dXJuOworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiaG93IHRvIGZyZWUgdHlwZSAlZD9cbiIsIGUtPnR5cGUpOworCQlicmVhazsKKwl9CisJZnJlZShlKTsKK30KKworc3RhdGljIGludCB0cmFuc19jb3VudDsKKworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisKK3N0YXRpYyB2b2lkIF9fZXhwcl9lbGltaW5hdGVfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCWlmIChlMS0+dHlwZSA9PSB0eXBlKSB7CisJCV9fZXhwcl9lbGltaW5hdGVfZXEodHlwZSwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCV9fZXhwcl9lbGltaW5hdGVfZXEodHlwZSwgJmUxLT5yaWdodC5leHByLCAmZTIpOworCQlyZXR1cm47CisJfQorCWlmIChlMi0+dHlwZSA9PSB0eXBlKSB7CisJCV9fZXhwcl9lbGltaW5hdGVfZXEodHlwZSwgJmUxLCAmZTItPmxlZnQuZXhwcik7CisJCV9fZXhwcl9lbGltaW5hdGVfZXEodHlwZSwgJmUxLCAmZTItPnJpZ2h0LmV4cHIpOworCQlyZXR1cm47CisJfQorCWlmIChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJgorCSAgICBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltICYmIChlMS0+bGVmdC5zeW0tPmZsYWdzICYgKFNZTUJPTF9ZRVN8U1lNQk9MX05PKSkpCisJCXJldHVybjsKKwlpZiAoIWV4cHJfZXEoZTEsIGUyKSkKKwkJcmV0dXJuOworCXRyYW5zX2NvdW50Kys7CisJZXhwcl9mcmVlKGUxKTsgZXhwcl9mcmVlKGUyKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVfT1I6CisJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KK30KKwordm9pZCBleHByX2VsaW1pbmF0ZV9lcShzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJaWYgKCFlMSB8fCAhZTIpCisJCXJldHVybjsKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCV9fZXhwcl9lbGltaW5hdGVfZXEoZTEtPnR5cGUsIGVwMSwgZXAyKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCWlmIChlMS0+dHlwZSAhPSBlMi0+dHlwZSkgc3dpdGNoIChlMi0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlfX2V4cHJfZWxpbWluYXRlX2VxKGUyLT50eXBlLCBlcDEsIGVwMik7CisJZGVmYXVsdDoKKwkJOworCX0KKwllMSA9IGV4cHJfZWxpbWluYXRlX3luKGUxKTsKKwllMiA9IGV4cHJfZWxpbWluYXRlX3luKGUyKTsKK30KKworI3VuZGVmIGUxCisjdW5kZWYgZTIKKworaW50IGV4cHJfZXEoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaW50IHJlcywgb2xkX2NvdW50OworCisJaWYgKGUxLT50eXBlICE9IGUyLT50eXBlKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlyZXR1cm4gZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSAmJiBlMS0+cmlnaHQuc3ltID09IGUyLT5yaWdodC5zeW07CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW07CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIGV4cHJfZXEoZTEtPmxlZnQuZXhwciwgZTItPmxlZnQuZXhwcik7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJCWUxID0gZXhwcl9jb3B5KGUxKTsKKwkJZTIgPSBleHByX2NvcHkoZTIpOworCQlvbGRfY291bnQgPSB0cmFuc19jb3VudDsKKwkJZXhwcl9lbGltaW5hdGVfZXEoJmUxLCAmZTIpOworCQlyZXMgPSAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYKKwkJICAgICAgIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0pOworCQlleHByX2ZyZWUoZTEpOworCQlleHByX2ZyZWUoZTIpOworCQl0cmFuc19jb3VudCA9IG9sZF9jb3VudDsKKwkJcmV0dXJuIHJlczsKKwljYXNlIEVfQ0hPSUNFOgorCWNhc2UgRV9SQU5HRToKKwljYXNlIEVfTk9ORToKKwkJLyogcGFuaWMgKi87CisJfQorCisJaWYgKERFQlVHX0VYUFIpIHsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiID0gIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIiA/XG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKQoreworCXN0cnVjdCBleHByICp0bXA7CisKKwlpZiAoZSkgc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPnJpZ2h0LmV4cHIpOworCQlpZiAoZS0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbm87CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9IGVsc2UgaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJdG1wID0gZS0+cmlnaHQuZXhwcjsKKwkJCQkqZSA9ICooZS0+cmlnaHQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWlmIChlLT5yaWdodC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCWZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCSplID0gKihlLT5sZWZ0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIEVfT1I6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5yaWdodC5leHByKTsKKwkJaWYgKGUtPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQl0bXAgPSBlLT5yaWdodC5leHByOworCQkJCSplID0gKihlLT5yaWdodC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9IGVsc2UgaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJaWYgKGUtPnJpZ2h0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJKmUgPSAqKGUtPmxlZnQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5yaWdodC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBlOworfQorCisvKgorICogYm9vbCBGT08hPW4gPT4gRk9PCisgKi8KK3N0cnVjdCBleHByICpleHByX3RyYW5zX2Jvb2woc3RydWN0IGV4cHIgKmUpCit7CisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwljYXNlIEVfTk9UOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX3RyYW5zX2Jvb2woZS0+bGVmdC5leHByKTsKKwkJZS0+cmlnaHQuZXhwciA9IGV4cHJfdHJhbnNfYm9vbChlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCS8vIEZPTyE9biAtPiBGT08KKwkJaWYgKGUtPmxlZnQuc3ltLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBlMSB8fCBlMiAtPiA/CisgKi8KK3N0cnVjdCBleHByICpleHByX2pvaW5fb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKnRtcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0xLCAqc3ltMjsKKworCWlmIChleHByX2VxKGUxLCBlMikpCisJCXJldHVybiBleHByX2NvcHkoZTEpOworCWlmIChlMS0+dHlwZSAhPSBFX0VRVUFMICYmIGUxLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMS0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUyLT50eXBlICE9IEVfRVFVQUwgJiYgZTItPnR5cGUgIT0gRV9VTkVRVUFMICYmIGUyLT50eXBlICE9IEVfU1lNQk9MICYmIGUyLT50eXBlICE9IEVfTk9UKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZTEtPnR5cGUgPT0gRV9OT1QpIHsKKwkJdG1wID0gZTEtPmxlZnQuZXhwcjsKKwkJaWYgKHRtcC0+dHlwZSAhPSBFX0VRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1VORVFVQUwgJiYgdG1wLT50eXBlICE9IEVfU1lNQk9MKQorCQkJcmV0dXJuIE5VTEw7CisJCXN5bTEgPSB0bXAtPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0xID0gZTEtPmxlZnQuc3ltOworCWlmIChlMi0+dHlwZSA9PSBFX05PVCkgeworCQlpZiAoZTItPmxlZnQuZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0yID0gZTItPmxlZnQuZXhwci0+bGVmdC5zeW07CisJfSBlbHNlCisJCXN5bTIgPSBlMi0+bGVmdC5zeW07CisJaWYgKHN5bTEgIT0gc3ltMikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bTEtPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bTEtPnR5cGUgIT0gU19UUklTVEFURSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bTEtPnR5cGUgPT0gU19UUklTVEFURSkgeworCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpIHsKKwkJCS8vIChhPSd5JykgfHwgKGE9J20nKSAtPiAoYSE9J24nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsIHN5bTEsICZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYKKwkJICAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCSAgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpIHsKKwkJCS8vIChhPSd5JykgfHwgKGE9J24nKSAtPiAoYSE9J20nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsIHN5bTEsICZzeW1ib2xfbW9kKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkgICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkpKSB7CisJCQkvLyAoYT0nbScpIHx8IChhPSduJykgLT4gKGEhPSd5JykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisJCX0KKwl9CisJaWYgKHN5bTEtPnR5cGUgPT0gU19CT09MRUFOICYmIHN5bTEgPT0gc3ltMikgeworCQlpZiAoKGUxLT50eXBlID09IEVfTk9UICYmIGUxLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wpIHx8CisJCSAgICAoZTItPnR5cGUgPT0gRV9OT1QgJiYgZTItPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1NZTUJPTCkpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCX0KKworCWlmIChERUJVR19FWFBSKSB7CisJCXByaW50Zigib3B0aW1pemUgKCIpOworCQlleHByX2ZwcmludChlMSwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpIHx8ICgiKTsKKwkJZXhwcl9mcHJpbnQoZTIsIHN0ZG91dCk7CisJCXByaW50ZigiKT9cbiIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfam9pbl9hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKnRtcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0xLCAqc3ltMjsKKworCWlmIChleHByX2VxKGUxLCBlMikpCisJCXJldHVybiBleHByX2NvcHkoZTEpOworCWlmIChlMS0+dHlwZSAhPSBFX0VRVUFMICYmIGUxLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMS0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUyLT50eXBlICE9IEVfRVFVQUwgJiYgZTItPnR5cGUgIT0gRV9VTkVRVUFMICYmIGUyLT50eXBlICE9IEVfU1lNQk9MICYmIGUyLT50eXBlICE9IEVfTk9UKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZTEtPnR5cGUgPT0gRV9OT1QpIHsKKwkJdG1wID0gZTEtPmxlZnQuZXhwcjsKKwkJaWYgKHRtcC0+dHlwZSAhPSBFX0VRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1VORVFVQUwgJiYgdG1wLT50eXBlICE9IEVfU1lNQk9MKQorCQkJcmV0dXJuIE5VTEw7CisJCXN5bTEgPSB0bXAtPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0xID0gZTEtPmxlZnQuc3ltOworCWlmIChlMi0+dHlwZSA9PSBFX05PVCkgeworCQlpZiAoZTItPmxlZnQuZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0yID0gZTItPmxlZnQuZXhwci0+bGVmdC5zeW07CisJfSBlbHNlCisJCXN5bTIgPSBlMi0+bGVmdC5zeW07CisJaWYgKHN5bTEgIT0gc3ltMikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bTEtPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bTEtPnR5cGUgIT0gU19UUklTVEFURSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgfHwKKwkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpCisJCS8vIChhKSAmJiAoYT0neScpIC0+IChhPSd5JykKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisKKwlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSkKKwkJLy8gKGEpICYmIChhIT0nbicpIC0+IChhKQorCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woc3ltMSk7CisKKwlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKQorCQkvLyAoYSkgJiYgKGEhPSdtJykgLT4gKGE9J3knKQorCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKworCWlmIChzeW0xLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMKSB7CisJCQkvLyAoYT0nYicpICYmIChhIT0nYycpIC0+ICdiJz0nYycgPyAnbicgOiBhPSdiJworCQkJc3ltMiA9IGUxLT5yaWdodC5zeW07CisJCQlpZiAoKGUyLT5yaWdodC5zeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUKSAmJiAoc3ltMi0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpKQorCQkJCXJldHVybiBzeW0yICE9IGUyLT5yaWdodC5zeW0gPyBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgc3ltMikKKwkJCQkJCQkgICAgIDogZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMKSB7CisJCQkvLyAoYT0nYicpICYmIChhIT0nYycpIC0+ICdiJz0nYycgPyAnbicgOiBhPSdiJworCQkJc3ltMiA9IGUyLT5yaWdodC5zeW07CisJCQlpZiAoKGUxLT5yaWdodC5zeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUKSAmJiAoc3ltMi0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpKQorCQkJCXJldHVybiBzeW0yICE9IGUxLT5yaWdodC5zeW0gPyBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgc3ltMikKKwkJCQkJCQkgICAgIDogZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSkpCisJCQkvLyAoYSE9J3knKSAmJiAoYSE9J24nKSAtPiAoYT0nbScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfbW9kKTsKKworCQlpZiAoZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJgorCQkJICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKQorCQkJLy8gKGEhPSd5JykgJiYgKGEhPSdtJykgLT4gKGE9J24nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX25vKTsKKworCQlpZiAoZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCAmJgorCQkJICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJCSAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKSkKKwkJCS8vIChhIT0nbScpICYmIChhIT0nbicpIC0+IChhPSdtJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCisJCWlmICgoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgIChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgfHwKKwkJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoREVCVUdfRVhQUikgeworCQlwcmludGYoIm9wdGltaXplICgiKTsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiKSAmJiAoIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIik/XG4iKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfZWxpbWluYXRlX2R1cHMxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCXN0cnVjdCBleHByICp0bXA7CisKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLT5yaWdodC5leHByLCAmZTIpOworCQlyZXR1cm47CisJfQorCWlmIChlMi0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGUxID09IGUyKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOiBjYXNlIEVfQU5EOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMShlMS0+dHlwZSwgJmUxLCAmZTEpOworCWRlZmF1bHQ6CisJCTsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVfT1I6CisJCXRtcCA9IGV4cHJfam9pbl9vcihlMSwgZTIpOworCQlpZiAodG1wKSB7CisJCQlleHByX2ZyZWUoZTEpOyBleHByX2ZyZWUoZTIpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCWUyID0gdG1wOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQl0bXAgPSBleHByX2pvaW5fYW5kKGUxLCBlMik7CisJCWlmICh0bXApIHsKKwkJCWV4cHJfZnJlZShlMSk7IGV4cHJfZnJlZShlMik7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJCWUyID0gdG1wOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorI3VuZGVmIGUxCisjdW5kZWYgZTIKK30KKworc3RhdGljIHZvaWQgZXhwcl9lbGltaW5hdGVfZHVwczIoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisJc3RydWN0IGV4cHIgKnRtcCwgKnRtcDEsICp0bXAyOworCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLCAmZTItPnJpZ2h0LmV4cHIpOworCX0KKwlpZiAoZTEgPT0gZTIpCisJCXJldHVybjsKKworCXN3aXRjaCAoZTEtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUxLT50eXBlLCAmZTEsICZlMSk7CisJCS8vIChGT08gfHwgQkFSKSAmJiAoIUZPTyAmJiAhQkFSKSAtPiBuCisJCXRtcDEgPSBleHByX3RyYW5zZm9ybShleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUxKSkpOworCQl0bXAyID0gZXhwcl9jb3B5KGUyKTsKKwkJdG1wID0gZXhwcl9leHRyYWN0X2VxX2FuZCgmdG1wMSwgJnRtcDIpOworCQlpZiAoZXhwcl9pc195ZXModG1wMSkpIHsKKwkJCWV4cHJfZnJlZShlMSk7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlleHByX2ZyZWUodG1wMik7CisJCWV4cHJfZnJlZSh0bXAxKTsKKwkJZXhwcl9mcmVlKHRtcCk7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUxLT50eXBlLCAmZTEsICZlMSk7CisJCS8vIChGT08gJiYgQkFSKSB8fCAoIUZPTyB8fCAhQkFSKSAtPiB5CisJCXRtcDEgPSBleHByX3RyYW5zZm9ybShleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUxKSkpOworCQl0bXAyID0gZXhwcl9jb3B5KGUyKTsKKwkJdG1wID0gZXhwcl9leHRyYWN0X2VxX29yKCZ0bXAxLCAmdG1wMik7CisJCWlmIChleHByX2lzX25vKHRtcDEpKSB7CisJCQlleHByX2ZyZWUoZTEpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQl0cmFuc19jb3VudCsrOworCQl9CisJCWV4cHJfZnJlZSh0bXAyKTsKKwkJZXhwcl9mcmVlKHRtcDEpOworCQlleHByX2ZyZWUodG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKyN1bmRlZiBlMQorI3VuZGVmIGUyCit9CisKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV9kdXBzKHN0cnVjdCBleHByICplKQoreworCWludCBvbGRjb3VudDsKKwlpZiAoIWUpCisJCXJldHVybiBlOworCisJb2xkY291bnQgPSB0cmFuc19jb3VudDsKKwl3aGlsZSAoMSkgeworCQl0cmFuc19jb3VudCA9IDA7CisJCXN3aXRjaCAoZS0+dHlwZSkgeworCQljYXNlIEVfT1I6IGNhc2UgRV9BTkQ6CisJCQlleHByX2VsaW1pbmF0ZV9kdXBzMShlLT50eXBlLCAmZSwgJmUpOworCQkJZXhwcl9lbGltaW5hdGVfZHVwczIoZS0+dHlwZSwgJmUsICZlKTsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCQlpZiAoIXRyYW5zX2NvdW50KQorCQkJYnJlYWs7CisJCWUgPSBleHByX2VsaW1pbmF0ZV95bihlKTsKKwl9CisJdHJhbnNfY291bnQgPSBvbGRjb3VudDsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNmb3JtKHN0cnVjdCBleHByICplKQoreworCXN0cnVjdCBleHByICp0bXA7CisKKwlpZiAoIWUpCisJCXJldHVybiBOVUxMOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwljYXNlIEVfU1lNQk9MOgorCWNhc2UgRV9DSE9JQ0U6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfdHJhbnNmb3JtKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX3RyYW5zZm9ybShlLT5yaWdodC5leHByKTsKKwl9CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfRVFVQUw6CisJCWlmIChlLT5sZWZ0LnN5bS0+dHlwZSAhPSBTX0JPT0xFQU4pCisJCQlicmVhazsKKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQllLT50eXBlID0gRV9OT1Q7CisJCQllLT5sZWZ0LmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChlLT5sZWZ0LnN5bSk7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgeworCQkJcHJpbnRmKCJib29sZWFuIHN5bWJvbCAlcyB0ZXN0ZWQgZm9yICdtJz8gdGVzdCBmb3JjZWQgdG8gJ24nXG4iLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbm87CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAoZS0+bGVmdC5zeW0tPnR5cGUgIT0gU19CT09MRUFOKQorCQkJYnJlYWs7CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCXByaW50ZigiYm9vbGVhbiBzeW1ib2wgJXMgdGVzdGVkIGZvciAnbSc/IHRlc3QgZm9yY2VkIHRvICd5J1xuIiwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQllLT50eXBlID0gRV9OT1Q7CisJCQllLT5sZWZ0LmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChlLT5sZWZ0LnN5bSk7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJc3dpdGNoIChlLT5sZWZ0LmV4cHItPnR5cGUpIHsKKwkJY2FzZSBFX05PVDoKKwkJCS8vICEhYSAtPiBhCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHItPmxlZnQuZXhwcjsKKwkJCWZyZWUoZS0+bGVmdC5leHByKTsKKwkJCWZyZWUoZSk7CisJCQllID0gdG1wOworCQkJZSA9IGV4cHJfdHJhbnNmb3JtKGUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9FUVVBTDoKKwkJY2FzZSBFX1VORVFVQUw6CisJCQkvLyAhYT0neCcgLT4gYSE9J3gnCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQlmcmVlKGUpOworCQkJZSA9IHRtcDsKKwkJCWUtPnR5cGUgPSBlLT50eXBlID09IEVfRVFVQUwgPyBFX1VORVFVQUwgOiBFX0VRVUFMOworCQkJYnJlYWs7CisJCWNhc2UgRV9PUjoKKwkJCS8vICEoYSB8fCBiKSAtPiAhYSAmJiAhYgorCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJZS0+dHlwZSA9IEVfQU5EOworCQkJZS0+cmlnaHQuZXhwciA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCB0bXAtPnJpZ2h0LmV4cHIpOworCQkJdG1wLT50eXBlID0gRV9OT1Q7CisJCQl0bXAtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJZSA9IGV4cHJfdHJhbnNmb3JtKGUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9BTkQ6CisJCQkvLyAhKGEgJiYgYikgLT4gIWEgfHwgIWIKKwkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCWUtPnR5cGUgPSBFX09SOworCQkJZS0+cmlnaHQuZXhwciA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCB0bXAtPnJpZ2h0LmV4cHIpOworCQkJdG1wLT50eXBlID0gRV9OT1Q7CisJCQl0bXAtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJZSA9IGV4cHJfdHJhbnNmb3JtKGUpOworCQkJYnJlYWs7CisJCWNhc2UgRV9TWU1CT0w6CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJCS8vICEneScgLT4gJ24nCisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCWZyZWUoZSk7CisJCQkJZSA9IHRtcDsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCQkvLyAhJ20nIC0+ICdtJworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQlmcmVlKGUpOworCQkJCWUgPSB0bXA7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9tb2Q7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZS0+bGVmdC5leHByLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX25vKSB7CisJCQkJLy8gISduJyAtPiAneScKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJZnJlZShlKTsKKwkJCQllID0gdG1wOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZTsKK30KKworaW50IGV4cHJfY29udGFpbnNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlpZiAoIWRlcCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGRlcC0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCQlyZXR1cm4gZXhwcl9jb250YWluc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSkgfHwKKwkJICAgICAgIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+cmlnaHQuZXhwciwgc3ltKTsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gZGVwLT5sZWZ0LnN5bSA9PSBzeW07CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlyZXR1cm4gZGVwLT5sZWZ0LnN5bSA9PSBzeW0gfHwKKwkJICAgICAgIGRlcC0+cmlnaHQuc3ltID09IHN5bTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gZXhwcl9jb250YWluc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSk7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gMDsKK30KKworYm9vbCBleHByX2RlcGVuZHNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlpZiAoIWRlcCkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChkZXAtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCQlyZXR1cm4gZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAtPmxlZnQuZXhwciwgc3ltKSB8fAorCQkgICAgICAgZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAtPnJpZ2h0LmV4cHIsIHN5bSk7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltOworCWNhc2UgRV9FUVVBTDoKKwkJaWYgKGRlcC0+bGVmdC5zeW0gPT0gc3ltKSB7CisJCQlpZiAoZGVwLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgfHwgZGVwLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCWlmIChkZXAtPmxlZnQuc3ltID09IHN5bSkgeworCQkJaWYgKGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfYW5kKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wID0gTlVMTDsKKwlleHByX2V4dHJhY3RfZXEoRV9BTkQsICZ0bXAsIGVwMSwgZXAyKTsKKwlpZiAodG1wKSB7CisJCSplcDEgPSBleHByX2VsaW1pbmF0ZV95bigqZXAxKTsKKwkJKmVwMiA9IGV4cHJfZWxpbWluYXRlX3luKCplcDIpOworCX0KKwlyZXR1cm4gdG1wOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX29yKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wID0gTlVMTDsKKwlleHByX2V4dHJhY3RfZXEoRV9PUiwgJnRtcCwgZXAxLCBlcDIpOworCWlmICh0bXApIHsKKwkJKmVwMSA9IGV4cHJfZWxpbWluYXRlX3luKCplcDEpOworCQkqZXAyID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMik7CisJfQorCXJldHVybiB0bXA7Cit9CisKK3ZvaWQgZXhwcl9leHRyYWN0X2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCWlmIChlMS0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZXh0cmFjdF9lcSh0eXBlLCBlcCwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCWV4cHJfZXh0cmFjdF9lcSh0eXBlLCBlcCwgJmUxLT5yaWdodC5leHByLCAmZTIpOworCQlyZXR1cm47CisJfQorCWlmIChlMi0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZXh0cmFjdF9lcSh0eXBlLCBlcCwgZXAxLCAmZTItPmxlZnQuZXhwcik7CisJCWV4cHJfZXh0cmFjdF9lcSh0eXBlLCBlcCwgZXAxLCAmZTItPnJpZ2h0LmV4cHIpOworCQlyZXR1cm47CisJfQorCWlmIChleHByX2VxKGUxLCBlMikpIHsKKwkJKmVwID0gKmVwID8gZXhwcl9hbGxvY190d28odHlwZSwgKmVwLCBlMSkgOiBlMTsKKwkJZXhwcl9mcmVlKGUyKTsKKwkJaWYgKHR5cGUgPT0gRV9BTkQpIHsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJZTIgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBFX09SKSB7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJZTIgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJfQorCX0KKyN1bmRlZiBlMQorI3VuZGVmIGUyCit9CisKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2NvbXBhcmUoc3RydWN0IGV4cHIgKmUsIGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgZXhwciAqZTEsICplMjsKKworCWlmICghZSkgeworCQllID0gZXhwcl9hbGxvY19zeW1ib2woc3ltKTsKKwkJaWYgKHR5cGUgPT0gRV9VTkVRVUFMKQorCQkJZSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBlKTsKKwkJcmV0dXJuIGU7CisJfQorCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJCWUxID0gZXhwcl90cmFuc19jb21wYXJlKGUtPmxlZnQuZXhwciwgRV9FUVVBTCwgc3ltKTsKKwkJZTIgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+cmlnaHQuZXhwciwgRV9FUVVBTCwgc3ltKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCWUgPSBleHByX2FsbG9jX3R3byhFX0FORCwgZTEsIGUyKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfT1IsIGUxLCBlMik7CisJCWlmICh0eXBlID09IEVfVU5FUVVBTCkKKwkJCWUgPSBleHByX2FsbG9jX29uZShFX05PVCwgZSk7CisJCXJldHVybiBlOworCWNhc2UgRV9PUjoKKwkJZTEgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+bGVmdC5leHByLCBFX0VRVUFMLCBzeW0pOworCQllMiA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5yaWdodC5leHByLCBFX0VRVUFMLCBzeW0pOworCQlpZiAoc3ltID09ICZzeW1ib2xfeWVzKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfT1IsIGUxLCBlMik7CisJCWlmIChzeW0gPT0gJnN5bWJvbF9ubykKKwkJCWUgPSBleHByX2FsbG9jX3R3byhFX0FORCwgZTEsIGUyKTsKKwkJaWYgKHR5cGUgPT0gRV9VTkVRVUFMKQorCQkJZSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBlKTsKKwkJcmV0dXJuIGU7CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIGV4cHJfdHJhbnNfY29tcGFyZShlLT5sZWZ0LmV4cHIsIHR5cGUgPT0gRV9FUVVBTCA/IEVfVU5FUVVBTCA6IEVfRVFVQUwsIHN5bSk7CisJY2FzZSBFX1VORVFVQUw6CisJY2FzZSBFX0VRVUFMOgorCQlpZiAodHlwZSA9PSBFX0VRVUFMKSB7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfeWVzKQorCQkJCXJldHVybiBleHByX2NvcHkoZSk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbW9kKQorCQkJCXJldHVybiBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF9ubykKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfeWVzKQorCQkJCXJldHVybiBleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUpKTsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF9tb2QpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF9ubykKKwkJCQlyZXR1cm4gZXhwcl9jb3B5KGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBleHByX2FsbG9jX2NvbXAodHlwZSwgZS0+bGVmdC5zeW0sIHN5bSk7CisJY2FzZSBFX0NIT0lDRToKKwljYXNlIEVfUkFOR0U6CisJY2FzZSBFX05PTkU6CisJCS8qIHBhbmljICovOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordHJpc3RhdGUgZXhwcl9jYWxjX3ZhbHVlKHN0cnVjdCBleHByICplKQoreworCXRyaXN0YXRlIHZhbDEsIHZhbDI7CisJY29uc3QgY2hhciAqc3RyMSwgKnN0cjI7CisKKwlpZiAoIWUpCisJCXJldHVybiB5ZXM7CisKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXJldHVybiBlLT5sZWZ0LnN5bS0+Y3Vyci50cmk7CisJY2FzZSBFX0FORDoKKwkJdmFsMSA9IGV4cHJfY2FsY192YWx1ZShlLT5sZWZ0LmV4cHIpOworCQl2YWwyID0gZXhwcl9jYWxjX3ZhbHVlKGUtPnJpZ2h0LmV4cHIpOworCQlyZXR1cm4gRV9BTkQodmFsMSwgdmFsMik7CisJY2FzZSBFX09SOgorCQl2YWwxID0gZXhwcl9jYWxjX3ZhbHVlKGUtPmxlZnQuZXhwcik7CisJCXZhbDIgPSBleHByX2NhbGNfdmFsdWUoZS0+cmlnaHQuZXhwcik7CisJCXJldHVybiBFX09SKHZhbDEsIHZhbDIpOworCWNhc2UgRV9OT1Q6CisJCXZhbDEgPSBleHByX2NhbGNfdmFsdWUoZS0+bGVmdC5leHByKTsKKwkJcmV0dXJuIEVfTk9UKHZhbDEpOworCWNhc2UgRV9FUVVBTDoKKwkJc3ltX2NhbGNfdmFsdWUoZS0+bGVmdC5zeW0pOworCQlzeW1fY2FsY192YWx1ZShlLT5yaWdodC5zeW0pOworCQlzdHIxID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoZS0+bGVmdC5zeW0pOworCQlzdHIyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoZS0+cmlnaHQuc3ltKTsKKwkJcmV0dXJuICFzdHJjbXAoc3RyMSwgc3RyMikgPyB5ZXMgOiBubzsKKwljYXNlIEVfVU5FUVVBTDoKKwkJc3ltX2NhbGNfdmFsdWUoZS0+bGVmdC5zeW0pOworCQlzeW1fY2FsY192YWx1ZShlLT5yaWdodC5zeW0pOworCQlzdHIxID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoZS0+bGVmdC5zeW0pOworCQlzdHIyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoZS0+cmlnaHQuc3ltKTsKKwkJcmV0dXJuICFzdHJjbXAoc3RyMSwgc3RyMikgPyBubyA6IHllczsKKwlkZWZhdWx0OgorCQlwcmludGYoImV4cHJfY2FsY192YWx1ZTogJWQ/XG4iLCBlLT50eXBlKTsKKwkJcmV0dXJuIG5vOworCX0KK30KKworaW50IGV4cHJfY29tcGFyZV90eXBlKGVudW0gZXhwcl90eXBlIHQxLCBlbnVtIGV4cHJfdHlwZSB0MikKK3sKKyNpZiAwCisJcmV0dXJuIDE7CisjZWxzZQorCWlmICh0MSA9PSB0MikKKwkJcmV0dXJuIDA7CisJc3dpdGNoICh0MSkgeworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJaWYgKHQyID09IEVfTk9UKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX05PVDoKKwkJaWYgKHQyID09IEVfQU5EKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX0FORDoKKwkJaWYgKHQyID09IEVfT1IpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfT1I6CisJCWlmICh0MiA9PSBFX0NIT0lDRSkKKwkJCXJldHVybiAxOworCWNhc2UgRV9DSE9JQ0U6CisJCWlmICh0MiA9PSAwKQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIlslZGd0JWQ/XSIsIHQxLCB0Mik7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKwordm9pZCBleHByX3ByaW50KHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikKK3sKKwlpZiAoIWUpIHsKKwkJZm4oZGF0YSwgInkiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChleHByX2NvbXBhcmVfdHlwZShwcmV2dG9rZW4sIGUtPnR5cGUpID4gMCkKKwkJZm4oZGF0YSwgIigiKTsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQlpZiAoZS0+bGVmdC5zeW0tPm5hbWUpCisJCQlmbihkYXRhLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCWVsc2UKKwkJCWZuKGRhdGEsICI8Y2hvaWNlPiIpOworCQlicmVhazsKKwljYXNlIEVfTk9UOgorCQlmbihkYXRhLCAiISIpOworCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfTk9UKTsKKwkJYnJlYWs7CisJY2FzZSBFX0VRVUFMOgorCQlmbihkYXRhLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCWZuKGRhdGEsICI9Iik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQlmbihkYXRhLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCWZuKGRhdGEsICIhPSIpOworCQlmbihkYXRhLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlicmVhazsKKwljYXNlIEVfT1I6CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9PUik7CisJCWZuKGRhdGEsICIgfHwgIik7CisJCWV4cHJfcHJpbnQoZS0+cmlnaHQuZXhwciwgZm4sIGRhdGEsIEVfT1IpOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfQU5EKTsKKwkJZm4oZGF0YSwgIiAmJiAiKTsKKwkJZXhwcl9wcmludChlLT5yaWdodC5leHByLCBmbiwgZGF0YSwgRV9BTkQpOworCQlicmVhazsKKwljYXNlIEVfQ0hPSUNFOgorCQlmbihkYXRhLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlpZiAoZS0+bGVmdC5leHByKSB7CisJCQlmbihkYXRhLCAiIF4gIik7CisJCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfQ0hPSUNFKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfUkFOR0U6CisJCWZuKGRhdGEsICJbIik7CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIiAiKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIl0iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkgIHsKKwkJY2hhciBidWZbMzJdOworCQlzcHJpbnRmKGJ1ZiwgIjx1bmtub3duIHR5cGUgJWQ+IiwgZS0+dHlwZSk7CisJCWZuKGRhdGEsIGJ1Zik7CisJCWJyZWFrOworCSAgfQorCX0KKwlpZiAoZXhwcl9jb21wYXJlX3R5cGUocHJldnRva2VuLCBlLT50eXBlKSA+IDApCisJCWZuKGRhdGEsICIpIik7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZmlsZV9oZWxwZXIodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCWZ3cml0ZShzdHIsIHN0cmxlbihzdHIpLCAxLCBkYXRhKTsKK30KKwordm9pZCBleHByX2ZwcmludChzdHJ1Y3QgZXhwciAqZSwgRklMRSAqb3V0KQoreworCWV4cHJfcHJpbnQoZSwgZXhwcl9wcmludF9maWxlX2hlbHBlciwgb3V0LCBFX05PTkUpOworfQorCitzdGF0aWMgdm9pZCBleHByX3ByaW50X2dzdHJfaGVscGVyKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdHJfYXBwZW5kKChzdHJ1Y3QgZ3N0ciopZGF0YSwgc3RyKTsKK30KKwordm9pZCBleHByX2dzdHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHN0cnVjdCBnc3RyICpncykKK3sKKwlleHByX3ByaW50KGUsIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIsIGdzLCBFX05PTkUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuaCBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaWZuZGVmIEVYUFJfSAorI2RlZmluZSBFWFBSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjZW5kaWYKKworc3RydWN0IGZpbGUgeworCXN0cnVjdCBmaWxlICpuZXh0OworCXN0cnVjdCBmaWxlICpwYXJlbnQ7CisJY2hhciAqbmFtZTsKKwlpbnQgbGluZW5vOworCWludCBmbGFnczsKK307CisKKyNkZWZpbmUgRklMRV9CVVNZCQkweDAwMDEKKyNkZWZpbmUgRklMRV9TQ0FOTkVECQkweDAwMDIKKyNkZWZpbmUgRklMRV9QUklOVEVECQkweDAwMDQKKwordHlwZWRlZiBlbnVtIHRyaXN0YXRlIHsKKwlubywgbW9kLCB5ZXMKK30gdHJpc3RhdGU7CisKK2VudW0gZXhwcl90eXBlIHsKKwlFX05PTkUsIEVfT1IsIEVfQU5ELCBFX05PVCwgRV9FUVVBTCwgRV9VTkVRVUFMLCBFX0NIT0lDRSwgRV9TWU1CT0wsIEVfUkFOR0UKK307CisKK3VuaW9uIGV4cHJfZGF0YSB7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IHN5bWJvbCAqc3ltOworfTsKKworc3RydWN0IGV4cHIgeworCWVudW0gZXhwcl90eXBlIHR5cGU7CisJdW5pb24gZXhwcl9kYXRhIGxlZnQsIHJpZ2h0OworfTsKKworI2RlZmluZSBFX09SKGRlcDEsIGRlcDIpCSgoKGRlcDEpPihkZXAyKSk/KGRlcDEpOihkZXAyKSkKKyNkZWZpbmUgRV9BTkQoZGVwMSwgZGVwMikJKCgoZGVwMSk8KGRlcDIpKT8oZGVwMSk6KGRlcDIpKQorI2RlZmluZSBFX05PVChkZXApCQkoMi0oZGVwKSkKKworc3RydWN0IGV4cHJfdmFsdWUgeworCXN0cnVjdCBleHByICpleHByOworCXRyaXN0YXRlIHRyaTsKK307CisKK3N0cnVjdCBzeW1ib2xfdmFsdWUgeworCXZvaWQgKnZhbDsKKwl0cmlzdGF0ZSB0cmk7Cit9OworCitlbnVtIHN5bWJvbF90eXBlIHsKKwlTX1VOS05PV04sIFNfQk9PTEVBTiwgU19UUklTVEFURSwgU19JTlQsIFNfSEVYLCBTX1NUUklORywgU19PVEhFUgorfTsKKworc3RydWN0IHN5bWJvbCB7CisJc3RydWN0IHN5bWJvbCAqbmV4dDsKKwljaGFyICpuYW1lOworCWNoYXIgKmhlbHA7CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlOworCXN0cnVjdCBzeW1ib2xfdmFsdWUgY3VyciwgdXNlcjsKKwl0cmlzdGF0ZSB2aXNpYmxlOworCWludCBmbGFnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmRlcCwgKmRlcDI7CisJc3RydWN0IGV4cHJfdmFsdWUgcmV2X2RlcDsKK307CisKKyNkZWZpbmUgZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKSBmb3IgKHN5bSA9IHN5bWJvbF9oYXNoW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkgaWYgKHN5bS0+dHlwZSAhPSBTX09USEVSKQorCisjZGVmaW5lIFNZTUJPTF9ZRVMJCTB4MDAwMQorI2RlZmluZSBTWU1CT0xfTU9ECQkweDAwMDIKKyNkZWZpbmUgU1lNQk9MX05PCQkweDAwMDQKKyNkZWZpbmUgU1lNQk9MX0NPTlNUCQkweDAwMDcKKyNkZWZpbmUgU1lNQk9MX0NIRUNLCQkweDAwMDgKKyNkZWZpbmUgU1lNQk9MX0NIT0lDRQkJMHgwMDEwCisjZGVmaW5lIFNZTUJPTF9DSE9JQ0VWQUwJMHgwMDIwCisjZGVmaW5lIFNZTUJPTF9QUklOVEVECQkweDAwNDAKKyNkZWZpbmUgU1lNQk9MX1ZBTElECQkweDAwODAKKyNkZWZpbmUgU1lNQk9MX09QVElPTkFMCQkweDAxMDAKKyNkZWZpbmUgU1lNQk9MX1dSSVRFCQkweDAyMDAKKyNkZWZpbmUgU1lNQk9MX0NIQU5HRUQJCTB4MDQwMAorI2RlZmluZSBTWU1CT0xfTkVXCQkweDA4MDAKKyNkZWZpbmUgU1lNQk9MX0FVVE8JCTB4MTAwMAorI2RlZmluZSBTWU1CT0xfQ0hFQ0tFRAkJMHgyMDAwCisjZGVmaW5lIFNZTUJPTF9XQVJORUQJCTB4ODAwMAorCisjZGVmaW5lIFNZTUJPTF9NQVhMRU5HVEgJMjU2CisjZGVmaW5lIFNZTUJPTF9IQVNIU0laRQkJMjU3CisjZGVmaW5lIFNZTUJPTF9IQVNITUFTSwkJMHhmZgorCitlbnVtIHByb3BfdHlwZSB7CisJUF9VTktOT1dOLCBQX1BST01QVCwgUF9DT01NRU5ULCBQX01FTlUsIFBfREVGQVVMVCwgUF9DSE9JQ0UsIFBfU0VMRUNULCBQX1JBTkdFCit9OworCitzdHJ1Y3QgcHJvcGVydHkgeworCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICp0ZXh0OworCXN0cnVjdCBleHByX3ZhbHVlIHZpc2libGU7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGxpbmVubzsKK307CisKKyNkZWZpbmUgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIHRvaykgXAorCWZvciAoc3QgPSBzeW0tPnByb3A7IHN0OyBzdCA9IHN0LT5uZXh0KSBcCisJCWlmIChzdC0+dHlwZSA9PSAodG9rKSkKKyNkZWZpbmUgZm9yX2FsbF9kZWZhdWx0cyhzeW0sIHN0KSBmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBzdCwgUF9ERUZBVUxUKQorI2RlZmluZSBmb3JfYWxsX2Nob2ljZXMoc3ltLCBzdCkgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIFBfQ0hPSUNFKQorI2RlZmluZSBmb3JfYWxsX3Byb21wdHMoc3ltLCBzdCkgXAorCWZvciAoc3QgPSBzeW0tPnByb3A7IHN0OyBzdCA9IHN0LT5uZXh0KSBcCisJCWlmIChzdC0+dGV4dCkKKworc3RydWN0IG1lbnUgeworCXN0cnVjdCBtZW51ICpuZXh0OworCXN0cnVjdCBtZW51ICpwYXJlbnQ7CisJc3RydWN0IG1lbnUgKmxpc3Q7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvbXB0OworCXN0cnVjdCBleHByICpkZXA7CisJdW5zaWduZWQgaW50IGZsYWdzOworCS8vY2hhciAqaGVscDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworCXZvaWQgKmRhdGE7Cit9OworCisjZGVmaW5lIE1FTlVfQ0hBTkdFRAkJMHgwMDAxCisjZGVmaW5lIE1FTlVfUk9PVAkJMHgwMDAyCisKKyNpZm5kZWYgU1dJRworCitleHRlcm4gc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqY3VycmVudF9maWxlOworc3RydWN0IGZpbGUgKmxvb2t1cF9maWxlKGNvbnN0IGNoYXIgKm5hbWUpOworCitleHRlcm4gc3RydWN0IHN5bWJvbCBzeW1ib2xfeWVzLCBzeW1ib2xfbm8sIHN5bWJvbF9tb2Q7CitleHRlcm4gc3RydWN0IHN5bWJvbCAqbW9kdWxlc19zeW07CitleHRlcm4gaW50IGNkZWJ1ZzsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb25lKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICpjZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZyk7Cit2b2lkIGV4cHJfZnJlZShzdHJ1Y3QgZXhwciAqZSk7CitpbnQgZXhwcl9lcShzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7Cit2b2lkIGV4cHJfZWxpbWluYXRlX2VxKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Cit0cmlzdGF0ZSBleHByX2NhbGNfdmFsdWUoc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2Jvb2woc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX2R1cHMoc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNmb3JtKHN0cnVjdCBleHByICplKTsKK2ludCBleHByX2NvbnRhaW5zX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworYm9vbCBleHByX2RlcGVuZHNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwordm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2NvbXBhcmUoc3RydWN0IGV4cHIgKmUsIGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CisKK3ZvaWQgZXhwcl9mcHJpbnQoc3RydWN0IGV4cHIgKmUsIEZJTEUgKm91dCk7CitzdHJ1Y3QgZ3N0cjsgLyogZm9yd2FyZCAqLwordm9pZCBleHByX2dzdHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHN0cnVjdCBnc3RyICpncyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cHJfaXNfeWVzKHN0cnVjdCBleHByICplKQoreworCXJldHVybiAhZSB8fCAoZS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cHJfaXNfbm8oc3RydWN0IGV4cHIgKmUpCit7CisJcmV0dXJuIGUgJiYgKGUtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubyk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEVYUFJfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFiMTdkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTAsMCArMSwxNjQ0IEBACisvKiBIZXkgRU1BQ1MgLSotIGxpbnV4LWMgLSotICovCisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJvbWFpbiBMaWV2aW4gPHJvbXNAdGlscC5pbmZvPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAiaW1hZ2VzLmMiCisKKyNpbmNsdWRlIDxnbGFkZS9nbGFkZS5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2RrL2dka2tleXN5bXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvLyNkZWZpbmUgREVCVUcKKworZW51bSB7CisJU0lOR0xFX1ZJRVcsIFNQTElUX1ZJRVcsIEZVTExfVklFVworfTsKKworc3RhdGljIGdpbnQgdmlld19tb2RlID0gRlVMTF9WSUVXOworc3RhdGljIGdib29sZWFuIHNob3dfbmFtZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19yYW5nZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd192YWx1ZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19hbGwgPSBGQUxTRTsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X2RlYnVnID0gRkFMU0U7CitzdGF0aWMgZ2Jvb2xlYW4gcmVzaXplYWJsZSA9IEZBTFNFOworCitzdGF0aWMgZ2Jvb2xlYW4gY29uZmlnX2NoYW5nZWQgPSBGQUxTRTsKKworc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9CisgICAgTl8oIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIik7CisKK0d0a1dpZGdldCAqbWFpbl93bmQgPSBOVUxMOworR3RrV2lkZ2V0ICp0cmVlMV93ID0gTlVMTDsJLy8gbGVmdCAgZnJhbWUKK0d0a1dpZGdldCAqdHJlZTJfdyA9IE5VTEw7CS8vIHJpZ2h0IGZyYW1lCitHdGtXaWRnZXQgKnRleHRfdyA9IE5VTEw7CitHdGtXaWRnZXQgKmhwYW5lZCA9IE5VTEw7CitHdGtXaWRnZXQgKnZwYW5lZCA9IE5VTEw7CitHdGtXaWRnZXQgKmJhY2tfYnRuID0gTlVMTDsKKworR3RrVGV4dFRhZyAqdGFnMSwgKnRhZzI7CitHZGtDb2xvciBjb2xvcjsKKworR3RrVHJlZVN0b3JlICp0cmVlMSwgKnRyZWUyLCAqdHJlZTsKK0d0a1RyZWVNb2RlbCAqbW9kZWwxLCAqbW9kZWwyOworc3RhdGljIEd0a1RyZWVJdGVyICpwYXJlbnRzWzI1Nl07CitzdGF0aWMgZ2ludCBpbmRlbnQ7CisKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudDsgLy8gY3VycmVudCBub2RlIGZvciBTSU5HTEUgdmlldworc3RhdGljIHN0cnVjdCBtZW51ICpicm93c2VkOyAvLyBicm93c2VkIG5vZGUgZm9yIFNQTElUIHZpZXcKKworZW51bSB7CisJQ09MX09QVElPTiwgQ09MX05BTUUsIENPTF9OTywgQ09MX01PRCwgQ09MX1lFUywgQ09MX1ZBTFVFLAorCUNPTF9NRU5VLCBDT0xfQ09MT1IsIENPTF9FRElULCBDT0xfUElYQlVGLAorCUNPTF9QSVhWSVMsIENPTF9CVE5WSVMsIENPTF9CVE5BQ1QsIENPTF9CVE5JTkMsIENPTF9CVE5SQUQsCisJQ09MX05VTUJFUgorfTsKKworc3RhdGljIHZvaWQgZGlzcGxheV9saXN0KHZvaWQpOworc3RhdGljIHZvaWQgZGlzcGxheV90cmVlKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGRpc3BsYXlfdHJlZV9wYXJ0KHZvaWQpOworc3RhdGljIHZvaWQgdXBkYXRlX3RyZWUoc3RydWN0IG1lbnUgKnNyYywgR3RrVHJlZUl0ZXIgKiBkc3QpOworc3RhdGljIHZvaWQgc2V0X25vZGUoR3RrVHJlZUl0ZXIgKiBub2RlLCBzdHJ1Y3QgbWVudSAqbWVudSwgZ2NoYXIgKiogcm93KTsKK3N0YXRpYyBnY2hhciAqKmZpbGxfcm93KHN0cnVjdCBtZW51ICptZW51KTsKKworCisvKiBIZWxwaW5nL0RlYnVnZ2luZyBGdW5jdGlvbnMgKi8KKworCitjb25zdCBjaGFyICpkYmdfcHJpbnRfc3R5cGUoaW50IHZhbCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCW1lbXNldChidWYsIDAsIDI1Nik7CisKKwlpZiAodmFsID09IFNfVU5LTk9XTikKKwkJc3RyY3B5KGJ1ZiwgInVua25vd24iKTsKKwlpZiAodmFsID09IFNfQk9PTEVBTikKKwkJc3RyY3B5KGJ1ZiwgImJvb2xlYW4iKTsKKwlpZiAodmFsID09IFNfVFJJU1RBVEUpCisJCXN0cmNweShidWYsICJ0cmlzdGF0ZSIpOworCWlmICh2YWwgPT0gU19JTlQpCisJCXN0cmNweShidWYsICJpbnQiKTsKKwlpZiAodmFsID09IFNfSEVYKQorCQlzdHJjcHkoYnVmLCAiaGV4Iik7CisJaWYgKHZhbCA9PSBTX1NUUklORykKKwkJc3RyY3B5KGJ1ZiwgInN0cmluZyIpOworCWlmICh2YWwgPT0gU19PVEhFUikKKwkJc3RyY3B5KGJ1ZiwgIm90aGVyIik7CisKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICpkYmdfcHJpbnRfZmxhZ3MoaW50IHZhbCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCW1lbXNldChidWYsIDAsIDI1Nik7CisKKwlpZiAodmFsICYgU1lNQk9MX1lFUykKKwkJc3RyY2F0KGJ1ZiwgInllcy8iKTsKKwlpZiAodmFsICYgU1lNQk9MX01PRCkKKwkJc3RyY2F0KGJ1ZiwgIm1vZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX05PKQorCQlzdHJjYXQoYnVmLCAibm8vIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DT05TVCkKKwkJc3RyY2F0KGJ1ZiwgImNvbnN0LyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hFQ0spCisJCXN0cmNhdChidWYsICJjaGVjay8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIT0lDRSkKKwkJc3RyY2F0KGJ1ZiwgImNob2ljZS8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIT0lDRVZBTCkKKwkJc3RyY2F0KGJ1ZiwgImNob2ljZXZhbC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX1BSSU5URUQpCisJCXN0cmNhdChidWYsICJwcmludGVkLyIpOworCWlmICh2YWwgJiBTWU1CT0xfVkFMSUQpCisJCXN0cmNhdChidWYsICJ2YWxpZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX09QVElPTkFMKQorCQlzdHJjYXQoYnVmLCAib3B0aW9uYWwvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9XUklURSkKKwkJc3RyY2F0KGJ1ZiwgIndyaXRlLyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hBTkdFRCkKKwkJc3RyY2F0KGJ1ZiwgImNoYW5nZWQvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9ORVcpCisJCXN0cmNhdChidWYsICJuZXcvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9BVVRPKQorCQlzdHJjYXQoYnVmLCAiYXV0by8iKTsKKworCWJ1ZltzdHJsZW4oYnVmKSAtIDFdID0gJ1wwJzsKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICpkYmdfcHJpbnRfcHR5cGUoaW50IHZhbCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCW1lbXNldChidWYsIDAsIDI1Nik7CisKKwlpZiAodmFsID09IFBfVU5LTk9XTikKKwkJc3RyY3B5KGJ1ZiwgInVua25vd24iKTsKKwlpZiAodmFsID09IFBfUFJPTVBUKQorCQlzdHJjcHkoYnVmLCAicHJvbXB0Iik7CisJaWYgKHZhbCA9PSBQX0NPTU1FTlQpCisJCXN0cmNweShidWYsICJjb21tZW50Iik7CisJaWYgKHZhbCA9PSBQX01FTlUpCisJCXN0cmNweShidWYsICJtZW51Iik7CisJaWYgKHZhbCA9PSBQX0RFRkFVTFQpCisJCXN0cmNweShidWYsICJkZWZhdWx0Iik7CisJaWYgKHZhbCA9PSBQX0NIT0lDRSkKKwkJc3RyY3B5KGJ1ZiwgImNob2ljZSIpOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoIiVzIiwgYnVmKTsKKyNlbmRpZgorCisJcmV0dXJuIGJ1ZjsKK30KKworCit2b2lkIHJlcGxhY2VfYnV0dG9uX2ljb24oR2xhZGVYTUwgKiB4bWwsIEdka0RyYXdhYmxlICogd2luZG93LAorCQkJIEd0a1N0eWxlICogc3R5bGUsIGdjaGFyICogYnRuX25hbWUsIGdjaGFyICoqIHhwbSkKK3sKKwlHZGtQaXhtYXAgKnBpeG1hcDsKKwlHZGtCaXRtYXAgKm1hc2s7CisJR3RrVG9vbEJ1dHRvbiAqYnV0dG9uOworCUd0a1dpZGdldCAqaW1hZ2U7CisKKwlwaXhtYXAgPSBnZGtfcGl4bWFwX2NyZWF0ZV9mcm9tX3hwbV9kKHdpbmRvdywgJm1hc2ssCisJCQkJCSAgICAgICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAgICAgIHhwbSk7CisKKwlidXR0b24gPSBHVEtfVE9PTF9CVVRUT04oZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCBidG5fbmFtZSkpOworCWltYWdlID0gZ3RrX2ltYWdlX25ld19mcm9tX3BpeG1hcChwaXhtYXAsIG1hc2spOworCWd0a193aWRnZXRfc2hvdyhpbWFnZSk7CisJZ3RrX3Rvb2xfYnV0dG9uX3NldF9pY29uX3dpZGdldChidXR0b24sIGltYWdlKTsKK30KKworLyogTWFpbiBXaW5kb3cgSW5pdGlhbGl6YXRpb24gKi8KK3ZvaWQgaW5pdF9tYWluX3dpbmRvdyhjb25zdCBnY2hhciAqIGdsYWRlX2ZpbGUpCit7CisJR2xhZGVYTUwgKnhtbDsKKwlHdGtXaWRnZXQgKndpZGdldDsKKwlHdGtUZXh0QnVmZmVyICp0eHRidWY7CisJY2hhciB0aXRsZVsyNTZdOworCUd0a1N0eWxlICpzdHlsZTsKKworCXhtbCA9IGdsYWRlX3htbF9uZXcoZ2xhZGVfZmlsZSwgIndpbmRvdzEiLCBOVUxMKTsKKwlpZiAoIXhtbCkKKwkJZ19lcnJvcihfKCJHVUkgbG9hZGluZyBmYWlsZWQgIVxuIikpOworCWdsYWRlX3htbF9zaWduYWxfYXV0b2Nvbm5lY3QoeG1sKTsKKworCW1haW5fd25kID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAid2luZG93MSIpOworCWhwYW5lZCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImhwYW5lZDEiKTsKKwl2cGFuZWQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ2cGFuZWQxIik7CisJdHJlZTFfdyA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRyZWV2aWV3MSIpOworCXRyZWUyX3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0cmVldmlldzIiKTsKKwl0ZXh0X3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0ZXh0dmlldzMiKTsKKworCWJhY2tfYnRuID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uMSIpOworCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgRkFMU0UpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19uYW1lMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfbmFtZSk7CisKKwl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJzaG93X3JhbmdlMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfcmFuZ2UpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19kYXRhMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfdmFsdWUpOworCisJc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShtYWluX3duZCk7CisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidG9vbGJhcjEiKTsKKworI2lmIDAJLyogVXNlIHN0b2NrIEd0ayBpY29ucyBpbnN0ZWFkICovCisJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAorCQkJICAgICJidXR0b24xIiwgKGdjaGFyICoqKSB4cG1fYmFjayk7CisJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAorCQkJICAgICJidXR0b24yIiwgKGdjaGFyICoqKSB4cG1fbG9hZCk7CisJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAorCQkJICAgICJidXR0b24zIiwgKGdjaGFyICoqKSB4cG1fc2F2ZSk7CisjZW5kaWYKKwlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCisJCQkgICAgImJ1dHRvbjQiLCAoZ2NoYXIgKiopIHhwbV9zaW5nbGVfdmlldyk7CisJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAorCQkJICAgICJidXR0b241IiwgKGdjaGFyICoqKSB4cG1fc3BsaXRfdmlldyk7CisJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAorCQkJICAgICJidXR0b242IiwgKGdjaGFyICoqKSB4cG1fdHJlZV92aWV3KTsKKworI2lmIDAKKwlzd2l0Y2ggKHZpZXdfbW9kZSkgeworCWNhc2UgU0lOR0xFX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjQiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBTUExJVF9WSUVXOgorCQl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b241Iik7CisJCWdfc2lnbmFsX2VtaXRfYnlfbmFtZSh3aWRnZXQsICJjbGlja2VkIik7CisJCWJyZWFrOworCWNhc2UgRlVMTF9WSUVXOgorCQl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b242Iik7CisJCWdfc2lnbmFsX2VtaXRfYnlfbmFtZSh3aWRnZXQsICJjbGlja2VkIik7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCXR4dGJ1ZiA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCXRhZzEgPSBndGtfdGV4dF9idWZmZXJfY3JlYXRlX3RhZyh0eHRidWYsICJteXRhZzEiLAorCQkJCQkgICJmb3JlZ3JvdW5kIiwgInJlZCIsCisJCQkJCSAgIndlaWdodCIsIFBBTkdPX1dFSUdIVF9CT0xELAorCQkJCQkgIE5VTEwpOworCXRhZzIgPSBndGtfdGV4dF9idWZmZXJfY3JlYXRlX3RhZyh0eHRidWYsICJteXRhZzIiLAorCQkJCQkgIC8qInN0eWxlIiwgUEFOR09fU1RZTEVfT0JMSVFVRSwgKi8KKwkJCQkJICBOVUxMKTsKKworCXNwcmludGYodGl0bGUsIF8oIkJ1c3lCb3ggJXMgQ29uZmlndXJhdGlvbiIpLAorCQlnZXRlbnYoIktFUk5FTFZFUlNJT04iKSk7CisJZ3RrX3dpbmRvd19zZXRfdGl0bGUoR1RLX1dJTkRPVyhtYWluX3duZCksIHRpdGxlKTsKKworCWd0a193aWRnZXRfc2hvdyhtYWluX3duZCk7Cit9CisKK3ZvaWQgaW5pdF90cmVlX21vZGVsKHZvaWQpCit7CisJZ2ludCBpOworCisJdHJlZSA9IHRyZWUyID0gZ3RrX3RyZWVfc3RvcmVfbmV3KENPTF9OVU1CRVIsCisJCQkJCSAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkJICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCQkgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJCSAgR19UWVBFX1BPSU5URVIsIEdES19UWVBFX0NPTE9SLAorCQkJCQkgIEdfVFlQRV9CT09MRUFOLCBHREtfVFlQRV9QSVhCVUYsCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCQkgIEdfVFlQRV9CT09MRUFOLCBHX1RZUEVfQk9PTEVBTiwKKwkJCQkJICBHX1RZUEVfQk9PTEVBTik7CisJbW9kZWwyID0gR1RLX1RSRUVfTU9ERUwodHJlZTIpOworCisJZm9yIChwYXJlbnRzWzBdID0gTlVMTCwgaSA9IDE7IGkgPCAyNTY7IGkrKykKKwkJcGFyZW50c1tpXSA9IChHdGtUcmVlSXRlciAqKSBnX21hbGxvYyhzaXplb2YoR3RrVHJlZUl0ZXIpKTsKKworCXRyZWUxID0gZ3RrX3RyZWVfc3RvcmVfbmV3KENPTF9OVU1CRVIsCisJCQkJICAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCSAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJICAgR19UWVBFX1BPSU5URVIsIEdES19UWVBFX0NPTE9SLAorCQkJCSAgIEdfVFlQRV9CT09MRUFOLCBHREtfVFlQRV9QSVhCVUYsCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCSAgIEdfVFlQRV9CT09MRUFOLCBHX1RZUEVfQk9PTEVBTiwKKwkJCQkgICBHX1RZUEVfQk9PTEVBTik7CisJbW9kZWwxID0gR1RLX1RSRUVfTU9ERUwodHJlZTEpOworfQorCit2b2lkIGluaXRfbGVmdF90cmVlKHZvaWQpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHRyZWUxX3cpOworCUd0a0NlbGxSZW5kZXJlciAqcmVuZGVyZXI7CisJR3RrVHJlZVNlbGVjdGlvbiAqc2VsOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisKKwlndGtfdHJlZV92aWV3X3NldF9tb2RlbCh2aWV3LCBtb2RlbDEpOworCWd0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZSh2aWV3LCBUUlVFKTsKKwlndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50KHZpZXcsIEZBTFNFKTsKKworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfY29sdW1uX25ldygpOworCWd0a190cmVlX3ZpZXdfYXBwZW5kX2NvbHVtbih2aWV3LCBjb2x1bW4pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZShjb2x1bW4sIF8oIk9wdGlvbnMiKSk7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RvZ2dsZV9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgImFjdGl2ZSIsIENPTF9CVE5BQ1QsCisJCQkJCSAgICAiaW5jb25zaXN0ZW50IiwgQ09MX0JUTklOQywKKwkJCQkJICAgICJ2aXNpYmxlIiwgQ09MX0JUTlZJUywKKwkJCQkJICAgICJyYWRpbyIsIENPTF9CVE5SQUQsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgInRleHQiLCBDT0xfT1BUSU9OLAorCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisKKwlzZWwgPSBndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb24odmlldyk7CisJZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlKHNlbCwgR1RLX1NFTEVDVElPTl9TSU5HTEUpOworCWd0a193aWRnZXRfcmVhbGl6ZSh0cmVlMV93KTsKK30KKworc3RhdGljIHZvaWQgcmVuZGVyZXJfZWRpdGVkKEd0a0NlbGxSZW5kZXJlclRleHQgKiBjZWxsLAorCQkJICAgIGNvbnN0IGdjaGFyICogcGF0aF9zdHJpbmcsCisJCQkgICAgY29uc3QgZ2NoYXIgKiBuZXdfdGV4dCwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIHJlbmRlcmVyX3RvZ2dsZWQoR3RrQ2VsbFJlbmRlcmVyVG9nZ2xlICogY2VsbHJlbmRlcmVydG9nZ2xlLAorCQkJICAgICBnY2hhciAqIGFyZzEsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3ZvaWQgaW5pdF9yaWdodF90cmVlKHZvaWQpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHRyZWUyX3cpOworCUd0a0NlbGxSZW5kZXJlciAqcmVuZGVyZXI7CisJR3RrVHJlZVNlbGVjdGlvbiAqc2VsOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisJZ2ludCBpOworCisJZ3RrX3RyZWVfdmlld19zZXRfbW9kZWwodmlldywgbW9kZWwyKTsKKwlndGtfdHJlZV92aWV3X3NldF9oZWFkZXJzX3Zpc2libGUodmlldywgVFJVRSk7CisJZ3RrX3RyZWVfdmlld19zZXRfcnVsZXNfaGludCh2aWV3LCBGQUxTRSk7CisKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2NvbHVtbl9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2FwcGVuZF9jb2x1bW4odmlldywgY29sdW1uKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdGl0bGUoY29sdW1uLCBfKCJPcHRpb25zIikpOworCisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl9waXhidWZfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJwaXhidWYiLCBDT0xfUElYQlVGLAorCQkJCQkgICAgInZpc2libGUiLCBDT0xfUElYVklTLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RvZ2dsZV9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgImFjdGl2ZSIsIENPTF9CVE5BQ1QsCisJCQkJCSAgICAiaW5jb25zaXN0ZW50IiwgQ09MX0JUTklOQywKKwkJCQkJICAgICJ2aXNpYmxlIiwgQ09MX0JUTlZJUywKKwkJCQkJICAgICJyYWRpbyIsIENPTF9CVE5SQUQsIE5VTEwpOworCS8qZ19zaWduYWxfY29ubmVjdChHX09CSkVDVChyZW5kZXJlciksICJ0b2dnbGVkIiwKKwkgICBHX0NBTExCQUNLKHJlbmRlcmVyX3RvZ2dsZWQpLCBOVUxMKTsgKi8KKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJ0ZXh0IiwgQ09MX09QVElPTiwKKwkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgXygiTmFtZSIpLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9OQU1FLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiTiIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX05PLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiTSIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX01PRCwKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIlkiLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9ZRVMsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgIF8oIlZhbHVlIiksIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX1ZBTFVFLAorCQkJCQkJICAgICJlZGl0YWJsZSIsCisJCQkJCQkgICAgQ09MX0VESVQsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCWdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QocmVuZGVyZXIpLCAiZWRpdGVkIiwKKwkJCSBHX0NBTExCQUNLKHJlbmRlcmVyX2VkaXRlZCksIE5VTEwpOworCisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9OQU1FKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfbmFtZSk7CisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9OTyk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX01PRCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX1lFUyk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX1ZBTFVFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfdmFsdWUpOworCisJaWYgKHJlc2l6ZWFibGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IENPTF9WQUxVRTsgaSsrKSB7CisJCQljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgaSk7CisJCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVzaXphYmxlKGNvbHVtbiwgVFJVRSk7CisJCX0KKwl9CisKKwlzZWwgPSBndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb24odmlldyk7CisJZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlKHNlbCwgR1RLX1NFTEVDVElPTl9TSU5HTEUpOworfQorCisKKy8qIFV0aWxpdHkgRnVuY3Rpb25zICovCisKKworc3RhdGljIHZvaWQgdGV4dF9pbnNlcnRfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlHdGtUZXh0QnVmZmVyICpidWZmZXI7CisJR3RrVGV4dEl0ZXIgc3RhcnQsIGVuZDsKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJZ2NoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqaGVscCA9IF8obm9oZWxwX3RleHQpOworCisJaWYgKCFtZW51LT5zeW0pCisJCWhlbHAgPSAiIjsKKwllbHNlIGlmIChtZW51LT5zeW0tPmhlbHApCisJCWhlbHAgPSBfKG1lbnUtPnN5bS0+aGVscCk7CisKKwlpZiAobWVudS0+c3ltICYmIG1lbnUtPnN5bS0+bmFtZSkKKwkJbmFtZSA9IGdfc3RyZHVwX3ByaW50ZihfKG1lbnUtPnN5bS0+bmFtZSkpOworCWVsc2UKKwkJbmFtZSA9IGdfc3RyZHVwKCIiKTsKKworCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfZGVsZXRlKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF92aWV3X3NldF9sZWZ0X21hcmdpbihHVEtfVEVYVF9WSUVXKHRleHRfdyksIDE1KTsKKworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHByb21wdCwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICIgIiwgMSk7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgbmFtZSwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICJcblxuIiwgMik7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgaGVscCwgLTEsIHRhZzIsCisJCQkJCSBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXh0X2luc2VydF9tc2coY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJR3RrVGV4dEJ1ZmZlciAqYnVmZmVyOworCUd0a1RleHRJdGVyIHN0YXJ0LCBlbmQ7CisJY29uc3QgY2hhciAqbXNnID0gbWVzc2FnZTsKKworCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfZGVsZXRlKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF92aWV3X3NldF9sZWZ0X21hcmdpbihHVEtfVEVYVF9WSUVXKHRleHRfdyksIDE1KTsKKworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHRpdGxlLCAtMSwgdGFnMSwKKwkJCQkJIE5VTEwpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIlxuXG4iLCAyKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBtc2csIC0xLCB0YWcyLAorCQkJCQkgTlVMTCk7Cit9CisKKworLyogTWFpbiBXaW5kb3dzIENhbGxiYWNrcyAqLworCit2b2lkIG9uX3NhdmUxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSk7CitnYm9vbGVhbiBvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50ICogZXZlbnQsCisJCQkJIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmRpYWxvZywgKmxhYmVsOworCWdpbnQgcmVzdWx0OworCisJaWYgKGNvbmZpZ19jaGFuZ2VkID09IEZBTFNFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlkaWFsb2cgPSBndGtfZGlhbG9nX25ld193aXRoX2J1dHRvbnMoXygiV2FybmluZyAhIiksCisJCQkJCSAgICAgR1RLX1dJTkRPVyhtYWluX3duZCksCisJCQkJCSAgICAgKEd0a0RpYWxvZ0ZsYWdzKQorCQkJCQkgICAgIChHVEtfRElBTE9HX01PREFMIHwKKwkJCQkJICAgICAgR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UKSwKKwkJCQkJICAgICBHVEtfU1RPQ0tfT0ssCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX1lFUywKKwkJCQkJICAgICBHVEtfU1RPQ0tfTk8sCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX05PLAorCQkJCQkgICAgIEdUS19TVE9DS19DQU5DRUwsCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX0NBTkNFTCwgTlVMTCk7CisJZ3RrX2RpYWxvZ19zZXRfZGVmYXVsdF9yZXNwb25zZShHVEtfRElBTE9HKGRpYWxvZyksCisJCQkJCUdUS19SRVNQT05TRV9DQU5DRUwpOworCisJbGFiZWwgPSBndGtfbGFiZWxfbmV3KF8oIlxuU2F2ZSBjb25maWd1cmF0aW9uID9cbiIpKTsKKwlndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKEdUS19ESUFMT0coZGlhbG9nKS0+dmJveCksIGxhYmVsKTsKKwlndGtfd2lkZ2V0X3Nob3cobGFiZWwpOworCisJcmVzdWx0ID0gZ3RrX2RpYWxvZ19ydW4oR1RLX0RJQUxPRyhkaWFsb2cpKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgR1RLX1JFU1BPTlNFX1lFUzoKKwkJb25fc2F2ZTFfYWN0aXZhdGUoTlVMTCwgTlVMTCk7CisJCXJldHVybiBGQUxTRTsKKwljYXNlIEdUS19SRVNQT05TRV9OTzoKKwkJcmV0dXJuIEZBTFNFOworCWNhc2UgR1RLX1JFU1BPTlNFX0NBTkNFTDoKKwljYXNlIEdUS19SRVNQT05TRV9ERUxFVEVfRVZFTlQ6CisJZGVmYXVsdDoKKwkJZ3RrX3dpZGdldF9kZXN0cm95KGRpYWxvZyk7CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworCit2b2lkIG9uX3dpbmRvdzFfZGVzdHJveShHdGtPYmplY3QgKiBvYmplY3QsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKwordm9pZAorb25fd2luZG93MV9zaXplX3JlcXVlc3QoR3RrV2lkZ2V0ICogd2lkZ2V0LAorCQkJR3RrUmVxdWlzaXRpb24gKiByZXF1aXNpdGlvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXN0YXRpYyBnaW50IG9sZF9oOworCWdpbnQgdywgaDsKKworCWlmICh3aWRnZXQtPndpbmRvdyA9PSBOVUxMKQorCQlndGtfd2luZG93X2dldF9kZWZhdWx0X3NpemUoR1RLX1dJTkRPVyhtYWluX3duZCksICZ3LCAmaCk7CisJZWxzZQorCQlnZGtfd2luZG93X2dldF9zaXplKHdpZGdldC0+d2luZG93LCAmdywgJmgpOworCisJaWYgKGggPT0gb2xkX2gpCisJCXJldHVybjsKKwlvbGRfaCA9IGg7CisKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRCh2cGFuZWQpLCAyICogaCAvIDMpOworfQorCisKKy8qIE1lbnUgJiBUb29sYmFyIENhbGxiYWNrcyAqLworCisKK3N0YXRpYyB2b2lkCitsb2FkX2ZpbGVuYW1lKEd0a0ZpbGVTZWxlY3Rpb24gKiBmaWxlX3NlbGVjdG9yLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJY29uc3QgZ2NoYXIgKmZuOworCisJZm4gPSBndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lKEdUS19GSUxFX1NFTEVDVElPTgorCQkJCQkgICAgICh1c2VyX2RhdGEpKTsKKworCWlmIChjb25mX3JlYWQoZm4pKQorCQl0ZXh0X2luc2VydF9tc2coXygiRXJyb3IiKSwgXygiVW5hYmxlIHRvIGxvYWQgY29uZmlndXJhdGlvbiAhIikpOworCWVsc2UKKwkJZGlzcGxheV90cmVlKCZyb290bWVudSk7Cit9CisKK3ZvaWQgb25fbG9hZDFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZnM7CisKKwlmcyA9IGd0a19maWxlX3NlbGVjdGlvbl9uZXcoXygiTG9hZCBmaWxlLi4uIikpOworCWdfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5va19idXR0b24pLAorCQkJICJjbGlja2VkIiwKKwkJCSBHX0NBTExCQUNLKGxvYWRfZmlsZW5hbWUpLCAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5jYW5jZWxfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWd0a193aWRnZXRfc2hvdyhmcyk7Cit9CisKKwordm9pZCBvbl9zYXZlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpCisJCXRleHRfaW5zZXJ0X21zZyhfKCJFcnJvciIpLCBfKCJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uICEiKSk7CisKKwljb25maWdfY2hhbmdlZCA9IEZBTFNFOworfQorCisKK3N0YXRpYyB2b2lkCitzdG9yZV9maWxlbmFtZShHdGtGaWxlU2VsZWN0aW9uICogZmlsZV9zZWxlY3RvciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWNvbnN0IGdjaGFyICpmbjsKKworCWZuID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZShHVEtfRklMRV9TRUxFQ1RJT04KKwkJCQkJICAgICAodXNlcl9kYXRhKSk7CisKKwlpZiAoY29uZl93cml0ZShmbikpCisJCXRleHRfaW5zZXJ0X21zZyhfKCJFcnJvciIpLCBfKCJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uICEiKSk7CisKKwlndGtfd2lkZ2V0X2Rlc3Ryb3koR1RLX1dJREdFVCh1c2VyX2RhdGEpKTsKK30KKwordm9pZCBvbl9zYXZlX2FzMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpmczsKKworCWZzID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX25ldyhfKCJTYXZlIGZpbGUgYXMuLi4iKSk7CisJZ19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKEdUS19GSUxFX1NFTEVDVElPTihmcyktPm9rX2J1dHRvbiksCisJCQkgImNsaWNrZWQiLAorCQkJIEdfQ0FMTEJBQ0soc3RvcmVfZmlsZW5hbWUpLCAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5jYW5jZWxfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWd0a193aWRnZXRfc2hvdyhmcyk7Cit9CisKKwordm9pZCBvbl9xdWl0MV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJaWYgKCFvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChOVUxMLCBOVUxMLCBOVUxMKSkKKwkJZ3RrX3dpZGdldF9kZXN0cm95KEdUS19XSURHRVQobWFpbl93bmQpKTsKK30KKworCit2b2lkIG9uX3Nob3dfbmFtZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X25hbWUgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTkFNRSk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X25hbWUpOworfQorCisKK3ZvaWQgb25fc2hvd19yYW5nZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X3JhbmdlID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX05PKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTU9EKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfWUVTKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCit9CisKKwordm9pZCBvbl9zaG93X2RhdGExX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sOworCisJc2hvd192YWx1ZSA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9WQUxVRSk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X3ZhbHVlKTsKK30KKworCit2b2lkCitvbl9zaG93X2FsbF9vcHRpb25zMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc2hvd19hbGwgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCisJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOwkvLyBpbnN0ZWFkIG9mIHVwZGF0ZV90cmVlIHRvIHNwZWVkLXVwCit9CisKKwordm9pZAorb25fc2hvd19kZWJ1Z19pbmZvMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc2hvd19kZWJ1ZyA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKK30KKworCit2b2lkIG9uX2ludHJvZHVjdGlvbjFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICppbnRyb190ZXh0ID0gXygKKwkgICAgIldlbGNvbWUgdG8gZ2tjLCB0aGUgR1RLKyBncmFwaGljYWwgY29uZmlndXJhdGlvbiB0b29sLlxuIgorCSAgICAiRm9yIGVhY2ggb3B0aW9uLCBhIGJsYW5rIGJveCBpbmRpY2F0ZXMgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGFcbiIKKwkgICAgImNoZWNrIGluZGljYXRlcyBpdCBpcyBlbmFibGVkLCBhbmQgYSBkb3QgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdG9cbiIKKwkgICAgImJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlLiAgQ2xpY2tpbmcgb24gdGhlIGJveCB3aWxsIGN5Y2xlIHRocm91Z2ggdGhlIHRocmVlIHN0YXRlcy5cbiIKKwkgICAgIlxuIgorCSAgICAiSWYgeW91IGRvIG5vdCBzZWUgYW4gb3B0aW9uIChlLmcuLCBhIGRldmljZSBkcml2ZXIpIHRoYXQgeW91XG4iCisJICAgICJiZWxpZXZlIHNob3VsZCBiZSBwcmVzZW50LCB0cnkgdHVybmluZyBvbiBTaG93IEFsbCBPcHRpb25zXG4iCisJICAgICJ1bmRlciB0aGUgT3B0aW9ucyBtZW51LlxuIgorCSAgICAiQWx0aG91Z2ggdGhlcmUgaXMgbm8gY3Jvc3MgcmVmZXJlbmNlIHlldCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0XG4iCisJICAgICJ3aGF0IG90aGVyIG9wdGlvbnMgbXVzdCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgdGhlIG9wdGlvbiB5b3VcbiIKKwkgICAgImFyZSBpbnRlcmVzdGVkIGluLCB5b3UgY2FuIHN0aWxsIHZpZXcgdGhlIGhlbHAgb2YgYSBncmF5ZWQtb3V0XG4iCisJICAgICJvcHRpb24uXG4iCisJICAgICJcbiIKKwkgICAgIlRvZ2dsaW5nIFNob3cgRGVidWcgSW5mbyB1bmRlciB0aGUgT3B0aW9ucyBtZW51IHdpbGwgc2hvd1xuIgorCSAgICAidGhlIGRlcGVuZGVuY2llcywgd2hpY2ggeW91IGNhbiB0aGVuIG1hdGNoIGJ5IGV4YW1pbmluZyBvdGhlciBvcHRpb25zLiIpOworCisJZGlhbG9nID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhHVEtfV0lORE9XKG1haW5fd25kKSwKKwkJCQkJR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5ULAorCQkJCQlHVEtfTUVTU0FHRV9JTkZPLAorCQkJCQlHVEtfQlVUVE9OU19DTE9TRSwgaW50cm9fdGV4dCk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QoZGlhbG9nKSwgInJlc3BvbnNlIiwKKwkJCQkgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSBHVEtfT0JKRUNUKGRpYWxvZykpOworCWd0a193aWRnZXRfc2hvd19hbGwoZGlhbG9nKTsKK30KKworCit2b2lkIG9uX2Fib3V0MV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpkaWFsb2c7CisJY29uc3QgZ2NoYXIgKmFib3V0X3RleHQgPQorCSAgICBfKCJna2MgaXMgY29weXJpZ2h0IChjKSAyMDAyIFJvbWFpbiBMaWV2aW4gPHJvbXNAbHBnLnRpY2FsYy5vcmc+LlxuIgorCSAgICAgICJCYXNlZCBvbiB0aGUgc291cmNlIGNvZGUgZnJvbSBSb21hbiBaaXBwZWwuXG4iKTsKKworCWRpYWxvZyA9IGd0a19tZXNzYWdlX2RpYWxvZ19uZXcoR1RLX1dJTkRPVyhtYWluX3duZCksCisJCQkJCUdUS19ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCwKKwkJCQkJR1RLX01FU1NBR0VfSU5GTywKKwkJCQkJR1RLX0JVVFRPTlNfQ0xPU0UsIGFib3V0X3RleHQpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUKGRpYWxvZyksICJyZXNwb25zZSIsCisJCQkJIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgR1RLX09CSkVDVChkaWFsb2cpKTsKKwlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7Cit9CisKKwordm9pZCBvbl9saWNlbnNlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpkaWFsb2c7CisJY29uc3QgZ2NoYXIgKmxpY2Vuc2VfdGV4dCA9CisJICAgIF8oImdrYyBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuXG4iCisJICAgICAgIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBzb3VyY2UgY29kZSBvclxuIgorCSAgICAgICJ2aXNpdCBodHRwOi8vd3d3LmZzZi5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbFxuIik7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBsaWNlbnNlX3RleHQpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUKGRpYWxvZyksICJyZXNwb25zZSIsCisJCQkJIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgR1RLX09CSkVDVChkaWFsb2cpKTsKKwlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7Cit9CisKKwordm9pZCBvbl9iYWNrX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisKKwljdXJyZW50ID0gY3VycmVudC0+cGFyZW50OworCXB0eXBlID0gY3VycmVudC0+cHJvbXB0ID8gY3VycmVudC0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCWlmIChwdHlwZSAhPSBQX01FTlUpCisJCWN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7CisJZGlzcGxheV90cmVlX3BhcnQoKTsKKworCWlmIChjdXJyZW50ID09ICZyb290bWVudSkKKwkJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9sb2FkX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJb25fbG9hZDFfYWN0aXZhdGUoTlVMTCwgdXNlcl9kYXRhKTsKK30KKworCit2b2lkIG9uX3NhdmVfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlvbl9zYXZlMV9hY3RpdmF0ZShOVUxMLCB1c2VyX2RhdGEpOworfQorCisKK3ZvaWQgb25fc2luZ2xlX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJdmlld19tb2RlID0gU0lOR0xFX1ZJRVc7CisJZ3RrX3BhbmVkX3NldF9wb3NpdGlvbihHVEtfUEFORUQoaHBhbmVkKSwgMCk7CisJZ3RrX3dpZGdldF9oaWRlKHRyZWUxX3cpOworCWN1cnJlbnQgPSAmcm9vdG1lbnU7CisJZGlzcGxheV90cmVlX3BhcnQoKTsKK30KKworCit2b2lkIG9uX3NwbGl0X2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ2ludCB3LCBoOworCXZpZXdfbW9kZSA9IFNQTElUX1ZJRVc7CisJZ3RrX3dpZGdldF9zaG93KHRyZWUxX3cpOworCWd0a193aW5kb3dfZ2V0X2RlZmF1bHRfc2l6ZShHVEtfV0lORE9XKG1haW5fd25kKSwgJncsICZoKTsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCB3IC8gMik7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJZGlzcGxheV9saXN0KCk7CisKKwkvKiBEaXNhYmxlIGJhY2sgYnRuLCBsaWtlIGluIGZ1bGwgbW9kZS4gKi8KKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoYmFja19idG4sIEZBTFNFKTsKK30KKworCit2b2lkIG9uX2Z1bGxfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwl2aWV3X21vZGUgPSBGVUxMX1ZJRVc7CisJZ3RrX3BhbmVkX3NldF9wb3NpdGlvbihHVEtfUEFORUQoaHBhbmVkKSwgMCk7CisJZ3RrX3dpZGdldF9oaWRlKHRyZWUxX3cpOworCWlmICh0cmVlMikKKwkJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOworCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgRkFMU0UpOworfQorCisKK3ZvaWQgb25fY29sbGFwc2VfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlndGtfdHJlZV92aWV3X2NvbGxhcHNlX2FsbChHVEtfVFJFRV9WSUVXKHRyZWUyX3cpKTsKK30KKworCit2b2lkIG9uX2V4cGFuZF9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWd0a190cmVlX3ZpZXdfZXhwYW5kX2FsbChHVEtfVFJFRV9WSUVXKHRyZWUyX3cpKTsKK30KKworCisvKiBDVHJlZSBDYWxsYmFja3MgKi8KKworLyogQ2hhbmdlIGhleC9pbnQvc3RyaW5nIHZhbHVlIGluIHRoZSBjZWxsICovCitzdGF0aWMgdm9pZCByZW5kZXJlcl9lZGl0ZWQoR3RrQ2VsbFJlbmRlcmVyVGV4dCAqIGNlbGwsCisJCQkgICAgY29uc3QgZ2NoYXIgKiBwYXRoX3N0cmluZywKKwkJCSAgICBjb25zdCBnY2hhciAqIG5ld190ZXh0LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVBhdGggKnBhdGggPSBndGtfdHJlZV9wYXRoX25ld19mcm9tX3N0cmluZyhwYXRoX3N0cmluZyk7CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwljb25zdCBjaGFyICpvbGRfZGVmLCAqbmV3X2RlZjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKwlpZiAoIWd0a190cmVlX21vZGVsX2dldF9pdGVyKG1vZGVsMiwgJml0ZXIsIHBhdGgpKQorCQlyZXR1cm47CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisJc3ltID0gbWVudS0+c3ltOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9WQUxVRSwgJm9sZF9kZWYsIC0xKTsKKwluZXdfZGVmID0gbmV3X3RleHQ7CisKKwlzeW1fc2V0X3N0cmluZ192YWx1ZShzeW0sIG5ld19kZWYpOworCisJY29uZmlnX2NoYW5nZWQgPSBUUlVFOworCXVwZGF0ZV90cmVlKCZyb290bWVudSwgTlVMTCk7CisKKwlndGtfdHJlZV9wYXRoX2ZyZWUocGF0aCk7Cit9CisKKy8qIENoYW5nZSB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgYW5kIHVwZGF0ZSB0aGUgdHJlZSAqLworc3RhdGljIHZvaWQgY2hhbmdlX3N5bV92YWx1ZShzdHJ1Y3QgbWVudSAqbWVudSwgZ2ludCBjb2wpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCXRyaXN0YXRlIG9sZHZhbCwgbmV3dmFsOworCisJaWYgKCFzeW0pCisJCXJldHVybjsKKworCWlmIChjb2wgPT0gQ09MX05PKQorCQluZXd2YWwgPSBubzsKKwllbHNlIGlmIChjb2wgPT0gQ09MX01PRCkKKwkJbmV3dmFsID0gbW9kOworCWVsc2UgaWYgKGNvbCA9PSBDT0xfWUVTKQorCQluZXd2YWwgPSB5ZXM7CisJZWxzZQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN5bV9nZXRfdHlwZShzeW0pKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmICghc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5ld3ZhbCkpCisJCQluZXd2YWwgPSB5ZXM7CisJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBuZXd2YWwpOworCQljb25maWdfY2hhbmdlZCA9IFRSVUU7CisJCWlmICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQorCQkJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKKwkJZWxzZSBpZiAodmlld19tb2RlID09IFNQTElUX1ZJRVcpIHsKKwkJCXVwZGF0ZV90cmVlKGJyb3dzZWQsIE5VTEwpOworCQkJZGlzcGxheV9saXN0KCk7CisJCX0KKwkJZWxzZSBpZiAodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQkJZGlzcGxheV90cmVlX3BhcnQoKTsJLy9maXhtZToga2VlcCBleHAvY29sbAorCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRvZ2dsZV9zeW1fdmFsdWUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJaWYgKCFtZW51LT5zeW0pCisJCXJldHVybjsKKworCXN5bV90b2dnbGVfdHJpc3RhdGVfdmFsdWUobWVudS0+c3ltKTsKKwlpZiAodmlld19tb2RlID09IEZVTExfVklFVykKKwkJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKKwllbHNlIGlmICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgeworCQl1cGRhdGVfdHJlZShicm93c2VkLCBOVUxMKTsKKwkJZGlzcGxheV9saXN0KCk7CisJfQorCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykKKwkJZGlzcGxheV90cmVlX3BhcnQoKTsJLy9maXhtZToga2VlcCBleHAvY29sbAorfQorCitzdGF0aWMgdm9pZCByZW5kZXJlcl90b2dnbGVkKEd0a0NlbGxSZW5kZXJlclRvZ2dsZSAqIGNlbGwsCisJCQkgICAgIGdjaGFyICogcGF0aF9zdHJpbmcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlUGF0aCAqcGF0aCwgKnNlbF9wYXRoID0gTlVMTDsKKwlHdGtUcmVlSXRlciBpdGVyLCBzZWxfaXRlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJc3RydWN0IG1lbnUgKm1lbnU7CisKKwlwYXRoID0gZ3RrX3RyZWVfcGF0aF9uZXdfZnJvbV9zdHJpbmcocGF0aF9zdHJpbmcpOworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybjsKKworCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpKTsKKwlpZiAoZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZChzZWwsIE5VTEwsICZzZWxfaXRlcikpCisJCXNlbF9wYXRoID0gZ3RrX3RyZWVfbW9kZWxfZ2V0X3BhdGgobW9kZWwyLCAmc2VsX2l0ZXIpOworCWlmICghc2VsX3BhdGgpCisJCWdvdG8gb3V0MTsKKwlpZiAoZ3RrX3RyZWVfcGF0aF9jb21wYXJlKHBhdGgsIHNlbF9wYXRoKSkKKwkJZ290byBvdXQyOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisKKyAgICAgIG91dDI6CisJZ3RrX3RyZWVfcGF0aF9mcmVlKHNlbF9wYXRoKTsKKyAgICAgIG91dDE6CisJZ3RrX3RyZWVfcGF0aF9mcmVlKHBhdGgpOworfQorCitzdGF0aWMgZ2ludCBjb2x1bW4yaW5kZXgoR3RrVHJlZVZpZXdDb2x1bW4gKiBjb2x1bW4pCit7CisJZ2ludCBpOworCisJZm9yIChpID0gMDsgaSA8IENPTF9OVU1CRVI7IGkrKykgeworCQlHdGtUcmVlVmlld0NvbHVtbiAqY29sOworCisJCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBpKTsKKwkJaWYgKGNvbCA9PSBjb2x1bW4pCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworLyogVXNlciBjbGljazogdXBkYXRlIGNob2ljZSAoZnVsbCkgb3IgZ29lcyBkb3duIChzaW5nbGUpICovCitnYm9vbGVhbgorb25fdHJlZXZpZXcyX2J1dHRvbl9wcmVzc19ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsCisJCQkJR2RrRXZlbnRCdXR0b24gKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh3aWRnZXQpOworCUd0a1RyZWVQYXRoICpwYXRoOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlnaW50IGNvbDsKKworI2lmIEdUS19DSEVDS19WRVJTSU9OKDIsMSw0KSAvLyBidWcgaW4gY3RyZWUgd2l0aCBlYXJsaWVyIHZlcnNpb24gb2YgR1RLCisJZ2ludCB0eCA9IChnaW50KSBldmVudC0+eDsKKwlnaW50IHR5ID0gKGdpbnQpIGV2ZW50LT55OworCWdpbnQgY3gsIGN5OworCisJZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3ModmlldywgdHgsIHR5LCAmcGF0aCwgJmNvbHVtbiwgJmN4LAorCQkJCSAgICAgICZjeSk7CisjZWxzZQorCWd0a190cmVlX3ZpZXdfZ2V0X2N1cnNvcih2aWV3LCAmcGF0aCwgJmNvbHVtbik7CisjZW5kaWYKKwlpZiAocGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoIWd0a190cmVlX21vZGVsX2dldF9pdGVyKG1vZGVsMiwgJml0ZXIsIHBhdGgpKQorCQlyZXR1cm4gRkFMU0U7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJY29sID0gY29sdW1uMmluZGV4KGNvbHVtbik7CisJaWYgKGV2ZW50LT50eXBlID09IEdES18yQlVUVE9OX1BSRVNTKSB7CisJCWVudW0gcHJvcF90eXBlIHB0eXBlOworCQlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKworCQlpZiAocHR5cGUgPT0gUF9NRU5VICYmIHZpZXdfbW9kZSAhPSBGVUxMX1ZJRVcgJiYgY29sID09IENPTF9PUFRJT04pIHsKKwkJCS8vIGdvZXMgZG93biBpbnRvIG1lbnUKKwkJCWN1cnJlbnQgPSBtZW51OworCQkJZGlzcGxheV90cmVlX3BhcnQoKTsKKwkJCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgVFJVRSk7CisJCX0gZWxzZSBpZiAoKGNvbCA9PSBDT0xfT1BUSU9OKSkgeworCQkJdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKKwkJCWd0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdyh2aWV3LCBwYXRoLCBUUlVFKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjb2wgPT0gQ09MX1ZBTFVFKSB7CisJCQl0b2dnbGVfc3ltX3ZhbHVlKG1lbnUpOworCQkJZ3RrX3RyZWVfdmlld19leHBhbmRfcm93KHZpZXcsIHBhdGgsIFRSVUUpOworCQl9IGVsc2UgaWYgKGNvbCA9PSBDT0xfTk8gfHwgY29sID09IENPTF9NT0QKKwkJCSAgIHx8IGNvbCA9PSBDT0xfWUVTKSB7CisJCQljaGFuZ2Vfc3ltX3ZhbHVlKG1lbnUsIGNvbCk7CisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgVFJVRSk7CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qIEtleSBwcmVzc2VkOiB1cGRhdGUgY2hvaWNlICovCitnYm9vbGVhbgorb25fdHJlZXZpZXcyX2tleV9wcmVzc19ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsCisJCQkgICAgIEdka0V2ZW50S2V5ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcod2lkZ2V0KTsKKwlHdGtUcmVlUGF0aCAqcGF0aDsKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sdW1uOworCUd0a1RyZWVJdGVyIGl0ZXI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZ2ludCBjb2w7CisKKwlndGtfdHJlZV92aWV3X2dldF9jdXJzb3IodmlldywgJnBhdGgsICZjb2x1bW4pOworCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChldmVudC0+a2V5dmFsID09IEdES19zcGFjZSkgeworCQlpZiAoZ3RrX3RyZWVfdmlld19yb3dfZXhwYW5kZWQodmlldywgcGF0aCkpCisJCQlndGtfdHJlZV92aWV3X2NvbGxhcHNlX3Jvdyh2aWV3LCBwYXRoKTsKKwkJZWxzZQorCQkJZ3RrX3RyZWVfdmlld19leHBhbmRfcm93KHZpZXcsIHBhdGgsIEZBTFNFKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmIChldmVudC0+a2V5dmFsID09IEdES19LUF9FbnRlcikgeworCX0KKwlpZiAod2lkZ2V0ID09IHRyZWUxX3cpCisJCXJldHVybiBGQUxTRTsKKworCWd0a190cmVlX21vZGVsX2dldF9pdGVyKG1vZGVsMiwgJml0ZXIsIHBhdGgpOworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKworCWlmICghc3RyY2FzZWNtcChldmVudC0+c3RyaW5nLCAibiIpKQorCQljb2wgPSBDT0xfTk87CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoZXZlbnQtPnN0cmluZywgIm0iKSkKKwkJY29sID0gQ09MX01PRDsKKwllbHNlIGlmICghc3RyY2FzZWNtcChldmVudC0+c3RyaW5nLCAieSIpKQorCQljb2wgPSBDT0xfWUVTOworCWVsc2UKKwkJY29sID0gLTE7CisJY2hhbmdlX3N5bV92YWx1ZShtZW51LCBjb2wpOworCisJcmV0dXJuIEZBTFNFOworfQorCisKKy8qIFJvdyBzZWxlY3Rpb24gY2hhbmdlZDogdXBkYXRlIGhlbHAgKi8KK3ZvaWQKK29uX3RyZWV2aWV3Ml9jdXJzb3JfY2hhbmdlZChHdGtUcmVlVmlldyAqIHRyZWV2aWV3LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVNlbGVjdGlvbiAqc2VsZWN0aW9uOworCUd0a1RyZWVJdGVyIGl0ZXI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisKKwlzZWxlY3Rpb24gPSBndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb24odHJlZXZpZXcpOworCWlmIChndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkKHNlbGVjdGlvbiwgJm1vZGVsMiwgJml0ZXIpKSB7CisJCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKwkJdGV4dF9pbnNlcnRfaGVscChtZW51KTsKKwl9Cit9CisKKworLyogVXNlciBjbGljazogZGlzcGxheSBzdWItdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWUuICovCitnYm9vbGVhbgorb25fdHJlZXZpZXcxX2J1dHRvbl9wcmVzc19ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsCisJCQkJR2RrRXZlbnRCdXR0b24gKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh3aWRnZXQpOworCUd0a1RyZWVQYXRoICpwYXRoOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCWdpbnQgdHggPSAoZ2ludCkgZXZlbnQtPng7CisJZ2ludCB0eSA9IChnaW50KSBldmVudC0+eTsKKwlnaW50IGN4LCBjeTsKKworCWd0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zKHZpZXcsIHR4LCB0eSwgJnBhdGgsICZjb2x1bW4sICZjeCwKKwkJCQkgICAgICAmY3kpOworCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCWd0a190cmVlX21vZGVsX2dldF9pdGVyKG1vZGVsMSwgJml0ZXIsIHBhdGgpOworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDEsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKworCWlmIChldmVudC0+dHlwZSA9PSBHREtfMkJVVFRPTl9QUkVTUykgeworCQl0b2dnbGVfc3ltX3ZhbHVlKG1lbnUpOworCQljdXJyZW50ID0gbWVudTsKKwkJZGlzcGxheV90cmVlX3BhcnQoKTsKKwl9IGVsc2UgeworCQlicm93c2VkID0gbWVudTsKKwkJZGlzcGxheV90cmVlX3BhcnQoKTsKKwl9CisKKwlndGtfd2lkZ2V0X3JlYWxpemUodHJlZTJfdyk7CisJZ3RrX3RyZWVfdmlld19zZXRfY3Vyc29yKHZpZXcsIHBhdGgsIE5VTEwsIEZBTFNFKTsKKwlndGtfd2lkZ2V0X2dyYWJfZm9jdXModHJlZTJfdyk7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyogRmlsbCBhIHJvdyBvZiBzdHJpbmdzICovCitzdGF0aWMgZ2NoYXIgKipmaWxsX3JvdyhzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdGF0aWMgZ2NoYXIgKnJvd1tDT0xfTlVNQkVSXTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJY29uc3QgY2hhciAqZGVmOworCWludCBzdHlwZTsKKwl0cmlzdGF0ZSB2YWw7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSBDT0xfT1BUSU9OOyBpIDw9IENPTF9DT0xPUjsgaSsrKQorCQlnX2ZyZWUocm93W2ldKTsKKwltZW1zZXQocm93LCAwLCBzaXplb2Yocm93KSk7CisKKwlyb3dbQ09MX09QVElPTl0gPQorCSAgICBnX3N0cmR1cF9wcmludGYoIiVzICVzIiwgbWVudV9nZXRfcHJvbXB0KG1lbnUpLAorCQkJICAgIHN5bSA/IChzeW0tPgorCQkJCSAgIGZsYWdzICYgU1lNQk9MX05FVyA/ICIoTkVXKSIgOiAiIikgOgorCQkJICAgICIiKTsKKworCWlmIChzaG93X2FsbCAmJiAhbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyb3dbQ09MX0NPTE9SXSA9IGdfc3RyZHVwKCJEYXJrR3JheSIpOworCWVsc2UKKwkJcm93W0NPTF9DT0xPUl0gPSBnX3N0cmR1cCgiQmxhY2siKTsKKworCXB0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCXN3aXRjaCAocHR5cGUpIHsKKwljYXNlIFBfTUVOVToKKwkJcm93W0NPTF9QSVhCVUZdID0gKGdjaGFyICopIHhwbV9tZW51OworCQlpZiAodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQkJcm93W0NPTF9QSVhWSVNdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlicmVhazsKKwljYXNlIFBfQ09NTUVOVDoKKwkJcm93W0NPTF9QSVhCVUZdID0gKGdjaGFyICopIHhwbV92b2lkOworCQlyb3dbQ09MX1BJWFZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyb3dbQ09MX1BJWEJVRl0gPSAoZ2NoYXIgKikgeHBtX3ZvaWQ7CisJCXJvd1tDT0xfUElYVklTXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFzeW0pCisJCXJldHVybiByb3c7CisJcm93W0NPTF9OQU1FXSA9IGdfc3RyZHVwKHN5bS0+bmFtZSk7CisKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEFOR0VEOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgewkvLyBwYXJzZSBjaGlsZHMgZm9yIGdldHRpbmcgZmluYWwgdmFsdWUKKwkJc3RydWN0IG1lbnUgKmNoaWxkOworCQlzdHJ1Y3Qgc3ltYm9sICpkZWZfc3ltID0gc3ltX2dldF9jaG9pY2VfdmFsdWUoc3ltKTsKKwkJc3RydWN0IG1lbnUgKmRlZl9tZW51ID0gTlVMTDsKKworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkKKwkJCSAgICAmJiBjaGlsZC0+c3ltID09IGRlZl9zeW0pCisJCQkJZGVmX21lbnUgPSBjaGlsZDsKKwkJfQorCisJCWlmIChkZWZfbWVudSkKKwkJCXJvd1tDT0xfVkFMVUVdID0KKwkJCSAgICBnX3N0cmR1cChtZW51X2dldF9wcm9tcHQoZGVmX21lbnUpKTsKKwl9CisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFVkFMKQorCQlyb3dbQ09MX0JUTlJBRF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisKKwlzdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXN3aXRjaCAoc3R5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJaWYgKEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX1BJWFZJU10pID09IEZBTFNFKQorCQkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJYnJlYWs7CisJY2FzZSBTX1RSSVNUQVRFOgorCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2Ugbm86CisJCQlyb3dbQ09MX05PXSA9IGdfc3RyZHVwKCJOIik7CisJCQlyb3dbQ09MX1ZBTFVFXSA9IGdfc3RyZHVwKCJOIik7CisJCQlyb3dbQ09MX0JUTkFDVF0gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJcm93W0NPTF9CVE5JTkNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJCWJyZWFrOworCQljYXNlIG1vZDoKKwkJCXJvd1tDT0xfTU9EXSA9IGdfc3RyZHVwKCJNIik7CisJCQlyb3dbQ09MX1ZBTFVFXSA9IGdfc3RyZHVwKCJNIik7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCQlicmVhazsKKwkJY2FzZSB5ZXM6CisJCQlyb3dbQ09MX1lFU10gPSBnX3N0cmR1cCgiWSIpOworCQkJcm93W0NPTF9WQUxVRV0gPSBnX3N0cmR1cCgiWSIpOworCQkJcm93W0NPTF9CVE5BQ1RdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQkJcm93W0NPTF9CVE5JTkNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHZhbCAhPSBubyAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pKQorCQkJcm93W0NPTF9OT10gPSBnX3N0cmR1cCgiXyIpOworCQlpZiAodmFsICE9IG1vZCAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSkKKwkJCXJvd1tDT0xfTU9EXSA9IGdfc3RyZHVwKCJfIik7CisJCWlmICh2YWwgIT0geWVzICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKQorCQkJcm93W0NPTF9ZRVNdID0gZ19zdHJkdXAoIl8iKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCWRlZiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoZGVmKTsKKwkJcm93W0NPTF9FRElUXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJvdzsKK30KKworCisvKiBTZXQgdGhlIG5vZGUgY29udGVudCB3aXRoIGEgcm93IG9mIHN0cmluZ3MgKi8KK3N0YXRpYyB2b2lkIHNldF9ub2RlKEd0a1RyZWVJdGVyICogbm9kZSwgc3RydWN0IG1lbnUgKm1lbnUsIGdjaGFyICoqIHJvdykKK3sKKwlHZGtDb2xvciBjb2xvcjsKKwlnYm9vbGVhbiBzdWNjZXNzOworCUdka1BpeGJ1ZiAqcGl4OworCisJcGl4ID0gZ2RrX3BpeGJ1Zl9uZXdfZnJvbV94cG1fZGF0YSgoY29uc3QgY2hhciAqKikKKwkJCQkJICAgcm93W0NPTF9QSVhCVUZdKTsKKworCWdka19jb2xvcl9wYXJzZShyb3dbQ09MX0NPTE9SXSwgJmNvbG9yKTsKKwlnZGtfY29sb3JtYXBfYWxsb2NfY29sb3JzKGdka19jb2xvcm1hcF9nZXRfc3lzdGVtKCksICZjb2xvciwgMSwKKwkJCQkgIEZBTFNFLCBGQUxTRSwgJnN1Y2Nlc3MpOworCisJZ3RrX3RyZWVfc3RvcmVfc2V0KHRyZWUsIG5vZGUsCisJCQkgICBDT0xfT1BUSU9OLCByb3dbQ09MX09QVElPTl0sCisJCQkgICBDT0xfTkFNRSwgcm93W0NPTF9OQU1FXSwKKwkJCSAgIENPTF9OTywgcm93W0NPTF9OT10sCisJCQkgICBDT0xfTU9ELCByb3dbQ09MX01PRF0sCisJCQkgICBDT0xfWUVTLCByb3dbQ09MX1lFU10sCisJCQkgICBDT0xfVkFMVUUsIHJvd1tDT0xfVkFMVUVdLAorCQkJICAgQ09MX01FTlUsIChncG9pbnRlcikgbWVudSwKKwkJCSAgIENPTF9DT0xPUiwgJmNvbG9yLAorCQkJICAgQ09MX0VESVQsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0VESVRdKSwKKwkJCSAgIENPTF9QSVhCVUYsIHBpeCwKKwkJCSAgIENPTF9QSVhWSVMsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX1BJWFZJU10pLAorCQkJICAgQ09MX0JUTlZJUywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfQlROVklTXSksCisJCQkgICBDT0xfQlROQUNULCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5BQ1RdKSwKKwkJCSAgIENPTF9CVE5JTkMsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0JUTklOQ10pLAorCQkJICAgQ09MX0JUTlJBRCwgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfQlROUkFEXSksCisJCQkgICAtMSk7CisKKwlnX29iamVjdF91bnJlZihwaXgpOworfQorCisKKy8qIEFkZCBhIG5vZGUgdG8gdGhlIHRyZWUgKi8KK3N0YXRpYyB2b2lkIHBsYWNlX25vZGUoc3RydWN0IG1lbnUgKm1lbnUsIGNoYXIgKipyb3cpCit7CisJR3RrVHJlZUl0ZXIgKnBhcmVudCA9IHBhcmVudHNbaW5kZW50IC0gMV07CisJR3RrVHJlZUl0ZXIgKm5vZGUgPSBwYXJlbnRzW2luZGVudF07CisKKwlndGtfdHJlZV9zdG9yZV9hcHBlbmQodHJlZSwgbm9kZSwgcGFyZW50KTsKKwlzZXRfbm9kZShub2RlLCBtZW51LCByb3cpOworfQorCisKKy8qIEZpbmQgYSBub2RlIGluIHRoZSBHVEsrIHRyZWUgKi8KK3N0YXRpYyBHdGtUcmVlSXRlciBmb3VuZDsKKworLyoKKyAqIEZpbmQgYSBtZW51IGluIHRoZSBHdGtUcmVlIHN0YXJ0aW5nIGF0IHBhcmVudC4KKyAqLworR3RrVHJlZUl0ZXIgKmd0a3RyZWVfaXRlcl9maW5kX25vZGUoR3RrVHJlZUl0ZXIgKiBwYXJlbnQsCisJCQkJICAgIHN0cnVjdCBtZW51ICp0b2ZpbmQpCit7CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlHdGtUcmVlSXRlciAqY2hpbGQgPSAmaXRlcjsKKwlnYm9vbGVhbiB2YWxpZDsKKwlHdGtUcmVlSXRlciAqcmV0OworCisJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX2NoaWxkcmVuKG1vZGVsMiwgY2hpbGQsIHBhcmVudCk7CisJd2hpbGUgKHZhbGlkKSB7CisJCXN0cnVjdCBtZW51ICptZW51OworCisJCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsIGNoaWxkLCA2LCAmbWVudSwgLTEpOworCisJCWlmIChtZW51ID09IHRvZmluZCkgeworCQkJbWVtY3B5KCZmb3VuZCwgY2hpbGQsIHNpemVvZihHdGtUcmVlSXRlcikpOworCQkJcmV0dXJuICZmb3VuZDsKKwkJfQorCisJCXJldCA9IGd0a3RyZWVfaXRlcl9maW5kX25vZGUoY2hpbGQsIHRvZmluZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXZhbGlkID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KG1vZGVsMiwgY2hpbGQpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiBVcGRhdGUgdGhlIHRyZWUgYnkgYWRkaW5nL3JlbW92aW5nIGVudHJpZXMKKyAqIERvZXMgbm90IGNoYW5nZSBvdGhlciBub2RlcworICovCitzdGF0aWMgdm9pZCB1cGRhdGVfdHJlZShzdHJ1Y3QgbWVudSAqc3JjLCBHdGtUcmVlSXRlciAqIGRzdCkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQxOworCUd0a1RyZWVJdGVyIGl0ZXIsIHRtcDsKKwlHdGtUcmVlSXRlciAqY2hpbGQyID0gJml0ZXI7CisJZ2Jvb2xlYW4gdmFsaWQ7CisJR3RrVHJlZUl0ZXIgKnNpYmxpbmc7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqbWVudTEsICptZW51MjsKKworCWlmIChzcmMgPT0gJnJvb3RtZW51KQorCQlpbmRlbnQgPSAxOworCisJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX2NoaWxkcmVuKG1vZGVsMiwgY2hpbGQyLCBkc3QpOworCWZvciAoY2hpbGQxID0gc3JjLT5saXN0OyBjaGlsZDE7IGNoaWxkMSA9IGNoaWxkMS0+bmV4dCkgeworCisJCXByb3AgPSBjaGlsZDEtPnByb21wdDsKKwkJc3ltID0gY2hpbGQxLT5zeW07CisKKwkgICAgICByZXBhcnNlOgorCQltZW51MSA9IGNoaWxkMTsKKwkJaWYgKHZhbGlkKQorCQkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgY2hpbGQyLCBDT0xfTUVOVSwKKwkJCQkJICAgJm1lbnUyLCAtMSk7CisJCWVsc2UKKwkJCW1lbnUyID0gTlVMTDsJLy8gZm9yY2UgYWRkaW5nIG9mIGEgZmlyc3QgY2hpbGQKKworI2lmZGVmIERFQlVHCisJCXByaW50ZigiJSpjJXMgfCAlc1xuIiwgaW5kZW50LCAnICcsCisJCSAgICAgICBtZW51MSA/IG1lbnVfZ2V0X3Byb21wdChtZW51MSkgOiAibmlsIiwKKwkJICAgICAgIG1lbnUyID8gbWVudV9nZXRfcHJvbXB0KG1lbnUyKSA6ICJuaWwiKTsKKyNlbmRpZgorCisJCWlmICghbWVudV9pc192aXNpYmxlKGNoaWxkMSkgJiYgIXNob3dfYWxsKSB7CS8vIHJlbW92ZSBub2RlCisJCQlpZiAoZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShkc3QsIG1lbnUxKSAhPSBOVUxMKSB7CisJCQkJbWVtY3B5KCZ0bXAsIGNoaWxkMiwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLAorCQkJCQkJCQkgY2hpbGQyKTsKKwkJCQlndGtfdHJlZV9zdG9yZV9yZW1vdmUodHJlZTIsICZ0bXApOworCQkJCWlmICghdmFsaWQpCisJCQkJCXJldHVybjsJLy8gbmV4dCBwYXJlbnQKKwkJCQllbHNlCisJCQkJCWdvdG8gcmVwYXJzZTsJLy8gbmV4dCBjaGlsZAorCQkJfSBlbHNlCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWVudTEgIT0gbWVudTIpIHsKKwkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpID09IE5VTEwpIHsJLy8gYWRkIG5vZGUKKwkJCQlpZiAoIXZhbGlkICYmICFtZW51MikKKwkJCQkJc2libGluZyA9IE5VTEw7CisJCQkJZWxzZQorCQkJCQlzaWJsaW5nID0gY2hpbGQyOworCQkJCWd0a190cmVlX3N0b3JlX2luc2VydF9iZWZvcmUodHJlZTIsCisJCQkJCQkJICAgICBjaGlsZDIsCisJCQkJCQkJICAgICBkc3QsIHNpYmxpbmcpOworCQkJCXNldF9ub2RlKGNoaWxkMiwgbWVudTEsIGZpbGxfcm93KG1lbnUxKSk7CisJCQkJaWYgKG1lbnUyID09IE5VTEwpCisJCQkJCXZhbGlkID0gVFJVRTsKKwkJCX0gZWxzZSB7CS8vIHJlbW92ZSBub2RlCisJCQkJbWVtY3B5KCZ0bXAsIGNoaWxkMiwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLAorCQkJCQkJCQkgY2hpbGQyKTsKKwkJCQlndGtfdHJlZV9zdG9yZV9yZW1vdmUodHJlZTIsICZ0bXApOworCQkJCWlmICghdmFsaWQpCisJCQkJCXJldHVybjsJLy8gbmV4dCBwYXJlbnQKKwkJCQllbHNlCisJCQkJCWdvdG8gcmVwYXJzZTsJLy8gbmV4dCBjaGlsZAorCQkJfQorCQl9IGVsc2UgaWYgKHN5bSAmJiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DSEFOR0VEKSkgeworCQkJc2V0X25vZGUoY2hpbGQyLCBtZW51MSwgZmlsbF9yb3cobWVudTEpKTsKKwkJfQorCisJCWluZGVudCsrOworCQl1cGRhdGVfdHJlZShjaGlsZDEsIGNoaWxkMik7CisJCWluZGVudC0tOworCisJCXZhbGlkID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KG1vZGVsMiwgY2hpbGQyKTsKKwl9Cit9CisKKworLyogRGlzcGxheSB0aGUgd2hvbGUgdHJlZSAoc2luZ2xlL3NwbGl0L2Z1bGwgdmlldykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfdHJlZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKworCWlmIChtZW51ID09ICZyb290bWVudSkgeworCQlpbmRlbnQgPSAxOworCQljdXJyZW50ID0gJnJvb3RtZW51OworCX0KKworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQlwcm9wID0gY2hpbGQtPnByb21wdDsKKwkJc3ltID0gY2hpbGQtPnN5bTsKKwkJcHR5cGUgPSBwcm9wID8gcHJvcC0+dHlwZSA6IFBfVU5LTk9XTjsKKworCQlpZiAoc3ltKQorCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX0NIQU5HRUQ7CisKKwkJaWYgKCh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykKKwkJICAgICYmICEoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKSAmJiAodHJlZSA9PSB0cmVlMSkpCisJCQljb250aW51ZTsKKworCQlpZiAoKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSAmJiAoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKQorCQkgICAgJiYgKHRyZWUgPT0gdHJlZTIpKQorCQkJY29udGludWU7CisKKwkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkgfHwgc2hvd19hbGwpCisJCQlwbGFjZV9ub2RlKGNoaWxkLCBmaWxsX3JvdyhjaGlsZCkpOworI2lmZGVmIERFQlVHCisJCXByaW50ZigiJSpjJXM6ICIsIGluZGVudCwgJyAnLCBtZW51X2dldF9wcm9tcHQoY2hpbGQpKTsKKwkJcHJpbnRmKCIlcyIsIGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCA/ICJyb290bWVudSB8ICIgOiAiIik7CisJCWRiZ19wcmludF9wdHlwZShwdHlwZSk7CisJCXByaW50ZigiIHwgIik7CisJCWlmIChzeW0pIHsKKwkJCWRiZ19wcmludF9zdHlwZShzeW0tPnR5cGUpOworCQkJcHJpbnRmKCIgfCAiKTsKKwkJCWRiZ19wcmludF9mbGFncyhzeW0tPmZsYWdzKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIlxuIik7CisjZW5kaWYKKwkJaWYgKCh2aWV3X21vZGUgIT0gRlVMTF9WSUVXKSAmJiAocHR5cGUgPT0gUF9NRU5VKQorCQkgICAgJiYgKHRyZWUgPT0gdHJlZTIpKQorCQkJY29udGludWU7CisvKgorCQlpZiAoKChtZW51ICE9ICZyb290bWVudSkgJiYgIShtZW51LT5mbGFncyAmIE1FTlVfUk9PVCkpCisJCSAgICB8fCAodmlld19tb2RlID09IEZVTExfVklFVykKKwkJICAgIHx8ICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykpKi8KKwkJaWYgKCgodmlld19tb2RlID09IFNJTkdMRV9WSUVXKSAmJiAobWVudS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKQorCQkgICAgfHwgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCSAgICB8fCAodmlld19tb2RlID09IFNQTElUX1ZJRVcpKSB7CisJCQlpbmRlbnQrKzsKKwkJCWRpc3BsYXlfdHJlZShjaGlsZCk7CisJCQlpbmRlbnQtLTsKKwkJfQorCX0KK30KKworLyogRGlzcGxheSBhIHBhcnQgb2YgdGhlIHRyZWUgc3RhcnRpbmcgYXQgY3VycmVudCBub2RlIChzaW5nbGUvc3BsaXQgdmlldykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfdHJlZV9wYXJ0KHZvaWQpCit7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJaWYgKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykKKwkJZGlzcGxheV90cmVlKGN1cnJlbnQpOworCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKQorCQlkaXNwbGF5X3RyZWUoYnJvd3NlZCk7CisJZ3RrX3RyZWVfdmlld19leHBhbmRfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisvKiBEaXNwbGF5IHRoZSBsaXN0IGluIHRoZSBsZWZ0IGZyYW1lIChzcGxpdCB2aWV3KSAqLworc3RhdGljIHZvaWQgZGlzcGxheV9saXN0KHZvaWQpCit7CisJaWYgKHRyZWUxKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMSk7CisKKwl0cmVlID0gdHJlZTE7CisJZGlzcGxheV90cmVlKCZyb290bWVudSk7CisJZ3RrX3RyZWVfdmlld19leHBhbmRfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTFfdykpOworCXRyZWUgPSB0cmVlMjsKK30KKwordm9pZCBmaXh1cF9yb290bWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RhdGljIGludCBtZW51X2NudCA9IDA7CisKKwltZW51LT5mbGFncyB8PSBNRU5VX1JPT1Q7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWlmIChjaGlsZC0+cHJvbXB0ICYmIGNoaWxkLT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKSB7CisJCQltZW51X2NudCsrOworCQkJZml4dXBfcm9vdG1lbnUoY2hpbGQpOworCQkJbWVudV9jbnQtLTsKKwkJfSBlbHNlIGlmICghbWVudV9jbnQpCisJCQlmaXh1cF9yb290bWVudShjaGlsZCk7CisJfQorfQorCisKKy8qIE1haW4gKi8KK2ludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKmVudjsKKwlnY2hhciAqZ2xhZGVfZmlsZTsKKworI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKKwlrY29uZmlnX2xvYWQoKTsKKyNlbmRpZgorCisJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKKwliaW5kX3RleHRkb21haW5fY29kZXNldChQQUNLQUdFLCAiVVRGLTgiKTsKKwl0ZXh0ZG9tYWluKFBBQ0tBR0UpOworCisJLyogR1RLIHN0dWZmcyAqLworCWd0a19zZXRfbG9jYWxlKCk7CisJZ3RrX2luaXQoJmFjLCAmYXYpOworCWdsYWRlX2luaXQoKTsKKworCS8vYWRkX3BpeG1hcF9kaXJlY3RvcnkgKFBBQ0tBR0VfREFUQV9ESVIgIi8iIFBBQ0tBR0UgIi9waXhtYXBzIik7CisJLy9hZGRfcGl4bWFwX2RpcmVjdG9yeSAoUEFDS0FHRV9TT1VSQ0VfRElSICIvcGl4bWFwcyIpOworCisJLyogRGV0ZXJtaW5lIEdVSSBwYXRoICovCisJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCWlmIChlbnYpCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChlbnYsICIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlIiwgTlVMTCk7CisJZWxzZSBpZiAoYXZbMF1bMF0gPT0gJy8nKQorCQlnbGFkZV9maWxlID0gZ19zdHJjb25jYXQoYXZbMF0sICIuZ2xhZGUiLCBOVUxMKTsKKwllbHNlCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChnX2dldF9jdXJyZW50X2RpcigpLCAiLyIsIGF2WzBdLCAiLmdsYWRlIiwgTlVMTCk7CisKKwkvKiBMb2FkIHRoZSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Qgc2lnbmFscyAqLworCWluaXRfbWFpbl93aW5kb3coZ2xhZGVfZmlsZSk7CisJaW5pdF90cmVlX21vZGVsKCk7CisJaW5pdF9sZWZ0X3RyZWUoKTsKKwlpbml0X3JpZ2h0X3RyZWUoKTsKKworCS8qIENvbmYgc3R1ZmZzICovCisJaWYgKGFjID4gMSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJc3dpdGNoIChhdlsxXVsxXSkgeworCQljYXNlICdhJzoKKwkJCS8vc2hvd0FsbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJcHJpbnRmKCIlcyA8Y29uZmlnPlxuIiwgYXZbMF0pOworCQkJZXhpdCgwKTsKKwkJfQorCQluYW1lID0gYXZbMl07CisJfSBlbHNlCisJCW5hbWUgPSBhdlsxXTsKKworCWNvbmZfcGFyc2UobmFtZSk7CisJZml4dXBfcm9vdG1lbnUoJnJvb3RtZW51KTsKKwljb25mX3JlYWQoTlVMTCk7CisKKwlzd2l0Y2ggKHZpZXdfbW9kZSkgeworCWNhc2UgU0lOR0xFX1ZJRVc6CisJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisJCWJyZWFrOworCWNhc2UgU1BMSVRfVklFVzoKKwkJZGlzcGxheV9saXN0KCk7CisJCWJyZWFrOworCWNhc2UgRlVMTF9WSUVXOgorCQlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwkJYnJlYWs7CisJfQorCisJZ3RrX21haW4oKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzQ0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUKQEAgLTAsMCArMSw2NDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4gPCEtLSotIG1vZGU6IHhtbCAtKi0tPgorPCFET0NUWVBFIGdsYWRlLWludGVyZmFjZSBTWVNURU0gImh0dHA6Ly9nbGFkZS5nbm9tZS5vcmcvZ2xhZGUtMi4wLmR0ZCI+CisKKzxnbGFkZS1pbnRlcmZhY2U+CisKKzx3aWRnZXQgY2xhc3M9Ikd0a1dpbmRvdyIgaWQ9IndpbmRvdzEiPgorICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkd0ayBLZXJuZWwgQ29uZmlndXJhdG9yPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InR5cGUiPkdUS19XSU5ET1dfVE9QTEVWRUw8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0id2luZG93X3Bvc2l0aW9uIj5HVEtfV0lOX1BPU19OT05FPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9Im1vZGFsIj5GYWxzZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0X3dpZHRoIj42NDA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdF9oZWlnaHQiPjQ4MDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemFibGUiPlRydWU8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVzdHJveV93aXRoX3BhcmVudCI+RmFsc2U8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVjb3JhdGVkIj5UcnVlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InNraXBfdGFza2Jhcl9oaW50Ij5GYWxzZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJza2lwX3BhZ2VyX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InR5cGVfaGludCI+R0RLX1dJTkRPV19UWVBFX0hJTlRfTk9STUFMPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImdyYXZpdHkiPkdES19HUkFWSVRZX05PUlRIX1dFU1Q8L3Byb3BlcnR5PgorICA8c2lnbmFsIG5hbWU9ImRlc3Ryb3kiIGhhbmRsZXI9Im9uX3dpbmRvdzFfZGVzdHJveSIgb2JqZWN0PSJ3aW5kb3cxIi8+CisgIDxzaWduYWwgbmFtZT0ic2l6ZV9yZXF1ZXN0IiBoYW5kbGVyPSJvbl93aW5kb3cxX3NpemVfcmVxdWVzdCIgb2JqZWN0PSJ2cGFuZWQxIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDExIEphbiAyMDAyIDE2OjE3OjExIEdNVCIvPgorICA8c2lnbmFsIG5hbWU9ImRlbGV0ZV9ldmVudCIgaGFuZGxlcj0ib25fd2luZG93MV9kZWxldGVfZXZlbnQiIG9iamVjdD0id2luZG93MSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAwOSBNYXIgMjAwMyAxOTo0Mjo0NiBHTVQiLz4KKworICA8Y2hpbGQ+CisgICAgPHdpZGdldCBjbGFzcz0iR3RrVkJveCIgaWQ9InZib3gxIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciPjA8L3Byb3BlcnR5PgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrTWVudUJhciIgaWQ9Im1lbnViYXIxIj4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9ImZpbGUxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0ZpbGU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9ImZpbGUxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImxvYWQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9Mb2FkPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9sb2FkMV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJMIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UzOSI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstb3BlbjwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJzYXZlMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIHRoZSBjb25maWcgaW4gLmNvbmZpZzwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9TYXZlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zYXZlMV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJTIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2U0MCI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstc2F2ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJzYXZlX2FzMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIHRoZSBjb25maWcgaW4gYSBmaWxlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZSBfYXM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3NhdmVfYXMxX2FjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlNDEiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXNhdmUtYXM8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtTZXBhcmF0b3JNZW51SXRlbSIgaWQ9InNlcGFyYXRvcjEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9InF1aXQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fUXVpdDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fcXVpdDFfYWN0aXZhdGUiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iUSIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlNDIiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXF1aXQ8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgPC9jaGlsZD4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9Im9wdGlvbnMxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X09wdGlvbnM8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9Im9wdGlvbnMxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfbmFtZTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBuYW1lPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfbmFtZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X25hbWUxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfcmFuZ2UxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgcmFuZ2UgKFkvTS9OKTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgX3JhbmdlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfcmFuZ2UxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfZGF0YTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyB2YWx1ZSBvZiB0aGUgb3B0aW9uPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfZGF0YTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2RhdGExX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrU2VwYXJhdG9yTWVudUl0ZW0iIGlkPSJzZXBhcmF0b3IyIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X2FsbF9vcHRpb25zMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IGFsbCBvcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBhbGwgX29wdGlvbnM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19hbGxfb3B0aW9uczFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19kZWJ1Z19pbmZvMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IG1hc2tlZCBvcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfZGVidWcgaW5mbzwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2RlYnVnX2luZm8xX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJoZWxwMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9IZWxwPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a01lbnUiIGlkPSJoZWxwMV9tZW51Ij4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJpbnRyb2R1Y3Rpb24xIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fSW50cm9kdWN0aW9uPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9pbnRyb2R1Y3Rpb24xX2FjdGl2YXRlIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDE1IE5vdiAyMDAyIDIwOjI2OjMwIEdNVCIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJJIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2U0MyI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstZGlhbG9nLXF1ZXN0aW9uPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImFib3V0MSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0Fib3V0PC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9hYm91dDFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IkEiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTQ0Ij4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1wcm9wZXJ0aWVzPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImxpY2Vuc2UxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fTGljZW5zZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fbGljZW5zZTFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlNDUiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLWp1c3RpZnktZmlsbDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrSGFuZGxlQm94IiBpZD0iaGFuZGxlYm94MSI+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfT1VUPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVfcG9zaXRpb24iPkdUS19QT1NfTEVGVDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0ic25hcF9lZGdlIj5HVEtfUE9TX1RPUDwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrVG9vbGJhciIgaWQ9InRvb2xiYXIxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9Im9yaWVudGF0aW9uIj5HVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTDwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2xiYXJfc3R5bGUiPkdUS19UT09MQkFSX0JPVEg8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwcyI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InNob3dfYXJyb3ciPlRydWU8L3Byb3BlcnR5PgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uMSI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+R29lcyB1cCBvZiBvbmUgbGV2ZWwgKHNpbmdsZSB2aWV3KTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+QmFjazwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLXVuZG88L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9iYWNrX2NsaWNrZWQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEl0ZW0iIGlkPSJ0b29saXRlbTEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b24yIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5Mb2FkIGEgY29uZmlnIGZpbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQ8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1vcGVuPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fbG9hZF9jbGlja2VkIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b24zIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIGEgY29uZmlnIGZpbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1zYXZlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fc2F2ZV9jbGlja2VkIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xJdGVtIiBpZD0idG9vbGl0ZW0yIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZTZXBhcmF0b3IiIGlkPSJ2c2VwYXJhdG9yMiI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5GYWxzZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uNCI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2luZ2xlIHZpZXc8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNpbmdsZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLW1pc3NpbmctaW1hZ2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zaW5nbGVfY2xpY2tlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNDoyODozOSBHTVQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjUiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNwbGl0IHZpZXc8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNwbGl0PC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX3NwbGl0X2NsaWNrZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTQ6Mjg6NDUgR01UIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b242Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5GdWxsIHZpZXc8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkZ1bGw8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1taXNzaW5nLWltYWdlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fZnVsbF9jbGlja2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE0OjI4OjUwIEdNVCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sSXRlbSIgaWQ9InRvb2xpdGVtMyI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWU2VwYXJhdG9yIiBpZD0idnNlcGFyYXRvcjMiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+RmFsc2U8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjciPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkNvbGxhcHNlIHRoZSB3aG9sZSB0cmVlIGluIHRoZSByaWdodCBmcmFtZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Q29sbGFwc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1yZW1vdmU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9jb2xsYXBzZV9jbGlja2VkIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b244Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5FeHBhbmQgdGhlIHdob2xlIHRyZWUgaW4gdGhlIHJpZ2h0IGZyYW1lPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5FeHBhbmQ8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1hZGQ8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9leHBhbmRfY2xpY2tlZCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgIDwvY2hpbGQ+CisJPC93aWRnZXQ+CisJPHBhY2tpbmc+CisJICA8cHJvcGVydHkgbmFtZT0icGFkZGluZyI+MDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZmlsbCI+RmFsc2U8L3Byb3BlcnR5PgorCTwvcGFja2luZz4KKyAgICAgIDwvY2hpbGQ+CisKKyAgICAgIDxjaGlsZD4KKwk8d2lkZ2V0IGNsYXNzPSJHdGtIUGFuZWQiIGlkPSJocGFuZWQxIj4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJ3aWR0aF9yZXF1ZXN0Ij4xPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4wPC9wcm9wZXJ0eT4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtTY3JvbGxlZFdpbmRvdyIgaWQ9InNjcm9sbGVkd2luZG93MSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaGFkb3dfdHlwZSI+R1RLX1NIQURPV19JTjwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wbGFjZW1lbnQiPkdUS19DT1JORVJfVE9QX0xFRlQ8L3Byb3BlcnR5PgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUcmVlVmlldyIgaWQ9InRyZWV2aWV3MSI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJzX3Zpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJydWxlc19oaW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlb3JkZXJhYmxlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZV9zZWFyY2giPlRydWU8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY3Vyc29yX2NoYW5nZWQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9jdXJzb3JfY2hhbmdlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1ODoyMiBHTVQiLz4KKwkJICA8c2lnbmFsIG5hbWU9ImJ1dHRvbl9wcmVzc19ldmVudCIgaGFuZGxlcj0ib25fdHJlZXZpZXcxX2J1dHRvbl9wcmVzc19ldmVudCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNjowMzo1MiBHTVQiLz4KKwkJICA8c2lnbmFsIG5hbWU9ImtleV9wcmVzc19ldmVudCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2tleV9wcmVzc19ldmVudCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNjoxMTo0NCBHTVQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICAgIDxwYWNraW5nPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaHJpbmsiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkgICAgPC9wYWNraW5nPgorCSAgPC9jaGlsZD4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWUGFuZWQiIGlkPSJ2cGFuZWQxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4wPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzIiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfSU48L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcGxhY2VtZW50Ij5HVEtfQ09STkVSX1RPUF9MRUZUPC9wcm9wZXJ0eT4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1RyZWVWaWV3IiBpZD0idHJlZXZpZXcyIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9Imhhc19mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJzX3Zpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icnVsZXNfaGludCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icmVvcmRlcmFibGUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZV9zZWFyY2giPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImN1cnNvcl9jaGFuZ2VkIiBoYW5kbGVyPSJvbl90cmVldmlldzJfY3Vyc29yX2NoYW5nZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTc6NTUgR01UIi8+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYnV0dG9uX3ByZXNzX2V2ZW50IiBoYW5kbGVyPSJvbl90cmVldmlldzJfYnV0dG9uX3ByZXNzX2V2ZW50IiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU3OjU4IEdNVCIvPgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImtleV9wcmVzc19ldmVudCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2tleV9wcmVzc19ldmVudCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1ODowMSBHTVQiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5GYWxzZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtTY3JvbGxlZFdpbmRvdyIgaWQ9InNjcm9sbGVkd2luZG93MyI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJoc2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9ORVZFUjwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InNoYWRvd190eXBlIj5HVEtfU0hBRE9XX0lOPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0id2luZG93X3BsYWNlbWVudCI+R1RLX0NPUk5FUl9UT1BfTEVGVDwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUZXh0VmlldyIgaWQ9InRleHR2aWV3MyI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlZGl0YWJsZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ib3ZlcndyaXRlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY2NlcHRzX3RhYiI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqdXN0aWZpY2F0aW9uIj5HVEtfSlVTVElGWV9MRUZUPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9IndyYXBfbW9kZSI+R1RLX1dSQVBfV09SRDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJzb3JfdmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXhlbHNfYWJvdmVfbGluZXMiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icGl4ZWxzX2JlbG93X2xpbmVzIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InBpeGVsc19pbnNpZGVfd3JhcCI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X21hcmdpbiI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9tYXJnaW4iPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iaW5kZW50Ij4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiIHRyYW5zbGF0YWJsZT0ieWVzIj5Tb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIHlldC48L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzaHJpbmsiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemUiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICAgIDxwYWNraW5nPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaHJpbmsiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemUiPlRydWU8L3Byb3BlcnR5PgorCSAgICA8L3BhY2tpbmc+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZmlsbCI+VHJ1ZTwvcHJvcGVydHk+CisJPC9wYWNraW5nPgorICAgICAgPC9jaGlsZD4KKyAgICA8L3dpZGdldD4KKyAgPC9jaGlsZD4KKzwvd2lkZ2V0PgorCis8L2dsYWRlLWludGVyZmFjZT4KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9pbWFnZXMuYyBiL3NjcmlwdHMva2NvbmZpZy9pbWFnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGY4NGJkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9sb2FkW10gPSB7CisiMjIgMjIgNSAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorImMgYyAjODM4MTAwIiwKKyJhIGMgI2ZmZmYwMCIsCisiYiBjICNmZmZmZmYiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLiMjIyMuLi4uIy4iLAorIi4uLi4uLi4uLi4uIy4uLi4jIy4jIy4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLiMjIy4iLAorIi4uLi4uLi4uLi4uLi4uLi4uIyMjIy4iLAorIi4jIyMjLi4uLi4uLi4uLi4jIyMjIy4iLAorIiNhYmFiIyMjIyMjIyMjIy4uLi4uLi4iLAorIiNiYWJhYmFiYWJhYmFiIy4uLi4uLi4iLAorIiNhYmFiYWJhYmFiYWJhIy4uLi4uLi4iLAorIiNiYWJhYmFiYWJhYmFiIy4uLi4uLi4iLAorIiNhYmFiYWIjIyMjIyMjIyMjIyMjIyMiLAorIiNiYWJhYiMjY2NjY2NjY2NjY2NjIyMiLAorIiNhYmFiIyNjY2NjY2NjY2NjY2MjIy4iLAorIiNiYWIjI2NjY2NjY2NjY2NjYyMjLi4iLAorIiNhYiMjY2NjY2NjY2NjY2NjIyMuLi4iLAorIiNiIyNjY2NjY2NjY2NjY2MjIy4uLi4iLAorIiMjI2NjY2NjY2NjY2NjYyMjLi4uLi4iLAorIiMjY2NjY2NjY2NjY2NjIyMuLi4uLi4iLAorIiMjIyMjIyMjIyMjIyMjIy4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zYXZlW10gPSB7CisiMjIgMjIgNSAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorImEgYyAjODM4MTAwIiwKKyJiIGMgI2M1YzJjNSIsCisiYyBjICNjZGI2ZDUiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4jIyMjIyMjIyMjIyMjIyMjIyMjIy4iLAorIi4jYWEjYmJiYmJiYmJiYmJiI2JiIy4iLAorIi4jYWEjYmJiYmJiYmJiYmJiI2JiIy4iLAorIi4jYWEjYmJiYmJiYmJiY2JiIyMjIy4iLAorIi4jYWEjYmJiY2NiYmJiYmJiI2FhIy4iLAorIi4jYWEjYmJiY2NiYmJiYmJiI2FhIy4iLAorIi4jYWEjYmJiYmJiYmJiYmJiI2FhIy4iLAorIi4jYWEjYmJiYmJiYmJiYmJiI2FhIy4iLAorIi4jYWEjYmJiYmJiYmJiYmJiI2FhIy4iLAorIi4jYWEjYmJiYmJiYmJiYmJiI2FhIy4iLAorIi4jYWFhIyMjIyMjIyMjIyMjYWFhIy4iLAorIi4jYWFhYWFhYWFhYWFhYWFhYWFhIy4iLAorIi4jYWFhYWFhYWFhYWFhYWFhYWFhIy4iLAorIi4jYWFhIyMjIyMjIyMjIyMjI2FhIy4iLAorIi4jYWFhIyMjIyMjIyMjYmJiI2FhIy4iLAorIi4jYWFhIyMjIyMjIyMjYmJiI2FhIy4iLAorIi4jYWFhIyMjIyMjIyMjYmJiI2FhIy4iLAorIi4jYWFhIyMjIyMjIyMjYmJiI2FhIy4iLAorIi4jYWFhIyMjIyMjIyMjYmJiI2FhIy4iLAorIi4uIyMjIyMjIyMjIyMjIyMjIyMjLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9iYWNrW10gPSB7CisiMjIgMjIgMyAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwODMiLAorImEgYyAjODM4MTgzIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLiMjIyMjI2EuLi4uIiwKKyIuLiMuLi4uLi4jIyMjIyMjIyMjLi4uIiwKKyIuLiMjLi4uIyMjIy4uLi4uLiMjYS4uIiwKKyIuLiMjIy4jIyMuLi4uLi4uLi4jIy4uIiwKKyIuLiMjIyMjIy4uLi4uLi4uLi4jIy4uIiwKKyIuLiMjIyMjLi4uLi4uLi4uLi4jIy4uIiwKKyIuLiMjIyMjIy4uLi4uLi4uLi4jIy4uIiwKKyIuLiMjIyMjIyMuLi4uLi4uLi4jIy4uIiwKKyIuLiMjIyMjIyMjLi4uLi4uLiMjYS4uIiwKKyIuLi4uLi4uLi4uLi4uLi5hIyMjLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4jIyMuLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fdHJlZV92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMjIyMjIyMjLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMjIyMjIyMjLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMjIyMjIyMjLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zaW5nbGVfdmlld1tdID0geworIjIyIDIyIDIgMSIsCisiLiBjIE5vbmUiLAorIiMgYyAjMDAwMDAwIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uIy4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc3BsaXRfdmlld1tdID0geworIjIyIDIyIDIgMSIsCisiLiBjIE5vbmUiLAorIiMgYyAjMDAwMDAwIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uIy4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc3ltYm9sX25vW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3N5bWJvbF9tb2RbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgLi4gICAuICIsCisiIC4gIC4uLi4gIC4gIiwKKyIgLiAgLi4uLiAgLiAiLAorIiAuICAgLi4gICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc3ltYm9sX3llc1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAuIC4gIiwKKyIgLiAgICAgLi4gLiAiLAorIiAuIC4gIC4uICAuICIsCisiIC4gLi4uLiAgIC4gIiwKKyIgLiAgLi4gICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9jaG9pY2Vfbm9bXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAgICAuLi4uICAgICIsCisiICAuLiAgICAuLiAgIiwKKyIgIC4gICAgICAuICAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiICAuICAgICAgLiAgIiwKKyIgIC4uICAgIC4uICAiLAorIiAgICAuLi4uICAgICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fY2hvaWNlX3llc1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgIC4uLi4gICAgIiwKKyIgIC4uICAgIC4uICAiLAorIiAgLiAgICAgIC4gICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgLi4uLiAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgIC4gICAgICAuICAiLAorIiAgLi4gICAgLi4gICIsCisiICAgIC4uLi4gICAgIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9tZW51W10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gLi4gICAgIC4gIiwKKyIgLiAuLi4uICAgLiAiLAorIiAuIC4uLi4uLiAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uICAgLiAiLAorIiAuIC4uICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX21lbnVfaW52W10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4uICAuLi4uLi4gIiwKKyIgLi4gICAgLi4uLiAiLAorIiAuLiAgICAgIC4uICIsCisiIC4uICAgICAgLi4gIiwKKyIgLi4gICAgLi4uLiAiLAorIiAuLiAgLi4uLi4uICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX21lbnViYWNrW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgIC4uIC4gIiwKKyIgLiAgIC4uLi4gLiAiLAorIiAuIC4uLi4uLiAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAgIC4uLi4gLiAiLAorIiAuICAgICAuLiAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3ZvaWRbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcva2NvbmZpZ19sb2FkLmMgYi9zY3JpcHRzL2tjb25maWcva2NvbmZpZ19sb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4N2RkNQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYwpAQCAtMCwwICsxLDM1IEBACisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQl0eXBlICgqbmFtZSAjIyBfcCkgYXJnCisjaW5jbHVkZSAibGtjX3Byb3RvLmgiCisjdW5kZWYgUAorCit2b2lkIGtjb25maWdfbG9hZCh2b2lkKQoreworCXZvaWQgKmhhbmRsZTsKKwljaGFyICplcnJvcjsKKworCWhhbmRsZSA9IGRsb3BlbigiLi9saWJrY29uZmlnLnNvIiwgUlRMRF9MQVpZKTsKKwlpZiAoIWhhbmRsZSkgeworCQloYW5kbGUgPSBkbG9wZW4oIi4vc2NyaXB0cy9rY29uZmlnL2xpYmtjb25maWcuc28iLCBSVExEX0xBWlkpOworCQlpZiAoIWhhbmRsZSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZGxlcnJvcigpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQkJCVwKK3sJCQkJCQlcCisJbmFtZSAjIyBfcCA9IGRsc3ltKGhhbmRsZSwgI25hbWUpOwlcCisJaWYgKChlcnJvciA9IGRsZXJyb3IoKSkpICB7CQlcCisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGVycm9yKTsJXAorCQlleGl0KDEpOwkJCVwKKwl9CQkJCQlcCit9CisjaW5jbHVkZSAibGtjX3Byb3RvLmgiCisjdW5kZWYgUAorfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWU1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4sIDIwMDUKKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIGNoYXIgKmVzY2FwZShjb25zdCBjaGFyKiB0ZXh0LCBjaGFyICpiZiwgaW50IGxlbikKK3sKKwljaGFyICpiZnAgPSBiZjsKKwlpbnQgbXVsdGlsaW5lID0gc3RyY2hyKHRleHQsICdcbicpICE9IE5VTEw7CisJaW50IGVvbCA9IDA7CisJaW50IHRleHRsZW4gPSBzdHJsZW4odGV4dCk7CisKKwlpZiAoKHRleHRsZW4gPiAwKSAmJiAodGV4dFt0ZXh0bGVuLTFdID09ICdcbicpKQorCQllb2wgPSAxOworCisJKmJmcCsrID0gJyInOworCS0tbGVuOworCisJaWYgKG11bHRpbGluZSkgeworCQkqYmZwKysgPSAnIic7CisJCSpiZnArKyA9ICdcbic7CisJCSpiZnArKyA9ICciJzsKKwkJbGVuIC09IDM7CisJfQorCisJd2hpbGUgKCp0ZXh0ICE9ICdcMCcgJiYgbGVuID4gMSkgeworCQlpZiAoKnRleHQgPT0gJyInKQorCQkJKmJmcCsrID0gJ1xcJzsKKwkJZWxzZSBpZiAoKnRleHQgPT0gJ1xuJykgeworCQkJKmJmcCsrID0gJ1xcJzsKKwkJCSpiZnArKyA9ICduJzsKKwkJCSpiZnArKyA9ICciJzsKKwkJCSpiZnArKyA9ICdcbic7CisJCQkqYmZwKysgPSAnIic7CisJCQlsZW4gLT0gNTsKKwkJCSsrdGV4dDsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQkqYmZwKysgPSAqdGV4dCsrOworbmV4dDoKKwkJLS1sZW47CisJfQorCisJaWYgKG11bHRpbGluZSAmJiBlb2wpCisJCWJmcCAtPSAzOworCisJKmJmcCsrID0gJyInOworCSpiZnAgPSAnXDAnOworCisJcmV0dXJuIGJmOworfQorCitzdHJ1Y3QgZmlsZV9saW5lIHsKKwlzdHJ1Y3QgZmlsZV9saW5lICpuZXh0OworCWNoYXIqCQkgZmlsZTsKKwlpbnQJCSBsaW5lbm87Cit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfbGluZSAqZmlsZV9saW5lX19uZXcoY2hhciAqZmlsZSwgaW50IGxpbmVubykKK3sKKwlzdHJ1Y3QgZmlsZV9saW5lICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworCisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzZWxmLT5maWxlICAgPSBmaWxlOworCXNlbGYtPmxpbmVubyA9IGxpbmVubzsKKwlzZWxmLT5uZXh0ICAgPSBOVUxMOworb3V0OgorCXJldHVybiBzZWxmOworfQorCitzdHJ1Y3QgbWVzc2FnZSB7CisJY29uc3QgY2hhcgkgKm1zZzsKKwljb25zdCBjaGFyCSAqb3B0aW9uOworCXN0cnVjdCBtZXNzYWdlCSAqbmV4dDsKKwlzdHJ1Y3QgZmlsZV9saW5lICpmaWxlczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVzc2FnZSAqbWVzc2FnZV9fbGlzdDsKKworc3RhdGljIHN0cnVjdCBtZXNzYWdlICptZXNzYWdlX19uZXcoY29uc3QgY2hhciAqbXNnLCBjaGFyICpvcHRpb24sIGNoYXIgKmZpbGUsIGludCBsaW5lbm8pCit7CisJc3RydWN0IG1lc3NhZ2UgKnNlbGYgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSk7CisKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXNlbGYtPmZpbGVzID0gZmlsZV9saW5lX19uZXcoZmlsZSwgbGluZW5vKTsKKwlpZiAoc2VsZi0+ZmlsZXMgPT0gTlVMTCkKKwkJZ290byBvdXRfZmFpbDsKKworCXNlbGYtPm1zZyA9IHN0cmR1cChtc2cpOworCWlmIChzZWxmLT5tc2cgPT0gTlVMTCkKKwkJZ290byBvdXRfZmFpbF9tc2c7CisKKwlzZWxmLT5vcHRpb24gPSBvcHRpb247CisJc2VsZi0+bmV4dCA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIHNlbGY7CitvdXRfZmFpbF9tc2c6CisJZnJlZShzZWxmLT5maWxlcyk7CitvdXRfZmFpbDoKKwlmcmVlKHNlbGYpOworCXNlbGYgPSBOVUxMOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IG1lc3NhZ2UgKm1lc2FnZV9fZmluZChjb25zdCBjaGFyICptc2cpCit7CisJc3RydWN0IG1lc3NhZ2UgKm0gPSBtZXNzYWdlX19saXN0OworCisJd2hpbGUgKG0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKG0tPm1zZywgbXNnKSA9PSAwKQorCQkJYnJlYWs7CisJCW0gPSBtLT5uZXh0OworCX0KKworCXJldHVybiBtOworfQorCitzdGF0aWMgaW50IG1lc3NhZ2VfX2FkZF9maWxlX2xpbmUoc3RydWN0IG1lc3NhZ2UgKnNlbGYsIGNoYXIgKmZpbGUsIGludCBsaW5lbm8pCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IGZpbGVfbGluZSAqZmwgPSBmaWxlX2xpbmVfX25ldyhmaWxlLCBsaW5lbm8pOworCisJaWYgKGZsID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZmwtPm5leHQgICAgPSBzZWxmLT5maWxlczsKKwlzZWxmLT5maWxlcyA9IGZsOworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbWVzc2FnZV9fYWRkKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqb3B0aW9uLCBjaGFyICpmaWxlLCBpbnQgbGluZW5vKQoreworCWludCByYyA9IDA7CisJY2hhciBiZlsxNjM4NF07CisJY2hhciAqZXNjYXBlZCA9IGVzY2FwZShtc2csIGJmLCBzaXplb2YoYmYpKTsKKwlzdHJ1Y3QgbWVzc2FnZSAqbSA9IG1lc2FnZV9fZmluZChlc2NhcGVkKTsKKworCWlmIChtICE9IE5VTEwpCisJCXJjID0gbWVzc2FnZV9fYWRkX2ZpbGVfbGluZShtLCBmaWxlLCBsaW5lbm8pOworCWVsc2UgeworCQltID0gbWVzc2FnZV9fbmV3KGVzY2FwZWQsIG9wdGlvbiwgZmlsZSwgbGluZW5vKTsKKworCQlpZiAobSAhPSBOVUxMKSB7CisJCQltLT5uZXh0CSAgICAgID0gbWVzc2FnZV9fbGlzdDsKKwkJCW1lc3NhZ2VfX2xpc3QgPSBtOworCQl9IGVsc2UKKwkJCXJjID0gLTE7CisJfQorCXJldHVybiByYzsKK30KKwordm9pZCBtZW51X2J1aWxkX21lc3NhZ2VfbGlzdChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwltZXNzYWdlX19hZGQobWVudV9nZXRfcHJvbXB0KG1lbnUpLCBOVUxMLAorCQkgICAgIG1lbnUtPmZpbGUgPT0gTlVMTCA/ICJSb290IE1lbnUiIDogbWVudS0+ZmlsZS0+bmFtZSwKKwkJICAgICBtZW51LT5saW5lbm8pOworCisJaWYgKG1lbnUtPnN5bSAhPSBOVUxMICYmIG1lbnUtPnN5bS0+aGVscCAhPSBOVUxMKQorCQltZXNzYWdlX19hZGQobWVudS0+c3ltLT5oZWxwLCBtZW51LT5zeW0tPm5hbWUsCisJCQkgICAgIG1lbnUtPmZpbGUgPT0gTlVMTCA/ICJSb290IE1lbnUiIDogbWVudS0+ZmlsZS0+bmFtZSwKKwkJCSAgICAgbWVudS0+bGluZW5vKTsKKworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQlpZiAoY2hpbGQtPnByb21wdCAhPSBOVUxMKQorCQkJbWVudV9idWlsZF9tZXNzYWdlX2xpc3QoY2hpbGQpOworfQorCitzdGF0aWMgdm9pZCBtZXNzYWdlX19wcmludF9maWxlX2xpbmVubyhzdHJ1Y3QgbWVzc2FnZSAqc2VsZikKK3sKKwlzdHJ1Y3QgZmlsZV9saW5lICpmbCA9IHNlbGYtPmZpbGVzOworCisJcHV0Y2hhcignXG4nKTsKKwlpZiAoc2VsZi0+b3B0aW9uICE9IE5VTEwpCisJCXByaW50ZigiIyAlczowMDAwMFxuIiwgc2VsZi0+b3B0aW9uKTsKKworCXByaW50ZigiIzogJXM6JWQiLCBmbC0+ZmlsZSwgZmwtPmxpbmVubyk7CisJZmwgPSBmbC0+bmV4dDsKKworCXdoaWxlIChmbCAhPSBOVUxMKSB7CisJCXByaW50ZigiLCAlczolZCIsIGZsLT5maWxlLCBmbC0+bGluZW5vKTsKKwkJZmwgPSBmbC0+bmV4dDsKKwl9CisKKwlwdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgdm9pZCBtZXNzYWdlX19wcmludF9nZXR0ZXh0X21zZ2lkX21zZ3N0cihzdHJ1Y3QgbWVzc2FnZSAqc2VsZikKK3sKKwltZXNzYWdlX19wcmludF9maWxlX2xpbmVubyhzZWxmKTsKKworCXByaW50ZigibXNnaWQgJXNcbiIKKwkgICAgICAgIm1zZ3N0ciBcIlwiXG4iLCBzZWxmLT5tc2cpOworfQorCit2b2lkIG1lbnVfX3hnZXR0ZXh0KHZvaWQpCit7CisJc3RydWN0IG1lc3NhZ2UgKm0gPSBtZXNzYWdlX19saXN0OworCisJd2hpbGUgKG0gIT0gTlVMTCkgeworCQltZXNzYWdlX19wcmludF9nZXR0ZXh0X21zZ2lkX21zZ3N0cihtKTsKKwkJbSA9IG0tPm5leHQ7CisJfQorfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwljb25mX3BhcnNlKGF2WzFdKTsKKworCW1lbnVfYnVpbGRfbWVzc2FnZV9saXN0KG1lbnVfZ2V0X3Jvb3RfbWVudShOVUxMKSk7CisJbWVudV9feGdldHRleHQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMTVlMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjMyNSBAQAorCisjbGluZSAzICJzY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmMiCisKKyNkZWZpbmUgIFlZX0lOVF9BTElHTkVEIHNob3J0IGludAorCisvKiBBIGxleGljYWwgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgZmxleCAqLworCisjZGVmaW5lIEZMRVhfU0NBTk5FUgorI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQorI2RlZmluZSBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gMzEKKyNpZiBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gPiAwCisjZGVmaW5lIEZMRVhfQkVUQQorI2VuZGlmCisKKy8qIEZpcnN0LCB3ZSBkZWFsIHdpdGggIHBsYXRmb3JtLXNwZWNpZmljIG9yIGNvbXBpbGVyLXNwZWNpZmljIGlzc3Vlcy4gKi8KKworLyogYmVnaW4gc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogZW5kIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKworLyogZmxleCBpbnRlZ2VyIHR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2lmbmRlZiBGTEVYSU5UX0gKKyNkZWZpbmUgRkxFWElOVF9ICisKKy8qIEM5OSBzeXN0ZW1zIGhhdmUgPGludHR5cGVzLmg+LiBOb24tQzk5IHN5c3RlbXMgbWF5IG9yIG1heSBub3QuICovCisKKyNpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KK3R5cGVkZWYgaW50OF90IGZsZXhfaW50OF90OwordHlwZWRlZiB1aW50OF90IGZsZXhfdWludDhfdDsKK3R5cGVkZWYgaW50MTZfdCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIHVpbnQxNl90IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgZmxleF9pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCBmbGV4X3VpbnQzMl90OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGNoYXIgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIGludCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgZmxleF91aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGZsZXhfdWludDMyX3Q7CisjZW5kaWYgLyogISBDOTkgKi8KKworLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAqLworI2lmbmRlZiBJTlQ4X01JTgorI2RlZmluZSBJTlQ4X01JTiAgICAgICAgICAgICAgICgtMTI4KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorI2RlZmluZSBJTlQxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NSU4KKyNkZWZpbmUgSU5UMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQ4X01BWAorI2RlZmluZSBJTlQ4X01BWCAgICAgICAgICAgICAgICgxMjcpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUFYCisjZGVmaW5lIElOVDE2X01BWCAgICAgICAgICAgICAgKDMyNzY3KQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAgICAgICAgICAgICgyMTQ3NDgzNjQ3KQorI2VuZGlmCisjaWZuZGVmIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgICAgICAgICAgICgyNTVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVUpCisjZW5kaWYKKworI2VuZGlmIC8qICEgRkxFWElOVF9IICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisvKiBUaGUgImNvbnN0IiBzdG9yYWdlLWNsYXNzLW1vZGlmaWVyIGlzIHZhbGlkLiAqLworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2Vsc2UJLyogISBfX2NwbHVzcGx1cyAqLworCisjaWYgX19TVERDX18KKworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2VuZGlmCS8qIF9fU1REQ19fICovCisjZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLworCisjaWZkZWYgWVlfVVNFX0NPTlNUCisjZGVmaW5lIHl5Y29uc3QgY29uc3QKKyNlbHNlCisjZGVmaW5lIHl5Y29uc3QKKyNlbmRpZgorCisvKiBSZXR1cm5lZCB1cG9uIGVuZC1vZi1maWxlLiAqLworI2RlZmluZSBZWV9OVUxMIDAKKworLyogUHJvbW90ZXMgYSBwb3NzaWJseSBuZWdhdGl2ZSwgcG9zc2libHkgc2lnbmVkIGNoYXIgdG8gYW4gdW5zaWduZWQKKyAqIGludGVnZXIgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4gIElmIHRoZSBzaWduZWQgY2hhciBpcyBuZWdhdGl2ZSwKKyAqIHdlIHdhbnQgdG8gaW5zdGVhZCB0cmVhdCBpdCBhcyBhbiA4LWJpdCB1bnNpZ25lZCBjaGFyLCBoZW5jZSB0aGUKKyAqIGRvdWJsZSBjYXN0LgorICovCisjZGVmaW5lIFlZX1NDX1RPX1VJKGMpICgodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgYykKKworLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAorICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCisgKiBkZWZpbml0aW9uIG9mIEJFR0lOLgorICovCisjZGVmaW5lIEJFR0lOICh5eV9zdGFydCkgPSAxICsgMiAqCisKKy8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCisgKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAorICogY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBZWV9TVEFSVCAoKCh5eV9zdGFydCkgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgemNvbmZyZXN0YXJ0KHpjb25maW4gICkKKworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAorCisvKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLworI2lmbmRlZiBZWV9CVUZfU0laRQorI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAorI2VuZGlmCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKK3R5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOworI2VuZGlmCisKK2V4dGVybiBpbnQgemNvbmZsZW5nOworCitleHRlcm4gRklMRSAqemNvbmZpbiwgKnpjb25mb3V0OworCisjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCisjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQorI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgorCisgICAgI2RlZmluZSBZWV9MRVNTX0xJTkVOTyhuKQorCisvKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgIm4iIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCisjZGVmaW5lIHl5bGVzcyhuKSBcCisJZG8gXAorCQl7IFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0LiAqLyBcCisgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCisgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IFwKKwkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCisJCSh5eV9jX2J1Zl9wKSA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLyBcCisJCX0gXAorCXdoaWxlICggMCApCisKKyNkZWZpbmUgdW5wdXQoYykgeXl1bnB1dCggYywgKHl5dGV4dF9wdHIpICApCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgYmVjYXVzZSB3ZSBjYW5ub3QgcG9ydGFibHkgZ2V0IG91ciBoYW5kcyBvbiBzaXplX3QKKyAqICh3aXRob3V0IGF1dG9jb25mJ3MgaGVscCwgd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIGJlY2F1c2Ugd2Ugd2FudAorICogZmxleC1nZW5lcmF0ZWQgc2Nhbm5lcnMgdG8gY29tcGlsZSBvbiB0aGVpciBvd24pLgorICovCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9TSVpFX1QKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9TSVpFX1QKK3R5cGVkZWYgdW5zaWduZWQgaW50IHl5X3NpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZQorCXsKKwlGSUxFICp5eV9pbnB1dF9maWxlOworCisJY2hhciAqeXlfY2hfYnVmOwkJLyogaW5wdXQgYnVmZmVyICovCisJY2hhciAqeXlfYnVmX3BvczsJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgYnVmZmVyICovCisKKwkvKiBTaXplIG9mIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbm90IGluY2x1ZGluZyByb29tIGZvciBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCXl5X3NpemVfdCB5eV9idWZfc2l6ZTsKKworCS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYsIG5vdCBpbmNsdWRpbmcgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwlpbnQgeXlfbl9jaGFyczsKKworCS8qIFdoZXRoZXIgd2UgIm93biIgdGhlIGJ1ZmZlciAtIGkuZS4sIHdlIGtub3cgd2UgY3JlYXRlZCBpdCwKKwkgKiBhbmQgY2FuIHJlYWxsb2MoKSBpdCB0byBncm93IGl0LCBhbmQgc2hvdWxkIGZyZWUoKSBpdCB0bworCSAqIGRlbGV0ZSBpdC4KKwkgKi8KKwlpbnQgeXlfaXNfb3VyX2J1ZmZlcjsKKworCS8qIFdoZXRoZXIgdGhpcyBpcyBhbiAiaW50ZXJhY3RpdmUiIGlucHV0IHNvdXJjZTsgaWYgc28sIGFuZAorCSAqIGlmIHdlJ3JlIHVzaW5nIHN0ZGlvIGZvciBpbnB1dCwgdGhlbiB3ZSB3YW50IHRvIHVzZSBnZXRjKCkKKwkgKiBpbnN0ZWFkIG9mIGZyZWFkKCksIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIGZldGNoaW5nIGlucHV0IGFmdGVyCisJICogZWFjaCBuZXdsaW5lLgorCSAqLworCWludCB5eV9pc19pbnRlcmFjdGl2ZTsKKworCS8qIFdoZXRoZXIgd2UncmUgY29uc2lkZXJlZCB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KKwkgKiBJZiBzbywgJ14nIHJ1bGVzIHdpbGwgYmUgYWN0aXZlIG9uIHRoZSBuZXh0IG1hdGNoLCBvdGhlcndpc2UKKwkgKiBub3QuCisJICovCisJaW50IHl5X2F0X2JvbDsKKworICAgIGludCB5eV9ic19saW5lbm87IC8qKjwgVGhlIGxpbmUgY291bnQuICovCisgICAgaW50IHl5X2JzX2NvbHVtbjsgLyoqPCBUaGUgY29sdW1uIGNvdW50LiAqLworCisJLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCisJICogZW5kIG9mIGl0LgorCSAqLworCWludCB5eV9maWxsX2J1ZmZlcjsKKworCWludCB5eV9idWZmZXJfc3RhdHVzOworCisjZGVmaW5lIFlZX0JVRkZFUl9ORVcgMAorI2RlZmluZSBZWV9CVUZGRVJfTk9STUFMIDEKKwkvKiBXaGVuIGFuIEVPRidzIGJlZW4gc2VlbiBidXQgdGhlcmUncyBzdGlsbCBzb21lIHRleHQgdG8gcHJvY2VzcworCSAqIHRoZW4gd2UgbWFyayB0aGUgYnVmZmVyIGFzIFlZX0VPRl9QRU5ESU5HLCB0byBpbmRpY2F0ZSB0aGF0IHdlCisJICogc2hvdWxkbid0IHRyeSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHNvdXJjZSBhbnkgbW9yZS4gIFdlIG1pZ2h0CisJICogc3RpbGwgaGF2ZSBhIGJ1bmNoIG9mIHRva2VucyB0byBtYXRjaCwgdGhvdWdoLCBiZWNhdXNlIG9mCisJICogcG9zc2libGUgYmFja2luZy11cC4KKwkgKgorCSAqIFdoZW4gd2UgYWN0dWFsbHkgc2VlIHRoZSBFT0YsIHdlIGNoYW5nZSB0aGUgc3RhdHVzIHRvICJuZXciCisJICogKHZpYSB6Y29uZnJlc3RhcnQoKSksIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHNjYW5uaW5nIGJ5CisJICoganVzdCBwb2ludGluZyB6Y29uZmluIGF0IGEgbmV3IGlucHV0IGZpbGUuCisJICovCisjZGVmaW5lIFlZX0JVRkZFUl9FT0ZfUEVORElORyAyCisKKwl9OworI2VuZGlmIC8qICFZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFICovCisKKy8qIFN0YWNrIG9mIGlucHV0IGJ1ZmZlcnMuICovCitzdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja190b3AgPSAwOyAvKio8IGluZGV4IG9mIHRvcCBvZiBzdGFjay4gKi8KK3N0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX21heCA9IDA7IC8qKjwgY2FwYWNpdHkgb2Ygc3RhY2suICovCitzdGF0aWMgWVlfQlVGRkVSX1NUQVRFICogeXlfYnVmZmVyX3N0YWNrID0gMDsgLyoqPCBTdGFjayBhcyBhbiBhcnJheS4gKi8KKworLyogV2UgcHJvdmlkZSBtYWNyb3MgZm9yIGFjY2Vzc2luZyBidWZmZXIgc3RhdGVzIGluIGNhc2UgaW4gdGhlCisgKiBmdXR1cmUgd2Ugd2FudCB0byBwdXQgdGhlIGJ1ZmZlciBzdGF0ZXMgaW4gYSBtb3JlIGdlbmVyYWwKKyAqICJzY2FubmVyIHN0YXRlIi4KKyAqCisgKiBSZXR1cm5zIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBvciBOVUxMLgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSICggKHl5X2J1ZmZlcl9zdGFjaykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpCisKKy8qIFNhbWUgYXMgcHJldmlvdXMgbWFjcm8sIGJ1dCB1c2VmdWwgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIGJ1ZmZlciBzdGFjayBpcyBub3QKKyAqIE5VTEwgb3Igd2hlbiB3ZSBuZWVkIGFuIGx2YWx1ZS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldCisKKy8qIHl5X2hvbGRfY2hhciBob2xkcyB0aGUgY2hhcmFjdGVyIGxvc3Qgd2hlbiB6Y29uZnRleHQgaXMgZm9ybWVkLiAqLworc3RhdGljIGNoYXIgeXlfaG9sZF9jaGFyOworc3RhdGljIGludCB5eV9uX2NoYXJzOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1ZiAqLworaW50IHpjb25mbGVuZzsKKworLyogUG9pbnRzIHRvIGN1cnJlbnQgY2hhcmFjdGVyIGluIGJ1ZmZlci4gKi8KK3N0YXRpYyBjaGFyICp5eV9jX2J1Zl9wID0gKGNoYXIgKikgMDsKK3N0YXRpYyBpbnQgeXlfaW5pdCA9IDE7CQkvKiB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSAqLworc3RhdGljIGludCB5eV9zdGFydCA9IDA7CS8qIHN0YXJ0IHN0YXRlIG51bWJlciAqLworCisvKiBGbGFnIHdoaWNoIGlzIHVzZWQgdG8gYWxsb3cgemNvbmZ3cmFwKCkncyB0byBkbyBidWZmZXIgc3dpdGNoZXMKKyAqIGluc3RlYWQgb2Ygc2V0dGluZyB1cCBhIGZyZXNoIHpjb25maW4uICBBIGJpdCBvZiBhIGhhY2sgLi4uCisgKi8KK3N0YXRpYyBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOworCit2b2lkIHpjb25mcmVzdGFydCAoRklMRSAqaW5wdXRfZmlsZSAgKTsKK3ZvaWQgemNvbmZfc3dpdGNoX3RvX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfY3JlYXRlX2J1ZmZlciAoRklMRSAqZmlsZSxpbnQgc2l6ZSAgKTsKK3ZvaWQgemNvbmZfZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgICk7Cit2b2lkIHpjb25mX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgICk7Cit2b2lkIHpjb25mcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOwordm9pZCB6Y29uZnBvcF9idWZmZXJfc3RhdGUgKHZvaWQgKTsKKworc3RhdGljIHZvaWQgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkICk7CitzdGF0aWMgdm9pZCB6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSAodm9pZCApOworc3RhdGljIHZvaWQgemNvbmZfaW5pdF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiLEZJTEUgKmZpbGUgICk7CisKKyNkZWZpbmUgWVlfRkxVU0hfQlVGRkVSIHpjb25mX2ZsdXNoX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApCisKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J1ZmZlciAoY2hhciAqYmFzZSx5eV9zaXplX3Qgc2l6ZSAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICp5eV9zdHIgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAoeXljb25zdCBjaGFyICpieXRlcyxpbnQgbGVuICApOworCit2b2lkICp6Y29uZmFsbG9jICh5eV9zaXplX3QgICk7Cit2b2lkICp6Y29uZnJlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgICk7Cit2b2lkIHpjb25mZnJlZSAodm9pZCAqICApOworCisjZGVmaW5lIHl5X25ld19idWZmZXIgemNvbmZfY3JlYXRlX2J1ZmZlcgorCisjZGVmaW5lIHl5X3NldF9pbnRlcmFjdGl2ZShpc19pbnRlcmFjdGl2ZSkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApeyBcCisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAorCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAorCX0KKworI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApe1wKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wgPSBhdF9ib2w7IFwKKwl9CisKKyNkZWZpbmUgWVlfQVRfQk9MKCkgKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sKQorCisvKiBCZWdpbiB1c2VyIHNlY3QzICovCisKKyNkZWZpbmUgemNvbmZ3cmFwKCkgMQorI2RlZmluZSBZWV9TS0lQX1lZV1JBUAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWVlfQ0hBUjsKKworRklMRSAqemNvbmZpbiA9IChGSUxFICopIDAsICp6Y29uZm91dCA9IChGSUxFICopIDA7CisKK3R5cGVkZWYgaW50IHl5X3N0YXRlX3R5cGU7CisKK2V4dGVybiBpbnQgemNvbmZsaW5lbm87CisKK2ludCB6Y29uZmxpbmVubyA9IDE7CisKK2V4dGVybiBjaGFyICp6Y29uZnRleHQ7CisjZGVmaW5lIHl5dGV4dF9wdHIgemNvbmZ0ZXh0CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0W11bMTddID0KKyAgICB7CisgICAgeworICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxMiwgICAxMiwgICAxNSwgICAxMiwgICAxMiwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTIsICAgMTIsICAgMTUsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE2LCAgIDE2LCAgIDE3LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAorICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE2LCAgIDE2LCAgIDE2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxNiwgICAxNiwgICAxOCwgICAxNiwgICAxNiwgICAxNgorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxOSwgICAyMCwgICAyMSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwKKyAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTksICAgMjAsICAgMjEsICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCisgICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDIyLCAgIDIyLCAgIDIzLCAgIDIyLCAgIDI0LCAgIDIyLCAgIDIyLCAgIDI0LCAgIDIyLAorICAgICAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDI1LCAgIDIyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAyMiwgICAyMiwgICAyMywgICAyMiwgICAyNCwgICAyMiwgICAyMiwgICAyNCwgICAyMiwKKyAgICAgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyNSwgICAyMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMjYsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMjksICAgMzIsCisgICAgICAgMzMsICAgMzQsICAgMzUsICAgMzUsICAgMzYsICAgMzcsICAgMzgKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMjYsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMjksICAgMzIsCisgICAgICAgMzMsICAgMzQsICAgMzUsICAgMzUsICAgMzYsICAgMzcsICAgMzgKKyAgICB9LAorCisgICAgeworICAgICAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLAorICAgICAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExLCAgLTExCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwKKyAgICAgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTMsICAgMzksICAgNDAsICAtMTMsICAtMTMsICAgNDEsICAtMTMsICAtMTMsICAtMTMsCisgICAgICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LAorICAgICAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQyLCAgIDQyLCAgIDQzLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLAorICAgICAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwKKyAgICAgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsCisgICAgICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LAorICAgICAgLTE4LCAgLTE4LCAgLTE4LCAgIDQ0LCAgLTE4LCAgLTE4LCAgLTE4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0NSwgICA0NSwgIC0xOSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwKKyAgICAgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yMCwgICA0NiwgICA0NywgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwKKyAgICAgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDgsICAtMjEsICAtMjEsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsCisgICAgICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ5LCAgIDQ5LCAgIDUwLCAgIDQ5LCAgLTIyLCAgIDQ5LCAgIDQ5LCAgLTIyLCAgIDQ5LAorICAgICAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgLTIyLCAgIDQ5CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywKKyAgICAgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMywgIC0yMworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsCisgICAgICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQsICAtMjQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNTEsICAgNTEsICAgNTIsICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEsCisgICAgICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LAorICAgICAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2LCAgLTI2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywKKyAgICAgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNywgIC0yNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsCisgICAgICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAgNTMsICAtMjgsICAtMjgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LAorICAgICAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDU0LCAgIDU0LCAgLTMwLCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LAorICAgICAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMSwgICA1NSwgIC0zMSwgIC0zMSwKKyAgICAgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMSwgIC0zMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsCisgICAgICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLAorICAgICAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzLCAgLTMzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNCwgIC0zNCwgIC0zNCwgIC0zNCwgIC0zNCwgIC0zNCwgIC0zNCwgIC0zNCwgIC0zNCwKKyAgICAgIC0zNCwgICA1NiwgICA1NywgICA1NywgIC0zNCwgIC0zNCwgIC0zNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwKKyAgICAgIC0zNSwgICA1NywgICA1NywgICA1NywgIC0zNSwgIC0zNSwgIC0zNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsCisgICAgICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM3LCAgLTM3LCAgIDU4LCAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3LAorICAgICAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3LCAgLTM3CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwKKyAgICAgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgIC0zOCwgICA1OQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzksICAgMzksICAgNDAsICAtMzksICAtMzksICAgNDEsICAtMzksICAtMzksICAtMzksCisgICAgICAtMzksICAtMzksICAtMzksICAtMzksICAtMzksICAtMzksICAtMzkKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsCisgICAgICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAsICAtNDAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQyLCAgIDQyLCAgIDQzLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLAorICAgICAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsCisgICAgICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LAorICAgICAgLTQ0LCAgLTQ0LCAgLTQ0LCAgIDQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ1LCAgIDQ1LCAgLTQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LAorICAgICAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NiwgICA0NiwgICA0NywgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwKKyAgICAgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDgsICAtNDcsICAtNDcsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsCisgICAgICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgsICAgNDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LAorICAgICAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0OSwgICA0OSwgICA1MCwgICA0OSwgIC00OSwgICA0OSwgICA0OSwgIC00OSwgICA0OSwKKyAgICAgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA0OSwgIC00OSwgICA0OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwKKyAgICAgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTEsICAtNTEsICAgNTIsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsCisgICAgICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLAorICAgICAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywKKyAgICAgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywgIC01MywgIC01MworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNTQsICAgNTQsICAtNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsCisgICAgICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsCisgICAgICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUsICAtNTUKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU2LCAgLTU2LCAgLTU2LCAgLTU2LCAgLTU2LCAgLTU2LCAgLTU2LCAgLTU2LCAgLTU2LAorICAgICAgLTU2LCAgIDYwLCAgIDU3LCAgIDU3LCAgLTU2LCAgLTU2LCAgLTU2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywKKyAgICAgIC01NywgICA1NywgICA1NywgICA1NywgIC01NywgIC01NywgIC01NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsCisgICAgICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LAorICAgICAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLAorICAgICAgLTYwLCAgIDU3LCAgIDU3LCAgIDU3LCAgLTYwLCAgLTYwLCAgLTYwCisgICAgfSwKKworICAgIH0gOworCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHZvaWQgKTsKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgKHl5X3N0YXRlX3R5cGUgY3VycmVudF9zdGF0ZSAgKTsKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh2b2lkICk7CitzdGF0aWMgdm9pZCB5eV9mYXRhbF9lcnJvciAoeXljb25zdCBjaGFyIG1zZ1tdICApOworCisvKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQorICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHpjb25mdGV4dC4KKyAqLworI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKKwkoeXl0ZXh0X3B0cikgPSB5eV9icDsgXAorCXpjb25mbGVuZyA9IChzaXplX3QpICh5eV9jcCAtIHl5X2JwKTsgXAorCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOyBcCisJKnl5X2NwID0gJ1wwJzsgXAorCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOworCisjZGVmaW5lIFlZX05VTV9SVUxFUyAzMworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDM0CisvKiBUaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGlzIHNjYW5uZXIsCisgICBidXQgaXRzIHByZXNlbmNlIGlzIG5lY2Vzc2FyeS4gKi8KK3N0cnVjdCB5eV90cmFuc19pbmZvCisJeworCWZsZXhfaW50MzJfdCB5eV92ZXJpZnk7CisJZmxleF9pbnQzMl90IHl5X254dDsKKwl9Oworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFs2MV0gPQorICAgIHsgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgIDM0LCAgICA1LCAgICA0LCAgICAyLCAgICAzLCAgICA3LCAgICA4LCAgICA2LCAgIDMyLCAgIDI5LAorICAgICAgIDMxLCAgIDI0LCAgIDI4LCAgIDI3LCAgIDI2LCAgIDIyLCAgIDE3LCAgIDEzLCAgIDE2LCAgIDIwLAorICAgICAgIDIyLCAgIDExLCAgIDEyLCAgIDE5LCAgIDE5LCAgIDE0LCAgIDIyLCAgIDIyLCAgICA0LCAgICAyLAorICAgICAgICAzLCAgICAzLCAgICAxLCAgICA2LCAgIDMyLCAgIDI5LCAgIDMxLCAgIDMwLCAgIDI0LCAgIDIzLAorICAgICAgIDI2LCAgIDI1LCAgIDE1LCAgIDIwLCAgICA5LCAgIDE5LCAgIDE5LCAgIDIxLCAgIDEwLCAgIDE4CisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9lY1syNTZdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMiwgICAgMywKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMiwgICAgNCwgICAgNSwgICAgNiwgICAgMSwgICAgMSwgICAgNywgICAgOCwgICAgOSwKKyAgICAgICAxMCwgICAgMSwgICAgMSwgICAgMSwgICAxMSwgICAxMiwgICAxMiwgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAxNCwgICAgMSwgICAgMSwgICAgMSwgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAgMSwgICAxNSwgICAgMSwgICAgMSwgICAxMywgICAgMSwgICAxMywgICAxMywgICAxMywgICAxMywKKworICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgICAxLCAgIDE2LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEKKyAgICB9IDsKKworZXh0ZXJuIGludCB6Y29uZl9mbGV4X2RlYnVnOworaW50IHpjb25mX2ZsZXhfZGVidWcgPSAwOworCisvKiBUaGUgaW50ZW50IGJlaGluZCB0aGlzIGRlZmluaXRpb24gaXMgdGhhdCBpdCdsbCBjYXRjaAorICogYW55IHVzZXMgb2YgUkVKRUNUIHdoaWNoIGZsZXggbWlzc2VkLgorICovCisjZGVmaW5lIFJFSkVDVCByZWplY3RfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIHl5bW9yZSgpIHl5bW9yZV91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgWVlfTU9SRV9BREogMAorI2RlZmluZSBZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCitjaGFyICp6Y29uZnRleHQ7CisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBTVEFSVF9TVFJTSVpFCTE2CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBsaW5lbm87Cit9IGN1cnJlbnRfcG9zOworCitzdGF0aWMgY2hhciAqdGV4dDsKK3N0YXRpYyBpbnQgdGV4dF9zaXplLCB0ZXh0X2FzaXplOworCitzdHJ1Y3QgYnVmZmVyIHsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciAqcGFyZW50OworICAgICAgICBZWV9CVUZGRVJfU1RBVEUgc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVmZmVyICpjdXJyZW50X2J1ZjsKKworc3RhdGljIGludCBsYXN0X3RzLCBmaXJzdF90czsKKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGZpbGUodm9pZCk7CisKK3ZvaWQgbmV3X3N0cmluZyh2b2lkKQoreworCXRleHQgPSBtYWxsb2MoU1RBUlRfU1RSU0laRSk7CisJdGV4dF9hc2l6ZSA9IFNUQVJUX1NUUlNJWkU7CisJdGV4dF9zaXplID0gMDsKKwkqdGV4dCA9IDA7Cit9CisKK3ZvaWQgYXBwZW5kX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCWludCBuZXdfc2l6ZSA9IHRleHRfc2l6ZSArIHNpemUgKyAxOworCWlmIChzaXplID4gNzApIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQgZXJyb3I6IE92ZXJsb25nIGxpbmVcbiIsCisJCWN1cnJlbnRfZmlsZS0+bmFtZSwgY3VycmVudF9maWxlLT5saW5lbm8pOworCX0KKworCWlmIChuZXdfc2l6ZSA+IHRleHRfYXNpemUpIHsKKwkJbmV3X3NpemUgKz0gU1RBUlRfU1RSU0laRSAtIDE7CisJCW5ld19zaXplICY9IC1TVEFSVF9TVFJTSVpFOworCQl0ZXh0ID0gcmVhbGxvYyh0ZXh0LCBuZXdfc2l6ZSk7CisJCXRleHRfYXNpemUgPSBuZXdfc2l6ZTsKKwl9CisJbWVtY3B5KHRleHQgKyB0ZXh0X3NpemUsIHN0ciwgc2l6ZSk7CisJdGV4dF9zaXplICs9IHNpemU7CisJdGV4dFt0ZXh0X3NpemVdID0gMDsKK30KKwordm9pZCBhbGxvY19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwl0ZXh0ID0gbWFsbG9jKHNpemUgKyAxKTsKKwltZW1jcHkodGV4dCwgc3RyLCBzaXplKTsKKwl0ZXh0W3NpemVdID0gMDsKK30KKworI2RlZmluZSBJTklUSUFMIDAKKyNkZWZpbmUgQ09NTUFORCAxCisjZGVmaW5lIEhFTFAgMgorI2RlZmluZSBTVFJJTkcgMworI2RlZmluZSBQQVJBTSA0CisKKyNpZm5kZWYgWVlfTk9fVU5JU1REX0gKKy8qIFNwZWNpYWwgY2FzZSBmb3IgInVuaXN0ZC5oIiwgc2luY2UgaXQgaXMgbm9uLUFOU0kuIFdlIGluY2x1ZGUgaXQgd2F5CisgKiBkb3duIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyJ3Mgc2VjdGlvbiAxIHRvIGhhdmUgYmVlbiBzY2FubmVkIGZpcnN0LgorICogVGhlIHVzZXIgaGFzIGEgY2hhbmNlIHRvIG92ZXJyaWRlIGl0IHdpdGggYW4gb3B0aW9uLgorICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBZWV9FWFRSQV9UWVBFCisjZGVmaW5lIFlZX0VYVFJBX1RZUEUgdm9pZCAqCisjZW5kaWYKKworLyogTWFjcm9zIGFmdGVyIHRoaXMgcG9pbnQgY2FuIGFsbCBiZSBvdmVycmlkZGVuIGJ5IHVzZXIgZGVmaW5pdGlvbnMgaW4KKyAqIHNlY3Rpb24gMS4KKyAqLworCisjaWZuZGVmIFlZX1NLSVBfWVlXUkFQCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgaW50IHpjb25md3JhcCAodm9pZCApOworI2Vsc2UKK2V4dGVybiBpbnQgemNvbmZ3cmFwICh2b2lkICk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgc3RhdGljIHZvaWQgeXl1bnB1dCAoaW50IGMsY2hhciAqYnVmX3B0ciAgKTsKKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIgKix5eWNvbnN0IGNoYXIgKixpbnQgKTsKKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqICk7CisjZW5kaWYKKworLy9iYm94OiBzdXBwcmVzc2luZyAiZGVmaW5lZCBidXQgbm90IHVzZWQiIHdhcm5pbmcKKyNkZWZpbmUgWVlfTk9fSU5QVVQgMQorCisjaWZuZGVmIFlZX05PX0lOUFVUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworc3RhdGljIGludCB5eWlucHV0ICh2b2lkICk7CisjZWxzZQorc3RhdGljIGludCBpbnB1dCAodm9pZCApOworI2VuZGlmCisKKyNlbmRpZgorCisvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCisjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKKyNkZWZpbmUgWVlfUkVBRF9CVUZfU0laRSA4MTkyCisjZW5kaWYKKworLyogQ29weSB3aGF0ZXZlciB0aGUgbGFzdCBydWxlIG1hdGNoZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gKi8KKyNpZm5kZWYgRUNITworLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCisgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgorICovCisjZGVmaW5lIEVDSE8gKHZvaWQpIGZ3cml0ZSggemNvbmZ0ZXh0LCB6Y29uZmxlbmcsIDEsIHpjb25mb3V0ICkKKyNlbmRpZgorCisvKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCisgKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KKyAqLworI2lmbmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCisJZXJybm89MDsgXAorCXdoaWxlICggKHJlc3VsdCA9IHJlYWQoIGZpbGVubyh6Y29uZmluKSwgKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSApKSA8IDAgKSBcCisJeyBcCisJCWlmKCBlcnJubyAhPSBFSU5UUikgXAorCQl7IFwKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQkJYnJlYWs7IFwKKwkJfSBcCisJCWVycm5vPTA7IFwKKwkJY2xlYXJlcnIoemNvbmZpbik7IFwKKwl9XAorXAorCisjZW5kaWYKKworLyogTm8gc2VtaS1jb2xvbiBhZnRlciByZXR1cm47IGNvcnJlY3QgdXNhZ2UgaXMgdG8gd3JpdGUgInl5dGVybWluYXRlKCk7IiAtCisgKiB3ZSBkb24ndCB3YW50IGFuIGV4dHJhICc7JyBhZnRlciB0aGUgInJldHVybiIgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKKyAqIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIHN0YXRlbWVudHMuCisgKi8KKyNpZm5kZWYgeXl0ZXJtaW5hdGUKKyNkZWZpbmUgeXl0ZXJtaW5hdGUoKSByZXR1cm4gWVlfTlVMTAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KKyNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgorI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1CisjZW5kaWYKKworLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCisjaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCisjZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyApCisjZW5kaWYKKworLyogZW5kIHRhYmxlcyBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKi8KKworLyogRGVmYXVsdCBkZWNsYXJhdGlvbiBvZiBnZW5lcmF0ZWQgc2Nhbm5lciAtIGEgZGVmaW5lIHNvIHRoZSB1c2VyIGNhbgorICogZWFzaWx5IGFkZCBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIFlZX0RFQ0wKKyNkZWZpbmUgWVlfREVDTF9JU19PVVJTIDEKKworZXh0ZXJuIGludCB6Y29uZmxleCAodm9pZCk7CisKKyNkZWZpbmUgWVlfREVDTCBpbnQgemNvbmZsZXggKHZvaWQpCisjZW5kaWYgLyogIVlZX0RFQ0wgKi8KKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVsZSwgYWZ0ZXIgemNvbmZ0ZXh0IGFuZCB6Y29uZmxlbmcKKyAqIGhhdmUgYmVlbiBzZXQgdXAuCisgKi8KKyNpZm5kZWYgWVlfVVNFUl9BQ1RJT04KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04KKyNlbmRpZgorCisvKiBDb2RlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBydWxlLiAqLworI2lmbmRlZiBZWV9CUkVBSworI2RlZmluZSBZWV9CUkVBSyBicmVhazsKKyNlbmRpZgorCisjZGVmaW5lIFlZX1JVTEVfU0VUVVAgXAorCVlZX1VTRVJfQUNUSU9OCisKKy8qKiBUaGUgbWFpbiBzY2FubmVyIGZ1bmN0aW9uIHdoaWNoIGRvZXMgYWxsIHRoZSB3b3JrLgorICovCitZWV9ERUNMCit7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7CisJcmVnaXN0ZXIgaW50IHl5X2FjdDsKKworCWludCBzdHIgPSAwOworCWludCB0cywgaTsKKworCWlmICggKHl5X2luaXQpICkKKwkJeworCQkoeXlfaW5pdCkgPSAwOworCisjaWZkZWYgWVlfVVNFUl9JTklUCisJCVlZX1VTRVJfSU5JVDsKKyNlbmRpZgorCisJCWlmICggISAoeXlfc3RhcnQpICkKKwkJCSh5eV9zdGFydCkgPSAxOwkvKiBmaXJzdCBzdGFydCBzdGF0ZSAqLworCisJCWlmICggISB6Y29uZmluICkKKwkJCXpjb25maW4gPSBzdGRpbjsKKworCQlpZiAoICEgemNvbmZvdXQgKQorCQkJemNvbmZvdXQgPSBzdGRvdXQ7CisKKwkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICkgeworCQkJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKwkJCQl6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsKKwkJfQorCisJCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCQl9CisKKwl3aGlsZSAoIDEgKQkJLyogbG9vcHMgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCAqLworCQl7CisJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCisJCS8qIFN1cHBvcnQgb2YgemNvbmZ0ZXh0LiAqLworCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKworCQkvKiB5eV9icCBwb2ludHMgdG8gdGhlIHBvc2l0aW9uIGluIHl5X2NoX2J1ZiBvZiB0aGUgc3RhcnQgb2YKKwkJICogdGhlIGN1cnJlbnQgcnVuLgorCQkgKi8KKwkJeXlfYnAgPSB5eV9jcDsKKworCQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKK3l5X21hdGNoOgorCQl3aGlsZSAoICh5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSAgXSkgPiAwICkKKwkJCSsreXlfY3A7CisKKwkJeXlfY3VycmVudF9zdGF0ZSA9IC15eV9jdXJyZW50X3N0YXRlOworCit5eV9maW5kX2FjdGlvbjoKKwkJeXlfYWN0ID0geXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdOworCisJCVlZX0RPX0JFRk9SRV9BQ1RJT047CisKK2RvX2FjdGlvbjoJLyogVGhpcyBsYWJlbCBpcyB1c2VkIG9ubHkgdG8gYWNjZXNzIEVPRiBhY3Rpb25zLiAqLworCisJCXN3aXRjaCAoIHl5X2FjdCApCisJeyAvKiBiZWdpbm5pbmcgb2YgYWN0aW9uIHN3aXRjaCAqLworY2FzZSAxOgorLyogcnVsZSAxIGNhbiBtYXRjaCBlb2wgKi8KK2Nhc2UgMjoKKy8qIHJ1bGUgMiBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwlyZXR1cm4gVF9FT0w7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMzoKK1lZX1JVTEVfU0VUVVAKKworCVlZX0JSRUFLCitjYXNlIDQ6CitZWV9SVUxFX1NFVFVQCit7CisJQkVHSU4oQ09NTUFORCk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgNToKK1lZX1JVTEVfU0VUVVAKK3sKKwl1bnB1dCh6Y29uZnRleHRbMF0pOworCUJFR0lOKENPTU1BTkQpOworfQorCVlZX0JSRUFLCisKK2Nhc2UgNjoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCUJFR0lOKFBBUkFNKTsKKwkJY3VycmVudF9wb3MuZmlsZSA9IGN1cnJlbnRfZmlsZTsKKwkJY3VycmVudF9wb3MubGluZW5vID0gY3VycmVudF9maWxlLT5saW5lbm87CisJCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9DT01NQU5EKSB7CisJCQl6Y29uZmx2YWwuaWQgPSBpZDsKKwkJCXJldHVybiBpZC0+dG9rZW47CisJCX0KKwkJYWxsb2Nfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSA4OgorLyogcnVsZSA4IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJQkVHSU4oSU5JVElBTCk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCXJldHVybiBUX0VPTDsKKwl9CisJWVlfQlJFQUsKKworY2FzZSA5OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfQU5EOworCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfT1I7CisJWVlfQlJFQUsKK2Nhc2UgMTE6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9PUEVOX1BBUkVOOworCVlZX0JSRUFLCitjYXNlIDEyOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfQ0xPU0VfUEFSRU47CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9OT1Q7CisJWVlfQlJFQUsKK2Nhc2UgMTQ6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9FUVVBTDsKKwlZWV9CUkVBSworY2FzZSAxNToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX1VORVFVQUw7CisJWVlfQlJFQUsKK2Nhc2UgMTY6CitZWV9SVUxFX1NFVFVQCit7CisJCXN0ciA9IHpjb25mdGV4dFswXTsKKwkJbmV3X3N0cmluZygpOworCQlCRUdJTihTVFJJTkcpOworCX0KKwlZWV9CUkVBSworY2FzZSAxNzoKKy8qIHJ1bGUgMTcgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorQkVHSU4oSU5JVElBTCk7IGN1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKwlZWV9CUkVBSworY2FzZSAxODoKK1lZX1JVTEVfU0VUVVAKKy8qIGlnbm9yZSAqLworCVlZX0JSRUFLCitjYXNlIDE5OgorWVlfUlVMRV9TRVRVUAoreworCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX1BBUkFNKSB7CisJCQl6Y29uZmx2YWwuaWQgPSBpZDsKKwkJCXJldHVybiBpZC0+dG9rZW47CisJCX0KKwkJYWxsb2Nfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDIwOgorWVlfUlVMRV9TRVRVUAorLyogY29tbWVudCAqLworCVlZX0JSRUFLCitjYXNlIDIxOgorLyogcnVsZSAyMSBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitjdXJyZW50X2ZpbGUtPmxpbmVubysrOworCVlZX0JSRUFLCitjYXNlIDIyOgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgWVlfU1RBVEVfRU9GKFBBUkFNKToKK3sKKwkJQkVHSU4oSU5JVElBTCk7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgMjM6CisvKiBydWxlIDIzIGNhbiBtYXRjaCBlb2wgKi8KKyp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyAvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKyh5eV9jX2J1Zl9wKSA9IHl5X2NwIC09IDE7CitZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovCitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjQ6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCX0KKwlZWV9CUkVBSworY2FzZSAyNToKKy8qIHJ1bGUgMjUgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQgKyAxLCB6Y29uZmxlbmcgLSAxKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVlZX0JSRUFLCitjYXNlIDI2OgorWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCArIDEsIHpjb25mbGVuZyAtIDEpOworCX0KKwlZWV9CUkVBSworY2FzZSAyNzoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJaWYgKHN0ciA9PSB6Y29uZnRleHRbMF0pIHsKKwkJCUJFR0lOKFBBUkFNKTsKKwkJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwkJfSBlbHNlCisJCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDI4OgorLyogcnVsZSAyOCBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJCXByaW50ZigiJXM6JWQ6d2FybmluZzogbXVsdGktbGluZSBzdHJpbmdzIG5vdCBzdXBwb3J0ZWRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlCRUdJTihJTklUSUFMKTsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoU1RSSU5HKToKK3sKKwkJQkVHSU4oSU5JVElBTCk7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgMjk6CitZWV9SVUxFX1NFVFVQCit7CisJCXRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHpjb25mbGVuZzsgaSsrKSB7CisJCQlpZiAoemNvbmZ0ZXh0W2ldID09ICdcdCcpCisJCQkJdHMgPSAodHMgJiB+NykgKyA4OworCQkJZWxzZQorCQkJCXRzKys7CisJCX0KKwkJbGFzdF90cyA9IHRzOworCQlpZiAoZmlyc3RfdHMpIHsKKwkJCWlmICh0cyA8IGZpcnN0X3RzKSB7CisJCQkJemNvbmZfZW5kaGVscCgpOworCQkJCXJldHVybiBUX0hFTFBURVhUOworCQkJfQorCQkJdHMgLT0gZmlyc3RfdHM7CisJCQl3aGlsZSAodHMgPiA4KSB7CisJCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCA4KTsKKwkJCQl0cyAtPSA4OworCQkJfQorCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCB0cyk7CisJCX0KKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzA6CisvKiBydWxlIDMwIGNhbiBtYXRjaCBlb2wgKi8KKyp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyAvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKyh5eV9jX2J1Zl9wKSA9IHl5X2NwIC09IDE7CitZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovCitZWV9SVUxFX1NFVFVQCit7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDMxOgorLyogcnVsZSAzMSBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCWFwcGVuZF9zdHJpbmcoIlxuIiwgMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDMyOgorWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJaWYgKCFmaXJzdF90cykKKwkJCWZpcnN0X3RzID0gbGFzdF90czsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgWVlfU1RBVEVfRU9GKEhFTFApOgoreworCQl6Y29uZl9lbmRoZWxwKCk7CisJCXJldHVybiBUX0hFTFBURVhUOworCX0KKwlZWV9CUkVBSworCitjYXNlIFlZX1NUQVRFX0VPRihJTklUSUFMKToKK2Nhc2UgWVlfU1RBVEVfRU9GKENPTU1BTkQpOgoreworCWlmIChjdXJyZW50X2ZpbGUpIHsKKwkJemNvbmZfZW5kZmlsZSgpOworCQlyZXR1cm4gVF9FT0w7CisJfQorCWZjbG9zZSh6Y29uZmluKTsKKwl5eXRlcm1pbmF0ZSgpOworfQorCVlZX0JSRUFLCitjYXNlIDMzOgorWVlfUlVMRV9TRVRVUAorWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgamFtbWVkIiApOworCVlZX0JSRUFLCisKKwljYXNlIFlZX0VORF9PRl9CVUZGRVI6CisJCXsKKwkJLyogQW1vdW50IG9mIHRleHQgbWF0Y2hlZCBub3QgaW5jbHVkaW5nIHRoZSBFT0IgY2hhci4gKi8KKwkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSAoeXl0ZXh0X3B0cikpIC0gMTsKKworCQkvKiBVbmRvIHRoZSBlZmZlY3RzIG9mIFlZX0RPX0JFRk9SRV9BQ1RJT04uICovCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCisKKwkJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX05FVyApCisJCQl7CisJCQkvKiBXZSdyZSBzY2FubmluZyBhIG5ldyBmaWxlIG9yIGlucHV0IHNvdXJjZS4gIEl0J3MKKwkJCSAqIHBvc3NpYmxlIHRoYXQgdGhpcyBoYXBwZW5lZCBiZWNhdXNlIHRoZSB1c2VyCisJCQkgKiBqdXN0IHBvaW50ZWQgemNvbmZpbiBhdCBhIG5ldyBzb3VyY2UgYW5kIGNhbGxlZAorCQkJICogemNvbmZsZXgoKS4gIElmIHNvLCB0aGVuIHdlIGhhdmUgdG8gYXNzdXJlCisJCQkgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIFlZX0NVUlJFTlRfQlVGRkVSIGFuZCBvdXIKKwkJCSAqIGdsb2JhbHMuICBIZXJlIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyBzbywgYmVjYXVzZQorCQkJICogdGhpcyBpcyB0aGUgZmlyc3QgYWN0aW9uIChvdGhlciB0aGFuIHBvc3NpYmx5IGEKKwkJCSAqIGJhY2stdXApIHRoYXQgd2lsbCBtYXRjaCBmb3IgdGhlIG5ldyBpbnB1dCBzb3VyY2UuCisJCQkgKi8KKwkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZSA9IHpjb25maW47CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOworCQkJfQorCisJCS8qIE5vdGUgdGhhdCBoZXJlIHdlIHRlc3QgZm9yIHl5X2NfYnVmX3AgIjw9IiB0byB0aGUgcG9zaXRpb24KKwkJICogb2YgdGhlIGZpcnN0IEVPQiBpbiB0aGUgYnVmZmVyLCBzaW5jZSB5eV9jX2J1Zl9wIHdpbGwKKwkJICogYWxyZWFkeSBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgcGFzdCB0aGUgTlVMIGNoYXJhY3RlcgorCQkgKiAoc2luY2UgYWxsIHN0YXRlcyBtYWtlIHRyYW5zaXRpb25zIG9uIEVPQiB0byB0aGUKKwkJICogZW5kLW9mLWJ1ZmZlciBzdGF0ZSkuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIHRlc3QKKwkJICogaW4gaW5wdXQoKS4KKwkJICovCisJCWlmICggKHl5X2NfYnVmX3ApIDw9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldICkKKwkJCXsgLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJeXlfc3RhdGVfdHlwZSB5eV9uZXh0X3N0YXRlOworCisJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJLyogT2theSwgd2UncmUgbm93IHBvc2l0aW9uZWQgdG8gbWFrZSB0aGUgTlVMCisJCQkgKiB0cmFuc2l0aW9uLiAgV2UgY291bGRuJ3QgaGF2ZQorCQkJICogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCkgZ28gYWhlYWQgYW5kIGRvIGl0CisJCQkgKiBmb3IgdXMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGRlYWwKKwkJCSAqIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGphbW1pbmcgKGFuZCB3ZSBkb24ndAorCQkJICogd2FudCB0byBidWlsZCBqYW1taW5nIGludG8gaXQgYmVjYXVzZSB0aGVuIGl0CisJCQkgKiB3aWxsIHJ1biBtb3JlIHNsb3dseSkuCisJCQkgKi8KKworCQkJeXlfbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgKTsKKworCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKworCQkJaWYgKCB5eV9uZXh0X3N0YXRlICkKKwkJCQl7CisJCQkJLyogQ29uc3VtZSB0aGUgTlVMLiAqLworCQkJCXl5X2NwID0gKysoeXlfY19idWZfcCk7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X25leHRfc3RhdGU7CisJCQkJZ290byB5eV9tYXRjaDsKKwkJCQl9CisKKwkJCWVsc2UKKwkJCQl7CisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKKwkJCQl9CisJCQl9CisKKwkJZWxzZSBzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoICApICkKKwkJCXsKKwkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKKwkJCQl7CisJCQkJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAwOworCisJCQkJaWYgKCB6Y29uZndyYXAoICkgKQorCQkJCQl7CisJCQkJCS8qIE5vdGU6IGJlY2F1c2Ugd2UndmUgdGFrZW4gY2FyZSBpbgorCQkJCQkgKiB5eV9nZXRfbmV4dF9idWZmZXIoKSB0byBoYXZlIHNldCB1cAorCQkJCQkgKiB6Y29uZnRleHQsIHdlIGNhbiBub3cgc2V0IHVwCisJCQkJCSAqIHl5X2NfYnVmX3Agc28gdGhhdCBpZiBzb21lIHRvdGFsCisJCQkJCSAqIGhvc2VyIChsaWtlIGZsZXggaXRzZWxmKSB3YW50cyB0bworCQkJCQkgKiBjYWxsIHRoZSBzY2FubmVyIGFmdGVyIHdlIHJldHVybiB0aGUKKwkJCQkJICogWVlfTlVMTCwgaXQnbGwgc3RpbGwgd29yayAtIGFub3RoZXIKKwkJCQkJICogWVlfTlVMTCB3aWxsIGdldCByZXR1cm5lZC4KKwkJCQkJICovCisJCQkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCisJCQkJCXl5X2FjdCA9IFlZX1NUQVRFX0VPRihZWV9TVEFSVCk7CisJCQkJCWdvdG8gZG9fYWN0aW9uOworCQkJCQl9CisKKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKCAhICh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpICkKKwkJCQkJCVlZX05FV19GSUxFOworCQkJCQl9CisJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkoeXlfY19idWZfcCkgPQorCQkJCQkoeXl0ZXh0X3B0cikgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCWdvdG8geXlfbWF0Y2g7CisKKwkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCSh5eV9jX2J1Zl9wKSA9CisJCQkJJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV07CisKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKKwkJCX0KKwkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCVlZX0ZBVEFMX0VSUk9SKAorCQkJImZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kIiApOworCX0gLyogZW5kIG9mIGFjdGlvbiBzd2l0Y2ggKi8KKwkJfSAvKiBlbmQgb2Ygc2Nhbm5pbmcgb25lIHRva2VuICovCit9IC8qIGVuZCBvZiB6Y29uZmxleCAqLworCisvKiB5eV9nZXRfbmV4dF9idWZmZXIgLSB0cnkgdG8gcmVhZCBpbiBhIG5ldyBidWZmZXIKKyAqCisgKiBSZXR1cm5zIGEgY29kZSByZXByZXNlbnRpbmcgYW4gYWN0aW9uOgorICoJRU9CX0FDVF9MQVNUX01BVENIIC0KKyAqCUVPQl9BQ1RfQ09OVElOVUVfU0NBTiAtIGNvbnRpbnVlIHNjYW5uaW5nIGZyb20gY3VycmVudCBwb3NpdGlvbgorICoJRU9CX0FDVF9FTkRfT0ZfRklMRSAtIGVuZCBvZiBmaWxlCisgKi8KK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh2b2lkKQoreworICAgIAlyZWdpc3RlciBjaGFyICpkZXN0ID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWY7CisJcmVnaXN0ZXIgY2hhciAqc291cmNlID0gKHl5dGV4dF9wdHIpOworCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSwgaTsKKwlpbnQgcmV0X3ZhbDsKKworCWlmICggKHl5X2NfYnVmX3ApID4gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdICkKKwkJWVlfRkFUQUxfRVJST1IoCisJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2ZpbGxfYnVmZmVyID09IDAgKQorCQl7IC8qIERvbid0IHRyeSB0byBmaWxsIHRoZSBidWZmZXIsIHNvIHRoaXMgaXMgYW4gRU9GLiAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSAtIFlZX01PUkVfQURKID09IDEgKQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIHRoZSBFT0IsIHNvCisJCQkgKiB0cmVhdCB0aGlzIGFzIGEgZmluYWwgRU9GLgorCQkJICovCisJCQlyZXR1cm4gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQkvKiBXZSBtYXRjaGVkIHNvbWUgdGV4dCBwcmlvciB0byB0aGUgRU9CLCBmaXJzdAorCQkJICogcHJvY2VzcyBpdC4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfTEFTVF9NQVRDSDsKKwkJCX0KKwkJfQorCisJLyogVHJ5IHRvIHJlYWQgbW9yZSBkYXRhLiAqLworCisJLyogRmlyc3QgbW92ZSBsYXN0IGNoYXJzIHRvIHN0YXJ0IG9mIGJ1ZmZlci4gKi8KKwludW1iZXJfdG9fbW92ZSA9IChpbnQpICgoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikpIC0gMTsKKworCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCisJCSooZGVzdCsrKSA9ICooc291cmNlKyspOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX0VPRl9QRU5ESU5HICkKKwkJLyogZG9uJ3QgZG8gdGhlIHJlYWQsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGFuIEVPRiwKKwkJICoganVzdCBmb3JjZSBhbiBFT0YKKwkJICovCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKSA9IDA7CisKKwllbHNlCisJCXsKKwkJCXNpemVfdCBudW1fdG9fcmVhZCA9CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOworCisJCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCisJCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KKworCQkJLyoganVzdCBhIHNob3J0ZXIgbmFtZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyICovCisJCQlZWV9CVUZGRVJfU1RBVEUgYiA9IFlZX0NVUlJFTlRfQlVGRkVSOworCisJCQlpbnQgeXlfY19idWZfcF9vZmZzZXQgPQorCQkJCShpbnQpICgoeXlfY19idWZfcCkgLSBiLT55eV9jaF9idWYpOworCisJCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQkJCXsKKwkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7CisKKwkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQorCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7CisJCQkJZWxzZQorCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOworCisJCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKKwkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KKwkJCQkJemNvbmZyZWFsbG9jKCh2b2lkICopIGItPnl5X2NoX2J1ZixiLT55eV9idWZfc2l6ZSArIDIgICk7CisJCQkJfQorCQkJZWxzZQorCQkJCS8qIENhbid0IGdyb3cgaXQsIHdlIGRvbid0IG93biBpdC4gKi8KKwkJCQliLT55eV9jaF9idWYgPSAwOworCisJCQlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJCQlZWV9GQVRBTF9FUlJPUigKKwkJCQkiZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdyIgKTsKKworCQkJKHl5X2NfYnVmX3ApID0gJmItPnl5X2NoX2J1Zlt5eV9jX2J1Zl9wX29mZnNldF07CisKKwkJCW51bV90b19yZWFkID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtCisJCQkJCQludW1iZXJfdG9fbW92ZSAtIDE7CisKKwkJCX0KKworCQlpZiAoIG51bV90b19yZWFkID4gWVlfUkVBRF9CVUZfU0laRSApCisJCQludW1fdG9fcmVhZCA9IFlZX1JFQURfQlVGX1NJWkU7CisKKwkJLyogUmVhZCBpbiBtb3JlIGRhdGEuICovCisJCVlZX0lOUFVUKCAoJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXSksCisJCQkoeXlfbl9jaGFycyksIG51bV90b19yZWFkICk7CisKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwlpZiAoICh5eV9uX2NoYXJzKSA9PSAwICkKKwkJeworCQlpZiAoIG51bWJlcl90b19tb3ZlID09IFlZX01PUkVfQURKICkKKwkJCXsKKwkJCXJldF92YWwgPSBFT0JfQUNUX0VORF9PRl9GSUxFOworCQkJemNvbmZyZXN0YXJ0KHpjb25maW4gICk7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfTEFTVF9NQVRDSDsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9CisJCQkJWVlfQlVGRkVSX0VPRl9QRU5ESU5HOworCQkJfQorCQl9CisKKwllbHNlCisJCXJldF92YWwgPSBFT0JfQUNUX0NPTlRJTlVFX1NDQU47CisKKwkoeXlfbl9jaGFycykgKz0gbnVtYmVyX3RvX21vdmU7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCSh5eXRleHRfcHRyKSA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlswXTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLworCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkKQoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKworCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworCisJZm9yICggeXlfY3AgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsgeXlfY3AgPCAoeXlfY19idWZfcCk7ICsreXlfY3AgKQorCQl7CisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bKCp5eV9jcCA/IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldIDogMSldOworCQl9CisKKwlyZXR1cm4geXlfY3VycmVudF9zdGF0ZTsKK30KKworLyogeXlfdHJ5X05VTF90cmFucyAtIHRyeSB0byBtYWtlIGEgdHJhbnNpdGlvbiBvbiB0aGUgTlVMIGNoYXJhY3RlcgorICoKKyAqIHN5bm9wc2lzCisgKgluZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggY3VycmVudF9zdGF0ZSApOworICovCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAgKHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZSApCit7CisJcmVnaXN0ZXIgaW50IHl5X2lzX2phbTsKKworCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bMV07CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPD0gMCk7CisKKwlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYywgcmVnaXN0ZXIgY2hhciAqIHl5X2JwICkKK3sKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKworICAgIHl5X2NwID0gKHl5X2NfYnVmX3ApOworCisJLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisKKwlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKKwkJeyAvKiBuZWVkIHRvIHNoaWZ0IHRoaW5ncyB1cCB0byBtYWtlIHJvb20gKi8KKwkJLyogKzIgZm9yIEVPQiBjaGFycy4gKi8KKwkJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlID0gKHl5X25fY2hhcnMpICsgMjsKKwkJcmVnaXN0ZXIgY2hhciAqZGVzdCA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsKKwkJCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSArIDJdOworCQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV07CisKKwkJd2hpbGUgKCBzb3VyY2UgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCisJCQkqLS1kZXN0ID0gKi0tc291cmNlOworCisJCXl5X2NwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJeXlfYnAgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPQorCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZTsKKworCQlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdyIgKTsKKwkJfQorCisJKi0teXlfY3AgPSAoY2hhcikgYzsKKworCSh5eXRleHRfcHRyKSA9IHl5X2JwOworCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOworCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOworfQorCisjaWZuZGVmIFlZX05PX0lOUFVUCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBzdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQpCisjZWxzZQorICAgIHN0YXRpYyBpbnQgaW5wdXQgICh2b2lkKQorI2VuZGlmCisKK3sKKwlpbnQgYzsKKworCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKworCWlmICggKih5eV9jX2J1Zl9wKSA9PSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQl7CisJCS8qIHl5X2NfYnVmX3Agbm93IHBvaW50cyB0byB0aGUgY2hhcmFjdGVyIHdlIHdhbnQgdG8gcmV0dXJuLgorCQkgKiBJZiB0aGlzIG9jY3VycyAqYmVmb3JlKiB0aGUgRU9CIGNoYXJhY3RlcnMsIHRoZW4gaXQncyBhCisJCSAqIHZhbGlkIE5VTDsgaWYgbm90LCB0aGVuIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisJCSAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSA8ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldICkKKwkJCS8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCSooeXlfY19idWZfcCkgPSAnXDAnOworCisJCWVsc2UKKwkJCXsgLyogbmVlZCBtb3JlIGlucHV0ICovCisJCQlpbnQgb2Zmc2V0ID0gKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpOworCQkJKysoeXlfY19idWZfcCk7CisKKwkJCXN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggICkgKQorCQkJCXsKKwkJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQkJLyogVGhpcyBoYXBwZW5zIGJlY2F1c2UgeXlfZ19uX2IoKQorCQkJCQkgKiBzZWVzIHRoYXQgd2UndmUgYWNjdW11bGF0ZWQgYQorCQkJCQkgKiB0b2tlbiBhbmQgZmxhZ3MgdGhhdCB3ZSBuZWVkIHRvCisJCQkJCSAqIHRyeSBtYXRjaGluZyB0aGUgdG9rZW4gYmVmb3JlCisJCQkJCSAqIHByb2NlZWRpbmcuICBCdXQgZm9yIGlucHV0KCksCisJCQkJCSAqIHRoZXJlJ3Mgbm8gbWF0Y2hpbmcgdG8gY29uc2lkZXIuCisJCQkJCSAqIFNvIGNvbnZlcnQgdGhlIEVPQl9BQ1RfTEFTVF9NQVRDSAorCQkJCQkgKiB0byBFT0JfQUNUX0VORF9PRl9GSUxFLgorCQkJCQkgKi8KKworCQkJCQkvKiBSZXNldCBidWZmZXIgc3RhdHVzLiAqLworCQkJCQl6Y29uZnJlc3RhcnQoemNvbmZpbiApOworCisJCQkJCS8qRkFMTFRIUk9VR0gqLworCisJCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCQl7CisJCQkJCWlmICggemNvbmZ3cmFwKCApICkKKwkJCQkJCXJldHVybiBFT0Y7CisKKwkJCQkJaWYgKCAhICh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpICkKKwkJCQkJCVlZX05FV19GSUxFOworI2lmZGVmIF9fY3BsdXNwbHVzCisJCQkJCXJldHVybiB5eWlucHV0KCk7CisjZWxzZQorCQkJCQlyZXR1cm4gaW5wdXQoKTsKKyNlbmRpZgorCQkJCQl9CisKKwkJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgb2Zmc2V0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHl5X2NfYnVmX3ApOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KKwkqKHl5X2NfYnVmX3ApID0gJ1wwJzsJLyogcHJlc2VydmUgemNvbmZ0ZXh0ICovCisJKHl5X2hvbGRfY2hhcikgPSAqKysoeXlfY19idWZfcCk7CisKKwlyZXR1cm4gYzsKK30KKyNlbmRpZgkvKiBpZm5kZWYgWVlfTk9fSU5QVVQgKi8KKworLyoqIEltbWVkaWF0ZWx5IHN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBzdHJlYW0uCisgKiBAcGFyYW0gaW5wdXRfZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlc2V0IHRoZSBzdGFydCBjb25kaXRpb24gdG8gQGMgSU5JVElBTCAuCisgKi8KKyAgICB2b2lkIHpjb25mcmVzdGFydCAgKEZJTEUgKiBpbnB1dF9maWxlICkKK3sKKworCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApeworICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9CisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsKKwl9CisKKwl6Y29uZl9pbml0X2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUixpbnB1dF9maWxlICk7CisJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Cit9CisKKy8qKiBTd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBpbnB1dCBidWZmZXIuCisgKgorICovCisgICAgdm9pZCB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBuZXdfYnVmZmVyICkKK3sKKworCS8qIFRPRE8uIFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyBlbnRpcmUgZnVuY3Rpb24gYm9keQorCSAqIHdpdGgKKwkgKgkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7CisJICoJCXpjb25mcHVzaF9idWZmZXJfc3RhdGUobmV3X2J1ZmZlcik7CisgICAgICovCisJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgPT0gbmV3X2J1ZmZlciApCisJCXJldHVybjsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl7CisJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KKwkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKworCS8qIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgd2hldGhlciB3ZSBkaWQgdGhpcyBzd2l0Y2ggZHVyaW5nCisJICogRU9GICh6Y29uZndyYXAoKSkgcHJvY2Vzc2luZywgYnV0IHRoZSBvbmx5IHRpbWUgdGhpcyBmbGFnCisJICogaXMgbG9va2VkIGF0IGlzIGFmdGVyIHpjb25md3JhcCgpIGlzIGNhbGxlZCwgc28gaXQncyBzYWZlCisJICogdG8gZ28gYWhlYWQgYW5kIGFsd2F5cyBzZXQgaXQuCisJICovCisJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSAgKHZvaWQpCit7CisgICAgCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkoeXl0ZXh0X3B0cikgPSAoeXlfY19idWZfcCkgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3M7CisJemNvbmZpbiA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZTsKKwkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7Cit9CisKKy8qKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnB1dCBidWZmZXIgc3RhdGUuCisgKiBAcGFyYW0gZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSBzaXplIFRoZSBjaGFyYWN0ZXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFdoZW4gaW4gZG91YnQsIHVzZSBAYyBZWV9CVUZfU0laRS4KKyAqCisgKiBAcmV0dXJuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlLgorICovCisgICAgWVlfQlVGRkVSX1NUQVRFIHpjb25mX2NyZWF0ZV9idWZmZXIgIChGSUxFICogZmlsZSwgaW50ICBzaXplICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKworCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB6Y29uZmFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplOworCisJLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQorCSAqIHdlIG5lZWQgdG8gcHV0IGluIDIgZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLgorCSAqLworCWItPnl5X2NoX2J1ZiA9IChjaGFyICopIHpjb25mYWxsb2MoYi0+eXlfYnVmX3NpemUgKyAyICApOworCWlmICggISBiLT55eV9jaF9idWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCXpjb25mX2luaXRfYnVmZmVyKGIsZmlsZSApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBEZXN0cm95IHRoZSBidWZmZXIuCisgKiBAcGFyYW0gYiBhIGJ1ZmZlciBjcmVhdGVkIHdpdGggemNvbmZfY3JlYXRlX2J1ZmZlcigpCisgKgorICovCisgICAgdm9pZCB6Y29uZl9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgKQoreworCisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKSAvKiBOb3Qgc3VyZSBpZiB3ZSBzaG91bGQgcG9wIGhlcmUuICovCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IChZWV9CVUZGRVJfU1RBVEUpIDA7CisKKwlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQl6Y29uZmZyZWUoKHZvaWQgKikgYi0+eXlfY2hfYnVmICApOworCisJemNvbmZmcmVlKCh2b2lkICopIGIgICk7Cit9CisKKy8qIEluaXRpYWxpemVzIG9yIHJlaW5pdGlhbGl6ZXMgYSBidWZmZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNvbWV0aW1lcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgYnVmZmVyLAorICogc3VjaCBhcyBkdXJpbmcgYSB6Y29uZnJlc3RhcnQoKSBvciBhdCBFT0YuCisgKi8KKyAgICBzdGF0aWMgdm9pZCB6Y29uZl9pbml0X2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgYiwgRklMRSAqIGZpbGUgKQorCit7CisJaW50IG9lcnJubyA9IGVycm5vOworCisJemNvbmZfZmx1c2hfYnVmZmVyKGIgKTsKKworCWItPnl5X2lucHV0X2ZpbGUgPSBmaWxlOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMTsKKworICAgIC8qIElmIGIgaXMgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGVuIHpjb25mX2luaXRfYnVmZmVyIHdhcyBfcHJvYmFibHlfCisgICAgICogY2FsbGVkIGZyb20gemNvbmZyZXN0YXJ0KCkgb3IgdGhyb3VnaCB5eV9nZXRfbmV4dF9idWZmZXIuCisgICAgICogSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHJlc2V0IHRoZSBsaW5lbm8gb3IgY29sdW1uLgorICAgICAqLworICAgIGlmIChiICE9IFlZX0NVUlJFTlRfQlVGRkVSKXsKKyAgICAgICAgYi0+eXlfYnNfbGluZW5vID0gMTsKKyAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKKyAgICB9CisKKyAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworCisJZXJybm8gPSBvZXJybm87Cit9CisKKy8qKiBEaXNjYXJkIGFsbCBidWZmZXJlZCBjaGFyYWN0ZXJzLiBPbiB0aGUgbmV4dCBzY2FuLCBZWV9JTlBVVCB3aWxsIGJlIGNhbGxlZC4KKyAqIEBwYXJhbSBiIHRoZSBidWZmZXIgc3RhdGUgdG8gYmUgZmx1c2hlZCwgdXN1YWxseSBAYyBZWV9DVVJSRU5UX0JVRkZFUi4KKyAqCisgKi8KKyAgICB2b2lkIHpjb25mX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKK3sKKyAgICAJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwliLT55eV9uX2NoYXJzID0gMDsKKworCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCisJICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKKwkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgorCSAqLworCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKKworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKK30KKworLyoqIFB1c2hlcyB0aGUgbmV3IHN0YXRlIG9udG8gdGhlIHN0YWNrLiBUaGUgbmV3IHN0YXRlIGJlY29tZXMKKyAqICB0aGUgY3VycmVudCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSBzdGFjaworICogIGlmIG5lY2Vzc2FyeS4KKyAqICBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IHN0YXRlLgorICoKKyAqLwordm9pZCB6Y29uZnB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciApCit7CisgICAgCWlmIChuZXdfYnVmZmVyID09IE5VTEwpCisJCXJldHVybjsKKworCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjaygpOworCisJLyogVGhpcyBibG9jayBpcyBjb3BpZWQgZnJvbSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl7CisJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KKwkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJLyogT25seSBwdXNoIGlmIHRvcCBleGlzdHMuIE90aGVyd2lzZSwgcmVwbGFjZSB0b3AuICovCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKQorCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkrKzsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOworCisJLyogY29waWVkIGZyb20gemNvbmZfc3dpdGNoX3RvX2J1ZmZlci4gKi8KKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Cit9CisKKy8qKiBSZW1vdmVzIGFuZCBkZWxldGVzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBpZiBwcmVzZW50LgorICogIFRoZSBuZXh0IGVsZW1lbnQgYmVjb21lcyB0aGUgbmV3IHRvcC4KKyAqCisgKi8KK3ZvaWQgemNvbmZwb3BfYnVmZmVyX3N0YXRlICh2b2lkKQoreworICAgIAlpZiAoIVlZX0NVUlJFTlRfQlVGRkVSKQorCQlyZXR1cm47CisKKwl6Y29uZl9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICk7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKKwlpZiAoKHl5X2J1ZmZlcl9zdGFja190b3ApID4gMCkKKwkJLS0oeXlfYnVmZmVyX3N0YWNrX3RvcCk7CisKKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpIHsKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKKwl9Cit9CisKKy8qIEFsbG9jYXRlcyB0aGUgc3RhY2sgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKiAgR3VhcmFudGVlcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIHB1c2guCisgKi8KK3N0YXRpYyB2b2lkIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAodm9pZCkKK3sKKwlpbnQgbnVtX3RvX2FsbG9jOworCisJaWYgKCEoeXlfYnVmZmVyX3N0YWNrKSkgeworCisJCS8qIEZpcnN0IGFsbG9jYXRpb24gaXMganVzdCBmb3IgMiBlbGVtZW50cywgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzCisJCSAqIHNjYW5uZXIgd2lsbCBldmVuIG5lZWQgYSBzdGFjay4gV2UgdXNlIDIgaW5zdGVhZCBvZiAxIHRvIGF2b2lkIGFuCisJCSAqIGltbWVkaWF0ZSByZWFsbG9jIG9uIHRoZSBuZXh0IGNhbGwuCisgICAgICAgICAqLworCQludW1fdG9fYWxsb2MgPSAxOworCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopemNvbmZhbGxvYworCQkJCQkJCQkobnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQorCQkJCQkJCQkpOworCisJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSwgMCwgbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisKKwkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOworCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+PSAoKHl5X2J1ZmZlcl9zdGFja19tYXgpKSAtIDEpeworCisJCS8qIEluY3JlYXNlIHRoZSBidWZmZXIgdG8gcHJlcGFyZSBmb3IgYSBwb3NzaWJsZSBwdXNoLiAqLworCQlpbnQgZ3Jvd19zaXplID0gOCAvKiBhcmJpdHJhcnkgZ3JvdyBzaXplICovOworCisJCW51bV90b19hbGxvYyA9ICh5eV9idWZmZXJfc3RhY2tfbWF4KSArIGdyb3dfc2l6ZTsKKwkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXpjb25mcmVhbGxvYworCQkJCQkJCQkoKHl5X2J1ZmZlcl9zdGFjayksCisJCQkJCQkJCW51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJKTsKKworCQkvKiB6ZXJvIG9ubHkgdGhlIG5ldyBzbG90cy4qLworCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjaykgKyAoeXlfYnVmZmVyX3N0YWNrX21heCksIDAsIGdyb3dfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOworCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7CisJfQorfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGRpcmVjdGx5IGZyb20gYSB1c2VyLXNwZWNpZmllZCBjaGFyYWN0ZXIgYnVmZmVyLgorICogQHBhcmFtIGJhc2UgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqIEBwYXJhbSBzaXplIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgKgorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCisgKi8KK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J1ZmZlciAgKGNoYXIgKiBiYXNlLCB5eV9zaXplX3QgIHNpemUgKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworCisJaWYgKCBzaXplIDwgMiB8fAorCSAgICAgYmFzZVtzaXplLTJdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiB8fAorCSAgICAgYmFzZVtzaXplLTFdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCS8qIFRoZXkgZm9yZ290IHRvIGxlYXZlIHJvb20gZm9yIHRoZSBFT0Incy4gKi8KKwkJcmV0dXJuIDA7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgemNvbmZhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX3NjYW5fYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemUgLSAyOwkvKiAiLSAyIiB0byB0YWtlIGNhcmUgb2YgRU9CJ3MgKi8KKwliLT55eV9idWZfcG9zID0gYi0+eXlfY2hfYnVmID0gYmFzZTsKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMDsKKwliLT55eV9pbnB1dF9maWxlID0gMDsKKwliLT55eV9uX2NoYXJzID0gYi0+eXlfYnVmX3NpemU7CisJYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAwOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcihiICApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gYSBzdHJpbmcuIFRoZSBuZXh0IGNhbGwgdG8gemNvbmZsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIHN0ci4KKyAqIEBwYXJhbSB5eV9zdHIgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gc2NhbgorICoKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCisgKiAgICAgICB6Y29uZl9zY2FuX2J5dGVzKCkgaW5zdGVhZC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eV9zdHIgKQoreworCisJcmV0dXJuIHpjb25mX3NjYW5fYnl0ZXMoeXlfc3RyLHN0cmxlbih5eV9zdHIpICk7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gdGhlIGdpdmVuIGJ5dGVzLiBUaGUgbmV4dCBjYWxsIHRvIHpjb25mbGV4KCkgd2lsbAorICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBieXRlcy4KKyAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gc2NhbgorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYSBieXRlcy4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgICh5eWNvbnN0IGNoYXIgKiBieXRlcywgaW50ICBsZW4gKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworCWNoYXIgKmJ1ZjsKKwl5eV9zaXplX3QgbjsKKwlpbnQgaTsKKworCS8qIEdldCBtZW1vcnkgZm9yIGZ1bGwgYnVmZmVyLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRyYWlsaW5nIEVPQidzLiAqLworCW4gPSBsZW4gKyAyOworCWJ1ZiA9IChjaGFyICopIHpjb25mYWxsb2MobiAgKTsKKwlpZiAoICEgYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9ieXRlcygpIiApOworCisJZm9yICggaSA9IDA7IGkgPCBsZW47ICsraSApCisJCWJ1ZltpXSA9IGJ5dGVzW2ldOworCisJYnVmW2xlbl0gPSBidWZbbGVuKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYiA9IHpjb25mX3NjYW5fYnVmZmVyKGJ1ZixuICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggImJhZCBidWZmZXIgaW4gemNvbmZfc2Nhbl9ieXRlcygpIiApOworCisJLyogSXQncyBva2F5IHRvIGdyb3cgZXRjLiB0aGlzIGJ1ZmZlciwgYW5kIHdlIHNob3VsZCB0aHJvdyBpdAorCSAqIGF3YXkgd2hlbiB3ZSdyZSBkb25lLgorCSAqLworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJcmV0dXJuIGI7Cit9CisKKyNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCisjZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICkKK3sKKyAgICAJKHZvaWQpIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2cgKTsKKwlleGl0KCBZWV9FWElUX0ZBSUxVUkUgKTsKK30KKworLyogUmVkZWZpbmUgeXlsZXNzKCkgc28gaXQgd29ya3MgaW4gc2VjdGlvbiAzIGNvZGUuICovCisKKyN1bmRlZiB5eWxlc3MKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQl6Y29uZnRleHRbemNvbmZsZW5nXSA9ICh5eV9ob2xkX2NoYXIpOyBcCisJCSh5eV9jX2J1Zl9wKSA9IHpjb25mdGV4dCArIHl5bGVzc19tYWNyb19hcmc7IFwKKwkJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOyBcCisJCSooeXlfY19idWZfcCkgPSAnXDAnOyBcCisJCXpjb25mbGVuZyA9IHl5bGVzc19tYWNyb19hcmc7IFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworLyogQWNjZXNzb3IgIG1ldGhvZHMgKGdldC9zZXQgZnVuY3Rpb25zKSB0byBzdHJ1Y3QgbWVtYmVycy4gKi8KKworLyoqIEdldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqCisgKi8KK2ludCB6Y29uZmdldF9saW5lbm8gICh2b2lkKQoreworCisgICAgcmV0dXJuIHpjb25mbGluZW5vOworfQorCisvKiogR2V0IHRoZSBpbnB1dCBzdHJlYW0uCisgKgorICovCitGSUxFICp6Y29uZmdldF9pbiAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZmluOworfQorCisvKiogR2V0IHRoZSBvdXRwdXQgc3RyZWFtLgorICoKKyAqLworRklMRSAqemNvbmZnZXRfb3V0ICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mb3V0OworfQorCisvKiogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uCisgKgorICovCitpbnQgemNvbmZnZXRfbGVuZyAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZmxlbmc7Cit9CisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uCisgKgorICovCisKK2NoYXIgKnpjb25mZ2V0X3RleHQgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZ0ZXh0OworfQorCisvKiogU2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICogQHBhcmFtIGxpbmVfbnVtYmVyCisgKgorICovCit2b2lkIHpjb25mc2V0X2xpbmVubyAoaW50ICBsaW5lX251bWJlciApCit7CisKKyAgICB6Y29uZmxpbmVubyA9IGxpbmVfbnVtYmVyOworfQorCisvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgZG9lcyBub3QgZGlzY2FyZCB0aGUgY3VycmVudAorICogaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIGluX3N0ciBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqCisgKiBAc2VlIHpjb25mX3N3aXRjaF90b19idWZmZXIKKyAqLwordm9pZCB6Y29uZnNldF9pbiAoRklMRSAqICBpbl9zdHIgKQoreworICAgICAgICB6Y29uZmluID0gaW5fc3RyIDsKK30KKwordm9pZCB6Y29uZnNldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciApCit7CisgICAgICAgIHpjb25mb3V0ID0gb3V0X3N0ciA7Cit9CisKK2ludCB6Y29uZmdldF9kZWJ1ZyAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZl9mbGV4X2RlYnVnOworfQorCit2b2lkIHpjb25mc2V0X2RlYnVnIChpbnQgIGJkZWJ1ZyApCit7CisgICAgICAgIHpjb25mX2ZsZXhfZGVidWcgPSBiZGVidWcgOworfQorCisvKiB6Y29uZmxleF9kZXN0cm95IGlzIGZvciBib3RoIHJlZW50cmFudCBhbmQgbm9uLXJlZW50cmFudCBzY2FubmVycy4gKi8KK2ludCB6Y29uZmxleF9kZXN0cm95ICAodm9pZCkKK3sKKworICAgIC8qIFBvcCB0aGUgYnVmZmVyIHN0YWNrLCBkZXN0cm95aW5nIGVhY2ggZWxlbWVudC4gKi8KKwl3aGlsZShZWV9DVVJSRU5UX0JVRkZFUil7CisJCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgICk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJCXpjb25mcG9wX2J1ZmZlcl9zdGF0ZSgpOworCX0KKworCS8qIERlc3Ryb3kgdGhlIHN0YWNrIGl0c2VsZi4gKi8KKwl6Y29uZmZyZWUoKHl5X2J1ZmZlcl9zdGFjaykgKTsKKwkoeXlfYnVmZmVyX3N0YWNrKSA9IE5VTEw7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEludGVybmFsIHV0aWxpdHkgcm91dGluZXMuCisgKi8KKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIqIHMxLCB5eWNvbnN0IGNoYXIgKiBzMiwgaW50IG4gKQoreworCXJlZ2lzdGVyIGludCBpOworICAgIAlmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisJCXMxW2ldID0gczJbaV07Cit9CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiBzICkKK3sKKwlyZWdpc3RlciBpbnQgbjsKKyAgICAJZm9yICggbiA9IDA7IHNbbl07ICsrbiApCisJCTsKKworCXJldHVybiBuOworfQorI2VuZGlmCisKK3ZvaWQgKnpjb25mYWxsb2MgKHl5X3NpemVfdCAgc2l6ZSApCit7CisJcmV0dXJuICh2b2lkICopIG1hbGxvYyggc2l6ZSApOworfQorCit2b2lkICp6Y29uZnJlYWxsb2MgICh2b2lkICogcHRyLCB5eV9zaXplX3QgIHNpemUgKQoreworCS8qIFRoZSBjYXN0IHRvIChjaGFyICopIGluIHRoZSBmb2xsb3dpbmcgYWNjb21tb2RhdGVzIGJvdGgKKwkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgY2hhciogZ2VuZXJpYyBwb2ludGVycywgYW5kIHRob3NlCisJICogdGhhdCB1c2Ugdm9pZCogZ2VuZXJpYyBwb2ludGVycy4gIEl0IHdvcmtzIHdpdGggdGhlIGxhdHRlcgorCSAqIGJlY2F1c2UgYm90aCBBTlNJIEMgYW5kIEMrKyBhbGxvdyBjYXN0bGVzcyBhc3NpZ25tZW50IGZyb20KKwkgKiBhbnkgcG9pbnRlciB0eXBlIHRvIHZvaWQqLCBhbmQgZGVhbCB3aXRoIGFyZ3VtZW50IGNvbnZlcnNpb25zCisJICogYXMgdGhvdWdoIGRvaW5nIGFuIGFzc2lnbm1lbnQuCisJICovCisJcmV0dXJuICh2b2lkICopIHJlYWxsb2MoIChjaGFyICopIHB0ciwgc2l6ZSApOworfQorCit2b2lkIHpjb25mZnJlZSAodm9pZCAqIHB0ciApCit7CisJZnJlZSggKGNoYXIgKikgcHRyICk7CS8qIHNlZSB6Y29uZnJlYWxsb2MoKSBmb3IgKGNoYXIgKikgY2FzdCAqLworfQorCisjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgorCisjdW5kZWYgWVlfTkVXX0ZJTEUKKyN1bmRlZiBZWV9GTFVTSF9CVUZGRVIKKyN1bmRlZiB5eV9zZXRfYm9sCisjdW5kZWYgeXlfbmV3X2J1ZmZlcgorI3VuZGVmIHl5X3NldF9pbnRlcmFjdGl2ZQorI3VuZGVmIHl5dGV4dF9wdHIKKyN1bmRlZiBZWV9ET19CRUZPUkVfQUNUSU9OCisKKyNpZmRlZiBZWV9ERUNMX0lTX09VUlMKKyN1bmRlZiBZWV9ERUNMX0lTX09VUlMKKyN1bmRlZiBZWV9ERUNMCisjZW5kaWYKKwordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCkKK3sKKwluZXdfc3RyaW5nKCk7CisJbGFzdF90cyA9IGZpcnN0X3RzID0gMDsKKwlCRUdJTihIRUxQKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKQoreworCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCUJFR0lOKElOSVRJQUwpOworfQorCisvKgorICogVHJ5IHRvIG9wZW4gc3BlY2lmaWVkIGZpbGUgd2l0aCBmb2xsb3dpbmcgbmFtZXM6CisgKiAuL25hbWUKKyAqICQoc3JjdHJlZSkvbmFtZQorICogVGhlIGxhdHRlciBpcyB1c2VkIHdoZW4gc3JjdHJlZSBpcyBzZXBhcmF0ZSBmcm9tIG9ianRyZWUKKyAqIHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwuCisgKiBSZXR1cm4gTlVMTCBpZiBmaWxlIGlzIG5vdCBmb3VuZC4KKyAqLworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICplbnY7CisJRklMRSAqZjsKKworCWYgPSBmb3BlbihuYW1lLCAiciIpOworCWlmICghZiAmJiBuYW1lWzBdICE9ICcvJykgeworCQllbnYgPSBnZXRlbnYoU1JDVFJFRSk7CisJCWlmIChlbnYpIHsKKwkJCWNoYXIgKmZ1bGxuYW1lID0gYWxsb2NhKHN0cmxlbihlbnYpICsgc3RybGVuKG5hbWUpICsgMik7CisJCQlzcHJpbnRmKGZ1bGxuYW1lLCAiJXMvJXMiLCBlbnYsIG5hbWUpOworCQkJZiA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOworCQl9CisJfQorCXJldHVybiBmOworfQorCit2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJemNvbmZpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCWlmICghemNvbmZpbikgeworCQlwcmludGYoImNhbid0IGZpbmQgZmlsZSAlc1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJY3VycmVudF9idWYgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCW1lbXNldChjdXJyZW50X2J1ZiwgMCwgc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCisJY3VycmVudF9maWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJY3VycmVudF9maWxlLT5saW5lbm8gPSAxOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgPSBGSUxFX0JVU1k7Cit9CisKK3ZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCXN0cnVjdCBidWZmZXIgKmJ1ZiA9IG1hbGxvYyhzaXplb2YoKmJ1ZikpOworCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisKKwljdXJyZW50X2J1Zi0+c3RhdGUgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKwl6Y29uZmluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF6Y29uZmluKSB7CisJCXByaW50ZigiJXM6JWQ6IGNhbid0IG9wZW4gZmlsZSBcIiVzXCJcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIG5hbWUpOworCQlleGl0KDEpOworCX0KKwl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSkpOworCWJ1Zi0+cGFyZW50ID0gY3VycmVudF9idWY7CisJY3VycmVudF9idWYgPSBidWY7CisKKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX0JVU1kpIHsKKwkJcHJpbnRmKCJyZWN1cnNpdmUgc2NhbiAoJXMpP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChmaWxlLT5mbGFncyAmIEZJTEVfU0NBTk5FRCkgeworCQlwcmludGYoImZpbGUgJXMgYWxyZWFkeSBzY2FubmVkP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWZpbGUtPmZsYWdzIHw9IEZJTEVfQlVTWTsKKwlmaWxlLT5saW5lbm8gPSAxOworCWZpbGUtPnBhcmVudCA9IGN1cnJlbnRfZmlsZTsKKwljdXJyZW50X2ZpbGUgPSBmaWxlOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpCit7CisJc3RydWN0IGJ1ZmZlciAqcGFyZW50OworCisJY3VycmVudF9maWxlLT5mbGFncyB8PSBGSUxFX1NDQU5ORUQ7CisJY3VycmVudF9maWxlLT5mbGFncyAmPSB+RklMRV9CVVNZOworCWN1cnJlbnRfZmlsZSA9IGN1cnJlbnRfZmlsZS0+cGFyZW50OworCisJcGFyZW50ID0gY3VycmVudF9idWYtPnBhcmVudDsKKwlpZiAocGFyZW50KSB7CisJCWZjbG9zZSh6Y29uZmluKTsKKwkJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CisJCXpjb25mX3N3aXRjaF90b19idWZmZXIocGFyZW50LT5zdGF0ZSk7CisJfQorCWZyZWUoY3VycmVudF9idWYpOworCWN1cnJlbnRfYnVmID0gcGFyZW50OworfQorCitpbnQgemNvbmZfbGluZW5vKHZvaWQpCit7CisJcmV0dXJuIGN1cnJlbnRfcG9zLmxpbmVubzsKK30KKworY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3Bvcy5maWxlID8gY3VycmVudF9wb3MuZmlsZS0+bmFtZSA6ICI8bm9uZT4iOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2Y2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaWZuZGVmIExLQ19ICisjZGVmaW5lIExLQ19ICisKKyNpbmNsdWRlICJleHByLmgiCisKKyNpZm5kZWYgS0JVSUxEX05PX05MUworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKChjb25zdCBjaGFyICopIChNc2dpZCkpCisjIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpICgoY29uc3QgY2hhciAqKSAoRG9tYWlubmFtZSkpCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW5uYW1lLCBEaXJuYW1lKSAoKGNvbnN0IGNoYXIgKikgKERpcm5hbWUpKQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIExLQ19ESVJFQ1RfTElOSworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCWV4dGVybiB0eXBlIG5hbWUgYXJnCisjZWxzZQorI2luY2x1ZGUgImxrY19kZWZzLmgiCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgKCpuYW1lICMjIF9wKSBhcmcKKyNlbmRpZgorI2luY2x1ZGUgImxrY19wcm90by5oIgorI3VuZGVmIFAKKworI2RlZmluZSBTUkNUUkVFICJzcmN0cmVlIgorCisjZGVmaW5lIFBBQ0tBR0UgImxpbnV4IgorI2RlZmluZSBMT0NBTEVESVIgIi91c3Ivc2hhcmUvbG9jYWxlIgorCisjZGVmaW5lIF8odGV4dCkgZ2V0dGV4dCh0ZXh0KQorI2RlZmluZSBOXyh0ZXh0KSAodGV4dCkKKworCisjZGVmaW5lIFRGX0NPTU1BTkQJMHgwMDAxCisjZGVmaW5lIFRGX1BBUkFNCTB4MDAwMgorCitzdHJ1Y3Qga2NvbmZfaWQgeworCWludCBuYW1lOworCWludCB0b2tlbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJZW51bSBzeW1ib2xfdHlwZSBzdHlwZTsKK307CisKK2ludCB6Y29uZnBhcnNlKHZvaWQpOwordm9pZCB6Y29uZmR1bXAoRklMRSAqb3V0KTsKKworZXh0ZXJuIGludCB6Y29uZmRlYnVnOwordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCk7CitGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHpjb25mX25leHRmaWxlKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHpjb25mX2xpbmVubyh2b2lkKTsKK2NoYXIgKnpjb25mX2N1cm5hbWUodm9pZCk7CisKKy8qIGNvbmZkYXRhLmMgKi8KK2V4dGVybiBjb25zdCBjaGFyIGNvbmZfZGVmX2ZpbGVuYW1lW107CisKK2NoYXIgKmNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUodm9pZCk7CisKKy8qIGtjb25maWdfbG9hZC5jICovCit2b2lkIGtjb25maWdfbG9hZCh2b2lkKTsKKworLyogbWVudS5jICovCit2b2lkIG1lbnVfaW5pdCh2b2lkKTsKK3N0cnVjdCBtZW51ICptZW51X2FkZF9tZW51KHZvaWQpOwordm9pZCBtZW51X2VuZF9tZW51KHZvaWQpOwordm9pZCBtZW51X2FkZF9lbnRyeShzdHJ1Y3Qgc3ltYm9sICpzeW0pOwordm9pZCBtZW51X2VuZF9lbnRyeSh2b2lkKTsKK3ZvaWQgbWVudV9hZGRfZGVwKHN0cnVjdCBleHByICpkZXApOworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9wKGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApOworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9tcHQoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9hZGRfZXhwcihlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfYWRkX3N5bWJvbChlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBleHByICpkZXApOwordm9pZCBtZW51X2ZpbmFsaXplKHN0cnVjdCBtZW51ICpwYXJlbnQpOwordm9pZCBtZW51X3NldF90eXBlKGludCB0eXBlKTsKKworLyogdXRpbC5jICovCitzdHJ1Y3QgZmlsZSAqZmlsZV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZmlsZV93cml0ZV9kZXAoY29uc3QgY2hhciAqbmFtZSk7CisKK3N0cnVjdCBnc3RyIHsKKwlzaXplX3QgbGVuOworCWNoYXIgICpzOworfTsKK3N0cnVjdCBnc3RyIHN0cl9uZXcodm9pZCk7CitzdHJ1Y3QgZ3N0ciBzdHJfYXNzaWduKGNvbnN0IGNoYXIgKnMpOwordm9pZCBzdHJfZnJlZShzdHJ1Y3QgZ3N0ciAqZ3MpOwordm9pZCBzdHJfYXBwZW5kKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqcyk7Cit2b2lkIHN0cl9wcmludGYoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Citjb25zdCBjaGFyICpzdHJfZ2V0KHN0cnVjdCBnc3RyICpncyk7CisKKy8qIHN5bWJvbC5jICovCit2b2lkIHN5bV9pbml0KHZvaWQpOwordm9pZCBzeW1fY2xlYXJfYWxsX3ZhbGlkKHZvaWQpOwordm9pZCBzeW1fc2V0X2NoYW5nZWQoc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgcHJvcGVydHkgKnByb3BfYWxsb2MoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBzeW1ib2wgKnByb3BfZ2V0X3N5bWJvbChzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOworCitzdGF0aWMgaW5saW5lIHRyaXN0YXRlIHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmN1cnIudHJpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5bWJvbCAqc3ltX2dldF9jaG9pY2VfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiAoc3RydWN0IHN5bWJvbCAqKXN5bS0+Y3Vyci52YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1fc2V0X2Nob2ljZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpjaCwgc3RydWN0IHN5bWJvbCAqY2h2YWwpCit7CisJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoY2h2YWwsIHllcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1faXNfY2hvaWNlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9DSE9JQ0UgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1faXNfY2hvaWNlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9DSE9JQ0VWQUwgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1faXNfb3B0aW9uYWwoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX09QVElPTkFMID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2hhc192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXID8gZmFsc2UgOiB0cnVlOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTEtDX0ggKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaCBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmEzODljCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCkBAIC0wLDAgKzEsNDEgQEAKKworLyogY29uZmRhdGEuYyAqLworUChjb25mX3BhcnNlLHZvaWQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1AoY29uZl9yZWFkLGludCwoY29uc3QgY2hhciAqbmFtZSkpOworUChjb25mX3JlYWRfc2ltcGxlLGludCwoY29uc3QgY2hhciAqbmFtZSkpOworUChjb25mX3dyaXRlLGludCwoY29uc3QgY2hhciAqbmFtZSkpOworCisvKiBtZW51LmMgKi8KK1Aocm9vdG1lbnUsc3RydWN0IG1lbnUsKTsKKworUChtZW51X2lzX3Zpc2libGUsYm9vbCwoc3RydWN0IG1lbnUgKm1lbnUpKTsKK1AobWVudV9nZXRfcHJvbXB0LGNvbnN0IGNoYXIgKiwoc3RydWN0IG1lbnUgKm1lbnUpKTsKK1AobWVudV9nZXRfcm9vdF9tZW51LHN0cnVjdCBtZW51ICosKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X3BhcmVudF9tZW51LHN0cnVjdCBtZW51ICosKHN0cnVjdCBtZW51ICptZW51KSk7CisKKy8qIHN5bWJvbC5jICovCitQKHN5bWJvbF9oYXNoLHN0cnVjdCBzeW1ib2wgKixbU1lNQk9MX0hBU0hTSVpFXSk7CitQKHN5bV9jaGFuZ2VfY291bnQsaW50LCk7CisKK1Aoc3ltX2xvb2t1cCxzdHJ1Y3Qgc3ltYm9sICosKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpc2NvbnN0KSk7CitQKHN5bV9maW5kLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSkpOworUChzeW1fcmVfc2VhcmNoLHN0cnVjdCBzeW1ib2wgKiosKGNvbnN0IGNoYXIgKnBhdHRlcm4pKTsKK1Aoc3ltX3R5cGVfbmFtZSxjb25zdCBjaGFyICosKGVudW0gc3ltYm9sX3R5cGUgdHlwZSkpOworUChzeW1fY2FsY192YWx1ZSx2b2lkLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF90eXBlLGVudW0gc3ltYm9sX3R5cGUsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSx0cmlzdGF0ZSB0cmkpKTsKK1Aoc3ltX3NldF90cmlzdGF0ZV92YWx1ZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sdHJpc3RhdGUgdHJpKSk7CitQKHN5bV90b2dnbGVfdHJpc3RhdGVfdmFsdWUsdHJpc3RhdGUsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fc3RyaW5nX3ZhbGlkLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKSk7CitQKHN5bV9zdHJpbmdfd2l0aGluX3JhbmdlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKSk7CitQKHN5bV9zZXRfc3RyaW5nX3ZhbHVlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKSk7CitQKHN5bV9pc19jaGFuZ2FibGUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfY2hvaWNlX3Byb3Asc3RydWN0IHByb3BlcnR5ICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X2RlZmF1bHRfcHJvcCxzdHJ1Y3QgcHJvcGVydHkgKiwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfc3RyaW5nX3ZhbHVlLGNvbnN0IGNoYXIgKiwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CisKK1AocHJvcF9nZXRfdHlwZV9uYW1lLGNvbnN0IGNoYXIgKiwoZW51bSBwcm9wX3R5cGUgdHlwZSkpOworCisvKiBleHByLmMgKi8KK1AoZXhwcl9jb21wYXJlX3R5cGUsaW50LChlbnVtIGV4cHJfdHlwZSB0MSwgZW51bSBleHByX3R5cGUgdDIpKTsKK1AoZXhwcl9wcmludCx2b2lkLChzdHJ1Y3QgZXhwciAqZSwgdm9pZCAoKmZuKSh2b2lkICosIGNvbnN0IGNoYXIgKiksIHZvaWQgKmRhdGEsIGludCBwcmV2dG9rZW4pKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9CSUcuRkFULldBUk5JTkcgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvQklHLkZBVC5XQVJOSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYWRiODAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvQklHLkZBVC5XQVJOSU5HCkBAIC0wLDAgKzEsNCBAQAorVGhpcyBpcyBOT1QgdGhlIG9mZmljaWFsIHZlcnNpb24gb2YgZGlhbG9nLiAgVGhpcyB2ZXJzaW9uIGhhcyBiZWVuCitzaWduaWZpY2FudGx5IG1vZGlmaWVkIGZyb20gdGhlIG9yaWdpbmFsLiAgSXQgd2FzIHVzZWQgYnkgdGhlIExpbnV4CitrZXJuZWwgY29uZmlndXJhdGlvbiBzY3JpcHQsIGFuZCBzdWJzZXF1ZW50bHkgYWRhcHRlZCBmb3IgYnVzeWJveC4KK1BsZWFzZSBkbyBub3QgYm90aGVyIFNhdmlvIExhbSB3aXRoIHF1ZXN0aW9ucyBhYm91dCB0aGlzIHByb2dyYW0uCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvTWFrZWZpbGUgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5ZGM0OAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9NYWtlZmlsZQpAQCAtMCwwICsxLDIxIEBACisjIE1ha2VmaWxlIHRvIGJ1aWxkIGx4ZGlhbG9nIHBhY2thZ2UKKyMKKworY2hlY2stbHhkaWFsb2cgIDo9ICQoc3JjdHJlZSkvJChzcmMpL2NoZWNrLWx4ZGlhbG9nLnNoCisKKyMgVXNlIHJldXJzaXZlbHkgZXhwYW5kZWQgdmFyaWFibGVzIHNvIHdlIGRvIG5vdCBjYWxsIGdjYyB1bmxlc3MKKyMgd2UgcmVhbGx5IG5lZWQgdG8gZG8gc28uIChEbyBub3QgY2FsbCBnY2MgYXMgcGFydCBvZiBtYWtlIG1ycHJvcGVyKQorSE9TVF9FWFRSQUNGTEFHUyA9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoY2hlY2stbHhkaWFsb2cpIC1jY2ZsYWdzKQorSE9TVF9MT0FETElCRVMgICA9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoY2hlY2stbHhkaWFsb2cpIC1sZGZsYWdzICQoSE9TVENDKSkKKworSE9TVF9FWFRSQUNGTEFHUyArPSAtRExPQ0FMRQorCitQSE9OWSArPSBkb2NoZWNrbHhkaWFsb2cKKyQob2JqKS9kb2NoZWNrbHhkaWFsb2c6CisJJChRKSQoQ09ORklHX1NIRUxMKSAkKGNoZWNrLWx4ZGlhbG9nKSAtY2hlY2sgJChIT1NUQ0MpICQoSE9TVF9FWFRSQUNGTEFHUykgJChIT1NUX0xPQURMSUJFUykKKworaG9zdHByb2dzLXkJOj0gbHhkaWFsb2cKK2Fsd2F5cwkJOj0gJChob3N0cHJvZ3MteSkgZG9jaGVja2x4ZGlhbG9nCisKK2x4ZGlhbG9nLW9ianMgOj0gY2hlY2tsaXN0Lm8gbWVudWJveC5vIHRleHRib3gubyB5ZXNuby5vIGlucHV0Ym94Lm8gXAorCQkgdXRpbC5vIGx4ZGlhbG9nLm8gbXNnYm94Lm8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVjay1seGRpYWxvZy5zaCBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVjay1seGRpYWxvZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRkZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrLWx4ZGlhbG9nLnNoCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorIyBDaGVjayBuY3Vyc2VzIGNvbXBhdGliaWxpdHkKKworIyBXaGF0IGxpYnJhcnkgdG8gbGluaworbGRmbGFncygpCit7CisJZm9yIGV4dCBpbiBzbyBhIGR5bGliIDsgZG8KKwkJZm9yIGxpYiBpbiBuY3Vyc2VzdyBuY3Vyc2VzIGN1cnNlcyA7IGRvCisJCQkkY2MgLXByaW50LWZpbGUtbmFtZT1saWIke2xpYn0uJHtleHR9IHwgZ3JlcCAtcSAvCisJCQlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJCQllY2hvICItbCR7bGlifSIKKwkJCQlleGl0CisJCQlmaQorCQlkb25lCisJZG9uZQorCWV4aXQgMQorfQorCisjIFdoZXJlIGlzIG5jdXJzZXMuaD8KK2NjZmxhZ3MoKQoreworCWlmIFsgLWYgL3Vzci9pbmNsdWRlL25jdXJzZXN3L25jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1JL3Vzci9pbmNsdWRlL25jdXJzZXN3IC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMuaD4iJworCWVsaWYgWyAtZiAvdXNyL2luY2x1ZGUvbmN1cnNlc3cvY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctSS91c3IvaW5jbHVkZS9uY3Vyc2VzdyAtRENVUlNFU19MT0M9IjxuY3Vyc2Vzdy9jdXJzZXMuaD4iJworCWVsaWYgWyAtZiAvdXNyL2luY2x1ZGUvbmN1cnNlcy9uY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctSS91c3IvaW5jbHVkZS9uY3Vyc2VzIC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMuaD4iJworCWVsaWYgWyAtZiAvdXNyL2luY2x1ZGUvbmN1cnNlcy9jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1JL3Vzci9pbmNsdWRlL25jdXJzZXMgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy9jdXJzZXMuaD4iJworCWVsaWYgWyAtZiAvdXNyL2luY2x1ZGUvbmN1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiInCisJZWxzZQorCQllY2hvICctRENVUlNFU19MT0M9IjxjdXJzZXMuaD4iJworCWZpCit9CisKKyMgVGVtcCBmaWxlLCB0cnkgdG8gY2xlYW4gdXAgYWZ0ZXIgdXMKK3RtcD0ubHhkaWFsb2cudG1wCit0cmFwICJybSAtZiAkdG1wIiAwIDEgMiAzIDE1CisKKyMgQ2hlY2sgaWYgd2UgY2FuIGxpbmsgdG8gbmN1cnNlcworY2hlY2soKSB7CisgICAgICAgICRjYyAteGMgLSAtbyAkdG1wIDI+L2Rldi9udWxsIDw8J0VPRicKKyNpbmNsdWRlIENVUlNFU19MT0MKK21haW4oKSB7fQorRU9GCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkgICAgZWNobyAiICoqKiBVbmFibGUgdG8gZmluZCB0aGUgbmN1cnNlcyBsaWJyYXJpZXMgb3IgdGhlIiAgICAgICAxPiYyCisJICAgIGVjaG8gIiAqKiogcmVxdWlyZWQgaGVhZGVyIGZpbGVzLiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT4mMgorCSAgICBlY2hvICIgKioqICdtYWtlIG1lbnVjb25maWcnIHJlcXVpcmVzIHRoZSBuY3Vyc2VzIGxpYnJhcmllcy4iIDE+JjIKKwkgICAgZWNobyAiICoqKiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPiYyCisJICAgIGVjaG8gIiAqKiogSW5zdGFsbCBuY3Vyc2VzIChuY3Vyc2VzLWRldmVsKSBhbmQgdHJ5IGFnYWluLiIgICAgMT4mMgorCSAgICBlY2hvICIgKioqICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkgICAgZXhpdCAxCisJZmkKK30KKwordXNhZ2UoKSB7CisJcHJpbnRmICJVc2FnZTogJDAgWy1jaGVjayBjb21waWxlciBvcHRpb25zfC1jY2ZsYWdzfC1sZGZsYWdzIGNvbXBpbGVyIG9wdGlvbnNdXG4iCit9CisKK2lmIFsgJCMgLWVxIDAgXTsgdGhlbgorCXVzYWdlCisJZXhpdCAxCitmaQorCitjYz0iIgorY2FzZSAiJDEiIGluCisJIi1jaGVjayIpCisJCXNoaWZ0CisJCWNjPSIkQCIKKwkJY2hlY2sKKwkJOzsKKwkiLWNjZmxhZ3MiKQorCQljY2ZsYWdzCisJCTs7CisJIi1sZGZsYWdzIikKKwkJc2hpZnQKKwkJY2M9IiRAIgorCQlsZGZsYWdzCisJCTs7CisJIioiKQorCQl1c2FnZQorCQlleGl0IDEKKwkJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAyMDBlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogIGNoZWNrbGlzdC5jIC0tIGltcGxlbWVudHMgdGhlIGNoZWNrbGlzdCBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogICAgIFN0dWFydCBIZXJiZXJ0IC0gUy5IZXJiZXJ0QHNoZWZmaWVsZC5hYy51azogcmFkaW9saXN0IGV4dGVuc2lvbgorICogICAgIEFsZXNzYW5kcm8gUnViaW5pIC0gcnViaW5pQGlwdnZpcy51bmlwdi5pdDogbWVyZ2VkIHRoZSB0d28KKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0YXRpYyBpbnQgbGlzdF93aWR0aCwgY2hlY2tfeCwgaXRlbV94OworCisvKgorICogUHJpbnQgbGlzdCBpdGVtCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2l0ZW0oV0lORE9XICogd2luLCBjb25zdCBjaGFyICppdGVtLCBpbnQgc3RhdHVzLCBpbnQgY2hvaWNlLAorCQkgICAgICAgaW50IHNlbGVjdGVkKQoreworCWludCBpOworCisJLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIGxhc3QgaXRlbSAqLworCXdhdHRyc2V0KHdpbiwgbWVudWJveF9hdHRyKTsKKwl3bW92ZSh3aW4sIGNob2ljZSwgMCk7CisJZm9yIChpID0gMDsgaSA8IGxpc3Rfd2lkdGg7IGkrKykKKwkJd2FkZGNoKHdpbiwgJyAnKTsKKworCXdtb3ZlKHdpbiwgY2hvaWNlLCBjaGVja194KTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gY2hlY2tfc2VsZWN0ZWRfYXR0ciA6IGNoZWNrX2F0dHIpOworCXdwcmludHcod2luLCAiKCVjKSIsIHN0YXR1cyA/ICdYJyA6ICcgJyk7CisKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gdGFnX3NlbGVjdGVkX2F0dHIgOiB0YWdfYXR0cik7CisJbXZ3YWRkY2god2luLCBjaG9pY2UsIGl0ZW1feCwgaXRlbVswXSk7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGl0ZW1fc2VsZWN0ZWRfYXR0ciA6IGl0ZW1fYXR0cik7CisJd2FkZHN0cih3aW4sIChjaGFyICopaXRlbSArIDEpOworCWlmIChzZWxlY3RlZCkgeworCQl3bW92ZSh3aW4sIGNob2ljZSwgY2hlY2tfeCArIDEpOworCQl3cmVmcmVzaCh3aW4pOworCX0KK30KKworLyoKKyAqIFByaW50IHRoZSBzY3JvbGwgaW5kaWNhdG9ycy4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYXJyb3dzKFdJTkRPVyAqIHdpbiwgaW50IGNob2ljZSwgaW50IGl0ZW1fbm8sIGludCBzY3JvbGwsCisJICAgICBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQpCit7CisJd21vdmUod2luLCB5LCB4KTsKKworCWlmIChzY3JvbGwgPiAwKSB7CisJCXdhdHRyc2V0KHdpbiwgdWFycm93X2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfVUFSUk9XKTsKKwkJd2FkZHN0cih3aW4sICIoLSkiKTsKKwl9IGVsc2UgeworCQl3YXR0cnNldCh3aW4sIG1lbnVib3hfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJfQorCisJeSA9IHkgKyBoZWlnaHQgKyAxOworCXdtb3ZlKHdpbiwgeSwgeCk7CisKKwlpZiAoKGhlaWdodCA8IGl0ZW1fbm8pICYmIChzY3JvbGwgKyBjaG9pY2UgPCBpdGVtX25vIC0gMSkpIHsKKwkJd2F0dHJzZXQod2luLCBkYXJyb3dfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19EQVJST1cpOworCQl3YWRkc3RyKHdpbiwgIigrKSIpOworCX0gZWxzZSB7CisJCXdhdHRyc2V0KHdpbiwgbWVudWJveF9ib3JkZXJfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJfQorfQorCisvKgorICogIERpc3BsYXkgdGhlIHRlcm1pbmF0aW9uIGJ1dHRvbnMKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYnV0dG9ucyhXSU5ET1cgKiBkaWFsb2csIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlbGVjdGVkKQoreworCWludCB4ID0gd2lkdGggLyAyIC0gMTE7CisJaW50IHkgPSBoZWlnaHQgLSAyOworCisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIlNlbGVjdCIsIHksIHgsIHNlbGVjdGVkID09IDApOworCXByaW50X2J1dHRvbihkaWFsb2csICIgSGVscCAiLCB5LCB4ICsgMTQsIHNlbGVjdGVkID09IDEpOworCisJd21vdmUoZGlhbG9nLCB5LCB4ICsgMSArIDE0ICogc2VsZWN0ZWQpOworCXdyZWZyZXNoKGRpYWxvZyk7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgZGlhbG9nIGJveCB3aXRoIGEgbGlzdCBvZiBvcHRpb25zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiBvciBvZmYKKyAqIGluIHRoZSBzdHlsZSBvZiByYWRpb2xpc3QgKG9ubHkgb25lIG9wdGlvbiB0dXJuZWQgb24gYXQgYSB0aW1lKS4KKyAqLworaW50IGRpYWxvZ19jaGVja2xpc3QoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwKKwkJICAgICBpbnQgd2lkdGgsIGludCBsaXN0X2hlaWdodCwgaW50IGl0ZW1fbm8sCisJCSAgICAgY29uc3QgY2hhciAqY29uc3QgKml0ZW1zKQoreworCWludCBpLCB4LCB5LCBib3hfeCwgYm94X3k7CisJaW50IGtleSA9IDAsIGJ1dHRvbiA9IDAsIGNob2ljZSA9IDAsIHNjcm9sbCA9IDAsIG1heF9jaG9pY2UsICpzdGF0dXM7CisJV0lORE9XICpkaWFsb2csICpsaXN0OworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHN0b3JpbmcgaXRlbSBvbi9vZmYgc3RhdHVzICovCisJaWYgKChzdGF0dXMgPSBtYWxsb2Moc2l6ZW9mKGludCkgKiBpdGVtX25vKSkgPT0gTlVMTCkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiXG5DYW4ndCBhbGxvY2F0ZSBtZW1vcnkgaW4gZGlhbG9nX2NoZWNrbGlzdCgpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCS8qIEluaXRpYWxpemVzIHN0YXR1cyAqLworCWZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspIHsKKwkJc3RhdHVzW2ldID0gIXN0cmNhc2VjbXAoaXRlbXNbaSAqIDMgKyAyXSwgIm9uIik7CisJCWlmICgoIWNob2ljZSAmJiBzdGF0dXNbaV0pCisJCSAgICB8fCAhc3RyY2FzZWNtcChpdGVtc1tpICogMyArIDJdLCAic2VsZWN0ZWQiKSkKKwkJCWNob2ljZSA9IGkgKyAxOworCX0KKwlpZiAoY2hvaWNlKQorCQljaG9pY2UtLTsKKworCW1heF9jaG9pY2UgPSBNSU4obGlzdF9oZWlnaHQsIGl0ZW1fbm8pOworCisJLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisJeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKwl5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKwlkcmF3X3NoYWRvdyhzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisJZGlhbG9nID0gbmV3d2luKGhlaWdodCwgd2lkdGgsIHksIHgpOworCWtleXBhZChkaWFsb2csIFRSVUUpOworCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworCXdhdHRyc2V0KGRpYWxvZywgYm9yZGVyX2F0dHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwlwcmludF9hdXRvd3JhcChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAzKTsKKworCWxpc3Rfd2lkdGggPSB3aWR0aCAtIDY7CisJYm94X3kgPSBoZWlnaHQgLSBsaXN0X2hlaWdodCAtIDU7CisJYm94X3ggPSAod2lkdGggLSBsaXN0X3dpZHRoKSAvIDIgLSAxOworCisJLyogY3JlYXRlIG5ldyB3aW5kb3cgZm9yIHRoZSBsaXN0ICovCisJbGlzdCA9IHN1YndpbihkaWFsb2csIGxpc3RfaGVpZ2h0LCBsaXN0X3dpZHRoLCB5ICsgYm94X3kgKyAxLAorCSAgICAgICAgICAgICAgeCArIGJveF94ICsgMSk7CisKKwlrZXlwYWQobGlzdCwgVFJVRSk7CisKKwkvKiBkcmF3IGEgYm94IGFyb3VuZCB0aGUgbGlzdCBpdGVtcyAqLworCWRyYXdfYm94KGRpYWxvZywgYm94X3ksIGJveF94LCBsaXN0X2hlaWdodCArIDIsIGxpc3Rfd2lkdGggKyAyLAorCSAgICAgICAgIG1lbnVib3hfYm9yZGVyX2F0dHIsIG1lbnVib3hfYXR0cik7CisKKwkvKiBGaW5kIGxlbmd0aCBvZiBsb25nZXN0IGl0ZW0gaW4gb3JkZXIgdG8gY2VudGVyIGNoZWNrbGlzdCAqLworCWNoZWNrX3ggPSAwOworCWZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspCisJCWNoZWNrX3ggPSBNQVgoY2hlY2tfeCwgK3N0cmxlbihpdGVtc1tpICogMyArIDFdKSArIDQpOworCisJY2hlY2tfeCA9IChsaXN0X3dpZHRoIC0gY2hlY2tfeCkgLyAyOworCWl0ZW1feCA9IGNoZWNrX3ggKyA0OworCisJaWYgKGNob2ljZSA+PSBsaXN0X2hlaWdodCkgeworCQlzY3JvbGwgPSBjaG9pY2UgLSBsaXN0X2hlaWdodCArIDE7CisJCWNob2ljZSAtPSBzY3JvbGw7CisJfQorCisJLyogUHJpbnQgdGhlIGxpc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbKHNjcm9sbCArIGkpICogMyArIDFdLAorCQkJICAgc3RhdHVzW2kgKyBzY3JvbGxdLCBpLCBpID09IGNob2ljZSk7CisJfQorCisJcHJpbnRfYXJyb3dzKGRpYWxvZywgY2hvaWNlLCBpdGVtX25vLCBzY3JvbGwsCisJCSAgICAgYm94X3ksIGJveF94ICsgY2hlY2tfeCArIDUsIGxpc3RfaGVpZ2h0KTsKKworCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKworCXdub3V0cmVmcmVzaChkaWFsb2cpOworCXdub3V0cmVmcmVzaChsaXN0KTsKKwlkb3VwZGF0ZSgpOworCisJd2hpbGUgKGtleSAhPSBFU0MpIHsKKwkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykKKwkJCWlmICh0b3VwcGVyKGtleSkgPT0KKwkJCSAgICB0b3VwcGVyKGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDMgKyAxXVswXSkpCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPCBtYXhfY2hvaWNlIHx8IGtleSA9PSBLRVlfVVAgfHwga2V5ID09IEtFWV9ET1dOIHx8CisJCSAgICBrZXkgPT0gJysnIHx8IGtleSA9PSAnLScpIHsKKwkJCWlmIChrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSAnLScpIHsKKwkJCQlpZiAoIWNob2ljZSkgeworCQkJCQlpZiAoIXNjcm9sbCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBTY3JvbGwgbGlzdCBkb3duICovCisJCQkJCWlmIChsaXN0X2hlaWdodCA+IDEpIHsKKwkJCQkJCS8qIERlLWhpZ2hsaWdodCBjdXJyZW50IGZpcnN0IGl0ZW0gKi8KKwkJCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbc2Nyb2xsICogMyArIDFdLAorCQkJCQkJCSAgIHN0YXR1c1tzY3JvbGxdLCAwLCBGQUxTRSk7CisJCQkJCQlzY3JvbGxvayhsaXN0LCBUUlVFKTsKKwkJCQkJCXdzY3JsKGxpc3QsIC0xKTsKKwkJCQkJCXNjcm9sbG9rKGxpc3QsIEZBTFNFKTsKKwkJCQkJfQorCQkJCQlzY3JvbGwtLTsKKwkJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1tzY3JvbGwgKiAzICsgMV0sIHN0YXR1c1tzY3JvbGxdLCAwLCBUUlVFKTsKKwkJCQkJcHJpbnRfYXJyb3dzKGRpYWxvZywgY2hvaWNlLCBpdGVtX25vLAorCQkJCQkJICAgICBzY3JvbGwsIGJveF95LCBib3hfeCArIGNoZWNrX3ggKyA1LCBsaXN0X2hlaWdodCk7CisKKwkJCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQkJCXdyZWZyZXNoKGxpc3QpOworCisJCQkJCWNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQkJCX0gZWxzZQorCQkJCQlpID0gY2hvaWNlIC0gMTsKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEtFWV9ET1dOIHx8IGtleSA9PSAnKycpIHsKKwkJCQlpZiAoY2hvaWNlID09IG1heF9jaG9pY2UgLSAxKSB7CisJCQkJCWlmIChzY3JvbGwgKyBjaG9pY2UgPj0gaXRlbV9ubyAtIDEpCisJCQkJCQljb250aW51ZTsKKwkJCQkJLyogU2Nyb2xsIGxpc3QgdXAgKi8KKwkJCQkJaWYgKGxpc3RfaGVpZ2h0ID4gMSkgeworCQkJCQkJLyogRGUtaGlnaGxpZ2h0IGN1cnJlbnQgbGFzdCBpdGVtIGJlZm9yZSBzY3JvbGxpbmcgdXAgKi8KKwkJCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbKHNjcm9sbCArIG1heF9jaG9pY2UgLSAxKSAqIDMgKyAxXSwKKwkJCQkJCQkgICBzdGF0dXNbc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDFdLAorCQkJCQkJCSAgIG1heF9jaG9pY2UgLSAxLCBGQUxTRSk7CisJCQkJCQlzY3JvbGxvayhsaXN0LCBUUlVFKTsKKwkJCQkJCXdzY3JsKGxpc3QsIDEpOworCQkJCQkJc2Nyb2xsb2sobGlzdCwgRkFMU0UpOworCQkJCQl9CisJCQkJCXNjcm9sbCsrOworCQkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBtYXhfY2hvaWNlIC0gMSkgKiAzICsgMV0sCisJCQkJCQkgICBzdGF0dXNbc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDFdLCBtYXhfY2hvaWNlIC0gMSwgVFJVRSk7CisKKwkJCQkJcHJpbnRfYXJyb3dzKGRpYWxvZywgY2hvaWNlLCBpdGVtX25vLAorCQkJCQkJICAgICBzY3JvbGwsIGJveF95LCBib3hfeCArIGNoZWNrX3ggKyA1LCBsaXN0X2hlaWdodCk7CisKKwkJCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQkJCXdyZWZyZXNoKGxpc3QpOworCisJCQkJCWNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQkJCX0gZWxzZQorCQkJCQlpID0gY2hvaWNlICsgMTsKKwkJCX0KKwkJCWlmIChpICE9IGNob2ljZSkgeworCQkJCS8qIERlLWhpZ2hsaWdodCBjdXJyZW50IGl0ZW0gKi8KKwkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMyArIDFdLAorCQkJCQkgICBzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSwgY2hvaWNlLCBGQUxTRSk7CisJCQkJLyogSGlnaGxpZ2h0IG5ldyBpdGVtICovCisJCQkJY2hvaWNlID0gaTsKKwkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMyArIDFdLAorCQkJCQkgICBzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSwgY2hvaWNlLCBUUlVFKTsKKwkJCQl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwkJCQl3cmVmcmVzaChsaXN0KTsKKwkJCX0KKwkJCWNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQl9CisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgJ0gnOgorCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzXSk7CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWZyZWUoc3RhdHVzKTsKKwkJCXJldHVybiAxOworCQljYXNlIFRBQjoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlidXR0b24gPSAoKGtleSA9PSBLRVlfTEVGVCA/IC0tYnV0dG9uIDogKytidXR0b24pIDwgMCkKKwkJCSAgICA/IDEgOiAoYnV0dG9uID4gMSA/IDAgOiBidXR0b24pOworCisJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgYnV0dG9uKTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCWNhc2UgJ3MnOgorCQljYXNlICcgJzoKKwkJY2FzZSAnXG4nOgorCQkJaWYgKCFidXR0b24pIHsKKwkJCQlpZiAoIXN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspCisJCQkJCQlzdGF0dXNbaV0gPSAwOworCQkJCQlzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSA9IDE7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspCisJCQkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDMgKyAxXSwKKwkJCQkJCQkgICBzdGF0dXNbc2Nyb2xsICsgaV0sIGksIGkgPT0gY2hvaWNlKTsKKwkJCQl9CisJCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQkJd3JlZnJlc2gobGlzdCk7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKQorCQkJCQlpZiAoc3RhdHVzW2ldKQorCQkJCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZW1zW2kgKiAzXSk7CisJCQl9IGVsc2UKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzXSk7CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWZyZWUoc3RhdHVzKTsKKwkJCXJldHVybiBidXR0b247CisJCWNhc2UgJ1gnOgorCQljYXNlICd4JzoKKwkJCWtleSA9IEVTQzsKKwkJY2FzZSBFU0M6CisJCQlicmVhazsKKwkJfQorCisJCS8qIE5vdywgdXBkYXRlIGV2ZXJ5dGhpbmcuLi4gKi8KKwkJZG91cGRhdGUoKTsKKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlmcmVlKHN0YXR1cyk7CisJcmV0dXJuIC0xOwkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jb2xvcnMuaCBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jb2xvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA3MWRmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NvbG9ycy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogIGNvbG9ycy5oIC0tIGNvbG9yIGF0dHJpYnV0ZSBkZWZpbml0aW9ucworICoKKyAqICBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogICBEZWZhdWx0IGNvbG9yIGRlZmluaXRpb25zCisgKgorICogICAqX0ZHID0gZm9yZWdyb3VuZAorICogICAqX0JHID0gYmFja2dyb3VuZAorICogICAqX0hMID0gaGlnaGxpZ2h0PworICovCisjZGVmaW5lIFNDUkVFTl9GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQ1lBTgorI2RlZmluZSBTQ1JFRU5fQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgU0NSRUVOX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgU0hBRE9XX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBTSEFET1dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIFNIQURPV19ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIERJQUxPR19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgRElBTE9HX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBESUFMT0dfSEwgICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgVElUTEVfRkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVElUTEVfQkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBUSVRMRV9ITCAgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBCT1JERVJfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJPUkRFUl9CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQk9SREVSX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0FDVElWRV9GRyAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCVVRUT05fQUNUSVZFX0JHICAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQlVUVE9OX0FDVElWRV9ITCAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0lOQUNUSVZFX0ZHICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBCVVRUT05fSU5BQ1RJVkVfQkcgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9JTkFDVElWRV9ITCAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBCVVRUT05fS0VZX0FDVElWRV9GRyAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9LRVlfQUNUSVZFX0JHICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBCVVRUT05fS0VZX0FDVElWRV9ITCAgICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fS0VZX0lOQUNUSVZFX0ZHICAgICAgIENPTE9SX1JFRAorI2RlZmluZSBCVVRUT05fS0VZX0lOQUNUSVZFX0JHICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9LRVlfSU5BQ1RJVkVfSEwgICAgICAgRkFMU0UKKworI2RlZmluZSBCVVRUT05fTEFCRUxfQUNUSVZFX0ZHICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBCVVRUT05fTEFCRUxfQUNUSVZFX0JHICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0FDVElWRV9ITCAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0ZHICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfQkcgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9ITCAgICAgVFJVRQorCisjZGVmaW5lIElOUFVUQk9YX0ZHICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgSU5QVVRCT1hfQkcgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBJTlBVVEJPWF9ITCAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgSU5QVVRCT1hfQk9SREVSX0ZHICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBJTlBVVEJPWF9CT1JERVJfQkcgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElOUFVUQk9YX0JPUkRFUl9ITCAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBTRUFSQ0hCT1hfRkcgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIFNFQVJDSEJPWF9CRyAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX0hMICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIFNFQVJDSEJPWF9USVRMRV9GRyAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFNFQVJDSEJPWF9USVRMRV9CRyAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX1RJVExFX0hMICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgU0VBUkNIQk9YX0JPUkRFUl9GRyAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfQk9SREVSX0JHICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFNFQVJDSEJPWF9CT1JERVJfSEwgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFBPU0lUSU9OX0lORElDQVRPUl9GRyAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFBPU0lUSU9OX0lORElDQVRPUl9CRyAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgUE9TSVRJT05fSU5ESUNBVE9SX0hMICAgICAgICBUUlVFCisKKyNkZWZpbmUgTUVOVUJPWF9GRyAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBNRU5VQk9YX0JHICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIE1FTlVCT1hfSEwgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBNRU5VQk9YX0JPUkRFUl9GRyAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIE1FTlVCT1hfQk9SREVSX0JHICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgTUVOVUJPWF9CT1JERVJfSEwgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgSVRFTV9GRyAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBJVEVNX0JHICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElURU1fSEwgICAgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBJVEVNX1NFTEVDVEVEX0ZHICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElURU1fU0VMRUNURURfQkcgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBJVEVNX1NFTEVDVEVEX0hMICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBUQUdfRkcgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUQUdfQkcgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFRBR19ITCAgICAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19TRUxFQ1RFRF9GRyAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19TRUxFQ1RFRF9CRyAgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBUQUdfU0VMRUNURURfSEwgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBUQUdfS0VZX0ZHICAgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUQUdfS0VZX0JHICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFRBR19LRVlfSEwgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19LRVlfU0VMRUNURURfRkcgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19LRVlfU0VMRUNURURfQkcgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBUQUdfS0VZX1NFTEVDVEVEX0hMICAgICAgICAgIFRSVUUKKworI2RlZmluZSBDSEVDS19GRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIENIRUNLX0JHICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQ0hFQ0tfSEwgICAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIENIRUNLX1NFTEVDVEVEX0ZHICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQ0hFQ0tfU0VMRUNURURfQkcgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIENIRUNLX1NFTEVDVEVEX0hMICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFVBUlJPV19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfR1JFRU4KKyNkZWZpbmUgVUFSUk9XX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBVQVJST1dfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBEQVJST1dfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0dSRUVOCisjZGVmaW5lIERBUlJPV19CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgREFSUk9XX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKy8qIEVuZCBvZiBkZWZhdWx0IGNvbG9yIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgQ19BVFRSKHgseSkgICAgICAgICAgICAgICAgICAoKHggPyBBX0JPTEQgOiAwKSB8IENPTE9SX1BBSVIoKHkpKSkKKyNkZWZpbmUgQ09MT1JfTkFNRV9MRU4gICAgICAgICAgICAgICAxMAorI2RlZmluZSBDT0xPUl9DT1VOVCAgICAgICAgICAgICAgICAgIDgKKworLyoKKyAqIEdsb2JhbCB2YXJpYWJsZXMKKyAqLworCitleHRlcm4gaW50IGNvbG9yX3RhYmxlW11bM107CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvZGlhbG9nLmggYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvZGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzY2Y3MQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9kaWFsb2cuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqICBkaWFsb2cuaCAtLSBjb21tb24gZGVjbGFyYXRpb25zIGZvciBhbGwgZGlhbG9nIG1vZHVsZXMKKyAqCisgKiAgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9fc3VuX18KKyNkZWZpbmUgQ1VSU19NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgQ1VSU0VTX0xPQworCisvKgorICogQ29sb3JzIGluIG5jdXJzZXMgMS45LjllIGRvIG5vdCB3b3JrIHByb3Blcmx5IHNpbmNlIGZvcmVncm91bmQgYW5kCisgKiBiYWNrZ3JvdW5kIGNvbG9ycyBhcmUgT1InZCByYXRoZXIgdGhhbiBzZXBhcmF0ZWx5IG1hc2tlZC4gIFRoaXMgdmVyc2lvbgorICogb2YgZGlhbG9nIHdhcyBoYWNrZWQgdG8gd29yayB3aXRoIG5jdXJzZXMgMS45LjllLCBtYWtpbmcgaXQgaW5jb21wYXRpYmxlCisgKiB3aXRoIHN0YW5kYXJkIGN1cnNlcy4gIFRoZSBzaW1wbGVzdCBmaXggKHRvIG1ha2UgdGhpcyB3b3JrIHdpdGggc3RhbmRhcmQKKyAqIGN1cnNlcykgdXNlcyB0aGUgd2JrZ2RzZXQoKSBmdW5jdGlvbiwgbm90IHVzZWQgaW4gdGhlIG9yaWdpbmFsIGhhY2suCisgKiBUdXJuIGl0IG9mZiBpZiB3ZSdyZSBidWlsZGluZyB3aXRoIDEuOS45ZSwgc2luY2UgaXQganVzdCBjb25mdXNlcyB0aGluZ3MuCisgKi8KKyNpZiBkZWZpbmVkKE5DVVJTRVNfVkVSU0lPTikgJiYgZGVmaW5lZChfTkVFRF9XUkFQKSAmJiAhZGVmaW5lZChHQ0NfUFJJTlRGTElLRSkKKyNkZWZpbmUgT0xEX05DVVJTRVMgMQorI3VuZGVmICB3YmtnZHNldAorI2RlZmluZSB3YmtnZHNldCh3LHApCQkvKm5vdGhpbmcgKi8KKyNlbHNlCisjZGVmaW5lIE9MRF9OQ1VSU0VTIDAKKyNlbmRpZgorCisjZGVmaW5lIFRSKHBhcmFtcykgX3RyYWNlZiBwYXJhbXMKKworI2RlZmluZSBFU0MgMjcKKyNkZWZpbmUgVEFCIDkKKyNkZWZpbmUgTUFYX0xFTiAyMDQ4CisjZGVmaW5lIEJVRl9TSVpFICgxMCoxMDI0KQorI2RlZmluZSBNSU4oeCx5KSAoeCA8IHkgPyB4IDogeSkKKyNkZWZpbmUgTUFYKHgseSkgKHggPiB5ID8geCA6IHkpCisKKyNpZm5kZWYgQUNTX1VMQ09STkVSCisjZGVmaW5lIEFDU19VTENPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfTExDT1JORVIKKyNkZWZpbmUgQUNTX0xMQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19VUkNPUk5FUgorI2RlZmluZSBBQ1NfVVJDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0xSQ09STkVSCisjZGVmaW5lIEFDU19MUkNPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfSExJTkUKKyNkZWZpbmUgQUNTX0hMSU5FICctJworI2VuZGlmCisjaWZuZGVmIEFDU19WTElORQorI2RlZmluZSBBQ1NfVkxJTkUgJ3wnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0xURUUKKyNkZWZpbmUgQUNTX0xURUUgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX1JURUUKKyNkZWZpbmUgQUNTX1JURUUgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX1VBUlJPVworI2RlZmluZSBBQ1NfVUFSUk9XICdeJworI2VuZGlmCisjaWZuZGVmIEFDU19EQVJST1cKKyNkZWZpbmUgQUNTX0RBUlJPVyAndicKKyNlbmRpZgorCisvKgorICogQXR0cmlidXRlIG5hbWVzCisgKi8KKyNkZWZpbmUgc2NyZWVuX2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1swXQorI2RlZmluZSBzaGFkb3dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzFdCisjZGVmaW5lIGRpYWxvZ19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMl0KKyNkZWZpbmUgdGl0bGVfYXR0ciAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1szXQorI2RlZmluZSBib3JkZXJfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzRdCisjZGVmaW5lIGJ1dHRvbl9hY3RpdmVfYXR0ciAgICAgICAgICAgIGF0dHJpYnV0ZXNbNV0KKyNkZWZpbmUgYnV0dG9uX2luYWN0aXZlX2F0dHIgICAgICAgICAgYXR0cmlidXRlc1s2XQorI2RlZmluZSBidXR0b25fa2V5X2FjdGl2ZV9hdHRyICAgICAgICBhdHRyaWJ1dGVzWzddCisjZGVmaW5lIGJ1dHRvbl9rZXlfaW5hY3RpdmVfYXR0ciAgICAgIGF0dHJpYnV0ZXNbOF0KKyNkZWZpbmUgYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyICAgICAgYXR0cmlidXRlc1s5XQorI2RlZmluZSBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0ciAgICBhdHRyaWJ1dGVzWzEwXQorI2RlZmluZSBpbnB1dGJveF9hdHRyICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzExXQorI2RlZmluZSBpbnB1dGJveF9ib3JkZXJfYXR0ciAgICAgICAgICBhdHRyaWJ1dGVzWzEyXQorI2RlZmluZSBzZWFyY2hib3hfYXR0ciAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzEzXQorI2RlZmluZSBzZWFyY2hib3hfdGl0bGVfYXR0ciAgICAgICAgICBhdHRyaWJ1dGVzWzE0XQorI2RlZmluZSBzZWFyY2hib3hfYm9yZGVyX2F0dHIgICAgICAgICBhdHRyaWJ1dGVzWzE1XQorI2RlZmluZSBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0ciAgICAgICBhdHRyaWJ1dGVzWzE2XQorI2RlZmluZSBtZW51Ym94X2F0dHIgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzE3XQorI2RlZmluZSBtZW51Ym94X2JvcmRlcl9hdHRyICAgICAgICAgICBhdHRyaWJ1dGVzWzE4XQorI2RlZmluZSBpdGVtX2F0dHIgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzE5XQorI2RlZmluZSBpdGVtX3NlbGVjdGVkX2F0dHIgICAgICAgICAgICBhdHRyaWJ1dGVzWzIwXQorI2RlZmluZSB0YWdfYXR0ciAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzIxXQorI2RlZmluZSB0YWdfc2VsZWN0ZWRfYXR0ciAgICAgICAgICAgICBhdHRyaWJ1dGVzWzIyXQorI2RlZmluZSB0YWdfa2V5X2F0dHIgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzIzXQorI2RlZmluZSB0YWdfa2V5X3NlbGVjdGVkX2F0dHIgICAgICAgICBhdHRyaWJ1dGVzWzI0XQorI2RlZmluZSBjaGVja19hdHRyICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzI1XQorI2RlZmluZSBjaGVja19zZWxlY3RlZF9hdHRyICAgICAgICAgICBhdHRyaWJ1dGVzWzI2XQorI2RlZmluZSB1YXJyb3dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzI3XQorI2RlZmluZSBkYXJyb3dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzI4XQorCisvKiBudW1iZXIgb2YgYXR0cmlidXRlcyAqLworI2RlZmluZSBBVFRSSUJVVEVfQ09VTlQgICAgICAgICAgICAgICAyOQorCisvKgorICogR2xvYmFsIHZhcmlhYmxlcworICovCitleHRlcm4gYm9vbCB1c2VfY29sb3JzOworZXh0ZXJuIGJvb2wgdXNlX3NoYWRvdzsKKworZXh0ZXJuIGNodHlwZSBhdHRyaWJ1dGVzW107CisKK2V4dGVybiBjb25zdCBjaGFyICpiYWNrdGl0bGU7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK2V4dGVybiB2b2lkIGNyZWF0ZV9yYyhjb25zdCBjaGFyICpmaWxlbmFtZSk7CitleHRlcm4gaW50IHBhcnNlX3JjKHZvaWQpOworCit2b2lkIGluaXRfZGlhbG9nKHZvaWQpOwordm9pZCBlbmRfZGlhbG9nKHZvaWQpOwordm9pZCBhdHRyX2NsZWFyKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYXR0cik7Cit2b2lkIGRpYWxvZ19jbGVhcih2b2lkKTsKK3ZvaWQgY29sb3Jfc2V0dXAodm9pZCk7Cit2b2lkIHByaW50X2F1dG93cmFwKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgd2lkdGgsIGludCB5LCBpbnQgeCk7Cit2b2lkIHByaW50X2J1dHRvbihXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgeSwgaW50IHgsIGludCBzZWxlY3RlZCk7Cit2b2lkIHByaW50X3RpdGxlKFdJTkRPVyAqZGlhbG9nLCBjb25zdCBjaGFyICp0aXRsZSwgaW50IHdpZHRoKTsKK3ZvaWQgZHJhd19ib3goV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCwgY2h0eXBlIGJveCwKKwkgICAgICBjaHR5cGUgYm9yZGVyKTsKK3ZvaWQgZHJhd19zaGFkb3coV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CisKK2ludCBmaXJzdF9hbHBoYShjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmV4ZW1wdCk7CitpbnQgZGlhbG9nX3llc25vKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitpbnQgZGlhbG9nX21zZ2JveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQkgIGludCB3aWR0aCwgaW50IHBhdXNlKTsKK2ludCBkaWFsb2dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKK2ludCBkaWFsb2dfbWVudShjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJCWludCBtZW51X2hlaWdodCwgY29uc3QgY2hhciAqY2hvaWNlLCBpbnQgaXRlbV9ubywKKwkJY29uc3QgY2hhciAqY29uc3QgKml0ZW1zKTsKK2ludCBkaWFsb2dfY2hlY2tsaXN0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCSAgICAgaW50IHdpZHRoLCBpbnQgbGlzdF9oZWlnaHQsIGludCBpdGVtX25vLAorCQkgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICppdGVtcyk7CitleHRlcm4gY2hhciBkaWFsb2dfaW5wdXRfcmVzdWx0W107CitpbnQgZGlhbG9nX2lucHV0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCSAgICBpbnQgd2lkdGgsIGNvbnN0IGNoYXIgKmluaXQpOworCisvKgorICogVGhpcyBpcyB0aGUgYmFzZSBmb3IgZmljdGl0aW91cyBrZXlzLCB3aGljaCBhY3RpdmF0ZQorICogdGhlIGJ1dHRvbnMuCisgKgorICogTW91c2UtZ2VuZXJhdGVkIGtleXMgYXJlIHRoZSBmb2xsb3dpbmc6CisgKiAgIC0tIHRoZSBmaXJzdCAzMiBhcmUgdXNlZCBhcyBudW1iZXJzLCBpbiBhZGRpdGlvbiB0byAnMCctJzknCisgKiAgIC0tIHRoZSBsb3dlcmNhc2UgYXJlIHVzZWQgdG8gc2lnbmFsIG1vdXNlLWVudGVyIGV2ZW50cyAoTV9FVkVOVCArICdvJykKKyAqICAgLS0gdXBwZXJjYXNlIGNoYXJzIGFyZSB1c2VkIHRvIGludm9rZSB0aGUgYnV0dG9uIChNX0VWRU5UICsgJ08nKQorICovCisjZGVmaW5lIE1fRVZFTlQgKEtFWV9NQVgrMSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9pbnB1dGJveC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2lucHV0Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NTAzNwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9pbnB1dGJveC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogIGlucHV0Ym94LmMgLS0gaW1wbGVtZW50cyB0aGUgaW5wdXQgYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK2NoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFtNQVhfTEVOICsgMV07CisKKy8qCisgKiAgUHJpbnQgdGhlIHRlcm1pbmF0aW9uIGJ1dHRvbnMKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYnV0dG9ucyhXSU5ET1cgKiBkaWFsb2csIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlbGVjdGVkKQoreworCWludCB4ID0gd2lkdGggLyAyIC0gMTE7CisJaW50IHkgPSBoZWlnaHQgLSAyOworCisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiAgT2sgICIsIHksIHgsIHNlbGVjdGVkID09IDApOworCXByaW50X2J1dHRvbihkaWFsb2csICIgSGVscCAiLCB5LCB4ICsgMTQsIHNlbGVjdGVkID09IDEpOworCisJd21vdmUoZGlhbG9nLCB5LCB4ICsgMSArIDE0ICogc2VsZWN0ZWQpOworCXdyZWZyZXNoKGRpYWxvZyk7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgZGlhbG9nIGJveCBmb3IgaW5wdXRpbmcgYSBzdHJpbmcKKyAqLworaW50IGRpYWxvZ19pbnB1dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluaXQpCit7CisJaW50IGksIHgsIHksIGJveF95LCBib3hfeCwgYm94X3dpZHRoOworCWludCBpbnB1dF94ID0gMCwgc2Nyb2xsID0gMCwga2V5ID0gMCwgYnV0dG9uID0gLTE7CisJY2hhciAqaW5zdHIgPSBkaWFsb2dfaW5wdXRfcmVzdWx0OworCVdJTkRPVyAqZGlhbG9nOworCisJLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisJeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKwl5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKwlkcmF3X3NoYWRvdyhzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisJZGlhbG9nID0gbmV3d2luKGhlaWdodCwgd2lkdGgsIHksIHgpOworCWtleXBhZChkaWFsb2csIFRSVUUpOworCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworCXdhdHRyc2V0KGRpYWxvZywgYm9yZGVyX2F0dHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwlwcmludF9hdXRvd3JhcChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAzKTsKKworCS8qIERyYXcgdGhlIGlucHV0IGZpZWxkIGJveCAqLworCWJveF93aWR0aCA9IHdpZHRoIC0gNjsKKwlnZXR5eChkaWFsb2csIHksIHgpOworCWJveF95ID0geSArIDI7CisJYm94X3ggPSAod2lkdGggLSBib3hfd2lkdGgpIC8gMjsKKwlkcmF3X2JveChkaWFsb2csIHkgKyAxLCBib3hfeCAtIDEsIDMsIGJveF93aWR0aCArIDIsIGJvcmRlcl9hdHRyLCBkaWFsb2dfYXR0cik7CisKKwlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKwkvKiBTZXQgdXAgdGhlIGluaXRpYWwgdmFsdWUgKi8KKwl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCk7CisJd2F0dHJzZXQoZGlhbG9nLCBpbnB1dGJveF9hdHRyKTsKKworCWlmICghaW5pdCkKKwkJaW5zdHJbMF0gPSAnXDAnOworCWVsc2UKKwkJc3RyY3B5KGluc3RyLCBpbml0KTsKKworCWlucHV0X3ggPSBzdHJsZW4oaW5zdHIpOworCisJaWYgKGlucHV0X3ggPj0gYm94X3dpZHRoKSB7CisJCXNjcm9sbCA9IGlucHV0X3ggLSBib3hfd2lkdGggKyAxOworCQlpbnB1dF94ID0gYm94X3dpZHRoIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8IGJveF93aWR0aCAtIDE7IGkrKykKKwkJCXdhZGRjaChkaWFsb2csIGluc3RyW3Njcm9sbCArIGldKTsKKwl9IGVsc2UgeworCQl3YWRkc3RyKGRpYWxvZywgaW5zdHIpOworCX0KKworCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisKKwl3cmVmcmVzaChkaWFsb2cpOworCisJd2hpbGUgKGtleSAhPSBFU0MpIHsKKwkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisKKwkJaWYgKGJ1dHRvbiA9PSAtMSkgewkvKiBJbnB1dCBib3ggc2VsZWN0ZWQgKi8KKwkJCXN3aXRjaCAoa2V5KSB7CisJCQljYXNlIFRBQjoKKwkJCWNhc2UgS0VZX1VQOgorCQkJY2FzZSBLRVlfRE9XTjoKKwkJCQlicmVhazsKKwkJCWNhc2UgS0VZX0xFRlQ6CisJCQkJY29udGludWU7CisJCQljYXNlIEtFWV9SSUdIVDoKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgS0VZX0JBQ0tTUEFDRToKKwkJCWNhc2UgMTI3OgorCQkJCWlmIChpbnB1dF94IHx8IHNjcm9sbCkgeworCQkJCQl3YXR0cnNldChkaWFsb2csIGlucHV0Ym94X2F0dHIpOworCQkJCQlpZiAoIWlucHV0X3gpIHsKKwkJCQkJCXNjcm9sbCA9IHNjcm9sbCA8IGJveF93aWR0aCAtIDEgPyAwIDogc2Nyb2xsIC0gKGJveF93aWR0aCAtIDEpOworCQkJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3gpOworCQkJCQkJZm9yIChpID0gMDsgaSA8IGJveF93aWR0aDsgaSsrKQorCQkJCQkJCXdhZGRjaChkaWFsb2csCisJCQkJCQkJICAgICAgIGluc3RyW3Njcm9sbCArIGlucHV0X3ggKyBpXSA/CisJCQkJCQkJICAgICAgIGluc3RyW3Njcm9sbCArIGlucHV0X3ggKyBpXSA6ICcgJyk7CisJCQkJCQlpbnB1dF94ID0gc3RybGVuKGluc3RyKSAtIHNjcm9sbDsKKwkJCQkJfSBlbHNlCisJCQkJCQlpbnB1dF94LS07CisJCQkJCWluc3RyW3Njcm9sbCArIGlucHV0X3hdID0gJ1wwJzsKKwkJCQkJbXZ3YWRkY2goZGlhbG9nLCBib3hfeSwgaW5wdXRfeCArIGJveF94LCAnICcpOworCQkJCQl3bW92ZShkaWFsb2csIGJveF95LCBpbnB1dF94ICsgYm94X3gpOworCQkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKGtleSA8IDB4MTAwICYmIGlzcHJpbnQoa2V5KSkgeworCQkJCQlpZiAoc2Nyb2xsICsgaW5wdXRfeCA8IE1BWF9MRU4pIHsKKwkJCQkJCXdhdHRyc2V0KGRpYWxvZywgaW5wdXRib3hfYXR0cik7CisJCQkJCQlpbnN0cltzY3JvbGwgKyBpbnB1dF94XSA9IGtleTsKKwkJCQkJCWluc3RyW3Njcm9sbCArIGlucHV0X3ggKyAxXSA9ICdcMCc7CisJCQkJCQlpZiAoaW5wdXRfeCA9PSBib3hfd2lkdGggLSAxKSB7CisJCQkJCQkJc2Nyb2xsKys7CisJCQkJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3gpOworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGggLSAxOyBpKyspCisJCQkJCQkJCXdhZGRjaChkaWFsb2csIGluc3RyIFtzY3JvbGwgKyBpXSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGlucHV0X3grKyArIGJveF94KTsKKwkJCQkJCQl3YWRkY2goZGlhbG9nLCBrZXkpOworCQkJCQkJfQorCQkJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlmbGFzaCgpOwkvKiBBbGFybSB1c2VyIGFib3V0IG92ZXJmbG93ICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlzd2l0Y2ggKGtleSkgeworCQljYXNlICdPJzoKKwkJY2FzZSAnbyc6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiAwOworCQljYXNlICdIJzoKKwkJY2FzZSAnaCc6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiAxOworCQljYXNlIEtFWV9VUDoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJCXN3aXRjaCAoYnV0dG9uKSB7CisJCQljYXNlIC0xOgorCQkJCWJ1dHRvbiA9IDE7CS8qIEluZGljYXRlcyAiQ2FuY2VsIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJYnV0dG9uID0gLTE7CS8qIEluZGljYXRlcyBpbnB1dCBib3ggaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3ggKyBpbnB1dF94KTsKKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWJ1dHRvbiA9IDA7CS8qIEluZGljYXRlcyAiT0siIGJ1dHRvbiBpcyBzZWxlY3RlZCAqLworCQkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRBQjoKKwkJY2FzZSBLRVlfRE9XTjoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlzd2l0Y2ggKGJ1dHRvbikgeworCQkJY2FzZSAtMToKKwkJCQlidXR0b24gPSAwOwkvKiBJbmRpY2F0ZXMgIk9LIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJYnV0dG9uID0gMTsJLyogSW5kaWNhdGVzICJDYW5jZWwiIGJ1dHRvbiBpcyBzZWxlY3RlZCAqLworCQkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlidXR0b24gPSAtMTsJLyogSW5kaWNhdGVzIGlucHV0IGJveCBpcyBzZWxlY3RlZCAqLworCQkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJCQl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCArIGlucHV0X3gpOworCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCWNhc2UgJ1xuJzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIChidXR0b24gPT0gLTEgPyAwIDogYnV0dG9uKTsKKwkJY2FzZSAnWCc6CisJCWNhc2UgJ3gnOgorCQkJa2V5ID0gRVNDOworCQljYXNlIEVTQzoKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJcmV0dXJuIC0xOwkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9seGRpYWxvZy5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2x4ZGlhbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmNmM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9seGRpYWxvZy5jCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogIGRpYWxvZyAtIERpc3BsYXkgc2ltcGxlIGRpYWxvZyBib3hlcyBmcm9tIHNoZWxsIHNjcmlwdHMKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIHZvaWQgVXNhZ2UoY29uc3QgY2hhciAqbmFtZSk7CisKK3R5cGVkZWYgaW50IChqdW1wZXJGbikgKGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgYXJnYywgY29uc3QgY2hhciAqY29uc3QgKmFyZ3YpOworCitzdHJ1Y3QgTW9kZSB7CisJY2hhciAqbmFtZTsKKwlpbnQgYXJnbWluLCBhcmdtYXgsIGFyZ21vZDsKKwlqdW1wZXJGbiAqanVtcGVyOworfTsKKworanVtcGVyRm4gal9tZW51LCBqX3JhZGlvbGlzdCwgal95ZXNubywgal90ZXh0Ym94LCBqX2lucHV0Ym94OworanVtcGVyRm4gal9tc2dib3gsIGpfaW5mb2JveDsKKworc3RhdGljIHN0cnVjdCBNb2RlIG1vZGVzW10gPSB7CisJeyItLW1lbnUiLCA5LCAwLCAzLCBqX21lbnV9LAorCXsiLS1yYWRpb2xpc3QiLCA5LCAwLCAzLCBqX3JhZGlvbGlzdH0sCisJeyItLXllc25vIiwgNSwgNSwgMSwgal95ZXNub30sCisJeyItLXRleHRib3giLCA1LCA1LCAxLCBqX3RleHRib3h9LAorCXsiLS1pbnB1dGJveCIsIDUsIDYsIDEsIGpfaW5wdXRib3h9LAorCXsiLS1tc2dib3giLCA1LCA1LCAxLCBqX21zZ2JveH0sCisJeyItLWluZm9ib3giLCA1LCA1LCAxLCBqX2luZm9ib3h9LAorCXtOVUxMLCAwLCAwLCAwLCBOVUxMfQorfTsKKworc3RhdGljIHN0cnVjdCBNb2RlICptb2RlUHRyOworCisjaWZkZWYgTE9DQUxFCisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmNvbnN0ICphcmd2KQoreworCWludCBvZmZzZXQgPSAwLCBvcHRfY2xlYXIgPSAwLCBlbmRfY29tbW9uX29wdHMgPSAwLCByZXR2YWw7CisJY29uc3QgY2hhciAqdGl0bGUgPSBOVUxMOworCisjaWZkZWYgTE9DQUxFCisJKHZvaWQpc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2VuZGlmCisKKyNpZmRlZiBUUkFDRQorCXRyYWNlKFRSQUNFX0NBTExTIHwgVFJBQ0VfVVBEQVRFKTsKKyNlbmRpZgorCWlmIChhcmdjIDwgMikgeworCQlVc2FnZShhcmd2WzBdKTsKKwkJZXhpdCgtMSk7CisJfQorCisJd2hpbGUgKG9mZnNldCA8IGFyZ2MgLSAxICYmICFlbmRfY29tbW9uX29wdHMpIHsJLyogQ29tbW9uIG9wdGlvbnMgKi8KKwkJaWYgKCFzdHJjbXAoYXJndltvZmZzZXQgKyAxXSwgIi0tdGl0bGUiKSkgeworCQkJaWYgKGFyZ2MgLSBvZmZzZXQgPCAzIHx8IHRpdGxlICE9IE5VTEwpIHsKKwkJCQlVc2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJdGl0bGUgPSBhcmd2W29mZnNldCArIDJdOworCQkJCW9mZnNldCArPSAyOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvZmZzZXQgKyAxXSwgIi0tYmFja3RpdGxlIikpIHsKKwkJCWlmIChiYWNrdGl0bGUgIT0gTlVMTCkgeworCQkJCVVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoLTEpOworCQkJfSBlbHNlIHsKKwkJCQliYWNrdGl0bGUgPSBhcmd2W29mZnNldCArIDJdOworCQkJCW9mZnNldCArPSAyOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltvZmZzZXQgKyAxXSwgIi0tY2xlYXIiKSkgeworCQkJaWYgKG9wdF9jbGVhcikgewkvKiBIZXksICItLWNsZWFyIiBjYW4ndCBhcHBlYXIgdHdpY2UhICovCisJCQkJVXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgtMSk7CisJCQl9IGVsc2UgaWYgKGFyZ2MgPT0gMikgewkvKiB3ZSBvbmx5IHdhbnQgdG8gY2xlYXIgdGhlIHNjcmVlbiAqLworCQkJCWluaXRfZGlhbG9nKCk7CisJCQkJcmVmcmVzaCgpOwkvKiBpbml0X2RpYWxvZygpIHdpbGwgY2xlYXIgdGhlIHNjcmVlbiBmb3IgdXMgKi8KKwkJCQllbmRfZGlhbG9nKCk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCW9wdF9jbGVhciA9IDE7CisJCQkJb2Zmc2V0Kys7CisJCQl9CisJCX0gZWxzZQkJLyogbm8gbW9yZSBjb21tb24gb3B0aW9ucyAqLworCQkJZW5kX2NvbW1vbl9vcHRzID0gMTsKKwl9CisKKwlpZiAoYXJnYyAtIDEgPT0gb2Zmc2V0KSB7CS8qIG5vIG1vcmUgb3B0aW9ucyAqLworCQlVc2FnZShhcmd2WzBdKTsKKwkJZXhpdCgtMSk7CisJfQorCS8qIHVzZSBhIHRhYmxlIHRvIGxvb2sgZm9yIHRoZSByZXF1ZXN0ZWQgbW9kZSwgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiAqLworCisJZm9yIChtb2RlUHRyID0gbW9kZXM7IG1vZGVQdHItPm5hbWU7IG1vZGVQdHIrKykJLyogbG9vayBmb3IgdGhlIG1vZGUgKi8KKwkJaWYgKCFzdHJjbXAoYXJndltvZmZzZXQgKyAxXSwgbW9kZVB0ci0+bmFtZSkpCisJCQlicmVhazsKKworCWlmICghbW9kZVB0ci0+bmFtZSkKKwkJVXNhZ2UoYXJndlswXSk7CisJaWYgKGFyZ2MgLSBvZmZzZXQgPCBtb2RlUHRyLT5hcmdtaW4pCisJCVVzYWdlKGFyZ3ZbMF0pOworCWlmIChtb2RlUHRyLT5hcmdtYXggJiYgYXJnYyAtIG9mZnNldCA+IG1vZGVQdHItPmFyZ21heCkKKwkJVXNhZ2UoYXJndlswXSk7CisKKwlpbml0X2RpYWxvZygpOworCXJldHZhbCA9ICgqKG1vZGVQdHItPmp1bXBlcikpICh0aXRsZSwgYXJnYyAtIG9mZnNldCwgYXJndiArIG9mZnNldCk7CisKKwlpZiAob3B0X2NsZWFyKSB7CS8qIGNsZWFyIHNjcmVlbiBiZWZvcmUgZXhpdCAqLworCQlhdHRyX2NsZWFyKHN0ZHNjciwgTElORVMsIENPTFMsIHNjcmVlbl9hdHRyKTsKKwkJcmVmcmVzaCgpOworCX0KKwllbmRfZGlhbG9nKCk7CisKKwlleGl0KHJldHZhbCk7Cit9CisKKy8qCisgKiBQcmludCBwcm9ncmFtIHVzYWdlCisgKi8KK3N0YXRpYyB2b2lkIFVzYWdlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJcCitcbmRpYWxvZywgYnkgU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykuXAorXG4gIHBhdGNoZWQgYnkgU3R1YXJ0IEhlcmJlcnQgKFMuSGVyYmVydEBzaGVmLmFjLnVrKVwKK1xuICBtb2RpZmllZC9ndXR0ZWQgZm9yIHVzZSBhcyBhIExpbnV4IGtlcm5lbCBjb25maWcgdG9vbCBieSBcCitcbiAgV2lsbGlhbSBSb2FkY2FwIChyb2FkY2Fwd0BjZncuY29tKVwKK1xuXAorXG4qIERpc3BsYXkgZGlhbG9nIGJveGVzIGZyb20gc2hlbGwgc2NyaXB0cyAqXAorXG5cCitcblVzYWdlOiAlcyAtLWNsZWFyXAorXG4gICAgICAgJXMgWy0tdGl0bGUgPHRpdGxlPl0gWy0tYmFja3RpdGxlIDxiYWNrdGl0bGU+XSAtLWNsZWFyIDxCb3ggb3B0aW9ucz5cCitcblwKK1xuQm94IG9wdGlvbnM6XAorXG5cCitcbiAgLS1tZW51ICAgICAgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gPG1lbnUgaGVpZ2h0PiA8dGFnMT4gPGl0ZW0xPi4uLlwKK1xuICAtLXJhZGlvbGlzdCA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPiA8bGlzdCBoZWlnaHQ+IDx0YWcxPiA8aXRlbTE+IDxzdGF0dXMxPi4uLlwKK1xuICAtLXRleHRib3ggICA8ZmlsZT4gPGhlaWdodD4gPHdpZHRoPlwKK1xuICAtLWlucHV0Ym94ICA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPiBbPGluaXQ+XVwKK1xuICAtLXllc25vICAgICA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPlwKK1xuIiwgbmFtZSwgbmFtZSk7CisJZXhpdCgtMSk7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHByb2dyYW0ganVtcGVycworICovCisKK2ludCBqX21lbnUoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJcmV0dXJuIGRpYWxvZ19tZW51KHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSksCisJCQkgICBhdG9pKGF2WzVdKSwgYXZbNl0sIChhYyAtIDYpIC8gMiwgYXYgKyA3KTsKK30KKworaW50IGpfcmFkaW9saXN0KGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCXJldHVybiBkaWFsb2dfY2hlY2tsaXN0KHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSksCisJCQkJYXRvaShhdls1XSksIChhYyAtIDYpIC8gMywgYXYgKyA2KTsKK30KKworaW50IGpfdGV4dGJveChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlyZXR1cm4gZGlhbG9nX3RleHRib3godCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSk7Cit9CisKK2ludCBqX3llc25vKGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCXJldHVybiBkaWFsb2dfeWVzbm8odCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSk7Cit9CisKK2ludCBqX2lucHV0Ym94KGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCWludCByZXQgPSBkaWFsb2dfaW5wdXRib3godCwgYXZbMl0sIGF0b2koYXZbM10pLCBhdG9pKGF2WzRdKSwKKwkJCQkgIGFjID09IDYgPyBhdls1XSA6IChjaGFyICopTlVMTCk7CisJaWYgKHJldCA9PSAwKQorCQlmcHJpbnRmKHN0ZGVyciwgZGlhbG9nX2lucHV0X3Jlc3VsdCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGpfbXNnYm94KGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCXJldHVybiBkaWFsb2dfbXNnYm94KHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSksIDEpOworfQorCitpbnQgal9pbmZvYm94KGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCXJldHVybiBkaWFsb2dfbXNnYm94KHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSksIDApOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21lbnVib3guYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tZW51Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkNTAxYgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tZW51Ym94LmMKQEAgLTAsMCArMSw0MjYgQEAKKy8qCisgKiAgbWVudWJveC5jIC0tIGltcGxlbWVudHMgdGhlIG1lbnUgYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2Fwd0BjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqICBDaGFuZ2VzIGJ5IENsaWZmb3JkIFdvbGYgKGdvZEBjbGlmZm9yZC5hdCkKKyAqCisgKiAgWyAxOTk4LTA2LTEzIF0KKyAqCisgKiAgICAqKSAgQSBidWdmaXggZm9yIHRoZSBQYWdlLURvd24gcHJvYmxlbQorICoKKyAqICAgICopICBGb3JtZXJseSB3aGVuIEkgdXNlZCBQYWdlIERvd24gYW5kIFBhZ2UgVXAsIHRoZSBjdXJzb3Igd291bGQgYmUgc2V0CisgKiAgICAgICAgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBtZW51IGJveC4gIE5vdyBseGRpYWxvZyBpcyBhIGJpdAorICogICAgICAgIHNtYXJ0ZXIgYW5kIHdvcmtzIG1vcmUgbGlrZSBvdGhlciBtZW51IHN5c3RlbXMgKGp1c3QgaGF2ZSBhIGxvb2sgYXQKKyAqICAgICAgICBpdCkuCisgKgorICogICAgKikgIEZvcm1lcmx5IGlmIEkgc2VsZWN0ZWQgc29tZXRoaW5nIG15IHNjcm9sbGluZyB3b3VsZCBiZSBicm9rZW4gYmVjYXVzZQorICogICAgICAgIGx4ZGlhbG9nIGlzIHJlLWludm9rZWQgYnkgdGhlIE1lbnVjb25maWcgc2hlbGwgc2NyaXB0LCBjYW4ndAorICogICAgICAgIHJlbWVtYmVyIHRoZSBsYXN0IHNjcm9sbGluZyBwb3NpdGlvbiwgYW5kIGp1c3Qgc2V0cyBpdCBzbyB0aGF0IHRoZQorICogICAgICAgIGN1cnNvciBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBib3guICBOb3cgaXQgd3JpdGVzIHRoZSB0ZW1wb3JhcnkgZmlsZQorICogICAgICAgIGx4ZGlhbG9nLnNjcmx0bXAgd2hpY2ggY29udGFpbnMgdGhpcyBpbmZvcm1hdGlvbi4gVGhlIGZpbGUgaXMKKyAqICAgICAgICBkZWxldGVkIGJ5IGx4ZGlhbG9nIGlmIHRoZSB1c2VyIGxlYXZlcyBhIHN1Ym1lbnUgb3IgZW50ZXJzIGEgbmV3CisgKiAgICAgICAgb25lLCBidXQgaXQgd291bGQgYmUgbmljZSBpZiBNZW51Y29uZmlnIGNvdWxkIG1ha2UgYW5vdGhlciAicm0gLWYiCisgKiAgICAgICAganVzdCB0byBiZSBzdXJlLiAgSnVzdCB0cnkgaXQgb3V0IC0geW91IHdpbGwgcmVjb2duaXNlIGEgZGlmZmVyZW5jZSEKKyAqCisgKiAgWyAxOTk4LTA2LTE0IF0KKyAqCisgKiAgICAqKSAgTm93IGx4ZGlhbG9nIGlzIGNyYXNoLXNhZmUgYWdhaW5zdCBicm9rZW4gImx4ZGlhbG9nLnNjcmx0bXAiIGZpbGVzCisgKiAgICAgICAgYW5kIG1lbnVzIGNoYW5nZSB0aGVpciBzaXplIG9uIHRoZSBmbHkuCisgKgorICogICAgKikgIElmIGZvciBzb21lIHJlYXNvbiB0aGUgbGFzdCBzY3JvbGxpbmcgcG9zaXRpb24gaXMgbm90IHNhdmVkIGJ5CisgKiAgICAgICAgbHhkaWFsb2csIGl0IHNldHMgdGhlIHNjcm9sbGluZyBzbyB0aGF0IHRoZSBzZWxlY3RlZCBpdGVtIGlzIGluIHRoZQorICogICAgICAgIG1pZGRsZSBvZiB0aGUgbWVudSBib3gsIG5vdCBhdCB0aGUgYm90dG9tLgorICoKKyAqIDAyIEphbnVhcnkgMTk5OSwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4gKG1lY0BzaG91dC5uZXQpCisgKiBSZXNldCAnc2Nyb2xsJyB0byAwIGlmIHRoZSB2YWx1ZSBmcm9tIGx4ZGlhbG9nLnNjcmx0bXAgaXMgYm9ndXMuCisgKiBUaGlzIGZpeGVzIGEgYnVnIGluIE1lbnVjb25maWcgd2hlcmUgdXNpbmcgJyAnIHRvIGRlc2NlbmQgaW50byBtZW51cworICogd291bGQgbGVhdmUgbWlzLXN5bmNocm9uaXplZCBseGRpYWxvZy5zY3JsdG1wIGZpbGVzIGx5aW5nIGFyb3VuZCwKKyAqIGZzY2FuZiB3b3VsZCByZWFkIGluICdzY3JvbGwnLCBhbmQgZXZlbnR1YWxseSB0aGF0IHZhbHVlIHdvdWxkIGdldCB1c2VkLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIGludCBtZW51X3dpZHRoLCBpdGVtX3g7CisKKy8qCisgKiBQcmludCBtZW51IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgZG9fcHJpbnRfaXRlbShXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKml0ZW0sIGludCBjaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWxlY3RlZCwgaW50IGhvdGtleSkKK3sKKwlpbnQgajsKKwljaGFyICptZW51X2l0ZW0gPSBtYWxsb2MobWVudV93aWR0aCArIDEpOworCisJc3RybmNweShtZW51X2l0ZW0sIGl0ZW0sIG1lbnVfd2lkdGggLSBpdGVtX3gpOworCW1lbnVfaXRlbVttZW51X3dpZHRoXSA9IDA7CisJaiA9IGZpcnN0X2FscGhhKG1lbnVfaXRlbSwgIll5Tm5NbUhoIik7CisKKwkvKiBDbGVhciAncmVzaWR1ZScgb2YgbGFzdCBpdGVtICovCisJd2F0dHJzZXQod2luLCBtZW51Ym94X2F0dHIpOworCXdtb3ZlKHdpbiwgY2hvaWNlLCAwKTsKKyNpZiBPTERfTkNVUlNFUworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBtZW51X3dpZHRoOyBpKyspCisJCQl3YWRkY2god2luLCAnICcpOworCX0KKyNlbHNlCisJd2NscnRvZW9sKHdpbik7CisjZW5kaWYKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gaXRlbV9zZWxlY3RlZF9hdHRyIDogaXRlbV9hdHRyKTsKKwltdndhZGRzdHIod2luLCBjaG9pY2UsIGl0ZW1feCwgbWVudV9pdGVtKTsKKwlpZiAoaG90a2V5KSB7CisJCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyB0YWdfa2V5X3NlbGVjdGVkX2F0dHIgOiB0YWdfa2V5X2F0dHIpOworCQltdndhZGRjaCh3aW4sIGNob2ljZSwgaXRlbV94ICsgaiwgbWVudV9pdGVtW2pdKTsKKwl9CisJaWYgKHNlbGVjdGVkKSB7CisJCXdtb3ZlKHdpbiwgY2hvaWNlLCBpdGVtX3ggKyAxKTsKKwl9CisJZnJlZShtZW51X2l0ZW0pOworCXdyZWZyZXNoKHdpbik7Cit9CisKKyNkZWZpbmUgcHJpbnRfaXRlbShpbmRleCwgY2hvaWNlLCBzZWxlY3RlZCkgXAorZG8ge1wKKwlpbnQgaG90a2V5ID0gKGl0ZW1zWyhpbmRleCkgKiAyXVswXSAhPSAnOicpOyBcCisJZG9fcHJpbnRfaXRlbShtZW51LCBpdGVtc1soaW5kZXgpICogMiArIDFdLCBjaG9pY2UsIHNlbGVjdGVkLCBob3RrZXkpOyBcCit9IHdoaWxlICgwKQorCisvKgorICogUHJpbnQgdGhlIHNjcm9sbCBpbmRpY2F0b3JzLgorICovCitzdGF0aWMgdm9pZCBwcmludF9hcnJvd3MoV0lORE9XICogd2luLCBpbnQgaXRlbV9ubywgaW50IHNjcm9sbCwgaW50IHksIGludCB4LAorCQkJIGludCBoZWlnaHQpCit7CisJaW50IGN1cl95LCBjdXJfeDsKKworCWdldHl4KHdpbiwgY3VyX3ksIGN1cl94KTsKKworCXdtb3ZlKHdpbiwgeSwgeCk7CisKKwlpZiAoc2Nyb2xsID4gMCkgeworCQl3YXR0cnNldCh3aW4sIHVhcnJvd19hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX1VBUlJPVyk7CisJCXdhZGRzdHIod2luLCAiKC0pIik7CisJfSBlbHNlIHsKKwkJd2F0dHJzZXQod2luLCBtZW51Ym94X2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCX0KKworCXkgPSB5ICsgaGVpZ2h0ICsgMTsKKwl3bW92ZSh3aW4sIHksIHgpOworCXdyZWZyZXNoKHdpbik7CisKKwlpZiAoKGhlaWdodCA8IGl0ZW1fbm8pICYmIChzY3JvbGwgKyBoZWlnaHQgPCBpdGVtX25vKSkgeworCQl3YXR0cnNldCh3aW4sIGRhcnJvd19hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0RBUlJPVyk7CisJCXdhZGRzdHIod2luLCAiKCspIik7CisJfSBlbHNlIHsKKwkJd2F0dHJzZXQod2luLCBtZW51Ym94X2JvcmRlcl9hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwl9CisKKwl3bW92ZSh3aW4sIGN1cl95LCBjdXJfeCk7CisJd3JlZnJlc2god2luKTsKK30KKworLyoKKyAqIERpc3BsYXkgdGhlIHRlcm1pbmF0aW9uIGJ1dHRvbnMuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J1dHRvbnMoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgeCA9IHdpZHRoIC8gMiAtIDE2OworCWludCB5ID0gaGVpZ2h0IC0gMjsKKworCXByaW50X2J1dHRvbih3aW4sICJTZWxlY3QiLCB5LCB4LCBzZWxlY3RlZCA9PSAwKTsKKwlwcmludF9idXR0b24od2luLCAiIEV4aXQgIiwgeSwgeCArIDEyLCBzZWxlY3RlZCA9PSAxKTsKKwlwcmludF9idXR0b24od2luLCAiIEhlbHAgIiwgeSwgeCArIDI0LCBzZWxlY3RlZCA9PSAyKTsKKworCXdtb3ZlKHdpbiwgeSwgeCArIDEgKyAxMiAqIHNlbGVjdGVkKTsKKwl3cmVmcmVzaCh3aW4pOworfQorCisvKiBzY3JvbGwgdXAgbiBsaW5lcyAobiBtYXkgYmUgbmVnYXRpdmUpICovCitzdGF0aWMgdm9pZCBkb19zY3JvbGwoV0lORE9XICp3aW4sIGludCAqc2Nyb2xsLCBpbnQgbikKK3sKKwkvKiBTY3JvbGwgbWVudSB1cCAqLworCXNjcm9sbG9rKHdpbiwgVFJVRSk7CisJd3Njcmwod2luLCBuKTsKKwlzY3JvbGxvayh3aW4sIEZBTFNFKTsKKwkqc2Nyb2xsID0gKnNjcm9sbCArIG47CisJd3JlZnJlc2god2luKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBtZW51IGZvciBjaG9vc2luZyBhbW9uZyBhIG51bWJlciBvZiBvcHRpb25zCisgKi8KK2ludCBkaWFsb2dfbWVudShjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJCWludCBtZW51X2hlaWdodCwgY29uc3QgY2hhciAqY3VycmVudCwgaW50IGl0ZW1fbm8sCisJCWNvbnN0IGNoYXIgKmNvbnN0ICppdGVtcykKK3sKKwlpbnQgaSwgaiwgeCwgeSwgYm94X3gsIGJveF95OworCWludCBrZXkgPSAwLCBidXR0b24gPSAwLCBzY3JvbGwgPSAwLCBjaG9pY2UgPSAwOworCWludCBmaXJzdF9pdGVtID0gIDAsIG1heF9jaG9pY2U7CisJV0lORE9XICpkaWFsb2csICptZW51OworCUZJTEUgKmY7CisKKwltYXhfY2hvaWNlID0gTUlOKG1lbnVfaGVpZ2h0LCBpdGVtX25vKTsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKwl3YXR0cnNldChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwltdndhZGRjaChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJCXdhZGRjaChkaWFsb2csIEFDU19ITElORSk7CisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJd2JrZ2RzZXQoZGlhbG9nLCBkaWFsb2dfYXR0ciAmIEFfQ09MT1IpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisJbWVudV93aWR0aCA9IHdpZHRoIC0gNjsKKwlib3hfeSA9IGhlaWdodCAtIG1lbnVfaGVpZ2h0IC0gNTsKKwlib3hfeCA9ICh3aWR0aCAtIG1lbnVfd2lkdGgpIC8gMiAtIDE7CisKKwkvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIG1lbnUgKi8KKwltZW51ID0gc3Vid2luKGRpYWxvZywgbWVudV9oZWlnaHQsIG1lbnVfd2lkdGgsCisJCSAgICAgIHkgKyBib3hfeSArIDEsIHggKyBib3hfeCArIDEpOworCWtleXBhZChtZW51LCBUUlVFKTsKKworCS8qIGRyYXcgYSBib3ggYXJvdW5kIHRoZSBtZW51IGl0ZW1zICovCisJZHJhd19ib3goZGlhbG9nLCBib3hfeSwgYm94X3gsIG1lbnVfaGVpZ2h0ICsgMiwgbWVudV93aWR0aCArIDIsCisJCSBtZW51Ym94X2JvcmRlcl9hdHRyLCBtZW51Ym94X2F0dHIpOworCisJaXRlbV94ID0gKG1lbnVfd2lkdGggLSA3MCkgLyAyOworCisJLyogU2V0IGNob2ljZSB0byBkZWZhdWx0IGl0ZW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKQorCQlpZiAoc3RyY21wKGN1cnJlbnQsIGl0ZW1zW2kgKiAyXSkgPT0gMCkKKwkJCWNob2ljZSA9IGk7CisKKwkvKiBnZXQgdGhlIHNjcm9sbCBpbmZvIGZyb20gdGhlIHRlbXAgZmlsZSAqLworCWlmICgoZiA9IGZvcGVuKCJseGRpYWxvZy5zY3JsdG1wIiwgInIiKSkgIT0gTlVMTCkgeworCQlpZiAoKGZzY2FuZihmLCAiJWRcbiIsICZzY3JvbGwpID09IDEpICYmIChzY3JvbGwgPD0gY2hvaWNlKSAmJgorCQkgICAgKHNjcm9sbCArIG1heF9jaG9pY2UgPiBjaG9pY2UpICYmIChzY3JvbGwgPj0gMCkgJiYKKwkJICAgIChzY3JvbGwgKyBtYXhfY2hvaWNlIDw9IGl0ZW1fbm8pKSB7CisJCQlmaXJzdF9pdGVtID0gc2Nyb2xsOworCQkJY2hvaWNlID0gY2hvaWNlIC0gc2Nyb2xsOworCQkJZmNsb3NlKGYpOworCQl9IGVsc2UgeworCQkJc2Nyb2xsID0gMDsKKwkJCXJlbW92ZSgibHhkaWFsb2cuc2NybHRtcCIpOworCQkJZmNsb3NlKGYpOworCQkJZiA9IE5VTEw7CisJCX0KKwl9CisJaWYgKChjaG9pY2UgPj0gbWF4X2Nob2ljZSkgfHwgKGYgPT0gTlVMTCAmJiBjaG9pY2UgPj0gbWF4X2Nob2ljZSAvIDIpKSB7CisJCWlmIChjaG9pY2UgPj0gaXRlbV9ubyAtIG1heF9jaG9pY2UgLyAyKQorCQkJc2Nyb2xsID0gZmlyc3RfaXRlbSA9IGl0ZW1fbm8gLSBtYXhfY2hvaWNlOworCQllbHNlCisJCQlzY3JvbGwgPSBmaXJzdF9pdGVtID0gY2hvaWNlIC0gbWF4X2Nob2ljZSAvIDI7CisJCWNob2ljZSA9IGNob2ljZSAtIHNjcm9sbDsKKwl9CisKKwkvKiBQcmludCB0aGUgbWVudSAqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspIHsKKwkJcHJpbnRfaXRlbShmaXJzdF9pdGVtICsgaSwgaSwgaSA9PSBjaG9pY2UpOworCX0KKworCXdub3V0cmVmcmVzaChtZW51KTsKKworCXByaW50X2Fycm93cyhkaWFsb2csIGl0ZW1fbm8sIHNjcm9sbCwKKwkJICAgICBib3hfeSwgYm94X3ggKyBpdGVtX3ggKyAxLCBtZW51X2hlaWdodCk7CisKKwlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJd21vdmUobWVudSwgY2hvaWNlLCBpdGVtX3ggKyAxKTsKKwl3cmVmcmVzaChtZW51KTsKKworCXdoaWxlIChrZXkgIT0gRVNDKSB7CisJCWtleSA9IHdnZXRjaChtZW51KTsKKworCQlpZiAoa2V5IDwgMjU2ICYmIGlzYWxwaGEoa2V5KSkKKwkJCWtleSA9IHRvbG93ZXIoa2V5KTsKKworCQlpZiAoc3RyY2hyKCJ5bm1oIiwga2V5KSkKKwkJCWkgPSBtYXhfY2hvaWNlOworCQllbHNlIHsKKwkJCWZvciAoaSA9IGNob2ljZSArIDE7IGkgPCBtYXhfY2hvaWNlOyBpKyspIHsKKwkJCQlqID0gZmlyc3RfYWxwaGEoaXRlbXNbKHNjcm9sbCArIGkpICogMiArIDFdLCAiWXlObk1tSGgiKTsKKwkJCQlpZiAoa2V5ID09IHRvbG93ZXIoaXRlbXNbKHNjcm9sbCArIGkpICogMiArIDFdW2pdKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaSA9PSBtYXhfY2hvaWNlKQorCQkJCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspIHsKKwkJCQkJaiA9IGZpcnN0X2FscGhhKGl0ZW1zIFsoc2Nyb2xsICsgaSkgKiAyICsgMV0sICJZeU5uTW1IaCIpOworCQkJCQlpZiAoa2V5ID09IHRvbG93ZXIoaXRlbXNbKHNjcm9sbCArIGkpICogMiArIDFdW2pdKSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCisJCWlmIChpIDwgbWF4X2Nob2ljZSB8fAorCQkgICAga2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gS0VZX0RPV04gfHwKKwkJICAgIGtleSA9PSAnLScgfHwga2V5ID09ICcrJyB8fAorCQkgICAga2V5ID09IEtFWV9QUEFHRSB8fCBrZXkgPT0gS0VZX05QQUdFKSB7CisJCQkvKiBSZW1vdmUgaGlnaGxpZ3Qgb2YgY3VycmVudCBpdGVtICovCisJCQlwcmludF9pdGVtKHNjcm9sbCArIGNob2ljZSwgY2hvaWNlLCBGQUxTRSk7CisKKwkJCWlmIChrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSAnLScpIHsKKwkJCQlpZiAoY2hvaWNlIDwgMiAmJiBzY3JvbGwpIHsKKwkJCQkJLyogU2Nyb2xsIG1lbnUgZG93biAqLworCQkJCQlkb19zY3JvbGwobWVudSwgJnNjcm9sbCwgLTEpOworCisJCQkJCXByaW50X2l0ZW0oc2Nyb2xsLCAwLCBGQUxTRSk7CisJCQkJfSBlbHNlCisJCQkJCWNob2ljZSA9IE1BWChjaG9pY2UgLSAxLCAwKTsKKworCQkJfSBlbHNlIGlmIChrZXkgPT0gS0VZX0RPV04gfHwga2V5ID09ICcrJykgeworCQkJCXByaW50X2l0ZW0oc2Nyb2xsK2Nob2ljZSwgY2hvaWNlLCBGQUxTRSk7CisKKwkJCQlpZiAoKGNob2ljZSA+IG1heF9jaG9pY2UgLSAzKSAmJgorCQkJCSAgICAoc2Nyb2xsICsgbWF4X2Nob2ljZSA8IGl0ZW1fbm8pKSB7CisJCQkJCS8qIFNjcm9sbCBtZW51IHVwICovCisJCQkJCWRvX3Njcm9sbChtZW51LCAmc2Nyb2xsLCAxKTsKKworCQkJCQlwcmludF9pdGVtKHNjcm9sbCttYXhfY2hvaWNlIC0gMSwKKwkJCQkJCSAgIG1heF9jaG9pY2UgLSAxLCBGQUxTRSk7CisJCQkJfSBlbHNlCisJCQkJCWNob2ljZSA9IE1JTihjaG9pY2UgKyAxLCBtYXhfY2hvaWNlIC0gMSk7CisKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEtFWV9QUEFHRSkgeworCQkJCXNjcm9sbG9rKG1lbnUsIFRSVUUpOworCQkJCWZvciAoaSA9IDA7IChpIDwgbWF4X2Nob2ljZSk7IGkrKykgeworCQkJCQlpZiAoc2Nyb2xsID4gMCkgeworCQkJCQkJZG9fc2Nyb2xsKG1lbnUsICZzY3JvbGwsIC0xKTsKKwkJCQkJCXByaW50X2l0ZW0oc2Nyb2xsLCAwLCBGQUxTRSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoY2hvaWNlID4gMCkKKwkJCQkJCQljaG9pY2UtLTsKKwkJCQkJfQorCQkJCX0KKworCQkJfSBlbHNlIGlmIChrZXkgPT0gS0VZX05QQUdFKSB7CisJCQkJZm9yIChpID0gMDsgKGkgPCBtYXhfY2hvaWNlKTsgaSsrKSB7CisJCQkJCWlmIChzY3JvbGwgKyBtYXhfY2hvaWNlIDwgaXRlbV9ubykgeworCQkJCQkJZG9fc2Nyb2xsKG1lbnUsICZzY3JvbGwsIDEpOworCQkJCQkJcHJpbnRfaXRlbShzY3JvbGwrbWF4X2Nob2ljZS0xLAorCQkJCQkJCSAgIG1heF9jaG9pY2UgLSAxLCBGQUxTRSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoY2hvaWNlICsgMSA8IG1heF9jaG9pY2UpCisJCQkJCQkJY2hvaWNlKys7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UKKwkJCQljaG9pY2UgPSBpOworCisJCQlwcmludF9pdGVtKHNjcm9sbCArIGNob2ljZSwgY2hvaWNlLCBUUlVFKTsKKworCQkJcHJpbnRfYXJyb3dzKGRpYWxvZywgaXRlbV9ubywgc2Nyb2xsLAorCQkJCSAgICAgYm94X3ksIGJveF94ICsgaXRlbV94ICsgMSwgbWVudV9oZWlnaHQpOworCisJCQl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwkJCXdyZWZyZXNoKG1lbnUpOworCisJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJfQorCisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgS0VZX0xFRlQ6CisJCWNhc2UgVEFCOgorCQljYXNlIEtFWV9SSUdIVDoKKwkJCWJ1dHRvbiA9ICgoa2V5ID09IEtFWV9MRUZUID8gLS1idXR0b24gOiArK2J1dHRvbikgPCAwKQorCQkJICAgID8gMiA6IChidXR0b24gPiAyID8gMCA6IGJ1dHRvbik7CisKKwkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCQkJd3JlZnJlc2gobWVudSk7CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCWNhc2UgJ3MnOgorCQljYXNlICd5JzoKKwkJY2FzZSAnbic6CisJCWNhc2UgJ20nOgorCQljYXNlICcvJzoKKwkJCS8qIHNhdmUgc2Nyb2xsIGluZm8gKi8KKwkJCWlmICgoZiA9IGZvcGVuKCJseGRpYWxvZy5zY3JsdG1wIiwgInciKSkgIT0gTlVMTCkgeworCQkJCWZwcmludGYoZiwgIiVkXG4iLCBzY3JvbGwpOworCQkJCWZjbG9zZShmKTsKKwkJCX0KKwkJCWRlbHdpbihkaWFsb2cpOworCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAyXSk7CisJCQlzd2l0Y2ggKGtleSkgeworCQkJY2FzZSAncyc6CisJCQkJcmV0dXJuIDM7CisJCQljYXNlICd5JzoKKwkJCQlyZXR1cm4gMzsKKwkJCWNhc2UgJ24nOgorCQkJCXJldHVybiA0OworCQkJY2FzZSAnbSc6CisJCQkJcmV0dXJuIDU7CisJCQljYXNlICcgJzoKKwkJCQlyZXR1cm4gNjsKKwkJCWNhc2UgJy8nOgorCQkJCXJldHVybiA3OworCQkJfQorCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCWJ1dHRvbiA9IDI7CisJCWNhc2UgJ1xuJzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJaWYgKGJ1dHRvbiA9PSAyKQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgXCIlc1wiXG4iLAorCQkJCQlpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDJdLAorCQkJCQlpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDIgKyAxXSArCisJCQkJCWZpcnN0X2FscGhhKGl0ZW1zIFsoc2Nyb2xsICsgY2hvaWNlKSAqIDIgKyAxXSwgIiIpKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLAorCQkJCQlpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDJdKTsKKworCQkJcmVtb3ZlKCJseGRpYWxvZy5zY3JsdG1wIik7CisJCQlyZXR1cm4gYnV0dG9uOworCQljYXNlICdlJzoKKwkJY2FzZSAneCc6CisJCQlrZXkgPSBFU0M7CisJCWNhc2UgRVNDOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlyZW1vdmUoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKwlyZXR1cm4gLTE7CQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21zZ2JveC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21zZ2JveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjNmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbXNnYm94LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICBtc2dib3guYyAtLSBpbXBsZW1lbnRzIHRoZSBtZXNzYWdlIGJveCBhbmQgaW5mbyBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXB3QGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKKy8qCisgKiBEaXNwbGF5IGEgbWVzc2FnZSBib3guIFByb2dyYW0gd2lsbCBwYXVzZSBhbmQgZGlzcGxheSBhbiAiT0siIGJ1dHRvbgorICogaWYgdGhlIHBhcmFtZXRlciAncGF1c2UnIGlzIG5vbi16ZXJvLgorICovCitpbnQgZGlhbG9nX21zZ2JveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQgcGF1c2UpCit7CisJaW50IGksIHgsIHksIGtleSA9IDA7CisJV0lORE9XICpkaWFsb2c7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwlwcmludF9hdXRvd3JhcChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAyKTsKKworCWlmIChwYXVzZSkgeworCQl3YXR0cnNldChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwkJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJCXdhZGRjaChkaWFsb2csIEFDU19ITElORSk7CisJCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCQl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwkJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiAgT2sgICIsIGhlaWdodCAtIDIsIHdpZHRoIC8gMiAtIDQsIFRSVUUpOworCisJCXdyZWZyZXNoKGRpYWxvZyk7CisJCXdoaWxlIChrZXkgIT0gRVNDICYmIGtleSAhPSAnXG4nICYmIGtleSAhPSAnICcgJiYKKwkJICAgICAgIGtleSAhPSAnTycgJiYga2V5ICE9ICdvJyAmJiBrZXkgIT0gJ1gnICYmIGtleSAhPSAneCcpCisJCQlrZXkgPSB3Z2V0Y2goZGlhbG9nKTsKKwl9IGVsc2UgeworCQlrZXkgPSAnXG4nOworCQl3cmVmcmVzaChkaWFsb2cpOworCX0KKworCWRlbHdpbihkaWFsb2cpOworCXJldHVybiBrZXkgPT0gRVNDID8gLTEgOiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0YWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiAgdGV4dGJveC5jIC0tIGltcGxlbWVudHMgdGhlIHRleHQgYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0YXRpYyB2b2lkIGJhY2tfbGluZXMoaW50IG4pOworc3RhdGljIHZvaWQgcHJpbnRfcGFnZShXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitzdGF0aWMgdm9pZCBwcmludF9saW5lKFdJTkRPVyAqIHdpbiwgaW50IHJvdywgaW50IHdpZHRoKTsKK3N0YXRpYyBjaGFyICpnZXRfbGluZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHByaW50X3Bvc2l0aW9uKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKKworc3RhdGljIGludCBoc2Nyb2xsLCBmZCwgZmlsZV9zaXplLCBieXRlc19yZWFkOworc3RhdGljIGludCBiZWdpbl9yZWFjaGVkID0gMSwgZW5kX3JlYWNoZWQsIHBhZ2VfbGVuZ3RoOworc3RhdGljIGNoYXIgKmJ1ZiwgKnBhZ2U7CisKKy8qCisgKiBEaXNwbGF5IHRleHQgZnJvbSBhIGZpbGUgaW4gYSBkaWFsb2cgYm94LgorICovCitpbnQgZGlhbG9nX3RleHRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgaSwgeCwgeSwgY3VyX3gsIGN1cl95LCBmcG9zLCBrZXkgPSAwOworCWludCBwYXNzZWRfZW5kOworCVdJTkRPVyAqZGlhbG9nLCAqdGV4dDsKKworCS8qIE9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZyAqLworCWlmICgoZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKSkgPT0gLTEpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5DYW4ndCBvcGVuIGlucHV0IGZpbGUgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJLyogR2V0IGZpbGUgc2l6ZS4gQWN0dWFsbHksICdmaWxlX3NpemUnIGlzIHRoZSByZWFsIGZpbGUgc2l6ZSAtIDEsCisJICAgc2luY2UgaXQncyBvbmx5IHRoZSBsYXN0IGJ5dGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyAqLworCWlmICgoZmlsZV9zaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKSkgPT0gLTEpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBnZXR0aW5nIGZpbGUgc2l6ZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKwkvKiBSZXN0b3JlIGZpbGUgcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgZmlsZSBhZnRlciBnZXR0aW5nIGZpbGUgc2l6ZSAqLworCWlmIChsc2VlayhmZCwgMCwgU0VFS19TRVQpID09IC0xKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcmVhZCBidWZmZXIgKi8KKwlpZiAoKGJ1ZiA9IG1hbGxvYyhCVUZfU0laRSArIDEpKSA9PSBOVUxMKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCWlmICgoYnl0ZXNfcmVhZCA9IHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKwlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOwkvKiBtYXJrIGVuZCBvZiB2YWxpZCBkYXRhICovCisJcGFnZSA9IGJ1ZjsJCS8qIHBhZ2UgaXMgcG9pbnRlciB0byBzdGFydCBvZiBwYWdlIHRvIGJlIGRpc3BsYXllZCAqLworCisJLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisJeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKwl5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKwlkcmF3X3NoYWRvdyhzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisJZGlhbG9nID0gbmV3d2luKGhlaWdodCwgd2lkdGgsIHksIHgpOworCWtleXBhZChkaWFsb2csIFRSVUUpOworCisJLyogQ3JlYXRlIHdpbmRvdyBmb3IgdGV4dCByZWdpb24sIHVzZWQgZm9yIHNjcm9sbGluZyB0ZXh0ICovCisJdGV4dCA9IHN1YndpbihkaWFsb2csIGhlaWdodCAtIDQsIHdpZHRoIC0gMiwgeSArIDEsIHggKyAxKTsKKwl3YXR0cnNldCh0ZXh0LCBkaWFsb2dfYXR0cik7CisJd2JrZ2RzZXQodGV4dCwgZGlhbG9nX2F0dHIgJiBBX0NPTE9SKTsKKworCWtleXBhZCh0ZXh0LCBUUlVFKTsKKworCS8qIHJlZ2lzdGVyIHRoZSBuZXcgd2luZG93LCBhbG9uZyB3aXRoIGl0cyBib3JkZXJzICovCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworCisJd2F0dHJzZXQoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXdia2dkc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIgJiBBX0NPTE9SKTsKKwl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwlwcmludF9idXR0b24oZGlhbG9nLCAiIEV4aXQgIiwgaGVpZ2h0IC0gMiwgd2lkdGggLyAyIC0gNCwgVFJVRSk7CisJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJZ2V0eXgoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBTYXZlIGN1cnNvciBwb3NpdGlvbiAqLworCisJLyogUHJpbnQgZmlyc3QgcGFnZSBvZiB0ZXh0ICovCisJYXR0cl9jbGVhcih0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIsIGRpYWxvZ19hdHRyKTsKKwlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJd3JlZnJlc2goZGlhbG9nKTsKKworCXdoaWxlICgoa2V5ICE9IEVTQykgJiYgKGtleSAhPSAnXG4nKSkgeworCQlrZXkgPSB3Z2V0Y2goZGlhbG9nKTsKKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAnRSc6CS8qIEV4aXQgKi8KKwkJY2FzZSAnZSc6CisJCWNhc2UgJ1gnOgorCQljYXNlICd4JzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJZnJlZShidWYpOworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2cnOgkvKiBGaXJzdCBwYWdlICovCisJCWNhc2UgS0VZX0hPTUU6CisJCQlpZiAoIWJlZ2luX3JlYWNoZWQpIHsKKwkJCQliZWdpbl9yZWFjaGVkID0gMTsKKwkJCQkvKiBGaXJzdCBwYWdlIG5vdCBpbiBidWZmZXI/ICovCisJCQkJaWYgKChmcG9zID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJCQkJZW5kd2luKCk7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWlmIChmcG9zID4gYnl0ZXNfcmVhZCkgewkvKiBZZXMsIHdlIGhhdmUgdG8gcmVhZCBpdCBpbiAqLworCQkJCQlpZiAobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQkJCQkJZW5kd2luKCk7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkJCQkJICAgICAgICAiZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkJCQkJZXhpdCgtMSk7CisJCQkJCX0KKwkJCQkJaWYgKChieXRlc19yZWFkID0KKwkJCQkJICAgICByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJCQkJCWVuZHdpbigpOworCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQkJCQlleGl0KC0xKTsKKwkJCQkJfQorCQkJCQlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQkJCX0KKwkJCQlwYWdlID0gYnVmOworCQkJCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJCQlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0cnOgkvKiBMYXN0IHBhZ2UgKi8KKwkJY2FzZSBLRVlfRU5EOgorCisJCQllbmRfcmVhY2hlZCA9IDE7CisJCQkvKiBMYXN0IHBhZ2Ugbm90IGluIGJ1ZmZlcj8gKi8KKwkJCWlmICgoZnBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCQkJZW5kd2luKCk7CisJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQkJaWYgKGZwb3MgPCBmaWxlX3NpemUpIHsJLyogWWVzLCB3ZSBoYXZlIHRvIHJlYWQgaXQgaW4gKi8KKwkJCQlpZiAobHNlZWsoZmQsIC1CVUZfU0laRSwgU0VFS19FTkQpID09IC0xKSB7CisJCQkJCWVuZHdpbigpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlpZiAoKGJ5dGVzX3JlYWQgPQorCQkJCSAgICAgcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQkJCWVuZHdpbigpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCQkJZXhpdCgtMSk7CisJCQkJfQorCQkJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCQl9CisJCQlwYWdlID0gYnVmICsgYnl0ZXNfcmVhZDsKKwkJCWJhY2tfbGluZXMoaGVpZ2h0IC0gNCk7CisJCQlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCQlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlICdLJzoJLyogUHJldmlvdXMgbGluZSAqLworCQljYXNlICdrJzoKKwkJY2FzZSBLRVlfVVA6CisJCQlpZiAoIWJlZ2luX3JlYWNoZWQpIHsKKwkJCQliYWNrX2xpbmVzKHBhZ2VfbGVuZ3RoICsgMSk7CisKKwkJCQkvKiBXZSBkb24ndCBjYWxsIHByaW50X3BhZ2UoKSBoZXJlIGJ1dCB1c2Ugc2Nyb2xsaW5nIHRvIGVuc3VyZQorCQkJCSAgIGZhc3RlciBzY3JlZW4gdXBkYXRlLiBIb3dldmVyLCAnZW5kX3JlYWNoZWQnIGFuZAorCQkJCSAgICdwYWdlX2xlbmd0aCcgc2hvdWxkIHN0aWxsIGJlIHVwZGF0ZWQsIGFuZCAncGFnZScgc2hvdWxkCisJCQkJICAgcG9pbnQgdG8gc3RhcnQgb2YgbmV4dCBwYWdlLiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZworCQkJCSAgIGdldF9saW5lKCkgaW4gdGhlIGZvbGxvd2luZyAnZm9yJyBsb29wLiAqLworCQkJCXNjcm9sbG9rKHRleHQsIFRSVUUpOworCQkJCXdzY3JsKHRleHQsIC0xKTsJLyogU2Nyb2xsIHRleHQgcmVnaW9uIGRvd24gb25lIGxpbmUgKi8KKwkJCQlzY3JvbGxvayh0ZXh0LCBGQUxTRSk7CisJCQkJcGFnZV9sZW5ndGggPSAwOworCQkJCXBhc3NlZF9lbmQgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQgLSA0OyBpKyspIHsKKwkJCQkJaWYgKCFpKSB7CisJCQkJCQkvKiBwcmludCBmaXJzdCBsaW5lIG9mIHBhZ2UgKi8KKwkJCQkJCXByaW50X2xpbmUodGV4dCwgMCwgd2lkdGggLSAyKTsKKwkJCQkJCXdub3V0cmVmcmVzaCh0ZXh0KTsKKwkJCQkJfSBlbHNlCisJCQkJCQkvKiBDYWxsZWQgdG8gdXBkYXRlICdlbmRfcmVhY2hlZCcgYW5kICdwYWdlJyAqLworCQkJCQkJZ2V0X2xpbmUoKTsKKwkJCQkJaWYgKCFwYXNzZWRfZW5kKQorCQkJCQkJcGFnZV9sZW5ndGgrKzsKKwkJCQkJaWYgKGVuZF9yZWFjaGVkICYmICFwYXNzZWRfZW5kKQorCQkJCQkJcGFzc2VkX2VuZCA9IDE7CisJCQkJfQorCisJCQkJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdCJzoJLyogUHJldmlvdXMgcGFnZSAqLworCQljYXNlICdiJzoKKwkJY2FzZSBLRVlfUFBBR0U6CisJCQlpZiAoYmVnaW5fcmVhY2hlZCkKKwkJCQlicmVhazsKKwkJCWJhY2tfbGluZXMocGFnZV9sZW5ndGggKyBoZWlnaHQgLSA0KTsKKwkJCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJ0onOgkvKiBOZXh0IGxpbmUgKi8KKwkJY2FzZSAnaic6CisJCWNhc2UgS0VZX0RPV046CisJCQlpZiAoIWVuZF9yZWFjaGVkKSB7CisJCQkJYmVnaW5fcmVhY2hlZCA9IDA7CisJCQkJc2Nyb2xsb2sodGV4dCwgVFJVRSk7CisJCQkJc2Nyb2xsKHRleHQpOwkvKiBTY3JvbGwgdGV4dCByZWdpb24gdXAgb25lIGxpbmUgKi8KKwkJCQlzY3JvbGxvayh0ZXh0LCBGQUxTRSk7CisJCQkJcHJpbnRfbGluZSh0ZXh0LCBoZWlnaHQgLSA1LCB3aWR0aCAtIDIpOworCQkJCXdub3V0cmVmcmVzaCh0ZXh0KTsKKwkJCQlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgS0VZX05QQUdFOgkvKiBOZXh0IHBhZ2UgKi8KKwkJY2FzZSAnICc6CisJCQlpZiAoZW5kX3JlYWNoZWQpCisJCQkJYnJlYWs7CisKKwkJCWJlZ2luX3JlYWNoZWQgPSAwOworCQkJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCQkJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnMCc6CS8qIEJlZ2lubmluZyBvZiBsaW5lICovCisJCWNhc2UgJ0gnOgkvKiBTY3JvbGwgbGVmdCAqLworCQljYXNlICdoJzoKKwkJY2FzZSBLRVlfTEVGVDoKKwkJCWlmIChoc2Nyb2xsIDw9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChrZXkgPT0gJzAnKQorCQkJCWhzY3JvbGwgPSAwOworCQkJZWxzZQorCQkJCWhzY3JvbGwtLTsKKwkJCS8qIFJlcHJpbnQgY3VycmVudCBwYWdlIHRvIHNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwkJCWJhY2tfbGluZXMocGFnZV9sZW5ndGgpOworCQkJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlICdMJzoJLyogU2Nyb2xsIHJpZ2h0ICovCisJCWNhc2UgJ2wnOgorCQljYXNlIEtFWV9SSUdIVDoKKwkJCWlmIChoc2Nyb2xsID49IE1BWF9MRU4pCisJCQkJYnJlYWs7CisJCQloc2Nyb2xsKys7CisJCQkvKiBSZXByaW50IGN1cnJlbnQgcGFnZSB0byBzY3JvbGwgaG9yaXpvbnRhbGx5ICovCisJCQliYWNrX2xpbmVzKHBhZ2VfbGVuZ3RoKTsKKwkJCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSBFU0M6CisJCQlicmVhazsKKwkJfQorCX0KKworCWRlbHdpbihkaWFsb2cpOworCWZyZWUoYnVmKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIC0xOwkJLyogRVNDIHByZXNzZWQgKi8KK30KKworLyoKKyAqIEdvIGJhY2sgJ24nIGxpbmVzIGluIHRleHQgZmlsZS4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkuCisgKiAncGFnZScgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBkZXNpcmVkIGxpbmUgaW4gJ2J1ZicuCisgKi8KK3N0YXRpYyB2b2lkIGJhY2tfbGluZXMoaW50IG4pCit7CisJaW50IGksIGZwb3M7CisKKwliZWdpbl9yZWFjaGVkID0gMDsKKwkvKiBXZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZW5kX3JlYWNoZWQgYW5kICFlbmRfcmVhY2hlZAorCSAgIHNpbmNlIGF0IGVuZCBvZiBmaWxlLCB0aGUgbGluZSBpcyBub3QgZW5kZWQgYnkgYSAnXG4nLgorCSAgIFRoZSBjb2RlIGluc2lkZSAnaWYnIGJhc2ljYWxseSBkb2VzIGEgJy0tcGFnZScgdG8gbW92ZSBvbmUKKwkgICBjaGFyYWN0ZXIgYmFja3dhcmQgc28gYXMgdG8gc2tpcCAnXG4nIG9mIHRoZSBwcmV2aW91cyBsaW5lICovCisJaWYgKCFlbmRfcmVhY2hlZCkgeworCQkvKiBFaXRoZXIgYmVnaW5uaW5nIG9mIGJ1ZmZlciBvciBiZWdpbm5pbmcgb2YgZmlsZSByZWFjaGVkPyAqLworCQlpZiAocGFnZSA9PSBidWYpIHsKKwkJCWlmICgoZnBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCQkJZW5kd2luKCk7CisJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gIgorCQkJCQkgICAgICAgICJiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCWlmIChmcG9zID4gYnl0ZXNfcmVhZCkgewkvKiBOb3QgYmVnaW5uaW5nIG9mIGZpbGUgeWV0ICovCisJCQkJLyogV2UndmUgcmVhY2hlZCBiZWdpbm5pbmcgb2YgYnVmZmVyLCBidXQgbm90IGJlZ2lubmluZyBvZgorCQkJCSAgIGZpbGUgeWV0LCBzbyByZWFkIHByZXZpb3VzIHBhcnQgb2YgZmlsZSBpbnRvIGJ1ZmZlci4KKwkJCQkgICBOb3RlIHRoYXQgd2Ugb25seSBtb3ZlIGJhY2t3YXJkIGZvciBCVUZfU0laRS8yIGJ5dGVzLAorCQkJCSAgIGJ1dCBub3QgQlVGX1NJWkUgYnl0ZXMgdG8gYXZvaWQgcmUtcmVhZGluZyBhZ2FpbiBpbgorCQkJCSAgIHByaW50X3BhZ2UoKSBsYXRlciAqLworCQkJCS8qIFJlYWxseSBwb3NzaWJsZSB0byBtb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXM/ICovCisJCQkJaWYgKGZwb3MgPCBCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSB7CisJCQkJCS8qIE5vLCBtb3ZlIGxlc3MgdGhlbiAqLworCQkJCQlpZiAobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQkJCQkJZW5kd2luKCk7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkJCQkgICAgICAgICAgICAgICAgImJhY2tfbGluZXMoKS5cbiIpOworCQkJCQkJZXhpdCgtMSk7CisJCQkJCX0KKwkJCQkJcGFnZSA9IGJ1ZiArIGZwb3MgLSBieXRlc19yZWFkOworCQkJCX0gZWxzZSB7CS8qIE1vdmUgYmFja3dhcmQgQlVGX1NJWkUvMiBieXRlcyAqLworCQkJCQlpZiAobHNlZWsgKGZkLCAtKEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpLCBTRUVLX0NVUikgPT0gLTEpIHsKKwkJCQkJCWVuZHdpbigpOworCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgIgorCQkJCQkJICAgICAgICAgICAgICAgICJpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJCWV4aXQoLTEpOworCQkJCQl9CisJCQkJCXBhZ2UgPSBidWYgKyBCVUZfU0laRSAvIDI7CisJCQkJfQorCQkJCWlmICgoYnl0ZXNfcmVhZCA9CisJCQkJICAgICByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJCQkJZW5kd2luKCk7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gYmFja19saW5lcygpLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQkJfSBlbHNlIHsJLyogQmVnaW5uaW5nIG9mIGZpbGUgcmVhY2hlZCAqLworCQkJCWJlZ2luX3JlYWNoZWQgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlpZiAoKigtLXBhZ2UpICE9ICdcbicpIHsJLyogJy0tcGFnZScgaGVyZSAqLworCQkJLyogU29tZXRoaW5nJ3Mgd3JvbmcuLi4gKi8KKwkJCWVuZHdpbigpOworCQkJZnByaW50ZihzdGRlcnIsICJcbkludGVybmFsIGVycm9yIGluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwl9CisJLyogR28gYmFjayAnbicgbGluZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlkbyB7CisJCQlpZiAocGFnZSA9PSBidWYpIHsKKwkJCQlpZiAoKGZwb3MgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQkJCQllbmR3aW4oKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gYmFja19saW5lcygpLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlpZiAoZnBvcyA+IGJ5dGVzX3JlYWQpIHsKKwkJCQkJLyogUmVhbGx5IHBvc3NpYmxlIHRvIG1vdmUgYmFja3dhcmQgQlVGX1NJWkUvMiBieXRlcz8gKi8KKwkJCQkJaWYgKGZwb3MgPCBCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSB7CisJCQkJCQkvKiBObywgbW92ZSBsZXNzIHRoZW4gKi8KKwkJCQkJCWlmIChsc2VlayhmZCwgMCwgU0VFS19TRVQpID09IC0xKSB7CisJCQkJCQkJZW5kd2luKCk7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgIgorCQkJCQkJCSAgICAgICAgICAgICAgICAiaW4gYmFja19saW5lcygpLlxuIik7CisJCQkJCQkJZXhpdCgtMSk7CisJCQkJCQl9CisJCQkJCQlwYWdlID0gYnVmICsgZnBvcyAtIGJ5dGVzX3JlYWQ7CisJCQkJCX0gZWxzZSB7CS8qIE1vdmUgYmFja3dhcmQgQlVGX1NJWkUvMiBieXRlcyAqLworCQkJCQkJaWYgKGxzZWVrIChmZCwgLShCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSwgU0VFS19DVVIpID09IC0xKSB7CisJCQkJCQkJZW5kd2luKCk7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIiCisJCQkJCQkJICAgICAgICAgICAgICAgICIgaW4gYmFja19saW5lcygpLlxuIik7CisJCQkJCQkJZXhpdCgtMSk7CisJCQkJCQl9CisJCQkJCQlwYWdlID0gYnVmICsgQlVGX1NJWkUgLyAyOworCQkJCQl9CisJCQkJCWlmICgoYnl0ZXNfcmVhZCA9CisJCQkJCSAgICAgcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQkJCQllbmR3aW4oKTsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gIgorCQkJCQkJICAgICAgICAgICAgICAgICJiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJCWV4aXQoLTEpOworCQkJCQl9CisJCQkJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCQkJfSBlbHNlIHsJLyogQmVnaW5uaW5nIG9mIGZpbGUgcmVhY2hlZCAqLworCQkJCQliZWdpbl9yZWFjaGVkID0gMTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoKigtLXBhZ2UpICE9ICdcbicpOworCXBhZ2UrKzsKK30KKworLyoKKyAqIFByaW50IGEgbmV3IHBhZ2Ugb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3BhZ2UoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJaW50IGksIHBhc3NlZF9lbmQgPSAwOworCisJcGFnZV9sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCQlwcmludF9saW5lKHdpbiwgaSwgd2lkdGgpOworCQlpZiAoIXBhc3NlZF9lbmQpCisJCQlwYWdlX2xlbmd0aCsrOworCQlpZiAoZW5kX3JlYWNoZWQgJiYgIXBhc3NlZF9lbmQpCisJCQlwYXNzZWRfZW5kID0gMTsKKwl9CisJd25vdXRyZWZyZXNoKHdpbik7Cit9CisKKy8qCisgKiBQcmludCBhIG5ldyBsaW5lIG9mIHRleHQuIENhbGxlZCBieSBkaWFsb2dfdGV4dGJveCgpIGFuZCBwcmludF9wYWdlKCkuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2xpbmUoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpCit7CisJY2hhciAqbGluZTsKKworCWxpbmUgPSBnZXRfbGluZSgpOworCWxpbmUgKz0gTUlOKHN0cmxlbihsaW5lKSwgaHNjcm9sbCk7CS8qIFNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwl3bW92ZSh3aW4sIHJvdywgMCk7CS8qIG1vdmUgY3Vyc29yIHRvIGNvcnJlY3QgbGluZSAqLworCXdhZGRjaCh3aW4sICcgJyk7CisJd2FkZG5zdHIod2luLCBsaW5lLCBNSU4oc3RybGVuKGxpbmUpLCB3aWR0aCAtIDIpKTsKKworCS8qIENsZWFyICdyZXNpZHVlJyBvZiBwcmV2aW91cyBsaW5lICovCisjaWYgT0xEX05DVVJTRVMKKwl7CisJCWludCBpOworCQlpbnQgeSwgeDsKKworCQlnZXR5eCh3aW4sIHksIHgpOworCQlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSB4OyBpKyspCisJCQl3YWRkY2god2luLCAnICcpOworCX0KKyNlbHNlCisJd2NscnRvZW9sKHdpbik7CisjZW5kaWYKK30KKworLyoKKyAqIFJldHVybiBjdXJyZW50IGxpbmUgb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkgYW5kIHByaW50X2xpbmUoKS4KKyAqICdwYWdlJyBzaG91bGQgcG9pbnQgdG8gc3RhcnQgb2YgY3VycmVudCBsaW5lIGJlZm9yZSBjYWxsaW5nLCBhbmQgd2lsbCBiZQorICogdXBkYXRlZCB0byBwb2ludCB0byBzdGFydCBvZiBuZXh0IGxpbmUuCisgKi8KK3N0YXRpYyBjaGFyICpnZXRfbGluZSh2b2lkKQoreworCWludCBpID0gMCwgZnBvczsKKwlzdGF0aWMgY2hhciBsaW5lW01BWF9MRU4gKyAxXTsKKworCWVuZF9yZWFjaGVkID0gMDsKKwl3aGlsZSAoKnBhZ2UgIT0gJ1xuJykgeworCQlpZiAoKnBhZ2UgPT0gJ1wwJykgeworCQkJLyogRWl0aGVyIGVuZCBvZiBmaWxlIG9yIGVuZCBvZiBidWZmZXIgcmVhY2hlZCAqLworCQkJaWYgKChmcG9zID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJCQllbmR3aW4oKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkJICAgICAgICAgICAgICAgICJnZXRfbGluZSgpLlxuIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlpZiAoZnBvcyA8IGZpbGVfc2l6ZSkgewkvKiBOb3QgZW5kIG9mIGZpbGUgeWV0ICovCisJCQkJLyogV2UndmUgcmVhY2hlZCBlbmQgb2YgYnVmZmVyLCBidXQgbm90IGVuZCBvZiBmaWxlIHlldCwKKwkJCQkgICBzbyByZWFkIG5leHQgcGFydCBvZiBmaWxlIGludG8gYnVmZmVyICovCisJCQkJaWYgKChieXRlc19yZWFkID0KKwkJCQkgICAgIHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkJCQllbmR3aW4oKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBnZXRfbGluZSgpLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQkJCXBhZ2UgPSBidWY7CisJCQl9IGVsc2UgeworCQkJCWlmICghZW5kX3JlYWNoZWQpCisJCQkJCWVuZF9yZWFjaGVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChpIDwgTUFYX0xFTikKKwkJCWxpbmVbaSsrXSA9ICoocGFnZSsrKTsKKwkJZWxzZSB7CisJCQkvKiBUcnVuY2F0ZSBsaW5lcyBsb25nZXIgdGhhbiBNQVhfTEVOIGNoYXJhY3RlcnMgKi8KKwkJCWlmIChpID09IE1BWF9MRU4pCisJCQkJbGluZVtpKytdID0gJ1wwJzsKKwkJCXBhZ2UrKzsKKwkJfQorCX0KKwlpZiAoaSA8PSBNQVhfTEVOKQorCQlsaW5lW2ldID0gJ1wwJzsKKwlpZiAoIWVuZF9yZWFjaGVkKQorCQlwYWdlKys7CQkvKiBtb3ZlIHBhc3MgJ1xuJyAqLworCisJcmV0dXJuIGxpbmU7Cit9CisKKy8qCisgKiBQcmludCBjdXJyZW50IHBvc2l0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3Bvc2l0aW9uKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworCWludCBmcG9zLCBwZXJjZW50OworCisJaWYgKChmcG9zID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIHByaW50X3Bvc2l0aW9uKCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCXdhdHRyc2V0KHdpbiwgcG9zaXRpb25faW5kaWNhdG9yX2F0dHIpOworCXdia2dkc2V0KHdpbiwgcG9zaXRpb25faW5kaWNhdG9yX2F0dHIgJiBBX0NPTE9SKTsKKwlwZXJjZW50ID0gIWZpbGVfc2l6ZSA/CisJICAgIDEwMCA6ICgoZnBvcyAtIGJ5dGVzX3JlYWQgKyBwYWdlIC0gYnVmKSAqIDEwMCkgLyBmaWxlX3NpemU7CisJd21vdmUod2luLCBoZWlnaHQgLSAzLCB3aWR0aCAtIDkpOworCXdwcmludHcod2luLCAiKCUzZCUlKSIsIHBlcmNlbnQpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyZDNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy91dGlsLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiAgdXRpbC5jCisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKKy8qIHVzZSBjb2xvcnMgYnkgZGVmYXVsdD8gKi8KK2Jvb2wgdXNlX2NvbG9ycyA9IDE7CisKK2NvbnN0IGNoYXIgKmJhY2t0aXRsZSA9IE5VTEw7CisKKy8qCisgKiBBdHRyaWJ1dGUgdmFsdWVzLCBkZWZhdWx0IGlzIGZvciBtb25vIGRpc3BsYXkKKyAqLworY2h0eXBlIGF0dHJpYnV0ZXNbXSA9IHsKKwlBX05PUk1BTCwJCS8qIHNjcmVlbl9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBzaGFkb3dfYXR0ciAqLworCUFfTk9STUFMLAkJLyogZGlhbG9nX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogdGl0bGVfYXR0ciAqLworCUFfTk9STUFMLAkJLyogYm9yZGVyX2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiBidXR0b25fYWN0aXZlX2F0dHIgKi8KKwlBX0RJTSwJCQkvKiBidXR0b25faW5hY3RpdmVfYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIGJ1dHRvbl9rZXlfYWN0aXZlX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogYnV0dG9uX2tleV9pbmFjdGl2ZV9hdHRyICovCisJQV9SRVZFUlNFLAkJLyogYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0ciAqLworCUFfTk9STUFMLAkJLyogaW5wdXRib3hfYXR0ciAqLworCUFfTk9STUFMLAkJLyogaW5wdXRib3hfYm9yZGVyX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIHNlYXJjaGJveF9hdHRyICovCisJQV9CT0xELAkJCS8qIHNlYXJjaGJveF90aXRsZV9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBzZWFyY2hib3hfYm9yZGVyX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogcG9zaXRpb25faW5kaWNhdG9yX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIG1lbnVib3hfYXR0ciAqLworCUFfTk9STUFMLAkJLyogbWVudWJveF9ib3JkZXJfYXR0ciAqLworCUFfTk9STUFMLAkJLyogaXRlbV9hdHRyICovCisJQV9SRVZFUlNFLAkJLyogaXRlbV9zZWxlY3RlZF9hdHRyICovCisJQV9CT0xELAkJCS8qIHRhZ19hdHRyICovCisJQV9SRVZFUlNFLAkJLyogdGFnX3NlbGVjdGVkX2F0dHIgKi8KKwlBX0JPTEQsCQkJLyogdGFnX2tleV9hdHRyICovCisJQV9SRVZFUlNFLAkJLyogdGFnX2tleV9zZWxlY3RlZF9hdHRyICovCisJQV9CT0xELAkJCS8qIGNoZWNrX2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiBjaGVja19zZWxlY3RlZF9hdHRyICovCisJQV9CT0xELAkJCS8qIHVhcnJvd19hdHRyICovCisJQV9CT0xECQkJLyogZGFycm93X2F0dHIgKi8KK307CisKKyNpbmNsdWRlICJjb2xvcnMuaCIKKworLyoKKyAqIFRhYmxlIG9mIGNvbG9yIHZhbHVlcworICovCitpbnQgY29sb3JfdGFibGVbXVszXSA9IHsKKwl7U0NSRUVOX0ZHLCBTQ1JFRU5fQkcsIFNDUkVFTl9ITH0sCisJe1NIQURPV19GRywgU0hBRE9XX0JHLCBTSEFET1dfSEx9LAorCXtESUFMT0dfRkcsIERJQUxPR19CRywgRElBTE9HX0hMfSwKKwl7VElUTEVfRkcsIFRJVExFX0JHLCBUSVRMRV9ITH0sCisJe0JPUkRFUl9GRywgQk9SREVSX0JHLCBCT1JERVJfSEx9LAorCXtCVVRUT05fQUNUSVZFX0ZHLCBCVVRUT05fQUNUSVZFX0JHLCBCVVRUT05fQUNUSVZFX0hMfSwKKwl7QlVUVE9OX0lOQUNUSVZFX0ZHLCBCVVRUT05fSU5BQ1RJVkVfQkcsIEJVVFRPTl9JTkFDVElWRV9ITH0sCisJe0JVVFRPTl9LRVlfQUNUSVZFX0ZHLCBCVVRUT05fS0VZX0FDVElWRV9CRywgQlVUVE9OX0tFWV9BQ1RJVkVfSEx9LAorCXtCVVRUT05fS0VZX0lOQUNUSVZFX0ZHLCBCVVRUT05fS0VZX0lOQUNUSVZFX0JHLAorCSBCVVRUT05fS0VZX0lOQUNUSVZFX0hMfSwKKwl7QlVUVE9OX0xBQkVMX0FDVElWRV9GRywgQlVUVE9OX0xBQkVMX0FDVElWRV9CRywKKwkgQlVUVE9OX0xBQkVMX0FDVElWRV9ITH0sCisJe0JVVFRPTl9MQUJFTF9JTkFDVElWRV9GRywgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0JHLAorCSBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfSEx9LAorCXtJTlBVVEJPWF9GRywgSU5QVVRCT1hfQkcsIElOUFVUQk9YX0hMfSwKKwl7SU5QVVRCT1hfQk9SREVSX0ZHLCBJTlBVVEJPWF9CT1JERVJfQkcsIElOUFVUQk9YX0JPUkRFUl9ITH0sCisJe1NFQVJDSEJPWF9GRywgU0VBUkNIQk9YX0JHLCBTRUFSQ0hCT1hfSEx9LAorCXtTRUFSQ0hCT1hfVElUTEVfRkcsIFNFQVJDSEJPWF9USVRMRV9CRywgU0VBUkNIQk9YX1RJVExFX0hMfSwKKwl7U0VBUkNIQk9YX0JPUkRFUl9GRywgU0VBUkNIQk9YX0JPUkRFUl9CRywgU0VBUkNIQk9YX0JPUkRFUl9ITH0sCisJe1BPU0lUSU9OX0lORElDQVRPUl9GRywgUE9TSVRJT05fSU5ESUNBVE9SX0JHLCBQT1NJVElPTl9JTkRJQ0FUT1JfSEx9LAorCXtNRU5VQk9YX0ZHLCBNRU5VQk9YX0JHLCBNRU5VQk9YX0hMfSwKKwl7TUVOVUJPWF9CT1JERVJfRkcsIE1FTlVCT1hfQk9SREVSX0JHLCBNRU5VQk9YX0JPUkRFUl9ITH0sCisJe0lURU1fRkcsIElURU1fQkcsIElURU1fSEx9LAorCXtJVEVNX1NFTEVDVEVEX0ZHLCBJVEVNX1NFTEVDVEVEX0JHLCBJVEVNX1NFTEVDVEVEX0hMfSwKKwl7VEFHX0ZHLCBUQUdfQkcsIFRBR19ITH0sCisJe1RBR19TRUxFQ1RFRF9GRywgVEFHX1NFTEVDVEVEX0JHLCBUQUdfU0VMRUNURURfSEx9LAorCXtUQUdfS0VZX0ZHLCBUQUdfS0VZX0JHLCBUQUdfS0VZX0hMfSwKKwl7VEFHX0tFWV9TRUxFQ1RFRF9GRywgVEFHX0tFWV9TRUxFQ1RFRF9CRywgVEFHX0tFWV9TRUxFQ1RFRF9ITH0sCisJe0NIRUNLX0ZHLCBDSEVDS19CRywgQ0hFQ0tfSEx9LAorCXtDSEVDS19TRUxFQ1RFRF9GRywgQ0hFQ0tfU0VMRUNURURfQkcsIENIRUNLX1NFTEVDVEVEX0hMfSwKKwl7VUFSUk9XX0ZHLCBVQVJST1dfQkcsIFVBUlJPV19ITH0sCisJe0RBUlJPV19GRywgREFSUk9XX0JHLCBEQVJST1dfSEx9LAorfTsJCQkJLyogY29sb3JfdGFibGUgKi8KKworLyoKKyAqIFNldCB3aW5kb3cgdG8gYXR0cmlidXRlICdhdHRyJworICovCit2b2lkIGF0dHJfY2xlYXIoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGNodHlwZSBhdHRyKQoreworCWludCBpLCBqOworCisJd2F0dHJzZXQod2luLCBhdHRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwkJd21vdmUod2luLCBpLCAwKTsKKwkJZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisJCQl3YWRkY2god2luLCAnICcpOworCX0KKwl0b3VjaHdpbih3aW4pOworfQorCit2b2lkIGRpYWxvZ19jbGVhcih2b2lkKQoreworCWF0dHJfY2xlYXIoc3Rkc2NyLCBMSU5FUywgQ09MUywgc2NyZWVuX2F0dHIpOworCS8qIERpc3BsYXkgYmFja2dyb3VuZCB0aXRsZSBpZiBpdCBleGlzdHMgLi4uIC0gU0xIICovCisJaWYgKGJhY2t0aXRsZSAhPSBOVUxMKSB7CisJCWludCBpOworCisJCXdhdHRyc2V0KHN0ZHNjciwgc2NyZWVuX2F0dHIpOworCQltdndhZGRzdHIoc3Rkc2NyLCAwLCAxLCAoY2hhciAqKWJhY2t0aXRsZSk7CisJCXdtb3ZlKHN0ZHNjciwgMSwgMSk7CisJCWZvciAoaSA9IDE7IGkgPCBDT0xTIC0gMTsgaSsrKQorCQkJd2FkZGNoKHN0ZHNjciwgQUNTX0hMSU5FKTsKKwl9CisJd25vdXRyZWZyZXNoKHN0ZHNjcik7Cit9CisKKy8qCisgKiBEbyBzb21lIGluaXRpYWxpemF0aW9uIGZvciBkaWFsb2cKKyAqLwordm9pZCBpbml0X2RpYWxvZyh2b2lkKQoreworCWluaXRzY3IoKTsJCS8qIEluaXQgY3Vyc2VzICovCisJa2V5cGFkKHN0ZHNjciwgVFJVRSk7CisJY2JyZWFrKCk7CisJbm9lY2hvKCk7CisKKwlpZiAodXNlX2NvbG9ycykJCS8qIFNldCB1cCBjb2xvcnMgKi8KKwkJY29sb3Jfc2V0dXAoKTsKKworCWRpYWxvZ19jbGVhcigpOworfQorCisvKgorICogU2V0dXAgZm9yIGNvbG9yIGRpc3BsYXkKKyAqLwordm9pZCBjb2xvcl9zZXR1cCh2b2lkKQoreworCWludCBpOworCisJaWYgKGhhc19jb2xvcnMoKSkgewkvKiBUZXJtaW5hbCBzdXBwb3J0cyBjb2xvcj8gKi8KKwkJc3RhcnRfY29sb3IoKTsKKworCQkvKiBJbml0aWFsaXplIGNvbG9yIHBhaXJzICovCisJCWZvciAoaSA9IDA7IGkgPCBBVFRSSUJVVEVfQ09VTlQ7IGkrKykKKwkJCWluaXRfcGFpcihpICsgMSwgY29sb3JfdGFibGVbaV1bMF0sIGNvbG9yX3RhYmxlW2ldWzFdKTsKKworCQkvKiBTZXR1cCBjb2xvciBhdHRyaWJ1dGVzICovCisJCWZvciAoaSA9IDA7IGkgPCBBVFRSSUJVVEVfQ09VTlQ7IGkrKykKKwkJCWF0dHJpYnV0ZXNbaV0gPSBDX0FUVFIoY29sb3JfdGFibGVbaV1bMl0sIGkgKyAxKTsKKwl9Cit9CisKKy8qCisgKiBFbmQgdXNpbmcgZGlhbG9nIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBlbmRfZGlhbG9nKHZvaWQpCit7CisJZW5kd2luKCk7Cit9CisKKy8qIFByaW50IHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLiBDZW50ZXIgdGhlIHRpdGxlIGFuZCB0cnVuY2F0ZQorICogdGlsZSBpZiB3aWRlciB0aGFuIGRpYWxvZyAoLSAyIGNoYXJzKS4KKyAqKi8KK3ZvaWQgcHJpbnRfdGl0bGUoV0lORE9XICpkaWFsb2csIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgd2lkdGgpCit7CisJaWYgKHRpdGxlKSB7CisJCWludCB0bGVuID0gTUlOKHdpZHRoIC0gMiwgc3RybGVuKHRpdGxlKSk7CisJCXdhdHRyc2V0KGRpYWxvZywgdGl0bGVfYXR0cik7CisJCW12d2FkZGNoKGRpYWxvZywgMCwgKHdpZHRoIC0gdGxlbikgLyAyIC0gMSwgJyAnKTsKKwkJbXZ3YWRkbnN0cihkaWFsb2csIDAsICh3aWR0aCAtIHRsZW4pLzIsIHRpdGxlLCB0bGVuKTsKKwkJd2FkZGNoKGRpYWxvZywgJyAnKTsKKwl9Cit9CisKKy8qCisgKiBQcmludCBhIHN0cmluZyBvZiB0ZXh0IGluIGEgd2luZG93LCBhdXRvbWF0aWNhbGx5IHdyYXAgYXJvdW5kIHRvIHRoZQorICogbmV4dCBsaW5lIGlmIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcgdG8gZml0IG9uIG9uZSBsaW5lLiBOZXdsaW5lCisgKiBjaGFyYWN0ZXJzICdcbicgYXJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4gIFdlIHN0YXJ0IG9uIGEgbmV3IGxpbmUKKyAqIGlmIHRoZXJlIGlzIG5vIHJvb20gZm9yIGF0IGxlYXN0IDQgbm9uYmxhbmtzIGZvbGxvd2luZyBhIGRvdWJsZS1zcGFjZS4KKyAqLwordm9pZCBwcmludF9hdXRvd3JhcChXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IHdpZHRoLCBpbnQgeSwgaW50IHgpCit7CisJaW50IG5ld2wsIGN1cl94LCBjdXJfeTsKKwlpbnQgaSwgcHJvbXB0X2xlbiwgcm9vbSwgd2xlbjsKKwljaGFyIHRlbXBzdHJbTUFYX0xFTiArIDFdLCAqd29yZCwgKnNwLCAqc3AyOworCisJc3RyY3B5KHRlbXBzdHIsIHByb21wdCk7CisKKwlwcm9tcHRfbGVuID0gc3RybGVuKHRlbXBzdHIpOworCisJLyoKKwkgKiBSZW1vdmUgbmV3bGluZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJvbXB0X2xlbjsgaSsrKSB7CisJCWlmICh0ZW1wc3RyW2ldID09ICdcbicpCisJCQl0ZW1wc3RyW2ldID0gJyAnOworCX0KKworCWlmIChwcm9tcHRfbGVuIDw9IHdpZHRoIC0geCAqIDIpIHsJLyogSWYgcHJvbXB0IGlzIHNob3J0ICovCisJCXdtb3ZlKHdpbiwgeSwgKHdpZHRoIC0gcHJvbXB0X2xlbikgLyAyKTsKKwkJd2FkZHN0cih3aW4sIHRlbXBzdHIpOworCX0gZWxzZSB7CisJCWN1cl94ID0geDsKKwkJY3VyX3kgPSB5OworCQluZXdsID0gMTsKKwkJd29yZCA9IHRlbXBzdHI7CisJCXdoaWxlICh3b3JkICYmICp3b3JkKSB7CisJCQlzcCA9IHN0cmNocih3b3JkLCAnICcpOworCQkJaWYgKHNwKQorCQkJCSpzcCsrID0gMDsKKworCQkJLyogV3JhcCB0byBuZXh0IGxpbmUgaWYgZWl0aGVyIHRoZSB3b3JkIGRvZXMgbm90IGZpdCwKKwkJCSAgIG9yIGl0IGlzIHRoZSBmaXJzdCB3b3JkIG9mIGEgbmV3IHNlbnRlbmNlLCBhbmQgaXQgaXMKKwkJCSAgIHNob3J0LCBhbmQgdGhlIG5leHQgd29yZCBkb2VzIG5vdCBmaXQuICovCisJCQlyb29tID0gd2lkdGggLSBjdXJfeDsKKwkJCXdsZW4gPSBzdHJsZW4od29yZCk7CisJCQlpZiAod2xlbiA+IHJvb20gfHwKKwkJCSAgICAobmV3bCAmJiB3bGVuIDwgNCAmJiBzcAorCQkJICAgICAmJiB3bGVuICsgMSArIHN0cmxlbihzcCkgPiByb29tCisJCQkgICAgICYmICghKHNwMiA9IHN0cmNocihzcCwgJyAnKSkKKwkJCQkgfHwgd2xlbiArIDEgKyAoc3AyIC0gc3ApID4gcm9vbSkpKSB7CisJCQkJY3VyX3krKzsKKwkJCQljdXJfeCA9IHg7CisJCQl9CisJCQl3bW92ZSh3aW4sIGN1cl95LCBjdXJfeCk7CisJCQl3YWRkc3RyKHdpbiwgd29yZCk7CisJCQlnZXR5eCh3aW4sIGN1cl95LCBjdXJfeCk7CisJCQljdXJfeCsrOworCQkJaWYgKHNwICYmICpzcCA9PSAnICcpIHsKKwkJCQljdXJfeCsrOwkvKiBkb3VibGUgc3BhY2UgKi8KKwkJCQl3aGlsZSAoKisrc3AgPT0gJyAnKSA7CisJCQkJbmV3bCA9IDE7CisJCQl9IGVsc2UKKwkJCQluZXdsID0gMDsKKwkJCXdvcmQgPSBzcDsKKwkJfQorCX0KK30KKworLyoKKyAqIFByaW50IGEgYnV0dG9uCisgKi8KK3ZvaWQgcHJpbnRfYnV0dG9uKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqbGFiZWwsIGludCB5LCBpbnQgeCwgaW50IHNlbGVjdGVkKQoreworCWludCBpLCB0ZW1wOworCisJd21vdmUod2luLCB5LCB4KTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2FjdGl2ZV9hdHRyIDogYnV0dG9uX2luYWN0aXZlX2F0dHIpOworCXdhZGRzdHIod2luLCAiPCIpOworCXRlbXAgPSBzdHJzcG4obGFiZWwsICIgIik7CisJbGFiZWwgKz0gdGVtcDsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyCisJCSA6IGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZV9hdHRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSsrKQorCQl3YWRkY2god2luLCAnICcpOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fa2V5X2FjdGl2ZV9hdHRyCisJCSA6IGJ1dHRvbl9rZXlfaW5hY3RpdmVfYXR0cik7CisJd2FkZGNoKHdpbiwgbGFiZWxbMF0pOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIKKwkJIDogYnV0dG9uX2xhYmVsX2luYWN0aXZlX2F0dHIpOworCXdhZGRzdHIod2luLCAoY2hhciAqKWxhYmVsICsgMSk7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9hY3RpdmVfYXR0ciA6IGJ1dHRvbl9pbmFjdGl2ZV9hdHRyKTsKKwl3YWRkc3RyKHdpbiwgIj4iKTsKKwl3bW92ZSh3aW4sIHksIHggKyB0ZW1wICsgMSk7Cit9CisKKy8qCisgKiBEcmF3IGEgcmVjdGFuZ3VsYXIgYm94IHdpdGggbGluZSBkcmF3aW5nIGNoYXJhY3RlcnMKKyAqLwordm9pZAorZHJhd19ib3goV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkgY2h0eXBlIGJveCwgY2h0eXBlIGJvcmRlcikKK3sKKwlpbnQgaSwgajsKKworCXdhdHRyc2V0KHdpbiwgMCk7CisJZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisJCXdtb3ZlKHdpbiwgeSArIGksIHgpOworCQlmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKwkJCWlmICghaSAmJiAhaikKKwkJCQl3YWRkY2god2luLCBib3JkZXIgfCBBQ1NfVUxDT1JORVIpOworCQkJZWxzZSBpZiAoaSA9PSBoZWlnaHQgLSAxICYmICFqKQorCQkJCXdhZGRjaCh3aW4sIGJvcmRlciB8IEFDU19MTENPUk5FUik7CisJCQllbHNlIGlmICghaSAmJiBqID09IHdpZHRoIC0gMSkKKwkJCQl3YWRkY2god2luLCBib3ggfCBBQ1NfVVJDT1JORVIpOworCQkJZWxzZSBpZiAoaSA9PSBoZWlnaHQgLSAxICYmIGogPT0gd2lkdGggLSAxKQorCQkJCXdhZGRjaCh3aW4sIGJveCB8IEFDU19MUkNPUk5FUik7CisJCQllbHNlIGlmICghaSkKKwkJCQl3YWRkY2god2luLCBib3JkZXIgfCBBQ1NfSExJTkUpOworCQkJZWxzZSBpZiAoaSA9PSBoZWlnaHQgLSAxKQorCQkJCXdhZGRjaCh3aW4sIGJveCB8IEFDU19ITElORSk7CisJCQllbHNlIGlmICghaikKKwkJCQl3YWRkY2god2luLCBib3JkZXIgfCBBQ1NfVkxJTkUpOworCQkJZWxzZSBpZiAoaiA9PSB3aWR0aCAtIDEpCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgQUNTX1ZMSU5FKTsKKwkJCWVsc2UKKwkJCQl3YWRkY2god2luLCBib3ggfCAnICcpOworCX0KK30KKworLyoKKyAqIERyYXcgc2hhZG93cyBhbG9uZyB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlIHRvIGdpdmUgYSBtb3JlIDNEIGxvb2sKKyAqIHRvIHRoZSBib3hlcworICovCit2b2lkIGRyYXdfc2hhZG93KFdJTkRPVyAqIHdpbiwgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJaW50IGk7CisKKwlpZiAoaGFzX2NvbG9ycygpKSB7CS8qIFdoZXRoZXIgdGVybWluYWwgc3VwcG9ydHMgY29sb3I/ICovCisJCXdhdHRyc2V0KHdpbiwgc2hhZG93X2F0dHIpOworCQl3bW92ZSh3aW4sIHkgKyBoZWlnaHQsIHggKyAyKTsKKwkJZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCisJCQl3YWRkY2god2luLCB3aW5jaCh3aW4pICYgQV9DSEFSVEVYVCk7CisJCWZvciAoaSA9IHkgKyAxOyBpIDwgeSArIGhlaWdodCArIDE7IGkrKykgeworCQkJd21vdmUod2luLCBpLCB4ICsgd2lkdGgpOworCQkJd2FkZGNoKHdpbiwgd2luY2god2luKSAmIEFfQ0hBUlRFWFQpOworCQkJd2FkZGNoKHdpbiwgd2luY2god2luKSAmIEFfQ0hBUlRFWFQpOworCQl9CisJCXdub3V0cmVmcmVzaCh3aW4pOworCX0KK30KKworLyoKKyAqICBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBhbHBoYWJldGljIGNoYXJhY3RlciBpbiBhIHN0cmluZy4KKyAqLworaW50IGZpcnN0X2FscGhhKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZXhlbXB0KQoreworCWludCBpLCBpbl9wYXJlbiA9IDAsIGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKHN0cmluZyk7IGkrKykgeworCQljID0gdG9sb3dlcihzdHJpbmdbaV0pOworCisJCWlmIChzdHJjaHIoIjxbKCIsIGMpKQorCQkJKytpbl9wYXJlbjsKKwkJaWYgKHN0cmNocigiPl0pIiwgYykgJiYgaW5fcGFyZW4gPiAwKQorCQkJLS1pbl9wYXJlbjsKKworCQlpZiAoKCFpbl9wYXJlbikgJiYgaXNhbHBoYShjKSAmJiBzdHJjaHIoZXhlbXB0LCBjKSA9PSAwKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cveWVzbm8uYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy95ZXNuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjU2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cveWVzbm8uYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqICB5ZXNuby5jIC0tIGltcGxlbWVudHMgdGhlIHllcy9ubyBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworLyoKKyAqIERpc3BsYXkgdGVybWluYXRpb24gYnV0dG9ucworICovCitzdGF0aWMgdm9pZCBwcmludF9idXR0b25zKFdJTkRPVyAqIGRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisJaW50IHggPSB3aWR0aCAvIDIgLSAxMDsKKwlpbnQgeSA9IGhlaWdodCAtIDI7CisKKwlwcmludF9idXR0b24oZGlhbG9nLCAiIFllcyAiLCB5LCB4LCBzZWxlY3RlZCA9PSAwKTsKKwlwcmludF9idXR0b24oZGlhbG9nLCAiICBObyAgIiwgeSwgeCArIDEzLCBzZWxlY3RlZCA9PSAxKTsKKworCXdtb3ZlKGRpYWxvZywgeSwgeCArIDEgKyAxMyAqIHNlbGVjdGVkKTsKKwl3cmVmcmVzaChkaWFsb2cpOworfQorCisvKgorICogRGlzcGxheSBhIGRpYWxvZyBib3ggd2l0aCB0d28gYnV0dG9ucyAtIFllcyBhbmQgTm8KKyAqLworaW50IGRpYWxvZ195ZXNubyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJaW50IGksIHgsIHksIGtleSA9IDAsIGJ1dHRvbiA9IDA7CisJV0lORE9XICpkaWFsb2c7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisJd2F0dHJzZXQoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXdhZGRjaChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X3RpdGxlKGRpYWxvZywgdGl0bGUsIHdpZHRoKTsKKworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXByaW50X2F1dG93cmFwKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCisJd2hpbGUgKGtleSAhPSBFU0MpIHsKKwkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgJ1knOgorCQljYXNlICd5JzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ04nOgorCQljYXNlICduJzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIDE7CisKKwkJY2FzZSBUQUI6CisJCWNhc2UgS0VZX0xFRlQ6CisJCWNhc2UgS0VZX1JJR0hUOgorCQkJYnV0dG9uID0gKChrZXkgPT0gS0VZX0xFRlQgPyAtLWJ1dHRvbiA6ICsrYnV0dG9uKSA8IDApID8gMSA6IChidXR0b24gPiAxID8gMCA6IGJ1dHRvbik7CisKKwkJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlICcgJzoKKwkJY2FzZSAnXG4nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gYnV0dG9uOworCQljYXNlIEVTQzoKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJcmV0dXJuIC0xOwkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNjlmOAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCkBAIC0wLDAgKzEsMTEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICoKKyAqIEludHJvZHVjZWQgc2luZ2xlIG1lbnUgbW9kZSAoc2hvdyBhbGwgc3ViLW1lbnVzIGluIG9uZSBsYXJnZSB0cmVlKS4KKyAqIDIwMDItMTEtMDYgUGV0ciBCYXVkaXMgPHBhc2t5QHVjdy5jej4KKyAqCisgKiBpMThuLCAyMDA1LCBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqLworCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNzAwCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4gLyogZm9yIHN0cmNhc2VjbXAgKi8KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKK3N0YXRpYyBjaGFyIG1lbnVfYmFja3RpdGxlWzEyOF07CitzdGF0aWMgY29uc3QgY2hhciBtY29uZl9yZWFkbWVbXSA9IE5fKAorIk92ZXJ2aWV3XG4iCisiLS0tLS0tLS1cbiIKKyJTb21lIGZlYXR1cmVzIG1heSBiZSBidWlsdCBkaXJlY3RseSBpbnRvIGJ1c3lib3guXG4iCisiU29tZSBtYXkgYmUgbWFkZSBpbnRvIHN0YW5kYWxvbmUgYXBwbGV0cy4gIFNvbWUgZmVhdHVyZXNcbiIKKyJtYXkgYmUgY29tcGxldGVseSByZW1vdmVkIGFsdG9nZXRoZXIuICBUaGVyZSBhcmUgYWxzbyBjZXJ0YWluXG4iCisicGFyYW1ldGVycyB3aGljaCBhcmUgbm90IHJlYWxseSBmZWF0dXJlcywgYnV0IG11c3QgYmVcbiIKKyJlbnRlcmVkIGluIGFzIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgbnVtYmVycyBvciBwb3NzaWJseSB0ZXh0LlxuIgorIlxuIgorIk1lbnUgaXRlbXMgYmVnaW5uaW5nIHdpdGggWypdLCA8TT4gb3IgWyBdIHJlcHJlc2VudCBmZWF0dXJlc1xuIgorImNvbmZpZ3VyZWQgdG8gYmUgYnVpbHQgaW4sIG1vZHVsYXJpemVkIG9yIHJlbW92ZWQgcmVzcGVjdGl2ZWx5LlxuIgorIlBvaW50ZWQgYnJhY2tldHMgPD4gcmVwcmVzZW50IG1vZHVsZSBjYXBhYmxlIGZlYXR1cmVzLlxuIgorIlxuIgorIlRvIGNoYW5nZSBhbnkgb2YgdGhlc2UgZmVhdHVyZXMsIGhpZ2hsaWdodCBpdCB3aXRoIHRoZSBjdXJzb3JcbiIKKyJrZXlzIGFuZCBwcmVzcyA8WT4gdG8gYnVpbGQgaXQgaW4sIDxNPiB0byBtYWtlIGl0IGEgbW9kdWxlIG9yXG4iCisiPE4+IHRvIHJlbW92ZWQgaXQuICBZb3UgbWF5IGFsc28gcHJlc3MgdGhlIDxTcGFjZSBCYXI+IHRvIGN5Y2xlXG4iCisidGhyb3VnaCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgKGllLiBZLT5OLT5NLT5ZKS5cbiIKKyJcbiIKKyJTb21lIGFkZGl0aW9uYWwga2V5Ym9hcmQgaGludHM6XG4iCisiXG4iCisiTWVudXNcbiIKKyItLS0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBVcC9Eb3duIGFycm93IGtleXMgKGN1cnNvciBrZXlzKSB0byBoaWdobGlnaHQgdGhlIGl0ZW1cbiIKKyIgICB5b3Ugd2lzaCB0byBjaGFuZ2Ugb3Igc3VibWVudSB3aXNoIHRvIHNlbGVjdCBhbmQgcHJlc3MgPEVudGVyPi5cbiIKKyIgICBTdWJtZW51cyBhcmUgZGVzaWduYXRlZCBieSBcIi0tLT5cIi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgdGhlIG9wdGlvbidzIGhpZ2hsaWdodGVkIGxldHRlciAoaG90a2V5KS5cbiIKKyIgICAgICAgICAgICAgUHJlc3NpbmcgYSBob3RrZXkgbW9yZSB0aGFuIG9uY2Ugd2lsbCBzZXF1ZW5jZVxuIgorIiAgICAgICAgICAgICB0aHJvdWdoIGFsbCB2aXNpYmxlIGl0ZW1zIHdoaWNoIHVzZSB0aGF0IGhvdGtleS5cbiIKKyJcbiIKKyIgICBZb3UgbWF5IGFsc28gdXNlIHRoZSA8UEFHRSBVUD4gYW5kIDxQQUdFIERPV04+IGtleXMgdG8gc2Nyb2xsXG4iCisiICAgdW5zZWVuIG9wdGlvbnMgaW50byB2aWV3LlxuIgorIlxuIgorIm8gIFRvIGV4aXQgYSBtZW51IHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0IHRoZSA8RXhpdD4gYnV0dG9uXG4iCisiICAgYW5kIHByZXNzIDxFTlRFUj4uXG4iCisiXG4iCisiICAgU2hvcnRjdXQ6IFByZXNzIDxFU0M+PEVTQz4gb3IgPEU+IG9yIDxYPiBpZiB0aGVyZSBpcyBubyBob3RrZXlcbiIKKyIgICAgICAgICAgICAgdXNpbmcgdGhvc2UgbGV0dGVycy4gIFlvdSBtYXkgcHJlc3MgYSBzaW5nbGUgPEVTQz4sIGJ1dFxuIgorIiAgICAgICAgICAgICB0aGVyZSBpcyBhIGRlbGF5ZWQgcmVzcG9uc2Ugd2hpY2ggeW91IG1heSBmaW5kIGFubm95aW5nLlxuIgorIlxuIgorIiAgIEFsc28sIHRoZSA8VEFCPiBhbmQgY3Vyc29yIGtleXMgd2lsbCBjeWNsZSBiZXR3ZWVuIDxTZWxlY3Q+LFxuIgorIiAgIDxFeGl0PiBhbmQgPEhlbHA+XG4iCisiXG4iCisibyAgVG8gZ2V0IGhlbHAgd2l0aCBhbiBpdGVtLCB1c2UgdGhlIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodCA8SGVscD5cbiIKKyIgICBhbmQgUHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEg+IG9yIDw/Pi5cbiIKKyJcbiIKKyJcbiIKKyJSYWRpb2xpc3RzICAoQ2hvaWNlIGxpc3RzKVxuIgorIi0tLS0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBjdXJzb3Iga2V5cyB0byBzZWxlY3QgdGhlIG9wdGlvbiB5b3Ugd2lzaCB0byBzZXQgYW5kIHByZXNzXG4iCisiICAgPFM+IG9yIHRoZSA8U1BBQ0UgQkFSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgb3B0aW9uIHlvdSB3aXNoIHRvIHNldCB0aGVuXG4iCisiICAgICAgICAgICAgIHByZXNzIDxTPiBvciA8U1BBQ0UgQkFSPi5cbiIKKyJcbiIKKyJvICBUbyBzZWUgYXZhaWxhYmxlIGhlbHAgZm9yIHRoZSBpdGVtLCB1c2UgdGhlIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodFxuIgorIiAgIDxIZWxwPiBhbmQgUHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEg+IG9yIDw/Pi5cbiIKKyJcbiIKKyIgICBBbHNvLCB0aGUgPFRBQj4gYW5kIGN1cnNvciBrZXlzIHdpbGwgY3ljbGUgYmV0d2VlbiA8U2VsZWN0PiBhbmRcbiIKKyIgICA8SGVscD5cbiIKKyJcbiIKKyJcbiIKKyJEYXRhIEVudHJ5XG4iCisiLS0tLS0tLS0tLS1cbiIKKyJvICBFbnRlciB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uIGFuZCBwcmVzcyA8RU5URVI+XG4iCisiICAgSWYgeW91IGFyZSBlbnRlcmluZyBoZXhhZGVjaW1hbCB2YWx1ZXMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG9cbiIKKyIgICBhZGQgdGhlICcweCcgcHJlZml4IHRvIHRoZSBlbnRyeS5cbiIKKyJcbiIKKyJvICBGb3IgaGVscCwgdXNlIHRoZSA8VEFCPiBvciBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHQgdGhlIGhlbHAgb3B0aW9uXG4iCisiICAgYW5kIHByZXNzIDxFTlRFUj4uICBZb3UgY2FuIHRyeSA8VEFCPjxIPiBhcyB3ZWxsLlxuIgorIlxuIgorIlxuIgorIlRleHQgQm94ICAgIChIZWxwIFdpbmRvdylcbiIKKyItLS0tLS0tLVxuIgorIm8gIFVzZSB0aGUgY3Vyc29yIGtleXMgdG8gc2Nyb2xsIHVwL2Rvd24vbGVmdC9yaWdodC4gIFRoZSBWSSBlZGl0b3JcbiIKKyIgICBrZXlzIGgsaixrLGwgZnVuY3Rpb24gaGVyZSBhcyBkbyA8U1BBQ0UgQkFSPiBhbmQgPEI+IGZvciB0aG9zZVxuIgorIiAgIHdobyBhcmUgZmFtaWxpYXIgd2l0aCBsZXNzIGFuZCBseW54LlxuIgorIlxuIgorIm8gIFByZXNzIDxFPiwgPFg+LCA8RW50ZXI+IG9yIDxFc2M+PEVzYz4gdG8gZXhpdC5cbiIKKyJcbiIKKyJcbiIKKyJBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiBGaWxlc1xuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiTWVudWNvbmZpZyBzdXBwb3J0cyB0aGUgdXNlIG9mIGFsdGVybmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvclxuIgorInRob3NlIHdobywgZm9yIHZhcmlvdXMgcmVhc29ucywgZmluZCBpdCBuZWNlc3NhcnkgdG8gc3dpdGNoXG4iCisiYmV0d2VlbiBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMuXG4iCisiXG4iCisiQXQgdGhlIGVuZCBvZiB0aGUgbWFpbiBtZW51IHlvdSB3aWxsIGZpbmQgdHdvIG9wdGlvbnMuICBPbmUgaXNcbiIKKyJmb3Igc2F2aW5nIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSBmaWxlIG9mIHlvdXIgY2hvb3NpbmcuXG4iCisiVGhlIG90aGVyIG9wdGlvbiBpcyBmb3IgbG9hZGluZyBhIHByZXZpb3VzbHkgc2F2ZWQgYWx0ZXJuYXRlXG4iCisiY29uZmlndXJhdGlvbi5cbiIKKyJcbiIKKyJFdmVuIGlmIHlvdSBkb24ndCB1c2UgYWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGJ1dCB5b3VcbiIKKyJmaW5kIGR1cmluZyBhIE1lbnVjb25maWcgc2Vzc2lvbiB0aGF0IHlvdSBoYXZlIGNvbXBsZXRlbHkgbWVzc2VkXG4iCisidXAgeW91ciBzZXR0aW5ncywgeW91IG1heSB1c2UgdGhlIFwiTG9hZCBBbHRlcm5hdGUuLi5cIiBvcHRpb24gdG9cbiIKKyJyZXN0b3JlIHlvdXIgcHJldmlvdXNseSBzYXZlZCBzZXR0aW5ncyBmcm9tIFwiLmNvbmZpZ1wiIHdpdGhvdXRcbiIKKyJyZXN0YXJ0aW5nIE1lbnVjb25maWcuXG4iCisiXG4iCisiT3RoZXIgaW5mb3JtYXRpb25cbiIKKyItLS0tLS0tLS0tLS0tLS0tLVxuIgorIklmIHlvdSB1c2UgTWVudWNvbmZpZyBpbiBhbiBYVEVSTSB3aW5kb3cgbWFrZSBzdXJlIHlvdSBoYXZlIHlvdXJcbiIKKyIkVEVSTSB2YXJpYWJsZSBzZXQgdG8gcG9pbnQgdG8gYSB4dGVybSBkZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIGNvbG9yLlxuIgorIk90aGVyd2lzZSwgTWVudWNvbmZpZyB3aWxsIGxvb2sgcmF0aGVyIGJhZC4gIE1lbnVjb25maWcgd2lsbCBub3RcbiIKKyJkaXNwbGF5IGNvcnJlY3RseSBpbiBhIFJYVlQgd2luZG93IGJlY2F1c2Ugcnh2dCBkaXNwbGF5cyBvbmx5IG9uZVxuIgorImludGVuc2l0eSBvZiBjb2xvciwgYnJpZ2h0LlxuIgorIlxuIgorIk1lbnVjb25maWcgd2lsbCBkaXNwbGF5IGxhcmdlciBtZW51cyBvbiBzY3JlZW5zIG9yIHh0ZXJtcyB3aGljaCBhcmVcbiIKKyJzZXQgdG8gZGlzcGxheSBtb3JlIHRoYW4gdGhlIHN0YW5kYXJkIDI1IHJvdyBieSA4MCBjb2x1bW4gZ2VvbWV0cnkuXG4iCisiSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywgdGhlIFwic3R0eSBzaXplXCIgY29tbWFuZCBtdXN0IGJlIGFibGUgdG9cbiIKKyJkaXNwbGF5IHRoZSBzY3JlZW4ncyBjdXJyZW50IHJvdyBhbmQgY29sdW1uIGdlb21ldHJ5LiAgSSBTVFJPTkdMWVxuIgorIlJFQ09NTUVORCB0aGF0IHlvdSBtYWtlIHN1cmUgeW91IGRvIE5PVCBoYXZlIHRoZSBzaGVsbCB2YXJpYWJsZXNcbiIKKyJMSU5FUyBhbmQgQ09MVU1OUyBleHBvcnRlZCBpbnRvIHlvdXIgZW52aXJvbm1lbnQuICBTb21lIGRpc3RyaWJ1dGlvbnNcbiIKKyJleHBvcnQgdGhvc2UgdmFyaWFibGVzIHZpYSAvZXRjL3Byb2ZpbGUuICBTb21lIG5jdXJzZXMgcHJvZ3JhbXMgY2FuXG4iCisiYmVjb21lIGNvbmZ1c2VkIHdoZW4gdGhvc2UgdmFyaWFibGVzIChMSU5FUyAmIENPTFVNTlMpIGRvbid0IHJlZmxlY3RcbiIKKyJ0aGUgdHJ1ZSBzY3JlZW4gc2l6ZS5cbiIKKyJcbiIKKyJPcHRpb25hbCBwZXJzb25hbGl0eSBhdmFpbGFibGVcbiIKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBpbiBhIHNpbmdsZVxuIgorIm1lbnUsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IG11bHRpbWVudSBoaWVyYXJjaHksIHJ1biB0aGUgbWVudWNvbmZpZ1xuIgorIndpdGggTUVOVUNPTkZJR19NT0RFIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCB0byBzaW5nbGVfbWVudS4gRXhhbXBsZTpcbiIKKyJcbiIKKyJtYWtlIE1FTlVDT05GSUdfTU9ERT1zaW5nbGVfbWVudSBtZW51Y29uZmlnXG4iCisiXG4iCisiPEVudGVyPiB3aWxsIHRoZW4gdW5yb2xsIHRoZSBhcHByb3ByaWF0ZSBjYXRlZ29yeSwgb3IgZW5mb2xkIGl0IGlmIGl0XG4iCisiaXMgYWxyZWFkeSB1bnJvbGxlZC5cbiIKKyJcbiIKKyJOb3RlIHRoYXQgdGhpcyBtb2RlIGNhbiBldmVudHVhbGx5IGJlIGEgbGl0dGxlIG1vcmUgQ1BVIGV4cGVuc2l2ZVxuIgorIihlc3BlY2lhbGx5IHdpdGggYSBsYXJnZXIgbnVtYmVyIG9mIHVucm9sbGVkIGNhdGVnb3JpZXMpIHRoYW4gdGhlXG4iCisiZGVmYXVsdCBtb2RlLlxuIiksCittZW51X2luc3RydWN0aW9uc1tdID0gTl8oCisJIkFycm93IGtleXMgbmF2aWdhdGUgdGhlIG1lbnUuICAiCisJIjxFbnRlcj4gc2VsZWN0cyBzdWJtZW51cyAtLS0+LiAgIgorCSJIaWdobGlnaHRlZCBsZXR0ZXJzIGFyZSBob3RrZXlzLiAgIgorCSJQcmVzc2luZyA8WT4gaW5jbHVkZXMsIDxOPiBleGNsdWRlcywgPE0+IG1vZHVsYXJpemVzIGZlYXR1cmVzLiAgIgorCSJQcmVzcyA8RXNjPjxFc2M+IHRvIGV4aXQsIDw/PiBmb3IgSGVscCwgPC8+IGZvciBTZWFyY2guICAiCisJIkxlZ2VuZDogWypdIGJ1aWx0LWluICBbIF0gZXhjbHVkZWQgIDxNPiBtb2R1bGUgIDwgPiBtb2R1bGUgY2FwYWJsZSIpLAorcmFkaW9saXN0X2luc3RydWN0aW9uc1tdID0gTl8oCisJIlVzZSB0aGUgYXJyb3cga2V5cyB0byBuYXZpZ2F0ZSB0aGlzIHdpbmRvdyBvciAiCisJInByZXNzIHRoZSBob3RrZXkgb2YgdGhlIGl0ZW0geW91IHdpc2ggdG8gc2VsZWN0ICIKKwkiZm9sbG93ZWQgYnkgdGhlIDxTUEFDRSBCQVI+LiAiCisJIlByZXNzIDw/PiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9wdGlvbi4iKSwKK2lucHV0Ym94X2luc3RydWN0aW9uc19pbnRbXSA9IE5fKAorCSJQbGVhc2UgZW50ZXIgYSBkZWNpbWFsIHZhbHVlLiAiCisJIkZyYWN0aW9ucyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4gICIKKwkiVXNlIHRoZSA8VEFCPiBrZXkgdG8gbW92ZSBmcm9tIHRoZSBpbnB1dCBmaWVsZCB0byB0aGUgYnV0dG9ucyBiZWxvdyBpdC4iKSwKK2lucHV0Ym94X2luc3RydWN0aW9uc19oZXhbXSA9IE5fKAorCSJQbGVhc2UgZW50ZXIgYSBoZXhhZGVjaW1hbCB2YWx1ZS4gIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX3N0cmluZ1tdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIHN0cmluZyB2YWx1ZS4gIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIpLAorc2V0bW9kX3RleHRbXSA9IE5fKAorCSJUaGlzIGZlYXR1cmUgZGVwZW5kcyBvbiBhbm90aGVyIHdoaWNoIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUuXG4iCisJIkFzIGEgcmVzdWx0LCB0aGlzIGZlYXR1cmUgd2lsbCBiZSBidWlsdCBhcyBhIG1vZHVsZS4iKSwKK25vaGVscF90ZXh0W10gPSBOXygKKwkiVGhlcmUgaXMgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uLlxuIiksCitsb2FkX2NvbmZpZ190ZXh0W10gPSBOXygKKwkiRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB5b3Ugd2lzaCB0byBsb2FkLiAgIgorCSJBY2NlcHQgdGhlIG5hbWUgc2hvd24gdG8gcmVzdG9yZSB0aGUgY29uZmlndXJhdGlvbiB5b3UgIgorCSJsYXN0IHJldHJpZXZlZC4gIExlYXZlIGJsYW5rIHRvIGFib3J0LiIpLAorbG9hZF9jb25maWdfaGVscFtdID0gTl8oCisJIlxuIgorCSJGb3IgdmFyaW91cyByZWFzb25zLCBvbmUgbWF5IHdpc2ggdG8ga2VlcCBzZXZlcmFsIGRpZmZlcmVudFxuIgorCSJjb25maWd1cmF0aW9ucyBhdmFpbGFibGUgb24gYSBzaW5nbGUgbWFjaGluZS5cbiIKKwkiXG4iCisJIklmIHlvdSBoYXZlIHNhdmVkIGEgcHJldmlvdXMgY29uZmlndXJhdGlvbiBpbiBhIGZpbGUgb3RoZXIgdGhhblxuIgorCSJkZWZhdWx0LCBlbnRlcmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBoZXJlIHdpbGwgYWxsb3cgeW91XG4iCisJInRvIG1vZGlmeSB0aGF0IGNvbmZpZ3VyYXRpb24uXG4iCisJIlxuIgorCSJJZiB5b3UgYXJlIHVuY2VydGFpbiwgdGhlbiB5b3UgaGF2ZSBwcm9iYWJseSBuZXZlciB1c2VkIGFsdGVybmF0ZVxuIgorCSJjb25maWd1cmF0aW9uIGZpbGVzLiAgWW91IHNob3VsZCB0aGVyZWZvciBsZWF2ZSB0aGlzIGJsYW5rIHRvIGFib3J0LlxuIiksCitzYXZlX2NvbmZpZ190ZXh0W10gPSBOXygKKwkiRW50ZXIgYSBmaWxlbmFtZSB0byB3aGljaCB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHNhdmVkICIKKwkiYXMgYW4gYWx0ZXJuYXRlLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiksCitzYXZlX2NvbmZpZ19oZWxwW10gPSBOXygKKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIGRpZmZlcmVudFxuIgorCSJjb25maWd1cmF0aW9ucyBhdmFpbGFibGUgb24gYSBzaW5nbGUgbWFjaGluZS5cbiIKKwkiXG4iCisJIkVudGVyaW5nIGEgZmlsZSBuYW1lIGhlcmUgd2lsbCBhbGxvdyB5b3UgdG8gbGF0ZXIgcmV0cmlldmUsIG1vZGlmeVxuIgorCSJhbmQgdXNlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYXMgYW4gYWx0ZXJuYXRlIHRvIHdoYXRldmVyXG4iCisJImNvbmZpZ3VyYXRpb24gb3B0aW9ucyB5b3UgaGF2ZSBzZWxlY3RlZCBhdCB0aGF0IHRpbWUuXG4iCisJIlxuIgorCSJJZiB5b3UgYXJlIHVuY2VydGFpbiB3aGF0IGFsbCB0aGlzIG1lYW5zIHRoZW4geW91IHNob3VsZCBwcm9iYWJseVxuIgorCSJsZWF2ZSB0aGlzIGJsYW5rLlxuIiksCitzZWFyY2hfaGVscFtdID0gTl8oCisJIlxuIgorCSJTZWFyY2ggZm9yIENPTkZJR18gc3ltYm9scyBhbmQgZGlzcGxheSB0aGVpciByZWxhdGlvbnMuXG4iCisJIlJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGFsbG93ZWQuXG4iCisJIkV4YW1wbGU6IHNlYXJjaCBmb3IgXCJeRk9PXCJcbiIKKwkiUmVzdWx0OlxuIgorCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCSJTeW1ib2w6IEZPTyBbPW1dXG4iCisJIlByb21wdDogRm9vIGJ1cyBpcyB1c2VkIHRvIGRyaXZlIHRoZSBiYXIgSFdcbiIKKwkiRGVmaW5lZCBhdCBkcml2ZXJzL3BjaS9LY29uZmlnOjQ3XG4iCisJIkRlcGVuZHMgb246IFg4Nl9MT0NBTF9BUElDICYmIFg4Nl9JT19BUElDIHx8IElBNjRcbiIKKwkiTG9jYXRpb246XG4iCisJIiAgLT4gQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSlcbiIKKwkiICAgIC0+IFBDSSBzdXBwb3J0IChQQ0kgWz15XSlcbiIKKwkiICAgICAgLT4gUENJIGFjY2VzcyBtb2RlICg8Y2hvaWNlPiBbPXldKVxuIgorCSJTZWxlY3RzOiBMSUJDUkMzMlxuIgorCSJTZWxlY3RlZCBieTogQkFSXG4iCisJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJIm8gVGhlIGxpbmUgJ1Byb21wdDonIHNob3dzIHRoZSB0ZXh0IHVzZWQgaW4gdGhlIG1lbnUgc3RydWN0dXJlIGZvclxuIgorCSIgIHRoaXMgQ09ORklHXyBzeW1ib2xcbiIKKwkibyBUaGUgJ0RlZmluZWQgYXQnIGxpbmUgdGVsbCBhdCB3aGF0IGZpbGUgLyBsaW5lIG51bWJlciB0aGUgc3ltYm9sXG4iCisJIiAgaXMgZGVmaW5lZFxuIgorCSJvIFRoZSAnRGVwZW5kcyBvbjonIGxpbmUgdGVsbCB3aGF0IHN5bWJvbHMgbmVlZHMgdG8gYmUgZGVmaW5lZCBmb3JcbiIKKwkiICB0aGlzIHN5bWJvbCB0byBiZSB2aXNpYmxlIGluIHRoZSBtZW51IChzZWxlY3RhYmxlKVxuIgorCSJvIFRoZSAnTG9jYXRpb246JyBsaW5lcyB0ZWxsIHdoZXJlIGluIHRoZSBtZW51IHN0cnVjdHVyZSB0aGlzIHN5bWJvbFxuIgorCSIgIGlzIGxvY2F0ZWRcbiIKKwkiICAgIEEgbG9jYXRpb24gZm9sbG93ZWQgYnkgYSBbPXldIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHNlbGVjdGFibGVcbiIKKwkiICAgIG1lbnUgaXRlbSAtIGFuZCBjdXJyZW50IHZhbHVlIGlzIGRpc3BsYXllZCBpbnNpZGUgYnJhY2tldHMuXG4iCisJIm8gVGhlICdTZWxlY3RzOicgbGluZSB0ZWxsIHdoYXQgc3ltYm9sIHdpbGwgYmUgYXV0b21hdGljYWxseVxuIgorCSIgIHNlbGVjdGVkIGlmIHRoaXMgc3ltYm9sIGlzIHNlbGVjdGVkICh5IG9yIG0pXG4iCisJIm8gVGhlICdTZWxlY3RlZCBieScgbGluZSB0ZWxsIHdoYXQgc3ltYm9sIGhhcyBzZWxlY3RlZCB0aGlzIHN5bWJvbFxuIgorCSJcbiIKKwkiT25seSByZWxldmFudCBsaW5lcyBhcmUgc2hvd24uXG4iCisJIlxuXG4iCisJIlNlYXJjaCBleGFtcGxlczpcbiIKKwkiRXhhbXBsZXM6IFVTQgk9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgY29udGFpbmluZyBVU0JcbiIKKwkiICAgICAgICAgIF5VU0IgPT4gZmluZCBhbGwgQ09ORklHXyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggVVNCXG4iCisJIiAgICAgICAgICBVU0IkID0+IGZpbmQgYWxsIENPTkZJR18gc3ltYm9scyBlbmRpbmcgd2l0aCBVU0JcbiIKKwkiXG4iKTsKKworc3RhdGljIGNoYXIgYnVmWzQwOTYqMTBdLCAqYnVmcHRyID0gYnVmOworc3RhdGljIGNoYXIgaW5wdXRfYnVmWzQwOTZdOworc3RhdGljIGNvbnN0IGNoYXIgZmlsZW5hbWVbXSA9ICIuY29uZmlnIjsKK3N0YXRpYyBjaGFyICphcmdzWzEwMjRdLCAqKmFyZ3B0ciA9IGFyZ3M7CitzdGF0aWMgaW50IGluZGVudDsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyBpb3Nfb3JnOworc3RhdGljIGludCByb3dzID0gMCwgY29scyA9IDA7CitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudTsKK3N0YXRpYyBpbnQgY2hpbGRfY291bnQ7CitzdGF0aWMgaW50IGRvX3Jlc2l6ZTsKK3N0YXRpYyBpbnQgc2luZ2xlX21lbnVfbW9kZTsKKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjb25mX2Nob2ljZShzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjb25mX3N0cmluZyhzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjb25mX2xvYWQodm9pZCk7CitzdGF0aWMgdm9pZCBjb25mX3NhdmUodm9pZCk7CitzdGF0aWMgdm9pZCBzaG93X3RleHRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQsIGludCByLCBpbnQgYyk7CitzdGF0aWMgdm9pZCBzaG93X2hlbHB0ZXh0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KTsKK3N0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBzaG93X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgciwgaW50IGMpOworCitzdGF0aWMgdm9pZCBjcHJpbnRfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgY3ByaW50MShjb25zdCBjaGFyICpmbXQsIC4uLik7CitzdGF0aWMgdm9pZCBjcHJpbnRfZG9uZSh2b2lkKTsKK3N0YXRpYyBpbnQgY3ByaW50KGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworc3RhdGljIHZvaWQgaW5pdF93c2l6ZSh2b2lkKQoreworCXN0cnVjdCB3aW5zaXplIHdzOworCWNoYXIgKmVudjsKKworCWlmICghaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DR1dJTlNaLCAmd3MpKSB7CisJCXJvd3MgPSB3cy53c19yb3c7CisJCWNvbHMgPSB3cy53c19jb2w7CisJfQorCisJaWYgKCFyb3dzKSB7CisJCWVudiA9IGdldGVudigiTElORVMiKTsKKwkJaWYgKGVudikKKwkJCXJvd3MgPSBhdG9pKGVudik7CisJCWlmICghcm93cykKKwkJCXJvd3MgPSAyNDsKKwl9CisJaWYgKCFjb2xzKSB7CisJCWVudiA9IGdldGVudigiQ09MVU1OUyIpOworCQlpZiAoZW52KQorCQkJY29scyA9IGF0b2koZW52KTsKKwkJaWYgKCFjb2xzKQorCQkJY29scyA9IDgwOworCX0KKworCWlmIChyb3dzIDwgMTkgfHwgY29scyA8IDgwKSB7CisJCWZwcmludGYoc3RkZXJyLCBOXygiWW91ciBkaXNwbGF5IGlzIHRvbyBzbWFsbCB0byBydW4gTWVudWNvbmZpZyFcbiIpKTsKKwkJZnByaW50ZihzdGRlcnIsIE5fKCJJdCBtdXN0IGJlIGF0IGxlYXN0IDE5IGxpbmVzIGJ5IDgwIGNvbHVtbnMuXG4iKSk7CisJCWV4aXQoMSk7CisJfQorCisJcm93cyAtPSA0OworCWNvbHMgLT0gNTsKK30KKworc3RhdGljIHZvaWQgY3ByaW50X2luaXQodm9pZCkKK3sKKwlidWZwdHIgPSBidWY7CisJYXJncHRyID0gYXJnczsKKwltZW1zZXQoYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlpbmRlbnQgPSAwOworCWNoaWxkX2NvdW50ID0gMDsKKwljcHJpbnQoIi4vc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2x4ZGlhbG9nIik7CisJY3ByaW50KCItLWJhY2t0aXRsZSIpOworCWNwcmludChtZW51X2JhY2t0aXRsZSk7Cit9CisKK3N0YXRpYyBpbnQgY3ByaW50MShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXM7CisKKwlpZiAoISphcmdwdHIpCisJCSphcmdwdHIgPSBidWZwdHI7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmVzID0gdnNwcmludGYoYnVmcHRyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWJ1ZnB0ciArPSByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBjcHJpbnRfZG9uZSh2b2lkKQoreworCSpidWZwdHIrKyA9IDA7CisJYXJncHRyKys7Cit9CisKK3N0YXRpYyBpbnQgY3ByaW50KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJlczsKKworCSphcmdwdHIrKyA9IGJ1ZnB0cjsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXMgPSB2c3ByaW50ZihidWZwdHIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJYnVmcHRyICs9IHJlczsKKwkqYnVmcHRyKysgPSAwOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgZ2V0X3Byb21wdF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgbWVudSAqc3VibWVudVs4XSwgKm1lbnU7CisKKwlzdHJfcHJpbnRmKHIsICJQcm9tcHQ6ICVzXG4iLCBwcm9wLT50ZXh0KTsKKwlzdHJfcHJpbnRmKHIsICIgIERlZmluZWQgYXQgJXM6JWRcbiIsIHByb3AtPm1lbnUtPmZpbGUtPm5hbWUsCisJCXByb3AtPm1lbnUtPmxpbmVubyk7CisJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCXN0cl9hcHBlbmQociwgIiAgRGVwZW5kcyBvbjogIik7CisJCWV4cHJfZ3N0cl9wcmludChwcm9wLT52aXNpYmxlLmV4cHIsIHIpOworCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCX0KKwltZW51ID0gcHJvcC0+bWVudS0+cGFyZW50OworCWZvciAoaSA9IDA7IG1lbnUgIT0gJnJvb3RtZW51ICYmIGkgPCA4OyBtZW51ID0gbWVudS0+cGFyZW50KQorCQlzdWJtZW51W2krK10gPSBtZW51OworCWlmIChpID4gMCkgeworCQlzdHJfcHJpbnRmKHIsICIgIExvY2F0aW9uOlxuIik7CisJCWZvciAoaiA9IDQ7IC0taSA+PSAwOyBqICs9IDIpIHsKKwkJCW1lbnUgPSBzdWJtZW51W2ldOworCQkJc3RyX3ByaW50ZihyLCAiJSpjLT4gJXMiLCBqLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCQlpZiAobWVudS0+c3ltKSB7CisJCQkJc3RyX3ByaW50ZihyLCAiICglcyBbPSVzXSkiLCBtZW51LT5zeW0tPm5hbWUgPworCQkJCQltZW51LT5zeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCQkJCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJCX0KKwkJCXN0cl9hcHBlbmQociwgIlxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zeW1ib2xfc3RyKHN0cnVjdCBnc3RyICpyLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJYm9vbCBoaXQ7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJc3RyX3ByaW50ZihyLCAiU3ltYm9sOiAlcyBbPSVzXVxuIiwgc3ltLT5uYW1lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKwlmb3JfYWxsX3Byb21wdHMoc3ltLCBwcm9wKQorCQlnZXRfcHJvbXB0X3N0cihyLCBwcm9wKTsKKwloaXQgPSBmYWxzZTsKKwlmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBwcm9wLCBQX1NFTEVDVCkgeworCQlpZiAoIWhpdCkgeworCQkJc3RyX2FwcGVuZChyLCAiICBTZWxlY3RzOiAiKTsKKwkJCWhpdCA9IHRydWU7CisJCX0gZWxzZQorCQkJc3RyX3ByaW50ZihyLCAiICYmICIpOworCQlleHByX2dzdHJfcHJpbnQocHJvcC0+ZXhwciwgcik7CisJfQorCWlmIChoaXQpCisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJaWYgKHN5bS0+cmV2X2RlcC5leHByKSB7CisJCXN0cl9hcHBlbmQociwgIiAgU2VsZWN0ZWQgYnk6ICIpOworCQlleHByX2dzdHJfcHJpbnQoc3ltLT5yZXZfZGVwLmV4cHIsIHIpOworCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCX0KKwlzdHJfYXBwZW5kKHIsICJcblxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3N0ciBnZXRfcmVsYXRpb25zX3N0cihzdHJ1Y3Qgc3ltYm9sICoqc3ltX2FycikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IGdzdHIgcmVzID0gc3RyX25ldygpOworCWludCBpOworCisJZm9yIChpID0gMDsgc3ltX2FyciAmJiAoc3ltID0gc3ltX2FycltpXSk7IGkrKykKKwkJZ2V0X3N5bWJvbF9zdHIoJnJlcywgc3ltKTsKKwlpZiAoIWkpCisJCXN0cl9hcHBlbmQoJnJlcywgIk5vIG1hdGNoZXMgZm91bmQuXG4iKTsKKwlyZXR1cm4gcmVzOworfQorCitwaWRfdCBwaWQ7CisKK3N0YXRpYyB2b2lkIHdpbmNoX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpZiAoIWRvX3Jlc2l6ZSkgeworCQlraWxsKHBpZCwgU0lHSU5UKTsKKwkJZG9fcmVzaXplID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXhlY19jb25mKHZvaWQpCit7CisJaW50IHBpcGVmZFsyXSwgc3RhdCwgc2l6ZTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCXNpZ3NldF90IHNzZXQsIG9zc2V0OworCisJc2lnZW1wdHlzZXQoJnNzZXQpOworCXNpZ2FkZHNldCgmc3NldCwgU0lHSU5UKTsKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzc2V0LCAmb3NzZXQpOworCisJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisKKwlzYS5zYV9oYW5kbGVyID0gd2luY2hfaGFuZGxlcjsKKwlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOworCXNpZ2FjdGlvbihTSUdXSU5DSCwgJnNhLCBOVUxMKTsKKworCSphcmdwdHIrKyA9IE5VTEw7CisKKwlwaXBlKHBpcGVmZCk7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9zc2V0LCBOVUxMKTsKKwkJZHVwMihwaXBlZmRbMV0sIDIpOworCQljbG9zZShwaXBlZmRbMF0pOworCQljbG9zZShwaXBlZmRbMV0pOworCQlleGVjdihhcmdzWzBdLCBhcmdzKTsKKwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwljbG9zZShwaXBlZmRbMV0pOworCWJ1ZnB0ciA9IGlucHV0X2J1ZjsKKwl3aGlsZSAoMSkgeworCQlzaXplID0gaW5wdXRfYnVmICsgc2l6ZW9mKGlucHV0X2J1ZikgLSBidWZwdHI7CisJCXNpemUgPSByZWFkKHBpcGVmZFswXSwgYnVmcHRyLCBzaXplKTsKKwkJaWYgKHNpemUgPD0gMCkgeworCQkJaWYgKHNpemUgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikKKwkJCQkJY29udGludWU7CisJCQkJcGVycm9yKCJyZWFkIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlidWZwdHIgKz0gc2l6ZTsKKwl9CisJKmJ1ZnB0cisrID0gMDsKKwljbG9zZShwaXBlZmRbMF0pOworCXdhaXRwaWQocGlkLCAmc3RhdCwgMCk7CisKKwlpZiAoZG9fcmVzaXplKSB7CisJCWluaXRfd3NpemUoKTsKKwkJZG9fcmVzaXplID0gMDsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvc3NldCwgTlVMTCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKFdJRlNJR05BTEVEKHN0YXQpKSB7CisJCXByaW50ZigiXGZpbnRlcnJ1cHRlZCglZClcbiIsIFdURVJNU0lHKHN0YXQpKTsKKwkJZXhpdCgxKTsKKwl9CisjaWYgMAorCXByaW50ZigiXGZleGl0IHN0YXRlOiAlZFxuZXhpdCBkYXRhOiAnJXMnXG4iLCBXRVhJVFNUQVRVUyhzdGF0KSwgaW5wdXRfYnVmKTsKKwlzbGVlcCgxKTsKKyNlbmRpZgorCXNpZ3BlbmRpbmcoJnNzZXQpOworCWlmIChzaWdpc21lbWJlcigmc3NldCwgU0lHSU5UKSkgeworCQlwcmludGYoIlxmaW50ZXJydXB0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9zc2V0LCBOVUxMKTsKKworCXJldHVybiBXRVhJVFNUQVRVUyhzdGF0KTsKK30KKworc3RhdGljIHZvaWQgc2VhcmNoX2NvbmYodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICoqc3ltX2FycjsKKwlpbnQgc3RhdDsKKwlzdHJ1Y3QgZ3N0ciByZXM7CisKK2FnYWluOgorCWNwcmludF9pbml0KCk7CisJY3ByaW50KCItLXRpdGxlIik7CisJY3ByaW50KF8oIlNlYXJjaCBDb25maWd1cmF0aW9uIFBhcmFtZXRlciIpKTsKKwljcHJpbnQoIi0taW5wdXRib3giKTsKKwljcHJpbnQoXygiRW50ZXIgQ09ORklHXyAoc3ViKXN0cmluZyB0byBzZWFyY2ggZm9yIChvbWl0IENPTkZJR18pIikpOworCWNwcmludCgiMTAiKTsKKwljcHJpbnQoIjc1Iik7CisJY3ByaW50KCIiKTsKKwlzdGF0ID0gZXhlY19jb25mKCk7CisJaWYgKHN0YXQgPCAwKQorCQlnb3RvIGFnYWluOworCXN3aXRjaCAoc3RhdCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzaG93X2hlbHB0ZXh0KF8oIlNlYXJjaCBDb25maWd1cmF0aW9uIiksIHNlYXJjaF9oZWxwKTsKKwkJZ290byBhZ2FpbjsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJc3ltX2FyciA9IHN5bV9yZV9zZWFyY2goaW5wdXRfYnVmKTsKKwlyZXMgPSBnZXRfcmVsYXRpb25zX3N0cihzeW1fYXJyKTsKKwlmcmVlKHN5bV9hcnIpOworCXNob3dfdGV4dGJveChfKCJTZWFyY2ggUmVzdWx0cyIpLCBzdHJfZ2V0KCZyZXMpLCAwLCAwKTsKKwlzdHJfZnJlZSgmcmVzKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKwlpbnQgdHlwZSwgdG1wLCBkb2ludCA9IDI7CisJdHJpc3RhdGUgdmFsOworCWNoYXIgY2g7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCXByb3AgPSBtZW51LT5wcm9tcHQ7CisJaWYgKCFzeW0pIHsKKwkJaWYgKHByb3AgJiYgbWVudSAhPSBjdXJyZW50X21lbnUpIHsKKwkJCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJY2FzZSBQX01FTlU6CisJCQkJY2hpbGRfY291bnQrKzsKKwkJCQljcHJpbnQoIm0lcCIsIG1lbnUpOworCisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUpIHsKKwkJCQkJY3ByaW50MSgiJXMlKmMlcyIsCisJCQkJCQltZW51LT5kYXRhID8gIi0tPiIgOiAiKys+IiwKKwkJCQkJCWluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKwkJCQl9IGVsc2UKKwkJCQkJY3ByaW50MSgiICAgJSpjJXMgIC0tLT4iLCBpbmRlbnQgKyAxLCAnICcsIHByb21wdCk7CisKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWlmIChzaW5nbGVfbWVudV9tb2RlICYmIG1lbnUtPmRhdGEpCisJCQkJCWdvdG8gY29uZl9jaGlsZHM7CisJCQkJcmV0dXJuOworCQkJZGVmYXVsdDoKKwkJCQlpZiAocHJvbXB0KSB7CisJCQkJCWNoaWxkX2NvdW50Kys7CisJCQkJCWNwcmludCgiOiVwIiwgbWVudSk7CisJCQkJCWNwcmludCgiLS0tJSpjJXMiLCBpbmRlbnQgKyAxLCAnICcsIHByb21wdCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCWRvaW50ID0gMDsKKwkJZ290byBjb25mX2NoaWxkczsKKwl9CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQlzdHJ1Y3Qgc3ltYm9sICpkZWZfc3ltID0gc3ltX2dldF9jaG9pY2VfdmFsdWUoc3ltKTsKKwkJc3RydWN0IG1lbnUgKmRlZl9tZW51ID0gTlVMTDsKKworCQljaGlsZF9jb3VudCsrOworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpICYmIGNoaWxkLT5zeW0gPT0gZGVmX3N5bSkKKwkJCQlkZWZfbWVudSA9IGNoaWxkOworCQl9CisKKwkJdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKSB7CisJCQljcHJpbnQoInQlcCIsIG1lbnUpOworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCQljcHJpbnQxKCJbJWNdIiwgdmFsID09IG5vID8gJyAnIDogJyonKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgeWVzOiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJY2FzZSBtb2Q6IGNoID0gJ00nOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgY2ggPSAnICc7IGJyZWFrOworCQkJCX0KKwkJCQljcHJpbnQxKCI8JWM+IiwgY2gpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJY3ByaW50KCIlYyVwIiwgZGVmX21lbnUgPyAndCcgOiAnOicsIG1lbnUpOworCQkJY3ByaW50MSgiICAgIik7CisJCX0KKworCQljcHJpbnQxKCIlKmMlcyIsIGluZGVudCArIDEsICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJaWYgKHZhbCA9PSB5ZXMpIHsKKwkJCWlmIChkZWZfbWVudSkgeworCQkJCWNwcmludDEoIiAoJXMpIiwgbWVudV9nZXRfcHJvbXB0KGRlZl9tZW51KSk7CisJCQkJY3ByaW50MSgiICAtLS0+Iik7CisJCQkJY3ByaW50X2RvbmUoKTsKKwkJCQlpZiAoZGVmX21lbnUtPmxpc3QpIHsKKwkJCQkJaW5kZW50ICs9IDI7CisJCQkJCWJ1aWxkX2NvbmYoZGVmX21lbnUpOworCQkJCQlpbmRlbnQgLT0gMjsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJcmV0dXJuOworCQl9CisJCWNwcmludF9kb25lKCk7CisJfSBlbHNlIHsKKwkJaWYgKG1lbnUgPT0gY3VycmVudF9tZW51KSB7CisJCQljcHJpbnQoIjolcCIsIG1lbnUpOworCQkJY3ByaW50KCItLS0lKmMlcyIsIGluZGVudCArIDEsICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJCWdvdG8gY29uZl9jaGlsZHM7CisJCX0KKwkJY2hpbGRfY291bnQrKzsKKwkJdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHZhbCA9PSB5ZXMpIHsKKwkJCWNwcmludCgiOiVwIiwgbWVudSk7CisJCQljcHJpbnQxKCIgICAiKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJY3ByaW50KCJ0JXAiLCBtZW51KTsKKwkJCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKQorCQkJCQljcHJpbnQxKCJbJWNdIiwgdmFsID09IG5vID8gJyAnIDogJyonKTsKKwkJCQllbHNlCisJCQkJCWNwcmludDEoIi0tLSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWNwcmludCgidCVwIiwgbWVudSk7CisJCQkJc3dpdGNoICh2YWwpIHsKKwkJCQljYXNlIHllczogY2ggPSAnKic7IGJyZWFrOworCQkJCWNhc2UgbW9kOiBjaCA9ICdNJzsgYnJlYWs7CisJCQkJZGVmYXVsdDogIGNoID0gJyAnOyBicmVhazsKKwkJCQl9CisJCQkJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkKKwkJCQkJY3ByaW50MSgiPCVjPiIsIGNoKTsKKwkJCQllbHNlCisJCQkJCWNwcmludDEoIi0tLSIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljcHJpbnQoInMlcCIsIG1lbnUpOworCQkJCXRtcCA9IGNwcmludDEoIiglcykiLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKwkJCQl0bXAgPSBpbmRlbnQgLSB0bXAgKyA0OworCQkJCWlmICh0bXAgPCAwKQorCQkJCQl0bXAgPSAwOworCQkJCWNwcmludDEoIiUqYyVzJXMiLCB0bXAsICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpLAorCQkJCQkoc3ltX2hhc192YWx1ZShzeW0pIHx8ICFzeW1faXNfY2hhbmdhYmxlKHN5bSkpID8KKwkJCQkJIiIgOiAiIChORVcpIik7CisJCQkJY3ByaW50X2RvbmUoKTsKKwkJCQlnb3RvIGNvbmZfY2hpbGRzOworCQkJfQorCQl9CisJCWNwcmludDEoIiUqYyVzJXMiLCBpbmRlbnQgKyAxLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKKwkJCShzeW1faGFzX3ZhbHVlKHN5bSkgfHwgIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgPworCQkJIiIgOiAiIChORVcpIik7CisJCWlmIChtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKSB7CisJCQljcHJpbnQxKCIgIC0tLT4iKTsKKwkJCWNwcmludF9kb25lKCk7CisJCQlyZXR1cm47CisJCX0KKwkJY3ByaW50X2RvbmUoKTsKKwl9CisKK2NvbmZfY2hpbGRzOgorCWluZGVudCArPSBkb2ludDsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWJ1aWxkX2NvbmYoY2hpbGQpOworCWluZGVudCAtPSBkb2ludDsKK30KKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqc3VibWVudTsKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWNoYXIgYWN0aXZlX2VudHJ5WzQwXTsKKwlpbnQgc3RhdCwgdHlwZSwgaTsKKworCXVubGluaygibHhkaWFsb2cuc2NybHRtcCIpOworCWFjdGl2ZV9lbnRyeVswXSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLXRpdGxlIik7CisJCWNwcmludCgiJXMiLCBwcm9tcHQgPyBwcm9tcHQgOiBfKCJNYWluIE1lbnUiKSk7CisJCWNwcmludCgiLS1tZW51Iik7CisJCWNwcmludChfKG1lbnVfaW5zdHJ1Y3Rpb25zKSk7CisJCWNwcmludCgiJWQiLCByb3dzKTsKKwkJY3ByaW50KCIlZCIsIGNvbHMpOworCQljcHJpbnQoIiVkIiwgcm93cyAtIDEwKTsKKwkJY3ByaW50KCIlcyIsIGFjdGl2ZV9lbnRyeSk7CisJCWN1cnJlbnRfbWVudSA9IG1lbnU7CisJCWJ1aWxkX2NvbmYobWVudSk7CisJCWlmICghY2hpbGRfY291bnQpCisJCQlicmVhazsKKwkJaWYgKG1lbnUgPT0gJnJvb3RtZW51KSB7CisJCQljcHJpbnQoIjoiKTsKKwkJCWNwcmludCgiLS0tICIpOworCQkJY3ByaW50KCJMIik7CisJCQljcHJpbnQoXygiICAgIExvYWQgYW4gQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24gRmlsZSIpKTsKKwkJCWNwcmludCgiUyIpOworCQkJY3ByaW50KF8oIiAgICBTYXZlIENvbmZpZ3VyYXRpb24gdG8gYW4gQWx0ZXJuYXRlIEZpbGUiKSk7CisJCX0KKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlpZiAoc3RhdCA8IDApCisJCQljb250aW51ZTsKKworCQlpZiAoc3RhdCA9PSAxIHx8IHN0YXQgPT0gMjU1KQorCQkJYnJlYWs7CisKKwkJdHlwZSA9IGlucHV0X2J1ZlswXTsKKwkJaWYgKCF0eXBlKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaW5wdXRfYnVmW2ldICYmICFpc3NwYWNlKGlucHV0X2J1ZltpXSk7IGkrKykKKwkJCTsKKwkJaWYgKGkgPj0gc2l6ZW9mKGFjdGl2ZV9lbnRyeSkpCisJCQlpID0gc2l6ZW9mKGFjdGl2ZV9lbnRyeSkgLSAxOworCQlpbnB1dF9idWZbaV0gPSAwOworCQlzdHJjcHkoYWN0aXZlX2VudHJ5LCBpbnB1dF9idWYpOworCisJCXN5bSA9IE5VTEw7CisJCXN1Ym1lbnUgPSBOVUxMOworCQlpZiAoc3NjYW5mKGlucHV0X2J1ZiArIDEsICIlcCIsICZzdWJtZW51KSA9PSAxKQorCQkJc3ltID0gc3VibWVudS0+c3ltOworCisJCXN3aXRjaCAoc3RhdCkgeworCQljYXNlIDA6CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgJ20nOgorCQkJCWlmIChzaW5nbGVfbWVudV9tb2RlKQorCQkJCQlzdWJtZW51LT5kYXRhID0gKHZvaWQgKikgKGxvbmcpICFzdWJtZW51LT5kYXRhOworCQkJCWVsc2UKKwkJCQkJY29uZihzdWJtZW51KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pID09IHllcykKKwkJCQkJY29uZl9jaG9pY2Uoc3VibWVudSk7CisJCQkJZWxzZSBpZiAoc3VibWVudS0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkKKwkJCQkJY29uZihzdWJtZW51KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCWNvbmZfc3RyaW5nKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQkJY29uZl9sb2FkKCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdTJzoKKwkJCQljb25mX3NhdmUoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpZiAoc3ltKQorCQkJCXNob3dfaGVscChzdWJtZW51KTsKKwkJCWVsc2UKKwkJCQlzaG93X2hlbHB0ZXh0KCJSRUFETUUiLCBfKG1jb25mX3JlYWRtZSkpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWlmICh0eXBlID09ICd0JykgeworCQkJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgeWVzKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBtb2QpKQorCQkJCQlzaG93X3RleHRib3goTlVMTCwgc2V0bW9kX3RleHQsIDYsIDc0KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlpZiAodHlwZSA9PSAndCcpCisJCQkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5vKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlpZiAodHlwZSA9PSAndCcpCisJCQkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG1vZCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJaWYgKHR5cGUgPT0gJ3QnKQorCQkJCXN5bV90b2dnbGVfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJCWVsc2UgaWYgKHR5cGUgPT0gJ20nKQorCQkJCWNvbmYoc3VibWVudSk7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJc2VhcmNoX2NvbmYoKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3RleHRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQsIGludCByLCBpbnQgYykKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IGNyZWF0KCIuaGVscC50bXAiLCAwNzc3KTsKKwl3cml0ZShmZCwgdGV4dCwgc3RybGVuKHRleHQpKTsKKwljbG9zZShmZCk7CisJc2hvd19maWxlKCIuaGVscC50bXAiLCB0aXRsZSwgciwgYyk7CisJdW5saW5rKCIuaGVscC50bXAiKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19oZWxwdGV4dChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzaG93X3RleHRib3godGl0bGUsIHRleHQsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IGdzdHIgaGVscCA9IHN0cl9uZXcoKTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisKKwlpZiAoc3ltLT5oZWxwKQorCXsKKwkJaWYgKHN5bS0+bmFtZSkgeworCQkJc3RyX3ByaW50ZigmaGVscCwgIkNPTkZJR18lczpcblxuIiwgc3ltLT5uYW1lKTsKKwkJCXN0cl9hcHBlbmQoJmhlbHAsIF8oc3ltLT5oZWxwKSk7CisJCQlzdHJfYXBwZW5kKCZoZWxwLCAiXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cl9hcHBlbmQoJmhlbHAsIG5vaGVscF90ZXh0KTsKKwl9CisJZ2V0X3N5bWJvbF9zdHIoJmhlbHAsIHN5bSk7CisJc2hvd19oZWxwdGV4dChtZW51X2dldF9wcm9tcHQobWVudSksIHN0cl9nZXQoJmhlbHApKTsKKwlzdHJfZnJlZSgmaGVscCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqdGl0bGUsIGludCByLCBpbnQgYykKK3sKKwlkbyB7CisJCWNwcmludF9pbml0KCk7CisJCWlmICh0aXRsZSkgeworCQkJY3ByaW50KCItLXRpdGxlIik7CisJCQljcHJpbnQoIiVzIiwgdGl0bGUpOworCQl9CisJCWNwcmludCgiLS10ZXh0Ym94Iik7CisJCWNwcmludCgiJXMiLCBmaWxlbmFtZSk7CisJCWNwcmludCgiJWQiLCByID8gciA6IHJvd3MpOworCQljcHJpbnQoIiVkIiwgYyA/IGMgOiBjb2xzKTsKKwl9IHdoaWxlIChleGVjX2NvbmYoKSA8IDApOworfQorCitzdGF0aWMgdm9pZCBjb25mX2Nob2ljZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0cnVjdCBzeW1ib2wgKmFjdGl2ZTsKKwlpbnQgc3RhdDsKKworCWFjdGl2ZSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKG1lbnUtPnN5bSk7CisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLXRpdGxlIik7CisJCWNwcmludCgiJXMiLCBwcm9tcHQgPyBwcm9tcHQgOiBfKCJNYWluIE1lbnUiKSk7CisJCWNwcmludCgiLS1yYWRpb2xpc3QiKTsKKwkJY3ByaW50KF8ocmFkaW9saXN0X2luc3RydWN0aW9ucykpOworCQljcHJpbnQoIjE1Iik7CisJCWNwcmludCgiNzAiKTsKKwkJY3ByaW50KCI2Iik7CisKKwkJY3VycmVudF9tZW51ID0gbWVudTsKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAoIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCQkJY29udGludWU7CisJCQljcHJpbnQoIiVwIiwgY2hpbGQpOworCQkJY3ByaW50KCIlcyIsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJaWYgKGNoaWxkLT5zeW0gPT0gc3ltX2dldF9jaG9pY2VfdmFsdWUobWVudS0+c3ltKSkKKwkJCQljcHJpbnQoIk9OIik7CisJCQllbHNlIGlmIChjaGlsZC0+c3ltID09IGFjdGl2ZSkKKwkJCQljcHJpbnQoIlNFTEVDVEVEIik7CisJCQllbHNlCisJCQkJY3ByaW50KCJPRkYiKTsKKwkJfQorCisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJc3dpdGNoIChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCWlmIChzc2NhbmYoaW5wdXRfYnVmLCAiJXAiLCAmY2hpbGQpICE9IDEpCisJCQkJYnJlYWs7CisJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKGNoaWxkLT5zeW0sIHllcyk7CisJCQlyZXR1cm47CisJCWNhc2UgMToKKwkJCWlmIChzc2NhbmYoaW5wdXRfYnVmLCAiJXAiLCAmY2hpbGQpID09IDEpIHsKKwkJCQlzaG93X2hlbHAoY2hpbGQpOworCQkJCWFjdGl2ZSA9IGNoaWxkLT5zeW07CisJCQl9IGVsc2UKKwkJCQlzaG93X2hlbHAobWVudSk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KQoreworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlpbnQgc3RhdDsKKworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS10aXRsZSIpOworCQljcHJpbnQoIiVzIiwgcHJvbXB0ID8gcHJvbXB0IDogXygiTWFpbiBNZW51IikpOworCQljcHJpbnQoIi0taW5wdXRib3giKTsKKwkJc3dpdGNoIChzeW1fZ2V0X3R5cGUobWVudS0+c3ltKSkgeworCQljYXNlIFNfSU5UOgorCQkJY3ByaW50KF8oaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludCkpOworCQkJYnJlYWs7CisJCWNhc2UgU19IRVg6CisJCQljcHJpbnQoXyhpbnB1dGJveF9pbnN0cnVjdGlvbnNfaGV4KSk7CisJCQlicmVhazsKKwkJY2FzZSBTX1NUUklORzoKKwkJCWNwcmludChfKGlucHV0Ym94X2luc3RydWN0aW9uc19zdHJpbmcpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogcGFuaWM/ICovOworCQl9CisJCWNwcmludCgiMTAiKTsKKwkJY3ByaW50KCI3NSIpOworCQljcHJpbnQoIiVzIiwgc3ltX2dldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltKSk7CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJc3dpdGNoIChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCWlmIChzeW1fc2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0sIGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsIF8oIllvdSBoYXZlIG1hZGUgYW4gaW52YWxpZCBlbnRyeS4iKSwgNSwgNDMpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNob3dfaGVscChtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDI1NToKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9sb2FkKHZvaWQpCit7CisJaW50IHN0YXQ7CisKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0taW5wdXRib3giKTsKKwkJY3ByaW50KGxvYWRfY29uZmlnX3RleHQpOworCQljcHJpbnQoIjExIik7CisJCWNwcmludCgiNTUiKTsKKwkJY3ByaW50KCIlcyIsIGZpbGVuYW1lKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2goc3RhdCkgeworCQljYXNlIDA6CisJCQlpZiAoIWlucHV0X2J1ZlswXSkKKwkJCQlyZXR1cm47CisJCQlpZiAoIWNvbmZfcmVhZChpbnB1dF9idWYpKQorCQkJCXJldHVybjsKKwkJCXNob3dfdGV4dGJveChOVUxMLCBfKCJGaWxlIGRvZXMgbm90IGV4aXN0ISIpLCA1LCAzOCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2hvd19oZWxwdGV4dChfKCJMb2FkIEFsdGVybmF0ZSBDb25maWd1cmF0aW9uIiksIGxvYWRfY29uZmlnX2hlbHApOworCQkJYnJlYWs7CisJCWNhc2UgMjU1OgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX3NhdmUodm9pZCkKK3sKKwlpbnQgc3RhdDsKKworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQljcHJpbnQoc2F2ZV9jb25maWdfdGV4dCk7CisJCWNwcmludCgiMTEiKTsKKwkJY3ByaW50KCI1NSIpOworCQljcHJpbnQoIiVzIiwgZmlsZW5hbWUpOworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCXN3aXRjaChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCWlmICghaW5wdXRfYnVmWzBdKQorCQkJCXJldHVybjsKKwkJCWlmICghY29uZl93cml0ZShpbnB1dF9idWYpKQorCQkJCXJldHVybjsKKwkJCXNob3dfdGV4dGJveChOVUxMLCBfKCJDYW4ndCBjcmVhdGUgZmlsZSEgIFByb2JhYmx5IGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5LiIpLCA1LCA2MCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2hvd19oZWxwdGV4dChfKCJTYXZlIEFsdGVybmF0ZSBDb25maWd1cmF0aW9uIiksIHNhdmVfY29uZmlnX2hlbHApOworCQkJYnJlYWs7CisJCWNhc2UgMjU1OgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX2NsZWFudXAodm9pZCkKK3sKKwl0Y3NldGF0dHIoMSwgVENTQUZMVVNILCAmaW9zX29yZyk7CisJdW5saW5rKCIuaGVscC50bXAiKTsKKwl1bmxpbmsoImx4ZGlhbG9nLnNjcmx0bXAiKTsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWNoYXIgKm1vZGU7CisJaW50IHN0YXQ7CisKKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKKwl0ZXh0ZG9tYWluKFBBQ0tBR0UpOworCisJY29uZl9wYXJzZShhdlsxXSk7CisJY29uZl9yZWFkKE5VTEwpOworCisJc3ltID0gc3ltX2xvb2t1cCgiS0VSTkVMVkVSU0lPTiIsIDApOworCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJc3ByaW50ZihtZW51X2JhY2t0aXRsZSwgXygiQnVzeUJveCAlcyBDb25maWd1cmF0aW9uIiksCisJCXN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCisJbW9kZSA9IGdldGVudigiTUVOVUNPTkZJR19NT0RFIik7CisJaWYgKG1vZGUpIHsKKwkJaWYgKCFzdHJjYXNlY21wKG1vZGUsICJzaW5nbGVfbWVudSIpKQorCQkJc2luZ2xlX21lbnVfbW9kZSA9IDE7CisJfQorCisJdGNnZXRhdHRyKDEsICZpb3Nfb3JnKTsKKwlhdGV4aXQoY29uZl9jbGVhbnVwKTsKKwlpbml0X3dzaXplKCk7CisJY29uZigmcm9vdG1lbnUpOworCisJZG8geworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0teWVzbm8iKTsKKwkJY3ByaW50KF8oIkRvIHlvdSB3aXNoIHRvIHNhdmUgeW91ciBuZXcgY29uZmlndXJhdGlvbj8iKSk7CisJCWNwcmludCgiNSIpOworCQljcHJpbnQoIjYwIik7CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwl9IHdoaWxlIChzdGF0IDwgMCk7CisKKwlpZiAoc3RhdCA9PSAwKSB7CisJCWlmIChjb25mX3dyaXRlKE5VTEwpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiXG5cbiIKKwkJCQkiRXJyb3IgZHVyaW5nIHdyaXRpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4iCisJCQkJIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKKwkJCQkiXG5cbiIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCXByaW50ZihfKCJcblxuIgorCQkJIioqKiBFbmQgb2YgY29uZmlndXJhdGlvbi5cbiIKKwkJCSIqKiogRXhlY3V0ZSAnbWFrZScgdG8gYnVpbGQgdGhlIHByb2plY3Qgb3IgdHJ5ICdtYWtlIGhlbHAnLiIKKwkJCSJcblxuIikpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgorCQkJIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKKwkJCSJcblxuIikpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjZjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKK3N0cnVjdCBtZW51IHJvb3RtZW51Oworc3RhdGljIHN0cnVjdCBtZW51ICoqbGFzdF9lbnRyeV9wdHI7CisKK3N0cnVjdCBmaWxlICpmaWxlX2xpc3Q7CitzdHJ1Y3QgZmlsZSAqY3VycmVudF9maWxlOworCitzdGF0aWMgdm9pZCBtZW51X3dhcm4oc3RydWN0IG1lbnUgKm1lbnUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJZnByaW50ZihzdGRlcnIsICIlczolZDp3YXJuaW5nOiAiLCBtZW51LT5maWxlLT5uYW1lLCBtZW51LT5saW5lbm8pOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCXZhX2VuZChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3Bfd2FybihzdHJ1Y3QgcHJvcGVydHkgKnByb3AsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJZnByaW50ZihzdGRlcnIsICIlczolZDp3YXJuaW5nOiAiLCBwcm9wLT5maWxlLT5uYW1lLCBwcm9wLT5saW5lbm8pOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQgbWVudV9pbml0KHZvaWQpCit7CisJY3VycmVudF9lbnRyeSA9IGN1cnJlbnRfbWVudSA9ICZyb290bWVudTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZyb290bWVudS5saXN0OworfQorCit2b2lkIG1lbnVfYWRkX2VudHJ5KHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCW1lbnUgPSBtYWxsb2Moc2l6ZW9mKCptZW51KSk7CisJbWVtc2V0KG1lbnUsIDAsIHNpemVvZigqbWVudSkpOworCW1lbnUtPnN5bSA9IHN5bTsKKwltZW51LT5wYXJlbnQgPSBjdXJyZW50X21lbnU7CisJbWVudS0+ZmlsZSA9IGN1cnJlbnRfZmlsZTsKKwltZW51LT5saW5lbm8gPSB6Y29uZl9saW5lbm8oKTsKKworCSpsYXN0X2VudHJ5X3B0ciA9IG1lbnU7CisJbGFzdF9lbnRyeV9wdHIgPSAmbWVudS0+bmV4dDsKKwljdXJyZW50X2VudHJ5ID0gbWVudTsKK30KKwordm9pZCBtZW51X2VuZF9lbnRyeSh2b2lkKQoreworfQorCitzdHJ1Y3QgbWVudSAqbWVudV9hZGRfbWVudSh2b2lkKQoreworCW1lbnVfZW5kX2VudHJ5KCk7CisJbGFzdF9lbnRyeV9wdHIgPSAmY3VycmVudF9lbnRyeS0+bGlzdDsKKwlyZXR1cm4gY3VycmVudF9tZW51ID0gY3VycmVudF9lbnRyeTsKK30KKwordm9pZCBtZW51X2VuZF9tZW51KHZvaWQpCit7CisJbGFzdF9lbnRyeV9wdHIgPSAmY3VycmVudF9tZW51LT5uZXh0OworCWN1cnJlbnRfbWVudSA9IGN1cnJlbnRfbWVudS0+cGFyZW50OworfQorCitzdHJ1Y3QgZXhwciAqbWVudV9jaGVja19kZXAoc3RydWN0IGV4cHIgKmUpCit7CisJaWYgKCFlKQorCQlyZXR1cm4gZTsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9OT1Q6CisJCWUtPmxlZnQuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGUtPmxlZnQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQllLT5sZWZ0LmV4cHIgPSBtZW51X2NoZWNrX2RlcChlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gbWVudV9jaGVja19kZXAoZS0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9TWU1CT0w6CisJCS8qIGNoYW5nZSAnbScgaW50byAnbScgJiYgTU9EVUxFUyAqLworCQlpZiAoZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9tb2QpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19hbmQoZSwgZXhwcl9hbGxvY19zeW1ib2wobW9kdWxlc19zeW0pKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBlOworfQorCit2b2lkIG1lbnVfYWRkX2RlcChzdHJ1Y3QgZXhwciAqZGVwKQoreworCWN1cnJlbnRfZW50cnktPmRlcCA9IGV4cHJfYWxsb2NfYW5kKGN1cnJlbnRfZW50cnktPmRlcCwgbWVudV9jaGVja19kZXAoZGVwKSk7Cit9CisKK3ZvaWQgbWVudV9zZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBjdXJyZW50X2VudHJ5LT5zeW07CisKKwlpZiAoc3ltLT50eXBlID09IHR5cGUpCisJCXJldHVybjsKKwlpZiAoc3ltLT50eXBlID09IFNfVU5LTk9XTikgeworCQlzeW0tPnR5cGUgPSB0eXBlOworCQlyZXR1cm47CisJfQorCW1lbnVfd2FybihjdXJyZW50X2VudHJ5LCAidHlwZSBvZiAnJXMnIHJlZGVmaW5lZCBmcm9tICclcycgdG8gJyVzJ1xuIiwKKwkgICAgc3ltLT5uYW1lID8gc3ltLT5uYW1lIDogIjxjaG9pY2U+IiwKKwkgICAgc3ltX3R5cGVfbmFtZShzeW0tPnR5cGUpLCBzeW1fdHlwZV9uYW1lKHR5cGUpKTsKK30KKworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9wKGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gcHJvcF9hbGxvYyh0eXBlLCBjdXJyZW50X2VudHJ5LT5zeW0pOworCisJcHJvcC0+bWVudSA9IGN1cnJlbnRfZW50cnk7CisJcHJvcC0+dGV4dCA9IHByb21wdDsKKwlwcm9wLT5leHByID0gZXhwcjsKKwlwcm9wLT52aXNpYmxlLmV4cHIgPSBtZW51X2NoZWNrX2RlcChkZXApOworCisJaWYgKHByb21wdCkgeworCQlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQorCQkJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJwcm9tcHQgcmVkZWZpbmVkXG4iKTsKKwkJY3VycmVudF9lbnRyeS0+cHJvbXB0ID0gcHJvcDsKKwl9CisKKwlyZXR1cm4gcHJvcDsKK30KKworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9tcHQoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZGVwKQoreworCXJldHVybiBtZW51X2FkZF9wcm9wKHR5cGUsIHByb21wdCwgTlVMTCwgZGVwKTsKK30KKwordm9pZCBtZW51X2FkZF9leHByKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKQoreworCW1lbnVfYWRkX3Byb3AodHlwZSwgTlVMTCwgZXhwciwgZGVwKTsKK30KKwordm9pZCBtZW51X2FkZF9zeW1ib2woZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgZXhwciAqZGVwKQoreworCW1lbnVfYWRkX3Byb3AodHlwZSwgTlVMTCwgZXhwcl9hbGxvY19zeW1ib2woc3ltKSwgZGVwKTsKK30KKworc3RhdGljIGludCBtZW51X3JhbmdlX3ZhbGlkX3N5bShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBzeW1ib2wgKnN5bTIpCit7CisJcmV0dXJuIHN5bTItPnR5cGUgPT0gU19JTlQgfHwgc3ltMi0+dHlwZSA9PSBTX0hFWCB8fAorCSAgICAgICAoc3ltMi0+dHlwZSA9PSBTX1VOS05PV04gJiYgc3ltX3N0cmluZ192YWxpZChzeW0sIHN5bTItPm5hbWUpKTsKK30KKwordm9pZCBzeW1fY2hlY2tfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKnN5bTI7CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlpZiAoKHN5bS0+dHlwZSA9PSBTX1NUUklORyB8fCBzeW0tPnR5cGUgPT0gU19JTlQgfHwgc3ltLT50eXBlID09IFNfSEVYKSAmJgorCQkJICAgIHByb3AtPmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICJkZWZhdWx0IGZvciBjb25maWcgc3ltYm9sICclJyIKKwkJCQkgICAgIiBtdXN0IGJlIGEgc2luZ2xlIHN5bWJvbCIsIHN5bS0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBQX1NFTEVDVDoKKwkJCXN5bTIgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoc3ltLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0tPnR5cGUgIT0gU19UUklTVEFURSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgImNvbmZpZyBzeW1ib2wgJyVzJyB1c2VzIHNlbGVjdCwgYnV0IGlzICIKKwkJCQkgICAgIm5vdCBib29sZWFuIG9yIHRyaXN0YXRlIiwgc3ltLT5uYW1lKTsKKwkJCWVsc2UgaWYgKHN5bTItPnR5cGUgPT0gU19VTktOT1dOKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiJ3NlbGVjdCcgdXNlZCBieSBjb25maWcgc3ltYm9sICclcycgIgorCQkJCSAgICAicmVmZXIgdG8gdW5kZWZpbmVkIHN5bWJvbCAnJXMnIiwKKwkJCQkgICAgc3ltLT5uYW1lLCBzeW0yLT5uYW1lKTsKKwkJCWVsc2UgaWYgKHN5bTItPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bTItPnR5cGUgIT0gU19UUklTVEFURSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgIiclcycgaGFzIHdyb25nIHR5cGUuICdzZWxlY3QnIG9ubHkgIgorCQkJCSAgICAiYWNjZXB0IGFyZ3VtZW50cyBvZiBib29sZWFuIGFuZCAiCisJCQkJICAgICJ0cmlzdGF0ZSB0eXBlIiwgc3ltMi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBQX1JBTkdFOgorCQkJaWYgKHN5bS0+dHlwZSAhPSBTX0lOVCAmJiBzeW0tPnR5cGUgIT0gU19IRVgpCisJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBvbmx5IGFsbG93ZWQgIgorCQkJCSAgICAgICAgICAgICAgICAiZm9yIGludCBvciBoZXggc3ltYm9scyIpOworCQkJaWYgKCFtZW51X3JhbmdlX3ZhbGlkX3N5bShzeW0sIHByb3AtPmV4cHItPmxlZnQuc3ltKSB8fAorCQkJICAgICFtZW51X3JhbmdlX3ZhbGlkX3N5bShzeW0sIHByb3AtPmV4cHItPnJpZ2h0LnN5bSkpCisJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBpbnZhbGlkIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCX0KK30KKwordm9pZCBtZW51X2ZpbmFsaXplKHN0cnVjdCBtZW51ICpwYXJlbnQpCit7CisJc3RydWN0IG1lbnUgKm1lbnUsICpsYXN0X21lbnU7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqcGFyZW50ZGVwLCAqYmFzZWRlcCwgKmRlcCwgKmRlcDIsICoqZXA7CisKKwlzeW0gPSBwYXJlbnQtPnN5bTsKKwlpZiAocGFyZW50LT5saXN0KSB7CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkvKiBmaW5kIHRoZSBmaXJzdCBjaG9pY2UgdmFsdWUgYW5kIGZpbmQgb3V0IGNob2ljZSB0eXBlICovCisJCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQkJaWYgKG1lbnUtPnN5bSkgeworCQkJCQljdXJyZW50X2VudHJ5ID0gcGFyZW50OworCQkJCQltZW51X3NldF90eXBlKG1lbnUtPnN5bS0+dHlwZSk7CisJCQkJCWN1cnJlbnRfZW50cnkgPSBtZW51OworCQkJCQltZW51X3NldF90eXBlKHN5bS0+dHlwZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXBhcmVudGRlcCA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bSk7CisJCX0gZWxzZSBpZiAocGFyZW50LT5wcm9tcHQpCisJCQlwYXJlbnRkZXAgPSBwYXJlbnQtPnByb21wdC0+dmlzaWJsZS5leHByOworCQllbHNlCisJCQlwYXJlbnRkZXAgPSBwYXJlbnQtPmRlcDsKKworCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQliYXNlZGVwID0gZXhwcl90cmFuc2Zvcm0obWVudS0+ZGVwKTsKKwkJCWJhc2VkZXAgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkocGFyZW50ZGVwKSwgYmFzZWRlcCk7CisJCQliYXNlZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhiYXNlZGVwKTsKKwkJCW1lbnUtPmRlcCA9IGJhc2VkZXA7CisJCQlpZiAobWVudS0+c3ltKQorCQkJCXByb3AgPSBtZW51LT5zeW0tPnByb3A7CisJCQllbHNlCisJCQkJcHJvcCA9IG1lbnUtPnByb21wdDsKKwkJCWZvciAoOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCWlmIChwcm9wLT5tZW51ICE9IG1lbnUpCisJCQkJCWNvbnRpbnVlOworCQkJCWRlcCA9IGV4cHJfdHJhbnNmb3JtKHByb3AtPnZpc2libGUuZXhwcik7CisJCQkJZGVwID0gZXhwcl9hbGxvY19hbmQoZXhwcl9jb3B5KGJhc2VkZXApLCBkZXApOworCQkJCWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZGVwKTsKKwkJCQlpZiAobWVudS0+c3ltICYmIG1lbnUtPnN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCQlkZXAgPSBleHByX3RyYW5zX2Jvb2woZGVwKTsKKwkJCQlwcm9wLT52aXNpYmxlLmV4cHIgPSBkZXA7CisJCQkJaWYgKHByb3AtPnR5cGUgPT0gUF9TRUxFQ1QpIHsKKwkJCQkJc3RydWN0IHN5bWJvbCAqZXMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQkJCWVzLT5yZXZfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKGVzLT5yZXZfZGVwLmV4cHIsCisJCQkJCQkJZXhwcl9hbGxvY19hbmQoZXhwcl9hbGxvY19zeW1ib2wobWVudS0+c3ltKSwgZXhwcl9jb3B5KGRlcCkpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkKKwkJCW1lbnVfZmluYWxpemUobWVudSk7CisJfSBlbHNlIGlmIChzeW0pIHsKKwkJYmFzZWRlcCA9IHBhcmVudC0+cHJvbXB0ID8gcGFyZW50LT5wcm9tcHQtPnZpc2libGUuZXhwciA6IE5VTEw7CisJCWJhc2VkZXAgPSBleHByX3RyYW5zX2NvbXBhcmUoYmFzZWRlcCwgRV9VTkVRVUFMLCAmc3ltYm9sX25vKTsKKwkJYmFzZWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZXhwcl90cmFuc2Zvcm0oYmFzZWRlcCkpOworCQlsYXN0X21lbnUgPSBOVUxMOworCQlmb3IgKG1lbnUgPSBwYXJlbnQtPm5leHQ7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQlkZXAgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciA6IG1lbnUtPmRlcDsKKwkJCWlmICghZXhwcl9jb250YWluc19zeW1ib2woZGVwLCBzeW0pKQorCQkJCWJyZWFrOworCQkJaWYgKGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLCBzeW0pKQorCQkJCWdvdG8gbmV4dDsKKwkJCWRlcCA9IGV4cHJfdHJhbnNfY29tcGFyZShkZXAsIEVfVU5FUVVBTCwgJnN5bWJvbF9ubyk7CisJCQlkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGV4cHJfdHJhbnNmb3JtKGRlcCkpOworCQkJZGVwMiA9IGV4cHJfY29weShiYXNlZGVwKTsKKwkJCWV4cHJfZWxpbWluYXRlX2VxKCZkZXAsICZkZXAyKTsKKwkJCWV4cHJfZnJlZShkZXApOworCQkJaWYgKCFleHByX2lzX3llcyhkZXAyKSkgeworCQkJCWV4cHJfZnJlZShkZXAyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWV4cHJfZnJlZShkZXAyKTsKKwkJbmV4dDoKKwkJCW1lbnVfZmluYWxpemUobWVudSk7CisJCQltZW51LT5wYXJlbnQgPSBwYXJlbnQ7CisJCQlsYXN0X21lbnUgPSBtZW51OworCQl9CisJCWlmIChsYXN0X21lbnUpIHsKKwkJCXBhcmVudC0+bGlzdCA9IHBhcmVudC0+bmV4dDsKKwkJCXBhcmVudC0+bmV4dCA9IGxhc3RfbWVudS0+bmV4dDsKKwkJCWxhc3RfbWVudS0+bmV4dCA9IE5VTEw7CisJCX0KKwl9CisJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkgeworCQlpZiAoc3ltICYmIHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBtZW51LT5zeW0pIHsKKwkJCW1lbnUtPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIT0lDRVZBTDsKKwkJCWlmICghbWVudS0+cHJvbXB0KQorCQkJCW1lbnVfd2FybihtZW51LCAiY2hvaWNlIHZhbHVlIG11c3QgaGF2ZSBhIHByb21wdCIpOworCQkJZm9yIChwcm9wID0gbWVudS0+c3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCWlmIChwcm9wLT50eXBlID09IFBfUFJPTVBUICYmIHByb3AtPm1lbnUgIT0gbWVudSkgeworCQkJCQlwcm9wX3dhcm4ocHJvcCwgImNob2ljZSB2YWx1ZXMgIgorCQkJCQkgICAgImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgYSAiCisJCQkJCSAgICAic2luZ2xlIHByb21wdCIpOworCQkJCX0KKwkJCQlpZiAocHJvcC0+dHlwZSA9PSBQX0RFRkFVTFQpCisJCQkJCXByb3Bfd2Fybihwcm9wLCAiZGVmYXVsdHMgZm9yIGNob2ljZSAiCisJCQkJCSAgICAidmFsdWVzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCX0KKwkJCWN1cnJlbnRfZW50cnkgPSBtZW51OworCQkJbWVudV9zZXRfdHlwZShzeW0tPnR5cGUpOworCQkJbWVudV9hZGRfc3ltYm9sKFBfQ0hPSUNFLCBzeW0sIE5VTEwpOworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCWZvciAoZXAgPSAmcHJvcC0+ZXhwcjsgKmVwOyBlcCA9ICYoKmVwKS0+bGVmdC5leHByKQorCQkJCTsKKwkJCSplcCA9IGV4cHJfYWxsb2Nfb25lKEVfQ0hPSUNFLCBOVUxMKTsKKwkJCSgqZXApLT5yaWdodC5zeW0gPSBtZW51LT5zeW07CisJCX0KKwkJaWYgKG1lbnUtPmxpc3QgJiYgKCFtZW51LT5wcm9tcHQgfHwgIW1lbnUtPnByb21wdC0+dGV4dCkpIHsKKwkJCWZvciAobGFzdF9tZW51ID0gbWVudS0+bGlzdDsgOyBsYXN0X21lbnUgPSBsYXN0X21lbnUtPm5leHQpIHsKKwkJCQlsYXN0X21lbnUtPnBhcmVudCA9IHBhcmVudDsKKwkJCQlpZiAoIWxhc3RfbWVudS0+bmV4dCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlsYXN0X21lbnUtPm5leHQgPSBtZW51LT5uZXh0OworCQkJbWVudS0+bmV4dCA9IG1lbnUtPmxpc3Q7CisJCQltZW51LT5saXN0ID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzeW0gJiYgIShzeW0tPmZsYWdzICYgU1lNQk9MX1dBUk5FRCkpIHsKKwkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCisJCQltZW51X3dhcm4ocGFyZW50LCAiY29uZmlnIHN5bWJvbCBkZWZpbmVkICIKKwkJCSAgICAid2l0aG91dCB0eXBlXG4iKTsKKworCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pICYmICFwYXJlbnQtPnByb21wdCkKKwkJCW1lbnVfd2FybihwYXJlbnQsICJjaG9pY2UgbXVzdCBoYXZlIGEgcHJvbXB0XG4iKTsKKworCQkvKiBDaGVjayBwcm9wZXJ0aWVzIGNvbm5lY3RlZCB0byB0aGlzIHN5bWJvbCAqLworCQlzeW1fY2hlY2tfcHJvcChzeW0pOworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XQVJORUQ7CisJfQorCisJaWYgKHN5bSAmJiAhc3ltX2lzX29wdGlvbmFsKHN5bSkgJiYgcGFyZW50LT5wcm9tcHQpIHsKKwkJc3ltLT5yZXZfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKHN5bS0+cmV2X2RlcC5leHByLAorCQkJCWV4cHJfYWxsb2NfYW5kKHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHIsCisJCQkJCWV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbW9kKSkpOworCX0KK30KKworYm9vbCBtZW51X2lzX3Zpc2libGUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwl0cmlzdGF0ZSB2aXNpYmxlOworCisJaWYgKCFtZW51LT5wcm9tcHQpCisJCXJldHVybiBmYWxzZTsKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKHN5bSkgeworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQl2aXNpYmxlID0gbWVudS0+cHJvbXB0LT52aXNpYmxlLnRyaTsKKwl9IGVsc2UKKwkJdmlzaWJsZSA9IG1lbnUtPnByb21wdC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIpOworCisJaWYgKHZpc2libGUgIT0gbm8pCisJCXJldHVybiB0cnVlOworCWlmICghc3ltIHx8IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUobWVudS0+c3ltKSA9PSBubykKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQlpZiAobWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworY29uc3QgY2hhciAqbWVudV9nZXRfcHJvbXB0KHN0cnVjdCBtZW51ICptZW51KQoreworCWlmIChtZW51LT5wcm9tcHQpCisJCXJldHVybiBfKG1lbnUtPnByb21wdC0+dGV4dCk7CisJZWxzZSBpZiAobWVudS0+c3ltKQorCQlyZXR1cm4gXyhtZW51LT5zeW0tPm5hbWUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbWVudSAqbWVudV9nZXRfcm9vdF9tZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCXJldHVybiAmcm9vdG1lbnU7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2dldF9wYXJlbnRfbWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJZm9yICg7IG1lbnUgIT0gJnJvb3RtZW51OyBtZW51ID0gbWVudS0+cGFyZW50KSB7CisJCXR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiAwOworCQlpZiAodHlwZSA9PSBQX01FTlUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG1lbnU7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExODljMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpAQCAtMCwwICsxLDE0MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8cWFwcGxpY2F0aW9uLmg+CisjaW5jbHVkZSA8cW1haW53aW5kb3cuaD4KKyNpbmNsdWRlIDxxdG9vbGJhci5oPgorI2luY2x1ZGUgPHF2Ym94Lmg+CisjaW5jbHVkZSA8cXNwbGl0dGVyLmg+CisjaW5jbHVkZSA8cWxpc3R2aWV3Lmg+CisjaW5jbHVkZSA8cXRleHR2aWV3Lmg+CisjaW5jbHVkZSA8cWxpbmVlZGl0Lmg+CisjaW5jbHVkZSA8cW1lbnViYXIuaD4KKyNpbmNsdWRlIDxxbWVzc2FnZWJveC5oPgorI2luY2x1ZGUgPHFhY3Rpb24uaD4KKyNpbmNsdWRlIDxxaGVhZGVyLmg+CisjaW5jbHVkZSA8cWZpbGVkaWFsb2cuaD4KKyNpbmNsdWRlIDxxcmVnZXhwLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxrYy5oIgorI2luY2x1ZGUgInFjb25mLmgiCisKKyNpbmNsdWRlICJxY29uZi5tb2MiCisjaW5jbHVkZSAiaW1hZ2VzLmMiCisKKyNpZmRlZiBfCisjIHVuZGVmIF8KKyMgZGVmaW5lIF8gcWdldHRleHQKKyNlbmRpZgorCitzdGF0aWMgUUFwcGxpY2F0aW9uICpjb25maWdBcHA7CisKK3N0YXRpYyBpbmxpbmUgUVN0cmluZyBxZ2V0dGV4dChjb25zdCBjaGFyKiBzdHIpCit7CisgIHJldHVybiBRU3RyaW5nOjpmcm9tTG9jYWw4Qml0KGdldHRleHQoc3RyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgUVN0cmluZyBxZ2V0dGV4dChjb25zdCBRU3RyaW5nJiBzdHIpCit7CisgIHJldHVybiBRU3RyaW5nOjpmcm9tTG9jYWw4Qml0KGdldHRleHQoc3RyLmxhdGluMSgpKSk7Cit9CisKK0NvbmZpZ1NldHRpbmdzOjpDb25maWdTZXR0aW5ncygpCisJOiBzaG93QWxsKGZhbHNlKSwgc2hvd05hbWUoZmFsc2UpLCBzaG93UmFuZ2UoZmFsc2UpLCBzaG93RGF0YShmYWxzZSkKK3sKK30KKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisvKioKKyAqIFJlYWRzIHRoZSBsaXN0IGNvbHVtbiBzZXR0aW5ncyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy4KKyAqLwordm9pZCBDb25maWdTZXR0aW5nczo6cmVhZExpc3RTZXR0aW5ncygpCit7CisJc2hvd0FsbCA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dBbGwiLCBmYWxzZSk7CisJc2hvd05hbWUgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93TmFtZSIsIGZhbHNlKTsKKwlzaG93UmFuZ2UgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93UmFuZ2UiLCBmYWxzZSk7CisJc2hvd0RhdGEgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGF0YSIsIGZhbHNlKTsKK30KKworLyoqCisgKiBSZWFkcyBhIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgZnJvbSB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MuCisgKi8KK1FWYWx1ZUxpc3Q8aW50PiBDb25maWdTZXR0aW5nczo6cmVhZFNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgYm9vbCAqb2spCit7CisJUVZhbHVlTGlzdDxpbnQ+IHJlc3VsdDsKKwlRU3RyaW5nTGlzdCBlbnRyeUxpc3QgPSByZWFkTGlzdEVudHJ5KGtleSwgb2spOworCWlmIChvaykgeworCQlRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQ7CisJCWZvciAoaXQgPSBlbnRyeUxpc3QuYmVnaW4oKTsgaXQgIT0gZW50cnlMaXN0LmVuZCgpOyArK2l0KQorCQkJcmVzdWx0LnB1c2hfYmFjaygoKml0KS50b0ludCgpKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFdyaXRlcyBhIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgdG8gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgorICovCitib29sIENvbmZpZ1NldHRpbmdzOjp3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSkKK3sKKwlRU3RyaW5nTGlzdCBzdHJpbmdMaXN0OworCVFWYWx1ZUxpc3Q8aW50Pjo6Q29uc3RJdGVyYXRvciBpdDsKKworCWZvciAoaXQgPSB2YWx1ZS5iZWdpbigpOyBpdCAhPSB2YWx1ZS5lbmQoKTsgKytpdCkKKwkJc3RyaW5nTGlzdC5wdXNoX2JhY2soUVN0cmluZzo6bnVtYmVyKCppdCkpOworCXJldHVybiB3cml0ZUVudHJ5KGtleSwgc3RyaW5nTGlzdCk7Cit9CisjZW5kaWYKKworCisvKgorICogdXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgYSBtZW51IGVudHJ5CisgKiAgIHJlbW92ZXMvYWRkcyB0aGUgZW50cmllcyBmcm9tIHRoZSBwYXJlbnQgd2lkZ2V0IGFzIG5lY2Vzc2FyeQorICoKKyAqIHBhcmVudDogZWl0aGVyIHRoZSBtZW51IGxpc3Qgd2lkZ2V0IG9yIGEgbWVudSBlbnRyeSB3aWRnZXQKKyAqIG1lbnU6IGVudHJ5IHRvIGJlIHVwZGF0ZWQKKyAqLwordGVtcGxhdGUgPGNsYXNzIFA+Cit2b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZU1lbnVMaXN0KFAqIHBhcmVudCwgc3RydWN0IG1lbnUqIG1lbnUpCit7CisJc3RydWN0IG1lbnUqIGNoaWxkOworCUNvbmZpZ0l0ZW0qIGl0ZW07CisJQ29uZmlnSXRlbSogbGFzdDsKKwlib29sIHZpc2libGU7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmICghbWVudSkgeworCQl3aGlsZSAoKGl0ZW0gPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKSkpCisJCQlkZWxldGUgaXRlbTsKKwkJcmV0dXJuOworCX0KKworCWxhc3QgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKwlpZiAobGFzdCAmJiAhbGFzdC0+Z29QYXJlbnQpCisJCWxhc3QgPSAwOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQlpdGVtID0gbGFzdCA/IGxhc3QtPm5leHRTaWJsaW5nKCkgOiBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKwkJdHlwZSA9IGNoaWxkLT5wcm9tcHQgPyBjaGlsZC0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIG1lbnVNb2RlOgorCQkJaWYgKCEoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKSkKKwkJCQlnb3RvIGhpZGU7CisJCQlicmVhazsKKwkJY2FzZSBzeW1ib2xNb2RlOgorCQkJaWYgKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkKKwkJCQlnb3RvIGhpZGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJdmlzaWJsZSA9IG1lbnVfaXNfdmlzaWJsZShjaGlsZCk7CisJCWlmIChzaG93QWxsIHx8IHZpc2libGUpIHsKKwkJCWlmICghaXRlbSB8fCBpdGVtLT5tZW51ICE9IGNoaWxkKQorCQkJCWl0ZW0gPSBuZXcgQ29uZmlnSXRlbShwYXJlbnQsIGxhc3QsIGNoaWxkLCB2aXNpYmxlKTsKKwkJCWVsc2UKKwkJCQlpdGVtLT50ZXN0VXBkYXRlTWVudSh2aXNpYmxlKTsKKworCQkJaWYgKG1vZGUgPT0gZnVsbE1vZGUgfHwgbW9kZSA9PSBtZW51TW9kZSB8fCB0eXBlICE9IFBfTUVOVSkKKwkJCQl1cGRhdGVNZW51TGlzdChpdGVtLCBjaGlsZCk7CisJCQllbHNlCisJCQkJdXBkYXRlTWVudUxpc3QoaXRlbSwgMCk7CisJCQlsYXN0ID0gaXRlbTsKKwkJCWNvbnRpbnVlOworCQl9CisJaGlkZToKKwkJaWYgKGl0ZW0gJiYgaXRlbS0+bWVudSA9PSBjaGlsZCkgeworCQkJbGFzdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCQkJaWYgKGxhc3QgPT0gaXRlbSkKKwkJCQlsYXN0ID0gMDsKKwkJCWVsc2Ugd2hpbGUgKGxhc3QtPm5leHRTaWJsaW5nKCkgIT0gaXRlbSkKKwkJCQlsYXN0ID0gbGFzdC0+bmV4dFNpYmxpbmcoKTsKKwkJCWRlbGV0ZSBpdGVtOworCQl9CisJfQorfQorCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKy8qCisgKiBzZXQgdGhlIG5ldyBkYXRhCisgKiBUT0RPIGNoZWNrIHRoZSB2YWx1ZQorICovCit2b2lkIENvbmZpZ0l0ZW06Om9rUmVuYW1lKGludCBjb2wpCit7CisJUGFyZW50Ojpva1JlbmFtZShjb2wpOworCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSwgdGV4dChkYXRhQ29sSWR4KS5sYXRpbjEoKSk7Cit9CisjZW5kaWYKKworLyoKKyAqIHVwZGF0ZSB0aGUgZGlzcGxheWVkIG9mIGEgbWVudSBlbnRyeQorICovCit2b2lkIENvbmZpZ0l0ZW06OnVwZGF0ZU1lbnUodm9pZCkKK3sKKwlDb25maWdMaXN0KiBsaXN0OworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJUVN0cmluZyBwcm9tcHQ7CisJaW50IHR5cGU7CisJdHJpc3RhdGUgZXhwcjsKKworCWxpc3QgPSBsaXN0VmlldygpOworCWlmIChnb1BhcmVudCkgeworCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5tZW51QmFja1BpeCk7CisJCXByb21wdCA9ICIuLiI7CisJCWdvdG8gc2V0X3Byb21wdDsKKwl9CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlwcm9tcHQgPSBRU3RyaW5nOjpmcm9tTG9jYWw4Qml0KG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisKKwlpZiAocHJvcCkgc3dpdGNoIChwcm9wLT50eXBlKSB7CisJY2FzZSBQX01FTlU6CisJCWlmIChsaXN0LT5tb2RlID09IHNpbmdsZU1vZGUgfHwgbGlzdC0+bW9kZSA9PSBzeW1ib2xNb2RlKSB7CisJCQkvKiBhIG1lbnVjb25maWcgZW50cnkgaXMgZGlzcGxheWVkIGRpZmZlcmVudGx5CisJCQkgKiBkZXBlbmRpbmcgd2hldGhlciBpdCdzIGF0IHRoZSB2aWV3IHJvb3Qgb3IgYSBjaGlsZC4KKwkJCSAqLworCQkJaWYgKHN5bSAmJiBsaXN0LT5yb290RW50cnkgPT0gbWVudSkKKwkJCQlicmVhazsKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPm1lbnVQaXgpOworCQl9IGVsc2UgeworCQkJaWYgKHN5bSkKKwkJCQlicmVhazsKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIDApOworCQl9CisJCWdvdG8gc2V0X3Byb21wdDsKKwljYXNlIFBfQ09NTUVOVDoKKwkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgMCk7CisJCWdvdG8gc2V0X3Byb21wdDsKKwlkZWZhdWx0OgorCQk7CisJfQorCWlmICghc3ltKQorCQlnb3RvIHNldF9wcm9tcHQ7CisKKwlzZXRUZXh0KG5hbWVDb2xJZHgsIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoc3ltLT5uYW1lKSk7CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQljaGFyIGNoOworCisJCWlmICghc3ltX2lzX2NoYW5nYWJsZShzeW0pICYmICFsaXN0LT5zaG93QWxsKSB7CisJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCAwKTsKKwkJCXNldFRleHQobm9Db2xJZHgsIFFTdHJpbmc6Om51bGwpOworCQkJc2V0VGV4dChtb2RDb2xJZHgsIFFTdHJpbmc6Om51bGwpOworCQkJc2V0VGV4dCh5ZXNDb2xJZHgsIFFTdHJpbmc6Om51bGwpOworCQkJYnJlYWs7CisJCX0KKwkJZXhwciA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChleHByKSB7CisJCWNhc2UgeWVzOgorCQkJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiB0eXBlID09IFNfQk9PTEVBTikKKwkJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5jaG9pY2VZZXNQaXgpOworCQkJZWxzZQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPnN5bWJvbFllc1BpeCk7CisJCQlzZXRUZXh0KHllc0NvbElkeCwgIlkiKTsKKwkJCWNoID0gJ1knOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+c3ltYm9sTW9kUGl4KTsKKwkJCXNldFRleHQobW9kQ29sSWR4LCAiTSIpOworCQkJY2ggPSAnTSc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdHlwZSA9PSBTX0JPT0xFQU4pCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+Y2hvaWNlTm9QaXgpOworCQkJZWxzZQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPnN5bWJvbE5vUGl4KTsKKwkJCXNldFRleHQobm9Db2xJZHgsICJOIik7CisJCQljaCA9ICdOJzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChleHByICE9IG5vKQorCQkJc2V0VGV4dChub0NvbElkeCwgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSA/ICJfIiA6IDApOworCQlpZiAoZXhwciAhPSBtb2QpCisJCQlzZXRUZXh0KG1vZENvbElkeCwgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkgPyAiXyIgOiAwKTsKKwkJaWYgKGV4cHIgIT0geWVzKQorCQkJc2V0VGV4dCh5ZXNDb2xJZHgsIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpID8gIl8iIDogMCk7CisKKwkJc2V0VGV4dChkYXRhQ29sSWR4LCBRQ2hhcihjaCkpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJY29uc3QgY2hhciogZGF0YTsKKworCQlkYXRhID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJCWludCBpID0gbGlzdC0+bWFwSWR4KGRhdGFDb2xJZHgpOworCQlpZiAoaSA+PSAwKQorCQkJc2V0UmVuYW1lRW5hYmxlZChpLCBUUlVFKTsKKyNlbmRpZgorCQlzZXRUZXh0KGRhdGFDb2xJZHgsIGRhdGEpOworCQlpZiAodHlwZSA9PSBTX1NUUklORykKKwkJCXByb21wdCA9IFFTdHJpbmcoIiUxOiAlMiIpLmFyZyhwcm9tcHQpLmFyZyhkYXRhKTsKKwkJZWxzZQorCQkJcHJvbXB0ID0gUVN0cmluZygiKCUyKSAlMSIpLmFyZyhwcm9tcHQpLmFyZyhkYXRhKTsKKwkJYnJlYWs7CisJfQorCWlmICghc3ltX2hhc192YWx1ZShzeW0pICYmIHZpc2libGUpCisJCXByb21wdCArPSAiIChORVcpIjsKK3NldF9wcm9tcHQ6CisJc2V0VGV4dChwcm9tcHRDb2xJZHgsIHByb21wdCk7Cit9CisKK3ZvaWQgQ29uZmlnSXRlbTo6dGVzdFVwZGF0ZU1lbnUoYm9vbCB2KQoreworCUNvbmZpZ0l0ZW0qIGk7CisKKwl2aXNpYmxlID0gdjsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKworCXN5bV9jYWxjX3ZhbHVlKG1lbnUtPnN5bSk7CisJaWYgKG1lbnUtPmZsYWdzICYgTUVOVV9DSEFOR0VEKSB7CisJCS8qIHRoZSBtZW51IGVudHJ5IGNoYW5nZWQsIHNvIHVwZGF0ZSBhbGwgbGlzdCBpdGVtcyAqLworCQltZW51LT5mbGFncyAmPSB+TUVOVV9DSEFOR0VEOworCQlmb3IgKGkgPSAoQ29uZmlnSXRlbSopbWVudS0+ZGF0YTsgaTsgaSA9IGktPm5leHRJdGVtKQorCQkJaS0+dXBkYXRlTWVudSgpOworCX0gZWxzZSBpZiAobGlzdFZpZXcoKS0+dXBkYXRlQWxsKQorCQl1cGRhdGVNZW51KCk7Cit9CisKK3ZvaWQgQ29uZmlnSXRlbTo6cGFpbnRDZWxsKFFQYWludGVyKiBwLCBjb25zdCBRQ29sb3JHcm91cCYgY2csIGludCBjb2x1bW4sIGludCB3aWR0aCwgaW50IGFsaWduKQoreworCUNvbmZpZ0xpc3QqIGxpc3QgPSBsaXN0VmlldygpOworCisJaWYgKHZpc2libGUpIHsKKwkJaWYgKGlzU2VsZWN0ZWQoKSAmJiAhbGlzdC0+aGFzRm9jdXMoKSAmJiBsaXN0LT5tb2RlID09IG1lbnVNb2RlKQorCQkJUGFyZW50OjpwYWludENlbGwocCwgbGlzdC0+aW5hY3RpdmVkQ29sb3JHcm91cCwgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworCQllbHNlCisJCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBjZywgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworCX0gZWxzZQorCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBsaXN0LT5kaXNhYmxlZENvbG9yR3JvdXAsIGNvbHVtbiwgd2lkdGgsIGFsaWduKTsKK30KKworLyoKKyAqIGNvbnN0cnVjdCBhIG1lbnUgZW50cnkKKyAqLwordm9pZCBDb25maWdJdGVtOjppbml0KHZvaWQpCit7CisJaWYgKG1lbnUpIHsKKwkJQ29uZmlnTGlzdCogbGlzdCA9IGxpc3RWaWV3KCk7CisJCW5leHRJdGVtID0gKENvbmZpZ0l0ZW0qKW1lbnUtPmRhdGE7CisJCW1lbnUtPmRhdGEgPSB0aGlzOworCisJCWlmIChsaXN0LT5tb2RlICE9IGZ1bGxNb2RlKQorCQkJc2V0T3BlbihUUlVFKTsKKwkJc3ltX2NhbGNfdmFsdWUobWVudS0+c3ltKTsKKwl9CisJdXBkYXRlTWVudSgpOworfQorCisvKgorICogZGVzdHJ1Y3QgYSBtZW51IGVudHJ5CisgKi8KK0NvbmZpZ0l0ZW06On5Db25maWdJdGVtKHZvaWQpCit7CisJaWYgKG1lbnUpIHsKKwkJQ29uZmlnSXRlbSoqIGlwID0gKENvbmZpZ0l0ZW0qKikmbWVudS0+ZGF0YTsKKwkJZm9yICg7ICppcDsgaXAgPSAmKCppcCktPm5leHRJdGVtKSB7CisJCQlpZiAoKmlwID09IHRoaXMpIHsKKwkJCQkqaXAgPSBuZXh0SXRlbTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBDb25maWdMaW5lRWRpdDo6c2hvdyhDb25maWdJdGVtKiBpKQoreworCWl0ZW0gPSBpOworCWlmIChzeW1fZ2V0X3N0cmluZ192YWx1ZShpdGVtLT5tZW51LT5zeW0pKQorCQlzZXRUZXh0KFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoc3ltX2dldF9zdHJpbmdfdmFsdWUoaXRlbS0+bWVudS0+c3ltKSkpOworCWVsc2UKKwkJc2V0VGV4dChRU3RyaW5nOjpudWxsKTsKKwlQYXJlbnQ6OnNob3coKTsKKwlzZXRGb2N1cygpOworfQorCit2b2lkIENvbmZpZ0xpbmVFZGl0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZSkKK3sKKwlzd2l0Y2ggKGUtPmtleSgpKSB7CisJY2FzZSBLZXlfRXNjYXBlOgorCQlicmVhazsKKwljYXNlIEtleV9SZXR1cm46CisJY2FzZSBLZXlfRW50ZXI6CisJCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKGl0ZW0tPm1lbnUtPnN5bSwgdGV4dCgpLmxhdGluMSgpKTsKKwkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChlKTsKKwkJcmV0dXJuOworCX0KKwllLT5hY2NlcHQoKTsKKwlwYXJlbnQoKS0+bGlzdC0+c2V0Rm9jdXMoKTsKKwloaWRlKCk7Cit9CisKK0NvbmZpZ0xpc3Q6OkNvbmZpZ0xpc3QoQ29uZmlnVmlldyogcCwgQ29uZmlnTWFpbldpbmRvdyogY3YsIENvbmZpZ1NldHRpbmdzKiBjb25maWdTZXR0aW5ncykKKwk6IFBhcmVudChwKSwgY3ZpZXcoY3YpLAorCSAgdXBkYXRlQWxsKGZhbHNlKSwKKwkgIHN5bWJvbFllc1BpeCh4cG1fc3ltYm9sX3llcyksIHN5bWJvbE1vZFBpeCh4cG1fc3ltYm9sX21vZCksIHN5bWJvbE5vUGl4KHhwbV9zeW1ib2xfbm8pLAorCSAgY2hvaWNlWWVzUGl4KHhwbV9jaG9pY2VfeWVzKSwgY2hvaWNlTm9QaXgoeHBtX2Nob2ljZV9ubyksCisJICBtZW51UGl4KHhwbV9tZW51KSwgbWVudUludlBpeCh4cG1fbWVudV9pbnYpLCBtZW51QmFja1BpeCh4cG1fbWVudWJhY2spLCB2b2lkUGl4KHhwbV92b2lkKSwKKwkgIHNob3dBbGwoZmFsc2UpLCBzaG93TmFtZShmYWxzZSksIHNob3dSYW5nZShmYWxzZSksIHNob3dEYXRhKGZhbHNlKSwKKwkgIHJvb3RFbnRyeSgwKQoreworCWludCBpOworCisJc2V0U29ydGluZygtMSk7CisJc2V0Um9vdElzRGVjb3JhdGVkKFRSVUUpOworCWRpc2FibGVkQ29sb3JHcm91cCA9IHBhbGV0dGUoKS5hY3RpdmUoKTsKKwlkaXNhYmxlZENvbG9yR3JvdXAuc2V0Q29sb3IoUUNvbG9yR3JvdXA6OlRleHQsIHBhbGV0dGUoKS5kaXNhYmxlZCgpLnRleHQoKSk7CisJaW5hY3RpdmVkQ29sb3JHcm91cCA9IHBhbGV0dGUoKS5hY3RpdmUoKTsKKwlpbmFjdGl2ZWRDb2xvckdyb3VwLnNldENvbG9yKFFDb2xvckdyb3VwOjpIaWdobGlnaHQsIHBhbGV0dGUoKS5kaXNhYmxlZCgpLmhpZ2hsaWdodCgpKTsKKworCWNvbm5lY3QodGhpcywgU0lHTkFMKHNlbGVjdGlvbkNoYW5nZWQodm9pZCkpLAorCQlTTE9UKHVwZGF0ZVNlbGVjdGlvbih2b2lkKSkpOworCisJaWYgKGNvbmZpZ1NldHRpbmdzKSB7CisJCXNob3dBbGwgPSBjb25maWdTZXR0aW5ncy0+c2hvd0FsbDsKKwkJc2hvd05hbWUgPSBjb25maWdTZXR0aW5ncy0+c2hvd05hbWU7CisJCXNob3dSYW5nZSA9IGNvbmZpZ1NldHRpbmdzLT5zaG93UmFuZ2U7CisJCXNob3dEYXRhID0gY29uZmlnU2V0dGluZ3MtPnNob3dEYXRhOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb2xOcjsgaSsrKQorCQljb2xNYXBbaV0gPSBjb2xSZXZNYXBbaV0gPSAtMTsKKwlhZGRDb2x1bW4ocHJvbXB0Q29sSWR4LCAiT3B0aW9uIik7CisKKwlyZWluaXQoKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpyZWluaXQodm9pZCkKK3sKKwlyZW1vdmVDb2x1bW4oZGF0YUNvbElkeCk7CisJcmVtb3ZlQ29sdW1uKHllc0NvbElkeCk7CisJcmVtb3ZlQ29sdW1uKG1vZENvbElkeCk7CisJcmVtb3ZlQ29sdW1uKG5vQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obmFtZUNvbElkeCk7CisKKwlpZiAoc2hvd05hbWUpCisJCWFkZENvbHVtbihuYW1lQ29sSWR4LCAiTmFtZSIpOworCWlmIChzaG93UmFuZ2UpIHsKKwkJYWRkQ29sdW1uKG5vQ29sSWR4LCAiTiIpOworCQlhZGRDb2x1bW4obW9kQ29sSWR4LCAiTSIpOworCQlhZGRDb2x1bW4oeWVzQ29sSWR4LCAiWSIpOworCX0KKwlpZiAoc2hvd0RhdGEpCisJCWFkZENvbHVtbihkYXRhQ29sSWR4LCAiVmFsdWUiKTsKKworCXVwZGF0ZUxpc3RBbGwoKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojp1cGRhdGVTZWxlY3Rpb24odm9pZCkKK3sKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJQ29uZmlnSXRlbSogaXRlbSA9IChDb25maWdJdGVtKilzZWxlY3RlZEl0ZW0oKTsKKwlpZiAoIWl0ZW0pCisJCXJldHVybjsKKworCWN2aWV3LT5zZXRIZWxwKGl0ZW0pOworCisJbWVudSA9IGl0ZW0tPm1lbnU7CisJaWYgKCFtZW51KQorCQlyZXR1cm47CisJdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAobW9kZSA9PSBtZW51TW9kZSAmJiB0eXBlID09IFBfTUVOVSkKKwkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKQoreworCUNvbmZpZ0l0ZW0qIGxhc3QgPSAwOworCisJaWYgKCFyb290RW50cnkpCisJCWdvdG8gdXBkYXRlOworCisJaWYgKHJvb3RFbnRyeSAhPSAmcm9vdG1lbnUgJiYgKG1vZGUgPT0gc2luZ2xlTW9kZSB8fAorCSAgICAobW9kZSA9PSBzeW1ib2xNb2RlICYmIHJvb3RFbnRyeS0+cGFyZW50ICE9ICZyb290bWVudSkpKSB7CisJCWl0ZW0gPSBmaXJzdENoaWxkKCk7CisJCWlmICghaXRlbSkKKwkJCWl0ZW0gPSBuZXcgQ29uZmlnSXRlbSh0aGlzLCAwLCB0cnVlKTsKKwkJbGFzdCA9IGl0ZW07CisJfQorCWlmICgobW9kZSA9PSBzaW5nbGVNb2RlIHx8IChtb2RlID09IHN5bWJvbE1vZGUgJiYgIShyb290RW50cnktPmZsYWdzICYgTUVOVV9ST09UKSkpICYmCisJICAgIHJvb3RFbnRyeS0+c3ltICYmIHJvb3RFbnRyeS0+cHJvbXB0KSB7CisJCWl0ZW0gPSBsYXN0ID8gbGFzdC0+bmV4dFNpYmxpbmcoKSA6IGZpcnN0Q2hpbGQoKTsKKwkJaWYgKCFpdGVtKQorCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHRoaXMsIGxhc3QsIHJvb3RFbnRyeSwgdHJ1ZSk7CisJCWVsc2UKKwkJCWl0ZW0tPnRlc3RVcGRhdGVNZW51KHRydWUpOworCisJCXVwZGF0ZU1lbnVMaXN0KGl0ZW0sIHJvb3RFbnRyeSk7CisJCXRyaWdnZXJVcGRhdGUoKTsKKwkJcmV0dXJuOworCX0KK3VwZGF0ZToKKwl1cGRhdGVNZW51TGlzdCh0aGlzLCByb290RW50cnkpOworCXRyaWdnZXJVcGRhdGUoKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRBbGxPcGVuKGJvb2wgb3BlbikKK3sKKwlRTGlzdFZpZXdJdGVtSXRlcmF0b3IgaXQodGhpcyk7CisKKwlmb3IgKDsgaXQuY3VycmVudCgpOyBpdCsrKQorCQlpdC5jdXJyZW50KCktPnNldE9wZW4ob3Blbik7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0VmFsdWUoQ29uZmlnSXRlbSogaXRlbSwgdHJpc3RhdGUgdmFsKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlpbnQgdHlwZTsKKwl0cmlzdGF0ZSBvbGR2YWw7CisKKwlzeW0gPSBpdGVtLT5tZW51ID8gaXRlbS0+bWVudS0+c3ltIDogMDsKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCisJCWlmICghc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHZhbCkpCisJCQlyZXR1cm47CisJCWlmIChvbGR2YWwgPT0gbm8gJiYgaXRlbS0+bWVudS0+bGlzdCkKKwkJCWl0ZW0tPnNldE9wZW4oVFJVRSk7CisJCXBhcmVudCgpLT51cGRhdGVMaXN0KGl0ZW0pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6Y2hhbmdlVmFsdWUoQ29uZmlnSXRlbSogaXRlbSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sKiBzeW07CisJc3RydWN0IG1lbnUqIG1lbnU7CisJaW50IHR5cGUsIG9sZGV4cHIsIG5ld2V4cHI7CisKKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKCFzeW0pIHsKKwkJaWYgKGl0ZW0tPm1lbnUtPmxpc3QpCisJCQlpdGVtLT5zZXRPcGVuKCFpdGVtLT5pc09wZW4oKSk7CisJCXJldHVybjsKKwl9CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlvbGRleHByID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQluZXdleHByID0gc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlpZiAoaXRlbS0+bWVudS0+bGlzdCkgeworCQkJaWYgKG9sZGV4cHIgPT0gbmV3ZXhwcikKKwkJCQlpdGVtLT5zZXRPcGVuKCFpdGVtLT5pc09wZW4oKSk7CisJCQllbHNlIGlmIChvbGRleHByID09IG5vKQorCQkJCWl0ZW0tPnNldE9wZW4oVFJVRSk7CisJCX0KKwkJaWYgKG9sZGV4cHIgIT0gbmV3ZXhwcikKKwkJCXBhcmVudCgpLT51cGRhdGVMaXN0KGl0ZW0pOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCQlpZiAoY29sTWFwW2RhdGFDb2xJZHhdID49IDApCisJCQlpdGVtLT5zdGFydFJlbmFtZShjb2xNYXBbZGF0YUNvbElkeF0pOworCQllbHNlCisjZW5kaWYKKwkJCXBhcmVudCgpLT5saW5lRWRpdC0+c2hvdyhpdGVtKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIENvbmZpZ0xpc3Q6OnNldFJvb3RNZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlpZiAocm9vdEVudHJ5ID09IG1lbnUpCisJCXJldHVybjsKKwl0eXBlID0gbWVudSAmJiBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJaWYgKHR5cGUgIT0gUF9NRU5VKQorCQlyZXR1cm47CisJdXBkYXRlTWVudUxpc3QodGhpcywgMCk7CisJcm9vdEVudHJ5ID0gbWVudTsKKwl1cGRhdGVMaXN0QWxsKCk7CisJc2V0U2VsZWN0ZWQoY3VycmVudEl0ZW0oKSwgaGFzRm9jdXMoKSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0UGFyZW50TWVudSh2b2lkKQoreworCUNvbmZpZ0l0ZW0qIGl0ZW07CisJc3RydWN0IG1lbnUgKm9sZHJvb3Q7CisKKwlvbGRyb290ID0gcm9vdEVudHJ5OworCWlmIChyb290RW50cnkgPT0gJnJvb3RtZW51KQorCQlyZXR1cm47CisJc2V0Um9vdE1lbnUobWVudV9nZXRfcGFyZW50X21lbnUocm9vdEVudHJ5LT5wYXJlbnQpKTsKKworCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKwlmb3IgKDsgKGl0ZW0gPSAoQ29uZmlnSXRlbSopaXQuY3VycmVudCgpKTsgaXQrKykgeworCQlpZiAoaXRlbS0+bWVudSA9PSBvbGRyb290KSB7CisJCQlzZXRDdXJyZW50SXRlbShpdGVtKTsKKwkJCWVuc3VyZUl0ZW1WaXNpYmxlKGl0ZW0pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQoreworCVFMaXN0Vmlld0l0ZW0qIGkgPSBjdXJyZW50SXRlbSgpOworCUNvbmZpZ0l0ZW0qIGl0ZW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmIChldi0+a2V5KCkgPT0gS2V5X0VzY2FwZSAmJiBtb2RlICE9IGZ1bGxNb2RlKSB7CisJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJZXYtPmFjY2VwdCgpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpKSB7CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChldik7CisJCXJldHVybjsKKwl9CisJaXRlbSA9IChDb25maWdJdGVtKilpOworCisJc3dpdGNoIChldi0+a2V5KCkpIHsKKwljYXNlIEtleV9SZXR1cm46CisJY2FzZSBLZXlfRW50ZXI6CisJCWlmIChpdGVtLT5nb1BhcmVudCkgeworCQkJZW1pdCBwYXJlbnRTZWxlY3RlZCgpOworCQkJYnJlYWs7CisJCX0KKwkJbWVudSA9IGl0ZW0tPm1lbnU7CisJCWlmICghbWVudSkKKwkJCWJyZWFrOworCQl0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCQlpZiAodHlwZSA9PSBQX01FTlUgJiYgcm9vdEVudHJ5ICE9IG1lbnUgJiYKKwkJICAgIG1vZGUgIT0gZnVsbE1vZGUgJiYgbW9kZSAhPSBtZW51TW9kZSkgeworCQkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgS2V5X1NwYWNlOgorCQljaGFuZ2VWYWx1ZShpdGVtKTsKKwkJYnJlYWs7CisJY2FzZSBLZXlfTjoKKwkJc2V0VmFsdWUoaXRlbSwgbm8pOworCQlicmVhazsKKwljYXNlIEtleV9NOgorCQlzZXRWYWx1ZShpdGVtLCBtb2QpOworCQlicmVhazsKKwljYXNlIEtleV9ZOgorCQlzZXRWYWx1ZShpdGVtLCB5ZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQYXJlbnQ6OmtleVByZXNzRXZlbnQoZXYpOworCQlyZXR1cm47CisJfQorCWV2LT5hY2NlcHQoKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCogZSkKK3sKKwkvL1FQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCS8vcHJpbnRmKCJjb250ZW50c01vdXNlUHJlc3NFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlUHJlc3NFdmVudChlKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCVFQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCUNvbmZpZ0l0ZW0qIGl0ZW0gPSAoQ29uZmlnSXRlbSopaXRlbUF0KHApOworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCWNvbnN0IFFQaXhtYXAqIHBtOworCWludCBpZHgsIHg7CisKKwlpZiAoIWl0ZW0pCisJCWdvdG8gc2tpcDsKKworCW1lbnUgPSBpdGVtLT5tZW51OworCXggPSBoZWFkZXIoKS0+b2Zmc2V0KCkgKyBwLngoKTsKKwlpZHggPSBjb2xSZXZNYXBbaGVhZGVyKCktPnNlY3Rpb25BdCh4KV07CisJc3dpdGNoIChpZHgpIHsKKwljYXNlIHByb21wdENvbElkeDoKKwkJcG0gPSBpdGVtLT5waXhtYXAocHJvbXB0Q29sSWR4KTsKKwkJaWYgKHBtKSB7CisJCQlpbnQgb2ZmID0gaGVhZGVyKCktPnNlY3Rpb25Qb3MoMCkgKyBpdGVtTWFyZ2luKCkgKworCQkJCXRyZWVTdGVwU2l6ZSgpICogKGl0ZW0tPmRlcHRoKCkgKyAocm9vdElzRGVjb3JhdGVkKCkgPyAxIDogMCkpOworCQkJaWYgKHggPj0gb2ZmICYmIHggPCBvZmYgKyBwbS0+d2lkdGgoKSkgeworCQkJCWlmIChpdGVtLT5nb1BhcmVudCkgeworCQkJCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoIW1lbnUpCisJCQkJCWJyZWFrOworCQkJCXB0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCQkJCWlmIChwdHlwZSA9PSBQX01FTlUgJiYgcm9vdEVudHJ5ICE9IG1lbnUgJiYKKwkJCQkgICAgbW9kZSAhPSBmdWxsTW9kZSAmJiBtb2RlICE9IG1lbnVNb2RlKQorCQkJCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKKwkJCQllbHNlCisJCQkJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2Ugbm9Db2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIG5vKTsKKwkJYnJlYWs7CisJY2FzZSBtb2RDb2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIG1vZCk7CisJCWJyZWFrOworCWNhc2UgeWVzQ29sSWR4OgorCQlzZXRWYWx1ZShpdGVtLCB5ZXMpOworCQlicmVhazsKKwljYXNlIGRhdGFDb2xJZHg6CisJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQlicmVhazsKKwl9CisKK3NraXA6CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VSZWxlYXNlRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZVJlbGVhc2VFdmVudChlKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCS8vUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VNb3ZlRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZU1vdmVFdmVudChlKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCogZSkKK3sKKwlRUG9pbnQgcChjb250ZW50c1RvVmlld3BvcnQoZS0+cG9zKCkpKTsKKwlDb25maWdJdGVtKiBpdGVtID0gKENvbmZpZ0l0ZW0qKWl0ZW1BdChwKTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKworCWlmICghaXRlbSkKKwkJZ290byBza2lwOworCWlmIChpdGVtLT5nb1BhcmVudCkgeworCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCWdvdG8gc2tpcDsKKwl9CisJbWVudSA9IGl0ZW0tPm1lbnU7CisJaWYgKCFtZW51KQorCQlnb3RvIHNraXA7CisJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJaWYgKHB0eXBlID09IFBfTUVOVSAmJiAobW9kZSA9PSBzaW5nbGVNb2RlIHx8IG1vZGUgPT0gc3ltYm9sTW9kZSkpCisJCWVtaXQgbWVudVNlbGVjdGVkKG1lbnUpOworCWVsc2UgaWYgKG1lbnUtPnN5bSkKKwkJY2hhbmdlVmFsdWUoaXRlbSk7CisKK3NraXA6CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50OiAlZCwlZFxuIiwgcC54KCksIHAueSgpKTsKKwlQYXJlbnQ6OmNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqZSkKK3sKKwlQYXJlbnQ6OmZvY3VzSW5FdmVudChlKTsKKworCVFMaXN0Vmlld0l0ZW0qIGl0ZW0gPSBjdXJyZW50SXRlbSgpOworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJc2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJZW1pdCBnb3RGb2N1cygpOworfQorCitDb25maWdWaWV3KiBDb25maWdWaWV3Ojp2aWV3TGlzdDsKKworQ29uZmlnVmlldzo6Q29uZmlnVmlldyhRV2lkZ2V0KiBwYXJlbnQsIENvbmZpZ01haW5XaW5kb3cqIGN2aWV3LAorCQkgICAgICAgQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzKQorCTogUGFyZW50KHBhcmVudCkKK3sKKwlsaXN0ID0gbmV3IENvbmZpZ0xpc3QodGhpcywgY3ZpZXcsIGNvbmZpZ1NldHRpbmdzKTsKKwlsaW5lRWRpdCA9IG5ldyBDb25maWdMaW5lRWRpdCh0aGlzKTsKKwlsaW5lRWRpdC0+aGlkZSgpOworCisJdGhpcy0+bmV4dFZpZXcgPSB2aWV3TGlzdDsKKwl2aWV3TGlzdCA9IHRoaXM7Cit9CisKK0NvbmZpZ1ZpZXc6On5Db25maWdWaWV3KHZvaWQpCit7CisJQ29uZmlnVmlldyoqIHZwOworCisJZm9yICh2cCA9ICZ2aWV3TGlzdDsgKnZwOyB2cCA9ICYoKnZwKS0+bmV4dFZpZXcpIHsKKwkJaWYgKCp2cCA9PSB0aGlzKSB7CisJCQkqdnAgPSBuZXh0VmlldzsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIENvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3QoQ29uZmlnSXRlbSogaXRlbSkKK3sKKwlDb25maWdWaWV3KiB2OworCisJZm9yICh2ID0gdmlld0xpc3Q7IHY7IHYgPSB2LT5uZXh0VmlldykKKwkJdi0+bGlzdC0+dXBkYXRlTGlzdChpdGVtKTsKK30KKwordm9pZCBDb25maWdWaWV3Ojp1cGRhdGVMaXN0QWxsKHZvaWQpCit7CisJQ29uZmlnVmlldyogdjsKKworCWZvciAodiA9IHZpZXdMaXN0OyB2OyB2ID0gdi0+bmV4dFZpZXcpCisJCXYtPmxpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKK30KKworLyoKKyAqIENvbnN0cnVjdCB0aGUgY29tcGxldGUgY29uZmlnIHdpZGdldAorICovCitDb25maWdNYWluV2luZG93OjpDb25maWdNYWluV2luZG93KHZvaWQpCit7CisJUU1lbnVCYXIqIG1lbnU7CisJYm9vbCBvazsKKwlpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKKworCVFXaWRnZXQgKmQgPSBjb25maWdBcHAtPmRlc2t0b3AoKTsKKworCUNvbmZpZ1NldHRpbmdzKiBjb25maWdTZXR0aW5ncyA9IG5ldyBDb25maWdTZXR0aW5ncygpOworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJd2lkdGggPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgd2lkdGgiLCBkLT53aWR0aCgpIC0gNjQpOworCWhlaWdodCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyBoZWlnaHQiLCBkLT5oZWlnaHQoKSAtIDY0KTsKKwlyZXNpemUod2lkdGgsIGhlaWdodCk7CisJeCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB4IiwgMCwgJm9rKTsKKwlpZiAob2spCisJCXkgPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeSIsIDAsICZvayk7CisJaWYgKG9rKQorCQltb3ZlKHgsIHkpOworCXNob3dEZWJ1ZyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGVidWciLCBmYWxzZSk7CisKKwkvLyByZWFkIGxpc3Qgc2V0dGluZ3MgaW50byBjb25maWdTZXR0aW5ncywgd2lsbCBiZSB1c2VkIGxhdGVyIGZvciBDb25maWdMaXN0IHNldHVwCisJY29uZmlnU2V0dGluZ3MtPnJlYWRMaXN0U2V0dGluZ3MoKTsKKyNlbHNlCisJd2lkdGggPSBkLT53aWR0aCgpIC0gNjQ7CisJaGVpZ2h0ID0gZC0+aGVpZ2h0KCkgLSA2NDsKKwlyZXNpemUod2lkdGgsIGhlaWdodCk7CisJc2hvd0RlYnVnID0gZmFsc2U7CisjZW5kaWYKKworCXNwbGl0MSA9IG5ldyBRU3BsaXR0ZXIodGhpcyk7CisJc3BsaXQxLT5zZXRPcmllbnRhdGlvbihRU3BsaXR0ZXI6Okhvcml6b250YWwpOworCXNldENlbnRyYWxXaWRnZXQoc3BsaXQxKTsKKworCW1lbnVWaWV3ID0gbmV3IENvbmZpZ1ZpZXcoc3BsaXQxLCB0aGlzLCBjb25maWdTZXR0aW5ncyk7CisJbWVudUxpc3QgPSBtZW51Vmlldy0+bGlzdDsKKworCXNwbGl0MiA9IG5ldyBRU3BsaXR0ZXIoc3BsaXQxKTsKKwlzcGxpdDItPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6VmVydGljYWwpOworCisJLy8gY3JlYXRlIGNvbmZpZyB0cmVlCisJY29uZmlnVmlldyA9IG5ldyBDb25maWdWaWV3KHNwbGl0MiwgdGhpcywgY29uZmlnU2V0dGluZ3MpOworCWNvbmZpZ0xpc3QgPSBjb25maWdWaWV3LT5saXN0OworCisJaGVscFRleHQgPSBuZXcgUVRleHRWaWV3KHNwbGl0Mik7CisJaGVscFRleHQtPnNldFRleHRGb3JtYXQoUXQ6OlJpY2hUZXh0KTsKKworCXNldFRhYk9yZGVyKGNvbmZpZ0xpc3QsIGhlbHBUZXh0KTsKKwljb25maWdMaXN0LT5zZXRGb2N1cygpOworCisJbWVudSA9IG1lbnVCYXIoKTsKKwl0b29sQmFyID0gbmV3IFFUb29sQmFyKCJUb29scyIsIHRoaXMpOworCisJYmFja0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJCYWNrIiwgUVBpeG1hcCh4cG1fYmFjayksICJCYWNrIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KGJhY2tBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoZ29CYWNrKCkpKTsKKwkgIGJhY2tBY3Rpb24tPnNldEVuYWJsZWQoRkFMU0UpOworCVFBY3Rpb24gKnF1aXRBY3Rpb24gPSBuZXcgUUFjdGlvbigiUXVpdCIsICImUXVpdCIsIENUUkwrS2V5X1EsIHRoaXMpOworCSAgY29ubmVjdChxdWl0QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKGNsb3NlKCkpKTsKKwlRQWN0aW9uICpsb2FkQWN0aW9uID0gbmV3IFFBY3Rpb24oIkxvYWQiLCBRUGl4bWFwKHhwbV9sb2FkKSwgIiZMb2FkIiwgQ1RSTCtLZXlfTCwgdGhpcyk7CisJICBjb25uZWN0KGxvYWRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QobG9hZENvbmZpZygpKSk7CisJUUFjdGlvbiAqc2F2ZUFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIiwgUVBpeG1hcCh4cG1fc2F2ZSksICImU2F2ZSIsIENUUkwrS2V5X1MsIHRoaXMpOworCSAgY29ubmVjdChzYXZlQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWcoKSkpOworCVFBY3Rpb24gKnNhdmVBc0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIEFzLi4uIiwgIlNhdmUgJkFzLi4uIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNhdmVBc0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzYXZlQ29uZmlnQXMoKSkpOworCVFBY3Rpb24gKnNpbmdsZVZpZXdBY3Rpb24gPSBuZXcgUUFjdGlvbigiU2luZ2xlIFZpZXciLCBRUGl4bWFwKHhwbV9zaW5nbGVfdmlldyksICJTcGxpdCBWaWV3IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNpbmdsZVZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd1NpbmdsZVZpZXcoKSkpOworCVFBY3Rpb24gKnNwbGl0Vmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTcGxpdCBWaWV3IiwgUVBpeG1hcCh4cG1fc3BsaXRfdmlldyksICJTcGxpdCBWaWV3IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNwbGl0Vmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93U3BsaXRWaWV3KCkpKTsKKwlRQWN0aW9uICpmdWxsVmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJGdWxsIFZpZXciLCBRUGl4bWFwKHhwbV90cmVlX3ZpZXcpLCAiRnVsbCBWaWV3IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KGZ1bGxWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dGdWxsVmlldygpKSk7CisKKwlRQWN0aW9uICpzaG93TmFtZUFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IE5hbWUiLCAwLCB0aGlzKTsKKwkgIHNob3dOYW1lQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93TmFtZUFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd05hbWUpOworCSAgY29ubmVjdChzaG93TmFtZUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dOYW1lKGJvb2wpKSk7CisJUUFjdGlvbiAqc2hvd1JhbmdlQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgUmFuZ2UiLCAwLCB0aGlzKTsKKwkgIHNob3dSYW5nZUFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgc2hvd1JhbmdlQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93UmFuZ2UpOworCSAgY29ubmVjdChzaG93UmFuZ2VBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93UmFuZ2UoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93RGF0YUFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IERhdGEiLCAwLCB0aGlzKTsKKwkgIHNob3dEYXRhQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93RGF0YUFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd0RhdGEpOworCSAgY29ubmVjdChzaG93RGF0YUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dEYXRhKGJvb2wpKSk7CisJUUFjdGlvbiAqc2hvd0FsbEFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IEFsbCBPcHRpb25zIiwgMCwgdGhpcyk7CisJICBzaG93QWxsQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93QWxsQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93QWxsKTsKKwkgIGNvbm5lY3Qoc2hvd0FsbEFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dBbGwoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93RGVidWdBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBEZWJ1ZyBJbmZvIiwgMCwgdGhpcyk7CisJICBzaG93RGVidWdBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dEZWJ1Z0FjdGlvbi0+c2V0T24oc2hvd0RlYnVnKTsKKwkgIGNvbm5lY3Qoc2hvd0RlYnVnQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0RlYnVnKGJvb2wpKSk7CisKKwlRQWN0aW9uICpzaG93SW50cm9BY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiSW50cm9kdWN0aW9uIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNob3dJbnRyb0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93SW50cm8oKSkpOworCVFBY3Rpb24gKnNob3dBYm91dEFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJBYm91dCIsIDAsIHRoaXMpOworCSAgY29ubmVjdChzaG93QWJvdXRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd0Fib3V0KCkpKTsKKworCS8vIGluaXQgdG9vbCBiYXIKKwliYWNrQWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwl0b29sQmFyLT5hZGRTZXBhcmF0b3IoKTsKKwlsb2FkQWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwlzYXZlQWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwl0b29sQmFyLT5hZGRTZXBhcmF0b3IoKTsKKwlzaW5nbGVWaWV3QWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwlzcGxpdFZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCWZ1bGxWaWV3QWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKworCS8vIGNyZWF0ZSBjb25maWcgbWVudQorCVFQb3B1cE1lbnUqIGNvbmZpZyA9IG5ldyBRUG9wdXBNZW51KHRoaXMpOworCW1lbnUtPmluc2VydEl0ZW0oIiZGaWxlIiwgY29uZmlnKTsKKwlsb2FkQWN0aW9uLT5hZGRUbyhjb25maWcpOworCXNhdmVBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJc2F2ZUFzQWN0aW9uLT5hZGRUbyhjb25maWcpOworCWNvbmZpZy0+aW5zZXJ0U2VwYXJhdG9yKCk7CisJcXVpdEFjdGlvbi0+YWRkVG8oY29uZmlnKTsKKworCS8vIGNyZWF0ZSBvcHRpb25zIG1lbnUKKwlRUG9wdXBNZW51KiBvcHRpb25NZW51ID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJk9wdGlvbiIsIG9wdGlvbk1lbnUpOworCXNob3dOYW1lQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlzaG93UmFuZ2VBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dEYXRhQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlvcHRpb25NZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlzaG93QWxsQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlzaG93RGVidWdBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCisJLy8gY3JlYXRlIGhlbHAgbWVudQorCVFQb3B1cE1lbnUqIGhlbHBNZW51ID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0U2VwYXJhdG9yKCk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJkhlbHAiLCBoZWxwTWVudSk7CisJc2hvd0ludHJvQWN0aW9uLT5hZGRUbyhoZWxwTWVudSk7CisJc2hvd0Fib3V0QWN0aW9uLT5hZGRUbyhoZWxwTWVudSk7CisKKwljb25uZWN0KGNvbmZpZ0xpc3QsIFNJR05BTChtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKikpLAorCQlTTE9UKGNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKikpKTsKKwljb25uZWN0KGNvbmZpZ0xpc3QsIFNJR05BTChwYXJlbnRTZWxlY3RlZCgpKSwKKwkJU0xPVChnb0JhY2soKSkpOworCWNvbm5lY3QobWVudUxpc3QsIFNJR05BTChtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKikpLAorCQlTTE9UKGNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKikpKTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKGdvdEZvY3VzKHZvaWQpKSwKKwkJU0xPVChsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpKSk7CisJY29ubmVjdChtZW51TGlzdCwgU0lHTkFMKGdvdEZvY3VzKHZvaWQpKSwKKwkJU0xPVChsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpKSk7CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCVFTdHJpbmcgbGlzdE1vZGUgPSBjb25maWdTZXR0aW5ncy0+cmVhZEVudHJ5KCIva2NvbmZpZy9xY29uZi9saXN0TW9kZSIsICJzeW1ib2wiKTsKKwlpZiAobGlzdE1vZGUgPT0gInNpbmdsZSIpCisJCXNob3dTaW5nbGVWaWV3KCk7CisJZWxzZSBpZiAobGlzdE1vZGUgPT0gImZ1bGwiKQorCQlzaG93RnVsbFZpZXcoKTsKKwllbHNlIC8qaWYgKGxpc3RNb2RlID09ICJzcGxpdCIpKi8KKwkJc2hvd1NwbGl0VmlldygpOworCisJLy8gVUkgc2V0dXAgZG9uZSwgcmVzdG9yZSBzcGxpdHRlciBwb3NpdGlvbnMKKwlRVmFsdWVMaXN0PGludD4gc2l6ZXMgPSBjb25maWdTZXR0aW5ncy0+cmVhZFNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDEiLCAmb2spOworCWlmIChvaykKKwkJc3BsaXQxLT5zZXRTaXplcyhzaXplcyk7CisKKwlzaXplcyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MiIsICZvayk7CisJaWYgKG9rKQorCQlzcGxpdDItPnNldFNpemVzKHNpemVzKTsKKyNlbHNlCisJc2hvd1NwbGl0VmlldygpOworI2VuZGlmCisJZGVsZXRlIGNvbmZpZ1NldHRpbmdzOworfQorCitzdGF0aWMgUVN0cmluZyBwcmludF9maWx0ZXIoY29uc3QgUVN0cmluZyAmc3RyKQoreworCVFSZWdFeHAgcmUoIls8PiZcIlxcbl0iKTsKKwlRU3RyaW5nIHJlcyA9IHN0cjsKKwlmb3IgKGludCBpID0gMDsgKGkgPSByZXMuZmluZChyZSwgaSkpID49IDA7KSB7CisJCXN3aXRjaCAocmVzW2ldLmxhdGluMSgpKSB7CisJCWNhc2UgJzwnOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZsdDsiKTsKKwkJCWkgKz0gNDsKKwkJCWJyZWFrOworCQljYXNlICc+JzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImZ3Q7Iik7CisJCQlpICs9IDQ7CisJCQlicmVhazsKKwkJY2FzZSAnJic6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiJmFtcDsiKTsKKwkJCWkgKz0gNTsKKwkJCWJyZWFrOworCQljYXNlICciJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImcXVvdDsiKTsKKwkJCWkgKz0gNjsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiPGJyPiIpOworCQkJaSArPSA0OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgZXhwcl9wcmludF9oZWxwKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZWludGVycHJldF9jYXN0PFFTdHJpbmcqPihkYXRhKS0+YXBwZW5kKHByaW50X2ZpbHRlcihzdHIpKTsKK30KKworLyoKKyAqIGRpc3BsYXkgYSBuZXcgaGVscCBlbnRyeSBhcyBzb29uIGFzIGEgbmV3IG1lbnUgZW50cnkgaXMgc2VsZWN0ZWQKKyAqLwordm9pZCBDb25maWdNYWluV2luZG93OjpzZXRIZWxwKFFMaXN0Vmlld0l0ZW0qIGl0ZW0pCit7CisJc3RydWN0IHN5bWJvbCogc3ltOworCXN0cnVjdCBtZW51KiBtZW51ID0gMDsKKworCWNvbmZpZ0xpc3QtPnBhcmVudCgpLT5saW5lRWRpdC0+aGlkZSgpOworCWlmIChpdGVtKQorCQltZW51ID0gKChDb25maWdJdGVtKilpdGVtKS0+bWVudTsKKwlpZiAoIW1lbnUpIHsKKwkJaGVscFRleHQtPnNldFRleHQoUVN0cmluZzo6bnVsbCk7CisJCXJldHVybjsKKwl9CisKKwlRU3RyaW5nIGhlYWQsIGRlYnVnLCBoZWxwOworCW1lbnUgPSAoKENvbmZpZ0l0ZW0qKWl0ZW0pLT5tZW51OworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoc3ltKSB7CisJCWlmIChtZW51LT5wcm9tcHQpIHsKKwkJCWhlYWQgKz0gIjxiaWc+PGI+IjsKKwkJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKF8obWVudS0+cHJvbXB0LT50ZXh0KSk7CisJCQloZWFkICs9ICI8L2I+PC9iaWc+IjsKKwkJCWlmIChzeW0tPm5hbWUpIHsKKwkJCQloZWFkICs9ICIgKCI7CisJCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhzeW0tPm5hbWUpKTsKKwkJCQloZWFkICs9ICIpIjsKKwkJCX0KKwkJfSBlbHNlIGlmIChzeW0tPm5hbWUpIHsKKwkJCWhlYWQgKz0gIjxiaWc+PGI+IjsKKwkJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKF8oc3ltLT5uYW1lKSk7CisJCQloZWFkICs9ICI8L2I+PC9iaWc+IjsKKwkJfQorCQloZWFkICs9ICI8YnI+PGJyPiI7CisKKwkJaWYgKHNob3dEZWJ1ZykgeworCQkJZGVidWcgKz0gInR5cGU6ICI7CisJCQlkZWJ1ZyArPSBwcmludF9maWx0ZXIoc3ltX3R5cGVfbmFtZShzeW0tPnR5cGUpKTsKKwkJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCQkJZGVidWcgKz0gIiAoY2hvaWNlKSI7CisJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpIHsKKwkJCQlkZWJ1ZyArPSAicmV2ZXJzZSBkZXA6ICI7CisJCQkJZXhwcl9wcmludChzeW0tPnJldl9kZXAuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJZGVidWcgKz0gIjxicj4iOworCQkJfQorCQkJZm9yIChzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQkJY2FzZSBQX1BST01QVDoKKwkJCQljYXNlIFBfTUVOVToKKwkJCQkJZGVidWcgKz0gInByb21wdDogIjsKKwkJCQkJZGVidWcgKz0gcHJpbnRfZmlsdGVyKF8ocHJvcC0+dGV4dCkpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9ERUZBVUxUOgorCQkJCQlkZWJ1ZyArPSAiZGVmYXVsdDogIjsKKwkJCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBfQ0hPSUNFOgorCQkJCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkJCQlkZWJ1ZyArPSAiY2hvaWNlOiAiOworCQkJCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFBfU0VMRUNUOgorCQkJCQlkZWJ1ZyArPSAic2VsZWN0OiAiOworCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9SQU5HRToKKwkJCQkJZGVidWcgKz0gInJhbmdlOiAiOworCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWRlYnVnICs9ICJ1bmtub3duIHByb3BlcnR5OiAiOworCQkJCQlkZWJ1ZyArPSBwcm9wX2dldF90eXBlX25hbWUocHJvcC0+dHlwZSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQl9CisJCQkJaWYgKHByb3AtPnZpc2libGUuZXhwcikgeworCQkJCQlkZWJ1ZyArPSAiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGVwOiAiOworCQkJCQlleHByX3ByaW50KHByb3AtPnZpc2libGUuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQl9CisJCQl9CisJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCX0KKworCQloZWxwID0gcHJpbnRfZmlsdGVyKF8oc3ltLT5oZWxwKSk7CisJfSBlbHNlIGlmIChtZW51LT5wcm9tcHQpIHsKKwkJaGVhZCArPSAiPGJpZz48Yj4iOworCQloZWFkICs9IHByaW50X2ZpbHRlcihfKG1lbnUtPnByb21wdC0+dGV4dCkpOworCQloZWFkICs9ICI8L2I+PC9iaWc+PGJyPjxicj4iOworCQlpZiAoc2hvd0RlYnVnKSB7CisJCQlpZiAobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIpIHsKKwkJCQlkZWJ1ZyArPSAiJm5ic3A7Jm5ic3A7ZGVwOiAiOworCQkJCWV4cHJfcHJpbnQobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCWRlYnVnICs9ICI8YnI+PGJyPiI7CisJCQl9CisJCX0KKwl9CisJaWYgKHNob3dEZWJ1ZykKKwkJZGVidWcgKz0gUVN0cmluZygpLnNwcmludGYoImRlZmluZWQgYXQgJXM6JWQ8YnI+PGJyPiIsIG1lbnUtPmZpbGUtPm5hbWUsIG1lbnUtPmxpbmVubyk7CisJaGVscFRleHQtPnNldFRleHQoaGVhZCArIGRlYnVnICsgaGVscCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6bG9hZENvbmZpZyh2b2lkKQoreworCVFTdHJpbmcgcyA9IFFGaWxlRGlhbG9nOjpnZXRPcGVuRmlsZU5hbWUoIi5jb25maWciLCBOVUxMLCB0aGlzKTsKKwlpZiAocy5pc051bGwoKSkKKwkJcmV0dXJuOworCWlmIChjb25mX3JlYWQoUUZpbGU6OmVuY29kZU5hbWUocykpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24hIik7CisJQ29uZmlnVmlldzo6dXBkYXRlTGlzdEFsbCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWcodm9pZCkKK3sKKwlpZiAoY29uZl93cml0ZShOVUxMKSkKKwkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsICJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uISIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWdBcyh2b2lkKQoreworCVFTdHJpbmcgcyA9IFFGaWxlRGlhbG9nOjpnZXRTYXZlRmlsZU5hbWUoIi5jb25maWciLCBOVUxMLCB0aGlzKTsKKwlpZiAocy5pc051bGwoKSkKKwkJcmV0dXJuOworCWlmIChjb25mX3dyaXRlKFFGaWxlOjplbmNvZGVOYW1lKHMpKSkKKwkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsICJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uISIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUobWVudSk7CisJYmFja0FjdGlvbi0+c2V0RW5hYmxlZChUUlVFKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpCit7CisJaWYgKG1lbnVMaXN0LT5oYXNGb2N1cygpKSB7CisJCWlmIChtZW51TGlzdC0+bW9kZSA9PSBtZW51TW9kZSkKKwkJCWNvbmZpZ0xpc3QtPmNsZWFyU2VsZWN0aW9uKCk7CisJCXNldEhlbHAobWVudUxpc3QtPnNlbGVjdGVkSXRlbSgpKTsKKwl9IGVsc2UgaWYgKGNvbmZpZ0xpc3QtPmhhc0ZvY3VzKCkpIHsKKwkJc2V0SGVscChjb25maWdMaXN0LT5zZWxlY3RlZEl0ZW0oKSk7CisJfQorfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmdvQmFjayh2b2lkKQoreworCUNvbmZpZ0l0ZW0qIGl0ZW07CisKKwljb25maWdMaXN0LT5zZXRQYXJlbnRNZW51KCk7CisJaWYgKGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCWJhY2tBY3Rpb24tPnNldEVuYWJsZWQoRkFMU0UpOworCWl0ZW0gPSAoQ29uZmlnSXRlbSopbWVudUxpc3QtPnNlbGVjdGVkSXRlbSgpOworCXdoaWxlIChpdGVtKSB7CisJCWlmIChpdGVtLT5tZW51ID09IGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSkgeworCQkJbWVudUxpc3QtPnNldFNlbGVjdGVkKGl0ZW0sIFRSVUUpOworCQkJYnJlYWs7CisJCX0KKwkJaXRlbSA9IChDb25maWdJdGVtKilpdGVtLT5wYXJlbnQoKTsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd1NpbmdsZVZpZXcodm9pZCkKK3sKKwltZW51Vmlldy0+aGlkZSgpOworCW1lbnVMaXN0LT5zZXRSb290TWVudSgwKTsKKwljb25maWdMaXN0LT5tb2RlID0gc2luZ2xlTW9kZTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJY29uZmlnTGlzdC0+dXBkYXRlTGlzdEFsbCgpOworCWVsc2UKKwkJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUoJnJvb3RtZW51KTsKKwljb25maWdMaXN0LT5zZXRBbGxPcGVuKFRSVUUpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd1NwbGl0Vmlldyh2b2lkKQoreworCWNvbmZpZ0xpc3QtPm1vZGUgPSBzeW1ib2xNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oVFJVRSk7CisJY29uZmlnQXBwLT5wcm9jZXNzRXZlbnRzKCk7CisJbWVudUxpc3QtPm1vZGUgPSBtZW51TW9kZTsKKwltZW51TGlzdC0+c2V0Um9vdE1lbnUoJnJvb3RtZW51KTsKKwltZW51TGlzdC0+c2V0QWxsT3BlbihUUlVFKTsKKwltZW51Vmlldy0+c2hvdygpOworCW1lbnVMaXN0LT5zZXRGb2N1cygpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNob3dGdWxsVmlldyh2b2lkKQoreworCW1lbnVWaWV3LT5oaWRlKCk7CisJbWVudUxpc3QtPnNldFJvb3RNZW51KDApOworCWNvbmZpZ0xpc3QtPm1vZGUgPSBmdWxsTW9kZTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJY29uZmlnTGlzdC0+dXBkYXRlTGlzdEFsbCgpOworCWVsc2UKKwkJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUoJnJvb3RtZW51KTsKKwljb25maWdMaXN0LT5zZXRBbGxPcGVuKEZBTFNFKTsKKwljb25maWdMaXN0LT5zZXRGb2N1cygpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dBbGwoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93QWxsID09IGIpCisJCXJldHVybjsKKwljb25maWdMaXN0LT5zaG93QWxsID0gYjsKKwljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJbWVudUxpc3QtPnNob3dBbGwgPSBiOworCW1lbnVMaXN0LT51cGRhdGVMaXN0QWxsKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0RlYnVnKGJvb2wgYikKK3sKKwlpZiAoc2hvd0RlYnVnID09IGIpCisJCXJldHVybjsKKwlzaG93RGVidWcgPSBiOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dOYW1lKGJvb2wgYikKK3sKKwlpZiAoY29uZmlnTGlzdC0+c2hvd05hbWUgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dOYW1lID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd05hbWUgPSBiOworCW1lbnVMaXN0LT5yZWluaXQoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzZXRTaG93UmFuZ2UoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93UmFuZ2UgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dSYW5nZSA9IGI7CisJY29uZmlnTGlzdC0+cmVpbml0KCk7CisJbWVudUxpc3QtPnNob3dSYW5nZSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dEYXRhKGJvb2wgYikKK3sKKwlpZiAoY29uZmlnTGlzdC0+c2hvd0RhdGEgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dEYXRhID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd0RhdGEgPSBiOworCW1lbnVMaXN0LT5yZWluaXQoKTsKK30KKworLyoKKyAqIGFzayBmb3Igc2F2aW5nIGNvbmZpZ3VyYXRpb24gYmVmb3JlIHF1aXR0aW5nCisgKiBUT0RPIGFzayBvbmx5IHdoZW4gc29tZXRoaW5nIGNoYW5nZWQKKyAqLwordm9pZCBDb25maWdNYWluV2luZG93OjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBlKQoreworCWlmICghc3ltX2NoYW5nZV9jb3VudCkgeworCQllLT5hY2NlcHQoKTsKKwkJcmV0dXJuOworCX0KKwlRTWVzc2FnZUJveCBtYigicWNvbmYiLCAiU2F2ZSBjb25maWd1cmF0aW9uPyIsIFFNZXNzYWdlQm94OjpXYXJuaW5nLAorCQkJUU1lc3NhZ2VCb3g6OlllcyB8IFFNZXNzYWdlQm94OjpEZWZhdWx0LCBRTWVzc2FnZUJveDo6Tm8sIFFNZXNzYWdlQm94OjpDYW5jZWwgfCBRTWVzc2FnZUJveDo6RXNjYXBlKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpZZXMsICImU2F2ZSBDaGFuZ2VzIik7CisJbWIuc2V0QnV0dG9uVGV4dChRTWVzc2FnZUJveDo6Tm8sICImRGlzY2FyZCBDaGFuZ2VzIik7CisJbWIuc2V0QnV0dG9uVGV4dChRTWVzc2FnZUJveDo6Q2FuY2VsLCAiQ2FuY2VsIEV4aXQiKTsKKwlzd2l0Y2ggKG1iLmV4ZWMoKSkgeworCWNhc2UgUU1lc3NhZ2VCb3g6OlllczoKKwkJY29uZl93cml0ZShOVUxMKTsKKwljYXNlIFFNZXNzYWdlQm94OjpObzoKKwkJZS0+YWNjZXB0KCk7CisJCWJyZWFrOworCWNhc2UgUU1lc3NhZ2VCb3g6OkNhbmNlbDoKKwkJZS0+aWdub3JlKCk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93SW50cm8odm9pZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbXSA9ICJXZWxjb21lIHRvIHRoZSBxY29uZiBncmFwaGljYWwgY29uZmlndXJhdGlvbiB0b29sLlxuXG4iCisJCSJGb3IgZWFjaCBvcHRpb24sIGEgYmxhbmsgYm94IGluZGljYXRlcyB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCwgYSBjaGVja1xuIgorCQkiaW5kaWNhdGVzIGl0IGlzIGVuYWJsZWQsIGFuZCBhIGRvdCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyB0byBiZSBjb21waWxlZFxuIgorCQkiYXMgYSBtb2R1bGUuICBDbGlja2luZyBvbiB0aGUgYm94IHdpbGwgY3ljbGUgdGhyb3VnaCB0aGUgdGhyZWUgc3RhdGVzLlxuXG4iCisJCSJJZiB5b3UgZG8gbm90IHNlZSBhbiBvcHRpb24gKGUuZy4sIGEgZGV2aWNlIGRyaXZlcikgdGhhdCB5b3UgYmVsaWV2ZVxuIgorCQkic2hvdWxkIGJlIHByZXNlbnQsIHRyeSB0dXJuaW5nIG9uIFNob3cgQWxsIE9wdGlvbnMgdW5kZXIgdGhlIE9wdGlvbnMgbWVudS5cbiIKKwkJIkFsdGhvdWdoIHRoZXJlIGlzIG5vIGNyb3NzIHJlZmVyZW5jZSB5ZXQgdG8gaGVscCB5b3UgZmlndXJlIG91dCB3aGF0IG90aGVyXG4iCisJCSJvcHRpb25zIG11c3QgYmUgZW5hYmxlZCB0byBzdXBwb3J0IHRoZSBvcHRpb24geW91IGFyZSBpbnRlcmVzdGVkIGluLCB5b3UgY2FuXG4iCisJCSJzdGlsbCB2aWV3IHRoZSBoZWxwIG9mIGEgZ3JheWVkLW91dCBvcHRpb24uXG5cbiIKKwkJIlRvZ2dsaW5nIFNob3cgRGVidWcgSW5mbyB1bmRlciB0aGUgT3B0aW9ucyBtZW51IHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzLFxuIgorCQkid2hpY2ggeW91IGNhbiB0aGVuIG1hdGNoIGJ5IGV4YW1pbmluZyBvdGhlciBvcHRpb25zLlxuXG4iOworCisJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsIHN0cik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd0Fib3V0KHZvaWQpCit7CisJc3RhdGljIGNoYXIgc3RyW10gPSAicWNvbmYgaXMgQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPi5cbiI7CisKKwlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgc3RyKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlU2V0dGluZ3Modm9pZCkKK3sKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCUNvbmZpZ1NldHRpbmdzICpjb25maWdTZXR0aW5ncyA9IG5ldyBDb25maWdTZXR0aW5nczsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHgiLCBwb3MoKS54KCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeSIsIHBvcygpLnkoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB3aWR0aCIsIHNpemUoKS53aWR0aCgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IGhlaWdodCIsIHNpemUoKS5oZWlnaHQoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dOYW1lIiwgY29uZmlnTGlzdC0+c2hvd05hbWUpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93UmFuZ2UiLCBjb25maWdMaXN0LT5zaG93UmFuZ2UpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGF0YSIsIGNvbmZpZ0xpc3QtPnNob3dEYXRhKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0FsbCIsIGNvbmZpZ0xpc3QtPnNob3dBbGwpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGVidWciLCBzaG93RGVidWcpOworCisJUVN0cmluZyBlbnRyeTsKKwlzd2l0Y2goY29uZmlnTGlzdC0+bW9kZSkgeworCWNhc2Ugc2luZ2xlTW9kZSA6CisJCWVudHJ5ID0gInNpbmdsZSI7CisJCWJyZWFrOworCisJY2FzZSBzeW1ib2xNb2RlIDoKKwkJZW50cnkgPSAic3BsaXQiOworCQlicmVhazsKKworCWNhc2UgZnVsbE1vZGUgOgorCQllbnRyeSA9ICJmdWxsIjsKKwkJYnJlYWs7CisJfQorCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9saXN0TW9kZSIsIGVudHJ5KTsKKworCWNvbmZpZ1NldHRpbmdzLT53cml0ZVNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDEiLCBzcGxpdDEtPnNpemVzKCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZVNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDIiLCBzcGxpdDItPnNpemVzKCkpOworCisJZGVsZXRlIGNvbmZpZ1NldHRpbmdzOworI2VuZGlmCit9CisKK3ZvaWQgZml4dXBfcm9vdG1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0YXRpYyBpbnQgbWVudV9jbnQgPSAwOworCisJbWVudS0+ZmxhZ3MgfD0gTUVOVV9ST09UOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQlpZiAoY2hpbGQtPnByb21wdCAmJiBjaGlsZC0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkgeworCQkJbWVudV9jbnQrKzsKKwkJCWZpeHVwX3Jvb3RtZW51KGNoaWxkKTsKKwkJCW1lbnVfY250LS07CisJCX0gZWxzZSBpZiAoIW1lbnVfY250KQorCQkJZml4dXBfcm9vdG1lbnUoY2hpbGQpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2duYW1lOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCXByaW50ZigiJXMgPGNvbmZpZz5cbiIsIHByb2duYW1lKTsKKwlleGl0KDApOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIqKiBhdikKK3sKKwlDb25maWdNYWluV2luZG93KiB2OworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOworCXRleHRkb21haW4oUEFDS0FHRSk7CisKKyNpZm5kZWYgTEtDX0RJUkVDVF9MSU5LCisJa2NvbmZpZ19sb2FkKCk7CisjZW5kaWYKKworCXByb2duYW1lID0gYXZbMF07CisJY29uZmlnQXBwID0gbmV3IFFBcHBsaWNhdGlvbihhYywgYXYpOworCWlmIChhYyA+IDEgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXZbMV1bMV0pIHsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJdXNhZ2UoKTsKKwkJfQorCQluYW1lID0gYXZbMl07CisJfSBlbHNlCisJCW5hbWUgPSBhdlsxXTsKKwlpZiAoIW5hbWUpCisJCXVzYWdlKCk7CisKKwljb25mX3BhcnNlKG5hbWUpOworCWZpeHVwX3Jvb3RtZW51KCZyb290bWVudSk7CisJY29uZl9yZWFkKE5VTEwpOworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisKKwl2ID0gbmV3IENvbmZpZ01haW5XaW5kb3coKTsKKworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisJdi0+c2hvdygpOworCWNvbmZpZ0FwcC0+Y29ubmVjdChjb25maWdBcHAsIFNJR05BTChsYXN0V2luZG93Q2xvc2VkKCkpLCBTTE9UKHF1aXQoKSkpOworCWNvbmZpZ0FwcC0+Y29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgdiwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOworCWNvbmZpZ0FwcC0+ZXhlYygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuaCBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MmYzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxxbGlzdHZpZXcuaD4KKyNpZiBRVF9WRVJTSU9OID49IDMwMAorI2luY2x1ZGUgPHFzZXR0aW5ncy5oPgorI2Vsc2UKK2NsYXNzIFFTZXR0aW5ncyB7IH07CisjZW5kaWYKKworY2xhc3MgQ29uZmlnTGlzdDsKK2NsYXNzIENvbmZpZ0l0ZW07CitjbGFzcyBDb25maWdMaW5lRWRpdDsKK2NsYXNzIENvbmZpZ01haW5XaW5kb3c7CisKKworY2xhc3MgQ29uZmlnU2V0dGluZ3MgOiBwdWJsaWMgUVNldHRpbmdzIHsKK3B1YmxpYzoKKwlDb25maWdTZXR0aW5ncygpOworCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl2b2lkIHJlYWRMaXN0U2V0dGluZ3MoKTsKKwlRVmFsdWVMaXN0PGludD4gcmVhZFNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgYm9vbCAqb2spOworCWJvb2wgd3JpdGVTaXplcyhjb25zdCBRU3RyaW5nJiBrZXksIGNvbnN0IFFWYWx1ZUxpc3Q8aW50PiYgdmFsdWUpOworI2VuZGlmCisKKwlib29sIHNob3dBbGw7CisJYm9vbCBzaG93TmFtZTsKKwlib29sIHNob3dSYW5nZTsKKwlib29sIHNob3dEYXRhOworfTsKKworY2xhc3MgQ29uZmlnVmlldyA6IHB1YmxpYyBRVkJveCB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFWQm94IFBhcmVudDsKK3B1YmxpYzoKKwlDb25maWdWaWV3KFFXaWRnZXQqIHBhcmVudCwgQ29uZmlnTWFpbldpbmRvdyogY3ZpZXcsIENvbmZpZ1NldHRpbmdzKiBjb25maWdTZXR0aW5ncyk7CisJfkNvbmZpZ1ZpZXcodm9pZCk7CisJc3RhdGljIHZvaWQgdXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKTsKKwlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0QWxsKHZvaWQpOworCitwdWJsaWM6CisJQ29uZmlnTGlzdCogbGlzdDsKKwlDb25maWdMaW5lRWRpdCogbGluZUVkaXQ7CisKKwlzdGF0aWMgQ29uZmlnVmlldyogdmlld0xpc3Q7CisJQ29uZmlnVmlldyogbmV4dFZpZXc7Cit9OworCitlbnVtIGNvbElkeCB7CisJcHJvbXB0Q29sSWR4LCBuYW1lQ29sSWR4LCBub0NvbElkeCwgbW9kQ29sSWR4LCB5ZXNDb2xJZHgsIGRhdGFDb2xJZHgsIGNvbE5yCit9OworZW51bSBsaXN0TW9kZSB7CisJc2luZ2xlTW9kZSwgbWVudU1vZGUsIHN5bWJvbE1vZGUsIGZ1bGxNb2RlCit9OworCitjbGFzcyBDb25maWdMaXN0IDogcHVibGljIFFMaXN0VmlldyB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFMaXN0VmlldyBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnTGlzdChDb25maWdWaWV3KiBwLCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzKTsKKwl2b2lkIHJlaW5pdCh2b2lkKTsKKwlDb25maWdWaWV3KiBwYXJlbnQodm9pZCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnVmlldyopUGFyZW50OjpwYXJlbnQoKTsKKwl9CisKK3Byb3RlY3RlZDoKKwlDb25maWdNYWluV2luZG93KiBjdmlldzsKKworCXZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqZSk7CitwdWJsaWMgc2xvdHM6CisJdm9pZCBzZXRSb290TWVudShzdHJ1Y3QgbWVudSAqbWVudSk7CisKKwl2b2lkIHVwZGF0ZUxpc3QoQ29uZmlnSXRlbSAqaXRlbSk7CisJdm9pZCBzZXRWYWx1ZShDb25maWdJdGVtKiBpdGVtLCB0cmlzdGF0ZSB2YWwpOworCXZvaWQgY2hhbmdlVmFsdWUoQ29uZmlnSXRlbSogaXRlbSk7CisJdm9pZCB1cGRhdGVTZWxlY3Rpb24odm9pZCk7CitzaWduYWxzOgorCXZvaWQgbWVudVNlbGVjdGVkKHN0cnVjdCBtZW51ICptZW51KTsKKwl2b2lkIHBhcmVudFNlbGVjdGVkKHZvaWQpOworCXZvaWQgZ290Rm9jdXModm9pZCk7CisKK3B1YmxpYzoKKwl2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCkKKwl7CisJCXVwZGF0ZUFsbCA9IHRydWU7CisJCXVwZGF0ZUxpc3QoTlVMTCk7CisJCXVwZGF0ZUFsbCA9IGZhbHNlOworCX0KKwlDb25maWdMaXN0KiBsaXN0VmlldygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisJQ29uZmlnSXRlbSogZmlyc3RDaGlsZCgpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0l0ZW0gKilQYXJlbnQ6OmZpcnN0Q2hpbGQoKTsKKwl9CisJaW50IG1hcElkeChjb2xJZHggaWR4KQorCXsKKwkJcmV0dXJuIGNvbE1hcFtpZHhdOworCX0KKwl2b2lkIGFkZENvbHVtbihjb2xJZHggaWR4LCBjb25zdCBRU3RyaW5nJiBsYWJlbCkKKwl7CisJCWNvbE1hcFtpZHhdID0gUGFyZW50OjphZGRDb2x1bW4obGFiZWwpOworCQljb2xSZXZNYXBbY29sTWFwW2lkeF1dID0gaWR4OworCX0KKwl2b2lkIHJlbW92ZUNvbHVtbihjb2xJZHggaWR4KQorCXsKKwkJaW50IGNvbCA9IGNvbE1hcFtpZHhdOworCQlpZiAoY29sID49IDApIHsKKwkJCVBhcmVudDo6cmVtb3ZlQ29sdW1uKGNvbCk7CisJCQljb2xSZXZNYXBbY29sXSA9IGNvbE1hcFtpZHhdID0gLTE7CisJCX0KKwl9CisJdm9pZCBzZXRBbGxPcGVuKGJvb2wgb3Blbik7CisJdm9pZCBzZXRQYXJlbnRNZW51KHZvaWQpOworCisJdGVtcGxhdGUgPGNsYXNzIFA+CisJdm9pZCB1cGRhdGVNZW51TGlzdChQKiwgc3RydWN0IG1lbnUqKTsKKworCWJvb2wgdXBkYXRlQWxsOworCisJUVBpeG1hcCBzeW1ib2xZZXNQaXgsIHN5bWJvbE1vZFBpeCwgc3ltYm9sTm9QaXg7CisJUVBpeG1hcCBjaG9pY2VZZXNQaXgsIGNob2ljZU5vUGl4OworCVFQaXhtYXAgbWVudVBpeCwgbWVudUludlBpeCwgbWVudUJhY2tQaXgsIHZvaWRQaXg7CisKKwlib29sIHNob3dBbGwsIHNob3dOYW1lLCBzaG93UmFuZ2UsIHNob3dEYXRhOworCWVudW0gbGlzdE1vZGUgbW9kZTsKKwlzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OworCVFDb2xvckdyb3VwIGRpc2FibGVkQ29sb3JHcm91cDsKKwlRQ29sb3JHcm91cCBpbmFjdGl2ZWRDb2xvckdyb3VwOworCitwcml2YXRlOgorCWludCBjb2xNYXBbY29sTnJdOworCWludCBjb2xSZXZNYXBbY29sTnJdOworfTsKKworY2xhc3MgQ29uZmlnSXRlbSA6IHB1YmxpYyBRTGlzdFZpZXdJdGVtIHsKKwl0eXBlZGVmIGNsYXNzIFFMaXN0Vmlld0l0ZW0gUGFyZW50OworcHVibGljOgorCUNvbmZpZ0l0ZW0oUUxpc3RWaWV3ICpwYXJlbnQsIENvbmZpZ0l0ZW0gKmFmdGVyLCBzdHJ1Y3QgbWVudSAqbSwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KG0pLCB2aXNpYmxlKHYpLCBnb1BhcmVudChmYWxzZSkKKwl7CisJCWluaXQoKTsKKwl9CisJQ29uZmlnSXRlbShDb25maWdJdGVtICpwYXJlbnQsIENvbmZpZ0l0ZW0gKmFmdGVyLCBzdHJ1Y3QgbWVudSAqbSwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KG0pLCB2aXNpYmxlKHYpLCBnb1BhcmVudChmYWxzZSkKKwl7CisJCWluaXQoKTsKKwl9CisJQ29uZmlnSXRlbShRTGlzdFZpZXcgKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIGJvb2wgdikKKwk6IFBhcmVudChwYXJlbnQsIGFmdGVyKSwgbWVudSgwKSwgdmlzaWJsZSh2KSwgZ29QYXJlbnQodHJ1ZSkKKwl7CisJCWluaXQoKTsKKwl9CisJfkNvbmZpZ0l0ZW0odm9pZCk7CisJdm9pZCBpbml0KHZvaWQpOworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJdm9pZCBva1JlbmFtZShpbnQgY29sKTsKKyNlbmRpZgorCXZvaWQgdXBkYXRlTWVudSh2b2lkKTsKKwl2b2lkIHRlc3RVcGRhdGVNZW51KGJvb2wgdik7CisJQ29uZmlnTGlzdCogbGlzdFZpZXcoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdMaXN0KilQYXJlbnQ6Omxpc3RWaWV3KCk7CisJfQorCUNvbmZpZ0l0ZW0qIGZpcnN0Q2hpbGQoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdJdGVtICopUGFyZW50OjpmaXJzdENoaWxkKCk7CisJfQorCUNvbmZpZ0l0ZW0qIG5leHRTaWJsaW5nKCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnSXRlbSAqKVBhcmVudDo6bmV4dFNpYmxpbmcoKTsKKwl9CisJdm9pZCBzZXRUZXh0KGNvbElkeCBpZHgsIGNvbnN0IFFTdHJpbmcmIHRleHQpCisJeworCQlQYXJlbnQ6OnNldFRleHQobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCksIHRleHQpOworCX0KKwlRU3RyaW5nIHRleHQoY29sSWR4IGlkeCkgY29uc3QKKwl7CisJCXJldHVybiBQYXJlbnQ6OnRleHQobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCkpOworCX0KKwl2b2lkIHNldFBpeG1hcChjb2xJZHggaWR4LCBjb25zdCBRUGl4bWFwJiBwbSkKKwl7CisJCVBhcmVudDo6c2V0UGl4bWFwKGxpc3RWaWV3KCktPm1hcElkeChpZHgpLCBwbSk7CisJfQorCWNvbnN0IFFQaXhtYXAqIHBpeG1hcChjb2xJZHggaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuIFBhcmVudDo6cGl4bWFwKGxpc3RWaWV3KCktPm1hcElkeChpZHgpKTsKKwl9CisJdm9pZCBwYWludENlbGwoUVBhaW50ZXIqIHAsIGNvbnN0IFFDb2xvckdyb3VwJiBjZywgaW50IGNvbHVtbiwgaW50IHdpZHRoLCBpbnQgYWxpZ24pOworCisJQ29uZmlnSXRlbSogbmV4dEl0ZW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisJYm9vbCB2aXNpYmxlOworCWJvb2wgZ29QYXJlbnQ7Cit9OworCitjbGFzcyBDb25maWdMaW5lRWRpdCA6IHB1YmxpYyBRTGluZUVkaXQgeworCVFfT0JKRUNUCisJdHlwZWRlZiBjbGFzcyBRTGluZUVkaXQgUGFyZW50OworcHVibGljOgorCUNvbmZpZ0xpbmVFZGl0KENvbmZpZ1ZpZXcqIHBhcmVudCkKKwk6IFBhcmVudChwYXJlbnQpCisJeyB9CisJQ29uZmlnVmlldyogcGFyZW50KHZvaWQpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ1ZpZXcqKVBhcmVudDo6cGFyZW50KCk7CisJfQorCXZvaWQgc2hvdyhDb25maWdJdGVtICppKTsKKwl2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50ICplKTsKKworcHVibGljOgorCUNvbmZpZ0l0ZW0gKml0ZW07Cit9OworCitjbGFzcyBDb25maWdNYWluV2luZG93IDogcHVibGljIFFNYWluV2luZG93IHsKKwlRX09CSkVDVAorcHVibGljOgorCUNvbmZpZ01haW5XaW5kb3codm9pZCk7CitwdWJsaWMgc2xvdHM6CisJdm9pZCBzZXRIZWxwKFFMaXN0Vmlld0l0ZW0qIGl0ZW0pOworCXZvaWQgY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKTsKKwl2b2lkIGxpc3RGb2N1c0NoYW5nZWQodm9pZCk7CisJdm9pZCBnb0JhY2sodm9pZCk7CisJdm9pZCBsb2FkQ29uZmlnKHZvaWQpOworCXZvaWQgc2F2ZUNvbmZpZyh2b2lkKTsKKwl2b2lkIHNhdmVDb25maWdBcyh2b2lkKTsKKwl2b2lkIHNob3dTaW5nbGVWaWV3KHZvaWQpOworCXZvaWQgc2hvd1NwbGl0Vmlldyh2b2lkKTsKKwl2b2lkIHNob3dGdWxsVmlldyh2b2lkKTsKKwl2b2lkIHNldFNob3dBbGwoYm9vbCk7CisJdm9pZCBzZXRTaG93RGVidWcoYm9vbCk7CisJdm9pZCBzZXRTaG93UmFuZ2UoYm9vbCk7CisJdm9pZCBzZXRTaG93TmFtZShib29sKTsKKwl2b2lkIHNldFNob3dEYXRhKGJvb2wpOworCXZvaWQgc2hvd0ludHJvKHZvaWQpOworCXZvaWQgc2hvd0Fib3V0KHZvaWQpOworCXZvaWQgc2F2ZVNldHRpbmdzKHZvaWQpOworCitwcm90ZWN0ZWQ6CisJdm9pZCBjbG9zZUV2ZW50KFFDbG9zZUV2ZW50ICplKTsKKworCUNvbmZpZ1ZpZXcgKm1lbnVWaWV3OworCUNvbmZpZ0xpc3QgKm1lbnVMaXN0OworCUNvbmZpZ1ZpZXcgKmNvbmZpZ1ZpZXc7CisJQ29uZmlnTGlzdCAqY29uZmlnTGlzdDsKKwlRVGV4dFZpZXcgKmhlbHBUZXh0OworCVFUb29sQmFyICp0b29sQmFyOworCVFBY3Rpb24gKmJhY2tBY3Rpb247CisJUVNwbGl0dGVyKiBzcGxpdDE7CisJUVNwbGl0dGVyKiBzcGxpdDI7CisKKwlib29sIHNob3dEZWJ1ZzsKK307CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3ODc3YQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMCwwICsxLDg4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RydWN0IHN5bWJvbCBzeW1ib2xfeWVzID0geworCS5uYW1lID0gInkiLAorCS5jdXJyID0geyAieSIsIHllcyB9LAorCS5mbGFncyA9IFNZTUJPTF9ZRVN8U1lNQk9MX1ZBTElELAorfSwgc3ltYm9sX21vZCA9IHsKKwkubmFtZSA9ICJtIiwKKwkuY3VyciA9IHsgIm0iLCBtb2QgfSwKKwkuZmxhZ3MgPSBTWU1CT0xfTU9EfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9ubyA9IHsKKwkubmFtZSA9ICJuIiwKKwkuY3VyciA9IHsgIm4iLCBubyB9LAorCS5mbGFncyA9IFNZTUJPTF9OT3xTWU1CT0xfVkFMSUQsCit9LCBzeW1ib2xfZW1wdHkgPSB7CisJLm5hbWUgPSAiIiwKKwkuY3VyciA9IHsgIiIsIG5vIH0sCisJLmZsYWdzID0gU1lNQk9MX1ZBTElELAorfTsKKworaW50IHN5bV9jaGFuZ2VfY291bnQ7CitzdHJ1Y3Qgc3ltYm9sICptb2R1bGVzX3N5bTsKK3RyaXN0YXRlIG1vZHVsZXNfdmFsOworCit2b2lkIHN5bV9hZGRfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKmRlZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKFBfREVGQVVMVCwgc3ltKTsKKworCXByb3AtPmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChzeW1fbG9va3VwKGRlZiwgMSkpOworfQorCit2b2lkIHN5bV9pbml0KHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCB1dHNuYW1lIHV0czsKKwljaGFyICpwOworCXN0YXRpYyBib29sIGluaXRlZCA9IGZhbHNlOworCisJaWYgKGluaXRlZCkKKwkJcmV0dXJuOworCWluaXRlZCA9IHRydWU7CisKKwl1bmFtZSgmdXRzKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIkFSQ0giLCAwKTsKKwlzeW0tPnR5cGUgPSBTX1NUUklORzsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXAgPSBnZXRlbnYoIkFSQ0giKTsKKwlpZiAocCkKKwkJc3ltX2FkZF9kZWZhdWx0KHN5bSwgcCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltLT50eXBlID0gU19TVFJJTkc7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKKwlwID0gZ2V0ZW52KCJLRVJORUxWRVJTSU9OIik7CisJaWYgKHApCisJCXN5bV9hZGRfZGVmYXVsdChzeW0sIHApOworCisJc3ltID0gc3ltX2xvb2t1cCgiVU5BTUVfUkVMRUFTRSIsIDApOworCXN5bS0+dHlwZSA9IFNfU1RSSU5HOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0FVVE87CisJc3ltX2FkZF9kZWZhdWx0KHN5bSwgdXRzLnJlbGVhc2UpOworfQorCitlbnVtIHN5bWJvbF90eXBlIHN5bV9nZXRfdHlwZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlID0gc3ltLT50eXBlOworCisJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHN5bS0+dmlzaWJsZSA9PSB5ZXMpCisJCQl0eXBlID0gU19CT09MRUFOOworCQllbHNlIGlmIChtb2R1bGVzX3ZhbCA9PSBubykKKwkJCXR5cGUgPSBTX0JPT0xFQU47CisJfQorCXJldHVybiB0eXBlOworfQorCitjb25zdCBjaGFyICpzeW1fdHlwZV9uYW1lKGVudW0gc3ltYm9sX3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJcmV0dXJuICJib29sZWFuIjsKKwljYXNlIFNfVFJJU1RBVEU6CisJCXJldHVybiAidHJpc3RhdGUiOworCWNhc2UgU19JTlQ6CisJCXJldHVybiAiaW50ZWdlciI7CisJY2FzZSBTX0hFWDoKKwkJcmV0dXJuICJoZXgiOworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiAic3RyaW5nIjsKKwljYXNlIFNfVU5LTk9XTjoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwljYXNlIFNfT1RIRVI6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gIj8/PyI7Cit9CisKK3N0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9jaG9pY2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9jaG9pY2VzKHN5bSwgcHJvcCkKKwkJcmV0dXJuIHByb3A7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSAhPSBubykKKwkJCXJldHVybiBwcm9wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X3JhbmdlX3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfUkFOR0UpIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHByb3AtPnZpc2libGUudHJpICE9IG5vKQorCQkJcmV0dXJuIHByb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHN5bV9nZXRfcmFuZ2VfdmFsKHN0cnVjdCBzeW1ib2wgKnN5bSwgaW50IGJhc2UpCit7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJCWJhc2UgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBTX0hFWDoKKwkJYmFzZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHN0cnRvbChzeW0tPmN1cnIudmFsLCBOVUxMLCBiYXNlKTsKK30KKworc3RhdGljIHZvaWQgc3ltX3ZhbGlkYXRlX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IGJhc2UsIHZhbCwgdmFsMjsKKwljaGFyIHN0cls2NF07CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJCWJhc2UgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBTX0hFWDoKKwkJYmFzZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCXByb3AgPSBzeW1fZ2V0X3JhbmdlX3Byb3Aoc3ltKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKwl2YWwgPSBzdHJ0b2woc3ltLT5jdXJyLnZhbCwgTlVMTCwgYmFzZSk7CisJdmFsMiA9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPmxlZnQuc3ltLCBiYXNlKTsKKwlpZiAodmFsID49IHZhbDIpIHsKKwkJdmFsMiA9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPnJpZ2h0LnN5bSwgYmFzZSk7CisJCWlmICh2YWwgPD0gdmFsMikKKwkJCXJldHVybjsKKwl9CisJaWYgKHN5bS0+dHlwZSA9PSBTX0lOVCkKKwkJc3ByaW50ZihzdHIsICIlZCIsIHZhbDIpOworCWVsc2UKKwkJc3ByaW50ZihzdHIsICIweCV4IiwgdmFsMik7CisJc3ltLT5jdXJyLnZhbCA9IHN0cmR1cChzdHIpOworfQorCitzdGF0aWMgdm9pZCBzeW1fY2FsY192aXNpYmlsaXR5KHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdHJpc3RhdGUgdHJpOworCisJLyogYW55IHByb21wdCB2aXNpYmxlPyAqLworCXRyaSA9IG5vOworCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJdHJpID0gRV9PUih0cmksIHByb3AtPnZpc2libGUudHJpKTsKKwl9CisJaWYgKHRyaSA9PSBtb2QgJiYgKHN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFIHx8IG1vZHVsZXNfdmFsID09IG5vKSkKKwkJdHJpID0geWVzOworCWlmIChzeW0tPnZpc2libGUgIT0gdHJpKSB7CisJCXN5bS0+dmlzaWJsZSA9IHRyaTsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXJldHVybjsKKwl0cmkgPSBubzsKKwlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpCisJCXRyaSA9IGV4cHJfY2FsY192YWx1ZShzeW0tPnJldl9kZXAuZXhwcik7CisJaWYgKHRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQorCQl0cmkgPSB5ZXM7CisJaWYgKHN5bS0+cmV2X2RlcC50cmkgIT0gdHJpKSB7CisJCXN5bS0+cmV2X2RlcC50cmkgPSB0cmk7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9jYWxjX2Nob2ljZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbCAqZGVmX3N5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwkvKiBpcyB0aGUgdXNlciBjaG9pY2UgdmlzaWJsZT8gKi8KKwlkZWZfc3ltID0gc3ltLT51c2VyLnZhbDsKKwlpZiAoZGVmX3N5bSkgeworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIGFueSBvZiB0aGUgZGVmYXVsdHMgdmlzaWJsZT8gKi8KKwlmb3JfYWxsX2RlZmF1bHRzKHN5bSwgcHJvcCkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAocHJvcC0+dmlzaWJsZS50cmkgPT0gbm8pCisJCQljb250aW51ZTsKKwkJZGVmX3N5bSA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJc3ltX2NhbGNfdmlzaWJpbGl0eShkZWZfc3ltKTsKKwkJaWYgKGRlZl9zeW0tPnZpc2libGUgIT0gbm8pCisJCQlyZXR1cm4gZGVmX3N5bTsKKwl9CisKKwkvKiBqdXN0IGdldCB0aGUgZmlyc3QgdmlzaWJsZSB2YWx1ZSAqLworCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJZm9yIChlID0gcHJvcC0+ZXhwcjsgZTsgZSA9IGUtPmxlZnQuZXhwcikgeworCQlkZWZfc3ltID0gZS0+cmlnaHQuc3ltOworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIG5vIGNob2ljZT8gcmVzZXQgdHJpc3RhdGUgdmFsdWUgKi8KKwlzeW0tPmN1cnIudHJpID0gbm87CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc3ltX2NhbGNfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBzeW1ib2xfdmFsdWUgbmV3dmFsLCBvbGR2YWw7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICplOworCisJaWYgKCFzeW0pCisJCXJldHVybjsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX1ZBTElEKQorCQlyZXR1cm47CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfVkFMSUQ7CisKKwlvbGR2YWwgPSBzeW0tPmN1cnI7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQluZXd2YWwgPSBzeW1ib2xfZW1wdHkuY3VycjsKKwkJYnJlYWs7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQluZXd2YWwgPSBzeW1ib2xfbm8uY3VycjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ltLT5jdXJyLnZhbCA9IHN5bS0+bmFtZTsKKwkJc3ltLT5jdXJyLnRyaSA9IG5vOworCQlyZXR1cm47CisJfQorCWlmICghc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKQorCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfV1JJVEU7CisKKwlzeW1fY2FsY192aXNpYmlsaXR5KHN5bSk7CisKKwkvKiBzZXQgZGVmYXVsdCBpZiByZWN1cnNpdmVseSBjYWxsZWQgKi8KKwlzeW0tPmN1cnIgPSBuZXd2YWw7CisKKwlzd2l0Y2ggKHN5bV9nZXRfdHlwZShzeW0pKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHN5bS0+dmlzaWJsZSA9PSB5ZXMpIHsKKwkJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCQluZXd2YWwudHJpID0gKHByb3BfZ2V0X3N5bWJvbChwcm9wKS0+Y3Vyci52YWwgPT0gc3ltKSA/IHllcyA6IG5vOworCQl9IGVsc2UgaWYgKEVfT1Ioc3ltLT52aXNpYmxlLCBzeW0tPnJldl9kZXAudHJpKSAhPSBubykgeworCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKQorCQkJCW5ld3ZhbC50cmkgPSBzeW0tPnVzZXIudHJpOworCQkJZWxzZSBpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQkJCXByb3AgPSBzeW1fZ2V0X2RlZmF1bHRfcHJvcChzeW0pOworCQkJCWlmIChwcm9wKQorCQkJCQluZXd2YWwudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPmV4cHIpOworCQkJfQorCQkJbmV3dmFsLnRyaSA9IEVfT1IoRV9BTkQobmV3dmFsLnRyaSwgc3ltLT52aXNpYmxlKSwgc3ltLT5yZXZfZGVwLnRyaSk7CisJCX0gZWxzZSBpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQkJcHJvcCA9IHN5bV9nZXRfZGVmYXVsdF9wcm9wKHN5bSk7CisJCQlpZiAocHJvcCkgeworCQkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dSSVRFOworCQkJCW5ld3ZhbC50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwcik7CisJCQl9CisJCX0KKwkJaWYgKG5ld3ZhbC50cmkgPT0gbW9kICYmIHN5bV9nZXRfdHlwZShzeW0pID09IFNfQk9PTEVBTikKKwkJCW5ld3ZhbC50cmkgPSB5ZXM7CisJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfSU5UOgorCQlpZiAoc3ltLT52aXNpYmxlICE9IG5vKSB7CisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCQluZXd2YWwudmFsID0gc3ltLT51c2VyLnZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJaWYgKHByb3ApIHsKKwkJCXN0cnVjdCBzeW1ib2wgKmRzID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQkJaWYgKGRzKSB7CisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQkJc3ltX2NhbGNfdmFsdWUoZHMpOworCQkJCW5ld3ZhbC52YWwgPSBkcy0+Y3Vyci52YWw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pICYmIG5ld3ZhbC50cmkgPT0geWVzKQorCQlzeW0tPmN1cnIudmFsID0gc3ltX2NhbGNfY2hvaWNlKHN5bSk7CisJc3ltX3ZhbGlkYXRlX3JhbmdlKHN5bSk7CisKKwlpZiAobWVtY21wKCZvbGR2YWwsICZzeW0tPmN1cnIsIHNpemVvZihvbGR2YWwpKSkKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJaWYgKG1vZHVsZXNfc3ltID09IHN5bSkKKwkJbW9kdWxlc192YWwgPSBtb2R1bGVzX3N5bS0+Y3Vyci50cmk7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCWludCBmbGFncyA9IHN5bS0+ZmxhZ3MgJiAoU1lNQk9MX0NIQU5HRUQgfCBTWU1CT0xfV1JJVEUpOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCQllLT5yaWdodC5zeW0tPmZsYWdzIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgU1lNQk9MX0NIQU5HRUQpCisJCQkJc3ltX3NldF9jaGFuZ2VkKGUtPnJpZ2h0LnN5bSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgc3ltX2NsZWFyX2FsbF92YWxpZCh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9WQUxJRDsKKwlzeW1fY2hhbmdlX2NvdW50Kys7CisJaWYgKG1vZHVsZXNfc3ltKQorCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7Cit9CisKK3ZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSEFOR0VEOworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUpCisJCQlwcm9wLT5tZW51LT5mbGFncyB8PSBNRU5VX0NIQU5HRUQ7CisJfQorfQorCit2b2lkIHN5bV9zZXRfYWxsX2NoYW5nZWQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGk7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKQorCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKK30KKworYm9vbCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSwgdHJpc3RhdGUgdmFsKQoreworCWludCB0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisKKwlpZiAoc3ltLT52aXNpYmxlID09IG5vKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSAhPSBTX0JPT0xFQU4gJiYgdHlwZSAhPSBTX1RSSVNUQVRFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSA9PSBTX0JPT0xFQU4gJiYgdmFsID09IG1vZCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeW0tPnZpc2libGUgPD0gc3ltLT5yZXZfZGVwLnRyaSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykKKwkJcmV0dXJuIHZhbCA9PSB5ZXM7CisJcmV0dXJuIHZhbCA+PSBzeW0tPnJldl9kZXAudHJpICYmIHZhbCA8PSBzeW0tPnZpc2libGU7Cit9CisKK2Jvb2wgc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHRyaXN0YXRlIHZhbCkKK3sKKwl0cmlzdGF0ZSBvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisKKwlpZiAob2xkdmFsICE9IHZhbCAmJiAhc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHZhbCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX05FVykgeworCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisJLyoKKwkgKiBzZXR0aW5nIGEgY2hvaWNlIHZhbHVlIGFsc28gcmVzZXRzIHRoZSBuZXcgZmxhZyBvZiB0aGUgY2hvaWNlCisJICogc3ltYm9sIGFuZCBhbGwgb3RoZXIgY2hvaWNlIHZhbHVlcy4KKwkgKi8KKwlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHZhbCA9PSB5ZXMpIHsKKwkJc3RydWN0IHN5bWJvbCAqY3MgPSBwcm9wX2dldF9zeW1ib2woc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pKTsKKwkJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCQlzdHJ1Y3QgZXhwciAqZTsKKworCQljcy0+dXNlci52YWwgPSBzeW07CisJCWNzLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3AoY3MpOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCQlpZiAoZS0+cmlnaHQuc3ltLT52aXNpYmxlICE9IG5vKQorCQkJCWUtPnJpZ2h0LnN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCX0KKwl9CisKKwlzeW0tPnVzZXIudHJpID0gdmFsOworCWlmIChvbGR2YWwgIT0gdmFsKSB7CisJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKwkJaWYgKHN5bSA9PSBtb2R1bGVzX3N5bSkKKwkJCXN5bV9zZXRfYWxsX2NoYW5nZWQoKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordHJpc3RhdGUgc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisKKwlvbGR2YWwgPSBuZXd2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJZG8geworCQlzd2l0Y2ggKG5ld3ZhbCkgeworCQljYXNlIG5vOgorCQkJbmV3dmFsID0gbW9kOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJbmV3dmFsID0geWVzOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJbmV3dmFsID0gbm87CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCkpCisJCQlicmVhazsKKwl9IHdoaWxlIChvbGR2YWwgIT0gbmV3dmFsKTsKKwlyZXR1cm4gbmV3dmFsOworfQorCitib29sIHN5bV9zdHJpbmdfdmFsaWQoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJc2lnbmVkIGNoYXIgY2g7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiB0cnVlOworCWNhc2UgU19JTlQ6CisJCWNoID0gKnN0cisrOworCQlpZiAoY2ggPT0gJy0nKQorCQkJY2ggPSAqc3RyKys7CisJCWlmICghaXNkaWdpdChjaCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjaCA9PSAnMCcgJiYgKnN0ciAhPSAwKQorCQkJcmV0dXJuIGZhbHNlOworCQl3aGlsZSAoKGNoID0gKnN0cisrKSkgeworCQkJaWYgKCFpc2RpZ2l0KGNoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0hFWDoKKwkJaWYgKHN0clswXSA9PSAnMCcgJiYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykpCisJCQlzdHIgKz0gMjsKKwkJY2ggPSAqc3RyKys7CisJCWRvIHsKKwkJCWlmICghaXN4ZGlnaXQoY2gpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSB3aGlsZSAoKGNoID0gKnN0cisrKSk7CisJCXJldHVybiB0cnVlOworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChzdHJbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQljYXNlICdtJzogY2FzZSAnTSc6CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitib29sIHN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgdmFsOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfU1RSSU5HOgorCQlyZXR1cm4gc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cik7CisJY2FzZSBTX0lOVDoKKwkJaWYgKCFzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3RyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcHJvcCA9IHN5bV9nZXRfcmFuZ2VfcHJvcChzeW0pOworCQlpZiAoIXByb3ApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJdmFsID0gc3RydG9sKHN0ciwgTlVMTCwgMTApOworCQlyZXR1cm4gdmFsID49IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPmxlZnQuc3ltLCAxMCkgJiYKKwkJICAgICAgIHZhbCA8PSBzeW1fZ2V0X3JhbmdlX3ZhbChwcm9wLT5leHByLT5yaWdodC5zeW0sIDEwKTsKKwljYXNlIFNfSEVYOgorCQlpZiAoIXN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzdHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlwcm9wID0gc3ltX2dldF9yYW5nZV9wcm9wKHN5bSk7CisJCWlmICghcHJvcCkKKwkJCXJldHVybiB0cnVlOworCQl2YWwgPSBzdHJ0b2woc3RyLCBOVUxMLCAxNik7CisJCXJldHVybiB2YWwgPj0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+bGVmdC5zeW0sIDE2KSAmJgorCQkgICAgICAgdmFsIDw9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPnJpZ2h0LnN5bSwgMTYpOworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChzdHJbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQkJcmV0dXJuIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpOworCQljYXNlICdtJzogY2FzZSAnTSc6CisJCQlyZXR1cm4gc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCk7CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitib29sIHN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKQoreworCWNvbnN0IGNoYXIgKm9sZHZhbDsKKwljaGFyICp2YWw7CisJaW50IHNpemU7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChuZXd2YWxbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQkJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCB5ZXMpOworCQljYXNlICdtJzogY2FzZSAnTSc6CisJCQlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG1vZCk7CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbm8pOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJaWYgKCFzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZShzeW0sIG5ld3ZhbCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX05FVykgeworCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisKKwlvbGR2YWwgPSBzeW0tPnVzZXIudmFsOworCXNpemUgPSBzdHJsZW4obmV3dmFsKSArIDE7CisJaWYgKHN5bS0+dHlwZSA9PSBTX0hFWCAmJiAobmV3dmFsWzBdICE9ICcwJyB8fCAobmV3dmFsWzFdICE9ICd4JyAmJiBuZXd2YWxbMV0gIT0gJ1gnKSkpIHsKKwkJc2l6ZSArPSAyOworCQlzeW0tPnVzZXIudmFsID0gdmFsID0gbWFsbG9jKHNpemUpOworCQkqdmFsKysgPSAnMCc7CisJCSp2YWwrKyA9ICd4JzsKKwl9IGVsc2UgaWYgKCFvbGR2YWwgfHwgc3RyY21wKG9sZHZhbCwgbmV3dmFsKSkKKwkJc3ltLT51c2VyLnZhbCA9IHZhbCA9IG1hbGxvYyhzaXplKTsKKwllbHNlCisJCXJldHVybiB0cnVlOworCisJc3RyY3B5KHZhbCwgbmV3dmFsKTsKKwlmcmVlKCh2b2lkICopb2xkdmFsKTsKKwlzeW1fY2xlYXJfYWxsX3ZhbGlkKCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgY2hhciAqc3ltX2dldF9zdHJpbmdfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXRyaXN0YXRlIHZhbDsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2Ugbm86CisJCQlyZXR1cm4gIm4iOworCQljYXNlIG1vZDoKKwkJCXJldHVybiAibSI7CisJCWNhc2UgeWVzOgorCQkJcmV0dXJuICJ5IjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiAoY29uc3QgY2hhciAqKXN5bS0+Y3Vyci52YWw7Cit9CisKK2Jvb2wgc3ltX2lzX2NoYW5nYWJsZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+dmlzaWJsZSA+IHN5bS0+cmV2X2RlcC50cmk7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGlzY29uc3QpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCWNvbnN0IGNoYXIgKnB0cjsKKwljaGFyICpuZXdfbmFtZTsKKwlpbnQgaGFzaCA9IDA7CisKKwlpZiAobmFtZSkgeworCQlpZiAobmFtZVswXSAmJiAhbmFtZVsxXSkgeworCQkJc3dpdGNoIChuYW1lWzBdKSB7CisJCQljYXNlICd5JzogcmV0dXJuICZzeW1ib2xfeWVzOworCQkJY2FzZSAnbSc6IHJldHVybiAmc3ltYm9sX21vZDsKKwkJCWNhc2UgJ24nOiByZXR1cm4gJnN5bWJvbF9ubzsKKwkJCX0KKwkJfQorCQlmb3IgKHB0ciA9IG5hbWU7ICpwdHI7IHB0cisrKQorCQkJaGFzaCArPSAqcHRyOworCQloYXNoICY9IDB4ZmY7CisKKwkJZm9yIChzeW1ib2wgPSBzeW1ib2xfaGFzaFtoYXNoXTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wtPm5leHQpIHsKKwkJCWlmICghc3RyY21wKHN5bWJvbC0+bmFtZSwgbmFtZSkpIHsKKwkJCQlpZiAoKGlzY29uc3QgJiYgc3ltYm9sLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgfHwKKwkJCQkgICAgKCFpc2NvbnN0ICYmICEoc3ltYm9sLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpKQorCQkJCQlyZXR1cm4gc3ltYm9sOworCQkJfQorCQl9CisJCW5ld19uYW1lID0gc3RyZHVwKG5hbWUpOworCX0gZWxzZSB7CisJCW5ld19uYW1lID0gTlVMTDsKKwkJaGFzaCA9IDI1NjsKKwl9CisKKwlzeW1ib2wgPSBtYWxsb2Moc2l6ZW9mKCpzeW1ib2wpKTsKKwltZW1zZXQoc3ltYm9sLCAwLCBzaXplb2YoKnN5bWJvbCkpOworCXN5bWJvbC0+bmFtZSA9IG5ld19uYW1lOworCXN5bWJvbC0+dHlwZSA9IFNfVU5LTk9XTjsKKwlzeW1ib2wtPmZsYWdzID0gU1lNQk9MX05FVzsKKwlpZiAoaXNjb25zdCkKKwkJc3ltYm9sLT5mbGFncyB8PSBTWU1CT0xfQ09OU1Q7CisKKwlzeW1ib2wtPm5leHQgPSBzeW1ib2xfaGFzaFtoYXNoXTsKKwlzeW1ib2xfaGFzaFtoYXNoXSA9IHN5bWJvbDsKKworCXJldHVybiBzeW1ib2w7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sID0gTlVMTDsKKwljb25zdCBjaGFyICpwdHI7CisJaW50IGhhc2ggPSAwOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChuYW1lWzBdICYmICFuYW1lWzFdKSB7CisJCXN3aXRjaCAobmFtZVswXSkgeworCQljYXNlICd5JzogcmV0dXJuICZzeW1ib2xfeWVzOworCQljYXNlICdtJzogcmV0dXJuICZzeW1ib2xfbW9kOworCQljYXNlICduJzogcmV0dXJuICZzeW1ib2xfbm87CisJCX0KKwl9CisJZm9yIChwdHIgPSBuYW1lOyAqcHRyOyBwdHIrKykKKwkJaGFzaCArPSAqcHRyOworCWhhc2ggJj0gMHhmZjsKKworCWZvciAoc3ltYm9sID0gc3ltYm9sX2hhc2hbaGFzaF07IHN5bWJvbDsgc3ltYm9sID0gc3ltYm9sLT5uZXh0KSB7CisJCWlmICghc3RyY21wKHN5bWJvbC0+bmFtZSwgbmFtZSkgJiYKKwkJICAgICEoc3ltYm9sLT5mbGFncyAmIFNZTUJPTF9DT05TVCkpCisJCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN5bWJvbDsKK30KKworc3RydWN0IHN5bWJvbCAqKnN5bV9yZV9zZWFyY2goY29uc3QgY2hhciAqcGF0dGVybikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0sICoqc3ltX2FyciA9IE5VTEw7CisJaW50IGksIGNudCwgc2l6ZTsKKwlyZWdleF90IHJlOworCisJY250ID0gc2l6ZSA9IDA7CisJLyogU2tpcCBpZiBlbXB0eSAqLworCWlmIChzdHJsZW4ocGF0dGVybikgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHJlZ2NvbXAoJnJlLCBwYXR0ZXJuLCBSRUdfRVhURU5ERUR8UkVHX05PU1VCfFJFR19JQ0FTRSkpCisJCXJldHVybiBOVUxMOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCB8fCAhc3ltLT5uYW1lKQorCQkJY29udGludWU7CisJCWlmIChyZWdleGVjKCZyZSwgc3ltLT5uYW1lLCAwLCBOVUxMLCAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY250ICsgMSA+PSBzaXplKSB7CisJCQl2b2lkICp0bXAgPSBzeW1fYXJyOworCQkJc2l6ZSArPSAxNjsKKwkJCXN5bV9hcnIgPSByZWFsbG9jKHN5bV9hcnIsIHNpemUgKiBzaXplb2Yoc3RydWN0IHN5bWJvbCAqKSk7CisJCQlpZiAoIXN5bV9hcnIpIHsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJc3ltX2FycltjbnQrK10gPSBzeW07CisJfQorCWlmIChzeW1fYXJyKQorCQlzeW1fYXJyW2NudF0gPSBOVUxMOworCXJlZ2ZyZWUoJnJlKTsKKworCXJldHVybiBzeW1fYXJyOworfQorCisKK3N0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZXhwcl9kZXBzKHN0cnVjdCBleHByICplKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKworCWlmICghZSkKKwkJcmV0dXJuIE5VTEw7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCXN5bSA9IHN5bV9jaGVja19leHByX2RlcHMoZS0+bGVmdC5leHByKTsKKwkJaWYgKHN5bSkKKwkJCXJldHVybiBzeW07CisJCXJldHVybiBzeW1fY2hlY2tfZXhwcl9kZXBzKGUtPnJpZ2h0LmV4cHIpOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBzeW1fY2hlY2tfZXhwcl9kZXBzKGUtPmxlZnQuZXhwcik7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlzeW0gPSBzeW1fY2hlY2tfZGVwcyhlLT5sZWZ0LnN5bSk7CisJCWlmIChzeW0pCisJCQlyZXR1cm4gc3ltOworCQlyZXR1cm4gc3ltX2NoZWNrX2RlcHMoZS0+cmlnaHQuc3ltKTsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gc3ltX2NoZWNrX2RlcHMoZS0+bGVmdC5zeW0pOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlwcmludGYoIk9vcHMhIEhvdyB0byBjaGVjayAlZD9cbiIsIGUtPnR5cGUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZGVwcyhzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltMjsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9DSEVDSykgeworCQlwcmludGYoIldhcm5pbmchIEZvdW5kIHJlY3Vyc2l2ZSBkZXBlbmRlbmN5OiAlcyIsIHN5bS0+bmFtZSk7CisJCXJldHVybiBzeW07CisJfQorCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLRUQpCisJCXJldHVybiBOVUxMOworCisJc3ltLT5mbGFncyB8PSAoU1lNQk9MX0NIRUNLIHwgU1lNQk9MX0NIRUNLRUQpOworCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHN5bS0+cmV2X2RlcC5leHByKTsKKwlpZiAoc3ltMikKKwkJZ290byBvdXQ7CisKKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCWlmIChwcm9wLT50eXBlID09IFBfQ0hPSUNFIHx8IHByb3AtPnR5cGUgPT0gUF9TRUxFQ1QpCisJCQljb250aW51ZTsKKwkJc3ltMiA9IHN5bV9jaGVja19leHByX2RlcHMocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHN5bTIpCisJCQlnb3RvIG91dDsKKwkJaWYgKHByb3AtPnR5cGUgIT0gUF9ERUZBVUxUIHx8IHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWNvbnRpbnVlOworCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT5leHByKTsKKwkJaWYgKHN5bTIpCisJCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJaWYgKHN5bTIpIHsKKwkJcHJpbnRmKCIgJXMiLCBzeW0tPm5hbWUpOworCQlpZiAoc3ltMiA9PSBzeW0pIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXN5bTIgPSBOVUxMOworCQl9CisJfQorCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEVDSzsKKwlyZXR1cm4gc3ltMjsKK30KKworc3RydWN0IHByb3BlcnR5ICpwcm9wX2FsbG9jKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHByb3BlcnR5ICoqcHJvcHA7CisKKwlwcm9wID0gbWFsbG9jKHNpemVvZigqcHJvcCkpOworCW1lbXNldChwcm9wLCAwLCBzaXplb2YoKnByb3ApKTsKKwlwcm9wLT50eXBlID0gdHlwZTsKKwlwcm9wLT5zeW0gPSBzeW07CisJcHJvcC0+ZmlsZSA9IGN1cnJlbnRfZmlsZTsKKwlwcm9wLT5saW5lbm8gPSB6Y29uZl9saW5lbm8oKTsKKworCS8qIGFwcGVuZCBwcm9wZXJ0eSB0byB0aGUgcHJvcCBsaXN0IG9mIHN5bWJvbCAqLworCWlmIChzeW0pIHsKKwkJZm9yIChwcm9wcCA9ICZzeW0tPnByb3A7ICpwcm9wcDsgcHJvcHAgPSAmKCpwcm9wcCktPm5leHQpCisJCQk7CisJCSpwcm9wcCA9IHByb3A7CisJfQorCisJcmV0dXJuIHByb3A7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnByb3BfZ2V0X3N5bWJvbChzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJaWYgKHByb3AtPmV4cHIgJiYgKHByb3AtPmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgfHwKKwkJCSAgIHByb3AtPmV4cHItPnR5cGUgPT0gRV9DSE9JQ0UpKQorCQlyZXR1cm4gcHJvcC0+ZXhwci0+bGVmdC5zeW07CisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKnByb3BfZ2V0X3R5cGVfbmFtZShlbnVtIHByb3BfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUF9QUk9NUFQ6CisJCXJldHVybiAicHJvbXB0IjsKKwljYXNlIFBfQ09NTUVOVDoKKwkJcmV0dXJuICJjb21tZW50IjsKKwljYXNlIFBfTUVOVToKKwkJcmV0dXJuICJtZW51IjsKKwljYXNlIFBfREVGQVVMVDoKKwkJcmV0dXJuICJkZWZhdWx0IjsKKwljYXNlIFBfQ0hPSUNFOgorCQlyZXR1cm4gImNob2ljZSI7CisJY2FzZSBQX1NFTEVDVDoKKwkJcmV0dXJuICJzZWxlY3QiOworCWNhc2UgUF9SQU5HRToKKwkJcmV0dXJuICJyYW5nZSI7CisJY2FzZSBQX1VOS05PV046CisJCWJyZWFrOworCX0KKwlyZXR1cm4gInVua25vd24iOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3V0aWwuYyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzMDkxOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFNhbSBSYXZuYm9yZyA8c2FtQHJhdm5ib3JnLm9yZz4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGtjLmgiCisKKy8qIGZpbGUgYWxyZWFkeSBwcmVzZW50IGluIGxpc3Q/IElmIG5vdCBhZGQgaXQgKi8KK3N0cnVjdCBmaWxlICpmaWxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCisJZm9yIChmaWxlID0gZmlsZV9saXN0OyBmaWxlOyBmaWxlID0gZmlsZS0+bmV4dCkgeworCQlpZiAoIXN0cmNtcChuYW1lLCBmaWxlLT5uYW1lKSkKKwkJCXJldHVybiBmaWxlOworCX0KKworCWZpbGUgPSBtYWxsb2Moc2l6ZW9mKCpmaWxlKSk7CisJbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworCWZpbGUtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZmlsZS0+bmV4dCA9IGZpbGVfbGlzdDsKKwlmaWxlX2xpc3QgPSBmaWxlOworCXJldHVybiBmaWxlOworfQorCisvKiB3cml0ZSBhIGRlcGVuZGVuY3kgZmlsZSBhcyB1c2VkIGJ5IGtidWlsZCB0byB0cmFjayBkZXBlbmRlbmNpZXMgKi8KK2ludCBmaWxlX3dyaXRlX2RlcChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCUZJTEUgKm91dDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9ICIua2NvbmZpZy5kIjsKKwlvdXQgPSBmb3BlbigiLi5jb25maWcudG1wIiwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJZnByaW50ZihvdXQsICJkZXBzX2NvbmZpZyA6PSBcXFxuIik7CisJZm9yIChmaWxlID0gZmlsZV9saXN0OyBmaWxlOyBmaWxlID0gZmlsZS0+bmV4dCkgeworCQlpZiAoZmlsZS0+bmV4dCkKKwkJCWZwcmludGYob3V0LCAiXHQlcyBcXFxuIiwgZmlsZS0+bmFtZSk7CisJCWVsc2UKKwkJCWZwcmludGYob3V0LCAiXHQlc1xuIiwgZmlsZS0+bmFtZSk7CisJfQorCWZwcmludGYob3V0LAorCQkiXG4iCisJCSIuY29uZmlnIGluY2x1ZGUvYXV0b2NvbmYuaDogJChkZXBzX2NvbmZpZylcbiIKKwkJIlxuIgorCQkiaW5jbHVkZS9hdXRvY29uZi5oOiAuY29uZmlnXG4iIC8qIGJib3ggKi8KKwkJIlxuIgorCQkiJChkZXBzX2NvbmZpZyk6XG4iKTsKKwlmY2xvc2Uob3V0KTsKKwlyZW5hbWUoIi4uY29uZmlnLnRtcCIsIG5hbWUpOworCXJldHVybiAwOworfQorCisKKy8qIEFsbG9jYXRlIGluaXRpYWwgZ3Jvd2FibGUgc3RyaW5nICovCitzdHJ1Y3QgZ3N0ciBzdHJfbmV3KHZvaWQpCit7CisJc3RydWN0IGdzdHIgZ3M7CisJZ3MucyA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiA2NCk7CisJZ3MubGVuID0gMTY7CisJc3RyY3B5KGdzLnMsICJcMCIpOworCXJldHVybiBnczsKK30KKworLyogQWxsb2NhdGUgYW5kIGFzc2lnbiBncm93YWJsZSBzdHJpbmcgKi8KK3N0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgZ3N0ciBnczsKKwlncy5zID0gc3RyZHVwKHMpOworCWdzLmxlbiA9IHN0cmxlbihzKSArIDE7CisJcmV0dXJuIGdzOworfQorCisvKiBGcmVlIHN0b3JhZ2UgZm9yIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfZnJlZShzdHJ1Y3QgZ3N0ciAqZ3MpCit7CisJaWYgKGdzLT5zKQorCQlmcmVlKGdzLT5zKTsKKwlncy0+cyA9IE5VTEw7CisJZ3MtPmxlbiA9IDA7Cit9CisKKy8qIEFwcGVuZCB0byBncm93YWJsZSBzdHJpbmcgKi8KK3ZvaWQgc3RyX2FwcGVuZChzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKnMpCit7CisJc2l6ZV90IGwgPSBzdHJsZW4oZ3MtPnMpICsgc3RybGVuKHMpICsgMTsKKwlpZiAobCA+IGdzLT5sZW4pIHsKKwkJZ3MtPnMgICA9IHJlYWxsb2MoZ3MtPnMsIGwpOworCQlncy0+bGVuID0gbDsKKwl9CisJc3RyY2F0KGdzLT5zLCBzKTsKK30KKworLyogQXBwZW5kIHByaW50ZiBmb3JtYXR0ZWQgc3RyaW5nIHRvIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfcHJpbnRmKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwljaGFyIHNbMTAwMDBdOyAvKiBiaWcgZW5vdWdoLi4uICovCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdnNucHJpbnRmKHMsIHNpemVvZihzKSwgZm10LCBhcCk7CisJc3RyX2FwcGVuZChncywgcyk7CisJdmFfZW5kKGFwKTsKK30KKworLyogUmV0cmlldmUgdmFsdWUgb2YgZ3Jvd2FibGUgc3RyaW5nICovCitjb25zdCBjaGFyICpzdHJfZ2V0KHN0cnVjdCBnc3RyICpncykKK3sKKwlyZXR1cm4gZ3MtPnM7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYgYi9zY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMjIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZgpAQCAtMCwwICsxLDQzIEBACislbGFuZ3VhZ2U9QU5TSS1DCislZGVmaW5lIGhhc2gtZnVuY3Rpb24tbmFtZSBrY29uZl9pZF9oYXNoCislZGVmaW5lIGxvb2t1cC1mdW5jdGlvbi1uYW1lIGtjb25mX2lkX2xvb2t1cAorJWRlZmluZSBzdHJpbmctcG9vbC1uYW1lIGtjb25mX2lkX3N0cmluZ3MKKyVjb21wYXJlLXN0cm5jbXAKKyVlbnVtCislcGljCislc3RydWN0LXR5cGUKKworc3RydWN0IGtjb25mX2lkOworCislJQorbWFpbm1lbnUsCVRfTUFJTk1FTlUsCVRGX0NPTU1BTkQKK21lbnUsCQlUX01FTlUsCQlURl9DT01NQU5ECitlbmRtZW51LAlUX0VORE1FTlUsCVRGX0NPTU1BTkQKK3NvdXJjZSwJCVRfU09VUkNFLAlURl9DT01NQU5ECitjaG9pY2UsCQlUX0NIT0lDRSwJVEZfQ09NTUFORAorZW5kY2hvaWNlLAlUX0VORENIT0lDRSwJVEZfQ09NTUFORAorY29tbWVudCwJVF9DT01NRU5ULAlURl9DT01NQU5ECitjb25maWcsCQlUX0NPTkZJRywJVEZfQ09NTUFORAorbWVudWNvbmZpZywJVF9NRU5VQ09ORklHLAlURl9DT01NQU5ECitoZWxwLAkJVF9IRUxQLAkJVEZfQ09NTUFORAoraWYsCQlUX0lGLAkJVEZfQ09NTUFORHxURl9QQVJBTQorZW5kaWYsCQlUX0VORElGLAlURl9DT01NQU5ECitkZXBlbmRzLAlUX0RFUEVORFMsCVRGX0NPTU1BTkQKK3JlcXVpcmVzLAlUX1JFUVVJUkVTLAlURl9DT01NQU5ECitvcHRpb25hbCwJVF9PUFRJT05BTCwJVEZfQ09NTUFORAorZGVmYXVsdCwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1VOS05PV04KK3Byb21wdCwJCVRfUFJPTVBULAlURl9DT01NQU5ECit0cmlzdGF0ZSwJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19UUklTVEFURQorZGVmX3RyaXN0YXRlLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEUKK2Jvb2wsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0JPT0xFQU4KK2Jvb2xlYW4sCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTgorZGVmX2Jvb2wsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19CT09MRUFOCitkZWZfYm9vbGVhbiwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX0JPT0xFQU4KK2ludCwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfSU5UCitoZXgsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0hFWAorc3RyaW5nLAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19TVFJJTkcKK3NlbGVjdCwJCVRfU0VMRUNULAlURl9DT01NQU5ECitlbmFibGUsCQlUX1NFTEVDVCwJVEZfQ09NTUFORAorcmFuZ2UsCQlUX1JBTkdFLAlURl9DT01NQU5ECitvbiwJCVRfT04sCQlURl9QQVJBTQorJSUKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5oYXNoLmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5oYXNoLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzljZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkCkBAIC0wLDAgKzEsMjMwIEBACisvKiBBTlNJLUMgY29kZSBwcm9kdWNlZCBieSBncGVyZiB2ZXJzaW9uIDMuMC4xICovCisvKiBDb21tYW5kLWxpbmU6IGdwZXJmICAqLworLyogQ29tcHV0ZWQgcG9zaXRpb25zOiAtaycxLDMnICovCisKKyNpZiAhKCgnICcgPT0gMzIpICYmICgnIScgPT0gMzMpICYmICgnIicgPT0gMzQpICYmICgnIycgPT0gMzUpIFwKKyAgICAgICYmICgnJScgPT0gMzcpICYmICgnJicgPT0gMzgpICYmICgnXCcnID09IDM5KSAmJiAoJygnID09IDQwKSBcCisgICAgICAmJiAoJyknID09IDQxKSAmJiAoJyonID09IDQyKSAmJiAoJysnID09IDQzKSAmJiAoJywnID09IDQ0KSBcCisgICAgICAmJiAoJy0nID09IDQ1KSAmJiAoJy4nID09IDQ2KSAmJiAoJy8nID09IDQ3KSAmJiAoJzAnID09IDQ4KSBcCisgICAgICAmJiAoJzEnID09IDQ5KSAmJiAoJzInID09IDUwKSAmJiAoJzMnID09IDUxKSAmJiAoJzQnID09IDUyKSBcCisgICAgICAmJiAoJzUnID09IDUzKSAmJiAoJzYnID09IDU0KSAmJiAoJzcnID09IDU1KSAmJiAoJzgnID09IDU2KSBcCisgICAgICAmJiAoJzknID09IDU3KSAmJiAoJzonID09IDU4KSAmJiAoJzsnID09IDU5KSAmJiAoJzwnID09IDYwKSBcCisgICAgICAmJiAoJz0nID09IDYxKSAmJiAoJz4nID09IDYyKSAmJiAoJz8nID09IDYzKSAmJiAoJ0EnID09IDY1KSBcCisgICAgICAmJiAoJ0InID09IDY2KSAmJiAoJ0MnID09IDY3KSAmJiAoJ0QnID09IDY4KSAmJiAoJ0UnID09IDY5KSBcCisgICAgICAmJiAoJ0YnID09IDcwKSAmJiAoJ0cnID09IDcxKSAmJiAoJ0gnID09IDcyKSAmJiAoJ0knID09IDczKSBcCisgICAgICAmJiAoJ0onID09IDc0KSAmJiAoJ0snID09IDc1KSAmJiAoJ0wnID09IDc2KSAmJiAoJ00nID09IDc3KSBcCisgICAgICAmJiAoJ04nID09IDc4KSAmJiAoJ08nID09IDc5KSAmJiAoJ1AnID09IDgwKSAmJiAoJ1EnID09IDgxKSBcCisgICAgICAmJiAoJ1InID09IDgyKSAmJiAoJ1MnID09IDgzKSAmJiAoJ1QnID09IDg0KSAmJiAoJ1UnID09IDg1KSBcCisgICAgICAmJiAoJ1YnID09IDg2KSAmJiAoJ1cnID09IDg3KSAmJiAoJ1gnID09IDg4KSAmJiAoJ1knID09IDg5KSBcCisgICAgICAmJiAoJ1onID09IDkwKSAmJiAoJ1snID09IDkxKSAmJiAoJ1xcJyA9PSA5MikgJiYgKCddJyA9PSA5MykgXAorICAgICAgJiYgKCdeJyA9PSA5NCkgJiYgKCdfJyA9PSA5NSkgJiYgKCdhJyA9PSA5NykgJiYgKCdiJyA9PSA5OCkgXAorICAgICAgJiYgKCdjJyA9PSA5OSkgJiYgKCdkJyA9PSAxMDApICYmICgnZScgPT0gMTAxKSAmJiAoJ2YnID09IDEwMikgXAorICAgICAgJiYgKCdnJyA9PSAxMDMpICYmICgnaCcgPT0gMTA0KSAmJiAoJ2knID09IDEwNSkgJiYgKCdqJyA9PSAxMDYpIFwKKyAgICAgICYmICgnaycgPT0gMTA3KSAmJiAoJ2wnID09IDEwOCkgJiYgKCdtJyA9PSAxMDkpICYmICgnbicgPT0gMTEwKSBcCisgICAgICAmJiAoJ28nID09IDExMSkgJiYgKCdwJyA9PSAxMTIpICYmICgncScgPT0gMTEzKSAmJiAoJ3InID09IDExNCkgXAorICAgICAgJiYgKCdzJyA9PSAxMTUpICYmICgndCcgPT0gMTE2KSAmJiAoJ3UnID09IDExNykgJiYgKCd2JyA9PSAxMTgpIFwKKyAgICAgICYmICgndycgPT0gMTE5KSAmJiAoJ3gnID09IDEyMCkgJiYgKCd5JyA9PSAxMjEpICYmICgneicgPT0gMTIyKSBcCisgICAgICAmJiAoJ3snID09IDEyMykgJiYgKCd8JyA9PSAxMjQpICYmICgnfScgPT0gMTI1KSAmJiAoJ34nID09IDEyNikpCisvKiBUaGUgY2hhcmFjdGVyIHNldCBpcyBub3QgYmFzZWQgb24gSVNPLTY0Ni4gICovCisjZXJyb3IgImdwZXJmIGdlbmVyYXRlZCB0YWJsZXMgZG9uJ3Qgd29yayB3aXRoIHRoaXMgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQuIFBsZWFzZSByZXBvcnQgYSBidWcgdG8gPGJ1Zy1nbnUtZ3BlcmZAZ251Lm9yZz4uIgorI2VuZGlmCisKK3N0cnVjdCBrY29uZl9pZDsKKy8qIG1heGltdW0ga2V5IHJhbmdlID0gNDUsIGR1cGxpY2F0ZXMgPSAwICovCisKKyNpZmRlZiBfX0dOVUNfXworX19pbmxpbmUKKyNlbHNlCisjaWZkZWYgX19jcGx1c3BsdXMKK2lubGluZQorI2VuZGlmCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2tjb25mX2lkX2hhc2ggKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNzb192YWx1ZXNbXSA9CisgICAgeworICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDI1LCAxMCwgMTUsCisgICAgICAgMCwgIDAsICA1LCA0NywgIDAsICAwLCA0NywgNDcsICAwLCAxMCwKKyAgICAgICAwLCAyMCwgMjAsIDIwLCAgNSwgIDAsICAwLCAyMCwgNDcsIDQ3LAorICAgICAgMjAsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywKKyAgICAgIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LAorICAgICAgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3LCA0NywgNDcsCisgICAgICA0NywgNDcsIDQ3LCA0NywgNDcsIDQ3CisgICAgfTsKKyAgcmVnaXN0ZXIgaW50IGh2YWwgPSBsZW47CisKKyAgc3dpdGNoIChodmFsKQorICAgIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGh2YWwgKz0gYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyWzJdXTsKKyAgICAgIC8qRkFMTFRIUk9VR0gqLworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAxOgorICAgICAgICBodmFsICs9IGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0clswXV07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIGh2YWw7Cit9CisKK3N0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QKKyAgeworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyW3NpemVvZigiaWYiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjNbc2l6ZW9mKCJpbnQiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjRbc2l6ZW9mKCJoZWxwIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI1W3NpemVvZigiZW5kaWYiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjZbc2l6ZW9mKCJzZWxlY3QiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjdbc2l6ZW9mKCJlbmRtZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI4W3NpemVvZigidHJpc3RhdGUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjlbc2l6ZW9mKCJlbmRjaG9pY2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEwW3NpemVvZigicmFuZ2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjExW3NpemVvZigic3RyaW5nIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxMltzaXplb2YoImRlZmF1bHQiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEzW3NpemVvZigiZGVmX2Jvb2wiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE0W3NpemVvZigibWVudSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTZbc2l6ZW9mKCJkZWZfYm9vbGVhbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMTdbc2l6ZW9mKCJkZWZfdHJpc3RhdGUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE4W3NpemVvZigibWFpbm1lbnUiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIwW3NpemVvZigibWVudWNvbmZpZyIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjFbc2l6ZW9mKCJjb25maWciKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIyW3NpemVvZigib24iKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIzW3NpemVvZigiaGV4IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyNltzaXplb2YoInNvdXJjZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjdbc2l6ZW9mKCJkZXBlbmRzIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyOFtzaXplb2YoIm9wdGlvbmFsIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzMVtzaXplb2YoImVuYWJsZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzJbc2l6ZW9mKCJjb21tZW50IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzM1tzaXplb2YoInJlcXVpcmVzIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzNFtzaXplb2YoImJvb2wiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM3W3NpemVvZigiYm9vbGVhbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDFbc2l6ZW9mKCJjaG9pY2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjQ2W3NpemVvZigicHJvbXB0IildOworICB9Oworc3RhdGljIHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3Qga2NvbmZfaWRfc3RyaW5nc19jb250ZW50cyA9CisgIHsKKyAgICAiaWYiLAorICAgICJpbnQiLAorICAgICJoZWxwIiwKKyAgICAiZW5kaWYiLAorICAgICJzZWxlY3QiLAorICAgICJlbmRtZW51IiwKKyAgICAidHJpc3RhdGUiLAorICAgICJlbmRjaG9pY2UiLAorICAgICJyYW5nZSIsCisgICAgInN0cmluZyIsCisgICAgImRlZmF1bHQiLAorICAgICJkZWZfYm9vbCIsCisgICAgIm1lbnUiLAorICAgICJkZWZfYm9vbGVhbiIsCisgICAgImRlZl90cmlzdGF0ZSIsCisgICAgIm1haW5tZW51IiwKKyAgICAibWVudWNvbmZpZyIsCisgICAgImNvbmZpZyIsCisgICAgIm9uIiwKKyAgICAiaGV4IiwKKyAgICAic291cmNlIiwKKyAgICAiZGVwZW5kcyIsCisgICAgIm9wdGlvbmFsIiwKKyAgICAiZW5hYmxlIiwKKyAgICAiY29tbWVudCIsCisgICAgInJlcXVpcmVzIiwKKyAgICAiYm9vbCIsCisgICAgImJvb2xlYW4iLAorICAgICJjaG9pY2UiLAorICAgICJwcm9tcHQiCisgIH07CisjZGVmaW5lIGtjb25mX2lkX3N0cmluZ3MgKChjb25zdCBjaGFyICopICZrY29uZl9pZF9zdHJpbmdzX2NvbnRlbnRzKQorI2lmZGVmIF9fR05VQ19fCitfX2lubGluZQorI2VuZGlmCitzdHJ1Y3Qga2NvbmZfaWQgKgora2NvbmZfaWRfbG9va3VwIChyZWdpc3RlciBjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW4pCit7CisgIGVudW0KKyAgICB7CisgICAgICBUT1RBTF9LRVlXT1JEUyA9IDMwLAorICAgICAgTUlOX1dPUkRfTEVOR1RIID0gMiwKKyAgICAgIE1BWF9XT1JEX0xFTkdUSCA9IDEyLAorICAgICAgTUlOX0hBU0hfVkFMVUUgPSAyLAorICAgICAgTUFYX0hBU0hfVkFMVUUgPSA0NgorICAgIH07CisKKyAgc3RhdGljIHN0cnVjdCBrY29uZl9pZCB3b3JkbGlzdFtdID0KKyAgICB7CisgICAgICB7LTF9LCB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIsCQlUX0lGLAkJVEZfQ09NTUFORHxURl9QQVJBTX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMywJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfSU5UfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI0LAkJVF9IRUxQLAkJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNSwJCVRfRU5ESUYsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjYsCQlUX1NFTEVDVCwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNywJVF9FTkRNRU5VLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI4LAlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1RSSVNUQVRFfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI5LAlUX0VORENIT0lDRSwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTAsCQlUX1JBTkdFLAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMSwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfU1RSSU5HfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMiwJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1VOS05PV059LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEzLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTQsCQlUX01FTlUsCQlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTYsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNywJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1RSSVNUQVRFfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxOCwJVF9NQUlOTUVOVSwJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIwLAlUX01FTlVDT05GSUcsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIxLAkJVF9DT05GSUcsCVRGX0NPTU1BTkR9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIyLAkJVF9PTiwJCVRGX1BBUkFNfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyMywJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfSEVYfSwKKyAgICAgIHstMX0sIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjYsCQlUX1NPVVJDRSwJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjcsCVRfREVQRU5EUywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjgsCVRfT1BUSU9OQUwsCVRGX0NPTU1BTkR9LAorICAgICAgey0xfSwgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMSwJCVRfU0VMRUNULAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMiwJVF9DT01NRU5ULAlURl9DT01NQU5EfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMywJVF9SRVFVSVJFUywJVEZfQ09NTUFORH0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzQsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0JPT0xFQU59LAorICAgICAgey0xfSwgey0xfSwKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNywJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKKyAgICAgIHstMX0sIHstMX0sIHstMX0sCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDEsCQlUX0NIT0lDRSwJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LCB7LTF9LCB7LTF9LCB7LTF9LAorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQ2LAkJVF9QUk9NUFQsCVRGX0NPTU1BTkR9CisgICAgfTsKKworICBpZiAobGVuIDw9IE1BWF9XT1JEX0xFTkdUSCAmJiBsZW4gPj0gTUlOX1dPUkRfTEVOR1RIKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCBrZXkgPSBrY29uZl9pZF9oYXNoIChzdHIsIGxlbik7CisKKyAgICAgIGlmIChrZXkgPD0gTUFYX0hBU0hfVkFMVUUgJiYga2V5ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICByZWdpc3RlciBpbnQgbyA9IHdvcmRsaXN0W2tleV0ubmFtZTsKKyAgICAgICAgICBpZiAobyA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzID0gbyArIGtjb25mX2lkX3N0cmluZ3M7CisKKyAgICAgICAgICAgICAgaWYgKCpzdHIgPT0gKnMgJiYgIXN0cm5jbXAgKHN0ciArIDEsIHMgKyAxLCBsZW4gLSAxKSAmJiBzW2xlbl0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICByZXR1cm4gJndvcmRsaXN0W2tleV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU4YjgwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwKQEAgLTAsMCArMSwzNTUgQEAKKyVvcHRpb24gYmFja3VwIG5vc3RkaW5pdCBub3l5d3JhcCBuZXZlci1pbnRlcmFjdGl2ZSBmdWxsIGVjcworJW9wdGlvbiA4Yml0IGJhY2t1cCBub2RlZmF1bHQgcGVyZi1yZXBvcnQgcGVyZi1yZXBvcnQKKyV4IENPTU1BTkQgSEVMUCBTVFJJTkcgUEFSQU0KKyV7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgorCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworfSBjdXJyZW50X3BvczsKKworc3RhdGljIGNoYXIgKnRleHQ7CitzdGF0aWMgaW50IHRleHRfc2l6ZSwgdGV4dF9hc2l6ZTsKKworc3RydWN0IGJ1ZmZlciB7CisgICAgICAgIHN0cnVjdCBidWZmZXIgKnBhcmVudDsKKyAgICAgICAgWVlfQlVGRkVSX1NUQVRFIHN0YXRlOworfTsKKworc3RydWN0IGJ1ZmZlciAqY3VycmVudF9idWY7CisKK3N0YXRpYyBpbnQgbGFzdF90cywgZmlyc3RfdHM7CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCk7CitzdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpOworCit2b2lkIG5ld19zdHJpbmcodm9pZCkKK3sKKwl0ZXh0ID0gbWFsbG9jKFNUQVJUX1NUUlNJWkUpOworCXRleHRfYXNpemUgPSBTVEFSVF9TVFJTSVpFOworCXRleHRfc2l6ZSA9IDA7CisJKnRleHQgPSAwOworfQorCit2b2lkIGFwcGVuZF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbmV3X3NpemUgPSB0ZXh0X3NpemUgKyBzaXplICsgMTsKKwlpZiAoc2l6ZSA+IDcwKSB7CisJICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczolZCBlcnJvcjogT3ZlcmxvbmcgbGluZVxuIiwKKwkJCSBjdXJyZW50X2ZpbGUtPm5hbWUsIGN1cnJlbnRfZmlsZS0+bGluZW5vKTsKKwl9CisJaWYgKG5ld19zaXplID4gdGV4dF9hc2l6ZSkgeworCQluZXdfc2l6ZSArPSBTVEFSVF9TVFJTSVpFIC0gMTsKKwkJbmV3X3NpemUgJj0gLVNUQVJUX1NUUlNJWkU7CisJCXRleHQgPSByZWFsbG9jKHRleHQsIG5ld19zaXplKTsKKwkJdGV4dF9hc2l6ZSA9IG5ld19zaXplOworCX0KKwltZW1jcHkodGV4dCArIHRleHRfc2l6ZSwgc3RyLCBzaXplKTsKKwl0ZXh0X3NpemUgKz0gc2l6ZTsKKwl0ZXh0W3RleHRfc2l6ZV0gPSAwOworfQorCit2b2lkIGFsbG9jX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCXRleHQgPSBtYWxsb2Moc2l6ZSArIDEpOworCW1lbWNweSh0ZXh0LCBzdHIsIHNpemUpOworCXRleHRbc2l6ZV0gPSAwOworfQorJX0KKword3MJWyBcblx0XQorbglbQS1aYS16MC05X10KKworJSUKKwlpbnQgc3RyID0gMDsKKwlpbnQgdHMsIGk7CisKK1sgXHRdKiMuKlxuCXwKK1sgXHRdKlxuCXsKKwljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCXJldHVybiBUX0VPTDsKK30KK1sgXHRdKiMuKgorCisKK1sgXHRdKwl7CisJQkVHSU4oQ09NTUFORCk7Cit9CisKKy4JeworCXVucHV0KHl5dGV4dFswXSk7CisJQkVHSU4oQ09NTUFORCk7Cit9CisKKworPENPTU1BTkQ+eworCXtufSsJeworCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHl5dGV4dCwgeXlsZW5nKTsKKwkJQkVHSU4oUEFSQU0pOworCQljdXJyZW50X3Bvcy5maWxlID0gY3VycmVudF9maWxlOworCQljdXJyZW50X3Bvcy5saW5lbm8gPSBjdXJyZW50X2ZpbGUtPmxpbmVubzsKKwkJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX0NPTU1BTkQpIHsKKwkJCXpjb25mbHZhbC5pZCA9IGlkOworCQkJcmV0dXJuIGlkLT50b2tlbjsKKwkJfQorCQlhbGxvY19zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJLgorCVxuCXsKKwkJQkVHSU4oSU5JVElBTCk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCXJldHVybiBUX0VPTDsKKwl9Cit9CisKKzxQQVJBTT57CisJIiYmIglyZXR1cm4gVF9BTkQ7CisJInx8IglyZXR1cm4gVF9PUjsKKwkiKCIJcmV0dXJuIFRfT1BFTl9QQVJFTjsKKwkiKSIJcmV0dXJuIFRfQ0xPU0VfUEFSRU47CisJIiEiCXJldHVybiBUX05PVDsKKwkiPSIJcmV0dXJuIFRfRVFVQUw7CisJIiE9IglyZXR1cm4gVF9VTkVRVUFMOworCVwifFwnCXsKKwkJc3RyID0geXl0ZXh0WzBdOworCQluZXdfc3RyaW5nKCk7CisJCUJFR0lOKFNUUklORyk7CisJfQorCVxuCUJFR0lOKElOSVRJQUwpOyBjdXJyZW50X2ZpbGUtPmxpbmVubysrOyByZXR1cm4gVF9FT0w7CisJLS0tCS8qIGlnbm9yZSAqLworCSh7bn18Wy0vLl0pKwl7CisJCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoeXl0ZXh0LCB5eWxlbmcpOworCQlpZiAoaWQgJiYgaWQtPmZsYWdzICYgVEZfUEFSQU0pIHsKKwkJCXpjb25mbHZhbC5pZCA9IGlkOworCQkJcmV0dXJuIGlkLT50b2tlbjsKKwkJfQorCQlhbGxvY19zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJIy4qCS8qIGNvbW1lbnQgKi8KKwlcXFxuCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJLgorCTw8RU9GPj4geworCQlCRUdJTihJTklUSUFMKTsKKwl9Cit9CisKKzxTVFJJTkc+eworCVteJyJcXFxuXSsvXG4JeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVteJyJcXFxuXSsJeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwl9CisJXFwuPy9cbgl7CisJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0ICsgMSwgeXlsZW5nIC0gMSk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlcXC4/CXsKKwkJYXBwZW5kX3N0cmluZyh5eXRleHQgKyAxLCB5eWxlbmcgLSAxKTsKKwl9CisJXCd8XCIJeworCQlpZiAoc3RyID09IHl5dGV4dFswXSkgeworCQkJQkVHSU4oUEFSQU0pOworCQkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCQl9IGVsc2UKKwkJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0LCAxKTsKKwl9CisJXG4JeworCQlwcmludGYoIiVzOiVkOndhcm5pbmc6IG11bHRpLWxpbmUgc3RyaW5ncyBub3Qgc3VwcG9ydGVkXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJQkVHSU4oSU5JVElBTCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJPDxFT0Y+Pgl7CisJCUJFR0lOKElOSVRJQUwpOworCX0KK30KKworPEhFTFA+eworCVsgXHRdKwl7CisJCXRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHl5bGVuZzsgaSsrKSB7CisJCQlpZiAoeXl0ZXh0W2ldID09ICdcdCcpCisJCQkJdHMgPSAodHMgJiB+NykgKyA4OworCQkJZWxzZQorCQkJCXRzKys7CisJCX0KKwkJbGFzdF90cyA9IHRzOworCQlpZiAoZmlyc3RfdHMpIHsKKwkJCWlmICh0cyA8IGZpcnN0X3RzKSB7CisJCQkJemNvbmZfZW5kaGVscCgpOworCQkJCXJldHVybiBUX0hFTFBURVhUOworCQkJfQorCQkJdHMgLT0gZmlyc3RfdHM7CisJCQl3aGlsZSAodHMgPiA4KSB7CisJCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCA4KTsKKwkJCQl0cyAtPSA4OworCQkJfQorCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCB0cyk7CisJCX0KKwl9CisJWyBcdF0qXG4vW14gXHRcbl0geworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQl6Y29uZl9lbmRoZWxwKCk7CisJCXJldHVybiBUX0hFTFBURVhUOworCX0KKwlbIFx0XSpcbgl7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCWFwcGVuZF9zdHJpbmcoIlxuIiwgMSk7CisJfQorCVteIFx0XG5dLiogeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwkJaWYgKCFmaXJzdF90cykKKwkJCWZpcnN0X3RzID0gbGFzdF90czsKKwl9CisJPDxFT0Y+Pgl7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorfQorCis8PEVPRj4+CXsKKwlpZiAoY3VycmVudF9maWxlKSB7CisJCXpjb25mX2VuZGZpbGUoKTsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwlmY2xvc2UoeXlpbik7CisJeXl0ZXJtaW5hdGUoKTsKK30KKworJSUKK3ZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpCit7CisJbmV3X3N0cmluZygpOworCWxhc3RfdHMgPSBmaXJzdF90cyA9IDA7CisJQkVHSU4oSEVMUCk7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCkKK3sKKwl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwlCRUdJTihJTklUSUFMKTsKK30KKworCisvKgorICogVHJ5IHRvIG9wZW4gc3BlY2lmaWVkIGZpbGUgd2l0aCBmb2xsb3dpbmcgbmFtZXM6CisgKiAuL25hbWUKKyAqICQoc3JjdHJlZSkvbmFtZQorICogVGhlIGxhdHRlciBpcyB1c2VkIHdoZW4gc3JjdHJlZSBpcyBzZXBhcmF0ZSBmcm9tIG9ianRyZWUKKyAqIHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwuCisgKiBSZXR1cm4gTlVMTCBpZiBmaWxlIGlzIG5vdCBmb3VuZC4KKyAqLworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICplbnY7CisJRklMRSAqZjsKKworCWYgPSBmb3BlbihuYW1lLCAiciIpOworCWlmICghZiAmJiBuYW1lWzBdICE9ICcvJykgeworCQllbnYgPSBnZXRlbnYoU1JDVFJFRSk7CisJCWlmIChlbnYpIHsKKwkJCWNoYXIgKmZ1bGxuYW1lID0gYWxsb2NhKHN0cmxlbihlbnYpICsgc3RybGVuKG5hbWUpICsgMik7CisJCQlzcHJpbnRmKGZ1bGxuYW1lLCAiJXMvJXMiLCBlbnYsIG5hbWUpOworCQkJZiA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOworCQl9CisJfQorCXJldHVybiBmOworfQorCit2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJeXlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCWlmICgheXlpbikgeworCQlwcmludGYoImNhbid0IGZpbmQgZmlsZSAlc1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJY3VycmVudF9idWYgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCW1lbXNldChjdXJyZW50X2J1ZiwgMCwgc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCisJY3VycmVudF9maWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJY3VycmVudF9maWxlLT5saW5lbm8gPSAxOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgPSBGSUxFX0JVU1k7Cit9CisKK3ZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCXN0cnVjdCBidWZmZXIgKmJ1ZiA9IG1hbGxvYyhzaXplb2YoKmJ1ZikpOworCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisKKwljdXJyZW50X2J1Zi0+c3RhdGUgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKwl5eWluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF5eWluKSB7CisJCXByaW50ZigiJXM6JWQ6IGNhbid0IG9wZW4gZmlsZSBcIiVzXCJcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIG5hbWUpOworCQlleGl0KDEpOworCX0KKwl5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKKwlidWYtPnBhcmVudCA9IGN1cnJlbnRfYnVmOworCWN1cnJlbnRfYnVmID0gYnVmOworCisJaWYgKGZpbGUtPmZsYWdzICYgRklMRV9CVVNZKSB7CisJCXByaW50ZigicmVjdXJzaXZlIHNjYW4gKCVzKT9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX1NDQU5ORUQpIHsKKwkJcHJpbnRmKCJmaWxlICVzIGFscmVhZHkgc2Nhbm5lZD9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlmaWxlLT5mbGFncyB8PSBGSUxFX0JVU1k7CisJZmlsZS0+bGluZW5vID0gMTsKKwlmaWxlLT5wYXJlbnQgPSBjdXJyZW50X2ZpbGU7CisJY3VycmVudF9maWxlID0gZmlsZTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kZmlsZSh2b2lkKQoreworCXN0cnVjdCBidWZmZXIgKnBhcmVudDsKKworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgfD0gRklMRV9TQ0FOTkVEOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgJj0gfkZJTEVfQlVTWTsKKwljdXJyZW50X2ZpbGUgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsKKworCXBhcmVudCA9IGN1cnJlbnRfYnVmLT5wYXJlbnQ7CisJaWYgKHBhcmVudCkgeworCQlmY2xvc2UoeXlpbik7CisJCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCQl5eV9zd2l0Y2hfdG9fYnVmZmVyKHBhcmVudC0+c3RhdGUpOworCX0KKwlmcmVlKGN1cnJlbnRfYnVmKTsKKwljdXJyZW50X2J1ZiA9IHBhcmVudDsKK30KKworaW50IHpjb25mX2xpbmVubyh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3Bvcy5saW5lbm87Cit9CisKK2NoYXIgKnpjb25mX2N1cm5hbWUodm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudF9wb3MuZmlsZSA/IGN1cnJlbnRfcG9zLmZpbGUtPm5hbWUgOiAiPG5vbmU+IjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ZDI1NgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjE3MSBAQAorLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuMC4gICovCisKKy8qIFNrZWxldG9uIHBhcnNlciBmb3IgWWFjYy1saWtlIHBhcnNpbmcgd2l0aCBCaXNvbiwKKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKKyAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLworCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvIGNhbGxlZAorICAgYGBzZW1hbnRpYycnIHBhcnNlci4gICovCisKKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisgICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKKyAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCisgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisgICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgorICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCisKKy8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisjZGVmaW5lIFlZQklTT04gMQorCisvKiBTa2VsZXRvbiBuYW1lLiAgKi8KKyNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCisKKy8qIFB1cmUgcGFyc2Vycy4gICovCisjZGVmaW5lIFlZUFVSRSAwCisKKy8qIFVzaW5nIGxvY2F0aW9ucy4gICovCisjZGVmaW5lIFlZTFNQX05FRURFRCAwCisKKy8qIFN1YnN0aXR1dGUgdGhlIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBuYW1lcy4gICovCisjZGVmaW5lIHl5cGFyc2UgemNvbmZwYXJzZQorI2RlZmluZSB5eWxleCAgIHpjb25mbGV4CisjZGVmaW5lIHl5ZXJyb3IgemNvbmZlcnJvcgorI2RlZmluZSB5eWx2YWwgIHpjb25mbHZhbAorI2RlZmluZSB5eWNoYXIgIHpjb25mY2hhcgorI2RlZmluZSB5eWRlYnVnIHpjb25mZGVidWcKKyNkZWZpbmUgeXluZXJycyB6Y29uZm5lcnJzCisKKworLyogVG9rZW5zLiAgKi8KKyNpZm5kZWYgWVlUT0tFTlRZUEUKKyMgZGVmaW5lIFlZVE9LRU5UWVBFCisgICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKKyAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCisgICBlbnVtIHl5dG9rZW50eXBlIHsKKyAgICAgVF9NQUlOTUVOVSA9IDI1OCwKKyAgICAgVF9NRU5VID0gMjU5LAorICAgICBUX0VORE1FTlUgPSAyNjAsCisgICAgIFRfU09VUkNFID0gMjYxLAorICAgICBUX0NIT0lDRSA9IDI2MiwKKyAgICAgVF9FTkRDSE9JQ0UgPSAyNjMsCisgICAgIFRfQ09NTUVOVCA9IDI2NCwKKyAgICAgVF9DT05GSUcgPSAyNjUsCisgICAgIFRfTUVOVUNPTkZJRyA9IDI2NiwKKyAgICAgVF9IRUxQID0gMjY3LAorICAgICBUX0hFTFBURVhUID0gMjY4LAorICAgICBUX0lGID0gMjY5LAorICAgICBUX0VORElGID0gMjcwLAorICAgICBUX0RFUEVORFMgPSAyNzEsCisgICAgIFRfUkVRVUlSRVMgPSAyNzIsCisgICAgIFRfT1BUSU9OQUwgPSAyNzMsCisgICAgIFRfUFJPTVBUID0gMjc0LAorICAgICBUX1RZUEUgPSAyNzUsCisgICAgIFRfREVGQVVMVCA9IDI3NiwKKyAgICAgVF9TRUxFQ1QgPSAyNzcsCisgICAgIFRfUkFOR0UgPSAyNzgsCisgICAgIFRfT04gPSAyNzksCisgICAgIFRfV09SRCA9IDI4MCwKKyAgICAgVF9XT1JEX1FVT1RFID0gMjgxLAorICAgICBUX1VORVFVQUwgPSAyODIsCisgICAgIFRfQ0xPU0VfUEFSRU4gPSAyODMsCisgICAgIFRfT1BFTl9QQVJFTiA9IDI4NCwKKyAgICAgVF9FT0wgPSAyODUsCisgICAgIFRfT1IgPSAyODYsCisgICAgIFRfQU5EID0gMjg3LAorICAgICBUX0VRVUFMID0gMjg4LAorICAgICBUX05PVCA9IDI4OQorICAgfTsKKyNlbmRpZgorI2RlZmluZSBUX01BSU5NRU5VIDI1OAorI2RlZmluZSBUX01FTlUgMjU5CisjZGVmaW5lIFRfRU5ETUVOVSAyNjAKKyNkZWZpbmUgVF9TT1VSQ0UgMjYxCisjZGVmaW5lIFRfQ0hPSUNFIDI2MgorI2RlZmluZSBUX0VORENIT0lDRSAyNjMKKyNkZWZpbmUgVF9DT01NRU5UIDI2NAorI2RlZmluZSBUX0NPTkZJRyAyNjUKKyNkZWZpbmUgVF9NRU5VQ09ORklHIDI2NgorI2RlZmluZSBUX0hFTFAgMjY3CisjZGVmaW5lIFRfSEVMUFRFWFQgMjY4CisjZGVmaW5lIFRfSUYgMjY5CisjZGVmaW5lIFRfRU5ESUYgMjcwCisjZGVmaW5lIFRfREVQRU5EUyAyNzEKKyNkZWZpbmUgVF9SRVFVSVJFUyAyNzIKKyNkZWZpbmUgVF9PUFRJT05BTCAyNzMKKyNkZWZpbmUgVF9QUk9NUFQgMjc0CisjZGVmaW5lIFRfVFlQRSAyNzUKKyNkZWZpbmUgVF9ERUZBVUxUIDI3NgorI2RlZmluZSBUX1NFTEVDVCAyNzcKKyNkZWZpbmUgVF9SQU5HRSAyNzgKKyNkZWZpbmUgVF9PTiAyNzkKKyNkZWZpbmUgVF9XT1JEIDI4MAorI2RlZmluZSBUX1dPUkRfUVVPVEUgMjgxCisjZGVmaW5lIFRfVU5FUVVBTCAyODIKKyNkZWZpbmUgVF9DTE9TRV9QQVJFTiAyODMKKyNkZWZpbmUgVF9PUEVOX1BBUkVOIDI4NAorI2RlZmluZSBUX0VPTCAyODUKKyNkZWZpbmUgVF9PUiAyODYKKyNkZWZpbmUgVF9BTkQgMjg3CisjZGVmaW5lIFRfRVFVQUwgMjg4CisjZGVmaW5lIFRfTk9UIDI4OQorCisKKworCisvKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNpbmNsdWRlICJ6Y29uZi5oYXNoLmMiCisKKyNkZWZpbmUgcHJpbnRkKG1hc2ssIGZtdC4uLikgaWYgKGNkZWJ1ZyAmIChtYXNrKSkgcHJpbnRmKGZtdCkKKworI2RlZmluZSBQUklOVEQJCTB4MDAwMQorI2RlZmluZSBERUJVR19QQVJTRQkweDAwMDIKKworaW50IGNkZWJ1ZyA9IFBSSU5URDsKKworZXh0ZXJuIGludCB6Y29uZmxleCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpjb25mcHJpbnQoY29uc3QgY2hhciAqZXJyLCAuLi4pOworc3RhdGljIHZvaWQgemNvbmZfZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pOworc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpOworc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oc3RydWN0IGtjb25mX2lkICppZCwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbik7CisKK3N0cnVjdCBzeW1ib2wgKnN5bWJvbF9oYXNoWzI1N107CisKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51LCAqY3VycmVudF9lbnRyeTsKKworI2RlZmluZSBZWURFQlVHIDAKKyNpZiBZWURFQlVHCisjZGVmaW5lIFlZRVJST1JfVkVSQk9TRQorI2VuZGlmCisKKworLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KKyNpZm5kZWYgWVlERUJVRworIyBkZWZpbmUgWVlERUJVRyAwCisjZW5kaWYKKworLyogRW5hYmxpbmcgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gICovCisjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisjIHVuZGVmIFlZRVJST1JfVkVSQk9TRQorIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKKyNlbHNlCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKFlZU1RZUEUpICYmICEgZGVmaW5lZCAoWVlTVFlQRV9JU19ERUNMQVJFRCkKKwordHlwZWRlZiB1bmlvbiBZWVNUWVBFIHsKKwljaGFyICpzdHJpbmc7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBrY29uZl9pZCAqaWQ7Cit9IFlZU1RZUEU7CisvKiBMaW5lIDE5MCBvZiB5YWNjLmMuICAqLworCisjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCisjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjZW5kaWYKKworCisKKy8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisvKiBMaW5lIDIxMyBvZiB5YWNjLmMuICAqLworCisKKyNpZiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IFlZRVJST1JfVkVSQk9TRQorCisjIGlmbmRlZiBZWUZSRUUKKyMgIGRlZmluZSBZWUZSRUUgZnJlZQorIyBlbmRpZgorIyBpZm5kZWYgWVlNQUxMT0MKKyMgIGRlZmluZSBZWU1BTExPQyBtYWxsb2MKKyMgZW5kaWYKKworLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworCisjIGlmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgaWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWZkZWYgX19HTlVDX18KKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgWVlTVEFDS19BTExPQworICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAqLworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRShQdHIpIGRvIHsgLyogZW1wdHkgKi87IH0gd2hpbGUgKDApCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgIGVuZGlmCisjICBkZWZpbmUgWVlTVEFDS19BTExPQyBZWU1BTExPQworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBZWUZSRUUKKyMgZW5kaWYKKyNlbmRpZiAvKiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IFlZRVJST1JfVkVSQk9TRSAqLworCisKKyNpZiAoISBkZWZpbmVkICh5eW92ZXJmbG93KSBcCisgICAgICYmICghIGRlZmluZWQgKF9fY3BsdXNwbHVzKSBcCisJIHx8IChkZWZpbmVkIChZWVNUWVBFX0lTX1RSSVZJQUwpICYmIFlZU1RZUEVfSVNfVFJJVklBTCkpKQorCisvKiBBIHR5cGUgdGhhdCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbnkgc3RhY2sgbWVtYmVyLiAgKi8KK3VuaW9uIHl5YWxsb2MKK3sKKyAgc2hvcnQgaW50IHl5c3M7CisgIFlZU1RZUEUgeXl2czsKKyAgfTsKKworLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWElNVU0gKHNpemVvZiAodW5pb24geXlhbGxvYykgLSAxKQorCisvKiBUaGUgc2l6ZSBvZiBhbiBhcnJheSBsYXJnZSB0byBlbm91Z2ggdG8gaG9sZCBhbGwgc3RhY2tzLCBlYWNoIHdpdGgKKyAgIE4gZWxlbWVudHMuICAqLworIyBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCisgICAgICgoTikgKiAoc2l6ZW9mIChzaG9ydCBpbnQpICsgc2l6ZW9mIChZWVNUWVBFKSkJCQlcCisgICAgICArIFlZU1RBQ0tfR0FQX01BWElNVU0pCisKKy8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbworICAgbm90IG92ZXJsYXAuICAqLworIyBpZm5kZWYgWVlDT1BZCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgMSA8IF9fR05VQ19fCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpIFwKKyAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkJCVwKKyAgICAgIGRvCQkJCQlcCisJewkJCQkJXAorCSAgcmVnaXN0ZXIgWVlTSVpFX1QgeXlpOwkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFjaywgU3RhY2ssIHl5c2l6ZSk7CQkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2s7CQkJCQkJXAorCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKKwl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlICgwKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgeXlzaWduZWRfY2hhcjsKKyNlbHNlCisgICB0eXBlZGVmIHNob3J0IGludCB5eXNpZ25lZF9jaGFyOworI2VuZGlmCisKKy8qIFlZRklOQUwgLS0gU3RhdGUgbnVtYmVyIG9mIHRoZSB0ZXJtaW5hdGlvbiBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlGSU5BTCAgMworLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCisjZGVmaW5lIFlZTEFTVCAgIDI2NAorCisvKiBZWU5UT0tFTlMgLS0gTnVtYmVyIG9mIHRlcm1pbmFscy4gKi8KKyNkZWZpbmUgWVlOVE9LRU5TICAzNQorLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICovCisjZGVmaW5lIFlZTk5UUyAgNDIKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gKi8KKyNkZWZpbmUgWVlOUlVMRVMgIDEwNAorLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHN0YXRlcy4gKi8KKyNkZWZpbmUgWVlOU1RBVEVTICAxNzUKKworLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCisjZGVmaW5lIFlZVU5ERUZUT0sgIDIKKyNkZWZpbmUgWVlNQVhVVE9LICAgMjg5CisKKyNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKSAJCQkJCQlcCisgICgodW5zaWduZWQgaW50KSAoWVlYKSA8PSBZWU1BWFVUT0sgPyB5eXRyYW5zbGF0ZVtZWVhdIDogWVlVTkRFRlRPSykKKworLyogWVlUUkFOU0xBVEVbWVlMRVhdIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXRyYW5zbGF0ZVtdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwKKyAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAorICAgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQKK307CisKKyNpZiBZWURFQlVHCisvKiBZWVBSSFNbWVlOXSAtLSBJbmRleCBvZiB0aGUgZmlyc3QgUkhTIHN5bWJvbCBvZiBydWxlIG51bWJlciBZWU4gaW4KKyAgIFlZUkhTLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgeXlwcmhzW10gPQoreworICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDUsICAgICA2LCAgICAgOSwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMjMsCisgICAgICAyOCwgICAgMzMsICAgIDM3LCAgICAzOSwgICAgNDEsICAgIDQzLCAgICA0NSwgICAgNDcsICAgIDQ5LCAgICA1MSwKKyAgICAgIDUzLCAgICA1NSwgICAgNTcsICAgIDU5LCAgICA2MSwgICAgNjMsICAgIDY3LCAgICA3MCwgICAgNzQsICAgIDc3LAorICAgICAgODEsICAgIDg0LCAgICA4NSwgICAgODgsICAgIDkxLCAgICA5NCwgICAgOTcsICAgMTAwLCAgIDEwNCwgICAxMDksCisgICAgIDExNCwgICAxMTksICAgMTI1LCAgIDEyOCwgICAxMzEsICAgMTMzLCAgIDEzNywgICAxMzgsICAgMTQxLCAgIDE0NCwKKyAgICAgMTQ3LCAgIDE1MCwgICAxNTMsICAgMTU4LCAgIDE2MiwgICAxNjUsICAgMTcwLCAgIDE3MSwgICAxNzQsICAgMTc4LAorICAgICAxODAsICAgMTg0LCAgIDE4NSwgICAxODgsICAgMTkxLCAgIDE5NCwgICAxOTgsICAgMjAxLCAgIDIwMywgICAyMDcsCisgICAgIDIwOCwgICAyMTEsICAgMjE0LCAgIDIxNywgICAyMjEsICAgMjI1LCAgIDIyOCwgICAyMzEsICAgMjM0LCAgIDIzNSwKKyAgICAgMjM4LCAgIDI0MSwgICAyNDQsICAgMjQ5LCAgIDI1MywgICAyNTcsICAgMjU4LCAgIDI2MSwgICAyNjMsICAgMjY1LAorICAgICAyNjgsICAgMjcxLCAgIDI3NCwgICAyNzYsICAgMjc5LCAgIDI4MCwgICAyODMsICAgMjg1LCAgIDI4OSwgICAyOTMsCisgICAgIDI5NywgICAzMDAsICAgMzA0LCAgIDMwOCwgICAzMTAKK307CisKKy8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gKi8KK3N0YXRpYyBjb25zdCB5eXNpZ25lZF9jaGFyIHl5cmhzW10gPQoreworICAgICAgMzYsICAgICAwLCAgICAtMSwgICAgMzcsICAgIC0xLCAgICAtMSwgICAgMzcsICAgIDM5LCAgICAtMSwgICAgMzcsCisgICAgICA1MCwgICAgLTEsICAgIDM3LCAgICA2MSwgICAgLTEsICAgIDM3LCAgICAgMywgICAgNzEsICAgIDczLCAgICAtMSwKKyAgICAgIDM3LCAgICA3MiwgICAgLTEsICAgIDM3LCAgICAyNSwgICAgIDEsICAgIDMwLCAgICAtMSwgICAgMzcsICAgIDM4LAorICAgICAgIDEsICAgIDMwLCAgICAtMSwgICAgMzcsICAgICAxLCAgICAzMCwgICAgLTEsICAgIDE2LCAgICAtMSwgICAgMTksCisgICAgICAtMSwgICAgMjAsICAgIC0xLCAgICAyMiwgICAgLTEsICAgIDE4LCAgICAtMSwgICAgMjMsICAgIC0xLCAgICAyMSwKKyAgICAgIC0xLCAgICAzMCwgICAgLTEsICAgIDU2LCAgICAtMSwgICAgNjUsICAgIC0xLCAgICA0MiwgICAgLTEsICAgIDQ0LAorICAgICAgLTEsICAgIDYzLCAgICAtMSwgICAgMjUsICAgICAxLCAgICAzMCwgICAgLTEsICAgICAxLCAgICAzMCwgICAgLTEsCisgICAgICAxMCwgICAgMjUsICAgIDMwLCAgICAtMSwgICAgNDEsICAgIDQ1LCAgICAtMSwgICAgMTEsICAgIDI1LCAgICAzMCwKKyAgICAgIC0xLCAgICA0MywgICAgNDUsICAgIC0xLCAgICAtMSwgICAgNDUsICAgIDQ2LCAgICAtMSwgICAgNDUsICAgIDY5LAorICAgICAgLTEsICAgIDQ1LCAgICA2NywgICAgLTEsICAgIDQ1LCAgICA0MCwgICAgLTEsICAgIDQ1LCAgICAzMCwgICAgLTEsCisgICAgICAyMCwgICAgNzAsICAgIDMwLCAgICAtMSwgICAgMTksICAgIDcxLCAgICA3NCwgICAgMzAsICAgIC0xLCAgICAyMSwKKyAgICAgIDc1LCAgICA3NCwgICAgMzAsICAgIC0xLCAgICAyMiwgICAgMjUsICAgIDc0LCAgICAzMCwgICAgLTEsICAgIDIzLAorICAgICAgNzYsICAgIDc2LCAgICA3NCwgICAgMzAsICAgIC0xLCAgICAgNywgICAgMzAsICAgIC0xLCAgICA0NywgICAgNTEsCisgICAgICAtMSwgICAgNzIsICAgIC0xLCAgICA0OCwgICAgNTMsICAgIDQ5LCAgICAtMSwgICAgLTEsICAgIDUxLCAgICA1MiwKKyAgICAgIC0xLCAgICA1MSwgICAgNjksICAgIC0xLCAgICA1MSwgICAgNjcsICAgIC0xLCAgICA1MSwgICAgMzAsICAgIC0xLAorICAgICAgNTEsICAgIDQwLCAgICAtMSwgICAgMTksICAgIDcxLCAgICA3NCwgICAgMzAsICAgIC0xLCAgICAyMCwgICAgNzAsCisgICAgICAzMCwgICAgLTEsICAgIDE4LCAgICAzMCwgICAgLTEsICAgIDIxLCAgICAyNSwgICAgNzQsICAgIDMwLCAgICAtMSwKKyAgICAgIC0xLCAgICA1MywgICAgMzksICAgIC0xLCAgICAxNCwgICAgNzUsICAgIDczLCAgICAtMSwgICAgNzIsICAgIC0xLAorICAgICAgNTQsICAgIDU3LCAgICA1NSwgICAgLTEsICAgIC0xLCAgICA1NywgICAgMzksICAgIC0xLCAgICA1NywgICAgNjEsCisgICAgICAtMSwgICAgNTcsICAgIDUwLCAgICAtMSwgICAgIDQsICAgIDcxLCAgICAzMCwgICAgLTEsICAgIDU4LCAgICA2OCwKKyAgICAgIC0xLCAgICA3MiwgICAgLTEsICAgIDU5LCAgICA2MiwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgNjIsICAgIDM5LAorICAgICAgLTEsICAgIDYyLCAgICA2MSwgICAgLTEsICAgIDYyLCAgICA1MCwgICAgLTEsICAgICA2LCAgICA3MSwgICAgMzAsCisgICAgICAtMSwgICAgIDksICAgIDcxLCAgICAzMCwgICAgLTEsICAgIDY0LCAgICA2OCwgICAgLTEsICAgIDEyLCAgICAzMCwKKyAgICAgIC0xLCAgICA2NiwgICAgMTMsICAgIC0xLCAgICAtMSwgICAgNjgsICAgIDY5LCAgICAtMSwgICAgNjgsICAgIDMwLAorICAgICAgLTEsICAgIDY4LCAgICA0MCwgICAgLTEsICAgIDE2LCAgICAyNCwgICAgNzUsICAgIDMwLCAgICAtMSwgICAgMTYsCisgICAgICA3NSwgICAgMzAsICAgIC0xLCAgICAxNywgICAgNzUsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIDcxLCAgICA3NCwKKyAgICAgIC0xLCAgICAyNSwgICAgLTEsICAgIDI2LCAgICAtMSwgICAgIDUsICAgIDMwLCAgICAtMSwgICAgIDgsICAgIDMwLAorICAgICAgLTEsICAgIDE1LCAgICAzMCwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgNzMsICAgIDMwLCAgICAtMSwgICAgLTEsCisgICAgICAxNCwgICAgNzUsICAgIC0xLCAgICA3NiwgICAgLTEsICAgIDc2LCAgICAzMywgICAgNzYsICAgIC0xLCAgICA3NiwKKyAgICAgIDI3LCAgICA3NiwgICAgLTEsICAgIDI5LCAgICA3NSwgICAgMjgsICAgIC0xLCAgICAzNCwgICAgNzUsICAgIC0xLAorICAgICAgNzUsICAgIDMxLCAgICA3NSwgICAgLTEsICAgIDc1LCAgICAzMiwgICAgNzUsICAgIC0xLCAgICAyNSwgICAgLTEsCisgICAgICAyNiwgICAgLTEKK307CisKKy8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCB5eXJsaW5lW10gPQoreworICAgICAgIDAsICAgMTAzLCAgIDEwMywgICAxMDUsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsCisgICAgIDExMywgICAxMTcsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTIxLCAgIDEyMSwgICAxMjEsICAgMTIxLCAgIDEyNSwKKyAgICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTI5LCAgIDEzMCwgICAxMzQsICAgMTM1LCAgIDE0MSwgICAxNDksICAgMTU1LAorICAgICAxNjMsICAgMTczLCAgIDE3NSwgICAxNzYsICAgMTc3LCAgIDE3OCwgICAxNzksICAgMTgyLCAgIDE5MCwgICAxOTYsCisgICAgIDIwNiwgICAyMTIsICAgMjIwLCAgIDIyOSwgICAyMzQsICAgMjQyLCAgIDI0NSwgICAyNDcsICAgMjQ4LCAgIDI0OSwKKyAgICAgMjUwLCAgIDI1MSwgICAyNTQsICAgMjYwLCAgIDI3MSwgICAyNzcsICAgMjg3LCAgIDI4OSwgICAyOTQsICAgMzAyLAorICAgICAzMTAsICAgMzEzLCAgIDMxNSwgICAzMTYsICAgMzE3LCAgIDMyMiwgICAzMjksICAgMzM0LCAgIDM0MiwgICAzNDUsCisgICAgIDM0NywgICAzNDgsICAgMzQ5LCAgIDM1MiwgICAzNjAsICAgMzY3LCAgIDM3NCwgICAzODAsICAgMzg3LCAgIDM4OSwKKyAgICAgMzkwLCAgIDM5MSwgICAzOTQsICAgMzk5LCAgIDQwNCwgICA0MTIsICAgNDE0LCAgIDQxOSwgICA0MjAsICAgNDIzLAorICAgICA0MjQsICAgNDI1LCAgIDQyOSwgICA0MzAsICAgNDMzLCAgIDQzNCwgICA0MzcsICAgNDM4LCAgIDQzOSwgICA0NDAsCisgICAgIDQ0MSwgICA0NDIsICAgNDQzLCAgIDQ0NiwgICA0NDcKK307CisjZW5kaWYKKworI2lmIFlZREVCVUcgfHwgWVlFUlJPUl9WRVJCT1NFCisvKiBZWVROTUVbU1lNQk9MLU5VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHN5bWJvbCBTWU1CT0wtTlVNLgorICAgRmlyc3QsIHRoZSB0ZXJtaW5hbHMsIHRoZW4sIHN0YXJ0aW5nIGF0IFlZTlRPS0VOUywgbm9udGVybWluYWxzLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9Cit7CisgICIkZW5kIiwgImVycm9yIiwgIiR1bmRlZmluZWQiLCAiVF9NQUlOTUVOVSIsICJUX01FTlUiLCAiVF9FTkRNRU5VIiwKKyAgIlRfU09VUkNFIiwgIlRfQ0hPSUNFIiwgIlRfRU5EQ0hPSUNFIiwgIlRfQ09NTUVOVCIsICJUX0NPTkZJRyIsCisgICJUX01FTlVDT05GSUciLCAiVF9IRUxQIiwgIlRfSEVMUFRFWFQiLCAiVF9JRiIsICJUX0VORElGIiwgIlRfREVQRU5EUyIsCisgICJUX1JFUVVJUkVTIiwgIlRfT1BUSU9OQUwiLCAiVF9QUk9NUFQiLCAiVF9UWVBFIiwgIlRfREVGQVVMVCIsCisgICJUX1NFTEVDVCIsICJUX1JBTkdFIiwgIlRfT04iLCAiVF9XT1JEIiwgIlRfV09SRF9RVU9URSIsICJUX1VORVFVQUwiLAorICAiVF9DTE9TRV9QQVJFTiIsICJUX09QRU5fUEFSRU4iLCAiVF9FT0wiLCAiVF9PUiIsICJUX0FORCIsICJUX0VRVUFMIiwKKyAgIlRfTk9UIiwgIiRhY2NlcHQiLCAiaW5wdXQiLCAic3RtdF9saXN0IiwgIm9wdGlvbl9uYW1lIiwgImNvbW1vbl9zdG10IiwKKyAgIm9wdGlvbl9lcnJvciIsICJjb25maWdfZW50cnlfc3RhcnQiLCAiY29uZmlnX3N0bXQiLAorICAibWVudWNvbmZpZ19lbnRyeV9zdGFydCIsICJtZW51Y29uZmlnX3N0bXQiLCAiY29uZmlnX29wdGlvbl9saXN0IiwKKyAgImNvbmZpZ19vcHRpb24iLCAiY2hvaWNlIiwgImNob2ljZV9lbnRyeSIsICJjaG9pY2VfZW5kIiwgImNob2ljZV9zdG10IiwKKyAgImNob2ljZV9vcHRpb25fbGlzdCIsICJjaG9pY2Vfb3B0aW9uIiwgImNob2ljZV9ibG9jayIsICJpZl9lbnRyeSIsCisgICJpZl9lbmQiLCAiaWZfc3RtdCIsICJpZl9ibG9jayIsICJtZW51IiwgIm1lbnVfZW50cnkiLCAibWVudV9lbmQiLAorICAibWVudV9zdG10IiwgIm1lbnVfYmxvY2siLCAic291cmNlX3N0bXQiLCAiY29tbWVudCIsICJjb21tZW50X3N0bXQiLAorICAiaGVscF9zdGFydCIsICJoZWxwIiwgImRlcGVuZHNfbGlzdCIsICJkZXBlbmRzIiwgInByb21wdF9zdG10X29wdCIsCisgICJwcm9tcHQiLCAiZW5kIiwgIm5sIiwgImlmX2V4cHIiLCAiZXhwciIsICJzeW1ib2wiLCAwCit9OworI2VuZGlmCisKKyMgaWZkZWYgWVlQUklOVAorLyogWVlUT0tOVU1bWVlMRVgtTlVNXSAtLSBJbnRlcm5hbCB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bworICAgdG9rZW4gWVlMRVgtTlVNLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgeXl0b2tudW1bXSA9Cit7CisgICAgICAgMCwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYzLCAgIDI2NCwKKyAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgMjY4LCAgIDI2OSwgICAyNzAsICAgMjcxLCAgIDI3MiwgICAyNzMsICAgMjc0LAorICAgICAyNzUsICAgMjc2LCAgIDI3NywgICAyNzgsICAgMjc5LCAgIDI4MCwgICAyODEsICAgMjgyLCAgIDI4MywgICAyODQsCisgICAgIDI4NSwgICAyODYsICAgMjg3LCAgIDI4OCwgICAyODkKK307CisjIGVuZGlmCisKKy8qIFlZUjFbWVlOXSAtLSBTeW1ib2wgbnVtYmVyIG9mIHN5bWJvbCB0aGF0IHJ1bGUgWVlOIGRlcml2ZXMuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlyMVtdID0KK3sKKyAgICAgICAwLCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzNywgICAgMzcsICAgIDM3LCAgICAzNywgICAgMzcsICAgIDM3LAorICAgICAgMzcsICAgIDM3LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksCisgICAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDQwLCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKKyAgICAgIDQ0LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NiwgICAgNDYsICAgIDQ2LAorICAgICAgNDYsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUxLCAgICA1MSwgICAgNTEsCisgICAgICA1MSwgICAgNTEsICAgIDUyLCAgICA1MiwgICAgNTIsICAgIDUyLCAgICA1MywgICAgNTMsICAgIDU0LCAgICA1NSwKKyAgICAgIDU2LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLAorICAgICAgNjIsICAgIDYyLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjgsCisgICAgICA2OCwgICAgNjgsICAgIDY5LCAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MCwgICAgNzEsICAgIDcxLCAgICA3MiwKKyAgICAgIDcyLCAgICA3MiwgICAgNzMsICAgIDczLCAgICA3NCwgICAgNzQsICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc1LAorICAgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDc2Cit9OworCisvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXIyW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDQsCisgICAgICAgNCwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMywgICAgIDIsICAgICAzLAorICAgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDQsCisgICAgICAgNCwgICAgIDUsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDQsICAgICAzLCAgICAgMiwgICAgIDQsICAgICAwLCAgICAgMiwgICAgIDMsICAgICAxLAorICAgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMywgICAgIDAsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAwLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMywgICAgIDMsCisgICAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDEKK307CisKKy8qIFlZREVGQUNUW1NUQVRFLU5BTUVdIC0tIERlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZQorICAgU1RBVEUtTlVNIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCisgICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eWRlZmFjdFtdID0KK3sKKyAgICAgICAzLCAgICAgMCwgICAgIDAsICAgICAxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTIsICAgIDE2LCAgICAxMywgICAgMTQsCisgICAgICAxOCwgICAgMTUsICAgIDE3LCAgICAgMCwgICAgMTksICAgICAwLCAgICAgNCwgICAgMzEsICAgIDIyLCAgICAzMSwKKyAgICAgIDIzLCAgICA0NiwgICAgNTYsICAgICA1LCAgICA2MSwgICAgMjAsICAgIDc4LCAgICA2OSwgICAgIDYsICAgIDI0LAorICAgICAgNzgsICAgIDIxLCAgICAgOCwgICAgMTEsICAgIDg3LCAgICA4OCwgICAgIDAsICAgICAwLCAgICA4OSwgICAgIDAsCisgICAgICA0MiwgICAgOTAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTAzLCAgIDEwNCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgIDk2LCAgICA5MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICA5MiwgICAgIDcsICAgIDY1LCAgICA3MywgICAgNzQsICAgIDI3LCAgICAyOSwgICAgIDAsCisgICAgIDEwMCwgICAgIDAsICAgICAwLCAgICA1OCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgMTAsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgIDg1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzYsICAgIDM1LAorICAgICAgMzIsICAgICAwLCAgICAzNCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgODUsICAgICAwLCAgICA1MCwgICAgNTEsCisgICAgICA0NywgICAgNDksICAgIDQ4LCAgICA1NywgICAgNDUsICAgIDQ0LCAgICA2MiwgICAgNjQsICAgIDYwLCAgICA2MywKKyAgICAgIDU5LCAgICA4MCwgICAgODEsICAgIDc5LCAgICA3MCwgICAgNzIsICAgIDY4LCAgICA3MSwgICAgNjcsICAgIDkzLAorICAgICAgOTksICAgMTAxLCAgIDEwMiwgICAgOTgsICAgIDk3LCAgICAyNiwgICAgNzYsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICA5NCwgICAgIDAsICAgIDk0LCAgICA5NCwgICAgOTQsICAgICAwLCAgICAgMCwgICAgNzcsICAgIDU0LCAgICA5NCwKKyAgICAgICAwLCAgICA5NCwgICAgIDAsICAgIDgzLCAgICA4NCwgICAgIDAsICAgICAwLCAgICAzNywgICAgODYsICAgICAwLAorICAgICAgIDAsICAgIDk0LCAgICAyNSwgICAgIDAsICAgIDUzLCAgICAgMCwgICAgODIsICAgIDk1LCAgICAzOCwgICAgMzksCisgICAgICA0MCwgICAgIDAsICAgIDUyLCAgICA1NSwgICAgNDEKK307CisKKy8qIFlZREVGR09UT1tOVEVSTS1OVU1dLiAqLworc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWRlZmdvdG9bXSA9Cit7CisgICAgICAtMSwgICAgIDEsICAgICAyLCAgICAyNSwgICAgMjYsICAgIDk5LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwKKyAgICAgIDY0LCAgIDEwMCwgICAgMzEsICAgIDMyLCAgIDExNCwgICAgMzMsICAgIDY2LCAgIDExMCwgICAgNjcsICAgIDM0LAorICAgICAxMTgsICAgIDM1LCAgICA2OCwgICAgMzYsICAgIDM3LCAgIDEyNiwgICAgMzgsICAgIDcwLCAgICAzOSwgICAgNDAsCisgICAgICA0MSwgICAxMDEsICAgMTAyLCAgICA2OSwgICAxMDMsICAgMTQxLCAgIDE0MiwgICAgNDIsICAgIDczLCAgIDE1NiwKKyAgICAgIDU5LCAgICA2MAorfTsKKworLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCisgICBTVEFURS1OVU0uICAqLworI2RlZmluZSBZWVBBQ1RfTklORiAtNzgKK3N0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwYWN0W10gPQoreworICAgICAtNzgsICAgICAyLCAgIDE1OSwgICAtNzgsICAgLTIxLCAgICAgMCwgICAgIDAsICAgLTEyLCAgICAgMCwgICAgIDEsCisgICAgICAgNCwgICAgIDAsICAgIDI3LCAgICAzOCwgICAgNjAsICAgIDU4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgMTAwLCAgIC03OCwgICAxMDQsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAorICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCisgICAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICA4NiwgICAxMTMsICAgLTc4LCAgIDExNCwKKyAgICAgLTc4LCAgIC03OCwgICAxMjUsICAgMTI3LCAgIDEyOCwgICAtNzgsICAgLTc4LCAgICA2MCwgICAgNjAsICAgMjEwLAorICAgICAgNjUsICAgLTc4LCAgIDE0MSwgICAxNDIsICAgIDM5LCAgIDEwMywgICAxODIsICAgMjAwLCAgICAgNiwgICAgNjYsCisgICAgICAgNiwgICAxMzEsICAgLTc4LCAgIDE0NiwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIDE5NiwKKyAgICAgLTc4LCAgICA2MCwgICAgNjAsICAgMTQ2LCAgICA0MCwgICAgNDAsICAgLTc4LCAgIC03OCwgICAxNTUsICAgMTU2LAorICAgICAgLTIsICAgIDYwLCAgICAgMCwgICAgIDAsICAgIDYwLCAgIDEwNSwgICAgNDAsICAgMTk0LCAgIC03OCwgICAtNzgsCisgICAgIC03OCwgICAyMDYsICAgLTc4LCAgIC03OCwgICAxODMsICAgICAwLCAgICAgMCwgICAxOTUsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAorICAgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCisgICAgIC03OCwgICAxOTcsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAgNjAsICAgMjEzLCAgIDIxNiwKKyAgICAgMjEyLCAgIDIwMywgICAyMTIsICAgMTkwLCAgIDIxMiwgICAgNDAsICAgMjA4LCAgIC03OCwgICAtNzgsICAgMjEyLAorICAgICAyMjIsICAgMjEyLCAgIDIxOSwgICAtNzgsICAgLTc4LCAgICA2MCwgICAyMjMsICAgLTc4LCAgIC03OCwgICAyMjQsCisgICAgIDIyNSwgICAyMTIsICAgLTc4LCAgIDIyNiwgICAtNzgsICAgMjI3LCAgIC03OCwgICAgNDcsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIDIyOCwgICAtNzgsICAgLTc4LCAgIC03OAorfTsKKworLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KK3N0YXRpYyBjb25zdCBzaG9ydCBpbnQgeXlwZ290b1tdID0KK3sKKyAgICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgIDE2NCwgICAtMzYsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LAorICAgICAyMzAsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICAyOSwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsCisgICAgIC03OCwgICAtNzgsICAgLTc4LCAgIC03OCwgICAtNzgsICAgLTc4LCAgICA1OSwgICAtNzgsICAgLTc4LCAgIC03OCwKKyAgICAgLTc4LCAgIC03OCwgICAxOTgsICAgMjIwLCAgICAyNCwgICAxNTcsICAgIC01LCAgIDE2OSwgICAyMDIsICAgIDc0LAorICAgICAtNTMsICAgLTc3Cit9OworCisvKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKKyAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAorICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KKyAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KKyNkZWZpbmUgWVlUQUJMRV9OSU5GIC03Ngorc3RhdGljIGNvbnN0IHNob3J0IGludCB5eXRhYmxlW10gPQoreworICAgICAgNDYsICAgIDQ3LCAgICAgMywgICAgNDksICAgIDc5LCAgICA4MCwgICAgNTIsICAgMTMzLCAgIDEzNCwgICAgNDMsCisgICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDQ4LCAgIDE0NSwKKyAgICAgIDE0LCAgICAxNSwgICAxMzcsICAgIDU1LCAgICA1NiwgICAgNDQsICAgIDQ1LCAgICA1NywgICAxMzEsICAgMTMyLAorICAgICAxMDksICAgIDUwLCAgICA1OCwgICAxMjIsICAgIDUxLCAgIDEyMiwgICAgMjQsICAgMTM4LCAgIDEzOSwgICAtMjgsCisgICAgICA4OCwgICAxNDMsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwgICAtMjgsICAgLTI4LCAgIC0yOCwKKyAgICAgLTI4LCAgICA4OSwgICAgNTMsICAgLTI4LCAgIC0yOCwgICAgOTAsICAgIDkxLCAgIC0yOCwgICAgOTIsICAgIDkzLAorICAgICAgOTQsICAgIDk1LCAgICA5NiwgICAgNTQsICAgIDk3LCAgICA1NSwgICAgNTYsICAgIDg4LCAgIDE2MSwgICAgOTgsCisgICAgIC02NiwgICAtNjYsICAgLTY2LCAgIC02NiwgICAtNjYsICAgLTY2LCAgIC02NiwgICAtNjYsICAgIDgxLCAgICA4MiwKKyAgICAgLTY2LCAgIC02NiwgICAgOTAsICAgIDkxLCAgIDE1MiwgICAgNTUsICAgIDU2LCAgIDE0MCwgICAgNjEsICAgIDU3LAorICAgICAxMTIsICAgIDk3LCAgICA4NCwgICAxMjMsICAgIDU4LCAgIDEyMywgICAxMjEsICAgMTE3LCAgICA4NSwgICAxMjUsCisgICAgIDE0OSwgICAgNjIsICAgMTY3LCAgIC0zMCwgICAgODgsICAgIDYzLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwKKyAgICAgLTMwLCAgIC0zMCwgICAtMzAsICAgLTMwLCAgIC0zMCwgICAgODksICAgIDcyLCAgIC0zMCwgICAtMzAsICAgIDkwLAorICAgICAgOTEsICAgLTMwLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgMTE5LCAgICA5NywgICAxMjcsCisgICAgIDE0NCwgICAtNzUsICAgIDg4LCAgICA5OCwgICAtNzUsICAgLTc1LCAgIC03NSwgICAtNzUsICAgLTc1LCAgIC03NSwKKyAgICAgLTc1LCAgIC03NSwgICAtNzUsICAgIDc0LCAgICA3NSwgICAtNzUsICAgLTc1LCAgICA5MCwgICAgOTEsICAgLTc1LAorICAgICAtNzUsICAgLTc1LCAgIC03NSwgICAtNzUsICAgLTc1LCAgICA3NiwgICAgOTcsICAgIDc3LCAgICA3OCwgICAgLTIsCisgICAgICAgNCwgICAxMjEsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKKyAgICAgIDEzLCAgICA4NiwgICAgODcsICAgIDE0LCAgICAxNSwgICAgMTYsICAgMTI5LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgICAgMjAsICAgIDIxLCAgICAyMiwgICAgODgsICAgIDIzLCAgIDEzNSwgICAxMzYsICAgLTQzLCAgIC00MywgICAgMjQsCisgICAgIC00MywgICAtNDMsICAgLTQzLCAgIC00MywgICAgODksICAgMTQ2LCAgIC00MywgICAtNDMsICAgIDkwLCAgICA5MSwKKyAgICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMTA3LCAgIDE1NSwgICAgIDcsICAgICA4LCAgICA5NywgICAgMTAsICAgIDExLAorICAgICAgMTIsICAgIDEzLCAgIDEwOCwgICAxNDgsICAgIDE0LCAgICAxNSwgICAxNTgsICAgMTU5LCAgIDE2MCwgICAxNDcsCisgICAgIDE1MSwgICAgODEsICAgIDgyLCAgIDE2MywgICAxMzAsICAgMTY1LCAgIDE1NSwgICAgODEsICAgIDgyLCAgICA4MiwKKyAgICAgIDI0LCAgIDExMywgICAxMTYsICAgMTU3LCAgIDEyNCwgICAxNzEsICAgMTE1LCAgIDEyMCwgICAxNjIsICAgMTI4LAorICAgICAgNzIsICAgIDgxLCAgICA4MiwgICAxNTMsICAgIDgxLCAgICA4MiwgICAxNTQsICAgIDgxLCAgICA4MiwgICAxNjYsCisgICAgICA4MSwgICAgODIsICAgMTY0LCAgIDE2OCwgICAxNjksICAgMTcwLCAgIDE3MiwgICAxNzMsICAgMTc0LCAgICA2NSwKKyAgICAgIDcxLCAgICA4MywgICAgIDAsICAgMTUwLCAgIDExMQorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IGludCB5eWNoZWNrW10gPQoreworICAgICAgIDUsICAgICA2LCAgICAgMCwgICAgIDgsICAgIDU3LCAgICA1OCwgICAgMTEsICAgIDg0LCAgICA4NSwgICAgMzAsCisgICAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDMwLCAgICA5NiwKKyAgICAgIDE0LCAgICAxNSwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjUsICAgIDI2LCAgICAyOSwgICAgODEsICAgIDgyLAorICAgICAgNjYsICAgIDMwLCAgICAzNCwgICAgNjksICAgIDMwLCAgICA3MSwgICAgMzAsICAgIDkwLCAgICA5MSwgICAgIDAsCisgICAgICAgMSwgICAgOTQsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAxMiwgICAgMjUsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDI1LCAgICAyNSwgICAgMjYsICAgICAxLCAgIDE0NSwgICAgMzAsCisgICAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDMxLCAgICAzMiwKKyAgICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgIDEzNywgICAgMjUsICAgIDI2LCAgICA5MiwgICAgMzAsICAgIDI5LAorICAgICAgNjYsICAgIDI1LCAgICAyNywgICAgNjksICAgIDM0LCAgICA3MSwgICAgMzAsICAgIDY4LCAgICAzMywgICAgNzAsCisgICAgIDEwNSwgICAgIDEsICAgMTU1LCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwKKyAgICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDMwLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDY4LCAgICAyNSwgICAgNzAsCisgICAgICAyNSwgICAgIDAsICAgICAxLCAgICAzMCwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKKyAgICAgICA5LCAgICAxMCwgICAgMTEsICAgIDMwLCAgICAzMCwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAorICAgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAzMCwgICAgMjUsICAgIDMwLCAgICAzMCwgICAgIDAsCisgICAgICAgMSwgICAgMzAsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAzMCwgICAgMzAsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDMwLCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgIDEsICAgIDI1LCAgICAzMCwgICAgMzAsICAgICA1LCAgICAgNiwgICAgMzAsCisgICAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgICAxLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywKKyAgICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAxNCwgICAgIDUsICAgICA2LCAgICAyNSwgICAgIDgsICAgICA5LAorICAgICAgMTAsICAgIDExLCAgICAzMCwgICAgMzAsICAgIDE0LCAgICAxNSwgICAxNDIsICAgMTQzLCAgIDE0NCwgICAgMTMsCisgICAgICAyNSwgICAgMzEsICAgIDMyLCAgIDE0OSwgICAgMjgsICAgMTUxLCAgICAxNCwgICAgMzEsICAgIDMyLCAgICAzMiwKKyAgICAgIDMwLCAgICA2NywgICAgNjgsICAgIDMwLCAgICA3MCwgICAxNjEsICAgIDY3LCAgICA2OCwgICAgMzAsICAgIDcwLAorICAgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzAsCisgICAgICAzMSwgICAgMzIsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICAyOSwKKyAgICAgIDQwLCAgICA1OSwgICAgLTEsICAgMTA2LCAgICA2NgorfTsKKworLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlzdG9zW10gPQoreworICAgICAgIDAsICAgIDM2LCAgICAzNywgICAgIDAsICAgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsCisgICAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTgsICAgIDE5LCAgICAyMCwKKyAgICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI1LCAgICAzMCwgICAgMzgsICAgIDM5LCAgICA0MSwgICAgNDIsICAgIDQzLAorICAgICAgNDQsICAgIDQ3LCAgICA0OCwgICAgNTAsICAgIDU0LCAgICA1NiwgICAgNTgsICAgIDU5LCAgICA2MSwgICAgNjMsCisgICAgICA2NCwgICAgNjUsICAgIDcyLCAgICAzMCwgICAgMjUsICAgIDI2LCAgICA3MSwgICAgNzEsICAgIDMwLCAgICA3MSwKKyAgICAgIDMwLCAgICAzMCwgICAgNzEsICAgIDI1LCAgICAyNSwgICAgMjUsICAgIDI2LCAgICAyOSwgICAgMzQsICAgIDc1LAorICAgICAgNzYsICAgIDMwLCAgICAgMSwgICAgIDEsICAgIDQ1LCAgICA0NSwgICAgNTEsICAgIDUzLCAgICA1NywgICAgNjgsCisgICAgICA2MiwgICAgNjgsICAgIDMwLCAgICA3MywgICAgMzAsICAgIDMwLCAgICAzMCwgICAgMzAsICAgIDMwLCAgICA3NSwKKyAgICAgIDc1LCAgICAzMSwgICAgMzIsICAgIDczLCAgICAyNywgICAgMzMsICAgIDMwLCAgICAzMCwgICAgIDEsICAgIDEyLAorICAgICAgMTYsICAgIDE3LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI1LCAgICAzMCwgICAgNDAsCisgICAgICA0NiwgICAgNjYsICAgIDY3LCAgICA2OSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDMwLCAgICA0MCwKKyAgICAgIDUyLCAgICA2NywgICAgNjksICAgIDM5LCAgICA0OSwgICAgNzIsICAgIDM5LCAgICA1MCwgICAgNTUsICAgIDYxLAorICAgICAgNzIsICAgIDMwLCAgICA0MCwgICAgNjksICAgIDM5LCAgICA1MCwgICAgNjAsICAgIDYxLCAgICA3MiwgICAgMzAsCisgICAgICAyOCwgICAgNzUsICAgIDc1LCAgICA3NiwgICAgNzYsICAgIDMwLCAgICAzMCwgICAgMjQsICAgIDc1LCAgICA3NSwKKyAgICAgIDcxLCAgICA3MCwgICAgNzEsICAgIDc1LCAgICAyNSwgICAgNzYsICAgICAxLCAgICAxMywgICAgMzAsICAgIDcxLAorICAgICAgNzAsICAgIDI1LCAgICA3NSwgICAgMzAsICAgIDMwLCAgICAxNCwgICAgNzQsICAgIDMwLCAgICA3NCwgICAgNzQsCisgICAgICA3NCwgICAgNzYsICAgIDMwLCAgICA3NCwgICAgMzAsICAgIDc0LCAgICAzMCwgICAgNzUsICAgIDMwLCAgICAzMCwKKyAgICAgIDMwLCAgICA3NCwgICAgMzAsICAgIDMwLCAgICAzMAorfTsKKworI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKF9fU0laRV9UWVBFX18pCisjIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChzaXplX3QpCisjIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVuZGlmCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQorIyBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQorI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCisjZGVmaW5lIFlZRU1QVFkJCSgtMikKKyNkZWZpbmUgWVlFT0YJCTAKKworI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQJCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJyb3JsYWIKKworCisvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5CisgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgorICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorCisjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKKworI2RlZmluZSBZWUJBQ0tVUChUb2tlbiwgVmFsdWUpCQkJCQlcCitkbwkJCQkJCQkJXAorICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIHl5Y2hhciA9IChUb2tlbik7CQkJCQkJXAorICAgICAgeXlsdmFsID0gKFZhbHVlKTsJCQkJCQlcCisgICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKKyAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAorICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCisgICAgfQkJCQkJCQkJXAorICBlbHNlCQkJCQkJCQlcCisgICAgeyAJCQkJCQkJCVwKKyAgICAgIHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7XAorICAgICAgWVlFUlJPUjsJCQkJCQkJXAorICAgIH0JCQkJCQkJCVwKK3doaWxlICgwKQorCisKKyNkZWZpbmUgWVlURVJST1IJMQorI2RlZmluZSBZWUVSUkNPREUJMjU2CisKKworLyogWVlMTE9DX0RFRkFVTFQgLS0gU2V0IENVUlJFTlQgdG8gc3BhbiBmcm9tIFJIU1sxXSB0byBSSFNbTl0uCisgICBJZiBOIGlzIDAsIHRoZW4gc2V0IENVUlJFTlQgdG8gdGhlIGVtcHR5IGxvY2F0aW9uIHdoaWNoIGVuZHMKKyAgIHRoZSBwcmV2aW91cyBzeW1ib2w6IFJIU1swXSAoYWx3YXlzIGRlZmluZWQpLiAgKi8KKworI2RlZmluZSBZWVJIU0xPQyhSaHMsIEspICgoUmhzKVtLXSkKKyNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKKyMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJXAorICAgIGRvCQkJCQkJCQkJXAorICAgICAgaWYgKE4pCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKKwkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKKwkgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCisJICAoQ3VycmVudCkubGFzdF9jb2x1bW4gID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9jb2x1bW47CVwKKwl9CQkJCQkJCQlcCisgICAgICBlbHNlCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9CQlcCisJICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCisJICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCisJfQkJCQkJCQkJXAorICAgIHdoaWxlICgwKQorI2VuZGlmCisKKworLyogWVlfTE9DQVRJT05fUFJJTlQgLS0gUHJpbnQgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdHJlYW0uCisgICBUaGlzIG1hY3JvIHdhcyBub3QgbWFuZGF0ZWQgb3JpZ2luYWxseTogZGVmaW5lIG9ubHkgaWYgd2Uga25vdworICAgd2Ugd29uJ3QgYnJlYWsgdXNlciBjb2RlOiB3aGVuIHRoZXNlIGFyZSB0aGUgbG9jYXRpb25zIHdlIGtub3cuICAqLworCisjaWZuZGVmIFlZX0xPQ0FUSU9OX1BSSU5UCisjIGlmIFlZTFRZUEVfSVNfVFJJVklBTAorIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykJCQlcCisgICAgIGZwcmludGYgKEZpbGUsICIlZC4lZC0lZC4lZCIsCQkJXAorICAgICAgICAgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKKyAgICAgICAgICAgICAgKExvYykubGFzdF9saW5lLCAgKExvYykubGFzdF9jb2x1bW4pCisjIGVsc2UKKyMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpICgodm9pZCkgMCkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIFlZTEVYIC0tIGNhbGxpbmcgYHl5bGV4JyB3aXRoIHRoZSByaWdodCBhcmd1bWVudHMuICAqLworCisjaWZkZWYgWVlMRVhfUEFSQU0KKyMgZGVmaW5lIFlZTEVYIHl5bGV4IChZWUxFWF9QQVJBTSkKKyNlbHNlCisjIGRlZmluZSBZWUxFWCB5eWxleCAoKQorI2VuZGlmCisKKy8qIEVuYWJsZSBkZWJ1Z2dpbmcgaWYgcmVxdWVzdGVkLiAgKi8KKyNpZiBZWURFQlVHCisKKyMgaWZuZGVmIFlZRlBSSU5URgorIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgZGVmaW5lIFlZRlBSSU5URiBmcHJpbnRmCisjIGVuZGlmCisKKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQkJCVwKK2RvIHsJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJXAorICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCit9IHdoaWxlICgwKQorCisjIGRlZmluZSBZWV9TWU1CT0xfUFJJTlQoVGl0bGUsIFR5cGUsIFZhbHVlLCBMb2NhdGlvbikJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJXAorICAgICAgeXlzeW1wcmludCAoc3RkZXJyLCAJCQkJCVwKKyAgICAgICAgICAgICAgICAgIFR5cGUsIFZhbHVlKTsJXAorICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJXAorICAgIH0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eV9zdGFja19wcmludCAtLSBQcmludCB0aGUgc3RhdGUgc3RhY2sgZnJvbSBpdHMgQk9UVE9NIHVwIHRvIGl0cyB8Cit8IFRPUCAoaW5jbHVkZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorc3RhdGljIHZvaWQKK3l5X3N0YWNrX3ByaW50IChzaG9ydCBpbnQgKmJvdHRvbSwgc2hvcnQgaW50ICp0b3ApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N0YWNrX3ByaW50IChib3R0b20sIHRvcCkKKyAgICBzaG9ydCBpbnQgKmJvdHRvbTsKKyAgICBzaG9ydCBpbnQgKnRvcDsKKyNlbmRpZgoreworICBZWUZQUklOVEYgKHN0ZGVyciwgIlN0YWNrIG5vdyIpOworICBmb3IgKC8qIE5vdGhpbmcuICovOyBib3R0b20gPD0gdG9wOyArK2JvdHRvbSkKKyAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICpib3R0b20pOworICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7Cit9CisKKyMgZGVmaW5lIFlZX1NUQUNLX1BSSU5UKEJvdHRvbSwgVG9wKQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJCQlcCisgICAgeXlfc3RhY2tfcHJpbnQgKChCb3R0b20pLCAoVG9wKSk7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoaW50IHl5cnVsZSkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfcmVkdWNlX3ByaW50ICh5eXJ1bGUpCisgICAgaW50IHl5cnVsZTsKKyNlbmRpZgoreworICBpbnQgeXlpOworICB1bnNpZ25lZCBpbnQgeXlsbm8gPSB5eXJsaW5lW3l5cnVsZV07CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAldSksICIsCisgICAgICAgICAgICAgeXlydWxlIC0gMSwgeXlsbm8pOworICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KKyAgZm9yICh5eWkgPSB5eXByaHNbeXlydWxlXTsgMCA8PSB5eXJoc1t5eWldOyB5eWkrKykKKyAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWUgW3l5cmhzW3l5aV1dKTsKKyAgWVlGUFJJTlRGIChzdGRlcnIsICItPiAlc1xuIiwgeXl0bmFtZSBbeXlyMVt5eXJ1bGVdXSk7Cit9CisKKyMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQkJXAorZG8gewkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJXAorICAgIHl5X3JlZHVjZV9wcmludCAoUnVsZSk7CQlcCit9IHdoaWxlICgwKQorCisvKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKKyAgIG11bHRpcGxlIHBhcnNlcnMgY2FuIGNvZXhpc3QuICAqLworaW50IHl5ZGVidWc7CisjZWxzZSAvKiAhWVlERUJVRyAqLworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCisjIGRlZmluZSBZWV9TWU1CT0xfUFJJTlQoVGl0bGUsIFR5cGUsIFZhbHVlLCBMb2NhdGlvbikKKyMgZGVmaW5lIFlZX1NUQUNLX1BSSU5UKEJvdHRvbSwgVG9wKQorIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCisjZW5kaWYgLyogIVlZREVCVUcgKi8KKworCisvKiBZWUlOSVRERVBUSCAtLSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcy4gICovCisjaWZuZGVmCVlZSU5JVERFUFRICisjIGRlZmluZSBZWUlOSVRERVBUSCAyMDAKKyNlbmRpZgorCisvKiBZWU1BWERFUFRIIC0tIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvIChlZmZlY3RpdmUgb25seQorICAgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuCisKKyAgIERvIG5vdCBtYWtlIHRoaXMgdmFsdWUgdG9vIGxhcmdlOyB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmCisgICBTSVpFX01BWCA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCisgICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KKworI2lmbmRlZiBZWU1BWERFUFRICisjIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCisjZW5kaWYKKworDAorCisjaWYgWVlFUlJPUl9WRVJCT1NFCisKKyMgaWZuZGVmIHl5c3RybGVuCisjICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkKKyMgICBkZWZpbmUgeXlzdHJsZW4gc3RybGVuCisjICBlbHNlCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBZWVNUUi4gICovCitzdGF0aWMgWVlTSVpFX1QKKyMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit5eXN0cmxlbiAoY29uc3QgY2hhciAqeXlzdHIpCisjICAgZWxzZQoreXlzdHJsZW4gKHl5c3RyKQorICAgICBjb25zdCBjaGFyICp5eXN0cjsKKyMgICBlbmRpZgoreworICByZWdpc3RlciBjb25zdCBjaGFyICp5eXMgPSB5eXN0cjsKKworICB3aGlsZSAoKnl5cysrICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5cyAtIHl5c3RyIC0gMTsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIHl5c3RwY3B5CisjICBpZiBkZWZpbmVkIChfX0dMSUJDX18pICYmIGRlZmluZWQgKF9TVFJJTkdfSCkgJiYgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpCisjICAgZGVmaW5lIHl5c3RwY3B5IHN0cGNweQorIyAgZWxzZQorLyogQ29weSBZWVNSQyB0byBZWURFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgdGVybWluYXRpbmcgJ1wwJyBpbgorICAgWVlERVNULiAgKi8KK3N0YXRpYyBjaGFyICoKKyMgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit5eXN0cGNweSAoY2hhciAqeXlkZXN0LCBjb25zdCBjaGFyICp5eXNyYykKKyMgICBlbHNlCit5eXN0cGNweSAoeXlkZXN0LCB5eXNyYykKKyAgICAgY2hhciAqeXlkZXN0OworICAgICBjb25zdCBjaGFyICp5eXNyYzsKKyMgICBlbmRpZgoreworICByZWdpc3RlciBjaGFyICp5eWQgPSB5eWRlc3Q7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOworCisgIHdoaWxlICgoKnl5ZCsrID0gKnl5cysrKSAhPSAnXDAnKQorICAgIGNvbnRpbnVlOworCisgIHJldHVybiB5eWQgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworI2VuZGlmIC8qICFZWUVSUk9SX1ZFUkJPU0UgKi8KKworDAorCisjaWYgWVlERUJVRworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorc3RhdGljIHZvaWQKK3l5c3ltcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlzeW1wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCisgICAgRklMRSAqeXlvdXRwdXQ7CisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFICp5eXZhbHVlcDsKKyNlbmRpZgoreworICAvKiBQYWNpZnkgYGB1bnVzZWQgdmFyaWFibGUnJyB3YXJuaW5ncy4gICovCisgICh2b2lkKSB5eXZhbHVlcDsKKworICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJ0b2tlbiAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKyAgZWxzZQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKworCisjIGlmZGVmIFlZUFJJTlQKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKKyMgZW5kaWYKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOworfQorCisjZW5kaWYgLyogISBZWURFQlVHICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBSZWxlYXNlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byB0aGlzIHN5bWJvbC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBjb25zdCBjaGFyICp5eW1zZzsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgKnl5dmFsdWVwOworI2VuZGlmCit7CisgIC8qIFBhY2lmeSBgYHVudXNlZCB2YXJpYWJsZScnIHdhcm5pbmdzLiAgKi8KKyAgKHZvaWQpIHl5dmFsdWVwOworCisgIGlmICgheXltc2cpCisgICAgeXltc2cgPSAiRGVsZXRpbmciOworICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7CisKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgY2FzZSA0ODogLyogY2hvaWNlX2VudHJ5ICovCisKKyAgICAgICAgeworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IG1pc3NpbmcgZW5kIHN0YXRlbWVudCBmb3IgdGhpcyBlbnRyeVxuIiwKKwkJKHl5dmFsdWVwLT5tZW51KS0+ZmlsZS0+bmFtZSwgKHl5dmFsdWVwLT5tZW51KS0+bGluZW5vKTsKKwlpZiAoY3VycmVudF9tZW51ID09ICh5eXZhbHVlcC0+bWVudSkpCisJCW1lbnVfZW5kX21lbnUoKTsKK307CisKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU0OiAvKiBpZl9lbnRyeSAqLworCisgICAgICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBtaXNzaW5nIGVuZCBzdGF0ZW1lbnQgZm9yIHRoaXMgZW50cnlcbiIsCisJCSh5eXZhbHVlcC0+bWVudSktPmZpbGUtPm5hbWUsICh5eXZhbHVlcC0+bWVudSktPmxpbmVubyk7CisJaWYgKGN1cnJlbnRfbWVudSA9PSAoeXl2YWx1ZXAtPm1lbnUpKQorCQltZW51X2VuZF9tZW51KCk7Cit9OworCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OTogLyogbWVudV9lbnRyeSAqLworCisgICAgICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBtaXNzaW5nIGVuZCBzdGF0ZW1lbnQgZm9yIHRoaXMgZW50cnlcbiIsCisJCSh5eXZhbHVlcC0+bWVudSktPmZpbGUtPm5hbWUsICh5eXZhbHVlcC0+bWVudSktPmxpbmVubyk7CisJaWYgKGN1cnJlbnRfbWVudSA9PSAoeXl2YWx1ZXAtPm1lbnUpKQorCQltZW51X2VuZF9tZW51KCk7Cit9OworCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisMCisKKy8qIFByZXZlbnQgd2FybmluZ3MgZnJvbSAtV21pc3NpbmctcHJvdG90eXBlcy4gICovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKTsKKyMgZWxzZQoraW50IHl5cGFyc2UgKCk7CisjIGVuZGlmCisjZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitpbnQgeXlwYXJzZSAodm9pZCk7CisjZWxzZQoraW50IHl5cGFyc2UgKCk7CisjZW5kaWYKKyNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKworCisKKy8qIFRoZSBsb29rLWFoZWFkIHN5bWJvbC4gICovCitpbnQgeXljaGFyOworCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KK1lZU1RZUEUgeXlsdmFsOworCisvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLworaW50IHl5bmVycnM7CisKKworCisvKi0tLS0tLS0tLS0uCit8IHl5cGFyc2UuICB8CitgLS0tLS0tLS0tLSovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKQorIyBlbHNlCitpbnQgeXlwYXJzZSAoWVlQQVJTRV9QQVJBTSkKKyAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyMgZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludAoreXlwYXJzZSAodm9pZCkKKyNlbHNlCitpbnQKK3l5cGFyc2UgKCkKKworI2VuZGlmCisjZW5kaWYKK3sKKworICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKKyAgcmVnaXN0ZXIgaW50IHl5bjsKKyAgaW50IHl5cmVzdWx0OworICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKyAgaW50IHl5ZXJyc3RhdHVzOworICAvKiBMb29rLWFoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLworICBpbnQgeXl0b2tlbiA9IDA7CisKKyAgLyogVGhyZWUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKKyAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcywKKyAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKKyAgICAgYHl5bHMnOiByZWxhdGVkIHRvIGxvY2F0aW9ucy4KKworICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocm91Z2ggc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKyAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCisKKyAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgc2hvcnQgaW50IHl5c3NhW1lZSU5JVERFUFRIXTsKKyAgc2hvcnQgaW50ICp5eXNzID0geXlzc2E7CisgIHJlZ2lzdGVyIHNob3J0IGludCAqeXlzc3A7CisKKyAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CisgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKKyAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7CisKKworCisjZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKKworICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCisgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCisgIFlZU1RZUEUgeXl2YWw7CisKKworICAvKiBXaGVuIHJlZHVjaW5nLCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZAorICAgICBydWxlLiAgKi8KKyAgaW50IHl5bGVuOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKworICB5eXNzcCA9IHl5c3M7CisgIHl5dnNwID0geXl2czsKKworCisgIHl5dnNwWzBdID0geXlsdmFsOworCisgIGdvdG8geXlzZXRzdGF0ZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5bmV3c3RhdGUgLS0gUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4geXlzdGF0ZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIHl5bmV3c3RhdGU6CisgIC8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCisgICAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4KKyAgICAgKi8KKyAgeXlzc3ArKzsKKworIHl5c2V0c3RhdGU6CisgICp5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCisgICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOworCisjaWZkZWYgeXlvdmVyZmxvdworICAgICAgeworCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gVXNlIGNvcGllcyBvZgorCSAgIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8KKwkgICBtZW1vcnkuICAqLworCVlZU1RZUEUgKnl5dnMxID0geXl2czsKKwlzaG9ydCBpbnQgKnl5c3MxID0geXlzczsKKworCisJLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCisJICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQorCSAgIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywgYnV0IHRoYXQgbWlnaHQKKwkgICBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisKKwl5eXNzID0geXlzczE7CisJeXl2cyA9IHl5dnMxOworICAgICAgfQorI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLworIyBpZm5kZWYgWVlTVEFDS19SRUxPQ0FURQorICAgICAgZ290byB5eW92ZXJmbG93bGFiOworIyBlbHNlCisgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KKyAgICAgIGlmIChZWU1BWERFUFRIIDw9IHl5c3RhY2tzaXplKQorCWdvdG8geXlvdmVyZmxvd2xhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXNob3J0IGludCAqeXlzczEgPSB5eXNzOworCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KKwkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CisJaWYgKCEgeXlwdHIpCisJICBnb3RvIHl5b3ZlcmZsb3dsYWI7CisJWVlTVEFDS19SRUxPQ0FURSAoeXlzcyk7CisJWVlTVEFDS19SRUxPQ0FURSAoeXl2cyk7CisKKyMgIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKwlpZiAoeXlzczEgIT0geXlzc2EpCisJICBZWVNUQUNLX0ZSRUUgKHl5c3MxKTsKKyAgICAgIH0KKyMgZW5kaWYKKyNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCisKKyAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyB5eXNpemUgLSAxOworCisKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVsdVxuIiwKKwkJICAodW5zaWduZWQgbG9uZykgeXlzdGFja3NpemUpKTsKKworICAgICAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisJWVlBQk9SVDsKKyAgICB9CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKKworICBnb3RvIHl5YmFja3VwOworCisvKi0tLS0tLS0tLS0tLgorfCB5eWJhY2t1cC4gIHwKK2AtLS0tLS0tLS0tLSovCit5eWJhY2t1cDoKKworLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCisvKiBSZWFkIGEgbG9vay1haGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9vay1haGVhZCB0b2tlbi4gICovCisKKyAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rLWFoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOworICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIGlmICh5eWNoYXIgPD0gWVlFT0YpCisgICAgeworICAgICAgeXljaGFyID0geXl0b2tlbiA9IFlZRU9GOworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisgICAgICBZWV9TWU1CT0xfUFJJTlQgKCJOZXh0IHRva2VuIGlzIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisgICAgfQorCisgIC8qIElmIHRoZSBwcm9wZXIgYWN0aW9uIG9uIHNlZWluZyB0b2tlbiBZWVRPS0VOIGlzIHRvIHJlZHVjZSBvciB0bworICAgICBkZXRlY3QgYW4gZXJyb3IsIHRha2UgdGhhdCBhY3Rpb24uICAqLworICB5eW4gKz0geXl0b2tlbjsKKyAgaWYgKHl5biA8IDAgfHwgWVlMQVNUIDwgeXluIHx8IHl5Y2hlY2tbeXluXSAhPSB5eXRva2VuKQorICAgIGdvdG8geXlkZWZhdWx0OworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPD0gMCkKKyAgICB7CisgICAgICBpZiAoeXluID09IDAgfHwgeXluID09IFlZVEFCTEVfTklORikKKwlnb3RvIHl5ZXJybGFiOworICAgICAgeXluID0gLXl5bjsKKyAgICAgIGdvdG8geXlyZWR1Y2U7CisgICAgfQorCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICAvKiBTaGlmdCB0aGUgbG9vay1haGVhZCB0b2tlbi4gICovCisgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisKKyAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KKyAgaWYgKHl5Y2hhciAhPSBZWUVPRikKKyAgICB5eWNoYXIgPSBZWUVNUFRZOworCisgICorK3l5dnNwID0geXlsdmFsOworCisKKyAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgorICAgICBzdGF0dXMuICAqLworICBpZiAoeXllcnJzdGF0dXMpCisgICAgeXllcnJzdGF0dXMtLTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlkZWZhdWx0OgorICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisgIGdvdG8geXlyZWR1Y2U7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlyZWR1Y2U6CisgIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCisgIHl5bGVuID0geXlyMlt5eW5dOworCisgIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgorICAgICBgJCQgPSAkMScuCisKKyAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byBnYXJiYWdlLgorICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKworICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7CisgIHN3aXRjaCAoeXluKQorICAgIHsKKyAgICAgICAgY2FzZSA4OgorCisgICAgeyB6Y29uZl9lcnJvcigidW5leHBlY3RlZCBlbmQgc3RhdGVtZW50Iik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OgorCisgICAgeyB6Y29uZl9lcnJvcigidW5rbm93biBzdGF0ZW1lbnQgXCIlc1wiIiwgKHl5dnNwWy0yXS5zdHJpbmcpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwOgorCisgICAgeworCXpjb25mX2Vycm9yKCJ1bmV4cGVjdGVkIG9wdGlvbiBcIiVzXCIiLCBrY29uZl9pZF9zdHJpbmdzICsgKHl5dnNwWy0yXS5pZCktPm5hbWUpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDExOgorCisgICAgeyB6Y29uZl9lcnJvcigiaW52YWxpZCBzdGF0ZW1lbnQiKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI1OgorCisgICAgeyB6Y29uZl9lcnJvcigidW5rbm93biBvcHRpb24gXCIlc1wiIiwgKHl5dnNwWy0yXS5zdHJpbmcpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI2OgorCisgICAgeyB6Y29uZl9lcnJvcigiaW52YWxpZCBvcHRpb24iKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI3OgorCisgICAgeworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoKHl5dnNwWy0xXS5zdHJpbmcpLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgKHl5dnNwWy0xXS5zdHJpbmcpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyODoKKworICAgIHsKKwltZW51X2VuZF9lbnRyeSgpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNvbmZpZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjk6CisKKyAgICB7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cCgoeXl2c3BbLTFdLnN0cmluZyksIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudWNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgKHl5dnNwWy0xXS5zdHJpbmcpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMDoKKworICAgIHsKKwlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQorCQljdXJyZW50X2VudHJ5LT5wcm9tcHQtPnR5cGUgPSBQX01FTlU7CisJZWxzZQorCQl6Y29uZnByaW50KCJ3YXJuaW5nOiBtZW51Y29uZmlnIHN0YXRlbWVudCB3aXRob3V0IHByb21wdCIpOworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNzoKKworICAgIHsKKwltZW51X3NldF90eXBlKCh5eXZzcFstMl0uaWQpLT5zdHlwZSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6dHlwZSgldSlcbiIsCisJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksCisJCSh5eXZzcFstMl0uaWQpLT5zdHlwZSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzg6CisKKyAgICB7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAoeXl2c3BbLTJdLnN0cmluZyksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzk6CisKKyAgICB7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsICh5eXZzcFstMl0uZXhwciksICh5eXZzcFstMV0uZXhwcikpOworCWlmICgoeXl2c3BbLTNdLmlkKS0+c3R5cGUgIT0gU19VTktOT1dOKQorCQltZW51X3NldF90eXBlKCh5eXZzcFstM10uaWQpLT5zdHlwZSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmYXVsdCgldSlcbiIsCisJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksCisJCSh5eXZzcFstM10uaWQpLT5zdHlwZSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDA6CisKKyAgICB7CisJbWVudV9hZGRfc3ltYm9sKFBfU0VMRUNULCBzeW1fbG9va3VwKCh5eXZzcFstMl0uc3RyaW5nKSwgMCksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNlbGVjdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDE6CisKKyAgICB7CisJbWVudV9hZGRfZXhwcihQX1JBTkdFLCBleHByX2FsbG9jX2NvbXAoRV9SQU5HRSwoeXl2c3BbLTNdLnN5bWJvbCksICh5eXZzcFstMl0uc3ltYm9sKSksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnJhbmdlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MjoKKworICAgIHsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKE5VTEwsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIT0lDRTsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCW1lbnVfYWRkX2V4cHIoUF9DSE9JQ0UsIE5VTEwsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDM6CisKKyAgICB7CisJKHl5dmFsLm1lbnUpID0gbWVudV9hZGRfbWVudSgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDQ0OgorCisgICAgeworCWlmICh6Y29uZl9lbmR0b2tlbigoeXl2c3BbMF0uaWQpLCBUX0NIT0lDRSwgVF9FTkRDSE9JQ0UpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY2hvaWNlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTI6CisKKyAgICB7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAoeXl2c3BbLTJdLnN0cmluZyksICh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTM6CisKKyAgICB7CisJaWYgKCh5eXZzcFstMl0uaWQpLT5zdHlwZSA9PSBTX0JPT0xFQU4gfHwgKHl5dnNwWy0yXS5pZCktPnN0eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJbWVudV9zZXRfdHlwZSgoeXl2c3BbLTJdLmlkKS0+c3R5cGUpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0eXBlKCV1KVxuIiwKKwkJCXpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksCisJCQkoeXl2c3BbLTJdLmlkKS0+c3R5cGUpOworCX0gZWxzZQorCQlZWUVSUk9SOworO30KKyAgICBicmVhazsKKworICBjYXNlIDU0OgorCisgICAgeworCWN1cnJlbnRfZW50cnktPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm9wdGlvbmFsXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1NToKKworICAgIHsKKwlpZiAoKHl5dnNwWy0zXS5pZCktPnN0eXBlID09IFNfVU5LTk9XTikgeworCQltZW51X2FkZF9zeW1ib2woUF9ERUZBVUxULCBzeW1fbG9va3VwKCh5eXZzcFstMl0uc3RyaW5nKSwgMCksICh5eXZzcFstMV0uZXhwcikpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0XG4iLAorCQkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfSBlbHNlCisJCVlZRVJST1I7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTg6CisKKyAgICB7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aWZcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX2RlcCgoeXl2c3BbLTFdLmV4cHIpKTsKKwkoeXl2YWwubWVudSkgPSBtZW51X2FkZF9tZW51KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTk6CisKKyAgICB7CisJaWYgKHpjb25mX2VuZHRva2VuKCh5eXZzcFswXS5pZCksIFRfSUYsIFRfRU5ESUYpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kaWZcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2NToKKworICAgIHsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAoeXl2c3BbLTFdLnN0cmluZyksIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm1lbnVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDY2OgorCisgICAgeworCSh5eXZhbC5tZW51KSA9IG1lbnVfYWRkX21lbnUoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2NzoKKworICAgIHsKKwlpZiAoemNvbmZfZW5kdG9rZW4oKHl5dnNwWzBdLmlkKSwgVF9NRU5VLCBUX0VORE1FTlUpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kbWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorO30KKyAgICBicmVhazsKKworICBjYXNlIDczOgorCisgICAgeworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNvdXJjZSAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgKHl5dnNwWy0xXS5zdHJpbmcpKTsKKwl6Y29uZl9uZXh0ZmlsZSgoeXl2c3BbLTFdLnN0cmluZykpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDc0OgorCisgICAgeworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX3Byb21wdChQX0NPTU1FTlQsICh5eXZzcFstMV0uc3RyaW5nKSwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29tbWVudFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzU6CisKKyAgICB7CisJbWVudV9lbmRfZW50cnkoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NjoKKworICAgIHsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpoZWxwXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl6Y29uZl9zdGFydGhlbHAoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NzoKKworICAgIHsKKwljdXJyZW50X2VudHJ5LT5zeW0tPmhlbHAgPSAoeXl2c3BbMF0uc3RyaW5nKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4MjoKKworICAgIHsKKwltZW51X2FkZF9kZXAoKHl5dnNwWy0xXS5leHByKSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVwZW5kcyBvblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODM6CisKKyAgICB7CisJbWVudV9hZGRfZGVwKCh5eXZzcFstMV0uZXhwcikpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDg0OgorCisgICAgeworCW1lbnVfYWRkX2RlcCgoeXl2c3BbLTFdLmV4cHIpKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpyZXF1aXJlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODY6CisKKyAgICB7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAoeXl2c3BbLTFdLnN0cmluZyksICh5eXZzcFswXS5leHByKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODk6CisKKyAgICB7ICh5eXZhbC5pZCkgPSAoeXl2c3BbLTFdLmlkKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDkwOgorCisgICAgeyAoeXl2YWwuaWQpID0gKHl5dnNwWy0xXS5pZCk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MToKKworICAgIHsgKHl5dmFsLmlkKSA9ICh5eXZzcFstMV0uaWQpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTQ6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IE5VTEw7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NToKKworICAgIHsgKHl5dmFsLmV4cHIpID0gKHl5dnNwWzBdLmV4cHIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTY6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCh5eXZzcFswXS5zeW1ib2wpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk3OgorCisgICAgeyAoeXl2YWwuZXhwcikgPSBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgKHl5dnNwWy0yXS5zeW1ib2wpLCAoeXl2c3BbMF0uc3ltYm9sKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5ODoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgKHl5dnNwWy0yXS5zeW1ib2wpLCAoeXl2c3BbMF0uc3ltYm9sKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OToKKworICAgIHsgKHl5dmFsLmV4cHIpID0gKHl5dnNwWy0xXS5leHByKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMDoKKworICAgIHsgKHl5dmFsLmV4cHIpID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsICh5eXZzcFswXS5leHByKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDE6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfdHdvKEVfT1IsICh5eXZzcFstMl0uZXhwciksICh5eXZzcFswXS5leHByKSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDI6CisKKyAgICB7ICh5eXZhbC5leHByKSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCAoeXl2c3BbLTJdLmV4cHIpLCAoeXl2c3BbMF0uZXhwcikpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAzOgorCisgICAgeyAoeXl2YWwuc3ltYm9sKSA9IHN5bV9sb29rdXAoKHl5dnNwWzBdLnN0cmluZyksIDApOyBmcmVlKCh5eXZzcFswXS5zdHJpbmcpKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNDoKKworICAgIHsgKHl5dmFsLnN5bWJvbCkgPSBzeW1fbG9va3VwKCh5eXZzcFswXS5zdHJpbmcpLCAxKTsgZnJlZSgoeXl2c3BbMF0uc3RyaW5nKSk7IDt9CisgICAgYnJlYWs7CisKKworICAgIH0KKworLyogTGluZSAxMDM3IG9mIHlhY2MuYy4gICovCisKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworCisKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVE9LRU5TXSArICp5eXNzcDsKKyAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWI6CisgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworICBpZiAoIXl5ZXJyc3RhdHVzKQorICAgIHsKKyAgICAgICsreXluZXJyczsKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8IFlZTEFTVCkKKwl7CisJICBZWVNJWkVfVCB5eXNpemUgPSAwOworCSAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworCSAgY29uc3QgY2hhciogeXlwcmVmaXg7CisJICBjaGFyICp5eW1zZzsKKwkgIGludCB5eXg7CisKKwkgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKwkgICAgIFlZQ0hFQ0suICAqLworCSAgaW50IHl5eGJlZ2luID0geXluIDwgMCA/IC15eW4gOiAwOworCisJICAvKiBTdGF5IHdpdGhpbiBib3VuZHMgb2YgYm90aCB5eWNoZWNrIGFuZCB5eXRuYW1lLiAgKi8KKwkgIGludCB5eWNoZWNrbGltID0gWVlMQVNUIC0geXluOworCSAgaW50IHl5eGVuZCA9IHl5Y2hlY2tsaW0gPCBZWU5UT0tFTlMgPyB5eWNoZWNrbGltIDogWVlOVE9LRU5TOworCSAgaW50IHl5Y291bnQgPSAwOworCisJICB5eXByZWZpeCA9ICIsIGV4cGVjdGluZyAiOworCSAgZm9yICh5eXggPSB5eXhiZWdpbjsgeXl4IDwgeXl4ZW5kOyArK3l5eCkKKwkgICAgaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXggJiYgeXl4ICE9IFlZVEVSUk9SKQorCSAgICAgIHsKKwkJeXlzaXplICs9IHl5c3RybGVuICh5eXByZWZpeCkgKyB5eXN0cmxlbiAoeXl0bmFtZSBbeXl4XSk7CisJCXl5Y291bnQgKz0gMTsKKwkJaWYgKHl5Y291bnQgPT0gNSkKKwkJICB7CisJCSAgICB5eXNpemUgPSAwOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgIHl5c2l6ZSArPSAoc2l6ZW9mICgic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICIpCisJCSAgICAgKyB5eXN0cmxlbiAoeXl0bmFtZVt5eXR5cGVdKSk7CisJICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5c2l6ZSk7CisJICBpZiAoeXltc2cgIT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKnl5cCA9IHl5c3RwY3B5ICh5eW1zZywgInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAiKTsKKwkgICAgICB5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5dHlwZV0pOworCisJICAgICAgaWYgKHl5Y291bnQgPCA1KQorCQl7CisJCSAgeXlwcmVmaXggPSAiLCBleHBlY3RpbmcgIjsKKwkJICBmb3IgKHl5eCA9IHl5eGJlZ2luOyB5eXggPCB5eXhlbmQ7ICsreXl4KQorCQkgICAgaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXggJiYgeXl4ICE9IFlZVEVSUk9SKQorCQkgICAgICB7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXByZWZpeCk7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5eF0pOworCQkJeXlwcmVmaXggPSAiIG9yICI7CisJCSAgICAgIH0KKwkJfQorCSAgICAgIHl5ZXJyb3IgKHl5bXNnKTsKKwkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB5eWVycm9yICgic3ludGF4IGVycm9yOyBhbHNvIHZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KKwl5eWVycm9yICgic3ludGF4IGVycm9yIik7CisgICAgfQorCisKKworICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9vay1haGVhZCB0b2tlbiBhZnRlciBhbgorCSBlcnJvciwgZGlzY2FyZCBpdC4gICovCisKKyAgICAgIGlmICh5eWNoYXIgPD0gWVlFT0YpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiBhdCBlbmQgb2YgaW5wdXQsIHBvcCB0aGUgZXJyb3IgdG9rZW4sCisJICAgICB0aGVuIHRoZSByZXN0IG9mIHRoZSBzdGFjaywgdGhlbiByZXR1cm4gZmFpbHVyZS4gICovCisJICBpZiAoeXljaGFyID09IFlZRU9GKQorCSAgICAgZm9yICg7OykKKwkgICAgICAgeworCisJCSBZWVBPUFNUQUNLOworCQkgaWYgKHl5c3NwID09IHl5c3MpCisJCSAgIFlZQUJPUlQ7CisJCSB5eWRlc3RydWN0ICgiRXJyb3I6IHBvcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOworCSAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICB5eWRlc3RydWN0ICgiRXJyb3I6IGRpc2NhcmRpbmciLCB5eXRva2VuLCAmeXlsdmFsKTsKKwkgIHl5Y2hhciA9IFlZRU1QVFk7CisJfQorICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJyb3JsYWIgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgWVlFUlJPUi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJvcmxhYjoKKworI2lmZGVmIF9fR05VQ19fCisgIC8qIFBhY2lmeSBHQ0Mgd2hlbiB0aGUgdXNlciBjb2RlIG5ldmVyIGludm9rZXMgWVlFUlJPUiBhbmQgdGhlIGxhYmVsCisgICAgIHl5ZXJyb3JsYWIgdGhlcmVmb3JlIG5ldmVyIGFwcGVhcnMgaW4gdXNlciBjb2RlLiAgKi8KKyAgaWYgKDApCisgICAgIGdvdG8geXllcnJvcmxhYjsKKyNlbmRpZgorCit5eXZzcCAtPSB5eWxlbjsKKyAgeXlzc3AgLT0geXlsZW47CisgIHl5c3RhdGUgPSAqeXlzc3A7CisgIGdvdG8geXllcnJsYWIxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIxIC0tIGNvbW1vbiBjb2RlIGZvciBib3RoIHN5bnRheCBlcnJvciBhbmQgWVlFUlJPUi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiMToKKyAgeXllcnJzdGF0dXMgPSAzOwkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMuICAqLworCisgIGZvciAoOzspCisgICAgeworICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICAgICAgaWYgKHl5biAhPSBZWVBBQ1RfTklORikKKwl7CisJICB5eW4gKz0gWVlURVJST1I7CisJICBpZiAoMCA8PSB5eW4gJiYgeXluIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5bl0gPT0gWVlURVJST1IpCisJICAgIHsKKwkgICAgICB5eW4gPSB5eXRhYmxlW3l5bl07CisJICAgICAgaWYgKDAgPCB5eW4pCisJCWJyZWFrOworCSAgICB9CisJfQorCisgICAgICAvKiBQb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbi4gICovCisgICAgICBpZiAoeXlzc3AgPT0geXlzcykKKwlZWUFCT1JUOworCisKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOworICAgICAgWVlQT1BTVEFDSzsKKyAgICAgIHl5c3RhdGUgPSAqeXlzc3A7CisgICAgICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworICAgIH0KKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisKKworICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICovCisgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXlzdG9zW3l5bl0sIHl5dnNwLCB5eWxzcCk7CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhY2NlcHRsYWIgLS0gWVlBQ0NFUFQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWNjZXB0bGFiOgorICB5eXJlc3VsdCA9IDA7CisgIGdvdG8geXlyZXR1cm47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWJvcnRsYWIgLS0gWVlBQk9SVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWJvcnRsYWI6CisgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyBsb29rYWhlYWQiLAorICAgICAgICAgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKKyAgeXljaGFyID0gWVlFTVBUWTsKKyAgeXlyZXN1bHQgPSAxOworICBnb3RvIHl5cmV0dXJuOworCisjaWZuZGVmIHl5b3ZlcmZsb3cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlvdmVyZmxvd2xhYiAtLSBwYXJzZXIgb3ZlcmZsb3cgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5b3ZlcmZsb3dsYWI6CisgIHl5ZXJyb3IgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKKyAgeXlyZXN1bHQgPSAyOworICAvKiBGYWxsIHRocm91Z2guICAqLworI2VuZGlmCisKK3l5cmV0dXJuOgorI2lmbmRlZiB5eW92ZXJmbG93CisgIGlmICh5eXNzICE9IHl5c3NhKQorICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7CisjZW5kaWYKKyAgcmV0dXJuIHl5cmVzdWx0OworfQorCisKKworCisKK3ZvaWQgY29uZl9wYXJzZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCXpjb25mX2luaXRzY2FuKG5hbWUpOworCisJc3ltX2luaXQoKTsKKwltZW51X2luaXQoKTsKKwltb2R1bGVzX3N5bSA9IHN5bV9sb29rdXAoIk1PRFVMRVMiLCAwKTsKKwlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAiQnVzeWJveCBDb25maWd1cmF0aW9uIiwgTlVMTCk7CisKKyNpZiBZWURFQlVHCisJaWYgKGdldGVudigiWkNPTkZfREVCVUciKSkKKwkJemNvbmZkZWJ1ZyA9IDE7CisjZW5kaWYKKwl6Y29uZnBhcnNlKCk7CisJaWYgKHpjb25mbmVycnMpCisJCWV4aXQoMSk7CisJbWVudV9maW5hbGl6ZSgmcm9vdG1lbnUpOworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltX2NoZWNrX2RlcHMoc3ltKTsKKyAgICAgICAgfQorCisJc3ltX2NoYW5nZV9jb3VudCA9IDE7Cit9CisKK2NvbnN0IGNoYXIgKnpjb25mX3Rva2VubmFtZShpbnQgdG9rZW4pCit7CisJc3dpdGNoICh0b2tlbikgeworCWNhc2UgVF9NRU5VOgkJcmV0dXJuICJtZW51IjsKKwljYXNlIFRfRU5ETUVOVToJCXJldHVybiAiZW5kbWVudSI7CisJY2FzZSBUX0NIT0lDRToJCXJldHVybiAiY2hvaWNlIjsKKwljYXNlIFRfRU5EQ0hPSUNFOglyZXR1cm4gImVuZGNob2ljZSI7CisJY2FzZSBUX0lGOgkJcmV0dXJuICJpZiI7CisJY2FzZSBUX0VORElGOgkJcmV0dXJuICJlbmRpZiI7CisJY2FzZSBUX0RFUEVORFM6CQlyZXR1cm4gImRlcGVuZHMiOworCX0KKwlyZXR1cm4gIjx0b2tlbj4iOworfQorCitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihzdHJ1Y3Qga2NvbmZfaWQgKmlkLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKQoreworCWlmIChpZC0+dG9rZW4gIT0gZW5kdG9rZW4pIHsKKwkJemNvbmZfZXJyb3IoInVuZXhwZWN0ZWQgJyVzJyB3aXRoaW4gJXMgYmxvY2siLAorCQkJa2NvbmZfaWRfc3RyaW5ncyArIGlkLT5uYW1lLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGN1cnJlbnRfbWVudS0+ZmlsZSAhPSBjdXJyZW50X2ZpbGUpIHsKKwkJemNvbmZfZXJyb3IoIiclcycgaW4gZGlmZmVyZW50IGZpbGUgdGhhbiAnJXMnIiwKKwkJCWtjb25mX2lkX3N0cmluZ3MgKyBpZC0+bmFtZSwgemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczolZDogbG9jYXRpb24gb2YgdGhlICclcydcbiIsCisJCQljdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vLAorCQkJemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJemNvbmZuZXJycysrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB6Y29uZnByaW50KGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAiLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl2YV9zdGFydChhcCwgZXJyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgYXApOworCXZhX2VuZChhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9lcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJemNvbmZuZXJycysrOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCXZhX3N0YXJ0KGFwLCBlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mZXJyb3IoY29uc3QgY2hhciAqZXJyKQoreworI2lmIFlZREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSArIDEsIGVycik7CisjZW5kaWYKK30KKwordm9pZCBwcmludF9xdW90ZWRfc3RyaW5nKEZJTEUgKm91dCwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGxlbjsKKworCXB1dGMoJyInLCBvdXQpOworCXdoaWxlICgocCA9IHN0cmNocihzdHIsICciJykpKSB7CisJCWxlbiA9IHAgLSBzdHI7CisJCWlmIChsZW4pCisJCQlmcHJpbnRmKG91dCwgIiUuKnMiLCBsZW4sIHN0cik7CisJCWZwdXRzKCJcXFwiIiwgb3V0KTsKKwkJc3RyID0gcCArIDE7CisJfQorCWZwdXRzKHN0ciwgb3V0KTsKKwlwdXRjKCciJywgb3V0KTsKK30KKwordm9pZCBwcmludF9zeW1ib2woRklMRSAqb3V0LCBzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJZnByaW50ZihvdXQsICJjaG9pY2VcbiIpOworCWVsc2UKKwkJZnByaW50ZihvdXQsICJjb25maWcgJXNcbiIsIHN5bS0+bmFtZSk7CisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJZnB1dHMoIiAgYm9vbGVhblxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1RSSVNUQVRFOgorCQlmcHV0cygiICB0cmlzdGF0ZVxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwkJZnB1dHMoIiAgc3RyaW5nXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCQlmcHV0cygiICBpbnRlZ2VyXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQlmcHV0cygiICBoZXhcbiIsIG91dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwdXRzKCIgID8/P1xuIiwgb3V0KTsKKwkJYnJlYWs7CisJfQorCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX1BST01QVDoKKwkJCWZwdXRzKCIgIHByb21wdCAiLCBvdXQpOworCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlmcHV0cyggIiAgZGVmYXVsdCAiLCBvdXQpOworCQkJZXhwcl9mcHJpbnQocHJvcC0+ZXhwciwgb3V0KTsKKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgaWYgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQl9CisJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgUF9DSE9JQ0U6CisJCQlmcHV0cygiICAjY2hvaWNlIHZhbHVlXG4iLCBvdXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKG91dCwgIiAgdW5rbm93biBwcm9wICVkIVxuIiwgcHJvcC0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoc3ltLT5oZWxwKSB7CisJCWludCBsZW4gPSBzdHJsZW4oc3ltLT5oZWxwKTsKKwkJd2hpbGUgKHN5bS0+aGVscFstLWxlbl0gPT0gJ1xuJykKKwkJCXN5bS0+aGVscFtsZW5dID0gMDsKKwkJZnByaW50ZihvdXQsICIgIGhlbHBcbiVzXG4iLCBzeW0tPmhlbHApOworCX0KKwlmcHV0YygnXG4nLCBvdXQpOworfQorCit2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCWlmICgoc3ltID0gbWVudS0+c3ltKSkKKwkJCXByaW50X3N5bWJvbChvdXQsIG1lbnUpOworCQllbHNlIGlmICgocHJvcCA9IG1lbnUtPnByb21wdCkpIHsKKwkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJY2FzZSBQX0NPTU1FTlQ6CisJCQkJZnB1dHMoIlxuY29tbWVudCAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBQX01FTlU6CisJCQkJZnB1dHMoIlxubWVudSAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiICBkZXBlbmRzICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJCWZwdXRjKCdcbicsIG91dCk7CisJCQl9CisJCQlmcHV0cygiXG4iLCBvdXQpOworCQl9CisKKwkJaWYgKG1lbnUtPmxpc3QpCisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJZWxzZSBpZiAobWVudS0+bmV4dCkKKwkJCW1lbnUgPSBtZW51LT5uZXh0OworCQllbHNlIHdoaWxlICgobWVudSA9IG1lbnUtPnBhcmVudCkpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQgJiYgbWVudS0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkKKwkJCQlmcHV0cygiXG5lbmRtZW51XG4iLCBvdXQpOworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2luY2x1ZGUgImxleC56Y29uZi5jIgorI2luY2x1ZGUgInV0aWwuYyIKKyNpbmNsdWRlICJjb25mZGF0YS5jIgorI2luY2x1ZGUgImV4cHIuYyIKKyNpbmNsdWRlICJzeW1ib2wuYyIKKyNpbmNsdWRlICJtZW51LmMiCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYueSBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjVlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQpAQCAtMCwwICsxLDY4MyBAQAorJXsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBwcmludGQobWFzaywgZm10Li4uKSBpZiAoY2RlYnVnICYgKG1hc2spKSBwcmludGYoZm10KQorCisjZGVmaW5lIFBSSU5URAkJMHgwMDAxCisjZGVmaW5lIERFQlVHX1BBUlNFCTB4MDAwMgorCitpbnQgY2RlYnVnID0gUFJJTlREOworCitleHRlcm4gaW50IHpjb25mbGV4KHZvaWQpOworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLik7CitzdGF0aWMgdm9pZCB6Y29uZl9lcnJvcihjb25zdCBjaGFyICplcnIsIC4uLik7CitzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycik7CitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihzdHJ1Y3Qga2NvbmZfaWQgKmlkLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKTsKKworc3RydWN0IHN5bWJvbCAqc3ltYm9sX2hhc2hbMjU3XTsKKworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50X21lbnUsICpjdXJyZW50X2VudHJ5OworCisjZGVmaW5lIFlZREVCVUcgMAorI2lmIFlZREVCVUcKKyNkZWZpbmUgWVlFUlJPUl9WRVJCT1NFCisjZW5kaWYKKyV9CislZXhwZWN0IDI2CisKKyV1bmlvbgoreworCWNoYXIgKnN0cmluZzsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJc3RydWN0IGtjb25mX2lkICppZDsKK30KKworJXRva2VuIDxpZD5UX01BSU5NRU5VCisldG9rZW4gPGlkPlRfTUVOVQorJXRva2VuIDxpZD5UX0VORE1FTlUKKyV0b2tlbiA8aWQ+VF9TT1VSQ0UKKyV0b2tlbiA8aWQ+VF9DSE9JQ0UKKyV0b2tlbiA8aWQ+VF9FTkRDSE9JQ0UKKyV0b2tlbiA8aWQ+VF9DT01NRU5UCisldG9rZW4gPGlkPlRfQ09ORklHCisldG9rZW4gPGlkPlRfTUVOVUNPTkZJRworJXRva2VuIDxpZD5UX0hFTFAKKyV0b2tlbiA8c3RyaW5nPiBUX0hFTFBURVhUCisldG9rZW4gPGlkPlRfSUYKKyV0b2tlbiA8aWQ+VF9FTkRJRgorJXRva2VuIDxpZD5UX0RFUEVORFMKKyV0b2tlbiA8aWQ+VF9SRVFVSVJFUworJXRva2VuIDxpZD5UX09QVElPTkFMCisldG9rZW4gPGlkPlRfUFJPTVBUCisldG9rZW4gPGlkPlRfVFlQRQorJXRva2VuIDxpZD5UX0RFRkFVTFQKKyV0b2tlbiA8aWQ+VF9TRUxFQ1QKKyV0b2tlbiA8aWQ+VF9SQU5HRQorJXRva2VuIDxpZD5UX09OCisldG9rZW4gPHN0cmluZz4gVF9XT1JECisldG9rZW4gPHN0cmluZz4gVF9XT1JEX1FVT1RFCisldG9rZW4gVF9VTkVRVUFMCisldG9rZW4gVF9DTE9TRV9QQVJFTgorJXRva2VuIFRfT1BFTl9QQVJFTgorJXRva2VuIFRfRU9MCisKKyVsZWZ0IFRfT1IKKyVsZWZ0IFRfQU5ECislbGVmdCBUX0VRVUFMIFRfVU5FUVVBTAorJW5vbmFzc29jIFRfTk9UCisKKyV0eXBlIDxzdHJpbmc+IHByb21wdAorJXR5cGUgPHN5bWJvbD4gc3ltYm9sCisldHlwZSA8ZXhwcj4gZXhwcgorJXR5cGUgPGV4cHI+IGlmX2V4cHIKKyV0eXBlIDxpZD4gZW5kCisldHlwZSA8aWQ+IG9wdGlvbl9uYW1lCisldHlwZSA8bWVudT4gaWZfZW50cnkgbWVudV9lbnRyeSBjaG9pY2VfZW50cnkKKworJWRlc3RydWN0b3IgeworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IG1pc3NpbmcgZW5kIHN0YXRlbWVudCBmb3IgdGhpcyBlbnRyeVxuIiwKKwkJJCQtPmZpbGUtPm5hbWUsICQkLT5saW5lbm8pOworCWlmIChjdXJyZW50X21lbnUgPT0gJCQpCisJCW1lbnVfZW5kX21lbnUoKTsKK30gaWZfZW50cnkgbWVudV9lbnRyeSBjaG9pY2VfZW50cnkKKworJXsKKyNpbmNsdWRlICJ6Y29uZi5oYXNoLmMiCislfQorCislJQoraW5wdXQ6IHN0bXRfbGlzdDsKKworc3RtdF9saXN0OgorCSAgLyogZW1wdHkgKi8KKwl8IHN0bXRfbGlzdCBjb21tb25fc3RtdAorCXwgc3RtdF9saXN0IGNob2ljZV9zdG10CisJfCBzdG10X2xpc3QgbWVudV9zdG10CisJfCBzdG10X2xpc3QgVF9NQUlOTUVOVSBwcm9tcHQgbmwKKwl8IHN0bXRfbGlzdCBlbmQJCQl7IHpjb25mX2Vycm9yKCJ1bmV4cGVjdGVkIGVuZCBzdGF0ZW1lbnQiKTsgfQorCXwgc3RtdF9saXN0IFRfV09SRCBlcnJvciBUX0VPTAl7IHpjb25mX2Vycm9yKCJ1bmtub3duIHN0YXRlbWVudCBcIiVzXCIiLCAkMik7IH0KKwl8IHN0bXRfbGlzdCBvcHRpb25fbmFtZSBlcnJvciBUX0VPTAoreworCXpjb25mX2Vycm9yKCJ1bmV4cGVjdGVkIG9wdGlvbiBcIiVzXCIiLCBrY29uZl9pZF9zdHJpbmdzICsgJDItPm5hbWUpOworfQorCXwgc3RtdF9saXN0IGVycm9yIFRfRU9MCQl7IHpjb25mX2Vycm9yKCJpbnZhbGlkIHN0YXRlbWVudCIpOyB9Cis7CisKK29wdGlvbl9uYW1lOgorCVRfREVQRU5EUyB8IFRfUFJPTVBUIHwgVF9UWVBFIHwgVF9TRUxFQ1QgfCBUX09QVElPTkFMIHwgVF9SQU5HRSB8IFRfREVGQVVMVAorOworCitjb21tb25fc3RtdDoKKwkgIFRfRU9MCisJfCBpZl9zdG10CisJfCBjb21tZW50X3N0bXQKKwl8IGNvbmZpZ19zdG10CisJfCBtZW51Y29uZmlnX3N0bXQKKwl8IHNvdXJjZV9zdG10Cis7CisKK29wdGlvbl9lcnJvcjoKKwkgIFRfV09SRCBlcnJvciBUX0VPTAkJeyB6Y29uZl9lcnJvcigidW5rbm93biBvcHRpb24gXCIlc1wiIiwgJDEpOyB9CisJfCBlcnJvciBUX0VPTAkJCXsgemNvbmZfZXJyb3IoImludmFsaWQgb3B0aW9uIik7IH0KKzsKKworCisvKiBjb25maWcvbWVudWNvbmZpZyBlbnRyeSAqLworCitjb25maWdfZW50cnlfc3RhcnQ6IFRfQ09ORklHIFRfV09SRCBUX0VPTAoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoJDIsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29uZmlnICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAkMik7Cit9OworCitjb25maWdfc3RtdDogY29uZmlnX2VudHJ5X3N0YXJ0IGNvbmZpZ19vcHRpb25fbGlzdAoreworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK21lbnVjb25maWdfZW50cnlfc3RhcnQ6IFRfTUVOVUNPTkZJRyBUX1dPUkQgVF9FT0wKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKCQyLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm1lbnVjb25maWcgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksICQyKTsKK307CisKK21lbnVjb25maWdfc3RtdDogbWVudWNvbmZpZ19lbnRyeV9zdGFydCBjb25maWdfb3B0aW9uX2xpc3QKK3sKKwlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQorCQljdXJyZW50X2VudHJ5LT5wcm9tcHQtPnR5cGUgPSBQX01FTlU7CisJZWxzZQorCQl6Y29uZnByaW50KCJ3YXJuaW5nOiBtZW51Y29uZmlnIHN0YXRlbWVudCB3aXRob3V0IHByb21wdCIpOworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb25fbGlzdDoKKwkgIC8qIGVtcHR5ICovCisJfCBjb25maWdfb3B0aW9uX2xpc3QgY29uZmlnX29wdGlvbgorCXwgY29uZmlnX29wdGlvbl9saXN0IGRlcGVuZHMKKwl8IGNvbmZpZ19vcHRpb25fbGlzdCBoZWxwCisJfCBjb25maWdfb3B0aW9uX2xpc3Qgb3B0aW9uX2Vycm9yCisJfCBjb25maWdfb3B0aW9uX2xpc3QgVF9FT0wKKzsKKworY29uZmlnX29wdGlvbjogVF9UWVBFIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCW1lbnVfc2V0X3R5cGUoJDEtPnN0eXBlKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0eXBlKCV1KVxuIiwKKwkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwKKwkJJDEtPnN0eXBlKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfUFJPTVBUIHByb21wdCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAkMiwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX0RFRkFVTFQgZXhwciBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsICQyLCAkMyk7CisJaWYgKCQxLT5zdHlwZSAhPSBTX1VOS05PV04pCisJCW1lbnVfc2V0X3R5cGUoJDEtPnN0eXBlKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0KCV1KVxuIiwKKwkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwKKwkJJDEtPnN0eXBlKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfU0VMRUNUIFRfV09SRCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfc3ltYm9sKFBfU0VMRUNULCBzeW1fbG9va3VwKCQyLCAwKSwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNlbGVjdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX1JBTkdFIHN5bWJvbCBzeW1ib2wgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2V4cHIoUF9SQU5HRSwgZXhwcl9hbGxvY19jb21wKEVfUkFOR0UsJDIsICQzKSwgJDQpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnJhbmdlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKKy8qIGNob2ljZSBlbnRyeSAqLworCitjaG9pY2U6IFRfQ0hPSUNFIFRfRU9MCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cChOVUxMLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSE9JQ0U7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwltZW51X2FkZF9leHByKFBfQ0hPSUNFLCBOVUxMLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjaG9pY2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY2hvaWNlX2VudHJ5OiBjaG9pY2UgY2hvaWNlX29wdGlvbl9saXN0Cit7CisJJCQgPSBtZW51X2FkZF9tZW51KCk7Cit9OworCitjaG9pY2VfZW5kOiBlbmQKK3sKKwlpZiAoemNvbmZfZW5kdG9rZW4oJDEsIFRfQ0hPSUNFLCBUX0VORENIT0lDRSkpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjaG9pY2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KK307CisKK2Nob2ljZV9zdG10OiBjaG9pY2VfZW50cnkgY2hvaWNlX2Jsb2NrIGNob2ljZV9lbmQKKzsKKworY2hvaWNlX29wdGlvbl9saXN0OgorCSAgLyogZW1wdHkgKi8KKwl8IGNob2ljZV9vcHRpb25fbGlzdCBjaG9pY2Vfb3B0aW9uCisJfCBjaG9pY2Vfb3B0aW9uX2xpc3QgZGVwZW5kcworCXwgY2hvaWNlX29wdGlvbl9saXN0IGhlbHAKKwl8IGNob2ljZV9vcHRpb25fbGlzdCBUX0VPTAorCXwgY2hvaWNlX29wdGlvbl9saXN0IG9wdGlvbl9lcnJvcgorOworCitjaG9pY2Vfb3B0aW9uOiBUX1BST01QVCBwcm9tcHQgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgJDIsICQzKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpwcm9tcHRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY2hvaWNlX29wdGlvbjogVF9UWVBFIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCWlmICgkMS0+c3R5cGUgPT0gU19CT09MRUFOIHx8ICQxLT5zdHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCW1lbnVfc2V0X3R5cGUoJDEtPnN0eXBlKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6dHlwZSgldSlcbiIsCisJCQl6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLAorCQkJJDEtPnN0eXBlKTsKKwl9IGVsc2UKKwkJWVlFUlJPUjsKK307CisKK2Nob2ljZV9vcHRpb246IFRfT1BUSU9OQUwgVF9FT0wKK3sKKwljdXJyZW50X2VudHJ5LT5zeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpvcHRpb25hbFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2Vfb3B0aW9uOiBUX0RFRkFVTFQgVF9XT1JEIGlmX2V4cHIgVF9FT0wKK3sKKwlpZiAoJDEtPnN0eXBlID09IFNfVU5LTk9XTikgeworCQltZW51X2FkZF9zeW1ib2woUF9ERUZBVUxULCBzeW1fbG9va3VwKCQyLCAwKSwgJDMpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0XG4iLAorCQkJemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfSBlbHNlCisJCVlZRVJST1I7Cit9OworCitjaG9pY2VfYmxvY2s6CisJICAvKiBlbXB0eSAqLworCXwgY2hvaWNlX2Jsb2NrIGNvbW1vbl9zdG10Cis7CisKKy8qIGlmIGVudHJ5ICovCisKK2lmX2VudHJ5OiBUX0lGIGV4cHIgbmwKK3sKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDppZlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfZGVwKCQyKTsKKwkkJCA9IG1lbnVfYWRkX21lbnUoKTsKK307CisKK2lmX2VuZDogZW5kCit7CisJaWYgKHpjb25mX2VuZHRva2VuKCQxLCBUX0lGLCBUX0VORElGKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cit9OworCitpZl9zdG10OiBpZl9lbnRyeSBpZl9ibG9jayBpZl9lbmQKKzsKKworaWZfYmxvY2s6CisJICAvKiBlbXB0eSAqLworCXwgaWZfYmxvY2sgY29tbW9uX3N0bXQKKwl8IGlmX2Jsb2NrIG1lbnVfc3RtdAorCXwgaWZfYmxvY2sgY2hvaWNlX3N0bXQKKzsKKworLyogbWVudSBlbnRyeSAqLworCittZW51OiBUX01FTlUgcHJvbXB0IFRfRU9MCit7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvbXB0KFBfTUVOVSwgJDIsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm1lbnVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworbWVudV9lbnRyeTogbWVudSBkZXBlbmRzX2xpc3QKK3sKKwkkJCA9IG1lbnVfYWRkX21lbnUoKTsKK307CisKK21lbnVfZW5kOiBlbmQKK3sKKwlpZiAoemNvbmZfZW5kdG9rZW4oJDEsIFRfTUVOVSwgVF9FTkRNRU5VKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZG1lbnVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KK307CisKK21lbnVfc3RtdDogbWVudV9lbnRyeSBtZW51X2Jsb2NrIG1lbnVfZW5kCis7CisKK21lbnVfYmxvY2s6CisJICAvKiBlbXB0eSAqLworCXwgbWVudV9ibG9jayBjb21tb25fc3RtdAorCXwgbWVudV9ibG9jayBtZW51X3N0bXQKKwl8IG1lbnVfYmxvY2sgY2hvaWNlX3N0bXQKKzsKKworc291cmNlX3N0bXQ6IFRfU09VUkNFIHByb21wdCBUX0VPTAoreworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNvdXJjZSAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgJDIpOworCXpjb25mX25leHRmaWxlKCQyKTsKK307CisKKy8qIGNvbW1lbnQgZW50cnkgKi8KKworY29tbWVudDogVF9DT01NRU5UIHByb21wdCBUX0VPTAoreworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX3Byb21wdChQX0NPTU1FTlQsICQyLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjb21tZW50XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbW1lbnRfc3RtdDogY29tbWVudCBkZXBlbmRzX2xpc3QKK3sKKwltZW51X2VuZF9lbnRyeSgpOworfTsKKworLyogaGVscCBvcHRpb24gKi8KKworaGVscF9zdGFydDogVF9IRUxQIFRfRU9MCit7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGVscFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJemNvbmZfc3RhcnRoZWxwKCk7Cit9OworCitoZWxwOiBoZWxwX3N0YXJ0IFRfSEVMUFRFWFQKK3sKKwljdXJyZW50X2VudHJ5LT5zeW0tPmhlbHAgPSAkMjsKK307CisKKy8qIGRlcGVuZHMgb3B0aW9uICovCisKK2RlcGVuZHNfbGlzdDoKKwkgIC8qIGVtcHR5ICovCisJfCBkZXBlbmRzX2xpc3QgZGVwZW5kcworCXwgZGVwZW5kc19saXN0IFRfRU9MCisJfCBkZXBlbmRzX2xpc3Qgb3B0aW9uX2Vycm9yCis7CisKK2RlcGVuZHM6IFRfREVQRU5EUyBUX09OIGV4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9kZXAoJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHMgb25cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfQorCXwgVF9ERVBFTkRTIGV4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9kZXAoJDIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfQorCXwgVF9SRVFVSVJFUyBleHByIFRfRU9MCit7CisJbWVudV9hZGRfZGVwKCQyKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpyZXF1aXJlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCisvKiBwcm9tcHQgc3RhdGVtZW50ICovCisKK3Byb21wdF9zdG10X29wdDoKKwkgIC8qIGVtcHR5ICovCisJfCBwcm9tcHQgaWZfZXhwcgoreworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgJDEsICQyKTsKK307CisKK3Byb21wdDoJICBUX1dPUkQKKwl8IFRfV09SRF9RVU9URQorOworCitlbmQ6CSAgVF9FTkRNRU5VIFRfRU9MCXsgJCQgPSAkMTsgfQorCXwgVF9FTkRDSE9JQ0UgVF9FT0wJeyAkJCA9ICQxOyB9CisJfCBUX0VORElGIFRfRU9MCQl7ICQkID0gJDE7IH0KKzsKKworbmw6CisJICBUX0VPTAorCXwgbmwgVF9FT0wKKzsKKworaWZfZXhwcjogIC8qIGVtcHR5ICovCQkJeyAkJCA9IE5VTEw7IH0KKwl8IFRfSUYgZXhwcgkJCXsgJCQgPSAkMjsgfQorOworCitleHByOgkgIHN5bWJvbAkJCQl7ICQkID0gZXhwcl9hbGxvY19zeW1ib2woJDEpOyB9CisJfCBzeW1ib2wgVF9FUVVBTCBzeW1ib2wJCQl7ICQkID0gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsICQxLCAkMyk7IH0KKwl8IHN5bWJvbCBUX1VORVFVQUwgc3ltYm9sCQl7ICQkID0gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgJDEsICQzKTsgfQorCXwgVF9PUEVOX1BBUkVOIGV4cHIgVF9DTE9TRV9QQVJFTgl7ICQkID0gJDI7IH0KKwl8IFRfTk9UIGV4cHIJCQkJeyAkJCA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCAkMik7IH0KKwl8IGV4cHIgVF9PUiBleHByCQkJeyAkJCA9IGV4cHJfYWxsb2NfdHdvKEVfT1IsICQxLCAkMyk7IH0KKwl8IGV4cHIgVF9BTkQgZXhwcgkJCXsgJCQgPSBleHByX2FsbG9jX3R3byhFX0FORCwgJDEsICQzKTsgfQorOworCitzeW1ib2w6CSAgVF9XT1JECXsgJCQgPSBzeW1fbG9va3VwKCQxLCAwKTsgZnJlZSgkMSk7IH0KKwl8IFRfV09SRF9RVU9URQl7ICQkID0gc3ltX2xvb2t1cCgkMSwgMSk7IGZyZWUoJDEpOyB9Cis7CisKKyUlCisKK3ZvaWQgY29uZl9wYXJzZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCXpjb25mX2luaXRzY2FuKG5hbWUpOworCisJc3ltX2luaXQoKTsKKwltZW51X2luaXQoKTsKKwltb2R1bGVzX3N5bSA9IHN5bV9sb29rdXAoIk1PRFVMRVMiLCAwKTsKKwlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAiQnVzeWJveCBDb25maWd1cmF0aW9uIiwgTlVMTCk7CisKKyNpZiBZWURFQlVHCisJaWYgKGdldGVudigiWkNPTkZfREVCVUciKSkKKwkJemNvbmZkZWJ1ZyA9IDE7CisjZW5kaWYKKwl6Y29uZnBhcnNlKCk7CisJaWYgKHpjb25mbmVycnMpCisJCWV4aXQoMSk7CisJbWVudV9maW5hbGl6ZSgmcm9vdG1lbnUpOworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltX2NoZWNrX2RlcHMoc3ltKTsKKwl9CisKKwlzeW1fY2hhbmdlX2NvdW50ID0gMTsKK30KKworY29uc3QgY2hhciAqemNvbmZfdG9rZW5uYW1lKGludCB0b2tlbikKK3sKKwlzd2l0Y2ggKHRva2VuKSB7CisJY2FzZSBUX01FTlU6CQlyZXR1cm4gIm1lbnUiOworCWNhc2UgVF9FTkRNRU5VOgkJcmV0dXJuICJlbmRtZW51IjsKKwljYXNlIFRfQ0hPSUNFOgkJcmV0dXJuICJjaG9pY2UiOworCWNhc2UgVF9FTkRDSE9JQ0U6CXJldHVybiAiZW5kY2hvaWNlIjsKKwljYXNlIFRfSUY6CQlyZXR1cm4gImlmIjsKKwljYXNlIFRfRU5ESUY6CQlyZXR1cm4gImVuZGlmIjsKKwljYXNlIFRfREVQRU5EUzoJCXJldHVybiAiZGVwZW5kcyI7CisJfQorCXJldHVybiAiPHRva2VuPiI7Cit9CisKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pCit7CisJaWYgKGlkLT50b2tlbiAhPSBlbmR0b2tlbikgeworCQl6Y29uZl9lcnJvcigidW5leHBlY3RlZCAnJXMnIHdpdGhpbiAlcyBibG9jayIsCisJCQlrY29uZl9pZF9zdHJpbmdzICsgaWQtPm5hbWUsIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mbmVycnMrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoY3VycmVudF9tZW51LT5maWxlICE9IGN1cnJlbnRfZmlsZSkgeworCQl6Y29uZl9lcnJvcigiJyVzJyBpbiBkaWZmZXJlbnQgZmlsZSB0aGFuICclcyciLAorCQkJa2NvbmZfaWRfc3RyaW5ncyArIGlkLT5uYW1lLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBsb2NhdGlvbiBvZiB0aGUgJyVzJ1xuIiwKKwkJCWN1cnJlbnRfbWVudS0+ZmlsZS0+bmFtZSwgY3VycmVudF9tZW51LT5saW5lbm8sCisJCQl6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mcHJpbnQoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCXZhX3N0YXJ0KGFwLCBlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2Vycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl6Y29uZm5lcnJzKys7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJdmFfc3RhcnQoYXAsIGVycik7CisJdmZwcmludGYoc3RkZXJyLCBlcnIsIGFwKTsKKwl2YV9lbmQoYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpCit7CisjaWYgWVlERUJVRworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpICsgMSwgZXJyKTsKKyNlbmRpZgorfQorCit2b2lkIHByaW50X3F1b3RlZF9zdHJpbmcoRklMRSAqb3V0LCBjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgbGVuOworCisJcHV0YygnIicsIG91dCk7CisJd2hpbGUgKChwID0gc3RyY2hyKHN0ciwgJyInKSkpIHsKKwkJbGVuID0gcCAtIHN0cjsKKwkJaWYgKGxlbikKKwkJCWZwcmludGYob3V0LCAiJS4qcyIsIGxlbiwgc3RyKTsKKwkJZnB1dHMoIlxcXCIiLCBvdXQpOworCQlzdHIgPSBwICsgMTsKKwl9CisJZnB1dHMoc3RyLCBvdXQpOworCXB1dGMoJyInLCBvdXQpOworfQorCit2b2lkIHByaW50X3N5bWJvbChGSUxFICpvdXQsIHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQlmcHJpbnRmKG91dCwgImNob2ljZVxuIik7CisJZWxzZQorCQlmcHJpbnRmKG91dCwgImNvbmZpZyAlc1xuIiwgc3ltLT5uYW1lKTsKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlmcHV0cygiICBib29sZWFuXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfVFJJU1RBVEU6CisJCWZwdXRzKCIgIHRyaXN0YXRlXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfU1RSSU5HOgorCQlmcHV0cygiICBzdHJpbmdcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJCWZwdXRzKCIgIGludGVnZXJcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19IRVg6CisJCWZwdXRzKCIgIGhleFxuIiwgb3V0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnB1dHMoIiAgPz8/XG4iLCBvdXQpOworCQlicmVhazsKKwl9CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+bWVudSAhPSBtZW51KQorCQkJY29udGludWU7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfUFJPTVBUOgorCQkJZnB1dHMoIiAgcHJvbXB0ICIsIG91dCk7CisJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiIGlmICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJfQorCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIFBfREVGQVVMVDoKKwkJCWZwdXRzKCAiICBkZWZhdWx0ICIsIG91dCk7CisJCQlleHByX2ZwcmludChwcm9wLT5leHByLCBvdXQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0NIT0lDRToKKwkJCWZwdXRzKCIgICNjaG9pY2UgdmFsdWVcbiIsIG91dCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYob3V0LCAiICB1bmtub3duIHByb3AgJWQhXG4iLCBwcm9wLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChzeW0tPmhlbHApIHsKKwkJaW50IGxlbiA9IHN0cmxlbihzeW0tPmhlbHApOworCQl3aGlsZSAoc3ltLT5oZWxwWy0tbGVuXSA9PSAnXG4nKQorCQkJc3ltLT5oZWxwW2xlbl0gPSAwOworCQlmcHJpbnRmKG91dCwgIiAgaGVscFxuJXNcbiIsIHN5bS0+aGVscCk7CisJfQorCWZwdXRjKCdcbicsIG91dCk7Cit9CisKK3ZvaWQgemNvbmZkdW1wKEZJTEUgKm91dCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CisJd2hpbGUgKG1lbnUpIHsKKwkJaWYgKChzeW0gPSBtZW51LT5zeW0pKQorCQkJcHJpbnRfc3ltYm9sKG91dCwgbWVudSk7CisJCWVsc2UgaWYgKChwcm9wID0gbWVudS0+cHJvbXB0KSkgeworCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQljYXNlIFBfQ09NTUVOVDoKKwkJCQlmcHV0cygiXG5jb21tZW50ICIsIG91dCk7CisJCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJCWZwdXRzKCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBfTUVOVToKKwkJCQlmcHV0cygiXG5tZW51ICIsIG91dCk7CisJCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJCWZwdXRzKCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgIGRlcGVuZHMgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCX0KKwkJCWZwdXRzKCJcbiIsIG91dCk7CisJCX0KKworCQlpZiAobWVudS0+bGlzdCkKKwkJCW1lbnUgPSBtZW51LT5saXN0OworCQllbHNlIGlmIChtZW51LT5uZXh0KQorCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJaWYgKG1lbnUtPnByb21wdCAmJiBtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCWZwdXRzKCJcbmVuZG1lbnVcbiIsIG91dCk7CisJCQlpZiAobWVudS0+bmV4dCkgeworCQkJCW1lbnUgPSBtZW51LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjaW5jbHVkZSAibGV4Lnpjb25mLmMiCisjaW5jbHVkZSAidXRpbC5jIgorI2luY2x1ZGUgImNvbmZkYXRhLmMiCisjaW5jbHVkZSAiZXhwci5jIgorI2luY2x1ZGUgInN5bWJvbC5jIgorI2luY2x1ZGUgIm1lbnUuYyIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWVtdXNhZ2UgYi9zY3JpcHRzL21lbXVzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZjU2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21lbXVzYWdlCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorCitidXN5Ym94PS4uL2J1c3lib3gKKworaT00MDAwCitlY2hvICJCZWZvcmUgd2Ugc3RhcnRlZCAkaSBjb3BpZXMgb2YgJyRidXN5Ym94IHNsZWVwIDEwJzoiCiskYnVzeWJveCBubWV0ZXIgJyV0ICVbcG5dICVtJyB8IGhlYWQgLTMKKword2hpbGUgdGVzdCAkaSAhPSAwOyBkbworICAgICRidXN5Ym94IHNsZWVwIDEwICYKKyAgICBpPSQoKGktMSkpCitkb25lCitzbGVlcCAxCisKK2VjaG8gIkFmdGVyOiIKKyRidXN5Ym94IG5tZXRlciAnJXQgJVtwbl0gJW0nIHwgaGVhZCAtMwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta2NvbmZpZ3MgYi9zY3JpcHRzL21rY29uZmlncwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjk0ZmNjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ta2NvbmZpZ3MKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwMiBLaGFsaWQgQXppeiA8a2hhbGlkX2F6aXogYXQgaHAuY29tPgorIyBDb3B5cmlnaHQgKEMpIDIwMDIgUmFuZHkgRHVubGFwIDxyZGR1bmxhcCBhdCBvc2RsLm9yZz4KKyMgQ29weXJpZ2h0IChDKSAyMDAyIEFsIFN0b25lIDxhaHMzIGF0IGZjLmhwLmNvbT4KKyMgQ29weXJpZ2h0IChDKSAyMDAyIEhld2xldHQtUGFja2FyZCBDb21wYW55CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyMKKyMgICBCdXN5Ym94IHZlcnNpb24gYnkgTWF0dGVvIENyb2NlIDwzMjk3NjI3Nzk5IGF0IHdpbmQuaXQ+CisjCisjIFJ1bGVzIHRvIGdlbmVyYXRlIGJiY29uZmlnb3B0cy5oIGZyb20gLmNvbmZpZzoKKyMgICAgICAtIFJldGFpbiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggIkNPTkZJR18iCisjICAgICAgLSBSZXRhaW4gbGluZXMgdGhhdCBiZWdpbiB3aXRoICIjIENPTkZJR18iCisjICAgICAgLSBsaW5lcyB0aGF0IHVzZSBkb3VibGUtcXVvdGVzIG11c3QgXFwtZXNjYXBlLXF1b3RlIHRoZW0KKworY29uZmlnPS5jb25maWcKKworeworZWNobyAiXAorI2lmbmRlZiBfQkJDT05GSUdPUFRTX0gKKyNkZWZpbmUgX0JCQ09ORklHT1BUU19ICisvKgorICogYnVzeWJveCBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdHMvbWtjb25maWdzLgorICogRG8gbm90IGVkaXQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGJiY29uZmlnX2NvbmZpZ1tdIEFMSUdOMSA9IgorCitncmVwIC1lICdeIyBDT05GSUdfJyAtZSAnXkNPTkZJR18nICIkY29uZmlnIiBcCit8IHNlZCAtZSAncy9cIi9cXFwiL2cnIC1lICdzL14vIi8nIC1lICdzLyQvXFxuIi8nCisKK2VjaG8gIjsiCitlY2hvICIjZW5kaWYiCit9ID4iJDEiCisKK3sKK2VjaG8gIlwKKyNpZm5kZWYgX0JCQ09ORklHT1BUU19CWjJfSAorI2RlZmluZSBfQkJDT05GSUdPUFRTX0JaMl9ICisvKgorICogYnVzeWJveCBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdHMvbWtjb25maWdzLgorICogRG8gbm90IGVkaXQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGJiY29uZmlnX2NvbmZpZ19iejJbXSBBTElHTjEgPSB7IgorCitncmVwIC1lICdeIyBDT05GSUdfJyAtZSAnXkNPTkZJR18nICIkY29uZmlnIiBcCit8IGJ6aXAyIC0xIHwgZGQgYnM9MiBza2lwPTEgMj4vZGV2L251bGwgXAorfCBvZCAtdiAtdCB4MSBcCit8IHNlZCAtZSAncy9eW14gXSovLycgXAorICAgICAgICAtZSAncy8gLy9nJyBcCisgICAgICAgIC1lICcvXiQvZCcgXAorICAgICAgICAtZSAncy9cKC4uXCkvMHhcMSwvZycKKworZWNobyAifTsiCitlY2hvICIjZW5kaWYiCit9ID4iJDIiCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rZGlmZl9vYmogYi9zY3JpcHRzL21rZGlmZl9vYmoKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzA3NDc0OAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbWtkaWZmX29iagpAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKwordXNhZ2UoKSB7CisJZWNobyAiVXNhZ2U6ICR7MCMjKi99IERJUjEgRElSMiIKKwllY2hvCisJZWNobyAiQ29tcGFyZXMgYWxsIG9iamVjdCBmaWxlcyByZWN1cnNpdmVsdHkgZm91bmQgaW4gRElSMSBhbmQgRElSMi4iCisJZWNobyAiUHJpbnRzIGRpZmYgb2YgdGhlaXIgZGlzYXNzZW1ibHkuIgorCWVjaG8KKwlleGl0ICQxCit9CisKK2ZpbHRlcigpIHsKKwkjIHNlZCByZW1vdmVzICIgYWRkcmVzczogIiBwcmVmaXhlcyB3aGljaCBtZXNzIHVwIGRpZmYKKwlzZWQgJCdzL15cXChcdCpcXClbIF0qWzAtOWEtZl1bMC05YS1mXSo6WyBcdF0qL1xcMS8nIFwKKwl8IHNlZCAncy9fX0dJXy8vZycKK30KKwordGVzdCAtZCAiJDEiIHx8IHVzYWdlIDEKK3Rlc3QgLWQgIiQyIiB8fCB1c2FnZSAxCisKK3sKKwkoCisJCWNkICIkMSIgfHwgZXhpdCAxCisJCWZpbmQgLW5hbWUgJyoubycgIyAtbyAtbmFtZSAnKi5vcycgIyAtbyAtbmFtZSAnKi5zbycKKwkpCisJKAorCQljZCAiJDIiIHx8IGV4aXQgMQorCQlmaW5kIC1uYW1lICcqLm8nICMgLW8gLW5hbWUgJyoub3MnICMgLW8gLW5hbWUgJyouc28nCisJKQorfSB8IHNlZCAnczpeXC4vOjonIHwgc29ydCB8IHVuaXEgfCBcCisoCit3aGlsZSBJRlM9JycgcmVhZCAtciBvbmFtZTsgZG8KKwlpZiAhIHRlc3QgLWYgIiQxLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMi8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwlpZiAhIHRlc3QgLWYgIiQyLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMS8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwlkaWZmIC1xIC0tICIkMS8kb25hbWUiICIkMi8kb25hbWUiID4vZGV2L251bGwgJiYgY29udGludWUKKwkoY2QgIiQxIiAmJiB7IHNpemUgIiRvbmFtZSI7IG9iamR1bXAgLWRyICIkb25hbWUiIHwgZmlsdGVyOyB9ID4iJG9uYW1lLmRpc2FzbSIpCisJKGNkICIkMiIgJiYgeyBzaXplICIkb25hbWUiOyBvYmpkdW1wIC1kciAiJG9uYW1lIiB8IGZpbHRlcjsgfSA+IiRvbmFtZS5kaXNhc20iKQorCWRpZmYgLXUgLS0gIiQxLyRvbmFtZS5kaXNhc20iICIkMi8kb25hbWUuZGlzYXNtIgorZG9uZQorKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0IGIvc2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzYjJjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rZGlmZl9vYmpfYmxvYXQKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKK3Rlc3QgLWQgIiQxIiB8fCBleGl0IDEKK3Rlc3QgLWQgIiQyIiB8fCBleGl0IDEKKworeworCSgKKwkJY2QgIiQxIiB8fCBleGl0IDEKKwkJZmluZCAtbmFtZSAnKi5vJyAtbyAtbmFtZSAnKi5vcycgIyAtbyAtbmFtZSAnKi5zbycKKwkpCisJKAorCQljZCAiJDIiIHx8IGV4aXQgMQorCQlmaW5kIC1uYW1lICcqLm8nIC1vIC1uYW1lICcqLm9zJyAjIC1vIC1uYW1lICcqLnNvJworCSkKK30gfCBzZWQgJ3M6XlwuLzo6JyB8IHNvcnQgfCB1bmlxIHwgXAordGVlIExTVCB8IFwKKygKK0lGUz0nJword2hpbGUgcmVhZCAtciBvbmFtZTsgZG8KKwlpZiAhIHRlc3QgLWYgIiQxLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMi8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwlpZiAhIHRlc3QgLWYgIiQyLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMS8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwkkMS9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIgJDEvJG9uYW1lICQyLyRvbmFtZSB8IGdyZXAgJ290YWw6IDAgYnl0ZScgPi9kZXYvbnVsbCAmJiBjb250aW51ZQorCSQxL3NjcmlwdHMvYmxvYXQtby1tZXRlciAkMS8kb25hbWUgJDIvJG9uYW1lCisJc2l6ZSAkMS8kb25hbWUgJDIvJG9uYW1lCisJZWNobworZG9uZQorKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta21ha2VmaWxlIGIvc2NyaXB0cy9ta21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmYzUxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rbWFrZWZpbGUKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjIEdlbmVyYXRlcyBhIHNtYWxsIE1ha2VmaWxlIHVzZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIG91dHB1dAorIyBkaXJlY3RvcnksIHRvIGFsbG93IG1ha2UgdG8gYmUgc3RhcnRlZCBmcm9tIHRoZXJlLgorIyBUaGUgTWFrZWZpbGUgYWxzbyBhbGxvdyBmb3IgbW9yZSBjb252aW5pZW50IGJ1aWxkIG9mIGV4dGVybmFsIG1vZHVsZXMKKworIyBVc2FnZQorIyAkMSAtIEtlcm5lbCBzcmMgZGlyZWN0b3J5CisjICQyIC0gT3V0cHV0IGRpcmVjdG9yeQorIyAkMyAtIHZlcnNpb24KKyMgJDQgLSBwYXRjaGxldmVsCisKKwordGVzdCAhIC1yICQyL01ha2VmaWxlIC1vIC1PICQyL01ha2VmaWxlIHx8IGV4aXQgMAorZWNobyAiICBHRU4gICAgICQyL01ha2VmaWxlIgorCitjYXQgPDwgRU9GID4gJDIvTWFrZWZpbGUKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJDA6IGRvbid0IGVkaXQKKworVkVSU0lPTiA9ICQzCitQQVRDSExFVkVMID0gJDQKKworS0VSTkVMU1JDICAgIDo9ICQxCitLRVJORUxPVVRQVVQgOj0gJDIKKworTUFLRUZMQUdTICs9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CisKKy5QSE9OWTogYWxsIFwkKE1BS0VDTURHT0FMUykKKworYWxsOgorCVwkKE1BS0UpIC1DIFwkKEtFUk5FTFNSQykgTz1cJChLRVJORUxPVVRQVVQpCisKK01ha2VmaWxlOjsKKworXCQoZmlsdGVyLW91dCBhbGwgTWFrZWZpbGUsXCQoTUFLRUNNREdPQUxTKSk6CisJXCQoTUFLRSkgLUMgXCQoS0VSTkVMU1JDKSBPPVwkKEtFUk5FTE9VVFBVVCkgXCRACisKKyUvOgorCVwkKE1BS0UpIC1DIFwkKEtFUk5FTFNSQykgTz1cJChLRVJORUxPVVRQVVQpIFwkQAorRU9GCmRpZmYgLS1naXQgYS9zY3JpcHRzL29ianNpemVzIGIvc2NyaXB0cy9vYmpzaXplcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZGYwYzRmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9vYmpzaXplcwpAQCAtMCwwICsxLDE5IEBACisjIS9iaW4vc2gKKwordF90ZXh0PTAKK3RfZGF0YT0wCit0X2Jzcz0wCisKK3ByaW50ZiAiJTlzICUxMXMgJTlzICU5cyAlc1xuIiAidGV4dCtkYXRhIiAidGV4dCtyb2RhdGEiIHJ3ZGF0YSBic3MgZmlsZW5hbWUKKworZmluZCAtbmFtZSAnKi5vJyB8IGdyZXAgLXYgJ15cLi9zY3JpcHRzLycgfCBncmVwIC12RiBidWlsdC1pbi5vIFwKK3wgc2VkICdzOl5cLi86OicgfCB4YXJncyAiJHtDUk9TU19DT01QSUxFfXNpemUiIHwgZ3JlcCAnXiAqWzAtOV0nIFwKK3wgeword2hpbGUgcmVhZCB0ZXh0IGRhdGEgYnNzIGRlYyBoZXggZmlsZW5hbWU7IGRvCisgICAgdF90ZXh0PSQoKHRfdGV4dCt0ZXh0KSkKKyAgICB0X2RhdGE9JCgodF9kYXRhK2RhdGEpKQorICAgIHRfYnNzPSQoKHRfYnNzK2JzcykpCisgICAgcHJpbnRmICIlOWQgJTExZCAlOWQgJTlkICVzXG4iICQoKHRleHQrZGF0YSkpICR0ZXh0ICRkYXRhICRic3MgIiRmaWxlbmFtZSIKK2RvbmUKK3ByaW50ZiAiJTlkICUxMWQgJTlkICU5ZCAlc1xuIiAkKCh0X3RleHQrdF9kYXRhKSkgJHRfdGV4dCAkdF9kYXRhICR0X2JzcyAiVE9UQUwiCit9IHwgZW52IC11TEFORyAtdUxDX0FMTCBzb3J0IC1yCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JhbmRvbXRlc3QgYi9zY3JpcHRzL3JhbmRvbXRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTEwMjU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmFuZG9tdGVzdApAQCAtMCwwICsxLDk2IEBACisjIS9iaW4vc2gKKworIyBJZiBub3Qgc3BlY2lmaWVkIGluIGVudmlyb25tZW50Li4uCitpZiAhIHRlc3QgIiRMSUJDIjsgdGhlbgorCSMgU2VsZWN0IHdoaWNoIGxpYmMgdG8gYnVpbGQgYWdhaW5zdAorCUxJQkM9ImdsaWJjIgorCUxJQkM9InVjbGliYyIKK2ZpCisjIHg4NiAzMi1iaXQ6CisjQ1JPU1NfQ09NUElMRVJfUFJFRklYPSJpNDg2LWxpbnV4LXVjbGliYy0iCisjIE15IHN5c3RlbSBoYXMgc3RyYW5nZSBwcmVmaXggZm9yIHg4NiA2NC1iaXQgdWNsaWJjOgorI0NST1NTX0NPTVBJTEVSX1BSRUZJWD0ieDg2XzY0LXBjLWxpbnV4LWdudS0iCisKK2lmIHRlc3QgJCMgLWx0IDIgfHwgISB0ZXN0IC1kICIkMSIgfHwgdGVzdCAtZSAiJDIiOyB0aGVuCisJZWNobyAiVXNhZ2U6ICQwIFNSQ19ESVIgVE1QX0RJUiIKKwllY2hvCisJZWNobyAiU1JDX0RJUiB3aWxsIGJlIGNvcGllZCB0byBUTVBfRElSIGRpcmVjdG9yeS4iCisJZWNobyAiVGhlbiBhIHJhbmRvbSBidWlsZCB3aWxsIGJlIHBlcmZvcm1lZC4iCisJZWNobworCWVjaG8gIlVzZWZ1bCB2YXJpYWJsZXM6IgorCWVjaG8gIlwkTElCQywgXCRDUk9TU19DT01QSUxFUl9QUkVGSVgsIFwkTUFLRU9QVFMiCisJZXhpdCAxCitmaQorCitjcCAtZHByIC0tICIkMSIgIiQyIiB8fCB7IGVjaG8gImNvcHkgZXJyb3IiOyBleGl0IDE7IH0KK2NkIC0tICIkMiIgfHwgeyBlY2hvICJjZCAkZGlyIGVycm9yIjsgZXhpdCAxOyB9CisKKyMgR2VuZXJhdGUgcmFuZG9tIGNvbmZpZworbWFrZSByYW5kY29uZmlnID4vZGV2L251bGwgfHwgeyBlY2hvICJyYW5kY29uZmlnIGVycm9yIjsgZXhpdCAxOyB9CisKKyMgVHdlYWsgcmVzdWx0aW5nIGNvbmZpZworY2F0IC5jb25maWcgXAorfCBncmVwIC12IENPTkZJR19ERUJVR19QRVNTSU1JWkUgXAorfCBncmVwIC12IENPTkZJR19XRVJST1IgXAorfCBncmVwIC12IENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVggXAorfCBncmVwIC12IENPTkZJR19TRUxJTlVYIFwKK3wgZ3JlcCAtdiBDT05GSUdfRUZFTkNFIFwKK3wgZ3JlcCAtdiBDT05GSUdfRE1BTExPQyBcCitcCit8IGdyZXAgLXYgQ09ORklHX1JGS0lMTCBcCis+LmNvbmZpZy5uZXcKK212IC5jb25maWcubmV3IC5jb25maWcKK2VjaG8gJyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2VjaG8gJyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2VjaG8gIkNPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9XCIke0NST1NTX0NPTVBJTEVSX1BSRUZJWH1cIiIgPj4uY29uZmlnCitlY2hvICcjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZWNobyAnIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZWNobyAnIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2VjaG8gJyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0JyA+Pi5jb25maWcKKworIyBJZiBnbGliYywgZG9uJ3QgYnVpbGQgc3RhdGljCitpZiB0ZXN0IHgiJExJQkMiID0geCJnbGliYyI7IHRoZW4KKwljYXQgLmNvbmZpZyBcCisJfCBncmVwIC12IENPTkZJR19TVEFUSUMgXAorCT4uY29uZmlnLm5ldworCW12IC5jb25maWcubmV3IC5jb25maWcKKwllY2hvICcjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldCcgPj4uY29uZmlnCitmaQorCisjIElmIHVjbGliYywgYnVpbGQgc3RhdGljLCBhbmQgcmVtb3ZlIHNvbWUgdGhpbmdzCisjIGxpa2VseSB0byBub3Qgd29yayBvbiB1Y2xpYmMuCitpZiB0ZXN0IHgiJExJQkMiID0geCJ1Y2xpYmMiOyB0aGVuCisJY2F0IC5jb25maWcgXAorCXwgZ3JlcCAtdiBDT05GSUdfU1RBVElDIFwKKwl8IGdyZXAgLXYgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggXAorCXwgZ3JlcCAtdiBDT05GSUdfUElFIFwKKwlcCisJfCBncmVwIC12IENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIFwKKwk+LmNvbmZpZy5uZXcKKwltdiAuY29uZmlnLm5ldyAuY29uZmlnCisJZWNobyAnQ09ORklHX1NUQVRJQz15JyA+Pi5jb25maWcKKwllY2hvICcjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQnID4+LmNvbmZpZworCWVjaG8gJyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKKwllY2hvICcjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZmkKKworIyBJZiBTVEFUSUMsIHJlbW92ZSBzb21lIHRoaW5ncy4KKyMgUEFNIHdpdGggc3RhdGljIGxpbmtpbmcgaXMgcHJvYmFibHkgcG9pbnRsZXNzCisjIChidXQgSSBuZWVkIHRvIHRyeSAtIG5vdyBJIGRvbid0IGhhdmUgbGlicGFtLmEgb24gbXkgc3lzdGVtLCBvbmx5IGxpYnBhbS5zbykKK2lmIGdyZXAgLXEgIl5DT05GSUdfU1RBVElDPXkiIC5jb25maWc7IHRoZW4KKwljYXQgLmNvbmZpZyBcCisJfCBncmVwIC12IENPTkZJR19QQU0gXAorCT4uY29uZmlnLm5ldworCW12IC5jb25maWcubmV3IC5jb25maWcKKwllY2hvICcjIENPTkZJR19QQU0gaXMgbm90IHNldCcgPj4uY29uZmlnCitmaQorCisjIFJlZ2VuZXJhdGUgLmNvbmZpZyB3aXRoIGRlZmF1bHQgYW5zd2VycyBmb3IgeWFua2VkLW9mZiBvcHRpb25zCisjIChtb3N0IG9mIGRlZmF1bHQgYW5zd2VycyBhcmUgIm5vIikuCit7IHllcyAiIiB8IG1ha2Ugb2xkY29uZmlnID4vZGV2L251bGw7IH0gfHwgeyBlY2hvICJvbGRjb25maWcgZXJyb3IiOyBleGl0IDE7IH0KKworIyBCdWlsZCEKK25pY2UgLW4gMTAgbWFrZSAkTUFLRU9QVFMgMj4mMSB8IHRlZSBtYWtlLmxvZworCisjIFJldHVybiBleGl0Y29kZSAxIGlmIGJ1c3lib3ggZXhlY3V0YWJsZSBkb2VzIG5vdCBleGlzdAordGVzdCAteCBidXN5Ym94CmRpZmYgLS1naXQgYS9zY3JpcHRzL3JhbmRvbXRlc3QubG9vcCBiL3NjcmlwdHMvcmFuZG9tdGVzdC5sb29wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjOGE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3JhbmRvbXRlc3QubG9vcApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vc2gKKwordGVzdCAtZCAiJDEiIHx8IHsgZWNobyAiJyQxJyBpcyBub3QgYSBkaXJlY3RvcnkiOyBleGl0IDE7IH0KK3Rlc3QgLXggIiQxL3NjcmlwdHMvcmFuZG9tdGVzdCIgfHwgeyBlY2hvICJObyBzY3JpcHRzL3JhbmRvbXRlc3QgaW4gJyQxJyI7IGV4aXQgMTsgfQorCitleHBvcnQgTElCQz0idWNsaWJjIgorZXhwb3J0IENST1NTX0NPTVBJTEVSX1BSRUZJWD0iaTY4Ni0iCitleHBvcnQgTUFLRU9QVFM9Ii1qOSIKKworY250PTAKK2ZhaWw9MAord2hpbGUgc2xlZXAgMTsgZG8KKwllY2hvICJQYXNzZXM6ICRjbnQgRmFpbHVyZXM6ICRmYWlsIgorCWRpcj0idGVzdC4kJCIKKwl3aGlsZSB0ZXN0IC1lICIkZGlyIiAtbyAtZSAiZmFpbGVkLiRkaXIiOyBkbworCQlkaXI9InRlc3QuJCQuJFJBTkRPTSIKKwlkb25lCisJZWNobyAiUnVubmluZyByYW5kY29uZmlnIHRlc3QgaW4gJGRpci4uLiIKKwlpZiAhICIkMS9zY3JpcHRzL3JhbmRvbXRlc3QiICIkMSIgIiRkaXIiID4vZGV2L251bGw7IHRoZW4KKwkJbXYgLS0gIiRkaXIiICJmYWlsZWQuJGRpciIKKwkJZWNobyAiRmFpbGVkIGJ1aWxkIGluOiBmYWlsZWQuJGRpciIKKwkJZXhpdCAxICMgeW91IG1heSBjb21tZW50IHRoaXMgb3V0Li4uCisJCWxldCBmYWlsKysKKwllbHNlCisJCSgKKwkJCWNkIC0tICIkZGlyL3Rlc3RzdWl0ZSIgfHwgZXhpdCAxCisJCQllY2hvICJSdW5uaW5nIHRlc3RzdWl0ZSBpbiAkZGlyLi4uIgorCQkJU0tJUF9LTk9XTl9CVUdTPTEgU0tJUF9JTlRFUk5FVF9URVNUUz0xIC4vcnVudGVzdCAtdiA+cnVudGVzdC5sb2cgMj4mMQorCQkpCisJCWlmIHRlc3QgJD8gIT0gMDsgdGhlbgorCQkJZWNobyAiRmFpbGVkIHJ1bnRlc3QgaW4gJGRpciIKKwkJCWV4aXQgMQorCQlmaQorCQl0YWlsIC1uMTAgLS0gIiRkaXIvdGVzdHN1aXRlL3J1bnRlc3QubG9nIgorCQlybSAtcmYgLS0gIiRkaXIiCisJZmkKKwlsZXQgY250KysKK2RvbmUKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2FtcGxlX3BtYXAgYi9zY3JpcHRzL3NhbXBsZV9wbWFwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3ZmI0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3NhbXBsZV9wbWFwCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorCitidXN5Ym94PS4uL2J1c3lib3gKKworJGJ1c3lib3ggc2xlZXAgMTAgJgorcGlkPSQhCitzbGVlcCAxCisKK2VjaG8gIk1lbW9yeSBtYXAgb2YgJyRidXN5Ym94IHNsZWVwIDEwJzoiCitzaXplICRidXN5Ym94CitwbWFwICRwaWQgfCBlbnYgLSBncmVwICJeWzAtOWEtZl1bMC05YS1mXSogIiB8IHNvcnQgLXIgLXQgIiAiIC1rMiw5OTkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2hvd2FzbSBiL3NjcmlwdHMvc2hvd2FzbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjFhYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zaG93YXNtCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgRHVtYiBsaXR0bGUgdXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBvdXQgdGhlIGFzc2VtYmx5IGR1bXAgb2YgYSBzaW5nbGUKKyMgZnVuY3Rpb24sIG9yIGxpc3QgdGhlIGZ1bmN0aW9ucyBzbyBkdW1wYWJsZSBpbiBhbiBleGVjdXRhYmxlLiAgWW91J2QgdGhpbmsKKyMgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gZ2V0IG9iamR1bXAgdG8gZG8gdGhpcywgYnV0IEkgY2FuJ3QgZmluZCBpdC4KKworWyAkIyAtbHQgMSBdIHx8IFsgJCMgLWd0IDIgXSAmJiB7IGVjaG8gInVzYWdlOiBzaG93YXNtIGZpbGUgZnVuY3Rpb24iOyBleGl0IDE7IH0KKworWyAhIC1mICQxIF0gJiYgeyBlY2hvICJGaWxlICQxIG5vdCBmb3VuZCI7IGV4aXQgMTsgfQorCitpZiBbICQjIC1lcSAxIF0KK3RoZW4KKyAgb2JqZHVtcCAtZCAkMSB8IHNlZCAtbiAtZSAncy9eWzAtOWEtZkEtRl0qIDxcKC4qXCk+OiQvXDEvcCcKKyAgZXhpdCAwCitmaQorCitvYmpkdW1wIC1kICQxIHwgc2VkIC1uIC1lICcvLi97SDskIWR9JyAtZSAieDsvXi5bMC05YS1mQS1GXSogPCQyPjovcCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGVzdF9tYWtlX08gYi9zY3JpcHRzL3Rlc3RfbWFrZV9PCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwZWU2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Rlc3RfbWFrZV9PCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorCitiPWBiYXNlbmFtZSAkUFdEYAordGVzdCAiJHtiI2J1c3lib3h9IiAhPSAiJGIiIHx8IHsgZWNobyAiTXVzdCBiZSBydW4gaW4gYnVzeWJveCB0cmVlIjsgZXhpdCAxOyB9CisKK3JtIC1yZiAuLi90ZXN0ZGlyX21ha2VfTy4kJAorbWtkaXIgLi4vdGVzdGRpcl9tYWtlX08uJCQKK29kaXI9YGNkIC4uL3Rlc3RkaXJfbWFrZV9PLiQkICYmIHB3ZGAKK3Rlc3QgLWQgIiRvZGlyIiB8fCBleGl0IDEKKworbWFrZSBPPSIkb2RpciIgJE1BS0VPUFRTICIkQCIgZGVmY29uZmlnIGJ1c3lib3ggMj4mMSB8IHRlZSB0ZXN0X21ha2VfTy5sb2cKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGVzdF9tYWtlX2NsZWFuIGIvc2NyaXB0cy90ZXN0X21ha2VfY2xlYW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmEzYTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvdGVzdF9tYWtlX2NsZWFuCkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9zaAorCitiPWBiYXNlbmFtZSAkUFdEYAordGVzdCAiJHtiI2J1c3lib3h9IiAhPSAiJGIiIHx8IHsgZWNobyAiTXVzdCBiZSBydW4gaW4gYnVzeWJveCB0cmVlIjsgZXhpdCAxOyB9CisKK2NkIC4uCitjcCAtcFBSICIkYiIgYnVzeWJveC4kJC50ZXN0X3RyZWUKK2NkIGJ1c3lib3guJCQudGVzdF90cmVlCittYWtlIGRlZmNvbmZpZworbWFrZSAkTUFLRU9QVFMKK21ha2UgY2xlYW4KK2NkIC4uCitkaWZmIC11cnAgIiRiIiBidXN5Ym94LiQkLnRlc3RfdHJlZSA+YnVzeWJveC4kJC50ZXN0X3RyZWUuZGlmZgorY2F0IGJ1c3lib3guJCQudGVzdF90cmVlLmRpZmYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJ5bGluayBiL3NjcmlwdHMvdHJ5bGluawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGIwYjJlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy90cnlsaW5rCkBAIC0wLDAgKzEsMzEwIEBACisjIS9iaW4vc2gKKworZGVidWc9ZmFsc2UKKworIyBMaW5rZXIgZmxhZ3MgdXNlZDoKKyMKKyMgSW5mb3JtYXRpb25hbDoKKyMgLS13YXJuLWNvbW1vbgorIyAtTWFwICRFWEUubWFwCisjIC0tdmVyYm9zZQorIworIyBPcHRpbWl6YXRpb25zOgorIyAtLXNvcnQtY29tbW9uICAgICAgICAgICAgICAgICByZWR1Y2VzIHBhZGRpbmcKKyMgLS1zb3J0LXNlY3Rpb24gYWxpZ25tZW50ICAgICAgcmVkdWNlcyBwYWRkaW5nCisjIC0tZ2Mtc2VjdGlvbnMgICAgICAgICAgICAgICAgIHRocm93cyBvdXQgdW51c2VkIHNlY3Rpb25zLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCB3b3JrIGZvciBzaGFyZWQgbGlicworIyAtT24gICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdXNlZCwgbWF5YmUgdXNlZnVsPworIworIyBMaXN0IG9mIGZpbGVzIHRvIGxpbms6CisjICRsX2xpc3QgICAgICAgICAgICAgICAgICAgICAgID09IC0tc3RhcnQtZ3JvdXAgLWxsaWIxIC1sbGliMiAtLWVuZC1ncm91cAorIyAtLXN0YXJ0LWdyb3VwICRPX0ZJTEVTICRBX0ZJTEVTIC0tZW5kLWdyb3VwCisjCisjIFNoYXJlZCBsaWJyYXJ5IGxpbms6CisjIC1zaGFyZWQgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtZXhwbGFuYXRvcnkKKyMgLWZQSUMgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZQorIyAtLWVuYWJsZS1uZXctZHRhZ3MgICAgICAgICAgICA/CisjIC16LGNvbWJyZWxvYyAgICAgICAgICAgICAgICAgID8KKyMgLXNvbmFtZT0ibGliYnVzeWJveC5zby4kQkJfVkVSIgorIyAtLXVuZGVmaW5lZD1sYmJfbWFpbiAgICAgICAgICBTZWVkIG5hbWUgdG8gc3RhcnQgcHVsbGluZyBmcm9tCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcndpc2Ugd2UnbGwgbmVlZCAtLXdob2xlLWFyY2hpdmUpCisjIC1zdGF0aWMgICAgICAgICAgICAgICAgICAgICAgIE5vdCB1c2VkLCBidXQgbWF5IGJlIHVzZWZ1bCEgbWFucGFnZToKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB3aXRoIC1zaGFyZWQuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvaW5nIHNvIG1lYW5zIHRoYXQgYSBzaGFyZWQgbGlicmFyeQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBjcmVhdGVkIGJ1dCB0aGF0IGFsbCBvZiB0aGUgbGlicmFyeSdzCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgbXVzdCBiZSByZXNvbHZlZCBieSBwdWxsaW5nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGVudHJpZXMgZnJvbSBzdGF0aWMgbGlicmFyaWVzLiIKKworCit0cnkoKSB7CisgICAgcHJpbnRmICIlc1xuIiAiT3V0cHV0IG9mOiIgPiRFWEUub3V0CisgICAgcHJpbnRmICIlc1xuIiAiJCoiID4+JEVYRS5vdXQKKyAgICBwcmludGYgIiVzXG4iICI9PT09PT09PT09IiA+PiRFWEUub3V0CisgICAgJGRlYnVnICYmIGVjaG8gIlRyeWluZzogJCoiCisgICAgJEAgPj4kRVhFLm91dCAyPiYxCisgICAgcmV0dXJuICQ/Cit9CisKK2NoZWNrX2NjKCkgeworICAgIGxvY2FsIHRlbXBuYW1lPSIvdG1wL3RlbXAuJCQuJFJBTkRPTSIKKyAgICAjIENhbiB1c2UgIi1vIC9kZXYvbnVsbCIsIGJ1dCBvbGRlciBnY2MgdGVuZCB0byAqdW5saW5rIGl0KiBvbiBmYWlsdXJlISA6KAorICAgICMgIi14YyI6IEMgbGFuZ3VhZ2UuICIvZGV2L251bGwiIGlzIGFuIGVtcHR5IHNvdXJjZSBmaWxlLgorICAgIGlmICRDQyAkMSAtc2hhcmVkIC14YyAvZGV2L251bGwgLW8gIiR0ZW1wbmFtZSIubyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwllY2hvICIkMSI7CisgICAgZWxzZQorCWVjaG8gIiQyIjsKKyAgICBmaQorICAgIHJtICIkdGVtcG5hbWUiLm8gMj4vZGV2L251bGwKK30KKworY2hlY2tfbGliY19pc19nbGliYygpIHsKKyAgICBsb2NhbCB0ZW1wbmFtZT0iL3RtcC90ZW1wLiQkLiRSQU5ET00iCisgICAgZWNobyAiXAorCSNpbmNsdWRlIDxzdGRsaWIuaD4KKwkvKiBBcHBhcmVudGx5IHVjbGliYyBkZWZpbmVzIF9fR0xJQkNfXyAoY29tcGF0IHRyaWNrPykuIE9oIHdlbGwuICovCisJI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKQorCXN5bnRheCBlcnJvciBoZXJlCisJI2VuZGlmCisJIiA+IiR0ZW1wbmFtZSIuYworICAgIGlmICRDQyAiJHRlbXBuYW1lIi5jIC1jIC1vICIkdGVtcG5hbWUiLm8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJZWNobyAiJDIiOworICAgIGVsc2UKKwllY2hvICIkMSI7CisgICAgZmkKKyAgICBybSAiJHRlbXBuYW1lIi5jICIkdGVtcG5hbWUiLm8gMj4vZGV2L251bGwKK30KKworRVhFPSIkMSIKK0NDPSIkMiIKK0NGTEFHUz0iJDMiCitMREZMQUdTPSIkNCIKK09fRklMRVM9IiQ1IgorQV9GSUxFUz0iJDYiCitMRExJQlM9IiQ3IgorCisjIFRoZSAtLXNvcnQtc2VjdGlvbiBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBvbGRlciB2ZXJzaW9ucyBvZiBsZAorU09SVF9TRUNUSU9OPWBjaGVja19jYyAiLVdsLC0tc29ydC1zZWN0aW9uLGFsaWdubWVudCIgIiJgCisKK1NUQVJUX0dST1VQPSItV2wsLS1zdGFydC1ncm91cCIKK0VORF9HUk9VUD0iLVdsLC0tZW5kLWdyb3VwIgorSU5GT19PUFRTPSItV2wsLS13YXJuLWNvbW1vbiAtV2wsLU1hcCwkRVhFLm1hcCAtV2wsLS12ZXJib3NlIgorCisjIGdvbGQgbWF5IG5vdCBzdXBwb3J0IC0tc29ydC1jb21tb24gKHlldCkKK1NPUlRfQ09NTU9OPWBjaGVja19jYyAiLVdsLC0tc29ydC1jb21tb24iICIiYAorCisjIFN0YXRpYyBsaW5raW5nIGFnYWluc3QgZ2xpYmMgcHJvZHVjZXMgYnVnZ3kgZXhlY3V0YWJsZXMKKyMgKGdsaWJjIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIGxkIC0tZ2Mtc2VjdGlvbnMpLgorIyBTZWUgc291cmNlcy5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNDAwCisjIE5vdGUgdGhhdCBnbGliYyBpcyB1bnN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZyBhbnl3YXkuCisjIFdlIGFyZSByZW1vdmluZyAtV2wsLS1nYy1zZWN0aW9ucyBmcm9tIGxpbmsgY29tbWFuZCBsaW5lLgorR0NfU0VDVElPTlM9YCgKKy4gLi8uY29uZmlnCitpZiB0ZXN0IHgiJENPTkZJR19TVEFUSUMiID0geCJ5IjsgdGhlbgorICAgIGNoZWNrX2xpYmNfaXNfZ2xpYmMgIiIgIi1XbCwtLWdjLXNlY3Rpb25zIgorZWxzZQorICAgIGVjaG8gIi1XbCwtLWdjLXNlY3Rpb25zIgorZmkKKylgCisKKyMgVGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb2xkZXIgdmVyc2lvbnMgb2YgbGQKK2lmIHRlc3QgLW4gIiRHQ19TRUNUSU9OUyI7IHRoZW4KKyAgICBHQ19TRUNUSU9OUz1gY2hlY2tfY2MgIiRHQ19TRUNUSU9OUyIgIiJgCitmaQorCisjIFNhbml0aXplIGxpYiBsaXN0IChkdXBzLCBleHRyYSBzcGFjZXMgZXRjKQorTERMSUJTPWBlY2hvICIkTERMSUJTIiB8IHhhcmdzIC1uMSB8IHNvcnQgfCB1bmlxIHwgeGFyZ3NgCisKKyMgRmlyc3QgbGluayB3aXRoIGFsbCBsaWJzLiBJZiBpdCBmYWlscywgYmFpbCBvdXQKK2VjaG8gIlRyeWluZyBsaWJyYXJpZXM6ICRMRExJQlMiCisjICJsaWIxIGxpYjIgbGliMyIgLT4gIi1sbGliMSAtbGxpYjIgLWxsaWIzIgorbF9saXN0PWBlY2hvICIkTERMSUJTIiB8IHNlZCAtZSAncy8gLyAtbC9nJyAtZSAncy9eLy1sLycgLWUgJ3MvXi1sJC8vJ2AKK3Rlc3QgIngkbF9saXN0IiAhPSAieCIgJiYgbF9saXN0PSIkU1RBUlRfR1JPVVAgJGxfbGlzdCAkRU5EX0dST1VQIgordHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwktbyAkRVhFIFwKKwkkU09SVF9DT01NT04gXAorCSRTT1JUX1NFQ1RJT04gXAorCSRHQ19TRUNUSU9OUyBcCisJJFNUQVJUX0dST1VQICRPX0ZJTEVTICRBX0ZJTEVTICRFTkRfR1JPVVAgXAorCSRsX2xpc3QgXAorfHwgeworICAgIGVjaG8gIkZhaWxlZDogJGxfbGlzdCIKKyAgICBjYXQgJEVYRS5vdXQKKyAgICBleGl0IDEKK30KKworIyBOb3cgdHJ5IHRvIHJlbW92ZSBlYWNoIGxpYiBhbmQgYnVpbGQgd2l0aG91dCBpdC4KKyMgU3RvcCB3aGVuIG5vIGxpYiBjYW4gYmUgcmVtb3ZlZC4KK3doaWxlIHRlc3QgIiRMRExJQlMiOyBkbworICAgICRkZWJ1ZyAmJiBlY2hvICJUcnlpbmcgbGlicmFyaWVzOiAkTERMSUJTIgorICAgIGFsbF9uZWVkZWQ9dHJ1ZQorICAgIGxhc3RfbmVlZGVkPWZhbHNlCisgICAgZm9yIG9uZSBpbiAkTERMSUJTOyBkbworCXdpdGhvdXRfb25lPWBlY2hvICIgJExETElCUyAiIHwgc2VkICJzLyAkb25lIC8gL2ciIHwgeGFyZ3NgCisJIyAibGliMSBsaWIyIGxpYjMiIC0+ICItbGxpYjEgLWxsaWIyIC1sbGliMyIKKwlsX2xpc3Q9YGVjaG8gIiR3aXRob3V0X29uZSIgfCBzZWQgLWUgJ3MvIC8gLWwvZycgLWUgJ3MvXi8tbC8nIC1lICdzL14tbCQvLydgCisJdGVzdCB4IiRsX2xpc3QiICE9IHgiIiAmJiBsX2xpc3Q9IiRTVEFSVF9HUk9VUCAkbF9saXN0ICRFTkRfR1JPVVAiCisJJGRlYnVnICYmIGVjaG8gIlRyeWluZyAtbCBvcHRpb25zOiAnJGxfbGlzdCciCisJdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwkJLW8gJEVYRSBcCisJCSRTT1JUX0NPTU1PTiBcCisJCSRTT1JUX1NFQ1RJT04gXAorCQkkR0NfU0VDVElPTlMgXAorCQkkU1RBUlRfR1JPVVAgJE9fRklMRVMgJEFfRklMRVMgJEVORF9HUk9VUCBcCisJCSRsX2xpc3QKKwlpZiB0ZXN0ICQ/ID0gMDsgdGhlbgorCSAgICBlY2hvICIgTGlicmFyeSAkb25lIGlzIG5vdCBuZWVkZWQsIGV4Y2x1ZGluZyBpdCIKKwkgICAgTERMSUJTPSIkd2l0aG91dF9vbmUiCisJICAgIGFsbF9uZWVkZWQ9ZmFsc2UKKwkgICAgbGFzdF9uZWVkZWQ9ZmFsc2UKKwllbHNlCisJICAgIGVjaG8gIiBMaWJyYXJ5ICRvbmUgaXMgbmVlZGVkLCBjYW4ndCBleGNsdWRlIGl0ICh5ZXQpIgorCSAgICBsYXN0X25lZWRlZD10cnVlCisJZmkKKyAgICBkb25lCisgICAgIyBBbGwgbGlicyB3ZXJlIG5lZWRlZCwgY2FuJ3QgcmVtb3ZlIGFueQorICAgICRhbGxfbmVlZGVkICYmIGJyZWFrCisgICAgIyBPcHRpbWl6YXRpb246IHdhcyB0aGUgbGFzdCB0cmllZCBsaWIgbmVlZGVkPworICAgIGlmICRsYXN0X25lZWRlZDsgdGhlbgorCSMgV2FzIGl0IHRoZSBvbmx5IG9uZSBsaWIgbGVmdD8gRG9uJ3QgdGVzdCBhZ2FpbiB0aGVuLgorCXsgZWNobyAiJExETElCUyIgfCBncmVwIC1xICcgJzsgfSB8fCBicmVhaworICAgIGZpCitkb25lCisKKyMgTWFrZSB0aGUgYmluYXJ5IHdpdGggZmluYWwsIG1pbmltYWwgbGlzdCBvZiBsaWJzCitlY2hvICJGaW5hbCBsaW5rIHdpdGg6ICR7TERMSUJTOi08bm9uZT59IgorbF9saXN0PWBlY2hvICIkTERMSUJTIiB8IHNlZCAtZSAncy8gLyAtbC9nJyAtZSAncy9eLy1sLycgLWUgJ3MvXi1sJC8vJ2AKK3Rlc3QgIngkbF9saXN0IiAhPSAieCIgJiYgbF9saXN0PSIkU1RBUlRfR1JPVVAgJGxfbGlzdCAkRU5EX0dST1VQIgorIyAtLXZlcmJvc2UgZ2l2ZXMgdXMgZ29icyBvZiBpbmZvIHRvIHN0ZG91dCAoZS5nLiBsaW5rZXIgc2NyaXB0IHVzZWQpCitpZiAhIHRlc3QgLWYgYnVzeWJveF9sZHNjcmlwdDsgdGhlbgorICAgIHRyeSAkQ0MgJENGTEFHUyAkTERGTEFHUyBcCisJICAgIC1vICRFWEUgXAorCSAgICAkU09SVF9DT01NT04gXAorCSAgICAkU09SVF9TRUNUSU9OIFwKKwkgICAgJEdDX1NFQ1RJT05TIFwKKwkgICAgJFNUQVJUX0dST1VQICRPX0ZJTEVTICRBX0ZJTEVTICRFTkRfR1JPVVAgXAorCSAgICAkbF9saXN0IFwKKwkgICAgJElORk9fT1BUUyBcCisgICAgfHwgeworCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KK2Vsc2UKKyAgICBlY2hvICJDdXN0b20gbGlua2VyIHNjcmlwdCAnYnVzeWJveF9sZHNjcmlwdCcgZm91bmQsIHVzaW5nIGl0IgorICAgICMgQWRkIFNPUlRfQllfQUxJR05NRU5UIHRvIGxpbmtlciBzY3JpcHQgKGZvdW5kIGluICRFWEUub3V0KToKKyAgICAjICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSBTT1JUX0JZX0FMSUdOTUVOVCgucm9kYXRhLiopIC5nbnUubGlua29uY2Uuci4qKSB9CisgICAgIyAgKiguZGF0YSBTT1JUX0JZX0FMSUdOTUVOVCguZGF0YS4qKSAuZ251LmxpbmtvbmNlLmQuKikKKyAgICAjICAqKC5ic3MgU09SVF9CWV9BTElHTk1FTlQoLmJzcy4qKSAuZ251LmxpbmtvbmNlLmIuKikKKyAgICAjIFRoaXMgd2lsbCBlbGltaW5hdGUgbW9zdCBvZiB0aGUgcGFkZGluZyAofjNrYikuCisgICAgIyBIbW0sICJsZCAtLXNvcnQtc2VjdGlvbiBhbGlnbm1lbnQiIHNob3VsZCBkbyBpdCB0b28uCisgICAgdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwkgICAgLW8gJEVYRSBcCisJICAgICRTT1JUX0NPTU1PTiBcCisJICAgICRTT1JUX1NFQ1RJT04gXAorCSAgICAkR0NfU0VDVElPTlMgXAorCSAgICAtV2wsLVQsYnVzeWJveF9sZHNjcmlwdCBcCisJICAgICRTVEFSVF9HUk9VUCAkT19GSUxFUyAkQV9GSUxFUyAkRU5EX0dST1VQIFwKKwkgICAgJGxfbGlzdCBcCisJICAgICRJTkZPX09QVFMgXAorICAgIHx8IHsKKwljYXQgJEVYRS5vdXQKKwlleGl0IDEKKyAgICB9CitmaQorCisuIC4vLmNvbmZpZworCitzaGFyZWRsaWJfZGlyPSIwX2xpYiIKKworaWYgdGVzdCAiJENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIiA9IHk7IHRoZW4KKyAgICBta2RpciAiJHNoYXJlZGxpYl9kaXIiIDI+L2Rldi9udWxsCisgICAgdGVzdCAtZCAiJHNoYXJlZGxpYl9kaXIiIHx8IHsKKwllY2hvICJDYW5ub3QgbWFrZSBkaXJlY3RvcnkgJHNoYXJlZGxpYl9kaXIiCisJZXhpdCAxCisgICAgfQorICAgIGxuIC1zICJsaWJidXN5Ym94LnNvLiRCQl9WRVIiICIkc2hhcmVkbGliX2RpciIvbGliYnVzeWJveC5zbyAyPi9kZXYvbnVsbAorCisgICAgRVhFPSIkc2hhcmVkbGliX2Rpci9saWJidXN5Ym94LnNvLiR7QkJfVkVSfV91bnN0cmlwcGVkIgorICAgIHRyeSAkQ0MgJENGTEFHUyAkTERGTEFHUyBcCisJICAgIC1vICRFWEUgXAorCSAgICAtc2hhcmVkIC1mUElDIFwKKwkgICAgLVdsLC0tZW5hYmxlLW5ldy1kdGFncyBcCisJICAgIC1XbCwteixjb21icmVsb2MgXAorCSAgICAtV2wsLXNvbmFtZT0ibGliYnVzeWJveC5zby4kQkJfVkVSIiBcCisJICAgIC1XbCwtLXVuZGVmaW5lZD1sYmJfbWFpbiBcCisJICAgICRTT1JUX0NPTU1PTiBcCisJICAgICRTT1JUX1NFQ1RJT04gXAorCSAgICAkU1RBUlRfR1JPVVAgJEFfRklMRVMgJEVORF9HUk9VUCBcCisJICAgICRsX2xpc3QgXAorCSAgICAkSU5GT19PUFRTIFwKKyAgICB8fCB7CisJZWNobyAiTGlua2luZyAkRVhFIGZhaWxlZCIKKwljYXQgJEVYRS5vdXQKKwlleGl0IDEKKyAgICB9CisgICAgJFNUUklQIC1zIC0tcmVtb3ZlLXNlY3Rpb249Lm5vdGUgLS1yZW1vdmUtc2VjdGlvbj0uY29tbWVudCAkRVhFIC1vICIkc2hhcmVkbGliX2Rpci9saWJidXN5Ym94LnNvLiRCQl9WRVIiCisgICAgY2htb2QgYSt4ICIkc2hhcmVkbGliX2Rpci9saWJidXN5Ym94LnNvLiRCQl9WRVIiCisgICAgZWNobyAibGliYnVzeWJveDogJHNoYXJlZGxpYl9kaXIvbGliYnVzeWJveC5zby4kQkJfVkVSIgorZmkKKworaWYgdGVzdCAiJENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIiA9IHk7IHRoZW4KKyAgICBFWEU9IiRzaGFyZWRsaWJfZGlyL2J1c3lib3hfdW5zdHJpcHBlZCIKKyAgICB0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCSAgICAtbyAkRVhFIFwKKwkgICAgJFNPUlRfQ09NTU9OIFwKKwkgICAgJFNPUlRfU0VDVElPTiBcCisJICAgICRHQ19TRUNUSU9OUyBcCisJICAgICRTVEFSVF9HUk9VUCAkT19GSUxFUyAkRU5EX0dST1VQIFwKKwkgICAgLUwiJHNoYXJlZGxpYl9kaXIiIC1sYnVzeWJveCBcCisJICAgICRsX2xpc3QgXAorCSAgICAkSU5GT19PUFRTIFwKKyAgICB8fCB7CisJZWNobyAiTGlua2luZyAkRVhFIGZhaWxlZCIKKwljYXQgJEVYRS5vdXQKKwlleGl0IDEKKyAgICB9CisgICAgJFNUUklQIC1zIC0tcmVtb3ZlLXNlY3Rpb249Lm5vdGUgLS1yZW1vdmUtc2VjdGlvbj0uY29tbWVudCAkRVhFIC1vICIkc2hhcmVkbGliX2Rpci9idXN5Ym94IgorICAgIGVjaG8gImJ1c3lib3ggbGlua2VkIGFnYWluc3QgbGliYnVzeWJveDogJHNoYXJlZGxpYl9kaXIvYnVzeWJveCIKK2ZpCisKK2lmIHRlc3QgIiRDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIiA9IHk7IHRoZW4KKyAgICBlY2hvICJMaW5raW5nIGluZGl2aWR1YWwgYXBwbGV0cyBhZ2FpbnN0IGxpYmJ1c3lib3ggKHNlZSAkc2hhcmVkbGliX2Rpci8qKSIKKyAgICBnY2MgLUROQU1FX01BSU5fQ05BTUUgLUUgLWluY2x1ZGUgaW5jbHVkZS9hdXRvY29uZi5oIGluY2x1ZGUvYXBwbGV0cy5oIFwKKyAgICB8IGdyZXAgLXYgIl4jIiBcCisgICAgfCBncmVwIC12ICJeJCIgXAorICAgID4gYXBwbGV0X2xzdC50bXAKKyAgICB3aGlsZSByZWFkIG5hbWUgbWFpbiBqdW5rOyBkbworCisJZWNobyAiXAordm9pZCBsYmJfcHJlcGFyZShjb25zdCBjaGFyICphcHBsZXQsIGNoYXIgKiphcmd2KTsKK2ludCAkbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbGJiX3ByZXBhcmUoXCIkbmFtZVwiLCBhcmd2KTsKKwlyZXR1cm4gJG1haW4oYXJnYywgYXJndik7Cit9CisiID4iJHNoYXJlZGxpYl9kaXIvYXBwbGV0LmMiCisKKwlFWEU9IiRzaGFyZWRsaWJfZGlyLyRuYW1lIgorCXRyeSAkQ0MgJENGTEFHUyAkTERGTEFHUyAiJHNoYXJlZGxpYl9kaXIvYXBwbGV0LmMiIFwKKwkJLW8gJEVYRSBcCisJCSRTT1JUX0NPTU1PTiBcCisJCSRTT1JUX1NFQ1RJT04gXAorCQkkR0NfU0VDVElPTlMgXAorCQktTCIkc2hhcmVkbGliX2RpciIgLWxidXN5Ym94IFwKKwkJLVdsLC0td2Fybi1jb21tb24gXAorCXx8IHsKKwkgICAgZWNobyAiTGlua2luZyAkRVhFIGZhaWxlZCIKKwkgICAgY2F0ICRFWEUub3V0CisJICAgIGV4aXQgMQorCX0KKwlybSAtLSAiJHNoYXJlZGxpYl9kaXIvYXBwbGV0LmMiICRFWEUub3V0CisJJFNUUklQIC1zIC0tcmVtb3ZlLXNlY3Rpb249Lm5vdGUgLS1yZW1vdmUtc2VjdGlvbj0uY29tbWVudCAkRVhFCisKKyAgICBkb25lIDxhcHBsZXRfbHN0LnRtcAorZmkKKworIyBsaWJidXN5Ym94LnNvIGlzIG5lZWRlZCBvbmx5IGZvciAtbGJ1c3lib3ggYXQgbGluayB0aW1lLAorIyBpdCBpcyBub3QgbmVlZGVkIGF0IHJ1bnRpbWUuIERlbGV0aW5nIHRvIHJlZHVjZSBjb25mdXNpb24uCitybSAiJHNoYXJlZGxpYl9kaXIiL2xpYmJ1c3lib3guc28gMj4vZGV2L251bGwKK2V4aXQgMCAjIG9yIGVsc2Ugd2UgbWF5IGNvbmZ1c2UgbWFrZQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9Db25maWcuaW4gYi9zZWxpbnV4L0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZiOTFiCi0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9Db25maWcuaW4KQEAgLTAsMCArMSwxMjUgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJTRUxpbnV4IFV0aWxpdGllcyIKKwlkZXBlbmRzIG9uIFNFTElOVVgKKworCisKK2NvbmZpZyBDSENPTgorCWJvb2wgImNoY29uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IHRvIGNoYW5nZSB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBmaWxlLgorCitjb25maWcgRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ0hDT04gJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBjaGNvbiBhcHBsZXQuCisKK2NvbmZpZyBHRVRFTkZPUkNFCisJYm9vbCAiZ2V0ZW5mb3JjZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgdGhlIGN1cnJlbnQgbW9kZSBvZiBTRUxpbnV4LgorCitjb25maWcgR0VUU0VCT09MCisJYm9vbCAiZ2V0c2Vib29sIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IHRvIGdldCBTRUxpbnV4IGJvb2xlYW4gdmFsdWVzLgorCitjb25maWcgTE9BRF9QT0xJQ1kKKwlib29sICJsb2FkX3BvbGljeSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBsb2FkIFNFTGludXggcG9saWN5LgorCitjb25maWcgTUFUQ0hQQVRIQ09OCisJYm9vbCAibWF0Y2hwYXRoY29uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IHRvIGdldCBkZWZhdWx0IHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlCisJICBzcGVjaWZpZWQgcGF0aCBmcm9tIHRoZSBmaWxlIGNvbnRleHRzIGNvbmZpZ3VyYXRpb24uCisKK2NvbmZpZyBSRVNUT1JFQ09OCisJYm9vbCAicmVzdG9yZWNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byByZWxhYmVsIGZpbGVzLiBUaGUgZmVhdHVyZSBpcyBhbG1vc3QKKwkgIHRoZSBzYW1lIGFzIHNldGZpbGVzLCBidXQgdXNhZ2UgaXMgYSBsaXR0bGUgZGlmZmVyZW50LgorCitjb25maWcgUlVOQ09OCisJYm9vbCAicnVuY29uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IHRvIHJ1biBjb21tYW5kIGluIHNwZWZpY2llZCBzZWN1cml0eSBjb250ZXh0LgorCitjb25maWcgRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJVTkNPTiAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHJ1bmNvbiBhcHBsZXQuCisKK2NvbmZpZyBTRUxJTlVYRU5BQkxFRAorCWJvb2wgInNlbGludXhlbmFibGVkIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGlzIGNvbW1hbmQgdG8gYmUgdXNlZCB3aXRoaW4gc2hlbGwgc2NyaXB0cworCSAgdG8gZGV0ZXJtaW5lIGlmIHNlbGludXggaXMgZW5hYmxlZC4KKworY29uZmlnIFNFVEVORk9SQ0UKKwlib29sICJzZXRlbmZvcmNlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IHRvIG1vZGlmeSB0aGUgbW9kZSBTRUxpbnV4IGlzIHJ1bm5pbmcgaW4uCisKK2NvbmZpZyBTRVRGSUxFUworCWJvb2wgInNldGZpbGVzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IHRvIG1vZGlmeSB0byByZWxhYmVsIGZpbGVzLgorCSAgTm90aWNlOiBJZiB5b3UgYnVpbHQgbGlic2VsaW51eCB3aXRoIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQsCisJICAoSXQgaXMgZGVmYXVsdCBpbiBsaWJzZWxpbnV4J3MgTWFrZWZpbGUpLCB5b3UgX211c3RfIGVuYWJsZQorCSAgQ09ORklHX0xGUy4KKworY29uZmlnIEZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OCisJYm9vbCAiRW5hYmxlIGNoZWNrIG9wdGlvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFVEZJTEVTCisJaGVscAorCSAgU3VwcG9ydCAiLWMiIG9wdGlvbiAoY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBjb250ZXh0cyBhZ2FpbnN0CisJICB0aGUgc3BlY2lmaWVkIGJpbmFyeSBwb2xpY3kpIGZvciBzZXRmaWxlcy4gUmVxdWlyZXMgbGlic2Vwb2wuCisKK2NvbmZpZyBTRVRTRUJPT0wKKwlib29sICJzZXRzZWJvb2wiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGNoYW5nZSBib29sZWFuLgorCSAgc2VtYW5hZ2UgYW5kIC1QIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKworY29uZmlnIFNFU1RBVFVTCisJYm9vbCAic2VzdGF0dXMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRGlzcGxheXMgdGhlIHN0YXR1cyBvZiBTRUxpbnV4LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zZWxpbnV4L0NvbmZpZy5zcmMgYi9zZWxpbnV4L0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkMTViNgotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDEyNCBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU0VMaW51eCBVdGlsaXRpZXMiCisJZGVwZW5kcyBvbiBTRUxJTlVYCisKK0lOU0VSVAorCitjb25maWcgQ0hDT04KKwlib29sICJjaGNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBjaGFuZ2UgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgZmlsZS4KKworY29uZmlnIEZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENIQ09OICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgY2hjb24gYXBwbGV0LgorCitjb25maWcgR0VURU5GT1JDRQorCWJvb2wgImdldGVuZm9yY2UiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gZ2V0IHRoZSBjdXJyZW50IG1vZGUgb2YgU0VMaW51eC4KKworY29uZmlnIEdFVFNFQk9PTAorCWJvb2wgImdldHNlYm9vbCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgU0VMaW51eCBib29sZWFuIHZhbHVlcy4KKworY29uZmlnIExPQURfUE9MSUNZCisJYm9vbCAibG9hZF9wb2xpY3kiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gbG9hZCBTRUxpbnV4IHBvbGljeS4KKworY29uZmlnIE1BVENIUEFUSENPTgorCWJvb2wgIm1hdGNocGF0aGNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0IG9mIHRoZQorCSAgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uLgorCitjb25maWcgUkVTVE9SRUNPTgorCWJvb2wgInJlc3RvcmVjb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gcmVsYWJlbCBmaWxlcy4gVGhlIGZlYXR1cmUgaXMgYWxtb3N0CisJICB0aGUgc2FtZSBhcyBzZXRmaWxlcywgYnV0IHVzYWdlIGlzIGEgbGl0dGxlIGRpZmZlcmVudC4KKworY29uZmlnIFJVTkNPTgorCWJvb2wgInJ1bmNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBydW4gY29tbWFuZCBpbiBzcGVmaWNpZWQgc2VjdXJpdHkgY29udGV4dC4KKworY29uZmlnIEZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5DT04gJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBydW5jb24gYXBwbGV0LgorCitjb25maWcgU0VMSU5VWEVOQUJMRUQKKwlib29sICJzZWxpbnV4ZW5hYmxlZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhpcyBjb21tYW5kIHRvIGJlIHVzZWQgd2l0aGluIHNoZWxsIHNjcmlwdHMKKwkgIHRvIGRldGVybWluZSBpZiBzZWxpbnV4IGlzIGVuYWJsZWQuCisKK2NvbmZpZyBTRVRFTkZPUkNFCisJYm9vbCAic2V0ZW5mb3JjZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBtb2RpZnkgdGhlIG1vZGUgU0VMaW51eCBpcyBydW5uaW5nIGluLgorCitjb25maWcgU0VURklMRVMKKwlib29sICJzZXRmaWxlcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBtb2RpZnkgdG8gcmVsYWJlbCBmaWxlcy4KKwkgIE5vdGljZTogSWYgeW91IGJ1aWx0IGxpYnNlbGludXggd2l0aCAtRF9GSUxFX09GRlNFVF9CSVRTPTY0LAorCSAgKEl0IGlzIGRlZmF1bHQgaW4gbGlic2VsaW51eCdzIE1ha2VmaWxlKSwgeW91IF9tdXN0XyBlbmFibGUKKwkgIENPTkZJR19MRlMuCisKK2NvbmZpZyBGRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTgorCWJvb2wgIkVuYWJsZSBjaGVjayBvcHRpb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRVRGSUxFUworCWhlbHAKKwkgIFN1cHBvcnQgIi1jIiBvcHRpb24gKGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29udGV4dHMgYWdhaW5zdAorCSAgdGhlIHNwZWNpZmllZCBiaW5hcnkgcG9saWN5KSBmb3Igc2V0ZmlsZXMuIFJlcXVpcmVzIGxpYnNlcG9sLgorCitjb25maWcgU0VUU0VCT09MCisJYm9vbCAic2V0c2Vib29sIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBjaGFuZ2UgYm9vbGVhbi4KKwkgIHNlbWFuYWdlIGFuZCAtUCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisKK2NvbmZpZyBTRVNUQVRVUworCWJvb2wgInNlc3RhdHVzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIERpc3BsYXlzIHRoZSBzdGF0dXMgb2YgU0VMaW51eC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9LYnVpbGQuc3JjIGIvc2VsaW51eC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDVmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWxpbnV4L0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjIENvcHlyaWdodCAoQykgMjAwNyBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBrYWlnYWkuZ3IuanA+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQ0hDT04pCQkrPSBjaGNvbi5vCitsaWItJChDT05GSUdfR0VURU5GT1JDRSkJKz0gZ2V0ZW5mb3JjZS5vCitsaWItJChDT05GSUdfR0VUU0VCT09MKQkJKz0gZ2V0c2Vib29sLm8KK2xpYi0kKENPTkZJR19MT0FEX1BPTElDWSkJKz0gbG9hZF9wb2xpY3kubworbGliLSQoQ09ORklHX01BVENIUEFUSENPTikJKz0gbWF0Y2hwYXRoY29uLm8KK2xpYi0kKENPTkZJR19SVU5DT04pCQkrPSBydW5jb24ubworbGliLSQoQ09ORklHX1NFTElOVVhFTkFCTEVEKQkrPSBzZWxpbnV4ZW5hYmxlZC5vCitsaWItJChDT05GSUdfU0VURU5GT1JDRSkJKz0gc2V0ZW5mb3JjZS5vCitsaWItJChDT05GSUdfU0VURklMRVMpCQkrPSBzZXRmaWxlcy5vCitsaWItJChDT05GSUdfUkVTVE9SRUNPTikJKz0gc2V0ZmlsZXMubworbGliLSQoQ09ORklHX1NFVFNFQk9PTCkJCSs9IHNldHNlYm9vbC5vCitsaWItJChDT05GSUdfU0VTVEFUVVMpCQkrPSBzZXN0YXR1cy5vCmRpZmYgLS1naXQgYS9zZWxpbnV4L2NoY29uLmMgYi9zZWxpbnV4L2NoY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkMGNmZQotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvY2hjb24uYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGNoY29uIC0tIGNoYW5nZSBzZWN1cml0eSBjb250ZXh0LCBiYXNlZCBvbiBjb3JldXRpbHMtNS45Ny0xMworICoKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNoY29uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gQ09OVEVYVCBGSUxFLi4uIgorLy91c2FnZTogICAgICAgIlxuCWNoY29uIFtPUFRJT05TXSBbLXUgVVNFUl0gWy1yIFJPTEVdIFstbCBSQU5HRV0gWy10IFRZUEVdIEZJTEUuLi4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJcbgljaGNvbiBbT1BUSU9OU10gLS1yZWZlcmVuY2U9UkZJTEUgRklMRS4uLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSBjaGNvbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBlYWNoIEZJTEUgdG8gQ09OVEVYVFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jaGFuZ2VzCQlSZXBvcnQgY2hhbmdlcyBtYWRlIgorLy91c2FnZTogICAgICJcbgktaCwtLW5vLWRlcmVmZXJlbmNlCUFmZmVjdCBzeW1saW5rcyBpbnN0ZWFkIG9mIHRoZWlyIHRhcmdldHMiCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tc2lsZW50LC0tcXVpZXQJU3VwcHJlc3MgbW9zdCBlcnJvciBtZXNzYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1yZWZlcmVuY2U9UkZJTEUJVXNlIFJGSUxFJ3MgZ3JvdXAgaW5zdGVhZCBvZiB1c2luZyBhIENPTlRFWFQgdmFsdWUiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXNlcj1VU0VSCQlTZXQgdXNlci9yb2xlL3R5cGUvcmFuZ2UgaW4gdGhlIHRhcmdldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yb2xlPVJPTEUJCXNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdHlwZT1UWVBFIgorLy91c2FnZTogICAgICJcbgktbCwtLXJhbmdlPVJBTkdFIgorLy91c2FnZTogICAgICJcbgktUiwtLXJlY3Vyc2l2ZQkJUmVjdXJzZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJUmVwb3J0IGNoYW5nZXMgbWFkZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2YgdGhlaXIgdGFyZ2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJU3VwcHJlc3MgbW9zdCBlcnJvciBtZXNzYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglTZXQgdXNlci9yb2xlL3R5cGUvcmFuZ2UgaW4gdGhlIHRhcmdldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktciBST0xFIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFIgorLy91c2FnZTogICAgICJcbgktbCBSTkciCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlIDxzZWxpbnV4L2NvbnRleHQuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgT1BUX1JFQ1VSU0lWRQkJKDE8PDApCS8qICdSJyAqLworI2RlZmluZSBPUFRfQ0hBTkhFUwkJKDE8PDEpCS8qICdjJyAqLworI2RlZmluZSBPUFRfTk9ERVJFRkVSRU5DRQkoMTw8MikJLyogJ2gnICovCisjZGVmaW5lIE9QVF9RVUlFVAkJKDE8PDMpCS8qICdmJyAqLworI2RlZmluZSBPUFRfVVNFUgkJKDE8PDQpCS8qICd1JyAqLworI2RlZmluZSBPUFRfUk9MRQkJKDE8PDUpCS8qICdyJyAqLworI2RlZmluZSBPUFRfVFlQRQkJKDE8PDYpCS8qICd0JyAqLworI2RlZmluZSBPUFRfUkFOR0UJCSgxPDw3KQkvKiAnbCcgKi8KKyNkZWZpbmUgT1BUX1ZFUkJPU0UJCSgxPDw4KQkvKiAndicgKi8KKyNkZWZpbmUgT1BUX1JFRkVSRU5DRQkJKCgxPDw5KSAqIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUykKKyNkZWZpbmUgT1BUX0NPTVBPTkVOVF9TUEVDSUZJRUQJKE9QVF9VU0VSIHwgT1BUX1JPTEUgfCBPUFRfVFlQRSB8IE9QVF9SQU5HRSkKKworc3RhdGljIGNoYXIgKnVzZXIgPSBOVUxMOworc3RhdGljIGNoYXIgKnJvbGUgPSBOVUxMOworc3RhdGljIGNoYXIgKnR5cGUgPSBOVUxMOworc3RhdGljIGNoYXIgKnJhbmdlID0gTlVMTDsKK3N0YXRpYyBjaGFyICpzcGVjaWZpZWRfY29udGV4dCA9IE5VTEw7CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNoYW5nZV9maWxlZGlyX2NvbnRleHQoCisJCWNvbnN0IGNoYXIgKmZuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJY29udGV4dF90IGNvbnRleHQgPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCBmaWxlX2NvbnRleHQgPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0X3N0cmluZzsKKwlpbnQgcmMgPSBGQUxTRTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX05PREVSRUZFUkVOQ0UpIHsKKwkJc3RhdHVzID0gbGdldGZpbGVjb24oZm5hbWUsICZmaWxlX2NvbnRleHQpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGdldGZpbGVjb24oZm5hbWUsICZmaWxlX2NvbnRleHQpOworCX0KKwlpZiAoc3RhdHVzIDwgMCAmJiBlcnJubyAhPSBFTk9EQVRBKSB7CisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkgPT0gMCkKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3Qgb2J0YWluIHNlY3VyaXR5IGNvbnRleHQ6ICVzIiwgZm5hbWUpOworCQlnb3RvIHNraXA7CisJfQorCisJaWYgKGZpbGVfY29udGV4dCA9PSBOVUxMICYmIHNwZWNpZmllZF9jb250ZXh0ID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBhcHBseSBwYXJ0aWFsIGNvbnRleHQgdG8gdW5sYWJlbGVkIGZpbGUgJXMiLCBmbmFtZSk7CisJCWdvdG8gc2tpcDsKKwl9CisKKwlpZiAoc3BlY2lmaWVkX2NvbnRleHQgPT0gTlVMTCkgeworCQljb250ZXh0ID0gc2V0X3NlY3VyaXR5X2NvbnRleHRfY29tcG9uZW50KGZpbGVfY29udGV4dCwKKwkJCQkJCQkgdXNlciwgcm9sZSwgdHlwZSwgcmFuZ2UpOworCQlpZiAoIWNvbnRleHQpIHsKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY29tcHV0ZSBzZWN1cml0eSBjb250ZXh0IGZyb20gJXMiLCBmaWxlX2NvbnRleHQpOworCQkJZ290byBza2lwOworCQl9CisJfSBlbHNlIHsKKwkJY29udGV4dCA9IGNvbnRleHRfbmV3KHNwZWNpZmllZF9jb250ZXh0KTsKKwkJaWYgKCFjb250ZXh0KSB7CisJCQliYl9lcnJvcl9tc2coImludmFsaWQgY29udGV4dDogJXMiLCBzcGVjaWZpZWRfY29udGV4dCk7CisJCQlnb3RvIHNraXA7CisJCX0KKwl9CisKKwljb250ZXh0X3N0cmluZyA9IGNvbnRleHRfc3RyKGNvbnRleHQpOworCWlmICghY29udGV4dF9zdHJpbmcpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBvYnRhaW4gc2VjdXJpdHkgY29udGV4dCBpbiB0ZXh0IGV4cHJlc3Npb24iKTsKKwkJZ290byBza2lwOworCX0KKworCWlmIChmaWxlX2NvbnRleHQgPT0gTlVMTCB8fCBzdHJjbXAoY29udGV4dF9zdHJpbmcsIGZpbGVfY29udGV4dCkgIT0gMCkgeworCQlpbnQgZmFpbDsKKworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9OT0RFUkVGRVJFTkNFKSB7CisJCQlmYWlsID0gbHNldGZpbGVjb24oZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWZhaWwgPSBzZXRmaWxlY29uKGZuYW1lLCBjb250ZXh0X3N0cmluZyk7CisJCX0KKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX1ZFUkJPU0UpIHx8ICgob3B0aW9uX21hc2szMiAmIE9QVF9DSEFOSEVTKSAmJiAhZmFpbCkpIHsKKwkJCXByaW50ZighZmFpbAorCQkJICAgICAgID8gImNvbnRleHQgb2YgJXMgY2hhbmdlZCB0byAlc1xuIgorCQkJICAgICAgIDogImNhbid0IGNoYW5nZSBjb250ZXh0IG9mICVzIHRvICVzXG4iLAorCQkJICAgICAgIGZuYW1lLCBjb250ZXh0X3N0cmluZyk7CisJCX0KKwkJaWYgKCFmYWlsKSB7CisJCQlyYyA9IFRSVUU7CisJCX0gZWxzZSBpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfUVVJRVQpID09IDApIHsKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY2hhbmdlIGNvbnRleHQgb2YgJXMgdG8gJXMiLAorCQkJCSAgICAgZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJfQorCX0gZWxzZSBpZiAob3B0aW9uX21hc2szMiAmIE9QVF9WRVJCT1NFKSB7CisJCXByaW50ZigiY29udGV4dCBvZiAlcyByZXRhaW5lZCBhcyAlc1xuIiwgZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJcmMgPSBUUlVFOworCX0KK3NraXA6CisJY29udGV4dF9mcmVlKGNvbnRleHQpOworCWZyZWVjb24oZmlsZV9jb250ZXh0KTsKKworCXJldHVybiByYzsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgY2hjb25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJyZWN1cnNpdmVcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiUiIKKwkiY2hhbmdlc1wwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImMiCisJIm5vLWRlcmVmZXJlbmNlXDAiIE5vX2FyZ3VtZW50ICAgICAgICJoIgorCSJzaWxlbnRcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiZiIKKwkicXVpZXRcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJInVzZXJcMCIgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJyb2xlXDAiICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiciIKKwkidHlwZVwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInQiCisJInJhbmdlXDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJsIgorCSJ2ZXJib3NlXDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAidiIKKwkicmVmZXJlbmNlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmYiIC8qIG5vIHNob3J0IG9wdGlvbiAqLworCTsKKyNlbmRpZgorCitpbnQgY2hjb25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNoY29uX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpyZWZlcmVuY2VfZmlsZTsKKwljaGFyICpmbmFtZTsKKwlpbnQgaSwgZXJyb3JzID0gMDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBjaGNvbl9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiAgLyogYXQgbGVhc3QgMSBwYXJhbSAqLworCQkiOj8iICAvKiBlcnJvciBpZiBleGNsdXNpdml0eSBjb25zdHJhaW50cyBhcmUgdmlvbGF0ZWQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMKKwkJIjpceGZmLS11cnRsOnUtLVx4ZmY6ci0tXHhmZjp0LS1ceGZmOmwtLVx4ZmYiCisjZW5kaWYKKwkJIjpmLS12OnYtLWYiOyAgLyogJ3ZlcmJvc2UnIGFuZCAncXVpZXQnIGFyZSBleGNsdXNpdmUgKi8KKwlnZXRvcHQzMihhcmd2LCAiUmNoZnU6cjp0Omw6diIsCisJCSZ1c2VyLCAmcm9sZSwgJnR5cGUsICZyYW5nZSwgJnJlZmVyZW5jZV9maWxlKTsKKwlhcmd2ICs9IG9wdGluZDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1JFRkVSRU5DRSkgeworCQkvKiBGSVhNRTogbGdldGZpbGVjb24oKSBzaG91bGQgYmUgdXNlZCB3aGVuICctaCcgaXMgc3BlY2lmaWVkLgorCQkgICBCdXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBvcmlnaW5hbCBvbmUuICovCisJCWlmIChnZXRmaWxlY29uKHJlZmVyZW5jZV9maWxlLCAmc3BlY2lmaWVkX2NvbnRleHQpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0ZmlsZWNvbignJXMnKSBmYWlsZWQiLCByZWZlcmVuY2VfZmlsZSk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfQ09NUE9ORU5UX1NQRUNJRklFRCkgPT0gMCkgeworCQlzcGVjaWZpZWRfY29udGV4dCA9ICphcmd2Kys7CisJCS8qIHNwZWNpZmllZF9jb250ZXh0IGlzIG5ldmVyIE5VTEwgLQorCQkgKiAiLTEiIGluIG9wdF9jb21wbGVtZW50YXJ5IHByZXZlbnRzIHRoaXMuICovCisJCWlmICghYXJndlswXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gZmV3IGFyZ3VtZW50cyIpOworCX0KKworCWZvciAoaSA9IDA7IChmbmFtZSA9IGFyZ3ZbaV0pICE9IE5VTEw7IGkrKykgeworCQlpbnQgZm5hbWVfbGVuID0gc3RybGVuKGZuYW1lKTsKKwkJd2hpbGUgKGZuYW1lX2xlbiA+IDEgJiYgZm5hbWVbZm5hbWVfbGVuIC0gMV0gPT0gJy8nKQorCQkJZm5hbWVfbGVuLS07CisJCWZuYW1lW2ZuYW1lX2xlbl0gPSAnXDAnOworCisJCWlmIChyZWN1cnNpdmVfYWN0aW9uKGZuYW1lLAorCQkJCSAgICAgMTw8b3B0aW9uX21hc2szMiAmIE9QVF9SRUNVUlNJVkUsCisJCQkJICAgICBjaGFuZ2VfZmlsZWRpcl9jb250ZXh0LAorCQkJCSAgICAgY2hhbmdlX2ZpbGVkaXJfY29udGV4dCwKKwkJCQkgICAgIE5VTEwsIDApICE9IFRSVUUpCisJCQllcnJvcnMgPSAxOworCX0KKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9nZXRlbmZvcmNlLmMgYi9zZWxpbnV4L2dldGVuZm9yY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYxMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9nZXRlbmZvcmNlLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGdldGVuZm9yY2UKKyAqCisgKiBCYXNlZCBvbiBsaWJzZWxpbnV4IDEuMzMuMQorICogUG9ydCB0byBCdXN5Qm94ICBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0ZW5mb3JjZV90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZ2V0ZW5mb3JjZV9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZ2V0ZW5mb3JjZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ2V0ZW5mb3JjZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWludCByYzsKKworCXJjID0gaXNfc2VsaW51eF9lbmFibGVkKCk7CisJaWYgKHJjIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlzX3NlbGludXhfZW5hYmxlZCgpIGZhaWxlZCIpOworCisJaWYgKHJjID09IDEpIHsKKwkJcmMgPSBzZWN1cml0eV9nZXRlbmZvcmNlKCk7CisJCWlmIChyYyA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2V0ZW5mb3JjZSgpIGZhaWxlZCIpOworCisJCWlmIChyYykKKwkJCXB1dHMoIkVuZm9yY2luZyIpOworCQllbHNlCisJCQlwdXRzKCJQZXJtaXNzaXZlIik7CisJfSBlbHNlIHsKKwkJcHV0cygiRGlzYWJsZWQiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlbGludXgvZ2V0c2Vib29sLmMgYi9zZWxpbnV4L2dldHNlYm9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjBmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWxpbnV4L2dldHNlYm9vbC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBnZXRzZWJvb2wKKyAqCisgKiBCYXNlZCBvbiBsaWJzZWxpbnV4IDEuMzMuMQorICogUG9ydCB0byBCdXN5Qm94ICBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0c2Vib29sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItYSBvciBnZXRzZWJvb2wgYm9vbGVhbi4uLiIKKy8vdXNhZ2U6I2RlZmluZSBnZXRzZWJvb2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJU2hvdyBhbGwgc2VsaW51eCBib29sZWFucyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBnZXRzZWJvb2xfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGdldHNlYm9vbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmMgPSAwLCBhY3RpdmUsIHBlbmRpbmcsIGxlbiA9IDA7CisJY2hhciAqKm5hbWVzOworCXVuc2lnbmVkIG9wdDsKKworCXNlbGludXhfb3JfZGllKCk7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImEiKTsKKworCWlmIChvcHQpIHsgLyogLWEgKi8KKwkJaWYgKGFyZ2MgPiAyKQorCQkJYmJfc2hvd191c2FnZSgpOworCisJCXJjID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMoJm5hbWVzLCAmbGVuKTsKKwkJaWYgKHJjKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgYm9vbGVhbiBuYW1lcyIpOworCisJCWlmICghbGVuKSB7CisJCQlwdXRzKCJObyBib29sZWFucyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWxlbikgeworCQlpZiAoYXJnYyA8IDIpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWxlbiA9IGFyZ2MgLSAxOworCQluYW1lcyA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBsZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQluYW1lc1tpXSA9IHhzdHJkdXAoYXJndltpICsgMV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlhY3RpdmUgPSBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUobmFtZXNbaV0pOworCQlpZiAoYWN0aXZlIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgYWN0aXZlIHZhbHVlIGZvciAlcyIsIG5hbWVzW2ldKTsKKwkJfQorCQlwZW5kaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fcGVuZGluZyhuYW1lc1tpXSk7CisJCWlmIChwZW5kaW5nIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgcGVuZGluZyB2YWx1ZSBmb3IgJXMiLCBuYW1lc1tpXSk7CisJCX0KKwkJcHJpbnRmKCIlcyAtLT4gJXMiLCBuYW1lc1tpXSwgKGFjdGl2ZSA/ICJvbiIgOiAib2ZmIikpOworCQlpZiAocGVuZGluZyAhPSBhY3RpdmUpCisJCQlwcmludGYoIiBwZW5kaW5nOiAlcyIsIChwZW5kaW5nID8gIm9uIiA6ICJvZmYiKSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWZyZWUobmFtZXNbaV0pOworCQlmcmVlKG5hbWVzKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L2xvYWRfcG9saWN5LmMgYi9zZWxpbnV4L2xvYWRfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMzlkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvbG9hZF9wb2xpY3kuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogbG9hZF9wb2xpY3kKKyAqIEF1dGhvcjogWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9hZF9wb2xpY3lfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGxvYWRfcG9saWN5X2Z1bGxfdXNhZ2UgIiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBsb2FkX3BvbGljeV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9hZF9wb2xpY3lfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgcmM7CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJcmMgPSBzZWxpbnV4X21rbG9hZF9wb2xpY3koMSk7CisJaWYgKHJjIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGxvYWQgcG9saWN5Iik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L21hdGNocGF0aGNvbi5jIGIvc2VsaW51eC9tYXRjaHBhdGhjb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9tYXRjaHBhdGhjb24uYwpAQCAtMCwwICsxLDk3IEBACisvKiBtYXRjaHBhdGhjb24gIC0gIGdldCB0aGUgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICAgIHBhdGggZnJvbSB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uLgorICogICAgICAgICAgICAgICAgICBiYXNlZCBvbiBsaWJzZWxpbnV4LTEuMzIKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1hdGNocGF0aGNvbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1uXSBbLU5dIFstZiBmaWxlX2NvbnRleHRzX2ZpbGVdIFstcCBwcmVmaXhdIFstVl0iCisvL3VzYWdlOiNkZWZpbmUgbWF0Y2hwYXRoY29uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1uCURvbid0IGRpc3BsYXkgcGF0aCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JRG9uJ3QgdXNlIHRyYW5zbGF0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJVXNlIGFsdGVybmF0ZSBmaWxlX2NvbnRleHQgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJVXNlIHByZWZpeCB0byBzcGVlZCB0cmFuc2xhdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1WCVZlcmlmeSBmaWxlIGNvbnRleHQgb24gZGlzayBtYXRjaGVzIGRlZmF1bHRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGludCBwcmludF9tYXRjaHBhdGhjb24oY2hhciAqcGF0aCwgaW50IG5vcHJpbnQpCit7CisJY2hhciAqYnVmOworCWludCByYyA9IG1hdGNocGF0aGNvbihwYXRoLCAwLCAmYnVmKTsKKwlpZiAocmMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIm1hdGNocGF0aGNvbiglcykgZmFpbGVkIiwgcGF0aCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIW5vcHJpbnQpCisJCXByaW50ZigiJXNcdCVzXG4iLCBwYXRoLCBidWYpOworCWVsc2UKKwkJcHV0cyhidWYpOworCisJZnJlZWNvbihidWYpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE9QVF9OT1RfUFJJTlQgICAoMTw8MCkgIC8qIC1uICovCisjZGVmaW5lIE9QVF9OT1RfVFJBTlMgICAoMTw8MSkgIC8qIC1OICovCisjZGVmaW5lIE9QVF9GQ09OVEVYVCAgICAoMTw8MikgIC8qIC1mICovCisjZGVmaW5lIE9QVF9QUkVGSVggICAgICAoMTw8MykgIC8qIC1wICovCisjZGVmaW5lIE9QVF9WRVJJRlkgICAgICAoMTw8NCkgIC8qIC1WICovCisKK2ludCBtYXRjaHBhdGhjb25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1hdGNocGF0aGNvbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGVycm9yID0gMDsKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKmZjb250ZXh0LCAqcHJlZml4LCAqcGF0aDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiAvKiBhdCBsZWFzdCBvbmUgcGFyYW0gcmVxZCAqLworCQkiOj86Zi0tcDpwLS1mIjsgLyogbXV0dWFsbHkgZXhjbHVzaXZlICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJuTmY6cDpWIiwgJmZjb250ZXh0LCAmcHJlZml4KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHRzICYgT1BUX05PVF9UUkFOUykgeworCQlzZXRfbWF0Y2hwYXRoY29uX2ZsYWdzKE1BVENIUEFUSENPTl9OT1RSQU5TKTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfRkNPTlRFWFQpIHsKKwkJaWYgKG1hdGNocGF0aGNvbl9pbml0KGZjb250ZXh0KSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAlcyIsIGZjb250ZXh0KTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfUFJFRklYKSB7CisJCWlmIChtYXRjaHBhdGhjb25faW5pdF9wcmVmaXgoTlVMTCwgcHJlZml4KSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAlcyIsIHByZWZpeCk7CisJfQorCisJd2hpbGUgKChwYXRoID0gKmFyZ3YrKykgIT0gTlVMTCkgeworCQlzZWN1cml0eV9jb250ZXh0X3QgY29uOworCQlpbnQgcmM7CisKKwkJaWYgKCEob3B0cyAmIE9QVF9WRVJJRlkpKSB7CisJCQllcnJvciArPSBwcmludF9tYXRjaHBhdGhjb24ocGF0aCwgb3B0cyAmIE9QVF9OT1RfUFJJTlQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc2VsaW51eF9maWxlX2NvbnRleHRfdmVyaWZ5KHBhdGgsIDApKSB7CisJCQlwcmludGYoIiVzIHZlcmlmaWVkXG4iLCBwYXRoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG9wdHMgJiBPUFRfTk9UX1RSQU5TKQorCQkJcmMgPSBsZ2V0ZmlsZWNvbl9yYXcocGF0aCwgJmNvbik7CisJCWVsc2UKKwkJCXJjID0gbGdldGZpbGVjb24ocGF0aCwgJmNvbik7CisKKwkJaWYgKHJjID49IDApIHsKKwkJCXByaW50ZigiJXMgaGFzIGNvbnRleHQgJXMsIHNob3VsZCBiZSAiLCBwYXRoLCBjb24pOworCQkJZXJyb3IgKz0gcHJpbnRfbWF0Y2hwYXRoY29uKHBhdGgsIDEpOworCQkJZnJlZWNvbihjb24pOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJhY3R1YWwgY29udGV4dCB1bmtub3duOiAlcywgc2hvdWxkIGJlICIsIHN0cmVycm9yKGVycm5vKSk7CisJCWVycm9yICs9IHByaW50X21hdGNocGF0aGNvbihwYXRoLCAxKTsKKwl9CisJbWF0Y2hwYXRoY29uX2ZpbmkoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L3J1bmNvbi5jIGIvc2VsaW51eC9ydW5jb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgzYTIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9ydW5jb24uYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIHJ1bmNvbiBbIGNvbnRleHQgfAorICogICAgICAgICAoIFsgLWMgXSBbIC1yIHJvbGUgXSBbLXQgdHlwZV0gWyAtdSB1c2VyIF0gWyAtbCBsZXZlbHJhbmdlIF0gKQorICogICAgICAgICBjb21tYW5kIFthcmcxIFthcmcyIC4uLl0gXQorICoKKyAqIGF0dGVtcHQgdG8gcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KKyAqCisgKiAtciByb2xlICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCByb2xlCisgKiAtdCB0eXBlICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlCisgKiAtdSB1c2VyICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCB1c2VyCisgKiAtbCBsZXZlbCA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbCByYW5nZQorICogLWMgICAgICAgOiBjb21wdXRlIHByb2Nlc3MgdHJhbnNpdGlvbiBjb250ZXh0IGJlZm9yZSBtb2RpZnlpbmcKKyAqCisgKiBDb250ZXh0cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKyAqCisgKiBOdW1iZXIgb2YgICAgICAgTUxTCisgKiBjb21wb25lbnRzICAgIHN5c3RlbT8KKyAqCisgKiAgICAgMSAgICAgICAgICAgIC0gICAgICAgICB0eXBlCisgKiAgICAgMiAgICAgICAgICAgIC0gICAgICAgICByb2xlOnR5cGUKKyAqICAgICAzICAgICAgICAgICAgWSAgICAgICAgIHJvbGU6dHlwZTpyYW5nZQorICogICAgIDMgICAgICAgICAgICBOICAgICAgICAgdXNlcjpyb2xlOnR5cGUKKyAqICAgICA0ICAgICAgICAgICAgWSAgICAgICAgIHVzZXI6cm9sZTp0eXBlOnJhbmdlCisgKiAgICAgNCAgICAgICAgICAgIE4gICAgICAgICBlcnJvcgorICoKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICogICAgICAgICAgICAgICAgICAtIGJhc2VkIG9uIGNvcmV1dGlscy01Ljk3IChpbiBGZWRvcmEgQ29yZSA2KQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJ1bmNvbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jXSBbLXUgVVNFUl0gWy1yIFJPTEVdIFstdCBUWVBFXSBbLWwgUkFOR0VdIFBST0cgQVJHU1xuIgorLy91c2FnZTogICAgICAgInJ1bmNvbiBDT05URVhUIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBydW5jb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBpbiBhIGRpZmZlcmVudCBzZWN1cml0eSBjb250ZXh0XG4iCisvL3VzYWdlOiAgICAgIlxuCUNPTlRFWFQJCUNvbXBsZXRlIHNlY3VyaXR5IGNvbnRleHRcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jb21wdXRlCUNvbXB1dGUgcHJvY2VzcyB0cmFuc2l0aW9uIGNvbnRleHQgYmVmb3JlIG1vZGlmeWluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10eXBlPVRZUEUJVHlwZSAoZm9yIHNhbWUgcm9sZSBhcyBwYXJlbnQpIgorLy91c2FnZTogICAgICJcbgktdSwtLXVzZXI9VVNFUglVc2VyIGlkZW50aXR5IgorLy91c2FnZTogICAgICJcbgktciwtLXJvbGU9Uk9MRQlSb2xlIgorLy91c2FnZTogICAgICJcbgktbCwtLXJhbmdlPVJORwlMZXZlbHJhbmdlIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ29tcHV0ZSBwcm9jZXNzIHRyYW5zaXRpb24gY29udGV4dCBiZWZvcmUgbW9kaWZ5aW5nIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFCVR5cGUgKGZvciBzYW1lIHJvbGUgYXMgcGFyZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglVc2VyIGlkZW50aXR5IgorLy91c2FnZTogICAgICJcbgktciBST0xFCVJvbGUiCisvL3VzYWdlOiAgICAgIlxuCS1sIFJORwlMZXZlbHJhbmdlIgorLy91c2FnZToJKQorCisjaW5jbHVkZSA8c2VsaW51eC9jb250ZXh0Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnRleHRfdCBydW5jb25fY29tcHV0ZV9uZXdfY29udGV4dChjaGFyICp1c2VyLCBjaGFyICpyb2xlLCBjaGFyICp0eXBlLCBjaGFyICpyYW5nZSwKKwkJCQkJICAgIGNoYXIgKmNvbW1hbmQsIGludCBjb21wdXRlX3RyYW5zKQoreworCWNvbnRleHRfdCBjb247CisJc2VjdXJpdHlfY29udGV4dF90IGN1cl9jb250ZXh0OworCisJaWYgKGdldGNvbigmY3VyX2NvbnRleHQpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGN1cnJlbnQgY29udGV4dCIpOworCisJaWYgKGNvbXB1dGVfdHJhbnMpIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IGZpbGVfY29udGV4dCwgbmV3X2NvbnRleHQ7CisKKwkJaWYgKGdldGZpbGVjb24oY29tbWFuZCwgJmZpbGVfY29udGV4dCkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJldHJpZXZlIGF0dHJpYnV0ZXMgb2YgJyVzJyIsCisJCQkJCSAgICAgY29tbWFuZCk7CisJCWlmIChzZWN1cml0eV9jb21wdXRlX2NyZWF0ZShjdXJfY29udGV4dCwgZmlsZV9jb250ZXh0LAorCQkJCQkgICAgU0VDQ0xBU1NfUFJPQ0VTUywgJm5ld19jb250ZXh0KSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gY29tcHV0ZSBhIG5ldyBjb250ZXh0Iik7CisJCWN1cl9jb250ZXh0ID0gbmV3X2NvbnRleHQ7CisJfQorCisJY29uID0gY29udGV4dF9uZXcoY3VyX2NvbnRleHQpOworCWlmICghY29uKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCBjb250ZXh0IiwgY3VyX2NvbnRleHQpOworCWlmICh1c2VyICYmIGNvbnRleHRfdXNlcl9zZXQoY29uLCB1c2VyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBuZXcgdXNlciAnJXMnIiwgdXNlcik7CisJaWYgKHR5cGUgJiYgY29udGV4dF90eXBlX3NldChjb24sIHR5cGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG5ldyB0eXBlICclcyciLCB0eXBlKTsKKwlpZiAocmFuZ2UgJiYgY29udGV4dF9yYW5nZV9zZXQoY29uLCByYW5nZSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgbmV3IHJhbmdlICclcyciLCByYW5nZSk7CisJaWYgKHJvbGUgJiYgY29udGV4dF9yb2xlX3NldChjb24sIHJvbGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG5ldyByb2xlICclcyciLCByb2xlKTsKKworCXJldHVybiBjb247Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBydW5jb25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJ1c2VyXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJyb2xlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJyIgorCSJ0eXBlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJyYW5nZVwwIiAgIFJlcXVpcmVkX2FyZ3VtZW50ICJsIgorCSJjb21wdXRlXDAiIE5vX2FyZ3VtZW50ICJjIgorCSJoZWxwXDAiICAgIE5vX2FyZ3VtZW50ICJoIgorCTsKKyNlbmRpZgorCisjZGVmaW5lIE9QVFNfUk9MRQkoMTw8MCkJLyogciAqLworI2RlZmluZSBPUFRTX1RZUEUJKDE8PDEpCS8qIHQgKi8KKyNkZWZpbmUgT1BUU19VU0VSCSgxPDwyKQkvKiB1ICovCisjZGVmaW5lIE9QVFNfUkFOR0UJKDE8PDMpCS8qIGwgKi8KKyNkZWZpbmUgT1BUU19DT01QVVRFCSgxPDw0KQkvKiBjICovCisjZGVmaW5lIE9QVFNfSEVMUAkoMTw8NSkJLyogaCAqLworI2RlZmluZSBPUFRTX0NPTlRFWFRfQ09NUE9ORU5UCQkoT1BUU19ST0xFIHwgT1BUU19UWVBFIHwgT1BUU19VU0VSIHwgT1BUU19SQU5HRSkKKworaW50IHJ1bmNvbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVuY29uX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpyb2xlID0gTlVMTDsKKwljaGFyICpyYW5nZSA9IE5VTEw7CisJY2hhciAqdXNlciA9IE5VTEw7CisJY2hhciAqdHlwZSA9IE5VTEw7CisJY2hhciAqY29udGV4dCA9IE5VTEw7CisJdW5zaWduZWQgb3B0czsKKwljb250ZXh0X3QgY29uOworCisJc2VsaW51eF9vcl9kaWUoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gcnVuY29uX2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAicjp0OnU6bDpjaCIsICZyb2xlLCAmdHlwZSwgJnVzZXIsICZyYW5nZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIShvcHRzICYgT1BUU19DT05URVhUX0NPTVBPTkVOVCkpIHsKKwkJY29udGV4dCA9ICphcmd2Kys7CisJCWlmICghYXJndlswXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBjb21tYW5kIGdpdmVuIik7CisJfQorCisJaWYgKGNvbnRleHQpIHsKKwkJY29uID0gY29udGV4dF9uZXcoY29udGV4dCk7CisJCWlmICghY29uKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgaXMgbm90IGEgdmFsaWQgY29udGV4dCIsIGNvbnRleHQpOworCX0gZWxzZSB7CisJCWNvbiA9IHJ1bmNvbl9jb21wdXRlX25ld19jb250ZXh0KHVzZXIsIHJvbGUsIHR5cGUsIHJhbmdlLAorCQkJCWFyZ3ZbMF0sIG9wdHMgJiBPUFRTX0NPTVBVVEUpOworCX0KKworCWlmIChzZWN1cml0eV9jaGVja19jb250ZXh0KGNvbnRleHRfc3RyKGNvbikpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCBjb250ZXh0IiwKKwkJCQkgICAgIGNvbnRleHRfc3RyKGNvbikpOworCisJaWYgKHNldGV4ZWNjb24oY29udGV4dF9zdHIoY29uKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgdXAgc2VjdXJpdHkgY29udGV4dCAnJXMnIiwKKwkJCQkgICAgIGNvbnRleHRfc3RyKGNvbikpOworCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL3NlbGludXgvc2VsaW51eGVuYWJsZWQuYyBiL3NlbGludXgvc2VsaW51eGVuYWJsZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTgzMGRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9zZWxpbnV4ZW5hYmxlZC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBzZWxpbnV4ZW5hYmxlZAorICoKKyAqIEJhc2VkIG9uIGxpYnNlbGludXggMS4zMy4xCisgKiBQb3J0IHRvIEJ1c3lCb3ggIEhpcm9zaGkgU2hpbmppIDxzaGlyb3NoaUBteS5lbWFpbC5uZS5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZWxpbnV4ZW5hYmxlZF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgc2VsaW51eGVuYWJsZWRfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNlbGludXhlbmFibGVkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZWxpbnV4ZW5hYmxlZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAhaXNfc2VsaW51eF9lbmFibGVkKCk7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L3Nlc3RhdHVzLmMgYi9zZWxpbnV4L3Nlc3RhdHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMWEwZAotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvc2VzdGF0dXMuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIHNlc3RhdHVzIC0tIGRpc3BsYXlzIHRoZSBzdGF0dXMgb2YgU0VMaW51eAorICoKKyAqIFBvcnRlZCB0byBidXN5Ym94OiBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgS2FpR2FpIEtvaGVpIDxrYWlnYWlAYWsuanAubmVjLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXN0YXR1c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12Yl0iCisvL3VzYWdlOiNkZWZpbmUgc2VzdGF0dXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJRGlzcGxheSBjdXJyZW50IHN0YXRlIG9mIGJvb2xlYW5zIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZXh0ZXJuIGNoYXIgKnNlbGludXhfbW50OworCisjZGVmaW5lIE9QVF9WRVJCT1NFICAoMSA8PCAwKQorI2RlZmluZSBPUFRfQk9PTEVBTiAgKDEgPDwgMSkKKworI2RlZmluZSBDT0xfRk1UICAiJS0zMXMgIgorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2Jvb2xlYW4odm9pZCkKK3sKKwljaGFyICoqYm9vbHM7CisJaW50IGksIGFjdGl2ZSwgcGVuZGluZywgbmJvb2w7CisKKwlpZiAoc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMoJmJvb2xzLCAmbmJvb2wpIDwgMCkKKwkJcmV0dXJuOworCisJcHV0cygiXG5Qb2xpY3kgYm9vbGVhbnM6Iik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJvb2w7IGkrKykgeworCQlhY3RpdmUgPSBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUoYm9vbHNbaV0pOworCQlpZiAoYWN0aXZlIDwgMCkKKwkJCWdvdG8gc2tpcDsKKwkJcGVuZGluZyA9IHNlY3VyaXR5X2dldF9ib29sZWFuX3BlbmRpbmcoYm9vbHNbaV0pOworCQlpZiAocGVuZGluZyA8IDApCisJCQlnb3RvIHNraXA7CisJCXByaW50ZihDT0xfRk1UICIlcyIsCisJCSAgICAgICBib29sc1tpXSwgYWN0aXZlID09IDAgPyAib2ZmIiA6ICJvbiIpOworCQlpZiAoYWN0aXZlICE9IHBlbmRpbmcpCisJCQlwcmludGYoIiAoJXNhY3RpdmF0ZSBwZW5kaW5nKSIsIHBlbmRpbmcgPT0gMCA/ICJpbiIgOiAiIik7CisJCWJiX3B1dGNoYXIoJ1xuJyk7Cisgc2tpcDoKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShib29sc1tpXSk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShib29scyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfY29uZmlnKGNoYXIgKipwYywgaW50IG5wYywgY2hhciAqKmZjLCBpbnQgbmZjKQoreworCWNoYXIgKmJ1ZjsKKwlwYXJzZXJfdCAqcGFyc2VyOworCWludCBwY19vZnMgPSAwLCBmY19vZnMgPSAwLCBzZWN0aW9uID0gLTE7CisKKwlwY1swXSA9IGZjWzBdID0gTlVMTDsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKCIvZXRjL3Nlc3RhdHVzLmNvbmYiKTsKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCAmYnVmLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJaWYgKHN0cmNtcChidWYsICJbcHJvY2Vzc10iKSA9PSAwKSB7CisJCQlzZWN0aW9uID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYnVmLCAiW2ZpbGVzXSIpID09IDApIHsKKwkJCXNlY3Rpb24gPSAyOworCQl9IGVsc2UgeworCQkJaWYgKHNlY3Rpb24gPT0gMSAmJiBwY19vZnMgPCBucGMgLTEpIHsKKwkJCQlwY1twY19vZnMrK10gPSB4c3RyZHVwKGJ1Zik7CisJCQkJcGNbcGNfb2ZzXSA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKHNlY3Rpb24gPT0gMiAmJiBmY19vZnMgPCBuZmMgLSAxKSB7CisJCQkJZmNbZmNfb2ZzKytdID0geHN0cmR1cChidWYpOworCQkJCWZjW2ZjX29mc10gPSBOVUxMOworCQkJfQorCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3ZlcmJvc2Uodm9pZCkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgY29uLCBfY29uOworCWNoYXIgKmZjWzUwXSwgKnBjWzUwXSwgKmN0ZXJtOworCXBpZF90ICpwaWRMaXN0OworCWludCBpOworCisJcmVhZF9jb25maWcocGMsIEFSUkFZX1NJWkUocGMpLCBmYywgQVJSQVlfU0laRShmYykpOworCisJLyogcHJvY2VzcyBjb250ZXh0cyAqLworCXB1dHMoIlxuUHJvY2VzcyBjb250ZXh0czoiKTsKKworCS8qIGN1cnJlbnQgY29udGV4dCAqLworCWlmIChnZXRjb24oJmNvbikgPT0gMCkgeworCQlwcmludGYoQ09MX0ZNVCAiJXNcbiIsICJDdXJyZW50IGNvbnRleHQ6IiwgY29uKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KKwkvKiAvc2Jpbi9pbml0IGNvbnRleHQgKi8KKwlpZiAoZ2V0cGlkY29uKDEsICZjb24pID09IDApIHsKKwkJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiSW5pdCBjb250ZXh0OiIsIGNvbik7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWVjb24oY29uKTsKKwl9CisKKwkvKiBbcHJvY2Vzc10gY29udGV4dCAqLworCWZvciAoaSA9IDA7IHBjW2ldICE9IE5VTEw7IGkrKykgeworCQlwaWRMaXN0ID0gZmluZF9waWRfYnlfbmFtZShiYl9iYXNlbmFtZShwY1tpXSkpOworCQlpZiAocGlkTGlzdFswXSA+IDAgJiYgZ2V0cGlkY29uKHBpZExpc3RbMF0sICZjb24pID09IDApIHsKKwkJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgcGNbaV0sIGNvbik7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZWNvbihjb24pOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUocGlkTGlzdCk7CisJfQorCisJLyogZmlsZXMgY29udGV4dHMgKi8KKwlwdXRzKCJcbkZpbGUgY29udGV4dHM6Iik7CisKKwljdGVybSA9IHhtYWxsb2NfdHR5bmFtZSgwKTsKKy8vRklYTUU6IGlmIGN0ZXJtID09IE5VTEwsIHdlIHNlZ2ZhdWx0IT8/CisJcHV0cyhjdGVybSk7CisJaWYgKGN0ZXJtICYmIGxnZXRmaWxlY29uKGN0ZXJtLCAmY29uKSA+PSAwKSB7CisJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIkNvbnRyb2xsaW5nIHRlcm06IiwgY29uKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KKworCWZvciAoaSA9IDA7IGZjW2ldICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworCQlpZiAobGdldGZpbGVjb24oZmNbaV0sICZjb24pIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobHN0YXQoZmNbaV0sICZzdGJ1ZikgPT0gMCkgeworCQkJaWYgKFNfSVNMTksoc3RidWYuc3RfbW9kZSkpIHsKKwkJCQlpZiAoZ2V0ZmlsZWNvbihmY1tpXSwgJl9jb24pID49IDApIHsKKwkJCQkJcHJpbnRmKENPTF9GTVQgIiVzIC0+ICVzXG4iLCBmY1tpXSwgX2NvbiwgY29uKTsKKwkJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQkJZnJlZWNvbihfY29uKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgZmNbaV0sIGNvbik7CisJCQl9CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KK30KKworaW50IHNlc3RhdHVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXN0YXR1c19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwljb25zdCBjaGFyICpwb2xfcGF0aDsKKwlpbnQgcmM7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MCI7ICAvKiBubyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidmIiKTsKKworCS8qIFNFTGludXggc3RhdHVzOiBsaW5lICovCisJcmMgPSBpc19zZWxpbnV4X2VuYWJsZWQoKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycm9yOworCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIlNFTGludXggc3RhdHVzOiIsCisJICAgICAgIHJjID09IDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCS8qIFNFTGludXhmcyBtb3VudDogbGluZSAqLworCWlmICghc2VsaW51eF9tbnQpCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiU0VMaW51eGZzIG1vdW50OiIsCisJICAgICAgIHNlbGludXhfbW50KTsKKworCS8qIEN1cnJlbnQgbW9kZTogbGluZSAqLworCXJjID0gc2VjdXJpdHlfZ2V0ZW5mb3JjZSgpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiQ3VycmVudCBtb2RlOiIsCisJICAgICAgIHJjID09IDAgPyAicGVybWlzc2l2ZSIgOiAiZW5mb3JjaW5nIik7CisKKwkvKiBNb2RlIGZyb20gY29uZmlnIGZpbGU6IGxpbmUgKi8KKwlpZiAoc2VsaW51eF9nZXRlbmZvcmNlbW9kZSgmcmMpICE9IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiTW9kZSBmcm9tIGNvbmZpZyBmaWxlOiIsCisJICAgICAgIHJjIDwgMCA/ICJkaXNhYmxlZCIgOiAocmMgPT0gMCA/ICJwZXJtaXNzaXZlIiA6ICJlbmZvcmNpbmciKSk7CisKKwkvKiBQb2xpY3kgdmVyc2lvbjogbGluZSAqLworCXJjID0gc2VjdXJpdHlfcG9saWN5dmVycygpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiV1XG4iLCAiUG9saWN5IHZlcnNpb246IiwgcmMpOworCisJLyogUG9saWN5IGZyb20gY29uZmlnIGZpbGU6IGxpbmUgKi8KKwlwb2xfcGF0aCA9IHNlbGludXhfcG9saWN5X3Jvb3QoKTsKKwlpZiAoIXBvbF9wYXRoKQorCQlnb3RvIGVycm9yOworCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIlBvbGljeSBmcm9tIGNvbmZpZyBmaWxlOiIsCisJICAgICAgIGJiX2Jhc2VuYW1lKHBvbF9wYXRoKSk7CisKKwlpZiAob3B0cyAmIE9QVF9CT09MRUFOKQorCQlkaXNwbGF5X2Jvb2xlYW4oKTsKKwlpZiAob3B0cyAmIE9QVF9WRVJCT1NFKQorCQlkaXNwbGF5X3ZlcmJvc2UoKTsKKworCXJldHVybiAwOworCisgIGVycm9yOgorCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibGlic2VsaW51eCByZXR1cm5zIHVua25vd24gc3RhdGUiKTsKK30KZGlmZiAtLWdpdCBhL3NlbGludXgvc2V0ZW5mb3JjZS5jIGIvc2VsaW51eC9zZXRlbmZvcmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViYzBhNQotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvc2V0ZW5mb3JjZS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBzZXRlbmZvcmNlCisgKgorICogQmFzZWQgb24gbGlic2VsaW51eCAxLjMzLjEKKyAqIFBvcnQgdG8gQnVzeUJveCAgSGlyb3NoaSBTaGluamkgPHNoaXJvc2hpQG15LmVtYWlsLm5lLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldGVuZm9yY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltFbmZvcmNpbmcgfCBQZXJtaXNzaXZlIHwgMSB8IDBdIgorLy91c2FnZTojZGVmaW5lIHNldGVuZm9yY2VfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhlc2Ugc3RyaW5ncyBhcmUgYXJyYW5nZWQgc28gdGhhdCBvZGQgb25lcworICogcmVzdWx0IGluIHNlY3VyaXR5X3NldGVuZm9yY2UoMSkgYmVpbmcgZG9uZSwKKyAqIHRoZSByZXN0IHdpbGwgZG8gc2VjdXJpdHlfc2V0ZW5mb3JjZSgwKSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNldGVuZm9yY2VfY21kW10gPSB7CisJIjAiLAorCSIxIiwKKwkicGVybWlzc2l2ZSIsCisJImVuZm9yY2luZyIsCisJTlVMTCwKK307CisKK2ludCBzZXRlbmZvcmNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRlbmZvcmNlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmM7CisKKwlpZiAoIWFyZ3ZbMV0gfHwgYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJc2VsaW51eF9vcl9kaWUoKTsKKworCWZvciAoaSA9IDA7IHNldGVuZm9yY2VfY21kW2ldOyBpKyspIHsKKwkJaWYgKHN0cmNhc2VjbXAoYXJndlsxXSwgc2V0ZW5mb3JjZV9jbWRbaV0pICE9IDApCisJCQljb250aW51ZTsKKwkJcmMgPSBzZWN1cml0eV9zZXRlbmZvcmNlKGkgJiAxKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0ZW5mb3JjZSgpIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwliYl9zaG93X3VzYWdlKCk7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L3NldGZpbGVzLmMgYi9zZWxpbnV4L3NldGZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzZmQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvc2V0ZmlsZXMuYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAgc2V0ZmlsZXM6IGJhc2VkIG9uIHBvbGljeWNvcmV1dGlscyAyLjAuMTkKKyAgcG9saWN5Y29yZXV0aWxzIHdhcyByZWxlYXNlZCB1bmRlciBHUEwgMi4KKyAgUG9ydCB0byBCdXN5Qm94IChjKSAyMDA3IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorKi8KKworLy91c2FnZTojZGVmaW5lIHNldGZpbGVzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRucHFzdlddIFstZSBESVJdLi4uIFstbyBGSUxFXSBbLXIgYWx0X3Jvb3RfcGF0aF0iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTigKKy8vdXNhZ2U6ICAgICAgICIgWy1jIHBvbGljeWZpbGVdIHNwZWNfZmlsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAgICIgcGF0aG5hbWUiCisvL3VzYWdlOiNkZWZpbmUgc2V0ZmlsZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXNldCBmaWxlIGNvbnRleHRzIHVuZGVyIHBhdGhuYW1lIGFjY29yZGluZyB0byBzcGVjX2ZpbGVcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OKAorLy91c2FnZTogICAgICJcbgktYyBGSUxFCUNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29udGV4dHMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGJpbmFyeSBwb2xpY3kiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1kCVNob3cgd2hpY2ggc3BlY2lmaWNhdGlvbiBtYXRjaGVkIGVhY2ggZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9nIGNoYW5nZXMgaW4gZmlsZSBsYWJlbHMgdG8gc3lzbG9nIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBjaGFuZ2UgYW55IGZpbGUgbGFiZWxzIgorLy91c2FnZTogICAgICJcbgktcQlTdXBwcmVzcyB3YXJuaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgRElSCVVzZSBhbiBhbHRlcm5hdGUgcm9vdCBwYXRoIgorLy91c2FnZTogICAgICJcbgktZSBESVIJRXhjbHVkZSBESVIiCisvL3VzYWdlOiAgICAgIlxuCS1GCUZvcmNlIHJlc2V0IG9mIGNvbnRleHQgdG8gbWF0Y2ggZmlsZV9jb250ZXh0IGZvciBjdXN0b21pemFibGUgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS1vIEZJTEUJU2F2ZSBsaXN0IG9mIGZpbGVzIHdpdGggaW5jb3JyZWN0IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVRha2UgYSBsaXN0IG9mIGZpbGVzIGZyb20gc3RkaW4gKGluc3RlYWQgb2YgY29tbWFuZCBsaW5lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJU2hvdyBjaGFuZ2VzIGluIGZpbGUgbGFiZWxzLCBpZiB0eXBlIG9yIHJvbGUgYXJlIGNoYW5naW5nIgorLy91c2FnZTogICAgICJcbgktdnYJU2hvdyBjaGFuZ2VzIGluIGZpbGUgbGFiZWxzLCBpZiB0eXBlLCByb2xlLCBvciB1c2VyIGFyZSBjaGFuZ2luZyIKKy8vdXNhZ2U6ICAgICAiXG4JLVcJRGlzcGxheSB3YXJuaW5ncyBhYm91dCBlbnRyaWVzIHRoYXQgaGFkIG5vIG1hdGNoaW5nIGZpbGVzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSByZXN0b3JlY29uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWlGblJ2XSBbLWUgRVhDTFVERURJUl0uLi4gWy1vIEZJTEVdIFstZiBGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSByZXN0b3JlY29uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzZXQgc2VjdXJpdHkgY29udGV4dHMgb2YgZmlsZXMgaW4gcGF0aG5hbWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSWdub3JlIGZpbGVzIHRoYXQgZG9uJ3QgZXhpc3QiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJRmlsZSB3aXRoIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUgRElSCURpcmVjdG9yeSB0byBleGNsdWRlIgorLy91c2FnZTogICAgICJcbgktUiwtcglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBjaGFuZ2UgYW55IGZpbGUgbGFiZWxzIgorLy91c2FnZTogICAgICJcbgktbyBGSUxFCVNhdmUgbGlzdCBvZiBmaWxlcyB3aXRoIGluY29ycmVjdCBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdnYJU2hvdyBjaGFuZ2VkIGxhYmVscyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJRm9yY2UgcmVzZXQgb2YgY29udGV4dCB0byBtYXRjaCBmaWxlX2NvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCQlmb3IgY3VzdG9taXphYmxlIGZpbGVzLCBvciB0aGUgdXNlciBzZWN0aW9uLCIKKy8vdXNhZ2U6ICAgICAiXG4JCWlmIGl0IGhhcyBjaGFuZ2VkIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKyNpbmNsdWRlIDxzZXBvbC9zZXBvbC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0VYQ0xVREVTIDUwCisKK3N0cnVjdCBlZGlyIHsKKwljaGFyICpkaXJlY3Rvcnk7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJRklMRSAqb3V0ZmlsZTsKKwljaGFyICpwb2xpY3lmaWxlOworCWNoYXIgKnJvb3RwYXRoOworCWludCByb290cGF0aGxlbjsKKwl1bnNpZ25lZCBjb3VudDsKKwlpbnQgZXhjbHVkZUN0cjsKKwlpbnQgZXJyb3JzOworCWludCB2ZXJib3NlOyAvKiBnZXRvcHQzMiB1c2VzIGl0LCBoYXMgdG8gYmUgaW50ICovCisJc21hbGxpbnQgcmVjdXJzZTsgLyogUmVjdXJzaXZlIGRlc2NlbnQgKi8KKwlzbWFsbGludCBmb2xsb3dfbW91bnRzOworCS8qIEJlaGF2aW9yIGZsYWdzIGRldGVybWluZWQgYmFzZWQgb24gc2V0ZmlsZXMgdnMuIHJlc3RvcmVjb24gKi8KKwlzbWFsbGludCBleHBhbmRfcmVhbHBhdGg7ICAvKiBFeHBhbmQgcGF0aHMgdmlhIHJlYWxwYXRoICovCisJc21hbGxpbnQgYWJvcnRfb25fZXJyb3I7IC8qIEFib3J0IHRoZSBmaWxlIHRyZWUgd2FsayB1cG9uIGFuIGVycm9yICovCisJaW50IGFkZF9hc3NvYzsgLyogVHJhY2sgaW5vZGUgYXNzb2NpYXRpb25zIGZvciBjb25mbGljdCBkZXRlY3Rpb24gKi8KKwlpbnQgbWF0Y2hwYXRoY29uX2ZsYWdzOyAvKiBGbGFncyB0byBtYXRjaHBhdGhjb24gKi8KKwlkZXZfdCBkZXZfaWQ7IC8qIERldmljZSBpZCB3aGVyZSB0YXJnZXQgZmlsZSBleGlzdHMgKi8KKwlpbnQgbmVycjsKKwlzdHJ1Y3QgZWRpciBleGNsdWRlQXJyYXlbTUFYX0VYQ0xVREVTXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCit2b2lkIEJVR19zZXRmaWxlc19nbG9iYWxzX3Rvb19iaWcodm9pZCk7CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWlmIChzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSkgXAorCQlCVUdfc2V0ZmlsZXNfZ2xvYmFsc190b29fYmlnKCk7IFwKKwkvKiBtZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IC0gYWxyZWFkeSBpcyAqLyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBvdXRmaWxlICAgICAgICAgICAgKEcub3V0ZmlsZSAgICAgICAgICAgKQorI2RlZmluZSBwb2xpY3lmaWxlICAgICAgICAgKEcucG9saWN5ZmlsZSAgICAgICAgKQorI2RlZmluZSByb290cGF0aCAgICAgICAgICAgKEcucm9vdHBhdGggICAgICAgICAgKQorI2RlZmluZSByb290cGF0aGxlbiAgICAgICAgKEcucm9vdHBhdGhsZW4gICAgICAgKQorI2RlZmluZSBjb3VudCAgICAgICAgICAgICAgKEcuY291bnQgICAgICAgICAgICAgKQorI2RlZmluZSBleGNsdWRlQ3RyICAgICAgICAgKEcuZXhjbHVkZUN0ciAgICAgICAgKQorI2RlZmluZSBlcnJvcnMgICAgICAgICAgICAgKEcuZXJyb3JzICAgICAgICAgICAgKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAgKEcudmVyYm9zZSAgICAgICAgICAgKQorI2RlZmluZSByZWN1cnNlICAgICAgICAgICAgKEcucmVjdXJzZSAgICAgICAgICAgKQorI2RlZmluZSBmb2xsb3dfbW91bnRzICAgICAgKEcuZm9sbG93X21vdW50cyAgICAgKQorI2RlZmluZSBleHBhbmRfcmVhbHBhdGggICAgKEcuZXhwYW5kX3JlYWxwYXRoICAgKQorI2RlZmluZSBhYm9ydF9vbl9lcnJvciAgICAgKEcuYWJvcnRfb25fZXJyb3IgICAgKQorI2RlZmluZSBhZGRfYXNzb2MgICAgICAgICAgKEcuYWRkX2Fzc29jICAgICAgICAgKQorI2RlZmluZSBtYXRjaHBhdGhjb25fZmxhZ3MgKEcubWF0Y2hwYXRoY29uX2ZsYWdzKQorI2RlZmluZSBkZXZfaWQgICAgICAgICAgICAgKEcuZGV2X2lkICAgICAgICAgICAgKQorI2RlZmluZSBuZXJyICAgICAgICAgICAgICAgKEcubmVyciAgICAgICAgICAgICAgKQorI2RlZmluZSBleGNsdWRlQXJyYXkgICAgICAgKEcuZXhjbHVkZUFycmF5ICAgICAgKQorCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIHN0cmluZyEgKi8KK2VudW0geworCU9QVF9kID0gKDEgPDwgMCksCisJT1BUX2UgPSAoMSA8PCAxKSwKKwlPUFRfZiA9ICgxIDw8IDIpLAorCU9QVF9pID0gKDEgPDwgMyksCisJT1BUX2wgPSAoMSA8PCA0KSwKKwlPUFRfbiA9ICgxIDw8IDUpLAorCU9QVF9wID0gKDEgPDwgNiksCisJT1BUX3EgPSAoMSA8PCA3KSwKKwlPUFRfciA9ICgxIDw8IDgpLAorCU9QVF9zID0gKDEgPDwgOSksCisJT1BUX3YgPSAoMSA8PCAxMCksCisJT1BUX28gPSAoMSA8PCAxMSksCisJT1BUX0YgPSAoMSA8PCAxMiksCisJT1BUX1cgPSAoMSA8PCAxMyksCisJT1BUX2MgPSAoMSA8PCAxNCksIC8qIGMgb25seSBmb3Igc2V0ZmlsZXMgKi8KKwlPUFRfUiA9ICgxIDw8IDE0KSwgLyogUiBvbmx5IGZvciByZXN0b3JlY29uICovCit9OworI2RlZmluZSBGTEFHX2RfZGVidWcgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9kKQorI2RlZmluZSBGTEFHX2UgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9lKQorI2RlZmluZSBGTEFHX2YgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9mKQorI2RlZmluZSBGTEFHX2lfaWdub3JlX2Vub2VudCAob3B0aW9uX21hc2szMiAmIE9QVF9pKQorI2RlZmluZSBGTEFHX2xfdGFrZV9sb2cgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9sKQorI2RlZmluZSBGTEFHX25fZHJ5X3J1biAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9uKQorI2RlZmluZSBGTEFHX3BfcHJvZ3Jlc3MgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9wKQorI2RlZmluZSBGTEFHX3FfcXVpZXQgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9xKQorI2RlZmluZSBGTEFHX3IgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9yKQorI2RlZmluZSBGTEFHX3MgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBGTEFHX3YgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF92KQorI2RlZmluZSBGTEFHX28gICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9vKQorI2RlZmluZSBGTEFHX0ZfZm9yY2UgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9GKQorI2RlZmluZSBGTEFHX1dfd2Fybl9ub19tYXRjaCAob3B0aW9uX21hc2szMiAmIE9QVF9XKQorI2RlZmluZSBGTEFHX2MgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9jKQorI2RlZmluZSBGTEFHX1IgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9SKQorCisKK3N0YXRpYyB2b2lkIHFwcmludGYoY29uc3QgY2hhciAqZm10IFVOVVNFRF9QQVJBTSwgLi4uKQoreworCS8qIHF1aWV0LCBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGluY19lcnIodm9pZCkKK3sKKwluZXJyKys7CisJaWYgKG5lcnIgPiA5ICYmICFGTEFHX2RfZGVidWcpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImV4aXRpbmcgYWZ0ZXIgMTAgZXJyb3JzIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfZXhjbHVkZShjb25zdCBjaGFyICpkaXJlY3RvcnkpCit7CisJc3RydWN0IHN0YXQgc2I7CisJc2l6ZV90IGxlbjsKKworCWlmIChkaXJlY3RvcnkgPT0gTlVMTCB8fCBkaXJlY3RvcnlbMF0gIT0gJy8nKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmdWxsIHBhdGggcmVxdWlyZWQgZm9yIGV4Y2x1ZGU6ICVzIiwgZGlyZWN0b3J5KTsKKwl9CisJaWYgKGxzdGF0KGRpcmVjdG9yeSwgJnNiKSkgeworCQliYl9lcnJvcl9tc2coImRpcmVjdG9yeSBcIiVzXCIgbm90IGZvdW5kLCBpZ25vcmluZyIsIGRpcmVjdG9yeSk7CisJCXJldHVybjsKKwl9CisJaWYgKChzYi5zdF9tb2RlICYgU19JRkRJUikgPT0gMCkgeworCQliYl9lcnJvcl9tc2coIlwiJXNcIiBpcyBub3QgYSBkaXJlY3Rvcnk6IG1vZGUgJW8sIGlnbm9yaW5nIiwKKwkJCWRpcmVjdG9yeSwgc2Iuc3RfbW9kZSk7CisJCXJldHVybjsKKwl9CisJaWYgKGV4Y2x1ZGVDdHIgPT0gTUFYX0VYQ0xVREVTKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYXhpbXVtIGV4Y2x1ZGVzICVkIGV4Y2VlZGVkIiwgTUFYX0VYQ0xVREVTKTsKKwl9CisKKwlsZW4gPSBzdHJsZW4oZGlyZWN0b3J5KTsKKwl3aGlsZSAobGVuID4gMSAmJiBkaXJlY3RvcnlbbGVuIC0gMV0gPT0gJy8nKSB7CisJCWxlbi0tOworCX0KKwlleGNsdWRlQXJyYXlbZXhjbHVkZUN0cl0uZGlyZWN0b3J5ID0geHN0cm5kdXAoZGlyZWN0b3J5LCBsZW4pOworCWV4Y2x1ZGVBcnJheVtleGNsdWRlQ3RyKytdLnNpemUgPSBsZW47Cit9CisKK3N0YXRpYyBib29sIGV4Y2x1ZGUoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlpbnQgaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGV4Y2x1ZGVDdHI7IGkrKykgeworCQlpZiAoc3RybmNtcChmaWxlLCBleGNsdWRlQXJyYXlbaV0uZGlyZWN0b3J5LAorCQkJCQlleGNsdWRlQXJyYXlbaV0uc2l6ZSkgPT0gMCkgeworCQkJaWYgKGZpbGVbZXhjbHVkZUFycmF5W2ldLnNpemVdID09ICdcMCcKKwkJCSB8fCBmaWxlW2V4Y2x1ZGVBcnJheVtpXS5zaXplXSA9PSAnLycpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRjaChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc2IsIGNoYXIgKipjb24pCit7CisJaW50IHJldDsKKwljaGFyIHBhdGhbUEFUSF9NQVggKyAxXTsKKwljaGFyICp0bXBfcGF0aCA9IHhzdHJkdXAobmFtZSk7CisKKwlpZiAoZXhjbHVkZUN0ciA+IDAgJiYgZXhjbHVkZShuYW1lKSkgeworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gbHN0YXQobmFtZSwgc2IpOworCWlmIChyZXQpIHsKKwkJaWYgKEZMQUdfaV9pZ25vcmVfZW5vZW50ICYmIGVycm5vID09IEVOT0VOVCkgeworCQkJZnJlZSh0bXBfcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQliYl9lcnJvcl9tc2coInN0YXQoJXMpIiwgbmFtZSk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChleHBhbmRfcmVhbHBhdGgpIHsKKwkJaWYgKFNfSVNMTksoc2ItPnN0X21vZGUpKSB7CisJCQljaGFyICpwID0gTlVMTDsKKwkJCWNoYXIgKmZpbGVfc2VwOworCisJCQlzaXplX3QgbGVuID0gMDsKKworCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCWJiX2Vycm9yX21zZygid2FybmluZyEgJXMgcmVmZXJzIHRvIGEgc3ltYm9saWMgbGluaywgbm90IGZvbGxvd2luZyBsYXN0IGNvbXBvbmVudCIsIG5hbWUpOworCisJCQlmaWxlX3NlcCA9IHN0cnJjaHIodG1wX3BhdGgsICcvJyk7CisJCQlpZiAoZmlsZV9zZXAgPT0gdG1wX3BhdGgpIHsKKwkJCQlmaWxlX3NlcCsrOworCQkJCXBhdGhbMF0gPSAnXDAnOworCQkJCXAgPSBwYXRoOworCQkJfSBlbHNlIGlmIChmaWxlX3NlcCkgeworCQkJCSpmaWxlX3NlcCsrID0gJ1wwJzsKKwkJCQlwID0gcmVhbHBhdGgodG1wX3BhdGgsIHBhdGgpOworCQkJfSBlbHNlIHsKKwkJCQlmaWxlX3NlcCA9IHRtcF9wYXRoOworCQkJCXAgPSByZWFscGF0aCgiLi8iLCBwYXRoKTsKKwkJCX0KKwkJCWlmIChwKQorCQkJCWxlbiA9IHN0cmxlbihwKTsKKwkJCWlmICghcCB8fCBsZW4gKyBzdHJsZW4oZmlsZV9zZXApICsgMiA+IFBBVEhfTUFYKSB7CisJCQkJYmJfcGVycm9yX21zZygicmVhbHBhdGgoJXMpIGZhaWxlZCIsIG5hbWUpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJcCArPSBsZW47CisJCQkvKiBlbnN1cmUgdHJhaWxpbmcgc2xhc2ggb2YgZGlyZWN0b3J5IG5hbWUgKi8KKwkJCWlmIChsZW4gPT0gMCB8fCBwWy0xXSAhPSAnLycpIHsKKwkJCQkqcCsrID0gJy8nOworCQkJfQorCQkJc3RyY3B5KHAsIGZpbGVfc2VwKTsKKwkJCW5hbWUgPSBwYXRoOworCQkJaWYgKGV4Y2x1ZGVDdHIgPiAwICYmIGV4Y2x1ZGUobmFtZSkpCisJCQkJZ290byBlcnI7CisKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKnA7CisJCQlwID0gcmVhbHBhdGgobmFtZSwgcGF0aCk7CisJCQlpZiAoIXApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWFscGF0aCglcykiLCBuYW1lKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCW5hbWUgPSBwOworCQkJaWYgKGV4Y2x1ZGVDdHIgPiAwICYmIGV4Y2x1ZGUobmFtZSkpCisJCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKiBuYW1lIHdpbGwgYmUgd2hhdCBpcyBtYXRjaGVkIGluIHRoZSBwb2xpY3kgKi8KKwlpZiAoTlVMTCAhPSByb290cGF0aCkgeworCQlpZiAoMCAhPSBzdHJuY21wKHJvb3RwYXRoLCBuYW1lLCByb290cGF0aGxlbikpIHsKKwkJCWJiX2Vycm9yX21zZygiJXMgaXMgbm90IGxvY2F0ZWQgaW4gJXMiLAorCQkJCW5hbWUsIHJvb3RwYXRoKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW5hbWUgKz0gcm9vdHBhdGhsZW47CisJfQorCisJZnJlZSh0bXBfcGF0aCk7CisJaWYgKHJvb3RwYXRoICE9IE5VTEwgJiYgbmFtZVswXSA9PSAnXDAnKQorCQkvKiB0aGlzIGlzIGFjdHVhbGx5IHRoZSByb290IGRpciBvZiB0aGUgYWx0IHJvb3QgKi8KKwkJcmV0dXJuIG1hdGNocGF0aGNvbl9pbmRleCgiLyIsIHNiLT5zdF9tb2RlLCBjb24pOworCXJldHVybiBtYXRjaHBhdGhjb25faW5kZXgobmFtZSwgc2ItPnN0X21vZGUsIGNvbik7CisgZXJyOgorCWZyZWUodG1wX3BhdGgpOworCXJldHVybiAtMTsKK30KKworLyogQ29tcGFyZSB0d28gY29udGV4dHMgdG8gc2VlIGlmIHRoZWlyIGRpZmZlcmVuY2VzIGFyZSAic2lnbmlmaWNhbnQiLAorICogb3Igd2hldGhlciB0aGUgb25seSBkaWZmZXJlbmNlIGlzIGluIHRoZSB1c2VyLiAqLworc3RhdGljIGJvb2wgb25seV9jaGFuZ2VkX3VzZXIoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwlpZiAoRkxBR19GX2ZvcmNlKQorCQlyZXR1cm4gMDsKKwlpZiAoIWEgfHwgIWIpCisJCXJldHVybiAwOworCWEgPSBzdHJjaHIoYSwgJzonKTsgLyogUmVzdCBvZiB0aGUgY29udGV4dCBhZnRlciB0aGUgdXNlciAqLworCWIgPSBzdHJjaHIoYiwgJzonKTsKKwlpZiAoIWEgfHwgIWIpCisJCXJldHVybiAwOworCXJldHVybiAoc3RyY21wKGEsIGIpID09IDApOworfQorCitzdGF0aWMgaW50IHJlc3RvcmUoY29uc3QgY2hhciAqZmlsZSkKK3sKKwljaGFyICpteV9maWxlOworCXN0cnVjdCBzdGF0IG15X3NiOworCWludCBpLCBqLCByZXQ7CisJY2hhciAqY29udGV4dCA9IE5VTEw7CisJY2hhciAqbmV3Y29uID0gTlVMTDsKKwlib29sIHVzZXJfb25seV9jaGFuZ2VkID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCW15X2ZpbGUgPSBiYl9zaW1wbGlmeV9wYXRoKGZpbGUpOworCisJaSA9IG1hdGNoKG15X2ZpbGUsICZteV9zYiwgJm5ld2Nvbik7CisKKwlpZiAoaSA8IDApIC8qIE5vIG1hdGNoaW5nIHNwZWNpZmljYXRpb24uICovCisJCWdvdG8gb3V0OworCisJaWYgKEZMQUdfcF9wcm9ncmVzcykgeworCQljb3VudCsrOworCQlpZiAoY291bnQgJSAweDQwMCA9PSAwKSB7IC8qIGV2ZXJ5IDEwMjQgdGltZXMgKi8KKwkJCWNvdW50ID0gKGNvdW50ICUgKDgwKjB4NDAwKSk7CisJCQlpZiAoY291bnQgPT0gMCkKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJYmJfcHV0Y2hhcignKicpOworCQkJZmZsdXNoX2FsbCgpOworCQl9CisJfQorCisJLyoKKwkgKiBUcnkgdG8gYWRkIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhpcyBpbm9kZSBhbmQKKwkgKiB0aGlzIHNwZWNpZmljYXRpb24uIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gYXNzb2NpYXRpb24KKwkgKiBmb3IgdGhpcyBpbm9kZSBhbmQgaXQgY29uZmxpY3RzIHdpdGggdGhpcyBzcGVjaWZpY2F0aW9uLAorCSAqIHRoZW4gdXNlIHRoZSBsYXN0IG1hdGNoaW5nIHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKGFkZF9hc3NvYykgeworCQlqID0gbWF0Y2hwYXRoY29uX2ZpbGVzcGVjX2FkZChteV9zYi5zdF9pbm8sIGksIG15X2ZpbGUpOworCQlpZiAoaiA8IDApCisJCQlnb3RvIGVycjsKKworCQlpZiAoaiAhPSBpKSB7CisJCQkvKiBUaGVyZSB3YXMgYWxyZWFkeSBhbiBhc3NvY2lhdGlvbiBhbmQgaXQgdG9vayBwcmVjZWRlbmNlLiAqLworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoRkxBR19kX2RlYnVnKQorCQlwcmludGYoIiVzOiAlcyBtYXRjaGVkIGJ5ICVzXG4iLCBhcHBsZXRfbmFtZSwgbXlfZmlsZSwgbmV3Y29uKTsKKworCS8qIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBmaWxlLiAqLworCXJldCA9IGxnZXRmaWxlY29uX3JhdyhteV9maWxlLCAmY29udGV4dCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVOT0RBVEEpIHsKKwkJCWNvbnRleHQgPSBOVUxMOyAvKiBwYXJhbm9pYSAqLworCQl9IGVsc2UgeworCQkJYmJfcGVycm9yX21zZygibGdldGZpbGVjb25fcmF3IG9uICVzIiwgbXlfZmlsZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl1c2VyX29ubHlfY2hhbmdlZCA9IDA7CisJfSBlbHNlCisJCXVzZXJfb25seV9jaGFuZ2VkID0gb25seV9jaGFuZ2VkX3VzZXIoY29udGV4dCwgbmV3Y29uKTsKKworCS8qCisJICogRG8gbm90IHJlbGFiZWwgdGhlIGZpbGUgaWYgdGhlIG1hdGNoaW5nIHNwZWNpZmljYXRpb24gaXMKKwkgKiA8PG5vbmU+PiBvciB0aGUgZmlsZSBpcyBhbHJlYWR5IGxhYmVsZWQgYWNjb3JkaW5nIHRvIHRoZQorCSAqIHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKChzdHJjbXAobmV3Y29uLCAiPDxub25lPj4iKSA9PSAwKQorCSB8fCAoY29udGV4dCAmJiAoc3RyY21wKGNvbnRleHQsIG5ld2NvbikgPT0gMCkgJiYgIUZMQUdfRl9mb3JjZSkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFGTEFHX0ZfZm9yY2UgJiYgY29udGV4dCAmJiAoaXNfY29udGV4dF9jdXN0b21pemFibGUoY29udGV4dCkgPiAwKSkgeworCQlpZiAodmVyYm9zZSA+IDEpIHsKKwkJCWJiX2Vycm9yX21zZygic2tpcHBpbmcgJXMuICVzIGlzIGN1c3RvbWl6YWJsZV90eXBlcyIsCisJCQkJbXlfZmlsZSwgY29udGV4dCk7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHZlcmJvc2UpIHsKKwkJLyogSWYgd2UncmUganVzdCBkb2luZyAiLXYiLCB0cmltIG91dCBhbnkgcmVsYWJlbHMgd2hlcmUKKwkJICogdGhlIHVzZXIgaGFzIGNoYW5nZWQgYnV0IHRoZSByb2xlIGFuZCB0eXBlIGFyZSB0aGUKKwkJICogc2FtZS4gIEZvciAiLXZ2IiwgZW1pdCBldmVyeXRoaW5nLiAqLworCQlpZiAodmVyYm9zZSA+IDEgfHwgIXVzZXJfb25seV9jaGFuZ2VkKSB7CisJCQliYl9pbmZvX21zZygiJXM6IHJlc2V0ICVzIGNvbnRleHQgJXMtPiVzIiwKKwkJCQlhcHBsZXRfbmFtZSwgbXlfZmlsZSwgY29udGV4dCA/IGNvbnRleHQgOiAiIiwgbmV3Y29uKTsKKwkJfQorCX0KKworCWlmIChGTEFHX2xfdGFrZV9sb2cgJiYgIXVzZXJfb25seV9jaGFuZ2VkKSB7CisJCWlmIChjb250ZXh0KQorCQkJYmJfaW5mb19tc2coInJlbGFiZWxpbmcgJXMgZnJvbSAlcyB0byAlcyIsIG15X2ZpbGUsIGNvbnRleHQsIG5ld2Nvbik7CisJCWVsc2UKKwkJCWJiX2luZm9fbXNnKCJsYWJlbGluZyAlcyB0byAlcyIsIG15X2ZpbGUsIG5ld2Nvbik7CisJfQorCisJaWYgKG91dGZpbGUgJiYgIXVzZXJfb25seV9jaGFuZ2VkKQorCQlmcHJpbnRmKG91dGZpbGUsICIlc1xuIiwgbXlfZmlsZSk7CisKKwkvKgorCSAqIERvIG5vdCByZWxhYmVsIHRoZSBmaWxlIGlmIC1uIHdhcyB1c2VkLgorCSAqLworCWlmIChGTEFHX25fZHJ5X3J1biB8fCB1c2VyX29ubHlfY2hhbmdlZCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFJlbGFiZWwgdGhlIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LgorCSAqLworCXJldCA9IGxzZXRmaWxlY29uKG15X2ZpbGUsIG5ld2Nvbik7CisJaWYgKHJldCkgeworCQliYl9wZXJyb3JfbXNnKCJsc2V0ZmlsZWNvbm9uKCVzLCVzKSIsIG15X2ZpbGUsIG5ld2Nvbik7CisJCWdvdG8gZXJyOworCX0KKworIG91dDoKKwlmcmVlY29uKGNvbnRleHQpOworCWZyZWVjb24obmV3Y29uKTsKKwlmcmVlKG15X2ZpbGUpOworCXJldHVybiByZXR2YWw7CisgZXJyOgorCXJldHZhbC0tOyAvKiAtMSAqLworCWdvdG8gb3V0OworfQorCisvKgorICogQXBwbHkgdGhlIGxhc3QgbWF0Y2hpbmcgc3BlY2lmaWNhdGlvbiB0byBhIGZpbGUuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWN1cnNpdmVfYWN0aW9uIG9uIGVhY2ggZmlsZSBkdXJpbmcKKyAqIHRoZSBkaXJlY3RvcnkgdHJhdmVyc2FsLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBhcHBseV9zcGVjKAorCQljb25zdCBjaGFyICpmaWxlLAorCQlzdHJ1Y3Qgc3RhdCAqc2IsCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlpZiAoIWZvbGxvd19tb3VudHMpIHsKKwkJLyogc2V0ZmlsZXMgZG9lcyBub3QgcHJvY2VzcyBhY3Jvc3MgZGlmZmVyZW50IG1vdW50IHBvaW50cyAqLworCQlpZiAoc2ItPnN0X2RldiAhPSBkZXZfaWQpIHsKKwkJCXJldHVybiBTS0lQOworCQl9CisJfQorCWVycm9ycyB8PSByZXN0b3JlKGZpbGUpOworCWlmIChhYm9ydF9vbl9lcnJvciAmJiBlcnJvcnMpCisJCXJldHVybiBGQUxTRTsKKwlyZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgaW50IGNhbm9uY29uKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGxpbmVubywgY2hhciAqKmNvbnRleHRwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGVycl9tc2dbXSBBTElHTjEgPSAiJXM6IGxpbmUgJXUgaGFzIGludmFsaWQgY29udGV4dCAlcyI7CisKKwljaGFyICp0bXBjb247CisJY2hhciAqY29udGV4dCA9ICpjb250ZXh0cDsKKwlpbnQgaW52YWxpZCA9IDA7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKwlpZiAocG9saWN5ZmlsZSkgeworCQlpZiAoc2Vwb2xfY2hlY2tfY29udGV4dChjb250ZXh0KSA+PSAwKQorCQkJcmV0dXJuIDA7CisJCS8qIEV4aXQgaW1tZWRpYXRlbHkgaWYgd2UncmUgaW4gY2hlY2tpbmcgbW9kZS4gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoZXJyX21zZywgcGF0aCwgbGluZW5vLCBjb250ZXh0KTsKKwl9CisjZW5kaWYKKworCWlmIChzZWN1cml0eV9jYW5vbmljYWxpemVfY29udGV4dF9yYXcoY29udGV4dCwgJnRtcGNvbikgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWludmFsaWQgPSAxOworCQkJaW5jX2VycigpOworCQl9CisJfSBlbHNlIHsKKwkJZnJlZShjb250ZXh0KTsKKwkJKmNvbnRleHRwID0gdG1wY29uOworCX0KKworCWlmIChpbnZhbGlkKSB7CisJCWJiX2Vycm9yX21zZyhlcnJfbXNnLCBwYXRoLCBsaW5lbm8sIGNvbnRleHQpOworCX0KKworCXJldHVybiBpbnZhbGlkOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfb25lKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXQgc2I7CisJaW50IHJjOworCisJcmMgPSBsc3RhdChuYW1lLCAmc2IpOworCWlmIChyYyA8IDApIHsKKwkJaWYgKEZMQUdfaV9pZ25vcmVfZW5vZW50ICYmIGVycm5vID09IEVOT0VOVCkKKwkJCXJldHVybiAwOworCQliYl9wZXJyb3JfbXNnKCJzdGF0KCVzKSIsIG5hbWUpOworCQlnb3RvIGVycjsKKwl9CisJZGV2X2lkID0gc2Iuc3RfZGV2OworCisJaWYgKFNfSVNESVIoc2Iuc3RfbW9kZSkgJiYgcmVjdXJzZSkgeworCQlpZiAocmVjdXJzaXZlX2FjdGlvbihuYW1lLAorCQkJCSAgICAgQUNUSU9OX1JFQ1VSU0UsCisJCQkJICAgICBhcHBseV9zcGVjLAorCQkJCSAgICAgYXBwbHlfc3BlYywKKwkJCQkgICAgIE5VTEwsIDApICE9IFRSVUUpIHsKKwkJCWJiX2Vycm9yX21zZygiZXJyb3Igd2hpbGUgbGFiZWxpbmcgJXMiLCBuYW1lKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSByZXN0b3JlKG5hbWUpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKKwl9CisKKyBvdXQ6CisJaWYgKGFkZF9hc3NvYykgeworCQlpZiAoRkxBR19xX3F1aWV0KQorCQkJc2V0X21hdGNocGF0aGNvbl9wcmludGYoJnFwcmludGYpOworCQltYXRjaHBhdGhjb25fZmlsZXNwZWNfZXZhbCgpOworCQlzZXRfbWF0Y2hwYXRoY29uX3ByaW50ZihOVUxMKTsKKwkJbWF0Y2hwYXRoY29uX2ZpbGVzcGVjX2Rlc3Ryb3koKTsKKwl9CisKKwlyZXR1cm4gcmM7CisKKyBlcnI6CisJcmMgPSAtMTsKKwlnb3RvIG91dDsKK30KKworaW50IHNldGZpbGVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRmaWxlc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc2I7CisJaW50IHJjLCBpID0gMDsKKwljb25zdCBjaGFyICppbnB1dF9maWxlbmFtZSA9IE5VTEw7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3QgYnVmX2xlbjsKKwlpbnQgZmxhZ3M7CisJbGxpc3RfdCAqZXhjbHVkZV9kaXIgPSBOVUxMOworCWNoYXIgKm91dF9maWxlbmFtZSA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAncycpIHsgLyogInNldGZpbGVzIiAqLworCQkvKgorCQkgKiBzZXRmaWxlczoKKwkJICogUmVjdXJzaXZlIGRlc2NlbnQsCisJCSAqIERvZXMgbm90IGV4cGFuZCBwYXRocyB2aWEgcmVhbHBhdGgsCisJCSAqIEFib3J0cyBvbiBlcnJvcnMgZHVyaW5nIHRoZSBmaWxlIHRyZWUgd2FsaywKKwkJICogVHJ5IHRvIHRyYWNrIGlub2RlIGFzc29jaWF0aW9ucyBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uLAorCQkgKiBEb2VzIG5vdCBmb2xsb3cgbW91bnRzLAorCQkgKiBWYWxpZGF0ZXMgYWxsIGZpbGUgY29udGV4dHMgYXQgaW5pdCB0aW1lLgorCQkgKi8KKwkJcmVjdXJzZSA9IDE7CisJCWFib3J0X29uX2Vycm9yID0gMTsKKwkJYWRkX2Fzc29jID0gMTsKKwkJLyogZm9sbG93X21vdW50cyA9IDA7IC0gYWxyZWFkeSBpcyAqLworCQltYXRjaHBhdGhjb25fZmxhZ3MgPSBNQVRDSFBBVEhDT05fVkFMSURBVEUgfCBNQVRDSFBBVEhDT05fTk9UUkFOUzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiByZXN0b3JlY29uOgorCQkgKiBObyByZWN1cnNpdmUgZGVzY2VudCB1bmxlc3MgLXIvLVIsCisJCSAqIEV4cGFuZHMgcGF0aHMgdmlhIHJlYWxwYXRoLAorCQkgKiBEbyBub3QgYWJvcnQgb24gZXJyb3JzIGR1cmluZyB0aGUgZmlsZSB0cmVlIHdhbGssCisJCSAqIERvIG5vdCB0cnkgdG8gdHJhY2sgaW5vZGUgYXNzb2NpYXRpb25zIGZvciBjb25mbGljdCBkZXRlY3Rpb24sCisJCSAqIEZvbGxvd3MgbW91bnRzLAorCQkgKiBEb2VzIGxhenkgdmFsaWRhdGlvbiBvZiBjb250ZXh0cyB1cG9uIHVzZS4KKwkJICovCisJCWV4cGFuZF9yZWFscGF0aCA9IDE7CisJCWZvbGxvd19tb3VudHMgPSAxOworCQltYXRjaHBhdGhjb25fZmxhZ3MgPSBNQVRDSFBBVEhDT05fTk9UUkFOUzsKKwkJLyogcmVzdG9yZWNvbiBvbmx5ICovCisJCXNlbGludXhfb3JfZGllKCk7CisJfQorCisJc2V0X21hdGNocGF0aGNvbl9mbGFncyhtYXRjaHBhdGhjb25fZmxhZ3MpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZTo6dnY6di0tcDpwLS12OnYtLXE6cS0tdiI7CisJLyogT3B0aW9uIG9yZGVyIG11c3QgbWF0Y2ggT1BUX3ggZGVmaW5pdGlvbnMhICovCisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdyJykgeyAvKiByZXN0b3JlY29uICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImRlOmY6aWxucHFyc3ZvOkZXUiIsCisJCQkmZXhjbHVkZV9kaXIsICZpbnB1dF9maWxlbmFtZSwgJm91dF9maWxlbmFtZSwgJnZlcmJvc2UpOworCX0gZWxzZSB7IC8qIHNldGZpbGVzICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImRlOmY6aWxucHFyOnN2bzpGVyIKKwkJCQlJRl9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTigiYzoiKSwKKwkJCSZleGNsdWRlX2RpciwgJmlucHV0X2ZpbGVuYW1lLCAmcm9vdHBhdGgsICZvdXRfZmlsZW5hbWUsCisJCQkJIElGX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OKCZwb2xpY3lmaWxlLCkKKwkJCSZ2ZXJib3NlKTsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKwlpZiAoKGFwcGxldF9uYW1lWzBdID09ICdzJykgJiYgKGZsYWdzICYgT1BUX2MpKSB7CisJCUZJTEUgKnBvbGljeXN0cmVhbTsKKworCQlwb2xpY3lzdHJlYW0gPSB4Zm9wZW5fZm9yX3JlYWQocG9saWN5ZmlsZSk7CisJCWlmIChzZXBvbF9zZXRfcG9saWN5ZGJfZnJvbV9maWxlKHBvbGljeXN0cmVhbSkgPCAwKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2Vwb2xfc2V0X3BvbGljeWRiX2Zyb21fZmlsZSBvbiAlcyIsIHBvbGljeWZpbGUpOworCQl9CisJCWZjbG9zZShwb2xpY3lzdHJlYW0pOworCisJCS8qIE9ubHkgcHJvY2VzcyB0aGUgc3BlY2lmaWVkIGZpbGVfY29udGV4dHMgZmlsZSwgbm90CisJCSAgIGFueSAuaG9tZWRpcnMgb3IgLmxvY2FsIGZpbGVzLCBhbmQgZG8gbm90IHBlcmZvcm0KKwkJICAgY29udGV4dCB0cmFuc2xhdGlvbnMuICovCisJCXNldF9tYXRjaHBhdGhjb25fZmxhZ3MoTUFUQ0hQQVRIQ09OX0JBU0VPTkxZIHwKKwkJCQkgICAgICAgTUFUQ0hQQVRIQ09OX05PVFJBTlMgfAorCQkJCSAgICAgICBNQVRDSFBBVEhDT05fVkFMSURBVEUpOworCX0KKyNlbmRpZgorCisJd2hpbGUgKGV4Y2x1ZGVfZGlyKQorCQlhZGRfZXhjbHVkZShsbGlzdF9wb3AoJmV4Y2x1ZGVfZGlyKSk7CisKKwlpZiAoZmxhZ3MgJiBPUFRfbykgeworCQlvdXRmaWxlID0gc3Rkb3V0OworCQlpZiAoTk9UX0xPTkVfQ0hBUihvdXRfZmlsZW5hbWUsICctJykpIHsKKwkJCW91dGZpbGUgPSB4Zm9wZW5fZm9yX3dyaXRlKG91dF9maWxlbmFtZSk7CisJCX0KKwl9CisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdyJykgeyAvKiByZXN0b3JlY29uICovCisJCWlmIChmbGFncyAmIChPUFRfciB8IE9QVF9SKSkKKwkJCXJlY3Vyc2UgPSAxOworCX0gZWxzZSB7IC8qIHNldGZpbGVzICovCisJCWlmIChmbGFncyAmIE9QVF9yKQorCQkJcm9vdHBhdGhsZW4gPSBzdHJsZW4ocm9vdHBhdGgpOworCX0KKwlpZiAoZmxhZ3MgJiBPUFRfcykgeworCQlpbnB1dF9maWxlbmFtZSA9ICItIjsKKwkJYWRkX2Fzc29jID0gMDsKKwl9CisKKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ3MnKSB7IC8qIHNldGZpbGVzICovCisJCS8qIFVzZSBvdXIgb3duIGludmFsaWQgY29udGV4dCBjaGVja2luZyBmdW5jdGlvbiBzbyB0aGF0CisJCSAgIHdlIGNhbiBzdXBwb3J0IGVpdGhlciBjaGVja2luZyBhZ2FpbnN0IHRoZSBhY3RpdmUgcG9saWN5IG9yCisJCSAgIGNoZWNraW5nIGFnYWluc3QgYSBiaW5hcnkgcG9saWN5IGZpbGUuICovCisJCXNldF9tYXRjaHBhdGhjb25fY2Fub25jb24oJmNhbm9uY29uKTsKKwkJaWYgKCFhcmd2WzBdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQl4c3RhdChhcmd2WzBdLCAmc2IpOworCQlpZiAoIVNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzcGVjIGZpbGUgJXMgaXMgbm90IGEgcmVndWxhciBmaWxlIiwgYXJndlswXSk7CisJCX0KKwkJLyogTG9hZCB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uIGFuZCBjaGVjayBpdC4gKi8KKwkJcmMgPSBtYXRjaHBhdGhjb25faW5pdChhcmd2WzBdKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJfQorCQlpZiAobmVycikKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJYXJndisrOworCX0KKworCWlmIChpbnB1dF9maWxlbmFtZSkgeworCQlzc2l6ZV90IGxlbjsKKwkJRklMRSAqZiA9IHN0ZGluOworCisJCWlmIChOT1RfTE9ORV9DSEFSKGlucHV0X2ZpbGVuYW1lLCAnLScpKQorCQkJZiA9IHhmb3Blbl9mb3JfcmVhZChpbnB1dF9maWxlbmFtZSk7CisJCXdoaWxlICgobGVuID0gZ2V0bGluZSgmYnVmLCAmYnVmX2xlbiwgZikpID4gMCkgeworCQkJYnVmW2xlbiAtIDFdID0gJ1wwJzsKKwkJCWVycm9ycyB8PSBwcm9jZXNzX29uZShidWYpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZik7CisJfSBlbHNlIHsKKwkJaWYgKCFhcmd2WzBdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspIHsKKwkJCWVycm9ycyB8PSBwcm9jZXNzX29uZShhcmd2W2ldKTsKKwkJfQorCX0KKworCWlmIChGTEFHX1dfd2Fybl9ub19tYXRjaCkKKwkJbWF0Y2hwYXRoY29uX2NoZWNrbWF0Y2hlcyhhcmd2WzBdKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBvdXRmaWxlKQorCQlmY2xvc2Uob3V0ZmlsZSk7CisKKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9zZXRzZWJvb2wuYyBiL3NlbGludXgvc2V0c2Vib29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2ODJlNQotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvc2V0c2Vib29sLmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIHNldHNlYm9vbAorICogU2ltcGxlIHNldHNlYm9vbAorICogTk9URTogLVAgb3B0aW9uIHJlcXVpcmVzIGxpYnNlbWFuYWdlLCBzbyB0aGlzIGZlYXR1cmUgaXMKKyAqIG9taXR0ZWQgaW4gdGhpcyB2ZXJzaW9uCisgKiBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRzZWJvb2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgImJvb2xlYW4gdmFsdWUiCisvL3VzYWdlOiNkZWZpbmUgc2V0c2Vib29sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIGJvb2xlYW4gc2V0dGluZyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRzZWJvb2xfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldHNlYm9vbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpwOworCWludCB2YWx1ZTsKKworCWlmIChhcmdjICE9IDMpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCXAgPSBhcmd2WzJdOworCisJaWYgKExPTkVfQ0hBUihwLCAnMScpIHx8IHN0cmNhc2VjbXAocCwgInRydWUiKSA9PSAwIHx8IHN0cmNhc2VjbXAocCwgIm9uIikgPT0gMCkgeworCQl2YWx1ZSA9IDE7CisJfSBlbHNlIGlmIChMT05FX0NIQVIocCwgJzAnKSB8fCBzdHJjYXNlY21wKHAsICJmYWxzZSIpID09IDAgfHwgc3RyY2FzZWNtcChwLCAib2ZmIikgPT0gMCkgeworCQl2YWx1ZSA9IDA7CisJfSBlbHNlIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmIChzZWN1cml0eV9zZXRfYm9vbGVhbihhcmd2WzFdLCB2YWx1ZSkgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IGJvb2xlYW4iKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2hlbGwvQ29uZmlnLmluIGIvc2hlbGwvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NGQyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9Db25maWcuaW4KQEAgLTAsMCArMSw0MzMgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJTaGVsbHMiCisKK2NvbmZpZyBBU0gKKwlib29sICJhc2giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiAhTk9NTVUKKwloZWxwCisJICBUaGEgJ2FzaCcgc2hlbGwgYWRkcyBhYm91dCA2MGsgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgaXMKKwkgIHRoZSBtb3N0IGNvbXBsZXRlIGFuZCBtb3N0IHBlZGFudGljYWxseSBjb3JyZWN0IHNoZWxsIGluY2x1ZGVkIHdpdGgKKwkgIGJ1c3lib3guIFRoaXMgc2hlbGwgaXMgYWN0dWFsbHkgYSBkZXJpdmF0aXZlIG9mIHRoZSBEZWJpYW4gJ2Rhc2gnCisJICBzaGVsbCAoYnkgSGVyYmVydCBYdSksIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IHBvcnRpbmcgdGhlICdhc2gnIHNoZWxsCisJICAod3JpdHRlbiBieSBLZW5uZXRoIEFsbXF1aXN0KSBmcm9tIE5ldEJTRC4KKworY29uZmlnIEFTSF9CQVNIX0NPTVBBVAorCWJvb2wgImJhc2gtY29tcGF0aWJsZSBleHRlbnNpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIGJhc2gtY29tcGF0aWJsZSBleHRlbnNpb25zLgorCitjb25maWcgQVNIX0lETEVfVElNRU9VVAorCWJvb2wgIklkbGUgdGltZW91dCB2YXJpYWJsZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEFTSAorCWhlbHAKKwkgIEVuYWJsZXMgYmFzaC1saWtlIGF1dG8tbG9nb3V0IGFmdGVyICRUTU9VVCBzZWNvbmRzIG9mIGlkbGUgdGltZS4KKworY29uZmlnIEFTSF9KT0JfQ09OVFJPTAorCWJvb2wgIkpvYiBjb250cm9sIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIGpvYiBjb250cm9sIGluIHRoZSBhc2ggc2hlbGwuCisKK2NvbmZpZyBBU0hfQUxJQVMKKwlib29sICJBbGlhcyBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIGFsaWFzIHN1cHBvcnQgaW4gdGhlIGFzaCBzaGVsbC4KKworY29uZmlnIEFTSF9HRVRPUFRTCisJYm9vbCAiQnVpbHRpbiBnZXRvcHQgdG8gcGFyc2UgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGdldG9wdHMgYnVpbHRpbiBpbiBhc2guCisKK2NvbmZpZyBBU0hfQlVJTFRJTl9FQ0hPCisJYm9vbCAiQnVpbHRpbiB2ZXJzaW9uIG9mICdlY2hvJyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFTSAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBlY2hvIGJ1aWx0aW4gaW4gYXNoLgorCitjb25maWcgQVNIX0JVSUxUSU5fUFJJTlRGCisJYm9vbCAiQnVpbHRpbiB2ZXJzaW9uIG9mICdwcmludGYnIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHByaW50ZiBidWlsdGluIGluIGFzaC4KKworY29uZmlnIEFTSF9CVUlMVElOX1RFU1QKKwlib29sICJCdWlsdGluIHZlcnNpb24gb2YgJ3Rlc3QnIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRlc3QgYnVpbHRpbiBpbiBhc2guCisKK2NvbmZpZyBBU0hfQ01EQ01ECisJYm9vbCAiJ2NvbW1hbmQnIGNvbW1hbmQgdG8gb3ZlcnJpZGUgc2hlbGwgYnVpbHRpbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBU0gKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIGFzaCAnY29tbWFuZCcgYnVpbHRpbiwgd2hpY2ggYWxsb3dzCisJICB5b3UgdG8gcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLAorCSAgZXZlbiB3aGVuIHRoZXJlIGlzIGFuIGFzaCBidWlsdGluIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lLgorCitjb25maWcgQVNIX01BSUwKKwlib29sICJDaGVjayBmb3IgbmV3IG1haWwgb24gaW50ZXJhY3RpdmUgc2hlbGxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlICJjaGVjayBmb3IgbmV3IG1haWwiIGZ1bmN0aW9uIGluIHRoZSBhc2ggc2hlbGwuCisKK2NvbmZpZyBBU0hfT1BUSU1JWkVfRk9SX1NJWkUKKwlib29sICJPcHRpbWl6ZSBmb3Igc2l6ZSBpbnN0ZWFkIG9mIHNwZWVkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgQ29tcGlsZSBhc2ggZm9yIHJlZHVjZWQgc2l6ZSBhdCB0aGUgcHJpY2Ugb2Ygc3BlZWQuCisKK2NvbmZpZyBBU0hfUkFORE9NX1NVUFBPUlQKKwlib29sICJQc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCAkUkFORE9NIHZhcmlhYmxlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVNICisJaGVscAorCSAgRW5hYmxlIHBzZXVkb3JhbmRvbSBnZW5lcmF0b3IgYW5kIGR5bmFtaWMgdmFyaWFibGUgIiRSQU5ET00iLgorCSAgRWFjaCByZWFkIG9mICIkUkFORE9NIiB3aWxsIGdlbmVyYXRlIGEgbmV3IHBzZXVkb3JhbmRvbSB2YWx1ZS4KKwkgIFlvdSBjYW4gcmVzZXQgdGhlIGdlbmVyYXRvciBieSB1c2luZyBhIHNwZWNpZmllZCBzdGFydCB2YWx1ZS4KKwkgIEFmdGVyICJ1bnNldCBSQU5ET00iIHRoZSBnZW5lcmF0b3Igd2lsbCBzd2l0Y2ggb2ZmIGFuZCB0aGlzCisJICB2YXJpYWJsZSB3aWxsIG5vIGxvbmdlciBoYXZlIHNwZWNpYWwgdHJlYXRtZW50LgorCitjb25maWcgQVNIX0VYUEFORF9QUk1UCisJYm9vbCAiRXhwYW5kIHByb21wdCBzdHJpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBU0gKKwloZWxwCisJICAiUFMjIiBtYXkgY29udGFpbiB2b2xhdGlsZSBjb250ZW50LCBzdWNoIGFzIGJhY2txdW90ZSBjb21tYW5kcy4KKwkgIFRoaXMgb3B0aW9uIHJlY3JlYXRlcyB0aGUgcHJvbXB0IHN0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudAorCSAgdmFyaWFibGUgZWFjaCB0aW1lIGl0IGlzIGRpc3BsYXllZC4KKworY29uZmlnIENUVFlIQUNLCisJYm9vbCAiY3R0eWhhY2siCisJZGVmYXVsdCB5CisJaGVscAorCSAgT25lIGNvbW1vbiBwcm9ibGVtIHJlcG9ydGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgaXMgdGhlICJjYW4ndAorCSAgYWNjZXNzIHR0eTsgam9iIGNvbnRyb2wgdHVybmVkIG9mZiIgZXJyb3IgbWVzc2FnZSwgd2hpY2ggdHlwaWNhbGx5CisJICBhcHBlYXJzIHdoZW4gb25lIHRyaWVzIHRvIHVzZSBhIHNoZWxsIHdpdGggc3RkaW4vc3Rkb3V0IG9uCisJICAvZGV2L2NvbnNvbGUuCisJICBUaGlzIGRldmljZSBpcyBzcGVjaWFsIC0gaXQgY2Fubm90IGJlIGEgY29udHJvbGxpbmcgdHR5LgorCisJICBUaGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIHVzZSB0aGUgY29ycmVjdCBkZXZpY2UgaW5zdGVhZCBvZgorCSAgL2Rldi9jb25zb2xlLgorCisJICBjdHR5aGFjayBwcm92aWRlcyBhICJxdWljayBhbmQgZGlydHkiIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4KKwkgIEl0IGFuYWx5emVzIHN0ZGluIHdpdGggdmFyaW91cyBpb2N0bHMsIHRyeWluZyB0byBkZXRlcm1pbmUgd2hldGhlcgorCSAgaXQgaXMgYSAvZGV2L3R0eU4gb3IgL2Rldi90dHlTTiAodmlydHVhbCB0ZXJtaW5hbCBvciBzZXJpYWwgbGluZSkuCisJICBPbiBMaW51eCBpdCBhbHNvIGNoZWNrcyBzeXNmcyBmb3IgYSBwb2ludGVyIHRvIHRoZSBhY3RpdmUgY29uc29sZS4KKwkgIElmIGN0dHloYWNrIGlzIGFibGUgdG8gZmluZCB0aGUgcmVhbCBjb25zb2xlIGRldmljZSwgaXQgY2xvc2VzCisJICBzdGRpbi9vdXQvZXJyIGFuZCByZW9wZW5zIHRoYXQgZGV2aWNlLgorCSAgVGhlbiBpdCBleGVjdXRlcyB0aGUgZ2l2ZW4gcHJvZ3JhbS4gT3BlbmluZyB0aGUgZGV2aWNlIHdpbGwgbWFrZQorCSAgdGhhdCBkZXZpY2UgYSBjb250cm9sbGluZyB0dHkuIFRoaXMgbWF5IHJlcXVpcmUgY3R0eWhhY2sKKwkgIHRvIGJlIGEgc2Vzc2lvbiBsZWFkZXIuCisKKwkgIEV4YW1wbGUgZm9yIC9ldGMvaW5pdHRhYiAoZm9yIGJ1c3lib3ggaW5pdCk6CisKKwkgIDo6cmVzcGF3bjovYmluL2N0dHloYWNrIC9iaW4vc2gKKworCSAgU3RhcnRpbmcgYW4gaW50ZXJhY3RpdmUgc2hlbGwgZnJvbSBib290IHNoZWxsIHNjcmlwdDoKKworCSAgc2V0c2lkIGN0dHloYWNrIHNoCisKKwkgIEdpdmluZyBjb250cm9sbGluZyB0dHkgdG8gc2hlbGwgcnVubmluZyB3aXRoIFBJRCAxOgorCisJICAjIGV4ZWMgY3R0eWhhY2sgc2gKKworCSAgV2l0aG91dCBjdHR5aGFjaywgeW91IG5lZWQgdG8ga25vdyBleGFjdCB0dHkgbmFtZSwKKwkgIGFuZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisJICAjIGV4ZWMgc2V0c2lkIHNoIC1jICdleGVjIHNoIDwvZGV2L3R0eTEgPi9kZXYvdHR5MSAyPiYxJworCitjb25maWcgSFVTSAorCWJvb2wgImh1c2giCisJZGVmYXVsdCB5CisJaGVscAorCSAgaHVzaCBpcyBhIHNtYWxsIHNoZWxsICgyNWspLiBJdCBoYW5kbGVzIHRoZSBub3JtYWwgZmxvdyBjb250cm9sCisJICBjb25zdHJ1Y3RzIHN1Y2ggYXMgaWYvdGhlbi9lbGlmL2Vsc2UvZmksIGZvci9pbi9kby9kb25lLCB3aGlsZSBsb29wcywKKwkgIGNhc2UvZXNhYy4gUmVkaXJlY3Rpb25zLCBoZXJlIGRvY3VtZW50cywgJCgoYXJpdGhtZXRpYykpCisJICBhbmQgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCisKKwkgIEl0IHdpbGwgY29tcGlsZSBhbmQgd29yayBvbiBuby1tbXUgc3lzdGVtcy4KKworCSAgSXQgZG9lcyBub3QgaGFuZGxlIHNlbGVjdCwgYWxpYXNlcywgdGlsZGUgZXhwYW5zaW9uLAorCSAgJj5maWxlIGFuZCA+JmZpbGUgcmVkaXJlY3Rpb24gb2Ygc3Rkb3V0K3N0ZGVyci4KKworY29uZmlnIEhVU0hfQkFTSF9DT01QQVQKKwlib29sICJiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0gKKwloZWxwCisJICBFbmFibGUgYmFzaC1jb21wYXRpYmxlIGV4dGVuc2lvbnMuCisKK2NvbmZpZyBIVVNIX0JSQUNFX0VYUEFOU0lPTgorCWJvb2wgIkJyYWNlIGV4cGFuc2lvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0hfQkFTSF9DT01QQVQKKwloZWxwCisJICBFbmFibGUge2FiYyxkZWZ9IGV4dGVuc2lvbi4KKworY29uZmlnIEhVU0hfSEVMUAorCWJvb2wgImhlbHAgYnVpbHRpbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0gKKwloZWxwCisJICBFbmFibGUgaGVscCBidWlsdGluIGluIGh1c2guIENvZGUgc2l6ZSArIH4xIGtieXRlLgorCitjb25maWcgSFVTSF9JTlRFUkFDVElWRQorCWJvb2wgIkludGVyYWN0aXZlIG1vZGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNICisJaGVscAorCSAgRW5hYmxlIGludGVyYWN0aXZlIG1vZGUgKHByb21wdCBhbmQgY29tbWFuZCBlZGl0aW5nKS4KKwkgIFdpdGhvdXQgdGhpcywgaHVzaCBzaW1wbHkgcmVhZHMgYW5kIGV4ZWN1dGVzIGNvbW1hbmRzCisJICBmcm9tIHN0ZGluIGp1c3QgbGlrZSBhIHNoZWxsIHNjcmlwdCBmcm9tIGEgZmlsZS4KKwkgIE5vIHByb21wdCwgbm8gUFMxL1BTMiBtYWdpYyBzaGVsbCB2YXJpYWJsZXMuCisKK2NvbmZpZyBIVVNIX1NBVkVISVNUT1JZCisJYm9vbCAiU2F2ZSBjb21tYW5kIGhpc3RvcnkgdG8gLmh1c2hfaGlzdG9yeSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0hfSU5URVJBQ1RJVkUgJiYgRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJaGVscAorCSAgRW5hYmxlIGhpc3Rvcnkgc2F2aW5nIGluIGh1c2guCisKK2NvbmZpZyBIVVNIX0pPQgorCWJvb2wgIkpvYiBjb250cm9sIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSF9JTlRFUkFDVElWRQorCWhlbHAKKwkgIEVuYWJsZSBqb2IgY29udHJvbDogQ3RybC1aIGJhY2tncm91bmRzLCBDdHJsLUMgaW50ZXJydXB0cyBjdXJyZW50CisJICBjb21tYW5kIChub3QgZW50aXJlIHNoZWxsKSwgZmcvYmcgYnVpbHRpbnMgd29yay4gV2l0aG91dCB0aGlzIG9wdGlvbiwKKwkgICJjbWQgJiIgc3RpbGwgd29ya3MgYnkgc2ltcGx5IHNwYXduaW5nIGEgcHJvY2VzcyBhbmQgaW1tZWRpYXRlbHkKKwkgIHByb21wdGluZyBmb3IgbmV4dCBjb21tYW5kIChvciBleGVjdXRpbmcgbmV4dCBjb21tYW5kIGluIGEgc2NyaXB0KSwKKwkgIGJ1dCBubyBzZXBhcmF0ZSBwcm9jZXNzIGdyb3VwIGlzIGZvcm1lZC4KKworY29uZmlnIEhVU0hfVElDSworCWJvb2wgIlByb2Nlc3Mgc3Vic3RpdHV0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSAorCWhlbHAKKwkgIEVuYWJsZSBwcm9jZXNzIHN1YnN0aXR1dGlvbiBgY29tbWFuZGAgYW5kICQoY29tbWFuZCkgaW4gaHVzaC4KKworY29uZmlnIEhVU0hfSUYKKwlib29sICJTdXBwb3J0IGlmL3RoZW4vZWxpZi9lbHNlL2ZpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSAorCWhlbHAKKwkgIEVuYWJsZSBpZi90aGVuL2VsaWYvZWxzZS9maSBpbiBodXNoLgorCitjb25maWcgSFVTSF9MT09QUworCWJvb2wgIlN1cHBvcnQgZm9yLCB3aGlsZSBhbmQgdW50aWwgbG9vcHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNICisJaGVscAorCSAgRW5hYmxlIGZvciwgd2hpbGUgYW5kIHVudGlsIGxvb3BzIGluIGh1c2guCisKK2NvbmZpZyBIVVNIX0NBU0UKKwlib29sICJTdXBwb3J0IGNhc2UgLi4uIGVzYWMgc3RhdGVtZW50IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSAorCWhlbHAKKwkgIEVuYWJsZSBjYXNlIC4uLiBlc2FjIHN0YXRlbWVudCBpbiBodXNoLiArNDAwIGJ5dGVzLgorCitjb25maWcgSFVTSF9GVU5DVElPTlMKKwlib29sICJTdXBwb3J0IGZ1bmNuYW1lKCkgeyBjb21tYW5kczsgfSBzeW50YXgiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNICisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHNoZWxsIGZ1bmN0aW9ucyBpbiBodXNoLiArODAwIGJ5dGVzLgorCitjb25maWcgSFVTSF9MT0NBTAorCWJvb2wgIlN1cHBvcnQgbG9jYWwgYnVpbHRpbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0hfRlVOQ1RJT05TCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGxvY2FsIHZhcmlhYmxlcyBpbiBmdW5jdGlvbnMuCisKK2NvbmZpZyBIVVNIX1JBTkRPTV9TVVBQT1JUCisJYm9vbCAiUHNldWRvcmFuZG9tIGdlbmVyYXRvciBhbmQgJFJBTkRPTSB2YXJpYWJsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhVU0gKKwloZWxwCisJICBFbmFibGUgcHNldWRvcmFuZG9tIGdlbmVyYXRvciBhbmQgZHluYW1pYyB2YXJpYWJsZSAiJFJBTkRPTSIuCisJICBFYWNoIHJlYWQgb2YgIiRSQU5ET00iIHdpbGwgZ2VuZXJhdGUgYSBuZXcgcHNldWRvcmFuZG9tIHZhbHVlLgorCitjb25maWcgSFVTSF9FWFBPUlRfTgorCWJvb2wgIlN1cHBvcnQgJ2V4cG9ydCAtbicgb3B0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSAorCWhlbHAKKwkgIGV4cG9ydCAtbiB1bmV4cG9ydHMgdmFyaWFibGVzLiBJdCBpcyBhIGJhc2ggZXh0ZW5zaW9uLgorCitjb25maWcgSFVTSF9NT0RFX1gKKwlib29sICJTdXBwb3J0ICdodXNoIC14JyBvcHRpb24gYW5kICdzZXQgLXgnIGNvbW1hbmQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNICisJaGVscAorCSAgVGhpcyBpbnN0cnVjdHMgaHVzaCB0byBwcmludCBjb21tYW5kcyBiZWZvcmUgZXhlY3V0aW9uLgorCSAgQWRkcyB+MzAwIGJ5dGVzLgorCitjb25maWcgTVNICisJYm9vbCAibXNoIChkZXByZWNhdGVkOiBhbGlhc2VkIHRvIGh1c2gpIgorCWRlZmF1bHQgbgorCXNlbGVjdCBIVVNICisJaGVscAorCSAgbXNoIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCwgcGxlYXNlIG1pZ3JhdGUgdG8gaHVzaC4KKworCitjaG9pY2UKKwlwcm9tcHQgIkNob29zZSB3aGljaCBzaGVsbCBpcyBhbGlhc2VkIHRvICdzaCcgbmFtZSIKKwlkZWZhdWx0IEZFQVRVUkVfU0hfSVNfQVNICisJaGVscAorCSAgQ2hvb3NlIHdoaWNoIHNoZWxsIHlvdSB3YW50IHRvIGJlIGV4ZWN1dGVkIGJ5ICdzaCcgYWxpYXMuCisJICBUaGUgYXNoIHNoZWxsIGlzIHRoZSBtb3N0IGJhc2ggY29tcGF0aWJsZSBhbmQgZnVsbCBmZWF0dXJlZCBvbmUuCisKKyMgbm90ZTogY2Fubm90IHVzZSAic2VsZWN0IEFTSCIgaGVyZSwgaXQgYnJlYWtzICJtYWtlIGFsbG5vY29uZmlnIgorY29uZmlnIEZFQVRVUkVfU0hfSVNfQVNICisJZGVwZW5kcyBvbiBBU0gKKwlib29sICJhc2giCisJZGVwZW5kcyBvbiAhTk9NTVUKKworY29uZmlnIEZFQVRVUkVfU0hfSVNfSFVTSAorCWRlcGVuZHMgb24gSFVTSAorCWJvb2wgImh1c2giCisKK2NvbmZpZyBGRUFUVVJFX1NIX0lTX05PTkUKKwlib29sICJub25lIgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2Ugd2hpY2ggc2hlbGwgaXMgYWxpYXNlZCB0byAnYmFzaCcgbmFtZSIKKwlkZWZhdWx0IEZFQVRVUkVfQkFTSF9JU19OT05FCisJaGVscAorCSAgQ2hvb3NlIHdoaWNoIHNoZWxsIHlvdSB3YW50IHRvIGJlIGV4ZWN1dGVkIGJ5ICdiYXNoJyBhbGlhcy4KKwkgIFRoZSBhc2ggc2hlbGwgaXMgdGhlIG1vc3QgYmFzaCBjb21wYXRpYmxlIGFuZCBmdWxsIGZlYXR1cmVkIG9uZS4KKworCSAgTm90ZSB0aGF0IHNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBzd2l0Y2ggb24gYW55IGJhc2gKKwkgIGNvbXBhdGliaWxpdHkgY29kZS4gSXQgbWVyZWx5IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwKKwkgIC9iaW4vYmFzaCAoc3ltKWxpbmsgYW5kIHJ1biBzY3JpcHRzIHdoaWNoIHN0YXJ0IHdpdGgKKwkgICMhL2Jpbi9iYXNoIGxpbmUuCisKKwkgIE1hbnkgc3lzdGVtcyB1c2UgaXQgaW4gc2NyaXB0cyB3aGljaCB1c2UgYmFzaC1zcGVjaWZpYyBmZWF0dXJlcywKKwkgIGV2ZW4gc2ltcGxlIG9uZXMgbGlrZSAkUkFORE9NLiBXaXRob3V0IHRoaXMgb3B0aW9uLCBidXN5Ym94CisJICBjYW4ndCBiZSB1c2VkIGZvciBydW5uaW5nIHRoZW0gYmVjYXVzZSBpdCB3b24ndCByZWNvbmduaXplCisJICAiYmFzaCIgYXMgYSBzdXBwb3J0ZWQgYXBwbGV0IG5hbWUuCisKK2NvbmZpZyBGRUFUVVJFX0JBU0hfSVNfQVNICisJZGVwZW5kcyBvbiBBU0gKKwlib29sICJhc2giCisJZGVwZW5kcyBvbiAhTk9NTVUKKworY29uZmlnIEZFQVRVUkVfQkFTSF9JU19IVVNICisJZGVwZW5kcyBvbiBIVVNICisJYm9vbCAiaHVzaCIKKworY29uZmlnIEZFQVRVUkVfQkFTSF9JU19OT05FCisJYm9vbCAibm9uZSIKKworZW5kY2hvaWNlCisKKworY29uZmlnIFNIX01BVEhfU1VQUE9SVAorCWJvb2wgIlBPU0lYIG1hdGggc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFTSCB8fCBIVVNICisJaGVscAorCSAgRW5hYmxlIG1hdGggc3VwcG9ydCBpbiB0aGUgc2hlbGwgdmlhICQoKC4uLikpIHN5bnRheC4KKworY29uZmlnIFNIX01BVEhfU1VQUE9SVF82NAorCWJvb2wgIkV4dGVuZCBQT1NJWCBtYXRoIHN1cHBvcnQgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0hfTUFUSF9TVVBQT1JUCisJaGVscAorCSAgRW5hYmxlIDY0LWJpdCBtYXRoIHN1cHBvcnQgaW4gdGhlIHNoZWxsLiBUaGlzIHdpbGwgbWFrZSB0aGUgc2hlbGwKKwkgIHNsaWdodGx5IGxhcmdlciwgYnV0IHdpbGwgYWxsb3cgY29tcHV0YXRpb24gd2l0aCB2ZXJ5IGxhcmdlIG51bWJlcnMuCisJICBUaGlzIGlzIG5vdCBpbiBQT1NJWCwgc28gZG8gbm90IHJlbHkgb24gdGhpcyBpbiBwb3J0YWJsZSBjb2RlLgorCitjb25maWcgRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorCWJvb2wgIkhpZGUgbWVzc2FnZSBvbiBpbnRlcmFjdGl2ZSBzaGVsbCBzdGFydHVwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSCB8fCBBU0gKKwloZWxwCisJICBSZW1vdmUgdGhlIGJ1c3lib3ggaW50cm9kdWN0aW9uIHdoZW4gc3RhcnRpbmcgYSBzaGVsbC4KKworY29uZmlnIEZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCWJvb2wgIlN0YW5kYWxvbmUgc2hlbGwiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAoSFVTSCB8fCBBU0gpICYmIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgYnVzeWJveCBzaGVsbHMgdG8gdXNlIGJ1c3lib3ggYXBwbGV0cworCSAgaW4gcHJlZmVyZW5jZSB0byBleGVjdXRhYmxlcyBpbiB0aGUgUEFUSCB3aGVuZXZlciBwb3NzaWJsZS4gRm9yCisJICBleGFtcGxlLCBlbnRlcmluZyB0aGUgY29tbWFuZCAnaWZjb25maWcnIGludG8gdGhlIHNoZWxsIHdvdWxkIGNhdXNlCisJICBidXN5Ym94IHRvIHVzZSB0aGUgaWZjb25maWcgYnVzeWJveCBhcHBsZXQuIFNwZWNpZnlpbmcgdGhlIGZ1bGx5CisJICBxdWFsaWZpZWQgZXhlY3V0YWJsZSBuYW1lLCBzdWNoIGFzICcvc2Jpbi9pZmNvbmZpZycgd2lsbCBzdGlsbAorCSAgZXhlY3V0ZSB0aGUgL3NiaW4vaWZjb25maWcgZXhlY3V0YWJsZSBvbiB0aGUgZmlsZXN5c3RlbS4gVGhpcyBvcHRpb24KKwkgIGlzIGdlbmVyYWxseSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBzdGF0aWNhbGx5IGxpbmtlZCB2ZXJzaW9uIG9mIGJ1c3lib3gKKwkgIGZvciB1c2UgYXMgYSByZXNjdWUgc2hlbGwsIGluIHRoZSBldmVudCB0aGF0IHlvdSBzY3JldyB1cCB5b3VyIHN5c3RlbS4KKworCSAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZS1leGVjaW5nIC9wcm9jL3NlbGYvZXhlICh0eXBpY2FsbHkpCisJICB3aXRoIHJpZ2h0IHBhcmFtZXRlcnMuIFNvbWUgc2VsZWN0ZWQgYXBwbGV0cyAoIk5PRk9SSyIgYXBwbGV0cykKKwkgIGNhbiBldmVuIGJlIGV4ZWN1dGVkIHdpdGhvdXQgY3JlYXRpbmcgbmV3IHByb2Nlc3MuCisJICBJbnN0ZWFkLCBidXN5Ym94IHdpbGwgY2FsbCA8YXBwbGV0Pl9tYWluKCkgaW50ZXJuYWxseS4KKworCSAgSG93ZXZlciwgdGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4gY2hyb290IGphaWxzIHdpdGhvdXQgbW91bnRlZCAvcHJvYworCSAgYW5kIHdpdGggcHMvdG9wIChjb21tYW5kIG5hbWUgY2FuIGJlIHNob3duIGFzICdleGUnIGZvciBhcHBsZXRzCisJICBzdGFydGVkIHRoaXMgd2F5KS4KKyMgdW50cnVlPworIwkgIE5vdGUgdGhhdCB0aGlzIHdpbGwgKmFsc28qIGNhdXNlIGFwcGxldHMgdG8gdGFrZSBwcmVjZWRlbmNlCisjCSAgb3ZlciBzaGVsbCBidWlsdGlucyBvZiB0aGUgc2FtZSBuYW1lLiBTbyB0dXJuaW5nIHRoaXMgb24gd2lsbAorIwkgIGVsaW1pbmF0ZSBhbnkgcGVyZm9ybWFuY2UgZ2FpbmVkIGJ5IHR1cm5pbmcgb24gdGhlIGJ1aWx0aW4gImVjaG8iCisjCSAgYW5kICJ0ZXN0IiBjb21tYW5kcyBpbiBhc2guCisjIHVudHJ1ZT8KKyMJICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgdGhlIHNoZWxsIHdpbGwgYXR0ZW1wdCB0byBkaXJlY3RseQorIwkgIHJ1biAnL2Jpbi9idXN5Ym94Jy4gSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBidXN5Ym94IGJpbmFyeSBzaXR0aW5nIGluCisjCSAgdGhhdCBleGFjdCBsb2NhdGlvbiB3aXRoIHRoYXQgZXhhY3QgbmFtZSwgdGhpcyBvcHRpb24gd2lsbCBub3Qgd29yayBhdAorIwkgIGFsbC4KKworY29uZmlnIEZFQVRVUkVfU0hfTk9GT1JLCisJYm9vbCAiUnVuICdub2ZvcmsnIGFwcGxldHMgZGlyZWN0bHkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAoSFVTSCB8fCBBU0gpICYmIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgYnVzeWJveCBzaGVsbHMgdG8gbm90IGV4ZWN1dGUgdHlwaWNhbAorCSAgZm9yay9leGVjL3dhaXQgc2VxdWVuY2UsIGJ1dCBjYWxsIDxhcHBsZXQ+X21haW4gZGlyZWN0bHksCisJICBpZiBwb3NzaWJsZS4gKFNvbWV0aW1lcyBpdCBpcyBub3QgcG9zc2libGU6IGZvciBleGFtcGxlLAorCSAgdGhpcyBpcyBub3QgcG9zc2libGUgaW4gcGlwZXMpLgorCisJICBUaGlzIHdpbGwgYmUgZG9uZSBvbmx5IGZvciBzb21lIGFwcGxldHMgKHRob3NlIHdoaWNoIGFyZSBtYXJrZWQKKwkgIE5PRk9SSyBpbiBpbmNsdWRlL2FwcGxldHMuaCkuCisKKwkgIFRoaXMgbWF5IHNpZ25pZmljYW50bHkgc3BlZWQgdXAgc29tZSBzaGVsbCBzY3JpcHRzLgorCisJICBUaGlzIGZlYXR1cmUgaXMgcmVsYXRpdmVseSBuZXcuIFVzZSB3aXRoIGNhcmUuIFJlcG9ydCBidWdzCisJICB0byBwcm9qZWN0IG1haWxpbmcgbGlzdC4KKworY29uZmlnIEZFQVRVUkVfU0hfSElTVEZJTEVTSVpFCisJYm9vbCAiVXNlICRISVNURklMRVNJWkUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNIIHx8IEFTSAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIGJ1c3lib3ggc2hlbGxzIHRvIHVzZSAkSElTVEZJTEVTSVpFIHZhcmlhYmxlCisJICB0byBzZXQgc2hlbGwgaGlzdG9yeSBzaXplLiBOb3RlIHRoYXQgaXRzIG1heCB2YWx1ZSBpcyBjYXBwZWQKKwkgIGJ5ICJIaXN0b3J5IHNpemUiIHNldHRpbmcgaW4gbGlicmFyeSB0dW5pbmcgc2VjdGlvbi4KKworCitlbmRtZW51CmRpZmYgLS1naXQgYS9zaGVsbC9Db25maWcuc3JjIGIvc2hlbGwvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFlNjJkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE0OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU2hlbGxzIgorCitJTlNFUlQKKworCitjaG9pY2UKKwlwcm9tcHQgIkNob29zZSB3aGljaCBzaGVsbCBpcyBhbGlhc2VkIHRvICdzaCcgbmFtZSIKKwlkZWZhdWx0IEZFQVRVUkVfU0hfSVNfQVNICisJaGVscAorCSAgQ2hvb3NlIHdoaWNoIHNoZWxsIHlvdSB3YW50IHRvIGJlIGV4ZWN1dGVkIGJ5ICdzaCcgYWxpYXMuCisJICBUaGUgYXNoIHNoZWxsIGlzIHRoZSBtb3N0IGJhc2ggY29tcGF0aWJsZSBhbmQgZnVsbCBmZWF0dXJlZCBvbmUuCisKKyMgbm90ZTogY2Fubm90IHVzZSAic2VsZWN0IEFTSCIgaGVyZSwgaXQgYnJlYWtzICJtYWtlIGFsbG5vY29uZmlnIgorY29uZmlnIEZFQVRVUkVfU0hfSVNfQVNICisJZGVwZW5kcyBvbiBBU0gKKwlib29sICJhc2giCisJZGVwZW5kcyBvbiAhTk9NTVUKKworY29uZmlnIEZFQVRVUkVfU0hfSVNfSFVTSAorCWRlcGVuZHMgb24gSFVTSAorCWJvb2wgImh1c2giCisKK2NvbmZpZyBGRUFUVVJFX1NIX0lTX05PTkUKKwlib29sICJub25lIgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2Ugd2hpY2ggc2hlbGwgaXMgYWxpYXNlZCB0byAnYmFzaCcgbmFtZSIKKwlkZWZhdWx0IEZFQVRVUkVfQkFTSF9JU19OT05FCisJaGVscAorCSAgQ2hvb3NlIHdoaWNoIHNoZWxsIHlvdSB3YW50IHRvIGJlIGV4ZWN1dGVkIGJ5ICdiYXNoJyBhbGlhcy4KKwkgIFRoZSBhc2ggc2hlbGwgaXMgdGhlIG1vc3QgYmFzaCBjb21wYXRpYmxlIGFuZCBmdWxsIGZlYXR1cmVkIG9uZS4KKworCSAgTm90ZSB0aGF0IHNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBzd2l0Y2ggb24gYW55IGJhc2gKKwkgIGNvbXBhdGliaWxpdHkgY29kZS4gSXQgbWVyZWx5IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwKKwkgIC9iaW4vYmFzaCAoc3ltKWxpbmsgYW5kIHJ1biBzY3JpcHRzIHdoaWNoIHN0YXJ0IHdpdGgKKwkgICMhL2Jpbi9iYXNoIGxpbmUuCisKKwkgIE1hbnkgc3lzdGVtcyB1c2UgaXQgaW4gc2NyaXB0cyB3aGljaCB1c2UgYmFzaC1zcGVjaWZpYyBmZWF0dXJlcywKKwkgIGV2ZW4gc2ltcGxlIG9uZXMgbGlrZSAkUkFORE9NLiBXaXRob3V0IHRoaXMgb3B0aW9uLCBidXN5Ym94CisJICBjYW4ndCBiZSB1c2VkIGZvciBydW5uaW5nIHRoZW0gYmVjYXVzZSBpdCB3b24ndCByZWNvbmduaXplCisJICAiYmFzaCIgYXMgYSBzdXBwb3J0ZWQgYXBwbGV0IG5hbWUuCisKK2NvbmZpZyBGRUFUVVJFX0JBU0hfSVNfQVNICisJZGVwZW5kcyBvbiBBU0gKKwlib29sICJhc2giCisJZGVwZW5kcyBvbiAhTk9NTVUKKworY29uZmlnIEZFQVRVUkVfQkFTSF9JU19IVVNICisJZGVwZW5kcyBvbiBIVVNICisJYm9vbCAiaHVzaCIKKworY29uZmlnIEZFQVRVUkVfQkFTSF9JU19OT05FCisJYm9vbCAibm9uZSIKKworZW5kY2hvaWNlCisKKworY29uZmlnIFNIX01BVEhfU1VQUE9SVAorCWJvb2wgIlBPU0lYIG1hdGggc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFTSCB8fCBIVVNICisJaGVscAorCSAgRW5hYmxlIG1hdGggc3VwcG9ydCBpbiB0aGUgc2hlbGwgdmlhICQoKC4uLikpIHN5bnRheC4KKworY29uZmlnIFNIX01BVEhfU1VQUE9SVF82NAorCWJvb2wgIkV4dGVuZCBQT1NJWCBtYXRoIHN1cHBvcnQgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0hfTUFUSF9TVVBQT1JUCisJaGVscAorCSAgRW5hYmxlIDY0LWJpdCBtYXRoIHN1cHBvcnQgaW4gdGhlIHNoZWxsLiBUaGlzIHdpbGwgbWFrZSB0aGUgc2hlbGwKKwkgIHNsaWdodGx5IGxhcmdlciwgYnV0IHdpbGwgYWxsb3cgY29tcHV0YXRpb24gd2l0aCB2ZXJ5IGxhcmdlIG51bWJlcnMuCisJICBUaGlzIGlzIG5vdCBpbiBQT1NJWCwgc28gZG8gbm90IHJlbHkgb24gdGhpcyBpbiBwb3J0YWJsZSBjb2RlLgorCitjb25maWcgRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorCWJvb2wgIkhpZGUgbWVzc2FnZSBvbiBpbnRlcmFjdGl2ZSBzaGVsbCBzdGFydHVwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSCB8fCBBU0gKKwloZWxwCisJICBSZW1vdmUgdGhlIGJ1c3lib3ggaW50cm9kdWN0aW9uIHdoZW4gc3RhcnRpbmcgYSBzaGVsbC4KKworY29uZmlnIEZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCWJvb2wgIlN0YW5kYWxvbmUgc2hlbGwiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAoSFVTSCB8fCBBU0gpICYmIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgYnVzeWJveCBzaGVsbHMgdG8gdXNlIGJ1c3lib3ggYXBwbGV0cworCSAgaW4gcHJlZmVyZW5jZSB0byBleGVjdXRhYmxlcyBpbiB0aGUgUEFUSCB3aGVuZXZlciBwb3NzaWJsZS4gRm9yCisJICBleGFtcGxlLCBlbnRlcmluZyB0aGUgY29tbWFuZCAnaWZjb25maWcnIGludG8gdGhlIHNoZWxsIHdvdWxkIGNhdXNlCisJICBidXN5Ym94IHRvIHVzZSB0aGUgaWZjb25maWcgYnVzeWJveCBhcHBsZXQuIFNwZWNpZnlpbmcgdGhlIGZ1bGx5CisJICBxdWFsaWZpZWQgZXhlY3V0YWJsZSBuYW1lLCBzdWNoIGFzICcvc2Jpbi9pZmNvbmZpZycgd2lsbCBzdGlsbAorCSAgZXhlY3V0ZSB0aGUgL3NiaW4vaWZjb25maWcgZXhlY3V0YWJsZSBvbiB0aGUgZmlsZXN5c3RlbS4gVGhpcyBvcHRpb24KKwkgIGlzIGdlbmVyYWxseSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBzdGF0aWNhbGx5IGxpbmtlZCB2ZXJzaW9uIG9mIGJ1c3lib3gKKwkgIGZvciB1c2UgYXMgYSByZXNjdWUgc2hlbGwsIGluIHRoZSBldmVudCB0aGF0IHlvdSBzY3JldyB1cCB5b3VyIHN5c3RlbS4KKworCSAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZS1leGVjaW5nIC9wcm9jL3NlbGYvZXhlICh0eXBpY2FsbHkpCisJICB3aXRoIHJpZ2h0IHBhcmFtZXRlcnMuIFNvbWUgc2VsZWN0ZWQgYXBwbGV0cyAoIk5PRk9SSyIgYXBwbGV0cykKKwkgIGNhbiBldmVuIGJlIGV4ZWN1dGVkIHdpdGhvdXQgY3JlYXRpbmcgbmV3IHByb2Nlc3MuCisJICBJbnN0ZWFkLCBidXN5Ym94IHdpbGwgY2FsbCA8YXBwbGV0Pl9tYWluKCkgaW50ZXJuYWxseS4KKworCSAgSG93ZXZlciwgdGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4gY2hyb290IGphaWxzIHdpdGhvdXQgbW91bnRlZCAvcHJvYworCSAgYW5kIHdpdGggcHMvdG9wIChjb21tYW5kIG5hbWUgY2FuIGJlIHNob3duIGFzICdleGUnIGZvciBhcHBsZXRzCisJICBzdGFydGVkIHRoaXMgd2F5KS4KKyMgdW50cnVlPworIwkgIE5vdGUgdGhhdCB0aGlzIHdpbGwgKmFsc28qIGNhdXNlIGFwcGxldHMgdG8gdGFrZSBwcmVjZWRlbmNlCisjCSAgb3ZlciBzaGVsbCBidWlsdGlucyBvZiB0aGUgc2FtZSBuYW1lLiBTbyB0dXJuaW5nIHRoaXMgb24gd2lsbAorIwkgIGVsaW1pbmF0ZSBhbnkgcGVyZm9ybWFuY2UgZ2FpbmVkIGJ5IHR1cm5pbmcgb24gdGhlIGJ1aWx0aW4gImVjaG8iCisjCSAgYW5kICJ0ZXN0IiBjb21tYW5kcyBpbiBhc2guCisjIHVudHJ1ZT8KKyMJICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgdGhlIHNoZWxsIHdpbGwgYXR0ZW1wdCB0byBkaXJlY3RseQorIwkgIHJ1biAnL2Jpbi9idXN5Ym94Jy4gSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBidXN5Ym94IGJpbmFyeSBzaXR0aW5nIGluCisjCSAgdGhhdCBleGFjdCBsb2NhdGlvbiB3aXRoIHRoYXQgZXhhY3QgbmFtZSwgdGhpcyBvcHRpb24gd2lsbCBub3Qgd29yayBhdAorIwkgIGFsbC4KKworY29uZmlnIEZFQVRVUkVfU0hfTk9GT1JLCisJYm9vbCAiUnVuICdub2ZvcmsnIGFwcGxldHMgZGlyZWN0bHkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAoSFVTSCB8fCBBU0gpICYmIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgYnVzeWJveCBzaGVsbHMgdG8gbm90IGV4ZWN1dGUgdHlwaWNhbAorCSAgZm9yay9leGVjL3dhaXQgc2VxdWVuY2UsIGJ1dCBjYWxsIDxhcHBsZXQ+X21haW4gZGlyZWN0bHksCisJICBpZiBwb3NzaWJsZS4gKFNvbWV0aW1lcyBpdCBpcyBub3QgcG9zc2libGU6IGZvciBleGFtcGxlLAorCSAgdGhpcyBpcyBub3QgcG9zc2libGUgaW4gcGlwZXMpLgorCisJICBUaGlzIHdpbGwgYmUgZG9uZSBvbmx5IGZvciBzb21lIGFwcGxldHMgKHRob3NlIHdoaWNoIGFyZSBtYXJrZWQKKwkgIE5PRk9SSyBpbiBpbmNsdWRlL2FwcGxldHMuaCkuCisKKwkgIFRoaXMgbWF5IHNpZ25pZmljYW50bHkgc3BlZWQgdXAgc29tZSBzaGVsbCBzY3JpcHRzLgorCisJICBUaGlzIGZlYXR1cmUgaXMgcmVsYXRpdmVseSBuZXcuIFVzZSB3aXRoIGNhcmUuIFJlcG9ydCBidWdzCisJICB0byBwcm9qZWN0IG1haWxpbmcgbGlzdC4KKworY29uZmlnIEZFQVRVUkVfU0hfSElTVEZJTEVTSVpFCisJYm9vbCAiVXNlICRISVNURklMRVNJWkUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNIIHx8IEFTSAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIGJ1c3lib3ggc2hlbGxzIHRvIHVzZSAkSElTVEZJTEVTSVpFIHZhcmlhYmxlCisJICB0byBzZXQgc2hlbGwgaGlzdG9yeSBzaXplLiBOb3RlIHRoYXQgaXRzIG1heCB2YWx1ZSBpcyBjYXBwZWQKKwkgIGJ5ICJIaXN0b3J5IHNpemUiIHNldHRpbmcgaW4gbGlicmFyeSB0dW5pbmcgc2VjdGlvbi4KKworCitlbmRtZW51CmRpZmYgLS1naXQgYS9zaGVsbC9LYnVpbGQuc3JjIGIvc2hlbGwvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBhZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDExIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX1NIX01BVEhfU1VQUE9SVCkgKz0gbWF0aC5vCmRpZmYgLS1naXQgYS9zaGVsbC9SRUFETUUgYi9zaGVsbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5ZjViNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL1JFQURNRQpAQCAtMCwwICsxLDgyIEBACitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5LworT3BlbiBHcm91cCBCYXNlIFNwZWNpZmljYXRpb25zIElzc3VlIDcKKworCitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDEuaHRtbAorU2hlbGwgJiBVdGlsaXRpZXMKKworSXQgc2F5cyB0aGF0IGFueSBvZiB0aGUgc3RhbmRhcmQgdXRpbGl0aWVzIG1heSBiZSBpbXBsZW1lbnRlZAorYXMgYSByZWd1bGFyIHNoZWxsIGJ1aWx0LWluLiBJdCBnaXZlcyBhIGxpc3Qgb2YgdXRpbGl0aWVzIHdoaWNoCithcmUgdXN1YWxseSBpbXBsZW1lbnRlZCB0aGF0IHdheSAoYW5kIHNvbWUgb2YgdGhlbSBjYW4gb25seQorYmUgaW1wbGVtZW50ZWQgYXMgYnVpbHQtaW5zLCBsaWtlICJhbGlhcyIpOgorCithbGlhcworYmcKK2NkCitjb21tYW5kCitmYWxzZQorZmMKK2ZnCitnZXRvcHRzCitqb2JzCitraWxsCituZXdncnAKK3B3ZAorcmVhZAordHJ1ZQordW1hc2sKK3VuYWxpYXMKK3dhaXQKKworCitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbAorU2hlbGwgQ29tbWFuZCBMYW5ndWFnZQorCitJdCBzYXlzIHRoYXQgc2hlbGwgbXVzdCBpbXBsZW1lbnQgc3BlY2lhbCBidWlsdC1pbnMuIFNwZWNpYWwgYnVpbHQtaW5zCitkaWZmZXIgZnJvbSByZWd1bGFyIG9uZXMgYnkgdGhlIGZhY3QgdGhhdCB2YXJpYWJsZSBhc3NpZ25tZW50cworZG9uZSBvbiBzcGVjaWFsIGJ1aWx0aW4gYXJlICpQUkVTRVJWRUQqLiBUaGF0IGlzLAorCitWQVI9VkFMIHNwZWNpYWxfYnVpbHRpbjsgZWNobyAkVkFSCisKK3Nob3VsZCBwcmludCBWQUwuCisKKyhBbm90aGVyIGRpc3RpbmN0aW9uIGlzIHRoYXQgYW4gZXJyb3IgaW4gc3BlY2lhbCBidWlsdC1pbiBzaG91bGQKK2Fib3J0IHRoZSBzaGVsbCwgYnV0IHRoaXMgaXMgbm90IHN1Y2ggYSBjcml0aWNhbCBkaWZmZXJlbmNlLAorYW5kIG1vcmVvdmVyLCBhdCBsZWFzdCBiYXNoJ3MgInNldCIgZG9lcyBub3QgZm9sbG93IHRoaXMgcnVsZSwKK3doaWNoIGlzIGV2ZW4gY29kaWZpZWQgaW4gYXV0b2NvbmYgY29uZmlndXJlIGxvZ2ljIG5vdy4uLikKKworTGlzdCBvZiBzcGVjaWFsIGJ1aWx0aW5zOgorCisuIGZpbGUKKzogW2FyZ3VtZW50Li4uXQorYnJlYWsgW25dCitjb250aW51ZSBbbl0KK2V2YWwgW2FyZ3VtZW50Li4uXQorZXhlYyBbY29tbWFuZCBbYXJndW1lbnQuLi5dXQorZXhpdCBbbl0KK2V4cG9ydCBuYW1lWz13b3JkXS4uLgorZXhwb3J0IC1wCityZWFkb25seSBuYW1lWz13b3JkXS4uLgorcmVhZG9ubHkgLXAKK3JldHVybiBbbl0KK3NldCBbLWFiQ2VmaG1udXZ4XSBbLW8gb3B0aW9uXSBbYXJndW1lbnQuLi5dCitzZXQgWythYkNlZmhtbnV2eF0gWytvIG9wdGlvbl0gW2FyZ3VtZW50Li4uXQorc2V0IC0tIFthcmd1bWVudC4uLl0KK3NldCAtbworc2V0ICtvCitzaGlmdCBbbl0KK3RpbWVzCit0cmFwIG4gW2NvbmRpdGlvbi4uLl0KK3RyYXAgW2FjdGlvbiBjb25kaXRpb24uLi5dCit1bnNldCBbLWZ2XSBuYW1lLi4uCisKK0luIHByYWN0aWNlLCBubyBvbmUgdXNlcyB0aGlzIG9ic2N1cmUgZmVhdHVyZSAtIG5vbmUgb2YgdGhlc2UgYnVpbHRpbnMKK2dpdmVzIGFueSBzcGVjaWFsIHJlYXNvbnMgdG8gcGxheSBzdWNoIGRpcnR5IHRyaWNrcy4KKworSG93ZXZlci4gVGhpcyBzZWN0aW9uIGFsc28gc2F5cyB0aGF0ICpmdW5jdGlvbiBpbnZvY2F0aW9uKiBzaG91bGQgYWN0CitzaW1pbGFyIHRvIHNwZWNpYWwgYnVpbHQtaW4uIFRoYXQgaXMsIHZhcmlhYmxlIGFzc2lnbm1lbnRzCitkb25lIG9uIGZ1bmN0aW9uIGludm9jYXRpb24gc2hvdWxkIGJlIHByZXNlcnZlZCBhZnRlciBmdW5jdGlvbiBpbnZvY2F0aW9uLgorCitUaGlzIGlzIHNpZ25pZmljYW50OiBpdCBpcyBub3QgdW50aGlua2FibGUgdG8gd2FudCB0byBydW4gYSBmdW5jdGlvbgord2l0aCBzb21lIHZhcmlhYmxlcyBzZXQgdG8gc3BlY2lhbCB2YWx1ZXMuIEJ1dCBiZWNhdXNlIG9mIHRoZSBhYm92ZSwKK2l0IGRvZXMgbm90IHdvcms6IHZhcmlhYmxlIHdpbGwgImxlYWsiIG91dCBvZiB0aGUgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9zaGVsbC9SRUFETUUuam9iIGIvc2hlbGwvUkVBRE1FLmpvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJhOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvUkVBRE1FLmpvYgpAQCAtMCwwICsxLDMwNCBAQAorc3RyYWNlIG9mICJzbGVlcCAxIHwgc2xlZXAgMiIgYmVpbmcgcnVuIGZyb20gaW50ZXJhY3RpdmUgYmFzaCAzLjAKKworCitTeW5vcHNpczoKK29wZW4gL2Rldi90dHkgWywgaWYgZmFpbHMsIG9wZW4gdHR5bmFtZSgwKV07IGNsb3NlIC8qIGhlbHBzIHJlLWVzdGFibGlzaCBjdHR5ICovCitnZXQgY3VycmVudCBzaWduYWwgbWFzaworVENHRVRTIG9uIGZkIyAwCitUQ0dFVFMgb24gZmQjIDIgLyogTkI6IGlmIHJldHVybnMgRU5PVFRZICgyPi9kZXYvbnVsbCksIHNoIHNlZW1zIHRvIGRpc2FibGUgam9iIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgZG9lcyBub3Qgc2hvdyBwcm9tcHQsIGJ1dCBzdGlsbCBleGVjdXRlcyBjbWRzIGZyb20gZmQjIDAgKi8KK2luc3RhbGwgZGVmYXVsdCBoYW5kbGVycyBmb3IgQ0hMRCBRVUlUIFRFUk0KK2luc3RhbGwgY29tbW9uIGhhbmRsZXIgZm9yIEhVUCBJTlQgSUxMIFRSQVAgQUJSVCBGUEUgQlVTIFNFR1YgU1lTIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gVVNSMSBVU1IyCitpZ25vcmUgUVVJVAoraW5zdGFsbCBoYW5kbGVyIGZvciBJTlQKK2lnbm9yZSBURVJNCitpbnN0YWxsIGhhbmRsZXIgZm9yIElOVAoraWdub3JlIFRTVFAgVFRPVSBUVElOCitpbnN0YWxsIGhhbmRsZXIgZm9yIFdJTkNICitnZXQgcGlkLCBwcGlkCitibG9jayBhbGwgc2lnbmFscwordW5ibG9jayBhbGwgc2lnbmFscworZ2V0IG91ciBwcHJvY2VzcyBncm91cAorICAgIG1pbmlkb2M6CisgICAgRWFjaCBwcm9jZXNzIGdyb3VwIGlzIGEgbWVtYmVyIG9mIGEgc2Vzc2lvbiBhbmQgZWFjaCBwcm9jZXNzIGlzIGEgbWVtYmVyCisgICAgb2YgdGhlIHNlc3Npb24gb2Ygd2hpY2ggaXRzIHByb2Nlc3MgZ3JvdXAgaXMgYSBtZW1iZXIuCisgICAgUHJvY2VzcyBncm91cHMgYXJlIHVzZWQgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzaWduYWxzLCBhbmQgYnkgdGVybWluYWxzCisgICAgdG8gYXJiaXRyYXRlIHJlcXVlc3RzIGZvciB0aGVpciBpbnB1dDogcHJvY2Vzc2VzIHRoYXQgaGF2ZSB0aGUgc2FtZQorICAgIHByb2Nlc3MgZ3JvdXAgYXMgdGhlIHRlcm1pbmFsIGFyZSBmb3JlZ3JvdW5kIGFuZCBtYXkgcmVhZCwgd2hpbGUgb3RoZXJzCisgICAgd2lsbCBibG9jayB3aXRoIGEgc2lnbmFsIGlmIHRoZXkgYXR0ZW1wdCB0byByZWFkLiAgVGhlc2UgY2FsbHMgYXJlIHRodXMgdXNlZAorICAgIGJ5IHByb2dyYW1zIChzaGVsbHMpIHRvIGNyZWF0ZSBwcm9jZXNzIGdyb3VwcyBpbiBpbXBsZW1lbnRpbmcgam9iIGNvbnRyb2wuCisgICAgVGhlIFRJT0NHUEdSUCBhbmQgVElPQ1NQR1JQIGNhbGxzIGRlc2NyaWJlZCBpbiB0ZXJtaW9zKDMpIGFyZSB1c2VkIHRvIGdldC9zZXQKKyAgICB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUgY29udHJvbCB0ZXJtaW5hbC4KKyAgICBJZiBhIHNlc3Npb24gaGFzIGEgY29udHJvbGxpbmcgdGVybWluYWwsIENMT0NBTCBpcyBub3Qgc2V0IGFuZCBhIGhhbmd1cCBvY2N1cnMsCisgICAgdGhlbiB0aGUgc2Vzc2lvbiBsZWFkZXIgaXMgc2VudCBhIFNJR0hVUC4gIElmIHRoZSBzZXNzaW9uIGxlYWRlciBleGl0cywKKyAgICB0aGUgU0lHSFVQIHNpZ25hbCB3aWxsIGJlIHNlbnQgdG8gZWFjaCBwcm9jZXNzIGluIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MKKyAgICBncm91cCBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCisgICAgSWYgdGhlIGV4aXQgb2YgdGhlIHByb2Nlc3MgY2F1c2VzIGEgcHJvY2VzcyBncm91cCB0byBiZWNvbWUgb3JwaGFuZWQsCisgICAgYW5kIGlmIGFueSBtZW1iZXIgb2YgdGhlIG5ld2x5LW9ycGhhbmVkIHByb2Nlc3MgZ3JvdXAgaXMgc3RvcHBlZCwgdGhlbiBhIFNJR0hVUAorICAgIHNpZ25hbCBmb2xsb3dlZCBieSBhIFNJR0NPTlQgc2lnbmFsIHdpbGwgYmUgc2VudCB0byBlYWNoIHByb2Nlc3MKKyAgICBpbiB0aGUgbmV3bHktb3JwaGFuZWQgcHJvY2VzcyBncm91cC4KKy4uLgorZHVwIHN0ZGVyciB0byBmZCMgMjU1Cittb3ZlIG91cnNlbGYgdG8gb3VyIG93biBwcm9jZXNzIGdyb3VwCitibG9jayBDSExEIFRTVFAgVFRJTiBUVE9VCitzZXQgdHR5J3MgKDI1NSwgc3RkZXJyJ3MpIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBvdXIgZ3JvdXAKK2FsbG93IGFsbCBzaWduYWxzCittYXJrIDI1NSBDTE9FWEVDCitzZXQgQ0hMRCBoYW5kbGVyCitnZXQgc2lnbmFsIG1hc2sKK2dldCBmZCMwIGZsYWdzCitnZXQgc2lnbmFsIG1hc2sKK3NldCBJTlQgaGFuZGxlcgorYmxvY2sgQ0hMRCBUU1RQIFRUSU4gVFRPVQorc2V0IGZkICMyNTUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIHRvIG91ciBncm91cAorYWxsb3cgYWxsIHNpZ25hbHMKK3NldCBJTlQgaGFuZGxlcgorYmxvY2sgYWxsIHNpZ25hbHMKK2FsbG93IGFsbCBzaWduYWxzCitibG9jayBJTlQKK2FsbG93IGFsbCBzaWduYWxzCitsb3RzYSBzaWdhY3Rpb25zOiBzZXQgSU5ULEFMUk0sV0lOQ0ggaGFuZGxlcnMsIGlnbm9yZSBURVJNLFFVSVQsVFNUUCxUVE9VLFRUSU4KK2Jsb2NrIGFsbCBzaWduYWxzCithbGxvdyBhbGwgc2lnbmFscworYmxvY2sgYWxsIHNpZ25hbHMKK2FsbG93IGFsbCBzaWduYWxzCitibG9jayBhbGwgc2lnbmFscworYWxsb3cgYWxsIHNpZ25hbHMKK3JlYWQgInNsZWVwIDEgfCBzbGVlcCAyXG4iCitibG9jayBJTlQKK1RDU0VUU1cgb24gZmQjIDAKK2FsbG93IGFsbCBzaWduYWxzCitsb3RzYSBzaWdhY3Rpb25zOiBzZXQgSU5ULEFMUk0sV0lOQ0ggaGFuZGxlcnMsIGlnbm9yZSBURVJNLFFVSVQsVFNUUCxUVE9VLFRUSU4KK2Jsb2NrIENITEQKK3BpcGUoWzQsIDVdKSAgLyogb29wcyBzZWVtcyBJIGxvc3QgYW5vdGhlciBwaXBlKCkgaW4gZWRpdGluZy4uLiAqLworZm9yayBjaGlsZCAjMQorcHV0IGNoaWxkIGluIGl0J3Mgb3duIHByb2Nlc3MgZ3JvdXAKK2Jsb2NrIG9ubHkgQ0hMRAorY2xvc2UoNSkKK2Jsb2NrIG9ubHkgSU5UIENITEQKK2ZvcmsgY2hpbGQgIzIKK3B1dCBjaGlsZCBpbiB0aGUgc2FtZSBwcm9jZXNzIGdyb3VwIGFzIGZpcnN0IG9uZQorYmxvY2sgb25seSBDSExECitjbG9zZSg0KQorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQgVFNUUCBUVElOIFRUT1UKK3NldCBmZCMgMjU1IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBmaXJzdCBjaGlsZCdzIG9uZQorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQKK2Jsb2NrIG9ubHkgQ0hMRAorLyogbm90ZTogYmVjYXVzZSBzaGVsbCBpcyBub3QgaW4gZm9yZWdyb3VuZCBub3csIGUuZy4gQ3RybC1DIHdpbGwgc2VuZCBJTlQgdG8gY2hpbGRyZW4gb25seSEgKi8KK3dhaXQ0IGZvciBjaGlsZHJlbiB0byBkaWUgb3Igc3RvcCAtIGZpcnN0IGNoaWxkIGV4aXRzCit3YWl0NCBmb3IgY2hpbGRyZW4gdG8gZGllIG9yIHN0b3AgLSBzZWNvbmQgY2hpbGQgZXhpdHMKK2Jsb2NrIENITEQgVFNUUCBUVElOIFRUT1UKK3NldCBmZCMgMjU1IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBvdXIgb3duIG9uZQorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQKK2Jsb2NrIG5vdGhpbmcKKy0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisgICAgd2FpdCBmb3IgaXQgLSBubyBjaGlsZCAoYWxyZWFkeSB3YWl0ZWQgZm9yKQorICAgIHNpZ3JldHVybigpCityZWFkIHNpZ25hbCBtYXNrCitsb3RzYSBzaWdhY3Rpb25zLi4uCityZWFkIG5leHQgY29tbWFuZAorCisKK2V4ZWN2ZSgiL2Jpbi9zaCIsIFsic2giXSwgWy8qIDM0IHZhcnMgKi9dKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAoraW9jdGwoMCwgU05EQ1RMX1RNUl9USU1FQkFTRSBvciBUQ0dFVFMsIHtCMzg0MDAgb3Bvc3QgaXNpZyBpY2Fub24gZWNobyAuLi59KSA9IDAKK2lvY3RsKDIsIFNORENUTF9UTVJfVElNRUJBU0Ugb3IgVENHRVRTLCB7QjM4NDAwIG9wb3N0IGlzaWcgaWNhbm9uIGVjaG8gLi4ufSkgPSAwCitydF9zaWdhY3Rpb24oU0lHQ0hMRCwge1NJR19ERkx9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfREZMfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0RGTH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSFVQLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSUxMLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFJBUCwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FCUlQsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdGUEUsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdCVVMsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdTRUdWLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHU1lTLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUElQRSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHWENQVSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1hGU1osIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdWVEFMUk0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdVU1IxLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVVNSMiwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19JR059LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0lHTn0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7U0lHX0lHTn0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19JR059LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfSUdOfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdXSU5DSCwgezB4ODA3ZGMzMywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK2dldHBpZCgpICAgICAgICAgICAgICAgID0gMTk0NzMKK2dldHBwaWQoKSAgICAgICAgICAgICAgID0gMTk0NzIKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgfltdLCBbXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorZ2V0cGdycCgpICAgICAgICAgICAgICAgPSAxODY1CitkdXAoMikgICAgICAgICAgICAgICAgICA9IDQKK2ZjbnRsNjQoMjU1LCBGX0dFVEZEKSAgID0gLTEgRUJBREYgKEJhZCBmaWxlIGRlc2NyaXB0b3IpCitkdXAyKDQsIDI1NSkgICAgICAgICAgICA9IDI1NQorY2xvc2UoNCkgICAgICAgICAgICAgICAgPSAwCitpb2N0bCgyNTUsIFRJT0NHUEdSUCwgWzE4NjVdKSA9IDAKK2dldHBpZCgpICAgICAgICAgICAgICAgID0gMTk0NzMKK3NldHBnaWQoMCwgMTk0NzMpICAgICAgID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRCBUU1RQIFRUSU4gVFRPVV0sIFtdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk0NzNdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitmY250bDY0KDI1NSwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPSAwCitydF9zaWdhY3Rpb24oU0lHQ0hMRCwgezB4ODA3YzkyMiwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorZmNudGw2NCgwLCBGX0dFVEZMKSAgICAgPSAweDIgKGZsYWdzIE9fUkRXUikKKy4uLgorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbXSwgOCkgPSAwCitpb2N0bCgyNTUsIFRJT0NTUEdSUCwgWzE5NDczXSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIH5bXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0lOVF0sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdRVUlULCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHV0lOQ0gsIHsweDgwY2E1Y2QsIFtdLCBTQV9SRVNUT1JFUnxTQV9SRVNUQVJULCAweDZmZjdhNGY4fSwgezB4ODA3ZGMzMywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIH5bXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgfltdLCBbXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCB+W10sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCit3cml0ZSgyLCAic2gtMy4wMCMgIiwgOSkgPSA5CitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK3JlYWQoMCwgInMiLCAxKSAgICAgICAgID0gMQord3JpdGUoMiwgInMiLCAxKSAgICAgICAgPSAxCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK3JlYWQoMCwgImwiLCAxKSAgICAgICAgID0gMQord3JpdGUoMiwgImwiLCAxKSAgICAgICAgPSAxCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKKy4uLiByZXN0IG9mICJzbGVlcCAxIHwgc2xlZXAgMiIgZW50ZXJlZC4uLgorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCityZWFkKDAsICIyIiwgMSkgICAgICAgICA9IDEKK3dyaXRlKDIsICIyIiwgMSkgICAgICAgID0gMQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCityZWFkKDAsICJcciIsIDEpICAgICAgICA9IDEKK3dyaXRlKDIsICJcbiIsIDEpICAgICAgID0gMQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbSU5UXSwgW10sIDgpID0gMAoraW9jdGwoMCwgU05EQ1RMX1RNUl9TVE9QIG9yIFRDU0VUU1csIHtCMzg0MDAgb3Bvc3QgaXNpZyBpY2Fub24gZWNobyAuLi59KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19JR059LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwge1NJR19JR059LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHtTSUdfSUdOfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHV0lOQ0gsIHsweDgwN2RjMzMsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwY2E1Y2QsIFtdLCBTQV9SRVNUT1JFUnxTQV9SRVNUQVJULCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITERdLCBbXSwgOCkgPSAwCitwaXBlKFs0LCA1XSkgICAgICAgICAgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0lOVCBDSExEXSwgW0NITERdLCA4KSA9IDAKK2ZvcmsoKSAgICAgICAgICAgICAgICAgID0gMTk3NTUKK3NldHBnaWQoMTk3NTUsIDE5NzU1KSAgICAgICAgICAgICAgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbQ0hMRF0sIE5VTEwsIDgpID0gMAorY2xvc2UoNSkgICAgICAgICAgICAgICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtJTlQgQ0hMRF0sIFtDSExEXSwgOCkgPSAwCitmb3JrKCkgICAgICAgICAgICAgICAgICA9IDE5NzU2CitzZXRwZ2lkKDE5NzU2LCAxOTc1NSkgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbQ0hMRF0sIE5VTEwsIDgpID0gMAorY2xvc2UoNCkgICAgICAgICAgICAgICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEXSwgW0NITERdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbQ0hMRF0sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTc1NV0pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtDSExEXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW0NITERdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITERdLCBbQ0hMRF0sIDgpID0gMAord2FpdDQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgV1VOVFJBQ0VELCBOVUxMKSA9IDE5NzU1Cit3YWl0NCgtMSwgW3tXSUZFWElURUQocykgJiYgV0VYSVRTVEFUVVMocykgPT0gMH1dLCBXVU5UUkFDRUQsIE5VTEwpID0gMTk3NTYKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbQ0hMRF0sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTQ3M10pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtDSExEXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW0NITERdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCistLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQord2FpdDQoLTEsIDB4NzdmYzljNTQsIFdOT0hBTkd8V1VOVFJBQ0VELCBOVUxMKSA9IC0xIEVDSElMRCAoTm8gY2hpbGQgcHJvY2Vzc2VzKQorc2lncmV0dXJuKCkgICAgICAgICAgICAgPSA/IChtYXNrIG5vdyBbXSkKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW10sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTQ3M10pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbSU5UXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdRVUlULCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHQUxSTSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVE9VLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRJTiwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdXSU5DSCwgezB4ODBjYTVjZCwgW10sIFNBX1JFU1RPUkVSfFNBX1JFU1RBUlQsIDB4NmZmN2E0Zjh9LCB7MHg4MDdkYzMzLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3dyaXRlKDIsICJzaC0zLjAwIyAiLCA5KSA9IDkKKworCitnZXRwaWQoKSA9IDE5NzU1CitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHtTSUdfREZMfSwge1NJR19JR059LCA4KSAgICA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorc2V0cGdpZCgxOTc1NSwgMTk3NTUpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRCBUU1RQIFRUSU4gVFRPVV0sIFtdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk3NTVdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitjbG9zZSg0KSAgID0gMAorZHVwMig1LCAxKSA9IDEKK2Nsb3NlKDUpICAgICAgICAgICAgICA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHtTSUdfREZMfSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdDSExELCB7U0lHX0RGTH0sIHsweDgwN2M5MjIsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorZXhlY3ZlKCIvYmluL3NsZWVwIiwgWyJzbGVlcCIsICIxIl0sIFsvKiAzNCB2YXJzICovXSkgPSAwCisuLi4KK19leGl0KDApICAgICAgICAgICAgICAgID0gPworCisKK2dldHBpZCgpID0gMTk3NTYKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVE9VLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitzZXRwZ2lkKDE5NzU2LCAxOTc1NSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW10sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTc1NV0pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK2R1cDIoNCwgMCkgPSAwCitjbG9zZSg0KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHtTSUdfREZMfSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdDSExELCB7U0lHX0RGTH0sIHsweDgwN2M5MjIsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorZXhlY3ZlKCIvYmluL3NsZWVwIiwgWyJzbGVlcCIsICIyIl0sIFsvKiAzNCB2YXJzICovXSkgPSAwCisuLi4KK19leGl0KDApICAgICAgICAgICAgICAgID0gPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoLmMgYi9zaGVsbC9hc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhjZDAxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoLmMKQEAgLTAsMCArMSwxMzI1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYXNoIHNoZWxsIHBvcnQgZm9yIGJ1c3lib3gKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIE9yaWdpbmFsIEJTRCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHNldCB0byByZWZsZWN0IHRoZSB0eXBlIG9mIHN5c3RlbSB5b3UgaGF2ZToKKyAqICAgICAgSk9CUyAtPiAxIGlmIHlvdSBoYXZlIEJlcmtlbGV5IGpvYiBjb250cm9sLCAwIG90aGVyd2lzZS4KKyAqICAgICAgZGVmaW5lIFNZU1YgaWYgeW91IGFyZSBydW5uaW5nIHVuZGVyIFN5c3RlbSBWLgorICogICAgICBkZWZpbmUgREVCVUc9MSB0byBjb21waWxlIGluIGRlYnVnZ2luZyAoJ3NldCAtbyBkZWJ1ZycgdG8gdHVybiBvbikKKyAqICAgICAgZGVmaW5lIERFQlVHPTIgdG8gY29tcGlsZSBpbiBhbmQgdHVybiBvbiBkZWJ1Z2dpbmcuCisgKgorICogV2hlbiBkZWJ1Z2dpbmcgaXMgb24sIGRlYnVnZ2luZyBpbmZvIHdpbGwgYmUgd3JpdHRlbiB0byAuL3RyYWNlIGFuZAorICogYSBxdWl0IHNpZ25hbCB3aWxsIGdlbmVyYXRlIGEgY29yZSBkdW1wLgorICovCisjZGVmaW5lIERFQlVHIDAKKy8qIFR3ZWFrIGRlYnVnIG91dHB1dCB2ZXJib3NpdHkgaGVyZSAqLworI2RlZmluZSBERUJVR19USU1FIDAKKyNkZWZpbmUgREVCVUdfUElEIDEKKyNkZWZpbmUgREVCVUdfU0lHIDEKKworI2RlZmluZSBQUk9GSUxFIDAKKworI2RlZmluZSBKT0JTIEVOQUJMRV9BU0hfSk9CX0NPTlRST0wKKworI2luY2x1ZGUgPHBhdGhzLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorCisjaW5jbHVkZSAiYnVzeWJveC5oIiAvKiBmb3IgYXBwbGV0X25hbWVzICovCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisjaW5jbHVkZSAic2hlbGxfY29tbW9uLmgiCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorIyBpbmNsdWRlICJtYXRoLmgiCisjZW5kaWYKKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisjIGluY2x1ZGUgInJhbmRvbS5oIgorI2Vsc2UKKyMgZGVmaW5lIENMRUFSX1JBTkRPTV9UKHJuZCkgKCh2b2lkKTApCisjZW5kaWYKKworI2luY2x1ZGUgIk5VTV9BUFBMRVRTLmgiCisjaWYgTlVNX0FQUExFVFMgPT0gMQorLyogU1RBTkRBTE9ORSBkb2VzIG5vdCBtYWtlIHNlbnNlLCBhbmQgd29uJ3QgY29tcGlsZSAqLworIyB1bmRlZiBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIHVuZGVmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKyMgdW5kZWYgSUZfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIHVuZGVmIElGX05PVF9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUgMAorIyBkZWZpbmUgSUZfRkVBVFVSRV9TSF9TVEFOREFMT05FKC4uLikKKyMgZGVmaW5lIElGX05PVF9GRUFUVVJFX1NIX1NUQU5EQUxPTkUoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKyNpZm5kZWYgUElQRV9CVUYKKyMgZGVmaW5lIFBJUEVfQlVGIDQwOTYgICAgICAgICAgIC8qIGFtb3VudCBvZiBidWZmZXJpbmcgaW4gYSBwaXBlICovCisjZW5kaWYKKworI2lmICFCQl9NTVUKKyMgZXJyb3IgIkRvIG5vdCBldmVuIGJvdGhlciwgYXNoIHdpbGwgbm90IHJ1biBvbiBOT01NVSBtYWNoaW5lIgorI2VuZGlmCisKKy8vY29uZmlnOmNvbmZpZyBBU0gKKy8vY29uZmlnOglib29sICJhc2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiAhTk9NTVUKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGEgJ2FzaCcgc2hlbGwgYWRkcyBhYm91dCA2MGsgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgaXMKKy8vY29uZmlnOgkgIHRoZSBtb3N0IGNvbXBsZXRlIGFuZCBtb3N0IHBlZGFudGljYWxseSBjb3JyZWN0IHNoZWxsIGluY2x1ZGVkIHdpdGgKKy8vY29uZmlnOgkgIGJ1c3lib3guIFRoaXMgc2hlbGwgaXMgYWN0dWFsbHkgYSBkZXJpdmF0aXZlIG9mIHRoZSBEZWJpYW4gJ2Rhc2gnCisvL2NvbmZpZzoJICBzaGVsbCAoYnkgSGVyYmVydCBYdSksIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IHBvcnRpbmcgdGhlICdhc2gnIHNoZWxsCisvL2NvbmZpZzoJICAod3JpdHRlbiBieSBLZW5uZXRoIEFsbXF1aXN0KSBmcm9tIE5ldEJTRC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9CQVNIX0NPTVBBVAorLy9jb25maWc6CWJvb2wgImJhc2gtY29tcGF0aWJsZSBleHRlbnNpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGJhc2gtY29tcGF0aWJsZSBleHRlbnNpb25zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0lETEVfVElNRU9VVAorLy9jb25maWc6CWJvb2wgIklkbGUgdGltZW91dCB2YXJpYWJsZSIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZXMgYmFzaC1saWtlIGF1dG8tbG9nb3V0IGFmdGVyICRUTU9VVCBzZWNvbmRzIG9mIGlkbGUgdGltZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9KT0JfQ09OVFJPTAorLy9jb25maWc6CWJvb2wgIkpvYiBjb250cm9sIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGpvYiBjb250cm9sIGluIHRoZSBhc2ggc2hlbGwuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQUxJQVMKKy8vY29uZmlnOglib29sICJBbGlhcyBzdXBwb3J0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGFsaWFzIHN1cHBvcnQgaW4gdGhlIGFzaCBzaGVsbC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9HRVRPUFRTCisvL2NvbmZpZzoJYm9vbCAiQnVpbHRpbiBnZXRvcHQgdG8gcGFyc2UgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIGdldG9wdHMgYnVpbHRpbiBpbiBhc2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQlVJTFRJTl9FQ0hPCisvL2NvbmZpZzoJYm9vbCAiQnVpbHRpbiB2ZXJzaW9uIG9mICdlY2hvJyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciBlY2hvIGJ1aWx0aW4gaW4gYXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0JVSUxUSU5fUFJJTlRGCisvL2NvbmZpZzoJYm9vbCAiQnVpbHRpbiB2ZXJzaW9uIG9mICdwcmludGYnIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIHByaW50ZiBidWlsdGluIGluIGFzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9CVUlMVElOX1RFU1QKKy8vY29uZmlnOglib29sICJCdWlsdGluIHZlcnNpb24gb2YgJ3Rlc3QnIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRlc3QgYnVpbHRpbiBpbiBhc2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQ01EQ01ECisvL2NvbmZpZzoJYm9vbCAiJ2NvbW1hbmQnIGNvbW1hbmQgdG8gb3ZlcnJpZGUgc2hlbGwgYnVpbHRpbnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIGFzaCAnY29tbWFuZCcgYnVpbHRpbiwgd2hpY2ggYWxsb3dzCisvL2NvbmZpZzoJICB5b3UgdG8gcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLAorLy9jb25maWc6CSAgZXZlbiB3aGVuIHRoZXJlIGlzIGFuIGFzaCBidWlsdGluIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX01BSUwKKy8vY29uZmlnOglib29sICJDaGVjayBmb3IgbmV3IG1haWwgb24gaW50ZXJhY3RpdmUgc2hlbGxzIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlICJjaGVjayBmb3IgbmV3IG1haWwiIGZ1bmN0aW9uIGluIHRoZSBhc2ggc2hlbGwuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfT1BUSU1JWkVfRk9SX1NJWkUKKy8vY29uZmlnOglib29sICJPcHRpbWl6ZSBmb3Igc2l6ZSBpbnN0ZWFkIG9mIHNwZWVkIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ29tcGlsZSBhc2ggZm9yIHJlZHVjZWQgc2l6ZSBhdCB0aGUgcHJpY2Ugb2Ygc3BlZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfUkFORE9NX1NVUFBPUlQKKy8vY29uZmlnOglib29sICJQc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCAkUkFORE9NIHZhcmlhYmxlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHBzZXVkb3JhbmRvbSBnZW5lcmF0b3IgYW5kIGR5bmFtaWMgdmFyaWFibGUgIiRSQU5ET00iLgorLy9jb25maWc6CSAgRWFjaCByZWFkIG9mICIkUkFORE9NIiB3aWxsIGdlbmVyYXRlIGEgbmV3IHBzZXVkb3JhbmRvbSB2YWx1ZS4KKy8vY29uZmlnOgkgIFlvdSBjYW4gcmVzZXQgdGhlIGdlbmVyYXRvciBieSB1c2luZyBhIHNwZWNpZmllZCBzdGFydCB2YWx1ZS4KKy8vY29uZmlnOgkgIEFmdGVyICJ1bnNldCBSQU5ET00iIHRoZSBnZW5lcmF0b3Igd2lsbCBzd2l0Y2ggb2ZmIGFuZCB0aGlzCisvL2NvbmZpZzoJICB2YXJpYWJsZSB3aWxsIG5vIGxvbmdlciBoYXZlIHNwZWNpYWwgdHJlYXRtZW50LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0VYUEFORF9QUk1UCisvL2NvbmZpZzoJYm9vbCAiRXhwYW5kIHByb21wdCBzdHJpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICAiUFMjIiBtYXkgY29udGFpbiB2b2xhdGlsZSBjb250ZW50LCBzdWNoIGFzIGJhY2txdW90ZSBjb21tYW5kcy4KKy8vY29uZmlnOgkgIFRoaXMgb3B0aW9uIHJlY3JlYXRlcyB0aGUgcHJvbXB0IHN0cmluZyBmcm9tIHRoZSBlbnZpcm9ubWVudAorLy9jb25maWc6CSAgdmFyaWFibGUgZWFjaCB0aW1lIGl0IGlzIGRpc3BsYXllZC4KKy8vY29uZmlnOgorCisvL2FwcGxldDpJRl9BU0goQVBQTEVUKGFzaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfU0hfSVNfQVNIKEFQUExFVF9PREROQU1FKHNoLCBhc2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgc2gpKQorLy9hcHBsZXQ6SUZfRkVBVFVSRV9CQVNIX0lTX0FTSChBUFBMRVRfT0RETkFNRShiYXNoLCBhc2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgYmFzaCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19BU0gpICs9IGFzaC5vIGFzaF9wdHJfaGFjay5vIHNoZWxsX2NvbW1vbi5vCisvL2tidWlsZDpsaWItJChDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUKSArPSByYW5kb20ubworCisKKy8qID09PT09PT09PT09PSBIYXNoIHRhYmxlIHNpemVzLiBDb25maWd1cmFibGUuICovCisKKyNkZWZpbmUgVlRBQlNJWkUgMzkKKyNkZWZpbmUgQVRBQlNJWkUgMzkKKyNkZWZpbmUgQ01EVEFCTEVTSVpFIDMxICAgICAgICAgLyogc2hvdWxkIGJlIHByaW1lICovCisKKworLyogPT09PT09PT09PT09IFNoZWxsIG9wdGlvbnMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG9wdGxldHRlcnNfb3B0bmFtZXNbXSA9IHsKKwkiZSIgICAiZXJyZXhpdCIsCisJImYiICAgIm5vZ2xvYiIsCisJIkkiICAgImlnbm9yZWVvZiIsCisJImkiICAgImludGVyYWN0aXZlIiwKKwkibSIgICAibW9uaXRvciIsCisJIm4iICAgIm5vZXhlYyIsCisJInMiICAgInN0ZGluIiwKKwkieCIgICAieHRyYWNlIiwKKwkidiIgICAidmVyYm9zZSIsCisJIkMiICAgIm5vY2xvYmJlciIsCisJImEiICAgImFsbGV4cG9ydCIsCisJImIiICAgIm5vdGlmeSIsCisJInUiICAgIm5vdW5zZXQiLAorCSJcMCIgICJ2aSIKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJLCJcMCIgICJwaXBlZmFpbCIKKyNlbmRpZgorI2lmIERFQlVHCisJLCJcMCIgICJub2xvZyIKKwksIlwwIiAgImRlYnVnIgorI2VuZGlmCit9OworCisjZGVmaW5lIG9wdGxldHRlcnMobikgIG9wdGxldHRlcnNfb3B0bmFtZXNbbl1bMF0KKyNkZWZpbmUgb3B0bmFtZXMobikgICAob3B0bGV0dGVyc19vcHRuYW1lc1tuXSArIDEpCisKK2VudW0geyBOT1BUUyA9IEFSUkFZX1NJWkUob3B0bGV0dGVyc19vcHRuYW1lcykgfTsKKworCisvKiA9PT09PT09PT09PT0gTWlzYyBkYXRhICovCisKKyNkZWZpbmUgbXNnX2lsbG51bSAiSWxsZWdhbCBudW1iZXI6ICVzIgorCisvKgorICogV2UgZW5jbG9zZSBqbXBfYnVmIGluIGEgc3RydWN0dXJlIHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgcG9pbnRlcnMgdG8KKyAqIGp1bXAgbG9jYXRpb25zLiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBoYW5kbGVyIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB0bworICoganVtcCB0byB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGFuZCB0aGUgZ2xvYmFsIHZhcmlhYmxlIGV4Y2VwdGlvbl90eXBlCisgKiBjb250YWlucyBhIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGV4Y2VwdGlvbi4gIFRvIGltcGxlbWVudCBuZXN0ZWQKKyAqIGV4Y2VwdGlvbiBoYW5kbGVycywgdGhlIHVzZXIgc2hvdWxkIHNhdmUgdGhlIHZhbHVlIG9mIGhhbmRsZXIgb24gZW50cnkKKyAqIHRvIGFuIGlubmVyIHNjb3BlLCBzZXQgaGFuZGxlciB0byBwb2ludCB0byBhIGptcGxvYyBzdHJ1Y3R1cmUgZm9yIHRoZQorICogaW5uZXIgc2NvcGUsIGFuZCByZXN0b3JlIGhhbmRsZXIgb24gZXhpdCBmcm9tIHRoZSBzY29wZS4KKyAqLworc3RydWN0IGptcGxvYyB7CisJam1wX2J1ZiBsb2M7Cit9OworCitzdHJ1Y3QgZ2xvYmFsc19taXNjIHsKKwkvKiBwaWQgb2YgbWFpbiBzaGVsbCAqLworCWludCByb290cGlkOworCS8qIHNoZWxsIGxldmVsOiAwIGZvciB0aGUgbWFpbiBzaGVsbCwgMSBmb3IgaXRzIGNoaWxkcmVuLCBhbmQgc28gb24gKi8KKwlpbnQgc2hsdmw7CisjZGVmaW5lIHJvb3RzaGVsbCAoIXNobHZsKQorCWNoYXIgKm1pbnVzYzsgIC8qIGFyZ3VtZW50IHRvIC1jIG9wdGlvbiAqLworCisJY2hhciAqY3VyZGlyOyAvLyA9IG51bGxzdHI7ICAgICAvKiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCisJY2hhciAqcGh5c2RpcjsgLy8gPSBudWxsc3RyOyAgICAvKiBwaHlzaWNhbCB3b3JraW5nIGRpcmVjdG9yeSAqLworCisJY2hhciAqYXJnMDsgLyogdmFsdWUgb2YgJDAgKi8KKworCXN0cnVjdCBqbXBsb2MgKmV4Y2VwdGlvbl9oYW5kbGVyOworCisJdm9sYXRpbGUgaW50IHN1cHByZXNzX2ludDsgLyogY291bnRlciAqLworCXZvbGF0aWxlIC8qc2lnX2F0b21pY190Ki8gc21hbGxpbnQgcGVuZGluZ19pbnQ7IC8qIDEgPSBnb3QgU0lHSU5UICovCisJLyogbGFzdCBwZW5kaW5nIHNpZ25hbCAqLworCXZvbGF0aWxlIC8qc2lnX2F0b21pY190Ki8gc21hbGxpbnQgcGVuZGluZ19zaWc7CisJc21hbGxpbnQgZXhjZXB0aW9uX3R5cGU7IC8qIGtpbmQgb2YgZXhjZXB0aW9uICgwLi41KSAqLworCS8qIGV4Y2VwdGlvbnMgKi8KKyNkZWZpbmUgRVhJTlQgMCAgICAgICAgIC8qIFNJR0lOVCByZWNlaXZlZCAqLworI2RlZmluZSBFWEVSUk9SIDEgICAgICAgLyogYSBnZW5lcmljIGVycm9yICovCisjZGVmaW5lIEVYU0hFTExQUk9DIDIgICAvKiBleGVjdXRlIGEgc2hlbGwgcHJvY2VkdXJlICovCisjZGVmaW5lIEVYRVhFQyAzICAgICAgICAvKiBjb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUgRVhFWElUIDQgICAgICAgIC8qIGV4aXQgdGhlIHNoZWxsICovCisjZGVmaW5lIEVYU0lHIDUgICAgICAgICAvKiB0cmFwcGVkIHNpZ25hbCBpbiB3YWl0KDEpICovCisKKwlzbWFsbGludCBpc2xvZ2luc2g7CisJY2hhciBudWxsc3RyWzFdOyAgICAgICAgLyogemVybyBsZW5ndGggc3RyaW5nICovCisKKwljaGFyIG9wdGxpc3RbTk9QVFNdOworI2RlZmluZSBlZmxhZyBvcHRsaXN0WzBdCisjZGVmaW5lIGZmbGFnIG9wdGxpc3RbMV0KKyNkZWZpbmUgSWZsYWcgb3B0bGlzdFsyXQorI2RlZmluZSBpZmxhZyBvcHRsaXN0WzNdCisjZGVmaW5lIG1mbGFnIG9wdGxpc3RbNF0KKyNkZWZpbmUgbmZsYWcgb3B0bGlzdFs1XQorI2RlZmluZSBzZmxhZyBvcHRsaXN0WzZdCisjZGVmaW5lIHhmbGFnIG9wdGxpc3RbN10KKyNkZWZpbmUgdmZsYWcgb3B0bGlzdFs4XQorI2RlZmluZSBDZmxhZyBvcHRsaXN0WzldCisjZGVmaW5lIGFmbGFnIG9wdGxpc3RbMTBdCisjZGVmaW5lIGJmbGFnIG9wdGxpc3RbMTFdCisjZGVmaW5lIHVmbGFnIG9wdGxpc3RbMTJdCisjZGVmaW5lIHZpZmxhZyBvcHRsaXN0WzEzXQorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyMgZGVmaW5lIHBpcGVmYWlsIG9wdGxpc3RbMTRdCisjZWxzZQorIyBkZWZpbmUgcGlwZWZhaWwgMAorI2VuZGlmCisjaWYgREVCVUcKKyMgZGVmaW5lIG5vbG9nIG9wdGxpc3RbMTQgKyBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUXQorIyBkZWZpbmUgZGVidWcgb3B0bGlzdFsxNSArIEVOQUJMRV9BU0hfQkFTSF9DT01QQVRdCisjZW5kaWYKKworCS8qIHRyYXAgaGFuZGxlciBjb21tYW5kcyAqLworCS8qCisJICogU2lnbW9kZSByZWNvcmRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzaWduYWwgaGFuZGxlcnMgZm9yIHRoZSB2YXJpb3VzCisJICogbW9kZXMuICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgY3VycmVudCBoYW5kbGVyIGlzIG5vdCBrbm93bi4KKwkgKiBTX0hBUkRfSUdOIGluZGljYXRlcyB0aGF0IHRoZSBzaWduYWwgd2FzIGlnbm9yZWQgb24gZW50cnkgdG8gdGhlIHNoZWxsLgorCSAqLworCWNoYXIgc2lnbW9kZVtOU0lHIC0gMV07CisjZGVmaW5lIFNfREZMICAgICAgMSAgICAgICAgICAgIC8qIGRlZmF1bHQgc2lnbmFsIGhhbmRsaW5nIChTSUdfREZMKSAqLworI2RlZmluZSBTX0NBVENIICAgIDIgICAgICAgICAgICAvKiBzaWduYWwgaXMgY2F1Z2h0ICovCisjZGVmaW5lIFNfSUdOICAgICAgMyAgICAgICAgICAgIC8qIHNpZ25hbCBpcyBpZ25vcmVkIChTSUdfSUdOKSAqLworI2RlZmluZSBTX0hBUkRfSUdOIDQgICAgICAgICAgICAvKiBzaWduYWwgaXMgaWdub3JlZCBwZXJtZW5hbnRseSAqLworCisJLyogaW5kaWNhdGVzIHNwZWNpZmllZCBzaWduYWwgcmVjZWl2ZWQgKi8KKwl1aW50OF90IGdvdHNpZ1tOU0lHIC0gMV07IC8qIG9mZnNldCBieSAxOiAic2lnbmFsIiAwIGlzIG1lYW5pbmdsZXNzICovCisJdWludDhfdCBtYXlfaGF2ZV90cmFwczsgLyogMDogZGVmaW5pdGVseSBubyB0cmFwcyBhcmUgc2V0LCAxOiBzb21lIHRyYXBzIG1heSBiZSBzZXQgKi8KKwljaGFyICp0cmFwW05TSUddOworCWNoYXIgKip0cmFwX3B0cjsgICAgICAgIC8qIHVzZWQgb25seSBieSAidHJhcCBoYWNrIiAqLworCisJLyogUmFyZWx5IHJlZmVyZW5jZWQgc3R1ZmYgKi8KKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisJcmFuZG9tX3QgcmFuZG9tX2dlbjsKKyNlbmRpZgorCXBpZF90IGJhY2tnbmRwaWQ7ICAgICAgICAvKiBwaWQgb2YgbGFzdCBiYWNrZ3JvdW5kIHByb2Nlc3MgKi8KKwlzbWFsbGludCBqb2Jfd2FybmluZzsgICAgLyogdXNlciB3YXMgd2FybmVkIGFib3V0IHN0b3BwZWQgam9icyAoY2FuIGJlIDIsIDEgb3IgMCkuICovCit9OworZXh0ZXJuIHN0cnVjdCBnbG9iYWxzX21pc2MgKmNvbnN0IGFzaF9wdHJfdG9fZ2xvYmFsc19taXNjOworI2RlZmluZSBHX21pc2MgKCphc2hfcHRyX3RvX2dsb2JhbHNfbWlzYykKKyNkZWZpbmUgcm9vdHBpZCAgICAgKEdfbWlzYy5yb290cGlkICAgICkKKyNkZWZpbmUgc2hsdmwgICAgICAgKEdfbWlzYy5zaGx2bCAgICAgICkKKyNkZWZpbmUgbWludXNjICAgICAgKEdfbWlzYy5taW51c2MgICAgICkKKyNkZWZpbmUgY3VyZGlyICAgICAgKEdfbWlzYy5jdXJkaXIgICAgICkKKyNkZWZpbmUgcGh5c2RpciAgICAgKEdfbWlzYy5waHlzZGlyICAgICkKKyNkZWZpbmUgYXJnMCAgICAgICAgKEdfbWlzYy5hcmcwICAgICAgICkKKyNkZWZpbmUgZXhjZXB0aW9uX2hhbmRsZXIgKEdfbWlzYy5leGNlcHRpb25faGFuZGxlcikKKyNkZWZpbmUgZXhjZXB0aW9uX3R5cGUgICAgKEdfbWlzYy5leGNlcHRpb25fdHlwZSAgICkKKyNkZWZpbmUgc3VwcHJlc3NfaW50ICAgICAgKEdfbWlzYy5zdXBwcmVzc19pbnQgICAgICkKKyNkZWZpbmUgcGVuZGluZ19pbnQgICAgICAgKEdfbWlzYy5wZW5kaW5nX2ludCAgICAgICkKKyNkZWZpbmUgcGVuZGluZ19zaWcgICAgICAgKEdfbWlzYy5wZW5kaW5nX3NpZyAgICAgICkKKyNkZWZpbmUgaXNsb2dpbnNoICAgKEdfbWlzYy5pc2xvZ2luc2ggICkKKyNkZWZpbmUgbnVsbHN0ciAgICAgKEdfbWlzYy5udWxsc3RyICAgICkKKyNkZWZpbmUgb3B0bGlzdCAgICAgKEdfbWlzYy5vcHRsaXN0ICAgICkKKyNkZWZpbmUgc2lnbW9kZSAgICAgKEdfbWlzYy5zaWdtb2RlICAgICkKKyNkZWZpbmUgZ290c2lnICAgICAgKEdfbWlzYy5nb3RzaWcgICAgICkKKyNkZWZpbmUgbWF5X2hhdmVfdHJhcHMgICAgKEdfbWlzYy5tYXlfaGF2ZV90cmFwcyAgICkKKyNkZWZpbmUgdHJhcCAgICAgICAgKEdfbWlzYy50cmFwICAgICAgICkKKyNkZWZpbmUgdHJhcF9wdHIgICAgKEdfbWlzYy50cmFwX3B0ciAgICkKKyNkZWZpbmUgcmFuZG9tX2dlbiAgKEdfbWlzYy5yYW5kb21fZ2VuICkKKyNkZWZpbmUgYmFja2duZHBpZCAgKEdfbWlzYy5iYWNrZ25kcGlkICkKKyNkZWZpbmUgam9iX3dhcm5pbmcgKEdfbWlzYy5qb2Jfd2FybmluZykKKyNkZWZpbmUgSU5JVF9HX21pc2MoKSBkbyB7IFwKKwkoKihzdHJ1Y3QgZ2xvYmFsc19taXNjKiopJmFzaF9wdHJfdG9fZ2xvYmFsc19taXNjKSA9IHh6YWxsb2Moc2l6ZW9mKEdfbWlzYykpOyBcCisJYmFycmllcigpOyBcCisJY3VyZGlyID0gbnVsbHN0cjsgXAorCXBoeXNkaXIgPSBudWxsc3RyOyBcCisJdHJhcF9wdHIgPSB0cmFwOyBcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PSBERUJVRyAqLworI2lmIERFQlVHCitzdGF0aWMgdm9pZCB0cmFjZV9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQgdHJhY2VfdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpOworIyBkZWZpbmUgVFJBQ0UocGFyYW0pICAgIHRyYWNlX3ByaW50ZiBwYXJhbQorIyBkZWZpbmUgVFJBQ0VWKHBhcmFtKSAgIHRyYWNlX3ZwcmludGYgcGFyYW0KKyMgZGVmaW5lIGNsb3NlKGZkKSBkbyB7IFwKKwlpbnQgZGZkID0gKGZkKTsgXAorCWlmIChjbG9zZShkZmQpIDwgMCkgXAorCQliYl9lcnJvcl9tc2coImJ1ZyBvbiAlZDogY2xvc2luZyAlZCgweCV4KSIsIFwKKwkJCV9fTElORV9fLCBkZmQsIGRmZCk7IFwKK30gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgVFJBQ0UocGFyYW0pCisjIGRlZmluZSBUUkFDRVYocGFyYW0pCisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT0gVXRpbGl0eSBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgeGJhcnJpZXIoKSBkbyB7IF9fYXNtX18gX192b2xhdGlsZV9fICgiIjogOiA6Im1lbW9yeSIpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGlzZGlnaXRfc3RyOShjb25zdCBjaGFyICpzdHIpCit7CisJaW50IG1heGxlbiA9IDkgKyAxOyAvKiBtYXggOSBkaWdpdHM6IDk5OTk5OTk5OSAqLworCXdoaWxlICgtLW1heGxlbiAmJiBpc2RpZ2l0KCpzdHIpKQorCQlzdHIrKzsKKwlyZXR1cm4gKCpzdHIgPT0gJ1wwJyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp2YXJfZW5kKGNvbnN0IGNoYXIgKnZhcikKK3sKKwl3aGlsZSAoKnZhcikKKwkJaWYgKCp2YXIrKyA9PSAnPScpCisJCQlicmVhazsKKwlyZXR1cm4gdmFyOworfQorCisKKy8qID09PT09PT09PT09PSBJbnRlcnJ1cHRzIC8gZXhjZXB0aW9ucyAqLworCitzdGF0aWMgdm9pZCBleGl0c2hlbGwodm9pZCkgTk9SRVRVUk47CisKKy8qCisgKiBUaGVzZSBtYWNyb3MgYWxsb3cgdGhlIHVzZXIgdG8gc3VzcGVuZCB0aGUgaGFuZGxpbmcgb2YgaW50ZXJydXB0IHNpZ25hbHMKKyAqIG92ZXIgYSBwZXJpb2Qgb2YgdGltZS4gIFRoaXMgaXMgc2ltaWxhciB0byBTSUdIT0xEIG9yIHRvIHNpZ2Jsb2NrLCBidXQKKyAqIG11Y2ggbW9yZSBlZmZpY2llbnQgYW5kIHBvcnRhYmxlLiAgKEJ1dCBoYWNraW5nIHRoZSBrZXJuZWwgaXMgc28gbXVjaAorICogbW9yZSBmdW4gdGhhbiB3b3JyeWluZyBhYm91dCBlZmZpY2llbmN5IGFuZCBwb3J0YWJpbGl0eS4gOi0pKQorICovCisjZGVmaW5lIElOVF9PRkYgZG8geyBcCisJc3VwcHJlc3NfaW50Kys7IFwKKwl4YmFycmllcigpOyBcCit9IHdoaWxlICgwKQorCisvKgorICogQ2FsbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFNpbmNlIEMgZG9lc24ndCBpbmNsdWRlIGV4Y2VwdGlvbnMsIHdlCisgKiBqdXN0IGRvIGEgbG9uZ2ptcCB0byB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuICBUaGUgdHlwZSBvZiBleGNlcHRpb24gaXMKKyAqIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlICJleGNlcHRpb25fdHlwZSIuCisgKi8KK3N0YXRpYyB2b2lkIHJhaXNlX2V4Y2VwdGlvbihpbnQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3JhaXNlX2V4Y2VwdGlvbihpbnQgZSkKK3sKKyNpZiBERUJVRworCWlmIChleGNlcHRpb25faGFuZGxlciA9PSBOVUxMKQorCQlhYm9ydCgpOworI2VuZGlmCisJSU5UX09GRjsKKwlleGNlcHRpb25fdHlwZSA9IGU7CisJbG9uZ2ptcChleGNlcHRpb25faGFuZGxlci0+bG9jLCAxKTsKK30KKyNpZiBERUJVRworI2RlZmluZSByYWlzZV9leGNlcHRpb24oZSkgZG8geyBcCisJVFJBQ0UoKCJyYWlzaW5nIGV4Y2VwdGlvbiAlZCBvbiBsaW5lICVkXG4iLCAoZSksIF9fTElORV9fKSk7IFwKKwlyYWlzZV9leGNlcHRpb24oZSk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIENhbGxlZCBmcm9tIHRyYXAuYyB3aGVuIGEgU0lHSU5UIGlzIHJlY2VpdmVkLiAgKElmIHRoZSB1c2VyIHNwZWNpZmllcworICogdGhhdCBTSUdJTlQgaXMgdG8gYmUgdHJhcHBlZCBvciBpZ25vcmVkIHVzaW5nIHRoZSB0cmFwIGJ1aWx0aW4sIHRoZW4KKyAqIHRoaXMgcm91dGluZSBpcyBub3QgY2FsbGVkLikgIFN1cHByZXNzaW50IGlzIG5vbnplcm8gd2hlbiBpbnRlcnJ1cHRzCisgKiBhcmUgaGVsZCB1c2luZyB0aGUgSU5UX09GRiBtYWNyby4gIChUaGUgdGVzdCBmb3IgaWZsYWcgaXMganVzdAorICogZGVmZW5zaXZlIHByb2dyYW1taW5nLikKKyAqLworc3RhdGljIHZvaWQgcmFpc2VfaW50ZXJydXB0KHZvaWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3JhaXNlX2ludGVycnVwdCh2b2lkKQoreworCWludCBleF90eXBlOworCisJcGVuZGluZ19pbnQgPSAwOworCS8qIFNpZ25hbCBpcyBub3QgYXV0b21hdGljYWxseSB1bm1hc2tlZCBhZnRlciBpdCBpcyByYWlzZWQsCisJICogZG8gaXQgb3Vyc2VsZiAtIHVubWFzayBhbGwgc2lnbmFscyAqLworCXNpZ3Byb2NtYXNrX2FsbHNpZ3MoU0lHX1VOQkxPQ0spOworCS8qIHBlbmRpbmdfc2lnID0gMDsgLSBub3cgZG9uZSBpbiBzaWduYWxfaGFuZGxlcigpICovCisKKwlleF90eXBlID0gRVhTSUc7CisJaWYgKGdvdHNpZ1tTSUdJTlQgLSAxXSAmJiAhdHJhcFtTSUdJTlRdKSB7CisJCWlmICghKHJvb3RzaGVsbCAmJiBpZmxhZykpIHsKKwkJCS8qIEtpbGwgb3Vyc2VsZiB3aXRoIFNJR0lOVCAqLworCQkJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisJCQlyYWlzZShTSUdJTlQpOworCQl9CisJCWV4X3R5cGUgPSBFWElOVDsKKwl9CisJcmFpc2VfZXhjZXB0aW9uKGV4X3R5cGUpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKyNpZiBERUJVRworI2RlZmluZSByYWlzZV9pbnRlcnJ1cHQoKSBkbyB7IFwKKwlUUkFDRSgoInJhaXNpbmcgaW50ZXJydXB0IG9uIGxpbmUgJWRcbiIsIF9fTElORV9fKSk7IFwKKwlyYWlzZV9pbnRlcnJ1cHQoKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgSUZfQVNIX09QVElNSVpFX0ZPUl9TSVpFKGlubGluZSkgdm9pZAoraW50X29uKHZvaWQpCit7CisJeGJhcnJpZXIoKTsKKwlpZiAoLS1zdXBwcmVzc19pbnQgPT0gMCAmJiBwZW5kaW5nX2ludCkgeworCQlyYWlzZV9pbnRlcnJ1cHQoKTsKKwl9Cit9CisjZGVmaW5lIElOVF9PTiBpbnRfb24oKQorc3RhdGljIElGX0FTSF9PUFRJTUlaRV9GT1JfU0laRShpbmxpbmUpIHZvaWQKK2ZvcmNlX2ludF9vbih2b2lkKQoreworCXhiYXJyaWVyKCk7CisJc3VwcHJlc3NfaW50ID0gMDsKKwlpZiAocGVuZGluZ19pbnQpCisJCXJhaXNlX2ludGVycnVwdCgpOworfQorI2RlZmluZSBGT1JDRV9JTlRfT04gZm9yY2VfaW50X29uKCkKKworI2RlZmluZSBTQVZFX0lOVCh2KSAoKHYpID0gc3VwcHJlc3NfaW50KQorCisjZGVmaW5lIFJFU1RPUkVfSU5UKHYpIGRvIHsgXAorCXhiYXJyaWVyKCk7IFwKKwlzdXBwcmVzc19pbnQgPSAodik7IFwKKwlpZiAoc3VwcHJlc3NfaW50ID09IDAgJiYgcGVuZGluZ19pbnQpIFwKKwkJcmFpc2VfaW50ZXJydXB0KCk7IFwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09IFN0ZG91dC9zdGRlcnIgb3V0cHV0ICovCisKK3N0YXRpYyB2b2lkCitvdXRzdHIoY29uc3QgY2hhciAqcCwgRklMRSAqZmlsZSkKK3sKKwlJTlRfT0ZGOworCWZwdXRzKHAsIGZpbGUpOworCUlOVF9PTjsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX3N0ZG91dF9zdGRlcnIodm9pZCkKK3sKKwlJTlRfT0ZGOworCWZmbHVzaF9hbGwoKTsKKwlJTlRfT047Cit9CisKK3N0YXRpYyB2b2lkCitvdXRjc2xvdyhpbnQgYywgRklMRSAqZGVzdCkKK3sKKwlJTlRfT0ZGOworCXB1dGMoYywgZGVzdCk7CisJZmZsdXNoKGRlc3QpOworCUlOVF9PTjsKK30KKworc3RhdGljIGludCBvdXQxZm10KGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sMSwyKSkpOworc3RhdGljIGludAorb3V0MWZtdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByOworCisJSU5UX09GRjsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyID0gdnByaW50ZihmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCUlOVF9PTjsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBmbXRzdHIoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sMyw0KSkpOworc3RhdGljIGludAorZm10c3RyKGNoYXIgKm91dGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmV0OworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJSU5UX09GRjsKKwlyZXQgPSB2c25wcmludGYob3V0YnVmLCBsZW5ndGgsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJSU5UX09OOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitvdXQxc3RyKGNvbnN0IGNoYXIgKnApCit7CisJb3V0c3RyKHAsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitvdXQyc3RyKGNvbnN0IGNoYXIgKnApCit7CisJb3V0c3RyKHAsIHN0ZGVycik7CisJZmx1c2hfc3Rkb3V0X3N0ZGVycigpOworfQorCisKKy8qID09PT09PT09PT09PSBQYXJzZXIgc3RydWN0dXJlcyAqLworCisvKiBjb250cm9sIGNoYXJhY3RlcnMgaW4gYXJndW1lbnQgc3RyaW5ncyAqLworI2RlZmluZSBDVExfRklSU1QgQ1RMRVNDCisjZGVmaW5lIENUTEVTQyAgICAgICAoKHVuc2lnbmVkIGNoYXIpJ1wyMDEnKSAgICAvKiBlc2NhcGUgbmV4dCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ1RMVkFSICAgICAgICgodW5zaWduZWQgY2hhciknXDIwMicpICAgIC8qIHZhcmlhYmxlIGRlZm4gKi8KKyNkZWZpbmUgQ1RMRU5EVkFSICAgICgodW5zaWduZWQgY2hhciknXDIwMycpCisjZGVmaW5lIENUTEJBQ0tRICAgICAoKHVuc2lnbmVkIGNoYXIpJ1wyMDQnKQorI2RlZmluZSBDVExRVU9URSAwMSAgICAgICAgICAgICAvKiBvcmVkIHdpdGggQ1RMQkFDS1EgY29kZSBpZiBpbiBxdW90ZXMgKi8KKy8qICAgICAgQ1RMQkFDS1EgfCBDVExRVU9URSA9PSAnXDIwNScgKi8KKyNkZWZpbmUgQ1RMQVJJICAgICAgICgodW5zaWduZWQgY2hhciknXDIwNicpICAgIC8qIGFyaXRobWV0aWMgZXhwcmVzc2lvbiAqLworI2RlZmluZSBDVExFTkRBUkkgICAgKCh1bnNpZ25lZCBjaGFyKSdcMjA3JykKKyNkZWZpbmUgQ1RMUVVPVEVNQVJLICgodW5zaWduZWQgY2hhciknXDIxMCcpCisjZGVmaW5lIENUTF9MQVNUIENUTFFVT1RFTUFSSworCisvKiB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnl0ZSAoZm9sbG93cyBDVExWQVIpICovCisjZGVmaW5lIFZTVFlQRSAgMHgwZiAgICAgICAgICAgIC8qIHR5cGUgb2YgdmFyaWFibGUgc3Vic3RpdHV0aW9uICovCisjZGVmaW5lIFZTTlVMICAgMHgxMCAgICAgICAgICAgIC8qIGNvbG9uLS10cmVhdCB0aGUgZW1wdHkgc3RyaW5nIGFzIHVuc2V0ICovCisjZGVmaW5lIFZTUVVPVEUgMHg4MCAgICAgICAgICAgIC8qIGluc2lkZSBkb3VibGUgcXVvdGVzLS1zdXBwcmVzcyBzcGxpdHRpbmcgKi8KKworLyogdmFsdWVzIG9mIFZTVFlQRSBmaWVsZCAqLworI2RlZmluZSBWU05PUk1BTCAgICAgICAgMHgxICAgICAvKiBub3JtYWwgdmFyaWFibGU6ICAkdmFyIG9yICR7dmFyfSAqLworI2RlZmluZSBWU01JTlVTICAgICAgICAgMHgyICAgICAvKiAke3Zhci10ZXh0fSAqLworI2RlZmluZSBWU1BMVVMgICAgICAgICAgMHgzICAgICAvKiAke3Zhcit0ZXh0fSAqLworI2RlZmluZSBWU1FVRVNUSU9OICAgICAgMHg0ICAgICAvKiAke3Zhcj9tZXNzYWdlfSAqLworI2RlZmluZSBWU0FTU0lHTiAgICAgICAgMHg1ICAgICAvKiAke3Zhcj10ZXh0fSAqLworI2RlZmluZSBWU1RSSU1SSUdIVCAgICAgMHg2ICAgICAvKiAke3ZhciVwYXR0ZXJufSAqLworI2RlZmluZSBWU1RSSU1SSUdIVE1BWCAgMHg3ICAgICAvKiAke3ZhciUlcGF0dGVybn0gKi8KKyNkZWZpbmUgVlNUUklNTEVGVCAgICAgIDB4OCAgICAgLyogJHt2YXIjcGF0dGVybn0gKi8KKyNkZWZpbmUgVlNUUklNTEVGVE1BWCAgIDB4OSAgICAgLyogJHt2YXIjI3BhdHRlcm59ICovCisjZGVmaW5lIFZTTEVOR1RIICAgICAgICAweGEgICAgIC8qICR7I3Zhcn0gKi8KKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisjZGVmaW5lIFZTU1VCU1RSICAgICAgICAweGMgICAgIC8qICR7dmFyOnBvc2l0aW9uOmxlbmd0aH0gKi8KKyNkZWZpbmUgVlNSRVBMQUNFICAgICAgIDB4ZCAgICAgLyogJHt2YXIvcGF0dGVybi9yZXBsYWNlbWVudH0gKi8KKyNkZWZpbmUgVlNSRVBMQUNFQUxMICAgIDB4ZSAgICAgLyogJHt2YXIvL3BhdHRlcm4vcmVwbGFjZW1lbnR9ICovCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgZG9sYXRzdHJbXSBBTElHTjEgPSB7CisJQ1RMVkFSLCBWU05PUk1BTHxWU1FVT1RFLCAnQCcsICc9JywgJ1wwJworfTsKKworI2RlZmluZSBOQ01EICAgICAgMAorI2RlZmluZSBOUElQRSAgICAgMQorI2RlZmluZSBOUkVESVIgICAgMgorI2RlZmluZSBOQkFDS0dORCAgMworI2RlZmluZSBOU1VCU0hFTEwgNAorI2RlZmluZSBOQU5EICAgICAgNQorI2RlZmluZSBOT1IgICAgICAgNgorI2RlZmluZSBOU0VNSSAgICAgNworI2RlZmluZSBOSUYgICAgICAgOAorI2RlZmluZSBOV0hJTEUgICAgOQorI2RlZmluZSBOVU5USUwgICAxMAorI2RlZmluZSBORk9SICAgICAxMQorI2RlZmluZSBOQ0FTRSAgICAxMgorI2RlZmluZSBOQ0xJU1QgICAxMworI2RlZmluZSBOREVGVU4gICAxNAorI2RlZmluZSBOQVJHICAgICAxNQorI2RlZmluZSBOVE8gICAgICAxNgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyNkZWZpbmUgTlRPMiAgICAgMTcKKyNlbmRpZgorI2RlZmluZSBOQ0xPQkJFUiAxOAorI2RlZmluZSBORlJPTSAgICAxOQorI2RlZmluZSBORlJPTVRPICAyMAorI2RlZmluZSBOQVBQRU5EICAyMQorI2RlZmluZSBOVE9GRCAgICAyMgorI2RlZmluZSBORlJPTUZEICAyMworI2RlZmluZSBOSEVSRSAgICAyNAorI2RlZmluZSBOWEhFUkUgICAyNQorI2RlZmluZSBOTk9UICAgICAyNgorI2RlZmluZSBOX05VTUJFUiAyNworCit1bmlvbiBub2RlOworCitzdHJ1Y3QgbmNtZCB7CisJc21hbGxpbnQgdHlwZTsgLyogTnh4eHggKi8KKwl1bmlvbiBub2RlICphc3NpZ247CisJdW5pb24gbm9kZSAqYXJnczsKKwl1bmlvbiBub2RlICpyZWRpcmVjdDsKK307CisKK3N0cnVjdCBucGlwZSB7CisJc21hbGxpbnQgdHlwZTsKKwlzbWFsbGludCBwaXBlX2JhY2tnbmQ7CisJc3RydWN0IG5vZGVsaXN0ICpjbWRsaXN0OworfTsKKworc3RydWN0IG5yZWRpciB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuOworCXVuaW9uIG5vZGUgKnJlZGlyZWN0OworfTsKKworc3RydWN0IG5iaW5hcnkgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqY2gxOworCXVuaW9uIG5vZGUgKmNoMjsKK307CisKK3N0cnVjdCBuaWYgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqdGVzdDsKKwl1bmlvbiBub2RlICppZnBhcnQ7CisJdW5pb24gbm9kZSAqZWxzZXBhcnQ7Cit9OworCitzdHJ1Y3QgbmZvciB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICphcmdzOworCXVuaW9uIG5vZGUgKmJvZHk7CisJY2hhciAqdmFyOworfTsKKworc3RydWN0IG5jYXNlIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKmV4cHI7CisJdW5pb24gbm9kZSAqY2FzZXM7Cit9OworCitzdHJ1Y3QgbmNsaXN0IHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJdW5pb24gbm9kZSAqcGF0dGVybjsKKwl1bmlvbiBub2RlICpib2R5OworfTsKKworc3RydWN0IG5hcmcgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqbmV4dDsKKwljaGFyICp0ZXh0OworCXN0cnVjdCBub2RlbGlzdCAqYmFja3F1b3RlOworfTsKKworLyogbmZpbGUgYW5kIG5kdXAgbGF5b3V0IG11c3QgbWF0Y2ghCisgKiBOVE9GRCAoPiZmZG51bSkgdXNlcyBuZHVwIHN0cnVjdHVyZSwgYnV0IHdlIG1heSBkaXNjb3ZlciBtaWQtZmxpZ2h0CisgKiB0aGF0IGl0IGlzIGFjdHVhbGx5IE5UTzIgKD4mZmlsZSksIGFuZCBjaGFuZ2UgaXRzIHR5cGUuCisgKi8KK3N0cnVjdCBuZmlsZSB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuZXh0OworCWludCBmZDsKKwlpbnQgX3VudXNlZF9kdXBmZDsKKwl1bmlvbiBub2RlICpmbmFtZTsKKwljaGFyICpleHBmbmFtZTsKK307CisKK3N0cnVjdCBuZHVwIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJaW50IGZkOworCWludCBkdXBmZDsKKwl1bmlvbiBub2RlICp2bmFtZTsKKwljaGFyICpfdW51c2VkX2V4cGZuYW1lOworfTsKKworc3RydWN0IG5oZXJlIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJaW50IGZkOworCXVuaW9uIG5vZGUgKmRvYzsKK307CisKK3N0cnVjdCBubm90IHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKmNvbTsKK307CisKK3VuaW9uIG5vZGUgeworCXNtYWxsaW50IHR5cGU7CisJc3RydWN0IG5jbWQgbmNtZDsKKwlzdHJ1Y3QgbnBpcGUgbnBpcGU7CisJc3RydWN0IG5yZWRpciBucmVkaXI7CisJc3RydWN0IG5iaW5hcnkgbmJpbmFyeTsKKwlzdHJ1Y3QgbmlmIG5pZjsKKwlzdHJ1Y3QgbmZvciBuZm9yOworCXN0cnVjdCBuY2FzZSBuY2FzZTsKKwlzdHJ1Y3QgbmNsaXN0IG5jbGlzdDsKKwlzdHJ1Y3QgbmFyZyBuYXJnOworCXN0cnVjdCBuZmlsZSBuZmlsZTsKKwlzdHJ1Y3QgbmR1cCBuZHVwOworCXN0cnVjdCBuaGVyZSBuaGVyZTsKKwlzdHJ1Y3Qgbm5vdCBubm90OworfTsKKworLyoKKyAqIE5PREVfRU9GIGlzIHJldHVybmVkIGJ5IHBhcnNlY21kIHdoZW4gaXQgZW5jb3VudGVycyBhbiBlbmQgb2YgZmlsZS4KKyAqIEl0IG11c3QgYmUgZGlzdGluY3QgZnJvbSBOVUxMLgorICovCisjZGVmaW5lIE5PREVfRU9GICgodW5pb24gbm9kZSAqKSAtMUwpCisKK3N0cnVjdCBub2RlbGlzdCB7CisJc3RydWN0IG5vZGVsaXN0ICpuZXh0OworCXVuaW9uIG5vZGUgKm47Cit9OworCitzdHJ1Y3QgZnVuY25vZGUgeworCWludCBjb3VudDsKKwl1bmlvbiBub2RlIG47Cit9OworCisvKgorICogRnJlZSBhIHBhcnNlIHRyZWUuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlZnVuYyhzdHJ1Y3QgZnVuY25vZGUgKmYpCit7CisJaWYgKGYgJiYgLS1mLT5jb3VudCA8IDApCisJCWZyZWUoZik7Cit9CisKKworLyogPT09PT09PT09PT09IERlYnVnZ2luZyBvdXRwdXQgKi8KKworI2lmIERFQlVHCisKK3N0YXRpYyBGSUxFICp0cmFjZWZpbGU7CisKK3N0YXRpYyB2b2lkCit0cmFjZV9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCWlmIChkZWJ1ZyAhPSAxKQorCQlyZXR1cm47CisJaWYgKERFQlVHX1RJTUUpCisJCWZwcmludGYodHJhY2VmaWxlLCAiJXUgIiwgKGludCkgdGltZShOVUxMKSk7CisJaWYgKERFQlVHX1BJRCkKKwkJZnByaW50Zih0cmFjZWZpbGUsICJbJXVdICIsIChpbnQpIGdldHBpZCgpKTsKKwlpZiAoREVCVUdfU0lHKQorCQlmcHJpbnRmKHRyYWNlZmlsZSwgInBlbmRpbmcgczolZCBpOiVkKHN1cHA6JWQpICIsIHBlbmRpbmdfc2lnLCBwZW5kaW5nX2ludCwgc3VwcHJlc3NfaW50KTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwl2ZnByaW50Zih0cmFjZWZpbGUsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV92cHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSkKK3sKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCWlmIChERUJVR19USU1FKQorCQlmcHJpbnRmKHRyYWNlZmlsZSwgIiV1ICIsIChpbnQpIHRpbWUoTlVMTCkpOworCWlmIChERUJVR19QSUQpCisJCWZwcmludGYodHJhY2VmaWxlLCAiWyV1XSAiLCAoaW50KSBnZXRwaWQoKSk7CisJaWYgKERFQlVHX1NJRykKKwkJZnByaW50Zih0cmFjZWZpbGUsICJwZW5kaW5nIHM6JWQgaTolZChzdXBwOiVkKSAiLCBwZW5kaW5nX3NpZywgcGVuZGluZ19pbnQsIHN1cHByZXNzX2ludCk7CisJdmZwcmludGYodHJhY2VmaWxlLCBmbXQsIHZhKTsKK30KKworc3RhdGljIHZvaWQKK3RyYWNlX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCWZwdXRzKHMsIHRyYWNlZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV9wdXRzX3F1b3RlZChjaGFyICpzKQoreworCWNoYXIgKnA7CisJY2hhciBjOworCisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlwdXRjKCciJywgdHJhY2VmaWxlKTsKKwlmb3IgKHAgPSBzOyAqcDsgcCsrKSB7CisJCXN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpKnApIHsKKwkJY2FzZSAnXG4nOiBjID0gJ24nOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXHQnOiBjID0gJ3QnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXHInOiBjID0gJ3InOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXCInOiBjID0gJ1wiJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1xcJzogYyA9ICdcXCc7IGdvdG8gYmFja3NsYXNoOworCQljYXNlIENUTEVTQzogYyA9ICdlJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMVkFSOiBjID0gJ3YnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExWQVIrQ1RMUVVPVEU6IGMgPSAnVic7IGdvdG8gYmFja3NsYXNoOworCQljYXNlIENUTEJBQ0tROiBjID0gJ3EnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExCQUNLUStDVExRVU9URTogYyA9ICdRJzsgZ290byBiYWNrc2xhc2g7CisgYmFja3NsYXNoOgorCQkJcHV0YygnXFwnLCB0cmFjZWZpbGUpOworCQkJcHV0YyhjLCB0cmFjZWZpbGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoKnAgPj0gJyAnICYmICpwIDw9ICd+JykKKwkJCQlwdXRjKCpwLCB0cmFjZWZpbGUpOworCQkJZWxzZSB7CisJCQkJcHV0YygnXFwnLCB0cmFjZWZpbGUpOworCQkJCXB1dGMoKCpwID4+IDYpICYgMDMsIHRyYWNlZmlsZSk7CisJCQkJcHV0YygoKnAgPj4gMykgJiAwNywgdHJhY2VmaWxlKTsKKwkJCQlwdXRjKCpwICYgMDcsIHRyYWNlZmlsZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlwdXRjKCciJywgdHJhY2VmaWxlKTsKK30KKworc3RhdGljIHZvaWQKK3RyYWNlX3B1dHNfYXJncyhjaGFyICoqYXApCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlpZiAoISphcCkKKwkJcmV0dXJuOworCXdoaWxlICgxKSB7CisJCXRyYWNlX3B1dHNfcXVvdGVkKCphcCk7CisJCWlmICghKisrYXApIHsKKwkJCXB1dGMoJ1xuJywgdHJhY2VmaWxlKTsKKwkJCWJyZWFrOworCQl9CisJCXB1dGMoJyAnLCB0cmFjZWZpbGUpOworCX0KK30KKworc3RhdGljIHZvaWQKK29wZW50cmFjZSh2b2lkKQoreworCWNoYXIgc1sxMDBdOworI2lmZGVmIE9fQVBQRU5ECisJaW50IGZsYWdzOworI2VuZGlmCisKKwlpZiAoZGVidWcgIT0gMSkgeworCQlpZiAodHJhY2VmaWxlKQorCQkJZmZsdXNoKHRyYWNlZmlsZSk7CisJCS8qIGxlYXZlIG9wZW4gYmVjYXVzZSBsaWJlZGl0IG1pZ2h0IGJlIHVzaW5nIGl0ICovCisJCXJldHVybjsKKwl9CisJc3RyY3B5KHMsICIuL3RyYWNlIik7CisJaWYgKHRyYWNlZmlsZSkgeworCQlpZiAoIWZyZW9wZW4ocywgImEiLCB0cmFjZWZpbGUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHJlLW9wZW4gJXNcbiIsIHMpOworCQkJZGVidWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJdHJhY2VmaWxlID0gZm9wZW4ocywgImEiKTsKKwkJaWYgKHRyYWNlZmlsZSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gJXNcbiIsIHMpOworCQkJZGVidWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorI2lmZGVmIE9fQVBQRU5ECisJZmxhZ3MgPSBmY250bChmaWxlbm8odHJhY2VmaWxlKSwgRl9HRVRGTCk7CisJaWYgKGZsYWdzID49IDApCisJCWZjbnRsKGZpbGVubyh0cmFjZWZpbGUpLCBGX1NFVEZMLCBmbGFncyB8IE9fQVBQRU5EKTsKKyNlbmRpZgorCXNldGxpbmVidWYodHJhY2VmaWxlKTsKKwlmcHV0cygiXG5UcmFjaW5nIHN0YXJ0ZWQuXG4iLCB0cmFjZWZpbGUpOworfQorCitzdGF0aWMgdm9pZAoraW5kZW50KGludCBhbW91bnQsIGNoYXIgKnBmeCwgRklMRSAqZnApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYW1vdW50OyBpKyspIHsKKwkJaWYgKHBmeCAmJiBpID09IGFtb3VudCAtIDEpCisJCQlmcHV0cyhwZngsIGZwKTsKKwkJcHV0YygnXHQnLCBmcCk7CisJfQorfQorCisvKiBsaXR0bGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBoZXJlLi4uICovCitzdGF0aWMgdm9pZCBzaHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGluZCwgY2hhciAqcGZ4LCBGSUxFICpmcCk7CisKK3N0YXRpYyB2b2lkCitzaGFyZyh1bmlvbiBub2RlICphcmcsIEZJTEUgKmZwKQoreworCWNoYXIgKnA7CisJc3RydWN0IG5vZGVsaXN0ICpicWxpc3Q7CisJdW5zaWduZWQgY2hhciBzdWJ0eXBlOworCisJaWYgKGFyZy0+dHlwZSAhPSBOQVJHKSB7CisJCW91dDFmbXQoIjxub2RlIHR5cGUgJWQ+XG4iLCBhcmctPnR5cGUpOworCQlhYm9ydCgpOworCX0KKwlicWxpc3QgPSBhcmctPm5hcmcuYmFja3F1b3RlOworCWZvciAocCA9IGFyZy0+bmFyZy50ZXh0OyAqcDsgcCsrKSB7CisJCXN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpKnApIHsKKwkJY2FzZSBDVExFU0M6CisJCQlwKys7CisJCQlwdXRjKCpwLCBmcCk7CisJCQlicmVhazsKKwkJY2FzZSBDVExWQVI6CisJCQlwdXRjKCckJywgZnApOworCQkJcHV0YygneycsIGZwKTsKKwkJCXN1YnR5cGUgPSAqKytwOworCQkJaWYgKHN1YnR5cGUgPT0gVlNMRU5HVEgpCisJCQkJcHV0YygnIycsIGZwKTsKKworCQkJd2hpbGUgKCpwICE9ICc9JykgeworCQkJCXB1dGMoKnAsIGZwKTsKKwkJCQlwKys7CisJCQl9CisKKwkJCWlmIChzdWJ0eXBlICYgVlNOVUwpCisJCQkJcHV0YygnOicsIGZwKTsKKworCQkJc3dpdGNoIChzdWJ0eXBlICYgVlNUWVBFKSB7CisJCQljYXNlIFZTTk9STUFMOgorCQkJCXB1dGMoJ30nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTTUlOVVM6CisJCQkJcHV0YygnLScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNQTFVTOgorCQkJCXB1dGMoJysnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTUVVFU1RJT046CisJCQkJcHV0YygnPycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNBU1NJR046CisJCQkJcHV0YygnPScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNTEVGVDoKKwkJCQlwdXRjKCcjJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU1RSSU1MRUZUTUFYOgorCQkJCXB1dGMoJyMnLCBmcCk7CisJCQkJcHV0YygnIycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNUklHSFQ6CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNUklHSFRNQVg6CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlwdXRjKCclJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU0xFTkdUSDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb3V0MWZtdCgiPHN1YnR5cGUgJWQ+Iiwgc3VidHlwZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVExFTkRWQVI6CisJCQlwdXRjKCd9JywgZnApOworCQkJYnJlYWs7CisJCWNhc2UgQ1RMQkFDS1E6CisJCWNhc2UgQ1RMQkFDS1F8Q1RMUVVPVEU6CisJCQlwdXRjKCckJywgZnApOworCQkJcHV0YygnKCcsIGZwKTsKKwkJCXNodHJlZShicWxpc3QtPm4sIC0xLCBOVUxMLCBmcCk7CisJCQlwdXRjKCcpJywgZnApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwdXRjKCpwLCBmcCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NoY21kKHVuaW9uIG5vZGUgKmNtZCwgRklMRSAqZnApCit7CisJdW5pb24gbm9kZSAqbnA7CisJaW50IGZpcnN0OworCWNvbnN0IGNoYXIgKnM7CisJaW50IGRmdGZkOworCisJZmlyc3QgPSAxOworCWZvciAobnAgPSBjbWQtPm5jbWQuYXJnczsgbnA7IG5wID0gbnAtPm5hcmcubmV4dCkgeworCQlpZiAoIWZpcnN0KQorCQkJcHV0YygnICcsIGZwKTsKKwkJc2hhcmcobnAsIGZwKTsKKwkJZmlyc3QgPSAwOworCX0KKwlmb3IgKG5wID0gY21kLT5uY21kLnJlZGlyZWN0OyBucDsgbnAgPSBucC0+bmZpbGUubmV4dCkgeworCQlpZiAoIWZpcnN0KQorCQkJcHV0YygnICcsIGZwKTsKKwkJZGZ0ZmQgPSAwOworCQlzd2l0Y2ggKG5wLT5uZmlsZS50eXBlKSB7CisJCWNhc2UgTlRPOiAgICAgIHMgPSAiPj4iKzE7IGRmdGZkID0gMTsgYnJlYWs7CisJCWNhc2UgTkNMT0JCRVI6IHMgPSAiPnwiOyBkZnRmZCA9IDE7IGJyZWFrOworCQljYXNlIE5BUFBFTkQ6ICBzID0gIj4+IjsgZGZ0ZmQgPSAxOyBicmVhazsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCWNhc2UgTlRPMjoKKyNlbmRpZgorCQljYXNlIE5UT0ZEOiAgICBzID0gIj4mIjsgZGZ0ZmQgPSAxOyBicmVhazsKKwkJY2FzZSBORlJPTTogICAgcyA9ICI8IjsgYnJlYWs7CisJCWNhc2UgTkZST01GRDogIHMgPSAiPCYiOyBicmVhazsKKwkJY2FzZSBORlJPTVRPOiAgcyA9ICI8PiI7IGJyZWFrOworCQlkZWZhdWx0OiAgICAgICBzID0gIiplcnJvcioiOyBicmVhazsKKwkJfQorCQlpZiAobnAtPm5maWxlLmZkICE9IGRmdGZkKQorCQkJZnByaW50ZihmcCwgIiVkIiwgbnAtPm5maWxlLmZkKTsKKwkJZnB1dHMocywgZnApOworCQlpZiAobnAtPm5maWxlLnR5cGUgPT0gTlRPRkQgfHwgbnAtPm5maWxlLnR5cGUgPT0gTkZST01GRCkgeworCQkJZnByaW50ZihmcCwgIiVkIiwgbnAtPm5kdXAuZHVwZmQpOworCQl9IGVsc2UgeworCQkJc2hhcmcobnAtPm5maWxlLmZuYW1lLCBmcCk7CisJCX0KKwkJZmlyc3QgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK3NodHJlZSh1bmlvbiBub2RlICpuLCBpbnQgaW5kLCBjaGFyICpwZngsIEZJTEUgKmZwKQoreworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJY29uc3QgY2hhciAqczsKKworCWlmIChuID09IE5VTEwpCisJCXJldHVybjsKKworCWluZGVudChpbmQsIHBmeCwgZnApOworCisJaWYgKG4gPT0gTk9ERV9FT0YpIHsKKwkJZnB1dHMoIjxFT0Y+IiwgZnApOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChuLT50eXBlKSB7CisJY2FzZSBOU0VNSToKKwkJcyA9ICI7ICI7CisJCWdvdG8gYmlub3A7CisJY2FzZSBOQU5EOgorCQlzID0gIiAmJiAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTk9SOgorCQlzID0gIiB8fCAiOworIGJpbm9wOgorCQlzaHRyZWUobi0+bmJpbmFyeS5jaDEsIGluZCwgTlVMTCwgZnApOworCQkvKiBpZiAoaW5kIDwgMCkgKi8KKwkJCWZwdXRzKHMsIGZwKTsKKwkJc2h0cmVlKG4tPm5iaW5hcnkuY2gyLCBpbmQsIE5VTEwsIGZwKTsKKwkJYnJlYWs7CisJY2FzZSBOQ01EOgorCQlzaGNtZChuLCBmcCk7CisJCWlmIChpbmQgPj0gMCkKKwkJCXB1dGMoJ1xuJywgZnApOworCQlicmVhazsKKwljYXNlIE5QSVBFOgorCQlmb3IgKGxwID0gbi0+bnBpcGUuY21kbGlzdDsgbHA7IGxwID0gbHAtPm5leHQpIHsKKwkJCXNodHJlZShscC0+biwgMCwgTlVMTCwgZnApOworCQkJaWYgKGxwLT5uZXh0KQorCQkJCWZwdXRzKCIgfCAiLCBmcCk7CisJCX0KKwkJaWYgKG4tPm5waXBlLnBpcGVfYmFja2duZCkKKwkJCWZwdXRzKCIgJiIsIGZwKTsKKwkJaWYgKGluZCA+PSAwKQorCQkJcHV0YygnXG4nLCBmcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoZnAsICI8bm9kZSB0eXBlICVkPiIsIG4tPnR5cGUpOworCQlpZiAoaW5kID49IDApCisJCQlwdXRjKCdcbicsIGZwKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2hvd3RyZWUodW5pb24gbm9kZSAqbikKK3sKKwl0cmFjZV9wdXRzKCJzaG93dHJlZSBjYWxsZWRcbiIpOworCXNodHJlZShuLCAxLCBOVUxMLCBzdGRlcnIpOworfQorCisjZW5kaWYgLyogREVCVUcgKi8KKworCisvKiA9PT09PT09PT09PT0gUGFyc2VyIGRhdGEgKi8KKworLyoKKyAqIGFzaF92bXNnKCkgbmVlZHMgcGFyc2VmaWxlLT5mZCwgaGVuY2UgcGFyc2VmaWxlIGRlZmluaXRpb24gaXMgbW92ZWQgdXAuCisgKi8KK3N0cnVjdCBzdHJsaXN0IHsKKwlzdHJ1Y3Qgc3RybGlzdCAqbmV4dDsKKwljaGFyICp0ZXh0OworfTsKKworc3RydWN0IGFsaWFzOworCitzdHJ1Y3Qgc3RycHVzaCB7CisJc3RydWN0IHN0cnB1c2ggKnByZXY7ICAgLyogcHJlY2VkaW5nIHN0cmluZyBvbiBzdGFjayAqLworCWNoYXIgKnByZXZfc3RyaW5nOworCWludCBwcmV2X2xlZnRfaW5fbGluZTsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJc3RydWN0IGFsaWFzICphcDsgICAgICAgLyogaWYgcHVzaCB3YXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsaWFzICovCisjZW5kaWYKKwljaGFyICpzdHJpbmc7ICAgICAgICAgICAvKiByZW1lbWJlciB0aGUgc3RyaW5nIHNpbmNlIGl0IG1heSBjaGFuZ2UgKi8KK307CisKK3N0cnVjdCBwYXJzZWZpbGUgeworCXN0cnVjdCBwYXJzZWZpbGUgKnByZXY7IC8qIHByZWNlZGluZyBmaWxlIG9uIHN0YWNrICovCisJaW50IGxpbm5vOyAgICAgICAgICAgICAgLyogY3VycmVudCBsaW5lICovCisJaW50IHBmX2ZkOyAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yIChvciAtMSBpZiBzdHJpbmcpICovCisJaW50IGxlZnRfaW5fbGluZTsgICAgICAgLyogbnVtYmVyIG9mIGNoYXJzIGxlZnQgaW4gdGhpcyBsaW5lICovCisJaW50IGxlZnRfaW5fYnVmZmVyOyAgICAgLyogbnVtYmVyIG9mIGNoYXJzIGxlZnQgaW4gdGhpcyBidWZmZXIgcGFzdCB0aGUgbGluZSAqLworCWNoYXIgKm5leHRfdG9fcGdldGM7ICAgIC8qIG5leHQgY2hhciBpbiBidWZmZXIgKi8KKwljaGFyICpidWY7ICAgICAgICAgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc3RycHVzaCAqc3RycHVzaDsgLyogZm9yIHB1c2hpbmcgc3RyaW5ncyBhdCB0aGlzIGxldmVsICovCisJc3RydWN0IHN0cnB1c2ggYmFzZXN0cnB1c2g7IC8qIHNvIHB1c2hpbmcgb25lIGlzIGZhc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFyc2VmaWxlIGJhc2VwZjsgICAgICAgIC8qIHRvcCBsZXZlbCBpbnB1dCBmaWxlICovCitzdGF0aWMgc3RydWN0IHBhcnNlZmlsZSAqZ19wYXJzZWZpbGUgPSAmYmFzZXBmOyAgLyogY3VycmVudCBpbnB1dCBmaWxlICovCitzdGF0aWMgaW50IHN0YXJ0bGlubm87ICAgICAgICAgICAgICAgICAvKiBsaW5lICMgd2hlcmUgbGFzdCB0b2tlbiBzdGFydGVkICovCitzdGF0aWMgY2hhciAqY29tbWFuZG5hbWU7ICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqY21kZW52aXJvbjsgICAgIC8qIGVudmlyb25tZW50IGZvciBidWlsdGluIGNvbW1hbmQgKi8KK3N0YXRpYyB1aW50OF90IGV4aXRzdGF0dXM7ICAgICAgICAgICAgIC8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgY29tbWFuZCAqLworCisKKy8qID09PT09PT09PT09PSBNZXNzYWdlIHByaW50aW5nICovCisKK3N0YXRpYyB2b2lkCithc2hfdm1zZyhjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXApCit7CisJZnByaW50ZihzdGRlcnIsICIlczogIiwgYXJnMCk7CisJaWYgKGNvbW1hbmRuYW1lKSB7CisJCWlmIChzdHJjbXAoYXJnMCwgY29tbWFuZG5hbWUpKQorCQkJZnByaW50ZihzdGRlcnIsICIlczogIiwgY29tbWFuZG5hbWUpOworCQlpZiAoIWlmbGFnIHx8IGdfcGFyc2VmaWxlLT5wZl9mZCA+IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgImxpbmUgJWQ6ICIsIHN0YXJ0bGlubm8pOworCX0KKwl2ZnByaW50ZihzdGRlcnIsIG1zZywgYXApOworCW91dGNzbG93KCdcbicsIHN0ZGVycik7Cit9CisKKy8qCisgKiBFeHZlcnJvciBpcyBjYWxsZWQgdG8gcmFpc2UgdGhlIGVycm9yIGV4Y2VwdGlvbi4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAqIGlzIG5vdCBOVUxMIHRoZW4gZXJyb3IgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdXNpbmcgcHJpbnRmIHN0eWxlCisgKiBmb3JtYXR0aW5nLiAgSXQgdGhlbiByYWlzZXMgdGhlIGVycm9yIGV4Y2VwdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYXNoX3Ztc2dfYW5kX3JhaXNlKGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCithc2hfdm1zZ19hbmRfcmFpc2UoaW50IGNvbmQsIGNvbnN0IGNoYXIgKm1zZywgdmFfbGlzdCBhcCkKK3sKKyNpZiBERUJVRworCWlmIChtc2cpIHsKKwkJVFJBQ0UoKCJhc2hfdm1zZ19hbmRfcmFpc2UoJWQsIFwiIiwgY29uZCkpOworCQlUUkFDRVYoKG1zZywgYXApKTsKKwkJVFJBQ0UoKCJcIikgcGlkPSVkXG4iLCBnZXRwaWQoKSkpOworCX0gZWxzZQorCQlUUkFDRSgoImFzaF92bXNnX2FuZF9yYWlzZSglZCwgTlVMTCkgcGlkPSVkXG4iLCBjb25kLCBnZXRwaWQoKSkpOworCWlmIChtc2cpCisjZW5kaWYKKwkJYXNoX3Ztc2cobXNnLCBhcCk7CisKKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisJcmFpc2VfZXhjZXB0aW9uKGNvbmQpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQgYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK2FzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKwlhc2hfdm1zZ19hbmRfcmFpc2UoRVhFUlJPUiwgbXNnLCBhcCk7CisJLyogTk9UUkVBQ0hFRCAqLworCXZhX2VuZChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaXNlX2Vycm9yX3N5bnRheChjb25zdCBjaGFyICopIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3JhaXNlX2Vycm9yX3N5bnRheChjb25zdCBjaGFyICptc2cpCit7CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInN5bnRheCBlcnJvcjogJXMiLCBtc2cpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQgYXNoX21zZ19hbmRfcmFpc2UoaW50LCBjb25zdCBjaGFyICosIC4uLikgTk9SRVRVUk47CitzdGF0aWMgdm9pZAorYXNoX21zZ19hbmRfcmFpc2UoaW50IGNvbmQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKwlhc2hfdm1zZ19hbmRfcmFpc2UoY29uZCwgbXNnLCBhcCk7CisJLyogTk9UUkVBQ0hFRCAqLworCXZhX2VuZChhcCk7Cit9CisKKy8qCisgKiBlcnJvci93YXJuaW5nIHJvdXRpbmVzIGZvciBleHRlcm5hbCBidWlsdGlucworICovCitzdGF0aWMgdm9pZAorYXNoX21zZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJYXNoX3Ztc2coZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworLyoKKyAqIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGVycm9yLiAgVGhlIHJldHVybmVkIHN0cmluZyBtYXkgYmUgYQorICogcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgdGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IGNhbGwuCisgKiBBY3Rpb24gZGVzY3JpYmVzIHRoZSBvcGVyYXRpb24gdGhhdCBnb3QgdGhlIGVycm9yLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitlcnJtc2coaW50IGUsIGNvbnN0IGNoYXIgKmVtKQoreworCWlmIChlID09IEVOT0VOVCB8fCBlID09IEVOT1RESVIpIHsKKwkJcmV0dXJuIGVtOworCX0KKwlyZXR1cm4gc3RyZXJyb3IoZSk7Cit9CisKKworLyogPT09PT09PT09PT09IE1lbW9yeSBhbGxvY2F0aW9uICovCisKKyNpZiAwCisvKiBJIGNvbnNpZGVyIHRoZXNlIHdyYXBwZXJzIG5lYXJseSB1c2VsZXNzOgorICogb2ssIHRoZXkgcmV0dXJuIHlvdSB0byBuZWFyZXN0IGV4Y2VwdGlvbiBoYW5kbGVyLCBidXQKKyAqIGhvdyBtdWNoIG1lbW9yeSBkbyB5b3UgbGVhayBpbiB0aGUgcHJvY2VzcywgbWFraW5nCisgKiBtZW1vcnkgc3RhcnZhdGlvbiB3b3JzZT8KKyAqLworc3RhdGljIHZvaWQgKgorY2tyZWFsbG9jKHZvaWQgKiBwLCBzaXplX3QgbmJ5dGVzKQoreworCXAgPSByZWFsbG9jKHAsIG5ieXRlcyk7CisJaWYgKCFwKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkICoKK2NrbWFsbG9jKHNpemVfdCBuYnl0ZXMpCit7CisJcmV0dXJuIGNrcmVhbGxvYyhOVUxMLCBuYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZCAqCitja3phbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCXJldHVybiBtZW1zZXQoY2ttYWxsb2MobmJ5dGVzKSwgMCwgbmJ5dGVzKTsKK30KKworc3RhdGljIGNoYXIgKgorY2tzdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpwID0gc3RyZHVwKHMpOworCWlmICghcCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBwOworfQorI2Vsc2UKKy8qIFVzaW5nIGJib3ggZXF1aXZhbGVudHMuIFRoZXkgZXhpdCBpZiBvdXQgb2YgbWVtb3J5ICovCisjIGRlZmluZSBja3JlYWxsb2MgeHJlYWxsb2MKKyMgZGVmaW5lIGNrbWFsbG9jICB4bWFsbG9jCisjIGRlZmluZSBja3phbGxvYyAgeHphbGxvYworIyBkZWZpbmUgY2tzdHJkdXAgIHhzdHJkdXAKKyNlbmRpZgorCisvKgorICogSXQgYXBwZWFycyB0aGF0IGdyYWJzdGFja3N0cigpIHdpbGwgYmFyZiB3aXRoIHN1Y2ggYWxpZ25tZW50cworICogYmVjYXVzZSBzdGFsbG9jKCkgd2lsbCByZXR1cm4gYSBzdHJpbmcgYWxsb2NhdGVkIGluIGEgbmV3IHN0YWNrYmxvY2suCisgKi8KKyNkZWZpbmUgU0hFTExfQUxJR04obmJ5dGVzKSAoKChuYnl0ZXMpICsgU0hFTExfU0laRSkgJiB+U0hFTExfU0laRSkKK2VudW0geworCS8qIE1vc3QgbWFjaGluZXMgcmVxdWlyZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBtYWxsb2MgdG8gYmUgYWxpZ25lZAorCSAqIGluIHNvbWUgd2F5LiAgVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIGdldCB0aGlzIHJpZ2h0CisJICogb24gbWFueSBtYWNoaW5lcy4gICovCisJU0hFTExfU0laRSA9IHNpemVvZih1bmlvbiB7IGludCBpOyBjaGFyICpjcDsgZG91YmxlIGQ7IH0pIC0gMSwKKwkvKiBNaW5pbXVtIHNpemUgb2YgYSBibG9jayAqLworCU1JTlNJWkUgPSBTSEVMTF9BTElHTig1MDQpLAorfTsKKworc3RydWN0IHN0YWNrX2Jsb2NrIHsKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnByZXY7CisJY2hhciBzcGFjZVtNSU5TSVpFXTsKK307CisKK3N0cnVjdCBzdGFja21hcmsgeworCXN0cnVjdCBzdGFja19ibG9jayAqc3RhY2twOworCWNoYXIgKnN0YWNrbnh0OworCXNpemVfdCBzdGFja25sZWZ0OworCXN0cnVjdCBzdGFja21hcmsgKm1hcmtuZXh0OworfTsKKworCitzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayB7CisJc3RydWN0IHN0YWNrX2Jsb2NrICpnX3N0YWNrcDsgLy8gPSAmc3RhY2tiYXNlOworCXN0cnVjdCBzdGFja21hcmsgKm1hcmtwOworCWNoYXIgKmdfc3RhY2tueHQ7IC8vID0gc3RhY2tiYXNlLnNwYWNlOworCWNoYXIgKnNzdHJlbmQ7IC8vID0gc3RhY2tiYXNlLnNwYWNlICsgTUlOU0laRTsKKwlzaXplX3QgZ19zdGFja25sZWZ0OyAvLyA9IE1JTlNJWkU7CisJaW50ICAgIGhlcmVmZDsgLy8gPSAtMTsKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgc3RhY2tiYXNlOworfTsKK2V4dGVybiBzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrOworI2RlZmluZSBHX21lbXN0YWNrICgqYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrKQorI2RlZmluZSBnX3N0YWNrcCAgICAgKEdfbWVtc3RhY2suZ19zdGFja3AgICAgKQorI2RlZmluZSBtYXJrcCAgICAgICAgKEdfbWVtc3RhY2subWFya3AgICAgICAgKQorI2RlZmluZSBnX3N0YWNrbnh0ICAgKEdfbWVtc3RhY2suZ19zdGFja254dCAgKQorI2RlZmluZSBzc3RyZW5kICAgICAgKEdfbWVtc3RhY2suc3N0cmVuZCAgICAgKQorI2RlZmluZSBnX3N0YWNrbmxlZnQgKEdfbWVtc3RhY2suZ19zdGFja25sZWZ0KQorI2RlZmluZSBoZXJlZmQgICAgICAgKEdfbWVtc3RhY2suaGVyZWZkICAgICAgKQorI2RlZmluZSBzdGFja2Jhc2UgICAgKEdfbWVtc3RhY2suc3RhY2tiYXNlICAgKQorI2RlZmluZSBJTklUX0dfbWVtc3RhY2soKSBkbyB7IFwKKwkoKihzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayoqKSZhc2hfcHRyX3RvX2dsb2JhbHNfbWVtc3RhY2spID0geHphbGxvYyhzaXplb2YoR19tZW1zdGFjaykpOyBcCisJYmFycmllcigpOyBcCisJZ19zdGFja3AgPSAmc3RhY2tiYXNlOyBcCisJZ19zdGFja254dCA9IHN0YWNrYmFzZS5zcGFjZTsgXAorCWdfc3RhY2tubGVmdCA9IE1JTlNJWkU7IFwKKwlzc3RyZW5kID0gc3RhY2tiYXNlLnNwYWNlICsgTUlOU0laRTsgXAorCWhlcmVmZCA9IC0xOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgc3RhY2tibG9jaygpICAgICAoKHZvaWQgKilnX3N0YWNrbnh0KQorI2RlZmluZSBzdGFja2Jsb2Nrc2l6ZSgpIGdfc3RhY2tubGVmdAorCisvKgorICogUGFyc2UgdHJlZXMgZm9yIGNvbW1hbmRzIGFyZSBhbGxvY2F0ZWQgaW4gbGlmbyBvcmRlciwgc28gd2UgdXNlIGEgc3RhY2sKKyAqIHRvIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudCwgYW5kIGFsc28gdG8gYXZvaWQgYWxsIHNvcnRzIG9mIGV4Y2VwdGlvbgorICogaGFuZGxpbmcgY29kZSB0byBoYW5kbGUgaW50ZXJydXB0cyBpbiB0aGUgbWlkZGxlIG9mIGEgcGFyc2UuCisgKgorICogVGhlIHNpemUgNTA0IHdhcyBjaG9zZW4gYmVjYXVzZSB0aGUgVWx0cml4IG1hbGxvYyBoYW5kbGVzIHRoYXQgc2l6ZQorICogd2VsbC4KKyAqLworc3RhdGljIHZvaWQgKgorc3RhbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCWNoYXIgKnA7CisJc2l6ZV90IGFsaWduZWQ7CisKKwlhbGlnbmVkID0gU0hFTExfQUxJR04obmJ5dGVzKTsKKwlpZiAoYWxpZ25lZCA+IGdfc3RhY2tubGVmdCkgeworCQlzaXplX3QgbGVuOworCQlzaXplX3QgYmxvY2tzaXplOworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnNwOworCisJCWJsb2Nrc2l6ZSA9IGFsaWduZWQ7CisJCWlmIChibG9ja3NpemUgPCBNSU5TSVpFKQorCQkJYmxvY2tzaXplID0gTUlOU0laRTsKKwkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzdGFja19ibG9jaykgLSBNSU5TSVpFICsgYmxvY2tzaXplOworCQlpZiAobGVuIDwgYmxvY2tzaXplKQorCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCQlJTlRfT0ZGOworCQlzcCA9IGNrbWFsbG9jKGxlbik7CisJCXNwLT5wcmV2ID0gZ19zdGFja3A7CisJCWdfc3RhY2tueHQgPSBzcC0+c3BhY2U7CisJCWdfc3RhY2tubGVmdCA9IGJsb2Nrc2l6ZTsKKwkJc3N0cmVuZCA9IGdfc3RhY2tueHQgKyBibG9ja3NpemU7CisJCWdfc3RhY2twID0gc3A7CisJCUlOVF9PTjsKKwl9CisJcCA9IGdfc3RhY2tueHQ7CisJZ19zdGFja254dCArPSBhbGlnbmVkOworCWdfc3RhY2tubGVmdCAtPSBhbGlnbmVkOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCAqCitzdHphbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCXJldHVybiBtZW1zZXQoc3RhbGxvYyhuYnl0ZXMpLCAwLCBuYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZAorc3R1bmFsbG9jKHZvaWQgKnApCit7CisjaWYgREVCVUcKKwlpZiAoIXAgfHwgKGdfc3RhY2tueHQgPCAoY2hhciAqKXApIHx8ICgoY2hhciAqKXAgPCBnX3N0YWNrcC0+c3BhY2UpKSB7CisJCXdyaXRlKFNUREVSUl9GSUxFTk8sICJzdHVuYWxsb2NcbiIsIDEwKTsKKwkJYWJvcnQoKTsKKwl9CisjZW5kaWYKKwlnX3N0YWNrbmxlZnQgKz0gZ19zdGFja254dCAtIChjaGFyICopcDsKKwlnX3N0YWNrbnh0ID0gcDsKK30KKworLyoKKyAqIExpa2Ugc3RyZHVwIGJ1dCB3b3JrcyB3aXRoIHRoZSBhc2ggc3RhY2suCisgKi8KK3N0YXRpYyBjaGFyICoKK3N0c3RyZHVwKGNvbnN0IGNoYXIgKnApCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihwKSArIDE7CisJcmV0dXJuIG1lbWNweShzdGFsbG9jKGxlbiksIHAsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRzdGFja21hcmsoc3RydWN0IHN0YWNrbWFyayAqbWFyaykKK3sKKwltYXJrLT5zdGFja3AgPSBnX3N0YWNrcDsKKwltYXJrLT5zdGFja254dCA9IGdfc3RhY2tueHQ7CisJbWFyay0+c3RhY2tubGVmdCA9IGdfc3RhY2tubGVmdDsKKwltYXJrLT5tYXJrbmV4dCA9IG1hcmtwOworCW1hcmtwID0gbWFyazsKK30KKworc3RhdGljIHZvaWQKK3BvcHN0YWNrbWFyayhzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrKQoreworCXN0cnVjdCBzdGFja19ibG9jayAqc3A7CisKKwlpZiAoIW1hcmstPnN0YWNrcCkKKwkJcmV0dXJuOworCisJSU5UX09GRjsKKwltYXJrcCA9IG1hcmstPm1hcmtuZXh0OworCXdoaWxlIChnX3N0YWNrcCAhPSBtYXJrLT5zdGFja3ApIHsKKwkJc3AgPSBnX3N0YWNrcDsKKwkJZ19zdGFja3AgPSBzcC0+cHJldjsKKwkJZnJlZShzcCk7CisJfQorCWdfc3RhY2tueHQgPSBtYXJrLT5zdGFja254dDsKKwlnX3N0YWNrbmxlZnQgPSBtYXJrLT5zdGFja25sZWZ0OworCXNzdHJlbmQgPSBtYXJrLT5zdGFja254dCArIG1hcmstPnN0YWNrbmxlZnQ7CisJSU5UX09OOworfQorCisvKgorICogV2hlbiB0aGUgcGFyc2VyIHJlYWRzIGluIGEgc3RyaW5nLCBpdCB3YW50cyB0byBzdGljayB0aGUgc3RyaW5nIG9uIHRoZQorICogc3RhY2sgYW5kIG9ubHkgYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIHdoZW4gaXQga25vd3MgaG93IGJpZyB0aGUKKyAqIHN0cmluZyBpcy4gIFN0YWNrYmxvY2sgKGRlZmluZWQgaW4gc3RhY2suaCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBibG9jaworICogb2Ygc3BhY2Ugb24gdG9wIG9mIHRoZSBzdGFjayBhbmQgc3RhY2tibG9ja2xlbiByZXR1cm5zIHRoZSBsZW5ndGggb2YKKyAqIHRoaXMgYmxvY2suICBHcm93c3RhY2tibG9jayB3aWxsIGdyb3cgdGhpcyBzcGFjZSBieSBhdCBsZWFzdCBvbmUgYnl0ZSwKKyAqIHBvc3NpYmx5IG1vdmluZyBpdCAobGlrZSByZWFsbG9jKS4gIEdyYWJzdGFja2Jsb2NrIGFjdHVhbGx5IGFsbG9jYXRlcyB0aGUKKyAqIHBhcnQgb2YgdGhlIGJsb2NrIHRoYXQgaGFzIGJlZW4gdXNlZC4KKyAqLworc3RhdGljIHZvaWQKK2dyb3dzdGFja2Jsb2NrKHZvaWQpCit7CisJc2l6ZV90IG5ld2xlbjsKKworCW5ld2xlbiA9IGdfc3RhY2tubGVmdCAqIDI7CisJaWYgKG5ld2xlbiA8IGdfc3RhY2tubGVmdCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCWlmIChuZXdsZW4gPCAxMjgpCisJCW5ld2xlbiArPSAxMjg7CisKKwlpZiAoZ19zdGFja254dCA9PSBnX3N0YWNrcC0+c3BhY2UgJiYgZ19zdGFja3AgIT0gJnN0YWNrYmFzZSkgeworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKm9sZHN0YWNrcDsKKwkJc3RydWN0IHN0YWNrbWFyayAqeG1hcms7CisJCXN0cnVjdCBzdGFja19ibG9jayAqc3A7CisJCXN0cnVjdCBzdGFja19ibG9jayAqcHJldnN0YWNrcDsKKwkJc2l6ZV90IGdyb3NzbGVuOworCisJCUlOVF9PRkY7CisJCW9sZHN0YWNrcCA9IGdfc3RhY2twOworCQlzcCA9IGdfc3RhY2twOworCQlwcmV2c3RhY2twID0gc3AtPnByZXY7CisJCWdyb3NzbGVuID0gbmV3bGVuICsgc2l6ZW9mKHN0cnVjdCBzdGFja19ibG9jaykgLSBNSU5TSVpFOworCQlzcCA9IGNrcmVhbGxvYyhzcCwgZ3Jvc3NsZW4pOworCQlzcC0+cHJldiA9IHByZXZzdGFja3A7CisJCWdfc3RhY2twID0gc3A7CisJCWdfc3RhY2tueHQgPSBzcC0+c3BhY2U7CisJCWdfc3RhY2tubGVmdCA9IG5ld2xlbjsKKwkJc3N0cmVuZCA9IHNwLT5zcGFjZSArIG5ld2xlbjsKKworCQkvKgorCQkgKiBTdGFjayBtYXJrcyBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIG9sZCBibG9jaworCQkgKiBtdXN0IGJlIHJlbG9jYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGJsb2NrCisJCSAqLworCQl4bWFyayA9IG1hcmtwOworCQl3aGlsZSAoeG1hcmsgIT0gTlVMTCAmJiB4bWFyay0+c3RhY2twID09IG9sZHN0YWNrcCkgeworCQkJeG1hcmstPnN0YWNrcCA9IGdfc3RhY2twOworCQkJeG1hcmstPnN0YWNrbnh0ID0gZ19zdGFja254dDsKKwkJCXhtYXJrLT5zdGFja25sZWZ0ID0gZ19zdGFja25sZWZ0OworCQkJeG1hcmsgPSB4bWFyay0+bWFya25leHQ7CisJCX0KKwkJSU5UX09OOworCX0gZWxzZSB7CisJCWNoYXIgKm9sZHNwYWNlID0gZ19zdGFja254dDsKKwkJc2l6ZV90IG9sZGxlbiA9IGdfc3RhY2tubGVmdDsKKwkJY2hhciAqcCA9IHN0YWxsb2MobmV3bGVuKTsKKworCQkvKiBmcmVlIHRoZSBzcGFjZSB3ZSBqdXN0IGFsbG9jYXRlZCAqLworCQlnX3N0YWNrbnh0ID0gbWVtY3B5KHAsIG9sZHNwYWNlLCBvbGRsZW4pOworCQlnX3N0YWNrbmxlZnQgKz0gbmV3bGVuOworCX0KK30KKworc3RhdGljIHZvaWQKK2dyYWJzdGFja2Jsb2NrKHNpemVfdCBsZW4pCit7CisJbGVuID0gU0hFTExfQUxJR04obGVuKTsKKwlnX3N0YWNrbnh0ICs9IGxlbjsKKwlnX3N0YWNrbmxlZnQgLT0gbGVuOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgc29tZXdoYXQgZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBhYm92ZS4KKyAqIFRoZSB1c2VyIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZSBTVEFDS1NUUiwgd2hpY2ggbWF5IGJlIGRlY2xhcmVkCisgKiB0byBiZSBhIHJlZ2lzdGVyLiAgVGhlIG1hY3JvIFNUQVJUU1RBQ0tTVFIgaW5pdGlhbGl6ZXMgdGhpbmdzLiAgVGhlbgorICogdGhlIHVzZXIgdXNlcyB0aGUgbWFjcm8gU1RQVVRDIHRvIGFkZCBjaGFyYWN0ZXJzIHRvIHRoZSBzdHJpbmcuICBJbgorICogZWZmZWN0LCBTVFBVVEMoYywgcCkgaXMgdGhlIHNhbWUgYXMgKnArKyA9IGMgZXhjZXB0IHRoYXQgdGhlIHN0YWNrIGlzCisgKiBncm93biBhcyBuZWNlc3NhcnkuICBXaGVuIHRoZSB1c2VyIGlzIGRvbmUsIHNoZSBjYW4ganVzdCBsZWF2ZSB0aGUKKyAqIHN0cmluZyB0aGVyZSBhbmQgcmVmZXIgdG8gaXQgdXNpbmcgc3RhY2tibG9jaygpLiAgT3Igc2hlIGNhbiBhbGxvY2F0ZQorICogdGhlIHNwYWNlIGZvciBpdCB1c2luZyBncmFic3RhY2tzdHIoKS4gIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBhbGxvdworICogc29tZW9uZSBlbHNlIHRvIHVzZSB0aGUgc3RhY2sgdGVtcG9yYXJpbHkgYW5kIHRoZW4gY29udGludWUgdG8gZ3JvdworICogdGhlIHN0cmluZywgdGhlIHVzZXIgc2hvdWxkIHVzZSBncmFic3RhY2sgdG8gYWxsb2NhdGUgdGhlIHNwYWNlLCBhbmQKKyAqIHRoZW4gY2FsbCB1bmdyYWJzdHIocCkgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBtb2RlIG9mIG9wZXJhdGlvbi4KKyAqCisgKiBVU1RQVVRDIGlzIGxpa2UgU1RQVVRDIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgY2hlY2sgZm9yIG92ZXJmbG93LgorICogQ0hFQ0tTVEFDS1NQQUNFIGNhbiBiZSBjYWxsZWQgYmVmb3JlIFVTVFBVVEMgdG8gZW5zdXJlIHRoYXQgdGhlcmUKKyAqIGlzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLgorICovCitzdGF0aWMgdm9pZCAqCitncm93c3RhY2tzdHIodm9pZCkKK3sKKwlzaXplX3QgbGVuID0gc3RhY2tibG9ja3NpemUoKTsKKwlpZiAoaGVyZWZkID49IDAgJiYgbGVuID49IDEwMjQpIHsKKwkJZnVsbF93cml0ZShoZXJlZmQsIHN0YWNrYmxvY2soKSwgbGVuKTsKKwkJcmV0dXJuIHN0YWNrYmxvY2soKTsKKwl9CisJZ3Jvd3N0YWNrYmxvY2soKTsKKwlyZXR1cm4gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBsZW47Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBDSEVDS1NUUlNQQUNFLgorICovCitzdGF0aWMgY2hhciAqCittYWtlc3Ryc3BhY2Uoc2l6ZV90IG5ld2xlbiwgY2hhciAqcCkKK3sKKwlzaXplX3QgbGVuID0gcCAtIGdfc3RhY2tueHQ7CisJc2l6ZV90IHNpemUgPSBzdGFja2Jsb2Nrc2l6ZSgpOworCisJZm9yICg7OykgeworCQlzaXplX3QgbmxlZnQ7CisKKwkJc2l6ZSA9IHN0YWNrYmxvY2tzaXplKCk7CisJCW5sZWZ0ID0gc2l6ZSAtIGxlbjsKKwkJaWYgKG5sZWZ0ID49IG5ld2xlbikKKwkJCWJyZWFrOworCQlncm93c3RhY2tibG9jaygpOworCX0KKwlyZXR1cm4gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBsZW47Cit9CisKK3N0YXRpYyBjaGFyICoKK3N0YWNrX25wdXRzdHIoY29uc3QgY2hhciAqcywgc2l6ZV90IG4sIGNoYXIgKnApCit7CisJcCA9IG1ha2VzdHJzcGFjZShuLCBwKTsKKwlwID0gKGNoYXIgKiltZW1jcHkocCwgcywgbikgKyBuOworCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitzdGFja19wdXRzdHIoY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sKKwlyZXR1cm4gc3RhY2tfbnB1dHN0cihzLCBzdHJsZW4ocyksIHApOworfQorCitzdGF0aWMgY2hhciAqCitfU1RQVVRDKGludCBjLCBjaGFyICpwKQoreworCWlmIChwID09IHNzdHJlbmQpCisJCXAgPSBncm93c3RhY2tzdHIoKTsKKwkqcCsrID0gYzsKKwlyZXR1cm4gcDsKK30KKworI2RlZmluZSBTVEFSVFNUQUNLU1RSKHApICAgICAgICAoKHApID0gc3RhY2tibG9jaygpKQorI2RlZmluZSBTVFBVVEMoYywgcCkgICAgICAgICAgICAoKHApID0gX1NUUFVUQygoYyksIChwKSkpCisjZGVmaW5lIENIRUNLU1RSU1BBQ0UobiwgcCkgZG8geyBcCisJY2hhciAqcSA9IChwKTsgXAorCXNpemVfdCBsID0gKG4pOyBcCisJc2l6ZV90IG0gPSBzc3RyZW5kIC0gcTsgXAorCWlmIChsID4gbSkgXAorCQkocCkgPSBtYWtlc3Ryc3BhY2UobCwgcSk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFVTVFBVVEMoYywgcCkgICAgICAgICAgICgqKHApKysgPSAoYykpCisjZGVmaW5lIFNUQUNLU1RSTlVMKHApIGRvIHsgXAorCWlmICgocCkgPT0gc3N0cmVuZCkgXAorCQkocCkgPSBncm93c3RhY2tzdHIoKTsgXAorCSoocCkgPSAnXDAnOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVFVOUFVUQyhwKSAgICAgICAgICAgICAoLS0ocCkpCisjZGVmaW5lIFNUVE9QQyhwKSAgICAgICAgICAgICAgICgocClbLTFdKQorI2RlZmluZSBTVEFESlVTVChhbW91bnQsIHApICAgICAoKHApICs9IChhbW91bnQpKQorCisjZGVmaW5lIGdyYWJzdGFja3N0cihwKSAgICAgICAgIHN0YWxsb2MoKGNoYXIgKikocCkgLSAoY2hhciAqKXN0YWNrYmxvY2soKSkKKyNkZWZpbmUgdW5ncmFic3RhY2tzdHIocywgcCkgICAgc3R1bmFsbG9jKHMpCisjZGVmaW5lIHN0YWNrc3RyZW5kKCkgICAgICAgICAgICgodm9pZCAqKXNzdHJlbmQpCisKKworLyogPT09PT09PT09PT09IFN0cmluZyBoZWxwZXJzICovCisKKy8qCisgKiBwcmVmaXggLS0gc2VlIGlmIHBmeCBpcyBhIHByZWZpeCBvZiBzdHJpbmcuCisgKi8KK3N0YXRpYyBjaGFyICoKK3ByZWZpeChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKwl3aGlsZSAoKnBmeCkgeworCQlpZiAoKnBmeCsrICE9ICpzdHJpbmcrKykKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKGNoYXIgKikgc3RyaW5nOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyLiAgVGhpcyBzaG91bGQgYmUgZWxzZXdoZXJlLgorICovCitzdGF0aWMgaW50Citpc19udW1iZXIoY29uc3QgY2hhciAqcCkKK3sKKwlkbyB7CisJCWlmICghaXNkaWdpdCgqcCkpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICgqKytwICE9ICdcMCcpOworCXJldHVybiAxOworfQorCisvKgorICogQ29udmVydCBhIHN0cmluZyBvZiBkaWdpdHMgdG8gYW4gaW50ZWdlciwgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZSBvbgorICogZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorbnVtYmVyKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKCFpc19udW1iZXIocykpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKG1zZ19pbGxudW0sIHMpOworCXJldHVybiBhdG9pKHMpOworfQorCisvKgorICogUHJvZHVjZSBhIHBvc3NpYmx5IHNpbmdsZSBxdW90ZWQgc3RyaW5nIHN1aXRhYmxlIGFzIGlucHV0IHRvIHRoZSBzaGVsbC4KKyAqIFRoZSByZXR1cm4gc3RyaW5nIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKi8KK3N0YXRpYyBjaGFyICoKK3NpbmdsZV9xdW90ZShjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnA7CisKKwlTVEFSVFNUQUNLU1RSKHApOworCisJZG8geworCQljaGFyICpxOworCQlzaXplX3QgbGVuOworCisJCWxlbiA9IHN0cmNocm51bChzLCAnXCcnKSAtIHM7CisKKwkJcSA9IHAgPSBtYWtlc3Ryc3BhY2UobGVuICsgMywgcCk7CisKKwkJKnErKyA9ICdcJyc7CisJCXEgPSAoY2hhciAqKW1lbWNweShxLCBzLCBsZW4pICsgbGVuOworCQkqcSsrID0gJ1wnJzsKKwkJcyArPSBsZW47CisKKwkJU1RBREpVU1QocSAtIHAsIHApOworCisJCWlmICgqcyAhPSAnXCcnKQorCQkJYnJlYWs7CisJCWxlbiA9IDA7CisJCWRvIGxlbisrOyB3aGlsZSAoKisrcyA9PSAnXCcnKTsKKworCQlxID0gcCA9IG1ha2VzdHJzcGFjZShsZW4gKyAzLCBwKTsKKworCQkqcSsrID0gJyInOworCQlxID0gKGNoYXIgKiltZW1jcHkocSwgcyAtIGxlbiwgbGVuKSArIGxlbjsKKwkJKnErKyA9ICciJzsKKworCQlTVEFESlVTVChxIC0gcCwgcCk7CisJfSB3aGlsZSAoKnMpOworCisJVVNUUFVUQygnXDAnLCBwKTsKKworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisKKworLyogPT09PT09PT09PT09IG5leHRvcHQgKi8KKworc3RhdGljIGNoYXIgKiphcmdwdHI7ICAgICAgICAgICAgICAgICAgLyogYXJndW1lbnQgbGlzdCBmb3IgYnVpbHRpbiBjb21tYW5kcyAqLworc3RhdGljIGNoYXIgKm9wdGlvbmFyZzsgICAgICAgICAgICAgICAgLyogc2V0IGJ5IG5leHRvcHQgKGxpa2UgZ2V0b3B0KSAqLworc3RhdGljIGNoYXIgKm9wdHB0cjsgICAgICAgICAgICAgICAgICAgLyogdXNlZCBieSBuZXh0b3B0ICovCisKKy8qCisgKiBYWFggLSBzaG91bGQgZ2V0IHJpZCBvZi4gSGF2ZSBhbGwgYnVpbHRpbnMgdXNlIGdldG9wdCgzKS4KKyAqIFRoZSBsaWJyYXJ5IGdldG9wdCBtdXN0IGhhdmUgdGhlIEJTRCBleHRlbnNpb24gc3RhdGljIHZhcmlhYmxlCisgKiAib3B0cmVzZXQiLCBvdGhlcndpc2UgaXQgY2FuJ3QgYmUgdXNlZCB3aXRoaW4gdGhlIHNoZWxsIHNhZmVseS4KKyAqCisgKiBTdGFuZGFyZCBvcHRpb24gcHJvY2Vzc2luZyAoYSBsYSBnZXRvcHQpIGZvciBidWlsdGluIHJvdXRpbmVzLgorICogVGhlIG9ubHkgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gbmV4dG9wdCBpcyB0aGUgb3B0aW9uIHN0cmluZzsKKyAqIHRoZSBvdGhlciBhcmd1bWVudHMgYXJlIHVubmVjZXNzYXJ5LiBJdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIsCisgKiBvciAnXDAnIG9uIGVuZCBvZiBpbnB1dC4KKyAqLworc3RhdGljIGludAorbmV4dG9wdChjb25zdCBjaGFyICpvcHRzdHJpbmcpCit7CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpxOworCWNoYXIgYzsKKworCXAgPSBvcHRwdHI7CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAnXDAnKSB7CisJCS8qIFdlIGF0ZSBlbnRpcmUgIi1wYXJhbSIsIHRha2UgbmV4dCBvbmUgKi8KKwkJcCA9ICphcmdwdHI7CisJCWlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gJ1wwJzsKKwkJaWYgKCpwICE9ICctJykKKwkJCXJldHVybiAnXDAnOworCQlpZiAoKisrcCA9PSAnXDAnKSAvKiBqdXN0ICItIiA/ICovCisJCQlyZXR1cm4gJ1wwJzsKKwkJYXJncHRyKys7CisJCWlmIChMT05FX0RBU0gocCkpIC8qICItLSIgPyAqLworCQkJcmV0dXJuICdcMCc7CisJCS8qIHAgPT4gbmV4dCAiLXBhcmFtIiAqLworCX0KKwkvKiBwID0+IHNvbWUgb3B0aW9uIGNoYXIgaW4gdGhlIG1pZGRsZSBvZiBhICItcGFyYW0iICovCisJYyA9ICpwKys7CisJZm9yIChxID0gb3B0c3RyaW5nOyAqcSAhPSBjOykgeworCQlpZiAoKnEgPT0gJ1wwJykKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJpbGxlZ2FsIG9wdGlvbiAtJWMiLCBjKTsKKwkJaWYgKCorK3EgPT0gJzonKQorCQkJcSsrOworCX0KKwlpZiAoKisrcSA9PSAnOicpIHsKKwkJaWYgKCpwID09ICdcMCcpIHsKKwkJCXAgPSAqYXJncHRyKys7CisJCQlpZiAocCA9PSBOVUxMKQorCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJubyBhcmcgZm9yIC0lYyBvcHRpb24iLCBjKTsKKwkJfQorCQlvcHRpb25hcmcgPSBwOworCQlwID0gTlVMTDsKKwl9CisJb3B0cHRyID0gcDsKKwlyZXR1cm4gYzsKK30KKworCisvKiA9PT09PT09PT09PT0gU2hlbGwgdmFyaWFibGVzICovCisKKy8qCisgKiBUaGUgcGFyc2VmaWxlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBnbG9iYWwgdmFyaWFibGUgcGFyc2VmaWxlCisgKiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBmaWxlIGJlaW5nIHJlYWQuCisgKi8KK3N0cnVjdCBzaHBhcmFtIHsKKwlpbnQgbnBhcmFtOyAgICAgICAgICAgICAvKiAjIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAod2l0aG91dCAkMCkgKi8KKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlpbnQgb3B0aW5kOyAgICAgICAgICAgICAvKiBuZXh0IHBhcmFtZXRlciB0byBiZSBwcm9jZXNzZWQgYnkgZ2V0b3B0cyAqLworCWludCBvcHRvZmY7ICAgICAgICAgICAgIC8qIHVzZWQgYnkgZ2V0b3B0cyAqLworI2VuZGlmCisJdW5zaWduZWQgY2hhciBtYWxsb2NlZDsgLyogaWYgcGFyYW1ldGVyIGxpc3QgZHluYW1pY2FsbHkgYWxsb2NhdGVkICovCisJY2hhciAqKnA7ICAgICAgICAgICAgICAgLyogcGFyYW1ldGVyIGxpc3QgKi8KK307CisKKy8qCisgKiBGcmVlIHRoZSBsaXN0IG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2ZyZWVwYXJhbSh2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSAqcGFyYW0pCit7CisJaWYgKHBhcmFtLT5tYWxsb2NlZCkgeworCQljaGFyICoqYXAsICoqYXAxOworCQlhcCA9IGFwMSA9IHBhcmFtLT5wOworCQl3aGlsZSAoKmFwKQorCQkJZnJlZSgqYXArKyk7CisJCWZyZWUoYXAxKTsKKwl9Cit9CisKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBnZXRvcHRzcmVzZXQoY29uc3QgY2hhciAqdmFsdWUpOworI2VuZGlmCisKK3N0cnVjdCB2YXIgeworCXN0cnVjdCB2YXIgKm5leHQ7ICAgICAgICAgICAgICAgLyogbmV4dCBlbnRyeSBpbiBoYXNoIGxpc3QgKi8KKwlpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzIGFyZSBkZWZpbmVkIGFib3ZlICovCisJY29uc3QgY2hhciAqdmFyX3RleHQ7ICAgICAgICAgICAvKiBuYW1lPXZhbHVlICovCisJdm9pZCAoKnZhcl9mdW5jKShjb25zdCBjaGFyICopIEZBU1RfRlVOQzsgLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gICovCisJCQkJCS8qIHRoZSB2YXJpYWJsZSBnZXRzIHNldC91bnNldCAqLworfTsKKworc3RydWN0IGxvY2FsdmFyIHsKKwlzdHJ1Y3QgbG9jYWx2YXIgKm5leHQ7ICAgICAgICAgIC8qIG5leHQgbG9jYWwgdmFyaWFibGUgaW4gbGlzdCAqLworCXN0cnVjdCB2YXIgKnZwOyAgICAgICAgICAgICAgICAgLyogdGhlIHZhcmlhYmxlIHRoYXQgd2FzIG1hZGUgbG9jYWwgKi8KKwlpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkIGZsYWdzICovCisJY29uc3QgY2hhciAqdGV4dDsgICAgICAgICAgICAgICAvKiBzYXZlZCB0ZXh0ICovCit9OworCisvKiBmbGFncyAqLworI2RlZmluZSBWRVhQT1JUICAgICAgICAgMHgwMSAgICAvKiB2YXJpYWJsZSBpcyBleHBvcnRlZCAqLworI2RlZmluZSBWUkVBRE9OTFkgICAgICAgMHgwMiAgICAvKiB2YXJpYWJsZSBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgVlNUUkZJWEVEICAgICAgIDB4MDQgICAgLyogdmFyaWFibGUgc3RydWN0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisjZGVmaW5lIFZURVhURklYRUQgICAgICAweDA4ICAgIC8qIHRleHQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgVlNUQUNLICAgICAgICAgIDB4MTAgICAgLyogdGV4dCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrICovCisjZGVmaW5lIFZVTlNFVCAgICAgICAgICAweDIwICAgIC8qIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2V0ICovCisjZGVmaW5lIFZOT0ZVTkMgICAgICAgICAweDQwICAgIC8qIGRvbid0IGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisjZGVmaW5lIFZOT1NFVCAgICAgICAgICAweDgwICAgIC8qIGRvIG5vdCBzZXQgdmFyaWFibGUgLSBqdXN0IHJlYWRvbmx5IHRlc3QgKi8KKyNkZWZpbmUgVk5PU0FWRSAgICAgICAgIDB4MTAwICAgLyogd2hlbiB0ZXh0IGlzIG9uIHRoZSBoZWFwIGJlZm9yZSBzZXR2YXJlcSAqLworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKyMgZGVmaW5lIFZEWU5BTUlDICAgICAgIDB4MjAwICAgLyogZHluYW1pYyB2YXJpYWJsZSAqLworI2Vsc2UKKyMgZGVmaW5lIFZEWU5BTUlDICAgICAgIDAKKyNlbmRpZgorCisKKy8qIE5lZWQgdG8gYmUgYmVmb3JlIHZhcmluaXRfZGF0YVtdICovCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZV9sY19hbGwoY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHZhbHVlICYmICp2YWx1ZSAhPSAnXDAnKQorCQlzZXRsb2NhbGUoTENfQUxMLCB2YWx1ZSk7Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZV9sY19jdHlwZShjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodmFsdWUgJiYgKnZhbHVlICE9ICdcMCcpCisJCXNldGxvY2FsZShMQ19DVFlQRSwgdmFsdWUpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9NQUlMCitzdGF0aWMgdm9pZCBjaGttYWlsKHZvaWQpOworc3RhdGljIHZvaWQgY2hhbmdlbWFpbChjb25zdCBjaGFyICp2YXJfdmFsdWUpIEZBU1RfRlVOQzsKKyNlbHNlCisjIGRlZmluZSBjaGttYWlsKCkgICgodm9pZCkwKQorI2VuZGlmCitzdGF0aWMgdm9pZCBjaGFuZ2VwYXRoKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGNoYW5nZV9yYW5kb20oY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IGZsYWdzOworCWNvbnN0IGNoYXIgKnZhcl90ZXh0OworCXZvaWQgKCp2YXJfZnVuYykoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7Cit9IHZhcmluaXRfZGF0YVtdID0geworCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCBkZWZpZnN2YXIgICAsIE5VTEwgICAgICAgICAgICB9LAorI2lmIEVOQUJMRV9BU0hfTUFJTAorCXsgVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULCAiTUFJTCIgICAgICAsIGNoYW5nZW1haWwgICAgICB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULCAiTUFJTFBBVEgiICAsIGNoYW5nZW1haWwgICAgICB9LAorI2VuZGlmCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRCAgICAgICAsIGJiX1BBVEhfcm9vdF9wYXRoLCBjaGFuZ2VwYXRoIH0sCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRCAgICAgICAsICJQUzE9JCAiICAgICwgTlVMTCAgICAgICAgICAgIH0sCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRCAgICAgICAsICJQUzI9PiAiICAgICwgTlVMTCAgICAgICAgICAgIH0sCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRCAgICAgICAsICJQUzQ9KyAiICAgICwgTlVMTCAgICAgICAgICAgIH0sCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRCAgICAgICAsICJPUFRJTkQ9MSIgICwgZ2V0b3B0c3Jlc2V0ICAgIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVR8VkRZTkFNSUMsICJSQU5ET00iLCBjaGFuZ2VfcmFuZG9tIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfTE9DQUxFX1NVUFBPUlQKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIkxDX0FMTCIgICAgLCBjaGFuZ2VfbGNfYWxsICAgfSwKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIkxDX0NUWVBFIiAgLCBjaGFuZ2VfbGNfY3R5cGUgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIkhJU1RGSUxFIiAgLCBOVUxMICAgICAgICAgICAgfSwKKyNlbmRpZgorfTsKKworc3RydWN0IHJlZGlydGFiOworCitzdHJ1Y3QgZ2xvYmFsc192YXIgeworCXN0cnVjdCBzaHBhcmFtIHNoZWxscGFyYW07ICAgICAgLyogJEAgY3VycmVudCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgcmVkaXJ0YWIgKnJlZGlybGlzdDsKKwlpbnQgZ19udWxscmVkaXJzOworCWludCBwcmV2ZXJyb3V0X2ZkOyAgIC8qIHNhdmUgZmQyIGJlZm9yZSBwcmludCBkZWJ1ZyBpZiB4ZmxhZyBpcyBzZXQuICovCisJc3RydWN0IHZhciAqdmFydGFiW1ZUQUJTSVpFXTsKKwlzdHJ1Y3QgdmFyIHZhcmluaXRbQVJSQVlfU0laRSh2YXJpbml0X2RhdGEpXTsKK307CitleHRlcm4gc3RydWN0IGdsb2JhbHNfdmFyICpjb25zdCBhc2hfcHRyX3RvX2dsb2JhbHNfdmFyOworI2RlZmluZSBHX3ZhciAoKmFzaF9wdHJfdG9fZ2xvYmFsc192YXIpCisjZGVmaW5lIHNoZWxscGFyYW0gICAgKEdfdmFyLnNoZWxscGFyYW0gICApCisvLyNkZWZpbmUgcmVkaXJsaXN0ICAgICAoR192YXIucmVkaXJsaXN0ICAgICkKKyNkZWZpbmUgZ19udWxscmVkaXJzICAoR192YXIuZ19udWxscmVkaXJzICkKKyNkZWZpbmUgcHJldmVycm91dF9mZCAoR192YXIucHJldmVycm91dF9mZCkKKyNkZWZpbmUgdmFydGFiICAgICAgICAoR192YXIudmFydGFiICAgICAgICkKKyNkZWZpbmUgdmFyaW5pdCAgICAgICAoR192YXIudmFyaW5pdCAgICAgICkKKyNkZWZpbmUgSU5JVF9HX3ZhcigpIGRvIHsgXAorCXVuc2lnbmVkIGk7IFwKKwkoKihzdHJ1Y3QgZ2xvYmFsc192YXIqKikmYXNoX3B0cl90b19nbG9iYWxzX3ZhcikgPSB4emFsbG9jKHNpemVvZihHX3ZhcikpOyBcCisJYmFycmllcigpOyBcCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmFyaW5pdF9kYXRhKTsgaSsrKSB7IFwKKwkJdmFyaW5pdFtpXS5mbGFncyAgICA9IHZhcmluaXRfZGF0YVtpXS5mbGFnczsgXAorCQl2YXJpbml0W2ldLnZhcl90ZXh0ID0gdmFyaW5pdF9kYXRhW2ldLnZhcl90ZXh0OyBcCisJCXZhcmluaXRbaV0udmFyX2Z1bmMgPSB2YXJpbml0X2RhdGFbaV0udmFyX2Z1bmM7IFwKKwl9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgdmlmcyAgICAgIHZhcmluaXRbMF0KKyNpZiBFTkFCTEVfQVNIX01BSUwKKyMgZGVmaW5lIHZtYWlsICAgICgmdmlmcylbMV0KKyMgZGVmaW5lIHZtcGF0aCAgICgmdm1haWwpWzFdCisjIGRlZmluZSB2cGF0aCAgICAoJnZtcGF0aClbMV0KKyNlbHNlCisjIGRlZmluZSB2cGF0aCAgICAoJnZpZnMpWzFdCisjZW5kaWYKKyNkZWZpbmUgdnBzMSAgICAgICgmdnBhdGgpWzFdCisjZGVmaW5lIHZwczIgICAgICAoJnZwczEpWzFdCisjZGVmaW5lIHZwczQgICAgICAoJnZwczIpWzFdCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisjIGRlZmluZSB2b3B0aW5kICAoJnZwczQpWzFdCisjIGlmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKyMgIGRlZmluZSB2cmFuZG9tICgmdm9wdGluZClbMV0KKyMgZW5kaWYKKyNlbHNlCisjIGlmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKyMgIGRlZmluZSB2cmFuZG9tICgmdnBzNClbMV0KKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYWNjZXNzIHRoZSB2YWx1ZXMgb2YgdGhlIGFib3ZlIHZhcmlhYmxlcy4KKyAqIFRoZXkgaGF2ZSB0byBza2lwIG92ZXIgdGhlIG5hbWUuICBUaGV5IHJldHVybiB0aGUgbnVsbCBzdHJpbmcKKyAqIGZvciB1bnNldCB2YXJpYWJsZXMuCisgKi8KKyNkZWZpbmUgaWZzdmFsKCkgICAgICAgICh2aWZzLnZhcl90ZXh0ICsgNCkKKyNkZWZpbmUgaWZzc2V0KCkgICAgICAgICgodmlmcy5mbGFncyAmIFZVTlNFVCkgPT0gMCkKKyNpZiBFTkFCTEVfQVNIX01BSUwKKyMgZGVmaW5lIG1haWx2YWwoKSAgICAgICh2bWFpbC52YXJfdGV4dCArIDUpCisjIGRlZmluZSBtcGF0aHZhbCgpICAgICAodm1wYXRoLnZhcl90ZXh0ICsgOSkKKyMgZGVmaW5lIG1wYXRoc2V0KCkgICAgICgodm1wYXRoLmZsYWdzICYgVlVOU0VUKSA9PSAwKQorI2VuZGlmCisjZGVmaW5lIHBhdGh2YWwoKSAgICAgICAodnBhdGgudmFyX3RleHQgKyA1KQorI2RlZmluZSBwczF2YWwoKSAgICAgICAgKHZwczEudmFyX3RleHQgKyA0KQorI2RlZmluZSBwczJ2YWwoKSAgICAgICAgKHZwczIudmFyX3RleHQgKyA0KQorI2RlZmluZSBwczR2YWwoKSAgICAgICAgKHZwczQudmFyX3RleHQgKyA0KQorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworIyBkZWZpbmUgb3B0aW5kdmFsKCkgICAgKHZvcHRpbmQudmFyX3RleHQgKyA3KQorI2VuZGlmCisKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQworZ2V0b3B0c3Jlc2V0KGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXNoZWxscGFyYW0ub3B0aW5kID0gbnVtYmVyKHZhbHVlKTsKKwlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworfQorI2VuZGlmCisKKy8qIG1hdGguaCBoYXMgdGhlc2UsIG90aGVyd2lzZSBkZWZpbmUgb3VyIHByaXZhdGUgY29waWVzICovCisjaWYgIUVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKyNkZWZpbmUgaXNfbmFtZShjKSAgICAgICgoYykgPT0gJ18nIHx8IGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKGMpKSkKKyNkZWZpbmUgaXNfaW5fbmFtZShjKSAgICgoYykgPT0gJ18nIHx8IGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKGMpKSkKKy8qCisgKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIgd2hpY2ggaXMgbm90IHBhcnQgb2YgYSBsZWdhbCB2YXJpYWJsZSBuYW1lCisgKiAoYSBsZXR0ZXIgb3IgdW5kZXJzY29yZSBmb2xsb3dlZCBieSBsZXR0ZXJzLCB1bmRlcnNjb3JlcywgYW5kIGRpZ2l0cykuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKgorZW5kb2ZuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFpc19uYW1lKCpuYW1lKSkKKwkJcmV0dXJuIG5hbWU7CisJd2hpbGUgKCorK25hbWUpIHsKKwkJaWYgKCFpc19pbl9uYW1lKCpuYW1lKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKyNlbmRpZgorCisvKgorICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXAgdG8gdGhlIGZpcnN0ID0gb3IgJ1wwJy4gIFRoZSBmaXJzdAorICogc3RyaW5nIG11c3QgYmUgdGVybWluYXRlZCBieSAnPSc7IHRoZSBzZWNvbmQgbWF5IGJlIHRlcm1pbmF0ZWQgYnkKKyAqIGVpdGhlciAnPScgb3IgJ1wwJy4KKyAqLworc3RhdGljIGludAordmFyY21wKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnEpCit7CisJaW50IGMsIGQ7CisKKwl3aGlsZSAoKGMgPSAqcCkgPT0gKGQgPSAqcSkpIHsKKwkJaWYgKCFjIHx8IGMgPT0gJz0nKQorCQkJZ290byBvdXQ7CisJCXArKzsKKwkJcSsrOworCX0KKwlpZiAoYyA9PSAnPScpCisJCWMgPSAnXDAnOworCWlmIChkID09ICc9JykKKwkJZCA9ICdcMCc7Cisgb3V0OgorCXJldHVybiBjIC0gZDsKK30KKworLyoKKyAqIEZpbmQgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGZyb20gdGhlIG5hbWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmFyICoqCitoYXNodmFyKGNvbnN0IGNoYXIgKnApCit7CisJdW5zaWduZWQgaGFzaHZhbDsKKworCWhhc2h2YWwgPSAoKHVuc2lnbmVkIGNoYXIpICpwKSA8PCA0OworCXdoaWxlICgqcCAmJiAqcCAhPSAnPScpCisJCWhhc2h2YWwgKz0gKHVuc2lnbmVkIGNoYXIpICpwKys7CisJcmV0dXJuICZ2YXJ0YWJbaGFzaHZhbCAlIFZUQUJTSVpFXTsKK30KKworc3RhdGljIGludAordnBjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwlyZXR1cm4gdmFyY21wKCooY29uc3QgY2hhciAqKilhLCAqKGNvbnN0IGNoYXIgKiopYik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIGJ1aWx0aW4gdmFyaWFibGVzLgorICovCitzdGF0aWMgdm9pZAoraW5pdHZhcih2b2lkKQoreworCXN0cnVjdCB2YXIgKnZwOworCXN0cnVjdCB2YXIgKmVuZDsKKwlzdHJ1Y3QgdmFyICoqdnBwOworCisJLyoKKwkgKiBQUzEgZGVwZW5kcyBvbiB1aWQKKwkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HICYmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUCisJdnBzMS52YXJfdGV4dCA9ICJQUzE9XFx3IFxcJCAiOworI2Vsc2UKKwlpZiAoIWdldGV1aWQoKSkKKwkJdnBzMS52YXJfdGV4dCA9ICJQUzE9IyAiOworI2VuZGlmCisJdnAgPSB2YXJpbml0OworCWVuZCA9IHZwICsgQVJSQVlfU0laRSh2YXJpbml0KTsKKwlkbyB7CisJCXZwcCA9IGhhc2h2YXIodnAtPnZhcl90ZXh0KTsKKwkJdnAtPm5leHQgPSAqdnBwOworCQkqdnBwID0gdnA7CisJfSB3aGlsZSAoKyt2cCA8IGVuZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmFyICoqCitmaW5kdmFyKHN0cnVjdCB2YXIgKip2cHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZm9yICg7ICp2cHA7IHZwcCA9ICYoKnZwcCktPm5leHQpIHsKKwkJaWYgKHZhcmNtcCgoKnZwcCktPnZhcl90ZXh0LCBuYW1lKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gdnBwOworfQorCisvKgorICogRmluZCB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4gIFJldHVybnMgTlVMTCBpZiBub3Qgc2V0LgorICovCitzdGF0aWMgY29uc3QgY2hhciogRkFTVF9GVU5DCitsb29rdXB2YXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdmFyICp2OworCisJdiA9ICpmaW5kdmFyKGhhc2h2YXIobmFtZSksIG5hbWUpOworCWlmICh2KSB7CisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorCS8qCisJICogRHluYW1pYyB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIHJvdWdobHkgdGhlIHNhbWUgd2F5IHRoZXkgYXJlCisJICogaW4gYmFzaC4gTmFtZWx5LCB0aGV5J3JlICJzcGVjaWFsIiBzbyBsb25nIGFzIHRoZXkgYXJlbid0IHVuc2V0LgorCSAqIEFzIHNvb24gYXMgdGhleSdyZSB1bnNldCwgdGhleSdyZSBubyBsb25nZXIgZHluYW1pYywgYW5kIGR5bmFtaWMKKwkgKiBsb29rdXAgd2lsbCBubyBsb25nZXIgaGFwcGVuIGF0IHRoYXQgcG9pbnQuIC0tIFBGTS4KKwkgKi8KKwkJaWYgKHYtPmZsYWdzICYgVkRZTkFNSUMpCisJCQl2LT52YXJfZnVuYyhOVUxMKTsKKyNlbmRpZgorCQlpZiAoISh2LT5mbGFncyAmIFZVTlNFVCkpCisJCQlyZXR1cm4gdmFyX2VuZCh2LT52YXJfdGV4dCk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogU2VhcmNoIHRoZSBlbnZpcm9ubWVudCBvZiBhIGJ1aWx0aW4gY29tbWFuZC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorYmx0aW5sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlmb3IgKHNwID0gY21kZW52aXJvbjsgc3A7IHNwID0gc3AtPm5leHQpIHsKKwkJaWYgKHZhcmNtcChzcC0+dGV4dCwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiB2YXJfZW5kKHNwLT50ZXh0KTsKKwl9CisJcmV0dXJuIGxvb2t1cHZhcihuYW1lKTsKK30KKworLyoKKyAqIFNhbWUgYXMgc2V0dmFyIGV4Y2VwdCB0aGF0IHRoZSB2YXJpYWJsZSBhbmQgdmFsdWUgYXJlIHBhc3NlZCBpbgorICogdGhlIGZpcnN0IGFyZ3VtZW50IGFzIG5hbWU9dmFsdWUuICBTaW5jZSB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbAorICogYmUgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSB0YWJsZSwgaXQgc2hvdWxkIG5vdCBiZSBhIHN0cmluZyB0aGF0CisgKiB3aWxsIGdvIGF3YXkuCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworc3RhdGljIHZvaWQKK3NldHZhcmVxKGNoYXIgKnMsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdmFyICp2cCwgKip2cHA7CisKKwl2cHAgPSBoYXNodmFyKHMpOworCWZsYWdzIHw9IChWRVhQT1JUICYgKCgodW5zaWduZWQpICgxIC0gYWZsYWcpKSAtIDEpKTsKKwl2cCA9ICpmaW5kdmFyKHZwcCwgcyk7CisJaWYgKHZwKSB7CisJCWlmICgodnAtPmZsYWdzICYgKFZSRUFET05MWXxWRFlOQU1JQykpID09IFZSRUFET05MWSkgeworCQkJY29uc3QgY2hhciAqbjsKKworCQkJaWYgKGZsYWdzICYgVk5PU0FWRSkKKwkJCQlmcmVlKHMpOworCQkJbiA9IHZwLT52YXJfdGV4dDsKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlLipzOiBpcyByZWFkIG9ubHkiLCBzdHJjaHJudWwobiwgJz0nKSAtIG4sIG4pOworCQl9CisKKwkJaWYgKGZsYWdzICYgVk5PU0VUKQorCQkJcmV0dXJuOworCisJCWlmICh2cC0+dmFyX2Z1bmMgJiYgIShmbGFncyAmIFZOT0ZVTkMpKQorCQkJdnAtPnZhcl9mdW5jKHZhcl9lbmQocykpOworCisJCWlmICghKHZwLT5mbGFncyAmIChWVEVYVEZJWEVEfFZTVEFDSykpKQorCQkJZnJlZSgoY2hhciopdnAtPnZhcl90ZXh0KTsKKworCQlmbGFncyB8PSB2cC0+ZmxhZ3MgJiB+KFZURVhURklYRUR8VlNUQUNLfFZOT1NBVkV8VlVOU0VUKTsKKwl9IGVsc2UgeworCQkvKiB2YXJpYWJsZSBzIGlzIG5vdCBmb3VuZCAqLworCQlpZiAoZmxhZ3MgJiBWTk9TRVQpCisJCQlyZXR1cm47CisJCXZwID0gY2t6YWxsb2Moc2l6ZW9mKCp2cCkpOworCQl2cC0+bmV4dCA9ICp2cHA7CisJCS8qdnAtPmZ1bmMgPSBOVUxMOyAtIGNremFsbG9jIGRpZCBpdCAqLworCQkqdnBwID0gdnA7CisJfQorCWlmICghKGZsYWdzICYgKFZURVhURklYRUR8VlNUQUNLfFZOT1NBVkUpKSkKKwkJcyA9IGNrc3RyZHVwKHMpOworCXZwLT52YXJfdGV4dCA9IHM7CisJdnAtPmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuICBUaGUgZmxhZ3MgYXJndW1lbnQgaXMgb3JlZCB3aXRoIHRoZQorICogZmxhZ3Mgb2YgdGhlIHZhcmlhYmxlLiAgSWYgdmFsIGlzIE5VTEwsIHRoZSB2YXJpYWJsZSBpcyB1bnNldC4KKyAqLworc3RhdGljIHZvaWQKK3NldHZhcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwsIGludCBmbGFncykKK3sKKwljb25zdCBjaGFyICpxOworCWNoYXIgKnA7CisJY2hhciAqbmFtZWVxOworCXNpemVfdCBuYW1lbGVuOworCXNpemVfdCB2YWxsZW47CisKKwlxID0gZW5kb2ZuYW1lKG5hbWUpOworCXAgPSBzdHJjaHJudWwocSwgJz0nKTsKKwluYW1lbGVuID0gcCAtIG5hbWU7CisJaWYgKCFuYW1lbGVuIHx8IHAgIT0gcSkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiUuKnM6IGJhZCB2YXJpYWJsZSBuYW1lIiwgbmFtZWxlbiwgbmFtZSk7CisJdmFsbGVuID0gMDsKKwlpZiAodmFsID09IE5VTEwpIHsKKwkJZmxhZ3MgfD0gVlVOU0VUOworCX0gZWxzZSB7CisJCXZhbGxlbiA9IHN0cmxlbih2YWwpOworCX0KKworCUlOVF9PRkY7CisJbmFtZWVxID0gY2ttYWxsb2MobmFtZWxlbiArIHZhbGxlbiArIDIpOworCXAgPSBtZW1jcHkobmFtZWVxLCBuYW1lLCBuYW1lbGVuKSArIG5hbWVsZW47CisJaWYgKHZhbCkgeworCQkqcCsrID0gJz0nOworCQlwID0gbWVtY3B5KHAsIHZhbCwgdmFsbGVuKSArIHZhbGxlbjsKKwl9CisJKnAgPSAnXDAnOworCXNldHZhcmVxKG5hbWVlcSwgZmxhZ3MgfCBWTk9TQVZFKTsKKwlJTlRfT047Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQworc2V0dmFyMihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpCit7CisJc2V0dmFyKG5hbWUsIHZhbCwgMCk7Cit9CisKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKy8qCisgKiBTYWZlIHZlcnNpb24gb2Ygc2V0dmFyLCByZXR1cm5zIDEgb24gc3VjY2VzcyAwIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK3NldHZhcnNhZmUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsLCBpbnQgZmxhZ3MpCit7CisJaW50IGVycjsKKwl2b2xhdGlsZSBpbnQgc2F2ZWludDsKKwlzdHJ1Y3Qgam1wbG9jICp2b2xhdGlsZSBzYXZlaGFuZGxlciA9IGV4Y2VwdGlvbl9oYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCisJU0FWRV9JTlQoc2F2ZWludCk7CisJaWYgKHNldGptcChqbXBsb2MubG9jKSkKKwkJZXJyID0gMTsKKwllbHNlIHsKKwkJZXhjZXB0aW9uX2hhbmRsZXIgPSAmam1wbG9jOworCQlzZXR2YXIobmFtZSwgdmFsLCBmbGFncyk7CisJCWVyciA9IDA7CisJfQorCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJUkVTVE9SRV9JTlQoc2F2ZWludCk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKgorICogVW5zZXQgdGhlIHNwZWNpZmllZCB2YXJpYWJsZS4KKyAqLworc3RhdGljIGludAordW5zZXR2YXIoY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgdmFyICoqdnBwOworCXN0cnVjdCB2YXIgKnZwOworCWludCByZXR2YWw7CisKKwl2cHAgPSBmaW5kdmFyKGhhc2h2YXIocyksIHMpOworCXZwID0gKnZwcDsKKwlyZXR2YWwgPSAyOworCWlmICh2cCkgeworCQlpbnQgZmxhZ3MgPSB2cC0+ZmxhZ3M7CisKKwkJcmV0dmFsID0gMTsKKwkJaWYgKGZsYWdzICYgVlJFQURPTkxZKQorCQkJZ290byBvdXQ7CisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorCQl2cC0+ZmxhZ3MgJj0gflZEWU5BTUlDOworI2VuZGlmCisJCWlmIChmbGFncyAmIFZVTlNFVCkKKwkJCWdvdG8gb2s7CisJCWlmICgoZmxhZ3MgJiBWU1RSRklYRUQpID09IDApIHsKKwkJCUlOVF9PRkY7CisJCQlpZiAoKGZsYWdzICYgKFZURVhURklYRUR8VlNUQUNLKSkgPT0gMCkKKwkJCQlmcmVlKChjaGFyKil2cC0+dmFyX3RleHQpOworCQkJKnZwcCA9IHZwLT5uZXh0OworCQkJZnJlZSh2cCk7CisJCQlJTlRfT047CisJCX0gZWxzZSB7CisJCQlzZXR2YXIocywgMCwgMCk7CisJCQl2cC0+ZmxhZ3MgJj0gflZFWFBPUlQ7CisJCX0KKyBvazoKKwkJcmV0dmFsID0gMDsKKwl9Cisgb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbGlua2VkIGxpc3Qgb2YgdmFyaWFibGUgYXNzaWdubWVudHMuCisgKi8KK3N0YXRpYyB2b2lkCitsaXN0c2V0dmFyKHN0cnVjdCBzdHJsaXN0ICpsaXN0X3NldF92YXIsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqbHAgPSBsaXN0X3NldF92YXI7CisKKwlpZiAoIWxwKQorCQlyZXR1cm47CisJSU5UX09GRjsKKwlkbyB7CisJCXNldHZhcmVxKGxwLT50ZXh0LCBmbGFncyk7CisJCWxwID0gbHAtPm5leHQ7CisJfSB3aGlsZSAobHApOworCUlOVF9PTjsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgbGlzdCBvZiB2YXJpYWJsZXMgc2F0aXNmeWluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucy4KKyAqLworc3RhdGljIGNoYXIgKioKK2xpc3R2YXJzKGludCBvbiwgaW50IG9mZiwgY2hhciAqKiplbmQpCit7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKwljaGFyICoqZXA7CisJaW50IG1hc2s7CisKKwlTVEFSVFNUQUNLU1RSKGVwKTsKKwl2cHAgPSB2YXJ0YWI7CisJbWFzayA9IG9uIHwgb2ZmOworCWRvIHsKKwkJZm9yICh2cCA9ICp2cHA7IHZwOyB2cCA9IHZwLT5uZXh0KSB7CisJCQlpZiAoKHZwLT5mbGFncyAmIG1hc2spID09IG9uKSB7CisJCQkJaWYgKGVwID09IHN0YWNrc3RyZW5kKCkpCisJCQkJCWVwID0gZ3Jvd3N0YWNrc3RyKCk7CisJCQkJKmVwKysgPSAoY2hhciopdnAtPnZhcl90ZXh0OworCQkJfQorCQl9CisJfSB3aGlsZSAoKyt2cHAgPCB2YXJ0YWIgKyBWVEFCU0laRSk7CisJaWYgKGVwID09IHN0YWNrc3RyZW5kKCkpCisJCWVwID0gZ3Jvd3N0YWNrc3RyKCk7CisJaWYgKGVuZCkKKwkJKmVuZCA9IGVwOworCSplcCsrID0gTlVMTDsKKwlyZXR1cm4gZ3JhYnN0YWNrc3RyKGVwKTsKK30KKworCisvKiA9PT09PT09PT09PT0gUGF0aCBzZWFyY2ggaGVscGVyCisgKgorICogVGhlIHZhcmlhYmxlIHBhdGggKHBhc3NlZCBieSByZWZlcmVuY2UpIHNob3VsZCBiZSBzZXQgdG8gdGhlIHN0YXJ0CisgKiBvZiB0aGUgcGF0aCBiZWZvcmUgdGhlIGZpcnN0IGNhbGw7IHBhdGhfYWR2YW5jZSB3aWxsIHVwZGF0ZQorICogdGhpcyB2YWx1ZSBhcyBpdCBwcm9jZWVkcy4gIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gcGF0aF9hZHZhbmNlIHdpbGwgcmV0dXJuCisgKiB0aGUgcG9zc2libGUgcGF0aCBleHBhbnNpb25zIGluIHNlcXVlbmNlLiAgSWYgYW4gb3B0aW9uIChpbmRpY2F0ZWQgYnkKKyAqIGEgcGVyY2VudCBzaWduKSBhcHBlYXJzIGluIHRoZSBwYXRoIGVudHJ5IHRoZW4gdGhlIGdsb2JhbCB2YXJpYWJsZQorICogcGF0aG9wdCB3aWxsIGJlIHNldCB0byBwb2ludCB0byBpdDsgb3RoZXJ3aXNlIHBhdGhvcHQgd2lsbCBiZSBzZXQgdG8KKyAqIE5VTEwuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXRob3B0OyAgICAgLyogc2V0IGJ5IHBhdGhfYWR2YW5jZSAqLworCitzdGF0aWMgY2hhciAqCitwYXRoX2FkdmFuY2UoY29uc3QgY2hhciAqKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpxOworCWNvbnN0IGNoYXIgKnN0YXJ0OworCXNpemVfdCBsZW47CisKKwlpZiAoKnBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc3RhcnQgPSAqcGF0aDsKKwlmb3IgKHAgPSBzdGFydDsgKnAgJiYgKnAgIT0gJzonICYmICpwICE9ICclJzsgcCsrKQorCQljb250aW51ZTsKKwlsZW4gPSBwIC0gc3RhcnQgKyBzdHJsZW4obmFtZSkgKyAyOyAgICAgLyogIjIiIGlzIGZvciAnLycgYW5kICdcMCcgKi8KKwl3aGlsZSAoc3RhY2tibG9ja3NpemUoKSA8IGxlbikKKwkJZ3Jvd3N0YWNrYmxvY2soKTsKKwlxID0gc3RhY2tibG9jaygpOworCWlmIChwICE9IHN0YXJ0KSB7CisJCW1lbWNweShxLCBzdGFydCwgcCAtIHN0YXJ0KTsKKwkJcSArPSBwIC0gc3RhcnQ7CisJCSpxKysgPSAnLyc7CisJfQorCXN0cmNweShxLCBuYW1lKTsKKwlwYXRob3B0ID0gTlVMTDsKKwlpZiAoKnAgPT0gJyUnKSB7CisJCXBhdGhvcHQgPSArK3A7CisJCXdoaWxlICgqcCAmJiAqcCAhPSAnOicpCisJCQlwKys7CisJfQorCWlmICgqcCA9PSAnOicpCisJCSpwYXRoID0gcCArIDE7CisJZWxzZQorCQkqcGF0aCA9IE5VTEw7CisJcmV0dXJuIHN0YWxsb2MobGVuKTsKK30KKworCisvKiA9PT09PT09PT09PT0gUHJvbXB0ICovCisKK3N0YXRpYyBzbWFsbGludCBkb3Byb21wdDsgICAgICAgICAgICAgICAgICAgLyogaWYgc2V0LCBwcm9tcHQgdGhlIHVzZXIgKi8KK3N0YXRpYyBzbWFsbGludCBuZWVkcHJvbXB0OyAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBpbnRlcmFjdGl2ZSBhbmQgYXQgc3RhcnQgb2YgbGluZSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworc3RhdGljIGxpbmVfaW5wdXRfdCAqbGluZV9pbnB1dF9zdGF0ZTsKK3N0YXRpYyBjb25zdCBjaGFyICpjbWRlZGl0X3Byb21wdDsKK3N0YXRpYyB2b2lkCitwdXRwcm9tcHQoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoRU5BQkxFX0FTSF9FWFBBTkRfUFJNVCkgeworCQlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7CisJCWNtZGVkaXRfcHJvbXB0ID0gY2tzdHJkdXAocyk7CisJCXJldHVybjsKKwl9CisJY21kZWRpdF9wcm9tcHQgPSBzOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkCitwdXRwcm9tcHQoY29uc3QgY2hhciAqcykKK3sKKwlvdXQyc3RyKHMpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisvKiBleHBhbmRzdHIoKSBuZWVkcyBwYXJzaW5nIG1hY2hpbmVyeSwgc28gaXQgaXMgZmFyIGF3YXkgYWhlYWQuLi4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpleHBhbmRzdHIoY29uc3QgY2hhciAqcHMpOworI2Vsc2UKKyNkZWZpbmUgZXhwYW5kc3RyKHMpIHMKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc2V0cHJvbXB0X2lmKHNtYWxsaW50IGRvX3NldCwgaW50IHdoaWNocHJvbXB0KQoreworCWNvbnN0IGNoYXIgKnByb21wdDsKKwlJRl9BU0hfRVhQQU5EX1BSTVQoc3RydWN0IHN0YWNrbWFyayBzbWFyazspCisKKwlpZiAoIWRvX3NldCkKKwkJcmV0dXJuOworCisJbmVlZHByb21wdCA9IDA7CisKKwlzd2l0Y2ggKHdoaWNocHJvbXB0KSB7CisJY2FzZSAxOgorCQlwcm9tcHQgPSBwczF2YWwoKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcm9tcHQgPSBwczJ2YWwoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCisJCXByb21wdCA9IG51bGxzdHI7CisJfQorI2lmIEVOQUJMRV9BU0hfRVhQQU5EX1BSTVQKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlzdGFsbG9jKHN0YWNrYmxvY2tzaXplKCkpOworI2VuZGlmCisJcHV0cHJvbXB0KGV4cGFuZHN0cihwcm9tcHQpKTsKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisjZW5kaWYKK30KKworCisvKiA9PT09PT09PT09PT0gVGhlIGNkIGFuZCBwd2QgY29tbWFuZHMgKi8KKworI2RlZmluZSBDRF9QSFlTSUNBTCAxCisjZGVmaW5lIENEX1BSSU5UIDIKKworc3RhdGljIGludAorY2RvcHQodm9pZCkKK3sKKwlpbnQgZmxhZ3MgPSAwOworCWludCBpLCBqOworCisJaiA9ICdMJzsKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJMUCIpKSAhPSAnXDAnKSB7CisJCWlmIChpICE9IGopIHsKKwkJCWZsYWdzIF49IENEX1BIWVNJQ0FMOworCQkJaiA9IGk7CisJCX0KKwl9CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8qCisgKiBVcGRhdGUgY3VyZGlyICh0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkpIGluIHJlc3BvbnNlIHRvIGEKKyAqIGNkIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3VwZGF0ZXB3ZChjb25zdCBjaGFyICpkaXIpCit7CisJY2hhciAqbmV3OworCWNoYXIgKnA7CisJY2hhciAqY2Rjb21wcGF0aDsKKwljb25zdCBjaGFyICpsaW07CisKKwljZGNvbXBwYXRoID0gc3RzdHJkdXAoZGlyKTsKKwlTVEFSVFNUQUNLU1RSKG5ldyk7CisJaWYgKCpkaXIgIT0gJy8nKSB7CisJCWlmIChjdXJkaXIgPT0gbnVsbHN0cikKKwkJCXJldHVybiAwOworCQluZXcgPSBzdGFja19wdXRzdHIoY3VyZGlyLCBuZXcpOworCX0KKwluZXcgPSBtYWtlc3Ryc3BhY2Uoc3RybGVuKGRpcikgKyAyLCBuZXcpOworCWxpbSA9IChjaGFyICopc3RhY2tibG9jaygpICsgMTsKKwlpZiAoKmRpciAhPSAnLycpIHsKKwkJaWYgKG5ld1stMV0gIT0gJy8nKQorCQkJVVNUUFVUQygnLycsIG5ldyk7CisJCWlmIChuZXcgPiBsaW0gJiYgKmxpbSA9PSAnLycpCisJCQlsaW0rKzsKKwl9IGVsc2UgeworCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJY2Rjb21wcGF0aCsrOworCQlpZiAoZGlyWzFdID09ICcvJyAmJiBkaXJbMl0gIT0gJy8nKSB7CisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJCWNkY29tcHBhdGgrKzsKKwkJCWxpbSsrOworCQl9CisJfQorCXAgPSBzdHJ0b2soY2Rjb21wcGF0aCwgIi8iKTsKKwl3aGlsZSAocCkgeworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgJy4nOgorCQkJaWYgKHBbMV0gPT0gJy4nICYmIHBbMl0gPT0gJ1wwJykgeworCQkJCXdoaWxlIChuZXcgPiBsaW0pIHsKKwkJCQkJU1RVTlBVVEMobmV3KTsKKwkJCQkJaWYgKG5ld1stMV0gPT0gJy8nKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBbMV0gPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJbmV3ID0gc3RhY2tfcHV0c3RyKHAsIG5ldyk7CisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJfQorCQlwID0gc3RydG9rKDAsICIvIik7CisJfQorCWlmIChuZXcgPiBsaW0pCisJCVNUVU5QVVRDKG5ldyk7CisJKm5ldyA9IDA7CisJcmV0dXJuIHN0YWNrYmxvY2soKTsKK30KKworLyoKKyAqIEZpbmQgb3V0IHdoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzLiBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIGN1cnJlbnQKKyAqIGRpcmVjdG9yeSwgdGhpcyByb3V0aW5lIHJldHVybnMgaW1tZWRpYXRlbHkuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldHB3ZCh2b2lkKQoreworCWNoYXIgKmRpciA9IGdldGN3ZChOVUxMLCAwKTsgLyogaHVoLCB1c2luZyBnbGliYyBleHRlbnNpb24/ICovCisJcmV0dXJuIGRpciA/IGRpciA6IG51bGxzdHI7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRwd2QoY29uc3QgY2hhciAqdmFsLCBpbnQgc2V0b2xkKQoreworCWNoYXIgKm9sZGN1ciwgKmRpcjsKKworCW9sZGN1ciA9IGRpciA9IGN1cmRpcjsKKworCWlmIChzZXRvbGQpIHsKKwkJc2V0dmFyKCJPTERQV0QiLCBvbGRjdXIsIFZFWFBPUlQpOworCX0KKwlJTlRfT0ZGOworCWlmIChwaHlzZGlyICE9IG51bGxzdHIpIHsKKwkJaWYgKHBoeXNkaXIgIT0gb2xkY3VyKQorCQkJZnJlZShwaHlzZGlyKTsKKwkJcGh5c2RpciA9IG51bGxzdHI7CisJfQorCWlmIChvbGRjdXIgPT0gdmFsIHx8ICF2YWwpIHsKKwkJY2hhciAqcyA9IGdldHB3ZCgpOworCQlwaHlzZGlyID0gczsKKwkJaWYgKCF2YWwpCisJCQlkaXIgPSBzOworCX0gZWxzZQorCQlkaXIgPSBja3N0cmR1cCh2YWwpOworCWlmIChvbGRjdXIgIT0gZGlyICYmIG9sZGN1ciAhPSBudWxsc3RyKSB7CisJCWZyZWUob2xkY3VyKTsKKwl9CisJY3VyZGlyID0gZGlyOworCUlOVF9PTjsKKwlzZXR2YXIoIlBXRCIsIGRpciwgVkVYUE9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhc2hjZCh2b2lkKTsKKworLyoKKyAqIEFjdHVhbGx5IGRvIHRoZSBjaGRpci4gIFdlIGFsc28gY2FsbCBoYXNoY2QgdG8gbGV0IHRoZSByb3V0aW5lcyBpbiBleGVjLmMKKyAqIGtub3cgdGhhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQKK2RvY2QoY29uc3QgY2hhciAqZGVzdCwgaW50IGZsYWdzKQoreworCWNvbnN0IGNoYXIgKmRpciA9IE5VTEw7CisJaW50IGVycjsKKworCVRSQUNFKCgiZG9jZChcIiVzXCIsICVkKSBjYWxsZWRcbiIsIGRlc3QsIGZsYWdzKSk7CisKKwlJTlRfT0ZGOworCWlmICghKGZsYWdzICYgQ0RfUEhZU0lDQUwpKSB7CisJCWRpciA9IHVwZGF0ZXB3ZChkZXN0KTsKKwkJaWYgKGRpcikKKwkJCWRlc3QgPSBkaXI7CisJfQorCWVyciA9IGNoZGlyKGRlc3QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXNldHB3ZChkaXIsIDEpOworCWhhc2hjZCgpOworIG91dDoKKwlJTlRfT047CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2NkY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNvbnN0IGNoYXIgKmRlc3Q7CisJY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKwlpbnQgZmxhZ3M7CisKKwlmbGFncyA9IGNkb3B0KCk7CisJZGVzdCA9ICphcmdwdHI7CisJaWYgKCFkZXN0KQorCQlkZXN0ID0gYmx0aW5sb29rdXAoIkhPTUUiKTsKKwllbHNlIGlmIChMT05FX0RBU0goZGVzdCkpIHsKKwkJZGVzdCA9IGJsdGlubG9va3VwKCJPTERQV0QiKTsKKwkJZmxhZ3MgfD0gQ0RfUFJJTlQ7CisJfQorCWlmICghZGVzdCkKKwkJZGVzdCA9IG51bGxzdHI7CisJaWYgKCpkZXN0ID09ICcvJykKKwkJZ290byBzdGVwNzsKKwlpZiAoKmRlc3QgPT0gJy4nKSB7CisJCWMgPSBkZXN0WzFdOworIGRvdGRvdDoKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1wwJzoKKwkJY2FzZSAnLyc6CisJCQlnb3RvIHN0ZXA2OworCQljYXNlICcuJzoKKwkJCWMgPSBkZXN0WzJdOworCQkJaWYgKGMgIT0gJy4nKQorCQkJCWdvdG8gZG90ZG90OworCQl9CisJfQorCWlmICghKmRlc3QpCisJCWRlc3QgPSAiLiI7CisJcGF0aCA9IGJsdGlubG9va3VwKCJDRFBBVEgiKTsKKwlpZiAoIXBhdGgpIHsKKyBzdGVwNjoKKyBzdGVwNzoKKwkJcCA9IGRlc3Q7CisJCWdvdG8gZG9jZDsKKwl9CisJZG8geworCQljID0gKnBhdGg7CisJCXAgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGRlc3QpOworCQlpZiAoc3RhdChwLCAmc3RhdGIpID49IDAgJiYgU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkgeworCQkJaWYgKGMgJiYgYyAhPSAnOicpCisJCQkJZmxhZ3MgfD0gQ0RfUFJJTlQ7CisgZG9jZDoKKwkJCWlmICghZG9jZChwLCBmbGFncykpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHBhdGgpOworCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJjYW4ndCBjZCB0byAlcyIsIGRlc3QpOworCS8qIE5PVFJFQUNIRUQgKi8KKyBvdXQ6CisJaWYgKGZsYWdzICYgQ0RfUFJJTlQpCisJCW91dDFmbXQoIiVzXG4iLCBjdXJkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworcHdkY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWludCBmbGFnczsKKwljb25zdCBjaGFyICpkaXIgPSBjdXJkaXI7CisKKwlmbGFncyA9IGNkb3B0KCk7CisJaWYgKGZsYWdzKSB7CisJCWlmIChwaHlzZGlyID09IG51bGxzdHIpCisJCQlzZXRwd2QoZGlyLCAwKTsKKwkJZGlyID0gcGh5c2RpcjsKKwl9CisJb3V0MWZtdCgiJXNcbiIsIGRpcik7CisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09IC4uLiAqLworCisKKyNkZWZpbmUgSUJVRlNJWiAoRU5BQkxFX0ZFQVRVUkVfRURJVElORyA/IENPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTiA6IDEwMjQpCisKKy8qIFN5bnRheCBjbGFzc2VzICovCisjZGVmaW5lIENXT1JEICAgICAwICAgICAgICAgICAgIC8qIGNoYXJhY3RlciBpcyBub3RoaW5nIHNwZWNpYWwgKi8KKyNkZWZpbmUgQ05MICAgICAgIDEgICAgICAgICAgICAgLyogbmV3bGluZSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ0JBQ0sgICAgIDIgICAgICAgICAgICAgLyogYSBiYWNrc2xhc2ggY2hhcmFjdGVyICovCisjZGVmaW5lIENTUVVPVEUgICAzICAgICAgICAgICAgIC8qIHNpbmdsZSBxdW90ZSAqLworI2RlZmluZSBDRFFVT1RFICAgNCAgICAgICAgICAgICAvKiBkb3VibGUgcXVvdGUgKi8KKyNkZWZpbmUgQ0VORFFVT1RFIDUgICAgICAgICAgICAgLyogYSB0ZXJtaW5hdGluZyBxdW90ZSAqLworI2RlZmluZSBDQlFVT1RFICAgNiAgICAgICAgICAgICAvKiBiYWNrd2FyZHMgc2luZ2xlIHF1b3RlICovCisjZGVmaW5lIENWQVIgICAgICA3ICAgICAgICAgICAgIC8qIGEgZG9sbGFyIHNpZ24gKi8KKyNkZWZpbmUgQ0VORFZBUiAgIDggICAgICAgICAgICAgLyogYSAnfScgY2hhcmFjdGVyICovCisjZGVmaW5lIENMUCAgICAgICA5ICAgICAgICAgICAgIC8qIGEgbGVmdCBwYXJlbiBpbiBhcml0aG1ldGljICovCisjZGVmaW5lIENSUCAgICAgIDEwICAgICAgICAgICAgIC8qIGEgcmlnaHQgcGFyZW4gaW4gYXJpdGhtZXRpYyAqLworI2RlZmluZSBDRU5ERklMRSAxMSAgICAgICAgICAgICAvKiBlbmQgb2YgZmlsZSAqLworI2RlZmluZSBDQ1RMICAgICAxMiAgICAgICAgICAgICAvKiBsaWtlIENXT1JELCBleGNlcHQgaXQgbXVzdCBiZSBlc2NhcGVkICovCisjZGVmaW5lIENTUENMICAgIDEzICAgICAgICAgICAgIC8qIHRoZXNlIHRlcm1pbmF0ZSBhIHdvcmQgKi8KKyNkZWZpbmUgQ0lHTiAgICAgMTQgICAgICAgICAgICAgLyogY2hhcmFjdGVyIHNob3VsZCBiZSBpZ25vcmVkICovCisKKyNkZWZpbmUgUEVPRiAgICAgMjU2CisjaWYgRU5BQkxFX0FTSF9BTElBUworIyBkZWZpbmUgUEVPQSAgICAyNTcKKyNlbmRpZgorCisjZGVmaW5lIFVTRV9TSVRfRlVOQ1RJT04gRU5BQkxFX0FTSF9PUFRJTUlaRV9GT1JfU0laRQorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorIyBkZWZpbmUgU0lUX0lURU0oYSxiLGMsZCkgKGEgfCAoYiA8PCA0KSB8IChjIDw8IDgpIHwgKGQgPDwgMTIpKQorI2Vsc2UKKyMgZGVmaW5lIFNJVF9JVEVNKGEsYixjLGQpIChhIHwgKGIgPDwgNCkgfCAoYyA8PCA4KSkKKyNlbmRpZgorc3RhdGljIGNvbnN0IHVpbnQxNl90IFNfSV9UW10gPSB7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCVNJVF9JVEVNKENTUENMICAgLCBDSUdOICAgICAsIENJR04gLCBDSUdOICAgKSwgICAgLyogMCwgUEVPQSAqLworI2VuZGlmCisJU0lUX0lURU0oQ1NQQ0wgICAsIENXT1JEICAgICwgQ1dPUkQsIENXT1JEICApLCAgICAvKiAxLCAnICcgKi8KKwlTSVRfSVRFTShDTkwgICAgICwgQ05MICAgICAgLCBDTkwgICwgQ05MICAgICksICAgIC8qIDIsIFxuICovCisJU0lUX0lURU0oQ1dPUkQgICAsIENDVEwgICAgICwgQ0NUTCAsIENXT1JEICApLCAgICAvKiAzLCAhKi0vOj0/W11+ICovCisJU0lUX0lURU0oQ0RRVU9URSAsIENFTkRRVU9URSwgQ1dPUkQsIENXT1JEICApLCAgICAvKiA0LCAnIicgKi8KKwlTSVRfSVRFTShDVkFSICAgICwgQ1ZBUiAgICAgLCBDV09SRCwgQ1ZBUiAgICksICAgIC8qIDUsICQgKi8KKwlTSVRfSVRFTShDU1FVT1RFICwgQ1dPUkQgICAgLCBDRU5EUVVPVEUsIENXT1JEKSwgIC8qIDYsICInIiAqLworCVNJVF9JVEVNKENTUENMICAgLCBDV09SRCAgICAsIENXT1JELCBDTFAgICAgKSwgICAgLyogNywgKCAqLworCVNJVF9JVEVNKENTUENMICAgLCBDV09SRCAgICAsIENXT1JELCBDUlAgICAgKSwgICAgLyogOCwgKSAqLworCVNJVF9JVEVNKENCQUNLICAgLCBDQkFDSyAgICAsIENDVEwgLCBDQkFDSyAgKSwgICAgLyogOSwgXCAqLworCVNJVF9JVEVNKENCUVVPVEUgLCBDQlFVT1RFICAsIENXT1JELCBDQlFVT1RFKSwgICAgLyogMTAsIGAgKi8KKwlTSVRfSVRFTShDRU5EVkFSICwgQ0VORFZBUiAgLCBDV09SRCwgQ0VORFZBUiksICAgIC8qIDExLCB9ICovCisjaWYgIVVTRV9TSVRfRlVOQ1RJT04KKwlTSVRfSVRFTShDRU5ERklMRSwgQ0VOREZJTEUgLCBDRU5ERklMRSwgQ0VOREZJTEUpLC8qIDEyLCBQRU9GICovCisJU0lUX0lURU0oQ1dPUkQgICAsIENXT1JEICAgICwgQ1dPUkQsIENXT1JEICApLCAgICAvKiAxMywgMC05QS1aYS16ICovCisJU0lUX0lURU0oQ0NUTCAgICAsIENDVEwgICAgICwgQ0NUTCAsIENDVEwgICApICAgICAvKiAxNCwgQ1RMRVNDIC4uLiAqLworI2VuZGlmCisjdW5kZWYgU0lUX0lURU0KK307CisvKiBDb25zdGFudHMgYmVsb3cgbXVzdCBtYXRjaCB0YWJsZSBhYm92ZSAqLworZW51bSB7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCUNTUENMX0NJR05fQ0lHTl9DSUdOICAgICAgICAgICAgICAgLCAvKiAgMCAqLworI2VuZGlmCisJQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1dPUkQgICAgICAgICAgICAsIC8qICAxICovCisJQ05MX0NOTF9DTkxfQ05MICAgICAgICAgICAgICAgICAgICAsIC8qICAyICovCisJQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JEICAgICAgICAgICAgICAsIC8qICAzICovCisJQ0RRVU9URV9DRU5EUVVPVEVfQ1dPUkRfQ1dPUkQgICAgICAsIC8qICA0ICovCisJQ1ZBUl9DVkFSX0NXT1JEX0NWQVIgICAgICAgICAgICAgICAsIC8qICA1ICovCisJQ1NRVU9URV9DV09SRF9DRU5EUVVPVEVfQ1dPUkQgICAgICAsIC8qICA2ICovCisJQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ0xQICAgICAgICAgICAgICAsIC8qICA3ICovCisJQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1JQICAgICAgICAgICAgICAsIC8qICA4ICovCisJQ0JBQ0tfQ0JBQ0tfQ0NUTF9DQkFDSyAgICAgICAgICAgICAsIC8qICA5ICovCisJQ0JRVU9URV9DQlFVT1RFX0NXT1JEX0NCUVVPVEUgICAgICAsIC8qIDEwICovCisJQ0VORFZBUl9DRU5EVkFSX0NXT1JEX0NFTkRWQVIgICAgICAsIC8qIDExICovCisJQ0VOREZJTEVfQ0VOREZJTEVfQ0VOREZJTEVfQ0VOREZJTEUsIC8qIDEyICovCisJQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQgICAgICAgICAgICAsIC8qIDEzICovCisJQ0NUTF9DQ1RMX0NDVExfQ0NUTCAgICAgICAgICAgICAgICAsIC8qIDE0ICovCit9OworCisvKiBjIGluIFNJVChjLCBzeW50YXgpIG11c3QgYmUgYW4gKnVuc2lnbmVkIGNoYXIqIG9yIFBFT0Egb3IgUEVPRiwKKyAqIGNhbGxlciBtdXN0IGVuc3VyZSBwcm9wZXIgY2FzdCBvbiBpdCBpZiBjIGlzICpjaGFyX3B0ciEKKyAqLworLyogVmFsdWVzIGZvciBzeW50YXggcGFyYW0gKi8KKyNkZWZpbmUgQkFTRVNZTlRBWCAwICAgIC8qIG5vdCBpbiBxdW90ZXMgKi8KKyNkZWZpbmUgRFFTWU5UQVggICAxICAgIC8qIGluIGRvdWJsZSBxdW90ZXMgKi8KKyNkZWZpbmUgU1FTWU5UQVggICAyICAgIC8qIGluIHNpbmdsZSBxdW90ZXMgKi8KKyNkZWZpbmUgQVJJU1lOVEFYICAzICAgIC8qIGluIGFyaXRobWV0aWMgKi8KKyNkZWZpbmUgUFNTWU5UQVggICA0ICAgIC8qIHByb21wdC4gbmV2ZXIgcGFzc2VkIHRvIFNJVCgpICovCisKKyNpZiBVU0VfU0lUX0ZVTkNUSU9OCisKK3N0YXRpYyBpbnQKK1NJVChpbnQgYywgaW50IHN5bnRheCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzcGVjX3N5bWJsc1tdIEFMSUdOMSA9ICJcdFxuICFcIiQmJygpKi0vOjs8PT4/W1xcXWB8fX4iOworIyBpZiBFTkFCTEVfQVNIX0FMSUFTCisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3ludGF4X2luZGV4X3RhYmxlW10gQUxJR04xID0geworCQkxLCAyLCAxLCAzLCA0LCA1LCAxLCA2LCAgICAgICAgIC8qICJcdFxuICFcIiQmJyIgKi8KKwkJNywgOCwgMywgMywgMywgMywgMSwgMSwgICAgICAgICAvKiAiKCkqLS86OzwiICovCisJCTMsIDEsIDMsIDMsIDksIDMsIDEwLCAxLCAgICAgICAgLyogIj0+P1tcXF1gfCIgKi8KKwkJMTEsIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAifX4iICovCisJfTsKKyMgZWxzZQorCXN0YXRpYyBjb25zdCB1aW50OF90IHN5bnRheF9pbmRleF90YWJsZVtdIEFMSUdOMSA9IHsKKwkJMCwgMSwgMCwgMiwgMywgNCwgMCwgNSwgICAgICAgICAvKiAiXHRcbiAhXCIkJiciICovCisJCTYsIDcsIDIsIDIsIDIsIDIsIDAsIDAsICAgICAgICAgLyogIigpKi0vOjs8IiAqLworCQkyLCAwLCAyLCAyLCA4LCAyLCA5LCAwLCAgICAgICAgIC8qICI9Pj9bXFxdYHwiICovCisJCTEwLCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIn1+IiAqLworCX07CisjIGVuZGlmCisJY29uc3QgY2hhciAqczsKKwlpbnQgaW5keDsKKworCWlmIChjID09IFBFT0YpCisJCXJldHVybiBDRU5ERklMRTsKKyMgaWYgRU5BQkxFX0FTSF9BTElBUworCWlmIChjID09IFBFT0EpCisJCWluZHggPSAwOworCWVsc2UKKyMgZW5kaWYKKwl7CisJCS8qIENhc3QgaXMgcHVyZWx5IGZvciBwYXJhbm9pYSBoZXJlLAorCQkgKiBqdXN0IGluIGNhc2Ugc29tZW9uZSBwYXNzZWQgc2lnbmVkIGNoYXIgdG8gdXMgKi8KKwkJaWYgKCh1bnNpZ25lZCBjaGFyKWMgPj0gQ1RMX0ZJUlNUCisJCSAmJiAodW5zaWduZWQgY2hhciljIDw9IENUTF9MQVNUCisJCSkgeworCQkJcmV0dXJuIENDVEw7CisJCX0KKwkJcyA9IHN0cmNocm51bChzcGVjX3N5bWJscywgYyk7CisJCWlmICgqcyA9PSAnXDAnKQorCQkJcmV0dXJuIENXT1JEOworCQlpbmR4ID0gc3ludGF4X2luZGV4X3RhYmxlW3MgLSBzcGVjX3N5bWJsc107CisJfQorCXJldHVybiAoU19JX1RbaW5keF0gPj4gKHN5bnRheCo0KSkgJiAweGY7Cit9CisKKyNlbHNlICAgLyogIVVTRV9TSVRfRlVOQ1RJT04gKi8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3ludGF4X2luZGV4X3RhYmxlW10gPSB7CisJLyogQkFTRVNZTlRBWF9EUVNZTlRBWF9TUVNZTlRBWF9BUklTWU5UQVggKi8KKwkvKiAgIDAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDkgIlx0IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgMTAgIlxuIiAqLyBDTkxfQ05MX0NOTF9DTkwsCisJLyogIDExICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDEyICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDEzICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE0ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE1ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE2ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE3ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE4ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE5ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIwICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIxICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIyICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIzICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI0ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI1ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI2ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI3ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI4ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI5ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMwICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMxICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMyICAiICIgKi8gQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMzICAiISIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICAzNCAgIiIiICovIENEUVVPVEVfQ0VORFFVT1RFX0NXT1JEX0NXT1JELAorCS8qICAzNSAgIiMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzNiAgIiQiICovIENWQVJfQ1ZBUl9DV09SRF9DVkFSLAorCS8qICAzNyAgIiUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzOCAgIiYiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzOSAgIiciICovIENTUVVPVEVfQ1dPUkRfQ0VORFFVT1RFX0NXT1JELAorCS8qICA0MCAgIigiICovIENTUENMX0NXT1JEX0NXT1JEX0NMUCwKKwkvKiAgNDEgICIpIiAqLyBDU1BDTF9DV09SRF9DV09SRF9DUlAsCisJLyogIDQyICAiKiIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA0MyAgIisiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA0NCAgIiwiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA0NSAgIi0iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgNDYgICIuIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNDcgICIvIiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogIDQ4ICAiMCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDQ5ICAiMSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUwICAiMiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUxICAiMyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUyICAiNCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUzICAiNSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU0ICAiNiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU1ICAiNyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU2ICAiOCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU3ICAiOSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU4ICAiOiIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA1OSAgIjsiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2MCAgIjwiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2MSAgIj0iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgNjIgICI+IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNjMgICI/IiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogIDY0ICAiQCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY1ICAiQSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY2ICAiQiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY3ICAiQyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY4ICAiRCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY5ICAiRSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDcwICAiRiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDcxICAiRyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDcyICAiSCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDczICAiSSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc0ICAiSiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc1ICAiSyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc2ICAiTCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc3ICAiTSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc4ICAiTiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc5ICAiTyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgwICAiUCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgxICAiUSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgyICAiUiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgzICAiUyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg0ICAiVCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg1ICAiVSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg2ICAiViIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg3ICAiVyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg4ICAiWCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg5ICAiWSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDkwICAiWiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDkxICAiWyIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA5MiAgIlwiICovIENCQUNLX0NCQUNLX0NDVExfQ0JBQ0ssCisJLyogIDkzICAiXSIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA5NCAgIl4iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5NSAgIl8iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5NiAgImAiICovIENCUVVPVEVfQ0JRVU9URV9DV09SRF9DQlFVT1RFLAorCS8qICA5NyAgImEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5OCAgImIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5OSAgImMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMCAgImQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMSAgImUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMiAgImYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMyAgImciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNCAgImgiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNSAgImkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNiAgImoiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNyAgImsiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwOCAgImwiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwOSAgIm0iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMCAgIm4iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMSAgIm8iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMiAgInAiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMyAgInEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNCAgInIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNSAgInMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNiAgInQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNyAgInUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExOCAgInYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExOSAgInciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMCAgIngiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMSAgInkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMiAgInoiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMyAgInsiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyNCAgInwiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyNSAgIn0iICovIENFTkRWQVJfQ0VORFZBUl9DV09SRF9DRU5EVkFSLAorCS8qIDEyNiAgIn4iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAxMjcgIGRlbCAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjggMHg4MCAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjkgQ1RMRVNDICAgICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTMwIENUTFZBUiAgICAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzMSBDVExFTkRWQVIgICAgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzIgQ1RMQkFDS1EgICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTMzIENUTFFVT1RFICAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzNCBDVExBUkkgICAgICAgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzUgQ1RMRU5EQVJJICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTM2IENUTFFVT1RFTUFSSyAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEzOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEzOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIFBFT0YgKi8gICAgIENFTkRGSUxFX0NFTkRGSUxFX0NFTkRGSUxFX0NFTkRGSUxFLAorIyBpZiBFTkFCTEVfQVNIX0FMSUFTCisJLyogUEVPQSAqLyAgICAgQ1NQQ0xfQ0lHTl9DSUdOX0NJR04sCisjIGVuZGlmCit9OworCisjIGRlZmluZSBTSVQoYywgc3ludGF4KSAoKFNfSV9UW3N5bnRheF9pbmRleF90YWJsZVtjXV0gPj4gKChzeW50YXgpKjQpKSAmIDB4ZikKKworI2VuZGlmICAvKiAhVVNFX1NJVF9GVU5DVElPTiAqLworCisKKy8qID09PT09PT09PT09PSBBbGlhcyBoYW5kbGluZyAqLworCisjaWYgRU5BQkxFX0FTSF9BTElBUworCisjZGVmaW5lIEFMSUFTSU5VU0UgMQorI2RlZmluZSBBTElBU0RFQUQgIDIKKworc3RydWN0IGFsaWFzIHsKKwlzdHJ1Y3QgYWxpYXMgKm5leHQ7CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWw7CisJaW50IGZsYWc7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWxpYXMgKiphdGFiOyAvLyBbQVRBQlNJWkVdOworI2RlZmluZSBJTklUX0dfYWxpYXMoKSBkbyB7IFwKKwlhdGFiID0geHphbGxvYyhBVEFCU0laRSAqIHNpemVvZihhdGFiWzBdKSk7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIHN0cnVjdCBhbGlhcyAqKgorX19sb29rdXBhbGlhcyhjb25zdCBjaGFyICpuYW1lKSB7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJc3RydWN0IGFsaWFzICoqYXBwOworCWNvbnN0IGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGNoOworCisJcCA9IG5hbWU7CisKKwljaCA9ICh1bnNpZ25lZCBjaGFyKSpwOworCWhhc2h2YWwgPSBjaCA8PCA0OworCXdoaWxlIChjaCkgeworCQloYXNodmFsICs9IGNoOworCQljaCA9ICh1bnNpZ25lZCBjaGFyKSorK3A7CisJfQorCWFwcCA9ICZhdGFiW2hhc2h2YWwgJSBBVEFCU0laRV07CisKKwlmb3IgKDsgKmFwcDsgYXBwID0gJigqYXBwKS0+bmV4dCkgeworCQlpZiAoc3RyY21wKG5hbWUsICgqYXBwKS0+bmFtZSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gYXBwOworfQorCitzdGF0aWMgc3RydWN0IGFsaWFzICoKK2xvb2t1cGFsaWFzKGNvbnN0IGNoYXIgKm5hbWUsIGludCBjaGVjaykKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwID0gKl9fbG9va3VwYWxpYXMobmFtZSk7CisKKwlpZiAoY2hlY2sgJiYgYXAgJiYgKGFwLT5mbGFnICYgQUxJQVNJTlVTRSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBhcDsKK30KKworc3RhdGljIHN0cnVjdCBhbGlhcyAqCitmcmVlYWxpYXMoc3RydWN0IGFsaWFzICphcCkKK3sKKwlzdHJ1Y3QgYWxpYXMgKm5leHQ7CisKKwlpZiAoYXAtPmZsYWcgJiBBTElBU0lOVVNFKSB7CisJCWFwLT5mbGFnIHw9IEFMSUFTREVBRDsKKwkJcmV0dXJuIGFwOworCX0KKworCW5leHQgPSBhcC0+bmV4dDsKKwlmcmVlKGFwLT5uYW1lKTsKKwlmcmVlKGFwLT52YWwpOworCWZyZWUoYXApOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgdm9pZAorc2V0YWxpYXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKQoreworCXN0cnVjdCBhbGlhcyAqYXAsICoqYXBwOworCisJYXBwID0gX19sb29rdXBhbGlhcyhuYW1lKTsKKwlhcCA9ICphcHA7CisJSU5UX09GRjsKKwlpZiAoYXApIHsKKwkJaWYgKCEoYXAtPmZsYWcgJiBBTElBU0lOVVNFKSkgeworCQkJZnJlZShhcC0+dmFsKTsKKwkJfQorCQlhcC0+dmFsID0gY2tzdHJkdXAodmFsKTsKKwkJYXAtPmZsYWcgJj0gfkFMSUFTREVBRDsKKwl9IGVsc2UgeworCQkvKiBub3QgZm91bmQgKi8KKwkJYXAgPSBja3phbGxvYyhzaXplb2Yoc3RydWN0IGFsaWFzKSk7CisJCWFwLT5uYW1lID0gY2tzdHJkdXAobmFtZSk7CisJCWFwLT52YWwgPSBja3N0cmR1cCh2YWwpOworCQkvKmFwLT5mbGFnID0gMDsgLSBja3phbGxvYyBkaWQgaXQgKi8KKwkJLyphcC0+bmV4dCA9IE5VTEw7Ki8KKwkJKmFwcCA9IGFwOworCX0KKwlJTlRfT047Cit9CisKK3N0YXRpYyBpbnQKK3VuYWxpYXMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYWxpYXMgKiphcHA7CisKKwlhcHAgPSBfX2xvb2t1cGFsaWFzKG5hbWUpOworCisJaWYgKCphcHApIHsKKwkJSU5UX09GRjsKKwkJKmFwcCA9IGZyZWVhbGlhcygqYXBwKTsKKwkJSU5UX09OOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3JtYWxpYXNlcyh2b2lkKQoreworCXN0cnVjdCBhbGlhcyAqYXAsICoqYXBwOworCWludCBpOworCisJSU5UX09GRjsKKwlmb3IgKGkgPSAwOyBpIDwgQVRBQlNJWkU7IGkrKykgeworCQlhcHAgPSAmYXRhYltpXTsKKwkJZm9yIChhcCA9ICphcHA7IGFwOyBhcCA9ICphcHApIHsKKwkJCSphcHAgPSBmcmVlYWxpYXMoKmFwcCk7CisJCQlpZiAoYXAgPT0gKmFwcCkgeworCQkJCWFwcCA9ICZhcC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKwlJTlRfT047Cit9CisKK3N0YXRpYyB2b2lkCitwcmludGFsaWFzKGNvbnN0IHN0cnVjdCBhbGlhcyAqYXApCit7CisJb3V0MWZtdCgiJXM9JXNcbiIsIGFwLT5uYW1lLCBzaW5nbGVfcXVvdGUoYXAtPnZhbCkpOworfQorCisvKgorICogVE9ETyAtIHNvcnQgb3V0cHV0CisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCithbGlhc2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm4sICp2OworCWludCByZXQgPSAwOworCXN0cnVjdCBhbGlhcyAqYXA7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFUQUJTSVpFOyBpKyspIHsKKwkJCWZvciAoYXAgPSBhdGFiW2ldOyBhcDsgYXAgPSBhcC0+bmV4dCkgeworCQkJCXByaW50YWxpYXMoYXApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwl3aGlsZSAoKG4gPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCXYgPSBzdHJjaHIobisxLCAnPScpOworCQlpZiAodiA9PSBOVUxMKSB7IC8qIG4rMTogZnVubnkga3NoIHN0dWZmICovCisJCQlhcCA9ICpfX2xvb2t1cGFsaWFzKG4pOworCQkJaWYgKGFwID09IE5VTEwpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBub3QgZm91bmRcbiIsICJhbGlhcyIsIG4pOworCQkJCXJldCA9IDE7CisJCQl9IGVsc2UKKwkJCQlwcmludGFsaWFzKGFwKTsKKwkJfSBlbHNlIHsKKwkJCSp2KysgPSAnXDAnOworCQkJc2V0YWxpYXMobiwgdik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQwordW5hbGlhc2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgaTsKKworCXdoaWxlICgoaSA9IG5leHRvcHQoImEiKSkgIT0gJ1wwJykgeworCQlpZiAoaSA9PSAnYScpIHsKKwkJCXJtYWxpYXNlcygpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZm9yIChpID0gMDsgKmFyZ3B0cjsgYXJncHRyKyspIHsKKwkJaWYgKHVuYWxpYXMoKmFyZ3B0cikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIG5vdCBmb3VuZFxuIiwgInVuYWxpYXMiLCAqYXJncHRyKTsKKwkJCWkgPSAxOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisKKyNlbmRpZiAvKiBBU0hfQUxJQVMgKi8KKworCisvKiA9PT09PT09PT09PT0gam9icy5jICovCisKKy8qIE1vZGUgYXJndW1lbnQgdG8gZm9ya3NoZWxsLiAgRG9uJ3QgY2hhbmdlIEZPUktfRkcgb3IgRk9SS19CRy4gKi8KKyNkZWZpbmUgRk9SS19GRyAgICAwCisjZGVmaW5lIEZPUktfQkcgICAgMQorI2RlZmluZSBGT1JLX05PSk9CIDIKKworLyogbW9kZSBmbGFncyBmb3Igc2hvd2pvYihzKSAqLworI2RlZmluZSBTSE9XX09OTFlfUEdJRCAgMHgwMSAgICAvKiBzaG93IG9ubHkgcGdpZCAoam9icyAtcCkgKi8KKyNkZWZpbmUgU0hPV19QSURTICAgICAgIDB4MDIgICAgLyogc2hvdyBpbmRpdmlkdWFsIHBpZHMsIG5vdCBqdXN0IG9uZSBsaW5lIHBlciBqb2IgKi8KKyNkZWZpbmUgU0hPV19DSEFOR0VEICAgIDB4MDQgICAgLyogb25seSBqb2JzIHdob3NlIHN0YXRlIGhhcyBjaGFuZ2VkICovCisKKy8qCisgKiBBIGpvYiBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBqb2IuICBBIGpvYiBpcyBlaXRoZXIgYQorICogc2luZ2xlIHByb2Nlc3Mgb3IgYSBzZXQgb2YgcHJvY2Vzc2VzIGNvbnRhaW5lZCBpbiBhIHBpcGVsaW5lLiAgSW4gdGhlCisgKiBsYXR0ZXIgY2FzZSwgcGlkbGlzdCB3aWxsIGJlIG5vbi1OVUxMLCBhbmQgd2lsbCBwb2ludCB0byBhIC0xIHRlcm1pbmF0ZWQKKyAqIGFycmF5IG9mIHBpZHMuCisgKi8KK3N0cnVjdCBwcm9jc3RhdCB7CisJcGlkX3QgICBwc19waWQ7ICAgICAgICAgLyogcHJvY2VzcyBpZCAqLworCWludCAgICAgcHNfc3RhdHVzOyAgICAgIC8qIGxhc3QgcHJvY2VzcyBzdGF0dXMgZnJvbSB3YWl0KCkgKi8KKwljaGFyICAgICpwc19jbWQ7ICAgICAgICAvKiB0ZXh0IG9mIGNvbW1hbmQgYmVpbmcgcnVuICovCit9OworCitzdHJ1Y3Qgam9iIHsKKwlzdHJ1Y3QgcHJvY3N0YXQgcHMwOyAgICAvKiBzdGF0dXMgb2YgcHJvY2VzcyAqLworCXN0cnVjdCBwcm9jc3RhdCAqcHM7ICAgIC8qIHN0YXR1cyBvciBwcm9jZXNzZXMgd2hlbiBtb3JlIHRoYW4gb25lICovCisjaWYgSk9CUworCWludCBzdG9wc3RhdHVzOyAgICAgICAgIC8qIHN0YXR1cyBvZiBhIHN0b3BwZWQgam9iICovCisjZW5kaWYKKwl1aW50MzJfdAorCQlucHJvY3M6IDE2LCAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NlcyAqLworCQlzdGF0ZTogOCwKKyNkZWZpbmUgSk9CUlVOTklORyAgICAgIDAgICAgICAgLyogYXQgbGVhc3Qgb25lIHByb2MgcnVubmluZyAqLworI2RlZmluZSBKT0JTVE9QUEVEICAgICAgMSAgICAgICAvKiBhbGwgcHJvY3MgYXJlIHN0b3BwZWQgKi8KKyNkZWZpbmUgSk9CRE9ORSAgICAgICAgIDIgICAgICAgLyogYWxsIHByb2NzIGFyZSBjb21wbGV0ZWQgKi8KKyNpZiBKT0JTCisJCXNpZ2ludDogMSwgICAgICAvKiBqb2Igd2FzIGtpbGxlZCBieSBTSUdJTlQgKi8KKwkJam9iY3RsOiAxLCAgICAgIC8qIGpvYiBydW5uaW5nIHVuZGVyIGpvYiBjb250cm9sICovCisjZW5kaWYKKwkJd2FpdGVkOiAxLCAgICAgIC8qIHRydWUgaWYgdGhpcyBlbnRyeSBoYXMgYmVlbiB3YWl0ZWQgZm9yICovCisJCXVzZWQ6IDEsICAgICAgICAvKiB0cnVlIGlmIHRoaXMgZW50cnkgaXMgaW4gdXNlZCAqLworCQljaGFuZ2VkOiAxOyAgICAgLyogdHJ1ZSBpZiBzdGF0dXMgaGFzIGNoYW5nZWQgKi8KKwlzdHJ1Y3Qgam9iICpwcmV2X2pvYjsgICAvKiBwcmV2aW91cyBqb2IgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgam9iICptYWtlam9iKC8qdW5pb24gbm9kZSAqLCovIGludCk7CitzdGF0aWMgaW50IGZvcmtzaGVsbChzdHJ1Y3Qgam9iICosIHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgd2FpdGZvcmpvYihzdHJ1Y3Qgam9iICopOworCisjaWYgIUpPQlMKK2VudW0geyBkb2luZ19qb2JjdGwgPSAwIH07CisjZGVmaW5lIHNldGpvYmN0bChvbikgZG8ge30gd2hpbGUgKDApCisjZWxzZQorc3RhdGljIHNtYWxsaW50IGRvaW5nX2pvYmN0bDsgLy9yZWZlcmVuY2VzOjgKK3N0YXRpYyB2b2lkIHNldGpvYmN0bChpbnQpOworI2VuZGlmCisKKy8qCisgKiBJZ25vcmUgYSBzaWduYWwuCisgKi8KK3N0YXRpYyB2b2lkCitpZ25vcmVzaWcoaW50IHNpZ25vKQoreworCS8qIEF2b2lkIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscy4gSXMgaXQgYWxyZWFkeSBTSUdfSUdOZWQ/ICovCisJaWYgKHNpZ21vZGVbc2lnbm8gLSAxXSAhPSBTX0lHTiAmJiBzaWdtb2RlW3NpZ25vIC0gMV0gIT0gU19IQVJEX0lHTikgeworCQkvKiBObywgbmVlZCB0byBkbyBpdCAqLworCQlzaWduYWwoc2lnbm8sIFNJR19JR04pOworCX0KKwlzaWdtb2RlW3NpZ25vIC0gMV0gPSBTX0hBUkRfSUdOOworfQorCisvKgorICogT25seSBvbmUgdXNhZ2Ugc2l0ZSAtIGluIHNldHNpZ25hbCgpCisgKi8KK3N0YXRpYyB2b2lkCitzaWduYWxfaGFuZGxlcihpbnQgc2lnbm8pCit7CisJZ290c2lnW3NpZ25vIC0gMV0gPSAxOworCisJaWYgKHNpZ25vID09IFNJR0lOVCAmJiAhdHJhcFtTSUdJTlRdKSB7CisJCWlmICghc3VwcHJlc3NfaW50KSB7CisJCQlwZW5kaW5nX3NpZyA9IDA7CisJCQlyYWlzZV9pbnRlcnJ1cHQoKTsgLyogZG9lcyBub3QgcmV0dXJuICovCisJCX0KKwkJcGVuZGluZ19pbnQgPSAxOworCX0gZWxzZSB7CisJCXBlbmRpbmdfc2lnID0gc2lnbm87CisJfQorfQorCisvKgorICogU2V0IHRoZSBzaWduYWwgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCBzaWduYWwuICBUaGUgcm91dGluZSBmaWd1cmVzCisgKiBvdXQgd2hhdCBpdCBzaG91bGQgYmUgc2V0IHRvLgorICovCitzdGF0aWMgdm9pZAorc2V0c2lnbmFsKGludCBzaWdubykKK3sKKwljaGFyICp0OworCWNoYXIgY3VyX2FjdCwgbmV3X2FjdDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKworCXQgPSB0cmFwW3NpZ25vXTsKKwluZXdfYWN0ID0gU19ERkw7CisJaWYgKHQgIT0gTlVMTCkgeyAvKiB0cmFwIGZvciB0aGlzIHNpZyBpcyBzZXQgKi8KKwkJbmV3X2FjdCA9IFNfQ0FUQ0g7CisJCWlmICh0WzBdID09ICdcMCcpIC8qIHRyYXAgaXMgIiI6IGlnbm9yZSB0aGlzIHNpZyAqLworCQkJbmV3X2FjdCA9IFNfSUdOOworCX0KKworCWlmIChyb290c2hlbGwgJiYgbmV3X2FjdCA9PSBTX0RGTCkgeworCQlzd2l0Y2ggKHNpZ25vKSB7CisJCWNhc2UgU0lHSU5UOgorCQkJaWYgKGlmbGFnIHx8IG1pbnVzYyB8fCBzZmxhZyA9PSAwKQorCQkJCW5ld19hY3QgPSBTX0NBVENIOworCQkJYnJlYWs7CisJCWNhc2UgU0lHUVVJVDoKKyNpZiBERUJVRworCQkJaWYgKGRlYnVnKQorCQkJCWJyZWFrOworI2VuZGlmCisJCQkvKiBtYW4gYmFzaDoKKwkJCSAqICJJbiBhbGwgY2FzZXMsIGJhc2ggaWdub3JlcyBTSUdRVUlULiBOb24tYnVpbHRpbgorCQkJICogY29tbWFuZHMgcnVuIGJ5IGJhc2ggaGF2ZSBzaWduYWwgaGFuZGxlcnMKKwkJCSAqIHNldCB0byB0aGUgdmFsdWVzIGluaGVyaXRlZCBieSB0aGUgc2hlbGwKKwkJCSAqIGZyb20gaXRzIHBhcmVudCIuICovCisJCQluZXdfYWN0ID0gU19JR047CisJCQlicmVhazsKKwkJY2FzZSBTSUdURVJNOgorCQkJaWYgKGlmbGFnKQorCQkJCW5ld19hY3QgPSBTX0lHTjsKKwkJCWJyZWFrOworI2lmIEpPQlMKKwkJY2FzZSBTSUdUU1RQOgorCQljYXNlIFNJR1RUT1U6CisJCQlpZiAobWZsYWcpCisJCQkJbmV3X2FjdCA9IFNfSUdOOworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCX0KKy8vVE9ETzogaWYgIXJvb3RzaGVsbCwgd2UgcmVzZXQgU0lHUVVJVCB0byBERkwsCisvL3doZXJlYXMgd2UgaGF2ZSB0byByZXN0b3JlIGl0IHRvIHdoYXQgc2hlbGwgZ290IG9uIGVudHJ5CisvL2Zyb20gdGhlIHBhcmVudC4gU2VlIGNvbW1lbnQgYWJvdmUKKworCXQgPSAmc2lnbW9kZVtzaWdubyAtIDFdOworCWN1cl9hY3QgPSAqdDsKKwlpZiAoY3VyX2FjdCA9PSAwKSB7CisJCS8qIGN1cnJlbnQgc2V0dGluZyBpcyBub3QgeWV0IGtub3duICovCisJCWlmIChzaWdhY3Rpb24oc2lnbm8sIE5VTEwsICZhY3QpKSB7CisJCQkvKiBwcmV0ZW5kIGl0IHdvcmtlZDsgbWF5YmUgd2Ugc2hvdWxkIGdpdmUgYSB3YXJuaW5nLAorCQkJICogYnV0IG90aGVyIHNoZWxscyBkb24ndC4gV2UgZG9uJ3QgYWx0ZXIgc2lnbW9kZSwKKwkJCSAqIHNvIHdlIHJldHJ5IGV2ZXJ5IHRpbWUuCisJCQkgKiBidHcsIGluIExpbnV4IGl0IG5ldmVyIGZhaWxzLiAtLXZkYSAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChhY3Quc2FfaGFuZGxlciA9PSBTSUdfSUdOKSB7CisJCQljdXJfYWN0ID0gU19IQVJEX0lHTjsKKwkJCWlmIChtZmxhZworCQkJICYmIChzaWdubyA9PSBTSUdUU1RQIHx8IHNpZ25vID09IFNJR1RUSU4gfHwgc2lnbm8gPT0gU0lHVFRPVSkKKwkJCSkgeworCQkJCWN1cl9hY3QgPSBTX0lHTjsgICAvKiBkb24ndCBoYXJkIGlnbm9yZSB0aGVzZSAqLworCQkJfQorCQl9CisJfQorCWlmIChjdXJfYWN0ID09IFNfSEFSRF9JR04gfHwgY3VyX2FjdCA9PSBuZXdfYWN0KQorCQlyZXR1cm47CisKKwlhY3Quc2FfaGFuZGxlciA9IFNJR19ERkw7CisJc3dpdGNoIChuZXdfYWN0KSB7CisJY2FzZSBTX0NBVENIOgorCQlhY3Quc2FfaGFuZGxlciA9IHNpZ25hbF9oYW5kbGVyOworCQlicmVhazsKKwljYXNlIFNfSUdOOgorCQlhY3Quc2FfaGFuZGxlciA9IFNJR19JR047CisJCWJyZWFrOworCX0KKworCS8qIGZsYWdzIGFuZCBtYXNrIG1hdHRlciBvbmx5IGlmICFERkwgYW5kICFJR04sIGJ1dCB3ZSBkbyBpdAorCSAqIGZvciBhbGwgY2FzZXMgZm9yIG1vcmUgZGV0ZXJtaW5pc3RpYyBiZWhhdmlvcjoKKwkgKi8KKwlhY3Quc2FfZmxhZ3MgPSAwOworCXNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKworCXNpZ2FjdGlvbl9zZXQoc2lnbm8sICZhY3QpOworCisJKnQgPSBuZXdfYWN0OworfQorCisvKiBtb2RlIGZsYWdzIGZvciBzZXRfY3Vyam9iICovCisjZGVmaW5lIENVUl9ERUxFVEUgMgorI2RlZmluZSBDVVJfUlVOTklORyAxCisjZGVmaW5lIENVUl9TVE9QUEVEIDAKKworLyogbW9kZSBmbGFncyBmb3IgZG93YWl0ICovCisjZGVmaW5lIERPV0FJVF9OT05CTE9DSyBXTk9IQU5HCisjZGVmaW5lIERPV0FJVF9CTE9DSyAgICAwCisKKyNpZiBKT0JTCisvKiBwZ3JwIG9mIHNoZWxsIG9uIGludm9jYXRpb24gKi8KK3N0YXRpYyBpbnQgaW5pdGlhbHBncnA7IC8vcmVmZXJlbmNlczoyCitzdGF0aWMgaW50IHR0eWZkID0gLTE7IC8vNQorI2VuZGlmCisvKiBhcnJheSBvZiBqb2JzICovCitzdGF0aWMgc3RydWN0IGpvYiAqam9idGFiOyAvLzUKKy8qIHNpemUgb2YgYXJyYXkgKi8KK3N0YXRpYyB1bnNpZ25lZCBuam9iczsgLy80CisvKiBjdXJyZW50IGpvYiAqLworc3RhdGljIHN0cnVjdCBqb2IgKmN1cmpvYjsgLy9sb3RzCisvKiBudW1iZXIgb2YgcHJlc3VtZWQgbGl2aW5nIHVudHJhY2tlZCBqb2JzICovCitzdGF0aWMgaW50IGpvYmxlc3M7IC8vNAorCitzdGF0aWMgdm9pZAorc2V0X2N1cmpvYihzdHJ1Y3Qgam9iICpqcCwgdW5zaWduZWQgbW9kZSkKK3sKKwlzdHJ1Y3Qgam9iICpqcDE7CisJc3RydWN0IGpvYiAqKmpwcCwgKipjdXJwOworCisJLyogZmlyc3QgcmVtb3ZlIGZyb20gbGlzdCAqLworCWpwcCA9IGN1cnAgPSAmY3Vyam9iOworCXdoaWxlICgxKSB7CisJCWpwMSA9ICpqcHA7CisJCWlmIChqcDEgPT0ganApCisJCQlicmVhazsKKwkJanBwID0gJmpwMS0+cHJldl9qb2I7CisJfQorCSpqcHAgPSBqcDEtPnByZXZfam9iOworCisJLyogVGhlbiByZS1pbnNlcnQgaW4gY29ycmVjdCBwb3NpdGlvbiAqLworCWpwcCA9IGN1cnA7CisJc3dpdGNoIChtb2RlKSB7CisJZGVmYXVsdDoKKyNpZiBERUJVRworCQlhYm9ydCgpOworI2VuZGlmCisJY2FzZSBDVVJfREVMRVRFOgorCQkvKiBqb2IgYmVpbmcgZGVsZXRlZCAqLworCQlicmVhazsKKwljYXNlIENVUl9SVU5OSU5HOgorCQkvKiBuZXdseSBjcmVhdGVkIGpvYiBvciBiYWNrZ3JvdW5kZWQgam9iLAorCQkgICBwdXQgYWZ0ZXIgYWxsIHN0b3BwZWQgam9icy4gKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWpwMSA9ICpqcHA7CisjaWYgSk9CUworCQkJaWYgKCFqcDEgfHwganAxLT5zdGF0ZSAhPSBKT0JTVE9QUEVEKQorI2VuZGlmCisJCQkJYnJlYWs7CisJCQlqcHAgPSAmanAxLT5wcmV2X2pvYjsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworI2lmIEpPQlMKKwljYXNlIENVUl9TVE9QUEVEOgorI2VuZGlmCisJCS8qIG5ld2x5IHN0b3BwZWQgam9iIC0gYmVjb21lcyBjdXJqb2IgKi8KKwkJanAtPnByZXZfam9iID0gKmpwcDsKKwkJKmpwcCA9IGpwOworCQlicmVhazsKKwl9Cit9CisKKyNpZiBKT0JTIHx8IERFQlVHCitzdGF0aWMgaW50Citqb2Jubyhjb25zdCBzdHJ1Y3Qgam9iICpqcCkKK3sKKwlyZXR1cm4ganAgLSBqb2J0YWIgKyAxOworfQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGEgam9iIG5hbWUgdG8gYSBqb2Igc3RydWN0dXJlLgorICovCisjaWYgIUpPQlMKKyNkZWZpbmUgZ2V0am9iKG5hbWUsIGdldGN0bCkgZ2V0am9iKG5hbWUpCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3Qgam9iICoKK2dldGpvYihjb25zdCBjaGFyICpuYW1lLCBpbnQgZ2V0Y3RsKQoreworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBqb2IgKmZvdW5kOworCWNvbnN0IGNoYXIgKmVycl9tc2cgPSAiJXM6IG5vIHN1Y2ggam9iIjsKKwl1bnNpZ25lZCBudW07CisJaW50IGM7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICooKm1hdGNoKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlqcCA9IGN1cmpvYjsKKwlwID0gbmFtZTsKKwlpZiAoIXApCisJCWdvdG8gY3VycmVudGpvYjsKKworCWlmICgqcCAhPSAnJScpCisJCWdvdG8gZXJyOworCisJYyA9ICorK3A7CisJaWYgKCFjKQorCQlnb3RvIGN1cnJlbnRqb2I7CisKKwlpZiAoIXBbMV0pIHsKKwkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJyUnKSB7CisgY3VycmVudGpvYjoKKwkJCWVycl9tc2cgPSAiTm8gY3VycmVudCBqb2IiOworCQkJZ290byBjaGVjazsKKwkJfQorCQlpZiAoYyA9PSAnLScpIHsKKwkJCWlmIChqcCkKKwkJCQlqcCA9IGpwLT5wcmV2X2pvYjsKKwkJCWVycl9tc2cgPSAiTm8gcHJldmlvdXMgam9iIjsKKyBjaGVjazoKKwkJCWlmICghanApCisJCQkJZ290byBlcnI7CisJCQlnb3RvIGdvdGl0OworCQl9CisJfQorCisJaWYgKGlzX251bWJlcihwKSkgeworCQludW0gPSBhdG9pKHApOworCQlpZiAobnVtIDwgbmpvYnMpIHsKKwkJCWpwID0gam9idGFiICsgbnVtIC0gMTsKKwkJCWlmIChqcC0+dXNlZCkKKwkJCQlnb3RvIGdvdGl0OworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwltYXRjaCA9IHByZWZpeDsKKwlpZiAoKnAgPT0gJz8nKSB7CisJCW1hdGNoID0gc3Ryc3RyOworCQlwKys7CisJfQorCisJZm91bmQgPSBOVUxMOworCXdoaWxlIChqcCkgeworCQlpZiAobWF0Y2goanAtPnBzWzBdLnBzX2NtZCwgcCkpIHsKKwkJCWlmIChmb3VuZCkKKwkJCQlnb3RvIGVycjsKKwkJCWZvdW5kID0ganA7CisJCQllcnJfbXNnID0gIiVzOiBhbWJpZ3VvdXMiOworCQl9CisJCWpwID0ganAtPnByZXZfam9iOworCX0KKwlpZiAoIWZvdW5kKQorCQlnb3RvIGVycjsKKwlqcCA9IGZvdW5kOworCisgZ290aXQ6CisjaWYgSk9CUworCWVycl9tc2cgPSAiam9iICVzIG5vdCBjcmVhdGVkIHVuZGVyIGpvYiBjb250cm9sIjsKKwlpZiAoZ2V0Y3RsICYmIGpwLT5qb2JjdGwgPT0gMCkKKwkJZ290byBlcnI7CisjZW5kaWYKKwlyZXR1cm4ganA7CisgZXJyOgorCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGVycl9tc2csIG5hbWUpOworfQorCisvKgorICogTWFyayBhIGpvYiBzdHJ1Y3R1cmUgYXMgdW51c2VkLgorICovCitzdGF0aWMgdm9pZAorZnJlZWpvYihzdHJ1Y3Qgam9iICpqcCkKK3sKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCWludCBpOworCisJSU5UX09GRjsKKwlmb3IgKGkgPSBqcC0+bnByb2NzLCBwcyA9IGpwLT5wczsgLS1pID49IDA7IHBzKyspIHsKKwkJaWYgKHBzLT5wc19jbWQgIT0gbnVsbHN0cikKKwkJCWZyZWUocHMtPnBzX2NtZCk7CisJfQorCWlmIChqcC0+cHMgIT0gJmpwLT5wczApCisJCWZyZWUoanAtPnBzKTsKKwlqcC0+dXNlZCA9IDA7CisJc2V0X2N1cmpvYihqcCwgQ1VSX0RFTEVURSk7CisJSU5UX09OOworfQorCisjaWYgSk9CUworc3RhdGljIHZvaWQKK3h0Y3NldHBncnAoaW50IGZkLCBwaWRfdCBwZ3JwKQoreworCWlmICh0Y3NldHBncnAoZmQsIHBncnApKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3Qgc2V0IHR0eSBwcm9jZXNzIGdyb3VwICglbSkiKTsKK30KKworLyoKKyAqIFR1cm4gam9iIGNvbnRyb2wgb24gYW5kIG9mZi4KKyAqCisgKiBOb3RlOiAgVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgdGhpcmQgYXJnIHRvIGlvY3RsIGlzIGEgY2hhcmFjdGVyCisgKiBwb2ludGVyLCB3aGljaCBpcyB0cnVlIG9uIEJlcmtlbGV5IHN5c3RlbXMgYnV0IG5vdCBTeXN0ZW0gVi4gIFNpbmNlCisgKiBTeXN0ZW0gViBkb2Vzbid0IGhhdmUgam9iIGNvbnRyb2wgeWV0LCB0aGlzIGlzbid0IGEgcHJvYmxlbSBub3cuCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRqb2JjdGwoaW50IG9uKQoreworCWludCBmZDsKKwlpbnQgcGdycDsKKworCWlmIChvbiA9PSBkb2luZ19qb2JjdGwgfHwgcm9vdHNoZWxsID09IDApCisJCXJldHVybjsKKwlpZiAob24pIHsKKwkJaW50IG9mZDsKKwkJb2ZkID0gZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19SRFdSKTsKKwkJaWYgKGZkIDwgMCkgeworCS8qIEJUVywgYmFzaCB3aWxsIHRyeSB0byBvcGVuKHR0eW5hbWUoMCkpIGlmIG9wZW4oIi9kZXYvdHR5IikgZmFpbHMuCisJICogVGhhdCBzb21ldGltZXMgaGVscHMgdG8gYWNxdWlyZSBjb250cm9sbGluZyB0dHkuCisJICogT2J2aW91c2x5LCBhIHdvcmthcm91bmQgZm9yIGJ1Z3Mgd2hlbiBzb21lb25lCisJICogZmFpbGVkIHRvIHByb3ZpZGUgYSBjb250cm9sbGluZyB0dHkgdG8gYmFzaCEgOikgKi8KKwkJCWZkID0gMjsKKwkJCXdoaWxlICghaXNhdHR5KGZkKSkKKwkJCQlpZiAoLS1mZCA8IDApCisJCQkJCWdvdG8gb3V0OworCQl9CisJCWZkID0gZmNudGwoZmQsIEZfRFVQRkQsIDEwKTsKKwkJaWYgKG9mZCA+PSAwKQorCQkJY2xvc2Uob2ZkKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gb3V0OworCQkvKiBmZCBpcyBhIHR0eSBhdCB0aGlzIHBvaW50ICovCisJCWNsb3NlX29uX2V4ZWNfb24oZmQpOworCQl3aGlsZSAoMSkgeyAvKiB3aGlsZSB3ZSBhcmUgaW4gdGhlIGJhY2tncm91bmQgKi8KKwkJCXBncnAgPSB0Y2dldHBncnAoZmQpOworCQkJaWYgKHBncnAgPCAwKSB7Cisgb3V0OgorCQkJCWFzaF9tc2coImNhbid0IGFjY2VzcyB0dHk7IGpvYiBjb250cm9sIHR1cm5lZCBvZmYiKTsKKwkJCQltZmxhZyA9IG9uID0gMDsKKwkJCQlnb3RvIGNsb3NlOworCQkJfQorCQkJaWYgKHBncnAgPT0gZ2V0cGdycCgpKQorCQkJCWJyZWFrOworCQkJa2lsbHBnKDAsIFNJR1RUSU4pOworCQl9CisJCWluaXRpYWxwZ3JwID0gcGdycDsKKworCQlzZXRzaWduYWwoU0lHVFNUUCk7CisJCXNldHNpZ25hbChTSUdUVE9VKTsKKwkJc2V0c2lnbmFsKFNJR1RUSU4pOworCQlwZ3JwID0gcm9vdHBpZDsKKwkJc2V0cGdpZCgwLCBwZ3JwKTsKKwkJeHRjc2V0cGdycChmZCwgcGdycCk7CisJfSBlbHNlIHsKKwkJLyogdHVybmluZyBqb2IgY29udHJvbCBvZmYgKi8KKwkJZmQgPSB0dHlmZDsKKwkJcGdycCA9IGluaXRpYWxwZ3JwOworCQkvKiB3YXMgeHRjc2V0cGdycCwgYnV0IHRoaXMgY2FuIG1ha2UgZXhpdGluZyBhc2gKKwkJICogbG9vcCBmb3JldmVyIGlmIHB0eSBpcyBhbHJlYWR5IGRlbGV0ZWQgKi8KKwkJdGNzZXRwZ3JwKGZkLCBwZ3JwKTsKKwkJc2V0cGdpZCgwLCBwZ3JwKTsKKwkJc2V0c2lnbmFsKFNJR1RTVFApOworCQlzZXRzaWduYWwoU0lHVFRPVSk7CisJCXNldHNpZ25hbChTSUdUVElOKTsKKyBjbG9zZToKKwkJaWYgKGZkID49IDApCisJCQljbG9zZShmZCk7CisJCWZkID0gLTE7CisJfQorCXR0eWZkID0gZmQ7CisJZG9pbmdfam9iY3RsID0gb247Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitraWxsY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJndlsxXSAmJiBzdHJjbXAoYXJndlsxXSwgIi1sIikgIT0gMCkgeworCQlpbnQgaSA9IDE7CisJCWRvIHsKKwkJCWlmIChhcmd2W2ldWzBdID09ICclJykgeworCQkJCS8qCisJCQkJICogImtpbGwgJU4iIC0gam9iIGtpbGwKKwkJCQkgKiBDb252ZXJ0aW5nIHRvIHBncnAgLyBwaWQga2lsbAorCQkJCSAqLworCQkJCXN0cnVjdCBqb2IgKmpwOworCQkJCWNoYXIgKmRzdDsKKwkJCQlpbnQgaiwgbjsKKworCQkJCWpwID0gZ2V0am9iKGFyZ3ZbaV0sIDApOworCQkJCS8qCisJCQkJICogSW4gam9icyBzdGFydGVkIHVuZGVyIGpvYiBjb250cm9sLCB3ZSBzaWduYWwKKwkJCQkgKiBlbnRpcmUgcHJvY2VzcyBncm91cCBieSBraWxsIC1QR1JQX0lELgorCQkJCSAqIFRoaXMgaGFwcGVucywgZi5lLiwgaW4gaW50ZXJhY3RpdmUgc2hlbGwuCisJCQkJICoKKwkJCQkgKiBPdGhlcndpc2UsIHdlIHNpZ25hbCBlYWNoIGNoaWxkIHZpYQorCQkJCSAqIGtpbGwgUElEMSBQSUQyIFBJRDMuCisJCQkJICogVGVzdGNhc2VzOgorCQkJCSAqIHNoIC1jICdzbGVlcCAxfHNsZWVwIDEgJiBraWxsICUxJworCQkJCSAqIHNoIC1jICd0cnVlfHNsZWVwIDIgJiBzbGVlcCAxOyBraWxsICUxJworCQkJCSAqIHNoIC1jICd0cnVlfHNsZWVwIDEgJiBzbGVlcCAyOyBraWxsICUxJworCQkJCSAqLworCQkJCW4gPSBqcC0+bnByb2NzOyAvKiBjYW4ndCBiZSAwIChJIGhvcGUpICovCisJCQkJaWYgKGpwLT5qb2JjdGwpCisJCQkJCW4gPSAxOworCQkJCWRzdCA9IGFsbG9jYShuICogc2l6ZW9mKGludCkqNCk7CisJCQkJYXJndltpXSA9IGRzdDsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisJCQkJCXN0cnVjdCBwcm9jc3RhdCAqcHMgPSAmanAtPnBzW2pdOworCQkJCQkvKiBTa2lwIG5vbi1ydW5uaW5nIGFuZCBub3Qtc3RvcHBlZCBtZW1iZXJzCisJCQkJCSAqIChpLmUuIGRlYWQgbWVtYmVycykgb2YgdGhlIGpvYgorCQkJCQkgKi8KKwkJCQkJaWYgKHBzLT5wc19zdGF0dXMgIT0gLTEgJiYgIVdJRlNUT1BQRUQocHMtPnBzX3N0YXR1cykpCisJCQkJCQljb250aW51ZTsKKwkJCQkJLyoKKwkJCQkJICoga2lsbF9tYWluIGhhcyBtYXRjaGluZyBjb2RlIHRvIGV4cGVjdAorCQkJCQkgKiBsZWFkaW5nIHNwYWNlLiBOZWVkZWQgdG8gbm90IGNvbmZ1c2UKKwkJCQkJICogbmVnYXRpdmUgcGlkcyB3aXRoICJraWxsIC1TSUdOQUxfTk8iIHN5bnRheAorCQkJCQkgKi8KKwkJCQkJZHN0ICs9IHNwcmludGYoZHN0LCBqcC0+am9iY3RsID8gIiAtJXUiIDogIiAldSIsIChpbnQpcHMtPnBzX3BpZCk7CisJCQkJfQorCQkJCSpkc3QgPSAnXDAnOworCQkJfQorCQl9IHdoaWxlIChhcmd2WysraV0pOworCX0KKwlyZXR1cm4ga2lsbF9tYWluKGFyZ2MsIGFyZ3YpOworfQorCitzdGF0aWMgdm9pZAorc2hvd3BpcGUoc3RydWN0IGpvYiAqanAgLyosIEZJTEUgKm91dCovKQoreworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisJc3RydWN0IHByb2NzdGF0ICpwc2VuZDsKKworCXBzZW5kID0ganAtPnBzICsganAtPm5wcm9jczsKKwlmb3IgKHBzID0ganAtPnBzICsgMTsgcHMgPCBwc2VuZDsgcHMrKykKKwkJcHJpbnRmKCIgfCAlcyIsIHBzLT5wc19jbWQpOworCW91dGNzbG93KCdcbicsIHN0ZG91dCk7CisJZmx1c2hfc3Rkb3V0X3N0ZGVycigpOworfQorCisKK3N0YXRpYyBpbnQKK3Jlc3RhcnRqb2Ioc3RydWN0IGpvYiAqanAsIGludCBtb2RlKQoreworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisJaW50IGk7CisJaW50IHN0YXR1czsKKwlwaWRfdCBwZ2lkOworCisJSU5UX09GRjsKKwlpZiAoanAtPnN0YXRlID09IEpPQkRPTkUpCisJCWdvdG8gb3V0OworCWpwLT5zdGF0ZSA9IEpPQlJVTk5JTkc7CisJcGdpZCA9IGpwLT5wc1swXS5wc19waWQ7CisJaWYgKG1vZGUgPT0gRk9SS19GRykKKwkJeHRjc2V0cGdycCh0dHlmZCwgcGdpZCk7CisJa2lsbHBnKHBnaWQsIFNJR0NPTlQpOworCXBzID0ganAtPnBzOworCWkgPSBqcC0+bnByb2NzOworCWRvIHsKKwkJaWYgKFdJRlNUT1BQRUQocHMtPnBzX3N0YXR1cykpIHsKKwkJCXBzLT5wc19zdGF0dXMgPSAtMTsKKwkJfQorCQlwcysrOworCX0gd2hpbGUgKC0taSk7Cisgb3V0OgorCXN0YXR1cyA9IChtb2RlID09IEZPUktfRkcpID8gd2FpdGZvcmpvYihqcCkgOiAwOworCUlOVF9PTjsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworZmdfYmdjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlpbnQgbW9kZTsKKwlpbnQgcmV0dmFsOworCisJbW9kZSA9ICgqKmFyZ3YgPT0gJ2YnKSA/IEZPUktfRkcgOiBGT1JLX0JHOworCW5leHRvcHQobnVsbHN0cik7CisJYXJndiA9IGFyZ3B0cjsKKwlkbyB7CisJCWpwID0gZ2V0am9iKCphcmd2LCAxKTsKKwkJaWYgKG1vZGUgPT0gRk9SS19CRykgeworCQkJc2V0X2N1cmpvYihqcCwgQ1VSX1JVTk5JTkcpOworCQkJcHJpbnRmKCJbJWRdICIsIGpvYm5vKGpwKSk7CisJCX0KKwkJb3V0MXN0cihqcC0+cHNbMF0ucHNfY21kKTsKKwkJc2hvd3BpcGUoanAgLyosIHN0ZG91dCovKTsKKwkJcmV0dmFsID0gcmVzdGFydGpvYihqcCwgbW9kZSk7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitzcHJpbnRfc3RhdHVzKGNoYXIgKnMsIGludCBzdGF0dXMsIGludCBzaWdvbmx5KQoreworCWludCBjb2w7CisJaW50IHN0OworCisJY29sID0gMDsKKwlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKSB7CisjaWYgSk9CUworCQlpZiAoV0lGU1RPUFBFRChzdGF0dXMpKQorCQkJc3QgPSBXU1RPUFNJRyhzdGF0dXMpOworCQllbHNlCisjZW5kaWYKKwkJCXN0ID0gV1RFUk1TSUcoc3RhdHVzKTsKKwkJaWYgKHNpZ29ubHkpIHsKKwkJCWlmIChzdCA9PSBTSUdJTlQgfHwgc3QgPT0gU0lHUElQRSkKKwkJCQlnb3RvIG91dDsKKyNpZiBKT0JTCisJCQlpZiAoV0lGU1RPUFBFRChzdGF0dXMpKQorCQkJCWdvdG8gb3V0OworI2VuZGlmCisJCX0KKwkJc3QgJj0gMHg3ZjsKKy8vVE9ETzogdXNlIGJib3gncyBnZXRfc2lnbmFtZT8gc3Ryc2lnbmFsIGFkZHMgfjYwMCBieXRlcyB0byB0ZXh0K3JvZGF0YQorCQljb2wgPSBmbXRzdHIocywgMzIsIHN0cnNpZ25hbChzdCkpOworCQlpZiAoV0NPUkVEVU1QKHN0YXR1cykpIHsKKwkJCWNvbCArPSBmbXRzdHIocyArIGNvbCwgMTYsICIgKGNvcmUgZHVtcGVkKSIpOworCQl9CisJfSBlbHNlIGlmICghc2lnb25seSkgeworCQlzdCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCWlmIChzdCkKKwkJCWNvbCA9IGZtdHN0cihzLCAxNiwgIkRvbmUoJWQpIiwgc3QpOworCQllbHNlCisJCQljb2wgPSBmbXRzdHIocywgMTYsICJEb25lIik7CisJfQorIG91dDoKKwlyZXR1cm4gY29sOworfQorCitzdGF0aWMgaW50Citkb3dhaXQoaW50IHdhaXRfZmxhZ3MsIHN0cnVjdCBqb2IgKmpvYikKK3sKKwlpbnQgcGlkOworCWludCBzdGF0dXM7CisJc3RydWN0IGpvYiAqanA7CisJc3RydWN0IGpvYiAqdGhpc2pvYjsKKwlpbnQgc3RhdGU7CisKKwlUUkFDRSgoImRvd2FpdCgweCV4KSBjYWxsZWRcbiIsIHdhaXRfZmxhZ3MpKTsKKworCS8qIERvIGEgd2FpdCBzeXN0ZW0gY2FsbC4gSWYgam9iIGNvbnRyb2wgaXMgY29tcGlsZWQgaW4sIHdlIGFjY2VwdAorCSAqIHN0b3BwZWQgcHJvY2Vzc2VzLiB3YWl0X2ZsYWdzIG1heSBoYXZlIFdOT0hBTkcsIHByZXZlbnRpbmcgYmxvY2tpbmcuCisJICogTkI6IF9ub3RfIHNhZmVfd2FpdHBpZCwgd2UgbmVlZCB0byBkZXRlY3QgRUlOVFIgKi8KKwlpZiAoZG9pbmdfam9iY3RsKQorCQl3YWl0X2ZsYWdzIHw9IFdVTlRSQUNFRDsKKwlwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCB3YWl0X2ZsYWdzKTsKKwlUUkFDRSgoIndhaXQgcmV0dXJucyBwaWQ9JWQsIHN0YXR1cz0weCV4LCBlcnJubz0lZCglcylcbiIsCisJCQkJcGlkLCBzdGF0dXMsIGVycm5vLCBzdHJlcnJvcihlcnJubykpKTsKKwlpZiAocGlkIDw9IDApCisJCXJldHVybiBwaWQ7CisKKwlJTlRfT0ZGOworCXRoaXNqb2IgPSBOVUxMOworCWZvciAoanAgPSBjdXJqb2I7IGpwOyBqcCA9IGpwLT5wcmV2X2pvYikgeworCQlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCQlzdHJ1Y3QgcHJvY3N0YXQgKnBzZW5kOworCQlpZiAoanAtPnN0YXRlID09IEpPQkRPTkUpCisJCQljb250aW51ZTsKKwkJc3RhdGUgPSBKT0JET05FOworCQlwcyA9IGpwLT5wczsKKwkJcHNlbmQgPSBwcyArIGpwLT5ucHJvY3M7CisJCWRvIHsKKwkJCWlmIChwcy0+cHNfcGlkID09IHBpZCkgeworCQkJCVRSQUNFKCgiSm9iICVkOiBjaGFuZ2luZyBzdGF0dXMgb2YgcHJvYyAlZCAiCisJCQkJCSJmcm9tIDB4JXggdG8gMHgleFxuIiwKKwkJCQkJam9ibm8oanApLCBwaWQsIHBzLT5wc19zdGF0dXMsIHN0YXR1cykpOworCQkJCXBzLT5wc19zdGF0dXMgPSBzdGF0dXM7CisJCQkJdGhpc2pvYiA9IGpwOworCQkJfQorCQkJaWYgKHBzLT5wc19zdGF0dXMgPT0gLTEpCisJCQkJc3RhdGUgPSBKT0JSVU5OSU5HOworI2lmIEpPQlMKKwkJCWlmIChzdGF0ZSA9PSBKT0JSVU5OSU5HKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKFdJRlNUT1BQRUQocHMtPnBzX3N0YXR1cykpIHsKKwkJCQlqcC0+c3RvcHN0YXR1cyA9IHBzLT5wc19zdGF0dXM7CisJCQkJc3RhdGUgPSBKT0JTVE9QUEVEOworCQkJfQorI2VuZGlmCisJCX0gd2hpbGUgKCsrcHMgPCBwc2VuZCk7CisJCWlmICh0aGlzam9iKQorCQkJZ290byBnb3Rqb2I7CisJfQorI2lmIEpPQlMKKwlpZiAoIVdJRlNUT1BQRUQoc3RhdHVzKSkKKyNlbmRpZgorCQlqb2JsZXNzLS07CisJZ290byBvdXQ7CisKKyBnb3Rqb2I6CisJaWYgKHN0YXRlICE9IEpPQlJVTk5JTkcpIHsKKwkJdGhpc2pvYi0+Y2hhbmdlZCA9IDE7CisKKwkJaWYgKHRoaXNqb2ItPnN0YXRlICE9IHN0YXRlKSB7CisJCQlUUkFDRSgoIkpvYiAlZDogY2hhbmdpbmcgc3RhdGUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQlqb2Jubyh0aGlzam9iKSwgdGhpc2pvYi0+c3RhdGUsIHN0YXRlKSk7CisJCQl0aGlzam9iLT5zdGF0ZSA9IHN0YXRlOworI2lmIEpPQlMKKwkJCWlmIChzdGF0ZSA9PSBKT0JTVE9QUEVEKSB7CisJCQkJc2V0X2N1cmpvYih0aGlzam9iLCBDVVJfU1RPUFBFRCk7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworIG91dDoKKwlJTlRfT047CisKKwlpZiAodGhpc2pvYiAmJiB0aGlzam9iID09IGpvYikgeworCQljaGFyIHNbNDggKyAxXTsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBzcHJpbnRfc3RhdHVzKHMsIHN0YXR1cywgMSk7CisJCWlmIChsZW4pIHsKKwkJCXNbbGVuXSA9ICdcbic7CisJCQlzW2xlbiArIDFdID0gJ1wwJzsKKwkJCW91dDJzdHIocyk7CisJCX0KKwl9CisJcmV0dXJuIHBpZDsKK30KKworc3RhdGljIGludAorYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZyh2b2lkKQoreworCXBpZF90IHBpZCA9IGRvd2FpdChET1dBSVRfQkxPQ0ssIE5VTEwpOworCWlmIChwaWQgPD0gMCAmJiBwZW5kaW5nX3NpZykKKwkJcmFpc2VfZXhjZXB0aW9uKEVYU0lHKTsKKwlyZXR1cm4gcGlkOworfQorCisjaWYgSk9CUworc3RhdGljIHZvaWQKK3Nob3dqb2IoRklMRSAqb3V0LCBzdHJ1Y3Qgam9iICpqcCwgaW50IG1vZGUpCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzZW5kOworCWludCBjb2w7CisJaW50IGluZGVudF9jb2w7CisJY2hhciBzWzgwXTsKKworCXBzID0ganAtPnBzOworCisJaWYgKG1vZGUgJiBTSE9XX09OTFlfUEdJRCkgeyAvKiBqb2JzIC1wICovCisJCS8qIGp1c3Qgb3V0cHV0IHByb2Nlc3MgKGdyb3VwKSBpZCBvZiBwaXBlbGluZSAqLworCQlmcHJpbnRmKG91dCwgIiVkXG4iLCBwcy0+cHNfcGlkKTsKKwkJcmV0dXJuOworCX0KKworCWNvbCA9IGZtdHN0cihzLCAxNiwgIlslZF0gICAiLCBqb2JubyhqcCkpOworCWluZGVudF9jb2wgPSBjb2w7CisKKwlpZiAoanAgPT0gY3Vyam9iKQorCQlzW2NvbCAtIDNdID0gJysnOworCWVsc2UgaWYgKGN1cmpvYiAmJiBqcCA9PSBjdXJqb2ItPnByZXZfam9iKQorCQlzW2NvbCAtIDNdID0gJy0nOworCisJaWYgKG1vZGUgJiBTSE9XX1BJRFMpCisJCWNvbCArPSBmbXRzdHIocyArIGNvbCwgMTYsICIlZCAiLCBwcy0+cHNfcGlkKTsKKworCXBzZW5kID0gcHMgKyBqcC0+bnByb2NzOworCisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JSVU5OSU5HKSB7CisJCXN0cmNweShzICsgY29sLCAiUnVubmluZyIpOworCQljb2wgKz0gc2l6ZW9mKCJSdW5uaW5nIikgLSAxOworCX0gZWxzZSB7CisJCWludCBzdGF0dXMgPSBwc2VuZFstMV0ucHNfc3RhdHVzOworCQlpZiAoanAtPnN0YXRlID09IEpPQlNUT1BQRUQpCisJCQlzdGF0dXMgPSBqcC0+c3RvcHN0YXR1czsKKwkJY29sICs9IHNwcmludF9zdGF0dXMocyArIGNvbCwgc3RhdHVzLCAwKTsKKwl9CisJLyogQnkgbm93LCAiW0pPQklEXSogIFttYXliZSBQSURdIFNUQVRVUyIgaXMgcHJpbnRlZCAqLworCisJLyogVGhpcyBsb29wIGVpdGhlciBwcmludHMgIjxjbWQxPiB8IDxjbWQyPiB8IDxjbWQzPiIgbGluZQorCSAqIG9yIHByaW50cyBzZXZlcmFsICJQSUQgICAgICAgICAgICAgfCA8Y21kTj4iIGxpbmVzLAorCSAqIGRlcGVuZGluZyBvbiBTSE9XX1BJRFMgYml0LgorCSAqIFdlIGRvIG5vdCBwcmludCBzdGF0dXMgb2YgaW5kaXZpZHVhbCBwcm9jZXNzZXMKKwkgKiBiZXR3ZWVuIFBJRCBhbmQgPGNtZE4+LiBiYXNoIGRvZXMgaXQsIGJ1dCBub3QgdmVyeSB3ZWxsOgorCSAqIGZpcnN0IGxpbmUgc2hvd3Mgb3ZlcmFsbCBqb2Igc3RhdHVzLCBub3QgcHJvY2VzcyBzdGF0dXMsCisJICogbWFraW5nIGl0IGltcG9zc2libGUgdG8ga25vdyAxc3QgcHJvY2VzcyBzdGF0dXMuCisJICovCisJZ290byBzdGFydDsKKwlkbyB7CisJCS8qIGZvciBlYWNoIHByb2Nlc3MgKi8KKwkJc1swXSA9ICdcMCc7CisJCWNvbCA9IDMzOworCQlpZiAobW9kZSAmIFNIT1dfUElEUykKKwkJCWNvbCA9IGZtdHN0cihzLCA0OCwgIlxuJSpjJWQgIiwgaW5kZW50X2NvbCwgJyAnLCBwcy0+cHNfcGlkKSAtIDE7Cisgc3RhcnQ6CisJCWZwcmludGYob3V0LCAiJXMlKmMlcyVzIiwKKwkJCQlzLAorCQkJCTMzIC0gY29sID49IDAgPyAzMyAtIGNvbCA6IDAsICcgJywKKwkJCQlwcyA9PSBqcC0+cHMgPyAiIiA6ICJ8ICIsCisJCQkJcHMtPnBzX2NtZAorCQkpOworCX0gd2hpbGUgKCsrcHMgIT0gcHNlbmQpOworCW91dGNzbG93KCdcbicsIG91dCk7CisKKwlqcC0+Y2hhbmdlZCA9IDA7CisKKwlpZiAoanAtPnN0YXRlID09IEpPQkRPTkUpIHsKKwkJVFJBQ0UoKCJzaG93am9iOiBmcmVlaW5nIGpvYiAlZFxuIiwgam9ibm8oanApKSk7CisJCWZyZWVqb2IoanApOworCX0KK30KKworLyoKKyAqIFByaW50IGEgbGlzdCBvZiBqb2JzLiAgSWYgImNoYW5nZSIgaXMgbm9uemVybywgb25seSBwcmludCBqb2JzIHdob3NlCisgKiBzdGF0dXNlcyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBzaG93am9icy4KKyAqLworc3RhdGljIHZvaWQKK3Nob3dqb2JzKEZJTEUgKm91dCwgaW50IG1vZGUpCit7CisJc3RydWN0IGpvYiAqanA7CisKKwlUUkFDRSgoInNob3dqb2JzKDB4JXgpIGNhbGxlZFxuIiwgbW9kZSkpOworCisJLyogSGFuZGxlIGFsbCBmaW5pc2hlZCBqb2JzICovCisJd2hpbGUgKGRvd2FpdChET1dBSVRfTk9OQkxPQ0ssIE5VTEwpID4gMCkKKwkJY29udGludWU7CisKKwlmb3IgKGpwID0gY3Vyam9iOyBqcDsganAgPSBqcC0+cHJldl9qb2IpIHsKKwkJaWYgKCEobW9kZSAmIFNIT1dfQ0hBTkdFRCkgfHwganAtPmNoYW5nZWQpIHsKKwkJCXNob3dqb2Iob3V0LCBqcCwgbW9kZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitqb2JzY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG1vZGUsIG07CisKKwltb2RlID0gMDsKKwl3aGlsZSAoKG0gPSBuZXh0b3B0KCJscCIpKSAhPSAnXDAnKSB7CisJCWlmIChtID09ICdsJykKKwkJCW1vZGUgfD0gU0hPV19QSURTOworCQllbHNlCisJCQltb2RlIHw9IFNIT1dfT05MWV9QR0lEOworCX0KKworCWFyZ3YgPSBhcmdwdHI7CisJaWYgKCphcmd2KSB7CisJCWRvCisJCQlzaG93am9iKHN0ZG91dCwgZ2V0am9iKCphcmd2LCAwKSwgbW9kZSk7CisJCXdoaWxlICgqKythcmd2KTsKKwl9IGVsc2UgeworCQlzaG93am9icyhzdGRvdXQsIG1vZGUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIEpPQlMgKi8KKworLyogQ2FsbGVkIG9ubHkgb24gZmluaXNoZWQgb3Igc3RvcHBlZCBqb2JzIChubyBtZW1iZXJzIGFyZSBydW5uaW5nKSAqLworc3RhdGljIGludAorZ2V0c3RhdHVzKHN0cnVjdCBqb2IgKmpvYikKK3sKKwlpbnQgc3RhdHVzOworCWludCByZXR2YWw7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKworCS8qIEZldGNoIGxhc3QgbWVtYmVyJ3Mgc3RhdHVzICovCisJcHMgPSBqb2ItPnBzICsgam9iLT5ucHJvY3MgLSAxOworCXN0YXR1cyA9IHBzLT5wc19zdGF0dXM7CisJaWYgKHBpcGVmYWlsKSB7CisJCS8qICJzZXQgLW8gcGlwZWZhaWwiIG1vZGU6IHVzZSBsYXN0IF9ub256ZXJvXyBzdGF0dXMgKi8KKwkJd2hpbGUgKHN0YXR1cyA9PSAwICYmIC0tcHMgPj0gam9iLT5wcykKKwkJCXN0YXR1cyA9IHBzLT5wc19zdGF0dXM7CisJfQorCisJcmV0dmFsID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKSB7CisjaWYgSk9CUworCQlyZXR2YWwgPSBXU1RPUFNJRyhzdGF0dXMpOworCQlpZiAoIVdJRlNUT1BQRUQoc3RhdHVzKSkKKyNlbmRpZgorCQl7CisJCQkvKiBYWFg6IGxpbWl0cyBudW1iZXIgb2Ygc2lnbmFscyAqLworCQkJcmV0dmFsID0gV1RFUk1TSUcoc3RhdHVzKTsKKyNpZiBKT0JTCisJCQlpZiAocmV0dmFsID09IFNJR0lOVCkKKwkJCQlqb2ItPnNpZ2ludCA9IDE7CisjZW5kaWYKKwkJfQorCQlyZXR2YWwgKz0gMTI4OworCX0KKwlUUkFDRSgoImdldHN0YXR1czogam9iICVkLCBucHJvYyAlZCwgc3RhdHVzIDB4JXgsIHJldHZhbCAweCV4XG4iLAorCQlqb2Jubyhqb2IpLCBqb2ItPm5wcm9jcywgc3RhdHVzLCByZXR2YWwpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQword2FpdGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBqb2IgKmpvYjsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBqb2IgKmpwOworCisJaWYgKHBlbmRpbmdfc2lnKQorCQlyYWlzZV9leGNlcHRpb24oRVhTSUcpOworCisJbmV4dG9wdChudWxsc3RyKTsKKwlyZXR2YWwgPSAwOworCisJYXJndiA9IGFyZ3B0cjsKKwlpZiAoISphcmd2KSB7CisJCS8qIHdhaXQgZm9yIGFsbCBqb2JzICovCisJCWZvciAoOzspIHsKKwkJCWpwID0gY3Vyam9iOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoIWpwKSAvKiBubyBydW5uaW5nIHByb2NzICovCisJCQkJCWdvdG8gcmV0OworCQkJCWlmIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykKKwkJCQkJYnJlYWs7CisJCQkJanAtPndhaXRlZCA9IDE7CisJCQkJanAgPSBqcC0+cHJldl9qb2I7CisJCQl9CisJCQlibG9ja2luZ193YWl0X3dpdGhfcmFpc2Vfb25fc2lnKCk7CisJLyogbWFuIGJhc2g6CisJICogIldoZW4gYmFzaCBpcyB3YWl0aW5nIGZvciBhbiBhc3luY2hyb25vdXMgY29tbWFuZCB2aWEKKwkgKiB0aGUgd2FpdCBidWlsdGluLCB0aGUgcmVjZXB0aW9uIG9mIGEgc2lnbmFsIGZvciB3aGljaCBhIHRyYXAKKwkgKiBoYXMgYmVlbiBzZXQgd2lsbCBjYXVzZSB0aGUgd2FpdCBidWlsdGluIHRvIHJldHVybiBpbW1lZGlhdGVseQorCSAqIHdpdGggYW4gZXhpdCBzdGF0dXMgZ3JlYXRlciB0aGFuIDEyOCwgaW1tZWRpYXRlbHkgYWZ0ZXIgd2hpY2gKKwkgKiB0aGUgdHJhcCBpcyBleGVjdXRlZC4iCisJICoKKwkgKiBibG9ja2luZ193YWl0X3dpdGhfcmFpc2Vfb25fc2lnIHJhaXNlcyBzaWduYWwgaGFuZGxlcnMKKwkgKiBpZiBpdCBnZXRzIG5vIHBpZCAocGlkIDwgMCkuIEhvd2V2ZXIsCisJICogaWYgY2hpbGQgc2VuZHMgdXMgYSBzaWduYWwgKmFuZCBpbW1lZGlhdGVseSBleGl0cyosCisJICogYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZyBnZXRzIHBpZCA+IDAKKwkgKiBhbmQgZG9lcyBub3QgaGFuZGxlIHBlbmRpbmdfc2lnLiBDaGVjayB0aGlzIGNhc2U6ICovCisJCQlpZiAocGVuZGluZ19zaWcpCisJCQkJcmFpc2VfZXhjZXB0aW9uKEVYU0lHKTsKKwkJfQorCX0KKworCXJldHZhbCA9IDEyNzsKKwlkbyB7CisJCWlmICgqKmFyZ3YgIT0gJyUnKSB7CisJCQlwaWRfdCBwaWQgPSBudW1iZXIoKmFyZ3YpOworCQkJam9iID0gY3Vyam9iOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoIWpvYikKKwkJCQkJZ290byByZXBlYXQ7CisJCQkJaWYgKGpvYi0+cHNbam9iLT5ucHJvY3MgLSAxXS5wc19waWQgPT0gcGlkKQorCQkJCQlicmVhazsKKwkJCQlqb2IgPSBqb2ItPnByZXZfam9iOworCQkJfQorCQl9IGVsc2UgeworCQkJam9iID0gZ2V0am9iKCphcmd2LCAwKTsKKwkJfQorCQkvKiBsb29wIHVudGlsIHByb2Nlc3MgdGVybWluYXRlZCBvciBzdG9wcGVkICovCisJCXdoaWxlIChqb2ItPnN0YXRlID09IEpPQlJVTk5JTkcpCisJCQlibG9ja2luZ193YWl0X3dpdGhfcmFpc2Vfb25fc2lnKCk7CisJCWpvYi0+d2FpdGVkID0gMTsKKwkJcmV0dmFsID0gZ2V0c3RhdHVzKGpvYik7CisgcmVwZWF0OiA7CisJfSB3aGlsZSAoKisrYXJndik7CisKKyByZXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBqb2IgKgorZ3Jvd2pvYnRhYih2b2lkKQoreworCXNpemVfdCBsZW47CisJcHRyZGlmZl90IG9mZnNldDsKKwlzdHJ1Y3Qgam9iICpqcCwgKmpxOworCisJbGVuID0gbmpvYnMgKiBzaXplb2YoKmpwKTsKKwlqcSA9IGpvYnRhYjsKKwlqcCA9IGNrcmVhbGxvYyhqcSwgbGVuICsgNCAqIHNpemVvZigqanApKTsKKworCW9mZnNldCA9IChjaGFyICopanAgLSAoY2hhciAqKWpxOworCWlmIChvZmZzZXQpIHsKKwkJLyogUmVsb2NhdGUgcG9pbnRlcnMgKi8KKwkJc2l6ZV90IGwgPSBsZW47CisKKwkJanEgPSAoc3RydWN0IGpvYiAqKSgoY2hhciAqKWpxICsgbCk7CisJCXdoaWxlIChsKSB7CisJCQlsIC09IHNpemVvZigqanApOworCQkJanEtLTsKKyNkZWZpbmUgam9mZihwKSAoKHN0cnVjdCBqb2IgKikoKGNoYXIgKikocCkgKyBsKSkKKyNkZWZpbmUgam1vdmUocCkgKHApID0gKHZvaWQgKikoKGNoYXIgKikocCkgKyBvZmZzZXQpCisJCQlpZiAoam9mZihqcCktPnBzID09ICZqcS0+cHMwKQorCQkJCWptb3ZlKGpvZmYoanApLT5wcyk7CisJCQlpZiAoam9mZihqcCktPnByZXZfam9iKQorCQkJCWptb3ZlKGpvZmYoanApLT5wcmV2X2pvYik7CisJCX0KKwkJaWYgKGN1cmpvYikKKwkJCWptb3ZlKGN1cmpvYik7CisjdW5kZWYgam9mZgorI3VuZGVmIGptb3ZlCisJfQorCisJbmpvYnMgKz0gNDsKKwlqb2J0YWIgPSBqcDsKKwlqcCA9IChzdHJ1Y3Qgam9iICopKChjaGFyICopanAgKyBsZW4pOworCWpxID0ganAgKyAzOworCWRvIHsKKwkJanEtPnVzZWQgPSAwOworCX0gd2hpbGUgKC0tanEgPj0ganApOworCXJldHVybiBqcDsKK30KKworLyoKKyAqIFJldHVybiBhIG5ldyBqb2Igc3RydWN0dXJlLgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgam9iICoKK21ha2Vqb2IoLyp1bmlvbiBub2RlICpub2RlLCovIGludCBucHJvY3MpCit7CisJaW50IGk7CisJc3RydWN0IGpvYiAqanA7CisKKwlmb3IgKGkgPSBuam9icywganAgPSBqb2J0YWI7IDsganArKykgeworCQlpZiAoLS1pIDwgMCkgeworCQkJanAgPSBncm93am9idGFiKCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoanAtPnVzZWQgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoanAtPnN0YXRlICE9IEpPQkRPTkUgfHwgIWpwLT53YWl0ZWQpCisJCQljb250aW51ZTsKKyNpZiBKT0JTCisJCWlmIChkb2luZ19qb2JjdGwpCisJCQljb250aW51ZTsKKyNlbmRpZgorCQlmcmVlam9iKGpwKTsKKwkJYnJlYWs7CisJfQorCW1lbXNldChqcCwgMCwgc2l6ZW9mKCpqcCkpOworI2lmIEpPQlMKKwkvKiBqcC0+am9iY3RsIGlzIGEgYml0ZmllbGQuCisJICogImpwLT5qb2JjdGwgfD0gam9iY3RsIiBsaWtlbHkgdG8gZ2l2ZSBhd2Z1bCBjb2RlICovCisJaWYgKGRvaW5nX2pvYmN0bCkKKwkJanAtPmpvYmN0bCA9IDE7CisjZW5kaWYKKwlqcC0+cHJldl9qb2IgPSBjdXJqb2I7CisJY3Vyam9iID0ganA7CisJanAtPnVzZWQgPSAxOworCWpwLT5wcyA9ICZqcC0+cHMwOworCWlmIChucHJvY3MgPiAxKSB7CisJCWpwLT5wcyA9IGNrbWFsbG9jKG5wcm9jcyAqIHNpemVvZihzdHJ1Y3QgcHJvY3N0YXQpKTsKKwl9CisJVFJBQ0UoKCJtYWtlam9iKCVkKSByZXR1cm5zICUlJWRcbiIsIG5wcm9jcywKKwkJCQlqb2JubyhqcCkpKTsKKwlyZXR1cm4ganA7Cit9CisKKyNpZiBKT0JTCisvKgorICogUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgY29tbWFuZCAodG8gYmUgcHJpbnRlZCBieSB0aGUKKyAqIGpvYnMgY29tbWFuZCkuCisgKi8KK3N0YXRpYyBjaGFyICpjbWRuZXh0YzsKKworc3RhdGljIHZvaWQKK2NtZHB1dHMoY29uc3QgY2hhciAqcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciB2c3R5cGVbVlNUWVBFICsgMV1bM10gPSB7CisJCSIiLCAifSIsICItIiwgIisiLCAiPyIsICI9IiwKKwkJIiUiLCAiJSUiLCAiIyIsICIjIyIKKwkJSUZfQVNIX0JBU0hfQ09NUEFUKCwgIjoiLCAiLyIsICIvLyIpCisJfTsKKworCWNvbnN0IGNoYXIgKnAsICpzdHI7CisJY2hhciBjY1syXTsKKwljaGFyICpuZXh0YzsKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgY2hhciBzdWJ0eXBlID0gMDsKKwlpbnQgcXVvdGVkID0gMDsKKworCWNjWzFdID0gJ1wwJzsKKwluZXh0YyA9IG1ha2VzdHJzcGFjZSgoc3RybGVuKHMpICsgMSkgKiA4LCBjbWRuZXh0Yyk7CisJcCA9IHM7CisJd2hpbGUgKChjID0gKnArKykgIT0gJ1wwJykgeworCQlzdHIgPSBOVUxMOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSBDVExFU0M6CisJCQljID0gKnArKzsKKwkJCWJyZWFrOworCQljYXNlIENUTFZBUjoKKwkJCXN1YnR5cGUgPSAqcCsrOworCQkJaWYgKChzdWJ0eXBlICYgVlNUWVBFKSA9PSBWU0xFTkdUSCkKKwkJCQlzdHIgPSAiJHsjIjsKKwkJCWVsc2UKKwkJCQlzdHIgPSAiJHsiOworCQkJaWYgKCEoc3VidHlwZSAmIFZTUVVPVEUpID09ICEocXVvdGVkICYgMSkpCisJCQkJZ290byBkb3N0cjsKKwkJCXF1b3RlZCBePSAxOworCQkJYyA9ICciJzsKKwkJCWJyZWFrOworCQljYXNlIENUTEVORFZBUjoKKwkJCXN0ciA9ICJcIn0iICsgIShxdW90ZWQgJiAxKTsKKwkJCXF1b3RlZCA+Pj0gMTsKKwkJCXN1YnR5cGUgPSAwOworCQkJZ290byBkb3N0cjsKKwkJY2FzZSBDVExCQUNLUToKKwkJCXN0ciA9ICIkKC4uLikiOworCQkJZ290byBkb3N0cjsKKwkJY2FzZSBDVExCQUNLUStDVExRVU9URToKKwkJCXN0ciA9ICJcIiQoLi4uKVwiIjsKKwkJCWdvdG8gZG9zdHI7CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQljYXNlIENUTEFSSToKKwkJCXN0ciA9ICIkKCgiOworCQkJZ290byBkb3N0cjsKKwkJY2FzZSBDVExFTkRBUkk6CisJCQlzdHIgPSAiKSkiOworCQkJZ290byBkb3N0cjsKKyNlbmRpZgorCQljYXNlIENUTFFVT1RFTUFSSzoKKwkJCXF1b3RlZCBePSAxOworCQkJYyA9ICciJzsKKwkJCWJyZWFrOworCQljYXNlICc9JzoKKwkJCWlmIChzdWJ0eXBlID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoKHN1YnR5cGUgJiBWU1RZUEUpICE9IFZTTk9STUFMKQorCQkJCXF1b3RlZCA8PD0gMTsKKwkJCXN0ciA9IHZzdHlwZVtzdWJ0eXBlICYgVlNUWVBFXTsKKwkJCWlmIChzdWJ0eXBlICYgVlNOVUwpCisJCQkJYyA9ICc6JzsKKwkJCWVsc2UKKwkJCQlnb3RvIGNoZWNrc3RyOworCQkJYnJlYWs7CisJCWNhc2UgJ1wnJzoKKwkJY2FzZSAnXFwnOgorCQljYXNlICciJzoKKwkJY2FzZSAnJCc6CisJCQkvKiBUaGVzZSBjYW4gb25seSBoYXBwZW4gaW5zaWRlIHF1b3RlcyAqLworCQkJY2NbMF0gPSBjOworCQkJc3RyID0gY2M7CisJCQljID0gJ1xcJzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJVVNUUFVUQyhjLCBuZXh0Yyk7CisgY2hlY2tzdHI6CisJCWlmICghc3RyKQorCQkJY29udGludWU7CisgZG9zdHI6CisJCXdoaWxlICgoYyA9ICpzdHIrKykgIT0gJ1wwJykgeworCQkJVVNUUFVUQyhjLCBuZXh0Yyk7CisJCX0KKwl9IC8qIHdoaWxlICpwKysgbm90IE5VTCAqLworCisJaWYgKHF1b3RlZCAmIDEpIHsKKwkJVVNUUFVUQygnIicsIG5leHRjKTsKKwl9CisJKm5leHRjID0gMDsKKwljbWRuZXh0YyA9IG5leHRjOworfQorCisvKiBjbWR0eHQoKSBhbmQgY21kbGlzdCgpIGNhbGwgZWFjaCBvdGhlciAqLworc3RhdGljIHZvaWQgY21kdHh0KHVuaW9uIG5vZGUgKm4pOworCitzdGF0aWMgdm9pZAorY21kbGlzdCh1bmlvbiBub2RlICpucCwgaW50IHNlcCkKK3sKKwlmb3IgKDsgbnA7IG5wID0gbnAtPm5hcmcubmV4dCkgeworCQlpZiAoIXNlcCkKKwkJCWNtZHB1dHMoIiAiKTsKKwkJY21kdHh0KG5wKTsKKwkJaWYgKHNlcCAmJiBucC0+bmFyZy5uZXh0KQorCQkJY21kcHV0cygiICIpOworCX0KK30KKworc3RhdGljIHZvaWQKK2NtZHR4dCh1bmlvbiBub2RlICpuKQoreworCXVuaW9uIG5vZGUgKm5wOworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJY29uc3QgY2hhciAqcDsKKworCWlmICghbikKKwkJcmV0dXJuOworCXN3aXRjaCAobi0+dHlwZSkgeworCWRlZmF1bHQ6CisjaWYgREVCVUcKKwkJYWJvcnQoKTsKKyNlbmRpZgorCWNhc2UgTlBJUEU6CisJCWxwID0gbi0+bnBpcGUuY21kbGlzdDsKKwkJZm9yICg7OykgeworCQkJY21kdHh0KGxwLT5uKTsKKwkJCWxwID0gbHAtPm5leHQ7CisJCQlpZiAoIWxwKQorCQkJCWJyZWFrOworCQkJY21kcHV0cygiIHwgIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOU0VNSToKKwkJcCA9ICI7ICI7CisJCWdvdG8gYmlub3A7CisJY2FzZSBOQU5EOgorCQlwID0gIiAmJiAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTk9SOgorCQlwID0gIiB8fCAiOworIGJpbm9wOgorCQljbWR0eHQobi0+bmJpbmFyeS5jaDEpOworCQljbWRwdXRzKHApOworCQluID0gbi0+bmJpbmFyeS5jaDI7CisJCWdvdG8gZG9ub2RlOworCWNhc2UgTlJFRElSOgorCWNhc2UgTkJBQ0tHTkQ6CisJCW4gPSBuLT5ucmVkaXIubjsKKwkJZ290byBkb25vZGU7CisJY2FzZSBOTk9UOgorCQljbWRwdXRzKCIhIik7CisJCW4gPSBuLT5ubm90LmNvbTsKKyBkb25vZGU6CisJCWNtZHR4dChuKTsKKwkJYnJlYWs7CisJY2FzZSBOSUY6CisJCWNtZHB1dHMoImlmICIpOworCQljbWR0eHQobi0+bmlmLnRlc3QpOworCQljbWRwdXRzKCI7IHRoZW4gIik7CisJCWlmIChuLT5uaWYuZWxzZXBhcnQpIHsKKwkJCWNtZHR4dChuLT5uaWYuaWZwYXJ0KTsKKwkJCWNtZHB1dHMoIjsgZWxzZSAiKTsKKwkJCW4gPSBuLT5uaWYuZWxzZXBhcnQ7CisJCX0gZWxzZSB7CisJCQluID0gbi0+bmlmLmlmcGFydDsKKwkJfQorCQlwID0gIjsgZmkiOworCQlnb3RvIGRvdGFpbDsKKwljYXNlIE5TVUJTSEVMTDoKKwkJY21kcHV0cygiKCIpOworCQluID0gbi0+bnJlZGlyLm47CisJCXAgPSAiKSI7CisJCWdvdG8gZG90YWlsOworCWNhc2UgTldISUxFOgorCQlwID0gIndoaWxlICI7CisJCWdvdG8gdW50aWw7CisJY2FzZSBOVU5USUw6CisJCXAgPSAidW50aWwgIjsKKyB1bnRpbDoKKwkJY21kcHV0cyhwKTsKKwkJY21kdHh0KG4tPm5iaW5hcnkuY2gxKTsKKwkJbiA9IG4tPm5iaW5hcnkuY2gyOworCQlwID0gIjsgZG9uZSI7CisgZG9kbzoKKwkJY21kcHV0cygiOyBkbyAiKTsKKyBkb3RhaWw6CisJCWNtZHR4dChuKTsKKwkJZ290byBkb3RhaWwyOworCWNhc2UgTkZPUjoKKwkJY21kcHV0cygiZm9yICIpOworCQljbWRwdXRzKG4tPm5mb3IudmFyKTsKKwkJY21kcHV0cygiIGluICIpOworCQljbWRsaXN0KG4tPm5mb3IuYXJncywgMSk7CisJCW4gPSBuLT5uZm9yLmJvZHk7CisJCXAgPSAiOyBkb25lIjsKKwkJZ290byBkb2RvOworCWNhc2UgTkRFRlVOOgorCQljbWRwdXRzKG4tPm5hcmcudGV4dCk7CisJCXAgPSAiKCkgeyAuLi4gfSI7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5DTUQ6CisJCWNtZGxpc3Qobi0+bmNtZC5hcmdzLCAxKTsKKwkJY21kbGlzdChuLT5uY21kLnJlZGlyZWN0LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBOQVJHOgorCQlwID0gbi0+bmFyZy50ZXh0OworIGRvdGFpbDI6CisJCWNtZHB1dHMocCk7CisJCWJyZWFrOworCWNhc2UgTkhFUkU6CisJY2FzZSBOWEhFUkU6CisJCXAgPSAiPDwuLi4iOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOQ0FTRToKKwkJY21kcHV0cygiY2FzZSAiKTsKKwkJY21kcHV0cyhuLT5uY2FzZS5leHByLT5uYXJnLnRleHQpOworCQljbWRwdXRzKCIgaW4gIik7CisJCWZvciAobnAgPSBuLT5uY2FzZS5jYXNlczsgbnA7IG5wID0gbnAtPm5jbGlzdC5uZXh0KSB7CisJCQljbWR0eHQobnAtPm5jbGlzdC5wYXR0ZXJuKTsKKwkJCWNtZHB1dHMoIikgIik7CisJCQljbWR0eHQobnAtPm5jbGlzdC5ib2R5KTsKKwkJCWNtZHB1dHMoIjs7ICIpOworCQl9CisJCXAgPSAiZXNhYyI7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5UTzoKKwkJcCA9ICI+IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5DTE9CQkVSOgorCQlwID0gIj58IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5BUFBFTkQ6CisJCXAgPSAiPj4iOworCQlnb3RvIHJlZGlyOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIE5UTzI6CisjZW5kaWYKKwljYXNlIE5UT0ZEOgorCQlwID0gIj4mIjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5GUk9NOgorCQlwID0gIjwiOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkZST01GRDoKKwkJcCA9ICI8JiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBORlJPTVRPOgorCQlwID0gIjw+IjsKKyByZWRpcjoKKwkJY21kcHV0cyh1dG9hKG4tPm5maWxlLmZkKSk7CisJCWNtZHB1dHMocCk7CisJCWlmIChuLT50eXBlID09IE5UT0ZEIHx8IG4tPnR5cGUgPT0gTkZST01GRCkgeworCQkJY21kcHV0cyh1dG9hKG4tPm5kdXAuZHVwZmQpKTsKKwkJCWJyZWFrOworCQl9CisJCW4gPSBuLT5uZmlsZS5mbmFtZTsKKwkJZ290byBkb25vZGU7CisJfQorfQorCitzdGF0aWMgY2hhciAqCitjb21tYW5kdGV4dCh1bmlvbiBub2RlICpuKQoreworCWNoYXIgKm5hbWU7CisKKwlTVEFSVFNUQUNLU1RSKGNtZG5leHRjKTsKKwljbWR0eHQobik7CisJbmFtZSA9IHN0YWNrYmxvY2soKTsKKwlUUkFDRSgoImNvbW1hbmR0ZXh0OiBuYW1lICVwLCBlbmQgJXBcblx0XCIlc1wiXG4iLAorCQkJbmFtZSwgY21kbmV4dGMsIGNtZG5leHRjKSk7CisJcmV0dXJuIGNrc3RyZHVwKG5hbWUpOworfQorI2VuZGlmIC8qIEpPQlMgKi8KKworLyoKKyAqIEZvcmsgb2ZmIGEgc3Vic2hlbGwuICBJZiB3ZSBhcmUgZG9pbmcgam9iIGNvbnRyb2wsIGdpdmUgdGhlIHN1YnNoZWxsIGl0cworICogb3duIHByb2Nlc3MgZ3JvdXAuICBKcCBpcyBhIGpvYiBzdHJ1Y3R1cmUgdGhhdCB0aGUgam9iIGlzIHRvIGJlIGFkZGVkIHRvLgorICogTiBpcyB0aGUgY29tbWFuZCB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGJ5IHRoZSBjaGlsZC4gIEJvdGgganAgYW5kIG4gbWF5CisgKiBiZSBOVUxMLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgRk9SS19GRyAtIEZvcmsgb2ZmIGEgZm9yZWdyb3VuZCBwcm9jZXNzLgorICogICAgICBGT1JLX0JHIC0gRm9yayBvZmYgYSBiYWNrZ3JvdW5kIHByb2Nlc3MuCisgKiAgICAgIEZPUktfTk9KT0IgLSBMaWtlIEZPUktfRkcsIGJ1dCBkb24ndCBnaXZlIHRoZSBwcm9jZXNzIGl0cyBvd24KKyAqICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgZ3JvdXAgZXZlbiBpZiBqb2IgY29udHJvbCBpcyBvbi4KKyAqCisgKiBXaGVuIGpvYiBjb250cm9sIGlzIHR1cm5lZCBvZmYsIGJhY2tncm91bmQgcHJvY2Vzc2VzIGhhdmUgdGhlaXIgc3RhbmRhcmQKKyAqIGlucHV0IHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsIChleGNlcHQgZm9yIHRoZSBzZWNvbmQgYW5kIGxhdGVyIHByb2Nlc3NlcworICogaW4gYSBwaXBlbGluZSkuCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KKy8qCisgKiBDbGVhciB0cmFwcyBvbiBhIGZvcmsuCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhcl90cmFwcyh2b2lkKQoreworCWNoYXIgKip0cDsKKworCWZvciAodHAgPSB0cmFwOyB0cCA8ICZ0cmFwW05TSUddOyB0cCsrKSB7CisJCWlmICgqdHAgJiYgKip0cCkgeyAgICAgIC8qIHRyYXAgbm90IE5VTEwgb3IgIiIgKFNJR19JR04pICovCisJCQlJTlRfT0ZGOworCQkJaWYgKHRyYXBfcHRyID09IHRyYXApCisJCQkJZnJlZSgqdHApOworCQkJLyogZWxzZTogaXQgImJlbG9uZ3MiIHRvIHRyYXBfcHRyIHZlY3RvciwgZG9uJ3QgZnJlZSAqLworCQkJKnRwID0gTlVMTDsKKwkJCWlmICgodHAgLSB0cmFwKSAhPSAwKQorCQkJCXNldHNpZ25hbCh0cCAtIHRyYXApOworCQkJSU5UX09OOworCQl9CisJfQorCW1heV9oYXZlX3RyYXBzID0gMDsKK30KKworLyogTGl2ZXMgZmFyIGF3YXkgZnJvbSBoZXJlLCBuZWVkZWQgZm9yIGZvcmtjaGlsZCAqLworc3RhdGljIHZvaWQgY2xvc2VzY3JpcHQodm9pZCk7CisKKy8qIENhbGxlZCBhZnRlciBmb3JrKCksIGluIGNoaWxkICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZAorZm9ya2NoaWxkKHN0cnVjdCBqb2IgKmpwLCB1bmlvbiBub2RlICpuLCBpbnQgbW9kZSkKK3sKKwlpbnQgb2xkbHZsOworCisJVFJBQ0UoKCJDaGlsZCBzaGVsbCAlZFxuIiwgZ2V0cGlkKCkpKTsKKwlvbGRsdmwgPSBzaGx2bDsKKwlzaGx2bCsrOworCisJLyogbWFuIGJhc2g6ICJOb24tYnVpbHRpbiBjb21tYW5kcyBydW4gYnkgYmFzaCBoYXZlIHNpZ25hbCBoYW5kbGVycworCSAqIHNldCB0byB0aGUgdmFsdWVzIGluaGVyaXRlZCBieSB0aGUgc2hlbGwgZnJvbSBpdHMgcGFyZW50Ii4KKwkgKiBEbyB3ZSBkbyBpdCBjb3JyZWN0bHk/ICovCisKKwljbG9zZXNjcmlwdCgpOworCisJaWYgKG1vZGUgPT0gRk9SS19OT0pPQiAgICAgICAgICAvKiBpcyBpdCBgeHh4YCA/ICovCisJICYmIG4gJiYgbi0+dHlwZSA9PSBOQ01EICAgICAgICAvKiBpcyBpdCBzaW5nbGUgY21kPyAqLworCS8qICYmIG4tPm5jbWQuYXJncy0+dHlwZSA9PSBOQVJHIC0gYWx3YXlzIHRydWU/ICovCisJICYmIG4tPm5jbWQuYXJncyAmJiBzdHJjbXAobi0+bmNtZC5hcmdzLT5uYXJnLnRleHQsICJ0cmFwIikgPT0gMAorCSAmJiBuLT5uY21kLmFyZ3MtPm5hcmcubmV4dCA9PSBOVUxMIC8qICJ0cmFwIiB3aXRoIG5vIGFyZ3VtZW50cyAqLworCS8qICYmIG4tPm5jbWQuYXJncy0+bmFyZy5iYWNrcXVvdGUgPT0gTlVMTCAtIGRvIHdlIG5lZWQgdG8gY2hlY2sgdGhpcz8gKi8KKwkpIHsKKwkJVFJBQ0UoKCJUcmFwIGhhY2tcbiIpKTsKKwkJLyogQXdmdWwgaGFjayBmb3IgYHRyYXBgIG9yICQodHJhcCkuCisJCSAqCisJCSAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvdHJhcC5odG1sCisJCSAqIGNvbnRhaW5zIGFuIGV4YW1wbGUgd2hlcmUgInRyYXAiIGlzIGV4ZWN1dGVkIGluIGEgc3Vic2hlbGw6CisJCSAqCisJCSAqIHNhdmVfdHJhcHM9JCh0cmFwKQorCQkgKiAuLi4KKwkJICogZXZhbCAiJHNhdmVfdHJhcHMiCisJCSAqCisJCSAqIFN0YW5kYXJkIGRvZXMgbm90IHNheSB0aGF0ICJ0cmFwIiBpbiBzdWJzaGVsbCBzaGFsbCBwcmludAorCQkgKiBwYXJlbnQgc2hlbGwncyB0cmFwcy4gSXQgb25seSBzYXlzIHRoYXQgaXRzIG91dHB1dAorCQkgKiBtdXN0IGhhdmUgc3VpdGFibGUgZm9ybSwgYnV0IHRoZW4sIGluIHRoZSBhYm92ZSBleGFtcGxlCisJCSAqICh3aGljaCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgbm9ybWF0aXZlKSwgaXQgaW1wbGllcyB0aGF0LgorCQkgKgorCQkgKiBiYXNoIChhbmQgcHJvYmFibHkgb3RoZXIgc2hlbGwpIGRvZXMgaW1wbGVtZW50IGl0CisJCSAqICh0cmFwcyBhcmUgcmVzZXQgdG8gZGVmYXVsdHMsIGJ1dCAidHJhcCIgc3RpbGwgc2hvd3MgdGhlbSksCisJCSAqIGJ1dCBhcyBhIHJlc3VsdCwgInRyYXAiIGxvZ2ljIGlzIGhvcGVsZXNzbHkgbWVzc2VkIHVwOgorCQkgKgorCQkgKiAjIHRyYXAKKwkJICogdHJhcCAtLSAnZWNobyBIbycgU0lHV0lOQ0ggIDwtLS0gd2UgaGF2ZSBhIGhhbmRsZXIKKwkJICogIyAodHJhcCkgICAgICAgIDwtLS0gdHJhcCBpcyBpbiBzdWJzaGVsbCAtIG5vIG91dHB1dCAoY29ycmVjdCwgdHJhcHMgYXJlIHJlc2V0KQorCQkgKiAjIHRydWUgfCB0cmFwICAgPC0tLSB0cmFwIGlzIGluIHN1YnNoZWxsIC0gbm8gb3V0cHV0IChkaXR0bykKKwkJICogIyBlY2hvIGB0cnVlIHwgdHJhcGAgICAgPC0tLSBpbiBzdWJzaGVsbCAtIG91dHB1dCAoYnV0IHRyYXBzIGFyZSByZXNldCEpCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqICMgZWNobyBgKHRyYXApYCAgICAgICAgIDwtLS0gaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgLSBvdXRwdXQKKwkJICogdHJhcCAtLSAnZWNobyBIbycgU0lHV0lOQ0gKKwkJICogIyBlY2hvIGB0cnVlIHwgKHRyYXApYCAgPC0tLSBpbiBzdWJzaGVsbCBpbiBzdWJzaGVsbCBpbiBzdWJzaGVsbCAtIG91dHB1dCEKKwkJICogdHJhcCAtLSAnZWNobyBIbycgU0lHV0lOQ0gKKwkJICoKKwkJICogVGhlIHJ1bGVzIHdoZW4gdG8gZm9yZ2V0IGFuZCB3aGVuIHRvIG5vdCBmb3JnZXQgdHJhcHMKKwkJICogZ2V0IHJlYWxseSBjb21wbGV4IGFuZCBub25zZW5zaWNhbC4KKwkJICoKKwkJICogT3VyIHNvbHV0aW9uOiBPTkxZIGJhcmUgJCh0cmFwKSBvciBgdHJhcGAgaXMgc3BlY2lhbC4KKwkJICovCisJCS8qIFNhdmUgdHJhcCBoYW5kbGVyIHN0cmluZ3MgZm9yIHRyYXAgYnVpbHRpbiB0byBwcmludCAqLworCQl0cmFwX3B0ciA9IG1lbWNweSh4bWFsbG9jKHNpemVvZih0cmFwKSksIHRyYXAsIHNpemVvZih0cmFwKSk7CisJCS8qIEZhbGwgdGhyb3VnaCBpbnRvIGNsZWFyaW5nIHRyYXBzICovCisJfQorCWNsZWFyX3RyYXBzKCk7CisjaWYgSk9CUworCS8qIGRvIGpvYiBjb250cm9sIG9ubHkgaW4gcm9vdCBzaGVsbCAqLworCWRvaW5nX2pvYmN0bCA9IDA7CisJaWYgKG1vZGUgIT0gRk9SS19OT0pPQiAmJiBqcC0+am9iY3RsICYmIG9sZGx2bCA9PSAwKSB7CisJCXBpZF90IHBncnA7CisKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkKKwkJCXBncnAgPSBnZXRwaWQoKTsKKwkJZWxzZQorCQkJcGdycCA9IGpwLT5wc1swXS5wc19waWQ7CisJCS8qIHRoaXMgY2FuIGZhaWwgYmVjYXVzZSB3ZSBhcmUgZG9pbmcgaXQgaW4gdGhlIHBhcmVudCBhbHNvICovCisJCXNldHBnaWQoMCwgcGdycCk7CisJCWlmIChtb2RlID09IEZPUktfRkcpCisJCQl4dGNzZXRwZ3JwKHR0eWZkLCBwZ3JwKTsKKwkJc2V0c2lnbmFsKFNJR1RTVFApOworCQlzZXRzaWduYWwoU0lHVFRPVSk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAobW9kZSA9PSBGT1JLX0JHKSB7CisJCS8qIG1hbiBiYXNoOiAiV2hlbiBqb2IgY29udHJvbCBpcyBub3QgaW4gZWZmZWN0LAorCQkgKiBhc3luY2hyb25vdXMgY29tbWFuZHMgaWdub3JlIFNJR0lOVCBhbmQgU0lHUVVJVCIgKi8KKwkJaWdub3Jlc2lnKFNJR0lOVCk7CisJCWlnbm9yZXNpZyhTSUdRVUlUKTsKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkgeworCQkJY2xvc2UoMCk7CisJCQlpZiAob3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpICE9IDApCisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IG9wZW4gJyVzJyIsIGJiX2Rldl9udWxsKTsKKwkJfQorCX0KKwlpZiAob2xkbHZsID09IDApIHsKKwkJaWYgKGlmbGFnKSB7IC8qIHdoeSBpZiBpZmxhZyBvbmx5PyAqLworCQkJc2V0c2lnbmFsKFNJR0lOVCk7CisJCQlzZXRzaWduYWwoU0lHVEVSTSk7CisJCX0KKwkJLyogbWFuIGJhc2g6CisJCSAqICJJbiBhbGwgY2FzZXMsIGJhc2ggaWdub3JlcyBTSUdRVUlULiBOb24tYnVpbHRpbgorCQkgKiBjb21tYW5kcyBydW4gYnkgYmFzaCBoYXZlIHNpZ25hbCBoYW5kbGVycworCQkgKiBzZXQgdG8gdGhlIHZhbHVlcyBpbmhlcml0ZWQgYnkgdGhlIHNoZWxsCisJCSAqIGZyb20gaXRzIHBhcmVudCIuCisJCSAqIFRha2UgY2FyZSBvZiB0aGUgc2Vjb25kIHJ1bGU6ICovCisJCXNldHNpZ25hbChTSUdRVUlUKTsKKwl9CisjaWYgSk9CUworCWlmIChuICYmIG4tPnR5cGUgPT0gTkNNRAorCSAmJiBuLT5uY21kLmFyZ3MgJiYgc3RyY21wKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAiam9icyIpID09IDAKKwkpIHsKKwkJVFJBQ0UoKCJKb2IgaGFja1xuIikpOworCQkvKiAiam9icyI6IHdlIGRvIG5vdCB3YW50IHRvIGNsZWFyIGpvYiBsaXN0IGZvciBpdCwKKwkJICogaW5zdGVhZCB3ZSByZW1vdmUgb25seSBfaXRzXyBvd25fIGpvYiBmcm9tIGpvYiBsaXN0LgorCQkgKiBUaGlzIG1ha2VzICJqb2JzIC4uLi4gfCBjYXQiIG1vcmUgdXNlZnVsLgorCQkgKi8KKwkJZnJlZWpvYihjdXJqb2IpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKQorCQlmcmVlam9iKGpwKTsKKwlqb2JsZXNzID0gMDsKK30KKworLyogQ2FsbGVkIGFmdGVyIGZvcmsoKSwgaW4gcGFyZW50ICovCisjaWYgIUpPQlMKKyNkZWZpbmUgZm9ya3BhcmVudChqcCwgbiwgbW9kZSwgcGlkKSBmb3JrcGFyZW50KGpwLCBtb2RlLCBwaWQpCisjZW5kaWYKK3N0YXRpYyB2b2lkCitmb3JrcGFyZW50KHN0cnVjdCBqb2IgKmpwLCB1bmlvbiBub2RlICpuLCBpbnQgbW9kZSwgcGlkX3QgcGlkKQoreworCVRSQUNFKCgiSW4gcGFyZW50IHNoZWxsOiBjaGlsZCA9ICVkXG4iLCBwaWQpKTsKKwlpZiAoIWpwKSB7CisJCXdoaWxlIChqb2JsZXNzICYmIGRvd2FpdChET1dBSVRfTk9OQkxPQ0ssIE5VTEwpID4gMCkKKwkJCWNvbnRpbnVlOworCQlqb2JsZXNzKys7CisJCXJldHVybjsKKwl9CisjaWYgSk9CUworCWlmIChtb2RlICE9IEZPUktfTk9KT0IgJiYganAtPmpvYmN0bCkgeworCQlpbnQgcGdycDsKKworCQlpZiAoanAtPm5wcm9jcyA9PSAwKQorCQkJcGdycCA9IHBpZDsKKwkJZWxzZQorCQkJcGdycCA9IGpwLT5wc1swXS5wc19waWQ7CisJCS8qIFRoaXMgY2FuIGZhaWwgYmVjYXVzZSB3ZSBhcmUgZG9pbmcgaXQgaW4gdGhlIGNoaWxkIGFsc28gKi8KKwkJc2V0cGdpZChwaWQsIHBncnApOworCX0KKyNlbmRpZgorCWlmIChtb2RlID09IEZPUktfQkcpIHsKKwkJYmFja2duZHBpZCA9IHBpZDsgICAgICAgICAgICAgICAvKiBzZXQgJCEgKi8KKwkJc2V0X2N1cmpvYihqcCwgQ1VSX1JVTk5JTkcpOworCX0KKwlpZiAoanApIHsKKwkJc3RydWN0IHByb2NzdGF0ICpwcyA9ICZqcC0+cHNbanAtPm5wcm9jcysrXTsKKwkJcHMtPnBzX3BpZCA9IHBpZDsKKwkJcHMtPnBzX3N0YXR1cyA9IC0xOworCQlwcy0+cHNfY21kID0gbnVsbHN0cjsKKyNpZiBKT0JTCisJCWlmIChkb2luZ19qb2JjdGwgJiYgbikKKwkJCXBzLT5wc19jbWQgPSBjb21tYW5kdGV4dChuKTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIGludAorZm9ya3NoZWxsKHN0cnVjdCBqb2IgKmpwLCB1bmlvbiBub2RlICpuLCBpbnQgbW9kZSkKK3sKKwlpbnQgcGlkOworCisJVFJBQ0UoKCJmb3Jrc2hlbGwoJSUlZCwgJXAsICVkKSBjYWxsZWRcbiIsIGpvYm5vKGpwKSwgbiwgbW9kZSkpOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkgeworCQlUUkFDRSgoIkZvcmsgZmFpbGVkLCBlcnJubz0lZCIsIGVycm5vKSk7CisJCWlmIChqcCkKKwkJCWZyZWVqb2IoanApOworCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3QgZm9yayIpOworCX0KKwlpZiAocGlkID09IDApIHsKKwkJQ0xFQVJfUkFORE9NX1QoJnJhbmRvbV9nZW4pOyAvKiBvciBlbHNlICRSQU5ET00gcmVwZWF0cyBpbiBjaGlsZCAqLworCQlmb3JrY2hpbGQoanAsIG4sIG1vZGUpOworCX0gZWxzZSB7CisJCWZvcmtwYXJlbnQoanAsIG4sIG1vZGUsIHBpZCk7CisJfQorCXJldHVybiBwaWQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBqb2IgdG8gZmluaXNoLgorICoKKyAqIFVuZGVyIGpvYiBjb250cm9sIHdlIGhhdmUgdGhlIHByb2JsZW0gdGhhdCB3aGlsZSBhIGNoaWxkIHByb2Nlc3MKKyAqIGlzIHJ1bm5pbmcgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIHVzZXIgYXJlIHNlbnQgdG8gdGhlIGNoaWxkCisgKiBidXQgbm90IHRvIHRoZSBzaGVsbC4gIFRoaXMgbWVhbnMgdGhhdCBhbiBpbmZpbml0ZSBsb29wIHN0YXJ0ZWQgYnkKKyAqIGFuIGludGVyYWN0aXZlIHVzZXIgbWF5IGJlIGhhcmQgdG8ga2lsbC4gIFdpdGggam9iIGNvbnRyb2wgdHVybmVkIG9mZiwKKyAqIGFuIGludGVyYWN0aXZlIHVzZXIgbWF5IHBsYWNlIGFuIGludGVyYWN0aXZlIHByb2dyYW0gaW5zaWRlIGEgbG9vcC4KKyAqIElmIHRoZSBpbnRlcmFjdGl2ZSBwcm9ncmFtIGNhdGNoZXMgaW50ZXJydXB0cywgdGhlIHVzZXIgZG9lc24ndCB3YW50CisgKiB0aGVzZSBpbnRlcnJ1cHRzIHRvIGFsc28gYWJvcnQgdGhlIGxvb3AuICBUaGUgYXBwcm9hY2ggd2UgdGFrZSBoZXJlCisgKiBpcyB0byBoYXZlIHRoZSBzaGVsbCBpZ25vcmUgaW50ZXJydXB0IHNpZ25hbHMgd2hpbGUgd2FpdGluZyBmb3IgYQorICogZm9yZWdyb3VuZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZSwgYW5kIHRoZW4gc2VuZCBpdHNlbGYgYW4gaW50ZXJydXB0CisgKiBzaWduYWwgaWYgdGhlIGNoaWxkIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAqIFVuZm9ydHVuYXRlbHksIHNvbWUgcHJvZ3JhbXMgd2FudCB0byBkbyBhIGJpdCBvZiBjbGVhbnVwIGFuZCB0aGVuCisgKiBleGl0IG9uIGludGVycnVwdDsgdW5sZXNzIHRoZXNlIHByb2Nlc3NlcyB0ZXJtaW5hdGUgdGhlbXNlbHZlcyBieQorICogc2VuZGluZyBhIHNpZ25hbCB0byB0aGVtc2VsdmVzIChpbnN0ZWFkIG9mIGNhbGxpbmcgZXhpdCkgdGhleSB3aWxsCisgKiBjb25mdXNlIHRoaXMgYXBwcm9hY2guCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyBpbnQKK3dhaXRmb3Jqb2Ioc3RydWN0IGpvYiAqanApCit7CisJaW50IHN0OworCisJVFJBQ0UoKCJ3YWl0Zm9yam9iKCUlJWQpIGNhbGxlZFxuIiwgam9ibm8oanApKSk7CisKKwlJTlRfT0ZGOworCXdoaWxlIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykgeworCQkvKiBJbiBub24taW50ZXJhY3RpdmUgc2hlbGxzLCB3ZSBfY2FuXyBnZXQKKwkJICogYSBrZXlib2FyZCBzaWduYWwgaGVyZSBhbmQgYmUgRUlOVFJlZCwKKwkJICogYnV0IHdlIGp1c3QgbG9vcCBiYWNrLCB3YWl0aW5nIGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLgorCQkgKgorCQkgKiBtYW4gYmFzaDoKKwkJICogIklmIGJhc2ggaXMgd2FpdGluZyBmb3IgYSBjb21tYW5kIHRvIGNvbXBsZXRlIGFuZCByZWNlaXZlcworCQkgKiBhIHNpZ25hbCBmb3Igd2hpY2ggYSB0cmFwIGhhcyBiZWVuIHNldCwgdGhlIHRyYXAKKwkJICogd2lsbCBub3QgYmUgZXhlY3V0ZWQgdW50aWwgdGhlIGNvbW1hbmQgY29tcGxldGVzLiIKKwkJICoKKwkJICogUmVhbGl0eSBpcyB0aGF0IGV2ZW4gaWYgdHJhcCBpcyBub3Qgc2V0LCBiYXNoCisJCSAqIHdpbGwgbm90IGFjdCBvbiB0aGUgc2lnbmFsIHVudGlsIGNvbW1hbmQgY29tcGxldGVzLgorCQkgKiBUcnkgdGhpcy4gc2xlZXA1aW50b2ZmLmM6CisJCSAqICNpbmNsdWRlIDxzaWduYWwuaD4KKwkJICogI2luY2x1ZGUgPHVuaXN0ZC5oPgorCQkgKiBpbnQgbWFpbigpIHsKKwkJICogICAgICAgICBzaWdzZXRfdCBzZXQ7CisJCSAqICAgICAgICAgc2lnZW1wdHlzZXQoJnNldCk7CisJCSAqICAgICAgICAgc2lnYWRkc2V0KCZzZXQsIFNJR0lOVCk7CisJCSAqICAgICAgICAgc2lnYWRkc2V0KCZzZXQsIFNJR1FVSVQpOworCQkgKiAgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldCwgTlVMTCk7CisJCSAqICAgICAgICAgc2xlZXAoNSk7CisJCSAqICAgICAgICAgcmV0dXJuIDA7CisJCSAqIH0KKwkJICogJCBiYXNoIC1jICcuL3NsZWVwNWludG9mZjsgZWNobyBoaScKKwkJICogXkNeQ15DXkMgPC0tLSBwcmVzc2luZyBeQyBvbmNlIGEgc2Vjb25kCisJCSAqICQgXworCQkgKiAkIGJhc2ggLWMgJy4vc2xlZXA1aW50b2ZmOyBlY2hvIGhpJworCQkgKiBeXF5cXlxeXGhpIDwtLS0gcHJlc3NpbmcgXlwgKFNJR1FVSVQpCisJCSAqICQgXworCQkgKi8KKwkJZG93YWl0KERPV0FJVF9CTE9DSywganApOworCX0KKwlJTlRfT047CisKKwlzdCA9IGdldHN0YXR1cyhqcCk7CisjaWYgSk9CUworCWlmIChqcC0+am9iY3RsKSB7CisJCXh0Y3NldHBncnAodHR5ZmQsIHJvb3RwaWQpOworCQkvKgorCQkgKiBUaGlzIGlzIHRydWx5IGdyb3NzLgorCQkgKiBJZiB3ZSdyZSBkb2luZyBqb2IgY29udHJvbCwgdGhlbiB3ZSBkaWQgYSBUSU9DU1BHUlAgd2hpY2gKKwkJICogY2F1c2VkIHVzICh0aGUgc2hlbGwpIHRvIG5vIGxvbmdlciBiZSBpbiB0aGUgY29udHJvbGxpbmcKKwkJICogc2Vzc2lvbiAtLSBzbyB3ZSB3b3VsZG4ndCBoYXZlIHNlZW4gYW55IF5DL1NJR0lOVC4gIFNvLCB3ZQorCQkgKiBpbnR1aXQgZnJvbSB0aGUgc3VicHJvY2VzcyBleGl0IHN0YXR1cyB3aGV0aGVyIGEgU0lHSU5UCisJCSAqIG9jY3VycmVkLCBhbmQgaWYgc28gaW50ZXJydXB0IG91cnNlbHZlcy4gIFl1Y2suICAtIG15Y3JvZnQKKwkJICovCisJCWlmIChqcC0+c2lnaW50KSAvKiBUT0RPOiBkbyB0aGUgc2FtZSB3aXRoIGFsbCBzaWduYWxzICovCisJCQlyYWlzZShTSUdJTlQpOyAvKiAuLi4gYnkgcmFpc2UoanAtPnNpZykgaW5zdGVhZD8gKi8KKwl9CisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKQorI2VuZGlmCisJCWZyZWVqb2IoanApOworCXJldHVybiBzdDsKK30KKworLyoKKyAqIHJldHVybiAxIGlmIHRoZXJlIGFyZSBzdG9wcGVkIGpvYnMsIG90aGVyd2lzZSAwCisgKi8KK3N0YXRpYyBpbnQKK3N0b3BwZWRqb2JzKHZvaWQpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IDA7CisJaWYgKGpvYl93YXJuaW5nKQorCQlnb3RvIG91dDsKKwlqcCA9IGN1cmpvYjsKKwlpZiAoanAgJiYganAtPnN0YXRlID09IEpPQlNUT1BQRUQpIHsKKwkJb3V0MnN0cigiWW91IGhhdmUgc3RvcHBlZCBqb2JzLlxuIik7CisJCWpvYl93YXJuaW5nID0gMjsKKwkJcmV0dmFsKys7CisJfQorIG91dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qID09PT09PT09PT09PSByZWRpci5jCisgKgorICogQ29kZSBmb3IgZGVhbGluZyB3aXRoIGlucHV0L291dHB1dCByZWRpcmVjdGlvbi4KKyAqLworCisjdW5kZWYgRU1QVFkKKyN1bmRlZiBDTE9TRUQKKyNkZWZpbmUgRU1QVFkgLTIgICAgICAgICAgICAgICAgLyogbWFya3MgYW4gdW51c2VkIHNsb3QgaW4gcmVkaXJ0YWIgKi8KKyNkZWZpbmUgQ0xPU0VEIC0zICAgICAgICAgICAgICAgLyogbWFya3MgYSBzbG90IG9mIHByZXZpb3VzbHktY2xvc2VkIGZkICovCisKKy8qCisgKiBPcGVuIGEgZmlsZSBpbiBub2Nsb2JiZXIgbW9kZS4KKyAqIFRoZSBjb2RlIHdhcyBjb3BpZWQgZnJvbSBiYXNoLgorICovCitzdGF0aWMgaW50Citub2Nsb2JiZXJvcGVuKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByLCBmZDsKKwlzdHJ1Y3Qgc3RhdCBmaW5mbywgZmluZm8yOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlLCByZXR1cm4gYW4gZXJyb3IKKwkgKiBpbW1lZGlhdGVseS4KKwkgKi8KKwlyID0gc3RhdChmbmFtZSwgJmZpbmZvKTsKKwlpZiAociA9PSAwICYmIFNfSVNSRUcoZmluZm8uc3RfbW9kZSkpIHsKKwkJZXJybm8gPSBFRVhJU1Q7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBmaWxlIHdhcyBub3QgcHJlc2VudCAociAhPSAwKSwgbWFrZSBzdXJlIHdlIG9wZW4gaXQKKwkgKiBleGNsdXNpdmVseSBzbyB0aGF0IGlmIGl0IGlzIGNyZWF0ZWQgYmVmb3JlIHdlIG9wZW4gaXQsIG91ciBvcGVuCisJICogd2lsbCBmYWlsLiAgTWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHRydW5jYXRlIGFuIGV4aXN0aW5nIGZpbGUuCisJICogTm90ZSB0aGF0IHdlIGRvbid0IHR1cm4gb24gT19FWENMIHVubGVzcyB0aGUgc3RhdCBmYWlsZWQgLS0gaWYgdGhlCisJICogZmlsZSB3YXMgbm90IGEgcmVndWxhciBmaWxlLCB3ZSBsZWF2ZSBPX0VYQ0wgb2ZmLgorCSAqLworCWlmIChyICE9IDApCisJCXJldHVybiBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgMDY2Nik7CisJZmQgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFULCAwNjY2KTsKKworCS8qIElmIHRoZSBvcGVuIGZhaWxlZCwgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmlnaHQgYXdheS4gKi8KKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwkvKgorCSAqIE9LLCB0aGUgb3BlbiBzdWNjZWVkZWQsIGJ1dCB0aGUgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBhCisJICogbm9uLXJlZ3VsYXIgZmlsZSB0byBhIHJlZ3VsYXIgZmlsZSBiZXR3ZWVuIHRoZSBzdGF0IGFuZCB0aGUgb3Blbi4KKwkgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgT19FWENMIG9wZW4gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBGSUxFTkFNRQorCSAqIGRpZCBub3QgZXhpc3QgYW5kIGlzIHN5bWxpbmtlZCB0byBhbiBleGlzdGluZyBmaWxlIGJldHdlZW4gdGhlIHN0YXQKKwkgKiBhbmQgb3Blbi4KKwkgKi8KKworCS8qCisJICogSWYgd2UgY2FuIG9wZW4gaXQgYW5kIGZzdGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFuZCBuZWl0aGVyIGNoZWNrCisJICogcmV2ZWFsZWQgdGhhdCBpdCB3YXMgYSByZWd1bGFyIGZpbGUsIGFuZCB0aGUgZmlsZSBoYXMgbm90IGJlZW4KKwkgKiByZXBsYWNlZCwgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisJICovCisJaWYgKGZzdGF0KGZkLCAmZmluZm8yKSA9PSAwCisJICYmICFTX0lTUkVHKGZpbmZvMi5zdF9tb2RlKQorCSAmJiBmaW5mby5zdF9kZXYgPT0gZmluZm8yLnN0X2RldgorCSAmJiBmaW5mby5zdF9pbm8gPT0gZmluZm8yLnN0X2lubworCSkgeworCQlyZXR1cm4gZmQ7CisJfQorCisJLyogVGhlIGZpbGUgaGFzIGJlZW4gcmVwbGFjZWQuICBiYWRuZXNzLiAqLworCWNsb3NlKGZkKTsKKwllcnJubyA9IEVFWElTVDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBIYW5kbGUgaGVyZSBkb2N1bWVudHMuICBOb3JtYWxseSB3ZSBmb3JrIG9mZiBhIHByb2Nlc3MgdG8gd3JpdGUgdGhlCisgKiBkYXRhIHRvIGEgcGlwZS4gIElmIHRoZSBkb2N1bWVudCBpcyBzaG9ydCwgd2UgY2FuIHN0dWZmIHRoZSBkYXRhIGluCisgKiB0aGUgcGlwZSB3aXRob3V0IGZvcmtpbmcuCisgKi8KKy8qIG9wZW5oZXJlIG5lZWRzIHRoaXMgZm9yd2FyZCByZWZlcmVuY2UgKi8KK3N0YXRpYyB2b2lkIGV4cGFuZGhlcmUodW5pb24gbm9kZSAqYXJnLCBpbnQgZmQpOworc3RhdGljIGludAorb3BlbmhlcmUodW5pb24gbm9kZSAqcmVkaXIpCit7CisJaW50IHBpcFsyXTsKKwlzaXplX3QgbGVuID0gMDsKKworCWlmIChwaXBlKHBpcCkgPCAwKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigicGlwZSBjYWxsIGZhaWxlZCIpOworCWlmIChyZWRpci0+dHlwZSA9PSBOSEVSRSkgeworCQlsZW4gPSBzdHJsZW4ocmVkaXItPm5oZXJlLmRvYy0+bmFyZy50ZXh0KTsKKwkJaWYgKGxlbiA8PSBQSVBFX0JVRikgeworCQkJZnVsbF93cml0ZShwaXBbMV0sIHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCwgbGVuKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChmb3Jrc2hlbGwoKHN0cnVjdCBqb2IgKilOVUxMLCAodW5pb24gbm9kZSAqKU5VTEwsIEZPUktfTk9KT0IpID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJY2xvc2UocGlwWzBdKTsKKwkJaWdub3Jlc2lnKFNJR0lOVCk7ICAvL3NpZ25hbChTSUdJTlQsIFNJR19JR04pOworCQlpZ25vcmVzaWcoU0lHUVVJVCk7IC8vc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworCQlpZ25vcmVzaWcoU0lHSFVQKTsgIC8vc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCWlnbm9yZXNpZyhTSUdUU1RQKTsgLy9zaWduYWwoU0lHVFNUUCwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKwkJaWYgKHJlZGlyLT50eXBlID09IE5IRVJFKQorCQkJZnVsbF93cml0ZShwaXBbMV0sIHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCwgbGVuKTsKKwkJZWxzZSAvKiBOWEhFUkUgKi8KKwkJCWV4cGFuZGhlcmUocmVkaXItPm5oZXJlLmRvYywgcGlwWzFdKTsKKwkJX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9Cisgb3V0OgorCWNsb3NlKHBpcFsxXSk7CisJcmV0dXJuIHBpcFswXTsKK30KKworc3RhdGljIGludAorb3BlbnJlZGlyZWN0KHVuaW9uIG5vZGUgKnJlZGlyKQoreworCWNoYXIgKmZuYW1lOworCWludCBmOworCisJc3dpdGNoIChyZWRpci0+bmZpbGUudHlwZSkgeworCWNhc2UgTkZST006CisJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQlmID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCQlpZiAoZiA8IDApCisJCQlnb3RvIGVvcGVuOworCQlicmVhazsKKwljYXNlIE5GUk9NVE86CisJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQlmID0gb3BlbihmbmFtZSwgT19SRFdSfE9fQ1JFQVQsIDA2NjYpOworCQlpZiAoZiA8IDApCisJCQlnb3RvIGVjcmVhdGU7CisJCWJyZWFrOworCWNhc2UgTlRPOgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIE5UTzI6CisjZW5kaWYKKwkJLyogVGFrZSBjYXJlIG9mIG5vY2xvYmJlciBtb2RlLiAqLworCQlpZiAoQ2ZsYWcpIHsKKwkJCWZuYW1lID0gcmVkaXItPm5maWxlLmV4cGZuYW1lOworCQkJZiA9IG5vY2xvYmJlcm9wZW4oZm5hbWUpOworCQkJaWYgKGYgPCAwKQorCQkJCWdvdG8gZWNyZWF0ZTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBOQ0xPQkJFUjoKKwkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCWYgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpOworCQlpZiAoZiA8IDApCisJCQlnb3RvIGVjcmVhdGU7CisJCWJyZWFrOworCWNhc2UgTkFQUEVORDoKKwkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCWYgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fQVBQRU5ELCAwNjY2KTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorI2lmIERFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwkJLyogRmFsbCB0aHJvdWdoIHRvIGVsaW1pbmF0ZSB3YXJuaW5nLiAqLworLyogT3VyIHNpbmdsZSBjYWxsZXIgZG9lcyB0aGlzIGl0c2VsZiAqLworLy8JY2FzZSBOVE9GRDoKKy8vCWNhc2UgTkZST01GRDoKKy8vCQlmID0gLTE7CisvLwkJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJZiA9IG9wZW5oZXJlKHJlZGlyKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGY7CisgZWNyZWF0ZToKKwlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3QgY3JlYXRlICVzOiAlcyIsIGZuYW1lLCBlcnJtc2coZXJybm8sICJub25leGlzdGVudCBkaXJlY3RvcnkiKSk7CisgZW9wZW46CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IG9wZW4gJXM6ICVzIiwgZm5hbWUsIGVycm1zZyhlcnJubywgIm5vIHN1Y2ggZmlsZSIpKTsKK30KKworLyoKKyAqIENvcHkgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgPj0gdG8uICBSZXR1cm5zIC0xCisgKiBpZiB0aGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQsIEVNUFRZIGlmIHRoZXJlIGFyZSBubyB1bnVzZWQKKyAqIGZpbGUgZGVzY3JpcHRvcnMgbGVmdC4KKyAqLworLyogMHg4MDAuLjAwOiBiaXQgdG8gc2V0IGluICJ0byIgdG8gcmVxdWVzdCBkdXAyIGluc3RlYWQgb2YgZmNudGwoRl9EVVBGRCkuCisgKiBvbGQgY29kZSB3YXMgZG9pbmcgY2xvc2UodG8pIHByaW9yIHRvIGNvcHlmZCgpIHRvIGFjaGlldmUgdGhlIHNhbWUgKi8KK2VudW0geworCUNPUFlGRF9FWEFDVCAgID0gKGludCl+KElOVF9NQVgpLAorCUNPUFlGRF9SRVNUT1JFID0gKGludCkoKHVuc2lnbmVkKUNPUFlGRF9FWEFDVCA+PiAxKSwKK307CitzdGF0aWMgaW50Citjb3B5ZmQoaW50IGZyb20sIGludCB0bykKK3sKKwlpbnQgbmV3ZmQ7CisKKwlpZiAodG8gJiBDT1BZRkRfRVhBQ1QpIHsKKwkJdG8gJj0gfkNPUFlGRF9FWEFDVDsKKwkJLyppZiAoZnJvbSAhPSB0bykqLworCQkJbmV3ZmQgPSBkdXAyKGZyb20sIHRvKTsKKwl9IGVsc2UgeworCQluZXdmZCA9IGZjbnRsKGZyb20sIEZfRFVQRkQsIHRvKTsKKwl9CisJaWYgKG5ld2ZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU1GSUxFKQorCQkJcmV0dXJuIEVNUFRZOworCQkvKiBIYXBwZW5zIHdoZW4gc291cmNlIGZkIGlzIG5vdCBvcGVuOiB0cnkgImVjaG8gPiY5OSIgKi8KKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVkOiAlbSIsIGZyb20pOworCX0KKwlyZXR1cm4gbmV3ZmQ7Cit9CisKKy8qIFN0cnVjdCBkZWYgYW5kIHZhcmlhYmxlIGFyZSBtb3ZlZCBkb3duIHRvIHRoZSBmaXJzdCB1c2FnZSBzaXRlICovCitzdHJ1Y3QgdHdvX2ZkX3QgeworCWludCBvcmlnLCBjb3B5OworfTsKK3N0cnVjdCByZWRpcnRhYiB7CisJc3RydWN0IHJlZGlydGFiICpuZXh0OworCWludCBudWxscmVkaXJzOworCWludCBwYWlyX2NvdW50OworCXN0cnVjdCB0d29fZmRfdCB0d29fZmRbXTsKK307CisjZGVmaW5lIHJlZGlybGlzdCAoR192YXIucmVkaXJsaXN0KQorCitzdGF0aWMgaW50IG5lZWRfdG9fcmVtZW1iZXIoc3RydWN0IHJlZGlydGFiICpycCwgaW50IGZkKQoreworCWludCBpOworCisJaWYgKCFycCkgLyogcmVtZW1iZXJpbmcgd2FzIG5vdCByZXF1ZXN0ZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnAtPnBhaXJfY291bnQ7IGkrKykgeworCQlpZiAocnAtPnR3b19mZFtpXS5vcmlnID09IGZkKSB7CisJCQkvKiBhbHJlYWR5IHJlbWVtYmVyZWQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiAiaGlkZGVuIiBmZCBpcyBhIGZkIHVzZWQgdG8gcmVhZCBzY3JpcHRzLCBvciBhIGNvcHkgb2Ygc3VjaCAqLworc3RhdGljIGludCBpc19oaWRkZW5fZmQoc3RydWN0IHJlZGlydGFiICpycCwgaW50IGZkKQoreworCWludCBpOworCXN0cnVjdCBwYXJzZWZpbGUgKnBmOworCisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gMDsKKwkvKiBDaGVjayBvcGVuIHNjcmlwdHMnIGZkcyAqLworCXBmID0gZ19wYXJzZWZpbGU7CisJd2hpbGUgKHBmKSB7CisJCS8qIFdlIHNraXAgcGZfZmQgPT0gMCBjYXNlIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBjYXNlOgorCQkgKiAkIGFzaCAgIyBydW5uaW5nIGFzaCBpbnRlcmFjdGl2ZWx5CisJCSAqICQgLiAuL3NjcmlwdC5zaAorCQkgKiBhbmQgaW4gc2NyaXB0LnNoOiAiZXhlYyA5PiYwIi4KKwkJICogRXZlbiB0aG91Z2ggdG9wLWxldmVsIHBmX2ZkIF9pc18gMCwKKwkJICogaXQncyBzdGlsbCBvayB0byB1c2UgaXQ6ICJyZWFkIiBidWlsdGluIHVzZXMgaXQsCisJCSAqIHdoeSBzaG91bGQgd2UgY3JpcHBsZSAiZXhlYyIgYnVpbHRpbj8KKwkJICovCisJCWlmIChwZi0+cGZfZmQgPiAwICYmIGZkID09IHBmLT5wZl9mZCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGYgPSBwZi0+cHJldjsKKwl9CisKKwlpZiAoIXJwKQorCQlyZXR1cm4gMDsKKwkvKiBDaGVjayBzYXZlZCBmZHMgb2YgcmVkaXJlY3RzICovCisJZmQgfD0gQ09QWUZEX1JFU1RPUkU7CisJZm9yIChpID0gMDsgaSA8IHJwLT5wYWlyX2NvdW50OyBpKyspIHsKKwkJaWYgKHJwLT50d29fZmRbaV0uY29weSA9PSBmZCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbGlzdCBvZiByZWRpcmVjdGlvbiBjb21tYW5kcy4gIElmIHRoZSBSRURJUl9QVVNIIGZsYWcgaXMgc2V0LAorICogb2xkIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHN0YXNoZWQgYXdheSBzbyB0aGF0IHRoZSByZWRpcmVjdGlvbiBjYW4gYmUKKyAqIHVuZG9uZSBieSBjYWxsaW5nIHBvcHJlZGlyLgorICovCisvKiBmbGFncyBwYXNzZWQgdG8gcmVkaXJlY3QgKi8KKyNkZWZpbmUgUkVESVJfUFVTSCAgICAwMSAgICAgICAgLyogc2F2ZSBwcmV2aW91cyB2YWx1ZXMgb2YgZmlsZSBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBSRURJUl9TQVZFRkQyIDAzICAgICAgICAvKiBzZXQgcHJldmVycm91dCAqLworc3RhdGljIHZvaWQKK3JlZGlyZWN0KHVuaW9uIG5vZGUgKnJlZGlyLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJlZGlydGFiICpzdjsKKwlpbnQgc3ZfcG9zOworCWludCBpOworCWludCBmZDsKKwlpbnQgbmV3ZmQ7CisJaW50IGNvcGllZF9mZDIgPSAtMTsKKworCWdfbnVsbHJlZGlycysrOworCWlmICghcmVkaXIpIHsKKwkJcmV0dXJuOworCX0KKworCXN2ID0gTlVMTDsKKwlzdl9wb3MgPSAwOworCUlOVF9PRkY7CisJaWYgKGZsYWdzICYgUkVESVJfUFVTSCkgeworCQl1bmlvbiBub2RlICp0bXAgPSByZWRpcjsKKwkJZG8geworCQkJc3ZfcG9zKys7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJaWYgKHRtcC0+bmZpbGUudHlwZSA9PSBOVE8yKQorCQkJCXN2X3BvcysrOworI2VuZGlmCisJCQl0bXAgPSB0bXAtPm5maWxlLm5leHQ7CisJCX0gd2hpbGUgKHRtcCk7CisJCXN2ID0gY2ttYWxsb2Moc2l6ZW9mKCpzdikgKyBzdl9wb3MgKiBzaXplb2Yoc3YtPnR3b19mZFswXSkpOworCQlzdi0+bmV4dCA9IHJlZGlybGlzdDsKKwkJc3YtPnBhaXJfY291bnQgPSBzdl9wb3M7CisJCXJlZGlybGlzdCA9IHN2OworCQlzdi0+bnVsbHJlZGlycyA9IGdfbnVsbHJlZGlycyAtIDE7CisJCWdfbnVsbHJlZGlycyA9IDA7CisJCXdoaWxlIChzdl9wb3MgPiAwKSB7CisJCQlzdl9wb3MtLTsKKwkJCXN2LT50d29fZmRbc3ZfcG9zXS5vcmlnID0gc3YtPnR3b19mZFtzdl9wb3NdLmNvcHkgPSBFTVBUWTsKKwkJfQorCX0KKworCWRvIHsKKwkJaW50IHJpZ2h0X2ZkID0gLTE7CisJCWZkID0gcmVkaXItPm5maWxlLmZkOworCQlpZiAocmVkaXItPm5maWxlLnR5cGUgPT0gTlRPRkQgfHwgcmVkaXItPm5maWxlLnR5cGUgPT0gTkZST01GRCkgeworCQkJcmlnaHRfZmQgPSByZWRpci0+bmR1cC5kdXBmZDsKKwkJCS8vYmJfZXJyb3JfbXNnKCJkb2luZyAlZCA+ICVkIiwgZmQsIHJpZ2h0X2ZkKTsKKwkJCS8qIHJlZGlyZWN0IGZyb20vdG8gc2FtZSBmaWxlIGRlc2NyaXB0b3I/ICovCisJCQlpZiAocmlnaHRfZmQgPT0gZmQpCisJCQkJY29udGludWU7CisJCQkvKiAiZWNobyA+JjEwIiBhbmQgMTAgaXMgYSBmZCBvcGVuZWQgdG8gYSBzaCBzY3JpcHQ/ICovCisJCQlpZiAoaXNfaGlkZGVuX2ZkKHN2LCByaWdodF9mZCkpIHsKKwkJCQllcnJubyA9IEVCQURGOyAvKiBhcyBpZiBpdCBpcyBjbG9zZWQgKi8KKwkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiJWQ6ICVtIiwgcmlnaHRfZmQpOworCQkJfQorCQkJbmV3ZmQgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCW5ld2ZkID0gb3BlbnJlZGlyZWN0KHJlZGlyKTsgLyogYWx3YXlzID49IDAgKi8KKwkJCWlmIChmZCA9PSBuZXdmZCkgeworCQkJCS8qIERlc2NyaXB0b3Igd2Fzbid0IG9wZW4gYmVmb3JlIHJlZGlyZWN0LgorCQkJCSAqIE1hcmsgaXQgZm9yIGNsb3NlIGluIHRoZSBmdXR1cmUgKi8KKwkJCQlpZiAobmVlZF90b19yZW1lbWJlcihzdiwgZmQpKSB7CisJCQkJCWdvdG8gcmVtZW1iZXJfdG9fY2xvc2U7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorIHJlZGlyZWN0X21vcmU6CisjZW5kaWYKKwkJaWYgKG5lZWRfdG9fcmVtZW1iZXIoc3YsIGZkKSkgeworCQkJLyogQ29weSBvbGQgZGVzY3JpcHRvciAqLworCQkJLyogQ2FyZWZ1bCB0byBub3QgYWNjaWRlbnRhbGx5ICJzYXZlIgorCQkJICogdG8gdGhlIHNhbWUgZmQgYXMgcmlnaHQgc2lkZSBmZCBpbiBOPiZNICovCisJCQlpbnQgbWluZmQgPSByaWdodF9mZCA8IDEwID8gMTAgOiByaWdodF9mZCArIDE7CisJCQlpID0gZmNudGwoZmQsIEZfRFVQRkQsIG1pbmZkKTsKKy8qIFlvdSdkIGV4cGVjdCBjb3B5IHRvIGJlIENMT0VYRUNlZC4gQ3VycmVudGx5IHRoZXNlIGV4dHJhICJzYXZlZCIgZmRzCisgKiBhcmUgY2xvc2VkIGluIHBvcHJlZGlyKCkgaW4gdGhlIGNoaWxkLCBwcmV2ZW50aW5nIHRoZW0gZnJvbSBsZWFraW5nCisgKiBpbnRvIGNoaWxkLiAocG9wcmVkaXIoKSBhbHNvIGNsZWFucyB1cCB0aGUgbWVzcyBpbiBjYXNlIG9mIGZhaWx1cmVzKQorICovCisJCQlpZiAoaSA9PSAtMSkgeworCQkJCWkgPSBlcnJubzsKKwkJCQlpZiAoaSAhPSBFQkFERikgeworCQkJCQkvKiBTdHJhbmdlIGVycm9yIChlLmcuICJ0b28gbWFueSBmaWxlcyIgRU1GSUxFPykgKi8KKwkJCQkJaWYgKG5ld2ZkID49IDApCisJCQkJCQljbG9zZShuZXdmZCk7CisJCQkJCWVycm5vID0gaTsKKwkJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVkOiAlbSIsIGZkKTsKKwkJCQkJLyogTk9UUkVBQ0hFRCAqLworCQkJCX0KKwkJCQkvKiBFQkFERjogaXQgaXMgbm90IG9wZW4gLSBnb29kLCByZW1lbWJlciB0byBjbG9zZSBpdCAqLworIHJlbWVtYmVyX3RvX2Nsb3NlOgorCQkJCWkgPSBDTE9TRUQ7CisJCQl9IGVsc2UgeyAvKiBmZCBpcyBvcGVuLCBzYXZlIGl0cyBjb3B5ICovCisJCQkJLyogImV4ZWMgZmQ+Ji0iIHNob3VsZCBub3QgY2xvc2UgZmRzCisJCQkJICogd2hpY2ggcG9pbnQgdG8gc2NyaXB0IGZpbGUocykuCisJCQkJICogRm9yY2UgdGhlbSB0byBiZSByZXN0b3JlZCBhZnRlcndhcmRzICovCisJCQkJaWYgKGlzX2hpZGRlbl9mZChzdiwgZmQpKQorCQkJCQlpIHw9IENPUFlGRF9SRVNUT1JFOworCQkJfQorCQkJaWYgKGZkID09IDIpCisJCQkJY29waWVkX2ZkMiA9IGk7CisJCQlzdi0+dHdvX2ZkW3N2X3Bvc10ub3JpZyA9IGZkOworCQkJc3YtPnR3b19mZFtzdl9wb3NdLmNvcHkgPSBpOworCQkJc3ZfcG9zKys7CisJCX0KKwkJaWYgKG5ld2ZkIDwgMCkgeworCQkJLyogTlRPRkQvTkZST01GRDogY29weSByZWRpci0+bmR1cC5kdXBmZCB0byBmZCAqLworCQkJaWYgKHJlZGlyLT5uZHVwLmR1cGZkIDwgMCkgeyAvKiAiZmQ+Ji0iICovCisJCQkJLyogRG9uJ3Qgd2FudCB0byB0cmlnZ2VyIGRlYnVnZ2luZyAqLworCQkJCWlmIChmZCAhPSAtMSkKKwkJCQkJY2xvc2UoZmQpOworCQkJfSBlbHNlIHsKKwkJCQljb3B5ZmQocmVkaXItPm5kdXAuZHVwZmQsIGZkIHwgQ09QWUZEX0VYQUNUKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChmZCAhPSBuZXdmZCkgeyAvKiBtb3ZlIG5ld2ZkIHRvIGZkICovCisJCQljb3B5ZmQobmV3ZmQsIGZkIHwgQ09QWUZEX0VYQUNUKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQlpZiAoIShyZWRpci0+bmZpbGUudHlwZSA9PSBOVE8yICYmIGZkID09IDIpKQorI2VuZGlmCisJCQkJY2xvc2UobmV3ZmQpOworCQl9CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQlpZiAocmVkaXItPm5maWxlLnR5cGUgPT0gTlRPMiAmJiBmZCA9PSAxKSB7CisJCQkvKiBXZSBhbHJlYWR5IHJlZGlyZWN0ZWQgaXQgdG8gZmQgMSwgbm93IGNvcHkgaXQgdG8gMiAqLworCQkJbmV3ZmQgPSAxOworCQkJZmQgPSAyOworCQkJZ290byByZWRpcmVjdF9tb3JlOworCQl9CisjZW5kaWYKKwl9IHdoaWxlICgocmVkaXIgPSByZWRpci0+bmZpbGUubmV4dCkgIT0gTlVMTCk7CisKKwlJTlRfT047CisJaWYgKChmbGFncyAmIFJFRElSX1NBVkVGRDIpICYmIGNvcGllZF9mZDIgPj0gMCkKKwkJcHJldmVycm91dF9mZCA9IGNvcGllZF9mZDI7Cit9CisKKy8qCisgKiBVbmRvIHRoZSBlZmZlY3RzIG9mIHRoZSBsYXN0IHJlZGlyZWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorcG9wcmVkaXIoaW50IGRyb3AsIGludCByZXN0b3JlKQoreworCXN0cnVjdCByZWRpcnRhYiAqcnA7CisJaW50IGk7CisKKwlpZiAoLS1nX251bGxyZWRpcnMgPj0gMCkKKwkJcmV0dXJuOworCUlOVF9PRkY7CisJcnAgPSByZWRpcmxpc3Q7CisJZm9yIChpID0gMDsgaSA8IHJwLT5wYWlyX2NvdW50OyBpKyspIHsKKwkJaW50IGZkID0gcnAtPnR3b19mZFtpXS5vcmlnOworCQlpbnQgY29weSA9IHJwLT50d29fZmRbaV0uY29weTsKKwkJaWYgKGNvcHkgPT0gQ0xPU0VEKSB7CisJCQlpZiAoIWRyb3ApCisJCQkJY2xvc2UoZmQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHkgIT0gRU1QVFkpIHsKKwkJCWlmICghZHJvcCB8fCAocmVzdG9yZSAmJiAoY29weSAmIENPUFlGRF9SRVNUT1JFKSkpIHsKKwkJCQljb3B5ICY9IH5DT1BZRkRfUkVTVE9SRTsKKwkJCQkvKmNsb3NlKGZkKTsqLworCQkJCWNvcHlmZChjb3B5LCBmZCB8IENPUFlGRF9FWEFDVCk7CisJCQl9CisJCQljbG9zZShjb3B5ICYgfkNPUFlGRF9SRVNUT1JFKTsKKwkJfQorCX0KKwlyZWRpcmxpc3QgPSBycC0+bmV4dDsKKwlnX251bGxyZWRpcnMgPSBycC0+bnVsbHJlZGlyczsKKwlmcmVlKHJwKTsKKwlJTlRfT047Cit9CisKKy8qCisgKiBVbmRvIGFsbCByZWRpcmVjdGlvbnMuICBDYWxsZWQgb24gZXJyb3Igb3IgaW50ZXJydXB0LgorICovCisKKy8qCisgKiBEaXNjYXJkIGFsbCBzYXZlZCBmaWxlIGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgdm9pZAorY2xlYXJyZWRpcihpbnQgZHJvcCkKK3sKKwlmb3IgKDs7KSB7CisJCWdfbnVsbHJlZGlycyA9IDA7CisJCWlmICghcmVkaXJsaXN0KQorCQkJYnJlYWs7CisJCXBvcHJlZGlyKGRyb3AsIC8qcmVzdG9yZToqLyAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JlZGlyZWN0c2FmZSh1bmlvbiBub2RlICpyZWRpciwgaW50IGZsYWdzKQoreworCWludCBlcnI7CisJdm9sYXRpbGUgaW50IHNhdmVpbnQ7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXIgPSBleGNlcHRpb25faGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKworCVNBVkVfSU5UKHNhdmVpbnQpOworCS8qICJlY2hvIDk+L2Rldi9udWxsOyBlY2hvID4mOTsgZWNobyByZXN1bHQ6ICQ/IiAtIHJlc3VsdCBzaG91bGQgYmUgMSwgbm90IDIhICovCisJZXJyID0gc2V0am1wKGptcGxvYy5sb2MpOyAvLyBodWg/PyB3YXMgPSBzZXRqbXAoam1wbG9jLmxvYykgKiAyOworCWlmICghZXJyKSB7CisJCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwkJcmVkaXJlY3QocmVkaXIsIGZsYWdzKTsKKwl9CisJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlpZiAoZXJyICYmIGV4Y2VwdGlvbl90eXBlICE9IEVYRVJST1IpCisJCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgMSk7CisJUkVTVE9SRV9JTlQoc2F2ZWludCk7CisJcmV0dXJuIGVycjsKK30KKworCisvKiA9PT09PT09PT09PT0gUm91dGluZXMgdG8gZXhwYW5kIGFyZ3VtZW50cyB0byBjb21tYW5kcworICoKKyAqIFdlIGhhdmUgdG8gZGVhbCB3aXRoIGJhY2txdW90ZXMsIHNoZWxsIHZhcmlhYmxlcywgYW5kIGZpbGUgbWV0YWNoYXJhY3RlcnMuCisgKi8KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKK3N0YXRpYyBhcml0aF90Cithc2hfYXJpdGgoY29uc3QgY2hhciAqcykKK3sKKwlhcml0aF9zdGF0ZV90IG1hdGhfc3RhdGU7CisJYXJpdGhfdCByZXN1bHQ7CisKKwltYXRoX3N0YXRlLmxvb2t1cHZhciA9IGxvb2t1cHZhcjsKKwltYXRoX3N0YXRlLnNldHZhciAgICA9IHNldHZhcjI7CisJLy9tYXRoX3N0YXRlLmVuZG9mbmFtZSA9IGVuZG9mbmFtZTsKKworCUlOVF9PRkY7CisJcmVzdWx0ID0gYXJpdGgoJm1hdGhfc3RhdGUsIHMpOworCWlmIChtYXRoX3N0YXRlLmVycm1zZykKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IobWF0aF9zdGF0ZS5lcnJtc2cpOworCUlOVF9PTjsKKworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyoKKyAqIGV4cGFuZGFyZyBmbGFncworICovCisjZGVmaW5lIEVYUF9GVUxMICAgICAgICAweDEgICAgIC8qIHBlcmZvcm0gd29yZCBzcGxpdHRpbmcgJiBmaWxlIGdsb2JiaW5nICovCisjZGVmaW5lIEVYUF9USUxERSAgICAgICAweDIgICAgIC8qIGRvIG5vcm1hbCB0aWxkZSBleHBhbnNpb24gKi8KKyNkZWZpbmUgRVhQX1ZBUlRJTERFICAgIDB4NCAgICAgLyogZXhwYW5kIHRpbGRlcyBpbiBhbiBhc3NpZ25tZW50ICovCisjZGVmaW5lIEVYUF9SRURJUiAgICAgICAweDggICAgIC8qIGZpbGUgZ2xvYiBmb3IgYSByZWRpcmVjdGlvbiAoMSBtYXRjaCBvbmx5KSAqLworI2RlZmluZSBFWFBfQ0FTRSAgICAgICAgMHgxMCAgICAvKiBrZWVwcyBxdW90ZXMgYXJvdW5kIGZvciBDQVNFIHBhdHRlcm4gKi8KKyNkZWZpbmUgRVhQX1JFQ09SRCAgICAgIDB4MjAgICAgLyogbmVlZCB0byByZWNvcmQgYXJndW1lbnRzIGZvciBpZnMgYnJlYWt1cCAqLworI2RlZmluZSBFWFBfVkFSVElMREUyICAgMHg0MCAgICAvKiBleHBhbmQgdGlsZGVzIGFmdGVyIGNvbG9ucyBvbmx5ICovCisjZGVmaW5lIEVYUF9XT1JEICAgICAgICAweDgwICAgIC8qIGV4cGFuZCB3b3JkIGluIHBhcmFtZXRlciBleHBhbnNpb24gKi8KKyNkZWZpbmUgRVhQX1FXT1JEICAgICAgIDB4MTAwICAgLyogZXhwYW5kIHdvcmQgaW4gcXVvdGVkIHBhcmFtZXRlciBleHBhbnNpb24gKi8KKy8qCisgKiBybWVzY2FwZSgpIGZsYWdzCisgKi8KKyNkZWZpbmUgUk1FU0NBUEVfQUxMT0MgIDB4MSAgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nICovCisjZGVmaW5lIFJNRVNDQVBFX0dMT0IgICAweDIgICAgIC8qIEFkZCBiYWNrc2xhc2hlcyBmb3IgZ2xvYiAqLworI2RlZmluZSBSTUVTQ0FQRV9RVU9URUQgMHg0ICAgICAvKiBSZW1vdmUgQ1RMRVNDIHVubGVzcyBpbiBxdW90ZXMgKi8KKyNkZWZpbmUgUk1FU0NBUEVfR1JPVyAgIDB4OCAgICAgLyogR3JvdyBzdHJpbmdzIGluc3RlYWQgb2Ygc3RhbGxvYyAqLworI2RlZmluZSBSTUVTQ0FQRV9IRUFQICAgMHgxMCAgICAvKiBNYWxsb2Mgc3RyaW5ncyBpbnN0ZWFkIG9mIHN0YWxsb2MgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBzcGVjaWZ5aW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBzdHJpbmcgc2hvdWxkIGJlIHNlYXJjaGVkCisgKiBmb3IgSUZTIGNoYXJhY3RlcnMuCisgKi8KK3N0cnVjdCBpZnNyZWdpb24geworCXN0cnVjdCBpZnNyZWdpb24gKm5leHQ7IC8qIG5leHQgcmVnaW9uIGluIGxpc3QgKi8KKwlpbnQgYmVnb2ZmOyAgICAgICAgICAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgcmVnaW9uICovCisJaW50IGVuZG9mZjsgICAgICAgICAgICAgLyogb2Zmc2V0IG9mIGVuZCBvZiByZWdpb24gKi8KKwlpbnQgbnVsb25seTsgICAgICAgICAgICAvKiBzZWFyY2ggZm9yIG51bCBieXRlcyBvbmx5ICovCit9OworCitzdHJ1Y3QgYXJnbGlzdCB7CisJc3RydWN0IHN0cmxpc3QgKmxpc3Q7CisJc3RydWN0IHN0cmxpc3QgKipsYXN0cDsKK307CisKKy8qIG91dHB1dCBvZiBjdXJyZW50IHN0cmluZyAqLworc3RhdGljIGNoYXIgKmV4cGRlc3Q7CisvKiBsaXN0IG9mIGJhY2sgcXVvdGUgZXhwcmVzc2lvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm9kZWxpc3QgKmFyZ2JhY2txOworLyogZmlyc3Qgc3RydWN0IGluIGxpc3Qgb2YgaWZzIHJlZ2lvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZzcmVnaW9uIGlmc2ZpcnN0OworLyogbGFzdCBzdHJ1Y3QgaW4gbGlzdCAqLworc3RhdGljIHN0cnVjdCBpZnNyZWdpb24gKmlmc2xhc3RwOworLyogaG9sZHMgZXhwYW5kZWQgYXJnIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJnbGlzdCBleHBhcmc7CisKKy8qCisgKiBPdXIgb3duIGl0b2EoKS4KKyAqLworI2lmICFFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisvKiBjdnRudW0oKSBpcyB1c2VkIGV2ZW4gaWYgbWF0aCBzdXBwb3J0IGlzIG9mZiAodG8gcHJlcGFyZSAkPyB2YWx1ZXMgYW5kIHN1Y2gpICovCit0eXBlZGVmIGxvbmcgYXJpdGhfdDsKKyMgZGVmaW5lIEFSSVRIX0ZNVCAiJWxkIgorI2VuZGlmCitzdGF0aWMgaW50CitjdnRudW0oYXJpdGhfdCBudW0pCit7CisJaW50IGxlbjsKKworCWV4cGRlc3QgPSBtYWtlc3Ryc3BhY2UoMzIsIGV4cGRlc3QpOworCWxlbiA9IGZtdHN0cihleHBkZXN0LCAzMiwgQVJJVEhfRk1ULCBudW0pOworCVNUQURKVVNUKGxlbiwgZXhwZGVzdCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNpemVfdAorZXNjbGVuKGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICpwKQoreworCXNpemVfdCBlc2MgPSAwOworCisJd2hpbGUgKHAgPiBzdGFydCAmJiAodW5zaWduZWQgY2hhcikqLS1wID09IENUTEVTQykgeworCQllc2MrKzsKKwl9CisJcmV0dXJuIGVzYzsKK30KKworLyoKKyAqIFJlbW92ZSBhbnkgQ1RMRVNDIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZy4KKyAqLworc3RhdGljIGNoYXIgKgorcm1lc2NhcGVzKGNoYXIgKnN0ciwgaW50IGZsYWcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcWNoYXJzW10gQUxJR04xID0geyBDVExFU0MsIENUTFFVT1RFTUFSSywgJ1wwJyB9OworCisJY2hhciAqcCwgKnEsICpyOworCXVuc2lnbmVkIGlucXVvdGVzOworCXVuc2lnbmVkIHByb3RlY3RfYWdhaW5zdF9nbG9iOworCXVuc2lnbmVkIGdsb2JiaW5nOworCisJcCA9IHN0cnBicmsoc3RyLCBxY2hhcnMpOworCWlmICghcCkKKwkJcmV0dXJuIHN0cjsKKworCXEgPSBwOworCXIgPSBzdHI7CisJaWYgKGZsYWcgJiBSTUVTQ0FQRV9BTExPQykgeworCQlzaXplX3QgbGVuID0gcCAtIHN0cjsKKwkJc2l6ZV90IGZ1bGxsZW4gPSBsZW4gKyBzdHJsZW4ocCkgKyAxOworCisJCWlmIChmbGFnICYgUk1FU0NBUEVfR1JPVykgeworCQkJaW50IHN0cmxvYyA9IHN0ciAtIChjaGFyICopc3RhY2tibG9jaygpOworCQkJciA9IG1ha2VzdHJzcGFjZShmdWxsbGVuLCBleHBkZXN0KTsKKwkJCS8qIHAgYW5kIHN0ciBtYXkgYmUgaW52YWxpZGF0ZWQgYnkgbWFrZXN0cnNwYWNlICovCisJCQlzdHIgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0cmxvYzsKKwkJCXAgPSBzdHIgKyBsZW47CisJCX0gZWxzZSBpZiAoZmxhZyAmIFJNRVNDQVBFX0hFQVApIHsKKwkJCXIgPSBja21hbGxvYyhmdWxsbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXIgPSBzdGFsbG9jKGZ1bGxsZW4pOworCQl9CisJCXEgPSByOworCQlpZiAobGVuID4gMCkgeworCQkJcSA9IChjaGFyICopbWVtY3B5KHEsIHN0ciwgbGVuKSArIGxlbjsKKwkJfQorCX0KKworCWlucXVvdGVzID0gKGZsYWcgJiBSTUVTQ0FQRV9RVU9URUQpIF4gUk1FU0NBUEVfUVVPVEVEOworCWdsb2JiaW5nID0gZmxhZyAmIFJNRVNDQVBFX0dMT0I7CisJcHJvdGVjdF9hZ2FpbnN0X2dsb2IgPSBnbG9iYmluZzsKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKSpwID09IENUTFFVT1RFTUFSSykgeworLy8gVE9ETzogaWYgbm8gUk1FU0NBUEVfUVVPVEVEIGluIGZsYWdzLCBpbnF1b3RlcyBuZXZlciBiZWNvbWVzIDAKKy8vIChhbHRlcm5hdGVzIGJldHdlZW4gUk1FU0NBUEVfUVVPVEVEIGFuZCB+Uk1FU0NBUEVfUVVPVEVEKS4gSXMgaXQgb2s/CisvLyBOb3RlOiBib3RoIGlucXVvdGVzIGFuZCBwcm90ZWN0X2FnYWluc3RfZ2xvYiBvbmx5IGFmZmVjdCB3aGV0aGVyCisvLyBDVExFU0MsPGNoPiBnZXRzIGNvbnZlcnRlZCB0byA8Y2g+IG9yIHRvIFw8Y2g+CisJCQlpbnF1b3RlcyA9IH5pbnF1b3RlczsKKwkJCXArKzsKKwkJCXByb3RlY3RfYWdhaW5zdF9nbG9iID0gZ2xvYmJpbmc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnAgPT0gJ1xcJykgeworCQkJLyogbmFrZWQgYmFjayBzbGFzaCAqLworCQkJcHJvdGVjdF9hZ2FpbnN0X2dsb2IgPSAwOworCQkJZ290byBjb3B5OworCQl9CisJCWlmICgodW5zaWduZWQgY2hhcikqcCA9PSBDVExFU0MpIHsKKwkJCXArKzsKKwkJCWlmIChwcm90ZWN0X2FnYWluc3RfZ2xvYiAmJiBpbnF1b3RlcyAmJiAqcCAhPSAnLycpIHsKKwkJCQkqcSsrID0gJ1xcJzsKKwkJCX0KKwkJfQorCQlwcm90ZWN0X2FnYWluc3RfZ2xvYiA9IGdsb2JiaW5nOworIGNvcHk6CisJCSpxKysgPSAqcCsrOworCX0KKwkqcSA9ICdcMCc7CisJaWYgKGZsYWcgJiBSTUVTQ0FQRV9HUk9XKSB7CisJCWV4cGRlc3QgPSByOworCQlTVEFESlVTVChxIC0gciArIDEsIGV4cGRlc3QpOworCX0KKwlyZXR1cm4gcjsKK30KKyNkZWZpbmUgcG1hdGNoKGEsIGIpICFmbm1hdGNoKChhKSwgKGIpLCAwKQorCisvKgorICogUHJlcGFyZSBhIHBhdHRlcm4gZm9yIGEgZXhwbWV0YSAoaW50ZXJuYWwgZ2xvYigzKSkgY2FsbC4KKyAqCisgKiBSZXR1cm5zIGFuIHN0YWxsb2NlZCBzdHJpbmcuCisgKi8KK3N0YXRpYyBjaGFyICoKK3ByZWdsb2IoY29uc3QgY2hhciAqcGF0dGVybiwgaW50IHF1b3RlZCwgaW50IGZsYWcpCit7CisJZmxhZyB8PSBSTUVTQ0FQRV9HTE9COworCWlmIChxdW90ZWQpIHsKKwkJZmxhZyB8PSBSTUVTQ0FQRV9RVU9URUQ7CisJfQorCXJldHVybiBybWVzY2FwZXMoKGNoYXIgKilwYXR0ZXJuLCBmbGFnKTsKK30KKworLyoKKyAqIFB1dCBhIHN0cmluZyBvbiB0aGUgc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkCittZW10b2Rlc3QoY29uc3QgY2hhciAqcCwgc2l6ZV90IGxlbiwgaW50IHN5bnRheCwgaW50IHF1b3RlcykKK3sKKwljaGFyICpxID0gZXhwZGVzdDsKKworCXEgPSBtYWtlc3Ryc3BhY2UocXVvdGVzID8gbGVuICogMiA6IGxlbiwgcSk7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKnArKzsKKwkJaWYgKGMgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlpZiAocXVvdGVzKSB7CisJCQlpbnQgbiA9IFNJVChjLCBzeW50YXgpOworCQkJaWYgKG4gPT0gQ0NUTCB8fCBuID09IENCQUNLKQorCQkJCVVTVFBVVEMoQ1RMRVNDLCBxKTsKKwkJfQorCQlVU1RQVVRDKGMsIHEpOworCX0KKworCWV4cGRlc3QgPSBxOworfQorCitzdGF0aWMgdm9pZAorc3RydG9kZXN0KGNvbnN0IGNoYXIgKnAsIGludCBzeW50YXgsIGludCBxdW90ZXMpCit7CisJbWVtdG9kZXN0KHAsIHN0cmxlbihwKSwgc3ludGF4LCBxdW90ZXMpOworfQorCisvKgorICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSB0byBzY2FuIHRoaXMgcmVnaW9uIG9mIHRoZQorICogc3RyaW5nIGZvciBJRlMgY2hhcmFjdGVycy4KKyAqLworc3RhdGljIHZvaWQKK3JlY29yZHJlZ2lvbihpbnQgc3RhcnQsIGludCBlbmQsIGludCBudWxvbmx5KQoreworCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisKKwlpZiAoaWZzbGFzdHAgPT0gTlVMTCkgeworCQlpZnNwID0gJmlmc2ZpcnN0OworCX0gZWxzZSB7CisJCUlOVF9PRkY7CisJCWlmc3AgPSBja3phbGxvYyhzaXplb2YoKmlmc3ApKTsKKwkJLyppZnNwLT5uZXh0ID0gTlVMTDsgLSBja3phbGxvYyBkaWQgaXQgKi8KKwkJaWZzbGFzdHAtPm5leHQgPSBpZnNwOworCQlJTlRfT047CisJfQorCWlmc2xhc3RwID0gaWZzcDsKKwlpZnNsYXN0cC0+YmVnb2ZmID0gc3RhcnQ7CisJaWZzbGFzdHAtPmVuZG9mZiA9IGVuZDsKKwlpZnNsYXN0cC0+bnVsb25seSA9IG51bG9ubHk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVyZWNvcmRyZWdpb25zKGludCBlbmRvZmYpCit7CisJaWYgKGlmc2xhc3RwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChpZnNmaXJzdC5lbmRvZmYgPiBlbmRvZmYpIHsKKwkJd2hpbGUgKGlmc2ZpcnN0Lm5leHQpIHsKKwkJCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisJCQlJTlRfT0ZGOworCQkJaWZzcCA9IGlmc2ZpcnN0Lm5leHQtPm5leHQ7CisJCQlmcmVlKGlmc2ZpcnN0Lm5leHQpOworCQkJaWZzZmlyc3QubmV4dCA9IGlmc3A7CisJCQlJTlRfT047CisJCX0KKwkJaWYgKGlmc2ZpcnN0LmJlZ29mZiA+IGVuZG9mZikgeworCQkJaWZzbGFzdHAgPSBOVUxMOworCQl9IGVsc2UgeworCQkJaWZzbGFzdHAgPSAmaWZzZmlyc3Q7CisJCQlpZnNmaXJzdC5lbmRvZmYgPSBlbmRvZmY7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmc2xhc3RwID0gJmlmc2ZpcnN0OworCXdoaWxlIChpZnNsYXN0cC0+bmV4dCAmJiBpZnNsYXN0cC0+bmV4dC0+YmVnb2ZmIDwgZW5kb2ZmKQorCQlpZnNsYXN0cCA9IGlmc2xhc3RwLT5uZXh0OworCXdoaWxlIChpZnNsYXN0cC0+bmV4dCkgeworCQlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCQlJTlRfT0ZGOworCQlpZnNwID0gaWZzbGFzdHAtPm5leHQtPm5leHQ7CisJCWZyZWUoaWZzbGFzdHAtPm5leHQpOworCQlpZnNsYXN0cC0+bmV4dCA9IGlmc3A7CisJCUlOVF9PTjsKKwl9CisJaWYgKGlmc2xhc3RwLT5lbmRvZmYgPiBlbmRvZmYpCisJCWlmc2xhc3RwLT5lbmRvZmYgPSBlbmRvZmY7Cit9CisKK3N0YXRpYyBjaGFyICoKK2V4cHRpbGRlKGNoYXIgKnN0YXJ0cCwgY2hhciAqcCwgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwljaGFyICpuYW1lOworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNvbnN0IGNoYXIgKmhvbWU7CisJaW50IHF1b3RlcyA9IGZsYWdzICYgKEVYUF9GVUxMIHwgRVhQX0NBU0UgfCBFWFBfUkVESVIpOworCWludCBzdGFydGxvYzsKKworCW5hbWUgPSBwICsgMTsKKworCXdoaWxlICgoYyA9ICorK3ApICE9ICdcMCcpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgQ1RMRVNDOgorCQkJcmV0dXJuIHN0YXJ0cDsKKwkJY2FzZSBDVExRVU9URU1BUks6CisJCQlyZXR1cm4gc3RhcnRwOworCQljYXNlICc6JzoKKwkJCWlmIChmbGFncyAmIEVYUF9WQVJUSUxERSkKKwkJCQlnb3RvIGRvbmU7CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCWNhc2UgQ1RMRU5EVkFSOgorCQkJZ290byBkb25lOworCQl9CisJfQorIGRvbmU6CisJKnAgPSAnXDAnOworCWlmICgqbmFtZSA9PSAnXDAnKSB7CisJCWhvbWUgPSBsb29rdXB2YXIoIkhPTUUiKTsKKwl9IGVsc2UgeworCQlwdyA9IGdldHB3bmFtKG5hbWUpOworCQlpZiAocHcgPT0gTlVMTCkKKwkJCWdvdG8gbG9zZTsKKwkJaG9tZSA9IHB3LT5wd19kaXI7CisJfQorCWlmICghaG9tZSB8fCAhKmhvbWUpCisJCWdvdG8gbG9zZTsKKwkqcCA9IGM7CisJc3RhcnRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJc3RydG9kZXN0KGhvbWUsIFNRU1lOVEFYLCBxdW90ZXMpOworCXJlY29yZHJlZ2lvbihzdGFydGxvYywgZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpLCAwKTsKKwlyZXR1cm4gcDsKKyBsb3NlOgorCSpwID0gYzsKKwlyZXR1cm4gc3RhcnRwOworfQorCisvKgorICogRXhlY3V0ZSBhIGNvbW1hbmQgaW5zaWRlIGJhY2sgcXVvdGVzLiAgSWYgaXQncyBhIGJ1aWx0aW4gY29tbWFuZCwgd2UKKyAqIHdhbnQgdG8gc2F2ZSBpdHMgb3V0cHV0IGluIGEgYmxvY2sgb2J0YWluZWQgZnJvbSBtYWxsb2MuICBPdGhlcndpc2UKKyAqIHdlIGZvcmsgb2ZmIGEgc3VicHJvY2VzcyBhbmQgZ2V0IHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgdmlhIGEgcGlwZS4KKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworc3RydWN0IGJhY2tjbWQgeyAgICAgICAgICAgICAgICAvKiByZXN1bHQgb2YgZXZhbGJhY2tjbWQgKi8KKwlpbnQgZmQ7ICAgICAgICAgICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tICovCisJaW50IG5sZWZ0OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYXJzIGluIGJ1ZmZlciAqLworCWNoYXIgKmJ1ZjsgICAgICAgICAgICAgIC8qIGJ1ZmZlciAqLworCXN0cnVjdCBqb2IgKmpwOyAgICAgICAgIC8qIGpvYiBzdHJ1Y3R1cmUgZm9yIGNvbW1hbmQgKi8KK307CisKKy8qIFRoZXNlIGZvcndhcmQgZGVjbHMgYXJlIG5lZWRlZCB0byB1c2UgImV2YWwiIGNvZGUgZm9yIGJhY2t0aWNrcyBoYW5kbGluZzogKi8KK3N0YXRpYyB1aW50OF90IGJhY2tfZXhpdHN0YXR1czsgLyogZXhpdCBzdGF0dXMgb2YgYmFja3F1b3RlZCBjb21tYW5kICovCisjZGVmaW5lIEVWX0VYSVQgMDEgICAgICAgICAgICAgIC8qIGV4aXQgYWZ0ZXIgZXZhbHVhdGluZyB0cmVlICovCitzdGF0aWMgdm9pZCBldmFsdHJlZSh1bmlvbiBub2RlICosIGludCk7CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQworZXZhbGJhY2tjbWQodW5pb24gbm9kZSAqbiwgc3RydWN0IGJhY2tjbWQgKnJlc3VsdCkKK3sKKwlpbnQgc2F2ZWhlcmVmZDsKKworCXJlc3VsdC0+ZmQgPSAtMTsKKwlyZXN1bHQtPmJ1ZiA9IE5VTEw7CisJcmVzdWx0LT5ubGVmdCA9IDA7CisJcmVzdWx0LT5qcCA9IE5VTEw7CisJaWYgKG4gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzYXZlaGVyZWZkID0gaGVyZWZkOworCWhlcmVmZCA9IC0xOworCisJeworCQlpbnQgcGlwWzJdOworCQlzdHJ1Y3Qgam9iICpqcDsKKworCQlpZiAocGlwZShwaXApIDwgMCkKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJwaXBlIGNhbGwgZmFpbGVkIik7CisJCWpwID0gbWFrZWpvYigvKm4sKi8gMSk7CisJCWlmIChmb3Jrc2hlbGwoanAsIG4sIEZPUktfTk9KT0IpID09IDApIHsKKwkJCUZPUkNFX0lOVF9PTjsKKwkJCWNsb3NlKHBpcFswXSk7CisJCQlpZiAocGlwWzFdICE9IDEpIHsKKwkJCQkvKmNsb3NlKDEpOyovCisJCQkJY29weWZkKHBpcFsxXSwgMSB8IENPUFlGRF9FWEFDVCk7CisJCQkJY2xvc2UocGlwWzFdKTsKKwkJCX0KKwkJCWVmbGFnID0gMDsKKwkJCWV2YWx0cmVlKG4sIEVWX0VYSVQpOyAvKiBhY3R1YWxseSBldmFsdHJlZW5yLi4uICovCisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJY2xvc2UocGlwWzFdKTsKKwkJcmVzdWx0LT5mZCA9IHBpcFswXTsKKwkJcmVzdWx0LT5qcCA9IGpwOworCX0KKwloZXJlZmQgPSBzYXZlaGVyZWZkOworIG91dDoKKwlUUkFDRSgoImV2YWxiYWNrY21kIGRvbmU6IGZkPSVkIGJ1Zj0weCV4IG5sZWZ0PSVkIGpwPTB4JXhcbiIsCisJCXJlc3VsdC0+ZmQsIHJlc3VsdC0+YnVmLCByZXN1bHQtPm5sZWZ0LCByZXN1bHQtPmpwKSk7Cit9CisKKy8qCisgKiBFeHBhbmQgc3R1ZmYgaW4gYmFja3dhcmRzIHF1b3Rlcy4KKyAqLworc3RhdGljIHZvaWQKK2V4cGJhY2txKHVuaW9uIG5vZGUgKmNtZCwgaW50IHF1b3RlZCwgaW50IHF1b3RlcykKK3sKKwlzdHJ1Y3QgYmFja2NtZCBpbjsKKwlpbnQgaTsKKwljaGFyIGJ1ZlsxMjhdOworCWNoYXIgKnA7CisJY2hhciAqZGVzdDsKKwlpbnQgc3RhcnRsb2M7CisJaW50IHN5bnRheCA9IHF1b3RlZCA/IERRU1lOVEFYIDogQkFTRVNZTlRBWDsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCisJSU5UX09GRjsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlkZXN0ID0gZXhwZGVzdDsKKwlzdGFydGxvYyA9IGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlncmFic3RhY2tzdHIoZGVzdCk7CisJZXZhbGJhY2tjbWQoY21kLCAmaW4pOworCXBvcHN0YWNrbWFyaygmc21hcmspOworCisJcCA9IGluLmJ1ZjsKKwlpID0gaW4ubmxlZnQ7CisJaWYgKGkgPT0gMCkKKwkJZ290byByZWFkOworCWZvciAoOzspIHsKKwkJbWVtdG9kZXN0KHAsIGksIHN5bnRheCwgcXVvdGVzKTsKKyByZWFkOgorCQlpZiAoaW4uZmQgPCAwKQorCQkJYnJlYWs7CisJCWkgPSBub25ibG9ja19pbW11bmVfcmVhZChpbi5mZCwgYnVmLCBzaXplb2YoYnVmKSwgLypsb29wX29uX0VJTlRSOiovIDEpOworCQlUUkFDRSgoImV4cGJhY2txOiByZWFkIHJldHVybnMgJWRcbiIsIGkpKTsKKwkJaWYgKGkgPD0gMCkKKwkJCWJyZWFrOworCQlwID0gYnVmOworCX0KKworCWZyZWUoaW4uYnVmKTsKKwlpZiAoaW4uZmQgPj0gMCkgeworCQljbG9zZShpbi5mZCk7CisJCWJhY2tfZXhpdHN0YXR1cyA9IHdhaXRmb3Jqb2IoaW4uanApOworCX0KKwlJTlRfT047CisKKwkvKiBFYXQgYWxsIHRyYWlsaW5nIG5ld2xpbmVzICovCisJZGVzdCA9IGV4cGRlc3Q7CisJZm9yICg7IGRlc3QgPiAoY2hhciAqKXN0YWNrYmxvY2soKSAmJiBkZXN0Wy0xXSA9PSAnXG4nOykKKwkJU1RVTlBVVEMoZGVzdCk7CisJZXhwZGVzdCA9IGRlc3Q7CisKKwlpZiAocXVvdGVkID09IDApCisJCXJlY29yZHJlZ2lvbihzdGFydGxvYywgZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpLCAwKTsKKwlUUkFDRSgoImV2YWxiYWNrcTogc2l6ZTolZDonJS4qcydcbiIsCisJCShpbnQpKChkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpIC0gc3RhcnRsb2MpLAorCQkoaW50KSgoZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpKSAtIHN0YXJ0bG9jKSwKKwkJc3RhY2tibG9jaygpICsgc3RhcnRsb2MpKTsKK30KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKy8qCisgKiBFeHBhbmQgYXJpdGhtZXRpYyBleHByZXNzaW9uLiAgQmFja3VwIHRvIHN0YXJ0IG9mIGV4cHJlc3Npb24sCisgKiBldmFsdWF0ZSwgcGxhY2UgcmVzdWx0IGluIChiYWNrZWQgdXApIHJlc3VsdCwgYWRqdXN0IHN0cmluZyBwb3NpdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2V4cGFyaShpbnQgcXVvdGVzKQoreworCWNoYXIgKnAsICpzdGFydDsKKwlpbnQgYmVnb2ZmOworCWludCBmbGFnOworCWludCBsZW47CisKKwkvKiBpZnNmcmVlKCk7ICovCisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBpcyBzbGlnaHRseSBvdmVyLWNvbXBsaWNhdGVkIGZvcgorCSAqIGVmZmljaWVuY3kuICBOZXh0IHdlIHNjYW4gYmFja3dhcmRzIGxvb2tpbmcgZm9yIHRoZQorCSAqIHN0YXJ0IG9mIGFyaXRobWV0aWMuCisJICovCisJc3RhcnQgPSBzdGFja2Jsb2NrKCk7CisJcCA9IGV4cGRlc3QgLSAxOworCSpwID0gJ1wwJzsKKwlwLS07CisJd2hpbGUgKDEpIHsKKwkJaW50IGVzYzsKKworCQl3aGlsZSAoKHVuc2lnbmVkIGNoYXIpKnAgIT0gQ1RMQVJJKSB7CisJCQlwLS07CisjaWYgREVCVUcKKwkJCWlmIChwIDwgc3RhcnQpIHsKKwkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigibWlzc2luZyBDVExBUkkgKHNob3VsZG4ndCBoYXBwZW4pIik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWVzYyA9IGVzY2xlbihzdGFydCwgcCk7CisJCWlmICghKGVzYyAlIDIpKSB7CisJCQlicmVhazsKKwkJfQorCisJCXAgLT0gZXNjICsgMTsKKwl9CisKKwliZWdvZmYgPSBwIC0gc3RhcnQ7CisKKwlyZW1vdmVyZWNvcmRyZWdpb25zKGJlZ29mZik7CisKKwlmbGFnID0gcFsxXTsKKworCWV4cGRlc3QgPSBwOworCisJaWYgKHF1b3RlcykKKwkJcm1lc2NhcGVzKHAgKyAyLCAwKTsKKworCWxlbiA9IGN2dG51bShhc2hfYXJpdGgocCArIDIpKTsKKworCWlmIChmbGFnICE9ICciJykKKwkJcmVjb3JkcmVnaW9uKGJlZ29mZiwgYmVnb2ZmICsgbGVuLCAwKTsKK30KKyNlbmRpZgorCisvKiBhcmdzdHIgbmVlZHMgaXQgKi8KK3N0YXRpYyBjaGFyICpldmFsdmFyKGNoYXIgKnAsIGludCBmbGFncywgc3RydWN0IHN0cmxpc3QgKnZhcl9zdHJfbGlzdCk7CisKKy8qCisgKiBQZXJmb3JtIHZhcmlhYmxlIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbi4gIElmIEVYUF9GVUxMIGlzIHNldCwgb3V0cHV0IENUTEVTQworICogY2hhcmFjdGVycyB0byBhbGxvdyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIHRyZWF0CisgKiAkQCBsaWtlICQqIHNpbmNlIG5vIHNwbGl0dGluZyB3aWxsIGJlIHBlcmZvcm1lZC4KKyAqCisgKiB2YXJfc3RyX2xpc3QgKGNhbiBiZSBOVUxMKSBpcyBhIGxpc3Qgb2YgIlZBUj12YWwiIHN0cmluZ3Mgd2hpY2ggdGFrZSBwcmVjZWRlbmNlCisgKiBvdmVyIHNoZWxsIHZhcmFibGVzLiBOZWVkZWQgZm9yICJBPWEgQj0kQTsgZWNobyAkQiIgY2FzZSAtIHdlIHVzZSBpdAorICogZm9yIGNvcnJlY3QgZXhwYW5zaW9uIG9mICJCPSRBIiB3b3JkLgorICovCitzdGF0aWMgdm9pZAorYXJnc3RyKGNoYXIgKnAsIGludCBmbGFncywgc3RydWN0IHN0cmxpc3QgKnZhcl9zdHJfbGlzdCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzcGNsY2hhcnNbXSBBTElHTjEgPSB7CisJCSc9JywKKwkJJzonLAorCQlDVExRVU9URU1BUkssCisJCUNUTEVORFZBUiwKKwkJQ1RMRVNDLAorCQlDVExWQVIsCisJCUNUTEJBQ0tRLAorCQlDVExCQUNLUSB8IENUTFFVT1RFLAorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJQ1RMRU5EQVJJLAorI2VuZGlmCisJCSdcMCcKKwl9OworCWNvbnN0IGNoYXIgKnJlamVjdCA9IHNwY2xjaGFyczsKKwlpbnQgcXVvdGVzID0gZmxhZ3MgJiAoRVhQX0ZVTEwgfCBFWFBfQ0FTRSB8IEVYUF9SRURJUik7IC8qIGRvIENUTEVTQyAqLworCWludCBicmVha2FsbCA9IGZsYWdzICYgRVhQX1dPUkQ7CisJaW50IGlucXVvdGVzOworCXNpemVfdCBsZW5ndGg7CisJaW50IHN0YXJ0bG9jOworCisJaWYgKCEoZmxhZ3MgJiBFWFBfVkFSVElMREUpKSB7CisJCXJlamVjdCArPSAyOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBFWFBfVkFSVElMREUyKSB7CisJCXJlamVjdCsrOworCX0KKwlpbnF1b3RlcyA9IDA7CisJbGVuZ3RoID0gMDsKKwlpZiAoZmxhZ3MgJiBFWFBfVElMREUpIHsKKwkJY2hhciAqcTsKKworCQlmbGFncyAmPSB+RVhQX1RJTERFOworIHRpbGRlOgorCQlxID0gcDsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKSpxID09IENUTEVTQyAmJiAoZmxhZ3MgJiBFWFBfUVdPUkQpKQorCQkJcSsrOworCQlpZiAoKnEgPT0gJ34nKQorCQkJcCA9IGV4cHRpbGRlKHAsIHEsIGZsYWdzKTsKKwl9Cisgc3RhcnQ6CisJc3RhcnRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGM7CisKKwkJbGVuZ3RoICs9IHN0cmNzcG4ocCArIGxlbmd0aCwgcmVqZWN0KTsKKwkJYyA9IHBbbGVuZ3RoXTsKKwkJaWYgKGMpIHsKKwkJCWlmICghKGMgJiAweDgwKQorCQkJSUZfU0hfTUFUSF9TVVBQT1JUKHx8IGMgPT0gQ1RMRU5EQVJJKQorCQkJKSB7CisJCQkJLyogYyA9PSAnPScgfHwgYyA9PSAnOicgfHwgYyA9PSBDVExFTkRBUkkgKi8KKwkJCQlsZW5ndGgrKzsKKwkJCX0KKwkJfQorCQlpZiAobGVuZ3RoID4gMCkgeworCQkJaW50IG5ld2xvYzsKKwkJCWV4cGRlc3QgPSBzdGFja19ucHV0c3RyKHAsIGxlbmd0aCwgZXhwZGVzdCk7CisJCQluZXdsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCQlpZiAoYnJlYWthbGwgJiYgIWlucXVvdGVzICYmIG5ld2xvYyA+IHN0YXJ0bG9jKSB7CisJCQkJcmVjb3JkcmVnaW9uKHN0YXJ0bG9jLCBuZXdsb2MsIDApOworCQkJfQorCQkJc3RhcnRsb2MgPSBuZXdsb2M7CisJCX0KKwkJcCArPSBsZW5ndGggKyAxOworCQlsZW5ndGggPSAwOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdcMCc6CisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJY2FzZSAnPSc6CisJCQlpZiAoZmxhZ3MgJiBFWFBfVkFSVElMREUyKSB7CisJCQkJcC0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZmxhZ3MgfD0gRVhQX1ZBUlRJTERFMjsKKwkJCXJlamVjdCsrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJzonOgorCQkJLyoKKwkJCSAqIHNvcnQgb2YgYSBoYWNrIC0gZXhwYW5kIHRpbGRlcyBpbiB2YXJpYWJsZQorCQkJICogYXNzaWdubWVudHMgKGFmdGVyIHRoZSBmaXJzdCAnPScgYW5kIGFmdGVyICc6J3MpLgorCQkJICovCisJCQlpZiAoKi0tcCA9PSAnficpIHsKKwkJCQlnb3RvIHRpbGRlOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSBDVExFTkRWQVI6IC8qID8/PyAqLworCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgQ1RMUVVPVEVNQVJLOgorCQkJLyogIiRAIiBzeW50YXggYWRoZXJlbmNlIGhhY2sgKi8KKwkJCWlmICghaW5xdW90ZXMKKwkJCSAmJiBtZW1jbXAocCwgZG9sYXRzdHIsIDQpID09IDAKKwkJCSAmJiAoICBwWzRdID09IChjaGFyKUNUTFFVT1RFTUFSSworCQkJICAgIHx8IChwWzRdID09IChjaGFyKUNUTEVORFZBUiAmJiBwWzVdID09IChjaGFyKUNUTFFVT1RFTUFSSykKKwkJCSAgICApCisJCQkpIHsKKwkJCQlwID0gZXZhbHZhcihwICsgMSwgZmxhZ3MsIC8qIHZhcl9zdHJfbGlzdDogKi8gTlVMTCkgKyAxOworCQkJCWdvdG8gc3RhcnQ7CisJCQl9CisJCQlpbnF1b3RlcyA9ICFpbnF1b3RlczsKKyBhZGRxdW90ZToKKwkJCWlmIChxdW90ZXMpIHsKKwkJCQlwLS07CisJCQkJbGVuZ3RoKys7CisJCQkJc3RhcnRsb2MrKzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENUTEVTQzoKKwkJCXN0YXJ0bG9jKys7CisJCQlsZW5ndGgrKzsKKwkJCWdvdG8gYWRkcXVvdGU7CisJCWNhc2UgQ1RMVkFSOgorCQkJcCA9IGV2YWx2YXIocCwgZmxhZ3MsIHZhcl9zdHJfbGlzdCk7CisJCQlnb3RvIHN0YXJ0OworCQljYXNlIENUTEJBQ0tROgorCQkJYyA9ICdcMCc7CisJCWNhc2UgQ1RMQkFDS1F8Q1RMUVVPVEU6CisJCQlleHBiYWNrcShhcmdiYWNrcS0+biwgYywgcXVvdGVzKTsKKwkJCWFyZ2JhY2txID0gYXJnYmFja3EtPm5leHQ7CisJCQlnb3RvIHN0YXJ0OworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJY2FzZSBDVExFTkRBUkk6CisJCQlwLS07CisJCQlleHBhcmkocXVvdGVzKTsKKwkJCWdvdG8gc3RhcnQ7CisjZW5kaWYKKwkJfQorCX0KKyBicmVha2xvb3A6IDsKK30KKworc3RhdGljIGNoYXIgKgorc2NhbmxlZnQoY2hhciAqc3RhcnRwLCBjaGFyICpybWVzYywgY2hhciAqcm1lc2NlbmQgVU5VU0VEX1BBUkFNLAorCQljaGFyICpwYXR0ZXJuLCBpbnQgcXVvdGVzLCBpbnQgemVybykKK3sKKwljaGFyICpsb2MsICpsb2MyOworCWNoYXIgYzsKKworCWxvYyA9IHN0YXJ0cDsKKwlsb2MyID0gcm1lc2M7CisJZG8geworCQlpbnQgbWF0Y2g7CisJCWNvbnN0IGNoYXIgKnMgPSBsb2MyOworCisJCWMgPSAqbG9jMjsKKwkJaWYgKHplcm8pIHsKKwkJCSpsb2MyID0gJ1wwJzsKKwkJCXMgPSBybWVzYzsKKwkJfQorCQltYXRjaCA9IHBtYXRjaChwYXR0ZXJuLCBzKTsKKworCQkqbG9jMiA9IGM7CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBsb2M7CisJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKmxvYyA9PSBDVExFU0MpCisJCQlsb2MrKzsKKwkJbG9jKys7CisJCWxvYzIrKzsKKwl9IHdoaWxlIChjKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKgorc2NhbnJpZ2h0KGNoYXIgKnN0YXJ0cCwgY2hhciAqcm1lc2MsIGNoYXIgKnJtZXNjZW5kLAorCQljaGFyICpwYXR0ZXJuLCBpbnQgcXVvdGVzLCBpbnQgbWF0Y2hfYXRfc3RhcnQpCit7CisjaWYgIUVOQUJMRV9BU0hfT1BUSU1JWkVfRk9SX1NJWkUKKwlpbnQgdHJ5Mm9wdGltaXplID0gbWF0Y2hfYXRfc3RhcnQ7CisjZW5kaWYKKwlpbnQgZXNjID0gMDsKKwljaGFyICpsb2M7CisJY2hhciAqbG9jMjsKKworCS8qIElmIHdlIGNhbGxlZCBieSAiJHt2L3BhdHRlcm4vcmVwbH0iIG9yICIke3YvL3BhdHRlcm4vcmVwbH0iOgorCSAqIHN0YXJ0cD0iZXNjYXBlZF92YWx1ZV9vZl92IiBybWVzYz0icmF3X3ZhbHVlX29mX3YiCisJICogcm1lc2NlbmQ9IiIocHRyIHRvIE5VTCBpbiBybWVzYykgcGF0dGVybj0icGF0dGVybiIgcXVvdGVzPW1hdGNoX2F0X3N0YXJ0PTEKKwkgKiBMb2dpYzoKKwkgKiBsb2Mgc3RhcnRzIGF0IE5VTCBhdCB0aGUgZW5kIG9mIHN0YXJ0cCwgbG9jMiBzdGFydHMgYXQgdGhlIGVuZCBvZiBybWVzYywKKwkgKiBhbmQgb24gZWFjaCBpdGVyYXRpb24gdGhleSBnbyBiYWNrIHR3by9vbmUgY2hhciB1bnRpbCB0aGV5IHJlYWNoIHRoZSBiZWdpbm5pbmcuCisJICogV2UgdHJ5IHRvIGZpbmQgYSBtYXRjaCBpbiAicmF3X3ZhbHVlX29mX3YiLCAicmF3X3ZhbHVlX29mXyIsICJyYXdfdmFsdWVfb2YiIGV0Yy4KKwkgKi8KKwkvKiBUT0RPOiBkb2N1bWVudCBpbiB3aGF0IG90aGVyIGNpcmN1bXN0YW5jZXMgd2UgYXJlIGNhbGxlZC4gKi8KKworCWZvciAobG9jID0gcGF0dGVybiAtIDEsIGxvYzIgPSBybWVzY2VuZDsgbG9jID49IHN0YXJ0cDsgbG9jMi0tKSB7CisJCWludCBtYXRjaDsKKwkJY2hhciBjID0gKmxvYzI7CisJCWNvbnN0IGNoYXIgKnMgPSBsb2MyOworCQlpZiAobWF0Y2hfYXRfc3RhcnQpIHsKKwkJCSpsb2MyID0gJ1wwJzsKKwkJCXMgPSBybWVzYzsKKwkJfQorCQltYXRjaCA9IHBtYXRjaChwYXR0ZXJuLCBzKTsKKwkJLy9iYl9lcnJvcl9tc2coInBtYXRjaChwYXR0ZXJuOiclcycsczonJXMnKTolZCIsIHBhdHRlcm4sIHMsIG1hdGNoKTsKKwkJKmxvYzIgPSBjOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbG9jOworI2lmICFFTkFCTEVfQVNIX09QVElNSVpFX0ZPUl9TSVpFCisJCWlmICh0cnkyb3B0aW1pemUpIHsKKwkJCS8qIE1heWJlIHdlIGNhbiBvcHRpbWl6ZSB0aGlzOgorCQkJICogaWYgcGF0dGVybiBlbmRzIHdpdGggdW5lc2NhcGVkICosIHdlIGNhbiBhdm9pZCBjaGVja2luZworCQkJICogc2hvcnRlciBzdHJpbmdzOiBpZiAiZm9vKiIgZG9lc250IG1hdGNoICJyYXdfdmFsdWVfb2ZfdiIsCisJCQkgKiBpdCB3b250IG1hdGNoIHRydW5jYXRlZCAicmF3X3ZhbHVlX29mXyIgc3RyaW5ncyB0b28uCisJCQkgKi8KKwkJCXVuc2lnbmVkIHBsZW4gPSBzdHJsZW4ocGF0dGVybik7CisJCQkvKiBEb2VzIGl0IGVuZCB3aXRoICIqIj8gKi8KKwkJCWlmIChwbGVuICE9IDAgJiYgcGF0dGVyblstLXBsZW5dID09ICcqJykgeworCQkJCS8qICJ4eHh4KiIgaXMgbm90IGVzY2FwZWQgKi8KKwkJCQkvKiAieHh4XCoiIGlzIGVzY2FwZWQgKi8KKwkJCQkvKiAieHhcXCoiIGlzIG5vdCBlc2NhcGVkICovCisJCQkJLyogInhcXFwqIiBpcyBlc2NhcGVkICovCisJCQkJaW50IHNsYXNoZXMgPSAwOworCQkJCXdoaWxlIChwbGVuICE9IDAgJiYgcGF0dGVyblstLXBsZW5dID09ICdcXCcpCisJCQkJCXNsYXNoZXMrKzsKKwkJCQlpZiAoIShzbGFzaGVzICYgMSkpCisJCQkJCWJyZWFrOyAvKiBlbmRzIHdpdGggdW5lc2NhcGVkICIqIiAqLworCQkJfQorCQkJdHJ5Mm9wdGltaXplID0gMDsKKwkJfQorI2VuZGlmCisJCWxvYy0tOworCQlpZiAocXVvdGVzKSB7CisJCQlpZiAoLS1lc2MgPCAwKSB7CisJCQkJZXNjID0gZXNjbGVuKHN0YXJ0cCwgbG9jKTsKKwkJCX0KKwkJCWlmIChlc2MgJSAyKSB7CisJCQkJZXNjLS07CisJCQkJbG9jLS07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZhcnVuc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZAordmFydW5zZXQoY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnVtc2csIGludCB2YXJmbGFncykKK3sKKwljb25zdCBjaGFyICptc2c7CisJY29uc3QgY2hhciAqdGFpbDsKKworCXRhaWwgPSBudWxsc3RyOworCW1zZyA9ICJwYXJhbWV0ZXIgbm90IHNldCI7CisJaWYgKHVtc2cpIHsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKSplbmQgPT0gQ1RMRU5EVkFSKSB7CisJCQlpZiAodmFyZmxhZ3MgJiBWU05VTCkKKwkJCQl0YWlsID0gIiBvciBudWxsIjsKKwkJfSBlbHNlIHsKKwkJCW1zZyA9IHVtc2c7CisJCX0KKwl9CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiUuKnM6ICVzJXMiLCAoaW50KShlbmQgLSB2YXIgLSAxKSwgdmFyLCBtc2csIHRhaWwpOworfQorCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorc3RhdGljIGNoYXIgKgorcGFyc2Vfc3ViX3BhdHRlcm4oY2hhciAqYXJnLCBpbnQgdmFyZmxhZ3MpCit7CisJY2hhciAqaWR4LCAqcmVwbCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBjOworCisJLy9jaGFyICpvcmdfYXJnID0gYXJnOworCS8vYmJfZXJyb3JfbXNnKCJhcmc6JyVzJyB2YXJmbGFnczoleCIsIGFyZywgdmFyZmxhZ3MpOworCWlkeCA9IGFyZzsKKwl3aGlsZSAoMSkgeworCQljID0gKmFyZzsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisJCWlmIChjID09ICcvJykgeworCQkJLyogT25seSB0aGUgZmlyc3QgJy8nIHNlZW4gaXMgb3VyIHNlcGFyYXRvciAqLworCQkJaWYgKCFyZXBsKSB7CisJCQkJcmVwbCA9IGlkeCArIDE7CisJCQkJYyA9ICdcMCc7CisJCQl9CisJCX0KKwkJKmlkeCsrID0gYzsKKwkJYXJnKys7CisJCS8qCisJCSAqIEV4YW1wbGU6IHY9J2FiXGMnOyBlY2hvICR7di9cXGIvX1xcX1x6X30KKwkJICogVGhlIHJlc3VsdCBpcyBhX1xfel9jIChub3QgYVxfXF96X2MpIQorCQkgKgorCQkgKiBFbmFibGUgZGVidWcgcHJpbnRzIGluIHRoaXMgZnVuY3Rpb24gYW5kIHlvdSdsbCBzZWU6CisJCSAqIGFzaDogYXJnOidcXGIvX1xcX3pfJyB2YXJmbGFnczpkCisJCSAqIGFzaDogcGF0dGVybjonXFxiJyByZXBsOidfXF96XycKKwkJICogVGhhdCBpcywgXFxiIGlzIGludGVycHJldGVkIGFzIFxcYiwgYnV0IFxcXyBhcyBcXyEKKwkJICogSU9XOiBzZWFyY2ggcGF0dGVybiBhbmQgcmVwbGFjZSBzdHJpbmcgdHJlYXQgYmFja3NsYXNoZXMKKwkJICogZGlmZmVyZW50bHkhIFRoYXQgaXMgdGhlIHJlYXNvbiB3aHkgd2UgY2hlY2sgcmVwbCBiZWxvdzoKKwkJICovCisJCWlmIChjID09ICdcXCcgJiYgKmFyZyA9PSAnXFwnICYmIHJlcGwgJiYgISh2YXJmbGFncyAmIFZTUVVPVEUpKQorCQkJYXJnKys7IC8qIHNraXAgYm90aCAnXCcsIG5vdCBqdXN0IGZpcnN0IG9uZSAqLworCX0KKwkqaWR4ID0gYzsgLyogTlVMICovCisJLy9iYl9lcnJvcl9tc2coInBhdHRlcm46JyVzJyByZXBsOiclcyciLCBvcmdfYXJnLCByZXBsKTsKKworCXJldHVybiByZXBsOworfQorI2VuZGlmIC8qIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorc3ViZXZhbHZhcihjaGFyICpwLCBjaGFyICp2YXJuYW1lLCBpbnQgc3RybG9jLCBpbnQgc3VidHlwZSwKKwkJaW50IHN0YXJ0bG9jLCBpbnQgdmFyZmxhZ3MsIGludCBxdW90ZXMsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpCit7CisJc3RydWN0IG5vZGVsaXN0ICpzYXZlYXJnYmFja3EgPSBhcmdiYWNrcTsKKwljaGFyICpzdGFydHA7CisJY2hhciAqbG9jOworCWNoYXIgKnJtZXNjLCAqcm1lc2NlbmQ7CisJY2hhciAqc3RyOworCUlGX0FTSF9CQVNIX0NPTVBBVChjb25zdCBjaGFyICpyZXBsID0gTlVMTDspCisJSUZfQVNIX0JBU0hfQ09NUEFUKGludCBwb3MsIGxlbiwgb3JpZ19sZW47KQorCWludCBzYXZlaGVyZWZkID0gaGVyZWZkOworCWludCBhbW91bnQsIHdvcmtsb2MsIHJlc2V0bG9jOworCWludCB6ZXJvOworCWNoYXIgKigqc2NhbikoY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciosIGludCwgaW50KTsKKworCS8vYmJfZXJyb3JfbXNnKCJzdWJldmFsdmFyKHA6JyVzJyx2YXJuYW1lOiclcycsc3RybG9jOiVkLHN1YnR5cGU6JWQsc3RhcnRsb2M6JWQsdmFyZmxhZ3M6JXgscXVvdGVzOiVkKSIsCisJLy8JCXAsIHZhcm5hbWUsIHN0cmxvYywgc3VidHlwZSwgc3RhcnRsb2MsIHZhcmZsYWdzLCBxdW90ZXMpOworCisJaGVyZWZkID0gLTE7CisJYXJnc3RyKHAsIChzdWJ0eXBlICE9IFZTQVNTSUdOICYmIHN1YnR5cGUgIT0gVlNRVUVTVElPTikgPyBFWFBfQ0FTRSA6IDAsCisJCQl2YXJfc3RyX2xpc3QpOworCVNUUFVUQygnXDAnLCBleHBkZXN0KTsKKwloZXJlZmQgPSBzYXZlaGVyZWZkOworCWFyZ2JhY2txID0gc2F2ZWFyZ2JhY2txOworCXN0YXJ0cCA9IChjaGFyICopc3RhY2tibG9jaygpICsgc3RhcnRsb2M7CisKKwlzd2l0Y2ggKHN1YnR5cGUpIHsKKwljYXNlIFZTQVNTSUdOOgorCQlzZXR2YXIodmFybmFtZSwgc3RhcnRwLCAwKTsKKwkJYW1vdW50ID0gc3RhcnRwIC0gZXhwZGVzdDsKKwkJU1RBREpVU1QoYW1vdW50LCBleHBkZXN0KTsKKwkJcmV0dXJuIHN0YXJ0cDsKKworCWNhc2UgVlNRVUVTVElPTjoKKwkJdmFydW5zZXQocCwgdmFybmFtZSwgc3RhcnRwLCB2YXJmbGFncyk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIFZTU1VCU1RSOgorCQlsb2MgPSBzdHIgPSBzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJCS8qIFJlYWQgUE9TIGluICR7dmFyOlBPUzpMRU59ICovCisJCXBvcyA9IGF0b2kobG9jKTsgLyogbnVtYmVyKGxvYykgZXJyb3JzIG91dCBvbiAiMTo0IiAqLworCQlsZW4gPSBzdHIgLSBzdGFydHAgLSAxOworCisJCS8qICpsb2MgIT0gJ1wwJywgZ3VhcmFudGVlZCBieSBwYXJzZXIgKi8KKwkJaWYgKHF1b3RlcykgeworCQkJY2hhciAqcHRyOworCisJCQkvKiBBZGp1c3QgdGhlIGxlbmd0aCBieSB0aGUgbnVtYmVyIG9mIGVzY2FwZXMgKi8KKwkJCWZvciAocHRyID0gc3RhcnRwOyBwdHIgPCAoc3RyIC0gMSk7IHB0cisrKSB7CisJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSpwdHIgPT0gQ1RMRVNDKSB7CisJCQkJCWxlbi0tOworCQkJCQlwdHIrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJb3JpZ19sZW4gPSBsZW47CisKKwkJaWYgKCpsb2MrKyA9PSAnOicpIHsKKwkJCS8qICR7dmFyOjpMRU59ICovCisJCQlsZW4gPSBudW1iZXIobG9jKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNraXAgUE9TIGluICR7dmFyOlBPUzpMRU59ICovCisJCQlsZW4gPSBvcmlnX2xlbjsKKwkJCXdoaWxlICgqbG9jICYmICpsb2MgIT0gJzonKSB7CisJCQkJLyogVE9ETz8KKwkJCQkgKiBiYXNoIGNvbXBsYWlucyBvbjogdmFyPXF3ZTsgZWNobyAke3ZhcjoxYToxMjN9CisJCQkJaWYgKCFpc2RpZ2l0KCpsb2MpKQorCQkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihtc2dfaWxsbnVtLCBzdHIpOworCQkJCSAqLworCQkJCWxvYysrOworCQkJfQorCQkJaWYgKCpsb2MrKyA9PSAnOicpIHsKKwkJCQlsZW4gPSBudW1iZXIobG9jKTsKKwkJCX0KKwkJfQorCQlpZiAocG9zID49IG9yaWdfbGVuKSB7CisJCQlwb3MgPSAwOworCQkJbGVuID0gMDsKKwkJfQorCQlpZiAobGVuID4gKG9yaWdfbGVuIC0gcG9zKSkKKwkJCWxlbiA9IG9yaWdfbGVuIC0gcG9zOworCisJCWZvciAoc3RyID0gc3RhcnRwOyBwb3M7IHN0cisrLCBwb3MtLSkgeworCQkJaWYgKHF1b3RlcyAmJiAodW5zaWduZWQgY2hhcikqc3RyID09IENUTEVTQykKKwkJCQlzdHIrKzsKKwkJfQorCQlmb3IgKGxvYyA9IHN0YXJ0cDsgbGVuOyBsZW4tLSkgeworCQkJaWYgKHF1b3RlcyAmJiAodW5zaWduZWQgY2hhcikqc3RyID09IENUTEVTQykKKwkJCQkqbG9jKysgPSAqc3RyKys7CisJCQkqbG9jKysgPSAqc3RyKys7CisJCX0KKwkJKmxvYyA9ICdcMCc7CisJCWFtb3VudCA9IGxvYyAtIGV4cGRlc3Q7CisJCVNUQURKVVNUKGFtb3VudCwgZXhwZGVzdCk7CisJCXJldHVybiBsb2M7CisjZW5kaWYKKwl9CisKKwlyZXNldGxvYyA9IGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKworCS8qIFdlJ2xsIGNvbWViYWNrIGhlcmUgaWYgd2UgZ3JvdyB0aGUgc3RhY2sgd2hpbGUgaGFuZGxpbmcKKwkgKiBhIFZTUkVQTEFDRSBvciBWU1JFUExBQ0VBTEwsIHNpbmNlIG91ciBwb2ludGVycyBpbnRvIHRoZQorCSAqIHN0YWNrIHdpbGwgbmVlZCByZWJhc2luZywgYW5kIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIG91ciB3b3JrCisJICogYXJlYXMgZWFjaCB0aW1lCisJICovCisgSUZfQVNIX0JBU0hfQ09NUEFUKHJlc3RhcnQ6KQorCisJYW1vdW50ID0gZXhwZGVzdCAtICgoY2hhciAqKXN0YWNrYmxvY2soKSArIHJlc2V0bG9jKTsKKwlTVEFESlVTVCgtYW1vdW50LCBleHBkZXN0KTsKKwlzdGFydHAgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0YXJ0bG9jOworCisJcm1lc2MgPSBzdGFydHA7CisJcm1lc2NlbmQgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0cmxvYzsKKwlpZiAocXVvdGVzKSB7CisJCXJtZXNjID0gcm1lc2NhcGVzKHN0YXJ0cCwgUk1FU0NBUEVfQUxMT0MgfCBSTUVTQ0FQRV9HUk9XKTsKKwkJaWYgKHJtZXNjICE9IHN0YXJ0cCkgeworCQkJcm1lc2NlbmQgPSBleHBkZXN0OworCQkJc3RhcnRwID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKwkJfQorCX0KKwlybWVzY2VuZC0tOworCXN0ciA9IChjaGFyICopc3RhY2tibG9jaygpICsgc3RybG9jOworCXByZWdsb2Ioc3RyLCB2YXJmbGFncyAmIFZTUVVPVEUsIDApOworCXdvcmtsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJaWYgKHN1YnR5cGUgPT0gVlNSRVBMQUNFIHx8IHN1YnR5cGUgPT0gVlNSRVBMQUNFQUxMKSB7CisJCWNoYXIgKmlkeCwgKmVuZDsKKworCQlpZiAoIXJlcGwpIHsKKwkJCXJlcGwgPSBwYXJzZV9zdWJfcGF0dGVybihzdHIsIHZhcmZsYWdzKTsKKwkJCS8vYmJfZXJyb3JfbXNnKCJyZXBsOiclcyciLCByZXBsKTsKKwkJCWlmICghcmVwbCkKKwkJCQlyZXBsID0gbnVsbHN0cjsKKwkJfQorCisJCS8qIElmIHRoZXJlJ3Mgbm8gcGF0dGVybiB0byBtYXRjaCwgcmV0dXJuIHRoZSBleHBhbnNpb24gdW5tb2xlc3RlZCAqLworCQlpZiAoc3RyWzBdID09ICdcMCcpCisJCQlyZXR1cm4gTlVMTDsKKworCQlsZW4gPSAwOworCQlpZHggPSBzdGFydHA7CisJCWVuZCA9IHN0ciAtIDE7CisJCXdoaWxlIChpZHggPCBlbmQpIHsKKyB0cnlfdG9fbWF0Y2g6CisJCQlsb2MgPSBzY2FucmlnaHQoaWR4LCBybWVzYywgcm1lc2NlbmQsIHN0ciwgcXVvdGVzLCAxKTsKKwkJCS8vYmJfZXJyb3JfbXNnKCJzY2FucmlnaHQoJyVzJyk6JyVzJyIsIHN0ciwgbG9jKTsKKwkJCWlmICghbG9jKSB7CisJCQkJLyogTm8gbWF0Y2gsIGFkdmFuY2UgKi8KKwkJCQljaGFyICpyZXN0YXJ0X2RldGVjdCA9IHN0YWNrYmxvY2soKTsKKyBza2lwX21hdGNoaW5nOgorCQkJCVNUUFVUQygqaWR4LCBleHBkZXN0KTsKKwkJCQlpZiAocXVvdGVzICYmICh1bnNpZ25lZCBjaGFyKSppZHggPT0gQ1RMRVNDKSB7CisJCQkJCWlkeCsrOworCQkJCQlsZW4rKzsKKwkJCQkJU1RQVVRDKCppZHgsIGV4cGRlc3QpOworCQkJCX0KKwkJCQlpZiAoc3RhY2tibG9jaygpICE9IHJlc3RhcnRfZGV0ZWN0KQorCQkJCQlnb3RvIHJlc3RhcnQ7CisJCQkJaWR4Kys7CisJCQkJbGVuKys7CisJCQkJcm1lc2MrKzsKKwkJCQkvKiBjb250aW51ZTsgLSBwcm9uZSB0byBxdWFkcmF0aWMgYmVoYXZpb3IsIHNtYXJ0ZXIgY29kZTogKi8KKwkJCQlpZiAoaWR4ID49IGVuZCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHN0clswXSA9PSAnKicpIHsKKwkJCQkJLyogUGF0dGVybiBpcyAiKmZvbyIuIElmICIqZm9vIiBkb2VzIG5vdCBtYXRjaCAibG9uZ19zdHJpbmciLAorCQkJCQkgKiBpdCB3b3VsZCBuZXZlciBtYXRjaCAib25nX3N0cmluZyIgZXRjLCBubyBwb2ludCBpbiB0cnlpbmcuCisJCQkJCSAqLworCQkJCQlnb3RvIHNraXBfbWF0Y2hpbmc7CisJCQkJfQorCQkJCWdvdG8gdHJ5X3RvX21hdGNoOworCQkJfQorCisJCQlpZiAoc3VidHlwZSA9PSBWU1JFUExBQ0VBTEwpIHsKKwkJCQl3aGlsZSAoaWR4IDwgbG9jKSB7CisJCQkJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKmlkeCA9PSBDVExFU0MpCisJCQkJCQlpZHgrKzsKKwkJCQkJaWR4Kys7CisJCQkJCXJtZXNjKys7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZHggPSBsb2M7CisJCQl9CisKKwkJCS8vYmJfZXJyb3JfbXNnKCJyZXBsOiclcyciLCByZXBsKTsKKwkJCWZvciAobG9jID0gKGNoYXIqKXJlcGw7ICpsb2M7IGxvYysrKSB7CisJCQkJY2hhciAqcmVzdGFydF9kZXRlY3QgPSBzdGFja2Jsb2NrKCk7CisJCQkJaWYgKHF1b3RlcyAmJiAqbG9jID09ICdcXCcpIHsKKwkJCQkJU1RQVVRDKENUTEVTQywgZXhwZGVzdCk7CisJCQkJCWxlbisrOworCQkJCX0KKwkJCQlTVFBVVEMoKmxvYywgZXhwZGVzdCk7CisJCQkJaWYgKHN0YWNrYmxvY2soKSAhPSByZXN0YXJ0X2RldGVjdCkKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCWxlbisrOworCQkJfQorCisJCQlpZiAoc3VidHlwZSA9PSBWU1JFUExBQ0UpIHsKKwkJCQkvL2JiX2Vycm9yX21zZygidGFpbDonJXMnLCBxdW90ZXM6JXgiLCBpZHgsIHF1b3Rlcyk7CisJCQkJd2hpbGUgKCppZHgpIHsKKwkJCQkJY2hhciAqcmVzdGFydF9kZXRlY3QgPSBzdGFja2Jsb2NrKCk7CisJCQkJCVNUUFVUQygqaWR4LCBleHBkZXN0KTsKKwkJCQkJaWYgKHN0YWNrYmxvY2soKSAhPSByZXN0YXJ0X2RldGVjdCkKKwkJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQkJbGVuKys7CisJCQkJCWlkeCsrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdlJ3ZlIHB1dCB0aGUgcmVwbGFjZWQgdGV4dCBpbnRvIGEgYnVmZmVyIGF0IHdvcmtsb2MsIG5vdworCQkgKiBtb3ZlIGl0IHRvIHRoZSByaWdodCBwbGFjZSBhbmQgYWRqdXN0IHRoZSBzdGFjay4KKwkJICovCisJCVNUUFVUQygnXDAnLCBleHBkZXN0KTsKKwkJc3RhcnRwID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKwkJbWVtbW92ZShzdGFydHAsIChjaGFyICopc3RhY2tibG9jaygpICsgd29ya2xvYywgbGVuICsgMSk7CisJCS8vYmJfZXJyb3JfbXNnKCJzdGFydHA6JyVzJyIsIHN0YXJ0cCk7CisJCWFtb3VudCA9IGV4cGRlc3QgLSAoc3RhcnRwICsgbGVuKTsKKwkJU1RBREpVU1QoLWFtb3VudCwgZXhwZGVzdCk7CisJCXJldHVybiBzdGFydHA7CisJfQorI2VuZGlmIC8qIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQgKi8KKworCXN1YnR5cGUgLT0gVlNUUklNUklHSFQ7CisjaWYgREVCVUcKKwlpZiAoc3VidHlwZSA8IDAgfHwgc3VidHlwZSA+IDcpCisJCWFib3J0KCk7CisjZW5kaWYKKwkvKiB6ZXJvID0gKHN1YnR5cGUgPT0gVlNUUklNTEVGVCB8fCBzdWJ0eXBlID09IFZTVFJJTUxFRlRNQVgpICovCisJemVybyA9IHN1YnR5cGUgPj4gMTsKKwkvKiBWU1RSSU1MRUZUL1ZTVFJJTVJJR0hUTUFYIC0+IHNjYW5sZWZ0ICovCisJc2NhbiA9IChzdWJ0eXBlICYgMSkgXiB6ZXJvID8gc2NhbmxlZnQgOiBzY2FucmlnaHQ7CisKKwlsb2MgPSBzY2FuKHN0YXJ0cCwgcm1lc2MsIHJtZXNjZW5kLCBzdHIsIHF1b3RlcywgemVybyk7CisJaWYgKGxvYykgeworCQlpZiAoemVybykgeworCQkJbWVtbW92ZShzdGFydHAsIGxvYywgc3RyIC0gbG9jKTsKKwkJCWxvYyA9IHN0YXJ0cCArIChzdHIgLSBsb2MpIC0gMTsKKwkJfQorCQkqbG9jID0gJ1wwJzsKKwkJYW1vdW50ID0gbG9jIC0gZXhwZGVzdDsKKwkJU1RBREpVU1QoYW1vdW50LCBleHBkZXN0KTsKKwl9CisJcmV0dXJuIGxvYzsKK30KKworLyoKKyAqIEFkZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWFsaXplZCB2YXJpYWJsZSB0byB0aGUgc3RhY2sgc3RyaW5nLgorICogbmFtZSBwYXJhbWV0ZXIgKGV4YW1wbGVzKToKKyAqIGFzaCAtYyAnZWNobyAkMScgICAgICBuYW1lOicxPScKKyAqIGFzaCAtYyAnZWNobyAkcXdlJyAgICBuYW1lOidxd2U9JworICogYXNoIC1jICdlY2hvICQkJyAgICAgIG5hbWU6JyQ9JworICogYXNoIC1jICdlY2hvICR7JH0nICAgIG5hbWU6JyQ9JworICogYXNoIC1jICdlY2hvICR7JCMjcX0nIG5hbWU6JyQ9cScKKyAqIGFzaCAtYyAnZWNobyAkeyMkfScgICBuYW1lOickPScKKyAqIG5vdGU6IGV4YW1wbGVzIHdpdGggYmFkIHNoZWxsIHN5bnRheDoKKyAqIGFzaCAtYyAnZWNobyAkeyMkMX0nICBuYW1lOickPTEnCisgKiBhc2ggLWMgJ2VjaG8gJHsjMSN9JyAgbmFtZTonMT0jJworICovCitzdGF0aWMgTk9JTkxJTkUgc3NpemVfdAordmFydmFsdWUoY2hhciAqbmFtZSwgaW50IHZhcmZsYWdzLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgbnVtOworCWludCBpOworCWludCBzZXBxID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJaW50IHN1YnR5cGUgPSB2YXJmbGFncyAmIFZTVFlQRTsKKwlpbnQgcXVvdGVzID0gZmxhZ3MgJiAoRVhQX0ZVTEwgfCBFWFBfQ0FTRSB8IEVYUF9SRURJUik7CisJaW50IHF1b3RlZCA9IHZhcmZsYWdzICYgVlNRVU9URTsKKwlpbnQgc3ludGF4ID0gcXVvdGVkID8gRFFTWU5UQVggOiBCQVNFU1lOVEFYOworCisJc3dpdGNoICgqbmFtZSkgeworCWNhc2UgJyQnOgorCQludW0gPSByb290cGlkOworCQlnb3RvIG51bXZhcjsKKwljYXNlICc/JzoKKwkJbnVtID0gZXhpdHN0YXR1czsKKwkJZ290byBudW12YXI7CisJY2FzZSAnIyc6CisJCW51bSA9IHNoZWxscGFyYW0ubnBhcmFtOworCQlnb3RvIG51bXZhcjsKKwljYXNlICchJzoKKwkJbnVtID0gYmFja2duZHBpZDsKKwkJaWYgKG51bSA9PSAwKQorCQkJcmV0dXJuIC0xOworIG51bXZhcjoKKwkJbGVuID0gY3Z0bnVtKG51bSk7CisJCWdvdG8gY2hlY2tfMWNoYXJfbmFtZTsKKwljYXNlICctJzoKKwkJZXhwZGVzdCA9IG1ha2VzdHJzcGFjZShOT1BUUywgZXhwZGVzdCk7CisJCWZvciAoaSA9IE5PUFRTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChvcHRsaXN0W2ldKSB7CisJCQkJVVNUUFVUQyhvcHRsZXR0ZXJzKGkpLCBleHBkZXN0KTsKKwkJCQlsZW4rKzsKKwkJCX0KKwkJfQorIGNoZWNrXzFjaGFyX25hbWU6CisjaWYgMAorCQkvKiBoYW5kbGVzIGNhc2VzIHNpbWlsYXIgdG8gJHsjJDF9ICovCisJCWlmIChuYW1lWzJdICE9ICdcMCcpCisJCQlyYWlzZV9lcnJvcl9zeW50YXgoImJhZCBzdWJzdGl0dXRpb24iKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlICdAJzogeworCQljaGFyICoqYXA7CisJCWludCBzZXA7CisKKwkJaWYgKHF1b3RlZCAmJiAoZmxhZ3MgJiBFWFBfRlVMTCkpIHsKKwkJCS8qIG5vdGU6IHRoaXMgaXMgbm90IG1lYW50IGFzIFBFT0YgdmFsdWUgKi8KKwkJCXNlcCA9IDEgPDwgQ0hBUl9CSVQ7CisJCQlnb3RvIHBhcmFtOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgJyonOgorCQlzZXAgPSBpZnNzZXQoKSA/ICh1bnNpZ25lZCBjaGFyKShpZnN2YWwoKVswXSkgOiAnICc7CisJCWkgPSBTSVQoc2VwLCBzeW50YXgpOworCQlpZiAocXVvdGVzICYmIChpID09IENDVEwgfHwgaSA9PSBDQkFDSykpCisJCQlzZXBxID0gMTsKKyBwYXJhbToKKwkJYXAgPSBzaGVsbHBhcmFtLnA7CisJCWlmICghYXApCisJCQlyZXR1cm4gLTE7CisJCXdoaWxlICgocCA9ICphcCsrKSAhPSBOVUxMKSB7CisJCQlzaXplX3QgcGFydGxlbjsKKworCQkJcGFydGxlbiA9IHN0cmxlbihwKTsKKwkJCWxlbiArPSBwYXJ0bGVuOworCisJCQlpZiAoIShzdWJ0eXBlID09IFZTUExVUyB8fCBzdWJ0eXBlID09IFZTTEVOR1RIKSkKKwkJCQltZW10b2Rlc3QocCwgcGFydGxlbiwgc3ludGF4LCBxdW90ZXMpOworCisJCQlpZiAoKmFwICYmIHNlcCkgeworCQkJCWNoYXIgKnE7CisKKwkJCQlsZW4rKzsKKwkJCQlpZiAoc3VidHlwZSA9PSBWU1BMVVMgfHwgc3VidHlwZSA9PSBWU0xFTkdUSCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcSA9IGV4cGRlc3Q7CisJCQkJaWYgKHNlcHEpCisJCQkJCVNUUFVUQyhDVExFU0MsIHEpOworCQkJCS8qIG5vdGU6IG1heSBwdXQgTlVMIGRlc3BpdGUgc2VwICE9IDAKKwkJCQkgKiAoc2VlIHNlcCA9IDEgPDwgQ0hBUl9CSVQgYWJvdmUpICovCisJCQkJU1RQVVRDKHNlcCwgcSk7CisJCQkJZXhwZGVzdCA9IHE7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxlbjsKKwl9IC8qIGNhc2UgJ0AnIGFuZCAnKicgKi8KKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwljYXNlICc4JzoKKwljYXNlICc5JzoKKwkJbnVtID0gYXRvaShuYW1lKTsgLyogbnVtYmVyKG5hbWUpIGZhaWxzIG9uICR7TiNzdHJ9IGV0YyAqLworCQlpZiAobnVtIDwgMCB8fCBudW0gPiBzaGVsbHBhcmFtLm5wYXJhbSkKKwkJCXJldHVybiAtMTsKKwkJcCA9IG51bSA/IHNoZWxscGFyYW0ucFtudW0gLSAxXSA6IGFyZzA7CisJCWdvdG8gdmFsdWU7CisJZGVmYXVsdDoKKwkJLyogTkI6IG5hbWUgaGFzIGZvcm0gIlZBUj0uLi4iICovCisKKwkJLyogIkE9YSBCPSRBIiBjYXNlOiB2YXJfc3RyX2xpc3QgaXMgYSBsaXN0IG9mICJBPWEiIHN0cmluZ3MKKwkJICogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgYmVmb3JlIHdlIGNoZWNrIHZhcmlhYmxlcy4gKi8KKwkJaWYgKHZhcl9zdHJfbGlzdCkgeworCQkJdW5zaWduZWQgbmFtZV9sZW4gPSAoc3RyY2hybnVsKG5hbWUsICc9JykgLSBuYW1lKSArIDE7CisJCQlwID0gTlVMTDsKKwkJCWRvIHsKKwkJCQljaGFyICpzdHIsICplcTsKKwkJCQlzdHIgPSB2YXJfc3RyX2xpc3QtPnRleHQ7CisJCQkJZXEgPSBzdHJjaHIoc3RyLCAnPScpOworCQkJCWlmICghZXEpIC8qIHN0b3AgYXQgZmlyc3Qgbm9uLWFzc2lnbm1lbnQgKi8KKwkJCQkJYnJlYWs7CisJCQkJZXErKzsKKwkJCQlpZiAobmFtZV9sZW4gPT0gKHVuc2lnbmVkKShlcSAtIHN0cikKKwkJCQkgJiYgc3RybmNtcChzdHIsIG5hbWUsIG5hbWVfbGVuKSA9PSAwCisJCQkJKSB7CisJCQkJCXAgPSBlcTsKKwkJCQkJLyogZ290byB2YWx1ZTsgLSBXUk9ORyEgKi8KKwkJCQkJLyogdGhpbmsgIkE9MSBBPTIgQj0kQSIgKi8KKwkJCQl9CisJCQkJdmFyX3N0cl9saXN0ID0gdmFyX3N0cl9saXN0LT5uZXh0OworCQkJfSB3aGlsZSAodmFyX3N0cl9saXN0KTsKKwkJCWlmIChwKQorCQkJCWdvdG8gdmFsdWU7CisJCX0KKwkJcCA9IGxvb2t1cHZhcihuYW1lKTsKKyB2YWx1ZToKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC0xOworCisJCWxlbiA9IHN0cmxlbihwKTsKKwkJaWYgKCEoc3VidHlwZSA9PSBWU1BMVVMgfHwgc3VidHlwZSA9PSBWU0xFTkdUSCkpCisJCQltZW10b2Rlc3QocCwgbGVuLCBzeW50YXgsIHF1b3Rlcyk7CisJCXJldHVybiBsZW47CisJfQorCisJaWYgKHN1YnR5cGUgPT0gVlNQTFVTIHx8IHN1YnR5cGUgPT0gVlNMRU5HVEgpCisJCVNUQURKVVNUKC1sZW4sIGV4cGRlc3QpOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBFeHBhbmQgYSB2YXJpYWJsZSwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZQorICogaW5wdXQgc3RyaW5nLgorICovCitzdGF0aWMgY2hhciAqCitldmFsdmFyKGNoYXIgKnAsIGludCBmbGFncywgc3RydWN0IHN0cmxpc3QgKnZhcl9zdHJfbGlzdCkKK3sKKwljaGFyIHZhcmZsYWdzOworCWNoYXIgc3VidHlwZTsKKwljaGFyIHF1b3RlZDsKKwljaGFyIGVhc3k7CisJY2hhciAqdmFyOworCWludCBwYXRsb2M7CisJaW50IHN0YXJ0bG9jOworCXNzaXplX3QgdmFybGVuOworCisJdmFyZmxhZ3MgPSAodW5zaWduZWQgY2hhcikgKnArKzsKKwlzdWJ0eXBlID0gdmFyZmxhZ3MgJiBWU1RZUEU7CisJcXVvdGVkID0gdmFyZmxhZ3MgJiBWU1FVT1RFOworCXZhciA9IHA7CisJZWFzeSA9ICghcXVvdGVkIHx8ICgqdmFyID09ICdAJyAmJiBzaGVsbHBhcmFtLm5wYXJhbSkpOworCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCXAgPSBzdHJjaHIocCwgJz0nKSArIDE7IC8vVE9ETzogdXNlIHZhcl9lbmQocCk/CisKKyBhZ2FpbjoKKwl2YXJsZW4gPSB2YXJ2YWx1ZSh2YXIsIHZhcmZsYWdzLCBmbGFncywgdmFyX3N0cl9saXN0KTsKKwlpZiAodmFyZmxhZ3MgJiBWU05VTCkKKwkJdmFybGVuLS07CisKKwlpZiAoc3VidHlwZSA9PSBWU1BMVVMpIHsKKwkJdmFybGVuID0gLTEgLSB2YXJsZW47CisJCWdvdG8gdnNwbHVzOworCX0KKworCWlmIChzdWJ0eXBlID09IFZTTUlOVVMpIHsKKyB2c3BsdXM6CisJCWlmICh2YXJsZW4gPCAwKSB7CisJCQlhcmdzdHIoCisJCQkJcCwKKwkJCQlmbGFncyB8IChxdW90ZWQgPyBFWFBfVElMREV8RVhQX1FXT1JEIDogRVhQX1RJTERFfEVYUF9XT1JEKSwKKwkJCQl2YXJfc3RyX2xpc3QKKwkJCSk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAoZWFzeSkKKwkJCWdvdG8gcmVjb3JkOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoc3VidHlwZSA9PSBWU0FTU0lHTiB8fCBzdWJ0eXBlID09IFZTUVVFU1RJT04pIHsKKwkJaWYgKHZhcmxlbiA8IDApIHsKKwkJCWlmIChzdWJldmFsdmFyKHAsIHZhciwgLyogc3RybG9jOiAqLyAwLAorCQkJCQlzdWJ0eXBlLCBzdGFydGxvYywgdmFyZmxhZ3MsCisJCQkJCS8qIHF1b3RlczogKi8gMCwKKwkJCQkJdmFyX3N0cl9saXN0KQorCQkJKSB7CisJCQkJdmFyZmxhZ3MgJj0gflZTTlVMOworCQkJCS8qCisJCQkJICogUmVtb3ZlIGFueSByZWNvcmRlZCByZWdpb25zIGJleW9uZAorCQkJCSAqIHN0YXJ0IG9mIHZhcmlhYmxlCisJCQkJICovCisJCQkJcmVtb3ZlcmVjb3JkcmVnaW9ucyhzdGFydGxvYyk7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChlYXN5KQorCQkJZ290byByZWNvcmQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmICh2YXJsZW4gPCAwICYmIHVmbGFnKQorCQl2YXJ1bnNldChwLCB2YXIsIDAsIDApOworCisJaWYgKHN1YnR5cGUgPT0gVlNMRU5HVEgpIHsKKwkJY3Z0bnVtKHZhcmxlbiA+IDAgPyB2YXJsZW4gOiAwKTsKKwkJZ290byByZWNvcmQ7CisJfQorCisJaWYgKHN1YnR5cGUgPT0gVlNOT1JNQUwpIHsKKwkJaWYgKGVhc3kpCisJCQlnb3RvIHJlY29yZDsKKwkJZ290byBlbmQ7CisJfQorCisjaWYgREVCVUcKKwlzd2l0Y2ggKHN1YnR5cGUpIHsKKwljYXNlIFZTVFJJTUxFRlQ6CisJY2FzZSBWU1RSSU1MRUZUTUFYOgorCWNhc2UgVlNUUklNUklHSFQ6CisJY2FzZSBWU1RSSU1SSUdIVE1BWDoKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBWU1NVQlNUUjoKKwljYXNlIFZTUkVQTEFDRToKKwljYXNlIFZTUkVQTEFDRUFMTDoKKyNlbmRpZgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKyNlbmRpZgorCisJaWYgKHZhcmxlbiA+PSAwKSB7CisJCS8qCisJCSAqIFRlcm1pbmF0ZSB0aGUgc3RyaW5nIGFuZCBzdGFydCByZWNvcmRpbmcgdGhlIHBhdHRlcm4KKwkJICogcmlnaHQgYWZ0ZXIgaXQKKwkJICovCisJCVNUUFVUQygnXDAnLCBleHBkZXN0KTsKKwkJcGF0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQlpZiAoTlVMTCA9PSBzdWJldmFsdmFyKHAsIC8qIHZhcm5hbWU6ICovIE5VTEwsIHBhdGxvYywgc3VidHlwZSwKKwkJCQlzdGFydGxvYywgdmFyZmxhZ3MsCisvL1RPRE86IHwgRVhQX1JFRElSIHRvbz8gQWxsIG90aGVyIHN1Y2ggcGxhY2VzIGRvIGl0IHRvbworCQkJCS8qIHF1b3RlczogKi8gZmxhZ3MgJiAoRVhQX0ZVTEwgfCBFWFBfQ0FTRSksCisJCQkJdmFyX3N0cl9saXN0KQorCQkpIHsKKwkJCWludCBhbW91bnQgPSBleHBkZXN0IC0gKAorCQkJCShjaGFyICopc3RhY2tibG9jaygpICsgcGF0bG9jIC0gMQorCQkJKTsKKwkJCVNUQURKVVNUKC1hbW91bnQsIGV4cGRlc3QpOworCQl9CisJCS8qIFJlbW92ZSBhbnkgcmVjb3JkZWQgcmVnaW9ucyBiZXlvbmQgc3RhcnQgb2YgdmFyaWFibGUgKi8KKwkJcmVtb3ZlcmVjb3JkcmVnaW9ucyhzdGFydGxvYyk7CisgcmVjb3JkOgorCQlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSwgcXVvdGVkKTsKKwl9CisKKyBlbmQ6CisJaWYgKHN1YnR5cGUgIT0gVlNOT1JNQUwpIHsgICAgICAvKiBza2lwIHRvIGVuZCBvZiBhbHRlcm5hdGl2ZSAqLworCQlpbnQgbmVzdGluZyA9IDE7CisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpwKys7CisJCQlpZiAoYyA9PSBDVExFU0MpCisJCQkJcCsrOworCQkJZWxzZSBpZiAoYyA9PSBDVExCQUNLUSB8fCBjID09IChDVExCQUNLUXxDVExRVU9URSkpIHsKKwkJCQlpZiAodmFybGVuID49IDApCisJCQkJCWFyZ2JhY2txID0gYXJnYmFja3EtPm5leHQ7CisJCQl9IGVsc2UgaWYgKGMgPT0gQ1RMVkFSKSB7CisJCQkJaWYgKCgqcCsrICYgVlNUWVBFKSAhPSBWU05PUk1BTCkKKwkJCQkJbmVzdGluZysrOworCQkJfSBlbHNlIGlmIChjID09IENUTEVORFZBUikgeworCQkJCWlmICgtLW5lc3RpbmcgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBCcmVhayB0aGUgYXJndW1lbnQgc3RyaW5nIGludG8gcGllY2VzIGJhc2VkIHVwb24gSUZTIGFuZCBhZGQgdGhlCisgKiBzdHJpbmdzIHRvIHRoZSBhcmd1bWVudCBsaXN0LiAgVGhlIHJlZ2lvbnMgb2YgdGhlIHN0cmluZyB0byBiZQorICogc2VhcmNoZWQgZm9yIElGUyBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBzdG9yZWQgYnkgcmVjb3JkcmVnaW9uLgorICovCitzdGF0aWMgdm9pZAoraWZzYnJlYWt1cChjaGFyICpzdHJpbmcsIHN0cnVjdCBhcmdsaXN0ICphcmdsaXN0KQoreworCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCWNoYXIgKnN0YXJ0OworCWNoYXIgKnA7CisJY2hhciAqcTsKKwljb25zdCBjaGFyICppZnMsICpyZWFsaWZzOworCWludCBpZnNzcGM7CisJaW50IG51bG9ubHk7CisKKwlzdGFydCA9IHN0cmluZzsKKwlpZiAoaWZzbGFzdHAgIT0gTlVMTCkgeworCQlpZnNzcGMgPSAwOworCQludWxvbmx5ID0gMDsKKwkJcmVhbGlmcyA9IGlmc3NldCgpID8gaWZzdmFsKCkgOiBkZWZpZnM7CisJCWlmc3AgPSAmaWZzZmlyc3Q7CisJCWRvIHsKKwkJCXAgPSBzdHJpbmcgKyBpZnNwLT5iZWdvZmY7CisJCQludWxvbmx5ID0gaWZzcC0+bnVsb25seTsKKwkJCWlmcyA9IG51bG9ubHkgPyBudWxsc3RyIDogcmVhbGlmczsKKwkJCWlmc3NwYyA9IDA7CisJCQl3aGlsZSAocCA8IHN0cmluZyArIGlmc3AtPmVuZG9mZikgeworCQkJCXEgPSBwOworCQkJCWlmICgodW5zaWduZWQgY2hhcikqcCA9PSBDVExFU0MpCisJCQkJCXArKzsKKwkJCQlpZiAoIXN0cmNocihpZnMsICpwKSkgeworCQkJCQlwKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoIW51bG9ubHkpCisJCQkJCWlmc3NwYyA9IChzdHJjaHIoZGVmaWZzLCAqcCkgIT0gTlVMTCk7CisJCQkJLyogSWdub3JlIElGUyB3aGl0ZXNwYWNlIGF0IHN0YXJ0ICovCisJCQkJaWYgKHEgPT0gc3RhcnQgJiYgaWZzc3BjKSB7CisJCQkJCXArKzsKKwkJCQkJc3RhcnQgPSBwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJKnEgPSAnXDAnOworCQkJCXNwID0gc3R6YWxsb2Moc2l6ZW9mKCpzcCkpOworCQkJCXNwLT50ZXh0ID0gc3RhcnQ7CisJCQkJKmFyZ2xpc3QtPmxhc3RwID0gc3A7CisJCQkJYXJnbGlzdC0+bGFzdHAgPSAmc3AtPm5leHQ7CisJCQkJcCsrOworCQkJCWlmICghbnVsb25seSkgeworCQkJCQlmb3IgKDs7KSB7CisJCQkJCQlpZiAocCA+PSBzdHJpbmcgKyBpZnNwLT5lbmRvZmYpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXEgPSBwOworCQkJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSpwID09IENUTEVTQykKKwkJCQkJCQlwKys7CisJCQkJCQlpZiAoc3RyY2hyKGlmcywgKnApID09IE5VTEwpIHsKKwkJCQkJCQlwID0gcTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChzdHJjaHIoZGVmaWZzLCAqcCkgPT0gTlVMTCkgeworCQkJCQkJCWlmIChpZnNzcGMpIHsKKwkJCQkJCQkJcCsrOworCQkJCQkJCQlpZnNzcGMgPSAwOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXAgPSBxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlwKys7CisJCQkJCX0KKwkJCQl9CisJCQkJc3RhcnQgPSBwOworCQkJfSAvKiB3aGlsZSAqLworCQkJaWZzcCA9IGlmc3AtPm5leHQ7CisJCX0gd2hpbGUgKGlmc3AgIT0gTlVMTCk7CisJCWlmIChudWxvbmx5KQorCQkJZ290byBhZGQ7CisJfQorCisJaWYgKCEqc3RhcnQpCisJCXJldHVybjsKKworIGFkZDoKKwlzcCA9IHN0emFsbG9jKHNpemVvZigqc3ApKTsKKwlzcC0+dGV4dCA9IHN0YXJ0OworCSphcmdsaXN0LT5sYXN0cCA9IHNwOworCWFyZ2xpc3QtPmxhc3RwID0gJnNwLT5uZXh0OworfQorCitzdGF0aWMgdm9pZAoraWZzZnJlZSh2b2lkKQoreworCXN0cnVjdCBpZnNyZWdpb24gKnA7CisKKwlJTlRfT0ZGOworCXAgPSBpZnNmaXJzdC5uZXh0OworCWRvIHsKKwkJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKwkJaWZzcCA9IHAtPm5leHQ7CisJCWZyZWUocCk7CisJCXAgPSBpZnNwOworCX0gd2hpbGUgKHApOworCWlmc2xhc3RwID0gTlVMTDsKKwlpZnNmaXJzdC5uZXh0ID0gTlVMTDsKKwlJTlRfT047Cit9CisKKy8qCisgKiBBZGQgYSBmaWxlIG5hbWUgdG8gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCithZGRmbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKworCXNwID0gc3R6YWxsb2Moc2l6ZW9mKCpzcCkpOworCXNwLT50ZXh0ID0gc3RzdHJkdXAobmFtZSk7CisJKmV4cGFyZy5sYXN0cCA9IHNwOworCWV4cGFyZy5sYXN0cCA9ICZzcC0+bmV4dDsKK30KKworLyoKKyAqIERvIG1ldGFjaGFyYWN0ZXIgKGkuZS4gKiwgPywgWy4uLl0pIGV4cGFuc2lvbi4KKyAqLworc3RhdGljIHZvaWQKK2V4cG1ldGEoY2hhciAqZXhwZGlyLCBjaGFyICplbmRkaXIsIGNoYXIgKm5hbWUpCit7CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICpzdGFydDsKKwljaGFyICplbmRuYW1lOworCWludCBtZXRhZmxhZzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKwlESVIgKmRpcnA7CisJc3RydWN0IGRpcmVudCAqZHA7CisJaW50IGF0ZW5kOworCWludCBtYXRjaGRvdDsKKworCW1ldGFmbGFnID0gMDsKKwlzdGFydCA9IG5hbWU7CisJZm9yIChwID0gbmFtZTsgKnA7IHArKykgeworCQlpZiAoKnAgPT0gJyonIHx8ICpwID09ICc/JykKKwkJCW1ldGFmbGFnID0gMTsKKwkJZWxzZSBpZiAoKnAgPT0gJ1snKSB7CisJCQljaGFyICpxID0gcCArIDE7CisJCQlpZiAoKnEgPT0gJyEnKQorCQkJCXErKzsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoKnEgPT0gJ1xcJykKKwkJCQkJcSsrOworCQkJCWlmICgqcSA9PSAnLycgfHwgKnEgPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCorK3EgPT0gJ10nKSB7CisJCQkJCW1ldGFmbGFnID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKCpwID09ICdcXCcpCisJCQlwKys7CisJCWVsc2UgaWYgKCpwID09ICcvJykgeworCQkJaWYgKG1ldGFmbGFnKQorCQkJCWdvdG8gb3V0OworCQkJc3RhcnQgPSBwICsgMTsKKwkJfQorCX0KKyBvdXQ6CisJaWYgKG1ldGFmbGFnID09IDApIHsgICAgLyogd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUgKi8KKwkJaWYgKGVuZGRpciAhPSBleHBkaXIpCisJCQltZXRhZmxhZysrOworCQlwID0gbmFtZTsKKwkJZG8geworCQkJaWYgKCpwID09ICdcXCcpCisJCQkJcCsrOworCQkJKmVuZGRpcisrID0gKnA7CisJCX0gd2hpbGUgKCpwKyspOworCQlpZiAobWV0YWZsYWcgPT0gMCB8fCBsc3RhdChleHBkaXIsICZzdGF0YikgPj0gMCkKKwkJCWFkZGZuYW1lKGV4cGRpcik7CisJCXJldHVybjsKKwl9CisJZW5kbmFtZSA9IHA7CisJaWYgKG5hbWUgPCBzdGFydCkgeworCQlwID0gbmFtZTsKKwkJZG8geworCQkJaWYgKCpwID09ICdcXCcpCisJCQkJcCsrOworCQkJKmVuZGRpcisrID0gKnArKzsKKwkJfSB3aGlsZSAocCA8IHN0YXJ0KTsKKwl9CisJaWYgKGVuZGRpciA9PSBleHBkaXIpIHsKKwkJY3AgPSAiLiI7CisJfSBlbHNlIGlmIChlbmRkaXIgPT0gZXhwZGlyICsgMSAmJiAqZXhwZGlyID09ICcvJykgeworCQljcCA9ICIvIjsKKwl9IGVsc2UgeworCQljcCA9IGV4cGRpcjsKKwkJZW5kZGlyWy0xXSA9ICdcMCc7CisJfQorCWRpcnAgPSBvcGVuZGlyKGNwKTsKKwlpZiAoZGlycCA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGVuZGRpciAhPSBleHBkaXIpCisJCWVuZGRpclstMV0gPSAnLyc7CisJaWYgKCplbmRuYW1lID09IDApIHsKKwkJYXRlbmQgPSAxOworCX0gZWxzZSB7CisJCWF0ZW5kID0gMDsKKwkJKmVuZG5hbWUrKyA9ICdcMCc7CisJfQorCW1hdGNoZG90ID0gMDsKKwlwID0gc3RhcnQ7CisJaWYgKCpwID09ICdcXCcpCisJCXArKzsKKwlpZiAoKnAgPT0gJy4nKQorCQltYXRjaGRvdCsrOworCXdoaWxlICghcGVuZGluZ19pbnQgJiYgKGRwID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgeworCQlpZiAoZHAtPmRfbmFtZVswXSA9PSAnLicgJiYgIW1hdGNoZG90KQorCQkJY29udGludWU7CisJCWlmIChwbWF0Y2goc3RhcnQsIGRwLT5kX25hbWUpKSB7CisJCQlpZiAoYXRlbmQpIHsKKwkJCQlzdHJjcHkoZW5kZGlyLCBkcC0+ZF9uYW1lKTsKKwkJCQlhZGRmbmFtZShleHBkaXIpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKHAgPSBlbmRkaXIsIGNwID0gZHAtPmRfbmFtZTsgKCpwKysgPSAqY3ArKykgIT0gJ1wwJzspCisJCQkJCWNvbnRpbnVlOworCQkJCXBbLTFdID0gJy8nOworCQkJCWV4cG1ldGEoZXhwZGlyLCBwLCBlbmRuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZWRpcihkaXJwKTsKKwlpZiAoIWF0ZW5kKQorCQllbmRuYW1lWy0xXSA9ICcvJzsKK30KKworc3RhdGljIHN0cnVjdCBzdHJsaXN0ICoKK21zb3J0KHN0cnVjdCBzdHJsaXN0ICpsaXN0LCBpbnQgbGVuKQoreworCXN0cnVjdCBzdHJsaXN0ICpwLCAqcSA9IE5VTEw7CisJc3RydWN0IHN0cmxpc3QgKipscHA7CisJaW50IGhhbGY7CisJaW50IG47CisKKwlpZiAobGVuIDw9IDEpCisJCXJldHVybiBsaXN0OworCWhhbGYgPSBsZW4gPj4gMTsKKwlwID0gbGlzdDsKKwlmb3IgKG4gPSBoYWxmOyAtLW4gPj0gMDspIHsKKwkJcSA9IHA7CisJCXAgPSBwLT5uZXh0OworCX0KKwlxLT5uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0ZSBmaXJzdCBoYWxmIG9mIGxpc3QgKi8KKwlxID0gbXNvcnQobGlzdCwgaGFsZik7ICAgICAgICAgIC8qIHNvcnQgZmlyc3QgaGFsZiBvZiBsaXN0ICovCisJcCA9IG1zb3J0KHAsIGxlbiAtIGhhbGYpOyAgICAgICAgICAgICAgIC8qIHNvcnQgc2Vjb25kIGhhbGYgKi8KKwlscHAgPSAmbGlzdDsKKwlmb3IgKDs7KSB7CisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJCWlmIChzdHJjb2xsKHAtPnRleHQsIHEtPnRleHQpIDwgMCkKKyNlbHNlCisJCWlmIChzdHJjbXAocC0+dGV4dCwgcS0+dGV4dCkgPCAwKQorI2VuZGlmCisJCQkJCQl7CisJCQkqbHBwID0gcDsKKwkJCWxwcCA9ICZwLT5uZXh0OworCQkJcCA9ICpscHA7CisJCQlpZiAocCA9PSBOVUxMKSB7CisJCQkJKmxwcCA9IHE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkqbHBwID0gcTsKKwkJCWxwcCA9ICZxLT5uZXh0OworCQkJcSA9ICpscHA7CisJCQlpZiAocSA9PSBOVUxMKSB7CisJCQkJKmxwcCA9IHA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGxpc3Q7Cit9CisKKy8qCisgKiBTb3J0IHRoZSByZXN1bHRzIG9mIGZpbGUgbmFtZSBleHBhbnNpb24uICBJdCBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YKKyAqIHN0cmluZ3MgdG8gc29ydCBhbmQgdGhlbiBjYWxscyBtc29ydCAoc2hvcnQgZm9yIG1lcmdlIHNvcnQpIHRvIGRvIHRoZQorICogd29yay4KKyAqLworc3RhdGljIHN0cnVjdCBzdHJsaXN0ICoKK2V4cHNvcnQoc3RydWN0IHN0cmxpc3QgKnN0cikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKworCWxlbiA9IDA7CisJZm9yIChzcCA9IHN0cjsgc3A7IHNwID0gc3AtPm5leHQpCisJCWxlbisrOworCXJldHVybiBtc29ydChzdHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitleHBhbmRtZXRhKHN0cnVjdCBzdHJsaXN0ICpzdHIgLyosIGludCBmbGFnKi8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbWV0YWNoYXJzW10gQUxJR04xID0geworCQknKicsICc/JywgJ1snLCAwCisJfTsKKwkvKiBUT0RPIC0gRVhQX1JFRElSICovCisKKwl3aGlsZSAoc3RyKSB7CisJCWNoYXIgKmV4cGRpcjsKKwkJc3RydWN0IHN0cmxpc3QgKipzYXZlbGFzdHA7CisJCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwkJY2hhciAqcDsKKworCQlpZiAoZmZsYWcpCisJCQlnb3RvIG5vbWV0YTsKKwkJaWYgKCFzdHJwYnJrKHN0ci0+dGV4dCwgbWV0YWNoYXJzKSkKKwkJCWdvdG8gbm9tZXRhOworCQlzYXZlbGFzdHAgPSBleHBhcmcubGFzdHA7CisKKwkJSU5UX09GRjsKKwkJcCA9IHByZWdsb2Ioc3RyLT50ZXh0LCAwLCBSTUVTQ0FQRV9BTExPQyB8IFJNRVNDQVBFX0hFQVApOworCQl7CisJCQlpbnQgaSA9IHN0cmxlbihzdHItPnRleHQpOworCQkJZXhwZGlyID0gY2ttYWxsb2MoaSA8IDIwNDggPyAyMDQ4IDogaSk7IC8qIFhYWCAqLworCQl9CisJCWV4cG1ldGEoZXhwZGlyLCBleHBkaXIsIHApOworCQlmcmVlKGV4cGRpcik7CisJCWlmIChwICE9IHN0ci0+dGV4dCkKKwkJCWZyZWUocCk7CisJCUlOVF9PTjsKKwkJaWYgKGV4cGFyZy5sYXN0cCA9PSBzYXZlbGFzdHApIHsKKwkJCS8qCisJCQkgKiBubyBtYXRjaGVzCisJCQkgKi8KKyBub21ldGE6CisJCQkqZXhwYXJnLmxhc3RwID0gc3RyOworCQkJcm1lc2NhcGVzKHN0ci0+dGV4dCwgMCk7CisJCQlleHBhcmcubGFzdHAgPSAmc3RyLT5uZXh0OworCQl9IGVsc2UgeworCQkJKmV4cGFyZy5sYXN0cCA9IE5VTEw7CisJCQkqc2F2ZWxhc3RwID0gc3AgPSBleHBzb3J0KCpzYXZlbGFzdHApOworCQkJd2hpbGUgKHNwLT5uZXh0ICE9IE5VTEwpCisJCQkJc3AgPSBzcC0+bmV4dDsKKwkJCWV4cGFyZy5sYXN0cCA9ICZzcC0+bmV4dDsKKwkJfQorCQlzdHIgPSBzdHItPm5leHQ7CisJfQorfQorCisvKgorICogUGVyZm9ybSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uIG9uIGFuIGFyZ3VtZW50LAorICogcGxhY2luZyB0aGUgcmVzdWx0aW5nIGxpc3Qgb2YgYXJndW1lbnRzIGluIGFyZ2xpc3QuICBJZiBFWFBfRlVMTCBpcyB0cnVlLAorICogcGVyZm9ybSBzcGxpdHRpbmcgYW5kIGZpbGUgbmFtZSBleHBhbnNpb24uICBXaGVuIGFyZ2xpc3QgaXMgTlVMTCwgcGVyZm9ybQorICogaGVyZSBkb2N1bWVudCBleHBhbnNpb24uCisgKi8KK3N0YXRpYyB2b2lkCitleHBhbmRhcmcodW5pb24gbm9kZSAqYXJnLCBzdHJ1Y3QgYXJnbGlzdCAqYXJnbGlzdCwgaW50IGZsYWcpCit7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCWNoYXIgKnA7CisKKwlhcmdiYWNrcSA9IGFyZy0+bmFyZy5iYWNrcXVvdGU7CisJU1RBUlRTVEFDS1NUUihleHBkZXN0KTsKKwlpZnNmaXJzdC5uZXh0ID0gTlVMTDsKKwlpZnNsYXN0cCA9IE5VTEw7CisJYXJnc3RyKGFyZy0+bmFyZy50ZXh0LCBmbGFnLAorCQkJLyogdmFyX3N0cl9saXN0OiAqLyBhcmdsaXN0ID8gYXJnbGlzdC0+bGlzdCA6IE5VTEwpOworCXAgPSBfU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCWV4cGRlc3QgPSBwIC0gMTsKKwlpZiAoYXJnbGlzdCA9PSBOVUxMKSB7CisJCXJldHVybjsgICAgICAgICAgICAgICAgIC8qIGhlcmUgZG9jdW1lbnQgZXhwYW5kZWQgKi8KKwl9CisJcCA9IGdyYWJzdGFja3N0cihwKTsKKwlleHBhcmcubGFzdHAgPSAmZXhwYXJnLmxpc3Q7CisJLyoKKwkgKiBUT0RPIC0gRVhQX1JFRElSCisJICovCisJaWYgKGZsYWcgJiBFWFBfRlVMTCkgeworCQlpZnNicmVha3VwKHAsICZleHBhcmcpOworCQkqZXhwYXJnLmxhc3RwID0gTlVMTDsKKwkJZXhwYXJnLmxhc3RwID0gJmV4cGFyZy5saXN0OworCQlleHBhbmRtZXRhKGV4cGFyZy5saXN0IC8qLCBmbGFnKi8pOworCX0gZWxzZSB7CisJCWlmIChmbGFnICYgRVhQX1JFRElSKSAvKlhYWCAtIGZvciBub3csIGp1c3QgcmVtb3ZlIGVzY2FwZXMgKi8KKwkJCXJtZXNjYXBlcyhwLCAwKTsKKwkJc3AgPSBzdHphbGxvYyhzaXplb2YoKnNwKSk7CisJCXNwLT50ZXh0ID0gcDsKKwkJKmV4cGFyZy5sYXN0cCA9IHNwOworCQlleHBhcmcubGFzdHAgPSAmc3AtPm5leHQ7CisJfQorCWlmIChpZnNmaXJzdC5uZXh0KQorCQlpZnNmcmVlKCk7CisJKmV4cGFyZy5sYXN0cCA9IE5VTEw7CisJaWYgKGV4cGFyZy5saXN0KSB7CisJCSphcmdsaXN0LT5sYXN0cCA9IGV4cGFyZy5saXN0OworCQlhcmdsaXN0LT5sYXN0cCA9IGV4cGFyZy5sYXN0cDsKKwl9Cit9CisKKy8qCisgKiBFeHBhbmQgc2hlbGwgdmFyaWFibGVzIGFuZCBiYWNrcXVvdGVzIGluc2lkZSBhIGhlcmUgZG9jdW1lbnQuCisgKi8KK3N0YXRpYyB2b2lkCitleHBhbmRoZXJlKHVuaW9uIG5vZGUgKmFyZywgaW50IGZkKQoreworCWhlcmVmZCA9IGZkOworCWV4cGFuZGFyZyhhcmcsIChzdHJ1Y3QgYXJnbGlzdCAqKU5VTEwsIDApOworCWZ1bGxfd3JpdGUoZmQsIHN0YWNrYmxvY2soKSwgZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpKTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQKK3BhdG1hdGNoKGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlyZXR1cm4gcG1hdGNoKHByZWdsb2IocGF0dGVybiwgMCwgMCksIHN0cmluZyk7Cit9CisKKy8qCisgKiBTZWUgaWYgYSBwYXR0ZXJuIG1hdGNoZXMgaW4gYSBjYXNlIHN0YXRlbWVudC4KKyAqLworc3RhdGljIGludAorY2FzZW1hdGNoKHVuaW9uIG5vZGUgKnBhdHRlcm4sIGNoYXIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCWludCByZXN1bHQ7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdiYWNrcSA9IHBhdHRlcm4tPm5hcmcuYmFja3F1b3RlOworCVNUQVJUU1RBQ0tTVFIoZXhwZGVzdCk7CisJaWZzbGFzdHAgPSBOVUxMOworCWFyZ3N0cihwYXR0ZXJuLT5uYXJnLnRleHQsIEVYUF9USUxERSB8IEVYUF9DQVNFLAorCQkJLyogdmFyX3N0cl9saXN0OiAqLyBOVUxMKTsKKwlTVEFDS1NUUk5VTChleHBkZXN0KTsKKwlyZXN1bHQgPSBwYXRtYXRjaChzdGFja2Jsb2NrKCksIHZhbCk7CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiA9PT09PT09PT09PT0gZmluZF9jb21tYW5kICovCisKK3N0cnVjdCBidWlsdGluY21kIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmJ1aWx0aW4pKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworCS8qIHVuc2lnbmVkIGZsYWdzOyAqLworfTsKKyNkZWZpbmUgSVNfQlVJTFRJTl9TUEVDSUFMKGIpICgoYiktPm5hbWVbMF0gJiAxKQorLyogInJlZ3VsYXIiIGJ1aWx0aW5zIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb21tYW5kcywKKyAqIHJlZ2FyZGxlc3Mgb2YgUEFUSD0uLi4uJWJ1aWx0aW4uLi4gcG9zaXRpb24gKi8KKyNkZWZpbmUgSVNfQlVJTFRJTl9SRUdVTEFSKGIpICgoYiktPm5hbWVbMF0gJiAyKQorI2RlZmluZSBJU19CVUlMVElOX0FTU0lHTihiKSAgKChiKS0+bmFtZVswXSAmIDQpCisKK3N0cnVjdCBjbWRlbnRyeSB7CisJc21hbGxpbnQgY21kdHlwZTsgICAgICAgLyogQ01EeHh4ICovCisJdW5pb24gcGFyYW0geworCQlpbnQgaW5kZXg7CisJCS8qIGluZGV4ID49IDAgZm9yIGNvbW1hbmRzIHdpdGhvdXQgcGF0aCAoc2xhc2hlcykgKi8KKwkJLyogKFRPRE86IHdoYXQgZXhhY3RseSBkb2VzIHRoZSB2YWx1ZSBtZWFuPyBQQVRIIHBvc2l0aW9uPykgKi8KKwkJLyogaW5kZXggPT0gLTEgZm9yIGNvbW1hbmRzIHdpdGggc2xhc2hlcyAqLworCQkvKiBpbmRleCA9PSAoLTIgLSBhcHBsZXRfbm8pIGZvciBOT0ZPUksgYXBwbGV0cyAqLworCQljb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCAqY21kOworCQlzdHJ1Y3QgZnVuY25vZGUgKmZ1bmM7CisJfSB1OworfTsKKy8qIHZhbHVlcyBvZiBjbWR0eXBlICovCisjZGVmaW5lIENNRFVOS05PV04gICAgICAtMSAgICAgIC8qIG5vIGVudHJ5IGluIHRhYmxlIGZvciBjb21tYW5kICovCisjZGVmaW5lIENNRE5PUk1BTCAgICAgICAwICAgICAgIC8qIGNvbW1hbmQgaXMgYW4gZXhlY3V0YWJsZSBwcm9ncmFtICovCisjZGVmaW5lIENNREZVTkNUSU9OICAgICAxICAgICAgIC8qIGNvbW1hbmQgaXMgYSBzaGVsbCBmdW5jdGlvbiAqLworI2RlZmluZSBDTURCVUlMVElOICAgICAgMiAgICAgICAvKiBjb21tYW5kIGlzIGEgc2hlbGwgYnVpbHRpbiAqLworCisvKiBhY3Rpb24gdG8gZmluZF9jb21tYW5kKCkgKi8KKyNkZWZpbmUgRE9fRVJSICAgICAgICAgIDB4MDEgICAgLyogcHJpbnRzIGVycm9ycyAqLworI2RlZmluZSBET19BQlMgICAgICAgICAgMHgwMiAgICAvKiBjaGVja3MgYWJzb2x1dGUgcGF0aHMgKi8KKyNkZWZpbmUgRE9fTk9GVU5DICAgICAgIDB4MDQgICAgLyogZG9uJ3QgcmV0dXJuIHNoZWxsIGZ1bmN0aW9ucywgZm9yIGNvbW1hbmQgKi8KKyNkZWZpbmUgRE9fQUxUUEFUSCAgICAgIDB4MDggICAgLyogdXNpbmcgYWx0ZXJuYXRlIHBhdGggKi8KKyNkZWZpbmUgRE9fQUxUQkxUSU4gICAgIDB4MjAgICAgLyogJWJ1aWx0aW4gaW4gYWx0LiBwYXRoICovCisKK3N0YXRpYyB2b2lkIGZpbmRfY29tbWFuZChjaGFyICosIHN0cnVjdCBjbWRlbnRyeSAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CisKKworLyogPT09PT09PT09PT09IEhhc2hpbmcgY29tbWFuZHMgKi8KKworLyoKKyAqIFdoZW4gY29tbWFuZHMgYXJlIGZpcnN0IGVuY291bnRlcmVkLCB0aGV5IGFyZSBlbnRlcmVkIGluIGEgaGFzaCB0YWJsZS4KKyAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZnVsbCBwYXRoIHNlYXJjaCB3aWxsIG5vdCBoYXZlIHRvIGJlIGRvbmUgZm9yIHRoZW0KKyAqIG9uIGVhY2ggaW52b2NhdGlvbi4KKyAqCisgKiBXZSBzaG91bGQgaW52ZXN0aWdhdGUgY29udmVydGluZyB0byBhIGxpbmVhciBzZWFyY2gsIGV2ZW4gdGhvdWdoIHRoYXQKKyAqIHdvdWxkIG1ha2UgdGhlIGNvbW1hbmQgbmFtZSAiaGFzaCIgYSBtaXNub21lci4KKyAqLworCitzdHJ1Y3QgdGJsZW50cnkgeworCXN0cnVjdCB0YmxlbnRyeSAqbmV4dDsgIC8qIG5leHQgZW50cnkgaW4gaGFzaCBjaGFpbiAqLworCXVuaW9uIHBhcmFtIHBhcmFtOyAgICAgIC8qIGRlZmluaXRpb24gb2YgYnVpbHRpbiBmdW5jdGlvbiAqLworCXNtYWxsaW50IGNtZHR5cGU7ICAgICAgIC8qIENNRHh4eCAqLworCWNoYXIgcmVoYXNoOyAgICAgICAgICAgIC8qIGlmIHNldCwgY2QgZG9uZSBzaW5jZSBlbnRyeSBjcmVhdGVkICovCisJY2hhciBjbWRuYW1lWzFdOyAgICAgICAgLyogbmFtZSBvZiBjb21tYW5kICovCit9OworCitzdGF0aWMgc3RydWN0IHRibGVudHJ5ICoqY21kdGFibGU7CisjZGVmaW5lIElOSVRfR19jbWR0YWJsZSgpIGRvIHsgXAorCWNtZHRhYmxlID0geHphbGxvYyhDTURUQUJMRVNJWkUgKiBzaXplb2YoY21kdGFibGVbMF0pKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBidWlsdGlubG9jID0gLTE7ICAgICAvKiBpbmRleCBpbiBwYXRoIG9mICVidWlsdGluLCBvciAtMSAqLworCisKK3N0YXRpYyB2b2lkCit0cnlleGVjKElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORShpbnQgYXBwbGV0X25vLCkgY2hhciAqY21kLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCWlmIChhcHBsZXRfbm8gPj0gMCkgeworCQlpZiAoQVBQTEVUX0lTX05PRVhFQyhhcHBsZXRfbm8pKSB7CisJCQljbGVhcmVudigpOworCQkJd2hpbGUgKCplbnZwKQorCQkJCXB1dGVudigqZW52cCsrKTsKKwkJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYXBwbGV0X25vLCBhcmd2KTsKKwkJfQorCQkvKiByZS1leGVjIG91cnNlbHZlcyB3aXRoIHRoZSBuZXcgYXJndW1lbnRzICovCisJCWV4ZWN2ZShiYl9idXN5Ym94X2V4ZWNfcGF0aCwgYXJndiwgZW52cCk7CisJCS8qIElmIHRoZXkgY2FsbGVkIGNocm9vdCBvciBvdGhlcndpc2UgbWFkZSB0aGUgYmluYXJ5IG5vIGxvbmdlcgorCQkgKiBleGVjdXRhYmxlLCBmYWxsIHRocm91Z2ggKi8KKwl9CisjZW5kaWYKKworIHJlcGVhdDoKKyNpZmRlZiBTWVNWCisJZG8geworCQlleGVjdmUoY21kLCBhcmd2LCBlbnZwKTsKKwl9IHdoaWxlIChlcnJubyA9PSBFSU5UUik7CisjZWxzZQorCWV4ZWN2ZShjbWQsIGFyZ3YsIGVudnApOworI2VuZGlmCisJaWYgKGNtZCA9PSAoY2hhciopIGJiX2J1c3lib3hfZXhlY19wYXRoKSB7CisJCS8qIFdlIGFscmVhZHkgdmlzaXRlZCBFTk9FWEVDIGJyYW5jaCBiZWxvdywgZG9uJ3QgZG8gaXQgYWdhaW4gKi8KKy8vVE9ETzogdHJ5IGV4ZWN2ZShpbml0aWFsX2FyZ3YwX29mX3NoZWxsLCBhcmd2LCBlbnZwKSBiZWZvcmUgZ2l2aW5nIHVwPworCQlmcmVlKGFyZ3YpOworCQlyZXR1cm47CisJfQorCWlmIChlcnJubyA9PSBFTk9FWEVDKSB7CisJCS8qIFJ1biAiY21kIiBhcyBhIHNoZWxsIHNjcmlwdDoKKwkJICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL1YzX2NoYXAwMi5odG1sCisJCSAqICJJZiB0aGUgZXhlY3ZlKCkgZnVuY3Rpb24gZmFpbHMgd2l0aCBFTk9FWEVDLCB0aGUgc2hlbGwKKwkJICogc2hhbGwgZXhlY3V0ZSBhIGNvbW1hbmQgZXF1aXZhbGVudCB0byBoYXZpbmcgYSBzaGVsbCBpbnZva2VkCisJCSAqIHdpdGggdGhlIGNvbW1hbmQgbmFtZSBhcyBpdHMgZmlyc3Qgb3BlcmFuZCwKKwkJICogd2l0aCBhbnkgcmVtYWluaW5nIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG5ldyBzaGVsbCIKKwkJICoKKwkJICogVGhhdCBpcywgZG8gbm90IHVzZSAkU0hFTEwsIHVzZXIncyBzaGVsbCwgb3IgL2Jpbi9zaDsKKwkJICoganVzdCBjYWxsIG91cnNlbHZlcy4KKwkJICovCisJCWNoYXIgKiphcDsKKwkJY2hhciAqKm5ldzsKKworCQlmb3IgKGFwID0gYXJndjsgKmFwOyBhcCsrKQorCQkJY29udGludWU7CisJCW5ldyA9IGNrbWFsbG9jKChhcCAtIGFyZ3YgKyAyKSAqIHNpemVvZihuZXdbMF0pKTsKKwkJbmV3WzBdID0gKGNoYXIqKSAiYXNoIjsKKwkJbmV3WzFdID0gY21kOworCQlhcCA9IG5ldyArIDI7CisJCXdoaWxlICgoKmFwKysgPSAqKythcmd2KSAhPSBOVUxMKQorCQkJY29udGludWU7CisJCWNtZCA9IChjaGFyKikgYmJfYnVzeWJveF9leGVjX3BhdGg7CisJCWFyZ3YgPSBuZXc7CisJCWdvdG8gcmVwZWF0OworCX0KK30KKworLyoKKyAqIEV4ZWMgYSBwcm9ncmFtLiAgTmV2ZXIgcmV0dXJucy4gIElmIHlvdSBjaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UgbWF5CisgKiBoYXZlIHRvIGNoYW5nZSB0aGUgZmluZF9jb21tYW5kIHJvdXRpbmUgYXMgd2VsbC4KKyAqLworc3RhdGljIHZvaWQgc2hlbGxleGVjKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgaW50KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCitzaGVsbGV4ZWMoY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBpZHgpCit7CisJY2hhciAqY21kbmFtZTsKKwlpbnQgZTsKKwljaGFyICoqZW52cDsKKwlpbnQgZXhlcnJubzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisJaW50IGFwcGxldF9ubyA9IC0xOworI2VuZGlmCisKKwljbGVhcnJlZGlyKC8qZHJvcDoqLyAxKTsKKwllbnZwID0gbGlzdHZhcnMoVkVYUE9SVCwgVlVOU0VULCAvKmVuZDoqLyBOVUxMKTsKKwlpZiAoc3RyY2hyKGFyZ3ZbMF0sICcvJykgIT0gTlVMTAorI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwkgfHwgKGFwcGxldF9ubyA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXJndlswXSkpID49IDAKKyNlbmRpZgorCSkgeworCQl0cnlleGVjKElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORShhcHBsZXRfbm8sKSBhcmd2WzBdLCBhcmd2LCBlbnZwKTsKKwkJZSA9IGVycm5vOworCX0gZWxzZSB7CisJCWUgPSBFTk9FTlQ7CisJCXdoaWxlICgoY21kbmFtZSA9IHBhdGhfYWR2YW5jZSgmcGF0aCwgYXJndlswXSkpICE9IE5VTEwpIHsKKwkJCWlmICgtLWlkeCA8IDAgJiYgcGF0aG9wdCA9PSBOVUxMKSB7CisJCQkJdHJ5ZXhlYyhJRl9GRUFUVVJFX1NIX1NUQU5EQUxPTkUoLTEsKSBjbWRuYW1lLCBhcmd2LCBlbnZwKTsKKwkJCQlpZiAoZXJybm8gIT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RESVIpCisJCQkJCWUgPSBlcnJubzsKKwkJCX0KKwkJCXN0dW5hbGxvYyhjbWRuYW1lKTsKKwkJfQorCX0KKworCS8qIE1hcCB0byBQT1NJWCBlcnJvcnMgKi8KKwlzd2l0Y2ggKGUpIHsKKwljYXNlIEVBQ0NFUzoKKwkJZXhlcnJubyA9IDEyNjsKKwkJYnJlYWs7CisJY2FzZSBFTk9FTlQ6CisJCWV4ZXJybm8gPSAxMjc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWV4ZXJybm8gPSAyOworCQlicmVhazsKKwl9CisJZXhpdHN0YXR1cyA9IGV4ZXJybm87CisJVFJBQ0UoKCJzaGVsbGV4ZWMgZmFpbGVkIGZvciAlcywgZXJybm8gJWQsIHN1cHByZXNzX2ludCAlZFxuIiwKKwkJYXJndlswXSwgZSwgc3VwcHJlc3NfaW50KSk7CisJYXNoX21zZ19hbmRfcmFpc2UoRVhFWEVDLCAiJXM6ICVzIiwgYXJndlswXSwgZXJybXNnKGUsICJub3QgZm91bmQiKSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdm9pZAorcHJpbnRlbnRyeShzdHJ1Y3QgdGJsZW50cnkgKmNtZHApCit7CisJaW50IGlkeDsKKwljb25zdCBjaGFyICpwYXRoOworCWNoYXIgKm5hbWU7CisKKwlpZHggPSBjbWRwLT5wYXJhbS5pbmRleDsKKwlwYXRoID0gcGF0aHZhbCgpOworCWRvIHsKKwkJbmFtZSA9IHBhdGhfYWR2YW5jZSgmcGF0aCwgY21kcC0+Y21kbmFtZSk7CisJCXN0dW5hbGxvYyhuYW1lKTsKKwl9IHdoaWxlICgtLWlkeCA+PSAwKTsKKwlvdXQxZm10KCIlcyVzXG4iLCBuYW1lLCAoY21kcC0+cmVoYXNoID8gIioiIDogbnVsbHN0cikpOworfQorCisvKgorICogQ2xlYXIgb3V0IGNvbW1hbmQgZW50cmllcy4gIFRoZSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGZpcnN0IGVudHJ5IGluCisgKiBQQVRIIHdoaWNoIGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZAorY2xlYXJjbWRlbnRyeShpbnQgZmlyc3RjaGFuZ2UpCit7CisJc3RydWN0IHRibGVudHJ5ICoqdGJscDsKKwlzdHJ1Y3QgdGJsZW50cnkgKipwcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlJTlRfT0ZGOworCWZvciAodGJscCA9IGNtZHRhYmxlOyB0YmxwIDwgJmNtZHRhYmxlW0NNRFRBQkxFU0laRV07IHRibHArKykgeworCQlwcCA9IHRibHA7CisJCXdoaWxlICgoY21kcCA9ICpwcCkgIT0gTlVMTCkgeworCQkJaWYgKChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTCAmJgorCQkJICAgICBjbWRwLT5wYXJhbS5pbmRleCA+PSBmaXJzdGNoYW5nZSkKKwkJCSB8fCAoY21kcC0+Y21kdHlwZSA9PSBDTURCVUlMVElOICYmCisJCQkgICAgIGJ1aWx0aW5sb2MgPj0gZmlyc3RjaGFuZ2UpCisJCQkpIHsKKwkJCQkqcHAgPSBjbWRwLT5uZXh0OworCQkJCWZyZWUoY21kcCk7CisJCQl9IGVsc2UgeworCQkJCXBwID0gJmNtZHAtPm5leHQ7CisJCQl9CisJCX0KKwl9CisJSU5UX09OOworfQorCisvKgorICogTG9jYXRlIGEgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBoYXNoIHRhYmxlLiAgSWYgImFkZCIgaXMgbm9uemVybywKKyAqIGFkZCB0aGUgY29tbWFuZCB0byB0aGUgdGFibGUgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4gIFRoZQorICogdmFyaWFibGUgImxhc3RjbWRlbnRyeSIgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsaW5rCisgKiBwb2ludGluZyB0byB0aGUgZW50cnksIHNvIHRoYXQgZGVsZXRlX2NtZF9lbnRyeSBjYW4gZGVsZXRlIHRoZQorICogZW50cnkuCisgKgorICogSW50ZXJydXB0cyBtdXN0IGJlIG9mZiBpZiBjYWxsZWQgd2l0aCBhZGQgIT0gMC4KKyAqLworc3RhdGljIHN0cnVjdCB0YmxlbnRyeSAqKmxhc3RjbWRlbnRyeTsKKworc3RhdGljIHN0cnVjdCB0YmxlbnRyeSAqCitjbWRsb29rdXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGFkZCkKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaHZhbDsKKwljb25zdCBjaGFyICpwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKipwcDsKKworCXAgPSBuYW1lOworCWhhc2h2YWwgPSAodW5zaWduZWQgY2hhcikqcCA8PCA0OworCXdoaWxlICgqcCkKKwkJaGFzaHZhbCArPSAodW5zaWduZWQgY2hhcikqcCsrOworCWhhc2h2YWwgJj0gMHg3RkZGOworCXBwID0gJmNtZHRhYmxlW2hhc2h2YWwgJSBDTURUQUJMRVNJWkVdOworCWZvciAoY21kcCA9ICpwcDsgY21kcDsgY21kcCA9IGNtZHAtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChjbWRwLT5jbWRuYW1lLCBuYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJCXBwID0gJmNtZHAtPm5leHQ7CisJfQorCWlmIChhZGQgJiYgY21kcCA9PSBOVUxMKSB7CisJCWNtZHAgPSAqcHAgPSBja3phbGxvYyhzaXplb2Yoc3RydWN0IHRibGVudHJ5KQorCQkJCSsgc3RybGVuKG5hbWUpCisJCQkJLyogKyAxIC0gYWxyZWFkeSBkb25lIGJlY2F1c2UKKwkJCQkgKiB0YmxlbnRyeTo6Y21kbmFtZSBpcyBjaGFyWzFdICovKTsKKwkJLypjbWRwLT5uZXh0ID0gTlVMTDsgLSBja3phbGxvYyBkaWQgaXQgKi8KKwkJY21kcC0+Y21kdHlwZSA9IENNRFVOS05PV047CisJCXN0cmNweShjbWRwLT5jbWRuYW1lLCBuYW1lKTsKKwl9CisJbGFzdGNtZGVudHJ5ID0gcHA7CisJcmV0dXJuIGNtZHA7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGNvbW1hbmQgZW50cnkgcmV0dXJuZWQgb24gdGhlIGxhc3QgbG9va3VwLgorICovCitzdGF0aWMgdm9pZAorZGVsZXRlX2NtZF9lbnRyeSh2b2lkKQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCUlOVF9PRkY7CisJY21kcCA9ICpsYXN0Y21kZW50cnk7CisJKmxhc3RjbWRlbnRyeSA9IGNtZHAtPm5leHQ7CisJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pCisJCWZyZWVmdW5jKGNtZHAtPnBhcmFtLmZ1bmMpOworCWZyZWUoY21kcCk7CisJSU5UX09OOworfQorCisvKgorICogQWRkIGEgbmV3IGNvbW1hbmQgZW50cnksIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgY29tbWFuZCBlbnRyeSBmb3IKKyAqIHRoZSBzYW1lIG5hbWUgLSBleGNlcHQgc3BlY2lhbCBidWlsdGlucy4KKyAqLworc3RhdGljIHZvaWQKK2FkZGNtZGVudHJ5KGNoYXIgKm5hbWUsIHN0cnVjdCBjbWRlbnRyeSAqZW50cnkpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAxKTsKKwlpZiAoY21kcC0+Y21kdHlwZSA9PSBDTURGVU5DVElPTikgeworCQlmcmVlZnVuYyhjbWRwLT5wYXJhbS5mdW5jKTsKKwl9CisJY21kcC0+Y21kdHlwZSA9IGVudHJ5LT5jbWR0eXBlOworCWNtZHAtPnBhcmFtID0gZW50cnktPnU7CisJY21kcC0+cmVoYXNoID0gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2hhc2hjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCWludCBjOworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKwljaGFyICpuYW1lOworCisJaWYgKG5leHRvcHQoInIiKSAhPSAnXDAnKSB7CisJCWNsZWFyY21kZW50cnkoMCk7CisJCXJldHVybiAwOworCX0KKworCWlmICgqYXJncHRyID09IE5VTEwpIHsKKwkJZm9yIChwcCA9IGNtZHRhYmxlOyBwcCA8ICZjbWR0YWJsZVtDTURUQUJMRVNJWkVdOyBwcCsrKSB7CisJCQlmb3IgKGNtZHAgPSAqcHA7IGNtZHA7IGNtZHAgPSBjbWRwLT5uZXh0KSB7CisJCQkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMKQorCQkJCQlwcmludGVudHJ5KGNtZHApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKworCWMgPSAwOworCXdoaWxlICgobmFtZSA9ICphcmdwdHIpICE9IE5VTEwpIHsKKwkJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKTsKKwkJaWYgKGNtZHAgIT0gTlVMTAorCQkgJiYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMCisJCSAgICAgfHwgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTiAmJiBidWlsdGlubG9jID49IDApKQorCQkpIHsKKwkJCWRlbGV0ZV9jbWRfZW50cnkoKTsKKwkJfQorCQlmaW5kX2NvbW1hbmQobmFtZSwgJmVudHJ5LCBET19FUlIsIHBhdGh2YWwoKSk7CisJCWlmIChlbnRyeS5jbWR0eXBlID09IENNRFVOS05PV04pCisJCQljID0gMTsKKwkJYXJncHRyKys7CisJfQorCXJldHVybiBjOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSBjZCBpcyBkb25lLiAgTWFya3MgYWxsIGNvbW1hbmRzIHNvIHRoZSBuZXh0IHRpbWUgdGhleQorICogYXJlIGV4ZWN1dGVkIHRoZXkgd2lsbCBiZSByZWhhc2hlZC4KKyAqLworc3RhdGljIHZvaWQKK2hhc2hjZCh2b2lkKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWZvciAocHAgPSBjbWR0YWJsZTsgcHAgPCAmY21kdGFibGVbQ01EVEFCTEVTSVpFXTsgcHArKykgeworCQlmb3IgKGNtZHAgPSAqcHA7IGNtZHA7IGNtZHAgPSBjbWRwLT5uZXh0KSB7CisJCQlpZiAoY21kcC0+Y21kdHlwZSA9PSBDTUROT1JNQUwKKwkJCSB8fCAoY21kcC0+Y21kdHlwZSA9PSBDTURCVUlMVElOCisJCQkgICAgICYmICFJU19CVUlMVElOX1JFR1VMQVIoY21kcC0+cGFyYW0uY21kKQorCQkJICAgICAmJiBidWlsdGlubG9jID4gMCkKKwkJCSkgeworCQkJCWNtZHAtPnJlaGFzaCA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBGaXggY29tbWFuZCBoYXNoIHRhYmxlIHdoZW4gUEFUSCBjaGFuZ2VkLgorICogQ2FsbGVkIGJlZm9yZSBQQVRIIGlzIGNoYW5nZWQuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5ldyB2YWx1ZSBvZiBQQVRIOworICogcGF0aHZhbCgpIHN0aWxsIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBhdCB0aGlzIHBvaW50LgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQworY2hhbmdlcGF0aChjb25zdCBjaGFyICpuZXcpCit7CisJY29uc3QgY2hhciAqb2xkOworCWludCBmaXJzdGNoYW5nZTsKKwlpbnQgaWR4OworCWludCBpZHhfYmx0aW47CisKKwlvbGQgPSBwYXRodmFsKCk7CisJZmlyc3RjaGFuZ2UgPSA5OTk5OyAgICAgLyogYXNzdW1lIG5vIGNoYW5nZSAqLworCWlkeCA9IDA7CisJaWR4X2JsdGluID0gLTE7CisJZm9yICg7OykgeworCQlpZiAoKm9sZCAhPSAqbmV3KSB7CisJCQlmaXJzdGNoYW5nZSA9IGlkeDsKKwkJCWlmICgoKm9sZCA9PSAnXDAnICYmICpuZXcgPT0gJzonKQorCQkJIHx8ICgqb2xkID09ICc6JyAmJiAqbmV3ID09ICdcMCcpCisJCQkpIHsKKwkJCQlmaXJzdGNoYW5nZSsrOworCQkJfQorCQkJb2xkID0gbmV3OyAgICAgIC8qIGlnbm9yZSBzdWJzZXF1ZW50IGRpZmZlcmVuY2VzICovCisJCX0KKwkJaWYgKCpuZXcgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlpZiAoKm5ldyA9PSAnJScgJiYgaWR4X2JsdGluIDwgMCAmJiBwcmVmaXgobmV3ICsgMSwgImJ1aWx0aW4iKSkKKwkJCWlkeF9ibHRpbiA9IGlkeDsKKwkJaWYgKCpuZXcgPT0gJzonKQorCQkJaWR4Kys7CisJCW5ldysrOworCQlvbGQrKzsKKwl9CisJaWYgKGJ1aWx0aW5sb2MgPCAwICYmIGlkeF9ibHRpbiA+PSAwKQorCQlidWlsdGlubG9jID0gaWR4X2JsdGluOyAgICAgICAgICAgICAvKiB6YXAgYnVpbHRpbnMgKi8KKwlpZiAoYnVpbHRpbmxvYyA+PSAwICYmIGlkeF9ibHRpbiA8IDApCisJCWZpcnN0Y2hhbmdlID0gMDsKKwljbGVhcmNtZGVudHJ5KGZpcnN0Y2hhbmdlKTsKKwlidWlsdGlubG9jID0gaWR4X2JsdGluOworfQorCisjZGVmaW5lIFRFT0YgMAorI2RlZmluZSBUTkwgMQorI2RlZmluZSBUUkVESVIgMgorI2RlZmluZSBUV09SRCAzCisjZGVmaW5lIFRTRU1JIDQKKyNkZWZpbmUgVEJBQ0tHTkQgNQorI2RlZmluZSBUQU5EIDYKKyNkZWZpbmUgVE9SIDcKKyNkZWZpbmUgVFBJUEUgOAorI2RlZmluZSBUTFAgOQorI2RlZmluZSBUUlAgMTAKKyNkZWZpbmUgVEVORENBU0UgMTEKKyNkZWZpbmUgVEVOREJRVU9URSAxMgorI2RlZmluZSBUTk9UIDEzCisjZGVmaW5lIFRDQVNFIDE0CisjZGVmaW5lIFRETyAxNQorI2RlZmluZSBURE9ORSAxNgorI2RlZmluZSBURUxJRiAxNworI2RlZmluZSBURUxTRSAxOAorI2RlZmluZSBURVNBQyAxOQorI2RlZmluZSBURkkgMjAKKyNkZWZpbmUgVEZPUiAyMQorI2RlZmluZSBUSUYgMjIKKyNkZWZpbmUgVElOIDIzCisjZGVmaW5lIFRUSEVOIDI0CisjZGVmaW5lIFRVTlRJTCAyNQorI2RlZmluZSBUV0hJTEUgMjYKKyNkZWZpbmUgVEJFR0lOIDI3CisjZGVmaW5lIFRFTkQgMjgKK3R5cGVkZWYgc21hbGxpbnQgdG9rZW5faWRfdDsKKworLyogZmlyc3QgY2hhciBpcyBpbmRpY2F0aW5nIHdoaWNoIHRva2VucyBtYXJrIHRoZSBlbmQgb2YgYSBsaXN0ICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdG9rbmFtZV9hcnJheVtdID0geworCSJcMWVuZCBvZiBmaWxlIiwKKwkiXDBuZXdsaW5lIiwKKwkiXDByZWRpcmVjdGlvbiIsCisJIlwwd29yZCIsCisJIlwwOyIsCisJIlwwJiIsCisJIlwwJiYiLAorCSJcMHx8IiwKKwkiXDB8IiwKKwkiXDAoIiwKKwkiXDEpIiwKKwkiXDE7OyIsCisJIlwxYCIsCisjZGVmaW5lIEtXRE9GRlNFVCAxMworCS8qIHRoZSBmb2xsb3dpbmcgYXJlIGtleXdvcmRzICovCisJIlwwISIsCisJIlwwY2FzZSIsCisJIlwxZG8iLAorCSJcMWRvbmUiLAorCSJcMWVsaWYiLAorCSJcMWVsc2UiLAorCSJcMWVzYWMiLAorCSJcMWZpIiwKKwkiXDBmb3IiLAorCSJcMGlmIiwKKwkiXDBpbiIsCisJIlwxdGhlbiIsCisJIlwwdW50aWwiLAorCSJcMHdoaWxlIiwKKwkiXDB7IiwKKwkiXDF9IiwKK307CisKKy8qIFdyYXBwZXIgYXJvdW5kIHN0cmNtcCBmb3IgcXNvcnQvYnNlYXJjaC8uLi4gKi8KK3N0YXRpYyBpbnQKK3BzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwlyZXR1cm4gc3RyY21wKChjaGFyKikgYSwgKCooY2hhcioqKSBiKSArIDEpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgKgorZmluZGt3ZChjb25zdCBjaGFyICpzKQoreworCXJldHVybiBic2VhcmNoKHMsIHRva25hbWVfYXJyYXkgKyBLV0RPRkZTRVQsCisJCQlBUlJBWV9TSVpFKHRva25hbWVfYXJyYXkpIC0gS1dET0ZGU0VULAorCQkJc2l6ZW9mKHRva25hbWVfYXJyYXlbMF0pLCBwc3RyY21wKTsKK30KKworLyoKKyAqIExvY2F0ZSBhbmQgcHJpbnQgd2hhdCBhIHdvcmQgaXMuLi4KKyAqLworc3RhdGljIGludAorZGVzY3JpYmVfY29tbWFuZChjaGFyICpjb21tYW5kLCBpbnQgZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKQoreworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCWNvbnN0IHN0cnVjdCBhbGlhcyAqYXA7CisjZW5kaWYKKwljb25zdCBjaGFyICpwYXRoID0gcGF0aHZhbCgpOworCisJaWYgKGRlc2NyaWJlX2NvbW1hbmRfdmVyYm9zZSkgeworCQlvdXQxc3RyKGNvbW1hbmQpOworCX0KKworCS8qIEZpcnN0IGxvb2sgYXQgdGhlIGtleXdvcmRzICovCisJaWYgKGZpbmRrd2QoY29tbWFuZCkpIHsKKwkJb3V0MXN0cihkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UgPyAiIGlzIGEgc2hlbGwga2V5d29yZCIgOiBjb21tYW5kKTsKKwkJZ290byBvdXQ7CisJfQorCisjaWYgRU5BQkxFX0FTSF9BTElBUworCS8qIFRoZW4gbG9vayBhdCB0aGUgYWxpYXNlcyAqLworCWFwID0gbG9va3VwYWxpYXMoY29tbWFuZCwgMCk7CisJaWYgKGFwICE9IE5VTEwpIHsKKwkJaWYgKCFkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJCW91dDFzdHIoImFsaWFzICIpOworCQkJcHJpbnRhbGlhcyhhcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvdXQxZm10KCIgaXMgYW4gYWxpYXMgZm9yICVzIiwgYXAtPnZhbCk7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCS8qIFRoZW4gY2hlY2sgaWYgaXQgaXMgYSB0cmFja2VkIGFsaWFzICovCisJY21kcCA9IGNtZGxvb2t1cChjb21tYW5kLCAwKTsKKwlpZiAoY21kcCAhPSBOVUxMKSB7CisJCWVudHJ5LmNtZHR5cGUgPSBjbWRwLT5jbWR0eXBlOworCQllbnRyeS51ID0gY21kcC0+cGFyYW07CisJfSBlbHNlIHsKKwkJLyogRmluYWxseSB1c2UgYnJ1dGUgZm9yY2UgKi8KKwkJZmluZF9jb21tYW5kKGNvbW1hbmQsICZlbnRyeSwgRE9fQUJTLCBwYXRoKTsKKwl9CisKKwlzd2l0Y2ggKGVudHJ5LmNtZHR5cGUpIHsKKwljYXNlIENNRE5PUk1BTDogeworCQlpbnQgaiA9IGVudHJ5LnUuaW5kZXg7CisJCWNoYXIgKnA7CisJCWlmIChqIDwgMCkgeworCQkJcCA9IGNvbW1hbmQ7CisJCX0gZWxzZSB7CisJCQlkbyB7CisJCQkJcCA9IHBhdGhfYWR2YW5jZSgmcGF0aCwgY29tbWFuZCk7CisJCQkJc3R1bmFsbG9jKHApOworCQkJfSB3aGlsZSAoLS1qID49IDApOworCQl9CisJCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJCW91dDFmbXQoIiBpcyVzICVzIiwKKwkJCQkoY21kcCA/ICIgYSB0cmFja2VkIGFsaWFzIGZvciIgOiBudWxsc3RyKSwgcAorCQkJKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFzdHIocCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBDTURGVU5DVElPTjoKKwkJaWYgKGRlc2NyaWJlX2NvbW1hbmRfdmVyYm9zZSkgeworCQkJb3V0MXN0cigiIGlzIGEgc2hlbGwgZnVuY3Rpb24iKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFzdHIoY29tbWFuZCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNREJVSUxUSU46CisJCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJCW91dDFmbXQoIiBpcyBhICVzc2hlbGwgYnVpbHRpbiIsCisJCQkJSVNfQlVJTFRJTl9TUEVDSUFMKGVudHJ5LnUuY21kKSA/CisJCQkJCSJzcGVjaWFsICIgOiBudWxsc3RyCisJCQkpOworCQl9IGVsc2UgeworCQkJb3V0MXN0cihjb21tYW5kKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJCW91dDFzdHIoIjogbm90IGZvdW5kXG4iKTsKKwkJfQorCQlyZXR1cm4gMTI3OworCX0KKyBvdXQ6CisJb3V0MXN0cigiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3R5cGVjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSA9IDE7CisJaW50IGVyciA9IDA7CisJaW50IHZlcmJvc2UgPSAxOworCisJLyogdHlwZSAtcCAuLi4gPyAod2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGZvciAncCcpICovCisJaWYgKGFyZ3ZbMV0gJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKwkJaSsrOworCQl2ZXJib3NlID0gMDsKKwl9CisJd2hpbGUgKGFyZ3ZbaV0pIHsKKwkJZXJyIHw9IGRlc2NyaWJlX2NvbW1hbmQoYXJndltpKytdLCB2ZXJib3NlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworI2lmIEVOQUJMRV9BU0hfQ01EQ01ECitzdGF0aWMgaW50IEZBU1RfRlVOQworY29tbWFuZGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgYzsKKwllbnVtIHsKKwkJVkVSSUZZX0JSSUVGID0gMSwKKwkJVkVSSUZZX1ZFUkJPU0UgPSAyLAorCX0gdmVyaWZ5ID0gMDsKKworCXdoaWxlICgoYyA9IG5leHRvcHQoInB2ViIpKSAhPSAnXDAnKQorCQlpZiAoYyA9PSAnVicpCisJCQl2ZXJpZnkgfD0gVkVSSUZZX1ZFUkJPU0U7CisJCWVsc2UgaWYgKGMgPT0gJ3YnKQorCQkJdmVyaWZ5IHw9IFZFUklGWV9CUklFRjsKKyNpZiBERUJVRworCQllbHNlIGlmIChjICE9ICdwJykKKwkJCWFib3J0KCk7CisjZW5kaWYKKwkvKiBNaW1pYyBiYXNoOiBqdXN0ICJjb21tYW5kIC12IiBkb2Vzbid0IGNvbXBsYWluLCBpdCdzIGEgbm9wICovCisJaWYgKHZlcmlmeSAmJiAoKmFyZ3B0ciAhPSBOVUxMKSkgeworCQlyZXR1cm4gZGVzY3JpYmVfY29tbWFuZCgqYXJncHRyLCB2ZXJpZnkgLSBWRVJJRllfQlJJRUYpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09IGV2YWwuYyAqLworCitzdGF0aWMgaW50IGZ1bmNibG9ja3NpemU7ICAgICAgIC8qIHNpemUgb2Ygc3RydWN0dXJlcyBpbiBmdW5jdGlvbiAqLworc3RhdGljIGludCBmdW5jc3RyaW5nc2l6ZTsgICAgICAvKiBzaXplIG9mIHN0cmluZ3MgaW4gbm9kZSAqLworc3RhdGljIHZvaWQgKmZ1bmNibG9jazsgICAgICAgICAvKiBibG9jayB0byBhbGxvY2F0ZSBmdW5jdGlvbiBmcm9tICovCitzdGF0aWMgY2hhciAqZnVuY3N0cmluZzsgICAgICAgIC8qIGJsb2NrIHRvIGFsbG9jYXRlIHN0cmluZ3MgZnJvbSAqLworCisvKiBmbGFncyBpbiBhcmd1bWVudCB0byBldmFsdHJlZSAqLworI2RlZmluZSBFVl9FWElUICAgIDAxICAgICAgICAgICAvKiBleGl0IGFmdGVyIGV2YWx1YXRpbmcgdHJlZSAqLworI2RlZmluZSBFVl9URVNURUQgIDAyICAgICAgICAgICAvKiBleGl0IHN0YXR1cyBpcyBjaGVja2VkOyBpZ25vcmUgLWUgZmxhZyAqLworI2RlZmluZSBFVl9CQUNLQ01EIDA0ICAgICAgICAgICAvKiBjb21tYW5kIGV4ZWN1dGluZyB3aXRoaW4gYmFjayBxdW90ZXMgKi8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgbm9kZXNpemVbTl9OVU1CRVJdID0geworCVtOQ01EICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuY21kKSksCisJW05QSVBFICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5waXBlKSksCisJW05SRURJUiAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5yZWRpcikpLAorCVtOQkFDS0dORCBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBucmVkaXIpKSwKKwlbTlNVQlNIRUxMXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSksCisJW05BTkQgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5iaW5hcnkpKSwKKwlbTk9SICAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpLAorCVtOU0VNSSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSksCisJW05JRiAgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5pZikpLAorCVtOV0hJTEUgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSksCisJW05VTlRJTCAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5iaW5hcnkpKSwKKwlbTkZPUiAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZvcikpLAorCVtOQ0FTRSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuY2FzZSkpLAorCVtOQ0xJU1QgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuY2xpc3QpKSwKKwlbTkRFRlVOICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmFyZykpLAorCVtOQVJHICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYXJnKSksCisJW05UTyAgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5maWxlKSksCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCVtOVE8yICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorI2VuZGlmCisJW05DTE9CQkVSIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5maWxlKSksCisJW05GUk9NICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5maWxlKSksCisJW05GUk9NVE8gIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5maWxlKSksCisJW05BUFBFTkQgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5maWxlKSksCisJW05UT0ZEICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5kdXApKSwKKwlbTkZST01GRCAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmR1cCkpLAorCVtOSEVSRSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuaGVyZSkpLAorCVtOWEhFUkUgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuaGVyZSkpLAorCVtOTk9UICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBubm90KSksCit9OworCitzdGF0aWMgdm9pZCBjYWxjc2l6ZSh1bmlvbiBub2RlICpuKTsKKworc3RhdGljIHZvaWQKK3NpemVub2RlbGlzdChzdHJ1Y3Qgbm9kZWxpc3QgKmxwKQoreworCXdoaWxlIChscCkgeworCQlmdW5jYmxvY2tzaXplICs9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbm9kZWxpc3QpKTsKKwkJY2FsY3NpemUobHAtPm4pOworCQlscCA9IGxwLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQKK2NhbGNzaXplKHVuaW9uIG5vZGUgKm4pCit7CisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuOworCWZ1bmNibG9ja3NpemUgKz0gbm9kZXNpemVbbi0+dHlwZV07CisJc3dpdGNoIChuLT50eXBlKSB7CisJY2FzZSBOQ01EOgorCQljYWxjc2l6ZShuLT5uY21kLnJlZGlyZWN0KTsKKwkJY2FsY3NpemUobi0+bmNtZC5hcmdzKTsKKwkJY2FsY3NpemUobi0+bmNtZC5hc3NpZ24pOworCQlicmVhazsKKwljYXNlIE5QSVBFOgorCQlzaXplbm9kZWxpc3Qobi0+bnBpcGUuY21kbGlzdCk7CisJCWJyZWFrOworCWNhc2UgTlJFRElSOgorCWNhc2UgTkJBQ0tHTkQ6CisJY2FzZSBOU1VCU0hFTEw6CisJCWNhbGNzaXplKG4tPm5yZWRpci5yZWRpcmVjdCk7CisJCWNhbGNzaXplKG4tPm5yZWRpci5uKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EOgorCWNhc2UgTk9SOgorCWNhc2UgTlNFTUk6CisJY2FzZSBOV0hJTEU6CisJY2FzZSBOVU5USUw6CisJCWNhbGNzaXplKG4tPm5iaW5hcnkuY2gyKTsKKwkJY2FsY3NpemUobi0+bmJpbmFyeS5jaDEpOworCQlicmVhazsKKwljYXNlIE5JRjoKKwkJY2FsY3NpemUobi0+bmlmLmVsc2VwYXJ0KTsKKwkJY2FsY3NpemUobi0+bmlmLmlmcGFydCk7CisJCWNhbGNzaXplKG4tPm5pZi50ZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBORk9SOgorCQlmdW5jc3RyaW5nc2l6ZSArPSBzdHJsZW4obi0+bmZvci52YXIpICsgMTsKKwkJY2FsY3NpemUobi0+bmZvci5ib2R5KTsKKwkJY2FsY3NpemUobi0+bmZvci5hcmdzKTsKKwkJYnJlYWs7CisJY2FzZSBOQ0FTRToKKwkJY2FsY3NpemUobi0+bmNhc2UuY2FzZXMpOworCQljYWxjc2l6ZShuLT5uY2FzZS5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBOQ0xJU1Q6CisJCWNhbGNzaXplKG4tPm5jbGlzdC5ib2R5KTsKKwkJY2FsY3NpemUobi0+bmNsaXN0LnBhdHRlcm4pOworCQljYWxjc2l6ZShuLT5uY2xpc3QubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTkRFRlVOOgorCWNhc2UgTkFSRzoKKwkJc2l6ZW5vZGVsaXN0KG4tPm5hcmcuYmFja3F1b3RlKTsKKwkJZnVuY3N0cmluZ3NpemUgKz0gc3RybGVuKG4tPm5hcmcudGV4dCkgKyAxOworCQljYWxjc2l6ZShuLT5uYXJnLm5leHQpOworCQlicmVhazsKKwljYXNlIE5UTzoKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBOVE8yOgorI2VuZGlmCisJY2FzZSBOQ0xPQkJFUjoKKwljYXNlIE5GUk9NOgorCWNhc2UgTkZST01UTzoKKwljYXNlIE5BUFBFTkQ6CisJCWNhbGNzaXplKG4tPm5maWxlLmZuYW1lKTsKKwkJY2FsY3NpemUobi0+bmZpbGUubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTlRPRkQ6CisJY2FzZSBORlJPTUZEOgorCQljYWxjc2l6ZShuLT5uZHVwLnZuYW1lKTsKKwkJY2FsY3NpemUobi0+bmR1cC5uZXh0KTsKKwlicmVhazsKKwljYXNlIE5IRVJFOgorCWNhc2UgTlhIRVJFOgorCQljYWxjc2l6ZShuLT5uaGVyZS5kb2MpOworCQljYWxjc2l6ZShuLT5uaGVyZS5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOTk9UOgorCQljYWxjc2l6ZShuLT5ubm90LmNvbSk7CisJCWJyZWFrOworCX07Cit9CisKK3N0YXRpYyBjaGFyICoKK25vZGVja3N0cmR1cChjaGFyICpzKQoreworCWNoYXIgKnJ0biA9IGZ1bmNzdHJpbmc7CisKKwlzdHJjcHkoZnVuY3N0cmluZywgcyk7CisJZnVuY3N0cmluZyArPSBzdHJsZW4ocykgKyAxOworCXJldHVybiBydG47Cit9CisKK3N0YXRpYyB1bmlvbiBub2RlICpjb3B5bm9kZSh1bmlvbiBub2RlICopOworCitzdGF0aWMgc3RydWN0IG5vZGVsaXN0ICoKK2NvcHlub2RlbGlzdChzdHJ1Y3Qgbm9kZWxpc3QgKmxwKQoreworCXN0cnVjdCBub2RlbGlzdCAqc3RhcnQ7CisJc3RydWN0IG5vZGVsaXN0ICoqbHBwOworCisJbHBwID0gJnN0YXJ0OworCXdoaWxlIChscCkgeworCQkqbHBwID0gZnVuY2Jsb2NrOworCQlmdW5jYmxvY2sgPSAoY2hhciAqKSBmdW5jYmxvY2sgKyBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCSgqbHBwKS0+biA9IGNvcHlub2RlKGxwLT5uKTsKKwkJbHAgPSBscC0+bmV4dDsKKwkJbHBwID0gJigqbHBwKS0+bmV4dDsKKwl9CisJKmxwcCA9IE5VTEw7CisJcmV0dXJuIHN0YXJ0OworfQorCitzdGF0aWMgdW5pb24gbm9kZSAqCitjb3B5bm9kZSh1bmlvbiBub2RlICpuKQoreworCXVuaW9uIG5vZGUgKm5ldzsKKworCWlmIChuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW5ldyA9IGZ1bmNibG9jazsKKwlmdW5jYmxvY2sgPSAoY2hhciAqKSBmdW5jYmxvY2sgKyBub2Rlc2l6ZVtuLT50eXBlXTsKKworCXN3aXRjaCAobi0+dHlwZSkgeworCWNhc2UgTkNNRDoKKwkJbmV3LT5uY21kLnJlZGlyZWN0ID0gY29weW5vZGUobi0+bmNtZC5yZWRpcmVjdCk7CisJCW5ldy0+bmNtZC5hcmdzID0gY29weW5vZGUobi0+bmNtZC5hcmdzKTsKKwkJbmV3LT5uY21kLmFzc2lnbiA9IGNvcHlub2RlKG4tPm5jbWQuYXNzaWduKTsKKwkJYnJlYWs7CisJY2FzZSBOUElQRToKKwkJbmV3LT5ucGlwZS5jbWRsaXN0ID0gY29weW5vZGVsaXN0KG4tPm5waXBlLmNtZGxpc3QpOworCQluZXctPm5waXBlLnBpcGVfYmFja2duZCA9IG4tPm5waXBlLnBpcGVfYmFja2duZDsKKwkJYnJlYWs7CisJY2FzZSBOUkVESVI6CisJY2FzZSBOQkFDS0dORDoKKwljYXNlIE5TVUJTSEVMTDoKKwkJbmV3LT5ucmVkaXIucmVkaXJlY3QgPSBjb3B5bm9kZShuLT5ucmVkaXIucmVkaXJlY3QpOworCQluZXctPm5yZWRpci5uID0gY29weW5vZGUobi0+bnJlZGlyLm4pOworCQlicmVhazsKKwljYXNlIE5BTkQ6CisJY2FzZSBOT1I6CisJY2FzZSBOU0VNSToKKwljYXNlIE5XSElMRToKKwljYXNlIE5VTlRJTDoKKwkJbmV3LT5uYmluYXJ5LmNoMiA9IGNvcHlub2RlKG4tPm5iaW5hcnkuY2gyKTsKKwkJbmV3LT5uYmluYXJ5LmNoMSA9IGNvcHlub2RlKG4tPm5iaW5hcnkuY2gxKTsKKwkJYnJlYWs7CisJY2FzZSBOSUY6CisJCW5ldy0+bmlmLmVsc2VwYXJ0ID0gY29weW5vZGUobi0+bmlmLmVsc2VwYXJ0KTsKKwkJbmV3LT5uaWYuaWZwYXJ0ID0gY29weW5vZGUobi0+bmlmLmlmcGFydCk7CisJCW5ldy0+bmlmLnRlc3QgPSBjb3B5bm9kZShuLT5uaWYudGVzdCk7CisJCWJyZWFrOworCWNhc2UgTkZPUjoKKwkJbmV3LT5uZm9yLnZhciA9IG5vZGVja3N0cmR1cChuLT5uZm9yLnZhcik7CisJCW5ldy0+bmZvci5ib2R5ID0gY29weW5vZGUobi0+bmZvci5ib2R5KTsKKwkJbmV3LT5uZm9yLmFyZ3MgPSBjb3B5bm9kZShuLT5uZm9yLmFyZ3MpOworCQlicmVhazsKKwljYXNlIE5DQVNFOgorCQluZXctPm5jYXNlLmNhc2VzID0gY29weW5vZGUobi0+bmNhc2UuY2FzZXMpOworCQluZXctPm5jYXNlLmV4cHIgPSBjb3B5bm9kZShuLT5uY2FzZS5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBOQ0xJU1Q6CisJCW5ldy0+bmNsaXN0LmJvZHkgPSBjb3B5bm9kZShuLT5uY2xpc3QuYm9keSk7CisJCW5ldy0+bmNsaXN0LnBhdHRlcm4gPSBjb3B5bm9kZShuLT5uY2xpc3QucGF0dGVybik7CisJCW5ldy0+bmNsaXN0Lm5leHQgPSBjb3B5bm9kZShuLT5uY2xpc3QubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTkRFRlVOOgorCWNhc2UgTkFSRzoKKwkJbmV3LT5uYXJnLmJhY2txdW90ZSA9IGNvcHlub2RlbGlzdChuLT5uYXJnLmJhY2txdW90ZSk7CisJCW5ldy0+bmFyZy50ZXh0ID0gbm9kZWNrc3RyZHVwKG4tPm5hcmcudGV4dCk7CisJCW5ldy0+bmFyZy5uZXh0ID0gY29weW5vZGUobi0+bmFyZy5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOVE86CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCWNhc2UgTlRPMjoKKyNlbmRpZgorCWNhc2UgTkNMT0JCRVI6CisJY2FzZSBORlJPTToKKwljYXNlIE5GUk9NVE86CisJY2FzZSBOQVBQRU5EOgorCQluZXctPm5maWxlLmZuYW1lID0gY29weW5vZGUobi0+bmZpbGUuZm5hbWUpOworCQluZXctPm5maWxlLmZkID0gbi0+bmZpbGUuZmQ7CisJCW5ldy0+bmZpbGUubmV4dCA9IGNvcHlub2RlKG4tPm5maWxlLm5leHQpOworCQlicmVhazsKKwljYXNlIE5UT0ZEOgorCWNhc2UgTkZST01GRDoKKwkJbmV3LT5uZHVwLnZuYW1lID0gY29weW5vZGUobi0+bmR1cC52bmFtZSk7CisJCW5ldy0+bmR1cC5kdXBmZCA9IG4tPm5kdXAuZHVwZmQ7CisJCW5ldy0+bmR1cC5mZCA9IG4tPm5kdXAuZmQ7CisJCW5ldy0+bmR1cC5uZXh0ID0gY29weW5vZGUobi0+bmR1cC5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJbmV3LT5uaGVyZS5kb2MgPSBjb3B5bm9kZShuLT5uaGVyZS5kb2MpOworCQluZXctPm5oZXJlLmZkID0gbi0+bmhlcmUuZmQ7CisJCW5ldy0+bmhlcmUubmV4dCA9IGNvcHlub2RlKG4tPm5oZXJlLm5leHQpOworCQlicmVhazsKKwljYXNlIE5OT1Q6CisJCW5ldy0+bm5vdC5jb20gPSBjb3B5bm9kZShuLT5ubm90LmNvbSk7CisJCWJyZWFrOworCX07CisJbmV3LT50eXBlID0gbi0+dHlwZTsKKwlyZXR1cm4gbmV3OworfQorCisvKgorICogTWFrZSBhIGNvcHkgb2YgYSBwYXJzZSB0cmVlLgorICovCitzdGF0aWMgc3RydWN0IGZ1bmNub2RlICoKK2NvcHlmdW5jKHVuaW9uIG5vZGUgKm4pCit7CisJc3RydWN0IGZ1bmNub2RlICpmOworCXNpemVfdCBibG9ja3NpemU7CisKKwlmdW5jYmxvY2tzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGZ1bmNub2RlLCBuKTsKKwlmdW5jc3RyaW5nc2l6ZSA9IDA7CisJY2FsY3NpemUobik7CisJYmxvY2tzaXplID0gZnVuY2Jsb2Nrc2l6ZTsKKwlmID0gY2ttYWxsb2MoYmxvY2tzaXplICsgZnVuY3N0cmluZ3NpemUpOworCWZ1bmNibG9jayA9IChjaGFyICopIGYgKyBvZmZzZXRvZihzdHJ1Y3QgZnVuY25vZGUsIG4pOworCWZ1bmNzdHJpbmcgPSAoY2hhciAqKSBmICsgYmxvY2tzaXplOworCWNvcHlub2RlKG4pOworCWYtPmNvdW50ID0gMDsKKwlyZXR1cm4gZjsKK30KKworLyoKKyAqIERlZmluZSBhIHNoZWxsIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZAorZGVmdW4oY2hhciAqbmFtZSwgdW5pb24gbm9kZSAqZnVuYykKK3sKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisKKwlJTlRfT0ZGOworCWVudHJ5LmNtZHR5cGUgPSBDTURGVU5DVElPTjsKKwllbnRyeS51LmZ1bmMgPSBjb3B5ZnVuYyhmdW5jKTsKKwlhZGRjbWRlbnRyeShuYW1lLCAmZW50cnkpOworCUlOVF9PTjsKK30KKworLyogUmVhc29ucyBmb3Igc2tpcHBpbmcgY29tbWFuZHMgKHNlZSBjb21tZW50IG9uIGJyZWFrY21kIHJvdXRpbmUpICovCisjZGVmaW5lIFNLSVBCUkVBSyAgICAgICgxIDw8IDApCisjZGVmaW5lIFNLSVBDT05UICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFNLSVBGVU5DICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFNLSVBGSUxFICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFNLSVBFVkFMICAgICAgICgxIDw8IDQpCitzdGF0aWMgc21hbGxpbnQgZXZhbHNraXA7ICAgICAgIC8qIHNldCB0byBTS0lQeHh4IGlmIHdlIGFyZSBza2lwcGluZyBjb21tYW5kcyAqLworc3RhdGljIGludCBza2lwY291bnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgbGV2ZWxzIHRvIHNraXAgKi8KK3N0YXRpYyBpbnQgZnVuY25lc3Q7ICAgICAgICAgICAgLyogZGVwdGggb2YgZnVuY3Rpb24gY2FsbHMgKi8KK3N0YXRpYyBpbnQgbG9vcG5lc3Q7ICAgICAgICAgICAgLyogY3VycmVudCBsb29wIG5lc3RpbmcgbGV2ZWwgKi8KKworLyogRm9yd2FyZCBkZWNsIHdheSBvdXQgdG8gcGFyc2luZyBjb2RlIC0gZG90cmFwIG5lZWRzIGl0ICovCitzdGF0aWMgaW50IGV2YWxzdHJpbmcoY2hhciAqcywgaW50IG1hc2spOworCisvKiBDYWxsZWQgdG8gZXhlY3V0ZSBhIHRyYXAuCisgKiBTaW5nbGUgY2FsbHNpdGUgLSBhdCB0aGUgZW5kIG9mIGV2YWx0cmVlKCkuCisgKiBJZiB3ZSByZXR1cm4gbm9uLXplcm8sIGV2YWx0cmVlIHJhaXNlcyBFWEVYSVQgZXhjZXB0aW9uLgorICoKKyAqIFBlcmhhcHMgd2Ugc2hvdWxkIGF2b2lkIGVudGVyaW5nIG5ldyB0cmFwIGhhbmRsZXJzCisgKiB3aGlsZSB3ZSBhcmUgZXhlY3V0aW5nIGEgdHJhcCBoYW5kbGVyLiBbaXMgaXQgYSBUT0RPP10KKyAqLworc3RhdGljIGludAorZG90cmFwKHZvaWQpCit7CisJdWludDhfdCAqZzsKKwlpbnQgc2lnOworCXVpbnQ4X3Qgc2F2ZXN0YXR1czsKKworCXNhdmVzdGF0dXMgPSBleGl0c3RhdHVzOworCXBlbmRpbmdfc2lnID0gMDsKKwl4YmFycmllcigpOworCisJVFJBQ0UoKCJkb3RyYXAgZW50ZXJlZFxuIikpOworCWZvciAoc2lnID0gMSwgZyA9IGdvdHNpZzsgc2lnIDwgTlNJRzsgc2lnKyssIGcrKykgeworCQlpbnQgd2FudF9leGV4aXQ7CisJCWNoYXIgKnQ7CisKKwkJaWYgKCpnID09IDApCisJCQljb250aW51ZTsKKwkJdCA9IHRyYXBbc2lnXTsKKwkJLyogbm9uLXRyYXBwZWQgU0lHSU5UIGlzIGhhbmRsZWQgc2VwYXJhdGVseSBieSByYWlzZV9pbnRlcnJ1cHQsCisJCSAqIGRvbid0IHVwc2V0IGl0IGJ5IHJlc2V0dGluZyBnb3RzaWdbU0lHSU5ULTFdICovCisJCWlmIChzaWcgPT0gU0lHSU5UICYmICF0KQorCQkJY29udGludWU7CisKKwkJVFJBQ0UoKCJzaWcgJWQgaXMgYWN0aXZlLCB3aWxsIHJ1biBoYW5kbGVyICclcydcbiIsIHNpZywgdCkpOworCQkqZyA9IDA7CisJCWlmICghdCkKKwkJCWNvbnRpbnVlOworCQl3YW50X2V4ZXhpdCA9IGV2YWxzdHJpbmcodCwgU0tJUEVWQUwpOworCQlleGl0c3RhdHVzID0gc2F2ZXN0YXR1czsKKwkJaWYgKHdhbnRfZXhleGl0KSB7CisJCQlUUkFDRSgoImRvdHJhcCByZXR1cm5zICVkXG4iLCB3YW50X2V4ZXhpdCkpOworCQkJcmV0dXJuIHdhbnRfZXhleGl0OworCQl9CisJfQorCisJVFJBQ0UoKCJkb3RyYXAgcmV0dXJucyAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zIC0gZXZhbHVhdGlvbiBpcyBmYWlybHkgcmVjdXJzaXZlIGJ1c2luZXNzLi4uICovCitzdGF0aWMgdm9pZCBldmFsbG9vcCh1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgdm9pZCBldmFsZm9yKHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGV2YWxjYXNlKHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGV2YWxzdWJzaGVsbCh1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgdm9pZCBleHByZWRpcih1bmlvbiBub2RlICopOworc3RhdGljIHZvaWQgZXZhbHBpcGUodW5pb24gbm9kZSAqLCBpbnQpOworc3RhdGljIHZvaWQgZXZhbGNvbW1hbmQodW5pb24gbm9kZSAqLCBpbnQpOworc3RhdGljIGludCBldmFsYmx0aW4oY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKiwgaW50LCBjaGFyICoqKTsKK3N0YXRpYyB2b2lkIHByZWhhc2godW5pb24gbm9kZSAqKTsKKworLyoKKyAqIEV2YWx1YXRlIGEgcGFyc2UgdHJlZS4gIFRoZSB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAqIGV4aXRzdGF0dXMuCisgKi8KK3N0YXRpYyB2b2lkCitldmFsdHJlZSh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXIgPSBleGNlcHRpb25faGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKwlpbnQgY2hlY2tleGl0ID0gMDsKKwl2b2lkICgqZXZhbGZuKSh1bmlvbiBub2RlICosIGludCk7CisJaW50IHN0YXR1czsKKwlpbnQgaW50X2xldmVsOworCisJU0FWRV9JTlQoaW50X2xldmVsKTsKKworCWlmIChuID09IE5VTEwpIHsKKwkJVFJBQ0UoKCJldmFsdHJlZShOVUxMKSBjYWxsZWRcbiIpKTsKKwkJZ290byBvdXQxOworCX0KKwlUUkFDRSgoImV2YWx0cmVlKCVwOiAlZCwgJWQpIGNhbGxlZFxuIiwgbiwgbi0+dHlwZSwgZmxhZ3MpKTsKKworCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwl7CisJCWludCBlcnIgPSBzZXRqbXAoam1wbG9jLmxvYyk7CisJCWlmIChlcnIpIHsKKwkJCS8qIGlmIGl0IHdhcyBhIHNpZ25hbCwgY2hlY2sgZm9yIHRyYXAgaGFuZGxlcnMgKi8KKwkJCWlmIChleGNlcHRpb25fdHlwZSA9PSBFWFNJRykgeworCQkJCVRSQUNFKCgiZXhjZXB0aW9uICVkIChFWFNJRykgaW4gZXZhbHRyZWUsIGVycj0lZFxuIiwKKwkJCQkJCWV4Y2VwdGlvbl90eXBlLCBlcnIpKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIGNvbnRpbnVlIG9uIHRoZSB3YXkgb3V0ICovCisJCQlUUkFDRSgoImV4Y2VwdGlvbiAlZCBpbiBldmFsdHJlZSwgcHJvcGFnYXRpbmcgZXJyPSVkXG4iLAorCQkJCQlleGNlcHRpb25fdHlwZSwgZXJyKSk7CisJCQlleGNlcHRpb25faGFuZGxlciA9IHNhdmVoYW5kbGVyOworCQkJbG9uZ2ptcChleGNlcHRpb25faGFuZGxlci0+bG9jLCBlcnIpOworCQl9CisJfQorCisJc3dpdGNoIChuLT50eXBlKSB7CisJZGVmYXVsdDoKKyNpZiBERUJVRworCQlvdXQxZm10KCJOb2RlIHR5cGUgPSAlZFxuIiwgbi0+dHlwZSk7CisJCWZmbHVzaF9hbGwoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIE5OT1Q6CisJCWV2YWx0cmVlKG4tPm5ub3QuY29tLCBFVl9URVNURUQpOworCQlzdGF0dXMgPSAhZXhpdHN0YXR1czsKKwkJZ290byBzZXRzdGF0dXM7CisJY2FzZSBOUkVESVI6CisJCWV4cHJlZGlyKG4tPm5yZWRpci5yZWRpcmVjdCk7CisJCXN0YXR1cyA9IHJlZGlyZWN0c2FmZShuLT5ucmVkaXIucmVkaXJlY3QsIFJFRElSX1BVU0gpOworCQlpZiAoIXN0YXR1cykgeworCQkJZXZhbHRyZWUobi0+bnJlZGlyLm4sIGZsYWdzICYgRVZfVEVTVEVEKTsKKwkJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJCX0KKwkJcG9wcmVkaXIoLypkcm9wOiovIDAsIC8qcmVzdG9yZToqLyAwIC8qIG5vdCBzdXJlICovKTsKKwkJZ290byBzZXRzdGF0dXM7CisJY2FzZSBOQ01EOgorCQlldmFsZm4gPSBldmFsY29tbWFuZDsKKyBjaGVja2V4aXQ6CisJCWlmIChlZmxhZyAmJiAhKGZsYWdzICYgRVZfVEVTVEVEKSkKKwkJCWNoZWNrZXhpdCA9IH4wOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTkZPUjoKKwkJZXZhbGZuID0gZXZhbGZvcjsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5XSElMRToKKwljYXNlIE5VTlRJTDoKKwkJZXZhbGZuID0gZXZhbGxvb3A7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOU1VCU0hFTEw6CisJY2FzZSBOQkFDS0dORDoKKwkJZXZhbGZuID0gZXZhbHN1YnNoZWxsOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTlBJUEU6CisJCWV2YWxmbiA9IGV2YWxwaXBlOworCQlnb3RvIGNoZWNrZXhpdDsKKwljYXNlIE5DQVNFOgorCQlldmFsZm4gPSBldmFsY2FzZTsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5BTkQ6CisJY2FzZSBOT1I6CisJY2FzZSBOU0VNSTogeworCisjaWYgTkFORCArIDEgIT0gTk9SCisjZXJyb3IgTkFORCArIDEgIT0gTk9SCisjZW5kaWYKKyNpZiBOT1IgKyAxICE9IE5TRU1JCisjZXJyb3IgTk9SICsgMSAhPSBOU0VNSQorI2VuZGlmCisJCXVuc2lnbmVkIGlzX29yID0gbi0+dHlwZSAtIE5BTkQ7CisJCWV2YWx0cmVlKAorCQkJbi0+bmJpbmFyeS5jaDEsCisJCQkoZmxhZ3MgfCAoKGlzX29yID4+IDEpIC0gMSkpICYgRVZfVEVTVEVECisJCSk7CisJCWlmICghZXhpdHN0YXR1cyA9PSBpc19vcikKKwkJCWJyZWFrOworCQlpZiAoIWV2YWxza2lwKSB7CisJCQluID0gbi0+bmJpbmFyeS5jaDI7CisgZXZhbG46CisJCQlldmFsZm4gPSBldmFsdHJlZTsKKyBjYWxsZXZhbDoKKwkJCWV2YWxmbihuLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBOSUY6CisJCWV2YWx0cmVlKG4tPm5pZi50ZXN0LCBFVl9URVNURUQpOworCQlpZiAoZXZhbHNraXApCisJCQlicmVhazsKKwkJaWYgKGV4aXRzdGF0dXMgPT0gMCkgeworCQkJbiA9IG4tPm5pZi5pZnBhcnQ7CisJCQlnb3RvIGV2YWxuOworCQl9CisJCWlmIChuLT5uaWYuZWxzZXBhcnQpIHsKKwkJCW4gPSBuLT5uaWYuZWxzZXBhcnQ7CisJCQlnb3RvIGV2YWxuOworCQl9CisJCWdvdG8gc3VjY2VzczsKKwljYXNlIE5ERUZVTjoKKwkJZGVmdW4obi0+bmFyZy50ZXh0LCBuLT5uYXJnLm5leHQpOworIHN1Y2Nlc3M6CisJCXN0YXR1cyA9IDA7Cisgc2V0c3RhdHVzOgorCQlleGl0c3RhdHVzID0gc3RhdHVzOworCQlicmVhazsKKwl9CisKKyBvdXQ6CisJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKworIG91dDE6CisJLyogT3JkZXIgb2YgY2hlY2tzIGJlbG93IGlzIGltcG9ydGFudDoKKwkgKiBzaWduYWwgaGFuZGxlcnMgdHJpZ2dlciBiZWZvcmUgZXhpdCBjYXVzZWQgYnkgInNldCAtZSIuCisJICovCisJaWYgKHBlbmRpbmdfc2lnICYmIGRvdHJhcCgpKQorCQlnb3RvIGV4ZXhpdDsKKwlpZiAoY2hlY2tleGl0ICYgZXhpdHN0YXR1cykKKwkJZXZhbHNraXAgfD0gU0tJUEVWQUw7CisKKwlpZiAoZmxhZ3MgJiBFVl9FWElUKSB7CisgZXhleGl0OgorCQlyYWlzZV9leGNlcHRpb24oRVhFWElUKTsKKwl9CisKKwlSRVNUT1JFX0lOVChpbnRfbGV2ZWwpOworCVRSQUNFKCgibGVhdmluZyBldmFsdHJlZSAobm8gaW50ZXJydXB0cylcbiIpKTsKK30KKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgfHwgKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDMpCitzdGF0aWMKKyNlbmRpZgordm9pZCBldmFsdHJlZW5yKHVuaW9uIG5vZGUgKiwgaW50KSBfX2F0dHJpYnV0ZV9fICgoYWxpYXMoImV2YWx0cmVlIiksX19ub3JldHVybl9fKSk7CisKK3N0YXRpYyB2b2lkCitldmFsbG9vcCh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJaW50IHN0YXR1czsKKworCWxvb3BuZXN0Kys7CisJc3RhdHVzID0gMDsKKwlmbGFncyAmPSBFVl9URVNURUQ7CisJZm9yICg7OykgeworCQlpbnQgaTsKKworCQlldmFsdHJlZShuLT5uYmluYXJ5LmNoMSwgRVZfVEVTVEVEKTsKKwkJaWYgKGV2YWxza2lwKSB7Cisgc2tpcHBpbmc6CisJCQlpZiAoZXZhbHNraXAgPT0gU0tJUENPTlQgJiYgLS1za2lwY291bnQgPD0gMCkgeworCQkJCWV2YWxza2lwID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChldmFsc2tpcCA9PSBTS0lQQlJFQUsgJiYgLS1za2lwY291bnQgPD0gMCkKKwkJCQlldmFsc2tpcCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpID0gZXhpdHN0YXR1czsKKwkJaWYgKG4tPnR5cGUgIT0gTldISUxFKQorCQkJaSA9ICFpOworCQlpZiAoaSAhPSAwKQorCQkJYnJlYWs7CisJCWV2YWx0cmVlKG4tPm5iaW5hcnkuY2gyLCBmbGFncyk7CisJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJCWlmIChldmFsc2tpcCkKKwkJCWdvdG8gc2tpcHBpbmc7CisJfQorCWxvb3BuZXN0LS07CisJZXhpdHN0YXR1cyA9IHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK2V2YWxmb3IodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7CisJdW5pb24gbm9kZSAqYXJncDsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCXNldHN0YWNrbWFyaygmc21hcmspOworCWFyZ2xpc3QubGlzdCA9IE5VTEw7CisJYXJnbGlzdC5sYXN0cCA9ICZhcmdsaXN0Lmxpc3Q7CisJZm9yIChhcmdwID0gbi0+bmZvci5hcmdzOyBhcmdwOyBhcmdwID0gYXJncC0+bmFyZy5uZXh0KSB7CisJCWV4cGFuZGFyZyhhcmdwLCAmYXJnbGlzdCwgRVhQX0ZVTEwgfCBFWFBfVElMREUgfCBFWFBfUkVDT1JEKTsKKwkJLyogWFhYICovCisJCWlmIChldmFsc2tpcCkKKwkJCWdvdG8gb3V0OworCX0KKwkqYXJnbGlzdC5sYXN0cCA9IE5VTEw7CisKKwlleGl0c3RhdHVzID0gMDsKKwlsb29wbmVzdCsrOworCWZsYWdzICY9IEVWX1RFU1RFRDsKKwlmb3IgKHNwID0gYXJnbGlzdC5saXN0OyBzcDsgc3AgPSBzcC0+bmV4dCkgeworCQlzZXR2YXIobi0+bmZvci52YXIsIHNwLT50ZXh0LCAwKTsKKwkJZXZhbHRyZWUobi0+bmZvci5ib2R5LCBmbGFncyk7CisJCWlmIChldmFsc2tpcCkgeworCQkJaWYgKGV2YWxza2lwID09IFNLSVBDT05UICYmIC0tc2tpcGNvdW50IDw9IDApIHsKKwkJCQlldmFsc2tpcCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZXZhbHNraXAgPT0gU0tJUEJSRUFLICYmIC0tc2tpcGNvdW50IDw9IDApCisJCQkJZXZhbHNraXAgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJbG9vcG5lc3QtLTsKKyBvdXQ6CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7Cit9CisKK3N0YXRpYyB2b2lkCitldmFsY2FzZSh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJdW5pb24gbm9kZSAqY3A7CisJdW5pb24gbm9kZSAqcGF0cDsKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdsaXN0Lmxpc3QgPSBOVUxMOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCWV4cGFuZGFyZyhuLT5uY2FzZS5leHByLCAmYXJnbGlzdCwgRVhQX1RJTERFKTsKKwlleGl0c3RhdHVzID0gMDsKKwlmb3IgKGNwID0gbi0+bmNhc2UuY2FzZXM7IGNwICYmIGV2YWxza2lwID09IDA7IGNwID0gY3AtPm5jbGlzdC5uZXh0KSB7CisJCWZvciAocGF0cCA9IGNwLT5uY2xpc3QucGF0dGVybjsgcGF0cDsgcGF0cCA9IHBhdHAtPm5hcmcubmV4dCkgeworCQkJaWYgKGNhc2VtYXRjaChwYXRwLCBhcmdsaXN0Lmxpc3QtPnRleHQpKSB7CisJCQkJaWYgKGV2YWxza2lwID09IDApIHsKKwkJCQkJZXZhbHRyZWUoY3AtPm5jbGlzdC5ib2R5LCBmbGFncyk7CisJCQkJfQorCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorIG91dDoKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKK30KKworLyoKKyAqIEtpY2sgb2ZmIGEgc3Vic2hlbGwgdG8gZXZhbHVhdGUgYSB0cmVlLgorICovCitzdGF0aWMgdm9pZAorZXZhbHN1YnNoZWxsKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlpbnQgYmFja2duZCA9IChuLT50eXBlID09IE5CQUNLR05EKTsKKwlpbnQgc3RhdHVzOworCisJZXhwcmVkaXIobi0+bnJlZGlyLnJlZGlyZWN0KTsKKwlpZiAoIWJhY2tnbmQgJiYgKGZsYWdzICYgRVZfRVhJVCkgJiYgIW1heV9oYXZlX3RyYXBzKQorCQlnb3RvIG5vZm9yazsKKwlJTlRfT0ZGOworCWpwID0gbWFrZWpvYigvKm4sKi8gMSk7CisJaWYgKGZvcmtzaGVsbChqcCwgbiwgYmFja2duZCkgPT0gMCkgeworCQkvKiBjaGlsZCAqLworCQlJTlRfT047CisJCWZsYWdzIHw9IEVWX0VYSVQ7CisJCWlmIChiYWNrZ25kKQorCQkJZmxhZ3MgJj0gfkVWX1RFU1RFRDsKKyBub2Zvcms6CisJCXJlZGlyZWN0KG4tPm5yZWRpci5yZWRpcmVjdCwgMCk7CisJCWV2YWx0cmVlbnIobi0+bnJlZGlyLm4sIGZsYWdzKTsKKwkJLyogbmV2ZXIgcmV0dXJucyAqLworCX0KKwlzdGF0dXMgPSAwOworCWlmICghYmFja2duZCkKKwkJc3RhdHVzID0gd2FpdGZvcmpvYihqcCk7CisJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwlJTlRfT047Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgaW4gYSByZWRpcmVjdGlvbiBsaXN0LgorICovCitzdGF0aWMgdm9pZCBmaXhyZWRpcih1bmlvbiBub2RlICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkCitleHByZWRpcih1bmlvbiBub2RlICpuKQoreworCXVuaW9uIG5vZGUgKnJlZGlyOworCisJZm9yIChyZWRpciA9IG47IHJlZGlyOyByZWRpciA9IHJlZGlyLT5uZmlsZS5uZXh0KSB7CisJCXN0cnVjdCBhcmdsaXN0IGZuOworCisJCWZuLmxpc3QgPSBOVUxMOworCQlmbi5sYXN0cCA9ICZmbi5saXN0OworCQlzd2l0Y2ggKHJlZGlyLT50eXBlKSB7CisJCWNhc2UgTkZST01UTzoKKwkJY2FzZSBORlJPTToKKwkJY2FzZSBOVE86CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQljYXNlIE5UTzI6CisjZW5kaWYKKwkJY2FzZSBOQ0xPQkJFUjoKKwkJY2FzZSBOQVBQRU5EOgorCQkJZXhwYW5kYXJnKHJlZGlyLT5uZmlsZS5mbmFtZSwgJmZuLCBFWFBfVElMREUgfCBFWFBfUkVESVIpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyBzdG9yZV9leHBmbmFtZToKKyNlbmRpZgorCQkJcmVkaXItPm5maWxlLmV4cGZuYW1lID0gZm4ubGlzdC0+dGV4dDsKKwkJCWJyZWFrOworCQljYXNlIE5GUk9NRkQ6CisJCWNhc2UgTlRPRkQ6IC8qID4mICovCisJCQlpZiAocmVkaXItPm5kdXAudm5hbWUpIHsKKwkJCQlleHBhbmRhcmcocmVkaXItPm5kdXAudm5hbWUsICZmbiwgRVhQX0ZVTEwgfCBFWFBfVElMREUpOworCQkJCWlmIChmbi5saXN0ID09IE5VTEwpCisJCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJyZWRpciBlcnJvciIpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKy8vRklYTUU6IHdlIHVzZWQgZXhwYW5kYXJnIHdpdGggZGlmZmVyZW50IGFyZ3MhCisJCQkJaWYgKCFpc2RpZ2l0X3N0cjkoZm4ubGlzdC0+dGV4dCkpIHsKKwkJCQkJLyogPiZmaWxlLCBub3QgPiZmZCAqLworCQkJCQlpZiAocmVkaXItPm5maWxlLmZkICE9IDEpIC8qIDEyMz4mZmlsZSAtIEJBRCAqLworCQkJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInJlZGlyIGVycm9yIik7CisJCQkJCXJlZGlyLT50eXBlID0gTlRPMjsKKwkJCQkJZ290byBzdG9yZV9leHBmbmFtZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlmaXhyZWRpcihyZWRpciwgZm4ubGlzdC0+dGV4dCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIEV2YWx1YXRlIGEgcGlwZWxpbmUuICBBbGwgdGhlIHByb2Nlc3NlcyBpbiB0aGUgcGlwZWxpbmUgYXJlIGNoaWxkcmVuCisgKiBvZiB0aGUgcHJvY2VzcyBjcmVhdGluZyB0aGUgcGlwZWxpbmUuICAoVGhpcyBkaWZmZXJzIGZyb20gc29tZSB2ZXJzaW9ucworICogb2YgdGhlIHNoZWxsLCB3aGljaCBtYWtlIHRoZSBsYXN0IHByb2Nlc3MgaW4gYSBwaXBlbGluZSB0aGUgcGFyZW50CisgKiBvZiBhbGwgdGhlIHJlc3QuKQorICovCitzdGF0aWMgdm9pZAorZXZhbHBpcGUodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJaW50IHBpcGVsZW47CisJaW50IHByZXZmZDsKKwlpbnQgcGlwWzJdOworCisJVFJBQ0UoKCJldmFscGlwZSgweCVseCkgY2FsbGVkXG4iLCAobG9uZyluKSk7CisJcGlwZWxlbiA9IDA7CisJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3Q7IGxwOyBscCA9IGxwLT5uZXh0KQorCQlwaXBlbGVuKys7CisJZmxhZ3MgfD0gRVZfRVhJVDsKKwlJTlRfT0ZGOworCWpwID0gbWFrZWpvYigvKm4sKi8gcGlwZWxlbik7CisJcHJldmZkID0gLTE7CisJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3Q7IGxwOyBscCA9IGxwLT5uZXh0KSB7CisJCXByZWhhc2gobHAtPm4pOworCQlwaXBbMV0gPSAtMTsKKwkJaWYgKGxwLT5uZXh0KSB7CisJCQlpZiAocGlwZShwaXApIDwgMCkgeworCQkJCWNsb3NlKHByZXZmZCk7CisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInBpcGUgY2FsbCBmYWlsZWQiKTsKKwkJCX0KKwkJfQorCQlpZiAoZm9ya3NoZWxsKGpwLCBscC0+biwgbi0+bnBpcGUucGlwZV9iYWNrZ25kKSA9PSAwKSB7CisJCQlJTlRfT047CisJCQlpZiAocGlwWzFdID49IDApIHsKKwkJCQljbG9zZShwaXBbMF0pOworCQkJfQorCQkJaWYgKHByZXZmZCA+IDApIHsKKwkJCQlkdXAyKHByZXZmZCwgMCk7CisJCQkJY2xvc2UocHJldmZkKTsKKwkJCX0KKwkJCWlmIChwaXBbMV0gPiAxKSB7CisJCQkJZHVwMihwaXBbMV0sIDEpOworCQkJCWNsb3NlKHBpcFsxXSk7CisJCQl9CisJCQlldmFsdHJlZW5yKGxwLT5uLCBmbGFncyk7CisJCQkvKiBuZXZlciByZXR1cm5zICovCisJCX0KKwkJaWYgKHByZXZmZCA+PSAwKQorCQkJY2xvc2UocHJldmZkKTsKKwkJcHJldmZkID0gcGlwWzBdOworCQkvKiBEb24ndCB3YW50IHRvIHRyaWdnZXIgZGVidWdnaW5nICovCisJCWlmIChwaXBbMV0gIT0gLTEpCisJCQljbG9zZShwaXBbMV0pOworCX0KKwlpZiAobi0+bnBpcGUucGlwZV9iYWNrZ25kID09IDApIHsKKwkJZXhpdHN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCQlUUkFDRSgoImV2YWxwaXBlOiAgam9iIGRvbmUgZXhpdCBzdGF0dXMgJWRcbiIsIGV4aXRzdGF0dXMpKTsKKwl9CisJSU5UX09OOworfQorCisvKgorICogQ29udHJvbHMgd2hldGhlciB0aGUgc2hlbGwgaXMgaW50ZXJhY3RpdmUgb3Igbm90LgorICovCitzdGF0aWMgdm9pZAorc2V0aW50ZXJhY3RpdmUoaW50IG9uKQoreworCXN0YXRpYyBzbWFsbGludCBpc19pbnRlcmFjdGl2ZTsKKworCWlmICgrK29uID09IGlzX2ludGVyYWN0aXZlKQorCQlyZXR1cm47CisJaXNfaW50ZXJhY3RpdmUgPSBvbjsKKwlzZXRzaWduYWwoU0lHSU5UKTsKKwlzZXRzaWduYWwoU0lHUVVJVCk7CisJc2V0c2lnbmFsKFNJR1RFUk0pOworI2lmICFFTkFCTEVfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorCWlmIChpc19pbnRlcmFjdGl2ZSA+IDEpIHsKKwkJLyogTG9va3MgbGlrZSB0aGV5IHdhbnQgYW4gaW50ZXJhY3RpdmUgc2hlbGwgKi8KKwkJc3RhdGljIHNtYWxsaW50IGRpZF9iYW5uZXI7CisKKwkJaWYgKCFkaWRfYmFubmVyKSB7CisJCQkvKiBub3RlOiBhc2ggYW5kIGh1c2ggc2hhcmUgdGhpcyBzdHJpbmcgKi8KKwkJCW91dDFmbXQoIlxuXG4lcyAlc1xuIgorCQkJCSJFbnRlciAnaGVscCcgZm9yIGEgbGlzdCBvZiBidWlsdC1pbiBjb21tYW5kcy4iCisJCQkJIlxuXG4iLAorCQkJCWJiX2Jhbm5lciwKKwkJCQkiYnVpbHQtaW4gc2hlbGwgKGFzaCkiCisJCQkpOworCQkJZGlkX2Jhbm5lciA9IDE7CisJCX0KKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK29wdHNjaGFuZ2VkKHZvaWQpCit7CisjaWYgREVCVUcKKwlvcGVudHJhY2UoKTsKKyNlbmRpZgorCXNldGludGVyYWN0aXZlKGlmbGFnKTsKKwlzZXRqb2JjdGwobWZsYWcpOworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKKwlpZiAodmlmbGFnKQorCQlsaW5lX2lucHV0X3N0YXRlLT5mbGFncyB8PSBWSV9NT0RFOworCWVsc2UKKwkJbGluZV9pbnB1dF9zdGF0ZS0+ZmxhZ3MgJj0gflZJX01PREU7CisjZWxzZQorCXZpZmxhZyA9IDA7IC8qIGZvcmNpYmx5IGtlZXAgdGhlIG9wdGlvbiBvZmYgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGxvY2FsdmFyICpsb2NhbHZhcnM7CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYSBmdW5jdGlvbiByZXR1cm5zLgorICogSW50ZXJydXB0cyBtdXN0IGJlIG9mZi4KKyAqLworc3RhdGljIHZvaWQKK3BvcGxvY2FsdmFycyh2b2lkKQoreworCXN0cnVjdCBsb2NhbHZhciAqbHZwOworCXN0cnVjdCB2YXIgKnZwOworCisJd2hpbGUgKChsdnAgPSBsb2NhbHZhcnMpICE9IE5VTEwpIHsKKwkJbG9jYWx2YXJzID0gbHZwLT5uZXh0OworCQl2cCA9IGx2cC0+dnA7CisJCVRSQUNFKCgicG9wbG9jYWx2YXIgJXNcbiIsIHZwID8gdnAtPnZhcl90ZXh0IDogIi0iKSk7CisJCWlmICh2cCA9PSBOVUxMKSB7ICAgICAgIC8qICQtIHNhdmVkICovCisJCQltZW1jcHkob3B0bGlzdCwgbHZwLT50ZXh0LCBzaXplb2Yob3B0bGlzdCkpOworCQkJZnJlZSgoY2hhciopbHZwLT50ZXh0KTsKKwkJCW9wdHNjaGFuZ2VkKCk7CisJCX0gZWxzZSBpZiAoKGx2cC0+ZmxhZ3MgJiAoVlVOU0VUfFZTVFJGSVhFRCkpID09IFZVTlNFVCkgeworCQkJdW5zZXR2YXIodnAtPnZhcl90ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWlmICh2cC0+dmFyX2Z1bmMpCisJCQkJdnAtPnZhcl9mdW5jKHZhcl9lbmQobHZwLT50ZXh0KSk7CisJCQlpZiAoKHZwLT5mbGFncyAmIChWVEVYVEZJWEVEfFZTVEFDSykpID09IDApCisJCQkJZnJlZSgoY2hhciopdnAtPnZhcl90ZXh0KTsKKwkJCXZwLT5mbGFncyA9IGx2cC0+ZmxhZ3M7CisJCQl2cC0+dmFyX3RleHQgPSBsdnAtPnRleHQ7CisJCX0KKwkJZnJlZShsdnApOworCX0KK30KKworc3RhdGljIGludAorZXZhbGZ1bihzdHJ1Y3QgZnVuY25vZGUgKmZ1bmMsIGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IGZsYWdzKQoreworCXZvbGF0aWxlIHN0cnVjdCBzaHBhcmFtIHNhdmVwYXJhbTsKKwlzdHJ1Y3QgbG9jYWx2YXIgKnZvbGF0aWxlIHNhdmVsb2NhbHZhcnM7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJaW50IGU7CisKKwlzYXZlcGFyYW0gPSBzaGVsbHBhcmFtOworCXNhdmVsb2NhbHZhcnMgPSBsb2NhbHZhcnM7CisJZSA9IHNldGptcChqbXBsb2MubG9jKTsKKwlpZiAoZSkgeworCQlnb3RvIGZ1bmNkb25lOworCX0KKwlJTlRfT0ZGOworCXNhdmVoYW5kbGVyID0gZXhjZXB0aW9uX2hhbmRsZXI7CisJZXhjZXB0aW9uX2hhbmRsZXIgPSAmam1wbG9jOworCWxvY2FsdmFycyA9IE5VTEw7CisJc2hlbGxwYXJhbS5tYWxsb2NlZCA9IDA7CisJZnVuYy0+Y291bnQrKzsKKwlmdW5jbmVzdCsrOworCUlOVF9PTjsKKwlzaGVsbHBhcmFtLm5wYXJhbSA9IGFyZ2MgLSAxOworCXNoZWxscGFyYW0ucCA9IGFyZ3YgKyAxOworI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworI2VuZGlmCisJZXZhbHRyZWUoJmZ1bmMtPm4sIGZsYWdzICYgRVZfVEVTVEVEKTsKKyBmdW5jZG9uZToKKwlJTlRfT0ZGOworCWZ1bmNuZXN0LS07CisJZnJlZWZ1bmMoZnVuYyk7CisJcG9wbG9jYWx2YXJzKCk7CisJbG9jYWx2YXJzID0gc2F2ZWxvY2FsdmFyczsKKwlmcmVlcGFyYW0oJnNoZWxscGFyYW0pOworCXNoZWxscGFyYW0gPSBzYXZlcGFyYW07CisJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlJTlRfT047CisJZXZhbHNraXAgJj0gflNLSVBGVU5DOworCXJldHVybiBlOworfQorCisjaWYgRU5BQkxFX0FTSF9DTURDTUQKK3N0YXRpYyBjaGFyICoqCitwYXJzZV9jb21tYW5kX2FyZ3MoY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKipwYXRoKQoreworCWNoYXIgKmNwLCBjOworCisJZm9yICg7OykgeworCQljcCA9ICorK2FyZ3Y7CisJCWlmICghY3ApCisJCQlyZXR1cm4gMDsKKwkJaWYgKCpjcCsrICE9ICctJykKKwkJCWJyZWFrOworCQljID0gKmNwKys7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnLScgJiYgISpjcCkgeworCQkJYXJndisrOworCQkJYnJlYWs7CisJCX0KKwkJZG8geworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdwJzoKKwkJCQkqcGF0aCA9IGJiX2RlZmF1bHRfcGF0aDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogcnVuICd0eXBlY21kJyBmb3Igb3RoZXIgb3B0aW9ucyAqLworCQkJCXJldHVybiAwOworCQkJfQorCQkJYyA9ICpjcCsrOworCQl9IHdoaWxlIChjKTsKKwl9CisJcmV0dXJuIGFyZ3Y7Cit9CisjZW5kaWYKKworLyoKKyAqIE1ha2UgYSB2YXJpYWJsZSBhIGxvY2FsIHZhcmlhYmxlLiAgV2hlbiBhIHZhcmlhYmxlIGlzIG1hZGUgbG9jYWwsIGl0J3MKKyAqIHZhbHVlIGFuZCBmbGFncyBhcmUgc2F2ZWQgaW4gYSBsb2NhbHZhciBzdHJ1Y3R1cmUuICBUaGUgc2F2ZWQgdmFsdWVzCisgKiB3aWxsIGJlIHJlc3RvcmVkIHdoZW4gdGhlIHNoZWxsIGZ1bmN0aW9uIHJldHVybnMuICBXZSBoYW5kbGUgdGhlIG5hbWUKKyAqICItIiBhcyBhIHNwZWNpYWwgY2FzZS4KKyAqLworc3RhdGljIHZvaWQKK21rbG9jYWwoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbG9jYWx2YXIgKmx2cDsKKwlzdHJ1Y3QgdmFyICoqdnBwOworCXN0cnVjdCB2YXIgKnZwOworCisJSU5UX09GRjsKKwlsdnAgPSBja3phbGxvYyhzaXplb2Yoc3RydWN0IGxvY2FsdmFyKSk7CisJaWYgKExPTkVfREFTSChuYW1lKSkgeworCQljaGFyICpwOworCQlwID0gY2ttYWxsb2Moc2l6ZW9mKG9wdGxpc3QpKTsKKwkJbHZwLT50ZXh0ID0gbWVtY3B5KHAsIG9wdGxpc3QsIHNpemVvZihvcHRsaXN0KSk7CisJCXZwID0gTlVMTDsKKwl9IGVsc2UgeworCQljaGFyICplcTsKKworCQl2cHAgPSBoYXNodmFyKG5hbWUpOworCQl2cCA9ICpmaW5kdmFyKHZwcCwgbmFtZSk7CisJCWVxID0gc3RyY2hyKG5hbWUsICc9Jyk7CisJCWlmICh2cCA9PSBOVUxMKSB7CisJCQlpZiAoZXEpCisJCQkJc2V0dmFyZXEobmFtZSwgVlNUUkZJWEVEKTsKKwkJCWVsc2UKKwkJCQlzZXR2YXIobmFtZSwgTlVMTCwgVlNUUkZJWEVEKTsKKwkJCXZwID0gKnZwcDsgICAgICAvKiB0aGUgbmV3IHZhcmlhYmxlICovCisJCQlsdnAtPmZsYWdzID0gVlVOU0VUOworCQl9IGVsc2UgeworCQkJbHZwLT50ZXh0ID0gdnAtPnZhcl90ZXh0OworCQkJbHZwLT5mbGFncyA9IHZwLT5mbGFnczsKKwkJCXZwLT5mbGFncyB8PSBWU1RSRklYRUR8VlRFWFRGSVhFRDsKKwkJCWlmIChlcSkKKwkJCQlzZXR2YXJlcShuYW1lLCAwKTsKKwkJfQorCX0KKwlsdnAtPnZwID0gdnA7CisJbHZwLT5uZXh0ID0gbG9jYWx2YXJzOworCWxvY2FsdmFycyA9IGx2cDsKKwlJTlRfT047Cit9CisKKy8qCisgKiBUaGUgImxvY2FsIiBjb21tYW5kLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQworbG9jYWxjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpuYW1lOworCisJYXJndiA9IGFyZ3B0cjsKKwl3aGlsZSAoKG5hbWUgPSAqYXJndisrKSAhPSBOVUxMKSB7CisJCW1rbG9jYWwobmFtZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworZmFsc2VjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit0cnVlY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworZXhlY2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWlmIChhcmd2WzFdKSB7CisJCWlmbGFnID0gMDsgICAgICAgICAgICAgIC8qIGV4aXQgb24gZXJyb3IgKi8KKwkJbWZsYWcgPSAwOworCQlvcHRzY2hhbmdlZCgpOworCQlzaGVsbGV4ZWMoYXJndiArIDEsIHBhdGh2YWwoKSwgMCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhlIHJldHVybiBjb21tYW5kLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQworcmV0dXJuY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJLyoKKwkgKiBJZiBjYWxsZWQgb3V0c2lkZSBhIGZ1bmN0aW9uLCBkbyB3aGF0IGtzaCBkb2VzOworCSAqIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGZpbGUuCisJICovCisJZXZhbHNraXAgPSBmdW5jbmVzdCA/IFNLSVBGVU5DIDogU0tJUEZJTEU7CisJcmV0dXJuIGFyZ3ZbMV0gPyBudW1iZXIoYXJndlsxXSkgOiBleGl0c3RhdHVzOworfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgYnVpbHRpbnRhYltdICovCitzdGF0aWMgaW50IGJyZWFrY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCBkb3RjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGV2YWxjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGV4aXRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGV4cG9ydGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKK3N0YXRpYyBpbnQgZ2V0b3B0c2NtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKKyNlbmRpZgorI2lmICFFTkFCTEVfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorc3RhdGljIGludCBoZWxwY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorc3RhdGljIGludCBsZXRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CisjZW5kaWYKK3N0YXRpYyBpbnQgcmVhZGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgc2V0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCBzaGlmdGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgdGltZXNjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHRyYXBjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHVtYXNrY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCB1bnNldGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgdWxpbWl0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworCisjZGVmaW5lIEJVSUxUSU5fTk9TUEVDICAgICAgICAgICIwIgorI2RlZmluZSBCVUlMVElOX1NQRUNJQUwgICAgICAgICAiMSIKKyNkZWZpbmUgQlVJTFRJTl9SRUdVTEFSICAgICAgICAgIjIiCisjZGVmaW5lIEJVSUxUSU5fU1BFQ19SRUcgICAgICAgICIzIgorI2RlZmluZSBCVUlMVElOX0FTU0lHTiAgICAgICAgICAiNCIKKyNkZWZpbmUgQlVJTFRJTl9TUEVDX0FTU0cgICAgICAgIjUiCisjZGVmaW5lIEJVSUxUSU5fUkVHX0FTU0cgICAgICAgICI2IgorI2RlZmluZSBCVUlMVElOX1NQRUNfUkVHX0FTU0cgICAiNyIKKworLyogU3R1YnMgZm9yIGNhbGxpbmcgbm9uLUZBU1RfRlVOQydzICovCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX0VDSE8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGVjaG9jbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSAgIHsgcmV0dXJuIGVjaG9fbWFpbihhcmdjLCBhcmd2KTsgfQorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX1BSSU5URgorc3RhdGljIGludCBGQVNUX0ZVTkMgcHJpbnRmY21kKGludCBhcmdjLCBjaGFyICoqYXJndikgeyByZXR1cm4gcHJpbnRmX21haW4oYXJnYywgYXJndik7IH0KKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUCitzdGF0aWMgaW50IEZBU1RfRlVOQyB0ZXN0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikgICB7IHJldHVybiB0ZXN0X21haW4oYXJnYywgYXJndik7IH0KKyNlbmRpZgorCisvKiBLZWVwIHRoZXNlIGluIHByb3BlciBvcmRlciBzaW5jZSBpdCBpcyBzZWFyY2hlZCB2aWEgYnNlYXJjaCgpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgYnVpbHRpbnRhYltdID0geworCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICIuIiAgICAgICAsIGRvdGNtZCAgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiOiIgICAgICAgLCB0cnVlY21kICAgIH0sCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiWyIgICAgICAgLCB0ZXN0Y21kICAgIH0sCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJbWyIgICAgICAsIHRlc3RjbWQgICAgfSwKKyNlbmRpZgorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9BTElBUworCXsgQlVJTFRJTl9SRUdfQVNTRyAgICAgICJhbGlhcyIgICAsIGFsaWFzY21kICAgfSwKKyNlbmRpZgorI2lmIEpPQlMKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiYmciICAgICAgLCBmZ19iZ2NtZCAgIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiYnJlYWsiICAgLCBicmVha2NtZCAgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgImNkIiAgICAgICwgY2RjbWQgICAgICB9LAorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJjaGRpciIgICAsIGNkY21kICAgICAgfSwKKyNpZiBFTkFCTEVfQVNIX0NNRENNRAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJjb21tYW5kIiAsIGNvbW1hbmRjbWQgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJjb250aW51ZSIsIGJyZWFrY21kICAgfSwKKyNpZiBFTkFCTEVfQVNIX0JVSUxUSU5fRUNITworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJlY2hvIiAgICAsIGVjaG9jbWQgICAgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJldmFsIiAgICAsIGV2YWxjbWQgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiZXhlYyIgICAgLCBleGVjY21kICAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgImV4aXQiICAgICwgZXhpdGNtZCAgICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFR19BU1NHICJleHBvcnQiICAsIGV4cG9ydGNtZCAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiZmFsc2UiICAgLCBmYWxzZWNtZCAgIH0sCisjaWYgSk9CUworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJmZyIgICAgICAsIGZnX2JnY21kICAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJnZXRvcHRzIiAsIGdldG9wdHNjbWQgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJoYXNoIiAgICAsIGhhc2hjbWQgICAgfSwKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAiaGVscCIgICAgLCBoZWxwY21kICAgIH0sCisjZW5kaWYKKyNpZiBKT0JTCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgImpvYnMiICAgICwgam9ic2NtZCAgICB9LAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJraWxsIiAgICAsIGtpbGxjbWQgICAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAibGV0IiAgICAgLCBsZXRjbWQgICAgIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fQVNTSUdOICAgICAgICAibG9jYWwiICAgLCBsb2NhbGNtZCAgIH0sCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX1BSSU5URgorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJwcmludGYiICAsIHByaW50ZmNtZCAgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJwd2QiICAgICAsIHB3ZGNtZCAgICAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAicmVhZCIgICAgLCByZWFkY21kICAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHX0FTU0cgInJlYWRvbmx5IiwgZXhwb3J0Y21kICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJyZXR1cm4iICAsIHJldHVybmNtZCAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAic2V0IiAgICAgLCBzZXRjbWQgICAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInNoaWZ0IiAgICwgc2hpZnRjbWQgICB9LAorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAic291cmNlIiAgLCBkb3RjbWQgICAgIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfQVNIX0JVSUxUSU5fVEVTVAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJ0ZXN0IiAgICAsIHRlc3RjbWQgICAgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJ0aW1lcyIgICAsIHRpbWVzY21kICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAidHJhcCIgICAgLCB0cmFwY21kICAgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgInRydWUiICAgICwgdHJ1ZWNtZCAgICB9LAorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJ0eXBlIiAgICAsIHR5cGVjbWQgICAgfSwKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAidWxpbWl0IiAgLCB1bGltaXRjbWQgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgInVtYXNrIiAgICwgdW1hc2tjbWQgICB9LAorI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAidW5hbGlhcyIgLCB1bmFsaWFzY21kIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAidW5zZXQiICAgLCB1bnNldGNtZCAgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgIndhaXQiICAgICwgd2FpdGNtZCAgICB9LAorfTsKKworLyogU2hvdWxkIG1hdGNoIHRoZSBhYm92ZSB0YWJsZSEgKi8KKyNkZWZpbmUgQ09NTUFORENNRCAoYnVpbHRpbnRhYiArIFwKKwkyICsgXAorCTEgKiBFTkFCTEVfQVNIX0JVSUxUSU5fVEVTVCArIFwKKwkxICogRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QgKiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUICsgXAorCTEgKiBFTkFCTEVfQVNIX0FMSUFTICsgXAorCTEgKiBFTkFCTEVfQVNIX0pPQl9DT05UUk9MICsgXAorCTMpCisjZGVmaW5lIEVYRUNDTUQgKGJ1aWx0aW50YWIgKyBcCisJMiArIFwKKwkxICogRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QgKyBcCisJMSAqIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUICogRU5BQkxFX0FTSF9CQVNIX0NPTVBBVCArIFwKKwkxICogRU5BQkxFX0FTSF9BTElBUyArIFwKKwkxICogRU5BQkxFX0FTSF9KT0JfQ09OVFJPTCArIFwKKwkzICsgXAorCTEgKiBFTkFCTEVfQVNIX0NNRENNRCArIFwKKwkxICsgXAorCUVOQUJMRV9BU0hfQlVJTFRJTl9FQ0hPICsgXAorCTEpCisKKy8qCisgKiBTZWFyY2ggdGhlIHRhYmxlIG9mIGJ1aWx0aW4gY29tbWFuZHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbmNtZCAqCitmaW5kX2J1aWx0aW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYnVpbHRpbmNtZCAqYnA7CisKKwlicCA9IGJzZWFyY2goCisJCW5hbWUsIGJ1aWx0aW50YWIsIEFSUkFZX1NJWkUoYnVpbHRpbnRhYiksIHNpemVvZihidWlsdGludGFiWzBdKSwKKwkJcHN0cmNtcAorCSk7CisJcmV0dXJuIGJwOworfQorCisvKgorICogRXhlY3V0ZSBhIHNpbXBsZSBjb21tYW5kLgorICovCitzdGF0aWMgaW50Citpc2Fzc2lnbm1lbnQoY29uc3QgY2hhciAqcCkKK3sKKwljb25zdCBjaGFyICpxID0gZW5kb2ZuYW1lKHApOworCWlmIChwID09IHEpCisJCXJldHVybiAwOworCXJldHVybiAqcSA9PSAnPSc7Cit9CitzdGF0aWMgaW50IEZBU1RfRlVOQworYmx0aW5jbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJLyogUHJlc2VydmUgZXhpdHN0YXR1cyBvZiBhIHByZXZpb3VzIHBvc3NpYmxlIHJlZGlyZWN0aW9uCisJICogYXMgUE9TSVggbWFuZGF0ZXMgKi8KKwlyZXR1cm4gYmFja19leGl0c3RhdHVzOworfQorc3RhdGljIHZvaWQKK2V2YWxjb21tYW5kKHVuaW9uIG5vZGUgKmNtZCwgaW50IGZsYWdzKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCBudWxsX2JsdGluID0geworCQkiXDBcMCIsIGJsdGluY21kIC8qIHdoeSB0aHJlZSBOVUxzPyAqLworCX07CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwl1bmlvbiBub2RlICphcmdwOworCXN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7CisJc3RydWN0IGFyZ2xpc3QgdmFybGlzdDsKKwljaGFyICoqYXJndjsKKwlpbnQgYXJnYzsKKwljb25zdCBzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJc3RydWN0IGNtZGVudHJ5IGNtZGVudHJ5OworCXN0cnVjdCBqb2IgKmpwOworCWNoYXIgKmxhc3Rhcmc7CisJY29uc3QgY2hhciAqcGF0aDsKKwlpbnQgc3BjbGJsdGluOworCWludCBzdGF0dXM7CisJY2hhciAqKm5hcmd2OworCXN0cnVjdCBidWlsdGluY21kICpiY21kOworCXNtYWxsaW50IGNtZF9pc19leGVjOworCXNtYWxsaW50IHBzZXVkb3ZhcmZsYWcgPSAwOworCisJLyogRmlyc3QgZXhwYW5kIHRoZSBhcmd1bWVudHMuICovCisJVFJBQ0UoKCJldmFsY29tbWFuZCgweCVseCwgJWQpIGNhbGxlZFxuIiwgKGxvbmcpY21kLCBmbGFncykpOworCXNldHN0YWNrbWFyaygmc21hcmspOworCWJhY2tfZXhpdHN0YXR1cyA9IDA7CisKKwljbWRlbnRyeS5jbWR0eXBlID0gQ01EQlVJTFRJTjsKKwljbWRlbnRyeS51LmNtZCA9ICZudWxsX2JsdGluOworCXZhcmxpc3QubGFzdHAgPSAmdmFybGlzdC5saXN0OworCSp2YXJsaXN0Lmxhc3RwID0gTlVMTDsKKwlhcmdsaXN0Lmxhc3RwID0gJmFyZ2xpc3QubGlzdDsKKwkqYXJnbGlzdC5sYXN0cCA9IE5VTEw7CisKKwlhcmdjID0gMDsKKwlpZiAoY21kLT5uY21kLmFyZ3MpIHsKKwkJYmNtZCA9IGZpbmRfYnVpbHRpbihjbWQtPm5jbWQuYXJncy0+bmFyZy50ZXh0KTsKKwkJcHNldWRvdmFyZmxhZyA9IGJjbWQgJiYgSVNfQlVJTFRJTl9BU1NJR04oYmNtZCk7CisJfQorCisJZm9yIChhcmdwID0gY21kLT5uY21kLmFyZ3M7IGFyZ3A7IGFyZ3AgPSBhcmdwLT5uYXJnLm5leHQpIHsKKwkJc3RydWN0IHN0cmxpc3QgKipzcHA7CisKKwkJc3BwID0gYXJnbGlzdC5sYXN0cDsKKwkJaWYgKHBzZXVkb3ZhcmZsYWcgJiYgaXNhc3NpZ25tZW50KGFyZ3AtPm5hcmcudGV4dCkpCisJCQlleHBhbmRhcmcoYXJncCwgJmFyZ2xpc3QsIEVYUF9WQVJUSUxERSk7CisJCWVsc2UKKwkJCWV4cGFuZGFyZyhhcmdwLCAmYXJnbGlzdCwgRVhQX0ZVTEwgfCBFWFBfVElMREUpOworCisJCWZvciAoc3AgPSAqc3BwOyBzcDsgc3AgPSBzcC0+bmV4dCkKKwkJCWFyZ2MrKzsKKwl9CisKKwlhcmd2ID0gbmFyZ3YgPSBzdGFsbG9jKHNpemVvZihjaGFyICopICogKGFyZ2MgKyAxKSk7CisJZm9yIChzcCA9IGFyZ2xpc3QubGlzdDsgc3A7IHNwID0gc3AtPm5leHQpIHsKKwkJVFJBQ0UoKCJldmFsY29tbWFuZCBhcmc6ICVzXG4iLCBzcC0+dGV4dCkpOworCQkqbmFyZ3YrKyA9IHNwLT50ZXh0OworCX0KKwkqbmFyZ3YgPSBOVUxMOworCisJbGFzdGFyZyA9IE5VTEw7CisJaWYgKGlmbGFnICYmIGZ1bmNuZXN0ID09IDAgJiYgYXJnYyA+IDApCisJCWxhc3RhcmcgPSBuYXJndlstMV07CisKKwlwcmV2ZXJyb3V0X2ZkID0gMjsKKwlleHByZWRpcihjbWQtPm5jbWQucmVkaXJlY3QpOworCXN0YXR1cyA9IHJlZGlyZWN0c2FmZShjbWQtPm5jbWQucmVkaXJlY3QsIFJFRElSX1BVU0ggfCBSRURJUl9TQVZFRkQyKTsKKworCXBhdGggPSB2cGF0aC52YXJfdGV4dDsKKwlmb3IgKGFyZ3AgPSBjbWQtPm5jbWQuYXNzaWduOyBhcmdwOyBhcmdwID0gYXJncC0+bmFyZy5uZXh0KSB7CisJCXN0cnVjdCBzdHJsaXN0ICoqc3BwOworCQljaGFyICpwOworCisJCXNwcCA9IHZhcmxpc3QubGFzdHA7CisJCWV4cGFuZGFyZyhhcmdwLCAmdmFybGlzdCwgRVhQX1ZBUlRJTERFKTsKKworCQkvKgorCQkgKiBNb2RpZnkgdGhlIGNvbW1hbmQgbG9va3VwIHBhdGgsIGlmIGEgUEFUSD0gYXNzaWdubWVudAorCQkgKiBpcyBwcmVzZW50CisJCSAqLworCQlwID0gKCpzcHApLT50ZXh0OworCQlpZiAodmFyY21wKHAsIHBhdGgpID09IDApCisJCQlwYXRoID0gcDsKKwl9CisKKwkvKiBQcmludCB0aGUgY29tbWFuZCBpZiB4ZmxhZyBpcyBzZXQuICovCisJaWYgKHhmbGFnKSB7CisJCWludCBuOworCQljb25zdCBjaGFyICpwID0gIiAlcyIgKyAxOworCisJCWZkcHJpbnRmKHByZXZlcnJvdXRfZmQsIHAsIGV4cGFuZHN0cihwczR2YWwoKSkpOworCQlzcCA9IHZhcmxpc3QubGlzdDsKKwkJZm9yIChuID0gMDsgbiA8IDI7IG4rKykgeworCQkJd2hpbGUgKHNwKSB7CisJCQkJZmRwcmludGYocHJldmVycm91dF9mZCwgcCwgc3AtPnRleHQpOworCQkJCXNwID0gc3AtPm5leHQ7CisJCQkJcCA9ICIgJXMiOworCQkJfQorCQkJc3AgPSBhcmdsaXN0Lmxpc3Q7CisJCX0KKwkJc2FmZV93cml0ZShwcmV2ZXJyb3V0X2ZkLCAiXG4iLCAxKTsKKwl9CisKKwljbWRfaXNfZXhlYyA9IDA7CisJc3BjbGJsdGluID0gLTE7CisKKwkvKiBOb3cgbG9jYXRlIHRoZSBjb21tYW5kLiAqLworCWlmIChhcmdjKSB7CisJCWNvbnN0IGNoYXIgKm9sZHBhdGg7CisJCWludCBjbWRfZmxhZyA9IERPX0VSUjsKKworCQlwYXRoICs9IDU7CisJCW9sZHBhdGggPSBwYXRoOworCQlmb3IgKDs7KSB7CisJCQlmaW5kX2NvbW1hbmQoYXJndlswXSwgJmNtZGVudHJ5LCBjbWRfZmxhZywgcGF0aCk7CisJCQlpZiAoY21kZW50cnkuY21kdHlwZSA9PSBDTURVTktOT1dOKSB7CisJCQkJZmx1c2hfc3Rkb3V0X3N0ZGVycigpOworCQkJCXN0YXR1cyA9IDEyNzsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisKKwkJCS8qIGltcGxlbWVudCBibHRpbiBhbmQgY29tbWFuZCBoZXJlICovCisJCQlpZiAoY21kZW50cnkuY21kdHlwZSAhPSBDTURCVUlMVElOKQorCQkJCWJyZWFrOworCQkJaWYgKHNwY2xibHRpbiA8IDApCisJCQkJc3BjbGJsdGluID0gSVNfQlVJTFRJTl9TUEVDSUFMKGNtZGVudHJ5LnUuY21kKTsKKwkJCWlmIChjbWRlbnRyeS51LmNtZCA9PSBFWEVDQ01EKQorCQkJCWNtZF9pc19leGVjID0gMTsKKyNpZiBFTkFCTEVfQVNIX0NNRENNRAorCQkJaWYgKGNtZGVudHJ5LnUuY21kID09IENPTU1BTkRDTUQpIHsKKwkJCQlwYXRoID0gb2xkcGF0aDsKKwkJCQluYXJndiA9IHBhcnNlX2NvbW1hbmRfYXJncyhhcmd2LCAmcGF0aCk7CisJCQkJaWYgKCFuYXJndikKKwkJCQkJYnJlYWs7CisJCQkJYXJnYyAtPSBuYXJndiAtIGFyZ3Y7CisJCQkJYXJndiA9IG5hcmd2OworCQkJCWNtZF9mbGFnIHw9IERPX05PRlVOQzsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCS8qIFdlIGhhdmUgYSByZWRpcmVjdGlvbiBlcnJvci4gKi8KKwkJaWYgKHNwY2xibHRpbiA+IDApCisJCQlyYWlzZV9leGNlcHRpb24oRVhFUlJPUik7CisgYmFpbDoKKwkJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRXhlY3V0ZSB0aGUgY29tbWFuZC4gKi8KKwlzd2l0Y2ggKGNtZGVudHJ5LmNtZHR5cGUpIHsKKwlkZWZhdWx0OiB7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9OT0ZPUksKKy8qICgxKSBCVUc6IGlmIHZhcmlhYmxlcyBhcmUgc2V0LCB3ZSBuZWVkIHRvIGZvcmssIG9yIHNhdmUvcmVzdG9yZSB0aGVtCisgKiAgICAgYXJvdW5kIHJ1bl9ub2ZvcmtfYXBwbGV0KCkgY2FsbC4KKyAqICgyKSBTaG91bGQgdGhpcyBjaGVjayBhbHNvIGJlIGRvbmUgaW4gZm9ya3NoZWxsKCk/CisgKiAgICAgKHBlcmhhcHMgaXQgc2hvdWxkLCBzbyB0aGF0ICJWQVI9VkFMIG5vZm9yayIgYXQgbGVhc3QgYXZvaWRzIGV4ZWMuLi4pCisgKi8KKwkJLyogZmluZF9jb21tYW5kKCkgZW5jb2RlcyBhcHBsZXRfbm8gYXMgKC0yIC0gYXBwbGV0X25vKSAqLworCQlpbnQgYXBwbGV0X25vID0gKC0gY21kZW50cnkudS5pbmRleCAtIDIpOworCQlpZiAoYXBwbGV0X25vID49IDAgJiYgQVBQTEVUX0lTX05PRk9SSyhhcHBsZXRfbm8pKSB7CisJCQlsaXN0c2V0dmFyKHZhcmxpc3QubGlzdCwgVkVYUE9SVHxWU1RBQ0spOworCQkJLyogcnVuIDxhcHBsZXQ+X21haW4oKSAqLworCQkJZXhpdHN0YXR1cyA9IHJ1bl9ub2ZvcmtfYXBwbGV0KGFwcGxldF9ubywgYXJndik7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCS8qIENhbiB3ZSBhdm9pZCBmb3JraW5nIG9mZj8gRm9yIGV4YW1wbGUsIHZlcnkgbGFzdCBjb21tYW5kCisJCSAqIGluIGEgc2NyaXB0IG9yIGEgc3Vic2hlbGwgZG9lcyBub3QgbmVlZCBmb3JraW5nLAorCQkgKiB3ZSBjYW4ganVzdCBleGVjIGl0LgorCQkgKi8KKwkJaWYgKCEoZmxhZ3MgJiBFVl9FWElUKSB8fCBtYXlfaGF2ZV90cmFwcykgeworCQkJLyogTm8sIGZvcmtpbmcgb2ZmIGEgY2hpbGQgaXMgbmVjZXNzYXJ5ICovCisJCQlJTlRfT0ZGOworCQkJanAgPSBtYWtlam9iKC8qY21kLCovIDEpOworCQkJaWYgKGZvcmtzaGVsbChqcCwgY21kLCBGT1JLX0ZHKSAhPSAwKSB7CisJCQkJLyogcGFyZW50ICovCisJCQkJZXhpdHN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCQkJCUlOVF9PTjsKKwkJCQlUUkFDRSgoImZvcmtlZCBjaGlsZCBleGl0ZWQgd2l0aCAlZFxuIiwgZXhpdHN0YXR1cykpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogY2hpbGQgKi8KKwkJCUZPUkNFX0lOVF9PTjsKKwkJCS8qIGZhbGwgdGhyb3VnaCB0byBleGVjJ2luZyBleHRlcm5hbCBwcm9ncmFtICovCisJCX0KKwkJbGlzdHNldHZhcih2YXJsaXN0Lmxpc3QsIFZFWFBPUlR8VlNUQUNLKTsKKwkJc2hlbGxleGVjKGFyZ3YsIHBhdGgsIGNtZGVudHJ5LnUuaW5kZXgpOworCQkvKiBOT1RSRUFDSEVEICovCisJfSAvKiBkZWZhdWx0ICovCisJY2FzZSBDTURCVUlMVElOOgorCQljbWRlbnZpcm9uID0gdmFybGlzdC5saXN0OworCQlpZiAoY21kZW52aXJvbikgeworCQkJc3RydWN0IHN0cmxpc3QgKmxpc3QgPSBjbWRlbnZpcm9uOworCQkJaW50IGkgPSBWTk9TRVQ7CisJCQlpZiAoc3BjbGJsdGluID4gMCB8fCBhcmdjID09IDApIHsKKwkJCQlpID0gMDsKKwkJCQlpZiAoY21kX2lzX2V4ZWMgJiYgYXJnYyA+IDEpCisJCQkJCWkgPSBWRVhQT1JUOworCQkJfQorCQkJbGlzdHNldHZhcihsaXN0LCBpKTsKKwkJfQorCQkvKiBUaWdodCBsb29wIHdpdGggYnVpbHRpbnMgb25seToKKwkJICogIndoaWxlIGtpbGwgLTAgJGNoaWxkOyBkbyB0cnVlOyBkb25lIgorCQkgKiB3aWxsIG5ldmVyIGV4aXQgZXZlbiBpZiAkY2hpbGQgZGllZCwgdW5sZXNzIHdlIGRvIHRoaXMKKwkJICogdG8gcmVhcCB0aGUgem9tYmllIGFuZCBtYWtlIGtpbGwgZGV0ZWN0IHRoYXQgaXQncyBnb25lOiAqLworCQlkb3dhaXQoRE9XQUlUX05PTkJMT0NLLCBOVUxMKTsKKworCQlpZiAoZXZhbGJsdGluKGNtZGVudHJ5LnUuY21kLCBhcmdjLCBhcmd2KSkgeworCQkJaW50IGV4aXRfc3RhdHVzOworCQkJaW50IGkgPSBleGNlcHRpb25fdHlwZTsKKwkJCWlmIChpID09IEVYRVhJVCkKKwkJCQlnb3RvIHJhaXNlOworCQkJZXhpdF9zdGF0dXMgPSAyOworCQkJaWYgKGkgPT0gRVhJTlQpCisJCQkJZXhpdF9zdGF0dXMgPSAxMjggKyBTSUdJTlQ7CisJCQlpZiAoaSA9PSBFWFNJRykKKwkJCQlleGl0X3N0YXR1cyA9IDEyOCArIHBlbmRpbmdfc2lnOworCQkJZXhpdHN0YXR1cyA9IGV4aXRfc3RhdHVzOworCQkJaWYgKGkgPT0gRVhJTlQgfHwgc3BjbGJsdGluID4gMCkgeworIHJhaXNlOgorCQkJCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgMSk7CisJCQl9CisJCQlGT1JDRV9JTlRfT047CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNREZVTkNUSU9OOgorCQlsaXN0c2V0dmFyKHZhcmxpc3QubGlzdCwgMCk7CisJCS8qIFNlZSBhYm92ZSBmb3IgdGhlIHJhdGlvbmFsZSAqLworCQlkb3dhaXQoRE9XQUlUX05PTkJMT0NLLCBOVUxMKTsKKwkJaWYgKGV2YWxmdW4oY21kZW50cnkudS5mdW5jLCBhcmdjLCBhcmd2LCBmbGFncykpCisJCQlnb3RvIHJhaXNlOworCQlicmVhazsKKworCX0gLyogc3dpdGNoICovCisKKyBvdXQ6CisJcG9wcmVkaXIoLypkcm9wOiovIGNtZF9pc19leGVjLCAvKnJlc3RvcmU6Ki8gY21kX2lzX2V4ZWMpOworCWlmIChsYXN0YXJnKSB7CisJCS8qIGRzbDogSSB0aGluayB0aGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gc3VwcG9ydAorCQkgKiAnXycgaW4gJ3ZpJyBjb21tYW5kIG1vZGUgZHVyaW5nIGxpbmUgZWRpdGluZy4uLgorCQkgKiBIb3dldmVyIEkgaW1wbGVtZW50ZWQgdGhhdCB3aXRoaW4gbGliZWRpdCBpdHNlbGYuCisJCSAqLworCQlzZXR2YXIoIl8iLCBsYXN0YXJnLCAwKTsKKwl9CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7Cit9CisKK3N0YXRpYyBpbnQKK2V2YWxibHRpbihjb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCAqY21kLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqdm9sYXRpbGUgc2F2ZWNtZG5hbWU7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJaW50IGk7CisKKwlzYXZlY21kbmFtZSA9IGNvbW1hbmRuYW1lOworCWkgPSBzZXRqbXAoam1wbG9jLmxvYyk7CisJaWYgKGkpCisJCWdvdG8gY21kZG9uZTsKKwlzYXZlaGFuZGxlciA9IGV4Y2VwdGlvbl9oYW5kbGVyOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwljb21tYW5kbmFtZSA9IGFyZ3ZbMF07CisJYXJncHRyID0gYXJndiArIDE7CisJb3B0cHRyID0gTlVMTDsgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIG5leHRvcHQgKi8KKwlleGl0c3RhdHVzID0gKCpjbWQtPmJ1aWx0aW4pKGFyZ2MsIGFyZ3YpOworCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKKyBjbWRkb25lOgorCWV4aXRzdGF0dXMgfD0gZmVycm9yKHN0ZG91dCk7CisJY2xlYXJlcnIoc3Rkb3V0KTsKKwljb21tYW5kbmFtZSA9IHNhdmVjbWRuYW1lOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludAorZ29vZG5hbWUoY29uc3QgY2hhciAqcCkKK3sKKwlyZXR1cm4gZW5kb2ZuYW1lKHApWzBdID09ICdcMCc7Cit9CisKKworLyoKKyAqIFNlYXJjaCBmb3IgYSBjb21tYW5kLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHdlIGZvcmsgc28gdGhhdCB0aGUKKyAqIGxvY2F0aW9uIG9mIHRoZSBjb21tYW5kIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBwYXJlbnQgYXMgd2VsbCBhcworICogdGhlIGNoaWxkLiAgVGhlIGNoZWNrIGZvciAiZ29vZG5hbWUiIGlzIGFuIG92ZXJseSBjb25zZXJ2YXRpdmUKKyAqIGNoZWNrIHRoYXQgdGhlIG5hbWUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBleHBhbnNpb24uCisgKi8KK3N0YXRpYyB2b2lkCitwcmVoYXNoKHVuaW9uIG5vZGUgKm4pCit7CisJc3RydWN0IGNtZGVudHJ5IGVudHJ5OworCisJaWYgKG4tPnR5cGUgPT0gTkNNRCAmJiBuLT5uY21kLmFyZ3MgJiYgZ29vZG5hbWUobi0+bmNtZC5hcmdzLT5uYXJnLnRleHQpKQorCQlmaW5kX2NvbW1hbmQobi0+bmNtZC5hcmdzLT5uYXJnLnRleHQsICZlbnRyeSwgMCwgcGF0aHZhbCgpKTsKK30KKworCisvKiA9PT09PT09PT09PT0gQnVpbHRpbiBjb21tYW5kcworICoKKyAqIEJ1aWx0aW4gY29tbWFuZHMgd2hvc2UgZnVuY3Rpb25zIGFyZSBjbG9zZWx5IHRpZWQgdG8gZXZhbHVhdGlvbgorICogYXJlIGltcGxlbWVudGVkIGhlcmUuCisgKi8KKworLyoKKyAqIEhhbmRsZSBicmVhayBhbmQgY29udGludWUgY29tbWFuZHMuICBCcmVhaywgY29udGludWUsIGFuZCByZXR1cm4gYXJlCisgKiBhbGwgaGFuZGxlZCBieSBzZXR0aW5nIHRoZSBldmFsc2tpcCBmbGFnLiAgVGhlIGV2YWx1YXRpb24gcm91dGluZXMKKyAqIGFib3ZlIGFsbCBjaGVjayB0aGlzIGZsYWcsIGFuZCBpZiBpdCBpcyBzZXQgdGhleSBzdGFydCBza2lwcGluZworICogY29tbWFuZHMgcmF0aGVyIHRoYW4gZXhlY3V0aW5nIHRoZW0uICBUaGUgdmFyaWFibGUgc2tpcGNvdW50IGlzCisgKiB0aGUgbnVtYmVyIG9mIGxvb3BzIHRvIGJyZWFrL2NvbnRpbnVlLCBvciB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uCisgKiBsZXZlbHMgdG8gcmV0dXJuLiAgKFRoZSBsYXR0ZXIgaXMgYWx3YXlzIDEuKSAgSXQgc2hvdWxkIHByb2JhYmx5CisgKiBiZSBhbiBlcnJvciB0byBicmVhayBvdXQgb2YgbW9yZSBsb29wcyB0aGFuIGV4aXN0LCBidXQgaXQgaXNuJ3QKKyAqIGluIHRoZSBzdGFuZGFyZCBzaGVsbCBzbyB3ZSBkb24ndCBtYWtlIGl0IG9uZSBoZXJlLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQworYnJlYWtjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbiA9IGFyZ3ZbMV0gPyBudW1iZXIoYXJndlsxXSkgOiAxOworCisJaWYgKG4gPD0gMCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IobXNnX2lsbG51bSwgYXJndlsxXSk7CisJaWYgKG4gPiBsb29wbmVzdCkKKwkJbiA9IGxvb3BuZXN0OworCWlmIChuID4gMCkgeworCQlldmFsc2tpcCA9ICgqKmFyZ3YgPT0gJ2MnKSA/IFNLSVBDT05UIDogU0tJUEJSRUFLOworCQlza2lwY291bnQgPSBuOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT0gaW5wdXQuYworICoKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgaW5wdXQgcm91dGluZXMgdXNlZCBieSB0aGUgcGFyc2VyLgorICovCisKK2VudW0geworCUlOUFVUX1BVU0hfRklMRSA9IDEsCisJSU5QVVRfTk9GSUxFX09LID0gMiwKK307CisKK3N0YXRpYyBzbWFsbGludCBjaGVja2t3ZDsKKy8qIHZhbHVlcyBvZiBjaGVja2t3ZCB2YXJpYWJsZSAqLworI2RlZmluZSBDSEtBTElBUyAgICAgICAgMHgxCisjZGVmaW5lIENIS0tXRCAgICAgICAgICAweDIKKyNkZWZpbmUgQ0hLTkwgICAgICAgICAgIDB4NAorCisvKgorICogUHVzaCBhIHN0cmluZyBiYWNrIG9udG8gdGhlIGlucHV0IGF0IHRoaXMgY3VycmVudCBwYXJzZWZpbGUgbGV2ZWwuCisgKiBXZSBoYW5kbGUgYWxpYXNlcyB0aGlzIHdheS4KKyAqLworI2lmICFFTkFCTEVfQVNIX0FMSUFTCisjZGVmaW5lIHB1c2hzdHJpbmcocywgYXApIHB1c2hzdHJpbmcocykKKyNlbmRpZgorc3RhdGljIHZvaWQKK3B1c2hzdHJpbmcoY2hhciAqcywgc3RydWN0IGFsaWFzICphcCkKK3sKKwlzdHJ1Y3Qgc3RycHVzaCAqc3A7CisJaW50IGxlbjsKKworCWxlbiA9IHN0cmxlbihzKTsKKwlJTlRfT0ZGOworCWlmIChnX3BhcnNlZmlsZS0+c3RycHVzaCkgeworCQlzcCA9IGNremFsbG9jKHNpemVvZigqc3ApKTsKKwkJc3AtPnByZXYgPSBnX3BhcnNlZmlsZS0+c3RycHVzaDsKKwl9IGVsc2UgeworCQlzcCA9ICYoZ19wYXJzZWZpbGUtPmJhc2VzdHJwdXNoKTsKKwl9CisJZ19wYXJzZWZpbGUtPnN0cnB1c2ggPSBzcDsKKwlzcC0+cHJldl9zdHJpbmcgPSBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YzsKKwlzcC0+cHJldl9sZWZ0X2luX2xpbmUgPSBnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lOworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwlzcC0+YXAgPSBhcDsKKwlpZiAoYXApIHsKKwkJYXAtPmZsYWcgfD0gQUxJQVNJTlVTRTsKKwkJc3AtPnN0cmluZyA9IHM7CisJfQorI2VuZGlmCisJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMgPSBzOworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSBsZW47CisJSU5UX09OOworfQorCitzdGF0aWMgdm9pZAorcG9wc3RyaW5nKHZvaWQpCit7CisJc3RydWN0IHN0cnB1c2ggKnNwID0gZ19wYXJzZWZpbGUtPnN0cnB1c2g7CisKKwlJTlRfT0ZGOworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwlpZiAoc3AtPmFwKSB7CisJCWlmIChnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Y1stMV0gPT0gJyAnCisJCSB8fCBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Y1stMV0gPT0gJ1x0JworCQkpIHsKKwkJCWNoZWNra3dkIHw9IENIS0FMSUFTOworCQl9CisJCWlmIChzcC0+c3RyaW5nICE9IHNwLT5hcC0+dmFsKSB7CisJCQlmcmVlKHNwLT5zdHJpbmcpOworCQl9CisJCXNwLT5hcC0+ZmxhZyAmPSB+QUxJQVNJTlVTRTsKKwkJaWYgKHNwLT5hcC0+ZmxhZyAmIEFMSUFTREVBRCkgeworCQkJdW5hbGlhcyhzcC0+YXAtPm5hbWUpOworCQl9CisJfQorI2VuZGlmCisJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMgPSBzcC0+cHJldl9zdHJpbmc7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IHNwLT5wcmV2X2xlZnRfaW5fbGluZTsKKwlnX3BhcnNlZmlsZS0+c3RycHVzaCA9IHNwLT5wcmV2OworCWlmIChzcCAhPSAmKGdfcGFyc2VmaWxlLT5iYXNlc3RycHVzaCkpCisJCWZyZWUoc3ApOworCUlOVF9PTjsKK30KKworLy9GSVhNRTogQkFTSF9DT01QQVQgd2l0aCAiLi4uJiIgZG9lcyBUV08gcHVuZ2V0YygpOgorLy9pdCBwZWVrcyB3aGV0aGVyIGl0IGlzICY+LCBhbmQgdGhlbiBwdXNoZXMgYmFjayBib3RoIGNoYXJzLgorLy9UaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIHNhdmUgbGFzdCAqbmV4dF90b19wZ2V0YyB0byBidWZbMF0KKy8vdG8gbWFrZSB0d28gcHVuZ2V0YygpIHJlbGlhYmxlLiBDdXJyZW50bHksCisvLyBwZ2V0YyAob3V0IG9mIGJ1ZjogZG9lcyBwcmVhZGZkKSwgcGdldGMsIHB1bmdldGMsIHB1bmdldGMgd29uJ3Qgd29yay4uLgorc3RhdGljIGludAorcHJlYWRmZCh2b2lkKQoreworCWludCBucjsKKwljaGFyICpidWYgPSBnX3BhcnNlZmlsZS0+YnVmOworCisJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMgPSBidWY7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworIHJldHJ5OgorCWlmICghaWZsYWcgfHwgZ19wYXJzZWZpbGUtPnBmX2ZkICE9IFNURElOX0ZJTEVOTykKKwkJbnIgPSBub25ibG9ja19pbW11bmVfcmVhZChnX3BhcnNlZmlsZS0+cGZfZmQsIGJ1ZiwgSUJVRlNJWiAtIDEsIC8qbG9vcF9vbl9FSU5UUjoqLyAxKTsKKwllbHNlIHsKKwkJaW50IHRpbWVvdXQgPSAtMTsKKyMgaWYgRU5BQkxFX0FTSF9JRExFX1RJTUVPVVQKKwkJaWYgKGlmbGFnKSB7CisJCQljb25zdCBjaGFyICp0bW91dF92YXIgPSBsb29rdXB2YXIoIlRNT1VUIik7CisJCQlpZiAodG1vdXRfdmFyKSB7CisJCQkJdGltZW91dCA9IGF0b2kodG1vdXRfdmFyKSAqIDEwMDA7CisJCQkJaWYgKHRpbWVvdXQgPD0gMCkKKwkJCQkJdGltZW91dCA9IC0xOworCQkJfQorCQl9CisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OCisJCWxpbmVfaW5wdXRfc3RhdGUtPnBhdGhfbG9va3VwID0gcGF0aHZhbCgpOworIyBlbmRpZgorCQkvKiBVbmljb2RlIHN1cHBvcnQgc2hvdWxkIGJlIGFjdGl2YXRlZCBldmVuIGlmIExBTkcgaXMgc2V0CisJCSAqIF9kdXJpbmdfIHNoZWxsIGV4ZWN1dGlvbiwgbm90IG9ubHkgaWYgaXQgd2FzIHNldCB3aGVuCisJCSAqIHNoZWxsIHdhcyBzdGFydGVkLiBUaGVyZWZvcmUsIHJlLWNoZWNrIExBTkcgZXZlcnkgdGltZToKKwkJICovCisJCXJlaW5pdF91bmljb2RlKGxvb2t1cHZhcigiTEFORyIpKTsKKwkJbnIgPSByZWFkX2xpbmVfaW5wdXQobGluZV9pbnB1dF9zdGF0ZSwgY21kZWRpdF9wcm9tcHQsIGJ1ZiwgSUJVRlNJWiwgdGltZW91dCk7CisJCWlmIChuciA9PSAwKSB7CisJCQkvKiBDdHJsK0MgcHJlc3NlZCAqLworCQkJaWYgKHRyYXBbU0lHSU5UXSkgeworCQkJCWJ1ZlswXSA9ICdcbic7CisJCQkJYnVmWzFdID0gJ1wwJzsKKwkJCQlyYWlzZShTSUdJTlQpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJZ290byByZXRyeTsKKwkJfQorCQlpZiAobnIgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gMCkgeworCQkJCS8qIEN0cmwrRCBwcmVzc2VkICovCisJCQkJbnIgPSAwOworCQkJfQorIyBpZiBFTkFCTEVfQVNIX0lETEVfVElNRU9VVAorCQkJZWxzZSBpZiAoZXJybm8gPT0gRUFHQUlOICYmIHRpbWVvdXQgPiAwKSB7CisJCQkJcHJpbnRmKCJcMDA3dGltZWQgb3V0IHdhaXRpbmcgZm9yIGlucHV0OiBhdXRvLWxvZ291dFxuIik7CisJCQkJZXhpdHNoZWxsKCk7CisJCQl9CisjIGVuZGlmCisJCX0KKwl9CisjZWxzZQorCW5yID0gbm9uYmxvY2tfaW1tdW5lX3JlYWQoZ19wYXJzZWZpbGUtPnBmX2ZkLCBidWYsIElCVUZTSVogLSAxLCAvKmxvb3Bfb25fRUlOVFI6Ki8gMSk7CisjZW5kaWYKKworI2lmIDAgLyogZGlzYWJsZWQ6IG5vbmJsb2NrX2ltbXVuZV9yZWFkKCkgaGFuZGxlcyB0aGlzIHByb2JsZW0gKi8KKwlpZiAobnIgPCAwKSB7CisJCWlmIChwYXJzZWZpbGUtPmZkID09IDAgJiYgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKwkJCWludCBmbGFncyA9IGZjbnRsKDAsIEZfR0VURkwpOworCQkJaWYgKGZsYWdzID49IDAgJiYgKGZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJCQlmbGFncyAmPSB+T19OT05CTE9DSzsKKwkJCQlpZiAoZmNudGwoMCwgRl9TRVRGTCwgZmxhZ3MpID49IDApIHsKKwkJCQkJb3V0MnN0cigic2g6IHR1cm5pbmcgb2ZmIE5ERUxBWSBtb2RlXG4iKTsKKwkJCQkJZ290byByZXRyeTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gbnI7Cit9CisKKy8qCisgKiBSZWZpbGwgdGhlIGlucHV0IGJ1ZmZlciBhbmQgcmV0dXJuIHRoZSBuZXh0IGlucHV0IGNoYXJhY3RlcjoKKyAqCisgKiAxKSBJZiBhIHN0cmluZyB3YXMgcHVzaGVkIGJhY2sgb24gdGhlIGlucHV0LCBwb3AgaXQ7CisgKiAyKSBJZiBhbiBFT0Ygd2FzIHB1c2hlZCBiYWNrIChnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lIDwgLUJJR05VTSkKKyAqICAgIG9yIHdlIGFyZSByZWFkaW5nIGZyb20gYSBzdHJpbmcgc28gd2UgY2FuJ3QgcmVmaWxsIHRoZSBidWZmZXIsCisgKiAgICByZXR1cm4gRU9GLgorICogMykgSWYgdGhlcmUgaXMgbW9yZSBzdHVmZiBpbiB0aGlzIGJ1ZmZlciwgdXNlIGl0IGVsc2UgY2FsbCByZWFkIHRvIGZpbGwgaXQuCisgKiA0KSBQcm9jZXNzIGlucHV0IHVwIHRvIHRoZSBuZXh0IG5ld2xpbmUsIGRlbGV0aW5nIG51bCBjaGFyYWN0ZXJzLgorICovCisvLyNkZWZpbmUgcGdldGNfZGVidWcoLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZGVmaW5lIHBnZXRjX2RlYnVnKC4uLikgKCh2b2lkKTApCitzdGF0aWMgaW50CitwcmVhZGJ1ZmZlcih2b2lkKQoreworCWNoYXIgKnE7CisJaW50IG1vcmU7CisKKwl3aGlsZSAoZ19wYXJzZWZpbGUtPnN0cnB1c2gpIHsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJCWlmIChnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID09IC0xCisJCSAmJiBnX3BhcnNlZmlsZS0+c3RycHVzaC0+YXAKKwkJICYmIGdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjWy0xXSAhPSAnICcKKwkJICYmIGdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjWy0xXSAhPSAnXHQnCisJCSkgeworCQkJcGdldGNfZGVidWcoInByZWFkYnVmZmVyIFBFT0EiKTsKKwkJCXJldHVybiBQRU9BOworCQl9CisjZW5kaWYKKwkJcG9wc3RyaW5nKCk7CisJCS8qIHRyeSAicGdldGMiIG5vdzogKi8KKwkJcGdldGNfZGVidWcoInByZWFkYnVmZmVyIGludGVybmFsIHBnZXRjIGF0ICVkOiVwJyVzJyIsCisJCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSwKKwkJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YywKKwkJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yyk7CisJCWlmICgtLWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPj0gMCkKKwkJCXJldHVybiAodW5zaWduZWQgY2hhcikoKmdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKyspOworCX0KKwkvKiBvbiBib3RoIGJyYW5jaGVzIGFib3ZlIGdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPCAwLgorCSAqICJwZ2V0YyIgbmVlZHMgcmVmaWxsaW5nLgorCSAqLworCisJLyogLTkwIGlzIG91ciAtQklHTlVNLiBCZWxvdyB3ZSB1c2UgLTk5IHRvIG1hcmsgIkVPRiBvbiByZWFkIiwKKwkgKiBwdW5nZXRjKCkgbWF5IGluY3JlbWVudCBpdCBhIGZldyB0aW1lcy4KKwkgKiBBc3N1bWluZyBpdCB3b24ndCBpbmNyZW1lbnQgaXQgdG8gbGVzcyB0aGFuIC05MC4KKwkgKi8KKwlpZiAoZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA8IC05MCB8fCBnX3BhcnNlZmlsZS0+YnVmID09IE5VTEwpIHsKKwkJcGdldGNfZGVidWcoInByZWFkYnVmZmVyIFBFT0YxIik7CisJCS8qIGV2ZW4gaW4gZmFpbHVyZSBrZWVwIGxlZnRfaW5fbGluZSBhbmQgbmV4dF90b19wZ2V0YworCQkgKiBpbiBsb2NrIHN0ZXAsIGZvciBjb3JyZWN0IG11bHRpLWxheWVyIHB1bmdldGMuCisJCSAqIGxlZnRfaW5fbGluZSB3YXMgZGVjcmVtZW50ZWQgYmVmb3JlIHByZWFkYnVmZmVyKCksCisJCSAqIG11c3QgaW5jIG5leHRfdG9fcGdldGM6ICovCisJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKys7CisJCXJldHVybiBQRU9GOworCX0KKworCW1vcmUgPSBnX3BhcnNlZmlsZS0+bGVmdF9pbl9idWZmZXI7CisJaWYgKG1vcmUgPD0gMCkgeworCQlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisgYWdhaW46CisJCW1vcmUgPSBwcmVhZGZkKCk7CisJCWlmIChtb3JlIDw9IDApIHsKKwkJCS8qIGRvbid0IHRyeSByZWFkaW5nIGFnYWluICovCisJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gLTk5OworCQkJcGdldGNfZGVidWcoInByZWFkYnVmZmVyIFBFT0YyIik7CisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YysrOworCQkJcmV0dXJuIFBFT0Y7CisJCX0KKwl9CisKKwkvKiBGaW5kIG91dCB3aGVyZSdzIHRoZSBlbmQgb2YgbGluZS4KKwkgKiBTZXQgZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZQorCSAqIGFuZCBnX3BhcnNlZmlsZS0+bGVmdF9pbl9idWZmZXIgYWNvcmRpbmdseS4KKwkgKiBOVUwgY2hhcnMgYXJlIGRlbGV0ZWQuCisJICovCisJcSA9IGdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjOworCWZvciAoOzspIHsKKwkJY2hhciBjOworCisJCW1vcmUtLTsKKworCQljID0gKnE7CisJCWlmIChjID09ICdcMCcpIHsKKwkJCW1lbW1vdmUocSwgcSArIDEsIG1vcmUpOworCQl9IGVsc2UgeworCQkJcSsrOworCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSBxIC0gZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMgLSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG1vcmUgPD0gMCkgeworCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IHEgLSBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YyAtIDE7CisJCQlpZiAoZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA8IDApCisJCQkJZ290byBhZ2FpbjsKKwkJCWJyZWFrOworCQl9CisJfQorCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2J1ZmZlciA9IG1vcmU7CisKKwlpZiAodmZsYWcpIHsKKwkJY2hhciBzYXZlID0gKnE7CisJCSpxID0gJ1wwJzsKKwkJb3V0MnN0cihnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yyk7CisJCSpxID0gc2F2ZTsKKwl9CisKKwlwZ2V0Y19kZWJ1ZygicHJlYWRidWZmZXIgYXQgJWQ6JXAnJXMnIiwKKwkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUsCisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YywKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpKmdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKys7Cit9CisKKyNkZWZpbmUgcGdldGNfYXNfbWFjcm8oKSBcCisJKC0tZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA+PSAwIFwKKwk/ICh1bnNpZ25lZCBjaGFyKSpnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YysrIFwKKwk6IHByZWFkYnVmZmVyKCkgXAorCSkKKworc3RhdGljIGludAorcGdldGModm9pZCkKK3sKKwlwZ2V0Y19kZWJ1ZygicGdldGNfZmFzdCBhdCAlZDolcCclcyciLAorCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSwKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjLAorCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMpOworCXJldHVybiBwZ2V0Y19hc19tYWNybygpOworfQorCisjaWYgRU5BQkxFX0FTSF9PUFRJTUlaRV9GT1JfU0laRQorIyBkZWZpbmUgcGdldGNfZmFzdCgpIHBnZXRjKCkKKyNlbHNlCisjIGRlZmluZSBwZ2V0Y19mYXN0KCkgcGdldGNfYXNfbWFjcm8oKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCitzdGF0aWMgaW50CitwZ2V0Y193aXRob3V0X1BFT0Eodm9pZCkKK3sKKwlpbnQgYzsKKwlkbyB7CisJCXBnZXRjX2RlYnVnKCJwZ2V0Y19mYXN0IGF0ICVkOiVwJyVzJyIsCisJCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSwKKwkJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YywKKwkJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yyk7CisJCWMgPSBwZ2V0Y19mYXN0KCk7CisJfSB3aGlsZSAoYyA9PSBQRU9BKTsKKwlyZXR1cm4gYzsKK30KKyNlbHNlCisjIGRlZmluZSBwZ2V0Y193aXRob3V0X1BFT0EoKSBwZ2V0YygpCisjZW5kaWYKKworLyoKKyAqIFJlYWQgYSBsaW5lIGZyb20gdGhlIHNjcmlwdC4KKyAqLworc3RhdGljIGNoYXIgKgorcGZnZXRzKGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJY2hhciAqcCA9IGxpbmU7CisJaW50IG5sZWZ0ID0gbGVuOworCWludCBjOworCisJd2hpbGUgKC0tbmxlZnQgPiAwKSB7CisJCWMgPSBwZ2V0Y193aXRob3V0X1BFT0EoKTsKKwkJaWYgKGMgPT0gUEVPRikgeworCQkJaWYgKHAgPT0gbGluZSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCSpwKysgPSBjOworCQlpZiAoYyA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gbGluZTsKK30KKworLyoKKyAqIFVuZG8gdGhlIGxhc3QgY2FsbCB0byBwZ2V0Yy4gIE9ubHkgb25lIGNoYXJhY3RlciBtYXkgYmUgcHVzaGVkIGJhY2suCisgKiBQRU9GIG1heSBiZSBwdXNoZWQgYmFjay4KKyAqLworc3RhdGljIHZvaWQKK3B1bmdldGModm9pZCkKK3sKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lKys7CisJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMtLTsKKwlwZ2V0Y19kZWJ1ZygicHVzaGVkIGJhY2sgdG8gJWQ6JXAnJXMnIiwKKwkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUsCisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YywKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKTsKK30KKworLyoKKyAqIFRvIGhhbmRsZSB0aGUgIi4iIGNvbW1hbmQsIGEgc3RhY2sgb2YgaW5wdXQgZmlsZXMgaXMgdXNlZC4gIFB1c2hmaWxlCisgKiBhZGRzIGEgbmV3IGVudHJ5IHRvIHRoZSBzdGFjayBhbmQgcG9wZmlsZSByZXN0b3JlcyB0aGUgcHJldmlvdXMgbGV2ZWwuCisgKi8KK3N0YXRpYyB2b2lkCitwdXNoZmlsZSh2b2lkKQoreworCXN0cnVjdCBwYXJzZWZpbGUgKnBmOworCisJcGYgPSBja3phbGxvYyhzaXplb2YoKnBmKSk7CisJcGYtPnByZXYgPSBnX3BhcnNlZmlsZTsKKwlwZi0+cGZfZmQgPSAtMTsKKwkvKnBmLT5zdHJwdXNoID0gTlVMTDsgLSBja3phbGxvYyBkaWQgaXQgKi8KKwkvKnBmLT5iYXNlc3RycHVzaC5wcmV2ID0gTlVMTDsqLworCWdfcGFyc2VmaWxlID0gcGY7Cit9CisKK3N0YXRpYyB2b2lkCitwb3BmaWxlKHZvaWQpCit7CisJc3RydWN0IHBhcnNlZmlsZSAqcGYgPSBnX3BhcnNlZmlsZTsKKworCUlOVF9PRkY7CisJaWYgKHBmLT5wZl9mZCA+PSAwKQorCQljbG9zZShwZi0+cGZfZmQpOworCWZyZWUocGYtPmJ1Zik7CisJd2hpbGUgKHBmLT5zdHJwdXNoKQorCQlwb3BzdHJpbmcoKTsKKwlnX3BhcnNlZmlsZSA9IHBmLT5wcmV2OworCWZyZWUocGYpOworCUlOVF9PTjsKK30KKworLyoKKyAqIFJldHVybiB0byB0b3AgbGV2ZWwuCisgKi8KK3N0YXRpYyB2b2lkCitwb3BhbGxmaWxlcyh2b2lkKQoreworCXdoaWxlIChnX3BhcnNlZmlsZSAhPSAmYmFzZXBmKQorCQlwb3BmaWxlKCk7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgZmlsZShzKSB0aGF0IHRoZSBzaGVsbCBpcyByZWFkaW5nIGNvbW1hbmRzIGZyb20uICBDYWxsZWQKKyAqIGFmdGVyIGEgZm9yayBpcyBkb25lLgorICovCitzdGF0aWMgdm9pZAorY2xvc2VzY3JpcHQodm9pZCkKK3sKKwlwb3BhbGxmaWxlcygpOworCWlmIChnX3BhcnNlZmlsZS0+cGZfZmQgPiAwKSB7CisJCWNsb3NlKGdfcGFyc2VmaWxlLT5wZl9mZCk7CisJCWdfcGFyc2VmaWxlLT5wZl9mZCA9IDA7CisJfQorfQorCisvKgorICogTGlrZSBzZXRpbnB1dGZpbGUsIGJ1dCB0YWtlcyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4gIENhbGwgdGhpcyB3aXRoCisgKiBpbnRlcnJ1cHRzIG9mZi4KKyAqLworc3RhdGljIHZvaWQKK3NldGlucHV0ZmQoaW50IGZkLCBpbnQgcHVzaCkKK3sKKwljbG9zZV9vbl9leGVjX29uKGZkKTsKKwlpZiAocHVzaCkgeworCQlwdXNoZmlsZSgpOworCQlnX3BhcnNlZmlsZS0+YnVmID0gTlVMTDsKKwl9CisJZ19wYXJzZWZpbGUtPnBmX2ZkID0gZmQ7CisJaWYgKGdfcGFyc2VmaWxlLT5idWYgPT0gTlVMTCkKKwkJZ19wYXJzZWZpbGUtPmJ1ZiA9IGNrbWFsbG9jKElCVUZTSVopOworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2J1ZmZlciA9IDA7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IDA7CisJZ19wYXJzZWZpbGUtPmxpbm5vID0gMTsKK30KKworLyoKKyAqIFNldCB0aGUgaW5wdXQgdG8gdGFrZSBpbnB1dCBmcm9tIGEgZmlsZS4gIElmIHB1c2ggaXMgc2V0LCBwdXNoIHRoZQorICogb2xkIGlucHV0IG9udG8gdGhlIHN0YWNrIGZpcnN0LgorICovCitzdGF0aWMgaW50CitzZXRpbnB1dGZpbGUoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbGFncykKK3sKKwlpbnQgZmQ7CisJaW50IGZkMjsKKworCUlOVF9PRkY7CisJZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlpZiAoZmxhZ3MgJiBJTlBVVF9OT0ZJTEVfT0spCisJCQlnb3RvIG91dDsKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IG9wZW4gJyVzJyIsIGZuYW1lKTsKKwl9CisJaWYgKGZkIDwgMTApIHsKKwkJZmQyID0gY29weWZkKGZkLCAxMCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKGZkMiA8IDApCisJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigib3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMiKTsKKwkJZmQgPSBmZDI7CisJfQorCXNldGlucHV0ZmQoZmQsIGZsYWdzICYgSU5QVVRfUFVTSF9GSUxFKTsKKyBvdXQ6CisJSU5UX09OOworCXJldHVybiBmZDsKK30KKworLyoKKyAqIExpa2Ugc2V0aW5wdXRmaWxlLCBidXQgdGFrZXMgaW5wdXQgZnJvbSBhIHN0cmluZy4KKyAqLworc3RhdGljIHZvaWQKK3NldGlucHV0c3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKwlJTlRfT0ZGOworCXB1c2hmaWxlKCk7CisJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMgPSBzdHJpbmc7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IHN0cmxlbihzdHJpbmcpOworCWdfcGFyc2VmaWxlLT5idWYgPSBOVUxMOworCWdfcGFyc2VmaWxlLT5saW5ubyA9IDE7CisJSU5UX09OOworfQorCisKKy8qID09PT09PT09PT09PSBtYWlsLmMKKyAqCisgKiBSb3V0aW5lcyB0byBjaGVjayBmb3IgbWFpbC4KKyAqLworCisjaWYgRU5BQkxFX0FTSF9NQUlMCisKKyNkZWZpbmUgTUFYTUJPWEVTIDEwCisKKy8qIHRpbWVzIG9mIG1haWxib3hlcyAqLworc3RhdGljIHRpbWVfdCBtYWlsdGltZVtNQVhNQk9YRVNdOworLyogU2V0IGlmIE1BSUwgb3IgTUFJTFBBVEggaXMgY2hhbmdlZC4gKi8KK3N0YXRpYyBzbWFsbGludCBtYWlsX3Zhcl9wYXRoX2NoYW5nZWQ7CisKKy8qCisgKiBQcmludCBhcHByb3ByaWF0ZSBtZXNzYWdlKHMpIGlmIG1haWwgaGFzIGFycml2ZWQuCisgKiBJZiBtYWlsX3Zhcl9wYXRoX2NoYW5nZWQgaXMgc2V0LAorICogdGhlbiB0aGUgdmFsdWUgb2YgTUFJTCBoYXMgbWFpbF92YXJfcGF0aF9jaGFuZ2VkLAorICogc28gd2UganVzdCB1cGRhdGUgdGhlIHZhbHVlcy4KKyAqLworc3RhdGljIHZvaWQKK2Noa21haWwodm9pZCkKK3sKKwljb25zdCBjaGFyICptcGF0aDsKKwljaGFyICpwOworCWNoYXIgKnE7CisJdGltZV90ICptdHA7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCXNldHN0YWNrbWFyaygmc21hcmspOworCW1wYXRoID0gbXBhdGhzZXQoKSA/IG1wYXRodmFsKCkgOiBtYWlsdmFsKCk7CisJZm9yIChtdHAgPSBtYWlsdGltZTsgbXRwIDwgbWFpbHRpbWUgKyBNQVhNQk9YRVM7IG10cCsrKSB7CisJCXAgPSBwYXRoX2FkdmFuY2UoJm1wYXRoLCBudWxsc3RyKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKnAgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQkJY29udGludWU7CisjaWYgREVCVUcKKwkJaWYgKHFbLTFdICE9ICcvJykKKwkJCWFib3J0KCk7CisjZW5kaWYKKwkJcVstMV0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgdHJhaWxpbmcgJy8nICovCisJCWlmIChzdGF0KHAsICZzdGF0YikgPCAwKSB7CisJCQkqbXRwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghbWFpbF92YXJfcGF0aF9jaGFuZ2VkICYmIHN0YXRiLnN0X210aW1lICE9ICptdHApIHsKKwkJCWZwcmludGYoCisJCQkJc3RkZXJyLCAiJXNcbiIsCisJCQkJcGF0aG9wdCA/IHBhdGhvcHQgOiAieW91IGhhdmUgbWFpbCIKKwkJCSk7CisJCX0KKwkJKm10cCA9IHN0YXRiLnN0X210aW1lOworCX0KKwltYWlsX3Zhcl9wYXRoX2NoYW5nZWQgPSAwOworCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZW1haWwoY29uc3QgY2hhciAqdmFsIFVOVVNFRF9QQVJBTSkKK3sKKwltYWlsX3Zhcl9wYXRoX2NoYW5nZWQgPSAxOworfQorCisjZW5kaWYgLyogQVNIX01BSUwgKi8KKworCisvKiA9PT09PT09PT09PT0gPz8/ICovCisKKy8qCisgKiBTZXQgdGhlIHNoZWxsIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRwYXJhbShjaGFyICoqYXJndikKK3sKKwljaGFyICoqbmV3cGFyYW07CisJY2hhciAqKmFwOworCWludCBucGFyYW07CisKKwlmb3IgKG5wYXJhbSA9IDA7IGFyZ3ZbbnBhcmFtXTsgbnBhcmFtKyspCisJCWNvbnRpbnVlOworCWFwID0gbmV3cGFyYW0gPSBja21hbGxvYygobnBhcmFtICsgMSkgKiBzaXplb2YoKmFwKSk7CisJd2hpbGUgKCphcmd2KSB7CisJCSphcCsrID0gY2tzdHJkdXAoKmFyZ3YrKyk7CisJfQorCSphcCA9IE5VTEw7CisJZnJlZXBhcmFtKCZzaGVsbHBhcmFtKTsKKwlzaGVsbHBhcmFtLm1hbGxvY2VkID0gMTsKKwlzaGVsbHBhcmFtLm5wYXJhbSA9IG5wYXJhbTsKKwlzaGVsbHBhcmFtLnAgPSBuZXdwYXJhbTsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorfQorCisvKgorICogUHJvY2VzcyBzaGVsbCBvcHRpb25zLiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBhcmdwdHIgY29udGFpbnMgYSBwb2ludGVyCisgKiB0byB0aGUgYXJndW1lbnQgbGlzdDsgd2UgYWR2YW5jZSBpdCBwYXN0IHRoZSBvcHRpb25zLgorICoKKyAqIFNVU3YzIHNlY3Rpb24gMi44LjEgIkNvbnNlcXVlbmNlcyBvZiBTaGVsbCBFcnJvcnMiIHNheXM6CisgKiBGb3IgYSBub24taW50ZXJhY3RpdmUgc2hlbGwsIGFuIGVycm9yIGNvbmRpdGlvbiBlbmNvdW50ZXJlZAorICogYnkgYSBzcGVjaWFsIGJ1aWx0LWluIC4uLiBzaGFsbCBjYXVzZSB0aGUgc2hlbGwgdG8gd3JpdGUgYSBkaWFnbm9zdGljIG1lc3NhZ2UKKyAqIHRvIHN0YW5kYXJkIGVycm9yIGFuZCBleGl0IGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisgKiBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWFsIEJ1aWx0LUluCisgKiAuLi4KKyAqIFV0aWxpdHkgc3ludGF4IGVycm9yIChvcHRpb24gb3Igb3BlcmFuZCBlcnJvcikgIFNoYWxsIGV4aXQKKyAqIC4uLgorICogSG93ZXZlciwgaW4gYnVnIDExNDIgKGh0dHA6Ly9idXN5Ym94Lm5ldC9idWdzL3ZpZXcucGhwP2lkPTExNDIpCisgKiB3ZSBzZWUgdGhhdCBiYXNoIGRvZXMgbm90IGRvIHRoYXQgKHNldCAiZmluaXNoZXMiIHdpdGggZXJyb3IgY29kZSAxIGluc3RlYWQsCisgKiBhbmQgc2hlbGwgY29udGludWVzKSwgYW5kIHBlb3BsZSByZWx5IG9uIHRoaXMgYmVoYXZpb3IhCisgKiBUZXN0Y2FzZToKKyAqIHNldCAtbyBiYXJmb28gMj4vZGV2L251bGwKKyAqIGVjaG8gJD8KKyAqCisgKiBPaCB3ZWxsLiBMZXQncyBtaW1pYyB0aGF0LgorICovCitzdGF0aWMgaW50CitwbHVzX21pbnVzX28oY2hhciAqbmFtZSwgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWlmIChuYW1lKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKSB7CisJCQlpZiAoc3RyY21wKG5hbWUsIG9wdG5hbWVzKGkpKSA9PSAwKSB7CisJCQkJb3B0bGlzdFtpXSA9IHZhbDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlhc2hfbXNnKCJpbGxlZ2FsIG9wdGlvbiAlY28gJXMiLCB2YWwgPyAnLScgOiAnKycsIG5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspIHsKKwkJaWYgKHZhbCkgeworCQkJb3V0MWZtdCgiJS0xNnMlc1xuIiwgb3B0bmFtZXMoaSksIG9wdGxpc3RbaV0gPyAib24iIDogIm9mZiIpOworCQl9IGVsc2UgeworCQkJb3V0MWZtdCgic2V0ICVjbyAlc1xuIiwgb3B0bGlzdFtpXSA/ICctJyA6ICcrJywgb3B0bmFtZXMoaSkpOworCQl9CisJfQorCXJldHVybiAwOworfQorc3RhdGljIHZvaWQKK3NldG9wdGlvbihpbnQgZmxhZywgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKSB7CisJCWlmIChvcHRsZXR0ZXJzKGkpID09IGZsYWcpIHsKKwkJCW9wdGxpc3RbaV0gPSB2YWw7CisJCQlyZXR1cm47CisJCX0KKwl9CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImlsbGVnYWwgb3B0aW9uICVjJWMiLCB2YWwgPyAnLScgOiAnKycsIGZsYWcpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KK3N0YXRpYyBpbnQKK29wdGlvbnMoaW50IGNtZGxpbmUpCit7CisJY2hhciAqcDsKKwlpbnQgdmFsOworCWludCBjOworCisJaWYgKGNtZGxpbmUpCisJCW1pbnVzYyA9IE5VTEw7CisJd2hpbGUgKChwID0gKmFyZ3B0cikgIT0gTlVMTCkgeworCQljID0gKnArKzsKKwkJaWYgKGMgIT0gJy0nICYmIGMgIT0gJysnKQorCQkJYnJlYWs7CisJCWFyZ3B0cisrOworCQl2YWwgPSAwOyAvKiB2YWwgPSAwIGlmIGMgPT0gJysnICovCisJCWlmIChjID09ICctJykgeworCQkJdmFsID0gMTsKKwkJCWlmIChwWzBdID09ICdcMCcgfHwgTE9ORV9EQVNIKHApKSB7CisJCQkJaWYgKCFjbWRsaW5lKSB7CisJCQkJCS8qICItIiBtZWFucyB0dXJuIG9mZiAteCBhbmQgLXYgKi8KKwkJCQkJaWYgKHBbMF0gPT0gJ1wwJykKKwkJCQkJCXhmbGFnID0gdmZsYWcgPSAwOworCQkJCQkvKiAiLS0iIG1lYW5zIHJlc2V0IHBhcmFtcyAqLworCQkJCQllbHNlIGlmICgqYXJncHRyID09IE5VTEwpCisJCQkJCQlzZXRwYXJhbShhcmdwdHIpOworCQkJCX0KKwkJCQlicmVhazsgICAgLyogIi0iIG9yICItLSIgdGVybWluYXRlcyBvcHRpb25zICovCisJCQl9CisJCX0KKwkJLyogZmlyc3QgY2hhciB3YXMgKyBvciAtICovCisJCXdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpIHsKKwkJCS8qIGJhc2ggMy4yIGluZGVlZCBoYW5kbGVzIC1jIENNRCBhbmQgK2MgQ01EIHRoZSBzYW1lICovCisJCQlpZiAoYyA9PSAnYycgJiYgY21kbGluZSkgeworCQkJCW1pbnVzYyA9IHA7ICAgICAvKiBjb21tYW5kIGlzIGFmdGVyIHNoZWxsIGFyZ3MgKi8KKwkJCX0gZWxzZSBpZiAoYyA9PSAnbycpIHsKKwkJCQlpZiAocGx1c19taW51c19vKCphcmdwdHIsIHZhbCkpIHsKKwkJCQkJLyogaXQgYWxyZWFkeSBwcmludGVkIGVyciBtZXNzYWdlICovCisJCQkJCXJldHVybiAxOyAvKiBlcnJvciAqLworCQkJCX0KKwkJCQlpZiAoKmFyZ3B0cikKKwkJCQkJYXJncHRyKys7CisJCQl9IGVsc2UgaWYgKGNtZGxpbmUgJiYgKGMgPT0gJ2wnKSkgeyAvKiAtbCBvciArbCA9PSAtLWxvZ2luICovCisJCQkJaXNsb2dpbnNoID0gMTsKKwkJCS8qIGJhc2ggZG9lcyBub3QgYWNjZXB0ICstbG9naW4sIHdlIGFsc28gd29uJ3QgKi8KKwkJCX0gZWxzZSBpZiAoY21kbGluZSAmJiB2YWwgJiYgKGMgPT0gJy0nKSkgeyAvKiBsb25nIG9wdGlvbnMgKi8KKwkJCQlpZiAoc3RyY21wKHAsICJsb2dpbiIpID09IDApCisJCQkJCWlzbG9naW5zaCA9IDE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXNldG9wdGlvbihjLCB2YWwpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhlIHNoaWZ0IGJ1aWx0aW4gY29tbWFuZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3NoaWZ0Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJY2hhciAqKmFwMSwgKiphcDI7CisKKwluID0gMTsKKwlpZiAoYXJndlsxXSkKKwkJbiA9IG51bWJlcihhcmd2WzFdKTsKKwlpZiAobiA+IHNoZWxscGFyYW0ubnBhcmFtKQorCQluID0gMDsgLyogYmFzaCBjb21wYXQsIHdhcyA9IHNoZWxscGFyYW0ubnBhcmFtOyAqLworCUlOVF9PRkY7CisJc2hlbGxwYXJhbS5ucGFyYW0gLT0gbjsKKwlmb3IgKGFwMSA9IHNoZWxscGFyYW0ucDsgLS1uID49IDA7IGFwMSsrKSB7CisJCWlmIChzaGVsbHBhcmFtLm1hbGxvY2VkKQorCQkJZnJlZSgqYXAxKTsKKwl9CisJYXAyID0gc2hlbGxwYXJhbS5wOworCXdoaWxlICgoKmFwMisrID0gKmFwMSsrKSAhPSBOVUxMKQorCQljb250aW51ZTsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorCUlOVF9PTjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBPU0lYIHJlcXVpcmVzIHRoYXQgJ3NldCcgKGJ1dCBub3QgZXhwb3J0IG9yIHJlYWRvbmx5KSBvdXRwdXQgdGhlCisgKiB2YXJpYWJsZXMgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlciAtIGJ5IHRoZSBsb2NhbGUncyBjb2xsYXRpbmcgb3JkZXIgKHNpZ2gpLgorICogTWF5YmUgd2UgY291bGQga2VlcCB0aGVtIGluIGFuIG9yZGVyZWQgYmFsYW5jZWQgYmluYXJ5IHRyZWUKKyAqIGluc3RlYWQgb2YgaGFzaGVkIGxpc3RzLgorICogRm9yIG5vdyBqdXN0IHJvbGwgJ2VtIHRocm91Z2ggcXNvcnQgZm9yIHByaW50aW5nLi4uCisgKi8KK3N0YXRpYyBpbnQKK3Nob3d2YXJzKGNvbnN0IGNoYXIgKnNlcF9wcmVmaXgsIGludCBvbiwgaW50IG9mZikKK3sKKwljb25zdCBjaGFyICpzZXA7CisJY2hhciAqKmVwLCAqKmVwZW5kOworCisJZXAgPSBsaXN0dmFycyhvbiwgb2ZmLCAmZXBlbmQpOworCXFzb3J0KGVwLCBlcGVuZCAtIGVwLCBzaXplb2YoY2hhciAqKSwgdnBjbXApOworCisJc2VwID0gKnNlcF9wcmVmaXggPyAiICIgOiBzZXBfcHJlZml4OworCisJZm9yICg7IGVwIDwgZXBlbmQ7IGVwKyspIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJY29uc3QgY2hhciAqcTsKKworCQlwID0gc3RyY2hybnVsKCplcCwgJz0nKTsKKwkJcSA9IG51bGxzdHI7CisJCWlmICgqcCkKKwkJCXEgPSBzaW5nbGVfcXVvdGUoKytwKTsKKwkJb3V0MWZtdCgiJXMlcyUuKnMlc1xuIiwgc2VwX3ByZWZpeCwgc2VwLCAoaW50KShwIC0gKmVwKSwgKmVwLCBxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgc2V0IGNvbW1hbmQgYnVpbHRpbi4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3NldGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCFhcmd2WzFdKQorCQlyZXR1cm4gc2hvd3ZhcnMobnVsbHN0ciwgMCwgVlVOU0VUKTsKKworCUlOVF9PRkY7CisJcmV0dmFsID0gb3B0aW9ucygvKmNtZGxpbmU6Ki8gMCk7CisJaWYgKHJldHZhbCA9PSAwKSB7IC8qIGlmIG5vIHBhcnNlIGVycm9yLi4uICovCisJCW9wdHNjaGFuZ2VkKCk7CisJCWlmICgqYXJncHRyICE9IE5VTEwpIHsKKwkJCXNldHBhcmFtKGFyZ3B0cik7CisJCX0KKwl9CisJSU5UX09OOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZV9yYW5kb20oY29uc3QgY2hhciAqdmFsdWUpCit7CisJdWludDMyX3QgdDsKKworCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCS8qICJnZXQiLCBnZW5lcmF0ZSAqLworCQl0ID0gbmV4dF9yYW5kb20oJnJhbmRvbV9nZW4pOworCQkvKiBzZXQgd2l0aG91dCByZWN1cnNpb24gKi8KKwkJc2V0dmFyKHZyYW5kb20udmFyX3RleHQsIHV0b2EodCksIFZOT0ZVTkMpOworCQl2cmFuZG9tLmZsYWdzICY9IH5WTk9GVU5DOworCX0gZWxzZSB7CisJCS8qIHNldC9yZXNldCAqLworCQl0ID0gc3RydG91bCh2YWx1ZSwgTlVMTCwgMTApOworCQlJTklUX1JBTkRPTV9UKCZyYW5kb21fZ2VuLCAodCA/IHQgOiAxKSwgdCk7CisJfQorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKK3N0YXRpYyBpbnQKK2dldG9wdHMoY2hhciAqb3B0c3RyLCBjaGFyICpvcHR2YXIsIGNoYXIgKipvcHRmaXJzdCwgaW50ICpwYXJhbV9vcHRpbmQsIGludCAqb3B0b2ZmKQoreworCWNoYXIgKnAsICpxOworCWNoYXIgYyA9ICc/JzsKKwlpbnQgZG9uZSA9IDA7CisJaW50IGVyciA9IDA7CisJY2hhciBzWzEyXTsKKwljaGFyICoqb3B0bmV4dDsKKworCWlmICgqcGFyYW1fb3B0aW5kIDwgMSkKKwkJcmV0dXJuIDE7CisJb3B0bmV4dCA9IG9wdGZpcnN0ICsgKnBhcmFtX29wdGluZCAtIDE7CisKKwlpZiAoKnBhcmFtX29wdGluZCA8PSAxIHx8ICpvcHRvZmYgPCAwIHx8IChpbnQpc3RybGVuKG9wdG5leHRbLTFdKSA8ICpvcHRvZmYpCisJCXAgPSBOVUxMOworCWVsc2UKKwkJcCA9IG9wdG5leHRbLTFdICsgKm9wdG9mZjsKKwlpZiAocCA9PSBOVUxMIHx8ICpwID09ICdcMCcpIHsKKwkJLyogQ3VycmVudCB3b3JkIGlzIGRvbmUsIGFkdmFuY2UgKi8KKwkJcCA9ICpvcHRuZXh0OworCQlpZiAocCA9PSBOVUxMIHx8ICpwICE9ICctJyB8fCAqKytwID09ICdcMCcpIHsKKyBhdGVuZDoKKwkJCXAgPSBOVUxMOworCQkJZG9uZSA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQlvcHRuZXh0Kys7CisJCWlmIChMT05FX0RBU0gocCkpICAgICAgICAvKiBjaGVjayBmb3IgIi0tIiAqLworCQkJZ290byBhdGVuZDsKKwl9CisKKwljID0gKnArKzsKKwlmb3IgKHEgPSBvcHRzdHI7ICpxICE9IGM7KSB7CisJCWlmICgqcSA9PSAnXDAnKSB7CisJCQlpZiAob3B0c3RyWzBdID09ICc6JykgeworCQkJCXNbMF0gPSBjOworCQkJCXNbMV0gPSAnXDAnOworCQkJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBzLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIG9wdGlvbiAtJWNcbiIsIGMpOworCQkJCXVuc2V0dmFyKCJPUFRBUkciKTsKKwkJCX0KKwkJCWMgPSAnPyc7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoKisrcSA9PSAnOicpCisJCQlxKys7CisJfQorCisJaWYgKCorK3EgPT0gJzonKSB7CisJCWlmICgqcCA9PSAnXDAnICYmIChwID0gKm9wdG5leHQpID09IE5VTEwpIHsKKwkJCWlmIChvcHRzdHJbMF0gPT0gJzonKSB7CisJCQkJc1swXSA9IGM7CisJCQkJc1sxXSA9ICdcMCc7CisJCQkJZXJyIHw9IHNldHZhcnNhZmUoIk9QVEFSRyIsIHMsIDApOworCQkJCWMgPSAnOic7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gYXJnIGZvciAtJWMgb3B0aW9uXG4iLCBjKTsKKwkJCQl1bnNldHZhcigiT1BUQVJHIik7CisJCQkJYyA9ICc/JzsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHAgPT0gKm9wdG5leHQpCisJCQlvcHRuZXh0Kys7CisJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBwLCAwKTsKKwkJcCA9IE5VTEw7CisJfSBlbHNlCisJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBudWxsc3RyLCAwKTsKKyBvdXQ6CisJKm9wdG9mZiA9IHAgPyBwIC0gKihvcHRuZXh0IC0gMSkgOiAtMTsKKwkqcGFyYW1fb3B0aW5kID0gb3B0bmV4dCAtIG9wdGZpcnN0ICsgMTsKKwlmbXRzdHIocywgc2l6ZW9mKHMpLCAiJWQiLCAqcGFyYW1fb3B0aW5kKTsKKwllcnIgfD0gc2V0dmFyc2FmZSgiT1BUSU5EIiwgcywgVk5PRlVOQyk7CisJc1swXSA9IGM7CisJc1sxXSA9ICdcMCc7CisJZXJyIHw9IHNldHZhcnNhZmUob3B0dmFyLCBzLCAwKTsKKwlpZiAoZXJyKSB7CisJCSpwYXJhbV9vcHRpbmQgPSAxOworCQkqb3B0b2ZmID0gLTE7CisJCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKKwkJcmFpc2VfZXhjZXB0aW9uKEVYRVJST1IpOworCX0KKwlyZXR1cm4gZG9uZTsKK30KKworLyoKKyAqIFRoZSBnZXRvcHRzIGJ1aWx0aW4uICBTaGVsbHBhcmFtLm9wdG5leHQgcG9pbnRzIHRvIHRoZSBuZXh0IGFyZ3VtZW50CisgKiB0byBiZSBwcm9jZXNzZWQuICBTaGVsbHBhcmFtLm9wdHB0ciBwb2ludHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvCisgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGN1cnJlbnQgYXJndW1lbnQuICBJZiBzaGVsbHBhcmFtLm9wdG5leHQgaXMgTlVMTCwKKyAqIHRoZW4gaXQncyB0aGUgZmlyc3QgdGltZSBnZXRvcHRzIGhhcyBiZWVuIGNhbGxlZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2dldG9wdHNjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipvcHRiYXNlOworCisJaWYgKGFyZ2MgPCAzKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigidXNhZ2U6IGdldG9wdHMgb3B0c3RyaW5nIHZhciBbYXJnXSIpOworCWlmIChhcmdjID09IDMpIHsKKwkJb3B0YmFzZSA9IHNoZWxscGFyYW0ucDsKKwkJaWYgKHNoZWxscGFyYW0ub3B0aW5kID4gc2hlbGxwYXJhbS5ucGFyYW0gKyAxKSB7CisJCQlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJCQlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJb3B0YmFzZSA9ICZhcmd2WzNdOworCQlpZiAoc2hlbGxwYXJhbS5vcHRpbmQgPiBhcmdjIC0gMikgeworCQkJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCQkJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiBnZXRvcHRzKGFyZ3ZbMV0sIGFyZ3ZbMl0sIG9wdGJhc2UsICZzaGVsbHBhcmFtLm9wdGluZCwKKwkJCSZzaGVsbHBhcmFtLm9wdG9mZik7Cit9CisjZW5kaWYgLyogQVNIX0dFVE9QVFMgKi8KKworCisvKiA9PT09PT09PT09PT0gU2hlbGwgcGFyc2VyICovCisKK3N0cnVjdCBoZXJlZG9jIHsKKwlzdHJ1Y3QgaGVyZWRvYyAqbmV4dDsgICAvKiBuZXh0IGhlcmUgZG9jdW1lbnQgaW4gbGlzdCAqLworCXVuaW9uIG5vZGUgKmhlcmU7ICAgICAgIC8qIHJlZGlyZWN0aW9uIG5vZGUgKi8KKwljaGFyICplb2ZtYXJrOyAgICAgICAgICAvKiBzdHJpbmcgaW5kaWNhdGluZyBlbmQgb2YgaW5wdXQgKi8KKwlzbWFsbGludCBzdHJpcHRhYnM7ICAgICAvKiBpZiBzZXQsIHN0cmlwIGxlYWRpbmcgdGFicyAqLworfTsKKworc3RhdGljIHNtYWxsaW50IHRva3B1c2hiYWNrOyAgICAgICAgICAgLyogbGFzdCB0b2tlbiBwdXNoZWQgYmFjayAqLworc3RhdGljIHNtYWxsaW50IHBhcnNlYmFja3F1b3RlOyAgICAgICAgLyogbm9uemVybyBpZiB3ZSBhcmUgaW5zaWRlIGJhY2txdW90ZXMgKi8KK3N0YXRpYyBzbWFsbGludCBxdW90ZWZsYWc7ICAgICAgICAgICAgIC8qIHNldCBpZiAocGFydCBvZikgbGFzdCB0b2tlbiB3YXMgcXVvdGVkICovCitzdGF0aWMgdG9rZW5faWRfdCBsYXN0dG9rZW47ICAgICAgICAgICAvKiBsYXN0IHRva2VuIHJlYWQgKGludGVnZXIgaWQgVHh4eCkgKi8KK3N0YXRpYyBzdHJ1Y3QgaGVyZWRvYyAqaGVyZWRvY2xpc3Q7ICAgIC8qIGxpc3Qgb2YgaGVyZSBkb2N1bWVudHMgdG8gcmVhZCAqLworc3RhdGljIGNoYXIgKndvcmR0ZXh0OyAgICAgICAgICAgICAgICAgLyogdGV4dCBvZiBsYXN0IHdvcmQgcmV0dXJuZWQgYnkgcmVhZHRva2VuICovCitzdGF0aWMgc3RydWN0IG5vZGVsaXN0ICpiYWNrcXVvdGVsaXN0Oworc3RhdGljIHVuaW9uIG5vZGUgKnJlZGlybm9kZTsKK3N0YXRpYyBzdHJ1Y3QgaGVyZWRvYyAqaGVyZWRvYzsKKworc3RhdGljIGNvbnN0IGNoYXIgKgordG9rbmFtZShjaGFyICpidWYsIGludCB0b2spCit7CisJaWYgKHRvayA8IFRTRU1JKQorCQlyZXR1cm4gdG9rbmFtZV9hcnJheVt0b2tdICsgMTsKKwlzcHJpbnRmKGJ1ZiwgIlwiJXNcIiIsIHRva25hbWVfYXJyYXlbdG9rXSArIDEpOworCXJldHVybiBidWY7Cit9CisKKy8qIHJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4OgorICogQ2FsbGVkIHdoZW4gYW4gdW5leHBlY3RlZCB0b2tlbiBpcyByZWFkIGR1cmluZyB0aGUgcGFyc2UuICBUaGUgYXJndW1lbnQKKyAqIGlzIHRoZSB0b2tlbiB0aGF0IGlzIGV4cGVjdGVkLCBvciAtMSBpZiBtb3JlIHRoYW4gb25lIHR5cGUgb2YgdG9rZW4gY2FuCisgKiBvY2N1ciBhdCB0aGlzIHBvaW50LgorICovCitzdGF0aWMgdm9pZCByYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChpbnQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3JhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KGludCB0b2tlbikKK3sKKwljaGFyIG1zZ1s2NF07CisJY2hhciBidWZbMTZdOworCWludCBsOworCisJbCA9IHNwcmludGYobXNnLCAidW5leHBlY3RlZCAlcyIsIHRva25hbWUoYnVmLCBsYXN0dG9rZW4pKTsKKwlpZiAodG9rZW4gPj0gMCkKKwkJc3ByaW50Zihtc2cgKyBsLCAiIChleHBlY3RpbmcgJXMpIiwgdG9rbmFtZShidWYsIHRva2VuKSk7CisJcmFpc2VfZXJyb3Jfc3ludGF4KG1zZyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisjZGVmaW5lIEVPRk1BUktMRU4gNzkKKworLyogcGFyc2luZyBpcyBoZWF2aWx5IGNyb3NzLXJlY3Vyc2l2ZSwgbmVlZCB0aGVzZSBmb3J3YXJkIGRlY2xzICovCitzdGF0aWMgdW5pb24gbm9kZSAqYW5kb3Iodm9pZCk7CitzdGF0aWMgdW5pb24gbm9kZSAqcGlwZWxpbmUodm9pZCk7CitzdGF0aWMgdW5pb24gbm9kZSAqcGFyc2VfY29tbWFuZCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBhcnNlaGVyZWRvYyh2b2lkKTsKK3N0YXRpYyBjaGFyIHBlZWt0b2tlbih2b2lkKTsKK3N0YXRpYyBpbnQgcmVhZHRva2VuKHZvaWQpOworCitzdGF0aWMgdW5pb24gbm9kZSAqCitsaXN0KGludCBubGZsYWcpCit7CisJdW5pb24gbm9kZSAqbjEsICpuMiwgKm4zOworCWludCB0b2s7CisKKwljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJaWYgKG5sZmxhZyA9PSAyICYmIHBlZWt0b2tlbigpKQorCQlyZXR1cm4gTlVMTDsKKwluMSA9IE5VTEw7CisJZm9yICg7OykgeworCQluMiA9IGFuZG9yKCk7CisJCXRvayA9IHJlYWR0b2tlbigpOworCQlpZiAodG9rID09IFRCQUNLR05EKSB7CisJCQlpZiAobjItPnR5cGUgPT0gTlBJUEUpIHsKKwkJCQluMi0+bnBpcGUucGlwZV9iYWNrZ25kID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG4yLT50eXBlICE9IE5SRURJUikgeworCQkJCQluMyA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSk7CisJCQkJCW4zLT5ucmVkaXIubiA9IG4yOworCQkJCQkvKm4zLT5ucmVkaXIucmVkaXJlY3QgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQkJCQluMiA9IG4zOworCQkJCX0KKwkJCQluMi0+dHlwZSA9IE5CQUNLR05EOworCQkJfQorCQl9CisJCWlmIChuMSA9PSBOVUxMKSB7CisJCQluMSA9IG4yOworCQl9IGVsc2UgeworCQkJbjMgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5iaW5hcnkpKTsKKwkJCW4zLT50eXBlID0gTlNFTUk7CisJCQluMy0+bmJpbmFyeS5jaDEgPSBuMTsKKwkJCW4zLT5uYmluYXJ5LmNoMiA9IG4yOworCQkJbjEgPSBuMzsKKwkJfQorCQlzd2l0Y2ggKHRvaykgeworCQljYXNlIFRCQUNLR05EOgorCQljYXNlIFRTRU1JOgorCQkJdG9rID0gcmVhZHRva2VuKCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBUTkw6CisJCQlpZiAodG9rID09IFROTCkgeworCQkJCXBhcnNlaGVyZWRvYygpOworCQkJCWlmIChubGZsYWcgPT0gMSkKKwkJCQkJcmV0dXJuIG4xOworCQkJfSBlbHNlIHsKKwkJCQl0b2twdXNoYmFjayA9IDE7CisJCQl9CisJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQlpZiAocGVla3Rva2VuKCkpCisJCQkJcmV0dXJuIG4xOworCQkJYnJlYWs7CisJCWNhc2UgVEVPRjoKKwkJCWlmIChoZXJlZG9jbGlzdCkKKwkJCQlwYXJzZWhlcmVkb2MoKTsKKwkJCWVsc2UKKwkJCQlwdW5nZXRjKCk7ICAgICAgICAgICAgICAvKiBwdXNoIGJhY2sgRU9GIG9uIGlucHV0ICovCisJCQlyZXR1cm4gbjE7CisJCWRlZmF1bHQ6CisJCQlpZiAobmxmbGFnID09IDEpCisJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoLTEpOworCQkJdG9rcHVzaGJhY2sgPSAxOworCQkJcmV0dXJuIG4xOworCQl9CisJfQorfQorCitzdGF0aWMgdW5pb24gbm9kZSAqCithbmRvcih2b2lkKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjIsICpuMzsKKwlpbnQgdDsKKworCW4xID0gcGlwZWxpbmUoKTsKKwlmb3IgKDs7KSB7CisJCXQgPSByZWFkdG9rZW4oKTsKKwkJaWYgKHQgPT0gVEFORCkgeworCQkJdCA9IE5BTkQ7CisJCX0gZWxzZSBpZiAodCA9PSBUT1IpIHsKKwkJCXQgPSBOT1I7CisJCX0gZWxzZSB7CisJCQl0b2twdXNoYmFjayA9IDE7CisJCQlyZXR1cm4gbjE7CisJCX0KKwkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCQluMiA9IHBpcGVsaW5lKCk7CisJCW4zID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSk7CisJCW4zLT50eXBlID0gdDsKKwkJbjMtPm5iaW5hcnkuY2gxID0gbjE7CisJCW4zLT5uYmluYXJ5LmNoMiA9IG4yOworCQluMSA9IG4zOworCX0KK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorcGlwZWxpbmUodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yLCAqcGlwZW5vZGU7CisJc3RydWN0IG5vZGVsaXN0ICpscCwgKnByZXY7CisJaW50IG5lZ2F0ZTsKKworCW5lZ2F0ZSA9IDA7CisJVFJBQ0UoKCJwaXBlbGluZTogZW50ZXJlZFxuIikpOworCWlmIChyZWFkdG9rZW4oKSA9PSBUTk9UKSB7CisJCW5lZ2F0ZSA9ICFuZWdhdGU7CisJCWNoZWNra3dkID0gQ0hLS1dEIHwgQ0hLQUxJQVM7CisJfSBlbHNlCisJCXRva3B1c2hiYWNrID0gMTsKKwluMSA9IHBhcnNlX2NvbW1hbmQoKTsKKwlpZiAocmVhZHRva2VuKCkgPT0gVFBJUEUpIHsKKwkJcGlwZW5vZGUgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5waXBlKSk7CisJCXBpcGVub2RlLT50eXBlID0gTlBJUEU7CisJCS8qcGlwZW5vZGUtPm5waXBlLnBpcGVfYmFja2duZCA9IDA7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCWxwID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlbGlzdCkpOworCQlwaXBlbm9kZS0+bnBpcGUuY21kbGlzdCA9IGxwOworCQlscC0+biA9IG4xOworCQlkbyB7CisJCQlwcmV2ID0gbHA7CisJCQlscCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZWxpc3QpKTsKKwkJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJCWxwLT5uID0gcGFyc2VfY29tbWFuZCgpOworCQkJcHJldi0+bmV4dCA9IGxwOworCQl9IHdoaWxlIChyZWFkdG9rZW4oKSA9PSBUUElQRSk7CisJCWxwLT5uZXh0ID0gTlVMTDsKKwkJbjEgPSBwaXBlbm9kZTsKKwl9CisJdG9rcHVzaGJhY2sgPSAxOworCWlmIChuZWdhdGUpIHsKKwkJbjIgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5ub3QpKTsKKwkJbjItPnR5cGUgPSBOTk9UOworCQluMi0+bm5vdC5jb20gPSBuMTsKKwkJcmV0dXJuIG4yOworCX0KKwlyZXR1cm4gbjE7Cit9CisKK3N0YXRpYyB1bmlvbiBub2RlICoKK21ha2VuYW1lKHZvaWQpCit7CisJdW5pb24gbm9kZSAqbjsKKworCW4gPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwluLT50eXBlID0gTkFSRzsKKwkvKm4tPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJbi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJbi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZAorZml4cmVkaXIodW5pb24gbm9kZSAqbiwgY29uc3QgY2hhciAqdGV4dCwgaW50IGVycikKK3sKKwlpbnQgZmQ7CisKKwlUUkFDRSgoIkZpeCByZWRpciAlcyAlZFxuIiwgdGV4dCwgZXJyKSk7CisJaWYgKCFlcnIpCisJCW4tPm5kdXAudm5hbWUgPSBOVUxMOworCisJZmQgPSBiYl9zdHJ0b3UodGV4dCwgTlVMTCwgMTApOworCWlmICghZXJybm8gJiYgZmQgPj0gMCkKKwkJbi0+bmR1cC5kdXBmZCA9IGZkOworCWVsc2UgaWYgKExPTkVfREFTSCh0ZXh0KSkKKwkJbi0+bmR1cC5kdXBmZCA9IC0xOworCWVsc2UgeworCQlpZiAoZXJyKQorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgZmQgbnVtYmVyIik7CisJCW4tPm5kdXAudm5hbWUgPSBtYWtlbmFtZSgpOworCX0KK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBjb250YWlucyBub3RoaW5nIHRvIGV4cGFuZCAobm8gZG9sbGFyIHNpZ25zCisgKiBvciBiYWNrcXVvdGVzKS4KKyAqLworc3RhdGljIGludAorbm9leHBhbmQoY29uc3QgY2hhciAqdGV4dCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwl3aGlsZSAoKGMgPSAqdGV4dCsrKSAhPSAnXDAnKSB7CisJCWlmIChjID09IENUTFFVT1RFTUFSSykKKwkJCWNvbnRpbnVlOworCQlpZiAoYyA9PSBDVExFU0MpCisJCQl0ZXh0Kys7CisJCWVsc2UgaWYgKFNJVChjLCBCQVNFU1lOVEFYKSA9PSBDQ1RMKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VmbmFtZSh2b2lkKQoreworCXVuaW9uIG5vZGUgKm4gPSByZWRpcm5vZGU7CisKKwlpZiAocmVhZHRva2VuKCkgIT0gVFdPUkQpCisJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KC0xKTsKKwlpZiAobi0+dHlwZSA9PSBOSEVSRSkgeworCQlzdHJ1Y3QgaGVyZWRvYyAqaGVyZSA9IGhlcmVkb2M7CisJCXN0cnVjdCBoZXJlZG9jICpwOworCQlpbnQgaTsKKworCQlpZiAocXVvdGVmbGFnID09IDApCisJCQluLT50eXBlID0gTlhIRVJFOworCQlUUkFDRSgoIkhlcmUgZG9jdW1lbnQgJWRcbiIsIG4tPnR5cGUpKTsKKwkJaWYgKCFub2V4cGFuZCh3b3JkdGV4dCkgfHwgKGkgPSBzdHJsZW4od29yZHRleHQpKSA9PSAwIHx8IGkgPiBFT0ZNQVJLTEVOKQorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJpbGxlZ2FsIGVvZiBtYXJrZXIgZm9yIDw8IHJlZGlyZWN0aW9uIik7CisJCXJtZXNjYXBlcyh3b3JkdGV4dCwgMCk7CisJCWhlcmUtPmVvZm1hcmsgPSB3b3JkdGV4dDsKKwkJaGVyZS0+bmV4dCA9IE5VTEw7CisJCWlmIChoZXJlZG9jbGlzdCA9PSBOVUxMKQorCQkJaGVyZWRvY2xpc3QgPSBoZXJlOworCQllbHNlIHsKKwkJCWZvciAocCA9IGhlcmVkb2NsaXN0OyBwLT5uZXh0OyBwID0gcC0+bmV4dCkKKwkJCQljb250aW51ZTsKKwkJCXAtPm5leHQgPSBoZXJlOworCQl9CisJfSBlbHNlIGlmIChuLT50eXBlID09IE5UT0ZEIHx8IG4tPnR5cGUgPT0gTkZST01GRCkgeworCQlmaXhyZWRpcihuLCB3b3JkdGV4dCwgMCk7CisJfSBlbHNlIHsKKwkJbi0+bmZpbGUuZm5hbWUgPSBtYWtlbmFtZSgpOworCX0KK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorc2ltcGxlY21kKHZvaWQpCit7CisJdW5pb24gbm9kZSAqYXJncywgKiphcHA7CisJdW5pb24gbm9kZSAqbiA9IE5VTEw7CisJdW5pb24gbm9kZSAqdmFycywgKip2cHA7CisJdW5pb24gbm9kZSAqKnJwcCwgKnJlZGlyOworCWludCBzYXZlY2hlY2trd2Q7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCXNtYWxsaW50IGRvdWJsZV9icmFja2V0c19mbGFnID0gMDsKKyNlbmRpZgorCisJYXJncyA9IE5VTEw7CisJYXBwID0gJmFyZ3M7CisJdmFycyA9IE5VTEw7CisJdnBwID0gJnZhcnM7CisJcmVkaXIgPSBOVUxMOworCXJwcCA9ICZyZWRpcjsKKworCXNhdmVjaGVja2t3ZCA9IENIS0FMSUFTOworCWZvciAoOzspIHsKKwkJaW50IHQ7CisJCWNoZWNra3dkID0gc2F2ZWNoZWNra3dkOworCQl0ID0gcmVhZHRva2VuKCk7CisJCXN3aXRjaCAodCkgeworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJY2FzZSBUQU5EOiAvKiAiJiYiICovCisJCWNhc2UgVE9SOiAvKiAifHwiICovCisJCQlpZiAoIWRvdWJsZV9icmFja2V0c19mbGFnKSB7CisJCQkJdG9rcHVzaGJhY2sgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJd29yZHRleHQgPSAoY2hhciAqKSAodCA9PSBUQU5EID8gIi1hIiA6ICItbyIpOworI2VuZGlmCisJCWNhc2UgVFdPUkQ6CisJCQluID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCQluLT50eXBlID0gTkFSRzsKKwkJCS8qbi0+bmFyZy5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJCW4tPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCWlmIChzdHJjbXAoIltbIiwgd29yZHRleHQpID09IDApCisJCQkJZG91YmxlX2JyYWNrZXRzX2ZsYWcgPSAxOworCQkJZWxzZSBpZiAoc3RyY21wKCJdXSIsIHdvcmR0ZXh0KSA9PSAwKQorCQkJCWRvdWJsZV9icmFja2V0c19mbGFnID0gMDsKKyNlbmRpZgorCQkJbi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQkJaWYgKHNhdmVjaGVja2t3ZCAmJiBpc2Fzc2lnbm1lbnQod29yZHRleHQpKSB7CisJCQkJKnZwcCA9IG47CisJCQkJdnBwID0gJm4tPm5hcmcubmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJKmFwcCA9IG47CisJCQkJYXBwID0gJm4tPm5hcmcubmV4dDsKKwkJCQlzYXZlY2hlY2trd2QgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFJFRElSOgorCQkJKnJwcCA9IG4gPSByZWRpcm5vZGU7CisJCQlycHAgPSAmbi0+bmZpbGUubmV4dDsKKwkJCXBhcnNlZm5hbWUoKTsgICAvKiByZWFkIG5hbWUgb2YgcmVkaXJlY3Rpb24gZmlsZSAqLworCQkJYnJlYWs7CisJCWNhc2UgVExQOgorCQkJaWYgKGFyZ3MgJiYgYXBwID09ICZhcmdzLT5uYXJnLm5leHQKKwkJCSAmJiAhdmFycyAmJiAhcmVkaXIKKwkJCSkgeworCQkJCXN0cnVjdCBidWlsdGluY21kICpiY21kOworCQkJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJCQkvKiBXZSBoYXZlIGEgZnVuY3Rpb24gKi8KKwkJCQlpZiAocmVhZHRva2VuKCkgIT0gVFJQKQorCQkJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChUUlApOworCQkJCW5hbWUgPSBuLT5uYXJnLnRleHQ7CisJCQkJaWYgKCFnb29kbmFtZShuYW1lKQorCQkJCSB8fCAoKGJjbWQgPSBmaW5kX2J1aWx0aW4obmFtZSkpICYmIElTX0JVSUxUSU5fU1BFQ0lBTChiY21kKSkKKwkJCQkpIHsKKwkJCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgZnVuY3Rpb24gbmFtZSIpOworCQkJCX0KKwkJCQluLT50eXBlID0gTkRFRlVOOworCQkJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJCQluLT5uYXJnLm5leHQgPSBwYXJzZV9jb21tYW5kKCk7CisJCQkJcmV0dXJuIG47CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCXRva3B1c2hiYWNrID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorIG91dDoKKwkqYXBwID0gTlVMTDsKKwkqdnBwID0gTlVMTDsKKwkqcnBwID0gTlVMTDsKKwluID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuY21kKSk7CisJbi0+dHlwZSA9IE5DTUQ7CisJbi0+bmNtZC5hcmdzID0gYXJnczsKKwluLT5uY21kLmFzc2lnbiA9IHZhcnM7CisJbi0+bmNtZC5yZWRpcmVjdCA9IHJlZGlyOworCXJldHVybiBuOworfQorCitzdGF0aWMgdW5pb24gbm9kZSAqCitwYXJzZV9jb21tYW5kKHZvaWQpCit7CisJdW5pb24gbm9kZSAqbjEsICpuMjsKKwl1bmlvbiBub2RlICphcCwgKiphcHA7CisJdW5pb24gbm9kZSAqY3AsICoqY3BwOworCXVuaW9uIG5vZGUgKnJlZGlyLCAqKnJwcDsKKwl1bmlvbiBub2RlICoqcnBwMjsKKwlpbnQgdDsKKworCXJlZGlyID0gTlVMTDsKKwlycHAyID0gJnJlZGlyOworCisJc3dpdGNoIChyZWFkdG9rZW4oKSkgeworCWRlZmF1bHQ6CisJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KC0xKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCWNhc2UgVElGOgorCQluMSA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmlmKSk7CisJCW4xLT50eXBlID0gTklGOworCQluMS0+bmlmLnRlc3QgPSBsaXN0KDApOworCQlpZiAocmVhZHRva2VuKCkgIT0gVFRIRU4pCisJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChUVEhFTik7CisJCW4xLT5uaWYuaWZwYXJ0ID0gbGlzdCgwKTsKKwkJbjIgPSBuMTsKKwkJd2hpbGUgKHJlYWR0b2tlbigpID09IFRFTElGKSB7CisJCQluMi0+bmlmLmVsc2VwYXJ0ID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuaWYpKTsKKwkJCW4yID0gbjItPm5pZi5lbHNlcGFydDsKKwkJCW4yLT50eXBlID0gTklGOworCQkJbjItPm5pZi50ZXN0ID0gbGlzdCgwKTsKKwkJCWlmIChyZWFkdG9rZW4oKSAhPSBUVEhFTikKKwkJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChUVEhFTik7CisJCQluMi0+bmlmLmlmcGFydCA9IGxpc3QoMCk7CisJCX0KKwkJaWYgKGxhc3R0b2tlbiA9PSBURUxTRSkKKwkJCW4yLT5uaWYuZWxzZXBhcnQgPSBsaXN0KDApOworCQllbHNlIHsKKwkJCW4yLT5uaWYuZWxzZXBhcnQgPSBOVUxMOworCQkJdG9rcHVzaGJhY2sgPSAxOworCQl9CisJCXQgPSBURkk7CisJCWJyZWFrOworCWNhc2UgVFdISUxFOgorCWNhc2UgVFVOVElMOiB7CisJCWludCBnb3Q7CisJCW4xID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSk7CisJCW4xLT50eXBlID0gKGxhc3R0b2tlbiA9PSBUV0hJTEUpID8gTldISUxFIDogTlVOVElMOworCQluMS0+bmJpbmFyeS5jaDEgPSBsaXN0KDApOworCQlnb3QgPSByZWFkdG9rZW4oKTsKKwkJaWYgKGdvdCAhPSBURE8pIHsKKwkJCVRSQUNFKCgiZXhwZWN0aW5nIERPIGdvdCAnJXMnICVzXG4iLCB0b2tuYW1lX2FycmF5W2dvdF0gKyAxLAorCQkJCQlnb3QgPT0gVFdPUkQgPyB3b3JkdGV4dCA6ICIiKSk7CisJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChURE8pOworCQl9CisJCW4xLT5uYmluYXJ5LmNoMiA9IGxpc3QoMCk7CisJCXQgPSBURE9ORTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVEZPUjoKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEIHx8IHF1b3RlZmxhZyB8fCAhZ29vZG5hbWUod29yZHRleHQpKQorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgZm9yIGxvb3AgdmFyaWFibGUiKTsKKwkJbjEgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5mb3IpKTsKKwkJbjEtPnR5cGUgPSBORk9SOworCQluMS0+bmZvci52YXIgPSB3b3JkdGV4dDsKKwkJY2hlY2trd2QgPSBDSEtLV0QgfCBDSEtBTElBUzsKKwkJaWYgKHJlYWR0b2tlbigpID09IFRJTikgeworCQkJYXBwID0gJmFwOworCQkJd2hpbGUgKHJlYWR0b2tlbigpID09IFRXT1JEKSB7CisJCQkJbjIgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJCQluMi0+dHlwZSA9IE5BUkc7CisJCQkJLypuMi0+bmFyZy5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJCQluMi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCQkJbjItPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJCQkqYXBwID0gbjI7CisJCQkJYXBwID0gJm4yLT5uYXJnLm5leHQ7CisJCQl9CisJCQkqYXBwID0gTlVMTDsKKwkJCW4xLT5uZm9yLmFyZ3MgPSBhcDsKKwkJCWlmIChsYXN0dG9rZW4gIT0gVE5MICYmIGxhc3R0b2tlbiAhPSBUU0VNSSkKKwkJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCgtMSk7CisJCX0gZWxzZSB7CisJCQluMiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmFyZykpOworCQkJbjItPnR5cGUgPSBOQVJHOworCQkJLypuMi0+bmFyZy5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJCW4yLT5uYXJnLnRleHQgPSAoY2hhciAqKWRvbGF0c3RyOworCQkJLypuMi0+bmFyZy5iYWNrcXVvdGUgPSBOVUxMOyovCisJCQluMS0+bmZvci5hcmdzID0gbjI7CisJCQkvKgorCQkJICogTmV3bGluZSBvciBzZW1pY29sb24gaGVyZSBpcyBvcHRpb25hbCAoYnV0IG5vdGUKKwkJCSAqIHRoYXQgdGhlIG9yaWdpbmFsIEJvdXJuZSBzaGVsbCBvbmx5IGFsbG93ZWQgTkwpLgorCQkJICovCisJCQlpZiAobGFzdHRva2VuICE9IFROTCAmJiBsYXN0dG9rZW4gIT0gVFNFTUkpCisJCQkJdG9rcHVzaGJhY2sgPSAxOworCQl9CisJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRETykKKwkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRETyk7CisJCW4xLT5uZm9yLmJvZHkgPSBsaXN0KDApOworCQl0ID0gVERPTkU7CisJCWJyZWFrOworCWNhc2UgVENBU0U6CisJCW4xID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuY2FzZSkpOworCQluMS0+dHlwZSA9IE5DQVNFOworCQlpZiAocmVhZHRva2VuKCkgIT0gVFdPUkQpCisJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChUV09SRCk7CisJCW4xLT5uY2FzZS5leHByID0gbjIgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJbjItPnR5cGUgPSBOQVJHOworCQkvKm4yLT5uYXJnLm5leHQgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQluMi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCW4yLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCWRvIHsKKwkJCWNoZWNra3dkID0gQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCX0gd2hpbGUgKHJlYWR0b2tlbigpID09IFROTCk7CisJCWlmIChsYXN0dG9rZW4gIT0gVElOKQorCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVElOKTsKKwkJY3BwID0gJm4xLT5uY2FzZS5jYXNlczsKKyBuZXh0X2Nhc2U6CisJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0Q7CisJCXQgPSByZWFkdG9rZW4oKTsKKwkJd2hpbGUgKHQgIT0gVEVTQUMpIHsKKwkJCWlmIChsYXN0dG9rZW4gPT0gVExQKQorCQkJCXJlYWR0b2tlbigpOworCQkJKmNwcCA9IGNwID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuY2xpc3QpKTsKKwkJCWNwLT50eXBlID0gTkNMSVNUOworCQkJYXBwID0gJmNwLT5uY2xpc3QucGF0dGVybjsKKwkJCWZvciAoOzspIHsKKwkJCQkqYXBwID0gYXAgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJCQlhcC0+dHlwZSA9IE5BUkc7CisJCQkJLyphcC0+bmFyZy5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJCQlhcC0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCQkJYXAtPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJCQlpZiAocmVhZHRva2VuKCkgIT0gVFBJUEUpCisJCQkJCWJyZWFrOworCQkJCWFwcCA9ICZhcC0+bmFyZy5uZXh0OworCQkJCXJlYWR0b2tlbigpOworCQkJfQorCQkJLy9hcC0+bmFyZy5uZXh0ID0gTlVMTDsKKwkJCWlmIChsYXN0dG9rZW4gIT0gVFJQKQorCQkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRSUCk7CisJCQljcC0+bmNsaXN0LmJvZHkgPSBsaXN0KDIpOworCisJCQljcHAgPSAmY3AtPm5jbGlzdC5uZXh0OworCisJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEOworCQkJdCA9IHJlYWR0b2tlbigpOworCQkJaWYgKHQgIT0gVEVTQUMpIHsKKwkJCQlpZiAodCAhPSBURU5EQ0FTRSkKKwkJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVEVORENBU0UpOworCQkJCWdvdG8gbmV4dF9jYXNlOworCQkJfQorCQl9CisJCSpjcHAgPSBOVUxMOworCQlnb3RvIHJlZGlyOworCWNhc2UgVExQOgorCQluMSA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSk7CisJCW4xLT50eXBlID0gTlNVQlNIRUxMOworCQluMS0+bnJlZGlyLm4gPSBsaXN0KDApOworCQkvKm4xLT5ucmVkaXIucmVkaXJlY3QgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQl0ID0gVFJQOworCQlicmVhazsKKwljYXNlIFRCRUdJTjoKKwkJbjEgPSBsaXN0KDApOworCQl0ID0gVEVORDsKKwkJYnJlYWs7CisJY2FzZSBUV09SRDoKKwljYXNlIFRSRURJUjoKKwkJdG9rcHVzaGJhY2sgPSAxOworCQlyZXR1cm4gc2ltcGxlY21kKCk7CisJfQorCisJaWYgKHJlYWR0b2tlbigpICE9IHQpCisJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KHQpOworCisgcmVkaXI6CisJLyogTm93IGNoZWNrIGZvciByZWRpcmVjdGlvbiB3aGljaCBtYXkgZm9sbG93IGNvbW1hbmQgKi8KKwljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCXJwcCA9IHJwcDI7CisJd2hpbGUgKHJlYWR0b2tlbigpID09IFRSRURJUikgeworCQkqcnBwID0gbjIgPSByZWRpcm5vZGU7CisJCXJwcCA9ICZuMi0+bmZpbGUubmV4dDsKKwkJcGFyc2VmbmFtZSgpOworCX0KKwl0b2twdXNoYmFjayA9IDE7CisJKnJwcCA9IE5VTEw7CisJaWYgKHJlZGlyKSB7CisJCWlmIChuMS0+dHlwZSAhPSBOU1VCU0hFTEwpIHsKKwkJCW4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBucmVkaXIpKTsKKwkJCW4yLT50eXBlID0gTlJFRElSOworCQkJbjItPm5yZWRpci5uID0gbjE7CisJCQluMSA9IG4yOworCQl9CisJCW4xLT5ucmVkaXIucmVkaXJlY3QgPSByZWRpcjsKKwl9CisJcmV0dXJuIG4xOworfQorCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorc3RhdGljIGludCBkZWNvZGVfZG9sbGFyX3NxdW90ZSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIENfZXNjYXBlc1tdIEFMSUdOMSA9ICJucmJ0ZmF2IiJ4XFwwMTIzNDU2NyI7CisJaW50IGMsIGNudDsKKwljaGFyICpwOworCWNoYXIgYnVmWzRdOworCisJYyA9IHBnZXRjKCk7CisJcCA9IHN0cmNocihDX2VzY2FwZXMsIGMpOworCWlmIChwKSB7CisJCWJ1ZlswXSA9IGM7CisJCXAgPSBidWY7CisJCWNudCA9IDM7CisJCWlmICgodW5zaWduZWQgY2hhcikoYyAtICcwJykgPD0gNykgeyAvKiBcb29vICovCisJCQlkbyB7CisJCQkJYyA9IHBnZXRjKCk7CisJCQkJKisrcCA9IGM7CisJCQl9IHdoaWxlICgodW5zaWduZWQgY2hhcikoYyAtICcwJykgPD0gNyAmJiAtLWNudCk7CisJCQlwdW5nZXRjKCk7CisJCX0gZWxzZSBpZiAoYyA9PSAneCcpIHsgLyogXHhISCAqLworCQkJZG8geworCQkJCWMgPSBwZ2V0YygpOworCQkJCSorK3AgPSBjOworCQkJfSB3aGlsZSAoaXN4ZGlnaXQoYykgJiYgLS1jbnQpOworCQkJcHVuZ2V0YygpOworCQkJaWYgKGNudCA9PSAzKSB7IC8qIFx4IGJ1dCBuZXh0IGNoYXIgaXMgImJhZCIgKi8KKwkJCQljID0gJ3gnOworCQkJCWdvdG8gdW5yZWNvZ25pemVkOworCQkJfQorCQl9IGVsc2UgeyAvKiBzaW1wbGUgc2VxIGxpa2UgXFwgb3IgXHQgKi8KKwkJCXArKzsKKwkJfQorCQkqcCA9ICdcMCc7CisJCXAgPSBidWY7CisJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgodm9pZCopJnApOworCX0gZWxzZSB7IC8qIHVucmVjb2duaXplZCAiXHoiOiBwcmludCBib3RoIGNoYXJzIHVubGVzcyAnIG9yICIgKi8KKwkJaWYgKGMgIT0gJ1wnJyAmJiBjICE9ICciJykgeworIHVucmVjb2duaXplZDoKKwkJCWMgfD0gMHgxMDA7IC8qICJwbGVhc2UgZW5jb2RlIFwsIHRoZW4gbWUiICovCisJCX0KKwl9CisJcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoKKyAqIElmIGVvZm1hcmsgaXMgTlVMTCwgcmVhZCBhIHdvcmQgb3IgYSByZWRpcmVjdGlvbiBzeW1ib2wuICBJZiBlb2ZtYXJrCisgKiBpcyBub3QgTlVMTCwgcmVhZCBhIGhlcmUgZG9jdW1lbnQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIGVvZm1hcmsgaXMgdGhlCisgKiB3b3JkIHdoaWNoIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGFuZCBzdHJpcHRhYnMgaXMgdHJ1ZSBpZgorICogbGVhZGluZyB0YWJzIHNob3VsZCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBkb2N1bWVudC4gIFRoZSBhcmd1bWVudCBjCisgKiBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCB0b2tlbiBvciBkb2N1bWVudC4KKyAqCisgKiBCZWNhdXNlIEMgZG9lcyBub3QgaGF2ZSBpbnRlcm5hbCBzdWJyb3V0aW5lcywgSSBoYXZlIHNpbXVsYXRlZCB0aGVtCisgKiB1c2luZyBnb3RvJ3MgdG8gaW1wbGVtZW50IHRoZSBzdWJyb3V0aW5lIGxpbmthZ2UuICBUaGUgZm9sbG93aW5nIG1hY3JvcworICogd2lsbCBydW4gY29kZSB0aGF0IGFwcGVhcnMgYXQgdGhlIGVuZCBvZiByZWFkdG9rZW4xLgorICovCisjZGVmaW5lIENIRUNLRU5EKCkgICAgICB7Z290byBjaGVja2VuZDsgY2hlY2tlbmRfcmV0dXJuOjt9CisjZGVmaW5lIFBBUlNFUkVESVIoKSAgICB7Z290byBwYXJzZXJlZGlyOyBwYXJzZXJlZGlyX3JldHVybjo7fQorI2RlZmluZSBQQVJTRVNVQigpICAgICAge2dvdG8gcGFyc2VzdWI7IHBhcnNlc3ViX3JldHVybjo7fQorI2RlZmluZSBQQVJTRUJBQ0tRT0xEKCkge29sZHN0eWxlID0gMTsgZ290byBwYXJzZWJhY2txOyBwYXJzZWJhY2txX29sZHJldHVybjo7fQorI2RlZmluZSBQQVJTRUJBQ0tRTkVXKCkge29sZHN0eWxlID0gMDsgZ290byBwYXJzZWJhY2txOyBwYXJzZWJhY2txX25ld3JldHVybjo7fQorI2RlZmluZSBQQVJTRUFSSVRIKCkgICAge2dvdG8gcGFyc2Vhcml0aDsgcGFyc2Vhcml0aF9yZXR1cm46O30KK3N0YXRpYyBpbnQKK3JlYWR0b2tlbjEoaW50IGMsIGludCBzeW50YXgsIGNoYXIgKmVvZm1hcmssIGludCBzdHJpcHRhYnMpCit7CisJLyogTkI6IHN5bnRheCBwYXJhbWV0ZXIgZml0cyBpbnRvIHNtYWxsaW50ICovCisJLyogYyBwYXJhbWV0ZXIgaXMgYW4gdW5zaWduZWQgY2hhciBvciBQRU9GIG9yIFBFT0EgKi8KKwljaGFyICpvdXQ7CisJaW50IGxlbjsKKwljaGFyIGxpbmVbRU9GTUFSS0xFTiArIDFdOworCXN0cnVjdCBub2RlbGlzdCAqYnFsaXN0OworCXNtYWxsaW50IHF1b3RlZjsKKwlzbWFsbGludCBkYmxxdW90ZTsKKwlzbWFsbGludCBvbGRzdHlsZTsKKwlzbWFsbGludCBwcmV2c3ludGF4OyAvKiBzeW50YXggYmVmb3JlIGFyaXRobWV0aWMgKi8KKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJc21hbGxpbnQgcHNzeW50YXg7ICAgLyogd2UgYXJlIGV4cGFuZGluZyBhIHByb21wdCBzdHJpbmcgKi8KKyNlbmRpZgorCWludCB2YXJuZXN0OyAgICAgICAgIC8qIGxldmVscyBvZiB2YXJpYWJsZXMgZXhwYW5zaW9uICovCisJaW50IGFyaW5lc3Q7ICAgICAgICAgLyogbGV2ZWxzIG9mIGFyaXRobWV0aWMgZXhwYW5zaW9uICovCisJaW50IHBhcmVubGV2ZWw7ICAgICAgLyogbGV2ZWxzIG9mIHBhcmVucyBpbiBhcml0aG1ldGljICovCisJaW50IGRxdmFybmVzdDsgICAgICAgLyogbGV2ZWxzIG9mIHZhcmlhYmxlcyBleHBhbnNpb24gd2l0aGluIGRvdWJsZSBxdW90ZXMgKi8KKworCUlGX0FTSF9CQVNIX0NPTVBBVChzbWFsbGludCBiYXNoX2RvbGxhcl9zcXVvdGUgPSAwOykKKworI2lmIF9fR05VQ19fCisJLyogQXZvaWQgbG9uZ2ptcCBjbG9iYmVyaW5nICovCisJKHZvaWQpICZvdXQ7CisJKHZvaWQpICZxdW90ZWY7CisJKHZvaWQpICZkYmxxdW90ZTsKKwkodm9pZCkgJnZhcm5lc3Q7CisJKHZvaWQpICZhcmluZXN0OworCSh2b2lkKSAmcGFyZW5sZXZlbDsKKwkodm9pZCkgJmRxdmFybmVzdDsKKwkodm9pZCkgJm9sZHN0eWxlOworCSh2b2lkKSAmcHJldnN5bnRheDsKKwkodm9pZCkgJnN5bnRheDsKKyNlbmRpZgorCXN0YXJ0bGlubm8gPSBnX3BhcnNlZmlsZS0+bGlubm87CisJYnFsaXN0ID0gTlVMTDsKKwlxdW90ZWYgPSAwOworCXByZXZzeW50YXggPSAwOworI2lmIEVOQUJMRV9BU0hfRVhQQU5EX1BSTVQKKwlwc3N5bnRheCA9IChzeW50YXggPT0gUFNTWU5UQVgpOworCWlmIChwc3N5bnRheCkKKwkJc3ludGF4ID0gRFFTWU5UQVg7CisjZW5kaWYKKwlkYmxxdW90ZSA9IChzeW50YXggPT0gRFFTWU5UQVgpOworCXZhcm5lc3QgPSAwOworCWFyaW5lc3QgPSAwOworCXBhcmVubGV2ZWwgPSAwOworCWRxdmFybmVzdCA9IDA7CisKKwlTVEFSVFNUQUNLU1RSKG91dCk7CisgbG9vcDoKKwkvKiBGb3IgZWFjaCBsaW5lLCB1bnRpbCBlbmQgb2Ygd29yZCAqLworCUNIRUNLRU5EKCk7ICAgICAvKiBzZXQgYyB0byBQRU9GIGlmIGF0IGVuZCBvZiBoZXJlIGRvY3VtZW50ICovCisJZm9yICg7OykgeyAgICAgIC8qIHVudGlsIGVuZCBvZiBsaW5lIG9yIGVuZCBvZiB3b3JkICovCisJCUNIRUNLU1RSU1BBQ0UoNCwgb3V0KTsgIC8qIHBlcm1pdCA0IGNhbGxzIHRvIFVTVFBVVEMgKi8KKwkJc3dpdGNoIChTSVQoYywgc3ludGF4KSkgeworCQljYXNlIENOTDogICAgICAgLyogJ1xuJyAqLworCQkJaWYgKHN5bnRheCA9PSBCQVNFU1lOVEFYKQorCQkJCWdvdG8gZW5kd29yZDsgICAvKiBleGl0IG91dGVyIGxvb3AgKi8KKwkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCWdfcGFyc2VmaWxlLT5saW5ubysrOworCQkJc2V0cHJvbXB0X2lmKGRvcHJvbXB0LCAyKTsKKwkJCWMgPSBwZ2V0YygpOworCQkJZ290byBsb29wOyAgICAgICAgICAgICAgLyogY29udGludWUgb3V0ZXIgbG9vcCAqLworCQljYXNlIENXT1JEOgorCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgQ0NUTDoKKwkJCWlmIChlb2ZtYXJrID09IE5VTEwgfHwgZGJscXVvdGUpCisJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJaWYgKGMgPT0gJ1xcJyAmJiBiYXNoX2RvbGxhcl9zcXVvdGUpIHsKKwkJCQljID0gZGVjb2RlX2RvbGxhcl9zcXVvdGUoKTsKKwkJCQlpZiAoYyAmIDB4MTAwKSB7CisJCQkJCVVTVFBVVEMoJ1xcJywgb3V0KTsKKwkJCQkJYyA9ICh1bnNpZ25lZCBjaGFyKWM7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBDQkFDSzogICAgIC8qIGJhY2tzbGFzaCAqLworCQkJYyA9IHBnZXRjX3dpdGhvdXRfUEVPQSgpOworCQkJaWYgKGMgPT0gUEVPRikgeworCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCVVTVFBVVEMoJ1xcJywgb3V0KTsKKwkJCQlwdW5nZXRjKCk7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworCQkJCXNldHByb21wdF9pZihkb3Byb21wdCwgMik7CisJCQl9IGVsc2UgeworI2lmIEVOQUJMRV9BU0hfRVhQQU5EX1BSTVQKKwkJCQlpZiAoYyA9PSAnJCcgJiYgcHNzeW50YXgpIHsKKwkJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisJCQkJCVVTVFBVVEMoJ1xcJywgb3V0KTsKKwkJCQl9CisjZW5kaWYKKwkJCQkvKiBCYWNrc2xhc2ggaXMgcmV0YWluZWQgaWYgd2UgYXJlIGluICJzdHIiIGFuZCBuZXh0IGNoYXIgaXNuJ3Qgc3BlY2lhbCAqLworCQkJCWlmIChkYmxxdW90ZQorCQkJCSAmJiBjICE9ICdcXCcKKwkJCQkgJiYgYyAhPSAnYCcKKwkJCQkgJiYgYyAhPSAnJCcKKwkJCQkgJiYgKGMgIT0gJyInIHx8IGVvZm1hcmsgIT0gTlVMTCkKKwkJCQkpIHsKKwkJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisJCQkJCVVTVFBVVEMoJ1xcJywgb3V0KTsKKwkJCQl9CisJCQkJaWYgKFNJVChjLCBTUVNZTlRBWCkgPT0gQ0NUTCkKKwkJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCXF1b3RlZiA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDU1FVT1RFOgorCQkJc3ludGF4ID0gU1FTWU5UQVg7CisgcXVvdGVtYXJrOgorCQkJaWYgKGVvZm1hcmsgPT0gTlVMTCkgeworCQkJCVVTVFBVVEMoQ1RMUVVPVEVNQVJLLCBvdXQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ0RRVU9URToKKwkJCXN5bnRheCA9IERRU1lOVEFYOworCQkJZGJscXVvdGUgPSAxOworCQkJZ290byBxdW90ZW1hcms7CisJCWNhc2UgQ0VORFFVT1RFOgorCQkJSUZfQVNIX0JBU0hfQ09NUEFUKGJhc2hfZG9sbGFyX3NxdW90ZSA9IDA7KQorCQkJaWYgKGVvZm1hcmsgIT0gTlVMTCAmJiBhcmluZXN0ID09IDAKKwkJCSAmJiB2YXJuZXN0ID09IDAKKwkJCSkgeworCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRxdmFybmVzdCA9PSAwKSB7CisJCQkJCXN5bnRheCA9IEJBU0VTWU5UQVg7CisJCQkJCWRibHF1b3RlID0gMDsKKwkJCQl9CisJCQkJcXVvdGVmID0gMTsKKwkJCQlnb3RvIHF1b3RlbWFyazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENWQVI6ICAgICAgLyogJyQnICovCisJCQlQQVJTRVNVQigpOyAgICAgICAgICAgICAvKiBwYXJzZSBzdWJzdGl0dXRpb24gKi8KKwkJCWJyZWFrOworCQljYXNlIENFTkRWQVI6ICAgLyogJ30nICovCisJCQlpZiAodmFybmVzdCA+IDApIHsKKwkJCQl2YXJuZXN0LS07CisJCQkJaWYgKGRxdmFybmVzdCA+IDApIHsKKwkJCQkJZHF2YXJuZXN0LS07CisJCQkJfQorCQkJCWMgPSBDVExFTkRWQVI7CisJCQl9CisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQlicmVhazsKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCWNhc2UgQ0xQOiAgICAgICAvKiAnKCcgaW4gYXJpdGhtZXRpYyAqLworCQkJcGFyZW5sZXZlbCsrOworCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgQ1JQOiAgICAgICAvKiAnKScgaW4gYXJpdGhtZXRpYyAqLworCQkJaWYgKHBhcmVubGV2ZWwgPiAwKSB7CisJCQkJcGFyZW5sZXZlbC0tOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGdldGMoKSA9PSAnKScpIHsKKwkJCQkJaWYgKC0tYXJpbmVzdCA9PSAwKSB7CisJCQkJCQlzeW50YXggPSBwcmV2c3ludGF4OworCQkJCQkJZGJscXVvdGUgPSAoc3ludGF4ID09IERRU1lOVEFYKTsKKwkJCQkJCWMgPSBDVExFTkRBUkk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiB1bmJhbGFuY2VkIHBhcmVucworCQkJCQkgKiAoZG9uJ3QgMm5kIGd1ZXNzIC0gbm8gZXJyb3IpCisJCQkJCSAqLworCQkJCQlwdW5nZXRjKCk7CisJCQkJfQorCQkJfQorCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBDQlFVT1RFOiAgIC8qICdgJyAqLworCQkJUEFSU0VCQUNLUU9MRCgpOworCQkJYnJlYWs7CisJCWNhc2UgQ0VOREZJTEU6CisJCQlnb3RvIGVuZHdvcmQ7ICAgICAgICAgICAvKiBleGl0IG91dGVyIGxvb3AgKi8KKwkJY2FzZSBDSUdOOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodmFybmVzdCA9PSAwKSB7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJCWlmIChjID09ICcmJykgeworCQkJCQlpZiAocGdldGMoKSA9PSAnPicpCisJCQkJCQljID0gMHgxMDAgKyAnPic7IC8qIGZsYWcgJj4gKi8KKwkJCQkJcHVuZ2V0YygpOworCQkJCX0KKyNlbmRpZgorCQkJCWdvdG8gZW5kd29yZDsgICAvKiBleGl0IG91dGVyIGxvb3AgKi8KKwkJCX0KKwkJCUlGX0FTSF9BTElBUyhpZiAoYyAhPSBQRU9BKSkKKwkJCQlVU1RQVVRDKGMsIG91dCk7CisJCX0KKwkJYyA9IHBnZXRjX2Zhc3QoKTsKKwl9IC8qIGZvciAoOzspICovCisgZW5kd29yZDoKKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwlpZiAoc3ludGF4ID09IEFSSVNZTlRBWCkKKwkJcmFpc2VfZXJyb3Jfc3ludGF4KCJtaXNzaW5nICcpKSciKTsKKyNlbmRpZgorCWlmIChzeW50YXggIT0gQkFTRVNZTlRBWCAmJiAhcGFyc2ViYWNrcXVvdGUgJiYgZW9mbWFyayA9PSBOVUxMKQorCQlyYWlzZV9lcnJvcl9zeW50YXgoInVudGVybWluYXRlZCBxdW90ZWQgc3RyaW5nIik7CisJaWYgKHZhcm5lc3QgIT0gMCkgeworCQlzdGFydGxpbm5vID0gZ19wYXJzZWZpbGUtPmxpbm5vOworCQkvKiB7ICovCisJCXJhaXNlX2Vycm9yX3N5bnRheCgibWlzc2luZyAnfSciKTsKKwl9CisJVVNUUFVUQygnXDAnLCBvdXQpOworCWxlbiA9IG91dCAtIChjaGFyICopc3RhY2tibG9jaygpOworCW91dCA9IHN0YWNrYmxvY2soKTsKKwlpZiAoZW9mbWFyayA9PSBOVUxMKSB7CisJCWlmICgoYyA9PSAnPicgfHwgYyA9PSAnPCcgSUZfQVNIX0JBU0hfQ09NUEFUKCB8fCBjID09IDB4MTAwICsgJz4nKSkKKwkJICYmIHF1b3RlZiA9PSAwCisJCSkgeworCQkJaWYgKGlzZGlnaXRfc3RyOShvdXQpKSB7CisJCQkJUEFSU0VSRURJUigpOyAvKiBwYXNzZWQgYXMgcGFyYW1zOiBvdXQsIGMgKi8KKwkJCQlsYXN0dG9rZW4gPSBUUkVESVI7CisJCQkJcmV0dXJuIGxhc3R0b2tlbjsKKwkJCX0KKwkJCS8qIGVsc2U6IG5vbi1udW1iZXIgWCBzZWVuLCBpbnRlcnByZXQgaXQKKwkJCSAqIGFzICJOTk5YPmZpbGUiID0gIk5OTlggPmZpbGUiICovCisJCX0KKwkJcHVuZ2V0YygpOworCX0KKwlxdW90ZWZsYWcgPSBxdW90ZWY7CisJYmFja3F1b3RlbGlzdCA9IGJxbGlzdDsKKwlncmFic3RhY2tibG9jayhsZW4pOworCXdvcmR0ZXh0ID0gb3V0OworCWxhc3R0b2tlbiA9IFRXT1JEOworCXJldHVybiBsYXN0dG9rZW47CisvKiBlbmQgb2YgcmVhZHRva2VuIHJvdXRpbmUgKi8KKworLyoKKyAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBoZXJlIGRvY3VtZW50LiAgV2hlbiB0aGlzCisgKiBpcyBjYWxsZWQsIGMgaXMgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgaW5wdXQgbGluZS4gIElmCisgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaGVyZSBkb2N1bWVudCwgdGhpcyByb3V0aW5lIHNldHMgdGhlIGMgdG8gUEVPRi4KKyAqLworY2hlY2tlbmQ6IHsKKwlpZiAoZW9mbWFyaykgeworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwkJaWYgKGMgPT0gUEVPQSkKKwkJCWMgPSBwZ2V0Y193aXRob3V0X1BFT0EoKTsKKyNlbmRpZgorCQlpZiAoc3RyaXB0YWJzKSB7CisJCQl3aGlsZSAoYyA9PSAnXHQnKSB7CisJCQkJYyA9IHBnZXRjX3dpdGhvdXRfUEVPQSgpOworCQkJfQorCQl9CisJCWlmIChjID09ICplb2ZtYXJrKSB7CisJCQlpZiAocGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSkgIT0gTlVMTCkgeworCQkJCWNoYXIgKnAsICpxOworCisJCQkJcCA9IGxpbmU7CisJCQkJZm9yIChxID0gZW9mbWFyayArIDE7ICpxICYmICpwID09ICpxOyBwKyssIHErKykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCpwID09ICdcbicgJiYgKnEgPT0gJ1wwJykgeworCQkJCQljID0gUEVPRjsKKwkJCQkJZ19wYXJzZWZpbGUtPmxpbm5vKys7CisJCQkJCW5lZWRwcm9tcHQgPSBkb3Byb21wdDsKKwkJCQl9IGVsc2UgeworCQkJCQlwdXNoc3RyaW5nKGxpbmUsIE5VTEwpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlnb3RvIGNoZWNrZW5kX3JldHVybjsKK30KKworLyoKKyAqIFBhcnNlIGEgcmVkaXJlY3Rpb24gb3BlcmF0b3IuICBUaGUgdmFyaWFibGUgIm91dCIgcG9pbnRzIHRvIGEgc3RyaW5nCisgKiBzcGVjaWZ5aW5nIHRoZSBmZCB0byBiZSByZWRpcmVjdGVkLiAgVGhlIHZhcmlhYmxlICJjIiBjb250YWlucyB0aGUKKyAqIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcmVkaXJlY3Rpb24gb3BlcmF0b3IuCisgKi8KK3BhcnNlcmVkaXI6IHsKKwkvKiBvdXQgaXMgYWxyZWFkeSBjaGVja2VkIHRvIGJlIGEgdmFsaWQgbnVtYmVyIG9yICIiICovCisJaW50IGZkID0gKCpvdXQgPT0gJ1wwJyA/IC0xIDogYXRvaShvdXQpKTsKKwl1bmlvbiBub2RlICpucDsKKworCW5wID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZmlsZSkpOworCWlmIChjID09ICc+JykgeworCQlucC0+bmZpbGUuZmQgPSAxOworCQljID0gcGdldGMoKTsKKwkJaWYgKGMgPT0gJz4nKQorCQkJbnAtPnR5cGUgPSBOQVBQRU5EOworCQllbHNlIGlmIChjID09ICd8JykKKwkJCW5wLT50eXBlID0gTkNMT0JCRVI7CisJCWVsc2UgaWYgKGMgPT0gJyYnKQorCQkJbnAtPnR5cGUgPSBOVE9GRDsKKwkJCS8qIGl0IGFsc28gY2FuIGJlIE5UTzIgKD4mZmlsZSksIGJ1dCB3ZSBjYW4ndCBmaWd1cmUgaXQgb3V0IHlldCAqLworCQllbHNlIHsKKwkJCW5wLT50eXBlID0gTlRPOworCQkJcHVuZ2V0YygpOworCQl9CisJfQorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwllbHNlIGlmIChjID09IDB4MTAwICsgJz4nKSB7IC8qIHRoaXMgZmxhZ3MgJj4gcmVkaXJlY3Rpb24gKi8KKwkJbnAtPm5maWxlLmZkID0gMTsKKwkJcGdldGMoKTsgLyogdGhpcyBpcyAnPicsIG5vIG5lZWQgdG8gY2hlY2sgKi8KKwkJbnAtPnR5cGUgPSBOVE8yOworCX0KKyNlbmRpZgorCWVsc2UgeyAvKiBjID09ICc8JyAqLworCQkvKm5wLT5uZmlsZS5mZCA9IDA7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCWMgPSBwZ2V0YygpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnPCc6CisJCQlpZiAoc2l6ZW9mKHN0cnVjdCBuZmlsZSkgIT0gc2l6ZW9mKHN0cnVjdCBuaGVyZSkpIHsKKwkJCQlucCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmhlcmUpKTsKKwkJCQkvKm5wLT5uZmlsZS5mZCA9IDA7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQl9CisJCQlucC0+dHlwZSA9IE5IRVJFOworCQkJaGVyZWRvYyA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgaGVyZWRvYykpOworCQkJaGVyZWRvYy0+aGVyZSA9IG5wOworCQkJYyA9IHBnZXRjKCk7CisJCQlpZiAoYyA9PSAnLScpIHsKKwkJCQloZXJlZG9jLT5zdHJpcHRhYnMgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKmhlcmVkb2MtPnN0cmlwdGFicyA9IDA7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQkJcHVuZ2V0YygpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnJic6CisJCQlucC0+dHlwZSA9IE5GUk9NRkQ7CisJCQlicmVhazsKKworCQljYXNlICc+JzoKKwkJCW5wLT50eXBlID0gTkZST01UTzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlucC0+dHlwZSA9IE5GUk9NOworCQkJcHVuZ2V0YygpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZkID49IDApCisJCW5wLT5uZmlsZS5mZCA9IGZkOworCXJlZGlybm9kZSA9IG5wOworCWdvdG8gcGFyc2VyZWRpcl9yZXR1cm47Cit9CisKKy8qCisgKiBQYXJzZSBhIHN1YnN0aXR1dGlvbi4gIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgcmVhZCB0aGUgZG9sbGFyIHNpZ24KKyAqIGFuZCBub3RoaW5nIGVsc2UuCisgKi8KKworLyogaXNfc3BlY2lhbChjKSBldmFsdWF0ZXMgdG8gMSBmb3IgYyBpbiAiISMkKi0wMTIzNDU2Nzg5P0AiOyAwIG90aGVyd2lzZQorICogKGFzc3VtaW5nIGFzY2lpIGNoYXIgY29kZXMsIGFzIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkaWQpICovCisjZGVmaW5lIGlzX3NwZWNpYWwoYykgXAorCSgoKHVuc2lnbmVkKShjKSAtIDMzIDwgMzIpIFwKKwkJCSYmICgoMHhjMWZmOTIwZFUgPj4gKCh1bnNpZ25lZCkoYykgLSAzMykpICYgMSkpCitwYXJzZXN1YjogeworCXVuc2lnbmVkIGNoYXIgc3VidHlwZTsKKwlpbnQgdHlwZWxvYzsKKwlpbnQgZmxhZ3M7CisKKwljID0gcGdldGMoKTsKKwlpZiAoYyA+IDI1NSAvKiBQRU9BIG9yIFBFT0YgKi8KKwkgfHwgKGMgIT0gJygnICYmIGMgIT0gJ3snICYmICFpc19uYW1lKGMpICYmICFpc19zcGVjaWFsKGMpKQorCSkgeworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJaWYgKGMgPT0gJ1wnJykKKwkJCWJhc2hfZG9sbGFyX3NxdW90ZSA9IDE7CisJCWVsc2UKKyNlbmRpZgorCQkJVVNUUFVUQygnJCcsIG91dCk7CisJCXB1bmdldGMoKTsKKwl9IGVsc2UgaWYgKGMgPT0gJygnKSB7CisJCS8qICQoY29tbWFuZCkgb3IgJCgoYXJpdGgpKSAqLworCQlpZiAocGdldGMoKSA9PSAnKCcpIHsKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCQlQQVJTRUFSSVRIKCk7CisjZWxzZQorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJ5b3UgZGlzYWJsZWQgbWF0aCBzdXBwb3J0IGZvciAkKChhcml0aCkpIHN5bnRheCIpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlwdW5nZXRjKCk7CisJCQlQQVJTRUJBQ0tRTkVXKCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiAkVkFSLCAkPHNwZWNpYWxjaGFyPiwgJHsuLi59LCBvciBQRU9BL1BFT0YgKi8KKwkJVVNUUFVUQyhDVExWQVIsIG91dCk7CisJCXR5cGVsb2MgPSBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwkJVVNUUFVUQyhWU05PUk1BTCwgb3V0KTsKKwkJc3VidHlwZSA9IFZTTk9STUFMOworCQlpZiAoYyA9PSAneycpIHsKKwkJCWMgPSBwZ2V0YygpOworCQkJaWYgKGMgPT0gJyMnKSB7CisJCQkJYyA9IHBnZXRjKCk7CisJCQkJaWYgKGMgPT0gJ30nKQorCQkJCQljID0gJyMnOyAvKiAkeyN9IC0gc2FtZSBhcyAkIyAqLworCQkJCWVsc2UKKwkJCQkJc3VidHlwZSA9IFZTTEVOR1RIOyAvKiAkeyNWQVJ9ICovCisJCQl9IGVsc2UgeworCQkJCXN1YnR5cGUgPSAwOworCQkJfQorCQl9CisJCWlmIChjIDw9IDI1NSAvKiBub3QgUEVPQSBvciBQRU9GICovICYmIGlzX25hbWUoYykpIHsKKwkJCS8qICRbe1sjXV1OQU1FW31dICovCisJCQlkbyB7CisJCQkJU1RQVVRDKGMsIG91dCk7CisJCQkJYyA9IHBnZXRjKCk7CisJCQl9IHdoaWxlIChjIDw9IDI1NSAvKiBub3QgUEVPQSBvciBQRU9GICovICYmIGlzX2luX25hbWUoYykpOworCQl9IGVsc2UgaWYgKGlzZGlnaXQoYykpIHsKKwkJCS8qICRbe1sjXV1OVU1bfV0gKi8KKwkJCWRvIHsKKwkJCQlTVFBVVEMoYywgb3V0KTsKKwkJCQljID0gcGdldGMoKTsKKwkJCX0gd2hpbGUgKGlzZGlnaXQoYykpOworCQl9IGVsc2UgaWYgKGlzX3NwZWNpYWwoYykpIHsKKwkJCS8qICRbe1sjXV08c3BlY2lhbGNoYXI+W31dICovCisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQljID0gcGdldGMoKTsKKwkJfSBlbHNlIHsKKyBiYWRzdWI6CisJCQlyYWlzZV9lcnJvcl9zeW50YXgoImJhZCBzdWJzdGl0dXRpb24iKTsKKwkJfQorCQlpZiAoYyAhPSAnfScgJiYgc3VidHlwZSA9PSBWU0xFTkdUSCkgeworCQkJLyogJHsjVkFSIGRpZG4ndCBlbmQgd2l0aCB9ICovCisJCQlnb3RvIGJhZHN1YjsKKwkJfQorCisJCVNUUFVUQygnPScsIG91dCk7CisJCWZsYWdzID0gMDsKKwkJaWYgKHN1YnR5cGUgPT0gMCkgeworCQkJLyogJHtWQVIuLi59IGJ1dCBub3QgJFZBUiBvciAkeyNWQVJ9ICovCisJCQkvKiBjID09IGZpcnN0IGNoYXIgYWZ0ZXIgVkFSICovCisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJzonOgorCQkJCWMgPSBwZ2V0YygpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCQlpZiAoYyA9PSAnOicgfHwgYyA9PSAnJCcgfHwgaXNkaWdpdChjKSkgeworLy9UT0RPOiBzdXBwb3J0IG1vcmUgZ2VuZXJhbCBmb3JtYXQgJHt2OkVYUFI6RVhQUn0sCisvLyB3aGVyZSBFWFBSIGZvbGxvd3MgJCgoKSkgcnVsZXMKKwkJCQkJc3VidHlwZSA9IFZTU1VCU1RSOworCQkJCQlwdW5nZXRjKCk7CisJCQkJCWJyZWFrOyAvKiAiZ290byBkb19wdW5nZXRjIiBpcyBiaWdnZXIgKCEpICovCisJCQkJfQorI2VuZGlmCisJCQkJZmxhZ3MgPSBWU05VTDsKKwkJCQkvKkZBTExUSFJPVUdIKi8KKwkJCWRlZmF1bHQ6IHsKKwkJCQlzdGF0aWMgY29uc3QgY2hhciB0eXBlc1tdIEFMSUdOMSA9ICJ9LSs/PSI7CisJCQkJY29uc3QgY2hhciAqcCA9IHN0cmNocih0eXBlcywgYyk7CisJCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQkJZ290byBiYWRzdWI7CisJCQkJc3VidHlwZSA9IHAgLSB0eXBlcyArIFZTTk9STUFMOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAnJSc6CisJCQljYXNlICcjJzogeworCQkJCWludCBjYyA9IGM7CisJCQkJc3VidHlwZSA9IChjID09ICcjJyA/IFZTVFJJTUxFRlQgOiBWU1RSSU1SSUdIVCk7CisJCQkJYyA9IHBnZXRjKCk7CisJCQkJaWYgKGMgIT0gY2MpCisJCQkJCWdvdG8gZG9fcHVuZ2V0YzsKKwkJCQlzdWJ0eXBlKys7CisJCQkJYnJlYWs7CisJCQl9CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJY2FzZSAnLyc6CisJCQkJLyogJHt2L1svXXBhdHRlcm4vcmVwbH0gKi8KKy8vVE9ETzogZW5jb2RlIHBhdHRlcm4gYW5kIHJlcGwgc2VwYXJhdGVseS4KKy8vIEN1cnJlbnRseSAke3YvJHZhcl93aXRoX3NsYXNoL3JlcGx9IGlzIGhvcnJpYmx5IGJyb2tlbgorCQkJCXN1YnR5cGUgPSBWU1JFUExBQ0U7CisJCQkJYyA9IHBnZXRjKCk7CisJCQkJaWYgKGMgIT0gJy8nKQorCQkJCQlnb3RvIGRvX3B1bmdldGM7CisJCQkJc3VidHlwZSsrOyAvKiBWU1JFUExBQ0VBTEwgKi8KKwkJCQlicmVhazsKKyNlbmRpZgorCQkJfQorCQl9IGVsc2UgeworIGRvX3B1bmdldGM6CisJCQlwdW5nZXRjKCk7CisJCX0KKwkJaWYgKGRibHF1b3RlIHx8IGFyaW5lc3QpCisJCQlmbGFncyB8PSBWU1FVT1RFOworCQkoKHVuc2lnbmVkIGNoYXIgKilzdGFja2Jsb2NrKCkpW3R5cGVsb2NdID0gc3VidHlwZSB8IGZsYWdzOworCQlpZiAoc3VidHlwZSAhPSBWU05PUk1BTCkgeworCQkJdmFybmVzdCsrOworCQkJaWYgKGRibHF1b3RlIHx8IGFyaW5lc3QpIHsKKwkJCQlkcXZhcm5lc3QrKzsKKwkJCX0KKwkJfQorCX0KKwlnb3RvIHBhcnNlc3ViX3JldHVybjsKK30KKworLyoKKyAqIENhbGxlZCB0byBwYXJzZSBjb21tYW5kIHN1YnN0aXR1dGlvbnMuICBOZXdzdHlsZSBpcyBzZXQgaWYgdGhlIGNvbW1hbmQKKyAqIGlzIGVuY2xvc2VkIGluc2lkZSAkKC4uLik7IG5scHAgaXMgYSBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSBsaW5rZWQKKyAqIGxpc3Qgb2YgY29tbWFuZHMgKHBhc3NlZCBieSByZWZlcmVuY2UpLCBhbmQgc2F2ZWxlbiBpcyB0aGUgbnVtYmVyIG9mCisgKiBjaGFyYWN0ZXJzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdoaWNoIG11c3QgYmUgcHJlc2VydmVkLgorICovCitwYXJzZWJhY2txOiB7CisJc3RydWN0IG5vZGVsaXN0ICoqbmxwcDsKKwlzbWFsbGludCBzYXZlcGJxOworCXVuaW9uIG5vZGUgKm47CisJY2hhciAqdm9sYXRpbGUgc3RyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXNpemVfdCBzYXZlbGVuOworCXNtYWxsaW50IHNhdmVwcm9tcHQgPSAwOworCisjaWZkZWYgX19HTlVDX18KKwkodm9pZCkgJnNhdmVwcm9tcHQ7CisjZW5kaWYKKwlzYXZlcGJxID0gcGFyc2ViYWNrcXVvdGU7CisJaWYgKHNldGptcChqbXBsb2MubG9jKSkgeworCQlmcmVlKHN0cik7CisJCXBhcnNlYmFja3F1b3RlID0gMDsKKwkJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwkJbG9uZ2ptcChleGNlcHRpb25faGFuZGxlci0+bG9jLCAxKTsKKwl9CisJSU5UX09GRjsKKwlzdHIgPSBOVUxMOworCXNhdmVsZW4gPSBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlpZiAoc2F2ZWxlbiA+IDApIHsKKwkJc3RyID0gY2ttYWxsb2Moc2F2ZWxlbik7CisJCW1lbWNweShzdHIsIHN0YWNrYmxvY2soKSwgc2F2ZWxlbik7CisJfQorCXNhdmVoYW5kbGVyID0gZXhjZXB0aW9uX2hhbmRsZXI7CisJZXhjZXB0aW9uX2hhbmRsZXIgPSAmam1wbG9jOworCUlOVF9PTjsKKwlpZiAob2xkc3R5bGUpIHsKKwkJLyogV2UgbXVzdCByZWFkIHVudGlsIHRoZSBjbG9zaW5nIGJhY2txdW90ZSwgZ2l2aW5nIHNwZWNpYWwKKwkJICAgdHJlYXRtZW50IHRvIHNvbWUgc2xhc2hlcywgYW5kIHRoZW4gcHVzaCB0aGUgc3RyaW5nIGFuZAorCQkgICByZXJlYWQgaXQgYXMgaW5wdXQsIGludGVycHJldGluZyBpdCBub3JtYWxseS4gICovCisJCWNoYXIgKnBvdXQ7CisJCXNpemVfdCBwc2F2ZWxlbjsKKwkJY2hhciAqcHN0cjsKKworCQlTVEFSVFNUQUNLU1RSKHBvdXQpOworCQlmb3IgKDs7KSB7CisJCQlpbnQgcGM7CisKKwkJCXNldHByb21wdF9pZihuZWVkcHJvbXB0LCAyKTsKKwkJCXBjID0gcGdldGMoKTsKKwkJCXN3aXRjaCAocGMpIHsKKwkJCWNhc2UgJ2AnOgorCQkJCWdvdG8gZG9uZTsKKworCQkJY2FzZSAnXFwnOgorCQkJCXBjID0gcGdldGMoKTsKKwkJCQlpZiAocGMgPT0gJ1xuJykgeworCQkJCQlnX3BhcnNlZmlsZS0+bGlubm8rKzsKKwkJCQkJc2V0cHJvbXB0X2lmKGRvcHJvbXB0LCAyKTsKKwkJCQkJLyoKKwkJCQkJICogSWYgZWF0aW5nIGEgbmV3bGluZSwgYXZvaWQgcHV0dGluZworCQkJCQkgKiB0aGUgbmV3bGluZSBpbnRvIHRoZSBuZXcgY2hhcmFjdGVyCisJCQkJCSAqIHN0cmVhbSAodmlhIHRoZSBTVFBVVEMgYWZ0ZXIgdGhlCisJCQkJCSAqIHN3aXRjaCkuCisJCQkJCSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHBjICE9ICdcXCcgJiYgcGMgIT0gJ2AnICYmIHBjICE9ICckJworCQkJCSAmJiAoIWRibHF1b3RlIHx8IHBjICE9ICciJykKKwkJCQkpIHsKKwkJCQkJU1RQVVRDKCdcXCcsIHBvdXQpOworCQkJCX0KKwkJCQlpZiAocGMgPD0gMjU1IC8qIG5vdCBQRU9BIG9yIFBFT0YgKi8pIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCQljYXNlIFBFT0Y6CisJCQlJRl9BU0hfQUxJQVMoY2FzZSBQRU9BOikKKwkJCQlzdGFydGxpbm5vID0gZ19wYXJzZWZpbGUtPmxpbm5vOworCQkJCXJhaXNlX2Vycm9yX3N5bnRheCgiRU9GIGluIGJhY2txdW90ZSBzdWJzdGl0dXRpb24iKTsKKworCQkJY2FzZSAnXG4nOgorCQkJCWdfcGFyc2VmaWxlLT5saW5ubysrOworCQkJCW5lZWRwcm9tcHQgPSBkb3Byb21wdDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCVNUUFVUQyhwYywgcG91dCk7CisJCX0KKyBkb25lOgorCQlTVFBVVEMoJ1wwJywgcG91dCk7CisJCXBzYXZlbGVuID0gcG91dCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQlpZiAocHNhdmVsZW4gPiAwKSB7CisJCQlwc3RyID0gZ3JhYnN0YWNrc3RyKHBvdXQpOworCQkJc2V0aW5wdXRzdHJpbmcocHN0cik7CisJCX0KKwl9CisJbmxwcCA9ICZicWxpc3Q7CisJd2hpbGUgKCpubHBwKQorCQlubHBwID0gJigqbmxwcCktPm5leHQ7CisJKm5scHAgPSBzdHphbGxvYyhzaXplb2YoKipubHBwKSk7CisJLyogKCpubHBwKS0+bmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJcGFyc2ViYWNrcXVvdGUgPSBvbGRzdHlsZTsKKworCWlmIChvbGRzdHlsZSkgeworCQlzYXZlcHJvbXB0ID0gZG9wcm9tcHQ7CisJCWRvcHJvbXB0ID0gMDsKKwl9CisKKwluID0gbGlzdCgyKTsKKworCWlmIChvbGRzdHlsZSkKKwkJZG9wcm9tcHQgPSBzYXZlcHJvbXB0OworCWVsc2UgaWYgKHJlYWR0b2tlbigpICE9IFRSUCkKKwkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFJQKTsKKworCSgqbmxwcCktPm4gPSBuOworCWlmIChvbGRzdHlsZSkgeworCQkvKgorCQkgKiBTdGFydCByZWFkaW5nIGZyb20gb2xkIGZpbGUgYWdhaW4sIGlnbm9yaW5nIGFueSBwdXNoZWQgYmFjaworCQkgKiB0b2tlbnMgbGVmdCBmcm9tIHRoZSBiYWNrcXVvdGUgcGFyc2luZworCQkgKi8KKwkJcG9wZmlsZSgpOworCQl0b2twdXNoYmFjayA9IDA7CisJfQorCXdoaWxlIChzdGFja2Jsb2Nrc2l6ZSgpIDw9IHNhdmVsZW4pCisJCWdyb3dzdGFja2Jsb2NrKCk7CisJU1RBUlRTVEFDS1NUUihvdXQpOworCWlmIChzdHIpIHsKKwkJbWVtY3B5KG91dCwgc3RyLCBzYXZlbGVuKTsKKwkJU1RBREpVU1Qoc2F2ZWxlbiwgb3V0KTsKKwkJSU5UX09GRjsKKwkJZnJlZShzdHIpOworCQlzdHIgPSBOVUxMOworCQlJTlRfT047CisJfQorCXBhcnNlYmFja3F1b3RlID0gc2F2ZXBicTsKKwlleGNlcHRpb25faGFuZGxlciA9IHNhdmVoYW5kbGVyOworCWlmIChhcmluZXN0IHx8IGRibHF1b3RlKQorCQlVU1RQVVRDKENUTEJBQ0tRIHwgQ1RMUVVPVEUsIG91dCk7CisJZWxzZQorCQlVU1RQVVRDKENUTEJBQ0tRLCBvdXQpOworCWlmIChvbGRzdHlsZSkKKwkJZ290byBwYXJzZWJhY2txX29sZHJldHVybjsKKwlnb3RvIHBhcnNlYmFja3FfbmV3cmV0dXJuOworfQorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorLyoKKyAqIFBhcnNlIGFuIGFyaXRobWV0aWMgZXhwYW5zaW9uIChpbmRpY2F0ZSBzdGFydCBvZiBvbmUgYW5kIHNldCBzdGF0ZSkKKyAqLworcGFyc2Vhcml0aDogeworCWlmICgrK2FyaW5lc3QgPT0gMSkgeworCQlwcmV2c3ludGF4ID0gc3ludGF4OworCQlzeW50YXggPSBBUklTWU5UQVg7CisJCVVTVFBVVEMoQ1RMQVJJLCBvdXQpOworCQlpZiAoZGJscXVvdGUpCisJCQlVU1RQVVRDKCciJywgb3V0KTsKKwkJZWxzZQorCQkJVVNUUFVUQygnICcsIG91dCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogd2UgY29sbGFwc2UgZW1iZWRkZWQgYXJpdGhtZXRpYyBleHBhbnNpb24gdG8KKwkJICogcGFyZW50aGVzaXMsIHdoaWNoIHNob3VsZCBiZSBlcXVpdmFsZW50CisJCSAqLworCQlVU1RQVVRDKCcoJywgb3V0KTsKKwl9CisJZ290byBwYXJzZWFyaXRoX3JldHVybjsKK30KKyNlbmRpZgorCit9IC8qIGVuZCBvZiByZWFkdG9rZW4gKi8KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgaW5wdXQgdG9rZW4uCisgKiBJZiB0aGUgdG9rZW4gaXMgYSB3b3JkLCB3ZSBzZXQgYmFja3F1b3RlbGlzdCB0byB0aGUgbGlzdCBvZiBjbWRzIGluCisgKiAgICAgIGJhY2txdW90ZXMuICBXZSBzZXQgcXVvdGVmbGFnIHRvIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIHdvcmQgd2FzCisgKiAgICAgIHF1b3RlZC4KKyAqIElmIHRoZSB0b2tlbiBpcyBUUkVESVIsIHRoZW4gd2Ugc2V0IHJlZGlybm9kZSB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nCisgKiAgICAgIHRoZSByZWRpcmVjdGlvbi4KKyAqIEluIGFsbCBjYXNlcywgdGhlIHZhcmlhYmxlIHN0YXJ0bGlubm8gaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUKKyAqICAgICAgb24gd2hpY2ggdGhlIHRva2VuIHN0YXJ0cy4KKyAqCisgKiBbQ2hhbmdlIGNvbW1lbnQ6ICBoZXJlIGRvY3VtZW50cyBhbmQgaW50ZXJuYWwgcHJvY2VkdXJlc10KKyAqIFtSZWFkdG9rZW4gc2hvdWxkbid0IGhhdmUgYW55IGFyZ3VtZW50cy4gIFBlcmhhcHMgd2Ugc2hvdWxkIG1ha2UgdGhlCisgKiAgd29yZCBwYXJzaW5nIGNvZGUgaW50byBhIHNlcGFyYXRlIHJvdXRpbmUuICBJbiB0aGlzIGNhc2UsIHJlYWR0b2tlbgorICogIGRvZXNuJ3QgbmVlZCB0byBoYXZlIGFueSBpbnRlcm5hbCBwcm9jZWR1cmVzLCBidXQgcGFyc2V3b3JkIGRvZXMuCisgKiAgV2UgY291bGQgYWxzbyBtYWtlIHBhcnNlb3BlcmF0b3IgaW4gZXNzZW5jZSB0aGUgbWFpbiByb3V0aW5lLCBhbmQKKyAqICBoYXZlIHBhcnNld29yZCAocmVhZHRva2VuMT8pIGhhbmRsZSBib3RoIHdvcmRzIGFuZCByZWRpcmVjdGlvbi5dCisgKi8KKyNkZWZpbmUgTkVXX3h4cmVhZHRva2VuCisjaWZkZWYgTkVXX3h4cmVhZHRva2VuCisvKiBzaW5nbGVzIG11c3QgYmUgZmlyc3QhICovCitzdGF0aWMgY29uc3QgY2hhciB4eHJlYWR0b2tlbl9jaGFyc1s3XSBBTElHTjEgPSB7CisJJ1xuJywgJygnLCAnKScsIC8qIHNpbmdsZXMgKi8KKwknJicsICd8JywgJzsnLCAgLyogZG91YmxlcyAqLworCTAKK307CisKKyNkZWZpbmUgeHhyZWFkdG9rZW5fc2luZ2xlcyAzCisjZGVmaW5lIHh4cmVhZHRva2VuX2RvdWJsZXMgMworCitzdGF0aWMgY29uc3QgY2hhciB4eHJlYWR0b2tlbl90b2tlbnNbXSBBTElHTjEgPSB7CisJVE5MLCBUTFAsIFRSUCwgICAgICAgICAgLyogb25seSBzaW5nbGUgb2NjdXJyZW5jZSBhbGxvd2VkICovCisJVEJBQ0tHTkQsIFRQSVBFLCBUU0VNSSwgLyogaWYgc2luZ2xlIG9jY3VycmVuY2UgKi8KKwlURU9GLCAgICAgICAgICAgICAgICAgICAvKiBjb3JyZXNwb25kcyB0byB0cmFpbGluZyBudWwgKi8KKwlUQU5ELCBUT1IsIFRFTkRDQVNFICAgICAvKiBpZiBkb3VibGUgb2NjdXJyZW5jZSAqLworfTsKKworc3RhdGljIGludAoreHhyZWFkdG9rZW4odm9pZCkKK3sKKwlpbnQgYzsKKworCWlmICh0b2twdXNoYmFjaykgeworCQl0b2twdXNoYmFjayA9IDA7CisJCXJldHVybiBsYXN0dG9rZW47CisJfQorCXNldHByb21wdF9pZihuZWVkcHJvbXB0LCAyKTsKKwlzdGFydGxpbm5vID0gZ19wYXJzZWZpbGUtPmxpbm5vOworCWZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgLyogdW50aWwgdG9rZW4gb3Igc3RhcnQgb2Ygd29yZCBmb3VuZCAqLworCQljID0gcGdldGNfZmFzdCgpOworCQlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIElGX0FTSF9BTElBUyggfHwgYyA9PSBQRU9BKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjID09ICcjJykgeworCQkJd2hpbGUgKChjID0gcGdldGMoKSkgIT0gJ1xuJyAmJiBjICE9IFBFT0YpCisJCQkJY29udGludWU7CisJCQlwdW5nZXRjKCk7CisJCX0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisJCQlpZiAocGdldGMoKSAhPSAnXG4nKSB7CisJCQkJcHVuZ2V0YygpOworCQkJCWJyZWFrOyAvKiByZXR1cm4gcmVhZHRva2VuMSguLi4pICovCisJCQl9CisJCQlzdGFydGxpbm5vID0gKytnX3BhcnNlZmlsZS0+bGlubm87CisJCQlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIDIpOworCQl9IGVsc2UgeworCQkJY29uc3QgY2hhciAqcDsKKworCQkJcCA9IHh4cmVhZHRva2VuX2NoYXJzICsgc2l6ZW9mKHh4cmVhZHRva2VuX2NoYXJzKSAtIDE7CisJCQlpZiAoYyAhPSBQRU9GKSB7CisJCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCQlnX3BhcnNlZmlsZS0+bGlubm8rKzsKKwkJCQkJbmVlZHByb21wdCA9IGRvcHJvbXB0OworCQkJCX0KKworCQkJCXAgPSBzdHJjaHIoeHhyZWFkdG9rZW5fY2hhcnMsIGMpOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWJyZWFrOyAvKiByZXR1cm4gcmVhZHRva2VuMSguLi4pICovCisKKwkJCQlpZiAoKGludCkocCAtIHh4cmVhZHRva2VuX2NoYXJzKSA+PSB4eHJlYWR0b2tlbl9zaW5nbGVzKSB7CisJCQkJCWludCBjYyA9IHBnZXRjKCk7CisJCQkJCWlmIChjYyA9PSBjKSB7ICAgIC8qIGRvdWJsZSBvY2N1cnJlbmNlPyAqLworCQkJCQkJcCArPSB4eHJlYWR0b2tlbl9kb3VibGVzICsgMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXB1bmdldGMoKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQkJCQlpZiAoYyA9PSAnJicgJiYgY2MgPT0gJz4nKSAvKiAmPiAqLworCQkJCQkJCWJyZWFrOyAvKiByZXR1cm4gcmVhZHRva2VuMSguLi4pICovCisjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWxhc3R0b2tlbiA9IHh4cmVhZHRva2VuX3Rva2Vuc1twIC0geHhyZWFkdG9rZW5fY2hhcnNdOworCQkJcmV0dXJuIGxhc3R0b2tlbjsKKwkJfQorCX0gLyogZm9yICg7OykgKi8KKworCXJldHVybiByZWFkdG9rZW4xKGMsIEJBU0VTWU5UQVgsIChjaGFyICopIE5VTEwsIDApOworfQorI2Vsc2UgLyogb2xkIHh4cmVhZHRva2VuICovCisjZGVmaW5lIFJFVFVSTih0b2tlbikgICByZXR1cm4gbGFzdHRva2VuID0gdG9rZW4KK3N0YXRpYyBpbnQKK3h4cmVhZHRva2VuKHZvaWQpCit7CisJaW50IGM7CisKKwlpZiAodG9rcHVzaGJhY2spIHsKKwkJdG9rcHVzaGJhY2sgPSAwOworCQlyZXR1cm4gbGFzdHRva2VuOworCX0KKwlzZXRwcm9tcHRfaWYobmVlZHByb21wdCwgMik7CisJc3RhcnRsaW5ubyA9IGdfcGFyc2VmaWxlLT5saW5ubzsKKwlmb3IgKDs7KSB7ICAgICAgLyogdW50aWwgdG9rZW4gb3Igc3RhcnQgb2Ygd29yZCBmb3VuZCAqLworCQljID0gcGdldGNfZmFzdCgpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnICc6IGNhc2UgJ1x0JzoKKwkJSUZfQVNIX0FMSUFTKGNhc2UgUEVPQTopCisJCQljb250aW51ZTsKKwkJY2FzZSAnIyc6CisJCQl3aGlsZSAoKGMgPSBwZ2V0YygpKSAhPSAnXG4nICYmIGMgIT0gUEVPRikKKwkJCQljb250aW51ZTsKKwkJCXB1bmdldGMoKTsKKwkJCWNvbnRpbnVlOworCQljYXNlICdcXCc6CisJCQlpZiAocGdldGMoKSA9PSAnXG4nKSB7CisJCQkJc3RhcnRsaW5ubyA9ICsrZ19wYXJzZWZpbGUtPmxpbm5vOworCQkJCXNldHByb21wdF9pZihkb3Byb21wdCwgMik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwdW5nZXRjKCk7CisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJY2FzZSAnXG4nOgorCQkJZ19wYXJzZWZpbGUtPmxpbm5vKys7CisJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQlSRVRVUk4oVE5MKTsKKwkJY2FzZSBQRU9GOgorCQkJUkVUVVJOKFRFT0YpOworCQljYXNlICcmJzoKKwkJCWlmIChwZ2V0YygpID09ICcmJykKKwkJCQlSRVRVUk4oVEFORCk7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVEJBQ0tHTkQpOworCQljYXNlICd8JzoKKwkJCWlmIChwZ2V0YygpID09ICd8JykKKwkJCQlSRVRVUk4oVE9SKTsKKwkJCXB1bmdldGMoKTsKKwkJCVJFVFVSTihUUElQRSk7CisJCWNhc2UgJzsnOgorCQkJaWYgKHBnZXRjKCkgPT0gJzsnKQorCQkJCVJFVFVSTihURU5EQ0FTRSk7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVFNFTUkpOworCQljYXNlICcoJzoKKwkJCVJFVFVSTihUTFApOworCQljYXNlICcpJzoKKwkJCVJFVFVSTihUUlApOworCQlkZWZhdWx0OgorCQkJZ290byBicmVha2xvb3A7CisJCX0KKwl9CisgYnJlYWtsb29wOgorCXJldHVybiByZWFkdG9rZW4xKGMsIEJBU0VTWU5UQVgsIChjaGFyICopTlVMTCwgMCk7CisjdW5kZWYgUkVUVVJOCit9CisjZW5kaWYgLyogb2xkIHh4cmVhZHRva2VuICovCisKK3N0YXRpYyBpbnQKK3JlYWR0b2tlbih2b2lkKQoreworCWludCB0OworI2lmIERFQlVHCisJc21hbGxpbnQgYWxyZWFkeXNlZW4gPSB0b2twdXNoYmFjazsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9BTElBUworIHRvcDoKKyNlbmRpZgorCisJdCA9IHh4cmVhZHRva2VuKCk7CisKKwkvKgorCSAqIGVhdCBuZXdsaW5lcworCSAqLworCWlmIChjaGVja2t3ZCAmIENIS05MKSB7CisJCXdoaWxlICh0ID09IFROTCkgeworCQkJcGFyc2VoZXJlZG9jKCk7CisJCQl0ID0geHhyZWFkdG9rZW4oKTsKKwkJfQorCX0KKworCWlmICh0ICE9IFRXT1JEIHx8IHF1b3RlZmxhZykgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZvciBrZXl3b3JkcworCSAqLworCWlmIChjaGVja2t3ZCAmIENIS0tXRCkgeworCQljb25zdCBjaGFyICpjb25zdCAqcHA7CisKKwkJcHAgPSBmaW5ka3dkKHdvcmR0ZXh0KTsKKwkJaWYgKHBwKSB7CisJCQlsYXN0dG9rZW4gPSB0ID0gcHAgLSB0b2tuYW1lX2FycmF5OworCQkJVFJBQ0UoKCJrZXl3b3JkICclcycgcmVjb2duaXplZFxuIiwgdG9rbmFtZV9hcnJheVt0XSArIDEpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNoZWNra3dkICYgQ0hLQUxJQVMpIHsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJCXN0cnVjdCBhbGlhcyAqYXA7CisJCWFwID0gbG9va3VwYWxpYXMod29yZHRleHQsIDEpOworCQlpZiAoYXAgIT0gTlVMTCkgeworCQkJaWYgKCphcC0+dmFsKSB7CisJCQkJcHVzaHN0cmluZyhhcC0+dmFsLCBhcCk7CisJCQl9CisJCQlnb3RvIHRvcDsKKwkJfQorI2VuZGlmCisJfQorIG91dDoKKwljaGVja2t3ZCA9IDA7CisjaWYgREVCVUcKKwlpZiAoIWFscmVhZHlzZWVuKQorCQlUUkFDRSgoInRva2VuICclcycgJXNcbiIsIHRva25hbWVfYXJyYXlbdF0gKyAxLCB0ID09IFRXT1JEID8gd29yZHRleHQgOiAiIikpOworCWVsc2UKKwkJVFJBQ0UoKCJyZXJlYWQgdG9rZW4gJyVzJyAlc1xuIiwgdG9rbmFtZV9hcnJheVt0XSArIDEsIHQgPT0gVFdPUkQgPyB3b3JkdGV4dCA6ICIiKSk7CisjZW5kaWYKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIGNoYXIKK3BlZWt0b2tlbih2b2lkKQoreworCWludCB0OworCisJdCA9IHJlYWR0b2tlbigpOworCXRva3B1c2hiYWNrID0gMTsKKwlyZXR1cm4gdG9rbmFtZV9hcnJheVt0XVswXTsKK30KKworLyoKKyAqIFJlYWQgYW5kIHBhcnNlIGEgY29tbWFuZC4gIFJldHVybnMgTk9ERV9FT0Ygb24gZW5kIG9mIGZpbGUuCisgKiAoTlVMTCBpcyBhIHZhbGlkIHBhcnNlIHRyZWUgaW5kaWNhdGluZyBhIGJsYW5rIGxpbmUuKQorICovCitzdGF0aWMgdW5pb24gbm9kZSAqCitwYXJzZWNtZChpbnQgaW50ZXJhY3QpCit7CisJaW50IHQ7CisKKwl0b2twdXNoYmFjayA9IDA7CisJZG9wcm9tcHQgPSBpbnRlcmFjdDsKKwlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIGRvcHJvbXB0KTsKKwluZWVkcHJvbXB0ID0gMDsKKwl0ID0gcmVhZHRva2VuKCk7CisJaWYgKHQgPT0gVEVPRikKKwkJcmV0dXJuIE5PREVfRU9GOworCWlmICh0ID09IFROTCkKKwkJcmV0dXJuIE5VTEw7CisJdG9rcHVzaGJhY2sgPSAxOworCXJldHVybiBsaXN0KDEpOworfQorCisvKgorICogSW5wdXQgYW55IGhlcmUgZG9jdW1lbnRzLgorICovCitzdGF0aWMgdm9pZAorcGFyc2VoZXJlZG9jKHZvaWQpCit7CisJc3RydWN0IGhlcmVkb2MgKmhlcmU7CisJdW5pb24gbm9kZSAqbjsKKworCWhlcmUgPSBoZXJlZG9jbGlzdDsKKwloZXJlZG9jbGlzdCA9IE5VTEw7CisKKwl3aGlsZSAoaGVyZSkgeworCQlzZXRwcm9tcHRfaWYobmVlZHByb21wdCwgMik7CisJCXJlYWR0b2tlbjEocGdldGMoKSwgaGVyZS0+aGVyZS0+dHlwZSA9PSBOSEVSRSA/IFNRU1lOVEFYIDogRFFTWU5UQVgsCisJCQkJaGVyZS0+ZW9mbWFyaywgaGVyZS0+c3RyaXB0YWJzKTsKKwkJbiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmFyZykpOworCQluLT5uYXJnLnR5cGUgPSBOQVJHOworCQkvKm4tPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCW4tPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQluLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCWhlcmUtPmhlcmUtPm5oZXJlLmRvYyA9IG47CisJCWhlcmUgPSBoZXJlLT5uZXh0OworCX0KK30KKworCisvKgorICogY2FsbGVkIGJ5IGVkaXRsaW5lIC0tIGFueSBleHBhbnNpb25zIHRvIHRoZSBwcm9tcHQgc2hvdWxkIGJlIGFkZGVkIGhlcmUuCisgKi8KKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCitzdGF0aWMgY29uc3QgY2hhciAqCitleHBhbmRzdHIoY29uc3QgY2hhciAqcHMpCit7CisJdW5pb24gbm9kZSBuOworCisJLyogWFhYIEZpeCAoY2hhciAqKSBjYXN0LiBJdCBfaXNfIGEgYnVnLiBwcyBpcyB2YXJpYWJsZSdzIHZhbHVlLAorCSAqIGFuZCB0b2tlbiBwcm9jZXNzaW5nIF9jYW5fIGFsdGVyIGl0IChkZWxldGUgTlVMcyBldGMpLiAqLworCXNldGlucHV0c3RyaW5nKChjaGFyICopcHMpOworCXJlYWR0b2tlbjEocGdldGMoKSwgUFNTWU5UQVgsIG51bGxzdHIsIDApOworCXBvcGZpbGUoKTsKKworCW4ubmFyZy50eXBlID0gTkFSRzsKKwluLm5hcmcubmV4dCA9IE5VTEw7CisJbi5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwluLm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKworCWV4cGFuZGFyZygmbiwgTlVMTCwgMCk7CisJcmV0dXJuIHN0YWNrYmxvY2soKTsKK30KKyNlbmRpZgorCisvKgorICogRXhlY3V0ZSBhIGNvbW1hbmQgb3IgY29tbWFuZHMgY29udGFpbmVkIGluIGEgc3RyaW5nLgorICovCitzdGF0aWMgaW50CitldmFsc3RyaW5nKGNoYXIgKnMsIGludCBtYXNrKQoreworCXVuaW9uIG5vZGUgKm47CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgc2tpcDsKKworCXNldGlucHV0c3RyaW5nKHMpOworCXNldHN0YWNrbWFyaygmc21hcmspOworCisJc2tpcCA9IDA7CisJd2hpbGUgKChuID0gcGFyc2VjbWQoMCkpICE9IE5PREVfRU9GKSB7CisJCWV2YWx0cmVlKG4sIDApOworCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwkJc2tpcCA9IGV2YWxza2lwOworCQlpZiAoc2tpcCkKKwkJCWJyZWFrOworCX0KKwlwb3BmaWxlKCk7CisKKwlza2lwICY9IG1hc2s7CisJZXZhbHNraXAgPSBza2lwOworCXJldHVybiBza2lwOworfQorCisvKgorICogVGhlIGV2YWwgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2V2YWxjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpwOworCWNoYXIgKmNvbmNhdDsKKworCWlmIChhcmd2WzFdKSB7CisJCXAgPSBhcmd2WzFdOworCQlhcmd2ICs9IDI7CisJCWlmIChhcmd2WzBdKSB7CisJCQlTVEFSVFNUQUNLU1RSKGNvbmNhdCk7CisJCQlmb3IgKDs7KSB7CisJCQkJY29uY2F0ID0gc3RhY2tfcHV0c3RyKHAsIGNvbmNhdCk7CisJCQkJcCA9ICphcmd2Kys7CisJCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJU1RQVVRDKCcgJywgY29uY2F0KTsKKwkJCX0KKwkJCVNUUFVUQygnXDAnLCBjb25jYXQpOworCQkJcCA9IGdyYWJzdGFja3N0cihjb25jYXQpOworCQl9CisJCWV2YWxzdHJpbmcocCwgflNLSVBFVkFMKTsKKwl9CisJcmV0dXJuIGV4aXRzdGF0dXM7Cit9CisKKy8qCisgKiBSZWFkIGFuZCBleGVjdXRlIGNvbW1hbmRzLgorICogIlRvcCIgaXMgbm9uemVybyBmb3IgdGhlIHRvcCBsZXZlbCBjb21tYW5kIGxvb3A7CisgKiBpdCB0dXJucyBvbiBwcm9tcHRpbmcgaWYgdGhlIHNoZWxsIGlzIGludGVyYWN0aXZlLgorICovCitzdGF0aWMgaW50CitjbWRsb29wKGludCB0b3ApCit7CisJdW5pb24gbm9kZSAqbjsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCWludCBpbnRlcjsKKwlpbnQgbnVtZW9mID0gMDsKKworCVRSQUNFKCgiY21kbG9vcCglZCkgY2FsbGVkXG4iLCB0b3ApKTsKKwlmb3IgKDs7KSB7CisJCWludCBza2lwOworCisJCXNldHN0YWNrbWFyaygmc21hcmspOworI2lmIEpPQlMKKwkJaWYgKGRvaW5nX2pvYmN0bCkKKwkJCXNob3dqb2JzKHN0ZGVyciwgU0hPV19DSEFOR0VEKTsKKyNlbmRpZgorCQlpbnRlciA9IDA7CisJCWlmIChpZmxhZyAmJiB0b3ApIHsKKwkJCWludGVyKys7CisJCQljaGttYWlsKCk7CisJCX0KKwkJbiA9IHBhcnNlY21kKGludGVyKTsKKyNpZiBERUJVRworCQlpZiAoREVCVUcgPiAyICYmIGRlYnVnICYmIChuICE9IE5PREVfRU9GKSkKKwkJCXNob3d0cmVlKG4pOworI2VuZGlmCisJCWlmIChuID09IE5PREVfRU9GKSB7CisJCQlpZiAoIXRvcCB8fCBudW1lb2YgPj0gNTApCisJCQkJYnJlYWs7CisJCQlpZiAoIXN0b3BwZWRqb2JzKCkpIHsKKwkJCQlpZiAoIUlmbGFnKQorCQkJCQlicmVhazsKKwkJCQlvdXQyc3RyKCJcblVzZSBcImV4aXRcIiB0byBsZWF2ZSBzaGVsbC5cbiIpOworCQkJfQorCQkJbnVtZW9mKys7CisJCX0gZWxzZSBpZiAobmZsYWcgPT0gMCkgeworCQkJLyogam9iX3dhcm5pbmcgY2FuIG9ubHkgYmUgMiwxLDAuIEhlcmUgMi0+MSwgMS8wLT4wICovCisJCQlqb2Jfd2FybmluZyA+Pj0gMTsKKwkJCW51bWVvZiA9IDA7CisJCQlldmFsdHJlZShuLCAwKTsKKwkJfQorCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwkJc2tpcCA9IGV2YWxza2lwOworCisJCWlmIChza2lwKSB7CisJCQlldmFsc2tpcCA9IDA7CisJCQlyZXR1cm4gc2tpcCAmIFNLSVBFVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGFrZSBjb21tYW5kcyBmcm9tIGEgZmlsZS4gIFRvIGJlIGNvbXBhdGlibGUgd2Ugc2hvdWxkIGRvIGEgcGF0aAorICogc2VhcmNoIGZvciB0aGUgZmlsZSwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGZpbmQgc3ViLWNvbW1hbmRzLgorICovCitzdGF0aWMgY2hhciAqCitmaW5kX2RvdF9maWxlKGNoYXIgKm5hbWUpCit7CisJY2hhciAqZnVsbG5hbWU7CisJY29uc3QgY2hhciAqcGF0aCA9IHBhdGh2YWwoKTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKworCS8qIGRvbid0IHRyeSB0aGlzIGZvciBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRocyAqLworCWlmIChzdHJjaHIobmFtZSwgJy8nKSkKKwkJcmV0dXJuIG5hbWU7CisKKwkvKiBJSVJDIHN0YW5kYXJkcyBkbyBub3Qgc2F5IHdoZXRoZXIgLiBpcyB0byBiZSBzZWFyY2hlZC4KKwkgKiBBbmQgaXQgaXMgZXZlbiBzbWFsbGVyIHRoaXMgd2F5LCBtYWtpbmcgaXQgdW5jb25kaXRpb25hbCBmb3Igbm93OgorCSAqLworCWlmICgxKSB7IC8qIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQgKi8KKwkJZnVsbG5hbWUgPSBuYW1lOworCQlnb3RvIHRyeV9jdXJfZGlyOworCX0KKworCXdoaWxlICgoZnVsbG5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIG5hbWUpKSAhPSBOVUxMKSB7CisgdHJ5X2N1cl9kaXI6CisJCWlmICgoc3RhdChmdWxsbmFtZSwgJnN0YXRiKSA9PSAwKSAmJiBTX0lTUkVHKHN0YXRiLnN0X21vZGUpKSB7CisJCQkvKgorCQkJICogRG9uJ3QgYm90aGVyIGZyZWVpbmcgaGVyZSwgc2luY2UgaXQgd2lsbAorCQkJICogYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKwkJCSAqLworCQkJcmV0dXJuIGZ1bGxuYW1lOworCQl9CisJCWlmIChmdWxsbmFtZSAhPSBuYW1lKQorCQkJc3R1bmFsbG9jKGZ1bGxuYW1lKTsKKwl9CisKKwkvKiBub3QgZm91bmQgaW4gdGhlIFBBVEggKi8KKwlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiJXM6IG5vdCBmb3VuZCIsIG5hbWUpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2RvdGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZnVsbG5hbWU7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCXZvbGF0aWxlIHN0cnVjdCBzaHBhcmFtIHNhdmVwYXJhbTsKKworCWZvciAoc3AgPSBjbWRlbnZpcm9uOyBzcDsgc3AgPSBzcC0+bmV4dCkKKwkJc2V0dmFyZXEoY2tzdHJkdXAoc3AtPnRleHQpLCBWU1RSRklYRUQgfCBWVEVYVEZJWEVEKTsKKworCWlmICghYXJndlsxXSkgeworCQkvKiBiYXNoIHNheXM6ICJiYXNoOiAuOiBmaWxlbmFtZSBhcmd1bWVudCByZXF1aXJlZCIgKi8KKwkJcmV0dXJuIDI7IC8qIGJhc2ggY29tcGF0ICovCisJfQorCisJLyogImZhbHNlOyAuIGVtcHR5X2ZpbGU7IGVjaG8gJD8iIHNob3VsZCBwcmludCAwLCBub3QgMTogKi8KKwlleGl0c3RhdHVzID0gMDsKKworCWZ1bGxuYW1lID0gZmluZF9kb3RfZmlsZShhcmd2WzFdKTsKKworCWFyZ3YgKz0gMjsKKwlhcmdjIC09IDI7CisJaWYgKGFyZ2MpIHsgLyogYXJnYyA+IDAsIGFyZ3ZbMF0gIT0gTlVMTCAqLworCQlzYXZlcGFyYW0gPSBzaGVsbHBhcmFtOworCQlzaGVsbHBhcmFtLm1hbGxvY2VkID0gMDsKKwkJc2hlbGxwYXJhbS5ucGFyYW0gPSBhcmdjOworCQlzaGVsbHBhcmFtLnAgPSBhcmd2OworCX07CisKKwlzZXRpbnB1dGZpbGUoZnVsbG5hbWUsIElOUFVUX1BVU0hfRklMRSk7CisJY29tbWFuZG5hbWUgPSBmdWxsbmFtZTsKKwljbWRsb29wKDApOworCXBvcGZpbGUoKTsKKworCWlmIChhcmdjKSB7CisJCWZyZWVwYXJhbSgmc2hlbGxwYXJhbSk7CisJCXNoZWxscGFyYW0gPSBzYXZlcGFyYW07CisJfTsKKworCXJldHVybiBleGl0c3RhdHVzOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworZXhpdGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWlmIChzdG9wcGVkam9icygpKQorCQlyZXR1cm4gMDsKKwlpZiAoYXJndlsxXSkKKwkJZXhpdHN0YXR1cyA9IG51bWJlcihhcmd2WzFdKTsKKwlyYWlzZV9leGNlcHRpb24oRVhFWElUKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qCisgKiBSZWFkIGEgZmlsZSBjb250YWluaW5nIHNoZWxsIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK3JlYWRjbWRmaWxlKGNoYXIgKm5hbWUpCit7CisJc2V0aW5wdXRmaWxlKG5hbWUsIElOUFVUX1BVU0hfRklMRSk7CisJY21kbG9vcCgwKTsKKwlwb3BmaWxlKCk7Cit9CisKKworLyogPT09PT09PT09PT09IGZpbmRfY29tbWFuZCBpbnBsZW1lbnRhdGlvbiAqLworCisvKgorICogUmVzb2x2ZSBhIGNvbW1hbmQgbmFtZS4gIElmIHlvdSBjaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UgbWF5IGhhdmUgdG8KKyAqIGNoYW5nZSB0aGUgc2hlbGxleGVjIHJvdXRpbmUgYXMgd2VsbC4KKyAqLworc3RhdGljIHZvaWQKK2ZpbmRfY29tbWFuZChjaGFyICpuYW1lLCBzdHJ1Y3QgY21kZW50cnkgKmVudHJ5LCBpbnQgYWN0LCBjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwlpbnQgaWR4OworCWludCBwcmV2OworCWNoYXIgKmZ1bGxuYW1lOworCXN0cnVjdCBzdGF0IHN0YXRiOworCWludCBlOworCWludCB1cGRhdGV0Ymw7CisJc3RydWN0IGJ1aWx0aW5jbWQgKmJjbWQ7CisKKwkvKiBJZiBuYW1lIGNvbnRhaW5zIGEgc2xhc2gsIGRvbid0IHVzZSBQQVRIIG9yIGhhc2ggdGFibGUgKi8KKwlpZiAoc3RyY2hyKG5hbWUsICcvJykgIT0gTlVMTCkgeworCQllbnRyeS0+dS5pbmRleCA9IC0xOworCQlpZiAoYWN0ICYgRE9fQUJTKSB7CisJCQl3aGlsZSAoc3RhdChuYW1lLCAmc3RhdGIpIDwgMCkgeworI2lmZGVmIFNZU1YKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQkJZW50cnktPmNtZHR5cGUgPSBDTURVTktOT1dOOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbnRyeS0+Y21kdHlwZSA9IENNRE5PUk1BTDsKKwkJcmV0dXJuOworCX0KKworLyogI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUuLi4gbW92ZWQgYWZ0ZXIgYnVpbHRpbiBjaGVjayAqLworCisJdXBkYXRldGJsID0gKHBhdGggPT0gcGF0aHZhbCgpKTsKKwlpZiAoIXVwZGF0ZXRibCkgeworCQlhY3QgfD0gRE9fQUxUUEFUSDsKKwkJaWYgKHN0cnN0cihwYXRoLCAiJWJ1aWx0aW4iKSAhPSBOVUxMKQorCQkJYWN0IHw9IERPX0FMVEJMVElOOworCX0KKworCS8qIElmIG5hbWUgaXMgaW4gdGhlIHRhYmxlLCBjaGVjayBhbnN3ZXIgd2lsbCBiZSBvayAqLworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCk7CisJaWYgKGNtZHAgIT0gTlVMTCkgeworCQlpbnQgYml0OworCisJCXN3aXRjaCAoY21kcC0+Y21kdHlwZSkgeworCQlkZWZhdWx0OgorI2lmIERFQlVHCisJCQlhYm9ydCgpOworI2VuZGlmCisJCWNhc2UgQ01ETk9STUFMOgorCQkJYml0ID0gRE9fQUxUUEFUSDsKKwkJCWJyZWFrOworCQljYXNlIENNREZVTkNUSU9OOgorCQkJYml0ID0gRE9fTk9GVU5DOworCQkJYnJlYWs7CisJCWNhc2UgQ01EQlVJTFRJTjoKKwkJCWJpdCA9IERPX0FMVEJMVElOOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFjdCAmIGJpdCkgeworCQkJdXBkYXRldGJsID0gMDsKKwkJCWNtZHAgPSBOVUxMOworCQl9IGVsc2UgaWYgKGNtZHAtPnJlaGFzaCA9PSAwKQorCQkJLyogaWYgbm90IGludmFsaWRhdGVkIGJ5IGNkLCB3ZSdyZSBkb25lICovCisJCQlnb3RvIHN1Y2Nlc3M7CisJfQorCisJLyogSWYgJWJ1aWx0aW4gbm90IGluIHBhdGgsIGNoZWNrIGZvciBidWlsdGluIG5leHQgKi8KKwliY21kID0gZmluZF9idWlsdGluKG5hbWUpOworCWlmIChiY21kKSB7CisJCWlmIChJU19CVUlMVElOX1JFR1VMQVIoYmNtZCkpCisJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJaWYgKGFjdCAmIERPX0FMVFBBVEgpIHsKKwkJCWlmICghKGFjdCAmIERPX0FMVEJMVElOKSkKKwkJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJfSBlbHNlIGlmIChidWlsdGlubG9jIDw9IDApIHsKKwkJCWdvdG8gYnVpbHRpbl9zdWNjZXNzOworCQl9CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCXsKKwkJaW50IGFwcGxldF9ubyA9IGZpbmRfYXBwbGV0X2J5X25hbWUobmFtZSk7CisJCWlmIChhcHBsZXRfbm8gPj0gMCkgeworCQkJZW50cnktPmNtZHR5cGUgPSBDTUROT1JNQUw7CisJCQllbnRyeS0+dS5pbmRleCA9IC0yIC0gYXBwbGV0X25vOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBXZSBoYXZlIHRvIHNlYXJjaCBwYXRoLiAqLworCXByZXYgPSAtMTsgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIHN0YXJ0ICovCisJaWYgKGNtZHAgJiYgY21kcC0+cmVoYXNoKSB7ICAgICAvKiBkb2luZyBhIHJlaGFzaCAqLworCQlpZiAoY21kcC0+Y21kdHlwZSA9PSBDTURCVUlMVElOKQorCQkJcHJldiA9IGJ1aWx0aW5sb2M7CisJCWVsc2UKKwkJCXByZXYgPSBjbWRwLT5wYXJhbS5pbmRleDsKKwl9CisKKwllID0gRU5PRU5UOworCWlkeCA9IC0xOworIGxvb3A6CisJd2hpbGUgKChmdWxsbmFtZSA9IHBhdGhfYWR2YW5jZSgmcGF0aCwgbmFtZSkpICE9IE5VTEwpIHsKKwkJc3R1bmFsbG9jKGZ1bGxuYW1lKTsKKwkJLyogTkI6IGNvZGUgYmVsb3cgd2lsbCBzdGlsbCB1c2UgZnVsbG5hbWUKKwkJICogZGVzcGl0ZSBpdCBiZWluZyAidW5hbGxvY2F0ZWQiICovCisJCWlkeCsrOworCQlpZiAocGF0aG9wdCkgeworCQkJaWYgKHByZWZpeChwYXRob3B0LCAiYnVpbHRpbiIpKSB7CisJCQkJaWYgKGJjbWQpCisJCQkJCWdvdG8gYnVpbHRpbl9zdWNjZXNzOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChhY3QgJiBET19OT0ZVTkMpCisJCQkgfHwgIXByZWZpeChwYXRob3B0LCAiZnVuYyIpCisJCQkpIHsgICAgIC8qIGlnbm9yZSB1bmltcGxlbWVudGVkIG9wdGlvbnMgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkvKiBpZiByZWhhc2gsIGRvbid0IHJlZG8gYWJzb2x1dGUgcGF0aCBuYW1lcyAqLworCQlpZiAoZnVsbG5hbWVbMF0gPT0gJy8nICYmIGlkeCA8PSBwcmV2KSB7CisJCQlpZiAoaWR4IDwgcHJldikKKwkJCQljb250aW51ZTsKKwkJCVRSQUNFKCgic2VhcmNoZXhlYyBcIiVzXCI6IG5vIGNoYW5nZVxuIiwgbmFtZSkpOworCQkJZ290byBzdWNjZXNzOworCQl9CisJCXdoaWxlIChzdGF0KGZ1bGxuYW1lLCAmc3RhdGIpIDwgMCkgeworI2lmZGVmIFNZU1YKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKyNlbmRpZgorCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKQorCQkJCWUgPSBlcnJubzsKKwkJCWdvdG8gbG9vcDsKKwkJfQorCQllID0gRUFDQ0VTOyAgICAgLyogaWYgd2UgZmFpbCwgdGhpcyB3aWxsIGJlIHRoZSBlcnJvciAqLworCQlpZiAoIVNfSVNSRUcoc3RhdGIuc3RfbW9kZSkpCisJCQljb250aW51ZTsKKwkJaWYgKHBhdGhvcHQpIHsgICAgICAgICAgLyogdGhpcyBpcyBhICVmdW5jIGRpcmVjdG9yeSAqLworCQkJc3RhbGxvYyhzdHJsZW4oZnVsbG5hbWUpICsgMSk7CisJCQkvKiBOQjogc3RhbGxvYyB3aWxsIHJldHVybiBzcGFjZSBwb2ludGVkIGJ5IGZ1bGxuYW1lCisJCQkgKiAoYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSBpbnRlcnZlbmluZyBhbGxvY2F0aW9ucworCQkJICogYmV0d2VlbiBzdHVuYWxsb2MgYWJvdmUgYW5kIHRoaXMgc3RhbGxvYykgKi8KKwkJCXJlYWRjbWRmaWxlKGZ1bGxuYW1lKTsKKwkJCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCk7CisJCQlpZiAoY21kcCA9PSBOVUxMIHx8IGNtZHAtPmNtZHR5cGUgIT0gQ01ERlVOQ1RJT04pCisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVzIG5vdCBkZWZpbmVkIGluICVzIiwgbmFtZSwgZnVsbG5hbWUpOworCQkJc3R1bmFsbG9jKGZ1bGxuYW1lKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCQlUUkFDRSgoInNlYXJjaGV4ZWMgXCIlc1wiIHJldHVybnMgXCIlc1wiXG4iLCBuYW1lLCBmdWxsbmFtZSkpOworCQlpZiAoIXVwZGF0ZXRibCkgeworCQkJZW50cnktPmNtZHR5cGUgPSBDTUROT1JNQUw7CisJCQllbnRyeS0+dS5pbmRleCA9IGlkeDsKKwkJCXJldHVybjsKKwkJfQorCQlJTlRfT0ZGOworCQljbWRwID0gY21kbG9va3VwKG5hbWUsIDEpOworCQljbWRwLT5jbWR0eXBlID0gQ01ETk9STUFMOworCQljbWRwLT5wYXJhbS5pbmRleCA9IGlkeDsKKwkJSU5UX09OOworCQlnb3RvIHN1Y2Nlc3M7CisJfQorCisJLyogV2UgZmFpbGVkLiAgSWYgdGhlcmUgd2FzIGFuIGVudHJ5IGZvciB0aGlzIGNvbW1hbmQsIGRlbGV0ZSBpdCAqLworCWlmIChjbWRwICYmIHVwZGF0ZXRibCkKKwkJZGVsZXRlX2NtZF9lbnRyeSgpOworCWlmIChhY3QgJiBET19FUlIpCisJCWFzaF9tc2coIiVzOiAlcyIsIG5hbWUsIGVycm1zZyhlLCAibm90IGZvdW5kIikpOworCWVudHJ5LT5jbWR0eXBlID0gQ01EVU5LTk9XTjsKKwlyZXR1cm47CisKKyBidWlsdGluX3N1Y2Nlc3M6CisJaWYgKCF1cGRhdGV0YmwpIHsKKwkJZW50cnktPmNtZHR5cGUgPSBDTURCVUlMVElOOworCQllbnRyeS0+dS5jbWQgPSBiY21kOworCQlyZXR1cm47CisJfQorCUlOVF9PRkY7CisJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAxKTsKKwljbWRwLT5jbWR0eXBlID0gQ01EQlVJTFRJTjsKKwljbWRwLT5wYXJhbS5jbWQgPSBiY21kOworCUlOVF9PTjsKKyBzdWNjZXNzOgorCWNtZHAtPnJlaGFzaCA9IDA7CisJZW50cnktPmNtZHR5cGUgPSBjbWRwLT5jbWR0eXBlOworCWVudHJ5LT51ID0gY21kcC0+cGFyYW07Cit9CisKKworLyogPT09PT09PT09PT09IHRyYXAuYyAqLworCisvKgorICogVGhlIHRyYXAgYnVpbHRpbi4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3RyYXBjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqYWN0aW9uOworCWNoYXIgKiphcDsKKwlpbnQgc2lnbm8sIGV4aXRjb2RlOworCisJbmV4dG9wdChudWxsc3RyKTsKKwlhcCA9IGFyZ3B0cjsKKwlpZiAoISphcCkgeworCQlmb3IgKHNpZ25vID0gMDsgc2lnbm8gPCBOU0lHOyBzaWdubysrKSB7CisJCQljaGFyICp0ciA9IHRyYXBfcHRyW3NpZ25vXTsKKwkJCWlmICh0cikgeworCQkJCS8qIG5vdGU6IGJhc2ggYWRkcyAiU0lHIiwgYnV0IG9ubHkgaWYgaW52b2tlZAorCQkJCSAqIGFzICJiYXNoIi4gSWYgY2FsbGVkIGFzICJzaCIsIG9yIGlmIHNldCAtbyBwb3NpeCwKKwkJCQkgKiB0aGVuIGl0IHByaW50cyBzaG9ydCBzaWduYWwgbmFtZXMuCisJCQkJICogV2UgYXJlIHByaW50aW5nIHNob3J0IG5hbWVzOiAqLworCQkJCW91dDFmbXQoInRyYXAgLS0gJXMgJXNcbiIsCisJCQkJCQlzaW5nbGVfcXVvdGUodHIpLAorCQkJCQkJZ2V0X3NpZ25hbWUoc2lnbm8pKTsKKwkJLyogdHJhcF9wdHIgIT0gdHJhcCBvbmx5IGlmIHdlIGFyZSBpbiBzcGVjaWFsLWNhc2VkIGB0cmFwYCBjb2RlLgorCQkgKiBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZXhpdCB2ZXJ5IHNvb24sIG5vIG5lZWQgdG8gZnJlZSgpLiAqLworCQkJCS8qIGlmICh0cmFwX3B0ciAhPSB0cmFwICYmIHRwWzBdKSAqLworCQkJCS8qCWZyZWUodHIpOyAqLworCQkJfQorCQl9CisJCS8qCisJCWlmICh0cmFwX3B0ciAhPSB0cmFwKSB7CisJCQlmcmVlKHRyYXBfcHRyKTsKKwkJCXRyYXBfcHRyID0gdHJhcDsKKwkJfQorCQkqLworCQlyZXR1cm4gMDsKKwl9CisKKwlhY3Rpb24gPSBOVUxMOworCWlmIChhcFsxXSkKKwkJYWN0aW9uID0gKmFwKys7CisJZXhpdGNvZGUgPSAwOworCXdoaWxlICgqYXApIHsKKwkJc2lnbm8gPSBnZXRfc2lnbnVtKCphcCk7CisJCWlmIChzaWdubyA8IDApIHsKKwkJCS8qIE1pbWljIGJhc2ggbWVzc2FnZSBleGFjdGx5ICovCisJCQlhc2hfbXNnKCIlczogaW52YWxpZCBzaWduYWwgc3BlY2lmaWNhdGlvbiIsICphcCk7CisJCQlleGl0Y29kZSA9IDE7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJSU5UX09GRjsKKwkJaWYgKGFjdGlvbikgeworCQkJaWYgKExPTkVfREFTSChhY3Rpb24pKQorCQkJCWFjdGlvbiA9IE5VTEw7CisJCQllbHNlCisJCQkJYWN0aW9uID0gY2tzdHJkdXAoYWN0aW9uKTsKKwkJfQorCQlmcmVlKHRyYXBbc2lnbm9dKTsKKwkJaWYgKGFjdGlvbikKKwkJCW1heV9oYXZlX3RyYXBzID0gMTsKKwkJdHJhcFtzaWdub10gPSBhY3Rpb247CisJCWlmIChzaWdubyAhPSAwKQorCQkJc2V0c2lnbmFsKHNpZ25vKTsKKwkJSU5UX09OOworIG5leHQ6CisJCWFwKys7CisJfQorCXJldHVybiBleGl0Y29kZTsKK30KKworCisvKiA9PT09PT09PT09PT0gQnVpbHRpbnMgKi8KKworI2lmICFFTkFCTEVfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorLyoKKyAqIExpc3RzIGF2YWlsYWJsZSBidWlsdGlucworICovCitzdGF0aWMgaW50IEZBU1RfRlVOQworaGVscGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwl1bnNpZ25lZCBjb2w7CisJdW5zaWduZWQgaTsKKworCW91dDFmbXQoCisJCSJCdWlsdC1pbiBjb21tYW5kczpcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yIChjb2wgPSAwLCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVpbHRpbnRhYik7IGkrKykgeworCQljb2wgKz0gb3V0MWZtdCgiJWMlcyIsICgoY29sID09IDApID8gJ1x0JyA6ICcgJyksCisJCQkJCWJ1aWx0aW50YWJbaV0ubmFtZSArIDEpOworCQlpZiAoY29sID4gNjApIHsKKwkJCW91dDFmbXQoIlxuIik7CisJCQljb2wgPSAwOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwl7CisJCWNvbnN0IGNoYXIgKmEgPSBhcHBsZXRfbmFtZXM7CisJCXdoaWxlICgqYSkgeworCQkJY29sICs9IG91dDFmbXQoIiVjJXMiLCAoKGNvbCA9PSAwKSA/ICdcdCcgOiAnICcpLCBhKTsKKwkJCWlmIChjb2wgPiA2MCkgeworCQkJCW91dDFmbXQoIlxuIik7CisJCQkJY29sID0gMDsKKwkJCX0KKwkJCWEgKz0gc3RybGVuKGEpICsgMTsKKwkJfQorCX0KKyNlbmRpZgorCW91dDFmbXQoIlxuXG4iKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmIC8qIEZFQVRVUkVfU0hfRVhUUkFfUVVJRVQgKi8KKworLyoKKyAqIFRoZSBleHBvcnQgYW5kIHJlYWRvbmx5IGNvbW1hbmRzLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQworZXhwb3J0Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHZhciAqdnA7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKiphcHRyOworCWludCBmbGFnID0gYXJndlswXVswXSA9PSAncicgPyBWUkVBRE9OTFkgOiBWRVhQT1JUOworCisJaWYgKG5leHRvcHQoInAiKSAhPSAncCcpIHsKKwkJYXB0ciA9IGFyZ3B0cjsKKwkJbmFtZSA9ICphcHRyOworCQlpZiAobmFtZSkgeworCQkJZG8geworCQkJCXAgPSBzdHJjaHIobmFtZSwgJz0nKTsKKwkJCQlpZiAocCAhPSBOVUxMKSB7CisJCQkJCXArKzsKKwkJCQl9IGVsc2UgeworCQkJCQl2cCA9ICpmaW5kdmFyKGhhc2h2YXIobmFtZSksIG5hbWUpOworCQkJCQlpZiAodnApIHsKKwkJCQkJCXZwLT5mbGFncyB8PSBmbGFnOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJc2V0dmFyKG5hbWUsIHAsIGZsYWcpOworCQkJfSB3aGlsZSAoKG5hbWUgPSAqKythcHRyKSAhPSBOVUxMKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXNob3d2YXJzKGFyZ3ZbMF0sIGZsYWcsIDApOworCXJldHVybiAwOworfQorCisvKgorICogRGVsZXRlIGEgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgorICovCitzdGF0aWMgdm9pZAordW5zZXRmdW5jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKTsKKwlpZiAoY21kcCAhPSBOVUxMICYmIGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pCisJCWRlbGV0ZV9jbWRfZW50cnkoKTsKK30KKworLyoKKyAqIFRoZSB1bnNldCBidWlsdGluIGNvbW1hbmQuICBXZSB1bnNldCB0aGUgZnVuY3Rpb24gYmVmb3JlIHdlIHVuc2V0IHRoZQorICogdmFyaWFibGUgdG8gYWxsb3cgYSBmdW5jdGlvbiB0byBiZSB1bnNldCB3aGVuIHRoZXJlIGlzIGEgcmVhZG9ubHkgdmFyaWFibGUKKyAqIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3Vuc2V0Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKiphcDsKKwlpbnQgaTsKKwlpbnQgZmxhZyA9IDA7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJ2ZiIpKSAhPSAwKSB7CisJCWZsYWcgPSBpOworCX0KKworCWZvciAoYXAgPSBhcmdwdHI7ICphcDsgYXArKykgeworCQlpZiAoZmxhZyAhPSAnZicpIHsKKwkJCWkgPSB1bnNldHZhcigqYXApOworCQkJcmV0IHw9IGk7CisJCQlpZiAoIShpICYgMikpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZsYWcgIT0gJ3YnKQorCQkJdW5zZXRmdW5jKCphcCk7CisJfQorCXJldHVybiByZXQgJiAxOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0aW1lc2NtZF9zdHJbXSBBTElHTjEgPSB7CisJJyAnLCAgb2Zmc2V0b2Yoc3RydWN0IHRtcywgdG1zX3V0aW1lKSwKKwknXG4nLCBvZmZzZXRvZihzdHJ1Y3QgdG1zLCB0bXNfc3RpbWUpLAorCScgJywgIG9mZnNldG9mKHN0cnVjdCB0bXMsIHRtc19jdXRpbWUpLAorCSdcbicsIG9mZnNldG9mKHN0cnVjdCB0bXMsIHRtc19jc3RpbWUpLAorCTAKK307CitzdGF0aWMgaW50IEZBU1RfRlVOQwordGltZXNjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJdW5zaWduZWQgbG9uZyBjbGtfdGNrLCBzLCB0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJc3RydWN0IHRtcyBidWY7CisKKwljbGtfdGNrID0gc3lzY29uZihfU0NfQ0xLX1RDSyk7CisJdGltZXMoJmJ1Zik7CisKKwlwID0gdGltZXNjbWRfc3RyOworCWRvIHsKKwkJdCA9ICooY2xvY2tfdCAqKSgoKGNoYXIgKikgJmJ1ZikgKyBwWzFdKTsKKwkJcyA9IHQgLyBjbGtfdGNrOworCQl0ID0gdCAlIGNsa190Y2s7CisJCW91dDFmbXQoIiVsdW0lbHUuJTAzbHVzJWMiLAorCQkJcyAvIDYwLCBzICUgNjAsCisJCQkodCAqIDEwMDApIC8gY2xrX3RjaywKKwkJCXBbMF0pOworCQlwICs9IDI7CisJfSB3aGlsZSAoKnApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisvKgorICogVGhlIGxldCBidWlsdGluLiBQYXJ0aWFsbHkgc3RvbGVuIGZyb20gR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCisgKiBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2xldGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWFyaXRoX3QgaTsKKworCWFyZ3YrKzsKKwlpZiAoISphcmd2KQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiZXhwcmVzc2lvbiBleHBlY3RlZCIpOworCWRvIHsKKwkJaSA9IGFzaF9hcml0aCgqYXJndik7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gIWk7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoZSByZWFkIGJ1aWx0aW4uIE9wdGlvbnM6CisgKiAgICAgIC1yICAgICAgICAgICAgICBEbyBub3QgaW50ZXJwcmV0ICdcJyBzcGVjaWFsbHkKKyAqICAgICAgLXMgICAgICAgICAgICAgIFR1cm4gb2ZmIGVjaG8gKHR0eSBvbmx5KQorICogICAgICAtbiBOQ0hBUlMgICAgICAgUmVhZCBOQ0hBUlMgbWF4CisgKiAgICAgIC1wIFBST01QVCAgICAgICBEaXNwbGF5IFBST01QVCBvbiBzdGRlcnIgKGlmIGlucHV0IGlzIGZyb20gdHR5KQorICogICAgICAtdCBTRUNPTkRTICAgICAgVGltZW91dCBhZnRlciBTRUNPTkRTICh0dHkgb3IgcGlwZSBvbmx5KQorICogICAgICAtdSBGRCAgICAgICAgICAgUmVhZCBmcm9tIGdpdmVuIEZEIGluc3RlYWQgb2YgZmQgMAorICogVGhpcyB1c2VzIHVuYnVmZmVyZWQgaW5wdXQsIHdoaWNoIG1heSBiZSBhdm9pZGFibGUgaW4gc29tZSBjYXNlcy4KKyAqIFRPRE86IGJhc2ggYWxzbyBoYXM6CisgKiAgICAgIC1hIEFSUkFZICAgICAgICBSZWFkIGludG8gYXJyYXlbMF0sWzFdLGV0YworICogICAgICAtZCBERUxJTSAgICAgICAgRW5kIG9uIERFTElNIGNoYXIsIG5vdCBuZXdsaW5lCisgKiAgICAgIC1lICAgICAgICAgICAgICBVc2UgbGluZSBlZGl0aW5nICh0dHkgb25seSkKKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3JlYWRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqb3B0X24gPSBOVUxMOworCWNoYXIgKm9wdF9wID0gTlVMTDsKKwljaGFyICpvcHRfdCA9IE5VTEw7CisJY2hhciAqb3B0X3UgPSBOVUxMOworCWludCByZWFkX2ZsYWdzID0gMDsKKwljb25zdCBjaGFyICpyOworCWludCBpOworCisJd2hpbGUgKChpID0gbmV4dG9wdCgicDp1OnJ0Om46cyIpKSAhPSAnXDAnKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlICdwJzoKKwkJCW9wdF9wID0gb3B0aW9uYXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJb3B0X24gPSBvcHRpb25hcmc7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlyZWFkX2ZsYWdzIHw9IEJVSUxUSU5fUkVBRF9TSUxFTlQ7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlvcHRfdCA9IG9wdGlvbmFyZzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJlYWRfZmxhZ3MgfD0gQlVJTFRJTl9SRUFEX1JBVzsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCW9wdF91ID0gb3B0aW9uYXJnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXIgPSBzaGVsbF9idWlsdGluX3JlYWQoc2V0dmFyMiwKKwkJYXJncHRyLAorCQlibHRpbmxvb2t1cCgiSUZTIiksIC8qIGNhbiBiZSBOVUxMICovCisJCXJlYWRfZmxhZ3MsCisJCW9wdF9uLAorCQlvcHRfcCwKKwkJb3B0X3QsCisJCW9wdF91CisJKTsKKworCWlmICgodWludHB0cl90KXIgPiAxKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihyKTsKKworCXJldHVybiAodWludHB0cl90KXI7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit1bWFza2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIHBlcm11c2VyWzNdIEFMSUdOMSA9ICJ1Z28iOworCXN0YXRpYyBjb25zdCBjaGFyIHBlcm1tb2RlWzNdIEFMSUdOMSA9ICJyd3giOworCXN0YXRpYyBjb25zdCBzaG9ydCBwZXJtbWFza1tdIEFMSUdOMiA9IHsKKwkJU19JUlVTUiwgU19JV1VTUiwgU19JWFVTUiwKKwkJU19JUkdSUCwgU19JV0dSUCwgU19JWEdSUCwKKwkJU19JUk9USCwgU19JV09USCwgU19JWE9USAorCX07CisKKwkvKiBUT0RPOiB1c2UgYmJfcGFyc2VfbW9kZSgpIGluc3RlYWQgKi8KKworCWNoYXIgKmFwOworCW1vZGVfdCBtYXNrOworCWludCBpOworCWludCBzeW1ib2xpY19tb2RlID0gMDsKKworCXdoaWxlIChuZXh0b3B0KCJTIikgIT0gJ1wwJykgeworCQlzeW1ib2xpY19tb2RlID0gMTsKKwl9CisKKwlJTlRfT0ZGOworCW1hc2sgPSB1bWFzaygwKTsKKwl1bWFzayhtYXNrKTsKKwlJTlRfT047CisKKwlhcCA9ICphcmdwdHI7CisJaWYgKGFwID09IE5VTEwpIHsKKwkJaWYgKHN5bWJvbGljX21vZGUpIHsKKwkJCWNoYXIgYnVmWzE4XTsKKwkJCWNoYXIgKnAgPSBidWY7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlpbnQgajsKKworCQkJCSpwKysgPSBwZXJtdXNlcltpXTsKKwkJCQkqcCsrID0gJz0nOworCQkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKwkJCQkJaWYgKChtYXNrICYgcGVybW1hc2tbMyAqIGkgKyBqXSkgPT0gMCkgeworCQkJCQkJKnArKyA9IHBlcm1tb2RlW2pdOworCQkJCQl9CisJCQkJfQorCQkJCSpwKysgPSAnLCc7CisJCQl9CisJCQkqLS1wID0gMDsKKwkJCXB1dHMoYnVmKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFmbXQoIiUuNG9cbiIsIG1hc2spOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICphcCkpIHsKKwkJCW1hc2sgPSAwOworCQkJZG8geworCQkJCWlmICgqYXAgPj0gJzgnIHx8ICphcCA8ICcwJykKKwkJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IobXNnX2lsbG51bSwgYXJndlsxXSk7CisJCQkJbWFzayA9IChtYXNrIDw8IDMpICsgKCphcCAtICcwJyk7CisJCQl9IHdoaWxlICgqKythcCAhPSAnXDAnKTsKKwkJCXVtYXNrKG1hc2spOworCQl9IGVsc2UgeworCQkJbWFzayA9IH5tYXNrICYgMDc3NzsKKwkJCWlmICghYmJfcGFyc2VfbW9kZShhcCwgJm1hc2spKSB7CisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImlsbGVnYWwgbW9kZTogJXMiLCBhcCk7CisJCQl9CisJCQl1bWFzayh+bWFzayAmIDA3NzcpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQwordWxpbWl0Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHNoZWxsX2J1aWx0aW5fdWxpbWl0KGFyZ3YpOworfQorCisvKiA9PT09PT09PT09PT0gbWFpbigpIGFuZCBoZWxwZXJzICovCisKKy8qCisgKiBDYWxsZWQgdG8gZXhpdCB0aGUgc2hlbGwuCisgKi8KK3N0YXRpYyB2b2lkCitleGl0c2hlbGwodm9pZCkKK3sKKwlzdHJ1Y3Qgam1wbG9jIGxvYzsKKwljaGFyICpwOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBleGl0c3RhdHVzOworCVRSQUNFKCgicGlkICVkLCBleGl0c2hlbGwoJWQpXG4iLCBnZXRwaWQoKSwgc3RhdHVzKSk7CisJaWYgKHNldGptcChsb2MubG9jKSkgeworCQlpZiAoZXhjZXB0aW9uX3R5cGUgPT0gRVhFWElUKQorLyogZGFzaCBidWc6IGl0IGp1c3QgZG9lcyBfZXhpdChleGl0c3RhdHVzKSBoZXJlCisgKiBidXQgd2UgaGF2ZSB0byBkbyBzZXRqb2JjdGwoMCkgZmlyc3QhCisgKiAoYnVnIGlzIHN0aWxsIG5vdCBmaXhlZCBpbiBkYXNoLTAuNS4zIC0gaWYgeW91IHJ1biBkYXNoCisgKiB1bmRlciBNaWRuaWdodCBDb21tYW5kZXIsIG9uIGV4aXQgZnJvbSBkYXNoIE1DIGlzIGJhY2tncm91bmRlZCkgKi8KKwkJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJCWdvdG8gb3V0OworCX0KKwlleGNlcHRpb25faGFuZGxlciA9ICZsb2M7CisJcCA9IHRyYXBbMF07CisJaWYgKHApIHsKKwkJdHJhcFswXSA9IE5VTEw7CisJCWV2YWxzdHJpbmcocCwgMCk7CisJCWZyZWUocCk7CisJfQorCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKKyBvdXQ6CisJc2V0am9iY3RsKDApOworCV9leGl0KHN0YXR1cyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdm9pZAoraW5pdCh2b2lkKQoreworCS8qIGZyb20gaW5wdXQuYzogKi8KKwkvKiB3ZSB3aWxsIG5ldmVyIGZyZWUgdGhpcyAqLworCWJhc2VwZi5uZXh0X3RvX3BnZXRjID0gYmFzZXBmLmJ1ZiA9IGNrbWFsbG9jKElCVUZTSVopOworCisJLyogZnJvbSB0cmFwLmM6ICovCisJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCS8qIGJhc2ggcmUtZW5hYmxlcyBTSUdIVVAgd2hpY2ggaXMgU0lHX0lHTmVkIG9uIGVudHJ5LgorCSAqIFRyeTogInRyYXAgJycgSFVQOyBiYXNoOyBlY2hvIFJFVCIgYW5kIHR5cGUgImtpbGwgLUhVUCAkJCIKKwkgKi8KKwlzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKKworCS8qIGZyb20gdmFyLmM6ICovCisJeworCQljaGFyICoqZW52cDsKKwkJY29uc3QgY2hhciAqcDsKKwkJc3RydWN0IHN0YXQgc3QxLCBzdDI7CisKKwkJaW5pdHZhcigpOworCQlmb3IgKGVudnAgPSBlbnZpcm9uOyBlbnZwICYmICplbnZwOyBlbnZwKyspIHsKKwkJCWlmIChzdHJjaHIoKmVudnAsICc9JykpIHsKKwkJCQlzZXR2YXJlcSgqZW52cCwgVkVYUE9SVHxWVEVYVEZJWEVEKTsKKwkJCX0KKwkJfQorCisJCXNldHZhcigiUFBJRCIsIHV0b2EoZ2V0cHBpZCgpKSwgMCk7CisKKwkJcCA9IGxvb2t1cHZhcigiUFdEIik7CisJCWlmIChwKSB7CisJCQlpZiAoKnAgIT0gJy8nIHx8IHN0YXQocCwgJnN0MSkgfHwgc3RhdCgiLiIsICZzdDIpCisJCQkgfHwgc3QxLnN0X2RldiAhPSBzdDIuc3RfZGV2IHx8IHN0MS5zdF9pbm8gIT0gc3QyLnN0X2lubworCQkJKSB7CisJCQkJcCA9ICdcMCc7CisJCQl9CisJCX0KKwkJc2V0cHdkKHAsIDApOworCX0KK30KKworCisvL3VzYWdlOiNkZWZpbmUgYXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLS8rT1BUSU9OU10gWy0vK28gT1BUXS4uLiBbLWMgJ1NDUklQVCcgW0FSRzAgW0FSR1NdXSAvIEZJTEUgW0FSR1NdXSIKKy8vdXNhZ2U6I2RlZmluZSBhc2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJVbml4IHNoZWxsIGludGVycHJldGVyIgorCisvL3VzYWdlOiNpZiBFTkFCTEVfRkVBVFVSRV9TSF9JU19BU0gKKy8vdXNhZ2U6IyBkZWZpbmUgc2hfdHJpdmlhbF91c2FnZSBhc2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTojIGRlZmluZSBzaF9mdWxsX3VzYWdlICAgIGFzaF9mdWxsX3VzYWdlCisvL3VzYWdlOiNlbmRpZgorLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfQkFTSF9JU19BU0gKKy8vdXNhZ2U6IyBkZWZpbmUgYmFzaF90cml2aWFsX3VzYWdlIGFzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiMgZGVmaW5lIGJhc2hfZnVsbF91c2FnZSAgICBhc2hfZnVsbF91c2FnZQorLy91c2FnZTojZW5kaWYKKworLyoKKyAqIFByb2Nlc3MgdGhlIHNoZWxsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgKi8KK3N0YXRpYyB2b2lkCitwcm9jYXJncyhjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICp4bWludXNjOworCWNoYXIgKip4YXJndjsKKworCXhhcmd2ID0gYXJndjsKKwlhcmcwID0geGFyZ3ZbMF07CisJLyogaWYgKHhhcmd2WzBdKSAtIG1tbSwgdGhpcyBpcyBhbHdheXMgdHJ1ZSEgKi8KKwkJeGFyZ3YrKzsKKwlmb3IgKGkgPSAwOyBpIDwgTk9QVFM7IGkrKykKKwkJb3B0bGlzdFtpXSA9IDI7CisJYXJncHRyID0geGFyZ3Y7CisJaWYgKG9wdGlvbnMoLypjbWRsaW5lOiovIDEpKSB7CisJCS8qIGl0IGFscmVhZHkgcHJpbnRlZCBlcnIgbWVzc2FnZSAqLworCQlyYWlzZV9leGNlcHRpb24oRVhFUlJPUik7CisJfQorCXhhcmd2ID0gYXJncHRyOworCXhtaW51c2MgPSBtaW51c2M7CisJaWYgKCp4YXJndiA9PSBOVUxMKSB7CisJCWlmICh4bWludXNjKQorCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX3JlcXVpcmVzX2FyZywgIi1jIik7CisJCXNmbGFnID0gMTsKKwl9CisJaWYgKGlmbGFnID09IDIgJiYgc2ZsYWcgPT0gMSAmJiBpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQorCQlpZmxhZyA9IDE7CisJaWYgKG1mbGFnID09IDIpCisJCW1mbGFnID0gaWZsYWc7CisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspCisJCWlmIChvcHRsaXN0W2ldID09IDIpCisJCQlvcHRsaXN0W2ldID0gMDsKKyNpZiBERUJVRyA9PSAyCisJZGVidWcgPSAxOworI2VuZGlmCisJLyogUE9TSVggMTAwMy4yOiBmaXJzdCBhcmcgYWZ0ZXIgLWMgY21kIGlzICQwLCByZW1haW5kZXIgJDEuLi4gKi8KKwlpZiAoeG1pbnVzYykgeworCQltaW51c2MgPSAqeGFyZ3YrKzsKKwkJaWYgKCp4YXJndikKKwkJCWdvdG8gc2V0YXJnMDsKKwl9IGVsc2UgaWYgKCFzZmxhZykgeworCQlzZXRpbnB1dGZpbGUoKnhhcmd2LCAwKTsKKyBzZXRhcmcwOgorCQlhcmcwID0gKnhhcmd2Kys7CisJCWNvbW1hbmRuYW1lID0gYXJnMDsKKwl9CisKKwlzaGVsbHBhcmFtLnAgPSB4YXJndjsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorCS8qIGFzc2VydChzaGVsbHBhcmFtLm1hbGxvY2VkID09IDAgJiYgc2hlbGxwYXJhbS5ucGFyYW0gPT0gMCk7ICovCisJd2hpbGUgKCp4YXJndikgeworCQlzaGVsbHBhcmFtLm5wYXJhbSsrOworCQl4YXJndisrOworCX0KKwlvcHRzY2hhbmdlZCgpOworfQorCisvKgorICogUmVhZCAvZXRjL3Byb2ZpbGUgb3IgLnByb2ZpbGUuCisgKi8KK3N0YXRpYyB2b2lkCityZWFkX3Byb2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgc2tpcDsKKworCWlmIChzZXRpbnB1dGZpbGUobmFtZSwgSU5QVVRfUFVTSF9GSUxFIHwgSU5QVVRfTk9GSUxFX09LKSA8IDApCisJCXJldHVybjsKKwlza2lwID0gY21kbG9vcCgwKTsKKwlwb3BmaWxlKCk7CisJaWYgKHNraXApCisJCWV4aXRzaGVsbCgpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGVycm9yIG9yIGFuIGludGVycnVwdCBvY2N1cnMgaW4gYW4KKyAqIGludGVyYWN0aXZlIHNoZWxsIGFuZCBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBtYWluIGNvbW1hbmQgbG9vcC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2V0KHZvaWQpCit7CisJLyogZnJvbSBldmFsLmM6ICovCisJZXZhbHNraXAgPSAwOworCWxvb3BuZXN0ID0gMDsKKwkvKiBmcm9tIGlucHV0LmM6ICovCisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fYnVmZmVyID0gMDsKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gMDsgICAgICAvKiBjbGVhciBpbnB1dCBidWZmZXIgKi8KKwlwb3BhbGxmaWxlcygpOworCS8qIGZyb20gcGFyc2VyLmM6ICovCisJdG9rcHVzaGJhY2sgPSAwOworCWNoZWNra3dkID0gMDsKKwkvKiBmcm9tIHJlZGlyLmM6ICovCisJY2xlYXJyZWRpcigvKmRyb3A6Ki8gMCk7Cit9CisKKyNpZiBQUk9GSUxFCitzdGF0aWMgc2hvcnQgcHJvZmlsZV9idWZbMTYzODRdOworZXh0ZXJuIGludCBldGV4dCgpOworI2VuZGlmCisKKy8qCisgKiBNYWluIHJvdXRpbmUuICBXZSBpbml0aWFsaXplIHRoaW5ncywgcGFyc2UgdGhlIGFyZ3VtZW50cywgZXhlY3V0ZQorICogcHJvZmlsZXMgaWYgd2UncmUgYSBsb2dpbiBzaGVsbCwgYW5kIHRoZW4gY2FsbCBjbWRsb29wIHRvIGV4ZWN1dGUKKyAqIGNvbW1hbmRzLiAgVGhlIHNldGptcCBjYWxsIHNldHMgdXAgdGhlIGxvY2F0aW9uIHRvIGp1bXAgdG8gd2hlbiBhbgorICogZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyB0aGUgdmFyaWFibGUgInN0YXRlIgorICogaXMgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyBmYXIgd2UgaGFkIGdvdHRlbi4KKyAqLworaW50IGFzaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYXNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpzaGluaXQ7CisJdm9sYXRpbGUgc21hbGxpbnQgc3RhdGU7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCS8qIEluaXRpYWxpemUgZ2xvYmFsIGRhdGEgKi8KKwlJTklUX0dfbWlzYygpOworCUlOSVRfR19tZW1zdGFjaygpOworCUlOSVRfR192YXIoKTsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJSU5JVF9HX2FsaWFzKCk7CisjZW5kaWYKKwlJTklUX0dfY21kdGFibGUoKTsKKworI2lmIFBST0ZJTEUKKwltb25pdG9yKDQsIGV0ZXh0LCBwcm9maWxlX2J1Ziwgc2l6ZW9mKHByb2ZpbGVfYnVmKSwgNTApOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisJbGluZV9pbnB1dF9zdGF0ZSA9IG5ld19saW5lX2lucHV0X3QoRk9SX1NIRUxMIHwgV0lUSF9QQVRIX0xPT0tVUCk7CisjZW5kaWYKKwlzdGF0ZSA9IDA7CisJaWYgKHNldGptcChqbXBsb2MubG9jKSkgeworCQlzbWFsbGludCBlOworCQlzbWFsbGludCBzOworCisJCXJlc2V0KCk7CisKKwkJZSA9IGV4Y2VwdGlvbl90eXBlOworCQlpZiAoZSA9PSBFWEVSUk9SKQorCQkJZXhpdHN0YXR1cyA9IDI7CisJCXMgPSBzdGF0ZTsKKwkJaWYgKGUgPT0gRVhFWElUIHx8IHMgPT0gMCB8fCBpZmxhZyA9PSAwIHx8IHNobHZsKSB7CisJCQlleGl0c2hlbGwoKTsKKwkJfQorCQlpZiAoZSA9PSBFWElOVCkgeworCQkJb3V0Y3Nsb3coJ1xuJywgc3RkZXJyKTsKKwkJfQorCisJCXBvcHN0YWNrbWFyaygmc21hcmspOworCQlGT1JDRV9JTlRfT047IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCWlmIChzID09IDEpCisJCQlnb3RvIHN0YXRlMTsKKwkJaWYgKHMgPT0gMikKKwkJCWdvdG8gc3RhdGUyOworCQlpZiAocyA9PSAzKQorCQkJZ290byBzdGF0ZTM7CisJCWdvdG8gc3RhdGU0OworCX0KKwlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisjaWYgREVCVUcKKwlvcGVudHJhY2UoKTsKKwlUUkFDRSgoIlNoZWxsIGFyZ3M6ICIpKTsKKwl0cmFjZV9wdXRzX2FyZ3MoYXJndik7CisjZW5kaWYKKwlyb290cGlkID0gZ2V0cGlkKCk7CisKKwlpbml0KCk7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJcHJvY2FyZ3MoYXJndik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJaWYgKGlmbGFnKSB7CisJCWNvbnN0IGNoYXIgKmhwID0gbG9va3VwdmFyKCJISVNURklMRSIpOworCQlpZiAoIWhwKSB7CisJCQlocCA9IGxvb2t1cHZhcigiSE9NRSIpOworCQkJaWYgKGhwKSB7CisJCQkJY2hhciAqZGVmaHAgPSBjb25jYXRfcGF0aF9maWxlKGhwLCAiLmFzaF9oaXN0b3J5Iik7CisJCQkJc2V0dmFyKCJISVNURklMRSIsIGRlZmhwLCAwKTsKKwkJCQlmcmVlKGRlZmhwKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCWlmIChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0gPT0gJy0nKQorCQlpc2xvZ2luc2ggPSAxOworCWlmIChpc2xvZ2luc2gpIHsKKwkJc3RhdGUgPSAxOworCQlyZWFkX3Byb2ZpbGUoIi9ldGMvcHJvZmlsZSIpOworIHN0YXRlMToKKwkJc3RhdGUgPSAyOworCQlyZWFkX3Byb2ZpbGUoIi5wcm9maWxlIik7CisJfQorIHN0YXRlMjoKKwlzdGF0ZSA9IDM7CisJaWYgKAorI2lmbmRlZiBsaW51eAorCSBnZXR1aWQoKSA9PSBnZXRldWlkKCkgJiYgZ2V0Z2lkKCkgPT0gZ2V0ZWdpZCgpICYmCisjZW5kaWYKKwkgaWZsYWcKKwkpIHsKKwkJc2hpbml0ID0gbG9va3VwdmFyKCJFTlYiKTsKKwkJaWYgKHNoaW5pdCAhPSBOVUxMICYmICpzaGluaXQgIT0gJ1wwJykgeworCQkJcmVhZF9wcm9maWxlKHNoaW5pdCk7CisJCX0KKwl9Cisgc3RhdGUzOgorCXN0YXRlID0gNDsKKwlpZiAobWludXNjKSB7CisJCS8qIGV2YWxzdHJpbmcgcHVzaGVzIHBhcnNlZmlsZSBzdGFjay4KKwkJICogRW5zdXJlIHdlIGRvbid0IGZhbHNlbHkgY2xhaW0gdGhhdCAwIChzdGRpbikKKwkJICogaXMgb25lIG9mIHN0YWNrZWQgc291cmNlIGZkcy4KKwkJICogVGVzdGNhc2U6IGFzaCAtYyAnZXhlYyAxPiYwJyBtdXN0IG5vdCBjb21wbGFpbi4gKi8KKwkJLy8gaWYgKCFzZmxhZykgZ19wYXJzZWZpbGUtPnBmX2ZkID0gLTE7CisJCS8vIF5eIG5vdCBuZWNlc3Nhcnkgc2luY2Ugbm93IHdlIHNwZWNpYWwtY2FzZSBmZCAwCisJCS8vIGluIGlzX2hpZGRlbl9mZCgpIHRvIG5vdCBiZSBjb25zaWRlcmVkICJoaWRkZW4gZmQiCisJCWV2YWxzdHJpbmcobWludXNjLCAwKTsKKwl9CisKKwlpZiAoc2ZsYWcgfHwgbWludXNjID09IE5VTEwpIHsKKyNpZiBkZWZpbmVkIE1BWF9ISVNUT1JZICYmIE1BWF9ISVNUT1JZID4gMCAmJiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJCWlmIChpZmxhZykgeworCQkJY29uc3QgY2hhciAqaHAgPSBsb29rdXB2YXIoIkhJU1RGSUxFIik7CisJCQlpZiAoaHApCisJCQkJbGluZV9pbnB1dF9zdGF0ZS0+aGlzdF9maWxlID0gaHA7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NIX0hJU1RGSUxFU0laRQorCQkJaHAgPSBsb29rdXB2YXIoIkhJU1RGSUxFU0laRSIpOworCQkJbGluZV9pbnB1dF9zdGF0ZS0+bWF4X2hpc3RvcnkgPSBzaXplX2Zyb21fSElTVEZJTEVTSVpFKGhwKTsKKyMgZW5kaWYKKwkJfQorI2VuZGlmCisgc3RhdGU0OiAvKiBYWFggPz8/IC0gd2h5IGlzbid0IHRoaXMgYmVmb3JlIHRoZSAiaWYiIHN0YXRlbWVudCAqLworCQljbWRsb29wKDEpOworCX0KKyNpZiBQUk9GSUxFCisJbW9uaXRvcigwKTsKKyNlbmRpZgorI2lmZGVmIEdQUk9GCisJeworCQlleHRlcm4gdm9pZCBfbWNsZWFudXAodm9pZCk7CisJCV9tY2xlYW51cCgpOworCX0KKyNlbmRpZgorCVRSQUNFKCgiRW5kIG9mIG1haW4gcmVhY2hlZFxuIikpOworCWV4aXRzaGVsbCgpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX2RvYy50eHQgYi9zaGVsbC9hc2hfZG9jLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE0NDQzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX2RvYy50eHQKQEAgLTAsMCArMSwxMjIgQEAKKwlXYWl0ICsgc2lnbmFscworCitXZSBoYWQgc29tZSBidWdzIGhlcmUgd2hpY2ggYXJlIGhhcmQgdG8gdGVzdCBpbiB0ZXN0c3VpdGUuCisKK0J1ZyAxMjgwIChodHRwOi8vYnVzeWJveC5uZXQvYnVncy92aWV3LnBocD9pZD0xMjgwKToKK3dhcyBtaXNiZWhhdmluZyBpbiBpbnRlcmFjdGl2ZSBhc2guIENvcnJlY3QgYmVoYXZpb3I6CisKKyQgc2xlZXAgMjAgJgorJCB3YWl0CiteQworJCB3YWl0CiteQworJCB3YWl0CiteQworLi4uCisKKworQnVnIDE5ODQgKGh0dHA6Ly9idXN5Ym94Lm5ldC9idWdzL3ZpZXcucGhwP2lkPTE5ODQpOgordHJhcHMgd2VyZSBub3QgdHJpZ2dlcmluZzoKKwordHJhcF9oYW5kbGVyX3VzciAoKSB7CisgICAgZWNobyB0cmFwIHVzcgorfQordHJhcF9oYW5kbGVyX2ludCAoKSB7CisgICAgZWNobyB0cmFwIGludAorfQordHJhcCB0cmFwX2hhbmRsZXJfdXNyIFVTUjEKK3RyYXAgdHJhcF9oYW5kbGVyX2ludCBJTlQKK3NsZWVwIDM2MDAgJgorZWNobyAiUGxlYXNlIGRvOiBraWxsIC1VU1IxICQkIgorZWNobyAib3I6IGtpbGwgLUlOVCAkJCIKK3doaWxlIHRydWU7IGRvIHdhaXQ7IGVjaG8gd2FpdCBpbnRlcnJ1cHRlZDsgZG9uZQorCisKK0J1ZyAxODkgKGh0dHBzOi8vYnVncy5idXN5Ym94Lm5ldC9zaG93X2J1Zy5jZ2k/aWQ9MTg5KQorCitmdW5jKCkgeworICAgIHNsZWVwIDEKK30KK3doaWxlICh0cnVlKTsgZG8KKyAgICBmdW5jCisgICAgZWNobyBMb29waW5nCitkb25lCisKK15DIHdhcyBvYnNlcnZlZCB0byBtYWtlIGFzaCBwcm9jZXNzZXMgZ2VvbWV0cmljYWxseSBtdWx0aXBseSAoISkgaW5zdGVhZAorb2YgZXhpdGluZy4gKHRydWUpIGluIHN1YnNoZWxsIGRvZXMgbm90IHNlZW0gdG8gbWF0dGVyLCBhcyBhbm90aGVyIHVzZXIKK3JlcG9ydHMgdGhlIHNhbWUgd2l0aDoKKwordHJhcCAiZWNobyBVU1IxIiBVU1IxCit3aGlsZSB0cnVlOyBkbworICAgIGVjaG8gU2xlZXBpbmcKKyAgICBzbGVlcCA1Citkb25lCisKK0NvbXBhdCBub3RlLgorQmFzaCB2ZXJzaW9uIDMuMi4wKDEpIGV4aXRzIHRoaXMgc2NyaXB0IGF0IHRoZSByZWNlaXB0IG9mIFNJR0lOVAorX29ubHlfIGlmIGl0IGhhZCB0d28gbGFzdCBjaGlsZHJlbiBkaWUgZnJvbSBpdC4KK1RoZSBmb2xsb3dpbmcgdHJhY2Ugd2FzIG9idGFpbmVkIHdoaWxlIHBlcmlvZGljYWxseSBydW5uaW5nCisia2lsbGFsbCAtU0lHSU5UIHNsZWVwOyBzbGVlcCAwLjE7IGtpbGwgLVNJR0lOVCA8YmFzaF9QSUQ+IjoKKworMjM6NDg6MzIuMzc2NzA3IGNsb25lKC4uLikgPSAxMzUyOAorMjM6NDg6MzIuMzg4NzA2IHdhaXRwaWQoLTEsIDB4ZmZjODMyZWMsIDApID0gPyBFUkVTVEFSVFNZUyAoVG8gYmUgcmVzdGFydGVkKQorMjM6NDg6MzIuNDU5NzYxIC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKyAgICBraWxsIC1TSUdJTlQgPGJhc2hfUElEPiBpcyBpZ25vcmVkLCBiYWNrIHRvIHdhaXRpbmc6CisyMzo0ODozMi40NjM3MDYgd2FpdHBpZCgtMSwgW3tXSUZFWElURUQocykgJiYgV0VYSVRTVEFUVVMocykgPT0gMH1dLCAwKSA9IDEzNTI4CisgICAgc2xlZXAgZXhpdGVkIHdpdGggMAorMjM6NDg6MzcuMzc3NTU3IC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisyMzo0ODozNy4zNzg0NTEgY2xvbmUoLi4uKSA9IDEzNTM4CisyMzo0ODozNy4zOTA3MDggd2FpdHBpZCgtMSwgW3tXSUZTSUdOQUxFRChzKSAmJiBXVEVSTVNJRyhzKSA9PSBTSUdJTlR9XSwgMCkgPSAxMzUzOAorICAgIHNsZWVwIHdhcyBraWxsZWQgYnkgImtpbGxhbGwgLVNJR0lOVCBzbGVlcCIKKzIzOjQ4OjM4LjUyMzk0NCAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMjM6NDg6MzguNTI0ODYxIGNsb25lKC4uLikgPSAxMzU0MgorMjM6NDg6MzguNTM4NzA2IHdhaXRwaWQoLTEsIDB4ZmZjODMyZWMsIDApID0gPyBFUkVTVEFSVFNZUyAoVG8gYmUgcmVzdGFydGVkKQorMjM6NDg6MzguNjI0NzYxIC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKyAgICBraWxsIC1TSUdJTlQgPGJhc2hfUElEPiBpcyBpZ25vcmVkLCBiYWNrIHRvIHdhaXRpbmc6CisyMzo0ODozOC42Mjg3MDYgd2FpdHBpZCgtMSwgW3tXSUZFWElURUQocykgJiYgV0VYSVRTVEFUVVMocykgPT0gMH1dLCAwKSA9IDEzNTQyCisgICAgc2xlZXAgZXhpdGVkIHdpdGggMAorMjM6NDg6NDMuNTI1Njc0IC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisyMzo0ODo0My41MjY1NjMgY2xvbmUoLi4uKSA9IDEzNTQ1CisyMzo0ODo0My41Mzg3MDkgd2FpdHBpZCgtMSwgW3tXSUZTSUdOQUxFRChzKSAmJiBXVEVSTVNJRyhzKSA9PSBTSUdJTlR9XSwgMCkgPSAxMzU0NQorICAgIHNsZWVwIHdhcyBraWxsZWQgYnkgImtpbGxhbGwgLVNJR0lOVCBzbGVlcCIKKzIzOjQ4OjQ0LjQ2Njg0OCAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMjM6NDg6NDQuNDY3NzM1IGNsb25lKC4uLikgPSAxMzU0OQorMjM6NDg6NDQuNDgxNzA2IHdhaXRwaWQoLTEsIDB4ZmZjODMyZWMsIDApID0gPyBFUkVTVEFSVFNZUyAoVG8gYmUgcmVzdGFydGVkKQorMjM6NDg6NDQuNTY3NzU3IC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKyAgICBraWxsIC1TSUdJTlQgPGJhc2hfUElEPiBpcyBpZ25vcmVkLCBiYWNrIHRvIHdhaXRpbmc6CisyMzo0ODo0NC41NzE3MDYgd2FpdHBpZCgtMSwgW3tXSUZFWElURUQocykgJiYgV0VYSVRTVEFUVVMocykgPT0gMH1dLCAwKSA9IDEzNTQ5CisgICAgc2xlZXAgZXhpdGVkIHdpdGggMAorMjM6NDg6NDkuNDY4NTUzIC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisyMzo0ODo0OS40Njk0NDUgY2xvbmUoLi4uKSA9IDEzNTUxCisyMzo0ODo0OS40ODE3MDggd2FpdHBpZCgtMSwgW3tXSUZTSUdOQUxFRChzKSAmJiBXVEVSTVNJRyhzKSA9PSBTSUdJTlR9XSwgMCkgPSAxMzU1MQorICAgIHNsZWVwIHdhcyBraWxsZWQgYnkgImtpbGxhbGwgLVNJR0lOVCBzbGVlcCIKKzIzOjQ4OjUwLjUxNTgzNyAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMjM6NDg6NTAuNTE2NzE4IGNsb25lKC4uLikgPSAxMzU1NQorMjM6NDg6NTAuNTMwNzA2IHdhaXRwaWQoLTEsIDB4ZmZjODMyZWMsIDApID0gPyBFUkVTVEFSVFNZUyAoVG8gYmUgcmVzdGFydGVkKQorMjM6NDg6NTAuNjE1NzYxIC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKyAgICBraWxsIC1TSUdJTlQgPGJhc2hfUElEPiBpcyBpZ25vcmVkLCBiYWNrIHRvIHdhaXRpbmc6CisyMzo0ODo1MC42MTk3MDUgd2FpdHBpZCgtMSwgW3tXSUZTSUdOQUxFRChzKSAmJiBXVEVSTVNJRyhzKSA9PSBTSUdJTlR9XSwgMCkgPSAxMzU1NQorICAgIHNsZWVwIHdhcyBraWxsZWQgYnkgImtpbGxhbGwgLVNJR0lOVCBzbGVlcCIuCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIG9uZSBpbiBhIHJvdy4gS2lsbCBvdXJzZWxmOgorMjM6NDg6NTEuNTA0NjA0IGtpbGwoMTM1MTUsIFNJR0lOVCkgICAgID0gMAorMjM6NDg6NTEuNTA0Njg5IC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKzIzOjQ4OjUxLjUwNDkxNSArKysga2lsbGVkIGJ5IFNJR0lOVCArKysKKworQXMgbG9uZyBhcyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgInNsZWVwIDUiIHdoaWNoIGV4aXRlZCBzdWNjZXNzZnVsbHkKKyhub3Qga2lsbGVkIGJ5IFNJR0lOVCksIGJhc2ggY29udGludWVzLiBUaGlzIGlzIG5vdCBkb2N1bWVudGVkIGFueXdoZXJlCitBRkFJS1MuCisKK1doeSBrZXlib2FyZCBeQyBhY3RzIGRpZmZlcmVudGx5PworCiswMDowODowNy42NTU5ODUgY2xvbmUoLi4uKSA9IDE0MjcwCiswMDowODowNy42Njk3MDcgd2FpdHBpZCgtMSwgW3tXSUZFWElURUQocykgJiYgV0VYSVRTVEFUVVMocykgPT0gMH1dLCAwKSA9IDE0MjcwCiswMDowODoxMi42NTY4NzIgLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzAwOjA4OjEyLjY1Nzc0MyBjbG9uZSguLi4pID0gMTQyNzMKKzAwOjA4OjEyLjY3MTcwOCB3YWl0cGlkKC0xLCBbe1dJRlNJR05BTEVEKHMpICYmIFdURVJNU0lHKHMpID09IFNJR0lOVH1dLCAwKSA9IDE0MjczCiswMDowODoxMy44MTA3NzggLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorMDA6MDg6MTMuODE4NzA1IGtpbGwoMTQyNjksIFNJR0lOVCkgICAgID0gMAorMDA6MDg6MTMuODIwMTAzIC0tLSBTSUdJTlQgKEludGVycnVwdCkgQCAwICgwKSAtLS0KKzAwOjA4OjEzLjgyMDkyNSArKysga2lsbGVkIGJ5IFNJR0lOVCArKysKKworUGVyaGFwcyBiZWNhdXNlIGF0IHRoZSBtb21lbnQgYmFzaCBnb3QgU0lHSU5UIGl0IGhhZCBubyBjaGlsZHJlbj8KKyhpdCBkaWQgbm90IG1hbmFnZSB0byBzcGF3biBuZXcgc2xlZXAgeWV0LCBzZWUgdGhlIHRyYWNlKQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3B0cl9oYWNrLmMgYi9zaGVsbC9hc2hfcHRyX2hhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk4NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3B0cl9oYWNrLmMKQEAgLTAsMCArMSwyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitzdHJ1Y3QgZ2xvYmFsc19taXNjOworc3RydWN0IGdsb2JhbHNfbWVtc3RhY2s7CitzdHJ1Y3QgZ2xvYmFsc192YXI7CisKKyNpZm5kZWYgR0NDX0NPTUJJTkUKKworLyogV2UgY2hlYXQgaGVyZS4gVGhleSBhcmUgZGVjbGFyZWQgYXMgY29uc3QgcHRyIGluIGFzaC5jLAorICogYnV0IGhlcmUgd2UgbWFrZSB0aGVtIGxpdmUgaW4gUi9XIG1lbW9yeSAqLworc3RydWN0IGdsb2JhbHNfbWlzYyAgICAgKmFzaF9wdHJfdG9fZ2xvYmFsc19taXNjOworc3RydWN0IGdsb2JhbHNfbWVtc3RhY2sgKmFzaF9wdHJfdG9fZ2xvYmFsc19tZW1zdGFjazsKK3N0cnVjdCBnbG9iYWxzX3ZhciAgICAgICphc2hfcHRyX3RvX2dsb2JhbHNfdmFyOworCisjZWxzZQorCisvKiBnY2MgLWNvbWJpbmUgd2lsbCBzZWUgdGhyb3VnaCBhbmQgY29tcGxhaW4gKi8KKy8qIFVzaW5nIGFsdGVybmF0aXZlIG1ldGhvZCB3aGljaCBpcyBtb3JlIGxpa2VseSB0byBicmVhaworICogb24gd2VpcmQgYXJjaGl0ZWN0dXJlcywgY29tcGlsZXJzLCBsaW5rZXJzIGFuZCBzbyBvbiAqLworc3RydWN0IGdsb2JhbHNfbWlzYyAgICAgKmNvbnN0IGFzaF9wdHJfdG9fZ2xvYmFsc19taXNjIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworc3RydWN0IGdsb2JhbHNfbWVtc3RhY2sgKmNvbnN0IGFzaF9wdHJfdG9fZ2xvYmFsc19tZW1zdGFjayBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKK3N0cnVjdCBnbG9iYWxzX3ZhciAgICAgICpjb25zdCBhc2hfcHRyX3RvX2dsb2JhbHNfdmFyIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hbGlhcy9hbGlhcy5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hbGlhcy9hbGlhcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY3YjIxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFsaWFzL2FsaWFzLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorYWxpYXM6IDAKK2FsaWFzOiAwCisuL2FsaWFzLnRlc3RzOiBsaW5lIDI1OiBxZm9vOiBub3QgZm91bmQKK3F1dXgKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hbGlhcy9hbGlhcy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hbGlhcy9hbGlhcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDA3YjBiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFsaWFzL2FsaWFzLnRlc3RzCkBAIC0wLDAgKzEsMzcgQEAKKyMgcGxhY2UgaG9sZGVyIGZvciBmdXR1cmUgYWxpYXMgdGVzdGluZworI2FzaCMgc2hvcHQgLXMgZXhwYW5kX2FsaWFzZXMKKworIyBhbGlhcy91bmFsaWFzIHRlc3RzIG9yaWdpbmFsbHkgaW4gYnVpbHRpbnMudGVzdHMKKwordW5hbGlhcyAtYQorIyB0aGlzIHNob3VsZCByZXR1cm4gc3VjY2VzcywgYWNjb3JkaW5nIHRvIFBPU0lYLjIKK2FsaWFzCitlY2hvIGFsaWFzOiAkPworYWxpYXMgZm9vPWJhcgordW5hbGlhcyBmb28KKyMgdGhpcyBoYWQgYmV0dGVyIHJldHVybiBzdWNjZXNzLCBhY2NvcmRpbmcgdG8gUE9TSVguMgorYWxpYXMKK2VjaG8gYWxpYXM6ICQ/CisKKyMgYnVnIGluIGFsbCB2ZXJzaW9ucyB0aHJvdWdoIGJhc2gtMi4wNWIKKwordW5hbGlhcyBxZm9vIHFiYXIgcWJheiBxdXV4IDI+L2Rldi9udWxsCisKK2FsaWFzIHFmb289cWJhcgorYWxpYXMgcWJhcj1xYmF6CithbGlhcyBxYmF6PXF1dXgKK2FsaWFzIHF1dXg9cWZvbworCitxZm9vCisKK3VuYWxpYXMgcWZvbyBxYmFyIHFiYXogcXV1eAorCit1bmFsaWFzIC1hCisKK2FsaWFzIGZvbz0nZWNobyAnCithbGlhcyBiYXI9YmF6CithbGlhcyBiYXo9cXV1eAorCitmb28gYmFyCisKK3VuYWxpYXMgZm9vIGJhciBiYXoKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9SRUFETUUuYXNoIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL1JFQURNRS5hc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMjJlZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9SRUFETUUuYXNoCkBAIC0wLDAgKzEgQEAKK3RoZXJlIGlzIG5vIHN1cHBvcnQgZm9yICgoICkpIGNvbnN0cnVjdHMgaW4gYXNoCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtYmFzaDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtYmFzaDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2MWRhMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1iYXNoMS5yaWdodApAQCAtMCwwICsxLDIgQEAKKzEKKzAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1iYXNoMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1iYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMzdiNzMwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWJhc2gxLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorIyBjaGVja3MgZm9yIFtbIF1dCisKKyMgJiYgYW5kIHx8CitbWyBhICYmICIiIF1dOyBlY2hvICQ/CitbWyBhIHx8ICIiIF1dOyBlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtZm9yLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWZvci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRiYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWZvci5yaWdodApAQCAtMCwwICsxLDc0IEBACiswCisxCisyCiswCisxCisyCiswCisxCisyCiswCisyCis0CitmeCBpcyBhIGZ1bmN0aW9uCitmeCAoKQoreworICAgIGk9MDsKKyAgICBmb3IgKCgxOyBpIDwgMzsgaSsrICkpCisgICAgZG8KKyAgICAgICAgZWNobyAkaTsKKyAgICBkb25lOworICAgIGZvciAoKGk9MDsgMTsgaSsrICkpCisgICAgZG8KKyAgICAgICAgaWYgKCggaSA+PSAzICkpOyB0aGVuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmk7CisgICAgICAgIGVjaG8gJGk7CisgICAgZG9uZTsKKyAgICBmb3IgKChpPTA7IGk8MzsgMSkpCisgICAgZG8KKyAgICAgICAgZWNobyAkaTsKKyAgICAgICAgKCggaSsrICkpOworICAgIGRvbmU7CisgICAgaT0wOworICAgIGZvciAoKDE7IDE7IDEpKQorICAgIGRvCisgICAgICAgIGlmICgoIGkgPiAyICkpOyB0aGVuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmk7CisgICAgICAgIGVjaG8gJGk7CisgICAgICAgICgoIGkrKyApKTsKKyAgICBkb25lOworICAgIGk9MDsKKyAgICBmb3IgKCgxOyAxOyAxKSkKKyAgICBkbworICAgICAgICBpZiAoKCBpID4gMiApKTsgdGhlbgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpOworICAgICAgICBlY2hvICRpOworICAgICAgICAoKCBpKysgKSk7CisgICAgZG9uZQorfQorMAorMQorMgorMAorMQorMgorMAorMQorMgorMAorMQorMgorMAorMQorMgorLi9hcml0aC1mb3IudGVzdHM6IGxpbmUgNzc6IHN5bnRheCBlcnJvcjogYXJpdGhtZXRpYyBleHByZXNzaW9uIHJlcXVpcmVkCisuL2FyaXRoLWZvci50ZXN0czogbGluZSA3Nzogc3ludGF4IGVycm9yOiBgKCggaT0wOyAiaSA8IDMiICkpJworMgorLi9hcml0aC1mb3IudGVzdHM6IGxpbmUgODM6IHN5bnRheCBlcnJvcjogYDsnIHVuZXhwZWN0ZWQKKy4vYXJpdGgtZm9yLnRlc3RzOiBsaW5lIDgzOiBzeW50YXggZXJyb3I6IGAoKCBpPTA7IGkgPCAzOyBpKys7IDcgKSknCisyCisyMAorMjAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1mb3IudGVzdHN4IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWZvci50ZXN0c3gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGZhMzBmZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1mb3IudGVzdHN4CkBAIC0wLDAgKzEsOTQgQEAKK2Z4KCkKK3sKK2k9MAorZm9yICgoIDsgaSA8IDM7IGkrKyApKQorZG8KKwllY2hvICRpCitkb25lCisKK2ZvciAoKCBpPTA7IDsgaSsrICkpCitkbworCWlmICgoIGkgPj0gMyApKTsgdGhlbgorCQlicmVhazsKKwlmaQorCWVjaG8gJGkKK2RvbmUKKworZm9yICgoIGk9MDsgaTwzOyApKQorZG8KKwllY2hvICRpCisJKCggaSsrICkpCitkb25lCisKK2k9MAorZm9yICgoIDsgOyApKQorZG8KKwlpZiAoKCBpID4gMiApKTsgdGhlbgorCQlicmVhazsKKwlmaQorCWVjaG8gJGk7CisJKCggaSsrICkpCitkb25lCisKK2k9MAorZm9yICgoOzspKQorZG8KKwlpZiAoKCBpID4gMiApKTsgdGhlbgorCQlicmVhazsKKwlmaQorCWVjaG8gJGk7CisJKCggaSsrICkpCitkb25lCit9CisKK2ZvciAoKCBpPTA7ICJpIDwgMyIgOyBpKysgKSkKK2RvCisJZWNobyAkaQorZG9uZQorCitpPTAKK2ZvciAoKCA7ICJpIDwgMyI7IGkrKyApKQorZG8KKwllY2hvICRpCitkb25lCisKK2ZvciAoKCBpPTA7IDsgaSsrICkpCitkbworCWlmICgoIGkgPj0gMyApKTsgdGhlbgorCQlicmVhazsKKwlmaQorCWVjaG8gJGkKK2RvbmUKKworZm9yICgoaSA9IDA7IDtpKysgKSkKK2RvCisJZWNobyAkaQorCWlmICgoIGkgPCAzICkpOyB0aGVuCisJCSgoIGkrKyApKQorCQljb250aW51ZTsKKwlmaQorCWJyZWFrCitkb25lCisKK3R5cGUgZngKK2Z4CisKKyMgZXJyb3JzCitmb3IgKCggaT0wOyAiaSA8IDMiICkpCitkbworCWVjaG8gJGkKK2RvbmUKK2VjaG8gJD8KKworZm9yICgoIGk9MDsgaSA8IDM7IGkrKzsgNyApKQorZG8KKwllY2hvICRpCitkb25lCitlY2hvICQ/CisKKyMgb25lLWxpbmVycyBhZGRlZCBpbiBwb3N0LWJhc2gtMi4wNAorZm9yICAgICAoKGk9MDsgaSA8IDIwOyBpKyspKSBkbyA6IDsgZG9uZQorZWNobyAkaQorCitmb3IgICAgICgoaT0wOyBpIDwgMjA7IGkrKykpIHsgOiA7IH0KK2VjaG8gJGkKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjljYThlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLnJpZ2h0CkBAIC0wLDAgKzEsMTM4IEBACitGb3JtYXQ6ICdleHBlY3RlZCBhY3R1YWwnCisxNjMgMTYzCis0IDQKKzE2IDE2Cis4IDgKKzIgMgorNCA0CisyIDIKKzIgMgorMSAxCiswIDAKKzAgMAorMCAwCisxIDEKKzEgMQorMiAyCistMyAtMworLTIgLTIKKzEgMQorMCAwCisyIDIKKzEzMTA3MiAxMzEwNzIKKzI5IDI5CiszMyAzMworNDkgNDkKKzEgMQorMSAxCiswIDAKKzAgMAorMSAxCisxIDEKKzEgMQorMiAyCiszIDMKKzEgMQorNTggNTgKKzIgMgorNjAgNjAKKzEgMQorMjU2IDI1NgorMTYgMTYKKzYyIDYyCis0IDQKKzI5IDI5Cis1IDUKKy00IC00Cis0IDQKKzEgMQorMzIgMzIKKzMyIDMyCisxIDEKKzEgMQorMzIgMzIKKzIwIDIwCiszMCAzMAorMjAgMjAKKzMwIDMwCisuL2FyaXRoLnRlc3RzOiBsaW5lIDExNzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzYgNgorNiw1LDMgNiw1LDMKKzI2MyAyNjMKKzI1NSAyNTUKKzQwIDQwCisuL2FyaXRoLnRlc3RzOiBsaW5lIDE2MzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTY1OiBkaXZpZGUgYnkgemVybworLi9hcml0aC50ZXN0czogbGV0OiBsaW5lIDE2NjogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTY3OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGV0OiBsaW5lIDE2ODogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2FiYworZGVmCitnaGkKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTkxOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorMTYgMTYKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTk2OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAxOTc6IG1hbGZvcm1lZCA/OiBvcGVyYXRvcgorLi9hcml0aC50ZXN0czogbGluZSAxOTg6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis5IDkKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjA1OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAyMDg6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis5IDkKKzkgOQorOSA5Cis3IDcKKzcKKzQgNAorMzI3NjcgMzI3NjcKKzMyNzY4IDMyNzY4CisxMzEwNzIgMTMxMDcyCisyMTQ3NDgzNjQ3IDIxNDc0ODM2NDcKKzEgMQorNCA0Cis0IDQKKzUgNQorNSA1Cis0IDQKKzMgMworMyAzCis0IDQKKzQgNAorLi9hcml0aC50ZXN0czogbGluZSAyNTc6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDI1OTogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjYwOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAyNjI6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDI2MzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzQgNAorNyA3CistNyAtNworLi9hcml0aDEuc3ViOiBsaW5lIDI6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMS5zdWI6IGxpbmUgMzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgxLnN1YjogbGluZSA0OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDEuc3ViOiBsaW5lIDU6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis2IDYKKzMgMworNyA3Cis0IDQKKzAgMAorMyAzCis3IDcKKzIgMgorLTIgLTIKKzEgMQorLi9hcml0aDEuc3ViOiBsaW5lIDM3OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDIuc3ViOiBsaW5lIDI6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMi5zdWI6IGxpbmUgMzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgyLnN1YjogbGluZSA0OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDIuc3ViOiBsaW5lIDU6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis1IDUKKzEgMQorNCA0CiswIDAKKy4vYXJpdGgyLnN1YjogbGluZSA0MjogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgyLnN1YjogbGluZSA0NzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzggMTIKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjkwOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNDIKKzQyCis0MgorLi9hcml0aC50ZXN0czogbGluZSAzMDI6IGFbYltjXWRdPWU6IG5vdCBmb3VuZApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2NTc1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgudGVzdHMKQEAgLTAsMCArMSwzMDIgQEAKKyNhc2gjIHNldCArbyBwb3NpeAorI2FzaCMgZGVjbGFyZSAtaSBpdiBqdgorCitlY2hvICJGb3JtYXQ6ICdleHBlY3RlZCBhY3R1YWwnIgorCitpdj0kKCggMyArIDUgKiAzMiApKQorZWNobyAxNjMgJGl2CisjYXNoIyBpdj1pdiszCisjYXNoIyBlY2hvIDE2NiAkaXYKK2l2PTIKK2p2PWl2CisKK2xldCAianYgKj0gMiIKK2VjaG8gNCAkanYKK2p2PSQoKCAkanYgPDwgMiApKQorZWNobyAxNiAkanYKKworbGV0IGp2PSIkanYgLyAyIgorZWNobyA4ICRqdgorI2FzaCMganY9Imp2ID4+IDIiCisgICAgICBsZXQganY9Imp2ID4+IDIiCitlY2hvIDIgJGp2CisKK2l2PSQoKGl2KyAkanYpKQorZWNobyA0ICRpdgorZWNobyAyICQoKGl2IC09IGp2KSkKK2VjaG8gMiAkaXYKK2VjaG8gMSAkKCggaXYgPT0ganYgKSkKK2VjaG8gMCAkKCggaXYgIT0gJGp2ICkpCitlY2hvIDAgJCgoIGl2IDwganYgKSkKK2VjaG8gMCAkKCggJGl2ID4gJGp2ICkpCitlY2hvIDEgJCgoIGl2IDw9ICRqdiApKQorZWNobyAxICQoKCAkaXYgPj0ganYgKSkKKworZWNobyAyICRqdgorZWNobyAtMyAkKCggfiRqdiApKQorZWNobyAtMiAkKCggfjEgKSkKK2VjaG8gMSAkKCggISAwICkpCisKK2VjaG8gMCAkKCgganYgJSAyICkpCitlY2hvIDIgJCgoICRpdiAlIDQgKSkKKworZWNobyAxMzEwNzIgJCgoIGl2IDw8PSAxNiApKQorZWNobyAyOSAkKCggaXYgJT0gMzMgKSkKKworZWNobyAzMyAkKCggMzMgJiA1NSApKQorZWNobyA0OSAkKCggMzMgfCAxNyApKQorCitlY2hvIDEgJCgoIGl2ICYmICRqdiApKQorZWNobyAxICQoKCAkaXYgfHwganYgKSkKKworZWNobyAwICQoKCBpdiAmJiAwICkpCitlY2hvIDAgJCgoIGl2ICYgMCApKQorZWNobyAxICQoKCBpdiAmJiAxICkpCitlY2hvIDEgJCgoIGl2ICYgMSApKQorCitlY2hvIDEgJCgoICRqdiB8fCAwICkpCitlY2hvIDIgJCgoIGp2IHwgMCApKQorZWNobyAzICQoKCBqdiB8IDEgKSkKK2VjaG8gMSAkKCggJGp2IHx8IDEgKSkKKworbGV0ICdpdiAqPSBqdicKK2VjaG8gNTggJGl2CitlY2hvIDIgJGp2CitsZXQgImp2ICs9ICRpdiIKK2VjaG8gNjAgJGp2CisKK2VjaG8gMSAkKCgganYgLz0gaXYgKSkKK2VjaG8gMjU2ICQoKCBqdiA8PD0gOCApKQorZWNobyAxNiAkKCgganYgPj49IDQgKSkKKworZWNobyA2MiAkKCggaXYgfD0gNCApKQorZWNobyA0ICQoKCBpdiAmPSA0ICkpCisKK2VjaG8gMjkgJCgoIGl2ICs9IChqdiArIDkpKSkKK2VjaG8gNSAkKCggKGl2ICsgNCkgJSA3ICkpCisKKyMgdW5hcnkgcGx1cywgbWludXMKK2VjaG8gLTQgJCgoICs0IC0gOCApKQorZWNobyA0ICQoKCAtNCArIDggKSkKKworIyBjb25kaXRpb25hbCBleHByZXNzaW9ucworZWNobyAxICQoKCA0PDUgPyAxIDogMzIpKQorZWNobyAzMiAkKCggND41ID8gMSA6IDMyKSkKK2VjaG8gMzIgJCgoIDQ+KDIrMykgPyAxIDogMzIpKQorZWNobyAxICQoKCA0PCgyKzMpID8gMSA6IDMyKSkKK2VjaG8gMSAkKCggKDIrMik8KDIrMykgPyAxIDogMzIpKQorZWNobyAzMiAkKCggKDIrMik+KDIrMykgPyAxIDogMzIpKQorCisjIGNoZWNrIHRoYXQgdGhlIHVuZXZhbHVhdGVkIHBhcnQgb2YgdGhlIHRlcm5hcnkgb3BlcmF0b3IgZG9lcyBub3QgZG8KKyMgZXZhbHVhdGlvbiBvciBhc3NpZ25tZW50Cit4PWkrPTIKK3k9ais9MgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0xCisgICAgICBpPTEKKyAgICAgIGo9MQorZWNobyAyMCAkKCgxID8gMjAgOiAoeCs9MikpKQorI2FzaCMgZWNobyAkaSwkeCAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKK2VjaG8gMzAgJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKyNhc2gjIGVjaG8gJGosJHkgICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCisKK3g9aSs9MgoreT1qKz0yCisjYXNoIyBkZWNsYXJlIC1pIGk9MSBqPTEKKyAgICAgIGk9MQorICAgICAgaj0xCitlY2hvIDIwICQoKDEgPyAyMCA6ICh4Kz0yKSkpCisjYXNoIyBlY2hvICRpLCR4ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworZWNobyAzMCAkKCgwID8gKHkrPTIpIDogMzApKQorI2FzaCMgZWNobyAkaSwkeSAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKKworIyBjaGVjayBwcmVjZWRlbmNlIG9mIGFzc2lnbm1lbnQgdnMuIGNvbmRpdGlvbmFsIG9wZXJhdG9yCisjIHNob3VsZCBiZSBhbiBlcnJvcgorI2FzaCMgZGVjbGFyZSAtaSB4PTIKKyAgICAgIHg9MgorI2FzaG5vdGUjIGJhc2ggcmVwb3J0cyBlcnJvciBidXQgY29udGludWVzLCBhc2ggYWJvcnRzIC0gdXNpbmcgc3Vic2hlbGwgdG8gJ2VtdWxhdGUnIGJhc2g6CisoICB5PSQoKDEgPyAyMCA6IHgrPTIpKSAgKQorCisjIGNoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKKyNhc2gjIGRlY2xhcmUgLWkgeD0yCisgICAgICB4PTIKKyMgYXNoIHNheXMgImxpbmUgTk5OOiBzeW50YXggZXJyb3I6IDAgPyB4Kz0yIDogMjAiCisjYXNoIyBlY2hvIDIwICQoKDAgPyB4Kz0yIDogMjApKQorCisjIGFzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0yIGs9MworaT0xCitqPTIKK2s9MworZWNobyA2ICQoKGkgKz0gaiArPSBrKSkKK2VjaG8gNiw1LDMgJGksJGosJGsKKworIyBvY3RhbCwgaGV4CitlY2hvIDI2MyAkKCggMHgxMDAgfCAwMDcgKSkKK2VjaG8gMjU1ICQoKCAweGZmICkpCisjYXNoIyBlY2hvIDI1NSAkKCggMTYjZmYgKSkKKyNhc2gjIGVjaG8gMTI3ICQoKCAxNiNGRi8yICkpCisjYXNoIyBlY2hvIDM2ICQoKCA4IzQ0ICkpCisKK2VjaG8gNDAgJCgoIDggXiAzMiApKQorCisjYXNoIyAjIG90aGVyIGJhc2VzCisjYXNoIyBlY2hvIDEwICQoKCAxNiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCAzMiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCA1NiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCA2NCNhICkpCisjYXNoIworI2FzaCMgZWNobyAxMCAkKCggMTYjQSApKQorI2FzaCMgZWNobyAxMCAkKCggMzIjQSApKQorI2FzaCMgZWNobyAzNiAkKCggNTYjQSApKQorI2FzaCMgZWNobyAzNiAkKCggNjQjQSApKQorI2FzaCMKKyNhc2gjIGVjaG8gNjIgJCgoIDY0I0AgKSkKKyNhc2gjIGVjaG8gNjMgJCgoIDY0I18gKSkKKworI2FzaCMgIyB3ZWlyZCBiYXNlcyAoZXJyb3IpCisjYXNoIyBlY2hvICQoKCAzNDI1IzU2ICkpCisKKyNhc2gjICMgbWlzc2luZyBudW1iZXIgYWZ0ZXIgYmFzZQorI2FzaCMgZWNobyAwICQoKCAyIyApKQorCisjIHRoZXNlIHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMKKyggIGVjaG8gJCgoIDcgPSA0MyApKSAgICAgICkKKyNhc2gjIGVjaG8gJCgoIDIjNDQgKSkKKyggIGVjaG8gJCgoIDQ0IC8gMCApKSAgICAgICkKKyggIGxldCAnanYgKz0gJGl2JyAgICAgICAgICkKKyggIGVjaG8gJCgoIGp2ICs9IFwkaXYgKSkgICkKKyggIGxldCAncnYgPSA3ICsgKDQzICogNicgICkKKworI2FzaCMgIyBtb3JlIGVycm9ycworI2FzaCMgZGVjbGFyZSAtaSBpCisjYXNoIyBpPTAjNAorI2FzaCMgaT0yIzExMCMxMQorCisoKGVjaG8gYWJjOyBlY2hvIGRlZjspOyBlY2hvIGdoaSkKKworI2FzaCMgaWYgKCgoNCs0KSArICg0ICsgNykpKTsgdGhlbgorI2FzaCMgCWVjaG8gb2sKKyNhc2gjIGZpCisKKyNhc2gjICgoKSkJIyBtYWtlIHN1cmUgdGhlIG51bGwgZXhwcmVzc2lvbiB3b3JrcyBPSworCisjYXNoIyBhPSgwIDIgNCA2KQorI2FzaCMgZWNobyA2ICQoKCBhWzFdICsgYVsyXSApKQorI2FzaCMgZWNobyAxICQoKCAoYVsxXSArIGFbMl0pID09IGFbM10gKSkKKyNhc2gjICgoIChhWzFdICsgYVsyXSkgPT0gYVszXSApKSA7IGVjaG8gMCAkPworCisjIHRlc3QgcHVzaGluZyBhbmQgcG9wcGluZyB0aGUgZXhwcmVzc2lvbiBzdGFjawordW5zZXQgQQorQT0iNCArICIKKyggIGVjaG8gQSAkKCggKCA0ICsgQSApICsgNCApKSAgKQorQT0iMyArIDUiCitlY2hvIDE2ICQoKCAoIDQgKyBBICkgKyA0ICkpCisKKyMgYmFkbHktZm9ybWVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCisoICBlY2hvICQoKCA0ID8gOiAkQSApKSAgKQorKCAgZWNobyAkKCggMSA/IDIwICkpICAgICkKKyggIGVjaG8gJCgoIDQgPyAyMCA6ICkpICApCisKKyMgcHJlY2VkZW5jZSBhbmQgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uCitCPTkKK2VjaG8gOSAkQgorCisjIGVycm9yCisoICBlY2hvICQoKCAwICYmIEI9NDIgKSk7IGVjaG8gOSAkQiAgKQorCisjIGVycm9yCisoICBlY2hvICQoKCAxIHx8IEI9ODggKSk7IGVjaG8gOSAkQiAgKQorCisjIGFzaCBtaXN0YWtlbmx5IGV2YWx1YXRlcyBCPS4uLiBiZWxvdworI2FzaCMgZWNobyAwICQoKCAwICYmIChCPTQyKSApKQorZWNobyA5ICRCCisjYXNoIyBlY2hvIDAgJCgoICgkeyR9IC0gJCQpICYmIChCPTQyKSApKQorZWNobyA5ICRCCisjYXNoIyBlY2hvIDEgJCgoIDEgfHwgKEI9ODgpICkpCitlY2hvIDkgJEIKKworCisjIHVudGlsIGNvbW1hbmQgd2l0aCAoKCApKSBjb21tYW5kCit4PTcKKworZWNobyA3ICR4CisjYXNoIyB1bnRpbCAoKCB4ID09IDQgKSkKKyAgICAgIHVudGlsIHRlc3QgIiR4IiA9IDQKK2RvCisJZWNobyAkeAorCXg9NAorZG9uZQorCitlY2hvIDQgJHgKKworIyBleHBvbmVudGlhdGlvbgorZWNobyAzMjc2NyAkKCggMioqMTUgLSAxKSkKK2VjaG8gMzI3NjggJCgoIDIqKigxNi0xKSkpCitlY2hvIDEzMTA3MiAkKCggMioqMTYqMiApKQorZWNobyAyMTQ3NDgzNjQ3ICQoKCAyKiozMS0xKSkKK2VjaG8gMSAkKCggMioqMCApKQorCisjIHtwcmUscG9zdH0te2luYyxkZWN9cmVtZW50IGFuZCBhc3NvY2lhdGVkIGVycm9ycworCit4PTQKKworZWNobyA0ICR4CitlY2hvIDQgJCgoIHgrKyApKQorZWNobyA1ICR4CitlY2hvIDUgJCgoIHgtLSApKQorZWNobyA0ICR4CisKK2VjaG8gMyAkKCggLS14ICkpCitlY2hvIDMgJHgKKworZWNobyA0ICQoKCArK3ggKSkKK2VjaG8gNCAkeAorCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcKKyNhc2gjIGVjaG8gNyAkKCggKys3ICkpCisoICBlY2hvICQoKCA3LS0gKSkgICAgKQorCisoICBlY2hvICQoKCAtLXg9NyApKSAgKQorKCAgZWNobyAkKCggKyt4PTcgKSkgICkKKworKCAgZWNobyAkKCggeCsrPTcgKSkgICkKKyggIGVjaG8gJCgoIHgtLT03ICkpICApCisKK2VjaG8gNCAkeAorCitlY2hvIDcgJCgoICs3ICkpCitlY2hvIC03ICQoKCAtNyApKQorCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcKKyNhc2gjIGVjaG8gJCgoICsrNyApKQorI2FzaCMgZWNobyAkKCggLS03ICkpCisKKyR7VEhJU19TSH0gLi9hcml0aDEuc3ViCiske1RISVNfU0h9IC4vYXJpdGgyLnN1YgorCit4PTQKK3k9NworCisjYXNoIyAoKCB4PTggLCB5PTEyICkpCisgICAgICB4PTgKKyAgICAgIHk9MTIKK2VjaG8gJHggJHkKKworI2FzaCMgIyBzaG91bGQgYmUgYW4gZXJyb3IKKyNhc2gjICgoIHg9OSB5PTQxICkpCisKKyMgVGhlc2UgYXJlIGVycm9ycwordW5zZXQgYgorKCAgZWNobyAkKChhIGIpKSAgKQorI2FzaCMgKChhIGIpKQorCituPTQyCitwcmludGYgIiVkXG4iICRuCitwcmludGYgIiVpXG4iICRuCisjYXNoIyBlY2hvICQoKCA4IyQocHJpbnRmICIlb1xuIiAkbikgKSkKK3ByaW50ZiAiJXVcbiIgJG4KKyNhc2gjIGVjaG8gJCgoIDE2IyQocHJpbnRmICIleFxuIiAkbikgKSkKKyNhc2gjIGVjaG8gJCgoIDE2IyQocHJpbnRmICIlWFxuIiAkbikgKSkKKworIyBjYXVzZXMgbG9uZ2ptcCBib3RjaGVzIHRocm91Z2ggYmFzaC0yLjA1YgorYVtiW2NdZF09ZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoMS5zdWIgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgxLnN1YgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MGFhOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoMS5zdWIKQEAgLTAsMCArMSw0MCBAQAorIyB0ZXN0IG9mIHJlZG9uZSBwb3N0LWluY3JlbWVudCBhbmQgcG9zdC1kZWNyZW1lbnQgY29kZQorKCAgZWNobyAkKCggNC0tICkpICAgKQorKCAgZWNobyAkKCggNCsrICkpICAgKQorKCAgZWNobyAkKCggNCAtLSApKSAgKQorKCAgZWNobyAkKCggNCArKyApKSAgKQorCisjYXNoIyAoKCBhcnJheVswXSsrICkpCisjYXNoIyBlY2hvICR7YXJyYXl9CisKKyNhc2gjICgoIGFycmF5WzBdICsrICkpCisjYXNoIyBlY2hvICR7YXJyYXl9CisKKyNhc2gjICgoIGErKyApKQorI2FzaCMgZWNobyAkYQorI2FzaCMgKCggYSArKyApKQorI2FzaCMgZWNobyAkYQorICAgICAgYT0yCisKK2VjaG8gNiAkKCggYSArKyArIDQgKSkKK2VjaG8gMyAkYQorCitlY2hvIDcgJCgoIGErKys0ICkpCitlY2hvIDQgJGEKKworZWNobyAwICQoKCBhLS0tNCApKQorZWNobyAzICRhCisKK2VjaG8gNyAkKCggYSAtLSArIDQgKSkKK2VjaG8gMiAkYQorCitlY2hvIC0yICQoKCBhIC0tIC0gNCApKQorZWNobyAxICRhCisKKyNhc2gjICgoICsrICsgNyApKQorCisjYXNoIyAoKCArKyApKQorKCAgZWNobyAkKCggKysrNyApKSAgKQorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrICs3IGlzIDcKKyNhc2gjIGVjaG8gJCgoICsrICsgNyApKQorI2FzaCMgKCggLS0gKSkKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aDIuc3ViIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoMi5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjdlM2M5MgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aDIuc3ViCkBAIC0wLDAgKzEsNTcgQEAKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKzcgaXMgNyBldGMKKyggIGVjaG8gJCgoIC0tNyApKSAgICkKKyggIGVjaG8gJCgoICsrNyApKSAgICkKKyggIGVjaG8gJCgoIC0tIDcgKSkgICkKKyggIGVjaG8gJCgoICsrIDcgKSkgICkKKworI2FzaCMgKCgrK2FycmF5WzBdICkpCisjYXNoIyBlY2hvIDEgJGFycmF5CisjYXNoIyAoKCArKyBhcnJheVswXSApKQorI2FzaCMgZWNobyAyICRhcnJheQorCisjYXNoIyAoKCArK2EgKSkKKyNhc2gjIGVjaG8gMSAkYQorI2FzaCMgKCggKysgYSApKQorI2FzaCMgZWNobyAyICRhCisKKyNhc2gjICgoIC0tYSApKQorI2FzaCMgZWNobyAxICRhCisjYXNoIyAoKCAtLSBhICkpCisjYXNoIyBlY2hvIDAgJGEKKyAgICAgIGE9MAorCitlY2hvIDUgJCgoIDQgKyArK2EgKSkKK2VjaG8gMSAkYQorCisjIGFzaCBkb2Vzbid0IGhhbmRsZSBpdCByaWdodC4uLgorI2FzaCMgZWNobyA2ICQoKCA0KysrYSApKQorI2FzaCMgZWNobyAyICRhCisgICAgICBhPTIKKworIyBhc2ggZG9lc24ndCBoYW5kbGUgaXQgcmlnaHQuLi4KKyNhc2gjIGVjaG8gMyAkKCggNC0tLWEgKSkKKyNhc2gjIGVjaG8gMSAkYQorICAgICAgYT0xCisKK2VjaG8gNCAkKCggNCAtIC0tIGEgKSkKK2VjaG8gMCAkYQorCisjYXNoIyAoKCAtLSApKQorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0IC0tLTcgaXMgLTcKKyNhc2gjIGVjaG8gJCgoIC0tLTcgKSkKKyggIGVjaG8gJCgoIC0tIC0gNyApKSAgKQorCisjYXNoIyAoKCArKyApKQorIyBiYXNoIDMuMjogNworI2FzaCMgZWNobyA3ICQoKCArKzcgKSkKKyggIGVjaG8gJCgoICsrICsgNyApKSAgKQorCisjIGJhc2ggMy4yOiAtNworI2FzaCMgZWNobyAtNyAkKCggKystNyApKQorIyBiYXNoIDMuMjogLTcKKyNhc2gjIGVjaG8gLTcgJCgoICsrIC0gNyApKQorCisjIGJhc2ggMy4yOiA3CisjYXNoIyBlY2hvIDcgJCgoICstLTcgKSkKKyMgYmFzaCAzLjI6IDcKKyNhc2gjIGVjaG8gNyAkKCggLS0gKyA3ICkpCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtaGVyZWRvYy9oZXJlZG9jLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYxMTUxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy5yaWdodApAQCAtMCwwICsxLDIxIEBACit0aGVyZQorb25lIC0gYWxwaGEKK3R3byAtIGJldGEKK3RocmVlIC0gZ2FtbWEKK2hpXAordGhlcmUkYQorc3R1ZmYKK2hpXAordGhlcmUKK0VPXAorRgoraGkKK3RhYiAxCit0YWIgMgordGFiIDMKK2FiYworZGVmIGdoaQoramtsIG1ubworZmZmIGlzIGEgc2hlbGwgZnVuY3Rpb24KK2hpCit0aGVyZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjNjZGMzZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MudGVzdHMKQEAgLTAsMCArMSw5NCBAQAorIyBjaGVjayBvcmRlciBhbmQgY29udGVudCBvZiBtdWx0aXBsZSBoZXJlIGRvY3MKKworY2F0IDw8IEVPRjEgPDwgRU9GMgoraGkKK0VPRjEKK3RoZXJlCitFT0YyCisKK3doaWxlIHJlYWQgbGluZTE7IGRvCisJcmVhZCBsaW5lMiA8JjMKKwllY2hvICRsaW5lMSAtICRsaW5lMgorZG9uZSA8PEVPRjEgMzw8RU9GMgorb25lCit0d28KK3RocmVlCitFT0YxCithbHBoYQorYmV0YQorZ2FtbWEKK0VPRjIKKworCisjIGNoZWNrIHF1b3RlZCBoZXJlLWRvYyBpcyBwcm90ZWN0ZWQKKworYT1mb28KK2NhdCA8PCAnRU9GJworaGlcCit0aGVyZSRhCitzdHVmZgorRU9GCisKKyMgY2hlY2sgdGhhdCBxdW90ZWQgaGVyZS1kb2N1bWVudHMgZG9uJ3QgaGF2ZSBcbmV3bGluZSBwcm9jZXNzaW5nIGRvbmUKKworY2F0IDw8ICdFT0YnCitoaVwKK3RoZXJlCitFT1wKK0YKK0VPRgordHJ1ZQorCisjIGNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgcmVtb3ZlZCBhdCBzdGFydCBvZiBoZXJlLWRvYworY2F0IDw8IEVPXAorRgoraGkKK0VPRgorCisjYXNoIyAjIGNoZWNrIHRoYXQgXG5ld2xpbmUgcmVtb3ZhbCB3b3JrcyBmb3IgaGVyZS1kb2MgZGVsaW1pdGVyCisjYXNoIyBjYXQgPDwgRU9GCisjYXNoIyBoaQorI2FzaCMgRU9cCisjYXNoIyBGCisKKyMgY2hlY2sgb3BlcmF0aW9uIG9mIHRhYiByZW1vdmFsIGluIGhlcmUgZG9jdW1lbnRzCitjYXQgPDwtIEVPRgorCXRhYiAxCisJdGFiIDIKKwl0YWIgMworCUVPRgorCisjIGNoZWNrIGFwcGVuZGluZyBvZiB0ZXh0IHRvIGZpbGUgZnJvbSBoZXJlIGRvY3VtZW50CitybSAtZiAvdG1wL2Jhc2gtenp6CitjYXQgPiAvdG1wL2Jhc2gtenp6IDw8IEVPRgorYWJjCitFT0YKK2NhdCA+PiAvdG1wL2Jhc2gtenp6IDw8IEVPRgorZGVmIGdoaQoramtsIG1ubworRU9GCitjYXQgL3RtcC9iYXNoLXp6egorcm0gLWYgL3RtcC9iYXNoLXp6egorCisjIG1ha2Ugc3VyZSBjb21tYW5kIHByaW50aW5nIHB1dHMgdGhlIGhlcmUtZG9jdW1lbnQgYXMgdGhlIGxhc3QgcmVkaXJlY3Rpb24KKyMgb24gdGhlIGxpbmUsIGFuZCB0aGUgZnVuY3Rpb24gZXhwb3J0IGNvZGUgcHJlc2VydmVzIHN5bnRhY3RpYyBjb3JyZWN0bmVzcworZmZmKCkKK3sKKyAgZWQgL3RtcC9mb28gPDxFTkRPRklOUFVUID4vZGV2L251bGwKKy9ebmFtZS9kCit3CitxCitFTkRPRklOUFVUCithYT0xCit9CisKK3R5cGUgZmZmCisjYXNoIyBleHBvcnQgLWYgZmZmCisjYXNoIyAke1RISVNfU0h9IC1jICd0eXBlIGZmZicKKworIyBjaGVjayB0aGF0IGVuZCBvZiBmaWxlIGRlbGltaXRzIGEgaGVyZS1kb2N1bWVudAorIyBUSElTIE1VU1QgQkUgTEFTVCEKKworY2F0IDw8IEVPRgoraGkKK3RoZXJlCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtaW52ZXJ0L2ludmVydC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1pbnZlcnQvaW52ZXJ0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTIzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtaW52ZXJ0L2ludmVydC5yaWdodApAQCAtMCwwICsxLDEwIEBACisxCisxCisxCiswCiswCisxCiswCisxCiswCisxCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtaW52ZXJ0L2ludmVydC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1pbnZlcnQvaW52ZXJ0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzOTNkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtaW52ZXJ0L2ludmVydC50ZXN0cwpAQCAtMCwwICsxLDE5IEBACisjIHRlc3RzIG9mIHJldHVybiB2YWx1ZSBpbnZlcnNpb24KKyMgcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBleHBhbnNpb24KKworIyB1c2VyIHN1YnNoZWxscyAoLi4uKSBkaWQgdGhpcyB3cm9uZyBpbiBiYXNoIHZlcnNpb25zIGJlZm9yZSAyLjA0CisKKyEgKCBlY2hvIGhlbGxvIHwgZ3JlcCBoID4vZGV2L251bGwgMj4mMSApOyBlY2hvICQ/CishIGVjaG8gaGVsbG8gfCBncmVwIGggPi9kZXYvbnVsbCAyPiYxIDsgZWNobyAkPworCishIHRydWUgOyBlY2hvICQ/CishIGZhbHNlOyBlY2hvICQ/CisKKyEgKGZhbHNlKSA7IGVjaG8gJD8KKyEgKHRydWUpOyBlY2hvICQ/CisKKyEgdHJ1ZSB8IGZhbHNlIDsgZWNobyAkPworISBmYWxzZSB8IHRydWUgOyBlY2hvICQ/CisKKyEgKHRydWUgfCBmYWxzZSkgOyBlY2hvICQ/CishIChmYWxzZSB8IHRydWUpIDsgZWNobyAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvZWNob193cml0ZV9lcnJvci5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5MWExMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IucmlnaHQKQEAgLTAsMCArMSwyIEBACithc2g6IHdyaXRlIGVycm9yOiBCcm9rZW4gcGlwZQorT2s6IDEKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDBjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAordHJhcCAiIiBQSVBFCisKK3sKK3NsZWVwIDEKK2VjaG8gQ2FudCB3cml0ZSB0aGlzIC0gZ2V0IEVQSVBFCitlY2hvIE9rOiAkPyA+JjIKK30gfCB7IHRydWU7IH0KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xhc3RfYW1wLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbGFzdF9hbXAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhMjFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xhc3RfYW1wLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMworRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sYXN0X2FtcC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xhc3RfYW1wLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2MDkzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sYXN0X2FtcC50ZXN0cwpAQCAtMCwwICsxLDggQEAKKyRUSElTX1NIIC1jICdlY2hvIDMmJworZD1gZGF0ZWAKK3doaWxlIHRlc3QgImBkYXRlYCIgPSAiJGQiOyBkbyB0cnVlOyBkb25lCitkMT1gZGF0ZWAKKyRUSElTX1NIIC1jICdzbGVlcCAxJicKK2QyPWBkYXRlYAordGVzdCAiJGQxIiA9ICIkZDIiIHx8IGVjaG8gQkFECitlY2hvIEVuZApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbnVsbHRpY2sxLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbnVsbHRpY2sxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MGI4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9udWxsdGljazEucmlnaHQKQEAgLTAsMCArMSwzIEBACitUZXN0IDEKK1Rlc3QgMgorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbnVsbHRpY2sxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbnVsbHRpY2sxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MTkyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9udWxsdGljazEudGVzdHMKQEAgLTAsMCArMSwzIEBACitlY2hvIFRlc3QgYCBgIDEKK2VjaG8gVGVzdCBgPC9kZXYvbnVsbGAgMgorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zaGlmdDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zaGlmdDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzNDUzYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NoaWZ0MS5yaWdodApAQCAtMCwwICsxLDkgQEAKKzIgMyA0CiswOiBzaGlmdDogbGluZSAxOiBJbGxlZ2FsIG51bWJlcjogLTEKKzEgMiAzIDQKKzIgMyA0CiszIDQKKzQKKworMSAyIDMgNAorMSAyIDMgNApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc2hpZnQxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc2hpZnQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5OTJkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zaGlmdDEudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorJFRISVNfU0ggLWMgJ3NoaWZ0OyAgICBlY2hvICIkQCInIDAgMSAyIDMgNAorI1dlIGRvIGFib3J0IG9uIC0xLCBidXQgdGhlbiB3ZSBhYm9ydC4gYmFzaCBleGVjdXRlcyBlY2hvLgorJFRISVNfU0ggLWMgJ3NoaWZ0IC0xOyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICAwOyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICAxOyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICAyOyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICAzOyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICA0OyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICA1OyBlY2hvICIkQCInIDAgMSAyIDMgNAorJFRISVNfU0ggLWMgJ3NoaWZ0ICA2OyBlY2hvICIkQCInIDAgMSAyIDMgNApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiN2M1NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTEucmlnaHQKQEAgLTAsMCArMSwyIEBACitTb3VyY2VkIG9rCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMmU3NWIyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gImVjaG8gU291cmNlZCBvayIgPi4uL3NvdXJjZWQuc2gKK1BBVEg9Ii4uOiRQQVRIIgorLiBzb3VyY2VkLnNoCitybSAuLi9zb3VyY2VkLnNoCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTIucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTIudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4NzBjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UyLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZmFsc2UKKy4gL2Rldi9udWxsCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9yZXBsX3NsYXNoX2Jhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTJjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS5yaWdodApAQCAtMCwwICsxLDEwIEBACisxOTJcLjE2OFwuMFwuMQorMTkyXC4xNjhcLjBcLjFbCisxOTJcLjE2OFwuMFwuMVsKKzE5MlxcLjE2OFxcLjBcXC4xWworMTkyXC4xNjhcLjBcLjFbCisxOTJcLjE2OFwuMFwuMQorMTkyXC4xNjhcLjBcLjFbCisxOTJcLjE2OFwuMFwuMVsKKzE5MlxcLjE2OFxcLjBcXC4xWworMTkyXC4xNjhcLjBcLjFbCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9yZXBsX3NsYXNoX2Jhc2gxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmYTJmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS50ZXN0cwpAQCAtMCwwICsxLDIxIEBACisjIFRoZSBidWcgaGVyZSB3YXMgdHJpZ2dlcmVkIGJ5OgorIyAqIHBlcmZvcm1pbiBwYXRobmFtZSBleHBhbnNpb24gYmVjYXVzZSB3ZSBzZWUgWworIyAqIHJlcGxhY2Ugb3BlcmF0b3IgZGlkIG5vdCBlc2NhcGUgXCBpbiByZXBsYWNlIHN0cmluZworCitJUD0xOTIuMTY4LjAuMQorCitybSAtZiAnMTkyLjE2OC4wLjFbJworZWNobyAiJHtJUC8vLi9cXC59IgorZWNobyAiJHtJUC8vLi9cXC59IidbJyAjIGJ1ZyB3YXMgaGVyZQorZWNobyAiJHtJUC8vLi9cXC59WyIgICAjIGJ1ZyB3YXMgaGVyZQorZWNobyAiJHtJUC8vLi9cXFxcLn1bIiAjIGJ1ZyB3YXMgaGVyZQorZWNobyAiMTkyXC4xNjhcLjBcLjFbIgorCitlY2hvID4nMTkyLjE2OC4wLjFbJworZWNobyAiJHtJUC8vLi9cXC59IgorZWNobyAiJHtJUC8vLi9cXC59IidbJyAjIGJ1ZyB3YXMgaGVyZQorZWNobyAiJHtJUC8vLi9cXC59WyIgICAjIGJ1ZyB3YXMgaGVyZQorZWNobyAiJHtJUC8vLi9cXFxcLn1bIiAjIGJ1ZyB3YXMgaGVyZQorZWNobyAiMTkyXC4xNjhcLjBcLjFbIgorCitybSAtZiAnMTkyLjE2OC4wLjFbJwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3NxdW90ZV9iYXNoMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MzZiMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEucmlnaHQKQEAgLTAsMCArMSw5IEBACithCWIKK2EKK2IgYworZGVmCithJ2IgYyJkIGVcZgorYTNiIGMzYiBlMzNmCithXDgwYiBjMDhiCithM2IgYzMwYgoreAl5CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfc3F1b3RlX2Jhc2gxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3NxdW90ZV9iYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45M2E1NmNhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3NxdW90ZV9iYXNoMS50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK2VjaG8gJCdhXHRiJworZWNobyAkJ2FcbmInICQnY1xuZCcnZWYnCitlY2hvICQnYVwnYicgJCdjXCJkJyAkJ2VcXGYnCitlY2hvICQnYVw2M2InICQnY1wwNjNiJyAkJ2VcMDYzM2YnCitlY2hvICQnYVw4MGInICQnY1w2MDhiJworZWNobyAkJ2FceDMzYicgJCdjXHgzMzBiJworZWNobyAkJ3hceDl5JwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9SRVBMWS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNWQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQKQEAgLTAsMCArMSw1IEBACit0ZXN0IDE6IHwgIGFiYzEgIGRlZiAgfAordGVzdCAyOiB8ICBcYWJjMiAgZFxlZiAgfAordGVzdCAzOiB8YWJjMyAgZGVmfAordGVzdCA0OiB8XGFiYzQgIGRcZWZ8CitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX1JFUExZLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTIwY2FlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gJyAgXGFiYzEgIGRcZWYgICcgfCAoIHJlYWQgICAgICAgICA7IGVjaG8gInRlc3QgMTogfCRSRVBMWXwiICkKK2VjaG8gJyAgXGFiYzIgIGRcZWYgICcgfCAoIHJlYWQgLXIgICAgICA7IGVjaG8gInRlc3QgMjogfCRSRVBMWXwiICkKK2VjaG8gJyAgXGFiYzMgIGRcZWYgICcgfCAoIHJlYWQgICAgUkVQTFk7IGVjaG8gInRlc3QgMzogfCRSRVBMWXwiICkKK2VjaG8gJyAgXGFiYzQgIGRcZWYgICcgfCAoIHJlYWQgLXIgUkVQTFk7IGVjaG8gInRlc3QgNDogfCRSRVBMWXwiICkKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9pZnMucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX2lmcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTIzMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9pZnMucmlnaHQKQEAgLTAsMCArMSwxMCBAQAordGVzdCAxOiAuYS4gLmIuIC5jLgordGVzdCAyOiAuYS4gLmIuIC5jLgordGVzdCAzOiAuYS4gLi4gLmIsYy4KK3Rlc3QgNDogLmEuIC4uIC5iLGMuCit0ZXN0IDU6IC5hLiAuLiAuYy4KK3Rlc3QgNjogLmEuIC4uIC5jLiAuZC4KK3Rlc3QgNzogLmEuIC4uIC5iLGMsZCAgLCAgLC4KK3Rlc3QgODogLi4gLmEuIC5iLiAuYy4KK3Rlc3QgOTogLmEuIC5iLiAuYy4gLi4KK3Rlc3QgQTogLi4gLmEuIC4uIC5iLiAuYy4KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9pZnMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU4MzExMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKK3ByaW50ZiAnYVx0XHRiXHRjXG4nIHwgKCBJRlM9JChwcmludGYgIlx0IikgcmVhZCBhIGIgYzsgIGVjaG8gInRlc3QgMTogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYVx0XHRiXHRjXG4nIHwgKCBJRlM9JChwcmludGYgIiBcdCIpIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgMjogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSwsYixjXG4nICAgIHwgKCBJRlM9IiwiIHJlYWQgYSBiIGM7ICBlY2hvICJ0ZXN0IDM6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EsLGIsY1xuJyAgICB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYzsgZWNobyAidGVzdCA0OiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhICwsIGNcbicgICAgfCAoIElGUz0iICwiIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgNTogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSAsLCBjIGRcbicgIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjIGQ7ICAgICBlY2hvICJ0ZXN0IDY6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnIGEsLGIsYyxkICAsICAsXG4nIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDc6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ1x0LFx0YVx0LFx0Ylx0YycgICB8ICggSUZTPSQocHJpbnRmICIgXHQsIikgcmVhZCBhIGIgYyBkOyAgIGVjaG8gInRlc3QgODogLiRhLiAuJGIuIC4kYy4gLiRkLiIgKQorcHJpbnRmICdcdFx0YVx0LFx0Ylx0YycgICAgfCAoIElGUz0kKHByaW50ZiAiIFx0LCIpIHJlYWQgYSBiIGMgZDsgICBlY2hvICJ0ZXN0IDk6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnXHQsXHRhXHQsLFx0Ylx0YycgIHwgKCBJRlM9JChwcmludGYgIiBcdCwiKSByZWFkIGEgYiBjIGQgZTsgZWNobyAidGVzdCBBOiAuJGEuIC4kYi4gLiRjLiAuJGQuIC4kZS4iICkKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjgxYWYwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9uLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAordGVzdAordGVzCit0ZXMKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjQyM2JhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9uLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyAndGVzdCcgfCAocmVhZCByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgLW4gMyByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgLW4zIHJlcGx5OyBlY2hvICIkcmVwbHkiKQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9yLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzZiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3IucmlnaHQKQEAgLTAsMCArMSwyIEBACit0ZXN0YmVzdAordGVzdFwKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzRjYzYxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9yLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyAtZSAndGVzdFxcXG5iZXN0JyB8IChyZWFkIHJlcGx5OyBlY2hvICIkcmVwbHkiKQorZWNobyAtZSAndGVzdFxcXG5iZXN0JyB8IChyZWFkIC1yIHJlcGx5OyBlY2hvICIkcmVwbHkiKQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTI2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3QucmlnaHQKQEAgLTAsMCArMSw0IEBACis+PAorPjwKKz50ZXN0PAorPnRlc3Q8CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3QudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3QudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY1ZjFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfdC50ZXN0cwpAQCAtMCwwICsxLDEwIEBACisjIGJhc2ggMy4yIG91dHB1dHM6CisKKyMgPjwKK3sgZWNobyAtbiAndGUnOyBzbGVlcCAyOyBlY2hvICdzdCc7IH0gICB8IChyZWFkIC10IDEgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKKyMgPjwKK3sgICAgICAgICAgICAgICBzbGVlcCAyOyBlY2hvICd0ZXN0JzsgfSB8IChyZWFkIC10IDEgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKKyMgPnRlc3Q8Cit7IGVjaG8gLW4gJ3RlJzsgc2xlZXAgMTsgZWNobyAnc3QnOyB9ICAgfCAocmVhZCAtdCAyIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID50ZXN0PAoreyAgICAgICAgICAgICAgIHNsZWVwIDE7IGVjaG8gJ3Rlc3QnOyB9IHwgKHJlYWQgLXQgMiByZXBseTsgZWNobyAiPiRyZXBseTwiKQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTZlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIucmlnaHQKQEAgLTAsMCArMSwyIEBACithc2g6IHdyaXRlIGVycm9yOiBCYWQgZmlsZSBkZXNjcmlwdG9yCitURVNUCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ExYTY2OAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpci50ZXN0cwpAQCAtMCwwICsxLDYgQEAKKyMgdGVzdDogY2xvc2VkIGZkcyBzaG91bGQgc3RheSBjbG9zZWQKK2V4ZWMgMT4mLQorZWNobyBURVNUID5URVNUCitlY2hvIEpVTksgIyBsb3N0OiBzdGRvdXQgaXMgY2xvc2VkCitjYXQgVEVTVCA+JjIKK3JtIFRFU1QKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjIucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIyLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MWNjZWEzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKKyMgYXNoIG9uY2UgY291bGRuJ3QgcmVkaXJlY3QgYWJvdmUgZmQjOQorZXhlYyAxPi9kZXYvbnVsbAorKGVjaG8gTE9TVDEgPiYyMikgMjI+JjEKKyhlY2hvIExPU1QyID4mMjIpIDIyPiYxCisoZWNobyBPSyA+JjIyKSAyMj4mMgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMy5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NDFhOAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMucmlnaHQKQEAgLTAsMCArMSwzIEBACitURVNUCisuL3JlZGlyMy50ZXN0czogbGluZSA0OiA5OiBCYWQgZmlsZSBkZXNjcmlwdG9yCitPdXRwdXQgdG8gZmQjOTogMQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTM3ZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMudGVzdHMKQEAgLTAsMCArMSw1IEBACisjIHJlZGlyZWN0cyB0byBjbG9zZWQgZGVzY3JpcHRvcnMgc2hvdWxkIG5vdCBsZWF2ZSB0aGVzZSBkZXNjcmlwdG9ycworIyBvcGVuIGFmdGVyd2FyZHMKK2VjaG8gVEVTVCA5Pi9kZXYvbnVsbAorZWNobyBNVVNUIEVSUk9SIE9VVCA+JjkKK2VjaG8gIk91dHB1dCB0byBmZCM5OiAkPyIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjQucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI0LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI0LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YmRmNWFlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC50ZXN0cwpAQCAtMCwwICsxLDcyIEBACisjIGFzaCB1c2VzIGZkIDEwICh1c3VhbGx5KSBmb3IgcmVhZGluZyB0aGUgc2NyaXB0CitleGVjIDEzPiYtCitleGVjIDEyPiYtCitleGVjIDExPiYtCitleGVjIDEwPiYtCisjIHNvbWUgYW1vdW50IG9mIGlucHV0IGlzIHByZWZldGNoZWQuCisjIG1ha2Ugc3VyZSBmaW5hbCBlY2hvIGlzIGZhciBlbm91Z2ggdG8gbm90IGJlIHByZWZldGNoZWQuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2VjaG8gIk9LIgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwODc3NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjUucmlnaHQKQEAgLTAsMCArMSwyIEBACisuL3JlZGlyNS50ZXN0czogbGluZSAyOiAxMDogQmFkIGZpbGUgZGVzY3JpcHRvcgorT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjUudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxYjBjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyBhc2ggdXNlcyBmZCAxMCAodXN1YWxseSkgZm9yIHJlYWRpbmcgdGhlIHNjcmlwdAorZWNobyBMT1NUID4mMTAKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjYucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI2LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzU0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI2LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorSGVsbG8KK09LCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI2LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zM2I2ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMgd2UgaGFkIGEgYnVnIHdoZXJlIHRoaXMgd291bGQgaGFuZworKGhlYWQgLW4gMSA8cmVkaXI2LnJpZ2h0KQorZWNobyBPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNy5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjcucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzMGIwMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjcucmlnaHQKQEAgLTAsMCArMSwzIEBACitPaworT2sKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjcudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhMzk3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnRlc3RzCkBAIC0wLDAgKzEsMTIgQEAKKyMgQ2hhcnMgYWJvdmUgMHg3ZiBhcmUgdXNlZCBhcyBzcGVjaWFsIGNvZGVzLgorIyAweDgxIGlzIENUTEVTQyAoc2VlIGFzaC5jKS4KKyMgVGhlIGJ1ZyB3YXMgdGhhdCBxdW90aW5nIGFuZCB1bnF1b3Rpbmcgb2YgdGhlbQorIyB3YXMgb3V0IG9mIHN5bmMgZm9yIHJlZGlyZWN0IGZpbGVuYW1lcy4KKworPnVuaWNvZGUuc2gKK2VjaG8gLWUgJ2VjaG8gT2sgPnVuaVx4ODFjb2RlJyA+PnVuaWNvZGUuc2gKK2VjaG8gLWUgJ2NhdCB1bmlceDgxY29kZScgPj51bmljb2RlLnNoCitlY2hvIC1lICdjYXQgdW5pP2NvZGUnID4+dW5pY29kZS5zaAorLiAuL3VuaWNvZGUuc2gKK3JtIHVuaSpjb2RlKgorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI4LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDMwYjAyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOC5yaWdodApAQCAtMCwwICsxLDMgQEAKK09rCitPaworRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGNiNDJjMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgudGVzdHMKQEAgLTAsMCArMSwxNSBAQAorIyBDaGFycyBhYm92ZSAweDdmIGFyZSB1c2VkIGFzIHNwZWNpYWwgY29kZXMuCisjIDB4ODEgaXMgQ1RMRVNDIChzZWUgYXNoLmMpLgorIyBUaGUgYnVnIHdhcyB0aGF0IHF1b3RpbmcgYW5kIHVucXVvdGluZyBvZiB0aGVtCisjIHdhcyBvdXQgb2Ygc3luYyBmb3IgcmVkaXJlY3QgZmlsZW5hbWVzLgorCisjIFN1YmNhc2Ugd2hlbiByZWRpcmVjdCBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgaW4gYSB2YXJpYWJsZS4KKworPnVuaWNvZGUuc2gKK2VjaG8gLWUgJ3Y9dW5pXHg4MWNvZGUnID4+dW5pY29kZS5zaAorZWNobyAtZSAnZWNobyBPayA+IiR2IicgPj51bmljb2RlLnNoCitlY2hvIC1lICdjYXQgdW5pXHg4MWNvZGUnID4+dW5pY29kZS5zaAorZWNobyAtZSAnY2F0IHVuaT9jb2RlJyA+PnVuaWNvZGUuc2gKKy4gLi91bmljb2RlLnNoCitybSB1bmkqY29kZSoKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjMjUxMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkucmlnaHQKQEAgLTAsMCArMSwyIEBACitPaworRG9uZTowCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI5LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YmVmYTYxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOS50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gT2sgPmZpbGUudG1wCitjYXQgMDw+ZmlsZS50bXAKK2VjaG8gRG9uZTokPworcm0gZmlsZS50bXAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3JlYXAxLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvcmVhcDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNmQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3JlYXAxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09rCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3JlYXAxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmMWExZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS50ZXN0cwpAQCAtMCwwICsxLDE0IEBACisjIS9iaW4vc2gKKworIyBNdXN0IG5vdCBmaW5kIHVzIGFsaXZlCit7IHNsZWVwIDI7IGtpbGwgLTkgJCQ7IH0gMj4vZGV2L251bGwgJgorCitzbGVlcCAxICYKK1BJRD0kIQorCisjIFdlIG11c3QgZXhpdCB0aGUgbG9vcCBpbiBvbmUgc2Vjb25kLgorIyBXZSBoYWQgYnVnIDUzMDQ6IGJ1aWx0aW5zIG5ldmVyIHdhaXRlZCBmb3IgZXhpdGVkIGNoaWxkcmVuCit3aGlsZSBraWxsIC0wICRQSUQgPi9kZXYvbnVsbCAyPiYxOyBkbworICAgIHRydWUKK2RvbmUKK2VjaG8gT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2F2ZXRyYXAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MjI1YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAordHJhcCAtLSAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwIC0tICdlY2hvIFdJTkNIIScgV0lOQ0gKK3RyYXAgLS0gJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAtLSAnZWNobyBXSU5DSCEnIFdJTkNICit0cmFwIC0tICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgLS0gJ2VjaG8gV0lOQ0ghJyBXSU5DSAorRG9uZQorRXhpdGluZwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2F2ZXRyYXAudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zYXZldHJhcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmIzMTJmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2F2ZXRyYXAudGVzdHMKQEAgLTAsMCArMSw5IEBACit0cmFwICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgJ2VjaG8gV0lOQ0ghJyBTSUdXSU5DSAordj1gIHRyYXAgICBgCitlY2hvICIkdiIKK3Y9JCgJdHJhcCApCitlY2hvICIkdiIKK3Y9YHRyYXBgCitlY2hvICIkdiIKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnaW50MS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ2ludDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwOTRiMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ2ludDEucmlnaHQKQEAgLTAsMCArMSBAQAorU2VuZGluZyBTSUdJTlQgdG8gbWFpbiBzaGVsbCBQSUQKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ2ludDEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkNDgzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnRlc3RzCkBAIC0wLDAgKzEsNDEgQEAKKyMgV2hhdCBzaG91bGQgaGFwcGVuIGlmIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbCBnZXRzIFNJR0lOVD8KKworKHNsZWVwIDE7IGVjaG8gU2VuZGluZyBTSUdJTlQgdG8gbWFpbiBzaGVsbCBQSUQ7IGV4ZWMga2lsbCAtSU5UICQkKSAmCisKKyMgV2UgY3JlYXRlIGEgY2hpbGQgd2hpY2ggZXhpdHMgd2l0aCAwIGV2ZW4gb24gU0lHSU5UCisjIChUaGUgY29tcGxleCBjb21tYW5kIGlzIG5lY2Vzc2FyeSBvbmx5IGlmIFNJR0lOVCBpcyBnZW5lcmF0ZWQgYnkgXkMsCisjIGluIHRoaXMgdGVzdGNhc2UgZXZlbiBiYXJlICJzbGVlcCAyIiB3b3VsZCBkbyBiZWNhdXNlCisjIGluIHRoZSB0ZXN0Y2FzZSB3ZSBkb24ndCBzZW5kIFNJR0lOVCAqdG8gdGhlIGNoaWxkKi4uLikKKyRUSElTX1NIIC1jICd0cmFwICJleGl0IDAiIFNJR0lOVDsgc2xlZXAgMicKKworIyBJbiBvbmUgc2Vjb25kLCB3ZSAobWFpbiBzaGVsbCkgZ2V0IFNJR0lOVCBoZXJlLgorIyBUaGUgcXVlc3Rpb24gaXMgd2hldGhlciB3ZSBzaG91bGQsIG9yIHNob3VsZCBub3QsIGV4aXQuCisKKyMgYmFzaCB3aWxsIG5vdCBzdG9wIGhlcmUuIEl0IHdpbGwgZXhlY3V0ZSBuZXh0IGNvbW1hbmQocykuCisKKyMgVGhlIHJhdGlvbmFsZSBmb3IgdGhpcyBpcyBkZXNjcmliZWQgaGVyZToKKyMgaHR0cDovL3d3dy5jb25zLm9yZy9jcmFjYXVlci9zaWdpbnQuaHRtbAorIworIyBCYXNpY2FsbHksIGJhc2ggd2lsbCBub3QgZXhpdCBvbiBTSUdJTlQgaW1tZWRpYXRlbHkgaWYgaXQgd2FpdHMKKyMgZm9yIGEgY2hpbGQuIEl0IHdpbGwgd2FpdCBmb3IgdGhlIGNoaWxkIHRvIGV4aXQuCisjIElmIGNoaWxkIGV4aXRzIE5PVCBieSBkeWluZyBvbiBTSUdJTlQsIHRoZW4gYmFzaCB3aWxsIG5vdCBleGl0LgorIworIyBUaGUgaWRlYSBpcyB0aGF0IHRoZSBmb2xsb3dpbmcgc2NyaXB0OgorIyB8IGVtYWNzIGZpbGUudHh0CisjIHwgbW9yZSBjbWRzCisjIFVzZXIgbWF5IHVzZSBeQyB0byBpbnRlcnJ1cHQgZWRpdG9yJ3Mgb3BzIGxpa2Ugc2VhcmNoLiBCdXQgdGhlbgorIyBlbWFjcyBleGl0cyBub3JtYWxseS4gVXNlciBleHBlY3RzIHRoYXQgc2NyaXB0IGRvZXNuJ3Qgc3RvcC4KKyMKKyMgVGhpcyBpcyBhIG5pY2UgaWRlYSwgYnV0IGRldGVjdGluZyAiZGlkIHByb2Nlc3MgcmVhbGx5IGV4aXQKKyMgd2l0aCBTSUdJTlQ/IiBpcyByYWN5LiBDb25zaWRlcjoKKyMgfCBiYXNoIC1jICd3aGlsZSB0cnVlOyBkbyAvYmluL3RydWU7IGRvbmUnCisjIFdoZW4gXkMgaXMgcHJlc3NlZCB3aGlsZSBiYXNoIHdhaXRzIGZvciAvYmluL3RydWUgdG8gZXhpdCwKKyMgaXQgbWF5IGhhcHBlbiB0aGF0IC9iaW4vdHJ1ZSBleGl0cyB3aXRoIGV4aXRjb2RlIDAgYmVmb3JlCisjIF5DIGlzIGRlbGl2ZXJlZCB0byBpdCBhcyBTSUdJTlQuIGJhc2ggd2lsbCBzZWUgU0lHSU5ULCB0aGVuCisjIGl0IHdpbGwgc2VlIHRoYXQgY2hpbGQgZXhpdGVkIHdpdGggMCwgYW5kIGJhc2ggd2lsbCBOT1QgRVhJVC4KKworIyBUaGVyZWZvcmUgd2UgZG8gbm90IGltcGxlbWVudCBiYXNoIGJlaGF2aW9yLgorIyBJJ2Qgc2F5IHRoYXQgZW1hY3MgbmVlZCB0byBwdXQgaXRzZWxmIGludG8gYSBzZXBhcmF0ZSBwZ3JwCisjIHRvIGlzb2xhdGUgc2hlbGwgZnJvbSBnZXR0aW5nIHN0cmF5IFNJR0lOVHMgZnJvbSBeQy4KKworZWNobyBOZXh0IGNvbW1hbmQgYWZ0ZXIgU0lHSU5UIHdhcyBleGVjdXRlZApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MDNhYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEucmlnaHQKQEAgLTAsMCArMSwyMCBAQAorZ290IHNpZ25hbAordHJhcCAtLSAnZWNobyBnb3Qgc2lnbmFsJyBVU1IxCitzZW50IDEgc2lnbmFsCitnb3Qgc2lnbmFsCit3YWl0IGludGVycnVwdGVkCit0cmFwIC0tICdlY2hvIGdvdCBzaWduYWwnIFVTUjEKK3NlbnQgMiBzaWduYWwKK2dvdCBzaWduYWwKK3dhaXQgaW50ZXJydXB0ZWQKK3RyYXAgLS0gJ2VjaG8gZ290IHNpZ25hbCcgVVNSMQorc2VudCAzIHNpZ25hbAorZ290IHNpZ25hbAord2FpdCBpbnRlcnJ1cHRlZAordHJhcCAtLSAnZWNobyBnb3Qgc2lnbmFsJyBVU1IxCitzZW50IDQgc2lnbmFsCitnb3Qgc2lnbmFsCit3YWl0IGludGVycnVwdGVkCit0cmFwIC0tICdlY2hvIGdvdCBzaWduYWwnIFVTUjEKK3NlbnQgNSBzaWduYWwKK3NsZWVwIGNvbXBsZXRlZApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjhiZmM2YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEudGVzdHMKQEAgLTAsMCArMSwyOCBAQAordHJhcCAiZWNobyBnb3Qgc2lnbmFsIiBVU1IxCisKK2ZvciB0cnkgaW4gMSAyIDMgNCA1OyBkbworICAgIGtpbGwgLVVTUjEgJCQKKyAgICBzbGVlcCAwLjIKKyAgICBlY2hvICJzZW50ICR0cnkgc2lnbmFsIgorZG9uZSAmCisKKyMgRW5zdXJlICJ3YWl0IiBoYXMgc29tZXRoaW5nIHRvIHdhaXQgZm9yCitzbGVlcCAyICYKKworIyBFbnN1cmUgd2UgZG8gbm90IGV4ZWN1dGUgInRyYXAiIGJlbG93IGJlZm9yZSAia2lsbCAtVVNSMSIgYWJvdmUKKyMgKHdhcyBnZXR0aW5nIGZhaWx1cmUgb24gbG9hZGVkIG1hY2hpbmUgd2l0aG91dCB0aGlzKQorc2xlZXAgMC4xCisKK3NsZWVwaW5nPXRydWUKK3doaWxlICRzbGVlcGluZzsgZG8KKyAgICB0cmFwCisgICAgaWYgd2FpdCAlJTsgdGhlbgorICAgICAgICBlY2hvICJzbGVlcCBjb21wbGV0ZWQiCisgICAgICAgIHNsZWVwaW5nPWZhbHNlCisgICAgZWxpZiBbICQ/ID09IDEyNyBdOyB0aGVuCisgICAgICAgIGVjaG8gIkJVRzogbm8gcHJvY2Vzc2VzIHRvIHdhaXQgZm9yPyEiCisgICAgICAgIHNsZWVwaW5nPWZhbHNlCisgICAgZWxzZQorICAgICAgICBlY2hvICJ3YWl0IGludGVycnVwdGVkIgorICAgIGZpCitkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwyLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmFmOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMi5yaWdodApAQCAtMCwwICsxLDMgQEAKK2NoaWxkIHNsZWVwcworY2hpbGQgZXhpdHMgYXMgZXhwZWN0ZWQKK3BhcmVudCBleGl0cwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGY2MzljYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisKKyRUSElTX1NIIC1jICcKK2NsZWFudXAoKSB7CisgICAgZWNobyAiY2hpbGQgZXhpdHMgYXMgZXhwZWN0ZWQiCisgICAgZXhpdAorfQordHJhcCBjbGVhbnVwIEhVUAorZWNobyAiY2hpbGQgc2xlZXBzIgorc2xlZXAgMQorZWNobyAiQkFEIGV4aXQgZnJvbSBjaGlsZCEiCisnICYKKworY2hpbGQ9JCEKK3NsZWVwIDAuMSAjIGxldCBjaGlsZCBpbnN0YWxsIGhhbmRsZXIgZmlyc3QKK2tpbGwgLUhVUCAkY2hpbGQKK3dhaXQKK2VjaG8gInBhcmVudCBleGl0cyIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDMucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTNiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwzLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorY2hpbGQgc2xlZXBzCitjaGlsZCBnb3QgSFVQCitjaGlsZCBleGl0cworcGFyZW50IGV4aXRzCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwzLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNTZjMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy50ZXN0cwpAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworJFRISVNfU0ggLWMgJworaHVwKCkgeworICAgIGVjaG8gImNoaWxkIGdvdCBIVVAiCit9Cit0cmFwIGh1cCBIVVAKK2VjaG8gImNoaWxkIHNsZWVwcyIKK3NsZWVwIDEKK2VjaG8gImNoaWxkIGV4aXRzIgorJyAmCisKK2NoaWxkPSQhCitzbGVlcCAwLjEgIyBsZXQgY2hpbGQgaW5zdGFsbCBoYW5kbGVyIGZpcnN0CitraWxsIC1IVVAgJGNoaWxkCit3YWl0CitlY2hvICJwYXJlbnQgZXhpdHMiCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw0LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjYwNTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNC5yaWdodApAQCAtMCwwICsxLDQgQEAKKy4vc2lnbmFsNC50ZXN0czogdHJhcDogbGluZSAzOiBCQUROQU1FOiBpbnZhbGlkIHNpZ25hbCBzcGVjaWZpY2F0aW9uCisxCitUcmFwcGVkCitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmYxYzRhOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQudGVzdHMKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKKwordHJhcCAiZWNobyBUcmFwcGVkIiBCQUROQU1FIFRFUk07IGVjaG8gJD8KK2tpbGwgJCQKK2VjaG8gT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDUucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZmQ0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnJpZ2h0CkBAIC0wLDAgKzEsMTIgQEAKK1NsZWVwaW5nCitTbGVlcGluZworV2FpdGluZworMiBzZWMgcGFzc2VkLCBzZW5kaW5nIFVTUjEgdG8gcGFyZW50CitVU1IxIHJlY2VpdmVkCitXYWl0IGV4aXQgY29kZTogMTM4CitXYWl0aW5nCiszIHNlYyBwYXNzZWQsIHNlbmRpbmcgVVNSMSB0byBwYXJlbnQKK1VTUjEgcmVjZWl2ZWQKK1dhaXQgZXhpdCBjb2RlOiAxMzgKK1dhaXRpbmcKK1dhaXQgcmV0dXJuZWQgMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTc5YmNkZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDUudGVzdHMKQEAgLTAsMCArMSwxNCBAQAordHJhcCAiZWNobyBVU1IxIHJlY2VpdmVkIiBVU1IxCitzdHViKCkgeworICAgIGVjaG8gIlNsZWVwaW5nIgorICAgIHNsZWVwICQxCisgICAgZWNobyAiJDEgc2VjIHBhc3NlZCwgc2VuZGluZyBVU1IxIHRvIHBhcmVudCIKKyAgICBraWxsIC1VU1IxICQkCit9CitzdHViIDMgJgorc3R1YiAyICYKK3NsZWVwIDEKK3VudGlsIHsgZWNobyAiV2FpdGluZyI7IHdhaXQ7IH0gZG8KKyAgICBlY2hvICJXYWl0IGV4aXQgY29kZTogJD8iCitkb25lCitlY2hvICJXYWl0IHJldHVybmVkIDAiCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw2LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjRkOTMwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi5yaWdodApAQCAtMCwwICsxLDIgQEAKK2dvdCBURVJNCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw2LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zY2UxNTEwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3sgdHJhcCAiZWNobyBnb3QgVEVSTSIgVEVSTTsgc2xlZXAgMzsgfSYgc2xlZXAgMTsga2lsbCAkITsgd2FpdAorZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNy5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NDUzZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcucmlnaHQKQEAgLTAsMCArMSBAQAorQnVnIGRldGVjdGVkOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw3LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmIxMzgxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNy50ZXN0cwpAQCAtMCwwICsxLDE4IEBACitidWcoKSB7CisJdHJhcCA6IGV4aXQKKwkjIEJ1ZyB3YXMgY2F1c2luZyBzaCB0byBiZSBydW4gaW4gc3Vic2hlbGwsCisJIyBhcyBpZiB0aGlzIGxpbmUgaXMgcmVwbGFjZWQgd2l0aCAoc2ggLWMgLi4uOyBleGl0ICQ/KSAmCisJIyBoZXJlOgorCXNoIC1jICdlY2hvIFJFQUxfQ0hJTEQ9JCQnICYKKwllY2hvIFBBUkVOVFNfSURFQV9PRl9DSElMRD0kIQorCXdhaXQgICMgbWFrZSBzdXJlIGJrZ2Qgc2hlbGwgY29tcGxldGVzCit9CisKK2J1ZyB8IHsKK3doaWxlIHJlYWQgdmFydmFsOyBkbworCWV2YWwgJHZhcnZhbAorZG9uZQordGVzdCB4IiRSRUFMX0NISUxEIiAhPSB4IiIgXAorJiYgdGVzdCB4IiRSRUFMX0NISUxEIiA9IHgiJFBBUkVOVFNfSURFQV9PRl9DSElMRCIKK2VjaG8gIkJ1ZyBkZXRlY3RlZDogJD8iCit9CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw4LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTU3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC5yaWdodApAQCAtMCwwICsxLDMgQEAKK1JlbW92aW5nIHRyYXBzCitFbmQgb2YgZXhpdF9mdW5jCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw4LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MzFhZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC50ZXN0cwpAQCAtMCwwICsxLDE4IEBACisiJFRISVNfU0giIC1jICcKK2V4aXRfZnVuYygpIHsKKyAgICBlY2hvICJSZW1vdmluZyB0cmFwcyIKKyAgICB0cmFwIC0gRVhJVCBURVJNIElOVAorICAgIGVjaG8gIkVuZCBvZiBleGl0X2Z1bmMiCit9CitzZXQgLWUKK3RyYXAgZXhpdF9mdW5jIEVYSVQgVEVSTSBJTlQKK3NsZWVwIDIKK2V4aXQgNzcKKycgJgorCitzbGVlcCAxCisjIEJVRzogYXNoIGtpbGxzIC1QR1JQLCBidXQgaW4gbm9uLWludGVyYWN0aXZlIHNoZWxsIHdlIGRvIG5vdCBjcmVhdGUgcGdycHMhCisjIEluIHRoaXMgY2FzZSwgYmFzaCBraWxscyBieSBQSUQsIG5vdCBQR1JQLgora2lsbCAtVEVSTSAlMQord2FpdAorZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1NzJmMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkucmlnaHQKQEAgLTAsMCArMSwzIEBACitSZW1vdmluZyB0cmFwcworRW5kIG9mIGV4aXRfZnVuYworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMThlNzEwMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkudGVzdHMKQEAgLTAsMCArMSwyMSBAQAorIyBOb3RlOiB0aGUgaW5uZXIgc2NyaXB0IGlzIGEgdGVzdCB3aGljaCBjaGVja3MgZm9yIGEgZGlmZmVyZW50IGJ1ZworIyAob3JkZXJpbmcgYmV0d2VlbiBJTlQgaGFuZGxlciBhbmQgZXhpdCBvbiAic2V0IC1lIiksCisjIGJ1dCBzbyBmYXIgSSBkaWQgbm90IGZpZ3VyZSBvdXQgaG93IHRvIHNpbXVsYXRlIGl0IG5vbi1pbnRlcmFjdGl2ZWx5LgorCisiJFRISVNfU0giIC1jICcKK2V4aXRfZnVuYygpIHsKKyAgICBlY2hvICJSZW1vdmluZyB0cmFwcyIKKyAgICB0cmFwIC0gRVhJVCBURVJNIElOVAorICAgIGVjaG8gIkVuZCBvZiBleGl0X2Z1bmMiCit9CitzZXQgLWUKK3RyYXAgZXhpdF9mdW5jIEVYSVQgVEVSTSBJTlQKK3NsZWVwIDIKK2V4aXQgNzcKKycgJgorCitjaGlsZD0kIQorc2xlZXAgMQora2lsbCAtVEVSTSAkY2hpbGQKK3dhaXQKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZXhlY19nZXRzX25vX2Vudi5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZXhlY19nZXRzX25vX2Vudi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTIyZGZmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9leGVjX2dldHNfbm9fZW52LnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorVkFSNz1WQUwKKzAKK1ZBUjg9VkFMCiswCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQzNDdiZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZXhlY19nZXRzX25vX2Vudi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2V4cG9ydCBWQVI3PVZBTAorZW52IHwgZ3JlcCBeVkFSNz0KK2VjaG8gJD8KK1ZBUjg9VkFMIGVudiB8IGdyZXAgXlZBUjg9CitlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczNTQxYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZm9ya190cmFzaGVzX2dldG9wdC5yaWdodApAQCAtMCwwICsxIEBACiswCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQyYzUwNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZm9ya190cmFzaGVzX2dldG9wdC50ZXN0cwpAQCAtMCwwICsxLDYgQEAKKyMgSW4gdGhpcyB0ZXN0LCBybSBpcyBOT0ZPUksgYW5kIGl0IG1vZGlmaWVzIGdldG9wdCBpbnRlcm5hbCBzdGF0ZQorcm0gLWYgbm9uX2V4aXN0ZW50X2ZpbGUKKyMgU3Vic2VxdWVudCBoZXhkdW1wIGlzIHJ1biBhcyBOT0VYRUMsIGFuZCB0aHVzIHN0aWxsIHVzZXMgdGhpcyBzdGF0ZQoraGV4ZHVtcCA8L2Rldi9udWxsCisjIERpZCBoZXhkdW1wIHNlZ2ZhdWx0IGV0Yz8KK2VjaG8gJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQ1N2ZkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvdmFyX3N0YW5kYWxvbmUxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0RvbmU6IDEKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZTkwNWJhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvdmFyX3N0YW5kYWxvbmUxLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorVkFSPTQyICRUSElTX1NIIC1jICd1bnNldCBWQVI7IGVudiB8IGdyZXAgXlZBUicKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDEyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIxLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorYT1hIEE9YQorYT1hIEE9YQorYT0gQT0KK2E9IEE9CithPWEgQT1hCithPWEgQT1hCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDJlNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS50ZXN0cwpAQCAtMCwwICsxLDE0IEBACisjIGNoZWNrIHRoYXQgZmlyc3QgYXNzaWdubWVudCBoYXMgcHJvcGVyIGVmZmVjdCBvbiBzZWNvbmQgb25lCisKKygKK2E9YSBBPSRhCitlY2hvIGE9JGEgQT0kQQorKQorKGE9YSBBPSRhOyBlY2hvIGE9JGEgQT0kQSkKKyhhPWEgQT0kYSBlY2hvIGE9JGEgQT0kQSkKKyhhPWEgQT0kYSAvYmluL2VjaG8gYT0kYSBBPSRBKQorCitmKCkgeyBlY2hvIGE9JGEgQT0kQTsgfQorCisoYT1hIEE9JGEgZikKKyhhPWEgQT0kYTsgZikKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjIucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZWQxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2J1cy91c2IvMS8yCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIyLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wN2ZlYWViCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi50ZXN0cwpAQCAtMCwwICsxIEBACitYPXVzYmRldjEuMiBYPSR7WCN1c2JkZXZ9IEI9JHtYJSUuKn0gRD0ke1gjKi59OyBlY2hvIGJ1cy91c2IvJEIvJEQKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGEwNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gxLnJpZ2h0CkBAIC0wLDAgKzEsMTQgQEAKKworCitmCitiY2RlZgorYWJjZGVmCithYmNkZWYKK2JjZGUKK2FiY2QKK2FiY2QKK2FiY2RlZgorYmNkZWYKK2FiY2RlZgorYWJjZGVmCithYmNkZWYKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGQzYzlhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gxLnRlc3RzCkBAIC0wLDAgKzEsMTggQEAKK3Zhcj1hYmNkZWYKKworZWNobyAke3Zhcjo3fQorZWNobyAke3Zhcjo2fQorZWNobyAke3Zhcjo1fQorZWNobyAke3ZhcjoxfQorZWNobyAke3ZhcjowfQorZWNobyAke3ZhcjotMX0KKworZWNobyAke3ZhcjoxOjR9CitlY2hvICR7dmFyOjA6NH0KK2VjaG8gJHt2YXI6OjR9CitlY2hvICR7dmFyOi0xOjR9CisKK2VjaG8gJHt2YXI6MTo3fQorZWNobyAke3ZhcjowOjd9CitlY2hvICR7dmFyOjo3fQorZWNobyAke3ZhcjotMTo3fQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gyLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmE1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDIucmlnaHQKQEAgLTAsMCArMSwxMCBAQAorYWJjMTIzeGNiYTEyMworYWJ4MTIzZGNiYTEyMworYWJ4MTIzZHhiYTEyMworYWJjeDIzZGNiYTEyMworYWJjeHh4ZGNiYXh4eAorYWJ4Cit4YmExMjMKK2FieDIzCithYmMyM2RjYmExMjMKK2FiY2RjYmEKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWM1MjZjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gyLnRlc3RzCkBAIC0wLDAgKzEsMjQgQEAKK3Zhcj1hYmMxMjNkY2JhMTIzCisKK2VjaG8gJHt2YXIvZC94fQorZWNobyAke3Zhci9jL3h9CitlY2hvICR7dmFyLy9jL3h9CitlY2hvICR7dmFyL1sxMjNdL3h9CitlY2hvICR7dmFyLy9bMTIzXS94fQorZWNobyAke3Zhci9jKi94fQorZWNobyAke3Zhci8qYy94fQorCisjIG11c3QgbWF0Y2ggbG9uZ2VzdCBtYXRjaDogcmVzdWx0IGlzICJhYngyMyIKK2VjaG8gJHt2YXIvYyoxL3h9CisKKyMgZW1wdHkgcmVwbGFjZW1lbnQgLSAybmQgc2xhc2ggY2FuIGJlIG9taXR0ZWQKK2VjaG8gJHt2YXIvWzEyM119CitlY2hvICR7dmFyLy9bMTIzXX0KKworIyMjIGFzaCBkb2Vzbid0IHN1cHBvcnQKKyMjIyAjIG1hdGNoIG9ubHkgYXQgdGhlIGJlZ2lubmluZzoKKyMjIyBlY2hvICR7dmFyLyNhL3h9CisjIyMgZWNobyAke3Zhci8jYi94fSAjIHNob3VsZCBub3QgbWF0Y2gKKyMjIyBlY2hvICR7dmFyLy8jYi94fSAjIHNob3VsZCBub3QgbWF0Y2gKKyMjIyAjIG1hdGNoIG9ubHkgYXQgdGhlIGVuZDoKKyMjIyBlY2hvICR7dmFyLyUzL3h9CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDMucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3Yzg1MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMy5yaWdodApAQCAtMCwwICsxLDIwIEBACisxIGEwNDEjYworMiBhMDQxI2MKKzMgYVwwNDEjYworNCBhXDA0MSNjCis1IGFcMDQxI2MKKzYgYVwwNDEjYworNyBhXDA0MSNjCis4IGFcMDQxI2MKKzkgYVwwNDEjYworMTAgYVxjCisxMSBhXGMKKzEyIGFcYworMTMgYVxcYworMTQgYVxcYworMTUgYVxcYworMTYgYVx0YworMTcgYVx0YworMTggYVx0YworMTkgYXRjCisyMCBhXHRjCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDMudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTQ2ZGJiNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMy50ZXN0cwpAQCAtMCwwICsxLDQxIEBACithPSdhYmMnCityPSR7YS8vYi9cMDQxI30KK2VjaG8gMSAkcgorZWNobyAyICR7YS8vYi9cMDQxI30KK2VjaG8gMyAiJHthLy9iL1wwNDEjfSIKKworYT0nYWJjJworcj0ke2EvL2IvXFwwNDEjfQorZWNobyA0ICRyCitlY2hvIDUgJHthLy9iL1xcMDQxI30KK2VjaG8gNiAiJHthLy9iL1xcMDQxI30iCisKK2E9J2FiYycKK2I9J1wwNDEjJworcj0ke2EvL2IvJGJ9CitlY2hvIDcgJHIKK2VjaG8gOCAke2EvL2IvJGJ9CitlY2hvIDkgIiR7YS8vYi8kYn0iCisKK2E9J2FiYycKK2I9J1wnCityPSIke2EvL2IvJGJ9IgorZWNobyAxMCAkcgorZWNobyAxMSAke2EvL2IvJGJ9CitlY2hvIDEyICIke2EvL2IvJGJ9IgorCithPSdhYmMnCitiPSdcXCcKK3I9IiR7YS8vYi8kYn0iCitlY2hvIDEzICRyCitlY2hvIDE0ICR7YS8vYi8kYn0KK2VjaG8gMTUgIiR7YS8vYi8kYn0iCisKK2E9J2FiYycKK2I9J1x0Jworcj0iJHthLy9iLyRifSIKK2VjaG8gMTYgJHIKK2VjaG8gMTcgJHthLy9iLyRifQorZWNobyAxOCAiJHthLy9iLyRifSIKK2VjaG8gMTkgJHthLy9iL1x0fQorZWNobyAyMCAiJHthLy9iL1x0fSIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDBlODUzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g0LnJpZ2h0CkBAIC0wLDAgKzEsMjMgQEAKK1NvdXJjZTogICAgICAgIGEqYlwqYworUmVwbGFjZSBzdHI6ICAgX1xcX1x6XworUGF0dGVybjogICAgICAgc2luZ2xlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgbGl0ZXJhbCBzdGFyIgorSW4gYXNzaWdubWVudDogYV9cX3pfYlwqYworVW5xdW90ZWQ6ICAgICAgYV9cX3pfYlwqYworUXVvdGVkOiAgICAgICAgYV9cX1x6X2JcKmMKK1BhdHRlcm46ICAgICAgIGRvdWJsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgZXZlcnl0aGluZyBhZnRlciBpdCIKK0luIGFzc2lnbm1lbnQ6IGEqYl9cX3pfCitVbnF1b3RlZDogICAgICBhKmJfXF96XworUXVvdGVkOiAgICAgICAgYSpiX1xfXHpfCisKK1NvdXJjZTogICAgICAgIGFcYmMKK1JlcGxhY2Ugc3RyOiAgIF9cXF9cel8KK1BhdHRlcm46ICAgICAgIHNpbmdsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGIiCitJbiBhc3NpZ25tZW50OiBhXF9cX3pfYworVW5xdW90ZWQ6ICAgICAgYVxfXF96X2MKK1F1b3RlZDogICAgICAgIGFcX1xfXHpfYworUGF0dGVybjogICAgICAgZG91YmxlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBiIgorSW4gYXNzaWdubWVudDogYV9cX3pfYworVW5xdW90ZWQ6ICAgICAgYV9cX3pfYworUXVvdGVkOiAgICAgICAgYV9cX1x6X2MKKworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g0LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1NDcwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDQudGVzdHMKQEAgLTAsMCArMSw0NyBAQAorIyBUaGlzIHRlc3RjYXNlIGRlbW9uc3RyYXRlcyB0aGF0IGJhY2tzbGFzaGVzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5CisjIGluIDFzdCBhbmQgMm5kIHBhcnRzIG9mICR7dmFyL3NlYXJjaC9yZXBsfToKKyMgaWYgcXVvdGVkICgiJHt2YXIvc2VhcmNoL3JlcGx9IiksIGFuZCByZXBsIGNvbnRhaW5zIFxhIChhIG5vbi1zcGVjaWFsIGNoYXIpLAorIyB0aGUgYmFja3NsYXNoIGluIHJlcGwgc3RheXM7IGlmIHVucXVvdGVkLCBiYWNrc2xhc2ggaXMgcmVtb3ZlZC4KKyMgQnV0IHNlYXJjaCBwYXJ0IGRvZXMgbm90IGFjdCBsaWtlIHRoYXQ6IFxhIGlzIGFsd2F5cyBjb252ZXJ0ZWQgdG8ganVzdCBhLAorIyBldmVuIGluIHF1b3Rlcy4KKyMKKyMgYmFzaDQgKGFuZCBwcm9iYWJseSBiYXNoMyB0b28pOiAiUXVvdGVkOiIgcmVzdWx0cyBhcmUgZGlmZmVyZW50IGZyb20KKyMgdW5xdW90ZWQgYW5kIGFzc2lnbm1lbnQgZXhwYW5zaW9ucyAtIHRoZXkgaGF2ZSBhIGJhY2tzbGFzaCBiZWZvcmUgei4KKwordj0nYSpiXCpjJworZWNobyAnU291cmNlOiAgICAgICAnICIkdiIKK2VjaG8gJ1JlcGxhY2Ugc3RyOiAgJyAnX1xcX1x6XycKKworZWNobyAnUGF0dGVybjogICAgICAnICdzaW5nbGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBsaXRlcmFsIHN0YXIiJworcj0ke3YvXCovX1xcX1x6X30KK2VjaG8gJ0luIGFzc2lnbm1lbnQ6JyAiJHIiCitlY2hvICdVbnF1b3RlZDogICAgICcgJHt2L1wqL19cXF9cel99CitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cKi9fXFxfXHpffSIKKworZWNobyAnUGF0dGVybjogICAgICAnICdkb3VibGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQiJworcj0ke3YvXFwqL19cXF9cel99CitlY2hvICdJbiBhc3NpZ25tZW50OicgIiRyIgorZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXFwqL19cXF9cel99CitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cXCovX1xcX1x6X30iCisKK2VjaG8KKwordj0nYVxiYycKK2VjaG8gJ1NvdXJjZTogICAgICAgJyAiJHYiCitlY2hvICdSZXBsYWNlIHN0cjogICcgJ19cXF9cel8nCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnc2luZ2xlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYiInCityPSR7di9cYi9fXFxfXHpffQorZWNobyAnSW4gYXNzaWdubWVudDonICIkciIKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xiL19cXF9cel99CitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cYi9fXFxfXHpffSIKKworZWNobyAnUGF0dGVybjogICAgICAnICdkb3VibGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGIiJworcj0ke3YvXFxiL19cXF9cel99CitlY2hvICdJbiBhc3NpZ25tZW50OicgIiRyIgorZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXFxiL19cXF9cel99CitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cXGIvX1xcX1x6X30iCisKK2VjaG8KKworZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g1LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGVkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDUucmlnaHQKQEAgLTAsMCArMSw0IEBACithLworYS9kCithL2UvZgorRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g1LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmNDgyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDUudGVzdHMKQEAgLTAsMCArMSwxMSBAQAorIyBUaGlzIHRlc3RjYXNlIGNoZWNrcyB3aGV0aGVyIHNsYXNoZXMgaW4gJHt2L2EvYn0gYXJlIHBhcnNlZCBiZWZvcmUKKyMgb3IgYWZ0ZXIgZXhwYW5zaW9ucworCit2PSdhL2IvYycKK3M9J2IvYycKK3I9J2UvZicKK2VjaG8gIiR7di8kc30iCitlY2hvICIke3YvJHMvZH0iCitlY2hvICIke3YvJHMvJHJ9IgorCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfbGVhay5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9sZWFrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTVlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfbGVhay5yaWdodApAQCAtMCwwICsxLDQgQEAKK3Nob3VsZCBiZSBlbXB0eTogJycKK3Nob3VsZCBiZSBlbXB0eTogJycKK3Nob3VsZCBiZSBub3QgZW1wdHk6ICd2YWwyJworc2hvdWxkIGJlIG5vdCBlbXB0eTogJ3ZhbDMnCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfbGVhay50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9sZWFrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyNDJlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfbGVhay50ZXN0cwpAQCAtMCwwICsxLDIzIEBACisjIGNhdCBpcyBhbiBleHRlcm5hbCBwcm9ncmFtLCB2YXJpYWJsZSBzaG91bGQgbm90IGxlYWsgb3V0IG9mIGl0LgorIyB0aGlzIGN1cnJlbnRseSBmYWlscyB3aXRoIENPTkZJR19GRUFUVVJFX1NIX05PRk9SSz15CitWQVI9JycKK1ZBUj12YWwwIGNhdCAvZGV2L251bGwKK2VjaG8gInNob3VsZCBiZSBlbXB0eTogJyRWQVInIgorCisjIHRydWUgaXMgYSByZWd1bGFyIGJ1aWx0aW4sIHZhcmlhYmxlIHNob3VsZCBub3QgbGVhayBvdXQgb2YgaXQuCitWQVI9JycKK1ZBUj12YWwxIHRydWUKK2VjaG8gInNob3VsZCBiZSBlbXB0eTogJyRWQVInIgorCisjIGFzaCBmb2xsb3dzIHRoZSAic3BlY2lhbCBidWlsdGluIGxlYWtzIHZhcmlhYmxlcyIgcnVsZSBoZXJlOgorIyBleGVjIGlzIGEgc3BlY2lhbCBidWlsdGluLiAoYmFzaCBkb2VzIG5vdCBkbyBpdCkKK1ZBUj0nJworVkFSPXZhbDIgZXhlYyAyPiYxCitlY2hvICJzaG91bGQgYmUgbm90IGVtcHR5OiAnJFZBUiciCisKKyMgYXNoIGZvbGxvd3MgdGhlICJmdW5jdGlvbiBjYWxsIGlzIGEgc3BlY2lhbCBidWlsdGluIiBydWxlIGhlcmUKKyMgKGJhc2ggZG9lcyBub3QgZG8gaXQpCitmKCkgeyB0cnVlOyB9CitWQVI9JycKK1ZBUj12YWwzIGYKK2VjaG8gInNob3VsZCBiZSBub3QgZW1wdHk6ICckVkFSJyIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9wb3NpeDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfcG9zaXgxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjM1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfcG9zaXgxLnJpZ2h0CkBAIC0wLDAgKzEsMTcgQEAKK2FiY2RjZAorYWJjZGNkCithYmNkY2QKK2NkY2QKK2JhYmNkY2QKK2JhYmNkY2QKK2FiYWJjZGNkCisKK2FiYWJjZAorYWJhYmNkCithYmFiY2QKK2FiYWIKK2FiYWJjZGMKK2FiYWJjZGMKK2FiYWJjZGNkCisKK2VuZApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX3Bvc2l4MS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9wb3NpeDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDEzOWUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9wb3NpeDEudGVzdHMKQEAgLTAsMCArMSwyMSBAQAordmFyPWFiYWJjZGNkCisKK2VjaG8gJHt2YXIjYWJ9CitlY2hvICR7dmFyIyNhYn0KK2VjaG8gJHt2YXIjYSpifQorZWNobyAke3ZhciMjYSpifQorZWNobyAke3ZhciM/fQorZWNobyAke3ZhciMjP30KK2VjaG8gJHt2YXIjKn0KK2VjaG8gJHt2YXIjIyp9CisKK2VjaG8gJHt2YXIlY2R9CitlY2hvICR7dmFyJSVjZH0KK2VjaG8gJHt2YXIlYypkfQorZWNobyAke3ZhciUlYypkfQorZWNobyAke3ZhciU/fQorZWNobyAke3ZhciUlP30KK2VjaG8gJHt2YXIlKn0KK2VjaG8gJHt2YXIlJSp9CisKK2VjaG8gZW5kCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9wcmludGVudi5jIGIvc2hlbGwvYXNoX3Rlc3QvcHJpbnRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGNjZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvcHJpbnRlbnYuYwpAQCAtMCwwICsxLDY3IEBACisvKiBwcmludGVudiAtLSBtaW5pbWFsIGNsb25lIG9mIEJTRCBwcmludGVudigxKS4KKworICAgdXNhZ2U6IHByaW50ZW52IFt2YXJuYW1lXQorCisgICBDaGV0IFJhbWV5CisgICBjaGV0QHBvLmN3cnUuZWR1CisqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCisKKyAgIEJhc2ggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgICB2ZXJzaW9uLgorCisgICBCYXNoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICAgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggQmFzaDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMSBVU0EuICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqKmVudnAsICpldmFsOworICBpbnQgbGVuOworCisgIGFyZ3YrKzsKKyAgYXJnYy0tOworCisgIC8qIHByaW50ZW52ICovCisgIGlmIChhcmdjID09IDApCisgICAgeworICAgICAgZm9yIChlbnZwID0gZW52aXJvbjsgKmVudnA7IGVudnArKykKKwlwdXRzICgqZW52cCk7CisgICAgICBleGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfQorCisgIC8qIHByaW50ZW52IHZhcm5hbWUgKi8KKyAgbGVuID0gc3RybGVuICgqYXJndik7CisgIGZvciAoZW52cCA9IGVudmlyb247ICplbnZwOyBlbnZwKyspCisgICAgeworICAgICAgaWYgKCoqYXJndiA9PSAqKmVudnAgJiYgc3RybmNtcCAoKmVudnAsICphcmd2LCBsZW4pID09IDApCisJeworCSAgZXZhbCA9ICplbnZwICsgbGVuOworCSAgLyogSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXNuJ3QgaGF2ZSBhbiBgPScsIGlnbm9yZSBpdC4gKi8KKwkgIGlmICgqZXZhbCA9PSAnPScpCisJICAgIHsKKwkgICAgICBwdXRzIChldmFsICsgMSk7CisJICAgICAgZXhpdChFWElUX1NVQ0NFU1MpOworCSAgICB9CisJfQorICAgIH0KKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvcmVjaG8uYyBiL3NoZWxsL2FzaF90ZXN0L3JlY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhNWZlYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L3JlY2hvLmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAgIHJlY2hvIC0tIHJlYWxseSBlY2hvIGFyZ3MsIGJyYWNrZXRlZCB3aXRoIDw+IGFuZCB3aXRoIGludmlzaWJsZSBjaGFycworCSAgICBtYWRlIHZpc2libGUuCisKKyAgIENoZXQgUmFtZXkKKyAgIGNoZXRAcG8uY3dydS5lZHUKKyovCisKKy8qIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmFzaCwgdGhlIEJvdXJuZSBBZ2FpbiBTSGVsbC4KKworICAgQmFzaCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAgIHZlcnNpb24uCisKKyAgIEJhc2ggaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgICBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCBCYXNoOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExIFVTQS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3ZvaWQgc3RycHJpbnQoKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlwcmludGYoImFyZ3ZbJWRdID0gPCIsIGkpOworCQlzdHJwcmludChhcmd2W2ldKTsKKwkJcHJpbnRmKCI+XG4iKTsKKwl9CisJZXhpdChFWElUX1NVQ0NFU1MpOworfQorCit2b2lkIHN0cnByaW50KGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBjaGFyICpzOworCisJZm9yIChzID0gKHVuc2lnbmVkIGNoYXIgKilzdHI7IHMgJiYgKnM7IHMrKykgeworCQlpZiAoKnMgPCAnICcpIHsKKwkJCXB1dGNoYXIoJ14nKTsKKwkJCXB1dGNoYXIoKnMrNjQpOworCQl9IGVsc2UgaWYgKCpzID09IDEyNykgeworCQkJcHV0Y2hhcignXicpOworCQkJcHV0Y2hhcignPycpOworCQl9IGVsc2UKKwkJCXB1dGNoYXIoKnMpOworCX0KK30KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L3J1bi1hbGwgYi9zaGVsbC9hc2hfdGVzdC9ydW4tYWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkOTNlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9ydW4tYWxsCkBAIC0wLDAgKzEsNzQgQEAKKyMhL2Jpbi9zaAorCitUT1BESVI9JFBXRAorCit0ZXN0IC14IGFzaCB8fCB7CisgICAgZWNobyAiTm8gLi9hc2ggLSBjcmVhdGluZyBhIGxpbmsgdG8gLi4vLi4vYnVzeWJveCIKKyAgICBsbiAtcyAuLi8uLi9idXN5Ym94IGFzaAorfQordGVzdCAteCBwcmludGVudiB8fCBnY2MgLU8yIC1vIHByaW50ZW52IHByaW50ZW52LmMgfHwgZXhpdCAkPwordGVzdCAteCByZWNobyAgICB8fCBnY2MgLU8yIC1vIHJlY2hvICAgIHJlY2hvLmMgICAgfHwgZXhpdCAkPwordGVzdCAteCB6ZWNobyAgICB8fCBnY2MgLU8yIC1vIHplY2hvICAgIHplY2hvLmMgICAgfHwgZXhpdCAkPworCitQQVRIPSIkUFdEOiRQQVRIIiAjIGZvciBhc2ggYW5kIHJlY2hvL3plY2hvL3ByaW50ZW52CitleHBvcnQgUEFUSAorCitUSElTX1NIPSIkUFdEL2FzaCIKK2V4cG9ydCBUSElTX1NICisKK2RvX3Rlc3QoKQoreworICAgIHRlc3QgLWQgIiQxIiB8fCByZXR1cm4gMAorIyAgIGVjaG8gZG9fdGVzdCAiJDEiCisgICAgIyAkMSBidXQgd2l0aCAvIHJlcGxhY2VkIGJ5ICMgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBmaWxlbmFtZSBwYXJ0CisgICAgbm9zbGFzaD1gZWNobyAiJDEiIHwgc2VkICdzOi86IzpnJ2AKKyAgICAoCisgICAgY2QgIiQxIiB8fCB7IGVjaG8gImNhbm5vdCBjZCAkMSEiOyBleGl0IDE7IH0KKyAgICBmb3IgeCBpbiBydW4tKjsgZG8KKwl0ZXN0IC1mICIkeCIgfHwgY29udGludWUKKwljYXNlICIkeCIgaW4KKwkgICAgIiQwInxydW4tbWluaW1hbHxydW4tZ3Byb2YpIDs7CisJICAgICoub3JpZ3wqfikgOzsKKwkgICAgIyopIGVjaG8gJHggOyBzaCAkeCA7OworCSAgICAqKQorCSAgICBzaCAiJHgiID4iJFRPUERJUi8kbm9zbGFzaC0keC5mYWlsIiAyPiYxICYmIFwKKwkgICAgeyBlY2hvICIkMS8keDogb2siOyBybSAiJFRPUERJUi8kbm9zbGFzaC0keC5mYWlsIjsgfSB8fCBlY2hvICIkMS8keDogZmFpbCI7CisJICAgIDs7CisJZXNhYworICAgIGRvbmUKKyAgICAjIE1hbnkgYmFzaCBydW4tWFhYIHNjcmlwdHMganVzdCBkbyB0aGlzLAorICAgICMgbm8gcG9pbnQgaW4gZHVwbGljYXRpb24gaXQgYWxsIG92ZXIgdGhlIHBsYWNlCisgICAgZm9yIHggaW4gKi50ZXN0czsgZG8KKwl0ZXN0IC14ICIkeCIgfHwgY29udGludWUKKwluYW1lPSIke3glJS50ZXN0c30iCisJdGVzdCAtZiAiJG5hbWUucmlnaHQiIHx8IGNvbnRpbnVlCisJeworCSAgICAiJFRISVNfU0giICIuLyR4IiA+IiRuYW1lLnh4IiAyPiYxCisJICAgIGRpZmYgLXUgIiRuYW1lLnh4IiAiJG5hbWUucmlnaHQiID4iJFRPUERJUi8kbm9zbGFzaC0keC5mYWlsIiBcCisJICAgICYmIHJtIC1mICIkbmFtZS54eCIgIiRUT1BESVIvJG5vc2xhc2gtJHguZmFpbCIKKwl9ICYmIGVjaG8gIiQxLyR4OiBvayIgfHwgZWNobyAiJDEvJHg6IGZhaWwiCisgICAgZG9uZQorICAgICkKK30KKworIyBtYWluIHBhcnQgb2YgdGhpcyBzY3JpcHQKKyMgVXNhZ2U6IHJ1bi1hbGwgW2RpcmVjdG9yaWVzXQorCitpZiBbICQjIC1sdCAxIF07IHRoZW4KKyAgICAjIEFsbCBzdWIgZGlyZWN0b3JpZXMKKyAgICBtb2R1bGVzPWBscyAtZCBhc2gtKmAKKyAgICAjIElmIHlvdSB3YW50IHRvIHRlc3QgYXNoIGFnYWluc3QgaHVzaCBhbmQgbXNoIHRlc3RzdWl0ZXMKKyAgICAjIChoYXZlIHRvIGNvcHkgaHVzaF90ZXN0IGFuZCBtc2hfdGVzdCBkaXJzIHRvIGN1cnJlbnQgZGlyIGZpcnN0KToKKyAgICAjbW9kdWxlcz1gbHMgLWQgYXNoLSogaHVzaF90ZXN0L2h1c2gtKiBtc2hfdGVzdC9tc2gtKmAKKworICAgIGZvciBtb2R1bGUgaW4gJG1vZHVsZXM7IGRvCisJZG9fdGVzdCAkbW9kdWxlCisgICAgZG9uZQorZWxzZQorICAgIHdoaWxlIFsgJCMgLWdlIDEgXTsgZG8KKwlpZiBbIC1kICQxIF07IHRoZW4KKwkgICAgZG9fdGVzdCAkMQorCWZpCisJc2hpZnQKKyAgICBkb25lCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvemVjaG8uYyBiL3NoZWxsL2FzaF90ZXN0L3plY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhYTU5YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L3plY2hvLmMKQEAgLTAsMCArMSwzNiBAQAorLyogemVjaG8gLSBiYXJlLWJvbmVzIGVjaG8gKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgorCisgICBCYXNoIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgdmVyc2lvbi4KKworICAgQmFzaCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICB3aXRoIEJhc2g7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEgVVNBLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWFyZ3YrKzsKKworCXdoaWxlICgqYXJndikgeworCQkodm9pZClwcmludGYoIiVzIiwgKmFyZ3YpOworCQlpZiAoKisrYXJndikKKwkJCXB1dGNoYXIoJyAnKTsKKwl9CisKKwlwdXRjaGFyKCdcbicpOworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL3NoZWxsL2JyYWNlLnR4dCBiL3NoZWxsL2JyYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQ4NjFiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYnJhY2UudHh0CkBAIC0wLDAgKzEsNTAgQEAKK0JyYWNlIEV4cGFuc2lvbgorCitCcmFjZSBleHBhbnNpb24gaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggYXJiaXRyYXJ5IHN0cmluZ3MgbWF5IGJlIGdlbmVyLQorYXRlZC4gICBUaGlzICBtZWNoYW5pc20gaXMgc2ltaWxhciB0byBwYXRobmFtZSBleHBhbnNpb24sIGJ1dCB0aGUgZmlsZS0KK25hbWVzIGdlbmVyYXRlZCBuZWVkIG5vdCBleGlzdC4gIFBhdHRlcm5zIHRvIGJlIGJyYWNlIGV4cGFuZGVkIHRha2UgdGhlCitmb3JtIG9mIGFuIG9wdGlvbmFsIHByZWFtYmxlLCBmb2xsb3dlZCBieSBlaXRoZXIgYSBzZXJpZXMgb2YgY29tbWEtc2VwLQorYXJhdGVkIHN0cmluZ3Mgb3IgYSBzZXF1ZW5jZSBleHByZXNzaW9uIGJldHdlZW4gYSBwYWlyIG9mIGJyYWNlcywgIGZvbC0KK2xvd2VkICBieSAgYW4gIG9wdGlvbmFsICBwb3N0c2NyaXB0LiAgIFRoZSBwcmVhbWJsZSBpcyBwcmVmaXhlZCB0byBlYWNoCitzdHJpbmcgY29udGFpbmVkIHdpdGhpbiB0aGUgYnJhY2VzLCBhbmQgdGhlIHBvc3RzY3JpcHQgaXMgdGhlbiBhcHBlbmRlZAordG8gZWFjaCByZXN1bHRpbmcgc3RyaW5nLCBleHBhbmRpbmcgbGVmdCB0byByaWdodC4KKworQnJhY2UgIGV4cGFuc2lvbnMgIG1heSAgYmUgbmVzdGVkLiAgVGhlIHJlc3VsdHMgb2YgZWFjaCBleHBhbmRlZCBzdHJpbmcKK2FyZSBub3Qgc29ydGVkOyAgbGVmdCAgdG8gIHJpZ2h0ICBvcmRlciAgaXMgIHByZXNlcnZlZC4gICBGb3IgIGV4YW1wbGUsCithe2QsYyxifWUgZXhwYW5kcyBpbnRvIGBhZGUgYWNlIGFiZScuCisKK0EgIHNlcXVlbmNlICBleHByZXNzaW9uIHRha2VzIHRoZSBmb3JtIHt4Li55fSwgd2hlcmUgeCBhbmQgeSBhcmUgZWl0aGVyCitpbnRlZ2VycyBvciBzaW5nbGUgY2hhcmFjdGVycy4gIFdoZW4gaW50ZWdlcnMgYXJlIHN1cHBsaWVkLCB0aGUgZXhwcmVzLQorc2lvbiAgZXhwYW5kcyAgdG8gZWFjaCBudW1iZXIgYmV0d2VlbiB4IGFuZCB5LCBpbmNsdXNpdmUuICBXaGVuIGNoYXJhYy0KK3RlcnMgYXJlIHN1cHBsaWVkLCB0aGUgZXhwcmVzc2lvbiBleHBhbmRzICB0byAgZWFjaCAgY2hhcmFjdGVyICBsZXhpY28tCitncmFwaGljYWxseSBiZXR3ZWVuIHggYW5kIHksIGluY2x1c2l2ZS4gIE5vdGUgdGhhdCBib3RoIHggYW5kIHkgbXVzdCBiZQorb2YgdGhlIHNhbWUgdHlwZS4KKworQnJhY2UgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZCBiZWZvcmUgYW55IG90aGVyIGV4cGFuc2lvbnMsIGFuZCBhbnkgY2hhci0KK2FjdGVycyAgc3BlY2lhbCB0byBvdGhlciBleHBhbnNpb25zIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIHJlc3VsdC4gIEl0IGlzCitzdHJpY3RseSB0ZXh0dWFsLiAgQmFzaCBkb2VzIG5vdCBhcHBseSBhbnkgc3ludGFjdGljIGludGVycHJldGF0aW9uICB0bwordGhlIGNvbnRleHQgb2YgdGhlIGV4cGFuc2lvbiBvciB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBicmFjZXMuCisKK0EgIGNvcnJlY3RseS1mb3JtZWQgIGJyYWNlICBleHBhbnNpb24gbXVzdCBjb250YWluIHVucXVvdGVkIG9wZW5pbmcgYW5kCitjbG9zaW5nIGJyYWNlcywgYW5kIGF0IGxlYXN0IG9uZSB1bnF1b3RlZCBjb21tYSAgb3IgIGEgIHZhbGlkICBzZXF1ZW5jZQorZXhwcmVzc2lvbi4gICBBbnkgaW5jb3JyZWN0bHkgZm9ybWVkIGJyYWNlIGV4cGFuc2lvbiBpcyBsZWZ0IHVuY2hhbmdlZC4KK0EgeyBvciAsIG1heSBiZSBxdW90ZWQgd2l0aCBhIGJhY2tzbGFzaCB0byBwcmV2ZW50IGl0cyBiZWluZyBjb25zaWRlcmVkCitwYXJ0ICBvZiAgYSBicmFjZSBleHByZXNzaW9uLiAgVG8gYXZvaWQgY29uZmxpY3RzIHdpdGggcGFyYW1ldGVyIGV4cGFuLQorc2lvbiwgdGhlIHN0cmluZyAkeyBpcyBub3QgY29uc2lkZXJlZCBlbGlnaWJsZSBmb3IgYnJhY2UgZXhwYW5zaW9uLgorCitUaGlzIGNvbnN0cnVjdCBpcyB0eXBpY2FsbHkgdXNlZCBhcyBzaG9ydGhhbmQgd2hlbiB0aGUgY29tbW9uIHByZWZpeCBvZgordGhlIHN0cmluZ3MgdG8gYmUgZ2VuZXJhdGVkIGlzIGxvbmdlciB0aGFuIGluIHRoZSBhYm92ZSBleGFtcGxlOgorCisgICAgICAgbWtkaXIgL3Vzci9sb2NhbC9zcmMvYmFzaC97b2xkLG5ldyxkaXN0LGJ1Z3N9CitvcgorICAgICAgIGNob3duIHJvb3QgL3Vzci97dWNiL3tleCxlZGl0fSxsaWIve2V4Py4/Kixob3dfZXh9fQorCitCcmFjZSAgZXhwYW5zaW9uICBpbnRyb2R1Y2VzICBhICBzbGlnaHQgaW5jb21wYXRpYmlsaXR5IHdpdGggaGlzdG9yaWNhbAordmVyc2lvbnMgb2Ygc2guICBzaCBkb2VzIG5vdCB0cmVhdCBvcGVuaW5nIG9yIGNsb3NpbmcgYnJhY2VzICBzcGVjaWFsbHkKK3doZW4gIHRoZXkgIGFwcGVhciBhcyBwYXJ0IG9mIGEgd29yZCwgYW5kIHByZXNlcnZlcyB0aGVtIGluIHRoZSBvdXRwdXQuCitCYXNoIHJlbW92ZXMgYnJhY2VzIGZyb20gd29yZHMgYXMgYSAgY29uc2VxdWVuY2UgIG9mICBicmFjZSAgZXhwYW5zaW9uLgorRm9yICBleGFtcGxlLCAgYSB3b3JkIGVudGVyZWQgdG8gc2ggYXMgZmlsZXsxLDJ9IGFwcGVhcnMgaWRlbnRpY2FsbHkgaW4KK3RoZSBvdXRwdXQuICBUaGUgc2FtZSB3b3JkIGlzIG91dHB1dCBhcyBmaWxlMSBmaWxlMiBhZnRlciBleHBhbnNpb24gIGJ5CitiYXNoLiAgIElmIHN0cmljdCBjb21wYXRpYmlsaXR5IHdpdGggc2ggaXMgZGVzaXJlZCwgc3RhcnQgYmFzaCB3aXRoIHRoZQorK0Igb3B0aW9uIG9yIGRpc2FibGUgYnJhY2UgZXhwYW5zaW9uIHdpdGggdGhlICtCIG9wdGlvbiB0byB0aGUgc2V0IGNvbS0KK21hbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2N0dHloYWNrLmMgYi9zaGVsbC9jdHR5aGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWExMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9jdHR5aGFjay5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLy9hcHBsZXQ6SUZfQ1RUWUhBQ0soQVBQTEVUKGN0dHloYWNrLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQ1RUWUhBQ0spICs9IGN0dHloYWNrLm8KKworLy9jb25maWc6Y29uZmlnIENUVFlIQUNLCisvL2NvbmZpZzoJYm9vbCAiY3R0eWhhY2siCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgT25lIGNvbW1vbiBwcm9ibGVtIHJlcG9ydGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgaXMgdGhlICJjYW4ndAorLy9jb25maWc6CSAgYWNjZXNzIHR0eTsgam9iIGNvbnRyb2wgdHVybmVkIG9mZiIgZXJyb3IgbWVzc2FnZSwgd2hpY2ggdHlwaWNhbGx5CisvL2NvbmZpZzoJICBhcHBlYXJzIHdoZW4gb25lIHRyaWVzIHRvIHVzZSBhIHNoZWxsIHdpdGggc3RkaW4vc3Rkb3V0IG9uCisvL2NvbmZpZzoJICAvZGV2L2NvbnNvbGUuCisvL2NvbmZpZzoJICBUaGlzIGRldmljZSBpcyBzcGVjaWFsIC0gaXQgY2Fubm90IGJlIGEgY29udHJvbGxpbmcgdHR5LgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIHVzZSB0aGUgY29ycmVjdCBkZXZpY2UgaW5zdGVhZCBvZgorLy9jb25maWc6CSAgL2Rldi9jb25zb2xlLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBjdHR5aGFjayBwcm92aWRlcyBhICJxdWljayBhbmQgZGlydHkiIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4KKy8vY29uZmlnOgkgIEl0IGFuYWx5emVzIHN0ZGluIHdpdGggdmFyaW91cyBpb2N0bHMsIHRyeWluZyB0byBkZXRlcm1pbmUgd2hldGhlcgorLy9jb25maWc6CSAgaXQgaXMgYSAvZGV2L3R0eU4gb3IgL2Rldi90dHlTTiAodmlydHVhbCB0ZXJtaW5hbCBvciBzZXJpYWwgbGluZSkuCisvL2NvbmZpZzoJICBPbiBMaW51eCBpdCBhbHNvIGNoZWNrcyBzeXNmcyBmb3IgYSBwb2ludGVyIHRvIHRoZSBhY3RpdmUgY29uc29sZS4KKy8vY29uZmlnOgkgIElmIGN0dHloYWNrIGlzIGFibGUgdG8gZmluZCB0aGUgcmVhbCBjb25zb2xlIGRldmljZSwgaXQgY2xvc2VzCisvL2NvbmZpZzoJICBzdGRpbi9vdXQvZXJyIGFuZCByZW9wZW5zIHRoYXQgZGV2aWNlLgorLy9jb25maWc6CSAgVGhlbiBpdCBleGVjdXRlcyB0aGUgZ2l2ZW4gcHJvZ3JhbS4gT3BlbmluZyB0aGUgZGV2aWNlIHdpbGwgbWFrZQorLy9jb25maWc6CSAgdGhhdCBkZXZpY2UgYSBjb250cm9sbGluZyB0dHkuIFRoaXMgbWF5IHJlcXVpcmUgY3R0eWhhY2sKKy8vY29uZmlnOgkgIHRvIGJlIGEgc2Vzc2lvbiBsZWFkZXIuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIEV4YW1wbGUgZm9yIC9ldGMvaW5pdHRhYiAoZm9yIGJ1c3lib3ggaW5pdCk6CisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIDo6cmVzcGF3bjovYmluL2N0dHloYWNrIC9iaW4vc2gKKy8vY29uZmlnOgorLy9jb25maWc6CSAgU3RhcnRpbmcgYW4gaW50ZXJhY3RpdmUgc2hlbGwgZnJvbSBib290IHNoZWxsIHNjcmlwdDoKKy8vY29uZmlnOgorLy9jb25maWc6CSAgc2V0c2lkIGN0dHloYWNrIHNoCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIEdpdmluZyBjb250cm9sbGluZyB0dHkgdG8gc2hlbGwgcnVubmluZyB3aXRoIFBJRCAxOgorLy9jb25maWc6CisvL2NvbmZpZzoJICAjIGV4ZWMgY3R0eWhhY2sgc2gKKy8vY29uZmlnOgorLy9jb25maWc6CSAgV2l0aG91dCBjdHR5aGFjaywgeW91IG5lZWQgdG8ga25vdyBleGFjdCB0dHkgbmFtZSwKKy8vY29uZmlnOgkgIGFuZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgorLy9jb25maWc6CisvL2NvbmZpZzoJICAjIGV4ZWMgc2V0c2lkIHNoIC1jICdleGVjIHNoIDwvZGV2L3R0eTEgPi9kZXYvdHR5MSAyPiYxJworLy9jb25maWc6CisKKy8vdXNhZ2U6I2RlZmluZSBjdHR5aGFja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIGN0dHloYWNrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiR2l2ZSBQUk9HIGEgY29udHJvbGxpbmcgdHR5IGlmIHBvc3NpYmxlLiIKKy8vdXNhZ2U6ICAgICAiXG5FeGFtcGxlIGZvciAvZXRjL2luaXR0YWIgKGZvciBidXN5Ym94IGluaXQpOiIKKy8vdXNhZ2U6ICAgICAiXG4JOjpyZXNwYXduOi9iaW4vY3R0eWhhY2sgL2Jpbi9zaCIKKy8vdXNhZ2U6ICAgICAiXG5HaXZpbmcgY29udHJvbGxpbmcgdHR5IHRvIHNoZWxsIHJ1bm5pbmcgd2l0aCBQSUQgMToiCisvL3VzYWdlOiAgICAgIlxuCSQgZXhlYyBjdHR5aGFjayBzaCIKKy8vdXNhZ2U6ICAgICAiXG5TdGFydGluZyBpbnRlcmFjdGl2ZSBzaGVsbCBmcm9tIGJvb3Qgc2hlbGwgc2NyaXB0OiIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0c2lkIGN0dHloYWNrIHNoIgorCisjaWYgIWRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChUSU9DR1NFUklBTCkgJiYgIUVOQUJMRV9XRVJST1IKKyMgd2FybmluZyBjdHR5aGFjayB3aWxsIG5vdCBiZSBhYmxlIHRvIGRldGVjdCBhIGNvbnRyb2xsaW5nIHR0eSBvbiB0aGlzIHN5c3RlbQorI2VuZGlmCisKKy8qIEZyb20gPGxpbnV4L3Z0Lmg+ICovCitzdHJ1Y3QgdnRfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgdl9hY3RpdmU7ICAgICAgICAvKiBhY3RpdmUgdnQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3NpZ25hbDsgICAgICAgIC8qIHNpZ25hbCB0byBzZW5kICovCisJdW5zaWduZWQgc2hvcnQgdl9zdGF0ZTsgICAgICAgICAvKiB2dCBiaXRtYXNrICovCit9OworZW51bSB7IFZUX0dFVFNUQVRFID0gMHg1NjAzIH07IC8qIGdldCBnbG9iYWwgdnQgc3RhdGUgaW5mbyAqLworCisvKiBGcm9tIDxsaW51eC9zZXJpYWwuaD4gKi8KK3N0cnVjdCBzZXJpYWxfc3RydWN0IHsKKwlpbnQJdHlwZTsKKwlpbnQJbGluZTsKKwl1bnNpZ25lZCBpbnQJcG9ydDsKKwlpbnQJaXJxOworCWludAlmbGFnczsKKwlpbnQJeG1pdF9maWZvX3NpemU7CisJaW50CWN1c3RvbV9kaXZpc29yOworCWludAliYXVkX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQJY2xvc2VfZGVsYXk7CisJY2hhcglpb190eXBlOworCWNoYXIJcmVzZXJ2ZWRfY2hhclsxXTsKKwlpbnQJaHViNjsKKwl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQ7ICAgLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0MjsgIC8qIG5vIGxvbmdlciB1c2VkLi4uICovCisJdW5zaWduZWQgY2hhcgkqaW9tZW1fYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAlpb21lbV9yZWdfc2hpZnQ7CisJdW5zaWduZWQgaW50CXBvcnRfaGlnaDsKKwl1bnNpZ25lZCBsb25nCWlvbWFwX2Jhc2U7CS8qIGNvb2tpZSBwYXNzZWQgaW50byBpb3JlbWFwICovCisJaW50CXJlc2VydmVkWzFdOworfTsKKworaW50IGN0dHloYWNrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjdHR5aGFja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWNoYXIgY29uc29sZVtzaXplb2YoaW50KSozICsgMTZdOworCXVuaW9uIHsKKwkJc3RydWN0IHZ0X3N0YXQgdnQ7CisJCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNyOworCQljaGFyIHBhcmFub2lhW3NpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkgKiAzXTsKKwl9IHU7CisKKwlpZiAoISorK2FyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXN0cmNweShjb25zb2xlLCAiL2Rldi90dHkiKTsKKwlmZCA9IG9wZW4oY29uc29sZSwgT19SRFdSKTsKKwlpZiAoZmQgPj0gMCkgeworCQkvKiBXZSBhbHJlYWR5IGhhdmUgY3R0eSwgbm90aGluZyB0byBkbyAqLworCQljbG9zZShmZCk7CisJfSBlbHNlIHsKKwkJLyogV2UgZG9uJ3QgaGF2ZSBjdHR5IChvciBkb24ndCBoYXZlICIvZGV2L3R0eSIgbm9kZS4uLikgKi8KKwkJZG8geworI2lmZGVmIF9fbGludXhfXworCQkJaW50IHMgPSBvcGVuX3JlYWRfY2xvc2UoIi9zeXMvY2xhc3MvdHR5L2NvbnNvbGUvYWN0aXZlIiwKKwkJCQljb25zb2xlICsgNSwgc2l6ZW9mKGNvbnNvbGUpIC0gNSk7CisJCQlpZiAocyA+IDApIHsKKwkJCQkvKiBmb3VuZCBhY3RpdmUgY29uc29sZSB2aWEgc3lzZnMgKExpbnV4IDIuNi4zOCspCisJCQkJICogc3lzZnMgc3RyaW5nIGxvb2tzIGxpa2UgInR0eVMwXG4iIHNvIHphcCB0aGUgbmV3bGluZToKKwkJCQkgKi8KKwkJCQljb25zb2xlWzQgKyBzXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpb2N0bCgwLCBWVF9HRVRTVEFURSwgJnUudnQpID09IDApIHsKKwkJCQkvKiB0aGlzIGlzIGxpbnV4IHZpcnR1YWwgdHR5ICovCisJCQkJc3ByaW50Zihjb25zb2xlICsgOCwgIlMlZCIgKyAxLCB1LnZ0LnZfYWN0aXZlKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorI2lmZGVmIFRJT0NHU0VSSUFMCisJCQlpZiAoaW9jdGwoMCwgVElPQ0dTRVJJQUwsICZ1LnNyKSA9PSAwKSB7CisJCQkJLyogdGhpcyBpcyBhIHNlcmlhbCBjb25zb2xlLCBhc3VtaW5nIGl0IGlzIG5hbWVkIC9kZXYvdHR5U24gKi8KKwkJCQlzcHJpbnRmKGNvbnNvbGUgKyA4LCAiUyVkIiwgdS5zci5saW5lKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQkJLyogbm9wZSwgY291bGQgbm90IGZpbmQgaXQgKi8KKwkJCWdvdG8gcmV0OworCQl9IHdoaWxlICgwKTsKKworCQlmZCA9IG9wZW5fb3Jfd2Fybihjb25zb2xlLCBPX1JEV1IpOworCQlpZiAoZmQgPCAwKQorCQkJZ290byByZXQ7CisJCS8vYmJfZXJyb3JfbXNnKCJzd2l0Y2hpbmcgdG8gJyVzJyIsIGNvbnNvbGUpOworCQlkdXAyKGZkLCAwKTsKKwkJZHVwMihmZCwgMSk7CisJCWR1cDIoZmQsIDIpOworCQl3aGlsZSAoZmQgPiAyKQorCQkJY2xvc2UoZmQtLSk7CisJCS8qIFNvbWUgb3RoZXIgc2Vzc2lvbiBtYXkgaGF2ZSBpdCBhcyBjdHR5LAorCQkgKiBzdGVhbCBpdCBmcm9tIHRoZW06CisJCSAqLworCQlpb2N0bCgwLCBUSU9DU0NUVFksIDEpOworCX0KKworcmV0OgorCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoLmMgYi9zaGVsbC9odXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwYWY5YwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2guYwpAQCAtMCwwICsxLDkxMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEEgcHJvdG90eXBlIEJvdXJuZSBzaGVsbCBncmFtbWFyIHBhcnNlci4KKyAqIEludGVuZGVkIHRvIGZvbGxvdyB0aGUgb3JpZ2luYWwgVGhvbXBzb24gYW5kIFJpdGNoaWUKKyAqICJzbWFsbCBhbmQgc2ltcGxlIGlzIGJlYXV0aWZ1bCIgcGhpbG9zb3BoeSwgd2hpY2gKKyAqIGluY2lkZW50YWxseSBpcyBhIGdvb2QgbWF0Y2ggdG8gdG9kYXkncyBCdXN5Qm94LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBMYXJyeSBEb29saXR0bGUgPGxhcnJ5QGRvb2xpdHRsZS5ib2Eub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDkgIERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBDcmVkaXRzOgorICogICAgICBUaGUgcGFyc2VyIHJvdXRpbmVzIHByb3BlciBhcmUgYWxsIG9yaWdpbmFsIG1hdGVyaWFsLCBmaXJzdAorICogICAgICB3cml0dGVuIERlYyAyMDAwIGFuZCBKYW4gMjAwMSBieSBMYXJyeSBEb29saXR0bGUuICBUaGUKKyAqICAgICAgZXhlY3V0aW9uIGVuZ2luZSwgdGhlIGJ1aWx0aW5zLCBhbmQgbXVjaCBvZiB0aGUgdW5kZXJseWluZworICogICAgICBzdXBwb3J0IGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSBidXN5Ym94LTAuNDlwcmUncyBsYXNoLCB3aGljaCBpcworICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiAgICAgIHdyaXR0ZW4gYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPi4gIFRoYXQsIGluIHR1cm4sCisgKiAgICAgIGlzIGJhc2VkIGluIHBhcnQgb24gbGFkc2guYywgYnkgTWljaGFlbCBLLiBKb2huc29uIGFuZCBFcmlrIFcuCisgKiAgICAgIFRyb2FuLCB3aGljaCB0aGV5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEkgZG9uJ3Qga25vdworICogICAgICBob3cgbXVjaCBvZiB0aGUgSm9obnNvbi9Ucm9hbiBjb2RlIGhhcyBzdXJ2aXZlZCB0aGUgcmVwZWF0ZWQKKyAqICAgICAgcmV3cml0ZXMuCisgKgorICogT3RoZXIgY3JlZGl0czoKKyAqICAgICAgb19hZGRjaHIgZGVyaXZlZCBmcm9tIHNpbWlsYXIgd19hZGRjaGFyIGZ1bmN0aW9uIGluIGdsaWJjLTIuMi4KKyAqICAgICAgcGFyc2VfcmVkaXJlY3QsIHJlZGlyZWN0X29wdF9udW0sIGFuZCBiaWcgY2h1bmtzIG9mIG1haW4KKyAqICAgICAgYW5kIG1hbnkgYnVpbHRpbnMgZGVyaXZlZCBmcm9tIGNvbnRyaWJ1dGlvbnMgYnkgRXJpayBBbmRlcnNlbi4KKyAqICAgICAgTWlzY2VsbGFuZW91cyBidWdmaXhlcyBmcm9tIE1hdHQgS3JhYWkuCisgKgorICogVGhlcmUgYXJlIHR3byBiaWcgKGFuZCByZWxhdGVkKSBhcmNoaXRlY3R1cmUgZGlmZmVyZW5jZXMgYmV0d2VlbgorICogdGhpcyBwYXJzZXIgYW5kIHRoZSBsYXNoIHBhcnNlci4gIE9uZSBpcyB0aGF0IHRoaXMgdmVyc2lvbiBpcworICogYWN0dWFsbHkgZGVzaWduZWQgZnJvbSB0aGUgZ3JvdW5kIHVwIHRvIHVuZGVyc3RhbmQgbmVhcmx5IGFsbAorICogb2YgdGhlIEJvdXJuZSBncmFtbWFyLiAgVGhlIHNlY29uZCwgY29uc2VxdWVudGlhbCBjaGFuZ2UgaXMgdGhhdAorICogdGhlIHBhcnNlciBhbmQgaW5wdXQgcmVhZGVyIGhhdmUgYmVlbiB0dXJuZWQgaW5zaWRlIG91dC4gIE5vdywKKyAqIHRoZSBwYXJzZXIgaXMgaW4gY29udHJvbCwgYW5kIGFza3MgZm9yIGlucHV0IGFzIG5lZWRlZC4gIFRoZSBvbGQKKyAqIHdheSBoYWQgdGhlIGlucHV0IHJlYWRlciBpbiBjb250cm9sLCBhbmQgaXQgYXNrZWQgZm9yIHBhcnNpbmcgdG8KKyAqIHRha2UgcGxhY2UgYXMgbmVlZGVkLiAgVGhlIG5ldyB3YXkgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gcHJvcGVybHkKKyAqIGhhbmRsZSB0aGUgcmVjdXJzaW9uIGltcGxpY2l0IGluIHRoZSB2YXJpb3VzIHN1YnN0aXR1dGlvbnMsIGVzcGVjaWFsbHkKKyAqIGFjcm9zcyBjb250aW51YXRpb24gbGluZXMuCisgKgorICogVE9ET3M6CisgKiAgICAgIGdyZXAgZm9yICJUT0RPIiBhbmQgZml4IChzb21lIG9mIHRoZW0gYXJlIGVhc3kpCisgKiAgICAgIHNwZWNpYWwgdmFyaWFibGVzIChkb25lOiBQV0QsIFBQSUQsIFJBTkRPTSkKKyAqICAgICAgdGlsZGUgZXhwYW5zaW9uCisgKiAgICAgIGFsaWFzZXMKKyAqICAgICAgZm9sbG93IElGUyBydWxlcyBtb3JlIHByZWNpc2VseSwgaW5jbHVkaW5nIHVwZGF0ZSBzZW1hbnRpY3MKKyAqICAgICAgYnVpbHRpbnMgbWFuZGF0ZWQgYnkgc3RhbmRhcmRzIHdlIGRvbid0IHN1cHBvcnQ6CisgKiAgICAgICAgICBbdW5dYWxpYXMsIGNvbW1hbmQsIGZjLCBnZXRvcHRzLCBuZXdncnAsIHJlYWRvbmx5LCB0aW1lcworICogICAgICBtYWtlIGNvbXBsZXggJHt2YXIlLi4ufSBjb25zdHJ1Y3RzIHN1cHBvcnQgb3B0aW9uYWwKKyAqICAgICAgbWFrZSBoZXJlIGRvY3VtZW50cyBvcHRpb25hbAorICoKKyAqIEJhc2ggY29tcGF0IFRPRE86CisgKiAgICAgIHJlZGlyZWN0aW9uIG9mIHN0ZG91dCtzdGRlcnI6ICY+IGFuZCA+JgorICogICAgICByZXNlcnZlZCB3b3JkczogZnVuY3Rpb24gc2VsZWN0CisgKiAgICAgIGFkdmFuY2VkIHRlc3Q6IFtbIF1dCisgKiAgICAgIHByb2Nlc3Mgc3Vic3RpdHV0aW9uOiA8KGxpc3QpIGFuZCA+KGxpc3QpCisgKiAgICAgID1+OiByZWdleCBvcGVyYXRvcgorICogICAgICBsZXQgRVhQUiBbRVhQUi4uLl0KKyAqICAgICAgICAgIEVhY2ggRVhQUiBpcyBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gKEFSSVRITUVUSUMgRVZBTFVBVElPTikKKyAqICAgICAgICAgIElmIHRoZSBsYXN0IGFyZyBldmFsdWF0ZXMgdG8gMCwgbGV0IHJldHVybnMgMTsgMCBvdGhlcndpc2UuCisgKiAgICAgICAgICBOQjogbGV0IGBlY2hvICdhPWEgKyAxJ2AgLSBlcnJvciAoSU9XOiBtdWx0aS13b3JkIGV4cGFuc2lvbiBpcyB1c2VkKQorICogICAgICAoKEVYUFIpKQorICogICAgICAgICAgVGhlIEVYUFIgaXMgZXZhbHVhdGVkIGFjY29yZGluZyB0byBBUklUSE1FVElDIEVWQUxVQVRJT04uCisgKiAgICAgICAgICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byBsZXQgIkVYUFIiLgorICogICAgICAkW0VYUFJdOiBzeW5vbnltIGZvciAkKChFWFBSKSkKKyAqCisgKiBXb24ndCBkbzoKKyAqICAgICAgSW4gYmFzaCwgZXhwb3J0IGJ1aWx0aW4gaXMgc3BlY2lhbCwgaXRzIGFyZ3VtZW50cyBhcmUgYXNzaWdubWVudHMKKyAqICAgICAgICAgIGFuZCB0aGVyZWZvcmUgZXhwYW5zaW9uIG9mIHRoZW0gc2hvdWxkIGJlICJvbmUtd29yZCIgZXhwYW5zaW9uOgorICogICAgICAgICAgICAgICQgZXhwb3J0IGk9YGVjaG8gJ2EgIGInYCAjIGV4cG9ydCBoYXMgb25lIGFyZzogImk9YSAgYiIKKyAqICAgICAgICAgIGNvbXBhcmUgd2l0aDoKKyAqICAgICAgICAgICAgICAkIGxzIGk9YGVjaG8gJ2EgIGInYCAgICAgIyBscyBoYXMgdHdvIGFyZ3M6ICJpPWEiIGFuZCAiYiIKKyAqICAgICAgICAgICAgICBsczogY2Fubm90IGFjY2VzcyBpPWE6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAqICAgICAgICAgICAgICBsczogY2Fubm90IGFjY2VzcyBiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgKiAgICAgICAgICBOb3RlMTogc2FtZSBhcHBsaWVzIHRvIGxvY2FsIGJ1aWx0aW4uCisgKiAgICAgICAgICBOb3RlMjogYmFzaCAzLjIuMzMoMSkgZG9lcyB0aGlzIG9ubHkgaWYgZXhwb3J0IHdvcmQgaXRzZWxmCisgKiAgICAgICAgICBpcyBub3QgcXVvdGVkOgorICogICAgICAgICAgICAgICQgZXhwb3J0IGk9YGVjaG8gJ2FhYSAgYmJiJ2A7IGVjaG8gIiRpIgorICogICAgICAgICAgICAgIGFhYSAgYmJiCisgKiAgICAgICAgICAgICAgJCAiZXhwb3J0IiBpPWBlY2hvICdhYWEgIGJiYidgOyBlY2hvICIkaSIKKyAqICAgICAgICAgICAgICBhYWEKKyAqLworI2lmICEoZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSBcCisJfHwgZGVmaW5lZChfX0FQUExFX18pIFwKKyAgICApCisjIGluY2x1ZGUgPG1hbGxvYy5oPiAgIC8qIGZvciBtYWxsb2NfdHJpbSAqLworI2VuZGlmCisjaW5jbHVkZSA8Z2xvYi5oPgorLyogI2luY2x1ZGUgPGRtYWxsb2MuaD4gKi8KKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisjIGluY2x1ZGUgPGZubWF0Y2guaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnVzeWJveC5oIiAgLyogZm9yIEFQUExFVF9JU19OT0ZPUksvTk9FWEVDICovCisjaW5jbHVkZSAidW5pY29kZS5oIgorI2luY2x1ZGUgInNoZWxsX2NvbW1vbi5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRjaC5oIgorI2lmIEVOQUJMRV9IVVNIX1JBTkRPTV9TVVBQT1JUCisjIGluY2x1ZGUgInJhbmRvbS5oIgorI2Vsc2UKKyMgZGVmaW5lIENMRUFSX1JBTkRPTV9UKHJuZCkgKCh2b2lkKTApCisjZW5kaWYKKyNpZm5kZWYgUElQRV9CVUYKKyMgZGVmaW5lIFBJUEVfQlVGIDQwOTYgIC8qIGFtb3VudCBvZiBidWZmZXJpbmcgaW4gYSBwaXBlICovCisjZW5kaWYKKworLyogTm90IGV2ZXJ5IGxpYmMgaGFzIHNpZ2hhbmRsZXJfdC4gRml4IGl0ICovCit0eXBlZGVmIHZvaWQgKCpodXNoX3NpZ2hhbmRsZXJfdCkoaW50KTsKKyNkZWZpbmUgc2lnaGFuZGxlcl90IGh1c2hfc2lnaGFuZGxlcl90CisKKy8vY29uZmlnOmNvbmZpZyBIVVNICisvL2NvbmZpZzoJYm9vbCAiaHVzaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBodXNoIGlzIGEgc21hbGwgc2hlbGwgKDI1aykuIEl0IGhhbmRsZXMgdGhlIG5vcm1hbCBmbG93IGNvbnRyb2wKKy8vY29uZmlnOgkgIGNvbnN0cnVjdHMgc3VjaCBhcyBpZi90aGVuL2VsaWYvZWxzZS9maSwgZm9yL2luL2RvL2RvbmUsIHdoaWxlIGxvb3BzLAorLy9jb25maWc6CSAgY2FzZS9lc2FjLiBSZWRpcmVjdGlvbnMsIGhlcmUgZG9jdW1lbnRzLCAkKChhcml0aG1ldGljKSkKKy8vY29uZmlnOgkgIGFuZCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZC4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgSXQgd2lsbCBjb21waWxlIGFuZCB3b3JrIG9uIG5vLW1tdSBzeXN0ZW1zLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBJdCBkb2VzIG5vdCBoYW5kbGUgc2VsZWN0LCBhbGlhc2VzLCB0aWxkZSBleHBhbnNpb24sCisvL2NvbmZpZzoJICAmPmZpbGUgYW5kID4mZmlsZSByZWRpcmVjdGlvbiBvZiBzdGRvdXQrc3RkZXJyLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9CQVNIX0NPTVBBVAorLy9jb25maWc6CWJvb2wgImJhc2gtY29tcGF0aWJsZSBleHRlbnNpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfQlJBQ0VfRVhQQU5TSU9OCisvL2NvbmZpZzoJYm9vbCAiQnJhY2UgZXhwYW5zaW9uIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9CQVNIX0NPTVBBVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB7YWJjLGRlZn0gZXh0ZW5zaW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9IRUxQCisvL2NvbmZpZzoJYm9vbCAiaGVscCBidWlsdGluIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBoZWxwIGJ1aWx0aW4gaW4gaHVzaC4gQ29kZSBzaXplICsgfjEga2J5dGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0lOVEVSQUNUSVZFCisvL2NvbmZpZzoJYm9vbCAiSW50ZXJhY3RpdmUgbW9kZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgaW50ZXJhY3RpdmUgbW9kZSAocHJvbXB0IGFuZCBjb21tYW5kIGVkaXRpbmcpLgorLy9jb25maWc6CSAgV2l0aG91dCB0aGlzLCBodXNoIHNpbXBseSByZWFkcyBhbmQgZXhlY3V0ZXMgY29tbWFuZHMKKy8vY29uZmlnOgkgIGZyb20gc3RkaW4ganVzdCBsaWtlIGEgc2hlbGwgc2NyaXB0IGZyb20gYSBmaWxlLgorLy9jb25maWc6CSAgTm8gcHJvbXB0LCBubyBQUzEvUFMyIG1hZ2ljIHNoZWxsIHZhcmlhYmxlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfU0FWRUhJU1RPUlkKKy8vY29uZmlnOglib29sICJTYXZlIGNvbW1hbmQgaGlzdG9yeSB0byAuaHVzaF9oaXN0b3J5IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9JTlRFUkFDVElWRSAmJiBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgaGlzdG9yeSBzYXZpbmcgaW4gaHVzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfSk9CCisvL2NvbmZpZzoJYm9vbCAiSm9iIGNvbnRyb2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNIX0lOVEVSQUNUSVZFCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGpvYiBjb250cm9sOiBDdHJsLVogYmFja2dyb3VuZHMsIEN0cmwtQyBpbnRlcnJ1cHRzIGN1cnJlbnQKKy8vY29uZmlnOgkgIGNvbW1hbmQgKG5vdCBlbnRpcmUgc2hlbGwpLCBmZy9iZyBidWlsdGlucyB3b3JrLiBXaXRob3V0IHRoaXMgb3B0aW9uLAorLy9jb25maWc6CSAgImNtZCAmIiBzdGlsbCB3b3JrcyBieSBzaW1wbHkgc3Bhd25pbmcgYSBwcm9jZXNzIGFuZCBpbW1lZGlhdGVseQorLy9jb25maWc6CSAgcHJvbXB0aW5nIGZvciBuZXh0IGNvbW1hbmQgKG9yIGV4ZWN1dGluZyBuZXh0IGNvbW1hbmQgaW4gYSBzY3JpcHQpLAorLy9jb25maWc6CSAgYnV0IG5vIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXAgaXMgZm9ybWVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9USUNLCisvL2NvbmZpZzoJYm9vbCAiUHJvY2VzcyBzdWJzdGl0dXRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHByb2Nlc3Mgc3Vic3RpdHV0aW9uIGBjb21tYW5kYCBhbmQgJChjb21tYW5kKSBpbiBodXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9JRgorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgaWYvdGhlbi9lbGlmL2Vsc2UvZmkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGlmL3RoZW4vZWxpZi9lbHNlL2ZpIGluIGh1c2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0xPT1BTCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IsIHdoaWxlIGFuZCB1bnRpbCBsb29wcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgZm9yLCB3aGlsZSBhbmQgdW50aWwgbG9vcHMgaW4gaHVzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfQ0FTRQorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgY2FzZSAuLi4gZXNhYyBzdGF0ZW1lbnQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGNhc2UgLi4uIGVzYWMgc3RhdGVtZW50IGluIGh1c2guICs0MDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0ZVTkNUSU9OUworLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgZnVuY25hbWUoKSB7IGNvbW1hbmRzOyB9IHN5bnRheCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3Igc2hlbGwgZnVuY3Rpb25zIGluIGh1c2guICs4MDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0xPQ0FMCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBsb2NhbCBidWlsdGluIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9GVU5DVElPTlMKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3IgbG9jYWwgdmFyaWFibGVzIGluIGZ1bmN0aW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfUkFORE9NX1NVUFBPUlQKKy8vY29uZmlnOglib29sICJQc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCAkUkFORE9NIHZhcmlhYmxlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBwc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCBkeW5hbWljIHZhcmlhYmxlICIkUkFORE9NIi4KKy8vY29uZmlnOgkgIEVhY2ggcmVhZCBvZiAiJFJBTkRPTSIgd2lsbCBnZW5lcmF0ZSBhIG5ldyBwc2V1ZG9yYW5kb20gdmFsdWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0VYUE9SVF9OCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCAnZXhwb3J0IC1uJyBvcHRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZXhwb3J0IC1uIHVuZXhwb3J0cyB2YXJpYWJsZXMuIEl0IGlzIGEgYmFzaCBleHRlbnNpb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX01PREVfWAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgJ2h1c2ggLXgnIG9wdGlvbiBhbmQgJ3NldCAteCcgY29tbWFuZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGluc3RydWN0cyBodXNoIHRvIHByaW50IGNvbW1hbmRzIGJlZm9yZSBleGVjdXRpb24uCisvL2NvbmZpZzoJICBBZGRzIH4zMDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBNU0gKKy8vY29uZmlnOglib29sICJtc2ggKGRlcHJlY2F0ZWQ6IGFsaWFzZWQgdG8gaHVzaCkiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJc2VsZWN0IEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBtc2ggaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLCBwbGVhc2UgbWlncmF0ZSB0byBodXNoLgorLy9jb25maWc6CisKKy8vYXBwbGV0OklGX0hVU0goQVBQTEVUKGh1c2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9NU0goQVBQTEVUKG1zaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfU0hfSVNfSFVTSChBUFBMRVRfT0RETkFNRShzaCwgaHVzaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBzaCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX0JBU0hfSVNfSFVTSChBUFBMRVRfT0RETkFNRShiYXNoLCBodXNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGJhc2gpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfSFVTSCkgKz0gaHVzaC5vIG1hdGNoLm8gc2hlbGxfY29tbW9uLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUKSArPSByYW5kb20ubworCisvKiAtaSAoaW50ZXJhY3RpdmUpIGFuZCAtcyAocmVhZCBzdGRpbikgYXJlIGFsc28gYWNjZXB0ZWQsCisgKiBidXQgY3VycmVudGx5IGRvIG5vdGhpbmcsIHRoZXJlZm9yZSBhcmVuJ3Qgc2hvd24gaW4gaGVscC4KKyAqIE5PTU1VLXNwZWNpZmljIG9wdGlvbnMgYXJlIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IHVzZXJzLAorICogdGhlcmVmb3JlIHdlIGRvbid0IHNob3cgdGhlbSBlaXRoZXIuCisgKi8KKy8vdXNhZ2U6I2RlZmluZSBodXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLW54bF0gWy1jICdTQ1JJUFQnIFtBUkcwIFtBUkdTXV0gLyBGSUxFIFtBUkdTXV0iCisvL3VzYWdlOiNkZWZpbmUgaHVzaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIlVuaXggc2hlbGwgaW50ZXJwcmV0ZXIiCisKKy8vdXNhZ2U6I2RlZmluZSBtc2hfdHJpdmlhbF91c2FnZSBodXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6I2RlZmluZSBtc2hfZnVsbF91c2FnZSBodXNoX2Z1bGxfdXNhZ2UKKworLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfU0hfSVNfSFVTSAorLy91c2FnZTojIGRlZmluZSBzaF90cml2aWFsX3VzYWdlIGh1c2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTojIGRlZmluZSBzaF9mdWxsX3VzYWdlICAgIGh1c2hfZnVsbF91c2FnZQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX0JBU0hfSVNfSFVTSAorLy91c2FnZTojIGRlZmluZSBiYXNoX3RyaXZpYWxfdXNhZ2UgaHVzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiMgZGVmaW5lIGJhc2hfZnVsbF91c2FnZSAgICBodXNoX2Z1bGxfdXNhZ2UKKy8vdXNhZ2U6I2VuZGlmCisKKworLyogQnVpbGQga25vYnMgKi8KKyNkZWZpbmUgTEVBS19IVU5USU5HIDAKKyNkZWZpbmUgQlVJTERfQVNfTk9NTVUgMAorLyogRW5hYmxlL2Rpc2FibGUgc2FuaXR5IGNoZWNrcy4gT2sgdG8gZW5hYmxlIGluIHByb2R1Y3Rpb24sCisgKiBvbmx5IGFkZHMgYSBiaXQgb2YgYmxvYXQuIFNldCB0byA+MSB0byBnZXQgbm9uLXByb2R1Y3Rpb24gbGV2ZWwgdmVyYm9zaXR5LgorICogS2VlcGluZyAxIGZvciBub3cgZXZlbiBpbiByZWxlYXNlZCB2ZXJzaW9ucy4KKyAqLworI2RlZmluZSBIVVNIX0RFQlVHIDEKKy8qIFNsaWdodGx5IGJpZ2dlciAoKzIwMCBieXRlcyksIGJ1dCBmYXN0ZXIgaHVzaC4KKyAqIFNvIGZhciBpdCBvbmx5IGVuYWJsZXMgYSB0cmljayB3aXRoIGNvdW50aW5nIFNJR0NITERzIGFuZCBmb3JrcywKKyAqIHdoaWNoIGFsbG93cyB1cyB0byBkbyBmZXdlciB3YWl0cGlkJ3MuCisgKiAod2UgY2FuIGRldGVjdCBhIGNhc2Ugd2hlcmUgbmVpdGhlciBmb3JrcyB3ZXJlIGRvbmUgbm9yIFNJR0NITERzIGhhcHBlbmVkCisgKiBhbmQgdGhlcmVmb3JlIHdhaXRwaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGxhc3QgdGltZSkKKyAqLworI2RlZmluZSBFTkFCTEVfSFVTSF9GQVNUIDAKKy8qIFRPRE86IGltcGxlbWVudCBzaW1wbGlmaWVkIGNvZGUgZm9yIHVzZXJzIHdoaWNoIGRvIG5vdCBuZWVkICR7dmFyJS4uLn0gb3BzCisgKiBTbyBmYXIgJHt2YXIlLi4ufSBvcHMgYXJlIGFsd2F5cyBlbmFibGVkOgorICovCisjZGVmaW5lIEVOQUJMRV9IVVNIX0RPTExBUl9PUFMgMQorCisKKyNpZiBCVUlMRF9BU19OT01NVQorIyB1bmRlZiBCQl9NTVUKKyMgdW5kZWYgVVNFX0ZPUl9OT01NVQorIyB1bmRlZiBVU0VfRk9SX01NVQorIyBkZWZpbmUgQkJfTU1VIDAKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKQorI2VuZGlmCisKKyNpbmNsdWRlICJOVU1fQVBQTEVUUy5oIgorI2lmIE5VTV9BUFBMRVRTID09IDEKKy8qIFNUQU5EQUxPTkUgZG9lcyBub3QgbWFrZSBzZW5zZSwgYW5kIHdvbid0IGNvbXBpbGUgKi8KKyMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIHVuZGVmIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FIDAKKyMgZGVmaW5lIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSguLi4pCisjIGRlZmluZSBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisjIHVuZGVmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcgMAorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgMAorI2VuZGlmCisKKy8qIERvIHdlIHN1cHBvcnQgQU5ZIGtleXdvcmRzPyAqLworI2lmIEVOQUJMRV9IVVNIX0lGIHx8IEVOQUJMRV9IVVNIX0xPT1BTIHx8IEVOQUJMRV9IVVNIX0NBU0UKKyMgZGVmaW5lIEhBU19LRVlXT1JEUyAxCisjIGRlZmluZSBJRl9IQVNfS0VZV09SRFMoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgSUZfSEFTX05PX0tFWVdPUkRTKC4uLikKKyNlbHNlCisjIGRlZmluZSBIQVNfS0VZV09SRFMgMAorIyBkZWZpbmUgSUZfSEFTX0tFWVdPUkRTKC4uLikKKyMgZGVmaW5lIElGX0hBU19OT19LRVlXT1JEUyguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworLyogSWYgeW91IGNvbW1lbnQgb3V0IG9uZSBvZiB0aGVzZSBiZWxvdywgaXQgd2lsbCBiZSAjZGVmaW5lZCBsYXRlcgorICogdG8gcGVyZm9ybSBkZWJ1ZyBwcmludGZzIHRvIHN0ZGVycjogKi8KKyNkZWZpbmUgZGVidWdfcHJpbnRmKC4uLikgICAgICAgIGRvIHt9IHdoaWxlICgwKQorLyogRmluZXItZ3JhaW5lZCBkZWJ1ZyBzd2l0Y2hlcyAqLworI2RlZmluZSBkZWJ1Z19wcmludGZfcGFyc2UoLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50X3RyZWUoYSwgYikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2V4ZWMoLi4uKSAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfZW52KC4uLikgICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9qb2JzKC4uLikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2V4cGFuZCguLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfdmFyZXhwKC4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9nbG9iKC4uLikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2xpc3QoLi4uKSAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfc3Vic3QoLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9jbGVhbiguLi4pICBkbyB7fSB3aGlsZSAoMCkKKworI2RlZmluZSBFUlJfUFRSICgodm9pZCopKGxvbmcpMSkKKworI2RlZmluZSBKT0JfU1RBVFVTX0ZPUk1BVCAgICAiWyVkXSAlLTIycyAlLjQwc1xuIgorCisjZGVmaW5lIF9TUEVDSUFMX1ZBUlNfU1RSICAgICAiXypAJCE/IyIKKyNkZWZpbmUgU1BFQ0lBTF9WQVJTX1NUUiAgICAgKCJfKkAkIT8jIiArIDEpCisjZGVmaW5lIE5VTUVSSUNfU1BFQ1ZBUlNfU1RSICgiXypAJCE/IyIgKyAzKQorI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiBTdXBwb3J0IC8gYW5kIC8vIHJlcGxhY2Ugb3BzICovCisvKiBOb3RlIHRoYXQgLy8gaXMgc3RvcmVkIGFzIFwgaW4gImVuY29kZWQiIHN0cmluZyByZXByZXNlbnRhdGlvbiAqLworIyBkZWZpbmUgVkFSX0VOQ09ERURfU1VCU1RfT1BTICAgICAgIlxcLyUjOi09Kz8iCisjIGRlZmluZSBWQVJfU1VCU1RfT1BTICAgICAgICAgICAgICgiXFwvJSM6LT0rPyIgKyAxKQorIyBkZWZpbmUgTUlOVVNfUExVU19FUVVBTF9RVUVTVElPTiAoIlxcLyUjOi09Kz8iICsgNSkKKyNlbHNlCisjIGRlZmluZSBWQVJfRU5DT0RFRF9TVUJTVF9PUFMgICAgICAiJSM6LT0rPyIKKyMgZGVmaW5lIFZBUl9TVUJTVF9PUFMgICAgICAgICAgICAgICIlIzotPSs/IgorIyBkZWZpbmUgTUlOVVNfUExVU19FUVVBTF9RVUVTVElPTiAoIiUjOi09Kz8iICsgMykKKyNlbmRpZgorCisjZGVmaW5lIFNQRUNJQUxfVkFSX1NZTUJPTCAgIDMKKworc3RydWN0IHZhcmlhYmxlOworCitzdGF0aWMgY29uc3QgY2hhciBodXNoX3ZlcnNpb25fc3RyW10gQUxJR04xID0gIkhVU0hfVkVSU0lPTj0iQkJfVkVSOworCisvKiBUaGlzIHN1cHBvcnRzIHNhdmluZyBwb2ludGVycyBtYWxsb2NlZCBpbiB2Zm9yayBjaGlsZCwKKyAqIHRvIGJlIGZyZWVkIGluIHRoZSBwYXJlbnQuCisgKi8KKyNpZiAhQkJfTU1VCit0eXBlZGVmIHN0cnVjdCBub21tdV9zYXZlX3QgeworCWNoYXIgKipuZXdfZW52OworCXN0cnVjdCB2YXJpYWJsZSAqb2xkX3ZhcnM7CisJY2hhciAqKmFyZ3Y7CisJY2hhciAqKmFyZ3ZfZnJvbV9yZV9leGVjaW5nOworfSBub21tdV9zYXZlX3Q7CisjZW5kaWYKKworZW51bSB7CisJUkVTX05PTkUgID0gMCwKKyNpZiBFTkFCTEVfSFVTSF9JRgorCVJFU19JRiAgICAsCisJUkVTX1RIRU4gICwKKwlSRVNfRUxJRiAgLAorCVJFU19FTFNFICAsCisJUkVTX0ZJICAgICwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJUkVTX0ZPUiAgICwKKwlSRVNfV0hJTEUgLAorCVJFU19VTlRJTCAsCisJUkVTX0RPICAgICwKKwlSRVNfRE9ORSAgLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMgfHwgRU5BQkxFX0hVU0hfQ0FTRQorCVJFU19JTiAgICAsCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJUkVTX0NBU0UgICwKKwkvKiB0aHJlZSBwc2V1ZG8ta2V5d29yZHMgc3VwcG9ydCBjb250cml2ZWQgImNhc2UiIHN5bnRheDogKi8KKwlSRVNfQ0FTRV9JTiwgICAvKiAiY2FzZSAuLi4gSU4iLCB0dXJucyBpbnRvIFJFU19NQVRDSCB3aGVuIElOIGlzIG9ic2VydmVkICovCisJUkVTX01BVENIICwgICAgLyogIndvcmQpIiAqLworCVJFU19DQVNFX0JPRFksIC8qICJ0aGlzIGNvbW1hbmQgaXMgaW5zaWRlIENBU0UiICovCisJUkVTX0VTQUMgICwKKyNlbmRpZgorCVJFU19YWFhYICAsCisJUkVTX1NOVFgKK307CisKK3R5cGVkZWYgc3RydWN0IG9fc3RyaW5nIHsKKwljaGFyICpkYXRhOworCWludCBsZW5ndGg7IC8qIHBvc2l0aW9uIHdoZXJlIGRhdGEgaXMgYXBwZW5kZWQgKi8KKwlpbnQgbWF4bGVuOworCWludCBvX2V4cGZsYWdzOworCS8qIEF0IGxlYXN0IHNvbWUgcGFydCBvZiB0aGUgc3RyaW5nIHdhcyBpbnNpZGUgJycgb3IgIiIsCisJICogcG9zc2libHkgZW1wdHkgb25lOiB3b3JkIiIsIHdvJydyZCBldGMuICovCisJc21hbGxpbnQgaGFzX3F1b3RlZF9wYXJ0OworCXNtYWxsaW50IGhhc19lbXB0eV9zbG90OworCXNtYWxsaW50IG9fYXNzaWdubWVudDsgLyogMDptYXliZSwgMTp5ZXMsIDI6bm8gKi8KK30gb19zdHJpbmc7CitlbnVtIHsKKwlFWFBfRkxBR19TSU5HTEVXT1JEICAgICA9IDB4ODAsIC8qIG11c3QgYmUgMHg4MCAqLworCUVYUF9GTEFHX0dMT0IgICAgICAgICAgID0gMHgyLAorCS8qIFByb3RlY3QgbmV3bHkgYWRkZWQgY2hhcnMgYWdhaW5zdCBnbG9iYmluZworCSAqIGJ5IHByZXBlbmRpbmcgXCB0byAqLCA/LCBbLCBcICovCisJRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMgPSAweDEsCit9OworZW51bSB7CisJTUFZQkVfQVNTSUdOTUVOVCAgICAgID0gMCwKKwlERUZJTklURUxZX0FTU0lHTk1FTlQgPSAxLAorCU5PVF9BU1NJR05NRU5UICAgICAgICA9IDIsCisJLyogTm90IGFuIGFzc2lnbWVudCwgYnV0IG5leHQgd29yZCBtYXkgYmU6ICJpZiB2PXh5eiBjbWQ7IiAqLworCVdPUkRfSVNfS0VZV09SRCAgICAgICA9IDMsCit9OworLyogVXNlZCBmb3IgaW5pdGlhbGl6YXRpb246IG9fc3RyaW5nIGZvbyA9IE5VTExfT19TVFJJTkc7ICovCisjZGVmaW5lIE5VTExfT19TVFJJTkcgeyBOVUxMIH0KKworI2lmbmRlZiBkZWJ1Z19wcmludGZfcGFyc2UKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhc3NpZ25tZW50X2ZsYWdbXSA9IHsKKwkiTUFZQkVfQVNTSUdOTUVOVCIsCisJIkRFRklOSVRFTFlfQVNTSUdOTUVOVCIsCisJIk5PVF9BU1NJR05NRU5UIiwKKwkiV09SRF9JU19LRVlXT1JEIiwKK307CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgaW5fc3RyIHsKKwljb25zdCBjaGFyICpwOworCS8qIGVvZl9mbGFnPTE6IGxhc3QgY2hhciBpbiAtPnAgaXMgcmVhbGx5IGFuIEVPRiAqLworCWNoYXIgZW9mX2ZsYWc7IC8qIG1lYW5pbmdsZXNzIGlmIC0+cCA9PSBOVUxMICovCisJY2hhciBwZWVrX2J1ZlsyXTsKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCXNtYWxsaW50IHByb21wdG1vZGU7IC8qIDA6IFBTMSwgMTogUFMyICovCisjZW5kaWYKKwlpbnQgbGFzdF9jaGFyOworCUZJTEUgKmZpbGU7CisJaW50ICgqZ2V0KSAoc3RydWN0IGluX3N0ciAqKSBGQVNUX0ZVTkM7CisJaW50ICgqcGVlaykgKHN0cnVjdCBpbl9zdHIgKikgRkFTVF9GVU5DOworfSBpbl9zdHI7CisjZGVmaW5lIGlfZ2V0Y2goaW5wdXQpICgoaW5wdXQpLT5nZXQoaW5wdXQpKQorI2RlZmluZSBpX3BlZWsoaW5wdXQpICgoaW5wdXQpLT5wZWVrKGlucHV0KSkKKworLyogVGhlIGRlc2NyaXAgbWVtYmVyIG9mIHRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCB0byBtYWtlCisgKiBkZWJ1Z2dpbmcgb3V0cHV0IHByZXR0eSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IG1vZGU7CisJc2lnbmVkIGNoYXIgZGVmYXVsdF9mZDsKKwljaGFyIGRlc2NyaXBbM107Cit9IHJlZGlyX3RhYmxlW10gPSB7CisJeyBPX1JET05MWSwgICAgICAgICAgICAgICAgICAwLCAiPCIgIH0sCisJeyBPX0NSRUFUfE9fVFJVTkN8T19XUk9OTFksICAxLCAiPiIgIH0sCisJeyBPX0NSRUFUfE9fQVBQRU5EfE9fV1JPTkxZLCAxLCAiPj4iIH0sCisJeyBPX0NSRUFUfE9fUkRXUiwgICAgICAgICAgICAxLCAiPD4iIH0sCisJeyBPX1JET05MWSwgICAgICAgICAgICAgICAgICAwLCAiPDwiIH0sCisvKiBTaG91bGQgbm90IGJlIG5lZWRlZC4gQm9ndXMgZGVmYXVsdF9mZCBoZWxwcyBpbiBkZWJ1Z2dpbmcgKi8KKy8qCXsgT19SRE9OTFksICAgICAgICAgICAgICAgICA3NywgIjw8IiB9LCAqLworfTsKKworc3RydWN0IHJlZGlyX3N0cnVjdCB7CisJc3RydWN0IHJlZGlyX3N0cnVjdCAqbmV4dDsKKwljaGFyICpyZF9maWxlbmFtZTsgICAgICAgICAgLyogZmlsZW5hbWUgKi8KKwlpbnQgcmRfZmQ7ICAgICAgICAgICAgICAgICAgLyogZmQgdG8gcmVkaXJlY3QgKi8KKwkvKiBmZCB0byByZWRpcmVjdCB0bywgb3IgLTMgaWYgcmRfZmQgaXMgdG8gYmUgY2xvc2VkIChuPiYtKSAqLworCWludCByZF9kdXA7CisJc21hbGxpbnQgcmRfdHlwZTsgICAgICAgICAgIC8qIChlbnVtIHJlZGlyX3R5cGUpICovCisJLyogbm90ZTogZm9yIGhlcmVkb2NzLCByZF9maWxlbmFtZSBjb250YWlucyBoZXJlZG9jIGRlbGltaXRlciwKKwkgKiBhbmQgc3Vic2VxdWVudGx5IGhlcmVkb2MgaXRzZWxmOyBhbmQgcmRfZHVwIGlzIGEgYml0bWFzazoKKwkgKiBiaXQgMDogZG8gd2UgbmVlZCB0byB0cmltIGxlYWRpbmcgdGFicz8KKwkgKiBiaXQgMTogaXMgaGVyZWRvYyBxdW90ZWQgKDw8J2RlbGltJyBzeW50YXgpID8KKwkgKi8KK307Cit0eXBlZGVmIGVudW0gcmVkaXJfdHlwZSB7CisJUkVESVJFQ1RfSU5QVVQgICAgID0gMCwKKwlSRURJUkVDVF9PVkVSV1JJVEUgPSAxLAorCVJFRElSRUNUX0FQUEVORCAgICA9IDIsCisJUkVESVJFQ1RfSU8gICAgICAgID0gMywKKwlSRURJUkVDVF9IRVJFRE9DICAgPSA0LAorCVJFRElSRUNUX0hFUkVET0MyICA9IDUsIC8qIFJFRElSRUNUX0hFUkVET0MgYWZ0ZXIgaGVyZWRvYyBpcyBsb2FkZWQgKi8KKworCVJFRElSRkRfQ0xPU0UgICAgICA9IC0zLAorCVJFRElSRkRfU1lOVEFYX0VSUiA9IC0yLAorCVJFRElSRkRfVE9fRklMRSAgICA9IC0xLAorCS8qIG90aGVyd2lzZSwgcmRfZmQgaXMgcmVkaXJlY3RlZCB0byByZF9kdXAgKi8KKworCUhFUkVET0NfU0tJUFRBQlMgPSAxLAorCUhFUkVET0NfUVVPVEVEICAgPSAyLAorfSByZWRpcl90eXBlOworCisKK3N0cnVjdCBjb21tYW5kIHsKKwlwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgLyogMCBpZiBleGl0ZWQgKi8KKwlpbnQgYXNzaWdubWVudF9jbnQ7ICAgICAgICAgLyogaG93IG1hbnkgYXJndltpXSBhcmUgYXNzaWdubWVudHM/ICovCisJc21hbGxpbnQgaXNfc3RvcHBlZDsgICAgICAgIC8qIGlzIHRoZSBjb21tYW5kIGN1cnJlbnRseSBydW5uaW5nPyAqLworCXNtYWxsaW50IGNtZF90eXBlOyAgICAgICAgICAvKiBDTURfeHh4ICovCisjZGVmaW5lIENNRF9OT1JNQUwgICAwCisjZGVmaW5lIENNRF9TVUJTSEVMTCAxCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qIHVzZWQgZm9yICJbWyBFWFBSIF1dIiAqLworIyBkZWZpbmUgQ01EX1NJTkdMRVdPUkRfTk9HTE9CIDIKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworIyBkZWZpbmUgQ01EX0ZVTkNERUYgMworI2VuZGlmCisKKwlzbWFsbHVpbnQgY21kX2V4aXRjb2RlOworCS8qIGlmIG5vbi1OVUxMLCB0aGlzICJjb21tYW5kIiBpcyB7IGxpc3QgfSwgKCBsaXN0ICksIG9yIGEgY29tcG91bmQgc3RhdGVtZW50ICovCisJc3RydWN0IHBpcGUgKmdyb3VwOworI2lmICFCQl9NTVUKKwljaGFyICpncm91cF9hc19zdHJpbmc7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlzdHJ1Y3QgZnVuY3Rpb24gKmNoaWxkX2Z1bmM7CisvKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gcHJldmVudCBhIGJ1ZyBoZXJlOgorICogd2hpbGUuLi5kbyBmMSgpIHthO307IGYxOyBmMSgpIHtiO307IGYxOyBkb25lCisgKiBXaGVuIHdlIGV4ZWN1dGUgImYxKCkge2E7fSIgY21kLCB3ZSBjcmVhdGUgbmV3IGZ1bmN0aW9uIGFuZCBjbGVhcgorICogY21kLT5ncm91cCwgY21kLT5ncm91cF9hc19zdHJpbmcsIGNtZC0+YXJndlswXS4KKyAqIFdoZW4gd2UgZXhlY3V0ZSAiZjEoKSB7Yjt9Iiwgd2Ugbm90aWNlIHRoYXQgZjEgZXhpc3RzLAorICogYW5kIHRoYXQgaXRzICJwYXJlbnQgY21kIiBzdHJ1Y3QgaXMgc3RpbGwgImFsaXZlIiwKKyAqIHdlIHB1dCB0aG9zZSBmaWVsZHMgYmFjayBpbnRvIGNtZC0+eHh4CisgKiAoc3RydWN0IGZ1bmN0aW9uIGhhcyAtPnBhcmVudF9jbWQgcHRyIHRvIGZhY2lsaXRhdGUgdGhhdCkuCisgKiBXaGVuIHdlIGxvb3AgYmFjaywgd2UgY2FuIGV4ZWN1dGUgImYxKCkge2E7fSIgYWdhaW4gYW5kIHNldCBmMSBjb3JyZWN0bHkuCisgKiBXaXRob3V0IHRoaXMgdHJpY2ssIGxvb3Agd291bGQgZXhlY3V0ZSBhO2I7YjtiOy4uLgorICogaW5zdGVhZCBvZiBjb3JyZWN0IHNlcXVlbmNlIGE7YjthO2I7Li4uCisgKiBXaGVuIGNvbW1hbmQgaXMgZnJlZWQsIGl0IHNldmVycyB0aGUgbGluaworICogKHNldHMgLT5jaGlsZF9mdW5jLT5wYXJlbnRfY21kIHRvIE5VTEwpLgorICovCisjZW5kaWYKKwljaGFyICoqYXJndjsgICAgICAgICAgICAgICAgLyogY29tbWFuZCBuYW1lIGFuZCBhcmd1bWVudHMgKi8KKy8qIGFyZ3YgdmVjdG9yIG1heSBjb250YWluIHZhcmlhYmxlIHJlZmVyZW5jZXMgKF5DdmFyXkMsIF5DMF5DIGV0YykKKyAqIGFuZCBvbiBleGVjdXRpb24gdGhlc2UgYXJlIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgdmFsdWVzLgorICogU3Vic3RpdHV0aW9uIGNhbiBtYWtlIF9zZXZlcmFsXyB3b3JkcyBvdXQgb2Ygb25lIGFyZ3Zbbl0hCisgKiBFeGFtcGxlOiBhcmd2WzBdPT0nLl5DKl5DLicgaGVyZTogZWNobyAuJCouCisgKiBSZWZlcmVuY2VzIG9mIHRoZSBmb3JtIF5DYGNtZCBhcmdeQyBhcmUgYGNtZCBhcmdgIHN1YnN0aXR1dGlvbnMuCisgKi8KKwlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyZWRpcmVjdHM7IC8qIEkvTyByZWRpcmVjdGlvbnMgKi8KK307CisvKiBJcyB0aGVyZSBhbnl0aGluZyBpbiB0aGlzIGNvbW1hbmQgYXQgYWxsPyAqLworI2RlZmluZSBJU19OVUxMX0NNRChjbWQpIFwKKwkoIShjbWQpLT5ncm91cCAmJiAhKGNtZCktPmFyZ3YgJiYgIShjbWQpLT5yZWRpcmVjdHMpCisKK3N0cnVjdCBwaXBlIHsKKwlzdHJ1Y3QgcGlwZSAqbmV4dDsKKwlpbnQgbnVtX2NtZHM7ICAgICAgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGNvbW1hbmRzIGluIHBpcGUgKi8KKwlpbnQgYWxpdmVfY21kczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbW1hbmRzIHJ1bm5pbmcgKG5vdCBleGl0ZWQpICovCisJaW50IHN0b3BwZWRfY21kczsgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21tYW5kcyBhbGl2ZSwgYnV0IHN0b3BwZWQgKi8KKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlpbnQgam9iaWQ7ICAgICAgICAgICAgICAgICAgLyogam9iIG51bWJlciAqLworCXBpZF90IHBncnA7ICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGdyb3VwIElEIGZvciB0aGUgam9iICovCisJY2hhciAqY21kdGV4dDsgICAgICAgICAgICAgIC8qIG5hbWUgb2Ygam9iICovCisjZW5kaWYKKwlzdHJ1Y3QgY29tbWFuZCAqY21kczsgICAgICAgLyogYXJyYXkgb2YgY29tbWFuZHMgaW4gcGlwZSAqLworCXNtYWxsaW50IGZvbGxvd3VwOyAgICAgICAgICAvKiBQSVBFX0JHLCBQSVBFX1NFUSwgUElQRV9PUiwgUElQRV9BTkQgKi8KKwlJRl9IQVNfS0VZV09SRFMoc21hbGxpbnQgcGlfaW52ZXJ0ZWQ7KSAvKiAiISBjbWQgfCBjbWQiICovCisJSUZfSEFTX0tFWVdPUkRTKHNtYWxsaW50IHJlc193b3JkOykgLyogbmVlZGVkIGZvciBpZiwgZm9yLCB3aGlsZSwgdW50aWwuLi4gKi8KK307Cit0eXBlZGVmIGVudW0gcGlwZV9zdHlsZSB7CisJUElQRV9TRVEgPSAxLAorCVBJUEVfQU5EID0gMiwKKwlQSVBFX09SICA9IDMsCisJUElQRV9CRyAgPSA0LAorfSBwaXBlX3N0eWxlOworLyogSXMgdGhlcmUgYW55dGhpbmcgaW4gdGhpcyBwaXBlIGF0IGFsbD8gKi8KKyNkZWZpbmUgSVNfTlVMTF9QSVBFKHBpKSBcCisJKChwaSktPm51bV9jbWRzID09IDAgSUZfSEFTX0tFWVdPUkRTKCAmJiAocGkpLT5yZXNfd29yZCA9PSBSRVNfTk9ORSkpCisKKy8qIFRoaXMgaG9sZHMgcG9pbnRlcnMgdG8gdGhlIHZhcmlvdXMgcmVzdWx0cyBvZiBwYXJzaW5nICovCitzdHJ1Y3QgcGFyc2VfY29udGV4dCB7CisJLyogbGlua2VkIGxpc3Qgb2YgcGlwZXMgKi8KKwlzdHJ1Y3QgcGlwZSAqbGlzdF9oZWFkOworCS8qIGxhc3QgcGlwZSAoYmVpbmcgY29uc3RydWN0ZWQgcmlnaHQgbm93KSAqLworCXN0cnVjdCBwaXBlICpwaXBlOworCS8qIGxhc3QgY29tbWFuZCBpbiBwaXBlIChiZWluZyBjb25zdHJ1Y3RlZCByaWdodCBub3cpICovCisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQ7CisJLyogbGFzdCByZWRpcmVjdCBpbiBjb21tYW5kLT5yZWRpcmVjdHMgbGlzdCAqLworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKnBlbmRpbmdfcmVkaXJlY3Q7CisjaWYgIUJCX01NVQorCW9fc3RyaW5nIGFzX3N0cmluZzsKKyNlbmRpZgorI2lmIEhBU19LRVlXT1JEUworCXNtYWxsaW50IGN0eF9yZXNfdzsKKwlzbWFsbGludCBjdHhfaW52ZXJ0ZWQ7IC8qICIhIGNtZCB8IGNtZCIgKi8KKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJc21hbGxpbnQgY3R4X2RzZW1pY29sb247IC8qICI7OyIgc2VlbiAqLworI2VuZGlmCisJLyogYml0bWFzayBvZiBGTEFHX3h4eCwgZm9yIGZpZ3VyaW5nIG91dCB2YWxpZCByZXNlcnZlZCB3b3JkcyAqLworCWludCBvbGRfZmxhZzsKKwkvKiBncm91cCB3ZSBhcmUgZW5jbG9zZWQgaW46CisJICogZXhhbXBsZTogImlmIHBpcGUxOyBwaXBlMjsgdGhlbiBwaXBlMzsgZmkiCisJICogd2hlbiB3ZSBzZWUgImlmIiBvciAidGhlbiIsIHdlIG1hbGxvYyBhbmQgY29weSBjdXJyZW50IGNvbnRleHQsCisJICogYW5kIG1ha2UgLT5zdGFjayBwb2ludCB0byBpdC4gdGhlbiB3ZSBwYXJzZSBwaXBlTi4KKwkgKiB3aGVuIGNsb3NpbmcgInRoZW4iIC8gZmkiIC8gd2hhdGV2ZXIgaXMgZm91bmQsCisJICogd2UgbW92ZSBsaXN0X2hlYWQgaW50byAtPnN0YWNrLT5jb21tYW5kLT5ncm91cCwKKwkgKiBjb3B5IC0+c3RhY2sgaW50byBjdXJyZW50IGNvbnRleHQsIGFuZCBkZWxldGUgLT5zdGFjay4KKwkgKiAocGFyc2luZyBvZiB7IGxpc3QgfSBhbmQgKCBsaXN0ICkgZG9lc24ndCB1c2UgdGhpcyBtZXRob2QpCisJICovCisJc3RydWN0IHBhcnNlX2NvbnRleHQgKnN0YWNrOworI2VuZGlmCit9OworCisvKiBPbiBwcm9ncmFtIHN0YXJ0LCBlbnZpcm9uIHBvaW50cyB0byBpbml0aWFsIGVudmlyb25tZW50LgorICogcHV0ZW52IGFkZHMgbmV3IHBvaW50ZXJzIGludG8gaXQsIHVuc2V0ZW52IHJlbW92ZXMgdGhlbS4KKyAqIE5laXRoZXIgb2YgdGhlc2UgKGRlKWFsbG9jYXRlcyB0aGUgc3RyaW5ncy4KKyAqIHNldGVudiBhbGxvY2F0ZXMgbmV3IHN0cmluZ3MgaW4gbWFsbG9jIHNwYWNlIGFuZCBkb2VzIHB1dGVudiwKKyAqIGFuZCB0aHVzIHNldGVudiBpcyB1bnVzYWJsZSAobGVha3kpIGZvciBzaGVsbCdzIHB1cnBvc2VzICovCisjZGVmaW5lIHNldGVudiguLi4pIHNldGVudl9pc19sZWFreV9kb250X3VzZSgpCitzdHJ1Y3QgdmFyaWFibGUgeworCXN0cnVjdCB2YXJpYWJsZSAqbmV4dDsKKwljaGFyICp2YXJzdHI7ICAgICAgICAvKiBwb2ludHMgdG8gIm5hbWU9IiBwb3J0aW9uICovCisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwl1bnNpZ25lZCBmdW5jX25lc3RfbGV2ZWw7CisjZW5kaWYKKwlpbnQgbWF4X2xlbjsgICAgICAgICAvKiBpZiA+IDAsIG5hbWUgaXMgcGFydCBvZiBpbml0aWFsIGVudjsgZWxzZSBuYW1lIGlzIG1hbGxvY2VkICovCisJc21hbGxpbnQgZmxnX2V4cG9ydDsgLyogcHV0ZW52IHNob3VsZCBiZSBkb25lIG9uIHRoaXMgdmFyICovCisJc21hbGxpbnQgZmxnX3JlYWRfb25seTsKK307CisKK2VudW0geworCUJDX0JSRUFLID0gMSwKKwlCQ19DT05USU5VRSA9IDIsCit9OworCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdHJ1Y3QgZnVuY3Rpb24geworCXN0cnVjdCBmdW5jdGlvbiAqbmV4dDsKKwljaGFyICpuYW1lOworCXN0cnVjdCBjb21tYW5kICpwYXJlbnRfY21kOworCXN0cnVjdCBwaXBlICpib2R5OworIyBpZiAhQkJfTU1VCisJY2hhciAqYm9keV9hc19zdHJpbmc7CisjIGVuZGlmCit9OworI2VuZGlmCisKKworLyogc2V0IC0vK28gT1BUIHN1cHBvcnQuIChUT0RPOiBtYWtlIGl0IG9wdGlvbmFsKQorICogYmFzaCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdHM6CisgKiBhbGxleHBvcnQgICAgICAgb2ZmCisgKiBicmFjZWV4cGFuZCAgICAgb24KKyAqIGVtYWNzICAgICAgICAgICBvbgorICogZXJyZXhpdCAgICAgICAgIG9mZgorICogZXJydHJhY2UgICAgICAgIG9mZgorICogZnVuY3RyYWNlICAgICAgIG9mZgorICogaGFzaGFsbCAgICAgICAgIG9uCisgKiBoaXN0ZXhwYW5kICAgICAgb2ZmCisgKiBoaXN0b3J5ICAgICAgICAgb24KKyAqIGlnbm9yZWVvZiAgICAgICBvZmYKKyAqIGludGVyYWN0aXZlLWNvbW1lbnRzICAgIG9uCisgKiBrZXl3b3JkICAgICAgICAgb2ZmCisgKiBtb25pdG9yICAgICAgICAgb24KKyAqIG5vY2xvYmJlciAgICAgICBvZmYKKyAqIG5vZXhlYyAgICAgICAgICBvZmYKKyAqIG5vZ2xvYiAgICAgICAgICBvZmYKKyAqIG5vbG9nICAgICAgICAgICBvZmYKKyAqIG5vdGlmeSAgICAgICAgICBvZmYKKyAqIG5vdW5zZXQgICAgICAgICBvZmYKKyAqIG9uZWNtZCAgICAgICAgICBvZmYKKyAqIHBoeXNpY2FsICAgICAgICBvZmYKKyAqIHBpcGVmYWlsICAgICAgICBvZmYKKyAqIHBvc2l4ICAgICAgICAgICBvZmYKKyAqIHByaXZpbGVnZWQgICAgICBvZmYKKyAqIHZlcmJvc2UgICAgICAgICBvZmYKKyAqIHZpICAgICAgICAgICAgICBvZmYKKyAqIHh0cmFjZSAgICAgICAgICBvZmYKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgb19vcHRfc3RyaW5nc1tdIEFMSUdOMSA9CisJInBpcGVmYWlsXDAiCisJIm5vZXhlY1wwIgorI2lmIEVOQUJMRV9IVVNIX01PREVfWAorCSJ4dHJhY2VcMCIKKyNlbmRpZgorCTsKK2VudW0geworCU9QVF9PX1BJUEVGQUlMLAorCU9QVF9PX05PRVhFQywKKyNpZiBFTkFCTEVfSFVTSF9NT0RFX1gKKwlPUFRfT19YVFJBQ0UsCisjZW5kaWYKKwlOVU1fT1BUX08KK307CisKKworLyogIkdsb2JhbHMiIHdpdGhpbiB0aGlzIGZpbGUgKi8KKy8qIFNvcnRlZCByb3VnaGx5IGJ5IHNpemUgKHNtYWxsZXIgb2Zmc2V0cyA9PSBzbWFsbGVyIGNvZGUpICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogaW50ZXJhY3RpdmVfZmQgIT0gMCBtZWFucyB3ZSBhcmUgYW4gaW50ZXJhY3RpdmUgc2hlbGwuCisJICogSWYgd2UgYXJlLCB0aGVuIHNhdmVkX3R0eV9wZ3JwIGNhbiBhbHNvIGJlICE9IDAsIG1lYW5pbmcKKwkgKiB0aGF0IGNvbnRyb2xsaW5nIHR0eSBpcyBhdmFpbGFibGUuIFdpdGggc2F2ZWRfdHR5X3BncnAgPT0gMCwKKwkgKiBqb2IgY29udHJvbCBzdGlsbCB3b3JrcywgYnV0IHRlcm1pbmFsIHNpZ25hbHMKKwkgKiAoXkMsIF5aLCBeWSwgXlwpIHdvbid0IHdvcmsgYXQgYWxsLCBhbmQgYmFja2dyb3VuZAorCSAqIHByb2Nlc3MgZ3JvdXBzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgd2l0aCAiY21kICYiLgorCSAqIFdpdGggc2F2ZWRfdHR5X3BncnAgIT0gMCwgaHVzaCB3aWxsIHVzZSB0Y3NldHBncnAoKQorCSAqIHRvIGdpdmUgdHR5IHRvIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAsCisJICogYW5kIHdpbGwgdGFrZSBpdCBiYWNrIHdoZW4gdGhlIGdyb3VwIGlzIHN0b3BwZWQgKF5aKQorCSAqIG9yIGtpbGxlZCAoXkMpLgorCSAqLworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisJLyogJ2ludGVyYWN0aXZlX2ZkJyBpcyBhIGZkIyBvcGVuIHRvIGN0dHksIGlmIHdlIGhhdmUgb25lCisJICogX0FORF8gaWYgd2UgZGVjaWRlZCB0byBhY3QgaW50ZXJhY3RpdmVseSAqLworCWludCBpbnRlcmFjdGl2ZV9mZDsKKwljb25zdCBjaGFyICpQUzE7CisJY29uc3QgY2hhciAqUFMyOworIyBkZWZpbmUgR19pbnRlcmFjdGl2ZV9mZCAoRy5pbnRlcmFjdGl2ZV9mZCkKKyNlbHNlCisjIGRlZmluZSBHX2ludGVyYWN0aXZlX2ZkIDAKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKwlsaW5lX2lucHV0X3QgKmxpbmVfaW5wdXRfc3RhdGU7CisjZW5kaWYKKwlwaWRfdCByb290X3BpZDsKKwlwaWRfdCByb290X3BwaWQ7CisJcGlkX3QgbGFzdF9iZ19waWQ7CisjaWYgRU5BQkxFX0hVU0hfUkFORE9NX1NVUFBPUlQKKwlyYW5kb21fdCByYW5kb21fZ2VuOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJaW50IHJ1bl9saXN0X2xldmVsOworCWludCBsYXN0X2pvYmlkOworCXBpZF90IHNhdmVkX3R0eV9wZ3JwOworCXN0cnVjdCBwaXBlICpqb2JfbGlzdDsKKyMgZGVmaW5lIEdfc2F2ZWRfdHR5X3BncnAgKEcuc2F2ZWRfdHR5X3BncnApCisjZWxzZQorIyBkZWZpbmUgR19zYXZlZF90dHlfcGdycCAwCisjZW5kaWYKKwljaGFyIG9fb3B0W05VTV9PUFRfT107CisjaWYgRU5BQkxFX0hVU0hfTU9ERV9YCisjIGRlZmluZSBHX3hfbW9kZSAoRy5vX29wdFtPUFRfT19YVFJBQ0VdKQorI2Vsc2UKKyMgZGVmaW5lIEdfeF9tb2RlIDAKKyNlbmRpZgorCXNtYWxsaW50IGZsYWdfU0lHSU5UOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJc21hbGxpbnQgZmxhZ19icmVha19jb250aW51ZTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCS8qIDA6IG91dHNpZGUgb2YgYSBmdW5jdGlvbiAob3Igc291cmNlZCBmaWxlKQorCSAqIC0xOiBpbnNpZGUgb2YgYSBmdW5jdGlvbiwgb2sgdG8gdXNlIHJldHVybiBidWlsdGluCisJICogMTogcmV0dXJuIGlzIGludm9rZWQsIHNraXAgYWxsIHRpbGwgZW5kIG9mIGZ1bmMKKwkgKi8KKwlzbWFsbGludCBmbGFnX3JldHVybl9pbl9wcm9ncmVzczsKKyNlbmRpZgorCXNtYWxsaW50IGV4aXRpbmc7IC8qIHVzZWQgdG8gcHJldmVudCBFWElUIHRyYXAgcmVjdXJzaW9uICovCisJLyogVGhlc2UgZm91ciBzdXBwb3J0ICQ/LCAkIywgYW5kICQxICovCisJc21hbGx1aW50IGxhc3RfZXhpdGNvZGU7CisJLyogYXJlIGdsb2JhbF9hcmd2IGFuZCBnbG9iYWxfYXJndlsxLi5uXSBtYWxsb2NlZD8gKG5vdGU6IG5vdCBbMF0pICovCisJc21hbGx1aW50IGdsb2JhbF9hcmdzX21hbGxvY2VkOworCS8qIGhvdyBtYW55IG5vbi1OVUxMIGFyZ3YncyB3ZSBoYXZlLiBOQjogJCMgKyAxICovCisJaW50IGdsb2JhbF9hcmdjOworCWNoYXIgKipnbG9iYWxfYXJndjsKKyNpZiAhQkJfTU1VCisJY2hhciAqYXJndjBfZm9yX3JlX2V4ZWNpbmc7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCXVuc2lnbmVkIGRlcHRoX2JyZWFrX2NvbnRpbnVlOworCXVuc2lnbmVkIGRlcHRoX29mX2xvb3A7CisjZW5kaWYKKwljb25zdCBjaGFyICppZnM7CisJY29uc3QgY2hhciAqY3dkOworCXN0cnVjdCB2YXJpYWJsZSAqdG9wX3ZhcjsKKwljaGFyICoqZXhwYW5kZWRfYXNzaWdubWVudHM7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc3RydWN0IGZ1bmN0aW9uICp0b3BfZnVuYzsKKyMgaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwlzdHJ1Y3QgdmFyaWFibGUgKipzaGFkb3dlZF92YXJzX3BwOworCXVuc2lnbmVkIGZ1bmNfbmVzdF9sZXZlbDsKKyMgZW5kaWYKKyNlbmRpZgorCS8qIFNpZ25hbCBhbmQgdHJhcCBoYW5kbGluZyAqLworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwl1bnNpZ25lZCBjb3VudF9TSUdDSExEOworCXVuc2lnbmVkIGhhbmRsZWRfU0lHQ0hMRDsKKwlzbWFsbGludCB3ZV9oYXZlX2NoaWxkcmVuOworI2VuZGlmCisJLyogV2hpY2ggc2lnbmFscyBoYXZlIG5vbi1ERkwgaGFuZGxlciAoZXZlbiB3aXRoIG5vIHRyYXBzIHNldCk/CisJICogU2V0IGF0IHRoZSBzdGFydCB0bzoKKwkgKiAoU0lHUVVJVCArIG1heWJlIFNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUyArIG1heWJlIFNQRUNJQUxfSk9CU1RPUF9TSUdTKQorCSAqIFNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUyBhcmUgY2xlYXJlZCBhZnRlciBmb3JrLgorCSAqIFRoZSByZXN0IGlzIGNsZWFyZWQgcmlnaHQgYmVmb3JlIGV4ZWN2IHN5c2NhbGxzLgorCSAqIE90aGVyIHRoYW4gdGhlc2UgdHdvIHRpbWVzLCBuZXZlciBtb2RpZmllZC4KKwkgKi8KKwl1bnNpZ25lZCBzcGVjaWFsX3NpZ19tYXNrOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCXVuc2lnbmVkIGZhdGFsX3NpZ19tYXNrOworIyBkZWZpbmUgR19mYXRhbF9zaWdfbWFzayBHLmZhdGFsX3NpZ19tYXNrCisjZWxzZQorIyBkZWZpbmUgR19mYXRhbF9zaWdfbWFzayAwCisjZW5kaWYKKwljaGFyICoqdHJhcHM7IC8qIGNoYXIgKnRyYXBzW05TSUddICovCisJc2lnc2V0X3QgcGVuZGluZ19zZXQ7CisjaWYgSFVTSF9ERUJVRworCXVuc2lnbmVkIGxvbmcgbWVtbGVha192YWx1ZTsKKwlpbnQgZGVidWdfaW5kZW50OworI2VuZGlmCisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwljaGFyIHVzZXJfaW5wdXRfYnVmW0VOQUJMRV9GRUFUVVJFX0VESVRJTkcgPyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU4gOiAyXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKy8qIE5vdCAjZGVmaW5pbmcgbmFtZSB0byBHLm5hbWUgLSB0aGlzIHF1aWNrbHkgZ2V0cyB1bndpZWxkeQorICogKHRvbyBtYW55IGRlZmluZXMpLiBBbHNvLCBJIGFjdHVhbGx5IHByZWZlciB0byBzZWUgd2hlbiBhIHZhcmlhYmxlCisgKiBpcyBnbG9iYWwsIHRodXMgIkcuIiBwcmVmaXggaXMgYSB1c2VmdWwgaGludCAqLworI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCS8qIG1lbXNldCgmRy5zYSwgMCwgc2l6ZW9mKEcuc2EpKTsgKi8gIFwKKwlzaWdmaWxsc2V0KCZHLnNhLnNhX21hc2spOyBcCisJRy5zYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7IFwKK30gd2hpbGUgKDApCisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgYnVpbHRpbnMgKi8KK3N0YXRpYyBpbnQgYnVpbHRpbl9jZChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2VjaG8oY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9ldmFsKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fZXhlYyhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2V4aXQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9leHBvcnQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKK3N0YXRpYyBpbnQgYnVpbHRpbl9mZ19iZyhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2pvYnMoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0hFTFAKK3N0YXRpYyBpbnQgYnVpbHRpbl9oZWxwKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT0NBTAorc3RhdGljIGludCBidWlsdGluX2xvY2FsKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiBIVVNIX0RFQlVHCitzdGF0aWMgaW50IGJ1aWx0aW5fbWVtbGVhayhjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX1BSSU5URgorc3RhdGljIGludCBidWlsdGluX3ByaW50ZihjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCitzdGF0aWMgaW50IGJ1aWx0aW5fcHdkKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fcmVhZChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3NldChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3NoaWZ0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fc291cmNlKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fdGVzdChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3RyYXAoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl90eXBlKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fdHJ1ZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3VtYXNrKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fdW5zZXQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl93YWl0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKK3N0YXRpYyBpbnQgYnVpbHRpbl9icmVhayhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2NvbnRpbnVlKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKK3N0YXRpYyBpbnQgYnVpbHRpbl9yZXR1cm4oY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisvKiBUYWJsZSBvZiBidWlsdC1pbiBmdW5jdGlvbnMuICBUaGV5IGNhbiBiZSBmb3JrZWQgb3Igbm90LCBkZXBlbmRpbmcgb24KKyAqIGNvbnRleHQ6IHdpdGhpbiBwaXBlcywgdGhleSBmb3JrLiAgQXMgc2ltcGxlIGNvbW1hbmRzLCB0aGV5IGRvIG5vdC4KKyAqIFdoZW4gdXNlZCBpbiBub24tZm9ya2luZyBjb250ZXh0LCB0aGV5IGNhbiBjaGFuZ2UgZ2xvYmFsIHZhcmlhYmxlcworICogaW4gdGhlIHBhcmVudCBzaGVsbCBwcm9jZXNzLiAgSWYgZm9ya2VkLCBvZiBjb3Vyc2UgdGhleSBjYW5ub3QuCisgKiBGb3IgZXhhbXBsZSwgJ3Vuc2V0IGZvbyB8IHdoYXRldmVyJyB3aWxsIHBhcnNlIGFuZCBydW4sIGJ1dCBmb28gd2lsbAorICogc3RpbGwgYmUgc2V0IGF0IHRoZSBlbmQuICovCitzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCB7CisJY29uc3QgY2hhciAqYl9jbWQ7CisJaW50ICgqYl9mdW5jdGlvbikoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfSFVTSF9IRUxQCisJY29uc3QgY2hhciAqYl9kZXNjcjsKKyMgZGVmaW5lIEJMVElOKGNtZCwgZnVuYywgaGVscCkgeyBjbWQsIGZ1bmMsIGhlbHAgfQorI2Vsc2UKKyMgZGVmaW5lIEJMVElOKGNtZCwgZnVuYywgaGVscCkgeyBjbWQsIGZ1bmMgfQorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgYmx0aW5zMVtdID0geworCUJMVElOKCIuIiAgICAgICAgLCBidWlsdGluX3NvdXJjZSAgLCAiUnVuIGNvbW1hbmRzIGluIGEgZmlsZSIpLAorCUJMVElOKCI6IiAgICAgICAgLCBidWlsdGluX3RydWUgICAgLCBOVUxMKSwKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlCTFRJTigiYmciICAgICAgICwgYnVpbHRpbl9mZ19iZyAgICwgIlJlc3VtZSBhIGpvYiBpbiB0aGUgYmFja2dyb3VuZCIpLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwlCTFRJTigiYnJlYWsiICAgICwgYnVpbHRpbl9icmVhayAgICwgIkV4aXQgZnJvbSBhIGxvb3AiKSwKKyNlbmRpZgorCUJMVElOKCJjZCIgICAgICAgLCBidWlsdGluX2NkICAgICAgLCAiQ2hhbmdlIGRpcmVjdG9yeSIpLAorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJQkxUSU4oImNvbnRpbnVlIiAsIGJ1aWx0aW5fY29udGludWUsICJTdGFydCBuZXcgbG9vcCBpdGVyYXRpb24iKSwKKyNlbmRpZgorCUJMVElOKCJldmFsIiAgICAgLCBidWlsdGluX2V2YWwgICAgLCAiQ29uc3RydWN0IGFuZCBydW4gc2hlbGwgY29tbWFuZCIpLAorCUJMVElOKCJleGVjIiAgICAgLCBidWlsdGluX2V4ZWMgICAgLCAiRXhlY3V0ZSBjb21tYW5kLCBkb24ndCByZXR1cm4gdG8gc2hlbGwiKSwKKwlCTFRJTigiZXhpdCIgICAgICwgYnVpbHRpbl9leGl0ICAgICwgIkV4aXQiKSwKKwlCTFRJTigiZXhwb3J0IiAgICwgYnVpbHRpbl9leHBvcnQgICwgIlNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMiKSwKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlCTFRJTigiZmciICAgICAgICwgYnVpbHRpbl9mZ19iZyAgICwgIkJyaW5nIGpvYiBpbnRvIHRoZSBmb3JlZ3JvdW5kIiksCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9IRUxQCisJQkxUSU4oImhlbHAiICAgICAsIGJ1aWx0aW5faGVscCAgICAsIE5VTEwpLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJQkxUSU4oImpvYnMiICAgICAsIGJ1aWx0aW5fam9icyAgICAsICJMaXN0IGpvYnMiKSwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPQ0FMCisJQkxUSU4oImxvY2FsIiAgICAsIGJ1aWx0aW5fbG9jYWwgICAsICJTZXQgbG9jYWwgdmFyaWFibGVzIiksCisjZW5kaWYKKyNpZiBIVVNIX0RFQlVHCisJQkxUSU4oIm1lbWxlYWsiICAsIGJ1aWx0aW5fbWVtbGVhayAsIE5VTEwpLAorI2VuZGlmCisJQkxUSU4oInJlYWQiICAgICAsIGJ1aWx0aW5fcmVhZCAgICAsICJJbnB1dCBpbnRvIHZhcmlhYmxlIiksCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJQkxUSU4oInJldHVybiIgICAsIGJ1aWx0aW5fcmV0dXJuICAsICJSZXR1cm4gZnJvbSBhIGZ1bmN0aW9uIiksCisjZW5kaWYKKwlCTFRJTigic2V0IiAgICAgICwgYnVpbHRpbl9zZXQgICAgICwgIlNldC91bnNldCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMiKSwKKwlCTFRJTigic2hpZnQiICAgICwgYnVpbHRpbl9zaGlmdCAgICwgIlNoaWZ0IHBvc2l0aW9uYWwgcGFyYW1ldGVycyIpLAorI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJQkxUSU4oInNvdXJjZSIgICAsIGJ1aWx0aW5fc291cmNlICAsICJSdW4gY29tbWFuZHMgaW4gYSBmaWxlIiksCisjZW5kaWYKKwlCTFRJTigidHJhcCIgICAgICwgYnVpbHRpbl90cmFwICAgICwgIlRyYXAgc2lnbmFscyIpLAorCUJMVElOKCJ0eXBlIiAgICAgLCBidWlsdGluX3R5cGUgICAgLCAiU2hvdyBjb21tYW5kIHR5cGUiKSwKKwlCTFRJTigidWxpbWl0IiAgICwgc2hlbGxfYnVpbHRpbl91bGltaXQgICwgIkNvbnRyb2wgcmVzb3VyY2UgbGltaXRzIiksCisJQkxUSU4oInVtYXNrIiAgICAsIGJ1aWx0aW5fdW1hc2sgICAsICJTZXQgZmlsZSBjcmVhdGlvbiBtYXNrIiksCisJQkxUSU4oInVuc2V0IiAgICAsIGJ1aWx0aW5fdW5zZXQgICAsICJVbnNldCB2YXJpYWJsZXMiKSwKKwlCTFRJTigid2FpdCIgICAgICwgYnVpbHRpbl93YWl0ICAgICwgIldhaXQgZm9yIHByb2Nlc3MiKSwKK307CisvKiBGb3Igbm93LCBlY2hvIGFuZCB0ZXN0IGFyZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlZC4KKyAqIE1heWJlIG1ha2UgaXQgY29uZmlndXJhYmxlPyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kIGJsdGluczJbXSA9IHsKKwlCTFRJTigiWyIgICAgICAgICwgYnVpbHRpbl90ZXN0ICAgICwgTlVMTCksCisJQkxUSU4oImVjaG8iICAgICAsIGJ1aWx0aW5fZWNobyAgICAsIE5VTEwpLAorI2lmIEVOQUJMRV9QUklOVEYKKwlCTFRJTigicHJpbnRmIiAgICwgYnVpbHRpbl9wcmludGYgICwgTlVMTCksCisjZW5kaWYKKwlCTFRJTigicHdkIiAgICAgICwgYnVpbHRpbl9wd2QgICAgICwgTlVMTCksCisJQkxUSU4oInRlc3QiICAgICAsIGJ1aWx0aW5fdGVzdCAgICAsIE5VTEwpLAorfTsKKworCisvKiBEZWJ1ZyBwcmludG91dHMuCisgKi8KKyNpZiBIVVNIX0RFQlVHCisvKiBwcmV2ZW50IGRpc2FzdGVycyB3aXRoIEcuZGVidWdfaW5kZW50IDwgMCAqLworIyBkZWZpbmUgaW5kZW50KCkgZmRwcmludGYoMiwgIiUqcyIsIChHLmRlYnVnX2luZGVudCAqIDIpICYgMHhmZiwgIiIpCisjIGRlZmluZSBkZWJ1Z19lbnRlcigpIChHLmRlYnVnX2luZGVudCsrKQorIyBkZWZpbmUgZGVidWdfbGVhdmUoKSAoRy5kZWJ1Z19pbmRlbnQtLSkKKyNlbHNlCisjIGRlZmluZSBpbmRlbnQoKSAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgZGVidWdfZW50ZXIoKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGRlYnVnX2xlYXZlKCkgKCh2b2lkKTApCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGYKKyMgZGVmaW5lIGRlYnVnX3ByaW50ZiguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3BhcnNlCisjIGRlZmluZSBkZWJ1Z19wcmludGZfcGFyc2UoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9leGVjCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9leGVjKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfZW52CisjIGRlZmluZSBkZWJ1Z19wcmludGZfZW52KC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfam9icworIyBkZWZpbmUgZGVidWdfcHJpbnRmX2pvYnMoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyMgZGVmaW5lIERFQlVHX0pPQlMgMQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHX0pPQlMgMAorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2V4cGFuZAorIyBkZWZpbmUgZGVidWdfcHJpbnRmX2V4cGFuZCguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorIyBkZWZpbmUgREVCVUdfRVhQQU5EIDEKKyNlbHNlCisjIGRlZmluZSBERUJVR19FWFBBTkQgMAorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3ZhcmV4cAorIyBkZWZpbmUgZGVidWdfcHJpbnRmX3ZhcmV4cCguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2dsb2IKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9nbG9iKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjIGRlZmluZSBERUJVR19HTE9CIDEKKyNlbHNlCisjIGRlZmluZSBERUJVR19HTE9CIDAKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9saXN0CisjIGRlZmluZSBkZWJ1Z19wcmludGZfbGlzdCguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3N1YnN0CisjIGRlZmluZSBkZWJ1Z19wcmludGZfc3Vic3QoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9jbGVhbgorIyBkZWZpbmUgZGVidWdfcHJpbnRmX2NsZWFuKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjIGRlZmluZSBERUJVR19DTEVBTiAxCisjZWxzZQorIyBkZWZpbmUgREVCVUdfQ0xFQU4gMAorI2VuZGlmCisKKyNpZiBERUJVR19FWFBBTkQKK3N0YXRpYyB2b2lkIGRlYnVnX3ByaW50X3N0cmluZ3MoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqdnYpCit7CisJaW5kZW50KCk7CisJZmRwcmludGYoMiwgIiVzOlxuIiwgcHJlZml4KTsKKwl3aGlsZSAoKnZ2KQorCQlmZHByaW50ZigyLCAiICclcydcbiIsICp2disrKTsKK30KKyNlbHNlCisjIGRlZmluZSBkZWJ1Z19wcmludF9zdHJpbmdzKHByZWZpeCwgdnYpICgodm9pZCkwKQorI2VuZGlmCisKKworLyogTGVhayBodW50aW5nLiBVc2UgaHVzaF9sZWFrdG9vbC5zaCBmb3IgcG9zdC1wcm9jZXNzaW5nLgorICovCisjaWYgTEVBS19IVU5USU5HCitzdGF0aWMgdm9pZCAqeHhtYWxsb2MoaW50IGxpbmVubywgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcHRyID0geG1hbGxvYygoc2l6ZSArIDB4ZmYpICYgfjB4ZmYpOworCWZkcHJpbnRmKDIsICJsaW5lICVkOiBtYWxsb2MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorc3RhdGljIHZvaWQgKnh4cmVhbGxvYyhpbnQgbGluZW5vLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXB0ciA9IHhyZWFsbG9jKHB0ciwgKHNpemUgKyAweGZmKSAmIH4weGZmKTsKKwlmZHByaW50ZigyLCAibGluZSAlZDogcmVhbGxvYyAlcFxuIiwgbGluZW5vLCBwdHIpOworCXJldHVybiBwdHI7Cit9CitzdGF0aWMgY2hhciAqeHhzdHJkdXAoaW50IGxpbmVubywgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnB0ciA9IHhzdHJkdXAoc3RyKTsKKwlmZHByaW50ZigyLCAibGluZSAlZDogc3RyZHVwICVwXG4iLCBsaW5lbm8sIHB0cik7CisJcmV0dXJuIHB0cjsKK30KK3N0YXRpYyB2b2lkIHh4ZnJlZSh2b2lkICpwdHIpCit7CisJZmRwcmludGYoMiwgImZyZWUgJXBcbiIsIHB0cik7CisJZnJlZShwdHIpOworfQorIyBkZWZpbmUgeG1hbGxvYyhzKSAgICAgeHhtYWxsb2MoX19MSU5FX18sIHMpCisjIGRlZmluZSB4cmVhbGxvYyhwLCBzKSB4eHJlYWxsb2MoX19MSU5FX18sIHAsIHMpCisjIGRlZmluZSB4c3RyZHVwKHMpICAgICB4eHN0cmR1cChfX0xJTkVfXywgcykKKyMgZGVmaW5lIGZyZWUocCkgICAgICAgIHh4ZnJlZShwKQorI2VuZGlmCisKKworLyogU3ludGF4IGFuZCBydW50aW1lIGVycm9ycy4gVGhleSBhbHdheXMgYWJvcnQgc2NyaXB0cy4KKyAqIEluIGludGVyYWN0aXZlIHVzZSB0aGV5IHVzdWFsbHkgZGlzY2FyZCB1bnBhcnNlZCBhbmQvb3IgdW5leGVjdXRlZCBjb21tYW5kcworICogYW5kIHJldHVybiB0byB0aGUgcHJvbXB0LgorICogSFVTSF9ERUJVRyA+PSAyIHByaW50cyBsaW5lIG51bWJlciBpbiB0aGlzIGZpbGUgd2hlcmUgaXQgd2FzIGRldGVjdGVkLgorICovCisjaWYgSFVTSF9ERUJVRyA8IDIKKyMgZGVmaW5lIGRpZV9pZl9zY3JpcHQobGluZW5vLCAuLi4pICAgICAgICAgICAgIGRpZV9pZl9zY3JpcHQoX19WQV9BUkdTX18pCisjIGRlZmluZSBzeW50YXhfZXJyb3IobGluZW5vLCBtc2cpICAgICAgICAgICAgICBzeW50YXhfZXJyb3IobXNnKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX2F0KGxpbmVubywgbXNnKSAgICAgICAgICAgc3ludGF4X2Vycm9yX2F0KG1zZykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl91bnRlcm1fY2gobGluZW5vLCBjaCkgICAgIHN5bnRheF9lcnJvcl91bnRlcm1fY2goY2gpCisjIGRlZmluZSBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cihsaW5lbm8sIHMpICAgICBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cihzKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2gobGluZW5vLCBjaCkgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpCisjZW5kaWYKKworc3RhdGljIHZvaWQgZGllX2lmX3NjcmlwdCh1bnNpZ25lZCBsaW5lbm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgcDsKKworI2lmIEhVU0hfREVCVUcgPj0gMgorCWJiX2Vycm9yX21zZygiaHVzaC5jOiV1IiwgbGluZW5vKTsKKyNlbmRpZgorCXZhX3N0YXJ0KHAsIGZtdCk7CisJYmJfdmVycm9yX21zZyhmbXQsIHAsIE5VTEwpOworCXZhX2VuZChwKTsKKwlpZiAoIUdfaW50ZXJhY3RpdmVfZmQpCisJCXhmdW5jX2RpZSgpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3IodW5zaWduZWQgbGluZW5vIFVOVVNFRF9QQVJBTSwgY29uc3QgY2hhciAqbXNnKQoreworCWlmIChtc2cpCisJCWJiX2Vycm9yX21zZygic3ludGF4IGVycm9yOiAlcyIsIG1zZyk7CisJZWxzZQorCQliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvciIpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3JfYXQodW5zaWduZWQgbGluZW5vIFVOVVNFRF9QQVJBTSwgY29uc3QgY2hhciAqbXNnKQoreworCWJiX2Vycm9yX21zZygic3ludGF4IGVycm9yIGF0ICclcyciLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cih1bnNpZ25lZCBsaW5lbm8gVU5VU0VEX1BBUkFNLCBjb25zdCBjaGFyICpzKQoreworCWJiX2Vycm9yX21zZygic3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJXMiLCBzKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yX3VudGVybV9jaCh1bnNpZ25lZCBsaW5lbm8sIGNoYXIgY2gpCit7CisJY2hhciBtc2dbMl0gPSB7IGNoLCAnXDAnIH07CisJc3ludGF4X2Vycm9yX3VudGVybV9zdHIobGluZW5vLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaCh1bnNpZ25lZCBsaW5lbm8gVU5VU0VEX1BBUkFNLCBpbnQgY2gpCit7CisJY2hhciBtc2dbMl07CisJbXNnWzBdID0gY2g7CisJbXNnWzFdID0gJ1wwJzsKKwliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvcjogdW5leHBlY3RlZCAlcyIsIGNoID09IEVPRiA/ICJFT0YiIDogbXNnKTsKK30KKworI2lmIEhVU0hfREVCVUcgPCAyCisjIHVuZGVmIGRpZV9pZl9zY3JpcHQKKyMgdW5kZWYgc3ludGF4X2Vycm9yCisjIHVuZGVmIHN5bnRheF9lcnJvcl9hdAorIyB1bmRlZiBzeW50YXhfZXJyb3JfdW50ZXJtX2NoCisjIHVuZGVmIHN5bnRheF9lcnJvcl91bnRlcm1fc3RyCisjIHVuZGVmIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoCisjZWxzZQorIyBkZWZpbmUgZGllX2lmX3NjcmlwdCguLi4pICAgICAgICAgICAgIGRpZV9pZl9zY3JpcHQoX19MSU5FX18sIF9fVkFfQVJHU19fKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yKG1zZykgICAgICAgICAgICAgIHN5bnRheF9lcnJvcihfX0xJTkVfXywgbXNnKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX2F0KG1zZykgICAgICAgICAgIHN5bnRheF9lcnJvcl9hdChfX0xJTkVfXywgbXNnKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VudGVybV9jaChjaCkgICAgIHN5bnRheF9lcnJvcl91bnRlcm1fY2goX19MSU5FX18sIGNoKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VudGVybV9zdHIocykgICAgIHN5bnRheF9lcnJvcl91bnRlcm1fc3RyKF9fTElORV9fLCBzKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKF9fTElORV9fLCBjaCkKKyNlbmRpZgorCisKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorc3RhdGljIHZvaWQgY21kZWRpdF91cGRhdGVfcHJvbXB0KHZvaWQpOworI2Vsc2UKKyMgZGVmaW5lIGNtZGVkaXRfdXBkYXRlX3Byb21wdCgpICgodm9pZCkwKQorI2VuZGlmCisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMKKyAqLworLyogUmVwbGFjZSBlYWNoIFx4IHdpdGggeCBpbiBwbGFjZSwgcmV0dXJuIHB0ciBwYXN0IE5VTC4gKi8KK3N0YXRpYyBjaGFyICp1bmJhY2tzbGFzaChjaGFyICpzcmMpCit7CisJY2hhciAqZHN0ID0gc3JjID0gc3RyY2hybnVsKHNyYywgJ1xcJyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCpzcmMgPT0gJ1xcJykKKwkJCXNyYysrOworCQlpZiAoKCpkc3QrKyA9ICpzcmMrKykgPT0gJ1wwJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgY2hhciAqKmFkZF9zdHJpbmdzX3RvX3N0cmluZ3MoY2hhciAqKnN0cmluZ3MsIGNoYXIgKiphZGQsIGludCBuZWVkX3RvX2R1cCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjb3VudDE7CisJdW5zaWduZWQgY291bnQyOworCWNoYXIgKip2OworCisJdiA9IHN0cmluZ3M7CisJY291bnQxID0gMDsKKwlpZiAodikgeworCQl3aGlsZSAoKnYpIHsKKwkJCWNvdW50MSsrOworCQkJdisrOworCQl9CisJfQorCWNvdW50MiA9IDA7CisJdiA9IGFkZDsKKwl3aGlsZSAoKnYpIHsKKwkJY291bnQyKys7CisJCXYrKzsKKwl9CisJdiA9IHhyZWFsbG9jKHN0cmluZ3MsIChjb3VudDEgKyBjb3VudDIgKyAxKSAqIHNpemVvZihjaGFyKikpOworCXZbY291bnQxICsgY291bnQyXSA9IE5VTEw7CisJaSA9IGNvdW50MjsKKwl3aGlsZSAoLS1pID49IDApCisJCXZbY291bnQxICsgaV0gPSAobmVlZF90b19kdXAgPyB4c3RyZHVwKGFkZFtpXSkgOiBhZGRbaV0pOworCXJldHVybiB2OworfQorI2lmIExFQUtfSFVOVElORworc3RhdGljIGNoYXIgKip4eF9hZGRfc3RyaW5nc190b19zdHJpbmdzKGludCBsaW5lbm8sIGNoYXIgKipzdHJpbmdzLCBjaGFyICoqYWRkLCBpbnQgbmVlZF90b19kdXApCit7CisJY2hhciAqKnB0ciA9IGFkZF9zdHJpbmdzX3RvX3N0cmluZ3Moc3RyaW5ncywgYWRkLCBuZWVkX3RvX2R1cCk7CisJZmRwcmludGYoMiwgImxpbmUgJWQ6IGFkZF9zdHJpbmdzX3RvX3N0cmluZ3MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorI2RlZmluZSBhZGRfc3RyaW5nc190b19zdHJpbmdzKHN0cmluZ3MsIGFkZCwgbmVlZF90b19kdXApIFwKKwl4eF9hZGRfc3RyaW5nc190b19zdHJpbmdzKF9fTElORV9fLCBzdHJpbmdzLCBhZGQsIG5lZWRfdG9fZHVwKQorI2VuZGlmCisKKy8qIE5vdGU6IHRha2VzIG93bmVyc2hpcCBvZiAiYWRkIiBwdHIgKGl0IGlzIG5vdCBzdHJkdXAnZWQpICovCitzdGF0aWMgY2hhciAqKmFkZF9zdHJpbmdfdG9fc3RyaW5ncyhjaGFyICoqc3RyaW5ncywgY2hhciAqYWRkKQoreworCWNoYXIgKnZbMl07CisJdlswXSA9IGFkZDsKKwl2WzFdID0gTlVMTDsKKwlyZXR1cm4gYWRkX3N0cmluZ3NfdG9fc3RyaW5ncyhzdHJpbmdzLCB2LCAvKmR1cDoqLyAwKTsKK30KKyNpZiBMRUFLX0hVTlRJTkcKK3N0YXRpYyBjaGFyICoqeHhfYWRkX3N0cmluZ190b19zdHJpbmdzKGludCBsaW5lbm8sIGNoYXIgKipzdHJpbmdzLCBjaGFyICphZGQpCit7CisJY2hhciAqKnB0ciA9IGFkZF9zdHJpbmdfdG9fc3RyaW5ncyhzdHJpbmdzLCBhZGQpOworCWZkcHJpbnRmKDIsICJsaW5lICVkOiBhZGRfc3RyaW5nX3RvX3N0cmluZ3MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorI2RlZmluZSBhZGRfc3RyaW5nX3RvX3N0cmluZ3Moc3RyaW5ncywgYWRkKSBcCisJeHhfYWRkX3N0cmluZ190b19zdHJpbmdzKF9fTElORV9fLCBzdHJpbmdzLCBhZGQpCisjZW5kaWYKKworc3RhdGljIHZvaWQgZnJlZV9zdHJpbmdzKGNoYXIgKipzdHJpbmdzKQoreworCWNoYXIgKip2OworCisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm47CisJdiA9IHN0cmluZ3M7CisJd2hpbGUgKCp2KSB7CisJCWZyZWUoKnYpOworCQl2Kys7CisJfQorCWZyZWUoc3RyaW5ncyk7Cit9CisKKworLyogSGVscGVycyBmb3Igc2V0dGluZyBuZXcgJG4gYW5kIHJlc3RvcmluZyB0aGVtIGJhY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2F2ZV9hcmdfdCB7CisJY2hhciAqc3ZfYXJndjA7CisJY2hhciAqKnN2X2dfYXJndjsKKwlpbnQgc3ZfZ19hcmdjOworCXNtYWxsaW50IHN2X2dfbWFsbG9jZWQ7Cit9IHNhdmVfYXJnX3Q7CisKK3N0YXRpYyB2b2lkIHNhdmVfYW5kX3JlcGxhY2VfR19hcmdzKHNhdmVfYXJnX3QgKnN2LCBjaGFyICoqYXJndikKK3sKKwlpbnQgbjsKKworCXN2LT5zdl9hcmd2MCA9IGFyZ3ZbMF07CisJc3YtPnN2X2dfYXJndiA9IEcuZ2xvYmFsX2FyZ3Y7CisJc3YtPnN2X2dfYXJnYyA9IEcuZ2xvYmFsX2FyZ2M7CisJc3YtPnN2X2dfbWFsbG9jZWQgPSBHLmdsb2JhbF9hcmdzX21hbGxvY2VkOworCisJYXJndlswXSA9IEcuZ2xvYmFsX2FyZ3ZbMF07IC8qIHJldGFpbiAkMCAqLworCUcuZ2xvYmFsX2FyZ3YgPSBhcmd2OworCUcuZ2xvYmFsX2FyZ3NfbWFsbG9jZWQgPSAwOworCisJbiA9IDE7CisJd2hpbGUgKCorK2FyZ3YpCisJCW4rKzsKKwlHLmdsb2JhbF9hcmdjID0gbjsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9HX2FyZ3Moc2F2ZV9hcmdfdCAqc3YsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipwcDsKKworCWlmIChHLmdsb2JhbF9hcmdzX21hbGxvY2VkKSB7CisJCS8qIHNvbWVvbmUgcmFuICJzZXQgLS0gYXJnMSBhcmcyIC4uLiIsIHVuZG8gKi8KKwkJcHAgPSBHLmdsb2JhbF9hcmd2OworCQl3aGlsZSAoKisrcHApIC8qIG5vdGU6IGRvZXMgbm90IGZyZWUgJDAgKi8KKwkJCWZyZWUoKnBwKTsKKwkJZnJlZShHLmdsb2JhbF9hcmd2KTsKKwl9CisJYXJndlswXSA9IHN2LT5zdl9hcmd2MDsKKwlHLmdsb2JhbF9hcmd2ID0gc3YtPnN2X2dfYXJndjsKKwlHLmdsb2JhbF9hcmdjID0gc3YtPnN2X2dfYXJnYzsKKwlHLmdsb2JhbF9hcmdzX21hbGxvY2VkID0gc3YtPnN2X2dfbWFsbG9jZWQ7Cit9CisKKworLyogQmFzaWMgdGhlb3J5IG9mIHNpZ25hbCBoYW5kbGluZyBpbiBzaGVsbAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyBkb2VzIG5vdCBkZXNjcmliZSB3aGF0IGh1c2ggZG9lcywgcmF0aGVyLCBpdCBpcyBjdXJyZW50IHVuZGVyc3RhbmRpbmcKKyAqIHdoYXQgaXQgX3Nob3VsZF8gZG8uIElmIGl0IGRvZXNuJ3QsIGl0J3MgYSBidWcuCisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbCN0cmFwCisgKgorICogU2lnbmFscyBhcmUgaGFuZGxlZCBvbmx5IGFmdGVyIGVhY2ggcGlwZSAoImNtZCB8IGNtZCB8IGNtZCIgdGhpbmcpCisgKiBpcyBmaW5pc2hlZCBvciBiYWNrZ3JvdW5kZWQuIEl0IGlzIHRoZSBzYW1lIGluIGludGVyYWN0aXZlIGFuZAorICogbm9uLWludGVyYWN0aXZlIHNoZWxscywgYW5kIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICogYSB1c2VyIHRyYXAgaGFuZGxlciBpcyBpbnN0YWxsZWQgb3IgYSBzaGVsbCBzcGVjaWFsIG9uZSBpcyBpbiBlZmZlY3QuCisgKiBeQyBvciBeWiBmcm9tIGtleWJvYXJkIHNlZW1zIHRvIGV4ZWN1dGUgImF0IG9uY2UiIGJlY2F1c2UgaXQgdXN1YWxseQorICogYmFja2dyb3VuZHMgKGkuZS4gc3RvcHMpIG9yIGtpbGxzIGFsbCBtZW1iZXJzIG9mIGN1cnJlbnRseSBydW5uaW5nCisgKiBwaXBlLgorICoKKyAqIFdhaXQgYnVpbHRpbiBpbiBpbnRlcnJ1cHRpYmxlIGJ5IHNpZ25hbHMgZm9yIHdoaWNoIHVzZXIgdHJhcCBpcyBzZXQKKyAqIG9yIGJ5IFNJR0lOVCBpbiBpbnRlcmFjdGl2ZSBzaGVsbC4KKyAqCisgKiBUcmFwIGhhbmRsZXJzIHdpbGwgZXhlY3V0ZSBldmVuIHdpdGhpbiB0cmFwIGhhbmRsZXJzLiAocmlnaHQ/KQorICoKKyAqIFVzZXIgdHJhcCBoYW5kbGVycyBhcmUgZm9yZ290dGVuIHdoZW4gc3Vic2hlbGwgKCIoY21kKSIpIGlzIGVudGVyZWQsCisgKiBleGNlcHQgZm9yIGhhbmRsZXJzIHNldCB0byAnJyAoZW1wdHkgc3RyaW5nKS4KKyAqCisgKiBJZiBqb2IgY29udHJvbCBpcyBvZmYsIGJhY2tncm91bmRlZCBjb21tYW5kcyAoImNtZCAmIikKKyAqIGhhdmUgU0lHSU5ULCBTSUdRVUlUIHNldCB0byBTSUdfSUdOLgorICoKKyAqIENvbW1hbmRzIHdoaWNoIGFyZSBydW4gaW4gY29tbWFuZCBzdWJzdGl0dXRpb24gKCJgY21kYCIpCisgKiBoYXZlIFNJR1RUSU4sIFNJR1RUT1UsIFNJR1RTVFAgc2V0IHRvIFNJR19JR04uCisgKgorICogT3JkaW5hcnkgY29tbWFuZHMgaGF2ZSBzaWduYWxzIHNldCB0byBTSUdfSUdOL0RGTCBhcyBpbmhlcml0ZWQKKyAqIGJ5IHRoZSBzaGVsbCBmcm9tIGl0cyBwYXJlbnQuCisgKgorICogU2lnbmFscyB3aGljaCBkaWZmZXIgZnJvbSBTSUdfREZMIGFjdGlvbgorICogKG5vdGU6IGNoaWxkIChpLmUuLCBbdl1mb3JrZWQpIHNoZWxsIGlzIG5vdCBhbiBpbnRlcmFjdGl2ZSBzaGVsbCk6CisgKgorICogU0lHUVVJVDogaWdub3JlCisgKiBTSUdURVJNIChpbnRlcmFjdGl2ZSk6IGlnbm9yZQorICogU0lHSFVQIChpbnRlcmFjdGl2ZSk6CisgKiAgICBzZW5kIFNJR0NPTlQgdG8gc3RvcHBlZCBqb2JzLCBzZW5kIFNJR0hVUCB0byBhbGwgam9icyBhbmQgZXhpdAorICogU0lHVFRJTiwgU0lHVFRPVSwgU0lHVFNUUCAoaWYgam9iIGNvbnRyb2wgaXMgb24pOiBpZ25vcmUKKyAqICAgIE5vdGUgdGhhdCBeWiBpcyBoYW5kbGVkIG5vdCBieSB0cmFwcGluZyBTSUdUU1RQLCBidXQgYnkgc2VlaW5nCisgKiAgICB0aGF0IGFsbCBwaXBlIG1lbWJlcnMgYXJlIHN0b3BwZWQuIFRyeSB0aGlzIGluIGJhc2g6CisgKiAgICB3aGlsZSA6OyBkbyA6OyBkb25lIC0gXlogZG9lcyBub3QgYmFja2dyb3VuZCBpdAorICogICAgKHdoaWxlIDo7IGRvIDo7IGRvbmUpIC0gXlogYmFja2dyb3VuZHMgaXQKKyAqIFNJR0lOVCAoaW50ZXJhY3RpdmUpOiB3YWl0IGZvciBsYXN0IHBpcGUsIGlnbm9yZSB0aGUgcmVzdAorICogICAgb2YgdGhlIGNvbW1hbmQgbGluZSwgc2hvdyBwcm9tcHQuIE5COiBeQyBkb2VzIG5vdCBzZW5kIFNJR0lOVAorICogICAgdG8gaW50ZXJhY3RpdmUgc2hlbGwgd2hpbGUgc2hlbGwgaXMgd2FpdGluZyBmb3IgYSBwaXBlLAorICogICAgc2luY2Ugc2hlbGwgaXMgYmcnZWQgKGlzIG5vdCBpbiBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXApLgorICogICAgRXhhbXBsZSAxOiB0aGlzIHdhaXRzIDUgc2VjLCBidXQgZG9lcyBub3QgZXhlY3V0ZSBsczoKKyAqICAgICJlY2hvICQkOyBzbGVlcCA1OyBscyAtbCIgKyAia2lsbCAtSU5UIDxwaWQ+IgorICogICAgRXhhbXBsZSAyOiB0aGlzIGRvZXMgbm90IHdhaXQgYW5kIGRvZXMgbm90IGV4ZWN1dGUgbHM6CisgKiAgICAiZWNobyAkJDsgc2xlZXAgNSAmIHdhaXQ7IGxzIC1sIiArICJraWxsIC1JTlQgPHBpZD4iCisgKiAgICBFeGFtcGxlIDM6IHRoaXMgZG9lcyBub3Qgd2FpdCA1IHNlYywgYnV0IGV4ZWN1dGVzIGxzOgorICogICAgInNsZWVwIDU7IGxzIC1sIiArIHByZXNzIF5DCisgKiAgICBFeGFtcGxlIDQ6IHRoaXMgZG9lcyBub3Qgd2FpdCBhbmQgZG9lcyBub3QgZXhlY3V0ZSBsczoKKyAqICAgICJzbGVlcCA1ICYgd2FpdDsgbHMgLWwiICsgcHJlc3MgXkMKKyAqCisgKiAoV2hhdCBoYXBwZW5zIHRvIHNpZ25hbHMgd2hpY2ggYXJlIElHTiBvbiBzaGVsbCBzdGFydD8pCisgKiAoV2hhdCBoYXBwZW5zIHdpdGggc2lnbmFsIG1hc2sgb24gc2hlbGwgc3RhcnQ/KQorICoKKyAqIE9sZCBpbXBsZW1lbnRhdGlvbgorICogPT09PT09PT09PT09PT09PT09CisgKiBXZSB1c2UgaW4ta2VybmVsIHBlbmRpbmcgc2lnbmFsIG1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZ25hbHMgd2VyZSBzZW50LgorICogV2UgYmxvY2sgYWxsIHNpZ25hbHMgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byB0YWtlIGFjdGlvbiBpbW1lZGlhdGVseSwKKyAqIGkuZS4gd2UgYmxvY2sgYWxsIHNpZ25hbHMgd2hpY2ggbmVlZCB0byBoYXZlIHNwZWNpYWwgaGFuZGxpbmcgYXMgZGVzY3JpYmVkCisgKiBhYm92ZSwgYW5kIGFsbCBzaWduYWxzIHdoaWNoIGhhdmUgdHJhcHMgc2V0LgorICogQWZ0ZXIgZWFjaCBwaXBlIGV4ZWN1dGlvbiwgd2UgZXh0cmFjdCBhbnkgcGVuZGluZyBzaWduYWxzIHZpYSBzaWd0aW1lZHdhaXQoKQorICogYW5kIGFjdCBvbiB0aGVtLgorICoKKyAqIHVuc2lnbmVkIHNwZWNpYWxfc2lnX21hc2s6IGEgbWFzayBvZiBzdWNoICJzcGVjaWFsIiBzaWduYWxzCisgKiBzaWdzZXRfdCBibG9ja2VkX3NldDogIGN1cnJlbnQgYmxvY2tlZCBzaWduYWwgc2V0CisgKgorICogInRyYXAgLSBTSUd4eHgiOgorICogICAgY2xlYXIgYml0IGluIGJsb2NrZWRfc2V0IHVubGVzcyBpdCBpcyBhbHNvIGluIHNwZWNpYWxfc2lnX21hc2sKKyAqICJ0cmFwICdjbWQnIFNJR3h4eCI6CisgKiAgICBzZXQgYml0IGluIGJsb2NrZWRfc2V0IChldmVuIGlmICdjbWQnIGlzICcnKQorICogYWZ0ZXIgW3ZdZm9yaywgaWYgd2UgcGxhbiB0byBiZSBhIHNoZWxsOgorICogICAgdW5ibG9jayBzaWduYWxzIHdpdGggc3BlY2lhbCBpbnRlcmFjdGl2ZSBoYW5kbGluZworICogICAgKGNoaWxkIHNoZWxsIGlzIG5vdCBpbnRlcmFjdGl2ZSksCisgKiAgICB1bnNldCBhbGwgdHJhcHMgZXhjZXB0ICcnIChub3RlOiByZWdhcmRsZXNzIG9mIGNoaWxkIHNoZWxsJ3MgdHlwZSAtIHt9LCAoKSwgZXRjKQorICogYWZ0ZXIgW3ZdZm9yaywgaWYgd2UgcGxhbiB0byBleGVjOgorICogICAgUE9TSVggc2F5cyBmb3JrIGNsZWFycyBwZW5kaW5nIHNpZ25hbCBtYXNrIGluIGNoaWxkIC0gbm8gbmVlZCB0byBjbGVhciBpdC4KKyAqICAgIFJlc3RvcmUgYmxvY2tlZCBzaWduYWwgc2V0IHRvIG9uZSBpbmhlcml0ZWQgYnkgc2hlbGwganVzdCBwcmlvciB0byBleGVjLgorICoKKyAqIE5vdGU6IGFzIGEgcmVzdWx0LCB3ZSBkbyBub3QgdXNlIHNpZ25hbCBoYW5kbGVycyBtdWNoLiBUaGUgb25seSB1c2VzCisgKiBhcmUgdG8gY291bnQgU0lHQ0hMRHMKKyAqIGFuZCB0byByZXN0b3JlIHR0eSBwZ3JwIG9uIHNpZ25hbC1pbmR1Y2VkIGV4aXQuCisgKgorICogTm90ZSAyIChjb21wYXQpOgorICogU3RhbmRhcmQgc2F5cyAiV2hlbiBhIHN1YnNoZWxsIGlzIGVudGVyZWQsIHRyYXBzIHRoYXQgYXJlIG5vdCBiZWluZyBpZ25vcmVkCisgKiBhcmUgc2V0IHRvIHRoZSBkZWZhdWx0IGFjdGlvbnMiLiBiYXNoIGludGVycHJldHMgaXQgc28gdGhhdCB0cmFwcyB3aGljaAorICogYXJlIHNldCB0byAnJyAoaWdub3JlKSBhcmUgTk9UIHJlc2V0IHRvIGRlZmF1bHRzLiBXZSBkbyB0aGUgc2FtZS4KKyAqCisgKiBQcm9ibGVtOiB0aGUgYWJvdmUgYXBwcm9hY2ggbWFrZXMgaXQgdW53aWVsZHkgdG8gY2F0Y2ggc2lnbmFscyB3aGlsZQorICogd2UgYXJlIGluIHJlYWQgYnVpbHRpbiwgb2Ygd2hpbGUgd2UgcmVhZCBjb21tYW5kcyBmcm9tIHN0ZGluOgorICogbWFza2VkIHNpZ25hbHMgYXJlIG5vdCB2aXNpYmxlIQorICoKKyAqIE5ldyBpbXBsZW1lbnRhdGlvbgorICogPT09PT09PT09PT09PT09PT09CisgKiBXZSByZWNvcmQgZWFjaCBzaWduYWwgd2UgYXJlIGludGVyZXN0ZWQgaW4gYnkgaW5zdGFsbGluZyBzaWduYWwgaGFuZGxlcgorICogZm9yIHRoZW0gLSBhIGJpdCBsaWtlIGVtdWxhdGluZyBrZXJuZWwgcGVuZGluZyBzaWduYWwgbWFzayBpbiB1c2Vyc3BhY2UuCisgKiBXZSBhcmUgaW50ZXJlc3RlZCBpbjogc2lnbmFscyB3aGljaCBuZWVkIHRvIGhhdmUgc3BlY2lhbCBoYW5kbGluZworICogYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgYWxsIHNpZ25hbHMgd2hpY2ggaGF2ZSB0cmFwcyBzZXQuCisgKiBTaWduYWxzIGFyZSByb2NvcmRlZCBpbiBwZW5kaW5nX3NldC4KKyAqIEFmdGVyIGVhY2ggcGlwZSBleGVjdXRpb24sIHdlIGV4dHJhY3QgYW55IHBlbmRpbmcgc2lnbmFscworICogYW5kIGFjdCBvbiB0aGVtLgorICoKKyAqIHVuc2lnbmVkIHNwZWNpYWxfc2lnX21hc2s6IGEgbWFzayBvZiBzaGVsbC1zcGVjaWFsIHNpZ25hbHMuCisgKiB1bnNpZ25lZCBmYXRhbF9zaWdfbWFzazogYSBtYXNrIG9mIHNpZ25hbHMgb24gd2hpY2ggd2UgcmVzdG9yZSB0dHkgcGdycC4KKyAqIGNoYXIgKnRyYXBzW3NpZ10gaWYgdHJhcCBmb3Igc2lnIGlzIHNldCAoZXZlbiBpZiBpdCdzICcnKS4KKyAqIHNpZ3NldF90IHBlbmRpbmdfc2V0OiBzZXQgb2Ygc2lncyB3ZSByZWNlaXZlZC4KKyAqCisgKiAidHJhcCAtIFNJR3h4eCI6CisgKiAgICBpZiBzaWcgaXMgaW4gc3BlY2lhbF9zaWdfbWFzaywgc2V0IGhhbmRsZXIgYmFjayB0bzoKKyAqICAgICAgICByZWNvcmRfcGVuZGluZ19zaWdubywgb3IgdG8gSUdOIGlmIGl0J3MgYSB0dHkgc3RvcCBzaWduYWwKKyAqICAgIGlmIHNpZyBpcyBpbiBmYXRhbF9zaWdfbWFzaywgc2V0IGhhbmRsZXIgYmFjayB0byBzaWdleGl0LgorICogICAgZWxzZTogc2V0IGhhbmRsZXIgYmFjayB0byBTSUdfREZMCisgKiAidHJhcCAnY21kJyBTSUd4eHgiOgorICogICAgc2V0IGhhbmRsZXIgdG8gcmVjb3JkX3BlbmRpbmdfc2lnbm8uCisgKiAidHJhcCAnJyBTSUd4eHgiOgorICogICAgc2V0IGhhbmRsZXIgdG8gU0lHX0lHTi4KKyAqIGFmdGVyIFt2XWZvcmssIGlmIHdlIHBsYW4gdG8gYmUgYSBzaGVsbDoKKyAqICAgIHNldCBzaWduYWxzIHdpdGggc3BlY2lhbCBpbnRlcmFjdGl2ZSBoYW5kbGluZyB0byBTSUdfREZMCisgKiAgICAoYmVjYXVzZSBjaGlsZCBzaGVsbCBpcyBub3QgaW50ZXJhY3RpdmUpLAorICogICAgdW5zZXQgYWxsIHRyYXBzIGV4Y2VwdCAnJyAobm90ZTogcmVnYXJkbGVzcyBvZiBjaGlsZCBzaGVsbCdzIHR5cGUgLSB7fSwgKCksIGV0YykKKyAqIGFmdGVyIFt2XWZvcmssIGlmIHdlIHBsYW4gdG8gZXhlYzoKKyAqICAgIFBPU0lYIHNheXMgZm9yayBjbGVhcnMgcGVuZGluZyBzaWduYWwgbWFzayBpbiBjaGlsZCAtIG5vIG5lZWQgdG8gY2xlYXIgaXQuCisgKgorICogVG8gbWFrZSB3YWl0IGJ1aWx0aW4gaW50ZXJydXB0aWJsZSwgd2UgaGFuZGxlIFNJR0NITEQgYXMgc3BlY2lhbCBzaWduYWwsCisgKiBvdGhlcndpc2UgKGlmIHdlIGxlYXZlIGl0IFNJR19ERkwpIHNpZ3N1c3BlbmQgaW4gd2FpdCBidWlsdGluIHdpbGwgbm90IHdha2UgdXAgb24gaXQuCisgKgorICogTm90ZSAoY29tcGF0KToKKyAqIFN0YW5kYXJkIHNheXMgIldoZW4gYSBzdWJzaGVsbCBpcyBlbnRlcmVkLCB0cmFwcyB0aGF0IGFyZSBub3QgYmVpbmcgaWdub3JlZAorICogYXJlIHNldCB0byB0aGUgZGVmYXVsdCBhY3Rpb25zIi4gYmFzaCBpbnRlcnByZXRzIGl0IHNvIHRoYXQgdHJhcHMgd2hpY2gKKyAqIGFyZSBzZXQgdG8gJycgKGlnbm9yZSkgYXJlIE5PVCByZXNldCB0byBkZWZhdWx0cy4gV2UgZG8gdGhlIHNhbWUuCisgKi8KK2VudW0geworCVNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUyA9IDAKKwkJfCAoMSA8PCBTSUdURVJNKQorCQl8ICgxIDw8IFNJR0lOVCkKKwkJfCAoMSA8PCBTSUdIVVApCisJCSwKKwlTUEVDSUFMX0pPQlNUT1BfU0lHUyA9IDAKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJfCAoMSA8PCBTSUdUVElOKQorCQl8ICgxIDw8IFNJR1RUT1UpCisJCXwgKDEgPDwgU0lHVFNUUCkKKyNlbmRpZgorCQksCit9OworCitzdGF0aWMgdm9pZCByZWNvcmRfcGVuZGluZ19zaWdubyhpbnQgc2lnKQoreworCXNpZ2FkZHNldCgmRy5wZW5kaW5nX3NldCwgc2lnKTsKKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJaWYgKHNpZyA9PSBTSUdDSExEKSB7CisJCUcuY291bnRfU0lHQ0hMRCsrOworLy9iYl9lcnJvcl9tc2coIlslZF0gU0lHQ0hMRF9oYW5kbGVyOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBzaWdoYW5kbGVyX3QgaW5zdGFsbF9zaWdoYW5kbGVyKGludCBzaWcsIHNpZ2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXN0cnVjdCBzaWdhY3Rpb24gb2xkX3NhOworCisJLyogV2UgY291bGQgdXNlIHNpZ25hbCgpIHRvIGluc3RhbGwgaGFuZGxlcnMuLi4gYWxtb3N0OgorCSAqIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzayBBTEwgc2lnbmFscyB3aGlsZSBoYW5kbGVycyBydW4uCisJICogSSBzYXcgc2lnbmFsIG5lc3RpbmcgaW4gc3RyYWNlLCByYWNlIHdpbmRvdyBpc24ndCBzbWFsbC4KKwkgKiBTQV9SRVNUQVJUIGlzIGFsc28gbmVlZGVkLCBidXQgaW4gTGludXgsIHNpZ25hbCgpCisJICogc2V0cyBTQV9SRVNUQVJUIHRvby4KKwkgKi8KKwkvKiBtZW1zZXQoJkcuc2EsIDAsIHNpemVvZihHLnNhKSk7IC0gYWxyZWFkeSBkb25lICovCisJLyogc2lnZmlsbHNldCgmRy5zYS5zYV9tYXNrKTsgICAgICAtIGFscmVhZHkgZG9uZSAqLworCS8qIEcuc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOyAgICAgLSBhbHJlYWR5IGRvbmUgKi8KKwlHLnNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCXNpZ2FjdGlvbihzaWcsICZHLnNhLCAmb2xkX3NhKTsKKwlyZXR1cm4gb2xkX3NhLnNhX2hhbmRsZXI7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKworLyogQWZ0ZXIgW3ZdZm9yaywgaW4gY2hpbGQ6IGRvIG5vdCByZXN0b3JlIHR0eSBwZ3JwIG9uIHhmdW5jIGRlYXRoICovCisjIGRlZmluZSBkaXNhYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpIChkaWVfc2xlZXAgPSAwKQorLyogQWZ0ZXIgW3ZdZm9yaywgaW4gcGFyZW50OiByZXN0b3JlIHR0eSBwZ3JwIG9uIHhmdW5jIGRlYXRoICovCisjIGRlZmluZSBlbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCkgIChkaWVfc2xlZXAgPSAtMSkKKworLyogUmVzdG9yZXMgdHR5IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCwgYW5kIGV4aXRzLgorICogTWF5IGJlIGNhbGxlZCBhcyBzaWduYWwgaGFuZGxlciBmb3IgZmF0YWwgc2lnbmFsCisgKiAod2lsbCByZXNlbmQgc2lnbmFsIHRvIGl0c2VsZiwgcHJvZHVjaW5nIGNvcnJlY3QgZXhpdCBzdGF0ZSkKKyAqIG9yIGNhbGxlZCBkaXJlY3RseSB3aXRoIC1FWElUQ09ERS4KKyAqIFdlIGFsc28gY2FsbCBpdCBpZiB4ZnVuYyBpcyBleGl0aW5nLiAqLworc3RhdGljIHZvaWQgc2lnZXhpdChpbnQgc2lnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHNpZ2V4aXQoaW50IHNpZykKK3sKKwkvKiBDYXJlZnVsOiB3ZSBjYW4gZW5kIHVwIGhlcmUgYWZ0ZXIgW3ZdZm9yay4gRG8gbm90IHJlc3RvcmUKKwkgKiB0dHkgcGdycCB0aGVuLCBvbmx5IHRvcC1sZXZlbCBzaGVsbCBwcm9jZXNzIGRvZXMgdGhhdCAqLworCWlmIChHX3NhdmVkX3R0eV9wZ3JwICYmIGdldHBpZCgpID09IEcucm9vdF9waWQpIHsKKwkJLyogRGlzYWJsZSBhbGwgc2lnbmFsczogam9iIGNvbnRyb2wsIFNJR1BJUEUsIGV0Yy4KKwkJICogTW9zdGx5IHBhcmFub2lkIG1lYXN1cmUsIHRvIHByZXZlbnQgaW5maW5pdGUgU0lHVFRPVS4KKwkJICovCisJCXNpZ3Byb2NtYXNrX2FsbHNpZ3MoU0lHX0JMT0NLKTsKKwkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIEdfc2F2ZWRfdHR5X3BncnApOworCX0KKworCS8qIE5vdCBhIHNpZ25hbCwganVzdCBleGl0ICovCisJaWYgKHNpZyA8PSAwKQorCQlfZXhpdCgtIHNpZyk7CisKKwlraWxsX215c2VsZl93aXRoX3NpZyhzaWcpOyAvKiBkb2VzIG5vdCByZXR1cm4gKi8KK30KKyNlbHNlCisKKyMgZGVmaW5lIGRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCkgKCh2b2lkKTApCisjIGRlZmluZSBlbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCkgICgodm9pZCkwKQorCisjZW5kaWYKKworc3RhdGljIHNpZ2hhbmRsZXJfdCBwaWNrX3NpZ2hhbmRsZXIodW5zaWduZWQgc2lnKQoreworCXNpZ2hhbmRsZXJfdCBoYW5kbGVyID0gU0lHX0RGTDsKKwlpZiAoc2lnIDwgc2l6ZW9mKHVuc2lnbmVkKSo4KSB7CisJCXVuc2lnbmVkIHNpZ21hc2sgPSAoMSA8PCBzaWcpOworCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCS8qIGlzIHNpZyBmYXRhbD8gKi8KKwkJaWYgKEdfZmF0YWxfc2lnX21hc2sgJiBzaWdtYXNrKQorCQkJaGFuZGxlciA9IHNpZ2V4aXQ7CisJCWVsc2UKKyNlbmRpZgorCQkvKiBzaWcgaGFzIHNwZWNpYWwgaGFuZGxpbmc/ICovCisJCWlmIChHLnNwZWNpYWxfc2lnX21hc2sgJiBzaWdtYXNrKSB7CisJCQloYW5kbGVyID0gcmVjb3JkX3BlbmRpbmdfc2lnbm87CisJCQkvKiBUVElOL1RUT1UvVFNUUCBjYW4ndCBiZSBzZXQgdG8gcmVjb3JkX3BlbmRpbmdfc2lnbm8KKwkJCSAqIGluIG9yZGVyIHRvIGlnbm9yZSB0aGVtOiB0aGV5IHdpbGwgYmUgcmFpc2VkCisJCQkgKiBpbiBhbiBlbmRsZXNzIGxvb3Agd2hlbiB3ZSB0cnkgdG8gZG8gc29tZQorCQkJICogdGVybWluYWwgaW9jdGxzISBXZSBkbyBoYXZlIHRvIF9pZ25vcmVfIHRoZXNlLgorCQkJICovCisJCQlpZiAoU1BFQ0lBTF9KT0JTVE9QX1NJR1MgJiBzaWdtYXNrKQorCQkJCWhhbmRsZXIgPSBTSUdfSUdOOworCQl9CisJfQorCXJldHVybiBoYW5kbGVyOworfQorCisvKiBSZXN0b3JlcyB0dHkgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwLCBhbmQgZXhpdHMuICovCitzdGF0aWMgdm9pZCBodXNoX2V4aXQoaW50IGV4aXRjb2RlKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGh1c2hfZXhpdChpbnQgZXhpdGNvZGUpCit7CisJZmZsdXNoX2FsbCgpOworCWlmIChHLmV4aXRpbmcgPD0gMCAmJiBHLnRyYXBzICYmIEcudHJhcHNbMF0gJiYgRy50cmFwc1swXVswXSkgeworCQljaGFyICphcmd2WzNdOworCQkvKiBhcmd2WzBdIGlzIHVudXNlZCAqLworCQlhcmd2WzFdID0gRy50cmFwc1swXTsKKwkJYXJndlsyXSA9IE5VTEw7CisJCUcuZXhpdGluZyA9IDE7IC8qIHByZXZlbnQgRVhJVCB0cmFwIHJlY3Vyc2lvbiAqLworCQkvKiBOb3RlOiBHLnRyYXBzWzBdIGlzIG5vdCBjbGVhcmVkIQorCQkgKiAidHJhcCIgd2lsbCBzdGlsbCBzaG93IGl0LCBpZiBleGVjdXRlZAorCQkgKiBpbiB0aGUgaGFuZGxlciAqLworCQlidWlsdGluX2V2YWwoYXJndik7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKwl7CisJCXN0cnVjdCB2YXJpYWJsZSAqY3VyX3ZhcjsKKwkJaWYgKEcuY3dkICE9IGJiX21zZ191bmtub3duKQorCQkJZnJlZSgoY2hhciopRy5jd2QpOworCQljdXJfdmFyID0gRy50b3BfdmFyOworCQl3aGlsZSAoY3VyX3ZhcikgeworCQkJc3RydWN0IHZhcmlhYmxlICp0bXAgPSBjdXJfdmFyOworCQkJaWYgKCFjdXJfdmFyLT5tYXhfbGVuKQorCQkJCWZyZWUoY3VyX3Zhci0+dmFyc3RyKTsKKwkJCWN1cl92YXIgPSBjdXJfdmFyLT5uZXh0OworCQkJZnJlZSh0bXApOworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlmZmx1c2hfYWxsKCk7CisJc2lnZXhpdCgtIChleGl0Y29kZSAmIDB4ZmYpKTsKKyNlbHNlCisJZXhpdChleGl0Y29kZSk7CisjZW5kaWYKK30KKworCisvL1RPRE86IHJldHVybiBhIG1hc2sgb2YgQUxMIGhhbmRsZWQgc2lncz8KK3N0YXRpYyBpbnQgY2hlY2tfYW5kX3J1bl90cmFwcyh2b2lkKQoreworCWludCBsYXN0X3NpZyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgc2lnOworCisJCWlmIChzaWdpc2VtcHR5c2V0KCZHLnBlbmRpbmdfc2V0KSkKKwkJCWJyZWFrOworCQlzaWcgPSAwOworCQlkbyB7CisJCQlzaWcrKzsKKwkJCWlmIChzaWdpc21lbWJlcigmRy5wZW5kaW5nX3NldCwgc2lnKSkgeworCQkJCXNpZ2RlbHNldCgmRy5wZW5kaW5nX3NldCwgc2lnKTsKKwkJCQlnb3RvIGdvdF9zaWc7CisJCQl9CisJCX0gd2hpbGUgKHNpZyA8IE5TSUcpOworCQlicmVhazsKKyBnb3Rfc2lnOgorCQlpZiAoRy50cmFwcyAmJiBHLnRyYXBzW3NpZ10pIHsKKwkJCWlmIChHLnRyYXBzW3NpZ11bMF0pIHsKKwkJCQkvKiBXZSBoYXZlIHVzZXItZGVmaW5lZCBoYW5kbGVyICovCisJCQkJc21hbGx1aW50IHNhdmVfcmNvZGU7CisJCQkJY2hhciAqYXJndlszXTsKKwkJCQkvKiBhcmd2WzBdIGlzIHVudXNlZCAqLworCQkJCWFyZ3ZbMV0gPSBHLnRyYXBzW3NpZ107CisJCQkJYXJndlsyXSA9IE5VTEw7CisJCQkJc2F2ZV9yY29kZSA9IEcubGFzdF9leGl0Y29kZTsKKwkJCQlidWlsdGluX2V2YWwoYXJndik7CisJCQkJRy5sYXN0X2V4aXRjb2RlID0gc2F2ZV9yY29kZTsKKwkJCQlsYXN0X3NpZyA9IHNpZzsKKwkJCX0gLyogZWxzZTogIiIgdHJhcCwgaWdub3Jpbmcgc2lnbmFsICovCisJCQljb250aW51ZTsKKwkJfQorCQkvKiBub3QgYSB0cmFwOiBzcGVjaWFsIGFjdGlvbiAqLworCQlzd2l0Y2ggKHNpZykgeworCQljYXNlIFNJR0lOVDoKKwkJCS8qIEJ1aWx0aW4gd2FzIF5DJ2VkLCBtYWtlIGl0IGxvb2sgcHJldHRpZXI6ICovCisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJRy5mbGFnX1NJR0lOVCA9IDE7CisJCQlsYXN0X3NpZyA9IHNpZzsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQljYXNlIFNJR0hVUDogeworCQkJc3RydWN0IHBpcGUgKmpvYjsKKwkJCS8qIGJhc2ggaXMgb2JzZXJ2ZWQgdG8gc2lnbmFsIHdob2xlIHByb2Nlc3MgZ3JvdXBzLAorCQkJICogbm90IGluZGl2aWR1YWwgcHJvY2Vzc2VzICovCisJCQlmb3IgKGpvYiA9IEcuam9iX2xpc3Q7IGpvYjsgam9iID0gam9iLT5uZXh0KSB7CisJCQkJaWYgKGpvYi0+cGdycCA8PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygiSFVQaW5nIHBncnAgJWRcbiIsIGpvYi0+cGdycCk7CisJCQkJaWYgKGtpbGwoLSBqb2ItPnBncnAsIFNJR0hVUCkgPT0gMCkKKwkJCQkJa2lsbCgtIGpvYi0+cGdycCwgU0lHQ09OVCk7CisJCQl9CisJCQlzaWdleGl0KFNJR0hVUCk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwkJY2FzZSBTSUdDSExEOgorCQkJRy5jb3VudF9TSUdDSExEKys7CisvL2JiX2Vycm9yX21zZygiWyVkXSBjaGVja19hbmRfcnVuX3RyYXBzOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisJCQkvKiBOb3RlOgorCQkJICogV2UgZG9udCBkbyAnbGFzdF9zaWcgPSBzaWcnIGhlcmUgLT4gTk9UIHJldHVybmluZyB0aGlzIHNpZy4KKwkJCSAqIFRoaXMgc2ltcGxpZmllcyB3YWl0IGJ1aWx0aW4gYSBiaXQuCisJCQkgKi8KKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6IC8qIGlnbm9yZWQ6ICovCisJCQkvKiBTSUdURVJNLCBTSUdRVUlULCBTSUdUVElOLCBTSUdUVE9VLCBTSUdUU1RQICovCisJCQkvKiBOb3RlOgorCQkJICogV2UgZG9udCBkbyAnbGFzdF9zaWcgPSBzaWcnIGhlcmUgLT4gTk9UIHJldHVybmluZyB0aGlzIHNpZy4KKwkJCSAqIEV4YW1wbGU6IHdhaXQgaXMgbm90IGludGVycnVwdGVkIGJ5IFRFUk0KKwkJCSAqIGluIGludGVyYWN0aXZlIHNoZWxsLCBiZWNhdXNlIFRFUk0gaXMgaWdub3JlZC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGxhc3Rfc2lnOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfY3dkKGludCBmb3JjZSkKK3sKKwlpZiAoZm9yY2UgfHwgRy5jd2QgPT0gTlVMTCkgeworCQkvKiB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihhcmcpIGNhbGxzIGZyZWUoYXJnKSwKKwkJICogd2UgbXVzdCBub3QgdHJ5IHRvIGZyZWUoYmJfbXNnX3Vua25vd24pICovCisJCWlmIChHLmN3ZCA9PSBiYl9tc2dfdW5rbm93bikKKwkJCUcuY3dkID0gTlVMTDsKKwkJRy5jd2QgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybigoY2hhciAqKUcuY3dkKTsKKwkJaWYgKCFHLmN3ZCkKKwkJCUcuY3dkID0gYmJfbXNnX3Vua25vd247CisJfQorCXJldHVybiBHLmN3ZDsKK30KKworCisvKgorICogU2hlbGwgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlIHN1cHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCB2YXJpYWJsZSAqKmdldF9wdHJfdG9fbG9jYWxfdmFyKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKipwcDsKKwlzdHJ1Y3QgdmFyaWFibGUgKmN1cjsKKworCXBwID0gJkcudG9wX3ZhcjsKKwl3aGlsZSAoKGN1ciA9ICpwcCkgIT0gTlVMTCkgeworCQlpZiAoc3RybmNtcChjdXItPnZhcnN0ciwgbmFtZSwgbGVuKSA9PSAwICYmIGN1ci0+dmFyc3RyW2xlbl0gPT0gJz0nKQorCQkJcmV0dXJuIHBwOworCQlwcCA9ICZjdXItPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciogRkFTVF9GVU5DIGdldF9sb2NhbF92YXJfdmFsdWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKip2cHA7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKG5hbWUpOworCisJaWYgKEcuZXhwYW5kZWRfYXNzaWdubWVudHMpIHsKKwkJY2hhciAqKmNwcCA9IEcuZXhwYW5kZWRfYXNzaWdubWVudHM7CisJCXdoaWxlICgqY3BwKSB7CisJCQljaGFyICpjcCA9ICpjcHA7CisJCQlpZiAoc3RybmNtcChjcCwgbmFtZSwgbGVuKSA9PSAwICYmIGNwW2xlbl0gPT0gJz0nKQorCQkJCXJldHVybiBjcCArIGxlbiArIDE7CisJCQljcHArKzsKKwkJfQorCX0KKworCXZwcCA9IGdldF9wdHJfdG9fbG9jYWxfdmFyKG5hbWUsIGxlbik7CisJaWYgKHZwcCkKKwkJcmV0dXJuICgqdnBwKS0+dmFyc3RyICsgbGVuICsgMTsKKworCWlmIChzdHJjbXAobmFtZSwgIlBQSUQiKSA9PSAwKQorCQlyZXR1cm4gdXRvYShHLnJvb3RfcHBpZCk7CisJLy8gYmFzaCBjb21wYXQ6IFVJRD8gRVVJRD8KKyNpZiBFTkFCTEVfSFVTSF9SQU5ET01fU1VQUE9SVAorCWlmIChzdHJjbXAobmFtZSwgIlJBTkRPTSIpID09IDApCisJCXJldHVybiB1dG9hKG5leHRfcmFuZG9tKCZHLnJhbmRvbV9nZW4pKTsKKyNlbmRpZgorCXJldHVybiBOVUxMOworfQorCisvKiBzdHIgaG9sZHMgIk5BTUU9VkFMIiBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgbWFsbG9jZWQuCisgKiBXZSB0YWtlIG93bmVyc2hpcCBvZiBpdC4KKyAqIGZsZ19leHBvcnQ6CisgKiAgMDogZG8gbm90IGNoYW5nZSBleHBvcnQgZmxhZworICogICAgIChpZiBjcmVhdGluZyBuZXcgdmFyaWFibGUsIGZsYWcgd2lsbCBiZSAwKQorICogIDE6IHNldCBleHBvcnQgZmxhZyBhbmQgcHV0ZW52IHRoZSB2YXJpYWJsZQorICogLTE6IGNsZWFyIGV4cG9ydCBmbGFnIGFuZCB1bnNldGVudiB0aGUgdmFyaWFibGUKKyAqIGZsZ19yZWFkX29ubHkgaXMgc2V0IG9ubHkgd2hlbiB3ZSBoYW5kbGUgLVIgdmFyPXZhbAorICovCisjaWYgIUJCX01NVSAmJiBFTkFCTEVfSFVTSF9MT0NBTAorLyogYWxsIHBhcmFtcyBhcmUgdXNlZCAqLworI2VsaWYgQkJfTU1VICYmIEVOQUJMRV9IVVNIX0xPQ0FMCisjZGVmaW5lIHNldF9sb2NhbF92YXIoc3RyLCBmbGdfZXhwb3J0LCBsb2NhbF9sdmwsIGZsZ19yZWFkX29ubHkpIFwKKwlzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsKQorI2VsaWYgQkJfTU1VICYmICFFTkFCTEVfSFVTSF9MT0NBTAorI2RlZmluZSBzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsLCBmbGdfcmVhZF9vbmx5KSBcCisJc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQpCisjZWxpZiAhQkJfTU1VICYmICFFTkFCTEVfSFVTSF9MT0NBTAorI2RlZmluZSBzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsLCBmbGdfcmVhZF9vbmx5KSBcCisJc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQsIGZsZ19yZWFkX29ubHkpCisjZW5kaWYKK3N0YXRpYyBpbnQgc2V0X2xvY2FsX3ZhcihjaGFyICpzdHIsIGludCBmbGdfZXhwb3J0LCBpbnQgbG9jYWxfbHZsLCBpbnQgZmxnX3JlYWRfb25seSkKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKip2YXJfcHA7CisJc3RydWN0IHZhcmlhYmxlICpjdXI7CisJY2hhciAqZXFfc2lnbjsKKwlpbnQgbmFtZV9sZW47CisKKwllcV9zaWduID0gc3RyY2hyKHN0ciwgJz0nKTsKKwlpZiAoIWVxX3NpZ24pIHsgLyogbm90IGV4cGVjdGVkIHRvIGV2ZXIgaGFwcGVuPyAqLworCQlmcmVlKHN0cik7CisJCXJldHVybiAtMTsKKwl9CisKKwluYW1lX2xlbiA9IGVxX3NpZ24gLSBzdHIgKyAxOyAvKiBpbmNsdWRpbmcgJz0nICovCisJdmFyX3BwID0gJkcudG9wX3ZhcjsKKwl3aGlsZSAoKGN1ciA9ICp2YXJfcHApICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoY3VyLT52YXJzdHIsIHN0ciwgbmFtZV9sZW4pICE9IDApIHsKKwkJCXZhcl9wcCA9ICZjdXItPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBmb3VuZCBhbiBleGlzdGluZyB2YXIgd2l0aCB0aGlzIG5hbWUgKi8KKwkJaWYgKGN1ci0+ZmxnX3JlYWRfb25seSkgeworI2lmICFCQl9NTVUKKwkJCWlmICghZmxnX3JlYWRfb25seSkKKyNlbmRpZgorCQkJCWJiX2Vycm9yX21zZygiJXM6IHJlYWRvbmx5IHZhcmlhYmxlIiwgc3RyKTsKKwkJCWZyZWUoc3RyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZmxnX2V4cG9ydCA9PSAtMSkgeyAvLyAiJiYgY3VyLT5mbGdfZXhwb3J0IiA/CisJCQlkZWJ1Z19wcmludGZfZW52KCIlczogdW5zZXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIHN0cik7CisJCQkqZXFfc2lnbiA9ICdcMCc7CisJCQl1bnNldGVudihzdHIpOworCQkJKmVxX3NpZ24gPSAnPSc7CisJCX0KKyNpZiBFTkFCTEVfSFVTSF9MT0NBTAorCQlpZiAoY3VyLT5mdW5jX25lc3RfbGV2ZWwgPCBsb2NhbF9sdmwpIHsKKwkJCS8qIE5ldyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBhcyBsb2NhbCwKKwkJCSAqIGFuZCBleGlzdGluZyBvbmUgaXMgZ2xvYmFsLCBvciBsb2NhbAorCQkJICogZnJvbSBlbmNsb3NpbmcgZnVuY3Rpb24uCisJCQkgKiBSZW1vdmUgYW5kIHNhdmUgb2xkIG9uZTogKi8KKwkJCSp2YXJfcHAgPSBjdXItPm5leHQ7CisJCQljdXItPm5leHQgPSAqRy5zaGFkb3dlZF92YXJzX3BwOworCQkJKkcuc2hhZG93ZWRfdmFyc19wcCA9IGN1cjsKKwkJCS8qIGJhc2ggMy4yLjMzKDEpIGFuZCBleHBvcnRlZCB2YXJzOgorCQkJICogIyBleHBvcnQgej16CisJCQkgKiAjIGYoKSB7IGxvY2FsIHo9YTsgZW52IHwgZ3JlcCBeejsgfQorCQkJICogIyBmCisJCQkgKiB6PWEKKwkJCSAqICMgZW52IHwgZ3JlcCBeegorCQkJICogej16CisJCQkgKi8KKwkJCWlmIChjdXItPmZsZ19leHBvcnQpCisJCQkJZmxnX2V4cG9ydCA9IDE7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmIChzdHJjbXAoY3VyLT52YXJzdHIgKyBuYW1lX2xlbiwgZXFfc2lnbiArIDEpID09IDApIHsKKyBmcmVlX2FuZF9leHA6CisJCQlmcmVlKHN0cik7CisJCQlnb3RvIGV4cDsKKwkJfQorCQlpZiAoY3VyLT5tYXhfbGVuICE9IDApIHsKKwkJCWlmIChjdXItPm1heF9sZW4gPj0gc3RybGVuKHN0cikpIHsKKwkJCQkvKiBUaGlzIG9uZSBpcyBmcm9tIHN0YXJ0dXAgZW52LCByZXVzZSBzcGFjZSAqLworCQkJCXN0cmNweShjdXItPnZhcnN0ciwgc3RyKTsKKwkJCQlnb3RvIGZyZWVfYW5kX2V4cDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIG1heF9sZW4gPT0gMCBzaWduaWZpZXMgIm1hbGxvY2VkIiB2YXIsIHdoaWNoIHdlIGNhbgorCQkJICogKGFuZCBoYXMgdG8pIGZyZWUgKi8KKwkJCWZyZWUoY3VyLT52YXJzdHIpOworCQl9CisJCWN1ci0+bWF4X2xlbiA9IDA7CisJCWdvdG8gc2V0X3N0cl9hbmRfZXhwOworCX0KKworCS8qIE5vdCBmb3VuZCAtIGNyZWF0ZSBuZXcgdmFyaWFibGUgc3RydWN0ICovCisJY3VyID0geHphbGxvYyhzaXplb2YoKmN1cikpOworI2lmIEVOQUJMRV9IVVNIX0xPQ0FMCisJY3VyLT5mdW5jX25lc3RfbGV2ZWwgPSBsb2NhbF9sdmw7CisjZW5kaWYKKwljdXItPm5leHQgPSAqdmFyX3BwOworCSp2YXJfcHAgPSBjdXI7CisKKyBzZXRfc3RyX2FuZF9leHA6CisJY3VyLT52YXJzdHIgPSBzdHI7CisjaWYgIUJCX01NVQorCWN1ci0+ZmxnX3JlYWRfb25seSA9IGZsZ19yZWFkX29ubHk7CisjZW5kaWYKKyBleHA6CisJaWYgKGZsZ19leHBvcnQgPT0gMSkKKwkJY3VyLT5mbGdfZXhwb3J0ID0gMTsKKwlpZiAobmFtZV9sZW4gPT0gNCAmJiBjdXItPnZhcnN0clswXSA9PSAnUCcgJiYgY3VyLT52YXJzdHJbMV0gPT0gJ1MnKQorCQljbWRlZGl0X3VwZGF0ZV9wcm9tcHQoKTsKKwlpZiAoY3VyLT5mbGdfZXhwb3J0KSB7CisJCWlmIChmbGdfZXhwb3J0ID09IC0xKSB7CisJCQljdXItPmZsZ19leHBvcnQgPSAwOworCQkJLyogdW5zZXRlbnYgd2FzIGFscmVhZHkgZG9uZSAqLworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHB1dGVudiAnJXMnXG4iLCBfX2Z1bmNfXywgY3VyLT52YXJzdHIpOworCQkJcmV0dXJuIHB1dGVudihjdXItPnZhcnN0cik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFVzZWQgYXQgc3RhcnR1cCBhbmQgYWZ0ZXIgZWFjaCBjZCAqLworc3RhdGljIHZvaWQgc2V0X3B3ZF92YXIoaW50IGV4cCkKK3sKKwlzZXRfbG9jYWxfdmFyKHhhc3ByaW50ZigiUFdEPSVzIiwgZ2V0X2N3ZCgvKmZvcmNlOiovIDEpKSwKKwkJLypleHA6Ki8gZXhwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworfQorCitzdGF0aWMgaW50IHVuc2V0X2xvY2FsX3Zhcl9sZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQoreworCXN0cnVjdCB2YXJpYWJsZSAqY3VyOworCXN0cnVjdCB2YXJpYWJsZSAqKnZhcl9wcDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl2YXJfcHAgPSAmRy50b3BfdmFyOworCXdoaWxlICgoY3VyID0gKnZhcl9wcCkgIT0gTlVMTCkgeworCQlpZiAoc3RybmNtcChjdXItPnZhcnN0ciwgbmFtZSwgbmFtZV9sZW4pID09IDAgJiYgY3VyLT52YXJzdHJbbmFtZV9sZW5dID09ICc9JykgeworCQkJaWYgKGN1ci0+ZmxnX3JlYWRfb25seSkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IHJlYWRvbmx5IHZhcmlhYmxlIiwgbmFtZSk7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJCSp2YXJfcHAgPSBjdXItPm5leHQ7CisJCQlkZWJ1Z19wcmludGZfZW52KCIlczogdW5zZXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIGN1ci0+dmFyc3RyKTsKKwkJCWJiX3Vuc2V0ZW52KGN1ci0+dmFyc3RyKTsKKwkJCWlmIChuYW1lX2xlbiA9PSAzICYmIGN1ci0+dmFyc3RyWzBdID09ICdQJyAmJiBjdXItPnZhcnN0clsxXSA9PSAnUycpCisJCQkJY21kZWRpdF91cGRhdGVfcHJvbXB0KCk7CisJCQlpZiAoIWN1ci0+bWF4X2xlbikKKwkJCQlmcmVlKGN1ci0+dmFyc3RyKTsKKwkJCWZyZWUoY3VyKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJdmFyX3BwID0gJmN1ci0+bmV4dDsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB1bnNldF9sb2NhbF92YXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gdW5zZXRfbG9jYWxfdmFyX2xlbihuYW1lLCBzdHJsZW4obmFtZSkpOworfQorCitzdGF0aWMgdm9pZCB1bnNldF92YXJzKGNoYXIgKipzdHJpbmdzKQoreworCWNoYXIgKip2OworCisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm47CisJdiA9IHN0cmluZ3M7CisJd2hpbGUgKCp2KSB7CisJCWNvbnN0IGNoYXIgKmVxID0gc3RyY2hybnVsKCp2LCAnPScpOworCQl1bnNldF9sb2NhbF92YXJfbGVuKCp2LCAoaW50KShlcSAtICp2KSk7CisJCXYrKzsKKwl9CisJZnJlZShzdHJpbmdzKTsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHNldF9sb2NhbF92YXJfZnJvbV9oYWx2ZXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKQoreworCWNoYXIgKnZhciA9IHhhc3ByaW50ZigiJXM9JXMiLCBuYW1lLCB2YWwpOworCXNldF9sb2NhbF92YXIodmFyLCAvKmZsYWdzOiovIDAsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7Cit9CisKKworLyoKKyAqIEhlbHBlcnMgZm9yICJ2YXIxPXZhbDEgdmFyMj12YWwyIGNtZCIgZmVhdHVyZQorICovCitzdGF0aWMgdm9pZCBhZGRfdmFycyhzdHJ1Y3QgdmFyaWFibGUgKnZhcikKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKm5leHQ7CisKKwl3aGlsZSAodmFyKSB7CisJCW5leHQgPSB2YXItPm5leHQ7CisJCXZhci0+bmV4dCA9IEcudG9wX3ZhcjsKKwkJRy50b3BfdmFyID0gdmFyOworCQlpZiAodmFyLT5mbGdfZXhwb3J0KSB7CisJCQlkZWJ1Z19wcmludGZfZW52KCIlczogcmVzdG9yaW5nIGV4cG9ydGVkICclcydcbiIsIF9fZnVuY19fLCB2YXItPnZhcnN0cik7CisJCQlwdXRlbnYodmFyLT52YXJzdHIpOworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHJlc3RvcmluZyB2YXJpYWJsZSAnJXMnXG4iLCBfX2Z1bmNfXywgdmFyLT52YXJzdHIpOworCQl9CisJCXZhciA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHZhcmlhYmxlICpzZXRfdmFyc19hbmRfc2F2ZV9vbGQoY2hhciAqKnN0cmluZ3MpCit7CisJY2hhciAqKnM7CisJc3RydWN0IHZhcmlhYmxlICpvbGQgPSBOVUxMOworCisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm4gb2xkOworCXMgPSBzdHJpbmdzOworCXdoaWxlICgqcykgeworCQlzdHJ1Y3QgdmFyaWFibGUgKnZhcl9wOworCQlzdHJ1Y3QgdmFyaWFibGUgKip2YXJfcHA7CisJCWNoYXIgKmVxOworCisJCWVxID0gc3RyY2hyKCpzLCAnPScpOworCQlpZiAoZXEpIHsKKwkJCXZhcl9wcCA9IGdldF9wdHJfdG9fbG9jYWxfdmFyKCpzLCBlcSAtICpzKTsKKwkJCWlmICh2YXJfcHApIHsKKwkJCQkvKiBSZW1vdmUgdmFyaWFibGUgZnJvbSBnbG9iYWwgbGlua2VkIGxpc3QgKi8KKwkJCQl2YXJfcCA9ICp2YXJfcHA7CisJCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHJlbW92aW5nICclcydcbiIsIF9fZnVuY19fLCB2YXJfcC0+dmFyc3RyKTsKKwkJCQkqdmFyX3BwID0gdmFyX3AtPm5leHQ7CisJCQkJLyogQWRkIGl0IHRvIHJldHVybmVkIGxpc3QgKi8KKwkJCQl2YXJfcC0+bmV4dCA9IG9sZDsKKwkJCQlvbGQgPSB2YXJfcDsKKwkJCX0KKwkJCXNldF9sb2NhbF92YXIoKnMsIC8qZXhwOiovIDEsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7CisJCX0KKwkJcysrOworCX0KKwlyZXR1cm4gb2xkOworfQorCisKKy8qCisgKiBpbl9zdHIgc3VwcG9ydAorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfZ2V0KHN0cnVjdCBpbl9zdHIgKmkpCit7CisJaW50IGNoID0gKmktPnA7CisJaWYgKGNoICE9ICdcMCcpIHsKKwkJaS0+cCsrOworCQlpLT5sYXN0X2NoYXIgPSBjaDsKKwkJcmV0dXJuIGNoOworCX0KKwlyZXR1cm4gRU9GOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfcGVlayhzdHJ1Y3QgaW5fc3RyICppKQoreworCXJldHVybiAqaS0+cDsKK30KKworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisKK3N0YXRpYyB2b2lkIGNtZGVkaXRfdXBkYXRlX3Byb21wdCh2b2lkKQoreworCWlmIChFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCkgeworCQlHLlBTMSA9IGdldF9sb2NhbF92YXJfdmFsdWUoIlBTMSIpOworCQlpZiAoRy5QUzEgPT0gTlVMTCkKKwkJCUcuUFMxID0gIlxcdyBcXCQgIjsKKwkJRy5QUzIgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJQUzIiKTsKKwl9IGVsc2UgeworCQlHLlBTMSA9IE5VTEw7CisJfQorCWlmIChHLlBTMiA9PSBOVUxMKQorCQlHLlBTMiA9ICI+ICI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzZXR1cF9wcm9tcHRfc3RyaW5nKGludCBwcm9tcHRtb2RlKQoreworCWNvbnN0IGNoYXIgKnByb21wdF9zdHI7CisJZGVidWdfcHJpbnRmKCJzZXR1cF9wcm9tcHRfc3RyaW5nICVkICIsIHByb21wdG1vZGUpOworCWlmICghRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQpIHsKKwkJLyogU2V0IHVwIHRoZSBwcm9tcHQgKi8KKwkJaWYgKHByb21wdG1vZGUgPT0gMCkgeyAvKiBQUzEgKi8KKwkJCWZyZWUoKGNoYXIqKUcuUFMxKTsKKwkJCS8qIGJhc2ggdXNlcyAkUFdEIHZhbHVlLCBldmVuIGlmIGl0IGlzIHNldCBieSB1c2VyLgorCQkJICogSXQgdXNlcyBjdXJyZW50IGRpciBvbmx5IGlmIFBXRCBpcyB1bnNldC4KKwkJCSAqIFdlIGFsd2F5cyB1c2UgY3VycmVudCBkaXIuICovCisJCQlHLlBTMSA9IHhhc3ByaW50ZigiJXMgJWMgIiwgZ2V0X2N3ZCgwKSwgKGdldGV1aWQoKSAhPSAwKSA/ICckJyA6ICcjJyk7CisJCQlwcm9tcHRfc3RyID0gRy5QUzE7CisJCX0gZWxzZQorCQkJcHJvbXB0X3N0ciA9IEcuUFMyOworCX0gZWxzZQorCQlwcm9tcHRfc3RyID0gKHByb21wdG1vZGUgPT0gMCkgPyBHLlBTMSA6IEcuUFMyOworCWRlYnVnX3ByaW50ZigicmVzdWx0ICclcydcbiIsIHByb21wdF9zdHIpOworCXJldHVybiBwcm9tcHRfc3RyOworfQorCitzdGF0aWMgdm9pZCBnZXRfdXNlcl9pbnB1dChzdHJ1Y3QgaW5fc3RyICppKQoreworCWludCByOworCWNvbnN0IGNoYXIgKnByb21wdF9zdHI7CisKKwlwcm9tcHRfc3RyID0gc2V0dXBfcHJvbXB0X3N0cmluZyhpLT5wcm9tcHRtb2RlKTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworCS8qIEVuYWJsZSBjb21tYW5kIGxpbmUgZWRpdGluZyBvbmx5IHdoaWxlIGEgY29tbWFuZCBsaW5lCisJICogaXMgYWN0dWFsbHkgYmVpbmcgcmVhZCAqLworCWRvIHsKKwkJLyogVW5pY29kZSBzdXBwb3J0IHNob3VsZCBiZSBhY3RpdmF0ZWQgZXZlbiBpZiBMQU5HIGlzIHNldAorCQkgKiBfZHVyaW5nXyBzaGVsbCBleGVjdXRpb24sIG5vdCBvbmx5IGlmIGl0IHdhcyBzZXQgd2hlbgorCQkgKiBzaGVsbCB3YXMgc3RhcnRlZC4gVGhlcmVmb3JlLCByZS1jaGVjayBMQU5HIGV2ZXJ5IHRpbWU6CisJCSAqLworCQlyZWluaXRfdW5pY29kZShnZXRfbG9jYWxfdmFyX3ZhbHVlKCJMQU5HIikpOworCisJCUcuZmxhZ19TSUdJTlQgPSAwOworCQkvKiBidWdsZXQ6IFNJR0lOVCB3aWxsIG5vdCBtYWtlIG5ldyBwcm9tcHQgdG8gYXBwZWFyIF9hdCBvbmNlXywKKwkJICogb25seSBhZnRlciA8RW50ZXI+LiAoXkMgd2lsbCB3b3JrKSAqLworCQlyID0gcmVhZF9saW5lX2lucHV0KEcubGluZV9pbnB1dF9zdGF0ZSwgcHJvbXB0X3N0ciwgRy51c2VyX2lucHV0X2J1ZiwgQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOLTEsIC8qdGltZW91dCovIC0xKTsKKwkJLyogY2F0Y2ggKlNJR0lOVCogZXRjICheQyBpcyBoYW5kbGVkIGJ5IHJlYWRfbGluZV9pbnB1dCkgKi8KKwkJY2hlY2tfYW5kX3J1bl90cmFwcygpOworCX0gd2hpbGUgKHIgPT0gMCB8fCBHLmZsYWdfU0lHSU5UKTsgLyogcmVwZWF0IGlmIF5DIG9yIFNJR0lOVCAqLworCWktPmVvZl9mbGFnID0gKHIgPCAwKTsKKwlpZiAoaS0+ZW9mX2ZsYWcpIHsgLyogRU9GL2Vycm9yIGRldGVjdGVkICovCisJCUcudXNlcl9pbnB1dF9idWZbMF0gPSBFT0Y7IC8qIHllcywgaXQgd2lsbCBiZSB0cnVuY2F0ZWQsIGl0J3Mgb2sgKi8KKwkJRy51c2VyX2lucHV0X2J1ZlsxXSA9ICdcMCc7CisJfQorIyBlbHNlCisJZG8geworCQlHLmZsYWdfU0lHSU5UID0gMDsKKwkJaWYgKGktPmxhc3RfY2hhciA9PSAnXDAnIHx8IGktPmxhc3RfY2hhciA9PSAnXG4nKSB7CisJCQkvKiBXaHkgY2hlY2tfYW5kX3J1bl90cmFwcyBoZXJlPyBUcnkgdGhpcyBpbnRlcmFjdGl2ZWx5OgorCQkJICogJCB0cmFwICdlY2hvIElOVCcgSU5UOyAoc2xlZXAgMjsga2lsbCAtSU5UICQkKSAmCisJCQkgKiAkIDxbZW50ZXJdLCByZXBlYXRlZGx5Li4uPgorCQkJICogV2l0aG91dCBjaGVja19hbmRfcnVuX3RyYXBzLCBoYW5kbGVyIG5ldmVyIHJ1bnMuCisJCQkgKi8KKwkJCWNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKwkJCWZwdXRzKHByb21wdF9zdHIsIHN0ZG91dCk7CisJCX0KKwkJZmZsdXNoX2FsbCgpOworCQlHLnVzZXJfaW5wdXRfYnVmWzBdID0gciA9IGZnZXRjKGktPmZpbGUpOworCQkvKkcudXNlcl9pbnB1dF9idWZbMV0gPSAnXDAnOyAtIGFscmVhZHkgaXMgYW5kIG5ldmVyIGNoYW5nZWQgKi8KKwl9IHdoaWxlIChHLmZsYWdfU0lHSU5UKTsKKwlpLT5lb2ZfZmxhZyA9IChyID09IEVPRik7CisjIGVuZGlmCisJaS0+cCA9IEcudXNlcl9pbnB1dF9idWY7Cit9CisKKyNlbmRpZiAgLyogSU5URVJBQ1RJVkUgKi8KKworLyogVGhpcyBpcyB0aGUgbWFnaWMgbG9jYXRpb24gdGhhdCBwcmludHMgcHJvbXB0cworICogYW5kIGdldHMgZGF0YSBiYWNrIGZyb20gdGhlIHVzZXIgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVfZ2V0KHN0cnVjdCBpbl9zdHIgKmkpCit7CisJaW50IGNoOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSB3YWl0aW5nLCBlYXQgaXQgdXAgKi8KKwlpZiAoaS0+cCAmJiAqaS0+cCkgeworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisgdGFrZV9jYWNoZWQ6CisjZW5kaWYKKwkJY2ggPSAqaS0+cCsrOworCQlpZiAoaS0+ZW9mX2ZsYWcgJiYgISppLT5wKQorCQkJY2ggPSBFT0Y7CisJCS8qIG5vdGU6IGNoIGlzIG5ldmVyIE5VTCAqLworCX0gZWxzZSB7CisJCS8qIG5lZWQgdG8gZG91YmxlIGNoZWNrIGktPmZpbGUgYmVjYXVzZSB3ZSBtaWdodCBiZSBkb2luZyBzb21ldGhpbmcKKwkJICogbW9yZSBjb21wbGljYXRlZCBieSBub3csIGxpa2Ugc291cmNpbmcgb3Igc3Vic3RpdHV0aW5nLiAqLworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisJCWlmIChHX2ludGVyYWN0aXZlX2ZkICYmIGktPmZpbGUgPT0gc3RkaW4pIHsKKwkJCWRvIHsKKwkJCQlnZXRfdXNlcl9pbnB1dChpKTsKKwkJCX0gd2hpbGUgKCEqaS0+cCk7IC8qIG5lZWQgbm9uLWVtcHR5IGxpbmUgKi8KKwkJCWktPnByb21wdG1vZGUgPSAxOyAvKiBQUzIgKi8KKwkJCWdvdG8gdGFrZV9jYWNoZWQ7CisJCX0KKyNlbmRpZgorCQlkbyBjaCA9IGZnZXRjKGktPmZpbGUpOyB3aGlsZSAoY2ggPT0gJ1wwJyk7CisJfQorCWRlYnVnX3ByaW50ZigiZmlsZV9nZXQ6IGdvdCAnJWMnICVkXG4iLCBjaCwgY2gpOworCWktPmxhc3RfY2hhciA9IGNoOworCXJldHVybiBjaDsKK30KKworLyogQWxsIGNhbGxlcnMgZ3VhcmFudGVlIHRoaXMgcm91dGluZSB3aWxsIG5ldmVyCisgKiBiZSB1c2VkIHJpZ2h0IGFmdGVyIGEgbmV3bGluZSwgc28gcHJvbXB0aW5nIGlzIG5vdCBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVfcGVlayhzdHJ1Y3QgaW5fc3RyICppKQoreworCWludCBjaDsKKwlpZiAoaS0+cCAmJiAqaS0+cCkgeworCQlpZiAoaS0+ZW9mX2ZsYWcgJiYgIWktPnBbMV0pCisJCQlyZXR1cm4gRU9GOworCQlyZXR1cm4gKmktPnA7CisJCS8qIG5vdGU6IGNoIGlzIG5ldmVyIE5VTCAqLworCX0KKwlkbyBjaCA9IGZnZXRjKGktPmZpbGUpOyB3aGlsZSAoY2ggPT0gJ1wwJyk7CisJaS0+ZW9mX2ZsYWcgPSAoY2ggPT0gRU9GKTsKKwlpLT5wZWVrX2J1ZlswXSA9IGNoOworCWktPnBlZWtfYnVmWzFdID0gJ1wwJzsKKwlpLT5wID0gaS0+cGVla19idWY7CisJZGVidWdfcHJpbnRmKCJmaWxlX3BlZWs6IGdvdCAnJWMnICVkXG4iLCBjaCwgY2gpOworCXJldHVybiBjaDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfZmlsZV9pbl9zdHIoc3RydWN0IGluX3N0ciAqaSwgRklMRSAqZikKK3sKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7CisJaS0+cGVlayA9IGZpbGVfcGVlazsKKwlpLT5nZXQgPSBmaWxlX2dldDsKKwkvKiBpLT5wcm9tcHRtb2RlID0gMDsgLSBQUzEgKG1lbXNldCBkaWQgaXQpICovCisJaS0+ZmlsZSA9IGY7CisJLyogaS0+cCA9IE5VTEw7ICovCit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3N0cmluZ19pbl9zdHIoc3RydWN0IGluX3N0ciAqaSwgY29uc3QgY2hhciAqcykKK3sKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7CisJaS0+cGVlayA9IHN0YXRpY19wZWVrOworCWktPmdldCA9IHN0YXRpY19nZXQ7CisJLyogaS0+cHJvbXB0bW9kZSA9IDA7IC0gUFMxIChtZW1zZXQgZGlkIGl0KSAqLworCWktPnAgPSBzOworCS8qIGktPmVvZl9mbGFnID0gMDsgKi8KK30KKworCisvKgorICogb19zdHJpbmcgc3VwcG9ydAorICovCisjZGVmaW5lIEJfQ0hVTksgICgzMiAqIHNpemVvZihjaGFyKikpCisKK3N0YXRpYyB2b2lkIG9fcmVzZXRfdG9fZW1wdHlfdW5xdW90ZWQob19zdHJpbmcgKm8pCit7CisJby0+bGVuZ3RoID0gMDsKKwlvLT5oYXNfcXVvdGVkX3BhcnQgPSAwOworCWlmIChvLT5kYXRhKQorCQlvLT5kYXRhWzBdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgb19mcmVlKG9fc3RyaW5nICpvKQoreworCWZyZWUoby0+ZGF0YSk7CisJbWVtc2V0KG8sIDAsIHNpemVvZigqbykpOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIG9fZnJlZV91bnNhZmUob19zdHJpbmcgKm8pCit7CisJZnJlZShvLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgb19ncm93X2J5KG9fc3RyaW5nICpvLCBpbnQgbGVuKQoreworCWlmIChvLT5sZW5ndGggKyBsZW4gPiBvLT5tYXhsZW4pIHsKKwkJby0+bWF4bGVuICs9ICgyKmxlbiA+IEJfQ0hVTksgPyAyKmxlbiA6IEJfQ0hVTkspOworCQlvLT5kYXRhID0geHJlYWxsb2Moby0+ZGF0YSwgMSArIG8tPm1heGxlbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvX2FkZGNocihvX3N0cmluZyAqbywgaW50IGNoKQoreworCWRlYnVnX3ByaW50Zigib19hZGRjaHI6ICclYycgby0+bGVuZ3RoPSVkIG89JXBcbiIsIGNoLCBvLT5sZW5ndGgsIG8pOworCW9fZ3Jvd19ieShvLCAxKTsKKwlvLT5kYXRhW28tPmxlbmd0aF0gPSBjaDsKKwlvLT5sZW5ndGgrKzsKKwlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBvX2FkZGJsb2NrKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJb19ncm93X2J5KG8sIGxlbik7CisJbWVtY3B5KCZvLT5kYXRhW28tPmxlbmd0aF0sIHN0ciwgbGVuKTsKKwlvLT5sZW5ndGggKz0gbGVuOworCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkc3RyKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIpCit7CisJb19hZGRibG9jayhvLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworI2lmICFCQl9NTVUKK3N0YXRpYyB2b2lkIG5vbW11X2FkZGNocihvX3N0cmluZyAqbywgaW50IGNoKQoreworCWlmIChvKQorCQlvX2FkZGNocihvLCBjaCk7Cit9CisjZWxzZQorIyBkZWZpbmUgbm9tbXVfYWRkY2hyKG8sIHN0cikgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIHZvaWQgb19hZGRzdHJfd2l0aF9OVUwob19zdHJpbmcgKm8sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlvX2FkZGJsb2NrKG8sIHN0ciwgc3RybGVuKHN0cikgKyAxKTsKK30KKworLyoKKyAqIEhVU0hfQlJBQ0VfRVhQQU5TSU9OIGNvZGUgbmVlZHMgY29ycmVzcG9uZGluZyBxdW90aW5nIG9uIHZhcmlhYmxlIGV4cGFuc2lvbiBzaWRlLgorICogQ3VycmVudGx5LCAidj0ne3Esd30nOyBlY2hvICR2IiBlcnJvbmVvdXNseSBleHBhbmRzIGJyYWNlcyBpbiAkdi4KKyAqIEFwcGFyZW50bHksIG9uIHVucXVvdGVkICR2IGJhc2ggc3RpbGwgZG9lcyBnbG9iYmluZworICogKCJ2PScqLnR4dCc7IGVjaG8gJHYiIHByaW50cyBhbGwgLnR4dCBmaWxlcyksCisgKiBidXQgTk9UIGJyYWNlIGV4cGFuc2lvbiEgVGh1cywgdGhlcmUgc2hvdWxkIGJlIFRXTyBpbmRlcGVuZGVudAorICogcXVvdGluZyBtZWNoYW5pc21zIG9uICR2IGV4cGFuc2lvbiBzaWRlOiBvbmUgcHJvdGVjdHMKKyAqICR2IGZyb20gYnJhY2UgZXhwYW5zaW9uLCBhbmQgb3RoZXIgYWRkaXRpb25hbGx5IHByb3RlY3RzICIkdiIgYWdhaW5zdCBnbG9iYmluZy4KKyAqIFdlIGhhdmUgb25seSBzZWNvbmQgb25lLgorICovCisKKyNpZiBFTkFCTEVfSFVTSF9CUkFDRV9FWFBBTlNJT04KKyMgZGVmaW5lIE1BWUJFX0JSQUNFUyAie30iCisjZWxzZQorIyBkZWZpbmUgTUFZQkVfQlJBQ0VTICIiCisjZW5kaWYKKworLyogTXkgYW5hbHlzaXMgb2YgcXVvdGluZyBzZW1hbnRpY3MgdGVsbHMgbWUgdGhhdCBzdGF0ZSBpbmZvcm1hdGlvbgorICogaXMgYXNzb2NpYXRlZCB3aXRoIGEgZGVzdGluYXRpb24sIG5vdCBhIHNvdXJjZS4KKyAqLworc3RhdGljIHZvaWQgb19hZGRxY2hyKG9fc3RyaW5nICpvLCBpbnQgY2gpCit7CisJaW50IHN6ID0gMTsKKwljaGFyICpmb3VuZCA9IHN0cmNocigiKj9bXFwiIE1BWUJFX0JSQUNFUywgY2gpOworCWlmIChmb3VuZCkKKwkJc3orKzsKKwlvX2dyb3dfYnkobywgc3opOworCWlmIChmb3VuZCkgeworCQlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXFwnOworCQlvLT5sZW5ndGgrKzsKKwl9CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gY2g7CisJby0+bGVuZ3RoKys7CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgb19hZGRRY2hyKG9fc3RyaW5nICpvLCBpbnQgY2gpCit7CisJaW50IHN6ID0gMTsKKwlpZiAoKG8tPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUykKKwkgJiYgc3RyY2hyKCIqP1tcXCIgTUFZQkVfQlJBQ0VTLCBjaCkKKwkpIHsKKwkJc3orKzsKKwkJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1xcJzsKKwkJby0+bGVuZ3RoKys7CisJfQorCW9fZ3Jvd19ieShvLCBzeik7CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gY2g7CisJby0+bGVuZ3RoKys7CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgb19hZGRxYmxvY2sob19zdHJpbmcgKm8sIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuKSB7CisJCWNoYXIgY2g7CisJCWludCBzejsKKwkJaW50IG9yZGluYXJ5X2NudCA9IHN0cmNzcG4oc3RyLCAiKj9bXFwiIE1BWUJFX0JSQUNFUyk7CisJCWlmIChvcmRpbmFyeV9jbnQgPiBsZW4pIC8qIHBhcmFub2lhICovCisJCQlvcmRpbmFyeV9jbnQgPSBsZW47CisJCW9fYWRkYmxvY2sobywgc3RyLCBvcmRpbmFyeV9jbnQpOworCQlpZiAob3JkaW5hcnlfY250ID09IGxlbikKKwkJCXJldHVybjsgLyogTlVMIGlzIGFscmVhZHkgYWRkZWQgYnkgb19hZGRibG9jayAqLworCQlzdHIgKz0gb3JkaW5hcnlfY250OworCQlsZW4gLT0gb3JkaW5hcnlfY250ICsgMTsgLyogd2UgYXJlIHByb2Nlc3NpbmcgKyAxIGNoYXIgYmVsb3cgKi8KKworCQljaCA9ICpzdHIrKzsKKwkJc3ogPSAxOworCQlpZiAoY2gpIHsgLyogaXQgaXMgbmVjZXNzYXJpbHkgb25lIG9mICIqP1tcXCIgTUFZQkVfQlJBQ0VTICovCisJCQlzeisrOworCQkJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1xcJzsKKwkJCW8tPmxlbmd0aCsrOworCQl9CisJCW9fZ3Jvd19ieShvLCBzeik7CisJCW8tPmRhdGFbby0+bGVuZ3RoXSA9IGNoOworCQlvLT5sZW5ndGgrKzsKKwl9CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgb19hZGRRYmxvY2sob19zdHJpbmcgKm8sIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwlpZiAoIShvLT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpKSB7CisJCW9fYWRkYmxvY2sobywgc3RyLCBsZW4pOworCQlyZXR1cm47CisJfQorCW9fYWRkcWJsb2NrKG8sIHN0ciwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgb19hZGRRc3RyKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIpCit7CisJb19hZGRRYmxvY2sobywgc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKKy8qIEEgc3BlY2lhbCBraW5kIG9mIG9fc3RyaW5nIGZvciAkVkFSIGFuZCBgY21kYCBleHBhbnNpb24uCisgKiBJdCBjb250YWlucyBjaGFyKiBsaXN0W10gYXQgdGhlIGJlZ2lubmluZywgd2hpY2ggaXMgZ3Jvd24gaW4gMTYgZWxlbWVudAorICogaW5jcmVtZW50cy4gQWN0dWFsIHN0cmluZyBkYXRhIHN0YXJ0cyBhdCB0aGUgbmV4dCBtdWx0aXBsZSBvZiAxNiAqIChjaGFyKikuCisgKiBsaXN0W2ldIGNvbnRhaW5zIGFuIElOREVYIChpbnQhKSBpbnRvIHRoaXMgc3RyaW5nIGRhdGEuCisgKiBJdCBtZWFucyB0aGF0IGlmIGxpc3RbXSBuZWVkcyB0byBncm93LCBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGhpZ2hlciB1cAorICogYnV0IGxpc3RbaV0ncyBuZWVkIG5vdCBiZSBtb2RpZmllZC4KKyAqIE5COiByZW1lbWJlcmluZyBob3cgbWFueSBsaXN0W2ldJ3MgeW91IGhhdmUgdGhlcmUgaXMgY3J1Y2lhbC4KKyAqIG9fZmluYWxpemVfbGlzdCgpIG9wZXJhdGlvbiBwb3N0LXByb2Nlc3NlcyB0aGlzIHN0cnVjdHVyZSAtIGNhbGN1bGF0ZXMKKyAqIGFuZCBzdG9yZXMgYWN0dWFsIGNoYXIqIHB0cnMgaW4gbGlzdFtdLiBPaCwgaXQgTlVMTCB0ZXJtaW5hdGVzIGl0IGFzIHdlbGwuCisgKi8KKyNpZiBERUJVR19FWFBBTkQgfHwgREVCVUdfR0xPQgorc3RhdGljIHZvaWQgZGVidWdfcHJpbnRfbGlzdChjb25zdCBjaGFyICpwcmVmaXgsIG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwljaGFyICoqbGlzdCA9IChjaGFyKiopby0+ZGF0YTsKKwlpbnQgc3RyaW5nX3N0YXJ0ID0gKChuICsgMHhmKSAmIH4weGYpICogc2l6ZW9mKGxpc3RbMF0pOworCWludCBpID0gMDsKKworCWluZGVudCgpOworCWZkcHJpbnRmKDIsICIlczogbGlzdDolcCBuOiVkIHN0cmluZ19zdGFydDolZCBsZW5ndGg6JWQgbWF4bGVuOiVkIGdsb2I6JWQgcXVvdGVkOiVkIGVzY2FwZTolZFxuIiwKKwkJCXByZWZpeCwgbGlzdCwgbiwgc3RyaW5nX3N0YXJ0LCBvLT5sZW5ndGgsIG8tPm1heGxlbiwKKwkJCSEhKG8tPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19HTE9CKSwKKwkJCW8tPmhhc19xdW90ZWRfcGFydCwKKwkJCSEhKG8tPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUykpOworCXdoaWxlIChpIDwgbikgeworCQlpbmRlbnQoKTsKKwkJZmRwcmludGYoMiwgIiBsaXN0WyVkXT0lZCAnJXMnICVwXG4iLCBpLCAoaW50KSh1aW50cHRyX3QpbGlzdFtpXSwKKwkJCQlvLT5kYXRhICsgKGludCkodWludHB0cl90KWxpc3RbaV0gKyBzdHJpbmdfc3RhcnQsCisJCQkJby0+ZGF0YSArIChpbnQpKHVpbnRwdHJfdClsaXN0W2ldICsgc3RyaW5nX3N0YXJ0KTsKKwkJaSsrOworCX0KKwlpZiAobikgeworCQljb25zdCBjaGFyICpwID0gby0+ZGF0YSArIChpbnQpKHVpbnRwdHJfdClsaXN0W24gLSAxXSArIHN0cmluZ19zdGFydDsKKwkJaW5kZW50KCk7CisJCWZkcHJpbnRmKDIsICIgdG90YWxfc3o6JWxkXG4iLCAobG9uZykoKHAgKyBzdHJsZW4ocCkgKyAxKSAtIG8tPmRhdGEpKTsKKwl9Cit9CisjZWxzZQorIyBkZWZpbmUgZGVidWdfcHJpbnRfbGlzdChwcmVmaXgsIG8sIG4pICgodm9pZCkwKQorI2VuZGlmCisKKy8qIG4gPSBvX3NhdmVfcHRyX2hlbHBlcihzdHIsIG4pICJzdGFydHMgbmV3IHN0cmluZyIgYnkgc3RvcmluZyBhbiBpbmRleCB2YWx1ZQorICogaW4gbGlzdFtuXSBzbyB0aGF0IGl0IHBvaW50cyBwYXN0IGxhc3Qgc3RvcmVkIGJ5dGUgc28gZmFyLgorICogSXQgcmV0dXJucyBuKzEuICovCitzdGF0aWMgaW50IG9fc2F2ZV9wdHJfaGVscGVyKG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwljaGFyICoqbGlzdCA9IChjaGFyKiopby0+ZGF0YTsKKwlpbnQgc3RyaW5nX3N0YXJ0OworCWludCBzdHJpbmdfbGVuOworCisJaWYgKCFvLT5oYXNfZW1wdHlfc2xvdCkgeworCQlzdHJpbmdfc3RhcnQgPSAoKG4gKyAweGYpICYgfjB4ZikgKiBzaXplb2YobGlzdFswXSk7CisJCXN0cmluZ19sZW4gPSBvLT5sZW5ndGggLSBzdHJpbmdfc3RhcnQ7CisJCWlmICghKG4gJiAweGYpKSB7IC8qIDAsIDB4MTAsIDB4MjAuLi4/ICovCisJCQlkZWJ1Z19wcmludGZfbGlzdCgibGlzdFslZF09JWQgc3RyaW5nX3N0YXJ0PSVkIChncm93aW5nKVxuIiwgbiwgc3RyaW5nX2xlbiwgc3RyaW5nX3N0YXJ0KTsKKwkJCS8qIGxpc3Rbbl0gcG9pbnRzIHRvIHN0cmluZ19zdGFydCwgbWFrZSBzcGFjZSBmb3IgMTYgbW9yZSBwb2ludGVycyAqLworCQkJby0+bWF4bGVuICs9IDB4MTAgKiBzaXplb2YobGlzdFswXSk7CisJCQlvLT5kYXRhID0geHJlYWxsb2Moby0+ZGF0YSwgby0+bWF4bGVuICsgMSk7CisJCQlsaXN0ID0gKGNoYXIqKilvLT5kYXRhOworCQkJbWVtbW92ZShsaXN0ICsgbiArIDB4MTAsIGxpc3QgKyBuLCBzdHJpbmdfbGVuKTsKKwkJCW8tPmxlbmd0aCArPSAweDEwICogc2l6ZW9mKGxpc3RbMF0pOworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2xpc3QoImxpc3RbJWRdPSVkIHN0cmluZ19zdGFydD0lZFxuIiwKKwkJCQkJbiwgc3RyaW5nX2xlbiwgc3RyaW5nX3N0YXJ0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFdlIGhhdmUgZW1wdHkgc2xvdCBhdCBsaXN0W25dLCByZXVzZSB3aXRob3V0IGdyb3d0aCAqLworCQlzdHJpbmdfc3RhcnQgPSAoKG4rMSArIDB4ZikgJiB+MHhmKSAqIHNpemVvZihsaXN0WzBdKTsgLyogTkI6IG4rMSEgKi8KKwkJc3RyaW5nX2xlbiA9IG8tPmxlbmd0aCAtIHN0cmluZ19zdGFydDsKKwkJZGVidWdfcHJpbnRmX2xpc3QoImxpc3RbJWRdPSVkIHN0cmluZ19zdGFydD0lZCAoZW1wdHkgc2xvdClcbiIsCisJCQkJbiwgc3RyaW5nX2xlbiwgc3RyaW5nX3N0YXJ0KTsKKwkJby0+aGFzX2VtcHR5X3Nsb3QgPSAwOworCX0KKwlvLT5oYXNfcXVvdGVkX3BhcnQgPSAwOworCWxpc3Rbbl0gPSAoY2hhciopKHVpbnRwdHJfdClzdHJpbmdfbGVuOworCXJldHVybiBuICsgMTsKK30KKworLyogIldoYXQgd2FzIG91ciBsYXN0IG9fc2F2ZV9wdHInZWQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0IHJlbGF0aXZlIG8tPmRhdGEpPyIgKi8KK3N0YXRpYyBpbnQgb19nZXRfbGFzdF9wdHIob19zdHJpbmcgKm8sIGludCBuKQoreworCWNoYXIgKipsaXN0ID0gKGNoYXIqKilvLT5kYXRhOworCWludCBzdHJpbmdfc3RhcnQgPSAoKG4gKyAweGYpICYgfjB4ZikgKiBzaXplb2YobGlzdFswXSk7CisKKwlyZXR1cm4gKChpbnQpKHVpbnRwdHJfdClsaXN0W24tMV0pICsgc3RyaW5nX3N0YXJ0OworfQorCisjaWYgRU5BQkxFX0hVU0hfQlJBQ0VfRVhQQU5TSU9OCisvKiBUaGVyZSBpbiBhIEdOVSBleHRlbnNpb24sIEdMT0JfQlJBQ0UsIGJ1dCBpdCBpcyBub3QgdXNhYmxlOgorICogZmlyc3QsIGl0IHByb2Nlc3NlcyBldmVuIHthfSAobm8gY29tbWFzKSwgc2Vjb25kLAorICogSSBkaWRuJ3QgbWFuYWdlIHRvIG1ha2UgaXQgcmV0dXJuIHN0cmluZ3Mgd2hlbiB0aGV5IGRvbid0IG1hdGNoCisgKiBleGlzdGluZyBmaWxlcy4gTmVlZCB0byByZS1pbXBsZW1lbnQgaXQuCisgKi8KKworLyogSGVscGVyICovCitzdGF0aWMgaW50IGdsb2JfbmVlZGVkKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCWlmICgqcyA9PSAnXFwnKSB7CisJCQlpZiAoIXNbMV0pCisJCQkJcmV0dXJuIDA7CisJCQlzICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnMgPT0gJyonIHx8ICpzID09ICdbJyB8fCAqcyA9PSAnPycgfHwgKnMgPT0gJ3snKQorCQkJcmV0dXJuIDE7CisJCXMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisvKiBSZXR1cm4gcG9pbnRlciB0byBuZXh0IGNsb3NpbmcgYnJhY2Ugb3IgdG8gY29tbWEgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpuZXh0X2JyYWNlX3N1Yihjb25zdCBjaGFyICpjcCkKK3sKKwl1bnNpZ25lZCBkZXB0aCA9IDA7CisJY3ArKzsKKwl3aGlsZSAoKmNwICE9ICdcMCcpIHsKKwkJaWYgKCpjcCA9PSAnXFwnKSB7CisJCQlpZiAoKisrY3AgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCWNwKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKCpjcCA9PSAnfScgJiYgZGVwdGgtLSA9PSAwKSB8fCAoKmNwID09ICcsJyAmJiBkZXB0aCA9PSAwKSkKKwkJCWJyZWFrOworCQlpZiAoKmNwKysgPT0gJ3snKQorCQkJZGVwdGgrKzsKKwl9CisKKwlyZXR1cm4gKmNwICE9ICdcMCcgPyBjcCA6IE5VTEw7Cit9CisvKiBSZWN1cnNpdmUgYnJhY2UgZ2xvYmJlci4gTm90ZTogbWF5IGdhcmJsZSBwYXR0ZXJuW10uICovCitzdGF0aWMgaW50IGdsb2JfYnJhY2UoY2hhciAqcGF0dGVybiwgb19zdHJpbmcgKm8sIGludCBuKQoreworCWNoYXIgKm5ld19wYXR0ZXJuX2J1ZjsKKwljb25zdCBjaGFyICpiZWdpbjsKKwljb25zdCBjaGFyICpuZXh0OworCWNvbnN0IGNoYXIgKnJlc3Q7CisJY29uc3QgY2hhciAqcDsKKwlzaXplX3QgcmVzdF9sZW47CisKKwlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYl9icmFjZSgnJXMnKVxuIiwgcGF0dGVybik7CisKKwliZWdpbiA9IHBhdHRlcm47CisJd2hpbGUgKDEpIHsKKwkJaWYgKCpiZWdpbiA9PSAnXDAnKQorCQkJZ290byBzaW1wbGVfZ2xvYjsKKwkJaWYgKCpiZWdpbiA9PSAneycpIHsKKwkJCS8qIEZpbmQgdGhlIGZpcnN0IHN1Yi1wYXR0ZXJuIGFuZCBhdCB0aGUgc2FtZSB0aW1lCisJCQkgKiBmaW5kIHRoZSByZXN0IGFmdGVyIHRoZSBjbG9zaW5nIGJyYWNlICovCisJCQluZXh0ID0gbmV4dF9icmFjZV9zdWIoYmVnaW4pOworCQkJaWYgKG5leHQgPT0gTlVMTCkgeworCQkJCS8qIEFuIGlsbGVnYWwgZXhwcmVzc2lvbiAqLworCQkJCWdvdG8gc2ltcGxlX2dsb2I7CisJCQl9CisJCQlpZiAoKm5leHQgPT0gJ30nKSB7CisJCQkJLyogInthYmN9IiB3aXRoIG5vIGNvbW1hcyAtIGlsbGVnYWwKKwkJCQkgKiBicmFjZSBleHByLCBkaXNyZWdhcmQgYW5kIHNraXAgaXQgKi8KKwkJCQliZWdpbiA9IG5leHQgKyAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCpiZWdpbiA9PSAnXFwnICYmIGJlZ2luWzFdICE9ICdcMCcpCisJCQliZWdpbisrOworCQliZWdpbisrOworCX0KKwlkZWJ1Z19wcmludGZfZ2xvYigiYmVnaW46JXNcbiIsIGJlZ2luKTsKKwlkZWJ1Z19wcmludGZfZ2xvYigibmV4dDolc1xuIiwgbmV4dCk7CisKKwkvKiBOb3cgZmluZCB0aGUgZW5kIG9mIHRoZSB3aG9sZSBicmFjZSBleHByZXNzaW9uICovCisJcmVzdCA9IG5leHQ7CisJd2hpbGUgKCpyZXN0ICE9ICd9JykgeworCQlyZXN0ID0gbmV4dF9icmFjZV9zdWIocmVzdCk7CisJCWlmIChyZXN0ID09IE5VTEwpIHsKKwkJCS8qIEFuIGlsbGVnYWwgZXhwcmVzc2lvbiAqLworCQkJZ290byBzaW1wbGVfZ2xvYjsKKwkJfQorCQlkZWJ1Z19wcmludGZfZ2xvYigicmVzdDolc1xuIiwgcmVzdCk7CisJfQorCXJlc3RfbGVuID0gc3RybGVuKCsrcmVzdCkgKyAxOworCisJLyogV2UgYXJlIHN1cmUgdGhlIGJyYWNlIGV4cHJlc3Npb24gaXMgd2VsbC1mb3JtZWQgKi8KKworCS8qIEFsbG9jYXRlIHdvcmtpbmcgYnVmZmVyIGxhcmdlIGVub3VnaCBmb3Igb3VyIHdvcmsgKi8KKwluZXdfcGF0dGVybl9idWYgPSB4bWFsbG9jKHN0cmxlbihwYXR0ZXJuKSk7CisKKwkvKiBXZSBoYXZlIGEgYnJhY2UgZXhwcmVzc2lvbi4gIEJFR0lOIHBvaW50cyB0byB0aGUgb3BlbmluZyB7LAorCSAqIE5FWFQgcG9pbnRzIHBhc3QgdGhlIHRlcm1pbmF0b3Igb2YgdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCBSRVNUCisJICogcG9pbnRzIHBhc3QgdGhlIGZpbmFsIH0uICBXZSB3aWxsIGFjY3VtdWxhdGUgcmVzdWx0IG5hbWVzIGZyb20KKwkgKiByZWN1cnNpdmUgcnVucyBmb3IgZWFjaCBicmFjZSBhbHRlcm5hdGl2ZSBpbiB0aGUgYnVmZmVyIHVzaW5nCisJICogR0xPQl9BUFBFTkQuICAqLworCisJcCA9IGJlZ2luICsgMTsKKwl3aGlsZSAoMSkgeworCQkvKiBDb25zdHJ1Y3QgdGhlIG5ldyBnbG9iIGV4cHJlc3Npb24gKi8KKwkJbWVtY3B5KAorCQkJbWVtcGNweSgKKwkJCQltZW1wY3B5KG5ld19wYXR0ZXJuX2J1ZiwKKwkJCQkJLyogV2Uga25vdyB0aGUgcHJlZml4IGZvciBhbGwgc3ViLXBhdHRlcm5zICovCisJCQkJCXBhdHRlcm4sIGJlZ2luIC0gcGF0dGVybiksCisJCQkJcCwgbmV4dCAtIHApLAorCQkJcmVzdCwgcmVzdF9sZW4pOworCisJCS8qIE5vdGU6IGdsb2JfYnJhY2UoKSBtYXkgZ2FyYmxlIG5ld19wYXR0ZXJuX2J1ZltdLgorCQkgKiBUaGF0J3Mgd2h5IHdlIHJlLWNvcHkgcHJlZml4IGV2ZXJ5IHRpbWUgKDFzdCBtZW1jcHkgYWJvdmUpLgorCQkgKi8KKwkJbiA9IGdsb2JfYnJhY2UobmV3X3BhdHRlcm5fYnVmLCBvLCBuKTsKKwkJaWYgKCpuZXh0ID09ICd9JykgeworCQkJLyogV2Ugc2F3IHRoZSBsYXN0IGVudHJ5ICovCisJCQlicmVhazsKKwkJfQorCQlwID0gbmV4dCArIDE7CisJCW5leHQgPSBuZXh0X2JyYWNlX3N1YihuZXh0KTsKKwl9CisJZnJlZShuZXdfcGF0dGVybl9idWYpOworCXJldHVybiBuOworCisgc2ltcGxlX2dsb2I6CisJeworCQlpbnQgZ3I7CisJCWdsb2JfdCBnbG9iZGF0YTsKKworCQltZW1zZXQoJmdsb2JkYXRhLCAwLCBzaXplb2YoZ2xvYmRhdGEpKTsKKwkJZ3IgPSBnbG9iKHBhdHRlcm4sIDAsIE5VTEwsICZnbG9iZGF0YSk7CisJCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iKCclcycpOiVkXG4iLCBwYXR0ZXJuLCBncik7CisJCWlmIChnciAhPSAwKSB7CisJCQlpZiAoZ3IgPT0gR0xPQl9OT01BVENIKSB7CisJCQkJZ2xvYmZyZWUoJmdsb2JkYXRhKTsKKwkJCQkvKiBOQjogZ2FyYmxlcyBwYXJhbWV0ZXIgKi8KKwkJCQl1bmJhY2tzbGFzaChwYXR0ZXJuKTsKKwkJCQlvX2FkZHN0cl93aXRoX05VTChvLCBwYXR0ZXJuKTsKKwkJCQlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYiBwYXR0ZXJuICclcycgaXMgbGl0ZXJhbFxuIiwgcGF0dGVybik7CisJCQkJcmV0dXJuIG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCQkJfQorCQkJaWYgKGdyID09IEdMT0JfTk9TUEFDRSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJCQkvKiBHTE9CX0FCT1JURUQ/IE9ubHkgaGFwcGVucyB3aXRoIEdMT0JfRVJSIGZsYWcsCisJCQkgKiBidXQgd2UgZGlkbid0IHNwZWNpZnkgaXQuIFBhcmFub2lhIGFnYWluLiAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImdsb2IgZXJyb3IgJWQgb24gJyVzJyIsIGdyLCBwYXR0ZXJuKTsKKwkJfQorCQlpZiAoZ2xvYmRhdGEuZ2xfcGF0aHYgJiYgZ2xvYmRhdGEuZ2xfcGF0aHZbMF0pIHsKKwkJCWNoYXIgKiphcmd2ID0gZ2xvYmRhdGEuZ2xfcGF0aHY7CisJCQl3aGlsZSAoMSkgeworCQkJCW9fYWRkc3RyX3dpdGhfTlVMKG8sICphcmd2KTsKKwkJCQluID0gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJCQkJYXJndisrOworCQkJCWlmICghKmFyZ3YpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWdsb2JmcmVlKCZnbG9iZGF0YSk7CisJfQorCXJldHVybiBuOworfQorLyogUGVyZm9ybXMgZ2xvYmJpbmcgb24gbGFzdCBsaXN0W10sCisgKiBzYXZpbmcgZWFjaCByZXN1bHQgYXMgYSBuZXcgbGlzdFtdLgorICovCitzdGF0aWMgaW50IHBlcmZvcm1fZ2xvYihvX3N0cmluZyAqbywgaW50IG4pCit7CisJY2hhciAqcGF0dGVybiwgKmNvcHk7CisKKwlkZWJ1Z19wcmludGZfZ2xvYigic3RhcnQgcGVyZm9ybV9nbG9iOiBuOiVkIG8tPmRhdGE6JXBcbiIsIG4sIG8tPmRhdGEpOworCWlmICghby0+ZGF0YSkKKwkJcmV0dXJuIG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCXBhdHRlcm4gPSBvLT5kYXRhICsgb19nZXRfbGFzdF9wdHIobywgbik7CisJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IgcGF0dGVybiAnJXMnXG4iLCBwYXR0ZXJuKTsKKwlpZiAoIWdsb2JfbmVlZGVkKHBhdHRlcm4pKSB7CisJCS8qIHVuYmFja3NsYXNoIGxhc3Qgc3RyaW5nIGluIG8gaW4gcGxhY2UsIGZpeCBsZW5ndGggKi8KKwkJby0+bGVuZ3RoID0gdW5iYWNrc2xhc2gocGF0dGVybikgLSBvLT5kYXRhOworCQlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYiBwYXR0ZXJuICclcycgaXMgbGl0ZXJhbFxuIiwgcGF0dGVybik7CisJCXJldHVybiBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwl9CisKKwljb3B5ID0geHN0cmR1cChwYXR0ZXJuKTsKKwkvKiAiZm9yZ2V0IiBwYXR0ZXJuIGluIG8gKi8KKwlvLT5sZW5ndGggPSBwYXR0ZXJuIC0gby0+ZGF0YTsKKwluID0gZ2xvYl9icmFjZShjb3B5LCBvLCBuKTsKKwlmcmVlKGNvcHkpOworCWlmIChERUJVR19HTE9CKQorCQlkZWJ1Z19wcmludF9saXN0KCJwZXJmb3JtX2dsb2IgcmV0dXJuaW5nIiwgbywgbik7CisJcmV0dXJuIG47Cit9CisKKyNlbHNlIC8qICFIVVNIX0JSQUNFX0VYUEFOU0lPTiAqLworCisvKiBIZWxwZXIgKi8KK3N0YXRpYyBpbnQgZ2xvYl9uZWVkZWQoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKCpzID09ICdcXCcpIHsKKwkJCWlmICghc1sxXSkKKwkJCQlyZXR1cm4gMDsKKwkJCXMgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcyA9PSAnKicgfHwgKnMgPT0gJ1snIHx8ICpzID09ICc/JykKKwkJCXJldHVybiAxOworCQlzKys7CisJfQorCXJldHVybiAwOworfQorLyogUGVyZm9ybXMgZ2xvYmJpbmcgb24gbGFzdCBsaXN0W10sCisgKiBzYXZpbmcgZWFjaCByZXN1bHQgYXMgYSBuZXcgbGlzdFtdLgorICovCitzdGF0aWMgaW50IHBlcmZvcm1fZ2xvYihvX3N0cmluZyAqbywgaW50IG4pCit7CisJZ2xvYl90IGdsb2JkYXRhOworCWludCBncjsKKwljaGFyICpwYXR0ZXJuOworCisJZGVidWdfcHJpbnRmX2dsb2IoInN0YXJ0IHBlcmZvcm1fZ2xvYjogbjolZCBvLT5kYXRhOiVwXG4iLCBuLCBvLT5kYXRhKTsKKwlpZiAoIW8tPmRhdGEpCisJCXJldHVybiBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwlwYXR0ZXJuID0gby0+ZGF0YSArIG9fZ2V0X2xhc3RfcHRyKG8sIG4pOworCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iIHBhdHRlcm4gJyVzJ1xuIiwgcGF0dGVybik7CisJaWYgKCFnbG9iX25lZWRlZChwYXR0ZXJuKSkgeworIGxpdGVyYWw6CisJCS8qIHVuYmFja3NsYXNoIGxhc3Qgc3RyaW5nIGluIG8gaW4gcGxhY2UsIGZpeCBsZW5ndGggKi8KKwkJby0+bGVuZ3RoID0gdW5iYWNrc2xhc2gocGF0dGVybikgLSBvLT5kYXRhOworCQlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYiBwYXR0ZXJuICclcycgaXMgbGl0ZXJhbFxuIiwgcGF0dGVybik7CisJCXJldHVybiBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwl9CisKKwltZW1zZXQoJmdsb2JkYXRhLCAwLCBzaXplb2YoZ2xvYmRhdGEpKTsKKwkvKiBDYW4ndCB1c2UgR0xPQl9OT0NIRUNLOiBpdCBkb2VzIG5vdCB1bmVzY2FwZSB0aGUgc3RyaW5nLgorCSAqIElmIHdlIGdsb2IgIiouXCoiIGFuZCBkb24ndCBmaW5kIGFueXRoaW5nLCB3ZSBuZWVkCisJICogdG8gZmFsbCBiYWNrIHRvIHVzaW5nIGxpdGVyYWwgIiouKiIsIGJ1dCBHTE9CX05PQ0hFQ0sKKwkgKiB3aWxsIHJldHVybiAiKi5cKiIhCisJICovCisJZ3IgPSBnbG9iKHBhdHRlcm4sIDAsIE5VTEwsICZnbG9iZGF0YSk7CisJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IoJyVzJyk6JWRcbiIsIHBhdHRlcm4sIGdyKTsKKwlpZiAoZ3IgIT0gMCkgeworCQlpZiAoZ3IgPT0gR0xPQl9OT01BVENIKSB7CisJCQlnbG9iZnJlZSgmZ2xvYmRhdGEpOworCQkJZ290byBsaXRlcmFsOworCQl9CisJCWlmIChnciA9PSBHTE9CX05PU1BBQ0UpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJCS8qIEdMT0JfQUJPUlRFRD8gT25seSBoYXBwZW5zIHdpdGggR0xPQl9FUlIgZmxhZywKKwkJICogYnV0IHdlIGRpZG4ndCBzcGVjaWZ5IGl0LiBQYXJhbm9pYSBhZ2Fpbi4gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImdsb2IgZXJyb3IgJWQgb24gJyVzJyIsIGdyLCBwYXR0ZXJuKTsKKwl9CisJaWYgKGdsb2JkYXRhLmdsX3BhdGh2ICYmIGdsb2JkYXRhLmdsX3BhdGh2WzBdKSB7CisJCWNoYXIgKiphcmd2ID0gZ2xvYmRhdGEuZ2xfcGF0aHY7CisJCS8qICJmb3JnZXQiIHBhdHRlcm4gaW4gbyAqLworCQlvLT5sZW5ndGggPSBwYXR0ZXJuIC0gby0+ZGF0YTsKKwkJd2hpbGUgKDEpIHsKKwkJCW9fYWRkc3RyX3dpdGhfTlVMKG8sICphcmd2KTsKKwkJCW4gPSBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwkJCWFyZ3YrKzsKKwkJCWlmICghKmFyZ3YpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJZ2xvYmZyZWUoJmdsb2JkYXRhKTsKKwlpZiAoREVCVUdfR0xPQikKKwkJZGVidWdfcHJpbnRfbGlzdCgicGVyZm9ybV9nbG9iIHJldHVybmluZyIsIG8sIG4pOworCXJldHVybiBuOworfQorCisjZW5kaWYgLyogIUhVU0hfQlJBQ0VfRVhQQU5TSU9OICovCisKKy8qIElmIG8tPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19HTE9CLCBnbG9iIHRoZSBzdHJpbmcgc28gZmFyIHJlbWVtYmVyZWQuCisgKiBPdGhlcndpc2UsIGp1c3QgZmluaXNoIGN1cnJlbnQgbGlzdFtdIGFuZCBzdGFydCBuZXcgKi8KK3N0YXRpYyBpbnQgb19zYXZlX3B0cihvX3N0cmluZyAqbywgaW50IG4pCit7CisJaWYgKG8tPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19HTE9CKSB7CisJCS8qIElmIG8tPmhhc19lbXB0eV9zbG90LCBsaXN0W25dIHdhcyBhbHJlYWR5IGdsb2JiZWQKKwkJICogKGlmIGl0IHdhcyByZXF1ZXN0ZWQgYmFjayB0aGVuIHdoZW4gaXQgd2FzIGZpbGxlZCkKKwkJICogc28gZG9uJ3QgZG8gdGhhdCBhZ2FpbiEgKi8KKwkJaWYgKCFvLT5oYXNfZW1wdHlfc2xvdCkKKwkJCXJldHVybiBwZXJmb3JtX2dsb2Iobywgbik7IC8qIG9fc2F2ZV9wdHJfaGVscGVyIGlzIGluc2lkZSAqLworCX0KKwlyZXR1cm4gb19zYXZlX3B0cl9oZWxwZXIobywgbik7Cit9CisKKy8qICJQbGVhc2UgY29udmVydCBsaXN0W25dIHRvIHJlYWwgY2hhciogcHRycywgYW5kIE5VTEwgdGVybWluYXRlIGl0LiIgKi8KK3N0YXRpYyBjaGFyICoqb19maW5hbGl6ZV9saXN0KG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwljaGFyICoqbGlzdDsKKwlpbnQgc3RyaW5nX3N0YXJ0OworCisJbiA9IG9fc2F2ZV9wdHIobywgbik7IC8qIGZvcmNlIGdyb3d0aCBmb3IgbGlzdFtuXSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoREVCVUdfRVhQQU5EKQorCQlkZWJ1Z19wcmludF9saXN0KCJmaW5hbGl6ZWQiLCBvLCBuKTsKKwlkZWJ1Z19wcmludGZfZXhwYW5kKCJmaW5hbGl6ZWQgbjolZFxuIiwgbik7CisJbGlzdCA9IChjaGFyKiopby0+ZGF0YTsKKwlzdHJpbmdfc3RhcnQgPSAoKG4gKyAweGYpICYgfjB4ZikgKiBzaXplb2YobGlzdFswXSk7CisJbGlzdFstLW5dID0gTlVMTDsKKwl3aGlsZSAobikgeworCQluLS07CisJCWxpc3Rbbl0gPSBvLT5kYXRhICsgKGludCkodWludHB0cl90KWxpc3Rbbl0gKyBzdHJpbmdfc3RhcnQ7CisJfQorCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BpcGVfbGlzdChzdHJ1Y3QgcGlwZSAqcGkpOworCisvKiBSZXR1cm5zIHBpLT5uZXh0IC0gbmV4dCBwaXBlIGluIHRoZSBsaXN0ICovCitzdGF0aWMgc3RydWN0IHBpcGUgKmZyZWVfcGlwZShzdHJ1Y3QgcGlwZSAqcGkpCit7CisJc3RydWN0IHBpcGUgKm5leHQ7CisJaW50IGk7CisKKwlkZWJ1Z19wcmludGZfY2xlYW4oImZyZWVfcGlwZSAocGlkICVkKVxuIiwgZ2V0cGlkKCkpOworCWZvciAoaSA9IDA7IGkgPCBwaS0+bnVtX2NtZHM7IGkrKykgeworCQlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZDsKKwkJc3RydWN0IHJlZGlyX3N0cnVjdCAqciwgKnJuZXh0OworCisJCWNvbW1hbmQgPSAmcGktPmNtZHNbaV07CisJCWRlYnVnX3ByaW50Zl9jbGVhbigiICBjb21tYW5kICVkOlxuIiwgaSk7CisJCWlmIChjb21tYW5kLT5hcmd2KSB7CisJCQlpZiAoREVCVUdfQ0xFQU4pIHsKKwkJCQlpbnQgYTsKKwkJCQljaGFyICoqcDsKKwkJCQlmb3IgKGEgPSAwLCBwID0gY29tbWFuZC0+YXJndjsgKnA7IGErKywgcCsrKSB7CisJCQkJCWRlYnVnX3ByaW50Zl9jbGVhbigiICAgYXJndlslZF0gPSAlc1xuIiwgYSwgKnApOworCQkJCX0KKwkJCX0KKwkJCWZyZWVfc3RyaW5ncyhjb21tYW5kLT5hcmd2KTsKKwkJCS8vY29tbWFuZC0+YXJndiA9IE5VTEw7CisJCX0KKwkJLyogbm90ICJlbHNlIGlmIjogb24gc3ludGF4IGVycm9yLCB3ZSBtYXkgaGF2ZSBib3RoISAqLworCQlpZiAoY29tbWFuZC0+Z3JvdXApIHsKKwkJCWRlYnVnX3ByaW50Zl9jbGVhbigiICAgYmVnaW4gZ3JvdXAgKGNtZF90eXBlOiVkKVxuIiwKKwkJCQkJY29tbWFuZC0+Y21kX3R5cGUpOworCQkJZnJlZV9waXBlX2xpc3QoY29tbWFuZC0+Z3JvdXApOworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCIgICBlbmQgZ3JvdXBcbiIpOworCQkJLy9jb21tYW5kLT5ncm91cCA9IE5VTEw7CisJCX0KKwkJLyogZWxzZSBpcyBjcnVjaWFsIGhlcmUuCisJCSAqIElmIGdyb3VwICE9IE5VTEwsIGNoaWxkX2Z1bmMgaXMgbWVhbmluZ2xlc3MgKi8KKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJZWxzZSBpZiAoY29tbWFuZC0+Y2hpbGRfZnVuYykgeworCQkJZGVidWdfcHJpbnRmX2V4ZWMoImNtZCAlcCByZWxlYXNlcyBjaGlsZCBmdW5jIGF0ICVwXG4iLCBjb21tYW5kLCBjb21tYW5kLT5jaGlsZF9mdW5jKTsKKwkJCWNvbW1hbmQtPmNoaWxkX2Z1bmMtPnBhcmVudF9jbWQgPSBOVUxMOworCQl9CisjZW5kaWYKKyNpZiAhQkJfTU1VCisJCWZyZWUoY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nKTsKKwkJLy9jb21tYW5kLT5ncm91cF9hc19zdHJpbmcgPSBOVUxMOworI2VuZGlmCisJCWZvciAociA9IGNvbW1hbmQtPnJlZGlyZWN0czsgcjsgciA9IHJuZXh0KSB7CisJCQlkZWJ1Z19wcmludGZfY2xlYW4oIiAgIHJlZGlyZWN0ICVkJXMiLAorCQkJCQlyLT5yZF9mZCwgcmVkaXJfdGFibGVbci0+cmRfdHlwZV0uZGVzY3JpcCk7CisJCQkvKiBndWFyZCBhZ2FpbnN0IHRoZSBjYXNlID4kRk9PLCB3aGVyZSBmb28gaXMgdW5zZXQgb3IgYmxhbmsgKi8KKwkJCWlmIChyLT5yZF9maWxlbmFtZSkgeworCQkJCWRlYnVnX3ByaW50Zl9jbGVhbigiIGZuYW1lOiclcydcbiIsIHItPnJkX2ZpbGVuYW1lKTsKKwkJCQlmcmVlKHItPnJkX2ZpbGVuYW1lKTsKKwkJCQkvL3ItPnJkX2ZpbGVuYW1lID0gTlVMTDsKKwkJCX0KKwkJCWRlYnVnX3ByaW50Zl9jbGVhbigiIHJkX2R1cDolZFxuIiwgci0+cmRfZHVwKTsKKwkJCXJuZXh0ID0gci0+bmV4dDsKKwkJCWZyZWUocik7CisJCX0KKwkJLy9jb21tYW5kLT5yZWRpcmVjdHMgPSBOVUxMOworCX0KKwlmcmVlKHBpLT5jbWRzKTsgICAvKiBjaGlsZHJlbiBhcmUgYW4gYXJyYXksIHRoZXkgZ2V0IGZyZWVkIGFsbCBhdCBvbmNlICovCisJLy9waS0+Y21kcyA9IE5VTEw7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJZnJlZShwaS0+Y21kdGV4dCk7CisJLy9waS0+Y21kdGV4dCA9IE5VTEw7CisjZW5kaWYKKworCW5leHQgPSBwaS0+bmV4dDsKKwlmcmVlKHBpKTsKKwlyZXR1cm4gbmV4dDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9waXBlX2xpc3Qoc3RydWN0IHBpcGUgKnBpKQoreworCXdoaWxlIChwaSkgeworI2lmIEhBU19LRVlXT1JEUworCQlkZWJ1Z19wcmludGZfY2xlYW4oInBpcGUgcmVzZXJ2ZWQgd29yZCAlZFxuIiwgcGktPnJlc193b3JkKTsKKyNlbmRpZgorCQlkZWJ1Z19wcmludGZfY2xlYW4oInBpcGUgZm9sbG93dXAgY29kZSAlZFxuIiwgcGktPmZvbGxvd3VwKTsKKwkJcGkgPSBmcmVlX3BpcGUocGkpOworCX0KK30KKworCisvKioqIFBhcnNpbmcgcm91dGluZXMgKioqLworCisjaWZuZGVmIGRlYnVnX3ByaW50X3RyZWUKK3N0YXRpYyB2b2lkIGRlYnVnX3ByaW50X3RyZWUoc3RydWN0IHBpcGUgKnBpLCBpbnQgbHZsKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBQSVBFW10gPSB7CisJCVtQSVBFX1NFUV0gPSAiU0VRIiwKKwkJW1BJUEVfQU5EXSA9ICJBTkQiLAorCQlbUElQRV9PUiBdID0gIk9SIiAsCisJCVtQSVBFX0JHIF0gPSAiQkciICwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICpSRVNbXSA9IHsKKwkJW1JFU19OT05FIF0gPSAiTk9ORSIgLAorIyBpZiBFTkFCTEVfSFVTSF9JRgorCQlbUkVTX0lGICAgXSA9ICJJRiIgICAsCisJCVtSRVNfVEhFTiBdID0gIlRIRU4iICwKKwkJW1JFU19FTElGIF0gPSAiRUxJRiIgLAorCQlbUkVTX0VMU0UgXSA9ICJFTFNFIiAsCisJCVtSRVNfRkkgICBdID0gIkZJIiAgICwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJW1JFU19GT1IgIF0gPSAiRk9SIiAgLAorCQlbUkVTX1dISUxFXSA9ICJXSElMRSIsCisJCVtSRVNfVU5USUxdID0gIlVOVElMIiwKKwkJW1JFU19ETyAgIF0gPSAiRE8iICAgLAorCQlbUkVTX0RPTkUgXSA9ICJET05FIiAsCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0xPT1BTIHx8IEVOQUJMRV9IVVNIX0NBU0UKKwkJW1JFU19JTiAgIF0gPSAiSU4iICAgLAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJCVtSRVNfQ0FTRSBdID0gIkNBU0UiICwKKwkJW1JFU19DQVNFX0lOIF0gPSAiQ0FTRV9JTiIgLAorCQlbUkVTX01BVENIXSA9ICJNQVRDSCIsCisJCVtSRVNfQ0FTRV9CT0RZXSA9ICJDQVNFX0JPRFkiLAorCQlbUkVTX0VTQUMgXSA9ICJFU0FDIiAsCisjIGVuZGlmCisJCVtSRVNfWFhYWCBdID0gIlhYWFgiICwKKwkJW1JFU19TTlRYIF0gPSAiU05UWCIgLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IENNRFRZUEVbXSA9IHsKKwkJInt9IiwKKwkJIigpIiwKKwkJIltub2dsb2JdIiwKKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCSJmdW5jKCkiLAorIyBlbmRpZgorCX07CisKKwlpbnQgcGluLCBwcm47CisKKwlwaW4gPSAwOworCXdoaWxlIChwaSkgeworCQlmZHByaW50ZigyLCAiJSpzcGlwZSAlZCByZXNfd29yZD0lcyBmb2xsb3d1cD0lZCAlc1xuIiwgbHZsKjIsICIiLAorCQkJCXBpbiwgUkVTW3BpLT5yZXNfd29yZF0sIHBpLT5mb2xsb3d1cCwgUElQRVtwaS0+Zm9sbG93dXBdKTsKKwkJcHJuID0gMDsKKwkJd2hpbGUgKHBybiA8IHBpLT5udW1fY21kcykgeworCQkJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQgPSAmcGktPmNtZHNbcHJuXTsKKwkJCWNoYXIgKiphcmd2ID0gY29tbWFuZC0+YXJndjsKKworCQkJZmRwcmludGYoMiwgIiUqcyBjbWQgJWQgYXNzaWdubWVudF9jbnQ6JWQiLAorCQkJCQlsdmwqMiwgIiIsIHBybiwKKwkJCQkJY29tbWFuZC0+YXNzaWdubWVudF9jbnQpOworCQkJaWYgKGNvbW1hbmQtPmdyb3VwKSB7CisJCQkJZmRwcmludGYoMiwgIiBncm91cCAlczogKGFyZ3Y9JXApJXMlc1xuIiwKKwkJCQkJCUNNRFRZUEVbY29tbWFuZC0+Y21kX3R5cGVdLAorCQkJCQkJYXJndgorIyBpZiAhQkJfTU1VCisJCQkJCQksICIgZ3JvdXBfYXNfc3RyaW5nOiIsIGNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZworIyBlbHNlCisJCQkJCQksICIiLCAiIgorIyBlbmRpZgorCQkJCSk7CisJCQkJZGVidWdfcHJpbnRfdHJlZShjb21tYW5kLT5ncm91cCwgbHZsKzEpOworCQkJCXBybisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGFyZ3YpIHdoaWxlICgqYXJndikgeworCQkJCWZkcHJpbnRmKDIsICIgJyVzJyIsICphcmd2KTsKKwkJCQlhcmd2Kys7CisJCQl9CisJCQlmZHByaW50ZigyLCAiXG4iKTsKKwkJCXBybisrOworCQl9CisJCXBpID0gcGktPm5leHQ7CisJCXBpbisrOworCX0KK30KKyNlbmRpZiAvKiBkZWJ1Z19wcmludF90cmVlICovCisKK3N0YXRpYyBzdHJ1Y3QgcGlwZSAqbmV3X3BpcGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGlwZSAqcGk7CisJcGkgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgcGlwZSkpOworCS8qcGktPmZvbGxvd3VwID0gMDsgLSBkZWxpYmVyYXRlbHkgaW52YWxpZCB2YWx1ZSAqLworCS8qcGktPnJlc193b3JkID0gUkVTX05PTkU7IC0gUkVTX05PTkUgaXMgMCBhbnl3YXkgKi8KKwlyZXR1cm4gcGk7Cit9CisKKy8qIENvbW1hbmQgKG1lbWJlciBvZiBhIHBpcGUpIGlzIGNvbXBsZXRlLCBvciB3ZSBzdGFydCBhIG5ldyBwaXBlCisgKiBpZiBjdHgtPmNvbW1hbmQgaXMgTlVMTC4KKyAqIE5vIGVycm9ycyBwb3NzaWJsZSBoZXJlLgorICovCitzdGF0aWMgaW50IGRvbmVfY29tbWFuZChzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4KQoreworCS8qIFRoZSBjb21tYW5kIGlzIHJlYWxseSBhbHJlYWR5IGluIHRoZSBwaXBlIHN0cnVjdHVyZSwgc28KKwkgKiBhZHZhbmNlIHRoZSBwaXBlIGNvdW50ZXIgYW5kIG1ha2UgYSBuZXcsIG51bGwgY29tbWFuZC4gKi8KKwlzdHJ1Y3QgcGlwZSAqcGkgPSBjdHgtPnBpcGU7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQgPSBjdHgtPmNvbW1hbmQ7CisKKwlpZiAoY29tbWFuZCkgeworCQlpZiAoSVNfTlVMTF9DTUQoY29tbWFuZCkpIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV9jb21tYW5kOiBza2lwcGluZyBudWxsIGNtZCwgbnVtX2NtZHM9JWRcbiIsIHBpLT5udW1fY21kcyk7CisJCQlnb3RvIGNsZWFyX2FuZF9yZXQ7CisJCX0KKwkJcGktPm51bV9jbWRzKys7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV9jb21tYW5kOiArK251bV9jbWRzPSVkXG4iLCBwaS0+bnVtX2NtZHMpOworCQkvL2RlYnVnX3ByaW50X3RyZWUoY3R4LT5saXN0X2hlYWQsIDIwKTsKKwl9IGVsc2UgeworCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfY29tbWFuZDogaW5pdGlhbGl6aW5nLCBudW1fY21kcz0lZFxuIiwgcGktPm51bV9jbWRzKTsKKwl9CisKKwkvKiBPbmx5IHJlYWwgdHJpY2tpbmVzcyBoZXJlIGlzIHRoYXQgdGhlIHVuY29tbWl0dGVkCisJICogY29tbWFuZCBzdHJ1Y3R1cmUgaXMgbm90IGNvdW50ZWQgaW4gcGktPm51bV9jbWRzLiAqLworCXBpLT5jbWRzID0geHJlYWxsb2MocGktPmNtZHMsIHNpemVvZigqcGktPmNtZHMpICogKHBpLT5udW1fY21kcysxKSk7CisJY3R4LT5jb21tYW5kID0gY29tbWFuZCA9ICZwaS0+Y21kc1twaS0+bnVtX2NtZHNdOworIGNsZWFyX2FuZF9yZXQ6CisJbWVtc2V0KGNvbW1hbmQsIDAsIHNpemVvZigqY29tbWFuZCkpOworCXJldHVybiBwaS0+bnVtX2NtZHM7IC8qIHVzZWQgb25seSBmb3IgMC9ub256ZXJvIGNoZWNrICovCit9CisKK3N0YXRpYyB2b2lkIGRvbmVfcGlwZShzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4LCBwaXBlX3N0eWxlIHR5cGUpCit7CisJaW50IG5vdF9udWxsOworCisJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3BpcGUgZW50ZXJlZCwgZm9sbG93dXAgJWRcbiIsIHR5cGUpOworCS8qIENsb3NlIHByZXZpb3VzIGNvbW1hbmQgKi8KKwlub3RfbnVsbCA9IGRvbmVfY29tbWFuZChjdHgpOworCWN0eC0+cGlwZS0+Zm9sbG93dXAgPSB0eXBlOworI2lmIEhBU19LRVlXT1JEUworCWN0eC0+cGlwZS0+cGlfaW52ZXJ0ZWQgPSBjdHgtPmN0eF9pbnZlcnRlZDsKKwljdHgtPmN0eF9pbnZlcnRlZCA9IDA7CisJY3R4LT5waXBlLT5yZXNfd29yZCA9IGN0eC0+Y3R4X3Jlc193OworI2VuZGlmCisKKwkvKiBXaXRob3V0IHRoaXMgY2hlY2ssIGV2ZW4ganVzdCA8ZW50ZXI+IG9uIGNvbW1hbmQgbGluZSBnZW5lcmF0ZXMKKwkgKiB0cmVlIG9mIHRocmVlIE5PUHMgKCEpLiBXaGljaCBpcyBoYXJtbGVzcyBidXQgYW5ub3lpbmcuCisJICogSU9XOiBpdCBpcyBzYWZlIHRvIGRvIGl0IHVuY29uZGl0aW9uYWxseS4gKi8KKwlpZiAobm90X251bGwKKyNpZiBFTkFCTEVfSFVTSF9JRgorCSB8fCBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfRkkKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJIHx8IGN0eC0+Y3R4X3Jlc193ID09IFJFU19ET05FCisJIHx8IGN0eC0+Y3R4X3Jlc193ID09IFJFU19GT1IKKwkgfHwgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0lOCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJIHx8IGN0eC0+Y3R4X3Jlc193ID09IFJFU19FU0FDCisjZW5kaWYKKwkpIHsKKwkJc3RydWN0IHBpcGUgKm5ld19wOworCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfcGlwZTogYWRkaW5nIG5ldyBwaXBlOiAiCisJCQkJIm5vdF9udWxsOiVkIGN0eC0+Y3R4X3Jlc193OiVkXG4iLAorCQkJCW5vdF9udWxsLCBjdHgtPmN0eF9yZXNfdyk7CisJCW5ld19wID0gbmV3X3BpcGUoKTsKKwkJY3R4LT5waXBlLT5uZXh0ID0gbmV3X3A7CisJCWN0eC0+cGlwZSA9IG5ld19wOworCQkvKiBSRVNfVEhFTiwgUkVTX0RPIGV0YyBhcmUgInN0aWNreSIgLQorCQkgKiB0aGV5IHJlbWFpbiBzZXQgZm9yIHBpcGVzIGluc2lkZSBpZi93aGlsZS4KKwkJICogVGhpcyBpcyB1c2VkIHRvIGNvbnRyb2wgZXhlY3V0aW9uLgorCQkgKiBSRVNfRk9SIGFuZCBSRVNfSU4gYXJlIE5PVCBzdGlja3kgKG5lZWRlZCB0byBzdXBwb3J0CisJCSAqIGNhc2VzIHdoZXJlIHZhcmlhYmxlIG9yIHZhbHVlIGhhcHBlbnMgdG8gbWF0Y2ggYSBrZXl3b3JkKToKKwkJICovCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJaWYgKGN0eC0+Y3R4X3Jlc193ID09IFJFU19GT1IKKwkJIHx8IGN0eC0+Y3R4X3Jlc193ID09IFJFU19JTikKKwkJCWN0eC0+Y3R4X3Jlc193ID0gUkVTX05PTkU7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJCWlmIChjdHgtPmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gpCisJCQljdHgtPmN0eF9yZXNfdyA9IFJFU19DQVNFX0JPRFk7CisJCWlmIChjdHgtPmN0eF9yZXNfdyA9PSBSRVNfQ0FTRSkKKwkJCWN0eC0+Y3R4X3Jlc193ID0gUkVTX0NBU0VfSU47CisjZW5kaWYKKwkJY3R4LT5jb21tYW5kID0gTlVMTDsgLyogdHJpY2sgZG9uZV9jb21tYW5kIGJlbG93ICovCisJCS8qIENyZWF0ZSB0aGUgbWVtb3J5IGZvciBjb21tYW5kLCByb3VnaGx5OgorCQkgKiBjdHgtPnBpcGUtPmNtZHMgPSBuZXcgc3RydWN0IGNvbW1hbmQ7CisJCSAqIGN0eC0+Y29tbWFuZCA9ICZjdHgtPnBpcGUtPmNtZHNbMF07CisJCSAqLworCQlkb25lX2NvbW1hbmQoY3R4KTsKKwkJLy9kZWJ1Z19wcmludF90cmVlKGN0eC0+bGlzdF9oZWFkLCAxMCk7CisJfQorCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV9waXBlIHJldHVyblxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfY29udGV4dChzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4KQoreworCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7CisJY3R4LT5waXBlID0gY3R4LT5saXN0X2hlYWQgPSBuZXdfcGlwZSgpOworCS8qIENyZWF0ZSB0aGUgbWVtb3J5IGZvciBjb21tYW5kLCByb3VnaGx5OgorCSAqIGN0eC0+cGlwZS0+Y21kcyA9IG5ldyBzdHJ1Y3QgY29tbWFuZDsKKwkgKiBjdHgtPmNvbW1hbmQgPSAmY3R4LT5waXBlLT5jbWRzWzBdOworCSAqLworCWRvbmVfY29tbWFuZChjdHgpOworfQorCisvKiBJZiBhIHJlc2VydmVkIHdvcmQgaXMgZm91bmQgYW5kIHByb2Nlc3NlZCwgcGFyc2UgY29udGV4dCBpcyBtb2RpZmllZAorICogYW5kIDEgaXMgcmV0dXJuZWQuCisgKi8KKyNpZiBIQVNfS0VZV09SRFMKK3N0cnVjdCByZXNlcnZlZF9jb21ibyB7CisJY2hhciBsaXRlcmFsWzZdOworCXVuc2lnbmVkIGNoYXIgcmVzOworCXVuc2lnbmVkIGNoYXIgYXNzaWdubWVudF9mbGFnOworCWludCBmbGFnOworfTsKK2VudW0geworCUZMQUdfRU5EICAgPSAoMSA8PCBSRVNfTk9ORSApLAorIyBpZiBFTkFCTEVfSFVTSF9JRgorCUZMQUdfSUYgICAgPSAoMSA8PCBSRVNfSUYgICApLAorCUZMQUdfVEhFTiAgPSAoMSA8PCBSRVNfVEhFTiApLAorCUZMQUdfRUxJRiAgPSAoMSA8PCBSRVNfRUxJRiApLAorCUZMQUdfRUxTRSAgPSAoMSA8PCBSRVNfRUxTRSApLAorCUZMQUdfRkkgICAgPSAoMSA8PCBSRVNfRkkgICApLAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9MT09QUworCUZMQUdfRk9SICAgPSAoMSA8PCBSRVNfRk9SICApLAorCUZMQUdfV0hJTEUgPSAoMSA8PCBSRVNfV0hJTEUpLAorCUZMQUdfVU5USUwgPSAoMSA8PCBSRVNfVU5USUwpLAorCUZMQUdfRE8gICAgPSAoMSA8PCBSRVNfRE8gICApLAorCUZMQUdfRE9ORSAgPSAoMSA8PCBSRVNfRE9ORSApLAorCUZMQUdfSU4gICAgPSAoMSA8PCBSRVNfSU4gICApLAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJRkxBR19NQVRDSCA9ICgxIDw8IFJFU19NQVRDSCksCisJRkxBR19FU0FDICA9ICgxIDw8IFJFU19FU0FDICksCisjIGVuZGlmCisJRkxBR19TVEFSVCA9ICgxIDw8IFJFU19YWFhYICksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc2VydmVkX2NvbWJvKiBtYXRjaF9yZXNlcnZlZF93b3JkKG9fc3RyaW5nICp3b3JkKQoreworCS8qIE1vc3RseSBhIGxpc3Qgb2YgYWNjZXB0ZWQgZm9sbG93LXVwIHJlc2VydmVkIHdvcmRzLgorCSAqIEZMQUdfRU5EIG1lYW5zIHdlIGFyZSBkb25lIHdpdGggdGhlIHNlcXVlbmNlLCBhbmQgYXJlIHJlYWR5CisJICogdG8gdHVybiB0aGUgY29tcG91bmQgbGlzdCBpbnRvIGEgY29tbWFuZC4KKwkgKiBGTEFHX1NUQVJUIG1lYW5zIHRoZSB3b3JkIG11c3Qgc3RhcnQgYSBuZXcgY29tcG91bmQgbGlzdC4KKwkgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJlc2VydmVkX2NvbWJvIHJlc2VydmVkX2xpc3RbXSA9IHsKKyMgaWYgRU5BQkxFX0hVU0hfSUYKKwkJeyAiISIsICAgICBSRVNfTk9ORSwgIE5PVF9BU1NJR05NRU5UICAsIDAgfSwKKwkJeyAiaWYiLCAgICBSRVNfSUYsICAgIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfVEhFTiB8IEZMQUdfU1RBUlQgfSwKKwkJeyAidGhlbiIsICBSRVNfVEhFTiwgIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfRUxJRiB8IEZMQUdfRUxTRSB8IEZMQUdfRkkgfSwKKwkJeyAiZWxpZiIsICBSRVNfRUxJRiwgIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfVEhFTiB9LAorCQl7ICJlbHNlIiwgIFJFU19FTFNFLCAgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19GSSAgIH0sCisJCXsgImZpIiwgICAgUkVTX0ZJLCAgICBOT1RfQVNTSUdOTUVOVCAgLCBGTEFHX0VORCAgfSwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJeyAiZm9yIiwgICBSRVNfRk9SLCAgIE5PVF9BU1NJR05NRU5UICAsIEZMQUdfSU4gfCBGTEFHX0RPIHwgRkxBR19TVEFSVCB9LAorCQl7ICJ3aGlsZSIsIFJFU19XSElMRSwgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19ETyB8IEZMQUdfU1RBUlQgfSwKKwkJeyAidW50aWwiLCBSRVNfVU5USUwsIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfRE8gfCBGTEFHX1NUQVJUIH0sCisJCXsgImluIiwgICAgUkVTX0lOLCAgICBOT1RfQVNTSUdOTUVOVCAgLCBGTEFHX0RPICAgfSwKKwkJeyAiZG8iLCAgICBSRVNfRE8sICAgIE1BWUJFX0FTU0lHTk1FTlQsIEZMQUdfRE9ORSB9LAorCQl7ICJkb25lIiwgIFJFU19ET05FLCAgTk9UX0FTU0lHTk1FTlQgICwgRkxBR19FTkQgIH0sCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwkJeyAiY2FzZSIsICBSRVNfQ0FTRSwgIE5PVF9BU1NJR05NRU5UICAsIEZMQUdfTUFUQ0ggfCBGTEFHX1NUQVJUIH0sCisJCXsgImVzYWMiLCAgUkVTX0VTQUMsICBOT1RfQVNTSUdOTUVOVCAgLCBGTEFHX0VORCAgfSwKKyMgZW5kaWYKKwl9OworCWNvbnN0IHN0cnVjdCByZXNlcnZlZF9jb21ibyAqcjsKKworCWZvciAociA9IHJlc2VydmVkX2xpc3Q7IHIgPCByZXNlcnZlZF9saXN0ICsgQVJSQVlfU0laRShyZXNlcnZlZF9saXN0KTsgcisrKSB7CisJCWlmIChzdHJjbXAod29yZC0+ZGF0YSwgci0+bGl0ZXJhbCkgPT0gMCkKKwkJCXJldHVybiByOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKy8qIFJldHVybiAwOiBub3QgYSBrZXl3b3JkLCAxOiBrZXl3b3JkCisgKi8KK3N0YXRpYyBpbnQgcmVzZXJ2ZWRfd29yZChvX3N0cmluZyAqd29yZCwgc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCkKK3sKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfY29tYm8gcmVzZXJ2ZWRfbWF0Y2ggPSB7CisJCSIiLCAgICAgICAgUkVTX01BVENILCBOT1RfQVNTSUdOTUVOVCAsIEZMQUdfTUFUQ0ggfCBGTEFHX0VTQUMKKwl9OworIyBlbmRpZgorCWNvbnN0IHN0cnVjdCByZXNlcnZlZF9jb21ibyAqcjsKKworCWlmICh3b3JkLT5oYXNfcXVvdGVkX3BhcnQpCisJCXJldHVybiAwOworCXIgPSBtYXRjaF9yZXNlcnZlZF93b3JkKHdvcmQpOworCWlmICghcikKKwkJcmV0dXJuIDA7CisKKwlkZWJ1Z19wcmludGYoImZvdW5kIHJlc2VydmVkIHdvcmQgJXMsIHJlcyAlZFxuIiwgci0+bGl0ZXJhbCwgci0+cmVzKTsKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCWlmIChyLT5yZXMgPT0gUkVTX0lOICYmIGN0eC0+Y3R4X3Jlc193ID09IFJFU19DQVNFX0lOKSB7CisJCS8qICJjYXNlIHdvcmQgSU4gLi4uIiAtIElOIHBhcnQgc3RhcnRzIGZpcnN0IE1BVENIIHBhcnQgKi8KKwkJciA9ICZyZXNlcnZlZF9tYXRjaDsKKwl9IGVsc2UKKyMgZW5kaWYKKwlpZiAoci0+ZmxhZyA9PSAwKSB7IC8qICchJyAqLworCQlpZiAoY3R4LT5jdHhfaW52ZXJ0ZWQpIHsgLyogYmFzaCBkb2Vzbid0IGFjY2VwdCAnISAhIHRydWUnICovCisJCQlzeW50YXhfZXJyb3IoIiEgISBjb21tYW5kIik7CisJCQljdHgtPmN0eF9yZXNfdyA9IFJFU19TTlRYOworCQl9CisJCWN0eC0+Y3R4X2ludmVydGVkID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChyLT5mbGFnICYgRkxBR19TVEFSVCkgeworCQlzdHJ1Y3QgcGFyc2VfY29udGV4dCAqb2xkOworCisJCW9sZCA9IHhtYWxsb2Moc2l6ZW9mKCpvbGQpKTsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJwdXNoIHN0YWNrICVwXG4iLCBvbGQpOworCQkqb2xkID0gKmN0eDsgICAvKiBwaHlzaWNhbCBjb3B5ICovCisJCWluaXRpYWxpemVfY29udGV4dChjdHgpOworCQljdHgtPnN0YWNrID0gb2xkOworCX0gZWxzZSBpZiAoLypjdHgtPmN0eF9yZXNfdyA9PSBSRVNfTk9ORSB8fCovICEoY3R4LT5vbGRfZmxhZyAmICgxIDw8IHItPnJlcykpKSB7CisJCXN5bnRheF9lcnJvcl9hdCh3b3JkLT5kYXRhKTsKKwkJY3R4LT5jdHhfcmVzX3cgPSBSRVNfU05UWDsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJLyogInsuLi59IGZpIiBpcyBvay4gInsuLi59IGlmIiBpcyBub3QKKwkJICogRXhhbXBsZToKKwkJICogaWYgeyBlY2hvIGZvbzsgfSB0aGVuIHsgZWNobyBiYXI7IH0gZmkgKi8KKwkJaWYgKGN0eC0+Y29tbWFuZC0+Z3JvdXApCisJCQlkb25lX3BpcGUoY3R4LCBQSVBFX1NFUSk7CisJfQorCisJY3R4LT5jdHhfcmVzX3cgPSByLT5yZXM7CisJY3R4LT5vbGRfZmxhZyA9IHItPmZsYWc7CisJd29yZC0+b19hc3NpZ25tZW50ID0gci0+YXNzaWdubWVudF9mbGFnOworCWRlYnVnX3ByaW50Zl9wYXJzZSgid29yZC0+b19hc3NpZ25tZW50PSclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1t3b3JkLT5vX2Fzc2lnbm1lbnRdKTsKKworCWlmIChjdHgtPm9sZF9mbGFnICYgRkxBR19FTkQpIHsKKwkJc3RydWN0IHBhcnNlX2NvbnRleHQgKm9sZDsKKworCQlkb25lX3BpcGUoY3R4LCBQSVBFX1NFUSk7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgicG9wIHN0YWNrICVwXG4iLCBjdHgtPnN0YWNrKTsKKwkJb2xkID0gY3R4LT5zdGFjazsKKwkJb2xkLT5jb21tYW5kLT5ncm91cCA9IGN0eC0+bGlzdF9oZWFkOworCQlvbGQtPmNvbW1hbmQtPmNtZF90eXBlID0gQ01EX05PUk1BTDsKKyMgaWYgIUJCX01NVQorCQlvX2FkZHN0cigmb2xkLT5hc19zdHJpbmcsIGN0eC0+YXNfc3RyaW5nLmRhdGEpOworCQlvX2ZyZWVfdW5zYWZlKCZjdHgtPmFzX3N0cmluZyk7CisJCW9sZC0+Y29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nID0geHN0cmR1cChvbGQtPmFzX3N0cmluZy5kYXRhKTsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJwb3AsIHJlbWVtYmVyaW5nIGFzOiclcydcbiIsCisJCQkJb2xkLT5jb21tYW5kLT5ncm91cF9hc19zdHJpbmcpOworIyBlbmRpZgorCQkqY3R4ID0gKm9sZDsgICAvKiBwaHlzaWNhbCBjb3B5ICovCisJCWZyZWUob2xkKTsKKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSEFTX0tFWVdPUkRTICovCisKKy8qIFdvcmQgaXMgY29tcGxldGUsIGxvb2sgYXQgaXQgYW5kIHVwZGF0ZSBwYXJzaW5nIGNvbnRleHQuCisgKiBOb3JtYWwgcmV0dXJuIGlzIDAuIFN5bnRheCBlcnJvcnMgcmV0dXJuIDEuCisgKiBOb3RlOiBvbiByZXR1cm4sIHdvcmQgaXMgcmVzZXQsIGJ1dCBub3Qgb19mcmVlJ2QhCisgKi8KK3N0YXRpYyBpbnQgZG9uZV93b3JkKG9fc3RyaW5nICp3b3JkLCBzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBjb21tYW5kICpjb21tYW5kID0gY3R4LT5jb21tYW5kOworCisJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3dvcmQgZW50ZXJlZDogJyVzJyAlcFxuIiwgd29yZC0+ZGF0YSwgY29tbWFuZCk7CisJaWYgKHdvcmQtPmxlbmd0aCA9PSAwICYmICF3b3JkLT5oYXNfcXVvdGVkX3BhcnQpIHsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3dvcmQgcmV0dXJuIDA6IHRydWUgbnVsbCwgaWdub3JlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjdHgtPnBlbmRpbmdfcmVkaXJlY3QpIHsKKwkJLyogV2UgZG8gbm90IGdsb2IgaW4gZS5nLiA+Ki50bXAgY2FzZS4gYmFzaCBzZWVtcyB0byBnbG9iIGhlcmUKKwkJICogb25seSBpZiBydW4gYXMgImJhc2giLCBub3QgInNoIiAqLworCQkvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3hjdV9jaGFwMDIuaHRtbAorCQkgKiAiMi43IFJlZGlyZWN0aW9uCisJCSAqIC4uLnRoZSB3b3JkIHRoYXQgZm9sbG93cyB0aGUgcmVkaXJlY3Rpb24gb3BlcmF0b3IKKwkJICogc2hhbGwgYmUgc3ViamVjdGVkIHRvIHRpbGRlIGV4cGFuc2lvbiwgcGFyYW1ldGVyIGV4cGFuc2lvbiwKKwkJICogY29tbWFuZCBzdWJzdGl0dXRpb24sIGFyaXRobWV0aWMgZXhwYW5zaW9uLCBhbmQgcXVvdGUKKwkJICogcmVtb3ZhbC4gUGF0aG5hbWUgZXhwYW5zaW9uIHNoYWxsIG5vdCBiZSBwZXJmb3JtZWQKKwkJICogb24gdGhlIHdvcmQgYnkgYSBub24taW50ZXJhY3RpdmUgc2hlbGw7IGFuIGludGVyYWN0aXZlCisJCSAqIHNoZWxsIG1heSBwZXJmb3JtIGl0LCBidXQgc2hhbGwgZG8gc28gb25seSB3aGVuCisJCSAqIHRoZSBleHBhbnNpb24gd291bGQgcmVzdWx0IGluIG9uZSB3b3JkLiIKKwkJICovCisJCWN0eC0+cGVuZGluZ19yZWRpcmVjdC0+cmRfZmlsZW5hbWUgPSB4c3RyZHVwKHdvcmQtPmRhdGEpOworCQkvKiBDYXRlciBmb3IgPlxmaWxlIGNhc2U6CisJCSAqID5cYSBjcmVhdGVzIGZpbGUgYTsgPlxcYSwgPiJcYSIsID4iXFxhIiBjcmVhdGUgZmlsZSBcYQorCQkgKiBTYW1lIHdpdGggaGVyZWRvY3M6CisJCSAqIGZvciA8PFxIIGRlbGltIGlzIEg7IDw8XFxILCA8PCJcSCIsIDw8IlxcSCIgLSBcSAorCQkgKi8KKwkJaWYgKGN0eC0+cGVuZGluZ19yZWRpcmVjdC0+cmRfdHlwZSA9PSBSRURJUkVDVF9IRVJFRE9DKSB7CisJCQl1bmJhY2tzbGFzaChjdHgtPnBlbmRpbmdfcmVkaXJlY3QtPnJkX2ZpbGVuYW1lKTsKKwkJCS8qIElzIGl0IDw8IkhFUkVET0MiPyAqLworCQkJaWYgKHdvcmQtPmhhc19xdW90ZWRfcGFydCkgeworCQkJCWN0eC0+cGVuZGluZ19yZWRpcmVjdC0+cmRfZHVwIHw9IEhFUkVET0NfUVVPVEVEOworCQkJfQorCQl9CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgid29yZCBzdG9yZWQgaW4gcmRfZmlsZW5hbWU6ICclcydcbiIsIHdvcmQtPmRhdGEpOworCQljdHgtPnBlbmRpbmdfcmVkaXJlY3QgPSBOVUxMOworCX0gZWxzZSB7CisjaWYgSEFTX0tFWVdPUkRTCisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwkJaWYgKGN0eC0+Y3R4X2RzZW1pY29sb24KKwkJICYmIHN0cmNtcCh3b3JkLT5kYXRhLCAiZXNhYyIpICE9IDAgLyogbm90ICIuLi4gcGF0dGVybikgY21kOzsgZXNhYyIgKi8KKwkJKSB7CisJCQkvKiBhbHJlYWR5IGRvbmUgd2hlbiBjdHhfZHNlbWljb2xvbiB3YXMgc2V0IHRvIDE6ICovCisJCQkvKiBjdHgtPmN0eF9yZXNfdyA9IFJFU19NQVRDSDsgKi8KKwkJCWN0eC0+Y3R4X2RzZW1pY29sb24gPSAwOworCQl9IGVsc2UKKyMgZW5kaWYKKwkJaWYgKCFjb21tYW5kLT5hcmd2IC8qIGlmIGl0J3MgdGhlIGZpcnN0IHdvcmQuLi4gKi8KKyMgaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJICYmIGN0eC0+Y3R4X3Jlc193ICE9IFJFU19GT1IgLyogLi4ubm90IGFmdGVyIEZPUiBvciBJTiAqLworCQkgJiYgY3R4LT5jdHhfcmVzX3cgIT0gUkVTX0lOCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwkJICYmIGN0eC0+Y3R4X3Jlc193ICE9IFJFU19DQVNFCisjIGVuZGlmCisJCSkgeworCQkJaW50IHJlc2VydmVkID0gcmVzZXJ2ZWRfd29yZCh3b3JkLCBjdHgpOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJjaGVja2luZyBmb3IgcmVzZXJ2ZWQtbmVzczogJWRcbiIsIHJlc2VydmVkKTsKKwkJCWlmIChyZXNlcnZlZCkgeworCQkJCW9fcmVzZXRfdG9fZW1wdHlfdW5xdW90ZWQod29yZCk7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3dvcmQgcmV0dXJuICVkXG4iLAorCQkJCQkJKGN0eC0+Y3R4X3Jlc193ID09IFJFU19TTlRYKSk7CisJCQkJcmV0dXJuIChjdHgtPmN0eF9yZXNfdyA9PSBSRVNfU05UWCk7CisJCQl9CisjIGlmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJCQlpZiAoc3RyY21wKHdvcmQtPmRhdGEsICJbWyIpID09IDApIHsKKwkJCQljb21tYW5kLT5jbWRfdHlwZSA9IENNRF9TSU5HTEVXT1JEX05PR0xPQjsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworIyBlbmRpZgorCQl9CisjZW5kaWYKKwkJaWYgKGNvbW1hbmQtPmdyb3VwKSB7CisJCQkvKiAieyBlY2hvIGZvbzsgfSBlY2hvIGJhciIgLSBiYWQgKi8KKwkJCXN5bnRheF9lcnJvcl9hdCh3b3JkLT5kYXRhKTsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV93b3JkIHJldHVybiAxOiBzeW50YXggZXJyb3IsICIKKwkJCQkJImdyb3VwcyBhbmQgYXJnbGlzdHMgZG9uJ3QgbWl4XG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogSWYgdGhpcyB3b3JkIHdhc24ndCBhbiBhc3NpZ25tZW50LCBuZXh0IG9uZXMgZGVmaW5pdGVseQorCQkgKiBjYW4ndCBiZSBhc3NpZ25tZW50cy4gRXZlbiBpZiB0aGV5IGxvb2sgbGlrZSBvbmVzLiAqLworCQlpZiAod29yZC0+b19hc3NpZ25tZW50ICE9IERFRklOSVRFTFlfQVNTSUdOTUVOVAorCQkgJiYgd29yZC0+b19hc3NpZ25tZW50ICE9IFdPUkRfSVNfS0VZV09SRAorCQkpIHsKKwkJCXdvcmQtPm9fYXNzaWdubWVudCA9IE5PVF9BU1NJR05NRU5UOworCQl9IGVsc2UgeworCQkJaWYgKHdvcmQtPm9fYXNzaWdubWVudCA9PSBERUZJTklURUxZX0FTU0lHTk1FTlQpIHsKKwkJCQljb21tYW5kLT5hc3NpZ25tZW50X2NudCsrOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiKythc3NpZ25tZW50X2NudD0lZFxuIiwgY29tbWFuZC0+YXNzaWdubWVudF9jbnQpOworCQkJfQorCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJ3b3JkLT5vX2Fzc2lnbm1lbnQgd2FzOiclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1t3b3JkLT5vX2Fzc2lnbm1lbnRdKTsKKwkJCXdvcmQtPm9fYXNzaWdubWVudCA9IE1BWUJFX0FTU0lHTk1FTlQ7CisJCX0KKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJ3b3JkLT5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW3dvcmQtPm9fYXNzaWdubWVudF0pOworCisJCWlmICh3b3JkLT5oYXNfcXVvdGVkX3BhcnQKKwkJIC8qIG9wdGltaXphdGlvbjogYW5kIGlmIGl0J3MgKCIiIG9yICcnKSBvciAoJHYuLi4gb3IgYGNtZGAuLi4pOiAqLworCQkgJiYgKHdvcmQtPmRhdGFbMF0gPT0gJ1wwJyB8fCB3b3JkLT5kYXRhWzBdID09IFNQRUNJQUxfVkFSX1NZTUJPTCkKKwkJIC8qIChvdGhlcndpc2UgaXQncyBrbm93biB0byBiZSBub3QgZW1wdHkgYW5kIGlzIGFscmVhZHkgc2FmZSkgKi8KKwkJKSB7CisJCQkvKiBleGNsdWRlICIkQCIgLSBpdCBjYW4gZXhwYW5kIHRvIG5vIHdvcmQgZGVzcGl0ZSAiIiAqLworCQkJY2hhciAqcCA9IHdvcmQtPmRhdGE7CisJCQl3aGlsZSAocFswXSA9PSBTUEVDSUFMX1ZBUl9TWU1CT0wKKwkJCSAgICAmJiAocFsxXSAmIDB4N2YpID09ICdAJworCQkJICAgICYmIHBbMl0gPT0gU1BFQ0lBTF9WQVJfU1lNQk9MCisJCQkpIHsKKwkJCQlwICs9IDM7CisJCQl9CisJCX0KKwkJY29tbWFuZC0+YXJndiA9IGFkZF9zdHJpbmdfdG9fc3RyaW5ncyhjb21tYW5kLT5hcmd2LCB4c3RyZHVwKHdvcmQtPmRhdGEpKTsKKwkJZGVidWdfcHJpbnRfc3RyaW5ncygid29yZCBhcHBlbmRlZCB0byBhcmd2IiwgY29tbWFuZC0+YXJndik7CisJfQorCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwlpZiAoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0ZPUikgeworCQlpZiAod29yZC0+aGFzX3F1b3RlZF9wYXJ0CisJCSB8fCAhaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoY29tbWFuZC0+YXJndlswXSwgJ1wwJykKKwkJKSB7CisJCQkvKiBiYXNoIHNheXMganVzdCAibm90IGEgdmFsaWQgaWRlbnRpZmllciIgKi8KKwkJCXN5bnRheF9lcnJvcigibm90IGEgdmFsaWQgaWRlbnRpZmllciBpbiBmb3IiKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIEZvcmNlIEZPUiB0byBoYXZlIGp1c3Qgb25lIHdvcmQgKHZhcmlhYmxlIG5hbWUpICovCisJCS8qIE5COiBiYXNpY2FsbHksIHRoaXMgbWFrZXMgaHVzaCBzZWUgImZvciB2IGluIC4uLiIKKwkJICogc3ludGF4IGFzIGlmIGl0IGlzICJmb3IgdjsgaW4gLi4uIi4gRk9SIGFuZCBJTiBiZWNvbWUKKwkJICogdHdvIHBpcGUgc3RydWN0cyBpbiBwYXJzZSB0cmVlLiAqLworCQlkb25lX3BpcGUoY3R4LCBQSVBFX1NFUSk7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCS8qIEZvcmNlIENBU0UgdG8gaGF2ZSBqdXN0IG9uZSB3b3JkICovCisJaWYgKGN0eC0+Y3R4X3Jlc193ID09IFJFU19DQVNFKSB7CisJCWRvbmVfcGlwZShjdHgsIFBJUEVfU0VRKTsKKwl9CisjZW5kaWYKKworCW9fcmVzZXRfdG9fZW1wdHlfdW5xdW90ZWQod29yZCk7CisKKwlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfd29yZCByZXR1cm4gMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyogUGVlayBhaGVhZCBpbiB0aGUgaW5wdXQgdG8gZmluZCBvdXQgaWYgd2UgaGF2ZSBhICImbiIgY29uc3RydWN0LAorICogYXMgaW4gIjI+JjEiLCB0aGF0IHJlcHJlc2VudHMgZHVwbGljYXRpbmcgYSBmaWxlIGRlc2NyaXB0b3IuCisgKiBSZXR1cm46CisgKiBSRURJUkZEX0NMT1NFIGlmID4mLSAiY2xvc2UgZmQiIGNvbnN0cnVjdCBpcyBzZWVuLAorICogUkVESVJGRF9TWU5UQVhfRVJSIGlmIHN5bnRheCBlcnJvciwKKyAqIFJFRElSRkRfVE9fRklMRSBpZiBubyAmIHdhcyBzZWVuLAorICogb3IgdGhlIG51bWJlciBmb3VuZC4KKyAqLworI2lmIEJCX01NVQorI2RlZmluZSBwYXJzZV9yZWRpcl9yaWdodF9mZChhc19zdHJpbmcsIGlucHV0KSBcCisJcGFyc2VfcmVkaXJfcmlnaHRfZmQoaW5wdXQpCisjZW5kaWYKK3N0YXRpYyBpbnQgcGFyc2VfcmVkaXJfcmlnaHRfZmQob19zdHJpbmcgKmFzX3N0cmluZywgc3RydWN0IGluX3N0ciAqaW5wdXQpCit7CisJaW50IGNoLCBkLCBvazsKKworCWNoID0gaV9wZWVrKGlucHV0KTsKKwlpZiAoY2ggIT0gJyYnKQorCQlyZXR1cm4gUkVESVJGRF9UT19GSUxFOworCisJY2ggPSBpX2dldGNoKGlucHV0KTsgIC8qIGdldCB0aGUgJiAqLworCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwljaCA9IGlfcGVlayhpbnB1dCk7CisJaWYgKGNoID09ICctJykgeworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCXJldHVybiBSRURJUkZEX0NMT1NFOworCX0KKwlkID0gMDsKKwlvayA9IDA7CisJd2hpbGUgKGNoICE9IEVPRiAmJiBpc2RpZ2l0KGNoKSkgeworCQlkID0gZCoxMCArIChjaC0nMCcpOworCQlvayA9IDE7CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJY2ggPSBpX3BlZWsoaW5wdXQpOworCX0KKwlpZiAob2spIHJldHVybiBkOworCisvL1RPRE86IHRoaXMgaXMgdGhlIHBsYWNlIHRvIGNhdGNoICI+JmZpbGUiIGJhc2hpc20gKHJlZGlyZWN0IGJvdGggZmQgMSBhbmQgMikKKworCWJiX2Vycm9yX21zZygiYW1iaWd1b3VzIHJlZGlyZWN0Iik7CisJcmV0dXJuIFJFRElSRkRfU1lOVEFYX0VSUjsKK30KKworLyogUmV0dXJuIGNvZGUgaXMgMCBub3JtYWwsIDEgaWYgYSBzeW50YXggZXJyb3IgaXMgZGV0ZWN0ZWQKKyAqLworc3RhdGljIGludCBwYXJzZV9yZWRpcmVjdChzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4LAorCQlpbnQgZmQsCisJCXJlZGlyX3R5cGUgc3R5bGUsCisJCXN0cnVjdCBpbl9zdHIgKmlucHV0KQoreworCXN0cnVjdCBjb21tYW5kICpjb21tYW5kID0gY3R4LT5jb21tYW5kOworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKnJlZGlyOworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKipyZWRpcnA7CisJaW50IGR1cF9udW07CisKKwlkdXBfbnVtID0gUkVESVJGRF9UT19GSUxFOworCWlmIChzdHlsZSAhPSBSRURJUkVDVF9IRVJFRE9DKSB7CisJCS8qIENoZWNrIGZvciBhICc+JjEnIHR5cGUgcmVkaXJlY3QgKi8KKwkJZHVwX251bSA9IHBhcnNlX3JlZGlyX3JpZ2h0X2ZkKCZjdHgtPmFzX3N0cmluZywgaW5wdXQpOworCQlpZiAoZHVwX251bSA9PSBSRURJUkZEX1NZTlRBWF9FUlIpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpbnQgY2ggPSBpX3BlZWsoaW5wdXQpOworCQlkdXBfbnVtID0gKGNoID09ICctJyk7IC8qIEhFUkVET0NfU0tJUFRBQlMgYml0IGlzIDEgKi8KKwkJaWYgKGR1cF9udW0pIHsgLyogPDwtLi4uICovCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJbm9tbXVfYWRkY2hyKCZjdHgtPmFzX3N0cmluZywgY2gpOworCQkJY2ggPSBpX3BlZWsoaW5wdXQpOworCQl9CisJfQorCisJaWYgKHN0eWxlID09IFJFRElSRUNUX09WRVJXUklURSAmJiBkdXBfbnVtID09IFJFRElSRkRfVE9fRklMRSkgeworCQlpbnQgY2ggPSBpX3BlZWsoaW5wdXQpOworCQlpZiAoY2ggPT0gJ3wnKSB7CisJCQkvKiA+fEZJTEUgcmVkaXJlY3QgKCJjbG9iYmVyaW5nIiA+KS4KKwkJCSAqIFNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0ICJzZXQgLW8gbm9jbG9iYmVyIiB5ZXQsCisJCQkgKiA+fCBhbmQgPiBhcmUgdGhlIHNhbWUgZm9yIG5vdy4gSnVzdCBlYXQgfC4KKwkJCSAqLworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCW5vbW11X2FkZGNocigmY3R4LT5hc19zdHJpbmcsIGNoKTsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBhIG5ldyByZWRpcl9zdHJ1Y3QgYW5kIGFwcGVuZCBpdCB0byB0aGUgbGlua2VkIGxpc3QgKi8KKwlyZWRpcnAgPSAmY29tbWFuZC0+cmVkaXJlY3RzOworCXdoaWxlICgocmVkaXIgPSAqcmVkaXJwKSAhPSBOVUxMKSB7CisJCXJlZGlycCA9ICYocmVkaXItPm5leHQpOworCX0KKwkqcmVkaXJwID0gcmVkaXIgPSB4emFsbG9jKHNpemVvZigqcmVkaXIpKTsKKwkvKiByZWRpci0+bmV4dCA9IE5VTEw7ICovCisJLyogcmVkaXItPnJkX2ZpbGVuYW1lID0gTlVMTDsgKi8KKwlyZWRpci0+cmRfdHlwZSA9IHN0eWxlOworCXJlZGlyLT5yZF9mZCA9IChmZCA9PSAtMSkgPyByZWRpcl90YWJsZVtzdHlsZV0uZGVmYXVsdF9mZCA6IGZkOworCisJZGVidWdfcHJpbnRmX3BhcnNlKCJyZWRpcmVjdCB0eXBlICVkICVzXG4iLCByZWRpci0+cmRfZmQsCisJCQkJcmVkaXJfdGFibGVbc3R5bGVdLmRlc2NyaXApOworCisJcmVkaXItPnJkX2R1cCA9IGR1cF9udW07CisJaWYgKHN0eWxlICE9IFJFRElSRUNUX0hFUkVET0MgJiYgZHVwX251bSAhPSBSRURJUkZEX1RPX0ZJTEUpIHsKKwkJLyogRXJpayBoYWQgYSBjaGVjayBoZXJlIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBxdWVzdGlvbgorCQkgKiBpcyBsZWdpdDsgSSBwb3N0cG9uZSB0aGF0IHRvICJydW4gdGltZSIKKwkJICogQSAiLSIgcmVwcmVzZW50YXRpb24gb2YgImNsb3NlIG1lIiBzaG93cyB1cCBhcyBhIC0zIGhlcmUgKi8KKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJkdXBsaWNhdGluZyByZWRpcmVjdCAnJWQ+JiVkJ1xuIiwKKwkJCQlyZWRpci0+cmRfZmQsIHJlZGlyLT5yZF9kdXApOworCX0gZWxzZSB7CisJCS8qIFNldCBjdHgtPnBlbmRpbmdfcmVkaXJlY3QsIHNvIHdlIGtub3cgd2hhdCB0byBkbyBhdCB0aGUKKwkJICogZW5kIG9mIHRoZSBuZXh0IHBhcnNlZCB3b3JkLiAqLworCQljdHgtPnBlbmRpbmdfcmVkaXJlY3QgPSByZWRpcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIElmIGEgcmVkaXJlY3QgaXMgaW1tZWRpYXRlbHkgcHJlY2VkZWQgYnkgYSBudW1iZXIsIHRoYXQgbnVtYmVyIGlzCisgKiBzdXBwb3NlZCB0byB0ZWxsIHdoaWNoIGZpbGUgZGVzY3JpcHRvciB0byByZWRpcmVjdC4gIFRoaXMgcm91dGluZQorICogbG9va3MgZm9yIHN1Y2ggcHJlY2VkaW5nIG51bWJlcnMuICBJbiBhbiBpZGVhbCB3b3JsZCB0aGlzIHJvdXRpbmUKKyAqIG5lZWRzIHRvIGhhbmRsZSBhbGwgdGhlIGZvbGxvd2luZyBjbGFzc2VzIG9mIHJlZGlyZWN0cy4uLgorICogICAgIGVjaG8gMj5mb28gICAgICMgcmVkaXJlY3RzIGZkICAyIHRvIGZpbGUgImZvbyIsIG5vdGhpbmcgcGFzc2VkIHRvIGVjaG8KKyAqICAgICBlY2hvIDQ5PmZvbyAgICAjIHJlZGlyZWN0cyBmZCA0OSB0byBmaWxlICJmb28iLCBub3RoaW5nIHBhc3NlZCB0byBlY2hvCisgKiAgICAgZWNobyAtMj5mb28gICAgIyByZWRpcmVjdHMgZmQgIDEgdG8gZmlsZSAiZm9vIiwgICAgIi0yIiBwYXNzZWQgdG8gZWNobworICogICAgIGVjaG8gNDl4PmZvbyAgICMgcmVkaXJlY3RzIGZkICAxIHRvIGZpbGUgImZvbyIsICAgIjQ5eCIgcGFzc2VkIHRvIGVjaG8KKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3hjdV9jaGFwMDIuaHRtbAorICogIjIuNyBSZWRpcmVjdGlvbgorICogLi4uIElmIG4gaXMgcXVvdGVkLCB0aGUgbnVtYmVyIHNoYWxsIG5vdCBiZSByZWNvZ25pemVkIGFzIHBhcnQgb2YKKyAqIHRoZSByZWRpcmVjdGlvbiBleHByZXNzaW9uLiBGb3IgZXhhbXBsZToKKyAqIGVjaG8gXDI+YQorICogd3JpdGVzIHRoZSBjaGFyYWN0ZXIgMiBpbnRvIGZpbGUgYSIKKyAqIFdlIGFyZSBnZXR0aW5nIGl0IHJpZ2h0IGJ5IHNldHRpbmcgLT5oYXNfcXVvdGVkX3BhcnQgb24gYW55IFw8Y2hhcj4KKyAqCisgKiBBIC0xIHJldHVybiBtZWFucyBubyB2YWxpZCBudW1iZXIgd2FzIGZvdW5kLAorICogdGhlIGNhbGxlciBzaG91bGQgdXNlIHRoZSBhcHByb3ByaWF0ZSBkZWZhdWx0IGZvciB0aGlzIHJlZGlyZWN0aW9uLgorICovCitzdGF0aWMgaW50IHJlZGlyZWN0X29wdF9udW0ob19zdHJpbmcgKm8pCit7CisJaW50IG51bTsKKworCWlmIChvLT5kYXRhID09IE5VTEwpCisJCXJldHVybiAtMTsKKwludW0gPSBiYl9zdHJ0b3Uoby0+ZGF0YSwgTlVMTCwgMTApOworCWlmIChlcnJubyB8fCBudW0gPCAwKQorCQlyZXR1cm4gLTE7CisJb19yZXNldF90b19lbXB0eV91bnF1b3RlZChvKTsKKwlyZXR1cm4gbnVtOworfQorCisjaWYgQkJfTU1VCisjZGVmaW5lIGZldGNoX3RpbGxfc3RyKGFzX3N0cmluZywgaW5wdXQsIHdvcmQsIHNraXBfdGFicykgXAorCWZldGNoX3RpbGxfc3RyKGlucHV0LCB3b3JkLCBza2lwX3RhYnMpCisjZW5kaWYKK3N0YXRpYyBjaGFyICpmZXRjaF90aWxsX3N0cihvX3N0cmluZyAqYXNfc3RyaW5nLAorCQlzdHJ1Y3QgaW5fc3RyICppbnB1dCwKKwkJY29uc3QgY2hhciAqd29yZCwKKwkJaW50IGhlcmVkb2NfZmxhZ3MpCit7CisJb19zdHJpbmcgaGVyZWRvYyA9IE5VTExfT19TVFJJTkc7CisJdW5zaWduZWQgcGFzdF9FT0w7CisJaW50IHByZXYgPSAwOyAvKiBub3QgXCAqLworCWludCBjaDsKKworCWdvdG8ganVtcF9pbjsKKworCXdoaWxlICgxKSB7CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCWlmIChjaCAhPSBFT0YpCisJCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCWlmICgoY2ggPT0gJ1xuJyB8fCBjaCA9PSBFT0YpCisJCSAmJiAoKGhlcmVkb2NfZmxhZ3MgJiBIRVJFRE9DX1FVT1RFRCkgfHwgcHJldiAhPSAnXFwnKQorCQkpIHsKKwkJCWlmIChzdHJjbXAoaGVyZWRvYy5kYXRhICsgcGFzdF9FT0wsIHdvcmQpID09IDApIHsKKwkJCQloZXJlZG9jLmRhdGFbcGFzdF9FT0xdID0gJ1wwJzsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlZCBoZXJlZG9jICclcydcbiIsIGhlcmVkb2MuZGF0YSk7CisJCQkJcmV0dXJuIGhlcmVkb2MuZGF0YTsKKwkJCX0KKwkJCXdoaWxlIChjaCA9PSAnXG4nKSB7CisJCQkJb19hZGRjaHIoJmhlcmVkb2MsIGNoKTsKKwkJCQlwcmV2ID0gY2g7CisganVtcF9pbjoKKwkJCQlwYXN0X0VPTCA9IGhlcmVkb2MubGVuZ3RoOworCQkJCWRvIHsKKwkJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQkJaWYgKGNoICE9IEVPRikKKwkJCQkJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJCQl9IHdoaWxlICgoaGVyZWRvY19mbGFncyAmIEhFUkVET0NfU0tJUFRBQlMpICYmIGNoID09ICdcdCcpOworCQkJfQorCQl9CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCW9fZnJlZV91bnNhZmUoJmhlcmVkb2MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJb19hZGRjaHIoJmhlcmVkb2MsIGNoKTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQlpZiAocHJldiA9PSAnXFwnICYmIGNoID09ICdcXCcpCisJCQkvKiBDb3JyZWN0bHkgaGFuZGxlIGZvb1xcPGVvbD4gKG5vdCBhIGxpbmUgY29udC4pICovCisJCQlwcmV2ID0gMDsgLyogbm90IFwgKi8KKwkJZWxzZQorCQkJcHJldiA9IGNoOworCX0KK30KKworLyogTG9vayBhdCBlbnRpcmUgcGFyc2UgdHJlZSBmb3Igbm90LXlldC1sb2FkZWQgUkVESVJFQ1RfSEVSRURPQ3MKKyAqIGFuZCBsb2FkIHRoZW0gYWxsLiBUaGVyZSBzaG91bGQgYmUgZXhhY3RseSBoZXJlZG9jX2NudCBvZiB0aGVtLgorICovCitzdGF0aWMgaW50IGZldGNoX2hlcmVkb2NzKGludCBoZXJlZG9jX2NudCwgc3RydWN0IHBhcnNlX2NvbnRleHQgKmN0eCwgc3RydWN0IGluX3N0ciAqaW5wdXQpCit7CisJc3RydWN0IHBpcGUgKnBpID0gY3R4LT5saXN0X2hlYWQ7CisKKwl3aGlsZSAocGkgJiYgaGVyZWRvY19jbnQpIHsKKwkJaW50IGk7CisJCXN0cnVjdCBjb21tYW5kICpjbWQgPSBwaS0+Y21kczsKKworCQlkZWJ1Z19wcmludGZfcGFyc2UoImZldGNoX2hlcmVkb2NzOiBudW1fY21kczolZCBjbWQgYXJndjA6JyVzJ1xuIiwKKwkJCQlwaS0+bnVtX2NtZHMsCisJCQkJY21kLT5hcmd2ID8gY21kLT5hcmd2WzBdIDogIk5PTkUiKTsKKwkJZm9yIChpID0gMDsgaSA8IHBpLT5udW1fY21kczsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyZWRpciA9IGNtZC0+cmVkaXJlY3RzOworCisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImZldGNoX2hlcmVkb2NzOiAlZCBjbWQgYXJndjA6JyVzJ1xuIiwKKwkJCQkJaSwgY21kLT5hcmd2ID8gY21kLT5hcmd2WzBdIDogIk5PTkUiKTsKKwkJCXdoaWxlIChyZWRpcikgeworCQkJCWlmIChyZWRpci0+cmRfdHlwZSA9PSBSRURJUkVDVF9IRVJFRE9DKSB7CisJCQkJCWNoYXIgKnA7CisKKwkJCQkJcmVkaXItPnJkX3R5cGUgPSBSRURJUkVDVF9IRVJFRE9DMjsKKwkJCQkJLyogcmVkaXItPnJkX2R1cCBpcyAoYWIpdXNlZCB0byBpbmRpY2F0ZSA8PC0gKi8KKwkJCQkJcCA9IGZldGNoX3RpbGxfc3RyKCZjdHgtPmFzX3N0cmluZywgaW5wdXQsCisJCQkJCQkJcmVkaXItPnJkX2ZpbGVuYW1lLCByZWRpci0+cmRfZHVwKTsKKwkJCQkJaWYgKCFwKSB7CisJCQkJCQlzeW50YXhfZXJyb3IoInVuZXhwZWN0ZWQgRU9GIGluIGhlcmUgZG9jdW1lbnQiKTsKKwkJCQkJCXJldHVybiAxOworCQkJCQl9CisJCQkJCWZyZWUocmVkaXItPnJkX2ZpbGVuYW1lKTsKKwkJCQkJcmVkaXItPnJkX2ZpbGVuYW1lID0gcDsKKwkJCQkJaGVyZWRvY19jbnQtLTsKKwkJCQl9CisJCQkJcmVkaXIgPSByZWRpci0+bmV4dDsKKwkJCX0KKwkJCWNtZCsrOworCQl9CisJCXBpID0gcGktPm5leHQ7CisJfQorI2lmIDAKKwkvKiBTaG91bGQgYmUgMC4gSWYgaXQgaXNuJ3QsIGl0J3MgYSBwYXJzZSBlcnJvciAqLworCWlmIChoZXJlZG9jX2NudCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImhlcmVkb2MgQlVHIDIiKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnVuX2xpc3Qoc3RydWN0IHBpcGUgKnBpKTsKKyNpZiBCQl9NTVUKKyNkZWZpbmUgcGFyc2Vfc3RyZWFtKHBzdHJpbmcsIGlucHV0LCBlbmRfdHJpZ2dlcikgXAorCXBhcnNlX3N0cmVhbShpbnB1dCwgZW5kX3RyaWdnZXIpCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgcGlwZSAqcGFyc2Vfc3RyZWFtKGNoYXIgKipwc3RyaW5nLAorCQlzdHJ1Y3QgaW5fc3RyICppbnB1dCwKKwkJaW50IGVuZF90cmlnZ2VyKTsKKworCisjaWYgIUVOQUJMRV9IVVNIX0ZVTkNUSU9OUworI2RlZmluZSBwYXJzZV9ncm91cChkZXN0LCBjdHgsIGlucHV0LCBjaCkgXAorCXBhcnNlX2dyb3VwKGN0eCwgaW5wdXQsIGNoKQorI2VuZGlmCitzdGF0aWMgaW50IHBhcnNlX2dyb3VwKG9fc3RyaW5nICpkZXN0LCBzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4LAorCXN0cnVjdCBpbl9zdHIgKmlucHV0LCBpbnQgY2gpCit7CisJLyogZGVzdCBjb250YWlucyBjaGFyYWN0ZXJzIHNlZW4gcHJpb3IgdG8gKCBvciB7LgorCSAqIFR5cGljYWxseSBpdCdzIGVtcHR5LCBidXQgZm9yIGZ1bmN0aW9uIGRlZnMsCisJICogaXQgY29udGFpbnMgZnVuY3Rpb24gbmFtZSAod2l0aG91dCAnKCknKS4gKi8KKwlzdHJ1Y3QgcGlwZSAqcGlwZV9saXN0OworCWludCBlbmRjaDsKKwlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9IGN0eC0+Y29tbWFuZDsKKworCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZ3JvdXAgZW50ZXJlZFxuIik7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJaWYgKGNoID09ICcoJyAmJiAhZGVzdC0+aGFzX3F1b3RlZF9wYXJ0KSB7CisJCWlmIChkZXN0LT5sZW5ndGgpCisJCQlpZiAoZG9uZV93b3JkKGRlc3QsIGN0eCkpCisJCQkJcmV0dXJuIDE7CisJCWlmICghY29tbWFuZC0+YXJndikKKwkJCWdvdG8gc2tpcDsgLyogKC4uLiAqLworCQlpZiAoY29tbWFuZC0+YXJndlsxXSkgeyAvKiB3b3JkIHdvcmQgLi4uICguLi4gKi8KKwkJCXN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKCcoJyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBpdCBpcyAid29yZCguLi4iIG9yICJ3b3JkICguLi4iICovCisJCWRvCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQl3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcpOworCQlpZiAoY2ggIT0gJyknKSB7CisJCQlzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaChjaCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlub21tdV9hZGRjaHIoJmN0eC0+YXNfc3RyaW5nLCBjaCk7CisJCWRvCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQl3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyk7CisJCWlmIChjaCAhPSAneycpIHsKKwkJCXN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGNoKTsKKwkJCXJldHVybiAxOworCQl9CisJCW5vbW11X2FkZGNocigmY3R4LT5hc19zdHJpbmcsIGNoKTsKKwkJY29tbWFuZC0+Y21kX3R5cGUgPSBDTURfRlVOQ0RFRjsKKwkJZ290byBza2lwOworCX0KKyNlbmRpZgorCisjaWYgMCAvKiBQcmV2ZW50ZWQgYnkgY2FsbGVyICovCisJaWYgKGNvbW1hbmQtPmFyZ3YgLyogd29yZCBbd29yZF17Li4uICovCisJIHx8IGRlc3QtPmxlbmd0aCAvKiB3b3Jkey4uLiAqLworCSB8fCBkZXN0LT5oYXNfcXVvdGVkX3BhcnQgLyogIiJ7Li4uICovCisJKSB7CisJCXN5bnRheF9lcnJvcihOVUxMKTsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9ncm91cCByZXR1cm4gMTogIgorCQkJInN5bnRheCBlcnJvciwgZ3JvdXBzIGFuZCBhcmdsaXN0cyBkb24ndCBtaXhcbiIpOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworIHNraXA6CisjZW5kaWYKKwllbmRjaCA9ICd9JzsKKwlpZiAoY2ggPT0gJygnKSB7CisJCWVuZGNoID0gJyknOworCQljb21tYW5kLT5jbWRfdHlwZSA9IENNRF9TVUJTSEVMTDsKKwl9IGVsc2UgeworCQkvKiBiYXNoIGRvZXMgbm90IGFsbG93ICJ7ZWNoby4uLiIsIHJlcXVpcmVzIHdoaXRlc3BhY2UgKi8KKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJaWYgKGNoICE9ICcgJyAmJiBjaCAhPSAnXHQnICYmIGNoICE9ICdcbicpIHsKKwkJCXN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGNoKTsKKwkJCXJldHVybiAxOworCQl9CisJCW5vbW11X2FkZGNocigmY3R4LT5hc19zdHJpbmcsIGNoKTsKKwl9CisKKwl7CisjaWYgQkJfTU1VCisjIGRlZmluZSBhc19zdHJpbmcgTlVMTAorI2Vsc2UKKwkJY2hhciAqYXNfc3RyaW5nID0gTlVMTDsKKyNlbmRpZgorCQlwaXBlX2xpc3QgPSBwYXJzZV9zdHJlYW0oJmFzX3N0cmluZywgaW5wdXQsIGVuZGNoKTsKKyNpZiAhQkJfTU1VCisJCWlmIChhc19zdHJpbmcpCisJCQlvX2FkZHN0cigmY3R4LT5hc19zdHJpbmcsIGFzX3N0cmluZyk7CisjZW5kaWYKKwkJLyogZW1wdHkgKCkve30gb3IgcGFyc2UgZXJyb3I/ICovCisJCWlmICghcGlwZV9saXN0IHx8IHBpcGVfbGlzdCA9PSBFUlJfUFRSKSB7CisJCQkvKiBwYXJzZV9zdHJlYW0gYWxyZWFkeSBlbWl0dGVkIGVycm9yIG1zZyAqLworCQkJaWYgKCFCQl9NTVUpCisJCQkJZnJlZShhc19zdHJpbmcpOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9ncm91cCByZXR1cm4gMTogIgorCQkJCSJwYXJzZV9zdHJlYW0gcmV0dXJuZWQgJXBcbiIsIHBpcGVfbGlzdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljb21tYW5kLT5ncm91cCA9IHBpcGVfbGlzdDsKKyNpZiAhQkJfTU1VCisJCWFzX3N0cmluZ1tzdHJsZW4oYXNfc3RyaW5nKSAtIDFdID0gJ1wwJzsgLyogcGxpbmsgJyknIG9yICd9JyAqLworCQljb21tYW5kLT5ncm91cF9hc19zdHJpbmcgPSBhc19zdHJpbmc7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZW5kIG9mIGdyb3VwLCByZW1lbWJlcmluZyBhczonJXMnXG4iLAorCQkJCWNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZyk7CisjZW5kaWYKKyN1bmRlZiBhc19zdHJpbmcKKwl9CisJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9ncm91cCByZXR1cm4gMFxuIik7CisJcmV0dXJuIDA7CisJLyogY29tbWFuZCByZW1haW5zICJvcGVuIiwgYXZhaWxhYmxlIGZvciBwb3NzaWJsZSByZWRpcmVjdHMgKi8KK30KKworI2lmIEVOQUJMRV9IVVNIX1RJQ0sgfHwgRU5BQkxFX1NIX01BVEhfU1VQUE9SVCB8fCBFTkFCTEVfSFVTSF9ET0xMQVJfT1BTCisvKiBTdWJyb3V0aW5lcyBmb3IgY29weWluZyAkKC4uLikgYW5kIGAuLi5gIHRoaW5ncyAqLworc3RhdGljIGludCBhZGRfdGlsbF9iYWNrcXVvdGUob19zdHJpbmcgKmRlc3QsIHN0cnVjdCBpbl9zdHIgKmlucHV0LCBpbnQgaW5fZHF1b3RlKTsKKy8qICcuLi4nICovCitzdGF0aWMgaW50IGFkZF90aWxsX3NpbmdsZV9xdW90ZShvX3N0cmluZyAqZGVzdCwgc3RydWN0IGluX3N0ciAqaW5wdXQpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IGNoID0gaV9nZXRjaChpbnB1dCk7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJ1wnJyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY2ggPT0gJ1wnJykKKwkJCXJldHVybiAxOworCQlvX2FkZGNocihkZXN0LCBjaCk7CisJfQorfQorLyogIi4uLlwiLi4uYC4uYC4uLi4iIC0gZG8gd2UgbmVlZCB0byBoYW5kbGUgIi4uLiQoLi4pLi4uIiB0b28/ICovCitzdGF0aWMgaW50IGFkZF90aWxsX2RvdWJsZV9xdW90ZShvX3N0cmluZyAqZGVzdCwgc3RydWN0IGluX3N0ciAqaW5wdXQpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IGNoID0gaV9nZXRjaChpbnB1dCk7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJyInKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChjaCA9PSAnIicpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGNoID09ICdcXCcpIHsgIC8qIFx4LiBDb3B5IGJvdGggY2hhcnMuICovCisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQl9CisJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJaWYgKGNoID09ICdgJykgeworCQkJaWYgKCFhZGRfdGlsbF9iYWNrcXVvdGUoZGVzdCwgaW5wdXQsIC8qaW5fZHF1b3RlOiovIDEpKQorCQkJCXJldHVybiAwOworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY29udGludWU7CisJCX0KKwkJLy9pZiAoY2ggPT0gJyQnKSAuLi4KKwl9Cit9CisvKiBQcm9jZXNzIGBjbWRgIC0gY29weSBjb250ZW50cyB1bnRpbCAiYCIgaXMgc2Vlbi4gQ29tcGxpY2F0ZWQgYnkKKyAqIFxgIHF1b3RpbmcuCisgKiAiV2l0aGluIHRoZSBiYWNrcXVvdGVkIHN0eWxlIG9mIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBiYWNrc2xhc2gKKyAqIHNoYWxsIHJldGFpbiBpdHMgbGl0ZXJhbCBtZWFuaW5nLCBleGNlcHQgd2hlbiBmb2xsb3dlZCBieTogJyQnLCAnYCcsIG9yICdcJy4KKyAqIFRoZSBzZWFyY2ggZm9yIHRoZSBtYXRjaGluZyBiYWNrcXVvdGUgc2hhbGwgYmUgc2F0aXNmaWVkIGJ5IHRoZSBmaXJzdAorICogYmFja3F1b3RlIGZvdW5kIHdpdGhvdXQgYSBwcmVjZWRpbmcgYmFja3NsYXNoOyBkdXJpbmcgdGhpcyBzZWFyY2gsCisgKiBpZiBhIG5vbi1lc2NhcGVkIGJhY2txdW90ZSBpcyBlbmNvdW50ZXJlZCB3aXRoaW4gYSBzaGVsbCBjb21tZW50LAorICogYSBoZXJlLWRvY3VtZW50LCBhbiBlbWJlZGRlZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBvZiB0aGUgJChjb21tYW5kKQorICogZm9ybSwgb3IgYSBxdW90ZWQgc3RyaW5nLCB1bmRlZmluZWQgcmVzdWx0cyBvY2N1ci4gQSBzaW5nbGUtcXVvdGVkCisgKiBvciBkb3VibGUtcXVvdGVkIHN0cmluZyB0aGF0IGJlZ2lucywgYnV0IGRvZXMgbm90IGVuZCwgd2l0aGluIHRoZQorICogImAuLi5gIiBzZXF1ZW5jZSBwcm9kdWNlcyB1bmRlZmluZWQgcmVzdWx0cy4iCisgKiBFeGFtcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dAorICogZWNobyBgZWNobyAnXCdURVNUXGBlY2hvIFpaXGBCRVNUYCAgICBcVEVTVFpaQkVTVAorICovCitzdGF0aWMgaW50IGFkZF90aWxsX2JhY2txdW90ZShvX3N0cmluZyAqZGVzdCwgc3RydWN0IGluX3N0ciAqaW5wdXQsIGludCBpbl9kcXVvdGUpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IGNoID0gaV9nZXRjaChpbnB1dCk7CisJCWlmIChjaCA9PSAnYCcpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGNoID09ICdcXCcpIHsKKwkJCS8qIFx4LiBDb3B5IGJvdGggdW5sZXNzIGl0IGlzIFxgLCBcJCwgXFwgYW5kIG1heWJlIFwiICovCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJaWYgKGNoICE9ICdgJworCQkJICYmIGNoICE9ICckJworCQkJICYmIGNoICE9ICdcXCcKKwkJCSAmJiAoIWluX2RxdW90ZSB8fCBjaCAhPSAnIicpCisJCQkpIHsKKwkJCQlvX2FkZGNocihkZXN0LCAnXFwnKTsKKwkJCX0KKwkJfQorCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCdgJyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvX2FkZGNocihkZXN0LCBjaCk7CisJfQorfQorLyogUHJvY2VzcyAkKGNtZCkgLSBjb3B5IGNvbnRlbnRzIHVudGlsICIpIiBpcyBzZWVuLiBDb21wbGljYXRlZCBieQorICogcXVvdGluZyBhbmQgbmVzdGVkICgpcy4KKyAqICJXaXRoIHRoZSAkKGNvbW1hbmQpIHN0eWxlIG9mIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBhbGwgY2hhcmFjdGVycworICogZm9sbG93aW5nIHRoZSBvcGVuIHBhcmVudGhlc2lzIHRvIHRoZSBtYXRjaGluZyBjbG9zaW5nIHBhcmVudGhlc2lzCisgKiBjb25zdGl0dXRlIHRoZSBjb21tYW5kLiBBbnkgdmFsaWQgc2hlbGwgc2NyaXB0IGNhbiBiZSB1c2VkIGZvciBjb21tYW5kLAorICogZXhjZXB0IGEgc2NyaXB0IGNvbnNpc3Rpbmcgc29sZWx5IG9mIHJlZGlyZWN0aW9ucyB3aGljaCBwcm9kdWNlcworICogdW5zcGVjaWZpZWQgcmVzdWx0cy4iCisgKiBFeGFtcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0CisgKiBlY2hvICQoZWNobyAnKFRFU1QpJyBCRVNUKSAgICAgICAgICAgKFRFU1QpIEJFU1QKKyAqIGVjaG8gJChlY2hvICdURVNUKScgQkVTVCkgICAgICAgICAgICBURVNUKSBCRVNUCisgKiBlY2hvICQoZWNobyBcKFwoVEVTVFwpIEJFU1QpICAgICAgICAgKChURVNUKSBCRVNUCisgKgorICogQWxzbyBhZGFwdGVkIHRvIGVhdCAke3ZhciUuLi59IGFuZCAkKCguLi4pKSBjb25zdHJ1Y3RzLCBzaW5jZSAuLi4gcGFydAorICogY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGNvbnN0cnVjdHMsIGp1c3QgbGlrZSAkKGNtZCkuCisgKiBJbiBiYXNoIGNvbXBhdCBtb2RlLCBpdCBuZWVkcyB0byBhbHNvIGJlIGFibGUgdG8gc3RvcCBvbiAnOicgb3IgJy8nCisgKiBmb3IgJHt2YXI6Tls6TV19IGFuZCAke3Zhci9QWy9SXX0gcGFyc2luZy4KKyAqLworI2RlZmluZSBET1VCTEVfQ0xPU0VfQ0hBUl9GTEFHIDB4ODAKK3N0YXRpYyBpbnQgYWRkX3RpbGxfY2xvc2luZ19icmFja2V0KG9fc3RyaW5nICpkZXN0LCBzdHJ1Y3QgaW5fc3RyICppbnB1dCwgdW5zaWduZWQgZW5kX2NoKQoreworCWludCBjaDsKKwljaGFyIGRibCA9IGVuZF9jaCAmIERPVUJMRV9DTE9TRV9DSEFSX0ZMQUc7CisjIGlmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJY2hhciBlbmRfY2hhcjIgPSBlbmRfY2ggPj4gODsKKyMgZW5kaWYKKwllbmRfY2ggJj0gKERPVUJMRV9DTE9TRV9DSEFSX0ZMQUcgLSAxKTsKKworCXdoaWxlICgxKSB7CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goZW5kX2NoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChjaCA9PSBlbmRfY2ggIElGX0hVU0hfQkFTSF9DT01QQVQoIHx8IGNoID09IGVuZF9jaGFyMikpIHsKKwkJCWlmICghZGJsKQorCQkJCWJyZWFrOworCQkJLyogd2UgbG9vayBmb3IgY2xvc2luZyApKSBvZiAkKChFWFBSKSkgKi8KKwkJCWlmIChpX3BlZWsoaW5wdXQpID09IGVuZF9jaCkgeworCQkJCWlfZ2V0Y2goaW5wdXQpOyAvKiBlYXQgc2Vjb25kICcpJyAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJaWYgKGNoID09ICcoJyB8fCBjaCA9PSAneycpIHsKKwkJCWNoID0gKGNoID09ICcoJyA/ICcpJyA6ICd9Jyk7CisJCQlpZiAoIWFkZF90aWxsX2Nsb3NpbmdfYnJhY2tldChkZXN0LCBpbnB1dCwgY2gpKQorCQkJCXJldHVybiAwOworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoID09ICdcJycpIHsKKwkJCWlmICghYWRkX3RpbGxfc2luZ2xlX3F1b3RlKGRlc3QsIGlucHV0KSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaCA9PSAnIicpIHsKKwkJCWlmICghYWRkX3RpbGxfZG91YmxlX3F1b3RlKGRlc3QsIGlucHV0KSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaCA9PSAnYCcpIHsKKwkJCWlmICghYWRkX3RpbGxfYmFja3F1b3RlKGRlc3QsIGlucHV0LCAvKmluX2RxdW90ZToqLyAwKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaCA9PSAnXFwnKSB7CisJCQkvKiBceC4gQ29weSB2ZXJiYXRpbS4gSW1wb3J0YW50IGZvciAgXCgsIFwpICovCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJaWYgKGNoID09IEVPRikgeworCQkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJyknKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiBjaDsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSFVTSF9USUNLIHx8IEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQgfHwgRU5BQkxFX0hVU0hfRE9MTEFSX09QUyAqLworCisvKiBSZXR1cm4gY29kZTogMCBmb3IgT0ssIDEgZm9yIHN5bnRheCBlcnJvciAqLworI2lmIEJCX01NVQorI2RlZmluZSBwYXJzZV9kb2xsYXIoYXNfc3RyaW5nLCBkZXN0LCBpbnB1dCwgcXVvdGVfbWFzaykgXAorCXBhcnNlX2RvbGxhcihkZXN0LCBpbnB1dCwgcXVvdGVfbWFzaykKKyNkZWZpbmUgYXNfc3RyaW5nIE5VTEwKKyNlbmRpZgorc3RhdGljIGludCBwYXJzZV9kb2xsYXIob19zdHJpbmcgKmFzX3N0cmluZywKKwkJb19zdHJpbmcgKmRlc3QsCisJCXN0cnVjdCBpbl9zdHIgKmlucHV0LCB1bnNpZ25lZCBjaGFyIHF1b3RlX21hc2spCit7CisJaW50IGNoID0gaV9wZWVrKGlucHV0KTsgIC8qIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgJCAqLworCisJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9kb2xsYXIgZW50ZXJlZDogY2g9JyVjJ1xuIiwgY2gpOworCWlmIChpc2FscGhhKGNoKSkgeworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisgbWFrZV92YXI6CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCXdoaWxlICgxKSB7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIjogJyVjJ1xuIiwgY2gpOworCQkJb19hZGRjaHIoZGVzdCwgY2ggfCBxdW90ZV9tYXNrKTsKKwkJCXF1b3RlX21hc2sgPSAwOworCQkJY2ggPSBpX3BlZWsoaW5wdXQpOworCQkJaWYgKCFpc2FsbnVtKGNoKSAmJiBjaCAhPSAnXycpCisJCQkJYnJlYWs7CisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQl9CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJfSBlbHNlIGlmIChpc2RpZ2l0KGNoKSkgeworIG1ha2Vfb25lX2NoYXJfdmFyOgorCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiOiAnJWMnXG4iLCBjaCk7CisJCW9fYWRkY2hyKGRlc3QsIGNoIHwgcXVvdGVfbWFzayk7CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJfSBlbHNlIHN3aXRjaCAoY2gpIHsKKwljYXNlICckJzogLyogcGlkICovCisJY2FzZSAnISc6IC8qIGxhc3QgYmcgcGlkICovCisJY2FzZSAnPyc6IC8qIGxhc3QgZXhpdCBjb2RlICovCisJY2FzZSAnIyc6IC8qIG51bWJlciBvZiBhcmdzICovCisJY2FzZSAnKic6IC8qIGFyZ3MgKi8KKwljYXNlICdAJzogLyogYXJncyAqLworCQlnb3RvIG1ha2Vfb25lX2NoYXJfdmFyOworCWNhc2UgJ3snOiB7CisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsgLyogZWF0ICd7JyAqLworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsgLyogZmlyc3QgY2hhciBhZnRlciAneycgKi8KKwkJLyogSXQgc2hvdWxkIGJlICR7P30sIG9yICR7I3Zhcn0sCisJCSAqIG9yIGV2ZW4gJHs/K3N1YnN0fSAtIG9wZXJhdG9yIGFjdGluZyBvbiBhIHNwZWNpYWwgdmFyaWFibGUsCisJCSAqIG9yIHRoZSBiZWdpbm5pbmcgb2YgdmFyaWFibGUgbmFtZS4KKwkJICovCisJCWlmIChjaCA9PSBFT0YKKwkJIHx8ICghc3RyY2hyKF9TUEVDSUFMX1ZBUlNfU1RSLCBjaCkgJiYgIWlzYWxudW0oY2gpKSAvKiBub3Qgb25lIG9mIHRob3NlICovCisJCSkgeworIGJhZF9kb2xsYXJfc3ludGF4OgorCQkJc3ludGF4X2Vycm9yX3VudGVybV9zdHIoIiR7bmFtZX0iKTsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZG9sbGFyIHJldHVybiAwOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCWNoIHw9IHF1b3RlX21hc2s7CisKKwkJLyogSXQncyBwb3NzaWJsZSB0byBqdXN0IGNhbGwgYWRkX3RpbGxfY2xvc2luZ19icmFja2V0KCkgYXQgdGhpcyBwb2ludC4KKwkJICogSG93ZXZlciwgdGhpcyByZWdyZXNzZXMgc29tZSBvZiBvdXIgdGVzdHN1aXRlIGNhc2VzCisJCSAqIHdoaWNoIGNoZWNrIGludmFsaWQgY29uc3RydWN0cyBsaWtlICR7JX0uCisJCSAqIE9oIHdlbGwuLi4gbGV0J3MgY2hlY2sgdGhhdCB0aGUgdmFyIG5hbWUgcGFydCBpcyBmaW5lLi4uICovCisKKwkJd2hpbGUgKDEpIHsKKwkJCXVuc2lnbmVkIHBvczsKKworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCI6ICclYydcbiIsIGNoKTsKKworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJCWlmIChjaCA9PSAnfScpCisJCQkJYnJlYWs7CisKKwkJCWlmICghaXNhbG51bShjaCkgJiYgY2ggIT0gJ18nKSB7CisJCQkJdW5zaWduZWQgZW5kX2NoOworCQkJCXVuc2lnbmVkIGNoYXIgbGFzdF9jaDsKKwkJCQkvKiBoYW5kbGUgcGFyYW1ldGVyIGV4cGFuc2lvbnMKKwkJCQkgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3hjdV9jaGFwMDIuaHRtbCN0YWdfMDJfMDZfMDIKKwkJCQkgKi8KKwkJCQlpZiAoIXN0cmNocihWQVJfU1VCU1RfT1BTLCBjaCkpIC8qICR7dmFyPGJhZF9jaGFyPi4uLiAqLworCQkJCQlnb3RvIGJhZF9kb2xsYXJfc3ludGF4OworCisJCQkJLyogRWF0IGV2ZXJ5dGhpbmcgdW50aWwgY2xvc2luZyAnfScgKG9yICc6JykgKi8KKwkJCQllbmRfY2ggPSAnfSc7CisJCQkJaWYgKEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJCQkJICYmIGNoID09ICc6JworCQkJCSAmJiAhc3RyY2hyKE1JTlVTX1BMVVNfRVFVQUxfUVVFU1RJT04sIGlfcGVlayhpbnB1dCkpCisJCQkJKSB7CisJCQkJCS8qIEl0J3MgJHt2YXI6Tls6TV19IHRoaW5nICovCisJCQkJCWVuZF9jaCA9ICd9JyAqIDB4MTAwICsgJzonOworCQkJCX0KKwkJCQlpZiAoRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwkJCQkgJiYgY2ggPT0gJy8nCisJCQkJKSB7CisJCQkJCS8qIEl0J3MgJHt2YXIvWy9dcGF0dGVyblsvcmVwbF19IHRoaW5nICovCisJCQkJCWlmIChpX3BlZWsoaW5wdXQpID09ICcvJykgeyAvKiAke3Zhci8vcGF0dGVyblsvcmVwbF19PyAqLworCQkJCQkJaV9nZXRjaChpbnB1dCk7CisJCQkJCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCAnLycpOworCQkJCQkJY2ggPSAnXFwnOworCQkJCQl9CisJCQkJCWVuZF9jaCA9ICd9JyAqIDB4MTAwICsgJy8nOworCQkJCX0KKwkJCQlvX2FkZGNocihkZXN0LCBjaCk7CisgYWdhaW46CisJCQkJaWYgKCFCQl9NTVUpCisJCQkJCXBvcyA9IGRlc3QtPmxlbmd0aDsKKyNpZiBFTkFCTEVfSFVTSF9ET0xMQVJfT1BTCisJCQkJbGFzdF9jaCA9IGFkZF90aWxsX2Nsb3NpbmdfYnJhY2tldChkZXN0LCBpbnB1dCwgZW5kX2NoKTsKKwkJCQlpZiAobGFzdF9jaCA9PSAwKSAvKiBlcnJvcj8gKi8KKwkJCQkJcmV0dXJuIDA7CisjZWxzZQorI2Vycm9yIFNpbXBsZSBjb2RlIHRvIG9ubHkgYWxsb3cgJHt2YXJ9IGlzIG5vdCBpbXBsZW1lbnRlZAorI2VuZGlmCisJCQkJaWYgKGFzX3N0cmluZykgeworCQkJCQlvX2FkZHN0cihhc19zdHJpbmcsIGRlc3QtPmRhdGEgKyBwb3MpOworCQkJCQlvX2FkZGNocihhc19zdHJpbmcsIGxhc3RfY2gpOworCQkJCX0KKworCQkJCWlmIChFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVCAmJiAoZW5kX2NoICYgMHhmZjAwKSkgeworCQkJCQkvKiBjbG9zZSB0aGUgZmlyc3QgYmxvY2s6ICovCisJCQkJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQkJCS8qIHdoaWxlIHBhcnNpbmcgTiBmcm9tICR7dmFyOk5bOk1dfQorCQkJCQkgKiBvciBwYXR0ZXJuIGZyb20gJHt2YXIvWy9dcGF0dGVyblsvcmVwbF19ICovCisJCQkJCWlmICgoZW5kX2NoICYgMHhmZikgPT0gbGFzdF9jaCkgeworCQkJCQkJLyogZ290ICc6JyBvciAnLyctIHBhcnNlIHRoZSByZXN0ICovCisJCQkJCQllbmRfY2ggPSAnfSc7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQl9CisJCQkJCS8qIGdvdCAnfScgKi8KKwkJCQkJaWYgKGVuZF9jaCA9PSAnfScgKiAweDEwMCArICc6JykgeworCQkJCQkJLyogaXQncyAke3ZhcjpOfSAtIGVtdWxhdGUgOjk5OTk5OTk5OSAqLworCQkJCQkJb19hZGRzdHIoZGVzdCwgIjk5OTk5OTk5OSIpOworCQkJCQl9IC8qIGVsc2U6IGl0J3MgJHt2YXIvWy9dcGF0dGVybn0gKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJYnJlYWs7CisJfQorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQgfHwgRU5BQkxFX0hVU0hfVElDSworCWNhc2UgJygnOiB7CisJCXVuc2lnbmVkIHBvczsKKworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisjIGlmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJaWYgKGlfcGVlayhpbnB1dCkgPT0gJygnKSB7CisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCW9fYWRkY2hyKGRlc3QsIC8qcXVvdGVfbWFzayB8Ki8gJysnKTsKKwkJCWlmICghQkJfTU1VKQorCQkJCXBvcyA9IGRlc3QtPmxlbmd0aDsKKwkJCWlmICghYWRkX3RpbGxfY2xvc2luZ19icmFja2V0KGRlc3QsIGlucHV0LCAnKScgfCBET1VCTEVfQ0xPU0VfQ0hBUl9GTEFHKSkKKwkJCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KKwkJCWlmIChhc19zdHJpbmcpIHsKKwkJCQlvX2FkZHN0cihhc19zdHJpbmcsIGRlc3QtPmRhdGEgKyBwb3MpOworCQkJCW9fYWRkY2hyKGFzX3N0cmluZywgJyknKTsKKwkJCQlvX2FkZGNocihhc19zdHJpbmcsICcpJyk7CisJCQl9CisJCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJYnJlYWs7CisJCX0KKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfVElDSworCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQlvX2FkZGNocihkZXN0LCBxdW90ZV9tYXNrIHwgJ2AnKTsKKwkJaWYgKCFCQl9NTVUpCisJCQlwb3MgPSBkZXN0LT5sZW5ndGg7CisJCWlmICghYWRkX3RpbGxfY2xvc2luZ19icmFja2V0KGRlc3QsIGlucHV0LCAnKScpKQorCQkJcmV0dXJuIDA7IC8qIGVycm9yICovCisJCWlmIChhc19zdHJpbmcpIHsKKwkJCW9fYWRkc3RyKGFzX3N0cmluZywgZGVzdC0+ZGF0YSArIHBvcyk7CisJCQlvX2FkZGNocihhc19zdHJpbmcsICcpJyk7CisJCX0KKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKyMgZW5kaWYKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSAnXyc6CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJY2ggPSBpX3BlZWsoaW5wdXQpOworCQlpZiAoaXNhbG51bShjaCkpIHsgLyogaXQncyAkX25hbWUgb3IgJF8xMjMgKi8KKwkJCWNoID0gJ18nOworCQkJZ290byBtYWtlX3ZhcjsKKwkJfQorCQkvKiBlbHNlOiBpdCdzICRfICovCisJLyogVE9ETzogJF8gYW5kICQtOiAqLworCS8qICRfIFNoZWxsIG9yIHNoZWxsIHNjcmlwdCBuYW1lOyBvciBsYXN0IGFyZ3VtZW50IG9mIGxhc3QgY29tbWFuZAorCSAqIChpZiBsYXN0IGNvbW1hbmQgd2Fzbid0IGEgcGlwZTsgaWYgaXQgd2FzLCBiYXNoIHNldHMgJF8gdG8gIiIpOworCSAqIGJ1dCBpbiBjb21tYW5kJ3MgZW52LCBzZXQgdG8gZnVsbCBwYXRobmFtZSB1c2VkIHRvIGludm9rZSBpdCAqLworCS8qICQtIE9wdGlvbiBmbGFncyBzZXQgYnkgc2V0IGJ1aWx0aW4gb3Igc2hlbGwgb3B0aW9ucyAoLWkgZXRjKSAqLworCWRlZmF1bHQ6CisJCW9fYWRkUWNocihkZXN0LCAnJCcpOworCX0KKwlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2RvbGxhciByZXR1cm4gMSAob2spXG4iKTsKKwlyZXR1cm4gMTsKKyN1bmRlZiBhc19zdHJpbmcKK30KKworI2lmIEJCX01NVQorIyBpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorI2RlZmluZSBlbmNvZGVfc3RyaW5nKGFzX3N0cmluZywgZGVzdCwgaW5wdXQsIGRxdW90ZV9lbmQsIHByb2Nlc3NfYmtzbGFzaCkgXAorCWVuY29kZV9zdHJpbmcoZGVzdCwgaW5wdXQsIGRxdW90ZV9lbmQsIHByb2Nlc3NfYmtzbGFzaCkKKyMgZWxzZQorLyogb25seSAke3Zhci9wYXR0ZXJuL3JlcGx9IChpdHMgcGF0dGVybiBwYXJ0KSBuZWVkcyBhZGRpdGlvbmFsIG1vZGUgKi8KKyNkZWZpbmUgZW5jb2RlX3N0cmluZyhhc19zdHJpbmcsIGRlc3QsIGlucHV0LCBkcXVvdGVfZW5kLCBwcm9jZXNzX2Jrc2xhc2gpIFwKKwllbmNvZGVfc3RyaW5nKGRlc3QsIGlucHV0LCBkcXVvdGVfZW5kKQorIyBlbmRpZgorI2RlZmluZSBhc19zdHJpbmcgTlVMTAorCisjZWxzZSAvKiAhTU1VICovCisKKyMgaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qIGFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQsIG5vIG1hY3JvIHRyaWNrcyAqLworIyBlbHNlCisjZGVmaW5lIGVuY29kZV9zdHJpbmcoYXNfc3RyaW5nLCBkZXN0LCBpbnB1dCwgZHF1b3RlX2VuZCwgcHJvY2Vzc19ia3NsYXNoKSBcCisJZW5jb2RlX3N0cmluZyhhc19zdHJpbmcsIGRlc3QsIGlucHV0LCBkcXVvdGVfZW5kKQorIyBlbmRpZgorI2VuZGlmCitzdGF0aWMgaW50IGVuY29kZV9zdHJpbmcob19zdHJpbmcgKmFzX3N0cmluZywKKwkJb19zdHJpbmcgKmRlc3QsCisJCXN0cnVjdCBpbl9zdHIgKmlucHV0LAorCQlpbnQgZHF1b3RlX2VuZCwKKwkJaW50IHByb2Nlc3NfYmtzbGFzaCkKK3sKKyNpZiAhRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwljb25zdCBpbnQgcHJvY2Vzc19ia3NsYXNoID0gMTsKKyNlbmRpZgorCWludCBjaDsKKwlpbnQgbmV4dDsKKworIGFnYWluOgorCWNoID0gaV9nZXRjaChpbnB1dCk7CisJaWYgKGNoICE9IEVPRikKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCWlmIChjaCA9PSBkcXVvdGVfZW5kKSB7IC8qIG1heSBiZSBvbmx5ICciJyBvciBFT0YgKi8KKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJlbmNvZGVfc3RyaW5nIHJldHVybiAxIChvaylcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogbm90ZTogY2FuJ3QgbW92ZSBpdCBhYm92ZSBjaCA9PSBkcXVvdGVfZW5kIGNoZWNrISAqLworCWlmIChjaCA9PSBFT0YpIHsKKwkJc3ludGF4X2Vycm9yX3VudGVybV9jaCgnIicpOworCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KKwl9CisJbmV4dCA9ICdcMCc7CisJaWYgKGNoICE9ICdcbicpIHsKKwkJbmV4dCA9IGlfcGVlayhpbnB1dCk7CisJfQorCWRlYnVnX3ByaW50Zl9wYXJzZSgiXCIgY2g9JWMgKCVkKSBlc2NhcGU9JWRcbiIsCisJCQljaCwgY2gsICEhKGRlc3QtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUykpOworCWlmIChwcm9jZXNzX2Jrc2xhc2ggJiYgY2ggPT0gJ1xcJykgeworCQlpZiAobmV4dCA9PSBFT0YpIHsKKwkJCXN5bnRheF9lcnJvcigiXFw8ZW9mPiIpOworCQkJeGZ1bmNfZGllKCk7CisJCX0KKwkJLyogYmFzaDoKKwkJICogIlRoZSBiYWNrc2xhc2ggcmV0YWlucyBpdHMgc3BlY2lhbCBtZWFuaW5nIFtpbiAiLi4uIl0KKwkJICogb25seSB3aGVuIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6CisJCSAqICQsIGAsICIsIFwsIG9yIDxuZXdsaW5lPi4gIEEgZG91YmxlIHF1b3RlIG1heSBiZSBxdW90ZWQKKwkJICogd2l0aGluIGRvdWJsZSBxdW90ZXMgYnkgcHJlY2VkaW5nIGl0IHdpdGggYSBiYWNrc2xhc2guIgorCQkgKiBOQjogaW4gKHVucXVvdGVkKSBoZXJlZG9jLCBhYm92ZSBkb2VzIG5vdCBhcHBseSB0byAiLAorCQkgKiB0aGVyZWZvcmUgd2UgY2hlY2sgZm9yIGl0IGJ5ICJuZXh0ID09IGRxdW90ZV9lbmQiIGNvbmQuCisJCSAqLworCQlpZiAobmV4dCA9PSBkcXVvdGVfZW5kIHx8IHN0cmNocigiJGBcXFxuIiwgbmV4dCkpIHsKKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7IC8qIGVhdCBuZXh0ICovCisJCQlpZiAoY2ggPT0gJ1xuJykKKwkJCQlnb3RvIGFnYWluOyAvKiBza2lwIFw8bmV3bGluZT4gKi8KKwkJfSAvKiBlbHNlOiBjaCByZW1haW5zID09ICdcXCcsIGFuZCB3ZSBkb3VibGUgaXQgYmVsb3c6ICovCisJCW9fYWRkcWNocihkZXN0LCBjaCk7IC8qIFxjIGlmIGMgaXMgYSBnbG9iIGNoYXIsIGVsc2UganVzdCBjICovCisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKGNoID09ICckJykgeworCQlpZiAoIXBhcnNlX2RvbGxhcihhc19zdHJpbmcsIGRlc3QsIGlucHV0LCAvKnF1b3RlX21hc2s6Ki8gMHg4MCkpIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZW5jb2RlX3N0cmluZyByZXR1cm4gMDogIgorCQkJCQkicGFyc2VfZG9sbGFyIHJldHVybmVkIDAgKGVycm9yKVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlnb3RvIGFnYWluOworCX0KKyNpZiBFTkFCTEVfSFVTSF9USUNLCisJaWYgKGNoID09ICdgJykgeworCQkvL3Vuc2lnbmVkIHBvcyA9IGRlc3QtPmxlbmd0aDsKKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJb19hZGRjaHIoZGVzdCwgMHg4MCB8ICdgJyk7CisJCWlmICghYWRkX3RpbGxfYmFja3F1b3RlKGRlc3QsIGlucHV0LCAvKmluX2RxdW90ZToqLyBkcXVvdGVfZW5kID09ICciJykpCisJCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJLy9kZWJ1Z19wcmludGZfc3Vic3QoIlNVQlNUIFJFUzMgJyVzJ1xuIiwgZGVzdC0+ZGF0YSArIHBvcyk7CisJCWdvdG8gYWdhaW47CisJfQorI2VuZGlmCisJb19hZGRRY2hyKGRlc3QsIGNoKTsKKwlnb3RvIGFnYWluOworI3VuZGVmIGFzX3N0cmluZworfQorCisvKgorICogU2NhbiBpbnB1dCB1bnRpbCBFT0Ygb3IgZW5kX3RyaWdnZXIgY2hhci4KKyAqIFJldHVybiBhIGxpc3Qgb2YgcGlwZXMgdG8gZXhlY3V0ZSwgb3IgTlVMTCBvbiBFT0YKKyAqIG9yIGlmIGVuZF90cmlnZ2VyIGNoYXJhY3RlciBpcyBtZXQuCisgKiBPbiBzeW50YXggZXJyb3IsIGV4aXQgaWYgc2hlbGwgaXMgbm90IGludGVyYWN0aXZlLAorICogcmVzZXQgcGFyc2luZyBtYWNoaW5lcnkgYW5kIHN0YXJ0IHBhcnNpbmcgYW5ldywKKyAqIG9yIHJldHVybiBFUlJfUFRSLgorICovCitzdGF0aWMgc3RydWN0IHBpcGUgKnBhcnNlX3N0cmVhbShjaGFyICoqcHN0cmluZywKKwkJc3RydWN0IGluX3N0ciAqaW5wdXQsCisJCWludCBlbmRfdHJpZ2dlcikKK3sKKwlzdHJ1Y3QgcGFyc2VfY29udGV4dCBjdHg7CisJb19zdHJpbmcgZGVzdCA9IE5VTExfT19TVFJJTkc7CisJaW50IGhlcmVkb2NfY250OworCisJLyogU2luZ2xlLXF1b3RlIHRyaWdnZXJzIGEgYnlwYXNzIG9mIHRoZSBtYWluIGxvb3AgdW50aWwgaXRzIG1hdGUgaXMKKwkgKiBmb3VuZC4gIFdoZW4gcmVjdXJzaW5nLCBxdW90ZSBzdGF0ZSBpcyBwYXNzZWQgaW4gdmlhIGRlc3QtPm9fZXhwZmxhZ3MuCisJICovCisJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9zdHJlYW0gZW50ZXJlZCwgZW5kX3RyaWdnZXI9JyVjJ1xuIiwKKwkJCWVuZF90cmlnZ2VyID8gZW5kX3RyaWdnZXIgOiAnWCcpOworCWRlYnVnX2VudGVyKCk7CisKKwkvKiBJZiB2ZXJ5IGZpcnN0IGFyZyBpcyAiIiBvciAnJywgZGVzdC5kYXRhIG1heSBlbmQgdXAgTlVMTC4KKwkgKiBQcmV2ZW50aW5nIHRoaXM6ICovCisJb19hZGRjaHIoJmRlc3QsICdcMCcpOworCWRlc3QubGVuZ3RoID0gMDsKKworCS8qIFdlIHVzZWQgdG8gc2VwYXJhdGUgd29yZHMgb24gJElGUyBoZXJlLiBUaGlzIHdhcyB3cm9uZy4KKwkgKiAkSUZTIGlzIHVzZWQgb25seSBmb3Igd29yZCBzcGxpdHRpbmcgd2hlbiAkdmFyIGlzIGV4cGFuZGVkLAorCSAqIGhlcmUgd2Ugc2hvdWxkIHVzZSBibGFuayBjaGFycyBhcyBzZXBhcmF0b3JzLCBub3QgJElGUworCSAqLworCisJaWYgKE1BWUJFX0FTU0lHTk1FTlQgIT0gMCkKKwkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCWluaXRpYWxpemVfY29udGV4dCgmY3R4KTsKKwloZXJlZG9jX2NudCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqaXNfYmxhbms7CisJCWNvbnN0IGNoYXIgKmlzX3NwZWNpYWw7CisJCWludCBjaDsKKwkJaW50IG5leHQ7CisJCWludCByZWRpcl9mZDsKKwkJcmVkaXJfdHlwZSByZWRpcl9zdHlsZTsKKworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlkZWJ1Z19wcmludGZfcGFyc2UoIjogY2g9JWMgKCVkKSBlc2NhcGU9JWRcbiIsCisJCQkJY2gsIGNoLCAhIShkZXN0Lm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUykpOworCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlzdHJ1Y3QgcGlwZSAqcGk7CisKKwkJCWlmIChoZXJlZG9jX2NudCkgeworCQkJCXN5bnRheF9lcnJvcl91bnRlcm1fc3RyKCJoZXJlIGRvY3VtZW50Iik7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCS8qIGVuZF90cmlnZ2VyID09ICd9JyBjYXNlIGVycm9ycyBvdXQgZWFybGllciwKKwkJCSAqIGNoZWNraW5nIG9ubHkgJyknICovCisJCQlpZiAoZW5kX3RyaWdnZXIgPT0gJyknKSB7CisJCQkJc3ludGF4X2Vycm9yX3VudGVybV9jaCgnKCcpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCW9fZnJlZSgmZGVzdCk7CisJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9TRVEpOworCQkJcGkgPSBjdHgubGlzdF9oZWFkOworCQkJLyogSWYgd2UgZ290IG5vdGhpbmcuLi4gKi8KKwkJCS8qICh0aGlzIG1ha2VzIGJhcmUgIiYiIGNtZCBhIG5vLW9wLgorCQkJICogYmFzaCBzYXlzOiAic3ludGF4IGVycm9yIG5lYXIgdW5leHBlY3RlZCB0b2tlbiAnJiciKSAqLworCQkJaWYgKHBpLT5udW1fY21kcyA9PSAwCisJCQkgICAgSUZfSEFTX0tFWVdPUkRTKCAmJiBwaS0+cmVzX3dvcmQgPT0gUkVTX05PTkUpCisJCQkpIHsKKwkJCQlmcmVlX3BpcGVfbGlzdChwaSk7CisJCQkJcGkgPSBOVUxMOworCQkJfQorI2lmICFCQl9NTVUKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiYXNfc3RyaW5nICclcydcbiIsIGN0eC5hc19zdHJpbmcuZGF0YSk7CisJCQlpZiAocHN0cmluZykKKwkJCQkqcHN0cmluZyA9IGN0eC5hc19zdHJpbmcuZGF0YTsKKwkJCWVsc2UKKwkJCQlvX2ZyZWVfdW5zYWZlKCZjdHguYXNfc3RyaW5nKTsKKyNlbmRpZgorCQkJZGVidWdfbGVhdmUoKTsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2Vfc3RyZWFtIHJldHVybiAlcFxuIiwgcGkpOworCQkJcmV0dXJuIHBpOworCQl9CisJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgY2gpOworCisJCW5leHQgPSAnXDAnOworCQlpZiAoY2ggIT0gJ1xuJykKKwkJCW5leHQgPSBpX3BlZWsoaW5wdXQpOworCisJCWlzX3NwZWNpYWwgPSAie308PjsmfCgpIyciIC8qIHNwZWNpYWwgb3V0c2lkZSBvZiAic3RyIiAqLworCQkJCSJcXCRcIiIgSUZfSFVTSF9USUNLKCJgIik7IC8qIGFsd2F5cyBzcGVjaWFsICovCisJCS8qIEFyZSB7IGFuZCB9IHNwZWNpYWwgaGVyZT8gKi8KKwkJaWYgKGN0eC5jb21tYW5kLT5hcmd2IC8qIHdvcmQgW3dvcmRdey4uLiAtIG5vbi1zcGVjaWFsICovCisJCSB8fCBkZXN0Lmxlbmd0aCAgICAgICAvKiB3b3Jkey4uLiAtIG5vbi1zcGVjaWFsICovCisJCSB8fCBkZXN0Lmhhc19xdW90ZWRfcGFydCAgICAgLyogIiJ7Li4uIC0gbm9uLXNwZWNpYWwgKi8KKwkJIHx8IChuZXh0ICE9ICc7JyAgICAgICAgICAgICAvKiB9OyAtIHNwZWNpYWwgKi8KKwkJICAgICYmIG5leHQgIT0gJyknICAgICAgICAgICAvKiB9KSAtIHNwZWNpYWwgKi8KKwkJICAgICYmIG5leHQgIT0gJyYnICAgICAgICAgICAvKiB9JiBhbmQgfSYmIC4uLiAtIHNwZWNpYWwgKi8KKwkJICAgICYmIG5leHQgIT0gJ3wnICAgICAgICAgICAvKiB9fHwgLi4uIC0gc3BlY2lhbCAqLworCQkgICAgJiYgIXN0cmNocihkZWZpZnMsIG5leHQpIC8qIHt3b3JkIC0gbm9uLXNwZWNpYWwgKi8KKwkJICAgICkKKwkJKSB7CisJCQkvKiBUaGV5IGFyZSBub3Qgc3BlY2lhbCwgc2tpcCAie30iICovCisJCQlpc19zcGVjaWFsICs9IDI7CisJCX0KKwkJaXNfc3BlY2lhbCA9IHN0cmNocihpc19zcGVjaWFsLCBjaCk7CisJCWlzX2JsYW5rID0gc3RyY2hyKGRlZmlmcywgY2gpOworCisJCWlmICghaXNfc3BlY2lhbCAmJiAhaXNfYmxhbmspIHsgLyogb3JkaW5hcnkgY2hhciAqLworIG9yZGluYXJ5X2NoYXI6CisJCQlvX2FkZFFjaHIoJmRlc3QsIGNoKTsKKwkJCWlmICgoZGVzdC5vX2Fzc2lnbm1lbnQgPT0gTUFZQkVfQVNTSUdOTUVOVAorCQkJICAgIHx8IGRlc3Qub19hc3NpZ25tZW50ID09IFdPUkRfSVNfS0VZV09SRCkKKwkJCSAmJiBjaCA9PSAnPScKKwkJCSAmJiBpc193ZWxsX2Zvcm1lZF92YXJfbmFtZShkZXN0LmRhdGEsICc9JykKKwkJCSkgeworCQkJCWRlc3Qub19hc3NpZ25tZW50ID0gREVGSU5JVEVMWV9BU1NJR05NRU5UOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZGVzdC5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW2Rlc3Qub19hc3NpZ25tZW50XSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpc19ibGFuaykgeworCQkJaWYgKGRvbmVfd29yZCgmZGVzdCwgJmN0eCkpIHsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJaWYgKGNoID09ICdcbicpIHsKKwkJCQkvKiBJcyB0aGlzIGEgY2FzZSB3aGVuIG5ld2xpbmUgaXMgc2ltcGx5IGlnbm9yZWQ/CisJCQkJICogU29tZSBleGFtcGxlczoKKwkJCQkgKiAiY21kIHwgPG5ld2xpbmU+IGNtZCAuLi4iCisJCQkJICogImNhc2UgLi4uIGluIDxuZXdsaW5lPiB3b3JkKSAuLi4iCisJCQkJICovCisJCQkJaWYgKElTX05VTExfQ01EKGN0eC5jb21tYW5kKQorCQkJCSAmJiBkZXN0Lmxlbmd0aCA9PSAwICYmICFkZXN0Lmhhc19xdW90ZWRfcGFydAorCQkJCSkgeworCQkJCQkvKiBUaGlzIG5ld2xpbmUgY2FuIGJlIGlnbm9yZWQuIEJ1dC4uLgorCQkJCQkgKiBXaXRob3V0IGNoZWNrICMxLCBpbnRlcmFjdGl2ZSBzaGVsbAorCQkJCQkgKiBpZ25vcmVzIGV2ZW4gYmFyZSA8bmV3bGluZT4sCisJCQkJCSAqIGFuZCBzaG93cyB0aGUgY29udGludWF0aW9uIHByb21wdDoKKwkJCQkJICogcHMxX3Byb21wdCQgPGVudGVyPgorCQkJCQkgKiBwczI+IF8gICA8PT09IHdyb25nLCBzaG91bGQgYmUgcHMxCisJCQkJCSAqIFdpdGhvdXQgY2hlY2sgIzIsICJjbWQgJiA8bmV3bGluZT4iCisJCQkJCSAqIGlzIHNpbWlsYXJseSBtaXN0cmVhdGVkLgorCQkJCQkgKiAoQlRXLCB0aGlzIG1ha2VzICJjbWQgJiBjbWQiCisJCQkJCSAqIGFuZCAiY21kICYmIGNtZCIgbm9uLW9ydGhvZ29uYWwuCisJCQkJCSAqIFJlYWxseSwgYXNrIHlvdXJzZWxmLCB3aHkKKwkJCQkJICogImNtZCAmJiA8bmV3bGluZT4iIGRvZXNuJ3Qgc3RhcnQKKwkJCQkJICogY21kIGJ1dCB3YWl0cyBmb3IgbW9yZSBpbnB1dD8KKwkJCQkJICogTm8gcmVhc29uLi4uKQorCQkJCQkgKi8KKwkJCQkJc3RydWN0IHBpcGUgKnBpID0gY3R4Lmxpc3RfaGVhZDsKKwkJCQkJaWYgKHBpLT5udW1fY21kcyAhPSAwICAgICAgIC8qIGNoZWNrICMxICovCisJCQkJCSAmJiBwaS0+Zm9sbG93dXAgIT0gUElQRV9CRyAvKiBjaGVjayAjMiAqLworCQkJCQkpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCS8qIFRyZWF0IG5ld2xpbmUgYXMgYSBjb21tYW5kIHNlcGFyYXRvci4gKi8KKwkJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9TRVEpOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiaGVyZWRvY19jbnQ6JWRcbiIsIGhlcmVkb2NfY250KTsKKwkJCQlpZiAoaGVyZWRvY19jbnQpIHsKKwkJCQkJaWYgKGZldGNoX2hlcmVkb2NzKGhlcmVkb2NfY250LCAmY3R4LCBpbnB1dCkpIHsKKwkJCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQkJCX0KKwkJCQkJaGVyZWRvY19jbnQgPSAwOworCQkJCX0KKwkJCQlkZXN0Lm9fYXNzaWdubWVudCA9IE1BWUJFX0FTU0lHTk1FTlQ7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkZXN0Lm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbZGVzdC5vX2Fzc2lnbm1lbnRdKTsKKwkJCQljaCA9ICc7JzsKKwkJCQkvKiBub3RlOiBpZiAoaXNfYmxhbmspIGNvbnRpbnVlOworCQkJCSAqIHdpbGwgc3RpbGwgdHJpZ2dlciBmb3IgdXMgKi8KKwkJCX0KKwkJfQorCisJCS8qICJjbWR9IiBvciAiY21kIH0uLi4iIHdpdGhvdXQgc2VtaWNvbG9uIG9yICY6CisJCSAqIH0gaXMgYW4gb3JkaW5hcnkgY2hhciBpbiB0aGlzIGNhc2UsIGV2ZW4gaW5zaWRlIHsgY21kOyB9CisJCSAqIFBhdGhvbG9naWNhbCBleGFtcGxlOiB7ICIifTsgfSBzaG91bGQgZXhlYyAifSIgY21kCisJCSAqLworCQlpZiAoY2ggPT0gJ30nKSB7CisJCQlpZiAoIUlTX05VTExfQ01EKGN0eC5jb21tYW5kKSAvKiBjbWQgfSAqLworCQkJIHx8IGRlc3QubGVuZ3RoICE9IDAgLyogd29yZH0gKi8KKwkJCSB8fCBkZXN0Lmhhc19xdW90ZWRfcGFydCAgICAvKiAiIn0gKi8KKwkJCSkgeworCQkJCWdvdG8gb3JkaW5hcnlfY2hhcjsKKwkJCX0KKwkJCWlmICghSVNfTlVMTF9QSVBFKGN0eC5waXBlKSkgLyogY21kIHwgfSAqLworCQkJCWdvdG8gc2tpcF9lbmRfdHJpZ2dlcjsKKwkJCS8qIGVsc2U6IH0gZG9lcyB0ZXJtaW5hdGUgYSBncm91cCAqLworCQl9CisKKwkJaWYgKGVuZF90cmlnZ2VyICYmIGVuZF90cmlnZ2VyID09IGNoCisJCSAmJiAoY2ggIT0gJzsnIHx8IGhlcmVkb2NfY250ID09IDApCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQkgJiYgKGNoICE9ICcpJworCQkgICAgfHwgY3R4LmN0eF9yZXNfdyAhPSBSRVNfTUFUQ0gKKwkJICAgIHx8ICghZGVzdC5oYXNfcXVvdGVkX3BhcnQgJiYgc3RyY21wKGRlc3QuZGF0YSwgImVzYWMiKSA9PSAwKQorCQkgICAgKQorI2VuZGlmCisJCSkgeworCQkJaWYgKGhlcmVkb2NfY250KSB7CisJCQkJLyogVGhpcyBpcyB0ZWNobmljYWxseSB2YWxpZDoKKwkJCQkgKiB7IGNhdCA8PEhFUkU7IH07IGVjaG8gT2sKKwkJCQkgKiBoZXJlZG9jCisJCQkJICogaGVyZWRvYworCQkJCSAqIEhFUkUKKwkJCQkgKiBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzLgorCQkJCSAqIFdlIHJlcXVpcmUgaGVyZWRvYyB0byBiZSBpbiBlbmNsb3Npbmcge30vKCksCisJCQkJICogaWYgYW55LgorCQkJCSAqLworCQkJCXN5bnRheF9lcnJvcl91bnRlcm1fc3RyKCJoZXJlIGRvY3VtZW50Iik7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWRvbmVfcGlwZSgmY3R4LCBQSVBFX1NFUSk7CisJCQlkZXN0Lm9fYXNzaWdubWVudCA9IE1BWUJFX0FTU0lHTk1FTlQ7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRlc3Qub19hc3NpZ25tZW50PSclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1tkZXN0Lm9fYXNzaWdubWVudF0pOworCQkJLyogRG8gd2Ugc2l0IG91dHNpZGUgb2YgYW55IGlmJ3MsIGxvb3BzIG9yIGNhc2Uncz8gKi8KKwkJCWlmICghSEFTX0tFWVdPUkRTCisJCQkgSUZfSEFTX0tFWVdPUkRTKHx8IChjdHguY3R4X3Jlc193ID09IFJFU19OT05FICYmIGN0eC5vbGRfZmxhZyA9PSAwKSkKKwkJCSkgeworCQkJCW9fZnJlZSgmZGVzdCk7CisjaWYgIUJCX01NVQorCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiYXNfc3RyaW5nICclcydcbiIsIGN0eC5hc19zdHJpbmcuZGF0YSk7CisJCQkJaWYgKHBzdHJpbmcpCisJCQkJCSpwc3RyaW5nID0gY3R4LmFzX3N0cmluZy5kYXRhOworCQkJCWVsc2UKKwkJCQkJb19mcmVlX3Vuc2FmZSgmY3R4LmFzX3N0cmluZyk7CisjZW5kaWYKKwkJCQlkZWJ1Z19sZWF2ZSgpOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2Vfc3RyZWFtIHJldHVybiAlcDogIgorCQkJCQkJImVuZF90cmlnZ2VyIGNoYXIgZm91bmRcbiIsCisJCQkJCQljdHgubGlzdF9oZWFkKTsKKwkJCQlyZXR1cm4gY3R4Lmxpc3RfaGVhZDsKKwkJCX0KKwkJfQorIHNraXBfZW5kX3RyaWdnZXI6CisJCWlmIChpc19ibGFuaykKKwkJCWNvbnRpbnVlOworCisJCS8qIENhdGNoIDwsID4gYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdGhpcyB3b3JkIGlzCisJCSAqIGFuIGFzc2lnbm1lbnQuIGE9MSAyPnogYj0yOiBiPTIgaXMgc3RpbGwgYXNzaWdubWVudCAqLworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJz4nOgorCQkJcmVkaXJfZmQgPSByZWRpcmVjdF9vcHRfbnVtKCZkZXN0KTsKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCXJlZGlyX3N0eWxlID0gUkVESVJFQ1RfT1ZFUldSSVRFOworCQkJaWYgKG5leHQgPT0gJz4nKSB7CisJCQkJcmVkaXJfc3R5bGUgPSBSRURJUkVDVF9BUFBFTkQ7CisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCX0KKyNpZiAwCisJCQllbHNlIGlmIChuZXh0ID09ICcoJykgeworCQkJCXN5bnRheF9lcnJvcigiPihwcm9jZXNzKSBub3Qgc3VwcG9ydGVkIik7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBhcnNlX3JlZGlyZWN0KCZjdHgsIHJlZGlyX2ZkLCByZWRpcl9zdHlsZSwgaW5wdXQpKQorCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQljb250aW51ZTsgLyogYmFjayB0byB0b3Agb2Ygd2hpbGUgKDEpICovCisJCWNhc2UgJzwnOgorCQkJcmVkaXJfZmQgPSByZWRpcmVjdF9vcHRfbnVtKCZkZXN0KTsKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCXJlZGlyX3N0eWxlID0gUkVESVJFQ1RfSU5QVVQ7CisJCQlpZiAobmV4dCA9PSAnPCcpIHsKKwkJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX0hFUkVET0M7CisJCQkJaGVyZWRvY19jbnQrKzsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoIisraGVyZWRvY19jbnQ9JWRcbiIsIGhlcmVkb2NfY250KTsKKwkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgY2gpOworCQkJfSBlbHNlIGlmIChuZXh0ID09ICc+JykgeworCQkJCXJlZGlyX3N0eWxlID0gUkVESVJFQ1RfSU87CisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCX0KKyNpZiAwCisJCQllbHNlIGlmIChuZXh0ID09ICcoJykgeworCQkJCXN5bnRheF9lcnJvcigiPChwcm9jZXNzKSBub3Qgc3VwcG9ydGVkIik7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBhcnNlX3JlZGlyZWN0KCZjdHgsIHJlZGlyX2ZkLCByZWRpcl9zdHlsZSwgaW5wdXQpKQorCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQljb250aW51ZTsgLyogYmFjayB0byB0b3Agb2Ygd2hpbGUgKDEpICovCisJCWNhc2UgJyMnOgorCQkJaWYgKGRlc3QubGVuZ3RoID09IDAgJiYgIWRlc3QuaGFzX3F1b3RlZF9wYXJ0KSB7CisJCQkJLyogc2tpcCAiI2NvbW1lbnQiICovCisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJY2ggPSBpX3BlZWsoaW5wdXQpOworCQkJCQlpZiAoY2ggPT0gRU9GIHx8IGNoID09ICdcbicpCisJCQkJCQlicmVhazsKKwkJCQkJaV9nZXRjaChpbnB1dCk7CisJCQkJCS8qIG5vdGU6IHdlIGRvIG5vdCBhZGQgaXQgdG8gJmN0eC5hc19zdHJpbmcgKi8KKwkJCQl9CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCAnXG4nKTsKKwkJCQljb250aW51ZTsgLyogYmFjayB0byB0b3Agb2Ygd2hpbGUgKDEpICovCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKG5leHQgPT0gJ1xuJykgeworCQkJCS8qIEl0J3MgIlw8bmV3bGluZT4iICovCisjaWYgIUJCX01NVQorCQkJCS8qIFJlbW92ZSB0cmFpbGluZyAnXCcgZnJvbSBjdHguYXNfc3RyaW5nICovCisJCQkJY3R4LmFzX3N0cmluZy5kYXRhWy0tY3R4LmFzX3N0cmluZy5sZW5ndGhdID0gJ1wwJzsKKyNlbmRpZgorCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7IC8qIGVhdCBpdCAqLworCQkJCWNvbnRpbnVlOyAvKiBiYWNrIHRvIHRvcCBvZiB3aGlsZSAoMSkgKi8KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRlc3Qub19hc3NpZ25tZW50ID09IE1BWUJFX0FTU0lHTk1FTlQKKwkJIC8qIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBpbiB3b3JkIGluICJhPTEgMj53b3JkIGI9MSI6ICovCisJCSAmJiAhY3R4LnBlbmRpbmdfcmVkaXJlY3QKKwkJKSB7CisJCQkvKiBjaCBpcyBhIHNwZWNpYWwgY2hhciBhbmQgdGh1cyB0aGlzIHdvcmQKKwkJCSAqIGNhbm5vdCBiZSBhbiBhc3NpZ25tZW50ICovCisJCQlkZXN0Lm9fYXNzaWdubWVudCA9IE5PVF9BU1NJR05NRU5UOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkZXN0Lm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbZGVzdC5vX2Fzc2lnbm1lbnRdKTsKKwkJfQorCisJCS8qIE5vdGU6IG5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgY2gpIGlzIGFscmVhZHkgZG9uZSAqLworCisJCXN3aXRjaCAoY2gpIHsKKwkJY2FzZSAnIyc6IC8qIG5vbi1jb21tZW50ICM6ICJlY2hvIGEjYiIgZXRjICovCisJCQlvX2FkZFFjaHIoJmRlc3QsIGNoKTsKKwkJCWJyZWFrOworCQljYXNlICdcXCc6CisJCQlpZiAobmV4dCA9PSBFT0YpIHsKKwkJCQlzeW50YXhfZXJyb3IoIlxcPGVvZj4iKTsKKwkJCQl4ZnVuY19kaWUoKTsKKwkJCX0KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkvKiBub3RlOiBjaCAhPSAnXG4nICh0aGF0IGNhc2UgZG9lcyBub3QgcmVhY2ggdGhpcyBwbGFjZSkgKi8KKwkJCW9fYWRkY2hyKCZkZXN0LCAnXFwnKTsKKwkJCS8qbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCAnXFwnKTsgLSBhbHJlYWR5IGRvbmUgKi8KKwkJCW9fYWRkY2hyKCZkZXN0LCBjaCk7CisJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCS8qIEV4YW1wbGU6IGVjaG8gSGVsbG8gXDI+ZmlsZQorCQkJICogd2UgbmVlZCB0byBrbm93IHRoYXQgd29yZCAyIGlzIHF1b3RlZCAqLworCQkJZGVzdC5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJyQnOgorCQkJaWYgKCFwYXJzZV9kb2xsYXIoJmN0eC5hc19zdHJpbmcsICZkZXN0LCBpbnB1dCwgLypxdW90ZV9tYXNrOiovIDApKSB7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9zdHJlYW0gcGFyc2UgZXJyb3I6ICIKKwkJCQkJInBhcnNlX2RvbGxhciByZXR1cm5lZCAwIChlcnJvcilcbiIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXCcnOgorCQkJZGVzdC5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJaWYgKG5leHQgPT0gJ1wnJyAmJiAhY3R4LnBlbmRpbmdfcmVkaXJlY3QpIHsKKyBpbnNlcnRfZW1wdHlfcXVvdGVkX3N0cl9tYXJrZXI6CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBuZXh0KTsKKwkJCQlpX2dldGNoKGlucHV0KTsgLyogZWF0IHNlY29uZCAnICovCisJCQkJb19hZGRjaHIoJmRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQkJb19hZGRjaHIoJmRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQl9IGVsc2UgeworCQkJCXdoaWxlICgxKSB7CisJCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJCWlmIChjaCA9PSBFT0YpIHsKKwkJCQkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJ1wnJyk7CisJCQkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJCQl9CisJCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgY2gpOworCQkJCQlpZiAoY2ggPT0gJ1wnJykKKwkJCQkJCWJyZWFrOworCQkJCQlvX2FkZHFjaHIoJmRlc3QsIGNoKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnIic6CisJCQlkZXN0Lmhhc19xdW90ZWRfcGFydCA9IDE7CisJCQlpZiAobmV4dCA9PSAnIicgJiYgIWN0eC5wZW5kaW5nX3JlZGlyZWN0KQorCQkJCWdvdG8gaW5zZXJ0X2VtcHR5X3F1b3RlZF9zdHJfbWFya2VyOworCQkJaWYgKGRlc3Qub19hc3NpZ25tZW50ID09IE5PVF9BU1NJR05NRU5UKQorCQkJCWRlc3Qub19leHBmbGFncyB8PSBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUzsKKwkJCWlmICghZW5jb2RlX3N0cmluZygmY3R4LmFzX3N0cmluZywgJmRlc3QsIGlucHV0LCAnIicsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDEpKQorCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQlkZXN0Lm9fZXhwZmxhZ3MgJj0gfkVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0hVU0hfVElDSworCQljYXNlICdgJzogeworCQkJVVNFX0ZPUl9OT01NVSh1bnNpZ25lZCBwb3M7KQorCisJCQlvX2FkZGNocigmZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCW9fYWRkY2hyKCZkZXN0LCAnYCcpOworCQkJVVNFX0ZPUl9OT01NVShwb3MgPSBkZXN0Lmxlbmd0aDspCisJCQlpZiAoIWFkZF90aWxsX2JhY2txdW90ZSgmZGVzdCwgaW5wdXQsIC8qaW5fZHF1b3RlOiovIDApKQorCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisjIGlmICFCQl9NTVUKKwkJCW9fYWRkc3RyKCZjdHguYXNfc3RyaW5nLCBkZXN0LmRhdGEgKyBwb3MpOworCQkJb19hZGRjaHIoJmN0eC5hc19zdHJpbmcsICdgJyk7CisjIGVuZGlmCisJCQlvX2FkZGNocigmZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCS8vZGVidWdfcHJpbnRmX3N1YnN0KCJTVUJTVCBSRVMzICclcydcbiIsIGRlc3QuZGF0YSArIHBvcyk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWNhc2UgJzsnOgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKyBjYXNlX3NlbWk6CisjZW5kaWYKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWRvbmVfcGlwZSgmY3R4LCBQSVBFX1NFUSk7CisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQkJLyogRWF0IG11bHRpcGxlIHNlbWljb2xvbnMsIGRldGVjdAorCQkJICogd2hldGhlciBpdCBtZWFucyBzb21ldGhpbmcgc3BlY2lhbCAqLworCQkJd2hpbGUgKDEpIHsKKwkJCQljaCA9IGlfcGVlayhpbnB1dCk7CisJCQkJaWYgKGNoICE9ICc7JykKKwkJCQkJYnJlYWs7CisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfQ0FTRV9CT0RZKSB7CisJCQkJCWN0eC5jdHhfZHNlbWljb2xvbiA9IDE7CisJCQkJCWN0eC5jdHhfcmVzX3cgPSBSRVNfTUFUQ0g7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKyNlbmRpZgorIG5ld19jbWQ6CisJCQkvKiBXZSBqdXN0IGZpbmlzaGVkIGEgY21kLiBOZXcgb25lIG1heSBzdGFydAorCQkJICogd2l0aCBhbiBhc3NpZ25tZW50ICovCisJCQlkZXN0Lm9fYXNzaWdubWVudCA9IE1BWUJFX0FTU0lHTk1FTlQ7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRlc3Qub19hc3NpZ25tZW50PSclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1tkZXN0Lm9fYXNzaWdubWVudF0pOworCQkJYnJlYWs7CisJCWNhc2UgJyYnOgorCQkJaWYgKGRvbmVfd29yZCgmZGVzdCwgJmN0eCkpIHsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJaWYgKG5leHQgPT0gJyYnKSB7CisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9BTkQpOworCQkJfSBlbHNlIHsKKwkJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9CRyk7CisJCQl9CisJCQlnb3RvIG5ld19jbWQ7CisJCWNhc2UgJ3wnOgorCQkJaWYgKGRvbmVfd29yZCgmZGVzdCwgJmN0eCkpIHsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJCWlmIChjdHguY3R4X3Jlc193ID09IFJFU19NQVRDSCkKKwkJCQlicmVhazsgLyogd2UgYXJlIGluIGNhc2UncyAid29yZCB8IHdvcmQpIiAqLworI2VuZGlmCisJCQlpZiAobmV4dCA9PSAnfCcpIHsgLyogfHwgKi8KKwkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgY2gpOworCQkJCWRvbmVfcGlwZSgmY3R4LCBQSVBFX09SKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogd2UgY291bGQgcGljayB1cCBhIGZpbGUgZGVzY3JpcHRvciBjaG9pY2UgaGVyZQorCQkJCSAqIHdpdGggcmVkaXJlY3Rfb3B0X251bSgpLCBidXQgYmFzaCBkb2Vzbid0IGRvIGl0LgorCQkJCSAqICJlY2hvIGZvbyAyfCBjYXQiIHlpZWxkcyAiZm9vIDIiLiAqLworCQkJCWRvbmVfY29tbWFuZCgmY3R4KTsKKyNpZiAhQkJfTU1VCisJCQkJb19yZXNldF90b19lbXB0eV91bnF1b3RlZCgmY3R4LmFzX3N0cmluZyk7CisjZW5kaWYKKwkJCX0KKwkJCWdvdG8gbmV3X2NtZDsKKwkJY2FzZSAnKCc6CisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQkJLyogImNhc2UuLi4gaW4gWyhdd29yZCkuLi4iIC0gc2tpcCAnKCcgKi8KKwkJCWlmIChjdHguY3R4X3Jlc193ID09IFJFU19NQVRDSAorCQkJICYmIGN0eC5jb21tYW5kLT5hcmd2ID09IE5VTEwgLyogbm90ICh3b3JkfCguLi4gKi8KKwkJCSAmJiBkZXN0Lmxlbmd0aCA9PSAwIC8qIG5vdCB3b3JkKC4uLiAqLworCQkJICYmIGRlc3QuaGFzX3F1b3RlZF9wYXJ0ID09IDAgLyogbm90ICIiKC4uLiAqLworCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJY2FzZSAneyc6CisJCQlpZiAocGFyc2VfZ3JvdXAoJmRlc3QsICZjdHgsIGlucHV0LCBjaCkgIT0gMCkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlnb3RvIG5ld19jbWQ7CisJCWNhc2UgJyknOgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJCWlmIChjdHguY3R4X3Jlc193ID09IFJFU19NQVRDSCkKKwkJCQlnb3RvIGNhc2Vfc2VtaTsKKyNlbmRpZgorCQljYXNlICd9JzoKKwkJCS8qIHByb3BlciB1c2Ugb2YgdGhpcyBjaGFyYWN0ZXIgaXMgY2F1Z2h0IGJ5IGVuZF90cmlnZ2VyOgorCQkJICogaWYgd2Ugc2VlIHssIHdlIGNhbGwgcGFyc2VfZ3JvdXAoLi4uLCBlbmRfdHJpZ2dlcj0nfScpCisJCQkgKiBhbmQgaXQgd2lsbCBtYXRjaCB9IGVhcmxpZXIgKG5vdCBoZXJlKS4gKi8KKwkJCXN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGNoKTsKKwkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCWRlZmF1bHQ6CisJCQlpZiAoSFVTSF9ERUJVRykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiQlVHOiB1bmV4cGVjdGVkICVjXG4iLCBjaCk7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworCisgcGFyc2VfZXJyb3I6CisJeworCQlzdHJ1Y3QgcGFyc2VfY29udGV4dCAqcGN0eDsKKwkJSUZfSEFTX0tFWVdPUkRTKHN0cnVjdCBwYXJzZV9jb250ZXh0ICpwMjspCisKKwkJLyogQ2xlYW4gdXAgYWxsb2NhdGVkIHRyZWUuCisJCSAqIFNhbXBsZSBmb3IgZmluZGluZyBsZWFrcyBvbiBzeW50YXggZXJyb3IgcmVjb3ZlcnkgcGF0aC4KKwkJICogUnVuIGl0IGZyb20gaW50ZXJhY3RpdmUgc2hlbGwsIHdhdGNoIHBtYXAgYHBpZG9mIGh1c2hgLgorCQkgKiB3aGlsZSBpZiBmYWxzZTsgdGhlbiBmYWxzZTsgZmk7IGRvIGJyZWFrOyBmaQorCQkgKiBTYW1wbGVzIHRvIGNhdGNoIGxlYWtzIGF0IGV4ZWN1dGlvbjoKKwkJICogd2hpbGUgaWYgKHRydWUgfCB7dHJ1ZTt9KTsgdGhlbiBlY2hvIG9rOyBmaTsgZG8gYnJlYWs7IGRvbmUKKwkJICogd2hpbGUgaWYgKHRydWUgfCB7dHJ1ZTt9KTsgdGhlbiBlY2hvIG9rOyBmaTsgZG8gKGlmIGVjaG8gb2s7IGJyZWFrOyB0aGVuIDo7IGZpKSB8IGNhdDsgYnJlYWs7IGRvbmUKKwkJICovCisJCXBjdHggPSAmY3R4OworCQlkbyB7CisJCQkvKiBVcGRhdGUgcGlwZS9jb21tYW5kIGNvdW50cywKKwkJCSAqIG90aGVyd2lzZSBmcmVlaW5nIG1heSBtaXNzIHNvbWUgKi8KKwkJCWRvbmVfcGlwZShwY3R4LCBQSVBFX1NFUSk7CisJCQlkZWJ1Z19wcmludGZfY2xlYW4oImZyZWVpbmcgbGlzdCAlcCBmcm9tIGN0eCAlcFxuIiwKKwkJCQkJcGN0eC0+bGlzdF9oZWFkLCBwY3R4KTsKKwkJCWRlYnVnX3ByaW50X3RyZWUocGN0eC0+bGlzdF9oZWFkLCAwKTsKKwkJCWZyZWVfcGlwZV9saXN0KHBjdHgtPmxpc3RfaGVhZCk7CisJCQlkZWJ1Z19wcmludGZfY2xlYW4oImZyZWVkIGxpc3QgJXBcbiIsIHBjdHgtPmxpc3RfaGVhZCk7CisjaWYgIUJCX01NVQorCQkJb19mcmVlX3Vuc2FmZSgmcGN0eC0+YXNfc3RyaW5nKTsKKyNlbmRpZgorCQkJSUZfSEFTX0tFWVdPUkRTKHAyID0gcGN0eC0+c3RhY2s7KQorCQkJaWYgKHBjdHggIT0gJmN0eCkgeworCQkJCWZyZWUocGN0eCk7CisJCQl9CisJCQlJRl9IQVNfS0VZV09SRFMocGN0eCA9IHAyOykKKwkJfSB3aGlsZSAoSEFTX0tFWVdPUkRTICYmIHBjdHgpOworCisJCW9fZnJlZSgmZGVzdCk7CisJCUcubGFzdF9leGl0Y29kZSA9IDE7CisjaWYgIUJCX01NVQorCQlpZiAocHN0cmluZykKKwkJCSpwc3RyaW5nID0gTlVMTDsKKyNlbmRpZgorCQlkZWJ1Z19sZWF2ZSgpOworCQlyZXR1cm4gRVJSX1BUUjsKKwl9Cit9CisKKworLyoqKiBFeGVjdXRpb24gcm91dGluZXMgKioqLworCisvKiBFeHBhbnNpb24gY2FuIHJlY3Vyc2UsIG5lZWQgZm9yd2FyZCBkZWNsczogKi8KKyNpZiAhRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qIG9ubHkgJHt2YXIvcGF0dGVybi9yZXBsfSAoaXRzIHBhdHRlcm4gcGFydCkgbmVlZHMgYWRkaXRpb25hbCBtb2RlICovCisjZGVmaW5lIGV4cGFuZF9zdHJpbmdfdG9fc3RyaW5nKHN0ciwgZG9fdW5iYWNrc2xhc2gpIFwKKwlleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhzdHIpCisjZW5kaWYKK3N0YXRpYyBjaGFyICpleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBkb191bmJhY2tzbGFzaCk7CisjaWYgRU5BQkxFX0hVU0hfVElDSworc3RhdGljIGludCBwcm9jZXNzX2NvbW1hbmRfc3VicyhvX3N0cmluZyAqZGVzdCwgY29uc3QgY2hhciAqcyk7CisjZW5kaWYKKworLyogZXhwYW5kX3N0cnZlY190b19zdHJ2ZWMoKSB0YWtlcyBhIGxpc3Qgb2Ygc3RyaW5ncywgZXhwYW5kcworICogYWxsIHZhcmlhYmxlIHJlZmVyZW5jZXMgd2l0aGluIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0bworICogYSBsaXN0IG9mIGV4cGFuZGVkIHN0cmluZ3MsIHBvc3NpYmx5IHdpdGggbGFyZ2VyIG51bWJlcgorICogb2Ygc3RyaW5ncy4gKFRoaW5rIFZBUj0iYSBiIjsgZWNobyAkVkFSKS4KKyAqIFRoaXMgbmV3IGxpc3QgaXMgYWxsb2NhdGVkIGFzIGEgc2luZ2xlIG1hbGxvYyBibG9jay4KKyAqIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIGNoYXIqIHBvaW50ZXJzIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQsCisgKiBmb2xsb3dlZCBieSBzdHJpbmdzIHRoZW1zZWx2ZXMuCisgKiBDYWxsZXIgY2FuIGRlYWxsb2NhdGUgZW50aXJlIGxpc3QgYnkgc2luZ2xlIGZyZWUobGlzdCkuICovCisKKy8qIEEgaG9yZGUgb2YgaXRzIGhlbHBlcnMgY29tZSBmaXJzdDogKi8KKworc3RhdGljIHZvaWQgb19hZGRibG9ja19kdXBsaWNhdGVfYmFja3NsYXNoKG9fc3RyaW5nICpvLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJd2hpbGUgKC0tbGVuID49IDApIHsKKwkJY2hhciBjID0gKnN0cisrOworCisjaWYgRU5BQkxFX0hVU0hfQlJBQ0VfRVhQQU5TSU9OCisJCWlmIChjID09ICd7JyB8fCBjID09ICd9JykgeworCQkJLyogeyAtPiBceywgfSAtPiBcfSAqLworCQkJb19hZGRjaHIobywgJ1xcJyk7CisJCQkvKiBBbmQgbm93IHdlIHdhbnQgdG8gYWRkIHsgb3IgfSBhbmQgY29udGludWU6CisJCQkgKiAgb19hZGRjaHIobywgYyk7CisJCQkgKiAgY29udGludWU7CisJCQkgKiBsdWNraWx5LCBqdXN0IGZhbGxpbmcgdGhyb3VnaHQgYWNoaWV2ZXMgdGhpcy4KKwkJCSAqLworCQl9CisjZW5kaWYKKwkJb19hZGRjaHIobywgYyk7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCS8qIFx6IC0+IFxcXHo7IFw8ZW9sPiAtPiBcXDxlb2w+ICovCisJCQlvX2FkZGNocihvLCAnXFwnKTsKKwkJCWlmIChsZW4pIHsKKwkJCQlsZW4tLTsKKwkJCQlvX2FkZGNocihvLCAnXFwnKTsKKwkJCQlvX2FkZGNocihvLCAqc3RyKyspOworCQkJfQorCQl9CisJfQorfQorCisvKiBTdG9yZSBnaXZlbiBzdHJpbmcsIGZpbmFsaXppbmcgdGhlIHdvcmQgYW5kIHN0YXJ0aW5nIG5ldyBvbmUgd2hlbmV2ZXIKKyAqIHdlIGVuY291bnRlciBJRlMgY2hhcihzKS4gVGhpcyBpcyB1c2VkIGZvciBleHBhbmRpbmcgdmFyaWFibGUgdmFsdWVzLgorICogRW5kLW9mLXN0cmluZyBkb2VzIE5PVCBmaW5hbGl6ZSB3b3JkOiB0aGluayBhYm91dCAnZWNobyAtJFZBUi0nLgorICogUmV0dXJuIGluICplbmRlZF93aXRoX2lmczoKKyAqIDEgLSBlbmRlZCB3aXRoIElGUyBjaGFyLCBlbHNlIDAgKHRoaXMgaW5jbHVkZXMgY2FzZSBvZiBlbXB0eSBzdHIpLgorICovCitzdGF0aWMgaW50IGV4cGFuZF9vbl9pZnMoaW50ICplbmRlZF93aXRoX2lmcywgb19zdHJpbmcgKm91dHB1dCwgaW50IG4sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbGFzdF9pc19pZnMgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHdvcmRfbGVuOworCisJCWlmICghKnN0cikgIC8qIEVPTCAtIGRvIG5vdCBmaW5hbGl6ZSB3b3JkICovCisJCQlicmVhazsKKwkJd29yZF9sZW4gPSBzdHJjc3BuKHN0ciwgRy5pZnMpOworCQlpZiAod29yZF9sZW4pIHsKKwkJCS8qIFdlIGhhdmUgV09SRF9MRU4gbGVhZGluZyBub24tSUZTIGNoYXJzICovCisJCQlpZiAoIShvdXRwdXQtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19HTE9CKSkgeworCQkJCW9fYWRkYmxvY2sob3V0cHV0LCBzdHIsIHdvcmRfbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogUHJvdGVjdCBiYWNrc2xhc2hlcyBhZ2FpbnN0IGdsb2JiaW5nIHVwIDopCisJCQkJICogRXhhbXBsZTogInY9J1wqJzsgZWNobyBiJHYiIHByaW50cyAiYlwqIgorCQkJCSAqIChhbmQgZG9lcyBub3QgdHJ5IHRvIGdsb2Igb24gIioiKQorCQkJCSAqLworCQkJCW9fYWRkYmxvY2tfZHVwbGljYXRlX2JhY2tzbGFzaChvdXRwdXQsIHN0ciwgd29yZF9sZW4pOworCQkJCS8qLyBXaHkgY2FuJ3Qgd2UgZG8gaXQgZWFzaWVyPyAqLworCQkJCS8qb19hZGRibG9jayhvdXRwdXQsIHN0ciwgd29yZF9sZW4pOyAtIFdST05HOiAidj0nXConOyBlY2hvIFokdiIgcHJpbnRzICJaKiIgaW5zdGVhZCBvZiAiWlwqIiAqLworCQkJCS8qb19hZGRxYmxvY2sob3V0cHV0LCBzdHIsIHdvcmRfbGVuKTsgLSBXUk9ORzogInY9JyonOyBlY2hvIFokdiIgcHJpbnRzICJaKiIgaW5zdGVhZCBvZiBaKiBmaWxlcyAqLworCQkJfQorCQkJbGFzdF9pc19pZnMgPSAwOworCQkJc3RyICs9IHdvcmRfbGVuOworCQkJaWYgKCEqc3RyKSAgLyogRU9MIC0gZG8gbm90IGZpbmFsaXplIHdvcmQgKi8KKwkJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGtub3cgc3RyIGhlcmUgcG9pbnRzIHRvIGF0IGxlYXN0IG9uZSBJRlMgY2hhciAqLworCQlsYXN0X2lzX2lmcyA9IDE7CisJCXN0ciArPSBzdHJzcG4oc3RyLCBHLmlmcyk7IC8qIHNraXAgSUZTIGNoYXJzICovCisJCWlmICghKnN0cikgIC8qIEVPTCAtIGRvIG5vdCBmaW5hbGl6ZSB3b3JkICovCisJCQlicmVhazsKKworCQkvKiBTdGFydCBuZXcgd29yZC4uLiBidXQgbm90IGFsd2F5cyEgKi8KKwkJLyogQ2FzZSAidj0nIGEnOyBlY2hvICcnJHYiOiB3ZSBkbyBuZWVkIHRvIGZpbmFsaXplIGVtcHR5IHdvcmQ6ICovCisJCWlmIChvdXRwdXQtPmhhc19xdW90ZWRfcGFydAorCQkvKiBDYXNlICJ2PScgYSc7IGVjaG8gJHYiOgorCQkgKiBoZXJlIG5vdGhpbmcgcHJlY2VkZXMgdGhlIHNwYWNlIGluICR2IGV4cGFuc2lvbiwKKwkJICogdGhlcmVmb3JlIHdlIHNob3VsZCBub3QgZmluaXNoIHRoZSB3b3JkCisJCSAqIChJT1c6IGlmIHRoZXJlICppcyogd29yZCB0byBmaW5hbGl6ZSwgb25seSB0aGVuIGRvIGl0KToKKwkJICovCisJCSB8fCAobiA+IDAgJiYgb3V0cHV0LT5kYXRhW291dHB1dC0+bGVuZ3RoIC0gMV0pCisJCSkgeworCQkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwkJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF9vbl9pZnMiLCBvdXRwdXQsIG4pOworCQkJbiA9IG9fc2F2ZV9wdHIob3V0cHV0LCBuKTsKKwkJfQorCX0KKworCWlmIChlbmRlZF93aXRoX2lmcykKKwkJKmVuZGVkX3dpdGhfaWZzID0gbGFzdF9pc19pZnM7CisJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX29uX2lmc1sxXSIsIG91dHB1dCwgbik7CisJcmV0dXJuIG47Cit9CisKKy8qIEhlbHBlciB0byBleHBhbmQgJCgoLi4uKSkgYW5kIGhlcmVkb2MgYm9keS4gVGhlc2UgYWN0IGFzIGlmCisgKiB0aGV5IGFyZSBpbiBkb3VibGUgcXVvdGVzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGV5IGFyZSBub3QgOikuCisgKiBKdXN0IHRoZSBydWxlcyBhcmUgc2ltaWxhcjogImV4cGFuZCBvbmx5ICR2YXIgYW5kIGBjbWRgIgorICoKKyAqIFJldHVybnMgbWFsbG9jZWQgc3RyaW5nLgorICogQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSByZXR1cm4gTlVMTCBpZiBleHBhbnNpb24gaXMgbm90IG5lZWRlZC4KKyAqLworI2lmICFFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorLyogb25seSAke3Zhci9wYXR0ZXJuL3JlcGx9IChpdHMgcGF0dGVybiBwYXJ0KSBuZWVkcyBhZGRpdGlvbmFsIG1vZGUgKi8KKyNkZWZpbmUgZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhzdHIsIHByb2Nlc3NfYmtzbGFzaCwgZG9fdW5iYWNrc2xhc2gpIFwKKwllbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKHN0cikKKyNlbmRpZgorc3RhdGljIGNoYXIgKmVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgcHJvY2Vzc19ia3NsYXNoLCBpbnQgZG9fdW5iYWNrc2xhc2gpCit7CisJY2hhciAqZXhwX3N0cjsKKwlzdHJ1Y3QgaW5fc3RyIGlucHV0OworCW9fc3RyaW5nIGRlc3QgPSBOVUxMX09fU1RSSU5HOworCisJaWYgKCFzdHJjaHIoc3RyLCAnJCcpCisJICYmICFzdHJjaHIoc3RyLCAnXFwnKQorI2lmIEVOQUJMRV9IVVNIX1RJQ0sKKwkgJiYgIXN0cmNocihzdHIsICdgJykKKyNlbmRpZgorCSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIGV4cGFuZC4gRXhhbXBsZToKKwkgKiBlY2hvICQoKCRhICsgYGVjaG8gMWApKSAkKCgxICsgJCgoMikpICkpCisJICovCisJc2V0dXBfc3RyaW5nX2luX3N0cigmaW5wdXQsIHN0cik7CisJZW5jb2RlX3N0cmluZyhOVUxMLCAmZGVzdCwgJmlucHV0LCBFT0YsIHByb2Nlc3NfYmtzbGFzaCk7CisvL1RPRE86IGVycm9yIGNoZWNrIChlbmNvZGVfc3RyaW5nIHJldHVybnMgMCBvbiBlcnJvcik/CisJLy9iYl9lcnJvcl9tc2coIiclcycgLT4gJyVzJyIsIHN0ciwgZGVzdC5kYXRhKTsKKwlleHBfc3RyID0gZXhwYW5kX3N0cmluZ190b19zdHJpbmcoZGVzdC5kYXRhLCAvKnVuYmFja3NsYXNoOiovIGRvX3VuYmFja3NsYXNoKTsKKwkvL2JiX2Vycm9yX21zZygiJyVzJyAtPiAnJXMnIiwgZGVzdC5kYXRhLCBleHBfc3RyKTsKKwlvX2ZyZWVfdW5zYWZlKCZkZXN0KTsKKwlyZXR1cm4gZXhwX3N0cjsKK30KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKK3N0YXRpYyBhcml0aF90IGV4cGFuZF9hbmRfZXZhbHVhdGVfYXJpdGgoY29uc3QgY2hhciAqYXJnLCBjb25zdCBjaGFyICoqZXJybXNnX3ApCit7CisJYXJpdGhfc3RhdGVfdCBtYXRoX3N0YXRlOworCWFyaXRoX3QgcmVzOworCWNoYXIgKmV4cF9zdHI7CisKKwltYXRoX3N0YXRlLmxvb2t1cHZhciA9IGdldF9sb2NhbF92YXJfdmFsdWU7CisJbWF0aF9zdGF0ZS5zZXR2YXIgPSBzZXRfbG9jYWxfdmFyX2Zyb21faGFsdmVzOworCS8vbWF0aF9zdGF0ZS5lbmRvZm5hbWUgPSBlbmRvZm5hbWU7CisJZXhwX3N0ciA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoYXJnLCAvKnByb2Nlc3NfYmtzbGFzaDoqLyAxLCAvKnVuYmFja3NsYXNoOiovIDEpOworCXJlcyA9IGFyaXRoKCZtYXRoX3N0YXRlLCBleHBfc3RyID8gZXhwX3N0ciA6IGFyZyk7CisJZnJlZShleHBfc3RyKTsKKwlpZiAoZXJybXNnX3ApCisJCSplcnJtc2dfcCA9IG1hdGhfc3RhdGUuZXJybXNnOworCWlmIChtYXRoX3N0YXRlLmVycm1zZykKKwkJZGllX2lmX3NjcmlwdChtYXRoX3N0YXRlLmVycm1zZyk7CisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qICR7dmFyL1svXXBhdHRlcm5bL3JlcGxdfSBoZWxwZXJzICovCitzdGF0aWMgY2hhciAqc3Ryc3RyX3BhdHRlcm4oY2hhciAqdmFsLCBjb25zdCBjaGFyICpwYXR0ZXJuLCBpbnQgKnNpemUpCit7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqZW5kID0gc2Nhbl9hbmRfbWF0Y2godmFsLCBwYXR0ZXJuLCBTQ0FOX01PVkVfRlJPTV9SSUdIVCArIFNDQU5fTUFUQ0hfTEVGVF9IQUxGKTsKKwkJZGVidWdfcHJpbnRmX3ZhcmV4cCgidmFsOiclcycgcGF0dGVybjonJXMnIGVuZDonJXMnXG4iLCB2YWwsIHBhdHRlcm4sIGVuZCk7CisJCWlmIChlbmQpIHsKKwkJCSpzaXplID0gZW5kIC0gdmFsOworCQkJcmV0dXJuIHZhbDsKKwkJfQorCQlpZiAoKnZhbCA9PSAnXDAnKQorCQkJcmV0dXJuIE5VTEw7CisJCS8qIE9wdGltaXphdGlvbjogaWYgIipwYXQiIGRpZCBub3QgbWF0Y2ggdGhlIHN0YXJ0IG9mICJzdHJpbmciLAorCQkgKiB3ZSBrbm93IHRoYXQgInRyaW5nIiwgInJpbmciIGV0YyB3aWxsIG5vdCBtYXRjaCB0b286CisJCSAqLworCQlpZiAocGF0dGVyblswXSA9PSAnKicpCisJCQlyZXR1cm4gTlVMTDsKKwkJdmFsKys7CisJfQorfQorc3RhdGljIGNoYXIgKnJlcGxhY2VfcGF0dGVybihjaGFyICp2YWwsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnJlcGwsIGNoYXIgZXhwX29wKQoreworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisJdW5zaWduZWQgcmVzX2xlbiA9IDA7CisJdW5zaWduZWQgcmVwbF9sZW4gPSBzdHJsZW4ocmVwbCk7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgc2l6ZTsKKwkJY2hhciAqcyA9IHN0cnN0cl9wYXR0ZXJuKHZhbCwgcGF0dGVybiwgJnNpemUpOworCQlpZiAoIXMpCisJCQlicmVhazsKKworCQlyZXN1bHQgPSB4cmVhbGxvYyhyZXN1bHQsIHJlc19sZW4gKyAocyAtIHZhbCkgKyByZXBsX2xlbiArIDEpOworCQltZW1jcHkocmVzdWx0ICsgcmVzX2xlbiwgdmFsLCBzIC0gdmFsKTsKKwkJcmVzX2xlbiArPSBzIC0gdmFsOworCQlzdHJjcHkocmVzdWx0ICsgcmVzX2xlbiwgcmVwbCk7CisJCXJlc19sZW4gKz0gcmVwbF9sZW47CisJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnIHM6JyVzJyByZXN1bHQ6JyVzJ1xuIiwgdmFsLCBzLCByZXN1bHQpOworCisJCXZhbCA9IHMgKyBzaXplOworCQlpZiAoZXhwX29wID09ICcvJykKKwkJCWJyZWFrOworCX0KKwlpZiAodmFsWzBdICYmIHJlc3VsdCkgeworCQlyZXN1bHQgPSB4cmVhbGxvYyhyZXN1bHQsIHJlc19sZW4gKyBzdHJsZW4odmFsKSArIDEpOworCQlzdHJjcHkocmVzdWx0ICsgcmVzX2xlbiwgdmFsKTsKKwkJZGVidWdfcHJpbnRmX3ZhcmV4cCgidmFsOiclcycgcmVzdWx0OiclcydcbiIsIHZhbCwgcmVzdWx0KTsKKwl9CisJZGVidWdfcHJpbnRmX3ZhcmV4cCgicmVzdWx0OiclcydcbiIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisvKiBIZWxwZXI6CisgKiBIYW5kbGVzIDxTUEVDSUFMX1ZBUl9TWU1CT0w+dmFybmFtZS4uLjxTUEVDSUFMX1ZBUl9TWU1CT0w+IGNvbnN0cnVjdC4KKyAqLworc3RhdGljIE5PSU5MSU5FIGNvbnN0IGNoYXIgKmV4cGFuZF9vbmVfdmFyKGNoYXIgKip0b19iZV9mcmVlZF9wcCwgY2hhciAqYXJnLCBjaGFyICoqcHApCit7CisJY29uc3QgY2hhciAqdmFsID0gTlVMTDsKKwljaGFyICp0b19iZV9mcmVlZCA9IE5VTEw7CisJY2hhciAqcCA9ICpwcDsKKwljaGFyICp2YXI7CisJY2hhciBmaXJzdF9jaGFyOworCWNoYXIgZXhwX29wOworCWNoYXIgZXhwX3NhdmUgPSBleHBfc2F2ZTsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqZXhwX3NhdmVwdHI7IC8qIHBvaW50cyB0byBleHBhbnNpb24gb3BlcmF0b3IgKi8KKwljaGFyICpleHBfd29yZCA9IGV4cF93b3JkOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyIGFyZzA7CisKKwkqcCA9ICdcMCc7IC8qIHJlcGxhY2UgdHJhaWxpbmcgU1BFQ0lBTF9WQVJfU1lNQk9MICovCisJdmFyID0gYXJnOworCWV4cF9zYXZlcHRyID0gYXJnWzFdID8gc3RyY2hyKFZBUl9FTkNPREVEX1NVQlNUX09QUywgYXJnWzFdKSA6IE5VTEw7CisJYXJnMCA9IGFyZ1swXTsKKwlmaXJzdF9jaGFyID0gYXJnWzBdID0gYXJnMCAmIDB4N2Y7CisJZXhwX29wID0gMDsKKworCWlmIChmaXJzdF9jaGFyID09ICcjJyAgICAgIC8qICR7Iy4uLiAqLworCSAmJiBhcmdbMV0gJiYgIWV4cF9zYXZlcHRyIC8qIG5vdCAkeyN9IGFuZCBub3QgJHsjPG9wX2NoYXI+Li4ufSAqLworCSkgeworCQkvKiBJdCBtdXN0IGJlIGxlbmd0aCBvcGVyYXRvcjogJHsjdmFyfSAqLworCQl2YXIrKzsKKwkJZXhwX29wID0gJ0wnOworCX0gZWxzZSB7CisJCS8qIE1heWJlIGhhbmRsZSBwYXJhbWV0ZXIgZXhwYW5zaW9uICovCisJCWlmIChleHBfc2F2ZXB0ciAvKiBpZiAybmQgY2hhciBpcyBvbmUgb2YgZXhwYW5zaW9uIG9wZXJhdG9ycyAqLworCQkgJiYgc3RyY2hyKE5VTUVSSUNfU1BFQ1ZBUlNfU1RSLCBmaXJzdF9jaGFyKSAvKiAxc3QgY2hhciBpcyBzcGVjaWFsIHZhcmlhYmxlICovCisJCSkgeworCQkJLyogJHs/OjB9LCAkeyNbOl0lMH0gZXRjICovCisJCQlleHBfc2F2ZXB0ciA9IHZhciArIDE7CisJCX0gZWxzZSB7CisJCQkvKiAkez99LCAke3Zhcn0sICR7dmFyOjB9LCAke3Zhcls6XSUwfSBldGMgKi8KKwkJCWV4cF9zYXZlcHRyID0gdmFyKzEgKyBzdHJjc3BuKHZhcisxLCBWQVJfRU5DT0RFRF9TVUJTVF9PUFMpOworCQl9CisJCWV4cF9vcCA9IGV4cF9zYXZlID0gKmV4cF9zYXZlcHRyOworCQlpZiAoZXhwX29wKSB7CisJCQlleHBfd29yZCA9IGV4cF9zYXZlcHRyICsgMTsKKwkJCWlmIChleHBfb3AgPT0gJzonKSB7CisJCQkJZXhwX29wID0gKmV4cF93b3JkKys7CisvL1RPRE86IHRyeSAke3Zhcjp9IGFuZCAke3Zhcjpib2d1c30gaW4gbm9uLWJhc2ggY29uZmlnCisJCQkJaWYgKEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJCQkJICYmICghZXhwX29wIHx8ICFzdHJjaHIoTUlOVVNfUExVU19FUVVBTF9RVUVTVElPTiwgZXhwX29wKSkKKwkJCQkpIHsKKwkJCQkJLyogb29wcy4uLiBpdCdzICR7dmFyOk5bOk1dfSwgbm90ICR7dmFyOj94eHh9IG9yIHNvbWUgc3VjaCAqLworCQkJCQlleHBfb3AgPSAnOic7CisJCQkJCWV4cF93b3JkLS07CisJCQkJfQorCQkJfQorCQkJKmV4cF9zYXZlcHRyID0gJ1wwJzsKKwkJfSAvKiBlbHNlOiBpdCdzIG5vdCBhbiBleHBhbnNpb24gb3AsIGJ1dCBiYXJlICR7dmFyfSAqLworCX0KKworCS8qIExvb2sgdXAgdGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uICovCisJaWYgKGlzZGlnaXQodmFyWzBdKSkgeworCQkvKiBwYXJzZV9kb2xsYXIgc2hvdWxkIGhhdmUgdmV0dGVkIHZhciBmb3IgdXMgKi8KKwkJaW50IG4gPSB4YXRvaV9wb3NpdGl2ZSh2YXIpOworCQlpZiAobiA8IEcuZ2xvYmFsX2FyZ2MpCisJCQl2YWwgPSBHLmdsb2JhbF9hcmd2W25dOworCQkvKiBlbHNlIHZhbCByZW1haW5zIE5VTEw6ICROIHdpdGggdG9vIGJpZyBOICovCisJfSBlbHNlIHsKKwkJc3dpdGNoICh2YXJbMF0pIHsKKwkJY2FzZSAnJCc6IC8qIHBpZCAqLworCQkJdmFsID0gdXRvYShHLnJvb3RfcGlkKTsKKwkJCWJyZWFrOworCQljYXNlICchJzogLyogYmcgcGlkICovCisJCQl2YWwgPSBHLmxhc3RfYmdfcGlkID8gdXRvYShHLmxhc3RfYmdfcGlkKSA6ICIiOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOiAvKiBleGl0Y29kZSAqLworCQkJdmFsID0gdXRvYShHLmxhc3RfZXhpdGNvZGUpOworCQkJYnJlYWs7CisJCWNhc2UgJyMnOiAvKiBhcmdjICovCisJCQl2YWwgPSB1dG9hKEcuZ2xvYmFsX2FyZ2MgPyBHLmdsb2JhbF9hcmdjLTEgOiAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmFsID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSh2YXIpOworCQl9CisJfQorCisJLyogSGFuZGxlIGFueSBleHBhbnNpb25zICovCisJaWYgKGV4cF9vcCA9PSAnTCcpIHsKKwkJZGVidWdfcHJpbnRmX2V4cGFuZCgiZXhwYW5kOiBsZW5ndGgoJXMpPSIsIHZhbCk7CisJCXZhbCA9IHV0b2EodmFsID8gc3RybGVuKHZhbCkgOiAwKTsKKwkJZGVidWdfcHJpbnRmX2V4cGFuZCgiJXNcbiIsIHZhbCk7CisJfSBlbHNlIGlmIChleHBfb3ApIHsKKwkJaWYgKGV4cF9vcCA9PSAnJScgfHwgZXhwX29wID09ICcjJykgeworCQkJLyogU3RhbmRhcmQtbWFuZGF0ZWQgc3Vic3RyaW5nIHJlbW92YWwgb3BzOgorCQkJICogJHtwYXJhbWV0ZXIld29yZH0gLSByZW1vdmUgc21hbGxlc3Qgc3VmZml4IHBhdHRlcm4KKwkJCSAqICR7cGFyYW1ldGVyJSV3b3JkfSAtIHJlbW92ZSBsYXJnZXN0IHN1ZmZpeCBwYXR0ZXJuCisJCQkgKiAke3BhcmFtZXRlciN3b3JkfSAtIHJlbW92ZSBzbWFsbGVzdCBwcmVmaXggcGF0dGVybgorCQkJICogJHtwYXJhbWV0ZXIjI3dvcmR9IC0gcmVtb3ZlIGxhcmdlc3QgcHJlZml4IHBhdHRlcm4KKwkJCSAqCisJCQkgKiBXb3JkIGlzIGV4cGFuZGVkIHRvIHByb2R1Y2UgYSBnbG9iIHBhdHRlcm4uCisJCQkgKiBUaGVuIHZhcidzIHZhbHVlIGlzIG1hdGNoZWQgdG8gaXQgYW5kIG1hdGNoaW5nIHBhcnQgcmVtb3ZlZC4KKwkJCSAqLworCQkJaWYgKHZhbCAmJiB2YWxbMF0pIHsKKwkJCQljaGFyICp0OworCQkJCWNoYXIgKmV4cF9leHBfd29yZDsKKwkJCQljaGFyICpsb2M7CisJCQkJdW5zaWduZWQgc2Nhbl9mbGFncyA9IHBpY2tfc2NhbihleHBfb3AsICpleHBfd29yZCk7CisJCQkJaWYgKGV4cF9vcCA9PSAqZXhwX3dvcmQpICAvKiAjIyBvciAlJSAqLworCQkJCQlleHBfd29yZCsrOworCQkJCWV4cF9leHBfd29yZCA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoZXhwX3dvcmQsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDEsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJaWYgKGV4cF9leHBfd29yZCkKKwkJCQkJZXhwX3dvcmQgPSBleHBfZXhwX3dvcmQ7CisJCQkJLyogSEFDSyBBTEVSVC4gV2UgZGVwZW5kIGhlcmUgb24gdGhlIGZhY3QgdGhhdAorCQkJCSAqIEcuZ2xvYmFsX2FyZ3YgYW5kIHJlc3VsdHMgb2YgdXRvYSBhbmQgZ2V0X2xvY2FsX3Zhcl92YWx1ZQorCQkJCSAqIGFyZSBhY3R1YWxseSBpbiB3cml0YWJsZSBtZW1vcnk6CisJCQkJICogc2Nhbl9hbmRfbWF0Y2ggbW9tZW50YXJpbHkgc3RvcmVzIE5VTHMgdGhlcmUuICovCisJCQkJdCA9IChjaGFyKil2YWw7CisJCQkJbG9jID0gc2Nhbl9hbmRfbWF0Y2godCwgZXhwX3dvcmQsIHNjYW5fZmxhZ3MpOworCQkJCS8vYmJfZXJyb3JfbXNnKCJvcDolYyBzdHI6JyVzJyBwYXQ6JyVzJyByZXM6JyVzJyIsCisJCQkJLy8JCWV4cF9vcCwgdCwgZXhwX3dvcmQsIGxvYyk7CisJCQkJZnJlZShleHBfZXhwX3dvcmQpOworCQkJCWlmIChsb2MpIHsgLyogbWF0Y2ggd2FzIGZvdW5kICovCisJCQkJCWlmIChzY2FuX2ZsYWdzICYgU0NBTl9NQVRDSF9MRUZUX0hBTEYpIC8qICNbI10gKi8KKwkJCQkJCXZhbCA9IGxvYzsgLyogdGFrZSByaWdodCBwYXJ0ICovCisJCQkJCWVsc2UgLyogJVslXSAqLworCQkJCQkJdmFsID0gdG9fYmVfZnJlZWQgPSB4c3RybmR1cCh2YWwsIGxvYyAtIHZhbCk7IC8qIGxlZnQgKi8KKwkJCQl9CisJCQl9CisJCX0KKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQllbHNlIGlmIChleHBfb3AgPT0gJy8nIHx8IGV4cF9vcCA9PSAnXFwnKSB7CisJCQkvKiBJdCdzICR7dmFyL1svXXBhdHRlcm5bL3JlcGxdfSB0aGluZy4KKwkJCSAqIE5vdGUgdGhhdCBpbiBlbmNvZGVkIGZvcm0gaXQgaGFzIFRXTyBwYXJ0czoKKwkJCSAqIHZhci9wYXR0ZXJuPFNQRUNJQUxfVkFSX1NZTUJPTD5yZXBsPFNQRUNJQUxfVkFSX1NZTUJPTD4KKwkJCSAqIGFuZCBpZiAvLyBpcyB1c2VkLCBpdCBpcyBlbmNvZGVkIGFzIFw6CisJCQkgKiB2YXJccGF0dGVybjxTUEVDSUFMX1ZBUl9TWU1CT0w+cmVwbDxTUEVDSUFMX1ZBUl9TWU1CT0w+CisJCQkgKi8KKwkJCS8qIEVtcHR5IHZhcmlhYmxlIGFsd2F5cyBnaXZlcyBub3RoaW5nOiAqLworCQkJLy8gInY9Jyc7IGVjaG8gJHt2Lyovd30iIHByaW50cyAiIiwgbm90ICJ3IgorCQkJaWYgKHZhbCAmJiB2YWxbMF0pIHsKKwkJCQkvKiBwYXR0ZXJuIHVzZXMgbm9uLXN0YW5kYXJkIGV4cGFuc2lvbi4KKwkJCQkgKiByZXBsIHNob3VsZCBiZSB1bmJhY2tzbGFzaGVkIGFuZCBnbG9iYmVkCisJCQkJICogYnkgdGhlIHVzdWFsIGV4cGFuc2lvbiBydWxlczoKKwkJCQkgKiA+YXo7ID5iejsKKwkJCQkgKiB2PSdhIGJ6JzsgZWNobyAiJHt2L2Eqei9hKnp9IiBwcmludHMgImEqeiIKKwkJCQkgKiB2PSdhIGJ6JzsgZWNobyAiJHt2L2Eqei9cen0iICBwcmludHMgIlx6IgorCQkJCSAqIHY9J2EgYnonOyBlY2hvICR7di9hKnovYSp6fSAgIHByaW50cyAiYXoiCisJCQkJICogdj0nYSBieic7IGVjaG8gJHt2L2Eqei9cen0gICAgcHJpbnRzICJ6IgorCQkJCSAqIChub3RlIHRoYXQgYSp6IF9wYXR0ZXJuXyBpcyBuZXZlciBnbG9iYmVkISkKKwkJCQkgKi8KKwkJCQljaGFyICpwYXR0ZXJuLCAqcmVwbCwgKnQ7CisJCQkJcGF0dGVybiA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoZXhwX3dvcmQsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDAsIC8qdW5iYWNrc2xhc2g6Ki8gMCk7CisJCQkJaWYgKCFwYXR0ZXJuKQorCQkJCQlwYXR0ZXJuID0geHN0cmR1cChleHBfd29yZCk7CisJCQkJZGVidWdfcHJpbnRmX3ZhcmV4cCgicGF0dGVybjonJXMnLT4nJXMnXG4iLCBleHBfd29yZCwgcGF0dGVybik7CisJCQkJKnArKyA9IFNQRUNJQUxfVkFSX1NZTUJPTDsKKwkJCQlleHBfd29yZCA9IHA7CisJCQkJcCA9IHN0cmNocihwLCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJCSpwID0gJ1wwJzsKKwkJCQlyZXBsID0gZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhleHBfd29yZCwgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gYXJnMCAmIDB4ODAsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJZGVidWdfcHJpbnRmX3ZhcmV4cCgicmVwbDonJXMnLT4nJXMnXG4iLCBleHBfd29yZCwgcmVwbCk7CisJCQkJLyogSEFDSyBBTEVSVC4gV2UgZGVwZW5kIGhlcmUgb24gdGhlIGZhY3QgdGhhdAorCQkJCSAqIEcuZ2xvYmFsX2FyZ3YgYW5kIHJlc3VsdHMgb2YgdXRvYSBhbmQgZ2V0X2xvY2FsX3Zhcl92YWx1ZQorCQkJCSAqIGFyZSBhY3R1YWxseSBpbiB3cml0YWJsZSBtZW1vcnk6CisJCQkJICogcmVwbGFjZV9wYXR0ZXJuIG1vbWVudGFyaWx5IHN0b3JlcyBOVUxzIHRoZXJlLiAqLworCQkJCXQgPSAoY2hhciopdmFsOworCQkJCXRvX2JlX2ZyZWVkID0gcmVwbGFjZV9wYXR0ZXJuKHQsCisJCQkJCQlwYXR0ZXJuLAorCQkJCQkJKHJlcGwgPyByZXBsIDogZXhwX3dvcmQpLAorCQkJCQkJZXhwX29wKTsKKwkJCQlpZiAodG9fYmVfZnJlZWQpIC8qIGF0IGxlYXN0IG9uZSByZXBsYWNlIGhhcHBlbmVkICovCisJCQkJCXZhbCA9IHRvX2JlX2ZyZWVkOworCQkJCWZyZWUocGF0dGVybik7CisJCQkJZnJlZShyZXBsKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWVsc2UgaWYgKGV4cF9vcCA9PSAnOicpIHsKKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVCAmJiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCQkvKiBJdCdzICR7dmFyOk5bOk1dfSBiYXNoaXNtLgorCQkJICogTm90ZSB0aGF0IGluIGVuY29kZWQgZm9ybSBpdCBoYXMgVFdPIHBhcnRzOgorCQkJICogdmFyOk48U1BFQ0lBTF9WQVJfU1lNQk9MPk08U1BFQ0lBTF9WQVJfU1lNQk9MPgorCQkJICovCisJCQlhcml0aF90IGJlZywgbGVuOworCQkJY29uc3QgY2hhciAqZXJybXNnOworCisJCQliZWcgPSBleHBhbmRfYW5kX2V2YWx1YXRlX2FyaXRoKGV4cF93b3JkLCAmZXJybXNnKTsKKwkJCWlmIChlcnJtc2cpCisJCQkJZ290byBhcml0aF9lcnI7CisJCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJiZWc6JyVzJz0lbGxkXG4iLCBleHBfd29yZCwgKGxvbmcgbG9uZyliZWcpOworCQkJKnArKyA9IFNQRUNJQUxfVkFSX1NZTUJPTDsKKwkJCWV4cF93b3JkID0gcDsKKwkJCXAgPSBzdHJjaHIocCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCSpwID0gJ1wwJzsKKwkJCWxlbiA9IGV4cGFuZF9hbmRfZXZhbHVhdGVfYXJpdGgoZXhwX3dvcmQsICZlcnJtc2cpOworCQkJaWYgKGVycm1zZykKKwkJCQlnb3RvIGFyaXRoX2VycjsKKwkJCWRlYnVnX3ByaW50Zl92YXJleHAoImxlbjonJXMnPSVsbGRcbiIsIGV4cF93b3JkLCAobG9uZyBsb25nKWxlbik7CisJCQlpZiAobGVuID49IDApIHsgLyogYmFzaCBjb21wYXQ6IGxlbiA8IDAgaXMgaWxsZWdhbCAqLworCQkJCWlmIChiZWcgPCAwKSAvKiBiYXNoIGNvbXBhdCAqLworCQkJCQliZWcgPSAwOworCQkJCWRlYnVnX3ByaW50Zl92YXJleHAoImZyb20gdmFsOiclcydcbiIsIHZhbCk7CisJCQkJaWYgKGxlbiA9PSAwIHx8ICF2YWwgfHwgYmVnID49IHN0cmxlbih2YWwpKSB7CisgYXJpdGhfZXJyOgorCQkJCQl2YWwgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFBhcmFub2lhLiBXaGF0IGlmIHVzZXIgZW50ZXJlZCA5OTk5OTk5OTk5OTk5CisJCQkJCSAqIHdoaWNoIGZpdHMgaW4gYXJpdGhfdCBidXQgbm90IGludD8gKi8KKwkJCQkJaWYgKGxlbiA+PSBJTlRfTUFYKQorCQkJCQkJbGVuID0gSU5UX01BWDsKKwkJCQkJdmFsID0gdG9fYmVfZnJlZWQgPSB4c3RybmR1cCh2YWwgKyBiZWcsIGxlbik7CisJCQkJfQorCQkJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnXG4iLCB2YWwpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQlkaWVfaWZfc2NyaXB0KCJtYWxmb3JtZWQgJHslczouLi59IiwgdmFyKTsKKwkJCQl2YWwgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgeyAvKiBvbmUgb2YgIi09Kz8iICovCisJCQkvKiBTdGFuZGFyZC1tYW5kYXRlZCBzdWJzdGl0dXRpb24gb3BzOgorCQkJICogJHt2YXI/d29yZH0gLSBpbmRpY2F0ZSBlcnJvciBpZiB1bnNldAorCQkJICogICAgICBJZiB2YXIgaXMgdW5zZXQsIHdvcmQgKG9yIGEgbWVzc2FnZSBpbmRpY2F0aW5nIGl0IGlzIHVuc2V0CisJCQkgKiAgICAgIGlmIHdvcmQgaXMgbnVsbCkgaXMgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnJvcgorCQkJICogICAgICBhbmQgdGhlIHNoZWxsIGV4aXRzIHdpdGggYSBub24temVybyBleGl0IHN0YXR1cy4KKwkJCSAqICAgICAgT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgdmFyIGlzIHN1YnN0aXR1dGVkLgorCQkJICogJHt2YXItd29yZH0gLSB1c2UgZGVmYXVsdCB2YWx1ZQorCQkJICogICAgICBJZiB2YXIgaXMgdW5zZXQsIHdvcmQgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKiAke3Zhcj13b3JkfSAtIGFzc2lnbiBhbmQgdXNlIGRlZmF1bHQgdmFsdWUKKwkJCSAqICAgICAgSWYgdmFyIGlzIHVuc2V0LCB3b3JkIGlzIGFzc2lnbmVkIHRvIHZhci4KKwkJCSAqICAgICAgSW4gYWxsIGNhc2VzLCBmaW5hbCB2YWx1ZSBvZiB2YXIgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKiAke3Zhcit3b3JkfSAtIHVzZSBhbHRlcm5hdGl2ZSB2YWx1ZQorCQkJICogICAgICBJZiB2YXIgaXMgdW5zZXQsIG51bGwgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKiAgICAgIE90aGVyd2lzZSwgd29yZCBpcyBzdWJzdGl0dXRlZC4KKwkJCSAqCisJCQkgKiBXb3JkIGlzIHN1YmplY3RlZCB0byB0aWxkZSBleHBhbnNpb24sIHBhcmFtZXRlciBleHBhbnNpb24sCisJCQkgKiBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYW5kIGFyaXRobWV0aWMgZXhwYW5zaW9uLgorCQkJICogSWYgd29yZCBpcyBub3QgbmVlZGVkLCBpdCBpcyBub3QgZXhwYW5kZWQuCisJCQkgKgorCQkJICogQ29sb24gZm9ybXMgKCR7dmFyOi13b3JkfSwgJHt2YXI6PXdvcmR9IGV0YykgZG8gdGhlIHNhbWUsCisJCQkgKiBidXQgYWxzbyB0cmVhdCBudWxsIHZhciBhcyBpZiBpdCBpcyB1bnNldC4KKwkJCSAqLworCQkJaW50IHVzZV93b3JkID0gKCF2YWwgfHwgKChleHBfc2F2ZSA9PSAnOicpICYmICF2YWxbMF0pKTsKKwkJCWlmIChleHBfb3AgPT0gJysnKQorCQkJCXVzZV93b3JkID0gIXVzZV93b3JkOworCQkJZGVidWdfcHJpbnRmX2V4cGFuZCgiZXhwYW5kOiBvcDolYyAobnVsbDolcykgdGVzdDolaVxuIiwgZXhwX29wLAorCQkJCQkoZXhwX3NhdmUgPT0gJzonKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHVzZV93b3JkKTsKKwkJCWlmICh1c2Vfd29yZCkgeworCQkJCXRvX2JlX2ZyZWVkID0gZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhleHBfd29yZCwgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gMSwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwkJCQlpZiAodG9fYmVfZnJlZWQpCisJCQkJCWV4cF93b3JkID0gdG9fYmVfZnJlZWQ7CisJCQkJaWYgKGV4cF9vcCA9PSAnPycpIHsKKwkJCQkJLyogbWltaWMgYmFzaCBtZXNzYWdlICovCisJCQkJCWRpZV9pZl9zY3JpcHQoIiVzOiAlcyIsCisJCQkJCQl2YXIsCisJCQkJCQlleHBfd29yZFswXSA/IGV4cF93b3JkIDogInBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQiCisJCQkJCSk7CisvL1RPRE86IGhvdyBpbnRlcmFjdGl2ZSBiYXNoIGFib3J0cyBleHBhbnNpb24gbWlkLWNvbW1hbmQ/CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFsID0gZXhwX3dvcmQ7CisJCQkJfQorCisJCQkJaWYgKGV4cF9vcCA9PSAnPScpIHsKKwkJCQkJLyogJHt2YXI9W3dvcmRdfSBvciAke3Zhcjo9W3dvcmRdfSAqLworCQkJCQlpZiAoaXNkaWdpdCh2YXJbMF0pIHx8IHZhclswXSA9PSAnIycpIHsKKwkJCQkJCS8qIG1pbWljIGJhc2ggbWVzc2FnZSAqLworCQkJCQkJZGllX2lmX3NjcmlwdCgiJCVzOiBjYW5ub3QgYXNzaWduIGluIHRoaXMgd2F5IiwgdmFyKTsKKwkJCQkJCXZhbCA9IE5VTEw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljaGFyICpuZXdfdmFyID0geGFzcHJpbnRmKCIlcz0lcyIsIHZhciwgdmFsKTsKKwkJCQkJCXNldF9sb2NhbF92YXIobmV3X3ZhciwgLypleHA6Ki8gMCwgLypsdmw6Ki8gMCwgLypybzoqLyAwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSAvKiBvbmUgb2YgIi09Kz8iICovCisKKwkJKmV4cF9zYXZlcHRyID0gZXhwX3NhdmU7CisJfSAvKiBpZiAoZXhwX29wKSAqLworCisJYXJnWzBdID0gYXJnMDsKKworCSpwcCA9IHA7CisJKnRvX2JlX2ZyZWVkX3BwID0gdG9fYmVfZnJlZWQ7CisJcmV0dXJuIHZhbDsKK30KKworLyogRXhwYW5kIGFsbCB2YXJpYWJsZSByZWZlcmVuY2VzIGluIGdpdmVuIHN0cmluZywgYWRkaW5nIHdvcmRzIHRvIGxpc3RbXQorICogYXQgbiwgbisxLC4uLiBwb3NpdGlvbnMuIFJldHVybiB1cGRhdGVkIG4gKHNvIHRoYXQgbGlzdFtuXSBpcyBuZXh0IG9uZQorICogdG8gYmUgZmlsbGVkKS4gVGhpcyByb3V0aW5lIGlzIGV4dHJlbWVseSB0cmlja3k6IGhhcyB0byBkZWFsIHdpdGgKKyAqIHZhcmlhYmxlcy9wYXJhbWV0ZXJzIHdpdGggd2hpdGVzcGFjZSwgJCogYW5kICRALCBhbmQgY29uc3RydWN0cyBsaWtlCisgKiAnZWNobyAtJCotJy4gSWYgeW91IHBsYXkgaGVyZSwgeW91IG11c3QgcnVuIHRlc3RzdWl0ZSBhZnRlcndhcmRzISAqLworc3RhdGljIE5PSU5MSU5FIGludCBleHBhbmRfdmFyc190b19saXN0KG9fc3RyaW5nICpvdXRwdXQsIGludCBuLCBjaGFyICphcmcpCit7CisJLyogb3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfU0lOR0xFV09SRCAoMHg4MCkgaWYgd2UgYXJlIGluCisJICogZXhwYW5zaW9uIG9mIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50ID09IDEtZWxlbWVudCBleHBhbmQuCisJICovCisJY2hhciBjYW50X2JlX251bGwgPSAwOyAvKiBvbmx5IGJpdCAweDgwIG1hdHRlcnMgKi8KKwlpbnQgZW5kZWRfaW5faWZzID0gMDsgIC8qIGRpZCBsYXN0IHVucXVvdGVkIGV4cGFuc2lvbiBlbmQgd2l0aCBJRlMgY2hhcnM/ICovCisJY2hhciAqcDsKKworCWRlYnVnX3ByaW50Zl9leHBhbmQoImV4cGFuZF92YXJzX3RvX2xpc3Q6IGFyZzonJXMnIHNpbmdsZXdvcmQ6JXhcbiIsIGFyZywKKwkJCSEhKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX1NJTkdMRVdPUkQpKTsKKwlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0Iiwgb3V0cHV0LCBuKTsKKwluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbMF0iLCBvdXRwdXQsIG4pOworCisJd2hpbGUgKChwID0gc3RyY2hyKGFyZywgU1BFQ0lBTF9WQVJfU1lNQk9MKSkgIT0gTlVMTCkgeworCQljaGFyIGZpcnN0X2NoOworCQljaGFyICp0b19iZV9mcmVlZCA9IE5VTEw7CisJCWNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisjaWYgRU5BQkxFX0hVU0hfVElDSworCQlvX3N0cmluZyBzdWJzdF9yZXN1bHQgPSBOVUxMX09fU1RSSU5HOworI2VuZGlmCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQljaGFyIGFyaXRoX2J1ZltzaXplb2YoYXJpdGhfdCkqMyArIDJdOworI2VuZGlmCisKKwkJaWYgKGVuZGVkX2luX2lmcykgeworCQkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCQllbmRlZF9pbl9pZnMgPSAwOworCQl9CisKKwkJb19hZGRibG9jayhvdXRwdXQsIGFyZywgcCAtIGFyZyk7CisJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbMV0iLCBvdXRwdXQsIG4pOworCQlhcmcgPSArK3A7CisJCXAgPSBzdHJjaHIocCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKworCQkvKiBGZXRjaCBzcGVjaWFsIHZhciBuYW1lIChpZiBpdCBpcyBpbmRlZWQgb25lIG9mIHRoZW0pCisJCSAqIGFuZCBxdW90ZSBiaXQsIGZvcmNlIHRoZSBiaXQgb24gaWYgc2luZ2xld29yZCBleHBhbnNpb24gLQorCQkgKiBpbXBvcnRhbnQgZm9yIG5vdCBnZXR0aW5nIHY9JEAgZXhwYW5kIHRvIG1hbnkgd29yZHMuICovCisJCWZpcnN0X2NoID0gYXJnWzBdIHwgKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX1NJTkdMRVdPUkQpOworCisJCS8qIElzIHRoaXMgdmFyaWFibGUgcXVvdGVkIGFuZCB0aHVzIGV4cGFuc2lvbiBjYW4ndCBiZSBudWxsPworCQkgKiAiJEAiIGlzIHNwZWNpYWwuIEV2ZW4gaWYgcXVvdGVkLCBpdCBjYW4gc3RpbGwKKwkJICogZXhwYW5kIHRvIG5vdGhpbmcgKG5vdCBldmVuIGFuIGVtcHR5IHN0cmluZyksCisJCSAqIHRodXMgaXQgaXMgZXhjbHVkZWQuICovCisJCWlmICgoZmlyc3RfY2ggJiAweDdmKSAhPSAnQCcpCisJCQljYW50X2JlX251bGwgfD0gZmlyc3RfY2g7CisKKwkJc3dpdGNoIChmaXJzdF9jaCAmIDB4N2YpIHsKKwkJLyogSGlnaGVzdCBiaXQgaW4gZmlyc3RfY2ggaW5kaWNhdGVzIHRoYXQgdmFyIGlzIGRvdWJsZS1xdW90ZWQgKi8KKwkJY2FzZSAnKic6CisJCWNhc2UgJ0AnOiB7CisJCQlpbnQgaTsKKwkJCWlmICghRy5nbG9iYWxfYXJndlsxXSkKKwkJCQlicmVhazsKKwkJCWkgPSAxOworCQkJY2FudF9iZV9udWxsIHw9IGZpcnN0X2NoOyAvKiBkbyBpdCBmb3IgIiRAIiBfbm93Xywgd2hlbiB3ZSBrbm93IGl0J3Mgbm90IGVtcHR5ICovCisJCQlpZiAoIShmaXJzdF9jaCAmIDB4ODApKSB7IC8qIHVucXVvdGVkICQqIG9yICRAICovCisJCQkJd2hpbGUgKEcuZ2xvYmFsX2FyZ3ZbaV0pIHsKKwkJCQkJbiA9IGV4cGFuZF9vbl9pZnMoTlVMTCwgb3V0cHV0LCBuLCBHLmdsb2JhbF9hcmd2W2ldKTsKKwkJCQkJZGVidWdfcHJpbnRmX2V4cGFuZCgiZXhwYW5kX3ZhcnNfdG9fbGlzdDogYXJndiAlZCAobGFzdCAlZClcbiIsIGksIEcuZ2xvYmFsX2FyZ2MgLSAxKTsKKwkJCQkJaWYgKEcuZ2xvYmFsX2FyZ3ZbaSsrXVswXSAmJiBHLmdsb2JhbF9hcmd2W2ldKSB7CisJCQkJCQkvKiB0aGlzIGFyZ3ZbXSBpcyBub3QgZW1wdHkgYW5kIG5vdCBsYXN0OgorCQkJCQkJICogcHV0IHRlcm1pbmF0aW5nIE5VTCwgc3RhcnQgbmV3IHdvcmQgKi8KKwkJCQkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQkJCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0WzJdIiwgb3V0cHV0LCBuKTsKKwkJCQkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCQkJCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0WzNdIiwgb3V0cHV0LCBuKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZQorCQkJLyogSWYgRVhQX0ZMQUdfU0lOR0xFV09SRCwgd2UgaGFuZGxlIGFzc2lnbm1lbnQgJ2E9Li4uLiRALi4uLi4nCisJCQkgKiBhbmQgaW4gdGhpcyBjYXNlIHNob3VsZCB0cmVhdCBpdCBsaWtlICckKicgLSBzZWUgJ2Vsc2UuLi4nIGJlbG93ICovCisJCQlpZiAoZmlyc3RfY2ggPT0gKCdAJ3wweDgwKSAgLyogcXVvdGVkICRAICovCisJCQkgJiYgIShvdXRwdXQtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19TSU5HTEVXT1JEKSAvKiBub3Qgdj0iJEAiIGNhc2UgKi8KKwkJCSkgeworCQkJCXdoaWxlICgxKSB7CisJCQkJCW9fYWRkUXN0cihvdXRwdXQsIEcuZ2xvYmFsX2FyZ3ZbaV0pOworCQkJCQlpZiAoKytpID49IEcuZ2xvYmFsX2FyZ2MpCisJCQkJCQlicmVhazsKKwkJCQkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwkJCQkJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdFs0XSIsIG91dHB1dCwgbik7CisJCQkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCQkJfQorCQkJfSBlbHNlIHsgLyogcXVvdGVkICQqIChvciB2PSIkQCIgY2FzZSk6IGFkZCBhcyBvbmUgd29yZCAqLworCQkJCXdoaWxlICgxKSB7CisJCQkJCW9fYWRkUXN0cihvdXRwdXQsIEcuZ2xvYmFsX2FyZ3ZbaV0pOworCQkJCQlpZiAoIUcuZ2xvYmFsX2FyZ3ZbKytpXSkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoRy5pZnNbMF0pCisJCQkJCQlvX2FkZGNocihvdXRwdXQsIEcuaWZzWzBdKTsKKwkJCQl9CisJCQkJb3V0cHV0LT5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTUEVDSUFMX1ZBUl9TWU1CT0w6IC8qIDxTUEVDSUFMX1ZBUl9TWU1CT0w+PFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCS8qICJFbXB0eSB2YXJpYWJsZSIsIHVzZWQgdG8gbWFrZSAiIiBldGMgdG8gbm90IGRpc2FwcGVhciAqLworCQkJb3V0cHV0LT5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJYXJnKys7CisJCQljYW50X2JlX251bGwgPSAweDgwOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0hVU0hfVElDSworCQljYXNlICdgJzogLyogPFNQRUNJQUxfVkFSX1NZTUJPTD5gY21kPFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCSpwID0gJ1wwJzsgLyogcmVwbGFjZSB0cmFpbGluZyA8U1BFQ0lBTF9WQVJfU1lNQk9MPiAqLworCQkJYXJnKys7CisJCQkvKiBDYW4ndCBqdXN0IHN0dWZmIGl0IGludG8gb3V0cHV0IG9fc3RyaW5nLAorCQkJICogZXhwYW5kZWQgcmVzdWx0IG1heSBuZWVkIHRvIGJlIGdsb2JiZWQKKwkJCSAqIGFuZCAkSUZTLXNwbGl0dGVkICovCisJCQlkZWJ1Z19wcmludGZfc3Vic3QoIlNVQlNUICclcycgZmlyc3RfY2ggJXhcbiIsIGFyZywgZmlyc3RfY2gpOworCQkJRy5sYXN0X2V4aXRjb2RlID0gcHJvY2Vzc19jb21tYW5kX3N1YnMoJnN1YnN0X3Jlc3VsdCwgYXJnKTsKKwkJCWRlYnVnX3ByaW50Zl9zdWJzdCgiU1VCU1QgUkVTOiVkICclcydcbiIsIEcubGFzdF9leGl0Y29kZSwgc3Vic3RfcmVzdWx0LmRhdGEpOworCQkJdmFsID0gc3Vic3RfcmVzdWx0LmRhdGE7CisJCQlnb3RvIHN0b3JlX3ZhbDsKKyNlbmRpZgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJY2FzZSAnKyc6IHsgLyogPFNQRUNJQUxfVkFSX1NZTUJPTD4rY21kPFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCWFyaXRoX3QgcmVzOworCisJCQlhcmcrKzsgLyogc2tpcCAnKycgKi8KKwkJCSpwID0gJ1wwJzsgLyogcmVwbGFjZSB0cmFpbGluZyA8U1BFQ0lBTF9WQVJfU1lNQk9MPiAqLworCQkJZGVidWdfcHJpbnRmX3N1YnN0KCJBUklUSCAnJXMnIGZpcnN0X2NoICV4XG4iLCBhcmcsIGZpcnN0X2NoKTsKKwkJCXJlcyA9IGV4cGFuZF9hbmRfZXZhbHVhdGVfYXJpdGgoYXJnLCBOVUxMKTsKKwkJCWRlYnVnX3ByaW50Zl9zdWJzdCgiQVJJVEggUkVTICciQVJJVEhfRk1UIidcbiIsIHJlcyk7CisJCQlzcHJpbnRmKGFyaXRoX2J1ZiwgQVJJVEhfRk1ULCByZXMpOworCQkJdmFsID0gYXJpdGhfYnVmOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJdmFsID0gZXhwYW5kX29uZV92YXIoJnRvX2JlX2ZyZWVkLCBhcmcsICZwKTsKKyBJRl9IVVNIX1RJQ0soc3RvcmVfdmFsOikKKwkJCWlmICghKGZpcnN0X2NoICYgMHg4MCkpIHsgLyogdW5xdW90ZWQgJFZBUiAqLworCQkJCWRlYnVnX3ByaW50Zl9leHBhbmQoInVucXVvdGVkICclcycsIG91dHB1dC0+b19lc2NhcGU6JWRcbiIsIHZhbCwKKwkJCQkJCSEhKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSk7CisJCQkJaWYgKHZhbCAmJiB2YWxbMF0pIHsKKwkJCQkJbiA9IGV4cGFuZF9vbl9pZnMoJmVuZGVkX2luX2lmcywgb3V0cHV0LCBuLCB2YWwpOworCQkJCQl2YWwgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qIHF1b3RlZCAkVkFSLCB2YWwgd2lsbCBiZSBhcHBlbmRlZCBiZWxvdyAqLworCQkJCW91dHB1dC0+aGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCQlkZWJ1Z19wcmludGZfZXhwYW5kKCJxdW90ZWQgJyVzJywgb3V0cHV0LT5vX2VzY2FwZTolZFxuIiwgdmFsLAorCQkJCQkJISEob3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCX0gLyogc3dpdGNoIChjaGFyIGFmdGVyIDxTUEVDSUFMX1ZBUl9TWU1CT0w+KSAqLworCisJCWlmICh2YWwgJiYgdmFsWzBdKSB7CisJCQlvX2FkZFFzdHIob3V0cHV0LCB2YWwpOworCQl9CisJCWZyZWUodG9fYmVfZnJlZWQpOworCisJCS8qIFJlc3RvcmUgTlVMTCdlZCBTUEVDSUFMX1ZBUl9TWU1CT0wuCisJCSAqIERvIHRoZSBjaGVjayB0byBhdm9pZCB3cml0aW5nIHRvIGEgY29uc3Qgc3RyaW5nLiAqLworCQlpZiAoKnAgIT0gU1BFQ0lBTF9WQVJfU1lNQk9MKQorCQkJKnAgPSBTUEVDSUFMX1ZBUl9TWU1CT0w7CisKKyNpZiBFTkFCTEVfSFVTSF9USUNLCisJCW9fZnJlZSgmc3Vic3RfcmVzdWx0KTsKKyNlbmRpZgorCQlhcmcgPSArK3A7CisJfSAvKiBlbmQgb2YgIndoaWxlIChTUEVDSUFMX1ZBUl9TWU1CT0wgaXMgZm91bmQpIC4uLiIgKi8KKworCWlmIChhcmdbMF0pIHsKKwkJaWYgKGVuZGVkX2luX2lmcykgeworCQkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCX0KKwkJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdFthXSIsIG91dHB1dCwgbik7CisJCS8qIHRoaXMgcGFydCBpcyBsaXRlcmFsLCBhbmQgaXQgd2FzIGFscmVhZHkgcHJlLXF1b3RlZAorCQkgKiBpZiBuZWVkZWQgKG11Y2ggZWFybGllciksIGRvIG5vdCB1c2Ugb19hZGRRc3RyIGhlcmUhICovCisJCW9fYWRkc3RyX3dpdGhfTlVMKG91dHB1dCwgYXJnKTsKKwkJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdFtiXSIsIG91dHB1dCwgbik7CisJfSBlbHNlIGlmIChvdXRwdXQtPmxlbmd0aCA9PSBvX2dldF9sYXN0X3B0cihvdXRwdXQsIG4pIC8qIGV4cGFuc2lvbiBpcyBlbXB0eSAqLworCSAmJiAhKGNhbnRfYmVfbnVsbCAmIDB4ODApIC8qIGFuZCBhbGwgdmFycyB3ZXJlIG5vdCBxdW90ZWQuICovCisJKSB7CisJCW4tLTsKKwkJLyogYWxsb3cgdG8gcmV1c2UgbGlzdFtuXSBsYXRlciB3aXRob3V0IHJlLWdyb3d0aCAqLworCQlvdXRwdXQtPmhhc19lbXB0eV9zbG90ID0gMTsKKwl9IGVsc2UgeworCQlvX2FkZGNocihvdXRwdXQsICdcMCcpOworCX0KKworCXJldHVybiBuOworfQorCitzdGF0aWMgY2hhciAqKmV4cGFuZF92YXJpYWJsZXMoY2hhciAqKmFyZ3YsIHVuc2lnbmVkIGV4cGZsYWdzKQoreworCWludCBuOworCWNoYXIgKipsaXN0OworCW9fc3RyaW5nIG91dHB1dCA9IE5VTExfT19TVFJJTkc7CisKKwlvdXRwdXQub19leHBmbGFncyA9IGV4cGZsYWdzOworCisJbiA9IDA7CisJd2hpbGUgKCphcmd2KSB7CisJCW4gPSBleHBhbmRfdmFyc190b19saXN0KCZvdXRwdXQsIG4sICphcmd2KTsKKwkJYXJndisrOworCX0KKwlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyaWFibGVzIiwgJm91dHB1dCwgbik7CisKKwkvKiBvdXRwdXQuZGF0YSAobWFsbG9jZWQgaW4gb25lIGJsb2NrKSBnZXRzIHJldHVybmVkIGluICJsaXN0IiAqLworCWxpc3QgPSBvX2ZpbmFsaXplX2xpc3QoJm91dHB1dCwgbik7CisJZGVidWdfcHJpbnRfc3RyaW5ncygiZXhwYW5kX3ZhcmlhYmxlc1sxXSIsIGxpc3QpOworCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgY2hhciAqKmV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjKGNoYXIgKiphcmd2KQoreworCXJldHVybiBleHBhbmRfdmFyaWFibGVzKGFyZ3YsIEVYUF9GTEFHX0dMT0IgfCBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUyk7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorc3RhdGljIGNoYXIgKipleHBhbmRfc3RydmVjX3RvX3N0cnZlY19zaW5nbGV3b3JkX25vZ2xvYihjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBFWFBfRkxBR19TSU5HTEVXT1JEKTsKK30KKyNlbmRpZgorCisvKiBVc2VkIGZvciBleHBhbnNpb24gb2YgcmlnaHQgaGFuZCBvZiBhc3NpZ25tZW50cywKKyAqICQoKC4uLikpLCBoZXJlZG9jcywgdmFyaWFibGUgZXNwYW5zaW9uIHBhcnRzLgorICoKKyAqIE5COiBzaG91bGQgTk9UIGRvIGdsb2JiaW5nIQorICogImV4cG9ydCB2PS9iaW4vYyo7IGVudiB8IGdyZXAgXnY9IiBvdXRwdXRzICJ2PS9iaW4vYyoiCisgKi8KK3N0YXRpYyBjaGFyICpleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBkb191bmJhY2tzbGFzaCkKK3sKKyNpZiAhRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwljb25zdCBpbnQgZG9fdW5iYWNrc2xhc2ggPSAxOworI2VuZGlmCisJY2hhciAqYXJndlsyXSwgKipsaXN0OworCisJZGVidWdfcHJpbnRmX2V4cGFuZCgic3RyaW5nX3RvX3N0cmluZzw9JyVzJ1xuIiwgc3RyKTsKKwkvKiBUaGlzIGlzIGdlbmVyYWxseSBhbiBvcHRpbWl6YXRpb24sIGJ1dCBpdCBhbHNvCisJICogaGFuZGxlcyAiIiwgd2hpY2ggb3RoZXJ3aXNlIHRyaXBzIG92ZXIgIWxpc3RbMF0gY2hlY2sgYmVsb3cuCisJICogKGlzIHRoaXMgZXZlciBoYXBwZW5zIHRoYXQgd2UgYWN0dWFsbHkgZ2V0IHN0cj0iIiBoZXJlPykKKwkgKi8KKwlpZiAoIXN0cmNocihzdHIsIFNQRUNJQUxfVkFSX1NZTUJPTCkgJiYgIXN0cmNocihzdHIsICdcXCcpKSB7CisJCS8vVE9ETzogQ2FuIHVzZSBvbiBzdHJpbmdzIHdpdGggXCB0b28sIGp1c3QgdW5iYWNrc2xhc2goKSB0aGVtPworCQlkZWJ1Z19wcmludGZfZXhwYW5kKCJzdHJpbmdfdG9fc3RyaW5nKGZhc3QpPT4nJXMnXG4iLCBzdHIpOworCQlyZXR1cm4geHN0cmR1cChzdHIpOworCX0KKworCWFyZ3ZbMF0gPSAoY2hhciopc3RyOworCWFyZ3ZbMV0gPSBOVUxMOworCWxpc3QgPSBleHBhbmRfdmFyaWFibGVzKGFyZ3YsIGRvX3VuYmFja3NsYXNoCisJCQk/IEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTIHwgRVhQX0ZMQUdfU0lOR0xFV09SRAorCQkJOiBFWFBfRkxBR19TSU5HTEVXT1JECisJKTsKKwlpZiAoSFVTSF9ERUJVRykKKwkJaWYgKCFsaXN0WzBdIHx8IGxpc3RbMV0pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiQlVHIGluIHZhcmV4cDIiKTsKKwkvKiBhY3R1YWxseSwganVzdCBtb3ZlIHN0cmluZyAyKnNpemVvZihjaGFyKikgYnl0ZXMgYmFjayAqLworCW92ZXJsYXBwaW5nX3N0cmNweSgoY2hhciopbGlzdCwgbGlzdFswXSk7CisJaWYgKGRvX3VuYmFja3NsYXNoKQorCQl1bmJhY2tzbGFzaCgoY2hhciopbGlzdCk7CisJZGVidWdfcHJpbnRmX2V4cGFuZCgic3RyaW5nX3RvX3N0cmluZz0+JyVzJ1xuIiwgKGNoYXIqKWxpc3QpOworCXJldHVybiAoY2hhciopbGlzdDsKK30KKworLyogVXNlZCBmb3IgImV2YWwiIGJ1aWx0aW4gKi8KK3N0YXRpYyBjaGFyKiBleHBhbmRfc3RydmVjX3RvX3N0cmluZyhjaGFyICoqYXJndikKK3sKKwljaGFyICoqbGlzdDsKKworCWxpc3QgPSBleHBhbmRfdmFyaWFibGVzKGFyZ3YsIEVYUF9GTEFHX1NJTkdMRVdPUkQpOworCS8qIENvbnZlcnQgYWxsIE5VTHMgdG8gc3BhY2VzICovCisJaWYgKGxpc3RbMF0pIHsKKwkJaW50IG4gPSAxOworCQl3aGlsZSAobGlzdFtuXSkgeworCQkJaWYgKEhVU0hfREVCVUcpCisJCQkJaWYgKGxpc3Rbbi0xXSArIHN0cmxlbihsaXN0W24tMV0pICsgMSAhPSBsaXN0W25dKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiQlVHIGluIHZhcmV4cDMiKTsKKwkJCS8qIGJhc2ggdXNlcyAnICcgcmVnYXJkbGVzcyBvZiAkSUZTIGNvbnRlbnRzICovCisJCQlsaXN0W25dWy0xXSA9ICcgJzsKKwkJCW4rKzsKKwkJfQorCX0KKwlvdmVybGFwcGluZ19zdHJjcHkoKGNoYXIqKWxpc3QsIGxpc3RbMF0pOworCWRlYnVnX3ByaW50Zl9leHBhbmQoInN0cnZlY190b19zdHJpbmc9JyVzJ1xuIiwgKGNoYXIqKWxpc3QpOworCXJldHVybiAoY2hhciopbGlzdDsKK30KKworc3RhdGljIGNoYXIgKipleHBhbmRfYXNzaWdubWVudHMoY2hhciAqKmFyZ3YsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwljaGFyICoqcDsKKworCUcuZXhwYW5kZWRfYXNzaWdubWVudHMgPSBwID0gTlVMTDsKKwkvKiBFeHBhbmQgYXNzaWdubWVudHMgaW50byBvbmUgc3RyaW5nIGVhY2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlHLmV4cGFuZGVkX2Fzc2lnbm1lbnRzID0gcCA9IGFkZF9zdHJpbmdfdG9fc3RyaW5ncyhwLCBleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhhcmd2W2ldLCAvKnVuYmFja3NsYXNoOiovIDEpKTsKKwl9CisJRy5leHBhbmRlZF9hc3NpZ25tZW50cyA9IE5VTEw7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIHZvaWQgc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3ModW5zaWduZWQgbWFzaykKK3sKKwl1bnNpZ25lZCBzaWcgPSAwOworCXdoaWxlICgobWFzayA+Pj0gMSkgIT0gMCkgeworCQlzaWcrKzsKKwkJaWYgKCEobWFzayAmIDEpKQorCQkJY29udGludWU7CisJCWlmIChHLnRyYXBzKSB7CisJCQlpZiAoRy50cmFwc1tzaWddICYmICFHLnRyYXBzW3NpZ11bMF0pCisJCQkJLyogdHJhcCBpcyAnJywgaGFzIHRvIHJlbWFpbiBTSUdfSUdOICovCisJCQkJY29udGludWU7CisJCQlmcmVlKEcudHJhcHNbc2lnXSk7CisJCQlHLnRyYXBzW3NpZ10gPSBOVUxMOworCQl9CisJCS8qIFdlIGFyZSBoZXJlIG9ubHkgaWYgbm8gdHJhcCBvciB0cmFwIHdhcyBub3QgJycgKi8KKwkJaW5zdGFsbF9zaWdoYW5kbGVyKHNpZywgU0lHX0RGTCk7CisJfQorfQorCisjaWYgQkJfTU1VCisvKiBuZXZlciBjYWxsZWQgKi8KK3ZvaWQgcmVfZXhlY3V0ZV9zaGVsbChjaGFyICoqKnRvX2ZyZWUsIGNvbnN0IGNoYXIgKnMsCisJCWNoYXIgKmdfYXJndjAsIGNoYXIgKipnX2FyZ3YsCisJCWNoYXIgKipidWlsdGluX2FyZ3YpIE5PUkVUVVJOOworCitzdGF0aWMgdm9pZCByZXNldF90cmFwc190b19kZWZhdWx0cyh2b2lkKQoreworCS8qIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBpbiBhIGNoaWxkIHNoZWxsCisJICogYWZ0ZXIgZm9yayAobm90IHZmb3JrLCBOT01NVSBkb2Vzbid0IHVzZSB0aGlzIGZ1bmN0aW9uKS4KKwkgKi8KKwl1bnNpZ25lZCBzaWc7CisJdW5zaWduZWQgbWFzazsKKworCS8qIENoaWxkIHNoZWxscyBhcmUgbm90IGludGVyYWN0aXZlLgorCSAqIFNJR1RUSU4vU0lHVFRPVS9TSUdUU1RQIHNob3VsZCBub3QgaGF2ZSBzcGVjaWFsIGhhbmRsaW5nLgorCSAqIFRlc3RjYXNlOiAod2hpbGUgOjsgZG8gOjsgZG9uZSkgKyBeWiBzaG91bGQgYmFja2dyb3VuZC4KKwkgKiBTYW1lIGdvZXMgZm9yIFNJR1RFUk0sIFNJR0hVUCwgU0lHSU5ULgorCSAqLworCW1hc2sgPSAoRy5zcGVjaWFsX3NpZ19tYXNrICYgU1BFQ0lBTF9JTlRFUkFDVElWRV9TSUdTKSB8IEdfZmF0YWxfc2lnX21hc2s7CisJaWYgKCFHLnRyYXBzICYmICFtYXNrKQorCQlyZXR1cm47IC8qIGFscmVhZHkgbm8gdHJhcHMgYW5kIG5vIHNwZWNpYWwgc2lncyAqLworCisJLyogU3dpdGNoIG9mZiBzcGVjaWFsIHNpZ3MgKi8KKwlzd2l0Y2hfb2ZmX3NwZWNpYWxfc2lncyhtYXNrKTsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlHX2ZhdGFsX3NpZ19tYXNrID0gMDsKKyNlbmRpZgorCUcuc3BlY2lhbF9zaWdfbWFzayAmPSB+U1BFQ0lBTF9JTlRFUkFDVElWRV9TSUdTOworCS8qIFNJR1FVSVQsU0lHQ0hMRCBhbmQgbWF5YmUgU1BFQ0lBTF9KT0JTVE9QX1NJR1MKKwkgKiByZW1haW4gc2V0IGluIEcuc3BlY2lhbF9zaWdfbWFzayAqLworCisJaWYgKCFHLnRyYXBzKQorCQlyZXR1cm47CisKKwkvKiBSZXNldCBhbGwgc2lncyB0byBkZWZhdWx0IGV4Y2VwdCBvbmVzIHdpdGggZW1wdHkgdHJhcHMgKi8KKwlmb3IgKHNpZyA9IDA7IHNpZyA8IE5TSUc7IHNpZysrKSB7CisJCWlmICghRy50cmFwc1tzaWddKQorCQkJY29udGludWU7IC8qIG5vIHRyYXA6IG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKCFHLnRyYXBzW3NpZ11bMF0pCisJCQljb250aW51ZTsgLyogZW1wdHkgdHJhcDogaGFzIHRvIHJlbWFpbiBTSUdfSUdOICovCisJCS8qIHNpZyBoYXMgbm9uLWVtcHR5IHRyYXAsIHJlc2V0IGl0OiAqLworCQlmcmVlKEcudHJhcHNbc2lnXSk7CisJCUcudHJhcHNbc2lnXSA9IE5VTEw7CisJCS8qIFRoZXJlIGlzIG5vIHNpZ25hbCBmb3IgdHJhcCAwIChFWElUKSAqLworCQlpZiAoc2lnID09IDApCisJCQljb250aW51ZTsKKwkJaW5zdGFsbF9zaWdoYW5kbGVyKHNpZywgcGlja19zaWdoYW5kbGVyKHNpZykpOworCX0KK30KKworI2Vsc2UgLyogIUJCX01NVSAqLworCitzdGF0aWMgdm9pZCByZV9leGVjdXRlX3NoZWxsKGNoYXIgKioqdG9fZnJlZSwgY29uc3QgY2hhciAqcywKKwkJY2hhciAqZ19hcmd2MCwgY2hhciAqKmdfYXJndiwKKwkJY2hhciAqKmJ1aWx0aW5fYXJndikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCByZV9leGVjdXRlX3NoZWxsKGNoYXIgKioqdG9fZnJlZSwgY29uc3QgY2hhciAqcywKKwkJY2hhciAqZ19hcmd2MCwgY2hhciAqKmdfYXJndiwKKwkJY2hhciAqKmJ1aWx0aW5fYXJndikKK3sKKyMgZGVmaW5lIE5PTU1VX0hBQ0tfRk1UICgiLSQleDoleDoleDoleDoleDolbGx4IiBJRl9IVVNIX0xPT1BTKCI6JXgiKSkKKwkvKiBkZWxpbXMgKyAyICogKG51bWJlciBvZiBieXRlcyBpbiBwcmludGVkIGhleCBudW1iZXJzKSAqLworCWNoYXIgcGFyYW1fYnVmW3NpemVvZihOT01NVV9IQUNLX0ZNVCkgKyAyICogKHNpemVvZihpbnQpKjYgKyBzaXplb2YobG9uZyBsb25nKSoxKV07CisJY2hhciAqaGVyZWRvY19hcmd2WzRdOworCXN0cnVjdCB2YXJpYWJsZSAqY3VyOworIyBpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwOworIyBlbmRpZgorCWNoYXIgKiphcmd2LCAqKnBwOworCXVuc2lnbmVkIGNudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZW1wdHlfdHJhcF9tYXNrOworCisJaWYgKCFnX2FyZ3YwKSB7IC8qIGhlcmVkb2MgKi8KKwkJYXJndiA9IGhlcmVkb2NfYXJndjsKKwkJYXJndlswXSA9IChjaGFyICopIEcuYXJndjBfZm9yX3JlX2V4ZWNpbmc7CisJCWFyZ3ZbMV0gPSAoY2hhciAqKSAiLTwiOworCQlhcmd2WzJdID0gKGNoYXIgKikgczsKKwkJYXJndlszXSA9IE5VTEw7CisJCXBwID0gJmFyZ3ZbM107IC8qIHVzZWQgYXMgcG9pbnRlciB0byBlbXB0eSBlbnZpcm9ubWVudCAqLworCQlnb3RvIGRvX2V4ZWM7CisJfQorCisJY250ID0gMDsKKwlwcCA9IGJ1aWx0aW5fYXJndjsKKwlpZiAocHApIHdoaWxlICgqcHArKykKKwkJY250Kys7CisKKwllbXB0eV90cmFwX21hc2sgPSAwOworCWlmIChHLnRyYXBzKSB7CisJCWludCBzaWc7CisJCWZvciAoc2lnID0gMTsgc2lnIDwgTlNJRzsgc2lnKyspIHsKKwkJCWlmIChHLnRyYXBzW3NpZ10gJiYgIUcudHJhcHNbc2lnXVswXSkKKwkJCQllbXB0eV90cmFwX21hc2sgfD0gMUxMIDw8IHNpZzsKKwkJfQorCX0KKworCXNwcmludGYocGFyYW1fYnVmLCBOT01NVV9IQUNLX0ZNVAorCQkJLCAodW5zaWduZWQpIEcucm9vdF9waWQKKwkJCSwgKHVuc2lnbmVkKSBHLnJvb3RfcHBpZAorCQkJLCAodW5zaWduZWQpIEcubGFzdF9iZ19waWQKKwkJCSwgKHVuc2lnbmVkKSBHLmxhc3RfZXhpdGNvZGUKKwkJCSwgY250CisJCQksIGVtcHR5X3RyYXBfbWFzaworCQkJSUZfSFVTSF9MT09QUygsIEcuZGVwdGhfb2ZfbG9vcCkKKwkJCSk7CisjIHVuZGVmIE5PTU1VX0hBQ0tfRk1UCisJLyogMTpodXNoIDI6LSQ8cGlkPjo8cGlkPjo8ZXhpdGNvZGU+OjxldGMuLi4+IDx2YXJzLi4uPiA8ZnVuY3MuLi4+CisJICogMzotYyA0OjxjbWQ+IDU6PGFyZzA+IDxhcmdOLi4uPiA2Ok5VTEwKKwkgKi8KKwljbnQgKz0gNjsKKwlmb3IgKGN1ciA9IEcudG9wX3ZhcjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJaWYgKCFjdXItPmZsZ19leHBvcnQgfHwgY3VyLT5mbGdfcmVhZF9vbmx5KQorCQkJY250ICs9IDI7CisJfQorIyBpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlmb3IgKGZ1bmNwID0gRy50b3BfZnVuYzsgZnVuY3A7IGZ1bmNwID0gZnVuY3AtPm5leHQpCisJCWNudCArPSAzOworIyBlbmRpZgorCXBwID0gZ19hcmd2OworCXdoaWxlICgqcHArKykKKwkJY250Kys7CisJKnRvX2ZyZWUgPSBhcmd2ID0gcHAgPSB4emFsbG9jKHNpemVvZihhcmd2WzBdKSAqIGNudCk7CisJKnBwKysgPSAoY2hhciAqKSBHLmFyZ3YwX2Zvcl9yZV9leGVjaW5nOworCSpwcCsrID0gcGFyYW1fYnVmOworCWZvciAoY3VyID0gRy50b3BfdmFyOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQlpZiAoc3RyY21wKGN1ci0+dmFyc3RyLCBodXNoX3ZlcnNpb25fc3RyKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChjdXItPmZsZ19yZWFkX29ubHkpIHsKKwkJCSpwcCsrID0gKGNoYXIgKikgIi1SIjsKKwkJCSpwcCsrID0gY3VyLT52YXJzdHI7CisJCX0gZWxzZSBpZiAoIWN1ci0+ZmxnX2V4cG9ydCkgeworCQkJKnBwKysgPSAoY2hhciAqKSAiLVYiOworCQkJKnBwKysgPSBjdXItPnZhcnN0cjsKKwkJfQorCX0KKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJZm9yIChmdW5jcCA9IEcudG9wX2Z1bmM7IGZ1bmNwOyBmdW5jcCA9IGZ1bmNwLT5uZXh0KSB7CisJCSpwcCsrID0gKGNoYXIgKikgIi1GIjsKKwkJKnBwKysgPSBmdW5jcC0+bmFtZTsKKwkJKnBwKysgPSBmdW5jcC0+Ym9keV9hc19zdHJpbmc7CisJfQorIyBlbmRpZgorCS8qIFdlIGNhbiBwYXNzIGFjdGl2YXRlZCB0cmFwcyBoZXJlLiBTYXksIC1Ubm46dHJhcF9zdHJpbmcKKwkgKgorCSAqIEhvd2V2ZXIsIFBPU0lYIHNheXMgdGhhdCBzdWJzaGVsbHMgcmVzZXQgc2lnbmFscyB3aXRoIHRyYXBzCisJICogdG8gU0lHX0RGTC4KKwkgKiBJIHRlc3RlZCBiYXNoLTMuMiBhbmQgaXQgbm90IG9ubHkgZG9lcyB0aGF0IHdpdGggdHJ1ZSBzdWJzaGVsbHMKKwkgKiBvZiB0aGUgZm9ybSAoIGxpc3QgKSwgYnV0IHdpdGggYW55IGZvcmtlZCBjaGlsZHJlbiBzaGVsbHMuCisJICogSSBzZXQgdHJhcCAiZWNobyBXIiBXSU5DSDsgYW5kIHRoZW4gdHJpZWQ6CisJICoKKwkgKiB7IGVjaG8gMTsgc2xlZXAgMjA7IGVjaG8gMjsgfSAmCisJICogd2hpbGUgdHJ1ZTsgZG8gZWNobyAxOyBzbGVlcCAyMDsgZWNobyAyOyBicmVhazsgZG9uZSAmCisJICogdHJ1ZSB8IHsgZWNobyAxOyBzbGVlcCAyMDsgZWNobyAyOyB9IHwgY2F0CisJICoKKwkgKiBJbiBhbGwgdGhlc2UgY2FzZXMgc2VuZGluZyBTSUdXSU5DSCB0byB0aGUgY2hpbGQgc2hlbGwKKwkgKiBkaWQgbm90IHJ1biB0aGUgdHJhcC4gSWYgSSBhZGQgdHJhcCAiZWNobyBWIiBXSU5DSDsKKwkgKiBfaW5zaWRlXyBncm91cCAoanVzdCBiZWZvcmUgZWNobyAxKSwgaXQgd29ya3MuCisJICoKKwkgKiBJIGNvbmNsdWRlIGl0IG1lYW5zIHdlIGRvbid0IG5lZWQgdG8gcGFzcyBhY3RpdmUgdHJhcHMgaGVyZS4KKwkgKi8KKwkqcHArKyA9IChjaGFyICopICItYyI7CisJKnBwKysgPSAoY2hhciAqKSBzOworCWlmIChidWlsdGluX2FyZ3YpIHsKKwkJd2hpbGUgKCorK2J1aWx0aW5fYXJndikKKwkJCSpwcCsrID0gKmJ1aWx0aW5fYXJndjsKKwkJKnBwKysgPSAoY2hhciAqKSAiIjsKKwl9CisJKnBwKysgPSBnX2FyZ3YwOworCXdoaWxlICgqZ19hcmd2KQorCQkqcHArKyA9ICpnX2FyZ3YrKzsKKwkvKiAqcHAgPSBOVUxMOyAtIGlzIGFscmVhZHkgdGhlcmUgKi8KKwlwcCA9IGVudmlyb247CisKKyBkb19leGVjOgorCWRlYnVnX3ByaW50Zl9leGVjKCJyZV9leGVjdXRlX3NoZWxsIHBpZDolZCBjbWQ6JyVzJ1xuIiwgZ2V0cGlkKCksIHMpOworCS8qIERvbid0IHByb3BhZ2F0ZSBTSUdfSUdOIHRvIHRoZSBjaGlsZCAqLworCWlmIChTUEVDSUFMX0pPQlNUT1BfU0lHUyAhPSAwKQorCQlzd2l0Y2hfb2ZmX3NwZWNpYWxfc2lncyhHLnNwZWNpYWxfc2lnX21hc2sgJiBTUEVDSUFMX0pPQlNUT1BfU0lHUyk7CisJZXhlY3ZlKGJiX2J1c3lib3hfZXhlY19wYXRoLCBhcmd2LCBwcCk7CisJLyogRmFsbGJhY2suIFVzZWZ1bCBmb3IgaW5pdD0vYmluL2h1c2ggdXNhZ2UgZXRjICovCisJaWYgKGFyZ3ZbMF1bMF0gPT0gJy8nKQorCQlleGVjdmUoYXJndlswXSwgYXJndiwgcHApOworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDEyNzsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmUtZXhlY3V0ZSB0aGUgc2hlbGwiKTsKK30KKyNlbmRpZiAgLyogIUJCX01NVSAqLworCisKK3N0YXRpYyBpbnQgcnVuX2FuZF9mcmVlX2xpc3Qoc3RydWN0IHBpcGUgKnBpKTsKKworLyogRXhlY3V0aW5nIGZyb20gc3RyaW5nOiBldmFsLCBzaCAtYyAnLi4uJworICogICAgICAgICAgb3IgZnJvbSBmaWxlOiAvZXRjL3Byb2ZpbGUsIC4gZmlsZSwgc2ggPHNjcmlwdD4sIHNoIChpbnRlcmVhY3RpdmUpCisgKiBlbmRfdHJpZ2dlciBjb250cm9scyBob3cgb2Z0ZW4gd2Ugc3RvcCBwYXJzaW5nCisgKiBOVUw6IHBhcnNlIGFsbCwgZXhlY3V0ZSwgcmV0dXJuCisgKiAnOyc6IHBhcnNlIHRpbGwgJzsnIG9yIG5ld2xpbmUsIGV4ZWN1dGUsIHJlcGVhdCB0aWxsIEVPRgorICovCitzdGF0aWMgdm9pZCBwYXJzZV9hbmRfcnVuX3N0cmVhbShzdHJ1Y3QgaW5fc3RyICppbnAsIGludCBlbmRfdHJpZ2dlcikKK3sKKwkvKiBXaHkgd2UgbmVlZCBlbXB0eSBmbGFnPworCSAqIEFuIG9ic2N1cmUgY29ybmVyIGNhc2UgImZhbHNlOyBgYDsgZWNobyAkPyI6CisJICogZW1wdHkgY29tbWFuZCBpbiBgYCBzaG91bGQgc3RpbGwgc2V0ICQ/IHRvIDAuCisJICogQnV0IHdlIGNhbid0IGp1c3Qgc2V0ICQ/IHRvIDAgYXQgdGhlIHN0YXJ0LAorCSAqIHRoaXMgYnJlYWtzICJmYWxzZTsgZWNobyBgZWNobyAkP2AiIGNhc2UuCisJICovCisJYm9vbCBlbXB0eSA9IDE7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHBpcGUgKnBpcGVfbGlzdDsKKworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisJCWlmIChlbmRfdHJpZ2dlciA9PSAnOycpCisJCQlpbnAtPnByb21wdG1vZGUgPSAwOyAvKiBQUzEgKi8KKyNlbmRpZgorCQlwaXBlX2xpc3QgPSBwYXJzZV9zdHJlYW0oTlVMTCwgaW5wLCBlbmRfdHJpZ2dlcik7CisJCWlmICghcGlwZV9saXN0IHx8IHBpcGVfbGlzdCA9PSBFUlJfUFRSKSB7IC8qIEVPRi9lcnJvciAqLworCQkJLyogSWYgd2UgYXJlIGluICJiaWciIHNjcmlwdAorCQkJICogKG5vdCBpbiBgY21kYCBvciBzb21ldGhpbmcgc2ltaWxhcikuLi4KKwkJCSAqLworCQkJaWYgKHBpcGVfbGlzdCA9PSBFUlJfUFRSICYmIGVuZF90cmlnZ2VyID09ICc7JykgeworCQkJCS8qIERpc2NhcmQgY2FjaGVkIGlucHV0IChyZXN0IG9mIGxpbmUpICovCisJCQkJaW50IGNoID0gaW5wLT5sYXN0X2NoYXI7CisJCQkJd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKSB7CisJCQkJCS8vYmJfZXJyb3JfbXNnKCJEaXNjYXJkZWQ6JyVjJyIsIGNoKTsKKwkJCQkJY2ggPSBpX2dldGNoKGlucCk7CisJCQkJfQorCQkJCS8qIEZvcmNlIHByb21wdCAqLworCQkJCWlucC0+cCA9IE5VTEw7CisJCQkJLyogVGhpcyBzdHJlYW0gaXNuJ3QgZW1wdHkgKi8KKwkJCQllbXB0eSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXBpcGVfbGlzdCAmJiBlbXB0eSkKKwkJCQlHLmxhc3RfZXhpdGNvZGUgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJZGVidWdfcHJpbnRfdHJlZShwaXBlX2xpc3QsIDApOworCQlkZWJ1Z19wcmludGZfZXhlYygicGFyc2VfYW5kX3J1bl9zdHJlYW06IHJ1bl9hbmRfZnJlZV9saXN0XG4iKTsKKwkJcnVuX2FuZF9mcmVlX2xpc3QocGlwZV9saXN0KTsKKwkJZW1wdHkgPSAwOworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQlpZiAoRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyA9PSAxKQorCQkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2FuZF9ydW5fc3RyaW5nKGNvbnN0IGNoYXIgKnMpCit7CisJc3RydWN0IGluX3N0ciBpbnB1dDsKKwlzZXR1cF9zdHJpbmdfaW5fc3RyKCZpbnB1dCwgcyk7CisJcGFyc2VfYW5kX3J1bl9zdHJlYW0oJmlucHV0LCAnXDAnKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfYW5kX3J1bl9maWxlKEZJTEUgKmYpCit7CisJc3RydWN0IGluX3N0ciBpbnB1dDsKKwlzZXR1cF9maWxlX2luX3N0cigmaW5wdXQsIGYpOworCXBhcnNlX2FuZF9ydW5fc3RyZWFtKCZpbnB1dCwgJzsnKTsKK30KKworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKK3N0YXRpYyBGSUxFICpnZW5lcmF0ZV9zdHJlYW1fZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqcywgcGlkX3QgKnBpZF9wKQoreworCXBpZF90IHBpZDsKKwlpbnQgY2hhbm5lbFsyXTsKKyMgaWYgIUJCX01NVQorCWNoYXIgKip0b19mcmVlID0gTlVMTDsKKyMgZW5kaWYKKworCXhwaXBlKGNoYW5uZWwpOworCXBpZCA9IEJCX01NVSA/IHhmb3JrKCkgOiB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsgLyogY2hpbGQgKi8KKwkJZGlzYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsKKwkJLyogUHJvY2VzcyBzdWJzdGl0dXRpb24gaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgdXN1YWwKKwkJICogJ2NvbW1hbmQgZXhlY3V0aW9uJy4KKwkJICogU1VTdjMgc2F5cyBjdHJsLVogc2hvdWxkIGJlIGlnbm9yZWQsIGN0cmwtQyBzaG91bGQgbm90LgorCQkgKi8KKwkJYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR1RTVFApCisJCQkrICgxIDw8IFNJR1RUSU4pCisJCQkrICgxIDw8IFNJR1RUT1UpCisJCQksIFNJR19JR04pOworCQlDTEVBUl9SQU5ET01fVCgmRy5yYW5kb21fZ2VuKTsgLyogb3IgZWxzZSAkUkFORE9NIHJlcGVhdHMgaW4gY2hpbGQgKi8KKwkJY2xvc2UoY2hhbm5lbFswXSk7IC8qIE5COiBjbG9zZSBfZmlyc3RfLCB0aGVuIG1vdmUgZmQhICovCisJCXhtb3ZlX2ZkKGNoYW5uZWxbMV0sIDEpOworCQkvKiBQcmV2ZW50IGl0IGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBjdHJsLXogZXRjICovCisJCUlGX0hVU0hfSk9CKEcucnVuX2xpc3RfbGV2ZWwgPSAxOykKKwkJLyogQXdmdWwgaGFjayBmb3IgYHRyYXBgIG9yICQodHJhcCkuCisJCSAqCisJCSAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvdHJhcC5odG1sCisJCSAqIGNvbnRhaW5zIGFuIGV4YW1wbGUgd2hlcmUgInRyYXAiIGlzIGV4ZWN1dGVkIGluIGEgc3Vic2hlbGw6CisJCSAqCisJCSAqIHNhdmVfdHJhcHM9JCh0cmFwKQorCQkgKiAuLi4KKwkJICogZXZhbCAiJHNhdmVfdHJhcHMiCisJCSAqCisJCSAqIFN0YW5kYXJkIGRvZXMgbm90IHNheSB0aGF0ICJ0cmFwIiBpbiBzdWJzaGVsbCBzaGFsbCBwcmludAorCQkgKiBwYXJlbnQgc2hlbGwncyB0cmFwcy4gSXQgb25seSBzYXlzIHRoYXQgaXRzIG91dHB1dAorCQkgKiBtdXN0IGhhdmUgc3VpdGFibGUgZm9ybSwgYnV0IHRoZW4sIGluIHRoZSBhYm92ZSBleGFtcGxlCisJCSAqICh3aGljaCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgbm9ybWF0aXZlKSwgaXQgaW1wbGllcyB0aGF0LgorCQkgKgorCQkgKiBiYXNoIChhbmQgcHJvYmFibHkgb3RoZXIgc2hlbGwpIGRvZXMgaW1wbGVtZW50IGl0CisJCSAqICh0cmFwcyBhcmUgcmVzZXQgdG8gZGVmYXVsdHMsIGJ1dCAidHJhcCIgc3RpbGwgc2hvd3MgdGhlbSksCisJCSAqIGJ1dCBhcyBhIHJlc3VsdCwgInRyYXAiIGxvZ2ljIGlzIGhvcGVsZXNzbHkgbWVzc2VkIHVwOgorCQkgKgorCQkgKiAjIHRyYXAKKwkJICogdHJhcCAtLSAnZWNobyBIbycgU0lHV0lOQ0ggIDwtLS0gd2UgaGF2ZSBhIGhhbmRsZXIKKwkJICogIyAodHJhcCkgICAgICAgIDwtLS0gdHJhcCBpcyBpbiBzdWJzaGVsbCAtIG5vIG91dHB1dCAoY29ycmVjdCwgdHJhcHMgYXJlIHJlc2V0KQorCQkgKiAjIHRydWUgfCB0cmFwICAgPC0tLSB0cmFwIGlzIGluIHN1YnNoZWxsIC0gbm8gb3V0cHV0IChkaXR0bykKKwkJICogIyBlY2hvIGB0cnVlIHwgdHJhcGAgICAgPC0tLSBpbiBzdWJzaGVsbCAtIG91dHB1dCAoYnV0IHRyYXBzIGFyZSByZXNldCEpCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqICMgZWNobyBgKHRyYXApYCAgICAgICAgIDwtLS0gaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgLSBvdXRwdXQKKwkJICogdHJhcCAtLSAnZWNobyBIbycgU0lHV0lOQ0gKKwkJICogIyBlY2hvIGB0cnVlIHwgKHRyYXApYCAgPC0tLSBpbiBzdWJzaGVsbCBpbiBzdWJzaGVsbCBpbiBzdWJzaGVsbCAtIG91dHB1dCEKKwkJICogdHJhcCAtLSAnZWNobyBIbycgU0lHV0lOQ0gKKwkJICoKKwkJICogVGhlIHJ1bGVzIHdoZW4gdG8gZm9yZ2V0IGFuZCB3aGVuIHRvIG5vdCBmb3JnZXQgdHJhcHMKKwkJICogZ2V0IHJlYWxseSBjb21wbGV4IGFuZCBub25zZW5zaWNhbC4KKwkJICoKKwkJICogT3VyIHNvbHV0aW9uOiBPTkxZIGJhcmUgJCh0cmFwKSBvciBgdHJhcGAgaXMgc3BlY2lhbC4KKwkJICovCisJCXMgPSBza2lwX3doaXRlc3BhY2Uocyk7CisJCWlmIChzdHJuY21wKHMsICJ0cmFwIiwgNCkgPT0gMAorCQkgJiYgc2tpcF93aGl0ZXNwYWNlKHMgKyA0KVswXSA9PSAnXDAnCisJCSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFyZ3ZbXSA9IHsgTlVMTCwgTlVMTCB9OworCQkJYnVpbHRpbl90cmFwKChjaGFyKiopYXJndik7CisJCQlleGl0KDApOyAvKiBub3QgX2V4aXQoKSAtIHdlIG5lZWQgdG8gZmZsdXNoICovCisJCX0KKyMgaWYgQkJfTU1VCisJCXJlc2V0X3RyYXBzX3RvX2RlZmF1bHRzKCk7CisJCXBhcnNlX2FuZF9ydW5fc3RyaW5nKHMpOworCQlfZXhpdChHLmxhc3RfZXhpdGNvZGUpOworIyBlbHNlCisJLyogV2UgcmUtZXhlY3V0ZSBhZnRlciB2Zm9yayBvbiBOT01NVS4gVGhpcyBtYWtlcyB0aGlzIHNjcmlwdCBzYWZlOgorCSAqIHllcyAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIgfCBkZCBicz0zMiBjb3VudD02NGsgPkJJRworCSAqIGh1Z2U9YGNhdCBCSUdgICMgd2FzIGJsb2NraW5nIGhlcmUgZm9yZXZlcgorCSAqIGVjaG8gT0sKKwkgKi8KKwkJcmVfZXhlY3V0ZV9zaGVsbCgmdG9fZnJlZSwKKwkJCQlzLAorCQkJCUcuZ2xvYmFsX2FyZ3ZbMF0sCisJCQkJRy5nbG9iYWxfYXJndiArIDEsCisJCQkJTlVMTCk7CisjIGVuZGlmCisJfQorCisJLyogcGFyZW50ICovCisJKnBpZF9wID0gcGlkOworIyBpZiBFTkFCTEVfSFVTSF9GQVNUCisJRy5jb3VudF9TSUdDSExEKys7CisvL2JiX2Vycm9yX21zZygiWyVkXSBmb3JrIGluIGdlbmVyYXRlX3N0cmVhbV9mcm9tX3N0cmluZzoiCisvLwkJIiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLAorLy8JCWdldHBpZCgpLCBHLmNvdW50X1NJR0NITEQsIEcuaGFuZGxlZF9TSUdDSExEKTsKKyMgZW5kaWYKKwllbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisjIGlmICFCQl9NTVUKKwlmcmVlKHRvX2ZyZWUpOworIyBlbmRpZgorCWNsb3NlKGNoYW5uZWxbMV0pOworCWNsb3NlX29uX2V4ZWNfb24oY2hhbm5lbFswXSk7CisJcmV0dXJuIHhmZG9wZW5fZm9yX3JlYWQoY2hhbm5lbFswXSk7Cit9CisKKy8qIFJldHVybiBjb2RlIGlzIGV4aXQgc3RhdHVzIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgcnVuLiAqLworc3RhdGljIGludCBwcm9jZXNzX2NvbW1hbmRfc3VicyhvX3N0cmluZyAqZGVzdCwgY29uc3QgY2hhciAqcykKK3sKKwlGSUxFICpmcDsKKwlzdHJ1Y3QgaW5fc3RyIHBpcGVfc3RyOworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzLCBjaCwgZW9sX2NudDsKKworCWZwID0gZ2VuZXJhdGVfc3RyZWFtX2Zyb21fc3RyaW5nKHMsICZwaWQpOworCisJLyogTm93IHNlbmQgcmVzdWx0cyBvZiBjb21tYW5kIGJhY2sgaW50byBvcmlnaW5hbCBjb250ZXh0ICovCisJc2V0dXBfZmlsZV9pbl9zdHIoJnBpcGVfc3RyLCBmcCk7CisJZW9sX2NudCA9IDA7CisJd2hpbGUgKChjaCA9IGlfZ2V0Y2goJnBpcGVfc3RyKSkgIT0gRU9GKSB7CisJCWlmIChjaCA9PSAnXG4nKSB7CisJCQllb2xfY250Kys7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoZW9sX2NudCkgeworCQkJb19hZGRjaHIoZGVzdCwgJ1xuJyk7CisJCQllb2xfY250LS07CisJCX0KKwkJb19hZGRRY2hyKGRlc3QsIGNoKTsKKwl9CisKKwlkZWJ1Z19wcmludGYoImRvbmUgcmVhZGluZyBmcm9tIGBjbWRgIHBpcGUsIGNsb3NpbmcgaXRcbiIpOworCWZjbG9zZShmcCk7CisJLyogV2UgbmVlZCB0byBleHRyYWN0IGV4aXRjb2RlLiBUZXN0IGNhc2UKKwkgKiAidHJ1ZTsgZWNobyBgc2xlZXAgMTsgZmFsc2VgICQ/IgorCSAqIHNob3VsZCBwcmludCAxICovCisJc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7CisJZGVidWdfcHJpbnRmKCJjaGlsZCBleGl0ZWQuIHJldHVybmluZyBpdHMgZXhpdGNvZGU6JWRcbiIsIFdFWElUU1RBVFVTKHN0YXR1cykpOworCXJldHVybiBXRVhJVFNUQVRVUyhzdGF0dXMpOworfQorI2VuZGlmIC8qIEVOQUJMRV9IVVNIX1RJQ0sgKi8KKworCitzdGF0aWMgdm9pZCBzZXR1cF9oZXJlZG9jKHN0cnVjdCByZWRpcl9zdHJ1Y3QgKnJlZGlyKQoreworCXN0cnVjdCBmZF9wYWlyIHBhaXI7CisJcGlkX3QgcGlkOworCWludCBsZW4sIHdyaXR0ZW47CisJLyogdGhlIF9ib2R5XyBvZiBoZXJlZG9jIChtaXNsZWFkaW5nIGZpZWxkIG5hbWUpICovCisJY29uc3QgY2hhciAqaGVyZWRvYyA9IHJlZGlyLT5yZF9maWxlbmFtZTsKKwljaGFyICpleHBhbmRlZDsKKyNpZiAhQkJfTU1VCisJY2hhciAqKnRvX2ZyZWU7CisjZW5kaWYKKworCWV4cGFuZGVkID0gTlVMTDsKKwlpZiAoIShyZWRpci0+cmRfZHVwICYgSEVSRURPQ19RVU9URUQpKSB7CisJCWV4cGFuZGVkID0gZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhoZXJlZG9jLCAvKnByb2Nlc3NfYmtzbGFzaDoqLyAxLCAvKnVuYmFja3NsYXNoOiovIDEpOworCQlpZiAoZXhwYW5kZWQpCisJCQloZXJlZG9jID0gZXhwYW5kZWQ7CisJfQorCWxlbiA9IHN0cmxlbihoZXJlZG9jKTsKKworCWNsb3NlKHJlZGlyLT5yZF9mZCk7IC8qIG9mdGVuIHNhdmVzIGR1cDIrY2xvc2UgaW4geG1vdmVfZmQgKi8KKwl4cGlwZWRfcGFpcihwYWlyKTsKKwl4bW92ZV9mZChwYWlyLnJkLCByZWRpci0+cmRfZmQpOworCisJLyogVHJ5IHdyaXRpbmcgd2l0aG91dCBmb3JraW5nLiBOZXdlciBrZXJuZWxzIGhhdmUKKwkgKiBkeW5hbWljYWxseSBncm93aW5nIHBpcGVzLiBNdXN0IHVzZSBub24tYmxvY2tpbmcgd3JpdGUhICovCisJbmRlbGF5X29uKHBhaXIud3IpOworCXdoaWxlICgxKSB7CisJCXdyaXR0ZW4gPSB3cml0ZShwYWlyLndyLCBoZXJlZG9jLCBsZW4pOworCQlpZiAod3JpdHRlbiA8PSAwKQorCQkJYnJlYWs7CisJCWxlbiAtPSB3cml0dGVuOworCQlpZiAobGVuID09IDApIHsKKwkJCWNsb3NlKHBhaXIud3IpOworCQkJZnJlZShleHBhbmRlZCk7CisJCQlyZXR1cm47CisJCX0KKwkJaGVyZWRvYyArPSB3cml0dGVuOworCX0KKwluZGVsYXlfb2ZmKHBhaXIud3IpOworCisJLyogT2theSwgcGlwZSBidWZmZXIgd2FzIG5vdCBiaWcgZW5vdWdoICovCisJLyogTm90ZTogd2UgbXVzdCBub3QgY3JlYXRlIGEgc3RyYXkgY2hpbGQgKGJhc3RhcmQ/IDopCisJICogZm9yIHRoZSB1bnN1c3BlY3RpbmcgcGFyZW50IHByb2Nlc3MuIENoaWxkIGNyZWF0ZXMgYSBncmFuZGNoaWxkCisJICogYW5kIGV4aXRzIGJlZm9yZSBwYXJlbnQgZXhlY3MgdGhlIHByb2Nlc3Mgd2hpY2ggY29uc3VtZXMgaGVyZWRvYworCSAqICh0aGF0IGV4ZWMgaGFwcGVucyBhZnRlciB3ZSByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uKSAqLworI2lmICFCQl9NTVUKKwl0b19mcmVlID0gTlVMTDsKKyNlbmRpZgorCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBjaGlsZCAqLworCQlkaXNhYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpOworCQlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJCWlmIChwaWQgIT0gMCkKKwkJCV9leGl0KDApOworCQkvKiBncmFuZGNoaWxkICovCisJCWNsb3NlKHJlZGlyLT5yZF9mZCk7IC8qIHJlYWQgc2lkZSBvZiB0aGUgcGlwZSAqLworI2lmIEJCX01NVQorCQlmdWxsX3dyaXRlKHBhaXIud3IsIGhlcmVkb2MsIGxlbik7IC8qIG1heSBsb29wIG9yIGJsb2NrICovCisJCV9leGl0KDApOworI2Vsc2UKKwkJLyogRGVsZWdhdGUgYmxvY2tpbmcgd3JpdGVzIHRvIGFub3RoZXIgcHJvY2VzcyAqLworCQl4bW92ZV9mZChwYWlyLndyLCBTVERPVVRfRklMRU5PKTsKKwkJcmVfZXhlY3V0ZV9zaGVsbCgmdG9fZnJlZSwgaGVyZWRvYywgTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKwl9CisJLyogcGFyZW50ICovCisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCUcuY291bnRfU0lHQ0hMRCsrOworLy9iYl9lcnJvcl9tc2coIlslZF0gZm9yayBpbiBzZXR1cF9oZXJlZG9jOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisjZW5kaWYKKwllbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisjaWYgIUJCX01NVQorCWZyZWUodG9fZnJlZSk7CisjZW5kaWYKKwljbG9zZShwYWlyLndyKTsKKwlmcmVlKGV4cGFuZGVkKTsKKwl3YWl0KE5VTEwpOyAvKiB3YWl0IHRpbGwgY2hpbGQgaGFzIGRpZWQgKi8KK30KKworLyogc3F1aXJyZWwgIT0gTlVMTCBtZWFucyB3ZSBzcXVpcnJlbCBhd2F5IGNvcGllcyBvZiBzdGRpbiwgc3Rkb3V0LAorICogYW5kIHN0ZGVyciBpZiB0aGV5IGFyZSByZWRpcmVjdGVkLiAqLworc3RhdGljIGludCBzZXR1cF9yZWRpcmVjdHMoc3RydWN0IGNvbW1hbmQgKnByb2csIGludCBzcXVpcnJlbFtdKQoreworCWludCBvcGVuZmQsIG1vZGU7CisJc3RydWN0IHJlZGlyX3N0cnVjdCAqcmVkaXI7CisKKwlmb3IgKHJlZGlyID0gcHJvZy0+cmVkaXJlY3RzOyByZWRpcjsgcmVkaXIgPSByZWRpci0+bmV4dCkgeworCQlpZiAocmVkaXItPnJkX3R5cGUgPT0gUkVESVJFQ1RfSEVSRURPQzIpIHsKKwkJCS8qIHJkX2ZkPDxIRVJFIGNhc2UgKi8KKwkJCWlmIChzcXVpcnJlbCAmJiByZWRpci0+cmRfZmQgPCAzCisJCQkgJiYgc3F1aXJyZWxbcmVkaXItPnJkX2ZkXSA8IDAKKwkJCSkgeworCQkJCXNxdWlycmVsW3JlZGlyLT5yZF9mZF0gPSBkdXAocmVkaXItPnJkX2ZkKTsKKwkJCX0KKwkJCS8qIGZvciBSRURJUkVDVF9IRVJFRE9DMiwgcmRfZmlsZW5hbWUgaG9sZHMgX2NvbnRlbnRzXworCQkJICogb2YgdGhlIGhlcmVkb2MgKi8KKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgic2V0IGhlcmVkb2MgJyVzJ1xuIiwKKwkJCQkJcmVkaXItPnJkX2ZpbGVuYW1lKTsKKwkJCXNldHVwX2hlcmVkb2MocmVkaXIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmVkaXItPnJkX2R1cCA9PSBSRURJUkZEX1RPX0ZJTEUpIHsKKwkJCS8qIHJkX2ZkPCo+ZmlsZSBjYXNlICg8Kj4gaXMgPCw+LD4+LDw+KSAqLworCQkJY2hhciAqcDsKKwkJCWlmIChyZWRpci0+cmRfZmlsZW5hbWUgPT0gTlVMTCkgeworCQkJCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGluIHRoZSBwYXJzZS4KKwkJCQkgKiBQcmV0ZW5kIGl0IGRpZG4ndCBoYXBwZW4gKi8KKwkJCQliYl9lcnJvcl9tc2coImJ1ZyBpbiByZWRpcmVjdCBwYXJzZSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbW9kZSA9IHJlZGlyX3RhYmxlW3JlZGlyLT5yZF90eXBlXS5tb2RlOworCQkJcCA9IGV4cGFuZF9zdHJpbmdfdG9fc3RyaW5nKHJlZGlyLT5yZF9maWxlbmFtZSwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwkJCW9wZW5mZCA9IG9wZW5fb3Jfd2FybihwLCBtb2RlKTsKKwkJCWZyZWUocCk7CisJCQlpZiAob3BlbmZkIDwgMCkgeworCQkJLyogdGhpcyBjb3VsZCBnZXQgbG9zdCBpZiBzdGRlcnIgaGFzIGJlZW4gcmVkaXJlY3RlZCwgYnV0CisJCQkgKiBiYXNoIGFuZCBhc2ggYm90aCBsb3NlIGl0IGFzIHdlbGwgKHRob3VnaCB6c2ggZG9lc24ndCEpICovCisvL3doYXQgdGhlIGFib3ZlIGNvbW1lbnQgdHJpZXMgdG8gc2F5PworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogcmRfZmQ8Kj5yZF9kdXAgb3IgcmRfZmQ8Kj4tIGNhc2VzICovCisJCQlvcGVuZmQgPSByZWRpci0+cmRfZHVwOworCQl9CisKKwkJaWYgKG9wZW5mZCAhPSByZWRpci0+cmRfZmQpIHsKKwkJCWlmIChzcXVpcnJlbCAmJiByZWRpci0+cmRfZmQgPCAzCisJCQkgJiYgc3F1aXJyZWxbcmVkaXItPnJkX2ZkXSA8IDAKKwkJCSkgeworCQkJCXNxdWlycmVsW3JlZGlyLT5yZF9mZF0gPSBkdXAocmVkaXItPnJkX2ZkKTsKKwkJCX0KKwkJCWlmIChvcGVuZmQgPT0gUkVESVJGRF9DTE9TRSkgeworCQkJCS8qICJuPi0iIG1lYW5zICJjbG9zZSBtZSIgKi8KKwkJCQljbG9zZShyZWRpci0+cmRfZmQpOworCQkJfSBlbHNlIHsKKwkJCQl4ZHVwMihvcGVuZmQsIHJlZGlyLT5yZF9mZCk7CisJCQkJaWYgKHJlZGlyLT5yZF9kdXAgPT0gUkVESVJGRF9UT19GSUxFKQorCQkJCQljbG9zZShvcGVuZmQpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX3JlZGlyZWN0cyhpbnQgc3F1aXJyZWxbXSkKK3sKKwlpbnQgaSwgZmQ7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlmZCA9IHNxdWlycmVsW2ldOworCQlpZiAoZmQgIT0gLTEpIHsKKwkJCS8qIFdlIHNpbXBseSBkaWUgb24gZXJyb3IgKi8KKwkJCXhtb3ZlX2ZkKGZkLCBpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGNoYXIgKmZpbmRfaW5fcGF0aChjb25zdCBjaGFyICphcmcpCit7CisJY2hhciAqcmV0ID0gTlVMTDsKKwljb25zdCBjaGFyICpQQVRIID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiUEFUSCIpOworCisJaWYgKCFQQVRIKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKmVuZCA9IHN0cmNocm51bChQQVRILCAnOicpOworCQlpbnQgc3ogPSBlbmQgLSBQQVRIOyAvKiBtdXN0IGJlIGludCEgKi8KKworCQlmcmVlKHJldCk7CisJCWlmIChzeiAhPSAwKSB7CisJCQlyZXQgPSB4YXNwcmludGYoIiUuKnMvJXMiLCBzeiwgUEFUSCwgYXJnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGhhdmUgeHh4Ojp5eXl5IGluICRQQVRILAorCQkJICogaXQgbWVhbnMgInVzZSBjdXJyZW50IGRpciIgKi8KKwkJCXJldCA9IHhzdHJkdXAoYXJnKTsKKwkJfQorCQlpZiAoYWNjZXNzKHJldCwgRl9PSykgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmICgqZW5kID09ICdcMCcpIHsKKwkJCWZyZWUocmV0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVBBVEggPSBlbmQgKyAxOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqZmluZF9idWlsdGluX2hlbHBlcihjb25zdCBjaGFyICpuYW1lLAorCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeCwKKwkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKmVuZCkKK3sKKwl3aGlsZSAoeCAhPSBlbmQpIHsKKwkJaWYgKHN0cmNtcChuYW1lLCB4LT5iX2NtZCkgIT0gMCkgeworCQkJeCsrOworCQkJY29udGludWU7CisJCX0KKwkJZGVidWdfcHJpbnRmX2V4ZWMoImZvdW5kIGJ1aWx0aW4gJyVzJ1xuIiwgbmFtZSk7CisJCXJldHVybiB4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqZmluZF9idWlsdGluMShjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBmaW5kX2J1aWx0aW5faGVscGVyKG5hbWUsIGJsdGluczEsICZibHRpbnMxW0FSUkFZX1NJWkUoYmx0aW5zMSldKTsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqZmluZF9idWlsdGluKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKnggPSBmaW5kX2J1aWx0aW4xKG5hbWUpOworCWlmICh4KQorCQlyZXR1cm4geDsKKwlyZXR1cm4gZmluZF9idWlsdGluX2hlbHBlcihuYW1lLCBibHRpbnMyLCAmYmx0aW5zMltBUlJBWV9TSVpFKGJsdGluczIpXSk7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKK3N0YXRpYyBzdHJ1Y3QgZnVuY3Rpb24gKipmaW5kX2Z1bmN0aW9uX3Nsb3QoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZnVuY3Rpb24gKipmdW5jcHAgPSAmRy50b3BfZnVuYzsKKwl3aGlsZSAoKmZ1bmNwcCkgeworCQlpZiAoc3RyY21wKG5hbWUsICgqZnVuY3BwKS0+bmFtZSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJZnVuY3BwID0gJigqZnVuY3BwKS0+bmV4dDsKKwl9CisJcmV0dXJuIGZ1bmNwcDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZmluZF9mdW5jdGlvbihjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZnVuY3AgPSAqZmluZF9mdW5jdGlvbl9zbG90KG5hbWUpOworCWlmIChmdW5jcCkKKwkJZGVidWdfcHJpbnRmX2V4ZWMoImZvdW5kIGZ1bmN0aW9uICclcydcbiIsIG5hbWUpOworCXJldHVybiBmdW5jcDsKK30KKworLyogTm90ZTogdGFrZXMgb3duZXJzaGlwIG9uIG5hbWUgcHRyICovCitzdGF0aWMgc3RydWN0IGZ1bmN0aW9uICpuZXdfZnVuY3Rpb24oY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZnVuY3Rpb24gKipmdW5jcHAgPSBmaW5kX2Z1bmN0aW9uX3Nsb3QobmFtZSk7CisJc3RydWN0IGZ1bmN0aW9uICpmdW5jcCA9ICpmdW5jcHA7CisKKwlpZiAoZnVuY3AgIT0gTlVMTCkgeworCQlzdHJ1Y3QgY29tbWFuZCAqY21kID0gZnVuY3AtPnBhcmVudF9jbWQ7CisJCWRlYnVnX3ByaW50Zl9leGVjKCJmdW5jICVwIHBhcmVudF9jbWQgJXBcbiIsIGZ1bmNwLCBjbWQpOworCQlpZiAoIWNtZCkgeworCQkJZGVidWdfcHJpbnRmX2V4ZWMoImZyZWVpbmcgJiByZXBsYWNpbmcgZnVuY3Rpb24gJyVzJ1xuIiwgZnVuY3AtPm5hbWUpOworCQkJZnJlZShmdW5jcC0+bmFtZSk7CisJCQkvKiBOb3RlOiBpZiAhZnVuY3AtPmJvZHksIGRvIG5vdCBmcmVlIGJvZHlfYXNfc3RyaW5nIQorCQkJICogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiAiLUYgbmFtZSBib2R5IiBmdW5jdGlvbjoKKwkJCSAqIGJvZHlfYXNfc3RyaW5nIHdhcyBub3QgbWFsbG9jZWQhICovCisJCQlpZiAoZnVuY3AtPmJvZHkpIHsKKwkJCQlmcmVlX3BpcGVfbGlzdChmdW5jcC0+Ym9keSk7CisjIGlmICFCQl9NTVUKKwkJCQlmcmVlKGZ1bmNwLT5ib2R5X2FzX3N0cmluZyk7CisjIGVuZGlmCisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWJ1Z19wcmludGZfZXhlYygicmVpbnNlcnRpbmcgaW4gdHJlZSAmIHJlcGxhY2luZyBmdW5jdGlvbiAnJXMnXG4iLCBmdW5jcC0+bmFtZSk7CisJCQljbWQtPmFyZ3ZbMF0gPSBmdW5jcC0+bmFtZTsKKwkJCWNtZC0+Z3JvdXAgPSBmdW5jcC0+Ym9keTsKKyMgaWYgIUJCX01NVQorCQkJY21kLT5ncm91cF9hc19zdHJpbmcgPSBmdW5jcC0+Ym9keV9hc19zdHJpbmc7CisjIGVuZGlmCisJCX0KKwl9IGVsc2UgeworCQlkZWJ1Z19wcmludGZfZXhlYygicmVtZW1iZXJpbmcgbmV3IGZ1bmN0aW9uICclcydcbiIsIG5hbWUpOworCQlmdW5jcCA9ICpmdW5jcHAgPSB4emFsbG9jKHNpemVvZigqZnVuY3ApKTsKKwkJLypmdW5jcC0+bmV4dCA9IE5VTEw7Ki8KKwl9CisKKwlmdW5jcC0+bmFtZSA9IG5hbWU7CisJcmV0dXJuIGZ1bmNwOworfQorCitzdGF0aWMgdm9pZCB1bnNldF9mdW5jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZ1bmN0aW9uICoqZnVuY3BwID0gZmluZF9mdW5jdGlvbl9zbG90KG5hbWUpOworCXN0cnVjdCBmdW5jdGlvbiAqZnVuY3AgPSAqZnVuY3BwOworCisJaWYgKGZ1bmNwICE9IE5VTEwpIHsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoImZyZWVpbmcgZnVuY3Rpb24gJyVzJ1xuIiwgZnVuY3AtPm5hbWUpOworCQkqZnVuY3BwID0gZnVuY3AtPm5leHQ7CisJCS8qIGZ1bmNwIGlzIHVubGlua2VkIG5vdywgZGVsZXRpbmcgaXQuCisJCSAqIE5vdGU6IGlmICFmdW5jcC0+Ym9keSwgdGhlIGZ1bmN0aW9uIHdhcyBjcmVhdGVkIGJ5CisJCSAqICItRiBuYW1lIGJvZHkiLCBkbyBub3QgZnJlZSAtPmJvZHlfYXNfc3RyaW5nCisJCSAqIGFuZCAtPm5hbWUgYXMgdGhleSB3ZXJlIG5vdCBtYWxsb2NlZC4gKi8KKwkJaWYgKGZ1bmNwLT5ib2R5KSB7CisJCQlmcmVlX3BpcGVfbGlzdChmdW5jcC0+Ym9keSk7CisJCQlmcmVlKGZ1bmNwLT5uYW1lKTsKKyMgaWYgIUJCX01NVQorCQkJZnJlZShmdW5jcC0+Ym9keV9hc19zdHJpbmcpOworIyBlbmRpZgorCQl9CisJCWZyZWUoZnVuY3ApOworCX0KK30KKworIyBpZiBCQl9NTVUKKyNkZWZpbmUgZXhlY19mdW5jdGlvbih0b19mcmVlLCBmdW5jcCwgYXJndikgXAorCWV4ZWNfZnVuY3Rpb24oZnVuY3AsIGFyZ3YpCisjIGVuZGlmCitzdGF0aWMgdm9pZCBleGVjX2Z1bmN0aW9uKGNoYXIgKioqdG9fZnJlZSwKKwkJY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmdW5jcCwKKwkJY2hhciAqKmFyZ3YpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZXhlY19mdW5jdGlvbihjaGFyICoqKnRvX2ZyZWUsCisJCWNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZnVuY3AsCisJCWNoYXIgKiphcmd2KQoreworIyBpZiBCQl9NTVUKKwlpbnQgbiA9IDE7CisKKwlhcmd2WzBdID0gRy5nbG9iYWxfYXJndlswXTsKKwlHLmdsb2JhbF9hcmd2ID0gYXJndjsKKwl3aGlsZSAoKisrYXJndikKKwkJbisrOworCUcuZ2xvYmFsX2FyZ2MgPSBuOworCS8qIE9uIE1NVSwgZnVuY3AtPmJvZHkgaXMgYWx3YXlzIG5vbi1OVUxMICovCisJbiA9IHJ1bl9saXN0KGZ1bmNwLT5ib2R5KTsKKwlmZmx1c2hfYWxsKCk7CisJX2V4aXQobik7CisjIGVsc2UKKwlyZV9leGVjdXRlX3NoZWxsKHRvX2ZyZWUsCisJCQlmdW5jcC0+Ym9keV9hc19zdHJpbmcsCisJCQlHLmdsb2JhbF9hcmd2WzBdLAorCQkJYXJndiArIDEsCisJCQlOVUxMKTsKKyMgZW5kaWYKK30KKworc3RhdGljIGludCBydW5fZnVuY3Rpb24oY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmdW5jcCwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCXNhdmVfYXJnX3Qgc3Y7CisJc21hbGxpbnQgc3ZfZmxnOworCisJc2F2ZV9hbmRfcmVwbGFjZV9HX2FyZ3MoJnN2LCBhcmd2KTsKKworCS8qICJ3ZSBhcmUgaW4gZnVuY3Rpb24sIG9rIHRvIHVzZSByZXR1cm4iICovCisJc3ZfZmxnID0gRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzczsKKwlHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzID0gLTE7CisjIGlmIEVOQUJMRV9IVVNIX0xPQ0FMCisJRy5mdW5jX25lc3RfbGV2ZWwrKzsKKyMgZW5kaWYKKworCS8qIE9uIE1NVSwgZnVuY3AtPmJvZHkgaXMgYWx3YXlzIG5vbi1OVUxMICovCisjIGlmICFCQl9NTVUKKwlpZiAoIWZ1bmNwLT5ib2R5KSB7CisJCS8qIEZ1bmN0aW9uIGRlZmluZWQgYnkgLUYgKi8KKwkJcGFyc2VfYW5kX3J1bl9zdHJpbmcoZnVuY3AtPmJvZHlfYXNfc3RyaW5nKTsKKwkJcmMgPSBHLmxhc3RfZXhpdGNvZGU7CisJfSBlbHNlCisjIGVuZGlmCisJeworCQlyYyA9IHJ1bl9saXN0KGZ1bmNwLT5ib2R5KTsKKwl9CisKKyMgaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwl7CisJCXN0cnVjdCB2YXJpYWJsZSAqdmFyOworCQlzdHJ1Y3QgdmFyaWFibGUgKip2YXJfcHA7CisKKwkJdmFyX3BwID0gJkcudG9wX3ZhcjsKKwkJd2hpbGUgKCh2YXIgPSAqdmFyX3BwKSAhPSBOVUxMKSB7CisJCQlpZiAodmFyLT5mdW5jX25lc3RfbGV2ZWwgPCBHLmZ1bmNfbmVzdF9sZXZlbCkgeworCQkJCXZhcl9wcCA9ICZ2YXItPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBVbmV4cG9ydCAqLworCQkJaWYgKHZhci0+ZmxnX2V4cG9ydCkKKwkJCQliYl91bnNldGVudih2YXItPnZhcnN0cik7CisJCQkvKiBSZW1vdmUgZnJvbSBnbG9iYWwgbGlzdCAqLworCQkJKnZhcl9wcCA9IHZhci0+bmV4dDsKKwkJCS8qIEZyZWUgKi8KKwkJCWlmICghdmFyLT5tYXhfbGVuKQorCQkJCWZyZWUodmFyLT52YXJzdHIpOworCQkJZnJlZSh2YXIpOworCQl9CisJCUcuZnVuY19uZXN0X2xldmVsLS07CisJfQorIyBlbmRpZgorCUcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPSBzdl9mbGc7CisKKwlyZXN0b3JlX0dfYXJncygmc3YsIGFyZ3YpOworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUyAqLworCisKKyNpZiBCQl9NTVUKKyNkZWZpbmUgZXhlY19idWlsdGluKHRvX2ZyZWUsIHgsIGFyZ3YpIFwKKwlleGVjX2J1aWx0aW4oeCwgYXJndikKKyNlbHNlCisjZGVmaW5lIGV4ZWNfYnVpbHRpbih0b19mcmVlLCB4LCBhcmd2KSBcCisJZXhlY19idWlsdGluKHRvX2ZyZWUsIGFyZ3YpCisjZW5kaWYKK3N0YXRpYyB2b2lkIGV4ZWNfYnVpbHRpbihjaGFyICoqKnRvX2ZyZWUsCisJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4LAorCQljaGFyICoqYXJndikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBleGVjX2J1aWx0aW4oY2hhciAqKip0b19mcmVlLAorCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeCwKKwkJY2hhciAqKmFyZ3YpCit7CisjaWYgQkJfTU1VCisJaW50IHJjb2RlOworCWZmbHVzaF9hbGwoKTsKKwlyY29kZSA9IHgtPmJfZnVuY3Rpb24oYXJndik7CisJZmZsdXNoX2FsbCgpOworCV9leGl0KHJjb2RlKTsKKyNlbHNlCisJZmZsdXNoX2FsbCgpOworCS8qIE9uIE5PTU1VLCB3ZSBtdXN0IG5ldmVyIGJsb2NrIQorCSAqIEV4YW1wbGU6IHsgc2xlZXAgOTkgfCByZWFkIGxpbmU7IH0gJiBlY2hvIE9rCisJICovCisJcmVfZXhlY3V0ZV9zaGVsbCh0b19mcmVlLAorCQkJYXJndlswXSwKKwkJCUcuZ2xvYmFsX2FyZ3ZbMF0sCisJCQlHLmdsb2JhbF9hcmd2ICsgMSwKKwkJCWFyZ3YpOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgZXhlY3ZwX29yX2RpZShjaGFyICoqYXJndikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBleGVjdnBfb3JfZGllKGNoYXIgKiphcmd2KQoreworCWRlYnVnX3ByaW50Zl9leGVjKCJleGVjaW5nICclcydcbiIsIGFyZ3ZbMF0pOworCS8qIERvbid0IHByb3BhZ2F0ZSBTSUdfSUdOIHRvIHRoZSBjaGlsZCAqLworCWlmIChTUEVDSUFMX0pPQlNUT1BfU0lHUyAhPSAwKQorCQlzd2l0Y2hfb2ZmX3NwZWNpYWxfc2lncyhHLnNwZWNpYWxfc2lnX21hc2sgJiBTUEVDSUFMX0pPQlNUT1BfU0lHUyk7CisJZXhlY3ZwKGFyZ3ZbMF0sIGFyZ3YpOworCWJiX3BlcnJvcl9tc2coImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworCV9leGl0KDEyNyk7IC8qIGJhc2ggY29tcGF0ICovCit9CisKKyNpZiBFTkFCTEVfSFVTSF9NT0RFX1gKK3N0YXRpYyB2b2lkIGR1bXBfY21kX2luX3hfbW9kZShjaGFyICoqYXJndikKK3sKKwlpZiAoR194X21vZGUgJiYgYXJndikgeworCQkvKiBXZSB3YW50IHRvIG91dHB1dCB0aGUgbGluZSBpbiBvbmUgd3JpdGUgb3AgKi8KKwkJY2hhciAqYnVmLCAqcDsKKwkJaW50IGxlbjsKKwkJaW50IG47CisKKwkJbGVuID0gMzsKKwkJbiA9IDA7CisJCXdoaWxlIChhcmd2W25dKQorCQkJbGVuICs9IHN0cmxlbihhcmd2W24rK10pICsgMTsKKwkJYnVmID0geG1hbGxvYyhsZW4pOworCQlidWZbMF0gPSAnKyc7CisJCXAgPSBidWYgKyAxOworCQluID0gMDsKKwkJd2hpbGUgKGFyZ3Zbbl0pCisJCQlwICs9IHNwcmludGYocCwgIiAlcyIsIGFyZ3ZbbisrXSk7CisJCSpwKysgPSAnXG4nOworCQkqcCA9ICdcMCc7CisJCWZwdXRzKGJ1Ziwgc3RkZXJyKTsKKwkJZnJlZShidWYpOworCX0KK30KKyNlbHNlCisjIGRlZmluZSBkdW1wX2NtZF9pbl94X21vZGUoYXJndikgKCh2b2lkKTApCisjZW5kaWYKKworI2lmIEJCX01NVQorI2RlZmluZSBwc2V1ZG9fZXhlY19hcmd2KG5vbW11X3NhdmUsIGFyZ3YsIGFzc2lnbm1lbnRfY250LCBhcmd2X2V4cGFuZGVkKSBcCisJcHNldWRvX2V4ZWNfYXJndihhcmd2LCBhc3NpZ25tZW50X2NudCwgYXJndl9leHBhbmRlZCkKKyNkZWZpbmUgcHNldWRvX2V4ZWMobm9tbXVfc2F2ZSwgY29tbWFuZCwgYXJndl9leHBhbmRlZCkgXAorCXBzZXVkb19leGVjKGNvbW1hbmQsIGFyZ3ZfZXhwYW5kZWQpCisjZW5kaWYKKworLyogQ2FsbGVkIGFmdGVyIFt2XWZvcmsoKSBpbiBydW5fcGlwZSwgb3IgZnJvbSBidWlsdGluX2V4ZWMuCisgKiBOZXZlciByZXR1cm5zLgorICogRG9uJ3QgZXhpdCgpIGhlcmUuICBJZiB5b3UgZG9uJ3QgZXhlYywgdXNlIF9leGl0IGluc3RlYWQuCisgKiBUaGUgYXRfZXhpdCBoYW5kbGVycyBhcHBhcmVudGx5IGNvbmZ1c2UgdGhlIGNhbGxpbmcgcHJvY2VzcywKKyAqIGluIHBhcnRpY3VsYXIgc3RkaW4gaGFuZGxpbmcuICBOb3Qgc3VyZSB3aHk/IC0tIGJlY2F1c2Ugb2YgdmZvcmshICh2ZGEpICovCitzdGF0aWMgdm9pZCBwc2V1ZG9fZXhlY19hcmd2KG5vbW11X3NhdmVfdCAqbm9tbXVfc2F2ZSwKKwkJY2hhciAqKmFyZ3YsIGludCBhc3NpZ25tZW50X2NudCwKKwkJY2hhciAqKmFyZ3ZfZXhwYW5kZWQpIE5PUkVUVVJOOworc3RhdGljIE5PSU5MSU5FIHZvaWQgcHNldWRvX2V4ZWNfYXJndihub21tdV9zYXZlX3QgKm5vbW11X3NhdmUsCisJCWNoYXIgKiphcmd2LCBpbnQgYXNzaWdubWVudF9jbnQsCisJCWNoYXIgKiphcmd2X2V4cGFuZGVkKQoreworCWNoYXIgKipuZXdfZW52OworCisJbmV3X2VudiA9IGV4cGFuZF9hc3NpZ25tZW50cyhhcmd2LCBhc3NpZ25tZW50X2NudCk7CisJZHVtcF9jbWRfaW5feF9tb2RlKG5ld19lbnYpOworCisJaWYgKCFhcmd2W2Fzc2lnbm1lbnRfY250XSkgeworCQkvKiBDYXNlIHdoZW4gd2UgYXJlIGhlcmU6IC4uLiB8IHZhcj12YWwgfCAuLi4KKwkJICogKG5vdGUgdGhhdCB3ZSBkbyBub3QgZXhpdCBlYXJseSwgaS5lLiwgZG8gbm90IG9wdGltaXplIG91dAorCQkgKiBleHBhbmRfYXNzaWdubWVudHMoKTogdGhpbmsgYWJvdXQgLi4uIHwgdmFyPWBzbGVlcCAxYCB8IC4uLgorCQkgKi8KKwkJZnJlZV9zdHJpbmdzKG5ld19lbnYpOworCQlfZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKworI2lmIEJCX01NVQorCXNldF92YXJzX2FuZF9zYXZlX29sZChuZXdfZW52KTsKKwlmcmVlKG5ld19lbnYpOyAvKiBvcHRpb25hbCAqLworCS8qIHdlIGNhbiBhbHNvIGRlc3Ryb3kgc2V0X3ZhcnNfYW5kX3NhdmVfb2xkJ3MgcmV0dXJuIHZhbHVlLAorCSAqIHRvIHNhdmUgbWVtb3J5ICovCisjZWxzZQorCW5vbW11X3NhdmUtPm5ld19lbnYgPSBuZXdfZW52OworCW5vbW11X3NhdmUtPm9sZF92YXJzID0gc2V0X3ZhcnNfYW5kX3NhdmVfb2xkKG5ld19lbnYpOworI2VuZGlmCisKKwlpZiAoYXJndl9leHBhbmRlZCkgeworCQlhcmd2ID0gYXJndl9leHBhbmRlZDsKKwl9IGVsc2UgeworCQlhcmd2ID0gZXhwYW5kX3N0cnZlY190b19zdHJ2ZWMoYXJndiArIGFzc2lnbm1lbnRfY250KTsKKyNpZiAhQkJfTU1VCisJCW5vbW11X3NhdmUtPmFyZ3YgPSBhcmd2OworI2VuZGlmCisJfQorCWR1bXBfY21kX2luX3hfbW9kZShhcmd2KTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUgfHwgQkJfTU1VCisJaWYgKHN0cmNocihhcmd2WzBdLCAnLycpICE9IE5VTEwpCisJCWdvdG8gc2tpcDsKKyNlbmRpZgorCisJLyogQ2hlY2sgaWYgdGhlIGNvbW1hbmQgbWF0Y2hlcyBhbnkgb2YgdGhlIGJ1aWx0aW5zLgorCSAqIERlcGVuZGluZyBvbiBjb250ZXh0LCB0aGlzIG1pZ2h0IGJlIHJlZHVuZGFudC4gIEJ1dCBpdCdzCisJICogZWFzaWVyIHRvIHdhc3RlIGEgZmV3IENQVSBjeWNsZXMgdGhhbiBpdCBpcyB0byBmaWd1cmUgb3V0CisJICogaWYgdGhpcyBpcyBvbmUgb2YgdGhvc2UgY2FzZXMuCisJICovCisJeworCQkvKiBPbiBOT01NVSwgaXQgaXMgbW9yZSBleHBlbnNpdmUgdG8gcmUtZXhlY3V0ZSBzaGVsbAorCQkgKiBqdXN0IGluIG9yZGVyIHRvIHJ1biBlY2hvIG9yIHRlc3QgYnVpbHRpbi4KKwkJICogSXQncyBiZXR0ZXIgdG8gc2tpcCBpdCBoZXJlIGFuZCBydW4gY29ycmVzcG9uZGluZworCQkgKiBub24tYnVpbHRpbiBsYXRlci4gKi8KKwkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKng7CisJCXggPSBCQl9NTVUgPyBmaW5kX2J1aWx0aW4oYXJndlswXSkgOiBmaW5kX2J1aWx0aW4xKGFyZ3ZbMF0pOworCQlpZiAoeCkgeworCQkJZXhlY19idWlsdGluKCZub21tdV9zYXZlLT5hcmd2X2Zyb21fcmVfZXhlY2luZywgeCwgYXJndik7CisJCX0KKwl9CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJLyogQ2hlY2sgaWYgdGhlIGNvbW1hbmQgbWF0Y2hlcyBhbnkgZnVuY3Rpb25zICovCisJeworCQljb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwID0gZmluZF9mdW5jdGlvbihhcmd2WzBdKTsKKwkJaWYgKGZ1bmNwKSB7CisJCQlleGVjX2Z1bmN0aW9uKCZub21tdV9zYXZlLT5hcmd2X2Zyb21fcmVfZXhlY2luZywgZnVuY3AsIGFyZ3YpOworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisJLyogQ2hlY2sgaWYgdGhlIGNvbW1hbmQgbWF0Y2hlcyBhbnkgYnVzeWJveCBhcHBsZXRzICovCisJeworCQlpbnQgYSA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXJndlswXSk7CisJCWlmIChhID49IDApIHsKKyMgaWYgQkJfTU1VIC8qIHNlZSBhYm92ZSB3aHkgb24gTk9NTVUgaXQgaXMgbm90IGFsbG93ZWQgKi8KKwkJCWlmIChBUFBMRVRfSVNfTk9FWEVDKGEpKSB7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bm5pbmcgYXBwbGV0ICclcydcbiIsIGFyZ3ZbMF0pOworCQkJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYSwgYXJndik7CisJCQl9CisjIGVuZGlmCisJCQkvKiBSZS1leGVjIG91cnNlbHZlcyAqLworCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJlLWV4ZWNpbmcgYXBwbGV0ICclcydcbiIsIGFyZ3ZbMF0pOworCQkJLyogRG9uJ3QgcHJvcGFnYXRlIFNJR19JR04gdG8gdGhlIGNoaWxkICovCisJCQlpZiAoU1BFQ0lBTF9KT0JTVE9QX1NJR1MgIT0gMCkKKwkJCQlzd2l0Y2hfb2ZmX3NwZWNpYWxfc2lncyhHLnNwZWNpYWxfc2lnX21hc2sgJiBTUEVDSUFMX0pPQlNUT1BfU0lHUyk7CisJCQlleGVjdihiYl9idXN5Ym94X2V4ZWNfcGF0aCwgYXJndik7CisJCQkvKiBJZiB0aGV5IGNhbGxlZCBjaHJvb3Qgb3Igb3RoZXJ3aXNlIG1hZGUgdGhlIGJpbmFyeSBubyBsb25nZXIKKwkJCSAqIGV4ZWN1dGFibGUsIGZhbGwgdGhyb3VnaCAqLworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FIHx8IEJCX01NVQorIHNraXA6CisjZW5kaWYKKwlleGVjdnBfb3JfZGllKGFyZ3YpOworfQorCisvKiBDYWxsZWQgYWZ0ZXIgW3ZdZm9yaygpIGluIHJ1bl9waXBlCisgKi8KK3N0YXRpYyB2b2lkIHBzZXVkb19leGVjKG5vbW11X3NhdmVfdCAqbm9tbXVfc2F2ZSwKKwkJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQsCisJCWNoYXIgKiphcmd2X2V4cGFuZGVkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHBzZXVkb19leGVjKG5vbW11X3NhdmVfdCAqbm9tbXVfc2F2ZSwKKwkJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQsCisJCWNoYXIgKiphcmd2X2V4cGFuZGVkKQoreworCWlmIChjb21tYW5kLT5hcmd2KSB7CisJCXBzZXVkb19leGVjX2FyZ3Yobm9tbXVfc2F2ZSwgY29tbWFuZC0+YXJndiwKKwkJCQljb21tYW5kLT5hc3NpZ25tZW50X2NudCwgYXJndl9leHBhbmRlZCk7CisJfQorCisJaWYgKGNvbW1hbmQtPmdyb3VwKSB7CisJCS8qIENhc2VzIHdoZW4gd2UgYXJlIGhlcmU6CisJCSAqICggbGlzdCApCisJCSAqIHsgbGlzdCB9ICYKKwkJICogLi4uIHwgKCBsaXN0ICkgfCAuLi4KKwkJICogLi4uIHwgeyBsaXN0IH0gfCAuLi4KKwkJICovCisjaWYgQkJfTU1VCisJCWludCByY29kZTsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoInBzZXVkb19leGVjOiBydW5fbGlzdFxuIik7CisJCXJlc2V0X3RyYXBzX3RvX2RlZmF1bHRzKCk7CisJCXJjb2RlID0gcnVuX2xpc3QoY29tbWFuZC0+Z3JvdXApOworCQkvKiBPSyB0byBsZWFrIG1lbW9yeSBieSBub3QgY2FsbGluZyBmcmVlX3BpcGVfbGlzdCwKKwkJICogc2luY2UgdGhpcyBwcm9jZXNzIGlzIGFib3V0IHRvIGV4aXQgKi8KKwkJX2V4aXQocmNvZGUpOworI2Vsc2UKKwkJcmVfZXhlY3V0ZV9zaGVsbCgmbm9tbXVfc2F2ZS0+YXJndl9mcm9tX3JlX2V4ZWNpbmcsCisJCQkJY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nLAorCQkJCUcuZ2xvYmFsX2FyZ3ZbMF0sCisJCQkJRy5nbG9iYWxfYXJndiArIDEsCisJCQkJTlVMTCk7CisjZW5kaWYKKwl9CisKKwkvKiBDYXNlIHdoZW4gd2UgYXJlIGhlcmU6IC4uLiB8ID5maWxlICovCisJZGVidWdfcHJpbnRmX2V4ZWMoInBzZXVkb19leGVjJ2VkIG51bGwgY29tbWFuZFxuIik7CisJX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9jbWR0ZXh0KHN0cnVjdCBwaXBlICpwaSkKK3sKKwljaGFyICoqYXJndjsKKwljaGFyICpwOworCWludCBsZW47CisKKwkvKiBUaGlzIGlzIHN1YnRsZS4gLT5jbWR0ZXh0IGlzIGNyZWF0ZWQgb25seSBvbiBmaXJzdCBiYWNrZ3JvdW5kaW5nLgorCSAqIChUaGluayAiY2F0LCA8Y3RybC16PiwgZmcsIDxjdHJsLXo+LCBmZywgPGN0cmwtej4uLi4uIiBoZXJlLi4uKQorCSAqIE9uIHN1YnNlcXVlbnQgYmcgYXJndiBpcyB0cmFzaGVkLCBidXQgd2Ugd29uJ3QgdXNlIGl0ICovCisJaWYgKHBpLT5jbWR0ZXh0KQorCQlyZXR1cm4gcGktPmNtZHRleHQ7CisJYXJndiA9IHBpLT5jbWRzWzBdLmFyZ3Y7CisJaWYgKCFhcmd2IHx8ICFhcmd2WzBdKSB7CisJCXBpLT5jbWR0ZXh0ID0geHphbGxvYygxKTsKKwkJcmV0dXJuIHBpLT5jbWR0ZXh0OworCX0KKworCWxlbiA9IDA7CisJZG8geworCQlsZW4gKz0gc3RybGVuKCphcmd2KSArIDE7CisJfSB3aGlsZSAoKisrYXJndik7CisJcCA9IHhtYWxsb2MobGVuKTsKKwlwaS0+Y21kdGV4dCA9IHA7CisJYXJndiA9IHBpLT5jbWRzWzBdLmFyZ3Y7CisJZG8geworCQlsZW4gPSBzdHJsZW4oKmFyZ3YpOworCQltZW1jcHkocCwgKmFyZ3YsIGxlbik7CisJCXAgKz0gbGVuOworCQkqcCsrID0gJyAnOworCX0gd2hpbGUgKCorK2FyZ3YpOworCXBbLTFdID0gJ1wwJzsKKwlyZXR1cm4gcGktPmNtZHRleHQ7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9iZ19qb2Ioc3RydWN0IHBpcGUgKnBpKQoreworCXN0cnVjdCBwaXBlICpqb2IsICoqam9icDsKKwlpbnQgaTsKKworCS8qIExpbmVhciBzZWFyY2ggZm9yIHRoZSBJRCBvZiB0aGUgam9iIHRvIHVzZSAqLworCXBpLT5qb2JpZCA9IDE7CisJZm9yIChqb2IgPSBHLmpvYl9saXN0OyBqb2I7IGpvYiA9IGpvYi0+bmV4dCkKKwkJaWYgKGpvYi0+am9iaWQgPj0gcGktPmpvYmlkKQorCQkJcGktPmpvYmlkID0gam9iLT5qb2JpZCArIDE7CisKKwkvKiBBZGQgam9iIHRvIHRoZSBsaXN0IG9mIHJ1bm5pbmcgam9icyAqLworCWpvYnAgPSAmRy5qb2JfbGlzdDsKKwl3aGlsZSAoKGpvYiA9ICpqb2JwKSAhPSBOVUxMKQorCQlqb2JwID0gJmpvYi0+bmV4dDsKKwlqb2IgPSAqam9icCA9IHhtYWxsb2Moc2l6ZW9mKCpqb2IpKTsKKworCSpqb2IgPSAqcGk7IC8qIHBoeXNpY2FsIGNvcHkgKi8KKwlqb2ItPm5leHQgPSBOVUxMOworCWpvYi0+Y21kcyA9IHh6YWxsb2Moc2l6ZW9mKHBpLT5jbWRzWzBdKSAqIHBpLT5udW1fY21kcyk7CisJLyogQ2Fubm90IGNvcHkgZW50aXJlIHBpLT5jbWRzW10gdmVjdG9yISBUaGlzIGNhdXNlcyBkb3VibGUgZnJlZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGktPm51bV9jbWRzOyBpKyspIHsKKwkJam9iLT5jbWRzW2ldLnBpZCA9IHBpLT5jbWRzW2ldLnBpZDsKKwkJLyogYWxsIG90aGVyIGZpZWxkcyBhcmUgbm90IHVzZWQgYW5kIHN0YXkgemVybyAqLworCX0KKwlqb2ItPmNtZHRleHQgPSB4c3RyZHVwKGdldF9jbWR0ZXh0KHBpKSk7CisKKwlpZiAoR19pbnRlcmFjdGl2ZV9mZCkKKwkJcHJpbnRmKCJbJWRdICVkICVzXG4iLCBqb2ItPmpvYmlkLCBqb2ItPmNtZHNbMF0ucGlkLCBqb2ItPmNtZHRleHQpOworCUcubGFzdF9qb2JpZCA9IGpvYi0+am9iaWQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9iZ19qb2Ioc3RydWN0IHBpcGUgKnBpKQoreworCXN0cnVjdCBwaXBlICpwcmV2X3BpcGU7CisKKwlpZiAocGkgPT0gRy5qb2JfbGlzdCkgeworCQlHLmpvYl9saXN0ID0gcGktPm5leHQ7CisJfSBlbHNlIHsKKwkJcHJldl9waXBlID0gRy5qb2JfbGlzdDsKKwkJd2hpbGUgKHByZXZfcGlwZS0+bmV4dCAhPSBwaSkKKwkJCXByZXZfcGlwZSA9IHByZXZfcGlwZS0+bmV4dDsKKwkJcHJldl9waXBlLT5uZXh0ID0gcGktPm5leHQ7CisJfQorCWlmIChHLmpvYl9saXN0KQorCQlHLmxhc3Rfam9iaWQgPSBHLmpvYl9saXN0LT5qb2JpZDsKKwllbHNlCisJCUcubGFzdF9qb2JpZCA9IDA7Cit9CisKKy8qIFJlbW92ZSBhIGJhY2tncm91bmRlZCBqb2IgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZV9maW5pc2hlZF9iZ19qb2Ioc3RydWN0IHBpcGUgKnBpKQoreworCXJlbW92ZV9iZ19qb2IocGkpOworCWZyZWVfcGlwZShwaSk7Cit9CisjZW5kaWYgLyogSk9CICovCisKKy8qIENoZWNrIHRvIHNlZSBpZiBhbnkgcHJvY2Vzc2VzIGhhdmUgZXhpdGVkIC0tIGlmIHRoZXkKKyAqIGhhdmUsIGZpZ3VyZSBvdXQgd2h5IGFuZCBzZWUgaWYgYSBqb2IgaGFzIGNvbXBsZXRlZCAqLworc3RhdGljIGludCBjaGVja2pvYnMoc3RydWN0IHBpcGUgKmZnX3BpcGUpCit7CisJaW50IGF0dHJpYnV0ZXM7CisJaW50IHN0YXR1czsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlzdHJ1Y3QgcGlwZSAqcGk7CisjZW5kaWYKKwlwaWRfdCBjaGlsZHBpZDsKKwlpbnQgcmNvZGUgPSAwOworCisJZGVidWdfcHJpbnRmX2pvYnMoImNoZWNram9icyAlcFxuIiwgZmdfcGlwZSk7CisKKwlhdHRyaWJ1dGVzID0gV1VOVFJBQ0VEOworCWlmIChmZ19waXBlID09IE5VTEwpCisJCWF0dHJpYnV0ZXMgfD0gV05PSEFORzsKKworCWVycm5vID0gMDsKKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJaWYgKEcuaGFuZGxlZF9TSUdDSExEID09IEcuY291bnRfU0lHQ0hMRCkgeworLy9iYl9lcnJvcl9tc2coIlslZF0gY2hlY2tqb2JzOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQgY2hpbGRyZW4/OiVkIGZnX3BpcGU6JXAiLAorLy9nZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCwgRy53ZV9oYXZlX2NoaWxkcmVuLCBmZ19waXBlKTsKKwkJLyogVGhlcmUgd2FzIG5laXRoZXIgZm9yayBub3IgU0lHQ0hMRCBzaW5jZSBsYXN0IHdhaXRwaWQgKi8KKwkJLyogQXZvaWQgZG9pbmcgd2FpdHBpZCBzeXNjYWxsIGlmIHBvc3NpYmxlICovCisJCWlmICghRy53ZV9oYXZlX2NoaWxkcmVuKSB7CisJCQllcnJubyA9IEVDSElMRDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZmdfcGlwZSA9PSBOVUxMKSB7IC8qIGlzIFdOT0hBTkcgc2V0PyAqLworCQkJLyogV2UgaGF2ZSBjaGlsZHJlbiwgYnV0IHRoZXkgZGlkIG5vdCBleGl0CisJCQkgKiBvciBzdG9wIHlldCAod2Ugc2F3IG5vIFNJR0NITEQpICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBlbHNlOiAhV05PSEFORywgd2FpdHBpZCB3aWxsIGJsb2NrLCBjYW4ndCBzaG9ydC1jaXJjdWl0ICovCisJfQorI2VuZGlmCisKKy8qIERvIHdlIGRvIHRoaXMgcmlnaHQ/CisgKiBiYXNoLTMuMDAjIHNsZWVwIDIwIHwgZmFsc2UKKyAqIDxjdHJsLVogcHJlc3NlZD4KKyAqIFszXSsgIFN0b3BwZWQgICAgICAgICAgc2xlZXAgMjAgfCBmYWxzZQorICogYmFzaC0zLjAwIyBlY2hvICQ/CisgKiAxICAgPD09PT09PT09PT0gYmcgcGlwZSBpcyBub3QgZnVsbHkgZG9uZSwgYnV0IGV4aXRjb2RlIGlzIGFscmVhZHkga25vd24hCisgKiBbaHVzaCAxLjE0LjA6IHllcyB3ZSBkbyBpdCByaWdodF0KKyAqLworIHdhaXRfbW9yZToKKwl3aGlsZSAoMSkgeworCQlpbnQgaTsKKwkJaW50IGRlYWQ7CisKKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJCWkgPSBHLmNvdW50X1NJR0NITEQ7CisjZW5kaWYKKwkJY2hpbGRwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBhdHRyaWJ1dGVzKTsKKwkJaWYgKGNoaWxkcGlkIDw9IDApIHsKKwkJCWlmIChjaGlsZHBpZCAmJiBlcnJubyAhPSBFQ0hJTEQpCisJCQkJYmJfcGVycm9yX21zZygid2FpdHBpZCIpOworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwkJCWVsc2UgeyAvKiBVbnRpbCBuZXh0IFNJR0NITEQsIHdhaXRwaWQncyBhcmUgdXNlbGVzcyAqLworCQkJCUcud2VfaGF2ZV9jaGlsZHJlbiA9IChjaGlsZHBpZCA9PSAwKTsKKwkJCQlHLmhhbmRsZWRfU0lHQ0hMRCA9IGk7CisvL2JiX2Vycm9yX21zZygiWyVkXSBjaGVja2pvYnM6IHdhaXRwaWQgcmV0dXJuZWQgPD0gMCwgRy5jb3VudF9TSUdDSExEOiVkIEcuaGFuZGxlZF9TSUdDSExEOiVkIiwgZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQlkZWFkID0gV0lGRVhJVEVEKHN0YXR1cykgfHwgV0lGU0lHTkFMRUQoc3RhdHVzKTsKKworI2lmIERFQlVHX0pPQlMKKwkJaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJCWRlYnVnX3ByaW50Zl9qb2JzKCJwaWQgJWQgc3RvcHBlZCBieSBzaWcgJWQgKGV4aXRjb2RlICVkKVxuIiwKKwkJCQkJY2hpbGRwaWQsIFdTVE9QU0lHKHN0YXR1cyksIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCWRlYnVnX3ByaW50Zl9qb2JzKCJwaWQgJWQga2lsbGVkIGJ5IHNpZyAlZCAoZXhpdGNvZGUgJWQpXG4iLAorCQkJCQljaGlsZHBpZCwgV1RFUk1TSUcoc3RhdHVzKSwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJCWlmIChXSUZFWElURUQoc3RhdHVzKSkKKwkJCWRlYnVnX3ByaW50Zl9qb2JzKCJwaWQgJWQgZXhpdGVkLCBleGl0Y29kZSAlZFxuIiwKKwkJCQkJY2hpbGRwaWQsIFdFWElUU1RBVFVTKHN0YXR1cykpOworI2VuZGlmCisJCS8qIFdlcmUgd2UgYXNrZWQgdG8gd2FpdCBmb3IgZmcgcGlwZT8gKi8KKwkJaWYgKGZnX3BpcGUpIHsKKwkJCWkgPSBmZ19waXBlLT5udW1fY21kczsKKwkJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJCWRlYnVnX3ByaW50Zl9qb2JzKCJjaGVjayBwaWQgJWRcbiIsIGZnX3BpcGUtPmNtZHNbaV0ucGlkKTsKKwkJCQlpZiAoZmdfcGlwZS0+Y21kc1tpXS5waWQgIT0gY2hpbGRwaWQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChkZWFkKSB7CisJCQkJCWludCBleDsKKwkJCQkJZmdfcGlwZS0+Y21kc1tpXS5waWQgPSAwOworCQkJCQlmZ19waXBlLT5hbGl2ZV9jbWRzLS07CisJCQkJCWV4ID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwkJCQkJLyogYmFzaCBwcmludHMga2lsbGVyIHNpZ25hbCdzIG5hbWUgZm9yICpsYXN0KgorCQkJCQkgKiBwcm9jZXNzIGluIHBpcGUgKHByaW50cyBqdXN0IG5ld2xpbmUgZm9yIFNJR0lOVC9TSUdQSVBFKS4KKwkJCQkJICogTWltaWMgdGhpcy4gRXhhbXBsZTogInNsZWVwIDUiICsgKF5cIG9yIGtpbGwgLVFVSVQpCisJCQkJCSAqLworCQkJCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgeworCQkJCQkJaW50IHNpZyA9IFdURVJNU0lHKHN0YXR1cyk7CisJCQkJCQlpZiAoaSA9PSBmZ19waXBlLT5udW1fY21kcy0xKQorCQkJCQkJCS8qIFRPRE86IHVzZSBzdHJzaWduYWwoKSBpbnN0ZWFkIGZvciBiYXNoIGNvbXBhdD8gYnV0IHRoYXQncyBibG9hdC4uLiAqLworCQkJCQkJCXByaW50ZigiJXNcbiIsIHNpZyA9PSBTSUdJTlQgfHwgc2lnID09IFNJR1BJUEUgPyAiIiA6IGdldF9zaWduYW1lKHNpZykpOworCQkJCQkJLyogVE9ETzogaWYgKFdDT1JFRFVNUChzdGF0dXMpKSArICIgKGNvcmUgZHVtcGVkKSI7ICovCisJCQkJCQkvKiBUT0RPOiBNSVBTIGhhcyAxMjggc2lncyAoMS4uMTI4KSwgd2hhdCBpZiBzaWc9PTEyOCBoZXJlPworCQkJCQkJICogTWF5YmUgd2UgbmVlZCB0byB1c2Ugc2lnIHwgMTI4PyAqLworCQkJCQkJZXggPSBzaWcgKyAxMjg7CisJCQkJCX0KKwkJCQkJZmdfcGlwZS0+Y21kc1tpXS5jbWRfZXhpdGNvZGUgPSBleDsKKwkJCQl9IGVsc2UgeworCQkJCQlmZ19waXBlLT5jbWRzW2ldLmlzX3N0b3BwZWQgPSAxOworCQkJCQlmZ19waXBlLT5zdG9wcGVkX2NtZHMrKzsKKwkJCQl9CisJCQkJZGVidWdfcHJpbnRmX2pvYnMoImZnX3BpcGU6IGFsaXZlX2NtZHMgJWQgc3RvcHBlZF9jbWRzICVkXG4iLAorCQkJCQkJZmdfcGlwZS0+YWxpdmVfY21kcywgZmdfcGlwZS0+c3RvcHBlZF9jbWRzKTsKKwkJCQlpZiAoZmdfcGlwZS0+YWxpdmVfY21kcyA9PSBmZ19waXBlLT5zdG9wcGVkX2NtZHMpIHsKKwkJCQkJLyogQWxsIHByb2Nlc3NlcyBpbiBmZyBwaXBlIGhhdmUgZXhpdGVkIG9yIHN0b3BwZWQgKi8KKwkJCQkJaSA9IGZnX3BpcGUtPm51bV9jbWRzOworCQkJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQkJCXJjb2RlID0gZmdfcGlwZS0+Y21kc1tpXS5jbWRfZXhpdGNvZGU7CisJCQkJCQkvKiB1c3VhbGx5IGxhc3QgcHJvY2VzcyBnaXZlcyBvdmVyYWxsIGV4aXRzdGF0dXMsCisJCQkJCQkgKiBidXQgd2l0aCAic2V0IC1vIHBpcGVmYWlsIiwgbGFzdCAqZmFpbGVkKiBwcm9jZXNzIGRvZXMgKi8KKwkJCQkJCWlmIChHLm9fb3B0W09QVF9PX1BJUEVGQUlMXSA9PSAwIHx8IHJjb2RlICE9IDApCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJSUZfSEFTX0tFWVdPUkRTKGlmIChmZ19waXBlLT5waV9pbnZlcnRlZCkgcmNvZGUgPSAhcmNvZGU7KQorLyogTm90ZTogKm5vbi1pbnRlcmFjdGl2ZSogYmFzaCBkb2VzIG5vdCBjb250aW51ZSBpZiBhbGwgcHJvY2Vzc2VzIGluIGZnIHBpcGUKKyAqIGFyZSBzdG9wcGVkLiBUZXN0Y2FzZTogImNhdCB8IGNhdCIgaW4gYSBzY3JpcHQgKG5vdCBvbiBjb21tYW5kIGxpbmUhKQorICogYW5kICJraWxsYWxsIC1TVE9QIGNhdCIgKi8KKwkJCQkJaWYgKEdfaW50ZXJhY3RpdmVfZmQpIHsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJCQkJCWlmIChmZ19waXBlLT5hbGl2ZV9jbWRzICE9IDApCisJCQkJCQkJaW5zZXJ0X2JnX2pvYihmZ19waXBlKTsKKyNlbmRpZgorCQkJCQkJcmV0dXJuIHJjb2RlOworCQkJCQl9CisJCQkJCWlmIChmZ19waXBlLT5hbGl2ZV9jbWRzID09IDApCisJCQkJCQlyZXR1cm4gcmNvZGU7CisJCQkJfQorCQkJCS8qIFRoZXJlIGFyZSBzdGlsbCBydW5uaW5nIHByb2Nlc3NlcyBpbiB0aGUgZmcgcGlwZSAqLworCQkJCWdvdG8gd2FpdF9tb3JlOyAvKiBkbyB3YWl0cGlkIGFnYWluICovCisJCQl9CisJCQkvKiBpdCB3YXNudCBmZ19waXBlLCBsb29rIGZvciBwcm9jZXNzIGluIGJnIHBpcGVzICovCisJCX0KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQkvKiBXZSBhc2tlZCB0byB3YWl0IGZvciBiZyBvciBvcnBoYW5lZCBjaGlsZHJlbiAqLworCQkvKiBObyBuZWVkIHRvIHJlbWVtYmVyIGV4aXRjb2RlIGluIHRoaXMgY2FzZSAqLworCQlmb3IgKHBpID0gRy5qb2JfbGlzdDsgcGk7IHBpID0gcGktPm5leHQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBwaS0+bnVtX2NtZHM7IGkrKykgeworCQkJCWlmIChwaS0+Y21kc1tpXS5waWQgPT0gY2hpbGRwaWQpCisJCQkJCWdvdG8gZm91bmRfcGlfYW5kX3Byb2dudW07CisJCQl9CisJCX0KKwkJLyogSGFwcGVucyB3aGVuIHNoZWxsIGlzIHVzZWQgYXMgaW5pdCBwcm9jZXNzIChpbml0PS9iaW4vc2gpICovCisJCWRlYnVnX3ByaW50ZigiY2hlY2tqb2JzOiBwaWQgJWQgd2FzIG5vdCBpbiBvdXIgbGlzdCFcbiIsIGNoaWxkcGlkKTsKKwkJY29udGludWU7IC8qIGRvIHdhaXRwaWQgYWdhaW4gKi8KKworIGZvdW5kX3BpX2FuZF9wcm9nbnVtOgorCQlpZiAoZGVhZCkgeworCQkJLyogY2hpbGQgZXhpdGVkICovCisJCQlwaS0+Y21kc1tpXS5waWQgPSAwOworCQkJcGktPmFsaXZlX2NtZHMtLTsKKwkJCWlmICghcGktPmFsaXZlX2NtZHMpIHsKKwkJCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCkKKwkJCQkJcHJpbnRmKEpPQl9TVEFUVVNfRk9STUFULCBwaS0+am9iaWQsCisJCQkJCQkJIkRvbmUiLCBwaS0+Y21kdGV4dCk7CisJCQkJZGVsZXRlX2ZpbmlzaGVkX2JnX2pvYihwaSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBjaGlsZCBzdG9wcGVkICovCisJCQlwaS0+Y21kc1tpXS5pc19zdG9wcGVkID0gMTsKKwkJCXBpLT5zdG9wcGVkX2NtZHMrKzsKKwkJfQorI2VuZGlmCisJfSAvKiB3aGlsZSAod2FpdHBpZCBzdWNjZWVkcykuLi4gKi8KKworCXJldHVybiByY29kZTsKK30KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorc3RhdGljIGludCBjaGVja2pvYnNfYW5kX2ZnX3NoZWxsKHN0cnVjdCBwaXBlICpmZ19waXBlKQoreworCXBpZF90IHA7CisJaW50IHJjb2RlID0gY2hlY2tqb2JzKGZnX3BpcGUpOworCWlmIChHX3NhdmVkX3R0eV9wZ3JwKSB7CisJCS8qIEpvYiBmaW5pc2hlZCwgbW92ZSB0aGUgc2hlbGwgdG8gdGhlIGZvcmVncm91bmQgKi8KKwkJcCA9IGdldHBncnAoKTsgLyogb3VyIHByb2Nlc3MgZ3JvdXAgaWQgKi8KKwkJZGVidWdfcHJpbnRmX2pvYnMoImZnJ2luZyBvdXJzZWxmOiBnZXRwZ3JwKCk9JWRcbiIsIChpbnQpcCk7CisJCXRjc2V0cGdycChHX2ludGVyYWN0aXZlX2ZkLCBwKTsKKwl9CisJcmV0dXJuIHJjb2RlOworfQorI2VuZGlmCisKKy8qIFN0YXJ0IGFsbCB0aGUgam9icywgYnV0IGRvbid0IHdhaXQgZm9yIGFueXRoaW5nIHRvIGZpbmlzaC4KKyAqIFNlZSBjaGVja2pvYnMoKS4KKyAqCisgKiBSZXR1cm4gY29kZSBpcyBub3JtYWxseSAtMSwgd2hlbiB0aGUgY2FsbGVyIGhhcyB0byB3YWl0IGZvciBjaGlsZHJlbgorICogdG8gZmluaXNoIHRvIGRldGVybWluZSB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHBpcGUuICBJZiB0aGUgcGlwZQorICogaXMgYSBzaW1wbGUgYnVpbHRpbiBjb21tYW5kLCBob3dldmVyLCB0aGUgYWN0aW9uIGlzIGRvbmUgYnkgdGhlCisgKiB0aW1lIHJ1bl9waXBlIHJldHVybnMsIGFuZCB0aGUgZXhpdCBjb2RlIGlzIHByb3ZpZGVkIGFzIHRoZQorICogcmV0dXJuIHZhbHVlLgorICoKKyAqIFJldHVybnMgLTEgb25seSBpZiBzdGFydGVkIHNvbWUgY2hpbGRyZW4uIElPVzogd2UgaGF2ZSB0bworICogbWFzayBvdXQgcmV0dmFscyBvZiBidWlsdGlucyBldGMgd2l0aCAweGZmIQorICoKKyAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB3ZSBkbyBub3QgbmVlZCB0byBbdl1mb3JrIGlzIHdoZW4gdGhlIHBpcGUKKyAqIGlzIHNpbmdsZSwgbm9uLWJhY2tncm91bmRlZCwgbm9uLXN1YnNoZWxsIGNvbW1hbmQuIEV4YW1wbGVzOgorICogY21kIDsgLi4uICAgeyBsaXN0IH0gOyAuLi4KKyAqIGNtZCAmJiAuLi4gIHsgbGlzdCB9ICYmIC4uLgorICogY21kIHx8IC4uLiAgeyBsaXN0IH0gfHwgLi4uCisgKiBJZiBpdCBpcywgdGhlbiB3ZSBjYW4gcnVuIGNtZCBhcyBhIGJ1aWx0aW4sIE5PRk9SSywKKyAqIG9yIChpZiBTSF9TVEFOREFMT05FKSBhbiBhcHBsZXQsIGFuZCB3ZSBjYW4gcnVuIHRoZSB7IGxpc3QgfQorICogd2l0aCBydW5fbGlzdC4gSWYgaXQgaXNuJ3Qgb25lIG9mIHRoZXNlLCB3ZSBmb3JrIGFuZCBleGVjIGNtZC4KKyAqCisgKiBDYXNlcyB3aGVuIHdlIG11c3QgZm9yazoKKyAqIG5vbi1zaW5nbGU6ICAgY21kIHwgY21kCisgKiBiYWNrZ3JvdW5kZWQ6IGNtZCAmICAgICB7IGxpc3QgfSAmCisgKiBzdWJzaGVsbDogICAgICggbGlzdCApIFsmXQorICovCisjaWYgIUVOQUJMRV9IVVNIX01PREVfWAorI2RlZmluZSByZWRpcmVjdF9hbmRfdmFyZXhwX2hlbHBlcihuZXdfZW52X3AsIG9sZF92YXJzX3AsIGNvbW1hbmQsIHNxdWlycmVsLCBhcmd2X2V4cGFuZGVkKSBcCisJcmVkaXJlY3RfYW5kX3ZhcmV4cF9oZWxwZXIobmV3X2Vudl9wLCBvbGRfdmFyc19wLCBjb21tYW5kLCBzcXVpcnJlbCkKKyNlbmRpZgorc3RhdGljIGludCByZWRpcmVjdF9hbmRfdmFyZXhwX2hlbHBlcihjaGFyICoqKm5ld19lbnZfcCwKKwkJc3RydWN0IHZhcmlhYmxlICoqb2xkX3ZhcnNfcCwKKwkJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQsCisJCWludCBzcXVpcnJlbFszXSwKKwkJY2hhciAqKmFyZ3ZfZXhwYW5kZWQpCit7CisJLyogc2V0dXBfcmVkaXJlY3RzIGFjdHMgb24gZmlsZSBkZXNjcmlwdG9ycywgbm90IEZJTEVzLgorCSAqIFRoaXMgaXMgcGVyZmVjdCBmb3Igd29yayB0aGF0IGNvbWVzIGFmdGVyIGV4ZWMoKS4KKwkgKiBJcyBpdCByZWFsbHkgc2FmZSBmb3IgaW5saW5lIHVzZT8gIEV4cGVyaW1lbnRhbGx5LAorCSAqIHRoaW5ncyBzZWVtIHRvIHdvcmsuICovCisJaW50IHJjb2RlID0gc2V0dXBfcmVkaXJlY3RzKGNvbW1hbmQsIHNxdWlycmVsKTsKKwlpZiAocmNvZGUgPT0gMCkgeworCQljaGFyICoqbmV3X2VudiA9IGV4cGFuZF9hc3NpZ25tZW50cyhjb21tYW5kLT5hcmd2LCBjb21tYW5kLT5hc3NpZ25tZW50X2NudCk7CisJCSpuZXdfZW52X3AgPSBuZXdfZW52OworCQlkdW1wX2NtZF9pbl94X21vZGUobmV3X2Vudik7CisJCWR1bXBfY21kX2luX3hfbW9kZShhcmd2X2V4cGFuZGVkKTsKKwkJaWYgKG9sZF92YXJzX3ApCisJCQkqb2xkX3ZhcnNfcCA9IHNldF92YXJzX2FuZF9zYXZlX29sZChuZXdfZW52KTsKKwl9CisJcmV0dXJuIHJjb2RlOworfQorc3RhdGljIE5PSU5MSU5FIGludCBydW5fcGlwZShzdHJ1Y3QgcGlwZSAqcGkpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG51bGxfcHRyID0gTlVMTDsKKworCWludCBjbWRfbm87CisJaW50IG5leHRfaW5mZDsKKwlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZDsKKwljaGFyICoqYXJndl9leHBhbmRlZDsKKwljaGFyICoqYXJndjsKKwkvKiBpdCBpcyBub3QgYWx3YXlzIG5lZWRlZCwgYnV0IHdlIGFpbSB0byBzbWFsbGVyIGNvZGUgKi8KKwlpbnQgc3F1aXJyZWxbXSA9IHsgLTEsIC0xLCAtMSB9OworCWludCByY29kZTsKKworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZSBzdGFydDogbWVtYmVyczolZFxuIiwgcGktPm51bV9jbWRzKTsKKwlkZWJ1Z19lbnRlcigpOworCisJLyogVGVzdGNhc2U6IHNldCAtLSBxIHcgZTsgKElGUz0nJyBlY2hvICIkKiI7IElGUz0nJzsgZWNobyAiJCoiKTsgZWNobyAiJCoiCisJICogUmVzdWx0IHNob3VsZCBiZSAzIGxpbmVzOiBxIHcgZSwgcXdlLCBxIHcgZQorCSAqLworCUcuaWZzID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSUZTIik7CisJaWYgKCFHLmlmcykKKwkJRy5pZnMgPSBkZWZpZnM7CisKKwlJRl9IVVNIX0pPQihwaS0+cGdycCA9IC0xOykKKwlwaS0+c3RvcHBlZF9jbWRzID0gMDsKKwljb21tYW5kID0gJnBpLT5jbWRzWzBdOworCWFyZ3ZfZXhwYW5kZWQgPSBOVUxMOworCisJaWYgKHBpLT5udW1fY21kcyAhPSAxCisJIHx8IHBpLT5mb2xsb3d1cCA9PSBQSVBFX0JHCisJIHx8IGNvbW1hbmQtPmNtZF90eXBlID09IENNRF9TVUJTSEVMTAorCSkgeworCQlnb3RvIG11c3RfZm9yazsKKwl9CisKKwlwaS0+YWxpdmVfY21kcyA9IDE7CisKKwlkZWJ1Z19wcmludGZfZXhlYygiOiBncm91cDolcCBhcmd2OiclcydcbiIsCisJCWNvbW1hbmQtPmdyb3VwLCBjb21tYW5kLT5hcmd2ID8gY29tbWFuZC0+YXJndlswXSA6ICJOT05FIik7CisKKwlpZiAoY29tbWFuZC0+Z3JvdXApIHsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJaWYgKGNvbW1hbmQtPmNtZF90eXBlID09IENNRF9GVU5DREVGKSB7CisJCQkvKiAiZXhlY3V0aW5nIiBmdW5jICgpIHsgbGlzdCB9ICovCisJCQlzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwOworCisJCQlmdW5jcCA9IG5ld19mdW5jdGlvbihjb21tYW5kLT5hcmd2WzBdKTsKKwkJCS8qIGZ1bmNwLT5uYW1lIGlzIGFscmVhZHkgc2V0IHRvIGFyZ3ZbMF0gKi8KKwkJCWZ1bmNwLT5ib2R5ID0gY29tbWFuZC0+Z3JvdXA7CisjIGlmICFCQl9NTVUKKwkJCWZ1bmNwLT5ib2R5X2FzX3N0cmluZyA9IGNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZzsKKwkJCWNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZyA9IE5VTEw7CisjIGVuZGlmCisJCQljb21tYW5kLT5ncm91cCA9IE5VTEw7CisJCQljb21tYW5kLT5hcmd2WzBdID0gTlVMTDsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJjbWQgJXAgaGFzIGNoaWxkIGZ1bmMgYXQgJXBcbiIsIGNvbW1hbmQsIGZ1bmNwKTsKKwkJCWZ1bmNwLT5wYXJlbnRfY21kID0gY29tbWFuZDsKKwkJCWNvbW1hbmQtPmNoaWxkX2Z1bmMgPSBmdW5jcDsKKworCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlOiByZXR1cm4gRVhJVF9TVUNDRVNTXG4iKTsKKwkJCWRlYnVnX2xlYXZlKCk7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisjZW5kaWYKKwkJLyogeyBsaXN0IH0gKi8KKwkJZGVidWdfcHJpbnRmKCJub24tc3Vic2hlbGwgZ3JvdXBcbiIpOworCQlyY29kZSA9IDE7IC8qIGV4aXRjb2RlIGlmIHJlZGlyIGZhaWxlZCAqLworCQlpZiAoc2V0dXBfcmVkaXJlY3RzKGNvbW1hbmQsIHNxdWlycmVsKSA9PSAwKSB7CisJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBydW5fbGlzdFxuIik7CisJCQlyY29kZSA9IHJ1bl9saXN0KGNvbW1hbmQtPmdyb3VwKSAmIDB4ZmY7CisJCX0KKwkJcmVzdG9yZV9yZWRpcmVjdHMoc3F1aXJyZWwpOworCQlJRl9IQVNfS0VZV09SRFMoaWYgKHBpLT5waV9pbnZlcnRlZCkgcmNvZGUgPSAhcmNvZGU7KQorCQlkZWJ1Z19sZWF2ZSgpOworCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGU6IHJldHVybiAlZFxuIiwgcmNvZGUpOworCQlyZXR1cm4gcmNvZGU7CisJfQorCisJYXJndiA9IGNvbW1hbmQtPmFyZ3YgPyBjb21tYW5kLT5hcmd2IDogKGNoYXIgKiopICZudWxsX3B0cjsKKwl7CisJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4OworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQljb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwOworI2Vsc2UKKwkJZW51bSB7IGZ1bmNwID0gMCB9OworI2VuZGlmCisJCWNoYXIgKipuZXdfZW52ID0gTlVMTDsKKwkJc3RydWN0IHZhcmlhYmxlICpvbGRfdmFycyA9IE5VTEw7CisKKwkJaWYgKGFyZ3ZbY29tbWFuZC0+YXNzaWdubWVudF9jbnRdID09IE5VTEwpIHsKKwkJCS8qIEFzc2lnbm1lbnRzLCBidXQgbm8gY29tbWFuZCAqLworCQkJLyogRW5zdXJlIHJlZGlyZWN0cyB0YWtlIGVmZmVjdCAodGhhdCBpcywgY3JlYXRlIGZpbGVzKS4KKwkJCSAqIFRyeSAiYT10ID5maWxlIiAqLworI2lmIDAgLyogQSBmZXcgY2FzZXMgaW4gdGVzdHN1aXRlIGZhaWwgd2l0aCB0aGlzIGNvZGUuIEZJWE1FICovCisJCQlyY29kZSA9IHJlZGlyZWN0X2FuZF92YXJleHBfaGVscGVyKCZuZXdfZW52LCAvKm9sZF92YXJzOiovIE5VTEwsIGNvbW1hbmQsIHNxdWlycmVsLCAvKmFyZ3ZfZXhwYW5kZWQ6Ki8gTlVMTCk7CisJCQkvKiBTZXQgc2hlbGwgdmFyaWFibGVzICovCisJCQlpZiAobmV3X2VudikgeworCQkJCWFyZ3YgPSBuZXdfZW52OworCQkJCXdoaWxlICgqYXJndikgeworCQkJCQlzZXRfbG9jYWxfdmFyKCphcmd2LCAvKmV4cDoqLyAwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworCQkJCQkvKiBEbyB3ZSBuZWVkIHRvIGZsYWcgc2V0X2xvY2FsX3ZhcigpIGVycm9ycz8KKwkJCQkJICogImFzc2lnbm1lbnQgdG8gcmVhZG9ubHkgdmFyIiBhbmQgInB1dGVudiBlcnJvciIKKwkJCQkJICovCisJCQkJCWFyZ3YrKzsKKwkJCQl9CisJCQl9CisJCQkvKiBSZWRpcmVjdCBlcnJvciBzZXRzICQ/IHRvIDEuIE90aGVyd2lzZSwKKwkJCSAqIGlmIGV2YWx1YXRpbmcgYXNzaWdubWVudCB2YWx1ZSBzZXQgJD8sIHJldGFpbiBpdC4KKwkJCSAqIFRyeSAiZmFsc2U7IHE9YGV4aXQgMmA7IGVjaG8gJD8iIC0gc2hvdWxkIHByaW50IDI6ICovCisJCQlpZiAocmNvZGUgPT0gMCkKKwkJCQlyY29kZSA9IEcubGFzdF9leGl0Y29kZTsKKwkJCS8qIEV4aXQsIF9za2lwcGluZ18gdmFyaWFibGUgcmVzdG9yaW5nIGNvZGU6ICovCisJCQlnb3RvIGNsZWFuX3VwX2FuZF9yZXQwOworCisjZWxzZSAvKiBPbGRlciwgYmlnZ2VyLCBidXQgbW9yZSBjb3JyZWN0IGNvZGUgKi8KKworCQkJcmNvZGUgPSBzZXR1cF9yZWRpcmVjdHMoY29tbWFuZCwgc3F1aXJyZWwpOworCQkJcmVzdG9yZV9yZWRpcmVjdHMoc3F1aXJyZWwpOworCQkJLyogU2V0IHNoZWxsIHZhcmlhYmxlcyAqLworCQkJaWYgKEdfeF9tb2RlKQorCQkJCWJiX3B1dGNoYXJfc3RkZXJyKCcrJyk7CisJCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCQljaGFyICpwID0gZXhwYW5kX3N0cmluZ190b19zdHJpbmcoKmFyZ3YsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJaWYgKEdfeF9tb2RlKQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAlcyIsIHApOworCQkJCWRlYnVnX3ByaW50Zl9leGVjKCJzZXQgc2hlbGwgdmFyOiclcyctPiclcydcbiIsCisJCQkJCQkqYXJndiwgcCk7CisJCQkJc2V0X2xvY2FsX3ZhcihwLCAvKmV4cDoqLyAwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworCQkJCS8qIERvIHdlIG5lZWQgdG8gZmxhZyBzZXRfbG9jYWxfdmFyKCkgZXJyb3JzPworCQkJCSAqICJhc3NpZ25tZW50IHRvIHJlYWRvbmx5IHZhciIgYW5kICJwdXRlbnYgZXJyb3IiCisJCQkJICovCisJCQkJYXJndisrOworCQkJfQorCQkJaWYgKEdfeF9tb2RlKQorCQkJCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCQkJLyogUmVkaXJlY3QgZXJyb3Igc2V0cyAkPyB0byAxLiBPdGhlcndpc2UsCisJCQkgKiBpZiBldmFsdWF0aW5nIGFzc2lnbm1lbnQgdmFsdWUgc2V0ICQ/LCByZXRhaW4gaXQuCisJCQkgKiBUcnkgImZhbHNlOyBxPWBleGl0IDJgOyBlY2hvICQ/IiAtIHNob3VsZCBwcmludCAyOiAqLworCQkJaWYgKHJjb2RlID09IDApCisJCQkJcmNvZGUgPSBHLmxhc3RfZXhpdGNvZGU7CisJCQlJRl9IQVNfS0VZV09SRFMoaWYgKHBpLT5waV9pbnZlcnRlZCkgcmNvZGUgPSAhcmNvZGU7KQorCQkJZGVidWdfbGVhdmUoKTsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZTogcmV0dXJuICVkXG4iLCByY29kZSk7CisJCQlyZXR1cm4gcmNvZGU7CisjZW5kaWYKKwkJfQorCisJCS8qIEV4cGFuZCB0aGUgcmVzdCBpbnRvIChwb3NzaWJseSkgbWFueSBzdHJpbmdzIGVhY2ggKi8KKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQlpZiAoY29tbWFuZC0+Y21kX3R5cGUgPT0gQ01EX1NJTkdMRVdPUkRfTk9HTE9CKSB7CisJCQlhcmd2X2V4cGFuZGVkID0gZXhwYW5kX3N0cnZlY190b19zdHJ2ZWNfc2luZ2xld29yZF9ub2dsb2IoYXJndiArIGNvbW1hbmQtPmFzc2lnbm1lbnRfY250KTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJYXJndl9leHBhbmRlZCA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjKGFyZ3YgKyBjb21tYW5kLT5hc3NpZ25tZW50X2NudCk7CisJCX0KKworCQkvKiBpZiBzb21lb25lIGdpdmVzIHVzIGFuIGVtcHR5IHN0cmluZzogYGNtZCB3aXRoIGVtcHR5IG91dHB1dGAgKi8KKwkJaWYgKCFhcmd2X2V4cGFuZGVkWzBdKSB7CisJCQlmcmVlKGFyZ3ZfZXhwYW5kZWQpOworCQkJZGVidWdfbGVhdmUoKTsKKwkJCXJldHVybiBHLmxhc3RfZXhpdGNvZGU7CisJCX0KKworCQl4ID0gZmluZF9idWlsdGluKGFyZ3ZfZXhwYW5kZWRbMF0pOworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQlmdW5jcCA9IE5VTEw7CisJCWlmICgheCkKKwkJCWZ1bmNwID0gZmluZF9mdW5jdGlvbihhcmd2X2V4cGFuZGVkWzBdKTsKKyNlbmRpZgorCQlpZiAoeCB8fCBmdW5jcCkgeworCQkJaWYgKCFmdW5jcCkgeworCQkJCWlmICh4LT5iX2Z1bmN0aW9uID09IGJ1aWx0aW5fZXhlYyAmJiBhcmd2X2V4cGFuZGVkWzFdID09IE5VTEwpIHsKKwkJCQkJZGVidWdfcHJpbnRmKCJleGVjIHdpdGggcmVkaXJlY3RzIG9ubHlcbiIpOworCQkJCQlyY29kZSA9IHNldHVwX3JlZGlyZWN0cyhjb21tYW5kLCBOVUxMKTsKKwkJCQkJZ290byBjbGVhbl91cF9hbmRfcmV0MTsKKwkJCQl9CisJCQl9CisJCQlyY29kZSA9IHJlZGlyZWN0X2FuZF92YXJleHBfaGVscGVyKCZuZXdfZW52LCAmb2xkX3ZhcnMsIGNvbW1hbmQsIHNxdWlycmVsLCBhcmd2X2V4cGFuZGVkKTsKKwkJCWlmIChyY29kZSA9PSAwKSB7CisJCQkJaWYgKCFmdW5jcCkgeworCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBidWlsdGluICclcycgJyVzJy4uLlxuIiwKKwkJCQkJCXgtPmJfY21kLCBhcmd2X2V4cGFuZGVkWzFdKTsKKwkJCQkJZmZsdXNoX2FsbCgpOworCQkJCQlyY29kZSA9IHgtPmJfZnVuY3Rpb24oYXJndl9leHBhbmRlZCkgJiAweGZmOworCQkJCQlmZmx1c2hfYWxsKCk7CisJCQkJfQorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQkJCWVsc2UgeworIyBpZiBFTkFCTEVfSFVTSF9MT0NBTAorCQkJCQlzdHJ1Y3QgdmFyaWFibGUgKipzdjsKKwkJCQkJc3YgPSBHLnNoYWRvd2VkX3ZhcnNfcHA7CisJCQkJCUcuc2hhZG93ZWRfdmFyc19wcCA9ICZvbGRfdmFyczsKKyMgZW5kaWYKKwkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogZnVuY3Rpb24gJyVzJyAnJXMnLi4uXG4iLAorCQkJCQkJZnVuY3AtPm5hbWUsIGFyZ3ZfZXhwYW5kZWRbMV0pOworCQkJCQlyY29kZSA9IHJ1bl9mdW5jdGlvbihmdW5jcCwgYXJndl9leHBhbmRlZCkgJiAweGZmOworIyBpZiBFTkFCTEVfSFVTSF9MT0NBTAorCQkJCQlHLnNoYWRvd2VkX3ZhcnNfcHAgPSBzdjsKKyMgZW5kaWYKKwkJCQl9CisjZW5kaWYKKwkJCX0KKyBjbGVhbl91cF9hbmRfcmV0OgorCQkJdW5zZXRfdmFycyhuZXdfZW52KTsKKwkJCWFkZF92YXJzKG9sZF92YXJzKTsKKy8qIGNsZWFuX3VwX2FuZF9yZXQwOiAqLworCQkJcmVzdG9yZV9yZWRpcmVjdHMoc3F1aXJyZWwpOworIGNsZWFuX3VwX2FuZF9yZXQxOgorCQkJZnJlZShhcmd2X2V4cGFuZGVkKTsKKwkJCUlGX0hBU19LRVlXT1JEUyhpZiAocGktPnBpX2ludmVydGVkKSByY29kZSA9ICFyY29kZTspCisJCQlkZWJ1Z19sZWF2ZSgpOworCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlIHJldHVybiAlZFxuIiwgcmNvZGUpOworCQkJcmV0dXJuIHJjb2RlOworCQl9CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NIX05PRk9SSykgeworCQkJaW50IG4gPSBmaW5kX2FwcGxldF9ieV9uYW1lKGFyZ3ZfZXhwYW5kZWRbMF0pOworCQkJaWYgKG4gPj0gMCAmJiBBUFBMRVRfSVNfTk9GT1JLKG4pKSB7CisJCQkJcmNvZGUgPSByZWRpcmVjdF9hbmRfdmFyZXhwX2hlbHBlcigmbmV3X2VudiwgJm9sZF92YXJzLCBjb21tYW5kLCBzcXVpcnJlbCwgYXJndl9leHBhbmRlZCk7CisJCQkJaWYgKHJjb2RlID09IDApIHsKKwkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogcnVuX25vZm9ya19hcHBsZXQgJyVzJyAnJXMnLi4uXG4iLAorCQkJCQkJYXJndl9leHBhbmRlZFswXSwgYXJndl9leHBhbmRlZFsxXSk7CisJCQkJCXJjb2RlID0gcnVuX25vZm9ya19hcHBsZXQobiwgYXJndl9leHBhbmRlZCk7CisJCQkJfQorCQkJCWdvdG8gY2xlYW5fdXBfYW5kX3JldDsKKwkJCX0KKwkJfQorCQkvKiBJdCBpcyBuZWl0aGVyIGJ1aWx0aW4gbm9yIGFwcGxldC4gV2UgbXVzdCBmb3JrLiAqLworCX0KKworIG11c3RfZm9yazoKKwkvKiBOQjogYXJndl9leHBhbmRlZCBtYXkgYWxyZWFkeSBiZSBjcmVhdGVkLCBhbmQgdGhhdAorCSAqIG1pZ2h0IGluY2x1ZGUgYGNtZGAgcnVucyEgRG8gbm90IHJlcnVuIGl0ISBXZSAqbXVzdCoKKwkgKiB1c2UgYXJndl9leHBhbmRlZCBpZiBpdCdzIG5vbi1OVUxMICovCisKKwkvKiBHb2luZyB0byBmb3JrIGEgY2hpbGQgcGVyIGVhY2ggcGlwZSBtZW1iZXIgKi8KKwlwaS0+YWxpdmVfY21kcyA9IDA7CisJbmV4dF9pbmZkID0gMDsKKworCWNtZF9ubyA9IDA7CisJd2hpbGUgKGNtZF9ubyA8IHBpLT5udW1fY21kcykgeworCQlzdHJ1Y3QgZmRfcGFpciBwaXBlZmRzOworI2lmICFCQl9NTVUKKwkJdm9sYXRpbGUgbm9tbXVfc2F2ZV90IG5vbW11X3NhdmU7CisJCW5vbW11X3NhdmUubmV3X2VudiA9IE5VTEw7CisJCW5vbW11X3NhdmUub2xkX3ZhcnMgPSBOVUxMOworCQlub21tdV9zYXZlLmFyZ3YgPSBOVUxMOworCQlub21tdV9zYXZlLmFyZ3ZfZnJvbV9yZV9leGVjaW5nID0gTlVMTDsKKyNlbmRpZgorCQljb21tYW5kID0gJnBpLT5jbWRzW2NtZF9ub107CisJCWNtZF9ubysrOworCQlpZiAoY29tbWFuZC0+YXJndikgeworCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogcGlwZSBtZW1iZXIgJyVzJyAnJXMnLi4uXG4iLAorCQkJCQljb21tYW5kLT5hcmd2WzBdLCBjb21tYW5kLT5hcmd2WzFdKTsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHBpcGUgbWVtYmVyIHdpdGggbm8gYXJndlxuIik7CisJCX0KKworCQkvKiBwaXBlcyBhcmUgaW5zZXJ0ZWQgYmV0d2VlbiBwYWlycyBvZiBjb21tYW5kcyAqLworCQlwaXBlZmRzLnJkID0gMDsKKwkJcGlwZWZkcy53ciA9IDE7CisJCWlmIChjbWRfbm8gPCBwaS0+bnVtX2NtZHMpCisJCQl4cGlwZWRfcGFpcihwaXBlZmRzKTsKKworCQljb21tYW5kLT5waWQgPSBCQl9NTVUgPyBmb3JrKCkgOiB2Zm9yaygpOworCQlpZiAoIWNvbW1hbmQtPnBpZCkgeyAvKiBjaGlsZCAqLworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQkJZGlzYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsKKwkJCUNMRUFSX1JBTkRPTV9UKCZHLnJhbmRvbV9nZW4pOyAvKiBvciBlbHNlICRSQU5ET00gcmVwZWF0cyBpbiBjaGlsZCAqLworCisJCQkvKiBFdmVyeSBjaGlsZCBhZGRzIGl0c2VsZiB0byBuZXcgcHJvY2VzcyBncm91cAorCQkJICogd2l0aCBwZ2lkID09IHBpZF9vZl9maXJzdF9jaGlsZF9pbl9waXBlICovCisJCQlpZiAoRy5ydW5fbGlzdF9sZXZlbCA9PSAxICYmIEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJCQlwaWRfdCBwZ3JwOworCQkJCXBncnAgPSBwaS0+cGdycDsKKwkJCQlpZiAocGdycCA8IDApIC8qIHRydWUgZm9yIDFzdCBwcm9jZXNzIG9ubHkgKi8KKwkJCQkJcGdycCA9IGdldHBpZCgpOworCQkJCWlmIChzZXRwZ2lkKDAsIHBncnApID09IDAKKwkJCQkgJiYgcGktPmZvbGxvd3VwICE9IFBJUEVfQkcKKwkJCQkgJiYgR19zYXZlZF90dHlfcGdycCAvKiB3ZSBoYXZlIGN0dHkgKi8KKwkJCQkpIHsKKwkJCQkJLyogV2UgZG8gaXQgaW4gKmV2ZXJ5KiBjaGlsZCwgbm90IGp1c3QgZmlyc3QsCisJCQkJCSAqIHRvIGF2b2lkIHJhY2VzICovCisJCQkJCXRjc2V0cGdycChHX2ludGVyYWN0aXZlX2ZkLCBwZ3JwKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCWlmIChwaS0+YWxpdmVfY21kcyA9PSAwICYmIHBpLT5mb2xsb3d1cCA9PSBQSVBFX0JHKSB7CisJCQkJLyogMXN0IGNtZCBpbiBiYWNrZ3JvdW5kZWQgcGlwZQorCQkJCSAqIHNob3VsZCBoYXZlIGl0cyBzdGRpbiAvZGV2L251bGwnZWQgKi8KKwkJCQljbG9zZSgwKTsKKwkJCQlpZiAob3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpKQorCQkJCQl4b3BlbigiLyIsIE9fUkRPTkxZKTsKKwkJCX0gZWxzZSB7CisJCQkJeG1vdmVfZmQobmV4dF9pbmZkLCAwKTsKKwkJCX0KKwkJCXhtb3ZlX2ZkKHBpcGVmZHMud3IsIDEpOworCQkJaWYgKHBpcGVmZHMucmQgPiAxKQorCQkJCWNsb3NlKHBpcGVmZHMucmQpOworCQkJLyogTGlrZSBiYXNoLCBleHBsaWNpdCByZWRpcmVjdHMgb3ZlcnJpZGUgcGlwZXMsCisJCQkgKiBhbmQgdGhlIHBpcGUgZmQgaXMgYXZhaWxhYmxlIGZvciBkdXAnaW5nLiAqLworCQkJaWYgKHNldHVwX3JlZGlyZWN0cyhjb21tYW5kLCBOVUxMKSkKKwkJCQlfZXhpdCgxKTsKKworCQkJLyogU3RvcmVzIHRvIG5vbW11X3NhdmUgbGlzdCBvZiBlbnYgdmFycyBwdXRlbnYnZWQKKwkJCSAqIChOT01NVSwgb24gTU1VIHdlIGRvbid0IG5lZWQgdGhhdCkgKi8KKwkJCS8qIGNhc3QgYXdheSB2b2xhdGlsaXR5Li4uICovCisJCQlwc2V1ZG9fZXhlYygobm9tbXVfc2F2ZV90KikgJm5vbW11X3NhdmUsIGNvbW1hbmQsIGFyZ3ZfZXhwYW5kZWQpOworCQkJLyogcHNldWRvX2V4ZWMoKSBkb2VzIG5vdCByZXR1cm4gKi8KKwkJfQorCisJCS8qIHBhcmVudCBvciBlcnJvciAqLworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwkJRy5jb3VudF9TSUdDSExEKys7CisvL2JiX2Vycm9yX21zZygiWyVkXSBmb3JrIGluIHJ1bl9waXBlOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisjZW5kaWYKKwkJZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpOworI2lmICFCQl9NTVUKKwkJLyogQ2xlYW4gdXAgYWZ0ZXIgdmZvcmtlZCBjaGlsZCAqLworCQlmcmVlKG5vbW11X3NhdmUuYXJndik7CisJCWZyZWUobm9tbXVfc2F2ZS5hcmd2X2Zyb21fcmVfZXhlY2luZyk7CisJCXVuc2V0X3ZhcnMobm9tbXVfc2F2ZS5uZXdfZW52KTsKKwkJYWRkX3ZhcnMobm9tbXVfc2F2ZS5vbGRfdmFycyk7CisjZW5kaWYKKwkJZnJlZShhcmd2X2V4cGFuZGVkKTsKKwkJYXJndl9leHBhbmRlZCA9IE5VTEw7CisJCWlmIChjb21tYW5kLT5waWQgPCAwKSB7IC8qIFt2XWZvcmsgZmFpbGVkICovCisJCQkvKiBDbGVhcmx5IGluZGljYXRlLCB3YXMgaXQgZm9yayBvciB2Zm9yayAqLworCQkJYmJfcGVycm9yX21zZyhCQl9NTVUgPyAidmZvcmsiKzEgOiAidmZvcmsiKTsKKwkJfSBlbHNlIHsKKwkJCXBpLT5hbGl2ZV9jbWRzKys7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCQkvKiBTZWNvbmQgYW5kIG5leHQgY2hpbGRyZW4gbmVlZCB0byBrbm93IHBpZCBvZiBmaXJzdCBvbmUgKi8KKwkJCWlmIChwaS0+cGdycCA8IDApCisJCQkJcGktPnBncnAgPSBjb21tYW5kLT5waWQ7CisjZW5kaWYKKwkJfQorCisJCWlmIChjbWRfbm8gPiAxKQorCQkJY2xvc2UobmV4dF9pbmZkKTsKKwkJaWYgKGNtZF9ubyA8IHBpLT5udW1fY21kcykKKwkJCWNsb3NlKHBpcGVmZHMud3IpOworCQkvKiBQYXNzIHJlYWQgKG91dHB1dCkgcGlwZSBlbmQgdG8gbmV4dCBpdGVyYXRpb24gKi8KKwkJbmV4dF9pbmZkID0gcGlwZWZkcy5yZDsKKwl9CisKKwlpZiAoIXBpLT5hbGl2ZV9jbWRzKSB7CisJCWRlYnVnX2xlYXZlKCk7CisJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZSByZXR1cm4gMSAoYWxsIGZvcmtzIGZhaWxlZCwgbm8gY2hpbGRyZW4pXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGVidWdfbGVhdmUoKTsKKwlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGUgcmV0dXJuIC0xICgldSBjaGlsZHJlbiBzdGFydGVkKVxuIiwgcGktPmFsaXZlX2NtZHMpOworCXJldHVybiAtMTsKK30KKworLyogTkI6IGNhbGxlZCBieSBwc2V1ZG9fZXhlYywgYW5kIHRoZXJlZm9yZSBtdXN0IG5vdCBtb2RpZnkgYW55CisgKiBnbG9iYWwgZGF0YSB1bnRpbCBleGVjL19leGl0ICh3ZSBjYW4gYmUgYSBjaGlsZCBhZnRlciB2Zm9yayEpICovCitzdGF0aWMgaW50IHJ1bl9saXN0KHN0cnVjdCBwaXBlICpwaSkKK3sKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJY2hhciAqY2FzZV93b3JkID0gTlVMTDsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJc3RydWN0IHBpcGUgKmxvb3BfdG9wID0gTlVMTDsKKwljaGFyICoqZm9yX2xjdXIgPSBOVUxMOworCWNoYXIgKipmb3JfbGlzdCA9IE5VTEw7CisjZW5kaWYKKwlzbWFsbGludCBsYXN0X2ZvbGxvd3VwOworCXNtYWxsdWludCByY29kZTsKKyNpZiBFTkFCTEVfSFVTSF9JRiB8fCBFTkFCTEVfSFVTSF9DQVNFCisJc21hbGx1aW50IGNvbmRfY29kZSA9IDA7CisjZWxzZQorCWVudW0geyBjb25kX2NvZGUgPSAwIH07CisjZW5kaWYKKyNpZiBIQVNfS0VZV09SRFMKKwlzbWFsbGludCByd29yZDsgICAgICAvKiBSRVNfZm9vICovCisJc21hbGxpbnQgbGFzdF9yd29yZDsgLyogZGl0dG8gKi8KKyNlbmRpZgorCisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9saXN0IHN0YXJ0IGx2bCAlZFxuIiwgRy5ydW5fbGlzdF9sZXZlbCk7CisJZGVidWdfZW50ZXIoKTsKKworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJLyogQ2hlY2sgc3ludGF4IGZvciAiZm9yIiAqLworCXsKKwkJc3RydWN0IHBpcGUgKmNwaXBlOworCQlmb3IgKGNwaXBlID0gcGk7IGNwaXBlOyBjcGlwZSA9IGNwaXBlLT5uZXh0KSB7CisJCQlpZiAoY3BpcGUtPnJlc193b3JkICE9IFJFU19GT1IgJiYgY3BpcGUtPnJlc193b3JkICE9IFJFU19JTikKKwkJCQljb250aW51ZTsKKwkJCS8qIGN1cnJlbnQgd29yZCBpcyBGT1Igb3IgSU4gKEJPTEQgaW4gY29tbWVudHMgYmVsb3cpICovCisJCQlpZiAoY3BpcGUtPm5leHQgPT0gTlVMTCkgeworCQkJCXN5bnRheF9lcnJvcigibWFsZm9ybWVkIGZvciIpOworCQkJCWRlYnVnX2xlYXZlKCk7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9saXN0IGx2bCAlZCByZXR1cm4gMVxuIiwgRy5ydW5fbGlzdF9sZXZlbCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQkvKiAiRk9SIHY7IGRvIC4uLiIgYW5kICJmb3IgdiBJTiBhIGI7IGRvLi4uIiBhcmUgb2sgKi8KKwkJCWlmIChjcGlwZS0+bmV4dC0+cmVzX3dvcmQgPT0gUkVTX0RPKQorCQkJCWNvbnRpbnVlOworCQkJLyogbmV4dCB3b3JkIGlzIG5vdCAiZG8iLiBJdCBtdXN0IGJlICJpbiIgdGhlbiAoIkZPUiB2IGluIC4uLiIpICovCisJCQlpZiAoY3BpcGUtPnJlc193b3JkID09IFJFU19JTiAvKiAiZm9yIHYgSU4gYSBiOyBub3RfZG8uLi4iPyAqLworCQkJIHx8IGNwaXBlLT5uZXh0LT5yZXNfd29yZCAhPSBSRVNfSU4gLyogRk9SIHYgbm90X2RvX2FuZF9ub3RfaW4uLi4iPyAqLworCQkJKSB7CisJCQkJc3ludGF4X2Vycm9yKCJtYWxmb3JtZWQgZm9yIik7CisJCQkJZGVidWdfbGVhdmUoKTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX2xpc3QgbHZsICVkIHJldHVybiAxXG4iLCBHLnJ1bl9saXN0X2xldmVsKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogUGFzdCB0aGlzIHBvaW50LCBhbGwgY29kZSBwYXRocyBzaG91bGQganVtcCB0byByZXQ6IGxhYmVsCisJICogaW4gb3JkZXIgdG8gcmV0dXJuLCBubyBkaXJlY3QgInJldHVybiIgc3RhdGVtZW50cyBwbGVhc2UuCisJICogVGhpcyBoZWxwcyB0byBlbnN1cmUgdGhhdCBubyBtZW1vcnkgaXMgbGVha2VkLiAqLworCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJRy5ydW5fbGlzdF9sZXZlbCsrOworI2VuZGlmCisKKyNpZiBIQVNfS0VZV09SRFMKKwlyd29yZCA9IFJFU19OT05FOworCWxhc3RfcndvcmQgPSBSRVNfWFhYWDsKKyNlbmRpZgorCWxhc3RfZm9sbG93dXAgPSBQSVBFX1NFUTsKKwlyY29kZSA9IEcubGFzdF9leGl0Y29kZTsKKworCS8qIEdvIHRocm91Z2ggbGlzdCBvZiBwaXBlcywgKG1heWJlKSBleGVjdXRpbmcgdGhlbS4gKi8KKwlmb3IgKDsgcGk7IHBpID0gSUZfSFVTSF9MT09QUyhyd29yZCA9PSBSRVNfRE9ORSA/IGxvb3BfdG9wIDogKSBwaS0+bmV4dCkgeworCQlpZiAoRy5mbGFnX1NJR0lOVCkKKwkJCWJyZWFrOworCisJCUlGX0hBU19LRVlXT1JEUyhyd29yZCA9IHBpLT5yZXNfd29yZDspCisJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ3b3JkPSVkIGNvbmRfY29kZT0lZCBsYXN0X3J3b3JkPSVkXG4iLAorCQkJCXJ3b3JkLCBjb25kX2NvZGUsIGxhc3RfcndvcmQpOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJCWlmICgocndvcmQgPT0gUkVTX1dISUxFIHx8IHJ3b3JkID09IFJFU19VTlRJTCB8fCByd29yZCA9PSBSRVNfRk9SKQorCQkgJiYgbG9vcF90b3AgPT0gTlVMTCAvKiBhdm9pZCBidW1waW5nIEcuZGVwdGhfb2ZfbG9vcCB0d2ljZSAqLworCQkpIHsKKwkJCS8qIHN0YXJ0IG9mIGEgbG9vcDogcmVtZW1iZXIgd2hlcmUgbG9vcCBzdGFydHMgKi8KKwkJCWxvb3BfdG9wID0gcGk7CisJCQlHLmRlcHRoX29mX2xvb3ArKzsKKwkJfQorI2VuZGlmCisJCS8qIFN0aWxsIGluIHRoZSBzYW1lICJpZi4uLiIsICJ0aGVuLi4uIiBvciAiZG8uLi4iIGJyYW5jaD8gKi8KKwkJaWYgKElGX0hBU19LRVlXT1JEUyhyd29yZCA9PSBsYXN0X3J3b3JkICYmKSAxKSB7CisJCQlpZiAoKHJjb2RlID09IDAgJiYgbGFzdF9mb2xsb3d1cCA9PSBQSVBFX09SKQorCQkJIHx8IChyY29kZSAhPSAwICYmIGxhc3RfZm9sbG93dXAgPT0gUElQRV9BTkQpCisJCQkpIHsKKwkJCQkvKiBJdCBpcyAiPHRydWU+IHx8IENNRCIgb3IgIjxmYWxzZT4gJiYgQ01EIgorCQkJCSAqIGFuZCB3ZSBzaG91bGQgbm90IGV4ZWN1dGUgQ01EICovCisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoInNraXBwZWQgY21kIGJlY2F1c2Ugb2YgfHwgb3IgJiZcbiIpOworCQkJCWxhc3RfZm9sbG93dXAgPSBwaS0+Zm9sbG93dXA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJbGFzdF9mb2xsb3d1cCA9IHBpLT5mb2xsb3d1cDsKKwkJSUZfSEFTX0tFWVdPUkRTKGxhc3RfcndvcmQgPSByd29yZDspCisjaWYgRU5BQkxFX0hVU0hfSUYKKwkJaWYgKGNvbmRfY29kZSkgeworCQkJaWYgKHJ3b3JkID09IFJFU19USEVOKSB7CisJCQkJLyogaWYgZmFsc2U7IHRoZW4gLi4uIGZpIGhhcyBleGl0Y29kZSAwISAqLworCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCQkJCS8qICJpZiA8ZmFsc2U+IFRIRU4gY21kIjogc2tpcCBjbWQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyd29yZCA9PSBSRVNfRUxTRSB8fCByd29yZCA9PSBSRVNfRUxJRikgeworCQkJCS8qICJpZiA8dHJ1ZT4gdGhlbiAuLi4gRUxTRS9FTElGIGNtZCI6CisJCQkJICogc2tpcCBjbWQgYW5kIGFsbCBmb2xsb3dpbmcgb25lcyAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCQlpZiAocndvcmQgPT0gUkVTX0ZPUikgeyAvKiAmJiBwaS0+bnVtX2NtZHMgLSBhbHdheXMgPT0gMSAqLworCQkJaWYgKCFmb3JfbGN1cikgeworCQkJCS8qIGZpcnN0IGxvb3AgdGhyb3VnaCBmb3IgKi8KKworCQkJCXN0YXRpYyBjb25zdCBjaGFyIGVuY29kZWRfZG9sbGFyX2F0W10gQUxJR04xID0geworCQkJCQlTUEVDSUFMX1ZBUl9TWU1CT0wsICdAJyB8IDB4ODAsIFNQRUNJQUxfVkFSX1NZTUJPTCwgJ1wwJworCQkJCX07IC8qIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgIiRAIiAqLworCQkJCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBlbmNvZGVkX2RvbGxhcl9hdF9hcmd2W10gPSB7CisJCQkJCWVuY29kZWRfZG9sbGFyX2F0LCBOVUxMCisJCQkJfTsgLyogYXJndiBsaXN0IHdpdGggb25lIGVsZW1lbnQ6ICIkQCIgKi8KKwkJCQljaGFyICoqdmFsczsKKworCQkJCXZhbHMgPSAoY2hhcioqKWVuY29kZWRfZG9sbGFyX2F0X2FyZ3Y7CisJCQkJaWYgKHBpLT5uZXh0LT5yZXNfd29yZCA9PSBSRVNfSU4pIHsKKwkJCQkJLyogaWYgbm8gdmFyaWFibGUgdmFsdWVzIGFmdGVyICJpbiIgd2Ugc2tpcCAiZm9yIiAqLworCQkJCQlpZiAoIXBpLT5uZXh0LT5jbWRzWzBdLmFyZ3YpIHsKKwkJCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCQkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogbnVsbCBGT1I6IGV4aXRjb2RlIEVYSVRfU1VDQ0VTU1xuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQl2YWxzID0gcGktPm5leHQtPmNtZHNbMF0uYXJndjsKKwkJCQl9IC8qIGVsc2U6ICJmb3IgdmFyOyBkby4uLiIgLT4gYXNzdW1lICIkQCIgbGlzdCAqLworCQkJCS8qIGNyZWF0ZSBsaXN0IG9mIHZhcmlhYmxlIHZhbHVlcyAqLworCQkJCWRlYnVnX3ByaW50X3N0cmluZ3MoImZvcl9saXN0IG1hZGUgZnJvbSIsIHZhbHMpOworCQkJCWZvcl9saXN0ID0gZXhwYW5kX3N0cnZlY190b19zdHJ2ZWModmFscyk7CisJCQkJZm9yX2xjdXIgPSBmb3JfbGlzdDsKKwkJCQlkZWJ1Z19wcmludF9zdHJpbmdzKCJmb3JfbGlzdCIsIGZvcl9saXN0KTsKKwkJCX0KKwkJCWlmICghKmZvcl9sY3VyKSB7CisJCQkJLyogImZvciIgbG9vcCBpcyBvdmVyLCBjbGVhbiB1cCAqLworCQkJCWZyZWUoZm9yX2xpc3QpOworCQkJCWZvcl9saXN0ID0gTlVMTDsKKwkJCQlmb3JfbGN1ciA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBJbnNlcnQgbmV4dCB2YWx1ZSBmcm9tIGZvcl9sY3VyICovCisJCQkvKiBub3RlOiAqZm9yX2xjdXIgYWxyZWFkeSBoYXMgcXVvdGVzIHJlbW92ZWQsICR2YXIgZXhwYW5kZWQsIGV0YyAqLworCQkJc2V0X2xvY2FsX3Zhcih4YXNwcmludGYoIiVzPSVzIiwgcGktPmNtZHNbMF0uYXJndlswXSwgKmZvcl9sY3VyKyspLCAvKmV4cDoqLyAwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJ3b3JkID09IFJFU19JTikgeworCQkJY29udGludWU7IC8qICJmb3IgdiBJTiBsaXN0Oy4uLiIgLSAiaW4iIGhhcyBubyBjbWRzIGFueXdheSAqLworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfRE9ORSkgeworCQkJY29udGludWU7IC8qICJkb25lIiBoYXMgbm8gY21kcyB0b28gKi8KKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQlpZiAocndvcmQgPT0gUkVTX0NBU0UpIHsKKwkJCWNhc2Vfd29yZCA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RyaW5nKHBpLT5jbWRzLT5hcmd2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfTUFUQ0gpIHsKKwkJCWNoYXIgKiphcmd2OworCisJCQlpZiAoIWNhc2Vfd29yZCkgLyogImNhc2UgLi4uIG1hdGNoZWRfd29yZCkgLi4uIFdPUkQpIjogd2UgZXhlY3V0ZWQgc2VsZWN0ZWQgYnJhbmNoLCBzdG9wICovCisJCQkJYnJlYWs7CisJCQkvKiBhbGwgcHJldiB3b3JkcyBkaWRuJ3QgbWF0Y2gsIGRvZXMgdGhpcyBvbmUgbWF0Y2g/ICovCisJCQlhcmd2ID0gcGktPmNtZHMtPmFyZ3Y7CisJCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCQljaGFyICpwYXR0ZXJuID0gZXhwYW5kX3N0cmluZ190b19zdHJpbmcoKmFyZ3YsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJLyogVE9ETzogd2hpY2ggRk5NX3h4eCBmbGFncyB0byB1c2U/ICovCisJCQkJY29uZF9jb2RlID0gKGZubWF0Y2gocGF0dGVybiwgY2FzZV93b3JkLCAvKmZsYWdzOiovIDApICE9IDApOworCQkJCWZyZWUocGF0dGVybik7CisJCQkJaWYgKGNvbmRfY29kZSA9PSAwKSB7IC8qIG1hdGNoISB3ZSB3aWxsIGV4ZWN1dGUgdGhpcyBicmFuY2ggKi8KKwkJCQkJZnJlZShjYXNlX3dvcmQpOyAvKiBtYWtlIGZ1dHVyZSAid29yZCkiIHN0b3AgKi8KKwkJCQkJY2FzZV93b3JkID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWFyZ3YrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfQ0FTRV9CT0RZKSB7IC8qIGluc2lkZSBvZiBhIGNhc2UgYnJhbmNoICovCisJCQlpZiAoY29uZF9jb2RlICE9IDApCisJCQkJY29udGludWU7IC8qIG5vdCBtYXRjaGVkIHlldCwgc2tpcCB0aGlzIHBpcGUgKi8KKwkJfQorI2VuZGlmCisJCS8qIEp1c3QgcHJlc3NpbmcgPGVudGVyPiBpbiBzaGVsbCBzaG91bGQgY2hlY2sgZm9yIGpvYnMuCisJCSAqIE9UT0gsIGluIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbCB0aGlzIGlzIHVzZWxlc3MKKwkJICogYW5kIG9ubHkgbGVhZHMgdG8gZXh0cmEgam9iIGNoZWNrcyAqLworCQlpZiAocGktPm51bV9jbWRzID09IDApIHsKKwkJCWlmIChHX2ludGVyYWN0aXZlX2ZkKQorCQkJCWdvdG8gY2hlY2tfam9ic19hbmRfY29udGludWU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEFmdGVyIGFuYWx5emluZyBhbGwga2V5d29yZHMgYW5kIGNvbmRpdGlvbnMsIHdlIGRlY2lkZWQKKwkJICogdG8gZXhlY3V0ZSB0aGlzIHBpcGUuIE5COiBoYXZlIHRvIGRvIGNoZWNram9icyhOVUxMKQorCQkgKiBhZnRlciBydW5fcGlwZSB0byBjb2xsZWN0IGFueSBiYWNrZ3JvdW5kIGNoaWxkcmVuLAorCQkgKiBldmVuIGlmIGxpc3QgZXhlY3V0aW9uIGlzIHRvIGJlIHN0b3BwZWQuICovCisJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ1bl9waXBlIHdpdGggJWQgbWVtYmVyc1xuIiwgcGktPm51bV9jbWRzKTsKKwkJeworCQkJaW50IHI7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJCUcuZmxhZ19icmVha19jb250aW51ZSA9IDA7CisjZW5kaWYKKwkJCXJjb2RlID0gciA9IHJ1bl9waXBlKHBpKTsgLyogTkI6IHJjb2RlIGlzIGEgc21hbGxpbnQgKi8KKwkJCWlmIChyICE9IC0xKSB7CisJCQkJLyogV2UgcmFuIGEgYnVpbHRpbiwgZnVuY3Rpb24sIG9yIGdyb3VwLgorCQkJCSAqIHJjb2RlIGlzIGFscmVhZHkga25vd24KKwkJCQkgKiBhbmQgd2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciBhbnl0aGluZy4gKi8KKwkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBidWlsdGluL2Z1bmMgZXhpdGNvZGUgJWRcbiIsIHJjb2RlKTsKKwkJCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJCQkvKiBXYXMgaXQgImJyZWFrIiBvciAiY29udGludWUiPyAqLworCQkJCWlmIChHLmZsYWdfYnJlYWtfY29udGludWUpIHsKKwkJCQkJc21hbGxpbnQgZmJjID0gRy5mbGFnX2JyZWFrX2NvbnRpbnVlOworCQkJCQkvKiBXZSBtaWdodCBmYWxsIGludG8gb3V0ZXIgKmxvb3AqLAorCQkJCQkgKiBkb24ndCB3YW50IHRvIGJyZWFrIGl0IHRvbyAqLworCQkJCQlpZiAobG9vcF90b3ApIHsKKwkJCQkJCUcuZGVwdGhfYnJlYWtfY29udGludWUtLTsKKwkJCQkJCWlmIChHLmRlcHRoX2JyZWFrX2NvbnRpbnVlID09IDApCisJCQkJCQkJRy5mbGFnX2JyZWFrX2NvbnRpbnVlID0gMDsKKwkJCQkJCS8qIGVsc2U6IGUuZy4gImNvbnRpbnVlIDIiIHNob3VsZCAqYnJlYWsqIG9uY2UsICp0aGVuKiBjb250aW51ZSAqLworCQkJCQl9IC8qIGVsc2U6ICJ3aGlsZS4uLiBkby4uLiB7IHdlIGFyZSBoZXJlIChpbm5lcm1vc3QgbGlzdCBpcyBub3QgYSBsb29wISkgfTsuLi5kb25lIiAqLworCQkJCQlpZiAoRy5kZXB0aF9icmVha19jb250aW51ZSAhPSAwIHx8IGZiYyA9PSBCQ19CUkVBSykKKwkJCQkJCWdvdG8gY2hlY2tfam9ic19hbmRfYnJlYWs7CisJCQkJCS8qICJjb250aW51ZSI6IHNpbXVsYXRlIGVuZCBvZiBsb29wICovCisJCQkJCXJ3b3JkID0gUkVTX0RPTkU7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQkJCWlmIChHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzID09IDEpIHsKKwkJCQkJLyogc2FtZSBhcyAiZ290byBjaGVja19qb2JzX2FuZF9icmVhayIgKi8KKwkJCQkJY2hlY2tqb2JzKE5VTEwpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCX0gZWxzZSBpZiAocGktPmZvbGxvd3VwID09IFBJUEVfQkcpIHsKKwkJCQkvKiBXaGF0IGRvZXMgYmFzaCBkbyB3aXRoIGF0dGVtcHRzIHRvIGJhY2tncm91bmQgYnVpbHRpbnM/ICovCisJCQkJLyogZXZlbiBiYXNoIDMuMiBkb2Vzbid0IGRvIHRoYXQgd2VsbCB3aXRoIG5lc3RlZCBiZzoKKwkJCQkgKiB0cnkgInsgeyBzbGVlcCAxMDsgZWNobyBERUVQOyB9ICYgZWNobyBIRVJFOyB9ICYiLgorCQkJCSAqIEknbSBOT1QgdHJlYXRpbmcgaW5uZXIgJidzIGFzIGpvYnMgKi8KKwkJCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCQkJaWYgKEcucnVuX2xpc3RfbGV2ZWwgPT0gMSkKKwkJCQkJaW5zZXJ0X2JnX2pvYihwaSk7CisjZW5kaWYKKwkJCQkvKiBMYXN0IGNvbW1hbmQncyBwaWQgZ29lcyB0byAkISAqLworCQkJCUcubGFzdF9iZ19waWQgPSBwaS0+Y21kc1twaS0+bnVtX2NtZHMgLSAxXS5waWQ7CisJCQkJRy5sYXN0X2V4aXRjb2RlID0gcmNvZGUgPSBFWElUX1NVQ0NFU1M7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogY21kJjogZXhpdGNvZGUgRVhJVF9TVUNDRVNTXG4iKTsKKwkJCX0gZWxzZSB7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCQkJaWYgKEcucnVuX2xpc3RfbGV2ZWwgPT0gMSAmJiBHX2ludGVyYWN0aXZlX2ZkKSB7CisJCQkJCS8qIFdhaXRzIGZvciBjb21wbGV0aW9uLCB0aGVuIGZnJ3MgbWFpbiBzaGVsbCAqLworCQkJCQlyY29kZSA9IGNoZWNram9ic19hbmRfZmdfc2hlbGwocGkpOworCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBjaGVja2pvYnNfYW5kX2ZnX3NoZWxsIGV4aXRjb2RlICVkXG4iLCByY29kZSk7CisJCQkJCWNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKwkJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXsgLyogVGhpcyBvbmUganVzdCB3YWl0cyBmb3IgY29tcGxldGlvbiAqLworCQkJCQlyY29kZSA9IGNoZWNram9icyhwaSk7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IGNoZWNram9icyBleGl0Y29kZSAlZFxuIiwgcmNvZGUpOworCQkJCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisJCQkJfQorCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlOworCQkJfQorCQl9CisKKwkJLyogQW5hbHl6ZSBob3cgcmVzdWx0IGFmZmVjdHMgc3Vic2VxdWVudCBjb21tYW5kcyAqLworI2lmIEVOQUJMRV9IVVNIX0lGCisJCWlmIChyd29yZCA9PSBSRVNfSUYgfHwgcndvcmQgPT0gUkVTX0VMSUYpCisJCQljb25kX2NvZGUgPSByY29kZTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJCS8qIEJld2FyZSBvZiAid2hpbGUgZmFsc2U7IHRydWU7IGRvIC4uLiIhICovCisJCWlmIChwaS0+bmV4dAorCQkgJiYgKHBpLT5uZXh0LT5yZXNfd29yZCA9PSBSRVNfRE8gfHwgcGktPm5leHQtPnJlc193b3JkID09IFJFU19ET05FKQorCQkgLyogY2hlY2sgZm9yIFJFU19ET05FIGlzIG5lZWRlZCBmb3IgIndoaWxlIC4uLjsgZG8gXG4gZG9uZSIgY2FzZSAqLworCQkpIHsKKwkJCWlmIChyd29yZCA9PSBSRVNfV0hJTEUpIHsKKwkJCQlpZiAocmNvZGUpIHsKKwkJCQkJLyogIndoaWxlIGZhbHNlOyBkby4uLmRvbmUiIC0gZXhpdGNvZGUgMCAqLworCQkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZSA9IEVYSVRfU1VDQ0VTUzsKKwkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogd2hpbGUgZXhwciBpcyBmYWxzZTogYnJlYWtpbmcgKGV4aXRjb2RlOkVYSVRfU1VDQ0VTUylcbiIpOworCQkJCQlnb3RvIGNoZWNrX2pvYnNfYW5kX2JyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChyd29yZCA9PSBSRVNfVU5USUwpIHsKKwkJCQlpZiAoIXJjb2RlKSB7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHVudGlsIGV4cHIgaXMgdHJ1ZTogYnJlYWtpbmdcbiIpOworIGNoZWNrX2pvYnNfYW5kX2JyZWFrOgorCQkJCQljaGVja2pvYnMoTlVMTCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisKKyBjaGVja19qb2JzX2FuZF9jb250aW51ZToKKwkJY2hlY2tqb2JzKE5VTEwpOworCX0gLyogZm9yIChwaSkgKi8KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorCUcucnVuX2xpc3RfbGV2ZWwtLTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJaWYgKGxvb3BfdG9wKQorCQlHLmRlcHRoX29mX2xvb3AtLTsKKwlmcmVlKGZvcl9saXN0KTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwlmcmVlKGNhc2Vfd29yZCk7CisjZW5kaWYKKwlkZWJ1Z19sZWF2ZSgpOworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fbGlzdCBsdmwgJWQgcmV0dXJuICVkXG4iLCBHLnJ1bl9saXN0X2xldmVsICsgMSwgcmNvZGUpOworCXJldHVybiByY29kZTsKK30KKworLyogU2VsZWN0IHdoaWNoIHZlcnNpb24gd2Ugd2lsbCB1c2UgKi8KK3N0YXRpYyBpbnQgcnVuX2FuZF9mcmVlX2xpc3Qoc3RydWN0IHBpcGUgKnBpKQoreworCWludCByY29kZSA9IDA7CisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9hbmRfZnJlZV9saXN0IGVudGVyZWRcbiIpOworCWlmICghRy5vX29wdFtPUFRfT19OT0VYRUNdKSB7CisJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ1bl9saXN0OiAxc3QgcGlwZSB3aXRoICVkIGNtZHNcbiIsIHBpLT5udW1fY21kcyk7CisJCXJjb2RlID0gcnVuX2xpc3QocGkpOworCX0KKwkvKiBmcmVlX3BpcGVfbGlzdCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNsZWFyaW5nIG1lbW9yeS4KKwkgKiBJbiB0aGUgbG9uZyBydW4gdGhhdCBmdW5jdGlvbiBjYW4gYmUgbWVyZ2VkIHdpdGggcnVuX2xpc3QsCisJICogYnV0IGRvaW5nIHRoYXQgbm93IHdvdWxkIGhvYmJsZSB0aGUgZGVidWdnaW5nIGVmZm9ydC4gKi8KKwlmcmVlX3BpcGVfbGlzdChwaSk7CisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9hbmRfZnJlZV9saXN0IHJldHVybiAlZFxuIiwgcmNvZGUpOworCXJldHVybiByY29kZTsKK30KKworCitzdGF0aWMgdm9pZCBpbnN0YWxsX3NpZ2hhbmRsZXJzKHVuc2lnbmVkIG1hc2spCit7CisJc2lnaGFuZGxlcl90IG9sZF9oYW5kbGVyOworCXVuc2lnbmVkIHNpZyA9IDA7CisJd2hpbGUgKChtYXNrID4+PSAxKSAhPSAwKSB7CisJCXNpZysrOworCQlpZiAoIShtYXNrICYgMSkpCisJCQljb250aW51ZTsKKwkJb2xkX2hhbmRsZXIgPSBpbnN0YWxsX3NpZ2hhbmRsZXIoc2lnLCBwaWNrX3NpZ2hhbmRsZXIoc2lnKSk7CisJCS8qIFBPU0lYIGFsbG93cyBzaGVsbCB0byByZS1lbmFibGUgU0lHQ0hMRAorCQkgKiBldmVuIGlmIGl0IHdhcyBTSUdfSUdOIG9uIGVudHJ5LgorCQkgKiBUaGVyZWZvcmUgd2Ugc2tpcCBJR04gY2hlY2sgZm9yIGl0OgorCQkgKi8KKwkJaWYgKHNpZyA9PSBTSUdDSExEKQorCQkJY29udGludWU7CisJCWlmIChvbGRfaGFuZGxlciA9PSBTSUdfSUdOKSB7CisJCQkvKiBvb3BzLi4uIHJlc3RvcmUgYmFjayB0byBJR04sIGFuZCByZWNvcmQgdGhpcyBmYWN0ICovCisJCQlpbnN0YWxsX3NpZ2hhbmRsZXIoc2lnLCBvbGRfaGFuZGxlcik7CisJCQlpZiAoIUcudHJhcHMpCisJCQkJRy50cmFwcyA9IHh6YWxsb2Moc2l6ZW9mKEcudHJhcHNbMF0pICogTlNJRyk7CisJCQlmcmVlKEcudHJhcHNbc2lnXSk7CisJCQlHLnRyYXBzW3NpZ10gPSB4emFsbG9jKDEpOyAvKiA9PSB4c3RyZHVwKCIiKTsgKi8KKwkJfQorCX0KK30KKworLyogQ2FsbGVkIGEgZmV3IHRpbWVzIG9ubHkgKG9yIGV2ZW4gb25jZSBpZiAic2ggLWMiKSAqLworc3RhdGljIHZvaWQgaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKHZvaWQpCit7CisJdW5zaWduZWQgbWFzazsKKworCS8qIFdoaWNoIHNpZ25hbHMgYXJlIHNoZWxsLXNwZWNpYWw/ICovCisJbWFzayA9ICgxIDw8IFNJR1FVSVQpIHwgKDEgPDwgU0lHQ0hMRCk7CisJaWYgKEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJbWFzayB8PSBTUEVDSUFMX0lOVEVSQUNUSVZFX1NJR1M7CisJCWlmIChHX3NhdmVkX3R0eV9wZ3JwKSAvKiB3ZSBoYXZlIGN0dHksIGpvYiBjb250cm9sIHNpZ3Mgd29yayAqLworCQkJbWFzayB8PSBTUEVDSUFMX0pPQlNUT1BfU0lHUzsKKwl9CisJLyogQ2FyZWZ1bCwgZG8gbm90IHJlLWluc3RhbGwgaGFuZGxlcnMgd2UgYWxyZWFkeSBpbnN0YWxsZWQgKi8KKwlpZiAoRy5zcGVjaWFsX3NpZ19tYXNrICE9IG1hc2spIHsKKwkJdW5zaWduZWQgZGlmZiA9IG1hc2sgJiB+Ry5zcGVjaWFsX3NpZ19tYXNrOworCQlHLnNwZWNpYWxfc2lnX21hc2sgPSBtYXNrOworCQlpbnN0YWxsX3NpZ2hhbmRsZXJzKGRpZmYpOworCX0KK30KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorLyogaGVscGVyICovCisvKiBTZXQgaGFuZGxlcnMgdG8gcmVzdG9yZSB0dHkgcGdycCBhbmQgZXhpdCAqLworc3RhdGljIHZvaWQgaW5zdGFsbF9mYXRhbF9zaWdoYW5kbGVycyh2b2lkKQoreworCXVuc2lnbmVkIG1hc2s7CisKKwkvKiBXZSB3aWxsIHJlc3RvcmUgdHR5IHBncnAgb24gdGhlc2Ugc2lnbmFscyAqLworCW1hc2sgPSAwCisJCSsgKDEgPDwgU0lHSUxMICkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHRlBFICkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHQlVTICkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHU0VHVikgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHVFJBUCkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHQUJSVCkKKwkvKiBiYXNoIDMuMiBzZWVtcyB0byBoYW5kbGUgdGhlc2UganVzdCBsaWtlICdmYXRhbCcgb25lcyAqLworCQkrICgxIDw8IFNJR1BJUEUpCisJCSsgKDEgPDwgU0lHQUxSTSkKKwkvKiBpZiB3ZSBhcmUgaW50ZXJhY3RpdmUsIFNJR0hVUCwgU0lHVEVSTSBhbmQgU0lHSU5UIGFyZSBzcGVjaWFsIHNpZ3MuCisJICogaWYgd2UgYXJlbid0IGludGVyYWN0aXZlLi4uIGJ1dCBpbiB0aGlzIGNhc2UKKwkgKiB3ZSBuZXZlciB3YW50IHRvIHJlc3RvcmUgcGdycCBvbiBleGl0LCBhbmQgdGhpcyBmbiBpcyBub3QgY2FsbGVkCisJICovCisJCS8qKyAoMSA8PCBTSUdIVVAgKSovCisJCS8qKyAoMSA8PCBTSUdURVJNKSovCisJCS8qKyAoMSA8PCBTSUdJTlQgKSovCisJOworCUdfZmF0YWxfc2lnX21hc2sgPSBtYXNrOworCisJaW5zdGFsbF9zaWdoYW5kbGVycyhtYXNrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNldF9tb2RlKGludCBzdGF0ZSwgY2hhciBtb2RlLCBjb25zdCBjaGFyICpvX29wdCkKK3sKKwlpbnQgaWR4OworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgJ24nOgorCQlHLm9fb3B0W09QVF9PX05PRVhFQ10gPSBzdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSAneCc6CisJCUlGX0hVU0hfTU9ERV9YKEdfeF9tb2RlID0gc3RhdGU7KQorCQlicmVhazsKKwljYXNlICdvJzoKKwkJaWYgKCFvX29wdCkgeworCQkJLyogInNldCAtK28iIHdpdGhvdXQgcGFyYW1ldGVyLgorCQkJICogaW4gYmFzaCwgc2V0IC1vIHByb2R1Y2VzIHRoaXMgb3V0cHV0OgorCQkJICogIHBpcGVmYWlsICAgICAgICBvZmYKKwkJCSAqIGFuZCBzZXQgK286CisJCQkgKiAgc2V0ICtvIHBpcGVmYWlsCisJCQkgKiBXZSBhbHdheXMgdXNlIHRoZSBzZWNvbmQgZm9ybS4KKwkJCSAqLworCQkJY29uc3QgY2hhciAqcCA9IG9fb3B0X3N0cmluZ3M7CisJCQlpZHggPSAwOworCQkJd2hpbGUgKCpwKSB7CisJCQkJcHJpbnRmKCJzZXQgJWNvICVzXG4iLCAoRy5vX29wdFtpZHhdID8gJy0nIDogJysnKSwgcCk7CisJCQkJaWR4Kys7CisJCQkJcCArPSBzdHJsZW4ocCkgKyAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWR4ID0gaW5kZXhfaW5fc3RyaW5ncyhvX29wdF9zdHJpbmdzLCBvX29wdCk7CisJCWlmIChpZHggPj0gMCkgeworCQkJRy5vX29wdFtpZHhdID0gc3RhdGU7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK2ludCBodXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBodXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfbG9naW4gPSAoMSA8PCAwKSwKKwl9OworCXVuc2lnbmVkIGZsYWdzOworCWludCBvcHQ7CisJdW5zaWduZWQgYnVpbHRpbl9hcmdjOworCWNoYXIgKiplOworCXN0cnVjdCB2YXJpYWJsZSAqY3VyX3ZhcjsKKwlzdHJ1Y3QgdmFyaWFibGUgKnNoZWxsX3ZlcjsKKworCUlOSVRfRygpOworCWlmIChFWElUX1NVQ0NFU1MgIT0gMCkgLyogaWYgRVhJVF9TVUNDRVNTID09IDAsIGl0IGlzIGFscmVhZHkgZG9uZSAqLworCQlHLmxhc3RfZXhpdGNvZGUgPSBFWElUX1NVQ0NFU1M7CisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCUcuY291bnRfU0lHQ0hMRCsrOyAvKiBlbnN1cmUgaXQgaXMgIT0gRy5oYW5kbGVkX1NJR0NITEQgKi8KKyNlbmRpZgorI2lmICFCQl9NTVUKKwlHLmFyZ3YwX2Zvcl9yZV9leGVjaW5nID0gYXJndlswXTsKKyNlbmRpZgorCS8qIERlYWwgd2l0aCBIVVNIX1ZFUlNJT04gKi8KKwlzaGVsbF92ZXIgPSB4emFsbG9jKHNpemVvZigqc2hlbGxfdmVyKSk7CisJc2hlbGxfdmVyLT5mbGdfZXhwb3J0ID0gMTsKKwlzaGVsbF92ZXItPmZsZ19yZWFkX29ubHkgPSAxOworCS8qIENvZGUgd2hpY2ggaGFuZGxlcyAke3ZhcjxvcD4uLi59IG5lZWRzIHdyaXRhYmxlIHZhbHVlcyBmb3IgYWxsIHZhcmlhYmxlcywKKwkgKiB0aGVyZWZvcmUgd2UgeHN0cmR1cDogKi8KKwlzaGVsbF92ZXItPnZhcnN0ciA9IHhzdHJkdXAoaHVzaF92ZXJzaW9uX3N0cik7CisJLyogQ3JlYXRlIHNoZWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSB2YWx1ZXMKKwkgKiBjdXJyZW50bHkgbGl2aW5nIGluIHRoZSBlbnZpcm9ubWVudCAqLworCWRlYnVnX3ByaW50Zl9lbnYoInVuc2V0ZW52ICclcydcbiIsICJIVVNIX1ZFUlNJT04iKTsKKwl1bnNldGVudigiSFVTSF9WRVJTSU9OIik7IC8qIGluIGNhc2UgaXQgZXhpc3RzIGluIGluaXRpYWwgZW52ICovCisJRy50b3BfdmFyID0gc2hlbGxfdmVyOworCWN1cl92YXIgPSBHLnRvcF92YXI7CisJZSA9IGVudmlyb247CisJaWYgKGUpIHdoaWxlICgqZSkgeworCQljaGFyICp2YWx1ZSA9IHN0cmNocigqZSwgJz0nKTsKKwkJaWYgKHZhbHVlKSB7IC8qIHBhcmFub2lhICovCisJCQljdXJfdmFyLT5uZXh0ID0geHphbGxvYyhzaXplb2YoKmN1cl92YXIpKTsKKwkJCWN1cl92YXIgPSBjdXJfdmFyLT5uZXh0OworCQkJY3VyX3Zhci0+dmFyc3RyID0gKmU7CisJCQljdXJfdmFyLT5tYXhfbGVuID0gc3RybGVuKCplKTsKKwkJCWN1cl92YXItPmZsZ19leHBvcnQgPSAxOworCQl9CisJCWUrKzsKKwl9CisJLyogKFJlKWluc2VydCBIVVNIX1ZFUlNJT04gaW50byBlbnYgKEFGVEVSIHdlIHNjYW5uZWQgdGhlIGVudiEpICovCisJZGVidWdfcHJpbnRmX2VudigicHV0ZW52ICclcydcbiIsIHNoZWxsX3Zlci0+dmFyc3RyKTsKKwlwdXRlbnYoc2hlbGxfdmVyLT52YXJzdHIpOworCisJLyogRXhwb3J0IFBXRCAqLworCXNldF9wd2RfdmFyKC8qZXhwOiovIDEpOworCS8qIGJhc2ggYWxzbyBleHBvcnRzIFNITFZMIGFuZCBfLAorCSAqIGFuZCBzZXRzIChidXQgZG9lc24ndCBleHBvcnQpIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorCSAqIEJBU0g9L2Jpbi9iYXNoCisJICogQkFTSF9WRVJTSU5GTz0oWzBdPSIzIiBbMV09IjIiIFsyXT0iMCIgWzNdPSIxIiBbNF09InJlbGVhc2UiIFs1XT0iaTM4Ni1wYy1saW51eC1nbnUiKQorCSAqIEJBU0hfVkVSU0lPTj0nMy4yLjAoMSktcmVsZWFzZScKKwkgKiBIT1NUVFlQRT1pMzg2CisJICogTUFDSFRZUEU9aTM4Ni1wYy1saW51eC1nbnUKKwkgKiBPU1RZUEU9bGludXgtZ251CisJICogSE9TVE5BTUU9PHh4eHh4eHh4eHg+CisJICogUFBJRD08Tk5OTk4+IC0gd2UgYWxzbyBkbyBpdCBlbHNld2hlcmUKKwkgKiBFVUlEPTxOTk5OTj4KKwkgKiBVSUQ9PE5OTk5OPgorCSAqIEdST1VQUz0oKQorCSAqIExJTkVTPTxOTk4+CisJICogQ09MVU1OUz08Tk5OPgorCSAqIEJBU0hfQVJHQz0oKQorCSAqIEJBU0hfQVJHVj0oKQorCSAqIEJBU0hfTElORU5PPSgpCisJICogQkFTSF9TT1VSQ0U9KCkKKwkgKiBESVJTVEFDSz0oKQorCSAqIFBJUEVTVEFUVVM9KFswXT0iMCIpCisJICogSElTVEZJTEU9Lzx4eHg+Ly5iYXNoX2hpc3RvcnkKKwkgKiBISVNURklMRVNJWkU9NTAwCisJICogSElTVFNJWkU9NTAwCisJICogTUFJTENIRUNLPTYwCisJICogUEFUSD0vdXNyL2dudS9iaW46L3Vzci9sb2NhbC9iaW46L2JpbjovdXNyL2JpbjouCisJICogU0hFTEw9L2Jpbi9iYXNoCisJICogU0hFTExPUFRTPWJyYWNlZXhwYW5kOmVtYWNzOmhhc2hhbGw6aGlzdGV4cGFuZDpoaXN0b3J5OmludGVyYWN0aXZlLWNvbW1lbnRzOm1vbml0b3IKKwkgKiBURVJNPWR1bWIKKwkgKiBPUFRFUlI9MQorCSAqIE9QVElORD0xCisJICogSUZTPSQnIFx0XG4nCisJICogUFMxPSdccy1cdlwkICcKKwkgKiBQUzI9Jz4gJworCSAqIFBTND0nKyAnCisJICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisJRy5saW5lX2lucHV0X3N0YXRlID0gbmV3X2xpbmVfaW5wdXRfdChGT1JfU0hFTEwpOworIyBpZiBNQVhfSElTVE9SWSA+IDAgJiYgRU5BQkxFX0hVU0hfU0FWRUhJU1RPUlkKKwl7CisJCWNvbnN0IGNoYXIgKmhwID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSElTVEZJTEUiKTsKKwkJaWYgKCFocCkgeworCQkJaHAgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJIT01FIik7CisJCQlpZiAoaHApCisJCQkJaHAgPSBjb25jYXRfcGF0aF9maWxlKGhwLCAiLmh1c2hfaGlzdG9yeSIpOworCQl9IGVsc2UgeworCQkJaHAgPSB4c3RyZHVwKGhwKTsKKwkJfQorCQlpZiAoaHApIHsKKwkJCUcubGluZV9pbnB1dF9zdGF0ZS0+aGlzdF9maWxlID0gaHA7CisJCQkvL3NldF9sb2NhbF92YXIoeGFzcHJpbnRmKCJISVNURklMRT0lcyIsIC4uLikpOworCQl9CisjICBpZiBFTkFCTEVfRkVBVFVSRV9TSF9ISVNURklMRVNJWkUKKwkJaHAgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJISVNURklMRVNJWkUiKTsKKwkJRy5saW5lX2lucHV0X3N0YXRlLT5tYXhfaGlzdG9yeSA9IHNpemVfZnJvbV9ISVNURklMRVNJWkUoaHApOworIyAgZW5kaWYKKwl9CisjIGVuZGlmCisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgc29tZSBtb3JlIGdsb2JhbHMgdG8gbm9uLXplcm8gdmFsdWVzICovCisJY21kZWRpdF91cGRhdGVfcHJvbXB0KCk7CisKKwlpZiAoc2V0am1wKGRpZV9qbXApKSB7CisJCS8qIHhmdW5jIGhhcyBmYWlsZWQhIGRpZSBkaWUgZGllICovCisJCS8qIG5vIEVYSVQgdHJhcHMsIHRoaXMgaXMgYW4gZXNjYXBlIGhhdGNoISAqLworCQlHLmV4aXRpbmcgPSAxOworCQlodXNoX2V4aXQoeGZ1bmNfZXJyb3JfcmV0dmFsKTsKKwl9CisKKwkvKiBTaGVsbCBpcyBub24taW50ZXJhY3RpdmUgYXQgZmlyc3QuIFdlIG5lZWQgdG8gY2FsbAorCSAqIGluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpIGlmIHdlIGFyZSBnb2luZyB0byBleGVjdXRlICJzaCA8c2NyaXB0PiIsCisJICogInNoIC1jIDxjbWRzPiIgb3IgbG9naW4gc2hlbGwncyAvZXRjL3Byb2ZpbGUgYW5kIGZyaWVuZHMuCisJICogSWYgd2UgbGF0ZXIgZGVjaWRlIHRoYXQgd2UgYXJlIGludGVyYWN0aXZlLCB3ZSBydW4gaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCkKKwkgKiBpbiBvcmRlciB0byBpbnRlcmNlcHQgKG1vcmUpIHNpZ25hbHMuCisJICovCisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvc2guaHRtbCAqLworCWZsYWdzID0gKGFyZ3ZbMF0gJiYgYXJndlswXVswXSA9PSAnLScpID8gT1BUX2xvZ2luIDogMDsKKwlidWlsdGluX2FyZ2MgPSAwOworCXdoaWxlICgxKSB7CisJCW9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK2M6eGluc2wiCisjaWYgIUJCX01NVQorCQkJCSI8OiQ6UjpWOiIKKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCQkJIkY6IgorIyBlbmRpZgorI2VuZGlmCisJCSk7CisJCWlmIChvcHQgPD0gMCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdjJzoKKwkJCS8qIFBvc3NpYmlsaXRpZXM6CisJCQkgKiBzaCAuLi4gLWMgJ3NjcmlwdCcKKwkJCSAqIHNoIC4uLiAtYyAnc2NyaXB0JyBBUkcwIFtBUkcxLi4uXQorCQkJICogT24gTk9NTVUsIGlmIGJ1aWx0aW5fYXJnYyAhPSAwLAorCQkJICogc2ggLi4uIC1jICdidWlsdGluJyBCQVJHVi4uLiAiIiBBUkcwIFtBUkcxLi4uXQorCQkJICogIiIgbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBOVUxMCisJCQkgKiBhbmQgQkFSR1YgdmVjdG9yIGZlZCB0byBidWlsdGluIGZ1bmN0aW9uLgorCQkJICogTm90ZTogdGhlIGZvcm0gd2l0aG91dCBBUkcwIG5ldmVyIGhhcHBlbnM6CisJCQkgKiBzaCAuLi4gLWMgJ2J1aWx0aW4nIEJBUkdWLi4uICIiCisJCQkgKi8KKwkJCWlmICghRy5yb290X3BpZCkgeworCQkJCUcucm9vdF9waWQgPSBnZXRwaWQoKTsKKwkJCQlHLnJvb3RfcHBpZCA9IGdldHBwaWQoKTsKKwkJCX0KKwkJCUcuZ2xvYmFsX2FyZ3YgPSBhcmd2ICsgb3B0aW5kOworCQkJRy5nbG9iYWxfYXJnYyA9IGFyZ2MgLSBvcHRpbmQ7CisJCQlpZiAoYnVpbHRpbl9hcmdjKSB7CisJCQkJLyogLWMgJ2J1aWx0aW4nIFtCQVJHVi4uLl0gIiIgQVJHMCBbQVJHMS4uLl0gKi8KKwkJCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeDsKKworCQkJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCQkJCXggPSBmaW5kX2J1aWx0aW4ob3B0YXJnKTsKKwkJCQlpZiAoeCkgeyAvKiBwYXJhbm9pYSAqLworCQkJCQlHLmdsb2JhbF9hcmdjIC09IGJ1aWx0aW5fYXJnYzsgLyogc2tpcCBbQkFSR1YuLi5dICIiICovCisJCQkJCUcuZ2xvYmFsX2FyZ3YgKz0gYnVpbHRpbl9hcmdjOworCQkJCQlHLmdsb2JhbF9hcmd2Wy0xXSA9IE5VTEw7IC8qIHJlcGxhY2UgIiIgKi8KKwkJCQkJZmZsdXNoX2FsbCgpOworCQkJCQlHLmxhc3RfZXhpdGNvZGUgPSB4LT5iX2Z1bmN0aW9uKGFyZ3YgKyBvcHRpbmQgLSAxKTsKKwkJCQl9CisJCQkJZ290byBmaW5hbF9yZXR1cm47CisJCQl9CisJCQlpZiAoIUcuZ2xvYmFsX2FyZ3ZbMF0pIHsKKwkJCQkvKiAtYyAnc2NyaXB0JyAobm8gcGFyYW1zKTogcHJldmVudCBlbXB0eSAkMCAqLworCQkJCUcuZ2xvYmFsX2FyZ3YtLTsgLyogcG9pbnRzIHRvIGFyZ3ZbaV0gb2YgJ3NjcmlwdCcgKi8KKwkJCQlHLmdsb2JhbF9hcmd2WzBdID0gYXJndlswXTsKKwkJCQlHLmdsb2JhbF9hcmdjKys7CisJCQl9IC8qIGVsc2UgLWMgJ3NjcmlwdCcgQVJHMCBbQVJHMS4uLl06ICQwIGlzIEFSRzAgKi8KKwkJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCQkJcGFyc2VfYW5kX3J1bl9zdHJpbmcob3B0YXJnKTsKKwkJCWdvdG8gZmluYWxfcmV0dXJuOworCQljYXNlICdpJzoKKwkJCS8qIFdlbGwsIHdlIGNhbm5vdCBqdXN0IGRlY2xhcmUgaW50ZXJhY3RpdmVuZXNzLAorCQkJICogd2UgaGF2ZSB0byBoYXZlIHNvbWUgc3R1ZmYgKGN0dHksIGV0YykgKi8KKwkJCS8qIEdfaW50ZXJhY3RpdmVfZmQrKzsgKi8KKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCS8qICItcyIgbWVhbnMgInJlYWQgZnJvbSBzdGRpbiIsIGJ1dCB0aGlzIGlzIGhvdyB3ZSBhbHdheXMKKwkJCSAqIG9wZXJhdGUsIHNvIHNpbXBseSBkbyBub3RoaW5nIGhlcmUuICovCisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlmbGFncyB8PSBPUFRfbG9naW47CisJCQlicmVhazsKKyNpZiAhQkJfTU1VCisJCWNhc2UgJzwnOiAvKiAiYmlnIGhlcmVkb2MiIHN1cHBvcnQgKi8KKwkJCWZ1bGxfd3JpdGUxX3N0cihvcHRhcmcpOworCQkJX2V4aXQoMCk7CisJCWNhc2UgJyQnOiB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgZW1wdHlfdHJhcF9tYXNrOworCisJCQlHLnJvb3RfcGlkID0gYmJfc3RydG91KG9wdGFyZywgJm9wdGFyZywgMTYpOworCQkJb3B0YXJnKys7CisJCQlHLnJvb3RfcHBpZCA9IGJiX3N0cnRvdShvcHRhcmcsICZvcHRhcmcsIDE2KTsKKwkJCW9wdGFyZysrOworCQkJRy5sYXN0X2JnX3BpZCA9IGJiX3N0cnRvdShvcHRhcmcsICZvcHRhcmcsIDE2KTsKKwkJCW9wdGFyZysrOworCQkJRy5sYXN0X2V4aXRjb2RlID0gYmJfc3RydG91KG9wdGFyZywgJm9wdGFyZywgMTYpOworCQkJb3B0YXJnKys7CisJCQlidWlsdGluX2FyZ2MgPSBiYl9zdHJ0b3Uob3B0YXJnLCAmb3B0YXJnLCAxNik7CisJCQlvcHRhcmcrKzsKKwkJCWVtcHR5X3RyYXBfbWFzayA9IGJiX3N0cnRvdWxsKG9wdGFyZywgJm9wdGFyZywgMTYpOworCQkJaWYgKGVtcHR5X3RyYXBfbWFzayAhPSAwKSB7CisJCQkJaW50IHNpZzsKKwkJCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKwkJCQlHLnRyYXBzID0geHphbGxvYyhzaXplb2YoRy50cmFwc1swXSkgKiBOU0lHKTsKKwkJCQlmb3IgKHNpZyA9IDE7IHNpZyA8IE5TSUc7IHNpZysrKSB7CisJCQkJCWlmIChlbXB0eV90cmFwX21hc2sgJiAoMUxMIDw8IHNpZykpIHsKKwkJCQkJCUcudHJhcHNbc2lnXSA9IHh6YWxsb2MoMSk7IC8qID09IHhzdHJkdXAoIiIpOyAqLworCQkJCQkJaW5zdGFsbF9zaWdoYW5kbGVyKHNpZywgU0lHX0lHTik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjIGlmIEVOQUJMRV9IVVNIX0xPT1BTCisJCQlvcHRhcmcrKzsKKwkJCUcuZGVwdGhfb2ZfbG9vcCA9IGJiX3N0cnRvdShvcHRhcmcsICZvcHRhcmcsIDE2KTsKKyMgZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ1InOgorCQljYXNlICdWJzoKKwkJCXNldF9sb2NhbF92YXIoeHN0cmR1cChvcHRhcmcpLCAvKmV4cDoqLyAwLCAvKmx2bDoqLyAwLCAvKnJvOiovIG9wdCA9PSAnUicpOworCQkJYnJlYWs7CisjIGlmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQljYXNlICdGJzogeworCQkJc3RydWN0IGZ1bmN0aW9uICpmdW5jcCA9IG5ld19mdW5jdGlvbihvcHRhcmcpOworCQkJLyogZnVuY3AtPm5hbWUgaXMgYWxyZWFkeSBzZXQgdG8gb3B0YXJnICovCisJCQkvKiBmdW5jcC0+Ym9keSBpcyBzZXQgdG8gTlVMTC4gSXQncyBhIHNwZWNpYWwgY2FzZS4gKi8KKwkJCWZ1bmNwLT5ib2R5X2FzX3N0cmluZyA9IGFyZ3Zbb3B0aW5kXTsKKwkJCW9wdGluZCsrOworCQkJYnJlYWs7CisJCX0KKyMgZW5kaWYKKyNlbmRpZgorCQljYXNlICduJzoKKwkJY2FzZSAneCc6CisJCQlpZiAoc2V0X21vZGUoMSwgb3B0LCBOVUxMKSA9PSAwKSAvKiBubyBlcnJvciAqLworCQkJCWJyZWFrOworCQlkZWZhdWx0OgorI2lmbmRlZiBCQl9WRVIKKwkJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHNoIFtGSUxFXS4uLlxuIgorCQkJCQkiICAgb3I6IHNoIC1jIGNvbW1hbmQgW2FyZ3NdLi4uXG5cbiIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworI2Vsc2UKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKyNlbmRpZgorCQl9CisJfSAvKiBvcHRpb24gcGFyc2luZyBsb29wICovCisKKwkvKiBTa2lwIG9wdGlvbnMuIFRyeSAiaHVzaCAtbCI6ICQxIHNob3VsZCBub3QgYmUgIi1sIiEgKi8KKwlHLmdsb2JhbF9hcmdjID0gYXJnYyAtIChvcHRpbmQgLSAxKTsKKwlHLmdsb2JhbF9hcmd2ID0gYXJndiArIChvcHRpbmQgLSAxKTsKKwlHLmdsb2JhbF9hcmd2WzBdID0gYXJndlswXTsKKworCWlmICghRy5yb290X3BpZCkgeworCQlHLnJvb3RfcGlkID0gZ2V0cGlkKCk7CisJCUcucm9vdF9wcGlkID0gZ2V0cHBpZCgpOworCX0KKworCS8qIElmIHdlIGFyZSBsb2dpbiBzaGVsbC4uLiAqLworCWlmIChmbGFncyAmIE9QVF9sb2dpbikgeworCQlGSUxFICppbnB1dDsKKwkJZGVidWdfcHJpbnRmKCJzb3VyY2luZyAvZXRjL3Byb2ZpbGVcbiIpOworCQlpbnB1dCA9IGZvcGVuX2Zvcl9yZWFkKCIvZXRjL3Byb2ZpbGUiKTsKKwkJaWYgKGlucHV0ICE9IE5VTEwpIHsKKwkJCWNsb3NlX29uX2V4ZWNfb24oZmlsZW5vKGlucHV0KSk7CisJCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKwkJCXBhcnNlX2FuZF9ydW5fZmlsZShpbnB1dCk7CisJCQlmY2xvc2UoaW5wdXQpOworCQl9CisJCS8qIGJhc2g6IGFmdGVyIHNvdXJjaW5nIC9ldGMvcHJvZmlsZSwKKwkJICogdHJpZXMgdG8gc291cmNlIChpbiB0aGUgZ2l2ZW4gb3JkZXIpOgorCQkgKiB+Ly5iYXNoX3Byb2ZpbGUsIH4vLmJhc2hfbG9naW4sIH4vLnByb2ZpbGUsCisJCSAqIHN0b3BwaW5nIG9uIGZpcnN0IGZvdW5kLiAtLW5vcHJvZmlsZSB0dXJucyB0aGlzIG9mZi4KKwkJICogYmFzaCBhbHNvIHNvdXJjZXMgfi8uYmFzaF9sb2dvdXQgb24gZXhpdC4KKwkJICogSWYgY2FsbGVkIGFzIHNoLCBza2lwcyAuYmFzaF9YWFggZmlsZXMuCisJCSAqLworCX0KKworCWlmIChHLmdsb2JhbF9hcmd2WzFdKSB7CisJCUZJTEUgKmlucHV0OworCQkvKgorCQkgKiAiYmFzaCA8c2NyaXB0PiIgKHdoaWNoIGlzIG5ldmVyIGludGVyYWN0aXZlICh1bmxlc3MgLWk/KSkKKwkJICogc291cmNlcyAkQkFTSF9FTlYgaGVyZSAod2l0aG91dCBzY2FubmluZyAkUEFUSCkuCisJCSAqIElmIGNhbGxlZCBhcyBzaCwgZG9lcyB0aGUgc2FtZSBidXQgd2l0aCAkRU5WLgorCQkgKi8KKwkJRy5nbG9iYWxfYXJnYy0tOworCQlHLmdsb2JhbF9hcmd2Kys7CisJCWRlYnVnX3ByaW50ZigicnVubmluZyBzY3JpcHQgJyVzJ1xuIiwgRy5nbG9iYWxfYXJndlswXSk7CisJCWlucHV0ID0geGZvcGVuX2Zvcl9yZWFkKEcuZ2xvYmFsX2FyZ3ZbMF0pOworCQljbG9zZV9vbl9leGVjX29uKGZpbGVubyhpbnB1dCkpOworCQlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKwkJcGFyc2VfYW5kX3J1bl9maWxlKGlucHV0KTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCQlmY2xvc2UoaW5wdXQpOworI2VuZGlmCisJCWdvdG8gZmluYWxfcmV0dXJuOworCX0KKworCS8qIFVwIHRvIGhlcmUsIHNoZWxsIHdhcyBub24taW50ZXJhY3RpdmUuIE5vdyBpdCBtYXkgYmVjb21lIG9uZS4KKwkgKiBOQjogZG9uJ3QgZm9yZ2V0IHRvIChyZSlydW4gaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCkgYXMgbmVlZGVkLgorCSAqLworCisJLyogQSBzaGVsbCBpcyBpbnRlcmFjdGl2ZSBpZiB0aGUgJy1pJyBmbGFnIHdhcyBnaXZlbiwKKwkgKiBvciBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisJICogICAgbm8gLWMgY29tbWFuZAorCSAqICAgIG5vIGFyZ3VtZW50cyByZW1haW5pbmcgb3IgdGhlIC1zIGZsYWcgZ2l2ZW4KKwkgKiAgICBzdGFuZGFyZCBpbnB1dCBpcyBhIHRlcm1pbmFsCisJICogICAgc3RhbmRhcmQgb3V0cHV0IGlzIGEgdGVybWluYWwKKwkgKiBSZWZlciB0byBQb3NpeC4yLCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICdzaCcgdXRpbGl0eS4KKwkgKi8KKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlpZiAoaXNhdHR5KFNURElOX0ZJTEVOTykgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCUdfc2F2ZWRfdHR5X3BncnAgPSB0Y2dldHBncnAoU1RESU5fRklMRU5PKTsKKwkJZGVidWdfcHJpbnRmKCJzYXZlZF90dHlfcGdycDolZFxuIiwgR19zYXZlZF90dHlfcGdycCk7CisJCWlmIChHX3NhdmVkX3R0eV9wZ3JwIDwgMCkKKwkJCUdfc2F2ZWRfdHR5X3BncnAgPSAwOworCisJCS8qIHRyeSB0byBkdXAgc3RkaW4gdG8gaGlnaCBmZCMsID49IDI1NSAqLworCQlHX2ludGVyYWN0aXZlX2ZkID0gZmNudGwoU1RESU5fRklMRU5PLCBGX0RVUEZELCAyNTUpOworCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCA8IDApIHsKKwkJCS8qIHRyeSB0byBkdXAgdG8gYW55IGZkICovCisJCQlHX2ludGVyYWN0aXZlX2ZkID0gZHVwKFNURElOX0ZJTEVOTyk7CisJCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCA8IDApIHsKKwkJCQkvKiBnaXZlIHVwICovCisJCQkJR19pbnRlcmFjdGl2ZV9mZCA9IDA7CisJCQkJR19zYXZlZF90dHlfcGdycCA9IDA7CisJCQl9CisJCX0KKy8vIFRPRE86IHRyYWNrICYgZGlzYWxsb3cgYW55IGF0dGVtcHRzIG9mIHVzZXIKKy8vIHRvIChpbmFkdmVydGVudGx5KSBjbG9zZS9yZWRpcmVjdCBHX2ludGVyYWN0aXZlX2ZkCisJfQorCWRlYnVnX3ByaW50ZigiaW50ZXJhY3RpdmVfZmQ6JWRcbiIsIEdfaW50ZXJhY3RpdmVfZmQpOworCWlmIChHX2ludGVyYWN0aXZlX2ZkKSB7CisJCWNsb3NlX29uX2V4ZWNfb24oR19pbnRlcmFjdGl2ZV9mZCk7CisKKwkJaWYgKEdfc2F2ZWRfdHR5X3BncnApIHsKKwkJCS8qIElmIHdlIHdlcmUgcnVuIGFzICdodXNoICYnLCBzbGVlcCB1bnRpbCB3ZSBhcmUKKwkJCSAqIGluIHRoZSBmb3JlZ3JvdW5kICh0dHkgcGdycCA9PSBvdXIgcGdycCkuCisJCQkgKiBJZiB3ZSBnZXQgc3RhcnRlZCB1bmRlciBhIGpvYiBhd2FyZSBhcHAgKGxpa2UgYmFzaCksCisJCQkgKiBtYWtlIHN1cmUgd2UgYXJlIG5vdyBpbiBjaGFyZ2Ugc28gd2UgZG9uJ3QgZmlnaHQgb3ZlcgorCQkJICogd2hvIGdldHMgdGhlIGZvcmVncm91bmQgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJcGlkX3Qgc2hlbGxfcGdycCA9IGdldHBncnAoKTsKKwkJCQlHX3NhdmVkX3R0eV9wZ3JwID0gdGNnZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQpOworCQkJCWlmIChHX3NhdmVkX3R0eV9wZ3JwID09IHNoZWxsX3BncnApCisJCQkJCWJyZWFrOworCQkJCS8qIHNlbmQgVFRJTiB0byBvdXJzZWxmIChzaG91bGQgc3RvcCB1cykgKi8KKwkJCQlraWxsKC0gc2hlbGxfcGdycCwgU0lHVFRJTik7CisJCQl9CisJCX0KKworCQkvKiBJbnN0YWxsIG1vcmUgc2lnbmFsIGhhbmRsZXJzICovCisJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCisJCWlmIChHX3NhdmVkX3R0eV9wZ3JwKSB7CisJCQkvKiBTZXQgb3RoZXIgc2lnbmFscyB0byByZXN0b3JlIHNhdmVkX3R0eV9wZ3JwICovCisJCQlpbnN0YWxsX2ZhdGFsX3NpZ2hhbmRsZXJzKCk7CisJCQkvKiBQdXQgb3Vyc2VsdmVzIGluIG91ciBvd24gcHJvY2VzcyBncm91cAorCQkJICogKGJhc2gsIHRvbywgZG9lcyB0aGlzIG9ubHkgaWYgY3R0eSBpcyBhdmFpbGFibGUpICovCisJCQliYl9zZXRwZ3JwKCk7IC8qIGlzIHRoZSBzYW1lIGFzIHNldHBnaWQob3VyX3BpZCwgb3VyX3BpZCk7ICovCisJCQkvKiBHcmFiIGNvbnRyb2wgb2YgdGhlIHRlcm1pbmFsICovCisJCQl0Y3NldHBncnAoR19pbnRlcmFjdGl2ZV9mZCwgZ2V0cGlkKCkpOworCQl9CisJCS8qIC0xIGlzIHNwZWNpYWwgLSBtYWtlcyB4ZnVuY3MgbG9uZ2ptcCwgbm90IGV4aXQKKwkJICogKHdlIHJlc2V0IGRpZV9zbGVlcCA9IDAgd2hlcmVldmVyIHdlIFt2XWZvcmspICovCisJCWVuYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsgLyogc2V0cyBkaWVfc2xlZXAgPSAtMSAqLworCX0gZWxzZSB7CisJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCX0KKyNlbGlmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisJLyogTm8gam9iIGNvbnRyb2wgY29tcGlsZWQgaW4sIG9ubHkgcHJvbXB0L2xpbmUgZWRpdGluZyAqLworCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSAmJiBpc2F0dHkoU1RET1VUX0ZJTEVOTykpIHsKKwkJR19pbnRlcmFjdGl2ZV9mZCA9IGZjbnRsKFNURElOX0ZJTEVOTywgRl9EVVBGRCwgMjU1KTsKKwkJaWYgKEdfaW50ZXJhY3RpdmVfZmQgPCAwKSB7CisJCQkvKiB0cnkgdG8gZHVwIHRvIGFueSBmZCAqLworCQkJR19pbnRlcmFjdGl2ZV9mZCA9IGR1cChTVERJTl9GSUxFTk8pOworCQkJaWYgKEdfaW50ZXJhY3RpdmVfZmQgPCAwKQorCQkJCS8qIGdpdmUgdXAgKi8KKwkJCQlHX2ludGVyYWN0aXZlX2ZkID0gMDsKKwkJfQorCX0KKwlpZiAoR19pbnRlcmFjdGl2ZV9mZCkgeworCQljbG9zZV9vbl9leGVjX29uKEdfaW50ZXJhY3RpdmVfZmQpOworCX0KKwlpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKTsKKyNlbHNlCisJLyogV2UgaGF2ZSBpbnRlcmFjdGl2ZW5lc3MgY29kZSBkaXNhYmxlZCAqLworCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworI2VuZGlmCisJLyogYmFzaDoKKwkgKiBpZiBpbnRlcmFjdGl2ZSBidXQgbm90IGEgbG9naW4gc2hlbGwsIHNvdXJjZXMgfi8uYmFzaHJjCisJICogKC0tbm9yYyB0dXJucyB0aGlzIG9mZiwgLS1yY2ZpbGUgPGZpbGU+IG92ZXJyaWRlcykKKwkgKi8KKworCWlmICghRU5BQkxFX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQgJiYgR19pbnRlcmFjdGl2ZV9mZCkgeworCQkvKiBub3RlOiBhc2ggYW5kIGh1c2ggc2hhcmUgdGhpcyBzdHJpbmcgKi8KKwkJcHJpbnRmKCJcblxuJXMgJXNcbiIKKwkJCUlGX0hVU0hfSEVMUCgiRW50ZXIgJ2hlbHAnIGZvciBhIGxpc3Qgb2YgYnVpbHQtaW4gY29tbWFuZHMuXG4iKQorCQkJIlxuIiwKKwkJCWJiX2Jhbm5lciwKKwkJCSJodXNoIC0gdGhlIGh1bWJsZSBzaGVsbCIKKwkJKTsKKwl9CisKKwlwYXJzZV9hbmRfcnVuX2ZpbGUoc3RkaW4pOworCisgZmluYWxfcmV0dXJuOgorCWh1c2hfZXhpdChHLmxhc3RfZXhpdGNvZGUpOworfQorCisKKyNpZiBFTkFCTEVfTVNICitpbnQgbXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtc2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLy9iYl9lcnJvcl9tc2coIm1zaCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGh1c2ggaW5zdGVhZCIpOworCXJldHVybiBodXNoX21haW4oYXJnYywgYXJndik7Cit9CisjZW5kaWYKKworCisvKgorICogQnVpbHQtaW5zCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdHJ1ZShjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnVuX2FwcGxldF9tYWluKGNoYXIgKiphcmd2LCBpbnQgKCphcHBsZXRfbWFpbl9mdW5jKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpKQoreworCWludCBhcmdjID0gMDsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJYXJnYysrOworCQlhcmd2Kys7CisJfQorCXJldHVybiBhcHBsZXRfbWFpbl9mdW5jKGFyZ2MsIGFyZ3YgLSBhcmdjKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl90ZXN0KGNoYXIgKiphcmd2KQoreworCXJldHVybiBydW5fYXBwbGV0X21haW4oYXJndiwgdGVzdF9tYWluKTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9lY2hvKGNoYXIgKiphcmd2KQoreworCXJldHVybiBydW5fYXBwbGV0X21haW4oYXJndiwgZWNob19tYWluKTsKK30KKworI2lmIEVOQUJMRV9QUklOVEYKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fcHJpbnRmKGNoYXIgKiphcmd2KQoreworCXJldHVybiBydW5fYXBwbGV0X21haW4oYXJndiwgcHJpbnRmX21haW4pOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyICoqc2tpcF9kYXNoX2Rhc2goY2hhciAqKmFyZ3YpCit7CisJYXJndisrOworCWlmIChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0gPT0gJy0nICYmIGFyZ3ZbMF1bMV0gPT0gJy0nICYmIGFyZ3ZbMF1bMl0gPT0gJ1wwJykKKwkJYXJndisrOworCXJldHVybiBhcmd2OworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2V2YWwoY2hhciAqKmFyZ3YpCit7CisJaW50IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCisJYXJndiA9IHNraXBfZGFzaF9kYXNoKGFyZ3YpOworCWlmICgqYXJndikgeworCQljaGFyICpzdHIgPSBleHBhbmRfc3RydmVjX3RvX3N0cmluZyhhcmd2KTsKKwkJLyogYmFzaDoKKwkJICogZXZhbCAiZWNobyBIaTsgZG9uZSIgKCJkb25lIiBpcyBzeW50YXggZXJyb3IpOgorCQkgKiAiZWNobyBIaSIgd2lsbCBub3QgZXhlY3V0ZSB0b28uCisJCSAqLworCQlwYXJzZV9hbmRfcnVuX3N0cmluZyhzdHIpOworCQlmcmVlKHN0cik7CisJCXJjb2RlID0gRy5sYXN0X2V4aXRjb2RlOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fY2QoY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqbmV3ZGlyOworCisJYXJndiA9IHNraXBfZGFzaF9kYXNoKGFyZ3YpOworCW5ld2RpciA9IGFyZ3ZbMF07CisJaWYgKG5ld2RpciA9PSBOVUxMKSB7CisJCS8qIGJhc2ggZG9lcyBub3RoaW5nIChleGl0Y29kZSAwKSBpZiBIT01FIGlzICIiOyBpZiBpdCdzIHVuc2V0LAorCQkgKiBiYXNoIHNheXMgImJhc2g6IGNkOiBIT01FIG5vdCBzZXQiIGFuZCBkb2VzIG5vdGhpbmcKKwkJICogKGV4aXRjb2RlIDEpCisJCSAqLworCQljb25zdCBjaGFyICpob21lID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSE9NRSIpOworCQluZXdkaXIgPSBob21lID8gaG9tZSA6ICIvIjsKKwl9CisJaWYgKGNoZGlyKG5ld2RpcikpIHsKKwkJLyogTWltaWMgYmFzaCBtZXNzYWdlIGV4YWN0bHkgKi8KKwkJYmJfcGVycm9yX21zZygiY2Q6ICVzIiwgbmV3ZGlyKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJLyogUmVhZCBjdXJyZW50IGRpciAoZ2V0X2N3ZCgxKSBpcyBpbnNpZGUpIGFuZCBzZXQgUFdELgorCSAqIE5vdGU6IGRvIG5vdCBlbmZvcmNlIGV4cG9ydGluZy4gSWYgUFdEIHdhcyB1bnNldCBvciB1bmV4cG9ydGVkLAorCSAqIHNldCBpdCBhZ2FpbiwgYnV0IGRvIG5vdCBleHBvcnQuIGJhc2ggZG9lcyB0aGUgc2FtZS4KKwkgKi8KKwlzZXRfcHdkX3ZhcigvKmV4cDoqLyAwKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2V4ZWMoY2hhciAqKmFyZ3YpCit7CisJYXJndiA9IHNraXBfZGFzaF9kYXNoKGFyZ3YpOworCWlmIChhcmd2WzBdID09IE5VTEwpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qIGJhc2ggZG9lcyB0aGlzICovCisKKwkvKiBDYXJlZnVsOiB3ZSBjYW4gZW5kIHVwIGhlcmUgYWZ0ZXIgW3ZdZm9yay4gRG8gbm90IHJlc3RvcmUKKwkgKiB0dHkgcGdycCB0aGVuLCBvbmx5IHRvcC1sZXZlbCBzaGVsbCBwcm9jZXNzIGRvZXMgdGhhdCAqLworCWlmIChHX3NhdmVkX3R0eV9wZ3JwICYmIGdldHBpZCgpID09IEcucm9vdF9waWQpCisJCXRjc2V0cGdycChHX2ludGVyYWN0aXZlX2ZkLCBHX3NhdmVkX3R0eV9wZ3JwKTsKKworCS8qIFRPRE86IGlmIGV4ZWMgZmFpbHMsIGJhc2ggZG9lcyBOT1QgZXhpdCEgV2UgZG8uCisJICogV2UnbGwgbmVlZCB0byB1bmRvIHRyYXAgY2xlYW51cCAoaXQncyBpbnNpZGUgZXhlY3ZwX29yX2RpZSkKKwkgKiBhbmQgdGNzZXRwZ3JwLCBhbmQgdGhpcyBpcyBpbmhlcmVudGx5IHJhY3kuCisJICovCisJZXhlY3ZwX29yX2RpZShhcmd2KTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9leGl0KGNoYXIgKiphcmd2KQoreworCWRlYnVnX3ByaW50Zl9leGVjKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBpbnRlcmFjdGl2ZSBiYXNoOgorCSAqICMgdHJhcCAiZWNobyBFRUUiIEVYSVQKKwkgKiAjIGV4aXQKKwkgKiBleGl0CisJICogVGhlcmUgYXJlIHN0b3BwZWQgam9icy4KKwkgKiAoaWYgdGhlcmUgYXJlIF9zdG9wcGVkXyBqb2JzLCBydW5uaW5nIG9uZXMgZG9uJ3QgY291bnQpCisJICogIyBleGl0CisJICogZXhpdAorCSAjIEVFRSAodGhlbiBiYXNoIGV4aXRzKQorCSAqCisJICogVE9ETzogd2UgY2FuIHVzZSBHLmV4aXRpbmcgPSAtMSBhcyBpbmRpY2F0b3IgImxhc3QgY21kIHdhcyBleGl0IgorCSAqLworCisJLyogbm90ZTogRVhJVCB0cmFwIGlzIHJ1biBieSBodXNoX2V4aXQgKi8KKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKwkJaHVzaF9leGl0KEcubGFzdF9leGl0Y29kZSk7CisJLyogbWltaWMgYmFzaDogZXhpdCAxMjNhYmMgPT0gZXhpdCAyNTUgKyBlcnJvciBtc2cgKi8KKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyNTU7CisJLyogYmFzaDogZXhpdCAtMiA9PSBleGl0IDI1NCwgbm8gZXJyb3IgbXNnICovCisJaHVzaF9leGl0KHhhdG9pKGFyZ3ZbMF0pICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2VzY2FwZWQoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoKnMgPT0gJ1wnJykKKwkJZ290byBzcXVvdGU7CisJZG8geworCQljb25zdCBjaGFyICpwID0gc3RyY2hybnVsKHMsICdcJycpOworCQkvKiBwcmludCAneHh4eCcsIHBvc3NpYmx5IGp1c3QgJycgKi8KKwkJcHJpbnRmKCInJS4qcyciLCAoaW50KShwIC0gcyksIHMpOworCQlpZiAoKnAgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlzID0gcDsKKyBzcXVvdGU6CisJCS8qIHMgcG9pbnRzIHRvICc7IHByaW50ICInJycuLi4nJyciICovCisJCXB1dGNoYXIoJyInKTsKKwkJZG8gcHV0Y2hhcignXCcnKTsgd2hpbGUgKCorK3MgPT0gJ1wnJyk7CisJCXB1dGNoYXIoJyInKTsKKwl9IHdoaWxlICgqcyk7Cit9CisKKyNpZiAhRU5BQkxFX0hVU0hfTE9DQUwKKyNkZWZpbmUgaGVscGVyX2V4cG9ydF9sb2NhbChhcmd2LCBleHAsIGx2bCkgXAorCWhlbHBlcl9leHBvcnRfbG9jYWwoYXJndiwgZXhwKQorI2VuZGlmCitzdGF0aWMgdm9pZCBoZWxwZXJfZXhwb3J0X2xvY2FsKGNoYXIgKiphcmd2LCBpbnQgZXhwLCBpbnQgbHZsKQoreworCWRvIHsKKwkJY2hhciAqbmFtZSA9ICphcmd2OworCQljaGFyICpuYW1lX2VuZCA9IHN0cmNocm51bChuYW1lLCAnPScpOworCisJCS8qIFNvIGZhciB3ZSBkbyBub3QgY2hlY2sgdGhhdCBuYW1lIGlzIHZhbGlkIChUT0RPPykgKi8KKworCQlpZiAoKm5hbWVfZW5kID09ICdcMCcpIHsKKwkJCXN0cnVjdCB2YXJpYWJsZSAqdmFyLCAqKnZwcDsKKworCQkJdnBwID0gZ2V0X3B0cl90b19sb2NhbF92YXIobmFtZSwgbmFtZV9lbmQgLSBuYW1lKTsKKwkJCXZhciA9IHZwcCA/ICp2cHAgOiBOVUxMOworCisJCQlpZiAoZXhwID09IC0xKSB7IC8qIHVuZXhwb3J0aW5nPyAqLworCQkJCS8qIGV4cG9ydCAtbiBOQU1FICh3aXRob3V0ID1WQUxVRSkgKi8KKwkJCQlpZiAodmFyKSB7CisJCQkJCXZhci0+ZmxnX2V4cG9ydCA9IDA7CisJCQkJCWRlYnVnX3ByaW50Zl9lbnYoIiVzOiB1bnNldGVudiAnJXMnXG4iLCBfX2Z1bmNfXywgbmFtZSk7CisJCQkJCXVuc2V0ZW52KG5hbWUpOworCQkJCX0gLyogZWxzZTogZXhwb3J0IC1uIE5PVF9FWElTVElOR19WQVI6IG5vLW9wICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZXhwID09IDEpIHsgLyogZXhwb3J0aW5nPyAqLworCQkJCS8qIGV4cG9ydCBOQU1FICh3aXRob3V0ID1WQUxVRSkgKi8KKwkJCQlpZiAodmFyKSB7CisJCQkJCXZhci0+ZmxnX2V4cG9ydCA9IDE7CisJCQkJCWRlYnVnX3ByaW50Zl9lbnYoIiVzOiBwdXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIHZhci0+dmFyc3RyKTsKKwkJCQkJcHV0ZW52KHZhci0+dmFyc3RyKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLyogRXhwb3J0aW5nIG5vbi1leGlzdGluZyB2YXJpYWJsZS4KKwkJCSAqIGJhc2ggZG9lcyBub3QgcHV0IGl0IGluIGVudmlyb25tZW50LAorCQkJICogYnV0IHJlbWVtYmVycyB0aGF0IGl0IGlzIGV4cG9ydGVkLAorCQkJICogYW5kIGRvZXMgcHV0IGl0IGluIGVudiB3aGVuIGl0IGlzIHNldCBsYXRlci4KKwkJCSAqIFdlIGp1c3Qgc2V0IGl0IHRvICIiIGFuZCBleHBvcnQuICovCisJCQkvKiBPciwgaXQncyAibG9jYWwgTkFNRSIgKHdpdGhvdXQgPVZBTFVFKS4KKwkJCSAqIGJhc2ggc2V0cyB0aGUgdmFsdWUgdG8gIiIuICovCisJCQluYW1lID0geGFzcHJpbnRmKCIlcz0iLCBuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIChVbilleHBvcnRpbmcvbWFraW5nIGxvY2FsIE5BTUU9VkFMVUUgKi8KKwkJCW5hbWUgPSB4c3RyZHVwKG5hbWUpOworCQl9CisJCXNldF9sb2NhbF92YXIobmFtZSwgLypleHA6Ki8gZXhwLCAvKmx2bDoqLyBsdmwsIC8qcm86Ki8gMCk7CisJfSB3aGlsZSAoKisrYXJndik7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fZXhwb3J0KGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdF91bmV4cG9ydDsKKworI2lmIEVOQUJMRV9IVVNIX0VYUE9SVF9OCisJLyogIiEiOiBkbyBub3QgYWJvcnQgb24gZXJyb3JzICovCisJb3B0X3VuZXhwb3J0ID0gZ2V0b3B0MzIoYXJndiwgIiFuIik7CisJaWYgKG9wdF91bmV4cG9ydCA9PSAodWludDMyX3QpLTEpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJYXJndiArPSBvcHRpbmQ7CisjZWxzZQorCW9wdF91bmV4cG9ydCA9IDA7CisJYXJndisrOworI2VuZGlmCisKKwlpZiAoYXJndlswXSA9PSBOVUxMKSB7CisJCWNoYXIgKiplID0gZW52aXJvbjsKKwkJaWYgKGUpIHsKKwkJCXdoaWxlICgqZSkgeworI2lmIDAKKwkJCQlwdXRzKCplKyspOworI2Vsc2UKKwkJCQkvKiBhc2ggZW1pdHM6IGV4cG9ydCBWQVI9J1ZBTCcKKwkJCQkgKiBiYXNoOiBkZWNsYXJlIC14IFZBUj0iVkFMIgorCQkJCSAqIHdlIGZvbGxvdyBhc2ggZXhhbXBsZSAqLworCQkJCWNvbnN0IGNoYXIgKnMgPSAqZSsrOworCQkJCWNvbnN0IGNoYXIgKnAgPSBzdHJjaHIocywgJz0nKTsKKworCQkJCWlmICghcCkgLyogd3RmPyB0YWtlIG5leHQgdmFyaWFibGUgKi8KKwkJCQkJY29udGludWU7CisJCQkJLyogZXhwb3J0IHZhcj0gKi8KKwkJCQlwcmludGYoImV4cG9ydCAlLipzIiwgKGludCkocCAtIHMpICsgMSwgcyk7CisJCQkJcHJpbnRfZXNjYXBlZChwICsgMSk7CisJCQkJcHV0Y2hhcignXG4nKTsKKyNlbmRpZgorCQkJfQorCQkJLypmZmx1c2hfYWxsKCk7IC0gZG9uZSBhZnRlciBlYWNoIGJ1aWx0aW4gYW55d2F5ICovCisJCX0KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwloZWxwZXJfZXhwb3J0X2xvY2FsKGFyZ3YsIChvcHRfdW5leHBvcnQgPyAtMSA6IDEpLCAwKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9MT0NBTAorc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9sb2NhbChjaGFyICoqYXJndikKK3sKKwlpZiAoRy5mdW5jX25lc3RfbGV2ZWwgPT0gMCkgeworCQliYl9lcnJvcl9tc2coIiVzOiBub3QgaW4gYSBmdW5jdGlvbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOyAvKiBiYXNoIGNvbXBhdCAqLworCX0KKwloZWxwZXJfZXhwb3J0X2xvY2FsKGFyZ3YsIDAsIEcuZnVuY19uZXN0X2xldmVsKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdHJhcChjaGFyICoqYXJndikKK3sKKwlpbnQgc2lnOworCWNoYXIgKm5ld19jbWQ7CisKKwlpZiAoIUcudHJhcHMpCisJCUcudHJhcHMgPSB4emFsbG9jKHNpemVvZihHLnRyYXBzWzBdKSAqIE5TSUcpOworCisJYXJndisrOworCWlmICghKmFyZ3YpIHsKKwkJaW50IGk7CisJCS8qIE5vIGFyZ3M6IHByaW50IGFsbCB0cmFwcGVkICovCisJCWZvciAoaSA9IDA7IGkgPCBOU0lHOyArK2kpIHsKKwkJCWlmIChHLnRyYXBzW2ldKSB7CisJCQkJcHJpbnRmKCJ0cmFwIC0tICIpOworCQkJCXByaW50X2VzY2FwZWQoRy50cmFwc1tpXSk7CisJCQkJLyogbm90ZTogYmFzaCBhZGRzICJTSUciLCBidXQgb25seSBpZiBpbnZva2VkCisJCQkJICogYXMgImJhc2giLiBJZiBjYWxsZWQgYXMgInNoIiwgb3IgaWYgc2V0IC1vIHBvc2l4LAorCQkJCSAqIHRoZW4gaXQgcHJpbnRzIHNob3J0IHNpZ25hbCBuYW1lcy4KKwkJCQkgKiBXZSBhcmUgcHJpbnRpbmcgc2hvcnQgbmFtZXM6ICovCisJCQkJcHJpbnRmKCIgJXNcbiIsIGdldF9zaWduYW1lKGkpKTsKKwkJCX0KKwkJfQorCQkvKmZmbHVzaF9hbGwoKTsgLSBkb25lIGFmdGVyIGVhY2ggYnVpbHRpbiBhbnl3YXkgKi8KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwluZXdfY21kID0gTlVMTDsKKwkvKiBJZiBmaXJzdCBhcmcgaXMgYSBudW1iZXI6IHJlc2V0IGFsbCBzcGVjaWZpZWQgc2lnbmFscyAqLworCXNpZyA9IGJiX3N0cnRvdSgqYXJndiwgTlVMTCwgMTApOworCWlmIChlcnJubyA9PSAwKSB7CisJCWludCByZXQ7CisgcHJvY2Vzc19zaWdfbGlzdDoKKwkJcmV0ID0gRVhJVF9TVUNDRVNTOworCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCXNpZ2hhbmRsZXJfdCBoYW5kbGVyOworCisJCQlzaWcgPSBnZXRfc2lnbnVtKCphcmd2KyspOworCQkJaWYgKHNpZyA8IDAgfHwgc2lnID49IE5TSUcpIHsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJLyogTWltaWMgYmFzaCBtZXNzYWdlIGV4YWN0bHkgKi8KKwkJCQliYl9wZXJyb3JfbXNnKCJ0cmFwOiAlczogaW52YWxpZCBzaWduYWwgc3BlY2lmaWNhdGlvbiIsIGFyZ3ZbLTFdKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZnJlZShHLnRyYXBzW3NpZ10pOworCQkJRy50cmFwc1tzaWddID0geHN0cmR1cChuZXdfY21kKTsKKworCQkJZGVidWdfcHJpbnRmKCJ0cmFwOiBzZXR0aW5nIFNJRyVzICglaSkgdG8gJyVzJ1xuIiwKKwkJCQlnZXRfc2lnbmFtZShzaWcpLCBzaWcsIEcudHJhcHNbc2lnXSk7CisKKwkJCS8qIFRoZXJlIGlzIG5vIHNpZ25hbCBmb3IgMCAoRVhJVCkgKi8KKwkJCWlmIChzaWcgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKG5ld19jbWQpCisJCQkJaGFuZGxlciA9IChuZXdfY21kWzBdID8gcmVjb3JkX3BlbmRpbmdfc2lnbm8gOiBTSUdfSUdOKTsKKwkJCWVsc2UKKwkJCQkvKiBXZSBhcmUgcmVtb3ZpbmcgdHJhcCBoYW5kbGVyICovCisJCQkJaGFuZGxlciA9IHBpY2tfc2lnaGFuZGxlcihzaWcpOworCQkJaW5zdGFsbF9zaWdoYW5kbGVyKHNpZywgaGFuZGxlcik7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWFyZ3ZbMV0pIHsgLyogbm8gc2Vjb25kIGFyZyAqLworCQliYl9lcnJvcl9tc2coInRyYXA6IGludmFsaWQgYXJndW1lbnRzIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJLyogRmlyc3QgYXJnIGlzICItIjogcmVzZXQgYWxsIHNwZWNpZmllZCB0byBkZWZhdWx0ICovCisJLyogRmlyc3QgYXJnIGlzICItLSI6IHNraXAgaXQsIHRoZSByZXN0IGlzICJoYW5kbGVyIFNJR3MuLi4iICovCisJLyogRXZlcnl0aGluZyBlbHNlOiBzZXQgYXJnIGFzIHNpZ25hbCBoYW5kbGVyCisJICogKGluY2x1ZGVzICIiIGNhc2UsIHdoaWNoIGlnbm9yZXMgc2lnbmFsKSAqLworCWlmIChhcmd2WzBdWzBdID09ICctJykgeworCQlpZiAoYXJndlswXVsxXSA9PSAnXDAnKSB7IC8qICItIiAqLworCQkJLyogbmV3X2NtZCByZW1haW5zIE5VTEw6ICJyZXNldCB0aGVzZSBzaWdzIiAqLworCQkJZ290byByZXNldF90cmFwczsKKwkJfQorCQlpZiAoYXJndlswXVsxXSA9PSAnLScgJiYgYXJndlswXVsyXSA9PSAnXDAnKSB7IC8qICItLSIgKi8KKwkJCWFyZ3YrKzsKKwkJfQorCQkvKiBlbHNlOiAiLXNvbWV0aGluZyIsIG5vIHNwZWNpYWwgbWVhbmluZyAqLworCX0KKwluZXdfY21kID0gKmFyZ3Y7CisgcmVzZXRfdHJhcHM6CisJYXJndisrOworCWdvdG8gcHJvY2Vzc19zaWdfbGlzdDsKK30KKworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvdHlwZS5odG1sICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3R5cGUoY2hhciAqKmFyZ3YpCit7CisJaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKworCXdoaWxlICgqKythcmd2KSB7CisJCWNvbnN0IGNoYXIgKnR5cGU7CisJCWNoYXIgKnBhdGggPSBOVUxMOworCisJCWlmICgwKSB7fSAvKiBtYWtlIGNvbmRpdGlvbmFsIGNvbXBpbGUgZWFzaWVyIGJlbG93ICovCisJCS8qZWxzZSBpZiAoZmluZF9hbGlhcygqYXJndikpCisJCQl0eXBlID0gImFuIGFsaWFzIjsqLworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQllbHNlIGlmIChmaW5kX2Z1bmN0aW9uKCphcmd2KSkKKwkJCXR5cGUgPSAiYSBmdW5jdGlvbiI7CisjZW5kaWYKKwkJZWxzZSBpZiAoZmluZF9idWlsdGluKCphcmd2KSkKKwkJCXR5cGUgPSAiYSBzaGVsbCBidWlsdGluIjsKKwkJZWxzZSBpZiAoKHBhdGggPSBmaW5kX2luX3BhdGgoKmFyZ3YpKSAhPSBOVUxMKQorCQkJdHlwZSA9IHBhdGg7CisJCWVsc2UgeworCQkJYmJfZXJyb3JfbXNnKCJ0eXBlOiAlczogbm90IGZvdW5kIiwgKmFyZ3YpOworCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKworCQlwcmludGYoIiVzIGlzICVzXG4iLCAqYXJndiwgdHlwZSk7CisJCWZyZWUocGF0aCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorLyogYnVpbHQtaW4gJ2ZnJyBhbmQgJ2JnJyBoYW5kbGVyICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2ZnX2JnKGNoYXIgKiphcmd2KQoreworCWludCBpLCBqb2JudW07CisJc3RydWN0IHBpcGUgKnBpOworCisJaWYgKCFHX2ludGVyYWN0aXZlX2ZkKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJLyogSWYgdGhleSBnYXZlIHVzIG5vIGFyZ3MsIGFzc3VtZSB0aGV5IHdhbnQgdGhlIGxhc3QgYmFja2dyb3VuZGVkIHRhc2sgKi8KKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJZm9yIChwaSA9IEcuam9iX2xpc3Q7IHBpOyBwaSA9IHBpLT5uZXh0KSB7CisJCQlpZiAocGktPmpvYmlkID09IEcubGFzdF9qb2JpZCkgeworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJYmJfZXJyb3JfbXNnKCIlczogbm8gY3VycmVudCBqb2IiLCBhcmd2WzBdKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJaWYgKHNzY2FuZihhcmd2WzFdLCAiJSUlZCIsICZqb2JudW0pICE9IDEpIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogYmFkIGFyZ3VtZW50ICclcyciLCBhcmd2WzBdLCBhcmd2WzFdKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJZm9yIChwaSA9IEcuam9iX2xpc3Q7IHBpOyBwaSA9IHBpLT5uZXh0KSB7CisJCWlmIChwaS0+am9iaWQgPT0gam9ibnVtKSB7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCWJiX2Vycm9yX21zZygiJXM6ICVkOiBubyBzdWNoIGpvYiIsIGFyZ3ZbMF0sIGpvYm51bSk7CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyBmb3VuZDoKKwkvKiBUT0RPOiBiYXNoIHByaW50cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIG9mIGpvYiBiZWluZyBmb3JlZ3JvdW5kZWQgKGxpa2UgInNsZWVwIDEgfCBjYXQiKSAqLworCWlmIChhcmd2WzBdWzBdID09ICdmJyAmJiBHX3NhdmVkX3R0eV9wZ3JwKSB7CisJCS8qIFB1dCB0aGUgam9iIGludG8gdGhlIGZvcmVncm91bmQuICAqLworCQl0Y3NldHBncnAoR19pbnRlcmFjdGl2ZV9mZCwgcGktPnBncnApOworCX0KKworCS8qIFJlc3RhcnQgdGhlIHByb2Nlc3NlcyBpbiB0aGUgam9iICovCisJZGVidWdfcHJpbnRmX2pvYnMoInJldml2aW5nICVkIHByb2NzLCBwZ3JwICVkXG4iLCBwaS0+bnVtX2NtZHMsIHBpLT5wZ3JwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGktPm51bV9jbWRzOyBpKyspIHsKKwkJZGVidWdfcHJpbnRmX2pvYnMoInJldml2aW5nIHBpZCAlZFxuIiwgcGktPmNtZHNbaV0ucGlkKTsKKwkJcGktPmNtZHNbaV0uaXNfc3RvcHBlZCA9IDA7CisJfQorCXBpLT5zdG9wcGVkX2NtZHMgPSAwOworCisJaSA9IGtpbGwoLSBwaS0+cGdycCwgU0lHQ09OVCk7CisJaWYgKGkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFU1JDSCkgeworCQkJZGVsZXRlX2ZpbmlzaGVkX2JnX2pvYihwaSk7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCWJiX3BlcnJvcl9tc2coImtpbGwgKFNJR0NPTlQpIik7CisJfQorCisJaWYgKGFyZ3ZbMF1bMF0gPT0gJ2YnKSB7CisJCXJlbW92ZV9iZ19qb2IocGkpOworCQlyZXR1cm4gY2hlY2tqb2JzX2FuZF9mZ19zaGVsbChwaSk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0hFTFAKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5faGVscChjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKng7CisKKwlwcmludGYoCisJCSJCdWlsdC1pbiBjb21tYW5kczpcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yICh4ID0gYmx0aW5zMTsgeCAhPSAmYmx0aW5zMVtBUlJBWV9TSVpFKGJsdGluczEpXTsgeCsrKSB7CisJCWlmICh4LT5iX2Rlc2NyKQorCQkJcHJpbnRmKCIlLTEwcyVzXG4iLCB4LT5iX2NtZCwgeC0+Yl9kZXNjcik7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0hVU0hfSk9CCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2pvYnMoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBwaXBlICpqb2I7CisJY29uc3QgY2hhciAqc3RhdHVzX3N0cmluZzsKKworCWZvciAoam9iID0gRy5qb2JfbGlzdDsgam9iOyBqb2IgPSBqb2ItPm5leHQpIHsKKwkJaWYgKGpvYi0+YWxpdmVfY21kcyA9PSBqb2ItPnN0b3BwZWRfY21kcykKKwkJCXN0YXR1c19zdHJpbmcgPSAiU3RvcHBlZCI7CisJCWVsc2UKKwkJCXN0YXR1c19zdHJpbmcgPSAiUnVubmluZyI7CisKKwkJcHJpbnRmKEpPQl9TVEFUVVNfRk9STUFULCBqb2ItPmpvYmlkLCBzdGF0dXNfc3RyaW5nLCBqb2ItPmNtZHRleHQpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmCisKKyNpZiBIVVNIX0RFQlVHCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX21lbWxlYWsoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXZvaWQgKnA7CisJdW5zaWduZWQgbG9uZyBsOworCisjIGlmZGVmIE1fVFJJTV9USFJFU0hPTEQKKwkvKiBPcHRpb25hbC4gUmVkdWNlcyBwcm9iYWJpbGl0eSBvZiBmYWxzZSBwb3NpdGl2ZXMgKi8KKwltYWxsb2NfdHJpbSgwKTsKKyMgZW5kaWYKKwkvKiBDcnVkZSBhdHRlbXB0IHRvIGZpbmQgd2hlcmUgImZyZWUgbWVtb3J5IiBzdGFydHMsCisJICogc2FucyBmcmFnbWVudGF0aW9uLiAqLworCXAgPSBtYWxsb2MoMjQwKTsKKwlsID0gKHVuc2lnbmVkIGxvbmcpcDsKKwlmcmVlKHApOworCXAgPSBtYWxsb2MoMzQwMCk7CisJaWYgKGwgPCAodW5zaWduZWQgbG9uZylwKSBsID0gKHVuc2lnbmVkIGxvbmcpcDsKKwlmcmVlKHApOworCisJaWYgKCFHLm1lbWxlYWtfdmFsdWUpCisJCUcubWVtbGVha192YWx1ZSA9IGw7CisKKwlsIC09IEcubWVtbGVha192YWx1ZTsKKwlpZiAoKGxvbmcpbCA8IDApCisJCWwgPSAwOworCWwgLz0gMTAyNDsKKwlpZiAobCA+IDEyNykKKwkJbCA9IDEyNzsKKworCS8qIEV4aXRjb2RlIGlzICJob3cgbWFueSBraWxvYnl0ZXMgd2UgbGVha2VkIHNpbmNlIDFzdCBjYWxsIiAqLworCXJldHVybiBsOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fcHdkKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlwdXRzKGdldF9jd2QoMCkpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8qIEludGVycnVwdGliaWxpdHkgb2YgcmVhZCBidWlsdGluIGluIGJhc2gKKyAqICh0ZXN0ZWQgb24gYmFzaC00LjIuOCBieSBzZW5kaW5nIHNpZ25hbHMgKG5vdCBieSBeQykpOgorICoKKyAqIEVtcHR5IHRyYXAgbWFrZXMgcmVhZCBpZ25vcmUgY29ycmVzcG9uZGluZyBzaWduYWwsIGZvciBhbnkgc2lnbmFsLgorICoKKyAqIFNJR0lOVDoKKyAqIC0gdGVybWluYXRlcyBub24taW50ZXJhY3RpdmUgc2hlbGw7CisgKiAtIGludGVycnVwdHMgcmVhZCBpbiBpbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIGlmIGl0IGhhcyBub24tZW1wdHkgdHJhcDoKKyAqIC0gZXhlY3V0ZXMgdHJhcCBhbmQgcmV0dXJucyB0byBjb21tYW5kIHByb21wdCBpbiBpbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIC0gZXhlY3V0ZXMgdHJhcCBhbmQgcmV0dXJucyB0byByZWFkIGluIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIFNJR1RFUk06CisgKiAtIGlzIGlnbm9yZWQgKGRvZXMgbm90IGludGVycnVwdCkgcmVhZCBpbiBpbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIC0gdGVybWluYXRlcyBub24taW50ZXJhY3RpdmUgc2hlbGw7CisgKiBpZiBpdCBoYXMgbm9uLWVtcHR5IHRyYXA6CisgKiAtIGV4ZWN1dGVzIHRyYXAgYW5kIHJldHVybnMgdG8gcmVhZDsKKyAqIFNJR0hVUDoKKyAqIC0gdGVybWluYXRlcyBzaGVsbCAocmVnYXJkbGVzcyBvZiBpbnRlcmFjdGl2aXR5KTsKKyAqIGlmIGl0IGhhcyBub24tZW1wdHkgdHJhcDoKKyAqIC0gZXhlY3V0ZXMgdHJhcCBhbmQgcmV0dXJucyB0byByZWFkOworICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3JlYWQoY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcjsKKwljaGFyICpvcHRfbiA9IE5VTEw7CisJY2hhciAqb3B0X3AgPSBOVUxMOworCWNoYXIgKm9wdF90ID0gTlVMTDsKKwljaGFyICpvcHRfdSA9IE5VTEw7CisJY29uc3QgY2hhciAqaWZzOworCWludCByZWFkX2ZsYWdzOworCisJLyogIiEiOiBkbyBub3QgYWJvcnQgb24gZXJyb3JzLgorCSAqIE9wdGlvbiBzdHJpbmcgbXVzdCBzdGFydCB3aXRoICJzciIgdG8gbWF0Y2ggQlVJTFRJTl9SRUFEX3h4eAorCSAqLworCXJlYWRfZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiIXNybjpwOnQ6dToiLCAmb3B0X24sICZvcHRfcCwgJm9wdF90LCAmb3B0X3UpOworCWlmIChyZWFkX2ZsYWdzID09ICh1aW50MzJfdCktMSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZnMgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJJRlMiKTsgLyogY2FuIGJlIE5VTEwgKi8KKworIGFnYWluOgorCXIgPSBzaGVsbF9idWlsdGluX3JlYWQoc2V0X2xvY2FsX3Zhcl9mcm9tX2hhbHZlcywKKwkJYXJndiwKKwkJaWZzLAorCQlyZWFkX2ZsYWdzLAorCQlvcHRfbiwKKwkJb3B0X3AsCisJCW9wdF90LAorCQlvcHRfdQorCSk7CisKKwlpZiAoKHVpbnRwdHJfdClyID09IDEgJiYgZXJybm8gPT0gRUlOVFIpIHsKKwkJdW5zaWduZWQgc2lnID0gY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQlpZiAoc2lnICYmIHNpZyAhPSBTSUdJTlQpCisJCQlnb3RvIGFnYWluOworCX0KKworCWlmICgodWludHB0cl90KXIgPiAxKSB7CisJCWJiX2Vycm9yX21zZygiJXMiLCByKTsKKwkJciA9IChjaGFyKikodWludHB0cl90KTE7CisJfQorCisJcmV0dXJuICh1aW50cHRyX3QpcjsKK30KKworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjc2V0CisgKiBidWlsdC1pbiAnc2V0JyBoYW5kbGVyCisgKiBTVVN2MyBzYXlzOgorICogc2V0IFstYWJDZWZobW51dnhdIFstbyBvcHRpb25dIFthcmd1bWVudC4uLl0KKyAqIHNldCBbK2FiQ2VmaG1udXZ4XSBbK28gb3B0aW9uXSBbYXJndW1lbnQuLi5dCisgKiBzZXQgLS0gW2FyZ3VtZW50Li4uXQorICogc2V0IC1vCisgKiBzZXQgK28KKyAqIEltcGxlbWVudGF0aW9ucyBzaGFsbCBzdXBwb3J0IHRoZSBvcHRpb25zIGluIGJvdGggdGhlaXIgaHlwaGVuIGFuZAorICogcGx1cy1zaWduIGZvcm1zLiBUaGVzZSBvcHRpb25zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBvcHRpb25zIHRvIHNoLgorICogRXhhbXBsZXM6CisgKiBXcml0ZSBvdXQgYWxsIHZhcmlhYmxlcyBhbmQgdGhlaXIgdmFsdWVzOiBzZXQKKyAqIFNldCAkMSwgJDIsIGFuZCAkMyBhbmQgc2V0ICIkIyIgdG8gMzogc2V0IGMgYSBiCisgKiBUdXJuIG9uIHRoZSAteCBhbmQgLXYgb3B0aW9uczogc2V0IC14dgorICogVW5zZXQgYWxsIHBvc2l0aW9uYWwgcGFyYW1ldGVyczogc2V0IC0tCisgKiBTZXQgJDEgdG8gdGhlIHZhbHVlIG9mIHgsIGV2ZW4gaWYgaXQgYmVnaW5zIHdpdGggJy0nIG9yICcrJzogc2V0IC0tICIkeCIKKyAqIFNldCB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBleHBhbnNpb24gb2YgeCwgZXZlbiBpZiB4IGV4cGFuZHMKKyAqIHdpdGggYSBsZWFkaW5nICctJyBvciAnKyc6IHNldCAtLSAkeAorICoKKyAqIFNvIGZhciwgd2Ugb25seSBzdXBwb3J0ICJzZXQgLS0gW2FyZ3VtZW50Li4uXSIgYW5kIHNvbWUgb2YgdGhlIHNob3J0IG5hbWVzLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3NldChjaGFyICoqYXJndikKK3sKKwlpbnQgbjsKKwljaGFyICoqcHAsICoqZ19hcmd2OworCWNoYXIgKmFyZyA9ICorK2FyZ3Y7CisKKwlpZiAoYXJnID09IE5VTEwpIHsKKwkJc3RydWN0IHZhcmlhYmxlICplOworCQlmb3IgKGUgPSBHLnRvcF92YXI7IGU7IGUgPSBlLT5uZXh0KQorCQkJcHV0cyhlLT52YXJzdHIpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWRvIHsKKwkJaWYgKHN0cmNtcChhcmcsICItLSIpID09IDApIHsKKwkJCSsrYXJndjsKKwkJCWdvdG8gc2V0X2FyZ3Y7CisJCX0KKwkJaWYgKGFyZ1swXSAhPSAnKycgJiYgYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlmb3IgKG4gPSAxOyBhcmdbbl07ICsrbikgeworCQkJaWYgKHNldF9tb2RlKChhcmdbMF0gPT0gJy0nKSwgYXJnW25dLCBhcmd2WzFdKSkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKGFyZ1tuXSA9PSAnbycgJiYgYXJndlsxXSkKKwkJCQlhcmd2Kys7CisJCX0KKwl9IHdoaWxlICgoYXJnID0gKisrYXJndikgIT0gTlVMTCk7CisJLyogTm93IGFyZ3ZbMF0gaXMgMXN0IGFyZ3VtZW50ICovCisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7Cisgc2V0X2FyZ3Y6CisKKwkvKiBOQjogRy5nbG9iYWxfYXJndlswXSAoJDApIGlzIG5ldmVyIGZyZWVkL2NoYW5nZWQgKi8KKwlnX2FyZ3YgPSBHLmdsb2JhbF9hcmd2OworCWlmIChHLmdsb2JhbF9hcmdzX21hbGxvY2VkKSB7CisJCXBwID0gZ19hcmd2OworCQl3aGlsZSAoKisrcHApCisJCQlmcmVlKCpwcCk7CisJCWdfYXJndlsxXSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJRy5nbG9iYWxfYXJnc19tYWxsb2NlZCA9IDE7CisJCXBwID0geHphbGxvYyhzaXplb2YocHBbMF0pICogMik7CisJCXBwWzBdID0gZ19hcmd2WzBdOyAvKiByZXRhaW4gJDAgKi8KKwkJZ19hcmd2ID0gcHA7CisJfQorCS8qIFRoaXMgcmVhbGxvYydzIEcuZ2xvYmFsX2FyZ3YgKi8KKwlHLmdsb2JhbF9hcmd2ID0gcHAgPSBhZGRfc3RyaW5nc190b19zdHJpbmdzKGdfYXJndiwgYXJndiwgLypkdXA6Ki8gMSk7CisKKwluID0gMTsKKwl3aGlsZSAoKisrcHApCisJCW4rKzsKKwlHLmdsb2JhbF9hcmdjID0gbjsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwkvKiBOb3RoaW5nIGtub3duLCBzbyBhYm9ydCAqLworIGVycm9yOgorCWJiX2Vycm9yX21zZygic2V0OiAlczogaW52YWxpZCBvcHRpb24iLCBhcmcpOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fc2hpZnQoY2hhciAqKmFyZ3YpCit7CisJaW50IG4gPSAxOworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwlpZiAoYXJndlswXSkgeworCQluID0gYXRvaShhcmd2WzBdKTsKKwl9CisJaWYgKG4gPj0gMCAmJiBuIDwgRy5nbG9iYWxfYXJnYykgeworCQlpZiAoRy5nbG9iYWxfYXJnc19tYWxsb2NlZCkgeworCQkJaW50IG0gPSAxOworCQkJd2hpbGUgKG0gPD0gbikKKwkJCQlmcmVlKEcuZ2xvYmFsX2FyZ3ZbbSsrXSk7CisJCX0KKwkJRy5nbG9iYWxfYXJnYyAtPSBuOworCQltZW1tb3ZlKCZHLmdsb2JhbF9hcmd2WzFdLCAmRy5nbG9iYWxfYXJndltuKzFdLAorCQkJCUcuZ2xvYmFsX2FyZ2MgKiBzaXplb2YoRy5nbG9iYWxfYXJndlswXSkpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3NvdXJjZShjaGFyICoqYXJndikKK3sKKwljaGFyICphcmdfcGF0aCwgKmZpbGVuYW1lOworCUZJTEUgKmlucHV0OworCXNhdmVfYXJnX3Qgc3Y7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc21hbGxpbnQgc3ZfZmxnOworI2VuZGlmCisKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJZmlsZW5hbWUgPSBhcmd2WzBdOworCWlmICghZmlsZW5hbWUpIHsKKwkJLyogYmFzaCBzYXlzOiAiYmFzaDogLjogZmlsZW5hbWUgYXJndW1lbnQgcmVxdWlyZWQiICovCisJCXJldHVybiAyOyAvKiBiYXNoIGNvbXBhdCAqLworCX0KKwlhcmdfcGF0aCA9IE5VTEw7CisJaWYgKCFzdHJjaHIoZmlsZW5hbWUsICcvJykpIHsKKwkJYXJnX3BhdGggPSBmaW5kX2luX3BhdGgoZmlsZW5hbWUpOworCQlpZiAoYXJnX3BhdGgpCisJCQlmaWxlbmFtZSA9IGFyZ19wYXRoOworCX0KKwlpbnB1dCA9IGZvcGVuX29yX3dhcm4oZmlsZW5hbWUsICJyIik7CisJZnJlZShhcmdfcGF0aCk7CisJaWYgKCFpbnB1dCkgeworCQkvKiBiYl9wZXJyb3JfbXNnKCIlcyIsICphcmd2KTsgLSBkb25lIGJ5IGZvcGVuX29yX3dhcm4gKi8KKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJY2xvc2Vfb25fZXhlY19vbihmaWxlbm8oaW5wdXQpKTsKKworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCXN2X2ZsZyA9IEcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3M7CisJLyogIndlIGFyZSBpbnNpZGUgc291cmNlZCBmaWxlLCBvayB0byB1c2UgcmV0dXJuIiAqLworCUcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPSAtMTsKKyNlbmRpZgorCXNhdmVfYW5kX3JlcGxhY2VfR19hcmdzKCZzdiwgYXJndik7CisKKwlwYXJzZV9hbmRfcnVuX2ZpbGUoaW5wdXQpOworCWZjbG9zZShpbnB1dCk7CisKKwlyZXN0b3JlX0dfYXJncygmc3YsIGFyZ3YpOworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCUcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPSBzdl9mbGc7CisjZW5kaWYKKworCXJldHVybiBHLmxhc3RfZXhpdGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdW1hc2soY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCW1vZGVfdCBtYXNrOworCisJbWFzayA9IHVtYXNrKDApOworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwlpZiAoYXJndlswXSkgeworCQltb2RlX3Qgb2xkX21hc2sgPSBtYXNrOworCisJCW1hc2sgXj0gMDc3NzsKKwkJcmMgPSBiYl9wYXJzZV9tb2RlKGFyZ3ZbMF0sICZtYXNrKTsKKwkJbWFzayBePSAwNzc3OworCQlpZiAocmMgPT0gMCkgeworCQkJbWFzayA9IG9sZF9tYXNrOworCQkJLyogYmFzaCBtZXNzYWdlczoKKwkJCSAqIGJhc2g6IHVtYXNrOiAncSc6IGludmFsaWQgc3ltYm9saWMgbW9kZSBvcGVyYXRvcgorCQkJICogYmFzaDogdW1hc2s6IDk5OTogb2N0YWwgbnVtYmVyIG91dCBvZiByYW5nZQorCQkJICovCisJCQliYl9lcnJvcl9tc2coIiVzOiBpbnZhbGlkIG1vZGUgJyVzJyIsICJ1bWFzayIsIGFyZ3ZbMF0pOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSAxOworCQkvKiBNaW1pYyBiYXNoICovCisJCXByaW50ZigiJTA0b1xuIiwgKHVuc2lnbmVkKSBtYXNrKTsKKwkJLyogZmFsbCB0aHJvdWdoIGFuZCByZXN0b3JlIG1hc2sgd2hpY2ggd2Ugc2V0IHRvIDAgKi8KKwl9CisJdW1hc2sobWFzayk7CisKKwlyZXR1cm4gIXJjOyAvKiByYyAhPSAwIC0gc3VjY2VzcyAqLworfQorCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbCN1bnNldCAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl91bnNldChjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIG9wdHM7CisKKwkvKiAiISI6IGRvIG5vdCBhYm9ydCBvbiBlcnJvcnMgKi8KKwkvKiAiKyI6IHN0b3AgYXQgMXN0IG5vbi1vcHRpb24gKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIiErdmYiKTsKKwlpZiAob3B0cyA9PSAodW5zaWduZWQpLTEpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJaWYgKG9wdHMgPT0gMykgeworCQliYl9lcnJvcl9tc2coInVuc2V0OiAtdiBhbmQgLWYgYXJlIGV4Y2x1c2l2ZSIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKworCXJldCA9IEVYSVRfU1VDQ0VTUzsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJaWYgKCEob3B0cyAmIDIpKSB7IC8qIG5vdCAtZiAqLworCQkJaWYgKHVuc2V0X2xvY2FsX3ZhcigqYXJndikpIHsKKwkJCQkvKiB1bnNldCA8bm9uZXhpc3RlbnRfdmFyPiBkb2Vzbid0IGZhaWwuCisJCQkJICogRXJyb3IgaXMgd2hlbiBvbmUgdHJpZXMgdG8gdW5zZXQgUk8gdmFyLgorCQkJCSAqIE1lc3NhZ2Ugd2FzIHByaW50ZWQgYnkgdW5zZXRfbG9jYWxfdmFyLiAqLworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQllbHNlIHsKKwkJCXVuc2V0X2Z1bmMoKmFyZ3YpOworCQl9CisjZW5kaWYKKwkJYXJndisrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy93YWl0Lmh0bWwgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fd2FpdChjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCWludCBzdGF0dXM7CisKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkgeworCQkvKiBEb24ndCBjYXJlIGFib3V0IHdhaXQgcmVzdWx0cyAqLworCQkvKiBOb3RlIDE6IG11c3Qgd2FpdCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBjaGlsZHJlbiAqLworCQkvKiBOb3RlIDI6IG11c3QgYmUgaW50ZXJydXB0aWJsZSAqLworCQkvKiBFeGFtcGxlczoKKwkJICogJCBzbGVlcCAzICYgc2xlZXAgNiAmIHdhaXQKKwkJICogWzFdIDMwOTM0IHNsZWVwIDMKKwkJICogWzJdIDMwOTM1IHNsZWVwIDYKKwkJICogWzFdIERvbmUgICAgICAgICAgICAgICAgICAgc2xlZXAgMworCQkgKiBbMl0gRG9uZSAgICAgICAgICAgICAgICAgICBzbGVlcCA2CisJCSAqICQgc2xlZXAgMyAmIHNsZWVwIDYgJiB3YWl0CisJCSAqIFsxXSAzMDkzNiBzbGVlcCAzCisJCSAqIFsyXSAzMDkzNyBzbGVlcCA2CisJCSAqIFsxXSBEb25lICAgICAgICAgICAgICAgICAgIHNsZWVwIDMKKwkJICogXkMgPC0tIGFmdGVyIH40IHNlYyBmcm9tIGtleWJvYXJkCisJCSAqICQKKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlpbnQgc2lnOworCQkJc2lnc2V0X3Qgb2xkc2V0LCBhbGxzaWdzOworCisJCQkvKiB3YWl0cGlkIGlzIG5vdCBpbnRlcnJ1cHRpYmxlIGJ5IFNBX1JFU1RBUlRlZAorCQkJICogc2lnbmFscyB3aGljaCB3ZSB1c2UuIFRodXMsIHRoaXMgdWdseSBkYW5jZToKKwkJCSAqLworCisJCQkvKiBNYWtlIHN1cmUgcG9zc2libGUgU0lHQ0hMRCBpcyBzdG9yZWQgaW4ga2VybmVsJ3MKKwkJCSAqIHBlbmRpbmcgc2lnbmFsIG1hc2sgYmVmb3JlIHdlIGNhbGwgd2FpdHBpZC4KKwkJCSAqIE9yIGVsc2Ugd2UgbWF5IHJhY2Ugd2l0aCBTSUdDSExELCBsb3NlIGl0LAorCQkJICogYW5kIGdldCBzdHVjayBpbiBzaWd3YWl0aW5mby4uLgorCQkJICovCisJCQlzaWdmaWxsc2V0KCZhbGxzaWdzKTsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYWxsc2lncywgJm9sZHNldCk7CisKKwkJCWlmICghc2lnaXNlbXB0eXNldCgmRy5wZW5kaW5nX3NldCkpIHsKKwkJCQkvKiBDcmFwISB3ZSByYWNlZCB3aXRoIHNvbWUgc2lnbmFsISAqLworCQkJLy8Jc2lnID0gMDsKKwkJCQlnb3RvIHJlc3RvcmU7CisJCQl9CisKKwkJCWNoZWNram9icyhOVUxMKTsgLyogd2FpdHBpZChXTk9IQU5HKSBpbnNpZGUgKi8KKwkJCWlmIChlcnJubyA9PSBFQ0hJTEQpIHsKKwkJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFdhaXQgZm9yIFNJR0NITEQgb3IgYW55IG90aGVyIHNpZ25hbCAqLworCQkJLy9zaWcgPSBzaWd3YWl0aW5mbygmYWxsc2lncywgTlVMTCk7CisJCQkvKiBJdCBpcyB2aXRhbGx5IGltcG9ydGFudCBmb3Igc2lnc3VzcGVuZCB0aGF0IFNJR0NITEQgaGFzIG5vbi1ERkwgaGFuZGxlciEgKi8KKwkJCS8qIE5vdGU6IHNpZ3N1c3BlbmQgaW52b2tlcyBzaWduYWwgaGFuZGxlciAqLworCQkJc2lnc3VzcGVuZCgmb2xkc2V0KTsKKyByZXN0b3JlOgorCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworCisJCQkvKiBTbywgZGlkIHdlIGdldCBhIHNpZ25hbD8gKi8KKwkJCS8vaWYgKHNpZyA+IDApCisJCQkvLwlyYWlzZShzaWcpOyAvKiBydW4gaGFuZGxlciAqLworCQkJc2lnID0gY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQkJaWYgKHNpZyAvKiYmIHNpZyAhPSBTSUdDSExEIC0gYWx3YXlzIHRydWUgKi8pIHsKKwkJCQkvKiBzZWUgbm90ZSAyICovCisJCQkJcmV0ID0gMTI4ICsgc2lnOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU0lHQ0hMRCwgb3Igbm8gc2lnbmFsLCBvciBpZ25vcmVkIG9uZSwgc3VjaCBhcyBTSUdRVUlULiBSZXBlYXQgKi8KKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRoaXMgaXMgcHJvYmFibHkgYnVnZ3kgd3J0IGludGVycnVwdGlibGUtbmVzcyAqLworCXdoaWxlICgqYXJndikgeworCQlwaWRfdCBwaWQgPSBiYl9zdHJ0b3UoKmFyZ3YsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKSB7CisJCQkvKiBtaW1pYyBiYXNoIG1lc3NhZ2UgKi8KKwkJCWJiX2Vycm9yX21zZygid2FpdDogJyVzJzogbm90IGEgcGlkIG9yIHZhbGlkIGpvYiBzcGVjIiwgKmFyZ3YpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCQlpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApID09IHBpZCkgeworCQkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQkJcmV0ID0gMTI4ICsgV1RFUk1TSUcoc3RhdHVzKTsKKwkJCWVsc2UgaWYgKFdJRkVYSVRFRChzdGF0dXMpKQorCQkJCXJldCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCQllbHNlIC8qIHd0Zj8gKi8KKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCX0gZWxzZSB7CisJCQliYl9wZXJyb3JfbXNnKCJ3YWl0ICVzIiwgKmFyZ3YpOworCQkJcmV0ID0gMTI3OworCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMgfHwgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdGF0aWMgdW5zaWduZWQgcGFyc2VfbnVtZXJpY19hcmd2MShjaGFyICoqYXJndiwgdW5zaWduZWQgZGVmLCB1bnNpZ25lZCBkZWZfbWluKQoreworCWlmIChhcmd2WzFdKSB7CisJCWRlZiA9IGJiX3N0cnRvdShhcmd2WzFdLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCBkZWYgPCBkZWZfbWluIHx8IGFyZ3ZbMl0pIHsKKwkJCWJiX2Vycm9yX21zZygiJXM6IGJhZCBhcmd1bWVudHMiLCBhcmd2WzBdKTsKKwkJCWRlZiA9IFVJTlRfTUFYOworCQl9CisJfQorCXJldHVybiBkZWY7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2JyZWFrKGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGRlcHRoOworCWlmIChHLmRlcHRoX29mX2xvb3AgPT0gMCkgeworCQliYl9lcnJvcl9tc2coIiVzOiBvbmx5IG1lYW5pbmdmdWwgaW4gYSBsb29wIiwgYXJndlswXSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qIGJhc2ggY29tcGF0ICovCisJfQorCUcuZmxhZ19icmVha19jb250aW51ZSsrOyAvKiBCQ19CUkVBSyA9IDEgKi8KKworCUcuZGVwdGhfYnJlYWtfY29udGludWUgPSBkZXB0aCA9IHBhcnNlX251bWVyaWNfYXJndjEoYXJndiwgMSwgMSk7CisJaWYgKGRlcHRoID09IFVJTlRfTUFYKQorCQlHLmZsYWdfYnJlYWtfY29udGludWUgPSBCQ19CUkVBSzsKKwlpZiAoRy5kZXB0aF9vZl9sb29wIDwgZGVwdGgpCisJCUcuZGVwdGhfYnJlYWtfY29udGludWUgPSBHLmRlcHRoX29mX2xvb3A7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2NvbnRpbnVlKGNoYXIgKiphcmd2KQoreworCUcuZmxhZ19icmVha19jb250aW51ZSA9IDE7IC8qIEJDX0NPTlRJTlVFID0gMiA9IDErMSAqLworCXJldHVybiBidWlsdGluX2JyZWFrKGFyZ3YpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fcmV0dXJuKGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWlmIChHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzICE9IC0xKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IG5vdCBpbiBhIGZ1bmN0aW9uIG9yIHNvdXJjZWQgc2NyaXB0IiwgYXJndlswXSk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7IC8qIGJhc2ggY29tcGF0ICovCisJfQorCisJRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyA9IDE7CisKKwkvKiBiYXNoOgorCSAqIG91dCBvZiByYW5nZTogd3JhcHMgYXJvdW5kIGF0IDI1NiwgZG9lcyBub3QgZXJyb3Igb3V0CisJICogbm9uLW51bWVyaWMgcGFyYW06CisJICogZigpIHsgZmFsc2U7IHJldHVybiBxd2U7IH07IGY7IGVjaG8gJD8KKwkgKiBiYXNoOiByZXR1cm46IHF3ZTogbnVtZXJpYyBhcmd1bWVudCByZXF1aXJlZCAgPD09IHdlIGRvIHRoaXMKKwkgKiAyNTUgIDw9PSB3ZSBhbHNvIGRvIHRoaXMKKwkgKi8KKwlyYyA9IHBhcnNlX251bWVyaWNfYXJndjEoYXJndiwgRy5sYXN0X2V4aXRjb2RlLCAwKTsKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfZG9jLnR4dCBiL3NoZWxsL2h1c2hfZG9jLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhkYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF9kb2MudHh0CkBAIC0wLDAgKzEsMTQzIEBACisyMDA4LTA3LTE0CisKKwlDb21tYW5kIHBhcnNpbmcKKworQ29tbWFuZCBwYXJzaW5nIHJlc3VsdHMgaW4gYSBsaXN0IG9mICJwaXBlIiBzdHJ1Y3R1cmVzLgorVGhpcyBsaXN0IGNvcnJlc3BvbmQgbm90IG9ubHkgdG8gdXN1YWwgInBpcGUxIHx8IHBpcGUyICYmIHBpcGUzIgorbGlzdHMsIGJ1dCBpdCBhbHNvIGNvbnRyb2xzIGV4ZWN1dGlvbiBvZiBpZiwgd2hpbGUsIGV0YyBzdGF0ZW1lbnRzLgorRXZlcnkgc3VjaCBzdGF0ZW1lbnQgaXMgYSBsaXN0IGZvciBodXNoLiBMaXN0IGNvbnNpc3RzIG9mIHBpcGVzLgorCitzdHJ1Y3QgcGlwZSBmaWVsZHM6CisgIHNtYWxsaW50IHJlc193b3JkIC0gIm5vbmUiIGZvciBub3JtYWwgY29tbWFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgImlmIiBmb3IgaWYgY29uZGl0aW9uIGV0YworICBzdHJ1Y3QgY2hpbGRfcHJvZyBwcm9nc1tdIC0gYXJyYXkgb2YgY29tbWFuZHMgaW4gcGlwZQorICBzbWFsbGludCBmb2xsb3d1cCAtIGhvdyB0aGlzIHBpcGUgaXMgcmVsYXRlZCB0byBuZXh0OiBpcyBpdAorICAgICAgICAgICAgICAgICAgICAgICJwaXBlOyBwaXBlIiwgInBpcGUgJiBwaXBlIiAicGlwZSAmJiBwaXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAicGlwZSB8fCBwaXBlIj8KKworQmxvY2tzIG9mIGNvbW1hbmRzIHsgcGlwZTsgcGlwZTsgfSBhbmQgKHBpcGU7IHBpcGUpIGFyZSByZXByZXNlbnRlZAorYXMgb25lIHBpcGUgc3RydWN0IHdpdGggb25lIHByb2dzWzBdIGVsZW1lbnQgd2hpY2ggaXMgYSAiZ3JvdXAiIC0KK3N0cnVjdCBjaGlsZF9wcm9nIGNhbiBjb250YWluIGEgbGlzdCBvZiBwaXBlcy4gU29tZXRpbWVzIHRoZXNlCisiZ3JvdXBzIiBhcmUgY3JlYXRlZCBpbXBsaWNpdGx5LCBlLmcuIGV2ZXJ5IGNvbnRyb2wKK3N0YXRlbWVudCAoaWYsIHdoaWxlLCBldGMpIHNpdHMgaW5zaWRlIGl0cyBvd24gZ3JvdXAuCisKK3Jlc193b3JkIGNvbnRyb2xzIHN0YXRlbWVudCBleGVjdXRpb24uIEV4YW1wbGVzOgorCisiZWNobyBIZWxsbyIgLQorcGlwZSAwIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2VjaG8nICdIZWxsbycKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCisiZWNobyBmb28gfHwgZWNobyBiYXIiIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPU9SICBwcm9nWzBdICdlY2hvJyAnZm9vJworcGlwZSAxIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2VjaG8nICdiYXInCitwaXBlIDIgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKworImlmIHRydWU7IHRoZW4gZWNobyBIZWxsbzsgdHJ1ZTsgZmkiIC0KK3Jlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRCisgcHJvZyAwIGdyb3VwIHt9OgorICBwaXBlIDAgcmVzX3dvcmQ9SUYgZm9sbG93dXA9U0VRIHByb2dbMF0gJ3RydWUnCisgIHBpcGUgMSByZXNfd29yZD1USEVOIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdlY2hvJyAnSGVsbG8nCisgIHBpcGUgMiByZXNfd29yZD1USEVOIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICBwaXBlIDMgcmVzX3dvcmQ9RkkgZm9sbG93dXA9U0VRCisgIHBpcGUgNCByZXNfd29yZD1OT05FIGZvbGxvd3VwPShudWxsKQorcGlwZSAxIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRCisKK0Fib3ZlIHlvdSBzZWUgdGhhdCBpZiBpcyBhIGxpc3QsIGFuZCBpdCBzaXRzIGluIGEge30gZ3JvdXAKK2ltcGxpY2l0bHkgY3JlYXRlZCBieSBodXNoLiBBbHNvIG5vdGUgdHdvIFRIRU4gcmVzX3dvcmQncyAtCitpdCBpcyBleHBsYWluZWQgYmVsb3cuCisKKyJpZiB0cnVlOyB0aGVuIHsgZWNobyBIZWxsbzsgdHJ1ZTsgfTsgZmkiIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorIHByb2cgMCBncm91cCB7fToKKyAgcGlwZSAwIHJlc193b3JkPUlGIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICBwaXBlIDEgcmVzX3dvcmQ9VEhFTiBmb2xsb3d1cD1TRVEKKyAgIHByb2cgMCBncm91cCB7fToKKyAgICBwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnZWNobycgJ0hlbGxvJworICAgIHBpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICAgIHBpcGUgMiByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorICBwaXBlIDIgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCisiZm9yIHYgaW4gYSBiOyBkbyBlY2hvICR2OyB0cnVlOyBkb25lIiAtCitwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKyBwcm9nIDAgZ3JvdXAge306CisgIHBpcGUgMCByZXNfd29yZD1GT1IgZm9sbG93dXA9U0VRIHByb2dbMF0gJ3YnCisgIHBpcGUgMSByZXNfd29yZD1JTiBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnYScgJ2InCisgIHBpcGUgMiByZXNfd29yZD1ETyBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnZWNobycgJyR2JworICBwaXBlIDMgcmVzX3dvcmQ9RE8gZm9sbG93dXA9U0VRIHByb2dbMF0gJ3RydWUnCisgIHBpcGUgNCByZXNfd29yZD1ET05FIGZvbGxvd3VwPVNFUQorICBwaXBlIDUgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCitOb3RlIGhvdyAiVEhFTiIgYW5kICJETyIgZG9lcyBub3QganVzdCBtYXJrIHRoZSBmaXJzdCBwaXBlLAoraXQgInN0aWNrcyIgdG8gYWxsIHBpcGVzIGluIHRoZSBib2R5LiBUaGlzIGlzIHVzZWQgd2hlbgoraHVzaCBleGVjdXRlcyBwYXJzZWQgcGlwZXMuCisKK0R1bW15IHRyYWlsaW5nIHBpcGVzIHdpdGggbm8gY29tbWFuZHMgYXJlIGFydGlmYWN0cyBvZiBpbXBlcmZlY3QKK3BhcnNpbmcgYWxnb3JpdGhtIC0gZG9uZV9waXBlKCkgYXBwZW5kcyBuZXcgcGlwZSBzdHJ1Y3QgYmVmb3JlaGFuZAorYW5kIGxhc3Qgb25lIGVuZHMgdXAgZW1wdHkgYW5kIHVudXNlZC4KKworImZvciIgYW5kICJjYXNlIiBzdGF0ZW1lbnRzIChhYil1c2UgcHJvZ3NbXSB0byBrZWVwIHRoZWlyIGRhdGEKK2luc3RlYWQgb2YgYXJndiB2ZWN0b3IgcHJvZ3NbXSB1c3VhbGx5IGRvLiAiZm9yIiBrZXl3b3JkIGlzIGZvcmNpbmcKK3BpcGUgdGVybWluYXRpb24gYWZ0ZXIgZmlyc3Qgd29yZCwgd2hpY2ggbWFrZXMgaHVzaCBzZWUKKyJmb3IgdiBpbi4uLiIgYXMgImZvciB2OyBpbi4uLiIuICJjYXNlIiBrZXl3b3JkIGRvZXMgdGhlIHNhbWUuCitPdGhlciBqdWRpY2l1b3NseSBwbGFjZWQgaGFja3MgbWFrZSBodXNoIHNlZQorImNhc2Ugd29yZCBpbiBhKSBjbWQxOzsgYikgY21kMjs7IGVzYWMiIGFzIGlmIGl0IHdhcworImNhc2Ugd29yZDsgbWF0Y2ggYTsgY21kOyBtYXRjaCBiOyBjbWQyOyBlc2FjIgorKCJtYXRjaCIgaXMgYSBmaWN0aXRpb3VzIGtleXdvcmQgaGVyZSk6CisKKyJjYXNlIHdvcmQgaW4gYSkgY21kMTs7IGIpIGNtZDI7IGVzYWMiIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPTEgU0VRCisgcHJvZyAwIGdyb3VwIHt9OgorICBwaXBlIDAgcmVzX3dvcmQ9Q0FTRSBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnd29yZCcKKyAgcGlwZSAxIHJlc193b3JkPU1BVENIIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdhJworICBwaXBlIDIgcmVzX3dvcmQ9Q0FTRUkgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2NtZDEnCisgIHBpcGUgMyByZXNfd29yZD1NQVRDSCBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnYicKKyAgcGlwZSA0IHJlc193b3JkPUNBU0VJIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdjbWQyJworICBwaXBlIDUgcmVzX3dvcmQ9Q0FTRUkgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2NtZDMnCisgIHBpcGUgNiByZXNfd29yZD1FU0FDIGZvbGxvd3VwPVNFUQorICBwaXBlIDcgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCisKKzIwMDgtMDEKKworCUNvbW1hbmQgZXhlY3V0aW9uCisKKy8qIGNhbGxzaXRlOiBwcm9jZXNzX2NvbW1hbmRfc3VicyAqLworZ2VuZXJhdGVfc3RyZWFtX2Zyb21fbGlzdChzdHJ1Y3QgcGlwZSAqaGVhZCkgLSBoYW5kbGVzIGBjbWRzYAorICBjcmVhdGUgVU5JWCBwaXBlCisgIFt2XWZvcmsKKyAgY2hpbGQ6CisgIHJlZGlyZWN0IHBpcGUgb3V0cHV0IHRvIHN0ZG91dAorICBfZXhpdChydW5fbGlzdChoZWFkKSk7ICAgLyogbGVha3MgbWVtb3J5ICovCisgIHBhcmVudDoKKyAgcmV0dXJuIFVOSVggcGlwZSdzIG91dHB1dCBmZAorICAvKiBoZWFkIGlzIGZyZWVkIGJ5IHRoZSBjYWxsZXIgKi8KKworLyogY2FsbHNpdGU6IHBhcnNlX2FuZF9ydW5fc3RyZWFtICovCitydW5fYW5kX2ZyZWVfbGlzdChzdHJ1Y3QgcGlwZSAqKQorICBydW5fbGlzdChzdHJ1Y3QgcGlwZSAqKQorICBmcmVlX3BpcGVfbGlzdChzdHJ1Y3QgcGlwZSAqKQorCisvKiBjYWxsc2l0ZXM6IGdlbmVyYXRlX3N0cmVhbV9mcm9tX2xpc3QsIHJ1bl9hbmRfZnJlZV9saXN0LCBwc2V1ZG9fZXhlYywgcnVuX3BpcGUgKi8KK3J1bl9saXN0KHN0cnVjdCBwaXBlICopIC0gaGFuZGxlcyAiY21kOyBjbWQyICYmIGNtZDMiLCB3aGlsZS9mb3IvZG8gbG9vcHMKKyAgcnVuX3BpcGUgLSBmb3IgZXZlcnkgcGlwZSBpbiBsaXN0CisKKy8qIGNhbGxzaXRlOiBydW5fbGlzdCAqLworcnVuX3BpcGUgLSBydW5zICJjbWQxIHwgY21kMiB8IGNtZDMgWyZdIgorICBydW5fbGlzdCAtIHVzZWQgaWYgb25seSBvbmUgY21kIGFuZCBpdCBpcyBvZiB0aGUgZm9ybSAie2NtZHM7fSIKKyAgZm9ya3MgZm9yIGV2ZXJ5IGNtZCBpZiBtb3JlIHRoYW4gb25lIGNtZCBvciBpZiAmIGlzIHRoZXJlCisgIHBzZXVkb19leGVjIC0gcnVucyBlYWNoICJjbWROIiAoaGFuZGxlcyBidWlsdGlucyBldGMpCisKKy8qIGNhbGxzaXRlOiBydW5fcGlwZSAqLworcHNldWRvX2V4ZWMgLSBydW5zICJjbWQiIChoYW5kbGVzIGJ1aWx0aW5zIGV0YykKKyAgZXhlYyAtIGV4ZWNzIGV4dGVybmFsIHByb2dyYW1zCisgIHJ1bl9saXN0IC0gdXNlZCBpZiBjbWROIGlzICIoY21kcykiIG9yICJ7Y21kczt9IgorICAvKiBwcm9ibGVtOiBwdXRlbnYncyBtYWxsb2NlZCBzdHJpbmdzIGludG8gZW52aXJvbiAtCisgICoqIHdpdGggdmZvcmsgdGhleSB3aWxsIGxlYWsgaW50byBwYXJlbnQgcHJvY2VzcworICAqLworICAvKiBwcm9ibGVtIHdpdGggRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORToKKyAgKiogcnVuX2FwcGxldF9ub19hbmRfZXhpdChhLCBhcmd2KSB1c2VzIGV4aXQgLSB0aGlzIGNhbiBpbnRlcmZlcmUKKyAgKiogd2l0aCB2Zm9yayAtIHN3aXRjaCB0byBfZXhpdCB0aGVyZT8KKyAgKi8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfbGVha3Rvb2wuc2ggYi9zaGVsbC9odXNoX2xlYWt0b29sLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhMzVlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX2xlYWt0b29sLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9zaAorCisjIGh1c2gncyBzdGRlcnIgd2l0aCBsZWFrIGRlYnVnIGVuYWJsZWQKK291dHB1dD1vdXRwdXQKKworZnJlZWxpc3Q9YGdyZXAgJ2ZyZWUgMHgnICIkb3V0cHV0IiB8IGN1dCAtZCcgJyAtZjIgfCBzb3J0IHwgdW5pcSB8IHhhcmdzYAorCitncmVwIC12IGZyZWUgIiRvdXRwdXQiID4iJG91dHB1dC5sZWFrZWQiCisKK2k9OAorbGlzdD0KK2ZvciBmcmVlZCBpbiAkZnJlZWxpc3Q7IGRvCisgICAgbGlzdD0iJGxpc3QgLWUgJGZyZWVkIgorICAgIHRlc3QgJCgoLS1pKSkgIT0gMCAmJiBjb250aW51ZQorICAgIGVjaG8gRHJvcHBpbmcgJGxpc3QKKyAgICBncmVwIC1GIC12ICRsaXN0IDwiJG91dHB1dC5sZWFrZWQiID4iJG91dHB1dC50ZW1wIgorICAgIG12ICIkb3V0cHV0LnRlbXAiICIkb3V0cHV0LmxlYWtlZCIKKyAgICBpPTgKKyAgICBsaXN0PQorZG9uZQoraWYgdGVzdCAiJGxpc3QiOyB0aGVuCisgICAgZWNobyBEcm9wcGluZyAkbGlzdAorICAgIGdyZXAgLUYgLXYgJGxpc3QgPCIkb3V0cHV0LmxlYWtlZCIgPiIkb3V0cHV0LnRlbXAiCisgICAgbXYgIiRvdXRwdXQudGVtcCIgIiRvdXRwdXQubGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMDFmYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnJpZ2h0CkBAIC0wLDAgKzEsMTQ3IEBACitGb3JtYXQ6ICdleHBlY3RlZCBhY3R1YWwnCisxNjMgMTYzCis0IDQKKzE2IDE2Cis4IDgKKzIgMgorNCA0CisyIDIKKzIgMgorMSAxCiswIDAKKzAgMAorMCAwCisxIDEKKzEgMQorMiAyCistMyAtMworLTIgLTIKKzEgMQorMCAwCisyIDIKKzEzMTA3MiAxMzEwNzIKKzI5IDI5CiszMyAzMworNDkgNDkKKzEgMQorMSAxCiswIDAKKzAgMAorMSAxCisxIDEKKzEgMQorMiAyCiszIDMKKzEgMQorNTggNTgKKzIgMgorNjAgNjAKKzEgMQorMjU2IDI1NgorMTYgMTYKKzYyIDYyCis0IDQKKzI5IDI5Cis1IDUKK3VuYXJ5IHBsdXMsIG1pbnVzCistNCAtNAorNCA0Citjb25kaXRpb25hbCBleHByZXNzaW9ucworMSAxCiszMiAzMgorMzIgMzIKKzEgMQorMSAxCiszMiAzMgorY2hlY2sgdGhhdCBwYXJlbnRoZXNlcyBpbiBgY21kYCBhcmUgaW50ZXJwcmV0ZWQgY29ycmVjdGx5CiszIDMKK2NoZWNrIHRoYXQgdGhlIHVuZXZhbHVhdGVkIHBhcnQgb2YgdGhlIHRlcm5hcnkgb3BlcmF0b3IgZG9lcyBub3QgZG8gZXZhbHVhdGlvbiBvciBhc3NpZ25tZW50CisyMCAyMAorMzAgMzAKKzIwIDIwCiszMCAzMAorY2hlY2sgcHJlY2VkZW5jZSBvZiBhc3NpZ25tZW50IHZzLiBjb25kaXRpb25hbCBvcGVyYXRvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2NoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKK2Fzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgorNiA2Cis2LDUsMyA2LDUsMworb2N0YWwsIGhleAorMjYzIDI2MworMjU1IDI1NQorNDAgNDAKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBkaXZpZGUgYnkgemVybworaHVzaDogY2FuJ3QgZXhlY3V0ZSAnbGV0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ2xldCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2FiYworZGVmCitnaGkKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisxNiAxNgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IG1hbGZvcm1lZCA/OiBvcGVyYXRvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzkgOQoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis5IDkKKzkgOQorOSA5Cis3IDcKKzcKKzQgNAorMzI3NjcgMzI3NjcKKzMyNzY4IDMyNzY4CisxMzEwNzIgMTMxMDcyCisyMTQ3NDgzNjQ3IDIxNDc0ODM2NDcKKzEgMQorNCA0Cis0IDQKKzUgNQorNSA1Cis0IDQKKzMgMworMyAzCis0IDQKKzQgNAoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis0IDQKKzcgNworLTcgLTcKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis2IDYKKzMgMworNyA3Cis0IDQKKzAgMAorMyAzCis3IDcKKzIgMgorLTIgLTIKKzEgMQoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis1IDUKKzEgMQorNCA0CiswIDAKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorOCAxMgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzQyCis0MgorNDIKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ2FbYltjXWRdPWUnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjNmIzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC50ZXN0cwpAQCAtMCwwICsxLDMwNSBAQAorI2FzaCMgc2V0ICtvIHBvc2l4CisjYXNoIyBkZWNsYXJlIC1pIGl2IGp2CisKK2VjaG8gIkZvcm1hdDogJ2V4cGVjdGVkIGFjdHVhbCciCisKK2l2PSQoKCAzICsgNSAqIDMyICkpCitlY2hvIDE2MyAkaXYKKyNhc2gjIGl2PWl2KzMKKyNhc2gjIGVjaG8gMTY2ICRpdgoraXY9MgoranY9aXYKKworOiAkKChqdiAqPSAyKSkgIyNodXNoIyMgbGV0ICJqdiAqPSAyIgorZWNobyA0ICRqdgoranY9JCgoICRqdiA8PCAyICkpCitlY2hvIDE2ICRqdgorCis6ICQoKGp2PSRqdiAvIDIpKSAjI2h1c2gjIyBsZXQganY9IiRqdiAvIDIiCitlY2hvIDggJGp2CisjYXNoIyBqdj0ianYgPj4gMiIKKzogJCgoanY9anYgPj4gMikpICMjaHVzaCMjIGxldCBqdj0ianYgPj4gMiIKK2VjaG8gMiAkanYKKworaXY9JCgoaXYrICRqdikpCitlY2hvIDQgJGl2CitlY2hvIDIgJCgoaXYgLT0ganYpKQorZWNobyAyICRpdgorZWNobyAxICQoKCBpdiA9PSBqdiApKQorZWNobyAwICQoKCBpdiAhPSAkanYgKSkKK2VjaG8gMCAkKCggaXYgPCBqdiApKQorZWNobyAwICQoKCAkaXYgPiAkanYgKSkKK2VjaG8gMSAkKCggaXYgPD0gJGp2ICkpCitlY2hvIDEgJCgoICRpdiA+PSBqdiApKQorCitlY2hvIDIgJGp2CitlY2hvIC0zICQoKCB+JGp2ICkpCitlY2hvIC0yICQoKCB+MSApKQorZWNobyAxICQoKCAhIDAgKSkKKworZWNobyAwICQoKCBqdiAlIDIgKSkKK2VjaG8gMiAkKCggJGl2ICUgNCApKQorCitlY2hvIDEzMTA3MiAkKCggaXYgPDw9IDE2ICkpCitlY2hvIDI5ICQoKCBpdiAlPSAzMyApKQorCitlY2hvIDMzICQoKCAzMyAmIDU1ICkpCitlY2hvIDQ5ICQoKCAzMyB8IDE3ICkpCisKK2VjaG8gMSAkKCggaXYgJiYgJGp2ICkpCitlY2hvIDEgJCgoICRpdiB8fCBqdiApKQorCitlY2hvIDAgJCgoIGl2ICYmIDAgKSkKK2VjaG8gMCAkKCggaXYgJiAwICkpCitlY2hvIDEgJCgoIGl2ICYmIDEgKSkKK2VjaG8gMSAkKCggaXYgJiAxICkpCisKK2VjaG8gMSAkKCggJGp2IHx8IDAgKSkKK2VjaG8gMiAkKCgganYgfCAwICkpCitlY2hvIDMgJCgoIGp2IHwgMSApKQorZWNobyAxICQoKCAkanYgfHwgMSApKQorCis6ICQoKGl2ICo9IGp2KSkgIyNodXNoIyMgbGV0ICdpdiAqPSBqdicKK2VjaG8gNTggJGl2CitlY2hvIDIgJGp2Cis6ICQoKGp2ICs9ICRpdikpICMjaHVzaCMjIGxldCAianYgKz0gJGl2IgorZWNobyA2MCAkanYKKworZWNobyAxICQoKCBqdiAvPSBpdiApKQorZWNobyAyNTYgJCgoIGp2IDw8PSA4ICkpCitlY2hvIDE2ICQoKCBqdiA+Pj0gNCApKQorCitlY2hvIDYyICQoKCBpdiB8PSA0ICkpCitlY2hvIDQgJCgoIGl2ICY9IDQgKSkKKworZWNobyAyOSAkKCggaXYgKz0gKGp2ICsgOSkpKQorZWNobyA1ICQoKCAoaXYgKyA0KSAlIDcgKSkKKworZWNobyB1bmFyeSBwbHVzLCBtaW51cworZWNobyAtNCAkKCggKzQgLSA4ICkpCitlY2hvIDQgJCgoIC00ICsgOCApKQorCitlY2hvIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCitlY2hvIDEgJCgoIDQ8NSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCA0PjUgPyAxIDogMzIpKQorZWNobyAzMiAkKCggND4oMiszKSA/IDEgOiAzMikpCitlY2hvIDEgJCgoIDQ8KDIrMykgPyAxIDogMzIpKQorZWNobyAxICQoKCAoMisyKTwoMiszKSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCAoMisyKT4oMiszKSA/IDEgOiAzMikpCisKK2VjaG8gJ2NoZWNrIHRoYXQgcGFyZW50aGVzZXMgaW4gYGNtZGAgYXJlIGludGVycHJldGVkIGNvcnJlY3RseScKKyMgXHgyOCBpcyAnKCcKK2VjaG8gMyAkKCggKCBgcHJpbnRmICcoXHgyOCAxJ2AgKyBgZWNobyAyXClcKWAgKSApKQorCitlY2hvIGNoZWNrIHRoYXQgdGhlIHVuZXZhbHVhdGVkIHBhcnQgb2YgdGhlIHRlcm5hcnkgb3BlcmF0b3IgZG9lcyBub3QgZG8gZXZhbHVhdGlvbiBvciBhc3NpZ25tZW50Cit4PWkrPTIKK3k9ais9MgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0xCisgICAgICBpPTEKKyAgICAgIGo9MQorZWNobyAyMCAkKCgxID8gMjAgOiAoeCs9MikpKQorI2FzaCMgZWNobyAkaSwkeCAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKK2VjaG8gMzAgJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKyNhc2gjIGVjaG8gJGosJHkgICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCisKK3g9aSs9MgoreT1qKz0yCisjYXNoIyBkZWNsYXJlIC1pIGk9MSBqPTEKKyAgICAgIGk9MQorICAgICAgaj0xCitlY2hvIDIwICQoKDEgPyAyMCA6ICh4Kz0yKSkpCisjYXNoIyBlY2hvICRpLCR4ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworZWNobyAzMCAkKCgwID8gKHkrPTIpIDogMzApKQorI2FzaCMgZWNobyAkaSwkeSAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKKworZWNobyBjaGVjayBwcmVjZWRlbmNlIG9mIGFzc2lnbm1lbnQgdnMuIGNvbmRpdGlvbmFsIG9wZXJhdG9yCisjIHNob3VsZCBiZSBhbiBlcnJvcgorI2FzaCMgZGVjbGFyZSAtaSB4PTIKKyAgICAgIHg9MgorI2FzaG5vdGUjIGJhc2ggcmVwb3J0cyBlcnJvciBidXQgY29udGludWVzLCBhc2ggYWJvcnRzIC0gdXNpbmcgc3Vic2hlbGwgdG8gJ2VtdWxhdGUnIGJhc2g6CisoICB5PSQoKDEgPyAyMCA6IHgrPTIpKSAgKQorCitlY2hvIGNoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKKyNhc2gjIGRlY2xhcmUgLWkgeD0yCisgICAgICB4PTIKKyMgYXNoIHNheXMgImxpbmUgTk5OOiBzeW50YXggZXJyb3I6IDAgPyB4Kz0yIDogMjAiCisjYXNoIyBlY2hvIDIwICQoKDAgPyB4Kz0yIDogMjApKQorCitlY2hvIGFzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0yIGs9MworaT0xCitqPTIKK2s9MworZWNobyA2ICQoKGkgKz0gaiArPSBrKSkKK2VjaG8gNiw1LDMgJGksJGosJGsKKworZWNobyBvY3RhbCwgaGV4CitlY2hvIDI2MyAkKCggMHgxMDAgfCAwMDcgKSkKK2VjaG8gMjU1ICQoKCAweGZmICkpCisjYXNoIyBlY2hvIDI1NSAkKCggMTYjZmYgKSkKKyNhc2gjIGVjaG8gMTI3ICQoKCAxNiNGRi8yICkpCisjYXNoIyBlY2hvIDM2ICQoKCA4IzQ0ICkpCisKK2VjaG8gNDAgJCgoIDggXiAzMiApKQorCisjYXNoIyAjIG90aGVyIGJhc2VzCisjYXNoIyBlY2hvIDEwICQoKCAxNiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCAzMiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCA1NiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCA2NCNhICkpCisjYXNoIworI2FzaCMgZWNobyAxMCAkKCggMTYjQSApKQorI2FzaCMgZWNobyAxMCAkKCggMzIjQSApKQorI2FzaCMgZWNobyAzNiAkKCggNTYjQSApKQorI2FzaCMgZWNobyAzNiAkKCggNjQjQSApKQorI2FzaCMKKyNhc2gjIGVjaG8gNjIgJCgoIDY0I0AgKSkKKyNhc2gjIGVjaG8gNjMgJCgoIDY0I18gKSkKKworI2FzaCMgIyB3ZWlyZCBiYXNlcyAoZXJyb3IpCisjYXNoIyBlY2hvICQoKCAzNDI1IzU2ICkpCisKKyNhc2gjICMgbWlzc2luZyBudW1iZXIgYWZ0ZXIgYmFzZQorI2FzaCMgZWNobyAwICQoKCAyIyApKQorCisjIHRoZXNlIHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMKKyggIGVjaG8gJCgoIDcgPSA0MyApKSAgICAgICkKKyNhc2gjIGVjaG8gJCgoIDIjNDQgKSkKKyggIGVjaG8gJCgoIDQ0IC8gMCApKSAgICAgICkKKyggIGxldCAnanYgKz0gJGl2JyAgICAgICAgICkKKyggIGVjaG8gJCgoIGp2ICs9IFwkaXYgKSkgICkKKyggIGxldCAncnYgPSA3ICsgKDQzICogNicgICkKKworI2FzaCMgIyBtb3JlIGVycm9ycworI2FzaCMgZGVjbGFyZSAtaSBpCisjYXNoIyBpPTAjNAorI2FzaCMgaT0yIzExMCMxMQorCisoKGVjaG8gYWJjOyBlY2hvIGRlZjspOyBlY2hvIGdoaSkKKworI2FzaCMgaWYgKCgoNCs0KSArICg0ICsgNykpKTsgdGhlbgorI2FzaCMgCWVjaG8gb2sKKyNhc2gjIGZpCisKKyNhc2gjICgoKSkJIyBtYWtlIHN1cmUgdGhlIG51bGwgZXhwcmVzc2lvbiB3b3JrcyBPSworCisjYXNoIyBhPSgwIDIgNCA2KQorI2FzaCMgZWNobyA2ICQoKCBhWzFdICsgYVsyXSApKQorI2FzaCMgZWNobyAxICQoKCAoYVsxXSArIGFbMl0pID09IGFbM10gKSkKKyNhc2gjICgoIChhWzFdICsgYVsyXSkgPT0gYVszXSApKSA7IGVjaG8gMCAkPworCisjIHRlc3QgcHVzaGluZyBhbmQgcG9wcGluZyB0aGUgZXhwcmVzc2lvbiBzdGFjawordW5zZXQgQQorQT0iNCArICIKKyggIGVjaG8gQSAkKCggKCA0ICsgQSApICsgNCApKSAgKQorQT0iMyArIDUiCitlY2hvIDE2ICQoKCAoIDQgKyBBICkgKyA0ICkpCisKKyMgYmFkbHktZm9ybWVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCisoICBlY2hvICQoKCA0ID8gOiAkQSApKSAgKQorKCAgZWNobyAkKCggMSA/IDIwICkpICAgICkKKyggIGVjaG8gJCgoIDQgPyAyMCA6ICkpICApCisKKyMgcHJlY2VkZW5jZSBhbmQgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uCitCPTkKK2VjaG8gOSAkQgorCisjIGVycm9yCisoICBlY2hvICQoKCAwICYmIEI9NDIgKSk7IGVjaG8gOSAkQiAgKQorCisjIGVycm9yCisoICBlY2hvICQoKCAxIHx8IEI9ODggKSk7IGVjaG8gOSAkQiAgKQorCisjIGFzaCBtaXN0YWtlbmx5IGV2YWx1YXRlcyBCPS4uLiBiZWxvdworI2FzaCMgZWNobyAwICQoKCAwICYmIChCPTQyKSApKQorZWNobyA5ICRCCisjYXNoIyBlY2hvIDAgJCgoICgkeyR9IC0gJCQpICYmIChCPTQyKSApKQorZWNobyA5ICRCCisjYXNoIyBlY2hvIDEgJCgoIDEgfHwgKEI9ODgpICkpCitlY2hvIDkgJEIKKworCisjIHVudGlsIGNvbW1hbmQgd2l0aCAoKCApKSBjb21tYW5kCit4PTcKKworZWNobyA3ICR4CisjYXNoIyB1bnRpbCAoKCB4ID09IDQgKSkKKyAgICAgIHVudGlsIHRlc3QgIiR4IiA9IDQKK2RvCisJZWNobyAkeAorCXg9NAorZG9uZQorCitlY2hvIDQgJHgKKworIyBleHBvbmVudGlhdGlvbgorZWNobyAzMjc2NyAkKCggMioqMTUgLSAxKSkKK2VjaG8gMzI3NjggJCgoIDIqKigxNi0xKSkpCitlY2hvIDEzMTA3MiAkKCggMioqMTYqMiApKQorZWNobyAyMTQ3NDgzNjQ3ICQoKCAyKiozMS0xKSkKK2VjaG8gMSAkKCggMioqMCApKQorCisjIHtwcmUscG9zdH0te2luYyxkZWN9cmVtZW50IGFuZCBhc3NvY2lhdGVkIGVycm9ycworCit4PTQKKworZWNobyA0ICR4CitlY2hvIDQgJCgoIHgrKyApKQorZWNobyA1ICR4CitlY2hvIDUgJCgoIHgtLSApKQorZWNobyA0ICR4CisKK2VjaG8gMyAkKCggLS14ICkpCitlY2hvIDMgJHgKKworZWNobyA0ICQoKCArK3ggKSkKK2VjaG8gNCAkeAorCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcKKyNhc2gjIGVjaG8gNyAkKCggKys3ICkpCisoICBlY2hvICQoKCA3LS0gKSkgICAgKQorCisoICBlY2hvICQoKCAtLXg9NyApKSAgKQorKCAgZWNobyAkKCggKyt4PTcgKSkgICkKKworKCAgZWNobyAkKCggeCsrPTcgKSkgICkKKyggIGVjaG8gJCgoIHgtLT03ICkpICApCisKK2VjaG8gNCAkeAorCitlY2hvIDcgJCgoICs3ICkpCitlY2hvIC03ICQoKCAtNyApKQorCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcKKyNhc2gjIGVjaG8gJCgoICsrNyApKQorI2FzaCMgZWNobyAkKCggLS03ICkpCisKKyR7VEhJU19TSH0gLi9hcml0aDEuc3ViCiske1RISVNfU0h9IC4vYXJpdGgyLnN1YgorCit4PTQKK3k9NworCisjYXNoIyAoKCB4PTggLCB5PTEyICkpCisgICAgICB4PTgKKyAgICAgIHk9MTIKK2VjaG8gJHggJHkKKworI2FzaCMgIyBzaG91bGQgYmUgYW4gZXJyb3IKKyNhc2gjICgoIHg9OSB5PTQxICkpCisKKyMgVGhlc2UgYXJlIGVycm9ycwordW5zZXQgYgorKCAgZWNobyAkKChhIGIpKSAgKQorI2FzaCMgKChhIGIpKQorCituPTQyCitwcmludGYgIiVkXG4iICRuCitwcmludGYgIiVpXG4iICRuCisjYXNoIyBlY2hvICQoKCA4IyQocHJpbnRmICIlb1xuIiAkbikgKSkKK3ByaW50ZiAiJXVcbiIgJG4KKyNhc2gjIGVjaG8gJCgoIDE2IyQocHJpbnRmICIleFxuIiAkbikgKSkKKyNhc2gjIGVjaG8gJCgoIDE2IyQocHJpbnRmICIlWFxuIiAkbikgKSkKKworIyBjYXVzZXMgbG9uZ2ptcCBib3RjaGVzIHRocm91Z2ggYmFzaC0yLjA1YgorYVtiW2NdZF09ZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgxLnN1YiBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMS5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODBhYTk5OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMS5zdWIKQEAgLTAsMCArMSw0MCBAQAorIyB0ZXN0IG9mIHJlZG9uZSBwb3N0LWluY3JlbWVudCBhbmQgcG9zdC1kZWNyZW1lbnQgY29kZQorKCAgZWNobyAkKCggNC0tICkpICAgKQorKCAgZWNobyAkKCggNCsrICkpICAgKQorKCAgZWNobyAkKCggNCAtLSApKSAgKQorKCAgZWNobyAkKCggNCArKyApKSAgKQorCisjYXNoIyAoKCBhcnJheVswXSsrICkpCisjYXNoIyBlY2hvICR7YXJyYXl9CisKKyNhc2gjICgoIGFycmF5WzBdICsrICkpCisjYXNoIyBlY2hvICR7YXJyYXl9CisKKyNhc2gjICgoIGErKyApKQorI2FzaCMgZWNobyAkYQorI2FzaCMgKCggYSArKyApKQorI2FzaCMgZWNobyAkYQorICAgICAgYT0yCisKK2VjaG8gNiAkKCggYSArKyArIDQgKSkKK2VjaG8gMyAkYQorCitlY2hvIDcgJCgoIGErKys0ICkpCitlY2hvIDQgJGEKKworZWNobyAwICQoKCBhLS0tNCApKQorZWNobyAzICRhCisKK2VjaG8gNyAkKCggYSAtLSArIDQgKSkKK2VjaG8gMiAkYQorCitlY2hvIC0yICQoKCBhIC0tIC0gNCApKQorZWNobyAxICRhCisKKyNhc2gjICgoICsrICsgNyApKQorCisjYXNoIyAoKCArKyApKQorKCAgZWNobyAkKCggKysrNyApKSAgKQorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrICs3IGlzIDcKKyNhc2gjIGVjaG8gJCgoICsrICsgNyApKQorI2FzaCMgKCggLS0gKSkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMi5zdWIgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDIuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3ZTNjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDIuc3ViCkBAIC0wLDAgKzEsNTcgQEAKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKzcgaXMgNyBldGMKKyggIGVjaG8gJCgoIC0tNyApKSAgICkKKyggIGVjaG8gJCgoICsrNyApKSAgICkKKyggIGVjaG8gJCgoIC0tIDcgKSkgICkKKyggIGVjaG8gJCgoICsrIDcgKSkgICkKKworI2FzaCMgKCgrK2FycmF5WzBdICkpCisjYXNoIyBlY2hvIDEgJGFycmF5CisjYXNoIyAoKCArKyBhcnJheVswXSApKQorI2FzaCMgZWNobyAyICRhcnJheQorCisjYXNoIyAoKCArK2EgKSkKKyNhc2gjIGVjaG8gMSAkYQorI2FzaCMgKCggKysgYSApKQorI2FzaCMgZWNobyAyICRhCisKKyNhc2gjICgoIC0tYSApKQorI2FzaCMgZWNobyAxICRhCisjYXNoIyAoKCAtLSBhICkpCisjYXNoIyBlY2hvIDAgJGEKKyAgICAgIGE9MAorCitlY2hvIDUgJCgoIDQgKyArK2EgKSkKK2VjaG8gMSAkYQorCisjIGFzaCBkb2Vzbid0IGhhbmRsZSBpdCByaWdodC4uLgorI2FzaCMgZWNobyA2ICQoKCA0KysrYSApKQorI2FzaCMgZWNobyAyICRhCisgICAgICBhPTIKKworIyBhc2ggZG9lc24ndCBoYW5kbGUgaXQgcmlnaHQuLi4KKyNhc2gjIGVjaG8gMyAkKCggNC0tLWEgKSkKKyNhc2gjIGVjaG8gMSAkYQorICAgICAgYT0xCisKK2VjaG8gNCAkKCggNCAtIC0tIGEgKSkKK2VjaG8gMCAkYQorCisjYXNoIyAoKCAtLSApKQorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0IC0tLTcgaXMgLTcKKyNhc2gjIGVjaG8gJCgoIC0tLTcgKSkKKyggIGVjaG8gJCgoIC0tIC0gNyApKSAgKQorCisjYXNoIyAoKCArKyApKQorIyBiYXNoIDMuMjogNworI2FzaCMgZWNobyA3ICQoKCArKzcgKSkKKyggIGVjaG8gJCgoICsrICsgNyApKSAgKQorCisjIGJhc2ggMy4yOiAtNworI2FzaCMgZWNobyAtNyAkKCggKystNyApKQorIyBiYXNoIDMuMjogLTcKKyNhc2gjIGVjaG8gLTcgJCgoICsrIC0gNyApKQorCisjIGJhc2ggMy4yOiA3CisjYXNoIyBlY2hvIDcgJCgoICstLTcgKSkKKyMgYmFzaCAzLjI6IDcKKyNhc2gjIGVjaG8gNyAkKCggLS0gKyA3ICkpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvYW5kX29yX2FuZF9iYWNrZ3JvdW5kaW5nLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2U2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy5yaWdodApAQCAtMCwwICsxLDQgQEAKK0ZpcnN0CitTZWNvbmQKK1RoaXJkCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvYW5kX29yX2FuZF9iYWNrZ3JvdW5kaW5nLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YWNmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy50ZXN0cwpAQCAtMCwwICsxLDMxIEBACisjIFVORklYRUQgQlVHOiBodXNoIHRoaW5rcyB0aGF0IDsgJiYgfHwgJiBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UuCisjIEFjY29yZGluZyB0byB0aGlzIGRvYywgJiYgfHwgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIDsgJi4KKyMgU2VlIGV4YW1wbGUgYmVsb3cuCisjIFByZWNlZGVuY2Ugb2YgOyBpcyBub3QgYSBwcm9ibGVtIGluIHByYWN0aWNlLiBQcmVjZWRlbmNlIG9mICYgaXMuCisjCisjaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWwKKyMKKyMyLjkuMyBMaXN0cworIworI0FuIEFORC1PUiBsaXN0IGlzIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgcGlwZWxpbmVzIHNlcGFyYXRlZCBieQorI3RoZSBvcGVyYXRvcnMgIiYmIiBhbmQgInx8IiAuCisjCisjQSBsaXN0IGlzIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgQU5ELU9SIGxpc3RzIHNlcGFyYXRlZCBieSB0aGUgb3BlcmF0b3JzCisjJzsnIGFuZCAnJicgYW5kIG9wdGlvbmFsbHkgdGVybWluYXRlZCBieSAnOycsICcmJywgb3IgPG5ld2xpbmU+LgorIworI1RoZSBvcGVyYXRvcnMgIiYmIiBhbmQgInx8IiBzaGFsbCBoYXZlIGVxdWFsIHByZWNlZGVuY2UgYW5kIHNoYWxsIGJlCisjZXZhbHVhdGVkIHdpdGggbGVmdCBhc3NvY2lhdGl2aXR5LiBGb3IgZXhhbXBsZSwgYm90aCBvZiB0aGUgZm9sbG93aW5nCisjY29tbWFuZHMgd3JpdGUgc29sZWx5IGJhciB0byBzdGFuZGFyZCBvdXRwdXQ6CisjCisjICAgIGZhbHNlICYmIGVjaG8gZm9vIHx8IGVjaG8gYmFyCisjICAgIHRydWUgfHwgZWNobyBmb28gJiYgZWNobyBiYXIKKyMKKyNBICc7JyBvciA8bmV3bGluZT4gdGVybWluYXRvciBzaGFsbCBjYXVzZSB0aGUgcHJlY2VkaW5nIEFORC1PUiBsaXN0CisjdG8gYmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5OyBhbiAnJicgc2hhbGwgY2F1c2UgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbgorI29mIHRoZSBwcmVjZWRpbmcgQU5ELU9SIGxpc3QuCisKK2VjaG8gRmlyc3QgJiYgc2xlZXAgMC4yICYmIGVjaG8gVGhpcmQgJgorc2xlZXAgMC4xCitlY2hvIFNlY29uZAord2FpdAorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMmU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvZXhwb3J0X2V4cC5yaWdodApAQCAtMCwwICsxLDcgQEAKK2FhMCBiYjAKK2E9YWEwIGI9YmIwCithYTEgYmIxCithPWFhMSBiPWJiMQorenp6PXp6egoreno9KgorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnRlc3RzLmRpc2FibGVkIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnRlc3RzLmRpc2FibGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTNmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAudGVzdHMuZGlzYWJsZWQKQEAgLTAsMCArMSwyMiBAQAorIyBUaGlzIHRlc3Qgc2hvd3MgYSB2ZXJ5IHNwZWNpYWwgaGFuZGxpbmcgb2YgZXhwb3J0IGFuZCBsb2NhbAorIyBidWlsdGlucyBieSBiYXNoLgorCit2PSJhPWFhMCBiPWJiMCIKKyMgb25seSAxc3QgYXJnIHNob3VsZCBiZSBleHBhbmRlZCBpbiBtdWx0aXBsZSB3b3JkcworZXhwb3J0ICR2IGM9JHYKK2VjaG8gJGEgJGIKK2VjaG8gJGMKKworIyBvbmx5IDFzdCBhcmcgc2hvdWxkIGJlIGV4cGFuZGVkIGluIG11bHRpcGxlIHdvcmRzCitleHBvcnQgYGVjaG8gYT1hYTEgYj1iYjFgIGM9YGVjaG8gYT1hYTEgYj1iYjFgCitlY2hvICRhICRiCitlY2hvICRjCisKKz56ej16egorPnp6ej16enoKKyMgb25seSAxc3QgYXJnIHNob3VsZCBiZSBnbG9iYmVkCitleHBvcnQgenp6KiB6ej0qCitlbnYgfCBncmVwIF56eiB8IHNvcnQKK3JtIC1yZiB6ej16eiB6eno9enp6CisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9iYXNoX2JyYWNlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzNjVjOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEucmlnaHQKQEAgLTAsMCArMSw0IEBACitiYXNoX2JyYWNlMS50ZXN0cworKntiLGJ9cmFjZTEudCoKK2Jhc2hfYnJhY2UxLnRlc3RzIGJhc2hfYnJhY2UxLnRlc3RzCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2Jhc2hfYnJhY2UxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9iYXNoX2JyYWNlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjJmMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9iYXNoX2JyYWNlMS50ZXN0cwpAQCAtMCwwICsxLDEwIEBACisjIHVucXVvdGVkICR2IHNob3VsZCBiZSBnbG9iYmVkOgordj0nKmJyYWNlMS50Kic7IGVjaG8gJHYKKworIyAuLi5idXQgbm90IGJyYWNlIGV4cGFuZGVkOgordj0nKntiLGJ9cmFjZTEudConOyBlY2hvICR2CisKKyMgd2hlcmVhcyBkaXJlY3QgYnJjZXMgYXJlIGV4cGFuZGVkOgorZWNobyAqe2IsYn1yYWNlMS50KgorCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjlhYjRlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMS5yaWdodApAQCAtMCwwICsxLDIgQEAKK2dsb2IxLnRlc3RzCitnbG9iMS50ZXN0cwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjk4MGNlMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEudGVzdHMKQEAgLTAsMCArMSwyIEBACitlY2hvICpnbG9iMT90W2Vdc3RzKgorZWNobyAiZ2xvYjEiPyd0J1tlXXMqCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTcwYzIyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi5yaWdodApAQCAtMCwwICsxLDE4IEBACitFeHBlY3RlZCBBY3R1YWwKK1pcKiAgICA6IFpcKgorWiogICAgIDogWioKK1pcZiAgICA6IFpcZgorWlwqICAgIDogWlwqCisKK1pceiAgICA6IFpcegorWnogICAgIDogWnoKK1pceiAgICA6IFpcegorWlx6ICAgIDogWlx6CisKK1pcICAgICA6IFpcCitaXCAgICAgOiBaXAorCitaXGYgWmYgOiBaXGYgWmYKK1pcZiBaZiA6IFpcZiBaZgorCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZGJjOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi50ZXN0cwpAQCAtMCwwICsxLDI3IEBACisjIFRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgdGhhdCBpbiB1bnF1b3RlZCAkdiwgYmFja3NsYXNoZXMgZXhwYW5kIGJ5IHRoaXMgcnVsZToKKyMgXHogLT4gXFxcejsgXDxlb2w+IC0+IFxcPGVvbD4gKGZvciBhbnkgeiwgc3BlY2lhbCBvciBub3QpLAorIyBhbmQgc3Vic2VxdWVudGx5IGdsb2JiaW5nIGNvbnZlcnRzIFxcIHRvIFwgYW5kIHRyZWF0cyBceiBhcyBsaXRlcmFsIHoKKyMgZXZlbiBpZiBpdCBpcyBhIHNwZWNpYWwgY2hhci4KKworPidaZicKKz4nWlxmJworCWVjaG8gJ0V4cGVjdGVkJyAnQWN0dWFsJwordj0nXConOyBlY2hvICdaXCogICAgOicgWiR2CisgICAgICAgIGVjaG8gJ1oqICAgICA6JyBaXCoKKyAgICAgICAgZWNobyAnWlxmICAgIDonIFpcXCoKKyAgICAgICAgZWNobyAnWlwqICAgIDonIFpcXFwqICAjIE5CISBvbmx5IHRoaXMgbWF0Y2hlcyBaJHYgb3V0cHV0CitlY2hvCit2PSdceic7IGVjaG8gJ1pceiAgICA6JyBaJHYKKyAgICAgICAgZWNobyAnWnogICAgIDonIFpcegorICAgICAgICBlY2hvICdaXHogICAgOicgWlxcegorICAgICAgICBlY2hvICdaXHogICAgOicgWlxcXHoKK2VjaG8KK3Y9J1wnOyAgZWNobyAnWlwgICAgIDonIFokdgorICAgICAgICBlY2hvICdaXCAgICAgOicgWlxcCitlY2hvCit2PScqJzsgIGVjaG8gJ1pcZiBaZiA6JyBaJHYKKyAgICAgICAgZWNobyAnWlxmIFpmIDonIFoqCitlY2hvCisKK3JtICdaXGYnICdaZicKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX2FuZF9hc3NpZ24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2ZTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorWlZBUj16LnRtcCBaVkFSPSoudG1wIFpWQVI9W3pdLnRtcAorWlZBUj16LnRtcCBaVkFSPSoudG1wIFpWQVI9W3pdLnRtcAorKi50bXAKK1pWQVI9ei50bXAgei50bXAKK1pWQVI9ei50bXAgWlZBUj0qLnRtcCBaVkFSPVt6XS50bXAKK1pWQVI9ei50bXAgWlZBUj0qLnRtcCBaVkFSPVt6XS50bXAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX2FuZF9hc3NpZ24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGIxNThmMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKKz5aVkFSPXoudG1wCis+ei50bXAKK1pWQVI9Ki50bXAgZWNobyBaVkFSPSoudG1wICJaVkFSPSoudG1wIiAiWlZBUj1bel0udG1wIgorWlZBUj0qLnRtcCAvYmluL2VjaG8gWlZBUj0qLnRtcCAiWlZBUj0qLnRtcCIgIlpWQVI9W3pdLnRtcCIKK1pWQVI9Ki50bXAKK2VjaG8gIiRaVkFSIgorZWNobyAkWlZBUgorZWNobyBaVkFSPSoudG1wICJaVkFSPSoudG1wIiAiWlZBUj1bel0udG1wIgorL2Jpbi9lY2hvIFpWQVI9Ki50bXAgIlpWQVI9Ki50bXAiICJaVkFSPVt6XS50bXAiCitybSBaVkFSPXoudG1wIHoudG1wCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfcmVkaXIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2JfcmVkaXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMDMwOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9yZWRpci5yaWdodApAQCAtMCwwICsxLDIgQEAKK3oudG1wOgorPy50bXA6IFRFU1QKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9yZWRpci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9yZWRpci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MjFkMTIwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX3JlZGlyLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorIyBSZWRpcmVjdGlvbnMgYXJlIG5vdCBnbG9iYmVkLgorIyBiYXNoOgorIyBpZiBydW4gYXMgInNoIiwgdGhleSBhcmUgbm90IGdsb2JiZWQsIGJ1dAorIyBpZiBydW4gYXMgImJhc2giLCB0aGV5IGFyZSEKKz56LnRtcAorZWNobyBURVNUID4/LnRtcAorZWNobyAnei50bXA6JyBgY2F0ICd6LnRtcCdgCitlY2hvICc/LnRtcDonIGBjYXQgJz8udG1wJ2AKK3JtICd6LnRtcCcgJz8udG1wJwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbGVhay9sZWFrX2FyZ3YxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbGVhay9sZWFrX2FyZ3YxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGQ2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1sZWFrL2xlYWtfYXJndjEucmlnaHQKQEAgLTAsMCArMSwyIEBACitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1sZWFrL2xlYWtfYXJndjEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1sZWFrL2xlYWtfYXJndjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmIzNzFiYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWxlYWsvbGVha19hcmd2MS50ZXN0cwpAQCAtMCwwICsxLDgwIEBACisjIFdhcm0gdXAKK2k9MQord2hpbGUgdGVzdCAkaSAhPSBYOyBkbworICAgIHNldCAtLSBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHoKKyAgICBzaGlmdAorICAgIHNoaWZ0IDIKKyAgICBzaGlmdCA1CisgICAgc2hpZnQgMTEKKyAgICBzZXQgLS0gQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaCisgICAgc2hpZnQgMworICAgIHNoaWZ0IDcKKyAgICBpPTEkaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOyB0aGVuIGk9MjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjsgdGhlbiBpPTM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTM7IHRoZW4gaT00OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE0OyB0aGVuIGk9NTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTsgdGhlbiBpPTY7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTY7IHRoZW4gaT03OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE3OyB0aGVuIGk9ODsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExODsgdGhlbiBpPTk7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTk7IHRoZW4gaT1hOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFhOyB0aGVuIGk9YjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYjsgdGhlbiBpPWM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWM7IHRoZW4gaT1kOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFkOyB0aGVuIGk9ZTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZTsgdGhlbiBpPWY7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWY7IHRoZW4gaT1nOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFnOyB0aGVuIGk9aDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExaDsgdGhlbiBpPWk7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWk7IHRoZW4gaT1qOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFqOyB0aGVuIGk9WDsgZmkKK2RvbmUKKwordW5zZXQgaQorc2V0IC0tCittZW1sZWFrCisKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKK2k9MQord2hpbGUgdGVzdCAkaSAhPSBYOyBkbworICAgIHNldCAtLSBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHoKKyAgICBzaGlmdAorICAgIHNoaWZ0IDIKKyAgICBzaGlmdCA1CisgICAgc2hpZnQgMTEKKyAgICBzZXQgLS0gQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaCisgICAgc2hpZnQgMworICAgIHNoaWZ0IDcKKyAgICBpPTEkaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOyB0aGVuIGk9MjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjsgdGhlbiBpPTM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTM7IHRoZW4gaT00OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE0OyB0aGVuIGk9NTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTsgdGhlbiBpPTY7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTY7IHRoZW4gaT03OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE3OyB0aGVuIGk9ODsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExODsgdGhlbiBpPTk7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTk7IHRoZW4gaT1hOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFhOyB0aGVuIGk9YjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYjsgdGhlbiBpPWM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWM7IHRoZW4gaT1kOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFkOyB0aGVuIGk9ZTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZTsgdGhlbiBpPWY7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWY7IHRoZW4gaT1nOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFnOyB0aGVuIGk9aDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExaDsgdGhlbiBpPWk7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWk7IHRoZW4gaT1qOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFqOyB0aGVuIGk9WDsgZmkKK2RvbmUKKwordW5zZXQgaQorc2V0IC0tCittZW1sZWFrCisKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sgIyRrYgorZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2FuZC1vci5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYW5kLW9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZmE1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2FuZC1vci5yaWdodApAQCAtMCwwICsxLDE4IEBACithMQorYTQKK2IxCitiMworYjQKK2I2CitjNAorYzUKK2M3CitjOAorZmYxCitmZjMKK2Z0MgorZnQzCit0ZjIKK3RmMwordHQyCit0dDQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYW5kLW9yLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hbmQtb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg1NDU4YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYW5kLW9yLnRlc3RzCkBAIC0wLDAgKzEsMzQgQEAKK2ZhbHNlIHx8IGVjaG8gYTEKK2ZhbHNlICYmIGVjaG8gYTIKK3RydWUgfHwgZWNobyBhMwordHJ1ZSAmJiBlY2hvIGE0CisKK2ZhbHNlIHx8IGVjaG8gYjEgfHwgZWNobyBiMgorZmFsc2UgfHwgZWNobyBiMyAmJiBlY2hvIGI0CitmYWxzZSAmJiBlY2hvIGI1IHx8IGVjaG8gYjYKK2ZhbHNlICYmIGVjaG8gYjcgJiYgZWNobyBiOAorCit0cnVlIHx8IGVjaG8gYzEgfHwgZWNobyBjMgordHJ1ZSB8fCBlY2hvIGMzICYmIGVjaG8gYzQKK3RydWUgJiYgZWNobyBjNSB8fCBlY2hvIGM2Cit0cnVlICYmIGVjaG8gYzcgJiYgZWNobyBjOAorCitmYWxzZSB8fCBmYWxzZSB8fCBlY2hvIGZmMQorZmFsc2UgfHwgZmFsc2UgJiYgZWNobyBmZjIKK2ZhbHNlICYmIGZhbHNlIHx8IGVjaG8gZmYzCitmYWxzZSAmJiBmYWxzZSAmJiBlY2hvIGZmNAorCitmYWxzZSB8fCB0cnVlIHx8IGVjaG8gZnQxCitmYWxzZSB8fCB0cnVlICYmIGVjaG8gZnQyCitmYWxzZSAmJiB0cnVlIHx8IGVjaG8gZnQzCitmYWxzZSAmJiB0cnVlICYmIGVjaG8gZnQ0CisKK3RydWUgfHwgZmFsc2UgfHwgZWNobyB0ZjEKK3RydWUgfHwgZmFsc2UgJiYgZWNobyB0ZjIKK3RydWUgJiYgZmFsc2UgfHwgZWNobyB0ZjMKK3RydWUgJiYgZmFsc2UgJiYgZWNobyB0ZjQKKwordHJ1ZSB8fCB0cnVlIHx8IGVjaG8gdHQxCit0cnVlIHx8IHRydWUgJiYgZWNobyB0dDIKK3RydWUgJiYgdHJ1ZSB8fCBlY2hvIHR0MwordHJ1ZSAmJiB0cnVlICYmIGVjaG8gdHQ0CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGExM2QzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50MS5yaWdodApAQCAtMCwwICsxLDkgQEAKK2lmMTowCit3aGlsZTE6MAordW50aWwxOjAKK2lmMjowCit3aGlsZTI6MAordW50aWwyOjAKK2lmMzowCit3aGlsZTM6MAordW50aWwzOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAzM2IzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQxLnRlc3RzCkBAIC0wLDAgKzEsNDIgQEAKKyMgQXNzaWdubWVudHMgYWZ0ZXIgc29tZSBrZXl3b3JkcyBzaG91bGQgc3RpbGwgd29yaworCitpZiBhPTEgdHJ1ZTsgdGhlbiBhPTEgdHJ1ZTsgZWxpZiBhPTEgdHJ1ZTsgdGhlbiBhPTEgdHJ1ZTsgZWxzZSBhPTEgdHJ1ZTsgZmkKK2VjaG8gaWYxOiQ/Cit3aGlsZSBhPTEgdHJ1ZTsgZG8gYT0xIHRydWU7IGJyZWFrOyBkb25lCitlY2hvIHdoaWxlMTokPwordW50aWwgYT0xIGZhbHNlOyBkbyBhPTEgdHJ1ZTsgYnJlYWs7IGRvbmUKK2VjaG8gdW50aWwxOiQ/CisKK2lmIGE9MSB0cnVlCisgdGhlbiBhPTEgdHJ1ZQorIGVsaWYgYT0xIHRydWUKKyB0aGVuIGE9MSB0cnVlCisgZWxzZSBhPTEgdHJ1ZQorIGZpCitlY2hvIGlmMjokPword2hpbGUgYT0xIHRydWUKKyBkbyBhPTEgdHJ1ZQorIGJyZWFrCisgZG9uZQorZWNobyB3aGlsZTI6JD8KK3VudGlsIGE9MSBmYWxzZQorIGRvIGE9MSB0cnVlCisgYnJlYWsKKyBkb25lCitlY2hvIHVudGlsMjokPworCitpZgorIGE9MSB0cnVlOyB0aGVuCisgYT0xIHRydWU7IGVsaWYKKyBhPTEgdHJ1ZTsgdGhlbgorIGE9MSB0cnVlOyBlbHNlCisgYT0xIHRydWU7IGZpCitlY2hvIGlmMzokPword2hpbGUKKyBhPTEgdHJ1ZTsgZG8KKyBhPTEgdHJ1ZTsgYnJlYWs7IGRvbmUKK2VjaG8gd2hpbGUzOiQ/Cit1bnRpbAorIGE9MSBmYWxzZTsgZG8KKyBhPTEgdHJ1ZTsgYnJlYWs7IGRvbmUKK2VjaG8gdW50aWwzOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQyLnJpZ3RoIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50Mi5yaWd0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE1NTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50Mi5yaWd0aApAQCAtMCwwICsxLDIgQEAKK2h1c2g6IGNhbid0IGV4ZWMgJ2E9Yic6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0MGUwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQyLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorIyBUaGlzIG11c3Qgbm90IGJlIGludGVycHJldGVkIGFzIGFuIGFzc2lnbm1lbnQKK2EnJz1iIHRydWUKK2VjaG8gJD8KKyMgKGJ1Z2xldDogJD8gc2hvdWxkIGJlIDEyNy4gaXQgaXMgY3VycmVudGx5IDEpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50My5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAyZDdjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50My5yaWdodApAQCAtMCwwICsxLDIgQEAKK0RvbmU6MAorYWJjPTEyMwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50My50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzkwMTI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDMudGVzdHMKQEAgLTAsMCArMSw1IEBACisjIFRoaXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBhc3NpZ25tZW50cworYT0xIGJcCis9MiBjPTMKK2VjaG8gRG9uZTokPworZWNobyBhYmM9JGEkYiRjCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQ0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50NC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWM4OTZmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9hc3NpZ25tZW50NC5yaWdodApAQCAtMCwwICsxIEBACitEb25lOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYXNzaWdubWVudDQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQ0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmNDZkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Fzc2lnbm1lbnQ0LnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyBUaGVyZSB3YXMgYSBidWcgd2hlcmUgd2UgbWlzaW50ZXJwcmV0ZWQgYXNzaWdubWVudHMgYWZ0ZXIgJ2RvJzoKK2ZvciBpIGluIDE7IGRvIGV2YWwgYj07IGRvbmUKK2VjaG8gRG9uZTokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE0YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazEucmlnaHQKQEAgLTAsMCArMSwyIEBACitBCitPSzowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWsxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhNmIwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3doaWxlIHRydWU7IGRvIGVjaG8gQTsgYnJlYWs7IGVjaG8gQjsgZG9uZQorZWNobyBPSzokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE1Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazIucmlnaHQKQEAgLTAsMCArMSwzIEBACitBCitBQQorT0s6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZGE5ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazIudGVzdHMKQEAgLTAsMCArMSw2IEBACit3aGlsZSB0cnVlOyBkbworICAgIGVjaG8gQQorICAgIHdoaWxlIHRydWU7IGRvIGVjaG8gQUE7IGJyZWFrIDI7IGVjaG8gQkI7IGRvbmUKKyAgICBlY2hvIEIKK2RvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWszLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhNGIxNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWszLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorQQorT0s6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTM4ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazMudGVzdHMKQEAgLTAsMCArMSwyIEBACit2PWJyZWFrOyB3aGlsZSB0cnVlOyBkbyBlY2hvIEE7ICR2OyBlY2hvIEI7IGJyZWFrOyBlY2hvIEM7IGRvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0MWMxNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs0LnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorQQorQUEKK1RSVUUKK0EKK0FBCitPSzowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3ZGEyODgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2JyZWFrNC50ZXN0cwpAQCAtMCwwICsxLDEyIEBACitjb25kPXRydWUKK3doaWxlICRjb25kOyBkbworICAgIGVjaG8gQQorICAgIGlmIHRlc3QgIiRjb25kIiA9IHRydWU7IHRoZW4KKwljb25kPSdlY2hvIFRSVUUnCisgICAgZWxzZQorCWNvbmQ9ZmFsc2UKKyAgICBmaQorICAgIHdoaWxlIHRydWU7IGRvIGVjaG8gQUE7IGNvbnRpbnVlIDI7IGVjaG8gQkI7IGRvbmUKKyAgICBlY2hvIEIKK2RvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs1LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5ZGYyYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs1LnJpZ2h0CkBAIC0wLDAgKzEsMTMgQEAKK0EKK0IKKzAKK0E6YQorQgorRAorQTpiCitCCitECitBOmMKK0IKK0QKKzAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs1LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9icmVhazUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjczZTA0MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnJlYWs1LnRlc3RzCkBAIC0wLDAgKzEsNCBAQAord2hpbGUgdHJ1ZTsgZG8gZWNobyBBOyB7IGVjaG8gQjsgYnJlYWs7IGVjaG8gQzsgfTsgZWNobyBEOyBkb25lCitlY2hvICQ/Citmb3IgdiBpbiBhIGIgYzsgZG8gZWNobyBBOiR2OyAoZWNobyBCOyBicmVhazsgZWNobyBDKTsgZWNobyBEOyBkb25lCitlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2J1aWx0aW4xLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9idWlsdGluMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTU1ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9idWlsdGluMS5yaWdodApAQCAtMCwwICsxLDIgQEAKK1ZBUklBQkxFPWV4cG9ydAorT0s6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9idWlsdGluMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnVpbHRpbjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWEyOTQxZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvYnVpbHRpbjEudGVzdHMKQEAgLTAsMCArMSw2IEBACisjIGJ1aWx0aW5zLCB1bmxpa2Uga2V5d29yZHMgbGlrZSAid2hpbGUiLCBjYW4gYmUgY29uc3RydWN0ZWQKKyMgd2l0aCBzdWJzdGl0dXRpb25zCitWQVJJQUJMRT1leHBvcnQKKyRWQVJJQUJMRSBWQVJJQUJMRQorZW52IHwgZ3JlcCBeVkFSSUFCTEUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY2FzZTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Nhc2UxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmIyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Nhc2UxLnJpZ2h0CkBAIC0wLDAgKzEsMjIgQEAKK09LXzEKK09LXzEKK09LXzIxCitPS18yMgorT0tfMjMKK09LXzMxCitPS18zMgorT0tfNDEKK09LXzQyCitPS180MworT0tfNDQKK09LXzUxCitPS181MgorT0tfNTMKK09LX3N1YjEKK09LX3N1YjIKK09LX3N1YjMKK09LX3N1YjQKK09LX3N1YjUKK09LX3N1YjYKK09LX2VzYWMxCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Nhc2UxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jYXNlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzJiNTdmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jYXNlMS50ZXN0cwpAQCAtMCwwICsxLDQwIEBACitjYXNlIHcgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBPS18xOzsgdykgZWNobyBXUk9ORzs7IGVzYWMKKworY2FzZSB3IGluCisgYSkgZWNobyBTS0lQOzsKKyB3KWVjaG8gT0tfMSA7OworIHcpCisgZWNobyBXUk9ORworIDs7Citlc2FjCisKK3Q9dworY2FzZSAkdCBpbiBhKSBlY2hvIFNLSVA7OyB3KSBlY2hvIE9LXzIxOzsgdykgZWNobyBXUk9ORzs7IGVzYWM7CitjYXNlICIkdCIgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBPS18yMjs7IHcpIGVjaG8gV1JPTkc7OyBlc2FjOworY2FzZSB3IGluIGEpIGVjaG8gU0tJUDs7ICR0KSBlY2hvIE9LXzIzOzsgIiR0IikgZWNobyBXUk9ORzs7IGVzYWM7CisKK2Nhc2UgJycgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBXUk9ORzs7ICopIGVjaG8gT0tfMzE7OyBlc2FjOworY2FzZSAnJyBpbiBhKSBlY2hvIFNLSVA7OyAnJykgZWNobyBPS18zMjs7ICopIGVjaG8gV1JPTkc7OyBlc2FjOworCitjYXNlIGBlY2hvIHdgIGluIGEpIGVjaG8gU0tJUDs7IHcpIGVjaG8gT0tfNDE7OyB3KSBlY2hvIFdST05HOzsgZXNhYzsKK2Nhc2UgImBlY2hvIHdgIiBpbiBhKSBlY2hvIFNLSVA7OyB3KSBlY2hvIE9LXzQyOzsgdykgZWNobyBXUk9ORzs7IGVzYWM7CitjYXNlIGBlY2hvIHcgd2AgaW4gYSkgZWNobyBTS0lQOzsgdykgZWNobyBXUk9ORzs7ICd3IHcnKSBlY2hvIE9LXzQzOzsgZXNhYzsKK2Nhc2UgYGVjaG8gdyB3YCBpbiBhKSBlY2hvIFNLSVA7OyB3KSBlY2hvIFdST05HOzsgdyopIGVjaG8gT0tfNDQ7OyBlc2FjOworCitjYXNlIHcgaW4gYGVjaG8gd2ApIGVjaG8gT0tfNTE7OyBgZWNobyBXUk9ORyA+JjJgdykgZWNobyBXUk9ORzs7IGVzYWM7CitjYXNlIHcgaW4gYGVjaG8gT0tfNTIgPiYyYCkgZWNobyBTS0lQOzsgYGVjaG9gdykgZWNobyBPS181Mzs7IGVzYWM7CisKKyMgcGFyc2luZyBjYXNlcyBpbiBzdWJzaGVsbHMgY2FuIGVhc2lseSBnZXQgbWVzc3kKKyBjYXNlIG0gaW4gIG0pIGVjaG8gT0tfc3ViMTs7IGVzYWMKKyBjYXNlIG0gaW4gKG0pIGVjaG8gT0tfc3ViMjs7IGVzYWMKKyhjYXNlIG0gaW4gIG0pIGVjaG8gT0tfc3ViMzs7IGVzYWMpCisoY2FzZSBtIGluIChtKSBlY2hvIE9LX3N1YjQ7OyBlc2FjKQorKAorIGNhc2UgbSBpbiAgbSkgZWNobyBPS19zdWI1OzsgZXNhYworKQorKAorIGNhc2UgbSBpbiAobSkgZWNobyBPS19zdWI2OzsgZXNhYworKQorKGNhc2UgZXNhYyBpbiAiZXNhYyIpIGVjaG8gT0tfZXNhYzE7OyBlc2FjKQorCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29sb24ucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbG9uLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODdkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbG9uLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMAorT0s6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29sb24udGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbG9uLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiOGFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbG9uLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorZmFsc2UKKzoKK2VjaG8gJD8KKyh3aGlsZSA6OyBkbyBleGl0OyBkb25lKQorZWNobyBPSzogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29tcG91bmQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbXBvdW5kLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2Q0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbXBvdW5kLnJpZ2h0CkBAIC0wLDAgKzEsMTQgQEAKK25ldyBncm91cAorMAorMQorMgorMworNAorNQorNgorbmV3IGdyb3VwCituZXcgZ3JvdXAKKzAKKzEKKzIKKzMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29tcG91bmQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbXBvdW5kLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1ZTg1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbXBvdW5kLnRlc3RzCkBAIC0wLDAgKzEsMjEgQEAKK2VjaG8gbmV3IGdyb3VwCitlY2hvIDA7ICB7IDo7IH0KK2VjaG8gMTsgIHsgOiA7fQorZWNobyAyOyAoeyA6OyB9KQorZWNobyAzOyAoeyA6IDt9KQorZWNobyA0OyAgKCA6ICApCitlY2hvIDU7ICAoIDo7ICkKK2VjaG8gNjsgICggOiA7KQorIyBub3Qgc3VyZSBpZiBQT1NJWCByZXF1aXJlcyB0aGVzZSwgYnV0IGJhc2ggYWNjZXB0cyB0aGVtIC4uLgorI2VjaG8gNzsgeyggOiAgKX0KKyNlY2hvIDg7IHsoIDo7ICl9CisjZWNobyA5OyB7KCA6IDspfQorCitlY2hvIG5ldyBncm91cAorI2VjaG8gMDsgIHsoOik7fQorCitlY2hvIG5ldyBncm91cAorZWNobyAwOyAgKDopCitlY2hvIDE7ICAoOjspCitlY2hvIDI7ICAoOik7CitlY2hvIDM7ICAoOjspOwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE1NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTEucmlnaHQKQEAgLTAsMCArMSw4IEBACitBOmEKK0E6YgorQTpjCitPSzEKK0E6YQorQTpiCitBOmMKK09LMgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MmQzNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTEudGVzdHMKQEAgLTAsMCArMSw0IEBACitmb3IgdiBpbiBhIGIgYzsgZG8gZWNobyBBOiR2OyBjb250aW51ZSA2NjY7IGRvbmUKK2VjaG8gT0sxCitmb3IgdiBpbiBhIGIgYzsgZG8gZWNobyBBOiR2OyBjb250aW51ZSA2NjY7IGRvbmUKK2VjaG8gT0syCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDNlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMi5yaWdodApAQCAtMCwwICsxIEBACitPazoxCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyZGYwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2U9JycKKyh3aGlsZSB0ZXN0ICRlICYmIGV4aXQgMTsgdHJ1ZTsgZG8gZT0xOyBjb250aW51ZTsgZG9uZSkKK2VjaG8gT2s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0N2QwZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvY29udGludWUzLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMAorMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2NvbnRpbnVlMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWZmODY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9jb250aW51ZTMudGVzdHMKQEAgLTAsMCArMSwzIEBACisjIFRlc3QgdGhhdCAiY29udGludWUiIGRvZXMgYWZmZWN0IGV4aXRjb2RlIChzZXRzIHRvIDApCitlPScnCit3aGlsZSBlY2hvICQ/OyB0ZXN0ICRlICYmIGV4aXQ7IHRydWU7IGRvIGU9MTsgZmFsc2U7IGNvbnRpbnVlOyBkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYWQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZWNob193cml0ZV9lcnJvci5yaWdodApAQCAtMCwwICsxLDIgQEAKK2h1c2g6IHdyaXRlIGVycm9yOiBCcm9rZW4gcGlwZQorT2s6IDEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZWNob193cml0ZV9lcnJvci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZWNob193cml0ZV9lcnJvci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTQwYzlmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAordHJhcCAiIiBQSVBFCisKK3sKK3NsZWVwIDEKK2VjaG8gQ2FudCB3cml0ZSB0aGlzIC0gZ2V0IEVQSVBFCitlY2hvIE9rOiAkPyA+JjIKK30gfCB7IHRydWU7IH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfYXJncy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfYXJncy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGVkOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9hcmdzLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorTnVsbCAwdGggYXJnOgoraHVzaDogY2FuJ3QgZXhlY3V0ZSAnJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMTI3CitOdWxsIDFzdCBhcmc6CiswCitOdWxsIGFyZyBpbiBleGVjOgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9hcmdzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9hcmdzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmY2U1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2FyZ3MudGVzdHMKQEAgLTAsMCArMSw5IEBACitlY2hvIE51bGwgMHRoIGFyZzoKKyIiCitlY2hvICQ/CitlY2hvIE51bGwgMXN0IGFyZzoKKyMgcHJpbnRmIHdpdGhvdXQgYXJncyB3b3VsZCBwcmludCB1c2FnZSBpbmZvCitwcmludGYgIiIKK2VjaG8gJD8KK2VjaG8gTnVsbCBhcmcgaW4gZXhlYzoKK2V4ZWMgcHJpbnRmICIiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2Zvci5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2Zvci5yaWdodApAQCAtMCwwICsxIEBACitPSzogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2VtcHR5X2Zvci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wY2I1MmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IudGVzdHMKQEAgLTAsMCArMSwzIEBACitmYWxzZQorZm9yIGEgaW47IGRvIGVjaG8gIkhFTExPIjsgZG9uZQorZWNobyBPSzogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWNlZTllCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IyLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorUEFSQU06YWJjCitQQVJBTTpkIGUKK1BBUkFNOjEyMworT0s6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW1wdHlfZm9yMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjEyZWMyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbXB0eV9mb3IyLnRlc3RzCkBAIC0wLDAgKzEsNiBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgJDAgYWJjICJkIGUiIDEyMworZmkKK2ZhbHNlCitmb3IgdjsgZG8gZWNobyAiUEFSQU06JHYiOyBkb25lCitlY2hvIE9LOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbnZfYW5kX2Z1bmMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Vudl9hbmRfZnVuYy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE1NDUwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9lbnZfYW5kX2Z1bmMucmlnaHQKQEAgLTAsMCArMSwyIEBACit2YXI9dmFsCit2YXI9b2xkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Vudl9hbmRfZnVuYy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZW52X2FuZF9mdW5jLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkNGVhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Vudl9hbmRfZnVuYy50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK3Zhcj1vbGQKK2YoKSB7IGVjaG8gInZhcj0kdmFyIjsgfQordmFyPXZhbCBmCitlY2hvICJ2YXI9JHZhciIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhlYy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhlYy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRlNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leGVjLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorcGFzcyBmZCBvdXQgb3BlbgorcGFzcyBmZCBvdXQgZHVwCitwYXNzIGZkIG91dCBjbG9zZQorcGFzcyBmZCBpbiBvcGVuCitwYXNzIGZkIGluIGR1cAorcGFzcyBmZCBpbiBjbG9zZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leGVjLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leGVjLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkZTUwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4ZWMudGVzdHMKQEAgLTAsMCArMSwzMCBAQAorIyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHdheSBvZiBjaGVja2luZyB0aGVzZSB0aGluZ3MKK2NkIC9wcm9jLyQkL2ZkIHx8IGNkIC9kZXYvZmQgfHwgZXhpdCAxCisKK1sgLWUgNDQgXSAmJiBleGl0IDEKK2V4ZWMgNDQ+L2Rldi9udWxsCitbIC1lIDQ0IF0gfHwgZXhpdCAxCitlY2hvIHBhc3MgZmQgb3V0IG9wZW4KKworWyAtZSA1NSBdICYmIGV4aXQgMQorZXhlYyA1NT4mNDQKK1sgLWUgNTUgXSB8fCBleGl0IDEKK2VjaG8gcGFzcyBmZCBvdXQgZHVwCisKK2V4ZWMgNDQ+Ji0KK1sgLWUgNDQgXSAmJiBleGl0IDEKK2VjaG8gcGFzcyBmZCBvdXQgY2xvc2UKKworWyAtZSA2NiBdICYmIGV4aXQgMQorZXhlYyA2NjwvZGV2L251bGwKK1sgLWUgNjYgXSB8fCBleGl0IDEKK2VjaG8gcGFzcyBmZCBpbiBvcGVuCisKK1sgLWUgNzcgXSAmJiBleGl0IDEKK2V4ZWMgNzc8JjY2CitbIC1lIDc3IF0gfHwgZXhpdCAxCitlY2hvIHBhc3MgZmQgaW4gZHVwCisKK2V4ZWMgNjY8Ji0KK1sgLWUgNjYgXSAmJiBleGl0IDEKK2VjaG8gcGFzcyBmZCBpbiBjbG9zZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leGl0MS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhpdDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyY2ZjMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhpdDEucmlnaHQKQEAgLTAsMCArMSBAQAorT25jZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leGl0MS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhpdDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDFlMGQwOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhpdDEudGVzdHMKQEAgLTAsMCArMSw0IEBACit0cmFwICJlY2hvIE5vdCBzaG93biIgRVhJVAorKGV4aXQpICAjIG11c3QgYmUgc2lsZW50Cit0cmFwICJlY2hvIE9uY2U7IGV4aXQiIEVYSVQKK3sgZXhpdDsgfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQtbi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LW4ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1NWJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LW4ucmlnaHQKQEAgLTAsMCArMSwxMCBAQAorZXhwb3J0IGFhYTE9IicnJyIKK2V4cG9ydCBhYWEyPScnCitleHBvcnQgYWFhMz0iJycnIidhYmMnCitleHBvcnQgYWFhOD0nOCcKK2FhYTk9OQorYWFhMTA9MTAKK05vdGhpbmc6CitOb3RoaW5nOgorTm90aGluZzoKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LW4udGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC1uLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyNTJhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC1uLnRlc3RzCkBAIC0wLDAgKzEsMzcgQEAKK2V4cG9ydCBhYWExPSInJyciCitleHBvcnQgYWFhMj0iIgorZXhwb3J0IGFhYTM9IicnJ2FiYyIKK2V4cG9ydCB8IGdyZXAgYWFhLj0KKworZXhwb3J0IC1uIGFhYTEKK3Vuc2V0IGFhYTI7IGV4cG9ydCAtbiBhYWEyPSJnaGkiCitleHBvcnQgLW4gYWFhMz0ia2xtIgorZXhwb3J0IHwgZ3JlcCBhYWEuPQorCitleHBvcnQgYWFhND00IGFhYTU9NQorZXhwb3J0IC1uIGFhYTQ9NG4KK2V4cG9ydCAtbiBhYWE1CitleHBvcnQgfCBncmVwIGFhYS49CisKK2V4cG9ydCBhYWE1PTUgYWFhNj02IGFhYTc9NyBhYWE4PTgKK2V4cG9ydCAtbiBhYWE1IGFhYTY9Nm4gYWFhNworZXhwb3J0IHwgZ3JlcCBhYWEuPQorCithYWE5PTkKK2V4cG9ydCAtbiBhYWE5CitzZXQgfCBncmVwIF5hYWE5PQorCitleHBvcnQgYWFhMTA9MTAKK2V4cG9ydCAtbiBhYWExMAorc2V0IHwgZ3JlcCBeYWFhMTA9CisKKworZXhwb3J0IEVYUE9SVEVEPXF3ZQorZXhwb3J0IC1ubm5ubm4gbm5ubm5uOyBlY2hvICJOb3RoaW5nOiI7IGVudiB8IGdyZXAgbm5ubm5uCisKK2V4cG9ydCAtbiBFWFBPUlRFRD0xMjM7IGVjaG8gIk5vdGhpbmc6IjsgZW52IHwgZ3JlcCBeRVhQT1JURUQKKworZXhwb3J0IEVYUE9SVEVEPXF3ZQorZXhwb3J0IC1uIEVYUE9SVEVEOyBFWFBPUlRFRD0xMjM7IGVjaG8gIk5vdGhpbmc6IjsgZW52IHwgZ3JlcCBeRVhQT1JURUQKKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZXhwb3J0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5M2U1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC5yaWdodApAQCAtMCwwICsxLDYgQEAKK2V4cG9ydCBhYWExPSInJyciCitleHBvcnQgYWFhMj0nJworZXhwb3J0IGFhYTM9IicnJyInYWJjJworZXhwb3J0IGFhYTQ9J2RlZiciJycnIgorZXhwb3J0IGFhYTU9IicnJyInYWJjJyInJyciJ2RlZiciJycnIgorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2V4cG9ydC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44N2EyN2VjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9leHBvcnQudGVzdHMKQEAgLTAsMCArMSw3IEBACitleHBvcnQgYWFhMT0iJycnIgorZXhwb3J0IGFhYTI9IiIKK2V4cG9ydCBhYWEzPSInJydhYmMiCitleHBvcnQgYWFhND0iZGVmJycnIgorZXhwb3J0IGFhYTU9IicnJ2FiYycnJ2RlZicnJyIKK2V4cG9ydCB8IGdyZXAgYWFhLj0KK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9ic2xhc2hlcy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfYnNsYXNoZXMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkOTY2OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfYnNsYXNoZXMucmlnaHQKQEAgLTAsMCArMSw4IEBACithCitiXGMKK2JcXGMKK2IiYworYidjCitiJGMKK2JgdHJ1ZWBjCitaZXJvOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfYnNsYXNoZXMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2JzbGFzaGVzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM2M2YzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2JzbGFzaGVzLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKKyMgVU5GSVhFRCBCVUcuCisjIGNvbW1lbnRlZC1vdXQgd29yZHMgY29udGFpbiBeQyBjaGFyYWN0ZXIuCisjIEl0J3MgYSBTUEVDSUFMX1ZBUl9TWU1CT0wsIGZvciBub3cgaHVzaCBkb2VzIG5vdCBlc2NhcGUgaXQuCisjIFdoZW4gaXQgaXMgZml4ZWQsIHVwZGF0ZSB0aGlzIHRlc3QuCisKK2ZvciBhIGluICdhJyAnYlxjJyAnYlxcYycgJ2IiYycgImInYyIgJ2IkYycgJ2JgdHJ1ZWBjJyAjIyMgJ2IDIwNjJworZG8KKyAgICBlY2hvICRhCitkb25lCitlY2hvIFplcm86JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZm9yX3dpdGhfa2V5d29yZHMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2tleXdvcmRzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDRlOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2tleXdvcmRzLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorZG8KK2RvbmUKK3RoZW4KK09LOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Zvcl93aXRoX2tleXdvcmRzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9rZXl3b3Jkcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGI4ZTQyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mb3Jfd2l0aF9rZXl3b3Jkcy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2ZvciBpZiBpbiBkbyBkb25lIHRoZW47IGRvIGVjaG8gJGlmOyBkb25lCitlY2hvIE9LOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxNjY1YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzEucmlnaHQKQEAgLTAsMCArMSw2IEBACitIZWxsbworWmVybzogMAorT25lOiAxIFBhcmFtMTogV29ybGQKK1plcm86IDAgUGFyYW0xOiBSZXN0b3JlZAorTXVsdGkgbGluZSBmdW5jdGlvbgorT25lOiAxCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZmIyNjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMS50ZXN0cwpAQCAtMCwwICsxLDE2IEBACitmKCkgeyBlY2hvIEhlbGxvOyB9CitnICgpIHsgZWNobyBPbmU6ICQjIFBhcmFtMTogJDE7IH0KK2ggKCApCit7CisgICAgZWNobyAtbiAnTXVsdGkgJyAmJiBlY2hvIC1uICdsaW5lICcKKyAgICBlY2hvIGZ1bmN0aW9uCisgICAgZmFsc2UKK30KKworZgorZWNobyBaZXJvOiAkPworc2V0IC0tIFJlc3RvcmVkCit7IGcgV29ybGQ7IH0KK2VjaG8gWmVybzogJD8gUGFyYW0xOiAkMQorKCBoICkKK2VjaG8gT25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhMDQxZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzIucmlnaHQKQEAgLTAsMCArMSw1IEBACitGaXJzdCAwCitTZWNvbmQgMAorRmlyc3QgMQorU2Vjb25kIDEKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc2MzIwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMyLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAoraT0wCit3aGlsZSB0ZXN0ICRpICE9IDI7IGRvCisgICAgZigpIHsgZWNobyBGaXJzdCAkaTsgfQorICAgIGYKKyAgICBmKCkgeyBlY2hvIFNlY29uZCAkaTsgfQorICAgIGYKKyAgICA6ICQoKGkrKykpCitkb25lCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDczNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmMzLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorT25lOjEKK1plcm86MAorT25lOjEKK0ZpdmU6NQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jMy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmE2ZjI2YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzMudGVzdHMKQEAgLTAsMCArMSw4IEBACitmKCkgeyBmYWxzZTsgcmV0dXJuOyBlY2hvIEJBRDsgfTsKK3sgZjsgZWNobyBPbmU6JD87IH07IGVjaG8gWmVybzokPworCitmKCkgeyBmYWxzZTsgcmV0dXJuOyB9OworZjsgZWNobyBPbmU6JD8KKworZigpIHsgcmV0dXJuIDU7IH07CitmOyBlY2hvIEZpdmU6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODdlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM0LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMjQKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0YzFiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM0LnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorZnVuYygpIHsKKwlldmFsICJlY2hvIFwiXCR7dmFsXyR7MX19XCIiCit9CisKK3ZhbF94PTI0CisoZnVuYyB4KQorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM1LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU3OWMzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jNS5yaWdodApAQCAtMCwwICsxLDMgQEAKKzEKKzIKKzMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuYzUudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljNWY5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmM1LnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorZigpIHsgZWNobyAkMTsgfQorZiAxCisKKyMgaHVzaCBmYWlscyBvbiB0aGlzIHN5bnRheCwgYnV0IGkndmUgbmV2ZXIgc2VlbiBhbnlvbmUgdXNlIGl0IC4uLgorI2YoKSAoIGVjaG8gJDE7ICkKK2YgMgorCisjZigpICggZWNobyAkMSApCitmIDMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19hcmdzMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvZnVuY19hcmdzMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZiOTYyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2FyZ3MxLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorcGFyYW1zOiBhIGIgYworJ2YgMSAyIDMnIGNhbGxlZAorcGFyYW1zOiBhIGIgYworJ2YgMSAyIDMnIGNhbGxlZAorcGFyYW1zOiBhIGIgYwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2FyZ3MxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2FyZ3MxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1NzkyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfYXJnczEudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorIyBVTkZJWEVEIEJVRworCitmKCkgeyBlY2hvICInZiAkMSAkMiAkMycgY2FsbGVkIjsgfQorCitzZXQgLS0gYSBiIGMKK2VjaG8gInBhcmFtczogJDEgJDIgJDMiCitmIDEgMiAzCitlY2hvICJwYXJhbXM6ICQxICQyICQzIgordHJ1ZSB8IGYgMSAyIDMKK2VjaG8gInBhcmFtczogJDEgJDIgJDMiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfbG9jYWwxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTIxNzgzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMS5yaWdodApAQCAtMCwwICsxLDMgQEAKK3o9YQorej16CitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfbG9jYWwxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDU5NGUyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2V4cG9ydCB6PXoKK2YoKSB7IGxvY2FsIHo9YTsgZW52IHwgZ3JlcCBeejsgfQorZgorZW52IHwgZ3JlcCBeegorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfbG9jYWwyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkzNDNhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMi5yaWdodApAQCAtMCwwICsxLDE0IEBACisxCisyCisxCisyCisxCisxCisyCisyCiszCisyCisyCiszCisxCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2Z1bmNfbG9jYWwyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTlhZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9mdW5jX2xvY2FsMi50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK3g9MQorZigpIHsgZWNobyAkeDsgbG9jYWwgeD0kKCh4KzEpKTsgZWNobyAkeDsgfQorZygpIHsgZjsgZWNobyAkeDsgZjsgbG9jYWwgeD0kKCh4KzEpKTsgZjsgZWNobyAkeDsgZjsgfQorZgorZworZWNobyAkeAorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM2OGYzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMS5yaWdodApAQCAtMCwwICsxLDUgQEAKK3F3ZQorYXNkCisxMjMKKzQ1NgorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlZWI0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MxLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorY2F0IDw8MDAwOyBjYXQgPDx3d3c7IGNhdCA8PGVlZQorMDAwCitxd2UKK2FzZAord3d3CisxMjMKKzQ1NgorZWVlCitlY2hvIE9rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDExMGUzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMi5yaWdodApAQCAtMCwwICsxLDkgQEAKK2V4aXQgRU9GLWYKKyIKK2VjaG8gMQorZWNobyBIZWxsbyBXb3JsZAorbW9vCSAKKyBFT0YtZgorRU9GLWYgICBmCitFT0YtZiAKK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjE5YmRlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMi50ZXN0cwpAQCAtMCwwICsxLDEyIEBACitmPTEKKyAgY2F0IDw8LSBFT0YtZgorCQlleGl0IEVPRi1mCisiCitlY2hvICRmCitlY2hvIGBlY2hvIEhlbGxvIFdvcmxkYAorCQltb28JIAorIEVPRi1mCitFT0YtZiAgIGYKK0VPRi1mIAorRU9GLWYKK2VjaG8gT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDUxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2MzLnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorZXhpdCBFT0YtZgorIgorZWNobyAkZgorZWNobyBgZWNobyBIZWxsbyBXb3JsZGAKK21vbwkgCisgRU9GLWYKK0VPRi1mICAgZgorRU9GLWYgCitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jMy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM4NTc3YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvYzMudGVzdHMKQEAgLTAsMCArMSwxMiBAQAorZj0xCisgIGNhdCA8PC0gRU9GLWYiIgorCQlleGl0IEVPRi1mCisiCitlY2hvICRmCitlY2hvIGBlY2hvIEhlbGxvIFdvcmxkYAorCQltb28JIAorIEVPRi1mCitFT0YtZiAgIGYKK0VPRi1mIAorRU9GLWYKK2VjaG8gT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19iYWNrc2xhc2gxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2JhY2tzbGFzaDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2MTE0OAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19iYWNrc2xhc2gxLnJpZ2h0CkBAIC0wLDAgKzEsNDMgQEAKK1F1b3RlZCBoZXJlZG9jOgorYVwKKwliCithXFwKKwliCisgMTIzNDU2IC0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKwktJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisgMTIzNDU2IGBlY2hvICB2Jy0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0nYAorIDEyMzQ1NiAkKGVjaG8gdictJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tJykKK2NcCisKK1VucXVvdGVkIGhlcmVkb2M6CithCWIKK2FcCisJYgorIDEyMzQ1NiAtcXdlcnR5LVx0LVwtXCItXCctYC1cLS1cei1cKi1cPy0KKwktcXdlcnR5LVx0LVwtXCItXCctYC1cLS1cei1cKi1cPy0KKyAxMjM0NTYgdi0kYS1cdC1cLVwiLVx4LWAtXC0tXHotXCotXD8tCisgMTIzNDU2IHYtJGEtXHQtXFwtXCItXHgtXGAtXC0tXHotXCotXD8tCitjRU9GMgorCitRdW90ZWQgLWhlcmVkb2M6CithXAorYgorYVxcCitiCisgMTIzNDU2IC0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKy0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKyAxMjM0NTYgYGVjaG8gIHYnLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LSdgCisgMTIzNDU2ICQoZWNobyB2Jy0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0nKQorY1wKKworVW5xdW90ZWQgLWhlcmVkb2M6CithCWIKK2FcCitiCisgMTIzNDU2IC1xd2VydHktXHQtXC1cIi1cJy1gLVwtLVx6LVwqLVw/LQorLXF3ZXJ0eS1cdC1cLVwiLVwnLWAtXC0tXHotXCotXD8tCisgMTIzNDU2IHYtJGEtXHQtXC1cIi1ceC1gLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiB2LSRhLVx0LVxcLVwiLVx4LVxgLVwtLVx6LVwqLVw/LQorY0VPRjQKKworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2JhY2tzbGFzaDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfYmFja3NsYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDFhZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9oZXJlZG9jX2JhY2tzbGFzaDEudGVzdHMKQEAgLTAsMCArMSw3MCBAQAorIyBUZXN0IGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIGJhY2tzbGFzaGVzLgorIyBOb3RlIHRoYXQgc29tZSBsaW5lcyBpbiBlYWNoIGhlcmVkb2Mgc3RhcnQgd2l0aCBhIHRhYi4KKworYT1xd2VydHkKKworZWNobyBRdW90ZWQgaGVyZWRvYzoKK2NhdCA8PCJFT0YxIgorYVwKKwliCithXFwKKwliCisgMTIzNDU2IC0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKwktJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisgMTIzNDU2IGBlY2hvICB2Jy0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0nYAorIDEyMzQ1NiAkKGVjaG8gdictJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tJykKK2NcCitFT0YxCitlY2hvCisKK2VjaG8gVW5xdW90ZWQgaGVyZWRvYzoKK2NhdCA8PEVPRjIKK2FcCisJYgorYVxcCisJYgorIDEyMzQ1NiAtJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisJLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiBgZWNobyAgdictJGEtXHQtXFwtXCItXHgtXGAtXC0tXHotXCotXD8tJ2AKKyAxMjM0NTYgJChlY2hvIHYnLSRhLVx0LVxcLVwiLVx4LVxgLVwtLVx6LVwqLVw/LScpCitjXAorRU9GMgorRU9GMgorZWNobworCitlY2hvIFF1b3RlZCAtaGVyZWRvYzoKK2NhdCA8PC0iRU9GMyIKK2FcCisJYgorYVxcCisJYgorIDEyMzQ1NiAtJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisJLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LQorIDEyMzQ1NiBgZWNobyAgdictJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tJ2AKKyAxMjM0NTYgJChlY2hvIHYnLSRhLVx0LVxcLVwiLVwnLVxgLVwtLVx6LVwqLVw/LScpCitjXAorCUVPRjMKKyMgSW4gLWhlcmVkb2MgY2FzZSB0aGUgbWFya2VyIGlzIGRldGVjdGVkIGV2ZW4gaWYgaXQgaXMgaW5kZW50ZWQuCitlY2hvCisKK2VjaG8gVW5xdW90ZWQgLWhlcmVkb2M6CitjYXQgPDwtRU9GNAorYVwKKwliCithXFwKKwliCisgMTIzNDU2IC0kYS1cdC1cXC1cIi1cJy1cYC1cLS1cei1cKi1cPy0KKwktJGEtXHQtXFwtXCItXCctXGAtXC0tXHotXCotXD8tCisgMTIzNDU2IGBlY2hvICB2Jy0kYS1cdC1cXC1cIi1ceC1cYC1cLS1cei1cKi1cPy0nYAorIDEyMzQ1NiAkKGVjaG8gdictJGEtXHQtXFwtXCItXHgtXGAtXC0tXHotXCotXD8tJykKK2NcCitFT0Y0CisJRU9GNAorIyBUaGUgbWFya2VyIGlzIG5vdCBkZXRlY3RlZCBpZiBwcmVjZWRpbmcgbGluZSBlbmRzIGluIGJhY2tzbGFzaC4KKyMgVE9ETzogbWFya2VyIHNob3VsZCBiZSBkZXRlY3RlZCBldmVuIGlmIGl0IGlzIHNwbGl0IGJ5IGxpbmUgY29udGludWF0aW9uOgorIyBFT0ZcCisjIDQKKyMgYnV0IGN1cnJlbnRseSBodXNoIGRvZXNuJ3QgZG8gaXQuIChUYWIgYmVmb3JlICI0IiBpcyBub3QgYWxsb3dlZCwgdGhvdWdoLikKK2VjaG8KKworZWNobyAiRG9uZTogJD8iCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfaHVnZS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19odWdlLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzQwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfaHVnZS5yaWdodApAQCAtMCwwICsxLDMgQEAKKzU0NmVkM2Y1YzgxYzc4MGQzYWI4NmFkYTE0ODI0MjM3ICAtCis1NDZlZDNmNWM4MWM3ODBkM2FiODZhZGExNDgyNDIzNyAgLQorRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfaHVnZS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvaGVyZWRvY19odWdlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyZWMyODEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2hlcmVkb2NfaHVnZS50ZXN0cwpAQCAtMCwwICsxLDkgQEAKKyMgVGhpcyBjcmVhdGVzIDEyMGsgaGVyZWRvYworZWNobyAnY2F0IDw8SEVSRSB8IG1kNXN1bScgPiIkMC50bXAiCit5ZXMgIjEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSIgfCBoZWFkIC0zMDAwID4+IiQwLnRtcCIKK2VjaG8gJ0hFUkUnID4+IiQwLnRtcCIKKworeWVzICIxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkiIHwgaGVhZCAtMzAwMCB8IG1kNXN1bQorLiAiJDAudG1wIgorcm0gIiQwLnRtcCIKK2VjaG8gRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2lmX2ZhbHNlX2V4aXRjb2RlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI0YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS5yaWdodApAQCAtMCwwICsxIEBACitPazowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2lmX2ZhbHNlX2V4aXRjb2RlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWIzNmIxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2lmIGZhbHNlOyB0aGVuIGVjaG8gQmFkOyBmaQorZWNobyBPazokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA2YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEucmlnaHQKQEAgLTAsMCArMSw3IEBACitPaworT2sKK09rCitPaworT2sKK09rCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNGFkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS50ZXN0cwpAQCAtMCwwICsxLDEyIEBACisoZWNobyBcCitPaykKKyggKGVjaG8gXAorT2spICkKKyggKCAoZWNobyBcCitPaykgKSApCisKKyhlY2hvIFxPaykKKyggKGVjaG8gXE9rKSApCisoICggKGVjaG8gXE9rKSApICkKKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGJhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi5yaWdodApAQCAtMCwwICsxLDUgQEAKK09rCitPaworT2sKK09rCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxZWQ1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gTm90IHNob3duIHwgaWYgdHJ1ZTsgdGhlbiBlY2hvICQoZWNobyBPayk7IGZpCitlY2hvIE5vdCBzaG93biB8IGlmIHRydWU7IHRoZW4gZWNobyBgZWNobyBPa2A7IGZpCitlY2hvIE5vdCBzaG93biB8ICggaWYgdHJ1ZTsgdGhlbiBlY2hvICQoZWNobyBPayk7IGZpICkKK2VjaG8gTm90IHNob3duIHwgKCBpZiB0cnVlOyB0aGVuIGVjaG8gYGVjaG8gT2tgOyBmaSApCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvb3B0czEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTc1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorUGFyYW0xOiA+LTEwcXdlcnR5dWlvcDwKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvb3B0czEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ1YTIzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgJDAgLTEwcXdlcnR5dWlvcAorZmkKK2VjaG8gIlBhcmFtMTogPiQxPCIKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waWQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3BpZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM1NDFhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waWQucmlnaHQKQEAgLTAsMCArMSBAQAorMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waWQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3BpZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWVhYTcxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waWQudGVzdHMKQEAgLTAsMCArMSBAQAordGVzdCBgKGVjaG8gJCQpYCA9IGBlY2hvICQkYDsgZWNobyAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waXBlZmFpbC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlwZWZhaWwucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0NWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlwZWZhaWwucmlnaHQKQEAgLTAsMCArMSw0MCBAQAorRGVmYXVsdDoKK3RydWUgfCB0cnVlOgorMAorMQordHJ1ZSB8IGZhbHNlOgorMQorMAorZmFsc2UgfCB0cnVlOgorMAorMQorZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OgorNAorMAorUGlwZWZhaWwgb246Cit0cnVlIHwgdHJ1ZToKKzAKKzEKK3RydWUgfCBmYWxzZToKKzEKKzAKK2ZhbHNlIHwgdHJ1ZToKKzEKKzAKK2V4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDoKKzQKKzAKK1BpcGVmYWlsIG9mZjoKK3RydWUgfCB0cnVlOgorMAorMQordHJ1ZSB8IGZhbHNlOgorMQorMAorZmFsc2UgfCB0cnVlOgorMAorMQorZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OgorNAorMAorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9waXBlZmFpbC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlwZWZhaWwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRmODQxOAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcGlwZWZhaWwudGVzdHMKQEAgLTAsMCArMSw0NSBAQAorZWNobyBEZWZhdWx0OgorZWNobyAidHJ1ZSB8IHRydWU6IgorICB0cnVlIHwgdHJ1ZTsgZWNobyAkPworISB0cnVlIHwgdHJ1ZTsgZWNobyAkPworZWNobyAidHJ1ZSB8IGZhbHNlOiIKKyAgdHJ1ZSB8IGZhbHNlOyBlY2hvICQ/CishIHRydWUgfCBmYWxzZTsgZWNobyAkPworZWNobyAiZmFsc2UgfCB0cnVlOiIKKyAgZmFsc2UgfCB0cnVlOyBlY2hvICQ/CishIGZhbHNlIHwgdHJ1ZTsgZWNobyAkPworZWNobyAiZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OiIKKyAgZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OyBlY2hvICQ/CishIGV4aXQgMiB8IGV4aXQgMyB8IGV4aXQgNDsgZWNobyAkPworCitlY2hvIFBpcGVmYWlsIG9uOgorc2V0IC1vIHBpcGVmYWlsCitlY2hvICJ0cnVlIHwgdHJ1ZToiCisgIHRydWUgfCB0cnVlOyBlY2hvICQ/CishIHRydWUgfCB0cnVlOyBlY2hvICQ/CitlY2hvICJ0cnVlIHwgZmFsc2U6IgorICB0cnVlIHwgZmFsc2U7IGVjaG8gJD8KKyEgdHJ1ZSB8IGZhbHNlOyBlY2hvICQ/CitlY2hvICJmYWxzZSB8IHRydWU6IgorICBmYWxzZSB8IHRydWU7IGVjaG8gJD8KKyEgZmFsc2UgfCB0cnVlOyBlY2hvICQ/CitlY2hvICJleGl0IDIgfCBleGl0IDMgfCBleGl0IDQ6IgorICBleGl0IDIgfCBleGl0IDMgfCBleGl0IDQ7IGVjaG8gJD8KKyEgZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OyBlY2hvICQ/CisKK2VjaG8gUGlwZWZhaWwgb2ZmOgorc2V0ICtvIHBpcGVmYWlsCitlY2hvICJ0cnVlIHwgdHJ1ZToiCisgIHRydWUgfCB0cnVlOyBlY2hvICQ/CishIHRydWUgfCB0cnVlOyBlY2hvICQ/CitlY2hvICJ0cnVlIHwgZmFsc2U6IgorICB0cnVlIHwgZmFsc2U7IGVjaG8gJD8KKyEgdHJ1ZSB8IGZhbHNlOyBlY2hvICQ/CitlY2hvICJmYWxzZSB8IHRydWU6IgorICBmYWxzZSB8IHRydWU7IGVjaG8gJD8KKyEgZmFsc2UgfCB0cnVlOyBlY2hvICQ/CitlY2hvICJleGl0IDIgfCBleGl0IDMgfCBleGl0IDQ6IgorICBleGl0IDIgfCBleGl0IDMgfCBleGl0IDQ7IGVjaG8gJD8KKyEgZXhpdCAyIHwgZXhpdCAzIHwgZXhpdCA0OyBlY2hvICQ/CisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWFkLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWFkLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTBlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlYWQucmlnaHQKQEAgLTAsMCArMSw0IEBACityZWFkCitjYXQKK2VjaG8gIlJFUExZPSRSRVBMWSIKK1JFUExZPWV4ZWMgPHJlYWQudGVzdHMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVhZC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVhZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZjFhY2JkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWFkLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorZXhlYyA8cmVhZC50ZXN0cworcmVhZAorY2F0CitlY2hvICJSRVBMWT0kUkVQTFkiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTE1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMS5yaWdodApAQCAtMCwwICsxLDEyIEBACitUZXN0IDA6ICB2YXI6b2sKK0ZpbGUgY3JlYXRlZDpvaworVGVzdCAxOiAgdmFyOm9rCitGaWxlIGNyZWF0ZWQ6b2sKK1Rlc3QgMjogIHZhcjpvaworRmlsZSBjcmVhdGVkOm9rCitUZXN0IDM6ICB2YXI6b2sKK0ZpbGUgY3JlYXRlZDpvaworVGVzdCA0OiAgdmFyOm9rCitGaWxlIGNyZWF0ZWQ6b2sKK1Rlc3QgNTogIHZhcjpvaworRmlsZSBjcmVhdGVkOm9rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmMmZiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMS50ZXN0cwpAQCAtMCwwICsxLDQwIEBACitybSBzaGVsbF90ZXN0XyQkIDI+L2Rldi9udWxsCit2YXI9YmFkCis+c2hlbGxfdGVzdF8kJCB2YXI9b2sKK2VjaG8gIlRlc3QgMDogIHZhcjokdmFyIgordGVzdCAtZiBzaGVsbF90ZXN0XyQkICYmIGVjaG8gIkZpbGUgY3JlYXRlZDpvayIKKworcm0gc2hlbGxfdGVzdF8kJCAyPi9kZXYvbnVsbAordmFyPWJhZAordmFyPW9rID5zaGVsbF90ZXN0XyQkCitlY2hvICJUZXN0IDE6ICB2YXI6JHZhciIKK3Rlc3QgLWYgc2hlbGxfdGVzdF8kJCAmJiBlY2hvICJGaWxlIGNyZWF0ZWQ6b2siCisKK3JtIHNoZWxsX3Rlc3RfJCQgMj4vZGV2L251bGwKK3Zhcj1vawordHJ1ZSB8IHZhcj1iYWQgPnNoZWxsX3Rlc3RfJCQKK2VjaG8gIlRlc3QgMjogIHZhcjokdmFyIgordGVzdCAtZiBzaGVsbF90ZXN0XyQkICYmIGVjaG8gIkZpbGUgY3JlYXRlZDpvayIKKworcm0gc2hlbGxfdGVzdF8kJCAyPi9kZXYvbnVsbAordmFyPWJhZAoreyB2YXI9b2sgPnNoZWxsX3Rlc3RfJCQ7IH0KK2VjaG8gIlRlc3QgMzogIHZhcjokdmFyIgordGVzdCAtZiBzaGVsbF90ZXN0XyQkICYmIGVjaG8gIkZpbGUgY3JlYXRlZDpvayIKKworcm0gc2hlbGxfdGVzdF8kJCAyPi9kZXYvbnVsbAordmFyPW9rCit7IHZhcj1iYWQgPnNoZWxsX3Rlc3RfJCQ7IH0gJgorIyBjYW50IHVzZSB1c2xlZXAgYXMgaXQgaXNudCBzdGFuZGFyZCBpbiAkUEFUSCAtLQorIyB3ZSBmYWlsIHdoZW4gdGVzdGluZyBidXN5Ym94IGNvbXBpbGVkIHNvbGVseSBhcyAiaHVzaCIKK3dhaXQKK2VjaG8gIlRlc3QgNDogIHZhcjokdmFyIgordGVzdCAtZiBzaGVsbF90ZXN0XyQkICYmIGVjaG8gIkZpbGUgY3JlYXRlZDpvayIKKworcm0gc2hlbGxfdGVzdF8kJCAyPi9kZXYvbnVsbAordmFyPW9rCisoIHZhcj1iYWQgPnNoZWxsX3Rlc3RfJCQgKQorZWNobyAiVGVzdCA1OiAgdmFyOiR2YXIiCit0ZXN0IC1mIHNoZWxsX3Rlc3RfJCQgJiYgZWNobyAiRmlsZSBjcmVhdGVkOm9rIgorCitybSBzaGVsbF90ZXN0XyQkIDI+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMi5yaWdodApAQCAtMCwwICsxIEBACitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTk4M2NhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjIudGVzdHMKQEAgLTAsMCArMSwyIEBACitlY2hvIE5PVCBTSE9XTiBcMj4vZGV2L251bGwKK2VjaG8gT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyMGJiZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXIzLnJpZ2h0CkBAIC0wLDAgKzEsMTQgQEAKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK09uZToxCitodXNoOiBjYW4ndCBvcGVuICcvY2FudC9iZS9jcmVhdGVkJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorT25lOjEKK09rCitodXNoOiBjYW4ndCBvcGVuICcvY2FudC9iZS9jcmVhdGVkJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorWmVybzowCitodXNoOiBjYW4ndCBvcGVuICcvY2FudC9iZS9jcmVhdGVkJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorT25lOjEKK2h1c2g6IGNhbid0IG9wZW4gJy9jYW50L2JlL2NyZWF0ZWQnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitPbmU6MQoraHVzaDogY2FuJ3Qgb3BlbiAnL2NhbnQvYmUvY3JlYXRlZCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK1plcm86MAorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzI4ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjMudGVzdHMKQEAgLTAsMCArMSw5IEBACitlY2hvIEVycm9yID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gT25lOiQ/Cit0PUJBRAordD1PayA+Pi9jYW50L2JlL2NyZWF0ZWQ7IGVjaG8gT25lOiQ/CitlY2hvICR0CishID4vY2FudC9iZS9jcmVhdGVkOyBlY2hvIFplcm86JD8KK2V4ZWMgPi9jYW50L2JlL2NyZWF0ZWQ7IGVjaG8gT25lOiQ/CitleGVjIC9iaW4vdHJ1ZSA+L2NhbnQvYmUvY3JlYXRlZDsgZWNobyBPbmU6JD8KKyEgZXhlYyAvYmluL3RydWUgPi9jYW50L2JlL2NyZWF0ZWQ7IGVjaG8gWmVybzokPworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDI1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNC5yaWdodApAQCAtMCwwICsxLDE4IEBACitzaGVsbF90ZXN0Citcc2hlbGxfdGVzdAorXHNoZWxsX3Rlc3QKK1xzaGVsbF90ZXN0CitIZXJlMQorT2sxCitIZXJlMgorT2syCitIZXJlMworT2szCitIZXJlNAorT2s0CitOb3cgd2l0aCB2YXJpYWJsZSByZWZzCitzaGVsbF90ZXN0XzEKK1xzaGVsbF90ZXN0XzEKK1xzaGVsbF90ZXN0XzEKK1xzaGVsbF90ZXN0XzEKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzUwYjhjZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI0LnRlc3RzCkBAIC0wLDAgKzEsODUgQEAKK3JtICpzaGVsbF90ZXN0KiAyPi9kZXYvbnVsbAorCis+XHNoZWxsX3Rlc3QKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworPlxcc2hlbGxfdGVzdAorZWNobyAqc2hlbGxfdGVzdCoKK3JtICpzaGVsbF90ZXN0KgorCis+IlxzaGVsbF90ZXN0IgorZWNobyAqc2hlbGxfdGVzdCoKK3JtICpzaGVsbF90ZXN0KgorCis+Ilxcc2hlbGxfdGVzdCIKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworCitjYXQgPDxcc2hlbGxfdGVzdAorSGVyZTEKK3NoZWxsX3Rlc3QKK2VjaG8gT2sxCisKK2NhdCA8PFxcc2hlbGxfdGVzdAorSGVyZTIKK1xzaGVsbF90ZXN0CitlY2hvIE9rMgorCitjYXQgPDwiXHNoZWxsX3Rlc3QiCitIZXJlMworXHNoZWxsX3Rlc3QKK2VjaG8gT2szCisKK2NhdCA8PCJcXHNoZWxsX3Rlc3QiCitIZXJlNAorXHNoZWxsX3Rlc3QKK2VjaG8gT2s0CisKKworZWNobyBOb3cgd2l0aCB2YXJpYWJsZSByZWZzCitpPTEKKworCis+XHNoZWxsX3Rlc3RfJGkKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworPlxcc2hlbGxfdGVzdF8kaQorZWNobyAqc2hlbGxfdGVzdCoKK3JtICpzaGVsbF90ZXN0KgorCis+IlxzaGVsbF90ZXN0XyRpIgorZWNobyAqc2hlbGxfdGVzdCoKK3JtICpzaGVsbF90ZXN0KgorCis+Ilxcc2hlbGxfdGVzdF8kaSIKK2VjaG8gKnNoZWxsX3Rlc3QqCitybSAqc2hlbGxfdGVzdCoKKworZWNobyBEb25lO2V4aXQKKyMgVU5GSVhFRCBCVUcuIGJhc2ggYXBwYXJlbnRseSB3aWxsIGV4cGFuZCAkaSBldmVuIGluIHRlcm1pbmF0aW5nIGRlbGltaXRlci4KKyMgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWwKKyMgZG9lcyBub3QgbWFuZGF0ZSB0aGlzIGJlaGF2aW9yLgorIyBUaGlzIGlzIG5vdCBsaWtlbHkgdG8gYmUgdXNlZCBtdWNoIGluIHJlYWwtd29ybGQuCisKK2NhdCA8PFxzaGVsbF90ZXN0XyRpCitIZXJlMQorc2hlbGxfdGVzdF8kaQorZWNobyBPazEKKworY2F0IDw8XFxzaGVsbF90ZXN0XyRpCitIZXJlMgorXHNoZWxsX3Rlc3RfJGkKK2VjaG8gT2syCisKK2NhdCA8PCJcc2hlbGxfdGVzdF8kaSIKK0hlcmUzCitcc2hlbGxfdGVzdF8kaQorZWNobyBPazMKKworY2F0IDw8Ilxcc2hlbGxfdGVzdF8kaSIKK0hlcmU0Citcc2hlbGxfdGVzdF8kaQorZWNobyBPazQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI1LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjY2U0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI1LnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorQmFja2dyb3VuZGVkIHBpcGVzIHNoYWxsIGhhdmUgdGhlaXIgc3RkaW4gcmVkaXJlY3RlZCB0byAvZGV2L251bGwKK1plcm86MAorWmVybzowCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1N2Y5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNS50ZXN0cwpAQCAtMCwwICsxLDEzIEBACitlY2hvICJCYWNrZ3JvdW5kZWQgcGlwZXMgc2hhbGwgaGF2ZSB0aGVpciBzdGRpbiByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCIKKworIyAxLiBiYXNoIGRvZXMgbm90IHJlZGlyZWN0IHN0ZGluIHRvIC9kZXYvbnVsbCBpZiBpdCBpcyBpbnRlcmFjdGl2ZS4KKyMgaHVzaCBkb2VzIGl0IGFsd2F5cyAodGhpcyBpcyBhbGxvd2VkIGJ5IHN0YW5kYXJkcykuCisKKyMgMi4gRmFpbHVyZSB3aWxsIHJlc3VsdCBpbiB0aGlzIHNjcmlwdCBoYW5naW5nCisKK2NhdCAmIHdhaXQ7IGVjaG8gWmVybzokPworCisjIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgYmFzaCEgYmFzaCBidWc/CitjYXQgfCBjYXQgJiB3YWl0OyBlY2hvIFplcm86JD8KKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI2LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2M0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JlZGlyNi5yaWdodApAQCAtMCwwICsxLDQgQEAKK1Rlc3RpbmcgbXVsdGlwbGUgcmVkaXJlY3Rpb25zIHRvIHNhbWUgZmQKK0hlbGxvCitEb25lMQorRG9uZTIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI2LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9yZWRpcjYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzYzOWViYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmVkaXI2LnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorZWNobyAiVGVzdGluZyBtdWx0aXBsZSByZWRpcmVjdGlvbnMgdG8gc2FtZSBmZCIKKyMgYnVnIHdhcyBtYWtpbmcgdXMgbG9zZSBmZCAjMSBhZnRlciB0aGlzOgorZWNobyBIZWxsbyA+L2Rldi9udWxsIDE+JjIKK2VjaG8gRG9uZTEKK2VjaG8gRG9uZTIgPiYyCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JldHVybjEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JldHVybjEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyNGEzNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmV0dXJuMS5yaWdodApAQCAtMCwwICsxIEBACitPazowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JldHVybjEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3JldHVybjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWViOTJlZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvcmV0dXJuMS50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gInRydWUgJiYgcmV0dXJuOyBlY2hvIFNob3VsZCBub3QgYmUgcHJpbnRlZCIgPnJldHVybl9zb3VyY2VkCisuIC4vcmV0dXJuX3NvdXJjZWQKK3JtIHJldHVybl9zb3VyY2VkCitlY2hvIE9rOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NoaWZ0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaGlmdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjgxZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaGlmdC5yaWdodApAQCAtMCwwICsxLDYgQEAKKy4vc2hpZnQudGVzdHMgYWJjIGQgZQorLi9zaGlmdC50ZXN0cyBkIGUgMTIzCisuL3NoaWZ0LnRlc3RzIGQgZSAxMjMKKy4vc2hpZnQudGVzdHMKKy4vc2hpZnQudGVzdHMKKy4vc2hpZnQudGVzdHMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2hpZnQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NoaWZ0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzZWYyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NoaWZ0LnRlc3RzCkBAIC0wLDAgKzEsMTQgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICQwIGFiYyAiZCBlIiAxMjMKK2ZpCitlY2hvICQwICQxICQyCitzaGlmdAorZWNobyAkMCAkMSAkMgorc2hpZnQgOTk5CitlY2hvICQwICQxICQyCitzaGlmdCAyCitlY2hvICQwICQxICQyCitzaGlmdCAyCitlY2hvICQwICQxICQyCitzaGlmdAorZWNobyAkMCAkMSAkMgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdfZXhpdGNvZGUucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ19leGl0Y29kZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYwMDBhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdfZXhpdGNvZGUucmlnaHQKQEAgLTAsMCArMSw1IEBACitLSUxMCisxMzc6MTM3CitLSUxMCiswOjAKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnX2V4aXRjb2RlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdfZXhpdGNvZGUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzg3OWRjOAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnX2V4aXRjb2RlLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorZXhlYyAyPiYxCisKKyRUSElTX1NIIC1jICdraWxsIC05ICQkJworZWNobyAxMzc6JD8KKworISAkVEhJU19TSCAtYyAna2lsbCAtOSAkJCcKK2VjaG8gMDokPworCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnaW50MS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnaW50MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA5NGIwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zaWdpbnQxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK1NlbmRpbmcgU0lHSU5UIHRvIG1haW4gc2hlbGwgUElECmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ2ludDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NpZ2ludDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q0ODNkMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc2lnaW50MS50ZXN0cwpAQCAtMCwwICsxLDQxIEBACisjIFdoYXQgc2hvdWxkIGhhcHBlbiBpZiBub24taW50ZXJhY3RpdmUgc2hlbGwgZ2V0cyBTSUdJTlQ/CisKKyhzbGVlcCAxOyBlY2hvIFNlbmRpbmcgU0lHSU5UIHRvIG1haW4gc2hlbGwgUElEOyBleGVjIGtpbGwgLUlOVCAkJCkgJgorCisjIFdlIGNyZWF0ZSBhIGNoaWxkIHdoaWNoIGV4aXRzIHdpdGggMCBldmVuIG9uIFNJR0lOVAorIyAoVGhlIGNvbXBsZXggY29tbWFuZCBpcyBuZWNlc3Nhcnkgb25seSBpZiBTSUdJTlQgaXMgZ2VuZXJhdGVkIGJ5IF5DLAorIyBpbiB0aGlzIHRlc3RjYXNlIGV2ZW4gYmFyZSAic2xlZXAgMiIgd291bGQgZG8gYmVjYXVzZQorIyBpbiB0aGUgdGVzdGNhc2Ugd2UgZG9uJ3Qgc2VuZCBTSUdJTlQgKnRvIHRoZSBjaGlsZCouLi4pCiskVEhJU19TSCAtYyAndHJhcCAiZXhpdCAwIiBTSUdJTlQ7IHNsZWVwIDInCisKKyMgSW4gb25lIHNlY29uZCwgd2UgKG1haW4gc2hlbGwpIGdldCBTSUdJTlQgaGVyZS4KKyMgVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgd2Ugc2hvdWxkLCBvciBzaG91bGQgbm90LCBleGl0LgorCisjIGJhc2ggd2lsbCBub3Qgc3RvcCBoZXJlLiBJdCB3aWxsIGV4ZWN1dGUgbmV4dCBjb21tYW5kKHMpLgorCisjIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgZGVzY3JpYmVkIGhlcmU6CisjIGh0dHA6Ly93d3cuY29ucy5vcmcvY3JhY2F1ZXIvc2lnaW50Lmh0bWwKKyMKKyMgQmFzaWNhbGx5LCBiYXNoIHdpbGwgbm90IGV4aXQgb24gU0lHSU5UIGltbWVkaWF0ZWx5IGlmIGl0IHdhaXRzCisjIGZvciBhIGNoaWxkLiBJdCB3aWxsIHdhaXQgZm9yIHRoZSBjaGlsZCB0byBleGl0LgorIyBJZiBjaGlsZCBleGl0cyBOT1QgYnkgZHlpbmcgb24gU0lHSU5ULCB0aGVuIGJhc2ggd2lsbCBub3QgZXhpdC4KKyMKKyMgVGhlIGlkZWEgaXMgdGhhdCB0aGUgZm9sbG93aW5nIHNjcmlwdDoKKyMgfCBlbWFjcyBmaWxlLnR4dAorIyB8IG1vcmUgY21kcworIyBVc2VyIG1heSB1c2UgXkMgdG8gaW50ZXJydXB0IGVkaXRvcidzIG9wcyBsaWtlIHNlYXJjaC4gQnV0IHRoZW4KKyMgZW1hY3MgZXhpdHMgbm9ybWFsbHkuIFVzZXIgZXhwZWN0cyB0aGF0IHNjcmlwdCBkb2Vzbid0IHN0b3AuCisjCisjIFRoaXMgaXMgYSBuaWNlIGlkZWEsIGJ1dCBkZXRlY3RpbmcgImRpZCBwcm9jZXNzIHJlYWxseSBleGl0CisjIHdpdGggU0lHSU5UPyIgaXMgcmFjeS4gQ29uc2lkZXI6CisjIHwgYmFzaCAtYyAnd2hpbGUgdHJ1ZTsgZG8gL2Jpbi90cnVlOyBkb25lJworIyBXaGVuIF5DIGlzIHByZXNzZWQgd2hpbGUgYmFzaCB3YWl0cyBmb3IgL2Jpbi90cnVlIHRvIGV4aXQsCisjIGl0IG1heSBoYXBwZW4gdGhhdCAvYmluL3RydWUgZXhpdHMgd2l0aCBleGl0Y29kZSAwIGJlZm9yZQorIyBeQyBpcyBkZWxpdmVyZWQgdG8gaXQgYXMgU0lHSU5ULiBiYXNoIHdpbGwgc2VlIFNJR0lOVCwgdGhlbgorIyBpdCB3aWxsIHNlZSB0aGF0IGNoaWxkIGV4aXRlZCB3aXRoIDAsIGFuZCBiYXNoIHdpbGwgTk9UIEVYSVQuCisKKyMgVGhlcmVmb3JlIHdlIGRvIG5vdCBpbXBsZW1lbnQgYmFzaCBiZWhhdmlvci4KKyMgSSdkIHNheSB0aGF0IGVtYWNzIG5lZWQgdG8gcHV0IGl0c2VsZiBpbnRvIGEgc2VwYXJhdGUgcGdycAorIyB0byBpc29sYXRlIHNoZWxsIGZyb20gZ2V0dGluZyBzdHJheSBTSUdJTlRzIGZyb20gXkMuCisKK2VjaG8gTmV4dCBjb21tYW5kIGFmdGVyIFNJR0lOVCB3YXMgZXhlY3V0ZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zb3VyY2UxLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQorbGluZTIKK09rMTowCitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAnCitPazI6MQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zb3VyY2UxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zb3VyY2UxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxMzg4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3NvdXJjZTEudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorZWNobyAnZWNobyAke159CitlY2hvIGxpbmUyJyA+c291cmNlZDEKKy4gLi9zb3VyY2VkMQorZWNobyBPazE6JD8KKworZWNobyAiZWNobyAnIiA+c291cmNlZDEKKy4gLi9zb3VyY2VkMQorZWNobyBPazI6JD8KKworcm0gc291cmNlZDEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBlNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorc2hvd24KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICcKK3Rlc3QKK25vdCBzaG93bgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxMGVkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnIudGVzdHMKQEAgLTAsMCArMSwzIEBACitlY2hvIHNob3duCitlY2hvIHRlc3QgYGVjaG8gJ2FhYAorZWNobyBub3Qgc2hvd24KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vycl9uZWdhdGUucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzAxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorYmFzaCAzLjIgZmFpbHMgdGhpcworaHVzaDogc3ludGF4IGVycm9yOiAhICEgY29tbWFuZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyX25lZ2F0ZS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vycl9uZWdhdGUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYxYjFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vycl9uZWdhdGUudGVzdHMKQEAgLTAsMCArMSwyIEBACitlY2hvIGJhc2ggMy4yIGZhaWxzIHRoaXMKKyEgISB0cnVlCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmRhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS5yaWdodApAQCAtMCwwICsxLDMgQEAKKzEKKzEKK09rOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy91bnRpbDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBhYjI4MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnRlc3RzCkBAIC0wLDAgKzEsMTEgQEAKK3g9MQordW50aWwgdGVzdCAiJHgiID0gNDsgZG8gZWNobyAkeDsgeD00OyBkb25lCisKKyMgV2UgaGFkIGEgYnVnIGluIG11bHRpLWxpbmUgZm9ybQoreD0xCit1bnRpbCB0ZXN0ICIkeCIgPSA0OyBkbworICAgICAgICBlY2hvICR4CisgICAgICAgIHg9NAorZG9uZQorCitlY2hvIE9rOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGQ3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS5yaWdodApAQCAtMCwwICsxIEBACitPSzowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExZTIwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3doaWxlIGZhbHNlOyBkbyBlY2hvIE5PVCBTSE9XTjsgZG9uZQorZWNobyBPSzokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIwN2NjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIucmlnaHQKQEAgLTAsMCArMSwyIEBACitIZWxsbworT0s6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjQ3YWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIudGVzdHMKQEAgLTAsMCArMSwyIEBACit3aGlsZSBlY2hvIEhlbGxvOyBmYWxzZTsgZG8gZWNobyBOT1QgU0hPV047IGRvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0ZDdiZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEzMmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAord2hpbGUgZmFsc2U7IGRvCisgICAgIyBiYXNoIHdpbGwgcmVxdWlyZSBhdCBsZWFzdCAiOiIgaGVyZS4uLgorZG9uZQorZWNobyBPSzokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZV9pbl9zdWJzaGVsbC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGVfaW5fc3Vic2hlbGwucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZDM5YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGVfaW5fc3Vic2hlbGwucmlnaHQKQEAgLTAsMCArMSBAQAorT0s6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGVfaW5fc3Vic2hlbGwudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlX2luX3N1YnNoZWxsLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlZjhlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlX2luX3N1YnNoZWxsLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorKHdoaWxlIHRydWU7IGRvIGV4aXQ7IGRvbmUpCitlY2hvIE9LOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9hcmd2MC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYXJndjAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YmFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYXJndjAucmlnaHQKQEAgLTAsMCArMSBAQAorT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYXJndjAudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2FyZ3YwLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1YzQwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2FyZ3YwLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhcmcKK2ZpCitlY2hvIE9LCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTlmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMS5yaWdodApAQCAtMCwwICsxLDcgQEAKK3thYmN9Cit7Cit9CitodXNoOiBjYW4ndCBleGVjdXRlICd7Y21kJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQoraHVzaDogY2FuJ3QgZXhlY3V0ZSAneyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ3snOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitEb25lOiAxMjcKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmI0NTkyNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UxLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorZWNobyB7YWJjfQorZWNobyB7CitlY2hvIH0KK3tjbWQKKyIieworeyIiCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTk2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMi5yaWdodApAQCAtMCwwICsxLDMgQEAKK3txLHd9Cit7cSx3fQorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjc1ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTIudGVzdHMKQEAgLTAsMCArMSw1IEBACit2PSd7cSx3fScKKyMgU2hvdWxkIG5vdCBicmFjZS1leHBhbmQgdiB2YWx1ZQorZWNobyAkdgorZWNobyAiJHYiCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvY29tbWVudDEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2NvbW1lbnQxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2NvbW1lbnQxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorTm90aGluZzoKK1N0cmluZzogI3Nob3VsZC1iZS1lY2hvZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvY29tbWVudDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2NvbW1lbnQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyNjg4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2NvbW1lbnQxLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyBOb3RoaW5nOiAjc2hvdWxkLW5vdC1iZS1lY2hvZWQKK2VjaG8gU3RyaW5nOiAiIiNzaG91bGQtYmUtZWNob2VkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VvbDEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VvbDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjODk2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZW9sMS5yaWdodApAQCAtMCwwICsxIEBACitEb25lOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZW9sMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZW9sMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWI1NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lb2wxLnRlc3RzCkBAIC0wLDAgKzEsMTggQEAKKyMgYnVnIHdhcyB0aGF0IHdlIHRyZWF0ZWQgPG5ld2xpbmU+IGFzICc7JyBpbiB0aGlzIGxpbmU6Cit0cnVlIHx8IGVjaG8gZm9vIHwKK2VjaG8gQkFEMSB8IGNhdAorCisjIHZhcmlhdGlvbiBvbiB0aGUgc2FtZSB0aGVtZQordHJ1ZSB8fCBlY2hvIGZvbyB8CisjIGNvbW1lbnQKK2VjaG8gQkFEMiB8IGNhdAorCisjIHZhcmlhdGlvbiBvbiB0aGUgc2FtZSB0aGVtZQordHJ1ZSB8fCBlY2hvIGZvbyB8CisKK2VjaG8gQkFEMyB8IGNhdAorCisjIHRoaXMgc2hvdWxkIGVycm9yIG91dCwgYnV0IGN1cnJlbnRseSB3b3JrcyBpbiBodXNoOgorI3RydWUgfHwgZWNobyBmb28gfDsKKworZWNobyBEb25lOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5OWI4NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMS5yaWdodApAQCAtMCwwICsxLDQgQEAKK1wKK2FcYgorXFwKK2NcXGQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNWFjOTZiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUxLnRlc3RzCkBAIC0wLDAgKzEsNiBAQAordGVzdCAiJENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8iID0gInkiIHx8IGV4aXQgNzcKKworZWNobyAiXFwiCitlY2hvIGEiXFwiYgorZWNobyAnXFwnCitlY2hvIGMnXFwnZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NWZkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTIucmlnaHQKQEAgLTAsMCArMSw0IEBACisqP1thXSoKK2EqP1thXSpiCisqP1thXSoKK2MqP1thXSpkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU3MTgwMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMi50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gIio/W2FdKiIKK2VjaG8gYSIqP1thXSoiYgorZWNobyAnKj9bYV0qJworZWNobyBjJyo/W2FdKidkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwMmE5NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMy5yaWdodApAQCAtMCwwICsxLDIzIEBACit2OiBhIFwgYiBcXCBjIFxcXCBkIFxcXFwgZQordjogYSBcIGIgXFwgYyBcXFwgZCBcXFxcIGUKK1VucXVvdGVkOgorLmEuCisuXC4KKy5iLgorLlxcLgorLmMuCisuXFxcLgorLmQuCisuXFxcXC4KKy5lLgorUXVvdGVkOgorLmEuCisuXC4KKy5iLgorLlxcLgorLmMuCisuXFxcLgorLmQuCisuXFxcXC4KKy5lLgorZG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4NzA1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTMudGVzdHMKQEAgLTAsMCArMSwxMCBAQAordGVzdCAiJENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8iID0gInkiIHx8IGV4aXQgNzcKKwordj0nYSBcIGIgXFwgYyBcXFwgZCBcXFxcIGUnCitlY2hvIHY6ICR2CitlY2hvIHY6ICIkdiIKK2VjaG8gVW5xdW90ZWQ6Citmb3IgYSBpbiAkdjsgZG8gZWNobyAuJGEuOyBkb25lCitlY2hvIFF1b3RlZDoKK2ZvciBhIGluICR2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZWNobyBkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNC5yaWdodApAQCAtMCwwICsxLDIgQEAKK09rCitFbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjhiZjBhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU0LnRlc3RzCkBAIC0wLDAgKzEsNiBAQAoraVwKK2YgdHJcCit1ZTsgdGhcCitlbiBlY2hvICJPXAorayI7IGZpOyBlY2hvICJcCitFbmQiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU1LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZGQzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTUucmlnaHQKQEAgLTAsMCArMSw5IEBACithXG5iXG5jXG4KK2EKK2IKK2MKK2FcbmJcbmNcbgorYQorYgorYworRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU1LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzN2E5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTUudGVzdHMKQEAgLTAsMCArMSw3IEBACit2PSJhXG5iXG5jXG4iCitlY2hvICIkdiIKK3ByaW50ZiAiJHYiCit2PSdhXG5iXG5jXG4nCitlY2hvICIkdiIKK3ByaW50ZiAiJHYiCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3YzRiZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK3dvcmR9IH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjA2M2ZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAxLnRlc3RzCkBAIC0wLDAgKzEgQEAKK3sgZWNobyB3b3JkfSB9OyB9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGQ5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMi5yaWdodApAQCAtMCwwICsxLDIgQEAKK2dvdCBURVJNCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5OTE3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMgQnVnIHdhcyBpbiBoYW5kbGluZyBvZiAifSYiIHdpdGhvdXQgc3BhY2UKK3sgdHJhcCAiZWNobyBnb3QgVEVSTSIgVEVSTTsgc2xlZXAgMjsgfSYgc2xlZXAgMTsga2lsbCAkITsgd2FpdAorZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cHNfYW5kX2tleXdvcmRzMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXBzX2FuZF9rZXl3b3JkczEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0NjY1MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXBzX2FuZF9rZXl3b3JkczEucmlnaHQKQEAgLTAsMCArMSwxMSBAQAorU2VtaWNvbG9ucyBhZnRlciB9IGNhbiBiZSBvbWl0dGVkIDE6Citmb28KK2JhcgorU2VtaWNvbG9ucyBhZnRlciB9IGNhbiBiZSBvbWl0dGVkIDI6Citmb28KK2JhcgorU2VtaWNvbG9ucyBhZnRlciBmaSBjYW4gYmUgb21pdHRlZDoKK2ZvbworYmFyCitiYXoKK0RvbmU6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cHNfYW5kX2tleXdvcmRzMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXBzX2FuZF9rZXl3b3JkczEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDE5NDRkNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXBzX2FuZF9rZXl3b3JkczEudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorZWNobyAiU2VtaWNvbG9ucyBhZnRlciB9IGNhbiBiZSBvbWl0dGVkIDE6IgoraWYgeyBlY2hvIGZvbzsgfSB0aGVuIHsgZWNobyBiYXI7IH0gZmkKKworZWNobyAiU2VtaWNvbG9ucyBhZnRlciB9IGNhbiBiZSBvbWl0dGVkIDI6Igord2hpbGUgeyBlY2hvIGZvbzsgfSBkbyB7IGVjaG8gYmFyOyBicmVhazsgfSBkb25lCisKK2VjaG8gIlNlbWljb2xvbnMgYWZ0ZXIgZmkgY2FuIGJlIG9taXR0ZWQ6Igord2hpbGUgaWYgZWNobyBmb287IHRoZW4gZWNobyBiYXI7IGZpIGRvIGVjaG8gYmF6OyBicmVhazsgZG9uZQorCitlY2hvIERvbmU6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbmVnYXRlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9uZWdhdGUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMmVjZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbmVnYXRlLnJpZ2h0CkBAIC0wLDAgKzEsMzYgQEAKKyEgcHJpbnRpbmcgIQorMAorMQorMQorMAorMAorMAorIQorYQorYgorYworISAxCithIDEKK2IgMQorYyAxCishIDEKK2EgMQorYiAxCitjIDEKKzAKKzAKKzAKKzAKKzEKKzEKKzEKKzEKKzAKKzAKKzAKKzAKKzEKKzEKKzEKKzEKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbmVnYXRlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9uZWdhdGUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTExNTFjYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbmVnYXRlLnRlc3RzCkBAIC0wLDAgKzEsMTkgQEAKK2VjaG8gISBwcmludGluZyAhCishIGZhbHNlCitlY2hvICQ/CishIHRydWUKK2VjaG8gJD8KK2lmICEgZmFsc2U7IHRoZW4gZmFsc2U7IGVjaG8gJD87IGZpCitlY2hvICQ/CitpZiAhIGZhbHNlOyB0aGVuICEgZmFsc2U7IGVjaG8gJD87IGZpCitlY2hvICQ/CitQUklOVEY9YHdoaWNoIHByaW50ZmAKK2ZvciBhIGluICEgYSBiIGM7IGRvIGVjaG8gJGE7IGRvbmUKK2ZvciBhIGluICEgYSBiIGM7IGRvICEgcHJpbnRmICIkYSAiOyBlY2hvICQ/OyBkb25lCit0ZXN0IHgiJFBSSU5URiIgPSB4IiIgJiYgZXhpdCAxCitmb3IgYSBpbiAhIGEgYiBjOyBkbyAhICIkUFJJTlRGIiAiJGEgIjsgZWNobyAkPzsgZG9uZQorZm9yIGEgaW4gISBhIGIgYzsgZG8gISBwcmludGYgIiRhICIgfCBmYWxzZTsgZWNobyAkPzsgZG9uZQorZm9yIGEgaW4gISBhIGIgYzsgZG8gISBwcmludGYgIiRhICIgfCB0cnVlOyBlY2hvICQ/OyBkb25lCitmb3IgYSBpbiAhIGEgYiBjOyBkbyAhIHsgcHJpbnRmICIkYSAiIHwgZmFsc2U7IH07IGVjaG8gJD87IGRvbmUKK2ZvciBhIGluICEgYSBiIGM7IGRvICEgeyBwcmludGYgIiRhICIgfCB0cnVlOyB9OyBlY2hvICQ/OyBkb25lCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Mjc5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0hFTExPCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTMxMTNhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKyMgbmV4dCBsaW5lIGhhcyBubyBFT0whCitlY2hvIEhFTExPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA0OTFmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDIucmlnaHQKQEAgLTAsMCArMSBAQAorMQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjIwZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDIudGVzdHMKQEAgLTAsMCArMSw3IEBACisjIGxhc3QgbGluZSBoYXMgbm8gRU9MIQoraWYgdHJ1ZQordGhlbgorICBlY2hvIDEKK2Vsc2UKKyAgZWNobyAyCitmaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmODUxNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWM5NThlZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wzLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorIyBsYXN0IGxpbmUgaGFzIG5vIEVPTCEKK2VjaG8gInVudGVybWluYXRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcHJvY2Vzc19zdWJzdC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcHJvY2Vzc19zdWJzdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdiYzgwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9wcm9jZXNzX3N1YnN0LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVEVTVHp6QkVTVAorVEVTVCQoZWNobyB6eilCRVNUCitURVNUJ0JFU1QKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcHJvY2Vzc19zdWJzdC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcHJvY2Vzc19zdWJzdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTk5NmJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9wcm9jZXNzX3N1YnN0LnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyAiVEVTVGBlY2hvIHp6O2VjaG87ZWNob2BCRVNUIgorZWNobyAiVEVTVGBlY2hvICckKGVjaG8genopJ2BCRVNUIgorZWNobyAiVEVTVGBlY2hvICInImBCRVNUIgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM4MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTEucmlnaHQKQEAgLTAsMCArMSBAQAorJzEnCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1NTg5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2E9MQorZWNobyAiJyRhJyIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjOWVkYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKz4xCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkOTY2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMi50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2E9MQorZWNobyAiPiRhIgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU0NmRmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTMucmlnaHQKQEAgLTAsMCArMSwxMiBAQAorVGVzdGluZzogaW4gIiIKKy4uCitUZXN0aW5nOiBpbiAnJworLi4KK1Rlc3Rpbmc6IGluICRlbXB0eQorVGVzdGluZzogaW4gJGVtcHR5IiIKKy4uCitUZXN0aW5nOiBpbiAkZW1wdHknJworLi4KK1Rlc3Rpbmc6IGluICIkZW1wdHkiCisuLgorRmluaXNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVmZDU5NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUzLnRlc3RzCkBAIC0wLDAgKzEsMjEgQEAKK2VtcHR5PScnCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICIiJworZm9yIGEgaW4gIiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICciJyciCitmb3IgYSBpbiAnJzsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGVtcHR5JworZm9yIGEgaW4gJGVtcHR5OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkZW1wdHkiIicKK2ZvciBhIGluICRlbXB0eSIiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkZW1wdHknIicnIgorZm9yIGEgaW4gJGVtcHR5Jyc7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICIkZW1wdHkiJworZm9yIGEgaW4gIiRlbXB0eSI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gRmluaXNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGU0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5MDFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGU0LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2EgYgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWRhYmZhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTQudGVzdHMKQEAgLTAsMCArMSwyIEBACithX2I9J2EgYicKK2VjaG8gIiRhX2IiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3JlZGlyX3NwYWNlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9yZWRpcl9zcGFjZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQyOTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9yZWRpcl9zcGFjZS5yaWdodApAQCAtMCwwICsxLDMgQEAKK3oxLnRtcDogMQorejIudG1wOiAxCisiejEudG1wIHoyLnRtcCI6IFRFU1QgMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9yZWRpcl9zcGFjZS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcmVkaXJfc3BhY2UudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzBiNTQzMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcmVkaXJfc3BhY2UudGVzdHMKQEAgLTAsMCArMSw2IEBACit2PSd6MS50bXAgejIudG1wJworZWNobyBURVNUID4kdgorZWNobyAnejEudG1wOicgYGNhdCAnejEudG1wJyAyPi9kZXYvbnVsbDsgZWNobyAkP2AKK2VjaG8gJ3oyLnRtcDonIGBjYXQgJ3oyLnRtcCcgMj4vZGV2L251bGw7IGVjaG8gJD9gCitlY2hvICciejEudG1wIHoyLnRtcCI6JyBgY2F0ICd6MS50bXAgejIudG1wJyAyPi9kZXYvbnVsbDsgZWNobyAkP2AKK3JtIHoqLnRtcApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjMyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQucmlnaHQKQEAgLTAsMCArMSw4IEBACisuMSBhYmMgZCBlIGYuCisuMS4KKy5hYmMuCisuZCBlIGYuCisuLTEgYWJjIGQgZSBmLS4KKy4tMS4KKy5hYmMuCisuZCBlIGYtLgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmZTQ5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQudGVzdHMKQEAgLTAsMCArMSw4IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIDEgYWJjICdkIGUgZicKK2ZpCisKK2ZvciBhIGluICIkKiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitmb3IgYSBpbiAiJEAiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZm9yIGEgaW4gIi0kKi0iOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZm9yIGEgaW4gIi0kQC0iOyBkbyBlY2hvICIuJGEuIjsgZG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZjQwOAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZDIucmlnaHQKQEAgLTAsMCArMSw4IEBACitTaG91bGQgYmUgcHJpbnRlZAorV291bGQgbm90IGJlIHByaW50ZWQgYnkgYmFzaAorV291bGQgbm90IGJlIHByaW50ZWQgYnkgYmFzaAorV291bGQgbm90IGJlIHByaW50ZWQgYnkgYmFzaAorU2hvdWxkIGJlIHByaW50ZWQKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZDIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjNWZmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQyLnRlc3RzCkBAIC0wLDAgKzEsMTkgQEAKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiCitmaQorCisjIE5vIHBhcmFtcyEKK2ZvciBhIGluICIkKiI7IGRvIGVjaG8gU2hvdWxkIGJlIHByaW50ZWQ7IGRvbmUKK2ZvciBhIGluICIkQCI7IGRvIGVjaG8gU2hvdWxkIG5vdCBiZSBwcmludGVkOyBkb25lCisjIFllcywgYmVsaWV2ZSBpdCBvciBub3QsIGJhc2ggaXMgbWVzbWVyaXplZCBieSAiJEAiIGFuZCBzdG9wcworIyB0cmVhdGluZyAiIiBhcyAidGhpcyB3b3JkIGNhbm5vdCBiZSBleHBhbmRlZCB0byBub3RoaW5nLAorIyBidXQgbXVzdCBiZSBhdCBsZWFzdCBudWxsIHN0cmluZyIuIE5vdyBpdCBjYW4gYmUgZXhwYW5kZWQgdG8gbm90aGluZy4KK2ZvciBhIGluICIkQCIiIjsgZG8gZWNobyBXb3VsZCBub3QgYmUgcHJpbnRlZCBieSBiYXNoOyBkb25lCitmb3IgYSBpbiAiIiIkQCI7IGRvIGVjaG8gV291bGQgbm90IGJlIHByaW50ZWQgYnkgYmFzaDsgZG9uZQorZm9yIGEgaW4gIiIiJEAiJyciJEAiJyc7IGRvIGVjaG8gV291bGQgbm90IGJlIHByaW50ZWQgYnkgYmFzaDsgZG9uZQorZm9yIGEgaW4gIiI7IGRvIGVjaG8gU2hvdWxkIGJlIHByaW50ZWQ7IGRvbmUKKworIyBCdWcgMjA3OiAiJEAiIGV4cGFuZHMgdG8gbm90aGluZywgYW5kIHdlIGVycm9uZW91c2x5IGdsb2IgIiVzXG4iIHR3aWNlOgorcHJpbnRmICdFbXB0eTolc1xuJyAiJEAiCitwcmludGYgIkVtcHR5OiVzXG4iICIkQCIKK3ByaW50ZiAiRW1wdHk6JXNcXG4iICIkQCIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9lbXB0eXRpY2sucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZW1wdHl0aWNrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDBjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZW1wdHl0aWNrLnJpZ2h0CkBAIC0wLDAgKzEsMTcgQEAKKzAKKzAKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEyNworaHVzaDogY2FuJ3QgZXhlY3V0ZSAnJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMTI3CiswCiswCiswCiswCitodXNoOiBjYW4ndCBleGVjdXRlICcnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxMjcKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEyNworMAorMAoraHVzaDogY2FuJ3QgZXhlY3V0ZSAnJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2VtcHR5dGljay50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9lbXB0eXRpY2sudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFmZmFmYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9lbXB0eXRpY2sudGVzdHMKQEAgLTAsMCArMSwxNiBAQAordHJ1ZTsgIGBgOyBlY2hvICQ/CitmYWxzZTsgYGA7IGVjaG8gJD8KK3RydWU7ICBgIiJgOyBlY2hvICQ/CitmYWxzZTsgYCIiYDsgZWNobyAkPwordHJ1ZTsgIGAgICAgIGA7IGVjaG8gJD8KK2ZhbHNlOyBgICAgICBgOyBlY2hvICQ/CisKK3RydWU7ICAkKCk7IGVjaG8gJD8KK2ZhbHNlOyAkKCk7IGVjaG8gJD8KK3RydWU7ICAkKCIiKTsgZWNobyAkPworZmFsc2U7ICQoIiIpOyBlY2hvICQ/Cit0cnVlOyAgJCggICAgICk7IGVjaG8gJD8KK2ZhbHNlOyAkKCAgICAgKTsgZWNobyAkPworCitleGVjICcnOyBlY2hvICQ/CitlY2hvIE5vdCByZWFjaGVkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZmFsc2V0aWNrLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2ZhbHNldGljay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk4ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2ZhbHNldGljay5yaWdodApAQCAtMCwwICsxLDI3IEBACiswCiswCiswCiswCisyCisyCisyCisyCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitodXNoOiBjYW4ndCBvcGVuICcvZG9lcy9ub3QvZXhpc3QnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxCitEb25lOiBhPWIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9mYWxzZXRpY2sudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZmFsc2V0aWNrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ0ZDJlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZmFsc2V0aWNrLnRlc3RzCkBAIC0wLDAgKzEsMjIgQEAKKyMgRXhpdGNvZGUgMCAoYGAgaGFzIG5vIGV4aXRjb2RlLCBidXQgYXNzaWdubWVudCBoYXMpOgordHJ1ZTsgIGE9YGA7IGVjaG8gJD8KK2ZhbHNlOyBhPWBgOyBlY2hvICQ/Cit0cnVlOyAgYT0kKCk7IGVjaG8gJD8KK2ZhbHNlOyBhPSQoKTsgZWNobyAkPworIyBFeGl0Y29kZSAyIChgY21kYCBleHBhbnNpb24gc2V0cyBleGl0Y29kZSBhZnRlciBhc3NpZ25tZW50IHNldCBpdCB0byAwKToKK3RydWU7ICBhPWBleGl0IDJgOyBlY2hvICQ/CitmYWxzZTsgYT1gZXhpdCAyYDsgZWNobyAkPwordHJ1ZTsgIGE9JChleGl0IDIpOyBlY2hvICQ/CitmYWxzZTsgYT0kKGV4aXQgMik7IGVjaG8gJD8KKyMgRXhpdGNvZGUgMSAocmVkaXJlY3Qgc2V0cyBleGl0Y29kZSB0byAxIG9uIGVycm9yIGFmdGVyIHRoZW0pOgordHJ1ZTsgIGE9YGAgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPworZmFsc2U7IGE9YGAgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPwordHJ1ZTsgIGE9JCgpID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK2ZhbHNlOyBhPSQoKSA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/Cit0cnVlOyAgYT1gZXhpdCAyYCA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/CitmYWxzZTsgYT1gZXhpdCAyYCA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/Cit0cnVlOyAgYT0kKGV4aXQgMikgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPworZmFsc2U7IGE9JChleGl0IDIpID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KKyMgLi4uYW5kIGFzc2lnbm1lbnQgc3RpbGwgaGFwcGVucyBkZXNwaXRlIHJlZGlyZWN0IGVycm9yOgordHJ1ZTsgIGE9JChlY2hvIGIpID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK2VjaG8gIkRvbmU6IGE9JGEiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljay5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDI4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljay5yaWdodApAQCAtMCwwICsxLDIgQEAKKzEKKzEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2sudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWY3NDlhOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAordHJ1ZQorZmFsc2U7IGVjaG8gYGVjaG8gJD9gCit0cnVlCit7IGZhbHNlOyBlY2hvIGBlY2hvICQ/YDsgfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2syLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2syLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNmM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazIucmlnaHQKQEAgLTAsMCArMSBAQAorQkFaCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI0ZTk0NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2lmIGZhbHNlOyB0aGVuCisgICAgZWNobyAiRk9PIgorICAgIHRtcD1gZWNobyBCQVIgPiYyYAorZmkKK2VjaG8gQkFaCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmMjY3YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMy5yaWdodApAQCAtMCwwICsxLDYgQEAKK1xURVNUWlpCRVNUCiskVEVTVAorUQorYVxiYworMTEtJGEtXHQtXC1cIi1gLVwtLVx6LVwqLVw/LTIyIDMzLSRhLVx0LVwtIi1gLVwtLVx6LVwqLVw/LTQ0Citkb25lOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYWViMjQxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2szLnRlc3RzCkBAIC0wLDAgKzEsMTQgQEAKK3Rlc3QgIiRDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPIiA9ICJ5IiB8fCBleGl0IDc3CisKK1RFU1Q9UQorIyBcYCBpcyBzcGVjaWFsCitlY2hvIGBlY2hvICdcJ1RFU1RcYGVjaG8gWlpcYEJFU1RgCisjIFwkIGFuZCBcXCBhcmUgc3BlY2lhbAorZWNobyBgZWNobyBcXCRURVNUYAorZWNobyBgZWNobyBcJFRFU1RgCitlY2hvIGFgZWNobyBcXFxcYmBjCisKKyMgXCIgaXMgbm90IHNwZWNpYWwgaWYgaW4gdW5xdW90ZWQgYGNtZGAgKHBhc3NlZCB2ZXJiYXRpbSBXSVRIIFwpLAorIyBidXQgaXMgc3BlY2lhbCBpbiBxdW90ZWQgb25lCitlY2hvIGBlY2hvIDExJy0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0nMjJgICJgZWNobyAzMyctJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tJzQ0YCIKK2VjaG8gZG9uZTokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDMwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazQucmlnaHQKQEAgLTAsMCArMSw3IEBACisoVEVTVCkgQkVTVAorVEVTVCkgQkVTVAorKChURVNUKSBCRVNUCispCithYmMKK2EpYworT0s6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjMwNWZiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s0LnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorZWNobyAkKGVjaG8gJyhURVNUKScgQkVTVCkKK2VjaG8gJChlY2hvICdURVNUKScgQkVTVCkKK2VjaG8gJChlY2hvIFwoXChURVNUXCkgQkVTVCkKK2VjaG8gJChlY2hvIFwpKQorZWNobyAkKGVjaG8gYSJgZWNobyAiYiJgImMgKQorZWNobyAkKGVjaG8gYSJgZWNobyAiKSJgImMgKQorZWNobyBPSzogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA0OTFmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s1LnJpZ2h0CkBAIC0wLDAgKzEgQEAKKzEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDE2MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s1LnRlc3RzCkBAIC0wLDAgKzEgQEAKK3RydWU7IGVjaG8gYGZhbHNlYCAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2tfaHVnZS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrX2h1Z2UucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NDBmNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrX2h1Z2UucmlnaHQKQEAgLTAsMCArMSwzIEBACis1NDZlZDNmNWM4MWM3ODBkM2FiODZhZGExNDgyNDIzNyAgLQorNTQ2ZWQzZjVjODFjNzgwZDNhYjg2YWRhMTQ4MjQyMzcgIC0KK0VuZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2tfaHVnZS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrX2h1Z2UudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWNjZTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrX2h1Z2UudGVzdHMKQEAgLTAsMCArMSw3IEBACisjIFRoaXMgY3JlYXRlcyAxMjBrIGZpbGUKK3llcyAiMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IiB8IGhlYWQgLTMwMDAgPj4iJDAudG1wIgorCitlY2hvICJgY2F0ICQwLnRtcGAiIHwgbWQ1c3VtCitybSAiJDAudG1wIgoreWVzICIxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkiIHwgaGVhZCAtMzAwMCB8IG1kNXN1bQorZWNobyBFbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9SRVBMWS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9SRVBMWS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY1ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAordGVzdCAxOiB8ICBhYmMxICBkZWYgIHwKK3Rlc3QgMjogfCAgXGFiYzIgIGRcZWYgIHwKK3Rlc3QgMzogfGFiYzMgIGRlZnwKK3Rlc3QgNDogfFxhYmM0ICBkXGVmfAorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX1JFUExZLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX1JFUExZLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhMjBjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMKQEAgLTAsMCArMSw1IEBACitlY2hvICcgIFxhYmMxICBkXGVmICAnIHwgKCByZWFkICAgICAgICAgOyBlY2hvICJ0ZXN0IDE6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmMyICBkXGVmICAnIHwgKCByZWFkIC1yICAgICAgOyBlY2hvICJ0ZXN0IDI6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmMzICBkXGVmICAnIHwgKCByZWFkICAgIFJFUExZOyBlY2hvICJ0ZXN0IDM6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmM0ICBkXGVmICAnIHwgKCByZWFkIC1yIFJFUExZOyBlY2hvICJ0ZXN0IDQ6IHwkUkVQTFl8IiApCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9pZnMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjMzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKK3Rlc3QgMTogLmEuIC5iLiAuYy4KK3Rlc3QgMjogLmEuIC5iLiAuYy4KK3Rlc3QgMzogLmEuIC4uIC5iLGMuCit0ZXN0IDQ6IC5hLiAuLiAuYixjLgordGVzdCA1OiAuYS4gLi4gLmMuCit0ZXN0IDY6IC5hLiAuLiAuYy4gLmQuCit0ZXN0IDc6IC5hLiAuLiAuYixjLGQgICwgICwuCit0ZXN0IDg6IC4uIC5hLiAuYi4gLmMuCit0ZXN0IDk6IC5hLiAuYi4gLmMuIC4uCit0ZXN0IEE6IC4uIC5hLiAuLiAuYi4gLmMuCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfaWZzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX2lmcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTgzMTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX2lmcy50ZXN0cwpAQCAtMCwwICsxLDEwIEBACitwcmludGYgJ2FcdFx0Ylx0Y1xuJyB8ICggSUZTPSQocHJpbnRmICJcdCIpIHJlYWQgYSBiIGM7ICBlY2hvICJ0ZXN0IDE6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2FcdFx0Ylx0Y1xuJyB8ICggSUZTPSQocHJpbnRmICIgXHQiKSByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDI6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EsLGIsY1xuJyAgICB8ICggSUZTPSIsIiByZWFkIGEgYiBjOyAgZWNobyAidGVzdCAzOiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhLCxiLGNcbicgICAgfCAoIElGUz0iICwiIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgNDogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSAsLCBjXG4nICAgIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDU6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EgLCwgYyBkXG4nICB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYyBkOyAgICAgZWNobyAidGVzdCA2OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJyBhLCxiLGMsZCAgLCAgLFxuJyB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYzsgZWNobyAidGVzdCA3OiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdcdCxcdGFcdCxcdGJcdGMnICAgfCAoIElGUz0kKHByaW50ZiAiIFx0LCIpIHJlYWQgYSBiIGMgZDsgICBlY2hvICJ0ZXN0IDg6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnXHRcdGFcdCxcdGJcdGMnICAgIHwgKCBJRlM9JChwcmludGYgIiBcdCwiKSByZWFkIGEgYiBjIGQ7ICAgZWNobyAidGVzdCA5OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJ1x0LFx0YVx0LCxcdGJcdGMnICB8ICggSUZTPSQocHJpbnRmICIgXHQsIikgcmVhZCBhIGIgYyBkIGU7IGVjaG8gInRlc3QgQTogLiRhLiAuJGIuIC4kYy4gLiRkLiAuJGUuIiApCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfbi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9uLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODFhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfbi5yaWdodApAQCAtMCwwICsxLDMgQEAKK3Rlc3QKK3RlcwordGVzCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfbi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9uLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyNDIzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfbi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvICd0ZXN0JyB8IChyZWFkIC1uIDMgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvICd0ZXN0JyB8IChyZWFkIC1uMyByZXBseTsgZWNobyAiJHJlcGx5IikKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9yLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzNmJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9yLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAordGVzdGJlc3QKK3Rlc3RcCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjNGNjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfci50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2VjaG8gLWUgJ3Rlc3RcXFxuYmVzdCcgfCAocmVhZCByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gLWUgJ3Rlc3RcXFxuYmVzdCcgfCAocmVhZCAtciByZXBseTsgZWNobyAiJHJlcGx5IikKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF90LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3QucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxMjZjYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF90LnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorPjwKKz48Cis+dGVzdDwKKz50ZXN0PApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3QudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjVmMWFlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3QudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorIyBiYXNoIDMuMiBvdXRwdXRzOgorCisjID48Cit7IGVjaG8gLW4gJ3RlJzsgc2xlZXAgMjsgZWNobyAnc3QnOyB9ICAgfCAocmVhZCAtdCAxIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID48Cit7ICAgICAgICAgICAgICAgc2xlZXAgMjsgZWNobyAndGVzdCc7IH0gfCAocmVhZCAtdCAxIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID50ZXN0PAoreyBlY2hvIC1uICd0ZSc7IHNsZWVwIDE7IGVjaG8gJ3N0JzsgfSAgIHwgKHJlYWQgLXQgMiByZXBseTsgZWNobyAiPiRyZXBseTwiKQorIyA+dGVzdDwKK3sgICAgICAgICAgICAgICBzbGVlcCAxOyBlY2hvICd0ZXN0JzsgfSB8IChyZWFkIC10IDIgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvY2F0Y2gucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2NhdGNoLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTA2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2NhdGNoLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorc2VuZGluZyBVU1IyCitjYXVnaHQKK3NlbmRpbmcgVVNSMgorc2VuZGluZyBVU1IyCitVU1IyCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2NhdGNoLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9jYXRjaC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMmEyMWQxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9jYXRjaC50ZXN0cwpAQCAtMCwwICsxLDIwIEBACisjIGF2b2lkIHVnbHkgd2FybmluZ3MgYWJvdXQgc2lnbmFscyBub3QgYmVpbmcgY2F1Z2h0Cit0cmFwICI6IiBVU1IxIFVTUjIKKworIiRUSElTX1NIIiAtYyAnCit0cmFwICJlY2hvIGNhdWdodCIgVVNSMgorZWNobyAic2VuZGluZyBVU1IyIgora2lsbCAtVVNSMiAkJAorCit0cmFwICIiIFVTUjIKK2VjaG8gInNlbmRpbmcgVVNSMiIKK2tpbGwgLVVTUjIgJCQKKwordHJhcCAiLSIgVVNSMgorZWNobyAic2VuZGluZyBVU1IyIgora2lsbCAtVVNSMiAkJAorCitlY2hvICJub3QgcmVhY2hlZCIKKycKKwordHJhcCAiLSIgVVNSMSBVU1IyCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2V4aXQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2V4aXQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwMDcyNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvZXhpdC5yaWdodApAQCAtMCwwICsxLDEyIEBACitjb3cKK21vbworVHJhcHMxOgordHJhcCAtLSAnZXhpdGZ1bmMnIEVYSVQKK1RyYXBzMjoKK3RyYXAgLS0gJ2VjaG8gU2hvdWxkIG5vdCBydW4nIEVYSVQKK0NoZWNrMTogNDIKK1RyYXBzMToKK3RyYXAgLS0gJ2V4aXRmdW5jJyBFWElUCitUcmFwczI6Cit0cmFwIC0tICdlY2hvIFNob3VsZCBub3QgcnVuJyBFWElUCitDaGVjazI6IDQyCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2V4aXQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2V4aXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjA2MTEwNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvZXhpdC50ZXN0cwpAQCAtMCwwICsxLDM0IEBACisiJFRISVNfU0giIC1jICd0cmFwICJlY2hvIGNvdyIgMCcKKyIkVEhJU19TSCIgLWMgJ3RyYXAgImVjaG8gbW9vIiBFWElUJworIiRUSElTX1NIIiAtYyAndHJhcCAiZWNobyBubyIgMDsgdHJhcCAwJworCisoCitleGl0ZnVuYygpIHsKKyAgICAgICAgZWNobyAiVHJhcHMxOiIKKyAgICAgICAgdHJhcAorICAgICAgICAjIEVYSVQgdHJhcCBpcyBkaXNhYmxlZCBhZnRlciBpdCBpcyB0cmlnZ2VyZWQsCisgICAgICAgICMgaXQgY2FuIG5vdCBiZSAicmUtYXJtZWQiIGxpa2UgdGhpczoKKyAgICAgICAgdHJhcCAiZWNobyBTaG91bGQgbm90IHJ1biIgRVhJVAorICAgICAgICBlY2hvICJUcmFwczI6IgorICAgICAgICB0cmFwCit9Cit0cmFwICdleGl0ZnVuYycgRVhJVAorZXhpdCA0MgorKQorZWNobyBDaGVjazE6ICQ/CisKKygKK2V4aXRmdW5jKCkgeworICAgICAgICBlY2hvICJUcmFwczE6IgorICAgICAgICB0cmFwCisgICAgICAgICMgRVhJVCB0cmFwIGlzIGRpc2FibGVkIGFmdGVyIGl0IGlzIHRyaWdnZXJlZCwKKyAgICAgICAgIyBpdCBjYW4gbm90IGJlICJyZS1hcm1lZCIgbGlrZSB0aGlzOgorICAgICAgICB0cmFwICJlY2hvIFNob3VsZCBub3QgcnVuIiBFWElUCisgICAgICAgIGVjaG8gIlRyYXBzMjoiCisgICAgICAgIHRyYXAKKyAgICAgICAgZXhpdCA0MgorfQordHJhcCAnZXhpdGZ1bmMnIEVYSVQKK2V4aXQgNjYKKykKK2VjaG8gQ2hlY2syOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZlLXJldC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZS1yZXQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlMTJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZS1yZXQucmlnaHQKQEAgLTAsMCArMSwyIEBACitZRUFICiswCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmUtcmV0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZlLXJldC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzg2YjZkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZlLXJldC50ZXN0cwpAQCAtMCwwICsxLDQgQEAKKyMgbWFrZSBzdXJlIHdlIGRvIG5vdCBjb3JydXB0ICQ/IGFjcm9zcyB0cmFwcwordHJhcCAiZWNobyBZRUFIOyBmYWxzZSIgVVNSMQora2lsbCAtVVNSMSAkJAorZWNobyAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZldHJhcC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZXRyYXAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MjI1YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZXRyYXAucmlnaHQKQEAgLTAsMCArMSw4IEBACit0cmFwIC0tICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgLS0gJ2VjaG8gV0lOQ0ghJyBXSU5DSAordHJhcCAtLSAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwIC0tICdlY2hvIFdJTkNIIScgV0lOQ0gKK3RyYXAgLS0gJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAtLSAnZWNobyBXSU5DSCEnIFdJTkNICitEb25lCitFeGl0aW5nCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmV0cmFwLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZldHJhcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmIzMTJmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZldHJhcC50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK3RyYXAgJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAnZWNobyBXSU5DSCEnIFNJR1dJTkNICit2PWAgdHJhcCAgIGAKK2VjaG8gIiR2Igordj0kKAl0cmFwICkKK2VjaG8gIiR2Igordj1gdHJhcGAKK2VjaG8gIiR2IgorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbDcucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbDcucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NDUzZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsNy5yaWdodApAQCAtMCwwICsxIEBACitCdWcgZGV0ZWN0ZWQ6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsNy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsNy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmIxMzgxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWw3LnRlc3RzCkBAIC0wLDAgKzEsMTggQEAKK2J1ZygpIHsKKwl0cmFwIDogZXhpdAorCSMgQnVnIHdhcyBjYXVzaW5nIHNoIHRvIGJlIHJ1biBpbiBzdWJzaGVsbCwKKwkjIGFzIGlmIHRoaXMgbGluZSBpcyByZXBsYWNlZCB3aXRoIChzaCAtYyAuLi47IGV4aXQgJD8pICYKKwkjIGhlcmU6CisJc2ggLWMgJ2VjaG8gUkVBTF9DSElMRD0kJCcgJgorCWVjaG8gUEFSRU5UU19JREVBX09GX0NISUxEPSQhCisJd2FpdCAgIyBtYWtlIHN1cmUgYmtnZCBzaGVsbCBjb21wbGV0ZXMKK30KKworYnVnIHwgeword2hpbGUgcmVhZCB2YXJ2YWw7IGRvCisJZXZhbCAkdmFydmFsCitkb25lCit0ZXN0IHgiJFJFQUxfQ0hJTEQiICE9IHgiIiBcCismJiB0ZXN0IHgiJFJFQUxfQ0hJTEQiID0geCIkUEFSRU5UU19JREVBX09GX0NISUxEIgorZWNobyAiQnVnIGRldGVjdGVkOiAkPyIKK30KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3MGE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0dvdCBIVVA6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMTA1NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDEudGVzdHMKQEAgLTAsMCArMSw1IEBACisoc2xlZXAgMTsga2lsbCAtSFVQICQkKSAmCit0cmFwICdlY2hvICJHb3QgSFVQOiQ/IjsgZXhpdCcgSFVQCit3aGlsZSB0cnVlOyBkbworCXJlYWQgaWdub3JlZAorZG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE2YmMxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDIucmlnaHQKQEAgLTAsMCArMSwyIEBACitIVVAKK0RvbmU6MTI5CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhYjViOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMi50ZXN0cwpAQCAtMCwwICsxLDcgQEAKKyRUSElTX1NIIC1jICcKKyhzbGVlcCAxOyBraWxsIC1IVVAgJCQpICYKK3doaWxlIHRydWU7IGRvCisJcmVhZCBpZ25vcmVkCitkb25lCisnCitlY2hvICJEb25lOiQ/IgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zdWJzaGVsbC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc3Vic2hlbGwucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2NWI5MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc3Vic2hlbGwucmlnaHQKQEAgLTAsMCArMSwyMSBAQAordHJhcCAtLSAnJyBIVVAKK3RyYXAgLS0gJycgUVVJVAordHJhcCAtLSAnJyBTWVMKK09rCit0cmFwIC0tICcnIEhVUAordHJhcCAtLSAnJyBRVUlUCit0cmFwIC0tICcnIFNZUworT2sKK3RyYXAgLS0gJycgSFVQCit0cmFwIC0tICcnIFFVSVQKK3RyYXAgLS0gJycgU1lTCitPawordHJhcCAtLSAnJyBIVVAKK3RyYXAgLS0gJycgUVVJVAordHJhcCAtLSAnJyBTWVMKK09rCit0cmFwIC0tICcnIEhVUAordHJhcCAtLSAnJyBRVUlUCit0cmFwIC0tICcnIFNZUworVEVSTQorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zdWJzaGVsbC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc3Vic2hlbGwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDg3N2YyYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc3Vic2hlbGwudGVzdHMKQEAgLTAsMCArMSwxOSBAQAorIyBOb24tZW1wdHkgdHJhcHMgc2hvdWxkIGJlIHJlc2V0IGluIHN1YnNoZWxsCisKKyMgSFVQIGlzIHNwZWNpYWwgaW4gaW50ZXJhY3RpdmUgc2hlbGxzCit0cmFwICcnIEhVUAorIyBRVUlUIGlzIGFsd2F5cyBzcGVjaWFsCit0cmFwICcnIFFVSVQKKyMgU1lTIGlzIG5vdCBzcGVjaWFsCit0cmFwICcnIFNZUworIyBXSU5DSCBpcyBoYXJtbGVzcwordHJhcCAnYmFkOiBjYXVnaHQgV0lOQ0gnIFdJTkNICisjIFdpdGggVEVSTSB3ZSdsbCBjaGVjayB3aGV0aGVyIGl0IGlzIHJlc2V0Cit0cmFwICdiYWQ6IGNhdWdodCBURVJNJyAgVEVSTQorCisodHJhcDsgIiRUSElTX1NIIiAtYyAna2lsbCAtSFVQICAgJFBQSUQnOyBlY2hvIE9rKQorKHRyYXA7ICIkVEhJU19TSCIgLWMgJ2tpbGwgLVFVSVQgICRQUElEJzsgZWNobyBPaykKKyh0cmFwOyAiJFRISVNfU0giIC1jICdraWxsIC1TWVMgICAkUFBJRCc7IGVjaG8gT2spCisodHJhcDsgIiRUSElTX1NIIiAtYyAna2lsbCAtV0lOQ0ggJFBQSUQnOyBlY2hvIE9rKQorKHRyYXA7ICIkVEhJU19TSCIgLWMgJ2tpbGwgLVRFUk0gICRQUElEJzsgZWNobyBCYWQ6IFRFUk0gaXMgbm90IHJlc2V0KQorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3VzYWdlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC91c2FnZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRiZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC91c2FnZS5yaWdodApAQCAtMCwwICsxLDE0IEBACitfX18KK19fXworX19fCit0cmFwIC0tICdhJyBFWElUCit0cmFwIC0tICdhJyBJTlQKK3RyYXAgLS0gJ2EnIFVTUjEKK3RyYXAgLS0gJ2EnIFVTUjIKK19fXworX19fCit0cmFwIC0tICdhJyBVU1IxCit0cmFwIC0tICdhJyBVU1IyCitfX18KK19fXwordHJhcCAtLSAnYScgVVNSMgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC91c2FnZS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvdXNhZ2UudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDI5YzZlNwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvdXNhZ2UudGVzdHMKQEAgLTAsMCArMSwyMyBAQAorIyBubyBvdXRwdXQgLS0gZGVmYXVsdCBzdGF0ZQorZWNobyBfX18KK3RyYXAKKworIyBhc3NpZ24gc29tZSB0cmFwcworZWNobyBfX18KK3RyYXAgImEiIEVYSVQgSU5UIFVTUjEgVVNSMgorCisjIHNob3cgdGhlbSBhbGwKK2VjaG8gX19fCit0cmFwCisKKyMgY2xlYXIgb25lCitlY2hvIF9fXwordHJhcCAwIElOVAorZWNobyBfX18KK3RyYXAKKworIyBjbGVhciBhbm90aGVyCitlY2hvIF9fXwordHJhcCAiLSIgVVNSMQorZWNobyBfX18KK3RyYXAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZW1wdHkucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2VtcHR5LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjNjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2VtcHR5LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorYSBiIGMgZCBlIGYgMSAyIDMgNCA1IDYgNyA4IDkgMCBBIEIgQyBEIEUgRgorYSBiIGMgZCBlIGYgMSAyIDMgNCA1IDYgNyA4IDkgMCBBIEIgQyBEIEUgRgorYSBiIGMgZCBlIGYgMSAyIDMgNCA1IDYgNyA4IDkgMCBBIEIgQyBEIEUgRgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9lbXB0eS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZW1wdHkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTljMjQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZW1wdHkudGVzdHMKQEAgLTAsMCArMSw1IEBACitlPQorCitlY2hvIGEgYiBjIGQgZSBmIDEgMiAzIDQgNSA2IDcgOCA5IDAgQSBCIEMgRCBFIEYKK2VjaG8gYSAkZSBiICRlIGMgJGUgZCAkZSBlICRlIGYgJGUgMSAkZSAyICRlIDMgJGUgNCAkZSA1ICRlIDYgJGUgNyAkZSA4ICRlIDkgJGUgMCAkZSBBICRlIEIgJGUgQyAkZSBEICRlIEUgJGUgRgorZWNobyAkZSBhICRlIGIgJGUgYyAkZSBkICRlIGUgJGUgZiAkZSAxICRlIDIgJGUgMyAkZSA0ICRlIDUgJGUgNiAkZSA3ICRlIDggJGUgOSAkZSAwICRlIEEgJGUgQiAkZSBDICRlIEQgJGUgRSAkZSBGCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2dsb2JfYW5kX3ZhcnMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2dsb2JfYW5kX3ZhcnMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZ2xvYl9hbmRfdmFycy5yaWdodApAQCAtMCwwICsxIEBACisuL2dsb2JfYW5kX3ZhcnMucmlnaHQgLi9nbG9iX2FuZF92YXJzLnRlc3RzCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2dsb2JfYW5kX3ZhcnMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2dsb2JfYW5kX3ZhcnMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDgyY2Y5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZ2xvYl9hbmRfdmFycy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3Y9LgorZWNobyAkdi9nbG9iX2FuZF92YXJzLlt0cl0qCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hbHQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hbHQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMThkNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2FsdC5yaWdodApAQCAtMCwwICsxLDggQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK19fIF9fCitfIF8gXyBfIF8KK19hYWFhIF8gXyBfd29yZCBfd29yZAorXyBfIF8gXyBfCitfIF8gXyBfd29yZCBfCitfZmZmIF8gXyBfd29yZCBfd29yZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYWx0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYWx0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiNjQ2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hbHQudGVzdHMKQEAgLTAsMCArMSwyMiBAQAorIyBmaXJzdCB0cnkgc29tZSBpbnZhbGlkIHBhdHRlcm5zIChkbyBpbiBzdWJzaGVsbCBkdWUgdG8gcGFyc2luZyBlcnJvcikKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsrfSAgOyBlY2hvIG1vbycKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6K30gOyBlY2hvIG1vbycKKworIyBub3cgc29tZSBmdW5reSBvbmVzLiAoYmFzaCBkb2Vzbid0IGFjY2VwdCAkeyMrfSkKK2VjaG8gXyR7Iyt9XyBfJHsjOit9XworCisjIG5vdyBzb21lIHZhbGlkIG9uZXMKK3NldCAtLQorZWNobyBfJDEgXyR7MSt9IF8kezE6K30gXyR7MSt3b3JkfSBfJHsxOit3b3JkfQorCitzZXQgLS0gYWFhYQorZWNobyBfJDEgXyR7MSt9IF8kezE6K30gXyR7MSt3b3JkfSBfJHsxOit3b3JkfQorCit1bnNldCBmCitlY2hvIF8kZiBfJHtmK30gXyR7ZjorfSBfJHtmK3dvcmR9IF8ke2Y6K3dvcmR9CisKK2Y9CitlY2hvIF8kZiBfJHtmK30gXyR7ZjorfSBfJHtmK3dvcmR9IF8ke2Y6K3dvcmR9CisKK2Y9ZmZmCitlY2hvIF8kZiBfJHtmK30gXyR7ZjorfSBfJHtmK3dvcmR9IF8ke2Y6K3dvcmR9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hc3NpZ24ucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hc3NpZ24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViMjU4MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Fzc2lnbi5yaWdodApAQCAtMCwwICsxLDI3IEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CiswCiswCitodXNoOiAkMTogY2Fubm90IGFzc2lnbiBpbiB0aGlzIHdheQoraHVzaDogJDE6IGNhbm5vdCBhc3NpZ24gaW4gdGhpcyB3YXkKK2h1c2g6ICQxOiBjYW5ub3QgYXNzaWduIGluIHRoaXMgd2F5CitodXNoOiAkMTogY2Fubm90IGFzc2lnbiBpbiB0aGlzIHdheQorX2FhCitfYWEKK19hYQorX2FhCitfCitfCitfCitfd29yZAorX3dvcmQKK18KK18KK18KK18KK193b3JkCitfZmZmCitfZmZmCitfZmZmCitfZmZmCitfZmZmCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hc3NpZ24udGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hc3NpZ24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTQ5Y2IyMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Fzc2lnbi50ZXN0cwpAQCAtMCwwICsxLDM4IEBACisjIGZpcnN0IHRyeSBzb21lIGludmFsaWQgcGF0dGVybnMgKGRvIGluIHN1YnNoZWxsIGR1ZSB0byBwYXJzaW5nIGVycm9yKQorIiRUSElTX1NIIiAtYyAnZWNobyAkez19JworIiRUSElTX1NIIiAtYyAnZWNobyAkezo9fScKKworIyBub3cgc29tZSBmdW5reSBvbmVzCisiJFRISVNfU0giIC1jICdlY2hvICR7Iz19JworIiRUSElTX1NIIiAtYyAnZWNobyAkeyM6PX0nCisKKyMgc2hvdWxkIGVycm9yIG91dAorIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE9fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxOj19JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE9d29yZH0nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MTo9d29yZH0nCisKKyMgc2hvdWxkIG5vdCBlcnJvcgorIiRUSElTX1NIIiAtYyAnc2V0IGFhOyBlY2hvIF8kezE9fScKKyIkVEhJU19TSCIgLWMgJ3NldCBhYTsgZWNobyBfJHsxOj19JworIiRUSElTX1NIIiAtYyAnc2V0IGFhOyBlY2hvIF8kezE9d29yZH0nCisiJFRISVNfU0giIC1jICdzZXQgYWE7IGVjaG8gXyR7MTo9d29yZH0nCisKKyMgc2hvdWxkIHdvcmsgZmluZQordW5zZXQgZjsgZWNobyBfJGYKK3Vuc2V0IGY7IGVjaG8gXyR7Zj19Cit1bnNldCBmOyBlY2hvIF8ke2Y6PX0KK3Vuc2V0IGY7IGVjaG8gXyR7Zj13b3JkfQordW5zZXQgZjsgZWNobyBfJHtmOj13b3JkfQorCitmPTsgZWNobyBfJGYKK2Y9OyBlY2hvIF8ke2Y9fQorZj07IGVjaG8gXyR7Zjo9fQorZj07IGVjaG8gXyR7Zj13b3JkfQorZj07IGVjaG8gXyR7Zjo9d29yZH0KKworZj1mZmY7IGVjaG8gXyRmCitmPWZmZjsgZWNobyBfJHtmPX0KK2Y9ZmZmOyBlY2hvIF8ke2Y6PX0KK2Y9ZmZmOyBlY2hvIF8ke2Y9d29yZH0KK2Y9ZmZmOyBlY2hvIF8ke2Y6PXdvcmR9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9iYXNoX3N1YnN0cmluZy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Jhc2hfc3Vic3RyaW5nLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNGM1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9iYXNoX3N1YnN0cmluZy5yaWdodApAQCAtMCwwICsxLDY0IEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CiswMTIzNDU2Nzg5CisxICAgID18fAorMToxICA9fHwKKzE6MToyPXx8CisxOjoyID18fAorMToxOiA9fHwKKzE6OiAgPXx8CisxICAgID18MDEyM3wKKzE6MSAgPXwxMjN8CisxOjE6Mj18MTJ8CisxOjoyID18MDF8CisxOjE6ID18fAorMTo6ICA9fHwKK2YgICAgPXx8CitmOjEgID18fAorZjoxOjI9fHwKK2Y6OjIgPXx8CitmOjE6ID18fAorZjo6ICA9fHwKK2YgICAgPXx8CitmOjEgID18fAorZjoxOjI9fHwKK2Y6OjIgPXx8CitmOjE6ID18fAorZjo6ICA9fHwKK2YgICAgPXxhfAorZjoxICA9fHwKK2Y6MToyPXx8CitmOjoyID18YXwKK2Y6MTogPXx8CitmOjogID18fAorZiAgICA9fDAxMjM0NTY3ODl8CitmOjEgID18MTIzNDU2Nzg5fAorZjoxOjI9fDEyfAorZjo6MiA9fDAxfAorZjoxOiA9fHwKK2Y6OiAgPXx8CitTdWJzdHJpbmdzIGZyb20gc3BlY2lhbCB2YXJzCis/ICAgID18MHwKKz86MSAgPXx8Cis/OjE6Mj18fAorPzo6MiA9fDB8Cis/OjE6ID18fAorPzo6ICA9fHwKKyMgICAgPXwxMXwKKyM6MSAgPXwxfAorIzoxOjI9fDF8CisjOjoyID18MTF8CisjOjE6ID18fAorIzo6ICA9fHwKK1N1YnN0cmluZ3Mgd2l0aCBleHByZXNzaW9ucworZiAgICAgICAgICAgID18MDEyMzQ1Njd8CitmOjErMToyKzIgICAgPXwyMzQ1fAorZjotMToyKzIgICAgID18MDEyMzQ1Njd8CitmOjE6ZiAgICAgICAgPXwxMjM0NTY3fAorZjoxOiRmICAgICAgID18MTIzNDU2N3wKK2Y6MToke2Z9ICAgICA9fDEyMzQ1Njd8CitmOjE6JHtmOjM6MX0gPXwxMjN8CitmOjE6MWBlY2hvIDFgPXwxfAorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYmFzaF9zdWJzdHJpbmcudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9iYXNoX3N1YnN0cmluZy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Yzk1NTJkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYmFzaF9zdWJzdHJpbmcudGVzdHMKQEAgLTAsMCArMSw4MyBAQAorIyBmaXJzdCB0cnkgc29tZSBpbnZhbGlkIHBhdHRlcm5zCisjIGRvIGFsbCBvZiB0aGVzZSBpbiBzdWJzaGVsbHMgc2luY2UgaXQncyBzdXBwb3NlZCB0byBlcnJvciBvdXQKK2V4cG9ydCB2YXI9MDEyMzQ1Njc4OQorIiRUSElTX1NIIiAtYyAnZWNobyAkezp9JworIiRUSElTX1NIIiAtYyAnZWNobyAkezo6fScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6MX0nCisiJFRISVNfU0giIC1jICdlY2hvICR7OjoxfScKKworI3RoaXMgYWxzbyBpcyBub3QgdmFsaWQgaW4gYmFzaCwgYnV0IHdlIGFjY2VwdCBpdDoKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHt2YXI6fScKKworIyB0aGVuIHNvbWUgZnVua3kgb25lcworIyBVTkZJWEVEIEJVRzogdGhpcyBzaG91bGQgd29yazogIiRUSElTX1NIIiAtYyAnZWNobyAkez86MH0nCisKKyMgbm93IHNvbWUgdmFsaWQgb25lcworc2V0IC0tOyBlY2hvICIxICAgID18JHsxfXwiCitzZXQgLS07IGVjaG8gIjE6MSAgPXwkezE6MX18Igorc2V0IC0tOyBlY2hvICIxOjE6Mj18JHsxOjE6Mn18Igorc2V0IC0tOyBlY2hvICIxOjoyID18JHsxOjoyfXwiCitzZXQgLS07IGVjaG8gIjE6MTogPXwkezE6MTp9fCIKK3NldCAtLTsgZWNobyAiMTo6ICA9fCR7MTo6fXwiCisKK3NldCAtLSAwMTIzOyBlY2hvICIxICAgID18JHsxfXwiCitzZXQgLS0gMDEyMzsgZWNobyAiMToxICA9fCR7MToxfXwiCitzZXQgLS0gMDEyMzsgZWNobyAiMToxOjI9fCR7MToxOjJ9fCIKK3NldCAtLSAwMTIzOyBlY2hvICIxOjoyID18JHsxOjoyfXwiCitzZXQgLS0gMDEyMzsgZWNobyAiMToxOiA9fCR7MToxOn18Igorc2V0IC0tIDAxMjM7IGVjaG8gIjE6OiAgPXwkezE6On18IgorCit1bnNldCBmOyBlY2hvICJmICAgID18JGZ8IgordW5zZXQgZjsgZWNobyAiZjoxICA9fCR7ZjoxfXwiCit1bnNldCBmOyBlY2hvICJmOjE6Mj18JHtmOjE6Mn18IgordW5zZXQgZjsgZWNobyAiZjo6MiA9fCR7Zjo6Mn18IgordW5zZXQgZjsgZWNobyAiZjoxOiA9fCR7ZjoxOn18IgordW5zZXQgZjsgZWNobyAiZjo6ICA9fCR7Zjo6fXwiCisKK2Y9OyBlY2hvICJmICAgID18JGZ8IgorZj07IGVjaG8gImY6MSAgPXwke2Y6MX18IgorZj07IGVjaG8gImY6MToyPXwke2Y6MToyfXwiCitmPTsgZWNobyAiZjo6MiA9fCR7Zjo6Mn18IgorZj07IGVjaG8gImY6MTogPXwke2Y6MTp9fCIKK2Y9OyBlY2hvICJmOjogID18JHtmOjp9fCIKKworZj1hOyBlY2hvICJmICAgID18JGZ8IgorZj1hOyBlY2hvICJmOjEgID18JHtmOjF9fCIKK2Y9YTsgZWNobyAiZjoxOjI9fCR7ZjoxOjJ9fCIKK2Y9YTsgZWNobyAiZjo6MiA9fCR7Zjo6Mn18IgorZj1hOyBlY2hvICJmOjE6ID18JHtmOjE6fXwiCitmPWE7IGVjaG8gImY6OiAgPXwke2Y6On18IgorCitmPTAxMjM0NTY3ODk7IGVjaG8gImYgICAgPXwkZnwiCitmPTAxMjM0NTY3ODk7IGVjaG8gImY6MSAgPXwke2Y6MX18IgorZj0wMTIzNDU2Nzg5OyBlY2hvICJmOjE6Mj18JHtmOjE6Mn18IgorZj0wMTIzNDU2Nzg5OyBlY2hvICJmOjoyID18JHtmOjoyfXwiCitmPTAxMjM0NTY3ODk7IGVjaG8gImY6MTogPXwke2Y6MTp9fCIKK2Y9MDEyMzQ1Njc4OTsgZWNobyAiZjo6ICA9fCR7Zjo6fXwiCisKK2VjaG8gIlN1YnN0cmluZ3MgZnJvbSBzcGVjaWFsIHZhcnMiCitlY2hvICc/ICAgICciPXwkP3wiCitlY2hvICc/OjEgICciPXwkez86MX18IgorZWNobyAnPzoxOjInIj18JHs/OjE6Mn18IgorZWNobyAnPzo6MiAnIj18JHs/OjoyfXwiCitlY2hvICc/OjE6ICciPXwkez86MTp9fCIKK2VjaG8gJz86OiAgJyI9fCR7Pzo6fXwiCitzZXQgLS0gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEKK2VjaG8gJyMgICAgJyI9fCQjfCIKK2VjaG8gJyM6MSAgJyI9fCR7IzoxfXwiCitlY2hvICcjOjE6MiciPXwkeyM6MToyfXwiCitlY2hvICcjOjoyICciPXwkeyM6OjJ9fCIKK2VjaG8gJyM6MTogJyI9fCR7IzoxOn18IgorZWNobyAnIzo6ICAnIj18JHsjOjp9fCIKKworZWNobyAiU3Vic3RyaW5ncyB3aXRoIGV4cHJlc3Npb25zIgorZj0wMTIzNDU2NzsgZWNobyAnZiAgICAgICAgICAgICciPXwkZnwiCitmPTAxMjM0NTY3OyBlY2hvICdmOjErMToyKzIgICAgJyI9fCR7ZjoxKzE6MisyfXwiCitmPTAxMjM0NTY3OyBlY2hvICdmOi0xOjIrMiAgICAgJyI9fCR7ZjotMToyKzJ9fCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6MTpmICAgICAgICAnIj18JHtmOjE6Zn18IgorZj0wMTIzNDU2NzsgZWNobyAnZjoxOiRmICAgICAgICciPXwke2Y6MTokZn18IgorZj0wMTIzNDU2NzsgZWNobyAnZjoxOiR7Zn0gICAgICciPXwke2Y6MToke2Z9fXwiCitmPTAxMjM0NTY3OyBlY2hvICdmOjE6JHtmOjM6MX0gJyI9fCR7ZjoxOiR7ZjozOjF9fXwiCitmPTAxMjM0NTY3OyBlY2hvICdmOjE6MWBlY2hvIDFgJyI9fCR7ZjoxOmBlY2hvIDFgfXwiCisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfZGVmYXVsdC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2RlZmF1bHQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjNzE3MgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2RlZmF1bHQucmlnaHQKQEAgLTAsMCArMSw4IEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CitfMCBfMAorXyBfIF8gX3dvcmQgX3dvcmQKK19hYWFhIF9hYWFhIF9hYWFhIF9hYWFhIF9hYWFhCitfIF8gXyBfd29yZCBfd29yZAorXyBfIF8gXyBfd29yZAorX2ZmZiBfZmZmIF9mZmYgX2ZmZiBfZmZmCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9kZWZhdWx0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfZGVmYXVsdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZWEwNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfZGVmYXVsdC50ZXN0cwpAQCAtMCwwICsxLDIyIEBACisjIGZpcnN0IHRyeSBzb21lIGludmFsaWQgcGF0dGVybnMgKGRvIGluIHN1YnNoZWxsIGR1ZSB0byBwYXJzaW5nIGVycm9yKQorIiRUSElTX1NIIiAtYyAnZWNobyAkey19JworIiRUSElTX1NIIiAtYyAnZWNobyAkezotfScKKworIyBub3cgc29tZSBmdW5reSBvbmVzCitlY2hvIF8keyMtfSBfJHsjOi19CisKKyMgbm93IHNvbWUgdmFsaWQgb25lcworc2V0IC0tCitlY2hvIF8kMSBfJHsxLX0gXyR7MTotfSBfJHsxLXdvcmR9IF8kezE6LXdvcmR9CisKK3NldCAtLSBhYWFhCitlY2hvIF8kMSBfJHsxLX0gXyR7MTotfSBfJHsxLXdvcmR9IF8kezE6LXdvcmR9CisKK3Vuc2V0IGYKK2VjaG8gXyRmIF8ke2YtfSBfJHtmOi19IF8ke2Ytd29yZH0gXyR7Zjotd29yZH0KKworZj0KK2VjaG8gXyRmIF8ke2YtfSBfJHtmOi19IF8ke2Ytd29yZH0gXyR7Zjotd29yZH0KKworZj1mZmYKK2VjaG8gXyRmIF8ke2YtfSBfJHtmOi19IF8ke2Ytd29yZH0gXyR7Zjotd29yZH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2luZGljYXRlX2Vycm9yLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfaW5kaWNhdGVfZXJyb3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmY2M1MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2luZGljYXRlX2Vycm9yLnJpZ2h0CkBAIC0wLDAgKzEsNDMgQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KKzAKKzAKKz09PT0KK18KK2h1c2g6IDE6IHBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQKK2h1c2g6IDE6IHBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQKK2h1c2g6IDE6IG1lc3NhZ2UxCitodXNoOiAxOiBtZXNzYWdlMQoraHVzaDogMTogdW5zZXQhCitodXNoOiAxOiBudWxsIG9yIHVuc2V0IQorPT09PQorX2FhYWEKK19hYWFhCitfYWFhYQorX2FhYWEKK19hYWFhCitfYWFhYQorX2FhYWEKKz09PT0KK18KK2h1c2g6IGY6IHBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQKK2h1c2g6IGY6IHBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQKK2h1c2g6IGY6IG1lc3NhZ2UzCitodXNoOiBmOiBtZXNzYWdlMworaHVzaDogZjogdW5zZXQhCitodXNoOiBmOiBudWxsIG9yIHVuc2V0IQorPT09PQorXworXworaHVzaDogZjogcGFyYW1ldGVyIG51bGwgb3Igbm90IHNldAorXworaHVzaDogZjogbWVzc2FnZTQKK18KK2h1c2g6IGY6IG51bGwgb3IgdW5zZXQhCis9PT09CitfZmZmCitfZmZmCitfZmZmCitfZmZmCitfZmZmCitfZmZmCitfZmZmCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9pbmRpY2F0ZV9lcnJvci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2luZGljYXRlX2Vycm9yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlMTRiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9pbmRpY2F0ZV9lcnJvci50ZXN0cwpAQCAtMCwwICsxLDYwIEBACisjIGRvIGFsbCBvZiB0aGVzZSBpbiBzdWJzaGVsbHMgc2luY2UgaXQncyBzdXBwb3NlZCB0byBlcnJvciBvdXQKKworIyBmaXJzdCB0cnkgc29tZSBpbnZhbGlkIHBhdHRlcm5zCisjIiRUSElTX1NIIiAtYyAnZWNobyAkez99JyAtLSB0aGlzIGlzIHZhbGlkIGFzIGl0J3MgdGhlIHNhbWUgYXMgJD8KKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6P30nCisKKyMgdGhlbiBzb21lIGZ1bmt5IG9uZXMKKyMgbm90ZTogYmFzaCBwcmludHMgMSAtIHRyZWF0cyBpdCBhcyAibGVuZ3RoIG9mICQjIj8gV2UgcHJpbnQgMAorIiRUSElTX1NIIiAtYyAnZWNobyAkeyM/fScKKyMgYmFzaCBwcmludHMgMAorIiRUSElTX1NIIiAtYyAnZWNobyAkeyM6P30nCisKKyMgbm93IHNvbWUgdmFsaWQgb25lcworZXhwb3J0IG1zZ191bnNldD0idW5zZXQhIgorZXhwb3J0IG1zZ19udWxsX29yX3Vuc2V0PSJudWxsIG9yIHVuc2V0ISIKKworZWNobyA9PT09CisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyQxJworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE/fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxOj99JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE/bWVzc2FnZTF9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE6P21lc3NhZ2UxfScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxPyRtc2dfdW5zZXR9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE6PyRtc2dfbnVsbF9vcl91bnNldH0nCisKK2VjaG8gPT09PQorIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyQxJworIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyR7MT99JworIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyR7MTo/fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kezE/d29yZH0nCisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJHsxOj93b3JkfScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kezE/JG1zZ191bnNldH0nCisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJHsxOj8kbXNnX251bGxfb3JfdW5zZXR9JworCitlY2hvID09PT0KKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyRmJworIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJHtmP30nCisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8ke2Y6P30nCisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8ke2Y/bWVzc2FnZTN9JworIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJHtmOj9tZXNzYWdlM30nCisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8ke2Y/JG1zZ191bnNldH0nCisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8ke2Y6PyRtc2dfbnVsbF9vcl91bnNldH0nCisKK2VjaG8gPT09PQorIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyRmJworIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyR7Zj99JworIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyR7Zjo/fScKKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8ke2Y/d29yZH0nCisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJHtmOj9tZXNzYWdlNH0nCisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJHtmPyRtc2dfdW5zZXR9JworIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyR7Zjo/JG1zZ19udWxsX29yX3Vuc2V0fScKKworZWNobyA9PT09CisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJGYnCisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJHtmP30nCisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJHtmOj99JworIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyR7Zj93b3JkfScKKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8ke2Y6P3dvcmR9JworIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyR7Zj8kbXNnX3Vuc2V0fScKKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8ke2Y6PyRtc2dfbnVsbF9vcl91bnNldH0nCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9sZW4ucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9sZW4ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlOGNiNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2xlbi5yaWdodApAQCAtMCwwICsxLDkgQEAKKzAKKzAKKzEKK01ha2Ugc3VyZSBsZW4gcGFyc2luZyBkb2VzbnQgYnJlYWsgYXJnIGNvdW50CiswIDAKKzQgNAorVGVzdGluZyBsZW4gb3AKKzQgMyAyIDEgMCAwCiswIDMgMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfbGVuLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfbGVuLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlMjBhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9sZW4udGVzdHMKQEAgLTAsMCArMSwxNyBAQAorIiRUSElTX1NIIiAtYyAnZWNobyAkIycKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJCMnIGFyZzAKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJCMnIGFyZzAgYXJnMQorCitlY2hvIE1ha2Ugc3VyZSBsZW4gcGFyc2luZyBkb2VzbnQgYnJlYWsgYXJnIGNvdW50CitzZXQgLS0KK2VjaG8gJCMgJHsjfQorc2V0IC0tIGFhYWEgYmJiIGNjIGQKK2VjaG8gJCMgJHsjfQorCitlY2hvIFRlc3RpbmcgbGVuIG9wCitlY2hvICR7IzF9ICR7IzJ9ICR7IzN9ICR7IzR9ICR7IzV9ICR7IzZ9CisKK3Vuc2V0IGUKK2Y9YWJjCitnPQorZWNobyAkeyNlfSAkeyNmfSAkeyNnfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9nbG9iLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9nbG9iLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWU4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2dsb2IucmlnaHQKQEAgLTAsMCArMSw0IEBACitwYXJhbV9nbG9iLnRlc3RzCitwYXJhbV9nbG9iLnRlc3RzCitwYXJhbV9nbG9iLnQqCitwYXJhbV9nbG9iLnQqCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2dsb2IudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2dsb2IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQ3NGZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZ2xvYi50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgJ3BhcmFtX2dsb2IudConCisgICAgZWNobyBOT1QgU0hPV04KKyAgICBleGl0CitmaQorZWNobyAkKgorZWNobyAkQAorZWNobyAiJCoiCitlY2hvICIkQCIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fc3Vic2hlbGwucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX3N1YnNoZWxsLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzM3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX3N1YnNoZWxsLnJpZ2h0CkBAIC0wLDAgKzEsNyBAQAorMT0xCisyPTIKKzM9MworND00Cis1PTUKKzY9NgorNz03CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX3N1YnNoZWxsLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9zdWJzaGVsbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yN2ZkYzViCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9zdWJzaGVsbC50ZXN0cwpAQCAtMCwwICsxLDE1IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgICIkVEhJU19TSCIgIiQwIiAxIDIgMyA0IDUgNiA3IDggOQorICAgIGV4aXQKK2ZpCitlY2hvIDE9JDEKK3sgZWNobyAyPSQyOyB9Cit7IGVjaG8gMz0kMzsgfSAmCisjIGNhbnQgdXNlIHVzbGVlcCBhcyBpdCBpc250IHN0YW5kYXJkIGluICRQQVRIIC0tCisjIHdlIGZhaWwgd2hlbiB0ZXN0aW5nIGJ1c3lib3ggY29tcGlsZWQgc29sZWx5IGFzICJodXNoIgord2FpdAorKCBlY2hvIDQ9JDQgKQorKCBlY2hvIDU9JDUgKSAmCit3YWl0Cit0cnVlIHwgZWNobyA2PSQ2IHwgY2F0Cit0cnVlIHwgeyBlY2hvIDc9JDc7IH0gfCBjYXQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvc3Rhci5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvc3Rhci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNjNTViCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9zdGFyLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorLjEuCisuYWJjLgorLmQuCisuZS4KKy5mLgorLjEgYWJjIGQgZSBmLgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9zdGFyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9zdGFyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1NTRjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3N0YXIudGVzdHMKQEAgLTAsMCArMSw4IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiBzdGFyLnRlc3RzIDEgYWJjICdkIGUgZicKK2ZpCisjICdkIGUgZicgc2hvdWxkIGJlIHNwbGl0IGludG8gMyBzZXBhcmF0ZSBhcmdzOgorZm9yIGEgaW4gJCo7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKKyMgbXVzdCBwcm9kdWNlIC4xIGFiYyBkIGUgZi4KK2ZvciBhIGluICIkKiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Vuc2V0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy91bnNldC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJlNzZhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy91bnNldC5yaWdodApAQCAtMCwwICsxLDE4IEBACiswCit1bnNldDogaW52YWxpZCBvcHRpb24gLS0gbQorMQorMAorX19fCiswIGYgZworMCBnCiswCitfX18KKzAgZiBnCiswCiswIGYgZworMAorX19fCitodXNoOiBIVVNIX1ZFUlNJT046IHJlYWRvbmx5IHZhcmlhYmxlCisxIGYgZworaHVzaDogSFVTSF9WRVJTSU9OOiByZWFkb25seSB2YXJpYWJsZQorMQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy91bnNldC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdW5zZXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU5Y2U1OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdW5zZXQudGVzdHMKQEAgLTAsMCArMSwzNiBAQAorIyBjaGVjayBpbnZhbGlkIG9wdGlvbnMgYXJlIHJlamVjdGVkCit1bnNldCAtCitlY2hvICQ/Cit1bnNldCAtbSBhIGIgYworZWNobyAkPworCisjIGNoZWNrIGZ1bmt5IHVzYWdlCit1bnNldAorZWNobyAkPworCisjIGNoZWNrIG5vcm1hbCB1c2FnZQorZWNobyBfX18KK2Y9ZiBnPWcKK2VjaG8gJD8gJGYgJGcKK3Vuc2V0IGYKK2VjaG8gJD8gJGYgJGcKK3Vuc2V0IGcKK2VjaG8gJD8gJGYgJGcKKworZWNobyBfX18KK2Y9ZiBnPWcKK2VjaG8gJD8gJGYgJGcKK3Vuc2V0IGYgZworZWNobyAkPyAkZiAkZworZj1mIGc9ZworZWNobyAkPyAkZiAkZwordW5zZXQgLXYgZiBnCitlY2hvICQ/ICRmICRnCisKKyMgY2hlY2sgcmVhZCBvbmx5IHZhcnMKK2VjaG8gX19fCitmPWYgZz1nCit1bnNldCBIVVNIX1ZFUlNJT04KK2VjaG8gJD8gJGYgJGcKK3Vuc2V0IGYgSFVTSF9WRVJTSU9OIGcKK2VjaG8gJD8gJGYgJGcKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRlN2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIxLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAoraHR0cDovL2J1c3lib3gubmV0CitodHRwOi8vYnVzeWJveC5uZXRfYWJjCisxIDEKKzEgMQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4YTY3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjEudGVzdHMKQEAgLTAsMCArMSw5IEBACitVUkw9aHR0cDovL2J1c3lib3gubmV0CisKK2VjaG8gJFVSTAorZWNobyAke1VSTH1fYWJjCisKK3RydWUKK2ZhbHNlOyBlY2hvICQ/ICR7P30KK3RydWUKK3sgZmFsc2U7IGVjaG8gJD8gJHs/fTsgfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYmY0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjIucmlnaHQKQEAgLTAsMCArMSwyIEBACitodHRwOi8vYnVzeWJveC5uZXQKK2h0dHA6Ly9idXN5Ym94Lm5ldF9hYmMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjkyNDEwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIyLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorXzE9aHR0cDovL2J1c3lib3gubmV0CisKK2VjaG8gJF8xCitlY2hvICR7XzF9X2FiYwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTY3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjMucmlnaHQKQEAgLTAsMCArMSwyIEBACitodXNoOiBpbnZhbGlkIG51bWJlciAnMXEnCitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAke25hbWV9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWVhMzZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMy50ZXN0cwpAQCAtMCwwICsxLDQgQEAKKyMgcmVqZWN0IGludmFsaWQgdmFycworIiRUSElTX1NIIiAtYyAnZWNobyAkezFxfScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsmfScKKyMiJFRISVNfU0giIC1jICdlY2hvICR7JH0nIC0tIHRoaXMgaXMgdmFsaWQgYXMgaXQncyB0aGUgc2FtZSBhcyAkJApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGEwNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDEucmlnaHQKQEAgLTAsMCArMSwxNCBAQAorCisKK2YKK2JjZGVmCithYmNkZWYKK2FiY2RlZgorYmNkZQorYWJjZAorYWJjZAorYWJjZGVmCitiY2RlZgorYWJjZGVmCithYmNkZWYKK2FiY2RlZgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGQzYzlhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDEudGVzdHMKQEAgLTAsMCArMSwxOCBAQAordmFyPWFiY2RlZgorCitlY2hvICR7dmFyOjd9CitlY2hvICR7dmFyOjZ9CitlY2hvICR7dmFyOjV9CitlY2hvICR7dmFyOjF9CitlY2hvICR7dmFyOjB9CitlY2hvICR7dmFyOi0xfQorCitlY2hvICR7dmFyOjE6NH0KK2VjaG8gJHt2YXI6MDo0fQorZWNobyAke3Zhcjo6NH0KK2VjaG8gJHt2YXI6LTE6NH0KKworZWNobyAke3ZhcjoxOjd9CitlY2hvICR7dmFyOjA6N30KK2VjaG8gJHt2YXI6Ojd9CitlY2hvICR7dmFyOi0xOjd9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmE1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMi5yaWdodApAQCAtMCwwICsxLDEwIEBACithYmMxMjN4Y2JhMTIzCithYngxMjNkY2JhMTIzCithYngxMjNkeGJhMTIzCithYmN4MjNkY2JhMTIzCithYmN4eHhkY2JheHh4CithYngKK3hiYTEyMworYWJ4MjMKK2FiYzIzZGNiYTEyMworYWJjZGNiYQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWM1MjZjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDIudGVzdHMKQEAgLTAsMCArMSwyNCBAQAordmFyPWFiYzEyM2RjYmExMjMKKworZWNobyAke3Zhci9kL3h9CitlY2hvICR7dmFyL2MveH0KK2VjaG8gJHt2YXIvL2MveH0KK2VjaG8gJHt2YXIvWzEyM10veH0KK2VjaG8gJHt2YXIvL1sxMjNdL3h9CitlY2hvICR7dmFyL2MqL3h9CitlY2hvICR7dmFyLypjL3h9CisKKyMgbXVzdCBtYXRjaCBsb25nZXN0IG1hdGNoOiByZXN1bHQgaXMgImFieDIzIgorZWNobyAke3Zhci9jKjEveH0KKworIyBlbXB0eSByZXBsYWNlbWVudCAtIDJuZCBzbGFzaCBjYW4gYmUgb21pdHRlZAorZWNobyAke3Zhci9bMTIzXX0KK2VjaG8gJHt2YXIvL1sxMjNdfQorCisjIyMgYXNoIGRvZXNuJ3Qgc3VwcG9ydAorIyMjICMgbWF0Y2ggb25seSBhdCB0aGUgYmVnaW5uaW5nOgorIyMjIGVjaG8gJHt2YXIvI2EveH0KKyMjIyBlY2hvICR7dmFyLyNiL3h9ICMgc2hvdWxkIG5vdCBtYXRjaAorIyMjIGVjaG8gJHt2YXIvLyNiL3h9ICMgc2hvdWxkIG5vdCBtYXRjaAorIyMjICMgbWF0Y2ggb25seSBhdCB0aGUgZW5kOgorIyMjIGVjaG8gJHt2YXIvJTMveH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3Yzg1MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gzLnJpZ2h0CkBAIC0wLDAgKzEsMjAgQEAKKzEgYTA0MSNjCisyIGEwNDEjYworMyBhXDA0MSNjCis0IGFcMDQxI2MKKzUgYVwwNDEjYworNiBhXDA0MSNjCis3IGFcMDQxI2MKKzggYVwwNDEjYworOSBhXDA0MSNjCisxMCBhXGMKKzExIGFcYworMTIgYVxjCisxMyBhXFxjCisxNCBhXFxjCisxNSBhXFxjCisxNiBhXHRjCisxNyBhXHRjCisxOCBhXHRjCisxOSBhdGMKKzIwIGFcdGMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTQ2ZGJiNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gzLnRlc3RzCkBAIC0wLDAgKzEsNDEgQEAKK2E9J2FiYycKK3I9JHthLy9iL1wwNDEjfQorZWNobyAxICRyCitlY2hvIDIgJHthLy9iL1wwNDEjfQorZWNobyAzICIke2EvL2IvXDA0MSN9IgorCithPSdhYmMnCityPSR7YS8vYi9cXDA0MSN9CitlY2hvIDQgJHIKK2VjaG8gNSAke2EvL2IvXFwwNDEjfQorZWNobyA2ICIke2EvL2IvXFwwNDEjfSIKKworYT0nYWJjJworYj0nXDA0MSMnCityPSR7YS8vYi8kYn0KK2VjaG8gNyAkcgorZWNobyA4ICR7YS8vYi8kYn0KK2VjaG8gOSAiJHthLy9iLyRifSIKKworYT0nYWJjJworYj0nXCcKK3I9IiR7YS8vYi8kYn0iCitlY2hvIDEwICRyCitlY2hvIDExICR7YS8vYi8kYn0KK2VjaG8gMTIgIiR7YS8vYi8kYn0iCisKK2E9J2FiYycKK2I9J1xcJworcj0iJHthLy9iLyRifSIKK2VjaG8gMTMgJHIKK2VjaG8gMTQgJHthLy9iLyRifQorZWNobyAxNSAiJHthLy9iLyRifSIKKworYT0nYWJjJworYj0nXHQnCityPSIke2EvL2IvJGJ9IgorZWNobyAxNiAkcgorZWNobyAxNyAke2EvL2IvJGJ9CitlY2hvIDE4ICIke2EvL2IvJGJ9IgorZWNobyAxOSAke2EvL2IvXHR9CitlY2hvIDIwICIke2EvL2IvXHR9IgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWYxYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDQucmlnaHQKQEAgLTAsMCArMSw0MCBAQAorU291cmNlOiAgICAgICAgYSpiXCpjCitSZXBsYWNlIHN0cjogICBfXFxfXHpfCitQYXR0ZXJuOiAgICAgICBzaW5nbGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBsaXRlcmFsIHN0YXIiCitVbnF1b3RlZDogICAgICBhX1xfel9iXCpjCitVbnF1b3RlZCA9OiAgICBhX1xfel9iXCpjCitRdW90ZWQ6ICAgICAgICBhX1xfXHpfYlwqYworUXVvdGVkID06ICAgICAgYV9cX1x6X2JcKmMKK1BhdHRlcm46ICAgICAgIGRvdWJsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgZXZlcnl0aGluZyBhZnRlciBpdCIKK1VucXVvdGVkOiAgICAgIGEqYl9cX3pfCitVbnF1b3RlZCA9OiAgICBhKmJfXF96XworUXVvdGVkOiAgICAgICAgYSpiX1xfXHpfCitRdW90ZWQgPTogICAgICBhKmJfXF9cel8KKworU291cmNlOiAgICAgICAgYVxiYworUmVwbGFjZSBzdHI6ICAgX1xcX1x6XworUGF0dGVybjogICAgICAgc2luZ2xlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYiIKK1VucXVvdGVkOiAgICAgIGFcX1xfel9jCitVbnF1b3RlZCA9OiAgICBhXF9cX3pfYworUXVvdGVkOiAgICAgICAgYVxfXF9cel9jCitRdW90ZWQgPTogICAgICBhXF9cX1x6X2MKK1BhdHRlcm46ICAgICAgIGRvdWJsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgYiIKK1VucXVvdGVkOiAgICAgIGFfXF96X2MKK1VucXVvdGVkID06ICAgIGFfXF96X2MKK1F1b3RlZDogICAgICAgIGFfXF9cel9jCitRdW90ZWQgPTogICAgICBhX1xfXHpfYworCitTb3VyY2U6ICAgICAgICBhXGJjCitSZXBsYWNlIHN0cjogICBfXFxfXHpfIChhcyB2YXJpYWJsZSAkcykKK1BhdHRlcm46ICAgICAgIHNpbmdsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGIiCitVbnF1b3RlZDogICAgICBhXF9cXF9cel9jCitVbnF1b3RlZCA9OiAgICBhXF9cXF9cel9jCitRdW90ZWQ6ICAgICAgICBhXF9cXF9cel9jCitRdW90ZWQgPTogICAgICBhXF9cXF9cel9jCitQYXR0ZXJuOiAgICAgICBkb3VibGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGIiCitVbnF1b3RlZDogICAgICBhX1xcX1x6X2MKK1VucXVvdGVkID06ICAgIGFfXFxfXHpfYworUXVvdGVkOiAgICAgICAgYV9cXF9cel9jCitRdW90ZWQgPTogICAgICBhX1xcX1x6X2MKKworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMmFhMmIzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDQudGVzdHMKQEAgLTAsMCArMSw4MSBAQAorIyBUaGlzIHRlc3RjYXNlIGRlbW9uc3RyYXRlcyB0aGF0IGJhY2tzbGFzaGVzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5CisjIGluIDFzdCBhbmQgMm5kIHBhcnRzIG9mICR7dmFyL3NlYXJjaC9yZXBsfToKKyMgaWYgcXVvdGVkICgiJHt2YXIvc2VhcmNoL3JlcGx9IiksIGFuZCByZXBsIGNvbnRhaW5zIFxhIChhIG5vbi1zcGVjaWFsIGNoYXIpLAorIyB0aGUgYmFja3NsYXNoIGluIHJlcGwgc3RheXM7IGlmIHVucXVvdGVkLCBiYWNrc2xhc2ggaXMgcmVtb3ZlZC4KKyMgQnV0IHNlYXJjaCBwYXJ0IGRvZXMgbm90IGFjdCBsaWtlIHRoYXQ6IFxhIGlzIGFsd2F5cyBjb252ZXJ0ZWQgdG8ganVzdCBhLAorIyBldmVuIGluIHF1b3Rlcy4KKyMKKyMgYmFzaDQgKGFuZCBwcm9iYWJseSBiYXNoMyB0b28pOiAiUXVvdGVkOiIgcmVzdWx0cyBhcmUgZGlmZmVyZW50IGZyb20KKyMgdW5xdW90ZWQgZXhwYW5zaW9ucyAtIHRoZXkgaGF2ZSBhIGJhY2tzbGFzaCBiZWZvcmUgei4KKyMKKyMgVGhlIGRpZmZlcmVuY2Ugb25seSBleGlzdHMgaWYgcmVwbCBpcyBhIGxpdGVyYWwuIElmIGl0IGlzIGEgdmFyaWFibGU6CisjICR7di8uLi4vJHN9LCB0aGVuIGFsbCBiYWNrc2xhc2hlcyBhcmUgcHJlc2VydmVkIGluIGJvdGggY2FzZXMuCisKK3Y9J2EqYlwqYycKK2VjaG8gJ1NvdXJjZTogICAgICAgJyAiJHYiCitlY2hvICdSZXBsYWNlIHN0cjogICcgJ19cXF9cel8nCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnc2luZ2xlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgbGl0ZXJhbCBzdGFyIicKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAke3YvXCovX1xcX1x6X30KK3I9JHt2L1wqL19cXF9cel99CitlY2hvICdVbnF1b3RlZCA9OiAgICcgIiRyIgorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXCovX1xcX1x6X30iCityPSIke3YvXCovX1xcX1x6X30iCitlY2hvICdRdW90ZWQgPTogICAgICcgIiRyIgorCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ2RvdWJsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgZXZlcnl0aGluZyBhZnRlciBpdCInCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cXCovX1xcX1x6X30KK3I9JHt2L1xcKi9fXFxfXHpffQorZWNobyAnVW5xdW90ZWQgPTogICAnICIkciIKK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xcKi9fXFxfXHpffSIKK3I9IiR7di9cXCovX1xcX1x6X30iCitlY2hvICdRdW90ZWQgPTogICAgICcgIiRyIgorCitlY2hvCisKK3Y9J2FcYmMnCitlY2hvICdTb3VyY2U6ICAgICAgICcgIiR2IgorZWNobyAnUmVwbGFjZSBzdHI6ICAnICdfXFxfXHpfJworCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ3NpbmdsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGIiJworZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXGIvX1xcX1x6X30KK3I9JHt2L1xiL19cXF9cel99CitlY2hvICdVbnF1b3RlZCA9OiAgICcgIiRyIgorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXGIvX1xcX1x6X30iCityPSIke3YvXGIvX1xcX1x6X30iCitlY2hvICdRdW90ZWQgPTogICAgICcgIiRyIgorCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ2RvdWJsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgYiInCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cXGIvX1xcX1x6X30KK3I9JHt2L1xcYi9fXFxfXHpffQorZWNobyAnVW5xdW90ZWQgPTogICAnICIkciIKK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xcYi9fXFxfXHpffSIKK3I9IiR7di9cXGIvX1xcX1x6X30iCitlY2hvICdRdW90ZWQgPTogICAgICcgIiRyIgorCitlY2hvCisKK3Y9J2FcYmMnCitzPSdfXFxfXHpfJworZWNobyAnU291cmNlOiAgICAgICAnICIkdiIKK2VjaG8gJ1JlcGxhY2Ugc3RyOiAgJyAiJHMiICcoYXMgdmFyaWFibGUgJHMpJworCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ3NpbmdsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGIiJworZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXGIvJHN9CityPSR7di9cYi8kc30KK2VjaG8gJ1VucXVvdGVkID06ICAgJyAiJHIiCitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cYi8kc30iCityPSIke3YvXGIvJHN9IgorZWNobyAnUXVvdGVkID06ICAgICAnICIkciIKKworZWNobyAnUGF0dGVybjogICAgICAnICdkb3VibGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGIiJworZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXFxiLyRzfQorcj0ke3YvXFxiLyRzfQorZWNobyAnVW5xdW90ZWQgPTogICAnICIkciIKK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xcYi8kc30iCityPSIke3YvXFxiLyRzfSIKK2VjaG8gJ1F1b3RlZCA9OiAgICAgJyAiJHIiCisKK2VjaG8KKworZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDUucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkwOTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDUucmlnaHQKQEAgLTAsMCArMSwxMSBAQAorMSBhLworMiBhL2QKKzMgYS9lL2YKKzQgYVwKKzUgYVxkCis2IGFcZVxmCis3IGFcXAorOCBhXFxkCis5IGFcXGVcXGYKK2EgYWIKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g1LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc0OGI0YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g1LnRlc3RzCkBAIC0wLDAgKzEsMjkgQEAKKyMgVGhpcyB0ZXN0Y2FzZSBjaGVja3Mgd2hldGhlciBzbGFzaGVzIGluICR7di9hL2J9IGFyZSBwYXJzZWQgYmVmb3JlCisjIG9yIGFmdGVyIGV4cGFuc2lvbnMKKwordj0nYS9iL2MnCitzPSdiL2MnCityPSdlL2YnCitlY2hvICIxICR7di8kc30iCitlY2hvICIyICR7di8kcy9kfSIKK2VjaG8gIjMgJHt2LyRzLyRyfSIKKwordj0nYVxiXGMnCitzPSdiXFxjJworcj0nZVxmJworZWNobyAiNCAke3YvJHN9IgorZWNobyAiNSAke3YvJHMvZH0iCitlY2hvICI2ICR7di8kcy8kcn0iCisKK3Y9J2FcXGJcXGMnCitzPSdiXFxcXGMnCityPSdlXFxmJworZWNobyAiNyAke3YvJHN9IgorZWNobyAiOCAke3YvJHMvZH0iCitlY2hvICI5ICR7di8kcy8kcn0iCisKK3Y9J2EtJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tYicKK3M9Jy0kYS1cXHQtXFxcXC1cXCItXFxgLVxcLS1cXHotXFxcKi1cXFw/LScKK2VjaG8gImEgJHt2LyRzfSIKKworZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDYucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZjMjNkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDYucmlnaHQKQEAgLTAsMCArMSw1IEBACitFeHBlY3RlZCBBY3R1YWwKK2EqeiAgICA6IGEqegorXHogICAgIDogXHoKK2ExeiBhMno6IGExeiBhMnoKK3ogICAgICA6IHoKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g2LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YyZTRmMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g2LnRlc3RzCkBAIC0wLDAgKzEsOSBAQAorIyBUaGlzIHRlc3RjYXNlIGNoZWNrcyBnbG9iYmluZyBjb3JyZWN0bmVzcyBpbiAke3YvYS9ifQorCis+YTF6OyA+YTJ6OworICAgICAgICAgIGVjaG8gJ0V4cGVjdGVkJyAnQWN0dWFsJwordj0nYSBieic7IGVjaG8gJ2EqeiAgICA6JyAiJHt2L2Eqei9hKnp9Igordj0nYSBieic7IGVjaG8gJ1x6ICAgICA6JyAiJHt2L2Eqei9cen0iCit2PSdhIGJ6JzsgZWNobyAnYTF6IGEyejonICR7di9hKnovYSp6fQordj0nYSBieic7IGVjaG8gJ3ogICAgICA6JyAke3YvYSp6L1x6fQorcm0gYTF6IGEyegpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX2Fzc2lnbi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9hc3NpZ24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMjEwZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9hc3NpZ24ucmlnaHQKQEAgLTAsMCArMSw1IEBACisuIC4KKy5hYmMgZCBlLgorLmFiYyBkIGUuCisuYWJjIGQgZS4KKy5hYmMgZCBlLgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX2Fzc2lnbi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9hc3NpZ24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMThjZGM3NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9hc3NpZ24udGVzdHMKQEAgLTAsMCArMSwxNSBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhYmMgImQgZSIKK2ZpCisKK3NwYWNlPScgJworZWNobyAuJHNwYWNlLgorCithPSQqCitlY2hvIC4kYS4KK2E9JEAKK2VjaG8gLiRhLgorYT0iJCoiCitlY2hvIC4kYS4KK2E9IiRAIgorZWNobyAuJGEuCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fcmVkaXIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fcmVkaXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzMjk5YwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9yZWRpci5yaWdodApAQCAtMCwwICsxLDMgQEAKK1RFU1QxCitURVNUMgorVEVTVDMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9yZWRpci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9yZWRpci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZGE2YmRkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX3JlZGlyLnRlc3RzCkBAIC0wLDAgKzEsMTMgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYWJjICJkIGUiCitmaQorCitlY2hvIFRFU1QxID4iJDEub3V0IgorZWNobyBURVNUMiA+IiQyLm91dCIKKyMgYmFzaCBzYXlzOiAiJEAub3V0IjogYW1iaWd1b3VzIHJlZGlyZWN0CisjIGFzaCBoYW5kbGVzIGl0IGFzIGlmIGl0IGlzICckKicgLSB3ZSBkbyB0aGUgc2FtZQorZWNobyBURVNUMyA+IiRALm91dCIKKworY2F0IGFiYy5vdXQgImQgZS5vdXQiICJhYmMgZCBlLm91dCIKKworcm0gYWJjLm91dCAiZCBlLm91dCIgImFiYyBkIGUub3V0IgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX29uX2lmcy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9vbl9pZnMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkMjA2OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9vbl9pZnMucmlnaHQKQEAgLTAsMCArMSw5IEBACisxIGEgYiBjCisyIGEgKyBiIGMKKzMgYSBiIGMKKzQgYSAgYiBjCis1IGEgIGIgYworNiBhIGIgKyBjCis3IGEgYiBjCis4IGEgYiAgYworOSBhIGIgIGMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9vbl9pZnMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfb25faWZzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmExMmZmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfb25faWZzLnRlc3RzCkBAIC0wLDAgKzEsMTEgQEAKK2I9JyBiICcKK2U9JycKK2VjaG8gMSBhICRiIGMKK2VjaG8gMiBhICskYiBjCitlY2hvIDMgYSAkZSRiIGMKK2VjaG8gNCBhICIkZSIkYiBjCitlY2hvIDUgYSAiIiRiIGMKK2VjaG8gNiBhICRiKyBjCitlY2hvIDcgYSAkYiRlIGMKK2VjaG8gOCBhICRiIiRlIiBjCitlY2hvIDkgYSAkYiIiIGMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2luX3BpcGVzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfaW5fcGlwZXMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmNjViZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2luX3BpcGVzLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorYj0xCitiPTIKK2I9MworYj00CitiPTUKK2I9NgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfaW5fcGlwZXMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9pbl9waXBlcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZjhjZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfaW5fcGlwZXMudGVzdHMKQEAgLTAsMCArMSw3IEBACitiPTEgZW52IHwgZ3JlcCBeYj0KK3RydWUgfCBiPTIgZW52IHwgZ3JlcCBeYj0KK2E9MSB0cnVlIHwgYj0zIGVudiB8IGdyZXAgXmI9CisKKyhiPTQgZW52KSB8IGdyZXAgXmI9CisodHJ1ZSB8IGI9NSBlbnYpIHwgZ3JlcCBeYj0KKyhhPTEgdHJ1ZSB8IGI9NiBlbnYpIHwgZ3JlcCBeYj0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2xlYWtzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfbGVha3MucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YmFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2xlYWtzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9sZWFrcy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2xlYWtzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3YzhjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9sZWFrcy50ZXN0cwpAQCAtMCwwICsxLDE0IEBACisjIGV4dGVybmFsIHByb2dyYW0KK2E9YiAvYmluL3RydWUKK2VudiB8IGdyZXAgXmE9CisKKyMgYnVpbHRpbgorYT1iIHRydWUKK2VudiB8IGdyZXAgXmE9CisKKyMgZXhlYyB3aXRoIHJlZGlyZWN0aW9uIG9ubHkKKyMgaW4gYmFzaCwgdGhpcyBsZWFrcyEKK2E9YiBleGVjIDE+JjEKK2VudiB8IGdyZXAgXmE9CisKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3Bvc2l4MS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3Bvc2l4MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY2MThhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcG9zaXgxLnJpZ2h0CkBAIC0wLDAgKzEsNDEgQEAKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorYWJjZGNkCithYmNkY2QKK2FiY2RjZAorY2RjZAorYmFiY2RjZAorYmFiY2RjZAorYWJhYmNkY2QKK0VtcHR5OgorYWJhYmNkY2R9X3RhaWwKK2FiYWJjZGNkX3RhaWwKK2FiYWJjZAorYWJhYmNkCithYmFiY2QKK2FiYWIKK2FiYWJjZGMKK2FiYWJjZGMKK2FiYWJjZGNkCitFbXB0eToKK2FiYWJjZGNkfV90YWlsCithYmFiY2RjZF90YWlsCithYmFiY2RjZAorYWIKK2FiCithYgorRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wb3NpeDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wb3NpeDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODJhYmU4MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3Bvc2l4MS50ZXN0cwpAQCAtMCwwICsxLDUyIEBACit1bnNldCB2YXIKKworZWNobyBFbXB0eToke3ZhciN9CitlY2hvIEVtcHR5OiR7dmFyIyN9CitlY2hvIEVtcHR5OiR7dmFyIyp9CitlY2hvIEVtcHR5OiR7dmFyIyMqfQorZWNobyBFbXB0eToke3ZhciV9CitlY2hvIEVtcHR5OiR7dmFyJSV9CitlY2hvIEVtcHR5OiR7dmFyJSp9CitlY2hvIEVtcHR5OiR7dmFyJSUqfQorCit2YXI9CisKK2VjaG8gRW1wdHk6JHt2YXIjfQorZWNobyBFbXB0eToke3ZhciMjfQorZWNobyBFbXB0eToke3ZhciMqfQorZWNobyBFbXB0eToke3ZhciMjKn0KK2VjaG8gRW1wdHk6JHt2YXIlfQorZWNobyBFbXB0eToke3ZhciUlfQorZWNobyBFbXB0eToke3ZhciUqfQorZWNobyBFbXB0eToke3ZhciUlKn0KKwordmFyPWFiYWJjZGNkCisKK2VjaG8gJHt2YXIjYWJ9CitlY2hvICR7dmFyIyNhYn0KK2VjaG8gJHt2YXIjYSpifQorZWNobyAke3ZhciMjYSpifQorZWNobyAke3ZhciM/fQorZWNobyAke3ZhciMjP30KK2VjaG8gJHt2YXIjKn0KK2VjaG8gRW1wdHk6JHt2YXIjIyp9CitlY2hvICR7dmFyI319X3RhaWwKK2VjaG8gJHt2YXIjXH19X3RhaWwKKworZWNobyAke3ZhciVjZH0KK2VjaG8gJHt2YXIlJWNkfQorZWNobyAke3ZhciVjKmR9CitlY2hvICR7dmFyJSVjKmR9CitlY2hvICR7dmFyJT99CitlY2hvICR7dmFyJSU/fQorZWNobyAke3ZhciUqfQorZWNobyBFbXB0eToke3ZhciUlKn0KK2VjaG8gJHt2YXIjfX1fdGFpbAorZWNobyAke3ZhciNcfX1fdGFpbAorZWNobyAke3ZhciVcXCp9CisKK2E9YWJ9OyBlY2hvICR7YSVcfX07CithPWFiYzsgYz1jOyBlY2hvICR7YSUke2N9fQorYT1hYnt7YzsgZWNobyAke2ElYGVjaG8ge3tjYH0KKworZWNobyBFbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3ByZXNlcnZlZC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3ByZXNlcnZlZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTk5MTdjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcHJlc2VydmVkLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorYT1iCithPWIKK2E9YgorT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3ByZXNlcnZlZC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3ByZXNlcnZlZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYmRkZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcHJlc2VydmVkLnRlc3RzCkBAIC0wLDAgKzEsMTYgQEAKK2V4cG9ydCBhPWIKKworIyBleHRlcm5hbCBwcm9ncmFtCithPWMgL2Jpbi90cnVlCitlbnYgfCBncmVwIF5hPQorCisjIGJ1aWx0aW4KK2E9ZCB0cnVlCitlbnYgfCBncmVwIF5hPQorCisjIGV4ZWMgd2l0aCByZWRpcmVjdGlvbiBvbmx5CisjIGluIGJhc2gsIHRoaXMgbGVha3MhCithPWUgZXhlYyAxPiYxCitlbnYgfCBncmVwIF5hPQorCitlY2hvIE9LCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zZXJpYWwucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zZXJpYWwucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhYTMzMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3NlcmlhbC5yaWdodApAQCAtMCwwICsxLDUgQEAKK0Fzc2lnbm1lbnRzIG9ubHk6IGM9YQorQXNzaWdubWVudHMgYW5kIGEgY29tbWFuZDogYz1hCitBc3NpZ25tZW50cyBhbmQgYSBidWlsdGluOiBjPWEKK0Fzc2lnbm1lbnRzIGFuZCBhIGZ1bmN0aW9uOiBjPWEKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3NlcmlhbC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3NlcmlhbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjRhNGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc2VyaWFsLnRlc3RzCkBAIC0wLDAgKzEsMjIgQEAKK2E9YQorCitiPWIKK2M9YworIyBTZWNvbmQgYXNzaWdubWVudCBkZXBlbmRzIG9uIHRoZSBmaXJzdDoKK2I9JGEgYz0kYgorZWNobyBBc3NpZ25tZW50cyBvbmx5OiBjPSRjCisKK2I9YgorYz1jCitiPSRhIGM9JGIgIiRUSElTX1NIIiAtYyAnZWNobyBBc3NpZ25tZW50cyBhbmQgYSBjb21tYW5kOiBjPSRjJworCitiPWIKK2M9YworYj0kYSBjPSRiIGV2YWwgJ2VjaG8gQXNzaWdubWVudHMgYW5kIGEgYnVpbHRpbjogYz0kYycKKworYj1iCitjPWMKK2YoKSB7IGVjaG8gQXNzaWdubWVudHMgYW5kIGEgZnVuY3Rpb246IGM9JGM7IH0KK2I9JGEgYz0kYiBmCisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWNhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IucmlnaHQKQEAgLTAsMCArMSw0MCBAQAorVGVzdGluZzogaW4geCB5IHoKKy54LgorLnkuCisuei4KK1Rlc3Rpbmc6IGluIHUgJGVtcHR5IHYKKy51LgorLnYuCitUZXN0aW5nOiBpbiB1ICIgJGVtcHR5IiB2CisudS4KKy4gLgorLnYuCitUZXN0aW5nOiBpbiB1ICRlbXB0eSAkZW1wdHkkYSB2CisudS4KKy5hLgorLnYuCitUZXN0aW5nOiBpbiAkYV9iCisuYS4KKy5iLgorVGVzdGluZzogaW4gJCoKKy5hYmMuCisuZC4KKy5lLgorVGVzdGluZzogaW4gJEAKKy5hYmMuCisuZC4KKy5lLgorVGVzdGluZzogaW4gLSQqLQorLi1hYmMuCisuZC4KKy5lLS4KK1Rlc3Rpbmc6IGluIC0kQC0KKy4tYWJjLgorLmQuCisuZS0uCitUZXN0aW5nOiBpbiAkYV9iIC0kYV9iLQorLmEuCisuYi4KKy4tYS4KKy5iLS4KK0ZpbmlzaGVkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDMzYzYwNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci50ZXN0cwpAQCAtMCwwICsxLDQwIEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFiYyAiZCBlIgorZmkKKworZWNobyAnVGVzdGluZzogaW4geCB5IHonCitmb3IgYSBpbiB4IHkgejsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gdSAkZW1wdHkgdicKK2VtcHR5PScnCitmb3IgYSBpbiB1ICRlbXB0eSB2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiB1ICIgJGVtcHR5IiB2JworZW1wdHk9JycKK2ZvciBhIGluIHUgIiAkZW1wdHkiIHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHUgJGVtcHR5ICRlbXB0eSRhIHYnCithPSdhJworZm9yIGEgaW4gdSAkZW1wdHkgJGVtcHR5JGEgdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGFfYicKK2FfYj0nYSBiJworZm9yIGEgaW4gJGFfYjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJConCitmb3IgYSBpbiAkKjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJEAnCitmb3IgYSBpbiAkQDsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gLSQqLScKK2ZvciBhIGluIC0kKi07IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIC0kQC0nCitmb3IgYSBpbiAtJEAtOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkYV9iIC0kYV9iLScKK2FfYj0nYSBiJworZm9yIGEgaW4gJGFfYiAtJGFfYi07IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gRmluaXNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3VuYmFja3NsYXNoLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfdW5iYWNrc2xhc2gucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjODM0NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3VuYmFja3NsYXNoLnJpZ2h0CkBAIC0wLDAgKzEsMTEgQEAKK2IxPS1xd2VydHktdC1cLSItYC0tLXotKi0/LQorYjE9LXF3ZXJ0eS10LVwtIi1gLS0tei0qLT8tCitiMj0tcXdlcnR5LVx0LVwtIi1gLVwtLVx6LVwqLVw/LQorYjI9LXF3ZXJ0eS1cdC1cLSItYC1cLS1cei1cKi1cPy0KK2IzPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK2IzPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK2M9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorYz0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitjPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK2M9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfdW5iYWNrc2xhc2gudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl91bmJhY2tzbGFzaC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYjUyYWYzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfdW5iYWNrc2xhc2gudGVzdHMKQEAgLTAsMCArMSwyMyBAQAorIyBUZXN0IGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIGJhY2tzbGFzaGVzCithPXF3ZXJ0eQorCitiPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK2VjaG8gYjE9JGIKK2VjaG8gImIxPSRiIgorYj0iLSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LSIKK2VjaG8gYjI9JGIKK2VjaG8gImIyPSRiIgorYj0nLSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LScKK2VjaG8gYjM9JGIKK2VjaG8gImIzPSRiIgorCitjPSRiCitlY2hvICJjPSRjIgorYz0ke2J9CitlY2hvICJjPSRjIgorYz0iJGIiCitlY2hvICJjPSRjIgorYz0iJHtifSIKK2VjaG8gImM9JGMiCisKK2VjaG8gIkRvbmU6ICQ/IgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDEucmlnaHQKQEAgLTAsMCArMSwzIEBACitXYXJtIHVwCitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODIwN2NmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMS50ZXN0cwpAQCAtMCwwICsxLDE0OCBAQAorIyAiQ2hlY2sgbWFueSBsZWFrcyIgdGVzdCAjMQorIyBDcmFtbWluZyBhbGwga2luZHMgb2Ygd2VpcmQgY29tbWFuZHMgaW4gaGVyZS4KKyMgQXMgeW91IGZpbmQgbGVha3MsIHBsZWFzZSBjcmVhdGUgc2VwYXJhdGUsIHNtYWxsIHRlc3QKKyMgZm9yIGVhY2ggbGVhay4KKyMgTmFycm93aW5nIGRvd24gdGhlIGxlYWsgdXNpbmcgdGhpcyBsYXJnZSB0ZXN0IG1heSBiZSBkaWZmaWN1bHQuCisjIEl0IGlzIGludGVuZGVkIHRvIGJlIGEgYmxhbmtldCAiaXMgZXZlcnl0aGluZyBvaz8iIHRlc3QKKworZWNobyAiV2FybSB1cCIKK2k9MQorbD0xCit0PTEKK2V4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDk5OyBkbworICAgIHQ9dmFsdWUxXyRpOyB0PXZhbHVlMl8kaSB0cnVlOyB0PXZhbHVlM18kaSAvYmluL3RydWU7IHQ9dmFsdWU0XyRpIGV4ZWMgMT4mMQorICAgIHsgdD12YWx1ZTNfJGkgL2Jpbi90cnVlOyB9IDwvZGV2L251bGwKKyAgICBpZiB0cnVlOyB0PXZhbHVlQV8kaSBmYWxzZSA+Pi9kZXYvbnVsbDsgdHJ1ZTsgdGhlbgorCTogPDwgSEVSRSA+L2Rldi9udWxsOyB0cnVlIDw8SEVSRQorSGVsbG8gYnVpbHRpbiA6CitIRVJFCitIZWxsbyAkaSB0cnVlCitIRVJFCisgICAgZWxpZiBmYWxzZTsgdGhlbgorCXRydWU7IGVjaG8gRG9lc250IHJ1bgorICAgIGVsc2UKKwl7IHRydWU7IH07IGVjaG8gRG9lc250IHJ1biB0b28gPj4vZm9vL2JhcgorICAgIGZpCisgICAgeyA6IC9iaW4vKjsgfQorICAgIHVuc2V0IHZhcgorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSUqfQorICAgIHZhcj0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlKn0KKyAgICB2YXI9YWJhYmNkY2QKKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjYWJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyNhYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjYSpifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjYSpifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciM/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJWNkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlY2R9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJWMqZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJWMqZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJT99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSUqfQorICAgIHNldCAtLSBwYXIxXyRpIHBhcjJfJGkgcGFyM18kaSBwYXI0XyRpCisgICAgdHJhcCAiZWNobyB0cmFwJGkiIFdJTkNICisgICAgZigpIHsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgfQorICAgIGYoKSB7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IGVjaG8gJDE7IH0KKyAgICBpPWlpaSRpIHQ9dHR0JGkgej16enokaSBmID4vZGV2L251bGwKKyAgICA6ICQoKGkrKykpCitkb25lCit1bnNldCBpIGwgdAordW5zZXQgLWYgZgorCittZW1sZWFrCisKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKKyMgUGxlYXNlIGNvcHkgdGhlIGVudGlyZSBibG9jayBmcm9tIGFib3ZlIHZlcmJhdGltCitpPTEKK2w9MQordD0xCitleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA5OTsgZG8KKyAgICB0PXZhbHVlMV8kaTsgdD12YWx1ZTJfJGkgdHJ1ZTsgdD12YWx1ZTNfJGkgL2Jpbi90cnVlOyB0PXZhbHVlNF8kaSBleGVjIDE+JjEKKyAgICB7IHQ9dmFsdWUzXyRpIC9iaW4vdHJ1ZTsgfSA8L2Rldi9udWxsCisgICAgaWYgdHJ1ZTsgdD12YWx1ZUFfJGkgZmFsc2UgPj4vZGV2L251bGw7IHRydWU7IHRoZW4KKwk6IDw8IEhFUkUgPi9kZXYvbnVsbDsgdHJ1ZSA8PEhFUkUKK0hlbGxvIGJ1aWx0aW4gOgorSEVSRQorSGVsbG8gJGkgdHJ1ZQorSEVSRQorICAgIGVsaWYgZmFsc2U7IHRoZW4KKwl0cnVlOyBlY2hvIERvZXNudCBydW4KKyAgICBlbHNlCisJeyB0cnVlOyB9OyBlY2hvIERvZXNudCBydW4gdG9vID4+L2Zvby9iYXIKKyAgICBmaQorICAgIHsgOiAvYmluLyo7IH0KKyAgICB1bnNldCB2YXIKKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlKn0KKyAgICB2YXI9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJSp9CisgICAgdmFyPWFiYWJjZGNkCisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI2FifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjYWJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI2EqYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI2EqYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIz99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciVjZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJWNkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciVjKmR9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSVjKmR9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJT99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSU/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlKn0KKyAgICBzZXQgLS0gcGFyMV8kaSBwYXIyXyRpIHBhcjNfJGkgcGFyNF8kaQorICAgIHRyYXAgImVjaG8gdHJhcCRpIiBXSU5DSAorICAgIGYoKSB7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IH0KKyAgICBmKCkgeyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyBlY2hvICQxOyB9CisgICAgaT1paWkkaSB0PXR0dCRpIHo9enp6JGkgZiA+L2Rldi9udWxsCisgICAgOiAkKChpKyspKQorZG9uZQordW5zZXQgaSBsIHQKK3Vuc2V0IC1mIGYKKworCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rICMka2IKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDIucmlnaHQKQEAgLTAsMCArMSwzIEBACitXYXJtIHVwCitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTFlYTgwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMi50ZXN0cwpAQCAtMCwwICsxLDkzIEBACisjICJDaGVjayBtYW55IGxlYWtzIiB0ZXN0ICMyCisjIENyYW1taW5nIGFsbCBraW5kcyBvZiB3ZWlyZCBjb21tYW5kcyBpbiBoZXJlLgorIyBBcyB5b3UgZmluZCBsZWFrcywgcGxlYXNlIGNyZWF0ZSBzZXBhcmF0ZSwgc21hbGwgdGVzdAorIyBmb3IgZWFjaCBsZWFrLgorIyBOYXJyb3dpbmcgZG93biB0aGUgbGVhayB1c2luZyB0aGlzIGxhcmdlIHRlc3QgbWF5IGJlIGRpZmZpY3VsdC4KKyMgSXQgaXMgaW50ZW5kZWQgdG8gYmUgYSBibGFua2V0ICJpcyBldmVyeXRoaW5nIG9rPyIgdGVzdAorCitlY2hvICJXYXJtIHVwIgorbG9jYWxfdmFyPSJsb2NhbCB2YWwiCitleHBvcnQgZGV2X251bGw9Ii9kZXYvbnVsbCIKKz4kZGV2X251bGwKK2VjaG8gaGkxICRsb2NhbF92YXIgYGVjaG8gaG9gID4+L2Rldi9udWxsCitlY2hvIGhpMiAkbG9jYWxfdmFyIDwvZGV2L251bGwgfCBlY2hvIDI+Ji0gfCBjYXQgMTw+L2Rldi9udWxsCit7IGVjaG8gaGk0ICRsb2NhbF92YXIgYGVjaG8gaG9gIDE8Pi9kZXYvbnVsbDsgfQorKCBlY2hvIGhpNCAkbG9jYWxfdmFyIGBlY2hvIGhvYCAxPD4vZGV2L251bGwgKQoraWYgZWNobyAkbG9jYWxfdmFyOyBmYWxzZQorICAgIHRoZW4gZWNobyBub3QgcnVuCisgICAgZWxpZiBmYWxzZSA8JGRldl9udWxsCisgICAgdGhlbiBub25lCisgICAgZWxzZSBjYXQgMDw+JGRldl9udWxsIDE8PiIkZGV2X251bGwiCitmaSA+Pi9kZXYvbnVsbAoreworICAgIGlmIGVjaG8gJGxvY2FsX3ZhcjsgdGhlbiBjYXQgPDxIRVJFCitIaSBjYXQKK0hFUkUKKyAgICBmaSA+Pi9kZXYvbnVsbAorfSAxPD4vZGV2L251bGwKK3doaWxlIHsgZWNobyAkZGV2X251bGwgPj4kZGV2X251bGw7IH07IGRvIGNhdCA8IiRkZXZfbnVsbCI7IGJyZWFrOyBkb25lCisoIHVudGlsIHsgZWNobyAkZGV2X251bGwgPj4kZGV2X251bGwgfCBmYWxzZTsgfTsgZG8gY2F0IDwiJGRldl9udWxsIjsgYnJlYWs7IGRvbmUgKSA8JGRldl9udWxsCitmKCkgeyBlY2hvICQxOyB9CitmID4vZGV2L251bGwKKworbWVtbGVhaworCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCisjIFBsZWFzZSBjb3B5IHRoZSBlbnRpcmUgYmxvY2sgZnJvbSBhYm92ZSB2ZXJiYXRpbQorbG9jYWxfdmFyPSJsb2NhbCB2YWwiCitleHBvcnQgZGV2X251bGw9Ii9kZXYvbnVsbCIKKz4kZGV2X251bGwKK2VjaG8gaGkxICRsb2NhbF92YXIgYGVjaG8gaG9gID4+L2Rldi9udWxsCitlY2hvIGhpMiAkbG9jYWxfdmFyIDwvZGV2L251bGwgfCBlY2hvIDI+Ji0gfCBjYXQgMTw+L2Rldi9udWxsCit7IGVjaG8gaGk0ICRsb2NhbF92YXIgYGVjaG8gaG9gIDE8Pi9kZXYvbnVsbDsgfQorKCBlY2hvIGhpNCAkbG9jYWxfdmFyIGBlY2hvIGhvYCAxPD4vZGV2L251bGwgKQoraWYgZWNobyAkbG9jYWxfdmFyOyBmYWxzZQorICAgIHRoZW4gZWNobyBub3QgcnVuCisgICAgZWxpZiBmYWxzZSA8JGRldl9udWxsCisgICAgdGhlbiBub25lCisgICAgZWxzZSBjYXQgMDw+JGRldl9udWxsIDE8PiIkZGV2X251bGwiCitmaSA+Pi9kZXYvbnVsbAoreworICAgIGlmIGVjaG8gJGxvY2FsX3ZhcjsgdGhlbiBjYXQgPDxIRVJFCitIaSBjYXQKK0hFUkUKKyAgICBmaSA+Pi9kZXYvbnVsbAorfSAxPD4vZGV2L251bGwKK3doaWxlIHsgZWNobyAkZGV2X251bGwgPj4kZGV2X251bGw7IH07IGRvIGNhdCA8IiRkZXZfbnVsbCI7IGJyZWFrOyBkb25lCisoIHVudGlsIHsgZWNobyAkZGV2X251bGwgPj4kZGV2X251bGwgfCBmYWxzZTsgfTsgZG8gY2F0IDwiJGRldl9udWxsIjsgYnJlYWs7IGRvbmUgKSA8JGRldl9udWxsCitmKCkgeyBlY2hvICQxOyB9CitmID4vZGV2L251bGwKKworIyBBbmQgc2FtZSBhZ2FpbgorCitsb2NhbF92YXI9ImxvY2FsIHZhbCIKK2V4cG9ydCBkZXZfbnVsbD0iL2Rldi9udWxsIgorPiRkZXZfbnVsbAorZWNobyBoaTEgJGxvY2FsX3ZhciBgZWNobyBob2AgPj4vZGV2L251bGwKK2VjaG8gaGkyICRsb2NhbF92YXIgPC9kZXYvbnVsbCB8IGVjaG8gMj4mLSB8IGNhdCAxPD4vZGV2L251bGwKK3sgZWNobyBoaTQgJGxvY2FsX3ZhciBgZWNobyBob2AgMTw+L2Rldi9udWxsOyB9CisoIGVjaG8gaGk0ICRsb2NhbF92YXIgYGVjaG8gaG9gIDE8Pi9kZXYvbnVsbCApCitpZiBlY2hvICRsb2NhbF92YXI7IGZhbHNlCisgICAgdGhlbiBlY2hvIG5vdCBydW4KKyAgICBlbGlmIGZhbHNlIDwkZGV2X251bGwKKyAgICB0aGVuIG5vbmUKKyAgICBlbHNlIGNhdCAwPD4kZGV2X251bGwgMTw+IiRkZXZfbnVsbCIKK2ZpID4+L2Rldi9udWxsCit7CisgICAgaWYgZWNobyAkbG9jYWxfdmFyOyB0aGVuIGNhdCA8PEhFUkUKK0hpIGNhdAorSEVSRQorICAgIGZpID4+L2Rldi9udWxsCit9IDE8Pi9kZXYvbnVsbAord2hpbGUgeyBlY2hvICRkZXZfbnVsbCA+PiRkZXZfbnVsbDsgfTsgZG8gY2F0IDwiJGRldl9udWxsIjsgYnJlYWs7IGRvbmUKKyggdW50aWwgeyBlY2hvICRkZXZfbnVsbCA+PiRkZXZfbnVsbCB8IGZhbHNlOyB9OyBkbyBjYXQgPCIkZGV2X251bGwiOyBicmVhazsgZG9uZSApIDwkZGV2X251bGwKK2YoKSB7IGVjaG8gJDE7IH0KK2YgPi9kZXYvbnVsbAorCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rICMka2IKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiAob3IgbW9yZSkgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2VtcHR5X3RpY2sucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19lbXB0eV90aWNrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19lbXB0eV90aWNrLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorV2FybSB1cAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfZW1wdHlfdGljay50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2VtcHR5X3RpY2sudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUzNzU3OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2VtcHR5X3RpY2sudGVzdHMKQEAgLTAsMCArMSwyOCBAQAorZWNobyAiV2FybSB1cCIKK2k9MQord2hpbGUgdGVzdCAkaSAhPSA5OyBkbworICAgIGB0cnVlYAorICAgIDogJCgoaSsrKSkKK2RvbmUKKworbWVtbGVhaworCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gMTk5OyBkbworICAgIGB0cnVlYAorICAgIDogJCgoaSsrKSkKK2RvbmUKK2k9MQord2hpbGUgdGVzdCAkaSAhPSAxOTk7IGRvCisgICAgYHRydWVgCisgICAgOiAkKChpKyspKQorZG9uZQorCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rICMka2IKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiAob3IgbW9yZSkgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2hlcmVkb2MxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfaGVyZWRvYzEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2hlcmVkb2MxLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorV2FybSB1cAorTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uCitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfaGVyZWRvYzEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19oZXJlZG9jMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmNiYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfaGVyZWRvYzEudGVzdHMKQEAgLTAsMCArMSwzNCBAQAorZWNobyAiV2FybSB1cCIKK2k9MQord2hpbGUgdGVzdCAkaSAhPSA5OTsgZG8KKyAgICA6IDw8SEVSRQorSGVsbG8gJGkgYGVjaG8gYnVpbHRpbl8kaWAKK0hFUkUKKyAgICA6ICQoKGkrKykpCitkb25lCisKK21lbWxlYWsKKworZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgoraT0xCit3aGlsZSB0ZXN0ICRpICE9IDk5OyBkbworICAgIDogPDxIRVJFCitIZWxsbyAkaSBgZWNobyBidWlsdGluXyRpYAorSEVSRQorICAgIDogJCgoaSsrKSkKK2RvbmUKK2k9MQord2hpbGUgdGVzdCAkaSAhPSA5OTsgZG8KKyAgICA6IDw8SEVSRQorSGVsbG8gJGkgYGVjaG8gYnVpbHRpbl8kaWAKK0hFUkUKKyAgICA6ICQoKGkrKykpCitkb25lCisKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sgIyRrYgorZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIChvciBtb3JlKSBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGQ2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIucmlnaHQKQEAgLTAsMCArMSwyIEBACitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDFjMDllNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3Zhci50ZXN0cwpAQCAtMCwwICsxLDQ3IEBACitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gWDsgZG8KKyAgICB1bnNldCB0CisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKKyAgICBleHBvcnQgdAorICAgIHVuc2V0IHQKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorICAgIGV4cG9ydCB0CisgICAgdW5zZXQgdAorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCisgICAgZXhwb3J0IHQKKyAgICB1bnNldCB0CisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKKyAgICBleHBvcnQgdAorICAgIHVuc2V0IHQKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorICAgIGV4cG9ydCB0CisgICAgaT0xJGkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTsgdGhlbiBpPTI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTI7IHRoZW4gaT0zOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzOyB0aGVuIGk9NDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNDsgdGhlbiBpPTU7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTU7IHRoZW4gaT02OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE2OyB0aGVuIGk9NzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNzsgdGhlbiBpPTg7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTg7IHRoZW4gaT05OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE5OyB0aGVuIGk9YTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYTsgdGhlbiBpPWI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWI7IHRoZW4gaT1jOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFjOyB0aGVuIGk9ZDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZDsgdGhlbiBpPWU7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWU7IHRoZW4gaT1mOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFmOyB0aGVuIGk9ZzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZzsgdGhlbiBpPWg7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWg7IHRoZW4gaT1pOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFpOyB0aGVuIGk9ajsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExajsgdGhlbiBpPVg7IGZpCisgICAgbWVtbGVhaworZG9uZQorbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPaworZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIChvciBtb3JlKSBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjIucmlnaHQKQEAgLTAsMCArMSwzIEBACitXYXJtIHVwCitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTE2NjZjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMi50ZXN0cwpAQCAtMCwwICsxLDQzIEBACitlY2hvICJXYXJtIHVwIgordD0xCitleHBvcnQgdAoraT0xCit3aGlsZSB0ZXN0ICRpICE9IFg7IGRvCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAkaQorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJGkgdHJ1ZQorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyJGkgL2Jpbi90cnVlCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMkaSBleGVjIDE+JjEKKyAgICBpPTEkaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOyB0aGVuIGk9MjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjsgdGhlbiBpPTM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTM7IHRoZW4gaT00OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE0OyB0aGVuIGk9WDsgZmkKK2RvbmUKK3Vuc2V0IHQgaQorCittZW1sZWFrCisKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKK3Q9MQorZXhwb3J0IHQKK2k9MQord2hpbGUgdGVzdCAkaSAhPSBYOyBkbworICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwJGkKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSRpIHRydWUKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMiRpIC9iaW4vdHJ1ZQorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzJGkgZXhlYyAxPiYxCisgICAgaT0xJGkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTsgdGhlbiBpPTI7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTI7IHRoZW4gaT0zOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEzOyB0aGVuIGk9NDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNDsgdGhlbiBpPVg7IGZpCitkb25lCit1bnNldCB0IGkKKworbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPaworZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIChvciBtb3JlKSBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjMucmlnaHQKQEAgLTAsMCArMSwzIEBACitXYXJtIHVwCitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTU0YzQyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMy50ZXN0cwpAQCAtMCwwICsxLDQxIEBACisjIFdhcyBzZWVuIGxlYWtpbmcgb24gTk9NTVUgYnVpbGQKKworZWNobyAiV2FybSB1cCIKK2k9MTsgdD0xOyBleHBvcnQgdAord2hpbGUgdGVzdCAkaSAhPSA0MDA7IGRvCisgICAgdD12YWx1ZUFfJGkgdHJ1ZQorICAgIDogJCgoaSsrKSkKK2RvbmUKKworbWVtbGVhaworZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgorCisjIFBsZWFzZSBjb3B5IHRoZSBlbnRpcmUgYmxvY2sgZnJvbSBhYm92ZSB2ZXJiYXRpbQoraT0xOyB0PTE7IGV4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDQwMDsgZG8KKyAgICB0PXZhbHVlQV8kaSB0cnVlCisgICAgOiAkKChpKyspKQorZG9uZQoraT0xOyB0PTE7IGV4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDQwMDsgZG8KKyAgICB0PXZhbHVlQV8kaSB0cnVlCisgICAgOiAkKChpKyspKQorZG9uZQoraT0xOyB0PTE7IGV4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDQwMDsgZG8KKyAgICB0PXZhbHVlQV8kaSB0cnVlCisgICAgOiAkKChpKyspKQorZG9uZQoraT0xOyB0PTE7IGV4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDQwMDsgZG8KKyAgICB0PXZhbHVlQV8kaSB0cnVlCisgICAgOiAkKChpKyspKQorZG9uZQorCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rICMka2IKK2Vsc2UKKyAgICBlY2hvICJCYWQ6ICRrYiBrYiAob3IgbW9yZSkgbGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9ydW4tYWxsIGIvc2hlbGwvaHVzaF90ZXN0L3J1bi1hbGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjRhN2FiYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9ydW4tYWxsCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vc2gKKwordW5zZXQgTEFORyBMQU5HVUFHRQordW5zZXQgTENfQ09MTEFURQordW5zZXQgTENfQ1RZUEUKK3Vuc2V0IExDX01PTkVUQVJZCit1bnNldCBMQ19NRVNTQUdFUwordW5zZXQgTENfTlVNRVJJQwordW5zZXQgTENfVElNRQordW5zZXQgTENfQUxMCisKK2lmIHRlc3QgISAteCBodXNoOyB0aGVuCisJaWYgdGVzdCAhIC14IC4uLy4uL2J1c3lib3g7IHRoZW4KKwkJZWNobyAiQ2FuJ3QgcnVuIHRlc3RzLiBQdXQgaHVzaCBiaW5hcnkgaW50byB0aGlzIGRpcmVjdG9yeSAoYHB3ZGApIgorCQlleGl0IDEKKwlmaQorCWVjaG8gIk5vIC4vaHVzaCAtIGNyZWF0aW5nIGEgbGluayB0byAuLi8uLi9idXN5Ym94IgorCWxuIC1zIC4uLy4uL2J1c3lib3ggaHVzaAorZmkKK2lmIHRlc3QgISAtZiAuY29uZmlnOyB0aGVuCisJaWYgdGVzdCAhIC1mIC4uLy4uLy5jb25maWc7IHRoZW4KKwkJZWNobyAiTWlzc2luZyAuY29uZmlnIGZpbGUiCisJCWV4aXQgMQorCWZpCisJY3AgLi4vLi4vLmNvbmZpZyAuIHx8IGV4aXQgMQorZmkKKworZXZhbCAkKHNlZCAtZSAnL14jL2QnIC1lICcvXiQvZCcgLWUgJ3M6XjpleHBvcnQgOicgLmNvbmZpZykKKworUEFUSD0iYHB3ZGA6JFBBVEgiICMgZm9yIGh1c2ggYW5kIHJlY2hvL3plY2hvL3ByaW50ZW52CitleHBvcnQgUEFUSAorCitUSElTX1NIPSJgcHdkYC9odXNoIgorZXhwb3J0IFRISVNfU0gKKworZG9fdGVzdCgpCit7CisJdGVzdCAtZCAiJDEiIHx8IHJldHVybiAwCisJZD0ke2QlL30KKyMJZWNobyBSdW5uaW5nIHRlc3RzIGluIGRpcmVjdG9yeSAiJDEiCisJKAorCXRyZXQ9MAorCWNkICIkMSIgfHwgeyBlY2hvICJjYW5ub3QgY2QgJDEhIjsgZXhpdCAxOyB9CisJZm9yIHggaW4gcnVuLSo7IGRvCisJCXRlc3QgLWYgIiR4IiB8fCBjb250aW51ZQorCQljYXNlICIkeCIgaW4KKwkJCSIkMCJ8cnVuLW1pbmltYWx8cnVuLWdwcm9mKSA7OworCQkJKi5vcmlnfCp+KSA7OworCQkJIyopIGVjaG8gJHggOyBzaCAkeCA7OworCQkJKikKKwkJCWVjaG8gLW4gIiQxLyR4OiIKKwkJCXNoICIkeCIgPiIuLi8kMS0keC5mYWlsIiAyPiYxICYmIFwKKwkJCXsgeyBlY2hvICIgb2siOyBybSAiLi4vJDEtJHguZmFpbCI7IH0gfHwgZWNobyAiIGZhaWwiOyB9CisJCQk7OworCQllc2FjCisJZG9uZQorCSMgTWFueSBiYXNoIHJ1bi1YWFggc2NyaXB0cyBqdXN0IGRvIHRoaXMsCisJIyBubyBwb2ludCBpbiBkdXBsaWNhdGlvbiBpdCBhbGwgb3ZlciB0aGUgcGxhY2UKKwlmb3IgeCBpbiAqLnRlc3RzOyBkbworCXRlc3QgLXggIiR4IiB8fCBjb250aW51ZQorCW5hbWU9IiR7eCUlLnRlc3RzfSIKKwl0ZXN0IC1mICIkbmFtZS5yaWdodCIgfHwgY29udGludWUKKyMJZWNobyBSdW5uaW5nIHRlc3Q6ICIkeCIKKwllY2hvIC1uICIkMS8keDoiCisJKAorCQkiJFRISVNfU0giICIuLyR4IiA+IiRuYW1lLnh4IiAyPiYxCisJCSMgZmlsdGVyIEMgbGlicmFyeSBkaWZmZXJlbmNlcworCQlzZWQgLWkgXAorCQkJLWUgIi86IGludmFsaWQgb3B0aW9uIC9zOic6OmciIFwKKwkJCSIkbmFtZS54eCIKKwkJdGVzdCAkPyAtZXEgNzcgJiYgcm0gLWYgIi4uLyQxLSR4LmZhaWwiICYmIGV4aXQgNzcKKwkJZGlmZiAtdSAiJG5hbWUueHgiICIkbmFtZS5yaWdodCIgPiIuLi8kMS0keC5mYWlsIiAmJiBybSAtZiAiJG5hbWUueHgiICIuLi8kMS0keC5mYWlsIgorCSkKKwljYXNlICQ/IGluCisJCTApICBlY2hvICIgb2siOzsKKwkJNzcpIGVjaG8gIiBza2lwIChmZWF0dXJlIGRpc2FibGVkKSI7OworCQkqKSAgZWNobyAiIGZhaWwiOyB0cmV0PTE7OworCWVzYWMKKwlkb25lCisJZXhpdCAke3RyZXR9CisJKQorfQorCisjIE1haW4gcGFydCBvZiB0aGlzIHNjcmlwdAorIyBVc2FnZTogcnVuLWFsbCBbZGlyZWN0b3JpZXNdCisKK3JldD0wCisKK2lmIFsgJCMgLWx0IDEgXTsgdGhlbgorCSMgQWxsIHN1YiBkaXJlY3RvcmllcworCW1vZHVsZXM9YGxzIC1kIGh1c2gtKmAKKworCWZvciBtb2R1bGUgaW4gJG1vZHVsZXM7IGRvCisJZG9fdGVzdCAkbW9kdWxlIHx8IHJldD0xCisJZG9uZQorZWxzZQorCXdoaWxlIFsgJCMgLWdlIDEgXTsgZG8KKwlpZiBbIC1kICQxIF07IHRoZW4KKwkJZG9fdGVzdCAkMSB8fCByZXQ9MQorCWZpCisJc2hpZnQKKwlkb25lCitmaQorCitleGl0ICR7cmV0fQpkaWZmIC0tZ2l0IGEvc2hlbGwvbWF0Y2guYyBiL3NoZWxsL21hdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlM2NmMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21hdGNoLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiAjIy8lJSB2YXJpYWJsZSBtYXRjaGluZyBjb2RlIHJpcHBlZCBvdXQgb2YgYXNoIHNoZWxsIGZvciBjb2RlIHNoYXJpbmcKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqIHdhcyByZS1wb3J0ZWQgZnJvbSBOZXRCU0QgYW5kIGRlYmlhbml6ZWQuCisgKi8KKyNpZmRlZiBTVEFOREFMT05FCisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0cmluZy5oPgorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZGVmaW5lIEZBU1RfRlVOQyAvKiBub3RoaW5nICovCisjIGRlZmluZSBQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4gLyogbm90aGluZyAqLworIyBkZWZpbmUgUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkgLyogbm90aGluZyAqLworI2Vsc2UKKyMgaW5jbHVkZSAibGliYmIuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJtYXRjaC5oIgorCitjaGFyKiBGQVNUX0ZVTkMgc2Nhbl9hbmRfbWF0Y2goY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpwYXR0ZXJuLCB1bnNpZ25lZCBmbGFncykKK3sKKwljaGFyICpsb2M7CisJY2hhciAqZW5kOworCXVuc2lnbmVkIGxlbiA9IHN0cmxlbihzdHJpbmcpOworCWludCBlYXJseV9leGl0OworCisJLyogV2UgY2FuIHN0b3AgdGhlIHNjYW4gZWFybHkgb25seSBpZiB0aGUgc3RyaW5nIHBhcnQKKwkgKiB3ZSBhcmUgbWF0Y2hpbmcgYWdhaW5zdCBpcyBzaHJpbmtpbmcsIGFuZCB0aGUgcGF0dGVybiBoYXMKKwkgKiBhbiB1bnF1b3RlZCAic3RhciIgYXQgdGhlIGNvcnJlc3BvbmRpbmcgZW5kLiBUaGVyZSBhcmUgdHdvIGNhc2VzLgorCSAqIENhc2UgMToKKwkgKiAicXdlcnR5IiBkb2VzIG5vdCBtYXRjaCBhZ2FpbnN0IHBhdHRlcm4gIip6eSIsCisJICogbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIG1hdGNoICJ3ZXJ0eSIsICJlcnR5IiBldGM6CisJICovCisJZWFybHlfZXhpdCA9IChmbGFncyA9PSAoU0NBTl9NT1ZFX0ZST01fTEVGVCArIFNDQU5fTUFUQ0hfUklHSFRfSEFMRikgJiYgcGF0dGVyblswXSA9PSAnKicpOworCisJaWYgKGZsYWdzICYgU0NBTl9NT1ZFX0ZST01fTEVGVCkgeworCQlsb2MgPSBzdHJpbmc7CisJCWVuZCA9IHN0cmluZyArIGxlbiArIDE7CisJfSBlbHNlIHsKKwkJbG9jID0gc3RyaW5nICsgbGVuOworCQllbmQgPSBzdHJpbmcgLSAxOworCQlpZiAoZmxhZ3MgPT0gKFNDQU5fTU9WRV9GUk9NX1JJR0hUICsgU0NBTl9NQVRDSF9MRUZUX0hBTEYpKSB7CisJCQkvKiBDYXNlIDI6CisJCQkgKiAicXdlcnR5IiBkb2VzIG5vdCBtYXRjaCBhZ2FpbnN0IHBhdHRlcm4gInF6KiIsCisJCQkgKiBubyBwb2ludCBpbiB0cnlpbmcgdG8gbWF0Y2ggInF3ZXJ0IiwgInF3ZXIiIGV0YzoKKwkJCSAqLworCQkJY29uc3QgY2hhciAqcCA9IHBhdHRlcm4gKyBzdHJsZW4ocGF0dGVybik7CisJCQlpZiAoLS1wID49IHBhdHRlcm4gJiYgKnAgPT0gJyonKSB7CisJCQkJZWFybHlfZXhpdCA9IDE7CisJCQkJd2hpbGUgKC0tcCA+PSBwYXR0ZXJuICYmICpwID09ICdcXCcpCisJCQkJCWVhcmx5X2V4aXQgXj0gMTsKKwkJCX0KKwkJfQorCX0KKworCXdoaWxlIChsb2MgIT0gZW5kKSB7CisJCWNoYXIgYzsKKwkJaW50IHI7CisKKwkJYyA9ICpsb2M7CisJCWlmIChmbGFncyAmIFNDQU5fTUFUQ0hfTEVGVF9IQUxGKSB7CisJCQkqbG9jID0gJ1wwJzsKKwkJCXIgPSBmbm1hdGNoKHBhdHRlcm4sIHN0cmluZywgMCk7CisJCQkqbG9jID0gYzsKKwkJfSBlbHNlIHsKKwkJCXIgPSBmbm1hdGNoKHBhdHRlcm4sIGxvYywgMCk7CisJCX0KKwkJaWYgKHIgPT0gMCkgLyogbWF0Y2ggZm91bmQgKi8KKwkJCXJldHVybiBsb2M7CisJCWlmIChlYXJseV9leGl0KSB7CisjaWZkZWYgU1RBTkRBTE9ORQorCQkJcHJpbnRmKCIoZWFybHkgZXhpdCkgIik7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZsYWdzICYgU0NBTl9NT1ZFX0ZST01fTEVGVCkgeworCQkJbG9jKys7CisJCX0gZWxzZSB7CisJCQlsb2MtLTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIFNUQU5EQUxPTkUKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciAqc3RyaW5nOworCWNoYXIgKm9wOworCWNoYXIgKnBhdHRlcm47CisJY2hhciAqbG9jOworCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJcHV0cygKKwkJCSJVc2FnZTogbWF0Y2ggPHRlc3Q+IFt0ZXN0Li4uXVxuXG4iCisJCQkiV2hlcmUgYSA8dGVzdD4gaXMgdGhlIGZvcm06IDxzdHJpbmc+PG9wPjxtYXRjaD5cbiIKKwkJCSJUaGlzIGlzIHRvIHRlc3QgdGhlIHNoZWxsICR7dmFyI3ZhbH0gZXhwcmVzc2lvbiB0eXBlLlxuXG4iCisJCQkiZS5nLiBgbWF0Y2ggJ2FiYyNhKidgIC0+IGJjIgorCQkpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSAoKisrYXJndikgeworCQlzaXplX3Qgb2ZmOworCQl1bnNpZ25lZCBzY2FuX2ZsYWdzOworCisJCXN0cmluZyA9ICphcmd2OworCQlvZmYgPSBzdHJjc3BuKHN0cmluZywgIiMlIik7CisJCWlmICghb2ZmKSB7CisJCQlwcmludGYoImludmFsaWQgZm9ybWF0XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9wID0gc3RyaW5nICsgb2ZmOworCQlzY2FuX2ZsYWdzID0gcGlja19zY2FuKG9wWzBdLCBvcFsxXSk7CisKKwkJcHJpbnRmKCInJXMnOiBmbGFnczoleCwgIiwgc3RyaW5nLCBzY2FuX2ZsYWdzKTsKKwkJcGF0dGVybiA9IG9wICsgMTsKKwkJaWYgKG9wWzBdID09IG9wWzFdKQorCQkJcGF0dGVybisrOworCQlvcFswXSA9ICdcMCc7CisKKwkJbG9jID0gc2Nhbl9hbmRfbWF0Y2goc3RyaW5nLCBwYXR0ZXJuLCBzY2FuX2ZsYWdzKTsKKworCQlpZiAoc2Nhbl9mbGFncyAmIFNDQU5fTUFUQ0hfTEVGVF9IQUxGKSB7CisJCQlwcmludGYoIiclcydcbiIsIGxvYyk7CisJCX0gZWxzZSB7CisJCQlpZiAobG9jKQorCQkJCSpsb2MgPSAnXDAnOworCQkJcHJpbnRmKCInJXMnXG4iLCBzdHJpbmcpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NoZWxsL21hdGNoLmggYi9zaGVsbC9tYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzkzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tYXRjaC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIG1hdGNoLmggLSBpbnRlcmZhY2UgdG8gc2hlbGwgIyMvJSUgbWF0Y2hpbmcgY29kZSAqLworCisjaWZuZGVmIFNIRUxMX01BVENIX0gKKyNkZWZpbmUgU0hFTExfTUFUQ0hfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvL1RPRE8hIFdoeSBhc2guYyBzdGlsbCB1c2VzIGludGVybmFsIHZlcnNpb24/IQorCitlbnVtIHsKKwlTQ0FOX01PVkVfRlJPTV9MRUZUID0gKDEgPDwgMCksCisJU0NBTl9NT1ZFX0ZST01fUklHSFQgPSAoMSA8PCAxKSwKKwlTQ0FOX01BVENIX0xFRlRfSEFMRiA9ICgxIDw8IDIpLAorCVNDQU5fTUFUQ0hfUklHSFRfSEFMRiA9ICgxIDw8IDMpLAorfTsKKworY2hhciogRkFTVF9GVU5DIHNjYW5fYW5kX21hdGNoKGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqcGF0dGVybiwgdW5zaWduZWQgZmxhZ3MpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHBpY2tfc2NhbihjaGFyIG9wMSwgY2hhciBvcDIpCit7CisJdW5zaWduZWQgc2Nhbl9mbGFnczsKKwlpZiAob3AxID09ICcjJykgeworCQlzY2FuX2ZsYWdzID0gU0NBTl9NQVRDSF9MRUZUX0hBTEYgKworCQkJKG9wMSA9PSBvcDIgPyBTQ0FOX01PVkVfRlJPTV9SSUdIVCA6IFNDQU5fTU9WRV9GUk9NX0xFRlQpOworCX0gZWxzZSB7IC8qICUgKi8KKwkJc2Nhbl9mbGFncyA9IFNDQU5fTUFUQ0hfUklHSFRfSEFMRiArCisJCQkob3AxID09IG9wMiA/IFNDQU5fTU9WRV9GUk9NX0xFRlQgOiBTQ0FOX01PVkVfRlJPTV9SSUdIVCk7CisJfQorCXJldHVybiBzY2FuX2ZsYWdzOworfQorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NoZWxsL21hdGguYyBiL3NoZWxsL21hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA2NDVkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbWF0aC5jCkBAIC0wLDAgKzEsNzUwIEBACisvKgorICogQXJpdGhtZXRpYyBjb2RlIHJpcHBlZCBvdXQgb2YgYXNoIHNoZWxsIGZvciBjb2RlIHNoYXJpbmcuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBPcmlnaW5hbCBCU0QgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogd2FzIHJlLXBvcnRlZCBmcm9tIE5ldEJTRCBhbmQgZGViaWFuaXplZC4KKyAqCisgKiByZXdyaXRlIGFyaXRoLnkgdG8gbWljcm8gc3RhY2sgYmFzZWQgY3J5cHRpYyBhbGdvcml0aG0gYnkKKyAqIENvcHlyaWdodCAoYykgMjAwMSBBYXJvbiBMZWhtYW5uIDxhYXJvbmxAdml0ZWx1cy5jb20+CisgKgorICogTW9kaWZpZWQgYnkgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4gKGMpIDIwMDQgdG8gc3VwcG9ydAorICogZHluYW1pYyB2YXJpYWJsZXMuCisgKgorICogTW9kaWZpZWQgYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAoYykgMjAwMS0yMDA1IHRvIGJlCisgKiB1c2VkIGluIGJ1c3lib3ggYW5kIHNpemUgb3B0aW1pemF0aW9ucywKKyAqIHJld3JvdGUgYXJpdGggKHNlZSBub3RlcyB0byB0aGlzKSwgYWRkZWQgbG9jYWxlIHN1cHBvcnQsCisgKiByZXdyb3RlIGR5bmFtaWMgdmFyaWFibGVzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIENvcHlyaWdodCAoYykgMjAwMSBBYXJvbiBMZWhtYW5uIDxhYXJvbmxAdml0ZWx1cy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiBUaGlzIGlzIG15IGluZml4IHBhcnNlci9ldmFsdWF0b3IuIEl0IGlzIG9wdGltaXplZCBmb3Igc2l6ZSwgaW50ZW5kZWQKKyAqIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHlhY2MtYmFzZWQgcGFyc2Vycy4gSG93ZXZlciwgaXQgbWF5IHdlbGwgYmUgZmFzdGVyCisgKiB0aGFuIGEgY29tcGFyYWJsZSBwYXJzZXIgd3JpdHRlbiBpbiB5YWNjLiBUaGUgc3VwcG9ydGVkIG9wZXJhdG9ycyBhcmUKKyAqIGxpc3RlZCBpbiAjZGVmaW5lcyBiZWxvdy4gUGFyZW5zLCBvcmRlciBvZiBvcGVyYXRpb25zLCBhbmQgZXJyb3IgaGFuZGxpbmcKKyAqIGFyZSBzdXBwb3J0ZWQuIFRoaXMgY29kZSBpcyB0aHJlYWQgc2FmZS4gVGhlIGV4YWN0IGV4cHJlc3Npb24gZm9ybWF0IHNob3VsZAorICogYmUgdGhhdCB3aGljaCBQT1NJWCBzcGVjaWZpZXMgZm9yIHNoZWxscy4KKyAqCisgKiBUaGUgY29kZSB1c2VzIGEgc2ltcGxlIHR3by1zdGFjayBhbGdvcml0aG0uIFNlZQorICogaHR0cDovL3d3dy5vbnRoZW5ldC5jb20uYXUvfmdyYWhhbWlzL2ludDIwMDgvd2VlazAyL2xlY3QwMi5odG1sCisgKiBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgaW5maXgtdG8tcG9zdGZpeCBhbGdvcml0aG0gb24gd2hpY2gKKyAqIHRoaXMgaXMgYmFzZWQgKHRoaXMgY29kZSBkaWZmZXJzIGluIHRoYXQgaXQgYXBwbGllcyBvcGVyYXRvcnMgaW1tZWRpYXRlbHkKKyAqIHRvIHRoZSBzdGFjayBpbnN0ZWFkIG9mIGFkZGluZyB0aGVtIHRvIGEgcXVldWUgdG8gZW5kIHVwIHdpdGggYW4KKyAqIGV4cHJlc3Npb24pLgorICovCisKKy8qCisgKiBBdWcgMjQsIDIwMDEgICAgICAgICAgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiBSZWR1Y2VkIHRoZSBnZW5lcmF0ZWQgY29kZSBzaXplIGJ5IGFib3V0IDMwJSAoaTM4NikgYW5kIGZpeGVkIHNldmVyYWwgYnVncy4KKyAqCisgKiAxKSBJbiBhcml0aF9hcHBseSgpOgorICogICAgYSkgQ2FjaGVkIHZhbHVlcyBvZiAqbnVtcHRyIGFuZCAmKG51bXB0clstMV0pLgorICogICAgYikgUmVtb3ZlZCByZWR1bmRhbnQgdGVzdCBmb3IgemVybyBkZW5vbWluYXRvci4KKyAqCisgKiAyKSBJbiBhcml0aCgpOgorICogICAgYSkgRWxpbWluYXRlZCByZWR1bmRhbnQgY29kZSBmb3IgcHJvY2Vzc2luZyBvcGVyYXRvciB0b2tlbnMgYnkgbW92aW5nCisgKiAgICAgICB0byBhIHRhYmxlLWJhc2VkIGltcGxlbWVudGF0aW9uLiAgQWxzbyBmb2xkZWQgaGFuZGxpbmcgb2YgcGFyZW5zCisgKiAgICAgICBpbnRvIHRoZSB0YWJsZS4KKyAqICAgIGIpIENvbWJpbmVkIGFsbCAzIGxvb3BzIHdoaWNoIGNhbGxlZCBhcml0aF9hcHBseSB0byByZWR1Y2UgZ2VuZXJhdGVkCisgKiAgICAgICBjb2RlIHNpemUgYXQgdGhlIGNvc3Qgb2Ygc3BlZWQuCisgKgorICogMykgVGhlIGZvbGxvd2luZyBleHByZXNzaW9ucyB3ZXJlIHRyZWF0ZWQgYXMgdmFsaWQgYnkgdGhlIG9yaWdpbmFsIGNvZGU6CisgKiAgICAgICAxKCkgICwgICAgMCEgICwgICAgMSAoICozICkgICAuCisgKiAgICBUaGVzZSBidWdzIGhhdmUgYmVlbiBmaXhlZCBieSBpbnRlcm5hbGx5IGVuY2xvc2luZyB0aGUgZXhwcmVzc2lvbiBpbgorICogICAgcGFyZW5zIGFuZCB0aGVuIGNoZWNraW5nIHRoYXQgYWxsIGJpbmFyeSBvcHMgYW5kIHJpZ2h0IHBhcmVucyBhcmUKKyAqICAgIHByZWNlZGVkIGJ5IGEgdmFsaWQgZXhwcmVzc2lvbiAoTlVNX1RPS0VOKS4KKyAqCisgKiBOb3RlOiBJdCBtYXkgYmUgZGVzaXJhYmxlIHRvIHJlcGxhY2UgQWFyb24ncyB0ZXN0IGZvciB3aGl0ZXNwYWNlIHdpdGgKKyAqIGN0eXBlJ3MgaXNzcGFjZSgpIGlmIGl0IGlzIHVzZWQgYnkgYW5vdGhlciBidXN5Ym94IGFwcGxldCBvciBpZiBhZGRpdGlvbmFsCisgKiB3aGl0ZXNwYWNlIGNoYXJzIHNob3VsZCBiZSBjb25zaWRlcmVkLiAgTG9vayBiZWxvdyB0aGUgIiNpbmNsdWRlInMgZm9yIGEKKyAqIHByZWNvbXBpbGVyIHRlc3QuCisgKi8KKy8qCisgKiBBdWcgMjYsIDIwMDEgICAgICAgICAgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiBSZXR1cm4gMCBmb3IgbnVsbCBleHByZXNzaW9ucy4gIFBvaW50ZWQgb3V0IGJ5IFZsYWRpbWlyIE9sZXluaWsuCisgKgorICogTWVyZ2UgaW4gQWFyb24ncyBjb21tZW50cyBwcmV2aW91c2x5IHBvc3RlZCB0byB0aGUgYnVzeWJveCBsaXN0LAorICogbW9kaWZpZWQgc2xpZ2h0bHkgdG8gdGFrZSBhY2NvdW50IG9mIG15IGNoYW5nZXMgdG8gdGhlIGNvZGUuCisgKgorICovCisvKgorICogIChDKSAyMDAzIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiAtIGFsbG93IGFjY2VzcyB0byB2YXJpYWJsZSwKKyAqICAgdXNlIHJlY3Vyc2l2ZSB2YWx1ZSBpbmRpcmVjdGlvbjogYz0iMioyIjsgYT0iYyI7IGVjaG8gJCgoYSs9MikpIHByb2R1Y2UgNgorICogLSBpbXBsZW1lbnQgYXNzaWduIHN5bnRheCAoVkFSPWV4cHIsICs9LCAqPSBldGMpCisgKiAtIGltcGxlbWVudCBleHBvbmVudGlhdGlvbiAoKiogb3BlcmF0b3IpCisgKiAtIGltcGxlbWVudCBjb21tYSBzZXBhcmF0ZWQgLSBleHByLCBleHByCisgKiAtIGltcGxlbWVudCArK2V4cHIgLS1leHByIGV4cHIrKyBleHByLS0KKyAqIC0gaW1wbGVtZW50IGV4cHIgPyBleHByIDogZXhwciAoYnV0IHNlY29uZCBleHByIGlzIGFsd2F5cyBjYWxjdWxhdGVkKQorICogLSBhbGxvdyBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycworICogLSByZXN0b3JlIGxvc3QgWE9SIG9wZXJhdG9yCisgKiAtIHByb3RlY3QgJCgobnVtIG51bSkpIGFzIHRydWUgemVybyBleHByIChNYW51ZWwncyBlcnJvcikKKyAqIC0gYWx3YXlzIHVzZSBzcGVjaWFsIGlzc3BhY2UoKSwgc2VlIGNvbW1lbnQgZnJvbSBiYXNoIDstKQorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYXRoLmgiCisKKyNkZWZpbmUgbG9va3VwdmFyIChtYXRoX3N0YXRlLT5sb29rdXB2YXIpCisjZGVmaW5lIHNldHZhciAgICAobWF0aF9zdGF0ZS0+c2V0dmFyICAgKQorLy8jZGVmaW5lIGVuZG9mbmFtZSAobWF0aF9zdGF0ZS0+ZW5kb2ZuYW1lKQorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3BlcmF0b3I7CisKKy8qIEFuIG9wZXJhdG9yJ3MgdG9rZW4gaWQgaXMgYSBiaXQgb2YgYSBiaXRmaWVsZC4gVGhlIGxvd2VyIDUgYml0cyBhcmUgdGhlCisgKiBwcmVjZWRlbmNlLCBhbmQgMyBoaWdoIGJpdHMgYXJlIGFuIElEIHVuaXF1ZSBhY3Jvc3Mgb3BlcmF0b3JzIG9mIHRoYXQKKyAqIHByZWNlZGVuY2UuIFRoZSBJRCBwb3J0aW9uIGlzIHNvIHRoYXQgbXVsdGlwbGUgb3BlcmF0b3JzIGNhbiBoYXZlIHRoZQorICogc2FtZSBwcmVjZWRlbmNlLCBlbnN1cmluZyB0aGF0IHRoZSBsZWZ0bW9zdCBvbmUgaXMgZXZhbHVhdGVkIGZpcnN0LgorICogQ29uc2lkZXIgKiBhbmQgLworICovCisjZGVmaW5lIHRva19kZWNsKHByZWMsaWQpICAgICAgICgoKGlkKTw8NSkgfCAocHJlYykpCisjZGVmaW5lIFBSRUMob3ApICAgICAgICAgICAgICAgICgob3ApICYgMHgxRikKKworI2RlZmluZSBUT0tfTFBBUkVOICAgICAgICAgICAgICB0b2tfZGVjbCgwLDApCisKKyNkZWZpbmUgVE9LX0NPTU1BICAgICAgICAgICAgICAgdG9rX2RlY2woMSwwKQorCisvKiBBbGwgYXNzaWdubWVudHMgYXJlIHJpZ2h0IGFzc29jaWF0aXZlIGFuZCBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UsCisgKiBidXQgdGhlcmUgYXJlIDExIG9mIHRoZW0sIHdoaWNoIGRvZXNuJ3QgZml0IGludG8gMyBiaXRzIGZvciB1bmlxdWUgaWQuCisgKiBBYnVzaW5nIGFub3RoZXIgcHJlY2VkZW5jZSBsZXZlbDoKKyAqLworI2RlZmluZSBUT0tfQVNTSUdOICAgICAgICAgICAgICB0b2tfZGVjbCgyLDApCisjZGVmaW5lIFRPS19BTkRfQVNTSUdOICAgICAgICAgIHRva19kZWNsKDIsMSkKKyNkZWZpbmUgVE9LX09SX0FTU0lHTiAgICAgICAgICAgdG9rX2RlY2woMiwyKQorI2RlZmluZSBUT0tfWE9SX0FTU0lHTiAgICAgICAgICB0b2tfZGVjbCgyLDMpCisjZGVmaW5lIFRPS19QTFVTX0FTU0lHTiAgICAgICAgIHRva19kZWNsKDIsNCkKKyNkZWZpbmUgVE9LX01JTlVTX0FTU0lHTiAgICAgICAgdG9rX2RlY2woMiw1KQorI2RlZmluZSBUT0tfTFNISUZUX0FTU0lHTiAgICAgICB0b2tfZGVjbCgyLDYpCisjZGVmaW5lIFRPS19SU0hJRlRfQVNTSUdOICAgICAgIHRva19kZWNsKDIsNykKKworI2RlZmluZSBUT0tfTVVMX0FTU0lHTiAgICAgICAgICB0b2tfZGVjbCgzLDApCisjZGVmaW5lIFRPS19ESVZfQVNTSUdOICAgICAgICAgIHRva19kZWNsKDMsMSkKKyNkZWZpbmUgVE9LX1JFTV9BU1NJR04gICAgICAgICAgdG9rX2RlY2woMywyKQorCisjZGVmaW5lIGZpeF9hc3NpZ25tZW50X3ByZWMocHJlYykgZG8geyBpZiAocHJlYyA9PSAzKSBwcmVjID0gMjsgfSB3aGlsZSAoMCkKKworLyogVGVybmFyeSBjb25kaXRpb25hbCBvcGVyYXRvciBpcyByaWdodCBhc3NvY2lhdGl2ZSB0b28gKi8KKyNkZWZpbmUgVE9LX0NPTkRJVElPTkFMICAgICAgICAgdG9rX2RlY2woNCwwKQorI2RlZmluZSBUT0tfQ09ORElUSU9OQUxfU0VQICAgICB0b2tfZGVjbCg0LDEpCisKKyNkZWZpbmUgVE9LX09SICAgICAgICAgICAgICAgICAgdG9rX2RlY2woNSwwKQorCisjZGVmaW5lIFRPS19BTkQgICAgICAgICAgICAgICAgIHRva19kZWNsKDYsMCkKKworI2RlZmluZSBUT0tfQk9SICAgICAgICAgICAgICAgICB0b2tfZGVjbCg3LDApCisKKyNkZWZpbmUgVE9LX0JYT1IgICAgICAgICAgICAgICAgdG9rX2RlY2woOCwwKQorCisjZGVmaW5lIFRPS19CQU5EICAgICAgICAgICAgICAgIHRva19kZWNsKDksMCkKKworI2RlZmluZSBUT0tfRVEgICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMCwwKQorI2RlZmluZSBUT0tfTkUgICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMCwxKQorCisjZGVmaW5lIFRPS19MVCAgICAgICAgICAgICAgICAgIHRva19kZWNsKDExLDApCisjZGVmaW5lIFRPS19HVCAgICAgICAgICAgICAgICAgIHRva19kZWNsKDExLDEpCisjZGVmaW5lIFRPS19HRSAgICAgICAgICAgICAgICAgIHRva19kZWNsKDExLDIpCisjZGVmaW5lIFRPS19MRSAgICAgICAgICAgICAgICAgIHRva19kZWNsKDExLDMpCisKKyNkZWZpbmUgVE9LX0xTSElGVCAgICAgICAgICAgICAgdG9rX2RlY2woMTIsMCkKKyNkZWZpbmUgVE9LX1JTSElGVCAgICAgICAgICAgICAgdG9rX2RlY2woMTIsMSkKKworI2RlZmluZSBUT0tfQUREICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMywwKQorI2RlZmluZSBUT0tfU1VCICAgICAgICAgICAgICAgICB0b2tfZGVjbCgxMywxKQorCisjZGVmaW5lIFRPS19NVUwgICAgICAgICAgICAgICAgIHRva19kZWNsKDE0LDApCisjZGVmaW5lIFRPS19ESVYgICAgICAgICAgICAgICAgIHRva19kZWNsKDE0LDEpCisjZGVmaW5lIFRPS19SRU0gICAgICAgICAgICAgICAgIHRva19kZWNsKDE0LDIpCisKKy8qIEV4cG9uZW50IGlzIHJpZ2h0IGFzc29jaWF0aXZlICovCisjZGVmaW5lIFRPS19FWFBPTkVOVCAgICAgICAgICAgIHRva19kZWNsKDE1LDEpCisKKy8qIFVuYXJ5IG9wZXJhdG9ycyAqLworI2RlZmluZSBVTkFSWVBSRUMgICAgICAgICAgICAgICAxNgorI2RlZmluZSBUT0tfQk5PVCAgICAgICAgICAgICAgICB0b2tfZGVjbChVTkFSWVBSRUMsMCkKKyNkZWZpbmUgVE9LX05PVCAgICAgICAgICAgICAgICAgdG9rX2RlY2woVU5BUllQUkVDLDEpCisKKyNkZWZpbmUgVE9LX1VNSU5VUyAgICAgICAgICAgICAgdG9rX2RlY2woVU5BUllQUkVDKzEsMCkKKyNkZWZpbmUgVE9LX1VQTFVTICAgICAgICAgICAgICAgdG9rX2RlY2woVU5BUllQUkVDKzEsMSkKKworI2RlZmluZSBQUkVDX1BSRSAgICAgICAgICAgICAgICAoVU5BUllQUkVDKzIpCisKKyNkZWZpbmUgVE9LX1BSRV9JTkMgICAgICAgICAgICAgdG9rX2RlY2woUFJFQ19QUkUsIDApCisjZGVmaW5lIFRPS19QUkVfREVDICAgICAgICAgICAgIHRva19kZWNsKFBSRUNfUFJFLCAxKQorCisjZGVmaW5lIFBSRUNfUE9TVCAgICAgICAgICAgICAgIChVTkFSWVBSRUMrMykKKworI2RlZmluZSBUT0tfUE9TVF9JTkMgICAgICAgICAgICB0b2tfZGVjbChQUkVDX1BPU1QsIDApCisjZGVmaW5lIFRPS19QT1NUX0RFQyAgICAgICAgICAgIHRva19kZWNsKFBSRUNfUE9TVCwgMSkKKworI2RlZmluZSBTUEVDX1BSRUMgICAgICAgICAgICAgICAoVU5BUllQUkVDKzQpCisKKyNkZWZpbmUgVE9LX05VTSAgICAgICAgICAgICAgICAgdG9rX2RlY2woU1BFQ19QUkVDLCAwKQorI2RlZmluZSBUT0tfUlBBUkVOICAgICAgICAgICAgICB0b2tfZGVjbChTUEVDX1BSRUMsIDEpCisKK3N0YXRpYyBpbnQKK2lzX2Fzc2lnbl9vcChvcGVyYXRvciBvcCkKK3sKKwlvcGVyYXRvciBwcmVjID0gUFJFQyhvcCk7CisJZml4X2Fzc2lnbm1lbnRfcHJlYyhwcmVjKTsKKwlyZXR1cm4gcHJlYyA9PSBQUkVDKFRPS19BU1NJR04pCisJfHwgcHJlYyA9PSBQUkVDX1BSRQorCXx8IHByZWMgPT0gUFJFQ19QT1NUOworfQorCitzdGF0aWMgaW50Citpc19yaWdodF9hc3NvY2lhdGl2ZShvcGVyYXRvciBwcmVjKQoreworCXJldHVybiBwcmVjID09IFBSRUMoVE9LX0FTU0lHTikKKwl8fCBwcmVjID09IFBSRUMoVE9LX0VYUE9ORU5UKQorCXx8IHByZWMgPT0gUFJFQyhUT0tfQ09ORElUSU9OQUwpOworfQorCisKK3R5cGVkZWYgc3RydWN0IHsKKwlhcml0aF90IHZhbDsKKwkvKiBXZSBhY3F1aXJlIHNlY29uZF92YWwgb25seSB3aGVuICJleHByMSA6IGV4cHIyIiBwYXJ0CisJICogb2YgdGVybmFyeSA/OiBvcCBpcyBldmFsdWF0ZWQuCisJICogV2UgdHJlYXQgPzogYXMgdHdvIGJpbmFyeSBvcHM6IChleHByID8gKGV4cHIxIDogZXhwcjIpKS4KKwkgKiAnOicgcHJvZHVjZXMgYSBuZXcgdmFsdWUgd2hpY2ggaGFzIHR3byBwYXJ0cywgdmFsIGFuZCBzZWNvbmRfdmFsOworCSAqIHRoZW4gJz8nIHNlbGVjdHMgb25lIG9mIHRoZW0gYmFzZWQgb24gaXRzIGxlZnQgc2lkZS4KKwkgKi8KKwlhcml0aF90IHNlY29uZF92YWw7CisJY2hhciBzZWNvbmRfdmFsX3ByZXNlbnQ7CisJLyogSWYgTlVMTCB0aGVuIGl0J3MganVzdCBhIG51bWJlciwgZWxzZSBpdCdzIGEgbmFtZWQgdmFyaWFibGUgKi8KKwljaGFyICp2YXI7Cit9IHZhcl9vcl9udW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgcmVtZW1iZXJlZF9uYW1lIHsKKwlzdHJ1Y3QgcmVtZW1iZXJlZF9uYW1lICpuZXh0OworCWNvbnN0IGNoYXIgKnZhcjsKK30gcmVtZW1iZXJlZF9uYW1lOworCisKK3N0YXRpYyBhcml0aF90IEZBU1RfRlVOQworZXZhbHVhdGVfc3RyaW5nKGFyaXRoX3N0YXRlX3QgKm1hdGhfc3RhdGUsIGNvbnN0IGNoYXIgKmV4cHIpOworCitzdGF0aWMgY29uc3QgY2hhcioKK2FyaXRoX2xvb2t1cF92YWwoYXJpdGhfc3RhdGVfdCAqbWF0aF9zdGF0ZSwgdmFyX29yX251bV90ICp0KQoreworCWlmICh0LT52YXIpIHsKKwkJY29uc3QgY2hhciAqcCA9IGxvb2t1cHZhcih0LT52YXIpOworCQlpZiAocCkgeworCQkJcmVtZW1iZXJlZF9uYW1lICpjdXI7CisJCQlyZW1lbWJlcmVkX25hbWUgY3VyX3NhdmU7CisKKwkJCS8qIGRpZCB3ZSBhbHJlYWR5IHNlZSB0aGlzIG5hbWU/CisJCQkgKiB0ZXN0Y2FzZTogYT1iOyBiPWE7IGVjaG8gJCgoYSkpCisJCQkgKi8KKwkJCWZvciAoY3VyID0gbWF0aF9zdGF0ZS0+bGlzdF9vZl9yZWN1cnNlZF9uYW1lczsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJCQlpZiAoc3RyY21wKGN1ci0+dmFyLCB0LT52YXIpID09IDApIHsKKwkJCQkJLyogWWVzICovCisJCQkJCXJldHVybiAiZXhwcmVzc2lvbiByZWN1cnNpb24gbG9vcCBkZXRlY3RlZCI7CisJCQkJfQorCQkJfQorCisJCQkvKiBwdXNoIGN1cnJlbnQgdmFyIG5hbWUgKi8KKwkJCWN1ciA9IG1hdGhfc3RhdGUtPmxpc3Rfb2ZfcmVjdXJzZWRfbmFtZXM7CisJCQljdXJfc2F2ZS52YXIgPSB0LT52YXI7CisJCQljdXJfc2F2ZS5uZXh0ID0gY3VyOworCQkJbWF0aF9zdGF0ZS0+bGlzdF9vZl9yZWN1cnNlZF9uYW1lcyA9ICZjdXJfc2F2ZTsKKworCQkJLyogcmVjdXJzaXZlbHkgZXZhbHVhdGUgcCBhcyBleHByZXNzaW9uICovCisJCQl0LT52YWwgPSBldmFsdWF0ZV9zdHJpbmcobWF0aF9zdGF0ZSwgcCk7CisKKwkJCS8qIHBvcCBjdXJyZW50IHZhciBuYW1lICovCisJCQltYXRoX3N0YXRlLT5saXN0X29mX3JlY3Vyc2VkX25hbWVzID0gY3VyOworCisJCQlyZXR1cm4gbWF0aF9zdGF0ZS0+ZXJybXNnOworCQl9CisJCS8qIHRyZWF0IHVuZGVmaW5lZCB2YXIgYXMgMCAqLworCQl0LT52YWwgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogIkFwcGx5aW5nIiBhIHRva2VuIG1lYW5zIHBlcmZvcm1pbmcgaXQgb24gdGhlIHRvcCBlbGVtZW50cyBvbiB0aGUgaW50ZWdlcgorICogc3RhY2suIEZvciBhbiB1bmFyeSBvcGVyYXRvciBpdCB3aWxsIG9ubHkgY2hhbmdlIHRoZSB0b3AgZWxlbWVudCwgYnV0IGEKKyAqIGJpbmFyeSBvcGVyYXRvciB3aWxsIHBvcCB0d28gYXJndW1lbnRzIGFuZCBwdXNoIHRoZSByZXN1bHQgKi8KK3N0YXRpYyBOT0lOTElORSBjb25zdCBjaGFyKgorYXJpdGhfYXBwbHkoYXJpdGhfc3RhdGVfdCAqbWF0aF9zdGF0ZSwgb3BlcmF0b3Igb3AsIHZhcl9vcl9udW1fdCAqbnVtc3RhY2ssIHZhcl9vcl9udW1fdCAqKm51bXN0YWNrcHRyKQoreworI2RlZmluZSBOVU1QVFIgKCpudW1zdGFja3B0cikKKworCXZhcl9vcl9udW1fdCAqdG9wX29mX3N0YWNrOworCWFyaXRoX3QgcmV6OworCWNvbnN0IGNoYXIgKmVycjsKKworCS8qIFRoZXJlIGlzIG5vIG9wZXJhdG9yIHRoYXQgY2FuIHdvcmsgd2l0aG91dCBhcmd1bWVudHMgKi8KKwlpZiAoTlVNUFRSID09IG51bXN0YWNrKQorCQlnb3RvIGVycjsKKworCXRvcF9vZl9zdGFjayA9IE5VTVBUUiAtIDE7CisKKwkvKiBSZXNvbHZlIG5hbWUgdG8gdmFsdWUsIGlmIG5lZWRlZCAqLworCWVyciA9IGFyaXRoX2xvb2t1cF92YWwobWF0aF9zdGF0ZSwgdG9wX29mX3N0YWNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV6ID0gdG9wX29mX3N0YWNrLT52YWw7CisJaWYgKG9wID09IFRPS19VTUlOVVMpCisJCXJleiA9IC1yZXo7CisJZWxzZSBpZiAob3AgPT0gVE9LX05PVCkKKwkJcmV6ID0gIXJlejsKKwllbHNlIGlmIChvcCA9PSBUT0tfQk5PVCkKKwkJcmV6ID0gfnJlejsKKwllbHNlIGlmIChvcCA9PSBUT0tfUE9TVF9JTkMgfHwgb3AgPT0gVE9LX1BSRV9JTkMpCisJCXJleisrOworCWVsc2UgaWYgKG9wID09IFRPS19QT1NUX0RFQyB8fCBvcCA9PSBUT0tfUFJFX0RFQykKKwkJcmV6LS07CisJZWxzZSBpZiAob3AgIT0gVE9LX1VQTFVTKSB7CisJCS8qIEJpbmFyeSBvcGVyYXRvcnMgKi8KKwkJYXJpdGhfdCByaWdodF9zaWRlX3ZhbDsKKwkJY2hhciBiYWRfc2Vjb25kX3ZhbDsKKworCQkvKiBCaW5hcnkgb3BlcmF0b3JzIG5lZWQgdHdvIGFyZ3VtZW50cyAqLworCQlpZiAodG9wX29mX3N0YWNrID09IG51bXN0YWNrKQorCQkJZ290byBlcnI7CisJCS8qIC4uLmFuZCB0aGV5IHBvcCBvbmUgKi8KKwkJTlVNUFRSID0gdG9wX29mX3N0YWNrOyAvKiB0aGlzIGRlY3JlbWVudHMgTlVNUFRSICovCisKKwkJYmFkX3NlY29uZF92YWwgPSB0b3Bfb2Zfc3RhY2stPnNlY29uZF92YWxfcHJlc2VudDsKKwkJaWYgKG9wID09IFRPS19DT05ESVRJT05BTCkgeyAvKiA/IG9wZXJhdGlvbiAqLworCQkJLyogTWFrZSBuZXh0IGlmICguLi4pIHByb3RlY3QgYWdhaW5zdAorCQkJICogJCgoZXhwcjEgPyBleHByMikpIC0gdGhhdCBpcywgbWlzc2luZyAiOiBleHByIiAqLworCQkJYmFkX3NlY29uZF92YWwgPSAhYmFkX3NlY29uZF92YWw7CisJCX0KKwkJaWYgKGJhZF9zZWNvbmRfdmFsKSB7CisJCQkvKiBQcm90ZWN0IGFnYWluc3QgJCgoZXhwciA8bm90Xz9fb3A+IGV4cHIxIDogZXhwcjIpKSAqLworCQkJcmV0dXJuICJtYWxmb3JtZWQgPzogb3BlcmF0b3IiOworCQl9CisKKwkJdG9wX29mX3N0YWNrLS07IC8qIG5vdyBwb2ludHMgdG8gbGVmdCBzaWRlICovCisKKwkJaWYgKG9wICE9IFRPS19BU1NJR04pIHsKKwkJCS8qIFJlc29sdmUgbGVmdCBzaWRlIHZhbHVlICh1bmxlc3MgdGhlIG9wIGlzICc9JykgKi8KKwkJCWVyciA9IGFyaXRoX2xvb2t1cF92YWwobWF0aF9zdGF0ZSwgdG9wX29mX3N0YWNrKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXJpZ2h0X3NpZGVfdmFsID0gcmV6OworCQlyZXogPSB0b3Bfb2Zfc3RhY2stPnZhbDsKKwkJaWYgKG9wID09IFRPS19DT05ESVRJT05BTCkgLyogPyBvcGVyYXRpb24gKi8KKwkJCXJleiA9IChyZXogPyByaWdodF9zaWRlX3ZhbCA6IHRvcF9vZl9zdGFja1sxXS5zZWNvbmRfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0NPTkRJVElPTkFMX1NFUCkgeyAvKiA6IG9wZXJhdGlvbiAqLworCQkJaWYgKHRvcF9vZl9zdGFjayA9PSBudW1zdGFjaykgeworCQkJCS8qIFByb3RlY3QgYWdhaW5zdCAkKChleHByIDogZXhwcikpICovCisJCQkJcmV0dXJuICJtYWxmb3JtZWQgPzogb3BlcmF0b3IiOworCQkJfQorCQkJdG9wX29mX3N0YWNrLT5zZWNvbmRfdmFsX3ByZXNlbnQgPSBvcDsKKwkJCXRvcF9vZl9zdGFjay0+c2Vjb25kX3ZhbCA9IHJpZ2h0X3NpZGVfdmFsOworCQl9CisJCWVsc2UgaWYgKG9wID09IFRPS19CT1IgfHwgb3AgPT0gVE9LX09SX0FTU0lHTikKKwkJCXJleiB8PSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX09SKQorCQkJcmV6ID0gcmlnaHRfc2lkZV92YWwgfHwgcmV6OworCQllbHNlIGlmIChvcCA9PSBUT0tfQkFORCB8fCBvcCA9PSBUT0tfQU5EX0FTU0lHTikKKwkJCXJleiAmPSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0JYT1IgfHwgb3AgPT0gVE9LX1hPUl9BU1NJR04pCisJCQlyZXogXj0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19BTkQpCisJCQlyZXogPSByZXogJiYgcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19FUSkKKwkJCXJleiA9IChyZXogPT0gcmlnaHRfc2lkZV92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfTkUpCisJCQlyZXogPSAocmV6ICE9IHJpZ2h0X3NpZGVfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0dFKQorCQkJcmV6ID0gKHJleiA+PSByaWdodF9zaWRlX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19SU0hJRlQgfHwgb3AgPT0gVE9LX1JTSElGVF9BU1NJR04pCisJCQlyZXogPj49IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfTFNISUZUIHx8IG9wID09IFRPS19MU0hJRlRfQVNTSUdOKQorCQkJcmV6IDw8PSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0dUKQorCQkJcmV6ID0gKHJleiA+IHJpZ2h0X3NpZGVfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0xUKQorCQkJcmV6ID0gKHJleiA8IHJpZ2h0X3NpZGVfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0xFKQorCQkJcmV6ID0gKHJleiA8PSByaWdodF9zaWRlX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19NVUwgfHwgb3AgPT0gVE9LX01VTF9BU1NJR04pCisJCQlyZXogKj0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19BREQgfHwgb3AgPT0gVE9LX1BMVVNfQVNTSUdOKQorCQkJcmV6ICs9IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfU1VCIHx8IG9wID09IFRPS19NSU5VU19BU1NJR04pCisJCQlyZXogLT0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19BU1NJR04gfHwgb3AgPT0gVE9LX0NPTU1BKQorCQkJcmV6ID0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19FWFBPTkVOVCkgeworCQkJYXJpdGhfdCBjOworCQkJaWYgKHJpZ2h0X3NpZGVfdmFsIDwgMCkKKwkJCQlyZXR1cm4gImV4cG9uZW50IGxlc3MgdGhhbiAwIjsKKwkJCWMgPSAxOworCQkJd2hpbGUgKC0tcmlnaHRfc2lkZV92YWwgPj0gMCkKKwkJCSAgICBjICo9IHJlejsKKwkJCXJleiA9IGM7CisJCX0KKwkJZWxzZSBpZiAocmlnaHRfc2lkZV92YWwgPT0gMCkKKwkJCXJldHVybiAiZGl2aWRlIGJ5IHplcm8iOworCQllbHNlIGlmIChvcCA9PSBUT0tfRElWIHx8IG9wID09IFRPS19ESVZfQVNTSUdOKQorCQkJcmV6IC89IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfUkVNIHx8IG9wID09IFRPS19SRU1fQVNTSUdOKQorCQkJcmV6ICU9IHJpZ2h0X3NpZGVfdmFsOworCX0KKworCWlmIChpc19hc3NpZ25fb3Aob3ApKSB7CisJCWNoYXIgYnVmW3NpemVvZihhcml0aF90KSozICsgMl07CisKKwkJaWYgKHRvcF9vZl9zdGFjay0+dmFyID09IE5VTEwpIHsKKwkJCS8qIEhtbSwgMT0yID8gKi8KKy8vVE9ETzogYWN0dWFsbHksIGJhc2ggYWxsb3dzICsrNyBidXQgZm9yIHNvbWUgcmVhc29uIGl0IGV2YWxzIHRvIDcsIG5vdCA4CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBTYXZlIHRvIHNoZWxsIHZhcmlhYmxlICovCisJCXNwcmludGYoYnVmLCBBUklUSF9GTVQsIHJleik7CisJCXNldHZhcih0b3Bfb2Zfc3RhY2stPnZhciwgYnVmKTsKKwkJLyogQWZ0ZXIgc2F2aW5nLCBtYWtlIHByZXZpb3VzIHZhbHVlIGZvciB2Kysgb3Igdi0tICovCisJCWlmIChvcCA9PSBUT0tfUE9TVF9JTkMpCisJCQlyZXotLTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX1BPU1RfREVDKQorCQkJcmV6Kys7CisJfQorCisJdG9wX29mX3N0YWNrLT52YWwgPSByZXo7CisJLyogRXJhc2UgdmFyIG5hbWUsIGl0IGlzIGp1c3QgYSBudW1iZXIgbm93ICovCisJdG9wX29mX3N0YWNrLT52YXIgPSBOVUxMOworCXJldHVybiBOVUxMOworIGVycjoKKwlyZXR1cm4gImFyaXRobWV0aWMgc3ludGF4IGVycm9yIjsKKyN1bmRlZiBOVU1QVFIKK30KKworLyogbG9uZ2VzdCBtdXN0IGJlIGZpcnN0ICovCitzdGF0aWMgY29uc3QgY2hhciBvcF90b2tlbnNbXSBBTElHTjEgPSB7CisJJzwnLCc8JywnPScsMCwgVE9LX0xTSElGVF9BU1NJR04sCisJJz4nLCc+JywnPScsMCwgVE9LX1JTSElGVF9BU1NJR04sCisJJzwnLCc8JywgICAgMCwgVE9LX0xTSElGVCwKKwknPicsJz4nLCAgICAwLCBUT0tfUlNISUZULAorCSd8JywnfCcsICAgIDAsIFRPS19PUiwKKwknJicsJyYnLCAgICAwLCBUT0tfQU5ELAorCSchJywnPScsICAgIDAsIFRPS19ORSwKKwknPCcsJz0nLCAgICAwLCBUT0tfTEUsCisJJz4nLCc9JywgICAgMCwgVE9LX0dFLAorCSc9JywnPScsICAgIDAsIFRPS19FUSwKKwknfCcsJz0nLCAgICAwLCBUT0tfT1JfQVNTSUdOLAorCScmJywnPScsICAgIDAsIFRPS19BTkRfQVNTSUdOLAorCScqJywnPScsICAgIDAsIFRPS19NVUxfQVNTSUdOLAorCScvJywnPScsICAgIDAsIFRPS19ESVZfQVNTSUdOLAorCSclJywnPScsICAgIDAsIFRPS19SRU1fQVNTSUdOLAorCScrJywnPScsICAgIDAsIFRPS19QTFVTX0FTU0lHTiwKKwknLScsJz0nLCAgICAwLCBUT0tfTUlOVVNfQVNTSUdOLAorCSctJywnLScsICAgIDAsIFRPS19QT1NUX0RFQywKKwknXicsJz0nLCAgICAwLCBUT0tfWE9SX0FTU0lHTiwKKwknKycsJysnLCAgICAwLCBUT0tfUE9TVF9JTkMsCisJJyonLCcqJywgICAgMCwgVE9LX0VYUE9ORU5ULAorCSchJywgICAgICAgIDAsIFRPS19OT1QsCisJJzwnLCAgICAgICAgMCwgVE9LX0xULAorCSc+JywgICAgICAgIDAsIFRPS19HVCwKKwknPScsICAgICAgICAwLCBUT0tfQVNTSUdOLAorCSd8JywgICAgICAgIDAsIFRPS19CT1IsCisJJyYnLCAgICAgICAgMCwgVE9LX0JBTkQsCisJJyonLCAgICAgICAgMCwgVE9LX01VTCwKKwknLycsICAgICAgICAwLCBUT0tfRElWLAorCSclJywgICAgICAgIDAsIFRPS19SRU0sCisJJysnLCAgICAgICAgMCwgVE9LX0FERCwKKwknLScsICAgICAgICAwLCBUT0tfU1VCLAorCSdeJywgICAgICAgIDAsIFRPS19CWE9SLAorCS8qIHVuaXEgKi8KKwknficsICAgICAgICAwLCBUT0tfQk5PVCwKKwknLCcsICAgICAgICAwLCBUT0tfQ09NTUEsCisJJz8nLCAgICAgICAgMCwgVE9LX0NPTkRJVElPTkFMLAorCSc6JywgICAgICAgIDAsIFRPS19DT05ESVRJT05BTF9TRVAsCisJJyknLCAgICAgICAgMCwgVE9LX1JQQVJFTiwKKwknKCcsICAgICAgICAwLCBUT0tfTFBBUkVOLAorCTAKK307CisjZGVmaW5lIHB0cl90b19ycGFyZW4gKCZvcF90b2tlbnNbc2l6ZW9mKG9wX3Rva2VucyktN10pCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQworZW5kb2ZuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFpc19uYW1lKCpuYW1lKSkKKwkJcmV0dXJuIG5hbWU7CisJd2hpbGUgKCorK25hbWUpIHsKKwkJaWYgKCFpc19pbl9uYW1lKCpuYW1lKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGFyaXRoX3QgRkFTVF9GVU5DCitldmFsdWF0ZV9zdHJpbmcoYXJpdGhfc3RhdGVfdCAqbWF0aF9zdGF0ZSwgY29uc3QgY2hhciAqZXhwcikKK3sKKwlvcGVyYXRvciBsYXN0dG9rOworCWNvbnN0IGNoYXIgKmVycm1zZzsKKwljb25zdCBjaGFyICpzdGFydF9leHByID0gZXhwciA9IHNraXBfd2hpdGVzcGFjZShleHByKTsKKwl1bnNpZ25lZCBleHByX2xlbiA9IHN0cmxlbihleHByKSArIDI7CisJLyogU3RhY2sgb2YgaW50ZWdlcnMgKi8KKwkvKiBUaGUgcHJvb2YgdGhhdCB0aGVyZSBjYW4gYmUgbm8gbW9yZSB0aGFuIHN0cmxlbihzdGFydGJ1ZikvMisxCisJICogaW50ZWdlcnMgaW4gYW55IGdpdmVuIGNvcnJlY3Qgb3IgaW5jb3JyZWN0IGV4cHJlc3Npb24KKwkgKiBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIuICovCisJdmFyX29yX251bV90ICpjb25zdCBudW1zdGFjayA9IGFsbG9jYSgoZXhwcl9sZW4gLyAyKSAqIHNpemVvZihudW1zdGFja1swXSkpOworCXZhcl9vcl9udW1fdCAqbnVtc3RhY2twdHIgPSBudW1zdGFjazsKKwkvKiBTdGFjayBvZiBvcGVyYXRvciB0b2tlbnMgKi8KKwlvcGVyYXRvciAqY29uc3Qgc3RhY2sgPSBhbGxvY2EoZXhwcl9sZW4gKiBzaXplb2Yoc3RhY2tbMF0pKTsKKwlvcGVyYXRvciAqc3RhY2twdHIgPSBzdGFjazsKKworCS8qIFN0YXJ0IHdpdGggYSBsZWZ0IHBhcmVuICovCisJKnN0YWNrcHRyKysgPSBsYXN0dG9rID0gVE9LX0xQQVJFTjsKKwllcnJtc2cgPSBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJb3BlcmF0b3Igb3A7CisJCW9wZXJhdG9yIHByZWM7CisJCWNoYXIgYXJpdGh2YWw7CisKKwkJZXhwciA9IHNraXBfd2hpdGVzcGFjZShleHByKTsKKwkJYXJpdGh2YWwgPSAqZXhwcjsKKwkJaWYgKGFyaXRodmFsID09ICdcMCcpIHsKKwkJCWlmIChleHByID09IHN0YXJ0X2V4cHIpIHsKKwkJCQkvKiBOdWxsIGV4cHJlc3Npb24gKi8KKwkJCQludW1zdGFjay0+dmFsID0gMDsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKworCQkJLyogVGhpcyBpcyBvbmx5IHJlYWNoZWQgYWZ0ZXIgYWxsIHRva2VucyBoYXZlIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlCisJCQkgKiBpbnB1dCBzdHJlYW0uIElmIHRoZXJlIGFyZSBzdGlsbCB0b2tlbnMgb24gdGhlIG9wZXJhdG9yIHN0YWNrLCB0aGV5CisJCQkgKiBhcmUgdG8gYmUgYXBwbGllZCBpbiBvcmRlci4gQXQgdGhlIGVuZCwgdGhlcmUgc2hvdWxkIGJlIGEgZmluYWwKKwkJCSAqIHJlc3VsdCBvbiB0aGUgaW50ZWdlciBzdGFjayAqLworCisJCQlpZiAoZXhwciAhPSBwdHJfdG9fcnBhcmVuICsgMSkgeworCQkJCS8qIElmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LAorCQkJCSAqIGFwcGVuZCBhIGNsb3NpbmcgcmlnaHQgcGFyZW4KKwkJCQkgKiBhbmQgbGV0IHRoZSBsb29wIHByb2Nlc3MgaXQgKi8KKwkJCQlleHByID0gcHRyX3RvX3JwYXJlbjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIEF0IHRoaXMgcG9pbnQsIHdlJ3JlIGRvbmUgd2l0aCB0aGUgZXhwcmVzc2lvbiAqLworCQkJaWYgKG51bXN0YWNrcHRyICE9IG51bXN0YWNrICsgMSkgeworCQkJCS8qIC4uLmJ1dCBpZiB0aGVyZSBpc24ndCwgaXQncyBiYWQgKi8KKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWlmIChudW1zdGFjay0+dmFyKSB7CisJCQkJLyogZXhwcmVzc2lvbiBpcyAkKCh2YXIpKSBvbmx5LCBsb29rdXAgbm93ICovCisJCQkJZXJybXNnID0gYXJpdGhfbG9va3VwX3ZhbChtYXRoX3N0YXRlLCBudW1zdGFjayk7CisJCQl9CisJCQlnb3RvIHJldDsKKwkJfQorCisJCXAgPSBlbmRvZm5hbWUoZXhwcik7CisJCWlmIChwICE9IGV4cHIpIHsKKwkJCS8qIE5hbWUgKi8KKwkJCXNpemVfdCB2YXJfbmFtZV9zaXplID0gKHAtZXhwcikgKyAxOyAgLyogKzEgZm9yIE5VTCAqLworCQkJbnVtc3RhY2twdHItPnZhciA9IGFsbG9jYSh2YXJfbmFtZV9zaXplKTsKKwkJCXNhZmVfc3RybmNweShudW1zdGFja3B0ci0+dmFyLCBleHByLCB2YXJfbmFtZV9zaXplKTsKKwkJCWV4cHIgPSBwOworIG51bToKKwkJCW51bXN0YWNrcHRyLT5zZWNvbmRfdmFsX3ByZXNlbnQgPSAwOworCQkJbnVtc3RhY2twdHIrKzsKKwkJCWxhc3R0b2sgPSBUT0tfTlVNOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNkaWdpdChhcml0aHZhbCkpIHsKKwkJCS8qIE51bWJlciAqLworCQkJbnVtc3RhY2twdHItPnZhciA9IE5VTEw7CisJCQllcnJubyA9IDA7CisJCQludW1zdGFja3B0ci0+dmFsID0gc3RydG9fYXJpdGhfdChleHByLCAoY2hhcioqKSAmZXhwciwgMCk7CisJCQlpZiAoZXJybm8pCisJCQkJbnVtc3RhY2twdHItPnZhbCA9IDA7IC8qIGJhc2ggY29tcGF0ICovCisJCQlnb3RvIG51bTsKKwkJfQorCisJCS8qIFNob3VsZCBiZSBhbiBvcGVyYXRvciAqLworCQlwID0gb3BfdG9rZW5zOworCQl3aGlsZSAoMSkgeworLy8gVE9ETzogYmFzaCBhbGxvd3MgNysrK3YsIHRyZWF0cyBpdCBhcyA3ICsgKyt2CisvLyB3ZSB0cmVhdCBpdCBhcyA3KysgKyB2IGFuZCByZWplY3QKKwkJCS8qIENvbXBhcmUgZXhwciB0byBjdXJyZW50IG9wX3Rva2Vuc1tdIGVsZW1lbnQgKi8KKwkJCWNvbnN0IGNoYXIgKmUgPSBleHByOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoKnAgPT0gJ1wwJykgeworCQkJCQkvKiBNYXRjaDogb3BlcmF0b3IgaXMgZm91bmQgKi8KKwkJCQkJZXhwciA9IGU7CisJCQkJCWdvdG8gdG9rX2ZvdW5kOworCQkJCX0KKwkJCQlpZiAoKnAgIT0gKmUpCisJCQkJCWJyZWFrOworCQkJCXArKzsKKwkJCQllKys7CisJCQl9CisJCQkvKiBObyBtYXRjaCwgZ28gdG8gbmV4dCBlbGVtZW50IG9mIG9wX3Rva2Vuc1tdICovCisJCQl3aGlsZSAoKnApCisJCQkJcCsrOworCQkJcCArPSAyOyAvKiBza2lwIE5VTCBhbmQgVE9LX2ZvbyBieXRlcyAqLworCQkJaWYgKCpwID09ICdcMCcpIHsKKwkJCQkvKiBObyBuZXh0IGVsZW1lbnQsIG9wZXJhdG9yIG5vdCBmb3VuZCAqLworCQkJCS8vbWF0aF9zdGF0ZS0+c3ludGF4X2Vycm9yX2F0ID0gZXhwcjsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorIHRva19mb3VuZDoKKwkJb3AgPSBwWzFdOyAvKiBmZXRjaCBUT0tfZm9vIHZhbHVlICovCisJCS8qIE5COiBleHByIG5vdyBwb2ludHMgcGFzdCB0aGUgb3BlcmF0b3IgKi8KKworCQkvKiBwb3N0IGdyYW1tYXI6IGErKyByZWR1Y2UgdG8gbnVtICovCisJCWlmIChsYXN0dG9rID09IFRPS19QT1NUX0lOQyB8fCBsYXN0dG9rID09IFRPS19QT1NUX0RFQykKKwkJCWxhc3R0b2sgPSBUT0tfTlVNOworCisJCS8qIFBsdXMgYW5kIG1pbnVzIGFyZSBiaW5hcnkgKG5vdCB1bmFyeSkgX29ubHlfIGlmIHRoZSBsYXN0CisJCSAqIHRva2VuIHdhcyBhIG51bWJlciwgb3IgYSByaWdodCBwYXJlbiAod2hpY2ggcHJldGVuZHMgdG8gYmUKKwkJICogYSBudW1iZXIsIHNpbmNlIGl0IGV2YWx1YXRlcyB0byBvbmUpLiBUaGluayBhYm91dCBpdC4KKwkJICogSXQgbWFrZXMgc2Vuc2UuICovCisJCWlmIChsYXN0dG9rICE9IFRPS19OVU0pIHsKKwkJCXN3aXRjaCAob3ApIHsKKwkJCWNhc2UgVE9LX0FERDoKKwkJCQlvcCA9IFRPS19VUExVUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE9LX1NVQjoKKwkJCQlvcCA9IFRPS19VTUlOVVM7CisJCQkJYnJlYWs7CisJCQljYXNlIFRPS19QT1NUX0lOQzoKKwkJCQlvcCA9IFRPS19QUkVfSU5DOworCQkJCWJyZWFrOworCQkJY2FzZSBUT0tfUE9TVF9ERUM6CisJCQkJb3AgPSBUT0tfUFJFX0RFQzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBXZSBkb24ndCB3YW50IGFuIHVuYXJ5IG9wZXJhdG9yIHRvIGNhdXNlIHJlY3Vyc2l2ZSBkZXNjZW50IG9uIHRoZQorCQkgKiBzdGFjaywgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSBpbiBhIHJvdyBhbmQgaXQgY291bGQgY2F1c2UgYW4KKwkJICogb3BlcmF0b3IgdG8gYmUgZXZhbHVhdGVkIGJlZm9yZSBpdHMgYXJndW1lbnQgaXMgcHVzaGVkIG9udG8gdGhlCisJCSAqIGludGVnZXIgc3RhY2suCisJCSAqIEJ1dCBmb3IgYmluYXJ5IG9wZXJhdG9ycywgImFwcGx5IiBldmVyeXRoaW5nIG9uIHRoZSBvcGVyYXRvcgorCQkgKiBzdGFjayB1bnRpbCB3ZSBmaW5kIGFuIG9wZXJhdG9yIHdpdGggYSBsZXNzZXIgcHJpb3JpdHkgdGhhbiB0aGUKKwkJICogb25lIHdlIGhhdmUganVzdCBleHRyYWN0ZWQuIElmIG9wIGlzIHJpZ2h0LWFzc29jaWF0aXZlLAorCQkgKiB0aGVuIHN0b3AgImFwcGx5aW5nIiBvbiB0aGUgZXF1YWwgcHJpb3JpdHkgdG9vLgorCQkgKiBMZWZ0IHBhcmVuIGlzIGdpdmVuIHRoZSBsb3dlc3QgcHJpb3JpdHkgc28gaXQgd2lsbCBuZXZlciBiZQorCQkgKiAiYXBwbGllZCIgaW4gdGhpcyB3YXkuCisJCSAqLworCQlwcmVjID0gUFJFQyhvcCk7CisJCWlmICgocHJlYyA+IDAgJiYgcHJlYyA8IFVOQVJZUFJFQykgfHwgcHJlYyA9PSBTUEVDX1BSRUMpIHsKKwkJCS8qIG5vdCBsZWZ0IHBhcmVuIG9yIHVuYXJ5ICovCisJCQlpZiAobGFzdHRvayAhPSBUT0tfTlVNKSB7CisJCQkJLyogYmluYXJ5IG9wIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBudW0gKi8KKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXdoaWxlIChzdGFja3B0ciAhPSBzdGFjaykgeworCQkJCW9wZXJhdG9yIHByZXZfb3AgPSAqLS1zdGFja3B0cjsKKwkJCQlpZiAob3AgPT0gVE9LX1JQQVJFTikgeworCQkJCQkvKiBUaGUgYWxnb3JpdGhtIGVtcGxveWVkIGhlcmUgaXMgc2ltcGxlOiB3aGlsZSB3ZSBkb24ndAorCQkJCQkgKiBoaXQgYW4gb3BlbiBwYXJlbiBub3IgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssIHBvcAorCQkJCQkgKiB0b2tlbnMgYW5kIGFwcGx5IHRoZW0gKi8KKwkJCQkJaWYgKHByZXZfb3AgPT0gVE9LX0xQQVJFTikgeworCQkJCQkJLyogQW55IG9wZXJhdG9yIGRpcmVjdGx5IGFmdGVyIGEKKwkJCQkJCSAqIGNsb3NlIHBhcmVuIHNob3VsZCBjb25zaWRlciBpdHNlbGYgYmluYXJ5ICovCisJCQkJCQlsYXN0dG9rID0gVE9LX05VTTsKKwkJCQkJCWdvdG8gbmV4dDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW9wZXJhdG9yIHByZXZfcHJlYyA9IFBSRUMocHJldl9vcCk7CisJCQkJCWZpeF9hc3NpZ25tZW50X3ByZWMocHJlYyk7CisJCQkJCWZpeF9hc3NpZ25tZW50X3ByZWMocHJldl9wcmVjKTsKKwkJCQkJaWYgKHByZXZfcHJlYyA8IHByZWMKKwkJCQkJIHx8IChwcmV2X3ByZWMgPT0gcHJlYyAmJiBpc19yaWdodF9hc3NvY2lhdGl2ZShwcmVjKSkKKwkJCQkJKSB7CisJCQkJCQlzdGFja3B0cisrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJZXJybXNnID0gYXJpdGhfYXBwbHkobWF0aF9zdGF0ZSwgcHJldl9vcCwgbnVtc3RhY2ssICZudW1zdGFja3B0cik7CisJCQkJaWYgKGVycm1zZykKKwkJCQkJZ290byBlcnJfd2l0aF9jdXN0b21fbXNnOworCQkJfQorCQkJaWYgKG9wID09IFRPS19SUEFSRU4pCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBQdXNoIHRoaXMgb3BlcmF0b3IgdG8gdGhlIHN0YWNrIGFuZCByZW1lbWJlciBpdCAqLworCQkqc3RhY2twdHIrKyA9IGxhc3R0b2sgPSBvcDsKKyBuZXh0OiA7CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIGVycjoKKwllcnJtc2cgPSAiYXJpdGhtZXRpYyBzeW50YXggZXJyb3IiOworIGVycl93aXRoX2N1c3RvbV9tc2c6CisJbnVtc3RhY2stPnZhbCA9IC0xOworIHJldDoKKwltYXRoX3N0YXRlLT5lcnJtc2cgPSBlcnJtc2c7CisJcmV0dXJuIG51bXN0YWNrLT52YWw7Cit9CisKK2FyaXRoX3QgRkFTVF9GVU5DCithcml0aChhcml0aF9zdGF0ZV90ICptYXRoX3N0YXRlLCBjb25zdCBjaGFyICpleHByKQoreworCW1hdGhfc3RhdGUtPmVycm1zZyA9IE5VTEw7CisJbWF0aF9zdGF0ZS0+bGlzdF9vZl9yZWN1cnNlZF9uYW1lcyA9IE5VTEw7CisJcmV0dXJuIGV2YWx1YXRlX3N0cmluZyhtYXRoX3N0YXRlLCBleHByKTsKK30KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvc2hlbGwvbWF0aC5oIGIvc2hlbGwvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzA1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tYXRoLmgKQEAgLTAsMCArMSw5NyBAQAorLyogbWF0aC5oIC0gaW50ZXJmYWNlIHRvIHNoZWxsIG1hdGggImxpYnJhcnkiIC0tIHRoaXMgYWxsb3dzIHNoZWxscyB0byBzaGFyZQorICogICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFyaXRobWV0aWMgJCgoLi4uKSkgZXhwYW5zaW9ucy4KKyAqCisgKiBUaGlzIGFpbXMgdG8gYmUgYSBQT1NJWCBzaGVsbCBtYXRoIGxpYnJhcnkgYXMgZG9jdW1lbnRlZCBoZXJlOgorICoJaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjdGFnXzE4XzA2XzA0CisgKgorICogU2VlIG1hdGguYyBmb3IgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyAqLworCisvKiBUaGUgbWF0aCBsaWJyYXJ5IGhhcyBqdXN0IG9uZSBmdW5jdGlvbjoKKyAqCisgKiBhcml0aF90IGFyaXRoKGFyaXRoX3N0YXRlX3QgKnN0YXRlLCBjb25zdCBjaGFyICpleHByKTsKKyAqCisgKiBUaGUgZXhwciBhcmd1bWVudCBpcyB0aGUgbWF0aCBzdHJpbmcgdG8gcGFyc2UuICBBbGwgbm9ybWFsIGV4cGFuc2lvbnMgbXVzdAorICogYmUgZG9uZSBhbHJlYWR5LiAgaS5lLiBubyBkb2xsYXIgc3ltYm9scyBzaG91bGQgYmUgcHJlc2VudC4KKyAqCisgKiBUaGUgc3RhdGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IG9mIGhvb2tzIGZvciB5b3VyIHNoZWxsIChzZWUgYmVsb3cpLAorICogYW5kIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIChOVUxMIGlmIG5vIGVycm9yKS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW5zd2VyIHRvIHRoZSBleHByZXNzaW9uLiAgU28gaWYgeW91IGNhbGxlZCBpdAorICogd2l0aCB0aGUgZXhwcmVzc2lvbjoKKyAqICIxICsgMiArIDMiCisgKiB5b3Ugd291bGQgb2J2aW91c2x5IGdldCBiYWNrIDYuCisgKi8KKworLyogVG8gYWRkIHN1cHBvcnQgdG8gYSBzaGVsbCwgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRocmVlIGZ1bmN0aW9uczoKKyAqCisgKiBsb29rdXB2YXIoKSAtIGxvb2sgdXAgYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZQorICoKKyAqCUlmIHRoZSBzaGVsbCBkb2VzOgorICoJCWZvbz0xMjMKKyAqCVRoZW4gdGhlIGNvZGU6CisgKgkJY29uc3QgY2hhciAqdmFsID0gbG9va3VwdmFyKCJmb28iKTsKKyAqCXdpbGwgcmVzdWx0IGluIHZhbCBwb2ludGluZyB0byAiMTIzIgorICoKKyAqIHNldHZhcigpIC0gc2V0IGEgdmFyaWFibGUgdG8gc29tZSB2YWx1ZQorICoKKyAqCUlmIHRoZSBhcml0aG1ldGljIGV4cGFuc2lvbiBkb2VzIHNvbWV0aGluZyBsaWtlOgorICoJCSQoKCBpID0gMSkpCisgKgl0aGVuIHRoZSBtYXRoIGNvZGUgd2lsbCBtYWtlIGEgY2FsbCBsaWtlIHNvOgorICoJCXNldHZhcigiaSIsICIxIiwgMCk7CisgKglUaGUgc3RvcmFnZSBmb3IgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb2NhdGVkLCBzbyB5b3VyCisgKglzaGVsbCBpbXBsZW1lbnRhdGlvbiB3aWxsIG1vc3QgbGlrZWx5IG5lZWQgdG8gc3RyZHVwKCkgdGhlbSB0byBzYXZlLgorICoKKyAqIGVuZG9mbmFtZSgpIC0gcmV0dXJuIHRoZSBlbmQgb2YgYSB2YXJpYWJsZSBuYW1lIGZyb20gaW5wdXQKKyAqCisgKglUaGUgYXJpdGhtZXRpYyBjb2RlIGRvZXMgbm90IGtub3cgYWJvdXQgdmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zLgorICoJU28gd2hlbiBpdCBpcyBnaXZlbiBhbiBleHBlcmVzc2lvbiwgaXQga25vd3Mgc29tZXRoaW5nIGlzIG5vdCBudW1lcmljLAorICoJYnV0IGl0IGlzIHVwIHRvIHRoZSBzaGVsbCB0byBkaWN0YXRlIHdoYXQgaXMgYSB2YWxpZCBpZGVudGlmaWVycy4KKyAqCVNvIHdoZW4gaXQgZW5jb3VudGVycyBzb21ldGhpbmcgbGlrZToKKyAqCQkkKCggc29tZV92YXIgKyAxMjMgKSkKKyAqCUl0IHdpbGwgbWFrZSBhIGNhbGwgbGlrZSBzbzoKKyAqCQllbmQgPSBlbmRvZm5hbWUoInNvbWVfdmFyICsgMTIzIik7CisgKglTbyB0aGUgc2hlbGwgbmVlZHMgdG8gc2NhbiB0aGUgaW5wdXQgc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQorICoJZmlyc3Qgbm9uLWlkZW50aWZpZXIgc3RyaW5nLiAgSW4gdGhpcyBjYXNlLCBpdCBzaG91bGQgcmV0dXJuIHRoZSBpbnB1dAorICoJcG9pbnRlciB3aXRoIGFuIG9mZnNldCBwb2ludGluZyB0byB0aGUgZmlyc3Qgc3BhY2UuICBUaGUgdHlwaWNhbAorICoJaW1wbGVtZW50YXRpb24gd2lsbCByZXR1cm4gdGhlIG9mZnNldCBvZiBmaXJzdCBjaGFyIHRoYXQgZG9lcyBub3QgbWF0Y2gKKyAqCXRoZSByZWdleCAoaW4gQyBsb2NhbGUpOiBeW2EtekEtWl9dW2EtekEtWl8wLTldKgorICovCisKKyNpZm5kZWYgU0hFTExfTUFUSF9ICisjZGVmaW5lIFNIRUxMX01BVEhfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVF82NAordHlwZWRlZiBsb25nIGxvbmcgYXJpdGhfdDsKKyNkZWZpbmUgQVJJVEhfRk1UICIlbGxkIgorI2RlZmluZSBzdHJ0b19hcml0aF90IHN0cnRvdWxsCisjZWxzZQordHlwZWRlZiBsb25nIGFyaXRoX3Q7CisjZGVmaW5lIEFSSVRIX0ZNVCAiJWxkIgorI2RlZmluZSBzdHJ0b19hcml0aF90IHN0cnRvdWwKKyNlbmRpZgorCisvKiBhc2gncyBhbmQgaHVzaCdzIGVuZG9mbmFtZSBpcyB0aGUgc2FtZSwgc28uLi4gKi8KKyMgZGVmaW5lIGlzX25hbWUoYykgICAgICAoKGMpID09ICdfJyB8fCBpc2FscGhhKCh1bnNpZ25lZCBjaGFyKShjKSkpCisjIGRlZmluZSBpc19pbl9uYW1lKGMpICAgKChjKSA9PSAnXycgfHwgaXNhbG51bSgodW5zaWduZWQgY2hhcikoYykpKQorY29uc3QgY2hhciogRkFTVF9GVU5DIGVuZG9mbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKwordHlwZWRlZiBjb25zdCBjaGFyKiBGQVNUX0ZVTkMgKCphcml0aF92YXJfbG9va3VwX3QpKGNvbnN0IGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkICAgICAgICBGQVNUX0ZVTkMgKCphcml0aF92YXJfc2V0X3QpKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCk7CisvL3R5cGVkZWYgY29uc3QgY2hhciogRkFTVF9GVU5DICgqYXJpdGhfdmFyX2VuZG9mbmFtZV90KShjb25zdCBjaGFyICpuYW1lKTsKKwordHlwZWRlZiBzdHJ1Y3QgYXJpdGhfc3RhdGVfdCB7CisJY29uc3QgY2hhciAgICAgICAgICAgKmVycm1zZzsKKwlhcml0aF92YXJfbG9va3VwX3QgICAgbG9va3VwdmFyOworCWFyaXRoX3Zhcl9zZXRfdCAgICAgICBzZXR2YXI7CisvLwlhcml0aF92YXJfZW5kb2ZuYW1lX3QgZW5kb2ZuYW1lOworCXZvaWQgICAgICAgICAgICAgICAgICpsaXN0X29mX3JlY3Vyc2VkX25hbWVzOworfSBhcml0aF9zdGF0ZV90OworCithcml0aF90IEZBU1RfRlVOQyBhcml0aChhcml0aF9zdGF0ZV90ICpzdGF0ZSwgY29uc3QgY2hhciAqZXhwcik7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvbm9lb2wzLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvbm9lb2wzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Zjg1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9ub2VvbDMucmlnaHQKQEAgLTAsMCArMSBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgIgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvbm9lb2wzLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvbm9lb2wzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjOTU4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9ub2VvbDMudGVzdHMKQEAgLTAsMCArMSwyIEBACisjIGxhc3QgbGluZSBoYXMgbm8gRU9MIQorZWNobyAidW50ZXJtaW5hdGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcHJvY2Vzc19zdWJzdC5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Byb2Nlc3Nfc3Vic3QucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3YmM4MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Byb2Nlc3Nfc3Vic3QucmlnaHQKQEAgLTAsMCArMSwzIEBACitURVNUenpCRVNUCitURVNUJChlY2hvIHp6KUJFU1QKK1RFU1QnQkVTVApkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcHJvY2Vzc19zdWJzdC50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Byb2Nlc3Nfc3Vic3QudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjE5OTZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Byb2Nlc3Nfc3Vic3QudGVzdHMKQEAgLTAsMCArMSwzIEBACitlY2hvICJURVNUYGVjaG8geno7ZWNobztlY2hvYEJFU1QiCitlY2hvICJURVNUYGVjaG8gJyQoZWNobyB6eiknYEJFU1QiCitlY2hvICJURVNUYGVjaG8gIiciYEJFU1QiCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9yZWFkLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcmVhZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTUwZTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcmVhZC5yaWdodApAQCAtMCwwICsxLDQgQEAKK3JlYWQKK2NhdAorZWNobyAiUkVQTFk9JFJFUExZIgorUkVQTFk9ZXhlYyA8cmVhZC50ZXN0cwpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcmVhZC50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3JlYWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmYxYWNiZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3JlYWQudGVzdHMKQEAgLTAsMCArMSw0IEBACitleGVjIDxyZWFkLnRlc3RzCityZWFkCitjYXQKK2VjaG8gIlJFUExZPSRSRVBMWSIKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3NoaWZ0LnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc2hpZnQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4MWUzNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3NoaWZ0LnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorLi9zaGlmdC50ZXN0cyBhYmMgZCBlCisuL3NoaWZ0LnRlc3RzIGQgZSAxMjMKKy4vc2hpZnQudGVzdHMgZCBlIDEyMworLi9zaGlmdC50ZXN0cworLi9zaGlmdC50ZXN0cworLi9zaGlmdC50ZXN0cwpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc2hpZnQudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zaGlmdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41M2VmMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc2hpZnQudGVzdHMKQEAgLTAsMCArMSwxNCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgJDAgYWJjICJkIGUiIDEyMworZmkKK2VjaG8gJDAgJDEgJDIKK3NoaWZ0CitlY2hvICQwICQxICQyCitzaGlmdCA5OTkKK2VjaG8gJDAgJDEgJDIKK3NoaWZ0IDIKK2VjaG8gJDAgJDEgJDIKK3NoaWZ0IDIKK2VjaG8gJDAgJDEgJDIKK3NoaWZ0CitlY2hvICQwICQxICQyCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zdGFycXVvdGVkLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3RhcnF1b3RlZC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYzMjNmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3RhcnF1b3RlZC5yaWdodApAQCAtMCwwICsxLDggQEAKKy4xIGFiYyBkIGUgZi4KKy4xLgorLmFiYy4KKy5kIGUgZi4KKy4tMSBhYmMgZCBlIGYtLgorLi0xLgorLmFiYy4KKy5kIGUgZi0uCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zdGFycXVvdGVkLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3RhcnF1b3RlZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZmU0OWIxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3RhcnF1b3RlZC50ZXN0cwpAQCAtMCwwICsxLDggQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgMSBhYmMgJ2QgZSBmJworZmkKKworZm9yIGEgaW4gIiQqIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2ZvciBhIGluICIkQCI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitmb3IgYSBpbiAiLSQqLSI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitmb3IgYSBpbiAiLSRALSI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zeW50YXhfZXJyLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3ludGF4X2Vyci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGEyNzBjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3ludGF4X2Vyci5yaWdodApAQCAtMCwwICsxLDIgQEAKK3Nob3duCitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAnCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zeW50YXhfZXJyLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3ludGF4X2Vyci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTBlZDQyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc3ludGF4X2Vyci50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gc2hvd24KK2VjaG8gdGVzdCBgZWNobyAnYWFgCitlY2hvIG5vdCBzaG93bgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9hc3NpZ24ucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX2Fzc2lnbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIyMTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9hc3NpZ24ucmlnaHQKQEAgLTAsMCArMSw1IEBACisuIC4KKy5hYmMgZCBlLgorLmFiYyBkIGUuCisuYWJjIGQgZS4KKy5hYmMgZCBlLgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9hc3NpZ24udGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX2Fzc2lnbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOGNkYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9hc3NpZ24udGVzdHMKQEAgLTAsMCArMSwxNSBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhYmMgImQgZSIKK2ZpCisKK3NwYWNlPScgJworZWNobyAuJHNwYWNlLgorCithPSQqCitlY2hvIC4kYS4KK2E9JEAKK2VjaG8gLiRhLgorYT0iJCoiCitlY2hvIC4kYS4KK2E9IiRAIgorZWNobyAuJGEuCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX3JlZGlyLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9yZWRpci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjMyOTljCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9yZWRpci5yaWdodApAQCAtMCwwICsxLDMgQEAKK1RFU1QxCitURVNUMgorVEVTVDMKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fcmVkaXIudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX3JlZGlyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkYTZiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX3JlZGlyLnRlc3RzCkBAIC0wLDAgKzEsMTMgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYWJjICJkIGUiCitmaQorCitlY2hvIFRFU1QxID4iJDEub3V0IgorZWNobyBURVNUMiA+IiQyLm91dCIKKyMgYmFzaCBzYXlzOiAiJEAub3V0IjogYW1iaWd1b3VzIHJlZGlyZWN0CisjIGFzaCBoYW5kbGVzIGl0IGFzIGlmIGl0IGlzICckKicgLSB3ZSBkbyB0aGUgc2FtZQorZWNobyBURVNUMyA+IiRALm91dCIKKworY2F0IGFiYy5vdXQgImQgZS5vdXQiICJhYmMgZCBlLm91dCIKKworcm0gYWJjLm91dCAiZCBlLm91dCIgImFiYyBkIGUub3V0IgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FQUNDRVMucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VBQ0NFUy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU0ODBiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FQUNDRVMucmlnaHQKQEAgLTAsMCArMSwyIEBACisuLzogY2FuJ3QgZXhlY3V0ZQorMTI2CmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VBQ0NFUy50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRUFDQ0VTLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2YjVjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VBQ0NFUy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKy4vCitlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VOT0VOVC5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRU5PRU5ULnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDlkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VOT0VOVC5yaWdodApAQCAtMCwwICsxLDIgQEAKKy4vZG9lc19ub3RfZXhpc3RfZm9yX3N1cmU6IG5vdCBmb3VuZAorMTI3CmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VOT0VOVC50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRU5PRU5ULnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmMWI4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VOT0VOVC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKy4vZG9lc19ub3RfZXhpc3RfZm9yX3N1cmUKK2VjaG8gJD8KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbWFueV9jb250aW51ZXMucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL21hbnlfY29udGludWVzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmJhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL21hbnlfY29udGludWVzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL21hbnlfY29udGludWVzLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9tYW55X2NvbnRpbnVlcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmM3MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9tYW55X2NvbnRpbnVlcy50ZXN0cwpAQCAtMCwwICsxLDE1IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgICMgQ2hpbGQgd2lsbCBraWxsIHVzIGluIDEgc2Vjb25kCisgICAgIiRUSElTX1NIIiAiJDAiICQkICYKKworICAgICMgTG9vcCBtYW55LCBtYW55IHRpbWVzCisgICAgdHJhcCAnZWNobyBPSzsgZXhpdCAwJyAxNQorICAgIHdoaWxlIHRydWU7IGRvCisJY29udGludWUKKyAgICBkb25lCisgICAgZWNobyBCQUQKKyAgICBleGl0IDEKK2ZpCisKK3NsZWVwIDEKK2tpbGwgJDEKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbmVzdGVkX2JyZWFrLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9uZXN0ZWRfYnJlYWsucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4YjZiMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbmVzdGVkX2JyZWFrLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAorQQorQgoraXRlcmF0aW9uCitDCitBCitCCitpdGVyYXRpb24KK0QKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbmVzdGVkX2JyZWFrLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9uZXN0ZWRfYnJlYWsudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE5NTRkMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbmVzdGVkX2JyZWFrLnRlc3RzCkBAIC0wLDAgKzEsMTcgQEAKKyMgVGVzdGNhc2UgZm9yIGh0dHA6Ly9idWdzLmJ1c3lib3gubmV0L3ZpZXcucGhwP2lkPTg0NgorCituPTAKK3doaWxlIDoKK2RvCisJZWNobyBBCisJd2hpbGUgOgorCWRvCisJCWVjaG8gQgorCQlicmVhaworCWRvbmUKKwllY2hvIGl0ZXJhdGlvbgorCVsgJG4gPSAxIF0gJiYgYnJlYWsKKwllY2hvIEMKKwluPWBleHByICRuICsgMWAKK2RvbmUKK2VjaG8gRApkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLW1pc2MvdGljay5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1taXNjL3RpY2sucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMjgxYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1taXNjL3RpY2sucmlnaHQKQEAgLTAsMCArMSwyIEBACisxCisxCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtbWlzYy90aWNrLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLW1pc2MvdGljay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZjc0OWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLW1pc2MvdGljay50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK3RydWUKK2ZhbHNlOyBlY2hvIGBlY2hvICQ/YAordHJ1ZQoreyBmYWxzZTsgZWNobyBgZWNobyAkP2A7IH0KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL2FyZ3YwLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvYXJndjAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YmFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL2FyZ3YwLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9hcmd2MC50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL2FyZ3YwLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1YzQwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9hcmd2MC50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYXJnCitmaQorZWNobyBPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI3OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wucmlnaHQKQEAgLTAsMCArMSBAQAorSEVMTE8KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTkzMTEzYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorIyBuZXh0IGxpbmUgaGFzIG5vIEVPTCEKK2VjaG8gSEVMTE8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbDIucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwNDkxZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sMi5yaWdodApAQCAtMCwwICsxIEBACisxCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbDIudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTIyMGYwNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sMi50ZXN0cwpAQCAtMCwwICsxLDcgQEAKKyMgbGFzdCBsaW5lIGhhcyBubyBFT0whCitpZiB0cnVlCit0aGVuCisgIGVjaG8gMQorZWxzZQorICBlY2hvIDIKK2ZpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUxLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzgyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTEucmlnaHQKQEAgLTAsMCArMSBAQAorJzEnCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTEudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU1ODk1NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2E9MQorZWNobyAiJyRhJyIKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMi5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM5ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKz4xCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTIudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ5NjZmMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMi50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2E9MQorZWNobyAiPiRhIgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUzLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWE0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTMucmlnaHQKQEAgLTAsMCArMSwzIEBACitUZXN0aW5nOiBpbiAkZW1wdHkiIgorLi4KK0ZpbmlzaGVkCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTMudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDc1ZTc4NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMy50ZXN0cwpAQCAtMCwwICsxLDggQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giIHF1b3RlMy50ZXN0cyBhYmMgImQgZSIKK2ZpCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRlbXB0eSIiJworZW1wdHk9JycKK2ZvciBhIGluICRlbXB0eSIiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZWNobyBGaW5pc2hlZApkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGU0LnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGU0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTAxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTQucmlnaHQKQEAgLTAsMCArMSBAQAorYSBiCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTQudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjFkYWJmYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlNC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2FfYj0nYSBiJworZWNobyAiJGFfYiIKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3N0YXIucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy9zdGFyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlY2M1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy9zdGFyLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorLjEuCisuYWJjLgorLmQuCisuZS4KKy5mLgorLjEgYWJjIGQgZSBmLgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvc3Rhci50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3N0YXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTU1NGM0MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3N0YXIudGVzdHMKQEAgLTAsMCArMSw4IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiBzdGFyLnRlc3RzIDEgYWJjICdkIGUgZicKK2ZpCisjICdkIGUgZicgc2hvdWxkIGJlIHNwbGl0IGludG8gMyBzZXBhcmF0ZSBhcmdzOgorZm9yIGEgaW4gJCo7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKKyMgbXVzdCBwcm9kdWNlIC4xIGFiYyBkIGUgZi4KK2ZvciBhIGluICIkKiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXIucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiMjMxNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhci5yaWdodApAQCAtMCwwICsxLDQgQEAKK2h0dHA6Ly9idXN5Ym94Lm5ldAoraHR0cDovL2J1c3lib3gubmV0X2FiYworMQorMQpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhNjM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXIudGVzdHMKQEAgLTAsMCArMSw5IEBACitVUkw9aHR0cDovL2J1c3lib3gubmV0CisKK2VjaG8gJFVSTAorZWNobyAke1VSTH1fYWJjCisKK3RydWUKK2ZhbHNlOyBlY2hvICQ/Cit0cnVlCit7IGZhbHNlOyBlY2hvICQ/OyB9CmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFjYTFjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci5yaWdodApAQCAtMCwwICsxLDQwIEBACitUZXN0aW5nOiBpbiB4IHkgegorLnguCisueS4KKy56LgorVGVzdGluZzogaW4gdSAkZW1wdHkgdgorLnUuCisudi4KK1Rlc3Rpbmc6IGluIHUgIiAkZW1wdHkiIHYKKy51LgorLiAuCisudi4KK1Rlc3Rpbmc6IGluIHUgJGVtcHR5ICRlbXB0eSRhIHYKKy51LgorLmEuCisudi4KK1Rlc3Rpbmc6IGluICRhX2IKKy5hLgorLmIuCitUZXN0aW5nOiBpbiAkKgorLmFiYy4KKy5kLgorLmUuCitUZXN0aW5nOiBpbiAkQAorLmFiYy4KKy5kLgorLmUuCitUZXN0aW5nOiBpbiAtJCotCisuLWFiYy4KKy5kLgorLmUtLgorVGVzdGluZzogaW4gLSRALQorLi1hYmMuCisuZC4KKy5lLS4KK1Rlc3Rpbmc6IGluICRhX2IgLSRhX2ItCisuYS4KKy5iLgorLi1hLgorLmItLgorRmluaXNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkMWMxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnRlc3RzCkBAIC0wLDAgKzEsNDAgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giIHZhcl9zdWJzdF9pbl9mb3IudGVzdHMgYWJjICJkIGUiCitmaQorCitlY2hvICdUZXN0aW5nOiBpbiB4IHkgeicKK2ZvciBhIGluIHggeSB6OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiB1ICRlbXB0eSB2JworZW1wdHk9JycKK2ZvciBhIGluIHUgJGVtcHR5IHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHUgIiAkZW1wdHkiIHYnCitlbXB0eT0nJworZm9yIGEgaW4gdSAiICRlbXB0eSIgdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gdSAkZW1wdHkgJGVtcHR5JGEgdicKK2E9J2EnCitmb3IgYSBpbiB1ICRlbXB0eSAkZW1wdHkkYSB2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkYV9iJworYV9iPSdhIGInCitmb3IgYSBpbiAkYV9iOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkKicKK2ZvciBhIGluICQqOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkQCcKK2ZvciBhIGluICRAOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAtJCotJworZm9yIGEgaW4gLSQqLTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gLSRALScKK2ZvciBhIGluIC0kQC07IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRhX2IgLSRhX2ItJworYV9iPSdhIGInCitmb3IgYSBpbiAkYV9iIC0kYV9iLTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyBGaW5pc2hlZApkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvcnVuLWFsbCBiL3NoZWxsL21zaF90ZXN0L3J1bi1hbGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjlmNjJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L3J1bi1hbGwKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL3NoCisKK3Rlc3QgLXggbXNoIHx8IHsKKyAgICBlY2hvICJObyAuL21zaCAtIGNyZWF0aW5nIGEgbGluayB0byAuLi8uLi9idXN5Ym94IgorICAgIGxuIC1zIC4uLy4uL2J1c3lib3ggbXNoCit9CisKK1BBVEg9IiRQV0Q6JFBBVEgiICMgZm9yIG1zaAorZXhwb3J0IFBBVEgKKworVEhJU19TSD0iJFBXRC9tc2giCitleHBvcnQgVEhJU19TSAorCitkb190ZXN0KCkKK3sKKyAgICB0ZXN0IC1kICIkMSIgfHwgcmV0dXJuIDAKKyMgICBlY2hvIFJ1bm5pbmcgdGVzdHMgaW4gZGlyZWN0b3J5ICIkMSIKKyAgICAoCisgICAgY2QgIiQxIiB8fCB7IGVjaG8gImNhbm5vdCBjZCAkMSEiOyBleGl0IDE7IH0KKyAgICBmb3IgeCBpbiBydW4tKjsgZG8KKwl0ZXN0IC1mICIkeCIgfHwgY29udGludWUKKwljYXNlICIkeCIgaW4KKwkgICAgIiQwInxydW4tbWluaW1hbHxydW4tZ3Byb2YpIDs7CisJICAgICoub3JpZ3wqfikgOzsKKwkgICAgIyopIGVjaG8gJHggOyBzaCAkeCA7OworCSAgICAqKQorCSAgICBzaCAiJHgiID4iLi4vJDEtJHguZmFpbCIgMj4mMSAmJiBcCisJICAgIHsgZWNobyAiJDEvJHg6IG9rIjsgcm0gIi4uLyQxLSR4LmZhaWwiOyB9IHx8IGVjaG8gIiQxLyR4OiBmYWlsIjsKKwkgICAgOzsKKwllc2FjCisgICAgZG9uZQorICAgICMgTWFueSBiYXNoIHJ1bi1YWFggc2NyaXB0cyBqdXN0IGRvIHRoaXMsCisgICAgIyBubyBwb2ludCBpbiBkdXBsaWNhdGlvbiBpdCBhbGwgb3ZlciB0aGUgcGxhY2UKKyAgICBmb3IgeCBpbiAqLnRlc3RzOyBkbworCXRlc3QgLXggIiR4IiB8fCBjb250aW51ZQorCW5hbWU9IiR7eCUlLnRlc3RzfSIKKwl0ZXN0IC1mICIkbmFtZS5yaWdodCIgfHwgY29udGludWUKKyMJZWNobyBSdW5uaW5nIHRlc3Q6ICIkbmFtZS5yaWdodCIKKwl7CisJICAgICIkVEhJU19TSCIgIi4vJHgiID4iJG5hbWUueHgiIDI+JjEKKwkgICAgZGlmZiAtdSAiJG5hbWUueHgiICIkbmFtZS5yaWdodCIgPiIuLi8kMS0keC5mYWlsIiAmJiBybSAtZiAiJG5hbWUueHgiICIuLi8kMS0keC5mYWlsIgorCX0gJiYgZWNobyAiJDEvJHg6IG9rIiB8fCBlY2hvICIkMS8keDogZmFpbCIKKyAgICBkb25lCisgICAgKQorfQorCisjIE1haW4gcGFydCBvZiB0aGlzIHNjcmlwdAorIyBVc2FnZTogcnVuLWFsbCBbZGlyZWN0b3JpZXNdCisKK2lmIFsgJCMgLWx0IDEgXTsgdGhlbgorICAgICMgQWxsIHN1YiBkaXJlY3RvcmllcworICAgIG1vZHVsZXM9YGxzIC1kIG1zaC0qYAorCisgICAgZm9yIG1vZHVsZSBpbiAkbW9kdWxlczsgZG8KKwlkb190ZXN0ICRtb2R1bGUKKyAgICBkb25lCitlbHNlCisgICAgd2hpbGUgWyAkIyAtZ2UgMSBdOyBkbworCWlmIFsgLWQgJDEgXTsgdGhlbgorCSAgICBkb190ZXN0ICQxCisJZmkKKwlzaGlmdAorICAgIGRvbmUKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9yYW5kb20uYyBiL3NoZWxsL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2FiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9yYW5kb20uYwpAQCAtMCwwICsxLDQ0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAkUkFORE9NIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicmFuZG9tLmgiCisKK3VpbnQzMl90IEZBU1RfRlVOQworbmV4dF9yYW5kb20ocmFuZG9tX3QgKnJuZCkKK3sKKwkvKiBHYWxvaXMgTEZTUiBwYXJhbWV0ZXIgKi8KKwkvKiBUYXBzIGF0IDMyIDMxIDI5IDE6ICovCisJZW51bSB7IE1BU0sgPSAweDgwMDAwMDBiIH07CisJLyogQW5vdGhlciBleGFtcGxlIC0gdGFwcyBhdCAzMiAzMSAzMCAxMDogKi8KKwkvKiBNQVNLID0gMHgwMDQwMDAwNyAqLworCisJdWludDMyX3QgdDsKKworCWlmIChVTklOSVRFRF9SQU5ET01fVChybmQpKSB7CisJCS8qIENhbiB1c2UgbW9ub3RvbmljX25zKCkgZm9yIGJldHRlciByYW5kb21uZXNzIGJ1dCBmb3Igbm93CisJCSAqIGl0IGlzIG5vdCB1c2VkIGFueXdoZXJlIGVsc2UgaW4gYnVzeWJveC4uLiBzbyBhdm9pZCBibG9hdAorCQkgKi8KKwkJSU5JVF9SQU5ET01fVChybmQsIGdldHBpZCgpLCBtb25vdG9uaWNfdXMoKSk7CisJfQorCisJLyogTENHIGhhcyBwZXJpb2Qgb2YgMl4zMiBhbmQgYWx0ZXJuYXRpbmcgbG93ZXN0IGJpdCAqLworCXJuZC0+TENHID0gMTY2NDUyNSAqIHJuZC0+TENHICsgMTAxMzkwNDIyMzsKKwkvKiBHYWxvaXMgTEZTUiBoYXMgcGVyaW9kIG9mIDJeMzItMSA9IDMgKiA1ICogMTcgKiAyNTcgKiA2NTUzNyAqLworCXQgPSAocm5kLT5nYWxvaXNfTEZTUiA8PCAxKTsKKwlpZiAocm5kLT5nYWxvaXNfTEZTUiA8IDApIC8qIGlmIHdlIGp1c3Qgc2hpZnRlZCAxIG91dCBvZiBtc2IuLi4gKi8KKwkJdCBePSBNQVNLOworCXJuZC0+Z2Fsb2lzX0xGU1IgPSB0OworCS8qIEJvdGggYXJlIHdlYWssIGNvbWJpbmluZyB0aGVtIGdpdmVzIGJldHRlciByYW5kb21uZXNzCisJICogYW5kIH4yXjY0IHBlcmlvZC4gJiAweDdmZmYgaXMgcHJvYmFibHkgYmFzaCBjb21wYXQKKwkgKiBmb3IgJFJBTkRPTSByYW5nZS4gQ29tYmluaW5nIHdpdGggc3VidHJhY3Rpb24gaXMKKwkgKiBqdXN0IGZvciBmdW4uICsgYW5kIF4gd291bGQgd29yayBlcXVhbGx5IHdlbGwuICovCisJdCA9ICh0IC0gcm5kLT5MQ0cpICYgMHg3ZmZmOworCisJcmV0dXJuIHQ7Cit9CmRpZmYgLS1naXQgYS9zaGVsbC9yYW5kb20uaCBiL3NoZWxsL3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGM0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9yYW5kb20uaApAQCAtMCwwICsxLDMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAkUkFORE9NIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBTSEVMTF9SQU5ET01fSAorI2RlZmluZSBTSEVMTF9SQU5ET01fSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCit0eXBlZGVmIHN0cnVjdCByYW5kb21fdCB7CisJLyogUmFuZG9tIG51bWJlciBnZW5lcmF0b3JzICovCisJaW50MzJfdCBnYWxvaXNfTEZTUjsgLyogR2Fsb2lzIExGU1IgKGZhc3QgYnV0IHdlYWspLiBzaWduZWQhICovCisJdWludDMyX3QgTENHOyAgICAgICAgLyogTENHIChmYXN0IGJ1dCB3ZWFrKSAqLworfSByYW5kb21fdDsKKworI2RlZmluZSBVTklOSVRFRF9SQU5ET01fVChybmQpIFwKKwkoKHJuZCktPmdhbG9pc19MRlNSID09IDApCisKKyNkZWZpbmUgSU5JVF9SQU5ET01fVChybmQsIG5vbnplcm8sIHYpIFwKKwkoKHJuZCktPmdhbG9pc19MRlNSID0gKG5vbnplcm8pLCAocm5kKS0+TENHID0gKHYpKQorCisjZGVmaW5lIENMRUFSX1JBTkRPTV9UKHJuZCkgXAorCSgocm5kKS0+Z2Fsb2lzX0xGU1IgPSAwKQorCit1aW50MzJfdCBuZXh0X3JhbmRvbShyYW5kb21fdCAqcm5kKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2hlbGwvc2hlbGxfY29tbW9uLmMgYi9zaGVsbC9zaGVsbF9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmMyMmVkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvc2hlbGxfY29tbW9uLmMKQEAgLTAsMCArMSw0OTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEFkYXB0ZWQgZnJvbSBhc2ggYXBwbGV0IGNvZGUKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBEZW55cyBWbGFzZW5rbworICogU3BsaXQgZnJvbSBhc2guYworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInNoZWxsX2NvbW1vbi5oIgorCitjb25zdCBjaGFyIGRlZmlmc3ZhcltdIEFMSUdOMSA9ICJJRlM9IFx0XG4iOworCisKK2ludCBGQVNUX0ZVTkMgaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoY29uc3QgY2hhciAqcywgY2hhciB0ZXJtaW5hdG9yKQoreworCWlmICghcyB8fCAhKGlzYWxwaGEoKnMpIHx8ICpzID09ICdfJykpCisJCXJldHVybiAwOworCisJZG8KKwkJcysrOworCXdoaWxlIChpc2FsbnVtKCpzKSB8fCAqcyA9PSAnXycpOworCisJcmV0dXJuICpzID09IHRlcm1pbmF0b3I7Cit9CisKKy8qIHJlYWQgYnVpbHRpbiAqLworCisvKiBOZWVkcyB0byBiZSBpbnRlcnJ1cHRpYmxlOiBzaGVsbCBtdXNoIGhhbmRsZSB0cmFwcyBhbmQgc2hlbGwtc3BlY2lhbCBzaWduYWxzCisgKiB3aGlsZSBpbnNpZGUgcmVhZC4gVG8gaW1wbGVtZW50IHRoaXMsIGJlIHN1cmUgdG8gbm90IGxvb3Agb24gRUlOVFIKKyAqIGFuZCByZXR1cm4gZXJybm8gPT0gRUlOVFIgcmVsaWFibHkuCisgKi8KKy8vVE9ETzogdXNlIG1vcmUgZWZmaWNpZW50IHNldHZhcigpIHdoaWNoIHRha2VzIGEgcG9pbnRlciB0byBtYWxsb2NlZCAiVkFSPVZBTCIKKy8vc3RyaW5nLiBodXNoIG5hdHVyYWxseSBoYXMgaXQsIGFuZCBhc2ggaGFzIHNldHZhcmVxKCkuCisvL0hlcmUgd2UgY2FuIHNpbXBseSBzdG9yZSAiVkFSPSIgYXQgYnVmZmVyIHN0YXJ0IGFuZCBzdG9yZSByZWFkIGRhdGEgZGlyZWN0bHkKKy8vYWZ0ZXIgIj0iLCB0aGVuIHBhc3MgYnVmZmVyIHRvIHNldHZhcigpIHRvIGNvbnN1bWUuCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMKK3NoZWxsX2J1aWx0aW5fcmVhZCh2b2lkIEZBU1RfRlVOQyAoKnNldHZhcikoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKSwKKwljaGFyICAgICAgICoqYXJndiwKKwljb25zdCBjaGFyICppZnMsCisJaW50ICAgICAgICByZWFkX2ZsYWdzLAorCWNvbnN0IGNoYXIgKm9wdF9uLAorCWNvbnN0IGNoYXIgKm9wdF9wLAorCWNvbnN0IGNoYXIgKm9wdF90LAorCWNvbnN0IGNoYXIgKm9wdF91CispCit7CisJdW5zaWduZWQgZXJyOworCXVuc2lnbmVkIGVuZF9tczsgLyogLXQgVElNRU9VVCAqLworCWludCBmZDsgLyogLXUgRkQgKi8KKwlpbnQgbmNoYXJzOyAvKiAtbiBOVU0gKi8KKwljaGFyICoqcHA7CisJY2hhciAqYnVmZmVyOworCXN0cnVjdCB0ZXJtaW9zIHR0eSwgb2xkX3R0eTsKKwljb25zdCBjaGFyICpyZXR2YWw7CisJaW50IGJ1ZnBvczsgLyogbmVlZCB0byBiZSBhYmxlIHRvIGhvbGQgLTEgKi8KKwlpbnQgc3RhcnR3b3JkOworCXNtYWxsaW50IGJhY2tzbGFzaDsKKworCWVycm5vID0gZXJyID0gMDsKKworCXBwID0gYXJndjsKKwl3aGlsZSAoKnBwKSB7CisJCWlmICghaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoKnBwLCAnXDAnKSkgeworCQkJLyogTWltaWMgYmFzaCBtZXNzYWdlICovCisJCQliYl9lcnJvcl9tc2coInJlYWQ6ICclcyc6IG5vdCBhIHZhbGlkIGlkZW50aWZpZXIiLCAqcHApOworCQkJcmV0dXJuIChjb25zdCBjaGFyICopKHVpbnRwdHJfdCkxOworCQl9CisJCXBwKys7CisJfQorCisJbmNoYXJzID0gMDsgLyogaWYgIT0gMCwgLW4gaXMgaW4gZWZmZWN0ICovCisJaWYgKG9wdF9uKSB7CisJCW5jaGFycyA9IGJiX3N0cnRvdShvcHRfbiwgTlVMTCwgMTApOworCQlpZiAobmNoYXJzIDwgMCB8fCBlcnJubykKKwkJCXJldHVybiAiaW52YWxpZCBjb3VudCI7CisJCS8qIG5vdGU6ICItbiAwIjogb2ZmIChiYXNoIDMuMiBkb2VzIHRoaXMgdG9vKSAqLworCX0KKwllbmRfbXMgPSAwOworCWlmIChvcHRfdCkgeworCQllbmRfbXMgPSBiYl9zdHJ0b3Uob3B0X3QsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vIHx8IGVuZF9tcyA+IFVJTlRfTUFYIC8gMjA0OCkKKwkJCXJldHVybiAiaW52YWxpZCB0aW1lb3V0IjsKKwkJZW5kX21zICo9IDEwMDA7CisjaWYgMCAvKiBldmVuIGJhc2ggaGFzIG5vIC10IE4uTk5OIHN1cHBvcnQgKi8KKwkJdHMudHZfc2VjID0gYmJfc3RydG91KG9wdF90LCAmcCwgMTApOworCQl0cy50dl91c2VjID0gMDsKKwkJLyogRUlOVkFMIG1lYW5zIG51bWJlciBpcyBvaywgYnV0IG5vdCB0ZXJtaW5hdGVkIGJ5IE5VTCAqLworCQlpZiAoKnAgPT0gJy4nICYmIGVycm5vID09IEVJTlZBTCkgeworCQkJY2hhciAqcDI7CisJCQlpZiAoKisrcCkgeworCQkJCWludCBzY2FsZTsKKwkJCQl0cy50dl91c2VjID0gYmJfc3RydG91KHAsICZwMiwgMTApOworCQkJCWlmIChlcnJubykKKwkJCQkJcmV0dXJuICJpbnZhbGlkIHRpbWVvdXQiOworCQkJCXNjYWxlID0gcDIgLSBwOworCQkJCS8qIG5vcm1hbGl6ZSB0byB1c2VjICovCisJCQkJaWYgKHNjYWxlID4gNikKKwkJCQkJcmV0dXJuICJpbnZhbGlkIHRpbWVvdXQiOworCQkJCXdoaWxlIChzY2FsZSsrIDwgNikKKwkJCQkJdHMudHZfdXNlYyAqPSAxMDsKKwkJCX0KKwkJfSBlbHNlIGlmICh0cy50dl9zZWMgPCAwIHx8IGVycm5vKSB7CisJCQlyZXR1cm4gImludmFsaWQgdGltZW91dCI7CisJCX0KKwkJaWYgKCEodHMudHZfc2VjIHwgdHMudHZfdXNlYykpIHsgLyogYm90aCBhcmUgMD8gKi8KKwkJCXJldHVybiAiaW52YWxpZCB0aW1lb3V0IjsKKwkJfQorI2VuZGlmIC8qIGlmIDAgKi8KKwl9CisJZmQgPSBTVERJTl9GSUxFTk87CisJaWYgKG9wdF91KSB7CisJCWZkID0gYmJfc3RydG91KG9wdF91LCBOVUxMLCAxMCk7CisJCWlmIChmZCA8IDAgfHwgZXJybm8pCisJCQlyZXR1cm4gImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIjsKKwl9CisKKwlpZiAob3B0X3AgJiYgaXNhdHR5KGZkKSkgeworCQlmcHV0cyhvcHRfcCwgc3RkZXJyKTsKKwkJZmZsdXNoX2FsbCgpOworCX0KKworCWlmIChpZnMgPT0gTlVMTCkKKwkJaWZzID0gZGVmaWZzOworCisJaWYgKG5jaGFycyB8fCAocmVhZF9mbGFncyAmIEJVSUxUSU5fUkVBRF9TSUxFTlQpKSB7CisJCXRjZ2V0YXR0cihmZCwgJnR0eSk7CisJCW9sZF90dHkgPSB0dHk7CisJCWlmIChuY2hhcnMpIHsKKwkJCXR0eS5jX2xmbGFnICY9IH5JQ0FOT047CisJCQl0dHkuY19jY1tWTUlOXSA9IG5jaGFycyA8IDI1NiA/IG5jaGFycyA6IDI1NTsKKwkJfQorCQlpZiAocmVhZF9mbGFncyAmIEJVSUxUSU5fUkVBRF9TSUxFTlQpIHsKKwkJCXR0eS5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9LIHwgRUNIT05MKTsKKwkJfQorCQkvKiBUaGlzIGZvcmNlcyBleGVjdXRpb24gb2YgInJlc3RvcmluZyIgdGNnZXRhdHRyIGxhdGVyICovCisJCXJlYWRfZmxhZ3MgfD0gQlVJTFRJTl9SRUFEX1NJTEVOVDsKKwkJLyogaWYgdGNnZXRhdHRyIGZhaWxlZCwgdGNzZXRhdHRyIHdpbGwgZmFpbCB0b28uCisJCSAqIElnbm9yaW5nLCBpdCdzIGhhcm1sZXNzLiAqLworCQl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZ0dHkpOworCX0KKworCXJldHZhbCA9IChjb25zdCBjaGFyICopKHVpbnRwdHJfdCkwOworCXN0YXJ0d29yZCA9IDE7CisJYmFja3NsYXNoID0gMDsKKwlpZiAoZW5kX21zKSAvKiBOQjogZW5kX21zIHN0YXlzIG5vbnplcm86ICovCisJCWVuZF9tcyA9ICgodW5zaWduZWQpbW9ub3RvbmljX21zKCkgKyBlbmRfbXMpIHwgMTsKKwlidWZmZXIgPSBOVUxMOworCWJ1ZnBvcyA9IDA7CisJZG8geworCQljaGFyIGM7CisJCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCQlpbnQgdGltZW91dDsKKworCQlpZiAoKGJ1ZnBvcyAmIDB4ZmYpID09IDApCisJCQlidWZmZXIgPSB4cmVhbGxvYyhidWZmZXIsIGJ1ZnBvcyArIDB4MTAwKTsKKworCQl0aW1lb3V0ID0gLTE7CisJCWlmIChlbmRfbXMpIHsKKwkJCXRpbWVvdXQgPSBlbmRfbXMgLSAodW5zaWduZWQpbW9ub3RvbmljX21zKCk7CisJCQlpZiAodGltZW91dCA8PSAwKSB7IC8qIGFscmVhZHkgbGF0ZT8gKi8KKwkJCQlyZXR2YWwgPSAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCisJCS8qIFdlIG11c3QgcG9sbCBldmVuIGlmIHRpbWVvdXQgaXMgLTE6CisJCSAqIHdlIHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgaWYgc2lnbmFsIGFycml2ZXMsCisJCSAqIHJlZ2FyZGxlc3Mgb2YgU0FfUkVTVEFSVC1uZXNzIG9mIHRoYXQgc2lnbmFsIQorCQkgKi8KKwkJZXJybm8gPSAwOworCQlwZmRbMF0uZmQgPSBmZDsKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJaWYgKHBvbGwocGZkLCAxLCB0aW1lb3V0KSAhPSAxKSB7CisJCQkvKiB0aW1lZCBvdXQsIG9yIEVJTlRSICovCisJCQllcnIgPSBlcnJubzsKKwkJCXJldHZhbCA9IChjb25zdCBjaGFyICopKHVpbnRwdHJfdCkxOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKHJlYWQoZmQsICZidWZmZXJbYnVmcG9zXSwgMSkgIT0gMSkgeworCQkJZXJyID0gZXJybm87CisJCQlyZXR2YWwgPSAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMTsKKwkJCWJyZWFrOworCQl9CisKKwkJYyA9IGJ1ZmZlcltidWZwb3NdOworCQlpZiAoYyA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWlmIChiYWNrc2xhc2gpIHsKKwkJCWJhY2tzbGFzaCA9IDA7CisJCQlpZiAoYyAhPSAnXG4nKQorCQkJCWdvdG8gcHV0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEocmVhZF9mbGFncyAmIEJVSUxUSU5fUkVBRF9SQVcpICYmIGMgPT0gJ1xcJykgeworCQkJYmFja3NsYXNoID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKworCQkvKiAkSUZTIHNwbGl0dGluZy4gTk9UIGRvbmUgaWYgd2UgcnVuICJyZWFkIgorCQkgKiB3aXRob3V0IHZhcmlhYmxlIG5hbWVzIChiYXNoIGNvbXBhdCkuCisJCSAqIFRodXMsICJyZWFkIiBhbmQgInJlYWQgUkVQTFkiIGFyZSBub3QgdGhlIHNhbWUuCisJCSAqLworCQlpZiAoYXJndlswXSkgeworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjdGFnXzE4XzA2XzA1ICovCisJCQljb25zdCBjaGFyICppc19pZnMgPSBzdHJjaHIoaWZzLCBjKTsKKwkJCWlmIChzdGFydHdvcmQgJiYgaXNfaWZzKSB7CisJCQkJaWYgKGlzc3BhY2UoYykpCisJCQkJCWNvbnRpbnVlOworCQkJCS8qIGl0IGlzIGEgbm9uLXNwYWNlIGlmcyBjaGFyICovCisJCQkJc3RhcnR3b3JkLS07CisJCQkJaWYgKHN0YXJ0d29yZCA9PSAxKSAvKiBmaXJzdCBvbmU/ICovCisJCQkJCWNvbnRpbnVlOyAvKiB5ZXMsIGl0IGlzIG5vdCBuZXh0IHdvcmQgeWV0ICovCisJCQl9CisJCQlzdGFydHdvcmQgPSAwOworCQkJaWYgKGFyZ3ZbMV0gIT0gTlVMTCAmJiBpc19pZnMpIHsKKwkJCQlidWZmZXJbYnVmcG9zXSA9ICdcMCc7CisJCQkJYnVmcG9zID0gMDsKKwkJCQlzZXR2YXIoKmFyZ3YsIGJ1ZmZlcik7CisJCQkJYXJndisrOworCQkJCS8qIGNhbiB3ZSBza2lwIG9uZSBub24tc3BhY2UgaWZzIGNoYXI/ICgyOiB5ZXMpICovCisJCQkJc3RhcnR3b3JkID0gaXNzcGFjZShjKSA/IDIgOiAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisgcHV0OgorCQlidWZwb3MrKzsKKwl9IHdoaWxlICgtLW5jaGFycyk7CisKKwlpZiAoYXJndlswXSkgeworCQkvKiBSZW1vdmUgdHJhaWxpbmcgc3BhY2UgJElGUyBjaGFycyAqLworCQl3aGlsZSAoLS1idWZwb3MgPj0gMCAmJiBpc3NwYWNlKGJ1ZmZlcltidWZwb3NdKSAmJiBzdHJjaHIoaWZzLCBidWZmZXJbYnVmcG9zXSkgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlidWZmZXJbYnVmcG9zICsgMV0gPSAnXDAnOworCQkvKiBVc2UgdGhlIHJlbWFpbmRlciBhcyBhIHZhbHVlIGZvciB0aGUgbmV4dCB2YXJpYWJsZSAqLworCQlzZXR2YXIoKmFyZ3YsIGJ1ZmZlcik7CisJCS8qIFNldCB0aGUgcmVzdCB0byAiIiAqLworCQl3aGlsZSAoKisrYXJndikKKwkJCXNldHZhcigqYXJndiwgIiIpOworCX0gZWxzZSB7CisJCS8qIE5vdGU6IG5vICRJRlMgcmVtb3ZhbCAqLworCQlidWZmZXJbYnVmcG9zXSA9ICdcMCc7CisJCXNldHZhcigiUkVQTFkiLCBidWZmZXIpOworCX0KKworIHJldDoKKwlmcmVlKGJ1ZmZlcik7CisJaWYgKHJlYWRfZmxhZ3MgJiBCVUlMVElOX1JFQURfU0lMRU5UKQorCQl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZvbGRfdHR5KTsKKworCWVycm5vID0gZXJyOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIHVsaW1pdCBidWlsdGluICovCisKK3N0cnVjdCBsaW1pdHMgeworCXVpbnQ4X3QgY21kOyAgICAgICAgICAgIC8qIFJMSU1JVF94eHggZml0IGludG8gaXQgKi8KKwl1aW50OF90IGZhY3Rvcl9zaGlmdDsgICAvKiBzaGlmdCBieSB0byBnZXQgcmxpbV97Y3VyLG1heH0gdmFsdWVzICovCisJY2hhciBvcHRpb247CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGltaXRzIGxpbWl0c190YmxbXSA9IHsKKyNpZmRlZiBSTElNSVRfRlNJWkUKKwl7IFJMSU1JVF9GU0laRSwJCTksCSdmJywJImZpbGUgc2l6ZSAoYmxvY2tzKSIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DUFUKKwl7IFJMSU1JVF9DUFUsCQkwLAkndCcsCSJjcHUgdGltZSAoc2Vjb25kcykiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfREFUQQorCXsgUkxJTUlUX0RBVEEsCQkxMCwJJ2QnLAkiZGF0YSBzZWcgc2l6ZSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJeyBSTElNSVRfU1RBQ0ssCQkxMCwJJ3MnLAkic3RhY2sgc2l6ZSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwl7IFJMSU1JVF9DT1JFLAkJOSwJJ2MnLAkiY29yZSBmaWxlIHNpemUgKGJsb2NrcykiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlNTCisJeyBSTElNSVRfUlNTLAkJMTAsCSdtJywJInJlc2lkZW50IHNldCBzaXplIChrYikiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTUVNTE9DSworCXsgUkxJTUlUX01FTUxPQ0ssCTEwLAknbCcsCSJsb2NrZWQgbWVtb3J5IChrYikiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTlBST0MKKwl7IFJMSU1JVF9OUFJPQywJCTAsCSdwJywJInByb2Nlc3NlcyIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OT0ZJTEUKKwl7IFJMSU1JVF9OT0ZJTEUsCTAsCSduJywJImZpbGUgZGVzY3JpcHRvcnMiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQVMKKwl7IFJMSU1JVF9BUywJCTEwLAkndicsCSJhZGRyZXNzIHNwYWNlIChrYikiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTE9DS1MKKwl7IFJMSU1JVF9MT0NLUywJCTAsCSd3JywJImxvY2tzIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05JQ0UKKwl7IFJMSU1JVF9OSUNFLAkJMCwJJ2UnLAkic2NoZWR1bGluZyBwcmlvcml0eSIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9SVFBSSU8KKwl7IFJMSU1JVF9SVFBSSU8sCTAsCSdyJywJInJlYWwtdGltZSBwcmlvcml0eSIgfSwKKyNlbmRpZgorfTsKKworZW51bSB7CisJT1BUX2hhcmQgPSAoMSA8PCAwKSwKKwlPUFRfc29mdCA9ICgxIDw8IDEpLAorfTsKKworLyogIi0iOiB0cmVhdCBhcmdzIGFzIHBhcmFtZXRlcnMgb2Ygb3B0aW9uIHdpdGggQVNDSUkgY29kZSAxICovCitzdGF0aWMgY29uc3QgY2hhciB1bGltaXRfb3B0X3N0cmluZ1tdID0gIi1IU2EiCisjaWZkZWYgUkxJTUlUX0ZTSVpFCisJCQkiZjo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NQVQorCQkJInQ6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9EQVRBCisJCQkiZDo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJCQkiczo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwkJCSJjOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlNTCisJCQkibTo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX01FTUxPQ0sKKwkJCSJsOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTlBST0MKKwkJCSJwOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTk9GSUxFCisJCQkibjo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0FTCisJCQkidjo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0xPQ0tTCisJCQkidzo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05JQ0UKKwkJCSJlOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlRQUklPCisJCQkicjo6IgorI2VuZGlmCisJCQk7CisKK3N0YXRpYyB2b2lkIHByaW50bGltKHVuc2lnbmVkIG9wdHMsIGNvbnN0IHN0cnVjdCBybGltaXQgKmxpbWl0LAorCQkJY29uc3Qgc3RydWN0IGxpbWl0cyAqbCkKK3sKKwlybGltX3QgdmFsOworCisJdmFsID0gbGltaXQtPnJsaW1fbWF4OworCWlmICghKG9wdHMgJiBPUFRfaGFyZCkpCisJCXZhbCA9IGxpbWl0LT5ybGltX2N1cjsKKworCWlmICh2YWwgPT0gUkxJTV9JTkZJTklUWSkKKwkJcHJpbnRmKCJ1bmxpbWl0ZWRcbiIpOworCWVsc2UgeworCQl2YWwgPj49IGwtPmZhY3Rvcl9zaGlmdDsKKwkJcHJpbnRmKCIlbGx1XG4iLCAobG9uZyBsb25nKSB2YWwpOworCX0KK30KKworaW50IEZBU1RfRlVOQworc2hlbGxfYnVpbHRpbl91bGltaXQoY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBhcmdjOworCisJLyogV2UgY2FuJ3QgdXNlIGdldG9wdDMyOiBuZWVkIHRvIGhhbmRsZSBjb21tYW5kcyBsaWtlCisJICogdWxpbWl0IDEyMyAtYzIgLWwgNDU2CisJICovCisKKwkvKiBJbiBjYXNlIGdldG9wdCB3YXMgYWxyZWFkeSBjYWxsZWQ6CisJICogcmVzZXQgdGhlIGxpYmMgZ2V0b3B0KCkgZnVuY3Rpb24sIHdoaWNoIGtlZXBzIGludGVybmFsIHN0YXRlLgorCSAqLworI2lmZGVmIF9fR0xJQkNfXworCW9wdGluZCA9IDA7CisjZWxzZSAvKiBCU0Qgc3R5bGUgKi8KKwlvcHRpbmQgPSAxOworCS8qIG9wdHJlc2V0ID0gMTsgKi8KKyNlbmRpZgorCS8qIG9wdGFyZyA9IE5VTEw7IG9wdGVyciA9IDA7IG9wdG9wdCA9IDA7IC0gZG8gd2UgbmVlZCB0aGlzPz8gKi8KKworCWFyZ2MgPSAxOworCXdoaWxlIChhcmd2W2FyZ2NdKQorCQlhcmdjKys7CisKKwlvcHRzID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcmxpbWl0IGxpbWl0OworCQljb25zdCBzdHJ1Y3QgbGltaXRzICpsOworCQlpbnQgb3B0X2NoYXIgPSBnZXRvcHQoYXJnYywgYXJndiwgdWxpbWl0X29wdF9zdHJpbmcpOworCisJCWlmIChvcHRfY2hhciA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAob3B0X2NoYXIgPT0gJ0gnKSB7CisJCQlvcHRzIHw9IE9QVF9oYXJkOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9wdF9jaGFyID09ICdTJykgeworCQkJb3B0cyB8PSBPUFRfc29mdDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG9wdF9jaGFyID09ICdhJykgeworCQkJZm9yIChsID0gbGltaXRzX3RibDsgbCAhPSAmbGltaXRzX3RibFtBUlJBWV9TSVpFKGxpbWl0c190YmwpXTsgbCsrKSB7CisJCQkJZ2V0cmxpbWl0KGwtPmNtZCwgJmxpbWl0KTsKKwkJCQlwcmludGYoIi0lYzogJS0zMHMgIiwgbC0+b3B0aW9uLCBsLT5uYW1lKTsKKwkJCQlwcmludGxpbShvcHRzLCAmbGltaXQsIGwpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAob3B0X2NoYXIgPT0gMSkKKwkJCW9wdF9jaGFyID0gJ2YnOworCQlmb3IgKGwgPSBsaW1pdHNfdGJsOyBsICE9ICZsaW1pdHNfdGJsW0FSUkFZX1NJWkUobGltaXRzX3RibCldOyBsKyspIHsKKwkJCWlmIChvcHRfY2hhciA9PSBsLT5vcHRpb24pIHsKKwkJCQljaGFyICp2YWxfc3RyOworCisJCQkJZ2V0cmxpbWl0KGwtPmNtZCwgJmxpbWl0KTsKKworCQkJCXZhbF9zdHIgPSBvcHRhcmc7CisJCQkJaWYgKCF2YWxfc3RyICYmIGFyZ3Zbb3B0aW5kXSAmJiBhcmd2W29wdGluZF1bMF0gIT0gJy0nKQorCQkJCQl2YWxfc3RyID0gYXJndltvcHRpbmQrK107IC8qICsrIHNraXBzIE5OIGluICItYyBOTiIgY2FzZSAqLworCQkJCWlmICh2YWxfc3RyKSB7CisJCQkJCXJsaW1fdCB2YWw7CisKKwkJCQkJaWYgKHN0cmNtcCh2YWxfc3RyLCAidW5saW1pdGVkIikgPT0gMCkKKwkJCQkJCXZhbCA9IFJMSU1fSU5GSU5JVFk7CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKHNpemVvZih2YWwpID09IHNpemVvZihpbnQpKQorCQkJCQkJCXZhbCA9IGJiX3N0cnRvdSh2YWxfc3RyLCBOVUxMLCAxMCk7CisJCQkJCQllbHNlIGlmIChzaXplb2YodmFsKSA9PSBzaXplb2YobG9uZykpCisJCQkJCQkJdmFsID0gYmJfc3RydG91bCh2YWxfc3RyLCBOVUxMLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJdmFsID0gYmJfc3RydG91bGwodmFsX3N0ciwgTlVMTCwgMTApOworCQkJCQkJaWYgKGVycm5vKSB7CisJCQkJCQkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG51bWJlciAnJXMnIiwgdmFsX3N0cik7CisJCQkJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCQkJCX0KKwkJCQkJCXZhbCA8PD0gbC0+ZmFjdG9yX3NoaWZ0OworCQkJCQl9CisvL2JiX2Vycm9yX21zZygib3B0ICVjIHZhbF9zdHI6JyVzJyB2YWw6JWxsZCIsIG9wdF9jaGFyLCB2YWxfc3RyLCAobG9uZyBsb25nKXZhbCk7CisJCQkJCS8qIGZyb20gbWFuIGJhc2g6ICJJZiBuZWl0aGVyIC1IIG5vciAtUworCQkJCQkgKiBpcyBzcGVjaWZpZWQsIGJvdGggdGhlIHNvZnQgYW5kIGhhcmQKKwkJCQkJICogbGltaXRzIGFyZSBzZXQuICovCisJCQkJCWlmICghb3B0cykKKwkJCQkJCW9wdHMgPSBPUFRfaGFyZCArIE9QVF9zb2Z0OworCQkJCQlpZiAob3B0cyAmIE9QVF9oYXJkKQorCQkJCQkJbGltaXQucmxpbV9tYXggPSB2YWw7CisJCQkJCWlmIChvcHRzICYgT1BUX3NvZnQpCisJCQkJCQlsaW1pdC5ybGltX2N1ciA9IHZhbDsKKy8vYmJfZXJyb3JfbXNnKCJzZXRybGltaXQoJWQsICVsbGQsICVsbGQpIiwgbC0+Y21kLCAobG9uZyBsb25nKWxpbWl0LnJsaW1fY3VyLCAobG9uZyBsb25nKWxpbWl0LnJsaW1fbWF4KTsKKwkJCQkJaWYgKHNldHJsaW1pdChsLT5jbWQsICZsaW1pdCkgPCAwKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnKCJlcnJvciBzZXR0aW5nIGxpbWl0Iik7CisJCQkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRsaW0ob3B0cywgJmxpbWl0LCBsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLyogZm9yIChldmVyeSBwb3NzaWJsZSBvcHQpICovCisKKwkJaWYgKGwgPT0gJmxpbWl0c190YmxbQVJSQVlfU0laRShsaW1pdHNfdGJsKV0pIHsKKwkJCS8qIGJhZCBvcHRpb24uIGdldG9wdCBhbHJlYWR5IGNvbXBsYWluZWQuICovCisJCQlicmVhazsKKwkJfQorCisJfSAvKiB3aGlsZSAodGhlcmUgYXJlIG9wdGlvbnMpICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NoZWxsL3NoZWxsX2NvbW1vbi5oIGIvc2hlbGwvc2hlbGxfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2YmM0MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL3NoZWxsX2NvbW1vbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEFkYXB0ZWQgZnJvbSBhc2ggYXBwbGV0IGNvZGUKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBEZW55cyBWbGFzZW5rbworICogU3BsaXQgZnJvbSBhc2guYworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgU0hFTExfQ09NTU9OX0gKKyNkZWZpbmUgU0hFTExfQ09NTU9OX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZXh0ZXJuIGNvbnN0IGNoYXIgZGVmaWZzdmFyW107IC8qICJJRlM9IFx0XG4iICovCisjZGVmaW5lIGRlZmlmcyAoZGVmaWZzdmFyICsgNCkKKworaW50IEZBU1RfRlVOQyBpc193ZWxsX2Zvcm1lZF92YXJfbmFtZShjb25zdCBjaGFyICpzLCBjaGFyIHRlcm1pbmF0b3IpOworCisvKiBCdWlsdGlucyAqLworCitlbnVtIHsKKwlCVUlMVElOX1JFQURfU0lMRU5UID0gMSA8PCAwLAorCUJVSUxUSU5fUkVBRF9SQVcgICAgPSAxIDw8IDEsCit9OworY29uc3QgY2hhciogRkFTVF9GVU5DCitzaGVsbF9idWlsdGluX3JlYWQodm9pZCBGQVNUX0ZVTkMgKCpzZXR2YXIpKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCksCisJY2hhciAgICAgICAqKmFyZ3YsCisJY29uc3QgY2hhciAqaWZzLAorCWludCAgICAgICAgcmVhZF9mbGFncywKKwljb25zdCBjaGFyICpvcHRfbiwKKwljb25zdCBjaGFyICpvcHRfcCwKKwljb25zdCBjaGFyICpvcHRfdCwKKwljb25zdCBjaGFyICpvcHRfdQorKTsKKworaW50IEZBU1RfRlVOQworc2hlbGxfYnVpbHRpbl91bGltaXQoY2hhciAqKmFyZ3YpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c2tsb2dkL0NvbmZpZy5pbiBiL3N5c2tsb2dkL0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGZkNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2QvQ29uZmlnLmluCkBAIC0wLDAgKzEsMTU0IEBACisjIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gQ29uZmlnLnNyYworIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzIgorCisKKworY29uZmlnIFNZU0xPR0QKKwlib29sICJzeXNsb2dkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBzeXNsb2dkIHV0aWxpdHkgaXMgdXNlZCB0byByZWNvcmQgbG9ncyBvZiBhbGwgdGhlCisJICBzaWduaWZpY2FudCBldmVudHMgdGhhdCBvY2N1ciBvbiBhIHN5c3RlbS4gRXZlcnkKKwkgIG1lc3NhZ2UgdGhhdCBpcyBsb2dnZWQgcmVjb3JkcyB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUKKwkgIGV2ZW50LCBhbmQgd2lsbCBnZW5lcmFsbHkgYWxzbyByZWNvcmQgdGhlIG5hbWUgb2YgdGhlCisJICBhcHBsaWNhdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4gV2hlbiB1c2VkIGluCisJICBjb25qdW5jdGlvbiB3aXRoIGtsb2dkLCBtZXNzYWdlcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwKKwkgIGNhbiBhbHNvIGJlIHJlY29yZGVkLiBUaGlzIGlzIHRlcnJpYmx5IHVzZWZ1bCwKKwkgIGVzcGVjaWFsbHkgZm9yIGZpbmRpbmcgd2hhdCBoYXBwZW5lZCB3aGVuIHNvbWV0aGluZyBnb2VzCisJICB3cm9uZy4gQW5kIHNvbWV0aGluZyBhbG1vc3QgYWx3YXlzIHdpbGwgZ28gd3JvbmcgaWYKKwkgIHlvdSB3YWl0IGxvbmcgZW5vdWdoLi4uLgorCitjb25maWcgRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWJvb2wgIlJvdGF0ZSBtZXNzYWdlIGZpbGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzeXNsb2dkIHRvIHJvdGF0ZSB0aGUgbWVzc2FnZSBmaWxlcworCSAgb24gaGlzIG93bi4gTm8gbmVlZCB0byB1c2UgYW4gZXh0ZXJuYWwgcm90YXRlc2NyaXB0LgorCitjb25maWcgRkVBVFVSRV9SRU1PVEVfTE9HCisJYm9vbCAiUmVtb3RlIExvZyBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFdoZW4geW91IGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSBzeXNsb2dkIHV0aWxpdHkgY2FuCisJICBiZSB1c2VkIHRvIHNlbmQgc3lzdGVtIGxvZyBtZXNzYWdlcyB0byBhbm90aGVyIHN5c3RlbQorCSAgY29ubmVjdGVkIHZpYSBhIG5ldHdvcmsuIFRoaXMgYWxsb3dzIHRoZSByZW1vdGUKKwkgIG1hY2hpbmUgdG8gbG9nIGFsbCB0aGUgc3lzdGVtIG1lc3NhZ2VzLCB3aGljaCBjYW4gYmUKKwkgIHRlcnJpYmx5IHVzZWZ1bCBmb3IgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBzZXJpYWwKKwkgIGNhYmxlcyB5b3UgdXNlLiBJdCBjYW4gYWxzbyBiZSBhIHZlcnkgZ29vZCBzZWN1cml0eQorCSAgbWVhc3VyZSB0byBwcmV2ZW50IHN5c3RlbSBsb2dzIGZyb20gYmVpbmcgdGFtcGVyZWQgd2l0aAorCSAgYnkgYW4gaW50cnVkZXIuCisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPR0RfRFVQCisJYm9vbCAiU3VwcG9ydCAtRCAoZHJvcCBkdXBzKSBvcHRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTWVNMT0dECisJaGVscAorCSAgT3B0aW9uIC1EIGluc3RydWN0cyBzeXNsb2dkIHRvIGRyb3AgY29uc2VjdXRpdmUgbWVzc2FnZXMKKwkgIHdoaWNoIGFyZSB0b3RhbGx5IHRoZSBzYW1lLgorCitjb25maWcgRkVBVFVSRV9TWVNMT0dEX0NGRworCWJvb2wgIlN1cHBvcnQgc3lzbG9nLmNvbmYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTWVNMT0dECisJaGVscAorCSAgU3VwcG9ydHMgcmVzdHJpY3RlZCBzeXNsb2dkIGNvbmZpZy4gU2VlIGRvY3Mvc3lzbG9nLmNvbmYudHh0CisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRQorCWludCAiUmVhZCBidWZmZXIgc2l6ZSBpbiBieXRlcyIKKwlkZWZhdWx0IDI1NgorCXJhbmdlIDI1NiAyMDAwMAorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIHN5c2xvZyByZWFkIGJ1ZmZlci4KKwkgIEFjdHVhbCBtZW1vcnkgdXNhZ2UgaW5jcmVhc2VzIGFyb3VuZCBmaXZlIHRpbWVzIHRoZQorCSAgY2hhbmdlIGRvbmUgaGVyZS4KKworY29uZmlnIEZFQVRVUkVfSVBDX1NZU0xPRworCWJvb2wgIkNpcmN1bGFyIEJ1ZmZlciBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFdoZW4geW91IGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSBzeXNsb2dkIHV0aWxpdHkgd2lsbAorCSAgdXNlIGEgY2lyY3VsYXIgYnVmZmVyIHRvIHJlY29yZCBzeXN0ZW0gbG9nIG1lc3NhZ2VzLgorCSAgV2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCBpdCB3aWxsIGNvbnRpbnVlIHRvIG92ZXJ3cml0ZQorCSAgdGhlIG9sZGVzdCBtZXNzYWdlcy4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yCisJICBzeXN0ZW1zIHdpdGggbGl0dGxlIG9yIG5vIHBlcm1hbmVudCBzdG9yYWdlLCBzaW5jZQorCSAgb3RoZXJ3aXNlIHN5c3RlbSBsb2dzIGNhbiBldmVudHVhbGx5IGZpbGwgdXAgeW91cgorCSAgZW50aXJlIGZpbGVzeXN0ZW0sIHdoaWNoIG1heSBjYXVzZSB5b3VyIHN5c3RlbSB0bworCSAgYnJlYWsgYmFkbHkuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkUKKwlpbnQgIkNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIEtieXRlcyAobWluaW11bSA0S0IpIgorCWRlZmF1bHQgMTYKKwlyYW5nZSA0IDIxNDc0ODM2NDcKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBDX1NZU0xPRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCSAgdXNlZCB0byByZWNvcmQgc3lzdGVtIGxvZyBtZXNzYWdlcy4KKworY29uZmlnIExPR1JFQUQKKwlib29sICJsb2dyZWFkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUENfU1lTTE9HCisJaGVscAorCSAgSWYgeW91IGVuYWJsZWQgQ2lyY3VsYXIgQnVmZmVyIHN1cHBvcnQsIHlvdSBhbG1vc3QKKwkgIGNlcnRhaW5seSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgYXMgd2VsbC4gVGhpcworCSAgdXRpbGl0eSB3aWxsIGFsbG93IHlvdSB0byByZWFkIHRoZSBtZXNzYWdlcyB0aGF0IGFyZQorCSAgc3RvcmVkIGluIHRoZSBzeXNsb2dkIGNpcmN1bGFyIGJ1ZmZlci4KKworY29uZmlnIEZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcKKwlib29sICJEb3VibGUgYnVmZmVyaW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9HUkVBRAorCWhlbHAKKwkgICdsb2dyZWFkJyBvdXB1dCB0byBzbG93IHNlcmlhbCB0ZXJtaW5hbHMgY2FuIGhhdmUKKwkgIHNpZGUgZWZmZWN0cyBvbiBzeXNsb2cgYmVjYXVzZSBvZiB0aGUgc2VtYXBob3JlLgorCSAgVGhpcyBvcHRpb24gbWFrZSBsb2dyZWFkIHRvIGRvdWJsZSBidWZmZXIgY29weQorCSAgZnJvbSBjaXJjdWxhciBidWZmZXIsIG1pbmltaXppbmcgc2VtYXBob3JlCisJICBjb250ZW50aW9uIGF0IHNvbWUgbWlub3IgbWVtb3J5IGV4cGVuc2UuCisKK2NvbmZpZyBLTE9HRAorCWJvb2wgImtsb2dkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGtsb2dkIGlzIGEgdXRpbGl0eSB3aGljaCBpbnRlcmNlcHRzIGFuZCBsb2dzIGFsbAorCSAgbWVzc2FnZXMgZnJvbSB0aGUgTGludXgga2VybmVsIGFuZCBzZW5kcyB0aGUgbWVzc2FnZXMKKwkgIG91dCB0byB0aGUgJ3N5c2xvZ2QnIHV0aWxpdHkgc28gdGhleSBjYW4gYmUgbG9nZ2VkLiBJZgorCSAgeW91IHdpc2ggdG8gcmVjb3JkIHRoZSBtZXNzYWdlcyBwcm9kdWNlZCBieSB0aGUga2VybmVsLAorCSAgeW91IHNob3VsZCBlbmFibGUgdGhpcyBvcHRpb24uCisKK2NvbmZpZyBGRUFUVVJFX0tMT0dEX0tMT0dDVEwKKwlib29sICJVc2UgdGhlIGtsb2djdGwoKSBpbnRlcmZhY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBLTE9HRAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBrbG9nZCBhcHBsZXQgc3VwcG9ydHMgdHdvIGludGVyZmFjZXMgZm9yIHJlYWRpbmcKKwkgIGtlcm5lbCBtZXNzYWdlcy4gTGludXggcHJvdmlkZXMgdGhlIGtsb2djdGwoKSBpbnRlcmZhY2UKKwkgIHdoaWNoIGFsbG93cyByZWFkaW5nIG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCByaW5nIGJ1ZmZlcgorCSAgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KKworCSAgSWYgeW91IGFuc3dlciAnTicgaGVyZSwga2xvZ2Qgd2lsbCB1c2UgdGhlIG1vcmUgcG9ydGFibGUKKwkgIGFwcHJvYWNoIG9mIHJlYWRpbmcgdGhlbSBmcm9tIC9wcm9jIG9yIGEgZGV2aWNlIG5vZGUuCisJICBIb3dldmVyLCB0aGlzIG1ldGhvZCByZXF1aXJlcyB0aGUgZmlsZSB0byBiZSBhdmFpbGFibGUuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgJ1knLgorCitjb25maWcgTE9HR0VSCisJYm9vbCAibG9nZ2VyIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgICAgVGhlIGxvZ2dlciB1dGlsaXR5IGFsbG93cyB5b3UgdG8gc2VuZCBhcmJpdHJhcnkgdGV4dAorCSAgICBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZyAoaS5lLiB0aGUgJ3N5c2xvZ2QnIHV0aWxpdHkpIHNvCisJICAgIHRoZXkgY2FuIGJlIGxvZ2dlZC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBoZWxwIGxvY2F0ZQorCSAgICBwcm9ibGVtcyB0aGF0IG9jY3VyIHdpdGhpbiBwcm9ncmFtcyBhbmQgc2NyaXB0cy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvc3lza2xvZ2QvQ29uZmlnLnNyYyBiL3N5c2tsb2dkL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhNDk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c2tsb2dkL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwxNTMgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBTWVNMT0dECisJYm9vbCAic3lzbG9nZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgc3lzbG9nZCB1dGlsaXR5IGlzIHVzZWQgdG8gcmVjb3JkIGxvZ3Mgb2YgYWxsIHRoZQorCSAgc2lnbmlmaWNhbnQgZXZlbnRzIHRoYXQgb2NjdXIgb24gYSBzeXN0ZW0uIEV2ZXJ5CisJICBtZXNzYWdlIHRoYXQgaXMgbG9nZ2VkIHJlY29yZHMgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlCisJICBldmVudCwgYW5kIHdpbGwgZ2VuZXJhbGx5IGFsc28gcmVjb3JkIHRoZSBuYW1lIG9mIHRoZQorCSAgYXBwbGljYXRpb24gdGhhdCBnZW5lcmF0ZWQgdGhlIG1lc3NhZ2UuIFdoZW4gdXNlZCBpbgorCSAgY29uanVuY3Rpb24gd2l0aCBrbG9nZCwgbWVzc2FnZXMgZnJvbSB0aGUgTGludXgga2VybmVsCisJICBjYW4gYWxzbyBiZSByZWNvcmRlZC4gVGhpcyBpcyB0ZXJyaWJseSB1c2VmdWwsCisJICBlc3BlY2lhbGx5IGZvciBmaW5kaW5nIHdoYXQgaGFwcGVuZWQgd2hlbiBzb21ldGhpbmcgZ29lcworCSAgd3JvbmcuIEFuZCBzb21ldGhpbmcgYWxtb3N0IGFsd2F5cyB3aWxsIGdvIHdyb25nIGlmCisJICB5b3Ugd2FpdCBsb25nIGVub3VnaC4uLi4KKworY29uZmlnIEZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwlib29sICJSb3RhdGUgbWVzc2FnZSBmaWxlcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNZU0xPR0QKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3lzbG9nZCB0byByb3RhdGUgdGhlIG1lc3NhZ2UgZmlsZXMKKwkgIG9uIGhpcyBvd24uIE5vIG5lZWQgdG8gdXNlIGFuIGV4dGVybmFsIHJvdGF0ZXNjcmlwdC4KKworY29uZmlnIEZFQVRVUkVfUkVNT1RFX0xPRworCWJvb2wgIlJlbW90ZSBMb2cgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNZU0xPR0QKKwloZWxwCisJICBXaGVuIHlvdSBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgc3lzbG9nZCB1dGlsaXR5IGNhbgorCSAgYmUgdXNlZCB0byBzZW5kIHN5c3RlbSBsb2cgbWVzc2FnZXMgdG8gYW5vdGhlciBzeXN0ZW0KKwkgIGNvbm5lY3RlZCB2aWEgYSBuZXR3b3JrLiBUaGlzIGFsbG93cyB0aGUgcmVtb3RlCisJICBtYWNoaW5lIHRvIGxvZyBhbGwgdGhlIHN5c3RlbSBtZXNzYWdlcywgd2hpY2ggY2FuIGJlCisJICB0ZXJyaWJseSB1c2VmdWwgZm9yIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygc2VyaWFsCisJICBjYWJsZXMgeW91IHVzZS4gSXQgY2FuIGFsc28gYmUgYSB2ZXJ5IGdvb2Qgc2VjdXJpdHkKKwkgIG1lYXN1cmUgdG8gcHJldmVudCBzeXN0ZW0gbG9ncyBmcm9tIGJlaW5nIHRhbXBlcmVkIHdpdGgKKwkgIGJ5IGFuIGludHJ1ZGVyLgorCitjb25maWcgRkVBVFVSRV9TWVNMT0dEX0RVUAorCWJvb2wgIlN1cHBvcnQgLUQgKGRyb3AgZHVwcykgb3B0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIE9wdGlvbiAtRCBpbnN0cnVjdHMgc3lzbG9nZCB0byBkcm9wIGNvbnNlY3V0aXZlIG1lc3NhZ2VzCisJICB3aGljaCBhcmUgdG90YWxseSB0aGUgc2FtZS4KKworY29uZmlnIEZFQVRVUkVfU1lTTE9HRF9DRkcKKwlib29sICJTdXBwb3J0IHN5c2xvZy5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFN1cHBvcnRzIHJlc3RyaWN0ZWQgc3lzbG9nZCBjb25maWcuIFNlZSBkb2NzL3N5c2xvZy5jb25mLnR4dAorCitjb25maWcgRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkUKKwlpbnQgIlJlYWQgYnVmZmVyIHNpemUgaW4gYnl0ZXMiCisJZGVmYXVsdCAyNTYKKwlyYW5nZSAyNTYgMjAwMDAKKwlkZXBlbmRzIG9uIFNZU0xPR0QKKwloZWxwCisJICBUaGlzIG9wdGlvbiBzZXRzIHRoZSBzaXplIG9mIHRoZSBzeXNsb2cgcmVhZCBidWZmZXIuCisJICBBY3R1YWwgbWVtb3J5IHVzYWdlIGluY3JlYXNlcyBhcm91bmQgZml2ZSB0aW1lcyB0aGUKKwkgIGNoYW5nZSBkb25lIGhlcmUuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ19TWVNMT0cKKwlib29sICJDaXJjdWxhciBCdWZmZXIgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNZU0xPR0QKKwloZWxwCisJICBXaGVuIHlvdSBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgc3lzbG9nZCB1dGlsaXR5IHdpbGwKKwkgIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlciB0byByZWNvcmQgc3lzdGVtIGxvZyBtZXNzYWdlcy4KKwkgIFdoZW4gdGhlIGJ1ZmZlciBpcyBmaWxsZWQgaXQgd2lsbCBjb250aW51ZSB0byBvdmVyd3JpdGUKKwkgIHRoZSBvbGRlc3QgbWVzc2FnZXMuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIGZvcgorCSAgc3lzdGVtcyB3aXRoIGxpdHRsZSBvciBubyBwZXJtYW5lbnQgc3RvcmFnZSwgc2luY2UKKwkgIG90aGVyd2lzZSBzeXN0ZW0gbG9ncyBjYW4gZXZlbnR1YWxseSBmaWxsIHVwIHlvdXIKKwkgIGVudGlyZSBmaWxlc3lzdGVtLCB3aGljaCBtYXkgY2F1c2UgeW91ciBzeXN0ZW0gdG8KKwkgIGJyZWFrIGJhZGx5LgorCitjb25maWcgRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFCisJaW50ICJDaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBLYnl0ZXMgKG1pbmltdW0gNEtCKSIKKwlkZWZhdWx0IDE2CisJcmFuZ2UgNCAyMTQ3NDgzNjQ3CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQQ19TWVNMT0cKKwloZWxwCisJICBUaGlzIG9wdGlvbiBzZXRzIHRoZSBzaXplIG9mIHRoZSBjaXJjdWxhciBidWZmZXIKKwkgIHVzZWQgdG8gcmVjb3JkIHN5c3RlbSBsb2cgbWVzc2FnZXMuCisKK2NvbmZpZyBMT0dSRUFECisJYm9vbCAibG9ncmVhZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBDX1NZU0xPRworCWhlbHAKKwkgIElmIHlvdSBlbmFibGVkIENpcmN1bGFyIEJ1ZmZlciBzdXBwb3J0LCB5b3UgYWxtb3N0CisJICBjZXJ0YWlubHkgd2FudCB0byBlbmFibGUgdGhpcyBmZWF0dXJlIGFzIHdlbGwuIFRoaXMKKwkgIHV0aWxpdHkgd2lsbCBhbGxvdyB5b3UgdG8gcmVhZCB0aGUgbWVzc2FnZXMgdGhhdCBhcmUKKwkgIHN0b3JlZCBpbiB0aGUgc3lzbG9nZCBjaXJjdWxhciBidWZmZXIuCisKK2NvbmZpZyBGRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HCisJYm9vbCAiRG91YmxlIGJ1ZmZlcmluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPR1JFQUQKKwloZWxwCisJICAnbG9ncmVhZCcgb3VwdXQgdG8gc2xvdyBzZXJpYWwgdGVybWluYWxzIGNhbiBoYXZlCisJICBzaWRlIGVmZmVjdHMgb24gc3lzbG9nIGJlY2F1c2Ugb2YgdGhlIHNlbWFwaG9yZS4KKwkgIFRoaXMgb3B0aW9uIG1ha2UgbG9ncmVhZCB0byBkb3VibGUgYnVmZmVyIGNvcHkKKwkgIGZyb20gY2lyY3VsYXIgYnVmZmVyLCBtaW5pbWl6aW5nIHNlbWFwaG9yZQorCSAgY29udGVudGlvbiBhdCBzb21lIG1pbm9yIG1lbW9yeSBleHBlbnNlLgorCitjb25maWcgS0xPR0QKKwlib29sICJrbG9nZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBrbG9nZCBpcyBhIHV0aWxpdHkgd2hpY2ggaW50ZXJjZXB0cyBhbmQgbG9ncyBhbGwKKwkgIG1lc3NhZ2VzIGZyb20gdGhlIExpbnV4IGtlcm5lbCBhbmQgc2VuZHMgdGhlIG1lc3NhZ2VzCisJICBvdXQgdG8gdGhlICdzeXNsb2dkJyB1dGlsaXR5IHNvIHRoZXkgY2FuIGJlIGxvZ2dlZC4gSWYKKwkgIHlvdSB3aXNoIHRvIHJlY29yZCB0aGUgbWVzc2FnZXMgcHJvZHVjZWQgYnkgdGhlIGtlcm5lbCwKKwkgIHlvdSBzaG91bGQgZW5hYmxlIHRoaXMgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9LTE9HRF9LTE9HQ1RMCisJYm9vbCAiVXNlIHRoZSBrbG9nY3RsKCkgaW50ZXJmYWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gS0xPR0QKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUga2xvZ2QgYXBwbGV0IHN1cHBvcnRzIHR3byBpbnRlcmZhY2VzIGZvciByZWFkaW5nCisJICBrZXJuZWwgbWVzc2FnZXMuIExpbnV4IHByb3ZpZGVzIHRoZSBrbG9nY3RsKCkgaW50ZXJmYWNlCisJICB3aGljaCBhbGxvd3MgcmVhZGluZyBtZXNzYWdlcyBmcm9tIHRoZSBrZXJuZWwgcmluZyBidWZmZXIKKwkgIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCisKKwkgIElmIHlvdSBhbnN3ZXIgJ04nIGhlcmUsIGtsb2dkIHdpbGwgdXNlIHRoZSBtb3JlIHBvcnRhYmxlCisJICBhcHByb2FjaCBvZiByZWFkaW5nIHRoZW0gZnJvbSAvcHJvYyBvciBhIGRldmljZSBub2RlLgorCSAgSG93ZXZlciwgdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhlIGZpbGUgdG8gYmUgYXZhaWxhYmxlLgorCisJICBJZiBpbiBkb3VidCwgc2F5ICdZJy4KKworY29uZmlnIExPR0dFUgorCWJvb2wgImxvZ2dlciIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICAgIFRoZSBsb2dnZXIgdXRpbGl0eSBhbGxvd3MgeW91IHRvIHNlbmQgYXJiaXRyYXJ5IHRleHQKKwkgICAgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cgKGkuZS4gdGhlICdzeXNsb2dkJyB1dGlsaXR5KSBzbworCSAgICB0aGV5IGNhbiBiZSBsb2dnZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gaGVscCBsb2NhdGUKKwkgICAgcHJvYmxlbXMgdGhhdCBvY2N1ciB3aXRoaW4gcHJvZ3JhbXMgYW5kIHNjcmlwdHMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3N5c2tsb2dkL0tidWlsZC5zcmMgYi9zeXNrbG9nZC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODZjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNrbG9nZC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTMgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0tMT0dEKQkJKz0ga2xvZ2QubworbGliLSQoQ09ORklHX0xPR0dFUikJCSs9IHN5c2xvZ2RfYW5kX2xvZ2dlci5vCitsaWItJChDT05GSUdfTE9HUkVBRCkJCSs9IGxvZ3JlYWQubworbGliLSQoQ09ORklHX1NZU0xPR0QpCQkrPSBzeXNsb2dkX2FuZF9sb2dnZXIubwpkaWZmIC0tZ2l0IGEvc3lza2xvZ2Qva2xvZ2QuYyBiL3N5c2tsb2dkL2tsb2dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhMGU1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c2tsb2dkL2tsb2dkLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkga2xvZ2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPi4KKyAqIENoYW5nZXM6IE1hZGUgdGhpcyBhIHN0YW5kYWxvbmUgYnVzeWJveCBtb2R1bGUgd2hpY2ggdXNlcyBzdGFuZGFsb25lCisgKiBzeXNsb2coKSBjbGllbnQgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgS2FybCBNLiBIZWdibG9vbSA8a2FybGhlZ0BkZWJpYW4ub3JnPgorICoKKyAqICJjaXJjdWxhciBidWZmZXIiIENvcHlyaWdodCAoQykgMjAwMCBieSBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+CisgKgorICogTWFpbnRhaW5lcjogR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPiBhcyBvZiBNYXIgMTIsIDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBrbG9nZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIE5dIFstbl0iCisvL3VzYWdlOiNkZWZpbmUga2xvZ2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJLZXJuZWwgbG9nZ2VyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIE4JUHJpbnQgdG8gY29uc29sZSBtZXNzYWdlcyBtb3JlIHVyZ2VudCB0aGFuIHByaW8gTiAoMS04KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUnVuIGluIGZvcmVncm91bmQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisKKy8qIFRoZSBMaW51eC1zcGVjaWZpYyBrbG9nY3RsKDMpIGludGVyZmFjZSBkb2VzIG5vdCByZWx5IG9uIHRoZSBmaWxlc3lzdGVtIGFuZAorICogYWxsb3dzIHVzIHRvIGNoYW5nZSB0aGUgY29uc29sZSBsb2dsZXZlbC4gQWx0ZXJuYXRpdmVseSwgd2UgcmVhZCB0aGUKKyAqIG1lc3NhZ2VzIGZyb20gX1BBVEhfS0xPRy4gKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0tMT0dEX0tMT0dDVEwKKworIyBpbmNsdWRlIDxzeXMva2xvZy5oPgorCitzdGF0aWMgdm9pZCBrbG9nZF9vcGVuKHZvaWQpCit7CisJLyogIk9wZW4gdGhlIGxvZy4gQ3VycmVudGx5IGEgTk9QIiAqLworCWtsb2djdGwoMSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGtsb2dkX3NldGxvZ2xldmVsKGludCBsdmwpCit7CisJLyogInByaW50aygpIHByaW50cyBhIG1lc3NhZ2Ugb24gdGhlIGNvbnNvbGUgb25seSBpZiBpdCBoYXMgYSBsb2dsZXZlbAorCSAqIGxlc3MgdGhhbiBjb25zb2xlX2xvZ2xldmVsIi4gSGVyZSB3ZSBzZXQgY29uc29sZV9sb2dsZXZlbCA9IGx2bC4gKi8KKwlrbG9nY3RsKDgsIE5VTEwsIGx2bCk7Cit9CisKK3N0YXRpYyBpbnQga2xvZ2RfcmVhZChjaGFyICpidWZwLCBpbnQgbGVuKQoreworCXJldHVybiBrbG9nY3RsKDIsIGJ1ZnAsIGxlbik7Cit9CisjIGRlZmluZSBSRUFEX0VSUk9SICJrbG9nY3RsKDIpIGVycm9yIgorCitzdGF0aWMgdm9pZCBrbG9nZF9jbG9zZSh2b2lkKQoreworCS8qIEZZSTogY21kIDcgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGNvbnNvbGVfbG9nbGV2ZWwgdG8gNworCSAqIHZpYSBrbG9nY3RsKDgsIE5VTEwsIDcpLiAqLworCWtsb2djdGwoNywgTlVMTCwgMCk7IC8qICI3IC0tIEVuYWJsZSBwcmludGsncyB0byBjb25zb2xlIiAqLworCWtsb2djdGwoMCwgTlVMTCwgMCk7IC8qICIwIC0tIENsb3NlIHRoZSBsb2cuIEN1cnJlbnRseSBhIE5PUCIgKi8KK30KKworI2Vsc2UKKworIyBpbmNsdWRlIDxwYXRocy5oPgorIyBpZm5kZWYgX1BBVEhfS0xPRworIyAgaWZkZWYgX19HTlVfXworIyAgIGRlZmluZSBfUEFUSF9LTE9HICIvZGV2L2tsb2ciCisjICBlbHNlCisjICAgZXJyb3IgInlvdXIgc3lzdGVtJ3MgX1BBVEhfS0xPRyBpcyB1bmtub3duIgorIyAgZW5kaWYKKyMgZW5kaWYKKyMgZGVmaW5lIFBBVEhfUFJJTlRLICIvcHJvYy9zeXMva2VybmVsL3ByaW50ayIKKworZW51bSB7IGtsb2dmZCA9IDMgfTsKKworc3RhdGljIHZvaWQga2xvZ2Rfb3Blbih2b2lkKQoreworCWludCBmZCA9IHhvcGVuKF9QQVRIX0tMT0csIE9fUkRPTkxZKTsKKwl4bW92ZV9mZChmZCwga2xvZ2ZkKTsKK30KKworc3RhdGljIHZvaWQga2xvZ2Rfc2V0bG9nbGV2ZWwoaW50IGx2bCkKK3sKKwlGSUxFICpmcCA9IGZvcGVuX29yX3dhcm4oUEFUSF9QUklOVEssICJ3Iik7CisJaWYgKGZwKSB7CisJCS8qIFRoaXMgY2hhbmdlcyBvbmx5IGZpcnN0IHZhbHVlOgorCQkgKiAibWVzc2FnZXMgd2l0aCBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoaXMKKwkJICogW3RoYXQgaXMsIHdpdGggbnVtZXJpY2FsbHkgbG93ZXIgdmFsdWVdCisJCSAqIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSIuCisJCSAqIFRoZSBvdGhlciB0aHJlZSB2YWx1ZXMgaW4gdGhpcyBwc2V1ZG8tZmlsZSBhcmVuJ3QgY2hhbmdlZC4KKwkJICovCisJCWZwcmludGYoZnAsICIldVxuIiwgbHZsKTsKKwkJZmNsb3NlKGZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQga2xvZ2RfcmVhZChjaGFyICpidWZwLCBpbnQgbGVuKQoreworCXJldHVybiByZWFkKGtsb2dmZCwgYnVmcCwgbGVuKTsKK30KKyMgZGVmaW5lIFJFQURfRVJST1IgInJlYWQgZXJyb3IiCisKK3N0YXRpYyB2b2lkIGtsb2dkX2Nsb3NlKHZvaWQpCit7CisJa2xvZ2Rfc2V0bG9nbGV2ZWwoNyk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShrbG9nZmQpOworfQorCisjZW5kaWYKKworI2RlZmluZSBsb2dfYnVmZmVyIGJiX2NvbW1vbl9idWZzaXoxCitlbnVtIHsKKwlLTE9HRF9MT0dCVUZfU0laRSA9IHNpemVvZihsb2dfYnVmZmVyKSwKKwlPUFRfTEVWRUwgICAgICA9ICgxIDw8IDApLAorCU9QVF9GT1JFR1JPVU5EID0gKDEgPDwgMSksCit9OworCisvKiBUT0RPOiBnbGliYyBvcGVubG9nKExPR19LRVJOKSByZXZlcnRzIHRvIExPR19VU0VSIGluc3RlYWQsCisgKiBiZWNhdXNlIHRoYXQncyBob3cgdGhleSBpbnRlcnByZXQgd29yZCAiZGVmYXVsdCIKKyAqIGluIHRoZSBvcGVubG9nKCkgbWFucGFnZToKKyAqICAgICAgTE9HX1VTRVIgKGRlZmF1bHQpCisgKiAgICAgICAgICAgICAgZ2VuZXJpYyB1c2VyLWxldmVsIG1lc3NhZ2VzCisgKiBhbmQgdGhlIGZhY3QgdGhhdCBMT0dfS0VSTiBpcyBhIGNvbnN0YW50IDAuCisgKiBnbGliYyBpbnRlcnByZXRzIGl0IGFzICIwIGluIG9wZW5sb2coKSBjYWxsIG1lYW5zICd1c2UgZGVmYXVsdCciLgorICogSSB0aGluayBpdCBtZWFucyAiaWYgb3BlbmxvZyB3YXNuJ3QgY2FsbGVkIGJlZm9yZSBzeXNsb2coKSBpcyBjYWxsZWQsCisgKiB1c2UgZGVmYXVsdCIuCisgKiBDb252aW5jaW5nIGdsaWJjIG1haW50YWluZXJzIG90aGVyd2lzZSBpcywgYXMgdXN1YWwsIG5lYXJseSBpbXBvc3NpYmxlLgorICogU2hvdWxkIHdlIG9wZW4tY29kZSBzeXNsb2coKSBoZXJlIHRvIHVzZSBjb3JyZWN0IGZhY2lsaXR5PworICovCisKK2ludCBrbG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQga2xvZ2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpID0gMDsKKwljaGFyICpvcHRfYzsKKwlpbnQgb3B0OworCWludCB1c2VkOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImM6biIsICZvcHRfYyk7CisJaWYgKG9wdCAmIE9QVF9MRVZFTCkgeworCQkvKiBWYWxpZCBsZXZlbHMgYXJlIGJldHdlZW4gMSBhbmQgOCAqLworCQlpID0geGF0b3VfcmFuZ2Uob3B0X2MsIDEsIDgpOworCX0KKwlpZiAoIShvcHQgJiBPUFRfRk9SRUdST1VORCkpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DSERJUl9ST09ULCBhcmd2KTsKKwl9CisKKwlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisKKwkvKiBrbG9nZF9vcGVuKCkgYmVmb3JlIG9wZW5sb2coKSwgc2luY2UgaXQgbWlnaHQgdXNlIGZpeGVkIGZkIDMsCisJICogYW5kIG9wZW5sb2coKSBhbHNvIG1heSB1c2UgdGhlIHNhbWUgZmQgMyBpZiB3ZSBzd2FwIHRoZW06CisJICovCisJa2xvZ2Rfb3BlbigpOworCW9wZW5sb2coImtlcm5lbCIsIDAsIExPR19LRVJOKTsKKwkvKgorCSAqIGdsaWJjIHByb2JsZW06IGZvciBzb21lIHJlYXNvbiwgZ2xpYmMgY2hhbmdlcyBMT0dfS0VSTiB0byBMT0dfVVNFUgorCSAqIGFib3ZlLiBUaGUgbG9naWMgYmVoaW5kIHRoaXMgaXMgdGhhdCBzdGFuZGFyZAorCSAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2Z1bmN0aW9ucy9zeXNsb2cuaHRtbAorCSAqIHNheXMgdGhlIGZvbGxvd2luZyBhYm91dCBvcGVubG9nIGFuZCBzeXNsb2c6CisJICogIkxPR19VU0VSCisJICogIE1lc3NhZ2VzIGdlbmVyYXRlZCBieSBhcmJpdHJhcnkgcHJvY2Vzc2VzLgorCSAqICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZhY2lsaXR5IGlkZW50aWZpZXIgaWYgbm9uZSBpcyBzcGVjaWZpZWQuIgorCSAqCisJICogSSBiZWxpZXZlIGdsaWJjIG1pc2ludGVycHJldGVkIHRoaXMgdGV4dCBhcyAiaWYgb3BlbmxvZydzCisJICogdGhpcmQgcGFyYW1ldGVyIGlzIDAgKD1MT0dfS0VSTiksIHRyZWF0IGl0IGFzIExPR19VU0VSIi4KKwkgKiBXaGVyZWFzIGl0IHdhcyBtZWFudCB0byBzYXkgImlmICpzeXNsb2cqIGlzIGNhbGxlZCB3aXRoIGZhY2lsaXR5CisJICogMCBpbiBpdHMgMXN0IHBhcmFtZXRlciB3aXRob3V0IHByaW9yIGNhbGwgdG8gb3BlbmxvZywgdGhlbiBwZXJmb3JtCisJICogaW1wbGljaXQgb3BlbmxvZyhMT0dfVVNFUikiLgorCSAqCisJICogQXMgYSByZXN1bHQgb2YgdGhpcywgZWgsIGZlYXR1cmUsIHN0YW5kYXJkIGtsb2dkIHdhcyBmb3JjZWQKKwkgKiB0byBvcGVuLWNvZGUgaXRzIG93biBvcGVubG9nIGFuZCBzeXNsb2cgaW1wbGVtZW50YXRpb24gKCEpLgorCSAqCisJICogTm90ZSB0aGF0IHByb2hpYml0aW5nIG9wZW5sb2coTE9HX0tFUk4pIG9uIGxpYmMgbGV2ZWwgZG9lcyBub3QKKwkgKiBhZGQgYW55IHNlY3VyaXR5OiBhbnkgcHJvY2VzcyBjYW4gb3BlbiBhIHNvY2tldCB0byAiL2Rldi9sb2ciCisJICogYW5kIHdyaXRlIGEgc3RyaW5nICI8MD5Wb2lsYSwgYSBMT0dfS0VSTiArIExPR19FTUVSRyBtZXNzYWdlIgorCSAqCisJICogR29vZ2xlIGNvZGUgc2VhcmNoIHRlbGxzIG1lIHRoZXJlIGlzIG5vIHdpZGVzcHJlYWQgdXNlIG9mCisJICogb3BlbmxvZygiZm9vIiwgMCwgMCksIHRodXMgZml4aW5nIGdsaWJjIHdvbid0IGJyZWFrIHVzZXJzcGFjZS4KKwkgKgorCSAqIFRoZSBidWcgYWdhaW5zdCBnbGliYyB3YXMgZmlsZWQ6CisJICogYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MDAwCisJICovCisKKwlpZiAoaSkKKwkJa2xvZ2Rfc2V0bG9nbGV2ZWwoaSk7CisKKwlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwkvKiBXZSB3YW50IGtsb2dkX3JlYWQgdG8gbm90IGJlIHJlc3RhcnRlZCwgdGh1cyBfbm9yZXN0YXJ0OiAqLworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydChCQl9GQVRBTF9TSUdTLCByZWNvcmRfc2lnbm8pOworCisJc3lzbG9nKExPR19OT1RJQ0UsICJrbG9nZCBzdGFydGVkOiAlcyIsIGJiX2Jhbm5lcik7CisKKwl1c2VkID0gMDsKKwl3aGlsZSAoIWJiX2dvdF9zaWduYWwpIHsKKwkJaW50IG47CisJCWludCBwcmlvcml0eTsKKwkJY2hhciAqc3RhcnQ7CisKKwkJLyogIjIgLS0gUmVhZCBmcm9tIHRoZSBsb2cuIiAqLworCQlzdGFydCA9IGxvZ19idWZmZXIgKyB1c2VkOworCQluID0ga2xvZ2RfcmVhZChzdGFydCwgS0xPR0RfTE9HQlVGX1NJWkUtMSAtIHVzZWQpOworCQlpZiAobiA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWJiX3BlcnJvcl9tc2coUkVBRF9FUlJPUik7CisJCQlicmVhazsKKwkJfQorCQlzdGFydFtuXSA9ICdcMCc7CisKKwkJLyogUHJvY2VzcyBlYWNoIG5ld2xpbmUtdGVybWluYXRlZCBsaW5lIGluIHRoZSBidWZmZXIgKi8KKwkJc3RhcnQgPSBsb2dfYnVmZmVyOworCQl3aGlsZSAoMSkgeworCQkJY2hhciAqbmV3bGluZSA9IHN0cmNocm51bChzdGFydCwgJ1xuJyk7CisKKwkJCWlmICgqbmV3bGluZSA9PSAnXDAnKSB7CisJCQkJLyogVGhpcyBsaW5lIGlzIGluY29tcGxldGUgKi8KKworCQkJCS8qIG1vdmUgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBidWZmZXIgKi8KKwkJCQlvdmVybGFwcGluZ19zdHJjcHkobG9nX2J1ZmZlciwgc3RhcnQpOworCQkJCXVzZWQgPSBuZXdsaW5lIC0gc3RhcnQ7CisJCQkJaWYgKHVzZWQgPCBLTE9HRF9MT0dCVUZfU0laRS0xKSB7CisJCQkJCS8qIGJ1ZmZlciBpc24ndCBmdWxsICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBidWZmZXIgaXMgZnVsbCwgbG9nIGl0IGFueXdheSAqLworCQkJCXVzZWQgPSAwOworCQkJCW5ld2xpbmUgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQkqbmV3bGluZSsrID0gJ1wwJzsKKwkJCX0KKworCQkJLyogRXh0cmFjdCB0aGUgcHJpb3JpdHkgKi8KKwkJCXByaW9yaXR5ID0gTE9HX0lORk87CisJCQlpZiAoKnN0YXJ0ID09ICc8JykgeworCQkJCXN0YXJ0Kys7CisJCQkJaWYgKCpzdGFydCkgeworCQkJCQkvKiBrZXJuZWwgbmV2ZXIgZ2VuZXJhdGVzIG11bHRpLWRpZ2l0IHByaW9zICovCisJCQkJCXByaW9yaXR5ID0gKCpzdGFydCAtICcwJyk7CisJCQkJCXN0YXJ0Kys7CisJCQkJfQorCQkJCWlmICgqc3RhcnQgPT0gJz4nKQorCQkJCQlzdGFydCsrOworCQkJfQorCQkJLyogTG9nIChvbmx5IG5vbi1lbXB0eSBsaW5lcykgKi8KKwkJCWlmICgqc3RhcnQpCisJCQkJc3lzbG9nKHByaW9yaXR5LCAiJXMiLCBzdGFydCk7CisKKwkJCWlmICghbmV3bGluZSkKKwkJCQlicmVhazsKKwkJCXN0YXJ0ID0gbmV3bGluZTsKKwkJfQorCX0KKworCWtsb2dkX2Nsb3NlKCk7CisJc3lzbG9nKExPR19OT1RJQ0UsICJrbG9nZDogZXhpdGluZyIpOworCWlmIChiYl9nb3Rfc2lnbmFsKQorCQlraWxsX215c2VsZl93aXRoX3NpZyhiYl9nb3Rfc2lnbmFsKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvc3lza2xvZ2QvbG9nZ2VyLmMgYi9zeXNrbG9nZC9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTcwMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2QvbG9nZ2VyLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbG9nZ2VyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvZ2dlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtNRVNTQUdFXSIKKy8vdXNhZ2U6I2RlZmluZSBsb2dnZXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXcml0ZSBNRVNTQUdFIChvciBzdGRpbikgdG8gc3lzbG9nXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCUxvZyB0byBzdGRlcnIgYXMgd2VsbCBhcyB0aGUgc3lzdGVtIGxvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgVEFHCUxvZyB1c2luZyB0aGUgc3BlY2lmaWVkIHRhZyAoZGVmYXVsdHMgdG8gdXNlciBuYW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUFJJTwlQcmlvcml0eSAobnVtZXJpYyBvciBmYWNpbGl0eS5sZXZlbCBwYWlyKSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbG9nZ2VyX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxvZ2dlciBcImhlbGxvXCJcbiIKKworLyoKKyAqIERvbmUgaW4gc3lzbG9nZF9hbmRfbG9nZ2VyLmM6CisjaW5jbHVkZSAibGliYmIuaCIKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjZGVmaW5lIFNZU0xPR19OQU1FU19DT05TVAorI2luY2x1ZGUgPHN5c2xvZy5oPgorKi8KKworLyogRGVjb2RlIGEgc3ltYm9saWMgbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gY29kZQorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCitzdGF0aWMgaW50IGRlY29kZShjaGFyICpuYW1lLCBjb25zdCBDT0RFICpjb2RldGFiKQoreworCWNvbnN0IENPREUgKmM7CisKKwlpZiAoaXNkaWdpdCgqbmFtZSkpCisJCXJldHVybiBhdG9pKG5hbWUpOworCWZvciAoYyA9IGNvZGV0YWI7IGMtPmNfbmFtZTsgYysrKSB7CisJCWlmICghc3RyY2FzZWNtcChuYW1lLCBjLT5jX25hbWUpKSB7CisJCQlyZXR1cm4gYy0+Y192YWw7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIERlY29kZSBhIHN5bWJvbGljIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworc3RhdGljIGludCBwZW5jb2RlKGNoYXIgKnMpCit7CisJY2hhciAqc2F2ZTsKKwlpbnQgbGV2LCBmYWMgPSBMT0dfVVNFUjsKKworCWZvciAoc2F2ZSA9IHM7ICpzICYmICpzICE9ICcuJzsgKytzKQorCQk7CisJaWYgKCpzKSB7CisJCSpzID0gJ1wwJzsKKwkJZmFjID0gZGVjb2RlKHNhdmUsIGZhY2lsaXR5bmFtZXMpOworCQlpZiAoZmFjIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duICVzIG5hbWU6ICVzIiwgImZhY2lsaXR5Iiwgc2F2ZSk7CisJCSpzKysgPSAnLic7CisJfSBlbHNlIHsKKwkJcyA9IHNhdmU7CisJfQorCWxldiA9IGRlY29kZShzLCBwcmlvcml0eW5hbWVzKTsKKwlpZiAobGV2IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gJXMgbmFtZTogJXMiLCAicHJpb3JpdHkiLCBzYXZlKTsKKwlyZXR1cm4gKChsZXYgJiBMT0dfUFJJTUFTSykgfCAoZmFjICYgTE9HX0ZBQ01BU0spKTsKK30KKworI2RlZmluZSBzdHJidWYgYmJfY29tbW9uX2J1ZnNpejEKKworaW50IGxvZ2dlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9nZ2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpzdHJfcCwgKnN0cl90OworCWludCBvcHQ7CisJaW50IGkgPSAwOworCisJLyogRmlsbCBvdXQgdGhlIG5hbWUgc3RyaW5nIGVhcmx5IChtYXkgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIpICovCisJc3RyX3QgPSB1aWQydW5hbWVfdXRvYShnZXRldWlkKCkpOworCisJLyogUGFyc2UgYW55IG9wdGlvbnMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicDpzdDoiLCAmc3RyX3AsICZzdHJfdCk7CisKKwlpZiAob3B0ICYgMHgyKSAvKiAtcyAqLworCQlpIHw9IExPR19QRVJST1I7CisJLy9pZiAob3B0ICYgMHg0KSAvKiAtdCAqLworCW9wZW5sb2coc3RyX3QsIGksIDApOworCWkgPSBMT0dfVVNFUiB8IExPR19OT1RJQ0U7CisJaWYgKG9wdCAmIDB4MSkgLyogLXAgKi8KKwkJaSA9IHBlbmNvZGUoc3RyX3ApOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKSB7CisJCXdoaWxlIChmZ2V0cyhzdHJidWYsIENPTU1PTl9CVUZTSVpFLCBzdGRpbikpIHsKKwkJCWlmIChzdHJidWZbMF0KKwkJCSAmJiBOT1RfTE9ORV9DSEFSKHN0cmJ1ZiwgJ1xuJykKKwkJCSkgeworCQkJCS8qIE5laXRoZXIgIiIgbm9yICJcbiIgKi8KKwkJCQlzeXNsb2coaSwgIiVzIiwgc3RyYnVmKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNoYXIgKm1lc3NhZ2UgPSBOVUxMOworCQlpbnQgbGVuID0gMDsKKwkJaW50IHBvcyA9IDA7CisJCWRvIHsKKwkJCWxlbiArPSBzdHJsZW4oKmFyZ3YpICsgMTsKKwkJCW1lc3NhZ2UgPSB4cmVhbGxvYyhtZXNzYWdlLCBsZW4gKyAxKTsKKwkJCXNwcmludGYobWVzc2FnZSArIHBvcywgIiAlcyIsICphcmd2KSwKKwkJCXBvcyA9IGxlbjsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJCXN5c2xvZyhpLCAiJXMiLCBtZXNzYWdlICsgMSk7IC8qIHNraXAgbGVhZGluZyAiICIgKi8KKwl9CisKKwljbG9zZWxvZygpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8qIENsZWFuIHVwLiBOZWVkZWQgYmVjYXVzZSB3ZSBhcmUgaW5jbHVkZWQgZnJvbSBzeXNsb2dkX2FuZF9sb2dnZXIuYyAqLworI3VuZGVmIHN0cmJ1ZgorCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbGljZW5zZSBzdGF0ZW1lbnQgZm9yIHRoZSBkZWNvZGUgYW5kIHBlbmNvZGUgZnVuY3Rpb25zLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICogICAgZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZQorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL3N5c2tsb2dkL2xvZ3JlYWQuYyBiL3N5c2tsb2dkL2xvZ3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM5NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2QvbG9ncmVhZC5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaXJjdWxhciBidWZmZXIgc3lzbG9nIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKyAqCisgKiBNYWludGFpbmVyOiBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+IGFzIG9mIE1hciAxMiwgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvZ3JlYWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZl0iCisvL3VzYWdlOiNkZWZpbmUgbG9ncmVhZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgbWVzc2FnZXMgaW4gc3lzbG9nZCdzIGNpcmN1bGFyIGJ1ZmZlclxuIgorLy91c2FnZTogICAgICJcbgktZglPdXRwdXQgZGF0YSBhcyBsb2cgZ3Jvd3MiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorCisjZGVmaW5lIERFQlVHIDAKKworLyogb3VyIHNoYXJlZCBrZXkgKHN5c2xvZ2QuYyBhbmQgbG9ncmVhZC5jIG11c3QgYmUgaW4gc3luYykgKi8KK2VudW0geyBLRVlfSUQgPSAweDQxNGU0NTQ3IH07IC8qICJHRU5BIiAqLworCitzdHJ1Y3Qgc2hidWZfZHMgeworCWludDMyX3Qgc2l6ZTsgICAgICAgICAgIC8vIHNpemUgb2YgZGF0YSAtIDEKKwlpbnQzMl90IHRhaWw7ICAgICAgICAgICAvLyBlbmQgb2YgbWVzc2FnZSBsaXN0CisJY2hhciBkYXRhWzFdOyAgICAgICAgICAgLy8gbWVzc2FnZXMKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VtYnVmIGluaXRfc2VtWzNdID0geworCXswLCAtMSwgSVBDX05PV0FJVCB8IFNFTV9VTkRPfSwKKwl7MSwgMH0sIHswLCArMSwgU0VNX1VORE99Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IHNlbWJ1ZiBTTXJ1cFsxXTsgLy8gezAsIC0xLCBJUENfTk9XQUlUIHwgU0VNX1VORE99LAorCXN0cnVjdCBzZW1idWYgU01yZG5bMl07IC8vIHsxLCAwfSwgezAsICsxLCBTRU1fVU5ET30KKwlzdHJ1Y3Qgc2hidWZfZHMgKnNoYnVmOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgU01ydXAgKEcuU01ydXApCisjZGVmaW5lIFNNcmRuIChHLlNNcmRuKQorI2RlZmluZSBzaGJ1ZiAoRy5zaGJ1ZikKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJbWVtY3B5KFNNcnVwLCBpbml0X3NlbSwgc2l6ZW9mKGluaXRfc2VtKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGVycm9yX2V4aXQoY29uc3QgY2hhciAqc3RyKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGVycm9yX2V4aXQoY29uc3QgY2hhciAqc3RyKQoreworCS8vcmVsZWFzZSBhbGwgYWNxdWlyZWQgcmVzb3VyY2VzCisJc2htZHQoc2hidWYpOworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShzdHIpOworfQorCisvKgorICogc2VtX3VwIC0gdXAoKSdzIGEgc2VtYXBob3JlLgorICovCitzdGF0aWMgdm9pZCBzZW1fdXAoaW50IHNlbWlkKQoreworCWlmIChzZW1vcChzZW1pZCwgU01ydXAsIDEpID09IC0xKQorCQllcnJvcl9leGl0KCJzZW1vcFtTTXJ1cF0iKTsKK30KKworc3RhdGljIHZvaWQgaW50ZXJydXB0ZWQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJc2htZHQoc2hidWYpOworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworaW50IGxvZ3JlYWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxvZ3JlYWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGN1cjsKKwlpbnQgbG9nX3NlbWlkOyAvKiBpcGMgc2VtYXBob3JlIGlkICovCisJaW50IGxvZ19zaG1pZDsgLyogaXBjIHNoYXJlZCBtZW1vcnkgaWQgKi8KKwlzbWFsbGludCBmb2xsb3cgPSBnZXRvcHQzMihhcmd2LCAiZiIpOworCisJSU5JVF9HKCk7CisKKwlsb2dfc2htaWQgPSBzaG1nZXQoS0VZX0lELCAwLCAwKTsKKwlpZiAobG9nX3NobWlkID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgc3lzbG9nZCBidWZmZXIiKTsKKworCS8qIEF0dGFjaCBzaGFyZWQgbWVtb3J5IHRvIG91ciBjaGFyKiAqLworCXNoYnVmID0gc2htYXQobG9nX3NobWlkLCBOVUxMLCBTSE1fUkRPTkxZKTsKKwlpZiAoc2hidWYgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBhY2Nlc3Mgc3lzbG9nZCBidWZmZXIiKTsKKworCWxvZ19zZW1pZCA9IHNlbWdldChLRVlfSUQsIDAsIDApOworCWlmIChsb2dfc2VtaWQgPT0gLTEpCisJCWVycm9yX2V4aXQoImNhbid0IGdldCBhY2Nlc3MgdG8gc2VtYXBob3JlcyBmb3Igc3lzbG9nZCBidWZmZXIiKTsKKworCXNpZ25hbChTSUdJTlQsIGludGVycnVwdGVkKTsKKworCS8qIFN1cHBvc2UgYXRvbWljIG1lbW9yeSByZWFkICovCisJLyogTWF4IHBvc3NpYmxlIHZhbHVlIGZvciB0YWlsIGlzIHNoYnVmLT5zaXplIC0gMSAqLworCWN1ciA9IHNoYnVmLT50YWlsOworCisJLyogTG9vcCBmb3IgbG9ncmVhZCAtZiwgb25lIHBhc3MgaWYgdGhlcmUgd2FzIG5vIC1mICovCisJZG8geworCQl1bnNpZ25lZCBzaGJ1Zl9zaXplOworCQl1bnNpZ25lZCBzaGJ1Zl90YWlsOworCQljb25zdCBjaGFyICpzaGJ1Zl9kYXRhOworI2lmIEVOQUJMRV9GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HCisJCWludCBpOworCQlpbnQgbGVuX2ZpcnN0X3BhcnQ7CisJCWludCBsZW5fdG90YWwgPSBsZW5fdG90YWw7IC8qIGZvciBnY2MgKi8KKwkJY2hhciAqY29weSA9IGNvcHk7IC8qIGZvciBnY2MgKi8KKyNlbmRpZgorCQlpZiAoc2Vtb3AobG9nX3NlbWlkLCBTTXJkbiwgMikgPT0gLTEpCisJCQllcnJvcl9leGl0KCJzZW1vcFtTTXJkbl0iKTsKKworCQkvKiBDb3B5IHRoZSBpbmZvLCBoZWxwcyBnY2MgdG8gcmVhbGl6ZSB0aGF0IGl0IGRvZXNuJ3QgY2hhbmdlICovCisJCXNoYnVmX3NpemUgPSBzaGJ1Zi0+c2l6ZTsKKwkJc2hidWZfdGFpbCA9IHNoYnVmLT50YWlsOworCQlzaGJ1Zl9kYXRhID0gc2hidWYtPmRhdGE7IC8qIHBvaW50ZXIhICovCisKKwkJaWYgKERFQlVHKQorCQkJcHJpbnRmKCJjdXI6JWQgdGFpbDolaSBzaXplOiVpXG4iLAorCQkJCQljdXIsIHNoYnVmX3RhaWwsIHNoYnVmX3NpemUpOworCisJCWlmICghZm9sbG93KSB7CisJCQkvKiBhZHZhbmNlIHRvIG9sZGVzdCBjb21wbGV0ZSBtZXNzYWdlICovCisJCQkvKiBmaW5kIE5VTCAqLworCQkJY3VyICs9IHN0cmxlbihzaGJ1Zl9kYXRhICsgY3VyKTsKKwkJCWlmIChjdXIgPj0gc2hidWZfc2l6ZSkgeyAvKiBsYXN0IGJ5dGUgaW4gYnVmZmVyPyAqLworCQkJCWN1ciA9IHN0cm5sZW4oc2hidWZfZGF0YSwgc2hidWZfdGFpbCk7CisJCQkJaWYgKGN1ciA9PSBzaGJ1Zl90YWlsKQorCQkJCQlnb3RvIHVubG9jazsgLyogbm8gY29tcGxldGUgbWVzc2FnZXMgKi8KKwkJCX0KKwkJCS8qIGFkdmFuY2UgdG8gZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSAqLworCQkJY3VyKys7CisJCQlpZiAoY3VyID49IHNoYnVmX3NpemUpIC8qIGxhc3QgYnl0ZSBpbiBidWZmZXI/ICovCisJCQkJY3VyID0gMDsKKwkJfSBlbHNlIHsgLyogbG9ncmVhZCAtZiAqLworCQkJaWYgKGN1ciA9PSBzaGJ1Zl90YWlsKSB7CisJCQkJc2VtX3VwKGxvZ19zZW1pZCk7CisJCQkJZmZsdXNoX2FsbCgpOworCQkJCXNsZWVwKDEpOyAvKiBUT0RPOiByZXBsYWNlIG1lIHdpdGggYSBzbGVlcF9vbiAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogUmVhZCBmcm9tIGN1ciB0byB0YWlsICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcKKwkJbGVuX2ZpcnN0X3BhcnQgPSBsZW5fdG90YWwgPSBzaGJ1Zl90YWlsIC0gY3VyOworCQlpZiAobGVuX3RvdGFsIDwgMCkgeworCQkJLyogbWVzc2FnZSB3cmFwczogKi8KKwkJCS8qIFtTRUNPTkQgUEFSVC4uLi4uLi4uLkZJUlNUIFBBUlRdICovCisJCQkvKiAgXmRhdGEgICAgICBedGFpbCAgICBeY3VyICAgICAgXnNpemUgKi8KKwkJCWxlbl90b3RhbCArPSBzaGJ1Zl9zaXplOworCQl9CisJCWNvcHkgPSB4bWFsbG9jKGxlbl90b3RhbCArIDEpOworCQlpZiAobGVuX2ZpcnN0X3BhcnQgPCAwKSB7CisJCQkvKiBtZXNzYWdlIHdyYXBzIChzZWUgYWJvdmUpICovCisJCQlsZW5fZmlyc3RfcGFydCA9IHNoYnVmX3NpemUgLSBjdXI7CisJCQltZW1jcHkoY29weSArIGxlbl9maXJzdF9wYXJ0LCBzaGJ1Zl9kYXRhLCBzaGJ1Zl90YWlsKTsKKwkJfQorCQltZW1jcHkoY29weSwgc2hidWZfZGF0YSArIGN1ciwgbGVuX2ZpcnN0X3BhcnQpOworCQljb3B5W2xlbl90b3RhbF0gPSAnXDAnOworCQljdXIgPSBzaGJ1Zl90YWlsOworI2Vsc2UKKwkJd2hpbGUgKGN1ciAhPSBzaGJ1Zl90YWlsKSB7CisJCQlmcHV0cyhzaGJ1Zl9kYXRhICsgY3VyLCBzdGRvdXQpOworCQkJY3VyICs9IHN0cmxlbihzaGJ1Zl9kYXRhICsgY3VyKSArIDE7CisJCQlpZiAoY3VyID49IHNoYnVmX3NpemUpCisJCQkJY3VyID0gMDsKKwkJfQorI2VuZGlmCisgdW5sb2NrOgorCQkvKiByZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBsb2cgY2hhaW4gKi8KKwkJc2VtX3VwKGxvZ19zZW1pZCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORworCQlmb3IgKGkgPSAwOyBpIDwgbGVuX3RvdGFsOyBpICs9IHN0cmxlbihjb3B5ICsgaSkgKyAxKSB7CisJCQlmcHV0cyhjb3B5ICsgaSwgc3Rkb3V0KTsKKwkJfQorCQlmcmVlKGNvcHkpOworI2VuZGlmCisJfSB3aGlsZSAoZm9sbG93KTsKKworCXNobWR0KHNoYnVmKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL3N5c2tsb2dkL3N5c2xvZ2QuYyBiL3N5c2tsb2dkL3N5c2xvZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjAxZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2Qvc3lzbG9nZC5jCkBAIC0wLDAgKzEsMTAyOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzeXNsb2dkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBLYXJsIE0uIEhlZ2Jsb29tIDxrYXJsaGVnQGRlYmlhbi5vcmc+CisgKgorICogImNpcmN1bGFyIGJ1ZmZlciIgQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKyAqCisgKiBNYWludGFpbmVyOiBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+IGFzIG9mIE1hciAxMiwgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN5c2xvZ2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSBzeXNsb2dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3lzdGVtIGxvZ2dpbmcgdXRpbGl0eVxuIgorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfU1lTTE9HRF9DRkcoCisvL3VzYWdlOiAgICAgICAiKHRoaXMgdmVyc2lvbiBvZiBzeXNsb2dkIGlnbm9yZXMgL2V0Yy9zeXNsb2cuY29uZilcbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktTyBGSUxFCQlMb2cgdG8gRklMRSAoZGVmYXVsdDovdmFyL2xvZy9tZXNzYWdlcykiCisvL3VzYWdlOiAgICAgIlxuCS1sIE4JCUxvZyBvbmx5IG1lc3NhZ2VzIG1vcmUgdXJnZW50IHRoYW4gcHJpbyBOICgxLTgpIgorLy91c2FnZTogICAgICJcbgktUwkJU21hbGxlciBvdXRwdXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKAorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlNYXggc2l6ZSAoS0IpIGJlZm9yZSByb3RhdGlvbiAoZGVmYXVsdDoyMDBLQiwgMD1vZmYpIgorLy91c2FnZTogICAgICJcbgktYiBOCQlOIHJvdGF0ZWQgbG9ncyB0byBrZWVwIChkZWZhdWx0OjEsIG1heD05OSwgMD1wdXJnZSkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1JFTU9URV9MT0coCisvL3VzYWdlOiAgICAgIlxuCS1SIEhPU1RbOlBPUlRdCUxvZyB0byBJUCBvciBob3N0bmFtZSBvbiBQT1JUIChkZWZhdWx0IFBPUlQ9NTE0L1VEUCkiCisvL3VzYWdlOiAgICAgIlxuCS1MCQlMb2cgbG9jYWxseSBhbmQgdmlhIG5ldHdvcmsgKGRlZmF1bHQgaXMgbmV0d29yayBvbmx5IGlmIC1SKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1lTTE9HRF9EVVAoCisvL3VzYWdlOiAgICAgIlxuCS1ECQlEcm9wIGR1cGxpY2F0ZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQQ19TWVNMT0coCisvKiBOQjogLUNzaXplIHNob3VsZG4ndCBoYXZlIHNwYWNlIChiZWNhdXNlIHNpemUgaXMgb3B0aW9uYWwpICovCisvL3VzYWdlOiAgICAgIlxuCS1DW3NpemVfa2JdCUxvZyB0byBzaGFyZWQgbWVtIGJ1ZmZlciAodXNlIGxvZ3JlYWQgdG8gcmVhZCBpdCkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKAorLy91c2FnZTogICAgICJcbgktZiBGSUxFCQlVc2UgRklMRSBhcyBjb25maWcgKGRlZmF1bHQ6L2V0Yy9zeXNsb2cuY29uZikiCisvL3VzYWdlOgkpCisvKiAvL3VzYWdlOiAgIlxuCS1tIE1JTgkJTWludXRlcyBiZXR3ZWVuIE1BUksgbGluZXMgKGRlZmF1bHQ6MjAsIDA9b2ZmKSIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc3lzbG9nZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzeXNsb2dkIC1SIG1hc3RlcmxvZzo1MTRcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHN5c2xvZ2QgLVIgMTkyLjE2OC4xLjE6NjAxXG4iCisKKy8qCisgKiBEb25lIGluIHN5c2xvZ2RfYW5kX2xvZ2dlci5jOgorI2luY2x1ZGUgImxpYmJiLmgiCisjZGVmaW5lIFNZU0xPR19OQU1FUworI2RlZmluZSBTWVNMT0dfTkFNRVNfQ09OU1QKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyovCisKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD4KKyNpbmNsdWRlIDxzeXMvc2htLmg+CisjZW5kaWYKKworCisjZGVmaW5lIERFQlVHIDAKKworLyogTUFSSyBjb2RlIGlzIG5vdCB2ZXJ5IHVzZWZ1bCwgaXMgYmxvYXQsIGFuZCBicm9rZW46CisgKiBjYW4gZGVhZGxvY2sgaWYgYWxhcm1lZCB0byBtYWtlIE1BUksgd2hpbGUgd3JpdGluZyB0byBJUEMgYnVmZmVyCisgKiAoc2VtYXBob3JlcyBhcmUgZG93biBidXQgZG9fbWFyayByb3V0aW5lIHRyaWVzIHRvIGRvd24gdGhlbSBhZ2FpbikgKi8KKyN1bmRlZiBTWVNMT0dEX01BUksKKworLyogV3JpdGUgbG9ja2luZyBkb2VzIG5vdCBzZWVtIHRvIGJlIHVzZWZ1bCBlaXRoZXIgKi8KKyN1bmRlZiBTWVNMT0dEX1dSTE9DSworCitlbnVtIHsKKwlNQVhfUkVBRCA9IENPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRSwKKwlETlNfV0FJVF9TRUMgPSAyICogNjAsCit9OworCisvKiBTZW1hcGhvcmUgb3BlcmF0aW9uIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBzaGJ1Zl9kcyB7CisJaW50MzJfdCBzaXplOyAgIC8qIHNpemUgb2YgZGF0YSAtIDEgKi8KKwlpbnQzMl90IHRhaWw7ICAgLyogZW5kIG9mIG1lc3NhZ2UgbGlzdCAqLworCWNoYXIgZGF0YVsxXTsgICAvKiBkYXRhL21lc3NhZ2VzICovCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRwordHlwZWRlZiBzdHJ1Y3QgeworCWludCByZW1vdGVGRDsKKwl1bnNpZ25lZCBsYXN0X2Ruc19yZXNvbHZlOworCWxlbl9hbmRfc29ja2FkZHIgKnJlbW90ZUFkZHI7CisJY29uc3QgY2hhciAqcmVtb3RlSG9zdG5hbWU7Cit9IHJlbW90ZUhvc3RfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBsb2dGaWxlX3QgeworCWNvbnN0IGNoYXIgKnBhdGg7CisJaW50IGZkOworI2lmIEVOQUJMRV9GRUFUVVJFX1JPVEFURV9MT0dGSUxFCisJdW5zaWduZWQgc2l6ZTsKKwl1aW50OF90IGlzUmVndWxhcjsKKyNlbmRpZgorfSBsb2dGaWxlX3Q7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0NGRwordHlwZWRlZiBzdHJ1Y3QgbG9nUnVsZV90IHsKKwl1aW50OF90IGVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtMT0dfTkZBQ0lMSVRJRVNdOworCXN0cnVjdCBsb2dGaWxlX3QgKmZpbGU7CisJc3RydWN0IGxvZ1J1bGVfdCAqbmV4dDsKK30gbG9nUnVsZV90OworI2VuZGlmCisKKy8qIEFsbG93cyB1cyB0byBoYXZlIHNtYWxsZXIgaW5pdGlhbGl6ZXIuIFVnbHkuICovCisjZGVmaW5lIEdMT0JBTFMgXAorCWxvZ0ZpbGVfdCBsb2dGaWxlOyAgICAgICAgICAgICAgICAgICAgICBcCisJLyogaW50ZXJ2YWwgYmV0d2VlbiBtYXJrcyBpbiBzZWNvbmRzICovIFwKKwkvKmludCBtYXJrSW50ZXJ2YWw7Ki8gICAgICAgICAgICAgICAgICAgXAorCS8qIGxldmVsIG9mIG1lc3NhZ2VzIHRvIGJlIGxvZ2dlZCAqLyAgICBcCisJaW50IGxvZ0xldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoIFwKKwkvKiBtYXggc2l6ZSBvZiBmaWxlIGJlZm9yZSByb3RhdGlvbiAqLyAgXAorCXVuc2lnbmVkIGxvZ0ZpbGVTaXplOyAgICAgICAgICAgICAgICAgICBcCisJLyogbnVtYmVyIG9mIHJvdGF0ZWQgbWVzc2FnZSBmaWxlcyAqLyAgIFwKKwl1bnNpZ25lZCBsb2dGaWxlUm90YXRlOyAgICAgICAgICAgICAgICAgXAorKSBcCitJRl9GRUFUVVJFX0lQQ19TWVNMT0coIFwKKwlpbnQgc2htaWQ7IC8qIGlwYyBzaGFyZWQgbWVtb3J5IGlkICovICAgXAorCWludCBzX3NlbWlkOyAvKiBpcGMgc2VtYXBob3JlIGlkICovICAgICBcCisJaW50IHNobV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3Qgc2VtYnVmIFNNd3VwWzFdOyAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBzZW1idWYgU013ZG5bM107ICAgICAgICAgICAgICAgICBcCispIFwKK0lGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoIFwKKwlsb2dSdWxlX3QgKmxvZ19ydWxlczsgXAorKQorCitzdHJ1Y3QgaW5pdF9nbG9iYWxzIHsKKwlHTE9CQUxTCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJR0xPQkFMUworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCWxsaXN0X3QgKnJlbW90ZUhvc3RzOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDX1NZU0xPRworCXN0cnVjdCBzaGJ1Zl9kcyAqc2hidWY7CisjZW5kaWYKKwl0aW1lX3QgbGFzdF9sb2dfdGltZTsKKwkvKiBsb2NhbGhvc3QncyBuYW1lLiBXZSBwcmludCBvbmx5IGZpcnN0IDY0IGNoYXJzICovCisJY2hhciAqaG9zdG5hbWU7CisKKwkvKiBXZSByZWN2IGludG8gcmVjdmJ1Zi4uLiAqLworCWNoYXIgcmVjdmJ1ZltNQVhfUkVBRCAqICgxICsgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9EVVApXTsKKwkvKiAuLi50aGVuIGNvcHkgdG8gcGFyc2VidWYsIGVzY2FwaW5nIGNvbnRyb2wgY2hhcnMgKi8KKwkvKiAoY2FuIGdyb3cgeDIgbWF4KSAqLworCWNoYXIgcGFyc2VidWZbTUFYX1JFQUQqMl07CisJLyogLi4udGhlbiBzcHJpbnRmIGludG8gcHJpbnRidWYsIGFkZGluZyB0aW1lc3RhbXAgKDI2IGNoYXJzKSwKKwkgKiBob3N0ICg2NCksIGZhYy5wcmlvICgyMCkgdG8gdGhlIG1lc3NhZ2UgKi8KKwkvKiAoZ3Jvd3RoIGJ5OiAyNiArIDY0ICsgMjAgKyBkZWxpbXMgPSB+MTIxKSAqLworCWNoYXIgcHJpbnRidWZbTUFYX1JFQUQqMiArIDEzOV07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGluaXRfZ2xvYmFscyBpbml0X2RhdGEgPSB7CisJLmxvZ0ZpbGUgPSB7CisJCS5wYXRoID0gIi92YXIvbG9nL21lc3NhZ2VzIiwKKwkJLmZkID0gLTEsCisJfSwKKyNpZmRlZiBTWVNMT0dEX01BUksKKwkubWFya0ludGVydmFsID0gMjAgKiA2MCwKKyNlbmRpZgorCS5sb2dMZXZlbCA9IDgsCisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwkubG9nRmlsZVNpemUgPSAyMDAgKiAxMDI0LAorCS5sb2dGaWxlUm90YXRlID0gMSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKwkuc2htaWQgPSAtMSwKKwkuc19zZW1pZCA9IC0xLAorCS5zaG1fc2l6ZSA9ICgoQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRSkqMTAyNCksIC8qIGRlZmF1bHQgc2htIHNpemUgKi8KKwkuU013dXAgPSB7IHsxLCAtMSwgSVBDX05PV0FJVH0gfSwKKwkuU013ZG4gPSB7IHswLCAwfSwgezEsIDB9LCB7MSwgKzF9IH0sCisjZW5kaWYKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMobWVtY3B5KHh6YWxsb2Moc2l6ZW9mKEcpKSwgJmluaXRfZGF0YSwgc2l6ZW9mKGluaXRfZGF0YSkpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBPcHRpb25zICovCitlbnVtIHsKKwlPUFRCSVRfbWFyayA9IDAsIC8vIC1tCisJT1BUQklUX25vZm9yaywgLy8gLW4KKwlPUFRCSVRfb3V0ZmlsZSwgLy8gLU8KKwlPUFRCSVRfbG9nbGV2ZWwsIC8vIC1sCisJT1BUQklUX3NtYWxsLCAvLyAtUworCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoT1BUQklUX2ZpbGVzaXplICAgLCkJLy8gLXMKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKE9QVEJJVF9yb3RhdGVjbnQgICwpCS8vIC1iCisJSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCAgICBPUFRCSVRfcmVtb3RlbG9nICAsKQkvLyAtUgorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgT1BUQklUX2xvY2FsbG9nICAgLCkJLy8gLUwKKwlJRl9GRUFUVVJFX0lQQ19TWVNMT0coICAgIE9QVEJJVF9jaXJjdWxhcmxvZywpCS8vIC1DCisJSUZfRkVBVFVSRV9TWVNMT0dEX0RVUCggICBPUFRCSVRfZHVwICAgICAgICAsKQkvLyAtRAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgT1BUQklUX2NmZyAgICAgICAgLCkJLy8gLWYKKworCU9QVF9tYXJrICAgICAgICA9IDEgPDwgT1BUQklUX21hcmsgICAgLAorCU9QVF9ub2ZvcmsgICAgICA9IDEgPDwgT1BUQklUX25vZm9yayAgLAorCU9QVF9vdXRmaWxlICAgICA9IDEgPDwgT1BUQklUX291dGZpbGUgLAorCU9QVF9sb2dsZXZlbCAgICA9IDEgPDwgT1BUQklUX2xvZ2xldmVsLAorCU9QVF9zbWFsbCAgICAgICA9IDEgPDwgT1BUQklUX3NtYWxsICAgLAorCU9QVF9maWxlc2l6ZSAgICA9IElGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoKDEgPDwgT1BUQklUX2ZpbGVzaXplICAgKSkgKyAwLAorCU9QVF9yb3RhdGVjbnQgICA9IElGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoKDEgPDwgT1BUQklUX3JvdGF0ZWNudCAgKSkgKyAwLAorCU9QVF9yZW1vdGVsb2cgICA9IElGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgKDEgPDwgT1BUQklUX3JlbW90ZWxvZyAgKSkgKyAwLAorCU9QVF9sb2NhbGxvZyAgICA9IElGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgKDEgPDwgT1BUQklUX2xvY2FsbG9nICAgKSkgKyAwLAorCU9QVF9jaXJjdWxhcmxvZyA9IElGX0ZFQVRVUkVfSVBDX1NZU0xPRyggICAgKDEgPDwgT1BUQklUX2NpcmN1bGFybG9nKSkgKyAwLAorCU9QVF9kdXAgICAgICAgICA9IElGX0ZFQVRVUkVfU1lTTE9HRF9EVVAoICAgKDEgPDwgT1BUQklUX2R1cCAgICAgICAgKSkgKyAwLAorCU9QVF9jZmcgICAgICAgICA9IElGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgKDEgPDwgT1BUQklUX2NmZyAgICAgICAgKSkgKyAwLAorfTsKKyNkZWZpbmUgT1BUSU9OX1NUUiAibTpuTzpsOlMiIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCJzOiIgKSBcCisJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgiYjoiICkgXAorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgIlI6IiApIFwKKwlJRl9GRUFUVVJFX1JFTU9URV9MT0coICAgICJMIiAgKSBcCisJSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICAiQzo6IikgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9EVVAoICAgIkQiICApIFwKKwlJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKCAgICJmOiIgICkKKyNkZWZpbmUgT1BUSU9OX0RFQ0wgKm9wdF9tLCAqb3B0X2wgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoLCpvcHRfcykgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoLCpvcHRfYikgXAorCUlGX0ZFQVRVUkVfSVBDX1NZU0xPRyggICAgLCpvcHRfQyA9IE5VTEwpIFwKKwlJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKCAgICwqb3B0X2YgPSBOVUxMKQorI2RlZmluZSBPUFRJT05fUEFSQU0gJm9wdF9tLCAmKEcubG9nRmlsZS5wYXRoKSwgJm9wdF9sIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCwmb3B0X3MpIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCwmb3B0X2IpIFwKKwlJRl9GRUFUVVJFX1JFTU9URV9MT0coCSAgLCZyZW1vdGVBZGRyTGlzdCkgXAorCUlGX0ZFQVRVUkVfSVBDX1NZU0xPRyggICAgLCZvcHRfQykgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgLCZvcHRfZikKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9DRkcKK3N0YXRpYyBjb25zdCBDT0RFKiBmaW5kX2J5X25hbWUoY2hhciAqbmFtZSwgY29uc3QgQ09ERSogY19zZXQpCit7CisJZm9yICg7IGNfc2V0LT5jX25hbWU7IGNfc2V0KyspIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBjX3NldC0+Y19uYW1lKSA9PSAwKQorCQkJcmV0dXJuIGNfc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorc3RhdGljIGNvbnN0IENPREUqIGZpbmRfYnlfdmFsKGludCB2YWwsIGNvbnN0IENPREUqIGNfc2V0KQoreworCWZvciAoOyBjX3NldC0+Y19uYW1lOyBjX3NldCsrKSB7CisJCWlmIChjX3NldC0+Y192YWwgPT0gdmFsKQorCQkJcmV0dXJuIGNfc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCitzdGF0aWMgdm9pZCBwYXJzZV9zeXNsb2dkY2ZnKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY2hhciAqdDsKKwlsb2dSdWxlX3QgKipwcF9ydWxlOworCS8qIHRva1swXSBzZXQgb2Ygc2VsZWN0b3JzICovCisJLyogdG9rWzFdIGZpbGUgbmFtZSAqLworCS8qIHRva1syXSBoYXMgdG8gYmUgTlVMTCAqLworCWNoYXIgKnRva1szXTsKKwlwYXJzZXJfdCAqcGFyc2VyOworCisJcGFyc2VyID0gY29uZmlnX29wZW4yKGZpbGUgPyBmaWxlIDogIi9ldGMvc3lzbG9nLmNvbmYiLAorCQkJCWZpbGUgPyB4Zm9wZW5fZm9yX3JlYWQgOiBmb3Blbl9mb3JfcmVhZCk7CisJaWYgKCFwYXJzZXIpCisJCS8qIGRpZG4ndCBmaW5kIGRlZmF1bHQgL2V0Yy9zeXNsb2cuY29uZiAqLworCQkvKiBwcm9jZWVkIGFzIGlmIHdlIGJ1aWx0IGJ1c3lib3ggd2l0aG91dCBjb25maWcgc3VwcG9ydCAqLworCQlyZXR1cm47CisKKwkvKiB1c2UgcHRyIHRvIHB0ciB0byBhdm9pZCBjaGVja2luZyB3aGV0aGVyIGhlYWQgd2FzIGluaXRpYWxpemVkICovCisJcHBfcnVsZSA9ICZHLmxvZ19ydWxlczsKKwkvKiBpdGVyYXRlIHRocm91Z2ggbGluZXMgb2YgY29uZmlnLCBza2lwcGluZyBjb21tZW50cyAqLworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRvaywgMywgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgfCBQQVJTRV9NSU5fRElFKSkgeworCQljaGFyICpjdXJfc2VsZWN0b3I7CisJCWxvZ1J1bGVfdCAqY3VyX3J1bGU7CisKKwkJLyogdW5leHBlY3RlZCB0cmFpbGluZyB0b2tlbj8gKi8KKwkJaWYgKHRva1syXSkKKwkJCWdvdG8gY2ZnZXJyOworCisJCWN1cl9ydWxlID0gKnBwX3J1bGUgPSB4emFsbG9jKHNpemVvZigqY3VyX3J1bGUpKTsKKworCQljdXJfc2VsZWN0b3IgPSB0b2tbMF07CisJCS8qIGl0ZXJhdGUgdGhyb3VnaCBzZWxlY3RvcnM6ICJrZXJuLmluZm87a2Vybi4hZXJyOy4uLiIgKi8KKwkJZG8geworCQkJY29uc3QgQ09ERSAqY29kZTsKKwkJCWNoYXIgKm5leHRfc2VsZWN0b3I7CisJCQl1aW50OF90IG5lZ2F0ZWRfcHJpbzsgLyogImtlcm4uIWVyciIgKi8KKwkJCXVpbnQ4X3Qgc2luZ2xlX3ByaW87ICAvKiAia2Vybi49ZXJyIiAqLworCQkJdWludDMyX3QgZmFjbWFwOyAvKiBiaXRtYXAgb2YgZW5hYmxlZCBmYWNpbGl0aWVzICovCisJCQl1aW50OF90IHByaW1hcDsgIC8qIGJpdG1hcCBvZiBlbmFibGVkIHByaW9yaXRpZXMgKi8KKwkJCXVuc2lnbmVkIGk7CisKKwkJCW5leHRfc2VsZWN0b3IgPSBzdHJjaHIoY3VyX3NlbGVjdG9yLCAnOycpOworCQkJaWYgKG5leHRfc2VsZWN0b3IpCisJCQkJKm5leHRfc2VsZWN0b3IrKyA9ICdcMCc7CisKKwkJCXQgPSBzdHJjaHIoY3VyX3NlbGVjdG9yLCAnLicpOworCQkJaWYgKCF0KQorCQkJCWdvdG8gY2ZnZXJyOworCQkJKnQrKyA9ICdcMCc7IC8qIHNlcGFyYXRlIGZhY2lsaXR5IGZyb20gcHJpb3JpdHkgKi8KKworCQkJbmVnYXRlZF9wcmlvID0gMDsKKwkJCXNpbmdsZV9wcmlvID0gMDsKKwkJCWlmICgqdCA9PSAnIScpIHsKKwkJCQluZWdhdGVkX3ByaW8gPSAxOworCQkJCSsrdDsKKwkJCX0KKwkJCWlmICgqdCA9PSAnPScpIHsKKwkJCQlzaW5nbGVfcHJpbyA9IDE7CisJCQkJKyt0OworCQkJfQorCisJCQkvKiBwYXJzZSBwcmlvcml0eSAqLworCQkJaWYgKCp0ID09ICcqJykKKwkJCQlwcmltYXAgPSAweGZmOyAvKiBhbGwgOCBsb2cgbGV2ZWxzIGVuYWJsZWQgKi8KKwkJCWVsc2UgeworCQkJCXVpbnQ4X3QgcHJpb3JpdHk7CisJCQkJY29kZSA9IGZpbmRfYnlfbmFtZSh0LCBwcmlvcml0eW5hbWVzKTsKKwkJCQlpZiAoIWNvZGUpCisJCQkJCWdvdG8gY2ZnZXJyOworCQkJCXByaW1hcCA9IDA7CisJCQkJcHJpb3JpdHkgPSBjb2RlLT5jX3ZhbDsKKwkJCQlpZiAocHJpb3JpdHkgPT0gSU5URVJOQUxfTk9QUkkpIHsKKwkJCQkJLyogZW5zdXJlIHdlIHRha2UgImVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtmYWNdICY9IDAiIGJyYW5jaCBiZWxvdyAqLworCQkJCQluZWdhdGVkX3ByaW8gPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW9yaXR5ID0gMSA8PCBwcmlvcml0eTsKKwkJCQkJZG8geworCQkJCQkJcHJpbWFwIHw9IHByaW9yaXR5OworCQkJCQkJaWYgKHNpbmdsZV9wcmlvKQorCQkJCQkJCWJyZWFrOworCQkJCQkJcHJpb3JpdHkgPj49IDE7CisJCQkJCX0gd2hpbGUgKHByaW9yaXR5KTsKKwkJCQkJaWYgKG5lZ2F0ZWRfcHJpbykKKwkJCQkJCXByaW1hcCA9IH5wcmltYXA7CisJCQkJfQorCQkJfQorCisJCQkvKiBwYXJzZSBmYWNpbGl0eSAqLworCQkJaWYgKCpjdXJfc2VsZWN0b3IgPT0gJyonKQorCQkJCWZhY21hcCA9ICgxPDxMT0dfTkZBQ0lMSVRJRVMpIC0gMTsKKwkJCWVsc2UgeworCQkJCWNoYXIgKm5leHRfZmFjaWxpdHk7CisJCQkJZmFjbWFwID0gMDsKKwkJCQl0ID0gY3VyX3NlbGVjdG9yOworCQkJCS8qIGl0ZXJhdGUgdGhyb3VnaCBmYWNpbGl0aWVzOiAia2VybixkYWVtb24uPHByaW9zcGVjPiIgKi8KKwkJCQlkbyB7CisJCQkJCW5leHRfZmFjaWxpdHkgPSBzdHJjaHIodCwgJywnKTsKKwkJCQkJaWYgKG5leHRfZmFjaWxpdHkpCisJCQkJCQkqbmV4dF9mYWNpbGl0eSsrID0gJ1wwJzsKKwkJCQkJY29kZSA9IGZpbmRfYnlfbmFtZSh0LCBmYWNpbGl0eW5hbWVzKTsKKwkJCQkJaWYgKCFjb2RlKQorCQkJCQkJZ290byBjZmdlcnI7CisJCQkJCS8qICJtYXJrIiBpcyBub3QgYSByZWFsIGZhY2lsaXR5LCBza2lwIGl0ICovCisJCQkJCWlmIChjb2RlLT5jX3ZhbCAhPSBJTlRFUk5BTF9NQVJLKQorCQkJCQkJZmFjbWFwIHw9IDE8PChMT0dfRkFDKGNvZGUtPmNfdmFsKSk7CisJCQkJCXQgPSBuZXh0X2ZhY2lsaXR5OworCQkJCX0gd2hpbGUgKHQpOworCQkJfQorCisJCQkvKiBtZXJnZSByZXN1bHQgd2l0aCBwcmV2aW91cyBzZWxlY3RvcnMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBMT0dfTkZBQ0lMSVRJRVM7ICsraSkgeworCQkJCWlmICghKGZhY21hcCAmICgxPDxpKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChuZWdhdGVkX3ByaW8pCisJCQkJCWN1cl9ydWxlLT5lbmFibGVkX2ZhY2lsaXR5X3ByaW9tYXBbaV0gJj0gcHJpbWFwOworCQkJCWVsc2UKKwkJCQkJY3VyX3J1bGUtPmVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtpXSB8PSBwcmltYXA7CisJCQl9CisKKwkJCWN1cl9zZWxlY3RvciA9IG5leHRfc2VsZWN0b3I7CisJCX0gd2hpbGUgKGN1cl9zZWxlY3Rvcik7CisKKwkJLyogY2hlY2sgd2hldGhlciBjdXJyZW50IGZpbGUgbmFtZSB3YXMgbWVudGlvbmVkIGluIHByZXZpb3VzIHJ1bGVzIG9yCisJCSAqIGFzIGdsb2JhbCBsb2dmaWxlIChHLmxvZ0ZpbGUpLgorCQkgKi8KKwkJaWYgKHN0cmNtcChHLmxvZ0ZpbGUucGF0aCwgdG9rWzFdKSA9PSAwKSB7CisJCQljdXJfcnVsZS0+ZmlsZSA9ICZHLmxvZ0ZpbGU7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCS8qIHRlbXBvcmFyaWx5IHVzZSBjdXJfcnVsZSBhcyBpdGVyYXRvciwgYnV0ICpwcF9ydWxlIHN0aWxsIHBvaW50cworCQkgKiB0byBjdXJyZW50bHkgcHJvY2Vzc2luZyBydWxlIGVudHJ5LgorCQkgKiBOT1RFOiAqcHBfcnVsZSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgKGFuZCBsYXN0IGluIHRoZSBsaXN0KSBydWxlLgorCQkgKi8KKwkJZm9yIChjdXJfcnVsZSA9IEcubG9nX3J1bGVzOyBjdXJfcnVsZSAhPSAqcHBfcnVsZTsgY3VyX3J1bGUgPSBjdXJfcnVsZS0+bmV4dCkgeworCQkJaWYgKHN0cmNtcChjdXJfcnVsZS0+ZmlsZS0+cGF0aCwgdG9rWzFdKSA9PSAwKSB7CisJCQkJLyogZm91bmQgLSByZXVzZSB0aGUgc2FtZSBmaWxlIHN0cnVjdHVyZSAqLworCQkJCSgqcHBfcnVsZSktPmZpbGUgPSBjdXJfcnVsZS0+ZmlsZTsKKwkJCQljdXJfcnVsZSA9ICpwcF9ydWxlOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJY3VyX3J1bGUtPmZpbGUgPSB4emFsbG9jKHNpemVvZigqY3VyX3J1bGUtPmZpbGUpKTsKKwkJY3VyX3J1bGUtPmZpbGUtPmZkID0gLTE7CisJCWN1cl9ydWxlLT5maWxlLT5wYXRoID0geHN0cmR1cCh0b2tbMV0pOworIGZvdW5kOgorCQlwcF9ydWxlID0gJmN1cl9ydWxlLT5uZXh0OworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKwlyZXR1cm47CisKKyBjZmdlcnI6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGluICclcycgYXQgbGluZSAlZCIsIGZpbGUsIHBhcnNlci0+bGluZW5vKTsKK30KKyNlbmRpZgorCisvKiBjaXJjdWxhciBidWZmZXIgdmFyaWFibGVzL3N0cnVjdHVyZXMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisKKyNpZiBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFIDwgNAorI2Vycm9yIFNvcnJ5LCB5b3UgbXVzdCBzZXQgdGhlIHN5c2xvZ2QgYnVmZmVyIHNpemUgdG8gYXQgbGVhc3QgNEtCLgorI2Vycm9yIFBsZWFzZSBjaGVjayBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFCisjZW5kaWYKKworLyogb3VyIHNoYXJlZCBrZXkgKHN5c2xvZ2QuYyBhbmQgbG9ncmVhZC5jIG11c3QgYmUgaW4gc3luYykgKi8KK2VudW0geyBLRVlfSUQgPSAweDQxNGU0NTQ3IH07IC8qICJHRU5BIiAqLworCitzdGF0aWMgdm9pZCBpcGNzeXNsb2dfY2xlYW51cCh2b2lkKQoreworCWlmIChHLnNobWlkICE9IC0xKSB7CisJCXNobWR0KEcuc2hidWYpOworCX0KKwlpZiAoRy5zaG1pZCAhPSAtMSkgeworCQlzaG1jdGwoRy5zaG1pZCwgSVBDX1JNSUQsIE5VTEwpOworCX0KKwlpZiAoRy5zX3NlbWlkICE9IC0xKSB7CisJCXNlbWN0bChHLnNfc2VtaWQsIDAsIElQQ19STUlELCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwY3N5c2xvZ19pbml0KHZvaWQpCit7CisJaWYgKERFQlVHKQorCQlwcmludGYoInNobWdldCgleCwgJWQsLi4uKVxuIiwgKGludClLRVlfSUQsIEcuc2htX3NpemUpOworCisJRy5zaG1pZCA9IHNobWdldChLRVlfSUQsIEcuc2htX3NpemUsIElQQ19DUkVBVCB8IDA2NDQpOworCWlmIChHLnNobWlkID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2htZ2V0Iik7CisJfQorCisJRy5zaGJ1ZiA9IHNobWF0KEcuc2htaWQsIE5VTEwsIDApOworCWlmIChHLnNoYnVmID09ICh2b2lkKikgLTFMKSB7IC8qIHNobWF0IGhhcyBiaXphcnJlIGVycm9yIHJldHVybiAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNobWF0Iik7CisJfQorCisJbWVtc2V0KEcuc2hidWYsIDAsIEcuc2htX3NpemUpOworCUcuc2hidWYtPnNpemUgPSBHLnNobV9zaXplIC0gb2Zmc2V0b2Yoc3RydWN0IHNoYnVmX2RzLCBkYXRhKSAtIDE7CisJLypHLnNoYnVmLT50YWlsID0gMDsqLworCisJLyogd2UnbGwgdHJ1c3QgdGhlIE9TIHRvIHNldCBpbml0aWFsIHNlbXZhbCB0byAwIChsZXQncyBob3BlKSAqLworCUcuc19zZW1pZCA9IHNlbWdldChLRVlfSUQsIDIsIElQQ19DUkVBVCB8IElQQ19FWENMIHwgMTAyMyk7CisJaWYgKEcuc19zZW1pZCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUVYSVNUKSB7CisJCQlHLnNfc2VtaWQgPSBzZW1nZXQoS0VZX0lELCAyLCAwKTsKKwkJCWlmIChHLnNfc2VtaWQgIT0gLTEpCisJCQkJcmV0dXJuOworCQl9CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VtZ2V0Iik7CisJfQorfQorCisvKiBXcml0ZSBtZXNzYWdlIHRvIHNoYXJlZCBtZW0gYnVmZmVyICovCitzdGF0aWMgdm9pZCBsb2dfdG9fc2htZW0oY29uc3QgY2hhciAqbXNnKQoreworCWludCBvbGRfdGFpbCwgbmV3X3RhaWw7CisJaW50IGxlbjsKKworCWlmIChzZW1vcChHLnNfc2VtaWQsIEcuU013ZG4sIDMpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU013ZG4iKTsKKwl9CisKKwkvKiBDaXJjdWxhciBCdWZmZXIgQWxnb3JpdGhtOgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogdGFpbCA9PSBwb3NpdGlvbiB3aGVyZSB0byBzdG9yZSBuZXh0IHN5c2xvZyBtZXNzYWdlLgorCSAqIHRhaWwncyBtYXggdmFsdWUgaXMgKHNoYnVmLT5zaXplIC0gMSkKKwkgKiBMYXN0IGJ5dGUgb2YgYnVmZmVyIGlzIG5ldmVyIHVzZWQgYW5kIHJlbWFpbnMgTlVMLgorCSAqLworCWxlbiA9IHN0cmxlbihtc2cpICsgMTsgLyogbGVuZ3RoIHdpdGggTlVMIGluY2x1ZGVkICovCisgYWdhaW46CisJb2xkX3RhaWwgPSBHLnNoYnVmLT50YWlsOworCW5ld190YWlsID0gb2xkX3RhaWwgKyBsZW47CisJaWYgKG5ld190YWlsIDwgRy5zaGJ1Zi0+c2l6ZSkgeworCQkvKiBzdG9yZSBtZXNzYWdlLCBzZXQgbmV3IHRhaWwgKi8KKwkJbWVtY3B5KEcuc2hidWYtPmRhdGEgKyBvbGRfdGFpbCwgbXNnLCBsZW4pOworCQlHLnNoYnVmLT50YWlsID0gbmV3X3RhaWw7CisJfSBlbHNlIHsKKwkJLyogayA9PSBhdmFpbGFibGUgYnVmZmVyIHNwYWNlIGFoZWFkIG9mIG9sZCB0YWlsICovCisJCWludCBrID0gRy5zaGJ1Zi0+c2l6ZSAtIG9sZF90YWlsOworCQkvKiBjb3B5IHdoYXQgZml0cyB0byB0aGUgZW5kIG9mIGJ1ZmZlciwgYW5kIHJlcGVhdCAqLworCQltZW1jcHkoRy5zaGJ1Zi0+ZGF0YSArIG9sZF90YWlsLCBtc2csIGspOworCQltc2cgKz0gazsKKwkJbGVuIC09IGs7CisJCUcuc2hidWYtPnRhaWwgPSAwOworCQlnb3RvIGFnYWluOworCX0KKwlpZiAoc2Vtb3AoRy5zX3NlbWlkLCBHLlNNd3VwLCAxKSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNNd3VwIik7CisJfQorCWlmIChERUJVRykKKwkJcHJpbnRmKCJ0YWlsOiVkXG4iLCBHLnNoYnVmLT50YWlsKTsKK30KKyNlbHNlCit2b2lkIGlwY3N5c2xvZ19jbGVhbnVwKHZvaWQpOwordm9pZCBpcGNzeXNsb2dfaW5pdCh2b2lkKTsKK3ZvaWQgbG9nX3RvX3NobWVtKGNvbnN0IGNoYXIgKm1zZyk7CisjZW5kaWYgLyogRkVBVFVSRV9JUENfU1lTTE9HICovCisKKy8qIFByaW50IGEgbWVzc2FnZSB0byB0aGUgbG9nIGZpbGUuICovCitzdGF0aWMgdm9pZCBsb2dfbG9jYWxseSh0aW1lX3Qgbm93LCBjaGFyICptc2csIGxvZ0ZpbGVfdCAqbG9nX2ZpbGUpCit7CisjaWZkZWYgU1lTTE9HRF9XUkxPQ0sKKwlzdHJ1Y3QgZmxvY2sgZmw7CisjZW5kaWYKKwlpbnQgbGVuID0gc3RybGVuKG1zZyk7CisKKwlpZiAobG9nX2ZpbGUtPmZkID49IDApIHsKKwkJLyogUmVvcGVuIGxvZyBmaWxlIGV2ZXJ5IHNlY29uZC4gVGhpcyBhbGxvd3MgYWRtaW4KKwkJICogdG8gZGVsZXRlIHRoZSBmaWxlIGFuZCBub3Qgd29ycnkgYWJvdXQgcmVzdGFydGluZyB1cy4KKwkJICogVGhpcyBjb3N0cyBhbG1vc3Qgbm90aGluZyBzaW5jZSBpdCBoYXBwZW5zCisJCSAqIF9hdCBtb3N0XyBvbmNlIGEgc2Vjb25kLgorCQkgKi8KKwkJaWYgKCFub3cpCisJCQlub3cgPSB0aW1lKE5VTEwpOworCQlpZiAoRy5sYXN0X2xvZ190aW1lICE9IG5vdykgeworCQkJRy5sYXN0X2xvZ190aW1lID0gbm93OworCQkJY2xvc2UobG9nX2ZpbGUtPmZkKTsKKwkJCWdvdG8gcmVvcGVuOworCQl9CisJfSBlbHNlIHsKKyByZW9wZW46CisJCWxvZ19maWxlLT5mZCA9IG9wZW4obG9nX2ZpbGUtPnBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVAorCQkJCQl8IE9fTk9DVFRZIHwgT19BUFBFTkQgfCBPX05PTkJMT0NLLAorCQkJCQkwNjY2KTsKKwkJaWYgKGxvZ19maWxlLT5mZCA8IDApIHsKKwkJCS8qIGNhbm5vdCBvcGVuIGxvZ2ZpbGU/IC0gcHJpbnQgdG8gL2Rldi9jb25zb2xlIHRoZW4gKi8KKwkJCWludCBmZCA9IGRldmljZV9vcGVuKERFVl9DT05TT0xFLCBPX1dST05MWSB8IE9fTk9DVFRZIHwgT19OT05CTE9DSyk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWZkID0gMjsgLyogdGhlbiBzdGRlcnIsIGRhbW1pdCAqLworCQkJZnVsbF93cml0ZShmZCwgbXNnLCBsZW4pOworCQkJaWYgKGZkICE9IDIpCisJCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwkJeworCQkJc3RydWN0IHN0YXQgc3RhdGY7CisJCQlsb2dfZmlsZS0+aXNSZWd1bGFyID0gKGZzdGF0KGxvZ19maWxlLT5mZCwgJnN0YXRmKSA9PSAwICYmIFNfSVNSRUcoc3RhdGYuc3RfbW9kZSkpOworCQkJLyogYnVnIChtb3N0bHkgaGFybWxlc3MpOiBjYW4gd3JhcCBhcm91bmQgaWYgZmlsZSA+IDRnYiAqLworCQkJbG9nX2ZpbGUtPnNpemUgPSBzdGF0Zi5zdF9zaXplOworCQl9CisjZW5kaWYKKwl9CisKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCWZsLmxfd2hlbmNlID0gU0VFS19TRVQ7CisJZmwubF9zdGFydCA9IDA7CisJZmwubF9sZW4gPSAxOworCWZsLmxfdHlwZSA9IEZfV1JMQ0s7CisJZmNudGwobG9nX2ZpbGUtPmZkLCBGX1NFVExLVywgJmZsKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwlpZiAoRy5sb2dGaWxlU2l6ZSAmJiBsb2dfZmlsZS0+aXNSZWd1bGFyICYmIGxvZ19maWxlLT5zaXplID4gRy5sb2dGaWxlU2l6ZSkgeworCQlpZiAoRy5sb2dGaWxlUm90YXRlKSB7IC8qIGFsd2F5cyAwLi45OSAqLworCQkJaW50IGkgPSBzdHJsZW4obG9nX2ZpbGUtPnBhdGgpICsgMyArIDE7CisJCQljaGFyIG9sZEZpbGVbaV07CisJCQljaGFyIG5ld0ZpbGVbaV07CisJCQlpID0gRy5sb2dGaWxlUm90YXRlIC0gMTsKKwkJCS8qIHJlbmFtZTogZi44IC0+IGYuOTsgZi43IC0+IGYuODsgLi4uICovCisJCQl3aGlsZSAoMSkgeworCQkJCXNwcmludGYobmV3RmlsZSwgIiVzLiVkIiwgbG9nX2ZpbGUtPnBhdGgsIGkpOworCQkJCWlmIChpID09IDApIGJyZWFrOworCQkJCXNwcmludGYob2xkRmlsZSwgIiVzLiVkIiwgbG9nX2ZpbGUtPnBhdGgsIC0taSk7CisJCQkJLyogaWdub3JlIGVycm9ycyAtIGZpbGUgbWlnaHQgYmUgbWlzc2luZyAqLworCQkJCXJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKTsKKwkJCX0KKwkJCS8qIG5ld0ZpbGUgPT0gImYuMCIgbm93ICovCisJCQlyZW5hbWUobG9nX2ZpbGUtPnBhdGgsIG5ld0ZpbGUpOworCQkJLyogSW5jcmVkaWJseSwgaWYgRiBhbmQgRi4wIGFyZSBoYXJkbGlua3MsIFBPU0lYCisJCQkgKiBfZGVtYW5kc18gdGhhdCByZW5hbWUgcmV0dXJucyAwIGJ1dCBkb2VzIG5vdAorCQkJICogcmVtb3ZlIEYhISEKKwkJCSAqIChoYXJkbGlua2VkIEYvRi4wIHBhaXIgd2FzIG9ic2VydmVkIGFmdGVyCisJCQkgKiBwb3dlciBmYWlsdXJlIGR1cmluZyByZW5hbWUoKSkuCisJCQkgKiBFbnN1cmUgb2xkIGZpbGUgaXMgZ29uZToKKwkJCSAqLworCQkJdW5saW5rKGxvZ19maWxlLT5wYXRoKTsKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCQkJZmwubF90eXBlID0gRl9VTkxDSzsKKwkJCWZjbnRsKGxvZ19maWxlLT5mZCwgRl9TRVRMS1csICZmbCk7CisjZW5kaWYKKwkJCWNsb3NlKGxvZ19maWxlLT5mZCk7CisJCQlnb3RvIHJlb3BlbjsKKwkJfQorCQlmdHJ1bmNhdGUobG9nX2ZpbGUtPmZkLCAwKTsKKwl9CisJbG9nX2ZpbGUtPnNpemUgKz0KKyNlbmRpZgorCQkJZnVsbF93cml0ZShsb2dfZmlsZS0+ZmQsIG1zZywgbGVuKTsKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCWZsLmxfdHlwZSA9IEZfVU5MQ0s7CisJZmNudGwobG9nX2ZpbGUtPmZkLCBGX1NFVExLVywgJmZsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9mYWNfcHJpb18yMChpbnQgcHJpLCBjaGFyICpyZXMyMCkKK3sKKwljb25zdCBDT0RFICpjX3ByaSwgKmNfZmFjOworCisJY19mYWMgPSBmaW5kX2J5X3ZhbChMT0dfRkFDKHByaSkgPDwgMywgZmFjaWxpdHluYW1lcyk7CisJaWYgKGNfZmFjKSB7CisJCWNfcHJpID0gZmluZF9ieV92YWwoTE9HX1BSSShwcmkpLCBwcmlvcml0eW5hbWVzKTsKKwkJaWYgKGNfcHJpKSB7CisJCQlzbnByaW50ZihyZXMyMCwgMjAsICIlcy4lcyIsIGNfZmFjLT5jX25hbWUsIGNfcHJpLT5jX25hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNucHJpbnRmKHJlczIwLCAyMCwgIjwlZD4iLCBwcmkpOworfQorCitzdGF0aWMgc3RydWN0IHRtICogZ2VuZXJhdGVfdGltZShzdHJ1Y3QgdGltZXZhbCAqdHZwLCBzdHJ1Y3QgdG0gKnRtcCkKK3sKKwlzdHJ1Y3QgdG0gKnRtOworCisJZ2V0dGltZW9mZGF5KHR2cCwgTlVMTCk7CisKKwl0bSA9IGdtdGltZV9yKCZ0dnAtPnR2X3NlYywgdG1wKTsKKworCXJldHVybiB0bTsKK30KKworLyogbGVuIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgZm9yICJpcyB0aGVyZSBhIHRpbWVzdGFtcD8iIGNoZWNrLgorICogTkI6IHNvbWUgY2FsbGVycyBjaGVhdCBhbmQgc3VwcGx5IGxlbj09MCB3aGVuIHRoZXkga25vdworICogdGhhdCB0aGVyZSBpcyBubyB0aW1lc3RhbXAsIHNob3J0LWNpcmN1aXRpbmcgdGhlIHRlc3QuICovCitzdGF0aWMgdm9pZCB0aW1lc3RhbXBfYW5kX2xvZyhpbnQgcHJpLCBjaGFyICptc2csIGludCBsZW4pCit7CisJY2hhciB0aW1lc3RhbXBbMjddOworCXN0cnVjdCB0aW1ldmFsIHR2bm93OworCXN0cnVjdCB0bSBwYXJzZWQsIHRtbm93LCAqdG1wOworCXNpemVfdCBuOworCisJaWYgKGxlbiA8IDE2IHx8IG1zZ1szXSAhPSAnICcgfHwgbXNnWzZdICE9ICcgJyB8fAorCW1zZ1s5XSAhPSAnOicgfHwgbXNnWzEyXSAhPSAnOicgfHwgbXNnWzE1XSAhPSAnICcpIHsKKwkJLyogTm8gdGltZXN0YW1wLCBzbyBnZW5lcmF0ZSBvbmUgKi8KKwkJdG1wID0gZ2VuZXJhdGVfdGltZSgmdHZub3csICZ0bW5vdyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHRtIGxvY2FsOworCQl0dm5vdy50dl9zZWMgPSB0aW1lKE5VTEwpOworCQlsb2NhbHRpbWVfcigmdHZub3cudHZfc2VjLCAmbG9jYWwpOworCQlpZiAoc3RycHRpbWUobXNnLCAiJWggJWUgJVQiLCAmcGFyc2VkKSAhPSBOVUxMKSB7CisJCQkvKiBldmVuIHdoZW4gd2Ugc3RyaXAgdGhlIHRpbWUsIGxldCdzIGFkZCBtcyAqLworCQkJc3RydWN0IHRpbWV2YWwgZ2VuZXJhdGVkOworCQkJZ2V0dGltZW9mZGF5KCZnZW5lcmF0ZWQsIE5VTEwpOworCisJCQlwYXJzZWQudG1fZ210b2ZmICA9IGxvY2FsLnRtX2dtdG9mZjsKKwkJCXBhcnNlZC50bV96b25lICAgID0gbG9jYWwudG1fem9uZTsKKwkJCXBhcnNlZC50bV95ZWFyICAgID0gbG9jYWwudG1feWVhcjsKKwkJCXBhcnNlZC50bV9pc2RzdCAgID0gbG9jYWwudG1faXNkc3Q7CisKKwkJCXR2bm93LnR2X3NlYyA9IG1rdGltZSgmcGFyc2VkKTsKKwkJCXR2bm93LnR2X3VzZWMgPSBnZW5lcmF0ZWQudHZfdXNlYzsKKworCQkJdG1wID0gZ210aW1lX3IoJnR2bm93LnR2X3NlYywgJnRtbm93KTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHN0cnB0aW1lIGZhaWxzLCBnZW5lcmF0ZSAqLworCQkJdG1wICA9IGdlbmVyYXRlX3RpbWUoJnR2bm93LCAmdG1ub3cpOworCQl9CisJCW1zZyArPSAxNjsKKwl9CisJLyogUHV0IGluIGZvcm1hdCB5eXl5LW1tLWRkIGhoOm1tOnNzLnV1dXV1dSAqLworCW4gPSBzdHJmdGltZSh0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApLCAiJUYgJVQiLCB0bXApOworCXNucHJpbnRmKHRpbWVzdGFtcCArIG4sIHNpemVvZih0aW1lc3RhbXApIC0gbiwgIi4lMDZsZCIsIHR2bm93LnR2X3VzZWMpOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfc21hbGwpCisJCXNwcmludGYoRy5wcmludGJ1ZiwgIiVzICVzXG4iLCB0aW1lc3RhbXAsIG1zZyk7CisJZWxzZSB7CisJCWNoYXIgcmVzWzIwXTsKKwkJcGFyc2VfZmFjX3ByaW9fMjAocHJpLCByZXMpOworCQlzcHJpbnRmKEcucHJpbnRidWYsICIlcyAlLjY0cyAlcyAlc1xuIiwgdGltZXN0YW1wLCBHLmhvc3RuYW1lLCByZXMsIG1zZyk7CisJfQorCisJLyogTG9nIG1lc3NhZ2UgbG9jYWxseSAodG8gZmlsZSBvciBzaGFyZWQgbWVtKSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCisJeworCQlib29sIG1hdGNoID0gMDsKKwkJbG9nUnVsZV90ICpydWxlOworCQl1aW50OF90IGZhY2lsaXR5ID0gTE9HX0ZBQyhwcmkpOworCQl1aW50OF90IHByaW9fYml0ID0gMSA8PCBMT0dfUFJJKHByaSk7CisKKwkJZm9yIChydWxlID0gRy5sb2dfcnVsZXM7IHJ1bGU7IHJ1bGUgPSBydWxlLT5uZXh0KSB7CisJCQlpZiAocnVsZS0+ZW5hYmxlZF9mYWNpbGl0eV9wcmlvbWFwW2ZhY2lsaXR5XSAmIHByaW9fYml0KSB7CisJCQkJbG9nX2xvY2FsbHkodHZub3cudHZfc2VjLCBHLnByaW50YnVmLCBydWxlLT5maWxlKTsKKwkJCQltYXRjaCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKG1hdGNoKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZgorCWlmIChMT0dfUFJJKHByaSkgPCBHLmxvZ0xldmVsKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDX1NZU0xPRworCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfY2lyY3VsYXJsb2cpICYmIEcuc2hidWYpIHsKKwkJCWxvZ190b19zaG1lbShHLnByaW50YnVmKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCisJCWxvZ19sb2NhbGx5KHR2bm93LnR2X3NlYywgRy5wcmludGJ1ZiwgJkcubG9nRmlsZSk7CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVzdGFtcF9hbmRfbG9nX2ludGVybmFsKGNvbnN0IGNoYXIgKm1zZykKK3sKKwkvKiAtTCwgb3Igbm8gLVIgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRyAmJiAhKG9wdGlvbl9tYXNrMzIgJiBPUFRfbG9jYWxsb2cpKQorCQlyZXR1cm47CisJdGltZXN0YW1wX2FuZF9sb2coTE9HX1NZU0xPRyB8IExPR19JTkZPLCAoY2hhciopbXNnLCAwKTsKK30KKworLyogdG1wYnVmW2xlbl0gaXMgYSBOVUwgYnl0ZSAoc2V0IGJ5IGNhbGxlciksIGJ1dCB0aGVyZSBjYW4gYmUgb3RoZXIsCisgKiBlbWJlZGRlZCBOVUxzLiBTcGxpdCBtZXNzYWdlcyBvbiBlYWNoIG9mIHRoZXNlIE5VTHMsIHBhcnNlIHByaW8sCisgKiBlc2NhcGUgY29udHJvbCBjaGFycyBhbmQgbG9nIGVhY2ggbG9jYWxseS4gKi8KK3N0YXRpYyB2b2lkIHNwbGl0X2VzY2FwZV9hbmRfbG9nKGNoYXIgKnRtcGJ1ZiwgaW50IGxlbikKK3sKKwljaGFyICpwID0gdG1wYnVmOworCisJdG1wYnVmICs9IGxlbjsKKwl3aGlsZSAocCA8IHRtcGJ1ZikgeworCQljaGFyIGM7CisJCWNoYXIgKnEgPSBHLnBhcnNlYnVmOworCQlpbnQgcHJpID0gKExPR19VU0VSIHwgTE9HX05PVElDRSk7CisKKwkJaWYgKCpwID09ICc8JykgeworCQkJLyogUGFyc2UgdGhlIG1hZ2ljIHByaW9yaXR5IG51bWJlciAqLworCQkJcHJpID0gYmJfc3RydG91KHAgKyAxLCAmcCwgMTApOworCQkJaWYgKCpwID09ICc+JykKKwkJCQlwKys7CisJCQlpZiAocHJpICYgfihMT0dfRkFDTUFTSyB8IExPR19QUklNQVNLKSkKKwkJCQlwcmkgPSAoTE9HX1VTRVIgfCBMT0dfTk9USUNFKTsKKwkJfQorCisJCXdoaWxlICgoYyA9ICpwKyspKSB7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCWMgPSAnICc7CisJCQlpZiAoIShjICYgfjB4MWYpICYmIGMgIT0gJ1x0JykgeworCQkJCSpxKysgPSAnXic7CisJCQkJYyArPSAnQCc7IC8qIF5ALCBeQSwgXkIuLi4gKi8KKwkJCX0KKwkJCSpxKysgPSBjOworCQl9CisJCSpxID0gJ1wwJzsKKworCQkvKiBOb3cgbG9nIGl0ICovCisJCXRpbWVzdGFtcF9hbmRfbG9nKHByaSwgRy5wYXJzZWJ1ZiwgcSAtIEcucGFyc2VidWYpOworCX0KK30KKworI2lmZGVmIFNZU0xPR0RfTUFSSworc3RhdGljIHZvaWQgZG9fbWFyayhpbnQgc2lnKQoreworCWlmIChHLm1hcmtJbnRlcnZhbCkgeworCQl0aW1lc3RhbXBfYW5kX2xvZ19pbnRlcm5hbCgiLS0gTUFSSyAtLSIpOworCQlhbGFybShHLm1hcmtJbnRlcnZhbCk7CisJfQorfQorI2VuZGlmCisKKy8qIERvbid0IGlubGluZTogcHJldmVudCBzdHJ1Y3Qgc29ja2FkZHJfdW4gdG8gdGFrZSB1cCBzcGFjZSBvbiBzdGFjaworICogcGVybWFuZW50bHkgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgY3JlYXRlX3NvY2tldCh2b2lkKQoreworCXN0cnVjdCBzb2NrYWRkcl91biBzdW54OworCWludCBzb2NrX2ZkOworCWNoYXIgKmRldl9sb2dfbmFtZTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU1RFTUQKKwlpZiAoc2RfbGlzdGVuX2ZkcygpID09IDEpCisJCXJldHVybiBTRF9MSVNURU5fRkRTX1NUQVJUOworI2VuZGlmCisKKwltZW1zZXQoJnN1bngsIDAsIHNpemVvZihzdW54KSk7CisJc3VueC5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKworCS8qIFVubGluayBvbGQgL2Rldi9sb2cgb3Igb2JqZWN0IGl0IHBvaW50cyB0by4gKi8KKwkvKiAoaWYgaXQgZXhpc3RzLCBiaW5kIHdpbGwgZmFpbCkgKi8KKwlzdHJjcHkoc3VueC5zdW5fcGF0aCwgIi9kZXYvbG9nIik7CisJZGV2X2xvZ19uYW1lID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoIi9kZXYvbG9nIik7CisJaWYgKGRldl9sb2dfbmFtZSkgeworCQlzYWZlX3N0cm5jcHkoc3VueC5zdW5fcGF0aCwgZGV2X2xvZ19uYW1lLCBzaXplb2Yoc3VueC5zdW5fcGF0aCkpOworCQlmcmVlKGRldl9sb2dfbmFtZSk7CisJfQorCXVubGluayhzdW54LnN1bl9wYXRoKTsKKworCXNvY2tfZmQgPSB4c29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU0sIDApOworCXhiaW5kKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnN1bngsIHNpemVvZihzdW54KSk7CisJY2htb2QoIi9kZXYvbG9nIiwgMDY2Nik7CisKKwlyZXR1cm4gc29ja19mZDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKK3N0YXRpYyBpbnQgdHJ5X3RvX3Jlc29sdmVfcmVtb3RlKHJlbW90ZUhvc3RfdCAqcmgpCit7CisJaWYgKCFyaC0+cmVtb3RlQWRkcikgeworCQl1bnNpZ25lZCBub3cgPSBtb25vdG9uaWNfc2VjKCk7CisKKwkJLyogRG9uJ3QgcmVzb2x2ZSBuYW1lIHRvbyBvZnRlbiAtIEROUyB0aW1lb3V0cyBjYW4gYmUgYmlnICovCisJCWlmICgobm93IC0gcmgtPmxhc3RfZG5zX3Jlc29sdmUpIDwgRE5TX1dBSVRfU0VDKQorCQkJcmV0dXJuIC0xOworCQlyaC0+bGFzdF9kbnNfcmVzb2x2ZSA9IG5vdzsKKwkJcmgtPnJlbW90ZUFkZHIgPSBob3N0MnNvY2thZGRyKHJoLT5yZW1vdGVIb3N0bmFtZSwgNTE0KTsKKwkJaWYgKCFyaC0+cmVtb3RlQWRkcikKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHhzb2NrZXQocmgtPnJlbW90ZUFkZHItPnUuc2Euc2FfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkb19zeXNsb2dkKHZvaWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgZG9fc3lzbG9nZCh2b2lkKQoreworCWludCBzb2NrX2ZkOworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKKwlsbGlzdF90ICppdGVtOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9EVVAKKwlpbnQgbGFzdF9zeiA9IC0xOworCWNoYXIgKmxhc3RfYnVmOworCWNoYXIgKnJlY3ZidWYgPSBHLnJlY3ZidWY7CisjZWxzZQorI2RlZmluZSByZWN2YnVmIChHLnJlY3ZidWYpCisjZW5kaWYKKworCS8qIFNldCB1cCBzaWduYWwgaGFuZGxlcnMgKHNvIHRoYXQgdGhleSBpbnRlcnJ1cHQgcmVhZCgpKSAqLworCXNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHVEVSTSwgcmVjb3JkX3NpZ25vKTsKKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0lOVCwgcmVjb3JkX3NpZ25vKTsKKwkvL3NpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHUVVJVCwgcmVjb3JkX3NpZ25vKTsKKwlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKyNpZmRlZiBTWVNMT0dEX01BUksKKwlzaWduYWwoU0lHQUxSTSwgZG9fbWFyayk7CisJYWxhcm0oRy5tYXJrSW50ZXJ2YWwpOworI2VuZGlmCisJc29ja19mZCA9IGNyZWF0ZV9zb2NrZXQoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HICYmIChvcHRpb25fbWFzazMyICYgT1BUX2NpcmN1bGFybG9nKSkgeworCQlpcGNzeXNsb2dfaW5pdCgpOworCX0KKworCXRpbWVzdGFtcF9hbmRfbG9nX2ludGVybmFsKCJzeXNsb2dkIHN0YXJ0ZWQ6IEJ1c3lCb3ggdiIgQkJfVkVSKTsKKworCXdoaWxlICghYmJfZ290X3NpZ25hbCkgeworCQlzc2l6ZV90IHN6OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9EVVAKKwkJbGFzdF9idWYgPSByZWN2YnVmOworCQlpZiAocmVjdmJ1ZiA9PSBHLnJlY3ZidWYpCisJCQlyZWN2YnVmID0gRy5yZWN2YnVmICsgTUFYX1JFQUQ7CisJCWVsc2UKKwkJCXJlY3ZidWYgPSBHLnJlY3ZidWY7CisjZW5kaWYKKyByZWFkX2FnYWluOgorCQlzeiA9IHJlYWQoc29ja19mZCwgcmVjdmJ1ZiwgTUFYX1JFQUQgLSAxKTsKKwkJaWYgKHN6IDwgMCkgeworCQkJaWYgKCFiYl9nb3Rfc2lnbmFsKQorCQkJCWJiX3BlcnJvcl9tc2coInJlYWQgZnJvbSAvZGV2L2xvZyIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBEcm9wIHRyYWlsaW5nICdcbicgYW5kIE5VTHMgKHR5cGljYWxseSB0aGVyZSBpcyBvbmUgTlVMKSAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKHN6ID09IDApCisJCQkJZ290byByZWFkX2FnYWluOworCQkJLyogbWFuIDMgc3lzbG9nIHNheXM6ICJBIHRyYWlsaW5nIG5ld2xpbmUgaXMgYWRkZWQgd2hlbiBuZWVkZWQiLgorCQkJICogSG93ZXZlciwgbmVpdGhlciBnbGliYyBub3IgdWNsaWJjIGRvIHRoaXM6CisJCQkgKiBzeXNsb2cocHJpbywgInRlc3QiKSAgIHNlbmRzICJ0ZXN0XDAiIHRvIC9kZXYvbG9nLAorCQkJICogc3lzbG9nKHByaW8sICJ0ZXN0XG4iKSBzZW5kcyAidGVzdFxuXDAiLgorCQkJICogSU9XOiBuZXdsaW5lIGlzIHBhc3NlZCB2ZXJiYXRpbSEKKwkJCSAqIEkgdGFrZSBpdCB0byBtZWFuIHRoYXQgaXQncyBzeXNsb2dkJ3Mgam9iCisJCQkgKiB0byBtYWtlIHRob3NlIGxvb2sgaWRlbnRpY2FsIGluIHRoZSBsb2cgZmlsZXMuICovCisJCQlpZiAocmVjdmJ1Zltzei0xXSAhPSAnXDAnICYmIHJlY3ZidWZbc3otMV0gIT0gJ1xuJykKKwkJCQlicmVhazsKKwkJCXN6LS07CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0RVUAorCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfZHVwKSAmJiAoc3ogPT0gbGFzdF9zeikpCisJCQlpZiAobWVtY21wKGxhc3RfYnVmLCByZWN2YnVmLCBzeikgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJbGFzdF9zeiA9IHN6OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCQkvKiBTdG9jayBzeXNsb2dkIHNlbmRzIGl0ICdcbictdGVybWluYXRlZAorCQkgKiBvdmVyIG5ldHdvcmssIG1pbWljIHRoYXQgKi8KKwkJcmVjdmJ1Zltzel0gPSAnXG4nOworCisJCS8qIFdlIGFyZSBub3QgbW9kaWZ5aW5nIGxvZyBtZXNzYWdlcyBpbiBhbnkgd2F5IGJlZm9yZSBzZW5kICovCisJCS8qIFJlbW90ZSBzaXRlIGNhbm5vdCB0cnVzdCBfdXNfIGFueXdheSBhbmQgbmVlZCB0byBkbyB2YWxpZGF0aW9uIGFnYWluICovCisJCWZvciAoaXRlbSA9IEcucmVtb3RlSG9zdHM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXJlbW90ZUhvc3RfdCAqcmggPSAocmVtb3RlSG9zdF90ICopaXRlbS0+ZGF0YTsKKworCQkJaWYgKHJoLT5yZW1vdGVGRCA9PSAtMSkgeworCQkJCXJoLT5yZW1vdGVGRCA9IHRyeV90b19yZXNvbHZlX3JlbW90ZShyaCk7CisJCQkJaWYgKHJoLT5yZW1vdGVGRCA9PSAtMSkKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFNlbmQgbWVzc2FnZSB0byByZW1vdGUgbG9nZ2VyLgorCQkJICogT24gc29tZSBlcnJvcnMsIGNsb3NlIGFuZCBzZXQgcmVtb3RlRkQgdG8gLTEKKwkJCSAqIHNvIHRoYXQgRE5TIHJlc29sdXRpb24gaXMgcmV0cmllZC4KKwkJCSAqLworCQkJaWYgKHNlbmR0byhyaC0+cmVtb3RlRkQsIHJlY3ZidWYsIHN6KzEsCisJCQkJCU1TR19ET05UV0FJVCB8IE1TR19OT1NJR05BTCwKKwkJCQkJJihyaC0+cmVtb3RlQWRkci0+dS5zYSksIHJoLT5yZW1vdGVBZGRyLT5sZW4pID09IC0xCisJCQkpIHsKKwkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQ09OTlJFU0VUOgorCQkJCWNhc2UgRU5PVENPTk46IC8qIHBhcmFub2lhICovCisJCQkJY2FzZSBFUElQRToKKwkJCQkJY2xvc2UocmgtPnJlbW90ZUZEKTsKKwkJCQkJcmgtPnJlbW90ZUZEID0gLTE7CisJCQkJCWZyZWUocmgtPnJlbW90ZUFkZHIpOworCQkJCQlyaC0+cmVtb3RlQWRkciA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HIHx8IChvcHRpb25fbWFzazMyICYgT1BUX2xvY2FsbG9nKSkgeworCQkJcmVjdmJ1Zltzel0gPSAnXDAnOyAvKiBlbnN1cmUgaXQgKmlzKiBOVUwgdGVybWluYXRlZCAqLworCQkJc3BsaXRfZXNjYXBlX2FuZF9sb2cocmVjdmJ1Ziwgc3opOworCQl9CisJfSAvKiB3aGlsZSAoIWJiX2dvdF9zaWduYWwpICovCisKKwl0aW1lc3RhbXBfYW5kX2xvZ19pbnRlcm5hbCgic3lzbG9nZCBleGl0aW5nIik7CisJcHV0cygic3lzbG9nZCBleGl0aW5nIik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cpCisJCWlwY3N5c2xvZ19jbGVhbnVwKCk7CisJa2lsbF9teXNlbGZfd2l0aF9zaWcoYmJfZ290X3NpZ25hbCk7CisjdW5kZWYgcmVjdmJ1ZgorfQorCitpbnQgc3lzbG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3lzbG9nZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisJY2hhciBPUFRJT05fREVDTDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCisJbGxpc3RfdCAqcmVtb3RlQWRkckxpc3QgPSBOVUxMOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCS8qIE5vIG5vbi1vcHRpb24gcGFyYW1zLCAtUiBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCIgSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCI6Ujo6Iik7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsIE9QVElPTl9QQVJBTSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCXdoaWxlIChyZW1vdGVBZGRyTGlzdCkgeworCQlyZW1vdGVIb3N0X3QgKnJoID0geHphbGxvYyhzaXplb2YoKnJoKSk7CisJCXJoLT5yZW1vdGVIb3N0bmFtZSA9IGxsaXN0X3BvcCgmcmVtb3RlQWRkckxpc3QpOworCQlyaC0+cmVtb3RlRkQgPSAtMTsKKwkJcmgtPmxhc3RfZG5zX3Jlc29sdmUgPSBtb25vdG9uaWNfc2VjKCkgLSBETlNfV0FJVF9TRUMgLSAxOworCQlsbGlzdF9hZGRfdG8oJkcucmVtb3RlSG9zdHMsIHJoKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFNZU0xPR0RfTUFSSworCWlmIChvcHRzICYgT1BUX21hcmspIC8vIC1tCisJCUcubWFya0ludGVydmFsID0geGF0b3VfcmFuZ2Uob3B0X20sIDAsIElOVF9NQVgvNjApICogNjA7CisjZW5kaWYKKwkvL2lmIChvcHRzICYgT1BUX25vZm9yaykgLy8gLW4KKwkvL2lmIChvcHRzICYgT1BUX291dGZpbGUpIC8vIC1PCisJaWYgKG9wdHMgJiBPUFRfbG9nbGV2ZWwpIC8vIC1sCisJCUcubG9nTGV2ZWwgPSB4YXRvdV9yYW5nZShvcHRfbCwgMSwgOCk7CisJLy9pZiAob3B0cyAmIE9QVF9zbWFsbCkgLy8gLVMKKyNpZiBFTkFCTEVfRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWlmIChvcHRzICYgT1BUX2ZpbGVzaXplKSAvLyAtcworCQlHLmxvZ0ZpbGVTaXplID0geGF0b3VfcmFuZ2Uob3B0X3MsIDAsIElOVF9NQVgvMTAyNCkgKiAxMDI0OworCWlmIChvcHRzICYgT1BUX3JvdGF0ZWNudCkgLy8gLWIKKwkJRy5sb2dGaWxlUm90YXRlID0geGF0b3VfcmFuZ2Uob3B0X2IsIDAsIDk5KTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKwlpZiAob3B0X0MpIC8vIC1DbgorCQlHLnNobV9zaXplID0geGF0b3VsX3JhbmdlKG9wdF9DLCA0LCBJTlRfTUFYLzEwMjQpICogMTAyNDsKKyNlbmRpZgorCS8qIElmIHRoZXkgaGF2ZSBub3Qgc3BlY2lmaWVkIHJlbW90ZSBsb2dnaW5nLCB0aGVuIGxvZyBsb2NhbGx5ICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cgJiYgIShvcHRzICYgT1BUX3JlbW90ZWxvZykpIC8vIC1SCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX2xvY2FsbG9nOworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCisJcGFyc2Vfc3lzbG9nZGNmZyhvcHRfZik7CisjZW5kaWYKKworCS8qIFN0b3JlIGF3YXkgbG9jYWxob3N0J3MgbmFtZSBiZWZvcmUgdGhlIGZvcmsgKi8KKwlHLmhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCSpzdHJjaHJudWwoRy5ob3N0bmFtZSwgJy4nKSA9ICdcMCc7CisKKwlpZiAoIShvcHRzICYgT1BUX25vZm9yaykpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DSERJUl9ST09ULCBhcmd2KTsKKwl9CisJLy91bWFzaygwKTsgLSB3aHk/PworCXdyaXRlX3BpZGZpbGUoIi92YXIvcnVuL3N5c2xvZ2QucGlkIik7CisJZG9fc3lzbG9nZCgpOworCS8qIHJldHVybiBFWElUX1NVQ0NFU1M7ICovCit9CisKKy8qIENsZWFuIHVwLiBOZWVkZWQgYmVjYXVzZSB3ZSBhcmUgaW5jbHVkZWQgZnJvbSBzeXNsb2dkX2FuZF9sb2dnZXIuYyAqLworI3VuZGVmIERFQlVHCisjdW5kZWYgU1lTTE9HRF9NQVJLCisjdW5kZWYgU1lTTE9HRF9XUkxPQ0sKKyN1bmRlZiBHCisjdW5kZWYgR0xPQkFMUworI3VuZGVmIElOSVRfRworI3VuZGVmIE9QVElPTl9TVFIKKyN1bmRlZiBPUFRJT05fREVDTAorI3VuZGVmIE9QVElPTl9QQVJBTQpkaWZmIC0tZ2l0IGEvc3lza2xvZ2Qvc3lzbG9nZF9hbmRfbG9nZ2VyLmMgYi9zeXNrbG9nZC9zeXNsb2dkX2FuZF9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY0ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2Qvc3lzbG9nZF9hbmRfbG9nZ2VyLmMKQEAgLTAsMCArMSw1MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcHJpb3JpdHluYW1lc1tdIGFuZCBmYWNpbGl0eW5hbWVzW10KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjZGVmaW5lIFNZU0xPR19OQU1FU19DT05TVAorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaWYgMAorLyogRm9yIHRoZSByZWNvcmQ6IHdpdGggU1lTTE9HX05BTUVTIDxzeXNsb2cuaD4gZGVmaW5lcworICogKG5vdCBkZWNsYXJlcykgdGhlIGZvbGxvd2luZzoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2NvZGUgeworCS8qY29uc3QqLyBjaGFyICpjX25hbWU7CisJaW50IGNfdmFsOworfSBDT0RFOworLypjb25zdCovIENPREUgcHJpb3JpdHluYW1lc1tdID0geworICAgIHsgImFsZXJ0IiwgTE9HX0FMRVJUIH0sCisuLi4KKyAgICB7IE5VTEwsIC0xIH0KK307CisvKiBzYW1lIGZvciBmYWNpbGl0eW5hbWVzW10gKi8KKworLyogVGhpcyBNVVNUIG9jY3VyIG9ubHkgb25jZSBwZXIgZW50aXJlIGV4ZWN1dGFibGUsCisgKiB0aGVyZWZvcmUgd2UgY2FuJ3QganVzdCBkbyBpdCBpbiBzeXNsb2dkLmMgYW5kIGxvZ2dlci5jIC0KKyAqIHRoZXJlIHdpbGwgYmUgdHdvIGNvcGllcyBvZiBpdC4KKyAqCisgKiBXZSBjYW5ub3QgZXZlbiBkbyBpdCBpbiBzZXBhcmF0ZSBmaWxlIGFuZCB0aGVuIGp1c3QgcmVmZXJlbmNlCisgKiBwcmlvcml0eW5hbWVzW10gZnJvbSBzeXNsb2dkLmMgYW5kIGxvZ2dlci5jIC0gYmFyZSA8c3lzbG9nLmg+CisgKiB3aWxsIG5vdCBlbWl0IGV4dGVybiBkZWNscyBmb3IgcHJpb3JpdHluYW1lc1tdISBBdHRlbXB0cyB0bworICogZW1pdCAibWF0Y2hpbmciIHN0cnVjdCBfY29kZSBkZWNsYXJhdGlvbiBkZWZlYXQgdGhlIHdob2xlIHB1cnBvc2UKKyAqIG9mIDxzeXNsb2cuaD4uCisgKgorICogRm9yIG5vdywgc3lzbG9nZC5jIGFuZCBsb2dnZXIuYyBhcmUgc2ltcGx5IGNvbXBpbGVkIGludG8KKyAqIG9uZSBvYmplY3QgZmlsZS4KKyAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfU1lTTE9HRAorI2luY2x1ZGUgInN5c2xvZ2QuYyIKKyNlbmRpZgorCisjaWYgRU5BQkxFX0xPR0dFUgorI2luY2x1ZGUgImxvZ2dlci5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvUkVBRE1FIGIvdGVzdHN1aXRlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQzYTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL1JFQURNRQpAQCAtMCwwICsxLDUyIEBACitUbyBydW4gdGhlIHRlc3Qgc3VpdGUsIGNoYW5nZSB0byB0aGlzIGRpcmVjdG9yeSBhbmQgcnVuICIuL3J1bnRlc3QiLiAgSXQgd2lsbAorcnVuIGFsbCBvZiB0aGUgdGVzdCBjYXNlcywgYW5kIGxpc3QgdGhvc2Ugd2l0aCB1bmV4cGVjdGVkIG91dGNvbWVzLiAgQWRkaW5nIHRoZQorLXYgb3B0aW9uIHdpbGwgY2F1c2UgaXQgdG8gc2hvdyBleHBlY3RlZCBvdXRjb21lcyBhcyB3ZWxsLiAgVG8gb25seSBydW4gdGhlIHRlc3QKK2Nhc2VzIGZvciBwYXJ0aWN1bGFyIGFwcGxldHM6CisKKy4vcnVudGVzdCA8YXBwbGV0MT4gPGFwcGxldDI+Li4uCisKK1NldCBTS0lQX0tOT1dOX0JVR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYW55IG5vbi1lbXB0eSB2YWx1ZQordG8gZXhjbHVkZSB0ZXN0cyB3aGljaCBhcmUga25vd24gdG8gZmFpbC4KKworU2V0IFNLSVBfSU5URVJORVRfVEVTVFMgdG8gZXhjbHVkZSB0ZXN0cyB3aGljaCByZXF1aXJlIHdvcmtpbmcKK2ludGVybmV0IGNvbm5lY3Rpb24uCisKKworQ29tbW9uIGNhdXNlcyBvZiBmYWxzZSBwb3NpdGl2ZXM6CisKK0ZvciBidXN5Ym94IGJ1aWx0IGFnYWluc3QgdWNsaWJjLCAvZXRjL1RaIGRvZXMgbm90IGV4aXN0IG9yIGRvZXMgbm90IG1hdGNoCitob3N0IHN5c3RlbSB0aW1lem9uZSBzZXR0aW5nLiBGb3IgZ2xpYmMgYmFzZWQgaG9zdCBzeXN0ZW1zLCB0aW1lem9uZSBzZXR0aW5ncworYXJlIGluIC9ldGMvbG9jYWx0aW1lLgorCitMQU5HIGFuZCBMQ194eHggZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCB0byBub24tQyBsb2NhbGUuCisKKworRGV2ZWxvcGVyJ3Mgbm90ZXM6CisKK1RoZSB0ZXN0IGNhc2VzIGZvciBhbiBhcHBsZXQgcmVzaWRlIGluIHRoZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGFwcGxldCBuYW1lLgorVGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgdGhlIGFzc2VydGlvbiB0aGF0IGlzIHRlc3RlZC4KK1RoZSB0ZXN0IGNhc2Ugc2hvdWxkIGJlIGEgc2hlbGwgZnJhZ21lbnQgdGhhdCByZXR1cm5zIHN1Y2Nlc3NmdWxseQoraWYgdGhlIHRlc3QgY2FzZSBwYXNzZXMsIGFuZCB1bnN1Y2Nlc3NmdWxseSBvdGhlcndpc2UuCisKK0lmIHRoZSB0ZXN0IGNhc2UgcmVsaWVzIG9uIGEgY2VydGFpbiBmZWF0dXJlLCBpdCBzaG91bGQgaW5jbHVkZSB0aGUgc3RyaW5nCisiRkVBVFVSRTogIiBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSBpbiBhIGNvbW1lbnQuICBJZiBpdCBpcyBhbHdheXMKK2V4cGVjdGVkIHRvIGZhaWwsIGl0IHNob3VsZCBpbmNsdWRlIHRoZSBzdHJpbmcgIlhGQUlMIiBpbiBhIGNvbW1lbnQuCisKKworRm9yIHRoZSBlbnRpcmUgdGVzdHN1aXRlLCB0aGUgY29weXJpZ2h0IGlzIGFzIGZvbGxvd3M6CisKK0NvcHlyaWdodCAoQykgMjAwMSwgMjAwMiAgTWF0dCBLcmFhaQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKK29mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL1RPRE8gYi90ZXN0c3VpdGUvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL1RPRE8KQEAgLTAsMCArMSwyNiBAQAorVGhpcyB0ZXN0c3VpdGUgaXMgcXVpdGUgb2J2aW91c2x5IGEgd29yayBpbiBwcm9ncmVzcy4gIEFzIHN1Y2gsCit0aGVyZSBhcmUgYSBudW1iZXIgb2YgZ29vZCBleHRlbnNpb25zLiAgSWYgeW91IGFyZSBsb29raW5nIGZvcgorc29tZXRoaW5nIHRvIGRvLCBmZWVsIGZyZWUgdG8gdGFja2xlIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmc6CisKK01vdmluZyB0byB0aGUgbmV3IGZvcm1hdC4KKwlUaGUgb2xkIHdheSB3YXMgImxvdHMgb2YgbGl0dGxlIHRlc3RzIGZpbGVzIGluIGEgZGlyZWN0b3J5Iiwgd2hpY2gKKwlkb2Vzbid0IGludGVyYWN0IHdlbGwgd2l0aCBzb3VyY2UgY29udHJvbCBzeXN0ZW1zLiAgVGhlIG5ldyB0ZXN0CisJZm9ybWF0IGlzIGNvbW1hbmQudGVzdHMgZmlsZXMgdGhhdCB1c2UgdGVzdGluZy5zaC4KKworRXZlcnkgYnVzeWJveCBhcHBsZXQgbmVlZHMgYSBjb3JyZXNwb25kaW5nIGFwcGxldC50ZXN0cy4KKworRnVsbCBTVVN2MyB0ZXN0IHN1aXRlLgorCUxldCdzIG1ha2UgdGhlIExpbnV4IFRlc3QgUHJvamVjdCBqZWFsb3VzLCBzaGFsbCB3ZT8gIERvbid0IGp1c3QKKwlhdWRpdCBwcm9ncmFtcyBmb3Igc3RhbmRhcmRzIGNvbXBsaWFuY2UsIF9wcm92ZV8gaXQgd2l0aCBhIHJlZ3Jlc3Npb24KKwl0ZXN0IGhhcm5lc3MuCisKKwlodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzLworCitTb21lIHRlc3RzIG5lZWQgcm9vdCBhY2Nlc3MuCisJSXQncyBoYXJkIHRvIHRlc3QgdGhpbmdzIGxpa2UgbW91bnQgb3IgaW5pdCBhcyBhIG5vcm1hbCB1c2VyLgorCVBvc3NpYmx5IFVzZXIgTW9kZSBMaW51eCBjb3VsZCBiZSB1c2VkIGZvciB0aGlzLCBvciBwZXJoYXBzCisJRXJpaydzIGJ1aWxkcm9vdC4KKworbGliYmIgdW5pdCB0ZXN0aW5nCisJQmVpbmcgYWJsZSB0byB0ZXN0IHRoZSBmdW5jdGlvbnMgb2YgbGliYmIgaW5kaXZpZHVhbGx5IG1heQorCWhlbHAgdG8gcHJldmVudCByZWdyZXNzaW9ucy4KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9hbGxfc291cmNlY29kZS50ZXN0cyBiL3Rlc3RzdWl0ZS9hbGxfc291cmNlY29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZGNiYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2FsbF9zb3VyY2Vjb2RlLnRlc3RzCkBAIC0wLDAgKzEsOTIgQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciB0aGUgc291cmNlY29kZSBiYXNlIGl0c2VsZi4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitbIC1uICIkc3JjZGlyIiBdIHx8IHNyY2Rpcj0kKHB3ZCkKKy4gLi90ZXN0aW5nLnNoCisKKworIworIyBpZiB3ZSBkb24ndCBoYXZlIHRoZSBzb3VyY2Vjb2RlIGF2YWlsYWJsZSwgbGV0J3MganVzdCBiYWlsCisjCitbIC1zICIkc3JjZGlyLy4uL01ha2VmaWxlIiBdIHx8IGV4aXQgMAorWyAtcyAiJHNyY2Rpci8uLi9pbmNsdWRlL2FwcGxldHMuaCIgXSB8fCBleGl0IDAKKworCisjCisjIG1ha2Ugc3VyZSBhbGwgdXNhZ2Ugc3RyaW5ncyBhcmUgcHJvcGVybHkgZXNjYXBlZC4gIG9mdGVudGltZXMgcGVvcGxlIG1pc3MKKyMgYW4gZXNjYXBlIHNlcXVlbmNlIHNvIHdlIGVuZCB1cCB3aXRoOgorIyAjZGVmaW5lIGZvb191c2FnZSBcCisjICAgICAgICIgdGhpcyBsaW5lIGlzIG9rIiBcCisjICAgICAgICIgYXMgaXMgdGhpcyBsaW5lIgorIyAgICAgICAiIGJ1dCB0aGlzIG9uZSBpcyBicm9rZW4gYXMgdGhlIFwgaXMgbWlzc2luZyBmcm9tIGFib3ZlIgorIworJHtDUk9TU19DT01QSUxFfWNwcCAtZEQgLVAgJHNyY2Rpci8uLi9pbmNsdWRlL3VzYWdlLmggXAorCXwgc2VkIC1lICcvXiNkZWZpbmUvZCcgLWUgJy9eJC9kJyA+IHNyYy51c2FnZS5lc2NhcGVkCit0ZXN0aW5nICJVc2FnZSBzdHJpbmdzIGVzY2FwZWQiICJjYXQgc3JjLnVzYWdlLmVzY2FwZWQiICIiICIiICIiCitybSAtZiBzcmMudXNhZ2UuZXNjYXBlZAorCisKKyMKKyMgdmVyaWZ5IHRoZSBhcHBsZXQgb3JkZXIgaXMgY29ycmVjdCBpbiBhcHBsZXRzLmgsIG90aGVyd2lzZQorIyBhcHBsZXRzIHdvbid0IGJlIGNhbGxlZCBwcm9wZXJseS4KKyMKK3NlZCAtbiAtZSAnczpeLy86OicgLWUgJy9eSUZfW0EtWl0qKEFQUExFVC97czosLio6OjtzOi4qKDo6O3M6Ijo6ZztwfScgXAorCSRzcmNkaXIvLi4vaW5jbHVkZS9hcHBsZXRzLmggPiBhcHBsZXQub3JkZXIuY3VycmVudAorTENfQUxMPUMgc29ydCBhcHBsZXQub3JkZXIuY3VycmVudCA+IGFwcGxldC5vcmRlci5jb3JyZWN0Cit0ZXN0aW5nICJBcHBsZXQgb3JkZXIiICJkaWZmIC11IGFwcGxldC5vcmRlci5jdXJyZW50IGFwcGxldC5vcmRlci5jb3JyZWN0IiAiIiAiIiAiIgorcm0gLWYgYXBwbGV0Lm9yZGVyLmN1cnJlbnQgYXBwbGV0Lm9yZGVyLmNvcnJlY3QKKworCisjCisjIGNoZWNrIGZvciBtaXNjIGNvbW1vbiB0eXBvcworIworZmluZCAkc3JjZGlyLy4uLyBcCisJJygnIC10eXBlIGQgLWEgJygnIC1uYW1lIC5zdm4gLW8gLW5hbWUgdGVzdHN1aXRlICcpJyAtcHJ1bmUgJyknIFwKKwktbyAnKCcgLXR5cGUgZiAtYSAtcHJpbnQwICcpJyB8IHhhcmdzIC0wIFwKKwlncmVwIC1JIFwKKwkJLWUgJ1w8Y29tcGF0YWJpbGl0eVw+JyBcCisJCS1lICdcPGNvbXBhdGFibGVcPicgXAorCQktZSAnXDxmb3JkZWdyb3VuZFw+JyBcCisJCS1lICdcPGRlcGVuY3lcPicgLWUgJ1w8ZGVwZW5kYW5jeVw+JyAtZSAnXDxkZXBlbmRhbmNpZXNcPicgXAorCQktZSAnXDxkZWZhbHRcPicgXAorCQktZSAnXDxyZW1haW5nXD4nIFwKKwkJLWUgJ1w8cXVldWVpbmdcPicgXAorCQktZSAnXDxkZXRhdGNoXD4nIFwKKwkJLWUgJ1w8c2VtcGFob3JlXD4nIFwKKwkJLWUgJ1w8cmVwcmVuc3RhdGl2ZVw+JyBcCisJCS1lICdcPG92ZXJyaWRlblw+JyBcCisJCS1lICdcPHJlYWRlZFw+JyBcCisJCS1lICdcPGZvcm1hdGVkXD4nIFwKKwkJLWUgJ1w8YWxnb3JpdGhpY1w+JyBcCisJCS1lICdcPGRlYW1vblw+JyBcCisJCS1lICdcPGRlcmVmZXJuY2VcPicgXAorCQktZSAnXDxhY29tYWRhdGVcPicgXAorCQl8IHNlZCAtZSAiczpeJHNyY2Rpci9cLlwuLzo6ZyIgPiBzcmMudHlwb3MKK3Rlc3RpbmcgIkNvbW1vbiB0eXBvcyIgImNhdCBzcmMudHlwb3MiICIiICIiICIiCitybSAtZiBzcmMudHlwb3MKKworCisjCisjIGRvbid0IGFsbG93IG9ic29sZXRlIGZ1bmN0aW9ucworIworZmluZCAkc3JjZGlyLy4uICcoJyAtbmFtZSAnKi5jJyAtbyAtbmFtZSAnKi5oJyAnKScgLXByaW50MCB8IHhhcmdzIC0wIFwKKwlncmVwIC1FIC1lICdcPChiY21wfGJjb3B5fGJ6ZXJvfGdldHdkfGluZGV4fG1rdGVtcHxyaW5kZXh8dXRpbWV8c2lnYmxvY2t8c2lnZ2V0bWFza3xzaWdzZXRtYXNrKVw+W1s6c3BhY2U6XV0qXCgnIFwKKwl8IHNlZCAtZSAiczpeJHNyY2Rpci9cLlwuLzo6ZyIgPiBzcmMub2Jzb2xldGUuZnVuY3MKK3Rlc3RpbmcgIk9ic29sZXRlIGZ1bmN0aW9uIHVzYWdlIiAiY2F0IHNyYy5vYnNvbGV0ZS5mdW5jcyIgIiIgIiIgIiIKK3JtIC1mIHNyYy5vYnNvbGV0ZS5mdW5jcworCisKKyMKKyMgZG9uJ3QgYWxsb3cgb2Jzb2xldGUgaGVhZGVycworIworZmluZCAkc3JjZGlyLy4uICcoJyAtbmFtZSAnKi5jJyAtbyAtbmFtZSAnKi5oJyAnKScgLXByaW50MCB8IHhhcmdzIC0wIFwKKwlncmVwIC1FIC1lICdcPChtYWxsb2N8bWVtb3J5fHN5cy8oZXJybm98ZmNudGx8c2lnbmFsfHN0cm9wdHN8dGVybWlvc3x1bmlzdGQpKVwuaFw+JyBcCisJfCBzZWQgLWUgInM6XiRzcmNkaXIvXC5cLi86OmciID4gc3JjLm9ic29sZXRlLmhlYWRlcnMKK3Rlc3RpbmcgIk9ic29sZXRlIGhlYWRlcnMiICJjYXQgc3JjLm9ic29sZXRlLmhlYWRlcnMiICIiICIiICIiCitybSAtZiBzcmMub2Jzb2xldGUuaGVhZGVycworCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2FyLnRlc3RzIGIvdGVzdHN1aXRlL2FyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhOGViOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYXIudGVzdHMKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIE5va2lhIENvcnBvcmF0aW9uCisjIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFNoaXNoa2luCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZChzKSIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworb3B0aW9uYWwgRkVBVFVSRV9BUl9DUkVBVEUKKworcm0gdGVzdC5hIDI+L2Rldi9udWxsCit0ZXN0aW5nICJhciBjcmVhdGVzIGFyY2hpdmVzIiBcCisgICAgICAgImFyIHJjIHRlc3QuYSBSRUFETUUgJiYgYXIgcCB0ZXN0LmEgUkVBRE1FIHwgbWQ1c3VtIiBcCisgICAgICAgIiQobWQ1c3VtIDxSRUFETUUpXG4iIFwKKyAgICAgICAiIiBcCisgICAgICAgIiIKK3JtIHRlc3QuYQorCit0ZXN0aW5nICJhciByZXBsYWNlcyB0aGluZ3MgaW4gYXJjaGl2ZXMiIFwKKyAgICAgICAiZWNobyAnYmxhaCEnID5maWxlMSAmJiBlY2hvICdibGFzdCEnID5maWxlMiAmJiBhciBjciB0ZXN0LmEgUkVBRE1FIGZpbGUxIGZpbGUyICYmIG12IGZpbGUyIGZpbGUxICYmIGFyIGNyIHRlc3QuYSBmaWxlMSAmJiBhciBwIHRlc3QuYSBmaWxlMSIgXAorICAgICAgICJibGFzdCFcbiIgXAorICAgICAgICIiIFwKKyAgICAgICAiIgorcm0gdGVzdC5hIGZpbGUxIGZpbGUxIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2FzaC50ZXN0cyBiL3Rlc3RzdWl0ZS9hc2gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE5OTI0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9hc2gudGVzdHMKQEAgLTAsMCArMSw4MyBAQAorIyEvYmluL3NoCisjCisjIFRoZXNlIGFyZSBub3QgYXNoIHRlc3RzLCB3ZSB1c2UgYXNoIGFzIGEgd2F5IHRvIHRlc3QgbGluZWVkaXQhCisjCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKwordGVzdCB4IkNPTkZJR19TQ1JJUFQiID0geCJ5IiB8fCBleGl0IDAKK3Rlc3QgeCJDT05GSUdfSEVYRFVNUCIgPSB4InkiIHx8IGV4aXQgMAordGVzdCB4IkNPTkZJR19GRUFUVVJFX0RFVlBUUyIgPSB4InkiIHx8IGV4aXQgMAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK2lmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOIiA9IHgieSI7IHRoZW4KK3Rlc3RpbmcgIk9uZSBieXRlIHdoaWNoIGlzIG5vdCB2YWxpZCB1bmljb2RlIGNoYXIgZm9sbG93ZWQgYnkgdmFsaWQgaW5wdXQiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgZmYgMmQgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Li0ufAorMDAwMDAwMDMKKyIgXAorCSIiIFwKKwkiZWNobyBceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKKwordGVzdGluZyAiMzAgYnl0ZXMgd2hpY2ggYXJlIG5vdCB2YWxpZCB1bmljb2RlIGNoYXJzIGZvbGxvd2VkIGJ5IHZhbGlkIGlucHV0IiBcCisJInNjcmlwdCAtcSAtYyAnYXNoJyAvZGV2L251bGwgPi9kZXYvbnVsbDsgY2F0IGFzaC5vdXRwdXQiIFwKKwkiXAorMDAwMDAwMDAgIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmICBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDAxMCAgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgIGZmIGZmIGZmIGZmIGZmIGZmIDJkIDBhICB8Li4uLi4uLi4uLi4uLi4tLnwKKzAwMDAwMDIwCisiIFwKKwkiIiBcCisJImVjaG8gXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKK2Vsc2UKK3Rlc3RpbmcgIk9uZSBieXRlIHdoaWNoIGlzIG5vdCB2YWxpZCB1bmljb2RlIGNoYXIgZm9sbG93ZWQgYnkgdmFsaWQgaW5wdXQiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgM2YgMmQgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Py0ufAorMDAwMDAwMDMKKyIgXAorCSIiIFwKKwkiZWNobyBceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKKwordGVzdGluZyAiMzAgYnl0ZXMgd2hpY2ggYXJlIG5vdCB2YWxpZCB1bmljb2RlIGNoYXJzIGZvbGxvd2VkIGJ5IHZhbGlkIGlucHV0IiBcCisJInNjcmlwdCAtcSAtYyAnYXNoJyAvZGV2L251bGwgPi9kZXYvbnVsbDsgY2F0IGFzaC5vdXRwdXQiIFwKKwkiXAorMDAwMDAwMDAgIDNmIDNmIDNmIDNmIDNmIDNmIDNmIDNmICAzZiAzZiAzZiAzZiAzZiAzZiAzZiAzZiAgfD8/Pz8/Pz8/Pz8/Pz8/Pz98CiswMDAwMDAxMCAgM2YgM2YgM2YgM2YgM2YgM2YgM2YgM2YgIDNmIDNmIDNmIDNmIDNmIDNmIDJkIDBhICB8Pz8/Pz8/Pz8/Pz8/Pz8tLnwKKzAwMDAwMDIwCisiIFwKKwkiIiBcCisJImVjaG8gXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmLSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKK2ZpCisKKworIyBOb3Qgc3VyZSB0aGlzIGJlaGF2aW9yIGlzIHBlcmZlY3Q6IHdlIGxvc2UgYWxsIGludmFsaWQgaW5wdXQgd2hpY2ggcHJlY2VkZXMKKyMgYXJyb3cga2V5cyBhbmQgc3VjaC4gSW4gdGhpcyBleGFtcGxlLCBceGZmXHhmZiBhcmUgbG9zdAordGVzdGluZyAiMiBieXRlcyB3aGljaCBhcmUgbm90IHZhbGlkIHVuaWNvZGUgY2hhcnMgZm9sbG93ZWQgYnkgbGVmdCBhcnJvdyBrZXkiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgM2QgMmQgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PS0ufAorMDAwMDAwMDMKKyIgXAorCSIiIFwKKwkiZWNobyA9K1x4ZmZceGZmXHgxYlx4NWJceDQ0LSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbiIKKworIyBhc2ggc2hvdWxkIHNlZSAiZWNobyBceGZmXG4iLHBhdXNlIC0+IGV4ZWN1dGUgaXQgYXMgImVjaG8gPyIgKHdoaWNoIGlzCisjIG5vdCBjaGVja2VkIGJ5IHRoZSB0ZXN0KSwgdGhlbiByZWFkIGFuZCBleGVjdXRlIHRoZSByZXN0OiAiZWNobyBBIHwgLi4uIgorIyBUaGUgYnVnIHdhcyB0aGF0IGFzaCB3YXMgZWF0aW5nIHRoZSBiZWdpbm5pbmcgb2YgImVjaG8gQSIgZGVzcGl0ZSB0aGUgcGF1c2UuCit0ZXN0aW5nICJJbnZhbGlkIHVuaWNvZGUgY2hhcnMgZm9sbG93ZWQgYnkgYSBwYXVzZSBkbyBub3QgZWF0IG5leHQgY2hhcnMiIFwKKwkieyAkRUNITyAtbmUgJ2VjaG8gXHhmZlxuJzsgc2xlZXAgMTsgJEVDSE8gLW5lICdlY2hvIEEgfCBoZXhkdW1wIC1DID5hc2gub3V0cHV0OyBleGl0OyBleGl0OyBleGl0OyBleGl0XG4nOyB9IFwKKyAgICAgICAgIHwgc2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgNDEgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8QS58CiswMDAwMDAwMgorIiBcCisJIiIgIiIKKworcm0gYXNoLm91dHB1dAorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9hd2sudGVzdHMgYi90ZXN0c3VpdGUvYXdrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZmU5YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYXdrLnRlc3RzCkBAIC0wLDAgKzEsMjA1IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJhd2sgLUYgY2FzZSAwIiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiIiAgICAiIiAiIgordGVzdGluZyAiYXdrIC1GIGNhc2UgMSIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjBcbiIgIiIgIlxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgMiIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjJcbiIgIiIgIiNcbiIKK3Rlc3RpbmcgImF3ayAtRiBjYXNlIDMiICJhd2sgLUYgJ1sjXScgJ3sgcHJpbnQgTkYgfSciICIzXG4iICIiICIjYWJjI1xuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNCIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjNcbiIgIiIgIiNhYmMjenpcbiIKK3Rlc3RpbmcgImF3ayAtRiBjYXNlIDUiICJhd2sgLUYgJ1sjXScgJ3sgcHJpbnQgTkYgfSciICI0XG4iICIiICIjYWJjIyN6elxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNiIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjRcbiIgIiIgInojYWJjIyN6elxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNyIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjVcbiIgIiIgInojI2FiYyMjenpcbiIKKworIyA0Mjk0OTY3Mjk1ID0gMHhmZmZmZmZmZgordGVzdGluZyAiYXdrIGJpdHdpc2Ugb3AiICAiYXdrICd7IHByaW50IG9yKDQyOTQ5NjcyOTUsMSkgfSciICI0LjI5NDk3ZSswOVxuIiAiIiAiXG4iCitvcHRpb25hbCBERVNLVE9QCit0ZXN0aW5nICJhd2sgaGV4IGNvbnN0IDEiICJhd2sgJ3sgcHJpbnQgb3IoMHhmZmZmZmZmZiwxKSB9JyIgIjQuMjk0OTdlKzA5XG4iICIiICJcbiIKK3Rlc3RpbmcgImF3ayBoZXggY29uc3QgMiIgImF3ayAneyBwcmludCBvcigweDgwMDAwMDAwLDEpIH0nIiAiMi4xNDc0OGUrMDlcbiIgIiIgIlxuIgordGVzdGluZyAiYXdrIG9jdCBjb25zdCIgICAiYXdrICd7IHByaW50IG9yKDAxMjM0LDEpIH0nIiAgICAgICI2NjlcbiIgICAgICAgICAiIiAiXG4iCitTS0lQPQorCisjIGNoZWNrIHRoYXQgImhleC9vY3QgaW50ZWdlciIgaGV1cmlzdGljIGRvZXNuJ3Qga2ljayBpbiBvbiAwME5OLk5OTgordGVzdGluZyAiYXdrIGZsb2F0aW5nIGNvbnN0IHdpdGggbGVhZGluZyB6ZXJvZXMiIFwKKwkiYXdrICd7IHByaW50ZiBcIiVmICVmXG5cIiwgXCIwMDAuMTIzXCIsIFwiMDA5LjEyM1wiIH0nIiBcCisJIjAuMTIzMDAwIDkuMTIzMDAwXG4iIFwKKwkiIiAiXG4iCisKKyMgbG9uZyBmaWVsZCBzZXBzIHJlcXVpcmluZyByZWdleAordGVzdGluZyAiYXdrIGxvbmcgZmllbGQgc2VwIiAiYXdrIC1GLS0gJ3sgcHJpbnQgTkYsIGxlbmd0aChcJE5GKSwgXCRORiB9JyIgXAorCSIyIDAgXG4zIDAgXG40IDAgXG41IDAgXG4iIFwKKwkiIiBcCisJImEtLVxuYS0tYi0tXG5hLS1iLS1jLS1cbmEtLWItLWMtLWQtLSIKKworIyAnQChzYW1wfGNvZGV8ZmlsZSlceycgaXMgYW4gaW52YWxpZCBleHRlbmRlZCByZWdleCAodW5tYXRjaGVkICd7JyksCisjIGJ1dCBnYXdrIDMuMS41IGRvZXMgbm90IGJhaWwgb3V0IG9uIGl0LgordGVzdGluZyAiYXdrIGdzdWIgZmFsbHMgYmFjayB0byBub24tZXh0ZW5kZWQtcmVnZXgiIFwKKwkiYXdrICdnc3ViKFwiQChzYW1wfGNvZGV8ZmlsZSlce1wiLFwiXCIpOyc7IGVjaG8gXCQ/IiAiMFxuIiAiIiAiSGlcbiIKKworb3B0aW9uYWwgVEFSIEJVTlpJUDIgRkVBVFVSRV9TRUFNTEVTU19CWjIKK3Rlc3QgeCIkU0tJUCIgIT0geCIxIiAmJiB0YXIgeGpmIGF3a190MS50YXIuYnoyCit0ZXN0aW5nICJhd2sgJ2djYyBidWlsZCBidWcnIiBcCisJImF3ayAtZiBhd2tfdDFfb3B0LWZ1bmN0aW9ucy5hd2sgLWYgYXdrX3QxX29wdGgtZ2VuLmF3ayA8YXdrX3QxX2lucHV0IHwgbWQ1c3VtIiBcCisJImY4NDJlMjU2NDYxYTVhYjFlYzYwYjU4ZDE2ZjExMTRmICAtXG4iIFwKKwkiIiAiIgorcm0gLXJmIGF3a190MV8qIDI+L2Rldi9udWxsCitTS0lQPQorCitRPSciOiInCisKK3Rlc3RpbmcgImF3ayBORiBpbiBCRUdJTiIgXAorCSJhd2sgJ0JFR0lOIHsgcHJpbnQgJHtRfSBORiAke1F9IFwkMCAke1F9IFwkMSAke1F9IFwkMiAke1F9IH0nIiBcCisJIjowOjo6OlxuIiBcCisJIiIgIiIKKworcHJnPScKK2Z1bmN0aW9uIGIodG1wKSB7CisJdG1wID0gMDsKKwlwcmludCAiIiB0bXA7ICN0aGlzIGxpbmUgY2F1c2VzIHRoZSBidWcKKwlyZXR1cm4gdG1wOworfQorZnVuY3Rpb24gYyh0bXBjKSB7CisJdG1wYyA9IGIoKTsgcmV0dXJuIHRtcGM7Cit9CitCRUdJTiB7CisJcHJpbnQgKGMoKSA/ICJzdHJpbmciIDogIm51bWJlciIpOworfScKK3Rlc3RpbmcgImF3ayBzdHJpbmcgY2FzdCAoYnVnIDcyNSkiIFwKKwkiYXdrICckcHJnJyIgXAorCSIwXG5udW1iZXJcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgImF3ayBoYW5kbGVzIHdoaXRlc3BhY2UgYmVmb3JlIGFycmF5IHN1YnNjcmlwdCIgXAorCSJhd2sgJ0JFR0lOIHsgYXJyIFszXSA9IDE7IHByaW50IGFyciBbM10gfSciICIxXG4iICIiICIiCisKKyMgR05VIGF3ayAzLjEuNSdzICJwcmludCBFUlJOTyIgcHJpbnRzICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiBpbnN0ZWFkIG9mICIyIiwKKyMgZG8gd2UgbmVlZCB0byBlbXVsYXRlIHRoYXQgYXMgd2VsbD8KK3Rlc3RpbmcgImF3ayBoYW5kbGVzIG5vbi1leGlzdGluZyBmaWxlIGNvcnJlY3RseSIgXAorCSJhd2sgJ0JFR0lOIHsgZ2V0bGluZSBsaW5lIDxcImRvZXNudF9leGlzdFwiOyBwcmludCBFUlJOTzsgRVJSTk89MDsgY2xvc2UoXCJkb2VzbnRfZXhpc3RcIik7IHByaW50IEVSUk5POyBwcmludCBcIk9rXCIgfSciIFwKKwkiMlxuMFxuT2tcbiIgIiIgIiIKKworcHJnPScKK0JFR0lOIHsKKyAgdVsiYSJdPTEKKyAgdVsiYiJdPTEKKyAgdVsiYyJdPTEKKyAgdlsiZCJdPTEKKyAgdlsiZSJdPTEKKyAgdlsiZiJdPTEKKyAgZm9yIChsIGluIHUpIHsKKyAgICBwcmludCAib3V0ZXIxIiwgbDsKKyAgICBmb3IgKGwgaW4gdikgeworICAgICAgcHJpbnQgIiBpbm5lciIsIGw7CisgICAgfQorICAgIHByaW50ICJvdXRlcjIiLCBsOworICB9CisgIHByaW50ICJlbmQiLCBsOworICBsPSJhIgorICBleGl0OworfScKK3Rlc3RpbmcgImF3ayBuZXN0ZWQgbG9vcHMgd2l0aCB0aGUgc2FtZSB2YXJpYWJsZSIgXAorCSJhd2sgJyRwcmcnIiBcCisJIlwKK291dGVyMSBhCisgaW5uZXIgZAorIGlubmVyIGUKKyBpbm5lciBmCitvdXRlcjIgZgorb3V0ZXIxIGIKKyBpbm5lciBkCisgaW5uZXIgZQorIGlubmVyIGYKK291dGVyMiBmCitvdXRlcjEgYworIGlubmVyIGQKKyBpbm5lciBlCisgaW5uZXIgZgorb3V0ZXIyIGYKK2VuZCBmCisiIFwKKwkiIiAiIgorCitwcmc9JworQkVHSU4geworICB1WyJhIl09MQorICB1WyJiIl09MQorICB1WyJjIl09MQorICB2WyJkIl09MQorICB2WyJlIl09MQorICB2WyJmIl09MQorICBmb3IgKGwgaW4gdSkgeworICAgIHByaW50ICJvdXRlcjEiLCBsOworICAgIGZvciAobCBpbiB2KSB7CisgICAgICBwcmludCAiIGlubmVyIiwgbDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludCAib3V0ZXIyIiwgbDsKKyAgfQorICBwcmludCAiZW5kIiwgbDsKKyAgbD0iYSIKKyAgZXhpdDsKK30nCisjIEl0J3Mgbm90IGp1c3QgYnVnZ3ksIGl0IGVudGVycyBpbmZpbml0ZSBsb29wLiBUaHVzIGRpc2FibGVkCitmYWxzZSAmJiB0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgdGVzdGluZyAiYXdrIG5lc3RlZCBsb29wcyB3aXRoIHRoZSBzYW1lIHZhcmlhYmxlIGFuZCBicmVhayIgXAorCSJhd2sgJyRwcmcnIiBcCisJIlwKK291dGVyMSBhCisgaW5uZXIgZAorb3V0ZXIyIGQKK291dGVyMSBiCisgaW5uZXIgZAorb3V0ZXIyIGQKK291dGVyMSBjCisgaW5uZXIgZAorb3V0ZXIyIGQKK2VuZCBkCisiIFwKKwkiIiAiIgorCitwcmc9JworZnVuY3Rpb24gZigpIHsKKyAgZm9yIChsIGluIHYpIHsKKyAgICBwcmludCAiIGlubmVyIiwgbDsKKyAgICByZXR1cm47CisgIH0KK30KKworQkVHSU4geworICB1WyJhIl09MQorICB1WyJiIl09MQorICB1WyJjIl09MQorICB2WyJkIl09MQorICB2WyJlIl09MQorICB2WyJmIl09MQorICBmb3IgKGwgaW4gdSkgeworICAgIHByaW50ICJvdXRlcjEiLCBsOworICAgIGYoKTsKKyAgICBwcmludCAib3V0ZXIyIiwgbDsKKyAgfQorICBwcmludCAiZW5kIiwgbDsKKyAgbD0iYSIKKyAgZXhpdDsKK30nCisjIEl0J3Mgbm90IGp1c3QgYnVnZ3ksIGl0IGVudGVycyBpbmZpbml0ZSBsb29wLiBUaHVzIGRpc2FibGVkCitmYWxzZSAmJiB0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgdGVzdGluZyAiYXdrIG5lc3RlZCBsb29wcyB3aXRoIHRoZSBzYW1lIHZhcmlhYmxlIGFuZCByZXR1cm4iIFwKKwkiYXdrICckcHJnJyIgXAorCSJcCitvdXRlcjEgYQorIGlubmVyIGQKK291dGVyMiBkCitvdXRlcjEgYgorIGlubmVyIGQKK291dGVyMiBkCitvdXRlcjEgYworIGlubmVyIGQKK291dGVyMiBkCitlbmQgZAorIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvYXdrX3QxLnRhci5iejIgYi90ZXN0c3VpdGUvYXdrX3QxLnRhci5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiOGEwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9hd2tfdDEudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvYmFzZW5hbWUvYmFzZW5hbWUtZG9lcy1ub3QtcmVtb3ZlLWlkZW50aWNhbC1leHRlbnNpb24gYi90ZXN0c3VpdGUvYmFzZW5hbWUvYmFzZW5hbWUtZG9lcy1ub3QtcmVtb3ZlLWlkZW50aWNhbC1leHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0OGZkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS1kb2VzLW5vdC1yZW1vdmUtaWRlbnRpY2FsLWV4dGVuc2lvbgpAQCAtMCwwICsxIEBACit0ZXN0IHhmb28gPSB4YGJ1c3lib3ggYmFzZW5hbWUgZm9vIGZvb2AKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS13b3JrcyBiL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQwZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2Jhc2VuYW1lL2Jhc2VuYW1lLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoYmFzZW5hbWUgJChwd2QpKSA9IHgkKGJ1c3lib3ggYmFzZW5hbWUgJChwd2QpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2J1bnppcDIudGVzdHMgYi90ZXN0c3VpdGUvYnVuemlwMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2ZjZTFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2J1bnppcDIudGVzdHMKQEAgLTAsMCArMSw1NTcgQEAKKyMhL2Jpbi9zaAorIyBVc2VkIGJ5IGJvdGggZ3VuemlwIGFuZCBidW56aXAyIHRlc3RzCisKK0ZBSUxDT1VOVD0wCisKK2lmIHRlc3QgIiR7MCMjKi99IiA9ICJndW56aXAudGVzdHMiOyB0aGVuCisgICAgdW5wYWNrPWd1bnppcAorICAgIGV4dD1negorZWxpZiB0ZXN0ICIkezAjIyovfSIgPSAiYnVuemlwMi50ZXN0cyI7IHRoZW4KKyAgICB1bnBhY2s9YnVuemlwMgorICAgIGV4dD1iejIKK2Vsc2UKKyAgICBlY2hvICJXVEY/IGFyZ3YwPSckMCciCisgICAgZXhpdCAxCitmaQorCitiYj0iYnVzeWJveCAiCisKK3Vuc2V0IExDX0FMTAordW5zZXQgTENfTUVTU0FHRVMKK3Vuc2V0IExBTkcKK3Vuc2V0IExBTkdVQUdFCisKK2hlbGxvX2d6KCkgeworIyBHemlwcGVkICJIRUxMT1xuIgorI19fX19fX19fX19fX19fX19fX19fX19fX18gdnZ2IHZ2diB2dnYgdnZ2IC0gbXRpbWUKKyRFQ0hPIC1uZSAiXHgxZlx4OGJceDA4XHgwMFx4ODVceDFkXHhlZlx4NDVceDAyXHgwM1x4ZjNceDcwXHhmNVx4ZjFceGYxXHhlNyIKKyRFQ0hPIC1uZSAiXHgwMlx4MDBceDZlXHhkN1x4YWNceGZkXHgwNlx4MDBceDAwXHgwMCIKK30KKworaGVsbG9fYnoyKCkgeworIyBCemlwcGVkICJIRUxMT1xuIgorJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHg1Ylx4YjhceGU4XHhhM1x4MDBceDAwIgorJEVDSE8gLW5lICJceDAxXHg0NFx4MDBceDAwXHgxMFx4MDJceDQ0XHhhMFx4MDBceDMwXHhjZFx4MDBceGMzXHg0Nlx4MjlceDk3IgorJEVDSE8gLW5lICJceDE3XHg3Mlx4NDVceDM4XHg1MFx4OTBceDViXHhiOFx4ZThceGEzIgorfQorCisjIFdlIGhhZCBidW56aXAyIGVycm9yIG9uIHRoaXMgLmJ6MiBmaWxlIChmaXhlZCBpbiByZXYgMjI1MjEpCit0ZXN0MV9iejIoKQoreworJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHhiZlx4NGJceDk1XHhlN1x4MDBceDE1IgorJEVDSE8gLW5lICJceGExXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorJEVDSE8gLW5lICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGVmXHhmZlx4ZmZceGZiXHhmZlx4ZmZceGZmIgorJEVDSE8gLW5lICJceGZmXHhmZlx4ZmZceGUwXHgxNlx4ZTZceDM3XHhiN1x4NzdceGIwXHhmYlx4MjJceGI1XHg4MVx4NDBceGY1IgorJEVDSE8gLW5lICJceGE3XHg2OVx4YTRceDQ3XHhhYlx4NjFceDRkXHg2YVx4M2RceGVmXHg3NVx4N2JceDIyXHhhZlx4NzFceDliIgorJEVDSE8gLW5lICJceGIzXHg1YVx4OTNceGJiXHg3OFx4MDBceDc5XHhiZFx4YzBceDA3XHhhZVx4MWJceGRiXHhjNVx4YzZceDZiIgorJEVDSE8gLW5lICJceDdhXHg3Ylx4ZDNceGQ3XHgzOFx4YmJceDcwXHg1ZVx4ZjBceGQxXHgwOFx4OWFceDY0XHgyNlx4NTNceDY4IgorJEVDSE8gLW5lICJceDAzXHg1M1x4NGRceDMyXHgzMFx4ZDJceDYxXHgzMVx4MTNceDY4XHhkMVx4YTZceDRjXHg0MVx4ODlceDg0IgorJEVDSE8gLW5lICJceDMxXHg0Zlx4NDBceGQyXHg3OVx4MTRceGYwXHhhM1x4ZGFceDFhXHgwMFx4NjVceDRmXHg1M1x4ZDlceDI4IgorJEVDSE8gLW5lICJceGQzXHhmNFx4NGNceDEzXHgyNlx4NGNceDRjXHg2NFx4MzRceDlhXHg2YVx4N2FceDk5XHgzY1x4MTJceDc4IgorJEVDSE8gLW5lICJceGQyXHg2OFx4ZDRceGRhXHg2YVx4NzlceDMyXHg2NFx4ZDFceGE4XHgxYlx4MTNceDAxXHg0Zlx4MjlceGVhIgorJEVDSE8gLW5lICJceDZjXHhhM1x4ZDJceDA3XHg5NFx4MDZceGE2XHg0NFx4MDFceDRmXHgxMVx4YTNceDRkXHgxM1x4NGRceDMxIgorJEVDSE8gLW5lICJceDMyXHg0Y1x4OThceDBjXHg5YVx4YTZceGRhXHgyOVx4M2RceGE0XHhmMVx4MjRceGZkXHgxYVx4YTNceDdhIgorJEVDSE8gLW5lICJceDkzXHhmNFx4YTdceGI1XHgzZFx4NTFceGUyXHg0N1x4OTRceGYyXHg4Zlx4MjlceGIyXHg5Ylx4MjlceGU5IgorJEVDSE8gLW5lICJceDM0XHg3OVx4NGZceDQ2XHg5ZVx4ODRceDZhXHg2OVx4ZWFceDY5XHhhN1x4YTlceGI1XHgwM1x4MjdceGE4IgorJEVDSE8gLW5lICJceGYxXHg0MFx4MzJceDdhXHgxM1x4MTBceDAwXHgzZFx4NDFceDkwXHgwMFx4ZDBceDFlXHg4NFx4MGRceDFiIgorJEVDSE8gLW5lICJceDUzXHg0MVx4YTNceDIxXHg5M1x4ZDBceDgzXHg1M1x4MTBceDk5XHgzNFx4MjRceGY1XHgzMlx4OTlceDM0IgorJEVDSE8gLW5lICJceGQyXHg3YVx4ODZceGNhXHg2Y1x4MjhceGRhXHg2ZFx4MjlceGE2XHg0ZFx4MzFceDBjXHhkNFx4N2FceDY5IgorJEVDSE8gLW5lICJceDFlXHg5M1x4MjNceGNhXHgxZVx4OTNceDRkXHgwM1x4MjZceDlhXHg2OFx4MDFceGEwXHhjOVx4YTBceDFhIgorJEVDSE8gLW5lICJceDAwXHgzNFx4MDBceDAwXHg2OVx4YTBceGY0XHg4MFx4MGRceDAwXHgwMFx4MzRceDA2XHg4Nlx4ODBceDM0IgorJEVDSE8gLW5lICJceDAwXHgwMFx4MDBceDM0XHgwMFx4NDhceDg4XHg4NFx4NTNceDY4XHg0Zlx4NDVceDNkXHg1MVx4ZmFceDRkIgorJEVDSE8gLW5lICJceDRjXHhkYVx4OWFceDhkXHhiNVx4NGNceGQ0XHhmMlx4MzVceDFiXHg1MVx4YjRceGQzXHgxNFx4ZjVceDBmIgorJEVDSE8gLW5lICJceDUwXHhmNVx4MGZceDI0XHhkM1x4MzJceDIzXHhkNFx4Y2RceDIxXHhhNlx4ZDRceGQwXHhkMFx4NjlceGEwIgorJEVDSE8gLW5lICJceGY0XHg4ZFx4M2RceDQzXHhkM1x4NTFceGVhXHg2Y1x4OTBceGQwXHg2OFx4ZjRceDQwXHgwMFx4MDdceGE4IgorJEVDSE8gLW5lICJceDE5XHgzZFx4NDdceGE4XHgxZVx4YTBceGQwXHgzNFx4MDBceDBkXHgxYVx4MDZceDgwXHgwMVx4ZTlceDAwIgorJEVDSE8gLW5lICJceDY0XHgyMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorJEVDSE8gLW5lICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorJEVDSE8gLW5lICJceDAwXHgwMFx4NDhceDkyXHgxYVx4NDZceDlhXHgwMlx4OWVceDI0XHhjNVx4NGZceGM5XHg5MVx4NGZceDI5IgorJEVDSE8gLW5lICJceGVjXHhhOVx4ZWFceDM0XHhkM1x4ZDJceDY4XHg2OFx4MDBceGY0XHhkNFx4ZjVceDE5XHgwMFx4MzRceDAwIgorJEVDSE8gLW5lICJceDA2XHg0ZFx4MDBceGQwXHgxYVx4MWFceDAzXHgyMFx4MDFceGEwXHgwMFx4ZjVceDAwXHgwZFx4MDZceDliIgorJEVDSE8gLW5lICJceDUwXHgzNlx4YTNceDM1XHgwMFx4MDNceDQwXHgwM1x4NDBceDY4XHhmNVx4MzRceDAwXHgwMFx4MDBceDcxIgorJEVDSE8gLW5lICJceGU0XHgzY1x4MGNceDBmXHgwZlx4M2RceDIzXHg5YVx4N2ZceDMxXHg4MFx4YWVceDFhXHhlMVx4MDlceDAzIgorJEVDSE8gLW5lICJceDJjXHg2MVx4NjNceDE4XHhmY1x4MWFceDI4XHgwZVx4OWFceDg1XHhjM1x4ODZceDk2XHgxMVx4OTRceDg4IgorJEVDSE8gLW5lICJceDBmXHg5Mlx4MTFceDhhXHgxYVx4YjRceDYxXHg4Y1x4MzhceDMwXHhmM1x4YTlceGZiXHhiZVx4Y2RceDhkIgorJEVDSE8gLW5lICJceGM0XHhiN1x4N2FceDUyXHhhZFx4OTJceDlmXHhkZVx4ZTZceDc1XHg3NFx4YjdceGJiXHgwYlx4ZjVceDRjIgorJEVDSE8gLW5lICJceDk3XHhkOVx4NDlceGM4XHg2M1x4OWJceGE2XHhiYVx4OTVceGU4XHg0Nlx4NzBceDExXHg3MVx4NTVceDY3IgorJEVDSE8gLW5lICJceDE3XHhlM1x4YWJceDkxXHg3ZFx4YmVceDBkXHg1Nlx4NzhceDYxXHg5OFx4NDFceDI4XHgyY1x4YjVceGEzIgorJEVDSE8gLW5lICJceGQxXHhiOFx4NzZceDgwXHhjOFx4YWRceDliXHg3OVx4NmZceDhhXHg3YVx4ODRceDQ0XHgzNVx4MjRceDY0IgorJEVDSE8gLW5lICJceGEwXHhkZVx4MThceDgwXHgxMVx4MTRceGNkXHhiMFx4YzZceGU0XHgzMVx4NDlceDcxXHg1M1x4YWZceDVkIgorJEVDSE8gLW5lICJceDIwXHhjOVx4NTlceGRjXHhhMlx4NTNceDA2XHhmMFx4NGZceGM4XHgwOVx4MjFceDkyXHg2Ylx4ZjJceDM3IgorJEVDSE8gLW5lICJceDMyXHhjYlx4NzVceDkxXHg3NVx4NDFceGMwXHhlOFx4NDdceDAyXHhiM1x4OGVceDBiXHgxN1x4NDdceDQyIgorJEVDSE8gLW5lICJceDc5XHgyMVx4M2NceGVjXHg2Y1x4YjBceDg0XHgyNFx4OTZceDQ1XHg0YVx4OGVceGJiXHhiZVx4YzJceGUwIgorJEVDSE8gLW5lICJceDE2XHg4NVx4NzZceDQzXHgyNlx4ZDVceGQwXHg1OFx4ZGRceGY3XHg4M1x4NjVceDQ0XHg4Zlx4YmVceDZjIgorJEVDSE8gLW5lICJceDcyXHhlMVx4NWJceDFhXHgwZVx4M2FceGJiXHg1MVx4Y2ZceGJkXHg5Ylx4M2FceGQwXHhkNVx4MzlceDViIgorJEVDSE8gLW5lICJceDIzXHg3ZFx4YzlceDBiXHgwOFx4MGFceDIzXHg3Ylx4M2FceDAwXHg2N1x4YTFceDc2XHhhNVx4MTlceGFiIgorJEVDSE8gLW5lICJceDQ4XHhiZFx4NTRceGFhXHg4Zlx4YWZceGI2XHhlOFx4ZDVceDkxXHgwZlx4M2VceDRiXHgzYVx4OGRceGM5IgorJEVDSE8gLW5lICJceDQ4XHgwMlx4YzJceDZiXHhmY1x4ZWZceDBhXHg5Ylx4ZjFceDY3XHhkMFx4NDVceDQ4XHg0NVx4MDVceGMwIgorJEVDSE8gLW5lICJceDA3XHhjNFx4NDdceDk2XHg2ZVx4NzlceGFjXHgzMVx4NDlceGNmXHgxZlx4YThceDNiXHhkY1x4MWRceDQ0IgorJEVDSE8gLW5lICJceDgzXHg4NFx4MDRceDQ5XHg5Zlx4MjVceDAxXHg0Ylx4NDFceDgwXHgxNFx4MWJceDlkXHhhZlx4ZmNceGI1IgorJEVDSE8gLW5lICJceDQ2XHgyMlx4Y2FceDk2XHg0ZVx4ZDVceGUzXHgwOFx4N2RceGFiXHgxN1x4MGJceDY1XHhjZFx4YTdceGQ0IgorJEVDSE8gLW5lICJceDVlXHhkMVx4OGFceDI3XHhjOFx4NjBceGU5XHgxN1x4YTNceGM5XHhiNFx4MjZceGY4XHg1OFx4YjJceDRhIgorJEVDSE8gLW5lICJceDE1XHg1Mlx4OGVceDE1XHgyMFx4NzJceGIyXHgwZVx4NGZceDY0XHhjYlx4MmJceGEzXHhkOVx4ZjBceGE2IgorJEVDSE8gLW5lICJceDZmXHgwYlx4NTBceGVkXHg0ZVx4YTRceDI4XHhlOFx4ZTBceDA1XHgyZFx4MTVceDI2XHgyY1x4M2RceDlmIgorJEVDSE8gLW5lICJceDg3XHhjNFx4ZDFceGQzXHg2OVx4ZTJceDFjXHhlYVx4NDFceDk5XHhiZFx4NDNceDU5XHg5Zlx4MDZceDU3IgorJEVDSE8gLW5lICJceDA2XHhiNFx4NzJceGU3XHg0NVx4MmNceGQyXHhjZlx4NWZceDY2XHhhNVx4ZWJceDU4XHg2YVx4YzBceDM3IgorJEVDSE8gLW5lICJceDgyXHg4MVx4ZjZceGRjXHgxY1x4MzVceDViXHhjNlx4ZjFceDkyXHg0ZVx4ZTBceGUyXHhkMlx4MTJceDgyIgorJEVDSE8gLW5lICJceDkyXHg5N1x4MTRceGU1XHhhY1x4NDlceDlmXHhmZFx4MTZceDQ2XHhjNlx4YzJceGYxXHg0OFx4ODZceDA1IgorJEVDSE8gLW5lICJceGU2XHg3NFx4YWNceDlhXHg1Mlx4NDlceDY0XHg0NVx4MjVceDQzXHgwOFx4MDZceDAzXHg2M1x4NDlceDkxIgorJEVDSE8gLW5lICJceDlhXHg5Mlx4OTZceDViXHhlM1x4MmZceDExXHg1MVx4Y2RceGUzXHhhM1x4OWZceDNlXHg4Zlx4OWZceGFiIgorJEVDSE8gLW5lICJceDkyXHhiY1x4NmRceDM2XHhhM1x4ZDFceDcxXHhhNFx4NGFceGI2XHhlMVx4NDlceGI4XHhkY1x4MmNceDkwIgorJEVDSE8gLW5lICJceGIyXHhkNlx4ZmJceGE2XHhjNlx4ZDlceGE0XHg1Ylx4OWJceGU1XHhkNlx4NTlceGIzXHg3Nlx4MzdceGViIgorJEVDSE8gLW5lICJceGE2XHgzZVx4ZjBceDRjXHg5OFx4MWRceDczXHgwNFx4MDFceDA2XHg4Y1x4MTBceDAwXHgzYlx4MmJceDA0IgorJEVDSE8gLW5lICJceDU1XHhmNFx4ZmRceGVjXHg5ZFx4YWRceGM3XHgyYlx4YmRceGUzXHhkYVx4NGJceGVlXHgyOFx4NWRceDdhIgorJEVDSE8gLW5lICJceGJlXHhhNlx4YjlceGUwXHg4MVx4MTVceGE2XHgwOVx4MjZceDUyXHg2MFx4Y2NceDAzXHgzMFx4NjZceDYwIgorJEVDSE8gLW5lICJceGI5XHhkMFx4NzlceGZkXHhiNlx4YjNceDg1XHhhY1x4ZDFceGM0XHg0Y1x4YmZceDgwXHgyMFx4NDRceDQ1IgorJEVDSE8gLW5lICJceDdmXHg3Mlx4MjdceGZmXHgxNFx4YzJceGMwXHg4MVx4MDJceGFiXHgzMlx4MjBceDQzXHg0Nlx4MDZceDdmIgorJEVDSE8gLW5lICJceGI3XHhjMlx4YjlceGY2XHgzOVx4N2JceDBiXHgwY1x4Y2JceGU3XHg2ZVx4MDNceGUzXHgyMFx4NDZceDgyIgorJEVDSE8gLW5lICJceDRhXHgwMVx4MjNceGJiXHhiMFx4MGNceGI1XHg2Zlx4ZjdceGZiXHhmY1x4ZjVceGYyXHgzY1x4OGVceDdlIgorJEVDSE8gLW5lICJceGNiXHg3N1x4NmZceDdlXHhjM1x4NzFceDdjXHg0NFx4M2ZceGJjXHgzY1x4NTRceGI4XHg0MFx4MjdceDc4IgorJEVDSE8gLW5lICJceDYzXHg0ZFx4ODNceDIyXHg2YVx4MGFceDAwXHgwZVx4OGRceGE1XHhmYVx4NWVceGU1XHg4OVx4NTVceGE0IgorJEVDSE8gLW5lICJceDE4XHg2MFx4YzJceGE2XHhkNlx4MTdceDk4XHgyM1x4ZjBceDA3XHg0NFx4NDVceDE4XHhhNFx4NjhceGQ5IgorJEVDSE8gLW5lICJceGNjXHgwZFx4ZTNceDgxXHgwNlx4MDlceDBjXHgxN1x4YWZceDUyXHhhZFx4ODVceDgzXHg1ZFx4MDlceDMwIgorJEVDSE8gLW5lICJceDBkXHhhOVx4YjNceGU2XHg0NVx4ODVceDllXHgyNlx4NDdceGFiXHg3ZFx4MTRceGUxXHg4YVx4YjlceGZlIgorJEVDSE8gLW5lICJceDBhXHgwZlx4OGRceDY4XHg3M1x4NzNceDVjXHhhM1x4MGJceGI1XHgyOVx4MGNceGQ4XHhkZVx4YzJceDMwIgorJEVDSE8gLW5lICJceGJlXHg2MVx4Y2VceGJkXHg0ZFx4M2FceDAzXHhlZlx4ZTlceDQ1XHhlZlx4ZWJceDA3XHhlOFx4NmJceDdkIgorJEVDSE8gLW5lICJceGQyXHhmNFx4OTJceDhmXHg5MVx4YTFceDZlXHg4NVx4MmJceDczXHhhZlx4MDFceDhhXHhkMlx4MGZceDUyIgorJEVDSE8gLW5lICJceGVkXHg2NVx4OWZceGU2XHgxNVx4NDdceGIyXHg3MVx4ZDNceGJjXHhlZVx4ZGVceGZmXHgxMFx4ZmFceDRkIgorJEVDSE8gLW5lICJceDdmXHg5ZFx4NWFceDRiXHgxM1x4NGFceDkyXHhkNlx4ODVceGIyXHhlZlx4ZTFceGJiXHg5Mlx4ODBceDRhIgorJEVDSE8gLW5lICJceDQ1XHg3MFx4YTBceDRlXHhlNlx4ZjNceDM5XHg5YVx4ZjZceDU1XHhlZVx4ODBceGM1XHhhMFx4ZmZceDlkIgorJEVDSE8gLW5lICJceGI2XHg2Nlx4ZTZceGNjXHg4MVx4YjJceGRjXHhkNlx4MzlceGI3XHgwNlx4MmNceGQ2XHgzYlx4MjdceDBlIgorJEVDSE8gLW5lICJceDVkXHgwMVx4OTJceDVjXHhmM1x4YmVceDNkXHg0Nlx4OGFceDQ2XHhhNFx4ZDRceDAzXHgyMVx4ODZceDhlIgorJEVDSE8gLW5lICJceDY4XHgwNVx4M2JceGYwXHg2Nlx4NjlceDRjXHg2MVx4ZjBceDM5XHgxY1x4OWRceGUyXHg3NFx4M2JceDVmIgorJEVDSE8gLW5lICJceGQ3XHg4N1x4ZGNceGQzXHhlYlx4NTlceDUwXHhiNlx4NmRceDc1XHhjOVx4NWJceGRjXHg0ZFx4YjdceDI5IgorJEVDSE8gLW5lICJceDBjXHg2NFx4OWNceDVjXHgyMlx4ZDFceDQ0XHhkN1x4MDFceDY4XHgwYVx4MjZceDI1XHg3ZFx4NmFceDc2IgorJEVDSE8gLW5lICJceDFjXHgxYlx4YmZceDdhXHhhNVx4ZWJceDQyXHg4Zlx4MmZceDkzXHhhM1x4YzFceGNhXHhlM1x4OWZceDQ2IgorJEVDSE8gLW5lICJceGZkXHg3N1x4MDdceDI3XHgyZFx4YWZceGJiXHgxYVx4MTNceDViXHg4Nlx4OTRceDAwXHg5MFx4ODZceGMxIgorJEVDSE8gLW5lICJceDI0XHg4ZFx4ODZceDIyXHg1Nlx4YmVceDA2XHhlMVx4YTFceDQ0XHg0Y1x4MzZceGUyXHgyMlx4MDhceDIxIgorJEVDSE8gLW5lICJceGIyXHgyMFx4NmRceGI2XHhkYlx4NmNceDZlXHgyNlx4MjZceDA2XHhjMFx4MjZceDA5XHg5NFx4MDlceDc1IgorJEVDSE8gLW5lICJceDJjXHgxMFx4NGJceDQ0XHhiMFx4MWJceDQ0XHgyNlx4MTFceDU4XHgxMFx4ZGZceDJjXHhjMVx4NTVceDhhIgorJEVDSE8gLW5lICJceGFkXHhiMlx4YTNceDA4XHg2N1x4MzRceGU1XHg4M1x4OTVceDBhXHgwOFx4ODJceGMxXHg4YVx4MDZceGRkIgorJEVDSE8gLW5lICJceGIxXHgzMlx4MTRceGE1XHgyN1x4NzhceGNhXHhiNlx4ZDFceDU3XHg1YVx4YzlceDJhXHgwNlx4MDVceDI5IgorJEVDSE8gLW5lICJceDBjXHg4OFx4MjhceGQyXHg4Nlx4YTVceGE5XHg2OVx4NTFceDgxXHg0Nlx4YTFceGE0XHg4MVx4YjFceDhkIgorJEVDSE8gLW5lICJceGIxXHhiMFx4MDFceDgzXHg0OVx4NGJceDE1XHgxYVx4NmVceDEzXHgyNFx4NjhceDU0XHg2MFx4NGJceDRlIgorJEVDSE8gLW5lICJceDIxXHgzOVx4ODJceDFjXHg4ZFx4MDJceDZkXHgyM1x4YzNceDMwXHgyNVx4ODNceDY5XHgwNVx4MTFceDA1IgorJEVDSE8gLW5lICJceDRkXHgyNFx4MDRceDRlXHgwY1x4NTNceDgxXHgyNVx4Y2VceDM0XHgxMFx4ZDBceDA0XHhkNFx4OThceGExIgorJEVDSE8gLW5lICJceDIxXHgwYlx4N2VceGM0XHgwOVx4MTFceDMwXHg4Mlx4OGZceDY4XHhjNFx4MTNceDQ4XHgwYVx4MzBceDE3IgorJEVDSE8gLW5lICJceDRmXHhhZlx4ODBceDUyXHhkMFx4MzZceDIyXHhkNlx4NDNceDQ4XHgxNVx4ZjZceGExXHg4Mlx4ODRceGRjIgorJEVDSE8gLW5lICJceDQ0XHgzNFx4MDdceDUyXHhjNFx4MmNceDU2XHhiN1x4YWZceGE4XHgzYlx4YjFceDA4XHg0Ylx4NmJceDZjIgorJEVDSE8gLW5lICJceDI0XHgwNVx4Y2VceDFhXHgxMFx4ZTJceDAyXHgzMVx4MjJceDI1XHhiOFx4MjNceDY1XHhkMFx4NTJceDliIgorJEVDSE8gLW5lICJceDRhXHhjYlx4NjRceGFlXHhiZFx4ZThceGRhXHgzMFx4YjRceDI1XHg3OVx4YTRceGJjXHhlNlx4ZTBceGYzIgorJEVDSE8gLW5lICJceGRlXHg4Mlx4MjNceDg0XHhjZVx4ZTVceGI5XHhjOVx4ZTlceGViXHg2OVx4NzhceDJmXHhiY1x4NzZceDZkIgorJEVDSE8gLW5lICJceDU4XHg4Nlx4YzRceGE1XHg4Mlx4ZmFceGFkXHg2MVx4NzVceDYyXHgwY1x4YjZceDliXHgwMFx4ZGZceDMwIgorJEVDSE8gLW5lICJceDRhXHhkNlx4ODNceGFhXHg2MFx4OGFceDMzXHg3Y1x4ZDJceDEyXHhmNVx4NmNceDQ4XHg1Mlx4YzVceDg1IgorJEVDSE8gLW5lICJceGUyXHg2Zlx4MzdceDczXHhjN1x4YmNceGFkXHhlYVx4MjdceDI3XHhhOFx4ZWZceGY3XHhlZlx4NTlceDE3IgorJEVDSE8gLW5lICJceDY1XHhiNlx4ZTFceGQ4XHhkZFx4YjVceDkzXHg0Mlx4ZDBceDI5XHg1YVx4MThceDc2XHgwOFx4ZGJceGU1IgorJEVDSE8gLW5lICJceDM4XHhmOVx4YThceGU0XHhhMVx4YTJceGQ0XHg0MFx4YTBceGZkXHg0NVx4MThceDRiXHgzY1x4YTZceDg1IgorJEVDSE8gLW5lICJceDAyXHg5NFx4OGNceDg4XHhhOVx4NzFceDg3XHg0MFx4OTZceDRkXHgyM1x4MjZceGY0XHgxN1x4NDRceGI4IgorJEVDSE8gLW5lICJceDc4XHgxZVx4NzFceGUzXHgzYlx4ZWVceGM2XHg0Ylx4ODdceDg4XHhmZFx4MmJceGI1XHg4Ylx4MWJceDUzIgorJEVDSE8gLW5lICJceDBiXHhhYlx4ZDZceDQ3XHgyM1x4YTdceGNmXHg3OFx4M2FceDI1XHhkN1x4M2NceDc3XHhiM1x4OGVceDAwIgorJEVDSE8gLW5lICJceDM3XHg4M1x4MTFceGJiXHg2OFx4ZjVceGVkXHgwYVx4MWFceDRkXHhhM1x4OTBceDY4XHhlYVx4ZWRceDQ5IgorJEVDSE8gLW5lICJceDhkXHhiNlx4ODBceDY5XHg4M1x4NjdceGNmXHg2NVx4NWFceGVjXHhkYVx4MTJceGU2XHg1YVx4NDdceDVhIgorJEVDSE8gLW5lICJceDNjXHg2M1x4NTBceDQxXHg3M1x4NDBceDgzXHhjN1x4NjlceGJjXHg0Nlx4YTdceGIxXHhlZFx4NzlceDNjIgorJEVDSE8gLW5lICJceGZlXHhkZlx4MjdceDRiXHhiZVx4ZWJceDY4XHhlY1x4ODNceDAwXHg2Ylx4N2JceDA4XHg0YVx4NmVceDBjIgorJEVDSE8gLW5lICJceDJkXHgxNlx4YmFceDFhXHg5Nlx4YTFceDAzXHhjM1x4NjNceDllXHg3YVx4Y2VceDhiXHhlMlx4YWVceDUxIgorJEVDSE8gLW5lICJceGZiXHg3ZFx4ZWRceDVkXHhmYlx4YmNceGVkXHgwNFx4NmZceDFmXHgyMVx4ZmNceDY5XHgzY1x4YjFceGFhIgorJEVDSE8gLW5lICJceGRmXHhiZlx4YTBceGFiXHhjM1x4Y2NceDZhXHhiZlx4ZTdceDk2XHhiZVx4MzZceGIzXHgyM1x4MzJceDFjIgorJEVDSE8gLW5lICJceGI1XHgxOFx4NDRceDU0XHg1MVx4ODFceGI0XHg2M1x4YzdceDk5XHg4NFx4MDZceGNiXHhhZlx4NWJceDA1IgorJEVDSE8gLW5lICJceDRmXHg4Mlx4ZjVceDkzXHhiNFx4YzNceGNmXHhkYlx4NjVceGI4XHg4ZFx4YWVceGExXHhjMlx4ZjBceGRmIgorJEVDSE8gLW5lICJceGE3XHhlNVx4ZjNceDM3XHhkMlx4NTdceDczXHgwZFx4ODlceGI4XHgyMVx4MTBceDlhXHg0M1x4ZTlceGUwIgorJEVDSE8gLW5lICJceDA5XHgxYVx4NDBceDQ5XHhhMFx4Y2NceDAzXHgzMFx4NDZceDY2XHg2Nlx4MGNceDEyXHg0OFx4ODlceGZmIgorJEVDSE8gLW5lICJceDU3XHhlOFx4ZDJceDdjXHgzZVx4OGRceDllXHg0Nlx4N2ZceDk3XHhmY1x4M2JceDEyXHg5NVx4ZDJceGRmIgorJEVDSE8gLW5lICJceDJmXHhiMVx4YzhceDdkXHg2MVx4ZGJceGIyXHg4YVx4ZGRceGJmXHhmM1x4N2VceDA4XHhjY1x4YWRceDE2IgorJEVDSE8gLW5lICJceGJlXHg0NVx4MTNceGYyXHg3Zlx4MTRceDVhXHg3OVx4MmVceGI1XHhiYlx4NzhceDBjXHgyMlx4YzZceDEwIgorJEVDSE8gLW5lICJceDMxXHhjZVx4OWNceDZiXHgxZFx4NDhceDExXHgxNlx4NGNceGRmXHg5OFx4MTJceGYzXHg0MVx4MDVceDgxIgorJEVDSE8gLW5lICJceGQzXHgyNFx4OTRceDkyXHgzN1x4NTFceDVkXHhkY1x4NTFceDA4XHhkM1x4NzNceGJhXHg4OVx4NDJceDNmIgorJEVDSE8gLW5lICJceGNiXHg1Y1x4NGNceGIyXHgxNlx4Y2JceDA0XHhjZFx4ODZceGIyXHgwNVx4OGFceGMzXHg1Nlx4YzhceDgzIgorJEVDSE8gLW5lICJceDBiXHgyZVx4OTBceDMxXHg4Nlx4NWNceDY4XHhiOVx4OGRceGJjXHhiZlx4ZjJceGUyXHhkMlx4YjBceDBiIgorJEVDSE8gLW5lICJceDc2XHgyYlx4M2RceDc5XHhiYVx4M2ZceDliXHhlM1x4OGVceGM0XHhmNVx4ZWRceGUwXHhmN1x4ZGRceGRiIgorJEVDSE8gLW5lICJceDk3XHg1Zlx4OWFceGIzXHhmY1x4NTBceGJmXHg4OVx4ZjRceDdhXHgzOFx4YTNceDQ0XHgwY1x4NTBceDVkIgorJEVDSE8gLW5lICJceDdjXHhiYlx4NjVceDQ3XHhmMVx4MzNceGQ2XHg2N1x4YTRceGUwXHhmMFx4NjhceDU4XHhlOVx4NmNceDQwIgorJEVDSE8gLW5lICJceDAyXHg2Ylx4MDFceDIwXHg0MFx4ODRceDg5XHg4MFx4MDhceGNjXHg1Mlx4YTBceDIwXHg4MVx4OThceDE2IgorJEVDSE8gLW5lICJceGExXHg5MFx4ZjhceGNkXHhiZVx4MWVceGM3XHg2Ylx4MWRceGI1XHg4MVx4NmJceDA0XHhkYlx4NGNceDQzIgorJEVDSE8gLW5lICJceDFhXHhiY1x4ZDRceDBkXHhiNlx4MGRceGIzXHg4Mlx4YzhceGM3XHhmMFx4MTNceGE4XHhjNVx4MjBceGQ1IgorJEVDSE8gLW5lICJceGJkXHhiNFx4YzBceDVhXHhkZFx4ZThceGQxXHgzMVx4NGZceGFkXHg4OFx4NjNceDMwXHg0NFx4MGRceGQ1IgorJEVDSE8gLW5lICJceGM2XHg1Nlx4OTZceDI4XHhlMlx4ZThceGE4XHhhOVx4MTBceGRiXHgxYVx4YTNceDIxXHhhNlx4YzVceGU2IgorJEVDSE8gLW5lICJceGY1XHhiMlx4YTRceDZkXHg4ZFx4YjRceDMxXHhiNVx4YzNceGVjXHgzZVx4OGZceGQwXHhlYlx4MzVceGNlIgorJEVDSE8gLW5lICJceGRiXHgwMlx4OWNceDRlXHg5Nlx4Y2RceDQwXHgxNFx4Y2RceDk3XHhiOVx4MGFceGUzXHgwOVx4ZjVceDQ5IgorJEVDSE8gLW5lICJceGZlXHgxZVx4YzdceGM1XHg1N1x4YjlceDk2XHhlOVx4ZjVceDhhXHg1Nlx4ZGZceDYzXHhkYVx4OGFceGVhIgorJEVDSE8gLW5lICJceDQxXHg5N1x4NzRceDdiXHhhNlx4NTdceDk5XHg4ZFx4YjBceDc4XHg2MFx4ZTRceDA0XHhkN1x4ZTRceGJmIgorJEVDSE8gLW5lICJceDg5XHg3MVx4YTVceGM4XHg5M1x4NDJceDAyXHg1M1x4N2FceDZhXHg5ZFx4OTlceGM5XHhkM1x4MmJceDg3IgorJEVDSE8gLW5lICJceDc1XHhiMlx4OGZceDE5XHg4Nlx4MjhceDJiXHhjM1x4MmJceDY3XHg5NVx4NzJceGZiXHgxM1x4MzlceGI1IgorJEVDSE8gLW5lICJceGNhXHg4Y1x4NDNceDg4XHgxY1x4ZGNceDQ3XHhiNlx4ZGJceDA1XHhhZlx4OGVceDMxXHg1NFx4YjhceGJkIgorJEVDSE8gLW5lICJceDk4XHg4Ylx4MWRceDFmXHgxN1x4ODdceDlkXHg2ZFx4MDVceGNhXHhhOFx4OTBceDQ5XHgxMFx4YmJceDY3IgorJEVDSE8gLW5lICJceDJmXHg5Mlx4NjFceDQzXHhmZVx4ZTJceGQ2XHgxOFx4NmRceDJhXHhjMFx4MTRceDk2XHg5YVx4MmFceDY1IgorJEVDSE8gLW5lICJceDQ4XHgwNFx4YzdceDJkXHg3Nlx4YTZceDFmXHhjNVx4NzlceDM2XHgyOFx4NjlceDZmXHgwOVx4YjZceDkwIgorJEVDSE8gLW5lICJceGMzXHg1NVx4NmRceDk4XHhmMFx4YmRceGNlXHhiMVx4MzdceGY0XHhjNFx4OTBceDFjXHhkZlx4NWFceDI3IgorJEVDSE8gLW5lICJceGJjXHgyNFx4MzhceDUyXHg3NVx4YzBceGVlXHhjOVx4MDVceDVhXHhkN1x4MmJceDYxXHhmZFx4YmFceGZiIgorJEVDSE8gLW5lICJceGVhXHg5Zlx4NjVceDM5XHg5Zlx4ZTdceGM5XHhjM1x4MGVceGE5XHgzYVx4MjBceDUwXHg4N1x4YjZceDA4IgorJEVDSE8gLW5lICJceGM3XHg4MFx4OTJceGUyXHg2MFx4MjFceGQyXHgyZFx4NTFceDEyXHhmOFx4NDZceDYwXHhiZFx4ZjRceDY1IgorJEVDSE8gLW5lICJceGQ1XHg3Ylx4MWFceGE3XHg3OVx4YjdceDczXHg3OVx4ZTlceDBkXHg2MFx4MzRceGMzXHhiMFx4NThceGM4IgorJEVDSE8gLW5lICJceGNjXHg0Mlx4N2JceGIwXHg1Nlx4OGNceGRlXHg2Nlx4NzJceDIzXHhjMlx4NTlceGU2XHg5Zlx4ODNceDZhIgorJEVDSE8gLW5lICJceGVmXHg0YVx4OWVceDFlXHhmM1x4ZDVceGRlXHg1Mlx4MzJceDE0XHg4YVx4MmRceDBiXHhmMFx4MWVceDViIgorJEVDSE8gLW5lICJceDdjXHg0YVx4MzRceDRkXHg3Mlx4NGZceDFkXHg4Zlx4OTdceGU4XHhjOVx4Y2RceGUyXHhiOVx4MDNceDM2IgorJEVDSE8gLW5lICJceDlmXHg4OVx4OTdceGMzXHgxOVx4OGRceDhkXHg4NFx4NDFceDBjXHgwM1x4MzRceDE4XHg0MVx4MjBceDEwIgorJEVDSE8gLW5lICJceDI2XHg0Y1x4MTBceDE4XHg1MFx4NWVceGQ3XHg5M1x4MWZceDMxXHhmN1x4NTRceGIzXHg0M1x4NGRceGQ3IgorJEVDSE8gLW5lICJceDQ4XHg2OVx4Y2ZceDdkXHgyOVx4MmZceDdmXHg4Zlx4MTFceGYyXHg0Y1x4M2ZceGNkXHhlN1x4YTJceGUxIgorJEVDSE8gLW5lICJceDA5XHg5YVx4MWFceDZjXHhjNlx4ZjNceGNmXHgzM1x4ZTVceGI1XHg4Zlx4NmVceDQxXHhmMVx4ODBceDA3IgorJEVDSE8gLW5lICJceDRkXHg3Zlx4YmVceDFiXHgzN1x4ZGRceGUzXHg2NFx4YjhceGEyXHg1OVx4OTBceDJjXHhhMlx4YmVceGY0IgorJEVDSE8gLW5lICJceDgyXHgyYVx4ODBceDQ2XHg0ZFx4MWFceDhjXHg4OFx4NWFceDE4XHgzMFx4NjRceDBhXHg1YVx4NTdceDM3IgorJEVDSE8gLW5lICJceDYzXHhlOVx4NmRceDhhXHg2ZFx4NWZceDg4XHg1ZVx4NmRceDQxXHgzM1x4NjBceGZkXHg0NVx4OTBceDdlIgorJEVDSE8gLW5lICJceDE1XHhhYVx4OTVceDZmXHhiZFx4ZmNceGU5XHgwYlx4MzRceGU0XHgzYlx4YThceDQxXHg3OFx4MWNceDU1IgorJEVDSE8gLW5lICJceDYyXHg1ZFx4YjJceDE5XHhkZFx4ZWJceDY5XHhlYlx4ZWZceGUxXHhiZlx4N2JceGViXHg2Mlx4MjNceDhhIgorJEVDSE8gLW5lICJceDYxXHgxNFx4OWZceDIyXHg1M1x4MDhceDZhXHgzMVx4YmFceDMwXHgyNFx4MWVceDU0XHg4M1x4YWVceGJkIgorJEVDSE8gLW5lICJceDg3XHhhMVx4NzFceGYwXHgzY1x4N2RceDk0XHhhMVx4MmNceGVhXHhmZlx4ODRceDc2XHg3N1x4ZDJceGM5IgorJEVDSE8gLW5lICJceDlmXHgyZlx4OWNceGM3XHg4M1x4M2ZceDg5XHg1ZFx4MWJceDVjXHhjM1x4MGZceGZhXHhkMlx4OTNceDMyIgorJEVDSE8gLW5lICJceGZjXHhlZFx4YTZceDI2XHg4Nlx4OThceDFiXHgwNVx4MTBceDIwXHgyN1x4NGNceDk1XHgzZlx4NmRceDk0IgorJEVDSE8gLW5lICJceDgyXHg1YVx4YThceDY4XHg3Mlx4YWVceGQ3XHhhZVx4ZGJceGFmXHgyNlx4YjZceDVhXHg4OVx4MzBceGU3IgorJEVDSE8gLW5lICJceGQwXHg1YVx4N2NceGM2XHg2Nlx4ZmFceGMzXHg4NVx4N2RceDI2XHhlZVx4YjNceDM0XHhjMlx4YWNceDcwIgorJEVDSE8gLW5lICJceDg4XHgwM1x4MTVceGM2XHhlZVx4NTVceDQ1XHhkZVx4MWNceDEwXHgwMVx4ZTZceDNiXHgzNlx4MjZceDExIgorJEVDSE8gLW5lICJceGJlXHhlY1x4NTRceGVhXHhkOFx4MjBceDFkXHgzNVx4MDBceGQxXHg4Y1x4MDBceGU4XHhmNVx4MjFceDk3IgorJEVDSE8gLW5lICJceDI2XHgwNlx4NjlceDg3XHg1NVx4YTNceGM4XHhmNlx4NThceGNjXHg2MFx4MTJceDMwXHgwYlx4OGFceDUwIgorJEVDSE8gLW5lICJceDAxXHg1N1x4MzBceGRjXHg5YVx4MDFceGQ0XHhhNFx4Y2RceGQ2XHg2OVx4MjNceDBmXHhjM1x4YjhceDg1IgorJEVDSE8gLW5lICJceDEyXHhiYlx4OGVceGRmXHhjNVx4ZjFceGYzXHg3Y1x4YzlceDdhXHgyNFx4MjVceDA3XHg5Y1x4ODZceDk3IgorJEVDSE8gLW5lICJceDY4XHhiNVx4YWRceDBiXHhiYVx4MmVceGU4XHg2Zlx4N2ZceGExXHhlZFx4NGZceDBjXHgzNFx4N2JceGM4IgorJEVDSE8gLW5lICJceDg0XHgxMFx4MDhceDJhXHhjY1x4MTlceDU5XHhiZFx4YmNceGU0XHgzZFx4YThceGQ5XHgzNVx4YWZceDhiIgorJEVDSE8gLW5lICJceGE3XHgwYVx4YWRceDQyXHhlOFx4MDJceDkwXHhlNlx4OGVceDc2XHg1ZFx4MGZceDNiXHg4N1x4YjhceGU0IgorJEVDSE8gLW5lICJceDY1XHg0ZVx4NWZceDBkXHhlOFx4MjZceGFmXHgyYVx4OTRceDlhXHgyZVx4MjFceDlhXHgxOVx4YjlceGEwIgorJEVDSE8gLW5lICJceDhkXHgyNlx4NzhceGExXHg0Ylx4NmVceGY2XHhkN1x4MjlceDY2XHhkYlx4NDlceDA5XHhhMFx4Y2FceDRkIgorJEVDSE8gLW5lICJceDMyXHhiMFx4MzFceGY1XHg3M1x4ZTFceDY3XHhjZVx4ZTBceDVhXHg3OVx4ODRceGE0XHgyMlx4ZDRceGM5IgorJEVDSE8gLW5lICJceDQzXHg1OVx4MDhceGE4XHhkNVx4NWVceDhjXHg3Mlx4NjFceDcwXHg5YVx4YTZceDQyXHhjMFx4NDJceDIyIgorJEVDSE8gLW5lICJceDJkXHhkMFx4YmVceGIxXHg0OVx4NmVceDM2XHhiYlx4OGRceDhmXHgwM1x4OWJceGI0XHhkYlx4NWFceDc3IgorJEVDSE8gLW5lICJceDNlXHgyOVx4OTFceGM2XHg3M1x4ODhceGVmXHg4Y1x4ZjdceGRlXHhlMlx4MmJceGMyXHhjZVx4Y2RceDhjIgorJEVDSE8gLW5lICJceDkyXHg2MFx4OTZceDI5XHg4OVx4OTlceDYyXHg5OVx4ODFceDM2XHg5Ylx4NTBceGM4XHg3MFx4ZDZceDhkIgorJEVDSE8gLW5lICJceGFmXHg2Ylx4MzBceGJhXHhjN1x4N2FceGNhXHg0Y1x4NTZceDY2XHg2Nlx4MmRceGM3XHhhNVx4ZjdceDYzIgorJEVDSE8gLW5lICJceGE0XHg1NVx4OGRceGQ0XHg5Mlx4ZGJceDJiXHg2Ylx4YjFceGExXHg5Nlx4OTlceGQ5XHgyNVx4ZGJceDE0IgorJEVDSE8gLW5lICJceDFjXHg0OVx4MDRceDY3XHgyNVx4NDVceDBhXHg1MFx4MWRceDIwXHhkOFx4OGRceGNmXHhlN1x4MDNceDIwIgorJEVDSE8gLW5lICJceGYwXHhkN1x4YzBceGNjXHg4NFx4MjBceDY4XHg0YVx4NjNceDQxXHhhNFx4NmNceDMyXHgwOFx4YTJceDM3IgorJEVDSE8gLW5lICJceDAzXHg2Ylx4NDJceDEyXHhiZVx4YTlceDRlXHg5Ylx4OTdceDE2XHg5Mlx4NDhceDU2XHgzMlx4YWVceDJjIgorJEVDSE8gLW5lICJceDEwXHhjNlx4MzFceDE0XHg4Y1x4Y2NceGQ2XHgyM1x4MDlceGY0XHg2NFx4MTVceDllXHhmMVx4MzVceDc1IgorJEVDSE8gLW5lICJceDk4XHgzYVx4MGNceDEyXHgyOVx4YWFceGI3XHgyYlx4ODJceGUwXHhmOVx4Y2RceDA1XHhlZFx4YjhceGJlIgorJEVDSE8gLW5lICJceGI2XHhmNVx4NmZceGNjXHg0MVx4YmNceDNhXHg4MVx4MzlceDNiXHgwM1x4ZThceGIyXHhhYlx4YjZceGFhIgorJEVDSE8gLW5lICJceGVkXHhhOFx4NThceGRmXHhjYVx4MDZceGJhXHg2NFx4N2JceGM0XHhlZlx4ZWNceDIzXHgzOFx4NzdceGVjIgorJEVDSE8gLW5lICJceGNmXHhkN1x4ZDJceGViXHg3NVx4M2RceDI2XHhlMlx4ZmFceDY2XHg0OVx4MGJceDRhXHhkY1x4ZTNceDQ4IgorJEVDSE8gLW5lICJceDY0XHgzM1x4YzRceGIzXHg5M1x4ZGFceGRkXHgzY1x4MDhceDgzXHg3ZFx4OTFceDc4XHhlNVx4NjFceDU3IgorJEVDSE8gLW5lICJceDY3XHgzN1x4NzNceGUxXHgwNVx4YmJceDk2XHgzZVx4MjZceGM3XHg2Y1x4NDRceGI1XHhmYlx4ODBceGIyIgorJEVDSE8gLW5lICJceGQ5XHhhMFx4OTlceDZiXHhiZlx4NzRceDYyXHhiN1x4ZjdceDE0XHhlY1x4MDdceDEyXHhmY1x4ZTZceDFiIgorJEVDSE8gLW5lICJceGYxXHgxZFx4MjRceGZlXHhkMFx4YjlceDYxXHg3Nlx4NTZceGEwXHhhNVx4OGNceDYzXHhjZVx4OTZceDVkIgorJEVDSE8gLW5lICJceDY1XHg0Zlx4YWVceGNjXHg3ZFx4ODZceDJkXHhkN1x4NzRceDk2XHg2N1x4YjdceDVjXHg5NFx4YTZceDMwIgorJEVDSE8gLW5lICJceGJkXHhiM1x4ODRceDU2XHg5M1x4MWVceDQ0XHhjNVx4NDNceDVmXHg2NVx4OWRceDFhXHg5Mlx4YjFceDlhIgorJEVDSE8gLW5lICJceDRjXHg0Nlx4MWZceGQyXHg2NFx4NTRceGI2XHg0ZVx4N2VceGIyXHg3MVx4NzVceGY2XHhjZVx4YWNceGRjIgorJEVDSE8gLW5lICJceDVhXHhhMVx4ZDRceGYxXHhmNVx4NzFceDZhXHg5M1x4NTBceGQyXHg4Ylx4YjJceGIxXHg3Zlx4YWZceDIwIgorJEVDSE8gLW5lICJceGQyXHhjOVx4Y2VceGViXHhmYlx4MWRceDRhXHhmZlx4MjZceDg5XHhhMlx4NjBceGVkXHg4YVx4ZWJceGE3IgorJEVDSE8gLW5lICJceDZlXHg5Mlx4ZWFceGI3XHhlZlx4N2FceGNjXHhkOVx4NGJceGJiXHgzZVx4YWRceGM2XHg3YVx4ZmFceGJiIgorJEVDSE8gLW5lICJceGUwXHgyNVx4MGNceDBmXHhlMlx4MTRceGY5XHgyZVx4MGJceDVmXHhkNFx4YmRceDhmXHg1YVx4YWVceGI2IgorJEVDSE8gLW5lICJceGNhXHhjMVx4NWFceDg5XHg0Y1x4NzRceDM2XHhkM1x4MzJceGFiXHg4N1x4YTdceDdkXHg1N1x4N2ZceDQ1IgorJEVDSE8gLW5lICJceDFhXHgxZFx4NDVceGNjXHhjOFx4ZjFceDM2XHg4Y1x4NGRceDZlXHhjOVx4MDFceGI4XHg3YVx4OTlceGRjIgorJEVDSE8gLW5lICJceDRkXHg5YVx4YTFceGMzXHg3YVx4ODFceGFjXHhhOVx4NDBceDIwXHhjMVx4MThceGM3XHgxZVx4MGRceGViIgorJEVDSE8gLW5lICJceGY3XHg1M1x4OWJceGNiXHhlMlx4NjRceDRlXHgxN1x4MWNceDZhXHhkN1x4NzRceDZiXHhlNFx4NGJceGU3IgorJEVDSE8gLW5lICJceDVmXHgwNlx4MzFceGFjXHhlN1x4NWNceDY0XHg5M1x4MDVceDY5XHgxM1x4MWFceDM0XHg1Mlx4M2VceDFhIgorJEVDSE8gLW5lICJceGM4XHhmNlx4ZWRceGRlXHg1ZVx4NzlceGY0XHhlMlx4MDRceGMzXHhiNlx4YjNceDQ5XHhkY1x4N2FceGUzIgorJEVDSE8gLW5lICJceDUyXHgxMlx4MWJceDMyXHhkOVx4ZTJceDVjXHg5NVx4NWZceDY5XHgwMVx4ZGVceDc3XHgxNlx4MzRceGY3IgorJEVDSE8gLW5lICJceGRhXHg0M1x4MmNceDU2XHg3N1x4MjFceGNjXHg4Nlx4YzRceDRhXHgxNFx4YjhceDI5XHgyOFx4MGFceGYxIgorJEVDSE8gLW5lICJceDc5XHg4YVx4OWVceDk0XHg4Nlx4NmNceDZhXHg2Y1x4MGZceDE1XHhlNlx4YjRceDU3XHg5Mlx4ZmNceDFmIgorJEVDSE8gLW5lICJceDZkXHg5OFx4YmZceDJmXHgwYlx4OTdceGIzXHg0Ylx4ZWNceGU2XHhkM1x4ZjdceDk0XHhlNFx4MmNceGYzIgorJEVDSE8gLW5lICJceDIwXHhmYVx4NDJceDY5XHhkOVx4YjZceGIyXHg5Nlx4MzFceDA5XHg2Ylx4Y2JceGQyXHg5Mlx4MTRceDQwIgorJEVDSE8gLW5lICJceDY5XHg3NVx4OWFceDgzXHg0OVx4NDRceGVkXHhlMFx4ZGRceGEzXHgzZFx4MDlceGUwXHhlNFx4Y2ZceDRmIgorJEVDSE8gLW5lICJceDNiXHgxMlx4ODRceGI2XHg0N1x4MmJceDFiXHg3ZVx4YzJceGFjXHg4ZFx4ZjZceDFjXHg3NFx4MjZceGIwIgorJEVDSE8gLW5lICJceDJhXHgyN1x4ZjZceDAzXHhlM1x4ZjlceGUzXHhiYlx4NGFceDFhXHg2Zlx4YTJceGY0XHgxMFx4YjBceGU1IgorJEVDSE8gLW5lICJceDcwXHg5YVx4OWJceGRmXHhhY1x4NDJceDZhXHhkY1x4ODBceGMzXHg4MFx4MGNceDg0XHgyNlx4ZjBceDIzIgorJEVDSE8gLW5lICJceGQ2XHg1Ylx4Y2JceDhiXHgzYlx4ZTFceDY1XHhmZVx4YmFceGFkXHg4NVx4ZTlceDFkXHg4OFx4YTRceGY4IgorJEVDSE8gLW5lICJceDA1XHhiOFx4NThceDBiXHhiMVx4MTNceGE4XHhkOFx4ZWFceGZkXHgwN1x4NjhceGVlXHg2Ylx4NWNceDg4IgorJEVDSE8gLW5lICJceDE3XHg0OVx4ODlceDBlXHhhNVx4N2FceGU2XHhhMFx4OWNceDNhXHgwNlx4MmRceDcxXHg4NFx4MmNceGQyIgorJEVDSE8gLW5lICJceDFiXHgwN1x4ZmRceDQzXHg5Ylx4NDhceDliXHhhZVx4NjBceDU0XHg1ZFx4ZDNceDJiXHhmMVx4YzBceDBkIgorJEVDSE8gLW5lICJceDQ5XHgwMVx4NjRceDM0XHgzNlx4NzdceDJmXHgwZVx4ZTdceDcyXHgzNVx4NDhceDJmXHgwNVx4YWFceGQ1IgorJEVDSE8gLW5lICJceGI0XHg5OFx4NzdceGEzXHgxOVx4YTJceGY0XHhiOFx4MTFceGE3XHhhNlx4MjRceDkxXHhhY1x4MWVceDA5IgorJEVDSE8gLW5lICJceDM4XHgwNFx4YzZceGZmXHgwYlx4N2RceDM2XHhjMlx4Y2JceGI4XHg5Y1x4N2VceDdiXHg0OVx4OGNceDRlIgorJEVDSE8gLW5lICJceGJiXHgzN1x4MTlceDE4XHg4M1x4YzVceDIzXHgwM1x4NmNceGNiXHg1MVx4MjRceGU1XHg0Mlx4ODVceGM3IgorJEVDSE8gLW5lICJceDczXHgxM1x4MmNceGM4XHgyMlx4MjhceDUwXHg4M1x4YmNceDNhXHg4ZVx4NjBceGFjXHhiMVx4ZGFceDE4IgorJEVDSE8gLW5lICJceDI0XHg2ZFx4NjRceGQwXHhhOVx4NjVceGNkXHhkNlx4NWFceGE3XHhhYVx4YzZceGVkXHgzMlx4NzZceDdiIgorJEVDSE8gLW5lICJceDA3XHg5MFx4YjRceDdiXHg1ZFx4MTZceDg4XHg5Ylx4ZDdceDVlXHgwYVx4YjdceGJmXHhiZlx4YzRceDVkIgorJEVDSE8gLW5lICJceDFjXHhiZFx4MzlceGYzXHgxN1x4YWVceDUwXHhhYVx4YzdceGE0XHhlOVx4YWRceGE1XHhhY1x4MDRceGQ5IgorJEVDSE8gLW5lICJceGE0XHgyN1x4NWZceDc5XHg3NVx4MjlceDEwXHg2OVx4NzVceGU5XHgwNlx4NTNceDdjXHg2Nlx4OGJceDgzIgorJEVDSE8gLW5lICJceGY3XHg3Y1x4ZmRceGNkXHgxNlx4YzNceDhjXHg4ZVx4NTFceDZmXHhjYlx4NjhceDBhXHg5Y1x4MzlceDM5IgorJEVDSE8gLW5lICJceGI5XHgwYlx4NmFceDE2XHhjNVx4NGFceDIyXHhjMFx4MzFceDA5XHgyMlx4MjhceGEwXHg2NVx4NjlceDA1IgorJEVDSE8gLW5lICJceDMwXHg5MFx4YzFceDE4XHgyMlx4MDVceDllXHhhZFx4YTlceGMzXHg1NFx4M2VceDI3XHhhOVx4YzRceDQxIgorJEVDSE8gLW5lICJceDJjXHgzOVx4MDNceGQyXHg4ZVx4M2ZceDkxXHg5YVx4NGNceGM4XHg2OFx4MTRceGU0XHgxY1x4YTZceDVmIgorJEVDSE8gLW5lICJceDBiXHg1N1x4MjdceDA5XHg4YVx4N2RceGZmXHg0N1x4NjNceGE3XHg1YVx4MjlceDgyXHhhMFx4M2FceDI4IgorJEVDSE8gLW5lICJceDMwXHg5YVx4MmJceGYzXHg2OVx4NjNceDE4XHhjZFx4ZTJceDMyXHg2Nlx4M2NceGQ3XHg3OVx4ZGRceDEyIgorJEVDSE8gLW5lICJceDg2XHgzNFx4YzZceDllXHg3NVx4MDVceDg3XHgzOVx4MjNceDcyXHg5N1x4NzFceDI3XHg2NFx4Y2RceGQ5IgorJEVDSE8gLW5lICJceGE2XHgyZVx4NjFceGQyXHgzN1x4ZTRceGFlXHhjNlx4YzlceDgxXHhjMFx4MmVceDlmXHhjNlx4ZjlceDdmIgorJEVDSE8gLW5lICJceGQ5XHg1ZVx4ZDBceGE5XHgwOVx4OTdceDM1XHhhMlx4ZTNceDRmXHhlOVx4MTlceDdjXHhhNVx4YzdceDRkIgorJEVDSE8gLW5lICJceDJkXHg5Mlx4ZWNceGQ2XHhlZlx4ZGFceDU1XHhmM1x4YTJceDk1XHgxN1x4MWJceGNlXHhiZVx4NmJceDc0IgorJEVDSE8gLW5lICJceDcwXHhlZVx4ZGJceGE4XHg0Mlx4MjZceGIxXHhjY1x4YzFceDMxXHgwYVx4NjdceDkyXHgxM1x4OWRceDljIgorJEVDSE8gLW5lICJceDEyXHgxOFx4YTRceDA4XHg0ZFx4NGRceGZjXHg3Y1x4ZWJceDU5XHg2Ylx4MjJceDAzXHhhYVx4OTdceGMzIgorJEVDSE8gLW5lICJceDI3XHhhNVx4MjFceDM1XHg2OFx4ZDJceDU3XHg1NFx4Y2FceDU4XHgzOFx4ODJceGM1XHgwNVx4YTBceDcxIgorJEVDSE8gLW5lICJceDAxXHgxYlx4Y2VceDU3XHgxZVx4MjBceGJmXHg4OVx4OTZceDJhXHgzMVx4OGVceDZlXHhhZlx4N2ZceDM1IgorJEVDSE8gLW5lICJceDA4XHgxMFx4ZDlceDBlXHg4YVx4NzhceGIwXHg0OFx4OThceGE0XHg2NFx4MTRceGEyXHhjZlx4MjNceDJkIgorJEVDSE8gLW5lICJceDBhXHg3Ylx4ODRceGU1XHhmZFx4MjlceDQ5XHgxNVx4M2RceDc1XHgzOVx4ZmRceGFhXHhkNlx4YTRceGI5IgorJEVDSE8gLW5lICJceDA1XHgxMlx4NTdceDMxXHgwNFx4ZGNceDI2XHgzNFx4MTZceDNmXHhhN1x4MDNceDMyXHgxZFx4NGJceDFkIgorJEVDSE8gLW5lICJceDc4XHhkY1x4OWJceDc5XHg5Nlx4OWFceDg3XHg2ZVx4YjRceDgwXHhhYVx4MDFceDE5XHgzM1x4OTJceGIwIgorJEVDSE8gLW5lICJceDE2XHhjOVx4OTRceDljXHhlN1x4YTVceDYzXHhlNlx4MThceDEzXHhiMlx4MzRceGJkXHg5OFx4NDFceGQ2IgorJEVDSE8gLW5lICJceGE0XHhjOFx4YjlceDZlXHgwNlx4OWNceDcyXHhmOFx4NDlceGFiXHhkNVx4NDdceDllXHhhMVx4ZTZceGRlIgorJEVDSE8gLW5lICJceDYyXHhkMFx4ZWNceGFmXHhiZlx4MWJceDhhXHhhZlx4NjNceGEwXHgyOVx4YmVceDNkXHg4N1x4YTBceDIyIgorJEVDSE8gLW5lICJceGNlXHg0Nlx4NGVceDE4XHgzMFx4N2JceDNjXHgzZFx4ODZceGUxXHg5ZVx4YjZceDU5XHhlZlx4MWNceDQzIgorJEVDSE8gLW5lICJceDY1XHhkMFx4M2RceDUzXHhkMFx4NDFceDIwXHg0MFx4YjdceDJiXHhiMVx4ZGRceDUyXHgyY1x4ZGRceDY4IgorJEVDSE8gLW5lICJceDQ0XHhjMVx4YmVceDQwXHg3Mlx4NjFceGQ3XHgyNVx4NWRceGY1XHg2OVx4Y2VceDNhXHgzYlx4MmVceDliIgorJEVDSE8gLW5lICJceDEzXHgxOVx4NzlceDFhXHhmMFx4ZWVceGIwXHhlN1x4MTdceDQ0XHg0NVx4ZThceDJkXHg1OVx4NTBceGJjIgorJEVDSE8gLW5lICJceDQwXHg2N1x4NjZceDEyXHgyMFx4Y2NceDQzXHg4YVx4OWNceDFkXHhkZVx4YWNceDJkXHgwMFx4NzZceGIyIgorJEVDSE8gLW5lICJceDk4XHg4YVx4YTlceGRlXHgxY1x4YjZceDhiXHgzMlx4MTlceDY3XHgxY1x4NjdceDk1XHg0MVx4NDBceDYwIgorJEVDSE8gLW5lICJceGYzXHgxM1x4NDRceGI4XHhjNVx4MThceGE3XHhjYVx4ZGRceDhjXHg1YVx4OGZceDcyXHg2OVx4ZjFceDMxIgorJEVDSE8gLW5lICJceGE5XHhkMlx4ZWJceGFjXHgzZVx4MmZceGRjXHhjN1x4ZTBceDAwXHg3OFx4NWRceDcyXHhmZlx4MDFceDk1IgorJEVDSE8gLW5lICJceDg2XHg0YVx4OTBceDJiXHhmOFx4MTBceGM1XHhjMlx4ZDFceDlkXHg3YVx4YzNceDY1XHhiMVx4ZmRceDJkIgorJEVDSE8gLW5lICJceDA5XHgwYlx4Y2RceGRmXHgwM1x4ODBceDNlXHg0NFx4ODFceDY1XHg0OVx4NGZceDUwXHg3ZVx4MWZceDc1IgorJEVDSE8gLW5lICJceDk3XHhjNlx4MDVceGRhXHg1YVx4ZTlceGY2XHhlZVx4ZTVceDY2XHhjY1x4NWVceDE3XHhlMlx4OGNceGIyIgorJEVDSE8gLW5lICJceDA2XHg1Ylx4ZGRceDQxXHgwZFx4MjZceGNjXHg4N1x4MGRceDM3XHgyZVx4MmRceDM1XHhlMFx4NWRceDkzIgorJEVDSE8gLW5lICJceGM1XHhkZlx4MmRceGI0XHhhMlx4YjFceDFiXHgwZVx4OWJceGU2XHg3Nlx4YjRceDI4XHg2OVx4NWNceGU5IgorJEVDSE8gLW5lICJceDRlXHgyN1x4NmZceDUyXHhjYlx4NGRceGIzXHhjOFx4YWFceGVhXHhkM1x4MWFceDU3XHgwMFx4ZGZceDIwIgorJEVDSE8gLW5lICJceDJkXHg0Mlx4ZWFceDZhXHgxOFx4MGFceGFjXHhhZVx4OWFceDMyXHgwOFx4MjNceDk5XHhiN1x4ZDhceGU1IgorJEVDSE8gLW5lICJceDc1XHgzYVx4NjVceDhiXHgyZlx4YWFceDRmXHg3Ylx4NjhceGQ1XHg2Nlx4NzZceGY0XHhlY1x4M2RceGRiIgorJEVDSE8gLW5lICJceGU5XHgzN1x4ZGJceDY5XHg0MFx4NmRceDM1XHg0Zlx4NzdceGZhXHg4Zlx4MDdceDYwXHhhY1x4OGVceDNiIgorJEVDSE8gLW5lICJceDg5XHg0Nlx4M2NceDE2XHhkNFx4NGJceDZlXHg3MVx4NGZceDAwXHgxMFx4MjJceDE0XHgxMlx4Y2FceDcyIgorJEVDSE8gLW5lICJceGUwXHg2Y1x4NTRceDJmXHgwZVx4MzJceDhjXHhiYVx4NTNceGFkXHg1MVx4NDhceGFmXHhlZVx4YjJceGNhIgorJEVDSE8gLW5lICJceDkzXHg0YVx4NDZceDI0XHgxZlx4MDlceDgzXHg2OVx4MWNceDNmXHg3Mlx4NTBceDcwXHhmZlx4MTBceDc0IgorJEVDSE8gLW5lICJceDIxXHhlZlx4NGFceDA4XHgzOFx4MjVceDRjXHg1NFx4YjZceDM0XHg4M1x4NjRceDk5XHgyMlx4MGZceDAyIgorJEVDSE8gLW5lICJceDQ5XHg1OFx4NTBceDc0XHhhM1x4YmVceGMyXHgxN1x4MDVceGE3XHg2MFx4NTVceGM0XHgyMVx4NTJceDBjIgorJEVDSE8gLW5lICJceDU3XHhlZVx4MGZceDY0XHg2YVx4YTlceDczXHgyNVx4YTFceDJhXHg5NFx4MWRceDAwXHhjYVx4NjVceGM0IgorJEVDSE8gLW5lICJceDM5XHhmY1x4NTNceGE4XHhlN1x4NGNceDA3XHg0NFx4NWZceDI5XHgxOVx4OThceDA4XHgxNlx4NTNceDFhIgorJEVDSE8gLW5lICJceGJhXHhlZVx4OGVceDJlXHgxNlx4OTdceDY2XHg1Ylx4N2NceGI1XHg2M1x4MmRceDMxXHgxOFx4ZGJceDY0IgorJEVDSE8gLW5lICJceGM1XHg2OVx4MTVceGE5XHhlOFx4MjNceDVmXHg5Mlx4ZGJceDc1XHg2MFx4OTBceDZhXHhiZlx4YjVceGJhIgorJEVDSE8gLW5lICJceGU1XHhhNVx4NzBceGNlXHgyNlx4ZDBceGMxXHg2M1x4Y2JceDBlXHgyMVx4NjdceDFlXHg4ZVx4MjBceDMyIgorJEVDSE8gLW5lICJceGExXHgyZFx4NTFceGZjXHgzMlx4YTBceGM5XHhkMFx4MzJceDkxXHg5YVx4ZGFceDQ1XHg3M1x4MmVceDk3IgorJEVDSE8gLW5lICJceDA5XHgxN1x4MGNceGVhXHhlNFx4ODlceDk0XHhlOFx4YWRceDY0XHhkNlx4NzhceDAyXHgwN1x4NzlceDA2IgorJEVDSE8gLW5lICJceGE0XHgwMVx4Y2VceGQwXHhjY1x4MzNceDIwXHg4ZFx4YzlceDJkXHg2N1x4ZGZceDg1XHgwNlx4YjVceDIxIgorJEVDSE8gLW5lICJceDc0XHg2MVx4NDlceDk5XHg5OFx4ZWNceDI4XHgwNlx4YzRceGJkXHgyNVx4YjVceDYyXHgyZFx4YjBceGJhIgorJEVDSE8gLW5lICJceDVmXHg0Y1x4YzRceDMzXHg4NVx4NDJceDU4XHgxMVx4ZDRceGZmXHgyN1x4MjFceDNjXHg1N1x4OWVceGQ5IgorJEVDSE8gLW5lICJceGM0XHhiMVx4NmRceDhkXHg0YVx4OGNceDhhXHg4MFx4NmNceDFlXHgxNlx4NWZceGMxXHhjNFx4NjhceDRhIgorJEVDSE8gLW5lICJceGNhXHgyMFx4YjFceDQwXHgxMFx4MWJceDFiXHg2Y1x4ZjdceDgyXHhmOFx4ZDRceDM1XHgyOVx4MTBceDc2IgorJEVDSE8gLW5lICJceDdkXHgzYVx4NGRceDRkXHg0OVx4OWJceDYyXHg2NVx4NjZceGQ0XHhkYVx4ODFceDI0XHhjYVx4NGFceDQ4IgorJEVDSE8gLW5lICJceDQ4XHgyZlx4ODNceDQ4XHhkMVx4MDlceGRmXHgyZlx4MTdceDhiXHhjNVx4MzdceDg5XHg5NFx4MTVceGIxIgorJEVDSE8gLW5lICJceDM2XHg1OFx4Y2RceDgwXHhiNFx4MTlceGM1XHhjNlx4ZGFceGRhXHgxNlx4OTVceDgyXHgxNFx4YzVceDE5IgorJEVDSE8gLW5lICJceDYxXHg2ZVx4YjVceGNjXHgyN1x4YjVceGYzXHhkYlx4ZWZceDZlXHg0NFx4MzdceGJmXHhkY1x4MTFceGY5IgorJEVDSE8gLW5lICJceGEwXHhmMlx4NzhceDMwXHg4NVx4YzBceGMwXHgwN1x4NjdceDAyXHg2Nlx4NTZceDdjXHg3Nlx4ZWVceDdhIgorJEVDSE8gLW5lICJceDk3XHg2ZVx4MDJceDVlXHgwOFx4YzBceDM1XHgwMlx4NGFceDg3XHgzOVx4NGNceGQ2XHhjNFx4ZTBceDk5IgorJEVDSE8gLW5lICJceGNkXHhkOVx4ZGFceDJjXHg0OVx4MThceDVjXHgyMlx4YjZceDUxXHg0Ylx4YTBceDU4XHg4Ylx4N2FceDU1IgorJEVDSE8gLW5lICJceDYxXHhkY1x4YTVceDIxXHg4M1x4MWRceDQ3XHg5Y1x4MGJceGY0XHg3NFx4YmFceDA4XHg4NVx4ZTRceGM4IgorJEVDSE8gLW5lICJceDgwXHhiZVx4ODBceDQ2XHhmY1x4NDZceDg1XHg2MFx4NjRceGE2XHhjNFx4YzFceGFlXHg2OVx4NjdceDBiIgorJEVDSE8gLW5lICJceDhlXHhhY1x4YTJceGMwXHhmNFx4NmJceDZmXHg3YVx4OWVceDAwXHhkZFx4NGRceDU5XHg1N1x4NGFceDc4IgorJEVDSE8gLW5lICJceDA4XHg2NFx4MDhceDg0XHg4MFx4NTBceDM0XHhiMVx4M2JceGM3XHg3MVx4M2ZceDNlXHgxY1x4MWRceDRlIgorJEVDSE8gLW5lICJceDRlXHhhOVx4YjBceDMyXHgwMlx4MTBceDhlXHg4OFx4NzFceGVkXHg4N1x4MmNceDMyXHg0ZFx4NTdceDA1IgorJEVDSE8gLW5lICJceGYxXHhiYVx4YTBceGY5XHg2MVx4MzBceDRiXHgxOFx4NjVceDZlXHgzOFx4ZjlceDQxXHhkZFx4ZjFceDQ4IgorJEVDSE8gLW5lICJceDYzXHgzOFx4NTBceDEwXHhjMVx4YWNceDFiXHhmMlx4NWJceGFhXHgxNVx4ZjRceDg5XHgwZVx4ZTlceDc3IgorJEVDSE8gLW5lICJceDgwXHg1Nlx4NTBceDE4XHg4MVx4NzFceGQ4XHhkYlx4MGRceDZhXHhjZVx4ZDJceGI2XHg3Nlx4YmRceDM1IgorJEVDSE8gLW5lICJceGYwXHg5Nlx4ZTFceDA2XHg4Ylx4MDlceGFiXHg4M1x4MjFceDEwXHgxMFx4MzBceDY4XHgzMFx4YWRceGUwIgorJEVDSE8gLW5lICJceGMyXHg2Mlx4YTJceDk5XHgwYlx4OTJceDE3XHgxOVx4YWJceGUzXHg3YVx4ZDFceDkwXHhhZVx4NWNceDJiIgorJEVDSE8gLW5lICJceDZlXHhiZVx4MzFceGVjXHg3Mlx4NzhceDAzXHg3YVx4ODVceDcwXHhlMFx4NjdceDM2XHhlMFx4ZGJceDYzIgorJEVDSE8gLW5lICJceDZlXHhlZFx4MjZceDk0XHhjY1x4OWJceDRlXHhhOFx4MjNceDU3XHg1Nlx4ZTFceDQ5XHg2MVx4MzFceDVlIgorJEVDSE8gLW5lICJceGM4XHgyYlx4ODFceDA1XHgyM1x4MThceGRiXHg2OFx4MzRceDBiXHg2Y1x4ZjFceGZjXHhjN1x4ZGRceGRmIgorJEVDSE8gLW5lICJceDFhXHgzOVx4ZjhceGY2XHg3Mlx4YjlceDRkXHhjOVx4ODBceGJmXHgyM1x4OTNceDI0XHg3Nlx4ZGRceDZkIgorJEVDSE8gLW5lICJceDBhXHg4Zlx4MThceGUxXHg4MVx4OGZceDQ4XHg3Ylx4NDhceDJlXHhkMFx4YjVceGQwXHhjYlx4YTFceDQ2IgorJEVDSE8gLW5lICJceGFlXHgxY1x4MjZceDAyXHhkMlx4ZTBceGY0XHg1Nlx4OGNceDhhXHgwMVx4OTdceDRlXHg1Zlx4ZDFceGRlIgorJEVDSE8gLW5lICJceDlhXHgxMFx4MzFceDBkXHg0Y1x4YmNceDQwXHgwNlx4YzVceDA0XHg5Mlx4OTFceDg4XHg4MVx4NThceDVkIgorJEVDSE8gLW5lICJceDU1XHgxM1x4YWJceDRmXHhhYVx4YmRceGVlXHhhMFx4NmFceDgwXHhiMlx4ODNceGQwXHg0Nlx4MzFceGEwIgorJEVDSE8gLW5lICJceGJjXHgyY1x4ZjlceDBkXHhhZFx4ZTJceDYyXHhiMFx4YWNceGE0XHg5MVx4ODRceGI4XHgzMVx4OTlceGI5IgorJEVDSE8gLW5lICJceDQ1XHhiM1x4NDdceDFlXHhjMlx4OTZceGM5XHg5ZFx4Y2NceGQzXHhjY1x4NzFceGM0XHhmM1x4OWFceDkyIgorJEVDSE8gLW5lICJceDJiXHhhY1x4YzNceDhjXHhlMVx4ZGNceDQwXHg2Nlx4NjRceGU4XHgyNFx4MzVceDUwXHgyNlx4NjhceDBiIgorJEVDSE8gLW5lICJceDc5XHg5Nlx4ODFceGI2XHgzNlx4YzdceGE0XHg4Mlx4MGRceDMyXHg2NVx4YzNceDRjXHg2MVx4NDlceDMyIgorJEVDSE8gLW5lICJceDA5XHgxNFx4MjJceGFjXHgzN1x4NjlceDM0XHhiNFx4NmNceGRkXHhiY1x4OTVceDU0XHg2Ylx4NTlceDUzIgorJEVDSE8gLW5lICJceGM2XHg1MFx4MzJceDA5XHg5OVx4MTRceDhjXHgxOFx4NzRceGNjXHgwNVx4ODZceDdhXHgwNlx4NDhceDUwIgorJEVDSE8gLW5lICJceDZlXHhlMFx4YWFceDQxXHhiYlx4YjBceGJjXHgxOVx4YWFceDJjXHgxMlx4OWNceGNkXHhhNVx4MWNceDZkIgorJEVDSE8gLW5lICJceDE5XHgwYVx4NjJceDAyXHhmZVx4ZDNceDRhXHhjY1x4N2NceDZhXHhhNVx4NzJceDA2XHgzNVx4ZmJceDhkIgorJEVDSE8gLW5lICJceGY5XHhhYlx4MWVceDBiXHgyOVx4NzNceDcwXHhiNVx4ZThceGY2XHg1NFx4YjZceDRjXHhjOFx4ZWFceDMwIgorJEVDSE8gLW5lICJceDhjXHhhZlx4ZDBceGQzXHhiMFx4MjBceDU5XHg4MFx4NjFceDQwXHhjOFx4MTlceDk5XHg2ZFx4OTdceGIzIgorJEVDSE8gLW5lICJceGNhXHg2Nlx4MWVceDE2XHgzZFx4YTdceDc0XHhhNlx4NThceGYwXHhkNFx4MDBceDY3XHhkY1x4YmJceDhhIgorJEVDSE8gLW5lICJceDRhXHg3Ylx4NzVceGE0XHg2ZVx4ODlceGM0XHg0NFx4NDRceDNkXHg3Mlx4YjRceDUyXHg4YVx4YzBceGMyIgorJEVDSE8gLW5lICJceDExXHg0MFx4MjJceDlhXHgxNFx4MDlceDY2XHhjMlx4MDNceGNjXHgwNFx4ODZceDAyXHgwM1x4YTZceDhhIgorJEVDSE8gLW5lICJceGFiXHg2MFx4ZTBceGU4XHhkY1x4MmJceDVkXHgwZFx4NzNceGI1XHg4Zlx4NzRceGM2XHhjZVx4ZGJceGI1IgorJEVDSE8gLW5lICJceGE4XHhlN1x4OTVceDNmXHg4Ylx4YWZceGI5XHg4N1x4YmNceDYzXHhhYlx4ODRceGVhXHg5M1x4MWVceDlkIgorJEVDSE8gLW5lICJceGI0XHhlMFx4ODNceGM4XHg0YVx4YzlceGM3XHhiOVx4YzdceGYyXHhjNlx4MjVceDEwXHg1OFx4YzBceDIxIgorJEVDSE8gLW5lICJceDY0XHhhMVx4MDhceGQzXHgxMFx4MmZceDk0XHg0MFx4NWFceDU2XHgxN1x4YTFceDBmXHhhNlx4ZmJceGRhIgorJEVDSE8gLW5lICJceGQzXHgxMlx4NDJceDMxXHg3MVx4MDlceGE1XHgyZVx4OGJceGQxXHg2OVx4NWNceDk5XHg1Ylx4MDlceDUyIgorJEVDSE8gLW5lICJceGM2XHg5Ylx4NWFceDE4XHgwY1x4MDZceDQ3XHg0Mlx4OGFceGMzXHhhZFx4ZWZceDlhXHhlOVx4OWRceGY2IgorJEVDSE8gLW5lICJceDJiXHg4MVx4NzJceDQ4XHgwNVx4MjBceDE2XHgxMFx4YTNceGMzXHhjNVx4ZDJceDcxXHgwZVx4Y2FceDA0IgorJEVDSE8gLW5lICJceDE3XHhlZlx4ZGZceDM5XHg2NFx4MjZceDRjXHg5Zlx4MjJceGI0XHgxM1x4MWNceDNkXHhlN1x4NTVceDQwIgorJEVDSE8gLW5lICJceDJlXHhkMVx4OTFceDI4XHhjOFx4MWNceDY4XHg2OVx4NjVceDk3XHgxM1x4NzVceGZlXHg1Ylx4NWNceGIxIgorJEVDSE8gLW5lICJceDliXHg1YVx4ZjdceGQyXHgwMlx4YjJceDBiXHg0MVx4MzZceDY3XHhlN1x4YTlceDEwXHg4MFx4ZDBceDVjIgorJEVDSE8gLW5lICJceDY0XHgwOFx4NjdceGRhXHg1Nlx4MzZceDUzXHg0YVx4YThceGNhXHgxNlx4ODhceGM1XHg3OVx4ZGRceDNlIgorJEVDSE8gLW5lICJceDg3XHg3MVx4MTNceDM5XHhhZVx4ZmRceDJhXHg5M1x4NmVceGJiXHg5Nlx4MDJceDM5XHhlYVx4ZGFceDVhIgorJEVDSE8gLW5lICJceDg3XHhiOFx4ZmFceDU0XHgyY1x4NDlceGEzXHhhMFx4YmJceGE1XHhjNFx4MTBceDVjXHhkMlx4MTBceDEwIgorJEVDSE8gLW5lICJceDBjXHg4OFx4YjJceGQ0XHhmNFx4NjdceDZhXHg5M1x4NWJceGJiXHgyMFx4MDZceGRjXHg3NVx4N2ZceDNhIgorJEVDSE8gLW5lICJceDliXHhhM1x4YjBceDc2XHg5OFx4ZDlceDc3XHgzMlx4OTdceGE1XHhkY1x4NjRceGE0XHg3Ylx4YTVceGFlIgorJEVDSE8gLW5lICJceGFhXHgxNVx4MmRceDU5XHgwY1x4YzFceDdhXHg0MFx4ZDJceGMyXHhiYlx4NDVceDEwXHhlMVx4OWFceDQ2IgorJEVDSE8gLW5lICJceDUyXHg5MVx4ZTRceDI0XHgyMVx4OWNceDQ2XHhlZVx4MDVceDU3XHg0NFx4NWVceDQxXHhhZFx4NWFceDA4IgorJEVDSE8gLW5lICJceDQ2XHgwYlx4YTBceGRmXHhiNFx4NTlceDdhXHhlNFx4NDFceGEzXHgwYVx4NTlceDVlXHgyYlx4MTdceDIwIgorJEVDSE8gLW5lICJceDE5XHgwMlx4NmNceGU2XHhlMlx4NDhceDg1XHg5OVx4YjNceGJhXHhmY1x4OWNceGUzXHhjZFx4ZjlceDMxIgorJEVDSE8gLW5lICJceDViXHhmMVx4ODZceDY0XHg5ZFx4OGZceDkzXHgyNFx4YTNceDI5XHgzOFx4OTRceGNiXHgxZVx4NzFceDg3IgorJEVDSE8gLW5lICJceDU0XHhmMlx4MjdceDIyXHg0ZVx4NTdceDI2XHg5YVx4ODJceGI1XHg2ZVx4NmNceDFjXHhhZFx4MmRceDJiIgorJEVDSE8gLW5lICJceDIyXHg2Mlx4MGFceGQwXHgyM1x4NWRceDVhXHg3NVx4MTVceGFlXHhhMFx4MjZceDA0XHgyMVx4NmRceDJjIgorJEVDSE8gLW5lICJceGZlXHgwNlx4ZDlceDYwXHg2MVx4MjBceDhlXHhlYVx4ZWZceGJhXHg1OVx4MDNceDY0XHhkYVx4ZTVceGIyIgorJEVDSE8gLW5lICJceDMwXHhjMFx4OWNceGRjXHhjZlx4MTFceDc3XHhlOVx4MjNceDU0XHgzM1x4YjhceGU5XHgwNVx4YWJceDRjIgorJEVDSE8gLW5lICJceDViXHhiNVx4NGJceDJkXHgwM1x4MGNceDUxXHhjNVx4ODBceDExXHg1MVx4YWNceGViXHg4ZFx4NGNceDI1IgorJEVDSE8gLW5lICJceDIxXHg5OFx4NzlceGIwXHgzOFx4OTlceDljXHhiY1x4ZTJceDk2XHhlOVx4NGFceGQwXHhhZFx4NTZceDZhIgorJEVDSE8gLW5lICJceDY1XHhlMVx4ZDRceDkwXHgxMlx4NGFceGE1XHg0OFx4MDZceGM2XHg0OFx4MzFceGFjXHhhZlx4MjFceDBhIgorJEVDSE8gLW5lICJceDU2XHhhMlx4OTBceDEyXHhkN1x4NTNceGE4XHg0OFx4MDNceDc1XHgyZVx4MzZceDE0XHhmNFx4NTBceDg5IgorJEVDSE8gLW5lICJceDdjXHg0OVx4NGVceDRhXHgyYVx4YmNceDQ2XHhjM1x4MmRceDE2XHg0ZVx4NDJceDI1XHgyOFx4ZDRceGYyIgorJEVDSE8gLW5lICJceDAxXHg0N1x4YTNceDVhXHhkMVx4NmFceDBjXHgxY1x4MzVceDljXHg1Mlx4YzhceDJkXHhlYlx4YWJceDE1IgorJEVDSE8gLW5lICJceDJhXHg5OVx4NTFceDQ1XHgyMlx4OWNceDc3XHhhZlx4ODVceDc3XHhiY1x4ODRceGIyXHhmNVx4OTlceGU5IgorJEVDSE8gLW5lICJceGQ4XHhkOVx4YzFceDkwXHg4M1x4MDJceGViXHhkZVx4OGZceDkxXHg4Mlx4YTNceDBjXHg3M1x4MWFceDA1IgorJEVDSE8gLW5lICJceDZiXHg5Y1x4OThceDI4XHhjNVx4NTZceDU1XHhlOVx4ZjNceDc0XHgyNFx4ODFceDQ4XHhhZlx4MjFceGI0IgorJEVDSE8gLW5lICJceDg0XHgyZFx4NmJceDQ1XHg4OFx4YzJceDkwXHhiMVx4MTJceDEyXHg2MFx4YzhceDZhXHhlY1x4NjFceDMzIgorJEVDSE8gLW5lICJceGEyXHhjM1x4YjNceDU4XHhiZlx4MjlceDFjXHg0OFx4OTdceDdhXHhlYVx4MjBceDY1XHgwM1x4N2ZceDIyIgorJEVDSE8gLW5lICJceDQ1XHhhNVx4ZGRceDAzXHg1Y1x4NTJceGRjXHgzMFx4ODVceGRlXHhkOVx4NDdceDVlXHhlYlx4MzFceDY1IgorJEVDSE8gLW5lICJceDBiXHhmM1x4MTNceDgwXHhhZVx4M2VceDA3XHg1Mlx4MmFceDQ3XHhiOVx4N2JceDdjXHhhOFx4NDFceDc5IgorJEVDSE8gLW5lICJceDk1XHgyZVx4Y2ZceDNkXHg2MFx4MDhceGU2XHgyNlx4MDBceGQxXHg4Mlx4NjBceDcwXHg0NVx4YTFceDRhIgorJEVDSE8gLW5lICJceDQ4XHhhMlx4MThceDc2XHgzNVx4YjVceGU4XHg2Y1x4MGRceDQyXHhkMlx4YmFceDJjXHgxM1x4NWJceDI1IgorJEVDSE8gLW5lICJceDI3XHhkNFx4OGRceDczXHg3YVx4ZjhceGQ5XHhmZVx4ZjNceGQzXHg4MVx4NzNceDgzXHhlOFx4NjVceDYwIgorJEVDSE8gLW5lICJceGYzXHg1Ylx4MThceDA3XHgxNVx4MDRceDYwXHg2N1x4NTFceGNhXHhhYlx4OTFceDg1XHhkY1x4NjFceDNhIgorJEVDSE8gLW5lICJceGU5XHg3Mlx4YzJceGQxXHhhNFx4NjhceGUyXHgwMFx4YzhceDBjXHg1ZVx4ODJceGEwXHgwYlx4ODJceDE2IgorJEVDSE8gLW5lICJceDQwXHg4Mlx4YjJceDk4XHg3Ylx4NzZceGY4XHg1Ylx4YjVceGY2XHg4ZFx4ZmJceGM5XHgzNlx4OGNceDFlIgorJEVDSE8gLW5lICJceGE2XHhjOVx4YjVceDk1XHhkOFx4MzZceDI4XHgzNlx4ZWVceGE5XHhhMlx4NzJceDY2XHg1OFx4ZjVceDkwIgorJEVDSE8gLW5lICJceDAyXHg5NVx4ZWVceGE4XHhmY1x4NzlceGZhXHg2Zlx4NjZceGY2XHg0N1x4ZDZceDRmXHgxMFx4OTVceDg2IgorJEVDSE8gLW5lICJceDU0XHgwZFx4YTBceDIyXHgyNlx4MDFceGJlXHg2M1x4YzVceGYxXHhhY1x4MzZceDRhXHhlMVx4MGZceDZiIgorJEVDSE8gLW5lICJceGU3XHhiYVx4NGZceDIwXHgxN1x4YzBceGY5XHgwMlx4NWRceGM0XHhjMFx4YWZceGYwXHgxZlx4ODhceDU0IgorJEVDSE8gLW5lICJceGU0XHg2ZVx4YzBceGEyXHhiYlx4NTlceDZmXHg4Mlx4MjFceGJiXHg1MFx4OWNceDRlXHg5Mlx4ODNceDI0IgorJEVDSE8gLW5lICJceDIzXHhmOFx4MjhceDRjXHg0NVx4NzlceDg4XHg3MVx4M2JceDA1XHg3OVx4OThceDRmXHhhMVx4MDBceDJkIgorJEVDSE8gLW5lICJceDZlXHg2OFx4MDhceDQ2XHgzYlx4ZmJceGYwXHg1Y1x4MjJceGYzXHg0Mlx4NDBceDdkXHg1ZVx4NjdceDNmIgorJEVDSE8gLW5lICJceGRmXHhmZlx4MmVceDczXHgwZFx4MzFceGI1XHhjMFx4NzhceDRjXHgwZlx4ODVceDBmXHhkYlx4ZTZceDJiIgorJEVDSE8gLW5lICJceDg2XHgwZlx4YjNceDhmXHg5ZFx4MWFceGU2XHhlMlx4ZGJceDMyXHg2OFx4ZmJceDVhXHg3OVx4MGFceGY0IgorJEVDSE8gLW5lICJceDI1XHgyOFx4MDFceDM5XHhkMlx4N2NceDA1XHg3Ylx4MGJceDE4XHhiYlx4OWNceDY4XHgzMVx4OGRceGIwIgorJEVDSE8gLW5lICJceGZjXHg2OVx4MmRceDE3XHgyY1x4MzNceDYyXHhhNlx4MjRceDZmXHgwZVx4Y2NceGRjXHhmZlx4N2JceGRmIgorJEVDSE8gLW5lICJceDc4XHhkM1x4ODhceDVjXHg0YVx4YmRceGViXHgxNFx4ZGFceGUwXHgwZVx4ZDNceGYzXHg1Ylx4ZDJceGFhIgorJEVDSE8gLW5lICJceGQxXHg2NFx4ODJceDQyXHgwY1x4ZmVceDU0XHg5MFx4NDBceGViXHg3NVx4MTNceDYzXHg2OFx4YjVceDUyIgorJEVDSE8gLW5lICJceDBhXHhkOVx4M2JceGM1XHhkMFx4MTRceGUxXHhkMlx4MzVceGFiXHgyYlx4OGJceGVkXHgyMVx4ZjNceGUxIgorJEVDSE8gLW5lICJceGNiXHhlZFx4YmNceDNlXHg2NFx4ODFceDYzXHg1Zlx4YWFceGYzXHhiOFx4MDVceDEwXHgyOVx4ZTFceDY3IgorJEVDSE8gLW5lICJceGFlXHgwYVx4MTZceGJiXHg3MVx4MDVceDAyXHg0Nlx4YmFceGVmXHgzMFx4ZGFceGU3XHgzYVx4MThceDRiIgorJEVDSE8gLW5lICJceGNiXHgwZVx4OTdceGQxXHhlOVx4ZjVceDdhXHg3M1x4YzFceDYwXHg5MVx4YWZceDYzXHg0YVx4YzhceDU3IgorJEVDSE8gLW5lICJceGE2XHhiMFx4MDlceGI0XHg5NVx4OThceDg3XHhhOVx4YzRceDVlXHgwNFx4ZTdceGVmXHhiZlx4ZTVceDhjIgorJEVDSE8gLW5lICJceDM5XHg4ZVx4ZTJceGRkXHg5YVx4YzBceGJmXHgzN1x4OWNceDM4XHhhM1x4YWRceGM2XHgxNFx4ODZceDNmIgorJEVDSE8gLW5lICJceDdkXHhjMVx4OWRceGI1XHhiYlx4NjhceDU4XHg0Y1x4MTRceDAzXHhmMVx4MzZceGQ0XHhmMlx4Y2VceGI2IgorJEVDSE8gLW5lICJceGJjXHg5ZFx4YjNceDMxXHg1NVx4NjhceDBjXHg1Zlx4ZDBceDMwXHhlMlx4MDVceGFlXHg2OFx4NGVceDExIgorJEVDSE8gLW5lICJceDVhXHgyOFx4MTVceDY4XHg4Zlx4YWNceGEzXHgxYlx4ODlceGFkXHg0OFx4ODlceDA4XHgwOFx4YTNceDNiIgorJEVDSE8gLW5lICJceDI2XHg1ZVx4MzJceDFkXHg2ZFx4NzNceDJiXHgyMFx4OTBceDA4XHg0YVx4MTJceGIwXHgxZlx4ZjFceGEzIgorJEVDSE8gLW5lICJceDM3XHhmOFx4ZWNceDMwXHgyMVx4MDZceGYzXHhiYlx4M2JceDQ2XHhmOVx4YWFceGViXHgxYVx4MzFceDMzIgorJEVDSE8gLW5lICJceDJiXHhhNVx4ODdceDRkXHg0ZFx4YmNceDEzXHhkYVx4YTlceGEwXHg0Y1x4Y2FceDBiXHg0Nlx4YTZceDA5IgorJEVDSE8gLW5lICJceDQxXHg3M1x4YmJceDNmXHg3MVx4OWZceDZhXHg4OFx4NDFceDAyXHgyMFx4M2ZceDU0XHg2ZFx4NDJceGM4IgorJEVDSE8gLW5lICJceDcwXHg2ZVx4NjRceGQwXHg1MFx4ODhceDgzXHhjNFx4MzNceDc4XHg2ZFx4MDRceGI2XHg0M1x4ZWRceDVlIgorJEVDSE8gLW5lICJceDcyXHg3MVx4NmJceGQ1XHg2NVx4ODBceGNmXHg2Nlx4NDZceDI5XHgxMFx4ZGJceDc5XHhkMVx4YTlceDk1IgorJEVDSE8gLW5lICJceGI3XHg5ZFx4ZjRceGE5XHg5M1x4YjRceDVhXHgwMFx4YzZceGIyXHhhZFx4YmZceDdlXHhhYVx4ZTZceDhkIgorJEVDSE8gLW5lICJceDhjXHhjMFx4NmJceGY1XHhjMlx4YWRceDAwXHhmYlx4MDhceDYzXHhlMlx4YjVceGIxXHhlMFx4NzZceGFjIgorJEVDSE8gLW5lICJceDBhXHhlNFx4NzJceGI1XHg3Mlx4YmNceDI0XHg2Ylx4ZWZceDYyXHgwZlx4YWFceGI5XHgyOFx4ZDJceDNjIgorJEVDSE8gLW5lICJceGY2XHgzZVx4MjZceDIwXHg4Ylx4Y2NceGQyXHg2MVx4Y2RceGQ0XHhjN1x4ZWRceDM5XHhhOFx4MzlceDRlIgorJEVDSE8gLW5lICJceDdlXHgwNVx4OTdceGViXHgyOVx4MjRceDNhXHhiMlx4YzlceGJkXHhhZFx4Y2ZceGYwXHgyMlx4YmNceGRkIgorJEVDSE8gLW5lICJceGI4XHg4Y1x4MmVceDZhXHhiZlx4NGZceDY3XHgyZlx4ZmNceDA3XHhkMFx4NTNceDBjXHg1NFx4MzBceDM1IgorJEVDSE8gLW5lICJceGY4XHhmMVx4NzZceDQ1XHgyNlx4NWFceDg2XHgxMVx4MWVceGViXHg1OFx4YzBceDJkXHg2Y1x4M2RceDg3IgorJEVDSE8gLW5lICJceGE2XHhjYVx4OGVceDg5XHg0Zlx4NzVceDg4XHhmOVx4YjlceDlhXHg5OVx4OGJceDY4XHgyMlx4ZTJceDUyIgorJEVDSE8gLW5lICJceDRkXHg0Nlx4OGRceDQ0XHgzMVx4MmJceGMxXHhiMFx4MTlceGE3XHg5MFx4ZmJceDk1XHhkYVx4MTlceDJmIgorJEVDSE8gLW5lICJceDZlXHgwZFx4ZTJceGMxXHg4NVx4ZDBceDFmXHg5Ylx4ZDNceGFlXHgzM1x4ZTNceDU1XHhhNFx4NzdceGYyIgorJEVDSE8gLW5lICJceGYxXHhkN1x4YThceGYwXHg1N1x4MzBceGM0XHgzYlx4ZTZceDU1XHg5N1x4ZjlceGUzXHg4OVx4ODJceGRhIgorJEVDSE8gLW5lICJceGFlXHgwMlx4NDVceGIxXHg4Nlx4OGNceDg0XHg0Y1x4YjJceGNmXHg4Mlx4ZGJceDRlXHgwNFx4NDVceGNjIgorJEVDSE8gLW5lICJceDE5XHg1M1x4OWVceDJmXHg5NVx4YTlceGM3XHhhOFx4MDhceDE3XHg2MVx4YzFceDhjXHgyNlx4N2ZceDliIgorJEVDSE8gLW5lICJceDA3XHg4Y1x4ZTdceDc3XHgyZFx4MTJceGQyXHhjZFx4YzZceDk3XHhjZlx4MjlceDNhXHgxZVx4YWNceDJiIgorJEVDSE8gLW5lICJceDY5XHhiOVx4YjRceDYxXHhlZVx4ZWJceGIzXHhhZVx4NjBceDE4XHhhMFx4M2FceGU1XHhjMFx4YjlceDU4IgorJEVDSE8gLW5lICJceDM4XHg0ZFx4MzJceDU3XHg4MVx4ODlceDk5XHgyOVx4NzNceGRkXHg0N1x4NDNceDJmXHgxZVx4MzlceGM2IgorJEVDSE8gLW5lICJceDA2XHhiZlx4N2ZceDY0XHg5ZVx4OTFceGMzXHg5Zlx4MThceDFiXHhiYVx4ZjhceGI1XHgyOVx4NWRceGUzIgorJEVDSE8gLW5lICJceDQ2XHg3ZVx4YjVceDFhXHhmZFx4OWJceGIwXHgxYlx4ODVceDA2XHhjM1x4YzVceDA5XHhkYlx4ODJceGQwIgorJEVDSE8gLW5lICJceGQxXHhmZlx4ZTFceDBmXHhlYlx4MzdceDFkXHhjZVx4NjVceDZkXHgyNlx4NTVceGUwXHgyMFx4MDBceGM0IgorJEVDSE8gLW5lICJceDM2XHgyZlx4YmFceDg2XHgyNlx4YzZceDdiXHhhNFx4ZTlceGIxXHg0MVx4MjBceDA0XHgxMVx4ZWJceDI0IgorJEVDSE8gLW5lICJceDNjXHg3Mlx4YmZceGQzXHhjNVx4YjNceGJkXHhjZVx4MTRceDQ1XHgyZFx4NTBceDAxXHgwMFx4MjZceDM5IgorJEVDSE8gLW5lICJceDNjXHg4NVx4MTdceDBlXHg0Mlx4NjZceDhhXHgxY1x4OTRceGE4XHg5MFx4MDJceGM0XHg0Mlx4ZDhceGQxIgorJEVDSE8gLW5lICJceGNjXHg5NFx4N2FceDI1XHhhZFx4ZmRceDhkXHhhNFx4MGVceGUwXHhjYlx4OTJceDVlXHg2Zlx4MTRceDJiIgorJEVDSE8gLW5lICJceDI5XHhiZFx4YzBceDgxXHgyMFx4M2ZceDBiXHgyY1x4N2FceDJjXHhlN1x4YmFceDZkXHg5OVx4MTRceGJlIgorJEVDSE8gLW5lICJceGQ1XHgzOVx4YzhceDZmXHgyZVx4YmRceDc5XHg1OVx4MTlceDc1XHhiNlx4ZjVceDRmXHgxMlx4ZjZceDhlIgorJEVDSE8gLW5lICJceDQwXHhhMFx4MDBceDhiXHgxMlx4ZThceGZiXHhiN1x4MjdceGFhXHhkM1x4MzZceDBjXHhmY1x4ZTFceDQwIgorJEVDSE8gLW5lICJceDAxXHhmZlx4OGJceGI5XHgyMlx4OWNceDI4XHg0OFx4NWZceGE1XHhjYVx4ZjNceDgwIgorfQorCitwYnppcF80bV96ZXJvcygpIHsKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4YzlceGI1XHgyMVx4ZWZceDAwXHgwNCIKKyRFQ0hPIC1uZSAiXHg4ZFx4NDBceDIwXHhjMFx4MDBceDAxXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDVceDI5XHhhNiIKKyRFQ0hPIC1uZSAiXHg0YVx4MTFceGIxXHg0YVx4MTFceGUyXHhlZVx4NDhceGE3XHgwYVx4MTJceDE5XHgzNlx4YTRceDNkXHhlMCIKK30KKworcHJlcCgpIHsKKyAgICBybSAtZiB0KgorICAgIGhlbGxvXyRleHQgPnQxLiRleHQKKyAgICBoZWxsb18kZXh0ID50Mi4kZXh0Cit9CisKK2NoZWNrKCkgeworICAgIGV2YWwgJDIgPnRfYWN0dWFsIDI+JjEKKyAgICBpZiAkRUNITyAtbmUgIiRleHBlY3RlZCIgfCBjbXAgLSB0X2FjdHVhbDsgdGhlbgorCWVjaG8gIlBBU1M6ICQxIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkMSIKKwlGQUlMQ09VTlQ9JCgoRkFJTENPVU5UICsgMSkpCisgICAgZmkKK30KKworbWtkaXIgdGVzdGRpciAyPi9kZXYvbnVsbAorKAorY2QgdGVzdGRpciB8fCB7IGVjaG8gImNhbm5vdCBjZCB0ZXN0ZGlyISI7IGV4aXQgMTsgfQorCitleHBlY3RlZD0iJHVucGFjazogejogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQorSEVMTE8KKyIKK3ByZXA7IGNoZWNrICIkdW5wYWNrOiBkb2VzbnQgZXhpc3QiICIke2JifSR1bnBhY2sgeiB0MS4kZXh0OyBlY2hvIFwkPzsgY2F0IHQxIgorCisKK2V4cGVjdGVkPSIkdW5wYWNrOiB0Lnp6OiB1bmtub3duIHN1ZmZpeCAtIGlnbm9yZWQKKzEKK0hFTExPCisiCitwcmVwOyA+dC56ejsgY2hlY2sgIiR1bnBhY2s6IHVua25vd24gc3VmZml4IiAiJHtiYn0kdW5wYWNrIHQuenogdDEuJGV4dDsgZWNobyBcJD87IGNhdCB0MSIKKworCisjIEluIHRoaXMgY2FzZSBmaWxlICJ0MSIgZXhpc3RzLCBhbmQgd2Ugc2tpcCB0MS5neiBhbmQgdW5wYWNrIHQyLmd6CitleHBlY3RlZD0iJHVucGFjazogY2FuJ3Qgb3BlbiAndDEnOiBGaWxlIGV4aXN0cworMQorSEVMTE8KKyIKK3ByZXA7ID50MTsgY2hlY2sgIiR1bnBhY2s6IGFscmVhZHkgZXhpc3RzIiAiJHtiYn0kdW5wYWNrIHQxLiRleHQgdDIuJGV4dDsgZWNobyBcJD87IGNhdCB0MSB0MiIKKworCisjIEZyb20gb2xkIHRlc3RzdWl0ZQorZXhwZWN0ZWQ9IkhFTExPXG4wXG4iCitwcmVwOyBjaGVjayAiJHVucGFjazogc3RyZWFtIHVucGFjayIgImNhdCB0MS4kZXh0IHwgJHtiYn0kdW5wYWNrOyBlY2hvIFwkPyIKKworZXhwZWN0ZWQ9Im9rXG4iCitwcmVwOyBjaGVjayAiJHVucGFjazogZGVsZXRlIHNyYyIgIiR7YmJ9JHVucGFjayB0Mi4kZXh0OyB0ZXN0ICEgLWYgdDIuJGV4dCAmJiBlY2hvIG9rIgorCispCitybSAtcmYgdGVzdGRpcgorCisjIFRoaXMgdGVzdCBpcyBvbmx5IGZvciBidW56aXAyCitpZiB0ZXN0ICIkezAjIyovfSIgPSAiYnVuemlwMi50ZXN0cyI7IHRoZW4KKyAgICBpZiB0ZXN0MV9iejIgfCAke2JifWJ1bnppcDIgPi9kZXYvbnVsbCBcCisJJiYgdGVzdCAiYHRlc3QxX2J6MiB8ICR7YmJ9YnVuemlwMiB8IG1kNXN1bWAiID0gIjYxYmJlZWU0YmU5YzZmMTEwYTcxNDQ3ZjU4NGZkYTdiICAtIgorICAgIHRoZW4KKwllY2hvICJQQVNTOiAkdW5wYWNrOiB0ZXN0X2J6MiBmaWxlIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkdW5wYWNrOiB0ZXN0X2J6MiBmaWxlIgorCUZBSUxDT1VOVD0kKChGQUlMQ09VTlQgKyAxKSkKKyAgICBmaQorCisgICAgaWYgcGJ6aXBfNG1femVyb3MgfCAke2JifWJ1bnppcDIgPi9kZXYvbnVsbCBcCisJJiYgdGVzdCAiYHBiemlwXzRtX3plcm9zIHwgJHtiYn1idW56aXAyIHwgbWQ1c3VtYCIgPSAiYjVjZmE5ZDZjOGZlYmQ2MThmOTFhYzI4NDNkNTBhMWMgIC0iCisgICAgdGhlbgorCWVjaG8gIlBBU1M6ICR1bnBhY2s6IHBiemlwXzRtX3plcm9zIGZpbGUiCisgICAgZWxzZQorCWVjaG8gIkZBSUw6ICR1bnBhY2s6IHBiemlwXzRtX3plcm9zIGZpbGUiCisJRkFJTENPVU5UPSQoKEZBSUxDT1VOVCArIDEpKQorICAgIGZpCitmaQorCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0IGIvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTJhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYnVuemlwMi9idW56aXAyLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKQEAgLTAsMCArMSwyIEBACitlY2hvIGZvbyB8IGJ6aXAyIHwgYnVzeWJveCBidW56aXAyID4gb3V0cHV0CitlY2hvIGZvbyB8IGNtcCAtIG91dHB1dApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZW1vdmVzLWNvbXByZXNzZWQtZmlsZSBiL3Rlc3RzdWl0ZS9idW56aXAyL2J1bnppcDItcmVtb3Zlcy1jb21wcmVzc2VkLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9idW56aXAyL2J1bnppcDItcmVtb3Zlcy1jb21wcmVzc2VkLWZpbGUKQEAgLTAsMCArMSwzIEBACitlY2hvIGZvbyB8IGJ6aXAyID5mb28uYnoyCitidXN5Ym94IGJ1bnppcDIgZm9vLmJ6MgordGVzdCAhIC1mIGZvby5iejIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9idW56aXAyL2J6Y2F0LWRvZXMtbm90LXJlbW92ZS1jb21wcmVzc2VkLWZpbGUgYi90ZXN0c3VpdGUvYnVuemlwMi9iemNhdC1kb2VzLW5vdC1yZW1vdmUtY29tcHJlc3NlZC1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDAxNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYnVuemlwMi9iemNhdC1kb2VzLW5vdC1yZW1vdmUtY29tcHJlc3NlZC1maWxlCkBAIC0wLDAgKzEsMyBAQAorZWNobyBmb28gfCBiemlwMiA+Zm9vLmJ6MgorYnVzeWJveCBiemNhdCBmb28uYnoyCit0ZXN0IC1mIGZvby5iejIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9idXN5Ym94LnRlc3RzIGIvdGVzdHN1aXRlL2J1c3lib3gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRmZWEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9idXN5Ym94LnRlc3RzCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciBidXN5Ym94IGFwcGxldCBpdHNlbGYuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK0hFTFBEVU1QPWB0cnVlIHwgYnVzeWJveCAyPiYxIHwgY2F0YAorCisjIFdlIG5lZWQgdG8gdGVzdCB1bmRlciBjYWxsaW5nIHRoZSBiaW5hcnkgdW5kZXIgb3RoZXIgbmFtZXMuCisKK29wdGlvbmFsIEZFQVRVUkVfVkVSQk9TRV9VU0FHRQordGVzdGluZyAiYnVzeWJveCAtLWhlbHAgYnVzeWJveCIgInRydWUgfCBidXN5Ym94IC0taGVscCBidXN5Ym94IDI+JjEgfCBjYXQiICIkSEVMUERVTVBcblxuIiAiIiAiIgorU0tJUD0KKworbG4gLXMgYHdoaWNoIGJ1c3lib3hgIGJ1c3lib3gtc3VmZml4Citmb3IgaSBpbiBidXN5Ym94IC4vYnVzeWJveC1zdWZmaXgKK2RvCisJIyBUaGUgZ3JhdHVpdG91cyAiXG4icyBhcmUgZHVlIHRvIGEgc2hlbGwgaWRpb3N5bmNyYXN5OgorCSMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNlZW0gdG8gc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworCXRlc3RpbmcgIiIgIiRpIiAiJEhFTFBEVU1QXG5cbiIgIiIgIiIKKworCXRlc3RpbmcgIiRpIHVua25vd24iICIkaSB1bmtub3duIDI+JjEiIFwKKwkJInVua25vd246IGFwcGxldCBub3QgZm91bmRcbiIgIiIgIiIKKworCXRlc3RpbmcgIiRpIC0taGVscCIgIiRpIC0taGVscCAyPiYxIiAiJEhFTFBEVU1QXG5cbiIgIiIgIiIKKworCW9wdGlvbmFsIEZFQVRVUkVfVkVSQk9TRV9VU0FHRSBDQVQKKwl0ZXN0aW5nICIiICIkaSBjYXQiICJtb28iICIiICJtb28iCisJdGVzdGluZyAiJGkgLS1oZWxwIGNhdCIgIiRpIC0taGVscCBjYXQgMj4mMSB8IGdyZXAgcHJpbnQiIFwKKwkJIkNvbmNhdGVuYXRlIEZJTEVzIGFuZCBwcmludCB0aGVtIHRvIHN0ZG91dFxuIiAiIiAiIgorCVNLSVA9CisKKwl0ZXN0aW5nICIkaSAtLWhlbHAgdW5rbm93biIgIiRpIC0taGVscCB1bmtub3duIDI+JjEiIFwKKwkJInVua25vd246IGFwcGxldCBub3QgZm91bmRcbiIgIiIgIiIKK2RvbmUKK3JtIGJ1c3lib3gtc3VmZml4CisKK2xuIC1zIGB3aGljaCBidXN5Ym94YCB1bmtub3duCisKK3Rlc3RpbmcgImJ1c3lib3ggYXMgdW5rbm93biBuYW1lIiAiLi91bmtub3duIDI+JjEiIFwKKwkidW5rbm93bjogYXBwbGV0IG5vdCBmb3VuZFxuIiAiIiAiIgorcm0gdW5rbm93bgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9iemNhdC50ZXN0cyBiL3Rlc3RzdWl0ZS9iemNhdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjRmM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2J6Y2F0LnRlc3RzCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorCitGQUlMQ09VTlQ9MAorCitleHQ9YnoyCisKK2JiPSJidXN5Ym94ICIKKwordW5zZXQgTENfQUxMCit1bnNldCBMQ19NRVNTQUdFUwordW5zZXQgTEFORwordW5zZXQgTEFOR1VBR0UKKworaGVsbG9fZ3ooKSB7CisgICAgIyBHemlwcGVkICJIRUxMT1xuIgorICAgICNfX19fX19fX19fX19fX19fX19fX19fX19fIHZ2diB2dnYgdnZ2IHZ2diAtIG10aW1lCisgICAgJEVDSE8gLW5lICJceDFmXHg4Ylx4MDhceDAwXHg4NVx4MWRceGVmXHg0NVx4MDJceDAzXHhmM1x4NzBceGY1XHhmMVx4ZjFceGU3IgorICAgICRFQ0hPIC1uZSAiXHgwMlx4MDBceDZlXHhkN1x4YWNceGZkXHgwNlx4MDBceDAwXHgwMCIKK30KKworaGVsbG9fYnoyKCkgeworICAgICMgQnppcHBlZCAiSEVMTE9cbiIKKyAgICAkRUNITyAtbmUgIlx4NDJceDVhXHg2OFx4MzlceDMxXHg0MVx4NTlceDI2XHg1M1x4NTlceDViXHhiOFx4ZThceGEzXHgwMFx4MDAiCisgICAgJEVDSE8gLW5lICJceDAxXHg0NFx4MDBceDAwXHgxMFx4MDJceDQ0XHhhMFx4MDBceDMwXHhjZFx4MDBceGMzXHg0Nlx4MjlceDk3IgorICAgICRFQ0hPIC1uZSAiXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg1Ylx4YjhceGU4XHhhMyIKK30KKworcHJlcCgpIHsKKyAgICBybSAtZiB0KgorICAgIGhlbGxvXyRleHQgPnQxLiRleHQKKyAgICBoZWxsb18kZXh0ID50Mi4kZXh0Cit9CisKK2NoZWNrKCkgeworICAgIGV2YWwgJDIgPnRfYWN0dWFsIDI+JjEKKyAgICBpZiAkRUNITyAtbmUgIiRleHBlY3RlZCIgfCBjbXAgLSB0X2FjdHVhbDsgdGhlbgorCWVjaG8gIlBBU1M6ICQxIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkMSIKKwlGQUlMQ09VTlQ9JCgoRkFJTENPVU5UICsgMSkpCisgICAgZmkKK30KKworbWtkaXIgdGVzdGRpciAyPi9kZXYvbnVsbAorKAorY2QgdGVzdGRpciB8fCB7IGVjaG8gImNhbm5vdCBjZCB0ZXN0ZGlyISI7IGV4aXQgMTsgfQorCitleHBlY3RlZD0iSEVMTE9cbm9rXG4iCitwcmVwOyBjaGVjayAiYnpjYXQ6IGRvbnQgZGVsZXRlIHNyYyIgIiR7YmJ9YnpjYXQgdDIuYnoyOyB0ZXN0IC1mIHQyLmJ6MiAmJiBlY2hvIG9rIgorCispCitybSAtcmYgdGVzdGRpcgorCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NhbC50ZXN0cyBiL3Rlc3RzdWl0ZS9jYWwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTUwOWNmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jYWwudGVzdHMKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJjYWwgMjAwMCIgImNhbCAxIDIwMDAiICJcCisgICAgSmFudWFyeSAyMDAwCitTdSBNbyBUdSBXZSBUaCBGciBTYQorICAgICAgICAgICAgICAgICAgIDEKKyAyICAzICA0ICA1ICA2ICA3ICA4CisgOSAxMCAxMSAxMiAxMyAxNCAxNQorMTYgMTcgMTggMTkgMjAgMjEgMjIKKzIzIDI0IDI1IDI2IDI3IDI4IDI5CiszMCAzMQorIiAiIiAiIgorCit0ZXN0IHgiJENPTkZJR19MT0NBTEVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIiA9IHgiMCIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1NUQVRJQyIgIT0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVgiID0geCIiIFwKKyYmIHRlc3RpbmcgInVuaWNvZGUgY2FsIDIwMDAiICJMQU5HPXpoX1RXLnV0ZjggY2FsIDEgMjAwMCIgIlwKKyAgICDkuIDmnIggMjAwMAor5pelIOS4gCDkuowg5LiJIOWbmyDkupQg5YWtCisgICAgICAgICAgICAgICAgICAgMQorIDIgIDMgIDQgIDUgIDYgIDcgIDgKKyA5IDEwIDExIDEyIDEzIDE0IDE1CisxNiAxNyAxOCAxOSAyMCAyMSAyMgorMjMgMjQgMjUgMjYgMjcgMjggMjkKKzMwIDMxCisiICIiICIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NhdC9jYXQtcHJpbnRzLWEtZmlsZSBiL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMzVhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUKQEAgLTAsMCArMSwzIEBACitlY2hvIEkgV0FOVCA+IGZvbworYnVzeWJveCBjYXQgZm9vID5iYXIKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY2F0L2NhdC1wcmludHMtYS1maWxlLWFuZC1zdGFuZGFyZC1pbnB1dCBiL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUtYW5kLXN0YW5kYXJkLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTIzMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY2F0L2NhdC1wcmludHMtYS1maWxlLWFuZC1zdGFuZGFyZC1pbnB1dApAQCAtMCwwICsxLDcgQEAKK2VjaG8gSSBXQU5UID4gZm9vCitlY2hvIFNPTUVUSElORyB8IGJ1c3lib3ggY2F0IGZvbyAtID5iYXIKK2NhdCA+YmF6IDw8RU9GCitJIFdBTlQKK1NPTUVUSElORworRU9GCitjbXAgYmFyIGJhegpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NtcC9jbXAtZGV0ZWN0cy1kaWZmZXJlbmNlIGIvdGVzdHN1aXRlL2NtcC9jbXAtZGV0ZWN0cy1kaWZmZXJlbmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmI2MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY21wL2NtcC1kZXRlY3RzLWRpZmZlcmVuY2UKQEAgLTAsMCArMSw5IEBACitlY2hvIGZvbyA+Zm9vCitlY2hvIGJhciA+YmFyCitzZXQgK2UKK2J1c3lib3ggY21wIC1zIGZvbyBiYXIKK2lmIFsgJD8gIT0gMCBdIDsgdGhlbgorCWV4aXQgMDsKK2ZpCisKK2V4aXQgMTsKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jb21tLnRlc3RzIGIvdGVzdHN1aXRlL2NvbW0udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmY0ODE2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jb21tLnRlc3RzCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgImNvbW0gdGVzdCAxIiAiY29tbSBpbnB1dCAtIiAgICAgICAgICAgICAgIlx0MTIzXG4iIjQ1NlxuIiJhYmNcbiIiXHRkZWZcbiIgIjQ1NlxuYWJjXG4iICIxMjNcbmRlZlxuIgordGVzdGluZyAiY29tbSB0ZXN0IDIiICJjb21tIC0gaW5wdXQiICAgICAgICAgICAgICAiMTIzXG4iIlx0NDU2XG4iIlx0YWJjXG4iImRlZlxuIiAiNDU2XG5hYmNcbiIgIjEyM1xuZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgMyIgImNvbW0gaW5wdXQgLSIgICAgICAgICAgICAgICJhYmNcbiIiXHRkZWZcbiIieHl6XG4iICAgICAgICAgICJhYmNcbnh5elxuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgNCIgImNvbW0gLSBpbnB1dCIgICAgICAgICAgICAgICJcdGFiY1xuIiJkZWZcbiIiXHR4eXpcbiIgICAgICAgICJhYmNcbnh5elxuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgNSIgImNvbW0gaW5wdXQgLSIgICAgICAgICAgICAgICIxMjNcbiIiYWJjXG4iIlx0ZGVmXG4iICAgICAgICAgICIxMjNcbmFiY1xuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHRlc3QgNiIgImNvbW0gLSBpbnB1dCIgICAgICAgICAgICAgICJcdDEyM1xuIiJcdGFiY1xuIiJkZWZcbiIgICAgICAgICIxMjNcbmFiY1xuIiAiZGVmXG4iCit0ZXN0aW5nICJjb21tIHVudGVybWluYXRlZCBsaW5lIDEiICJjb21tIGlucHV0IC0iICJhYmNcbiIiXHRkZWZcbiIgICAgICAgICAgICAgICAgICJhYmMiICAgICAgICAiZGVmIgordGVzdGluZyAiY29tbSB1bnRlcm1pbmF0ZWQgbGluZSAyIiAiY29tbSAtIGlucHV0IiAiXHRhYmNcbiIiZGVmXG4iICAgICAgICAgICAgICAgICAiYWJjIiAgICAgICAgImRlZiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AudGVzdHMgYi90ZXN0c3VpdGUvY3AudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzNjZDg3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jcC50ZXN0cwpAQCAtMCwwICsxLDIwNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgT3BlbmluZyBxdW90ZSBpbiAib21pdHRpbmcgZGlyZWN0b3J5ICdkaXInIiBtZXNzYWdlOgorc3E9J2AnICAjIEdOVSBjcDogYAorc3E9IiciICAjIGJib3ggY3A6ICcKKworcm0gLXJmIGNwLnRlc3RkaXIgPi9kZXYvbnVsbAorCitta2RpciBjcC50ZXN0ZGlyCitta2RpciBjcC50ZXN0ZGlyL2RpcgorPiBjcC50ZXN0ZGlyL2Rpci9maWxlCitsbiAtcyBmaWxlIGNwLnRlc3RkaXIvZGlyL2ZpbGVfc3ltbGluaworCis+IGNwLnRlc3RkaXIvZmlsZQorbG4gLXMgZmlsZSBjcC50ZXN0ZGlyL2ZpbGVfc3ltbGluaworbG4gLXMgZGlyIGNwLnRlc3RkaXIvZGlyX3N5bWxpbmsKKworCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgISAtTCBmaWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAmJiB0ZXN0ICEgLWUgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICEgLUwgZGlyX3N5bWxpbmsgICYmIHRlc3QgISAtZSBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluaworJyAiXAorY3A6IG9taXR0aW5nIGRpcmVjdG9yeSAke3NxfWRpcicKK2NwOiBvbWl0dGluZyBkaXJlY3RvcnkgJHtzcX1kaXJfc3ltbGluaycKKzEKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0aW5nICJjcCAtZCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtZCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAgIC1MIGZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICYmIHRlc3QgISAtZSBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgICAtTCBkaXJfc3ltbGluayAgJiYgdGVzdCAhIC1lIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCisnICJcCitjcDogb21pdHRpbmcgZGlyZWN0b3J5ICR7c3F9ZGlyJworMQorIiAiIiAiIgorCitybSAtcmYgY3AudGVzdGRpcjIgPi9kZXYvbnVsbCAmJiBta2RpciBjcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3RpbmcgImNwIC1QIiAnXAorY2QgY3AudGVzdGRpciB8fCBleGl0IDE7IGNwIC1QICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICYmIHRlc3QgICAtZiBmaWxlICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBmaWxlCit0ZXN0ICAgLUwgZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBmaWxlX3N5bWxpbmsgICAgIHx8IGVjaG8gQkFEOiBmaWxlX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIgICAgICAgICAgJiYgdGVzdCAhIC1lIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAgIC1MIGRpcl9zeW1saW5rICAmJiB0ZXN0ICEgLWUgZGlyX3N5bWxpbmsgICAgICB8fCBlY2hvIEJBRDogZGlyX3N5bWxpbmsKKycgIlwKK2NwOiBvbWl0dGluZyBkaXJlY3RvcnkgJHtzcX1kaXInCisxCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AgLUwiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgLUwgKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgISAtTCBmaWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAmJiB0ZXN0ICEgLWUgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICEgLUwgZGlyX3N5bWxpbmsgICYmIHRlc3QgISAtZSBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluaworJyAiXAorY3A6IG9taXR0aW5nIGRpcmVjdG9yeSAke3NxfWRpcicKK2NwOiBvbWl0dGluZyBkaXJlY3RvcnkgJHtzcX1kaXJfc3ltbGluaycKKzEKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0aW5nICJjcCAtSCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtSCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICYmIHRlc3QgISAtZSBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgISAtTCBkaXJfc3ltbGluayAgJiYgdGVzdCAhIC1lIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCisnICJcCitjcDogb21pdHRpbmcgZGlyZWN0b3J5ICR7c3F9ZGlyJworY3A6IG9taXR0aW5nIGRpcmVjdG9yeSAke3NxfWRpcl9zeW1saW5rJworMQorIiAiIiAiIgorCitybSAtcmYgY3AudGVzdGRpcjIgPi9kZXYvbnVsbCAmJiBta2RpciBjcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3RpbmcgImNwIC1SIiAnXAorY2QgY3AudGVzdGRpciB8fCBleGl0IDE7IGNwIC1SICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAgIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAgIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgICAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AgLVJkIiAnXAorY2QgY3AudGVzdGRpciB8fCBleGl0IDE7IGNwIC1SZCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgICAtTCBmaWxlX3N5bWxpbmsgICAgICYmIHRlc3QgICAtZiBmaWxlX3N5bWxpbmsgICAgIHx8IGVjaG8gQkFEOiBmaWxlX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIgICAgICAgICAgICAgICYmIHRlc3QgICAtZCBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgICAtTCBkaXJfc3ltbGluayAgICAgICYmIHRlc3QgICAtZCBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluawordGVzdCAhIC1MIGRpci9maWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGRpci9maWxlICAgICAgICAgfHwgZWNobyBCQUQ6IGRpci9maWxlCit0ZXN0ICAgLUwgZGlyL2ZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGVfc3ltbGluayB8fCBlY2hvIEJBRDogZGlyL2ZpbGVfc3ltbGluaworJyAiXAorMAorIiAiIiAiIgorCitybSAtcmYgY3AudGVzdGRpcjIgPi9kZXYvbnVsbCAmJiBta2RpciBjcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3RpbmcgImNwIC1SUCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUlAgKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgICAgICYmIHRlc3QgICAtZiBmaWxlICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBmaWxlCit0ZXN0ICAgLUwgZmlsZV9zeW1saW5rICAgICAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICAgICAmJiB0ZXN0ICAgLWQgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICAgLUwgZGlyX3N5bWxpbmsgICAgICAmJiB0ZXN0ICAgLWQgZGlyX3N5bWxpbmsgICAgICB8fCBlY2hvIEJBRDogZGlyX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIvZmlsZSAgICAgICAgICYmIHRlc3QgICAtZiBkaXIvZmlsZSAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIvZmlsZQordGVzdCAgIC1MIGRpci9maWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGRpci9maWxlX3N5bWxpbmsgfHwgZWNobyBCQUQ6IGRpci9maWxlX3N5bWxpbmsKKycgIlwKKzAKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0aW5nICJjcCAtUkwiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgLVJMICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAhIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgISAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQorIyBHTlUgY29yZXV0aWxzIDcuMiBzYXlzOgorIyBjcDogd2lsbCBub3QgY3JlYXRlIGhhcmQgbGluayBgLi4vY3AudGVzdGRpcjIvZGlyX3N5bWxpbmsnIHRvIGRpcmVjdG9yeSBgLi4vY3AudGVzdGRpcjIvZGlyJwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIFwKK3Rlc3RpbmcgImNwIC1SSCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUkggKiAuLi9jcC50ZXN0ZGlyMiAyPiYxOyBlY2hvICQ/OyBjZCAuLi9jcC50ZXN0ZGlyMiB8fCBleGl0IDEKK3Rlc3QgISAtTCBmaWxlICAgICAgICAgICAgICYmIHRlc3QgICAtZiBmaWxlICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBmaWxlCit0ZXN0ICEgLUwgZmlsZV9zeW1saW5rICAgICAmJiB0ZXN0ICAgLWYgZmlsZV9zeW1saW5rICAgICB8fCBlY2hvIEJBRDogZmlsZV9zeW1saW5rCit0ZXN0ICEgLUwgZGlyICAgICAgICAgICAgICAmJiB0ZXN0ICAgLWQgZGlyICAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZGlyCit0ZXN0ICEgLUwgZGlyX3N5bWxpbmsgICAgICAmJiB0ZXN0ICAgLWQgZGlyX3N5bWxpbmsgICAgICB8fCBlY2hvIEJBRDogZGlyX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIvZmlsZSAgICAgICAgICYmIHRlc3QgICAtZiBkaXIvZmlsZSAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIvZmlsZQordGVzdCAgIC1MIGRpci9maWxlX3N5bWxpbmsgJiYgdGVzdCAgIC1mIGRpci9maWxlX3N5bWxpbmsgfHwgZWNobyBCQUQ6IGRpci9maWxlX3N5bWxpbmsKKycgIlwKKzAKKyIgIiIgIiIKKworcm0gLXJmIGNwLnRlc3RkaXIyID4vZGV2L251bGwgJiYgbWtkaXIgY3AudGVzdGRpcjIgfHwgZXhpdCAxCisjIEdOVSBjb3JldXRpbHMgNy4yIHNheXM6CisjIGNwOiB3aWxsIG5vdCBjcmVhdGUgaGFyZCBsaW5rIGAuLi9jcC50ZXN0ZGlyMi9kaXJfc3ltbGluaycgdG8gZGlyZWN0b3J5IGAuLi9jcC50ZXN0ZGlyMi9kaXInCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgXAordGVzdGluZyAiY3AgLVJIUCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUkhQICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAhIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgICAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdGluZyAiY3AgLVJITCIgJ1wKK2NkIGNwLnRlc3RkaXIgfHwgZXhpdCAxOyBjcCAtUkhMICogLi4vY3AudGVzdGRpcjIgMj4mMTsgZWNobyAkPzsgY2QgLi4vY3AudGVzdGRpcjIgfHwgZXhpdCAxCit0ZXN0ICEgLUwgZmlsZSAgICAgICAgICAgICAmJiB0ZXN0ICAgLWYgZmlsZSAgICAgICAgICAgICB8fCBlY2hvIEJBRDogZmlsZQordGVzdCAhIC1MIGZpbGVfc3ltbGluayAgICAgJiYgdGVzdCAgIC1mIGZpbGVfc3ltbGluayAgICAgfHwgZWNobyBCQUQ6IGZpbGVfc3ltbGluawordGVzdCAhIC1MIGRpciAgICAgICAgICAgICAgJiYgdGVzdCAgIC1kIGRpciAgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGRpcgordGVzdCAhIC1MIGRpcl9zeW1saW5rICAgICAgJiYgdGVzdCAgIC1kIGRpcl9zeW1saW5rICAgICAgfHwgZWNobyBCQUQ6IGRpcl9zeW1saW5rCit0ZXN0ICEgLUwgZGlyL2ZpbGUgICAgICAgICAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGUgICAgICAgICB8fCBlY2hvIEJBRDogZGlyL2ZpbGUKK3Rlc3QgISAtTCBkaXIvZmlsZV9zeW1saW5rICYmIHRlc3QgICAtZiBkaXIvZmlsZV9zeW1saW5rIHx8IGVjaG8gQkFEOiBkaXIvZmlsZV9zeW1saW5rCisnICJcCiswCisiICIiICIiCisKK3JtIC1yZiBjcC50ZXN0ZGlyMiA+L2Rldi9udWxsICYmIG1rZGlyIGNwLnRlc3RkaXIyIHx8IGV4aXQgMQorIyBXb3chICJjcCAtUkxIIiBpcyBub3QgdGhlIHNhbWUgYXMgImNwIC1SSEwiIChwcmV2IHRlc3QpIQorIyBHTlUgY29yZXV0aWxzIDcuMiBzYXlzOgorIyBjcDogd2lsbCBub3QgY3JlYXRlIGhhcmQgbGluayBgLi4vY3AudGVzdGRpcjIvZGlyX3N5bWxpbmsnIHRvIGRpcmVjdG9yeSBgLi4vY3AudGVzdGRpcjIvZGlyJwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIFwKK3Rlc3RpbmcgImNwIC1STEgiICdcCitjZCBjcC50ZXN0ZGlyIHx8IGV4aXQgMTsgY3AgLVJMSCAqIC4uL2NwLnRlc3RkaXIyIDI+JjE7IGVjaG8gJD87IGNkIC4uL2NwLnRlc3RkaXIyIHx8IGV4aXQgMQordGVzdCAhIC1MIGZpbGUgICAgICAgICAgICAgJiYgdGVzdCAgIC1mIGZpbGUgICAgICAgICAgICAgfHwgZWNobyBCQUQ6IGZpbGUKK3Rlc3QgISAtTCBmaWxlX3N5bWxpbmsgICAgICYmIHRlc3QgICAtZiBmaWxlX3N5bWxpbmsgICAgIHx8IGVjaG8gQkFEOiBmaWxlX3N5bWxpbmsKK3Rlc3QgISAtTCBkaXIgICAgICAgICAgICAgICYmIHRlc3QgICAtZCBkaXIgICAgICAgICAgICAgIHx8IGVjaG8gQkFEOiBkaXIKK3Rlc3QgISAtTCBkaXJfc3ltbGluayAgICAgICYmIHRlc3QgICAtZCBkaXJfc3ltbGluayAgICAgIHx8IGVjaG8gQkFEOiBkaXJfc3ltbGluawordGVzdCAhIC1MIGRpci9maWxlICAgICAgICAgJiYgdGVzdCAgIC1mIGRpci9maWxlICAgICAgICAgfHwgZWNobyBCQUQ6IGRpci9maWxlCit0ZXN0ICEgLUwgZGlyL2ZpbGVfc3ltbGluayAmJiB0ZXN0ICAgLWYgZGlyL2ZpbGVfc3ltbGluayB8fCBlY2hvIEJBRDogZGlyL2ZpbGVfc3ltbGluaworJyAiXAorMAorIiAiIiAiIgorCisKKyMgQ2xlYW4gdXAKK3JtIC1yZiBjcC50ZXN0ZGlyIGNwLnRlc3RkaXIyIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwL2NwLVJITC1kb2VzX25vdF9wcmVzZXJ2ZS1saW5rcyBiL3Rlc3RzdWl0ZS9jcC9jcC1SSEwtZG9lc19ub3RfcHJlc2VydmUtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkNmMzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jcC9jcC1SSEwtZG9lc19ub3RfcHJlc2VydmUtbGlua3MKQEAgLTAsMCArMSw2IEBACitta2RpciBhCis+YS9maWxlCitsbiAtcyBmaWxlIGEvbGluaworYnVzeWJveCBjcCAtUkhMIGEgYgordGVzdCAhIC1MIGIvbGluaworI3NoIDwvZGV2L3R0eSA+L2Rldi90dHkgMj4mMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwL2NwLWEtZmlsZXMtdG8tZGlyIGIvdGVzdHN1aXRlL2NwL2NwLWEtZmlsZXMtdG8tZGlyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTllZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3AvY3AtYS1maWxlcy10by1kaXIKQEAgLTAsMCArMSwxNSBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKKyMgd2h5Pz8/CisjVFo9VVRDMCB0b3VjaCAtZCAnMjAwMC0wMS0zMCAwNToyNDowOCcgZGlyMS9maWxlMworbWtkaXIgdGhlcmUKK2J1c3lib3ggY3AgLWEgZmlsZTEgZmlsZTIgbGluazEgZGlyMSB0aGVyZQordGVzdCAtZiB0aGVyZS9maWxlMQordGVzdCAtZiB0aGVyZS9maWxlMgordGVzdCAhIC1zIHRoZXJlL2RpcjEvZmlsZTMKK3Rlc3QgLUwgdGhlcmUvbGluazEKK3Rlc3QgeGZpbGUyID0geGByZWFkbGluayB0aGVyZS9saW5rMWAKK3Rlc3QgISBkaXIxL2ZpbGUzIC1vdCB0aGVyZS9kaXIxL2ZpbGUzCit0ZXN0ICEgZGlyMS9maWxlMyAtbnQgdGhlcmUvZGlyMS9maWxlMwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwL2NwLWEtcHJlc2VydmVzLWxpbmtzIGIvdGVzdHN1aXRlL2NwL2NwLWEtcHJlc2VydmVzLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMGNkOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3AvY3AtYS1wcmVzZXJ2ZXMtbGlua3MKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggY3AgLWEgYmFyIGJhegordGVzdCAtTCBiYXoKK3Rlc3QgeGZvbyA9IHhgcmVhZGxpbmsgYmF6YApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwL2NwLWNvcGllcy1lbXB0eS1maWxlIGIvdGVzdHN1aXRlL2NwL2NwLWNvcGllcy1lbXB0eS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjVhYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3AvY3AtY29waWVzLWVtcHR5LWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggY3AgZm9vIGJhcgorY21wIGZvbyBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jcC9jcC1jb3BpZXMtbGFyZ2UtZmlsZSBiL3Rlc3RzdWl0ZS9jcC9jcC1jb3BpZXMtbGFyZ2UtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjIyNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLWNvcGllcy1sYXJnZS1maWxlCkBAIC0wLDAgKzEsMyBAQAorZGQgaWY9L2Rldi96ZXJvIG9mPWZvbyBzZWVrPTEwayBjb3VudD0xIDI+L2Rldi9udWxsCitidXN5Ym94IGNwIGZvbyBiYXIKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtY29waWVzLXNtYWxsLWZpbGUgYi90ZXN0c3VpdGUvY3AvY3AtY29waWVzLXNtYWxsLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYTg4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jcC9jcC1jb3BpZXMtc21hbGwtZmlsZQpAQCAtMCwwICsxLDMgQEAKK2VjaG8gSSBXQU5UID4gZm9vCitidXN5Ym94IGNwIGZvbyBiYXIKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtZC1maWxlcy10by1kaXIgYi90ZXN0c3VpdGUvY3AvY3AtZC1maWxlcy10by1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MWE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jcC9jcC1kLWZpbGVzLXRvLWRpcgpAQCAtMCwwICsxLDExIEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGZpbGUyCit0b3VjaCBmaWxlMworbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIHRoZXJlCitidXN5Ym94IGNwIC1kIGZpbGUxIGZpbGUyIGZpbGUzIGxpbmsxIHRoZXJlCit0ZXN0IC1mIHRoZXJlL2ZpbGUxCit0ZXN0IC1mIHRoZXJlL2ZpbGUyCit0ZXN0ICEgLXMgdGhlcmUvZmlsZTMKK3Rlc3QgLUwgdGhlcmUvbGluazEKK3Rlc3QgeGZpbGUyID0geGByZWFkbGluayB0aGVyZS9saW5rMWAKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jcC9jcC1kZXYtZmlsZSBiL3Rlc3RzdWl0ZS9jcC9jcC1kZXYtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTVmMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLWRldi1maWxlCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBjcCAvZGV2L251bGwgZm9vCit0ZXN0IC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwL2NwLWRpci1jcmVhdGUtZGlyIGIvdGVzdHN1aXRlL2NwL2NwLWRpci1jcmVhdGUtZGlyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDdiNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3AvY3AtZGlyLWNyZWF0ZS1kaXIKQEAgLTAsMCArMSw0IEBACitta2RpciBiYXIKK3RvdWNoIGJhci9iYXoKK2J1c3lib3ggY3AgLVIgYmFyIGZvbwordGVzdCAtZiBmb28vYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtZGlyLWV4aXN0aW5nLWRpciBiL3Rlc3RzdWl0ZS9jcC9jcC1kaXItZXhpc3RpbmctZGlyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzg4YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3AvY3AtZGlyLWV4aXN0aW5nLWRpcgpAQCAtMCwwICsxLDUgQEAKK21rZGlyIGJhcgordG91Y2ggYmFyL2JhegorbWtkaXIgZm9vCitidXN5Ym94IGNwIC1SIGJhciBmb28KK3Rlc3QgLWYgZm9vL2Jhci9iYXoKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jcC9jcC1kb2VzLW5vdC1jb3B5LXVucmVhZGFibGUtZmlsZSBiL3Rlc3RzdWl0ZS9jcC9jcC1kb2VzLW5vdC1jb3B5LXVucmVhZGFibGUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdlOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLWRvZXMtbm90LWNvcHktdW5yZWFkYWJsZS1maWxlCkBAIC0wLDAgKzEsMTEgQEAKK3RvdWNoIGZvbworY2htb2QgYS1yIGZvbworc2V0ICtlCitpZiB0ZXN0IGBpZCAtdWAgPSAwOyB0aGVuCisgICAgIyBydW4gYXMgdXNlciB3aXRoIG5vbnplcm8gdWlkCisgICAgc2V0dWlkZ2lkIDEgYnVzeWJveCBjcCBmb28gYmFyCitlbHNlCisgICAgYnVzeWJveCBjcCBmb28gYmFyCitmaQorc2V0IC1lCit0ZXN0ICEgLWYgYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtZmlsZXMtdG8tZGlyIGIvdGVzdHN1aXRlL2NwL2NwLWZpbGVzLXRvLWRpcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI4MTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLWZpbGVzLXRvLWRpcgpAQCAtMCwwICsxLDExIEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGZpbGUyCit0b3VjaCBmaWxlMworbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIHRoZXJlCitidXN5Ym94IGNwIGZpbGUxIGZpbGUyIGZpbGUzIGxpbmsxIHRoZXJlCit0ZXN0IC1mIHRoZXJlL2ZpbGUxCit0ZXN0IC1mIHRoZXJlL2ZpbGUyCit0ZXN0ICEgLXMgdGhlcmUvZmlsZTMKK3Rlc3QgLWYgdGhlcmUvbGluazEKK2NtcCB0aGVyZS9maWxlMiB0aGVyZS9saW5rMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwL2NwLWZvbGxvd3MtbGlua3MgYi90ZXN0c3VpdGUvY3AvY3AtZm9sbG93cy1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDlmMDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLWZvbGxvd3MtbGlua3MKQEAgLTAsMCArMSw0IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggY3AgYmFyIGJhegordGVzdCAtZiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jcC9jcC1wYXJlbnRzIGIvdGVzdHN1aXRlL2NwL2NwLXBhcmVudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3YzE2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jcC9jcC1wYXJlbnRzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMKK21rZGlyIC1wIGZvby9iYXIvYmF6Cit0b3VjaCBmb28vYmFyL2Jhei9maWxlCitta2RpciBkaXIKK2J1c3lib3ggY3AgLS1wYXJlbnRzIGZvby9iYXIvYmF6L2ZpbGUgZGlyCit0ZXN0IC1mIGRpci9mb28vYmFyL2Jhei9maWxlCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLWhhcmQtbGlua3MgYi90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlN2I4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jcC9jcC1wcmVzZXJ2ZXMtaGFyZC1saW5rcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTCit0b3VjaCBmb28KK2xuIGZvbyBiYXIKK21rZGlyIGJhegorYnVzeWJveCBjcCAtZCBmb28gYmFyIGJhegordGVzdCBiYXovZm9vIC1lZiBiYXovYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLWxpbmtzIGIvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFkYzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1saW5rcwpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbworbG4gLXMgZm9vIGJhcgorYnVzeWJveCBjcCAtZCBiYXIgYmF6Cit0ZXN0IC1MIGJhegordGVzdCB4Zm9vID0geGByZWFkbGluayBiYXpgCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvY3AvY3AtcHJlc2VydmVzLXNvdXJjZS1maWxlIGIvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1zb3VyY2UtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGY1MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwL2NwLXByZXNlcnZlcy1zb3VyY2UtZmlsZQpAQCAtMCwwICsxLDMgQEAKK3RvdWNoIGZvbworYnVzeWJveCBjcCBmb28gYmFyCit0ZXN0IC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NwaW8udGVzdHMgYi90ZXN0c3VpdGUvY3Bpby50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2Q0NDFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2NwaW8udGVzdHMKQEAgLTAsMCArMSwxMzMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCit1bWFzayAwMjIKKworIyBscyAtbG4gc2hvd3MgZGF0ZS4gTmVlZCB0byByZW1vdmUgdGhhdCwgaXQncyB2YXJpYWJsZS4KKyMgc2VkOiBjb2FsZXNjZSBzcGFjZXMKKyMgY3V0OiByZW1vdmUgZGF0ZQorIyBncmVwOiByZW1vdmUgInRvdGFsIE5OTiIgbGluZXMKK0ZJTFRFUl9MUz0ic2VkICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNSw5LSB8IGdyZXAgLXYgJ150b3RhbCAnIgorCisKKyMgbmV3YyBjcGlvIGFyY2hpdmUgb2YgZGlyZWN0b3J5IGNwaW8udGVzdGRpciB3aXRoIGVtcHR5IHggYW5kIHkgaGFyZGxpbmtzCitoZXhkdW1wPSJcCitceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHg2NFx4MWVceDkxXHg4Y1x4MDBceDAwXAorXHg0OFx4N2ZceDgwXHg0Y1x4NDhceDA4XHgwMFx4MjhceDAxXHhmZlx4ZTBceDNmXHgyNFx4MTRceDAwXHgwZVwKK1x4MjBceGRjXHg2MFx4MjBceDAwXHg5Mlx4MTFceGVhXHhhMFx4MWFceDAwXHgwMFx4MDBceDAzXHgyMFx4OGFcCitceDkzXHhkNFx4OWFceDY4XHgxYVx4MGRceDFlXHg5MVx4YTFceGEwXHgwNlx4OThceGUzXHg1Y1x4MmZceGQ5XAorXHgyNlx4YTFceDI1XHgyNFx4MjBceGVkXHg0N1x4YzdceDIxXHg0MFx4MmJceDZlXHhmMlx4ZTZceGZlXHg5OFwKK1x4MTNceDY4XHhhOFx4YmRceDgyXHhiMlx4NGZceDI2XHgwMlx4MjRceDE2XHg1Ylx4MjJceDE2XHg3Mlx4NzRcCitceDE1XHhjZFx4YzFceGE2XHg5ZVx4YTZceDVlXHg2Y1x4MTZceDM3XHgzNVx4MDFceDk5XHhjNFx4ODFceDIxXAorXHgyOVx4MjhceDRiXHg2OVx4NTFceGE5XHgzY1x4MWFceDliXHgwYVx4ZTFceGU0XHhiNFx4YWZceDg1XHg3M1wKK1x4YmFceDIzXHgxMFx4NTlceGU4XHhiM1x4ZTFceGExXHg2M1x4MDVceDhjXHg0Zlx4YzVceGRjXHg5MVx4NGVcCitceDE0XHgyNFx4MTlceDA3XHhhNFx4NjNceDAwIgorCit1c2VyPSQoaWQgLXUpCitncm91cD0kKGlkIC1nKQorCitybSAtcmYgY3Bpby50ZXN0ZGlyIGNwaW8udGVzdGRpcjIgMj4vZGV2L251bGwKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitvcHRpb25hbCBGRUFUVVJFX0xTX1NPUlRGSUxFUyBGRUFUVVJFX0xTX1RJTUVTVEFNUFMKK3Rlc3RpbmcgImNwaW8gZXh0cmFjdHMgemVyby1zaXplZCBoYXJkbGlua3MiIFwKKyIkRUNITyAtbmUgJyRoZXhkdW1wJyB8IGJ6Y2F0IHwgY3BpbyAtaSAyPiYxOyBlY2hvIFwkPzsKK2xzIC1sbiBjcGlvLnRlc3RkaXIgfCAkRklMVEVSX0xTIiBcCisiXAorMSBibG9ja3MKKzAKKy1ydy1yLS1yLS0gMiAkdXNlciAkZ3JvdXAgMCB4Cistcnctci0tci0tIDIgJHVzZXIgJGdyb3VwIDAgeQorIiAiIiAiIgorU0tJUD0KKworCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgeworIyBDdXJyZW50bHkgZmFpbHMuIE51bWVyb3VzIGJ1Z2xldHM6ICIxIGJsb2NrcyIgdmVyc3VzICIxIGJsb2NrIiwKKyMgZG9lcyBub3QgbGlzdCBjcGlvLnRlc3RkaXIveCBhbmQgY3Bpby50ZXN0ZGlyL3kKK3Rlc3RpbmcgImNwaW8gbGlzdHMgaGFyZGxpbmtzIiBcCisiJEVDSE8gLW5lICckaGV4ZHVtcCcgfCBiemNhdCB8IGNwaW8gLXQgMj4mMTsgZWNobyBcJD8iIFwKKyJcCitjcGlvLnRlc3RkaXIKK2NwaW8udGVzdGRpci94CitjcGlvLnRlc3RkaXIveQorMSBibG9ja3MKKzAKKyIgIiIgIiIKK30KKworCisjIE1vcmUgY29tcGxleCBjYXNlCitybSAtcmYgY3Bpby50ZXN0ZGlyIGNwaW8udGVzdGRpcjIgMj4vZGV2L251bGwKK21rZGlyIGNwaW8udGVzdGRpcgordG91Y2ggY3Bpby50ZXN0ZGlyL3NvbG8KK3RvdWNoIGNwaW8udGVzdGRpci9lbXB0eQorZWNobyB4ID5jcGlvLnRlc3RkaXIvbm9uZW1wdHkKK2xuIGNwaW8udGVzdGRpci9lbXB0eSBjcGlvLnRlc3RkaXIvZW1wdHkxCitsbiBjcGlvLnRlc3RkaXIvbm9uZW1wdHkgY3Bpby50ZXN0ZGlyL25vbmVtcHR5MQorbWtkaXIgY3Bpby50ZXN0ZGlyMgorCitvcHRpb25hbCBGRUFUVVJFX0NQSU9fTyBMT05HX09QVFMgRkVBVFVSRV9MU19TT1JURklMRVMgRkVBVFVSRV9MU19USU1FU1RBTVBTCit0ZXN0aW5nICJjcGlvIGV4dHJhY3RzIHplcm8tc2l6ZWQgaGFyZGxpbmtzIDIiIFwKKyJmaW5kIGNwaW8udGVzdGRpciB8IGNwaW8gLUggbmV3YyAtLWNyZWF0ZSB8IChjZCBjcGlvLnRlc3RkaXIyICYmIGNwaW8gLWkgMj4mMSk7IGVjaG8gXCQ/OworbHMgLWxuIGNwaW8udGVzdGRpcjIvY3Bpby50ZXN0ZGlyIHwgJEZJTFRFUl9MUyIgXAorIlwKKzIgYmxvY2tzCiswCistcnctci0tci0tIDIgJHVzZXIgJGdyb3VwIDAgZW1wdHkKKy1ydy1yLS1yLS0gMiAkdXNlciAkZ3JvdXAgMCBlbXB0eTEKKy1ydy1yLS1yLS0gMiAkdXNlciAkZ3JvdXAgMiBub25lbXB0eQorLXJ3LXItLXItLSAyICR1c2VyICRncm91cCAyIG5vbmVtcHR5MQorLXJ3LXItLXItLSAxICR1c2VyICRncm91cCAwIHNvbG8KKyIgIiIgIiIKK1NLSVA9CisKKyMgV2FzIHRyeWluZyB0byBjcmVhdGUgIi91c3IvYmluIiwgY29ycmVjdCBpcyAidXNyL2JpbiIuCitybSAtcmYgY3Bpby50ZXN0ZGlyCitvcHRpb25hbCBGRUFUVVJFX0NQSU9fUAordGVzdGluZyAiY3BpbyAtcCB3aXRoIGFic29sdXRlIHBhdGhzIiBcCisiZWNobyAvdXNyL2JpbiB8IGNwaW8gLWRwIGNwaW8udGVzdGRpciAyPiYxOyBlY2hvIFwkPzsKK2xzIGNwaW8udGVzdGRpciIgXAorIlwKKzEgYmxvY2tzCiswCit1c3IKKyIgIiIgIiIKK1NLSVA9CisKKyMgY2hvd24gb24gYSBsaW5rIHdhcyBhZmZlY3RpbmcgZmlsZSwgZHJvcHBpbmcgaXRzIHN1aWQvc2dpZCBiaXRzCitybSAtcmYgY3Bpby50ZXN0ZGlyCitvcHRpb25hbCBGRUFUVVJFX0NQSU9fTyBGRUFUVVJFX1NUQVRfRk9STUFUCitta2RpciBjcGlvLnRlc3RkaXIKK3RvdWNoIGNwaW8udGVzdGRpci9maWxlCitjaG1vZCA2NzU1IGNwaW8udGVzdGRpci9maWxlICAjIHNldHMgc3VpZC9zZ2lkIGJpdHMKK2xuIC1zZiBmaWxlIGNwaW8udGVzdGRpci9saW5rCit0ZXN0aW5nICJjcGlvIHJlc3RvcmVzIHN1aWQvc2dpZCBiaXRzIiBcCisiY2QgY3Bpby50ZXN0ZGlyICYmIHsgZWNobyBmaWxlOyBlY2hvIGxpbms7IH0gfCBjcGlvIC1vdkhuZXdjID5wYWNrLmNwaW8gJiYgcm0gPz8/PyAmJiBjcGlvIC1pZG12dSA8cGFjay5jcGlvIDI+L2Rldi9udWxsOworIHN0YXQgLWMgJyVhICVuJyBmaWxlIiBcCisiXAorZmlsZQorbGluaworNjc1NSBmaWxlCisiICIiICIiCitTS0lQPQorCisjIGF2b2lkICdub3QgY3JlYXRlZDogbmV3ZXIgb3Igc2FtZSBhZ2UgZmlsZSBleGlzdHMnIG1lc3NhZ2UgZm9yIGRpcmVjdG9yaWVzCitybSAtcmYgY3Bpby50ZXN0ZGlyIGNwaW8udGVzdGRpcjIgMj4vZGV2L251bGwKK21rZGlyIGNwaW8udGVzdGRpcgordGVzdGluZyAiY3BpbyBleHRyYWN0cyBpbiBleGlzdGluZyBkaXJlY3RvcnkiIFwKKyIkRUNITyAtbmUgJyRoZXhkdW1wJyB8IGJ6Y2F0IHwgY3BpbyAtaWQgMj4mMTsgZWNobyBcJD8iIFwKKyJcCisxIGJsb2NrcworMAorIiAiIiAiIgorU0tJUD0KKworIyBDbGVhbiB1cAorcm0gLXJmIGNwaW8udGVzdGRpciBjcGlvLnRlc3RkaXIyIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC50ZXN0cyBiL3Rlc3RzdWl0ZS9jdXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTEwMzQwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jdXQudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKK3Rlc3RpbmcgImN1dCAnLScgKHN0ZGluKSBhbmQgbXVsdGkgZmlsZSBoYW5kbGluZyIgXAorCSJjdXQgLWQnICcgLWYyIC0gaW5wdXQiIFwKKwkib3ZlclxuIiJxdWlja1xuIiBcCisJInRoZSBxdWljayBicm93biBmb3hcbiIgXAorCSJqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ1xuIiBcCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWNoYXJhY3RlciBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jaGFyYWN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjNWVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jaGFyYWN0ZXIKQEAgLTAsMCArMSBAQAordGVzdCAkKGVjaG8gYWJjZCB8IGJ1c3lib3ggY3V0IC1jIDMpID0gYwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWNsb3NlZC1yYW5nZSBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jbG9zZWQtcmFuZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MGI3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jbG9zZWQtcmFuZ2UKQEAgLTAsMCArMSBAQAordGVzdCAkKGVjaG8gYWJjZCB8IGJ1c3lib3ggY3V0IC1jIDEtMikgPSBhYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWZpZWxkIGIvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWZpZWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDBiNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWEtZmllbGQKQEAgLTAsMCArMSBAQAordGVzdCAkKCRFQ0hPIC1lICJmMVx0ZjJcdGYzIiB8IGJ1c3lib3ggY3V0IC1mIDIpID0gZjIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tb3Blbi1yYW5nZSBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tb3Blbi1yYW5nZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJmMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hbi1vcGVuLXJhbmdlCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChlY2hvIGFiY2QgfCBidXN5Ym94IGN1dCAtYyAtMykgPSBhYmMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tdW5jbG9zZWQtcmFuZ2UgYi90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWFuLXVuY2xvc2VkLXJhbmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjBjZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWFuLXVuY2xvc2VkLXJhbmdlCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChlY2hvIGFiY2QgfCBidXN5Ym94IGN1dCAtYyAzLSkgPSBjZApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS1ALXdvcmtzIGIvdGVzdHN1aXRlL2RhdGUvZGF0ZS1ALXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjRjN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLUAtd29ya3MKQEAgLTAsMCArMSwxMyBAQAorIyBUZXN0cyBmb3IgdGltZV90IHZhbHVlICh1bml4IHRpbWUgZm9ybWF0KQorCisjIEp1c3QgYmVmb3JlIERTVCBzd2l0Y2hlZCBvZmYKK3Rlc3QgeCJTdW4gT2N0IDMxIDAzOjU5OjU5IEVFU1QgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI4ODQ4Njc5OWAiCisKKyMgSnVzdCBhZnRlciBEU1Qgc3dpdGNoZWQgb2ZmCit0ZXN0IHgiU3VuIE9jdCAzMSAwMzowMDowMSBFRVQgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI4ODQ4NjgwMWAiCisKKyMgSnVzdCBiZWZvcmUgRFNUIHN3aXRjaGVkIG9uCit0ZXN0IHgiU3VuIE1hciAyOCAwMjo1OTo1OSBFRVQgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI2OTczNzk5OWAiCisKKyMgSnVzdCBhZnRlciBEU1Qgc3dpdGNoZWQgb24KK3Rlc3QgeCJTdW4gTWFyIDI4IDA0OjAwOjAxIEVFU1QgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI2OTczODAwMWAiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGF0ZS9kYXRlLVItd29ya3MgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLVItd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNzhjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtUi13b3JrcwpAQCAtMCwwICsxLDEzIEBACisjIFdoZW4gZGlmZmVyZW50IGRhdGUncyB1c2UgdGltZSgpIGFuZCBjbG9ja19nZXR0aW1lKCksCisjIHNlY29uZHMgdHJhbnNpdGlvbiBtYXkgbm90IGhhcHBlbiBhdCBfZXhhY3RseV8gdGhlIHNhbWUgbW9tZW50LgorIyBUaGVyZWZvcmUgd2UgdHJ5IGl0IHNldmVyYWwgdGltZXMuCisKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK2ZhbHNlCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGF0ZS9kYXRlLWZvcm1hdC13b3JrcyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtZm9ybWF0LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTIwOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLWZvcm1hdC13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgVE9ETzogZ251IGRhdGUgZG9lc24ndCBhY2NlcHQgJzIwMDAuMTEuMjItMTE6MjI6MzMnIGZvcm1hdCwKKyMgYnV0IGFjY2VwdHMgJzIwMDAtMTEtMjIgMTE6MjI6MzMnLiBXZSBtdXN0IGZvbGxvdy4KK3Rlc3QgeCIwMS8wMS85OSIgPSB4ImBidXN5Ym94IGRhdGUgLWQgMTk5OS4wMS4wMS0xMToyMjozMyAnKyVkLyVtLyV5J2AiCit0ZXN0IHgiMjIvMTEvMDAiID0geCJgYnVzeWJveCBkYXRlIC1kIDIwMDAuMTEuMjItMTE6MjI6MzMgJyslZC8lbS8leSdgIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS11LXdvcmtzIGIvdGVzdHN1aXRlL2RhdGUvZGF0ZS11LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLXUtd29ya3MKQEAgLTAsMCArMSBAQAordGVzdCB4IlNhdCBKYW4gIDEgMTE6MjI6MzMgVVRDIDIwMDAiID0geCJgVFo9Q0VULTFDRVNULTIgYnVzeWJveCBkYXRlIC11IC1kIDIwMDAuMDEuMDEtMTE6MjI6MzNgIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3JrcyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxYzQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MKQEAgLTAsMCArMSw0NCBAQAorZHQ9YGJ1c3lib3ggZGF0ZWAKKyMgRXhwZWN0ZWQgZm9ybWF0OiBGcmkgQXByIDI1IDAzOjQ3OjU1IENFU1QgMjAwOAorZHQ9YGVjaG8gIiRkdCIgfCBzZWQgJ3MvXlteIF1bXiBdW14gXSBbXiBdW14gXVteIF0gWyAwMTIzXVswLTldIFswMTJdWzAtOV06WzAtNV1bMC05XTpbMC02XVswLTldIFtBLVpdW0EtWl0qIFswMTJdWzAtOV1bMC05XVswLTldJC9PSy8nYAordGVzdCB4IiRkdCIgPSB4Ik9LIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDE6MmAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMTItMTlgCit0ZXN0IHgiJGR0IiA9IHgiMDE6MDI6MDAiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMToyOjNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEyLTE5YAordGVzdCB4IiRkdCIgPSB4IjAxOjAyOjAzIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjRgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuICAyIDAzOjA0OjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjQ6NWAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iNS0xOWAKK3Rlc3QgeCIkZHQiID0geCJKYW4gIDIgMDM6MDQ6MDUiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0YAorZHQ9YGVjaG8gIiRkdCIgfCBjdXQgLWIxLTE5YAordGVzdCB4IiRkdCIgPSB4IlNhdCBKYW4gIDIgMDM6MDQ6MDAiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0OjVgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEtMTlgCit0ZXN0IHgiJGR0IiA9IHgiU2F0IEphbiAgMiAwMzowNDowNSIKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAnMTk5OS0xLTIgMzo0OjUnYAorZHQ9YGVjaG8gIiRkdCIgfCBjdXQgLWIxLTE5YAordGVzdCB4IiRkdCIgPSB4IlNhdCBKYW4gIDIgMDM6MDQ6MDUiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMDEyMzExMzNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuIDIzIDExOjMzOjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzM2AKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMS0xOWAKK3Rlc3QgeCIkZHQiID0geCJTdW4gSmFuIDIzIDExOjMzOjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzMy4zMGAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMS0xOWAKK3Rlc3QgeCIkZHQiID0geCJTdW4gSmFuIDIzIDExOjMzOjMwIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3Jrcy0xIGIvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3Jrcy0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWNlYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLXdvcmtzLTEKQEAgLTAsMCArMSwxMzQgQEAKK3Vuc2V0IExBTkcKK3Vuc2V0IExBTkdVQUdFCit1bnNldCBMQ19USU1FCit1bnNldCBMQ19BTEwKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxOjIgKyVUYAordGVzdCB4IiRkdCIgPSB4IjAxOjAyOjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDE6MjozICslVGAKK3Rlc3QgeCIkZHQiID0geCIwMTowMjowMyIKKworaG9zdF9kYXRlPS9iaW4vZGF0ZQorCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcxLjItMzo0JworIyBidXN5Ym94IDEuMTEuMC5zdm4gZGF0ZSByZXBvcnRzOgorIwlkYXRlOiBpbnZhbGlkIGRhdGUgJzEvMiAzOjQnCisKKyMgVE9ETzogKDEpIGNvbXBhcmUgd2l0aCBzdHJpbmdzLCBub3QgImhvc3QgZGF0ZSIKKyMgKDIpIGltcGxlbWVudCBkL21bL3ldIGhoOm1tWzpzc10gZm10IGluIGRhdGUgYXBwbGV0CisjaGR0PWAkaG9zdF9kYXRlIC1kICcxLzIgMzo0J2AKKyNkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjRgCisjdGVzdCB4IiRoZHQiID0geCIkZHQiCisKKyNoZHQ9YCRob3N0X2RhdGUgLWQgJzEvMiAzOjQ6NSdgCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxLjItMzo0OjVgCisjdGVzdCB4IiRoZHQiID0geCIkZHQiCisKKyNoZHQ9YCRob3N0X2RhdGUgLWQgJzEvMi8xOTk5IDM6NCdgCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxOTk5LjEuMi0zOjRgCisjdGVzdCB4IiRoZHQiID0geCIkZHQiCisKKyNoZHQ9YCRob3N0X2RhdGUgLWQgJzEvMi8xOTk5IDM6NDo1J2AKKyNkdD1gYnVzeWJveCBkYXRlIC1kIDE5OTkuMS4yLTM6NDo1YAorI3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCitoZHQ9YCRob3N0X2RhdGUgLWQgJzE5OTktMS0yIDM6NDo1J2AKK2R0PWBidXN5Ym94IGRhdGUgLWQgJzE5OTktMS0yIDM6NDo1J2AKK3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCisjIEF2b2lkaW5nIHVzaW5nIHdlZWsgZGF5IGluIHRoaXMgZXZhbHVhdGlvbiwgYXMgaXQncyBtb3N0bHkgZGlmZmVyZW50IGV2ZXJ5IHllYXIKKyMgZGF0ZSAoR05VIGNvcmV1dGlscykgNi4xMCByZXBvcnRzOgorIwlkYXRlOiBpbnZhbGlkIGRhdGUgJzAxMjMxMTMzJworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAwMTIzMTEzMyArJWNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuIDIzIDExOjMzOjAwIgorCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcwMTIzMTEzMzIwMDAnCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzMyArJWNgCit0ZXN0IHgiJGR0IiA9IHgiU3VuIEphbiAyMyAxMTozMzowMCAyMDAwIgorCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcwMTIzMTEzMzIwMDAnCitkdD1gYnVzeWJveCBkYXRlIC1kIDIwMDAwMTIzMTEzMy4zMCArJWNgCit0ZXN0IHgiJGR0IiA9IHgiU3VuIEphbiAyMyAxMTozMzozMCAyMDAwIgorCitsY2JiZD0iTENfQUxMPUMgYnVzeWJveCBkYXRlIgord2Q9JChldmFsICRsY2JiZCArJWEpCQkjIHdlZWtkYXkgbmFtZQorbW49JChldmFsICRsY2JiZCArJWIpCQkjIG1vbnRoIG5hbWUKK2RtPSQoZXZhbCAkbGNiYmQgKyVlKQkJIyBkYXkgb2YgbW9udGgsIHNwYWNlIHBhZGRlZAoraD0kKGV2YWwgJGxjYmJkICslSCkJCSMgaG91ciwgemVybyBwYWRkZWQKK209JChldmFsICRsY2JiZCArJU0pCQkjIG1pbnV0ZSwgemVybyBwYWRkZWQKK3M9JChldmFsICRsY2JiZCArJVMpCQkjIHNlY29uZCwgemVybyBwYWRkZWQKK3o9JChldmFsICRsY2JiZCAtdSArJVopCQkjIHRpbWUgem9uZSBhYmJyZXZpYXRpb24KK3k9JChldmFsICRsY2JiZCArJVkpCQkjIHllYXIKKworcmVzPU9LCitjYXNlICR3ZCBpbgorCVN1bikKKwkJOzsKKwlNb24pCisJCTs7CisJVHVlKQorCQk7OworCVdlZCkKKwkJOzsKKwlUaHUpCisJCTs7CisJRnJpKQorCQk7OworCVNhdCkKKwkJOzsKKwkqKQorCQlyZXM9QkFECisJCTs7Citlc2FjCisKK2Nhc2UgJG1uIGluCisJSmFuKQorCQk7OworCUZlYikKKwkJOzsKKwlNYXIpCisJCTs7CisJQXByKQorCQk7OworCU1heSkKKwkJOzsKKwlKdW4pCisJCTs7CisJSnVsKQorCQk7OworCUF1ZykKKwkJOzsKKwlTZXApCisJCTs7CisJT2N0KQorCQk7OworCU5vdikKKwkJOzsKKwlEZWMpCisJCTs7CisJKikKKwkJcmVzPUJBRAorCQk7OworZXNhYworCitkbT0ke2RtIyAqfQorWyAkZG0gLWdlIDEgXSAmJiBbICRkbSAtbGUgMzEgXSB8fCByZXM9QkFECitoPSR7aCMwfQorWyAkaCAtZ2UgMCBdICYmIFsgJGggLWxlIDIzIF0gfHwgcmVzPUJBRAorbT0ke20jMH0KK1sgJG0gLWdlIDAgXSAmJiBbICRtIC1sZSA1OSBdIHx8IHJlcz1CQUQKK3M9JHtzIzB9CitbICRzIC1nZSAwIF0gJiYgWyAkcyAtbGUgNTkgXSB8fCByZXM9QkFECitbICR6ID0gVVRDIF0gfHwgcmVzPUJBRAorWyAkeSAtZ2UgMTk3MCBdIHx8IHJlcz1CQUQKKwordGVzdCB4IiRyZXMiID0geE9LCisKKyMgVGhpcyBzaG91bGQgZXJyb3Igb3V0IChieSBzaG93aW5nIHVzYWdlIHRleHQpLiBUZXN0aW5nIGZvciB0aGF0CitkdD1gYnVzeWJveCBkYXRlIC1kIDAxMjMxMTMzMjAwMC4zMCAlK2MgMj4mMSB8IGhlYWQgLW4gMWAKK3Rlc3QgeCIke2R0IyNCdXN5Qm94ICogbXVsdGktY2FsbCBiaW5hcnkqfSIgPSB4IiIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLWlmIGIvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkMWFmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLWlmCkBAIC0wLDAgKzEsMiBAQAorZWNobyBJIFdBTlQgPmZvbwordGVzdCAiJChidXN5Ym94IGRkIGlmPWZvbyAyPi9kZXYvbnVsbCkiID0gIkkgV0FOVCIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLW9mIGIvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtb2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MDVlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kZC9kZC1hY2NlcHRzLW9mCkBAIC0wLDAgKzEsMiBAQAorZWNobyBJIFdBTlQgfCBidXN5Ym94IGRkIG9mPWZvbyAyPi9kZXYvbnVsbAorZWNobyBJIFdBTlQgfCBjbXAgZm9vIC0KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kZC9kZC1jb3BpZXMtZnJvbS1zdGFuZGFyZC1pbnB1dC10by1zdGFuZGFyZC1vdXRwdXQgYi90ZXN0c3VpdGUvZGQvZGQtY29waWVzLWZyb20tc3RhbmRhcmQtaW5wdXQtdG8tc3RhbmRhcmQtb3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTBlYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGQvZGQtY29waWVzLWZyb20tc3RhbmRhcmQtaW5wdXQtdG8tc3RhbmRhcmQtb3V0cHV0CkBAIC0wLDAgKzEgQEAKK3Rlc3QgIiQoZWNobyBJIFdBTlQgfCBidXN5Ym94IGRkIDI+L2Rldi9udWxsKSIgPSAiSSBXQU5UIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RkL2RkLXByaW50cy1jb3VudC10by1zdGFuZGFyZC1lcnJvciBiL3Rlc3RzdWl0ZS9kZC9kZC1wcmludHMtY291bnQtdG8tc3RhbmRhcmQtZXJyb3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4N2RjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kZC9kZC1wcmludHMtY291bnQtdG8tc3RhbmRhcmQtZXJyb3IKQEAgLTAsMCArMSwyIEBACitlY2hvIEkgV0FOVCB8IGJ1c3lib3ggZGQgb2Y9Zm9vID4vZGV2L251bGwgMj5iYXIKK2dyZXAgLXEgcmVjb3JkcyBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kZC9kZC1yZXBvcnRzLXdyaXRlLWVycm9ycyBiL3Rlc3RzdWl0ZS9kZC9kZC1yZXBvcnRzLXdyaXRlLWVycm9ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIwNjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2RkL2RkLXJlcG9ydHMtd3JpdGUtZXJyb3JzCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBkZCBpZj0iJDAiIG9mPS9kZXYvZnVsbCAyPi9kZXYvbnVsbCB8fCBzdGF0dXM9JD8KK3Rlc3QgJHN0YXR1cyA9IDEKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaWZmLnRlc3RzIGIvdGVzdHN1aXRlL2RpZmYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmRlNDY0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaWZmLnRlc3RzCkBAIC0wLDAgKzEsMjE3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kcyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworIyBkaWZmIG91dHB1dHMgZGF0ZS90aW1lIGluIHRoZSBoZWFkZXIsIHdoaWNoIHNob3VsZCBub3QgYmUgYW5hbHlzZWQKKyMgTkI6IHNlZCBoYXMgdGFiIGNoYXJhY3RlciBpbiBzIGNvbW1hbmQhCitUUklNX1RBQj0ic2VkICdzLwkuKi8vJyIKKwordGVzdGluZyAiZGlmZiBvZiBzdGRpbiIgXAorCSJkaWZmIC11IC0gaW5wdXQgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gLQorKysrIGlucHV0CitAQCAtMSArMSwzIEBACisrcXdlCisgYXNkCisrenhjCisiIFwKKwkicXdlXG5hc2Rcbnp4Y1xuIiBcCisJImFzZFxuIgorCit0ZXN0aW5nICJkaWZmIG9mIHN0ZGluLCBubyBuZXdsaW5lIGluIHRoZSBmaWxlIiBcCisJImRpZmYgLXUgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICsxLDMgQEAKKytxd2UKKyBhc2QKKyt6eGMKK1xcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyIgXAorCSJxd2VcbmFzZFxuenhjIiBcCisJImFzZFxuIgorCisjIHdlIGFsc28gdGVzdCB0aGF0IHN0ZGluIGlzIGluIGZhY3QgTk9UIHJlYWQKK3Rlc3RpbmcgImRpZmYgb2Ygc3RkaW4sIHR3aWNlIiBcCisJJ2RpZmYgLSAtOyBlY2hvICQ/OyB3YyAtYycgXAorCSIwXG41XG4iIFwKKwkiIiBcCisJInN0ZGluIgorCit0ZXN0aW5nICJkaWZmIG9mIGVtcHR5IGZpbGUgYWdhaW5zdCBub25lbXB0eSBvbmUiIFwKKwkiZGlmZiAtdSAtIGlucHV0IHwgJFRSSU1fVEFCIiBcCisiXAorLS0tIC0KKysrKyBpbnB1dAorQEAgLTAsMCArMSBAQAorK2EKKyIgXAorCSJhXG4iIFwKKwkiIgorCit0ZXN0aW5nICJkaWZmIC1iIHRyZWF0cyBFT0YgYXMgd2hpdGVzcGFjZSIgXAorCSdkaWZmIC11YiAtIGlucHV0OyBlY2hvICQ/JyBcCisJIjBcbiIgXAorCSJhYmMiIFwKKwkiYWJjICIKKwordGVzdGluZyAiZGlmZiAtYiB0cmVhdHMgYWxsIHNwYWNlcyBhcyBlcXVhbCIgXAorCSdkaWZmIC11YiAtIGlucHV0OyBlY2hvICQ/JyBcCisJIjBcbiIgXAorCSJhIFx0IGNcbiIgXAorCSJhXHQgXHRjXG4iCisKK3Rlc3RpbmcgImRpZmYgLUIgaWdub3JlcyBjaGFuZ2VzIHdob3NlIGxpbmVzIGFyZSBhbGwgYmxhbmsiIFwKKwknZGlmZiAtdUIgLSBpbnB1dDsgZWNobyAkPycgXAorCSIwXG4iIFwKKwkiYVxuIiBcCisJIlxuYVxuXG4iCisKK3Rlc3RpbmcgImRpZmYgLUIgZG9lcyBub3QgaWdub3JlIGNoYW5nZXMgd2hvc2UgbGluZXMgYXJlIG5vdCBhbGwgYmxhbmsiIFwKKwkiZGlmZiAtdUIgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xLDMgKzEgQEAKKy0KKy1iCistCisrYQorIiBcCisJImFcbiIgXAorCSJcbmJcblxuIgorCit0ZXN0aW5nICJkaWZmIGFsd2F5cyB0YWtlcyBjb250ZXh0IGZyb20gb2xkIGZpbGUiIFwKKwkiZGlmZiAtdWIgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICsxLDMgQEAKKythYmMKKyBhIGMKKytkZWYKKyIgXAorCSJhYmNcbmEgIGNcbmRlZlxuIiBcCisJImEgY1xuIgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmRzIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCisjIGNsZWFuIHVwCitybSAtcmYgZGlmZjEgZGlmZjIKKworbWtkaXIgZGlmZjEgZGlmZjIgZGlmZjIvc3ViZGlyCitlY2hvIHF3ZSA+ZGlmZjEvLQorZWNobyBhc2QgPmRpZmYyL3N1YmRpci8tCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIGRpZmYxIGRpZmYyL3N1YmRpciIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorb3B0aW9uYWwgRkVBVFVSRV9ESUZGX0RJUgordGVzdGluZyAiZGlmZiBkaXIgZGlyMi9maWxlLy0iIFwKKwkiZGlmZiAtdXIgZGlmZjEgZGlmZjIvc3ViZGlyLy0gfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorbWtkaXIgZGlmZjEvdGVzdAorbWtmaWZvIGRpZmYyL3N1YmRpci90ZXN0CitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIG9mIGRpciBhbmQgZmlmbyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorT25seSBpbiBkaWZmMi9zdWJkaXI6IHRlc3QKKyIgXAorCSIiICIiCitTS0lQPQorCisjIHVzaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QuLi4KK3JtZGlyIGRpZmYxL3Rlc3QKK2VjaG8gPmRpZmYxL3Rlc3QKK29wdGlvbmFsIEZFQVRVUkVfRElGRl9ESVIKK3Rlc3RpbmcgImRpZmYgb2YgZmlsZSBhbmQgZmlmbyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorRmlsZSBkaWZmMi9zdWJkaXIvdGVzdCBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorbWtmaWZvIGRpZmYxL3Rlc3QyCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIC1yTiBkb2VzIG5vdCByZWFkIG5vbi1yZWd1bGFyIGZpbGVzIiBcCisJImRpZmYgLXVyTiBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorRmlsZSBkaWZmMi9zdWJkaXIvdGVzdCBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorRmlsZSBkaWZmMS90ZXN0MiBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY2xlYW4gdXAKK3JtIC1yZiBkaWZmMSBkaWZmMgorCisjIE5PVCB1c2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0Li4uCitta2RpciBkaWZmMSBkaWZmMgorZWNobyBxd2UgPmRpZmYxLy0KK2VjaG8gcnR5ID5kaWZmMi8tCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIGRpZmYxIGRpZmYyLyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi8gfCAkVFJJTV9UQUI7IGRpZmYgLXVyIC4vLy9kaWZmMSBkaWZmMi8vLy8gfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyLy0KK0BAIC0xICsxIEBACistcXdlCisrcnR5CistLS0gLi8vL2RpZmYxLy0KKysrKyBkaWZmMi8vLy8tCitAQCAtMSArMSBAQAorLXF3ZQorK3J0eQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY2xlYW4gdXAKK3JtIC1yZiBkaWZmMSBkaWZmMgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1hYnNvbHV0ZS1wYXRoIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLWFic29sdXRlLXBhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTUxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1hYnNvbHV0ZS1wYXRoCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgL2Zvby9iYXIvYmF6KSA9IC9mb28vYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtZW1wdHktcGF0aCBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1lbXB0eS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTM0YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtZW1wdHktcGF0aApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lICcnKSA9IC4KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1tdWx0aXBsZS1zbGFzaGVzIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLW11bHRpcGxlLXNsYXNoZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2ZjI1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1tdWx0aXBsZS1zbGFzaGVzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgZm9vL2Jhci8vL2JheikgPSBmb28vYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtcmVsYXRpdmUtcGF0aCBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yZWxhdGl2ZS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTRhYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtcmVsYXRpdmUtcGF0aApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lIGZvby9iYXIvYmF6KSA9IGZvby9iYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yb290IGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLXJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNjJiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yb290CkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgLykgPSAvCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtc2luZ2xlLWNvbXBvbmVudCBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1zaW5nbGUtY29tcG9uZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjlhZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtc2luZ2xlLWNvbXBvbmVudApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lIGZvbykgPSAuCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLXdvcmtzIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjczZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGRpcm5hbWUgJChwd2QpKSA9IHgkKGJ1c3lib3ggZGlybmFtZSAkKHB3ZCkpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZHUvZHUtaC13b3JrcyBiL3Rlc3RzdWl0ZS9kdS9kdS1oLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzdiNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZHUvZHUtaC13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKworZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUgYnM9MU0gY291bnQ9MSAyPi9kZXYvbnVsbAordGVzdCB4ImBidXN5Ym94IGR1IC1oIGZpbGVgIiA9IHgiMS4wTQlmaWxlIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2R1L2R1LWstd29ya3MgYi90ZXN0c3VpdGUvZHUvZHUtay13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjlhOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2R1L2R1LWstd29ya3MKQEAgLTAsMCArMSw2IEBACitta2RpciBkdS50ZXN0ZGlyCitjZCBkdS50ZXN0ZGlyCitkZCBpZj0vZGV2L3plcm8gb2Y9ZmlsZTEgYnM9MWsgY291bnQ9NjQgMj4vZGV2L251bGwKK2RkIGlmPS9kZXYvemVybyBvZj1maWxlMiBicz0xayBjb3VudD0xNiAyPi9kZXYvbnVsbAordGVzdCB4ImBidXN5Ym94IGR1IC1rIC5gIiA9IHgiODAJLiIgXAorICAtbyB4ImBidXN5Ym94IGR1IC1rIC5gIiA9IHgiODgJLiIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kdS9kdS1sLXdvcmtzIGIvdGVzdHN1aXRlL2R1L2R1LWwtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZWU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kdS9kdS1sLXdvcmtzCkBAIC0wLDAgKzEsMTEgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsKKworbWtkaXIgZHUudGVzdGRpcgorY2QgZHUudGVzdGRpcgorZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUxIGJzPTFrIGNvdW50PTY0IDI+L2Rldi9udWxsCitsbiBmaWxlMSBmaWxlMS4xCitkZCBpZj0vZGV2L3plcm8gb2Y9ZmlsZTIgYnM9MWsgY291bnQ9MTYgMj4vZGV2L251bGwKK3Rlc3QgeCJgYnVzeWJveCBkdSAtbCAuYCIgPSB4IjE0NAkuIiBcCisgIC1vIHgiYGJ1c3lib3ggZHUgLWwgLmAiID0geCIxNDgJLiIgXAorICAtbyB4ImBidXN5Ym94IGR1IC1sIC5gIiA9IHgiMTUyCS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtbCAuYCIgPSB4IjE1NgkuIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2R1L2R1LW0td29ya3MgYi90ZXN0c3VpdGUvZHUvZHUtbS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE3NDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2R1L2R1LW0td29ya3MKQEAgLTAsMCArMSw0IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisKK2RkIGlmPS9kZXYvemVybyBvZj1maWxlIGJzPTFNIGNvdW50PTEgMj4vZGV2L251bGwKK3Rlc3QgeCJgYnVzeWJveCBkdSAtbSAuYCIgPSB4IjEJLiIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kdS9kdS1zLXdvcmtzIGIvdGVzdHN1aXRlL2R1L2R1LXMtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0NDMyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kdS9kdS1zLXdvcmtzCkBAIC0wLDAgKzEsOCBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSworCitkPS9iaW4KK2R1IC1zICIkZCIgPiBsb2dmaWxlLmdudQorYnVzeWJveCBkdSAtcyAiJGQiID4gbG9nZmlsZS5iYgorY21wIGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIgJiYgZXhpdCAwCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2R1L2R1LXdvcmtzIGIvdGVzdHN1aXRlL2R1L2R1LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjBmMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZHUvZHUtd29ya3MKQEAgLTAsMCArMSw4IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisKK2Q9L2JpbgorZHUgIiRkIiA+IGxvZ2ZpbGUuZ251CitidXN5Ym94IGR1ICIkZCIgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYiAmJiBleGl0IDAKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgorZXhpdCAxCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLWRvZXMtbm90LXByaW50LW5ld2xpbmUgYi90ZXN0c3VpdGUvZWNoby9lY2hvLWRvZXMtbm90LXByaW50LW5ld2xpbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1N2MwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tZG9lcy1ub3QtcHJpbnQtbmV3bGluZQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0IGBidXN5Ym94IGVjaG8gLW4gd29yZCB8IHdjIC1jYCAtZXEgNApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnQgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1hcmd1bWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzlkYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnQKQEAgLTAsMCArMSBAQAordGVzdCB4ZnViYXIgPSB4YGJ1c3lib3ggZWNobyBmdWJhcmAKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLWFyZ3VtZW50cyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLWFyZ3VtZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTRlM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnRzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgImBidXN5Ym94IGVjaG8gZm9vIGJhcmAiID0gImZvbyBiYXIiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1kYXNoIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtZGFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNkYmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtZGFzaApAQCAtMCwwICsxIEBACit0ZXN0ICJgYnVzeWJveCBlY2hvIC0gfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMmQgMGEiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1uZXdsaW5lIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbmV3bGluZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg2NzFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbmV3bGluZQpAQCAtMCwwICsxIEBACit0ZXN0IGBidXN5Ym94IGVjaG8gd29yZCB8IHdjIC1jYCAtZXEgNQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbm9uLW9wdHMgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1ub24tb3B0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QxZTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtbm9uLW9wdHMKQEAgLTAsMCArMSBAQAordGVzdCAiYGJ1c3lib3ggZWNobyAtbmVFWiB8IG9kIC10IHgxIHwgaGVhZCAtbiAxYCIgPSAiMDAwMDAwMCAyZCA2ZSA2NSA0NSA1YSAwYSIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoLXplcm8gYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaC16ZXJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5N2VkOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaC16ZXJvCkBAIC0wLDAgKzEsMyBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPCisKK3Rlc3QgImBidXN5Ym94IGVjaG8gLWUgLW4gJ21zZ1xuXDAnIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDZkIDczIDY3IDBhIDAwIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDAwNDEgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wMDA0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ZmYWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDAwNDEKQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtbmUgJ1wwMDA0MXonIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDA0IDMxIDdhIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDA0MSBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzAwNDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NDI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzAwNDEKQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtbmUgJ1wwMDQxeicgfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMjEgN2EiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wNDEgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wNDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3MGNlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzA0MQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0ICJgYnVzeWJveCBlY2hvIC1uZSAnXDA0MXonIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDIxIDdhIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfNDEgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF80MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg5OTliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfNDEKQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtbmUgJ1w0MXonIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDIxIDdhIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2V4cGFuZC50ZXN0cyBiL3Rlc3RzdWl0ZS9leHBhbmQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDY4MmMyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9leHBhbmQudGVzdHMKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJleHBhbmQiIFwKKwkiZXhwYW5kIiBcCisJIiAgICAgICAgMTIzNDU2NzggICAgICAgIDEyMzQ1Njc4XG4iIFwKKwkiIiBcCisJIlx0MTIzNDU2NzhcdDEyMzQ1Njc4XG4iCisKK3Rlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIiAhPSB4InkiIFwKKyYmIHRlc3RpbmcgImV4cGFuZCB3aXRoIHVuaWNvZGUgY2hhcmFjaGVyIDB4Mzk0IiBcCisJImV4cGFuZCIgXAorCSLOlCAgICAgICAxMjM0Nc6UzpTOlCAgICAgICAgMTIzNDU2NzhcbiIgXAorCSIiIFwKKwkizpRcdDEyMzQ1zpTOlM6UXHQxMjM0NTY3OFxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9leHBhbmQvZXhwYW5kLXdvcmtzLWxpa2UtR05VIGIvdGVzdHN1aXRlL2V4cGFuZC9leHBhbmQtd29ya3MtbGlrZS1HTlUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyNzhkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9leHBhbmQvZXhwYW5kLXdvcmtzLWxpa2UtR05VCkBAIC0wLDAgKzEsMjAgQEAKKyMgRkVBVFVSRTogQ09ORklHX1VORVhQQU5ECisKK3JtIC1mIGZvbyBiYXIKKyRFQ0hPIC1lICJcdHkiIHwgZXhwYW5kIC10IDMgLi4vLi4vYnVzeWJveCA+IGZvbworJEVDSE8gLWUgIlx0eSIgfCBidXN5Ym94IHVuZXhwYW5kIC10IDMgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitybSAtZiBmb28gYmFyCiskRUNITyAtZSAiXHR5XHR4IiB8IGV4cGFuZCAtaXQgMyAuLi8uLi9idXN5Ym94ID4gZm9vCiskRUNITyAtZSAiXHR5XHR4IiB8IGJ1c3lib3ggdW5leHBhbmQgLWl0IDMgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZXhwci9leHByLWJpZyBiL3Rlc3RzdWl0ZS9leHByL2V4cHItYmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGJiYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZXhwci9leHByLWJpZwpAQCAtMCwwICsxLDE2IEBACisjIGJ1c3lib3ggZXhwcgorCisjIDMqMTAwMCoxMDAwKjEwMDAgb3ZlcmZsb3dzIDMyLWJpdCBzaWduZWQgaW50CityZXM9YGJ1c3lib3ggZXhwciAwICc8JyAzMDAwMDAwMDAwYAorWyB4IiRyZXMiID0geDEgXSB8fCBleGl0IDEKKworIyA5MjIzMzcyMDM2ODU0Nzc1ODA3ID0gMl4zMS0xCityZXM9YGJ1c3lib3ggZXhwciAwICc8JyA5MjIzMzcyMDM2ODU0Nzc1ODA3YAorWyB4IiRyZXMiID0geDEgXSB8fCBleGl0IDEKKyMgY29yZXV0aWxzIGZhaWxzIHRoaXMgb25lIQorcmVzPWBidXN5Ym94IGV4cHIgLTkyMjMzNzIwMzY4NTQ3NzU4MDAgJzwnIDkyMjMzNzIwMzY4NTQ3NzU4MDdgCitbIHgiJHJlcyIgPSB4MSBdIHx8IGV4aXQgMQorCisjIFRoaXMgb25lIHdvcmtzIG9ubHkgYnkgY2hhbmNlCisjIHJlcz1gYnVzeWJveCBleHByIDAgJzwnIDkyMjMzNzIwMzY4NTQ3NzU4MDhgCisjIFsgeCIkcmVzIiA9IHgxIF0gfHwgZXhpdCAxCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZXhwci9leHByLXdvcmtzIGIvdGVzdHN1aXRlL2V4cHIvZXhwci13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBmZmZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2V4cHIvZXhwci13b3JrcwpAQCAtMCwwICsxLDU4IEBACisjIGJ1c3lib3ggZXhwcgorYnVzeWJveCBleHByIDEgXHwgMQorYnVzeWJveCBleHByIDEgXHwgMAorYnVzeWJveCBleHByIDAgXHwgMQorYnVzeWJveCBleHByIDEgXCYgMQorYnVzeWJveCBleHByIDAgXDwgMQorYnVzeWJveCBleHByIDEgXD4gMAorYnVzeWJveCBleHByIDAgXDw9IDEKK2J1c3lib3ggZXhwciAxIFw8PSAxCitidXN5Ym94IGV4cHIgMSBcPj0gMAorYnVzeWJveCBleHByIDEgXD49IDEKK2J1c3lib3ggZXhwciAxICsgMgorYnVzeWJveCBleHByIDIgLSAxCitidXN5Ym94IGV4cHIgMiBcKiAzCitidXN5Ym94IGV4cHIgMTIgLyAyCitidXN5Ym94IGV4cHIgMTIgJSA1CisKKworc2V0ICtlCitidXN5Ym94IGV4cHIgMCBcfCAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDEgXCYgMAoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFwmIDEKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOworCitidXN5Ym94IGV4cHIgMCBcJiAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDEgXDwgMAoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFw+IDEKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOworCitidXN5Ym94IGV4cHIgMSBcPD0gMAoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFw+PSAxCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1pcy1zaWxlbnQgYi90ZXN0c3VpdGUvZmFsc2UvZmFsc2UtaXMtc2lsZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWFhMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZmFsc2UvZmFsc2UtaXMtc2lsZW50CkBAIC0wLDAgKzEgQEAKK2J1c3lib3ggZmFsc2UgMj4mMSB8IGNtcCAtIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2ZhbHNlL2ZhbHNlLXJldHVybnMtZmFpbHVyZSBiL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1yZXR1cm5zLWZhaWx1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNjFmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1yZXR1cm5zLWZhaWx1cmUKQEAgLTAsMCArMSBAQAorISBidXN5Ym94IGZhbHNlCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZmluZC9maW5kLXN1cHBvcnRzLW1pbnVzLXhkZXYgYi90ZXN0c3VpdGUvZmluZC9maW5kLXN1cHBvcnRzLW1pbnVzLXhkZXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwN2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9maW5kL2ZpbmQtc3VwcG9ydHMtbWludXMteGRldgpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRklORF9YREVWCisKK2J1c3lib3ggZmluZCAuIC14ZGV2ID4vZGV2L251bGwgMj4mMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2ZvbGQudGVzdHMgYi90ZXN0c3VpdGUvZm9sZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lY2Y4YjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2ZvbGQudGVzdHMKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA5IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJmb2xkIC1zIiAiZm9sZCAtdyA3IC1zIiBcCisgICAgICAgICIxMjM0NTZcblx0XG5hc2RmIiBcCisgICAgICAgICIiIFwKKyAgICAgICAgIjEyMzQ1Nlx0YXNkZiIgXAorCit0ZXN0aW5nICJmb2xkIC13MSIgImZvbGQgLXcxIiBcCisJInFcbnFcbiBcbndcbiBcbmVcbmVcbmVcbiBcbnJcbiBcbnRcbnRcbnRcbnRcbiBcbnkiIFwKKwkiIiBcCisJInFxIHcgZWVlIHIgdHR0dCB5IiBcCisKK3Rlc3RpbmcgImZvbGQgd2l0aCBOVUxzIiAiZm9sZCAtc3cyMiIgXAorCSJcCitUaGUgTlVMIGlzIGhlcmU6PlwwPCBcblwKK2FuZCBhbm90aGVyIG9uZSBpcyBcblwKK2hlcmU6PlwwPCAtIHRoZXkgbXVzdCBcblwKK2JlIHByZXNlcnZlZAorIiBcCisJIiIgXAorCSJUaGUgTlVMIGlzIGhlcmU6PlwwPCBhbmQgYW5vdGhlciBvbmUgXAoraXMgaGVyZTo+XDA8IC0gdGhleSBtdXN0IGJlIHByZXNlcnZlZAorIiBcCisKKyMgVGhlIHRleHQgd2FzIHRha2VuIGZyb20gRW5nbGlzaCBhbmQgVWtyYWluaWFuIHdpa2lwZWRpYSBwYWdlcwordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdGluZyAiZm9sZCAtc3c2NiB3aXRoIHVuaWNvZGUgaW5wdXQiICJmb2xkIC1zdzY2IiBcCisJIlwKK1RoZSBBbmRyb21lZGEgR2FsYXh5IChwcm9ub3VuY2VkIC/Dpm7LiGRyyZJtyZlkyZkvLCBhbHNvIGtub3duIGFzIFxuXAorTWVzc2llciAzMSwgTTMxLCBvciBOR0MyMjQ7IG9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBHcmVhdCBcblwKK0FuZHJvbWVkYSBOZWJ1bGEgaW4gb2xkZXIgdGV4dHMpIGlzIGEgc3BpcmFsIGdhbGF4eSBhcHByb3hpbWF0ZWx5IFxuXAorMiw1MDAsMDAwIGxpZ2h0LXllYXJzICgxLjU4w5cxMF4xMSBBVSkgYXdheSBpbiB0aGUgY29uc3RlbGxhdGlvbiBcblwKK0FuZHJvbWVkYS4gSXQgaXMgdGhlIG5lYXJlc3Qgc3BpcmFsIGdhbGF4eSB0byBvdXIgb3duLCB0aGUgTWlsa3kgXG5cCitXYXkuXG5cCivQk9Cw0LvQsNC60YLQuNC60LAg0LDQsdC+INCi0YPQvNCw0L3QvdGW0YHRgtGMINCQ0L3QtNGA0L7QvNC10LTQuCAo0YLQsNC60L7QtiDQstGW0LTQvtC80LAg0Y/QuiBNMzEg0LfQsCBcblwKK9C60LDRgtCw0LvQvtCz0L7QvCDQnNC10YHRgdGM0ZQg0YLQsCBOR0MyMjQg0LfQsCDQndC+0LLQuNC8INC30LDQs9Cw0LvRjNC90LjQvCDQutCw0YLQsNC70L7Qs9C+0LwpIOKAlCBcblwKK9GB0L/RltGA0LDQu9GM0L3QsCDQs9Cw0LvQsNC60YLQuNC60LAsINGJ0L4g0LfQvdCw0YXQvtC00LjRgtGM0YHRjyDQvdCwINCy0ZbQtNGB0YLQsNC90ZYg0L/RgNC40LHQu9C40LfQvdC+INGDIDIsNSBcblwKK9C80ZbQu9GM0LnQvtC90Lgg0YHQstGW0YLQu9C+0LLQuNGFINGA0L7QutGW0LIg0LLRltC0INC90LDRiNC+0Zcg0L/Qu9Cw0L3QtdGC0Lgg0YMg0YHRg9C30ZbRgCfRlyDQkNC90LTRgNC+0LzQtdC00LguIFxuXAor0J3QsCDQv9C+0YfQsNGC0LrRgyDQpdCl0IYg0YHRgi4g0LIg0YbQtdC90YLRgNGWINCz0LDQu9Cw0LrRgtC40LrQuCDQstC40Y/QstC70LXQvdC+INGH0L7RgNC90YMg0LTRltGA0LrRgy4iIFwKKwkiIiBcCisJIlwKK1RoZSBBbmRyb21lZGEgR2FsYXh5IChwcm9ub3VuY2VkIC/Dpm7LiGRyyZJtyZlkyZkvLCBhbHNvIGtub3duIGFzIFwKK01lc3NpZXIgMzEsIE0zMSwgb3IgTkdDMjI0OyBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgR3JlYXQgXAorQW5kcm9tZWRhIE5lYnVsYSBpbiBvbGRlciB0ZXh0cykgaXMgYSBzcGlyYWwgZ2FsYXh5IGFwcHJveGltYXRlbHkgXAorMiw1MDAsMDAwIGxpZ2h0LXllYXJzICgxLjU4w5cxMF4xMSBBVSkgYXdheSBpbiB0aGUgY29uc3RlbGxhdGlvbiBcCitBbmRyb21lZGEuIEl0IGlzIHRoZSBuZWFyZXN0IHNwaXJhbCBnYWxheHkgdG8gb3VyIG93biwgdGhlIE1pbGt5IFwKK1dheS4KK9CT0LDQu9Cw0LrRgtC40LrQsCDQsNCx0L4g0KLRg9C80LDQvdC90ZbRgdGC0Ywg0JDQvdC00YDQvtC80LXQtNC4ICjRgtCw0LrQvtC2INCy0ZbQtNC+0LzQsCDRj9C6IE0zMSDQt9CwIFwKK9C60LDRgtCw0LvQvtCz0L7QvCDQnNC10YHRgdGM0ZQg0YLQsCBOR0MyMjQg0LfQsCDQndC+0LLQuNC8INC30LDQs9Cw0LvRjNC90LjQvCDQutCw0YLQsNC70L7Qs9C+0LwpIOKAlCBcCivRgdC/0ZbRgNCw0LvRjNC90LAg0LPQsNC70LDQutGC0LjQutCwLCDRidC+INC30L3QsNGF0L7QtNC40YLRjNGB0Y8g0L3QsCDQstGW0LTRgdGC0LDQvdGWINC/0YDQuNCx0LvQuNC30L3QviDRgyAyLDUgXAor0LzRltC70YzQudC+0L3QuCDRgdCy0ZbRgtC70L7QstC40YUg0YDQvtC60ZbQsiDQstGW0LQg0L3QsNGI0L7RlyDQv9C70LDQvdC10YLQuCDRgyDRgdGD0LfRltGAJ9GXINCQ0L3QtNGA0L7QvNC10LTQuC4gXAor0J3QsCDQv9C+0YfQsNGC0LrRgyDQpdCl0IYg0YHRgi4g0LIg0YbQtdC90YLRgNGWINCz0LDQu9Cw0LrRgtC40LrQuCDQstC40Y/QstC70LXQvdC+INGH0L7RgNC90YMg0LTRltGA0LrRgy4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2dyZXAudGVzdHMgYi90ZXN0c3VpdGUvZ3JlcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZmNlMDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2dyZXAudGVzdHMKQEAgLTAsMCArMSwxMDYgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6CisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3QgZXhpdCBzdGF0dXMKKwordGVzdGluZyAiZ3JlcCAoZXhpdCB3aXRoIGVycm9yKSIgImdyZXAgbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIDsgZWNobyBcJD8iIFwKKwkiMVxuIiAiIiAiIgordGVzdGluZyAiZ3JlcCAoZXhpdCBzdWNjZXNzKSIgImdyZXAgZ3JlcCAkMCA+IC9kZXYvbnVsbCAyPiYxIDsgZWNobyBcJD8iICIwXG4iIFwKKwkiIiAiIgorIyBUZXN0IHZhcmlvdXMgZGF0YSBzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbnMKKwordGVzdGluZyAiZ3JlcCAoZGVmYXVsdCB0byBzdGRpbikiICJncmVwIHR3byIgInR3b1xuIiAiIiBcCisJIm9uZVxudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJncmVwIC0gKHNwZWNpZnkgc3RkaW4pIiAiZ3JlcCB0d28gLSIgInR3b1xuIiAiIiBcCisJIm9uZVxudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJncmVwIGlucHV0IChzcGVjaWZ5IGZpbGUpIiAiZ3JlcCB0d28gaW5wdXQiICJ0d29cbiIgXAorCSJvbmVcbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIiAiIgorCisjIEdOVSBncmVwIDIuNS4zIG91dHB1dHMgYSBuZXcgbGluZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxvY2F0ZWQgc3RyaW5nCisjIGV2ZW4gaWYgdGhlcmUgaXMgbm8gbmV3IGxpbmUgY2hhcmFjdGVyIGluIHRoZSBpbnB1dAordGVzdGluZyAiZ3JlcCAobm8gbmV3bGluZSBhdCBFT0wpIiAiZ3JlcCBidWcgaW5wdXQiICJidWdcbiIgImJ1ZyIgIiIKKworPmVtcHR5Cit0ZXN0aW5nICJncmVwIHR3byBmaWxlcyIgImdyZXAgdHdvIGlucHV0IGVtcHR5IDI+L2Rldi9udWxsIiBcCisJImlucHV0OnR3b1xuIiAib25lXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKK3JtIGVtcHR5CisKK3Rlc3RpbmcgImdyZXAgLSBpbmZpbGUgKHNwZWNpZnkgc3RkaW4gYW5kIGZpbGUpIiAiZ3JlcCB0d28gLSBpbnB1dCIgXAorCSIoc3RhbmRhcmQgaW5wdXQpOnR3b1xuaW5wdXQ6dHdvXG4iICJvbmVcbnR3b1xudGhyZWVcbiIgXAorCSJvbmVcbnR3b1xudG9vXG50aHJlZVxudGhyZWVcbiIKKworIyBDaGVjayBpZiB3ZSBzZWUgdGhlIGNvcnJlY3QgcmV0dXJuIHZhbHVlIGlmIGJvdGggc3RkaW4gYW5kIG5vbi1leGlzdGluZyBmaWxlCisjIGFyZSBnaXZlbi4KK3Rlc3RpbmcgImdyZXAgLSBub2ZpbGUgKHNwZWNpZnkgc3RkaW4gYW5kIG5vbmV4aXN0aW5nIGZpbGUpIiBcCisJImdyZXAgdHdvIC0gbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIDsgZWNobyBcJD8iIFwKKwkiKHN0YW5kYXJkIGlucHV0KTp0d29cbihzdGFuZGFyZCBpbnB1dCk6dHdvXG4yXG4iIFwKKwkiIiAib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAiZ3JlcCAtcSAtIG5vZmlsZSAoc3BlY2lmeSBzdGRpbiBhbmQgbm9uZXhpc3RpbmcgZmlsZSwgbm8gbWF0Y2gpIiBcCisJImdyZXAgLXEgbm9tYXRjaCAtIG5vbmV4aXN0ZW50IDI+IC9kZXYvbnVsbCA7IGVjaG8gXCQ/IiBcCisJIjJcbiIgIiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKKyMgU1VTdjM6IElmIHRoZSAtcSBvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGUgZXhpdCBzdGF0dXMgc2hhbGwgYmUgemVybworIyAgICAgICAgaWYgYW4gaW5wdXQgbGluZSBpcyBzZWxlY3RlZCwgZXZlbiBpZiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQuCit0ZXN0aW5nICJncmVwIC1xIC0gbm9maWxlIChzcGVjaWZ5IHN0ZGluIGFuZCBub25leGlzdGluZyBmaWxlLCBtYXRjaCkiIFwKKwkiZ3JlcCAtcSB0d28gLSBub25leGlzdGVudCA7IGVjaG8gXCQ/IiBcCisJIjBcbiIgIiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKKworIyBUZXN0IHZhcmlvdXMgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyMgLXMgbm8gZXJyb3IgbWVzc2FnZXMKK3Rlc3RpbmcgImdyZXAgLXMgbm9maWxlIChub25leGlzdGluZyBmaWxlLCBubyBtYXRjaCkiIFwKKwkiZ3JlcCAtcyBub21hdGNoIG5vbmV4aXN0ZW50IDsgZWNobyBcJD8iICIyXG4iICIiICIiCit0ZXN0aW5nICJncmVwIC1zIG5vZmlsZSAtIChzdGRpbiBhbmQgbm9uZXhpc3RpbmcgZmlsZSwgbWF0Y2gpIiBcCisJImdyZXAgLXMgZG9tYXRjaCBub25leGlzdGVudCAtIDsgZWNobyBcJD8iIFwKKwkiKHN0YW5kYXJkIGlucHV0KTpkb21hdGNoXG4yXG4iICIiICJub21hdGNoXG5kb21hdGNoXG5lbmRcbiIKKworb3B0aW9uYWwgRVhUUkFfQ09NUEFUCit0ZXN0aW5nICJncmVwIGhhbmRsZXMgTlVMIGluIGZpbGVzIiAiZ3JlcCAtYSBmb28gaW5wdXQiICJcMGZvb1xuIiAiXDBmb29cblxuIiAiIgordGVzdGluZyAiZ3JlcCBoYW5kbGVzIE5VTCBvbiBzdGRpbiIgImdyZXAgLWEgZm9vIiAiXDBmb29cbiIgIiIgIlwwZm9vXG5cbiIKKwordGVzdGluZyAiZ3JlcCBtYXRjaGVzIE5VTCIgImdyZXAgLiBpbnB1dCA+IC9kZXYvbnVsbCAyPiYxIDsgZWNobyBcJD8iIFwKKwkiMFxuIiAiXDBcbiIgIiIKK1NLSVA9CisKKyMgLWUgcmVnZXgKK3Rlc3RpbmcgImdyZXAgaGFuZGxlcyBtdWx0aXBsZSByZWdleHBzIiAiZ3JlcCAtZSBvbmUgLWUgdHdvIGlucHV0IDsgZWNobyBcJD8iIFwKKwkib25lXG50d29cbjBcbiIgIm9uZVxudHdvXG4iICIiCit0ZXN0aW5nICJncmVwIC1GIGhhbmRsZXMgbXVsdGlwbGUgZXhwZXNzaW9ucyIgImdyZXAgLUYgLWUgb25lIC1lIHR3byBpbnB1dCA7IGVjaG8gXCQ/IiBcCisJIm9uZVxudHdvXG4wXG4iICJvbmVcbnR3b1xuIiAiIgordGVzdGluZyAiZ3JlcCAtRiBoYW5kbGVzIC1pIiAiZ3JlcCAtRiAtaSBmb28gaW5wdXQgOyBlY2hvIFwkPyIgXAorCSJGT09cbjBcbiIgIkZPT1xuIiAiIgorCisjIC1mIGZpbGUvLQordGVzdGluZyAiZ3JlcCBjYW4gcmVhZCByZWdleHBzIGZyb20gc3RkaW4iICJncmVwIC1mIC0gaW5wdXQgOyBlY2hvIFwkPyIgXAorCSJ0d29cbnRocmVlXG4wXG4iICJ0d1xudHdvXG50aHJlZVxuIiAidHcuXG50aHJcbiIKKworb3B0aW9uYWwgRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTCit0ZXN0aW5nICJncmVwIC1FIHN1cHBvcnRzIGV4dGVuZGVkIHJlZ2V4cHMiICJncmVwIC1FIGZvKyIgImZvb1xuIiAiIiBcCisJImJcYXJcbmZvb1xuYmF6IgordGVzdGluZyAiZ3JlcCBpcyBhbHNvIGVncmVwIiAiZWdyZXAgZm9vIiAiZm9vXG4iICIiICJmb29cbmJhclxuIgordGVzdGluZyAiZWdyZXAgaXMgbm90IGNhc2UgaW5zZW5zaXRpdmUiIFwKKwkiZWdyZXAgZm9vIDsgWyBcJD8gLW5lIDAgXSAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiRk9PXG4iCit0ZXN0aW5nICJncmVwIC1FIC1vIHByaW50cyBhbGwgbWF0Y2hlcyIgXAorCSJncmVwIC1FIC1vICcoW1s6eGRpZ2l0Ol1dezJ9WzotXSl7NX1bWzp4ZGlnaXQ6XV17Mn0nIiBcCisJIjAwOjE5OjNFOjAwOkFBOjVFXG4wMDoxRDo2MDozRDozQTpGQlxuMDA6MjI6NDM6NDk6RkI6QUFcbiIgXAorCSIiICIwMDoxOTozRTowMDpBQTo1RSAwMDoxRDo2MDozRDozQTpGQiAwMDoyMjo0Mzo0OTpGQjpBQVxuIgorU0tJUD0KKwordGVzdGluZyAiZ3JlcCAtbyBkb2VzIG5vdCBsb29wIGZvcmV2ZXIiIFwKKwknZ3JlcCAtbyAiW14vXSokIicgXAorCSJ0ZXN0XG4iIFwKKwkiIiAiL3Zhci90ZXN0XG4iCit0ZXN0aW5nICJncmVwIC1vIGRvZXMgbm90IGxvb3AgZm9yZXZlciBvbiB6ZXJvLWxlbmd0aCBtYXRjaCIgXAorCSdncmVwIC1vICIiIHwgaGVhZCAtbjEnIFwKKwkiIiBcCisJIiIgInRlc3RcbiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZ3VuemlwLnRlc3RzIGIvdGVzdHN1aXRlL2d1bnppcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGMwNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2d1bnppcC50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vYnVuemlwMi50ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2d1bnppcC9ndW56aXAtcmVhZHMtZnJvbS1zdGFuZGFyZC1pbnB1dCBiL3Rlc3RzdWl0ZS9ndW56aXAvZ3VuemlwLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0OThjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ndW56aXAvZ3VuemlwLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKQEAgLTAsMCArMSwyIEBACitlY2hvIGZvbyB8IGd6aXAgfCBidXN5Ym94IGd1bnppcCA+IG91dHB1dAorZWNobyBmb28gfCBjbXAgLSBvdXRwdXQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1tdWx0aXBsZS1maWxlcyBiL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1tdWx0aXBsZS1maWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBkOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2d6aXAvZ3ppcC1hY2NlcHRzLW11bHRpcGxlLWZpbGVzCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggZm9vIGJhcgorYnVzeWJveCBnemlwIGZvbyBiYXIKK3Rlc3QgLWYgZm9vLmd6IC1hIC1mIGJhci5negpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2d6aXAvZ3ppcC1hY2NlcHRzLXNpbmdsZS1taW51cyBiL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1zaW5nbGUtbWludXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MWZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1zaW5nbGUtbWludXMKQEAgLTAsMCArMSBAQAorZWNobyBmb28gfCBidXN5Ym94IGd6aXAgLSA+L2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZ3ppcC9nemlwLXJlbW92ZXMtb3JpZ2luYWwtZmlsZSBiL3Rlc3RzdWl0ZS9nemlwL2d6aXAtcmVtb3Zlcy1vcmlnaW5hbC1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Y2I5OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZ3ppcC9nemlwLXJlbW92ZXMtb3JpZ2luYWwtZmlsZQpAQCAtMCwwICsxLDMgQEAKK3RvdWNoIGZvbworYnVzeWJveCBnemlwIGZvbwordGVzdCAhIC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2hlYWQvaGVhZC1uLXdvcmtzIGIvdGVzdHN1aXRlL2hlYWQvaGVhZC1uLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDMyNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaGVhZC9oZWFkLW4td29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitoZWFkIC1uIDIgIiRkL1JFQURNRSIgPiBsb2dmaWxlLmdudQorYnVzeWJveCBoZWFkIC1uIDIgIiRkL1JFQURNRSIgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2hlYWQvaGVhZC13b3JrcyBiL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZDNlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtd29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitoZWFkICIkZC9SRUFETUUiID4gbG9nZmlsZS5nbnUKK2J1c3lib3ggaGVhZCAiJGQvUkVBRE1FIiA+IGxvZ2ZpbGUuYmIKK2NtcCBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaG9zdGlkL2hvc3RpZC13b3JrcyBiL3Rlc3RzdWl0ZS9ob3N0aWQvaG9zdGlkLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmQ3MTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaG9zdGlkL2hvc3RpZC13b3JrcwpAQCAtMCwwICsxLDggQEAKK2g9eCQoYnVzeWJveCBob3N0aWQpCisjIElzICRoIGEgc2VxdWVuY2Ugb2YgaGV4IG51bWJlcnM/Cit4PSIke2gvL1swMTIzNDU2Nzg5YWJjZGVmXS94fSIKK3g9IiR7eC8veHh4L3h9IgoreD0iJHt4Ly94eHgveH0iCit4PSIke3gvL3h4eC94fSIKK3g9IiR7eC8veHgveH0iCit0ZXN0IHgiJHgiID0geCJ4IgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWQtd29ya3MgYi90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtZC13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGMwYWFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWQtd29ya3MKQEAgLTAsMCArMSwzIEBACitmPSQoYnVzeWJveCBob3N0bmFtZSAtZikuCitkPSQoYnVzeWJveCBob3N0bmFtZSAtZCkKK3Rlc3QgeCIke2YjKi59IiA9IHgiJGQke2Q6Ky59IgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWktd29ya3MgYi90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtaS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjk5YmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLWktd29ya3MKQEAgLTAsMCArMSw5IEBACit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgIT0geCIiICYmIGV4aXQKKworIyBPYnNlcnZlZCBidWc6CisjICMgLi9idXN5Ym94IGhvc3RuYW1lIC1pCisjIDEyNy4wLjAuMQorIyAjIGhvc3RuYW1lIC1pCisjIDEyNy4wLjAuMSAxMC4wLjAuMiAxMC4zMi4xMC40NQorCit0ZXN0IHgkKGhvc3RuYW1lIC1pKSA9IHgkKGJ1c3lib3ggaG9zdG5hbWUgLWkpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtcy13b3JrcyBiL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS1zLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmI5NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtcy13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGhvc3RuYW1lIC1zKSA9IHgkKGJ1c3lib3ggaG9zdG5hbWUgLXMpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtd29ya3MgYi90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxYTQwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGhvc3RuYW1lKSA9IHgkKGJ1c3lib3ggaG9zdG5hbWUpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaWQvaWQtZy13b3JrcyBiL3Rlc3RzdWl0ZS9pZC9pZC1nLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWZjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaWQvaWQtZy13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGlkIC1nKSA9IHgkKGJ1c3lib3ggaWQgLWcpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaWQvaWQtdS13b3JrcyBiL3Rlc3RzdWl0ZS9pZC9pZC11LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNThjYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaWQvaWQtdS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGlkIC11KSA9IHgkKGJ1c3lib3ggaWQgLXUpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaWQvaWQtdW4td29ya3MgYi90ZXN0c3VpdGUvaWQvaWQtdW4td29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzOTBlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9pZC9pZC11bi13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGlkIC11bikgPSB4JChidXN5Ym94IGlkIC11bikKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9pZC9pZC11ci13b3JrcyBiL3Rlc3RzdWl0ZS9pZC9pZC11ci13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBmY2IwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2lkL2lkLXVyLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaWQgLXVyKSA9IHgkKGJ1c3lib3ggaWQgLXVyKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtaGFyZC1saW5rcyBiL3Rlc3RzdWl0ZS9sbi9sbi1jcmVhdGVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZTIzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9sbi9sbi1jcmVhdGVzLWhhcmQtbGlua3MKQEAgLTAsMCArMSw0IEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitidXN5Ym94IGxuIGZpbGUxIGxpbmsxCit0ZXN0IC1mIGZpbGUxCit0ZXN0IC1mIGxpbmsxCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbG4vbG4tY3JlYXRlcy1zb2Z0LWxpbmtzIGIvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtc29mdC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtc29mdC1saW5rcwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gZmlsZSBudW1iZXIgb25lID4gZmlsZTEKK2J1c3lib3ggbG4gLXMgZmlsZTEgbGluazEKK3Rlc3QgLUwgbGluazEKK3Rlc3QgeGZpbGUxID0geGByZWFkbGluayBsaW5rMWAKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLWhhcmQtbGlua3MgYi90ZXN0c3VpdGUvbG4vbG4tZm9yY2UtY3JlYXRlcy1oYXJkLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NmI3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbG4vbG4tZm9yY2UtY3JlYXRlcy1oYXJkLWxpbmtzCkBAIC0wLDAgKzEsNSBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBsaW5rMQorYnVzeWJveCBsbiAtZiBmaWxlMSBsaW5rMQordGVzdCAtZiBmaWxlMQordGVzdCAtZiBsaW5rMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xuL2xuLWZvcmNlLWNyZWF0ZXMtc29mdC1saW5rcyBiL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLXNvZnQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiOGQxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLXNvZnQtbGlua3MKQEAgLTAsMCArMSw1IEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGxpbmsxCitidXN5Ym94IGxuIC1mIC1zIGZpbGUxIGxpbmsxCit0ZXN0IC1MIGxpbmsxCit0ZXN0IHhmaWxlMSA9IHhgcmVhZGxpbmsgbGluazFgCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbG4vbG4tcHJlc2VydmVzLWhhcmQtbGlua3MgYi90ZXN0c3VpdGUvbG4vbG4tcHJlc2VydmVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmYjk4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtaGFyZC1saW5rcwpAQCAtMCwwICsxLDggQEAKK2VjaG8gZmlsZSBudW1iZXIgb25lID4gZmlsZTEKK2VjaG8gZmlsZSBudW1iZXIgdHdvID4gbGluazEKK3NldCArZQorYnVzeWJveCBsbiBmaWxlMSBsaW5rMQoraWYgWyAkPyAhPSAwIF0gOyB0aGVuCisJZXhpdCAwOworZmkKK2V4aXQgMTsKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtc29mdC1saW5rcyBiL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtc29mdC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ5YmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xuL2xuLXByZXNlcnZlcy1zb2Z0LWxpbmtzCkBAIC0wLDAgKzEsOCBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBsaW5rMQorc2V0ICtlCitidXN5Ym94IGxuIC1zIGZpbGUxIGxpbmsxCitpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKwlleGl0IDA7CitmaQorZXhpdCAxOwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xzLm1rX3VuaV90ZXN0cyBiL3Rlc3RzdWl0ZS9scy5ta191bmlfdGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwYzI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9scy5ta191bmlfdGVzdHMKQEAgLTAsMCArMSwxMTEgQEAKKyMgRE8gTk9UIEVESVQgVEhJUyBGSUxFISBNT1NUIFRFWFQgRURJVE9SUyBXSUxMIERBTUFHRSBJVCEKKz4nMDAwMV8xX19Tb21lX2NvcnJlY3RfVVRGLThfdGV4dF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDAyXzJfX0JvdW5kYXJ5X2NvbmRpdGlvbl90ZXN0X2Nhc2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDNfMi4xX19GaXJzdF9wb3NzaWJsZV9zZXF1ZW5jZV9vZl9hX2NlcnRhaW5fbGVuZ3RoX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwNF8yLjEuMl9fMl9ieXRlc19fVS0wMDAwMDA4MF86X19fX19fX18iwoAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwNV8yLjEuM19fM19ieXRlc19fVS0wMDAwMDgwMF86X19fX19fX18i4KCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDZfMi4xLjRfXzRfYnl0ZXNfX1UtMDAwMTAwMDBfOl9fX19fX19fIvCQgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwN18yLjEuNV9fNV9ieXRlc19fVS0wMDIwMDAwMF86X19fX19fX18i+IiAgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwOF8yLjEuNl9fNl9ieXRlc19fVS0wNDAwMDAwMF86X19fX19fX18i/ISAgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDlfMi4yX19MYXN0X3Bvc3NpYmxlX3NlcXVlbmNlX29mX2FfY2VydGFpbl9sZW5ndGhfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxMF8yLjIuMV9fMV9ieXRlX19fVS0wMDAwMDA3Rl86X19fX19fX18ifyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDExXzIuMi4yX18yX2J5dGVzX19VLTAwMDAwN0ZGXzpfX19fX19fXyLfvyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDEyXzIuMi4zX18zX2J5dGVzX19VLTAwMDBGRkZGXzpfX19fX19fXyLvv78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxM18yLjIuNF9fNF9ieXRlc19fVS0wMDFGRkZGRl86X19fX19fX18i97+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE0XzIuMi41X181X2J5dGVzX19VLTAzRkZGRkZGXzpfX19fX19fXyL7v7+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE1XzIuMi42X182X2J5dGVzX19VLTdGRkZGRkZGXzpfX19fX19fXyL9v7+/v78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxNl8yLjNfX090aGVyX2JvdW5kYXJ5X2NvbmRpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE3XzIuMy4xX19VLTAwMDBEN0ZGXz1fZWRfOWZfYmZfPV8i7Z+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxOF8yLjMuMl9fVS0wMDAwRTAwMF89X2VlXzgwXzgwXz1fIu6AgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTlfMi4zLjNfX1UtMDAwMEZGRkRfPV9lZl9iZl9iZF89XyLvv70iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDIwXzIuMy40X19VLTAwMTBGRkZGXz1fZjRfOGZfYmZfYmZfPV8i9I+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjFfMi4zLjVfX1UtMDAxMTAwMDBfPV9mNF85MF84MF84MF89XyL0kICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyMl8zX19NYWxmb3JtZWRfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDIzXzMuMV9fVW5leHBlY3RlZF9jb250aW51YXRpb25fYnl0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjRfMy4xLjFfX0ZpcnN0X2NvbnRpbnVhdGlvbl9ieXRlXzB4ODA6XyKAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyNV8zLjEuMl9fTGFzdF9fY29udGludWF0aW9uX2J5dGVfMHhiZjpfIr8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDI2XzMuMS4zX18yX2NvbnRpbnVhdGlvbl9ieXRlczpfIoC/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjdfMy4xLjRfXzNfY29udGludWF0aW9uX2J5dGVzOl8igL+AIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyOF8zLjEuNV9fNF9jb250aW51YXRpb25fYnl0ZXM6XyKAv4C/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDI5XzMuMS42X181X2NvbnRpbnVhdGlvbl9ieXRlczpfIoC/gL+AIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzBfMy4xLjdfXzZfY29udGludWF0aW9uX2J5dGVzOl8igL+Av4C/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzMV8zLjEuOF9fN19jb250aW51YXRpb25fYnl0ZXM6XyKAv4C/gL+AIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDMyXzMuMS45X19TZXF1ZW5jZV9vZl9hbGxfNjRfcG9zc2libGVfY29udGludWF0aW9uX2J5dGVzX18weDgwLTB4YmZfOl9fX3wnCis+JzAwMzNfX19fIoCBgoOEhYaHiImKi4yNjo9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzNF9fX19fkJGSk5SVlpeYmZqbnJ2en19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDM1X19fX1+goaKjpKWmp6ipqqusra6vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzZfX19fX7CxsrO0tba3uLm6u7y9vr8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzN18zLjJfX0xvbmVseV9zdGFydF9jaGFyYWN0ZXJzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDM4XzMuMi4xX19BbGxfMzJfZmlyc3RfYnl0ZXNfb2ZfMi1ieXRlX3NlcXVlbmNlc19fMHhjMC0weGRmXyxfX19fX19fX19fX3wnCis+JzAwMzlfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA0MF9fX18iwF/BX8Jfw1/EX8Vfxl/HX8hfyV/KX8tfzF/NX85fz19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQxX19fX1/QX9Ff0l/TX9Rf1V/WX9df2F/ZX9pf21/cX91f3l/fXyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDJfMy4yLjJfX0FsbF8xNl9maXJzdF9ieXRlc19vZl8zLWJ5dGVfc2VxdWVuY2VzX18weGUwLTB4ZWZfLF9fX19fX19fX19ffCcKKz4nMDA0M19fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQ0X19fXyLgX+Ff4l/jX+Rf5V/mX+df6F/pX+pf61/sX+1f7l/vXyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDVfMy4yLjNfX0FsbF84X2ZpcnN0X2J5dGVzX29mXzQtYnl0ZV9zZXF1ZW5jZXNfXzB4ZjAtMHhmN18sX19fX19fX19fX19ffCcKKz4nMDA0Nl9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQ3X19fXyLwX/Ff8l/zX/Rf9V/2X/dfIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDhfMy4yLjRfX0FsbF80X2ZpcnN0X2J5dGVzX29mXzUtYnl0ZV9zZXF1ZW5jZXNfXzB4ZjgtMHhmYl8sX19fX19fX19fX19ffCcKKz4nMDA0OV9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDUwX19fXyL4X/lf+l/7XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNTFfMy4yLjVfX0FsbF8yX2ZpcnN0X2J5dGVzX29mXzYtYnl0ZV9zZXF1ZW5jZXNfXzB4ZmMtMHhmZF8sX19fX19fX19fX19ffCcKKz4nMDA1Ml9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDUzX19fXyL8X/1fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNTRfMy4zX19TZXF1ZW5jZXNfd2l0aF9sYXN0X2NvbnRpbnVhdGlvbl9ieXRlX21pc3NpbmdfX19fX19fX19fX19fX19fX19ffCcKKz4nMDA1NV8zLjMuMV9fMi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iwCJfX19fX198JworPicwMDU2XzMuMy4yX18zLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyLggCJfX19fX198JworPicwMDU3XzMuMy4zX180LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyLwgIAiX19fX19ffCcKKz4nMDA1OF8zLjMuNF9fNS1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18i+ICAgCJfX19fX198JworPicwMDU5XzMuMy41X182LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyL8gICAgCJfX19fX198JworPicwMDYwXzMuMy42X18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDAwMDdGRl86XyLfIl9fX19fX3wnCis+JzAwNjFfMy4zLjdfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMDBGRkZGXzpfIu+/Il9fX19fX3wnCis+JzAwNjJfMy4zLjhfXzQtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMUZGRkZGXzpfIve/vyJfX19fX198JworPicwMDYzXzMuMy45X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wM0ZGRkZGRl86XyL7v7+/Il9fX19fX3wnCis+JzAwNjRfMy4zLjEwXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTdGRkZGRkZGXzpfIv2/v7+/Il9fX19fX3wnCis+JzAwNjVfMy40X19Db25jYXRlbmF0aW9uX29mX2luY29tcGxldGVfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA2Nl9fX18iwOCA8ICA+ICAgPyAgICA3++/97+/+7+/v/2/v7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNjdfMy41X19JbXBvc3NpYmxlX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA2OF8zLjUuMV9fZmVfPV8i/iJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDY5XzMuNS4yX19mZl89XyL/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzBfMy41LjNfX2ZlX2ZlX2ZmX2ZmXz1fIv7+//8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3MV80X19PdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDcyXzQuMV9fRXhhbXBsZXNfb2ZfYW5fb3ZlcmxvbmdfQVNDSUlfY2hhcmFjdGVyX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzNfNC4xLjFfVSswMDJGXz1fYzBfYWZfX19fX19fX19fX19fPV8iwK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzRfNC4xLjJfVSswMDJGXz1fZTBfODBfYWZfX19fX19fX19fPV8i4ICvIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDc1XzQuMS4zX1UrMDAyRl89X2YwXzgwXzgwX2FmX19fX19fXz1fIvCAgK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzZfNC4xLjRfVSswMDJGXz1fZjhfODBfODBfODBfYWZfX19fPV8i+ICAgK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzdfNC4xLjVfVSswMDJGXz1fZmNfODBfODBfODBfODBfYWZfPV8i/ICAgICvIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDc4XzQuMl9fTWF4aW11bV9vdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzlfNC4yLjFfX1UtMDAwMDAwN0ZfPV9jMV9iZl9fX19fX19fX19fX189XyLBvyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODBfNC4yLjJfX1UtMDAwMDA3RkZfPV9lMF85Zl9iZl9fX19fX19fX189XyLgn78iX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDgxXzQuMi4zX19VLTAwMDBGRkZGXz1fZjBfOGZfYmZfYmZfX19fX19fPV8i8I+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODJfNC4yLjRfX1UtMDAxRkZGRkZfPV9mOF84N19iZl9iZl9iZl9fX189XyL4h7+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODNfNC4yLjVfX1UtMDNGRkZGRkZfPV9mY184M19iZl9iZl9iZl9iZl89XyL8g7+/v78iX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDg0XzQuM19fT3ZlcmxvbmdfcmVwcmVzZW50YXRpb25fb2ZfdGhlX05VTF9jaGFyYWN0ZXJfX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODVfNC4zLjFfX1UrMDAwMF89X2MwXzgwX19fX19fX19fX19fXz1fIsCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODZfNC4zLjJfX1UrMDAwMF89X2UwXzgwXzgwX19fX19fX19fXz1fIuCAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDg3XzQuMy4zX19VKzAwMDBfPV9mMF84MF84MF84MF9fX19fX189XyLwgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODhfNC4zLjRfX1UrMDAwMF89X2Y4XzgwXzgwXzgwXzgwX19fXz1fIviAgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODlfNC4zLjVfX1UrMDAwMF89X2ZjXzgwXzgwXzgwXzgwXzgwXz1fIvyAgICAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDkwXzVfX0lsbGVnYWxfY29kZV9wb3NpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTFfNS4xX1NpbmdsZV9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5Ml81LjEuMV9fVStEODAwXz1fZWRfYTBfODBfPV8i7aCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTNfNS4xLjJfX1UrREI3Rl89X2VkX2FkX2JmXz1fIu2tvyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDk0XzUuMS4zX19VK0RCODBfPV9lZF9hZV84MF89XyLtroAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5NV81LjEuNF9fVStEQkZGXz1fZWRfYWZfYmZfPV8i7a+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTZfNS4xLjVfX1UrREMwMF89X2VkX2IwXzgwXz1fIu2wgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDk3XzUuMS42X19VK0RGODBfPV9lZF9iZV84MF89XyLtvoAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5OF81LjEuN19fVStERkZGXz1fZWRfYmZfYmZfPV8i7b+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTlfNS4yX1BhaXJlZF9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwMF81LjIuMV9fVStEODAwX1UrREMwMF89X2VkX2EwXzgwX2VkX2IwXzgwXz1fIu2ggO2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwMV81LjIuMl9fVStEODAwX1UrREZGRl89X2VkX2EwXzgwX2VkX2JmX2JmXz1fIu2ggO2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwMl81LjIuM19fVStEQjdGX1UrREMwMF89X2VkX2FkX2JmX2VkX2IwXzgwXz1fIu2tv+2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwM181LjIuNF9fVStEQjdGX1UrREZGRl89X2VkX2FkX2JmX2VkX2JmX2JmXz1fIu2tv+2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwNF81LjIuNV9fVStEQjgwX1UrREMwMF89X2VkX2FlXzgwX2VkX2IwXzgwXz1fIu2ugO2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwNV81LjIuNl9fVStEQjgwX1UrREZGRl89X2VkX2FlXzgwX2VkX2JmX2JmXz1fIu2ugO2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwNl81LjIuN19fVStEQkZGX1UrREMwMF89X2VkX2FmX2JmX2VkX2IwXzgwXz1fIu2vv+2wgCJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwN181LjIuOF9fVStEQkZGX1UrREZGRl89X2VkX2FmX2JmX2VkX2JmX2JmXz1fIu2vv+2/vyJfX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDEwOF81LjNfT3RoZXJfaWxsZWdhbF9jb2RlX3Bvc2l0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMTA5XzUuMy4xX19VK0ZGRkVfPV9lZl9iZl9iZV89XyLvv74iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDExMF81LjMuMl9fVStGRkZGXz1fZWZfYmZfYmZfPV8i77+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbHMudGVzdHMgYi90ZXN0c3VpdGUvbHMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTMwOWQzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9scy50ZXN0cwpAQCAtMCwwICsxLDI2OCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworcm0gLXJmIGxzLnRlc3RkaXIgMj4vZGV2L251bGwKK21rZGlyIGxzLnRlc3RkaXIgfHwgZXhpdCAxCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworIyBXaXRoIFVuaWNvZGUgcHJvdmlkZWQgYnkgbGliYyBsb2NhbGUsIEknbSBub3Qgc3VyZSB0aGlzIHRlc3QgY2FuIHBhc3MuCisjIEkgc3VzcGVjdCB3ZSBtaWdodCBmYWlsIHRvIHNraXAgZXhhY3RseSBjb3JyZWN0IG51bWJlciBvZiBieXRlcworIyBvdmVyIGJyb2tlZCB1bmljb2RlIHNlcXVlbmNlcy4KK3Rlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIiAhPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1NVQlNUX1dDSEFSIiA9IHgiNjMiIFwKKyYmIHRlc3QgeCIkQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIiA9IHgiNzY3IiBcCismJiB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUyIgPSB4InkiIFwKKyYmIHRlc3RpbmcgImxzIHVuaWNvZGUgdGVzdCB3aXRoIGNvZGVwb2ludHMgbGltaXRlZCB0byA3NjciIFwKKyIoY2QgbHMudGVzdGRpciAmJiBzaCAuLi9scy5ta191bmlfdGVzdHMpICYmIGxzIC0xIGxzLnRlc3RkaXIiIFwKKycwMDAxXzFfX1NvbWVfY29ycmVjdF9VVEYtOF90ZXh0X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDJfMl9fQm91bmRhcnlfY29uZGl0aW9uX3Rlc3RfY2FzZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwM18yLjFfX0ZpcnN0X3Bvc3NpYmxlX3NlcXVlbmNlX29mX2FfY2VydGFpbl9sZW5ndGhfX19fX19fX19fX19fX19fX19fX198CiswMDA0XzIuMS4yX18yX2J5dGVzX19VLTAwMDAwMDgwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDVfMi4xLjNfXzNfYnl0ZXNfX1UtMDAwMDA4MDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwNl8yLjEuNF9fNF9ieXRlc19fVS0wMDAxMDAwMF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA3XzIuMS41X181X2J5dGVzX19VLTAwMjAwMDAwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDhfMi4xLjZfXzZfYnl0ZXNfX1UtMDQwMDAwMDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwOV8yLjJfX0xhc3RfcG9zc2libGVfc2VxdWVuY2Vfb2ZfYV9jZXJ0YWluX2xlbmd0aF9fX19fX19fX19fX19fX19fX19fX198CiswMDEwXzIuMi4xX18xX2J5dGVfX19VLTAwMDAwMDdGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTFfMi4yLjJfXzJfYnl0ZXNfX1UtMDAwMDA3RkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxMl8yLjIuM19fM19ieXRlc19fVS0wMDAwRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDEzXzIuMi40X180X2J5dGVzX19VLTAwMUZGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTRfMi4yLjVfXzVfYnl0ZXNfX1UtMDNGRkZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxNV8yLjIuNl9fNl9ieXRlc19fVS03RkZGRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE2XzIuM19fT3RoZXJfYm91bmRhcnlfY29uZGl0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTdfMi4zLjFfX1UtMDAwMEQ3RkZfPV9lZF85Zl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxOF8yLjMuMl9fVS0wMDAwRTAwMF89X2VlXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE5XzIuMy4zX19VLTAwMDBGRkZEXz1fZWZfYmZfYmRfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjBfMi4zLjRfX1UtMDAxMEZGRkZfPV9mNF84Zl9iZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyMV8yLjMuNV9fVS0wMDExMDAwMF89X2Y0XzkwXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIyXzNfX01hbGZvcm1lZF9zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjNfMy4xX19VbmV4cGVjdGVkX2NvbnRpbnVhdGlvbl9ieXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyNF8zLjEuMV9fRmlyc3RfY29udGludWF0aW9uX2J5dGVfMHg4MDpfIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI1XzMuMS4yX19MYXN0X19jb250aW51YXRpb25fYnl0ZV8weGJmOl8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjZfMy4xLjNfXzJfY29udGludWF0aW9uX2J5dGVzOl8iPz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyN18zLjEuNF9fM19jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI4XzMuMS41X180X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjlfMy4xLjZfXzVfY29udGludWF0aW9uX2J5dGVzOl8iPz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzMF8zLjEuN19fNl9jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDMxXzMuMS44X183X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzJfMy4xLjlfX1NlcXVlbmNlX29mX2FsbF82NF9wb3NzaWJsZV9jb250aW51YXRpb25fYnl0ZXNfXzB4ODAtMHhiZl86X19ffAorMDAzM19fX18iPz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM0X19fX18/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzVfX19fXz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzNl9fX19fPz8/Pz8/Pz8/Pz8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM3XzMuMl9fTG9uZWx5X3N0YXJ0X2NoYXJhY3RlcnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzhfMy4yLjFfX0FsbF8zMl9maXJzdF9ieXRlc19vZl8yLWJ5dGVfc2VxdWVuY2VzX18weGMwLTB4ZGZfLF9fX19fX19fX19ffAorMDAzOV9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQwX19fXyI/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDFfX19fXz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0Ml8zLjIuMl9fQWxsXzE2X2ZpcnN0X2J5dGVzX29mXzMtYnl0ZV9zZXF1ZW5jZXNfXzB4ZTAtMHhlZl8sX19fX19fX19fX198CiswMDQzX19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDRfX19fIj9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0NV8zLjIuM19fQWxsXzhfZmlyc3RfYnl0ZXNfb2ZfNC1ieXRlX3NlcXVlbmNlc19fMHhmMC0weGY3XyxfX19fX19fX19fX198CiswMDQ2X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDdfX19fIj9fP18/Xz9fP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0OF8zLjIuNF9fQWxsXzRfZmlyc3RfYnl0ZXNfb2ZfNS1ieXRlX3NlcXVlbmNlc19fMHhmOC0weGZiXyxfX19fX19fX19fX198CiswMDQ5X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNTBfX19fIj9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1MV8zLjIuNV9fQWxsXzJfZmlyc3RfYnl0ZXNfb2ZfNi1ieXRlX3NlcXVlbmNlc19fMHhmYy0weGZkXyxfX19fX19fX19fX198CiswMDUyX19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNTNfX19fIj9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1NF8zLjNfX1NlcXVlbmNlc193aXRoX2xhc3RfY29udGludWF0aW9uX2J5dGVfbWlzc2luZ19fX19fX19fX19fX19fX19fX198CiswMDU1XzMuMy4xX18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNTZfMy4zLjJfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1N18zLjMuM19fNC1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDU4XzMuMy40X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNTlfMy4zLjVfXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA2MF8zLjMuNl9fMi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAwMDA3RkZfOl8iPyJfX19fX198CiswMDYxXzMuMy43X18zLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDAwRkZGRl86XyI/Il9fX19fX3wKKzAwNjJfMy4zLjhfXzQtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMUZGRkZGXzpfIj8iX19fX19ffAorMDA2M18zLjMuOV9fNS1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDNGRkZGRkZfOl8iPyJfX19fX198CiswMDY0XzMuMy4xMF82LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS03RkZGRkZGRl86XyI/Il9fX19fX3wKKzAwNjVfMy40X19Db25jYXRlbmF0aW9uX29mX2luY29tcGxldGVfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2Nl9fX18iPz8/Pz8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY3XzMuNV9fSW1wb3NzaWJsZV9ieXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNjhfMy41LjFfX2ZlXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2OV8zLjUuMl9fZmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDcwXzMuNS4zX19mZV9mZV9mZl9mZl89XyI/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzFfNF9fT3Zlcmxvbmdfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3Ml80LjFfX0V4YW1wbGVzX29mX2FuX292ZXJsb25nX0FTQ0lJX2NoYXJhY3Rlcl9fX19fX19fX19fX19fX19fX19fX19fX198CiswMDczXzQuMS4xX1UrMDAyRl89X2MwX2FmX19fX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzRfNC4xLjJfVSswMDJGXz1fZTBfODBfYWZfX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3NV80LjEuM19VKzAwMkZfPV9mMF84MF84MF9hZl9fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc2XzQuMS40X1UrMDAyRl89X2Y4XzgwXzgwXzgwX2FmX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzdfNC4xLjVfVSswMDJGXz1fZmNfODBfODBfODBfODBfYWZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3OF80LjJfX01heGltdW1fb3Zlcmxvbmdfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc5XzQuMi4xX19VLTAwMDAwMDdGXz1fYzFfYmZfX19fX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODBfNC4yLjJfX1UtMDAwMDA3RkZfPV9lMF85Zl9iZl9fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4MV80LjIuM19fVS0wMDAwRkZGRl89X2YwXzhmX2JmX2JmX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDgyXzQuMi40X19VLTAwMUZGRkZGXz1fZjhfODdfYmZfYmZfYmZfX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODNfNC4yLjVfX1UtMDNGRkZGRkZfPV9mY184M19iZl9iZl9iZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4NF80LjNfX092ZXJsb25nX3JlcHJlc2VudGF0aW9uX29mX3RoZV9OVUxfY2hhcmFjdGVyX19fX19fX19fX19fX19fX19fX198CiswMDg1XzQuMy4xX19VKzAwMDBfPV9jMF84MF9fX19fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODZfNC4zLjJfX1UrMDAwMF89X2UwXzgwXzgwX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4N180LjMuM19fVSswMDAwXz1fZjBfODBfODBfODBfX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg4XzQuMy40X19VKzAwMDBfPV9mOF84MF84MF84MF84MF9fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODlfNC4zLjVfX1UrMDAwMF89X2ZjXzgwXzgwXzgwXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5MF81X19JbGxlZ2FsX2NvZGVfcG9zaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkxXzUuMV9TaW5nbGVfVVRGLTE2X3N1cnJvZ2F0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTJfNS4xLjFfX1UrRDgwMF89X2VkX2EwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5M181LjEuMl9fVStEQjdGXz1fZWRfYWRfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk0XzUuMS4zX19VK0RCODBfPV9lZF9hZV84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTVfNS4xLjRfX1UrREJGRl89X2VkX2FmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5Nl81LjEuNV9fVStEQzAwXz1fZWRfYjBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk3XzUuMS42X19VK0RGODBfPV9lZF9iZV84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOThfNS4xLjdfX1UrREZGRl89X2VkX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5OV81LjJfUGFpcmVkX1VURi0xNl9zdXJyb2dhdGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMTAwXzUuMi4xX19VK0Q4MDBfVStEQzAwXz1fZWRfYTBfODBfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDFfNS4yLjJfX1UrRDgwMF9VK0RGRkZfPV9lZF9hMF84MF9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwMl81LjIuM19fVStEQjdGX1UrREMwMF89X2VkX2FkX2JmX2VkX2IwXzgwXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTAzXzUuMi40X19VK0RCN0ZfVStERkZGXz1fZWRfYWRfYmZfZWRfYmZfYmZfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDRfNS4yLjVfX1UrREI4MF9VK0RDMDBfPV9lZF9hZV84MF9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwNV81LjIuNl9fVStEQjgwX1UrREZGRl89X2VkX2FlXzgwX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA2XzUuMi43X19VK0RCRkZfVStEQzAwXz1fZWRfYWZfYmZfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDdfNS4yLjhfX1UrREJGRl9VK0RGRkZfPV9lZF9hZl9iZl9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwOF81LjNfT3RoZXJfaWxsZWdhbF9jb2RlX3Bvc2l0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMTA5XzUuMy4xX19VK0ZGRkVfPV9lZl9iZl9iZV89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMTBfNS4zLjJfX1UrRkZGRl89X2VmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorJyAiIiAiIgorCisjIEN1cnJlbnRseSBmYWlscyBvbiAiMDA4MF80LjIuMl9fVS0wMDAwMDdGRl89X2UwXzlmX2JmIiBsaW5lCit0ZXN0IHgiJENPTkZJR19VTklDT0RFX1NVUFBPUlQiID0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSIgIT0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19TVUJTVF9XQ0hBUiIgPSB4IjYzIiBcCismJiB0ZXN0IHgiJENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiIgPSB4IjAiIFwKKyYmIHRlc3RpbmcgImxzIHVuaWNvZGUgdGVzdCB3aXRoIHVubGltaXRlZCBjb2RlcG9pbnRzIiBcCisiKGNkIGxzLnRlc3RkaXIgJiYgc2ggLi4vbHMubWtfdW5pX3Rlc3RzKSAmJiBscyAtMSBscy50ZXN0ZGlyIiBcCisnMDAwMV8xX19Tb21lX2NvcnJlY3RfVVRGLThfdGV4dF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDAyXzJfX0JvdW5kYXJ5X2NvbmRpdGlvbl90ZXN0X2Nhc2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDNfMi4xX19GaXJzdF9wb3NzaWJsZV9zZXF1ZW5jZV9vZl9hX2NlcnRhaW5fbGVuZ3RoX19fX19fX19fX19fX19fX19fX19ffAorMDAwNF8yLjEuMl9fMl9ieXRlc19fVS0wMDAwMDA4MF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA1XzIuMS4zX18zX2J5dGVzX19VLTAwMDAwODAwXzpfX19fX19fXyLgoIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwNl8yLjEuNF9fNF9ieXRlc19fVS0wMDAxMDAwMF86X19fX19fX18i8JCAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA3XzIuMS41X181X2J5dGVzX19VLTAwMjAwMDAwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDhfMi4xLjZfXzZfYnl0ZXNfX1UtMDQwMDAwMDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwOV8yLjJfX0xhc3RfcG9zc2libGVfc2VxdWVuY2Vfb2ZfYV9jZXJ0YWluX2xlbmd0aF9fX19fX19fX19fX19fX19fX19fX198CiswMDEwXzIuMi4xX18xX2J5dGVfX19VLTAwMDAwMDdGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTFfMi4yLjJfXzJfYnl0ZXNfX1UtMDAwMDA3RkZfOl9fX19fX19fIt+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTJfMi4yLjNfXzNfYnl0ZXNfX1UtMDAwMEZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxM18yLjIuNF9fNF9ieXRlc19fVS0wMDFGRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE0XzIuMi41X181X2J5dGVzX19VLTAzRkZGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTVfMi4yLjZfXzZfYnl0ZXNfX1UtN0ZGRkZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxNl8yLjNfX090aGVyX2JvdW5kYXJ5X2NvbmRpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE3XzIuMy4xX19VLTAwMDBEN0ZGXz1fZWRfOWZfYmZfPV8i7Z+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxOF8yLjMuMl9fVS0wMDAwRTAwMF89X2VlXzgwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE5XzIuMy4zX19VLTAwMDBGRkZEXz1fZWZfYmZfYmRfPV8i77+9Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyMF8yLjMuNF9fVS0wMDEwRkZGRl89X2Y0XzhmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIxXzIuMy41X19VLTAwMTEwMDAwXz1fZjRfOTBfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjJfM19fTWFsZm9ybWVkX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyM18zLjFfX1VuZXhwZWN0ZWRfY29udGludWF0aW9uX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI0XzMuMS4xX19GaXJzdF9jb250aW51YXRpb25fYnl0ZV8weDgwOl8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjVfMy4xLjJfX0xhc3RfX2NvbnRpbnVhdGlvbl9ieXRlXzB4YmY6XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyNl8zLjEuM19fMl9jb250aW51YXRpb25fYnl0ZXM6XyI/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI3XzMuMS40X18zX2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjhfMy4xLjVfXzRfY29udGludWF0aW9uX2J5dGVzOl8iPz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyOV8zLjEuNl9fNV9jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDMwXzMuMS43X182X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzFfMy4xLjhfXzdfY29udGludWF0aW9uX2J5dGVzOl8iPz8/Pz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzMl8zLjEuOV9fU2VxdWVuY2Vfb2ZfYWxsXzY0X3Bvc3NpYmxlX2NvbnRpbnVhdGlvbl9ieXRlc19fMHg4MC0weGJmXzpfX198CiswMDMzX19fXyI/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzRfX19fXz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzNV9fX19fPz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM2X19fX18/Pz8/Pz8/Pz8/Pz8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzdfMy4yX19Mb25lbHlfc3RhcnRfY2hhcmFjdGVyc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzOF8zLjIuMV9fQWxsXzMyX2ZpcnN0X2J5dGVzX29mXzItYnl0ZV9zZXF1ZW5jZXNfXzB4YzAtMHhkZl8sX19fX19fX19fX198CiswMDM5X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDBfX19fIj9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0MV9fX19fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQyXzMuMi4yX19BbGxfMTZfZmlyc3RfYnl0ZXNfb2ZfMy1ieXRlX3NlcXVlbmNlc19fMHhlMC0weGVmXyxfX19fX19fX19fX3wKKzAwNDNfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0NF9fX18iP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQ1XzMuMi4zX19BbGxfOF9maXJzdF9ieXRlc19vZl80LWJ5dGVfc2VxdWVuY2VzX18weGYwLTB4ZjdfLF9fX19fX19fX19fX3wKKzAwNDZfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0N19fX18iP18/Xz9fP18/Xz9fP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQ4XzMuMi40X19BbGxfNF9maXJzdF9ieXRlc19vZl81LWJ5dGVfc2VxdWVuY2VzX18weGY4LTB4ZmJfLF9fX19fX19fX19fX3wKKzAwNDlfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1MF9fX18iP18/Xz9fP18iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDUxXzMuMi41X19BbGxfMl9maXJzdF9ieXRlc19vZl82LWJ5dGVfc2VxdWVuY2VzX18weGZjLTB4ZmRfLF9fX19fX19fX19fX3wKKzAwNTJfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA1M19fX18iP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDU0XzMuM19fU2VxdWVuY2VzX3dpdGhfbGFzdF9jb250aW51YXRpb25fYnl0ZV9taXNzaW5nX19fX19fX19fX19fX19fX19fX3wKKzAwNTVfMy4zLjFfXzItYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1Nl8zLjMuMl9fMy1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDU3XzMuMy4zX180LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNThfMy4zLjRfXzUtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1OV8zLjMuNV9fNi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDYwXzMuMy42X18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDAwMDdGRl86XyI/Il9fX19fX3wKKzAwNjFfMy4zLjdfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMDBGRkZGXzpfIj8iX19fX19ffAorMDA2Ml8zLjMuOF9fNC1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAxRkZGRkZfOl8iPyJfX19fX198CiswMDYzXzMuMy45X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wM0ZGRkZGRl86XyI/Il9fX19fX3wKKzAwNjRfMy4zLjEwXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTdGRkZGRkZGXzpfIj8iX19fX19ffAorMDA2NV8zLjRfX0NvbmNhdGVuYXRpb25fb2ZfaW5jb21wbGV0ZV9zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY2X19fXyI/Pz8/Pz8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNjdfMy41X19JbXBvc3NpYmxlX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2OF8zLjUuMV9fZmVfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY5XzMuNS4yX19mZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzBfMy41LjNfX2ZlX2ZlX2ZmX2ZmXz1fIj8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3MV80X19PdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDcyXzQuMV9fRXhhbXBsZXNfb2ZfYW5fb3ZlcmxvbmdfQVNDSUlfY2hhcmFjdGVyX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzNfNC4xLjFfVSswMDJGXz1fYzBfYWZfX19fX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3NF80LjEuMl9VKzAwMkZfPV9lMF84MF9hZl9fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc1XzQuMS4zX1UrMDAyRl89X2YwXzgwXzgwX2FmX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzZfNC4xLjRfVSswMDJGXz1fZjhfODBfODBfODBfYWZfX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3N180LjEuNV9VKzAwMkZfPV9mY184MF84MF84MF84MF9hZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc4XzQuMl9fTWF4aW11bV9vdmVybG9uZ19zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzlfNC4yLjFfX1UtMDAwMDAwN0ZfPV9jMV9iZl9fX19fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4MF80LjIuMl9fVS0wMDAwMDdGRl89X2UwXzlmX2JmX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDgxXzQuMi4zX19VLTAwMDBGRkZGXz1fZjBfOGZfYmZfYmZfX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODJfNC4yLjRfX1UtMDAxRkZGRkZfPV9mOF84N19iZl9iZl9iZl9fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4M180LjIuNV9fVS0wM0ZGRkZGRl89X2ZjXzgzX2JmX2JmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg0XzQuM19fT3ZlcmxvbmdfcmVwcmVzZW50YXRpb25fb2ZfdGhlX05VTF9jaGFyYWN0ZXJfX19fX19fX19fX19fX19fX19fX3wKKzAwODVfNC4zLjFfX1UrMDAwMF89X2MwXzgwX19fX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4Nl80LjMuMl9fVSswMDAwXz1fZTBfODBfODBfX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg3XzQuMy4zX19VKzAwMDBfPV9mMF84MF84MF84MF9fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODhfNC4zLjRfX1UrMDAwMF89X2Y4XzgwXzgwXzgwXzgwX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4OV80LjMuNV9fVSswMDAwXz1fZmNfODBfODBfODBfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkwXzVfX0lsbGVnYWxfY29kZV9wb3NpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTFfNS4xX1NpbmdsZV9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5Ml81LjEuMV9fVStEODAwXz1fZWRfYTBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkzXzUuMS4yX19VK0RCN0ZfPV9lZF9hZF9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTRfNS4xLjNfX1UrREI4MF89X2VkX2FlXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5NV81LjEuNF9fVStEQkZGXz1fZWRfYWZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk2XzUuMS41X19VK0RDMDBfPV9lZF9iMF84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTdfNS4xLjZfX1UrREY4MF89X2VkX2JlXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5OF81LjEuN19fVStERkZGXz1fZWRfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk5XzUuMl9QYWlyZWRfVVRGLTE2X3N1cnJvZ2F0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDBfNS4yLjFfX1UrRDgwMF9VK0RDMDBfPV9lZF9hMF84MF9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwMV81LjIuMl9fVStEODAwX1UrREZGRl89X2VkX2EwXzgwX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTAyXzUuMi4zX19VK0RCN0ZfVStEQzAwXz1fZWRfYWRfYmZfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDNfNS4yLjRfX1UrREI3Rl9VK0RGRkZfPV9lZF9hZF9iZl9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwNF81LjIuNV9fVStEQjgwX1UrREMwMF89X2VkX2FlXzgwX2VkX2IwXzgwXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA1XzUuMi42X19VK0RCODBfVStERkZGXz1fZWRfYWVfODBfZWRfYmZfYmZfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDZfNS4yLjdfX1UrREJGRl9VK0RDMDBfPV9lZF9hZl9iZl9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwN181LjIuOF9fVStEQkZGX1UrREZGRl89X2VkX2FmX2JmX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA4XzUuM19PdGhlcl9pbGxlZ2FsX2NvZGVfcG9zaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDlfNS4zLjFfX1UrRkZGRV89X2VmX2JmX2JlXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDExMF81LjMuMl9fVStGRkZGXz1fZWZfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisnICIiICIiCisKK3JtIC1yZiBscy50ZXN0ZGlyIDI+L2Rldi9udWxsCitta2RpciBscy50ZXN0ZGlyIHx8IGV4aXQgMQorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTIiA9IHgieSIgXAorJiYgdGVzdGluZyAibHMgc3ltbGlua190b19kaXIiIFwKKyJ0b3VjaCBscy50ZXN0ZGlyL0EgbHMudGVzdGRpci9COyBsbiAtcyBscy50ZXN0ZGlyIGxzLmxpbms7IGxzIGxzLmxpbms7IGxzIC0xIGxzLmxpbmsvOyBscyAtMSBscy5saW5rOyBybSAtZiBscy5saW5rIiBcCisiQVxuQlxuQVxuQlxuQVxuQlxuIiBcCisiIiAiIgorCisjIENsZWFuIHVwCitybSAtcmYgbHMudGVzdGRpciAyPi9kZXYvbnVsbAorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9scy9scy0xLXdvcmtzIGIvdGVzdHN1aXRlL2xzL2xzLTEtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhYjlhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9scy9scy0xLXdvcmtzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVMKKworWyAtbiAiJGQiIF0gfHwgZD0uLgorTENfQUxMPUMgbHMgLTEgIiRkIiA+IGxvZ2ZpbGUuZ251CitMQ19BTEw9QyBidXN5Ym94IGxzIC0xICIkZCIgPiBsb2dmaWxlLmJiCitkaWZmIC11YncgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xzL2xzLWgtd29ya3MgYi90ZXN0c3VpdGUvbHMvbHMtaC13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDAxNmJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xzL2xzLWgtd29ya3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUyBDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCitbIC1uICIkZCIgXSB8fCBkPS4uCitMQ19BTEw9QyBscyAtaCAiJGQiID4gbG9nZmlsZS5nbnUKK0xDX0FMTD1DIGJ1c3lib3ggbHMgLWggIiRkIiA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXVidyBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbHMvbHMtbC13b3JrcyBiL3Rlc3RzdWl0ZS9scy9scy1sLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDg4MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbHMvbHMtbC13b3JrcwpAQCAtMCwwICsxLDggQEAKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiAhPSB4IiIgJiYgZXhpdAorCisjIGJ1c3lib3ggZG9lcyBub3QgZW1pdCAidG90YWwgTk5OIiBsaW5lCisKK1sgLW4gIiRkIiBdIHx8IGQ9Li4KK0xDX0FMTD1DIGxzIC1sICIkZCIgPiBsb2dmaWxlLmdudQorTENfQUxMPUMgYnVzeWJveCBscyAtbCAiJGQiID4gbG9nZmlsZS5iYgorZGlmZiAtdWJ3IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9scy9scy1zLXdvcmtzIGIvdGVzdHN1aXRlL2xzL2xzLXMtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmNWM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9scy9scy1zLXdvcmtzCkBAIC0wLDAgKzEsOCBAQAordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiICE9IHgiIiAmJiBleGl0CisKKyMgYnVzeWJveCBkb2VzIG5vdCBlbWl0ICJ0b3RhbCBOTk4iIGxpbmUKKworWyAtbiAiJGQiIF0gfHwgZD0uLgorTENfQUxMPUMgbHMgLTFzICIkZCIgPiBsb2dmaWxlLmdudQorTENfQUxMPUMgYnVzeWJveCBscyAtMXMgIiRkIiA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXVidyBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWFrZWRldnMuZGV2aWNlX3RhYmxlLnR4dCBiL3Rlc3RzdWl0ZS9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWMyMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbWFrZWRldnMuZGV2aWNlX3RhYmxlLnR4dApAQCAtMCwwICsxLDE3MiBAQAorIyBXaGVuIGJ1aWxkaW5nIGEgdGFyZ2V0IGZpbGVzeXN0ZW0sIGl0IGlzIGRlc2lyYWJsZSB0byBub3QgaGF2ZSB0bworIyBiZWNvbWUgcm9vdCBhbmQgdGhlbiBydW4gJ21rbm9kJyBhIHRob3VzYW5kIHRpbWVzLiAgVXNpbmcgYSBkZXZpY2UKKyMgdGFibGUgeW91IGNhbiBjcmVhdGUgZGV2aWNlIG5vZGVzIGFuZCBkaXJlY3RvcmllcyAib24gdGhlIGZseSIuCisjCisjIFRoaXMgaXMgYSBzYW1wbGUgZGV2aWNlIHRhYmxlIGZpbGUgZm9yIHVzZSB3aXRoIGdlbmV4dDJmcy4gIFlvdSBjYW4KKyMgZG8gYWxsIHNvcnRzIG9mIGludGVyZXN0aW5nIHRoaW5ncyB3aXRoIGEgZGV2aWNlIHRhYmxlIGZpbGUuICBGb3IKKyMgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWRqdXN0IHRoZSBwZXJtaXNzaW9ucyBvbiBhIHBhcnRpY3VsYXIgZmlsZQorIyB5b3UgY2FuIGp1c3QgYWRkIGFuIGVudHJ5IGxpa2U6CisjICAgL3NiaW4vZm9vYmFyICAgICAgICBmICAgICAgIDI3NTUgICAgMCAgICAgICAwICAgICAgIC0gICAgICAgLSAgICAgICAtICAgICAgIC0gICAgICAgLQorIyBhbmQgKGFzc3VtaW5nIHRoZSBmaWxlIC9zYmluL2Zvb2JhciBleGlzdHMpIGl0IHdpbGwgYmUgbWFkZSBzZXR1aWQKKyMgcm9vdCAocmVnYXJkbGVzcyBvZiB3aGF0IGl0cyBwZXJtaXNzaW9ucyBhcmUgb24gdGhlIGhvc3QgZmlsZXN5c3RlbSkuCisjIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIHVzZSBhIHNpbmdsZSB0YWJsZSBlbnRyeSB0byBjcmVhdGUgYSBtYW55IGRldmljZQorIyBtaW5vcnMuICBGb3IgZXhhbXBsZSwgaWYgSSB3YW50ZWQgdG8gY3JlYXRlIC9kZXYvaGRhIGFuZCAvZGV2L2hkYVswLTE1XQorIyBJIGNvdWxkIGp1c3QgdXNlIHRoZSBmb2xsb3dpbmcgdHdvIHRhYmxlIGVudHJpZXM6CisjICAgL2Rldi9oZGEgICAgYiAgICAgICA2NDAgICAgIDAgICAgICAgMCAgICAgICAzICAgICAgIDAgICAgICAgMCAgICAgICAwICAgICAgIC0KKyMgICAvZGV2L2hkYSAgICBiICAgICAgIDY0MCAgICAgMCAgICAgICAwICAgICAgIDMgICAgICAgMSAgICAgICAxICAgICAgIDEgICAgICAgMTUKKyMKKyMgRGV2aWNlIHRhYmxlIGVudHJpZXMgdGFrZSB0aGUgZm9ybSBvZjoKKyMgPG5hbWU+ICAgIDx0eXBlPiAgICAgIDxtb2RlPiAgPHVpZD4gICA8Z2lkPiAgIDxtYWpvcj4gPG1pbm9yPiA8c3RhcnQ+IDxpbmM+ICAgPGNvdW50PgorIyB3aGVyZSBuYW1lIGlzIHRoZSBmaWxlIG5hbWUsICB0eXBlIGNhbiBiZSBvbmUgb2Y6CisjICAgICAgIGYgICAgICAgQSByZWd1bGFyIGZpbGUKKyMgICAgICAgZCAgICAgICBEaXJlY3RvcnkKKyMgICAgICAgYyAgICAgICBDaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UgZmlsZQorIyAgICAgICBiICAgICAgIEJsb2NrIHNwZWNpYWwgZGV2aWNlIGZpbGUKKyMgICAgICAgcCAgICAgICBGaWZvIChuYW1lZCBwaXBlKQorIyB1aWQgaXMgdGhlIHVzZXIgaWQgZm9yIHRoZSB0YXJnZXQgZmlsZSwgZ2lkIGlzIHRoZSBncm91cCBpZCBmb3IgdGhlCisjIHRhcmdldCBmaWxlLiAgVGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgKG1ham9yLCBtaW5vciwgZXRjKSBhcHBseSBvbmx5CisjIHRvIGRldmljZSBzcGVjaWFsIGZpbGVzLgorCisjIEhhdmUgZnVuCisjIC1FcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisKKyM8bmFtZT4JCTx0eXBlPgk8bW9kZT4JPHVpZD4JPGdpZD4JPG1ham9yPgk8bWlub3I+CTxzdGFydD4JPGluYz4JPGNvdW50PgorL2RldgkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2Rldi9wdHMJZAk3NTUJMAkwCS0JLQktCS0JLQorL2Rldi9zaG0JZAk3NTUJMAkwCS0JLQktCS0JLQorL3RtcAkJZAkxNzc3CTAJMAktCS0JLQktCS0KKy9ldGMJCWQJNzU1CTAJMAktCS0JLQktCS0KKy9ob21lL2RlZmF1bHQJZAkyNzU1CTEwMDAJMTAwMAktCS0JLQktCS0KKyM8bmFtZT4JCQkJCTx0eXBlPgk8bW9kZT4JPHVpZD4JPGdpZD4JPG1ham9yPgk8bWlub3I+CTxzdGFydD4JPGluYz4JPGNvdW50PgorIyMjL2Jpbi9idXN5Ym94CQkJCWYJNDc1NQkwCTAJLQktCS0JLQktCisjIyMvZXRjL3NoYWRvdwkJCQlmCTYwMAkwCTAJLQktCS0JLQktCisjIyMvZXRjL3Bhc3N3ZAkJCQlmCTY0NAkwCTAJLQktCS0JLQktCisvZXRjL25ldHdvcmsvaWYtdXAuZAkJCWQJNzU1CTAJMAktCS0JLQktCS0KKy9ldGMvbmV0d29yay9pZi1wcmUtdXAuZAkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2V0Yy9uZXR3b3JrL2lmLWRvd24uZAkJCWQJNzU1CTAJMAktCS0JLQktCS0KKy9ldGMvbmV0d29yay9pZi1wb3N0LWRvd24uZAkJZAk3NTUJMAkwCS0JLQktCS0JLQorIyMjL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQJZgk3NTUJMAkwCS0JLQktCS0JLQorIyB1bmNvbW1lbnQgdGhpcyB0byBhbGxvdyBzdGFydGluZyB4IGFzIG5vbi1yb290CisjL3Vzci9YMTFSNi9iaW4vWGZiZGV2CQlmCTQ3NTUJMAkwCS0JLQktCS0JLQorCisjIE5vcm1hbCBzeXN0ZW0gZGV2aWNlcworIyA8bmFtZT4gICAgPHR5cGU+ICAgICAgPG1vZGU+ICA8dWlkPiAgIDxnaWQ+ICAgPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluYz4gICA8Y291bnQ+CisvZGV2L21lbQljCTY0MAkwCTAJMQkxCTAJMAktCisvZGV2L2ttZW0JYwk2NDAJMAkwCTEJMgkwCTAJLQorL2Rldi9udWxsCWMJNjY2CTAJMAkxCTMJMAkwCS0KKy9kZXYvemVybwljCTY2NgkwCTAJMQk1CTAJMAktCisvZGV2L3JhbmRvbQljCTY2NgkwCTAJMQk4CTAJMAktCisvZGV2L3VyYW5kb20JYwk2NjYJMAkwCTEJOQkwCTAJLQorL2Rldi9yYW0JYgk2NDAJMAkwCTEJMQkwCTAJLQorL2Rldi9yYW0JYgk2NDAJMAkwCTEJMAkwCTEJNAorL2Rldi9sb29wCWIJNjQwCTAJMAk3CTAJMAkxCTIKKy9kZXYvcnRjCWMJNjQwCTAJMAkxMAkxMzUJLQktCS0KKy9kZXYvY29uc29sZQljCTY2NgkwCTAJNQkxCS0JLQktCisvZGV2L3R0eQljCTY2NgkwCTAJNQkwCS0JLQktCisvZGV2L3R0eQljCTY2NgkwCTAJNAkwCTAJMQk4CisvZGV2L3R0eXAJYwk2NjYJMAkwCTMJMAkwCTEJMTAKKy9kZXYvcHR5cAljICAgICAgIDY2NiAgICAgMCAgICAgICAwICAgICAgIDIgICAgICAgMCAgICAgICAwICAgICAgIDEgICAgICAgMTAKKy9kZXYvcHRteAljCTY2NgkwCTAJNQkyCS0JLQktCisvZGV2L3R0eVAJYwk2NjYJMAkwCTU3CTAJMAkxCTQKKy9kZXYvdHR5UwljCTY2NgkwCTAJNAk2NAkwCTEJNAorL2Rldi9mYgkJYwk2NDAJMAk1CTI5CTAJMAkzMgk0CisjL2Rldi90dHlTQQljCTY2NgkwCTAJMjA0CTUJMAkxCTMKKy9kZXYvcHNhdXgJYwk2NjYJMAkwCTEwCTEJMAkwCS0KKyMvZGV2L3BwcAljCTY2NgkwCTAJMTA4CTAJLQktCS0KKworIyBJbnB1dCBzdHVmZgorL2Rldi9pbnB1dAlkCTc1NQkwCTAJLQktCS0JLQktCisvZGV2L2lucHV0L21pY2UJYwk2NDAJMAkwCTEzCTYzCTAJMAktCisvZGV2L2lucHV0L21vdXNlIGMJNjYwCTAJMAkxMwkzMgkwCTEJNAorL2Rldi9pbnB1dC9ldmVudCBjCTY2MAkwCTAJMTMJNjQJMAkxCTQKKyMvZGV2L2lucHV0L2pzCWMJNjYwCTAJMAkxMwkwCTAJMQk0CisKKworIyBNVEQgc3R1ZmYKKy9kZXYvbXRkCWMJNjQwCTAJMAk5MAkwCTAJMgk0CisvZGV2L210ZGJsb2NrCWIJNjQwCTAJMAkzMQkwCTAJMQk0CisKKyNUdW4vdGFwIGRyaXZlcgorL2Rldi9uZXQJZAk3NTUJMAkwCS0JLQktCS0JLQorL2Rldi9uZXQvdHVuCWMJNjYwCTAJMAkxMAkyMDAJLQktCS0KKworIyBBdWRpbyBzdHVmZgorIy9kZXYvYXVkaW8JYwk2NjYJMAkyOQkxNAk0CS0JLQktCisjL2Rldi9hdWRpbzEJYwk2NjYJMAkyOQkxNAkyMAktCS0JLQorIy9kZXYvZHNwCWMJNjY2CTAJMjkJMTQJMwktCS0JLQorIy9kZXYvZHNwMQljCTY2NgkwCTI5CTE0CTE5CS0JLQktCisjL2Rldi9zbmRzdGF0CWMJNjY2CTAJMjkJMTQJNgktCS0JLQorCisjIFVzZXItbW9kZSBMaW51eCBzdHVmZgorIy9kZXYvdWJkYQliCTY0MAkwCTAJOTgJMAkwCTAJLQorIy9kZXYvdWJkYQliCTY0MAkwCTAJOTgJMQkxCTEJMTUKKworIyBJREUgRGV2aWNlcworL2Rldi9oZGEJYgk2NDAJMAkwCTMJMAkwCTAJLQorL2Rldi9oZGEJYgk2NDAJMAkwCTMJMQkxCTEJMTUKKy9kZXYvaGRiCWIJNjQwCTAJMAkzCTY0CTAJMAktCisvZGV2L2hkYgliCTY0MAkwCTAJMwk2NQkxCTEJMTUKKyMvZGV2L2hkYwliCTY0MAkwCTAJMjIJMAkwCTAJLQorIy9kZXYvaGRjCWIJNjQwCTAJMAkyMgkxCTEJMQkxNQorIy9kZXYvaGRkCWIJNjQwCTAJMAkyMgk2NAkwCTAJLQorIy9kZXYvaGRkCWIJNjQwCTAJMAkyMgk2NQkxCTEJMTUKKyMvZGV2L2hkZQliCTY0MAkwCTAJMzMJMAkwCTAJLQorIy9kZXYvaGRlCWIJNjQwCTAJMAkzMwkxCTEJMQkxNQorIy9kZXYvaGRmCWIJNjQwCTAJMAkzMwk2NAkwCTAJLQorIy9kZXYvaGRmCWIJNjQwCTAJMAkzMwk2NQkxCTEJMTUKKyMvZGV2L2hkZwliCTY0MAkwCTAJMzQJMAkwCTAJLQorIy9kZXYvaGRnCWIJNjQwCTAJMAkzNAkxCTEJMQkxNQorIy9kZXYvaGRoCWIJNjQwCTAJMAkzNAk2NAkwCTAJLQorIy9kZXYvaGRoCWIJNjQwCTAJMAkzNAk2NQkxCTEJMTUKKworIyBTQ1NJIERldmljZXMKKyMvZGV2L3NkYQliCTY0MAkwCTAJOAkwCTAJMAktCisjL2Rldi9zZGEJYgk2NDAJMAkwCTgJMQkxCTEJMTUKKyMvZGV2L3NkYgliCTY0MAkwCTAJOAkxNgkwCTAJLQorIy9kZXYvc2RiCWIJNjQwCTAJMAk4CTE3CTEJMQkxNQorIy9kZXYvc2RjCWIJNjQwCTAJMAk4CTMyCTAJMAktCisjL2Rldi9zZGMJYgk2NDAJMAkwCTgJMzMJMQkxCTE1CisjL2Rldi9zZGQJYgk2NDAJMAkwCTgJNDgJMAkwCS0KKyMvZGV2L3NkZAliCTY0MAkwCTAJOAk0OQkxCTEJMTUKKyMvZGV2L3NkZQliCTY0MAkwCTAJOAk2NAkwCTAJLQorIy9kZXYvc2RlCWIJNjQwCTAJMAk4CTY1CTEJMQkxNQorIy9kZXYvc2RmCWIJNjQwCTAJMAk4CTgwCTAJMAktCisjL2Rldi9zZGYJYgk2NDAJMAkwCTgJODEJMQkxCTE1CisjL2Rldi9zZGcJYgk2NDAJMAkwCTgJOTYJMAkwCS0KKyMvZGV2L3NkZwliCTY0MAkwCTAJOAk5NwkxCTEJMTUKKyMvZGV2L3NkaAliCTY0MAkwCTAJOAkxMTIJMAkwCS0KKyMvZGV2L3NkaAliCTY0MAkwCTAJOAkxMTMJMQkxCTE1CisjL2Rldi9zZwljCTY0MAkwCTAJMjEJMAkwCTEJMTUKKyMvZGV2L3NjZAliCTY0MAkwCTAJMTEJMAkwCTEJMTUKKyMvZGV2L3N0CWMJNjQwCTAJMAk5CTAJMAkxCTgKKyMvZGV2L25zdAljCTY0MAkwCTAJOQkxMjgJMAkxCTgKKyMvZGV2L3N0CWMJNjQwCTAJMAk5CTMyCTEJMQk0CisjL2Rldi9zdAljCTY0MAkwCTAJOQk2NAkxCTEJNAorIy9kZXYvc3QJYwk2NDAJMAkwCTkJOTYJMQkxCTQKKworIyBGbG9wcHkgZGlzayBkZXZpY2VzCisjL2Rldi9mZAliCTY0MAkwCTAJMgkwCTAJMQkyCisjL2Rldi9mZDBkMzYwCWIJNjQwCTAJMAkyCTQJMAkwCS0KKyMvZGV2L2ZkMWQzNjAJYgk2NDAJMAkwCTIJNQkwCTAJLQorIy9kZXYvZmQwaDEyMDAJYgk2NDAJMAkwCTIJOAkwCTAJLQorIy9kZXYvZmQxaDEyMDAJYgk2NDAJMAkwCTIJOQkwCTAJLQorIy9kZXYvZmQwdTE0NDAJYgk2NDAJMAkwCTIJMjgJMAkwCS0KKyMvZGV2L2ZkMXUxNDQwCWIJNjQwCTAJMAkyCTI5CTAJMAktCisjL2Rldi9mZDB1Mjg4MAliCTY0MAkwCTAJMgkzMgkwCTAJLQorIy9kZXYvZmQxdTI4ODAJYgk2NDAJMAkwCTIJMzMJMAkwCS0KKworIyBBbGwgdGhlIHByb3ByaWV0YXJ5IGNkcm9tIGRldmljZXMgaW4gdGhlIHdvcmxkCisjL2Rldi9henRjZAliCTY0MAkwCTAJMjkJMAkwCTAJLQorIy9kZXYvYnBjZAliCTY0MAkwCTAJNDEJMAkwCTAJLQorIy9kZXYvY2FwaTIwCWMJNjQwCTAJMAk2OAkwCTAJMQkyCisjL2Rldi9jZHUzMWEJYgk2NDAJMAkwCTE1CTAJMAkwCS0KKyMvZGV2L2NkdTUzNQliCTY0MAkwCTAJMjQJMAkwCTAJLQorIy9kZXYvY20yMDZjZAliCTY0MAkwCTAJMzIJMAkwCTAJLQorIy9kZXYvc2pjZAliCTY0MAkwCTAJMTgJMAkwCTAJLQorIy9kZXYvc29ueWNkCWIJNjQwCTAJMAkxNQkwCTAJMAktCisjL2Rldi9nc2NkCWIJNjQwCTAJMAkxNgkwCTAJMAktCisjL2Rldi9zYnBjZAliCTY0MAkwCTAJMjUJMAkwCTAJLQorIy9kZXYvc2JwY2QJYgk2NDAJMAkwCTI1CTAJMAkxCTQKKyMvZGV2L21jZAliCTY0MAkwCTAJMjMJMAkwCTAJLQorIy9kZXYvb3B0Y2QJYgk2NDAJMAkwCTE3CTAJMAkwCS0KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tYWtlZGV2cy50ZXN0cyBiL3Rlc3RzdWl0ZS9tYWtlZGV2cy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZDEyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21ha2VkZXZzLnRlc3RzCkBAIC0wLDAgKzEsMTUwIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKwordGVzdCB4ImBpZCAtdWAiID0geCIwIiB8fCB7CisJZWNobyAiU0tJUFBFRDogbWFrZWRldnMgKG11c3QgYmUgcm9vdCB0byB0ZXN0IHRoaXMpIgorCWV4aXQgMAorfQorCit1bnNldCBMQU5HCit1bnNldCBMQ19DT0xMQVRFCit1bnNldCBMQ19BTEwKKworIyBscyAtbG4gaXMgc2hvd2luZyBkYXRlLiBOZWVkIHRvIHJlbW92ZSB0aGF0LCBpdCdzIHZhcmlhYmxlCisjIHNlZDogKDEpICJtYWosIG1pbiIgLT4gIm1haixtaW4iICgyKSBjb2FsZXNjZSBzcGFjZXMKKyMgY3V0OiByZW1vdmUgZGF0ZQorRklMVEVSX0xTPSJzZWQgLWUgJ3MvLCAgKi8sL2cnIC1lICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNSw5LSIKKyMgY3V0OiByZW1vdmUgc2l6ZStkYXRlCitGSUxURVJfTFMyPSJzZWQgLWUgJ3MvLCAgKi8sL2cnIC1lICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNCw5LSIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitybSAtcmYgbWFrZWRldnMudGVzdGRpcgorbWtkaXIgbWFrZWRldnMudGVzdGRpcgorCitvcHRpb25hbCBGRUFUVVJFX01BS0VERVZTX1RBQkxFIEZFQVRVUkVfRklORF9OT1QgRkVBVFVSRV9GSU5EX1RZUEUgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgIm1ha2VkZXZzIC1kIC4uL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQgLiIgXAorCSIoY2QgbWFrZWRldnMudGVzdGRpciAmJiBtYWtlZGV2cyAtZCAuLi9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0IC4gMj4mMSk7CisJZmluZCBtYWtlZGV2cy50ZXN0ZGlyICEgLXR5cGUgZCB8IHNvcnQgfCB4YXJncyBscyAtbG5SIHwgJEZJTFRFUl9MUyIgXAorIlwKK3Jvb3RkaXI9LgordGFibGU9Jy4uL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQnCitjcnctcnctcnctIDEgMCAwIDUsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9jb25zb2xlCitjcnctci0tLS0tIDEgMCA1IDI5LDAgbWFrZWRldnMudGVzdGRpci9kZXYvZmIwCitjcnctci0tLS0tIDEgMCA1IDI5LDMyIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2ZiMQorY3J3LXItLS0tLSAxIDAgNSAyOSw2NCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9mYjIKK2Nydy1yLS0tLS0gMSAwIDUgMjksOTYgbWFrZWRldnMudGVzdGRpci9kZXYvZmIzCiticnctci0tLS0tIDEgMCAwIDMsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGEKK2Jydy1yLS0tLS0gMSAwIDAgMywxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTEKK2Jydy1yLS0tLS0gMSAwIDAgMywxMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGExMAorYnJ3LXItLS0tLSAxIDAgMCAzLDExIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTExCiticnctci0tLS0tIDEgMCAwIDMsMTIgbWFrZWRldnMudGVzdGRpci9kZXYvaGRhMTIKK2Jydy1yLS0tLS0gMSAwIDAgMywxMyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGExMworYnJ3LXItLS0tLSAxIDAgMCAzLDE0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTE0Citicnctci0tLS0tIDEgMCAwIDMsMTUgbWFrZWRldnMudGVzdGRpci9kZXYvaGRhMTUKK2Jydy1yLS0tLS0gMSAwIDAgMywyIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTIKK2Jydy1yLS0tLS0gMSAwIDAgMywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTMKK2Jydy1yLS0tLS0gMSAwIDAgMyw0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTQKK2Jydy1yLS0tLS0gMSAwIDAgMyw1IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTUKK2Jydy1yLS0tLS0gMSAwIDAgMyw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTYKK2Jydy1yLS0tLS0gMSAwIDAgMyw3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTcKK2Jydy1yLS0tLS0gMSAwIDAgMyw4IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTgKK2Jydy1yLS0tLS0gMSAwIDAgMyw5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTkKK2Jydy1yLS0tLS0gMSAwIDAgMyw2NCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIKK2Jydy1yLS0tLS0gMSAwIDAgMyw2NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxCiticnctci0tLS0tIDEgMCAwIDMsNzQgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMTAKK2Jydy1yLS0tLS0gMSAwIDAgMyw3NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxMQorYnJ3LXItLS0tLSAxIDAgMCAzLDc2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjEyCiticnctci0tLS0tIDEgMCAwIDMsNzcgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMTMKK2Jydy1yLS0tLS0gMSAwIDAgMyw3OCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxNAorYnJ3LXItLS0tLSAxIDAgMCAzLDc5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjE1Citicnctci0tLS0tIDEgMCAwIDMsNjYgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMgorYnJ3LXItLS0tLSAxIDAgMCAzLDY3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjMKK2Jydy1yLS0tLS0gMSAwIDAgMyw2OCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGI0Citicnctci0tLS0tIDEgMCAwIDMsNjkgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiNQorYnJ3LXItLS0tLSAxIDAgMCAzLDcwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjYKK2Jydy1yLS0tLS0gMSAwIDAgMyw3MSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGI3Citicnctci0tLS0tIDEgMCAwIDMsNzIgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiOAorYnJ3LXItLS0tLSAxIDAgMCAzLDczIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjkKK2Nydy1ydy0tLS0gMSAwIDAgMTMsNjQgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvZXZlbnQwCitjcnctcnctLS0tIDEgMCAwIDEzLDY1IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L2V2ZW50MQorY3J3LXJ3LS0tLSAxIDAgMCAxMyw2NiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9pbnB1dC9ldmVudDIKK2Nydy1ydy0tLS0gMSAwIDAgMTMsNjcgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvZXZlbnQzCitjcnctci0tLS0tIDEgMCAwIDEzLDYzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L21pY2UKK2Nydy1ydy0tLS0gMSAwIDAgMTMsMzIgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvbW91c2UwCitjcnctcnctLS0tIDEgMCAwIDEzLDMzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L21vdXNlMQorY3J3LXJ3LS0tLSAxIDAgMCAxMywzNCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9pbnB1dC9tb3VzZTIKK2Nydy1ydy0tLS0gMSAwIDAgMTMsMzUgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvbW91c2UzCitjcnctci0tLS0tIDEgMCAwIDEsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9rbWVtCiticnctci0tLS0tIDEgMCAwIDcsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9sb29wMAorYnJ3LXItLS0tLSAxIDAgMCA3LDEgbWFrZWRldnMudGVzdGRpci9kZXYvbG9vcDEKK2Nydy1yLS0tLS0gMSAwIDAgMSwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L21lbQorY3J3LXItLS0tLSAxIDAgMCA5MCwwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L210ZDAKK2Nydy1yLS0tLS0gMSAwIDAgOTAsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGQxCitjcnctci0tLS0tIDEgMCAwIDkwLDQgbWFrZWRldnMudGVzdGRpci9kZXYvbXRkMgorY3J3LXItLS0tLSAxIDAgMCA5MCw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L210ZDMKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazAKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazEKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazIKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazMKK2Nydy1ydy0tLS0gMSAwIDAgMTAsMjAwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L25ldC90dW4KK2Nydy1ydy1ydy0gMSAwIDAgMSwzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L251bGwKK2Nydy1ydy1ydy0gMSAwIDAgMTAsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wc2F1eAorY3J3LXJ3LXJ3LSAxIDAgMCA1LDIgbWFrZWRldnMudGVzdGRpci9kZXYvcHRteAorY3J3LXJ3LXJ3LSAxIDAgMCAyLDAgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDAKK2Nydy1ydy1ydy0gMSAwIDAgMiwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXAxCitjcnctcnctcnctIDEgMCAwIDIsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwMgorY3J3LXJ3LXJ3LSAxIDAgMCAyLDMgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDMKK2Nydy1ydy1ydy0gMSAwIDAgMiw0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXA0CitjcnctcnctcnctIDEgMCAwIDIsNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwNQorY3J3LXJ3LXJ3LSAxIDAgMCAyLDYgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDYKK2Nydy1ydy1ydy0gMSAwIDAgMiw3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXA3CitjcnctcnctcnctIDEgMCAwIDIsOCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwOAorY3J3LXJ3LXJ3LSAxIDAgMCAyLDkgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDkKK2Jydy1yLS0tLS0gMSAwIDAgMSwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3JhbQorYnJ3LXItLS0tLSAxIDAgMCAxLDAgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMAorYnJ3LXItLS0tLSAxIDAgMCAxLDEgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMQorYnJ3LXItLS0tLSAxIDAgMCAxLDIgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMgorYnJ3LXItLS0tLSAxIDAgMCAxLDMgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMworY3J3LXJ3LXJ3LSAxIDAgMCAxLDggbWFrZWRldnMudGVzdGRpci9kZXYvcmFuZG9tCitjcnctci0tLS0tIDEgMCAwIDEwLDEzNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9ydGMKK2Nydy1ydy1ydy0gMSAwIDAgNSwwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDAgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MAorY3J3LXJ3LXJ3LSAxIDAgMCA0LDEgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDIgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MgorY3J3LXJ3LXJ3LSAxIDAgMCA0LDMgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MworY3J3LXJ3LXJ3LSAxIDAgMCA0LDQgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NAorY3J3LXJ3LXJ3LSAxIDAgMCA0LDUgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDYgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NgorY3J3LXJ3LXJ3LSAxIDAgMCA0LDcgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NworY3J3LXJ3LXJ3LSAxIDAgMCA1NywwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVAwCitjcnctcnctcnctIDEgMCAwIDU3LDEgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UDEKK2Nydy1ydy1ydy0gMSAwIDAgNTcsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlQMgorY3J3LXJ3LXJ3LSAxIDAgMCA1NywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVAzCitjcnctcnctcnctIDEgMCAwIDQsNjQgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UzAKK2Nydy1ydy1ydy0gMSAwIDAgNCw2NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlTMQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDY2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVMyCitjcnctcnctcnctIDEgMCAwIDQsNjcgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UzMKK2Nydy1ydy1ydy0gMSAwIDAgMywwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXAwCitjcnctcnctcnctIDEgMCAwIDMsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwMQorY3J3LXJ3LXJ3LSAxIDAgMCAzLDIgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDIKK2Nydy1ydy1ydy0gMSAwIDAgMywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXAzCitjcnctcnctcnctIDEgMCAwIDMsNCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwNAorY3J3LXJ3LXJ3LSAxIDAgMCAzLDUgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDUKK2Nydy1ydy1ydy0gMSAwIDAgMyw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXA2CitjcnctcnctcnctIDEgMCAwIDMsNyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwNworY3J3LXJ3LXJ3LSAxIDAgMCAzLDggbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDgKK2Nydy1ydy1ydy0gMSAwIDAgMyw5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXA5CitjcnctcnctcnctIDEgMCAwIDEsOSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi91cmFuZG9tCitjcnctcnctcnctIDEgMCAwIDEsNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi96ZXJvCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjbGVhbiB1cAorcm0gLXJmIG1ha2VkZXZzLnRlc3RkaXIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWQ1c3VtLnRlc3RzIGIvdGVzdHN1aXRlL21kNXN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDY4YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21kNXN1bS50ZXN0cwpAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMgVXNlZCBieSB7bXM1LHNoYU59c3VtCisKKyMgV2UgcGlwZSB0ZXh0cyAwLi4uOTk5IGJ5dGVzIGxvbmcsIHttZDUsc2hhTn1zdW0gdGhlbSwKKyMgdGhlbiB7bWQ1LHNoYU59c3VtIHRoZSByZXN1bHRpbmcgbGlzdC4KKyMgVGhlbiB3ZSBjb21wYXJlIHRoZSByZXN1bHQgd2l0aCBleHBlY3RlZCByZXN1bHQuCisjCisjIEhlcmUgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOgorIyBlZmUzMGM0ODJlMGI2ODdlMGNjYTA2MTJmNDJjYTI5YgorIyBkNDEzMzdlODM0Mzc3MTQwYWU3Zjk4NDYwZDcxZDkwODU5OGVmMDRmCisjIDhlMWQzZWQ1N2ViYzEzMGYwZjcyNTA4NDQ2NTU5ZWVhZTA2NDUxYWU2ZDYxYjFlOGNlNDYzNzBjZmI4OTYzYzMKKyMgZmU0MTNlMGYxNzczMjRkMTM1Mzg5M2NhMDc3MmNlYmE4M2ZkNDE1MTJiYTYzODk1YTBlZWJiNzAzZWY5ZmVhYzJmYjRlOTJiMmNiNDMwYjNiZGE0MWI0NmIwY2I0ZWE4MzA3MTkwYTVjYzc5NTE1N2NmYjY4MGE5Y2Q2MzVkMGYKKworaWYgISB0ZXN0ICIkMSI7IHRoZW4KKwlzZXQgLS0gbWQ1c3VtIGVmZTMwYzQ4MmUwYjY4N2UwY2NhMDYxMmY0MmNhMjliCitmaQorCitzdW09IiQxIgorZXhwZWN0ZWQ9IiQyIgorCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKwordGVzdCB4IiRDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEIiAhPSB4InkiIFwKKyYmIHsgZWNobyAiU0tJUFBFRDogJHN1bSI7IGV4aXQgMDsgfQorCit0ZXh0PSJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nIgordGV4dD1geWVzICIkdGV4dCIgfCBoZWFkIC1jIDk5OTlgCisKK3Jlc3VsdD1gKAorbj0wCit3aGlsZSB0ZXN0ICRuIC1sZSA5OTk7IGRvCisJZWNobyAiJHRleHQiIHwgaGVhZCAtYyAkbiB8ICIkc3VtIgorCTogJCgobisrKSkKK2RvbmUgfCAiJHN1bSIKKylgCisKK2lmIHRlc3QgeCIkcmVzdWx0IiA9IHgiJGV4cGVjdGVkICAtIjsgdGhlbgorICAgIGVjaG8gIlBBU1M6ICRzdW0iCisgICAgZXhpdCAwCitmaQorCitlY2hvICJGQUlMOiAkc3VtIChyOiRyZXN1bHQgZXhwOiRleHBlY3RlZCkiCitleGl0IDEKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tZDVzdW0vbWQ1c3VtLXZlcmlmaWVzLW5vbi1iaW5hcnktZmlsZSBiL3Rlc3RzdWl0ZS9tZDVzdW0vbWQ1c3VtLXZlcmlmaWVzLW5vbi1iaW5hcnktZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY4MThlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21kNXN1bS9tZDVzdW0tdmVyaWZpZXMtbm9uLWJpbmFyeS1maWxlCkBAIC0wLDAgKzEsNSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sKKwordG91Y2ggZm9vCittZDVzdW0gZm9vID4gYmFyCitidXN5Ym94IG1kNXN1bSAtYyBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tZGV2LnRlc3RzIGIvdGVzdHN1aXRlL21kZXYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMyMGUxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tZGV2LnRlc3RzCkBAIC0wLDAgKzEsMjI2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyBscyAtbG4gaXMgc2hvd2luZyBkYXRlLiBOZWVkIHRvIHJlbW92ZSB0aGF0LCBpdCdzIHZhcmlhYmxlCisjIHNlZDogKDEpICJtYWosIG1pbiIgLT4gIm1haixtaW4iICgyKSBjb2FsZXNjZSBzcGFjZXMKKyMgY3V0OiByZW1vdmUgZGF0ZQorRklMVEVSX0xTPSJncmVwIC12ICdedG90YWwgJyB8IHNlZCAtZSAncy8sICAqLywvZycgLWUgJ3MvICAqLyAvZycgfCBjdXQgLWQnICcgLWYgMS01LDktIgorIyBjdXQ6IHJlbW92ZSBzaXplK2RhdGUKK0ZJTFRFUl9MUzI9ImdyZXAgLXYgJ150b3RhbCAnIHwgc2VkIC1lICdzLywgICovLC9nJyAtZSAncy8gICovIC9nJyB8IGN1dCAtZCcgJyAtZiAxLTQsOS0iCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworcm0gLXJmIG1kZXYudGVzdGRpcgorbWtkaXIgbWRldi50ZXN0ZGlyCisjIFdlIG5lZWQgbWRldiBleGVjdXRhYmxlIHRvIGJlIGluIGNocm9vdCBqYWlsIQorIyAod2lsbCBzdGlsbCBmYWlsIHdpdGggZHluYW1pY2FsbHkgbGlua2VkIG9uZSwgdGhvdWdoLi4uKQorY3AgLi4vYnVzeWJveCBtZGV2LnRlc3RkaXIvbWRldgorbWtkaXIgbWRldi50ZXN0ZGlyL2JpbgorY3AgLi4vYnVzeWJveCBtZGV2LnRlc3RkaXIvYmluL3NoIDI+L2Rldi9udWxsICMgZm9yIHRlc3RpbmcgY21kIGZlYXR1cmUKK21rZGlyIG1kZXYudGVzdGRpci9ldGMKK21rZGlyIG1kZXYudGVzdGRpci9kZXYKK21rZGlyIC1wIG1kZXYudGVzdGRpci9zeXMvYmxvY2svc2RhCitlY2hvICI4OjAiID5tZGV2LnRlc3RkaXIvc3lzL2Jsb2NrL3NkYS9kZXYKKworIyBlbnYgLSBQQVRIPSRQQVRIOiBvbiBzb21lIHN5c3RlbXMgY2hyb290IGJpbmFyeSB3b24ndCBvdGhlcndpc2UgYmUgZm91bmQKKworb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FCit0ZXN0aW5nICJtZGV2IGFkZCAvYmxvY2svc2RhIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sbiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUyIgXAorIlwKK2Jydy1ydy0tLS0gMSAwIDAgOCwwIHNkYQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY29udGludWluZyB0byB1c2UgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdAorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FCit0ZXN0aW5nICJtZGV2IGRlbGV0ZXMgL2Jsb2NrL3NkYSIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1yZW1vdmUgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG4gbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICIuKiAxOjEgNjY2IiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gInNkYSAyOjIgNDQ0IiA+Pm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgc3RvcHMgb24gZmlyc3QgcnVsZSIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG4gbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCiticnctcnctcnctIDEgMSAxIDgsMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gIi0uKiAxOjEgNjY2IiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gInNkYSAyOjIgNDQ0IiA+Pm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgZG9lcyBub3Qgc3RvcCBvbiBkYXNoLXJ1bGUiIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorYnItLXItLXItLSAxIDIgMiA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJcJE1PREFMSUFTPXF3ICAxOjEgNjY2IiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gIlwkTU9EQUxJQVM9cXcuIDI6MiA0NDQiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gIlwkTU9EQUxJQVM9cXcuIDM6MyA0MDAiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBcJEVOVlZBUj1yZWdleCBtYXRjaCIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIE1PREFMSUFTPXF3ZSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorYnItLXItLXItLSAxIDIgMiA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDQ0NCA+ZGlzay9zY3NpQSIgPm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9NREVWX1JFTkFNRSBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBtb3ZlL3N5bWxpbmsgcnVsZSAnPmJhci9iYXonIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMyIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgZGlzaworbHJ3eHJ3eHJ3eCAxIDAgMCBzZGEgLT4gZGlzay9zY3NpQQorCittZGV2LnRlc3RkaXIvZGV2L2Rpc2s6Citici0tci0tci0tIDEgMCAwIHNjc2lBCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDQ0NCA+ZGlzay8iID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgbW92ZS9zeW1saW5rIHJ1bGUgJz5iYXIvJyIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTMiIgXAorIlwKK21kZXYudGVzdGRpci9kZXY6Citkcnd4ci14ci14IDIgMCAwIGRpc2sKK2xyd3hyd3hyd3ggMSAwIDAgc2RhIC0+IGRpc2svc2RhCisKK21kZXYudGVzdGRpci9kZXYvZGlzazoKK2JyLS1yLS1yLS0gMSAwIDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCisjIGhlcmUgd2UgY29tcGxpY2F0ZSB0aGluZ3MgYnkgaGF2aW5nIG5vbi1tYXRjaGluZyBncm91cCAxIGFuZCB1c2luZyAlMAorZWNobyAicyhbMC05XSkqZChbYS16XSspIDA6MCA2NDQgPnNkLyUyXyUwIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJtZGV2IHJlZ2V4cCBzdWJzdHJpbmcgbWF0Y2ggKyByZXBsYWNlIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMyIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgc2QKK2xyd3hyd3hyd3ggMSAwIDAgc2RhIC0+IHNkL2Ffc2RhCisKK21kZXYudGVzdGRpci9kZXYvc2Q6Citicnctci0tci0tIDEgMCAwIGFfc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDY0NCBAZWNobyBAZWNobyBURVNUIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfRVhFQyBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRSBGRUFUVVJFX1NIX0lTX0FTSAordGVzdGluZyAibWRldiBjb21tYW5kIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCitAZWNobyBURVNUCittZGV2LnRlc3RkaXIvZGV2OgorYnJ3LXItLXItLSAxIDAgMCA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDY0NCA9YmxvY2svIEBlY2hvIEBlY2hvIFRFU1Q6XCRNREVWIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9FWEVDIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfU0hfSVNfQVNICit0ZXN0aW5nICJtZGV2IG1vdmUgYW5kIGNvbW1hbmQiIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuUiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUzIiIFwKKyJcCitAZWNobyBURVNUOmJsb2NrL3NkYQorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgYmxvY2sKKworbWRldi50ZXN0ZGlyL2Rldi9ibG9jazoKK2Jydy1yLS1yLS0gMSAwIDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJAOCwwIDA6MSA2NDQiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgI21haixtaW4gYW5kIG5vIGV4cGxpY2l0IHVpZCIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Jydy1yLS1yLS0gMSAwIDEgOCwwIHNkYQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY29udGludWluZyB0byB1c2UgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdAorcm0gLXJmIG1kZXYudGVzdGRpci9kZXYvKgorbWtkaXIgLXAgbWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaQorZWNobyAiMTkxOjAiID5tZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpL2RldgorbWtkaXIgLXAgbWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaTEKK2VjaG8gIjE5MToxIiA+bWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaTEvZGV2Citta2RpciAtcCBtZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpMjAKK2VjaG8gIjE5MToyMCIgPm1kZXYudGVzdGRpci9zeXMvY2xhc3MvdHR5L2NhcGkyMC9kZXYKK2VjaG8gImNhcGkgICAgICAgICAgICAwOjAgMDY2MCA9Y2FwaTIwIiAgICAgID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorZWNobyAiY2FwaShbMC05XSkgICAgIDA6MCAwNjYwID1jYXBpMjAuMCUxIiA+Pm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitlY2hvICJjYXBpKFswLTldKikgICAgMDowIDA2NjAgPWNhcGkyMC4lMSIgID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKKyMgbWRldiBpbnZvY2F0aW9uIHdpdGggREVWUEFUSD0vY2xhc3MvdHR5L2NhcGkyMCB3YXMgZGVsZXRpbmcgL2Rldi9jYXBpMjAKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJtb3ZlIHJ1bGUgZG9lcyBub3QgZGVsZXRlIG5vZGUgd2l0aCBuYW1lID09IGRldmljZV9uYW1lIiBcCisJIlwKKwllbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vY2xhc3MvdHR5L2NhcGkgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9jbGFzcy90dHkvY2FwaTEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9jbGFzcy90dHkvY2FwaTIwIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Nydy1ydy0tLS0gMSAwIDAgMTkxLDAgY2FwaTIwCitjcnctcnctLS0tIDEgMCAwIDE5MSwxIGNhcGkyMC4wMQorY3J3LXJ3LS0tLSAxIDAgMCAxOTEsMjAgY2FwaTIwLjIwCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjbGVhbiB1cAorcm0gLXJmIG1kZXYudGVzdGRpcgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ta2Rpci9ta2Rpci1tYWtlcy1hLWRpcmVjdG9yeSBiL3Rlc3RzdWl0ZS9ta2Rpci9ta2Rpci1tYWtlcy1hLWRpcmVjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E1YzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLWEtZGlyZWN0b3J5CkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBta2RpciBmb28KK3Rlc3QgLWQgZm9vCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWtkaXIvbWtkaXItbWFrZXMtcGFyZW50LWRpcmVjdG9yaWVzIGIvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLXBhcmVudC1kaXJlY3RvcmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJmYWNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLXBhcmVudC1kaXJlY3RvcmllcwpAQCAtMCwwICsxLDIgQEAKK2J1c3lib3ggbWtkaXIgLXAgZm9vL2JhcgordGVzdCAtZCBmb28gLWEgLWQgZm9vL2JhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21rZnMubWluaXgudGVzdHMgYi90ZXN0c3VpdGUvbWtmcy5taW5peC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YTMzYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21rZnMubWluaXgudGVzdHMKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL3NoCisKKyMgbWtmcy5taW5peCB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJta2ZzLm1pbml4IiBcCisJImRkIGlmPS9kZXYvemVybyBvZj1pbnB1dCBicz0xayBjb3VudD0xMDI0IDI+L2Rldi9udWxsOyBta2ZzLm1pbml4IGlucHV0OyBtZDVzdW0gPGlucHV0IiBcCisiMzUyIGlub2Rlc1xuIlwKKyIxMDI0IGJsb2Nrc1xuIlwKKyJGaXJzdGRhdGF6b25lPTE1ICgxNSlcbiJcCisiWm9uZXNpemU9MTAyNFxuIlwKKyJNYXhzaXplPTI2ODk2NjkxMlxuIlwKKyI0ZjM1ZjdhZmViYTA3ZDU2MDU1YmVkMWYyOWFlMjBiNyAgLVxuIiBcCisJIiIgXAorCSIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21vdW50LnRlc3Ryb290IGIvdGVzdHN1aXRlL21vdW50LnRlc3Ryb290Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMzRjNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbW91bnQudGVzdHJvb3QKQEAgLTAsMCArMSwxODMgQEAKKyMhL2Jpbi9zaAorCisjIFNVU3YzIGNvbXBsaWFudCBtb3VudCBhbmQgdW1vdW50IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitpZiBbIC16ICIkVEVTVERJUiIgXQordGhlbgorICBlY2hvICdOZWVkICRURVNURElSJworICBleGl0IDEKK2ZpCisKK2NkICIkVEVTVERJUiIKKworLiB0ZXN0aW5nLnNoCisKKyMgSWYgd2UgYXJlbid0IFBJRCAxLCBiYXJmLgorCisjaWYgWyAkJCAtbmUgMSBdCisjdGhlbgorIyAgZWNobyAiU0tJUFBFRDogbW91bnQgdGVzdCByZXF1aXJlcyBlbXVsYXRpb24gZW52aXJvbm1lbnQiCisjICBleGl0IDAKKyNmaQorCisjIFJ1biB0ZXN0cyB3aXRoaW4gdGhlIGNocm9vdCBlbnZpcm9ubWVudC4KK2RvY2hyb290IGJhc2ggcm0gbHMgbG4gY2F0IHBzIG1rbm9kIG1rZGlyIGRkIGdyZXAgY21wIGRpZmYgdGFpbCBcCisJbWtmcy5leHQyIG1rZnMudmZhdCBtb3VudCB1bW91bnQgbG9zZXR1cCB3YyA8PCBFT0YKKyMhL2Jpbi9iYXNoCisKKy4gL3Rlc3Rpbmcuc2gKKworbWtub2QgL2Rldi9sb29wMCBiIDcgMAorbWtub2QgL2Rldi9sb29wMSBiIDcgMQorCisjIFdlIG5lZWQgL3Byb2MgdG8gZG8gbXVjaC4gIE1ha2Ugc3VyZSB3ZSBjYW4gbW91bnQgaXQgZXhwbGljaXRseS4KKwordGVzdGluZyAibW91bnQgbm8gcHJvYyBbR05VRkFJTF0iICJtb3VudCAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IC9wcm9jIiAibW91bnQgLXQgcHJvYyAvcHJvYyAvcHJvYyAmJiBscyAtZCAvcHJvYy8xIiBcCisJIi9wcm9jLzFcbiIgIiIgIiIKKworIyBNYWtlIHN1cmUgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIGxpc3QgaXMgL3Byb2MKKwordGVzdGluZyAibW91bnQgbGlzdDEiICJtb3VudCB8IHRhaWwgLW4gMSIgIi9wcm9jIG9uIC9wcm9jIHR5cGUgcHJvYyAocncpXG4iIFwKKwkiIiAiIgorCisKKyMgQ3JlYXRlIGFuIGV4dDIgaW1hZ2UKKworbWtkaXIgLXAgaW1hZ2VzL3tleHQyLmRpcix2ZmF0LmRpcix0ZXN0MSx0ZXN0Mix0ZXN0M30KK2RkIGlmPS9kZXYvemVybyBvZj1pbWFnZXMvZXh0Mi5pbWcgYnM9MU0gY291bnQ9MSAyPiAvZGV2L251bGwKK21rZnMuZXh0MiAtRiAtYiAxMDI0IGltYWdlcy9leHQyLmltZyA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwKK2RkIGlmPS9kZXYvemVybyBvZj1pbWFnZXMvdmZhdC5pbWcgYnM9MU0gY291bnQ9MSAyPiAvZGV2L251bGwKK21rZnMudmZhdCBpbWFnZXMvdmZhdC5pbWcgPiAvZGV2L251bGwKKworIyBUZXN0IG1vdW50IGl0CisKK3Rlc3RpbmcgIm1vdW50IHZmYXQgaW1hZ2UgKGV4cGxpY2l0bHkgYXV0b2RldGVjdCB0eXBlKSIgXAorCSJtb3VudCAtdCBhdXRvIGltYWdlcy92ZmF0LmltZyBpbWFnZXMvdmZhdC5kaXIgJiYgbW91bnQgfCB0YWlsIC1uIDEgfCBncmVwIC1vICd2ZmF0LmRpciB0eXBlIHZmYXQnIiBcCisJInZmYXQuZGlyIHR5cGUgdmZhdFxuIiAiIiAiIgordGVzdGluZyAibW91bnQgZXh0MiBpbWFnZSAoYXV0b2RldGVjdCB0eXBlKSIgXAorCSJtb3VudCBpbWFnZXMvZXh0Mi5pbWcgaW1hZ2VzL2V4dDIuZGlyIDI+IC9kZXYvbnVsbCAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AxIG9uIC9pbWFnZXMvZXh0Mi5kaXIgdHlwZSBleHQyIChydylcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IHJlbW91bnQgZXh0MiBpbWFnZSBub2F0aW1lIiBcCisJIm1vdW50IC1vIHJlbW91bnQsbm9hdGltZSBpbWFnZXMvZXh0Mi5kaXIgJiYgbW91bnQgfCB0YWlsIC1uIDEiIFwKKwkiL2Rldi9sb29wMSBvbiAvaW1hZ2VzL2V4dDIuZGlyIHR5cGUgZXh0MiAocncsbm9hdGltZSlcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IHJlbW91bnQgZXh0MiBpbWFnZSBybyByZW1lbWJlcnMgbm9hdGltZSIgXAorCSJtb3VudCAtbyByZW1vdW50LHJvIGltYWdlcy9leHQyLmRpciAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AxIG9uIC9pbWFnZXMvZXh0Mi5kaXIgdHlwZSBleHQyIChybyxub2F0aW1lKVxuIiAiIiAiIgorCit1bW91bnQgLWQgaW1hZ2VzL3ZmYXQuZGlyCit1bW91bnQgLWQgaW1hZ2VzL2V4dDIuZGlyCisKK3Rlc3RpbmcgIm1vdW50IHVtb3VudCBmcmVlZCBsb29wIGRldmljZSIgXAorCSJtb3VudCBpbWFnZXMvZXh0Mi5pbWcgaW1hZ2VzL2V4dDIuZGlyICYmIG1vdW50IHwgdGFpbCAtbiAxIiBcCisJIi9kZXYvbG9vcDAgb24gL2ltYWdlcy9leHQyLmRpciB0eXBlIGV4dDIgKHJ3KVxuIiAiIiAiIgorCit0ZXN0aW5nICJtb3VudCBibG9jayBkZXZpY2UiIFwKKwkibW91bnQgLXQgZXh0MiAvZGV2L2xvb3AwIGltYWdlcy90ZXN0MSAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AwIG9uIC9pbWFnZXMvdGVzdDEgdHlwZSBleHQyIChydylcbiIgIiIgIiIKKwordW1vdW50IC1kIGltYWdlcy9leHQyLmRpciBpbWFnZXMvdGVzdDEKKwordGVzdGluZyAibW91bnQgcmVtb3VudCBub25leGlzdGVudCBkaXJlY3RvcnkiIFwKKwkibW91bnQgLW8gcmVtb3VudCxub2F0aW1lIGltYWdlcy9leHQyLmRpciAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCisKKyMgRnVuIHdpdGggbW91bnQgLWEKKwordGVzdGluZyAibW91bnQgLWEgbm8gZnN0YWIiICJtb3VudCAtYSAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCit1bW91bnQgL3Byb2MKKworIyBUaGUgZmlyc3QgZmllbGQgaXMgc3BhY2UgZGVsaW1pdGVkLCB0aGUgcmVzdCB0YWJzLgorCitjYXQgPiAvZXRjL2ZzdGFiIDw8IEZTVEFCCisvcHJvYyAgICAgICAgICAgICAvcHJvYwkJCXByb2MJZGVmYXVsdHMJMAkwCisjIEF1dG9kZXRlY3QgbG9vcCwgYW5kIHByb3ZpZGUgZmxhZ3Mgd2l0aCBjb21tYXMgaW4gdGhlbS4KKy9pbWFnZXMvZXh0Mi5pbWcgIC9pbWFnZXMvZXh0Mi5kaXIJZXh0Mglub2F0aW1lLG5vZGV2CTAJMAorIyBhdXRvZGV0ZWN0IGZpbGVzeXN0ZW0sIGZsYWdzIHdpdGhvdXQgY29tbWFzLgorL2ltYWdlcy92ZmF0LmltZyAgL2ltYWdlcy92ZmF0LmRpcglhdXRvCXJvCQkwCTAKKyMgQSBibG9jayBkZXZpY2UKKy9kZXYvbG9vcDIgICAgICAgIC9pbWFnZXMvdGVzdDEJCWF1dG8JZGVmYXVsdHMJMAkwCisjIHRtcGZzLCBmaWxlc3lzdGVtIHNwZWNpZmljIGZsYWcuCit3YWxydXMJCSAgL2ltYWdlcy90ZXN0MgkJdG1wZnMJc2l6ZT00MgkJMAkwCisjIEF1dG9kZXRlY3QgYSBiaW5kIG1vdW50LgorL2ltYWdlcy90ZXN0MiAgICAgL2ltYWdlcy90ZXN0MwkJYXV0bwlkZWZhdWx0cwkwCTAKK0ZTVEFCCisKKyMgUHV0IHNvbWV0aGluZyBvbiBsb29wMi4KK21rbm9kIC9kZXYvbG9vcDIgYiA3IDIKK2NhdCBpbWFnZXMvZXh0Mi5pbWcgPiBpbWFnZXMvZXh0Mi0yLmltZworbG9zZXR1cCAvZGV2L2xvb3AyIGltYWdlcy9leHQyLTIuaW1nCisKK3Rlc3RpbmcgIm1vdW50IC1hIiAibW91bnQgLWEgJiYgZWNobyBoZWxsbyA+IC9pbWFnZXMvdGVzdDIvYWJjICYmIGNhdCAvaW1hZ2VzL3Rlc3QzL2FiYyAmJiAobW91bnQgfCB3YyAtbCkiICJoZWxsb1xuOFxuIiAiIiAiIgorCit0ZXN0aW5nICJ1bW91bnQgLWEiICJ1bW91bnQgLWEgJiYgbHMgL3Byb2MiICIiICIiICIiCisKKyMvYmluL2Jhc2ggPCAvZGV2L3R0eSA+IC9kZXYvdHR5IDI+IC9kZXYvdHR5Citta25vZCAvZGV2L2NvbnNvbGUgYyA1IDEKKy9iaW4vYmFzaCA8IC9kZXYvY29uc29sZSA+IC9kZXYvY29uc29sZSAyPiAvZGV2L2NvbnNvbGUKK0VPRgorCitleGl0IDAKKworIyBSdW4gc29tZSB0ZXN0cworCitsb3NldHVwIG5vbmV4aXN0ZW50IGRldmljZSAoc2hvdWxkIHJldHVybiBlcnJvciAyKQorbG9zZXR1cCB1bmJvdW5kIGxvb3AgZGV2aWNlIChzaG91bGQgcmV0dXJuIGVycm9yIDEpCitsb3NldHVwIGJpbmQgZmlsZSB0byBsb29wIGRldmljZQorbG9zZXR1cCBib3VuZCBsb29wIGRldmljZSAoZGlzcGxheSkgIChzaG91bGQgcmV0dXJuIGVycm9yIDApCitsb3NldHVwIGZpbGVuYW1lIChlcnJvcikKK2xvc2V0dXAgbm9maWxlIChmaWxlIG5vdCBmb3VuZCkKK2xvc2V0dXAgLWQKK2xvc2V0dXAgYmluZCB3aXRoIG9mZnNldAorbG9zZXR1cCAtZiAocHJpbnQgZmlyc3QgbG9vcCBkZXZpY2UpCitsb3NldHVwIC1mIGZpbGVuYW1lIChhc3NvY2lhdGUgZmlsZSB3aXRoIGZpcnN0IGxvb3AgZGV2aWNlKQorbG9zZXR1cCAtbyAocGFzdCBlbmQgb2YgZmlsZSkgLWYgZmlsZW5hbWUKKworbW91bnQgLWEKKyAgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGluIGZzdGFiCisgIHdpdGggZHVwbGljYXRlIGVudHJpZXMgaW4gZnN0YWIKKyAgd2l0aCByZWxhdGl2ZSBwYXRocyBpbiBmc3RhYgorICB3aXRoIHVzZXIgZW50cmllcyBpbiBmc3RhYgorbW91bnQgLW8gYXN5bmMsc3luYyxhdGltZSxub2F0aW1lLGRldixub2RldixleGVjLG5vZXhlYyxsb29wLHN1aWQsbm9zdWlkLHJlbW91bnQscm8scncsYmluZCxtb3ZlCittb3VudCAtcgorbW91bnQgLW8gcncgLXIKK21vdW50IC13IC1vIHJvCittb3VudCAtdCBhdXRvCisKK21vdW50IHdpdGggcmVsYXRpdmUgcGF0aCBpbiBmc3RhYgorbW91bnQgYmxvY2sgZGV2aWNlCittb3VudCBjaGFyIGRldmljZQorbW91bnQgZmlsZSAoYXV0b2xvb3ApCittb3VudCBkaXJlY3RvcnkgKGF1dG9iaW5kKQorCisKK3Rlc3RpbmcgInVtb3VudCB3aXRoIG5vIC9wcm9jIgordGVzdGluZyAidW1vdW50IGN1cmRpciIKKworIyBUaGUgYmFzaWMgdGVzdHMuICBUaGVzZSBzaG91bGQgd29yayBldmVuIHdpdGggdGhlIHNtYWxsIGJ1c3lib3guCisKK3Rlc3RpbmcgInNvcnQiICJpbnB1dCIgImFcbmJcbmNcbiIgImNcbmFcbmJcbiIgIiIKK3Rlc3RpbmcgInNvcnQgIzIiICJpbnB1dCIgIjAxMFxuMVxuM1xuIiAiM1xuMVxuMDEwXG4iICIiCit0ZXN0aW5nICJzb3J0IHN0ZGluIiAiIiAiYVxuYlxuY1xuIiAiIiAiYlxuYVxuY1xuIgordGVzdGluZyAic29ydCBudW1lcmljIiAiLW4gaW5wdXQiICIxXG4zXG4wMTBcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAic29ydCByZXZlcnNlIiAiLXIgaW5wdXQiICJ3b29rXG53YWxydXNcbnBvaW50XG5wYWJzdFxuYWFyZ2hcbiIgXAorCSJwb2ludFxud29va1xucGFic3RcbmFhcmdoXG53YWxydXNcbiIgIiIKKworb3B0aW9uYWwgRkVBVFVSRV9NT1VOVF9MT09QCit0ZXN0aW5nICJ1bW91bnQgLUQiCisKK29wdGlvbmFsIEZFQVRVUkVfTVRBQl9TVVBQT1JUCitvcHRpb25hbCBGRUFUVVJFX01PVU5UX05GUworIyBObyBpZGVhIHdoYXQgdG8gdGVzdCBoZXJlLgorCitvcHRpb25hbCBVTU9VTlQKK29wdGlvbmFsIEZFQVRVUkVfVU1PVU5UX0FMTAordGVzdGluZyAidW1vdW50IC1hIgordGVzdGluZyAidW1vdW50IC1yIgordGVzdGluZyAidW1vdW50IC1sIgordGVzdGluZyAidW1vdW50IC1mIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tb3VudC50ZXN0cyBiL3Rlc3RzdWl0ZS9tb3VudC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTg5MWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21vdW50LnRlc3RzCkBAIC0wLDAgKzEsODYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAordGVzdCAtZiAiJGJpbmRpci8uY29uZmlnIiAmJiAuICIkYmluZGlyLy5jb25maWciCisKK3Rlc3QgImBpZCAtdWAiID0gMCB8fCB7CisJZWNobyAiU0tJUFBFRDogbW91bnQgKG11c3QgYmUgcm9vdCB0byB0ZXN0IHRoaXMpIgorCWV4aXQgMAorfQorCitpZiB0ZXN0IHgiJENPTkZJR19NS0ZTX01JTklYIiAhPSB4InkiIFwKK3x8IHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTUlOSVgyIiAhPSB4InkiIFwKK3x8IHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCIgIT0geCJ5IiBcCit8fCB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIiAhPSB4InkiIFwKK3x8IHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfREVWRlMiID0geCJ5IiBcCis7IHRoZW4KKwllY2hvICJTS0lQUEVEOiBtb3VudCIKKwlleGl0IDAKK2ZpCisKK3Rlc3RkaXI9IiRQV0QvbW91bnQudGVzdGRpciIKKworZGQgaWY9L2Rldi96ZXJvIG9mPW1vdW50LmltYWdlMW0gY291bnQ9MSBicz0xTSAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gImRkIGVycm9yIjsgZXhpdCAxOyB9Citta2ZzLm1pbml4IC12IG1vdW50LmltYWdlMW0gPi9kZXYvbnVsbCAyPiYxIHx8IHsgZWNobyAibWtmcy5taW5peCBlcnJvciI7IGV4aXQgMTsgfQorbW9kcHJvYmUgbWluaXggMj4vZGV2L251bGwKK21rZGlyICIkdGVzdGRpciIgMj4vZGV2L251bGwKK3Vtb3VudCAtZCAiJHRlc3RkaXIiIDI+L2Rldi9udWxsCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCit0ZXN0aW5nICJtb3VudCAtbyByZW1vdW50LG1hbmQiIFwKKyJtb3VudCAtbyBsb29wIG1vdW50LmltYWdlMW0gJHRlc3RkaXIgIlwKKyImJiBncmVwIC1GYyAkdGVzdGRpciA8L3Byb2MvbW91bnRzICJcCisiJiYgbW91bnQgLW8gcmVtb3VudCxtYW5kICR0ZXN0ZGlyICJcCisiJiYgZ3JlcCAtRiAkdGVzdGRpciA8L3Byb2MvbW91bnRzIHwgZ3JlcCAtYyAnWywgXW1hbmRbLCBdJyIgXAorCSIxXG4iIjFcbiIgXAorCSIiICIiCisKK3Vtb3VudCAtZCAiJHRlc3RkaXIiCitybWRpciAiJHRlc3RkaXIiCitybSBtb3VudC5pbWFnZTFtCisKKworIyBCdWc6IG1vdW50LnNoYXJlZDEgZGlyZWN0b3J5IHNob3dzIG5vIGZpbGVzIChoYXMgdG8gc2hvdyBmaWxlcyBhIGFuZCBiKQorb3B0aW9uYWwgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgIm1vdW50IGJpbmQrcnNoYXJlZCIgIlwKK21rZGlyIC1wIG1vdW50LmRpciBtb3VudC5zaGFyZWQxIG1vdW50LnNoYXJlZDIKK3RvdWNoIG1vdW50LmRpci9hIG1vdW50LmRpci9iCisKK21vdW50IC0tYmluZCAgICAgICAgIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMSAyPiYxCittb3VudCAtLW1ha2UtcnNoYXJlZCBtb3VudC5zaGFyZWQxICAgICAgICAgICAgICAgMj4mMQorbW91bnQgLS1iaW5kICAgICAgICAgbW91bnQuc2hhcmVkMiBtb3VudC5zaGFyZWQyIDI+JjEKK21vdW50IC0tbWFrZS1yc2hhcmVkIG1vdW50LnNoYXJlZDIgICAgICAgICAgICAgICAyPiYxCisKK21vdW50IC0tYmluZCBtb3VudC5zaGFyZWQyIG1vdW50LnNoYXJlZDEgICAgICAgICAyPiYxCittb3VudCAtLWJpbmQgbW91bnQuZGlyICAgICBtb3VudC5zaGFyZWQyICAgICAgICAgMj4mMQorCitscyAtUiBtb3VudC5kaXIgbW91bnQuc2hhcmVkMSBtb3VudC5zaGFyZWQyICAgICAgMj4mMQorCit1bW91bnQgbW91bnQuZGlyIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMiAyPi9kZXYvbnVsbAordW1vdW50IG1vdW50LmRpciBtb3VudC5zaGFyZWQxIG1vdW50LnNoYXJlZDIgMj4vZGV2L251bGwKK3Vtb3VudCBtb3VudC5kaXIgbW91bnQuc2hhcmVkMSBtb3VudC5zaGFyZWQyIDI+L2Rldi9udWxsCitybSAtZiBtb3VudC5kaXIvYSBtb3VudC5kaXIvYiBtb3VudC5kaXIvYworcm1kaXIgbW91bnQuZGlyIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMgorIiBcCisiXAorbW91bnQuZGlyOgorYQorYgorCittb3VudC5zaGFyZWQxOgorYQorYgorCittb3VudC5zaGFyZWQyOgorYQorYgorIiBcCisJIiIgIiIKK1NLSVA9CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21zaC9tc2gtc3VwcG9ydHMtdW5kZXJzY29yZXMtaW4tdmFyaWFibGUtbmFtZXMgYi90ZXN0c3VpdGUvbXNoL21zaC1zdXBwb3J0cy11bmRlcnNjb3Jlcy1pbi12YXJpYWJsZS1uYW1lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzc4MzRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21zaC9tc2gtc3VwcG9ydHMtdW5kZXJzY29yZXMtaW4tdmFyaWFibGUtbmFtZXMKQEAgLTAsMCArMSBAQAordGVzdCAiYGJ1c3lib3ggbXNoIC1jICdGT09fQkFSPWZvbzsgZWNobyAkRk9PX0JBUidgIiA9IGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LWZpbGVzLXRvLWRpciBiL3Rlc3RzdWl0ZS9tdi9tdi1maWxlcy10by1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1NjdmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1maWxlcy10by1kaXIKQEAgLTAsMCArMSwxNiBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKK1RaPVVUQzAgdG91Y2ggLWQgJzIwMDAtMDEtMzAgMDU6MjQ6MDgnIGRpcjEvZmlsZTMKK21rZGlyIHRoZXJlCitidXN5Ym94IG12IGZpbGUxIGZpbGUyIGxpbmsxIGRpcjEgdGhlcmUKK3Rlc3QgLWYgdGhlcmUvZmlsZTEKK3Rlc3QgLWYgdGhlcmUvZmlsZTIKK3Rlc3QgLWYgdGhlcmUvZGlyMS9maWxlMwordGVzdCAtTCB0aGVyZS9saW5rMQordGVzdCB4ZmlsZTIgPSB4YHJlYWRsaW5rIHRoZXJlL2xpbmsxYAordGVzdCAhIC1lIGZpbGUxCit0ZXN0ICEgLWUgZmlsZTIKK3Rlc3QgISAtZSBsaW5rMQordGVzdCAhIC1lIGRpcjEvZmlsZTMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tdi9tdi1mb2xsb3dzLWxpbmtzIGIvdGVzdHN1aXRlL212L212LWZvbGxvd3MtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1mb2xsb3dzLWxpbmtzCkBAIC0wLDAgKzEsNCBAQAordG91Y2ggZm9vCitsbiAtcyBmb28gYmFyCitidXN5Ym94IG12IGJhciBiYXoKK3Rlc3QgLWYgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZW1wdHktZmlsZSBiL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1lbXB0eS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZW1wdHktZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RvdWNoIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LW1vdmVzLWZpbGUgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGI0YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL212L212LW1vdmVzLWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggbXYgZm9vIGJhcgordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1oYXJkbGlua3MgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtaGFyZGxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTgyMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtaGFyZGxpbmtzCkBAIC0wLDAgKzEsNCBAQAordG91Y2ggZm9vCitsbiBmb28gYmFyCitidXN5Ym94IG12IGJhciBiYXoKK3Rlc3QgISAtZiBiYXIgLWEgLWYgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtbGFyZ2UtZmlsZSBiL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1sYXJnZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDA4OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtbGFyZ2UtZmlsZQpAQCAtMCwwICsxLDQgQEAKK2RkIGlmPS9kZXYvemVybyBvZj1mb28gc2Vlaz0xMGsgY291bnQ9MSAyPi9kZXYvbnVsbAorYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LW1vdmVzLXNtYWxsLWZpbGUgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtc21hbGwtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVjN2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL212L212LW1vdmVzLXNtYWxsLWZpbGUKQEAgLTAsMCArMSw0IEBACitlY2hvIEkgV0FOVCA+IGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LW1vdmVzLXN5bWxpbmtzIGIvdGVzdHN1aXRlL212L212LW1vdmVzLXN5bWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTNhZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtc3ltbGlua3MKQEAgLTAsMCArMSw2IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggbXYgYmFyIGJhegordGVzdCAtZiBmb28KK3Rlc3QgISAtZSBiYXIKK3Rlc3QgLUwgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtdW5yZWFkYWJsZS1maWxlcyBiL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy11bnJlYWRhYmxlLWZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtdW5yZWFkYWJsZS1maWxlcwpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbworY2htb2QgYS1yIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1oYXJkLWxpbmtzIGIvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1oYXJkLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmEzYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtcHJlc2VydmVzLWhhcmQtbGlua3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUwordG91Y2ggZm9vCitsbiBmb28gYmFyCitta2RpciBiYXoKK2J1c3lib3ggbXYgZm9vIGJhciBiYXoKK3Rlc3QgYmF6L2ZvbyAtZWYgYmF6L2JhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1saW5rcyBiL3Rlc3RzdWl0ZS9tdi9tdi1wcmVzZXJ2ZXMtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1NjVkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1wcmVzZXJ2ZXMtbGlua3MKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggbXYgYmFyIGJhegordGVzdCAtTCBiYXoKK3Rlc3QgeGZvbyA9IHhgcmVhZGxpbmsgYmF6YApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LXJlZnVzZXMtbXYtZGlyLXRvLXN1YmRpciBiL3Rlc3RzdWl0ZS9tdi9tdi1yZWZ1c2VzLW12LWRpci10by1zdWJkaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZDEzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1yZWZ1c2VzLW12LWRpci10by1zdWJkaXIKQEAgLTAsMCArMSwyMyBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKK1RaPVVUQzAgdG91Y2ggLWQgJzIwMDAtMDEtMzAgMDU6MjQ6MDgnIGRpcjEvZmlsZTMKK21rZGlyIHRoZXJlCitidXN5Ym94IG12IGZpbGUxIGZpbGUyIGxpbmsxIGRpcjEgdGhlcmUKK3Rlc3QgLWYgdGhlcmUvZmlsZTEKK3Rlc3QgLWYgdGhlcmUvZmlsZTIKK3Rlc3QgLWYgdGhlcmUvZGlyMS9maWxlMwordGVzdCAtTCB0aGVyZS9saW5rMQordGVzdCB4ZmlsZTIgPSB4YHJlYWRsaW5rIHRoZXJlL2xpbmsxYAordGVzdCAhIC1lIGZpbGUxCit0ZXN0ICEgLWUgZmlsZTIKK3Rlc3QgISAtZSBsaW5rMQordGVzdCAhIC1lIGRpcjEvZmlsZTMKK3NldCArZQorYnVzeWJveCBtdiB0aGVyZSB0aGVyZS9kaXIxCitpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKwlleGl0IDA7CitmaQorCitleGl0IDE7CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtcmVtb3Zlcy1zb3VyY2UtZmlsZSBiL3Rlc3RzdWl0ZS9tdi9tdi1yZW1vdmVzLXNvdXJjZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtcmVtb3Zlcy1zb3VyY2UtZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RvdWNoIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL29kLnRlc3RzIGIvdGVzdHN1aXRlL29kLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhOWRhM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvb2QudGVzdHMKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZHMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK29wdGlvbmFsIERFU0tUT1AKK3Rlc3RpbmcgIm9kIC1iIiBcCisJIm9kIC1iIiBcCisiXAorMDAwMDAwMCAxMTAgMTA1IDExNCAxMTQgMTE3CiswMDAwMDA1CisiIFwKKwkiIiAiSEVMTE8iCitTS0lQPQorCitvcHRpb25hbCBERVNLVE9QIExPTkdfT1BUUwordGVzdGluZyAib2QgLWIgLS10cmFkaXRpb25hbCIgXAorCSJvZCAtYiAtLXRyYWRpdGlvbmFsIiBcCisiXAorMDAwMDAwMCAxMTAgMTA1IDExNCAxMTQgMTE3CiswMDAwMDA1CisiIFwKKwkiIiAiSEVMTE8iCitTS0lQPQorCitvcHRpb25hbCBERVNLVE9QIExPTkdfT1BUUwordGVzdGluZyAib2QgLWIgLS10cmFkaXRpb25hbCBGSUxFIiBcCisJIm9kIC1iIC0tdHJhZGl0aW9uYWwgaW5wdXQiIFwKKyJcCiswMDAwMDAwIDExMCAxMDUgMTE0IDExNCAxMTcKKzAwMDAwMDUKKyIgXAorCSJIRUxMTyIgIiIKK1NLSVA9CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3BhcnNlLnRlc3RzIGIvdGVzdHN1aXRlL3BhcnNlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwNGUxYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcGFyc2UudGVzdHMKQEAgLTAsMCArMSwxMTAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK0NPTExBUFNFPSQoKCAweDAwMDEwMDAwKSkKK1RSSU09JCgoICAgICAweDAwMDIwMDAwKSkKK0dSRUVEWT0kKCggICAweDAwMDQwMDAwKSkKK01JTl9ESUU9JCgoICAweDAwMTAwMDAwKSkKK0tFRVBfQ09QWT0kKCgweDAwMjAwMDAwKSkKK0VTQ0FQRT0kKCggICAweDAwNDAwMDAwKSkKK05PUk1BTD0kKCggICBDT0xMQVBTRSB8IFRSSU0gfCBHUkVFRFkpKQorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJwYXJzZSBtZGV2LmNvbmYiIFwKKwkicGFyc2UgLW4gNCAtbSAzIC1mICQoKE5PUk1BTCkpIC0iIFwKKwkiW3NkYV1bMDowXVs2NDRdW0BlY2hvIEBlY2hvIFRFU1RdXG4iIFwKKwkiLSIgXAorCSIgc2RhIDA6MCA2NDQgQGVjaG8gQGVjaG8gVEVTVCAjIGVjaG8gdHJhcFxuIgorCit0ZXN0aW5nICJwYXJzZSBub3RyaW0iIFwKKwkicGFyc2UgLW4gNCAtbSAzIC1mICQoKE5PUk1BTCAtIFRSSU0gLSBDT0xMQVBTRSkpIC0iIFwKKwkiW11bc2RhXVswOjBdWzY0NCBAZWNobyBAZWNobyBURVNUIF1cbiIgXAorCSItIiBcCisJIiBzZGEgMDowIDY0NCBAZWNobyBAZWNobyBURVNUIFxuIgorCitGSUxFPV9fcGFyc2UKK2NhdCA+JEZJTEUgPDxFT0YKKyMKKyMgRGV2aWNlICAgICAgICAgUG9pbnQgICAgICAgICAgICAgICBTeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKy9kZXYvaGRiMyAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICBleHQyICAgICAgICAgICAgICAgICBkZWZhdWx0cyAgICAgIDEgICAgICAgICAgMAorICAgL2Rldi9oZGIxICAgICAgIC9kb3NjICAgICAgICAgICAgICAgaHBmcyAgICAgICAgICAgICAgICAgcm8gICAgICAxICAgICAgICAgIDAKKyAvZGV2L2ZkMCAgICAgICAgICAvZG9zYSAgICAgICAgICAgICAgdmZhdCAgICAgICAgICAgICAgICAgIHJ3LHVzZXIsbm9hdXRvLG5vaGlkZQkgMAkJMAorCS9kZXYvZmQxICAgICAgICAgIC9kb3NiICAgICAgICAgICAgICB2ZmF0ICAgICAgICAgICAgICAgICAgcncsdXNlcixub2F1dG8sbm9oaWRlCSAwCQkwCisjCisgL2Rldi9jZHJvbSAgICAgL2Nkcm9tICAgICAgICAgICAgaXNvOTY2MCAgICAgICAgICBybyx1c2VyLG5vYXV0byxub2hpZGUJIDAJCTAKKy9kZXYvaGRiNSAgICAgICAvcmVkaGF0ICAgICAgICAgICAgZXh0MiAgICAgICAgICAgICAgICAgcncscm9vdCxub2F1dG8sbm9oaWRlCSAwCQkwICNzc3NkCisJL2Rldi9oZGI2ICAgICAgIC93aW4yaG9tZSAgICAgbnRmcyAgICAgICAgICAgICAgICAgIHJ3LHJvb3Qsbm9hdXRvLG5vaGlkZQkgMAkJMCMgc3Nkc2QKKy9kZXYvaGRiNyAgICAgICAvd2luMnNrdWwgICAgICAgIG50ZnMgICAgICAgICAgICAgICAgICBydyxyb290LG5vYXV0byxub2hpZGUgbm9uZQkgMAkJMAorbm9uZSAgICAgL2Rldi9wdHMgICAgICAgICAgIGRldnB0cyAgICAgICAgICAgICBnaWQ9NSxtb2RlPTYyMCAgICAgICAgICAgICAgICAgMCAgICAwIAorICAgICBub25lICAgICAgICAgICAgICAgIC9wcm9jICAgICAgICAgICAgICAgcHJvYyAgICAgICAgICAgICAgICBkZWZhdWx0cyAgICAgMCAgICAgICAgICAwCitFT0YKKworY2F0ID4kRklMRS5yZXMgPDxFT0YKK1svZGV2L2hkYjNdWy9dW2V4dDJdW2RlZmF1bHRzXVsxXVswXQorWy9kZXYvaGRiMV1bL2Rvc2NdW2hwZnNdW3JvXVsxXVswXQorWy9kZXYvZmQwXVsvZG9zYV1bdmZhdF1bcncsdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvZmQxXVsvZG9zYl1bdmZhdF1bcncsdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvY2Ryb21dWy9jZHJvbV1baXNvOTY2MF1bcm8sdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvaGRiNV1bL3JlZGhhdF1bZXh0Ml1bcncscm9vdCxub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvaGRiNl1bL3dpbjJob21lXVtudGZzXVtydyxyb290LG5vYXV0byxub2hpZGVdWzBdWzBdCitbL2Rldi9oZGI3XVsvd2luMnNrdWxdW250ZnNdW3J3LHJvb3Qsbm9hdXRvLG5vaGlkZV1bbm9uZV1bMAkJMF0KK1tub25lXVsvZGV2L3B0c11bZGV2cHRzXVtnaWQ9NSxtb2RlPTYyMF1bMF1bMF0KK1tub25lXVsvcHJvY11bcHJvY11bZGVmYXVsdHNdWzBdWzBdCitFT0YKKwordGVzdGluZyAicGFyc2UgcG9sbHV0ZWQgZnN0YWIiIFwKKwkicGFyc2UgLW4gNiAtbSA2ICRGSUxFIiBcCisJImBjYXQgJEZJTEUucmVzYFxuIiBcCisJIiIgXAorCSIiCitjcCAuLi9leGFtcGxlcy9pbml0dGFiICRGSUxFCitjYXQgPiRGSUxFLnJlcyA8PEVPRgorW11bXVtzeXNpbml0XVsvZXRjL2luaXQuZC9yY1NdCitbXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHkyXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHkzXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHk0XVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHk0XVtdW3Jlc3Bhd25dWy9zYmluL2dldHR5IDM4NDAwIHR0eTVdCitbdHR5NV1bXVtyZXNwYXduXVsvc2Jpbi9nZXR0eSAzODQwMCB0dHk2XQorW11bXVtyZXN0YXJ0XVsvc2Jpbi9pbml0XQorW11bXVtjdHJsYWx0ZGVsXVsvc2Jpbi9yZWJvb3RdCitbXVtdW3NodXRkb3duXVsvYmluL3Vtb3VudCAtYSAtcl0KK1tdW11bc2h1dGRvd25dWy9zYmluL3N3YXBvZmYgLWFdCitFT0YKKwordGVzdGluZyAicGFyc2UgaW5pdHRhYiBmcm9tIGV4YW1wbGVzIiBcCisJInBhcnNlIC1uIDQgLW0gNCAtZiAkKChOT1JNQUwgLSBUUklNIC0gQ09MTEFQU0UpKSAtZCcjOicgJEZJTEUiIFwKKwkiYGNhdCAkRklMRS5yZXNgXG4iIFwKKwkiIiBcCisJIiIKKworY3AgLi4vZXhhbXBsZXMvdWRoY3AvdWRoY3BkLmNvbmYgJEZJTEUKK2NhdCA+JEZJTEUucmVzIDw8RU9GCitbc3RhcnRdWzE5Mi4xNjguMC4yMF0KK1tlbmRdWzE5Mi4xNjguMC4yNTRdCitbaW50ZXJmYWNlXVtldGgwXQorW29wdF1bZG5zXVsxOTIuMTY4LjEwLjJdWzE5Mi4xNjguMTAuMTBdCitbb3B0aW9uXVtzdWJuZXRdWzI1NS4yNTUuMjU1LjBdCitbb3B0XVtyb3V0ZXJdWzE5Mi4xNjguMTAuMl0KK1tvcHRdW3dpbnNdWzE5Mi4xNjguMTAuMTBdCitbb3B0aW9uXVtkbnNdWzEyOS4yMTkuMTMuODFdCitbb3B0aW9uXVtkb21haW5dW2xvY2FsXQorW29wdGlvbl1bbGVhc2VdWzg2NDAwMF0KK1tvcHRpb25dWzB4MDhdWzAxMDIwMzA0XQorRU9GCisKK3Rlc3RpbmcgInBhcnNlIHVkaGNwZC5jb25mIGZyb20gZXhhbXBsZXMiIFwKKwkicGFyc2UgLW4gMTI3ICRGSUxFIiBcCisJImBjYXQgJEZJTEUucmVzYFxuIiBcCisJIiIgXAorCSIiCisKK3JtIC1mICRGSUxFICRGSUxFLnJlcworCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9wYXRjaC50ZXN0cyBiL3Rlc3RzdWl0ZS9wYXRjaC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNjA0YjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3BhdGNoLnRlc3RzCkBAIC0wLDAgKzEsMjE3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kKHMpIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJwYXRjaCB3aXRoIG9sZF9maWxlID09IG5ld19maWxlIiBcCisJJ3BhdGNoIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK3F3ZQorYXNkCit6eGMKKyIgXAorIlwKK3F3ZQorenhjCisiIFwKKyJcCistLS0gaW5wdXQJSmFuIDAxIDAxOjAxOjAxIDIwMDAKKysrKyBpbnB1dAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorQEAgLTEsMiArMSwzIEBACisgcXdlCisrYXNkCisgenhjCisiIFwKKwordGVzdGluZyAicGF0Y2ggd2l0aCBub25leGlzdGVudCBvbGRfZmlsZSIgXAorCSdwYXRjaCAyPiYxOyBlY2hvICQ/OyBjYXQgaW5wdXQnIFwKKyJcCitwYXRjaGluZyBmaWxlIGlucHV0CiswCitxd2UKK2FzZAorenhjCisiIFwKKyJcCitxd2UKK3p4YworIiBcCisiXAorLS0tIGlucHV0LmRvZXNudF9leGlzdAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBxd2UKKythc2QKKyB6eGMKKyIgXAorCit0ZXN0aW5nICJwYXRjaCAtUiB3aXRoIG5vbmV4aXN0ZW50IG9sZF9maWxlIiBcCisJJ3BhdGNoIC1SIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK3F3ZQorenhjCisiIFwKKyJcCitxd2UKK2FzZAorenhjCisiIFwKKyJcCistLS0gaW5wdXQuZG9lc250X2V4aXN0CUphbiAwMSAwMTowMTowMSAyMDAwCisrKysgaW5wdXQJSmFuIDAxIDAxOjAxOjAxIDIwMDAKK0BAIC0xLDIgKzEsMyBAQAorIHF3ZQorK2FzZAorIHp4YworIiBcCisKK3Rlc3RpbmcgInBhdGNoIGRldGVjdHMgYWxyZWFkeSBhcHBsaWVkIGh1bmsiIFwKKwkncGF0Y2ggMj4mMTsgZWNobyAkPzsgY2F0IGlucHV0JyBcCisiXAorUG9zc2libHkgcmV2ZXJzZWQgaHVuayAxIGF0IDQKK0h1bmsgMSBGQUlMRUQgMS8xLgorIGFiYworK2RlZgorIDEyMworcGF0Y2hpbmcgZmlsZSBpbnB1dAorMQorYWJjCitkZWYKKzEyMworIiBcCisiXAorYWJjCitkZWYKKzEyMworIiBcCisiXAorLS0tIGlucHV0Lm9sZAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKytkZWYKKyAxMjMKKyIgXAorCit0ZXN0aW5nICJwYXRjaCBkZXRlY3RzIGFscmVhZHkgYXBwbGllZCBodW5rIGF0IHRoZSBFT0YiIFwKKwkncGF0Y2ggMj4mMTsgZWNobyAkPzsgY2F0IGlucHV0JyBcCisiXAorUG9zc2libHkgcmV2ZXJzZWQgaHVuayAxIGF0IDQKK0h1bmsgMSBGQUlMRUQgMS8xLgorIGFiYworIDEyMworKzQ1NgorcGF0Y2hpbmcgZmlsZSBpbnB1dAorMQorYWJjCisxMjMKKzQ1NgorIiBcCisiXAorYWJjCisxMjMKKzQ1NgorIiBcCisiXAorLS0tIGlucHV0Lm9sZAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKyAxMjMKKys0NTYKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCAtTiBpZ25vcmVzIGFscmVhZHkgYXBwbGllZCBodW5rIiBcCisJJ3BhdGNoIC1OIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK2FiYworZGVmCisxMjMKKyIgXAorIlwKK2FiYworZGVmCisxMjMKKyIgXAorIlwKKy0tLSBpbnB1dAorKysrIGlucHV0CitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKytkZWYKKyAxMjMKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCBGSUxFIFBBVENIIiBcCisJJ2NhdCA+YS5wYXRjaDsgcGF0Y2ggaW5wdXQgYS5wYXRjaCAyPiYxOyBlY2hvICQ/OyBjYXQgaW5wdXQ7IHJtIGEucGF0Y2gnIFwKKyJcCitwYXRjaGluZyBmaWxlIGlucHV0CiswCithYmMKK2RlZgorMTIzCisiIFwKKyJcCithYmMKKzEyMworIiBcCisiXAorLS0tIGZvby5vbGQKKysrKyBmb28KK0BAIC0xLDIgKzEsMyBAQAorIGFiYworK2RlZgorIDEyMworIiBcCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZChzKSIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKK3Rlc3RpbmcgInBhdGNoIGF0IHRoZSBiZWdpbm5pbmciIFwKKwkncGF0Y2ggMj4mMTsgY2F0IGlucHV0JyBcCisiXAorcGF0Y2hpbmcgZmlsZSBpbnB1dAorMTExY2hhbmdlZAorNDQ0Cis1NTUKKzY2NgorNzc3Cis4ODgKKzk5OQorIiBcCisiXAorMTExCisyMjIKKzMzMworNDQ0Cis1NTUKKzY2NgorNzc3Cis4ODgKKzk5OQorIiBcCisiXAorLS0tIGlucHV0CisrKysgaW5wdXQKK0BAIC0xLDYgKzEsNCBAQAorLTExMQorLTIyMgorLTMzMworKzExMWNoYW5nZWQKKyA0NDQKKyA1NTUKKyA2NjYKKyIgXAorCitybSBpbnB1dC5vcmlnIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3BpZG9mLnRlc3RzIGIvdGVzdHN1aXRlL3BpZG9mLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMDZkMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcGlkb2YudGVzdHMKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKKyMgcGlkb2YgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisjIEFVRElUOgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInBpZG9mIChleGl0IHdpdGggZXJyb3IpIiBcCisJInBpZG9mIHZlcnl1bmxpa2VseW9jY3VyaW5nYmluYXJ5bmFtZSA7IGVjaG8gXCQ/IiAiMVxuIiAiIiAiIgordGVzdGluZyAicGlkb2YgKGV4aXQgd2l0aCBzdWNjZXNzKSIgInBpZG9mIHBpZG9mID4gL2Rldi9udWxsOyBlY2hvIFwkPyIgXAorCSIwXG4iICIiICIiCisjIFdlIGNhbiBnZXQgYXdheSB3aXRoIHRoaXMgYmVjYXVzZSBpdCBzYXlzICMhL2Jpbi9zaCB1cCB0b3AuCisKK3Rlc3RpbmcgInBpZG9mIHRoaXMiICJwaWRvZiBwaWRvZi50ZXN0cyB8IGdyZXAgLW8gLXcgJCQiICIkJFxuIiAiIiAiIgorCitvcHRpb25hbCBGRUFUVVJFX1BJRE9GX1NJTkdMRQordGVzdGluZyAicGlkb2YgLXMiICJwaWRvZiAtcyBpbml0IiAiMVxuIiAiIiAiIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9QSURPRl9PTUlUIEZFQVRVUkVfUElET0ZfU0lOR0xFCisjIFRoaXMgdGVzdCBmYWlscyBub3cgYmVjYXVzZSBwcm9jZXNzIG5hbWUgbWF0Y2hpbmcgbG9naWMgaGFzIGNoYW5nZWQsCisjIGJ1dCBuZXcgbG9naWMgaXMgbm90ICJ3cm9uZyIgZWl0aGVyLi4uIHNlZSBmaW5kX3BpZF9ieV9uYW1lLmMgY29tbWVudHMKKyN0ZXN0aW5nICJwaWRvZiAtbyAlUFBJRCIgInBpZG9mIC1vICVQUElEIHBpZG9mLnRlc3RzIHwgZ3JlcCAtbyAtdyAkJCIgIiIgIiIgIiIKK3Rlc3RpbmcgInBpZG9mIC1vICVQUElEIE5PUCIgInBpZG9mIC1vICVQUElEIC1zIGluaXQiICIxXG4iICIiICIiCit0ZXN0aW5nICJwaWRvZiAtbyBpbml0IiAicGlkb2YgLW8gMSBpbml0IHwgZ3JlcCAtbyAtdyAxIiAiIiAiIiAiIgorU0tJUD0KKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvcHJpbnRmLnRlc3RzIGIvdGVzdHN1aXRlL3ByaW50Zi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTNjODc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3ByaW50Zi50ZXN0cwpAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgTmVlZCB0aGlzIGluIG9yZGVyIHRvIG5vdCBleGVjdXRlIHNoZWxsIGJ1aWx0aW4KK2JiPSJidXN5Ym94ICIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJwcmludGYgcHJvZHVjZXMgbm8gZnVydGhlciBvdXRwdXQgMSIgXAorCSIke2JifXByaW50ZiAnXGMnIGZvbyIgXAorCSIiIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgcHJvZHVjZXMgbm8gZnVydGhlciBvdXRwdXQgMiIgXAorCSIke2JifXByaW50ZiAnJXNcYycgZm9vIGJhciIgXAorCSJmb28iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgcmVwZWF0ZWRseSB1c2VzIHBhdHRlcm4gZm9yIGVhY2ggYXJndiIgXAorCSIke2JifXByaW50ZiAnJXNcbicgZm9vIFwkSE9NRSIgXAorCSJmb29cbiRIT01FXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJWIgZXNjYXBlZF9zdHJpbmciIFwKKwkiJHtiYn1wcmludGYgJyViJyAnYVx0YicgJ2NcXGRcbicgMj4mMTsgZWNobyBcJD8iIFwKKwkiYVx0YmNcXGRcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICVkICdcIngnIFwiJ3lcIiBcIid6VEFJTFwiIiBcCisJIiR7YmJ9cHJpbnRmICclZFxuJyAnXCJ4JyBcIid5XCIgXCInelRBSUxcIiAyPiYxOyBlY2hvIFwkPyIgXAorCSIxMjBcbiIiMTIxXG4iIjEyMlxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJXMgJ1wieCcgXCIneVwiIFwiJ3pUQUlMXCIiIFwKKwkiJHtiYn1wcmludGYgJyVzXG4nICdcIngnIFwiJ3lcIiBcIid6VEFJTFwiIDI+JjE7IGVjaG8gXCQ/IiBcCisJIlwieFxuIiIneVxuIiInelRBSUxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUyMy4xMmYiIFwKKwkiJHtiYn1wcmludGYgJ3wlMjMuMTJmfFxuJyA1LjI1IDI+JjE7IGVjaG8gXCQ/IiBcCisJInwgICAgICAgICA1LjI1MDAwMDAwMDAwMHxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUqLipmIiBcCisJIiR7YmJ9cHJpbnRmICd8JSouKmZ8XG4nIDIzIDEyIDUuMjUgMj4mMTsgZWNobyBcJD8iIFwKKwkifCAgICAgICAgIDUuMjUwMDAwMDAwMDAwfFxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJSpmIHdpdGggbmVnYXRpdmUgd2lkdGgiIFwKKwkiJHtiYn1wcmludGYgJ3wlKmZ8XG4nIC0yMyA1LjI1IDI+JjE7IGVjaG8gXCQ/IiBcCisJInw1LjI1MDAwMCAgICAgICAgICAgICAgIHxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUuKmYgd2l0aCBuZWdhdGl2ZSBwcmVjaXNpb24iIFwKKwkiJHtiYn1wcmludGYgJ3wlLipmfFxuJyAtMTIgNS4yNSAyPiYxOyBlY2hvIFwkPyIgXAorCSJ8NS4yNTAwMDB8XG4iIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiB1bmRlcnN0YW5kcyAlKi4qZiB3aXRoIG5lZ2F0aXZlIHdpZHRoL3ByZWNpc2lvbiIgXAorCSIke2JifXByaW50ZiAnfCUqLipmfFxuJyAtMjMgLTEyIDUuMjUgMj4mMTsgZWNobyBcJD8iIFwKKwkifDUuMjUwMDAwICAgICAgICAgICAgICAgfFxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJXpkIiBcCisJIiR7YmJ9cHJpbnRmICclemRcbicgLTUgMj4mMTsgZWNobyBcJD8iIFwKKwkiLTVcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICVsZCIgXAorCSIke2JifXByaW50ZiAnJWxkXG4nIC01IDI+JjE7IGVjaG8gXCQ/IiBcCisJIi01XG4iIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiB1bmRlcnN0YW5kcyAlTGQiIFwKKwkiJHtiYn1wcmludGYgJyVMZFxuJyAtNSAyPiYxOyBlY2hvIFwkPyIgXAorCSItNVxuIiIwXG4iIFwKKwkiIiAiIgorCisjICJGSVhFRCIgbm93IHRvIGFjdCBjb21wYXRpYmx5CisjIyBXZSBhcmUgIm1vcmUgY29ycmVjdCIgaGVyZSB0aGFuIGJhc2gvY29yZXV0aWxzOiB0aGV5IGhhcHBpbHkgcHJpbnQgLTIKKyMjIGFzIGlmIGl0IGlzIGEgaHVnZSB1bnNpZ25lZCBudW1iZXIKKyN0ZXN0aW5nICJwcmludGYgaGFuZGxlcyAldSAtTiIgXAorIwkiJHtiYn1wcmludGYgJyV1XG4nIDEgLTIgMyAyPiYxOyBlY2hvIFwkPyIgXAorIwkiMVxuIiJwcmludGY6IC0yOiBpbnZhbGlkIG51bWJlclxuIiIwXG4iIjNcbiIiMFxuIiBcCisjCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiBoYW5kbGVzICVkIGJhZF9pbnB1dCIgXAorCSIke2JifXByaW50ZiAnJWRcbicgMSAtIDIgYmFkIDMgMTIzYmFkIDQgMj4mMTsgZWNobyBcJD8iIFwKKyIxXG4iInByaW50ZjogaW52YWxpZCBudW1iZXIgJy0nXG4iIjBcbiJcCisiMlxuIiJwcmludGY6IGludmFsaWQgbnVtYmVyICdiYWQnXG4iIjBcbiJcCisiM1xuIiJwcmludGY6IGludmFsaWQgbnVtYmVyICcxMjNiYWQnXG4iIjBcbiJcCisiNFxuIiIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgYWJvcnRzIG9uIGJhcmUgJSIgXAorCSIke2JifXByaW50ZiAnJScgYSBiIGMgMj4mMTsgZWNobyBcJD8iIFwKKwkicHJpbnRmOiAlOiBpbnZhbGlkIGZvcm1hdFxuIiIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgYWJvcnRzIG9uICVyIiBcCisJIiR7YmJ9cHJpbnRmICclcicgYSBiIGMgMj4mMTsgZWNobyBcJD8iIFwKKwkicHJpbnRmOiAlcjogaW52YWxpZCBmb3JtYXRcbiIiMVxuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvcHdkL3B3ZC1wcmludHMtd29ya2luZy1kaXJlY3RvcnkgYi90ZXN0c3VpdGUvcHdkL3B3ZC1wcmludHMtd29ya2luZy1kaXJlY3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3NTM0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9wd2QvcHdkLXByaW50cy13b3JraW5nLWRpcmVjdG9yeQpAQCAtMCwwICsxIEBACit0ZXN0ICQocHdkKSA9ICQoYnVzeWJveCBwd2QpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvcmVhZGxpbmsudGVzdHMgYi90ZXN0c3VpdGUvcmVhZGxpbmsudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdmYzhhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9yZWFkbGluay50ZXN0cwpAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKworIyBSZWFkbGluayB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgTmF0YW5hZWwgQ29wYSA8bkB0YW5hZWwub3JnPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCitURVNURElSPXJlYWRsaW5rX3Rlc3RkaXIKK1RFU1RGSUxFPSIkVEVTVERJUi90ZXN0ZmlsZSIKK1RFU1RMSU5LPSJ0ZXN0bGluayIKK0ZBSUxMSU5LPSIkVEVTVERJUi8kVEVTVERJUi90ZXN0bGluayIKKworIyBjcmVhdGUgdGhlIGRpciBhbmQgdGVzdCBmaWxlcworbWtkaXIgLXAgIi4vJFRFU1RESVIiCit0b3VjaCAiLi8kVEVTVEZJTEUiCitsbiAtcyAiLi8kVEVTVEZJTEUiICIuLyRURVNUTElOSyIKKwordGVzdGluZyAicmVhZGxpbmsgb24gYSBmaWxlIiAicmVhZGxpbmsgLi8kVEVTVEZJTEUiICIiICIiICIiCit0ZXN0aW5nICJyZWFkbGluayBvbiBhIGxpbmsiICJyZWFkbGluayAuLyRURVNUTElOSyIgIi4vJFRFU1RGSUxFXG4iICIiICIiCisKK29wdGlvbmFsIEZFQVRVUkVfUkVBRExJTktfRk9MTE9XCisKK3Rlc3RpbmcgInJlYWRsaW5rIC1mIG9uIGEgZmlsZSIgInJlYWRsaW5rIC1mIC4vJFRFU1RGSUxFIiAiJFBXRC8kVEVTVEZJTEVcbiIgIiIgIiIKK3Rlc3RpbmcgInJlYWRsaW5rIC1mIG9uIGEgbGluayIgInJlYWRsaW5rIC1mIC4vJFRFU1RMSU5LIiAiJFBXRC8kVEVTVEZJTEVcbiIgIiIgIiIKK3Rlc3RpbmcgInJlYWRsaW5rIC1mIG9uIGFuIGludmFsaWQgbGluayIgInJlYWRsaW5rIC1mIC4vJEZBSUxMSU5LIiAiIiAiIiAiIgordGVzdGluZyAicmVhZGxpbmsgLWYgb24gYSB3aWVyZCBkaXIiICJyZWFkbGluayAtZiAkVEVTVERJUi8uLi8kVEVTVEZJTEUiICIkUFdELyRURVNURklMRVxuIiAiIiAiIgorCisKKyMgY2xlYW4gdXAKK3JtIC1yICIkVEVTVExJTksiICIkVEVTVERJUiIKKworZXhpdCAkKChGQUlMQ09VTlQgPD0gMjU1ID8gRkFJTENPVU5UIDogMjU1KSkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ybS9ybS1yZW1vdmVzLWZpbGUgYi90ZXN0c3VpdGUvcm0vcm0tcmVtb3Zlcy1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTcxYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcm0vcm0tcmVtb3Zlcy1maWxlCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggZm9vCitidXN5Ym94IHJtIGZvbwordGVzdCAhIC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3JtZGlyL3JtZGlyLXJlbW92ZXMtcGFyZW50LWRpcmVjdG9yaWVzIGIvdGVzdHN1aXRlL3JtZGlyL3JtZGlyLXJlbW92ZXMtcGFyZW50LWRpcmVjdG9yaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMmY1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcm1kaXIvcm1kaXItcmVtb3Zlcy1wYXJlbnQtZGlyZWN0b3JpZXMKQEAgLTAsMCArMSwzIEBACitta2RpciAtcCBmb28vYmFyCitidXN5Ym94IHJtZGlyIC1wIGZvby9iYXIKK3Rlc3QgISAtZCBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ydW50ZXN0IGIvdGVzdHN1aXRlL3J1bnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE1NzVkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ydW50ZXN0CkBAIC0wLDAgKzEsMTcxIEBACisjIS9iaW4vc2gKKyMgVXNhZ2U6CisjIHJ1bnRlc3QgW2FwcGxldDFdIFthcHBsZXQyLi4uXQorCisuIC4vdGVzdGluZy5zaAorCit0b3RhbF9mYWlsZWQ9MAorCisjIFJ1biBvbmUgb2xkLXN0eWxlIHRlc3QuCisjIFRlc3RzIGFyZSBzdG9yZWQgaW4gYXBwbGV0L3Rlc3RjYXNlIHNoZWxsIHNjcmlwdHMuCisjIFRoZXkgYXJlIHJ1biB1c2luZyAic2ggLXggLWUgYXBwbGV0L3Rlc3RjYXNlIi4KKyMgT3B0aW9uIC1lIHdpbGwgbWFrZSB0ZXN0Y2FzZSBzdG9wIG9uIHRoZSBmaXJzdCBmYWlsZWQgY29tbWFuZC4KK3J1bl9hcHBsZXRfdGVzdGNhc2UoKQoreworCWxvY2FsIGFwcGxldD0iJDEiCisJbG9jYWwgdGVzdGNhc2U9IiQyIgorCisJbG9jYWwgc3RhdHVzPTAKKwlsb2NhbCB1Y19hcHBsZXQ9JChlY2hvICIkYXBwbGV0IiB8IHRyIGEteiBBLVopCisJbG9jYWwgdGVzdG5hbWU9IiR0ZXN0Y2FzZSIKKworCXRlc3RuYW1lPSIke3Rlc3RuYW1lIyMqL30iICMgdGFrZSBiYXNlbmFtZQorCWlmIGdyZXAgIl4jIENPTkZJR18kdWNfYXBwbGV0IGlzIG5vdCBzZXQkIiAiJGJpbmRpci8uY29uZmlnIiA+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gIlVOVEVTVEVEOiAkdGVzdG5hbWUiCisJCXJldHVybiAwCisJZmkKKworCWlmIGdyZXAgIl4jIEZFQVRVUkU6ICIgIiR0ZXN0Y2FzZSIgPi9kZXYvbnVsbDsgdGhlbgorCQlsb2NhbCBmZWF0dXJlPSQoc2VkIC1uZSAncy9eIyBGRUFUVVJFOiAvL3AnICIkdGVzdGNhc2UiKQorCisJCWZvciBmIGluICRmZWF0dXJlOyBkbworCQkJaWYgZ3JlcCAiXiMgJGYgaXMgbm90IHNldCQiICIkYmluZGlyLy5jb25maWciID4vZGV2L251bGw7IHRoZW4KKwkJCQllY2hvICJVTlRFU1RFRDogJHRlc3RuYW1lIgorCQkJCXJldHVybiAwCisJCQlmaQorCQlkb25lCisJZmkKKworCXJtIC1yZiAiLnRtcGRpci4kYXBwbGV0IgorCW1rZGlyIC1wICIudG1wZGlyLiRhcHBsZXQiCisJY2QgIi50bXBkaXIuJGFwcGxldCIgfHwgcmV0dXJuIDEKKworIwllY2hvICJSdW5uaW5nIHRlc3RjYXNlICR0ZXN0Y2FzZSIKKwlkPSIkdHNkaXIiIFwKKwkJc2ggLXggLWUgIiR0ZXN0Y2FzZSIgPiIkdGVzdG5hbWUuc3Rkb3V0LnR4dCIgMj4mMSB8fCBzdGF0dXM9JD8KKwlpZiBbICRzdGF0dXMgLW5lIDAgXTsgdGhlbgorCQllY2hvICJGQUlMOiAkdGVzdG5hbWUiCisJCWlmIFsgeCIkVkVSQk9TRSIgIT0geCBdOyB0aGVuCisJCQljYXQgIiR0ZXN0bmFtZS5zdGRvdXQudHh0IgorCQlmaQorCWVsc2UKKwkJZWNobyAiUEFTUzogJHRlc3RuYW1lIgorCWZpCisKKwljZCAuLgorCXJtIC1yZiAiLnRtcGRpci4kYXBwbGV0IgorCisJcmV0dXJuICRzdGF0dXMKK30KKworIyBSdW4gYWxsIG9sZC1zdHlsZSB0ZXN0cyBmb3IgZ2l2ZW4gYXBwbGV0CitydW5fb2xkc3R5bGVfYXBwbGV0X3Rlc3RzKCkKK3sKKwlsb2NhbCBhcHBsZXQ9IiQxIgorCWxvY2FsIHN0YXR1cz0wCisKKwlmb3IgdGVzdGNhc2UgaW4gIiR0c2Rpci8kYXBwbGV0Ii8qOyBkbworCQkjIHN3aXRjaCBvbiBiYXNlbmFtZSBvZiAkdGVzdGNhc2UKKwkJY2FzZSAiJHt0ZXN0Y2FzZSMjKi99IiBpbgorCQkJLiopICAgICBjb250aW51ZSA7OyAgICAjIC5zdm4sIC5naXQgZXRjCisJCQkqfikgICAgIGNvbnRpbnVlIDs7ICAgICMgYmFja3VwIGZpbGVzCisJCQkiQ1ZTIikgIGNvbnRpbnVlIDs7CisJCQlcIyopICAgIGNvbnRpbnVlIDs7ICAgICMgQ1ZTIG1lcmdlIHJlc2lkdWVzCisJCQkqLm1pbmUpIGNvbnRpbnVlIDs7ICAgICMgc3ZuLXByb2R1Y2VkIGp1bmsKKwkJCSouclswLTldKikgY29udGludWUgOzsgIyBzdm4tcHJvZHVjZWQganVuaworCQllc2FjCisJCXJ1bl9hcHBsZXRfdGVzdGNhc2UgIiRhcHBsZXQiICIkdGVzdGNhc2UiIHx8IHsKKwkJCXN0YXR1cz0xCisJCQl0b3RhbF9mYWlsZWQ9JCgodG90YWxfZmFpbGVkICsgMSkpCisJCX0KKwlkb25lCisJcmV0dXJuICRzdGF0dXMKK30KKworCisKK2xjd2Q9JChwd2QpCitbIHgiJHRzZGlyIiAhPSB4IiIgXSB8fCB0c2Rpcj0iJGxjd2QiCitbIHgiJGJpbmRpciIgIT0geCIiIF0gfHwgYmluZGlyPSIke2xjd2QlLyp9IiAjIG9uZSBkaXJlY3RvcnkgdXAgZnJvbSAkbGN3ZAorUEFUSD0iJGJpbmRpcjokUEFUSCIKK2V4cG9ydCBiaW5kaXIgICAjIHNvbWUgdGVzdHMgbmVlZCB0byBsb29rIGF0ICRiaW5kaXIvLmNvbmZpZworCitpZiBbIHgiJFZFUkJPU0UiID0geCBdOyB0aGVuCisJZXhwb3J0IFZFUkJPU0U9CitmaQorCitpZiBbIHgiJDEiID0geCItdiIgXTsgdGhlbgorCWV4cG9ydCBWRVJCT1NFPTEKKwlzaGlmdAorZmkKKworaW1wbGVtZW50ZWQ9JCgKKwlwcmludGYgImJ1c3lib3ggIiAjIGFsd2F5cyBpbXBsZW1lbnRlZAorCSIkYmluZGlyL2J1c3lib3giIDI+JjEgfAorCXdoaWxlIHJlYWQgbGluZTsgZG8KKwkJaWYgWyB4IiRsaW5lIiA9IHgiQ3VycmVudGx5IGRlZmluZWQgZnVuY3Rpb25zOiIgXTsgdGhlbgorCQkJeGFyZ3MgfCBzZWQgJ3MvLC8vZycKKwkJCWJyZWFrCisJCWZpCisJZG9uZQorCSkKKworYXBwbGV0cz0iJGltcGxlbWVudGVkIgoraWYgWyAkIyAtbmUgMCBdOyB0aGVuCisJYXBwbGV0cz0iJEAiCitmaQorCisjIFBvcHVsYXRlIGEgZGlyZWN0b3J5IHdpdGggbGlua3MgdG8gYWxsIGJ1c3lib3ggYXBwbGV0cworCitMSU5LU0RJUj0iJGJpbmRpci9ydW50ZXN0LXRlbXBkaXItbGlua3MiCisKKyMgQ29tbWVudCB0aGlzIGxpbmUgb3V0IGlmIHlvdSBoYXZlIHB1dCBhIGRpZmZlcmVudCBiaW5hcnkgaW4gJExJTktTRElSCisjIChzYXksIGEgInN0YW5kYXJkIiB0b29sJ3MgYmluYXJ5KSBpbiBvcmRlciB0byBydW4gdGVzdHMgYWdhaW5zdCBpdDoKK3JtIC1yZiAiJExJTktTRElSIiAyPi9kZXYvbnVsbAorCitta2RpciAiJExJTktTRElSIiAyPi9kZXYvbnVsbAorZm9yIGkgaW4gJGltcGxlbWVudGVkOyBkbworCSMgTm90ZTogaWYgJExJTktTRElSL2FwcGxldCBleGlzdHMsIHdlIGRvIG5vdCBvdmVyd3JpdGUgaXQuCisJIyBVc2VmdWwgaWYgb25lIHdhbnRzIHRvIHJ1biB0ZXN0cyBhZ2FpbnN0IGEgc3RhbmRhcmQgdXRpbGl0eSwKKwkjIG5vdCBhbiBhcHBsZXQuCisJbG4gLXMgIiRiaW5kaXIvYnVzeWJveCIgIiRMSU5LU0RJUi8kaSIgMj4vZGV2L251bGwKK2RvbmUKKworIyBTZXQgdXAgb3B0aW9uIGZsYWdzIHNvIHRlc3RzIGNhbiBiZSBzZWxlY3RpdmUuCitleHBvcnQgT1BUSU9ORkxBR1M9OiQoCisJc2VkIC1uciAncy9eQ09ORklHXy8vcCcgIiRiaW5kaXIvLmNvbmZpZyIgfAorCXNlZCAncy89LiovLycgfCB4YXJncyB8IHNlZCAncy8gLzovZycKKwkpOgorCitzdGF0dXM9MAorZm9yIGFwcGxldCBpbiAkYXBwbGV0czsgZG8KKwkjIEFueSBvbGQtc3R5bGUgdGVzdHMgZm9yIHRoaXMgYXBwbGV0PworCWlmIFsgLWQgIiR0c2Rpci8kYXBwbGV0IiBdOyB0aGVuCisJCXJ1bl9vbGRzdHlsZV9hcHBsZXRfdGVzdHMgIiRhcHBsZXQiIHx8IHN0YXR1cz0xCisJZmkKKworCSMgSXMgdGhpcyBhIG5ldy1zdHlsZSB0ZXN0PworCWlmIFsgLWYgIiRhcHBsZXQudGVzdHMiIF07IHRoZW4KKwkJaWYgWyAhIC1lICIkTElOS1NESVIvJGFwcGxldCIgXTsgdGhlbgorCQkJIyAoYXZvaWRpbmcgYmFzaCdpc20gIiR7YXBwbGV0OjA6NH0iKQorCQkJaWYgISBlY2hvICIkYXBwbGV0IiB8IGdyZXAgIl5hbGxfIiA+L2Rldi9udWxsOyB0aGVuCisJCQkJZWNobyAiU0tJUFBFRDogJGFwcGxldCAobm90IGJ1aWx0KSIKKwkJCQljb250aW51ZQorCQkJZmkKKwkJZmkKKyMJCWVjaG8gIlJ1bm5pbmcgdGVzdCAkdHNkaXIvJGFwcGxldC50ZXN0cyIKKwkJUEFUSD0iJExJTktTRElSOiR0c2RpcjokYmluZGlyOiRQQVRIIiBcCisJCQkiJHRzZGlyLyRhcHBsZXQudGVzdHMiCisJCXJjPSQ/CisJCXRvdGFsX2ZhaWxlZD0kKCh0b3RhbF9mYWlsZWQgKyByYykpCisJCXRlc3QgJHJjIC1uZSAwICYmIHN0YXR1cz0xCisJZmkKK2RvbmUKKworIyBMZWF2aW5nIHRoZSBkaXIgbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIHJ1biBmYWlsZWQgdGVzdCBieSBoYW5kCisjcm0gLXJmICIkTElOS1NESVIiCisKK2lmIFsgJHN0YXR1cyAtbmUgMCBdICYmIFsgeCIkVkVSQk9TRSIgPSB4IF07IHRoZW4KKwllY2hvICIkdG90YWxfZmFpbGVkIGZhaWx1cmUocykgZGV0ZWN0ZWQ7IHJ1bm5pbmcgd2l0aCAtdiAodmVyYm9zZSkgd2lsbCBnaXZlIG1vcmUgaW5mbyIKK2ZpCitleGl0ICRzdGF0dXMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9yeC50ZXN0cyBiL3Rlc3RzdWl0ZS9yeC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zN2ZhMDJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3J4LnRlc3RzCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOSBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKKyMgU2ltcGxlIG9uZS1ibG9jayBmaWxlIHRyYW5zZmVyCisjIHJ4ID0+ICdDJworIyByeCA8PSBTT0ggPGJsb2Nrbm8+IDwyNTUtYmxvY2tubz4gPDEyOCBieXRlIHBhZGRlZCB3aXRoIHgxQT4gPGNyYz4gPGNyYz4KKyMgcnggPT4gQUNLCisjIHJ4IDw9IEVPVAorIyByeCA9PiBBQ0sKK3Rlc3RpbmcgInJ4IiBcCisJInJ4IHJ4Lk9VVEZJTEUgfCBoZXhkdW1wIC12QyAmJiBjYXQgcnguT1VURklMRSIgXAorIlwKKzAwMDAwMDAwICA0MyAwNiAwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxDLi58XG5cCiswMDAwMDAwM1xuXAorPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/IiBcCisJIiIgIlwwMVwwMVwwMzc2XAorPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/XAorXHgxQVx4MUFceDFBXHgxQVx4MUFceDRCXHhCMFwwNCIKKworcm0gLWYgcnguT1VURklMRSAyPi9kZXYvbnVsbAorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9zZWQudGVzdHMgYi90ZXN0c3VpdGUvc2VkLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhMTYzZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc2VkLnRlc3RzCkBAIC0wLDAgKzEsMzAwIEBACisjIS9iaW4vc2gKKworIyBTVVN2MyBjb21wbGlhbnQgc2VkIHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZHMiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworIyBDb3JuZXIgY2FzZXMKK3Rlc3RpbmcgInNlZCBubyBmaWxlcyAoc3RkaW4pIiAnc2VkICIiJyAiaGVsbG9cbiIgIiIgImhlbGxvXG4iCit0ZXN0aW5nICJzZWQgZXhwbGljaXQgc3RkaW4iICdzZWQgIiIgLScgImhlbGxvXG4iICIiICJoZWxsb1xuIgordGVzdGluZyAic2VkIGhhbmRsZXMgZW1wdHkgbGluZXMiICJzZWQgLWUgJ3MvXCQvQC8nIiAiQFxuIiAiIiAiXG4iCit0ZXN0aW5nICJzZWQgc3RkaW4gdHdpY2UiICdzZWQgIiIgLSAtJyAiaGVsbG8iICIiICJoZWxsbyIKKworIyBUcmFpbGluZyBFT0YuCisjCU1hdGNoICQsIGF0IGVuZCBvZiBlYWNoIGZpbGUgb3IgYWxsIGZpbGVzPworCisjIC1lIGNvcm5lciBjYXNlcworIwl3aXRob3V0IC1lCisjCW11bHRpcGxlIC1lCisjCQlpbnRlcmFjdCB3aXRoIGEKKyMJLWVlZSBhcmcxIGFyZzIgYXJnMworIyAtZiBjb3JuZXIgY2FzZXMKKyMJLWUgLWYgLWUKKyMgLW4gY29ybmVyIGNhc2VzCisjCW5vIG5ld2xpbmUgYXQgRU9GPworIyAtciBjb3JuZXIgY2FzZXMKKyMJSnVzdCBtYWtlIHN1cmUgaXQgd29ya3MuCisjIC1pIGNvcm5lciBjYXNlczoKKyMJc2VkIC1pIC0KKyMJcGVybWlzc2lvbnMKKyMJLWkgb24gYSBzeW1saW5rCisjCW9uIGEgZGlyZWN0b3J5CisjICAgICAgIFdpdGggJCBsYXN0LWxpbmUgdGVzdAorIyBDb250aW51ZSB3aXRoIFwKKyMgICAgICAgRW5kIG9mIHNjcmlwdCB3aXRoIHRyYWlsaW5nIFwKKworIyBjb21tYW5kIGxpc3QKK3Rlc3RpbmcgInNlZCBhY2NlcHRzIGJsYW5rcyBiZWZvcmUgY29tbWFuZCIgInNlZCAtZSAnMSBkJyIgIiIgIiIgIiIKK3Rlc3RpbmcgInNlZCBhY2NlcHRzIG5ld2xpbmVzIGluIC1lIiAic2VkIC1lICdpXAorMQorYVwKKzMnIiAiMVxuMlxuM1xuIiAiIiAiMlxuIgordGVzdGluZyAic2VkIGFjY2VwdHMgbXVsdGlwbGUgLWUiICJzZWQgLWUgJ2lcJyAtZSAnMScgLWUgJ2FcJyAtZSAnMyciIFwKKwkiMVxuMlxuM1xuIiAiIiAiMlxuIgorCisjIHN1YnN0aXR1dGlvbnMKK3Rlc3RpbmcgInNlZCAtbiIgInNlZCAtbiAtZSBzL2Zvby9iYXIvIC1lIHMvYmFyL2Jhei8iICIiICIiICJmb29cbiIKK3Rlc3RpbmcgInNlZCBzLy9wIiAic2VkIC1lIHMvZm9vL2Jhci9wIC1lIHMvYmFyL2Jhei9wIiAiYmFyXG5iYXpcbmJhelxuIiBcCisJIiIgImZvb1xuIgordGVzdGluZyAic2VkIC1uIHMvL3AiICJzZWQgLW5lIHMvYWJjL2RlZi9wIiAiZGVmXG4iICIiICJhYmNcbiIKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7Cit0ZXN0aW5nICJzZWQgcy8vZyAoZXhoYXVzdGl2ZSkiICJzZWQgLWUgJ3MvW1s6c3BhY2U6XV0qLywvZyciICIsMSwyLDMsNCw1LFxuIiBcCisJIiIgIjEyMzQ1XG4iCit9Cit0ZXN0aW5nICJzZWQgcyBhcmJpdHJhcnkgZGVsaW1pdGVyIiAic2VkIC1lICdzIHdvbyBib2luZyAnIiAiYm9pbmdcbiIgIiIgIndvb1xuIgordGVzdGluZyAic2VkIHMgY2hhaW5zIiAic2VkIC1lIHMvZm9vL2Jhci8gLWUgcy9iYXIvYmF6LyIgImJhelxuIiAiIiAiZm9vXG4iCit0ZXN0aW5nICJzZWQgcyBjaGFpbnMyIiAic2VkIC1lIHMvZm9vL2Jhci8gLWUgcy9iYXovbmVlLyIgImJhclxuIiAiIiAiZm9vXG4iCit0ZXN0aW5nICJzZWQgcyBbZGVsaW1pdGVyXSIgInNlZCAtZSAnc0BbQF1AQCciICJvbmV0d28iICIiICJvbmVAdHdvIgordGVzdGluZyAic2VkIHMgd2l0aCBcXHQgKEdOVSBleHQpIiAic2VkICdzL1x0LyAvJyIgIm9uZSB0d28iICIiICJvbmVcdHR3byIKKworIyBicmFuY2gKK3Rlc3RpbmcgInNlZCBiIChicmFuY2gpIiAic2VkIC1lICdiIG9uZTtwOzogb25lJyIgImZvb1xuIiAiIiAiZm9vXG4iCit0ZXN0aW5nICJzZWQgYiAoYnJhbmNoIHdpdGggbm8gbGFiZWwganVtcHMgdG8gZW5kKSIgInNlZCAtZSAnYjtwJyIgXAorCSJmb29cbiIgIiIgImZvb1xuIgorCisjIHRlc3QgYW5kIGJyYW5jaAordGVzdGluZyAic2VkIHQgKHRlc3QvYnJhbmNoKSIgInNlZCAtZSAncy9hLzEvO3Qgb25lO3A7OiBvbmU7cCciIFwKKwkiMVxuMVxuYlxuYlxuYlxuY1xuY1xuY1xuIiAiIiAiYVxuYlxuY1xuIgordGVzdGluZyAic2VkIHQgKHRlc3QvYnJhbmNoIGNsZWFycyB0ZXN0IGJpdCkiICJzZWQgLWUgJ3MvYS9iLzs6bG9vcDt0IGxvb3AnIiBcCisJImJcbmJcbmNcbiIgIiIgImFcbmJcbmNcbiIKK3Rlc3RpbmcgInNlZCBUICghdGVzdC9icmFuY2gpIiAic2VkIC1lICdzL2EvMS87VCBub3RvbmU7cDs6IG5vdG9uZTtwJyIgXAorCSIxXG4xXG4xXG5iXG5iXG5jXG5jXG4iICIiICJhXG5iXG5jXG4iCisKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CisjIE5vcm1hbCBzZWQgZW5kLW9mLXNjcmlwdCBkb2Vzbid0IHByaW50ICJjIiBiZWNhdXNlIG4gZmx1c2hlZCB0aGUgcGF0dGVybgorIyBzcGFjZS4gIElmIG4gaGl0cyBFT0YsIHBhdHRlcm4gc3BhY2UgaXMgZW1wdHkgd2hlbiBzY3JpcHQgZW5kcy4KKyMgUXVlcnk6IGhvdyBkb2VzIHRoaXMgaW50ZXJhY3Qgd2l0aCBubyBuZXdsaW5lIGF0IEVPRj8KK3Rlc3RpbmcgInNlZCBuIChmbHVzaGVzIHBhdHRlcm4gc3BhY2UsIHRlcm1pbmF0ZXMgZWFybHkpIiAic2VkIC1lICduO3AnIiBcCisJImFcbmJcbmJcbmNcbiIgIiIgImFcbmJcbmNcbiIKK30KKyMgbm9uLUdOVSBzZWQ6IE4gZG9lcyBfbm90XyBmbHVzaCBwYXR0ZXJuIHNwYWNlLCB0aGVyZWZvcmUgYyBpcyBlYXRlbiBAIHNjcmlwdCBlbmQKKyMgR05VIHNlZDogTiBmbHVzaGVzIHBhdHRlcm4gc3BhY2UsIHRoZXJlZm9yZSBjIGlzIHByaW50ZWQgdG9vIEAgc2NyaXB0IGVuZAordGVzdGluZyAic2VkIE4gKGZsdXNoZXMgcGF0dGVybiBzcGFjZSAoR05VIGJlaGF2aW9yKSkiICJzZWQgLWUgJ047cCciIFwKKwkiYVxuYlxuYVxuYlxuY1xuIiAiIiAiYVxuYlxuY1xuIgorCit0ZXN0aW5nICJzZWQgTiB0ZXN0MiIgInNlZCAnOmE7TjtzL1xuLyAvO3RhJyIgXAorCSJhIGIgY1xuIiAiIiAiYVxuYlxuY1xuIgorCit0ZXN0aW5nICJzZWQgTiB0ZXN0MyIgInNlZCAnTjtzL1xuLyAvJyIgXAorCSJhIGJcbmNcbiIgIiIgImFcbmJcbmNcbiIKKwordGVzdGluZyAic2VkIGFkZHJlc3MgbWF0Y2ggbmV3bGluZSIgJ3NlZCAiL2IvTjsvYlxcbmMvaSB3b28iJyBcCisJImFcbndvb1xuYlxuY1xuZFxuIiAiIiAiYVxuYlxuY1xuZFxuIgorCisjIE11bHRpcGxlIGxpbmVzIGluIHBhdHRlcm4gc3BhY2UKK3Rlc3RpbmcgInNlZCBOIChzdG9wcyBhdCBlbmQgb2YgaW5wdXQpIGFuZCBQIChwcmludHMgdG8gZmlyc3QgbmV3bGluZSBvbmx5KSIgXAorCSJzZWQgLW4gJ047UDtwJyIgImFcbmFcbmJcbiIgIiIgImFcbmJcbmNcbiIKKworIyBIb2xkIHNwYWNlCit0ZXN0aW5nICJzZWQgRyAoYXBwZW5kIGhvbGQgc3BhY2UgdG8gcGF0dGVybiBzcGFjZSkiICdzZWQgRycgImFcblxuYlxuXG5jXG5cbiIgXAorCSIiICJhXG5iXG5jXG4iCisjdGVzdGluZyAic2VkIGcvRyAoc3dhcC9hcHBlbmQgaG9sZCBhbmQgcGF0dGVyIHNwYWNlKSIKKyN0ZXN0aW5nICJzZWQgZyAoc3dhcCBob2xkL3BhdHRlcm4gc3BhY2UpIgorCit0ZXN0aW5nICJzZWQgZCBlbmRzIHNjcmlwdCBpdGVyYXRpb24iIFwKKwkic2VkIC1lICcvb29rL2Q7cy9vb2svcGluZy9wO2kgd29vdCciICIiICIiICJvb2tcbiIKK3Rlc3RpbmcgInNlZCBkIGVuZHMgc2NyaXB0IGl0ZXJhdGlvbiAoMikiIFwKKwkic2VkIC1lICcvb29rL2Q7YVwnIC1lICdiYW5nJyIgIndvb3RcbmJhbmdcbiIgIiIgIm9va1xud29vdFxuIgorCisjIE11bHRpcGxlIGZpbGVzLCB3aXRoIHZhcnlpbmcgbmV3bGluZXMgYW5kIE5VTCBieXRlcwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIHsKK3Rlc3RpbmcgInNlZCBlbWJlZGRlZCBOVUwiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyIgIlwwYmFuZ1wwd29vXDAiICIiIFwKKwkiXDB3b29cMHdvb1wwIgorfQordGVzdGluZyAic2VkIGVtYmVkZGVkIE5VTCBnIiAic2VkIC1lICdzL3dvby9iYW5nL2cnIiAiYmFuZ1wwYmFuZ1wwIiAiIiBcCisJIndvb1wwd29vXDAiCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgeworJEVDSE8gLWUgIi93b28vYSBoZVwwbGxvIiA+IHNlZC5jb21tYW5kcwordGVzdGluZyAic2VkIE5VTCBpbiBjb21tYW5kIiAic2VkIC1mIHNlZC5jb21tYW5kcyIgIndvb1xuaGVcMGxsb1xuIiAiIiAid29vIgorcm0gc2VkLmNvbW1hbmRzCit9CisKKyMgc2VkIGhhcyBmdW5reSBiZWhhdmlvciB3aXRoIG5ld2xpbmVzIGF0IHRoZSBlbmQgb2YgZmlsZS4gIFRlc3QgbG90cyBvZgorIyBjb3JuZXIgY2FzZXMgd2l0aCB0aGUgb3B0aW9uYWwgbmV3bGluZSBhcHBlbmRpbmcgYmVoYXZpb3IuCisKK3Rlc3RpbmcgInNlZCBub3JtYWwgbmV3bGluZXMiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyBpbnB1dCAtIiAiYmFuZ1xuYmFuZ1xuIiBcCisJIndvb1xuIiAid29vXG4iCit0ZXN0aW5nICJzZWQgbGVhdmUgb2ZmIHRyYWlsaW5nIG5ld2xpbmUiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyBpbnB1dCAtIiBcCisJImJhbmdcbmJhbmciICJ3b29cbiIgIndvbyIKK3Rlc3RpbmcgInNlZCBhdXRvaW5zZXJ0IG5ld2xpbmUiICJzZWQgLWUgJ3Mvd29vL2JhbmcvJyBpbnB1dCAtIiAiYmFuZ1xuYmFuZyIgXAorCSJ3b28iICJ3b28iCit0ZXN0aW5nICJzZWQgZW1wdHkgZmlsZSBwbHVzIGNhdCIgInNlZCAtZSAncy9ub2hpdC8vJyBpbnB1dCAtIiAib25lXG50d28iIFwKKwkiIiAib25lXG50d28iCit0ZXN0aW5nICJzZWQgY2F0IHBsdXMgZW1wdHkgZmlsZSIgInNlZCAtZSAncy9ub2hpdC8vJyBpbnB1dCAtIiAib25lXG50d28iIFwKKwkib25lXG50d28iICIiCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgewordGVzdGluZyAic2VkIGFwcGVuZCBhdXRvaW5zZXJ0cyBuZXdsaW5lIiAic2VkIC1lICcvd29vdC9hIHdvbycgLSIgXAorCSJ3b290XG53b29cbiIgIiIgIndvb3QiCit9Cit0ZXN0aW5nICJzZWQgaW5zZXJ0IGRvZXNuJ3QgYXV0b2luc2VydCBuZXdsaW5lIiAic2VkIC1lICcvd29vdC9pIHdvbycgLSIgXAorCSJ3b29cbndvb3QiICIiICJ3b290IgordGVzdGluZyAic2VkIHByaW50IGF1dG9pbnNlcnQgbmV3bGluZXMiICJzZWQgLWUgJ3AnIC0iICJvbmVcbm9uZSIgIiIgIm9uZSIKK3Rlc3RpbmcgInNlZCBwcmludCBhdXRvaW5zZXJ0IG5ld2xpbmVzIHR3byBmaWxlcyIgInNlZCAtZSAncCcgaW5wdXQgLSIgXAorCSJvbmVcbm9uZVxudHdvXG50d28iICJvbmUiICJ0d28iCit0ZXN0aW5nICJzZWQgbm9wcmludCwgbm8gbWF0Y2gsIG5vIG5ld2xpbmUiICJzZWQgLW5lICdzL3dvby9iYW5nLycgaW5wdXQiIFwKKwkiIiAibm9cbiIgIiIKK3Rlc3RpbmcgInNlZCBzZWxlY3RpdmUgbWF0Y2hlcyB3aXRoIG9uZSBubCIgInNlZCAtbmUgJ3Mvd29vL2JhbmcvcCcgaW5wdXQgLSIgXAorCSJhIGJhbmdcbmMgYmFuZ1xuIiAiYSB3b29cbmIgbm8iICJjIHdvb1xuZCBubyIKK3Rlc3RpbmcgInNlZCBzZWxlY3RpdmUgbWF0Y2hlcyBpbnNlcnQgbmV3bGluZSIgXAorCSJzZWQgLW5lICdzL3dvby9iYW5nL3AnIGlucHV0IC0iICJhIGJhbmdcbmIgYmFuZ1xuZCBiYW5nIiBcCisJImEgd29vXG5iIHdvbyIgImMgbm9cbmQgd29vIgordGVzdGluZyAic2VkIHNlbGVjdGl2ZSBtYXRjaGVzIG5vaW5zZXJ0IG5ld2xpbmUiIFwKKwkic2VkIC1uZSAncy93b28vYmFuZy9wJyBpbnB1dCAtIiAiYSBiYW5nXG5iIGJhbmciICJhIHdvb1xuYiB3b28iIFwKKwkiYyBub1xuZCBubyIKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7Cit0ZXN0aW5nICJzZWQgY2x1c3Rlcm5ld2xpbmUiIFwKKwkic2VkIC1lICcvb25lL2EgMTExJyAtZSAnL3R3by9pIDIyMicgLWUgcCBpbnB1dCAtIiBcCisJIm9uZVxub25lXG4xMTFcbjIyMlxudHdvXG50d28iICJvbmUiICJ0d28iCit9Cit0ZXN0aW5nICJzZWQgc3Vic3Qrd3JpdGUiIFwKKwkic2VkIC1lICdzL2kvei8nIC1lICd3b3V0cHV0dycgaW5wdXQgLTsgJEVDSE8gLW4gWDsgY2F0IG91dHB1dHciIFwKKwkidGh6bmd5XG5hZ2F6blh0aHpuZ3lcbmFnYXpuIiAidGhpbmd5IiAiYWdhaW4iCitybSBvdXRwdXR3Cit0ZXN0aW5nICJzZWQgdHJhaWxpbmcgTlVMIiBcCisJInNlZCAncy9pL3ovJyBpbnB1dCAtIiBcCisJImFcMGJcMFxuYyIgImFcMGJcMCIgImMiCit0ZXN0aW5nICJzZWQgZXNjYXBlZCBuZXdsaW5lIGluIGNvbW1hbmQiIFwKKwkic2VkICdzL2EvelxcCit6LycgaW5wdXQiIFwKKwkielxueiIgImEiICIiCisKKyMgVGVzdCBlbmQtb2YtZmlsZSBtYXRjaGluZyBiZWhhdmlvcgorCit0ZXN0aW5nICJzZWQgbWF0Y2ggRU9GIiAic2VkIC1lICciJyRwJyInIiAiaGVsbG9cbnRoZXJlXG50aGVyZSIgIiIgXAorCSJoZWxsb1xudGhlcmUiCit0ZXN0aW5nICJzZWQgbWF0Y2ggRU9GIHR3byBmaWxlcyIgInNlZCAtZSAnIickcCciJyBpbnB1dCAtIiBcCisJIm9uZVxudHdvXG50aHJlZVxuZm91clxuZm91ciIgIm9uZVxudHdvIiAidGhyZWVcbmZvdXIiCisjIHNlZCBtYXRjaCBFT0YgaW5saW5lOiBnbnUgc2VkIDQuMS41IG91dHB1dHMgdGhpczoKKyMwMDAwMDAwMCAgNmYgNmUgNjUgMGEgNmYgNmYgNmIgMGEgIDZmIDZmIDZiIDBhIDc0IDc3IDZmIDBhICB8b25lLm9vay5vb2sudHdvLnwKKyMwMDAwMDAxMCAgMGEgNzQgNjggNzIgNjUgNjUgMGEgNmYgIDZmIDZiIDBhIDZmIDZmIDZiIDBhIDY2ICB8LnRocmVlLm9vay5vb2suZnwKKyMwMDAwMDAyMCAgNmYgNzUgNzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8b3VyfAorIyB3aGljaCBsb29rcyBidWdneSB0byBtZS4KKyRFQ0hPIC1uZSAidGhyZWVcbmZvdXIiID4gaW5wdXQyCit0ZXN0aW5nICJzZWQgbWF0Y2ggRU9GIGlubGluZSIgXAorCSJzZWQgLWUgJyInJGkgb29rJyInIC1pIGlucHV0IGlucHV0MiAmJiBjYXQgaW5wdXQgaW5wdXQyIiBcCisJIm9uZVxub29rXG50d290aHJlZVxub29rXG5mb3VyIiAib25lXG50d28iICIiCitybSBpbnB1dDIKKworIyBUZXN0IGxpZS10by1hdXRvY29uZgorCit0ZXN0aW5nICJzZWQgbGllLXRvLWF1dG9jb25mIiAic2VkIC0tdmVyc2lvbiB8IGdyZXAgLW8gJ0dOVSBzZWQgdmVyc2lvbiAnIiBcCisJIkdOVSBzZWQgdmVyc2lvbiBcbiIgIiIgIiIKKworIyBKdW1wIHRvIG5vbmV4aXN0ZW50IGxhYmVsCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgeworIyBJbmNvbXBhdGliaWxpdHk6IGlsbGVnYWwganVtcCBpcyBub3QgZGV0ZWN0ZWQgaWYgaW5wdXQgaXMgIiIKKyMgKHRoYXQgaXMsIG5vIGxpbmVzIGF0IGFsbCkuIEdOVSBzZWQgNC4xLjUgY29tcGxhaW5zIGV2ZW4gaW4gdGhpcyBjYXNlCit0ZXN0aW5nICJzZWQgbm9uZXhpc3RlbnQgbGFiZWwiICJzZWQgLWUgJ2Igd2FscnVzJyAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgXAorCSJ5ZXNcbiIgIiIgIiIKK30KKwordGVzdGluZyAic2VkIGJhY2tyZWYgZnJvbSBlbXB0eSBzIHVzZXMgcmFuZ2UgcmVnZXgiIFwKKwkic2VkIC1lICcvd29vdC9zLy9lZXAgXDAgZWVwLyciICJlZXAgd29vdCBlZXAiICIiICJ3b290IgorCit0ZXN0aW5nICJzZWQgYmFja3JlZiBmcm9tIGVtcHR5IHMgdXNlcyByYW5nZSByZWdleCB3aXRoIG5ld2xpbmUiIFwKKwkic2VkIC1lICcvd29vdC9zLy9lZXAgXDAgZWVwLyciICJlZXAgd29vdCBlZXBcbiIgIiIgIndvb3RcbiIKKworIyAtaSB3aXRoIG5vIGZpbGVuYW1lCisKK3RvdWNoIC4vLSAgIyBEZXRlY3QgZ251IGZhaWx1cmUgbW9kZSBoZXJlLgordGVzdGluZyAic2VkIC1pIHdpdGggbm8gYXJnIFtHTlVGQUlMXSIgInNlZCAtZSAnJyAtaSAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCitybSAuLy0gICAgICMgQ2xlYW4gdXAKKwordGVzdGluZyAic2VkIHMveHh4L1svIiAic2VkIC1lICdzL3h4eC9bLyciICJbXG4iICIiICJ4eHhcbiIKKworIyBQb25kZXIgdGhpcyBhIGJpdCBtb3JlLCB3aHkgIndvbyBub3QgZm91bmQiIGZyb20gZ251IHZlcnNpb24/CisjdGVzdGluZyAic2VkIGRvZXNuJ3Qgc3Vic3RpdHV0ZSBpbiBkZWxldGVkIGxpbmUiIFwKKyMJInNlZCAtZSAnL29vay9kO3Mvb29rLy87dCB3b287YSBiYW5nOyciICJiYW5nIiAiIiAib29rXG4iCisKKyMgVGhpcyBtYWtlcyBib3RoIHNlZHMgdmVyeSB1bmhhcHB5LiAgV2h5PworI3Rlc3RpbmcgInNlZCAtZyAoZXhoYXVzdGl2ZSkiICJzZWQgLWUgJ3MvW1s6c3BhY2U6XV0qLywvZyciICIsMSwyLDMsNCw1LCIgXAorIwkiIiAiMTIzNDUiCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kcyIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJzZWQgbiBjb21tYW5kIG11c3QgcmVzZXQgJ3N1YnN0aXR1dGVkJyBiaXQiIFwKKwkic2VkICdzLzEveC87VDtuOzogbmV4dDtzLzMveS87dCBxdWl0O247YiBuZXh0OzogcXVpdDtxJyIgXAorCSIwXG54XG4yXG55XG4iICIiICIwXG4xXG4yXG4zXG4iCisKK3Rlc3RpbmcgInNlZCBkIGRvZXMgbm90IGJyZWFrIG4sbSBtYXRjaGluZyIgXAorCSJzZWQgLW4gJzFkOzEsM3AnIiBcCisJInNlY29uZFxudGhpcmRcbiIgIiIgImZpcnN0XG5zZWNvbmRcbnRoaXJkXG5mb3VydGhcbiIKKwordGVzdGluZyAic2VkIGQgZG9lcyBub3QgYnJlYWsgbixyZWdleCBtYXRjaGluZyIgXAorCSJzZWQgLW4gJzFkOzEsL2hpci9wJyIgXAorCSJzZWNvbmRcbnRoaXJkXG4iICIiICJmaXJzdFxuc2Vjb25kXG50aGlyZFxuZm91cnRoXG4iCisKK3Rlc3RpbmcgInNlZCBkIGRvZXMgbm90IGJyZWFrIG4scmVnZXggbWF0Y2hpbmcgIzIiIFwKKwkic2VkIC1uICcxLDVkOzEsL2hpci9wJyIgXAorCSJzZWNvbmQyXG50aGlyZDJcbiIgIiIgXAorCSJmaXJzdFxuc2Vjb25kXG50aGlyZFxuZm91cnRoXG4iImZpcnN0Mlxuc2Vjb25kMlxudGhpcmQyXG5mb3VydGgyXG4iCisKK3Rlc3RpbmcgInNlZCAyZDsyLDFwIChnbnUgY29tcGF0KSIgXAorCSJzZWQgLW4gJzJkOzIsMXAnIiBcCisJInRoaXJkXG4iICIiIFwKKwkiZmlyc3RcbnNlY29uZFxudGhpcmRcbmZvdXJ0aFxuIgorCisjIFJlZ2V4IG1lYW5zOiAibWF0Y2ggLyBhdCBCT0wgb3Igbm90aGluZywgdGhlbiBvbmUgb3IgbW9yZSBub3Qtc2xhc2hlcyIuCisjIFRoZSBidWcgd2FzIHRoYXQgc2Vjb25kIHNsYXNoIGluIC91c3IvbGliIHdhcyB0cmVhdGVkIGFzICJhdCBCT0wiIHRvby4KK3Rlc3RpbmcgInNlZCBiZWdpbm5pbmcgKF4pIG1hdGNoZXMgb25seSBvbmNlIiBcCisJInNlZCAncyxcKF4vXHxcKVteL11bXi9dKiw+XDA8LGcnIiBcCisJIj4vdXNyPC8+bGliPFxuIiAiIiBcCisJIi91c3IvbGliXG4iCisKK3Rlc3RpbmcgInNlZCBjIiBcCisJInNlZCAnY3JlcGwnIiBcCisJInJlcGxcbnJlcGxcbiIgIiIgXAorCSJmaXJzdFxuc2Vjb25kXG4iCisKK3Rlc3RpbmcgInNlZCBuZXN0ZWQge31zIiBcCisJInNlZCAnL2FzZC8geyBwOyAvcy8geyBzL3MvYy8gfTsgcDsgcSB9JyIgXAorCSJxd2VcbmFzZFxuYWNkXG5hY2RcbiIgIiIgXAorCSJxd2VcbmFzZFxuenhjXG4iCisKK3Rlc3RpbmcgInNlZCBhIGNtZCBlbmRlZCBieSBkb3VibGUgYmFja3NsYXNoIiBcCisJInNlZCAtZSAnL3wgb25lIC9hIFxcCisJfCB0aHJlZSBcXFxcJyAtZSAnL3wgb25lLS9hIFxcCisJfCB0aHJlZS0qIFxcXFwnIiBcCisnCXwgb25lIFxcCisJfCB0aHJlZSBcXAorCXwgdHdvIFxcCisnICcnIFwKKycJfCBvbmUgXFwKKwl8IHR3byBcXAorJworCisjIGZpcnN0IHRocmVlIGxpbmVzIGFyZSBkZWxldGVkOyA0dGggbGluZSBpcyBtYXRjaGVkIGFuZCBwcmludGVkIGJ5ICIyLDMiIGFuZCBieSAiNCIgcmFuZ2VzCit0ZXN0aW5nICJzZWQgd2l0aCBOIHNraXBwaW5nIGxpbmVzIHBhc3QgcmFuZ2VzIG9uIG5leHQgY21kcyIgXAorCSJzZWQgLW4gJzF7TjtOO2R9OzFwOzIsM3A7M3A7NHAnIiBcCisJIjRcbjRcbiIgIiIgIjFcbjJcbjNcbjRcbiIKKwordGVzdGluZyAic2VkIC1pIHdpdGggYWRkcmVzcyBtb2RpZmllcyBhbGwgZmlsZXMsIG5vdCBvbmx5IGZpcnN0IiBcCisJImNwIGlucHV0IGlucHV0Mjsgc2VkIC1pIC1lICcxcy9mb28vYmFyLycgaW5wdXQgaW5wdXQyICYmIGNhdCBpbnB1dCBpbnB1dDI7IHJtIGlucHV0MiIgXAorCSJiYXJcbmJhclxuIiAiZm9vXG4iICIiCisKK3Rlc3RpbmcgInNlZCB1bmRlcnN0YW5kcyBcciIgXAorCSJzZWQgJ3Mvci9cci8nIiBcCisJIlxycnJcbiIgIiIgInJyclxuIgorCit0ZXN0aW5nICJzZWQgLWkgZmluaXNoZXMgcmFuZ2VzIGNvcnJlY3RseSIgXAorCSJzZWQgJzEsMmQnIC1pIGlucHV0OyBlY2hvIFwkPzsgY2F0IGlucHV0IiBcCisJIjBcbjNcbjRcbiIgIjFcbjJcbjNcbjRcbiIgIiIKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImNvbW1hbmRzIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3NlcS50ZXN0cyBiL3Rlc3RzdWl0ZS9zZXEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWUxMTE2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9zZXEudGVzdHMKQEAgLTAsMCArMSw0NiBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHNlcSB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworIyBBVURJVDogRnVsbCBTVVN2MyBjb3ZlcmFnZSAoZXhjZXB0IGludGVybmF0aW9uYWxpemF0aW9uKS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKKyMgVGVzdCBleGl0IHN0YXR1cworCit0ZXN0aW5nICJzZXEgKGV4aXQgd2l0aCBlcnJvcikiICJzZXEgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgKGV4aXQgd2l0aCBlcnJvcikiICJzZXEgMSAyIDMgNCAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgb25lIGFyZ3VtZW50IiAic2VxIDMiICIxXG4yXG4zXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyIgInNlcSA1IDciICI1XG42XG43XG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyByZXZlcnNlZCIgInNlcSA3IDUiICIiICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCIgInNlcSAzIDMiICIzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IG5lZ2F0aXZlIHN0ZXAiICJzZXEgMSAtMTUgMSIgXAorCSIxXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IHBvc2l0aXZlIHN0ZXAiICJzZXEgMSArMTUgMSIgXAorCSIxXG4iICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgdXAgYnkgMiIgInNlcSA0IDIgOCIgIjRcbjZcbjhcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBkb3duIGJ5IDIiICJzZXEgOCAtMiA0IiAiOFxuNlxuNFxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IHdyb25nIHdheSAjMSIgInNlcSA0IC0yIDgiICIiICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgd3Jvbmcgd2F5ICMyIiAic2VxIDggMiA0IiAiIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zIiAic2VxIDMgLjMgNCIgIjMuMFxuMy4zXG4zLjZcbjMuOVxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zMCIgInNlcSAzIC4zMCA0IiAiMy4wMFxuMy4zMFxuMy42MFxuMy45MFxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zMCB0byA0LjAwMCIgInNlcSAzIC4zMCA0LjAwMCIgIjMuMDBcbjMuMzBcbjMuNjBcbjMuOTBcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBieSAtLjkiICJzZXEgLjcgLS45IC0yLjIiICIwLjdcbi0wLjJcbi0xLjFcbi0yLjBcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBieSB6ZXJvIiAic2VxIDQgMCA4IHwgaGVhZCAtbiAxMCIgIjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbiIgIiIgIiIKKwordGVzdGluZyAic2VxIG9uZSBhcmd1bWVudCB3aXRoIHBhZGRpbmciICJzZXEgLXcgMDAzIiAiMDAxXG4wMDJcbjAwM1xuIiAiIiAiIgordGVzdGluZyAic2VxIHR3byBhcmd1bWVudHMgd2l0aCBwYWRkaW5nIiAic2VxIC13IDAwNSA3IiAiMDA1XG4wMDZcbjAwN1xuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGRvd24gYnkgMyB3aXRoIHBhZGRpbmciICJzZXEgLXcgOCAtMyAwNCIgIjA4XG4wNVxuIiAiIiAiIgorIyBMb29rcyBsaWtlIGEgYnVnIGluIGNvcmV1dGlscyA2LjEwOiBpdCB1c2VzIHdpZHRoIG9uZSBsZXNzIHRoYW4gbmVlZGVkCisjIFRoZXNlIHRlc3RzIGNvbnRhaW4gdGhlIGV4cGVjdGVkICJmaXhlZCIgb3V0cHV0Cit0ZXN0aW5nICJzZXEgY291bnQgYnkgLjMgd2l0aCBwYWRkaW5nIDEiICJzZXEgLXcgMDkgLjMgMTEiICIwOS4wXG4wOS4zXG4wOS42XG4wOS45XG4xMC4yXG4xMC41XG4xMC44XG4iICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgYnkgLjMgd2l0aCBwYWRkaW5nIDIiICJzZXEgLXcgMDMgLjMgMDAwNCIgIjAwMDMuMFxuMDAwMy4zXG4wMDAzLjZcbjAwMDMuOVxuIiAiIiAiIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9zaGExc3VtLnRlc3RzIGIvdGVzdHN1aXRlL3NoYTFzdW0udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTk2OGZhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9zaGExc3VtLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL3NoCisKKy4gLi9tZDVzdW0udGVzdHMgc2hhMXN1bSBkNDEzMzdlODM0Mzc3MTQwYWU3Zjk4NDYwZDcxZDkwODU5OGVmMDRmCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc2hhMjU2c3VtLnRlc3RzIGIvdGVzdHN1aXRlL3NoYTI1NnN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMmRkNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3NoYTI1NnN1bS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vbWQ1c3VtLnRlc3RzIHNoYTI1NnN1bSA4ZTFkM2VkNTdlYmMxMzBmMGY3MjUwODQ0NjU1OWVlYWUwNjQ1MWFlNmQ2MWIxZThjZTQ2MzcwY2ZiODk2M2MzCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc2hhNTEyc3VtLnRlc3RzIGIvdGVzdHN1aXRlL3NoYTUxMnN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYmM3Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3NoYTUxMnN1bS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vbWQ1c3VtLnRlc3RzIHNoYTUxMnN1bSBmZTQxM2UwZjE3NzMyNGQxMzUzODkzY2EwNzcyY2ViYTgzZmQ0MTUxMmJhNjM4OTVhMGVlYmI3MDNlZjlmZWFjMmZiNGU5MmIyY2I0MzBiM2JkYTQxYjQ2YjBjYjRlYTgzMDcxOTBhNWNjNzk1MTU3Y2ZiNjgwYTljZDYzNWQwZgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3NvcnQudGVzdHMgYi90ZXN0c3VpdGUvc29ydC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWIyODJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3NvcnQudGVzdHMKQEAgLTAsMCArMSwxMzEgQEAKKyMhL2Jpbi9zaAorCisjIFNVU3YzIGNvbXBsaWFudCBzb3J0IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIFRoZSBiYXNpYyB0ZXN0cy4gIFRoZXNlIHNob3VsZCB3b3JrIGV2ZW4gd2l0aCB0aGUgc21hbGwgYnVzeWJveC4KKwordGVzdGluZyAic29ydCIgInNvcnQgaW5wdXQiICJhXG5iXG5jXG4iICJjXG5hXG5iXG4iICIiCit0ZXN0aW5nICJzb3J0ICMyIiAic29ydCBpbnB1dCIgIjAxMFxuMVxuM1xuIiAiM1xuMVxuMDEwXG4iICIiCit0ZXN0aW5nICJzb3J0IHN0ZGluIiAic29ydCIgImFcbmJcbmNcbiIgIiIgImJcbmFcbmNcbiIKK3Rlc3RpbmcgInNvcnQgbnVtZXJpYyIgInNvcnQgLW4gaW5wdXQiICIxXG4zXG4wMTBcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAic29ydCByZXZlcnNlIiAic29ydCAtciBpbnB1dCIgIndvb2tcbndhbHJ1c1xucG9pbnRcbnBhYnN0XG5hYXJnaFxuIiBcCisJInBvaW50XG53b29rXG5wYWJzdFxuYWFyZ2hcbndhbHJ1c1xuIiAiIgorCisjIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhlIGZ1bGwgb3B0aW9uIHNldC4KKworb3B0aW9uYWwgRkVBVFVSRV9TT1JUX0JJRworIyBMb25naXNoIGNodW5rIG9mIGRhdGEgcmUtdXNlZCBieSB0aGUgbmV4dCBmZXcgdGVzdHMKKworZGF0YT0iNDIJMQkzCXdvb3QKKzQyCTEJMDEwCXpvb2xvZ3kKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzk5OQkzCTAJYWxnZWJyYQorIgorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZChzKSIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIFNvcnRpbmcgd2l0aCBrZXlzCisKK3Rlc3RpbmcgInNvcnQgb25lIGtleSIgInNvcnQgLWs0LDQgaW5wdXQiIFwKKyI5OTkJMwkwCWFsZ2VicmEKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzQyCTEJMwl3b290Cis0MgkxCTAxMAl6b29sb2d5CisiICIkZGF0YSIgIiIKKwordGVzdGluZyAic29ydCBrZXkgcmFuZ2Ugd2l0aCBudW1lcmljIG9wdGlvbiIgInNvcnQgLWsyLDNuIGlucHV0IiBcCisiNDIJMQkwMTAJem9vbG9neQorNDIJMQkzCXdvb3QKK2VnZwkxCTIJcGFweXJ1cworNwkzCTQyCXNvdXAKKzk5OQkzCTAJYWxnZWJyYQorIiAiJGRhdGEiICIiCisKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CisjIEJ1c3lib3ggaXMgZGVmaW5pdGVseSBkb2luZyB0aGVzZSB3cm9uZy4gIEZJWE1FCit0ZXN0aW5nICJzb3J0IGtleSByYW5nZSB3aXRoIG51bWVyaWMgb3B0aW9uIGFuZCBnbG9iYWwgcmV2ZXJzZSIgXAorInNvcnQgLWsyLDNuIC1yIGlucHV0IiBcCisiZWdnCTEJMglwYXB5cnVzCis0MgkxCTMJd29vdAorNDIJMQkwMTAJem9vbG9neQorOTk5CTMJMAlhbGdlYnJhCis3CTMJNDIJc291cAorIiAiJGRhdGEiICIiCisKK3Rlc3RpbmcgInNvcnQga2V5IHJhbmdlIHdpdGggbXVsdGlwbGUgb3B0aW9ucyIgInNvcnQgLWsyLDNybiBpbnB1dCIgXAorIjcJMwk0Mglzb3VwCis5OTkJMwkwCWFsZ2VicmEKKzQyCTEJMDEwCXpvb2xvZ3kKKzQyCTEJMwl3b290CitlZ2cJMQkyCXBhcHlydXMKKyIgIiRkYXRhIiAiIgorfQorCit0ZXN0aW5nICJzb3J0IGtleSByYW5nZSB3aXRoIHR3byAtayBvcHRpb25zIiAic29ydCAtayAyLDJuIC1rIDEsMXIgaW5wdXQiICJcCitkIDIKK2IgMgorYyAzCisiICJcCitjIDMKK2IgMgorZCAyCisiICIiCisKK3Rlc3RpbmcgInNvcnQgd2l0aCBub24tZGVmYXVsdCBsZWFkaW5nIGRlbGltIDEiICJzb3J0IC1uIC1rMiAtdC8gaW5wdXQiICJcCisvYS8yCisvYi8xCisiICJcCisvYS8yCisvYi8xCisiICIiCisKK3Rlc3RpbmcgInNvcnQgd2l0aCBub24tZGVmYXVsdCBsZWFkaW5nIGRlbGltIDIiICJzb3J0IC1uIC1rMyAtdC8gaW5wdXQiICJcCisvYi8xCisvYS8yCisiICJcCisvYi8xCisvYS8yCisiICIiCisKK3Rlc3RpbmcgInNvcnQgd2l0aCBub24tZGVmYXVsdCBsZWFkaW5nIGRlbGltIDMiICJzb3J0IC1uIC1rMyAtdC8gaW5wdXQiICJcCisvL2EvMgorLy9iLzEKKyIgIlwKKy8vYS8yCisvL2IvMQorIiAiIgorCit0ZXN0aW5nICJzb3J0IC11IHNob3VsZCBjb25zaWRlciBmaWVsZCBvbmx5IHdoZW4gZGlzY2FyZGluZyIgInNvcnQgLXUgLWsyIGlucHV0IiAiXAorYSBjCisiICJcCithIGMKK2IgYworIiAiIgorCit0ZXN0aW5nICJzb3J0IC16IG91dHB1dHMgTlVMIHRlcm1pbmF0ZWQgbGluZXMiICJzb3J0IC16IGlucHV0IiAiXAorb25lXDB0aHJlZVwwdHdvXDBcCisiICJcCitvbmVcMHR3b1wwdGhyZWVcMFwKKyIgIiIKKwordGVzdGluZyAic29ydCBrZXkgZG9lc24ndCBzdHJpcCBsZWFkaW5nIGJsYW5rcywgZGlzYWJsZXMgZmFsbGJhY2sgZ2xvYmFsIHNvcnQiIFwKKyJzb3J0IC1uIC1rMiAtdCAnICciICIgYSBcbiAxIFxuIDIgXG4iICIiICIgMiBcbiAxIFxuIGEgXG4iCisKK3Rlc3RpbmcgInNvcnQgZmlsZSBpbiBwbGFjZSIgXAorInNvcnQgLW8gaW5wdXQgaW5wdXQgJiYgY2F0IGlucHV0IiAiXAorMTExCisyMjIKKyIgIlwKKzIyMgorMTExCisiICIiCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kKHMpIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3N0YXJ0LXN0b3AtZGFlbW9uLnRlc3RzIGIvdGVzdHN1aXRlL3N0YXJ0LXN0b3AtZGFlbW9uLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwN2FlZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc3RhcnQtc3RvcC1kYWVtb24udGVzdHMKQEAgLTAsMCArMSwxOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY21kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJzdGFydC1zdG9wLWRhZW1vbiAteCB3aXRob3V0IC1hIiBcCisJJ3N0YXJ0LXN0b3AtZGFlbW9uIC1TIC14IHRydWUgMj4mMTsgZWNobyAkPycgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJzdGFydC1zdG9wLWRhZW1vbiAtYSB3aXRob3V0IC14IiBcCisJJ3N0YXJ0LXN0b3AtZGFlbW9uIC1TIC1hIGZhbHNlIDI+JjE7IGVjaG8gJD8nIFwKKwkiMVxuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc3RyaW5ncy9zdHJpbmdzLXdvcmtzLWxpa2UtR05VIGIvdGVzdHN1aXRlL3N0cmluZ3Mvc3RyaW5ncy13b3Jrcy1saWtlLUdOVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY0NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3N0cmluZ3Mvc3RyaW5ncy13b3Jrcy1saWtlLUdOVQpAQCAtMCwwICsxLDkgQEAKK3JtIC1mIGZvbyBiYXIKK3N0cmluZ3MgLWFmIC4uLy4uL2J1c3lib3ggPiBmb28KK2J1c3lib3ggc3RyaW5ncyAtYWYgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc3VtLnRlc3RzIGIvdGVzdHN1aXRlL3N1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOWY0Y2JmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3N1bS50ZXN0cwpAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKworIyB1bml0IHRlc3QgZm9yIHN1bS4KKyMgQ29weXJpZ2h0IDIwMDcgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IFVuaXQgdGVzdHMgZm9yIHN1bQorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKwordGVzdGluZyAic3VtIC1yIGZpbGUgZG9lc24ndCBwcmludCBmaWxlJ3MgbmFtZSIgXAorICAgICAgICAic3VtIC1yICQwIHwgZ3JlcCAtYyAkMCAmJiBlY2hvIHdyb25nbHlfcHJpbnRlZF9maWxlbmFtZSB8fCBlY2hvIHllcyIgXAorCSIwXG55ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgInN1bSAtciBmaWxlIGZpbGUgZG9lcyBwcmludCBib3RoIG5hbWVzIiBcCisgICAgICAgICJzdW0gLXIgJDAgJDAgfCBncmVwIC1jICQwICYmIGVjaG8geWVzIHx8IGVjaG8gd3JvbmdseV9vbWl0dGVkX2ZpbGVuYW1lIiBcCisJIjJcbnllc1xuIiAiIiAiIgordGVzdGluZyAic3VtIC1zIGZpbGUgZG9lcyBwcmludCBmaWxlJ3MgbmFtZSIgXAorICAgICAgICAic3VtIC1zICQwIHwgZ3JlcCAtYyAkMCAmJiBlY2hvIHllcyB8fCBlY2hvIHdyb25nbHlfb21pdHRlZF9maWxlbmFtZSIgXAorCSIxXG55ZXNcbiIgIiIgIiIKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RhaWwudGVzdHMgYi90ZXN0c3VpdGUvdGFpbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDVhODNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RhaWwudGVzdHMKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDkgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKK3Rlc3RpbmcgInRhaWw6ICtOIHdpdGggTiA+IGZpbGUgbGVuZ3RoIiBcCisJInRhaWwgLWMgKzU1IDI+JjE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICJxdyIKKwordGVzdGluZyAidGFpbDogLWMgK04gd2l0aCBsYXJnaXNoIE4iIFwKKwkiCisJZGQgaWY9L2Rldi96ZXJvIGJzPTE2ayBjb3VudD0xIDI+L2Rldi9udWxsIHwgdGFpbCAtYyArODIwMCB8IHdjIC1jOworCWRkIGlmPS9kZXYvemVybyBicz0xNmsgY291bnQ9MSAyPi9kZXYvbnVsbCB8IHRhaWwgLWMgKzgyMDggfCB3YyAtYzsKKwkiIFwKKwkiODE4NVxuODE3N1xuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFpbC90YWlsLW4td29ya3MgYi90ZXN0c3VpdGUvdGFpbC90YWlsLW4td29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxMzE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YWlsL3RhaWwtbi13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyRFQ0hPIC1uZSAiYWJjXG5kZWZcbjEyM1xuIiA+aW5wdXQKKyRFQ0hPIC1uZSAiZGVmXG4xMjNcbiIgPmxvZ2ZpbGUub2sKK2J1c3lib3ggdGFpbCAtbiAyIGlucHV0ID4gbG9nZmlsZS5iYgorY21wIGxvZ2ZpbGUub2sgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RhaWwvdGFpbC13b3JrcyBiL3Rlc3RzdWl0ZS90YWlsL3RhaWwtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlY2ExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YWlsL3RhaWwtd29ya3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19JTkNMVURFX1NVU3YyCisKKyRFQ0hPIC1uZSAiYWJjXG5kZWZcbjEyM1xuIiA+aW5wdXQKKyRFQ0hPIC1uZSAiZGVmXG4xMjNcbiIgPmxvZ2ZpbGUub2sKK2J1c3lib3ggdGFpbCAtMiBpbnB1dCA+IGxvZ2ZpbGUuYmIKK2NtcCBsb2dmaWxlLm9rIGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIudGVzdHMgYi90ZXN0c3VpdGUvdGFyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5ZWNlNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyLnRlc3RzCkBAIC0wLDAgKzEsMTk1IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDkgYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKwordW5zZXQgTEFORwordW5zZXQgTEFOR1VBR0UKK3Vuc2V0IExDX0NPTExBVEUKK3Vuc2V0IExDX0FMTAordW1hc2sgMDIyCisKK3JtIC1yZiB0YXIudGVtcGRpciAyPi9kZXYvbnVsbAorbWtkaXIgdGFyLnRlbXBkaXIgJiYgY2QgdGFyLnRlbXBkaXIgfHwgZXhpdCAxCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAic2NyaXB0IiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgInRhciBoYXJkbGlua3MgYW5kIHJlcGVhdGVkIGZpbGVzIiAnXAorcm0gLXJmIGlucHV0XyogdGVzdC50YXIgMj4vZGV2L251bGwKKz5pbnB1dF9oYXJkMQorbG4gaW5wdXRfaGFyZDEgaW5wdXRfaGFyZDIKK21rZGlyIGlucHV0X2RpcgorPmlucHV0X2Rpci9maWxlCitjaG1vZCAtUiA2NDQgKgorY2htb2QgICAgNzU1IGlucHV0X2RpcgordGFyIGNmIHRlc3QudGFyIGlucHV0IGlucHV0X2Rpci8gaW5wdXRfaGFyZDEgaW5wdXRfaGFyZDIgaW5wdXRfaGFyZDEgaW5wdXRfZGlyLyBpbnB1dAordGFyIHR2ZiB0ZXN0LnRhciB8IHNlZCAicy8uKlswLTldIGlucHV0L2lucHV0LyIKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgLiBpbnB1dF9kaXIvKiB8IGdyZXAgaW5wdXRfIHwgc2VkICJzL1xcKF5bXiBdKlxcKSAuKiBpbnB1dC9cXDEgaW5wdXQvIgorJyAiXAoraW5wdXQKK2lucHV0X2Rpci8KK2lucHV0X2Rpci9maWxlCitpbnB1dF9oYXJkMQoraW5wdXRfaGFyZDIgLT4gaW5wdXRfaGFyZDEKK2lucHV0X2hhcmQxIC0+IGlucHV0X2hhcmQxCitpbnB1dF9kaXIvCitpbnB1dF9kaXIvZmlsZQoraW5wdXQKK09rOiAwCistcnctci0tci0tIGlucHV0X2Rpci9maWxlCitkcnd4ci14ci14IGlucHV0X2RpcgorLXJ3LXItLXItLSBpbnB1dF9oYXJkMQorLXJ3LXItLXItLSBpbnB1dF9oYXJkMgorIiBcCisiIiAiIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9UQVJfQ1JFQVRFIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJ0YXIgaGFyZGxpbmtzIG1vZGUiICdcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorPmlucHV0X2hhcmQxCitjaG1vZCA3NDEgaW5wdXRfaGFyZDEKK2xuIGlucHV0X2hhcmQxIGlucHV0X2hhcmQyCitta2RpciBpbnB1dF9kaXIKK2xuIGlucHV0X2hhcmQxIGlucHV0X2RpcgorbG4gaW5wdXRfaGFyZDIgaW5wdXRfZGlyCitjaG1vZCA1NTAgaW5wdXRfZGlyCisjIE9uIHNvbWUgZmlsZXN5c3RlbXMsIGlucHV0X2Rpci9pbnB1dF9oYXJkMiBpcyByZXR1cm5lZCBieSByZWFkZGlyCisjIEJFRk9SRSBpbnB1dF9kaXIvaW5wdXRfaGFyZDEhIFRoYXRzIHdoeSB3ZSBjYW50IGp1c3QgInRhciBjZiAuLi4gaW5wdXRfKiI6Cit0YXIgY2YgdGVzdC50YXIgaW5wdXRfZGlyL2lucHV0X2hhcmQqIGlucHV0X2hhcmQqCit0YXIgdHZmIHRlc3QudGFyIHwgc2VkICJzLy4qWzAtOV0gaW5wdXQvaW5wdXQvIgorY2htb2QgNzcwIGlucHV0X2Rpcgorcm0gLXJmIGlucHV0XyoKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgLiBpbnB1dF9kaXIvKiB8IGdyZXAgImlucHV0LipoYXJkIiB8IHNlZCAicy9cXCheW14gXSpcXCkgLiogaW5wdXQvXFwxIGlucHV0LyIKKycgIlwKK2lucHV0X2Rpci9pbnB1dF9oYXJkMQoraW5wdXRfZGlyL2lucHV0X2hhcmQyIC0+IGlucHV0X2Rpci9pbnB1dF9oYXJkMQoraW5wdXRfaGFyZDEgLT4gaW5wdXRfZGlyL2lucHV0X2hhcmQxCitpbnB1dF9oYXJkMiAtPiBpbnB1dF9kaXIvaW5wdXRfaGFyZDEKK09rOiAwCistcnd4ci0tLS14IGlucHV0X2Rpci9pbnB1dF9oYXJkMQorLXJ3eHItLS0teCBpbnB1dF9kaXIvaW5wdXRfaGFyZDIKKy1yd3hyLS0tLXggaW5wdXRfaGFyZDEKKy1yd3hyLS0tLXggaW5wdXRfaGFyZDIKKyIgXAorIiIgIiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURSBGRUFUVVJFX0xTX1NPUlRGSUxFUwordGVzdGluZyAidGFyIHN5bWxpbmtzIG1vZGUiICdcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorPmlucHV0X2ZpbGUKK2NobW9kIDc0MSBpbnB1dF9maWxlCitsbiAtcyBpbnB1dF9maWxlIGlucHV0X3NvZnQKK21rZGlyIGlucHV0X2RpcgorbG4gaW5wdXRfZmlsZSBpbnB1dF9kaXIKK2xuIGlucHV0X3NvZnQgaW5wdXRfZGlyCitjaG1vZCA1NTAgaW5wdXRfZGlyCit0YXIgY2YgdGVzdC50YXIgaW5wdXRfZGlyLyogaW5wdXRfW2ZzXSoKK3RhciB0dmYgdGVzdC50YXIgfCBzZWQgInMvLipbMC05XSBpbnB1dC9pbnB1dC8iIHwgc29ydAorY2htb2QgNzcwIGlucHV0X2Rpcgorcm0gLXJmIGlucHV0XyoKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgLiBpbnB1dF9kaXIvKiB8IGdyZXAgImlucHV0X1tmc10iIHwgc2VkICJzL1xcKF5bXiBdKlxcKSAuKiBpbnB1dC9cXDEgaW5wdXQvIgorJyAiXAoraW5wdXRfZGlyL2lucHV0X2ZpbGUKK2lucHV0X2Rpci9pbnB1dF9zb2Z0IC0+IGlucHV0X2ZpbGUKK2lucHV0X2ZpbGUgLT4gaW5wdXRfZGlyL2lucHV0X2ZpbGUKK2lucHV0X3NvZnQgLT4gaW5wdXRfZGlyL2lucHV0X3NvZnQKK09rOiAwCistcnd4ci0tLS14IGlucHV0X2Rpci9pbnB1dF9maWxlCitscnd4cnd4cnd4IGlucHV0X2ZpbGUKKy1yd3hyLS0tLXggaW5wdXRfZmlsZQorbHJ3eHJ3eHJ3eCBpbnB1dF9maWxlCisiIFwKKyIiICIiCitTS0lQPQorCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCit0ZXN0aW5nICJ0YXIgLS1vdmVyd3JpdGUiICJcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorbG4gaW5wdXQgaW5wdXRfaGFyZAordGFyIGNmIHRlc3QudGFyIGlucHV0X2hhcmQKK2VjaG8gV1JPTkcgPmlucHV0CisjIC0tb3ZlcndyaXRlIG9wZW5zICdpbnB1dF9oYXJkJyB3aXRob3V0IHVubGlua2luZywKKyMgdGh1cyAnaW5wdXRfaGFyZCcgc3RpbGwgbGlua2VkIHRvICdpbnB1dCcgYW5kIHdlIHdyaXRlICdPaycgaW50byBpdAordGFyIHhmIHRlc3QudGFyIC0tb3ZlcndyaXRlIDI+JjEgJiYgY2F0IGlucHV0CisiICJcCitPaworIiBcCisiT2tcbiIgIiIKK1NLSVA9CisKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CisjIE5lZWRzIHRvIGJlIHJ1biB1bmRlciBub24tcm9vdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0CitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUKK3Rlc3RpbmcgInRhciB3cml0aW5nIGludG8gcmVhZC1vbmx5IGRpciIgJ1wKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCitta2RpciBpbnB1dF9kaXIKKz5pbnB1dF9kaXIvaW5wdXRfZmlsZQorY2htb2QgNTUwIGlucHV0X2RpcgordGFyIGNmIHRlc3QudGFyIGlucHV0X2RpcgordGFyIHR2ZiB0ZXN0LnRhciB8IHNlZCAicy8uKlswLTldIGlucHV0L2lucHV0LyIKK2NobW9kIDc3MCBpbnB1dF9kaXIKK3JtIC1yZiBpbnB1dF8qCit0YXIgeGYgdGVzdC50YXIgMj4mMQorZWNobyBPazogJD8KK2xzIC1sIGlucHV0X2Rpci8qIC4gfCBncmVwIGlucHV0XyB8IHNlZCAicy9cXCheW14gXSpcXCkgLiogaW5wdXQvXFwxIGlucHV0LyIKK2NobW9kIDc3MCBpbnB1dF9kaXIKKycgIlwKK2lucHV0X2Rpci8KK2lucHV0X2Rpci9pbnB1dF9maWxlCitPazogMAorLXJ3LXItLXItLSBpbnB1dF9kaXIvaW5wdXRfZmlsZQorZHIteHIteC0tLSBpbnB1dF9kaXIKKyIgXAorIiIgIiIKK1NLSVA9Cit9CisKKyMgSGFkIGEgYnVnIHdoZXJlIG9uIGV4dHJhY3QgYXV0b2RldGVjdCBmaXJzdCAic3dpdGNoZWQgb2ZmIiAtegorIyBhbmQgdGhlbiBmYWlsZWQgdG8gcmVjb2duaXplIC50Z3ogZXh0ZW5zaW9uCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9TRUFNTEVTU19HWgordGVzdGluZyAidGFyIGV4dHJhY3QgdGd6IiAiXAorZGQgY291bnQ9MSBicz0xTSBpZj0vZGV2L3plcm8gb2Y9RjAgMj4vZGV2L251bGwKK3RhciAtY3pmIEYwLnRneiBGMAorcm0gRjAKK3RhciAteHp2ZiBGMC50Z3ogJiYgZWNobyBPaworcm0gRjAgfHwgZWNobyBCQUQKKyIgIlwKK0YwCitPaworIiBcCisiIiAiIgorU0tJUD0KKworIyBPbiBleHRyYWN0LCBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgbGFzdCAiLi4iIGNvbXBvbmVudCBpcyBzdHJpcHBlZAorb3B0aW9uYWwgRkVBVFVSRV9UQVJfQ1JFQVRFCit0ZXN0aW5nICJ0YXIgc3RyaXBzIC8uLi8gb24gZXh0cmFjdCIgIlwKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCitta2RpciBpbnB1dF9kaXIKK2VjaG8gT2sgPmlucHV0X2Rpci9maWxlCit0YXIgY2YgdGVzdC50YXIgLi8uLi90YXIudGVtcGRpci9pbnB1dF9kaXIvLi4vaW5wdXRfZGlyIDI+JjEKK3JtIC1yZiBpbnB1dF8qIDI+L2Rldi9udWxsCit0YXIgLXZ4ZiB0ZXN0LnRhciAyPiYxCitjYXQgaW5wdXRfZGlyL2ZpbGUgMj4mMQorIiAiXAordGFyOiByZW1vdmluZyBsZWFkaW5nICcuLy4uL3Rhci50ZW1wZGlyL2lucHV0X2Rpci8uLi8nIGZyb20gbWVtYmVyIG5hbWVzCitpbnB1dF9kaXIvCitpbnB1dF9kaXIvZmlsZQorT2sKKyIgXAorIiIgIiIKK1NLSVA9CisKKworY2QgLi4gJiYgcm0gLXJmIHRhci50ZW1wZGlyIHx8IGV4aXQgMQorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWFyY2hpdmVzLW11bHRpcGxlLWZpbGVzIGIvdGVzdHN1aXRlL3Rhci90YXItYXJjaGl2ZXMtbXVsdGlwbGUtZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1ZDllOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWFyY2hpdmVzLW11bHRpcGxlLWZpbGVzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCit0b3VjaCBmb28gYmFyCitidXN5Ym94IHRhciBjZiBmb28udGFyIGZvbyBiYXIKK3JtIGZvbyBiYXIKK3RhciB4ZiBmb28udGFyCit0ZXN0IC1mIGZvbyAtYSAtZiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWNvbXBsYWlucy1hYm91dC1taXNzaW5nLWZpbGUgYi90ZXN0c3VpdGUvdGFyL3Rhci1jb21wbGFpbnMtYWJvdXQtbWlzc2luZy1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZThjYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1jb21wbGFpbnMtYWJvdXQtbWlzc2luZy1maWxlCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggZm9vCit0YXIgY2YgZm9vLnRhciBmb28KKyEgYnVzeWJveCB0YXIgeGYgZm9vLnRhciBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbGVhc3Qtb25lLWN0eCBiL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbGVhc3Qtb25lLWN0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU3ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1sZWFzdC1vbmUtY3R4CkBAIC0wLDAgKzEgQEAKKyEgYnVzeWJveCB0YXIgdgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1tb3N0LW9uZS1jdHggYi90ZXN0c3VpdGUvdGFyL3Rhci1kZW1hbmRzLWF0LW1vc3Qtb25lLWN0eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBkMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1tb3N0LW9uZS1jdHgKQEAgLTAsMCArMSBAQAorISBidXN5Ym94IHRhciB0eApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtYWxsLXN1YmRpcnMgYi90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1hbGwtc3ViZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTM1MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtYWxsLXN1YmRpcnMKQEAgLTAsMCArMSwxMiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCitta2RpciAtcCBmb28vezEsMiwzfQorbWtkaXIgLXAgZm9vLzEvezEwLDExfQorbWtkaXIgLXAgZm9vLzEvMTAvezEwMCwxMDEsMTAyfQordGFyIGNmIGZvby50YXIgLUMgZm9vIC4KK3JtIC1yZiBmb28vKgorYnVzeWJveCB0YXIgeGYgZm9vLnRhciAtQyBmb28gLi8xLzEwCitmaW5kIGZvbyB8IHNvcnQgPmxvZ2ZpbGUuYmIKK3JtIC1yZiBmb28vKgordGFyIHhmIGZvby50YXIgLUMgZm9vIC4vMS8xMAorZmluZCBmb28gfCBzb3J0ID5sb2dmaWxlLmdudQorZGlmZiAtdSBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1maWxlIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTcyZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZmlsZQpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCitybSBmb28KK2J1c3lib3ggdGFyIHhmIGZvby50YXIKK3Rlc3QgLWYgZm9vCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1mcm9tLXN0YW5kYXJkLWlucHV0IGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZnJvbS1zdGFuZGFyZC1pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBlOWYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZnJvbS1zdGFuZGFyZC1pbnB1dApAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCitybSBmb28KK2NhdCBmb28udGFyIHwgYnVzeWJveCB0YXIgeAordGVzdCAtZiBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLW11bHRpcGxlLWZpbGVzIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtbXVsdGlwbGUtZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5N2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLW11bHRpcGxlLWZpbGVzCkBAIC0wLDAgKzEsNiBAQAordG91Y2ggZm9vIGJhcgordGFyIGNmIGZvby50YXIgZm9vIGJhcgorcm0gZm9vIGJhcgorYnVzeWJveCB0YXIgLXhmIGZvby50YXIKK3Rlc3QgLWYgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtdG8tc3RhbmRhcmQtb3V0cHV0IGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtdG8tc3RhbmRhcmQtb3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDhlMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy10by1zdGFuZGFyZC1vdXRwdXQKQEAgLTAsMCArMSwzIEBACitlY2hvIGZvbyA+IGZvbwordGFyIGNmIGZvby50YXIgZm9vCitjYXQgZm9vLnRhciB8IGJ1c3lib3ggdGFyIE94IHwgY21wIGZvbyAtCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWN6LW9wdGlvbnMgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWN6LW9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjNjI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtY3otb3B0aW9ucwpAQCAtMCwwICsxLDUgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWgordG91Y2ggZm9vCitidXN5Ym94IHRhciBjemYgZm9vLnRhci5neiBmb28KK2d6aXAgLWQgZm9vLnRhci5negpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1lbXB0eS1pbmNsdWRlLWFuZC1ub24tZW1wdHktZXhjbHVkZS1saXN0IGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1lbXB0eS1pbmNsdWRlLWFuZC1ub24tZW1wdHktZXhjbHVkZS1saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzM2NDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWVtcHR5LWluY2x1ZGUtYW5kLW5vbi1lbXB0eS1leGNsdWRlLWxpc3QKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9GUk9NCisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEUKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCitlY2hvIGZvbyA+Zm9vLmV4Y2x1ZGUKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgLVggZm9vLmV4Y2x1ZGUKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZXhjbHVkZS1hbmQtZXh0cmFjdC1saXN0cyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZXhjbHVkZS1hbmQtZXh0cmFjdC1saXN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGUwZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1leGNsdWRlLWFuZC1leHRyYWN0LWxpc3RzCkBAIC0wLDAgKzEsOCBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfRlJPTQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCit0b3VjaCBmb28gYmFyIGJhegordGFyIGNmIGZvby50YXIgZm9vIGJhciBiYXoKK2VjaG8gZm9vID5mb28uZXhjbHVkZQorcm0gZm9vIGJhciBiYXoKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgZm9vIGJhciAtWCBmb28uZXhjbHVkZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIgLWEgISAtZiBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbXVsdGlwbGUtWC1vcHRpb25zIGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1tdWx0aXBsZS1YLW9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1YjI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbXVsdGlwbGUtWC1vcHRpb25zCkBAIC0wLDAgKzEsMTAgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0ZST00KKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQordG91Y2ggZm9vCit0b3VjaCBiYXIKK3RhciBjZiBmb28udGFyIGZvbyBiYXIKK2VjaG8gZm9vID4gZm9vLmV4Y2x1ZGUKK2VjaG8gYmFyID4gYmFyLmV4Y2x1ZGUKK3JtIGZvbyBiYXIKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgLVggZm9vLmV4Y2x1ZGUgLVggYmFyLmV4Y2x1ZGUKK3Rlc3QgISAtZiBmb28gLWEgISAtZiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbmVzdGVkLWV4Y2x1ZGUgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW5lc3RlZC1leGNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDEzYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW5lc3RlZC1leGNsdWRlCkBAIC0wLDAgKzEsOSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfRlJPTQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCitta2RpciBmb28KK3RvdWNoIGZvby9iYXIKK3RhciBjZiBmb28udGFyIGZvbworcm0gLXJmIGZvbworZWNobyBmb28vYmFyID5mb29iYXIuZXhjbHVkZQorYnVzeWJveCB0YXIgeGYgZm9vLnRhciBmb28gLVggZm9vYmFyLmV4Y2x1ZGUKK3Rlc3QgLWQgZm9vIC1hICEgLWYgZm9vL2JhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXJfd2l0aF9saW5rX3dpdGhfc2l6ZSBiL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfbGlua193aXRoX3NpemUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Y2Q1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfbGlua193aXRoX3NpemUKQEAgLTAsMCArMSwzMSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKworIyBUaGlzIHRhcmJhbGwgY29udGFpbnMgYSBzb2Z0bGluayB3aXRoIHNpemUgZmllbGQgIT0gMC4KKyMgSWYgbm90IGlnbm9yZWQsIGl0IG1ha2VzIGhleHQgaGVhZGVyIHRvIGJlIHNraXBwZWQKKyMgYW5kIGRhdGEgdG8gYmUgcmVhZCBhcyBhIGhlYWRlci4KKyMgR05VIHRhciAxLjE1LjEgaGFzIGEgYnVnIGhlcmU6IHRmIHdvbid0IHdvcmssIGJ1dCB4ZiB3aWxsLgordGFyMV9iejIoKQoreworICAgICRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzOVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4MTRceDQ0XHhlM1x4ZGRceDAwXHgwMCIKKyAgICAkRUNITyAtbmUgIlx4OWFceGZiXHg5MFx4Y2FceDE4XHgwMFx4YzBceDQwXHgwM1x4ZmZceDgwXHgwOFx4MDBceDdiXHhlM1x4ZmYiCisgICAgJEVDSE8gLW5lICJceDgwXHgwNFx4MDBceDAwXHgwOFx4MzBceDAwXHhkNlx4YjNceDA5XHg0NVx4MTlceDBkXHgwZFx4NDFceDg0IgorICAgICRFQ0hPIC1uZSAiXHgxYVx4NjhceGQwXHg3YVx4OTlceDkwXHg0YVx4MGFceDZkXHg0Y1x4YTNceDIwXHg3YVx4NDFceGEwXHgwMCIKKyAgICAkRUNITyAtbmUgIlx4MDBceDU1XHgyNVx4MzRceDFhXHgzNFx4ZDBceDAwXHg2NFx4NjRceDFhXHgzMlx4M2ZceDc2XHgzY1x4MWMiCisgICAgJEVDSE8gLW5lICJceGQzXHgzY1x4YTBceDg0XHg5Ylx4ODhceDA1XHg3MFx4OTBceGJiXHgxOFx4MjhceDM5XHgyOVx4YjNceDMwIgorICAgICRFQ0hPIC1uZSAiXHhhOFx4MGFceDIxXHg3MFx4MGNceDAxXHgzMlx4M2JceGJlXHhkZVx4ZDdceDEzXHgyZVx4YmRceDJhXHg5YyIKKyAgICAkRUNITyAtbmUgIlx4YThceDQyXHgyYVx4OTFceDE1XHhlMlx4YTFceGNkXHgyNFx4MzdceDljXHg5MVx4YWFceGM3XHgxNFx4ZGIiCisgICAgJEVDSE8gLW5lICJceDRjXHgwOFx4YWFceGFmXHgxMlx4ZWJceDZjXHgzN1x4OTZceGIwXHhhNFx4MjVceDBjXHhiNFx4NGJceGM1IgorICAgICRFQ0hPIC1uZSAiXHg1Mlx4NzBceDNiXHgyNVx4NGNceDBlXHg0Nlx4NjdceDUxXHg1NFx4ODlceDEzXHgxM1x4ZjBceGE4XHhlOSIKKyAgICAkRUNITyAtbmUgIlx4NjhceDRlXHg4Y1x4ODFceGZjXHg3OVx4ZTBceGIwXHhkOFx4NzlceDM0XHg5NFx4NzFceGEyXHgwY1x4YmUiCisgICAgJEVDSE8gLW5lICJceDkzXHg2MVx4ODJceDk1XHgxMFx4ODhceGQxXHhhNlx4NjlceGFhXHgzOFx4OWNceGI2XHhjMlx4YjJceDk0IgorICAgICRFQ0hPIC1uZSAiXHg5MFx4YzNceDgyXHgyOVx4ZThceDhjXHhiOFx4OTVceDgzXHgzMlx4NDBceDYxXHgxMVx4MTFceGQzXHhhYSIKKyAgICAkRUNITyAtbmUgIlx4M2ZceDhiXHhiOVx4MjJceDljXHgyOFx4NDhceDBhXHgyMlx4NzFceGVlXHg4MCIKK30KK3JlczE9IlwKK2xyd3hyd3hyd3ggdXNlci9ncm91cCAgICAgICAgIDAgMjAwOC0wNy0xOSAxNTowMjozNyBmaXJtd2FyZS0zNzIvc291cmNlcy9uYXRpdmUvYmluL2Nocm9vdC1zZXR1cC5zaCAtPiBxZW11LXNldHVwLnNoCistcnd4ci14ci14IHVzZXIvZ3JvdXAgICAgICAgNTEyIDIwMDgtMDctMTkgMTU6MDI6MzcgZmlybXdhcmUtMzcyL3NvdXJjZXMvbmF0aXZlL2Jpbi9xZW11LXNldHVwLnNoIgorCitleHBvcnQgVFo9VVRDLTIKKwordD1gdGFyMV9iejIgfCBidW56aXAyIHwgYnVzeWJveCB0YXIgdHZmIC1gCit0ZXN0IHgiJHJlczEiID0geCIkdCIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfcHJlZml4X2ZpZWxkcyBiL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfcHJlZml4X2ZpZWxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFmZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXJfd2l0aF9wcmVmaXhfZmllbGRzCkBAIC0wLDAgKzEsMjY0IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorIyBGRUFUVVJFOiBDT05GSUdfREVTS1RPUAorCit0YXIxX2J6MigpCit7CisgICAgJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHgxMlx4ZDFceDg2XHgzMFx4MDBceDBjIgorICAgICRFQ0hPIC1uZSAiXHhiOFx4N2ZceDgwXHhmZlx4NTBceDA4XHhhMFx4NWVceGZmXHhmZlx4ZmRceDdmXHhmZlx4ZmZceGVlXHhmZiIKKyAgICAkRUNITyAtbmUgIlx4ZmZceGZmXHhmYVx4MDBceDA4XHg2MFx4MGZceGM1XHgzZVx4ZjRceGRjXHgwMFx4MDBceDU5XHgyNVx4YmQiCisgICAgJEVDSE8gLW5lICJceGI4XHg3YVx4MDJceGI1XHg4Mlx4NzhceDI1XHhiMFx4ODlceDU0XHgxMFx4MTFceDQ0XHg4Ylx4MzZceDM2IgorICAgICRFQ0hPIC1uZSAiXHhjOFx4OTdceDBkXHgzNFx4OWFceDIxXHhhOVx4MzZceGE5XHhlZFx4MzJceDAyXHg4ZFx4YTZceDgxXHg4YSIKKyAgICAkRUNITyAtbmUgIlx4NzlceDEzXHg0ZFx4MWFceDAzXHgxMFx4NjlceGEwXHhkM1x4NDBceDY0XHgwZlx4NDRceDY4XHgzZFx4NDEiCisgICAgJEVDSE8gLW5lICJceDJhXHg3YVx4MjBceDA5XHhhMVx4MzRceDlhXHgwOVx4YTRceGM4XHhmNVx4NGZceDQ2XHhhNlx4ODZceDMyIgorICAgICRFQ0hPIC1uZSAiXHg0Y1x4MDhceDAwXHgwMFx4ZDBceDA2XHg5YVx4MDBceGQzXHhkNFx4MTFceDQ5XHhhN1x4YjVceDIwXHgxYSIKKyAgICAkRUNITyAtbmUgIlx4N2FceDgwXHgwMFx4MDBceDAwXHgwMFx4ZDBceDY4XHgwMFx4MDBceDAwXHgwMFx4MDBceDQ5XHhhOFx4ODkiCisgICAgJEVDSE8gLW5lICJceGE5XHgzMVx4NGZceDIyXHhhN1x4ZWFceDliXHg2MVx4NTNceGY0XHg5M1x4ZjJceGEzXHg0N1x4YTRceGQzIgorICAgICRFQ0hPIC1uZSAiXHg0MVx4ZWFceDA2XHg0MVx4YTBceDBkXHgwMFx4MDBceDAwXHgxZVx4YTBceDcwXHgzNFx4ZDNceDRkXHgwNiIKKyAgICAkRUNITyAtbmUgIlx4ODZceDg2XHg4Nlx4NDZceDgwXHg2NFx4MDFceGExXHhhMFx4MzRceGQxXHg5MFx4MDBceDAzXHgwOVx4ODgiCisgICAgJEVDSE8gLW5lICJceDBkXHgwNFx4ODlceDA4XHgwMFx4ODJceDdhXHg0Y1x4NDJceDY0XHhjOVx4M2RceDFhXHgyOVx4ZTlceGEyIgorICAgICRFQ0hPIC1uZSAiXHgzZFx4NDZceDllXHg0Nlx4OWFceDEzXHgyNlx4OWVceDUzXHgxMFx4MDFceDkxXHhlYVx4NjhceDE5XHhmMCIKKyAgICAkRUNITyAtbmUgIlx4NzNceGYyXHhlMFx4ZDFceDNjXHg4MFx4MDFceGIxXHg0OFx4NDRceDA4XHg5YVx4YmFceGYzXHg5ZVx4ODciCisgICAgJEVDSE8gLW5lICJceGVjXHhjNFx4NGJceDAyXHg5Mlx4ODBceDc1XHgwMFx4NTZceDQyXHg4OFx4MTBceDY4XHhjY1x4MDZceDIyIgorICAgICRFQ0hPIC1uZSAiXHg3Y1x4MmJceGE3XHhjOFx4MjFceDkxXHgxM1x4ZTVceDcyXHhjMFx4ZTZceDBjXHgwM1x4MTBceGYyXHg4OSIKKyAgICAkRUNITyAtbmUgIlx4OWNceDY3XHg2Ylx4YzNceGU2XHhhZVx4OThceDg1XHgwYVx4N2ZceDI1XHgyZVx4M2RceDg0XHg1Ylx4ZWIiCisgICAgJEVDSE8gLW5lICJceGYzXHhmZlx4YjNceDUyXHhmN1x4NmVceGY2XHg5Mlx4ZDZceDMzXHg1Zlx4NGZceGQxXHgzZFx4YjdceGM0IgorICAgICRFQ0hPIC1uZSAiXHgwZFx4NTBceDAyXHg0OVx4MDFceGFmXHhkMFx4NjlceGJiXHhkM1x4ZTlceDYzXHgwYVx4NjhceDM2XHg5MiIKKyAgICAkRUNITyAtbmUgIlx4ZjJceDAzXHgxZFx4ZjJceGUyXHgzNVx4YmNceDczXHhkNFx4NDRceGY2XHhhMFx4ZTBceDMxXHhkN1x4N2QiCisgICAgJEVDSE8gLW5lICJceDU2XHg5Nlx4Y2JceDUyXHhmY1x4NzlceGUwXHhlYlx4ZjdceDM0XHhkOFx4ZGFceDE4XHg3Mlx4MzBceDk0IgorICAgICRFQ0hPIC1uZSAiXHg1M1x4NDVceGY1XHg1NFx4NTZceDZjXHgwYlx4NTBceGEwXHhiY1x4YmRceGNjXHhkOFx4MjFceGFiXHg3YiIKKyAgICAkRUNITyAtbmUgIlx4YThceGE0XHhlNFx4NzhceDI1XHg3M1x4YmZceDRiXHgzMFx4MzhceDcxXHhlOVx4M2NceDE0XHg1ZFx4YTMiCisgICAgJEVDSE8gLW5lICJceDEyXHgwNFx4NmJceDM3XHg5ZFx4ZTVceGNlXHhhNVx4ZDlceGQxXHhhNVx4NjlceDA5XHgwOFx4YzRceDQ4IgorICAgICRFQ0hPIC1uZSAiXHg0Ylx4MzRceDU4XHg4MVx4MTVceDE4XHg4OFx4YWNceDExXHg1MVx4ODhceDM1XHgwZFx4ZDNceDEzXHgxOCIKKyAgICAkRUNITyAtbmUgIlx4NjdceDczXHgyMFx4NWNceDI4XHgwM1x4MjZceGNkXHg2ZFx4MjBceDkwXHhiYVx4YTRceDEyXHhiM1x4MDgiCisgICAgJEVDSE8gLW5lICJceDI3XHg3NFx4NmFceDk5XHhkZlx4YjFceDIwXHgzZFx4ODVceGU3XHg1Zlx4YWJceDBlXHgyZVx4ZGNceDIzIgorICAgICRFQ0hPIC1uZSAiXHg5OVx4ZTFceGVmXHgzNFx4NjhceGNkXHhhOVx4YjBceGJmXHhkYVx4ZWNceDgxXHhkZFx4NjZceGNhXHgyMSIKKyAgICAkRUNITyAtbmUgIlx4MTNceDQ3XHhkN1x4Y2FceDQ4XHhjZlx4ZWJceDI1XHhiYlx4NzlceDZkXHg0MFx4ZDBceGU0XHg2OVx4M2MiCisgICAgJEVDSE8gLW5lICJceDhmXHgwOVx4MWVceDdiXHhhYVx4NGJceDkxXHgzOVx4YWNceGQ2XHhkMlx4MGNceDg1XHgxZFx4ZjdceDcwIgorICAgICRFQ0hPIC1uZSAiXHgxZlx4MWVceDU4XHhiYlx4MjJceDExXHgyOVx4MzlceDE0XHg0ZFx4NThceDgxXHg5Zlx4ZDdceDFlXHgyMiIKKyAgICAkRUNITyAtbmUgIlx4MjFceDkxXHgwYVx4NDBceGQxXHg4N1x4MjlceDk5XHg5M1x4ZjRceGYzXHgyNVx4NDhceGJiXHhiNFx4MjQiCisgICAgJEVDSE8gLW5lICJceDJhXHgxY1x4YTdceDI4XHhjMVx4NjhceDA4XHgyNVx4MDBceGFhXHgzZFx4ZWVceGFlXHhjMVx4ZTFceDRmIgorICAgICRFQ0hPIC1uZSAiXHhlNlx4OWFceDI2XHg2Ylx4Y2ZceGIxXHgzZVx4YjlceDg1XHgwNFx4ZjRceGVmXHhmZlx4N2FceDJmXHgyYSIKKyAgICAkRUNITyAtbmUgIlx4MDRceDA4XHhlMFx4NGNceGI4XHhiZFx4OGJceDgxXHhiZlx4YTJceGJlXHg4Mlx4NTJceDliXHg0MFx4NjMiCisgICAgJEVDSE8gLW5lICJceGU2XHhmM1x4YjNceGU0XHhlNlx4ZTVceDk0XHg0YVx4ZGRceGMzXHgxYlx4YWZceDYxXHhmM1x4YmZceDViIgorICAgICRFQ0hPIC1uZSAiXHg2ZFx4YWFceGFhXHgyN1x4ZThceDUwXHg4ZFx4MjNceDk3XHhhNFx4YmRceGMzXHhkMlx4ZTZceGI1XHg2NiIKKyAgICAkRUNITyAtbmUgIlx4OWFceDFhXHg4ZVx4NDVceDJhXHhlZFx4MGJceDc5XHhiOFx4ODlceDM4XHg0YVx4MDRceDg1XHgwZFx4MWUiCisgICAgJEVDSE8gLW5lICJceDJiXHg3N1x4NTFceDkxXHg1Zlx4OWZceGUwXHgyYVx4NDlceDU2XHhkM1x4YTFceGRlXHhmNlx4ZDdceDg4IgorICAgICRFQ0hPIC1uZSAiXHg1YVx4NjFceGU1XHgwNFx4NTRceGRmXHhhM1x4OTJceGViXHhiZlx4NzVceDM5XHhjZVx4ZmFceGY1XHhkZSIKKyAgICAkRUNITyAtbmUgIlx4MzBceGQ3XHg1Nlx4ZDFceDdkXHgyY1x4ZGZceGRhXHgzZVx4MWNceGM4XHhjMlx4OTNceDYxXHgyMVx4MjAiCisgICAgJEVDSE8gLW5lICJceGIyXHgyMlx4NmRceGJlXHgzOVx4NTJceDY0XHhmNlx4YjNceDkxXHgyMVx4ODZceGRiXHg2N1x4NzJceDhmIgorICAgICRFQ0hPIC1uZSAiXHg0OVx4YWRceGU0XHg5M1x4MzlceDVjXHgzNFx4OGZceDU4XHhkYlx4NThceGQzXHgzY1x4MWVceDRjXHg2YyIKKyAgICAkRUNITyAtbmUgIlx4YmJceDcwXHg2Zlx4NDJceGNmXHg5ZVx4YmZceGIxXHhjYlx4YTlceDhkXHgwNVx4ZTdceGVhXHhlYVx4ZDciCisgICAgJEVDSE8gLW5lICJceDNjXHg2N1x4MzFceDY5XHg0NFx4MzNceGE0XHg5Mlx4OWNceDY1XHhhNFx4ODlceDVhXHhhZVx4Y2ZceGM5IgorICAgICRFQ0hPIC1uZSAiXHg1NVx4NDNceDYyXHg2ZFx4YmZceDA1XHgzY1x4ZDFceDBmXHgwMVx4NGFceGI1XHgxZFx4YmJceDJjXHhmYiIKKyAgICAkRUNITyAtbmUgIlx4YTZceGI3XHhiM1x4YjFceDFkXHg2Nlx4ZDNceGViXHgyMlx4ZDBceGI1XHg1YVx4NGJceGM0XHg0N1x4NDciCisgICAgJEVDSE8gLW5lICJceDVhXHg0OVx4ODVceDE4XHhiY1x4MTVceDM5XHgzYlx4OTJceGVlXHg1MVx4OThceDMzXHgzNFx4NWRceGI1IgorICAgICRFQ0hPIC1uZSAiXHhiYlx4OGJceDk0XHg4Y1x4ZGVceDhlXHgzZlx4M2RceDA5XHg0Zlx4YmFceGQzXHhmNlx4NzlceDc0XHg4ZSIKKyAgICAkRUNITyAtbmUgIlx4ODJceDBkXHg1Nlx4ODVceGEyXHhjN1x4YzZceGE2XHg4OVx4MjlceDI2XHhhM1x4NTNceDVlXHg1Mlx4ZjUiCisgICAgJEVDSE8gLW5lICJceDU2XHg3NFx4OGJceDE3XHg4Mlx4ZWRceDdhXHg4Ylx4NjhceDYxXHhhNVx4YzlceDdjXHhkZVx4OWZceDY4IgorICAgICRFQ0hPIC1uZSAiXHgyN1x4NGRceGVhXHg2NVx4NjhceDZmXHg3ZFx4NWVceDg4XHg3M1x4ODdceDZjXHg5Mlx4ZjJceGE5XHgxNSIKKyAgICAkRUNITyAtbmUgIlx4NGVceGVlXHg0ZFx4NDFceGJiXHg5OFx4NWRceDhhXHhhZlx4Y2JceDExXHg3Ylx4MmFceGNlXHhmNFx4MWUiCisgICAgJEVDSE8gLW5lICJceDNhXHgyOFx4NDhceDE0XHhmZVx4N2ZceDA5XHg0NVx4NDhceGYxXHg1Ylx4YzFceGNiXHhjZFx4OTFceGJhIgorICAgICRFQ0hPIC1uZSAiXHgzYlx4ZTJceDdkXHg1N1x4ODVceDY2XHg2OFx4ZWNceDUxXHg4Mlx4OTdceDg4XHhlYlx4OTRceDNiXHg3OCIKKyAgICAkRUNITyAtbmUgIlx4NmNceGY0XHhmMVx4M2VceDM4XHg4ZFx4MjJceDE2XHhhYlx4M2JceDEzXHhiM1x4MWJceDM5XHg5NFx4MGUiCisgICAgJEVDSE8gLW5lICJceGE4XHgyNlx4YjdceDhkXHhlOVx4N2RceDY2XHgyM1x4NGJceDY1XHgwN1x4YjdceDJiXHhjOVx4OTZceGI2IgorICAgICRFQ0hPIC1uZSAiXHg5OVx4MTJceDIyXHhiY1x4OTBceGRhXHg1MVx4YmNceGZkXHg5N1x4YTVceDdkXHhiY1x4MTJceGE2XHg3MiIKKyAgICAkRUNITyAtbmUgIlx4ZDNceGUzXHg4Y1x4YzdceDU4XHhlMVx4ZjhceDI4XHhmNFx4NDZceDQ5XHgxNFx4ZDBceDlkXHhiNlx4ZWQiCisgICAgJEVDSE8gLW5lICJceGNlXHg5OVx4YzZceGJjXHhlZFx4YTNceGFiXHhhMFx4OGNceDlkXHhjZVx4MWFceDFhXHhjMlx4ZTZceDc3IgorICAgICRFQ0hPIC1uZSAiXHhiYVx4YWVceGJhXHhkNlx4YzlceGIyXHhkMVx4NjVceDI0XHg3Ylx4MGRceGQ0XHhmMlx4YWNceDI4XHhjMyIKKyAgICAkRUNITyAtbmUgIlx4MWNceGJlXHg0YVx4NTRceGUzXHgwZlx4OGRceGFkXHhiMlx4MzdceDllXHgxZlx4ODFceDcyXHgyZFx4YWIiCisgICAgJEVDSE8gLW5lICJceDhmXHhiMVx4Y2RceGY3XHhiNFx4NTFceDJmXHgxZFx4ZjhceGFkXHg3N1x4MTRceDM3XHhkMlx4MWFceDlhIgorICAgICRFQ0hPIC1uZSAiXHhjMFx4ZjJceDQ4XHhjNlx4NGNceDhkXHhkM1x4OGRceGYxXHhkOVx4MmVceDJjXHhkZFx4N2FceDk4XHgzYyIKKyAgICAkRUNITyAtbmUgIlx4MjRceDc2XHhiOVx4OWRceDI3XHhjZFx4NzFceDdkXHg2Y1x4YzdceDFmXHgwYVx4NzRceDhhXHg2ZVx4NTQiCisgICAgJEVDSE8gLW5lICJceGVjXHg1YVx4YTFceDc3XHg2MFx4ODBceGVmXHgwMFx4YTRceDVmXHg5ZVx4OGJceDJmXHgwMlx4NzJceDljIgorICAgICRFQ0hPIC1uZSAiXHg0Nlx4ZDhceDc5XHg5Mlx4NGNceDhmXHg0ZVx4MzdceGVkXHgwY1x4NThceGFiXHg0NFx4ZWVceDFkXHhkMSIKKyAgICAkRUNITyAtbmUgIlx4YTFceGIwXHhhNVx4MWZceGFmXHhiMFx4MzlceDAxXHgyNlx4YjJceDRhXHgyMFx4NjhceDRhXHgxOFx4MjMiCisgICAgJEVDSE8gLW5lICJceGMzXHgwM1x4ODRceDIyXHgxOFx4ZGJceDZkXHg4M1x4NjBceGMxXHgxMlx4MDlceDIxXHg4NFx4MjJceDQ4IgorICAgICRFQ0hPIC1uZSAiXHg3Zlx4MWVceDE3XHhmNVx4YmVceGNlXHg0Y1x4NGZceDlmXHg5Zlx4ZWVceGY0XHhmZVx4ZWZceDlhXHgzNCIKKyAgICAkRUNITyAtbmUgIlx4OTFceDhmXHgzNlx4MWRceGJjXHg3M1x4ZDdceGViXHhjOFx4MmVceDgxXHgyNVx4ZmFceDE4XHg3Nlx4MzUiCisgICAgJEVDSE8gLW5lICJceDFmXHgxNlx4ZGJceDIwXHg0Ylx4NzRceDZkXHg5NFx4NGVceGU1XHgzNlx4ZWRceGY1XHg1ZFx4NTlceGFmIgorICAgICRFQ0hPIC1uZSAiXHg0Nlx4NzBceGVhXHgwM1x4YWNceDUwXHhiYlx4MjZceGFiXHgzOVx4OWFceDRiXHg2Ylx4MDlceDhjXHg2ZCIKKyAgICAkRUNITyAtbmUgIlx4MzRceGNmXHhlZFx4YWFceGY3XHg1Nlx4NDBceGYyXHhhYlx4MDdceGNhXHgyMlx4NzFceDk3XHhjN1x4MzUiCisgICAgJEVDSE8gLW5lICJceGU4XHgwNlx4OTBceDdiXHhlY1x4YzNceDlmXHhhNFx4ZGVceGQ5XHhkYlx4NDNceGYxXHhkNVx4MDZceDU4IgorICAgICRFQ0hPIC1uZSAiXHg3Mlx4OWVceDFmXHgwOFx4YjZceGMyXHgwNVx4MGRceDI1XHhmZVx4N2FceDg1XHhlNVx4MTBceDEyXHg2OCIKKyAgICAkRUNITyAtbmUgIlx4MThceDdlXHg4Y1x4YTBceGZhXHhiNFx4YzRceGM3XHg0ZVx4YTlceGYyXHgxM1x4ZDdceGMyXHg1Mlx4YjUiCisgICAgJEVDSE8gLW5lICJceGUzXHg3Mlx4MzdceDMxXHgxZVx4NGZceDk5XHhmZFx4YWNceDk3XHgwOFx4ODhceDcxXHg4OFx4ZWJceDFhIgorICAgICRFQ0hPIC1uZSAiXHhmOVx4YTFceDEwXHg5Y1x4NDRceDA4XHg1Nlx4NGFceDc3XHhhYVx4MGZceDE5XHg1Zlx4NWZceGIzXHg5NSIKKyAgICAkRUNITyAtbmUgIlx4ZWVceDliXHg5Zlx4NWJceGI1XHhjOVx4MGFceGY0XHgyOFx4MTZceDI1XHgzNFx4NmNceDcyXHhkYVx4OTIiCisgICAgJEVDSE8gLW5lICJceGI0XHgyY1x4YmRceDVlXHhiMVx4ZThceGU1XHgwZlx4NjhceGYzXHg0NFx4OGFceGQ1XHhmYVx4NzNceDVjIgorICAgICRFQ0hPIC1uZSAiXHg4OVx4MmVceDk5XHg3ZFx4ZWRceGUzXHg1Ylx4M2ZceDQ4XHg5N1x4ZWJceGI2XHg3Nlx4NWNceGE1XHg5ZCIKKyAgICAkRUNITyAtbmUgIlx4ZWZceDEyXHgxZVx4NDJceDg5XHg1Mlx4YWRceDI4XHg5MFx4ZTVceDJiXHg4OFx4YTBceDRmXHgxMVx4OTIiCisgICAgJEVDSE8gLW5lICJceGNkXHhjY1x4NjNceDQwXHgxYVx4YzdceDEwXHgwY1x4MmZceGNkXHgwMVx4ZjJceDA3XHgzOFx4YWNceDE0IgorICAgICRFQ0hPIC1uZSAiXHhlNVx4OTBceGMwXHgzMFx4MjFceGUyXHhlM1x4NzJceDBlXHgzZVx4MDRceGM4XHg5ZVx4YTdceDAwXHhkYiIKKyAgICAkRUNITyAtbmUgIlx4OTFceGRkXHg5ZFx4ODBceGE0XHg2OVx4MmFceDQ4XHgzN1x4OTdceGE0XHgyNlx4NWRceGFlXHg4NFx4MWUiCisgICAgJEVDSE8gLW5lICJceDg4XHhmNFx4ODNceDA0XHgyNFx4YzlceDFmXHg5NFx4NjFceDI1XHhmOVx4ODJceGRkXHhlZFx4MmRceDk2IgorICAgICRFQ0hPIC1uZSAiXHhhZFx4MDZceDQ1XHhkZFx4ODhceGQ3XHg1MFx4NDBceDE0XHhkY1x4N2NceGRiXHgwZlx4NTNceDk2XHgyNyIKKyAgICAkRUNITyAtbmUgIlx4Y2JceDY3XHhhY1x4YTZceGMxXHgxNVx4MmZceGMzXHhkYlx4MmNceGNhXHg5NFx4YjNceGYzXHhkMVx4NmEiCisgICAgJEVDSE8gLW5lICJceGJhXHgzNFx4ODNceGQxXHhjY1x4NDBceDNlXHg3Nlx4YTFceDY5XHg3Zlx4NDlceDMzXHhkY1x4YTdceDNjIgorICAgICRFQ0hPIC1uZSAiXHg2YVx4NjdceDE1XHhhYlx4ZGJceDUyXHhhMFx4YjhceGE2XHgxZVx4Y2VceGUzXHhhZlx4ZjRceGEyXHg2MiIKKyAgICAkRUNITyAtbmUgIlx4MzVceDBmXHgwM1x4NDBceDhlXHgyMFx4MTJceDljXHhiNlx4MzRceDcxXHgzYVx4MTVceDVkXHhlNVx4MzQiCisgICAgJEVDSE8gLW5lICJceGE4XHhkNFx4MDVceDk5XHg2Ylx4OWFceGI2XHg0MVx4MGJceDc4XHhjNFx4ZDhceGQ5XHg3YVx4NjVceGRjIgorICAgICRFQ0hPIC1uZSAiXHhkYlx4ZTNceDQyXHhkNVx4NjZceGY5XHhiNFx4ODNceDdlXHhjMFx4ZjRceDAxXHhjNFx4Y2NceDNiXHgwZSIKKyAgICAkRUNITyAtbmUgIlx4MTVceGRjXHgxNVx4YzJceDNlXHgwNFx4MmZceGZjXHg2Ylx4NzJceGViXHhmNlx4YWFceDE2XHgyMFx4ZGUiCisgICAgJEVDSE8gLW5lICJceGQzXHgzYVx4YjFceDEwXHhjNlx4M2NceGU4XHgyYlx4YjhceGVhXHhkYVx4MTlceDZlXHgzNlx4YWFceGE0IgorICAgICRFQ0hPIC1uZSAiXHgyM1x4NmRceGEwXHg0MFx4ZDFceDVhXHgwYlx4N2VceGE0XHhkNVx4MmRceGNiXHhhOVx4MTVceDM1XHhiYSIKKyAgICAkRUNITyAtbmUgIlx4OTNceDkyXHg0NVx4NDFceGIwXHgxYVx4ZDFceDEzXHgzMVx4YjZceDQ0XHg5OFx4NzhceDI4XHgxNVx4ZTQiCisgICAgJEVDSE8gLW5lICJceGFlXHhiYVx4NThceGQxXHg3NVx4MzZceDM0XHgxYVx4ZDhceDI4XHhmMVx4NGFceDRjXHhiY1x4MWJceGE4IgorICAgICRFQ0hPIC1uZSAiXHhmN1x4NTdceDkyXHhiY1x4ZTJceGI1XHhkYVx4YjZceGE2XHgxZFx4ODNceDM3XHg5Nlx4NDNceDIwXHg4NCIKKyAgICAkRUNITyAtbmUgIlx4Y2JceGI2XHhkOVx4M2ZceGViXHhmYVx4YTBceGZlXHg5YVx4N2RceGVlXHg0N1x4OThceGM0XHhlN1x4YzQiCisgICAgJEVDSE8gLW5lICJceGJkXHhjNlx4ZjBceDZkXHhiMlx4MjZceDEwXHgxZVx4NzhceGVmXHhmM1x4MjhceDNlXHgzNVx4ZTZceGU0IgorICAgICRFQ0hPIC1uZSAiXHhlNlx4ZjNceDBmXHgyNlx4MzRceDEzXHg4NVx4ZDBceGNmXHg1NVx4MGZceDhiXHhkN1x4ZTlceGY0XHhkZiIKKyAgICAkRUNITyAtbmUgIlx4NzBceDY4XHhjMFx4YjVceDMwXHgzY1x4YjFceDAxXHhlOFx4MjhceGFlXHg4MFx4MjZceDAxXHg4Ylx4MTUiCisgICAgJEVDSE8gLW5lICJceDBmXHg4MFx4NDhceDE4XHg0Ylx4ZTJceGVkXHg1OVx4OTJceDMxXHhjZlx4ZDJceDhmXHg0Mlx4YmZceGVlIgorICAgICRFQ0hPIC1uZSAiXHhiZFx4MDdceDkxXHgyNFx4YzZceDY2XHg1ZVx4OGNceDlhXHg0OFx4NjNceGU3XHhhY1x4OGFceDFlXHhjNSIKKyAgICAkRUNITyAtbmUgIlx4NjlceDE2XHg4ZFx4YWNceDY3XHhkY1x4NzVceDc1XHg4Mlx4Y2FceDE5XHgyOFx4MzZceDRkXHgxMFx4ZjkiCisgICAgJEVDSE8gLW5lICJceDQxXHhjYlx4MTVceDA1XHg2NFx4YzdceGIwXHhjM1x4NjRceGYzXHg0OFx4NzFceDYwXHhmMlx4YmRceGNjIgorICAgICRFQ0hPIC1uZSAiXHgzN1x4YjFceDM2XHhiY1x4YTdceDJlXHg2Ylx4MjBceDExXHg1MVx4NDJceGUxXHg4YVx4MjlceGFjXHg0NCIKKyAgICAkRUNITyAtbmUgIlx4OGZceDYzXHg1Nlx4MjNceGQ0XHhkNFx4MDdceGI0XHg2MFx4YTRceGI4XHhjZFx4ZWVceDQ5XHhhNVx4NDIiCisgICAgJEVDSE8gLW5lICJceGNjXHg1Mlx4MDBceDZmXHhkY1x4NDRceDIwXHg1N1x4N2RceDM2XHhkN1x4NDhceDFhXHgyMlx4MmNceGQwIgorICAgICRFQ0hPIC1uZSAiXHgxOVx4NDNceDUxXHg1ZVx4MWNceDhjXHg1Zlx4NzBceGMyXHg2Ylx4Y2ZceGVhXHhkNFx4OTdceDYxXHg3MiIKKyAgICAkRUNITyAtbmUgIlx4MzNceGMzXHg5YVx4ZDRceDA2XHhmMVx4OGFceDlhXHhmZVx4MjFceDgzXHgwYlx4ZWFceGYxXHhmYVx4MmMiCisgICAgJEVDSE8gLW5lICJceDUyXHgyM1x4MmNceGI4XHhjMVx4ZTZceGM4XHg5ZFx4OWNceDVmXHg4Zlx4ZjJceDRhXHg4Nlx4NzZceDkyIgorICAgICRFQ0hPIC1uZSAiXHg3OFx4MGZceDdkXHg5ZFx4MDlceDM4XHhjZVx4ZTFceDlhXHhmM1x4NjBceGVkXHg2NVx4MGJceDFhXHg2OCIKKyAgICAkRUNITyAtbmUgIlx4YTZceDUyXHgzOVx4MThceDFlXHg0NVx4ZTNceDVkXHhlMFx4N2RceGZiXHhjNlx4Y2NceDQ0XHgxOFx4OTMiCisgICAgJEVDSE8gLW5lICJceGU5XHg3MVx4YThceDE4XHgwZFx4NzRceDQ4XHg4YVx4MThceDBiXHg2MVx4YmZceGUxXHhhOVx4MGVceDRjIgorICAgICRFQ0hPIC1uZSAiXHhhZFx4MWJceGFmXHgxYVx4MzdceDM5XHg5Mlx4NGRceGNjXHg5Nlx4ODdceDQ2XHgwZFx4ODNceDA2XHgzMyIKKyAgICAkRUNITyAtbmUgIlx4NTNceDM1XHhkOVx4MmNceDM2XHg5OFx4MjhceDFjXHg1Mlx4YjFceDg5XHg1NVx4NTZceGNjXHgzN1x4MjAiCisgICAgJEVDSE8gLW5lICJceDg5XHg4NFx4MGVceDNkXHgyN1x4MmZceGM2XHhmYVx4NzhceDA0XHhlMVx4ZDVceGM2XHg5MFx4NDlceDE2IgorICAgICRFQ0hPIC1uZSAiXHhmZVx4MGFceDE2XHg2Zlx4MTFceDU0XHg0Mlx4MjJceGExXHg5MFx4MmRceDE5XHg5MVx4MjhceDA1XHhmMiIKKyAgICAkRUNITyAtbmUgIlx4MzBceDZjXHgxNFx4MTZceGQ2XHg4YVx4Y2VceGY2XHhjZFx4N2NceDY0XHg3Nlx4NDJceGU5XHgyOFx4ZTkiCisgICAgJEVDSE8gLW5lICJceDFjXHhkMVx4YjhceDllXHhjZFx4NTNceGIyXHg2Ylx4OGRceDU3XHg1N1x4MmFceGI4XHg1OVx4NThceDhjIgorICAgICRFQ0hPIC1uZSAiXHhkM1x4MTJceDU3XHhhNlx4ZTNceDQ4XHg3MFx4ZjVceDU1XHgwZlx4NzZceGI1XHgyN1x4MDhceGQxXHhhMCIKKyAgICAkRUNITyAtbmUgIlx4ZjhceDYwXHgwOVx4YTFceGYyXHgzMFx4NDNceDRhXHgzMFx4NDZceGY3XHg5Nlx4MTlceGU5XHgzYVx4NDQiCisgICAgJEVDSE8gLW5lICJceGMwXHhkOFx4YThceDUxXHhhZVx4NTBceDkyXHg4MVx4ODFceGRhXHgxMFx4ZDNceDE4XHg2Mlx4OTRceGQwIgorICAgICRFQ0hPIC1uZSAiXHg5ZVx4NTRceDBiXHgyMlx4Y2NceGQwXHhmZVx4MGNceDM2XHg0NFx4NGRceDRkXHg0MFx4NWNceGE4XHgzNSIKKyAgICAkRUNITyAtbmUgIlx4YjZceDUzXHg5Y1x4MzZceDljXHg1YVx4MGVceDBlXHhiMFx4NWNceDI5XHgyYVx4MzVceDY2XHhhYVx4M2EiCisgICAgJEVDSE8gLW5lICJceGNiXHgyM1x4N2JceGJiXHhjOFx4NjBceGJjXHhiNFx4MjhceGY0XHg2ZVx4ZmVceDg2XHhmY1x4MTZceDg1IgorICAgICRFQ0hPIC1uZSAiXHgwY1x4ZTBceDFkXHhjZlx4ZmRceDEyXHgyOFx4YzZceDYwXHhkMFx4ZTZceDJmXHg3Nlx4ZjBceDFhXHg1YiIKKyAgICAkRUNITyAtbmUgIlx4ZmFceGE2XHhjNlx4ZWFceDU4XHhiYlx4MjZceDM3XHg4NFx4ZGRceDg1XHhkNVx4MzdceDgyXHg3Nlx4ZDkiCisgICAgJEVDSE8gLW5lICJceDE0XHg3YVx4Y2FceGVkXHgxM1x4NzJceGMzXHhlMVx4YjlceDY5XHg0NVx4ZDRceGVjXHg0NFx4OTRceDI2IgorICAgICRFQ0hPIC1uZSAiXHg4ZVx4MGJceDkwXHhiNlx4OGJceDFmXHgxZVx4MDFceDk2XHg1YVx4YjlceDUxXHhhNlx4MjdceGEyXHg5YiIKKyAgICAkRUNITyAtbmUgIlx4MzhceGQ5XHgyNVx4MzJceDliXHg1NFx4ZmNceDQ1XHhkMVx4YThceDU5XHgzNVx4MWFceGIwXHhiMlx4MWEiCisgICAgJEVDSE8gLW5lICJceGM4XHg4OFx4MTVceDQyXHg5OFx4NTBceDk5XHgxMlx4OWVceGY1XHg1OVx4YjJceDVjXHhjNVx4YTdceDM0IgorICAgICRFQ0hPIC1uZSAiXHgzNVx4Y2FceGIzXHhlZFx4ZGNceGM5XHg5Zlx4M2VceDc3XHg4Zlx4NmNceGRlXHhjOFx4NDFceDZhXHhjNSIKKyAgICAkRUNITyAtbmUgIlx4MjRceDg1XHgwNFx4YTFceDJmXHhlM1x4NDdceDhjXHg0N1x4ZDRceGRiXHg3NFx4OGNceGI2XHg0Y1x4ZWYiCisgICAgJEVDSE8gLW5lICJceGVkXHhhZFx4OWZceDg2XHgzMVx4ZDhceGM4XHgwN1x4YzVceDExXHgxY1x4MzlceDNhXHhmOFx4NzVceDczIgorICAgICRFQ0hPIC1uZSAiXHhhZVx4NzhceDdkXHgxZFx4MzZceDViXHhkMVx4MjNceDVkXHg4NFx4MTdceDVkXHg0Ylx4YWNceGQzXHg3MCIKKyAgICAkRUNITyAtbmUgIlx4OGFceDgzXHg0OFx4NDhceDgzXHg3Ylx4NWNceDk5XHg5ZVx4NTZceGJiXHhmY1x4MGNceDRiXHgwNFx4Y2YiCisgICAgJEVDSE8gLW5lICJceDgzXHg1ZFx4ZjhceDMxXHgyY1x4YzRceDVjXHhhMVx4NjhceDZhXHg1Nlx4ZTFceDdmXHhiZVx4ZDZceDU5IgorICAgICRFQ0hPIC1uZSAiXHg2Y1x4NTVceGIwXHg2M1x4NDFceGViXHg4OFx4NjlceGI2XHg5Ylx4NTBceGM0XHgzMVx4ZWFceGIwXHhkNyIKKyAgICAkRUNITyAtbmUgIlx4ZTJceGZiXHg3Ylx4ZWJceGJiXHg1Mlx4YzRceDk3XHgyM1x4ZTlceDE2XHgyOVx4MThceDUwXHg0ZFx4MGUiCisgICAgJEVDSE8gLW5lICJceDY4XHg2Mlx4ZmJceDNmXHhkOVx4MDdceGI5XHg4OVx4NGRceDU4XHg3Y1x4MzJceDZkXHgxMlx4M2VceDliIgorICAgICRFQ0hPIC1uZSAiXHgzYVx4MTRceGVlXHhhY1x4M2NceDhkXHgwOVx4NjJceDMwXHg4ZVx4ZTBceDg2XHg4NFx4YjlceGYzXHgwZCIKKyAgICAkRUNITyAtbmUgIlx4ZjhceGFkXHg0Mlx4YTZceGJiXHg3ZFx4ZDFceGYyXHhmM1x4YzBceGUyXHgzMlx4YzRceDQwXHhhYVx4OGEiCisgICAgJEVDSE8gLW5lICJceDJhXHhlOVx4YTlceDQ1XHg4M1x4MjNceGY2XHg5MFx4MDVceDI0XHg1OVx4MjJceDg0XHg1MFx4ODJceGMwIgorICAgICRFQ0hPIC1uZSAiXHg1OFx4NDFceDQyXHgxOFx4OTFceDNkXHhkOFx4ODBceGIxXHgyNlx4NjhceGIyXHhhOFx4YzBceDIxXHgxNCIKKyAgICAkRUNITyAtbmUgIlx4MThceGRmXHgzYVx4ODZceDI1XHg4NVx4NTZceGFiXHgyMFx4MzhceGNkXHhkY1x4OThceDZlXHgwN1x4YzQiCisgICAgJEVDSE8gLW5lICJceDZiXHgxNlx4NTVceGUwXHg0MVx4ZTBceDQxXHhkYVx4MjlceDYyXHg4ZFx4YmFceGNlXHhhMlx4Y2JceGZjIgorICAgICRFQ0hPIC1uZSAiXHg3MFx4NzhceDk5XHhmOVx4MTZceDBiXHg1YVx4MGNceGM1XHhhZFx4MThceGViXHhmMFx4YjVceGM5XHgyNSIKKyAgICAkRUNITyAtbmUgIlx4ODJceDE2XHhlMFx4NWRceGMxXHhjNFx4YzZceGYwXHg4NFx4NmFceDQ1XHg3ZFx4ZGJceDI4XHg0Nlx4YWIiCisgICAgJEVDSE8gLW5lICJceGVmXHgzMlx4YzlceDQ5XHg1MFx4NTFceDYwXHg3N1x4MWNceGZkXHg1OFx4OWNceDAxXHgzYlx4N2FceGZhIgorICAgICRFQ0hPIC1uZSAiXHg0OVx4NDdceDNlXHg4N1x4MWNceDM5XHhhNlx4NmFceGE0XHhiN1x4MzlceDkzXHhhY1x4YWNceGIwXHgzOSIKKyAgICAkRUNITyAtbmUgIlx4MmZceGJjXHhhYlx4OWJceDUyXHg5Nlx4MjRceDQ2XHhjMVx4OTVceGU0XHgzMVx4ODlceDM3XHgxOFx4YzgiCisgICAgJEVDSE8gLW5lICJceDJjXHgyMlx4MzJceDJhXHg4Zlx4YjZceDU4XHg3N1x4NTdceDc3XHgyZlx4MDlceGQwXHg3Y1x4ZWRceDc0IgorICAgICRFQ0hPIC1uZSAiXHhhYVx4N2NceDg2XHgyNVx4NDVceDBjXHg0M1x4NGRceDMxXHhiMFx4NjNceDQwXHhjZlx4ODZceGZlXHg3NSIKKyAgICAkRUNITyAtbmUgIlx4NzZceGUwXHhlZVx4OTlceGI1XHg3MVx4ZTJceDRlXHhlNVx4YzFceGY5XHgyZVx4NDhceGUyXHhhNlx4MWIiCisgICAgJEVDSE8gLW5lICJceDI4XHhhNVx4YTNceGJlXHhmZlx4MzdceGQxXHhkZFx4NjZceGEyXHhlOFx4ZDNceDg4XHg0ZFx4MTNceGQ1IgorICAgICRFQ0hPIC1uZSAiXHg2OFx4NTFceDI3XHg0MVx4YzNceDZjXHgxYlx4NDhceDY3XHg2YVx4ZGZceDI1XHgyYVx4NDBceGExXHg4NyIKKyAgICAkRUNITyAtbmUgIlx4MWRceDU0XHhiN1x4ZTNceDkxXHhjMlx4NmJceDViXHhiOVx4OGNceGQ1XHgxMFx4MTFceDEwXHgxNlx4YWIiCisgICAgJEVDSE8gLW5lICJceDZiXHhiZVx4NjVceDZiXHg3M1x4YTdceDM1XHhhMVx4MDlceDYwXHg2MFx4ZWRceDk2XHgzOVx4YzlceDQwIgorICAgICRFQ0hPIC1uZSAiXHg1ZFx4ZGNceGVlXHg2MFx4NDlceDBjXHg2OFx4MThceDM0XHhiMlx4NmZceDJhXHg5NVx4MTRceDI5XHg5NSIKKyAgICAkRUNITyAtbmUgIlx4NWJceDU5XHhkMlx4MWZceDYzXHgyYVx4YmVceGZkXHhhZVx4MDlceDVjXHhlZVx4MTFceGI1XHgyOVx4MzYiCisgICAgJEVDSE8gLW5lICJceGNhXHhkZlx4MjhceDhjXHg2NVx4NDJceDQ2XHg3NFx4MGNceDM5XHg2OFx4MzBceGFjXHgyY1x4MmZceGQwIgorICAgICRFQ0hPIC1uZSAiXHg5Ylx4YjNceDkyXHgxOVx4OTBceGExXHgwN1x4Y2NceGY2XHhkZVx4NjRceDVmXHg2Zlx4ZDdceGI2XHhjYyIKKyAgICAkRUNITyAtbmUgIlx4ZTBceDcwXHgwZlx4MGJceGQyXHgwZVx4NzdceGExXHg3MFx4ZTNceDU2XHg5MFx4NGJceDI4XHg1OFx4ZDAiCisgICAgJEVDSE8gLW5lICJceGQxXHhlMVx4OWRceDE4XHg5OFx4YmFceDZiXHgzNlx4NTRceGE5XHg1NFx4MDlceDYzXHg0OVx4MThceDU1IgorICAgICRFQ0hPIC1uZSAiXHg2MFx4YmFceDExXHhiMVx4MGFceDE0XHg0NVx4MWZceGFlXHgwOFx4NTBceDA5XHgzM1x4MDBceGEyXHhiMiIKKyAgICAkRUNITyAtbmUgIlx4NzFceDgxXHg3NVx4ODlceGI3XHhiOVx4MGNceDczXHhjMFx4NGNceDMyXHg4OVx4NzJceGFjXHhhOVx4YTMiCisgICAgJEVDSE8gLW5lICJceDQ3XHg1Zlx4N2RceDRlXHgxYlx4NGRceGI5XHhlYVx4ODRceDQ1XHgwMFx4MzdceDNjXHhiM1x4N2JceGY4IgorICAgICRFQ0hPIC1uZSAiXHhlN1x4MGZceGFhXHgzM1x4MWFceDliXHhjMlx4MGNceDM1XHg4YVx4ZDRceDA0XHg0Nlx4NDJceGNiXHhhYiIKKyAgICAkRUNITyAtbmUgIlx4YWFceGM3XHhlNVx4YzlceDIwXHg2ZVx4MjFceGE2XHg4Y1x4ZWRceDYxXHg4Nlx4NDJceDg3XHgwM1x4MjUiCisgICAgJEVDSE8gLW5lICJceGRlXHgyY1x4NGFceDg1XHhjYlx4YjRceDM2XHhjOVx4ZDRceDcyXHg2MFx4NjJceGMyXHgxOVx4ZDBceDMwIgorICAgICRFQ0hPIC1uZSAiXHgxNlx4NmRceDU4XHg2MVx4NjJceDE2XHhlOFx4ZDJceDBlXHhkMFx4ZjNceGRiXHg1M1x4MzdceDA3XHgzNyIKKyAgICAkRUNITyAtbmUgIlx4NDBceGMzXHhlNVx4NWJceDlkXHgxNlx4NDVceDYwXHg4ZVx4ZmJceDEyXHhjNFx4NWZceDlmXHhkZFx4ZTEiCisgICAgJEVDSE8gLW5lICJceDQ1XHg1ZFx4NDVceDM2XHgyMVx4YTBceGMwXHhiOFx4MTFceDk4XHgwZlx4NjRceDk4XHg2N1x4MWNceDExIgorICAgICRFQ0hPIC1uZSAiXHhhOVx4YTFceDY1XHgxMFx4YjlceDIyXHgxMlx4OTFceDEwXHg5Ylx4MTBceDZmXHg5NVx4MmVceDM0XHg5MSIKKyAgICAkRUNITyAtbmUgIlx4NjRceDgyXHhhNFx4MDVceDAyXHhmY1x4NGFceDlmXHg5Y1x4NGRceDZjXHg4ZFx4NjdceDI2XHg5MFx4NjMiCisgICAgJEVDSE8gLW5lICJceDA0XHgxMlx4NmZceDBlXHg1NVx4M2NceDhlXHhmMlx4OGRceGI0XHg2Ylx4M2RceGFjXHhjZlx4ODRceDJlIgorICAgICRFQ0hPIC1uZSAiXHg2MFx4MGZceDQwXHg2Mlx4ODhceDNhXHhjZlx4YmRceGVhXHhhZFx4NDBceDRjXHgyOVx4ZTFceGI1XHhiNiIKKyAgICAkRUNITyAtbmUgIlx4M2VceDE1XHg4Nlx4ZDVceGJlXHhhZFx4MjdceGRlXHgyYlx4MzJceGVmXHhjZlx4OTdceDg4XHg4Ylx4MTciCisgICAgJEVDSE8gLW5lICJceDgwXHg0M1x4MGVceDIwXHg3OVx4M2JceDM2XHg3M1x4YjhceGFkXHgxMlx4MGVceDg3XHg1OVx4NWZceGQzIgorICAgICRFQ0hPIC1uZSAiXHgzY1x4OGNceDg0XHhjOFx4NTRceDJiXHg5NFx4YzlceDJlXHgzNlx4OGJceDMyXHg0OFx4ZjFceGUzXHgwOCIKKyAgICAkRUNITyAtbmUgIlx4ZjBceDM2XHhjMFx4YjhceGMyXHhhMlx4YTlceGUyXHg1Mlx4MDJceGYxXHg5Ylx4Y2JceGRlXHhjY1x4YjUiCisgICAgJEVDSE8gLW5lICJceDVhXHg2Y1x4MDVceDA2XHgzMVx4NDRceDQxXHg4OFx4YTNceDA1XHgwNFx4MTZceDBkXHg0YVx4ODVceDIwIgorICAgICRFQ0hPIC1uZSAiXHg3OVx4ZGFceDg5XHg4Mlx4MWRceDVmXHg1YVx4MTFceDg4XHg4OVx4MDZceDA1XHhmNVx4ZjRceGVkXHg3NSIKKyAgICAkRUNITyAtbmUgIlx4NjJceDM5XHgzN1x4NjlceDExXHgzMlx4M2VceDhkXHhlNFx4NjBceDYyXHg1Mlx4YzlceGFkXHg4Mlx4OWEiCisgICAgJEVDSE8gLW5lICJceDlhXHgyZlx4MDZceDQxXHgyNlx4YjRceDQ4XHg3MFx4MzlceDJiXHg4YVx4YjFceDVhXHg1M1x4YzZceDQ4IgorICAgICRFQ0hPIC1uZSAiXHg1N1x4MTdceGY1XHhkOFx4NWFceGM2XHgxOVx4ODNceDA2XHgwYlx4OWJceDA0XHhiOFx4ZjVceGFmXHgyMyIKKyAgICAkRUNITyAtbmUgIlx4NDVceDg3XHg0OFx4NTBceDZkXHgxNlx4ZWFceGI0XHgyMFx4YjhceDQ5XHg5Mlx4NmJceDBjXHg3Nlx4MTQiCisgICAgJEVDSE8gLW5lICJceDQ4XHg1M1x4YTFceDI5XHg3NFx4ZjZceGQ3XHg0OVx4NDRceDM5XHhiYVx4YmRceDYzXHhhNlx4ZjJceDgxIgorICAgICRFQ0hPIC1uZSAiXHg4Zlx4NWJceDVlXHg0Nlx4MGFceDM0XHg5NVx4MzFceGMwXHhkZFx4NjBceDUwXHhkNlx4MGFceGE2XHgyOSIKKyAgICAkRUNITyAtbmUgIlx4M2RceDM2XHgzYVx4YzdceGI4XHhjZlx4MjVceDVlXHhmN1x4ODJceDU1XHg4OFx4YzJceDhiXHgzMFx4ZDIiCisgICAgJEVDSE8gLW5lICJceDk3XHg5MFx4NDlceDk0XHhkZVx4ZTVceGFhXHhlYlx4NDJceDhjXHg5NFx4MmFceGEwXHgwZFx4OWJceGI1IgorICAgICRFQ0hPIC1uZSAiXHg1OVx4YmVceGNiXHgzNVx4YTNceDM3XHg1NFx4NzZceDM1XHg5OFx4Y2JceDFmXHgxM1x4M2ZceDRhXHhkMSIKKyAgICAkRUNITyAtbmUgIlx4NDVceDg3XHg2N1x4ZWRceDY2XHgwMlx4MDZceDQ5XHgxY1x4NTlceDUxXHgxZlx4NGRceDg1XHgwM1x4NDYiCisgICAgJEVDSE8gLW5lICJceDY1XHg4Nlx4NGVceDRjXHg2YVx4ZDJceDI0XHgzMVx4NWJceDZhXHgzYlx4MTlceDQ5XHhlMVx4ODNceDE0IgorICAgICRFQ0hPIC1uZSAiXHhjMVx4ZjBceDU2XHg2MVx4OTNceDhiXHgzM1x4MTNceDU0XHg2Zlx4NzhceDRjXHhhMFx4ODVceGYwXHhiMyIKKyAgICAkRUNITyAtbmUgIlx4MTdceGFhXHhmMlx4NjdceDAyXHgwY1x4MzFceGVkXHg1ZVx4OThceDAyXHgyOFx4YzRceGU1XHg4N1x4YTIiCisgICAgJEVDSE8gLW5lICJceDcwXHhkMVx4ZDVceDljXHhmOFx4ZWNceDE5XHg4OFx4YTlceDBkXHgwZVx4NGFceGUzXHg0N1x4ODNceDZlIgorICAgICRFQ0hPIC1uZSAiXHhmN1x4NzBceDNlXHhhNFx4YTlceGMwXHg0Y1x4ZmFceDJiXHgzYlx4ZDdceDZmXHg5Nlx4YzNceDZkXHg2ZCIKKyAgICAkRUNITyAtbmUgIlx4NzFceDJhXHg4ZFx4NjJceGYxXHhkM1x4ZGRceGIwXHgzM1x4ZDRceDY3XHgxOVx4MGRceDMwXHg4NVx4M2EiCisgICAgJEVDSE8gLW5lICJceDA2XHgwNFx4ODVceDAwXHg0OFx4NWRceDUzXHgzNVx4YTBceDMxXHg1Nlx4ODRceDgyXHhhNVx4YWNceDIyIgorICAgICRFQ0hPIC1uZSAiXHgwMlx4NDRceGFmXHg2ZFx4YzBceDYxXHg1OVx4MjNceDk2XHg3Mlx4NWFceDgxXHg5ZVx4MGNceGU1XHg3OSIKKyAgICAkRUNITyAtbmUgIlx4ZGFceGQwXHg0Mlx4NWNceDg5XHhhNVx4MDBceGVjXHg1Nlx4NDFceDY0XHg4YVx4MTFceDYwXHg3OVx4YjEiCisgICAgJEVDSE8gLW5lICJceGVkXHg1NVx4MTZceDU0XHhlNlx4NTFceDAzXHgzNFx4MTRceDYwXHgzMVx4ZDJceGYwXHgwYlx4Y2VceGYyIgorICAgICRFQ0hPIC1uZSAiXHg0ZVx4NGNceDQ1XHg4Y1x4ZWJceDJhXHg4Mlx4M2FceGE4XHg1Mlx4Y2VceDhmXHg0ZVx4ZjFceDg5XHhlYSIKKyAgICAkRUNITyAtbmUgIlx4NDRceDkxXHg2Nlx4ZGRceDZiXHg0OVx4YTNceDgzXHgwYlx4MTlceDBlXHg2Nlx4NWZceDAyXHgyMlx4NTgiCisgICAgJEVDSE8gLW5lICJceGU3XHhjMFx4YThceGNlXHg1NVx4NDhceGE2XHgwNFx4ZjNceDAzXHhhY1x4NjJceGIyXHhjMFx4YWFceGEwIgorICAgICRFQ0hPIC1uZSAiXHgwOVx4YWVceDViXHg5Nlx4ZDBceGRkXHhhOVx4MWZceGZiXHgyZFx4M2RceGY1XHgwMlx4ZTFceDg2XHgwMiIKKyAgICAkRUNITyAtbmUgIlx4M2VceGRhXHhkMFx4NWRceGJhXHgxNlx4MzlceGNkXHg3NVx4YTJceDQ3XHgyNlx4NzRceDI1XHhhOFx4NWUiCisgICAgJEVDSE8gLW5lICJceGYzXHgzNlx4MGNceDM3XHgxOVx4MTdceDA2XHg2Nlx4ZDBceDBiXHg0Mlx4NDFceDBhXHhhMFx4ZGVceDkzIgorICAgICRFQ0hPIC1uZSAiXHhkN1x4YjRceDlmXHhmYlx4YzdceDRmXHg2NVx4NTRceGRhXHhiOFx4OGJceDIzXHhkZVx4OWNceDU3XHhjZiIKKyAgICAkRUNITyAtbmUgIlx4MmRceDJhXHgxMlx4ZGFceGNjXHhmNlx4NzNceDgzXHgwMlx4NGNceDBlXHg0Mlx4ODhceGRhXHgyN1x4YjkiCisgICAgJEVDSE8gLW5lICJceGNiXHgwNFx4YjZceDA3XHgyNlx4NzhceGExXHhhMVx4MDlceGEzXHg2YVx4ODZceGJkXHg5ZFx4ZDRceGY5IgorICAgICRFQ0hPIC1uZSAiXHhjMFx4ODFceGE2XHg0OVx4YTlceDcyXHhlYlx4NTZceGJkXHhmOVx4ZWFceDg5XHg0Zlx4YWVceDcyXHgyOCIKKyAgICAkRUNITyAtbmUgIlx4YjZceDU3XHgzNVx4YmVceDk0XHhhZFx4YzBceGZmXHgxZVx4ZjJceDM1XHgyNFx4YTBceDQ1XHhkNVx4MDkiCisgICAgJEVDSE8gLW5lICJceGMwXHhlMFx4MTBceGQwXHgxN1x4OTBceGUyXHhmZlx4OGJceGI5XHgyMlx4OWNceDI4XHg0OFx4MDlceDY4IgorICAgICRFQ0hPIC1uZSAiXHhjM1x4MThceDAwIgorfQorCit0YXIyX2J6MigpCit7CisgICAgJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHgxNlx4MDhceGZkXHg2MFx4MDBceDAwIgorICAgICRFQ0hPIC1uZSAiXHgwMVx4ZmZceDgwXHg0OFx4ODBceDAwXHhhMFx4NDBceDAzXHhmZlx4YzBceDcyXHgwMFx4ODlceDQwXHhmZiIKKyAgICAkRUNITyAtbmUgIlx4ZTdceGRmXHhjMFx4MjBceDAwXHg5Mlx4MTFceDUzXHhmNVx4MTNceGQzXHg1M1x4N2FceDQxXHhhOFx4ZjIiCisgICAgJEVDSE8gLW5lICJceDlhXHg2MFx4MjFceDlhXHg0MFx4ZjRceDliXHhkMlx4MGRceDA5XHhhNVx4M2NceGE2XHg0Zlx4NDRceGY1IgorICAgICRFQ0hPIC1uZSAiXHgzNFx4MzRceGQxXHhiNVx4MDFceGEwXHgzZFx4NDFceGE0XHhlMVx4ZWJceDRjXHg1YVx4MDFceDQ3XHgzYiIKKyAgICAkRUNITyAtbmUgIlx4ZDFceDY3XHgxYVx4NGNceDNiXHgyMVx4ODRceDIzXHgyY1x4NWNceGY3XHhlMFx4YmRceDJhXHhhNFx4ZWEiCisgICAgJEVDSE8gLW5lICJceGRjXHhkYlx4NzFceDgwXHgyNlx4OThceDIxXHgwZVx4NzZceDIxXHgzMFx4Y2VceGU0XHhhZFx4OGNceGI1IgorICAgICRFQ0hPIC1uZSAiXHg2OFx4NjJceDM1XHhhMVx4ZmRceDhlXHg3Ylx4NTFceDcwXHg5Nlx4YjFceDJjXHhhMlx4OTlceDZjXHhhMSIKKyAgICAkRUNITyAtbmUgIlx4YzJceGNkXHhlYVx4YTdceDVlXHg2Ylx4OTFceDRmXHg3M1x4OTZceGU0XHg0OFx4M2NceGU3XHg4Y1x4MGYiCisgICAgJEVDSE8gLW5lICJceDAzXHg2NFx4NWJceDdhXHg0M1x4YzFceDY4XHg4Nlx4NDFceDgzXHg0Nlx4MGJceGJhXHhhYVx4NmFceDliIgorICAgICRFQ0hPIC1uZSAiXHg1OVx4MzRceGYxXHgxY1x4MDhceDY5XHgxZFx4NDFceGZiXHg0YVx4OTZceDFiXHgxNFx4OWVceDMyXHg4OSIKKyAgICAkRUNITyAtbmUgIlx4NjlceDVmXHg2M1x4OWFceDIyXHhlNFx4OTZceDM0XHhmZlx4MTJceDIwXHhkMFx4MjVceDcwXHhkY1x4NWQiCisgICAgJEVDSE8gLW5lICJceGM5XHgxNFx4ZTFceDQyXHg0MFx4NThceDIzXHhmNVx4ODAiCit9CisKKyMgTkI6IHRhciBlbWl0cyAidGFyOiBzaG9ydCByZWFkIiBvbiBzdGRlcnIgYmVjYXVzZSB0aGVzZSB0ZXN0IHRhcnMgYXJlCisjIGFsc28gbGFja2luZyBwcm9wZXIgdGVybWluYXRpbmcgemVyb2VkIGJsb2Nrcy4gQnV0IGV4aXRjb2RlIGlzIDAuCisjIFRoaXMgaXMgaW50ZW5kZWQuCisKK2V4cG9ydCBUWj1VVEMtMQorCisjIENhc2UgMTogbG9uZyBuYW1lLCB3aXRoIHBhdGggaW4gcHJlZml4IGZpZWxkCityZXMxPSctcnctci0tci0tIGZtMy91c2VycyAgICAgIDk4NjkgMjAwNy0wMy0xMiAxMDo0NDo1NCBWaXJ0dWFsQm94LTEuNS42X09TRS9zcmMvbGlicy94cGNvbTE4YTQvaXBjL2lwY2QvZXh0ZW5zaW9ucy90cmFuc21uZ3IvcHVibGljL2lwY0lUcmFuc2FjdGlvblNlcnZpY2UuaWRsJwordD1gdGFyMV9iejIgfCBidW56aXAyIHwgYnVzeWJveCB0YXIgdHZmIC1gCit0ZXN0IHgiJHJlczEiID0geCIkdCIKK3Q9YHRhcjFfYnoyIHwgYnVuemlwMiB8IGJ1c3lib3ggdGFyIHR2YAordGVzdCB4IiRyZXMxIiA9IHgiJHQiCisKKyMgQ2FzZSAyOiBsb25nIGRpciBuYW1lLCB3aXRoIEVOVElSRSBwYXRoIGluIHByZWZpeCBmaWVsZCAobmFtZSA9ICIiKQorcmVzMj0nZHJ3eHIteHIteCBmbTMvdXNlcnMgICAgICAgICAwIDIwMDgtMDItMTkgMTY6MzM6MjAgVmlydHVhbEJveC0xLjUuNl9PU0Uvc3JjL1ZCb3gvQWRkaXRpb25zL2xpbnV4L3gxMWluY2x1ZGUvNC4zL3Byb2dyYW1zL1hzZXJ2ZXIvaHcveGZyZWU4Ni94ZjI0XzMyYnBwLycKK3Q9YHRhcjJfYnoyIHwgYnVuemlwMiB8IGJ1c3lib3ggdGFyIHR2ZiAtYAordGVzdCB4IiRyZXMyIiA9IHgiJHQiCit0PWB0YXIyX2J6MiB8IGJ1bnppcDIgfCBidXN5Ym94IHRhciB0dmAKK3Rlc3QgeCIkcmVzMiIgPSB4IiR0IgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhc2tzZXQudGVzdHMgYi90ZXN0c3VpdGUvdGFza3NldC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmI1YzkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhc2tzZXQudGVzdHMKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIyBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorYT0idGFza3NldCIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICAgICAgICAgICAgICAib3B0cyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wIiAic3RkaW4iCit0ZXN0aW5nICJ0YXNrc2V0IChnZXQgZnJvbSBwaWQgMSkiICIkYSAtcCAxID4vZGV2L251bGw7ZWNobyBcJD8iICIwXG4iICIiICIiCit0ZXN0aW5nICJ0YXNrc2V0IChpbnZhbGlkIHBpZCkiICAgICIkYSAtcCAwID4vZGV2L251bGwgMj4mMTtlY2hvIFwkPyIgIjFcbiIgIiIgIiIKK3Rlc3RpbmcgInRhc2tzZXQgKHNldF9hZmYsIG5lZWRzIENBUF9TWVNfTklDRSkiIFwKKwkiJGEgMHgxICRTSEVMTCAtYyAnJGEgLXAgXCRcJCB8IGdyZXAgXCJjdXJyZW50IGFmZmluaXR5IG1hc2s6IDFcIiA+L2Rldi9udWxsJzsgZWNobyBcJD8iIFwKKwkiMFxuIiAiIiAiIgorCit1bnNldCBhCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90ZWUvdGVlLWFwcGVuZHMtaW5wdXQgYi90ZXN0c3VpdGUvdGVlL3RlZS1hcHBlbmRzLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjIwYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGVlL3RlZS1hcHBlbmRzLWlucHV0CkBAIC0wLDAgKzEsNSBAQAorZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCA+Zm9vCitjcCBmb28gYmFyCitlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90ID4+Zm9vCitlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB0ZWUgLWEgYmFyID4vZGV2L251bGwKK2NtcCBmb28gYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGVlL3RlZS10ZWVzLWlucHV0IGIvdGVzdHN1aXRlL3RlZS90ZWUtdGVlcy1pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmUyMTczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RlZS90ZWUtdGVlcy1pbnB1dApAQCAtMCwwICsxLDMgQEAKK2VjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgPmZvbworZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCB8IGJ1c3lib3ggdGVlIGJhciA+YmF6CitjbXAgZm9vIGJhciAmJiBjbXAgZm9vIGJhegpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rlc3QudGVzdHMgYi90ZXN0c3VpdGUvdGVzdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzkyZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rlc3QudGVzdHMKQEAgLTAsMCArMSw3OSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKKyMgTmVlZCB0byBjYWxsICdidXN5Ym94IHRlc3QnLCBvdGhlcndpc2Ugc2hlbGwgYnVpbHRpbiBpcyB1c2VkCisKK3Rlc3RpbmcgInRlc3Q6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0OyBlY2hvIFwkPyIgXAorCSIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICcnOiBzaG91bGQgYmUgZmFsc2UgKDEpIiBcCisJImJ1c3lib3ggdGVzdCAnJzsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAhOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0ICE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgYTogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCBhOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0IC0taGVscDogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAtLWhlbHA7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgLWY6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgLWY7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgISAtZjogc2hvdWxkIGJlIGZhbHNlICgxKSIgXAorCSJidXN5Ym94IHRlc3QgISAtZjsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCBhID0gYTogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCBhID0gYTsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAtbHQgPSAtZ3Q6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0IC1sdCA9IC1ndDsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCBhIC1hICE6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgYSAtYSAhOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0IC1mID0gYSAtbyBiOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0IC1mID0gYSAtbyBiOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICEgYSA9IGIgLWEgISBjID0gYzogc2hvdWxkIGJlIGZhbHNlICgxKSIgXAorCSJidXN5Ym94IHRlc3QgISBhID0gYiAtYSAhIGMgPSBjOyBlY2hvIFwkPyIgXAorCSIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICEgYSA9IGIgLWEgISBjID0gZDogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAhIGEgPSBiIC1hICEgYyA9IGQ7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rlc3Rpbmcuc2ggYi90ZXN0c3VpdGUvdGVzdGluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U2NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rlc3Rpbmcuc2gKQEAgLTAsMCArMSwxNzAgQEAKKyMgU2ltcGxlIHRlc3QgaGFybmVzcyBpbmZyYXN0cnVjdHVyZSBmb3IgQnVzeUJveAorIworIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleQorIworIyBMaWNlbnNlIGlzIEdQTHYyLCBzZWUgTElDRU5TRSBpbiB0aGUgYnVzeWJveCB0YXJiYWxsIGZvciBmdWxsIGxpY2Vuc2UgdGV4dC4KKworIyBUaGlzIGZpbGUgZGVmaW5lcyB0d28gZnVuY3Rpb25zLCAidGVzdGluZyIgYW5kICJvcHRpb25hbCIKKyMgYW5kIGEgY291cGxlIG1vcmUuLi4KKworIyBUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXkgYmUgc2V0IHRvIGVuYWJsZSBvcHRpb25hbCBiZWhhdmlvcgorIyBpbiAidGVzdGluZyI6CisjICAgIFZFUkJPU0UgLSBQcmludCB0aGUgZGlmZiAtdSBvZiBlYWNoIGZhaWxlZCB0ZXN0IGNhc2UuCisjICAgIERFQlVHIC0gRW5hYmxlIGNvbW1hbmQgdHJhY2luZy4KKyMgICAgU0tJUCAtIGRvIG5vdCBwZXJmb3JtIHRoaXMgdGVzdCAodGhpcyBpcyBzZXQgYnkgIm9wdGlvbmFsIikKKyMKKyMgVGhlICJ0ZXN0aW5nIiBmdW5jdGlvbiB0YWtlcyBmaXZlIGFyZ3VtZW50czoKKyMJJDEpIFRlc3QgZGVzY3JpcHRpb24KKyMJJDIpIENvbW1hbmQocykgdG8gcnVuLiBNYXkgaGF2ZSBwaXBlcywgcmVkaXJlY3RzLCBldGMKKyMJJDMpIEV4cGVjdGVkIHJlc3VsdCBvbiBzdGRvdXQKKyMJJDQpIERhdGEgdG8gYmUgd3JpdHRlbiB0byBmaWxlICJpbnB1dCIKKyMJJDUpIERhdGEgdG8gYmUgd3JpdHRlbiB0byBzdGRpbgorIworIyBUaGUgZXhpdCB2YWx1ZSBvZiB0ZXN0aW5nIGlzIHRoZSBleGl0IHZhbHVlIG9mICQyIGl0IHJhbi4KKyMKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICJGQUlMQ09VTlQiIGNvbnRhaW5zIGEgY3VtdWxhdGl2ZSB0b3RhbCBvZiB0aGUKKyMgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKworIyBUaGUgIm9wdGlvbmFsIiBmdW5jdGlvbiBpcyB1c2VkIHRvIHNraXAgY2VydGFpbiB0ZXN0cywgYWxhOgorIyAgIG9wdGlvbmFsIEZFQVRVUkVfVEhJTkdZCisjCisjIFRoZSAib3B0aW9uYWwiIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIk9QVElPTkZMQUdTIiwKKyMgd2hpY2ggaXMgZWl0aGVyIGVtcHR5IChpbiB3aGljaCBjYXNlIGl0IGFsd2F5cyBjbGVhcnMgU0tJUCkgb3IKKyMgZWxzZSBjb250YWlucyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmVzIChpbiB3aGljaCBjYXNlIHRoZSBmdW5jdGlvbgorIyBjbGVhcnMgU0tJUCBpZiB0aGUgZmxhZyB3YXMgZm91bmQsIG9yIHNldHMgaXQgdG8gMSBpZiB0aGUgZmxhZyB3YXMgbm90IGZvdW5kKS4KKworZXhwb3J0IEZBSUxDT1VOVD0wCitleHBvcnQgU0tJUD0KKworIyBIZWxwZXIgZm9yIGhlbHBlcnMuIE9oIG15Li4uCisKK3Rlc3QgeCIkRUNITyIgIT0geCIiIHx8IHsKKwlFQ0hPPSJlY2hvIgorCXRlc3QgeCJgZWNobyAtbmVgIiA9IHgiIiB8fCB7CisJCSMgQ29tcGlsZSBhbmQgdXNlIGEgcmVwbGFjZW1lbnQgJ2VjaG8nIHdoaWNoIHVuZGVyc3RhbmRzIC1lIC1uCisJCUVDSE89IiRQV0QvZWNoby1uZSIKKwkJdGVzdCAteCAiJEVDSE8iIHx8IHsKKwkJCWdjYyAtT3MgLW8gIiRFQ0hPIiAuLi9zY3JpcHRzL2VjaG8uYyB8fCBleGl0IDEKKwkJfQorCX0KKwlleHBvcnQgRUNITworfQorCisjIEhlbHBlciBmdW5jdGlvbnMKKworb3B0aW9uYWwoKQoreworCVNLSVA9CisJd2hpbGUgdGVzdCAiJDEiOyBkbworCQlpZiB0ZXN0IHgiJHtPUFRJT05GTEFHUy8qOiQxOioveX0iICE9IHgieSI7IHRoZW4KKwkJCVNLSVA9MQorCQkJcmV0dXJuCisJCWZpCisJCXNoaWZ0CisJZG9uZQorfQorCisjIFRoZSB0ZXN0aW5nIGZ1bmN0aW9uCisKK3Rlc3RpbmcoKQoreworICBOQU1FPSIkMSIKKyAgWyAtbiAiJDEiIF0gfHwgTkFNRT0iJDIiCisKKyAgaWYgWyAkIyAtbmUgNSBdCisgIHRoZW4KKyAgICBlY2hvICJUZXN0ICROQU1FIGhhcyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzOiAkIyAobXVzdCBiZSA1KSIgPiYyCisgICAgZXhpdCAxCisgIGZpCisKKyAgWyAteiAiJERFQlVHIiBdIHx8IHNldCAteAorCisgIGlmIFsgLW4gIiRTS0lQIiBdCisgIHRoZW4KKyAgICBlY2hvICJTS0lQUEVEOiAkTkFNRSIKKyAgICByZXR1cm4gMAorICBmaQorCisgICRFQ0hPIC1uZSAiJDMiID4gZXhwZWN0ZWQKKyAgJEVDSE8gLW5lICIkNCIgPiBpbnB1dAorICBbIC16ICIkVkVSQk9TRSIgXSB8fCBlY2hvID09PT09PT09PT09PT09PT09PT09PT0KKyAgWyAteiAiJFZFUkJPU0UiIF0gfHwgZWNobyAiZWNobyAtbmUgJyQ0JyA+aW5wdXQiCisgIFsgLXogIiRWRVJCT1NFIiBdIHx8IGVjaG8gImVjaG8gLW5lICckNScgfCAkMiIKKyAgJEVDSE8gLW5lICIkNSIgfCBldmFsICIkMiIgPiBhY3R1YWwKKyAgUkVUVkFMPSQ/CisKKyAgaWYgY21wIGV4cGVjdGVkIGFjdHVhbCA+L2Rldi9udWxsIDI+L2Rldi9udWxsCisgIHRoZW4KKyAgICBlY2hvICJQQVNTOiAkTkFNRSIKKyAgZWxzZQorICAgIEZBSUxDT1VOVD0kKCgkRkFJTENPVU5UICsgMSkpCisgICAgZWNobyAiRkFJTDogJE5BTUUiCisgICAgWyAteiAiJFZFUkJPU0UiIF0gfHwgZGlmZiAtdSBleHBlY3RlZCBhY3R1YWwKKyAgZmkKKyAgcm0gLWYgaW5wdXQgZXhwZWN0ZWQgYWN0dWFsCisKKyAgWyAteiAiJERFQlVHIiBdIHx8IHNldCAreAorCisgIHJldHVybiAkUkVUVkFMCit9CisKKyMgUmVjdXJzaXZlbHkgZ3JhYiBhbiBleGVjdXRhYmxlIGFuZCBhbGwgdGhlIGxpYnJhcmllcyBuZWVkZWQgdG8gcnVuIGl0LgorIyBTb3VyY2UgcGF0aHMgYmVnaW5uaW5nIHdpdGggLyB3aWxsIGJlIGNvcGllZCBpbnRvIGRlc3RwYXRoLCBvdGhlcndpc2UKKyMgdGhlIGZpbGUgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIHRoZXJlIGFuZCBvbmx5IGl0cyBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyBhcmUgY29waWVkLgorCitta2Nocm9vdCgpCit7CisgIFsgJCMgLWx0IDIgXSAmJiByZXR1cm4KKworICAkRUNITyAtbiAuCisKKyAgZGVzdD0kMQorICBzaGlmdAorICBmb3IgaSBpbiAiJEAiCisgIGRvCisgICAgI2Jhc2hpc206IFsgIiR7aTowOjF9IiA9PSAiLyIgXSB8fCBpPSQod2hpY2ggJGkpCisgICAgaT0kKHdoaWNoICRpKSAjIG5vLW9wIGZvciAvYmluL3Byb2cKKyAgICBbIC1mICIkZGVzdC8kaSIgXSAmJiBjb250aW51ZQorICAgIGlmIFsgLWUgIiRpIiBdCisgICAgdGhlbgorICAgICAgZD1gZWNobyAiJGkiIHwgZ3JlcCAtbyAnLiovJ2AgJiYKKyAgICAgIG1rZGlyIC1wICIkZGVzdC8kZCIgJiYKKyAgICAgIGNhdCAiJGkiID4gIiRkZXN0LyRpIiAmJgorICAgICAgY2htb2QgK3ggIiRkZXN0LyRpIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIk5vdCBmb3VuZDogJGkiCisgICAgZmkKKyAgICBta2Nocm9vdCAiJGRlc3QiICQobGRkICIkaSIgfCBlZ3JlcCAtbyAnLy4qICcpCisgIGRvbmUKK30KKworIyBTZXQgdXAgYSBjaHJvb3QgZW52aXJvbm1lbnQgYW5kIHJ1biBjb21tYW5kcyB3aXRoaW4gaXQuCisjIE5lZWRlZCBjb21tYW5kcyBsaXN0ZWQgb24gY29tbWFuZCBsaW5lCisjIFNjcmlwdCBmZWQgdG8gc3RkaW4uCisKK2RvY2hyb290KCkKK3sKKyAgbWtkaXIgdG1wZGlyNGNocm9vdAorICBtb3VudCAtdCByYW1mcyB0bXBkaXI0Y2hyb290IHRtcGRpcjRjaHJvb3QKKyAgbWtkaXIgLXAgdG1wZGlyNGNocm9vdC97ZXRjLHN5cyxwcm9jLHRtcCxkZXZ9CisgIGNwIC1MIHRlc3Rpbmcuc2ggdG1wZGlyNGNocm9vdAorCisgICMgQ29weSB1dGlsaXRpZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisKKyAgJEVDSE8gLW4gIlNldHVwIGNocm9vdCIKKyAgbWtjaHJvb3QgdG1wZGlyNGNocm9vdCAkKgorICBlY2hvCisKKyAgbWtub2QgdG1wZGlyNGNocm9vdC9kZXYvdHR5IGMgNSAwCisgIG1rbm9kIHRtcGRpcjRjaHJvb3QvZGV2L251bGwgYyAxIDMKKyAgbWtub2QgdG1wZGlyNGNocm9vdC9kZXYvemVybyBjIDEgNQorCisgICMgQ29weSBzY3JpcHQgZnJvbSBzdGRpbgorCisgIGNhdCA+IHRtcGRpcjRjaHJvb3QvdGVzdC5zaAorICBjaG1vZCAreCB0bXBkaXI0Y2hyb290L3Rlc3Quc2gKKyAgY2hyb290IHRtcGRpcjRjaHJvb3QgL3Rlc3Quc2gKKyAgdW1vdW50IC1sIHRtcGRpcjRjaHJvb3QKKyAgcm1kaXIgdG1wZGlyNGNocm9vdAorfQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWNyZWF0ZXMtZmlsZSBiL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1jcmVhdGVzLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0OTM1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1jcmVhdGVzLWZpbGUKQEAgLTAsMCArMSwyIEBACitidXN5Ym94IHRvdWNoIGZvbwordGVzdCAtZiBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1kb2VzLW5vdC1jcmVhdGUtZmlsZSBiL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC1kb2VzLW5vdC1jcmVhdGUtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODUyNTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWRvZXMtbm90LWNyZWF0ZS1maWxlCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCB0b3VjaCAtYyBmb28KK3Rlc3QgISAtZiBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC10b3VjaGVzLWZpbGVzLWFmdGVyLW5vbi1leGlzdGVudC1maWxlIGIvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLXRvdWNoZXMtZmlsZXMtYWZ0ZXItbm9uLWV4aXN0ZW50LWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2OWVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90b3VjaC90b3VjaC10b3VjaGVzLWZpbGVzLWFmdGVyLW5vbi1leGlzdGVudC1maWxlCkBAIC0wLDAgKzEsMyBAQAordG91Y2ggLXQgMTk4MDAxMDEwMDAwIGJhcgorYnVzeWJveCB0b3VjaCAtYyBmb28gYmFyCit0ZXN0IHgiYGZpbmQgYmFyIC1tdGltZSAtMWAiID0geGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RyLnRlc3RzIGIvdGVzdHN1aXRlL3RyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjY2EyOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHIudGVzdHMKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDkgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImFyZ3VtZW50cyIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJ0ciBkb2VzIG5vdCB0cmVhdCBbXSBpbiBbYS16XSBhcyBzcGVjaWFsIiBcCisJInRyICdbcS16XScgJ19RLVorJyIgXAorCSJfUVdlKyIgIiIgIltxd2VdIgorCit0ZXN0aW5nICJ0ciB1bmRlcnN0YW5kcyAwLTlBLUYiIFwKKwkidHIgLWNkICdbMC05QS1GXSciIFwKKwkiMTlBRiIgIiIgIjE5QUZIXG4iCisKK29wdGlvbmFsIEZFQVRVUkVfVFJfQ0xBU1NFUwordGVzdGluZyAidHIgdW5kZXJzdGFuZHMgWzp4ZGlnaXQ6XSIgXAorCSJ0ciAtY2QgJ1s6eGRpZ2l0Ol0nIiBcCisJIjE5QUYiICIiICIxOUFGSFxuIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9UUl9DTEFTU0VTCit0ZXN0aW5nICJ0ciBkb2VzIG5vdCBzdG9wIGFmdGVyIFs6ZGlnaXQ6XSIgXAorCSJ0ciAnWzpkaWdpdDpdeS16JyAxMTExMTExMTExMjMiIFwKKwkiMTExYWJjeDIzXG4iICIiICI3ODlhYmN4eXpcbiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfVFJfQ0xBU1NFUwordGVzdGluZyAidHIgaGFzIGNvcnJlY3QgeGRpZ2l0IHNlcXVlbmNlIiBcCisJInRyICdbOnhkaWdpdDpdR2cnIDExMTExMTExNTEyNDIyMjIzMzMzMzB4WCIgXAorCSIjMTExMTExMTE1MTI0MjIyMngzMzMzMzBYXG4iICIiIFwKKwkiIzAxMjM0NTY3ODlBQkNERUZHYWJjZGVmZ1xuIgorU0tJUD0KKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdHIvdHItZC1hbG51bS13b3JrcyBiL3Rlc3RzdWl0ZS90ci90ci1kLWFsbnVtLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NDBlYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHIvdHItZC1hbG51bS13b3JrcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUworCitlY2hvIHRlc3RpbmcgfCB0ciAtZCAnW1s6YWxudW06XV0nID4gbG9nZmlsZS5nbnUKK2VjaG8gdGVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFsbnVtOl1dJyA+IGxvZ2ZpbGUuYmIKKworZGlmZiAtdSBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdHIvdHItZC13b3JrcyBiL3Rlc3RzdWl0ZS90ci90ci1kLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHIvdHItZC13b3JrcwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gdGVzdGluZyB8IHRyIC1kIGFlaW91ID4gbG9nZmlsZS5nbnUKK2VjaG8gdGVzdGluZyB8IGJ1c3lib3ggdHIgLWQgYWVpb3UgPiBsb2dmaWxlLmJiCisKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RyL3RyLW5vbi1nbnUgYi90ZXN0c3VpdGUvdHIvdHItbm9uLWdudQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE2OTUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RyL3RyLW5vbi1nbnUKQEAgLTAsMCArMSBAQAorZWNobyBmZGhybnp2ZnUgYmZmdnNlbnRyIHwgYnVzeWJveCB0ciAnW2Etel0nICdbbi16XVthLW1dJwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RyL3RyLXJlamVjdHMtd3JvbmctY2xhc3MgYi90ZXN0c3VpdGUvdHIvdHItcmVqZWN0cy13cm9uZy1jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ4OGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RyL3RyLXJlamVjdHMtd3JvbmctY2xhc3MKQEAgLTAsMCArMSwyMSBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTCisKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1tbOmFscGhhOl1dJyA+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbOmFscGhhOl0nICA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnW1s6YWxwaGE6XScgPj4gbG9nZmlsZS5nbnUKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1tbOmFscGhhOicgPj4gbG9nZmlsZS5nbnUKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1tbOmFscGhhJyA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnWzphbHBoYTpdJyA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnWzphbHBoYTonID4+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbOmFscGhhJyA+PiBsb2dmaWxlLmdudQorCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFscGhhOl1dJyA+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnWzphbHBoYTpdJyAgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbWzphbHBoYTpdJyA+PiBsb2dmaWxlLmJiCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFscGhhOicgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbWzphbHBoYScgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbOmFscGhhOl0nID4+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnWzphbHBoYTonID4+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnWzphbHBoYScgPj4gbG9nZmlsZS5iYgorCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90ci90ci13b3JrcyBiL3Rlc3RzdWl0ZS90ci90ci13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRhMzBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RyL3RyLXdvcmtzCkBAIC0wLDAgKzEsMjggQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUworCitydW5fdHIgKCkKK3sKKwkkRUNITyAtbiAiZWNobyAnJDEnIHwgdHIgJyQyJyAnJDMnOiAiCisJZWNobyAiJDEiIHwgJGJiIHRyICIkMiIgIiQzIgorCWVjaG8KK30KK3RyX3Rlc3QgKCkKK3sKKwlydW5fdHIgImNiYWFiIgkJYWJjIAkJenl4CisJcnVuX3RyICJURVNUSU5HIEEgQiBDIiAJJ1tBLVpdJyAJJ1thLXpdJworCXJ1bl90ciAiYWJjW10iIAkJImFbYiIgCQlBWEIKKwlydW5fdHIgYWJjCQknWzphbHBoYTpdJyAJQS1aQS1aCisJcnVuX3RyIGFiYzU2CQknWzphbG51bTpdJyAJQS1aQS1aeHh4eHh4eHh4eAorCXJ1bl90ciAwMTIJCSdbOmRpZ2l0Ol0nIAlhYmNkZWZnaGkKKwlydW5fdHIgYWJjNTYJCSdbOmxvd2VyOl0nIAknWzp1cHBlcjpdJworCXJ1bl90ciAiIAkiCSdbOnNwYWNlOl0nIAkxMjM0NQorCXJ1bl90ciAiIAkiCSdbOmJsYW5rOl0nIAkxMgorCXJ1bl90ciAnYSBiJwkJJ1s9ID1dJyAJWAorCXJ1bl90ciAiWzoiCQknWzonIAkJYWIKKwlydW5fdHIgIiAJLiw6IgknWzpwdW5jdDpdJwkxMgorCXJ1bl90ciAiIAkuLDoiCSdbOmNudHJsOl0nCTEyCit9CisKK2JiPSAgICAgICAgdHJfdGVzdCA+IGxvZ2ZpbGUuZ251CitiYj1idXN5Ym94IHRyX3Rlc3QgPiBsb2dmaWxlLmJiCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90cnVlL3RydWUtaXMtc2lsZW50IGIvdGVzdHN1aXRlL3RydWUvdHJ1ZS1pcy1zaWxlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxYmRiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90cnVlL3RydWUtaXMtc2lsZW50CkBAIC0wLDAgKzEgQEAKK2J1c3lib3ggdHJ1ZSAyPiYxIHwgY21wIC0gL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdHJ1ZS90cnVlLXJldHVybnMtc3VjY2VzcyBiL3Rlc3RzdWl0ZS90cnVlL3RydWUtcmV0dXJucy1zdWNjZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHJ1ZS90cnVlLXJldHVybnMtc3VjY2VzcwpAQCAtMCwwICsxIEBACitidXN5Ym94IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bWx3cmFwcGVyLnNoIGIvdGVzdHN1aXRlL3VtbHdyYXBwZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU1ZTRkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS91bWx3cmFwcGVyLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCisjIFdyYXBwZXIgZm9yIFVzZXIgTW9kZSBMaW51eCBlbXVsYXRpb24gZW52aXJvbm1lbnQKKworUlVORklMRT0iJChwd2QpLyR7MX0udGVzdHJvb3QiCitpZiBbIC16ICIkUlVORklMRSIgXSB8fCBbICEgLXggIiRSVU5GSUxFIiBdCit0aGVuCisgIGVjaG8gIkNhbid0IHJ1biAnJFJVTkZJTEUnIgorICBleGl0IDEKK2ZpCisKK3NoaWZ0CisKK2lmIFsgLXogJCh3aGljaCBsaW51eCkgXQordGhlbgorICBlY2hvICJObyBVc2VyIE1vZGUgTGludXguIgorICBleGl0IDE7CitmaQorCitsaW51eCByb290ZnN0eXBlPWhvc3RmcyBydyBpbml0PSIkUlVORklMRSIgVEVTVERJUj1gcHdkYCBQQVRIPSIkUEFUSCIgJCogcXVpZXQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bmV4cGFuZC50ZXN0cyBiL3Rlc3RzdWl0ZS91bmV4cGFuZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjMyNmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuZXhwYW5kLnRlc3RzCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAordGVzdCAtZiAiJGJpbmRpci8uY29uZmlnIiAmJiAuICIkYmluZGlyLy5jb25maWciCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSAxIiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICAgICAxMjM0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgMiIgInVuZXhwYW5kIiBcCisJIlx0IDEyMzQ1Njc4XG4iICIiICIgICAgICAgICAxMjM0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgMyIgInVuZXhwYW5kIiBcCisJIlx0ICAxMjM0NTY3OFxuIiAiIiAiICAgICAgICAgIDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA0IiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICAgIFx0MTIzNDU2NzhcbiIgXAorCit0ZXN0aW5nICJ1bmV4cGFuZCBjYXNlIDUiICJ1bmV4cGFuZCIgXAorCSJcdDEyMzQ1Njc4XG4iICIiICIgICAgICBcdDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA2IiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICBcdDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA3IiAidW5leHBhbmQiIFwKKwkiMTIzXHQgNDU2NzhcbiIgIiIgIjEyMyBcdCA0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgOCIgInVuZXhwYW5kIiBcCisJImEgYlxuIiAiIiAiYSBiXG4iIFwKKwordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdGluZyAidW5leHBhbmQgd2l0aCB1bmljb2RlIGNoYXJhY2hlciAweDM5NCIgInVuZXhwYW5kIiBcCisJIjHOlM6UzpQ1XHQ5OTk5OVxuIiAiIiAiMc6UzpTOlDUgICA5OTk5OVxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bmV4cGFuZC91bmV4cGFuZC13b3Jrcy1saWtlLUdOVSBiL3Rlc3RzdWl0ZS91bmV4cGFuZC91bmV4cGFuZC13b3Jrcy1saWtlLUdOVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI1ODM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuZXhwYW5kL3VuZXhwYW5kLXdvcmtzLWxpa2UtR05VCkBAIC0wLDAgKzEsNTIgQEAKK3JtIC1mIGZvbyBiYXIKK2VjaG8gIiAgICAgICB5IiB8IHVuZXhwYW5kIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICB5IiB8IGJ1c3lib3ggdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitybSAtZiBmb28gYmFyCitlY2hvICIgICAgICAgIHkiIHwgdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGZvbworZWNobyAiICAgICAgICB5IiB8IGJ1c3lib3ggdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitlY2hvICIgICAgICAgeSAgICAgICB5IiB8IHVuZXhwYW5kIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICB5ICAgICAgIHkiIHwgYnVzeWJveCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK3JtIC1mIGZvbyBiYXIKK2VjaG8gIiAgICAgICAgeSAgICAgICAgeSIgfCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gZm9vCitlY2hvICIgICAgICAgIHkgICAgICAgIHkiIHwgYnVzeWJveCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK2VjaG8gIiAgICAgICB5ICAgICAgIHkiIHwgdW5leHBhbmQgLWEgLi4vLi4vYnVzeWJveCA+IGZvbworZWNobyAiICAgICAgIHkgICAgICAgeSIgfCBidXN5Ym94IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBiYXIKK3NldCArZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKK2lmIFsgJD8gPSAwIF0gOyB0aGVuCisJc2V0IC1lCisJZGlmZiAtcSBmb28gYmFyCitmaQorcm0gLWYgZm9vIGJhcgorZWNobyAiICAgICAgICB5ICAgICAgICB5IiB8IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICAgeSAgICAgICAgeSIgfCBidXN5Ym94IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBiYXIKK3NldCArZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKK2lmIFsgJD8gPSAwIF0gOyB0aGVuCisJc2V0IC1lCisJZGlmZiAtcSBmb28gYmFyCitmaQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3VuaXEudGVzdHMgYi90ZXN0c3VpdGUvdW5pcS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44M2JmMzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuaXEudGVzdHMKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHVuaXEgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IEZ1bGwgU1VTdjMgY292ZXJhZ2UgKGV4Y2VwdCBpbnRlcm5hdGlvbmFsaXphdGlvbikuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3QgZXhpdCBzdGF0dXMKKwordGVzdGluZyAidW5pcSAoZXhpdCB3aXRoIGVycm9yKSIgInVuaXEgbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgordGVzdGluZyAidW5pcSAoZXhpdCBzdWNjZXNzKSIgInVuaXEgL2Rldi9udWxsICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKKyMgVGVzdCB2YXJpb3VzIGRhdGEgc291cmNlcyBhbmQgZGVzdGluYXRpb25zCisKK3Rlc3RpbmcgInVuaXEgKGRlZmF1bHQgdG8gc3RkaW4pIiAidW5pcSIgIm9uZVxudHdvXG50aHJlZVxuIiAiIiBcCisJIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKK3Rlc3RpbmcgInVuaXEgLSAoc3BlY2lmeSBzdGRpbikiICJ1bmlxIC0iICJvbmVcbnR3b1xudGhyZWVcbiIgIiIgXAorCSJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJ1bmlxIGlucHV0IChzcGVjaWZ5IGZpbGUpIiAidW5pcSBpbnB1dCIgIm9uZVxudHdvXG50aHJlZVxuIiBcCisJIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKwordGVzdGluZyAidW5pcSBpbnB1dCBvdXRmaWxlICh0d28gZmlsZXMpIiAidW5pcSBpbnB1dCBhY3R1YWwgPiAvZGV2L251bGwiIFwKKwkib25lXG50d29cbnRocmVlXG4iICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iICIiCit0ZXN0aW5nICJ1bmlxIChzdGRpbikgb3V0ZmlsZSIgInVuaXEgLSBhY3R1YWwiIFwKKwkib25lXG50d29cbnRocmVlXG4iICIiICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCisjIE5vdGU6IFNVU3YzIGRvZXNuJ3Qgc2VlbSB0byByZXF1aXJlIHN1cHBvcnQgZm9yICItIiBvdXRwdXQsIGJ1dCB3ZSBkbyBhbnl3YXkuCit0ZXN0aW5nICJ1bmlxIGlucHV0IC0gKHNwZWNpZnkgc3Rkb3V0KSIgInVuaXEgaW5wdXQgLSIgXAorCSJvbmVcbnR3b1xudGhyZWVcbiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKworCisjLWYgc2tpcCBmaWVsZHMKKyMtcyBza2lwIGNoYXJzCisjLWMgb2NjdXJyZW5jZXMKKyMtZCBkdXBzIG9ubHkKKyMtdQorIy13IG1heCBjaGFycworCisjIFRlc3QgdmFyaW91cyBjb21tYW5kIGxpbmUgb3B0aW9ucworCisjIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBhIG1pbm9yIHRlY2huaWNhbCB2aW9sYXRpb24gb2YgdGhlIHNwZWMsCisjIGJ1dCBzaW5jZSBnbnUgZG9lcyBpdC4uLgordGVzdGluZyAidW5pcSAtYyAob2NjdXJyZW5jZSBjb3VudCkiICJ1bmlxIC1jIHwgc2VkICdzL15bIFx0XSovLyciIFwKKwkiMSBvbmVcbjIgdHdvXG4zIHRocmVlXG4iICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAidW5pcSAtZCAoZHVwcyBvbmx5KSIgInVuaXEgLWQiICJ0d29cbnRocmVlXG4iICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgorCit0ZXN0aW5nICJ1bmlxIC1mIC1zIChza2lwIGZpZWxkcyBhbmQgY2hhcnMpIiAidW5pcSAtZjIgLXMgMyIgXAorImNjCWRkCWVlOAorYWEJYmIJY2M5CisiICIiIFwKKyJjYwlkZAllZTgKK2JiCWNjCWRkOAorYWEJYmIJY2M5CisiCit0ZXN0aW5nICJ1bmlxIC13IChjb21wYXJlIG1heCBjaGFyYWN0ZXJzKSIgInVuaXEgLXcgMiIgXAorImNjMQorIiAiIiBcCisiY2MxCitjYzIKK2NjMworIgorCit0ZXN0aW5nICJ1bmlxIC1zIC13IChza2lwIGZpZWxkcyBhbmQgY29tcGFyZSBtYXggY2hhcnMpIiBcCisidW5pcSAtcyAyIC13IDIiIFwKKyJhYWNjYWEKKyIgIiIgXAorImFhY2NhYQorYWFjY2JiCitiYmNjYWEKKyIKKworIyAtZCBpcyAiU3VwcHJlc3MgdGhlIHdyaXRpbmcgZm8gbGluZXMgdGhhdCBhcmUgbm90IHJlcGVhdGVkIGluIHRoZSBpbnB1dC4iCisjIC11IGlzICJTdXBwcmVzcyB0aGUgd3JpdGluZyBvZiBsaW5lcyB0aGF0IGFyZSByZXBlYXRlZCBpbiB0aGUgaW5wdXQuIgorIyBUaGVyZWZvcmUsIHRvZ2V0aGVyIHRoaXMgbWVhbnMgdGhleSBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQuCit0ZXN0aW5nICJ1bmlxIC11IGFuZCAtZCBwcm9kdWNlIG5vIG91dHB1dCIgInVuaXEgLWQgLXUiICIiICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bnppcC50ZXN0cyBiL3Rlc3RzdWl0ZS91bnppcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Njc3YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuemlwLnRlc3RzCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciB1bnppcC4KKyMgQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgQ29weXJpZ2h0IDIwMDYgR2xlbm4gTWNHcmF0aAorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKworIyBDcmVhdGUgYSBzY3JhdGNoIGRpcmVjdG9yeQorCitta2RpciB0ZW1wCitjZCB0ZW1wCisKKyMgQ3JlYXRlIHRlc3QgZmlsZSB0byB3b3JrIHdpdGguCisKK21rZGlyIGZvbwordG91Y2ggZm9vL2JhcgoremlwIGZvby56aXAgZm9vIGZvby9iYXIgPiAvZGV2L251bGwKK3JtIC1mIGZvby9iYXIKK3JtZGlyIGZvbworCisjIFRlc3QgdGhhdCB1bnppcHBpbmcganVzdCBmb28gZG9lc24ndCBjcmVhdGUgYmFyLgordGVzdGluZyAidW56aXAgKHN1YmRpciBvbmx5KSIgInVuemlwIC1xIGZvby56aXAgZm9vLyAmJiB0ZXN0IC1kIGZvbyAmJiB0ZXN0ICEgLWYgZm9vL2JhciAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCitybWRpciBmb28KK3JtIGZvby56aXAKKworIyBDbGVhbiB1cCBzY3JhdGNoIGRpcmVjdG9yeS4KKworY2QgLi4KK3JtIC1yZiB0ZW1wCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3VwdGltZS91cHRpbWUtd29ya3MgYi90ZXN0c3VpdGUvdXB0aW1lL3VwdGltZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjE2OGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VwdGltZS91cHRpbWUtd29ya3MKQEAgLTAsMCArMSBAQAorYnVzeWJveCB1cHRpbWUKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91dWVuY29kZS50ZXN0cyBiL3Rlc3RzdWl0ZS91dWVuY29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZDYxOTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3V1ZW5jb2RlLnRlc3RzCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorCisjIHVuaXQgdGVzdCBmb3IgdXVlbmNvZGUgdG8gdGVzdCBmdW5jdGlvbmFsaXR5LgorIyBDb3B5cmlnaHQgMjAwNiBieSBFcmlrIEhvdmxhbmQgPGVyaWtAaG92bGFuZC5vcmc+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IFVuaXQgdGVzdHMgZm9yIHV1ZW5jb2RlCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3Qgc2V0dXAgb2Ygc3RhbmRhcmQgaW5wdXQKK3VtYXNrIDAKK3Rlc3RpbmcgInV1ZW5jb2RlIHNldHMgc3RhbmRhcmQgaW5wdXQgbW9kZSBjb3JyZWN0bHkiIFwKKyAgICAgICAgInV1ZW5jb2RlIGZvbyA8L2Rldi9udWxsIHwgaGVhZCAtbiAxIHwgZ3JlcCAtcSA2NjYgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3VtYXNrIDAyMgorCit0ZXN0aW5nICJ1dWVuY29kZSBjb3JyZWN0IGVuY29kaW5nIiAidXVlbmNvZGUgYmJfdXVlbmNfdGVzdC5vdXQiIFwKKyJiZWdpbiA2NDQgYmJfdXVlbmNfdGVzdC5vdXRcbk01JkFFKCY5QTxXMEA5VylFPjIhRjtXQEA6RzVNPCY1RCgmXVY5NyhAPSZBRSgmUUE+R0RAOEcpTz1WWEBcbiU5Jl1HK0BIXGBcblxgXG5lbmRcbiIgXAorICAgICAgICAiIiAiVGhlIGZhc3QgZ3JleSBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgYnJvd24gZG9nLlxuIgordGVzdGluZyAidXVlbmNvZGUgY29ycmVjdCBiYXNlNjQgZW5jb2RpbmciICJ1dWVuY29kZSAtbSBiYl91dWVuY190ZXN0Lm91dCIgXAorImJlZ2luLWJhc2U2NCA2NDQgYmJfdXVlbmNfdGVzdC5vdXRcblZHaGxJR1poYzNRZ1ozSmxlU0JtYjNnZ2FuVnRjR1ZrSUc5MlpYSWdkR2hsSUd4aGVua2dZbkp2ZDI0Z1xuWkc5bkxnbz1cbj09PT1cbiIgXAorICAgICAgICAiIiAiVGhlIGZhc3QgZ3JleSBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgYnJvd24gZG9nLlxuIgorZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWFsbCBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODM2NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWFsbApAQCAtMCwwICsxLDIgQEAKKyMgMSBsaW5lLCA0IHdvcmRzLCAyMCBjaGFycy4KK3Rlc3QgImBlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB3YyB8IHNlZCAncy8gICovIC9nJyB8IHNlZCAncy9eIC8vJ2AiID0gJzEgNCAyMCcKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtY2hhcmFjdGVycyBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtY2hhcmFjdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU4NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3djL3djLWNvdW50cy1jaGFyYWN0ZXJzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGVjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHdjIC1jYCAtZXEgMjAKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtbGluZXMgYi90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWxpbmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTZlZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWxpbmVzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGVjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHdjIC1sYCAtZXEgMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3djL3djLWNvdW50cy13b3JkcyBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtd29yZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNjUwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtd29yZHMKQEAgLTAsMCArMSBAQAordGVzdCBgZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCB8IGJ1c3lib3ggd2MgLXdgIC1lcSA0CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2Mvd2MtcHJpbnRzLWxvbmdlc3QtbGluZS1sZW5ndGggYi90ZXN0c3VpdGUvd2Mvd2MtcHJpbnRzLWxvbmdlc3QtbGluZS1sZW5ndGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MzFmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS93Yy93Yy1wcmludHMtbG9uZ2VzdC1saW5lLWxlbmd0aApAQCAtMCwwICsxIEBACit0ZXN0IGBlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB3YyAtTGAgLWVxIDE5CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2dldC93Z2V0LS1PLW92ZXJyaWRlcy0tUCBiL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtLU8tb3ZlcnJpZGVzLS1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTNhOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LS1PLW92ZXJyaWRlcy0tUApAQCAtMCwwICsxLDUgQEAKK3Rlc3QgeCIkU0tJUF9JTlRFUk5FVF9URVNUUyIgIT0geCIiICYmIGV4aXQKKworbWtkaXIgZm9vCitidXN5Ym94IHdnZXQgLXEgLU8gaW5kZXguaHRtbCAtUCBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBpbmRleC5odG1sCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2dldC93Z2V0LWhhbmRsZXMtZW1wdHktcGF0aCBiL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtaGFuZGxlcy1lbXB0eS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDYwYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LWhhbmRsZXMtZW1wdHktcGF0aApAQCAtMCwwICsxLDMgQEAKK3Rlc3QgeCIkU0tJUF9JTlRFUk5FVF9URVNUUyIgIT0geCIiICYmIGV4aXQKKworYnVzeWJveCB3Z2V0IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3dnZXQvd2dldC1yZXRyaWV2ZXMtZ29vZ2xlLWluZGV4IGIvdGVzdHN1aXRlL3dnZXQvd2dldC1yZXRyaWV2ZXMtZ29vZ2xlLWluZGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LXJldHJpZXZlcy1nb29nbGUtaW5kZXgKQEAgLTAsMCArMSw0IEBACit0ZXN0IHgiJFNLSVBfSU5URVJORVRfVEVTVFMiICE9IHgiIiAmJiBleGl0CisKK2J1c3lib3ggd2dldCAtcSAtTyBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtc3VwcG9ydHMtLVAgYi90ZXN0c3VpdGUvd2dldC93Z2V0LXN1cHBvcnRzLS1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTRhYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LXN1cHBvcnRzLS1QCkBAIC0wLDAgKzEsNSBAQAordGVzdCB4IiRTS0lQX0lOVEVSTkVUX1RFU1RTIiAhPSB4IiIgJiYgZXhpdAorCitta2RpciBmb28KK2J1c3lib3ggd2dldCAtcSAtUCBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBmb28vaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3doaWNoL3doaWNoLXVzZXMtZGVmYXVsdC1wYXRoIGIvdGVzdHN1aXRlL3doaWNoL3doaWNoLXVzZXMtZGVmYXVsdC1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2ViOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2hpY2gvd2hpY2gtdXNlcy1kZWZhdWx0LXBhdGgKQEAgLTAsMCArMSw0IEBACitCVVNZQk9YPSQodHlwZSAtcCBidXN5Ym94KQorU0FWRURfUEFUSD0kUEFUSAordW5zZXQgUEFUSAorJEJVU1lCT1ggd2hpY2ggbHMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS94YXJncy50ZXN0cyBiL3Rlc3RzdWl0ZS94YXJncy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZDBhMjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3hhcmdzLnRlc3RzCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInhhcmdzIC1FIF8gc3RvcHMgb24gdW5kZXJzY29yZSIgXAorCSJ4YXJncyAtRSBfIiBcCisJImFcbiIgXAorCSIiICJhXG5fXG5iXG4iCisKK3Rlc3RpbmcgInhhcmdzIC1FICcnIiBcCisJInhhcmdzIC1FICcnIiBcCisJImEgXyBiXG4iIFwKKwkiIiAiYVxuX1xuYlxuIgorCit0ZXN0aW5nICJ4YXJncyAtZSB3aXRob3V0IHBhcmFtIiBcCisJInhhcmdzIC1lIiBcCisJImEgXyBiXG4iIFwKKwkiIiAiYVxuX1xuYlxuIgorCit0ZXN0aW5nICJ4YXJncyBkb2VzIG5vdCBzdG9wIG9uIHVuZGVyc2NvcmUgKCduZXcnIEdOVSBiZWhhdmlvcikiIFwKKwkieGFyZ3MiIFwKKwkiYSBfIGJcbiIgXAorCSIiICJhXG5fXG5iXG4iCisKK3Rlc3RpbmcgInhhcmdzIC1zNyBjYW4gdGFrZSBvbmUtY2hhciBpbnB1dCIgXAorCSJ4YXJncyAtczcgZWNobyIgXAorCSJhXG4iIFwKKwkiIiAiYVxuIgorCit0ZXN0aW5nICJ4YXJncyAtc05VTSB0ZXN0IDEiIFwKKwkieGFyZ3MgLXRzMjUgZWNobyAyPiYxID4vZGV2L251bGwiIFwKKwkiZWNobyAxIDIgMyA0IDUgNiA3IDggOSAwXG4iImVjaG8gMSAyIDMgNCA1IDYgNyA4IDlcbiIiZWNobyAwMFxuIiBcCisJIiIgIjEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMDBcbiIKKwordGVzdGluZyAieGFyZ3MgLXNOVU0gdGVzdCAyIiBcCisJInhhcmdzIC10czI1IGVjaG8gMSAyPiYxID4vZGV2L251bGwiIFwKKwkiZWNobyAxIDIgMyA0IDUgNiA3IDggOSAwXG4iImVjaG8gMSAyIDMgNCA1IDYgNyA4IDlcbiIiZWNobyAxIDAwXG4iIFwKKwkiIiAiMiAzIDQgNSA2IDcgOCA5IDAgMiAzIDQgNSA2IDcgOCA5IDAwXG4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3hhcmdzL3hhcmdzLXdvcmtzIGIvdGVzdHN1aXRlL3hhcmdzL3hhcmdzLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTg2OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUveGFyZ3MveGFyZ3Mtd29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitmaW5kICIkZCIgLW5hbWUgXCp3b3JrcyAtdHlwZSBmIHwgeGFyZ3MgbWQ1c3VtID4gbG9nZmlsZS5nbnUKK2ZpbmQgIiRkIiAtbmFtZSBcKndvcmtzIC10eXBlIGYgfCBidXN5Ym94IHhhcmdzIG1kNXN1bSA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9Db25maWcuaW4gYi91dGlsLWxpbnV4L0NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNlMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9Db25maWcuaW4KQEAgLTAsMCArMSw5ODUgQEAKKyMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjCisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMaW51eCBTeXN0ZW0gVXRpbGl0aWVzIgorCitjb25maWcgQkxPQ0tERVYKKwlib29sICJibG9ja2RldiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQZXJmb3JtcyBzb21lIGlvY3RscyB3aXRoIGJsb2NrIGRldmljZXMuCitjb25maWcgUkVWCisJYm9vbCAicmV2IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJldmVyc2UgbGluZXMgb2YgYSBmaWxlIG9yIGZpbGVzLgorCitjb25maWcgQUNQSUQKKwlib29sICJhY3BpZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBhY3BpZCBsaXN0ZW5zIHRvIEFDUEkgZXZlbnRzIGNvbWluZyBlaXRoZXIgaW4gdGV4dHVhbCBmb3JtIGZyb20KKwkgIC9wcm9jL2FjcGkvZXZlbnQgKHRob3VnaCBpdCBpcyBtYXJrZWQgZGVwcmVjYXRlZCBpdCBpcyBzdGlsbCB3aWRlbHkKKwkgIHVzZWQgYW5kIF9pc18gYSBzdGFuZGFyZCkgb3IgaW4gYmluYXJ5IGZvcm0gZnJvbSBzcGVjaWZpZWQgZXZkZXZzCisJICAoanVzdCB1c2UgL2Rldi9pbnB1dC9ldmVudCopLgorCisJICBJdCBwYXJzZXMgdGhlIGV2ZW50IHRvIHJldHJpZXZlIEFDVElPTiBhbmQgYSBwb3NzaWJsZSBQQVJBTUVURVIuCisJICBJdCB0aGVuIHNwYXducyAvZXRjL2FjcGkvPEFDVElPTj5bLzxQQVJBTUVURVI+XSBlaXRoZXIgdmlhIHJ1bi1wYXJ0cworCSAgKGlmIHRoZSByZXN1bHRpbmcgcGF0aCBpcyBhIGRpcmVjdG9yeSkgb3IgZGlyZWN0bHkgYXMgYW4gZXhlY3V0YWJsZS4KKworCSAgTi5CLiBhY3BpZCByZWxpZXMgb24gcnVuLXBhcnRzIHNvIGhhdmUgdGhlIGxhdHRlciBpbnN0YWxsZWQuCisKK2NvbmZpZyBGRUFUVVJFX0FDUElEX0NPTVBBVAorCWJvb2wgIkFjY2VwdCBhbmQgaWdub3JlIHJlZHVuZGFudCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQUNQSUQKKwloZWxwCisJICBBY2NlcHQgYW5kIGlnbm9yZSBjb21wYXRpYmlsaXR5IG9wdGlvbnMgLWcgLW0gLXMgLVMgLXYuCisKK2NvbmZpZyBCTEtJRAorCWJvb2wgImJsa2lkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIExpc3RzIGxhYmVscyBhbmQgVVVJRHMgb2YgYWxsIGZpbGVzeXN0ZW1zLgorCSAgV0FSTklORzoKKwkgIFdpdGggYWxsIHN1Ym1vZHVsZXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWRkIH44ayB0byBidXN5Ym94LgorCitjb25maWcgRkVBVFVSRV9CTEtJRF9UWVBFCisJYm9vbCAiUHJpbnQgZmlsZXN5c3RlbSB0eXBlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQkxLSUQKKwloZWxwCisJICBTaG93IFRZUEU9ImZpbGVzeXN0ZW0gdHlwZSIKKworY29uZmlnIERNRVNHCisJYm9vbCAiZG1lc2ciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZG1lc2cgaXMgdXNlZCB0byBleGFtaW5lIG9yIGNvbnRyb2wgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4gV2hlbiB0aGUKKwkgIExpbnV4IGtlcm5lbCBwcmludHMgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2csIHRoZXkgYXJlIHN0b3JlZCBpbgorCSAgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4gWW91IGNhbiB1c2UgZG1lc2cgdG8gcHJpbnQgdGhlIGtlcm5lbCdzIHJpbmcKKwkgIGJ1ZmZlciwgY2xlYXIgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlciwgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBrZXJuZWwKKwkgIHJpbmcgYnVmZmVyLCBhbmQgY2hhbmdlIHRoZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCBrZXJuZWwgbWVzc2FnZXMKKwkgIGFyZSBhbHNvIGxvZ2dlZCB0byB0aGUgc3lzdGVtIGNvbnNvbGUuIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3UKKwkgIHdpc2ggdG8gZW5hYmxlIHRoZSAnZG1lc2cnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0RNRVNHX1BSRVRUWQorCWJvb2wgIlByZXR0eSBkbWVzZyBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBETUVTRworCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIHNjcnViIHRoZSBzeXNsb2cgbGV2ZWwgZnJvbSB0aGUgb3V0cHV0LCBzYXkgJ1knIGhlcmUuCisJICBUaGUgc3lzbG9nIGxldmVsIGlzIGEgc3RyaW5nIHByZWZpeGVkIHRvIGV2ZXJ5IGxpbmUgd2l0aCB0aGUgZm9ybQorCSAgIjwjPiIuCisKKwkgIFdpdGggdGhpcyBvcHRpb24geW91IHdpbGwgc2VlOgorCSAgICAjIGRtZXNnCisJICAgIExpbnV4IHZlcnNpb24gMi42LjE3LjQgLi4uLi4KKwkgICAgQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgorCSAgICAgQklPUy1lODIwOiAwMDAwMDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDA5ZjAwMCAodXNhYmxlKQorCisJICBXaXRob3V0IHRoaXMgb3B0aW9uIHlvdSB3aWxsIHNlZToKKwkgICAgIyBkbWVzZworCSAgICA8NT5MaW51eCB2ZXJzaW9uIDIuNi4xNy40IC4uLi4uCisJICAgIDw2PkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKKwkgICAgPDY+IEJJT1MtZTgyMDogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwOWYwMDAgKHVzYWJsZSkKKworY29uZmlnIEZCU0VUCisJYm9vbCAiZmJzZXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmJzZXQgaXMgdXNlZCB0byBzaG93IG9yIGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgYSBMaW51eCBmcmFtZSBidWZmZXIKKwkgIGRldmljZS4gVGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgcHJvdmlkZXMgYSBzaW1wbGUgYW5kIHVuaXF1ZQorCSAgaW50ZXJmYWNlIHRvIGFjY2VzcyBhIGdyYXBoaWNzIGRpc3BsYXkuIEVuYWJsZSB0aGlzIG9wdGlvbgorCSAgaWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZSAnZmJzZXQnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0ZCU0VUX0ZBTkNZCisJYm9vbCAiVHVybiBvbiBleHRyYSBmYnNldCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJTRVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGV4dGVuZGVkIGZic2V0IG9wdGlvbnMsIGFsbG93aW5nIG9uZSB0byBzZXQgdGhlCisJICBmcmFtZWJ1ZmZlciBzaXplLCBjb2xvciBkZXB0aCwgZXRjLiBpbnRlcmZhY2UgdG8gYWNjZXNzIGEgZ3JhcGhpY3MKKwkgIGRpc3BsYXkuIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBlbmFibGUgZXh0ZW5kZWQgZmJzZXQKKwkgIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX0ZCU0VUX1JFQURNT0RFCisJYm9vbCAiVHVybiBvbiBmYnNldCByZWFkbW9kZSBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJTRVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgZmJzZXQgdG8gcmVhZCB0aGUgdmlkZW8gbW9kZSBkYXRhYmFzZSBzdG9yZWQgYnkKKwkgIGRlZmF1bHQgYXMgL2V0Yy9mYi5tb2Rlcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2V0IGZyYW1lIGJ1ZmZlcgorCSAgZGV2aWNlIHRvIHByZS1kZWZpbmVkIHZpZGVvIG1vZGVzLgorCitjb25maWcgRkRGTFVTSAorCWJvb2wgImZkZmx1c2giCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmRmbHVzaCBpcyBvbmx5IG5lZWRlZCB3aGVuIGNoYW5naW5nIG1lZGlhIG9uIHNsaWdodGx5LWJyb2tlbgorCSAgcmVtb3ZhYmxlIG1lZGlhIGRyaXZlcy4gSXQgaXMgdXNlZCB0byBtYWtlIExpbnV4IGJlbGlldmUgdGhhdCBhCisJICBoYXJkd2FyZSBkaXNrLWNoYW5nZSBzd2l0Y2ggaGFzIGJlZW4gYWN0dWF0ZWQsIHdoaWNoIGNhdXNlcyBMaW51eCB0bworCSAgZm9yZ2V0IGFueXRoaW5nIGl0IGhhcyBjYWNoZWQgZnJvbSB0aGUgcHJldmlvdXMgbWVkaWEuIElmIHlvdSBoYXZlCisJICBzdWNoIGEgc2xpZ2h0bHktYnJva2VuIGRyaXZlLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBmZGZsdXNoIGV2ZXJ5IHRpbWUKKwkgIHlvdSBjaGFuZ2UgYSBkaXNrLiBNb3N0IHBlb3BsZSBoYXZlIHdvcmtpbmcgaGFyZHdhcmUgYW5kIGNhbiBzYWZlbHkKKwkgIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBGREZPUk1BVAorCWJvb2wgImZkZm9ybWF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGZkZm9ybWF0IGlzIHVzZWQgdG8gbG93LWxldmVsIGZvcm1hdCBhIGZsb3BweSBkaXNrLgorCitjb25maWcgRkRJU0sKKwlib29sICJmZGlzayIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgZmRpc2sgdXRpbGl0eSBpcyB1c2VkIHRvIGRpdmlkZSBoYXJkIGRpc2tzIGludG8gb25lIG9yIG1vcmUKKwkgIGxvZ2ljYWwgZGlza3MsIHdoaWNoIGFyZSBnZW5lcmFsbHkgY2FsbGVkIHBhcnRpdGlvbnMuIFRoaXMgdXRpbGl0eQorCSAgY2FuIGJlIHVzZWQgdG8gbGlzdCBhbmQgZWRpdCB0aGUgc2V0IG9mIHBhcnRpdGlvbnMgb3IgQlNEIHN0eWxlCisJICAnZGlzayBzbGljZXMnIHRoYXQgYXJlIGRlZmluZWQgb24gYSBoYXJkIGRyaXZlLgorCitjb25maWcgRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUworCWJvb2wgIlN1cHBvcnQgb3ZlciA0R0IgZGlza3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRElTSworCWRlcGVuZHMgb24gIUxGUyAgICMgd2l0aCBMRlMgbm8gc3BlY2lhbCBjb2RlIGlzIG5lZWRlZAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBzdXBwb3J0IGxhcmdlIGRpc2tzID4gNEdCLgorCitjb25maWcgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWJvb2wgIldyaXRlIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRElTSworCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBhIHBhcnRpdGlvbiB0YWJsZQorCSAgYW5kIHdyaXRlIHRob3NlIGNoYW5nZXMgb3V0IHRvIGRpc2suIElmIHlvdSBsZWF2ZSB0aGlzIG9wdGlvbgorCSAgZGlzYWJsZWQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byB2aWV3IHRoZSBwYXJ0aXRpb24gdGFibGUuCisKK2NvbmZpZyBGRUFUVVJFX0FJWF9MQUJFTAorCWJvb2wgIlN1cHBvcnQgQUlYIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIEFJWCBkaXNrbGFiZWxzLgorCSAgTW9zdCBwZW9wbGUgY2FuIHNhZmVseSBsZWF2ZSB0aGlzIG9wdGlvbiBkaXNhYmxlZC4KKworY29uZmlnIEZFQVRVUkVfU0dJX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBTR0kgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBvciBjaGFuZ2UgU0dJIGRpc2tsYWJlbHMuCisJICBNb3N0IHBlb3BsZSBjYW4gc2FmZWx5IGxlYXZlIHRoaXMgb3B0aW9uIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9TVU5fTEFCRUwKKwlib29sICJTdXBwb3J0IFNVTiBkaXNrbGFiZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkRJU0sgJiYgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBTVU4gZGlza2xhYmVscy4KKwkgIE1vc3QgcGVvcGxlIGNhbiBzYWZlbHkgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX09TRl9MQUJFTAorCWJvb2wgIlN1cHBvcnQgQlNEIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIEJTRCBkaXNrbGFiZWxzCisJICBhbmQgZGVmaW5lIGFuZCBlZGl0IEJTRCBkaXNrIHNsaWNlcy4KKworY29uZmlnIEZFQVRVUkVfR1BUX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBHUFQgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHZpZXcgR1VJRCBQYXJ0aXRpb24gVGFibGUKKwkgIGRpc2tsYWJlbHMuCisKK2NvbmZpZyBGRUFUVVJFX0ZESVNLX0FEVkFOQ0VECisJYm9vbCAiU3VwcG9ydCBleHBlcnQgbW9kZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGRvIHRlcnJpYmx5IHVuc2FmZSB0aGluZ3MgbGlrZQorCSAgZGVmaW5lIGFyYml0cmFyeSBkcml2ZSBnZW9tZXRyeSwgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgaW4gYQorCSAgcGFydGl0aW9uLCBhbmQgc2ltaWxhcmx5IGV2aWwgdGhpbmdzLiBVbmxlc3MgeW91IGhhdmUgYSB2ZXJ5IGdvb2QKKwkgIHJlYXNvbiB5b3Ugd291bGQgYmUgd2lzZSB0byBsZWF2ZSB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRklOREZTCisJYm9vbCAiZmluZGZzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIFByaW50cyB0aGUgbmFtZSBvZiBhIGZpbGVzeXN0ZW0gd2l0aCBnaXZlbiBsYWJlbCBvciBVVUlELgorCSAgV0FSTklORzoKKwkgIFdpdGggYWxsIHN1Ym1vZHVsZXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWRkIH44ayB0byBidXN5Ym94LgorCitjb25maWcgRkxPQ0sKKwlib29sICJmbG9jayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYW5hZ2UgbG9ja3MgZnJvbSBzaGVsbCBzY3JpcHRzCisKK2NvbmZpZyBGUkVFUkFNRElTSworCWJvb2wgImZyZWVyYW1kaXNrIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIExpbnV4IGFsbG93cyB5b3UgdG8gY3JlYXRlIHJhbWRpc2tzLiBUaGlzIHV0aWxpdHkgYWxsb3dzIHlvdSB0bworCSAgZGVsZXRlIHRoZW0gYW5kIGNvbXBsZXRlbHkgZnJlZSBhbGwgbWVtb3J5IHRoYXQgd2FzIHVzZWQgZm9yIHRoZQorCSAgcmFtZGlzay4gRm9yIGV4YW1wbGUsIGlmIHlvdSBib290IExpbnV4IGludG8gYSByYW1kaXNrIGFuZCBsYXRlcgorCSAgcGl2b3Rfcm9vdCwgeW91IG1heSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCB0byB0aGUKKwkgIHJhbWRpc2suIElmIHlvdSBoYXZlIG5vIHVzZSBmb3IgZnJlZWluZyBtZW1vcnkgZnJvbSBhIHJhbWRpc2ssIGxlYXZlCisJICB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRlNDS19NSU5JWAorCWJvb2wgImZzY2tfbWluaXgiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG1pbml4IGZpbGVzeXN0ZW0gaXMgYSBuaWNlLCBzbWFsbCwgY29tcGFjdCwgcmVhZC13cml0ZSBmaWxlc3lzdGVtCisJICB3aXRoIGxpdHRsZSBvdmVyaGVhZC4gSXQgaXMgbm90IGEgam91cm5hbGluZyBmaWxlc3lzdGVtIGhvd2V2ZXIgYW5kCisJICBjYW4gZXhwZXJpZW5jZSBjb3JydXB0aW9uIGlmIGl0IGlzIG5vdCBwcm9wZXJseSB1bm1vdW50ZWQgb3IgaWYgdGhlCisJICBwb3dlciBnb2VzIG9mZiBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuIFRoaXMgdXRpbGl0eSBhbGxvd3MgeW91IHRvCisJICBjaGVjayBmb3IgYW5kIGF0dGVtcHQgdG8gcmVwYWlyIGFueSBjb3JydXB0aW9uIHRoYXQgb2NjdXJzIHRvIGEgbWluaXgKKwkgIGZpbGVzeXN0ZW0uCisKK2NvbmZpZyBNS0ZTX0VYVDIKKwlib29sICJta2ZzX2V4dDIiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXRpbGl0eSB0byBjcmVhdGUgRVhUMiBmaWxlc3lzdGVtcy4KKworY29uZmlnIE1LRlNfTUlOSVgKKwlib29sICJta2ZzX21pbml4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBtaW5peCBmaWxlc3lzdGVtIGlzIGEgbmljZSwgc21hbGwsIGNvbXBhY3QsIHJlYWQtd3JpdGUgZmlsZXN5c3RlbQorCSAgd2l0aCBsaXR0bGUgb3ZlcmhlYWQuIElmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gY3JlYXRlIG1pbml4CisJICBmaWxlc3lzdGVtcyB0aGlzIHV0aWxpdHkgd2lsbCBkbyB0aGUgam9iIGZvciB5b3UuCisKK2NvbmZpZyBGRUFUVVJFX01JTklYMgorCWJvb2wgIlN1cHBvcnQgTWluaXggZnMgdjIgKGZzY2tfbWluaXgvbWtmc19taW5peCkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGU0NLX01JTklYIHx8IE1LRlNfTUlOSVgKKwloZWxwCisJICBJZiB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uIDIgbWluaXggZmlsZXN5c3RlbXMsIGVuYWJsZQorCSAgdGhpcy4gSWYgeW91IGVuYWJsZWQgJ21rZnNfbWluaXgnIHRoZW4geW91IGFsbW9zdCBjZXJ0YWlubHkgd2FudCB0bworCSAgYmUgdXNpbmcgdGhlIHZlcnNpb24gMiBmaWxlc3lzdGVtIHN1cHBvcnQuCisKK2NvbmZpZyBNS0ZTX1JFSVNFUgorCWJvb2wgIm1rZnNfcmVpc2VyIgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gY3JlYXRlIFJlaXNlckZTIGZpbGVzeXN0ZW1zLgorCSAgTm90ZTogdGhpcyBhcHBsZXQgbmVlZHMgYSBsb3Qgb2YgdGVzdGluZyBhbmQgcG9saXNoaW5nLgorCitjb25maWcgTUtGU19WRkFUCisJYm9vbCAibWtmc192ZmF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gY3JlYXRlIEZBVDMyIGZpbGVzeXN0ZW1zLgorCitjb25maWcgR0VUT1BUCisJYm9vbCAiZ2V0b3B0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBnZXRvcHQgdXRpbGl0eSBpcyB1c2VkIHRvIGJyZWFrIHVwIChwYXJzZSkgb3B0aW9ucyBpbiBjb21tYW5kCisJICBsaW5lcyB0byBtYWtlIGl0IGVhc3kgdG8gd3JpdGUgY29tcGxleCBzaGVsbCBzY3JpcHRzIHRoYXQgYWxzbyBjaGVjaworCSAgZm9yIGxlZ2FsIChhbmQgaWxsZWdhbCkgb3B0aW9ucy4gSWYgeW91IHdhbnQgdG8gd3JpdGUgaG9ycmlibHkKKwkgIGNvbXBsZXggc2hlbGwgc2NyaXB0cywgb3IgdXNlIHNvbWUgaG9ycmlibHkgY29tcGxleCBzaGVsbCBzY3JpcHQKKwkgIHdyaXR0ZW4gYnkgb3RoZXJzLCB0aGlzIHV0aWxpdHkgbWF5IGJlIGZvciB5b3UuIE1vc3QgcGVvcGxlIHdpbGwKKwkgIHdpc2VseSBsZWF2ZSB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9HRVRPUFRfTE9ORworCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1sIgorCWRlZmF1bHQgeSBpZiBMT05HX09QVFMKKwlkZXBlbmRzIG9uIEdFVE9QVAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBsb25nIG9wdGlvbnMgKG9wdGlvbiAtbCkuCisKK2NvbmZpZyBIRVhEVU1QCisJYm9vbCAiaGV4ZHVtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgaGV4ZHVtcCB1dGlsaXR5IGlzIHVzZWQgdG8gZGlzcGxheSBiaW5hcnkgZGF0YSBpbiBhIHJlYWRhYmxlCisJICB3YXkgdGhhdCBpcyBjb21wYXJhYmxlIHRvIHRoZSBvdXRwdXQgZnJvbSBtb3N0IGhleCBlZGl0b3JzLgorCitjb25maWcgRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UKKwlib29sICJTdXBwb3J0IC1SLCByZXZlcnNlIG9mICdoZXhkdW1wIC1DdiciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRVhEVU1QCisJaGVscAorCSAgVGhlIGhleGR1bXAgdXRpbGl0eSBpcyB1c2VkIHRvIGRpc3BsYXkgYmluYXJ5IGRhdGEgaW4gYW4gYXNjaWkKKwkgIHJlYWRhYmxlIHdheS4gVGhpcyBvcHRpb24gY3JlYXRlcyBiaW5hcnkgZGF0YSBmcm9tIGFuIGFzY2lpIGlucHV0LgorCSAgTkI6IHRoaXMgb3B0aW9uIGlzIG5vbi1zdGFuZGFyZC4gSXQncyB1bndpc2UgdG8gdXNlIGl0IGluIHNjcmlwdHMKKwkgIGFpbWVkIHRvIGJlIHBvcnRhYmxlLgorCitjb25maWcgSEQKKwlib29sICJoZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhFWERVTVAKKwloZWxwCisJICBoZCBpcyBhbiBhbGlhcyB0byBoZXhkdW1wIC1DLgorCitjb25maWcgSFdDTE9DSworCWJvb2wgImh3Y2xvY2siCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIGh3Y2xvY2sgdXRpbGl0eSBpcyB1c2VkIHRvIHJlYWQgYW5kIHNldCB0aGUgaGFyZHdhcmUgY2xvY2sKKwkgIG9uIGEgc3lzdGVtLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHNldCB0aGUgY3VycmVudCB0aW1lIG9uCisJICBzaHV0ZG93biBpbiB0aGUgaGFyZHdhcmUgY2xvY2ssIHNvIHRoZSBoYXJkd2FyZSB3aWxsIGtlZXAgdGhlCisJICBjb3JyZWN0IHRpbWUgd2hlbiBMaW51eCBpcyBfbm90XyBydW5uaW5nLgorCitjb25maWcgRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUworCWJvb2wgIlN1cHBvcnQgbG9uZyBvcHRpb25zICgtLWhjdG9zeXMsLi4uKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhXQ0xPQ0sgJiYgTE9OR19PUFRTCisJaGVscAorCSAgQnkgZGVmYXVsdCwgdGhlIGh3Y2xvY2sgdXRpbGl0eSBvbmx5IHVzZXMgc2hvcnQgb3B0aW9ucy4gSWYgeW91CisJICBhcmUgb3Zlcmx5IGZvbmQgb2YgaXRzIGxvbmcgb3B0aW9ucywgc3VjaCBhcyAtLWhjdG9zeXMsIC0tdXRjLCBldGMpCisJICB0aGVuIGVuYWJsZSB0aGlzIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUworCWJvb2wgIlVzZSBGSFMgL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIgorCWRlZmF1bHQgbiAgIyB1dGlsLWxpbnV4LW5nIGluIEZlZG9yYSAxMyBzdGlsbCB1c2VzIC9ldGMvYWRqdGltZQorCWRlcGVuZHMgb24gSFdDTE9DSworCWhlbHAKKwkgIFN0YXJ0aW5nIHdpdGggRkhTIDIuMywgdGhlIGFkanRpbWUgc3RhdGUgZmlsZSBpcyBzdXBwb3NlZCB0byBleGlzdAorCSAgYXQgL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIGluc3RlYWQgb2YgL2V0Yy9hZGp0aW1lLiBJZiB5b3Ugd2lzaAorCSAgdG8gdXNlIHRoZSBGSFMgYmVoYXZpb3IsIGFuc3dlciBZIGhlcmUsIG90aGVyd2lzZSBhbnN3ZXIgTiBmb3IgdGhlCisJICBjbGFzc2ljIC9ldGMvYWRqdGltZSBwYXRoLgorCisJICBwYXRobmFtZS5jb20vZmhzL3B1Yi9maHMtMi4zLmh0bWwjVkFSTElCSFdDTE9DS1NUQVRFRElSRUNUT1JZRk9SSFdDTE8KKworY29uZmlnIElQQ1JNCisJYm9vbCAiaXBjcm0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGlwY3JtIHV0aWxpdHkgYWxsb3dzIHRoZSByZW1vdmFsIG9mIFN5c3RlbSBWIGludGVycHJvY2VzcworCSAgY29tbXVuaWNhdGlvbiAoSVBDKSBvYmplY3RzIGFuZCB0aGUgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMKKwkgIGZyb20gdGhlIHN5c3RlbS4KKworY29uZmlnIElQQ1MKKwlib29sICJpcGNzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBpcGNzIHV0aWxpdHkgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkKKwkgIGFsbG9jYXRlZCBTeXN0ZW0gViBpbnRlcnByb2Nlc3MgKElQQykgb2JqZWN0cyBpbiB0aGUgc3lzdGVtLgorCitjb25maWcgTE9TRVRVUAorCWJvb2wgImxvc2V0dXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbG9zZXR1cCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBvciBkZXRhY2ggYSBsb29wIGRldmljZSB3aXRoIGEgcmVndWxhcgorCSAgZmlsZSBvciBibG9jayBkZXZpY2UsIGFuZCB0byBxdWVyeSB0aGUgc3RhdHVzIG9mIGEgbG9vcCBkZXZpY2UuIFRoaXMKKwkgIHZlcnNpb24gZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgZW5hYmxpbmcgZGF0YSBlbmNyeXB0aW9uLgorCitjb25maWcgTFNQQ0kKKwlib29sICJsc3BjaSIKKwlkZWZhdWx0IHkKKwkjc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHNwY2kgaXMgYSB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGFib3V0IFBDSSBidXNlcyBpbiB0aGUKKwkgIHN5c3RlbSBhbmQgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlbS4KKworCSAgVGhpcyB2ZXJzaW9uIHVzZXMgc3lzZnMgKC9zeXMvYnVzL3BjaS9kZXZpY2VzKSBvbmx5LgorCitjb25maWcgTFNVU0IKKwlib29sICJsc3VzYiIKKwlkZWZhdWx0IHkKKwkjc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHN1c2IgaXMgYSB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGFib3V0IFVTQiBidXNlcyBpbiB0aGUKKwkgIHN5c3RlbSBhbmQgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlbS4KKworCSAgVGhpcyB2ZXJzaW9uIHVzZXMgc3lzZnMgKC9zeXMvYnVzL3VzYi9kZXZpY2VzKSBvbmx5LgorCitjb25maWcgTURFVgorCWJvb2wgIm1kZXYiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbWRldiBpcyBhIG1pbmktdWRldiBpbXBsZW1lbnRhdGlvbiBmb3IgZHluYW1pY2FsbHkgY3JlYXRpbmcgZGV2aWNlCisJICBub2RlcyBpbiB0aGUgL2RldiBkaXJlY3RvcnkuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGRvY3MvbWRldi50eHQKKworY29uZmlnIEZFQVRVUkVfTURFVl9DT05GCisJYm9vbCAiU3VwcG9ydCAvZXRjL21kZXYuY29uZiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1ERVYKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgdGhlIG1kZXYgY29uZmlnIGZpbGUgdG8gY29udHJvbCBvd25lcnNoaXAgYW5kCisJICBwZXJtaXNzaW9ucyBvZiB0aGUgZGV2aWNlIG5vZGVzLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBkb2NzL21kZXYudHh0CisKK2NvbmZpZyBGRUFUVVJFX01ERVZfUkVOQU1FCisJYm9vbCAiU3VwcG9ydCBzdWJkaXJzL3N5bWxpbmtzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9NREVWX0NPTkYKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgcmVuYW1pbmcgZGV2aWNlcyBhbmQgY3JlYXRpbmcgc3ltbGlua3MuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGRvY3MvbWRldi50eHQKKworY29uZmlnIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQCisJYm9vbCAiU3VwcG9ydCByZWd1bGFyIGV4cHJlc3Npb25zIHN1YnN0aXR1dGlvbnMgd2hlbiByZW5hbWluZyBkZXZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX01ERVZfUkVOQU1FCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3Vic3RpdHV0aW9ucyB3aGVuIHJlbmFtaW5nCisJICBkZXZpY2UuCisKK2NvbmZpZyBGRUFUVVJFX01ERVZfRVhFQworCWJvb2wgIlN1cHBvcnQgY29tbWFuZCBleGVjdXRpb24gYXQgZGV2aWNlIGFkZGl0aW9uL3JlbW92YWwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX01ERVZfQ09ORgorCWhlbHAKKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBhbiBvcHRpb25hbCBmaWVsZCB0byAvZXRjL21kZXYuY29uZiBmb3IKKwkgIGV4ZWN1dGluZyBjb21tYW5kcyB3aGVuIGRldmljZXMgYXJlIGNyZWF0ZWQvcmVtb3ZlZC4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgZG9jcy9tZGV2LnR4dAorCitjb25maWcgRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUKKwlib29sICJTdXBwb3J0IGxvYWRpbmcgb2YgZmlybXdhcmVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTURFVgorCWhlbHAKKwkgIFNvbWUgZGV2aWNlcyBuZWVkIHRvIGxvYWQgZmlybXdhcmUgYmVmb3JlIHRoZXkgY2FuIGJlIHVzYWJsZS4KKworCSAgVGhlc2UgZGV2aWNlcyB3aWxsIHJlcXVlc3QgdXNlcnNwYWNlIGxvb2sgdXAgdGhlIGZpbGVzIGluCisJICAvbGliL2Zpcm13YXJlLyBhbmQgaWYgaXQgZXhpc3RzLCBzZW5kIGl0IHRvIHRoZSBrZXJuZWwgZm9yCisJICBsb2FkaW5nIGludG8gdGhlIGhhcmR3YXJlLgorCitjb25maWcgTUtTV0FQCisJYm9vbCAibWtzd2FwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBta3N3YXAgdXRpbGl0eSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBhIGZpbGUgb3IgZGlzayBwYXJ0aXRpb24gYXMKKwkgIExpbnV4IHN3YXAgc3BhY2UuIFRoaXMgYWxsb3dzIExpbnV4IHRvIHVzZSB0aGUgZW50aXJlIGZpbGUgb3IKKwkgIHBhcnRpdGlvbiBhcyBpZiBpdCB3ZXJlIGFkZGl0aW9uYWwgUkFNLCB3aGljaCBjYW4gZ3JlYXRseSBpbmNyZWFzZQorCSAgdGhlIGNhcGFiaWxpdHkgb2YgbG93LW1lbW9yeSBtYWNoaW5lcy4gVGhpcyBhZGRpdGlvbmFsIG1lbW9yeSBpcworCSAgbXVjaCBzbG93ZXIgdGhhbiByZWFsIFJBTSwgYnV0IGNhbiBiZSB2ZXJ5IGhlbHBmdWwgYXQgcHJldmVudGluZyB5b3VyCisJICBhcHBsaWNhdGlvbnMgYmVpbmcga2lsbGVkIGJ5IHRoZSBMaW51eCBvdXQgb2YgbWVtb3J5IChPT00pIGtpbGxlci4KKwkgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBzd2FwIHNwYWNlIHVzaW5nICdta3N3YXAnIHlvdSBuZWVkIHRvIGVuYWJsZQorCSAgdGhlIHN3YXAgc3BhY2UgdXNpbmcgdGhlICdzd2Fwb24nIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX01LU1dBUF9VVUlECisJYm9vbCAiVVVJRCBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTUtTV0FQCisJaGVscAorCSAgR2VuZXJhdGUgc3dhcCBzcGFjZXMgd2l0aCB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMuCisKK2NvbmZpZyBNT1JFCisJYm9vbCAibW9yZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtb3JlIGlzIGEgc2ltcGxlIHV0aWxpdHkgd2hpY2ggYWxsb3dzIHlvdSB0byByZWFkIHRleHQgb25lIHNjcmVlbgorCSAgc2l6ZWQgcGFnZSBhdCBhIHRpbWUuIElmIHlvdSB3YW50IHRvIHJlYWQgdGV4dCB0aGF0IGlzIGxhcmdlciB0aGFuCisJICB0aGUgc2NyZWVuLCBhbmQgeW91IGFyZSB1c2luZyBhbnl0aGluZyBmYXN0ZXIgdGhhbiBhIDMwMCBiYXVkIG1vZGVtLAorCSAgeW91IHdpbGwgcHJvYmFibHkgZmluZCB0aGlzIHV0aWxpdHkgdmVyeSBoZWxwZnVsLiBJZiB5b3UgZG9uJ3QgaGF2ZQorCSAgYW55IG5lZWQgdG8gcmVhZGluZyB0ZXh0IGZpbGVzLCB5b3UgY2FuIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBNT1VOVAorCWJvb2wgIm1vdW50IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFsbCBmaWxlcyBhbmQgZmlsZXN5c3RlbXMgaW4gVW5peCBhcmUgYXJyYW5nZWQgaW50byBvbmUgYmlnIGRpcmVjdG9yeQorCSAgdHJlZS4gVGhlICdtb3VudCcgdXRpbGl0eSBpcyB1c2VkIHRvIGdyYWZ0IGEgZmlsZXN5c3RlbSBvbnRvIGEKKwkgIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgdHJlZS4gQSBmaWxlc3lzdGVtIGNhbiBlaXRoZXIgbGl2ZSBvbiBhIGJsb2NrCisJICBkZXZpY2UsIG9yIGl0IGNhbiBiZSBhY2Nlc3NpYmxlIG92ZXIgdGhlIG5ldHdvcmssIGFzIGlzIHRoZSBjYXNlIHdpdGgKKwkgIE5GUyBmaWxlc3lzdGVtcy4gTW9zdCBwZW9wbGUgdXNpbmcgQnVzeUJveCB3aWxsIGFsc28gd2FudCB0byBlbmFibGUKKwkgIHRoZSAnbW91bnQnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0ZBS0UKKwlib29sICJTdXBwb3J0IG9wdGlvbiAtZiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PVU5UCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGZha2luZyBhIGZpbGUgc3lzdGVtIG1vdW50LgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9WRVJCT1NFCisJYm9vbCAiU3VwcG9ydCBvcHRpb24gLXYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCWhlbHAKKwkgIEVuYWJsZSBtdWx0aS1sZXZlbCAtdlt2di4uLl0gdmVyYm9zZSBtZXNzYWdlcy4gVXNlZnVsIGlmIHlvdQorCSAgZGVidWcgbW91bnQgcHJvYmxlbXMgYW5kIHdhbnQgdG8gc2VlIHdoYXQgaXMgZXhhY3RseSBwYXNzZWQKKwkgIHRvIHRoZSBrZXJuZWwuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0hFTFBFUlMKKwlib29sICJTdXBwb3J0IG1vdW50IGhlbHBlcnMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBNT1VOVAorCWhlbHAKKwkgIEVuYWJsZSBtb3VudGluZyBvZiB2aXJ0dWFsIGZpbGUgc3lzdGVtcyB2aWEgZXh0ZXJuYWwgaGVscGVycy4KKwkgIEUuZy4gIm1vdW50IG9iZXhmcyMtYjAwLjExLjIyLjMzLjQ0LjU1IC9tbnQiIHdpbGwgaW4gZWZmZWN0IGNhbGwKKwkgICJvYmV4ZnMgLWIwMC4xMS4yMi4zMy40NC41NSAvbW50IgorCSAgQWxzbyAibW91bnQgLXQgc29tZXR5cGUgWy1vIG9wdHNdIGZzIC9tbnQiIHdpbGwgdHJ5CisJICAic29tZXR5cGUgWy1vIG9wdHNdIGZzIC9tbnQiIGlmIHNpbXBsZSBtb3VudCBzeXNjYWxsIGZhaWxzLgorCSAgVGhlIGlkZWEgaXMgdG8gdXNlIHN1Y2ggdmlydHVhbCBmaWxlc3lzdGVtcyBpbiAvZXRjL2ZzdGFiLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9MQUJFTAorCWJvb2wgIlN1cHBvcnQgc3BlY2lmeWluZyBkZXZpY2VzIGJ5IGxhYmVsIG9yIFVVSUQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIGZvciBzcGVjaWZ5aW5nIGEgZGV2aWNlIGJ5IGxhYmVsIG9yIHV1aWQsIHJhdGhlciB0aGFuIGJ5CisJICBuYW1lLiBUaGlzIGZlYXR1cmUgdXRpbGl6ZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBibGtpZC9maW5kZnMuCisJICBUaGlzIGFsc28gZW5hYmxlcyBsYWJlbCBvciB1dWlkIHN1cHBvcnQgZm9yIHN3YXBvbi4KKworY29uZmlnIEZFQVRVUkVfTU9VTlRfTkZTCisJYm9vbCAiU3VwcG9ydCBtb3VudGluZyBORlMgZmlsZSBzeXN0ZW1zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9VTlQKKwlzZWxlY3QgRkVBVFVSRV9IQVZFX1JQQworCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIEVuYWJsZSBtb3VudGluZyBvZiBORlMgZmlsZSBzeXN0ZW1zLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9DSUZTCisJYm9vbCAiU3VwcG9ydCBtb3VudGluZyBDSUZTL1NNQiBmaWxlIHN5c3RlbXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBzYW1iYSBtb3VudHMuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0ZMQUdTCisJZGVwZW5kcyBvbiBNT1VOVAorCWJvb2wgIlN1cHBvcnQgbG90cyBvZiAtbyBmbGFncyBpbiBtb3VudCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaXRob3V0IHRoaXMsIG1vdW50IG9ubHkgc3VwcG9ydHMgcm8vcncvcmVtb3VudC4gV2l0aCB0aGlzLCBpdAorCSAgc3VwcG9ydHMgbm9zdWlkLCBzdWlkLCBkZXYsIG5vZGV2LCBleGVjLCBub2V4ZWMsIHN5bmMsIGFzeW5jLCBhdGltZSwKKwkgIG5vYXRpbWUsIGRpcmF0aW1lLCBub2RpcmF0aW1lLCBsb3VkLCBiaW5kLCBtb3ZlLCBzaGFyZWQsIHNsYXZlLAorCSAgcHJpdmF0ZSwgdW5iaW5kYWJsZSwgcnNoYXJlZCwgcnNsYXZlLCBycHJpdmF0ZSwgYW5kIHJ1bmJpbmRhYmxlLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9GU1RBQgorCWRlcGVuZHMgb24gTU9VTlQKKwlib29sICJTdXBwb3J0IC9ldGMvZnN0YWIgYW5kIC1hIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgbW91bnQgYWxsIGFuZCBsb29raW5nIGZvciBmaWxlcyBpbiAvZXRjL2ZzdGFiLgorCitjb25maWcgUElWT1RfUk9PVAorCWJvb2wgInBpdm90X3Jvb3QiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIHBpdm90X3Jvb3QgdXRpbGl0eSBzd2FwcyB0aGUgbW91bnQgcG9pbnRzIGZvciB0aGUgcm9vdCBmaWxlc3lzdGVtCisJICB3aXRoIHNvbWUgb3RoZXIgbW91bnRlZCBmaWxlc3lzdGVtLiBUaGlzIGFsbG93cyB5b3UgdG8gZG8gYWxsIHNvcnRzCisJICBvZiB3aWxkIGFuZCBjcmF6eSB0aGluZ3Mgd2l0aCB5b3VyIExpbnV4IHN5c3RlbSBhbmQgaXMgZmFyIG1vcmUKKwkgIHBvd2VyZnVsIHRoYW4gJ2Nocm9vdCcuCisKKwkgIE5vdGU6IFRoaXMgaXMgZm9yIGluaXRyZCBpbiBsaW51eCAyLjQuIFVuZGVyIGluaXRyYW1mcyAoaW50cm9kdWNlZAorCSAgaW4gbGludXggMi42KSB1c2Ugc3dpdGNoX3Jvb3QgaW5zdGVhZC4KKworY29uZmlnIFJEQVRFCisJYm9vbCAicmRhdGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHJkYXRlIHV0aWxpdHkgYWxsb3dzIHlvdSB0byBzeW5jaHJvbml6ZSB0aGUgZGF0ZSBhbmQgdGltZSBvZiB5b3VyCisJICBzeXN0ZW0gY2xvY2sgd2l0aCB0aGUgZGF0ZSBhbmQgdGltZSBvZiBhIHJlbW90ZSBuZXR3b3JrZWQgc3lzdGVtIHVzaW5nCisJICB0aGUgUkZDODY4IHByb3RvY29sLCB3aGljaCBpcyBidWlsdCBpbnRvIHRoZSBpbmV0ZCBkYWVtb24gb24gbW9zdAorCSAgc3lzdGVtcy4KKworY29uZmlnIFJERVYKKwlib29sICJyZGV2IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByaW50IHRoZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGVzeXN0ZW0gbW91bnRlZCBhdCAnLycuCisKK2NvbmZpZyBSRUFEUFJPRklMRQorCWJvb2wgInJlYWRwcm9maWxlIgorCWRlZmF1bHQgeQorCSNzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIGFsbG93cyB5b3UgdG8gcGFyc2UgL3Byb2MvcHJvZmlsZSBmb3IgYmFzaWMgcHJvZmlsaW5nLgorCitjb25maWcgUlRDV0FLRQorCWJvb2wgInJ0Y3dha2UiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgRW50ZXIgYSBzeXN0ZW0gc2xlZXAgc3RhdGUgdW50aWwgc3BlY2lmaWVkIHdha2V1cCB0aW1lLgorCitjb25maWcgU0NSSVBUCisJYm9vbCAic2NyaXB0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBzY3JpcHQgbWFrZXMgdHlwZXNjcmlwdCBvZiB0ZXJtaW5hbCBzZXNzaW9uLgorCitjb25maWcgU0NSSVBUUkVQTEFZCisJYm9vbCAic2NyaXB0cmVwbGF5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZXBsYXlzIGEgdHlwZXNjcmlwdCwgdXNpbmcgdGltaW5nIGluZm9ybWF0aW9uCisJICBnaXZlbiBieSBzY3JpcHQgLXQuCisKK2NvbmZpZyBTRVRBUkNICisJYm9vbCAic2V0YXJjaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgbGludXgzMiB1dGlsaXR5IGlzIHVzZWQgdG8gY3JlYXRlIGEgMzJiaXQgZW52aXJvbm1lbnQgZm9yIHRoZQorCSAgc3BlY2lmaWVkIHByb2dyYW0gKHVzdWFsbHkgYSBzaGVsbCkuIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gaGF2ZQorCSAgdGhpcyB1dGlsIG9uIGEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgYm90aCA2NGJpdCBhbmQgMzJiaXQgdXNlcmxhbmQKKwkgIChsaWtlIGFtZDY0L3g4NiwgcHBjNjQvcHBjLCBzcGFyYzY0L3NwYXJjLCBldGMuLi4pLgorCitjb25maWcgU1dBUE9OT0ZGCisJYm9vbCAic3dhcG9ub2ZmIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYm90aCB0aGUgJ3N3YXBvbicgYW5kIHRoZSAnc3dhcG9mZicgdXRpbGl0aWVzLgorCSAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIHNvbWUgc3dhcCBzcGFjZSB1c2luZyAnbWtzd2FwJywgeW91IGFsc28gbmVlZAorCSAgdG8gZW5hYmxlIHlvdXIgc3dhcCBzcGFjZSB3aXRoIHRoZSAnc3dhcG9uJyB1dGlsaXR5LiBUaGUgJ3N3YXBvZmYnCisJICB1dGlsaXR5IGlzIHVzZWQsIHR5cGljYWxseSBhdCBzeXN0ZW0gc2h1dGRvd24sIHRvIGRpc2FibGUgYW55IHN3YXAKKwkgIHNwYWNlLiBJZiB5b3UgYXJlIG5vdCB1c2luZyBhbnkgc3dhcCBzcGFjZSwgeW91IGNhbiBsZWF2ZSB0aGlzCisJICBvcHRpb24gZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX1NXQVBPTl9QUkkKKwlib29sICJTdXBwb3J0IHByaW9yaXR5IG9wdGlvbiAtcCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNXQVBPTk9GRgorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBzZXR0aW5nIHN3YXAgZGV2aWNlIHByaW9yaXR5IGluIHN3YXBvbi4KKworY29uZmlnIFNXSVRDSF9ST09UCisJYm9vbCAic3dpdGNoX3Jvb3QiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIHN3aXRjaF9yb290IHV0aWxpdHkgaXMgdXNlZCBmcm9tIGluaXRyYW1mcyB0byBzZWxlY3QgYSBuZXcKKwkgIHJvb3QgZGV2aWNlLiBVbmRlciBpbml0cmFtZnMsIHlvdSBoYXZlIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YKKwkgIHBpdm90X3Jvb3QuIChTdG9wIHJlYWRpbmcgaGVyZSBpZiB5b3UgZG9uJ3QgY2FyZSB3aHkuKQorCisJICBCb290aW5nIHdpdGggaW5pdHJhbWZzIGV4dHJhY3RzIGEgZ3ppcHBlZCBjcGlvIGFyY2hpdmUgaW50byByb290ZnMKKwkgICh3aGljaCBpcyBhIHZhcmlhbnQgb2YgcmFtZnMvdG1wZnMpLiBCZWNhdXNlIHJvb3RmcyBjYW4ndCBiZSBtb3ZlZAorCSAgb3IgdW5tb3VudGVkKiwgcGl2b3Rfcm9vdCB3aWxsIG5vdCB3b3JrIGZyb20gaW5pdHJhbWZzLiBJbnN0ZWFkLAorCSAgc3dpdGNoX3Jvb3QgZGVsZXRlcyBldmVyeXRoaW5nIG91dCBvZiByb290ZnMgKGluY2x1ZGluZyBpdHNlbGYpLAorCSAgZG9lcyBhIG1vdW50IC0tbW92ZSB0aGF0IG92ZXJtb3VudHMgcm9vdGZzIHdpdGggdGhlIG5ldyByb290LCBhbmQKKwkgIHRoZW4gZXhlY3MgdGhlIHNwZWNpZmllZCBpbml0IHByb2dyYW0uCisKKwkgICogQmVjYXVzZSB0aGUgTGludXgga2VybmVsIHVzZXMgcm9vdGZzIGludGVybmFsbHkgYXMgdGhlIHN0YXJ0aW5nCisJICBhbmQgZW5kaW5nIHBvaW50IGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0aGUga2VybmVsJ3MgZG91Ymx5IGxpbmtlZAorCSAgbGlzdCBvZiBhY3RpdmUgbW91bnQgcG9pbnRzLiBUaGF0J3Mgd2h5LgorCitjb25maWcgVU1PVU5UCisJYm9vbCAidW1vdW50IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFdoZW4geW91IHdhbnQgdG8gcmVtb3ZlIGEgbW91bnRlZCBmaWxlc3lzdGVtIGZyb20gaXRzIGN1cnJlbnQgbW91bnQKKwkgIHBvaW50LCBmb3IgZXhhbXBsZSB3aGVuIHlvdSBhcmUgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLCB0aGUKKwkgICd1bW91bnQnIHV0aWxpdHkgaXMgdGhlIHRvb2wgdG8gdXNlLiBJZiB5b3UgZW5hYmxlZCB0aGUgJ21vdW50JworCSAgdXRpbGl0eSwgeW91IGFsbW9zdCBjZXJ0YWlubHkgYWxzbyB3YW50IHRvIGVuYWJsZSAndW1vdW50Jy4KKworY29uZmlnIEZFQVRVUkVfVU1PVU5UX0FMTAorCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1hIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVU1PVU5UCisJaGVscAorCSAgU3VwcG9ydCAtYSBvcHRpb24gdG8gdW5tb3VudCBhbGwgY3VycmVudGx5IG1vdW50ZWQgZmlsZXN5c3RlbXMuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIGZvciBtb3VudC91bW91bnQiCisJZGVwZW5kcyBvbiBNT1VOVCB8fCBVTU9VTlQKKworY29uZmlnIEZFQVRVUkVfTU9VTlRfTE9PUAorCWJvb2wgIlN1cHBvcnQgbG9vcGJhY2sgbW91bnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9VTlQgfHwgVU1PVU5UCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBmZWF0dXJlIGFsbG93cyBhdXRvbWF0aWMgbW91bnRpbmcgb2YgZmlsZXMgKGNvbnRhaW5pbmcKKwkgIGZpbGVzeXN0ZW0gaW1hZ2VzKSB2aWEgdGhlIGxpbnV4IGtlcm5lbCdzIGxvb3BiYWNrIGRldmljZXMuCisJICBUaGUgbW91bnQgY29tbWFuZCB3aWxsIGRldGVjdCB5b3UgYXJlIHRyeWluZyB0byBtb3VudCBhIGZpbGUgaW5zdGVhZAorCSAgb2YgYSBibG9jayBkZXZpY2UsIGFuZCB0cmFuc3BhcmVudGx5IGFzc29jaWF0ZSB0aGUgZmlsZSB3aXRoIGEKKwkgIGxvb3BiYWNrIGRldmljZS4gVGhlIHVtb3VudCBjb21tYW5kIHdpbGwgYWxzbyBmcmVlIHRoYXQgbG9vcGJhY2sKKwkgIGRldmljZS4KKworCSAgWW91IGNhbiBzdGlsbCB1c2UgdGhlICdsb3NldHVwJyB1dGlsaXR5ICh0byBtYW51YWxseSBhc3NvY2lhdGUgZmlsZXMKKwkgIHdpdGggbG9vcCBkZXZpY2VzKSBpZiB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgYWR2YW5jZWQsIHN1Y2ggYXMKKwkgIHNwZWNpZnkgYW4gb2Zmc2V0IG9yIGNyeXB0b2dyYXBoaWMgb3B0aW9ucyB0byB0aGUgbG9vcGJhY2sgZGV2aWNlLgorCSAgKElmIHlvdSBkb24ndCB3YW50IHVtb3VudCB0byBmcmVlIHRoZSBsb29wIGRldmljZSwgdXNlICJ1bW91bnQgLUQiLikKKworY29uZmlnIEZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUKKwlib29sICJDcmVhdGUgbmV3IGxvb3BiYWNrIGRldmljZXMgaWYgbmVlZGVkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9NT1VOVF9MT09QCisJaGVscAorCSAgTGludXgga2VybmVscyA+PSAyLjYuMjQgc3VwcG9ydCB1bmxpbWl0ZWQgbG9vcGJhY2sgZGV2aWNlcy4gVGhleSBhcmUKKwkgIGFsbG9jYXRlZCBmb3IgdXNlIHdoZW4gdHJ5aW5nIHRvIHVzZSBhIGxvb3AgZGV2aWNlLiBUaGUgbG9vcCBkZXZpY2UKKwkgIG11c3QgaG93ZXZlciBleGlzdC4KKworCSAgVGhpcyBmZWF0dXJlIGxldHMgbW91bnQgdG8gdHJ5IHRvIGNyZWF0ZSBuZXh0IC9kZXYvbG9vcE4gZGV2aWNlCisJICBpZiBpdCBkb2VzIG5vdCBmaW5kIGEgZnJlZSBvbmUuCisKK2NvbmZpZyBGRUFUVVJFX01UQUJfU1VQUE9SVAorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBvbGQgL2V0Yy9tdGFiIGZpbGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBNT1VOVCB8fCBVTU9VTlQKKwlzZWxlY3QgRkVBVFVSRV9NT1VOVF9GQUtFCisJaGVscAorCSAgSGlzdG9yaWNhbGx5LCBVbml4IHN5c3RlbXMga2VwdCB0cmFjayBvZiB0aGUgY3VycmVudGx5IG1vdW50ZWQKKwkgIHBhcnRpdGlvbnMgaW4gdGhlIGZpbGUgIi9ldGMvbXRhYiIuIFRoZXNlIGRheXMsIHRoZSBrZXJuZWwgZXhwb3J0cworCSAgdGhlIGxpc3Qgb2YgY3VycmVudGx5IG1vdW50ZWQgcGFydGl0aW9ucyBpbiAiL3Byb2MvbW91bnRzIiwgcmVuZGVyaW5nCisJICB0aGUgb2xkIG10YWIgZmlsZSBvYnNvbGV0ZS4gKEluIG1vZGVybiBzeXN0ZW1zLCAvZXRjL210YWIgc2hvdWxkIGJlCisJICBhIHN5bWxpbmsgdG8gL3Byb2MvbW91bnRzLikKKworCSAgVGhlIG9ubHkgcmVhc29uIHRvIGhhdmUgbW91bnQgbWFpbnRhaW4gYW4gL2V0Yy9tdGFiIGZpbGUgaXRzZWxmIGlzIGlmCisJICB5b3VyIHN0cmlwcGVkLWRvd24gZW1iZWRkZWQgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSAvcHJvYyBkaXJlY3RvcnkuCisJICBJZiB5b3UgbXVzdCB1c2UgdGhpcywga2VlcCBpbiBtaW5kIGl0J3MgaW5oZXJlbnRseSBicml0dGxlIChmb3IKKwkgIGV4YW1wbGUgYSBtb3VudCB1bmRlciBjaHJvb3Qgd29uJ3QgdXBkYXRlIGl0KSwgY2FuJ3QgaGFuZGxlIG1vZGVybgorCSAgZmVhdHVyZXMgbGlrZSBzZXBhcmF0ZSBwZXItcHJvY2VzcyBmaWxlc3lzdGVtIG5hbWVzcGFjZXMsIHJlcXVpcmVzCisJICB0aGF0IHlvdXIgL2V0YyBkaXJlY3RvcnkgYmUgd3JpdGFibGUsIHRlbmRzIHRvIGdldCBlYXNpbHkgY29uZnVzZWQKKwkgIGJ5IC0tYmluZCBvciAtLW1vdmUgbW91bnRzLCB3b24ndCB1cGRhdGUgaWYgeW91IHJlbmFtZSBhIGRpcmVjdG9yeQorCSAgdGhhdCBjb250YWlucyBhIG1vdW50IHBvaW50LCBhbmQgc28gb24uIChJbiBicmllZjogYXZvaWQuKQorCisJICBBYm91dCB0aGUgb25seSByZWFzb24gdG8gdXNlIHRoaXMgaXMgaWYgeW91J3ZlIHJlbW92ZWQgL3Byb2MgZnJvbQorCSAgeW91ciBrZXJuZWwuCisKK2NvbmZpZyBWT0xVTUVJRAorCWJvb2wgI05vIGRlc2NyaXB0aW9uIG1ha2VzIGl0IGEgaGlkZGVuIG9wdGlvbgorCWRlZmF1bHQgbgorCittZW51ICJGaWxlc3lzdGVtL1ZvbHVtZSBpZGVudGlmaWNhdGlvbiIKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0VYVAorCWJvb2wgIkV4dCBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0JUUkZTCisJYm9vbCAiYnRyZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUworCWJvb2wgIlJlaXNlciBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0ZBVAorCWJvb2wgImZhdCBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0hGUworCWJvb2wgImhmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0pGUworCWJvb2wgImpmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9VRlMKKyMjIwlib29sICJ1ZnMgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9YRlMKKwlib29sICJ4ZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9OVEZTCisJYm9vbCAibnRmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjAKKwlib29sICJpc285NjYwIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfVURGCisJYm9vbCAidWRmIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTFVLUworCWJvb2wgImx1a3MgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAKKwlib29sICJsaW51eCBzd2FwIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xWTQorIyMjCWJvb2wgImx2bSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMKKwlib29sICJjcmFtZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSFBGUworIyMjCWJvb2wgImhwZnMgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9ST01GUworCWJvb2wgInJvbWZzIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfU1lTVgorCWJvb2wgInN5c3YgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTUlOSVgKKyMjIwlib29sICJtaW5peCBmaWxlc3lzdGVtIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBUaGVzZSBvbmx5IGRldGVjdCBwYXJ0aXRpb24gdGFibGVzIC0gbm90IHVzZWQgKHlldD8pCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTUFDCisjIyMJYm9vbCAibWFjIGZpbGVzeXN0ZW0iCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKyMjIworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX01TRE9TCisjIyMJYm9vbCAibXNkb3MgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMgorCWJvb2wgIm9jZnMyIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0hJR0hQT0lOVFJBSUQKKyMjIwlib29sICJoaWdocG9pbnQgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSVNXUkFJRAorIyMjCWJvb2wgImludGVsIHJhaWQiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xTSVJBSUQKKyMjIwlib29sICJsc2kgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfVklBUkFJRAorIyMjCWJvb2wgInZpYSByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9TSUxJQ09OUkFJRAorIyMjCWJvb2wgInNpbGljb24gcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRAorIyMjCWJvb2wgIm52aWRpYSByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9QUk9NSVNFUkFJRAorIyMjCWJvb2wgInByb21pc2UgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQKKwlib29sICJsaW51eHJhaWQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworZW5kbWVudQorCitlbmRtZW51CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L0NvbmZpZy5zcmMgYi91dGlsLWxpbnV4L0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0NTcwNQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDk3NSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiTGludXggU3lzdGVtIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBBQ1BJRAorCWJvb2wgImFjcGlkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGFjcGlkIGxpc3RlbnMgdG8gQUNQSSBldmVudHMgY29taW5nIGVpdGhlciBpbiB0ZXh0dWFsIGZvcm0gZnJvbQorCSAgL3Byb2MvYWNwaS9ldmVudCAodGhvdWdoIGl0IGlzIG1hcmtlZCBkZXByZWNhdGVkIGl0IGlzIHN0aWxsIHdpZGVseQorCSAgdXNlZCBhbmQgX2lzXyBhIHN0YW5kYXJkKSBvciBpbiBiaW5hcnkgZm9ybSBmcm9tIHNwZWNpZmllZCBldmRldnMKKwkgIChqdXN0IHVzZSAvZGV2L2lucHV0L2V2ZW50KikuCisKKwkgIEl0IHBhcnNlcyB0aGUgZXZlbnQgdG8gcmV0cmlldmUgQUNUSU9OIGFuZCBhIHBvc3NpYmxlIFBBUkFNRVRFUi4KKwkgIEl0IHRoZW4gc3Bhd25zIC9ldGMvYWNwaS88QUNUSU9OPlsvPFBBUkFNRVRFUj5dIGVpdGhlciB2aWEgcnVuLXBhcnRzCisJICAoaWYgdGhlIHJlc3VsdGluZyBwYXRoIGlzIGEgZGlyZWN0b3J5KSBvciBkaXJlY3RseSBhcyBhbiBleGVjdXRhYmxlLgorCisJICBOLkIuIGFjcGlkIHJlbGllcyBvbiBydW4tcGFydHMgc28gaGF2ZSB0aGUgbGF0dGVyIGluc3RhbGxlZC4KKworY29uZmlnIEZFQVRVUkVfQUNQSURfQ09NUEFUCisJYm9vbCAiQWNjZXB0IGFuZCBpZ25vcmUgcmVkdW5kYW50IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBQ1BJRAorCWhlbHAKKwkgIEFjY2VwdCBhbmQgaWdub3JlIGNvbXBhdGliaWxpdHkgb3B0aW9ucyAtZyAtbSAtcyAtUyAtdi4KKworY29uZmlnIEJMS0lECisJYm9vbCAiYmxraWQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IFZPTFVNRUlECisJaGVscAorCSAgTGlzdHMgbGFiZWxzIGFuZCBVVUlEcyBvZiBhbGwgZmlsZXN5c3RlbXMuCisJICBXQVJOSU5HOgorCSAgV2l0aCBhbGwgc3VibW9kdWxlcyBzZWxlY3RlZCwgaXQgd2lsbCBhZGQgfjhrIHRvIGJ1c3lib3guCisKK2NvbmZpZyBGRUFUVVJFX0JMS0lEX1RZUEUKKwlib29sICJQcmludCBmaWxlc3lzdGVtIHR5cGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBCTEtJRAorCWhlbHAKKwkgIFNob3cgVFlQRT0iZmlsZXN5c3RlbSB0eXBlIgorCitjb25maWcgRE1FU0cKKwlib29sICJkbWVzZyIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBkbWVzZyBpcyB1c2VkIHRvIGV4YW1pbmUgb3IgY29udHJvbCB0aGUga2VybmVsIHJpbmcgYnVmZmVyLiBXaGVuIHRoZQorCSAgTGludXgga2VybmVsIHByaW50cyBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZywgdGhleSBhcmUgc3RvcmVkIGluCisJICB0aGUga2VybmVsIHJpbmcgYnVmZmVyLiBZb3UgY2FuIHVzZSBkbWVzZyB0byBwcmludCB0aGUga2VybmVsJ3MgcmluZworCSAgYnVmZmVyLCBjbGVhciB0aGUga2VybmVsIHJpbmcgYnVmZmVyLCBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGtlcm5lbAorCSAgcmluZyBidWZmZXIsIGFuZCBjaGFuZ2UgdGhlIHByaW9yaXR5IGxldmVsIGF0IHdoaWNoIGtlcm5lbCBtZXNzYWdlcworCSAgYXJlIGFsc28gbG9nZ2VkIHRvIHRoZSBzeXN0ZW0gY29uc29sZS4gRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdQorCSAgd2lzaCB0byBlbmFibGUgdGhlICdkbWVzZycgdXRpbGl0eS4KKworY29uZmlnIEZFQVRVUkVfRE1FU0dfUFJFVFRZCisJYm9vbCAiUHJldHR5IGRtZXNnIG91dHB1dCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERNRVNHCisJaGVscAorCSAgSWYgeW91IHdpc2ggdG8gc2NydWIgdGhlIHN5c2xvZyBsZXZlbCBmcm9tIHRoZSBvdXRwdXQsIHNheSAnWScgaGVyZS4KKwkgIFRoZSBzeXNsb2cgbGV2ZWwgaXMgYSBzdHJpbmcgcHJlZml4ZWQgdG8gZXZlcnkgbGluZSB3aXRoIHRoZSBmb3JtCisJICAiPCM+Ii4KKworCSAgV2l0aCB0aGlzIG9wdGlvbiB5b3Ugd2lsbCBzZWU6CisJICAgICMgZG1lc2cKKwkgICAgTGludXggdmVyc2lvbiAyLjYuMTcuNCAuLi4uLgorCSAgICBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6CisJICAgICBCSU9TLWU4MjA6IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDlmMDAwICh1c2FibGUpCisKKwkgIFdpdGhvdXQgdGhpcyBvcHRpb24geW91IHdpbGwgc2VlOgorCSAgICAjIGRtZXNnCisJICAgIDw1PkxpbnV4IHZlcnNpb24gMi42LjE3LjQgLi4uLi4KKwkgICAgPDY+QklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgorCSAgICA8Nj4gQklPUy1lODIwOiAwMDAwMDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDA5ZjAwMCAodXNhYmxlKQorCitjb25maWcgRkJTRVQKKwlib29sICJmYnNldCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBmYnNldCBpcyB1c2VkIHRvIHNob3cgb3IgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiBhIExpbnV4IGZyYW1lIGJ1ZmZlcgorCSAgZGV2aWNlLiBUaGUgZnJhbWUgYnVmZmVyIGRldmljZSBwcm92aWRlcyBhIHNpbXBsZSBhbmQgdW5pcXVlCisJICBpbnRlcmZhY2UgdG8gYWNjZXNzIGEgZ3JhcGhpY3MgZGlzcGxheS4gRW5hYmxlIHRoaXMgb3B0aW9uCisJICBpZiB5b3Ugd2lzaCB0byBlbmFibGUgdGhlICdmYnNldCcgdXRpbGl0eS4KKworY29uZmlnIEZFQVRVUkVfRkJTRVRfRkFOQ1kKKwlib29sICJUdXJuIG9uIGV4dHJhIGZic2V0IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGQlNFVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZXh0ZW5kZWQgZmJzZXQgb3B0aW9ucywgYWxsb3dpbmcgb25lIHRvIHNldCB0aGUKKwkgIGZyYW1lYnVmZmVyIHNpemUsIGNvbG9yIGRlcHRoLCBldGMuIGludGVyZmFjZSB0byBhY2Nlc3MgYSBncmFwaGljcworCSAgZGlzcGxheS4gRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIGVuYWJsZSBleHRlbmRlZCBmYnNldAorCSAgb3B0aW9ucy4KKworY29uZmlnIEZFQVRVUkVfRkJTRVRfUkVBRE1PREUKKwlib29sICJUdXJuIG9uIGZic2V0IHJlYWRtb2RlIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGQlNFVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyBmYnNldCB0byByZWFkIHRoZSB2aWRlbyBtb2RlIGRhdGFiYXNlIHN0b3JlZCBieQorCSAgZGVmYXVsdCBhcyAvZXRjL2ZiLm1vZGVzLCB3aGljaCBjYW4gYmUgdXNlZCB0byBzZXQgZnJhbWUgYnVmZmVyCisJICBkZXZpY2UgdG8gcHJlLWRlZmluZWQgdmlkZW8gbW9kZXMuCisKK2NvbmZpZyBGREZMVVNICisJYm9vbCAiZmRmbHVzaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBmZGZsdXNoIGlzIG9ubHkgbmVlZGVkIHdoZW4gY2hhbmdpbmcgbWVkaWEgb24gc2xpZ2h0bHktYnJva2VuCisJICByZW1vdmFibGUgbWVkaWEgZHJpdmVzLiBJdCBpcyB1c2VkIHRvIG1ha2UgTGludXggYmVsaWV2ZSB0aGF0IGEKKwkgIGhhcmR3YXJlIGRpc2stY2hhbmdlIHN3aXRjaCBoYXMgYmVlbiBhY3R1YXRlZCwgd2hpY2ggY2F1c2VzIExpbnV4IHRvCisJICBmb3JnZXQgYW55dGhpbmcgaXQgaGFzIGNhY2hlZCBmcm9tIHRoZSBwcmV2aW91cyBtZWRpYS4gSWYgeW91IGhhdmUKKwkgIHN1Y2ggYSBzbGlnaHRseS1icm9rZW4gZHJpdmUsIHlvdSB3aWxsIG5lZWQgdG8gcnVuIGZkZmx1c2ggZXZlcnkgdGltZQorCSAgeW91IGNoYW5nZSBhIGRpc2suIE1vc3QgcGVvcGxlIGhhdmUgd29ya2luZyBoYXJkd2FyZSBhbmQgY2FuIHNhZmVseQorCSAgbGVhdmUgdGhpcyBkaXNhYmxlZC4KKworY29uZmlnIEZERk9STUFUCisJYm9vbCAiZmRmb3JtYXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmRmb3JtYXQgaXMgdXNlZCB0byBsb3ctbGV2ZWwgZm9ybWF0IGEgZmxvcHB5IGRpc2suCisKK2NvbmZpZyBGRElTSworCWJvb2wgImZkaXNrIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBmZGlzayB1dGlsaXR5IGlzIHVzZWQgdG8gZGl2aWRlIGhhcmQgZGlza3MgaW50byBvbmUgb3IgbW9yZQorCSAgbG9naWNhbCBkaXNrcywgd2hpY2ggYXJlIGdlbmVyYWxseSBjYWxsZWQgcGFydGl0aW9ucy4gVGhpcyB1dGlsaXR5CisJICBjYW4gYmUgdXNlZCB0byBsaXN0IGFuZCBlZGl0IHRoZSBzZXQgb2YgcGFydGl0aW9ucyBvciBCU0Qgc3R5bGUKKwkgICdkaXNrIHNsaWNlcycgdGhhdCBhcmUgZGVmaW5lZCBvbiBhIGhhcmQgZHJpdmUuCisKK2NvbmZpZyBGRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTCisJYm9vbCAiU3VwcG9ydCBvdmVyIDRHQiBkaXNrcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZESVNLCisJZGVwZW5kcyBvbiAhTEZTICAgIyB3aXRoIExGUyBubyBzcGVjaWFsIGNvZGUgaXMgbmVlZGVkCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIHN1cHBvcnQgbGFyZ2UgZGlza3MgPiA0R0IuCisKK2NvbmZpZyBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJYm9vbCAiV3JpdGUgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZESVNLCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIGEgcGFydGl0aW9uIHRhYmxlCisJICBhbmQgd3JpdGUgdGhvc2UgY2hhbmdlcyBvdXQgdG8gZGlzay4gSWYgeW91IGxlYXZlIHRoaXMgb3B0aW9uCisJICBkaXNhYmxlZCwgeW91IHdpbGwgb25seSBiZSBhYmxlIHRvIHZpZXcgdGhlIHBhcnRpdGlvbiB0YWJsZS4KKworY29uZmlnIEZFQVRVUkVfQUlYX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBBSVggZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBvciBjaGFuZ2UgQUlYIGRpc2tsYWJlbHMuCisJICBNb3N0IHBlb3BsZSBjYW4gc2FmZWx5IGxlYXZlIHRoaXMgb3B0aW9uIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9TR0lfTEFCRUwKKwlib29sICJTdXBwb3J0IFNHSSBkaXNrbGFiZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkRJU0sgJiYgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBTR0kgZGlza2xhYmVscy4KKwkgIE1vc3QgcGVvcGxlIGNhbiBzYWZlbHkgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX1NVTl9MQUJFTAorCWJvb2wgIlN1cHBvcnQgU1VOIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIFNVTiBkaXNrbGFiZWxzLgorCSAgTW9zdCBwZW9wbGUgY2FuIHNhZmVseSBsZWF2ZSB0aGlzIG9wdGlvbiBkaXNhYmxlZC4KKworY29uZmlnIEZFQVRVUkVfT1NGX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBCU0QgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBvciBjaGFuZ2UgQlNEIGRpc2tsYWJlbHMKKwkgIGFuZCBkZWZpbmUgYW5kIGVkaXQgQlNEIGRpc2sgc2xpY2VzLgorCitjb25maWcgRkVBVFVSRV9HUFRfTEFCRUwKKwlib29sICJTdXBwb3J0IEdQVCBkaXNrbGFiZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkRJU0sgJiYgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gdmlldyBHVUlEIFBhcnRpdGlvbiBUYWJsZQorCSAgZGlza2xhYmVscy4KKworY29uZmlnIEZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKwlib29sICJTdXBwb3J0IGV4cGVydCBtb2RlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkRJU0sgJiYgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZG8gdGVycmlibHkgdW5zYWZlIHRoaW5ncyBsaWtlCisJICBkZWZpbmUgYXJiaXRyYXJ5IGRyaXZlIGdlb21ldHJ5LCBtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgZGF0YSBpbiBhCisJICBwYXJ0aXRpb24sIGFuZCBzaW1pbGFybHkgZXZpbCB0aGluZ3MuIFVubGVzcyB5b3UgaGF2ZSBhIHZlcnkgZ29vZAorCSAgcmVhc29uIHlvdSB3b3VsZCBiZSB3aXNlIHRvIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBGSU5ERlMKKwlib29sICJmaW5kZnMiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IFZPTFVNRUlECisJaGVscAorCSAgUHJpbnRzIHRoZSBuYW1lIG9mIGEgZmlsZXN5c3RlbSB3aXRoIGdpdmVuIGxhYmVsIG9yIFVVSUQuCisJICBXQVJOSU5HOgorCSAgV2l0aCBhbGwgc3VibW9kdWxlcyBzZWxlY3RlZCwgaXQgd2lsbCBhZGQgfjhrIHRvIGJ1c3lib3guCisKK2NvbmZpZyBGTE9DSworCWJvb2wgImZsb2NrIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1hbmFnZSBsb2NrcyBmcm9tIHNoZWxsIHNjcmlwdHMKKworY29uZmlnIEZSRUVSQU1ESVNLCisJYm9vbCAiZnJlZXJhbWRpc2siCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgTGludXggYWxsb3dzIHlvdSB0byBjcmVhdGUgcmFtZGlza3MuIFRoaXMgdXRpbGl0eSBhbGxvd3MgeW91IHRvCisJICBkZWxldGUgdGhlbSBhbmQgY29tcGxldGVseSBmcmVlIGFsbCBtZW1vcnkgdGhhdCB3YXMgdXNlZCBmb3IgdGhlCisJICByYW1kaXNrLiBGb3IgZXhhbXBsZSwgaWYgeW91IGJvb3QgTGludXggaW50byBhIHJhbWRpc2sgYW5kIGxhdGVyCisJICBwaXZvdF9yb290LCB5b3UgbWF5IHdhbnQgdG8gZnJlZSB0aGUgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIHRvIHRoZQorCSAgcmFtZGlzay4gSWYgeW91IGhhdmUgbm8gdXNlIGZvciBmcmVlaW5nIG1lbW9yeSBmcm9tIGEgcmFtZGlzaywgbGVhdmUKKwkgIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBGU0NLX01JTklYCisJYm9vbCAiZnNja19taW5peCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgbWluaXggZmlsZXN5c3RlbSBpcyBhIG5pY2UsIHNtYWxsLCBjb21wYWN0LCByZWFkLXdyaXRlIGZpbGVzeXN0ZW0KKwkgIHdpdGggbGl0dGxlIG92ZXJoZWFkLiBJdCBpcyBub3QgYSBqb3VybmFsaW5nIGZpbGVzeXN0ZW0gaG93ZXZlciBhbmQKKwkgIGNhbiBleHBlcmllbmNlIGNvcnJ1cHRpb24gaWYgaXQgaXMgbm90IHByb3Blcmx5IHVubW91bnRlZCBvciBpZiB0aGUKKwkgIHBvd2VyIGdvZXMgb2ZmIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS4gVGhpcyB1dGlsaXR5IGFsbG93cyB5b3UgdG8KKwkgIGNoZWNrIGZvciBhbmQgYXR0ZW1wdCB0byByZXBhaXIgYW55IGNvcnJ1cHRpb24gdGhhdCBvY2N1cnMgdG8gYSBtaW5peAorCSAgZmlsZXN5c3RlbS4KKworY29uZmlnIE1LRlNfRVhUMgorCWJvb2wgIm1rZnNfZXh0MiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVdGlsaXR5IHRvIGNyZWF0ZSBFWFQyIGZpbGVzeXN0ZW1zLgorCitjb25maWcgTUtGU19NSU5JWAorCWJvb2wgIm1rZnNfbWluaXgiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIG1pbml4IGZpbGVzeXN0ZW0gaXMgYSBuaWNlLCBzbWFsbCwgY29tcGFjdCwgcmVhZC13cml0ZSBmaWxlc3lzdGVtCisJICB3aXRoIGxpdHRsZSBvdmVyaGVhZC4gSWYgeW91IHdpc2ggdG8gYmUgYWJsZSB0byBjcmVhdGUgbWluaXgKKwkgIGZpbGVzeXN0ZW1zIHRoaXMgdXRpbGl0eSB3aWxsIGRvIHRoZSBqb2IgZm9yIHlvdS4KKworY29uZmlnIEZFQVRVUkVfTUlOSVgyCisJYm9vbCAiU3VwcG9ydCBNaW5peCBmcyB2MiAoZnNja19taW5peC9ta2ZzX21pbml4KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZTQ0tfTUlOSVggfHwgTUtGU19NSU5JWAorCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gY3JlYXRlIHZlcnNpb24gMiBtaW5peCBmaWxlc3lzdGVtcywgZW5hYmxlCisJICB0aGlzLiBJZiB5b3UgZW5hYmxlZCAnbWtmc19taW5peCcgdGhlbiB5b3UgYWxtb3N0IGNlcnRhaW5seSB3YW50IHRvCisJICBiZSB1c2luZyB0aGUgdmVyc2lvbiAyIGZpbGVzeXN0ZW0gc3VwcG9ydC4KKworY29uZmlnIE1LRlNfUkVJU0VSCisJYm9vbCAibWtmc19yZWlzZXIiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXRpbGl0eSB0byBjcmVhdGUgUmVpc2VyRlMgZmlsZXN5c3RlbXMuCisJICBOb3RlOiB0aGlzIGFwcGxldCBuZWVkcyBhIGxvdCBvZiB0ZXN0aW5nIGFuZCBwb2xpc2hpbmcuCisKK2NvbmZpZyBNS0ZTX1ZGQVQKKwlib29sICJta2ZzX3ZmYXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXRpbGl0eSB0byBjcmVhdGUgRkFUMzIgZmlsZXN5c3RlbXMuCisKK2NvbmZpZyBHRVRPUFQKKwlib29sICJnZXRvcHQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGdldG9wdCB1dGlsaXR5IGlzIHVzZWQgdG8gYnJlYWsgdXAgKHBhcnNlKSBvcHRpb25zIGluIGNvbW1hbmQKKwkgIGxpbmVzIHRvIG1ha2UgaXQgZWFzeSB0byB3cml0ZSBjb21wbGV4IHNoZWxsIHNjcmlwdHMgdGhhdCBhbHNvIGNoZWNrCisJICBmb3IgbGVnYWwgKGFuZCBpbGxlZ2FsKSBvcHRpb25zLiBJZiB5b3Ugd2FudCB0byB3cml0ZSBob3JyaWJseQorCSAgY29tcGxleCBzaGVsbCBzY3JpcHRzLCBvciB1c2Ugc29tZSBob3JyaWJseSBjb21wbGV4IHNoZWxsIHNjcmlwdAorCSAgd3JpdHRlbiBieSBvdGhlcnMsIHRoaXMgdXRpbGl0eSBtYXkgYmUgZm9yIHlvdS4gTW9zdCBwZW9wbGUgd2lsbAorCSAgd2lzZWx5IGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX0dFVE9QVF9MT05HCisJYm9vbCAiU3VwcG9ydCBvcHRpb24gLWwiCisJZGVmYXVsdCB5IGlmIExPTkdfT1BUUworCWRlcGVuZHMgb24gR0VUT1BUCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGxvbmcgb3B0aW9ucyAob3B0aW9uIC1sKS4KKworY29uZmlnIEhFWERVTVAKKwlib29sICJoZXhkdW1wIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBoZXhkdW1wIHV0aWxpdHkgaXMgdXNlZCB0byBkaXNwbGF5IGJpbmFyeSBkYXRhIGluIGEgcmVhZGFibGUKKwkgIHdheSB0aGF0IGlzIGNvbXBhcmFibGUgdG8gdGhlIG91dHB1dCBmcm9tIG1vc3QgaGV4IGVkaXRvcnMuCisKK2NvbmZpZyBGRUFUVVJFX0hFWERVTVBfUkVWRVJTRQorCWJvb2wgIlN1cHBvcnQgLVIsIHJldmVyc2Ugb2YgJ2hleGR1bXAgLUN2JyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhFWERVTVAKKwloZWxwCisJICBUaGUgaGV4ZHVtcCB1dGlsaXR5IGlzIHVzZWQgdG8gZGlzcGxheSBiaW5hcnkgZGF0YSBpbiBhbiBhc2NpaQorCSAgcmVhZGFibGUgd2F5LiBUaGlzIG9wdGlvbiBjcmVhdGVzIGJpbmFyeSBkYXRhIGZyb20gYW4gYXNjaWkgaW5wdXQuCisJICBOQjogdGhpcyBvcHRpb24gaXMgbm9uLXN0YW5kYXJkLiBJdCdzIHVud2lzZSB0byB1c2UgaXQgaW4gc2NyaXB0cworCSAgYWltZWQgdG8gYmUgcG9ydGFibGUuCisKK2NvbmZpZyBIRAorCWJvb2wgImhkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSEVYRFVNUAorCWhlbHAKKwkgIGhkIGlzIGFuIGFsaWFzIHRvIGhleGR1bXAgLUMuCisKK2NvbmZpZyBIV0NMT0NLCisJYm9vbCAiaHdjbG9jayIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgaHdjbG9jayB1dGlsaXR5IGlzIHVzZWQgdG8gcmVhZCBhbmQgc2V0IHRoZSBoYXJkd2FyZSBjbG9jaworCSAgb24gYSBzeXN0ZW0uIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgdG8gc2V0IHRoZSBjdXJyZW50IHRpbWUgb24KKwkgIHNodXRkb3duIGluIHRoZSBoYXJkd2FyZSBjbG9jaywgc28gdGhlIGhhcmR3YXJlIHdpbGwga2VlcCB0aGUKKwkgIGNvcnJlY3QgdGltZSB3aGVuIExpbnV4IGlzIF9ub3RfIHJ1bm5pbmcuCisKK2NvbmZpZyBGRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TCisJYm9vbCAiU3VwcG9ydCBsb25nIG9wdGlvbnMgKC0taGN0b3N5cywuLi4pIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFdDTE9DSyAmJiBMT05HX09QVFMKKwloZWxwCisJICBCeSBkZWZhdWx0LCB0aGUgaHdjbG9jayB1dGlsaXR5IG9ubHkgdXNlcyBzaG9ydCBvcHRpb25zLiBJZiB5b3UKKwkgIGFyZSBvdmVybHkgZm9uZCBvZiBpdHMgbG9uZyBvcHRpb25zLCBzdWNoIGFzIC0taGN0b3N5cywgLS11dGMsIGV0YykKKwkgIHRoZW4gZW5hYmxlIHRoaXMgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTCisJYm9vbCAiVXNlIEZIUyAvdmFyL2xpYi9od2Nsb2NrL2FkanRpbWUiCisJZGVmYXVsdCBuICAjIHV0aWwtbGludXgtbmcgaW4gRmVkb3JhIDEzIHN0aWxsIHVzZXMgL2V0Yy9hZGp0aW1lCisJZGVwZW5kcyBvbiBIV0NMT0NLCisJaGVscAorCSAgU3RhcnRpbmcgd2l0aCBGSFMgMi4zLCB0aGUgYWRqdGltZSBzdGF0ZSBmaWxlIGlzIHN1cHBvc2VkIHRvIGV4aXN0CisJICBhdCAvdmFyL2xpYi9od2Nsb2NrL2FkanRpbWUgaW5zdGVhZCBvZiAvZXRjL2FkanRpbWUuIElmIHlvdSB3aXNoCisJICB0byB1c2UgdGhlIEZIUyBiZWhhdmlvciwgYW5zd2VyIFkgaGVyZSwgb3RoZXJ3aXNlIGFuc3dlciBOIGZvciB0aGUKKwkgIGNsYXNzaWMgL2V0Yy9hZGp0aW1lIHBhdGguCisKKwkgIHBhdGhuYW1lLmNvbS9maHMvcHViL2Zocy0yLjMuaHRtbCNWQVJMSUJIV0NMT0NLU1RBVEVESVJFQ1RPUllGT1JIV0NMTworCitjb25maWcgSVBDUk0KKwlib29sICJpcGNybSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgaXBjcm0gdXRpbGl0eSBhbGxvd3MgdGhlIHJlbW92YWwgb2YgU3lzdGVtIFYgaW50ZXJwcm9jZXNzCisJICBjb21tdW5pY2F0aW9uIChJUEMpIG9iamVjdHMgYW5kIHRoZSBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcworCSAgZnJvbSB0aGUgc3lzdGVtLgorCitjb25maWcgSVBDUworCWJvb2wgImlwY3MiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIGlwY3MgdXRpbGl0eSBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnRseQorCSAgYWxsb2NhdGVkIFN5c3RlbSBWIGludGVycHJvY2VzcyAoSVBDKSBvYmplY3RzIGluIHRoZSBzeXN0ZW0uCisKK2NvbmZpZyBMT1NFVFVQCisJYm9vbCAibG9zZXR1cCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsb3NldHVwIGlzIHVzZWQgdG8gYXNzb2NpYXRlIG9yIGRldGFjaCBhIGxvb3AgZGV2aWNlIHdpdGggYSByZWd1bGFyCisJICBmaWxlIG9yIGJsb2NrIGRldmljZSwgYW5kIHRvIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgYSBsb29wIGRldmljZS4gVGhpcworCSAgdmVyc2lvbiBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBlbmFibGluZyBkYXRhIGVuY3J5cHRpb24uCisKK2NvbmZpZyBMU1BDSQorCWJvb2wgImxzcGNpIgorCWRlZmF1bHQgeQorCSNzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsc3BjaSBpcyBhIHV0aWxpdHkgZm9yIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gYWJvdXQgUENJIGJ1c2VzIGluIHRoZQorCSAgc3lzdGVtIGFuZCBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGVtLgorCisJICBUaGlzIHZlcnNpb24gdXNlcyBzeXNmcyAoL3N5cy9idXMvcGNpL2RldmljZXMpIG9ubHkuCisKK2NvbmZpZyBMU1VTQgorCWJvb2wgImxzdXNiIgorCWRlZmF1bHQgeQorCSNzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBsc3VzYiBpcyBhIHV0aWxpdHkgZm9yIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gYWJvdXQgVVNCIGJ1c2VzIGluIHRoZQorCSAgc3lzdGVtIGFuZCBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGVtLgorCisJICBUaGlzIHZlcnNpb24gdXNlcyBzeXNmcyAoL3N5cy9idXMvdXNiL2RldmljZXMpIG9ubHkuCisKK2NvbmZpZyBNREVWCisJYm9vbCAibWRldiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBtZGV2IGlzIGEgbWluaS11ZGV2IGltcGxlbWVudGF0aW9uIGZvciBkeW5hbWljYWxseSBjcmVhdGluZyBkZXZpY2UKKwkgIG5vZGVzIGluIHRoZSAvZGV2IGRpcmVjdG9yeS4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgZG9jcy9tZGV2LnR4dAorCitjb25maWcgRkVBVFVSRV9NREVWX0NPTkYKKwlib29sICJTdXBwb3J0IC9ldGMvbWRldi5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTURFVgorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciB0aGUgbWRldiBjb25maWcgZmlsZSB0byBjb250cm9sIG93bmVyc2hpcCBhbmQKKwkgIHBlcm1pc3Npb25zIG9mIHRoZSBkZXZpY2Ugbm9kZXMuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGRvY3MvbWRldi50eHQKKworY29uZmlnIEZFQVRVUkVfTURFVl9SRU5BTUUKKwlib29sICJTdXBwb3J0IHN1YmRpcnMvc3ltbGlua3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX01ERVZfQ09ORgorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciByZW5hbWluZyBkZXZpY2VzIGFuZCBjcmVhdGluZyBzeW1saW5rcy4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgZG9jcy9tZGV2LnR4dAorCitjb25maWcgRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAKKwlib29sICJTdXBwb3J0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3Vic3RpdHV0aW9ucyB3aGVuIHJlbmFtaW5nIGRldmljZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfTURFVl9SRU5BTUUKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgcmVndWxhciBleHByZXNzaW9ucyBzdWJzdGl0dXRpb25zIHdoZW4gcmVuYW1pbmcKKwkgIGRldmljZS4KKworY29uZmlnIEZFQVRVUkVfTURFVl9FWEVDCisJYm9vbCAiU3VwcG9ydCBjb21tYW5kIGV4ZWN1dGlvbiBhdCBkZXZpY2UgYWRkaXRpb24vcmVtb3ZhbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfTURFVl9DT05GCisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGFuIG9wdGlvbmFsIGZpZWxkIHRvIC9ldGMvbWRldi5jb25mIGZvcgorCSAgZXhlY3V0aW5nIGNvbW1hbmRzIHdoZW4gZGV2aWNlcyBhcmUgY3JlYXRlZC9yZW1vdmVkLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBkb2NzL21kZXYudHh0CisKK2NvbmZpZyBGRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRQorCWJvb2wgIlN1cHBvcnQgbG9hZGluZyBvZiBmaXJtd2FyZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNREVWCisJaGVscAorCSAgU29tZSBkZXZpY2VzIG5lZWQgdG8gbG9hZCBmaXJtd2FyZSBiZWZvcmUgdGhleSBjYW4gYmUgdXNhYmxlLgorCisJICBUaGVzZSBkZXZpY2VzIHdpbGwgcmVxdWVzdCB1c2Vyc3BhY2UgbG9vayB1cCB0aGUgZmlsZXMgaW4KKwkgIC9saWIvZmlybXdhcmUvIGFuZCBpZiBpdCBleGlzdHMsIHNlbmQgaXQgdG8gdGhlIGtlcm5lbCBmb3IKKwkgIGxvYWRpbmcgaW50byB0aGUgaGFyZHdhcmUuCisKK2NvbmZpZyBNS1NXQVAKKwlib29sICJta3N3YXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG1rc3dhcCB1dGlsaXR5IGlzIHVzZWQgdG8gY29uZmlndXJlIGEgZmlsZSBvciBkaXNrIHBhcnRpdGlvbiBhcworCSAgTGludXggc3dhcCBzcGFjZS4gVGhpcyBhbGxvd3MgTGludXggdG8gdXNlIHRoZSBlbnRpcmUgZmlsZSBvcgorCSAgcGFydGl0aW9uIGFzIGlmIGl0IHdlcmUgYWRkaXRpb25hbCBSQU0sIHdoaWNoIGNhbiBncmVhdGx5IGluY3JlYXNlCisJICB0aGUgY2FwYWJpbGl0eSBvZiBsb3ctbWVtb3J5IG1hY2hpbmVzLiBUaGlzIGFkZGl0aW9uYWwgbWVtb3J5IGlzCisJICBtdWNoIHNsb3dlciB0aGFuIHJlYWwgUkFNLCBidXQgY2FuIGJlIHZlcnkgaGVscGZ1bCBhdCBwcmV2ZW50aW5nIHlvdXIKKwkgIGFwcGxpY2F0aW9ucyBiZWluZyBraWxsZWQgYnkgdGhlIExpbnV4IG91dCBvZiBtZW1vcnkgKE9PTSkga2lsbGVyLgorCSAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIHN3YXAgc3BhY2UgdXNpbmcgJ21rc3dhcCcgeW91IG5lZWQgdG8gZW5hYmxlCisJICB0aGUgc3dhcCBzcGFjZSB1c2luZyB0aGUgJ3N3YXBvbicgdXRpbGl0eS4KKworY29uZmlnIEZFQVRVUkVfTUtTV0FQX1VVSUQKKwlib29sICJVVUlEIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNS1NXQVAKKwloZWxwCisJICBHZW5lcmF0ZSBzd2FwIHNwYWNlcyB3aXRoIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVycy4KKworY29uZmlnIE1PUkUKKwlib29sICJtb3JlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1vcmUgaXMgYSBzaW1wbGUgdXRpbGl0eSB3aGljaCBhbGxvd3MgeW91IHRvIHJlYWQgdGV4dCBvbmUgc2NyZWVuCisJICBzaXplZCBwYWdlIGF0IGEgdGltZS4gSWYgeW91IHdhbnQgdG8gcmVhZCB0ZXh0IHRoYXQgaXMgbGFyZ2VyIHRoYW4KKwkgIHRoZSBzY3JlZW4sIGFuZCB5b3UgYXJlIHVzaW5nIGFueXRoaW5nIGZhc3RlciB0aGFuIGEgMzAwIGJhdWQgbW9kZW0sCisJICB5b3Ugd2lsbCBwcm9iYWJseSBmaW5kIHRoaXMgdXRpbGl0eSB2ZXJ5IGhlbHBmdWwuIElmIHlvdSBkb24ndCBoYXZlCisJICBhbnkgbmVlZCB0byByZWFkaW5nIHRleHQgZmlsZXMsIHlvdSBjYW4gbGVhdmUgdGhpcyBkaXNhYmxlZC4KKworY29uZmlnIE1PVU5UCisJYm9vbCAibW91bnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQWxsIGZpbGVzIGFuZCBmaWxlc3lzdGVtcyBpbiBVbml4IGFyZSBhcnJhbmdlZCBpbnRvIG9uZSBiaWcgZGlyZWN0b3J5CisJICB0cmVlLiBUaGUgJ21vdW50JyB1dGlsaXR5IGlzIHVzZWQgdG8gZ3JhZnQgYSBmaWxlc3lzdGVtIG9udG8gYQorCSAgcGFydGljdWxhciBwYXJ0IG9mIHRoZSB0cmVlLiBBIGZpbGVzeXN0ZW0gY2FuIGVpdGhlciBsaXZlIG9uIGEgYmxvY2sKKwkgIGRldmljZSwgb3IgaXQgY2FuIGJlIGFjY2Vzc2libGUgb3ZlciB0aGUgbmV0d29yaywgYXMgaXMgdGhlIGNhc2Ugd2l0aAorCSAgTkZTIGZpbGVzeXN0ZW1zLiBNb3N0IHBlb3BsZSB1c2luZyBCdXN5Qm94IHdpbGwgYWxzbyB3YW50IHRvIGVuYWJsZQorCSAgdGhlICdtb3VudCcgdXRpbGl0eS4KKworY29uZmlnIEZFQVRVUkVfTU9VTlRfRkFLRQorCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9VTlQKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgZmFraW5nIGEgZmlsZSBzeXN0ZW0gbW91bnQuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX1ZFUkJPU0UKKwlib29sICJTdXBwb3J0IG9wdGlvbiAtdiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PVU5UCisJaGVscAorCSAgRW5hYmxlIG11bHRpLWxldmVsIC12W3Z2Li4uXSB2ZXJib3NlIG1lc3NhZ2VzLiBVc2VmdWwgaWYgeW91CisJICBkZWJ1ZyBtb3VudCBwcm9ibGVtcyBhbmQgd2FudCB0byBzZWUgd2hhdCBpcyBleGFjdGx5IHBhc3NlZAorCSAgdG8gdGhlIGtlcm5lbC4KKworY29uZmlnIEZFQVRVUkVfTU9VTlRfSEVMUEVSUworCWJvb2wgIlN1cHBvcnQgbW91bnQgaGVscGVycyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1PVU5UCisJaGVscAorCSAgRW5hYmxlIG1vdW50aW5nIG9mIHZpcnR1YWwgZmlsZSBzeXN0ZW1zIHZpYSBleHRlcm5hbCBoZWxwZXJzLgorCSAgRS5nLiAibW91bnQgb2JleGZzIy1iMDAuMTEuMjIuMzMuNDQuNTUgL21udCIgd2lsbCBpbiBlZmZlY3QgY2FsbAorCSAgIm9iZXhmcyAtYjAwLjExLjIyLjMzLjQ0LjU1IC9tbnQiCisJICBBbHNvICJtb3VudCAtdCBzb21ldHlwZSBbLW8gb3B0c10gZnMgL21udCIgd2lsbCB0cnkKKwkgICJzb21ldHlwZSBbLW8gb3B0c10gZnMgL21udCIgaWYgc2ltcGxlIG1vdW50IHN5c2NhbGwgZmFpbHMuCisJICBUaGUgaWRlYSBpcyB0byB1c2Ugc3VjaCB2aXJ0dWFsIGZpbGVzeXN0ZW1zIGluIC9ldGMvZnN0YWIuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBzcGVjaWZ5aW5nIGRldmljZXMgYnkgbGFiZWwgb3IgVVVJRCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PVU5UCisJc2VsZWN0IFZPTFVNRUlECisJaGVscAorCSAgVGhpcyBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYSBkZXZpY2UgYnkgbGFiZWwgb3IgdXVpZCwgcmF0aGVyIHRoYW4gYnkKKwkgIG5hbWUuIFRoaXMgZmVhdHVyZSB1dGlsaXplcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGJsa2lkL2ZpbmRmcy4KKwkgIFRoaXMgYWxzbyBlbmFibGVzIGxhYmVsIG9yIHV1aWQgc3VwcG9ydCBmb3Igc3dhcG9uLgorCitjb25maWcgRkVBVFVSRV9NT1VOVF9ORlMKKwlib29sICJTdXBwb3J0IG1vdW50aW5nIE5GUyBmaWxlIHN5c3RlbXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVAorCXNlbGVjdCBGRUFUVVJFX0hBVkVfUlBDCisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgRW5hYmxlIG1vdW50aW5nIG9mIE5GUyBmaWxlIHN5c3RlbXMuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0NJRlMKKwlib29sICJTdXBwb3J0IG1vdW50aW5nIENJRlMvU01CIGZpbGUgc3lzdGVtcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PVU5UCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHNhbWJhIG1vdW50cy4KKworY29uZmlnIEZFQVRVUkVfTU9VTlRfRkxBR1MKKwlkZXBlbmRzIG9uIE1PVU5UCisJYm9vbCAiU3VwcG9ydCBsb3RzIG9mIC1vIGZsYWdzIGluIG1vdW50IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdpdGhvdXQgdGhpcywgbW91bnQgb25seSBzdXBwb3J0cyByby9ydy9yZW1vdW50LiBXaXRoIHRoaXMsIGl0CisJICBzdXBwb3J0cyBub3N1aWQsIHN1aWQsIGRldiwgbm9kZXYsIGV4ZWMsIG5vZXhlYywgc3luYywgYXN5bmMsIGF0aW1lLAorCSAgbm9hdGltZSwgZGlyYXRpbWUsIG5vZGlyYXRpbWUsIGxvdWQsIGJpbmQsIG1vdmUsIHNoYXJlZCwgc2xhdmUsCisJICBwcml2YXRlLCB1bmJpbmRhYmxlLCByc2hhcmVkLCByc2xhdmUsIHJwcml2YXRlLCBhbmQgcnVuYmluZGFibGUuCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0ZTVEFCCisJZGVwZW5kcyBvbiBNT1VOVAorCWJvb2wgIlN1cHBvcnQgL2V0Yy9mc3RhYiBhbmQgLWEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBtb3VudCBhbGwgYW5kIGxvb2tpbmcgZm9yIGZpbGVzIGluIC9ldGMvZnN0YWIuCisKK2NvbmZpZyBQSVZPVF9ST09UCisJYm9vbCAicGl2b3Rfcm9vdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgcGl2b3Rfcm9vdCB1dGlsaXR5IHN3YXBzIHRoZSBtb3VudCBwb2ludHMgZm9yIHRoZSByb290IGZpbGVzeXN0ZW0KKwkgIHdpdGggc29tZSBvdGhlciBtb3VudGVkIGZpbGVzeXN0ZW0uIFRoaXMgYWxsb3dzIHlvdSB0byBkbyBhbGwgc29ydHMKKwkgIG9mIHdpbGQgYW5kIGNyYXp5IHRoaW5ncyB3aXRoIHlvdXIgTGludXggc3lzdGVtIGFuZCBpcyBmYXIgbW9yZQorCSAgcG93ZXJmdWwgdGhhbiAnY2hyb290Jy4KKworCSAgTm90ZTogVGhpcyBpcyBmb3IgaW5pdHJkIGluIGxpbnV4IDIuNC4gVW5kZXIgaW5pdHJhbWZzIChpbnRyb2R1Y2VkCisJICBpbiBsaW51eCAyLjYpIHVzZSBzd2l0Y2hfcm9vdCBpbnN0ZWFkLgorCitjb25maWcgUkRBVEUKKwlib29sICJyZGF0ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgcmRhdGUgdXRpbGl0eSBhbGxvd3MgeW91IHRvIHN5bmNocm9uaXplIHRoZSBkYXRlIGFuZCB0aW1lIG9mIHlvdXIKKwkgIHN5c3RlbSBjbG9jayB3aXRoIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGEgcmVtb3RlIG5ldHdvcmtlZCBzeXN0ZW0gdXNpbmcKKwkgIHRoZSBSRkM4NjggcHJvdG9jb2wsIHdoaWNoIGlzIGJ1aWx0IGludG8gdGhlIGluZXRkIGRhZW1vbiBvbiBtb3N0CisJICBzeXN0ZW1zLgorCitjb25maWcgUkRFVgorCWJvb2wgInJkZXYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUHJpbnQgdGhlIGRldmljZSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZXN5c3RlbSBtb3VudGVkIGF0ICcvJy4KKworY29uZmlnIFJFQURQUk9GSUxFCisJYm9vbCAicmVhZHByb2ZpbGUiCisJZGVmYXVsdCB5CisJI3NlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byBwYXJzZSAvcHJvYy9wcm9maWxlIGZvciBiYXNpYyBwcm9maWxpbmcuCisKK2NvbmZpZyBSVENXQUtFCisJYm9vbCAicnRjd2FrZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbnRlciBhIHN5c3RlbSBzbGVlcCBzdGF0ZSB1bnRpbCBzcGVjaWZpZWQgd2FrZXVwIHRpbWUuCisKK2NvbmZpZyBTQ1JJUFQKKwlib29sICJzY3JpcHQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHNjcmlwdCBtYWtlcyB0eXBlc2NyaXB0IG9mIHRlcm1pbmFsIHNlc3Npb24uCisKK2NvbmZpZyBTQ1JJUFRSRVBMQVkKKwlib29sICJzY3JpcHRyZXBsYXkiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlcGxheXMgYSB0eXBlc2NyaXB0LCB1c2luZyB0aW1pbmcgaW5mb3JtYXRpb24KKwkgIGdpdmVuIGJ5IHNjcmlwdCAtdC4KKworY29uZmlnIFNFVEFSQ0gKKwlib29sICJzZXRhcmNoIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBsaW51eDMyIHV0aWxpdHkgaXMgdXNlZCB0byBjcmVhdGUgYSAzMmJpdCBlbnZpcm9ubWVudCBmb3IgdGhlCisJICBzcGVjaWZpZWQgcHJvZ3JhbSAodXN1YWxseSBhIHNoZWxsKS4gSXQgb25seSBtYWtlcyBzZW5zZSB0byBoYXZlCisJICB0aGlzIHV0aWwgb24gYSBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBib3RoIDY0Yml0IGFuZCAzMmJpdCB1c2VybGFuZAorCSAgKGxpa2UgYW1kNjQveDg2LCBwcGM2NC9wcGMsIHNwYXJjNjQvc3BhcmMsIGV0Yy4uLikuCisKK2NvbmZpZyBTV0FQT05PRkYKKwlib29sICJzd2Fwb25vZmYiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBib3RoIHRoZSAnc3dhcG9uJyBhbmQgdGhlICdzd2Fwb2ZmJyB1dGlsaXRpZXMuCisJICBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgc29tZSBzd2FwIHNwYWNlIHVzaW5nICdta3N3YXAnLCB5b3UgYWxzbyBuZWVkCisJICB0byBlbmFibGUgeW91ciBzd2FwIHNwYWNlIHdpdGggdGhlICdzd2Fwb24nIHV0aWxpdHkuIFRoZSAnc3dhcG9mZicKKwkgIHV0aWxpdHkgaXMgdXNlZCwgdHlwaWNhbGx5IGF0IHN5c3RlbSBzaHV0ZG93biwgdG8gZGlzYWJsZSBhbnkgc3dhcAorCSAgc3BhY2UuIElmIHlvdSBhcmUgbm90IHVzaW5nIGFueSBzd2FwIHNwYWNlLCB5b3UgY2FuIGxlYXZlIHRoaXMKKwkgIG9wdGlvbiBkaXNhYmxlZC4KKworY29uZmlnIEZFQVRVUkVfU1dBUE9OX1BSSQorCWJvb2wgIlN1cHBvcnQgcHJpb3JpdHkgb3B0aW9uIC1wIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1dBUE9OT0ZGCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHNldHRpbmcgc3dhcCBkZXZpY2UgcHJpb3JpdHkgaW4gc3dhcG9uLgorCitjb25maWcgU1dJVENIX1JPT1QKKwlib29sICJzd2l0Y2hfcm9vdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgc3dpdGNoX3Jvb3QgdXRpbGl0eSBpcyB1c2VkIGZyb20gaW5pdHJhbWZzIHRvIHNlbGVjdCBhIG5ldworCSAgcm9vdCBkZXZpY2UuIFVuZGVyIGluaXRyYW1mcywgeW91IGhhdmUgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZgorCSAgcGl2b3Rfcm9vdC4gKFN0b3AgcmVhZGluZyBoZXJlIGlmIHlvdSBkb24ndCBjYXJlIHdoeS4pCisKKwkgIEJvb3Rpbmcgd2l0aCBpbml0cmFtZnMgZXh0cmFjdHMgYSBnemlwcGVkIGNwaW8gYXJjaGl2ZSBpbnRvIHJvb3RmcworCSAgKHdoaWNoIGlzIGEgdmFyaWFudCBvZiByYW1mcy90bXBmcykuIEJlY2F1c2Ugcm9vdGZzIGNhbid0IGJlIG1vdmVkCisJICBvciB1bm1vdW50ZWQqLCBwaXZvdF9yb290IHdpbGwgbm90IHdvcmsgZnJvbSBpbml0cmFtZnMuIEluc3RlYWQsCisJICBzd2l0Y2hfcm9vdCBkZWxldGVzIGV2ZXJ5dGhpbmcgb3V0IG9mIHJvb3RmcyAoaW5jbHVkaW5nIGl0c2VsZiksCisJICBkb2VzIGEgbW91bnQgLS1tb3ZlIHRoYXQgb3Zlcm1vdW50cyByb290ZnMgd2l0aCB0aGUgbmV3IHJvb3QsIGFuZAorCSAgdGhlbiBleGVjcyB0aGUgc3BlY2lmaWVkIGluaXQgcHJvZ3JhbS4KKworCSAgKiBCZWNhdXNlIHRoZSBMaW51eCBrZXJuZWwgdXNlcyByb290ZnMgaW50ZXJuYWxseSBhcyB0aGUgc3RhcnRpbmcKKwkgIGFuZCBlbmRpbmcgcG9pbnQgZm9yIHNlYXJjaGluZyB0aHJvdWdoIHRoZSBrZXJuZWwncyBkb3VibHkgbGlua2VkCisJICBsaXN0IG9mIGFjdGl2ZSBtb3VudCBwb2ludHMuIFRoYXQncyB3aHkuCisKK2NvbmZpZyBVTU9VTlQKKwlib29sICJ1bW91bnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgV2hlbiB5b3Ugd2FudCB0byByZW1vdmUgYSBtb3VudGVkIGZpbGVzeXN0ZW0gZnJvbSBpdHMgY3VycmVudCBtb3VudAorCSAgcG9pbnQsIGZvciBleGFtcGxlIHdoZW4geW91IGFyZSBzaHV0dGluZyBkb3duIHRoZSBzeXN0ZW0sIHRoZQorCSAgJ3Vtb3VudCcgdXRpbGl0eSBpcyB0aGUgdG9vbCB0byB1c2UuIElmIHlvdSBlbmFibGVkIHRoZSAnbW91bnQnCisJICB1dGlsaXR5LCB5b3UgYWxtb3N0IGNlcnRhaW5seSBhbHNvIHdhbnQgdG8gZW5hYmxlICd1bW91bnQnLgorCitjb25maWcgRkVBVFVSRV9VTU9VTlRfQUxMCisJYm9vbCAiU3VwcG9ydCBvcHRpb24gLWEiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVTU9VTlQKKwloZWxwCisJICBTdXBwb3J0IC1hIG9wdGlvbiB0byB1bm1vdW50IGFsbCBjdXJyZW50bHkgbW91bnRlZCBmaWxlc3lzdGVtcy4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIG1vdW50L3Vtb3VudCIKKwlkZXBlbmRzIG9uIE1PVU5UIHx8IFVNT1VOVAorCitjb25maWcgRkVBVFVSRV9NT1VOVF9MT09QCisJYm9vbCAiU3VwcG9ydCBsb29wYmFjayBtb3VudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNT1VOVCB8fCBVTU9VTlQKKwloZWxwCisJICBFbmFibGluZyB0aGlzIGZlYXR1cmUgYWxsb3dzIGF1dG9tYXRpYyBtb3VudGluZyBvZiBmaWxlcyAoY29udGFpbmluZworCSAgZmlsZXN5c3RlbSBpbWFnZXMpIHZpYSB0aGUgbGludXgga2VybmVsJ3MgbG9vcGJhY2sgZGV2aWNlcy4KKwkgIFRoZSBtb3VudCBjb21tYW5kIHdpbGwgZGV0ZWN0IHlvdSBhcmUgdHJ5aW5nIHRvIG1vdW50IGEgZmlsZSBpbnN0ZWFkCisJICBvZiBhIGJsb2NrIGRldmljZSwgYW5kIHRyYW5zcGFyZW50bHkgYXNzb2NpYXRlIHRoZSBmaWxlIHdpdGggYQorCSAgbG9vcGJhY2sgZGV2aWNlLiBUaGUgdW1vdW50IGNvbW1hbmQgd2lsbCBhbHNvIGZyZWUgdGhhdCBsb29wYmFjaworCSAgZGV2aWNlLgorCisJICBZb3UgY2FuIHN0aWxsIHVzZSB0aGUgJ2xvc2V0dXAnIHV0aWxpdHkgKHRvIG1hbnVhbGx5IGFzc29jaWF0ZSBmaWxlcworCSAgd2l0aCBsb29wIGRldmljZXMpIGlmIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhZHZhbmNlZCwgc3VjaCBhcworCSAgc3BlY2lmeSBhbiBvZmZzZXQgb3IgY3J5cHRvZ3JhcGhpYyBvcHRpb25zIHRvIHRoZSBsb29wYmFjayBkZXZpY2UuCisJICAoSWYgeW91IGRvbid0IHdhbnQgdW1vdW50IHRvIGZyZWUgdGhlIGxvb3AgZGV2aWNlLCB1c2UgInVtb3VudCAtRCIuKQorCitjb25maWcgRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURQorCWJvb2wgIkNyZWF0ZSBuZXcgbG9vcGJhY2sgZGV2aWNlcyBpZiBuZWVkZWQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX01PVU5UX0xPT1AKKwloZWxwCisJICBMaW51eCBrZXJuZWxzID49IDIuNi4yNCBzdXBwb3J0IHVubGltaXRlZCBsb29wYmFjayBkZXZpY2VzLiBUaGV5IGFyZQorCSAgYWxsb2NhdGVkIGZvciB1c2Ugd2hlbiB0cnlpbmcgdG8gdXNlIGEgbG9vcCBkZXZpY2UuIFRoZSBsb29wIGRldmljZQorCSAgbXVzdCBob3dldmVyIGV4aXN0LgorCisJICBUaGlzIGZlYXR1cmUgbGV0cyBtb3VudCB0byB0cnkgdG8gY3JlYXRlIG5leHQgL2Rldi9sb29wTiBkZXZpY2UKKwkgIGlmIGl0IGRvZXMgbm90IGZpbmQgYSBmcmVlIG9uZS4KKworY29uZmlnIEZFQVRVUkVfTVRBQl9TVVBQT1JUCisJYm9vbCAiU3VwcG9ydCBmb3IgdGhlIG9sZCAvZXRjL210YWIgZmlsZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1PVU5UIHx8IFVNT1VOVAorCXNlbGVjdCBGRUFUVVJFX01PVU5UX0ZBS0UKKwloZWxwCisJICBIaXN0b3JpY2FsbHksIFVuaXggc3lzdGVtcyBrZXB0IHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgbW91bnRlZAorCSAgcGFydGl0aW9ucyBpbiB0aGUgZmlsZSAiL2V0Yy9tdGFiIi4gVGhlc2UgZGF5cywgdGhlIGtlcm5lbCBleHBvcnRzCisJICB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbW91bnRlZCBwYXJ0aXRpb25zIGluICIvcHJvYy9tb3VudHMiLCByZW5kZXJpbmcKKwkgIHRoZSBvbGQgbXRhYiBmaWxlIG9ic29sZXRlLiAoSW4gbW9kZXJuIHN5c3RlbXMsIC9ldGMvbXRhYiBzaG91bGQgYmUKKwkgIGEgc3ltbGluayB0byAvcHJvYy9tb3VudHMuKQorCisJICBUaGUgb25seSByZWFzb24gdG8gaGF2ZSBtb3VudCBtYWludGFpbiBhbiAvZXRjL210YWIgZmlsZSBpdHNlbGYgaXMgaWYKKwkgIHlvdXIgc3RyaXBwZWQtZG93biBlbWJlZGRlZCBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIC9wcm9jIGRpcmVjdG9yeS4KKwkgIElmIHlvdSBtdXN0IHVzZSB0aGlzLCBrZWVwIGluIG1pbmQgaXQncyBpbmhlcmVudGx5IGJyaXR0bGUgKGZvcgorCSAgZXhhbXBsZSBhIG1vdW50IHVuZGVyIGNocm9vdCB3b24ndCB1cGRhdGUgaXQpLCBjYW4ndCBoYW5kbGUgbW9kZXJuCisJICBmZWF0dXJlcyBsaWtlIHNlcGFyYXRlIHBlci1wcm9jZXNzIGZpbGVzeXN0ZW0gbmFtZXNwYWNlcywgcmVxdWlyZXMKKwkgIHRoYXQgeW91ciAvZXRjIGRpcmVjdG9yeSBiZSB3cml0YWJsZSwgdGVuZHMgdG8gZ2V0IGVhc2lseSBjb25mdXNlZAorCSAgYnkgLS1iaW5kIG9yIC0tbW92ZSBtb3VudHMsIHdvbid0IHVwZGF0ZSBpZiB5b3UgcmVuYW1lIGEgZGlyZWN0b3J5CisJICB0aGF0IGNvbnRhaW5zIGEgbW91bnQgcG9pbnQsIGFuZCBzbyBvbi4gKEluIGJyaWVmOiBhdm9pZC4pCisKKwkgIEFib3V0IHRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhpcyBpcyBpZiB5b3UndmUgcmVtb3ZlZCAvcHJvYyBmcm9tCisJICB5b3VyIGtlcm5lbC4KKworY29uZmlnIFZPTFVNRUlECisJYm9vbCAjTm8gZGVzY3JpcHRpb24gbWFrZXMgaXQgYSBoaWRkZW4gb3B0aW9uCisJZGVmYXVsdCBuCisKK21lbnUgIkZpbGVzeXN0ZW0vVm9sdW1lIGlkZW50aWZpY2F0aW9uIgorCWRlcGVuZHMgb24gVk9MVU1FSUQKKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfRVhUCisJYm9vbCAiRXh0IGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfQlRSRlMKKwlib29sICJidHJmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTCisJYm9vbCAiUmVpc2VyIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfRkFUCisJYm9vbCAiZmF0IGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSEZTCisJYm9vbCAiaGZzIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSkZTCisJYm9vbCAiamZzIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1VGUworIyMjCWJvb2wgInVmcyBmaWxlc3lzdGVtIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1hGUworCWJvb2wgInhmcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX05URlMKKwlib29sICJudGZzIGZpbGVzeXN0ZW0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBWT0xVTUVJRAorCWhlbHAKKwkgIFRPRE8KKworY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MAorCWJvb2wgImlzbzk2NjAgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9VREYKKwlib29sICJ1ZGYgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MVUtTCisJYm9vbCAibHVrcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUAorCWJvb2wgImxpbnV4IHN3YXAgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTFZNCisjIyMJYm9vbCAibHZtIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUworCWJvb2wgImNyYW1mcyBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9IUEZTCisjIyMJYm9vbCAiaHBmcyBmaWxlc3lzdGVtIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1JPTUZTCisJYm9vbCAicm9tZnMgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9TWVNWCisJYm9vbCAic3lzdiBmaWxlc3lzdGVtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVk9MVU1FSUQKKwloZWxwCisJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9NSU5JWAorIyMjCWJvb2wgIm1pbml4IGZpbGVzeXN0ZW0iCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKworIyMjIFRoZXNlIG9ubHkgZGV0ZWN0IHBhcnRpdGlvbiB0YWJsZXMgLSBub3QgdXNlZCAoeWV0PykKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9NQUMKKyMjIwlib29sICJtYWMgZmlsZXN5c3RlbSIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworIyMjCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTVNET1MKKyMjIwlib29sICJtc2RvcyBmaWxlc3lzdGVtIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX09DRlMyCisJYm9vbCAib2NmczIgZmlsZXN5c3RlbSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSElHSFBPSU5UUkFJRAorIyMjCWJvb2wgImhpZ2hwb2ludCByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9JU1dSQUlECisjIyMJYm9vbCAiaW50ZWwgcmFpZCIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisjIyMJaGVscAorIyMjCSAgVE9ETworCisjIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTFNJUkFJRAorIyMjCWJvb2wgImxzaSByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9WSUFSQUlECisjIyMJYm9vbCAidmlhIHJhaWQiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1NJTElDT05SQUlECisjIyMJYm9vbCAic2lsaWNvbiByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKKyMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9OVklESUFSQUlECisjIyMJYm9vbCAibnZpZGlhIHJhaWQiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorIyMjCWhlbHAKKyMjIwkgIFRPRE8KKworIyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1BST01JU0VSQUlECisjIyMJYm9vbCAicHJvbWlzZSByYWlkIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKyMjIwloZWxwCisjIyMJICBUT0RPCisKK2NvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRAorCWJvb2wgImxpbnV4cmFpZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisJaGVscAorCSAgVE9ETworCitlbmRtZW51CisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvS2J1aWxkLnNyYyBiL3V0aWwtbGludXgvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZkOTExCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNDcgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0FDUElEKSAgICAgICAgICAgICArPSBhY3BpZC5vCitsaWItJChDT05GSUdfQkxLSUQpICAgICAgICAgICAgICs9IGJsa2lkLm8KK2xpYi0kKENPTkZJR19ETUVTRykgICAgICAgICAgICAgKz0gZG1lc2cubworbGliLSQoQ09ORklHX0ZCU0VUKSAgICAgICAgICAgICArPSBmYnNldC5vCitsaWItJChDT05GSUdfRkRGTFVTSCkgICAgICAgICAgICs9IGZyZWVyYW1kaXNrLm8KK2xpYi0kKENPTkZJR19GREZPUk1BVCkgICAgICAgICAgKz0gZmRmb3JtYXQubworbGliLSQoQ09ORklHX0ZESVNLKSAgICAgICAgICAgICArPSBmZGlzay5vCitsaWItJChDT05GSUdfRklOREZTKSAgICAgICAgICAgICs9IGZpbmRmcy5vCitsaWItJChDT05GSUdfRkxPQ0spICAgICAgICAgICAgICs9IGZsb2NrLm8KK2xpYi0kKENPTkZJR19GUkVFUkFNRElTSykgICAgICAgKz0gZnJlZXJhbWRpc2subworbGliLSQoQ09ORklHX0ZTQ0tfTUlOSVgpICAgICAgICArPSBmc2NrX21pbml4Lm8KK2xpYi0kKENPTkZJR19HRVRPUFQpICAgICAgICAgICAgKz0gZ2V0b3B0Lm8KK2xpYi0kKENPTkZJR19IRVhEVU1QKSAgICAgICAgICAgKz0gaGV4ZHVtcC5vCitsaWItJChDT05GSUdfSFdDTE9DSykgICAgICAgICAgICs9IGh3Y2xvY2subworbGliLSQoQ09ORklHX0lQQ1JNKSAgICAgICAgICAgICArPSBpcGNybS5vCitsaWItJChDT05GSUdfSVBDUykgICAgICAgICAgICAgICs9IGlwY3MubworbGliLSQoQ09ORklHX0xPU0VUVVApICAgICAgICAgICArPSBsb3NldHVwLm8KK2xpYi0kKENPTkZJR19MU1BDSSkgICAgICAgICAgICAgKz0gbHNwY2kubworbGliLSQoQ09ORklHX0xTVVNCKSAgICAgICAgICAgICArPSBsc3VzYi5vCitsaWItJChDT05GSUdfTURFVikgICAgICAgICAgICAgICs9IG1kZXYubworbGliLSQoQ09ORklHX01LRlNfRVhUMikgICAgICAgICArPSBta2ZzX2V4dDIubworbGliLSQoQ09ORklHX01LRlNfTUlOSVgpICAgICAgICArPSBta2ZzX21pbml4Lm8KK2xpYi0kKENPTkZJR19NS0ZTX1JFSVNFUikgICAgICAgKz0gbWtmc19yZWlzZXIubworbGliLSQoQ09ORklHX01LRlNfVkZBVCkgICAgICAgICArPSBta2ZzX3ZmYXQubworbGliLSQoQ09ORklHX01LU1dBUCkgICAgICAgICAgICArPSBta3N3YXAubworbGliLSQoQ09ORklHX01PUkUpICAgICAgICAgICAgICArPSBtb3JlLm8KK2xpYi0kKENPTkZJR19NT1VOVCkgICAgICAgICAgICAgKz0gbW91bnQubworbGliLSQoQ09ORklHX1BJVk9UX1JPT1QpICAgICAgICArPSBwaXZvdF9yb290Lm8KK2xpYi0kKENPTkZJR19SREFURSkgICAgICAgICAgICAgKz0gcmRhdGUubworbGliLSQoQ09ORklHX1JERVYpICAgICAgICAgICAgICArPSByZGV2Lm8KK2xpYi0kKENPTkZJR19SRUFEUFJPRklMRSkgICAgICAgKz0gcmVhZHByb2ZpbGUubworbGliLSQoQ09ORklHX1JUQ1dBS0UpICAgICAgICAgICArPSBydGN3YWtlLm8KK2xpYi0kKENPTkZJR19TQ1JJUFQpICAgICAgICAgICAgKz0gc2NyaXB0Lm8KK2xpYi0kKENPTkZJR19TQ1JJUFRSRVBMQVkpICAgICAgKz0gc2NyaXB0cmVwbGF5Lm8KK2xpYi0kKENPTkZJR19TRVRBUkNIKSAgICAgICAgICAgKz0gc2V0YXJjaC5vCitsaWItJChDT05GSUdfU1dBUE9OT0ZGKSAgICAgICAgICs9IHN3YXBvbm9mZi5vCitsaWItJChDT05GSUdfU1dJVENIX1JPT1QpICAgICAgICs9IHN3aXRjaF9yb290Lm8KK2xpYi0kKENPTkZJR19VTU9VTlQpICAgICAgICAgICAgKz0gdW1vdW50Lm8KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvYWNwaWQuYyBiL3V0aWwtbGludXgvYWNwaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTczMjFiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9hY3BpZC5jCkBAIC0wLDAgKzEsMzM3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzaW1wbGUgQUNQSSBldmVudHMgbGlzdGVuZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGFjcGlkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRdIFstYyBDT05GRElSXSBbLWwgTE9HRklMRV0gWy1hIEFDVElPTkZJTEVdIFstTSBNQVBGSUxFXSBbLWUgUFJPQ19FVkVOVF9GSUxFXSBbLXAgUElERklMRV0iCisvL3VzYWdlOiNkZWZpbmUgYWNwaWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0ZW4gdG8gQUNQSSBldmVudHMgYW5kIHNwYXduIHNwZWNpZmljIGhlbHBlcnMgb24gZXZlbnQgYXJyaXZhbFxuIgorLy91c2FnZTogICAgICJcbgktYyBESVIJQ29uZmlnIGRpcmVjdG9yeSBbL2V0Yy9hY3BpXSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRG9uJ3QgZGFlbW9uaXplLCAoaW1wbGllcyAtZikiCisvL3VzYWdlOiAgICAgIlxuCS1lIEZJTEUJL3Byb2MgZXZlbnQgZmlsZSBbL3Byb2MvYWNwaS9ldmVudF0iCisvL3VzYWdlOiAgICAgIlxuCS1mCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktbCBGSUxFCUxvZyBmaWxlIFsvdmFyL2xvZy9hY3BpZC5sb2ddIgorLy91c2FnZTogICAgICJcbgktcCBGSUxFCVBpZCBmaWxlIFsvdmFyL3J1bi9hY3BpZC5waWRdIgorLy91c2FnZTogICAgICJcbgktYSBGSUxFCUFjdGlvbiBmaWxlIFsvZXRjL2FjcGlkLmNvbmZdIgorLy91c2FnZTogICAgICJcbgktTSBGSUxFIE1hcCBmaWxlIFsvZXRjL2FjcGkubWFwXSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQUNQSURfQ09NUEFUKAorLy91c2FnZTogICAgICJcblxuQWNjZXB0IGFuZCBpZ25vcmUgY29tcGF0aWJpbGl0eSBvcHRpb25zIC1nIC1tIC1zIC1TIC12IgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBhY3BpZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiV2l0aG91dCAtZSBvcHRpb24sIGFjcGlkIHVzZXMgYWxsIC9kZXYvaW5wdXQvZXZlbnQqIGZpbGVzXG4iCisvL3VzYWdlOiAgICAgICAiIyBhY3BpZFxuIgorLy91c2FnZTogICAgICAgIiMgYWNwaWQgLWwgL3Zhci9sb2cvbXktYWNwaS1sb2dcbiIKKy8vdXNhZ2U6ICAgICAgICIjIGFjcGlkIC1lIC9wcm9jL2FjcGkvZXZlbnRcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2lmbmRlZiBFVl9TVworIyBkZWZpbmUgRVZfU1cgICAgICAgICAweDA1CisjZW5kaWYKKyNpZm5kZWYgRVZfS0VZCisjIGRlZmluZSBFVl9LRVkgICAgICAgIDB4MDEKKyNlbmRpZgorI2lmbmRlZiBTV19MSUQKKyMgZGVmaW5lIFNXX0xJRCAgICAgICAgMHgwMAorI2VuZGlmCisjaWZuZGVmIFNXX1JGS0lMTF9BTEwKKyMgZGVmaW5lIFNXX1JGS0lMTF9BTEwgMHgwMworI2VuZGlmCisjaWZuZGVmIEtFWV9QT1dFUgorIyBkZWZpbmUgS0VZX1BPV0VSICAgICAgMTE2ICAgICAvKiBTQyBTeXN0ZW0gUG93ZXIgRG93biAqLworI2VuZGlmCisjaWZuZGVmIEtFWV9TTEVFUAorIyBkZWZpbmUgS0VZX1NMRUVQICAgICAgMTQyICAgICAvKiBTQyBTeXN0ZW0gU2xlZXAgKi8KKyNlbmRpZgorCitlbnVtIHsKKwlPUFRfYyA9ICgxIDw8IDApLAorCU9QVF9kID0gKDEgPDwgMSksCisJT1BUX2UgPSAoMSA8PCAyKSwKKwlPUFRfZiA9ICgxIDw8IDMpLAorCU9QVF9sID0gKDEgPDwgNCksCisJT1BUX2EgPSAoMSA8PCA1KSwKKwlPUFRfTSA9ICgxIDw8IDYpLAorCU9QVF9wID0gKDEgPDwgNykgKiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFLAorfTsKKworc3RydWN0IGFjcGlfZXZlbnQgeworCWNvbnN0IGNoYXIgKnNfdHlwZTsKKwl1aW50MTZfdCBuX3R5cGU7CisJY29uc3QgY2hhciAqc19jb2RlOworCXVpbnQxNl90IG5fY29kZTsKKwl1aW50MzJfdCB2YWx1ZTsKKwljb25zdCBjaGFyICpkZXNjOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2V2ZW50IGZfZXZ0X3RhYltdID0geworCXsgIkVWX0tFWSIsIDB4MDEsICJLRVlfUE9XRVIiLCAxMTYsIDEsICJidXR0b24vcG93ZXIgUFdSRiAwMDAwMDA4MCIgfSwKKwl7ICJFVl9LRVkiLCAweDAxLCAiS0VZX1BPV0VSIiwgMTE2LCAxLCAiYnV0dG9uL3Bvd2VyIFBXUkIgMDAwMDAwODAiIH0sCit9OworCitzdHJ1Y3QgYWNwaV9hY3Rpb24geworCWNvbnN0IGNoYXIgKmtleTsKKwljb25zdCBjaGFyICphY3Rpb247Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfYWN0aW9uIGZfYWN0X3RhYltdID0geworCXsgIlBXUkYiLCAiUFdSRi8wMDAwMDA4MCIgfSwKKwl7ICJMSUQwIiwgIkxJRC8wMDAwMDA4MCIgfSwKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgYWNwaV9hY3Rpb24gKmFjdF90YWI7CisJaW50IG5fYWN0OworCXN0cnVjdCBhY3BpX2V2ZW50ICpldnRfdGFiOworCWludCBuX2V2dDsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGFjdF90YWIgICAgICAgICAoRy5hY3RfdGFiKQorI2RlZmluZSBuX2FjdCAgICAgICAgICAgKEcubl9hY3QgICkKKyNkZWZpbmUgZXZ0X3RhYiAgICAgICAgIChHLmV2dF90YWIpCisjZGVmaW5lIG5fZXZ0ICAgICAgICAgICAoRy5uX2V2dCAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIGFjcGlkIGxpc3RlbnMgdG8gQUNQSSBldmVudHMgY29taW5nIGVpdGhlciBpbiB0ZXh0dWFsIGZvcm0KKyAqIGZyb20gL3Byb2MvYWNwaS9ldmVudCAodGhvdWdoIGl0IGlzIG1hcmtlZCBkZXByZWNhdGVkLAorICogaXQgaXMgc3RpbGwgd2lkZWx5IHVzZWQgYW5kIF9pc18gYSBzdGFuZGFyZCkgb3IgaW4gYmluYXJ5IGZvcm0KKyAqIGZyb20gc3BlY2lmaWVkIGV2ZGV2cyAoanVzdCB1c2UgL2Rldi9pbnB1dC9ldmVudCopLgorICogSXQgcGFyc2VzIHRoZSBldmVudCB0byByZXRyaWV2ZSBBQ1RJT04gYW5kIGEgcG9zc2libGUgUEFSQU1FVEVSLgorICogSXQgdGhlbiBzcGF3bnMgL2V0Yy9hY3BpLzxBQ1RJT04+Wy88UEFSQU1FVEVSPl0gZWl0aGVyIHZpYSBydW4tcGFydHMKKyAqIChpZiB0aGUgcmVzdWx0aW5nIHBhdGggaXMgYSBkaXJlY3RvcnkpIG9yIGRpcmVjdGx5LgorICogSWYgdGhlIHJlc3VsdGluZyBwYXRoIGRvZXMgbm90IGV4aXN0IGl0IGxvZ3MgaXQgdmlhIHBlcnJvcgorICogYW5kIGNvbnRpbnVlcyBsaXN0ZW5pbmcuCisgKi8KKworc3RhdGljIHZvaWQgcHJvY2Vzc19ldmVudChjb25zdCBjaGFyICpldmVudCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpoYW5kbGVyID0geGFzcHJpbnRmKCIuLyVzIiwgZXZlbnQpOworCWNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsgInJ1bi1wYXJ0cyIsIGhhbmRsZXIsIE5VTEwgfTsKKworCS8vIGRlYnVnIGluZm8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9kKSB7CisJCWJiX2Vycm9yX21zZygiJXMiLCBldmVudCk7CisJfQorCisJLy8gc3Bhd24gaGFuZGxlcgorCS8vIE4uQi4gcnVuLXBhcnRzIHdvdWxkIHJlcXVpcmUgc2NyaXB0cyB0byBoYXZlICMhL2Jpbi9zaAorCS8vIGhhbmRsZXIgaXMgZGlyZWN0b3J5PyAtPiB1c2UgcnVuLXBhcnRzCisJLy8gaGFuZGxlciBpcyBmaWxlPyAtPiBydW4gaXQgZGlyZWN0bHkKKwlpZiAoMCA9PSBzdGF0KGV2ZW50LCAmc3QpKQorCQlzcGF3bigoY2hhciAqKilhcmdzICsgKDA9PShzdC5zdF9tb2RlICYgU19JRkRJUikpKTsKKwllbHNlCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGV2ZW50KTsKKworCWZyZWUoaGFuZGxlcik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2FjdGlvbihzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2LCBjb25zdCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqYWN0aW9uID0gTlVMTDsKKwlpbnQgaTsKKworCS8vIG1hcCBldmVudAorCWZvciAoaSA9IDA7IGkgPCBuX2V2dDsgaSsrKSB7CisJCWlmIChldikgeworCQkJaWYgKGV2LT50eXBlID09IGV2dF90YWJbaV0ubl90eXBlICYmIGV2LT5jb2RlID09IGV2dF90YWJbaV0ubl9jb2RlICYmIGV2LT52YWx1ZSA9PSBldnRfdGFiW2ldLnZhbHVlKSB7CisJCQkJYWN0aW9uID0gZXZ0X3RhYltpXS5kZXNjOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGJ1ZikgeworCQkJaWYgKHN0cm5jbXAoYnVmLCBldnRfdGFiW2ldLmRlc2MsIHN0cmxlbihidWYpKSA9PSAwKSB7CisJCQkJYWN0aW9uID0gZXZ0X3RhYltpXS5kZXNjOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gZ2V0IGFjdGlvbgorCWlmIChhY3Rpb24pIHsKKwkJZm9yIChpID0gMDsgaSA8IG5fYWN0OyBpKyspIHsKKwkJCWlmIChzdHJzdHIoYWN0aW9uLCBhY3RfdGFiW2ldLmtleSkpIHsKKwkJCQlhY3Rpb24gPSBhY3RfdGFiW2ldLmFjdGlvbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBhY3Rpb247Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2NvbmZfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKnRva2Vuc1syXTsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuMihmaWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCisJaWYgKHBhcnNlcikgeworCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDIsIDIsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJYWN0X3RhYiA9IHhyZWFsbG9jX3ZlY3RvcihhY3RfdGFiLCAxLCBuX2FjdCk7CisJCQlhY3RfdGFiW25fYWN0XS5rZXkgPSB4c3RyZHVwKHRva2Vuc1swXSk7CisJCQlhY3RfdGFiW25fYWN0XS5hY3Rpb24gPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQluX2FjdCsrOworCQl9CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0gZWxzZSB7CisJCWFjdF90YWIgPSAodm9pZCopZl9hY3RfdGFiOworCQluX2FjdCA9IEFSUkFZX1NJWkUoZl9hY3RfdGFiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX21hcF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5zWzZdOworCisJcGFyc2VyID0gY29uZmlnX29wZW4yKGZpbGVuYW1lLCBmb3Blbl9mb3JfcmVhZCk7CisKKwlpZiAocGFyc2VyKSB7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgNiwgNiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCQlldnRfdGFiID0geHJlYWxsb2NfdmVjdG9yKGV2dF90YWIsIDEsIG5fZXZ0KTsKKwkJCWV2dF90YWJbbl9ldnRdLnNfdHlwZSA9IHhzdHJkdXAodG9rZW5zWzBdKTsKKwkJCWV2dF90YWJbbl9ldnRdLm5fdHlwZSA9IHhzdHJ0b3UodG9rZW5zWzFdLCAxNik7CisJCQlldnRfdGFiW25fZXZ0XS5zX2NvZGUgPSB4c3RyZHVwKHRva2Vuc1syXSk7CisJCQlldnRfdGFiW25fZXZ0XS5uX2NvZGUgPSB4YXRvdTE2KHRva2Vuc1szXSk7CisJCQlldnRfdGFiW25fZXZ0XS52YWx1ZSA9IHhhdG9pX3Bvc2l0aXZlKHRva2Vuc1s0XSk7CisJCQlldnRfdGFiW25fZXZ0XS5kZXNjID0geHN0cmR1cCh0b2tlbnNbNV0pOworCQkJbl9ldnQrKzsKKwkJfQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9IGVsc2UgeworCQlldnRfdGFiID0gKHZvaWQqKWZfZXZ0X3RhYjsKKwkJbl9ldnQgPSBBUlJBWV9TSVpFKGZfZXZ0X3RhYik7CisJfQorfQorCisvKgorICogYWNwaWQgWy1jIGNvbmZfZGlyXSBbLXIgY29uZl9maWxlIF0gWy1hIG1hcF9maWxlIF0gWy1sIGxvZ19maWxlXSBbLWUgcHJvY19ldmVudF9maWxlXQorICovCisKK2ludCBhY3BpZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYWNwaWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpbnB1dF9ldmVudCBldjsKKwlpbnQgbmZkOworCWludCBvcHRzOworCXN0cnVjdCBwb2xsZmQgKnBmZDsKKwljb25zdCBjaGFyICpvcHRfZGlyID0gIi9ldGMvYWNwaSI7CisJY29uc3QgY2hhciAqb3B0X2lucHV0ID0gIi9kZXYvaW5wdXQvZXZlbnQiOworCWNvbnN0IGNoYXIgKm9wdF9sb2dmaWxlID0gIi92YXIvbG9nL2FjcGlkLmxvZyI7CisJY29uc3QgY2hhciAqb3B0X2FjdGlvbiA9ICIvZXRjL2FjcGlkLmNvbmYiOworCWNvbnN0IGNoYXIgKm9wdF9tYXAgPSAiL2V0Yy9hY3BpLm1hcCI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRQorCWNvbnN0IGNoYXIgKm9wdF9waWRmaWxlID0gIi92YXIvcnVuL2FjcGlkLnBpZCI7CisjZW5kaWYKKworCUlOSVRfRygpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZGY6ZS0tZSI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJjOmRlOmZsOmE6TToiIElGX0ZFQVRVUkVfUElERklMRSgicDoiKSBJRl9GRUFUVVJFX0FDUElEX0NPTVBBVCgiZzptOnM6Uzp2IiksCisJCSZvcHRfZGlyLCAmb3B0X2lucHV0LCAmb3B0X2xvZ2ZpbGUsICZvcHRfYWN0aW9uLCAmb3B0X21hcAorCQlJRl9GRUFUVVJFX1BJREZJTEUoLCAmb3B0X3BpZGZpbGUpCisJCUlGX0ZFQVRVUkVfQUNQSURfQ09NUEFUKCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkKKwkpOworCisJaWYgKCEob3B0cyAmIE9QVF9mKSkgeworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NMT1NFX0VYVFJBX0ZEUywgYXJndik7CisJfQorCisJaWYgKCEob3B0cyAmIE9QVF9kKSkgeworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HIHwgTE9HTU9ERV9TVERJTzsKKwl9IGVsc2UgeworCQl4bW92ZV9mZCh4b3BlbihvcHRfbG9nZmlsZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyksIFNURE9VVF9GSUxFTk8pOworCX0KKworCXBhcnNlX2NvbmZfZmlsZShvcHRfYWN0aW9uKTsKKwlwYXJzZV9tYXBfZmlsZShvcHRfbWFwKTsKKworCXhjaGRpcihvcHRfZGlyKTsKKworCWJiX3NpZ25hbHMoKDEgPDwgU0lHQ0hMRCksIFNJR19JR04pOworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgcmVjb3JkX3NpZ25vKTsKKworCXBmZCA9IE5VTEw7CisJbmZkID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgZmQ7CisJCWNoYXIgKmRldl9ldmVudDsKKworCQlkZXZfZXZlbnQgPSB4YXNwcmludGYoKG9wdGlvbl9tYXNrMzIgJiBPUFRfZSkgPyAiJXMiIDogIiVzJXUiLCBvcHRfaW5wdXQsIG5mZCk7CisJCWZkID0gb3BlbihkZXZfZXZlbnQsIE9fUkRPTkxZIHwgT19OT05CTE9DSyk7CisJCWlmIChmZCA8IDApIHsKKwkJCWlmIChuZmQgPT0gMCkKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGRldl9ldmVudCk7CisJCQlicmVhazsKKwkJfQorCQlwZmQgPSB4cmVhbGxvY192ZWN0b3IocGZkLCAxLCBuZmQpOworCQlwZmRbbmZkXS5mZCA9IGZkOworCQlwZmRbbmZkXS5ldmVudHMgPSBQT0xMSU47CisJCW5mZCsrOworCX0KKworCXdyaXRlX3BpZGZpbGUob3B0X3BpZGZpbGUpOworCisJd2hpbGUgKHBvbGwocGZkLCBuZmQsIC0xKSA+IDApIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBuZmQ7IGkrKykgeworCQkJY29uc3QgY2hhciAqZXZlbnQgPSBOVUxMOworCisJCQltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKworCQkJaWYgKCEocGZkW2ldLnJldmVudHMgJiBQT0xMSU4pKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9lKSB7CisJCQkJY2hhciAqYnVmOworCQkJCWludCBsZW47CisKKwkJCQlidWYgPSB4bWFsbG9jX3JlYWRzKHBmZFtpXS5mZCwgTlVMTCk7CisJCQkJLyogYnVmID0gImJ1dHRvbi9wb3dlciBQV1JCIDAwMDAwMDgwIDAwMDAwMDAwIiAqLworCQkJCWxlbiA9IHN0cmxlbihidWYpIC0gOTsKKwkJCQlpZiAobGVuID49IDApCisJCQkJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJCQlldmVudCA9IGZpbmRfYWN0aW9uKE5VTEwsIGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCWlmIChzaXplb2YoZXYpICE9IGZ1bGxfcmVhZChwZmRbaV0uZmQsICZldiwgc2l6ZW9mKGV2KSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGV2LnZhbHVlICE9IDEgJiYgZXYudmFsdWUgIT0gMCkKKwkJCQkJY29udGludWU7CisKKwkJCQlldmVudCA9IGZpbmRfYWN0aW9uKCZldiwgTlVMTCk7CisJCQl9CisJCQlpZiAoIWV2ZW50KQorCQkJCWNvbnRpbnVlOworCQkJLy8gc3Bhd24gZXZlbnQgaGFuZGxlcgorCQkJcHJvY2Vzc19ldmVudChldmVudCk7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJd2hpbGUgKG5mZC0tKSB7CisJCQlpZiAocGZkW25mZF0uZmQpIHsKKwkJCQljbG9zZShwZmRbbmZkXS5mZCk7CisJCQl9CisJCX0KKwkJZnJlZShwZmQpOworCX0KKwlyZW1vdmVfcGlkZmlsZShvcHRfcGlkZmlsZSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ibGtpZC5jIGIvdXRpbC1saW51eC9ibGtpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2Jsa2lkLmMKQEAgLTAsMCArMSwzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUHJpbnQgVVVJRHMgb24gYWxsIGZpbGVzeXN0ZW1zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERlbnlzIFZsYXNlbmtvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGJsa2lkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgYmxraWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBVVUlEcyBvZiBhbGwgZmlsZXN5c3RlbXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInZvbHVtZV9pZC5oIgorCisvL1RPRE86IGV4dGVuZCB0byB0YWtlIEJMT0NLREVWIGFyZ3MsIGFuZCBzaG93IFRZUEU9ImZzdHlwZSIKKworaW50IGJsa2lkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBibGtpZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJLyogTm90ZTogYm9ndXMgZGV2aWNlIG5hbWVzIGRvbid0IGNhdXNlIGFueSBlcnJvciBtZXNzYWdlcyAqLworCQlhZGRfdG9fdXVpZF9jYWNoZSgqYXJndik7CisJfQorCisJZGlzcGxheV91dWlkX2NhY2hlKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2Jsb2NrZGV2LmMgYi91dGlsLWxpbnV4L2Jsb2NrZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZTUyOQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvYmxvY2tkZXYuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIGJsb2NrZGV2IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlcmdleSBOYXVtb3YgPHNrbmF1bW92QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0JMT0NLREVWKEFQUExFVChibG9ja2RldiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19CTE9DS0RFVikgKz0gYmxvY2tkZXYubworCisvL2NvbmZpZzpjb25maWcgQkxPQ0tERVYKKy8vY29uZmlnOglib29sICJibG9ja2RldiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQZXJmb3JtcyBzb21lIGlvY3RscyB3aXRoIGJsb2NrIGRldmljZXMuCisKKy8vdXNhZ2U6I2RlZmluZSBibG9ja2Rldl90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiT1BUSU9OIEJMT0NLREVWIgorLy91c2FnZTojZGVmaW5lIGJsb2NrZGV2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS0tc2V0cm8JCVNldCBybyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1zZXRydwkJU2V0IHJ3IgorLy91c2FnZTogICAgICJcbgktLWdldHJvCQlHZXQgcm8iCisvL3VzYWdlOiAgICAgIlxuCS0tZ2V0c3MJCUdldCBzZWN0b3Igc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLS1nZXRic3oJR2V0IGJsb2NrIHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS0tc2V0YnN6IEJZVEVTCVNldCBibG9jayBzaXplIgorLy91c2FnZTogICAgICJcbgktLWdldHN6CQlHZXQgZGV2aWNlIHNpemUgaW4gNTEyLWJ5dGUgc2VjdG9ycyIKKy8qLy91c2FnZTogICAgICJcbgktLWdldHNpemUJR2V0IGRldmljZSBzaXplIGluIHNlY3RvcnMgKGRlcHJlY2F0ZWQpIiovCisvL3VzYWdlOiAgICAgIlxuCS0tZ2V0c2l6ZTY0CUdldCBkZXZpY2Ugc2l6ZSBpbiBieXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1mbHVzaGJ1ZnMJRmx1c2ggYnVmZmVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1yZXJlYWRwdAlSZXJlYWQgcGFydGl0aW9uIHRhYmxlIgorCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK2VudW0geworCUFSR19OT05FICAgPSAwLAorCUFSR19JTlQgICAgPSAxLAorCUFSR19VTE9ORyAgPSAyLAorCS8qIFllcywgQkxLR0VUU0laRTY0IHRha2VzIHBvaW50ZXIgdG8gdWludDY0X3QsIG5vdCB1bGxvbmchICovCisJQVJHX1U2NCAgICA9IDMsCisJQVJHX01BU0sgICA9IDMsCisKKwlGTF9VU1JBUkcgICA9IDQsIC8qIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGJ5IHVzZXIgKi8KKwlGTF9OT1JFU1VMVCA9IDgsCisJRkxfU0NBTEU1MTIgPSAxNiwKK307CisKK3N0cnVjdCBiZGMgeworCXVpbnQzMl90ICAgaW9jOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW9jdGwgY29kZSAqLworCWNvbnN0IGNoYXIgbmFtZVtzaXplb2YoImZsdXNoYnVmcyIpXTsgLyogIi0tc2V0Zm9vIiB3b3Rob3V0ICItLSIgKi8KKwl1aW50OF90ICAgIGZsYWdzOworCWludDhfdCAgICAgYXJndmFsOyAgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCBhcmd1bWVudCB2YWx1ZSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBiZGMgYmRjb21tYW5kc1tdID0geworCXsKKwkJLmlvYyA9IEJMS1JPU0VULAorCQkubmFtZSA9ICJzZXRybyIsCisJCS5mbGFncyA9IEFSR19JTlQgKyBGTF9OT1JFU1VMVCwKKwkJLmFyZ3ZhbCA9IDEsCisJfSx7CisJCS5pb2MgPSBCTEtST1NFVCwKKwkJLm5hbWUgPSAic2V0cnciLAorCQkuZmxhZ3MgPSBBUkdfSU5UICsgRkxfTk9SRVNVTFQsCisJCS5hcmd2YWwgPSAwLAorCX0seworCQkuaW9jID0gQkxLUk9HRVQsCisJCS5uYW1lID0gImdldHJvIiwKKwkJLmZsYWdzID0gQVJHX0lOVCwKKwkJLmFyZ3ZhbCA9IC0xLAorCX0seworCQkuaW9jID0gQkxLU1NaR0VULAorCQkubmFtZSA9ICJnZXRzcyIsCisJCS5mbGFncyA9IEFSR19JTlQsCisJCS5hcmd2YWwgPSAtMSwKKwl9LHsKKwkJLmlvYyA9IEJMS0JTWkdFVCwKKwkJLm5hbWUgPSAiZ2V0YnN6IiwKKwkJLmZsYWdzID0gQVJHX0lOVCwKKwkJLmFyZ3ZhbCA9IC0xLAorCX0seworCQkuaW9jID0gQkxLQlNaU0VULAorCQkubmFtZSA9ICJzZXRic3oiLAorCQkuZmxhZ3MgPSBBUkdfSU5UICsgRkxfTk9SRVNVTFQgKyBGTF9VU1JBUkcsCisJCS5hcmd2YWwgPSAwLAorCX0seworCQkuaW9jID0gQkxLR0VUU0laRTY0LAorCQkubmFtZSA9ICJnZXRzeiIsCisJCS5mbGFncyA9IEFSR19VNjQgKyBGTF9TQ0FMRTUxMiwKKwkJLmFyZ3ZhbCA9IC0xLAorCX0seworCQkuaW9jID0gQkxLR0VUU0laRSwKKwkJLm5hbWUgPSAiZ2V0c2l6ZSIsCisJCS5mbGFncyA9IEFSR19VTE9ORywKKwkJLmFyZ3ZhbCA9IC0xLAorCX0seworCQkuaW9jID0gQkxLR0VUU0laRTY0LAorCQkubmFtZSA9ICJnZXRzaXplNjQiLAorCQkuZmxhZ3MgPSBBUkdfVTY0LAorCQkuYXJndmFsID0gLTEsCisJfSx7CisJCS5pb2MgPSBCTEtGTFNCVUYsCisJCS5uYW1lID0gImZsdXNoYnVmcyIsCisJCS5mbGFncyA9IEFSR19OT05FICsgRkxfTk9SRVNVTFQsCisJCS5hcmd2YWwgPSAwLAorCX0seworCQkuaW9jID0gQkxLUlJQQVJULAorCQkubmFtZSA9ICJyZXJlYWRwdCIsCisJCS5mbGFncyA9IEFSR19OT05FICsgRkxfTk9SRVNVTFQsCisJCS5hcmd2YWwgPSAwLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmRjICpmaW5kX2NtZChjb25zdCBjaGFyICpzKQoreworCWNvbnN0IHN0cnVjdCBiZGMgKmJkY21kID0gYmRjb21tYW5kczsKKwlpZiAoc1swXSA9PSAnLScgJiYgc1sxXSA9PSAnLScpIHsKKwkJcyArPSAyOworCQlkbyB7CisJCQlpZiAoc3RyY21wKHMsIGJkY21kLT5uYW1lKSA9PSAwKQorCQkJCXJldHVybiBiZGNtZDsKKwkJCWJkY21kKys7CisJCX0gd2hpbGUgKGJkY21kICE9IGJkY29tbWFuZHMgKyBBUlJBWV9TSVpFKGJkY29tbWFuZHMpKTsKKwl9CisJYmJfc2hvd191c2FnZSgpOworfQorCitpbnQgYmxvY2tkZXZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJsb2NrZGV2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBzdHJ1Y3QgYmRjICpiZGNtZDsKKwlpbnQgZmQ7CisJdWludDY0X3QgdTY0OworCXVuaW9uIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgbHU7CisJCXVpbnQ2NF90IHU2NDsKKwl9IGlvY3RsX3ZhbF9vbl9zdGFjazsKKworCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMF0gfHwgIWFyZ3ZbMV0pIC8qIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGFyZ3MgKi8KKwkJYmJfc2hvd191c2FnZSgpOworCisJYmRjbWQgPSBmaW5kX2NtZCgqYXJndik7CisKKwl1NjQgPSAoaW50KWJkY21kLT5hcmd2YWw7CisJaWYgKGJkY21kLT5mbGFncyAmIEZMX1VTUkFSRykKKwkJdTY0ID0geGF0b2lfcG9zaXRpdmUoKisrYXJndik7CisKKwlhcmd2Kys7CisJaWYgKCFhcmd2WzBdIHx8IGFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlmZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKworCWlvY3RsX3ZhbF9vbl9zdGFjay51NjQgPSB1NjQ7CisjaWYgQkJfQklHX0VORElBTgorCS8qIFN0b3JlIGRhdGEgcHJvcGVybHkgd3J0IGRhdGEgc2l6ZS4KKwkgKiAoMSkgSXQncyBuby1vcCBmb3IgbGl0dGxlLWVuZGlhbi4KKwkgKiAoMikgaXQncyBuby1vcCBmb3IgMCBhbmQgLTEuIE9ubHkgLS1zZXRybyB1c2VzIGFyZyAhPSAwIGFuZCAhPSAtMSwKKwkgKiBhbmQgaXQgaXMgQVJHX0lOVC4gLS1zZXRic3ogVVNFUl9WQUwgaXMgYWxzbyBBUkdfSU5ULgorCSAqIFRodXMsIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIEFSR19VTE9ORy4KKwkgKi8KKwlzd2l0Y2ggKGJkY21kLT5mbGFncyAmIEFSR19NQVNLKSB7CisJY2FzZSBBUkdfSU5UOgorCQlpb2N0bF92YWxfb25fc3RhY2suaSA9IChpbnQpdTY0OworCQlicmVhazsKKyMgaWYgMCAvKiB1bnVzZWQgKi8KKwljYXNlIEFSR19VTE9ORzoKKwkJaW9jdGxfdmFsX29uX3N0YWNrLmx1ID0gKHVuc2lnbmVkIGxvbmcpdTY0OworCQlicmVhazsKKyMgZW5kaWYKKwl9CisjZW5kaWYKKworCWlmIChpb2N0bChmZCwgYmRjbWQtPmlvYywgJmlvY3RsX3ZhbF9vbl9zdGFjay51NjQpID09IC0xKQorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKCphcmd2KTsKKworCS8qIEZldGNoIGl0IGludG8gcmVnaXN0ZXIocykgKi8KKwl1NjQgPSBpb2N0bF92YWxfb25fc3RhY2sudTY0OworCisJaWYgKGJkY21kLT5mbGFncyAmIEZMX1NDQUxFNTEyKQorCQl1NjQgPj49IDk7CisKKwkvKiBaZXJvLSBvciBvbmUtZXh0ZW5kIHRoZSB2YWx1ZSBpZiBuZWVkZWQsIHRoZW4gcHJpbnQgKi8KKwlzd2l0Y2ggKGJkY21kLT5mbGFncyAmIChBUkdfTUFTSytGTF9OT1JFU1VMVCkpIHsKKwljYXNlIEFSR19JTlQ6CisJCS8qIFNtYWxsZXIgY29kZSB3aGVuIHdlIHVzZSBsb25nIGxvbmcKKwkJICogKGdjYyB0YWlsLW1lcmdlcyBwcmludGYgY2FsbCkKKwkJICovCisJCXByaW50ZigiJWxsZFxuIiwgKGxvbmcgbG9uZykoaW50KXU2NCk7CisJCWJyZWFrOworCWNhc2UgQVJHX1VMT05HOgorCQl1NjQgPSAodW5zaWduZWQgbG9uZyl1NjQ7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBBUkdfVTY0OgorCQlwcmludGYoIiVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdTY0KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZG1lc2cuYyBiL3V0aWwtbGludXgvZG1lc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA1ZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9kbWVzZy5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqCisgKiBkbWVzZyAtIGRpc3BsYXkvY29udHJvbCBrZXJuZWwgcmluZyBidWZmZXIuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlciA8cmVwLm5vcEBhb24uYXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZG1lc2dfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY10gWy1uIExFVkVMXSBbLXMgU0laRV0iCisvL3VzYWdlOiNkZWZpbmUgZG1lc2dfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBvciBjb250cm9sIHRoZSBrZXJuZWwgcmluZyBidWZmZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJCUNsZWFyIHJpbmcgYnVmZmVyIGFmdGVyIHByaW50aW5nIgorLy91c2FnZTogICAgICJcbgktbiBMRVZFTAlTZXQgY29uc29sZSBsb2dnaW5nIGxldmVsIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlCdWZmZXIgc2l6ZSIKKworI2luY2x1ZGUgPHN5cy9rbG9nLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IGRtZXNnX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkbWVzZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGxlbiwgbGV2ZWw7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIG9wdHM7CisJZW51bSB7CisJCU9QVF9jID0gMSA8PCAwLAorCQlPUFRfcyA9IDEgPDwgMSwKKwkJT1BUX24gPSAxIDw8IDIKKwl9OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAicys6bisiOyAvKiBudW1lcmljICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJjczpuOiIsICZsZW4sICZsZXZlbCk7CisJaWYgKG9wdHMgJiBPUFRfbikgeworCQlpZiAoa2xvZ2N0bCg4LCBOVUxMLCAobG9uZykgbGV2ZWwpKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJrbG9nY3RsIik7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJaWYgKCEob3B0cyAmIE9QVF9zKSkKKwkJbGVuID0ga2xvZ2N0bCgxMCwgTlVMTCwgMCk7IC8qIHJlYWQgcmluZyBidWZmZXIgc2l6ZSAqLworCWlmIChsZW4gPCAxNioxMDI0KQorCQlsZW4gPSAxNioxMDI0OworCWlmIChsZW4gPiAxNioxMDI0KjEwMjQpCisJCWxlbiA9IDE2KjEwMjQqMTAyNDsKKworCWJ1ZiA9IHhtYWxsb2MobGVuKTsKKwlsZW4gPSBrbG9nY3RsKDMgKyAob3B0cyAmIE9QVF9jKSwgYnVmLCBsZW4pOyAvKiByZWFkIHJpbmcgYnVmZmVyICovCisJaWYgKGxlbiA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgia2xvZ2N0bCIpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0RNRVNHX1BSRVRUWSkgeworCQlpbnQgbGFzdCA9ICdcbic7CisJCWludCBpbiA9IDA7CisKKwkJLyogU2tpcCA8Iz4gYXQgdGhlIHN0YXJ0IG9mIGxpbmVzICovCisJCXdoaWxlICgxKSB7CisJCQlpZiAobGFzdCA9PSAnXG4nICYmIGJ1Zltpbl0gPT0gJzwnKSB7CisJCQkJaW4gKz0gMzsKKwkJCQlpZiAoaW4gPj0gbGVuKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWxhc3QgPSBidWZbaW5dOworCQkJcHV0Y2hhcihsYXN0KTsKKwkJCWluKys7CisJCQlpZiAoaW4gPj0gbGVuKQorCQkJCWJyZWFrOworCQl9CisJCS8qIE1ha2Ugc3VyZSB3ZSBlbmQgd2l0aCBhIG5ld2xpbmUgKi8KKwkJaWYgKGxhc3QgIT0gJ1xuJykKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIHsKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIGxlbik7CisJCWlmIChidWZbbGVuLTFdICE9ICdcbicpCisJCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShidWYpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZmJzZXQuYyBiL3V0aWwtbGludXgvZmJzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZjMmFhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mYnNldC5jCkBAIC0wLDAgKzEsNTExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZic2V0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBpcyBhIGZyb20tc2NyYXRjaCBpbXBsZW1lbnRhdGlvbiBvZiBmYnNldDsgYnV0IHRoZSBkZSBmYWN0byBmYnNldAorICogaW1wbGVtZW50YXRpb24gd2FzIGEgZ29vZCByZWZlcmVuY2UuIGZic2V0IChvcmlnaW5hbCkgaXMgcmVsZWFzZWQgdW5kZXIKKyAqIHRoZSBHUEwsIGFuZCBpcyAoYykgMTk5NS0xOTk5IGJ5OgorICogICAgIEdlZXJ0IFV5dHRlcmhvZXZlbiAoR2VlcnQuVXl0dGVyaG9ldmVuQGNzLmt1bGV1dmVuLmFjLmJlKQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmYnNldF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtNT0RFXSIKKy8vdXNhZ2U6I2RlZmluZSBmYnNldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgYW5kIG1vZGlmeSBmcmFtZSBidWZmZXIgc2V0dGluZ3MiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZic2V0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGZic2V0XG4iCisvL3VzYWdlOiAgICAgICAibW9kZSBcIjEwMjR4NzY4LTc2XCJcbiIKKy8vdXNhZ2U6ICAgICAgICIJIyBEOiA3OC42NTMgTUh6LCBIOiA1OS45NDkga0h6LCBWOiA3NS42OTQgSHpcbiIKKy8vdXNhZ2U6ICAgICAgICIJZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCA3NjggMTZcbiIKKy8vdXNhZ2U6ICAgICAgICIJdGltaW5ncyAxMjcxNCAxMjggMzIgMTYgNCAxMjggNFxuIgorLy91c2FnZTogICAgICAgIglhY2NlbCBmYWxzZVxuIgorLy91c2FnZTogICAgICAgIglyZ2JhIDUvMTEsNi81LDUvMCwwLzBcbiIKKy8vdXNhZ2U6ICAgICAgICJlbmRtb2RlXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIERFRkFVTFRGQkRFViAgRkJfMAorI2RlZmluZSBERUZBVUxURkJNT0RFICIvZXRjL2ZiLm1vZGVzIgorCisvKiBTdHVmZiBzdG9sZW4gZnJvbSB0aGUga2VybmVsJ3MgZmIuaCAqLworI2RlZmluZSBGQl9BQ1RJVkFURV9BTEwgNjQKK2VudW0geworCUZCSU9HRVRfVlNDUkVFTklORk8gPSAweDQ2MDAsCisJRkJJT1BVVF9WU0NSRUVOSU5GTyA9IDB4NDYwMQorfTsKKworc3RydWN0IGZiX2JpdGZpZWxkIHsKKwl1aW50MzJfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIGJlZ2lubmluZyBvZiBiaXRmaWVsZCAqLworCXVpbnQzMl90IGxlbmd0aDsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGJpdGZpZWxkICovCisJdWludDMyX3QgbXNiX3JpZ2h0OyAgICAgICAgICAgICAvKiAhPTA6IE1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHJpZ2h0ICovCit9Oworc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHsKKwl1aW50MzJfdCB4cmVzOyAgICAgICAgICAgICAgICAgIC8qIHZpc2libGUgcmVzb2x1dGlvbiAqLworCXVpbnQzMl90IHlyZXM7CisJdWludDMyX3QgeHJlc192aXJ0dWFsOyAgICAgICAgICAvKiB2aXJ0dWFsIHJlc29sdXRpb24gKi8KKwl1aW50MzJfdCB5cmVzX3ZpcnR1YWw7CisJdWludDMyX3QgeG9mZnNldDsgICAgICAgICAgICAgICAvKiBvZmZzZXQgZnJvbSB2aXJ0dWFsIHRvIHZpc2libGUgKi8KKwl1aW50MzJfdCB5b2Zmc2V0OyAgICAgICAgICAgICAgIC8qIHJlc29sdXRpb24gKi8KKworCXVpbnQzMl90IGJpdHNfcGVyX3BpeGVsOworCXVpbnQzMl90IGdyYXlzY2FsZTsgICAgICAgICAgICAgLyogIT0wIEdyYXlsZXZlbHMgaW5zdGVhZCBvZiBjb2xvcnMgKi8KKworCXN0cnVjdCBmYl9iaXRmaWVsZCByZWQ7ICAgICAgICAgLyogYml0ZmllbGQgaW4gZmIgbWVtIGlmIHRydWUgY29sb3IsICovCisJc3RydWN0IGZiX2JpdGZpZWxkIGdyZWVuOyAgICAgICAvKiBlbHNlIG9ubHkgbGVuZ3RoIGlzIHNpZ25pZmljYW50ICovCisJc3RydWN0IGZiX2JpdGZpZWxkIGJsdWU7CisJc3RydWN0IGZiX2JpdGZpZWxkIHRyYW5zcDsgICAgICAvKiB0cmFuc3BhcmVuY3kgKi8KKworCXVpbnQzMl90IG5vbnN0ZDsgICAgICAgICAgICAgICAgLyogIT0wIE5vbiBzdGFuZGFyZCBwaXhlbCBmb3JtYXQgKi8KKworCXVpbnQzMl90IGFjdGl2YXRlOyAgICAgICAgICAgICAgLyogc2VlIEZCX0FDVElWQVRFX3ggKi8KKworCXVpbnQzMl90IGhlaWdodDsgICAgICAgICAgICAgICAgLyogaGVpZ2h0IG9mIHBpY3R1cmUgaW4gbW0gKi8KKwl1aW50MzJfdCB3aWR0aDsgICAgICAgICAgICAgICAgIC8qIHdpZHRoIG9mIHBpY3R1cmUgaW4gbW0gKi8KKworCXVpbnQzMl90IGFjY2VsX2ZsYWdzOyAgICAgICAgICAgLyogYWNjZWxlcmF0aW9uIGZsYWdzIChoaW50cykgKi8KKworCS8qIFRpbWluZzogQWxsIHZhbHVlcyBpbiBwaXhjbG9ja3MsIGV4Y2VwdCBwaXhjbG9jayAob2YgY291cnNlKSAqLworCXVpbnQzMl90IHBpeGNsb2NrOyAgICAgICAgICAgICAgLyogcGl4ZWwgY2xvY2sgaW4gcHMgKHBpY28gc2Vjb25kcykgKi8KKwl1aW50MzJfdCBsZWZ0X21hcmdpbjsgICAgICAgICAgIC8qIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUgKi8KKwl1aW50MzJfdCByaWdodF9tYXJnaW47ICAgICAgICAgIC8qIHRpbWUgZnJvbSBwaWN0dXJlIHRvIHN5bmMgKi8KKwl1aW50MzJfdCB1cHBlcl9tYXJnaW47ICAgICAgICAgIC8qIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUgKi8KKwl1aW50MzJfdCBsb3dlcl9tYXJnaW47CisJdWludDMyX3QgaHN5bmNfbGVuOyAgICAgICAgICAgICAvKiBsZW5ndGggb2YgaG9yaXpvbnRhbCBzeW5jICovCisJdWludDMyX3QgdnN5bmNfbGVuOyAgICAgICAgICAgICAvKiBsZW5ndGggb2YgdmVydGljYWwgc3luYyAqLworCXVpbnQzMl90IHN5bmM7ICAgICAgICAgICAgICAgICAgLyogc2VlIEZCX1NZTkNfeCAqLworCXVpbnQzMl90IHZtb2RlOyAgICAgICAgICAgICAgICAgLyogc2VlIEZCX1ZNT0RFX3ggKi8KKwl1aW50MzJfdCByZXNlcnZlZFs2XTsgICAgICAgICAgIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworfTsKKworc3RhdGljIHZvaWQgY29weV9pZl9ndDAodWludDMyX3QgKnNyYywgdWludDMyX3QgKmRzdCwgdW5zaWduZWQgY250KQoreworCWRvIHsKKwkJaWYgKChpbnQzMl90KSAqc3JjID4gMCkKKwkJCSpkc3QgPSAqc3JjOworCQlzcmMrKzsKKwkJZHN0Kys7CisJfSB3aGlsZSAoLS1jbnQpOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBjb3B5X2NoYW5nZWRfdmFsdWVzKAorCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKmJhc2UsCisJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqc2V0KQoreworCS8vaWYgKChpbnQzMl90KSBzZXQtPnhyZXMgPiAwKSBiYXNlLT54cmVzID0gc2V0LT54cmVzOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnlyZXMgPiAwKSBiYXNlLT55cmVzID0gc2V0LT55cmVzOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnhyZXNfdmlydHVhbCA+IDApICAgYmFzZS0+eHJlc192aXJ0dWFsID0gc2V0LT54cmVzX3ZpcnR1YWw7CisJLy9pZiAoKGludDMyX3QpIHNldC0+eXJlc192aXJ0dWFsID4gMCkgICBiYXNlLT55cmVzX3ZpcnR1YWwgPSBzZXQtPnlyZXNfdmlydHVhbDsKKwljb3B5X2lmX2d0MCgmc2V0LT54cmVzLCAmYmFzZS0+eHJlcywgNCk7CisKKwlpZiAoKGludDMyX3QpIHNldC0+Yml0c19wZXJfcGl4ZWwgPiAwKSBiYXNlLT5iaXRzX3Blcl9waXhlbCA9IHNldC0+Yml0c19wZXJfcGl4ZWw7CisJLy9jb3B5X2lmX2d0MCgmc2V0LT5iaXRzX3Blcl9waXhlbCwgJmJhc2UtPmJpdHNfcGVyX3BpeGVsLCAxKTsKKworCS8vaWYgKChpbnQzMl90KSBzZXQtPnBpeGNsb2NrID4gMCkgICAgICAgYmFzZS0+cGl4Y2xvY2sgPSBzZXQtPnBpeGNsb2NrOworCS8vaWYgKChpbnQzMl90KSBzZXQtPmxlZnRfbWFyZ2luID4gMCkgICAgYmFzZS0+bGVmdF9tYXJnaW4gPSBzZXQtPmxlZnRfbWFyZ2luOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnJpZ2h0X21hcmdpbiA+IDApICAgYmFzZS0+cmlnaHRfbWFyZ2luID0gc2V0LT5yaWdodF9tYXJnaW47CisJLy9pZiAoKGludDMyX3QpIHNldC0+dXBwZXJfbWFyZ2luID4gMCkgICBiYXNlLT51cHBlcl9tYXJnaW4gPSBzZXQtPnVwcGVyX21hcmdpbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5sb3dlcl9tYXJnaW4gPiAwKSAgIGJhc2UtPmxvd2VyX21hcmdpbiA9IHNldC0+bG93ZXJfbWFyZ2luOworCS8vaWYgKChpbnQzMl90KSBzZXQtPmhzeW5jX2xlbiA+IDApIGJhc2UtPmhzeW5jX2xlbiA9IHNldC0+aHN5bmNfbGVuOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnZzeW5jX2xlbiA+IDApIGJhc2UtPnZzeW5jX2xlbiA9IHNldC0+dnN5bmNfbGVuOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnN5bmMgPiAwKSAgYmFzZS0+c3luYyA9IHNldC0+c3luYzsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT52bW9kZSA+IDApIGJhc2UtPnZtb2RlID0gc2V0LT52bW9kZTsKKwljb3B5X2lmX2d0MCgmc2V0LT5waXhjbG9jaywgJmJhc2UtPnBpeGNsb2NrLCA5KTsKK30KKworCitlbnVtIHsKKwlDTURfRkIgPSAxLAorCUNNRF9EQiA9IDIsCisJQ01EX0dFT01FVFJZID0gMywKKwlDTURfVElNSU5HID0gNCwKKwlDTURfQUNDRUwgPSA1LAorCUNNRF9IU1lOQyA9IDYsCisJQ01EX1ZTWU5DID0gNywKKwlDTURfTEFDRUQgPSA4LAorCUNNRF9ET1VCTEUgPSA5LAorLyoJQ01EX1hDT01QQVQgPSAgICAgMTAsICovCisJQ01EX0FMTCA9IDExLAorCUNNRF9JTkZPID0gMTIsCisJQ01EX1NIT1cgPSAxMywKKwlDTURfQ0hBTkdFID0gMTQsCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9GQU5DWQorCUNNRF9YUkVTID0gMTAwLAorCUNNRF9ZUkVTID0gMTAxLAorCUNNRF9WWFJFUyA9IDEwMiwKKwlDTURfVllSRVMgPSAxMDMsCisJQ01EX0RFUFRIID0gMTA0LAorCUNNRF9NQVRDSCA9IDEwNSwKKwlDTURfUElYQ0xPQ0sgPSAxMDYsCisJQ01EX0xFRlQgPSAxMDcsCisJQ01EX1JJR0hUID0gMTA4LAorCUNNRF9VUFBFUiA9IDEwOSwKKwlDTURfTE9XRVIgPSAxMTAsCisJQ01EX0hTTEVOID0gMTExLAorCUNNRF9WU0xFTiA9IDExMiwKKwlDTURfQ1NZTkMgPSAxMTMsCisJQ01EX0dTWU5DID0gMTE0LAorCUNNRF9FWFRTWU5DID0gMTE1LAorCUNNRF9CQ0FTVCA9IDExNiwKKwlDTURfUkdCQSA9IDExNywKKwlDTURfU1RFUCA9IDExOCwKKwlDTURfTU9WRSA9IDExOSwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWRvcHRpb25zX3QgeworCWNvbnN0IGNoYXIgbmFtZVs5XTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHBhcmFtX2NvdW50OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgY29kZTsKK30gZ19jbWRvcHRpb25zW10gPSB7CisJLyoiMTIzNDU2NzgiICsgTlVMICovCisJeyAiZmIiICAgICAgLCAxLCBDTURfRkIgICAgICAgfSwKKwl7ICJkYiIgICAgICAsIDEsIENNRF9EQiAgICAgICB9LAorCXsgImEiICAgICAgICwgMCwgQ01EX0FMTCAgICAgIH0sCisJeyAiaSIgICAgICAgLCAwLCBDTURfSU5GTyAgICAgfSwKKwl7ICJnIiAgICAgICAsIDUsIENNRF9HRU9NRVRSWSB9LAorCXsgInQiICAgICAgICwgNywgQ01EX1RJTUlORyAgIH0sCisJeyAiYWNjZWwiICAgLCAxLCBDTURfQUNDRUwgICAgfSwKKwl7ICJoc3luYyIgICAsIDEsIENNRF9IU1lOQyAgICB9LAorCXsgInZzeW5jIiAgICwgMSwgQ01EX1ZTWU5DICAgIH0sCisJeyAibGFjZWQiICAgLCAxLCBDTURfTEFDRUQgICAgfSwKKwl7ICJkb3VibGUiICAsIDEsIENNRF9ET1VCTEUgICB9LAorCXsgInNob3ciICAgICwgMCwgQ01EX1NIT1cgICAgIH0sCisJeyAicyIgICAgICAgLCAwLCBDTURfU0hPVyAgICAgfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9GQU5DWQorCXsgImFsbCIgICAgICwgMCwgQ01EX0FMTCAgICAgIH0sCisJeyAieHJlcyIgICAgLCAxLCBDTURfWFJFUyAgICAgfSwKKwl7ICJ5cmVzIiAgICAsIDEsIENNRF9ZUkVTICAgICB9LAorCXsgInZ4cmVzIiAgICwgMSwgQ01EX1ZYUkVTICAgIH0sCisJeyAidnlyZXMiICAgLCAxLCBDTURfVllSRVMgICAgfSwKKwl7ICJkZXB0aCIgICAsIDEsIENNRF9ERVBUSCAgICB9LAorCXsgIm1hdGNoIiAgICwgMCwgQ01EX01BVENIICAgIH0sCisJeyAiZ2VvbWV0cnkiLCA1LCBDTURfR0VPTUVUUlkgfSwKKwl7ICJwaXhjbG9jayIsIDEsIENNRF9QSVhDTE9DSyB9LAorCXsgImxlZnQiICAgICwgMSwgQ01EX0xFRlQgICAgIH0sCisJeyAicmlnaHQiICAgLCAxLCBDTURfUklHSFQgICAgfSwKKwl7ICJ1cHBlciIgICAsIDEsIENNRF9VUFBFUiAgICB9LAorCXsgImxvd2VyIiAgICwgMSwgQ01EX0xPV0VSICAgIH0sCisJeyAiaHNsZW4iICAgLCAxLCBDTURfSFNMRU4gICAgfSwKKwl7ICJ2c2xlbiIgICAsIDEsIENNRF9WU0xFTiAgICB9LAorCXsgInRpbWluZ3MiICwgNywgQ01EX1RJTUlORyAgIH0sCisJeyAiY3N5bmMiICAgLCAxLCBDTURfQ1NZTkMgICAgfSwKKwl7ICJnc3luYyIgICAsIDEsIENNRF9HU1lOQyAgICB9LAorCXsgImV4dHN5bmMiICwgMSwgQ01EX0VYVFNZTkMgIH0sCisJeyAiYmNhc3QiICAgLCAxLCBDTURfQkNBU1QgICAgfSwKKwl7ICJyZ2JhIiAgICAsIDEsIENNRF9SR0JBICAgICB9LAorCXsgInN0ZXAiICAgICwgMSwgQ01EX1NURVAgICAgIH0sCisJeyAibW92ZSIgICAgLCAxLCBDTURfTU9WRSAgICAgfSwKKyNlbmRpZgorfTsKKworLyogdGFrZW4gZnJvbSBsaW51eC9mYi5oICovCitlbnVtIHsKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVCA9IDEsICAgICAgIC8qIGhvcml6b250YWwgc3luYyBoaWdoIGFjdGl2ZSAqLworCUZCX1NZTkNfVkVSVF9ISUdIX0FDVCA9IDIsICAgICAgLyogdmVydGljYWwgc3luYyBoaWdoIGFjdGl2ZSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0ZCU0VUX1JFQURNT0RFCisJRkJfVk1PREVfSU5URVJMQUNFRCA9IDEsICAgICAgICAvKiBpbnRlcmxhY2VkICovCisJRkJfVk1PREVfRE9VQkxFID0gMiwgICAgICAgICAgICAvKiBkb3VibGUgc2NhbiAqLworCUZCX1NZTkNfRVhUID0gNCwgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgc3luYyAqLworCUZCX1NZTkNfQ09NUF9ISUdIX0FDVCA9IDgsICAgICAgLyogY29tcG9zaXRlIHN5bmMgaGlnaCBhY3RpdmUgKi8KKyNlbmRpZgorfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZCU0VUX1JFQURNT0RFCitzdGF0aWMgdm9pZCBzcyh1aW50MzJfdCAqeCwgdWludDMyX3QgZmxhZywgY2hhciAqYnVmLCBjb25zdCBjaGFyICp3aGF0KQoreworCWlmIChzdHJjbXAoYnVmLCB3aGF0KSA9PSAwKQorCQkqeCAmPSB+ZmxhZzsKKwllbHNlCisJCSp4IHw9IGZsYWc7Cit9CisKKy8qIE1vZGUgZGIgZmlsZSBjb250YWlucyBtb2RlIGRlZmluaXRpb25zIGxpa2UgdGhpczoKKyAqIG1vZGUgIjgwMHg2MDAtNDgtbGFjZSIKKyAqICAgICAjIEQ6IDM2LjAwIE1IeiwgSDogMzMuODM1IGtIeiwgVjogOTYuMzkgSHoKKyAqICAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCA2MDAgOAorICogICAgIHRpbWluZ3MgMjc3NzggNTYgODAgNzkgMTEgMTI4IDEyCisgKiAgICAgbGFjZWQgdHJ1ZQorICogICAgIGhzeW5jIGhpZ2gKKyAqICAgICB2c3luYyBoaWdoCisgKiBlbmRtb2RlCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9tb2RlX2RiKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqYmFzZSwgY29uc3QgY2hhciAqZm4sCisJCQkJCWNvbnN0IGNoYXIgKm1vZGUpCit7CisJY2hhciAqdG9rZW5bMl0sICpwLCAqczsKKwlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4oZm4pOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDEsICIjIFx0XHIiLCBQQVJTRV9OT1JNQUwpKSB7CisJCWlmIChzdHJjbXAodG9rZW5bMF0sICJtb2RlIikgIT0gMCB8fCAhdG9rZW5bMV0pCisJCQljb250aW51ZTsKKwkJcCA9IHN0cnN0cih0b2tlblsxXSwgbW9kZSk7CisJCWlmICghcCkKKwkJCWNvbnRpbnVlOworCQlzID0gcCArIHN0cmxlbihtb2RlKTsKKwkJLy9iYl9pbmZvX21zZygiQ0hFQ0tbJXNdWyVzXVslZF0iLCBtb2RlLCBwLTEsICpzKTsKKwkJLyogZXhhY3QgbWF0Y2g/ICovCisJCWlmICgoKCEqcyB8fCBpc3NwYWNlKCpzKSkgJiYgJyInICE9IHNbLTFdKSAvKiBlbmQtb2YtdG9rZW4gKi8KKwkJIHx8ICgnIicgPT0gKnMgJiYgJyInID09IHBbLTFdKSAvKiBlbmRzIHdpdGggIiBidXQgc3RhcnRzIHdpdGggIiB0b28hICovCisJCSkgeworCQkJLy9iYl9pbmZvX21zZygiRk9VTkRbJXNdWyVzXVslc11bJWRdIiwgdG9rZW5bMV0sIHAsIG1vZGUsIGlzc3BhY2UoKnMpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCF0b2tlblswXSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCWludCBpOworCisvL2JiX2luZm9fbXNnKCI/Pz9bJXNdWyVzXSIsIHRva2VuWzBdLCB0b2tlblsxXSk7CisJCWlmIChzdHJjbXAodG9rZW5bMF0sICJlbmRtb2RlIikgPT0gMCkgeworLy9iYl9pbmZvX21zZygiT0tbJXNdIiwgbW9kZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlwID0gdG9rZW5bMV07CisJCWkgPSBpbmRleF9pbl9zdHJpbmdzKAorCQkJImdlb21ldHJ5XDB0aW1pbmdzXDBpbnRlcmxhY2VkXDBkb3VibGVcMHZzeW5jXDBoc3luY1wwY3N5bmNcMGV4dHN5bmNcMCIsCisJCQl0b2tlblswXSk7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlpZiAoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKGJhc2UtPnhyZXMpKSB7CisJCQkJc3NjYW5mKHAsICIlZCAlZCAlZCAlZCAlZCIsCisJCQkJCSZiYXNlLT54cmVzLCAmYmFzZS0+eXJlcywKKwkJCQkJJmJhc2UtPnhyZXNfdmlydHVhbCwgJmJhc2UtPnlyZXNfdmlydHVhbCwKKwkJCQkJJmJhc2UtPmJpdHNfcGVyX3BpeGVsKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGJhc2VfeHJlcywgYmFzZV95cmVzOworCQkJCWludCBiYXNlX3hyZXNfdmlydHVhbCwgYmFzZV95cmVzX3ZpcnR1YWw7CisJCQkJaW50IGJhc2VfYml0c19wZXJfcGl4ZWw7CisJCQkJc3NjYW5mKHAsICIlZCAlZCAlZCAlZCAlZCIsCisJCQkJCSZiYXNlX3hyZXMsICZiYXNlX3lyZXMsCisJCQkJCSZiYXNlX3hyZXNfdmlydHVhbCwgJmJhc2VfeXJlc192aXJ0dWFsLAorCQkJCQkmYmFzZV9iaXRzX3Blcl9waXhlbCk7CisJCQkJYmFzZS0+eHJlcyA9IGJhc2VfeHJlczsKKwkJCQliYXNlLT55cmVzID0gYmFzZV95cmVzOworCQkJCWJhc2UtPnhyZXNfdmlydHVhbCA9IGJhc2VfeHJlc192aXJ0dWFsOworCQkJCWJhc2UtPnlyZXNfdmlydHVhbCA9IGJhc2VfeXJlc192aXJ0dWFsOworCQkJCWJhc2UtPmJpdHNfcGVyX3BpeGVsID0gYmFzZV9iaXRzX3Blcl9waXhlbDsKKwkJCX0KKy8vYmJfaW5mb19tc2coIkdFT1slc10iLCBwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKGJhc2UtPnhyZXMpKSB7CisJCQkJc3NjYW5mKHAsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCIsCisJCQkJCSZiYXNlLT5waXhjbG9jaywKKwkJCQkJJmJhc2UtPmxlZnRfbWFyZ2luLCAmYmFzZS0+cmlnaHRfbWFyZ2luLAorCQkJCQkmYmFzZS0+dXBwZXJfbWFyZ2luLCAmYmFzZS0+bG93ZXJfbWFyZ2luLAorCQkJCQkmYmFzZS0+aHN5bmNfbGVuLCAmYmFzZS0+dnN5bmNfbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGJhc2VfcGl4Y2xvY2s7CisJCQkJaW50IGJhc2VfbGVmdF9tYXJnaW4sIGJhc2VfcmlnaHRfbWFyZ2luOworCQkJCWludCBiYXNlX3VwcGVyX21hcmdpbiwgYmFzZV9sb3dlcl9tYXJnaW47CisJCQkJaW50IGJhc2VfaHN5bmNfbGVuLCBiYXNlX3ZzeW5jX2xlbjsKKwkJCQlzc2NhbmYocCwgIiVkICVkICVkICVkICVkICVkICVkIiwKKwkJCQkJJmJhc2VfcGl4Y2xvY2ssCisJCQkJCSZiYXNlX2xlZnRfbWFyZ2luLCAmYmFzZV9yaWdodF9tYXJnaW4sCisJCQkJCSZiYXNlX3VwcGVyX21hcmdpbiwgJmJhc2VfbG93ZXJfbWFyZ2luLAorCQkJCQkmYmFzZV9oc3luY19sZW4sICZiYXNlX3ZzeW5jX2xlbik7CisJCQkJYmFzZS0+cGl4Y2xvY2sgPSBiYXNlX3BpeGNsb2NrOworCQkJCWJhc2UtPmxlZnRfbWFyZ2luID0gYmFzZV9sZWZ0X21hcmdpbjsKKwkJCQliYXNlLT5yaWdodF9tYXJnaW4gPSBiYXNlX3JpZ2h0X21hcmdpbjsKKwkJCQliYXNlLT51cHBlcl9tYXJnaW4gPSBiYXNlX3VwcGVyX21hcmdpbjsKKwkJCQliYXNlLT5sb3dlcl9tYXJnaW4gPSBiYXNlX2xvd2VyX21hcmdpbjsKKwkJCQliYXNlLT5oc3luY19sZW4gPSBiYXNlX2hzeW5jX2xlbjsKKwkJCQliYXNlLT52c3luY19sZW4gPSBiYXNlX3ZzeW5jX2xlbjsKKwkJCX0KKy8vYmJfaW5mb19tc2coIlRJTVslc10iLCBwKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzogeworCQkJc3RhdGljIGNvbnN0IHVpbnQzMl90IHN5bmNzW10gPSB7RkJfVk1PREVfSU5URVJMQUNFRCwgRkJfVk1PREVfRE9VQkxFfTsKKwkJCXNzKCZiYXNlLT52bW9kZSwgc3luY3NbaS0yXSwgcCwgImZhbHNlIik7CisvL2JiX2luZm9fbXNnKCJWTU9ERVslc10iLCBwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQljYXNlIDY6IHsKKwkJCXN0YXRpYyBjb25zdCB1aW50MzJfdCBzeW5jc1tdID0ge0ZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfU1lOQ19IT1JfSElHSF9BQ1QsIEZCX1NZTkNfQ09NUF9ISUdIX0FDVH07CisJCQlzcygmYmFzZS0+c3luYywgc3luY3NbaS00XSwgcCwgImxvdyIpOworLy9iYl9pbmZvX21zZygiU1lOQ1slc10iLCBwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgNzoKKwkJCXNzKCZiYXNlLT5zeW5jLCBGQl9TWU5DX0VYVCwgcCwgImZhbHNlIik7CisvL2JiX2luZm9fbXNnKCJFWFRTWU5DWyVzXSIsIHApOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2hvd21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2KQoreworCWRvdWJsZSBkcmF0ZSA9IDAsIGhyYXRlID0gMCwgdnJhdGUgPSAwOworCisJaWYgKHYtPnBpeGNsb2NrKSB7CisJCWRyYXRlID0gMWUxMiAvIHYtPnBpeGNsb2NrOworCQlocmF0ZSA9IGRyYXRlIC8gKHYtPmxlZnRfbWFyZ2luICsgdi0+eHJlcyArIHYtPnJpZ2h0X21hcmdpbiArIHYtPmhzeW5jX2xlbik7CisJCXZyYXRlID0gaHJhdGUgLyAodi0+dXBwZXJfbWFyZ2luICsgdi0+eXJlcyArIHYtPmxvd2VyX21hcmdpbiArIHYtPnZzeW5jX2xlbik7CisJfQorCXByaW50ZigiXG5tb2RlIFwiJXV4JXUtJXVcIlxuIgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZCU0VUX0ZBTkNZCisJIlx0IyBEOiAlLjNmIE1IeiwgSDogJS4zZiBrSHosIFY6ICUuM2YgSHpcbiIKKyNlbmRpZgorCSJcdGdlb21ldHJ5ICV1ICV1ICV1ICV1ICV1XG4iCisJIlx0dGltaW5ncyAldSAldSAldSAldSAldSAldSAldVxuIgorCSJcdGFjY2VsICVzXG4iCisJIlx0cmdiYSAldS8ldSwldS8ldSwldS8ldSwldS8ldVxuIgorCSJlbmRtb2RlXG5cbiIsCisJCXYtPnhyZXMsIHYtPnlyZXMsIChpbnQpICh2cmF0ZSArIDAuNSksCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwkJZHJhdGUgLyAxZTYsIGhyYXRlIC8gMWUzLCB2cmF0ZSwKKyNlbmRpZgorCQl2LT54cmVzLCB2LT55cmVzLCB2LT54cmVzX3ZpcnR1YWwsIHYtPnlyZXNfdmlydHVhbCwgdi0+Yml0c19wZXJfcGl4ZWwsCisJCXYtPnBpeGNsb2NrLCB2LT5sZWZ0X21hcmdpbiwgdi0+cmlnaHRfbWFyZ2luLCB2LT51cHBlcl9tYXJnaW4sIHYtPmxvd2VyX21hcmdpbiwKKwkJCXYtPmhzeW5jX2xlbiwgdi0+dnN5bmNfbGVuLAorCQkodi0+YWNjZWxfZmxhZ3MgPiAwID8gInRydWUiIDogImZhbHNlIiksCisJCXYtPnJlZC5sZW5ndGgsIHYtPnJlZC5vZmZzZXQsIHYtPmdyZWVuLmxlbmd0aCwgdi0+Z3JlZW4ub2Zmc2V0LAorCQkJdi0+Ymx1ZS5sZW5ndGgsIHYtPmJsdWUub2Zmc2V0LCB2LT50cmFuc3AubGVuZ3RoLCB2LT50cmFuc3Aub2Zmc2V0KTsKK30KKworaW50IGZic2V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmYnNldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX0NIQU5HRSAgID0gKDEgPDwgMCksCisJCU9QVF9TSE9XICAgICA9ICgxIDw8IDEpLAorCQlPUFRfUkVBRE1PREUgPSAoMSA8PCAyKSwKKwkJT1BUX0FMTCAgICAgID0gKDEgPDwgMyksCisJfTsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyX29sZCwgdmFyX3NldDsKKwlpbnQgZmgsIGk7CisJdW5zaWduZWQgb3B0aW9ucyA9IDA7CisKKwljb25zdCBjaGFyICpmYmRldiA9IERFRkFVTFRGQkRFVjsKKwljb25zdCBjaGFyICptb2RlZmlsZSA9IERFRkFVTFRGQk1PREU7CisJY2hhciAqdGhpc2FyZzsKKwljaGFyICptb2RlID0gbW9kZTsgLyogZm9yIGNvbXBpbGVyICovCisKKwltZW1zZXQoJnZhcl9zZXQsIDB4ZmYsIHNpemVvZih2YXJfc2V0KSk7IC8qIHNldCBhbGwgdG8gLTEgKi8KKworCS8qIHBhcnNlIGNtZCBhcmdzLi4uLiB3aHkgZG8gdGhleSBoYXZlIHRvIG1ha2UgdGhpbmdzIHNvIGRpZmZpY3VsdD8gKi8KKwlhcmd2Kys7CisJYXJnYy0tOworCWZvciAoOyBhcmdjID4gMCAmJiAodGhpc2FyZyA9ICphcmd2KSAhPSBOVUxMOyBhcmdjLS0sIGFyZ3YrKykgeworCQlpZiAodGhpc2FyZ1swXSAhPSAnLScpIHsKKwkJCWlmICghRU5BQkxFX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREUgfHwgYXJnYyAhPSAxKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCW1vZGUgPSB0aGlzYXJnOworCQkJb3B0aW9ucyB8PSBPUFRfUkVBRE1PREU7CisJCQlnb3RvIGNvbnRpbjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnX2NtZG9wdGlvbnMpOyBpKyspIHsKKwkJCWlmIChzdHJjbXAodGhpc2FyZyArIDEsIGdfY21kb3B0aW9uc1tpXS5uYW1lKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGFyZ2MgPD0gZ19jbWRvcHRpb25zW2ldLnBhcmFtX2NvdW50KQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQkJc3dpdGNoIChnX2NtZG9wdGlvbnNbaV0uY29kZSkgeworCQkJY2FzZSBDTURfRkI6CisJCQkJZmJkZXYgPSBhcmd2WzFdOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfREI6CisJCQkJbW9kZWZpbGUgPSBhcmd2WzFdOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfQUxMOgorCQkJCW9wdGlvbnMgfD0gT1BUX0FMTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1NIT1c6CisJCQkJb3B0aW9ucyB8PSBPUFRfU0hPVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0dFT01FVFJZOgorCQkJCXZhcl9zZXQueHJlcyA9IHhhdG91MzIoYXJndlsxXSk7CisJCQkJdmFyX3NldC55cmVzID0geGF0b3UzMihhcmd2WzJdKTsKKwkJCQl2YXJfc2V0LnhyZXNfdmlydHVhbCA9IHhhdG91MzIoYXJndlszXSk7CisJCQkJdmFyX3NldC55cmVzX3ZpcnR1YWwgPSB4YXRvdTMyKGFyZ3ZbNF0pOworCQkJCXZhcl9zZXQuYml0c19wZXJfcGl4ZWwgPSB4YXRvdTMyKGFyZ3ZbNV0pOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfVElNSU5HOgorCQkJCXZhcl9zZXQucGl4Y2xvY2sgPSB4YXRvdTMyKGFyZ3ZbMV0pOworCQkJCXZhcl9zZXQubGVmdF9tYXJnaW4gPSB4YXRvdTMyKGFyZ3ZbMl0pOworCQkJCXZhcl9zZXQucmlnaHRfbWFyZ2luID0geGF0b3UzMihhcmd2WzNdKTsKKwkJCQl2YXJfc2V0LnVwcGVyX21hcmdpbiA9IHhhdG91MzIoYXJndls0XSk7CisJCQkJdmFyX3NldC5sb3dlcl9tYXJnaW4gPSB4YXRvdTMyKGFyZ3ZbNV0pOworCQkJCXZhcl9zZXQuaHN5bmNfbGVuID0geGF0b3UzMihhcmd2WzZdKTsKKwkJCQl2YXJfc2V0LnZzeW5jX2xlbiA9IHhhdG91MzIoYXJndls3XSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9BQ0NFTDoKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0hTWU5DOgorCQkJCXZhcl9zZXQuc3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1ZTWU5DOgorCQkJCXZhcl9zZXQuc3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7CisJCQkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwkJCWNhc2UgQ01EX1hSRVM6CisJCQkJdmFyX3NldC54cmVzID0geGF0b3UzMihhcmd2WzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1lSRVM6CisJCQkJdmFyX3NldC55cmVzID0geGF0b3UzMihhcmd2WzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0RFUFRIOgorCQkJCXZhcl9zZXQuYml0c19wZXJfcGl4ZWwgPSB4YXRvdTMyKGFyZ3ZbMV0pOworCQkJCWJyZWFrOworI2VuZGlmCisJCQl9CisJCQlzd2l0Y2ggKGdfY21kb3B0aW9uc1tpXS5jb2RlKSB7CisJCQljYXNlIENNRF9GQjoKKwkJCWNhc2UgQ01EX0RCOgorCQkJY2FzZSBDTURfQUxMOgorCQkJY2FzZSBDTURfU0hPVzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogb3RoZXIgY29tbWFuZHMgaW1wbHkgY2hhbmdlcyAqLworCQkJCW9wdGlvbnMgfD0gT1BUX0NIQU5HRTsKKwkJCX0KKwkJCWFyZ2MgLT0gZ19jbWRvcHRpb25zW2ldLnBhcmFtX2NvdW50OworCQkJYXJndiArPSBnX2NtZG9wdGlvbnNbaV0ucGFyYW1fY291bnQ7CisJCQlnb3RvIGNvbnRpbjsKKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisgY29udGluOiA7CisJfQorCisJZmggPSB4b3BlbihmYmRldiwgT19SRE9OTFkpOworCXhpb2N0bChmaCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJnZhcl9vbGQpOworCisJaWYgKG9wdGlvbnMgJiBPUFRfUkVBRE1PREUpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9SRUFETU9ERQorCQlpZiAoIXJlYWRfbW9kZV9kYigmdmFyX29sZCwgbW9kZWZpbGUsIG1vZGUpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB2aWRlbyBtb2RlICclcyciLCBtb2RlKTsKKwkJfQorCQlvcHRpb25zIHw9IE9QVF9DSEFOR0U7CisjZW5kaWYKKwl9CisKKwlpZiAob3B0aW9ucyAmIE9QVF9DSEFOR0UpIHsKKwkJY29weV9jaGFuZ2VkX3ZhbHVlcygmdmFyX29sZCwgJnZhcl9zZXQpOworCQlpZiAob3B0aW9ucyAmIE9QVF9BTEwpCisJCQl2YXJfb2xkLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfQUxMOworCQl4aW9jdGwoZmgsIEZCSU9QVVRfVlNDUkVFTklORk8sICZ2YXJfb2xkKTsKKwl9CisKKwlpZiAob3B0aW9ucyA9PSAwIHx8IChvcHRpb25zICYgT1BUX1NIT1cpKQorCQlzaG93bW9kZSgmdmFyX29sZCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZoKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkZm9ybWF0LmMgYi91dGlsLWxpbnV4L2ZkZm9ybWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwODU0YQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZmRmb3JtYXQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBmZGZvcm1hdC5jICAtICBMb3ctbGV2ZWwgZm9ybWF0cyBhIGZsb3BweSBkaXNrIC0gV2VybmVyIEFsbWVzYmVyZ2VyCisgKiA1IEp1bHkgMjAwMyAtLSBtb2RpZmllZCBmb3IgQnVzeWJveCBieSBFcmlrIEFuZGVyc2VuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmRmb3JtYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbl0gREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZkZm9ybWF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRm9ybWF0IGZsb3BweSBkaXNrXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHZlcmlmeSBhZnRlciBmb3JtYXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKKy8qIFN0dWZmIGV4dHJhY3RlZCBmcm9tIGxpbnV4L2ZkLmggKi8KK3N0cnVjdCBmbG9wcHlfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KKwkJCXNlY3QsCQkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCQkJaGVhZCwJCS8qIG5yIG9mIGhlYWRzICovCisJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLworCQkJc3RyZXRjaDsJLyogIT0wIG1lYW5zIGRvdWJsZSB0cmFjayBzdGVwcyAqLworI2RlZmluZSBGRF9TVFJFVENIIDEKKyNkZWZpbmUgRkRfU1dBUFNJREVTIDIKKworCXVuc2lnbmVkIGNoYXIJZ2FwLAkJLyogZ2FwMSBzaXplICovCisKKwkJCXJhdGUsCQkvKiBkYXRhIHJhdGUuIHw9IDB4NDAgZm9yIHBlcnBlbmRpY3VsYXIgKi8KKyNkZWZpbmUgRkRfMk0gMHg0CisjZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CisjZGVmaW5lIEZEX1NJWkVDT0RFKGZsb3BweSkgKCgoKChmbG9wcHkpLT5yYXRlJkZEX1NJWkVDT0RFTUFTSyk+PiAzKSsgMikgJTgpCisjZGVmaW5lIEZEX1NFQ1RTSVpFKGZsb3BweSkgKCAoZmxvcHB5KS0+cmF0ZSAmIEZEXzJNID8gXAorCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCisjZGVmaW5lIEZEX1BFUlAgMHg0MAorCisJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KKwkJCWZtdF9nYXA7CS8qIGdhcDIgc2l6ZSAqLworCWNvbnN0IGNoYXIJKiBuYW1lOyAvKiB1c2VkIG9ubHkgZm9yIHByZWRlZmluZWQgZm9ybWF0cyAqLworfTsKK3N0cnVjdCBmb3JtYXRfZGVzY3IgeworCXVuc2lnbmVkIGludCBkZXZpY2UsaGVhZCx0cmFjazsKK307CisjZGVmaW5lIEZERk1UQkVHIF9JTygyLDB4NDcpCisjZGVmaW5lIEZERk1UVFJLIF9JT1coMiwweDQ4LCBzdHJ1Y3QgZm9ybWF0X2Rlc2NyKQorI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQorI2RlZmluZSBGREdFVFBSTSBfSU9SKDIsIDB4MDQsIHN0cnVjdCBmbG9wcHlfc3RydWN0KQorI2RlZmluZSBGRF9GSUxMX0JZVEUgMHhGNiAvKiBmb3JtYXQgZmlsbCBieXRlLiAqLworCitpbnQgZmRmb3JtYXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZkZm9ybWF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQsIG4sIGN5bCwgcmVhZF9ieXRlcywgdmVyaWZ5OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGZsb3BweV9zdHJ1Y3QgcGFyYW07CisJc3RydWN0IGZvcm1hdF9kZXNjciBkZXNjcjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsgLyogbXVzdCBoYXZlIDEgcGFyYW0gKi8KKwl2ZXJpZnkgPSAhZ2V0b3B0MzIoYXJndiwgIm4iKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXhzdGF0KCphcmd2LCAmc3QpOworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsICphcmd2KTsKKwkJLyogZG8gbm90IHRlc3QgbWFqb3IgLSBwZXJoYXBzIHRoaXMgd2FzIGFuIFVTQiBmbG9wcHkgKi8KKwl9CisKKwkvKiBPX1JEV1IgZm9yIGZvcm1hdHRpbmcgYW5kIHZlcmlmeWluZyAqLworCWZkID0geG9wZW4oKmFyZ3YsIE9fUkRXUik7CisKKwkvKiBvcmlnaW5hbCBtZXNzYWdlIHdhczogIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCBmb3JtYXQgdHlwZSIgKi8KKwl4aW9jdGwoZmQsIEZER0VUUFJNLCAmcGFyYW0pOworCisJcHJpbnRmKCIlcy1zaWRlZCwgJWQgdHJhY2tzLCAlZCBzZWMvdHJhY2suIFRvdGFsIGNhcGFjaXR5ICVkIGtCXG4iLAorCQkocGFyYW0uaGVhZCA9PSAyKSA/ICJEb3VibGUiIDogIlNpbmdsZSIsCisJCXBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LCBwYXJhbS5zaXplID4+IDEpOworCisJLyogRk9STUFUICovCisJcHJpbnRmKCJGb3JtYXR0aW5nLi4uICIpOworCXhpb2N0bChmZCwgRkRGTVRCRUcsIE5VTEwpOworCisJLyogbiA9PSB0cmFjayAqLworCWZvciAobiA9IDA7IG4gPCBwYXJhbS50cmFjazsgbisrKSB7CisJCWRlc2NyLmhlYWQgPSAwOworCQlkZXNjci50cmFjayA9IG47CisJCXhpb2N0bChmZCwgRkRGTVRUUkssICZkZXNjcik7CisJCXByaW50ZigiJTNkXGJcYlxiIiwgbik7CisJCWlmIChwYXJhbS5oZWFkID09IDIpIHsKKwkJCWRlc2NyLmhlYWQgPSAxOworCQkJeGlvY3RsKGZkLCBGREZNVFRSSywgJmRlc2NyKTsKKwkJfQorCX0KKworCXhpb2N0bChmZCwgRkRGTVRFTkQsIE5VTEwpOworCXByaW50ZigiZG9uZVxuIik7CisKKwkvKiBWRVJJRlkgKi8KKwlpZiAodmVyaWZ5KSB7CisJCS8qIG4gPT0gY3lsX3NpemUgKi8KKwkJbiA9IHBhcmFtLnNlY3QqcGFyYW0uaGVhZCo1MTI7CisKKwkJZGF0YSA9IHhtYWxsb2Mobik7CisJCXByaW50ZigiVmVyaWZ5aW5nLi4uICIpOworCQlmb3IgKGN5bCA9IDA7IGN5bCA8IHBhcmFtLnRyYWNrOyBjeWwrKykgeworCQkJcHJpbnRmKCIlM2RcYlxiXGIiLCBjeWwpOworCQkJcmVhZF9ieXRlcyA9IHNhZmVfcmVhZChmZCwgZGF0YSwgbik7CisJCQlpZiAocmVhZF9ieXRlcyAhPSBuKSB7CisJCQkJaWYgKHJlYWRfYnl0ZXMgPCAwKSB7CisJCQkJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJCX0KKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvYmxlbSByZWFkaW5nIGN5bGluZGVyICVkLCAiCisJCQkJCSJleHBlY3RlZCAlZCwgcmVhZCAlZCIsIGN5bCwgbiwgcmVhZF9ieXRlcyk7CisJCQkJLy8gRklYTUU6IG1heWJlIGJldHRlciBzZWVrICYgY29udGludWU/PworCQkJfQorCQkJLyogQ2hlY2sgYmFja3dhcmRzIHNvIHdlIGRvbid0IG5lZWQgYSBjb3VudGVyICovCisJCQl3aGlsZSAoLS1yZWFkX2J5dGVzID49IDApIHsKKwkJCQlpZiAoZGF0YVtyZWFkX2J5dGVzXSAhPSBGRF9GSUxMX0JZVEUpIHsKKwkJCQkJIHByaW50ZigiYmFkIGRhdGEgaW4gY3lsICVkXG5Db250aW51aW5nLi4uICIsIGN5bCk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFRoZXJlIGlzIG5vIHBvaW50IGluIGZyZWVpbmcgYmxvY2tzIGF0IHRoZSBlbmQgb2YgYSBwcm9ncmFtLCBiZWNhdXNlCisJCWFsbCBvZiB0aGUgcHJvZ3JhbSdzIHNwYWNlIGlzIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbSB3aGVuIHRoZSBwcm9jZXNzCisJCXRlcm1pbmF0ZXMuKi8KKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZGF0YSk7CisKKwkJcHJpbnRmKCJkb25lXG4iKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKGZkKTsKKworCS8qIERvbid0IGJvdGhlciBjbG9zaW5nLiAgRXhpdCBkb2VzCisJICogdGhhdCwgc28gd2UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgKi8KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9mZGlzay5jIGIvdXRpbC1saW51eC9mZGlzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmUxNWEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrLmMKQEAgLTAsMCArMSwzMTIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIGZkaXNrLmMgLS0gUGFydGl0aW9uIHRhYmxlIG1hbmlwdWxhdG9yIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgIEEuIFYuIExlIEJsYW5jIChMZUJsYW5jQG1jYy5hYy51aykKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gKGluaXRpYWwgYmIgcG9ydCkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIExvb2tzIGxpa2Ugc29tZW9uZSBmb3Jnb3QgdG8gYWRkIHRoaXMgdG8gY29uZmlnIHN5c3RlbSAqLworLy91c2FnZTojaWZuZGVmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0JMS1NJWkUKKy8vdXNhZ2U6IyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQkxLU0laRSAwCisvL3VzYWdlOiMgZGVmaW5lIElGX0ZFQVRVUkVfRkRJU0tfQkxLU0laRShhKQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmRpc2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdWwiIElGX0ZFQVRVUkVfRkRJU0tfQkxLU0laRSgicyIpICJdICIKKy8vdXNhZ2U6ICAgICAgICJbLUMgQ1lMSU5ERVJTXSBbLUggSEVBRFNdIFstUyBTRUNUT1JTXSBbLWIgU1NaXSBESVNLIgorLy91c2FnZTojZGVmaW5lIGZkaXNrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHBhcnRpdGlvbiB0YWJsZVxuIgorLy91c2FnZTogICAgICJcbgktdQkJU3RhcnQgYW5kIEVuZCBhcmUgaW4gc2VjdG9ycyAoaW5zdGVhZCBvZiBjeWxpbmRlcnMpIgorLy91c2FnZTogICAgICJcbgktbAkJU2hvdyBwYXJ0aXRpb24gdGFibGUgZm9yIGVhY2ggRElTSywgdGhlbiBleGl0IgorLy91c2FnZToJSUZfRkVBVFVSRV9GRElTS19CTEtTSVpFKAorLy91c2FnZTogICAgICJcbgktcwkJU2hvdyBwYXJ0aXRpb24gc2l6ZXMgaW4ga2IgZm9yIGVhY2ggRElTSywgdGhlbiBleGl0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktYiAyMDQ4CQkoZm9yIGNlcnRhaW4gTU8gZGlza3MpIHVzZSAyMDQ4LWJ5dGUgc2VjdG9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgQ1lMSU5ERVJTCVNldCBudW1iZXIgb2YgY3lsaW5kZXJzL2hlYWRzL3NlY3RvcnMiCisvL3VzYWdlOiAgICAgIlxuCS1IIEhFQURTIgorLy91c2FnZTogICAgICJcbgktUyBTRUNUT1JTIgorCisjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKy8qIEZvciBsc2VlazY0ICovCisjIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4gICAgICAgICAgICAgLyogYXNzZXJ0ICovCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaWYgIWRlZmluZWQoQkxLU1NaR0VUKQorIyBkZWZpbmUgQkxLU1NaR0VUIF9JTygweDEyLCAxMDQpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChCTEtHRVRTSVpFNjQpCisjIGRlZmluZSBCTEtHRVRTSVpFNjQgX0lPUigweDEyLDExNCxzaXplX3QpCisjZW5kaWYKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgQkJfTElUVExFX0VORElBTgorIyBkZWZpbmUgaW5saW5lX2lmX2xpdHRsZV9lbmRpYW4gQUxXQVlTX0lOTElORQorI2Vsc2UKKyMgZGVmaW5lIGlubGluZV9pZl9saXR0bGVfZW5kaWFuIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisKKy8qIExvb2tzIGxpa2Ugc29tZW9uZSBmb3Jnb3QgdG8gYWRkIHRoaXMgdG8gY29uZmlnIHN5c3RlbSAqLworI2lmbmRlZiBFTkFCTEVfRkVBVFVSRV9GRElTS19CTEtTSVpFCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9GRElTS19CTEtTSVpFIDAKKyMgZGVmaW5lIElGX0ZFQVRVUkVfRkRJU0tfQkxLU0laRShhKQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9TRUNUT1JfU0laRSAgICAgIDUxMgorI2RlZmluZSBERUZBVUxUX1NFQ1RPUl9TSVpFX1NUUiAiNTEyIgorI2RlZmluZSBNQVhfU0VDVE9SX1NJWkUgICAgICAgICAyMDQ4CisjZGVmaW5lIFNFQ1RPUl9TSVpFICAgICAgICAgICAgICA1MTIgLyogc3RpbGwgdXNlZCBpbiBvc2Yvc2dpL3N1biBjb2RlICovCisjZGVmaW5lIE1BWElNVU1fUEFSVFMgICAgICAgICAgICAgNjAKKworI2RlZmluZSBBQ1RJVkVfRkxBRyAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgRVhURU5ERUQgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXSU45OF9FWFRFTkRFRCAgICAgICAgICAweDBmCisjZGVmaW5lIExJTlVYX1BBUlRJVElPTiAgICAgICAgIDB4ODEKKyNkZWZpbmUgTElOVVhfU1dBUCAgICAgICAgICAgICAgMHg4MgorI2RlZmluZSBMSU5VWF9OQVRJVkUgICAgICAgICAgICAweDgzCisjZGVmaW5lIExJTlVYX0VYVEVOREVEICAgICAgICAgIDB4ODUKKyNkZWZpbmUgTElOVVhfTFZNICAgICAgICAgICAgICAgMHg4ZQorI2RlZmluZSBMSU5VWF9SQUlEICAgICAgICAgICAgICAweGZkCisKKworZW51bSB7CisJT1BUX2IgPSAxIDw8IDAsCisJT1BUX0MgPSAxIDw8IDEsCisJT1BUX0ggPSAxIDw8IDIsCisJT1BUX2wgPSAxIDw8IDMsCisJT1BUX1MgPSAxIDw8IDQsCisJT1BUX3UgPSAxIDw8IDUsCisJT1BUX3MgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0JMS1NJWkUsCit9OworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbG9uZzsKKy8qIFVzZWQgZm9yIHNlY3RvciBudW1iZXJzLiBQYXJ0aXRpb24gZm9ybWF0cyB3ZSBrbm93CisgKiBkbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMl4zMiBzZWN0b3JzCisgKi8KK3R5cGVkZWYgdWludDMyX3Qgc2VjdG9yX3Q7CisjaWYgVUlOVF9NQVggPT0gNDI5NDk2NzI5NQorIyBkZWZpbmUgU0VDVF9GTVQgIiIKKyNlbGlmIFVMT05HX01BWCA9PSA0Mjk0OTY3Mjk1CisjIGRlZmluZSBTRUNUX0ZNVCAibCIKKyNlbHNlCisjIGVycm9yIENhbnQgZGV0ZWN0IHNpemVvZih1aW50MzJfdCkKKyNlbmRpZgorCitzdHJ1Y3QgaGRfZ2VvbWV0cnkgeworCXVuc2lnbmVkIGNoYXIgaGVhZHM7CisJdW5zaWduZWQgY2hhciBzZWN0b3JzOworCXVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworfTsKKworI2RlZmluZSBIRElPX0dFVEdFTyAgICAgMHgwMzAxICAvKiBnZXQgZGV2aWNlIGdlb21ldHJ5ICovCisKK3N0YXRpYyBjb25zdCBjaGFyIG1zZ19idWlsZGluZ19uZXdfbGFiZWxbXSBBTElHTjEgPQorIkJ1aWxkaW5nIGEgbmV3ICVzLiBDaGFuZ2VzIHdpbGwgcmVtYWluIGluIG1lbW9yeSBvbmx5LFxuIgorInVudGlsIHlvdSBkZWNpZGUgdG8gd3JpdGUgdGhlbS4gQWZ0ZXIgdGhhdCB0aGUgcHJldmlvdXMgY29udGVudFxuIgorIndvbid0IGJlIHJlY292ZXJhYmxlLlxuXG4iOworCitzdGF0aWMgY29uc3QgY2hhciBtc2dfcGFydF9hbHJlYWR5X2RlZmluZWRbXSBBTElHTjEgPQorIlBhcnRpdGlvbiAldSBpcyBhbHJlYWR5IGRlZmluZWQsIGRlbGV0ZSBpdCBiZWZvcmUgcmUtYWRkaW5nXG4iOworCisKK3N0cnVjdCBwYXJ0aXRpb24geworCXVuc2lnbmVkIGNoYXIgYm9vdF9pbmQ7ICAgICAgICAgLyogMHg4MCAtIGFjdGl2ZSAqLworCXVuc2lnbmVkIGNoYXIgaGVhZDsgICAgICAgICAgICAgLyogc3RhcnRpbmcgaGVhZCAqLworCXVuc2lnbmVkIGNoYXIgc2VjdG9yOyAgICAgICAgICAgLyogc3RhcnRpbmcgc2VjdG9yICovCisJdW5zaWduZWQgY2hhciBjeWw7ICAgICAgICAgICAgICAvKiBzdGFydGluZyBjeWxpbmRlciAqLworCXVuc2lnbmVkIGNoYXIgc3lzX2luZDsgICAgICAgICAgLyogd2hhdCBwYXJ0aXRpb24gdHlwZSAqLworCXVuc2lnbmVkIGNoYXIgZW5kX2hlYWQ7ICAgICAgICAgLyogZW5kIGhlYWQgKi8KKwl1bnNpZ25lZCBjaGFyIGVuZF9zZWN0b3I7ICAgICAgIC8qIGVuZCBzZWN0b3IgKi8KKwl1bnNpZ25lZCBjaGFyIGVuZF9jeWw7ICAgICAgICAgIC8qIGVuZCBjeWxpbmRlciAqLworCXVuc2lnbmVkIGNoYXIgc3RhcnQ0WzRdOyAgICAgICAgLyogc3RhcnRpbmcgc2VjdG9yIGNvdW50aW5nIGZyb20gMCAqLworCXVuc2lnbmVkIGNoYXIgc2l6ZTRbNF07ICAgICAgICAgLyogbnIgb2Ygc2VjdG9ycyBpbiBwYXJ0aXRpb24gKi8KK30gUEFDS0VEOworCisvKgorICogcGVyIHBhcnRpdGlvbiB0YWJsZSBlbnRyeSBkYXRhCisgKgorICogVGhlIGZvdXIgcHJpbWFyeSBwYXJ0aXRpb25zIGhhdmUgdGhlIHNhbWUgc2VjdG9yYnVmZmVyIChNQlJidWZmZXIpCisgKiBhbmQgaGF2ZSBOVUxMIGV4dF9wb2ludGVyLgorICogRWFjaCBsb2dpY2FsIHBhcnRpdGlvbiB0YWJsZSBlbnRyeSBoYXMgdHdvIHBvaW50ZXJzLCBvbmUgZm9yIHRoZQorICogcGFydGl0aW9uIGFuZCBvbmUgbGluayB0byB0aGUgbmV4dCBvbmUuCisgKi8KK3N0cnVjdCBwdGUgeworCXN0cnVjdCBwYXJ0aXRpb24gKnBhcnRfdGFibGU7ICAgLyogcG9pbnRzIGludG8gc2VjdG9yYnVmZmVyICovCisJc3RydWN0IHBhcnRpdGlvbiAqZXh0X3BvaW50ZXI7ICAvKiBwb2ludHMgaW50byBzZWN0b3JidWZmZXIgKi8KKwlzZWN0b3JfdCBvZmZzZXRfZnJvbV9kZXZfc3RhcnQ7IC8qIGRpc2sgc2VjdG9yIG51bWJlciAqLworCWNoYXIgKnNlY3RvcmJ1ZmZlcjsgICAgICAgICAgICAgLyogZGlzayBzZWN0b3IgY29udGVudHMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWNoYXIgY2hhbmdlZDsgICAgICAgICAgICAgICAgICAgLyogYm9vbGVhbiAqLworI2VuZGlmCit9OworCisjZGVmaW5lIHVuYWJsZV90b19vcGVuICJjYW4ndCBvcGVuICclcyciCisjZGVmaW5lIHVuYWJsZV90b19yZWFkICJjYW4ndCByZWFkIGZyb20gJXMiCisjZGVmaW5lIHVuYWJsZV90b19zZWVrICJjYW4ndCBzZWVrIG9uICVzIgorCitlbnVtIGxhYmVsX3R5cGUgeworCUxBQkVMX0RPUywgTEFCRUxfU1VOLCBMQUJFTF9TR0ksIExBQkVMX0FJWCwgTEFCRUxfT1NGLCBMQUJFTF9HUFQKK307CisKKyNkZWZpbmUgTEFCRUxfSVNfRE9TCShMQUJFTF9ET1MgPT0gY3VycmVudF9sYWJlbF90eXBlKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisjZGVmaW5lIExBQkVMX0lTX1NVTgkoTEFCRUxfU1VOID09IGN1cnJlbnRfbGFiZWxfdHlwZSkKKyNkZWZpbmUgU1RBVElDX1NVTiBzdGF0aWMKKyNlbHNlCisjZGVmaW5lIExBQkVMX0lTX1NVTgkwCisjZGVmaW5lIFNUQVRJQ19TVU4gZXh0ZXJuCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorI2RlZmluZSBMQUJFTF9JU19TR0kJKExBQkVMX1NHSSA9PSBjdXJyZW50X2xhYmVsX3R5cGUpCisjZGVmaW5lIFNUQVRJQ19TR0kgc3RhdGljCisjZWxzZQorI2RlZmluZSBMQUJFTF9JU19TR0kJMAorI2RlZmluZSBTVEFUSUNfU0dJIGV4dGVybgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BSVhfTEFCRUwKKyNkZWZpbmUgTEFCRUxfSVNfQUlYCShMQUJFTF9BSVggPT0gY3VycmVudF9sYWJlbF90eXBlKQorI2RlZmluZSBTVEFUSUNfQUlYIHN0YXRpYworI2Vsc2UKKyNkZWZpbmUgTEFCRUxfSVNfQUlYCTAKKyNkZWZpbmUgU1RBVElDX0FJWCBleHRlcm4KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfT1NGX0xBQkVMCisjZGVmaW5lIExBQkVMX0lTX09TRgkoTEFCRUxfT1NGID09IGN1cnJlbnRfbGFiZWxfdHlwZSkKKyNkZWZpbmUgU1RBVElDX09TRiBzdGF0aWMKKyNlbHNlCisjZGVmaW5lIExBQkVMX0lTX09TRgkwCisjZGVmaW5lIFNUQVRJQ19PU0YgZXh0ZXJuCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0dQVF9MQUJFTAorI2RlZmluZSBMQUJFTF9JU19HUFQJKExBQkVMX0dQVCA9PSBjdXJyZW50X2xhYmVsX3R5cGUpCisjZGVmaW5lIFNUQVRJQ19HUFQgc3RhdGljCisjZWxzZQorI2RlZmluZSBMQUJFTF9JU19HUFQJMAorI2RlZmluZSBTVEFUSUNfR1BUIGV4dGVybgorI2VuZGlmCisKK2VudW0gYWN0aW9uIHsgT1BFTl9NQUlOLCBUUllfT05MWSwgQ1JFQVRFX0VNUFRZX0RPUywgQ1JFQVRFX0VNUFRZX1NVTiB9OworCitzdGF0aWMgdm9pZCB1cGRhdGVfdW5pdHModm9pZCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyB2b2lkIGNoYW5nZV91bml0cyh2b2lkKTsKK3N0YXRpYyB2b2lkIHJlcmVhZF9wYXJ0aXRpb25fdGFibGUoaW50IGxlYXZlKTsKK3N0YXRpYyB2b2lkIGRlbGV0ZV9wYXJ0aXRpb24oaW50IGkpOworc3RhdGljIHVuc2lnbmVkIGdldF9wYXJ0aXRpb24oaW50IHdhcm4sIHVuc2lnbmVkIG1heCk7CitzdGF0aWMgdm9pZCBsaXN0X3R5cGVzKGNvbnN0IGNoYXIgKmNvbnN0ICpzeXMpOworc3RhdGljIHNlY3Rvcl90IHJlYWRfaW50KHNlY3Rvcl90IGxvdywgc2VjdG9yX3QgZGZsdCwgc2VjdG9yX3QgaGlnaCwgc2VjdG9yX3QgYmFzZSwgY29uc3QgY2hhciAqbWVzZyk7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0aXRpb25fdHlwZSh1bnNpZ25lZCBjaGFyIHR5cGUpOworc3RhdGljIHZvaWQgZ2V0X2dlb21ldHJ5KHZvaWQpOworc3RhdGljIHZvaWQgcmVhZF9wdGUoc3RydWN0IHB0ZSAqcGUsIHNlY3Rvcl90IG9mZnNldCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMIHx8IEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgaW50IGdldF9ib290KGVudW0gYWN0aW9uIHdoYXQpOworI2Vsc2UKK3N0YXRpYyBpbnQgZ2V0X2Jvb3Qodm9pZCk7CisjZW5kaWYKKworI2RlZmluZSBQTFVSQUwgICAwCisjZGVmaW5lIFNJTkdVTEFSIDEKKworc3RhdGljIHNlY3Rvcl90IGdldF9zdGFydF9zZWN0KGNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnApOworc3RhdGljIHNlY3Rvcl90IGdldF9ucl9zZWN0cyhjb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwKTsKKworLyogRE9TIHBhcnRpdGlvbiB0eXBlcyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaTM4Nl9zeXNfdHlwZXNbXSA9IHsKKwkiXHgwMCIgIkVtcHR5IiwKKwkiXHgwMSIgIkZBVDEyIiwKKwkiXHgwNCIgIkZBVDE2IDwzMk0iLAorCSJceDA1IiAiRXh0ZW5kZWQiLCAgICAgICAgIC8qIERPUyAzLjMrIGV4dGVuZGVkIHBhcnRpdGlvbiAqLworCSJceDA2IiAiRkFUMTYiLCAgICAgICAgICAgIC8qIERPUyAxNi1iaXQgPj0zMk0gKi8KKwkiXHgwNyIgIkhQRlMvTlRGUyIsICAgICAgICAvKiBPUy8yIElGUywgZWcsIEhQRlMgb3IgTlRGUyBvciBRTlggKi8KKwkiXHgwYSIgIk9TLzIgQm9vdCBNYW5hZ2VyIiwvKiBPUy8yIEJvb3QgTWFuYWdlciAqLworCSJceDBiIiAiV2luOTUgRkFUMzIiLAorCSJceDBjIiAiV2luOTUgRkFUMzIgKExCQSkiLC8qIExCQSByZWFsbHkgaXMgJ0V4dGVuZGVkIEludCAxM2gnICovCisJIlx4MGUiICJXaW45NSBGQVQxNiAoTEJBKSIsCisJIlx4MGYiICJXaW45NSBFeHQnZCAoTEJBKSIsCisJIlx4MTEiICJIaWRkZW4gRkFUMTIiLAorCSJceDEyIiAiQ29tcGFxIGRpYWdub3N0aWNzIiwKKwkiXHgxNCIgIkhpZGRlbiBGQVQxNiA8MzJNIiwKKwkiXHgxNiIgIkhpZGRlbiBGQVQxNiIsCisJIlx4MTciICJIaWRkZW4gSFBGUy9OVEZTIiwKKwkiXHgxYiIgIkhpZGRlbiBXaW45NSBGQVQzMiIsCisJIlx4MWMiICJIaWRkZW4gVzk1IEZBVDMyIChMQkEpIiwKKwkiXHgxZSIgIkhpZGRlbiBXOTUgRkFUMTYgKExCQSkiLAorCSJceDNjIiAiUGFydC5NYWdpYyByZWNvdmVyeSIsCisJIlx4NDEiICJQUEMgUFJlUCBCb290IiwKKwkiXHg0MiIgIlNGUyIsCisJIlx4NjMiICJHTlUgSFVSRCBvciBTeXNWIiwgLyogR05VIEhVUkQgb3IgTWFjaCBvciBTeXMgVi8zODYgKHN1Y2ggYXMgSVNDIFVOSVgpICovCisJIlx4ODAiICJPbGQgTWluaXgiLCAgICAgICAgLyogTWluaXggMS40YSBhbmQgZWFybGllciAqLworCSJceDgxIiAiTWluaXggLyBvbGQgTGludXgiLC8qIE1pbml4IDEuNGIgYW5kIGxhdGVyICovCisJIlx4ODIiICJMaW51eCBzd2FwIiwgICAgICAgLyogYWxzbyBTb2xhcmlzICovCisJIlx4ODMiICJMaW51eCIsCisJIlx4ODQiICJPUy8yIGhpZGRlbiBDOiBkcml2ZSIsCisJIlx4ODUiICJMaW51eCBleHRlbmRlZCIsCisJIlx4ODYiICJOVEZTIHZvbHVtZSBzZXQiLAorCSJceDg3IiAiTlRGUyB2b2x1bWUgc2V0IiwKKwkiXHg4ZSIgIkxpbnV4IExWTSIsCisJIlx4OWYiICJCU0QvT1MiLCAgICAgICAgICAgLyogQlNESSAqLworCSJceGEwIiAiVGhpbmtwYWQgaGliZXJuYXRpb24iLAorCSJceGE1IiAiRnJlZUJTRCIsICAgICAgICAgIC8qIHZhcmlvdXMgQlNEIGZsYXZvdXJzICovCisJIlx4YTYiICJPcGVuQlNEIiwKKwkiXHhhOCIgIkRhcndpbiBVRlMiLAorCSJceGE5IiAiTmV0QlNEIiwKKwkiXHhhYiIgIkRhcndpbiBib290IiwKKwkiXHhiNyIgIkJTREkgZnMiLAorCSJceGI4IiAiQlNESSBzd2FwIiwKKwkiXHhiZSIgIlNvbGFyaXMgYm9vdCIsCisJIlx4ZWIiICJCZU9TIGZzIiwKKwkiXHhlZSIgIkVGSSBHUFQiLCAgICAgICAgICAgICAgICAgICAgLyogSW50ZWwgRUZJIEdVSUQgUGFydGl0aW9uIFRhYmxlICovCisJIlx4ZWYiICJFRkkgKEZBVC0xMi8xNi8zMikiLCAgICAgICAgIC8qIEludGVsIEVGSSBTeXN0ZW0gUGFydGl0aW9uICovCisJIlx4ZjAiICJMaW51eC9QQS1SSVNDIGJvb3QiLCAgICAgICAgIC8qIExpbnV4L1BBLVJJU0MgYm9vdCBsb2FkZXIgKi8KKwkiXHhmMiIgIkRPUyBzZWNvbmRhcnkiLCAgICAgICAgICAgICAgLyogRE9TIDMuMysgc2Vjb25kYXJ5ICovCisJIlx4ZmQiICJMaW51eCByYWlkIGF1dG9kZXRlY3QiLCAgICAgIC8qIE5ldyAoMi4yLngpIHJhaWQgcGFydGl0aW9uIHdpdGgKKwkJCQkJCWF1dG9kZXRlY3QgdXNpbmcgcGVyc2lzdGVudAorCQkJCQkJc3VwZXJibG9jayAqLworI2lmIDAgLyogRU5BQkxFX1dFSVJEX1BBUlRJVElPTl9UWVBFUyAqLworCSJceDAyIiAiWEVOSVggcm9vdCIsCisJIlx4MDMiICJYRU5JWCB1c3IiLAorCSJceDA4IiAiQUlYIiwgICAgICAgICAgICAgIC8qIEFJWCBib290IChBSVggLS0gUFMvMiBwb3J0KSBvciBTcGxpdERyaXZlICovCisJIlx4MDkiICJBSVggYm9vdGFibGUiLCAgICAgLyogQUlYIGRhdGEgb3IgQ29oZXJlbnQgKi8KKwkiXHgxMCIgIk9QVVMiLAorCSJceDE4IiAiQVNUIFNtYXJ0U2xlZXAiLAorCSJceDI0IiAiTkVDIERPUyIsCisJIlx4MzkiICJQbGFuIDkiLAorCSJceDQwIiAiVmVuaXggODAyODYiLAorCSJceDRkIiAiUU5YNC54IiwKKwkiXHg0ZSIgIlFOWDQueCAybmQgcGFydCIsCisJIlx4NGYiICJRTlg0LnggM3JkIHBhcnQiLAorCSJceDUwIiAiT25UcmFjayBETSIsCisJIlx4NTEiICJPblRyYWNrIERNNiBBdXgxIiwgLyogKG9yIE5vdmVsbCkgKi8KKwkiXHg1MiIgIkNQL00iLCAgICAgICAgICAgICAvKiBDUC9NIG9yIE1pY3JvcG9ydCBTeXNWL0FUICovCisJIlx4NTMiICJPblRyYWNrIERNNiBBdXgzIiwKKwkiXHg1NCIgIk9uVHJhY2tETTYiLAorCSJceDU1IiAiRVotRHJpdmUiLAorCSJceDU2IiAiR29sZGVuIEJvdyIsCisJIlx4NWMiICJQcmlhbSBFZGlzayIsCisJIlx4NjEiICJTcGVlZFN0b3IiLAorCSJceDY0IiAiTm92ZWxsIE5ldHdhcmUgMjg2IiwKKwkiXHg2NSIgIk5vdmVsbCBOZXR3YXJlIDM4NiIsCisJIlx4NzAiICJEaXNrU2VjdXJlIE11bHRpLUJvb3QiLAorCSJceDc1IiAiUEMvSVgiLAorCSJceDkzIiAiQW1vZWJhIiwKKwkiXHg5NCIgIkFtb2ViYSBCQlQiLCAgICAgICAvKiAoYmFkIGJsb2NrIHRhYmxlKSAqLworCSJceGE3IiAiTmVYVFNURVAiLAorCSJceGJiIiAiQm9vdCBXaXphcmQgaGlkZGVuIiwKKwkiXHhjMSIgIkRSRE9TL3NlYyAoRkFULTEyKSIsCisJIlx4YzQiICJEUkRPUy9zZWMgKEZBVC0xNiA8IDMyTSkiLAorCSJceGM2IiAiRFJET1Mvc2VjIChGQVQtMTYpIiwKKwkiXHhjNyIgIlN5cmlueCIsCisJIlx4ZGEiICJOb24tRlMgZGF0YSIsCisJIlx4ZGIiICJDUC9NIC8gQ1RPUyAvIC4uLiIsLyogQ1AvTSBvciBDb25jdXJyZW50IENQL00gb3IKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50IERPUyBvciBDVE9TICovCisJIlx4ZGUiICJEZWxsIFV0aWxpdHkiLCAgICAgLyogRGVsbCBQb3dlckVkZ2UgU2VydmVyIHV0aWxpdGllcyAqLworCSJceGRmIiAiQm9vdEl0IiwgICAgICAgICAgIC8qIEJvb3RJdCBFTUJSTSAqLworCSJceGUxIiAiRE9TIGFjY2VzcyIsICAgICAgIC8qIERPUyBhY2Nlc3Mgb3IgU3BlZWRTdG9yIDEyLWJpdCBGQVQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBwYXJ0aXRpb24gKi8KKwkiXHhlMyIgIkRPUyBSL08iLCAgICAgICAgICAvKiBET1MgUi9PIG9yIFNwZWVkU3RvciAqLworCSJceGU0IiAiU3BlZWRTdG9yIiwgICAgICAgIC8qIFNwZWVkU3RvciAxNi1iaXQgRkFUIGV4dGVuZGVkCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIDwgMTAyNCBjeWwuICovCisJIlx4ZjEiICJTcGVlZFN0b3IiLAorCSJceGY0IiAiU3BlZWRTdG9yIiwgICAgICAgIC8qIFNwZWVkU3RvciBsYXJnZSBwYXJ0aXRpb24gKi8KKwkiXHhmZSIgIkxBTnN0ZXAiLCAgICAgICAgICAvKiBTcGVlZFN0b3IgPjEwMjQgY3lsLiBvciBMQU5zdGVwICovCisJIlx4ZmYiICJCQlQiLCAgICAgICAgICAgICAgLyogWGVuaXggQmFkIEJsb2NrIFRhYmxlICovCisjZW5kaWYKKwlOVUxMCit9OworCitlbnVtIHsKKwlkZXZfZmQgPSAzICAgICAgICAgICAgICAgICAgLyogdGhlIGRpc2sgKi8KK307CisKKy8qIEdsb2JhbHMgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICpsaW5lX3B0cjsKKworCWNvbnN0IGNoYXIgKmRpc2tfZGV2aWNlOworCWludCBnX3BhcnRpdGlvbnM7IC8vID0gNDsgICAgICAgLyogbWF4aW11bSBwYXJ0aXRpb24gKyAxICovCisJdW5zaWduZWQgdW5pdHNfcGVyX3NlY3RvcjsgLy8gPSAxOworCXVuc2lnbmVkIHNlY3Rvcl9zaXplOyAvLyA9IERFRkFVTFRfU0VDVE9SX1NJWkU7CisJdW5zaWduZWQgdXNlcl9zZXRfc2VjdG9yX3NpemU7CisJdW5zaWduZWQgc2VjdG9yX29mZnNldDsgLy8gPSAxOworCXVuc2lnbmVkIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnM7CisJc21hbGxpbnQgLyogZW51bSBsYWJlbF90eXBlICovIGN1cnJlbnRfbGFiZWxfdHlwZTsKKwlzbWFsbGludCBkaXNwbGF5X2luX2N5bF91bml0czsgLy8gPSAxOworI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorCXNtYWxsaW50IHBvc3NpYmx5X29zZl9sYWJlbDsKKyNlbmRpZgorCisJc21hbGxpbnQgbGlzdGluZzsgICAgICAgICAgICAgICAvKiBubyBhYm9ydHMgZm9yIGZkaXNrIC1sICovCisJc21hbGxpbnQgZG9zX2NvbXBhdGlibGVfZmxhZzsgLy8gPSAxOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJLy9pbnQgZG9zX2NoYW5nZWQ7CisJc21hbGxpbnQgbm93YXJuOyAgICAgICAgICAgICAgICAvKiBubyB3YXJuaW5ncyBmb3IgZmRpc2sgLWwvLXMgKi8KKyNlbmRpZgorCWludCBleHRfaW5kZXg7ICAgICAgICAgICAgICAgICAgLyogdGhlIHByaW1lIGV4dGVuZGVkIHBhcnRpdGlvbiAqLworCXVuc2lnbmVkIHVzZXJfY3lsaW5kZXJzLCB1c2VyX2hlYWRzLCB1c2VyX3NlY3RvcnM7CisJdW5zaWduZWQgcHRfaGVhZHMsIHB0X3NlY3RvcnM7CisJdW5zaWduZWQga2Vybl9oZWFkcywga2Vybl9zZWN0b3JzOworCXNlY3Rvcl90IGV4dGVuZGVkX29mZnNldDsgICAgICAgLyogb2Zmc2V0IG9mIGxpbmsgcG9pbnRlcnMgKi8KKwlzZWN0b3JfdCB0b3RhbF9udW1iZXJfb2Zfc2VjdG9yczsKKworCWptcF9idWYgbGlzdGluZ2J1ZjsKKwljaGFyIGxpbmVfYnVmZmVyWzgwXTsKKwljaGFyIHBhcnRuYW1lX2J1ZmZlcls4MF07CisJLyogUmF3IGRpc2sgbGFiZWwuIEZvciBET1MtdHlwZSBwYXJ0aXRpb24gdGFibGVzIHRoZSBNQlIsCisJICogd2l0aCBkZXNjcmlwdGlvbnMgb2YgdGhlIHByaW1hcnkgcGFydGl0aW9ucy4gKi8KKwljaGFyIE1CUmJ1ZmZlcltNQVhfU0VDVE9SX1NJWkVdOworCS8qIFBhcnRpdGlvbiB0YWJsZXMgKi8KKwlzdHJ1Y3QgcHRlIHB0ZXNbTUFYSU1VTV9QQVJUU107Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGxpbmVfcHRyICAgICAgICAgICAgIChHLmxpbmVfcHRyICAgICAgICAgICAgKQorI2RlZmluZSBkaXNrX2RldmljZSAgICAgICAgICAoRy5kaXNrX2RldmljZSAgICAgICAgICkKKyNkZWZpbmUgZ19wYXJ0aXRpb25zICAgICAgICAgKEcuZ19wYXJ0aXRpb25zICAgICAgICApCisjZGVmaW5lIHVuaXRzX3Blcl9zZWN0b3IgICAgIChHLnVuaXRzX3Blcl9zZWN0b3IgICAgKQorI2RlZmluZSBzZWN0b3Jfc2l6ZSAgICAgICAgICAoRy5zZWN0b3Jfc2l6ZSAgICAgICAgICkKKyNkZWZpbmUgdXNlcl9zZXRfc2VjdG9yX3NpemUgKEcudXNlcl9zZXRfc2VjdG9yX3NpemUpCisjZGVmaW5lIHNlY3Rvcl9vZmZzZXQgICAgICAgIChHLnNlY3Rvcl9vZmZzZXQgICAgICAgKQorI2RlZmluZSBnX2hlYWRzICAgICAgICAgICAgICAoRy5nX2hlYWRzICAgICAgICAgICAgICkKKyNkZWZpbmUgZ19zZWN0b3JzICAgICAgICAgICAgKEcuZ19zZWN0b3JzICAgICAgICAgICApCisjZGVmaW5lIGdfY3lsaW5kZXJzICAgICAgICAgIChHLmdfY3lsaW5kZXJzICAgICAgICAgKQorI2RlZmluZSBjdXJyZW50X2xhYmVsX3R5cGUgICAoRy5jdXJyZW50X2xhYmVsX3R5cGUgICkKKyNkZWZpbmUgZGlzcGxheV9pbl9jeWxfdW5pdHMgKEcuZGlzcGxheV9pbl9jeWxfdW5pdHMpCisjZGVmaW5lIHBvc3NpYmx5X29zZl9sYWJlbCAgIChHLnBvc3NpYmx5X29zZl9sYWJlbCAgKQorI2RlZmluZSBsaXN0aW5nICAgICAgICAgICAgICAgICAoRy5saXN0aW5nICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZG9zX2NvbXBhdGlibGVfZmxhZyAgICAgKEcuZG9zX2NvbXBhdGlibGVfZmxhZyAgICApCisjZGVmaW5lIG5vd2FybiAgICAgICAgICAgICAgICAgIChHLm5vd2FybiAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBleHRfaW5kZXggICAgICAgICAgICAgICAoRy5leHRfaW5kZXggICAgICAgICAgICAgICkKKyNkZWZpbmUgdXNlcl9jeWxpbmRlcnMgICAgICAgICAgKEcudXNlcl9jeWxpbmRlcnMgICAgICAgICApCisjZGVmaW5lIHVzZXJfaGVhZHMgICAgICAgICAgICAgIChHLnVzZXJfaGVhZHMgICAgICAgICAgICAgKQorI2RlZmluZSB1c2VyX3NlY3RvcnMgICAgICAgICAgICAoRy51c2VyX3NlY3RvcnMgICAgICAgICAgICkKKyNkZWZpbmUgcHRfaGVhZHMgICAgICAgICAgICAgICAgKEcucHRfaGVhZHMgICAgICAgICAgICAgICApCisjZGVmaW5lIHB0X3NlY3RvcnMgICAgICAgICAgICAgIChHLnB0X3NlY3RvcnMgICAgICAgICAgICAgKQorI2RlZmluZSBrZXJuX2hlYWRzICAgICAgICAgICAgICAoRy5rZXJuX2hlYWRzICAgICAgICAgICAgICkKKyNkZWZpbmUga2Vybl9zZWN0b3JzICAgICAgICAgICAgKEcua2Vybl9zZWN0b3JzICAgICAgICAgICApCisjZGVmaW5lIGV4dGVuZGVkX29mZnNldCAgICAgICAgIChHLmV4dGVuZGVkX29mZnNldCAgICAgICAgKQorI2RlZmluZSB0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycyAoRy50b3RhbF9udW1iZXJfb2Zfc2VjdG9ycykKKyNkZWZpbmUgbGlzdGluZ2J1ZiAgICAgIChHLmxpc3RpbmdidWYgICAgICkKKyNkZWZpbmUgbGluZV9idWZmZXIgICAgIChHLmxpbmVfYnVmZmVyICAgICkKKyNkZWZpbmUgcGFydG5hbWVfYnVmZmVyIChHLnBhcnRuYW1lX2J1ZmZlcikKKyNkZWZpbmUgTUJSYnVmZmVyICAgICAgIChHLk1CUmJ1ZmZlciAgICAgICkKKyNkZWZpbmUgcHRlcyAgICAgICAgICAgIChHLnB0ZXMgICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlzZWN0b3Jfc2l6ZSA9IERFRkFVTFRfU0VDVE9SX1NJWkU7IFwKKwlzZWN0b3Jfb2Zmc2V0ID0gMTsgXAorCWdfcGFydGl0aW9ucyA9IDQ7IFwKKwlkaXNwbGF5X2luX2N5bF91bml0cyA9IDE7IFwKKwl1bml0c19wZXJfc2VjdG9yID0gMTsgXAorCWRvc19jb21wYXRpYmxlX2ZsYWcgPSAxOyBcCit9IHdoaWxlICgwKQorCisKKy8qIFRPRE86IG1vdmUgdG8gbGliYmI/ICovCisvKiBUT0RPOiByZXR1cm4gdW5zaWduZWQgbG9uZyBsb25nLCBGRUFUVVJFX0ZESVNLX0JMS1NJWkUgX2Nhbl8gaGFuZGxlCisgKiBkaXNrcyA+IDJeMzIgc2VjdG9ycworICovCitzdGF0aWMgc2VjdG9yX3QgYmJfQkxLR0VUU0laRV9zZWN0b3JzKGludCBmZCkKK3sKKwl1aW50NjRfdCB2NjQ7CisJdW5zaWduZWQgbG9uZyBsb25nc2VjdG9yczsKKworCWlmIChpb2N0bChmZCwgQkxLR0VUU0laRTY0LCAmdjY0KSA9PSAwKSB7CisJCS8qIEdvdCBieXRlcywgY29udmVydCB0byA1MTIgYnl0ZSBzZWN0b3JzICovCisJCXY2NCA+Pj0gOTsKKwkJaWYgKHY2NCAhPSAoc2VjdG9yX3QpdjY0KSB7CisgcmV0X3RydW5jOgorCQkJLyogTm90IG9ubHkgRE9TLCBidXQgYWxsIG90aGVyIHBhcnRpdGlvbiB0YWJsZXMKKwkJCSAqIHdlIHN1cHBvcnQgY2FuJ3QgcmVjb3JkIG1vcmUgdGhhbiAzMiBiaXQKKwkJCSAqIHNlY3RvciBjb3VudHMgb3Igb2Zmc2V0cworCQkJICovCisJCQliYl9lcnJvcl9tc2coImRldmljZSBoYXMgbW9yZSB0aGFuIDJeMzIgc2VjdG9ycywgY2FuJ3QgdXNlIGFsbCBvZiB0aGVtIik7CisJCQl2NjQgPSAodWludDMyX3QpLTFMOworCQl9CisJCXJldHVybiB2NjQ7CisJfQorCS8qIE5lZWRzIHRlbXAgb2YgdHlwZSBsb25nICovCisJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmbG9uZ3NlY3RvcnMpKSB7CisJCS8qIFBlcmhhcHMgdGhpcyBpcyBhIGRpc2sgaW1hZ2UgKi8KKwkJb2ZmX3Qgc3ogPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCQlsb25nc2VjdG9ycyA9IDA7CisJCWlmIChzeiA+IDApCisJCQlsb25nc2VjdG9ycyA9ICh1b2ZmX3Qpc3ogLyBzZWN0b3Jfc2l6ZTsKKwkJbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwl9CisJaWYgKHNpemVvZihsb25nKSA+IHNpemVvZihzZWN0b3JfdCkKKwkgJiYgbG9uZ3NlY3RvcnMgIT0gKHNlY3Rvcl90KWxvbmdzZWN0b3JzCisJKSB7CisJCWdvdG8gcmV0X3RydW5jOworCX0KKwlyZXR1cm4gbG9uZ3NlY3RvcnM7Cit9CisKKworI2RlZmluZSBJU19FWFRFTkRFRChpKSBcCisJKChpKSA9PSBFWFRFTkRFRCB8fCAoaSkgPT0gV0lOOThfRVhURU5ERUQgfHwgKGkpID09IExJTlVYX0VYVEVOREVEKQorCisjZGVmaW5lIGNyb3VuZChuKSAgICAgICAoZGlzcGxheV9pbl9jeWxfdW5pdHMgPyAoKG4pL3VuaXRzX3Blcl9zZWN0b3IpKzEgOiAobikpCisKKyNkZWZpbmUgc2Nyb3VuZCh4KSAgICAgICgoKHgpK3VuaXRzX3Blcl9zZWN0b3ItMSkvdW5pdHNfcGVyX3NlY3RvcikKKworI2RlZmluZSBwdF9vZmZzZXQoYiwgbikgXAorCSgoc3RydWN0IHBhcnRpdGlvbiAqKSgoYikgKyAweDFiZSArIChuKSAqIHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSkpCisKKyNkZWZpbmUgc2VjdG9yKHMpICAgICAgICgocykgJiAweDNmKQorCisjZGVmaW5lIGN5bGluZGVyKHMsIGMpICAoKGMpIHwgKCgocykgJiAweGMwKSA8PCAyKSkKKworI2RlZmluZSBoc2Myc2VjdG9yKGgscyxjKSBcCisJKHNlY3RvcihzKSAtIDEgKyBzZWN0b3JzICogKChoKSArIGhlYWRzICogY3lsaW5kZXIocyxjKSkpCisKK3N0YXRpYyB2b2lkCitjbG9zZV9kZXZfZmQodm9pZCkKK3sKKwkvKiBOb3QgcmVhbGx5IGNsb3NpbmcsIGJ1dCBtYWtpbmcgc3VyZSBpdCBpcyBvcGVuLCBhbmQgdG8gaGFybWxlc3MgcGxhY2UgKi8KKwl4bW92ZV9mZCh4b3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpLCBkZXZfZmQpOworfQorCisvKgorICogUmV0dXJuIHBhcnRpdGlvbiBuYW1lIC0gdXNlcyBzdGF0aWMgc3RvcmFnZQorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJ0bmFtZShjb25zdCBjaGFyICpkZXYsIGludCBwbm8sIGludCBsdGgpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgdywgd3A7CisJaW50IGJ1ZnNpejsKKwljaGFyICpidWZwOworCisJYnVmcCA9IHBhcnRuYW1lX2J1ZmZlcjsKKwlidWZzaXogPSBzaXplb2YocGFydG5hbWVfYnVmZmVyKTsKKworCXcgPSBzdHJsZW4oZGV2KTsKKwlwID0gIiI7CisKKwlpZiAoaXNkaWdpdChkZXZbdy0xXSkpCisJCXAgPSAicCI7CisKKwkvKiBkZXZmcyBrbHVkZ2UgLSBub3RlOiBmZGlzayBwYXJ0aXRpb24gbmFtZXMgYXJlIG5vdCBzdXBwb3NlZAorCSAgIHRvIGVxdWFsIGtlcm5lbCBuYW1lcywgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIGRvIHRoaXMgKi8KKwlpZiAoc3RyY21wKGRldiArIHcgLSA0LCAiZGlzYyIpID09IDApIHsKKwkJdyAtPSA0OworCQlwID0gInBhcnQiOworCX0KKworCXdwID0gc3RybGVuKHApOworCisJaWYgKGx0aCkgeworCQlzbnByaW50ZihidWZwLCBidWZzaXosICIlKi4qcyVzJS0ydSIsCisJCQlsdGgtd3AtMiwgdywgZGV2LCBwLCBwbm8pOworCX0gZWxzZSB7CisJCXNucHJpbnRmKGJ1ZnAsIGJ1ZnNpeiwgIiUuKnMlcyUtMnUiLCB3LCBkZXYsIHAsIHBubyk7CisJfQorCXJldHVybiBidWZwOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSBzdHJ1Y3QgcGFydGl0aW9uICoKK2dldF9wYXJ0X3RhYmxlKGludCBpKQoreworCXJldHVybiBwdGVzW2ldLnBhcnRfdGFibGU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3N0cl91bml0cyhpbnQgbikKK3sgICAgICAvKiBuPT0xOiB1c2Ugc2luZ3VsYXIgKi8KKwlpZiAobiA9PSAxKQorCQlyZXR1cm4gZGlzcGxheV9pbl9jeWxfdW5pdHMgPyAiY3lsaW5kZXIiIDogInNlY3RvciI7CisJcmV0dXJuIGRpc3BsYXlfaW5fY3lsX3VuaXRzID8gImN5bGluZGVycyIgOiAic2VjdG9ycyI7Cit9CisKK3N0YXRpYyBpbnQKK3ZhbGlkX3BhcnRfdGFibGVfZmxhZyhjb25zdCBjaGFyICptYnVmZmVyKQoreworCXJldHVybiAobWJ1ZmZlcls1MTBdID09IDB4NTUgJiYgKHVpbnQ4X3QpbWJ1ZmZlcls1MTFdID09IDB4YWEpOworfQorCitzdGF0aWMgdm9pZCBmZGlza19mYXRhbChjb25zdCBjaGFyICp3aHkpCit7CisJaWYgKGxpc3RpbmcpIHsKKwkJY2xvc2VfZGV2X2ZkKCk7CisJCWxvbmdqbXAobGlzdGluZ2J1ZiwgMSk7CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKHdoeSwgZGlza19kZXZpY2UpOworfQorCitzdGF0aWMgdm9pZAorc2Vla19zZWN0b3Ioc2VjdG9yX3Qgc2Vjbm8pCit7CisjaWYgRU5BQkxFX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1MKKwlvZmY2NF90IG9mZiA9IChvZmY2NF90KXNlY25vICogc2VjdG9yX3NpemU7CisJaWYgKGxzZWVrNjQoZGV2X2ZkLCBvZmYsIFNFRUtfU0VUKSA9PSAob2ZmNjRfdCkgLTEpCisJCWZkaXNrX2ZhdGFsKHVuYWJsZV90b19zZWVrKTsKKyNlbHNlCisJdWludDY0X3Qgb2ZmID0gKHVpbnQ2NF90KXNlY25vICogc2VjdG9yX3NpemU7CisJaWYgKG9mZiA+IE1BWElOVChvZmZfdCkKKwkgfHwgbHNlZWsoZGV2X2ZkLCAob2ZmX3Qpb2ZmLCBTRUVLX1NFVCkgPT0gKG9mZl90KSAtMQorCSkgeworCQlmZGlza19mYXRhbCh1bmFibGVfdG9fc2Vlayk7CisJfQorI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorLyogUmVhZCBsaW5lOyByZXR1cm4gMCBvciBmaXJzdCBwcmludGFibGUgY2hhciAqLworc3RhdGljIGludAorcmVhZF9saW5lKGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwlpbnQgc3o7CisKKwlzeiA9IHJlYWRfbGluZV9pbnB1dChOVUxMLCBwcm9tcHQsIGxpbmVfYnVmZmVyLCBzaXplb2YobGluZV9idWZmZXIpLCAvKnRpbWVvdXQqLyAtMSk7CisJaWYgKHN6IDw9IDApCisJCWV4aXQoRVhJVF9TVUNDRVNTKTsgLyogQ3RybC1EIG9yIEN0cmwtQyAqLworCisJaWYgKGxpbmVfYnVmZmVyW3N6LTFdID09ICdcbicpCisJCWxpbmVfYnVmZmVyWy0tc3pdID0gJ1wwJzsKKworCWxpbmVfcHRyID0gbGluZV9idWZmZXI7CisJd2hpbGUgKCpsaW5lX3B0ciAhPSAnXDAnICYmICh1bnNpZ25lZCBjaGFyKSpsaW5lX3B0ciA8PSAnICcpCisJCWxpbmVfcHRyKys7CisJcmV0dXJuICpsaW5lX3B0cjsKK30KKworc3RhdGljIHZvaWQKK3NldF9hbGxfdW5jaGFuZ2VkKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9QQVJUUzsgaSsrKQorCQlwdGVzW2ldLmNoYW5nZWQgPSAwOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkCitzZXRfY2hhbmdlZChpbnQgaSkKK3sKKwlwdGVzW2ldLmNoYW5nZWQgPSAxOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkCit3cml0ZV9wYXJ0X3RhYmxlX2ZsYWcoY2hhciAqYikKK3sKKwliWzUxMF0gPSAweDU1OworCWJbNTExXSA9IDB4YWE7Cit9CisKK3N0YXRpYyBjaGFyCityZWFkX25vbmVtcHR5KGNvbnN0IGNoYXIgKm1lc2cpCit7CisJd2hpbGUgKCFyZWFkX2xpbmUobWVzZykpCisJCWNvbnRpbnVlOworCXJldHVybiAqbGluZV9wdHI7Cit9CisKK3N0YXRpYyBjaGFyCityZWFkX21heWJlX2VtcHR5KGNvbnN0IGNoYXIgKm1lc2cpCit7CisJaWYgKCFyZWFkX2xpbmUobWVzZykpIHsKKwkJbGluZV9wdHIgPSBsaW5lX2J1ZmZlcjsKKwkJbGluZV9wdHJbMF0gPSAnXG4nOworCQlsaW5lX3B0clsxXSA9ICdcMCc7CisJfQorCXJldHVybiBsaW5lX3B0clswXTsKK30KKworc3RhdGljIGludAorcmVhZF9oZXgoY29uc3QgY2hhciAqY29uc3QgKnN5cykKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisJd2hpbGUgKDEpIHsKKwkJcmVhZF9ub25lbXB0eSgiSGV4IGNvZGUgKHR5cGUgTCB0byBsaXN0IGNvZGVzKTogIik7CisJCWlmICgobGluZV9wdHJbMF0gfCAweDIwKSA9PSAnbCcpIHsKKwkJCWxpc3RfdHlwZXMoc3lzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXYgPSBiYl9zdHJ0b3VsKGxpbmVfcHRyLCBOVUxMLCAxNik7CisJCWlmICh2IDw9IDB4ZmYpCisJCQlyZXR1cm4gdjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9zZWN0b3Ioc2VjdG9yX3Qgc2Vjbm8sIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzZWVrX3NlY3RvcihzZWNubyk7CisJeHdyaXRlKGRldl9mZCwgYnVmLCBzZWN0b3Jfc2l6ZSk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19XUklUQUJMRSAqLworCisKKyNpbmNsdWRlICJmZGlza19haXguYyIKKworc3RydWN0IHN1bl9wYXJ0aXRpb24geworCXVuc2lnbmVkIGNoYXIgaW5mb1sxMjhdOyAgIC8qIEluZm9ybWF0aXZlIHRleHQgc3RyaW5nICovCisJdW5zaWduZWQgY2hhciBzcGFyZTBbMTRdOworCXN0cnVjdCBzdW5faW5mbyB7CisJCXVuc2lnbmVkIGNoYXIgc3BhcmUxOworCQl1bnNpZ25lZCBjaGFyIGlkOworCQl1bnNpZ25lZCBjaGFyIHNwYXJlMjsKKwkJdW5zaWduZWQgY2hhciBmbGFnczsKKwl9IGluZm9zWzhdOworCXVuc2lnbmVkIGNoYXIgc3BhcmUxWzI0Nl07IC8qIEJvb3QgaW5mb3JtYXRpb24gZXRjLiAqLworCXVuc2lnbmVkIHNob3J0IHJzcGVlZDsgICAgIC8qIERpc2sgcm90YXRpb25hbCBzcGVlZCAqLworCXVuc2lnbmVkIHNob3J0IHBjeWxjb3VudDsgIC8qIFBoeXNpY2FsIGN5bGluZGVyIGNvdW50ICovCisJdW5zaWduZWQgc2hvcnQgc3BhcmVjeWw7ICAgLyogZXh0cmEgc2VjdHMgcGVyIGN5bGluZGVyICovCisJdW5zaWduZWQgY2hhciBzcGFyZTJbNF07ICAgLyogTW9yZSBtYWdpYy4uLiAqLworCXVuc2lnbmVkIHNob3J0IGlsZmFjdDsgICAgIC8qIEludGVybGVhdmUgZmFjdG9yICovCisJdW5zaWduZWQgc2hvcnQgbmN5bDsgICAgICAgLyogRGF0YSBjeWxpbmRlciBjb3VudCAqLworCXVuc2lnbmVkIHNob3J0IG5hY3lsOyAgICAgIC8qIEFsdC4gY3lsaW5kZXIgY291bnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBudHJrczsgICAgICAvKiBUcmFja3MgcGVyIGN5bGluZGVyICovCisJdW5zaWduZWQgc2hvcnQgbnNlY3Q7ICAgICAgLyogU2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1bnNpZ25lZCBjaGFyIHNwYXJlM1s0XTsgICAvKiBFdmVuIG1vcmUgbWFnaWMuLi4gKi8KKwlzdHJ1Y3Qgc3VuX3BhcnRpbmZvIHsKKwkJdWludDMyX3Qgc3RhcnRfY3lsaW5kZXI7CisJCXVpbnQzMl90IG51bV9zZWN0b3JzOworCX0gcGFydGl0aW9uc1s4XTsKKwl1bnNpZ25lZCBzaG9ydCBtYWdpYzsgICAgICAvKiBNYWdpYyBudW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBjc3VtOyAgICAgICAvKiBMYWJlbCB4b3InZCBjaGVja3N1bSAqLworfSBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIHN0cnVjdCBzdW5fcGFydGl0aW9uIHN1bl9wYXJ0aXRpb247CisjZGVmaW5lIHN1bmxhYmVsICgoc3VuX3BhcnRpdGlvbiAqKU1CUmJ1ZmZlcikKK1NUQVRJQ19PU0Ygdm9pZCBic2Rfc2VsZWN0KHZvaWQpOworU1RBVElDX09TRiB2b2lkIHhic2RfcHJpbnRfZGlza2xhYmVsKGludCk7CisjaW5jbHVkZSAiZmRpc2tfb3NmLmMiCisKK1NUQVRJQ19HUFQgdm9pZCBncHRfbGlzdF90YWJsZShpbnQgeHRyYSk7CisjaW5jbHVkZSAiZmRpc2tfZ3B0LmMiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwgfHwgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCitzdGF0aWMgdWludDE2X3QKK2ZkaXNrX3N3YXAxNih1aW50MTZfdCB4KQoreworCXJldHVybiAoeCA8PCA4KSB8ICh4ID4+IDgpOworfQorCitzdGF0aWMgdWludDMyX3QKK2ZkaXNrX3N3YXAzMih1aW50MzJfdCB4KQoreworCXJldHVybiAoeCA8PCAyNCkgfAorCSAgICAgICAoKHggJiAweEZGMDApIDw8IDgpIHwKKwkgICAgICAgKCh4ICYgMHhGRjAwMDApID4+IDgpIHwKKwkgICAgICAgKHggPj4gMjQpOworfQorI2VuZGlmCisKK1NUQVRJQ19TR0kgY29uc3QgY2hhciAqY29uc3Qgc2dpX3N5c190eXBlc1tdOworU1RBVElDX1NHSSB1bnNpZ25lZCBzZ2lfZ2V0X251bV9zZWN0b3JzKGludCBpKTsKK1NUQVRJQ19TR0kgaW50IHNnaV9nZXRfc3lzaWQoaW50IGkpOworU1RBVElDX1NHSSB2b2lkIHNnaV9kZWxldGVfcGFydGl0aW9uKGludCBpKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfY2hhbmdlX3N5c2lkKGludCBpLCBpbnQgc3lzKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfbGlzdF90YWJsZShpbnQgeHRyYSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfc2V0X3hjeWwodm9pZCk7CisjZW5kaWYKK1NUQVRJQ19TR0kgaW50IHZlcmlmeV9zZ2koaW50IHZlcmJvc2UpOworU1RBVElDX1NHSSB2b2lkIHNnaV9hZGRfcGFydGl0aW9uKGludCBuLCBpbnQgc3lzKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfc2V0X3N3YXBwYXJ0aXRpb24oaW50IGkpOworU1RBVElDX1NHSSBjb25zdCBjaGFyICpzZ2lfZ2V0X2Jvb3RmaWxlKHZvaWQpOworU1RBVElDX1NHSSB2b2lkIHNnaV9zZXRfYm9vdGZpbGUoY29uc3QgY2hhciogYUZpbGUpOworU1RBVElDX1NHSSB2b2lkIGNyZWF0ZV9zZ2lpbmZvKHZvaWQpOworU1RBVElDX1NHSSB2b2lkIHNnaV93cml0ZV90YWJsZSh2b2lkKTsKK1NUQVRJQ19TR0kgdm9pZCBzZ2lfc2V0X2Jvb3RwYXJ0aXRpb24oaW50IGkpOworI2luY2x1ZGUgImZkaXNrX3NnaS5jIgorCitTVEFUSUNfU1VOIGNvbnN0IGNoYXIgKmNvbnN0IHN1bl9zeXNfdHlwZXNbXTsKK1NUQVRJQ19TVU4gdm9pZCBzdW5fZGVsZXRlX3BhcnRpdGlvbihpbnQgaSk7CitTVEFUSUNfU1VOIHZvaWQgc3VuX2NoYW5nZV9zeXNpZChpbnQgaSwgaW50IHN5cyk7CitTVEFUSUNfU1VOIHZvaWQgc3VuX2xpc3RfdGFibGUoaW50IHh0cmEpOworU1RBVElDX1NVTiB2b2lkIGFkZF9zdW5fcGFydGl0aW9uKGludCBuLCBpbnQgc3lzKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorU1RBVElDX1NVTiB2b2lkIHN1bl9zZXRfYWx0X2N5bCh2b2lkKTsKK1NUQVRJQ19TVU4gdm9pZCBzdW5fc2V0X25jeWwoaW50IGN5bCk7CitTVEFUSUNfU1VOIHZvaWQgc3VuX3NldF94Y3lsKHZvaWQpOworU1RBVElDX1NVTiB2b2lkIHN1bl9zZXRfaWxmYWN0KHZvaWQpOworU1RBVElDX1NVTiB2b2lkIHN1bl9zZXRfcnNwZWVkKHZvaWQpOworU1RBVElDX1NVTiB2b2lkIHN1bl9zZXRfcGN5bGNvdW50KHZvaWQpOworI2VuZGlmCitTVEFUSUNfU1VOIHZvaWQgdG9nZ2xlX3N1bmZsYWdzKGludCBpLCB1bnNpZ25lZCBjaGFyIG1hc2spOworU1RBVElDX1NVTiB2b2lkIHZlcmlmeV9zdW4odm9pZCk7CitTVEFUSUNfU1VOIHZvaWQgc3VuX3dyaXRlX3RhYmxlKHZvaWQpOworI2luY2x1ZGUgImZkaXNrX3N1bi5jIgorCisKK3N0YXRpYyBpbmxpbmVfaWZfbGl0dGxlX2VuZGlhbiB1bnNpZ25lZAorcmVhZDRfbGl0dGxlX2VuZGlhbihjb25zdCB1bnNpZ25lZCBjaGFyICpjcCkKK3sKKwl1aW50MzJfdCB2OworCW1vdmVfZnJvbV91bmFsaWduZWQzMih2LCBjcCk7CisJcmV0dXJuIFNXQVBfTEUzMih2KTsKK30KKworc3RhdGljIHNlY3Rvcl90CitnZXRfc3RhcnRfc2VjdChjb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCXJldHVybiByZWFkNF9saXR0bGVfZW5kaWFuKHAtPnN0YXJ0NCk7Cit9CisKK3N0YXRpYyBzZWN0b3JfdAorZ2V0X25yX3NlY3RzKGNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnApCit7CisJcmV0dXJuIHJlYWQ0X2xpdHRsZV9lbmRpYW4ocC0+c2l6ZTQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKy8qIHN0YXJ0X3NlY3QgYW5kIG5yX3NlY3RzIGFyZSBzdG9yZWQgbGl0dGxlIGVuZGlhbiBvbiBhbGwgbWFjaGluZXMgKi8KKy8qIG1vcmVvdmVyLCB0aGV5IGFyZSBub3QgYWxpZ25lZCBjb3JyZWN0bHkgKi8KK3N0YXRpYyBpbmxpbmVfaWZfbGl0dGxlX2VuZGlhbiB2b2lkCitzdG9yZTRfbGl0dGxlX2VuZGlhbih1bnNpZ25lZCBjaGFyICpjcCwgdW5zaWduZWQgdmFsKQoreworCXVpbnQzMl90IHYgPSBTV0FQX0xFMzIodmFsKTsKKwltb3ZlX3RvX3VuYWxpZ25lZDMyKGNwLCB2KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9zdGFydF9zZWN0KHN0cnVjdCBwYXJ0aXRpb24gKnAsIHVuc2lnbmVkIHN0YXJ0X3NlY3QpCit7CisJc3RvcmU0X2xpdHRsZV9lbmRpYW4ocC0+c3RhcnQ0LCBzdGFydF9zZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9ucl9zZWN0cyhzdHJ1Y3QgcGFydGl0aW9uICpwLCB1bnNpZ25lZCBucl9zZWN0cykKK3sKKwlzdG9yZTRfbGl0dGxlX2VuZGlhbihwLT5zaXplNCwgbnJfc2VjdHMpOworfQorI2VuZGlmCisKKy8qIEFsbG9jYXRlIGEgYnVmZmVyIGFuZCByZWFkIGEgcGFydGl0aW9uIHRhYmxlIHNlY3RvciAqLworc3RhdGljIHZvaWQKK3JlYWRfcHRlKHN0cnVjdCBwdGUgKnBlLCBzZWN0b3JfdCBvZmZzZXQpCit7CisJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IG9mZnNldDsKKwlwZS0+c2VjdG9yYnVmZmVyID0geHphbGxvYyhzZWN0b3Jfc2l6ZSk7CisJc2Vla19zZWN0b3Iob2Zmc2V0KTsKKwkvKiB4cmVhZCB3b3VsZCBtYWtlIHVzIGFib3J0IC0gYmFkIGZvciBmZGlzayAtbCAqLworCWlmIChmdWxsX3JlYWQoZGV2X2ZkLCBwZS0+c2VjdG9yYnVmZmVyLCBzZWN0b3Jfc2l6ZSkgIT0gc2VjdG9yX3NpemUpCisJCWZkaXNrX2ZhdGFsKHVuYWJsZV90b19yZWFkKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCXBlLT5jaGFuZ2VkID0gMDsKKyNlbmRpZgorCXBlLT5wYXJ0X3RhYmxlID0gcGUtPmV4dF9wb2ludGVyID0gTlVMTDsKK30KKworc3RhdGljIHNlY3Rvcl90CitnZXRfcGFydGl0aW9uX3N0YXJ0X2Zyb21fZGV2X3N0YXJ0KGNvbnN0IHN0cnVjdCBwdGUgKnBlKQoreworCXJldHVybiBwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ICsgZ2V0X3N0YXJ0X3NlY3QocGUtPnBhcnRfdGFibGUpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKy8qCisgKiBBdm9pZCB3YXJuaW5nIGFib3V0IERPUyBwYXJ0aXRpb25zIHdoZW4gbm8gRE9TIHBhcnRpdGlvbiB3YXMgY2hhbmdlZC4KKyAqIEhlcmUgYSBoZXVyaXN0aWMgImlzIHByb2JhYmx5IGRvcyBwYXJ0aXRpb24iLgorICogV2UgbWlnaHQgYWxzbyBkbyB0aGUgb3Bwb3NpdGUgYW5kIHdhcm4gaW4gYWxsIGNhc2VzIGV4Y2VwdAorICogZm9yICJpcyBwcm9iYWJseSBub25kb3MgcGFydGl0aW9uIi4KKyAqLworI2lmZGVmIFVOVVNFRAorc3RhdGljIGludAoraXNfZG9zX3BhcnRpdGlvbihpbnQgdCkKK3sKKwlyZXR1cm4gKHQgPT0gMSB8fCB0ID09IDQgfHwgdCA9PSA2IHx8CisJCXQgPT0gMHgwYiB8fCB0ID09IDB4MGMgfHwgdCA9PSAweDBlIHx8CisJCXQgPT0gMHgxMSB8fCB0ID09IDB4MTIgfHwgdCA9PSAweDE0IHx8IHQgPT0gMHgxNiB8fAorCQl0ID09IDB4MWIgfHwgdCA9PSAweDFjIHx8IHQgPT0gMHgxZSB8fCB0ID09IDB4MjQgfHwKKwkJdCA9PSAweGMxIHx8IHQgPT0gMHhjNCB8fCB0ID09IDB4YzYpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCittZW51KHZvaWQpCit7CisJcHV0cygiQ29tbWFuZCBBY3Rpb24iKTsKKwlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCXB1dHMoImFcdHRvZ2dsZSBhIHJlYWQgb25seSBmbGFnIik7ICAgICAgICAgICAvKiBzdW4gKi8KKwkJcHV0cygiYlx0ZWRpdCBic2QgZGlza2xhYmVsIik7CisJCXB1dHMoImNcdHRvZ2dsZSB0aGUgbW91bnRhYmxlIGZsYWciKTsgICAgICAgICAvKiBzdW4gKi8KKwkJcHV0cygiZFx0ZGVsZXRlIGEgcGFydGl0aW9uIik7CisJCXB1dHMoImxcdGxpc3Qga25vd24gcGFydGl0aW9uIHR5cGVzIik7CisJCXB1dHMoIm5cdGFkZCBhIG5ldyBwYXJ0aXRpb24iKTsKKwkJcHV0cygib1x0Y3JlYXRlIGEgbmV3IGVtcHR5IERPUyBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicFx0cHJpbnQgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJxXHRxdWl0IHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMiKTsKKwkJcHV0cygic1x0Y3JlYXRlIGEgbmV3IGVtcHR5IFN1biBkaXNrbGFiZWwiKTsgIC8qIHN1biAqLworCQlwdXRzKCJ0XHRjaGFuZ2UgYSBwYXJ0aXRpb24ncyBzeXN0ZW0gaWQiKTsKKwkJcHV0cygidVx0Y2hhbmdlIGRpc3BsYXkvZW50cnkgdW5pdHMiKTsKKwkJcHV0cygidlx0dmVyaWZ5IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygid1x0d3JpdGUgdGFibGUgdG8gZGlzayBhbmQgZXhpdCIpOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0FEVkFOQ0VECisJCXB1dHMoInhcdGV4dHJhIGZ1bmN0aW9uYWxpdHkgKGV4cGVydHMgb25seSkiKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoTEFCRUxfSVNfU0dJKSB7CisJCXB1dHMoImFcdHNlbGVjdCBib290YWJsZSBwYXJ0aXRpb24iKTsgICAgLyogc2dpIGZsYXZvdXIgKi8KKwkJcHV0cygiYlx0ZWRpdCBib290ZmlsZSBlbnRyeSIpOyAgICAgICAgICAvKiBzZ2kgKi8KKwkJcHV0cygiY1x0c2VsZWN0IHNnaSBzd2FwIHBhcnRpdGlvbiIpOyAgICAvKiBzZ2kgZmxhdm91ciAqLworCQlwdXRzKCJkXHRkZWxldGUgYSBwYXJ0aXRpb24iKTsKKwkJcHV0cygibFx0bGlzdCBrbm93biBwYXJ0aXRpb24gdHlwZXMiKTsKKwkJcHV0cygiblx0YWRkIGEgbmV3IHBhcnRpdGlvbiIpOworCQlwdXRzKCJvXHRjcmVhdGUgYSBuZXcgZW1wdHkgRE9TIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJwXHRwcmludCB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcyIpOworCQlwdXRzKCJzXHRjcmVhdGUgYSBuZXcgZW1wdHkgU3VuIGRpc2tsYWJlbCIpOyAgLyogc3VuICovCisJCXB1dHMoInRcdGNoYW5nZSBhIHBhcnRpdGlvbidzIHN5c3RlbSBpZCIpOworCQlwdXRzKCJ1XHRjaGFuZ2UgZGlzcGxheS9lbnRyeSB1bml0cyIpOworCQlwdXRzKCJ2XHR2ZXJpZnkgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJ3XHR3cml0ZSB0YWJsZSB0byBkaXNrIGFuZCBleGl0Iik7CisJfSBlbHNlIGlmIChMQUJFTF9JU19BSVgpIHsKKwkJcHV0cygib1x0Y3JlYXRlIGEgbmV3IGVtcHR5IERPUyBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInNcdGNyZWF0ZSBhIG5ldyBlbXB0eSBTdW4gZGlza2xhYmVsIik7ICAvKiBzdW4gKi8KKwl9IGVsc2UgaWYgKExBQkVMX0lTX0dQVCkgeworCQlwdXRzKCJvXHRjcmVhdGUgYSBuZXcgZW1wdHkgRE9TIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJwXHRwcmludCB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInFcdHF1aXQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcyIpOworCQlwdXRzKCJzXHRjcmVhdGUgYSBuZXcgZW1wdHkgU3VuIGRpc2tsYWJlbCIpOyAgLyogc3VuICovCisJfSBlbHNlIHsKKwkJcHV0cygiYVx0dG9nZ2xlIGEgYm9vdGFibGUgZmxhZyIpOworCQlwdXRzKCJiXHRlZGl0IGJzZCBkaXNrbGFiZWwiKTsKKwkJcHV0cygiY1x0dG9nZ2xlIHRoZSBkb3MgY29tcGF0aWJpbGl0eSBmbGFnIik7CisJCXB1dHMoImRcdGRlbGV0ZSBhIHBhcnRpdGlvbiIpOworCQlwdXRzKCJsXHRsaXN0IGtub3duIHBhcnRpdGlvbiB0eXBlcyIpOworCQlwdXRzKCJuXHRhZGQgYSBuZXcgcGFydGl0aW9uIik7CisJCXB1dHMoIm9cdGNyZWF0ZSBhIG5ldyBlbXB0eSBET1MgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInNcdGNyZWF0ZSBhIG5ldyBlbXB0eSBTdW4gZGlza2xhYmVsIik7ICAvKiBzdW4gKi8KKwkJcHV0cygidFx0Y2hhbmdlIGEgcGFydGl0aW9uJ3Mgc3lzdGVtIGlkIik7CisJCXB1dHMoInVcdGNoYW5nZSBkaXNwbGF5L2VudHJ5IHVuaXRzIik7CisJCXB1dHMoInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoIndcdHdyaXRlIHRhYmxlIHRvIGRpc2sgYW5kIGV4aXQiKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorCQlwdXRzKCJ4XHRleHRyYSBmdW5jdGlvbmFsaXR5IChleHBlcnRzIG9ubHkpIik7CisjZW5kaWYKKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19XUklUQUJMRSAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorc3RhdGljIHZvaWQKK3htZW51KHZvaWQpCit7CisJcHV0cygiQ29tbWFuZCBBY3Rpb24iKTsKKwlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCXB1dHMoImFcdGNoYW5nZSBudW1iZXIgb2YgYWx0ZXJuYXRlIGN5bGluZGVycyIpOyAgICAgIC8qc3VuKi8KKwkJcHV0cygiY1x0Y2hhbmdlIG51bWJlciBvZiBjeWxpbmRlcnMiKTsKKwkJcHV0cygiZFx0cHJpbnQgdGhlIHJhdyBkYXRhIGluIHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygiZVx0Y2hhbmdlIG51bWJlciBvZiBleHRyYSBzZWN0b3JzIHBlciBjeWxpbmRlciIpOy8qc3VuKi8KKwkJcHV0cygiaFx0Y2hhbmdlIG51bWJlciBvZiBoZWFkcyIpOworCQlwdXRzKCJpXHRjaGFuZ2UgaW50ZXJsZWF2ZSBmYWN0b3IiKTsgICAgICAgICAgICAgICAgICAvKnN1biovCisJCXB1dHMoIm9cdGNoYW5nZSByb3RhdGlvbiBzcGVlZCAocnBtKSIpOyAgICAgICAgICAgICAgIC8qc3VuKi8KKwkJcHV0cygicFx0cHJpbnQgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJxXHRxdWl0IHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMiKTsKKwkJcHV0cygiclx0cmV0dXJuIHRvIG1haW4gbWVudSIpOworCQlwdXRzKCJzXHRjaGFuZ2UgbnVtYmVyIG9mIHNlY3RvcnMvdHJhY2siKTsKKwkJcHV0cygidlx0dmVyaWZ5IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygid1x0d3JpdGUgdGFibGUgdG8gZGlzayBhbmQgZXhpdCIpOworCQlwdXRzKCJ5XHRjaGFuZ2UgbnVtYmVyIG9mIHBoeXNpY2FsIGN5bGluZGVycyIpOyAgICAgICAvKnN1biovCisJfSBlbHNlIGlmIChMQUJFTF9JU19TR0kpIHsKKwkJcHV0cygiYlx0bW92ZSBiZWdpbm5pbmcgb2YgZGF0YSBpbiBhIHBhcnRpdGlvbiIpOyAvKiAhc3VuICovCisJCXB1dHMoImNcdGNoYW5nZSBudW1iZXIgb2YgY3lsaW5kZXJzIik7CisJCXB1dHMoImRcdHByaW50IHRoZSByYXcgZGF0YSBpbiB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoImVcdGxpc3QgZXh0ZW5kZWQgcGFydGl0aW9ucyIpOyAgICAgICAgICAvKiAhc3VuICovCisJCXB1dHMoImdcdGNyZWF0ZSBhbiBJUklYIChTR0kpIHBhcnRpdGlvbiB0YWJsZSIpOy8qIHNnaSAqLworCQlwdXRzKCJoXHRjaGFuZ2UgbnVtYmVyIG9mIGhlYWRzIik7CisJCXB1dHMoInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInJcdHJldHVybiB0byBtYWluIG1lbnUiKTsKKwkJcHV0cygic1x0Y2hhbmdlIG51bWJlciBvZiBzZWN0b3JzL3RyYWNrIik7CisJCXB1dHMoInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoIndcdHdyaXRlIHRhYmxlIHRvIGRpc2sgYW5kIGV4aXQiKTsKKwl9IGVsc2UgaWYgKExBQkVMX0lTX0FJWCkgeworCQlwdXRzKCJiXHRtb3ZlIGJlZ2lubmluZyBvZiBkYXRhIGluIGEgcGFydGl0aW9uIik7IC8qICFzdW4gKi8KKwkJcHV0cygiY1x0Y2hhbmdlIG51bWJlciBvZiBjeWxpbmRlcnMiKTsKKwkJcHV0cygiZFx0cHJpbnQgdGhlIHJhdyBkYXRhIGluIHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygiZVx0bGlzdCBleHRlbmRlZCBwYXJ0aXRpb25zIik7ICAgICAgICAgIC8qICFzdW4gKi8KKwkJcHV0cygiZ1x0Y3JlYXRlIGFuIElSSVggKFNHSSkgcGFydGl0aW9uIHRhYmxlIik7Lyogc2dpICovCisJCXB1dHMoImhcdGNoYW5nZSBudW1iZXIgb2YgaGVhZHMiKTsKKwkJcHV0cygicFx0cHJpbnQgdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJxXHRxdWl0IHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMiKTsKKwkJcHV0cygiclx0cmV0dXJuIHRvIG1haW4gbWVudSIpOworCQlwdXRzKCJzXHRjaGFuZ2UgbnVtYmVyIG9mIHNlY3RvcnMvdHJhY2siKTsKKwkJcHV0cygidlx0dmVyaWZ5IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygid1x0d3JpdGUgdGFibGUgdG8gZGlzayBhbmQgZXhpdCIpOworCX0gZWxzZSB7CisJCXB1dHMoImJcdG1vdmUgYmVnaW5uaW5nIG9mIGRhdGEgaW4gYSBwYXJ0aXRpb24iKTsgLyogIXN1biAqLworCQlwdXRzKCJjXHRjaGFuZ2UgbnVtYmVyIG9mIGN5bGluZGVycyIpOworCQlwdXRzKCJkXHRwcmludCB0aGUgcmF3IGRhdGEgaW4gdGhlIHBhcnRpdGlvbiB0YWJsZSIpOworCQlwdXRzKCJlXHRsaXN0IGV4dGVuZGVkIHBhcnRpdGlvbnMiKTsgICAgICAgICAgLyogIXN1biAqLworCQlwdXRzKCJmXHRmaXggcGFydGl0aW9uIG9yZGVyIik7ICAgICAgICAgICAgICAgLyogIXN1biwgIWFpeCwgIXNnaSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorCQlwdXRzKCJnXHRjcmVhdGUgYW4gSVJJWCAoU0dJKSBwYXJ0aXRpb24gdGFibGUiKTsvKiBzZ2kgKi8KKyNlbmRpZgorCQlwdXRzKCJoXHRjaGFuZ2UgbnVtYmVyIG9mIGhlYWRzIik7CisJCXB1dHMoInBcdHByaW50IHRoZSBwYXJ0aXRpb24gdGFibGUiKTsKKwkJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJCXB1dHMoInJcdHJldHVybiB0byBtYWluIG1lbnUiKTsKKwkJcHV0cygic1x0Y2hhbmdlIG51bWJlciBvZiBzZWN0b3JzL3RyYWNrIik7CisJCXB1dHMoInZcdHZlcmlmeSB0aGUgcGFydGl0aW9uIHRhYmxlIik7CisJCXB1dHMoIndcdHdyaXRlIHRhYmxlIHRvIGRpc2sgYW5kIGV4aXQiKTsKKwl9Cit9CisjZW5kaWYgLyogQURWQU5DRUQgbW9kZSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCAqCitnZXRfc3lzX3R5cGVzKHZvaWQpCit7CisJcmV0dXJuICgKKwkJTEFCRUxfSVNfU1VOID8gc3VuX3N5c190eXBlcyA6CisJCUxBQkVMX0lTX1NHSSA/IHNnaV9zeXNfdHlwZXMgOgorCQlpMzg2X3N5c190eXBlcyk7Cit9CisjZWxzZQorI2RlZmluZSBnZXRfc3lzX3R5cGVzKCkgaTM4Nl9zeXNfdHlwZXMKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJ0aXRpb25fdHlwZSh1bnNpZ25lZCBjaGFyIHR5cGUpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqY29uc3QgKnR5cGVzID0gZ2V0X3N5c190eXBlcygpOworCisJZm9yIChpID0gMDsgdHlwZXNbaV07IGkrKykKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKXR5cGVzW2ldWzBdID09IHR5cGUpCisJCQlyZXR1cm4gdHlwZXNbaV0gKyAxOworCisJcmV0dXJuICJVbmtub3duIjsKK30KKworc3RhdGljIGludAoraXNfY2xlYXJlZF9wYXJ0aXRpb24oY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcCkKK3sKKwkvKiBXZSBjb25zaWRlciBwYXJ0aXRpb24gImNsZWFyZWQiIG9ubHkgaWYgaXQgaGFzIG9ubHkgemVyb3MgKi8KKwljb25zdCBjaGFyICpjcCA9IChjb25zdCBjaGFyICopcDsKKwlpbnQgY250ID0gc2l6ZW9mKCpwKTsKKwljaGFyIGJpdHMgPSAwOworCXdoaWxlICgtLWNudCA+PSAwKQorCQliaXRzIHw9ICpjcCsrOworCXJldHVybiAoYml0cyA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFyX3BhcnRpdGlvbihzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCWlmIChwKQorCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIGludAorZ2V0X3N5c2lkKGludCBpKQoreworCXJldHVybiBMQUJFTF9JU19TVU4gPyBzdW5sYWJlbC0+aW5mb3NbaV0uaWQgOgorCQkJKExBQkVMX0lTX1NHSSA/IHNnaV9nZXRfc3lzaWQoaSkgOgorCQkJCXB0ZXNbaV0ucGFydF90YWJsZS0+c3lzX2luZCk7Cit9CisKK3N0YXRpYyB2b2lkCitsaXN0X3R5cGVzKGNvbnN0IGNoYXIgKmNvbnN0ICpzeXMpCit7CisJZW51bSB7IENPTFMgPSAzIH07CisKKwl1bnNpZ25lZCBsYXN0W0NPTFNdOworCXVuc2lnbmVkIGRvbmUsIG5leHQsIHNpemU7CisJaW50IGk7CisKKwlmb3IgKHNpemUgPSAwOyBzeXNbc2l6ZV07IHNpemUrKykKKwkJY29udGludWU7CisKKwlkb25lID0gMDsKKwlmb3IgKGkgPSBDT0xTLTE7IGkgPj0gMDsgaS0tKSB7CisJCWRvbmUgKz0gKHNpemUgKyBpIC0gZG9uZSkgLyAoaSArIDEpOworCQlsYXN0W0NPTFMtMSAtIGldID0gZG9uZTsKKwl9CisKKwlpID0gZG9uZSA9IG5leHQgPSAwOworCWRvIHsKKwkJcHJpbnRmKCIlYyUyeCAlLTIyLjIycyIsIGkgPyAnICcgOiAnXG4nLAorCQkJKHVuc2lnbmVkIGNoYXIpc3lzW25leHRdWzBdLAorCQkJc3lzW25leHRdICsgMSk7CisJCW5leHQgPSBsYXN0W2krK10gKyBkb25lOworCQlpZiAoaSA+PSBDT0xTIHx8IG5leHQgPj0gbGFzdFtpXSkgeworCQkJaSA9IDA7CisJCQluZXh0ID0gKytkb25lOworCQl9CisJfSB3aGlsZSAoZG9uZSA8IGxhc3RbMF0pOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKKyNkZWZpbmUgc2V0X2hzYyhoLCBzLCBjLCBzZWN0b3IpIGRvIFwKK3sgXAorCXMgPSBzZWN0b3IgJSBnX3NlY3RvcnMgKyAxOyAgXAorCXNlY3RvciAvPSBnX3NlY3RvcnM7ICAgICAgICAgXAorCWggPSBzZWN0b3IgJSBnX2hlYWRzOyAgICAgICAgXAorCXNlY3RvciAvPSBnX2hlYWRzOyAgICAgICAgICAgXAorCWMgPSBzZWN0b3IgJiAweGZmOyAgICAgICAgICAgXAorCXMgfD0gKHNlY3RvciA+PiAyKSAmIDB4YzA7ICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgc2V0X2hzY19zdGFydF9lbmQoc3RydWN0IHBhcnRpdGlvbiAqcCwgc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IHN0b3ApCit7CisJaWYgKGRvc19jb21wYXRpYmxlX2ZsYWcgJiYgKHN0YXJ0IC8gKGdfc2VjdG9ycyAqIGdfaGVhZHMpID4gMTAyMykpCisJCXN0YXJ0ID0gZ19oZWFkcyAqIGdfc2VjdG9ycyAqIDEwMjQgLSAxOworCXNldF9oc2MocC0+aGVhZCwgcC0+c2VjdG9yLCBwLT5jeWwsIHN0YXJ0KTsKKworCWlmIChkb3NfY29tcGF0aWJsZV9mbGFnICYmIChzdG9wIC8gKGdfc2VjdG9ycyAqIGdfaGVhZHMpID4gMTAyMykpCisJCXN0b3AgPSBnX2hlYWRzICogZ19zZWN0b3JzICogMTAyNCAtIDE7CisJc2V0X2hzYyhwLT5lbmRfaGVhZCwgcC0+ZW5kX3NlY3RvciwgcC0+ZW5kX2N5bCwgc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfcGFydGl0aW9uKGludCBpLCBpbnQgZG9leHQsIHNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBzdG9wLCBpbnQgc3lzaWQpCit7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlzZWN0b3JfdCBvZmZzZXQ7CisKKwlpZiAoZG9leHQpIHsKKwkJcCA9IHB0ZXNbaV0uZXh0X3BvaW50ZXI7CisJCW9mZnNldCA9IGV4dGVuZGVkX29mZnNldDsKKwl9IGVsc2UgeworCQlwID0gcHRlc1tpXS5wYXJ0X3RhYmxlOworCQlvZmZzZXQgPSBwdGVzW2ldLm9mZnNldF9mcm9tX2Rldl9zdGFydDsKKwl9CisJcC0+Ym9vdF9pbmQgPSAwOworCXAtPnN5c19pbmQgPSBzeXNpZDsKKwlzZXRfc3RhcnRfc2VjdChwLCBzdGFydCAtIG9mZnNldCk7CisJc2V0X25yX3NlY3RzKHAsIHN0b3AgLSBzdGFydCArIDEpOworCXNldF9oc2Nfc3RhcnRfZW5kKHAsIHN0YXJ0LCBzdG9wKTsKKwlwdGVzW2ldLmNoYW5nZWQgPSAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3dhcm5fZ2VvbWV0cnkodm9pZCkKK3sKKwlpZiAoZ19oZWFkcyAmJiBnX3NlY3RvcnMgJiYgZ19jeWxpbmRlcnMpCisJCXJldHVybiAwOworCisJcHJpbnRmKCJVbmtub3duIHZhbHVlKHMpIGZvcjoiKTsKKwlpZiAoIWdfaGVhZHMpCisJCXByaW50ZigiIGhlYWRzIik7CisJaWYgKCFnX3NlY3RvcnMpCisJCXByaW50ZigiIHNlY3RvcnMiKTsKKwlpZiAoIWdfY3lsaW5kZXJzKQorCQlwcmludGYoIiBjeWxpbmRlcnMiKTsKKwlwcmludGYoCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwkJIiAoc2V0dGFibGUgaW4gdGhlIGV4dHJhIGZ1bmN0aW9ucyBtZW51KSIKKyNlbmRpZgorCQkiXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV91bml0cyh2b2lkKQoreworCWludCBjeWxfdW5pdHMgPSBnX2hlYWRzICogZ19zZWN0b3JzOworCisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzICYmIGN5bF91bml0cykKKwkJdW5pdHNfcGVyX3NlY3RvciA9IGN5bF91bml0czsKKwllbHNlCisJCXVuaXRzX3Blcl9zZWN0b3IgPSAxOyAgIC8qIGluIHNlY3RvcnMgKi8KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgdm9pZAord2Fybl9jeWxpbmRlcnModm9pZCkKK3sKKwlpZiAoTEFCRUxfSVNfRE9TICYmIGdfY3lsaW5kZXJzID4gMTAyNCAmJiAhbm93YXJuKQorCQlwcmludGYoIlxuIgorIlRoZSBudW1iZXIgb2YgY3lsaW5kZXJzIGZvciB0aGlzIGRpc2sgaXMgc2V0IHRvICV1LlxuIgorIlRoZXJlIGlzIG5vdGhpbmcgd3Jvbmcgd2l0aCB0aGF0LCBidXQgdGhpcyBpcyBsYXJnZXIgdGhhbiAxMDI0LFxuIgorImFuZCBjb3VsZCBpbiBjZXJ0YWluIHNldHVwcyBjYXVzZSBwcm9ibGVtcyB3aXRoOlxuIgorIjEpIHNvZnR3YXJlIHRoYXQgcnVucyBhdCBib290IHRpbWUgKGUuZy4sIG9sZCB2ZXJzaW9ucyBvZiBMSUxPKVxuIgorIjIpIGJvb3RpbmcgYW5kIHBhcnRpdGlvbmluZyBzb2Z0d2FyZSBmcm9tIG90aGVyIE9Tc1xuIgorIiAgIChlLmcuLCBET1MgRkRJU0ssIE9TLzIgRkRJU0spXG4iLAorCQkJZ19jeWxpbmRlcnMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCityZWFkX2V4dGVuZGVkKGludCBleHQpCit7CisJaW50IGk7CisJc3RydWN0IHB0ZSAqcGV4OworCXN0cnVjdCBwYXJ0aXRpb24gKnAsICpxOworCisJZXh0X2luZGV4ID0gZXh0OworCXBleCA9ICZwdGVzW2V4dF07CisJcGV4LT5leHRfcG9pbnRlciA9IHBleC0+cGFydF90YWJsZTsKKworCXAgPSBwZXgtPnBhcnRfdGFibGU7CisJaWYgKCFnZXRfc3RhcnRfc2VjdChwKSkgeworCQlwcmludGYoIkJhZCBvZmZzZXQgaW4gcHJpbWFyeSBleHRlbmRlZCBwYXJ0aXRpb25cbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKElTX0VYVEVOREVEKHAtPnN5c19pbmQpKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbZ19wYXJ0aXRpb25zXTsKKworCQlpZiAoZ19wYXJ0aXRpb25zID49IE1BWElNVU1fUEFSVFMpIHsKKwkJCS8qIFRoaXMgaXMgbm90IGEgTGludXggcmVzdHJpY3Rpb24sIGJ1dAorCQkJICAgdGhpcyBwcm9ncmFtIHVzZXMgYXJyYXlzIG9mIHNpemUgTUFYSU1VTV9QQVJUUy4KKwkJCSAgIERvIG5vdCB0cnkgdG8gJ2ltcHJvdmUnIHRoaXMgdGVzdC4gKi8KKwkJCXN0cnVjdCBwdGUgKnByZSA9ICZwdGVzW2dfcGFydGl0aW9ucyAtIDFdOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJCQlwcmludGYoIldhcm5pbmc6IGRlbGV0aW5nIHBhcnRpdGlvbnMgYWZ0ZXIgJXVcbiIsCisJCQkJZ19wYXJ0aXRpb25zKTsKKwkJCXByZS0+Y2hhbmdlZCA9IDE7CisjZW5kaWYKKwkJCWNsZWFyX3BhcnRpdGlvbihwcmUtPmV4dF9wb2ludGVyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlYWRfcHRlKHBlLCBleHRlbmRlZF9vZmZzZXQgKyBnZXRfc3RhcnRfc2VjdChwKSk7CisKKwkJaWYgKCFleHRlbmRlZF9vZmZzZXQpCisJCQlleHRlbmRlZF9vZmZzZXQgPSBnZXRfc3RhcnRfc2VjdChwKTsKKworCQlxID0gcCA9IHB0X29mZnNldChwZS0+c2VjdG9yYnVmZmVyLCAwKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgcCsrKSBpZiAoZ2V0X25yX3NlY3RzKHApKSB7CisJCQlpZiAoSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJCQlpZiAocGUtPmV4dF9wb2ludGVyKQorCQkJCQlwcmludGYoIldhcm5pbmc6IGV4dHJhIGxpbmsgIgorCQkJCQkJInBvaW50ZXIgaW4gcGFydGl0aW9uIHRhYmxlIgorCQkJCQkJIiAldVxuIiwgZ19wYXJ0aXRpb25zICsgMSk7CisJCQkJZWxzZQorCQkJCQlwZS0+ZXh0X3BvaW50ZXIgPSBwOworCQkJfSBlbHNlIGlmIChwLT5zeXNfaW5kKSB7CisJCQkJaWYgKHBlLT5wYXJ0X3RhYmxlKQorCQkJCQlwcmludGYoIldhcm5pbmc6IGlnbm9yaW5nIGV4dHJhICIKKwkJCQkJCSAgImRhdGEgaW4gcGFydGl0aW9uIHRhYmxlIgorCQkJCQkJICAiICV1XG4iLCBnX3BhcnRpdGlvbnMgKyAxKTsKKwkJCQllbHNlCisJCQkJCXBlLT5wYXJ0X3RhYmxlID0gcDsKKwkJCX0KKwkJfQorCisJCS8qIHZlcnkgc3RyYW5nZSBjb2RlIGhlcmUuLi4gKi8KKwkJaWYgKCFwZS0+cGFydF90YWJsZSkgeworCQkJaWYgKHEgIT0gcGUtPmV4dF9wb2ludGVyKQorCQkJCXBlLT5wYXJ0X3RhYmxlID0gcTsKKwkJCWVsc2UKKwkJCQlwZS0+cGFydF90YWJsZSA9IHEgKyAxOworCQl9CisJCWlmICghcGUtPmV4dF9wb2ludGVyKSB7CisJCQlpZiAocSAhPSBwZS0+cGFydF90YWJsZSkKKwkJCQlwZS0+ZXh0X3BvaW50ZXIgPSBxOworCQkJZWxzZQorCQkJCXBlLT5leHRfcG9pbnRlciA9IHEgKyAxOworCQl9CisKKwkJcCA9IHBlLT5leHRfcG9pbnRlcjsKKwkJZ19wYXJ0aXRpb25zKys7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwkvKiByZW1vdmUgZW1wdHkgbGlua3MgKi8KKyByZW1vdmU6CisJZm9yIChpID0gNDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisKKwkJaWYgKCFnZXRfbnJfc2VjdHMocGUtPnBhcnRfdGFibGUpCisJCSAmJiAoZ19wYXJ0aXRpb25zID4gNSB8fCBwdGVzWzRdLnBhcnRfdGFibGUtPnN5c19pbmQpCisJCSkgeworCQkJcHJpbnRmKCJPbWl0dGluZyBlbXB0eSBwYXJ0aXRpb24gKCV1KVxuIiwgaSsxKTsKKwkJCWRlbGV0ZV9wYXJ0aXRpb24oaSk7CisJCQlnb3RvIHJlbW92ZTsgICAgLyogbnVtYmVyaW5nIGNoYW5nZWQgKi8KKwkJfQorCX0KKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyB2b2lkCitjcmVhdGVfZG9zbGFiZWwodm9pZCkKK3sKKwlwcmludGYobXNnX2J1aWxkaW5nX25ld19sYWJlbCwgIkRPUyBkaXNrbGFiZWwiKTsKKworCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0RPUzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKwlwb3NzaWJseV9vc2ZfbGFiZWwgPSAwOworI2VuZGlmCisJZ19wYXJ0aXRpb25zID0gNDsKKworCW1lbXNldCgmTUJSYnVmZmVyWzUxMCAtIDQqMTZdLCAwLCA0KjE2KTsKKwl3cml0ZV9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKTsKKwlleHRlbmRlZF9vZmZzZXQgPSAwOworCXNldF9hbGxfdW5jaGFuZ2VkKCk7CisJc2V0X2NoYW5nZWQoMCk7CisJZ2V0X2Jvb3QoQ1JFQVRFX0VNUFRZX0RPUyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2dldF9zZWN0b3JzaXplKHZvaWQpCit7CisJaWYgKCF1c2VyX3NldF9zZWN0b3Jfc2l6ZSkgeworCQlpbnQgYXJnOworCQlpZiAoaW9jdGwoZGV2X2ZkLCBCTEtTU1pHRVQsICZhcmcpID09IDApCisJCQlzZWN0b3Jfc2l6ZSA9IGFyZzsKKwkJaWYgKHNlY3Rvcl9zaXplICE9IERFRkFVTFRfU0VDVE9SX1NJWkUpCisJCQlwcmludGYoIk5vdGU6IHNlY3RvciBzaXplIGlzICV1ICIKKwkJCQkiKG5vdCAiIERFRkFVTFRfU0VDVE9SX1NJWkVfU1RSICIpXG4iLAorCQkJCXNlY3Rvcl9zaXplKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfa2VybmVsX2dlb21ldHJ5KHZvaWQpCit7CisJc3RydWN0IGhkX2dlb21ldHJ5IGdlb21ldHJ5OworCisJaWYgKCFpb2N0bChkZXZfZmQsIEhESU9fR0VUR0VPLCAmZ2VvbWV0cnkpKSB7CisJCWtlcm5faGVhZHMgPSBnZW9tZXRyeS5oZWFkczsKKwkJa2Vybl9zZWN0b3JzID0gZ2VvbWV0cnkuc2VjdG9yczsKKwkJLyogbmV2ZXIgdXNlIGdlb21ldHJ5LmN5bGluZGVycyAtIGl0IGlzIHRydW5jYXRlZCAqLworCX0KK30KKworc3RhdGljIHZvaWQKK2dldF9wYXJ0aXRpb25fdGFibGVfZ2VvbWV0cnkodm9pZCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpidWZwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilNQlJidWZmZXI7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaSwgaCwgcywgaGgsIHNzOworCWludCBmaXJzdCA9IDE7CisJaW50IGJhZCA9IDA7CisKKwlpZiAoISh2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoKGNoYXIqKWJ1ZnApKSkKKwkJcmV0dXJuOworCisJaGggPSBzcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwID0gcHRfb2Zmc2V0KGJ1ZnAsIGkpOworCQlpZiAocC0+c3lzX2luZCAhPSAwKSB7CisJCQloID0gcC0+ZW5kX2hlYWQgKyAxOworCQkJcyA9IChwLT5lbmRfc2VjdG9yICYgMDc3KTsKKwkJCWlmIChmaXJzdCkgeworCQkJCWhoID0gaDsKKwkJCQlzcyA9IHM7CisJCQkJZmlyc3QgPSAwOworCQkJfSBlbHNlIGlmIChoaCAhPSBoIHx8IHNzICE9IHMpCisJCQkJYmFkID0gMTsKKwkJfQorCX0KKworCWlmICghZmlyc3QgJiYgIWJhZCkgeworCQlwdF9oZWFkcyA9IGhoOworCQlwdF9zZWN0b3JzID0gc3M7CisJfQorfQorCitzdGF0aWMgdm9pZAorZ2V0X2dlb21ldHJ5KHZvaWQpCit7CisJaW50IHNlY19mYWM7CisKKwlnZXRfc2VjdG9yc2l6ZSgpOworCXNlY19mYWMgPSBzZWN0b3Jfc2l6ZSAvIDUxMjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVU5fTEFCRUwKKwlndWVzc19kZXZpY2VfdHlwZSgpOworI2VuZGlmCisJZ19oZWFkcyA9IGdfY3lsaW5kZXJzID0gZ19zZWN0b3JzID0gMDsKKwlrZXJuX2hlYWRzID0ga2Vybl9zZWN0b3JzID0gMDsKKwlwdF9oZWFkcyA9IHB0X3NlY3RvcnMgPSAwOworCisJZ2V0X2tlcm5lbF9nZW9tZXRyeSgpOworCWdldF9wYXJ0aXRpb25fdGFibGVfZ2VvbWV0cnkoKTsKKworCWdfaGVhZHMgPSB1c2VyX2hlYWRzID8gdXNlcl9oZWFkcyA6CisJCXB0X2hlYWRzID8gcHRfaGVhZHMgOgorCQlrZXJuX2hlYWRzID8ga2Vybl9oZWFkcyA6IDI1NTsKKwlnX3NlY3RvcnMgPSB1c2VyX3NlY3RvcnMgPyB1c2VyX3NlY3RvcnMgOgorCQlwdF9zZWN0b3JzID8gcHRfc2VjdG9ycyA6CisJCWtlcm5fc2VjdG9ycyA/IGtlcm5fc2VjdG9ycyA6IDYzOworCXRvdGFsX251bWJlcl9vZl9zZWN0b3JzID0gYmJfQkxLR0VUU0laRV9zZWN0b3JzKGRldl9mZCk7CisKKwlzZWN0b3Jfb2Zmc2V0ID0gMTsKKwlpZiAoZG9zX2NvbXBhdGlibGVfZmxhZykKKwkJc2VjdG9yX29mZnNldCA9IGdfc2VjdG9yczsKKworCWdfY3lsaW5kZXJzID0gdG90YWxfbnVtYmVyX29mX3NlY3RvcnMgLyAoZ19oZWFkcyAqIGdfc2VjdG9ycyAqIHNlY19mYWMpOworCWlmICghZ19jeWxpbmRlcnMpCisJCWdfY3lsaW5kZXJzID0gdXNlcl9jeWxpbmRlcnM7Cit9CisKKy8qCisgKiBPcGVucyBkaXNrX2RldmljZSBhbmQgb3B0aW9uYWxseSByZWFkcyBNQlIuCisgKiAgICBJZiB3aGF0ID09IE9QRU5fTUFJTjoKKyAqICAgICAgT3BlbiBkZXZpY2UsIHJlYWQgTUJSLiAgQWJvcnQgcHJvZ3JhbSBvbiBzaG9ydCByZWFkLiAgQ3JlYXRlIGVtcHR5CisgKiAgICAgIGRpc2tsYWJlbCBpZiB0aGUgb24tZGlzayBzdHJ1Y3R1cmUgaXMgaW52YWxpZCAoV1JJVEFCTEUgbW9kZSkuCisgKiAgICBJZiB3aGF0ID09IFRSWV9PTkxZOgorICogICAgICBPcGVuIGRldmljZSwgcmVhZCBNQlIuICBSZXR1cm4gYW4gZXJyb3IgaWYgYW55dGhpbmcgaXMgb3V0IG9mIHBsYWNlLgorICogICAgICBEbyBub3QgY3JlYXRlIGFuIGVtcHR5IGRpc2tsYWJlbC4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlICJsaXN0IgorICogICAgICBvcGVyYXRpb25zOiAiZmRpc2sgLWwgL2Rldi9zZGEiIGFuZCAiZmRpc2sgLWwiIChhbGwgZGV2aWNlcykuCisgKiAgICBJZiB3aGF0ID09IENSRUFURV9FTVBUWV8qOgorICogICAgICBUaGlzIG1lYW5zIHRoYXQgZ2V0X2Jvb3QoKSB3YXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IGZyb20gY3JlYXRlXypsYWJlbCgpLgorICogICAgICBEbyBub3QgcmUtb3BlbiB0aGUgZGV2aWNlOyBqdXN0IHNldCB1cCB0aGUgcHRlcyBhcnJheSBhbmQgcHJpbnQKKyAqICAgICAgZ2VvbWV0cnkgd2FybmluZ3MuCisgKgorICogUmV0dXJuczoKKyAqICAgLTE6IG5vIDB4YWE1NSBmbGFnIHByZXNlbnQgKHBvc3NpYmx5IGVudGlyZSBkaXNrIEJTRCkKKyAqICAgIDA6IGZvdW5kIG9yIGNyZWF0ZWQgbGFiZWwKKyAqICAgIDE6IEkvTyBlcnJvcgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMIHx8IEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgaW50IGdldF9ib290KGVudW0gYWN0aW9uIHdoYXQpCisjZWxzZQorc3RhdGljIGludCBnZXRfYm9vdCh2b2lkKQorI2RlZmluZSBnZXRfYm9vdCh3aGF0KSBnZXRfYm9vdCgpCisjZW5kaWYKK3sKKwlpbnQgaSwgZmQ7CisKKwlnX3BhcnRpdGlvbnMgPSA0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJcGUtPnBhcnRfdGFibGUgPSBwdF9vZmZzZXQoTUJSYnVmZmVyLCBpKTsKKwkJcGUtPmV4dF9wb2ludGVyID0gTlVMTDsKKwkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IDA7CisJCXBlLT5zZWN0b3JidWZmZXIgPSBNQlJidWZmZXI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwkJcGUtPmNoYW5nZWQgPSAod2hhdCA9PSBDUkVBVEVfRU1QVFlfRE9TKTsKKyNlbmRpZgorCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisvLyBBTEVSVCEgaGlnaGx5IGlkaW90aWMgZGVzaWduIQorLy8gV2UgZW5kIHVwIGhlcmUgd2hlbiB3ZSBjYWxsIGdldF9ib290KCkgcmVjdXJzaXZlbHkKKy8vIHZpYSBnZXRfYm9vdCgpIFt0YWJsZSBpcyBiYWRdIC0+IGNyZWF0ZV9kb3NsYWJlbCgpIC0+IGdldF9ib290KENSRUFURV9FTVBUWV9ET1MpLgorLy8gb3IgZ2V0X2Jvb3QoKSBbdGFibGUgaXMgYmFkXSAtPiBjcmVhdGVfc3VubGFiZWwoKSAtPiBnZXRfYm9vdChDUkVBVEVfRU1QVFlfU1VOKS4KKy8vIChqdXN0IGZhY3RvciBvdXQgcmUtaW5pdCBvZiBwdGVzWzAsMSwyLDNdIGluIGEgc2VwYXJhdGUgZm4gaW5zdGVhZD8pCisvLyBTbyBza2lwIG9wZW5pbmcgZGV2aWNlIF9hZ2Fpbl8uLi4KKwlpZiAod2hhdCA9PSBDUkVBVEVfRU1QVFlfRE9TICBJRl9GRUFUVVJFX1NVTl9MQUJFTCh8fCB3aGF0ID09IENSRUFURV9FTVBUWV9TVU4pKQorCQlnb3RvIGNyZWF0ZWRfdGFibGU7CisKKwlmZCA9IG9wZW4oZGlza19kZXZpY2UsIChvcHRpb25fbWFzazMyICYgT1BUX2wpID8gT19SRE9OTFkgOiBPX1JEV1IpOworCisJaWYgKGZkIDwgMCkgeworCQlmZCA9IG9wZW4oZGlza19kZXZpY2UsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJaWYgKHdoYXQgPT0gVFJZX09OTFkpCisJCQkJcmV0dXJuIDE7CisJCQlmZGlza19mYXRhbCh1bmFibGVfdG9fb3Blbik7CisJCX0KKwkJcHJpbnRmKCInJXMnIGlzIG9wZW5lZCBmb3IgcmVhZCBvbmx5XG4iLCBkaXNrX2RldmljZSk7CisJfQorCXhtb3ZlX2ZkKGZkLCBkZXZfZmQpOworCWlmICg1MTIgIT0gZnVsbF9yZWFkKGRldl9mZCwgTUJSYnVmZmVyLCA1MTIpKSB7CisJCWlmICh3aGF0ID09IFRSWV9PTkxZKSB7CisJCQljbG9zZV9kZXZfZmQoKTsKKwkJCXJldHVybiAxOworCQl9CisJCWZkaXNrX2ZhdGFsKHVuYWJsZV90b19yZWFkKTsKKwl9CisjZWxzZQorCWZkID0gb3BlbihkaXNrX2RldmljZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAxOworCWlmICg1MTIgIT0gZnVsbF9yZWFkKGZkLCBNQlJidWZmZXIsIDUxMikpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisJeG1vdmVfZmQoZmQsIGRldl9mZCk7CisjZW5kaWYKKworCWdldF9nZW9tZXRyeSgpOworCXVwZGF0ZV91bml0cygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisJaWYgKGNoZWNrX3N1bl9sYWJlbCgpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorCWlmIChjaGVja19zZ2lfbGFiZWwoKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9BSVhfTEFCRUwKKwlpZiAoY2hlY2tfYWl4X2xhYmVsKCkpCisJCXJldHVybiAwOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1BUX0xBQkVMCisJaWYgKGNoZWNrX2dwdF9sYWJlbCgpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorCWlmIChjaGVja19vc2ZfbGFiZWwoKSkgeworCQlwb3NzaWJseV9vc2ZfbGFiZWwgPSAxOworCQlpZiAoIXZhbGlkX3BhcnRfdGFibGVfZmxhZyhNQlJidWZmZXIpKSB7CisJCQljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9PU0Y7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGYoIlRoaXMgZGlzayBoYXMgYm90aCBET1MgYW5kIEJTRCBtYWdpYy5cbiIKKwkJCSAiR2l2ZSB0aGUgJ2InIGNvbW1hbmQgdG8gZ28gdG8gQlNEIG1vZGUuXG4iKTsKKwl9CisjZW5kaWYKKworI2lmICFFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWlmICghdmFsaWRfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcikpCisJCXJldHVybiAtMTsKKyNlbHNlCisJaWYgKCF2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKSkgeworCQlpZiAod2hhdCA9PSBPUEVOX01BSU4pIHsKKwkJCXByaW50ZigiRGV2aWNlIGNvbnRhaW5zIG5laXRoZXIgYSB2YWxpZCBET1MgIgorCQkJCSAgInBhcnRpdGlvbiB0YWJsZSwgbm9yIFN1biwgU0dJLCBPU0Ygb3IgR1BUICIKKwkJCQkgICJkaXNrbGFiZWxcbiIpOworI2lmZGVmIF9fc3BhcmNfXworCQkJSUZfRkVBVFVSRV9TVU5fTEFCRUwoY3JlYXRlX3N1bmxhYmVsKCk7KQorI2Vsc2UKKwkJCWNyZWF0ZV9kb3NsYWJlbCgpOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBUUllfT05MWTogKi8KKwkJcmV0dXJuIC0xOworCX0KKyBjcmVhdGVkX3RhYmxlOgorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KKworCisJSUZfRkVBVFVSRV9GRElTS19XUklUQUJMRSh3YXJuX2N5bGluZGVycygpOykKKwl3YXJuX2dlb21ldHJ5KCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChJU19FWFRFTkRFRChwdGVzW2ldLnBhcnRfdGFibGUtPnN5c19pbmQpKSB7CisJCQlpZiAoZ19wYXJ0aXRpb25zICE9IDQpCisJCQkJcHJpbnRmKCJJZ25vcmluZyBleHRyYSBleHRlbmRlZCAiCisJCQkJCSJwYXJ0aXRpb24gJXVcbiIsIGkgKyAxKTsKKwkJCWVsc2UKKwkJCQlyZWFkX2V4dGVuZGVkKGkpOworCQl9CisJfQorCisJZm9yIChpID0gMzsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJCWlmICghdmFsaWRfcGFydF90YWJsZV9mbGFnKHBlLT5zZWN0b3JidWZmZXIpKSB7CisJCQlwcmludGYoIldhcm5pbmc6IGludmFsaWQgZmxhZyAweCUwMngsMHglMDJ4IG9mIHBhcnRpdGlvbiAiCisJCQkJInRhYmxlICV1IHdpbGwgYmUgY29ycmVjdGVkIGJ5IHcocml0ZSlcbiIsCisJCQkJcGUtPnNlY3RvcmJ1ZmZlcls1MTBdLAorCQkJCXBlLT5zZWN0b3JidWZmZXJbNTExXSwKKwkJCQlpICsgMSk7CisJCQlJRl9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFKHBlLT5jaGFuZ2VkID0gMTspCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisvKgorICogUHJpbnQgdGhlIG1lc3NhZ2UgTUVTRywgdGhlbiByZWFkIGFuIGludGVnZXIgYmV0d2VlbiBMT1cgYW5kIEhJR0ggKGluY2x1c2l2ZSkuCisgKiBJZiB0aGUgdXNlciBoaXRzIEVudGVyLCBERkxUIGlzIHJldHVybmVkLgorICogQW5zd2VycyBsaWtlICsxMCBhcmUgaW50ZXJwcmV0ZWQgYXMgb2Zmc2V0cyBmcm9tIEJBU0UuCisgKgorICogVGhlcmUgaXMgbm8gZGVmYXVsdCBpZiBERkxUIGlzIG5vdCBiZXR3ZWVuIExPVyBhbmQgSElHSC4KKyAqLworc3RhdGljIHNlY3Rvcl90CityZWFkX2ludChzZWN0b3JfdCBsb3csIHNlY3Rvcl90IGRmbHQsIHNlY3Rvcl90IGhpZ2gsIHNlY3Rvcl90IGJhc2UsIGNvbnN0IGNoYXIgKm1lc2cpCit7CisJc2VjdG9yX3QgdmFsdWU7CisJaW50IGRlZmF1bHRfb2sgPSAxOworCWNvbnN0IGNoYXIgKmZtdCA9ICIlcyAoJXUtJXUsIGRlZmF1bHQgJXUpOiAiOworCisJaWYgKGRmbHQgPCBsb3cgfHwgZGZsdCA+IGhpZ2gpIHsKKwkJZm10ID0gIiVzICgldS0ldSk6ICI7CisJCWRlZmF1bHRfb2sgPSAwOworCX0KKworCXdoaWxlICgxKSB7CisJCWludCB1c2VfZGVmYXVsdCA9IGRlZmF1bHRfb2s7CisKKwkJLyogYXNrIHF1ZXN0aW9uIGFuZCByZWFkIGFuc3dlciAqLworCQlkbyB7CisJCQlwcmludGYoZm10LCBtZXNnLCBsb3csIGhpZ2gsIGRmbHQpOworCQkJcmVhZF9tYXliZV9lbXB0eSgiIik7CisJCX0gd2hpbGUgKCpsaW5lX3B0ciAhPSAnXG4nICYmICFpc2RpZ2l0KCpsaW5lX3B0cikKKwkJICYmICpsaW5lX3B0ciAhPSAnLScgJiYgKmxpbmVfcHRyICE9ICcrJyk7CisKKwkJaWYgKCpsaW5lX3B0ciA9PSAnKycgfHwgKmxpbmVfcHRyID09ICctJykgeworCQkJaW50IG1pbnVzID0gKCpsaW5lX3B0ciA9PSAnLScpOworCQkJaW50IGFic29sdXRlID0gMDsKKworCQkJdmFsdWUgPSBhdG9pKGxpbmVfcHRyICsgMSk7CisKKwkJCS8qICgxKSBpZiAybmQgY2hhciBpcyBkaWdpdCwgdXNlX2RlZmF1bHQgPSAwLgorCQkJICogKDIpIG1vdmUgbGluZV9wdHIgdG8gZmlyc3Qgbm9uLWRpZ2l0LiAqLworCQkJd2hpbGUgKGlzZGlnaXQoKisrbGluZV9wdHIpKQorCQkJCXVzZV9kZWZhdWx0ID0gMDsKKworCQkJc3dpdGNoICgqbGluZV9wdHIpIHsKKwkJCWNhc2UgJ2MnOgorCQkJY2FzZSAnQyc6CisJCQkJaWYgKCFkaXNwbGF5X2luX2N5bF91bml0cykKKwkJCQkJdmFsdWUgKj0gZ19oZWFkcyAqIGdfc2VjdG9yczsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0snOgorCQkJCWFic29sdXRlID0gMTAyNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2snOgorCQkJCWFic29sdXRlID0gMTAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJY2FzZSAnTSc6CisJCQkJYWJzb2x1dGUgPSAxMDAwMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSAnZyc6CisJCQljYXNlICdHJzoKKwkJCQlhYnNvbHV0ZSA9IDEwMDAwMDAwMDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGFic29sdXRlKSB7CisJCQkJdWxsb25nIGJ5dGVzOworCQkJCXVuc2lnbmVkIGxvbmcgdW5pdDsKKworCQkJCWJ5dGVzID0gKHVsbG9uZykgdmFsdWUgKiBhYnNvbHV0ZTsKKwkJCQl1bml0ID0gc2VjdG9yX3NpemUgKiB1bml0c19wZXJfc2VjdG9yOworCQkJCWJ5dGVzICs9IHVuaXQvMjsgLyogcm91bmQgKi8KKwkJCQlieXRlcyAvPSB1bml0OworCQkJCXZhbHVlID0gYnl0ZXM7CisJCQl9CisJCQlpZiAobWludXMpCisJCQkJdmFsdWUgPSAtdmFsdWU7CisJCQl2YWx1ZSArPSBiYXNlOworCQl9IGVsc2UgeworCQkJdmFsdWUgPSBhdG9pKGxpbmVfcHRyKTsKKwkJCXdoaWxlIChpc2RpZ2l0KCpsaW5lX3B0cikpIHsKKwkJCQlsaW5lX3B0cisrOworCQkJCXVzZV9kZWZhdWx0ID0gMDsKKwkJCX0KKwkJfQorCQlpZiAodXNlX2RlZmF1bHQpIHsKKwkJCXZhbHVlID0gZGZsdDsKKwkJCXByaW50ZigiVXNpbmcgZGVmYXVsdCB2YWx1ZSAldVxuIiwgdmFsdWUpOworCQl9CisJCWlmICh2YWx1ZSA+PSBsb3cgJiYgdmFsdWUgPD0gaGlnaCkKKwkJCWJyZWFrOworCQlwcmludGYoIlZhbHVlIGlzIG91dCBvZiByYW5nZVxuIik7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHVuc2lnbmVkCitnZXRfcGFydGl0aW9uKGludCB3YXJuLCB1bnNpZ25lZCBtYXgpCit7CisJc3RydWN0IHB0ZSAqcGU7CisJdW5zaWduZWQgaTsKKworCWkgPSByZWFkX2ludCgxLCAwLCBtYXgsIDAsICJQYXJ0aXRpb24gbnVtYmVyIikgLSAxOworCXBlID0gJnB0ZXNbaV07CisKKwlpZiAod2FybikgeworCQlpZiAoKCFMQUJFTF9JU19TVU4gJiYgIUxBQkVMX0lTX1NHSSAmJiAhcGUtPnBhcnRfdGFibGUtPnN5c19pbmQpCisJCSB8fCAoTEFCRUxfSVNfU1VOICYmICghc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMgfHwgIXN1bmxhYmVsLT5pbmZvc1tpXS5pZCkpCisJCSB8fCAoTEFCRUxfSVNfU0dJICYmICFzZ2lfZ2V0X251bV9zZWN0b3JzKGkpKQorCQkpIHsKKwkJCXByaW50ZigiV2FybmluZzogcGFydGl0aW9uICV1IGhhcyBlbXB0eSB0eXBlXG4iLCBpKzEpOworCQl9CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50CitnZXRfZXhpc3RpbmdfcGFydGl0aW9uKGludCB3YXJuLCB1bnNpZ25lZCBtYXgpCit7CisJaW50IHBubyA9IC0xOworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHBlLT5wYXJ0X3RhYmxlOworCisJCWlmIChwICYmICFpc19jbGVhcmVkX3BhcnRpdGlvbihwKSkgeworCQkJaWYgKHBubyA+PSAwKQorCQkJCWdvdG8gbm90X3VuaXF1ZTsKKwkJCXBubyA9IGk7CisJCX0KKwl9CisJaWYgKHBubyA+PSAwKSB7CisJCXByaW50ZigiU2VsZWN0ZWQgcGFydGl0aW9uICV1XG4iLCBwbm8rMSk7CisJCXJldHVybiBwbm87CisJfQorCXByaW50ZigiTm8gcGFydGl0aW9uIGlzIGRlZmluZWQgeWV0IVxuIik7CisJcmV0dXJuIC0xOworCisgbm90X3VuaXF1ZToKKwlyZXR1cm4gZ2V0X3BhcnRpdGlvbih3YXJuLCBtYXgpOworfQorCitzdGF0aWMgaW50CitnZXRfbm9uZXhpc3RpbmdfcGFydGl0aW9uKGludCB3YXJuLCB1bnNpZ25lZCBtYXgpCit7CisJaW50IHBubyA9IC0xOworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHBlLT5wYXJ0X3RhYmxlOworCisJCWlmIChwICYmIGlzX2NsZWFyZWRfcGFydGl0aW9uKHApKSB7CisJCQlpZiAocG5vID49IDApCisJCQkJZ290byBub3RfdW5pcXVlOworCQkJcG5vID0gaTsKKwkJfQorCX0KKwlpZiAocG5vID49IDApIHsKKwkJcHJpbnRmKCJTZWxlY3RlZCBwYXJ0aXRpb24gJXVcbiIsIHBubysxKTsKKwkJcmV0dXJuIHBubzsKKwl9CisJcHJpbnRmKCJBbGwgcHJpbWFyeSBwYXJ0aXRpb25zIGhhdmUgYmVlbiBkZWZpbmVkIGFscmVhZHkhXG4iKTsKKwlyZXR1cm4gLTE7CisKKyBub3RfdW5pcXVlOgorCXJldHVybiBnZXRfcGFydGl0aW9uKHdhcm4sIG1heCk7Cit9CisKKworc3RhdGljIHZvaWQKK2NoYW5nZV91bml0cyh2b2lkKQoreworCWRpc3BsYXlfaW5fY3lsX3VuaXRzID0gIWRpc3BsYXlfaW5fY3lsX3VuaXRzOworCXVwZGF0ZV91bml0cygpOworCXByaW50ZigiQ2hhbmdpbmcgZGlzcGxheS9lbnRyeSB1bml0cyB0byAlc1xuIiwKKwkJc3RyX3VuaXRzKFBMVVJBTCkpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX2FjdGl2ZShpbnQgaSkKK3sKKwlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydF90YWJsZTsKKworCWlmIChJU19FWFRFTkRFRChwLT5zeXNfaW5kKSAmJiAhcC0+Ym9vdF9pbmQpCisJCXByaW50ZigiV0FSTklORzogUGFydGl0aW9uICV1IGlzIGFuIGV4dGVuZGVkIHBhcnRpdGlvblxuIiwgaSArIDEpOworCXAtPmJvb3RfaW5kID0gKHAtPmJvb3RfaW5kID8gMCA6IEFDVElWRV9GTEFHKTsKKwlwZS0+Y2hhbmdlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfZG9zX2NvbXBhdGliaWxpdHlfZmxhZyh2b2lkKQoreworCWRvc19jb21wYXRpYmxlX2ZsYWcgPSAxIC0gZG9zX2NvbXBhdGlibGVfZmxhZzsKKwlpZiAoZG9zX2NvbXBhdGlibGVfZmxhZykgeworCQlzZWN0b3Jfb2Zmc2V0ID0gZ19zZWN0b3JzOworCQlwcmludGYoIkRPUyBDb21wYXRpYmlsaXR5IGZsYWcgaXMgc2V0XG4iKTsKKwl9IGVsc2UgeworCQlzZWN0b3Jfb2Zmc2V0ID0gMTsKKwkJcHJpbnRmKCJET1MgQ29tcGF0aWJpbGl0eSBmbGFnIGlzIG5vdCBzZXRcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQKK2RlbGV0ZV9wYXJ0aXRpb24oaW50IGkpCit7CisJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwID0gcGUtPnBhcnRfdGFibGU7CisJc3RydWN0IHBhcnRpdGlvbiAqcSA9IHBlLT5leHRfcG9pbnRlcjsKKworLyogTm90ZSB0aGF0IGZvciB0aGUgZmlmdGggcGFydGl0aW9uIChpID09IDQpIHdlIGRvbid0IGFjdHVhbGx5CisgKiBkZWNyZW1lbnQgcGFydGl0aW9ucy4KKyAqLworCisJaWYgKHdhcm5fZ2VvbWV0cnkoKSkKKwkJcmV0dXJuOyAgICAgICAgIC8qIEMvSC9TIG5vdCBzZXQgKi8KKwlwZS0+Y2hhbmdlZCA9IDE7CisKKwlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCXN1bl9kZWxldGVfcGFydGl0aW9uKGkpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJc2dpX2RlbGV0ZV9wYXJ0aXRpb24oaSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaSA8IDQpIHsKKwkJaWYgKElTX0VYVEVOREVEKHAtPnN5c19pbmQpICYmIGkgPT0gZXh0X2luZGV4KSB7CisJCQlnX3BhcnRpdGlvbnMgPSA0OworCQkJcHRlc1tleHRfaW5kZXhdLmV4dF9wb2ludGVyID0gTlVMTDsKKwkJCWV4dGVuZGVkX29mZnNldCA9IDA7CisJCX0KKwkJY2xlYXJfcGFydGl0aW9uKHApOworCQlyZXR1cm47CisJfQorCisJaWYgKCFxLT5zeXNfaW5kICYmIGkgPiA0KSB7CisJCS8qIHRoZSBsYXN0IG9uZSBpbiB0aGUgY2hhaW4gLSBqdXN0IGRlbGV0ZSAqLworCQktLWdfcGFydGl0aW9uczsKKwkJLS1pOworCQljbGVhcl9wYXJ0aXRpb24ocHRlc1tpXS5leHRfcG9pbnRlcik7CisJCXB0ZXNbaV0uY2hhbmdlZCA9IDE7CisJfSBlbHNlIHsKKwkJLyogbm90IHRoZSBsYXN0IG9uZSAtIGZ1cnRoZXIgb25lcyB3aWxsIGJlIG1vdmVkIGRvd24gKi8KKwkJaWYgKGkgPiA0KSB7CisJCQkvKiBkZWxldGUgdGhpcyBsaW5rIGluIHRoZSBjaGFpbiAqLworCQkJcCA9IHB0ZXNbaS0xXS5leHRfcG9pbnRlcjsKKwkJCSpwID0gKnE7CisJCQlzZXRfc3RhcnRfc2VjdChwLCBnZXRfc3RhcnRfc2VjdChxKSk7CisJCQlzZXRfbnJfc2VjdHMocCwgZ2V0X25yX3NlY3RzKHEpKTsKKwkJCXB0ZXNbaS0xXS5jaGFuZ2VkID0gMTsKKwkJfSBlbHNlIGlmIChnX3BhcnRpdGlvbnMgPiA1KSB7ICAgIC8qIDUgd2lsbCBiZSBtb3ZlZCB0byA0ICovCisJCQkvKiB0aGUgZmlyc3QgbG9naWNhbCBpbiBhIGxvbmdlciBjaGFpbiAqLworCQkJcGUgPSAmcHRlc1s1XTsKKworCQkJaWYgKHBlLT5wYXJ0X3RhYmxlKSAvKiBwcmV2ZW50IFNFR0ZBVUxUICovCisJCQkJc2V0X3N0YXJ0X3NlY3QocGUtPnBhcnRfdGFibGUsCisJCQkJCQlnZXRfcGFydGl0aW9uX3N0YXJ0X2Zyb21fZGV2X3N0YXJ0KHBlKSAtCisJCQkJCQlleHRlbmRlZF9vZmZzZXQpOworCQkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IGV4dGVuZGVkX29mZnNldDsKKwkJCXBlLT5jaGFuZ2VkID0gMTsKKwkJfQorCisJCWlmIChnX3BhcnRpdGlvbnMgPiA1KSB7CisJCQlnX3BhcnRpdGlvbnMtLTsKKwkJCXdoaWxlIChpIDwgZ19wYXJ0aXRpb25zKSB7CisJCQkJcHRlc1tpXSA9IHB0ZXNbaSsxXTsKKwkJCQlpKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgb25seSBsb2dpY2FsOiBjbGVhciBvbmx5ICovCisJCQljbGVhcl9wYXJ0aXRpb24ocHRlc1tpXS5wYXJ0X3RhYmxlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2NoYW5nZV9zeXNpZCh2b2lkKQoreworCWludCBpLCBzeXMsIG9yaWdzeXM7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKworCS8qIElmIHNnaV9sYWJlbCB0aGVuIGRvbid0IHVzZSBnZXRfZXhpc3RpbmdfcGFydGl0aW9uLAorCSAgIGxldCB0aGUgdXNlciBzZWxlY3QgYSBwYXJ0aXRpb24sIHNpbmNlIGdldF9leGlzdGluZ19wYXJ0aXRpb24oKQorCSAgIG9ubHkgd29ya3MgZm9yIExpbnV4IGxpa2UgcGFydGl0aW9uIHRhYmxlcy4gKi8KKwlpZiAoIUxBQkVMX0lTX1NHSSkgeworCQlpID0gZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpOworCX0gZWxzZSB7CisJCWkgPSBnZXRfcGFydGl0aW9uKDAsIGdfcGFydGl0aW9ucyk7CisJfQorCWlmIChpID09IC0xKQorCQlyZXR1cm47CisJcCA9IHB0ZXNbaV0ucGFydF90YWJsZTsKKwlvcmlnc3lzID0gc3lzID0gZ2V0X3N5c2lkKGkpOworCisJLyogaWYgY2hhbmdpbmcgdHlwZXMgVCB0byAwIGlzIGFsbG93ZWQsIHRoZW4KKwkgICB0aGUgcmV2ZXJzZSBjaGFuZ2UgbXVzdCBiZSBhbGxvd2VkLCB0b28gKi8KKwlpZiAoIXN5cyAmJiAhTEFCRUxfSVNfU0dJICYmICFMQUJFTF9JU19TVU4gJiYgIWdldF9ucl9zZWN0cyhwKSkJeworCQlwcmludGYoIlBhcnRpdGlvbiAldSBkb2VzIG5vdCBleGlzdCB5ZXQhXG4iLCBpICsgMSk7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKDEpIHsKKwkJc3lzID0gcmVhZF9oZXgoZ2V0X3N5c190eXBlcygpKTsKKworCQlpZiAoIXN5cyAmJiAhTEFCRUxfSVNfU0dJICYmICFMQUJFTF9JU19TVU4pIHsKKwkJCXByaW50ZigiVHlwZSAwIG1lYW5zIGZyZWUgc3BhY2UgdG8gbWFueSBzeXN0ZW1zXG4iCisJCQkJICAgIihidXQgbm90IHRvIExpbnV4KS4gSGF2aW5nIHBhcnRpdGlvbnMgb2ZcbiIKKwkJCQkgICAidHlwZSAwIGlzIHByb2JhYmx5IHVud2lzZS5cbiIpOworCQkJLyogYnJlYWs7ICovCisJCX0KKworCQlpZiAoIUxBQkVMX0lTX1NVTiAmJiAhTEFCRUxfSVNfU0dJKSB7CisJCQlpZiAoSVNfRVhURU5ERUQoc3lzKSAhPSBJU19FWFRFTkRFRChwLT5zeXNfaW5kKSkgeworCQkJCXByaW50ZigiWW91IGNhbm5vdCBjaGFuZ2UgYSBwYXJ0aXRpb24gaW50byIKKwkJCQkJICAgIiBhbiBleHRlbmRlZCBvbmUgb3IgdmljZSB2ZXJzYVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc3lzIDwgMjU2KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisJCQlpZiAoTEFCRUxfSVNfU1VOICYmIGkgPT0gMiAmJiBzeXMgIT0gU1VOX1dIT0xFX0RJU0spCisJCQkJcHJpbnRmKCJDb25zaWRlciBsZWF2aW5nIHBhcnRpdGlvbiAzICIKKwkJCQkJICAgImFzIFdob2xlIGRpc2sgKDUpLFxuIgorCQkJCQkgICAiYXMgU3VuT1MvU29sYXJpcyBleHBlY3RzIGl0IGFuZCAiCisJCQkJCSAgICJldmVuIExpbnV4IGxpa2VzIGl0XG5cbiIpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0dJX0xBQkVMCisJCQlpZiAoTEFCRUxfSVNfU0dJICYmCisJCQkJKAorCQkJCQkoaSA9PSAxMCAmJiBzeXMgIT0gU0dJX0VOVElSRV9ESVNLKSB8fAorCQkJCQkoaSA9PSA4ICYmIHN5cyAhPSAwKQorCQkJCSkKKwkJCSkgeworCQkJCXByaW50ZigiQ29uc2lkZXIgbGVhdmluZyBwYXJ0aXRpb24gOSAiCisJCQkJCSAgICJhcyB2b2x1bWUgaGVhZGVyICgwKSxcbmFuZCAiCisJCQkJCSAgICJwYXJ0aXRpb24gMTEgYXMgZW50aXJlIHZvbHVtZSAoNikiCisJCQkJCSAgICJhcyBJUklYIGV4cGVjdHMgaXRcblxuIik7CisJCQl9CisjZW5kaWYKKwkJCWlmIChzeXMgPT0gb3JpZ3N5cykKKwkJCQlicmVhazsKKwkJCWlmIChMQUJFTF9JU19TVU4pIHsKKwkJCQlzdW5fY2hhbmdlX3N5c2lkKGksIHN5cyk7CisJCQl9IGVsc2UgaWYgKExBQkVMX0lTX1NHSSkgeworCQkJCXNnaV9jaGFuZ2Vfc3lzaWQoaSwgc3lzKTsKKwkJCX0gZWxzZQorCQkJCXAtPnN5c19pbmQgPSBzeXM7CisKKwkJCXByaW50ZigiQ2hhbmdlZCBzeXN0ZW0gdHlwZSBvZiBwYXJ0aXRpb24gJXUgIgorCQkJCSJ0byAleCAoJXMpXG4iLCBpICsgMSwgc3lzLAorCQkJCXBhcnRpdGlvbl90eXBlKHN5cykpOworCQkJcHRlc1tpXS5jaGFuZ2VkID0gMTsKKwkJCS8vaWYgKGlzX2Rvc19wYXJ0aXRpb24ob3JpZ3N5cykgfHwgaXNfZG9zX3BhcnRpdGlvbihzeXMpKQorCQkJLy8JZG9zX2NoYW5nZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19XUklUQUJMRSAqLworCisKKy8qIGNoZWNrX2NvbnNpc3RlbmN5KCkgYW5kIGxpbmVhcjJjaHMoKSBhZGRlZCBTYXQgTWFyIDYgMTI6Mjg6MTYgMTk5MywKKyAqIGZhaXRoQGNzLnVuYy5lZHUsIGJhc2VkIG9uIGNvZGUgZnJhZ21lbnRzIGZyb20gcGZkaXNrIGJ5IEdvcmRvbiBXLiBSb3NzLAorICogSmFuLiAgMTk5MCAodmVyc2lvbiAxLjIuMSBieSBHb3Jkb24gVy4gUm9zcyBBdWcuIDE5OTA7IE1vZGlmaWVkIGJ5IFMuCisgKiBMdWJraW4gT2N0LiAgMTk5MSkuICovCisKK3N0YXRpYyB2b2lkCitsaW5lYXIyY2hzKHVuc2lnbmVkIGxzLCB1bnNpZ25lZCAqYywgdW5zaWduZWQgKmgsIHVuc2lnbmVkICpzKQoreworCWludCBzcGMgPSBnX2hlYWRzICogZ19zZWN0b3JzOworCisJKmMgPSBscyAvIHNwYzsKKwlscyA9IGxzICUgc3BjOworCSpoID0gbHMgLyBnX3NlY3RvcnM7CisJKnMgPSBscyAlIGdfc2VjdG9ycyArIDE7ICAvKiBzZWN0b3JzIGNvdW50IGZyb20gMSAqLworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfY29uc2lzdGVuY3koY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcCwgaW50IHBhcnRpdGlvbikKK3sKKwl1bnNpZ25lZCBwYmMsIHBiaCwgcGJzOyAgICAgICAgICAvKiBwaHlzaWNhbCBiZWdpbm5pbmcgYywgaCwgcyAqLworCXVuc2lnbmVkIHBlYywgcGVoLCBwZXM7ICAgICAgICAgIC8qIHBoeXNpY2FsIGVuZGluZyBjLCBoLCBzICovCisJdW5zaWduZWQgbGJjLCBsYmgsIGxiczsgICAgICAgICAgLyogbG9naWNhbCBiZWdpbm5pbmcgYywgaCwgcyAqLworCXVuc2lnbmVkIGxlYywgbGVoLCBsZXM7ICAgICAgICAgIC8qIGxvZ2ljYWwgZW5kaW5nIGMsIGgsIHMgKi8KKworCWlmICghZ19oZWFkcyB8fCAhZ19zZWN0b3JzIHx8IChwYXJ0aXRpb24gPj0gNCkpCisJCXJldHVybjsgICAgICAgICAvKiBkbyBub3QgY2hlY2sgZXh0ZW5kZWQgcGFydGl0aW9ucyAqLworCisvKiBwaHlzaWNhbCBiZWdpbm5pbmcgYywgaCwgcyAqLworCXBiYyA9IChwLT5jeWwgJiAweGZmKSB8ICgocC0+c2VjdG9yIDw8IDIpICYgMHgzMDApOworCXBiaCA9IHAtPmhlYWQ7CisJcGJzID0gcC0+c2VjdG9yICYgMHgzZjsKKworLyogcGh5c2ljYWwgZW5kaW5nIGMsIGgsIHMgKi8KKwlwZWMgPSAocC0+ZW5kX2N5bCAmIDB4ZmYpIHwgKChwLT5lbmRfc2VjdG9yIDw8IDIpICYgMHgzMDApOworCXBlaCA9IHAtPmVuZF9oZWFkOworCXBlcyA9IHAtPmVuZF9zZWN0b3IgJiAweDNmOworCisvKiBjb21wdXRlIGxvZ2ljYWwgYmVnaW5uaW5nIChjLCBoLCBzKSAqLworCWxpbmVhcjJjaHMoZ2V0X3N0YXJ0X3NlY3QocCksICZsYmMsICZsYmgsICZsYnMpOworCisvKiBjb21wdXRlIGxvZ2ljYWwgZW5kaW5nIChjLCBoLCBzKSAqLworCWxpbmVhcjJjaHMoZ2V0X3N0YXJ0X3NlY3QocCkgKyBnZXRfbnJfc2VjdHMocCkgLSAxLCAmbGVjLCAmbGVoLCAmbGVzKTsKKworLyogU2FtZSBwaHlzaWNhbCAvIGxvZ2ljYWwgYmVnaW5uaW5nPyAqLworCWlmIChnX2N5bGluZGVycyA8PSAxMDI0ICYmIChwYmMgIT0gbGJjIHx8IHBiaCAhPSBsYmggfHwgcGJzICE9IGxicykpIHsKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgaGFzIGRpZmZlcmVudCBwaHlzaWNhbC9sb2dpY2FsICIKKwkJCSJiZWdpbm5pbmdzIChub24tTGludXg/KTpcbiIsIHBhcnRpdGlvbiArIDEpOworCQlwcmludGYoIiAgICAgcGh5cz0oJXUsICV1LCAldSkgIiwgcGJjLCBwYmgsIHBicyk7CisJCXByaW50ZigibG9naWNhbD0oJXUsICV1LCAldSlcbiIsIGxiYywgbGJoLCBsYnMpOworCX0KKworLyogU2FtZSBwaHlzaWNhbCAvIGxvZ2ljYWwgZW5kaW5nPyAqLworCWlmIChnX2N5bGluZGVycyA8PSAxMDI0ICYmIChwZWMgIT0gbGVjIHx8IHBlaCAhPSBsZWggfHwgcGVzICE9IGxlcykpIHsKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgaGFzIGRpZmZlcmVudCBwaHlzaWNhbC9sb2dpY2FsICIKKwkJCSJlbmRpbmdzOlxuIiwgcGFydGl0aW9uICsgMSk7CisJCXByaW50ZigiICAgICBwaHlzPSgldSwgJXUsICV1KSAiLCBwZWMsIHBlaCwgcGVzKTsKKwkJcHJpbnRmKCJsb2dpY2FsPSgldSwgJXUsICV1KVxuIiwgbGVjLCBsZWgsIGxlcyk7CisJfQorCisvKiBFbmRpbmcgb24gY3lsaW5kZXIgYm91bmRhcnk/ICovCisJaWYgKHBlaCAhPSAoZ19oZWFkcyAtIDEpIHx8IHBlcyAhPSBnX3NlY3RvcnMpIHsKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lcyBub3QgZW5kIG9uIGN5bGluZGVyIGJvdW5kYXJ5XG4iLAorCQkJcGFydGl0aW9uICsgMSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbGlzdF9kaXNrX2dlb21ldHJ5KHZvaWQpCit7CisJdWxsb25nIGJ5dGVzID0gKCh1bGxvbmcpdG90YWxfbnVtYmVyX29mX3NlY3RvcnMgPDwgOSk7CisJbG9uZyBtZWdhYnl0ZXMgPSBieXRlcyAvIDEwMDAwMDA7CisKKwlpZiAobWVnYWJ5dGVzIDwgMTAwMDApCisJCXByaW50ZigiXG5EaXNrICVzOiAlbHUgTUIsICVsbHUgYnl0ZXNcbiIsCisJCQlkaXNrX2RldmljZSwgbWVnYWJ5dGVzLCBieXRlcyk7CisJZWxzZQorCQlwcmludGYoIlxuRGlzayAlczogJWx1LiVsdSBHQiwgJWxsdSBieXRlc1xuIiwKKwkJCWRpc2tfZGV2aWNlLCBtZWdhYnl0ZXMvMTAwMCwgKG1lZ2FieXRlcy8xMDApJTEwLCBieXRlcyk7CisJcHJpbnRmKCIldSBoZWFkcywgJXUgc2VjdG9ycy90cmFjaywgJXUgY3lsaW5kZXJzIiwKKwkJICAgZ19oZWFkcywgZ19zZWN0b3JzLCBnX2N5bGluZGVycyk7CisJaWYgKHVuaXRzX3Blcl9zZWN0b3IgPT0gMSkKKwkJcHJpbnRmKCIsIHRvdGFsICUiU0VDVF9GTVQidSBzZWN0b3JzIiwKKwkJCXRvdGFsX251bWJlcl9vZl9zZWN0b3JzIC8gKHNlY3Rvcl9zaXplLzUxMikpOworCXByaW50ZigiXG5Vbml0cyA9ICVzIG9mICV1ICogJXUgPSAldSBieXRlc1xuXG4iLAorCQlzdHJfdW5pdHMoUExVUkFMKSwKKwkJdW5pdHNfcGVyX3NlY3Rvciwgc2VjdG9yX3NpemUsIHVuaXRzX3Blcl9zZWN0b3IgKiBzZWN0b3Jfc2l6ZSk7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHBhcnRpdGlvbiBlbnRyaWVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHN0YXJ0aW5nIHBvc2l0aW9ucy4KKyAqIFJldHVybiAwIGlmIE9LLiBSZXR1cm4gaSBpZiBwYXJ0aXRpb24gaSBzaG91bGQgaGF2ZSBiZWVuIGVhcmxpZXIuCisgKiBUd28gc2VwYXJhdGUgY2hlY2tzOiBwcmltYXJ5IGFuZCBsb2dpY2FsIHBhcnRpdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK3dyb25nX3Bfb3JkZXIoaW50ICpwcmV2KQoreworCWNvbnN0IHN0cnVjdCBwdGUgKnBlOworCWNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnA7CisJc2VjdG9yX3QgbGFzdF9wX3N0YXJ0X3BvcyA9IDAsIHBfc3RhcnRfcG9zOworCXVuc2lnbmVkIGksIGxhc3RfaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJaWYgKGkgPT0gNCkgeworCQkJbGFzdF9pID0gNDsKKwkJCWxhc3RfcF9zdGFydF9wb3MgPSAwOworCQl9CisJCXBlID0gJnB0ZXNbaV07CisJCXAgPSBwZS0+cGFydF90YWJsZTsKKwkJaWYgKHAtPnN5c19pbmQpIHsKKwkJCXBfc3RhcnRfcG9zID0gZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSk7CisKKwkJCWlmIChsYXN0X3Bfc3RhcnRfcG9zID4gcF9zdGFydF9wb3MpIHsKKwkJCQlpZiAocHJldikKKwkJCQkJKnByZXYgPSBsYXN0X2k7CisJCQkJcmV0dXJuIGk7CisJCQl9CisKKwkJCWxhc3RfcF9zdGFydF9wb3MgPSBwX3N0YXJ0X3BvczsKKwkJCWxhc3RfaSA9IGk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorLyoKKyAqIEZpeCB0aGUgY2hhaW4gb2YgbG9naWNhbHMuCisgKiBleHRlbmRlZF9vZmZzZXQgaXMgdW5jaGFuZ2VkLCB0aGUgc2V0IG9mIHNlY3RvcnMgdXNlZCBpcyB1bmNoYW5nZWQKKyAqIFRoZSBjaGFpbiBpcyBzb3J0ZWQgc28gdGhhdCBzZWN0b3JzIGluY3JlYXNlLCBhbmQgc28gdGhhdAorICogc3RhcnRpbmcgc2VjdG9ycyBpbmNyZWFzZS4KKyAqCisgKiBBZnRlciB0aGlzIGl0IG1heSBzdGlsbCBiZSB0aGF0IGNmZGlzayBkb2VzbnQgbGlrZSB0aGUgdGFibGUuCisgKiAoVGhpcyBpcyBiZWNhdXNlIGNmZGlzayBjb25zaWRlcnMgZXhwYW5kZWQgcGFydHMsIGZyb20gbGluayB0bworICogZW5kIG9mIHBhcnRpdGlvbiwgYW5kIHRoZXNlIG1heSBzdGlsbCBvdmVybGFwLikKKyAqIE5vdworICogICBzZmRpc2sgL2Rldi9oZGEgPiBvaGRhOyBzZmRpc2sgL2Rldi9oZGEgPCBvaGRhCisgKiBtYXkgaGVscC4KKyAqLworc3RhdGljIHZvaWQKK2ZpeF9jaGFpbl9vZl9sb2dpY2Fscyh2b2lkKQoreworCWludCBqLCBvaiwgb2pqLCBzaiwgc2pqOworCXN0cnVjdCBwYXJ0aXRpb24gKnBqLCpwamosdG1wOworCisJLyogU3RhZ2UgMTogc29ydCBzZWN0b3JzIGJ1dCBsZWF2ZSBzZWN0b3Igb2YgcGFydCA0ICovCisJLyogKEl0cyBzZWN0b3IgaXMgdGhlIGdsb2JhbCBleHRlbmRlZF9vZmZzZXQuKSAqLworIHN0YWdlMToKKwlmb3IgKGogPSA1OyBqIDwgZ19wYXJ0aXRpb25zIC0gMTsgaisrKSB7CisJCW9qID0gcHRlc1tqXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCW9qaiA9IHB0ZXNbaisxXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCWlmIChvaiA+IG9qaikgeworCQkJcHRlc1tqXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSBvamo7CisJCQlwdGVzW2orMV0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID0gb2o7CisJCQlwaiA9IHB0ZXNbal0ucGFydF90YWJsZTsKKwkJCXNldF9zdGFydF9zZWN0KHBqLCBnZXRfc3RhcnRfc2VjdChwaikrb2otb2pqKTsKKwkJCXBqaiA9IHB0ZXNbaisxXS5wYXJ0X3RhYmxlOworCQkJc2V0X3N0YXJ0X3NlY3QocGpqLCBnZXRfc3RhcnRfc2VjdChwamopK29qai1vaik7CisJCQlzZXRfc3RhcnRfc2VjdChwdGVzW2otMV0uZXh0X3BvaW50ZXIsCisJCQkJCSAgIG9qai1leHRlbmRlZF9vZmZzZXQpOworCQkJc2V0X3N0YXJ0X3NlY3QocHRlc1tqXS5leHRfcG9pbnRlciwKKwkJCQkJICAgb2otZXh0ZW5kZWRfb2Zmc2V0KTsKKwkJCWdvdG8gc3RhZ2UxOworCQl9CisJfQorCisJLyogU3RhZ2UgMjogc29ydCBzdGFydGluZyBzZWN0b3JzICovCisgc3RhZ2UyOgorCWZvciAoaiA9IDQ7IGogPCBnX3BhcnRpdGlvbnMgLSAxOyBqKyspIHsKKwkJcGogPSBwdGVzW2pdLnBhcnRfdGFibGU7CisJCXBqaiA9IHB0ZXNbaisxXS5wYXJ0X3RhYmxlOworCQlzaiA9IGdldF9zdGFydF9zZWN0KHBqKTsKKwkJc2pqID0gZ2V0X3N0YXJ0X3NlY3QocGpqKTsKKwkJb2ogPSBwdGVzW2pdLm9mZnNldF9mcm9tX2Rldl9zdGFydDsKKwkJb2pqID0gcHRlc1tqKzFdLm9mZnNldF9mcm9tX2Rldl9zdGFydDsKKwkJaWYgKG9qK3NqID4gb2pqK3NqaikgeworCQkJdG1wID0gKnBqOworCQkJKnBqID0gKnBqajsKKwkJCSpwamogPSB0bXA7CisJCQlzZXRfc3RhcnRfc2VjdChwaiwgb2pqK3Nqai1vaik7CisJCQlzZXRfc3RhcnRfc2VjdChwamosIG9qK3NqLW9qaik7CisJCQlnb3RvIHN0YWdlMjsKKwkJfQorCX0KKworCS8qIFByb2JhYmx5IHNvbWV0aGluZyB3YXMgY2hhbmdlZCAqLworCWZvciAoaiA9IDQ7IGogPCBnX3BhcnRpdGlvbnM7IGorKykKKwkJcHRlc1tqXS5jaGFuZ2VkID0gMTsKK30KKworCitzdGF0aWMgdm9pZAorZml4X3BhcnRpdGlvbl90YWJsZV9vcmRlcih2b2lkKQoreworCXN0cnVjdCBwdGUgKnBlaSwgKnBlazsKKwlpbnQgaSxrOworCisJaWYgKCF3cm9uZ19wX29yZGVyKE5VTEwpKSB7CisJCXByaW50ZigiT3JkZXJpbmcgaXMgYWxyZWFkeSBjb3JyZWN0XG5cbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKChpID0gd3JvbmdfcF9vcmRlcigmaykpICE9IDAgJiYgaSA8IDQpIHsKKwkJLyogcGFydGl0aW9uIGkgc2hvdWxkIGhhdmUgY29tZSBlYXJsaWVyLCBtb3ZlIGl0ICovCisJCS8qIFdlIGhhdmUgdG8gbW92ZSBkYXRhIGluIHRoZSBNQlIgKi8KKwkJc3RydWN0IHBhcnRpdGlvbiAqcGksICpwaywgKnBlLCBwYnVmOworCQlwZWkgPSAmcHRlc1tpXTsKKwkJcGVrID0gJnB0ZXNba107CisKKwkJcGUgPSBwZWktPmV4dF9wb2ludGVyOworCQlwZWktPmV4dF9wb2ludGVyID0gcGVrLT5leHRfcG9pbnRlcjsKKwkJcGVrLT5leHRfcG9pbnRlciA9IHBlOworCisJCXBpID0gcGVpLT5wYXJ0X3RhYmxlOworCQlwayA9IHBlay0+cGFydF90YWJsZTsKKworCQltZW1tb3ZlKCZwYnVmLCBwaSwgc2l6ZW9mKHN0cnVjdCBwYXJ0aXRpb24pKTsKKwkJbWVtbW92ZShwaSwgcGssIHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSk7CisJCW1lbW1vdmUocGssICZwYnVmLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworCisJCXBlaS0+Y2hhbmdlZCA9IHBlay0+Y2hhbmdlZCA9IDE7CisJfQorCisJaWYgKGkpCisJCWZpeF9jaGFpbl9vZl9sb2dpY2FscygpOworCisJcHJpbnRmKCJEb25lLlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2xpc3RfdGFibGUoaW50IHh0cmEpCit7CisJY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaSwgdzsKKworCWlmIChMQUJFTF9JU19TVU4pIHsKKwkJc3VuX2xpc3RfdGFibGUoeHRyYSk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX1NHSSkgeworCQlzZ2lfbGlzdF90YWJsZSh4dHJhKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoTEFCRUxfSVNfR1BUKSB7CisJCWdwdF9saXN0X3RhYmxlKHh0cmEpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9kaXNrX2dlb21ldHJ5KCk7CisKKwlpZiAoTEFCRUxfSVNfT1NGKSB7CisJCXhic2RfcHJpbnRfZGlza2xhYmVsKHh0cmEpOworCQlyZXR1cm47CisJfQorCisJLyogSGV1cmlzdGljOiB3ZSBsaXN0IHBhcnRpdGlvbiAzIG9mIC9kZXYvZm9vIGFzIC9kZXYvZm9vMywKKwkgICBidXQgaWYgdGhlIGRldmljZSBuYW1lIGVuZHMgaW4gYSBkaWdpdCwgc2F5IC9kZXYvZm9vMSwKKwkgICB0aGVuIHRoZSBwYXJ0aXRpb24gaXMgY2FsbGVkIC9kZXYvZm9vMXAzLiAqLworCXcgPSBzdHJsZW4oZGlza19kZXZpY2UpOworCWlmICh3ICYmIGlzZGlnaXQoZGlza19kZXZpY2Vbdy0xXSkpCisJCXcrKzsKKwlpZiAodyA8IDUpCisJCXcgPSA1OworCisJLy8gICAgICAgICAgICAxIDEyMzQ1Njc4OTAxIDEyMzQ1Njc4OTAxIDEyMzQ1Njc4OTAxICAxMgorCXByaW50ZigiJSpzIEJvb3QgICAgICBTdGFydCAgICAgICAgIEVuZCAgICAgIEJsb2NrcyAgSWQgU3lzdGVtXG4iLAorCQkgICB3KzEsICJEZXZpY2UiKTsKKworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCQlzZWN0b3JfdCBwc2VjdHM7CisJCXNlY3Rvcl90IHBibG9ja3M7CisJCXVuc2lnbmVkIHBvZGQ7CisKKwkJcCA9IHBlLT5wYXJ0X3RhYmxlOworCQlpZiAoIXAgfHwgaXNfY2xlYXJlZF9wYXJ0aXRpb24ocCkpCisJCQljb250aW51ZTsKKworCQlwc2VjdHMgPSBnZXRfbnJfc2VjdHMocCk7CisJCXBibG9ja3MgPSBwc2VjdHM7CisJCXBvZGQgPSAwOworCisJCWlmIChzZWN0b3Jfc2l6ZSA8IDEwMjQpIHsKKwkJCXBibG9ja3MgLz0gKDEwMjQgLyBzZWN0b3Jfc2l6ZSk7CisJCQlwb2RkID0gcHNlY3RzICUgKDEwMjQgLyBzZWN0b3Jfc2l6ZSk7CisJCX0KKwkJaWYgKHNlY3Rvcl9zaXplID4gMTAyNCkKKwkJCXBibG9ja3MgKj0gKHNlY3Rvcl9zaXplIC8gMTAyNCk7CisKKwkJcHJpbnRmKCIlcyAgJWMgJTExIlNFQ1RfRk1UInUgJTExIlNFQ1RfRk1UInUgJTExIlNFQ1RfRk1UInUlYyAlMnggJXNcbiIsCisJCQlwYXJ0bmFtZShkaXNrX2RldmljZSwgaSsxLCB3KzIpLAorCQkJIXAtPmJvb3RfaW5kID8gJyAnIDogcC0+Ym9vdF9pbmQgPT0gQUNUSVZFX0ZMQUcgLyogYm9vdCBmbGFnICovCisJCQkJPyAnKicgOiAnPycsCisJCQljcm91bmQoZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSkpLCAgICAgICAgICAgLyogc3RhcnQgKi8KKwkJCWNyb3VuZChnZXRfcGFydGl0aW9uX3N0YXJ0X2Zyb21fZGV2X3N0YXJ0KHBlKSArIHBzZWN0cyAgICAvKiBlbmQgKi8KKwkJCQktIChwc2VjdHMgPyAxIDogMCkpLAorCQkJcGJsb2NrcywgcG9kZCA/ICcrJyA6ICcgJywgLyogb2RkIGZsYWcgb24gZW5kICovCisJCQlwLT5zeXNfaW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIGlkICovCisJCQlwYXJ0aXRpb25fdHlwZShwLT5zeXNfaW5kKSk7ICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG5hbWUgKi8KKworCQljaGVja19jb25zaXN0ZW5jeShwLCBpKTsKKwl9CisKKwkvKiBJcyBwYXJ0aXRpb24gdGFibGUgaW4gZGlzayBvcmRlcj8gSXQgbmVlZCBub3QgYmUsIGJ1dC4uLiAqLworCS8qIHBhcnRpdGlvbiB0YWJsZSBlbnRyaWVzIGFyZSBub3QgY2hlY2tlZCBmb3IgY29ycmVjdCBvcmRlcgorCSAqIGlmIHRoaXMgaXMgYSBzZ2ksIHN1biBvciBhaXggbGFiZWxlZCBkaXNrLi4uICovCisJaWYgKExBQkVMX0lTX0RPUyAmJiB3cm9uZ19wX29yZGVyKE5VTEwpKSB7CisJCS8qIEZJWE1FICovCisJCXByaW50ZigiXG5QYXJ0aXRpb24gdGFibGUgZW50cmllcyBhcmUgbm90IGluIGRpc2sgb3JkZXJcbiIpOworCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0FEVkFOQ0VECitzdGF0aWMgdm9pZAoreF9saXN0X3RhYmxlKGludCBleHRlbmQpCit7CisJY29uc3Qgc3RydWN0IHB0ZSAqcGU7CisJY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaTsKKworCXByaW50ZigiXG5EaXNrICVzOiAldSBoZWFkcywgJXUgc2VjdG9ycywgJXUgY3lsaW5kZXJzXG5cbiIsCisJCWRpc2tfZGV2aWNlLCBnX2hlYWRzLCBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzKTsKKwlwcmludGYoIk5yIEFGICBIZCBTZWMgIEN5bCAgSGQgU2VjICBDeWwgICAgICBTdGFydCAgICAgICBTaXplIElEXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJcGUgPSAmcHRlc1tpXTsKKwkJcCA9IChleHRlbmQgPyBwZS0+ZXh0X3BvaW50ZXIgOiBwZS0+cGFydF90YWJsZSk7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCXByaW50ZigiJTJ1ICUwMnglNHUlNHUlNXUlNHUlNHUlNXUlMTEiU0VDVF9GTVQidSUxMSJTRUNUX0ZNVCJ1ICUwMnhcbiIsCisJCQkJaSArIDEsIHAtPmJvb3RfaW5kLCBwLT5oZWFkLAorCQkJCXNlY3RvcihwLT5zZWN0b3IpLAorCQkJCWN5bGluZGVyKHAtPnNlY3RvciwgcC0+Y3lsKSwgcC0+ZW5kX2hlYWQsCisJCQkJc2VjdG9yKHAtPmVuZF9zZWN0b3IpLAorCQkJCWN5bGluZGVyKHAtPmVuZF9zZWN0b3IsIHAtPmVuZF9jeWwpLAorCQkJCWdldF9zdGFydF9zZWN0KHApLCBnZXRfbnJfc2VjdHMocCksCisJCQkJcC0+c3lzX2luZCk7CisJCQlpZiAocC0+c3lzX2luZCkKKwkJCQljaGVja19jb25zaXN0ZW5jeShwLCBpKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyB2b2lkCitmaWxsX2JvdW5kcyhzZWN0b3JfdCAqZmlyc3QsIHNlY3Rvcl90ICpsYXN0KQoreworCXVuc2lnbmVkIGk7CisJY29uc3Qgc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1swXTsKKwljb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwOworCisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgcGUrKyxpKyspIHsKKwkJcCA9IHBlLT5wYXJ0X3RhYmxlOworCQlpZiAoIXAtPnN5c19pbmQgfHwgSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJCWZpcnN0W2ldID0gMHhmZmZmZmZmZjsKKwkJCWxhc3RbaV0gPSAwOworCQl9IGVsc2UgeworCQkJZmlyc3RbaV0gPSBnZXRfcGFydGl0aW9uX3N0YXJ0X2Zyb21fZGV2X3N0YXJ0KHBlKTsKKwkJCWxhc3RbaV0gPSBmaXJzdFtpXSArIGdldF9ucl9zZWN0cyhwKSAtIDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVjayhpbnQgbiwgdW5zaWduZWQgaCwgdW5zaWduZWQgcywgdW5zaWduZWQgYywgc2VjdG9yX3Qgc3RhcnQpCit7CisJc2VjdG9yX3QgdG90YWwsIHJlYWxfcywgcmVhbF9jOworCisJcmVhbF9zID0gc2VjdG9yKHMpIC0gMTsKKwlyZWFsX2MgPSBjeWxpbmRlcihzLCBjKTsKKwl0b3RhbCA9IChyZWFsX2MgKiBnX3NlY3RvcnMgKyByZWFsX3MpICogZ19oZWFkcyArIGg7CisJaWYgKCF0b3RhbCkKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgY29udGFpbnMgc2VjdG9yIDBcbiIsIG4pOworCWlmIChoID49IGdfaGVhZHMpCisJCXByaW50ZigiUGFydGl0aW9uICV1OiBoZWFkICV1IGdyZWF0ZXIgdGhhbiBtYXhpbXVtICV1XG4iLAorCQkJbiwgaCArIDEsIGdfaGVhZHMpOworCWlmIChyZWFsX3MgPj0gZ19zZWN0b3JzKQorCQlwcmludGYoIlBhcnRpdGlvbiAldTogc2VjdG9yICV1IGdyZWF0ZXIgdGhhbiAiCisJCQkibWF4aW11bSAldVxuIiwgbiwgcywgZ19zZWN0b3JzKTsKKwlpZiAocmVhbF9jID49IGdfY3lsaW5kZXJzKQorCQlwcmludGYoIlBhcnRpdGlvbiAldTogY3lsaW5kZXIgJSJTRUNUX0ZNVCJ1IGdyZWF0ZXIgdGhhbiAiCisJCQkibWF4aW11bSAldVxuIiwgbiwgcmVhbF9jICsgMSwgZ19jeWxpbmRlcnMpOworCWlmIChnX2N5bGluZGVycyA8PSAxMDI0ICYmIHN0YXJ0ICE9IHRvdGFsKQorCQlwcmludGYoIlBhcnRpdGlvbiAldTogcHJldmlvdXMgc2VjdG9ycyAlIlNFQ1RfRk1UInUgZGlzYWdyZWVzIHdpdGggIgorCQkJInRvdGFsICUiU0VDVF9GTVQidVxuIiwgbiwgc3RhcnQsIHRvdGFsKTsKK30KKworc3RhdGljIHZvaWQKK3ZlcmlmeSh2b2lkKQoreworCWludCBpLCBqOworCXNlY3Rvcl90IHRvdGFsID0gMTsKKwlzZWN0b3JfdCBmaXJzdFtnX3BhcnRpdGlvbnNdLCBsYXN0W2dfcGFydGl0aW9uc107CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKworCWlmICh3YXJuX2dlb21ldHJ5KCkpCisJCXJldHVybjsKKworCWlmIChMQUJFTF9JU19TVU4pIHsKKwkJdmVyaWZ5X3N1bigpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJdmVyaWZ5X3NnaSgxKTsKKwkJcmV0dXJuOworCX0KKworCWZpbGxfYm91bmRzKGZpcnN0LCBsYXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKworCQlwID0gcGUtPnBhcnRfdGFibGU7CisJCWlmIChwLT5zeXNfaW5kICYmICFJU19FWFRFTkRFRChwLT5zeXNfaW5kKSkgeworCQkJY2hlY2tfY29uc2lzdGVuY3kocCwgaSk7CisJCQlpZiAoZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSkgPCBmaXJzdFtpXSkKKwkJCQlwcmludGYoIldhcm5pbmc6IGJhZCBzdGFydC1vZi1kYXRhIGluICIKKwkJCQkJInBhcnRpdGlvbiAldVxuIiwgaSArIDEpOworCQkJY2hlY2soaSArIDEsIHAtPmVuZF9oZWFkLCBwLT5lbmRfc2VjdG9yLCBwLT5lbmRfY3lsLAorCQkJCWxhc3RbaV0pOworCQkJdG90YWwgKz0gbGFzdFtpXSArIDEgLSBmaXJzdFtpXTsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlpZiAoKGZpcnN0W2ldID49IGZpcnN0W2pdICYmIGZpcnN0W2ldIDw9IGxhc3Rbal0pCisJCQkJIHx8ICgobGFzdFtpXSA8PSBsYXN0W2pdICYmIGxhc3RbaV0gPj0gZmlyc3Rbal0pKSkgeworCQkJCQlwcmludGYoIldhcm5pbmc6IHBhcnRpdGlvbiAldSBvdmVybGFwcyAiCisJCQkJCQkicGFydGl0aW9uICV1XG4iLCBqICsgMSwgaSArIDEpOworCQkJCQl0b3RhbCArPSBmaXJzdFtpXSA+PSBmaXJzdFtqXSA/CisJCQkJCQlmaXJzdFtpXSA6IGZpcnN0W2pdOworCQkJCQl0b3RhbCAtPSBsYXN0W2ldIDw9IGxhc3Rbal0gPworCQkJCQkJbGFzdFtpXSA6IGxhc3Rbal07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGV4dGVuZGVkX29mZnNldCkgeworCQlzdHJ1Y3QgcHRlICpwZXggPSAmcHRlc1tleHRfaW5kZXhdOworCQlzZWN0b3JfdCBlX2xhc3QgPSBnZXRfc3RhcnRfc2VjdChwZXgtPnBhcnRfdGFibGUpICsKKwkJCWdldF9ucl9zZWN0cyhwZXgtPnBhcnRfdGFibGUpIC0gMTsKKworCQlmb3IgKGkgPSA0OyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJCXRvdGFsKys7CisJCQlwID0gcHRlc1tpXS5wYXJ0X3RhYmxlOworCQkJaWYgKCFwLT5zeXNfaW5kKSB7CisJCQkJaWYgKGkgIT0gNCB8fCBpICsgMSA8IGdfcGFydGl0aW9ucykKKwkJCQkJcHJpbnRmKCJXYXJuaW5nOiBwYXJ0aXRpb24gJXUgIgorCQkJCQkJImlzIGVtcHR5XG4iLCBpICsgMSk7CisJCQl9IGVsc2UgaWYgKGZpcnN0W2ldIDwgZXh0ZW5kZWRfb2Zmc2V0IHx8IGxhc3RbaV0gPiBlX2xhc3QpIHsKKwkJCQlwcmludGYoIkxvZ2ljYWwgcGFydGl0aW9uICV1IG5vdCBlbnRpcmVseSBpbiAiCisJCQkJCSJwYXJ0aXRpb24gJXVcbiIsIGkgKyAxLCBleHRfaW5kZXggKyAxKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0b3RhbCA+IGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVycykKKwkJcHJpbnRmKCJUb3RhbCBhbGxvY2F0ZWQgc2VjdG9ycyAldSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gIgorCQkJIiV1XG4iLCB0b3RhbCwgZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfY3lsaW5kZXJzKTsKKwllbHNlIHsKKwkJdG90YWwgPSBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMgLSB0b3RhbDsKKwkJaWYgKHRvdGFsICE9IDApCisJCQlwcmludGYoIiUiU0VDVF9GTVQidSB1bmFsbG9jYXRlZCBzZWN0b3JzXG4iLCB0b3RhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWRkX3BhcnRpdGlvbihpbnQgbiwgaW50IHN5cykKK3sKKwljaGFyIG1lc2dbMjU2XTsgICAgICAgICAvKiA0OCBkb2VzIG5vdCBzdWZmaWNlIGluIEphcGFuZXNlICovCisJaW50IGksIG51bV9yZWFkID0gMDsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwID0gcHRlc1tuXS5wYXJ0X3RhYmxlOworCXN0cnVjdCBwYXJ0aXRpb24gKnEgPSBwdGVzW2V4dF9pbmRleF0ucGFydF90YWJsZTsKKwlzZWN0b3JfdCBsaW1pdCwgdGVtcDsKKwlzZWN0b3JfdCBzdGFydCwgc3RvcCA9IDA7CisJc2VjdG9yX3QgZmlyc3RbZ19wYXJ0aXRpb25zXSwgbGFzdFtnX3BhcnRpdGlvbnNdOworCisJaWYgKHAgJiYgcC0+c3lzX2luZCkgeworCQlwcmludGYobXNnX3BhcnRfYWxyZWFkeV9kZWZpbmVkLCBuICsgMSk7CisJCXJldHVybjsKKwl9CisJZmlsbF9ib3VuZHMoZmlyc3QsIGxhc3QpOworCWlmIChuIDwgNCkgeworCQlzdGFydCA9IHNlY3Rvcl9vZmZzZXQ7CisJCWlmIChkaXNwbGF5X2luX2N5bF91bml0cyB8fCAhdG90YWxfbnVtYmVyX29mX3NlY3RvcnMpCisJCQlsaW1pdCA9IChzZWN0b3JfdCkgZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfY3lsaW5kZXJzIC0gMTsKKwkJZWxzZQorCQkJbGltaXQgPSB0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycyAtIDE7CisJCWlmIChleHRlbmRlZF9vZmZzZXQpIHsKKwkJCWZpcnN0W2V4dF9pbmRleF0gPSBleHRlbmRlZF9vZmZzZXQ7CisJCQlsYXN0W2V4dF9pbmRleF0gPSBnZXRfc3RhcnRfc2VjdChxKSArCisJCQkJZ2V0X25yX3NlY3RzKHEpIC0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXN0YXJ0ID0gZXh0ZW5kZWRfb2Zmc2V0ICsgc2VjdG9yX29mZnNldDsKKwkJbGltaXQgPSBnZXRfc3RhcnRfc2VjdChxKSArIGdldF9ucl9zZWN0cyhxKSAtIDE7CisJfQorCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykKKwkJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKQorCQkJZmlyc3RbaV0gPSAoY3JvdW5kKGZpcnN0W2ldKSAtIDEpICogdW5pdHNfcGVyX3NlY3RvcjsKKworCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwgIkZpcnN0ICVzIiwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJZG8geworCQl0ZW1wID0gc3RhcnQ7CisJCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQkJaW50IGxhc3RwbHVzb2ZmOworCisJCQlpZiAoc3RhcnQgPT0gcHRlc1tpXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQpCisJCQkJc3RhcnQgKz0gc2VjdG9yX29mZnNldDsKKwkJCWxhc3RwbHVzb2ZmID0gbGFzdFtpXSArICgobiA8IDQpID8gMCA6IHNlY3Rvcl9vZmZzZXQpOworCQkJaWYgKHN0YXJ0ID49IGZpcnN0W2ldICYmIHN0YXJ0IDw9IGxhc3RwbHVzb2ZmKQorCQkJCXN0YXJ0ID0gbGFzdHBsdXNvZmYgKyAxOworCQl9CisJCWlmIChzdGFydCA+IGxpbWl0KQorCQkJYnJlYWs7CisJCWlmIChzdGFydCA+PSB0ZW1wK3VuaXRzX3Blcl9zZWN0b3IgJiYgbnVtX3JlYWQpIHsKKwkJCXByaW50ZigiU2VjdG9yICUiU0VDVF9GTVQidSBpcyBhbHJlYWR5IGFsbG9jYXRlZFxuIiwgdGVtcCk7CisJCQl0ZW1wID0gc3RhcnQ7CisJCQludW1fcmVhZCA9IDA7CisJCX0KKwkJaWYgKCFudW1fcmVhZCAmJiBzdGFydCA9PSB0ZW1wKSB7CisJCQlzZWN0b3JfdCBzYXZlZF9zdGFydDsKKworCQkJc2F2ZWRfc3RhcnQgPSBzdGFydDsKKwkJCXN0YXJ0ID0gcmVhZF9pbnQoY3JvdW5kKHNhdmVkX3N0YXJ0KSwgY3JvdW5kKHNhdmVkX3N0YXJ0KSwgY3JvdW5kKGxpbWl0KSwgMCwgbWVzZyk7CisJCQlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpIHsKKwkJCQlzdGFydCA9IChzdGFydCAtIDEpICogdW5pdHNfcGVyX3NlY3RvcjsKKwkJCQlpZiAoc3RhcnQgPCBzYXZlZF9zdGFydCkKKwkJCQkJc3RhcnQgPSBzYXZlZF9zdGFydDsKKwkJCX0KKwkJCW51bV9yZWFkID0gMTsKKwkJfQorCX0gd2hpbGUgKHN0YXJ0ICE9IHRlbXAgfHwgIW51bV9yZWFkKTsKKwlpZiAobiA+IDQpIHsgICAgICAgICAgICAgICAgICAgIC8qIE5PVCBmb3IgZmlmdGggcGFydGl0aW9uICovCisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbbl07CisKKwkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IHN0YXJ0IC0gc2VjdG9yX29mZnNldDsKKwkJaWYgKHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPT0gZXh0ZW5kZWRfb2Zmc2V0KSB7IC8qIG11c3QgYmUgY29ycmVjdGVkICovCisJCQlwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0Kys7CisJCQlpZiAoc2VjdG9yX29mZnNldCA9PSAxKQorCQkJCXN0YXJ0Kys7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKworCQlpZiAoc3RhcnQgPCBwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ICYmIGxpbWl0ID49IHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQpCisJCQlsaW1pdCA9IHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgLSAxOworCQlpZiAoc3RhcnQgPCBmaXJzdFtpXSAmJiBsaW1pdCA+PSBmaXJzdFtpXSkKKwkJCWxpbWl0ID0gZmlyc3RbaV0gLSAxOworCX0KKwlpZiAoc3RhcnQgPiBsaW1pdCkgeworCQlwcmludGYoIk5vIGZyZWUgc2VjdG9ycyBhdmFpbGFibGVcbiIpOworCQlpZiAobiA+IDQpCisJCQlnX3BhcnRpdGlvbnMtLTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY3JvdW5kKHN0YXJ0KSA9PSBjcm91bmQobGltaXQpKSB7CisJCXN0b3AgPSBsaW1pdDsKKwl9IGVsc2UgeworCQlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksCisJCQkgIkxhc3QgJXMgb3IgK3NpemUgb3IgK3NpemVNIG9yICtzaXplSyIsCisJCQkgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJCXN0b3AgPSByZWFkX2ludChjcm91bmQoc3RhcnQpLCBjcm91bmQobGltaXQpLCBjcm91bmQobGltaXQpLCBjcm91bmQoc3RhcnQpLCBtZXNnKTsKKwkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKSB7CisJCQlzdG9wID0gc3RvcCAqIHVuaXRzX3Blcl9zZWN0b3IgLSAxOworCQkJaWYgKHN0b3AgPmxpbWl0KQorCQkJCXN0b3AgPSBsaW1pdDsKKwkJfQorCX0KKworCXNldF9wYXJ0aXRpb24obiwgMCwgc3RhcnQsIHN0b3AsIHN5cyk7CisJaWYgKG4gPiA0KQorCQlzZXRfcGFydGl0aW9uKG4gLSAxLCAxLCBwdGVzW25dLm9mZnNldF9mcm9tX2Rldl9zdGFydCwgc3RvcCwgRVhURU5ERUQpOworCisJaWYgKElTX0VYVEVOREVEKHN5cykpIHsKKwkJc3RydWN0IHB0ZSAqcGU0ID0gJnB0ZXNbNF07CisJCXN0cnVjdCBwdGUgKnBlbiA9ICZwdGVzW25dOworCisJCWV4dF9pbmRleCA9IG47CisJCXBlbi0+ZXh0X3BvaW50ZXIgPSBwOworCQlwZTQtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IGV4dGVuZGVkX29mZnNldCA9IHN0YXJ0OworCQlwZTQtPnNlY3RvcmJ1ZmZlciA9IHh6YWxsb2Moc2VjdG9yX3NpemUpOworCQlwZTQtPnBhcnRfdGFibGUgPSBwdF9vZmZzZXQocGU0LT5zZWN0b3JidWZmZXIsIDApOworCQlwZTQtPmV4dF9wb2ludGVyID0gcGU0LT5wYXJ0X3RhYmxlICsgMTsKKwkJcGU0LT5jaGFuZ2VkID0gMTsKKwkJZ19wYXJ0aXRpb25zID0gNTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfbG9naWNhbCh2b2lkKQoreworCWlmIChnX3BhcnRpdGlvbnMgPiA1IHx8IHB0ZXNbNF0ucGFydF90YWJsZS0+c3lzX2luZCkgeworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2dfcGFydGl0aW9uc107CisKKwkJcGUtPnNlY3RvcmJ1ZmZlciA9IHh6YWxsb2Moc2VjdG9yX3NpemUpOworCQlwZS0+cGFydF90YWJsZSA9IHB0X29mZnNldChwZS0+c2VjdG9yYnVmZmVyLCAwKTsKKwkJcGUtPmV4dF9wb2ludGVyID0gcGUtPnBhcnRfdGFibGUgKyAxOworCQlwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID0gMDsKKwkJcGUtPmNoYW5nZWQgPSAxOworCQlnX3BhcnRpdGlvbnMrKzsKKwl9CisJYWRkX3BhcnRpdGlvbihnX3BhcnRpdGlvbnMgLSAxLCBMSU5VWF9OQVRJVkUpOworfQorCitzdGF0aWMgdm9pZAorbmV3X3BhcnRpdGlvbih2b2lkKQoreworCWludCBpLCBmcmVlX3ByaW1hcnkgPSAwOworCisJaWYgKHdhcm5fZ2VvbWV0cnkoKSkKKwkJcmV0dXJuOworCisJaWYgKExBQkVMX0lTX1NVTikgeworCQlhZGRfc3VuX3BhcnRpdGlvbihnZXRfcGFydGl0aW9uKDAsIGdfcGFydGl0aW9ucyksIExJTlVYX05BVElWRSk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX1NHSSkgeworCQlzZ2lfYWRkX3BhcnRpdGlvbihnZXRfcGFydGl0aW9uKDAsIGdfcGFydGl0aW9ucyksIExJTlVYX05BVElWRSk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX0FJWCkgeworCQlwcmludGYoIlNvcnJ5IC0gdGhpcyBmZGlzayBjYW5ub3QgaGFuZGxlIEFJWCBkaXNrIGxhYmVscy5cbiIKKyJJZiB5b3Ugd2FudCB0byBhZGQgRE9TLXR5cGUgcGFydGl0aW9ucywgY3JlYXRlIGEgbmV3IGVtcHR5IERPUyBwYXJ0aXRpb25cbiIKKyJ0YWJsZSBmaXJzdCAodXNlICdvJykuIFRoaXMgd2lsbCBkZXN0cm95IHRoZSBwcmVzZW50IGRpc2sgY29udGVudHMuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWZyZWVfcHJpbWFyeSArPSAhcHRlc1tpXS5wYXJ0X3RhYmxlLT5zeXNfaW5kOworCisJaWYgKCFmcmVlX3ByaW1hcnkgJiYgZ19wYXJ0aXRpb25zID49IE1BWElNVU1fUEFSVFMpIHsKKwkJcHJpbnRmKCJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9ucyBoYXMgYmVlbiBjcmVhdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZnJlZV9wcmltYXJ5KSB7CisJCWlmIChleHRlbmRlZF9vZmZzZXQpCisJCQlhZGRfbG9naWNhbCgpOworCQllbHNlCisJCQlwcmludGYoIllvdSBtdXN0IGRlbGV0ZSBzb21lIHBhcnRpdGlvbiBhbmQgYWRkICIKKwkJCQkgImFuIGV4dGVuZGVkIHBhcnRpdGlvbiBmaXJzdFxuIik7CisJfSBlbHNlIHsKKwkJY2hhciBjLCBsaW5lWzgwXTsKKwkJc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLAorCQkJIkNvbW1hbmQgYWN0aW9uXG4iCisJCQkiICAgJXNcbiIKKwkJCSIgICBwICAgcHJpbWFyeSBwYXJ0aXRpb24gKDEtNClcbiIsCisJCQkoZXh0ZW5kZWRfb2Zmc2V0ID8KKwkJCSJsICAgbG9naWNhbCAoNSBvciBvdmVyKSIgOiAiZSAgIGV4dGVuZGVkIikpOworCQl3aGlsZSAoMSkgeworCQkJYyA9IHJlYWRfbm9uZW1wdHkobGluZSk7CisJCQlpZiAoKGMgfCAweDIwKSA9PSAncCcpIHsKKwkJCQlpID0gZ2V0X25vbmV4aXN0aW5nX3BhcnRpdGlvbigwLCA0KTsKKwkJCQlpZiAoaSA+PSAwKQorCQkJCQlhZGRfcGFydGl0aW9uKGksIExJTlVYX05BVElWRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGMgPT0gJ2wnICYmIGV4dGVuZGVkX29mZnNldCkgeworCQkJCWFkZF9sb2dpY2FsKCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGMgPT0gJ2UnICYmICFleHRlbmRlZF9vZmZzZXQpIHsKKwkJCQlpID0gZ2V0X25vbmV4aXN0aW5nX3BhcnRpdGlvbigwLCA0KTsKKwkJCQlpZiAoaSA+PSAwKQorCQkJCQlhZGRfcGFydGl0aW9uKGksIEVYVEVOREVEKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwcmludGYoIkludmFsaWQgcGFydGl0aW9uIG51bWJlciAiCisJCQkJCSAiZm9yIHR5cGUgJyVjJ1xuIiwgYyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCityZXJlYWRfcGFydGl0aW9uX3RhYmxlKGludCBsZWF2ZSkKK3sKKwlpbnQgaTsKKworCXByaW50ZigiQ2FsbGluZyBpb2N0bCgpIHRvIHJlLXJlYWQgcGFydGl0aW9uIHRhYmxlXG4iKTsKKwlzeW5jKCk7CisJLyogVXNlcnMgd2l0aCBzbG93IGV4dGVybmFsIFVTQiBkaXNrcyBvbiBhIDMyME1IeiBBUk0gc3lzdGVtICh5ZWFyIDIwMTEpCisJICogcmVwb3J0IHRoYXQgc2xlZXAgaXMgbmVlZGVkLCBvdGhlcndpc2UgQkxLUlJQQVJUIG1heSBmYWlsIHdpdGggLUVJTzoKKwkgKi8KKwlzbGVlcCgxKTsKKwlpID0gaW9jdGxfb3JfcGVycm9yKGRldl9mZCwgQkxLUlJQQVJULCBOVUxMLAorCQkJIldBUk5JTkc6IHJlcmVhZGluZyBwYXJ0aXRpb24gdGFibGUgIgorCQkJImZhaWxlZCwga2VybmVsIHN0aWxsIHVzZXMgb2xkIHRhYmxlIik7CisjaWYgMAorCWlmIChkb3NfY2hhbmdlZCkKKwkJcHJpbnRmKAorCQkiXG5XQVJOSU5HOiBJZiB5b3UgaGF2ZSBjcmVhdGVkIG9yIG1vZGlmaWVkIGFueSBET1MgNi54XG4iCisJCSJwYXJ0aXRpb25zLCBwbGVhc2Ugc2VlIHRoZSBmZGlzayBtYW51YWwgcGFnZSBmb3IgYWRkaXRpb25hbFxuIgorCQkiaW5mb3JtYXRpb25cbiIpOworI2VuZGlmCisKKwlpZiAobGVhdmUpIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJY2xvc2VfZGV2X2ZkKCk7CisJCWV4aXQoaSAhPSAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV90YWJsZSh2b2lkKQoreworCWludCBpOworCisJaWYgKExBQkVMX0lTX0RPUykgeworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJaWYgKHB0ZXNbaV0uY2hhbmdlZCkKKwkJCQlwdGVzWzNdLmNoYW5nZWQgPSAxOworCQlmb3IgKGkgPSAzOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJCQlpZiAocGUtPmNoYW5nZWQpIHsKKwkJCQl3cml0ZV9wYXJ0X3RhYmxlX2ZsYWcocGUtPnNlY3RvcmJ1ZmZlcik7CisJCQkJd3JpdGVfc2VjdG9yKHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQsIHBlLT5zZWN0b3JidWZmZXIpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKExBQkVMX0lTX1NHSSkgeworCQkvKiBubyB0ZXN0IG9uIGNoYW5nZT8gdGhlIHByaW50ZiBiZWxvdyBtaWdodCBiZSBtaXN0YWtlbiAqLworCQlzZ2lfd3JpdGVfdGFibGUoKTsKKwl9CisJZWxzZSBpZiAoTEFCRUxfSVNfU1VOKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmIChwdGVzW2ldLmNoYW5nZWQpIHsKKwkJCQlzdW5fd3JpdGVfdGFibGUoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXByaW50ZigiVGhlIHBhcnRpdGlvbiB0YWJsZSBoYXMgYmVlbiBhbHRlcmVkLlxuIik7CisJcmVyZWFkX3BhcnRpdGlvbl90YWJsZSgxKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorI2RlZmluZSBNQVhfUEVSX0xJTkUgICAgMTYKK3N0YXRpYyB2b2lkCitwcmludF9idWZmZXIoY2hhciAqcGJ1ZmZlcikKK3sKKwlpbnQgaSxsOworCisJZm9yIChpID0gMCwgbCA9IDA7IGkgPCBzZWN0b3Jfc2l6ZTsgaSsrLCBsKyspIHsKKwkJaWYgKGwgPT0gMCkKKwkJCXByaW50ZigiMHglMDNYOiIsIGkpOworCQlwcmludGYoIiAlMDJYIiwgKHVuc2lnbmVkIGNoYXIpIHBidWZmZXJbaV0pOworCQlpZiAobCA9PSBNQVhfUEVSX0xJTkUgLSAxKSB7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJbCA9IC0xOworCQl9CisJfQorCWlmIChsID4gMCkKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwliYl9wdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcmF3KHZvaWQpCit7CisJaW50IGk7CisKKwlwcmludGYoIkRldmljZTogJXNcbiIsIGRpc2tfZGV2aWNlKTsKKwlpZiAoTEFCRUxfSVNfU0dJIHx8IExBQkVMX0lTX1NVTikKKwkJcHJpbnRfYnVmZmVyKE1CUmJ1ZmZlcik7CisJZWxzZSB7CisJCWZvciAoaSA9IDM7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykKKwkJCXByaW50X2J1ZmZlcihwdGVzW2ldLnNlY3RvcmJ1ZmZlcik7CisJfQorfQorCitzdGF0aWMgdm9pZAorbW92ZV9iZWdpbih1bnNpZ25lZCBpKQoreworCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHBlLT5wYXJ0X3RhYmxlOworCXNlY3Rvcl90IG5ldywgZmlyc3QsIG5yX3NlY3RzOworCisJaWYgKHdhcm5fZ2VvbWV0cnkoKSkKKwkJcmV0dXJuOworCW5yX3NlY3RzID0gZ2V0X25yX3NlY3RzKHApOworCWlmICghcC0+c3lzX2luZCB8fCAhbnJfc2VjdHMgfHwgSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgaGFzIG5vIGRhdGEgYXJlYVxuIiwgaSArIDEpOworCQlyZXR1cm47CisJfQorCWZpcnN0ID0gZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSk7IC8qID09IHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgKyBnZXRfc3RhcnRfc2VjdChwKSAqLworCW5ldyA9IHJlYWRfaW50KDAgLyp3YXM6Zmlyc3QqLywgZmlyc3QsIGZpcnN0ICsgbnJfc2VjdHMgLSAxLCBmaXJzdCwgIk5ldyBiZWdpbm5pbmcgb2YgZGF0YSIpOworCWlmIChuZXcgIT0gZmlyc3QpIHsKKwkJc2VjdG9yX3QgbmV3X3JlbGF0aXZlID0gbmV3IC0gcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydDsKKwkJbnJfc2VjdHMgKz0gKGdldF9zdGFydF9zZWN0KHApIC0gbmV3X3JlbGF0aXZlKTsKKwkJc2V0X3N0YXJ0X3NlY3QocCwgbmV3X3JlbGF0aXZlKTsKKwkJc2V0X25yX3NlY3RzKHAsIG5yX3NlY3RzKTsKKwkJcmVhZF9ub25lbXB0eSgiUmVjYWxjdWxhdGUgQy9IL1MgdmFsdWVzPyAoWS9OKTogIik7CisJCWlmICgobGluZV9wdHJbMF0gfCAweDIwKSA9PSAneScpCisJCQlzZXRfaHNjX3N0YXJ0X2VuZChwLCBuZXcsIG5ldyArIG5yX3NlY3RzIC0gMSk7CisJCXBlLT5jaGFuZ2VkID0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit4c2VsZWN0KHZvaWQpCit7CisJY2hhciBjOworCisJd2hpbGUgKDEpIHsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJYyA9IDB4MjAgfCByZWFkX25vbmVtcHR5KCJFeHBlcnQgY29tbWFuZCAobSBmb3IgaGVscCk6ICIpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnYSc6CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfYWx0X2N5bCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJaWYgKExBQkVMX0lTX0RPUykKKwkJCQltb3ZlX2JlZ2luKGdldF9wYXJ0aXRpb24oMCwgZ19wYXJ0aXRpb25zKSk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQl1c2VyX2N5bGluZGVycyA9IGdfY3lsaW5kZXJzID0KKwkJCQlyZWFkX2ludCgxLCBnX2N5bGluZGVycywgMTA0ODU3NiwgMCwKKwkJCQkJIk51bWJlciBvZiBjeWxpbmRlcnMiKTsKKwkJCWlmIChMQUJFTF9JU19TVU4pCisJCQkJc3VuX3NldF9uY3lsKGdfY3lsaW5kZXJzKTsKKwkJCWlmIChMQUJFTF9JU19ET1MpCisJCQkJd2Fybl9jeWxpbmRlcnMoKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXByaW50X3JhdygpOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJaWYgKExBQkVMX0lTX1NHSSkKKwkJCQlzZ2lfc2V0X3hjeWwoKTsKKwkJCWVsc2UgaWYgKExBQkVMX0lTX1NVTikKKwkJCQlzdW5fc2V0X3hjeWwoKTsKKwkJCWVsc2UgaWYgKExBQkVMX0lTX0RPUykKKwkJCQl4X2xpc3RfdGFibGUoMSk7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlpZiAoTEFCRUxfSVNfRE9TKQorCQkJCWZpeF9wYXJ0aXRpb25fdGFibGVfb3JkZXIoKTsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwKKwkJCWNyZWF0ZV9zZ2lsYWJlbCgpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQl1c2VyX2hlYWRzID0gZ19oZWFkcyA9IHJlYWRfaW50KDEsIGdfaGVhZHMsIDI1NiwgMCwgIk51bWJlciBvZiBoZWFkcyIpOworCQkJdXBkYXRlX3VuaXRzKCk7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfaWxmYWN0KCk7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfcnNwZWVkKCk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCWxpc3RfdGFibGUoMSk7CisJCQllbHNlCisJCQkJeF9saXN0X3RhYmxlKDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWNsb3NlX2Rldl9mZCgpOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJY2FzZSAncic6CisJCQlyZXR1cm47CisJCWNhc2UgJ3MnOgorCQkJdXNlcl9zZWN0b3JzID0gZ19zZWN0b3JzID0gcmVhZF9pbnQoMSwgZ19zZWN0b3JzLCA2MywgMCwgIk51bWJlciBvZiBzZWN0b3JzIik7CisJCQlpZiAoZG9zX2NvbXBhdGlibGVfZmxhZykgeworCQkJCXNlY3Rvcl9vZmZzZXQgPSBnX3NlY3RvcnM7CisJCQkJcHJpbnRmKCJXYXJuaW5nOiBzZXR0aW5nIHNlY3RvciBvZmZzZXQgZm9yIERPUyAiCisJCQkJCSJjb21wYXRpYmxpdHlcbiIpOworCQkJfQorCQkJdXBkYXRlX3VuaXRzKCk7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl2ZXJpZnkoKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXdyaXRlX3RhYmxlKCk7ICAvKiBkb2VzIG5vdCByZXR1cm4gKi8KKwkJCWJyZWFrOworCQljYXNlICd5JzoKKwkJCWlmIChMQUJFTF9JU19TVU4pCisJCQkJc3VuX3NldF9wY3lsY291bnQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeG1lbnUoKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBBRFZBTkNFRCBtb2RlICovCisKK3N0YXRpYyBpbnQKK2lzX2lkZV9jZHJvbV9vcl90YXBlKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlGSUxFICpwcm9jZjsKKwljaGFyIGJ1ZlsxMDBdOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJaW50IGlzX2lkZSA9IDA7CisKKwkvKiBObyBkZXZpY2Ugd2FzIGdpdmVuIGV4cGxpY2l0bHksIGFuZCB3ZSBhcmUgdHJ5aW5nIHNvbWUKKwkgICBsaWtlbHkgdGhpbmdzLiAgQnV0IG9wZW5pbmcgL2Rldi9oZGMgbWF5IHByb2R1Y2UgZXJyb3JzIGxpa2UKKwkgICAiaGRjOiB0cmF5IG9wZW4gb3IgZHJpdmUgbm90IHJlYWR5IgorCSAgIGlmIGl0IGhhcHBlbnMgdG8gYmUgYSBDRC1ST00gZHJpdmUuIEl0IGV2ZW4gaGFwcGVucyB0aGF0CisJICAgdGhlIHByb2Nlc3MgaGFuZ3Mgb24gdGhlIGF0dGVtcHQgdG8gcmVhZCBhIG11c2ljIENELgorCSAgIFNvIHRyeSB0byBiZSBjYXJlZnVsLiBUaGlzIG9ubHkgd29ya3Mgc2luY2UgMi4xLjczLiAqLworCisJaWYgKHN0cm5jbXAoIi9kZXYvaGQiLCBkZXZpY2UsIDcpKQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIvcHJvYy9pZGUvJXMvbWVkaWEiLCBkZXZpY2UrNSk7CisJcHJvY2YgPSBmb3Blbl9mb3JfcmVhZChidWYpOworCWlmIChwcm9jZiAhPSBOVUxMICYmIGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHByb2NmKSkKKwkJaXNfaWRlID0gKCFzdHJuY21wKGJ1ZiwgImNkcm9tIiwgNSkgfHwKKwkJCSAgIXN0cm5jbXAoYnVmLCAidGFwZSIsIDQpKTsKKwllbHNlCisJCS8qIE5vdyB3aGVuIHRoaXMgcHJvYyBmaWxlIGRvZXMgbm90IGV4aXN0LCBza2lwIHRoZQorCQkgICBkZXZpY2Ugd2hlbiBpdCBpcyByZWFkLW9ubHkuICovCisJCWlmIChzdGF0KGRldmljZSwgJnN0YXRidWYpID09IDApCisJCQlpc19pZGUgPSAoKHN0YXRidWYuc3RfbW9kZSAmIDAyMjIpID09IDApOworCisJaWYgKHByb2NmKQorCQlmY2xvc2UocHJvY2YpOworCXJldHVybiBpc19pZGU7Cit9CisKKworc3RhdGljIHZvaWQKK29wZW5fbGlzdF9hbmRfY2xvc2UoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgdXNlcl9zcGVjaWZpZWQpCit7CisJaW50IGdiOworCisJZGlza19kZXZpY2UgPSBkZXZpY2U7CisJaWYgKHNldGptcChsaXN0aW5nYnVmKSkKKwkJcmV0dXJuOworCWlmICghdXNlcl9zcGVjaWZpZWQpCisJCWlmIChpc19pZGVfY2Ryb21fb3JfdGFwZShkZXZpY2UpKQorCQkJcmV0dXJuOworCisJLyogT3BlbiBkaXNrX2RldmljZSwgc2F2ZSBmaWxlIGRlc2NyaXB0b3IgdG8gZGV2X2ZkICovCisJZXJybm8gPSAwOworCWdiID0gZ2V0X2Jvb3QoVFJZX09OTFkpOworCWlmIChnYiA+IDApIHsgICAvKiBJL08gZXJyb3IgKi8KKwkJLyogSWdub3JlIG90aGVyIGVycm9ycywgc2luY2Ugd2UgdHJ5IElERQorCQkgICBhbmQgU0NTSSBoYXJkIGRpc2tzIHdoaWNoIG1heSBub3QgYmUKKwkJICAgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uICovCisJCWlmICh1c2VyX3NwZWNpZmllZCB8fCBlcnJubyA9PSBFQUNDRVMpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLCBkZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJaWYgKGdiIDwgMCkgeyAvKiBubyBET1Mgc2lnbmF0dXJlICovCisJCWxpc3RfZGlza19nZW9tZXRyeSgpOworCQlpZiAoTEFCRUxfSVNfQUlYKQorCQkJZ290byByZXQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfT1NGX0xBQkVMCisJCWlmIChic2RfdHJ5ZGV2KGRldmljZSkgPCAwKQorI2VuZGlmCisJCQlwcmludGYoIkRpc2sgJXMgZG9lc24ndCBjb250YWluIGEgdmFsaWQgIgorCQkJCSJwYXJ0aXRpb24gdGFibGVcbiIsIGRldmljZSk7CisJfSBlbHNlIHsKKwkJbGlzdF90YWJsZSgwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCQlpZiAoIUxBQkVMX0lTX1NVTiAmJiBnX3BhcnRpdGlvbnMgPiA0KSB7CisJCQlkZWxldGVfcGFydGl0aW9uKGV4dF9pbmRleCk7CisJCX0KKyNlbmRpZgorCX0KKyByZXQ6CisJY2xvc2VfZGV2X2ZkKCk7Cit9CisKKy8qIElzIGl0IGEgd2hvbGUgZGlzaz8gVGhlIGRpZ2l0IGNoZWNrIGlzIHN0aWxsIHVzZWZ1bAorICAgZm9yIFhlbiBkZXZpY2VzIGZvciBleGFtcGxlLiAqLworc3RhdGljIGludCBpc193aG9sZV9kaXNrKGNvbnN0IGNoYXIgKmRpc2spCit7CisJdW5zaWduZWQgbGVuOworCWludCBmZCA9IG9wZW4oZGlzaywgT19SRE9OTFkpOworCisJaWYgKGZkICE9IC0xKSB7CisJCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKKwkJaW50IGVyciA9IGlvY3RsKGZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KTsKKwkJY2xvc2UoZmQpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAoZ2VvbWV0cnkuc3RhcnQgPT0gMCk7CisJfQorCisJLyogVHJlYXQgIm5hbWVOIiBhcyBhIHBhcnRpdGlvbiBuYW1lLCBub3Qgd2hvbGUgZGlzayAqLworCS8qIG5vdGU6IG1tY2JsazAgc2hvdWxkIHdvcmsgZnJvbSB0aGUgZ2VvbWV0cnkgY2hlY2sgYWJvdmUgKi8KKwlsZW4gPSBzdHJsZW4oZGlzayk7CisJaWYgKGxlbiAhPSAwICYmIGlzZGlnaXQoZGlza1tsZW4gLSAxXSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIGZvciBmZGlzayAtbDogdHJ5IGFsbCB0aGluZ3MgaW4gL3Byb2MvcGFydGl0aW9ucworICAgdGhhdCBsb29rIGxpa2UgYSBwYXJ0aXRpb24gbmFtZSAoZG8gbm90IGVuZCBpbiBhIGRpZ2l0KSAqLworc3RhdGljIHZvaWQKK2xpc3RfZGV2c19pbl9wcm9jX3BhcnRpdGl0b25zKHZvaWQpCit7CisJRklMRSAqcHJvY3B0OworCWNoYXIgbGluZVsxMDBdLCBwdG5hbWVbMTAwXSwgZGV2bmFtZVsxMjBdOworCWludCBtYSwgbWksIHN6OworCisJcHJvY3B0ID0gZm9wZW5fb3Jfd2FybigiL3Byb2MvcGFydGl0aW9ucyIsICJyIik7CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwcm9jcHQpKSB7CisJCWlmIChzc2NhbmYobGluZSwgIiAldSAldSAldSAlW15cbiBdIiwKKwkJCQkmbWEsICZtaSwgJnN6LCBwdG5hbWUpICE9IDQpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKGRldm5hbWUsICIvZGV2LyVzIiwgcHRuYW1lKTsKKwkJaWYgKGlzX3dob2xlX2Rpc2soZGV2bmFtZSkpCisJCQlvcGVuX2xpc3RfYW5kX2Nsb3NlKGRldm5hbWUsIDApOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCWZjbG9zZShwcm9jcHQpOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIHZvaWQKK3Vua25vd25fY29tbWFuZChpbnQgYykKK3sKKwlwcmludGYoIiVjOiB1bmtub3duIGNvbW1hbmRcbiIsIGMpOworfQorI2VuZGlmCisKK2ludCBmZGlza19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmRpc2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwkvKgorCSAqICBmZGlzayAtdgorCSAqICBmZGlzayAtbCBbLWIgc2VjdG9yc2l6ZV0gWy11XSBkZXZpY2UgLi4uCisJICogIGZkaXNrIC1zIFtwYXJ0aXRpb25dIC4uLgorCSAqICBmZGlzayBbLWIgc2VjdG9yc2l6ZV0gWy11XSBkZXZpY2UKKwkgKgorCSAqIE9wdGlvbnMgLUMsIC1ILCAtUyBzZXQgdGhlIGdlb21ldHJ5LgorCSAqLworCUlOSVRfRygpOworCisJY2xvc2VfZGV2X2ZkKCk7IC8qIG5lZWRlZDogZmQgMyBtdXN0IG5vdCBzdGF5IGNsb3NlZCAqLworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiYis6Qys6SCs6UysiOyAvKiBudW1lcmljIHBhcmFtcyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJiOkM6SDpsUzp1IiBJRl9GRUFUVVJFX0ZESVNLX0JMS1NJWkUoInMiKSwKKwkJCQkmc2VjdG9yX3NpemUsICZ1c2VyX2N5bGluZGVycywgJnVzZXJfaGVhZHMsICZ1c2VyX3NlY3RvcnMpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiBPUFRfYikgeworCQkvKiBVZ2x5OiB0aGlzIHNlY3RvciBzaXplIGlzIHJlYWxseSBwZXIgZGV2aWNlLAorCQkgKiBzbyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBkaXNrcywKKwkJICogYW5kIHRoZSBzYW1lIGdvZXMgZm9yIHRoZSBDL0gvUyBvcHRpb25zLgorCQkgKi8KKwkJaWYgKHNlY3Rvcl9zaXplIDwgNTEyCisJCSB8fCBzZWN0b3Jfc2l6ZSA+IDB4MTAwMDAKKwkJIHx8IChzZWN0b3Jfc2l6ZSAmIChzZWN0b3Jfc2l6ZS0xKSkgLyogbm90IHBvd2VyIG9mIDIgKi8KKwkJKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJc2VjdG9yX29mZnNldCA9IDI7CisJCXVzZXJfc2V0X3NlY3Rvcl9zaXplID0gMTsKKwl9CisJaWYgKHVzZXJfaGVhZHMgPD0gMCB8fCB1c2VyX2hlYWRzID49IDI1NikKKwkJdXNlcl9oZWFkcyA9IDA7CisJaWYgKHVzZXJfc2VjdG9ycyA8PSAwIHx8IHVzZXJfc2VjdG9ycyA+PSA2NCkKKwkJdXNlcl9zZWN0b3JzID0gMDsKKwlpZiAob3B0ICYgT1BUX3UpCisJCWRpc3BsYXlfaW5fY3lsX3VuaXRzID0gMDsgLy8gLXUKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaWYgKG9wdCAmIE9QVF9sKSB7CisJCW5vd2FybiA9IDE7CisjZW5kaWYKKwkJaWYgKCphcmd2KSB7CisJCQlsaXN0aW5nID0gMTsKKwkJCWRvIHsKKwkJCQlvcGVuX2xpc3RfYW5kX2Nsb3NlKCphcmd2LCAxKTsKKwkJCX0gd2hpbGUgKCorK2FyZ3YpOworCQl9IGVsc2UgeworCQkJLyogd2UgZG9uJ3QgaGF2ZSBkZXZpY2UgbmFtZXMsICovCisJCQkvKiB1c2UgL3Byb2MvcGFydGl0aW9ucyBpbnN0ZWFkICovCisJCQlsaXN0X2RldnNfaW5fcHJvY19wYXJ0aXRpdG9ucygpOworCQl9CisJCXJldHVybiAwOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19CTEtTSVpFCisJaWYgKG9wdCAmIE9QVF9zKSB7CisJCWludCBqOworCisJCW5vd2FybiA9IDE7CisJCWlmICghYXJndlswXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJZm9yIChqID0gMDsgYXJndltqXTsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwkJCWZkID0geG9wZW4oYXJndltqXSwgT19SRE9OTFkpOworCQkJc2l6ZSA9IGJiX0JMS0dFVFNJWkVfc2VjdG9ycyhmZCkgLyAyOworCQkJY2xvc2UoZmQpOworCQkJaWYgKGFyZ3ZbMV0pCisJCQkJcHJpbnRmKCIlbGx1XG4iLCBzaXplKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVzOiAlbGx1XG4iLCBhcmd2W2pdLCBzaXplKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaWYgKCFhcmd2WzBdIHx8IGFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWRpc2tfZGV2aWNlID0gYXJndlswXTsKKwlnZXRfYm9vdChPUEVOX01BSU4pOworCisJaWYgKExBQkVMX0lTX09TRikgeworCQkvKiBPU0YgbGFiZWwsIGFuZCBubyBET1MgbGFiZWwgKi8KKwkJcHJpbnRmKCJEZXRlY3RlZCBhbiBPU0YvMSBkaXNrbGFiZWwgb24gJXMsIGVudGVyaW5nICIKKwkJCSJkaXNrbGFiZWwgbW9kZVxuIiwgZGlza19kZXZpY2UpOworCQlic2Rfc2VsZWN0KCk7CisJCS8qV2h5IGRvIHdlIGRvIHRoaXM/ICBJdCBzZWVtcyB0byBiZSBjb3VudGVyLWludHVpdGl2ZSovCisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0RPUzsKKwkJLyogSWYgd2UgcmV0dXJuIHdlIG1heSB3YW50IHRvIG1ha2UgYW4gZW1wdHkgRE9TIGxhYmVsPyAqLworCX0KKworCXdoaWxlICgxKSB7CisJCWludCBjOworCQliYl9wdXRjaGFyKCdcbicpOworCQljID0gMHgyMCB8IHJlYWRfbm9uZW1wdHkoIkNvbW1hbmQgKG0gZm9yIGhlbHApOiAiKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2EnOgorCQkJaWYgKExBQkVMX0lTX0RPUykKKwkJCQl0b2dnbGVfYWN0aXZlKGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSk7CisJCQllbHNlIGlmIChMQUJFTF9JU19TVU4pCisJCQkJdG9nZ2xlX3N1bmZsYWdzKGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSwKKwkJCQkJCTB4MDEpOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfU0dJKQorCQkJCXNnaV9zZXRfYm9vdHBhcnRpdGlvbigKKwkJCQkJZ2V0X3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpKTsKKwkJCWVsc2UKKwkJCQl1bmtub3duX2NvbW1hbmQoYyk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlpZiAoTEFCRUxfSVNfU0dJKSB7CisJCQkJcHJpbnRmKCJcblRoZSBjdXJyZW50IGJvb3QgZmlsZSBpczogJXNcbiIsCisJCQkJCXNnaV9nZXRfYm9vdGZpbGUoKSk7CisJCQkJaWYgKHJlYWRfbWF5YmVfZW1wdHkoIlBsZWFzZSBlbnRlciB0aGUgbmFtZSBvZiB0aGUgIgorCQkJCQkJICAgIm5ldyBib290IGZpbGU6ICIpID09ICdcbicpCisJCQkJCXByaW50ZigiQm9vdCBmaWxlIHVuY2hhbmdlZFxuIik7CisJCQkJZWxzZQorCQkJCQlzZ2lfc2V0X2Jvb3RmaWxlKGxpbmVfcHRyKTsKKwkJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKwkJCWVsc2UKKwkJCQlic2Rfc2VsZWN0KCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWlmIChMQUJFTF9JU19ET1MpCisJCQkJdG9nZ2xlX2Rvc19jb21wYXRpYmlsaXR5X2ZsYWcoKTsKKwkJCWVsc2UgaWYgKExBQkVMX0lTX1NVTikKKwkJCQl0b2dnbGVfc3VuZmxhZ3MoZ2V0X3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpLAorCQkJCQkJMHgxMCk7CisJCQllbHNlIGlmIChMQUJFTF9JU19TR0kpCisJCQkJc2dpX3NldF9zd2FwcGFydGl0aW9uKAorCQkJCQkJZ2V0X3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpKTsKKwkJCWVsc2UKKwkJCQl1bmtub3duX2NvbW1hbmQoYyk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQl7CisJCQkJaW50IGo7CisJCQkvKiBJZiBzZ2lfbGFiZWwgdGhlbiBkb24ndCB1c2UgZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbiwKKwkJCSAgIGxldCB0aGUgdXNlciBzZWxlY3QgYSBwYXJ0aXRpb24sIHNpbmNlCisJCQkgICBnZXRfZXhpc3RpbmdfcGFydGl0aW9uKCkgb25seSB3b3JrcyBmb3IgTGludXgtbGlrZQorCQkJICAgcGFydGl0aW9uIHRhYmxlcyAqLworCQkJCWlmICghTEFCRUxfSVNfU0dJKSB7CisJCQkJCWogPSBnZXRfZXhpc3RpbmdfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaiA9IGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKTsKKwkJCQl9CisJCQkJaWYgKGogPj0gMCkKKwkJCQkJZGVsZXRlX3BhcnRpdGlvbihqKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWlmIChMQUJFTF9JU19TR0kpCisJCQkJY3JlYXRlX3NnaWluZm8oKTsKKwkJCWVsc2UKKwkJCQl1bmtub3duX2NvbW1hbmQoYyk7CisJCWNhc2UgJ2wnOgorCQkJbGlzdF90eXBlcyhnZXRfc3lzX3R5cGVzKCkpOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJbWVudSgpOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJbmV3X3BhcnRpdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJY3JlYXRlX2Rvc2xhYmVsKCk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlsaXN0X3RhYmxlKDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWNsb3NlX2Rldl9mZCgpOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCXJldHVybiAwOworCQljYXNlICdzJzoKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVU5fTEFCRUwKKwkJCWNyZWF0ZV9zdW5sYWJlbCgpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQljaGFuZ2Vfc3lzaWQoKTsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWNoYW5nZV91bml0cygpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyaWZ5KCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3cml0ZV90YWJsZSgpOyAgLyogZG9lcyBub3QgcmV0dXJuICovCisJCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorCQljYXNlICd4JzoKKwkJCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJCQlwcmludGYoIlxuXHRTb3JyeSwgbm8gZXhwZXJ0cyBtZW51IGZvciBTR0kgIgorCQkJCQkicGFydGl0aW9uIHRhYmxlcyBhdmFpbGFibGVcblxuIik7CisJCQl9IGVsc2UKKwkJCQl4c2VsZWN0KCk7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJdW5rbm93bl9jb21tYW5kKGMpOworCQkJbWVudSgpOworCQl9CisJfQorCXJldHVybiAwOworI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZmRpc2tfYWl4LmMgYi91dGlsLWxpbnV4L2ZkaXNrX2FpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWRmNTAKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrX2FpeC5jCkBAIC0wLDAgKzEsNzQgQEAKKyNpZiBFTkFCTEVfRkVBVFVSRV9BSVhfTEFCRUwKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJlYXMgTmV1cGVyLCBTZXAgMTk5OC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgICBtYWdpYzsgICAgICAgIC8qIGV4cGVjdCBBSVhfTEFCRUxfTUFHSUMgKi8KKwl1bnNpZ25lZCBpbnQgICBmaWxsYnl0ZXMxWzEyNF07CisJdW5zaWduZWQgaW50ICAgcGh5c2ljYWxfdm9sdW1lX2lkOworCXVuc2lnbmVkIGludCAgIGZpbGxieXRlczJbMTI0XTsKK30gYWl4X3BhcnRpdGlvbjsKKworI2RlZmluZSBBSVhfTEFCRUxfTUFHSUMgICAgICAgICAweGM5YzJkNGMxCisjZGVmaW5lIEFJWF9MQUJFTF9NQUdJQ19TV0FQUEVEIDB4YzFkNGMyYzkKKyNkZWZpbmUgQUlYX0lORk9fTUFHSUMgICAgICAgICAgMHgwMDA3Mjk1OQorI2RlZmluZSBBSVhfSU5GT19NQUdJQ19TV0FQUEVEICAweDU5MjkwNzAwCisKKyNkZWZpbmUgYWl4bGFiZWwgKChhaXhfcGFydGl0aW9uICopTUJSYnVmZmVyKQorCisKKy8qCisgIENoYW5nZXM6CisgICogMTk5OS0wMy0yMCBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAgKiAgICAgSW50ZXJuYXRpb25hbGl6YXRpb24KKyAgKgorICAqIDIwMDMtMDMtMjAgUGhpbGxpcCBLZXNsaW5nIDxwa2VzbGluZ0BzZ2kuY29tPgorICAqICAgICAgU29tZSBmaXhlcworKi8KKworc3RhdGljIHNtYWxsaW50IGFpeF9vdGhlcl9lbmRpYW47IC8qIGJvb2wgKi8KK3N0YXRpYyBzbWFsbGludCBhaXhfdm9sdW1lcyA9IDE7IC8qIG1heCAxNSAqLworCisvKgorICogb25seSBkZWFsaW5nIHdpdGggZnJlZSBibG9ja3MgaGVyZQorICovCisKK3N0YXRpYyB2b2lkCithaXhfaW5mbyh2b2lkKQoreworCXB1dHMoIlxuIgorIlRoZXJlIGlzIGEgdmFsaWQgQUlYIGxhYmVsIG9uIHRoaXMgZGlzay5cbiIKKyJVbmZvcnR1bmF0ZWx5IExpbnV4IGNhbm5vdCBoYW5kbGUgdGhlc2UgZGlza3MgYXQgdGhlIG1vbWVudC5cbiIKKyJOZXZlcnRoZWxlc3Mgc29tZSBhZHZpY2U6XG4iCisiMS4gZmRpc2sgd2lsbCBkZXN0cm95IGl0cyBjb250ZW50cyBvbiB3cml0ZS5cbiIKKyIyLiBCZSBzdXJlIHRoYXQgdGhpcyBkaXNrIGlzIE5PVCBhIHN0aWxsIHZpdGFsIHBhcnQgb2YgYSB2b2x1bWUgZ3JvdXAuXG4iCisiICAgKE90aGVyd2lzZSB5b3UgbWF5IGVyYXNlIHRoZSBvdGhlciBkaXNrcyBhcyB3ZWxsLCBpZiB1bm1pcnJvcmVkLilcbiIKKyIzLiBCZWZvcmUgZGVsZXRpbmcgdGhpcyBwaHlzaWNhbCB2b2x1bWUgYmUgc3VyZSB0byByZW1vdmUgdGhlIGRpc2tcbiIKKyIgICBsb2dpY2FsbHkgZnJvbSB5b3VyIEFJWCBtYWNoaW5lLiAoT3RoZXJ3aXNlIHlvdSBiZWNvbWUgYW4gQUlYcGVydCkuXG4iCisJKTsKK30KKworc3RhdGljIGludAorY2hlY2tfYWl4X2xhYmVsKHZvaWQpCit7CisJaWYgKGFpeGxhYmVsLT5tYWdpYyAhPSBBSVhfTEFCRUxfTUFHSUMKKwkgJiYgYWl4bGFiZWwtPm1hZ2ljICE9IEFJWF9MQUJFTF9NQUdJQ19TV0FQUEVECisJKSB7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IDA7CisJCWFpeF9vdGhlcl9lbmRpYW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisJYWl4X290aGVyX2VuZGlhbiA9IChhaXhsYWJlbC0+bWFnaWMgPT0gQUlYX0xBQkVMX01BR0lDX1NXQVBQRUQpOworCXVwZGF0ZV91bml0cygpOworCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0FJWDsKKwlnX3BhcnRpdGlvbnMgPSAxMDE2OworCWFpeF92b2x1bWVzID0gMTU7CisJYWl4X2luZm8oKTsKKwkvKmFpeF9ub2xhYmVsKCk7Ki8gICAgICAgICAgICAgIC8qICUlICovCisJLyphaXhfbGFiZWwgPSAxOyovICAgICAgICAgICAgICAvKiAlJSAqLworCXJldHVybiAxOworfQorI2VuZGlmICAvKiBBSVhfTEFCRUwgKi8KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZmRpc2tfZ3B0LmMgYi91dGlsLWxpbnV4L2ZkaXNrX2dwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2Q5YzcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrX2dwdC5jCkBAIC0wLDAgKzEsMTk1IEBACisjaWYgRU5BQkxFX0ZFQVRVUkVfR1BUX0xBQkVMCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEtldmluIENlcm5la2VlIDxjZXJuZWtlZUBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjZGVmaW5lIEdQVF9NQUdJQyAweDU0NTI0MTUwMjA0OTQ2NDVVTEwKK2VudW0geworCUxFR0FDWV9HUFRfVFlQRSA9IDB4ZWUsCisJR1BUX01BWF9QQVJUUyAgID0gMjU2LAorCUdQVF9NQVhfUEFSVF9FTlRSWV9MRU4gPSA0MDk2LAorCUdVSURfTEVOICAgICAgICA9IDE2LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ2NF90IG1hZ2ljOworCXVpbnQzMl90IHJldmlzaW9uOworCXVpbnQzMl90IGhkcl9zaXplOworCXVpbnQzMl90IGhkcl9jcmMzMjsKKwl1aW50MzJfdCByZXNlcnZlZDsKKwl1aW50NjRfdCBjdXJyZW50X2xiYTsKKwl1aW50NjRfdCBiYWNrdXBfbGJhOworCXVpbnQ2NF90IGZpcnN0X3VzYWJsZV9sYmE7CisJdWludDY0X3QgbGFzdF91c2FibGVfbGJhOworCXVpbnQ4X3QgIGRpc2tfZ3VpZFtHVUlEX0xFTl07CisJdWludDY0X3QgZmlyc3RfcGFydF9sYmE7CisJdWludDMyX3Qgbl9wYXJ0czsKKwl1aW50MzJfdCBwYXJ0X2VudHJ5X2xlbjsKKwl1aW50MzJfdCBwYXJ0X2FycmF5X2NyYzMyOworfSBncHRfaGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCAgdHlwZV9ndWlkW0dVSURfTEVOXTsKKwl1aW50OF90ICBwYXJ0X2d1aWRbR1VJRF9MRU5dOworCXVpbnQ2NF90IGxiYV9zdGFydDsKKwl1aW50NjRfdCBsYmFfZW5kOworCXVpbnQ2NF90IGZsYWdzOworCXVpbnQxNl90IG5hbWVbMzZdOworfSBncHRfcGFydGl0aW9uOworCitzdGF0aWMgZ3B0X2hlYWRlciAqZ3B0X2hkcjsKKworc3RhdGljIGNoYXIgKnBhcnRfYXJyYXk7CitzdGF0aWMgdW5zaWduZWQgaW50IG5fcGFydHM7CitzdGF0aWMgdW5zaWduZWQgaW50IHBhcnRfYXJyYXlfbGVuOworc3RhdGljIHVuc2lnbmVkIGludCBwYXJ0X2VudHJ5X2xlbjsKKworc3RhdGljIGlubGluZSBncHRfcGFydGl0aW9uICoKK2dwdF9wYXJ0KGludCBpKQoreworCWlmIChpID49IG5fcGFydHMpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAoZ3B0X3BhcnRpdGlvbiAqKSZwYXJ0X2FycmF5W2kgKiBwYXJ0X2VudHJ5X2xlbl07Cit9CisKK3N0YXRpYyB1aW50MzJfdAorZ3B0X2NyYzMyKHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlyZXR1cm4gfmNyYzMyX2Jsb2NrX2VuZGlhbjAoMHhmZmZmZmZmZiwgYnVmLCBsZW4sIGdsb2JhbF9jcmMzMl90YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitncHRfcHJpbnRfZ3VpZCh1aW50OF90ICpidWYpCit7CisJcHJpbnRmKAorCQkiJTAyeCUwMnglMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQlidWZbM10sIGJ1ZlsyXSwgYnVmWzFdLCBidWZbMF0sCisJCWJ1Zls1XSwgYnVmWzRdLAorCQlidWZbN10sIGJ1Zls2XSwKKwkJYnVmWzhdLCBidWZbOV0sCisJCWJ1ZlsxMF0sIGJ1ZlsxMV0sIGJ1ZlsxMl0sIGJ1ZlsxM10sIGJ1ZlsxNF0sIGJ1ZlsxNV0pOworfQorCisvKiBUT0RPOiByZWFsIHVuaWNvZGUgc3VwcG9ydCAqLworc3RhdGljIHZvaWQKK2dwdF9wcmludF93aWRlKHVpbnQxNl90ICpzLCBpbnQgbWF4X2xlbikKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoaSA8IG1heF9sZW4pIHsKKwkJaWYgKCpzID09IDApCisJCQlyZXR1cm47CisJCWZwdXRjKCpzLCBzdGRvdXQpOworCQlzKys7CisJfQorfQorCitzdGF0aWMgdm9pZAorZ3B0X2xpc3RfdGFibGUoaW50IHh0cmEgVU5VU0VEX1BBUkFNKQoreworCWludCBpOworCWNoYXIgbnVtc3RyNls2XTsKKworCW51bXN0cjZbNV0gPSAnXDAnOworCisJc21hcnRfdWxsdG9hNSh0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycywgbnVtc3RyNiwgIiBLTUdUUEVaWSIpOworCXByaW50ZigiRGlzayAlczogJWxsdSBzZWN0b3JzLCAlc1xuIiwgZGlza19kZXZpY2UsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpdG90YWxfbnVtYmVyX29mX3NlY3RvcnMsCisJCW51bXN0cjYpOworCXByaW50ZigiTG9naWNhbCBzZWN0b3Igc2l6ZTogJXVcbiIsIHNlY3Rvcl9zaXplKTsKKwlwcmludGYoIkRpc2sgaWRlbnRpZmllciAoR1VJRCk6ICIpOworCWdwdF9wcmludF9ndWlkKGdwdF9oZHItPmRpc2tfZ3VpZCk7CisJcHJpbnRmKCJcblBhcnRpdGlvbiB0YWJsZSBob2xkcyB1cCB0byAldSBlbnRyaWVzXG4iLAorCQkoaW50KVNXQVBfTEUzMihncHRfaGRyLT5uX3BhcnRzKSk7CisJcHJpbnRmKCJGaXJzdCB1c2FibGUgc2VjdG9yIGlzICVsbHUsIGxhc3QgdXNhYmxlIHNlY3RvciBpcyAlbGx1XG5cbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpU1dBUF9MRTY0KGdwdF9oZHItPmZpcnN0X3VzYWJsZV9sYmEpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKVNXQVBfTEU2NChncHRfaGRyLT5sYXN0X3VzYWJsZV9sYmEpKTsKKworCXByaW50ZigiTnVtYmVyICBTdGFydCAoc2VjdG9yKSAgICBFbmQgKHNlY3RvcikgIFNpemUgICAgICAgQ29kZSAgTmFtZVxuIik7CisJZm9yIChpID0gMDsgaSA8IG5fcGFydHM7IGkrKykgeworCQlncHRfcGFydGl0aW9uICpwID0gZ3B0X3BhcnQoaSk7CisJCWlmIChwLT5sYmFfc3RhcnQpIHsKKwkJCXNtYXJ0X3VsbHRvYTUoMSArIFNXQVBfTEU2NChwLT5sYmFfZW5kKSAtIFNXQVBfTEU2NChwLT5sYmFfc3RhcnQpLAorCQkJCW51bXN0cjYsICIgS01HVFBFWlkiKTsKKwkJCXByaW50ZigiJTR1ICUxNWxsdSAlMTVsbHUgJTExcyAgICUwNHggICIsCisJCQkJaSArIDEsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylTV0FQX0xFNjQocC0+bGJhX3N0YXJ0KSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKVNXQVBfTEU2NChwLT5sYmFfZW5kKSwKKwkJCQludW1zdHI2LAorCQkJCTB4MDcwMCAvKiBGSVhNRSAqLyk7CisJCQlncHRfcHJpbnRfd2lkZShwLT5uYW1lLCAxOCk7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX2dwdF9sYWJlbCh2b2lkKQoreworCXN0cnVjdCBwYXJ0aXRpb24gKmZpcnN0ID0gcHRfb2Zmc2V0KE1CUmJ1ZmZlciwgMCk7CisJc3RydWN0IHB0ZSBwZTsKKwl1aW50MzJfdCBjcmM7CisKKwkvKiBMQkEgMCBjb250YWlucyB0aGUgbGVnYWN5IE1CUiAqLworCisJaWYgKCF2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKQorCSB8fCBmaXJzdC0+c3lzX2luZCAhPSBMRUdBQ1lfR1BUX1RZUEUKKwkpIHsKKwkJY3VycmVudF9sYWJlbF90eXBlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTEJBIDEgY29udGFpbnMgdGhlIEdQVCBoZWFkZXIgKi8KKworCXJlYWRfcHRlKCZwZSwgMSk7CisJZ3B0X2hkciA9ICh2b2lkICopcGUuc2VjdG9yYnVmZmVyOworCisJaWYgKGdwdF9oZHItPm1hZ2ljICE9IFNXQVBfTEU2NChHUFRfTUFHSUMpKSB7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICghZ2xvYmFsX2NyYzMyX3RhYmxlKSB7CisJCWdsb2JhbF9jcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKwl9CisKKwljcmMgPSBTV0FQX0xFMzIoZ3B0X2hkci0+aGRyX2NyYzMyKTsKKwlncHRfaGRyLT5oZHJfY3JjMzIgPSAwOworCWlmIChncHRfY3JjMzIoZ3B0X2hkciwgU1dBUF9MRTMyKGdwdF9oZHItPmhkcl9zaXplKSkgIT0gY3JjKSB7CisJCS8qIEZJWE1FOiByZWFkIHRoZSBiYWNrdXAgdGFibGUgKi8KKwkJcHV0cygiXG53YXJuaW5nOiBHUFQgaGVhZGVyIENSQyBpcyBpbnZhbGlkXG4iKTsKKwl9CisKKwluX3BhcnRzID0gU1dBUF9MRTMyKGdwdF9oZHItPm5fcGFydHMpOworCXBhcnRfZW50cnlfbGVuID0gU1dBUF9MRTMyKGdwdF9oZHItPnBhcnRfZW50cnlfbGVuKTsKKwlpZiAobl9wYXJ0cyA+IEdQVF9NQVhfUEFSVFMKKwkgfHwgcGFydF9lbnRyeV9sZW4gPiBHUFRfTUFYX1BBUlRfRU5UUllfTEVOCisJIHx8IFNXQVBfTEUzMihncHRfaGRyLT5oZHJfc2l6ZSkgPiBzZWN0b3Jfc2l6ZQorCSkgeworCQlwdXRzKCJcbndhcm5pbmc6IHVuYWJsZSB0byBwYXJzZSBHUFQgZGlza2xhYmVsXG4iKTsKKwkJY3VycmVudF9sYWJlbF90eXBlID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcGFydF9hcnJheV9sZW4gPSBuX3BhcnRzICogcGFydF9lbnRyeV9sZW47CisJcGFydF9hcnJheSA9IHhtYWxsb2MocGFydF9hcnJheV9sZW4pOworCXNlZWtfc2VjdG9yKFNXQVBfTEU2NChncHRfaGRyLT5maXJzdF9wYXJ0X2xiYSkpOworCWlmIChmdWxsX3JlYWQoZGV2X2ZkLCBwYXJ0X2FycmF5LCBwYXJ0X2FycmF5X2xlbikgIT0gcGFydF9hcnJheV9sZW4pIHsKKwkJZmRpc2tfZmF0YWwodW5hYmxlX3RvX3JlYWQpOworCX0KKworCWlmIChncHRfY3JjMzIocGFydF9hcnJheSwgcGFydF9hcnJheV9sZW4pICE9IGdwdF9oZHItPnBhcnRfYXJyYXlfY3JjMzIpIHsKKwkJLyogRklYTUU6IHJlYWQgdGhlIGJhY2t1cCB0YWJsZSAqLworCQlwdXRzKCJcbndhcm5pbmc6IEdQVCBhcnJheSBDUkMgaXMgaW52YWxpZFxuIik7CisJfQorCisJcHV0cygiRm91bmQgdmFsaWQgR1BUIHdpdGggcHJvdGVjdGl2ZSBNQlI7IHVzaW5nIEdQVFxuIik7CisKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9HUFQ7CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBHUFRfTEFCRUwgKi8KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZmRpc2tfb3NmLmMgYi91dGlsLWxpbnV4L2ZkaXNrX29zZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTZiZDcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrX29zZi5jCkBAIC0wLDAgKzEsMTA0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NywgMTk4OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorCisjaWZuZGVmIEJTRF9ESVNLTUFHSUMKKyNkZWZpbmUgQlNEX0RJU0tNQUdJQyAgICAgKCh1aW50MzJfdCkgMHg4MjU2NDU1NykKKyNlbmRpZgorCisjaWZuZGVmIEJTRF9NQVhQQVJUSVRJT05TCisjZGVmaW5lIEJTRF9NQVhQQVJUSVRJT05TIDE2CisjZW5kaWYKKworI2RlZmluZSBCU0RfTElOVVhfQk9PVERJUiAiL3Vzci91Y2IvbWRlYyIKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSBcCisgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgXAorIHx8IGRlZmluZWQoX19pYTY0X18pIFwKKyB8fCBkZWZpbmVkKF9faHBwYV9fKQorIyBkZWZpbmUgQlNEX0xBQkVMU0VDVE9SICAgMAorIyBkZWZpbmUgQlNEX0xBQkVMT0ZGU0VUICAgNjQKKyNlbHNlCisjIGRlZmluZSBCU0RfTEFCRUxTRUNUT1IgICAxCisjIGRlZmluZSBCU0RfTEFCRUxPRkZTRVQgICAwCisjZW5kaWYKKworI2RlZmluZSBCU0RfQkJTSVpFICAgICAgICA4MTkyICAgICAgICAgIC8qIHNpemUgb2YgYm9vdCBhcmVhLCB3aXRoIGxhYmVsICovCisjZGVmaW5lIEJTRF9TQlNJWkUgICAgICAgIDgxOTIgICAgICAgICAgLyogbWF4IHNpemUgb2YgZnMgc3VwZXJibG9jayAqLworCitzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgeworCXVpbnQzMl90ICAgZF9tYWdpYzsgICAgICAgICAgICAgICAgLyogdGhlIG1hZ2ljIG51bWJlciAqLworCWludDE2X3QgICAgZF90eXBlOyAgICAgICAgICAgICAgICAgLyogZHJpdmUgdHlwZSAqLworCWludDE2X3QgICAgZF9zdWJ0eXBlOyAgICAgICAgICAgICAgLyogY29udHJvbGxlci9kX3R5cGUgc3BlY2lmaWMgKi8KKwljaGFyICAgICAgIGRfdHlwZW5hbWVbMTZdOyAgICAgICAgIC8qIHR5cGUgbmFtZSwgZS5nLiAiZWFnbGUiICovCisJY2hhciAgICAgICBkX3BhY2tuYW1lWzE2XTsgICAgICAgICAvKiBwYWNrIGlkZW50aWZpZXIgKi8KKwkvKiBkaXNrIGdlb21ldHJ5OiAqLworCXVpbnQzMl90ICAgZF9zZWNzaXplOyAgICAgICAgICAgICAgLyogIyBvZiBieXRlcyBwZXIgc2VjdG9yICovCisJdWludDMyX3QgICBkX25zZWN0b3JzOyAgICAgICAgICAgICAvKiAjIG9mIGRhdGEgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1aW50MzJfdCAgIGRfbnRyYWNrczsgICAgICAgICAgICAgIC8qICMgb2YgdHJhY2tzIHBlciBjeWxpbmRlciAqLworCXVpbnQzMl90ICAgZF9uY3lsaW5kZXJzOyAgICAgICAgICAgLyogIyBvZiBkYXRhIGN5bGluZGVycyBwZXIgdW5pdCAqLworCXVpbnQzMl90ICAgZF9zZWNwZXJjeWw7ICAgICAgICAgICAgLyogIyBvZiBkYXRhIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisJdWludDMyX3QgICBkX3NlY3BlcnVuaXQ7ICAgICAgICAgICAvKiAjIG9mIGRhdGEgc2VjdG9ycyBwZXIgdW5pdCAqLworCS8qCisJICogU3BhcmVzIChiYWQgc2VjdG9yIHJlcGxhY2VtZW50cykgYmVsb3cKKwkgKiBhcmUgbm90IGNvdW50ZWQgaW4gZF9uc2VjdG9ycyBvciBkX3NlY3BlcmN5bC4KKwkgKiBTcGFyZSBzZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHBoeXNpY2FsIHNlY3RvcnMKKwkgKiB3aGljaCBvY2N1cHkgc3BhY2UgYXQgdGhlIGVuZCBvZiBlYWNoIHRyYWNrIGFuZC9vciBjeWxpbmRlci4KKwkgKi8KKwl1aW50MTZfdCAgIGRfc3BhcmVzcGVydHJhY2s7ICAgICAgIC8qICMgb2Ygc3BhcmUgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1aW50MTZfdCAgIGRfc3BhcmVzcGVyY3lsOyAgICAgICAgIC8qICMgb2Ygc3BhcmUgc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKwkvKgorCSAqIEFsdGVybmF0ZSBjeWxpbmRlcnMgaW5jbHVkZSBtYWludGVuYW5jZSwgcmVwbGFjZW1lbnQsCisJICogY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbiBhcmVhcywgZXRjLgorCSAqLworCXVpbnQzMl90ICAgZF9hY3lsaW5kZXJzOyAgICAgICAgICAgLyogIyBvZiBhbHQuIGN5bGluZGVycyBwZXIgdW5pdCAqLworCisJLyogaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzOiAqLworCS8qCisJICogZF9pbnRlcmxlYXZlLCBkX3RyYWNrc2tldyBhbmQgZF9jeWxza2V3IGRlc2NyaWJlIHBlcnR1cmJhdGlvbnMKKwkgKiBpbiB0aGUgbWVkaWEgZm9ybWF0IHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgYSBzbG93IGNvbnRyb2xsZXIuCisJICogSW50ZXJsZWF2ZSBpcyBwaHlzaWNhbCBzZWN0b3IgaW50ZXJsZWF2ZSwgc2V0IHVwIGJ5IHRoZSBmb3JtYXR0ZXIKKwkgKiBvciBjb250cm9sbGVyIHdoZW4gZm9ybWF0dGluZy4gIFdoZW4gaW50ZXJsZWF2aW5nIGlzIGluIHVzZSwKKwkgKiBsb2dpY2FsbHkgYWRqYWNlbnQgc2VjdG9ycyBhcmUgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywKKwkgKiBidXQgaW5zdGVhZCBhcmUgc2VwYXJhdGVkIGJ5IHNvbWUgbnVtYmVyIG9mIHNlY3RvcnMuCisJICogSXQgaXMgc3BlY2lmaWVkIGFzIHRoZSByYXRpbyBvZiBwaHlzaWNhbCBzZWN0b3JzIHRyYXZlcnNlZAorCSAqIHBlciBsb2dpY2FsIHNlY3Rvci4gIFRodXMgYW4gaW50ZXJsZWF2ZSBvZiAxOjEgaW1wbGllcyBjb250aWd1b3VzCisJICogbGF5b3V0LCB3aGlsZSAyOjEgaW1wbGllcyB0aGF0IGxvZ2ljYWwgc2VjdG9yIDAgaXMgc2VwYXJhdGVkCisJICogYnkgb25lIHNlY3RvciBmcm9tIGxvZ2ljYWwgc2VjdG9yIDEuCisJICogZF90cmFja3NrZXcgaXMgdGhlIG9mZnNldCBvZiBzZWN0b3IgMCBvbiB0cmFjayBOCisJICogcmVsYXRpdmUgdG8gc2VjdG9yIDAgb24gdHJhY2sgTi0xIG9uIHRoZSBzYW1lIGN5bGluZGVyLgorCSAqIEZpbmFsbHksIGRfY3lsc2tldyBpcyB0aGUgb2Zmc2V0IG9mIHNlY3RvciAwIG9uIGN5bGluZGVyIE4KKwkgKiByZWxhdGl2ZSB0byBzZWN0b3IgMCBvbiBjeWxpbmRlciBOLTEuCisJICovCisJdWludDE2X3QgICBkX3JwbTsgICAgICAgICAgICAgICAgICAvKiByb3RhdGlvbmFsIHNwZWVkICovCisJdWludDE2X3QgICBkX2ludGVybGVhdmU7ICAgICAgICAgICAvKiBoYXJkd2FyZSBzZWN0b3IgaW50ZXJsZWF2ZSAqLworCXVpbnQxNl90ICAgZF90cmFja3NrZXc7ICAgICAgICAgICAgLyogc2VjdG9yIDAgc2tldywgcGVyIHRyYWNrICovCisJdWludDE2X3QgICBkX2N5bHNrZXc7ICAgICAgICAgICAgICAvKiBzZWN0b3IgMCBza2V3LCBwZXIgY3lsaW5kZXIgKi8KKwl1aW50MzJfdCAgIGRfaGVhZHN3aXRjaDsgICAgICAgICAgIC8qIGhlYWQgc3dpdGNoIHRpbWUsIHVzZWMgKi8KKwl1aW50MzJfdCAgIGRfdHJrc2VlazsgICAgICAgICAgICAgIC8qIHRyYWNrLXRvLXRyYWNrIHNlZWssIHVzZWMgKi8KKwl1aW50MzJfdCAgIGRfZmxhZ3M7ICAgICAgICAgICAgICAgIC8qIGdlbmVyaWMgZmxhZ3MgKi8KKyNkZWZpbmUgTkREQVRBIDUKKwl1aW50MzJfdCAgIGRfZHJpdmVkYXRhW05EREFUQV07ICAgIC8qIGRyaXZlLXR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTlNQQVJFIDUKKwl1aW50MzJfdCAgIGRfc3BhcmVbTlNQQVJFXTsgICAgICAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJdWludDMyX3QgICBkX21hZ2ljMjsgICAgICAgICAgICAgICAvKiB0aGUgbWFnaWMgbnVtYmVyIChhZ2FpbikgKi8KKwl1aW50MTZfdCAgIGRfY2hlY2tzdW07ICAgICAgICAgICAgIC8qIHhvciBvZiBkYXRhIGluY2wuIHBhcnRpdGlvbnMgKi8KKwkvKiBmaWxlc3lzdGVtIGFuZCBwYXJ0aXRpb24gaW5mb3JtYXRpb246ICovCisJdWludDE2X3QgICBkX25wYXJ0aXRpb25zOyAgICAgICAgICAvKiBudW1iZXIgb2YgcGFydGl0aW9ucyBpbiBmb2xsb3dpbmcgKi8KKwl1aW50MzJfdCAgIGRfYmJzaXplOyAgICAgICAgICAgICAgIC8qIHNpemUgb2YgYm9vdCBhcmVhIGF0IHNuMCwgYnl0ZXMgKi8KKwl1aW50MzJfdCAgIGRfc2JzaXplOyAgICAgICAgICAgICAgIC8qIG1heCBzaXplIG9mIGZzIHN1cGVyYmxvY2ssIGJ5dGVzICovCisJc3RydWN0IHhic2RfcGFydGl0aW9uIHsgLyogdGhlIHBhcnRpdGlvbiB0YWJsZSAqLworCQl1aW50MzJfdCAgIHBfc2l6ZTsgICAgICAgICAvKiBudW1iZXIgb2Ygc2VjdG9ycyBpbiBwYXJ0aXRpb24gKi8KKwkJdWludDMyX3QgICBwX29mZnNldDsgICAgICAgLyogc3RhcnRpbmcgc2VjdG9yICovCisJCXVpbnQzMl90ICAgcF9mc2l6ZTsgICAgICAgIC8qIGZpbGVzeXN0ZW0gYmFzaWMgZnJhZ21lbnQgc2l6ZSAqLworCQl1aW50OF90ICAgIHBfZnN0eXBlOyAgICAgICAvKiBmaWxlc3lzdGVtIHR5cGUsIHNlZSBiZWxvdyAqLworCQl1aW50OF90ICAgIHBfZnJhZzsgICAgICAgICAvKiBmaWxlc3lzdGVtIGZyYWdtZW50cyBwZXIgYmxvY2sgKi8KKwkJdWludDE2X3QgICBwX2NwZzsgICAgICAgICAgLyogZmlsZXN5c3RlbSBjeWxpbmRlcnMgcGVyIGdyb3VwICovCisJfSBkX3BhcnRpdGlvbnNbQlNEX01BWFBBUlRJVElPTlNdOyAvKiBhY3R1YWxseSBtYXkgYmUgbW9yZSAqLworfTsKKworLyogZF90eXBlIHZhbHVlczogKi8KKyNkZWZpbmUgQlNEX0RUWVBFX1NNRCAgICAgICAgICAgMSAgICAgICAgICAgICAgIC8qIFNNRCwgWFNNRDsgVkFYIGhwL3VwICovCisjZGVmaW5lIEJTRF9EVFlQRV9NU0NQICAgICAgICAgIDIgICAgICAgICAgICAgICAvKiBNU0NQICovCisjZGVmaW5lIEJTRF9EVFlQRV9ERUMgICAgICAgICAgIDMgICAgICAgICAgICAgICAvKiBvdGhlciBERUMgKHJrLCBybCkgKi8KKyNkZWZpbmUgQlNEX0RUWVBFX1NDU0kgICAgICAgICAgNCAgICAgICAgICAgICAgIC8qIFNDU0kgKi8KKyNkZWZpbmUgQlNEX0RUWVBFX0VTREkgICAgICAgICAgNSAgICAgICAgICAgICAgIC8qIEVTREkgaW50ZXJmYWNlICovCisjZGVmaW5lIEJTRF9EVFlQRV9TVDUwNiAgICAgICAgIDYgICAgICAgICAgICAgICAvKiBTVDUwNiBldGMuICovCisjZGVmaW5lIEJTRF9EVFlQRV9IUElCICAgICAgICAgIDcgICAgICAgICAgICAgICAvKiBDUy84MCBvbiBIUC1JQiAqLworI2RlZmluZSBCU0RfRFRZUEVfSFBGTCAgICAgICAgICA4ICAgICAgICAgICAgICAgLyogSFAgRmliZXItbGluayAqLworI2RlZmluZSBCU0RfRFRZUEVfRkxPUFBZICAgICAgICAxMCAgICAgICAgICAgICAgLyogZmxvcHB5ICovCisKKy8qIGRfc3VidHlwZSB2YWx1ZXM6ICovCisjZGVmaW5lIEJTRF9EU1RZUEVfSU5ET1NQQVJUICAgIDB4OCAgICAgICAgICAgICAvKiBpcyBpbnNpZGUgZG9zIHBhcnRpdGlvbiAqLworI2RlZmluZSBCU0RfRFNUWVBFX0RPU1BBUlQocykgICAoKHMpICYgMykgICAgICAgLyogZG9zIHBhcnRpdGlvbiBudW1iZXIgKi8KKyNkZWZpbmUgQlNEX0RTVFlQRV9HRU9NRVRSWSAgICAgMHgxMCAgICAgICAgICAgIC8qIGRyaXZlIHBhcmFtcyBpbiBsYWJlbCAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeGJzZF9ka3R5cGVuYW1lc1tdID0geworCSJ1bmtub3duIiwKKwkiU01EIiwKKwkiTVNDUCIsCisJIm9sZCBERUMiLAorCSJTQ1NJIiwKKwkiRVNESSIsCisJIlNUNTA2IiwKKwkiSFAtSUIiLAorCSJIUC1GTCIsCisJInR5cGUgOSIsCisJImZsb3BweSIsCisJMAorfTsKKworCisvKgorICogRmlsZXN5c3RlbSB0eXBlIGFuZCB2ZXJzaW9uLgorICogVXNlZCB0byBpbnRlcnByZXQgb3RoZXIgZmlsZXN5c3RlbS1zcGVjaWZpYworICogcGVyLXBhcnRpdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBCU0RfRlNfVU5VU0VEICAgMCAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLworI2RlZmluZSBCU0RfRlNfU1dBUCAgICAgMSAgICAgICAgICAgICAgIC8qIHN3YXAgKi8KKyNkZWZpbmUgQlNEX0ZTX1Y2ICAgICAgIDIgICAgICAgICAgICAgICAvKiBTaXh0aCBFZGl0aW9uICovCisjZGVmaW5lIEJTRF9GU19WNyAgICAgICAzICAgICAgICAgICAgICAgLyogU2V2ZW50aCBFZGl0aW9uICovCisjZGVmaW5lIEJTRF9GU19TWVNWICAgICA0ICAgICAgICAgICAgICAgLyogU3lzdGVtIFYgKi8KKyNkZWZpbmUgQlNEX0ZTX1Y3MUsgICAgIDUgICAgICAgICAgICAgICAvKiBWNyB3aXRoIDFLIGJsb2NrcyAoNC4xLCAyLjkpICovCisjZGVmaW5lIEJTRF9GU19WOCAgICAgICA2ICAgICAgICAgICAgICAgLyogRWlnaHRoIEVkaXRpb24sIDRLIGJsb2NrcyAqLworI2RlZmluZSBCU0RfRlNfQlNERkZTICAgNyAgICAgICAgICAgICAgIC8qIDQuMkJTRCBmYXN0IGZpbGUgc3lzdGVtICovCisjZGVmaW5lIEJTRF9GU19CU0RMRlMgICA5ICAgICAgICAgICAgICAgLyogNC40QlNEIGxvZy1zdHJ1Y3R1cmVkIGZpbGUgc3lzdGVtICovCisjZGVmaW5lIEJTRF9GU19PVEhFUiAgICAxMCAgICAgICAgICAgICAgLyogaW4gdXNlLCBidXQgdW5rbm93bi91bnN1cHBvcnRlZCAqLworI2RlZmluZSBCU0RfRlNfSFBGUyAgICAgMTEgICAgICAgICAgICAgIC8qIE9TLzIgaGlnaC1wZXJmb3JtYW5jZSBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBCU0RfRlNfSVNPOTY2MCAgMTIgICAgICAgICAgICAgIC8qIElTTy05NjYwIGZpbGVzeXN0ZW0gKGNkcm9tKSAqLworI2RlZmluZSBCU0RfRlNfSVNPRlMgICAgQlNEX0ZTX0lTTzk2NjAKKyNkZWZpbmUgQlNEX0ZTX0JPT1QgICAgIDEzICAgICAgICAgICAgICAvKiBwYXJ0aXRpb24gY29udGFpbnMgYm9vdHN0cmFwICovCisjZGVmaW5lIEJTRF9GU19BRE9TICAgICAxNCAgICAgICAgICAgICAgLyogQW1pZ2FET1MgZmFzdCBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBCU0RfRlNfSEZTICAgICAgMTUgICAgICAgICAgICAgIC8qIE1hY2ludG9zaCBIRlMgKi8KKyNkZWZpbmUgQlNEX0ZTX0FEVkZTICAgIDE2ICAgICAgICAgICAgICAvKiBEaWdpdGFsIFVuaXggQWR2RlMgKi8KKworLyogdGhpcyBpcyBhbm5veWluZywgYnV0IGl0J3MgYWxzbyB0aGUgd2F5IGl0IGlzIDotKCAqLworI2lmZGVmIF9fYWxwaGFfXworI2RlZmluZSBCU0RfRlNfRVhUMiAgICAgOCAgICAgICAgICAgICAgIC8qIGV4dDIgZmlsZSBzeXN0ZW0gKi8KKyNlbHNlCisjZGVmaW5lIEJTRF9GU19NU0RPUyAgICA4ICAgICAgICAgICAgICAgLyogTVMtRE9TIGZpbGUgc3lzdGVtICovCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHhic2RfZnN0eXBlc1tdID0geworCSJceDAwIiAidW51c2VkIiwgICAgICAgICAgICAvKiBCU0RfRlNfVU5VU0VEICAqLworCSJceDAxIiAic3dhcCIsICAgICAgICAgICAgICAvKiBCU0RfRlNfU1dBUCAgICAqLworCSJceDAyIiAiVmVyc2lvbiA2IiwgICAgICAgICAvKiBCU0RfRlNfVjYgICAgICAqLworCSJceDAzIiAiVmVyc2lvbiA3IiwgICAgICAgICAvKiBCU0RfRlNfVjcgICAgICAqLworCSJceDA0IiAiU3lzdGVtIFYiLCAgICAgICAgICAvKiBCU0RfRlNfU1lTViAgICAqLworCSJceDA1IiAiNC4xQlNEIiwgICAgICAgICAgICAvKiBCU0RfRlNfVjcxSyAgICAqLworCSJceDA2IiAiRWlnaHRoIEVkaXRpb24iLCAgICAvKiBCU0RfRlNfVjggICAgICAqLworCSJceDA3IiAiNC4yQlNEIiwgICAgICAgICAgICAvKiBCU0RfRlNfQlNERkZTICAqLworI2lmZGVmIF9fYWxwaGFfXworCSJceDA4IiAiZXh0MiIsICAgICAgICAgICAgICAvKiBCU0RfRlNfRVhUMiAgICAqLworI2Vsc2UKKwkiXHgwOCIgIk1TLURPUyIsICAgICAgICAgICAgLyogQlNEX0ZTX01TRE9TICAgKi8KKyNlbmRpZgorCSJceDA5IiAiNC40TEZTIiwgICAgICAgICAgICAvKiBCU0RfRlNfQlNETEZTICAqLworCSJceDBhIiAidW5rbm93biIsICAgICAgICAgICAvKiBCU0RfRlNfT1RIRVIgICAqLworCSJceDBiIiAiSFBGUyIsICAgICAgICAgICAgICAvKiBCU0RfRlNfSFBGUyAgICAqLworCSJceDBjIiAiSVNPLTk2NjAiLCAgICAgICAgICAvKiBCU0RfRlNfSVNPOTY2MCAqLworCSJceDBkIiAiYm9vdCIsICAgICAgICAgICAgICAvKiBCU0RfRlNfQk9PVCAgICAqLworCSJceDBlIiAiQURPUyIsICAgICAgICAgICAgICAvKiBCU0RfRlNfQURPUyAgICAqLworCSJceDBmIiAiSEZTIiwgICAgICAgICAgICAgICAvKiBCU0RfRlNfSEZTICAgICAqLworCSJceDEwIiAiQWR2RlMiLCAgICAgICAgICAgICAvKiBCU0RfRlNfQURWRlMgICAqLworCU5VTEwKK307CisKKworLyoKKyAqIGZsYWdzIHNoYXJlZCBieSB2YXJpb3VzIGRyaXZlczoKKyAqLworI2RlZmluZSBCU0RfRF9SRU1PVkFCTEUgMHgwMSAgICAgICAgICAgIC8qIHJlbW92YWJsZSBtZWRpYSAqLworI2RlZmluZSBCU0RfRF9FQ0MgICAgICAgMHgwMiAgICAgICAgICAgIC8qIHN1cHBvcnRzIEVDQyAqLworI2RlZmluZSBCU0RfRF9CQURTRUNUICAgMHgwNCAgICAgICAgICAgIC8qIHN1cHBvcnRzIGJhZCBzZWN0b3IgZm9ydy4gKi8KKyNkZWZpbmUgQlNEX0RfUkFNRElTSyAgIDB4MDggICAgICAgICAgICAvKiBkaXNrIGVtdWxhdG9yICovCisjZGVmaW5lIEJTRF9EX0NIQUlOICAgICAweDEwICAgICAgICAgICAgLyogY2FuIGRvIGJhY2stYmFjayB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgQlNEX0RfRE9TUEFSVCAgIDB4MjAgICAgICAgICAgICAvKiB3aXRoaW4gTVNET1MgcGFydGl0aW9uICovCisKKy8qCisgICBDaGFuZ2VzOgorICAgMTk5OTAzMTkgLSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSBpMThuL25scworCisgICAyMDAwMDEwMSAtIERhdmlkIEh1Z2dpbnMtRGFpbmVzIDxkaHVnZ2luc0BsaW51eGNhcmUuY29tPiAtIEJldHRlcgorICAgc3VwcG9ydCBmb3IgT1NGLzEgZGlza2xhYmVscyBvbiBBbHBoYS4KKyAgIEFsc28gZml4ZWQgdW5hbGlnbmVkIGFjY2Vzc2VzIGluIGFscGhhX2Jvb3RibG9ja19jaGVja3N1bSgpCisqLworCisjZGVmaW5lIEZSRUVCU0RfUEFSVElUSU9OICAgICAgIDB4YTUKKyNkZWZpbmUgTkVUQlNEX1BBUlRJVElPTiAgICAgICAgMHhhOQorCitzdGF0aWMgdm9pZCB4YnNkX2RlbGV0ZV9wYXJ0KHZvaWQpOworc3RhdGljIHZvaWQgeGJzZF9uZXdfcGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhic2Rfd3JpdGVfZGlza2xhYmVsKHZvaWQpOworc3RhdGljIGludCB4YnNkX2NyZWF0ZV9kaXNrbGFiZWwodm9pZCk7CitzdGF0aWMgdm9pZCB4YnNkX2VkaXRfZGlza2xhYmVsKHZvaWQpOworc3RhdGljIHZvaWQgeGJzZF93cml0ZV9ib290c3RyYXAodm9pZCk7CitzdGF0aWMgdm9pZCB4YnNkX2NoYW5nZV9mc3R5cGUodm9pZCk7CitzdGF0aWMgaW50IHhic2RfZ2V0X3BhcnRfaW5kZXgoaW50IG1heCk7CitzdGF0aWMgaW50IHhic2RfY2hlY2tfbmV3X3BhcnRpdGlvbihpbnQgKmkpOworc3RhdGljIHZvaWQgeGJzZF9saXN0X3R5cGVzKHZvaWQpOworc3RhdGljIHVpbnQxNl90IHhic2RfZGtja3N1bShzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgKmxwKTsKK3N0YXRpYyBpbnQgeGJzZF9pbml0bGFiZWwoc3RydWN0IHBhcnRpdGlvbiAqcCk7CitzdGF0aWMgaW50IHhic2RfcmVhZGxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApOworc3RhdGljIGludCB4YnNkX3dyaXRlbGFiZWwoc3RydWN0IHBhcnRpdGlvbiAqcCk7CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyB2b2lkIGFscGhhX2Jvb3RibG9ja19jaGVja3N1bShjaGFyICpib290KTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorc3RhdGljIGludCB4YnNkX3RyYW5zbGF0ZV9mc3R5cGUoaW50IGxpbnV4X3R5cGUpOworc3RhdGljIHZvaWQgeGJzZF9saW5rX3BhcnQodm9pZCk7CitzdGF0aWMgc3RydWN0IHBhcnRpdGlvbiAqeGJzZF9wYXJ0Oworc3RhdGljIGludCB4YnNkX3BhcnRfaW5kZXg7CisjZW5kaWYKKworCisvKiBHcm91cCBiaWcgZ2xvYmFscyBkYXRhIGFuZCBhbGxvY2F0ZSBpdCBpbiBvbmUgZ28gKi8KK3N0cnVjdCBic2RfZ2xvYmFscyB7CisvKiBXZSBhY2Nlc3MgdGhpcyB0aHJvdWdoIGEgdWludDY0X3QgKiB3aGVuIGNoZWNrc3VtbWluZyAqLworLyogaG9wZWZ1bGx5IHhtYWxsb2MgZ2l2ZXMgdXMgcmVxdWlyZWQgYWxpZ25tZW50ICovCisJY2hhciBkaXNrbGFiZWxidWZmZXJbQlNEX0JCU0laRV07CisJc3RydWN0IHhic2RfZGlza2xhYmVsIHhic2RfZGxhYmVsOworfTsKKworc3RhdGljIHN0cnVjdCBic2RfZ2xvYmFscyAqYnNkX2dsb2JhbHNfcHRyOworCisjZGVmaW5lIGRpc2tsYWJlbGJ1ZmZlciAoYnNkX2dsb2JhbHNfcHRyLT5kaXNrbGFiZWxidWZmZXIpCisjZGVmaW5lIHhic2RfZGxhYmVsICAgICAoYnNkX2dsb2JhbHNfcHRyLT54YnNkX2RsYWJlbCkKKworCisvKiBDb2RlICovCisKKyNkZWZpbmUgYnNkX2Nyb3VuZChuKSBcCisJKGRpc3BsYXlfaW5fY3lsX3VuaXRzID8gKChuKS94YnNkX2RsYWJlbC5kX3NlY3BlcmN5bCkgKyAxIDogKG4pKQorCisvKgorICogVGVzdCB3aGV0aGVyIHRoZSB3aG9sZSBkaXNrIGhhcyBCU0QgZGlzayBsYWJlbCBtYWdpYy4KKyAqCisgKiBOb3RlOiBvZnRlbiByZWZvcm1hdHRpbmcgd2l0aCBET1MtdHlwZSBsYWJlbCBsZWF2ZXMgdGhlIEJTRCBtYWdpYywKKyAqIHNvIHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZXJlIGlzIGEgQlNEIGRpc2sgbGFiZWwuCisgKi8KK3N0YXRpYyBpbnQKK2NoZWNrX29zZl9sYWJlbCh2b2lkKQoreworCWlmICh4YnNkX3JlYWRsYWJlbChOVUxMKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorYnNkX3RyeWRldihjb25zdCBjaGFyICogZGV2KQoreworCWlmICh4YnNkX3JlYWRsYWJlbChOVUxMKSA9PSAwKQorCQlyZXR1cm4gLTE7CisJcHJpbnRmKCJcbkJTRCBsYWJlbCBmb3IgZGV2aWNlOiAlc1xuIiwgZGV2KTsKKwl4YnNkX3ByaW50X2Rpc2tsYWJlbCgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2JzZF9tZW51KHZvaWQpCit7CisJcHV0cygiQ29tbWFuZCBBY3Rpb24iKTsKKwlwdXRzKCJkXHRkZWxldGUgYSBCU0QgcGFydGl0aW9uIik7CisJcHV0cygiZVx0ZWRpdCBkcml2ZSBkYXRhIik7CisJcHV0cygiaVx0aW5zdGFsbCBib290c3RyYXAiKTsKKwlwdXRzKCJsXHRsaXN0IGtub3duIGZpbGVzeXN0ZW0gdHlwZXMiKTsKKwlwdXRzKCJuXHRhZGQgYSBuZXcgQlNEIHBhcnRpdGlvbiIpOworCXB1dHMoInBcdHByaW50IEJTRCBwYXJ0aXRpb24gdGFibGUiKTsKKwlwdXRzKCJxXHRxdWl0IHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMiKTsKKwlwdXRzKCJyXHRyZXR1cm4gdG8gbWFpbiBtZW51Iik7CisJcHV0cygic1x0c2hvdyBjb21wbGV0ZSBkaXNrbGFiZWwiKTsKKwlwdXRzKCJ0XHRjaGFuZ2UgYSBwYXJ0aXRpb24ncyBmaWxlc3lzdGVtIGlkIik7CisJcHV0cygidVx0Y2hhbmdlIHVuaXRzIChjeWxpbmRlcnMvc2VjdG9ycykiKTsKKwlwdXRzKCJ3XHR3cml0ZSBkaXNrbGFiZWwgdG8gZGlzayIpOworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKKwlwdXRzKCJ4XHRsaW5rIEJTRCBwYXJ0aXRpb24gdG8gbm9uLUJTRCBwYXJ0aXRpb24iKTsKKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorc3RhdGljIGludAoraGlkZGVuKGludCB0eXBlKQoreworCXJldHVybiB0eXBlIF4gMHgxMDsKK30KKworc3RhdGljIGludAoraXNfYnNkX3BhcnRpdGlvbl90eXBlKGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBGUkVFQlNEX1BBUlRJVElPTiB8fAorCQl0eXBlID09IGhpZGRlbihGUkVFQlNEX1BBUlRJVElPTikgfHwKKwkJdHlwZSA9PSBORVRCU0RfUEFSVElUSU9OIHx8CisJCXR5cGUgPT0gaGlkZGVuKE5FVEJTRF9QQVJUSVRJT04pKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorYnNkX3NlbGVjdCh2b2lkKQoreworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKKwlpbnQgdCwgc3M7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKworCWZvciAodCA9IDA7IHQgPCA0OyB0KyspIHsKKwkJcCA9IGdldF9wYXJ0X3RhYmxlKHQpOworCQlpZiAocCAmJiBpc19ic2RfcGFydGl0aW9uX3R5cGUocC0+c3lzX2luZCkpIHsKKwkJCXhic2RfcGFydCA9IHA7CisJCQl4YnNkX3BhcnRfaW5kZXggPSB0OworCQkJc3MgPSBnZXRfc3RhcnRfc2VjdCh4YnNkX3BhcnQpOworCQkJaWYgKHNzID09IDApIHsKKwkJCQlwcmludGYoIlBhcnRpdGlvbiAlcyBoYXMgaW52YWxpZCBzdGFydGluZyBzZWN0b3IgMFxuIiwKKwkJCQkJcGFydG5hbWUoZGlza19kZXZpY2UsIHQrMSwgMCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQlwcmludGYoIlJlYWRpbmcgZGlza2xhYmVsIG9mICVzIGF0IHNlY3RvciAldVxuIiwKKwkJCQkJcGFydG5hbWUoZGlza19kZXZpY2UsIHQrMSwgMCksIHNzICsgQlNEX0xBQkVMU0VDVE9SKTsKKwkJCWlmICh4YnNkX3JlYWRsYWJlbCh4YnNkX3BhcnQpID09IDApCisJCQkJaWYgKHhic2RfY3JlYXRlX2Rpc2tsYWJlbCgpID09IDApCisJCQkJCXJldHVybjsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0ID09IDQpIHsKKwkJcHJpbnRmKCJUaGVyZSBpcyBubyAqQlNEIHBhcnRpdGlvbiBvbiAlc1xuIiwgZGlza19kZXZpY2UpOworCQlyZXR1cm47CisJfQorCisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKworCWlmICh4YnNkX3JlYWRsYWJlbChOVUxMKSA9PSAwKQorCQlpZiAoeGJzZF9jcmVhdGVfZGlza2xhYmVsKCkgPT0gMCkKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKworI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQliYl9wdXRjaGFyKCdcbicpOworCQlzd2l0Y2ggKHRvbG93ZXIocmVhZF9ub25lbXB0eSgiQlNEIGRpc2tsYWJlbCBjb21tYW5kIChtIGZvciBoZWxwKTogIikpKSB7CisJCWNhc2UgJ2QnOgorCQkJeGJzZF9kZWxldGVfcGFydCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJeGJzZF9lZGl0X2Rpc2tsYWJlbCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJeGJzZF93cml0ZV9ib290c3RyYXAoKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCXhic2RfbGlzdF90eXBlcygpOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJeGJzZF9uZXdfcGFydCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJeGJzZF9wcmludF9kaXNrbGFiZWwoMCk7CisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJY2xvc2VfZGV2X2ZkKCk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCWNhc2UgJ3InOgorCQkJcmV0dXJuOworCQljYXNlICdzJzoKKwkJCXhic2RfcHJpbnRfZGlza2xhYmVsKDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJeGJzZF9jaGFuZ2VfZnN0eXBlKCk7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQljaGFuZ2VfdW5pdHMoKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXhic2Rfd3JpdGVfZGlza2xhYmVsKCk7CisJCQlicmVhazsKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJCWNhc2UgJ3gnOgorCQkJeGJzZF9saW5rX3BhcnQoKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlic2RfbWVudSgpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX2RlbGV0ZV9wYXJ0KHZvaWQpCit7CisJaW50IGk7CisKKwlpID0geGJzZF9nZXRfcGFydF9pbmRleCh4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zKTsKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9zaXplICAgPSAwOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX29mZnNldCA9IDA7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKKwlpZiAoeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucyA9PSBpICsgMSkKKwkJd2hpbGUgKHhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1t4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zLTFdLnBfc2l6ZSA9PSAwKQorCQkJeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucy0tOworfQorCitzdGF0aWMgdm9pZAoreGJzZF9uZXdfcGFydCh2b2lkKQoreworCW9mZl90IGJlZ2luLCBlbmQ7CisJY2hhciBtZXNnWzI1Nl07CisJaW50IGk7CisKKwlpZiAoIXhic2RfY2hlY2tfbmV3X3BhcnRpdGlvbigmaSkpCisJCXJldHVybjsKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKF9faHBwYV9fKQorCWJlZ2luID0gZ2V0X3N0YXJ0X3NlY3QoeGJzZF9wYXJ0KTsKKwllbmQgPSBiZWdpbiArIGdldF9ucl9zZWN0cyh4YnNkX3BhcnQpIC0gMTsKKyNlbHNlCisJYmVnaW4gPSAwOworCWVuZCA9IHhic2RfZGxhYmVsLmRfc2VjcGVydW5pdCAtIDE7CisjZW5kaWYKKworCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwgIkZpcnN0ICVzIiwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJYmVnaW4gPSByZWFkX2ludChic2RfY3JvdW5kKGJlZ2luKSwgYnNkX2Nyb3VuZChiZWdpbiksIGJzZF9jcm91bmQoZW5kKSwKKwkJMCwgbWVzZyk7CisKKwlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCWJlZ2luID0gKGJlZ2luIC0gMSkgKiB4YnNkX2RsYWJlbC5kX3NlY3BlcmN5bDsKKworCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwgIkxhc3QgJXMgb3IgK3NpemUgb3IgK3NpemVNIG9yICtzaXplSyIsCisJCXN0cl91bml0cyhTSU5HVUxBUikpOworCWVuZCA9IHJlYWRfaW50KGJzZF9jcm91bmQoYmVnaW4pLCBic2RfY3JvdW5kKGVuZCksIGJzZF9jcm91bmQoZW5kKSwKKwkJYnNkX2Nyb3VuZChiZWdpbiksIG1lc2cpOworCisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQllbmQgPSBlbmQgKiB4YnNkX2RsYWJlbC5kX3NlY3BlcmN5bCAtIDE7CisKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9zaXplICAgPSBlbmQgLSBiZWdpbiArIDE7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfb2Zmc2V0ID0gYmVnaW47CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKK30KKworc3RhdGljIHZvaWQKK3hic2RfcHJpbnRfZGlza2xhYmVsKGludCBzaG93X2FsbCkKK3sKKwlzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgKmxwID0gJnhic2RfZGxhYmVsOworCXN0cnVjdCB4YnNkX3BhcnRpdGlvbiAqcHA7CisJaW50IGksIGo7CisKKwlpZiAoc2hvd19hbGwpIHsKKwkJc3RhdGljIGNvbnN0IGludCBkX21hc2tzW10gPSB7IEJTRF9EX1JFTU9WQUJMRSwgQlNEX0RfRUNDLCBCU0RfRF9CQURTRUNUIH07CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwkJcHJpbnRmKCIjICVzOlxuIiwgZGlza19kZXZpY2UpOworI2Vsc2UKKwkJcHJpbnRmKCIjICVzOlxuIiwgcGFydG5hbWUoZGlza19kZXZpY2UsIHhic2RfcGFydF9pbmRleCsxLCAwKSk7CisjZW5kaWYKKwkJaWYgKCh1bnNpZ25lZCkgbHAtPmRfdHlwZSA8IEFSUkFZX1NJWkUoeGJzZF9ka3R5cGVuYW1lcyktMSkKKwkJCXByaW50ZigidHlwZTogJXNcbiIsIHhic2RfZGt0eXBlbmFtZXNbbHAtPmRfdHlwZV0pOworCQllbHNlCisJCQlwcmludGYoInR5cGU6ICV1XG4iLCBscC0+ZF90eXBlKTsKKwkJcHJpbnRmKCJkaXNrOiAlLipzXG4iLCAoaW50KSBzaXplb2YobHAtPmRfdHlwZW5hbWUpLCBscC0+ZF90eXBlbmFtZSk7CisJCXByaW50ZigibGFiZWw6ICUuKnNcbiIsIChpbnQpIHNpemVvZihscC0+ZF9wYWNrbmFtZSksIGxwLT5kX3BhY2tuYW1lKTsKKwkJcHJpbnRmKCJmbGFnczogIik7CisJCXByaW50X2ZsYWdzX3NlcGFyYXRlZChkX21hc2tzLCAicmVtb3ZhYmxlXDAiImVjY1wwIiJiYWRzZWN0XDAiLCBscC0+ZF9mbGFncywgIiAiKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJLyogT24gdmFyaW91cyBtYWNoaW5lcyB0aGUgZmllbGRzIG9mICpscCBhcmUgc2hvcnQvaW50L2xvbmcgKi8KKwkJLyogSW4gb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMsIHdlIGNhc3QgdGhlbSBhbGwgdG8gbG9uZy4gKi8KKwkJcHJpbnRmKCJieXRlcy9zZWN0b3I6ICVsdVxuIiwgKGxvbmcpIGxwLT5kX3NlY3NpemUpOworCQlwcmludGYoInNlY3RvcnMvdHJhY2s6ICVsdVxuIiwgKGxvbmcpIGxwLT5kX25zZWN0b3JzKTsKKwkJcHJpbnRmKCJ0cmFja3MvY3lsaW5kZXI6ICVsdVxuIiwgKGxvbmcpIGxwLT5kX250cmFja3MpOworCQlwcmludGYoInNlY3RvcnMvY3lsaW5kZXI6ICVsdVxuIiwgKGxvbmcpIGxwLT5kX3NlY3BlcmN5bCk7CisJCXByaW50ZigiY3lsaW5kZXJzOiAlbHVcbiIsIChsb25nKSBscC0+ZF9uY3lsaW5kZXJzKTsKKwkJcHJpbnRmKCJycG06ICV1XG4iLCBscC0+ZF9ycG0pOworCQlwcmludGYoImludGVybGVhdmU6ICV1XG4iLCBscC0+ZF9pbnRlcmxlYXZlKTsKKwkJcHJpbnRmKCJ0cmFja3NrZXc6ICV1XG4iLCBscC0+ZF90cmFja3NrZXcpOworCQlwcmludGYoImN5bGluZGVyc2tldzogJXVcbiIsIGxwLT5kX2N5bHNrZXcpOworCQlwcmludGYoImhlYWRzd2l0Y2g6ICVsdVx0XHQjIG1pbGxpc2Vjb25kc1xuIiwKKwkJCShsb25nKSBscC0+ZF9oZWFkc3dpdGNoKTsKKwkJcHJpbnRmKCJ0cmFjay10by10cmFjayBzZWVrOiAlbHVcdCMgbWlsbGlzZWNvbmRzXG4iLAorCQkJKGxvbmcpIGxwLT5kX3Rya3NlZWspOworCQlwcmludGYoImRyaXZlZGF0YTogIik7CisJCWZvciAoaSA9IE5EREFUQSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJaWYgKGxwLT5kX2RyaXZlZGF0YVtpXSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPCAwKQorCQkJaSA9IDA7CisJCWZvciAoaiA9IDA7IGogPD0gaTsgaisrKQorCQkJcHJpbnRmKCIlbHUgIiwgKGxvbmcpIGxwLT5kX2RyaXZlZGF0YVtqXSk7CisJfQorCXByaW50ZigiXG4ldSBwYXJ0aXRpb25zOlxuIiwgbHAtPmRfbnBhcnRpdGlvbnMpOworCXByaW50ZigiIyAgICAgICBzdGFydCAgICAgICBlbmQgICAgICBzaXplICAgICBmc3R5cGUgICBbZnNpemUgYnNpemUgICBjcGddXG4iKTsKKwlwcCA9IGxwLT5kX3BhcnRpdGlvbnM7CisJZm9yIChpID0gMDsgaSA8IGxwLT5kX25wYXJ0aXRpb25zOyBpKyssIHBwKyspIHsKKwkJaWYgKHBwLT5wX3NpemUpIHsKKwkJCWlmIChkaXNwbGF5X2luX2N5bF91bml0cyAmJiBscC0+ZF9zZWNwZXJjeWwpIHsKKwkJCQlwcmludGYoIiAgJWM6ICU4bHUlYyAlOGx1JWMgJThsdSVjICAiLAorCQkJCQknYScgKyBpLAorCQkJCQkodW5zaWduZWQgbG9uZykgcHAtPnBfb2Zmc2V0IC8gbHAtPmRfc2VjcGVyY3lsICsgMSwKKwkJCQkJKHBwLT5wX29mZnNldCAlIGxwLT5kX3NlY3BlcmN5bCkgPyAnKicgOiAnICcsCisJCQkJCSh1bnNpZ25lZCBsb25nKSAocHAtPnBfb2Zmc2V0ICsgcHAtPnBfc2l6ZSArIGxwLT5kX3NlY3BlcmN5bCAtIDEpIC8gbHAtPmRfc2VjcGVyY3lsLAorCQkJCQkoKHBwLT5wX29mZnNldCArIHBwLT5wX3NpemUpICUgbHAtPmRfc2VjcGVyY3lsKSA/ICcqJyA6ICcgJywKKwkJCQkJKGxvbmcpIHBwLT5wX3NpemUgLyBscC0+ZF9zZWNwZXJjeWwsCisJCQkJCShwcC0+cF9zaXplICUgbHAtPmRfc2VjcGVyY3lsKSA/ICcqJyA6ICcgJworCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiICAlYzogJThsdSAgJThsdSAgJThsdSAgICIsCisJCQkJCSdhJyArIGksCisJCQkJCShsb25nKSBwcC0+cF9vZmZzZXQsCisJCQkJCShsb25nKSBwcC0+cF9vZmZzZXQgKyBwcC0+cF9zaXplIC0gMSwKKwkJCQkJKGxvbmcpIHBwLT5wX3NpemUKKwkJCQkpOworCQkJfQorCisJCQlpZiAoKHVuc2lnbmVkKSBwcC0+cF9mc3R5cGUgPCBBUlJBWV9TSVpFKHhic2RfZnN0eXBlcyktMSkKKwkJCQlwcmludGYoIiU4LjhzIiwgeGJzZF9mc3R5cGVzW3BwLT5wX2ZzdHlwZV0pOworCQkJZWxzZQorCQkJCXByaW50ZigiJTh4IiwgcHAtPnBfZnN0eXBlKTsKKworCQkJc3dpdGNoIChwcC0+cF9mc3R5cGUpIHsKKwkJCWNhc2UgQlNEX0ZTX1VOVVNFRDoKKwkJCQlwcmludGYoIiAgICAlNWx1ICU1bHUgJTUuNXMgIiwKKwkJCQkJKGxvbmcpIHBwLT5wX2ZzaXplLCAobG9uZykgcHAtPnBfZnNpemUgKiBwcC0+cF9mcmFnLCAiIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEJTRF9GU19CU0RGRlM6CisJCQkJcHJpbnRmKCIgICAgJTVsdSAlNWx1ICU1dSAiLAorCQkJCQkobG9uZykgcHAtPnBfZnNpemUsIChsb25nKSBwcC0+cF9mc2l6ZSAqIHBwLT5wX2ZyYWcsIHBwLT5wX2NwZyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiJTIyLjIycyIsICIiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX3dyaXRlX2Rpc2tsYWJlbCh2b2lkKQoreworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorCXByaW50ZigiV3JpdGluZyBkaXNrbGFiZWwgdG8gJXNcbiIsIGRpc2tfZGV2aWNlKTsKKwl4YnNkX3dyaXRlbGFiZWwoTlVMTCk7CisjZWxzZQorCXByaW50ZigiV3JpdGluZyBkaXNrbGFiZWwgdG8gJXNcbiIsCisJCXBhcnRuYW1lKGRpc2tfZGV2aWNlLCB4YnNkX3BhcnRfaW5kZXggKyAxLCAwKSk7CisJeGJzZF93cml0ZWxhYmVsKHhic2RfcGFydCk7CisjZW5kaWYKKwlyZXJlYWRfcGFydGl0aW9uX3RhYmxlKDApOyAgICAgIC8qIG5vIGV4aXQgeWV0ICovCit9CisKK3N0YXRpYyBpbnQKK3hic2RfY3JlYXRlX2Rpc2tsYWJlbCh2b2lkKQoreworCWNoYXIgYzsKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorCXByaW50ZigiJXMgY29udGFpbnMgbm8gZGlza2xhYmVsXG4iLCBkaXNrX2RldmljZSk7CisjZWxzZQorCXByaW50ZigiJXMgY29udGFpbnMgbm8gZGlza2xhYmVsXG4iLAorCQlwYXJ0bmFtZShkaXNrX2RldmljZSwgeGJzZF9wYXJ0X2luZGV4ICsgMSwgMCkpOworI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQljID0gcmVhZF9ub25lbXB0eSgiRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgZGlza2xhYmVsPyAoeS9uKSAiKTsKKwkJaWYgKChjfDB4MjApID09ICd5JykgeworCQkJaWYgKHhic2RfaW5pdGxhYmVsKAorI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSB8fCBcCisJZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3MzOTB4X18pCisJCQkJTlVMTAorI2Vsc2UKKwkJCQl4YnNkX3BhcnQKKyNlbmRpZgorCQkJKSA9PSAxKSB7CisJCQkJeGJzZF9wcmludF9kaXNrbGFiZWwoMSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoKGN8MHgyMCkgPT0gJ24nKQorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50CitlZGl0X2ludChpbnQgZGVmLCBjb25zdCBjaGFyICptZXNnKQoreworCW1lc2cgPSB4YXNwcmludGYoIiVzICgldSk6ICIsIG1lc2csIGRlZik7CisJZG8geworCQlpZiAoIXJlYWRfbGluZShtZXNnKSkKKwkJCWdvdG8gcmV0OworCX0gd2hpbGUgKCFpc2RpZ2l0KCpsaW5lX3B0cikpOworCWRlZiA9IGF0b2kobGluZV9wdHIpOworIHJldDoKKwlmcmVlKChjaGFyKiltZXNnKTsKKwlyZXR1cm4gZGVmOworfQorCitzdGF0aWMgdm9pZAoreGJzZF9lZGl0X2Rpc2tsYWJlbCh2b2lkKQoreworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCAqZDsKKworCWQgPSAmeGJzZF9kbGFiZWw7CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2lhNjRfXykKKwlkLT5kX3NlY3NpemUgICAgPSBlZGl0X2ludChkLT5kX3NlY3NpemUgICAgICwgImJ5dGVzL3NlY3RvciIpOworCWQtPmRfbnNlY3RvcnMgICA9IGVkaXRfaW50KGQtPmRfbnNlY3RvcnMgICAgLCAic2VjdG9ycy90cmFjayIpOworCWQtPmRfbnRyYWNrcyAgICA9IGVkaXRfaW50KGQtPmRfbnRyYWNrcyAgICAgLCAidHJhY2tzL2N5bGluZGVyIik7CisJZC0+ZF9uY3lsaW5kZXJzID0gZWRpdF9pbnQoZC0+ZF9uY3lsaW5kZXJzICAsICJjeWxpbmRlcnMiKTsKKyNlbmRpZgorCisJLyogZC0+ZF9zZWNwZXJjeWwgY2FuIGJlICE9IGQtPmRfbnNlY3RvcnMgKiBkLT5kX250cmFja3MgKi8KKwl3aGlsZSAoMSkgeworCQlkLT5kX3NlY3BlcmN5bCA9IGVkaXRfaW50KGQtPmRfbnNlY3RvcnMgKiBkLT5kX250cmFja3MsCisJCQkJInNlY3RvcnMvY3lsaW5kZXIiKTsKKwkJaWYgKGQtPmRfc2VjcGVyY3lsIDw9IGQtPmRfbnNlY3RvcnMgKiBkLT5kX250cmFja3MpCisJCQlicmVhazsKKworCQlwcmludGYoIk11c3QgYmUgPD0gc2VjdG9ycy90cmFjayAqIHRyYWNrcy9jeWxpbmRlciAoZGVmYXVsdClcbiIpOworCX0KKwlkLT5kX3JwbSAgICAgICAgPSBlZGl0X2ludChkLT5kX3JwbSAgICAgICAsICJycG0iKTsKKwlkLT5kX2ludGVybGVhdmUgPSBlZGl0X2ludChkLT5kX2ludGVybGVhdmUsICJpbnRlcmxlYXZlIik7CisJZC0+ZF90cmFja3NrZXcgID0gZWRpdF9pbnQoZC0+ZF90cmFja3NrZXcgLCAidHJhY2tza2V3Iik7CisJZC0+ZF9jeWxza2V3ICAgID0gZWRpdF9pbnQoZC0+ZF9jeWxza2V3ICAgLCAiY3lsaW5kZXJza2V3Iik7CisJZC0+ZF9oZWFkc3dpdGNoID0gZWRpdF9pbnQoZC0+ZF9oZWFkc3dpdGNoLCAiaGVhZHN3aXRjaCIpOworCWQtPmRfdHJrc2VlayAgICA9IGVkaXRfaW50KGQtPmRfdHJrc2VlayAgICwgInRyYWNrLXRvLXRyYWNrIHNlZWsiKTsKKworCWQtPmRfc2VjcGVydW5pdCA9IGQtPmRfc2VjcGVyY3lsICogZC0+ZF9uY3lsaW5kZXJzOworfQorCitzdGF0aWMgaW50Cit4YnNkX2dldF9ib290c3RyYXAoY2hhciAqcGF0aCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgZmRiOworCisJZmRiID0gb3Blbl9vcl93YXJuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmRiIDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZ1bGxfcmVhZChmZGIsIHB0ciwgc2l6ZSkgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKHBhdGgpOworCQljbG9zZShmZGIpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRmKCIgLi4uICVzXG4iLCBwYXRoKTsKKwljbG9zZShmZGIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorc3luY19kaXNrcyh2b2lkKQoreworCXByaW50ZigiU3luY2luZyBkaXNrc1xuIik7CisJc3luYygpOworCS8qIHNsZWVwKDQpOyBXaGF0PyAqLworfQorCitzdGF0aWMgdm9pZAoreGJzZF93cml0ZV9ib290c3RyYXAodm9pZCkKK3sKKwljaGFyIHBhdGhbTUFYUEFUSExFTl07CisJY29uc3QgY2hhciAqYm9vdGRpciA9IEJTRF9MSU5VWF9CT09URElSOworCWNvbnN0IGNoYXIgKmRrYmFzZW5hbWU7CisJc3RydWN0IHhic2RfZGlza2xhYmVsIGRsOworCWNoYXIgKmQsICpwLCAqZTsKKwlpbnQgc2VjdG9yOworCisJaWYgKHhic2RfZGxhYmVsLmRfdHlwZSA9PSBCU0RfRFRZUEVfU0NTSSkKKwkJZGtiYXNlbmFtZSA9ICJzZCI7CisJZWxzZQorCQlka2Jhc2VuYW1lID0gIndkIjsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIkJvb3RzdHJhcDogJXNib290IC0+IGJvb3QlcyAoJXMpOiAiLAorCQlka2Jhc2VuYW1lLCBka2Jhc2VuYW1lLCBka2Jhc2VuYW1lKTsKKwlpZiAocmVhZF9saW5lKHBhdGgpKSB7CisJCWRrYmFzZW5hbWUgPSBsaW5lX3B0cjsKKwl9CisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvJXNib290IiwgYm9vdGRpciwgZGtiYXNlbmFtZSk7CisJaWYgKCF4YnNkX2dldF9ib290c3RyYXAocGF0aCwgZGlza2xhYmVsYnVmZmVyLCAoaW50KSB4YnNkX2RsYWJlbC5kX3NlY3NpemUpKQorCQlyZXR1cm47CisKKy8qIFdlIG5lZWQgYSBiYWNrdXAgb2YgdGhlIGRpc2tsYWJlbCAoeGJzZF9kbGFiZWwgbWlnaHQgaGF2ZSBjaGFuZ2VkKS4gKi8KKwlkID0gJmRpc2tsYWJlbGJ1ZmZlcltCU0RfTEFCRUxTRUNUT1IgKiBTRUNUT1JfU0laRV07CisJbWVtbW92ZSgmZGwsIGQsIHNpemVvZihzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwpKTsKKworLyogVGhlIGRpc2tsYWJlbCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IDAncyBmcm9tIGJvb3R4eCBhbnl3YXkgKi8KKwltZW1zZXQoZCwgMCwgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvYm9vdCVzIiwgYm9vdGRpciwgZGtiYXNlbmFtZSk7CisJaWYgKCF4YnNkX2dldF9ib290c3RyYXAocGF0aCwgJmRpc2tsYWJlbGJ1ZmZlclt4YnNkX2RsYWJlbC5kX3NlY3NpemVdLAorCQkJKGludCkgeGJzZF9kbGFiZWwuZF9iYnNpemUgLSB4YnNkX2RsYWJlbC5kX3NlY3NpemUpKQorCQlyZXR1cm47CisKKwllID0gZCArIHNpemVvZihzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwpOworCWZvciAocCA9IGQ7IHAgPCBlOyBwKyspCisJCWlmICgqcCkgeworCQkJcHJpbnRmKCJCb290c3RyYXAgb3ZlcmxhcHMgd2l0aCBkaXNrIGxhYmVsIVxuIik7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKworCW1lbW1vdmUoZCwgJmRsLCBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKSk7CisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9faHBwYV9fKQorCXNlY3RvciA9IDA7CisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlzZWN0b3IgPSAwOworCWFscGhhX2Jvb3RibG9ja19jaGVja3N1bShkaXNrbGFiZWxidWZmZXIpOworI2Vsc2UKKwlzZWN0b3IgPSBnZXRfc3RhcnRfc2VjdCh4YnNkX3BhcnQpOworI2VuZGlmCisKKwlzZWVrX3NlY3RvcihzZWN0b3IpOworCXh3cml0ZShkZXZfZmQsIGRpc2tsYWJlbGJ1ZmZlciwgQlNEX0JCU0laRSk7CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlwcmludGYoIkJvb3RzdHJhcCBpbnN0YWxsZWQgb24gJXNcbiIsIGRpc2tfZGV2aWNlKTsKKyNlbHNlCisJcHJpbnRmKCJCb290c3RyYXAgaW5zdGFsbGVkIG9uICVzXG4iLAorCQlwYXJ0bmFtZShkaXNrX2RldmljZSwgeGJzZF9wYXJ0X2luZGV4KzEsIDApKTsKKyNlbmRpZgorCisJc3luY19kaXNrcygpOworfQorCitzdGF0aWMgdm9pZAoreGJzZF9jaGFuZ2VfZnN0eXBlKHZvaWQpCit7CisJaW50IGk7CisKKwlpID0geGJzZF9nZXRfcGFydF9pbmRleCh4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zKTsKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9mc3R5cGUgPSByZWFkX2hleCh4YnNkX2ZzdHlwZXMpOworfQorCitzdGF0aWMgaW50Cit4YnNkX2dldF9wYXJ0X2luZGV4KGludCBtYXgpCit7CisJY2hhciBwcm9tcHRbc2l6ZW9mKCJQYXJ0aXRpb24gKGEtJWMpOiAiKSArIDE2XTsKKwljaGFyIGw7CisKKwlzbnByaW50Zihwcm9tcHQsIHNpemVvZihwcm9tcHQpLCAiUGFydGl0aW9uIChhLSVjKTogIiwgJ2EnICsgbWF4IC0gMSk7CisJZG8KKwkJbCA9IHRvbG93ZXIocmVhZF9ub25lbXB0eShwcm9tcHQpKTsKKwl3aGlsZSAobCA8ICdhJyB8fCBsID4gJ2EnICsgbWF4IC0gMSk7CisJcmV0dXJuIGwgLSAnYSc7Cit9CisKK3N0YXRpYyBpbnQKK3hic2RfY2hlY2tfbmV3X3BhcnRpdGlvbihpbnQgKmkpCit7CisJLyogcm9vbSBmb3IgbW9yZT8gdmFyaW91cyBCU0QgZmxhdm91cnMgaGF2ZSBkaWZmZXJlbnQgbWF4aW1hICovCisJaWYgKHhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMgPT0gQlNEX01BWFBBUlRJVElPTlMpIHsKKwkJaW50IHQ7CisKKwkJZm9yICh0ID0gMDsgdCA8IEJTRF9NQVhQQVJUSVRJT05TOyB0KyspCisJCQlpZiAoeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW3RdLnBfc2l6ZSA9PSAwKQorCQkJCWJyZWFrOworCisJCWlmICh0ID09IEJTRF9NQVhQQVJUSVRJT05TKSB7CisJCQlwcmludGYoIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJ0aXRpb25zIGhhcyBiZWVuIGNyZWF0ZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkqaSA9IHhic2RfZ2V0X3BhcnRfaW5kZXgoQlNEX01BWFBBUlRJVElPTlMpOworCisJaWYgKCppID49IHhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMpCisJCXhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMgPSAoKmkpICsgMTsKKworCWlmICh4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbKmldLnBfc2l6ZSAhPSAwKSB7CisJCXByaW50ZigiVGhpcyBwYXJ0aXRpb24gYWxyZWFkeSBleGlzdHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3hic2RfbGlzdF90eXBlcyh2b2lkKQoreworCWxpc3RfdHlwZXMoeGJzZF9mc3R5cGVzKTsKK30KKworc3RhdGljIHVpbnQxNl90Cit4YnNkX2RrY2tzdW0oc3RydWN0IHhic2RfZGlza2xhYmVsICpscCkKK3sKKwl1aW50MTZfdCAqc3RhcnQsICplbmQ7CisJdWludDE2X3Qgc3VtID0gMDsKKworCXN0YXJ0ID0gKHVpbnQxNl90ICopIGxwOworCWVuZCA9ICh1aW50MTZfdCAqKSAmbHAtPmRfcGFydGl0aW9uc1tscC0+ZF9ucGFydGl0aW9uc107CisJd2hpbGUgKHN0YXJ0IDwgZW5kKQorCQlzdW0gXj0gKnN0YXJ0Kys7CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludAoreGJzZF9pbml0bGFiZWwoc3RydWN0IHBhcnRpdGlvbiAqcCkKK3sKKwlzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgKmQgPSAmeGJzZF9kbGFiZWw7CisJc3RydWN0IHhic2RfcGFydGl0aW9uICpwcDsKKworCWdldF9nZW9tZXRyeSgpOworCW1lbXNldChkLCAwLCBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKSk7CisKKwlkLT5kX21hZ2ljID0gQlNEX0RJU0tNQUdJQzsKKworCWlmIChzdHJuY21wKGRpc2tfZGV2aWNlLCAiL2Rldi9zZCIsIDcpID09IDApCisJCWQtPmRfdHlwZSA9IEJTRF9EVFlQRV9TQ1NJOworCWVsc2UKKwkJZC0+ZF90eXBlID0gQlNEX0RUWVBFX1NUNTA2OworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorCWQtPmRfZmxhZ3MgPSBCU0RfRF9ET1NQQVJUOworI2Vsc2UKKwlkLT5kX2ZsYWdzID0gMDsKKyNlbmRpZgorCWQtPmRfc2Vjc2l6ZSA9IFNFQ1RPUl9TSVpFOyAgICAgICAgICAgLyogYnl0ZXMvc2VjdG9yICAqLworCWQtPmRfbnNlY3RvcnMgPSBnX3NlY3RvcnM7ICAgICAgICAgICAgLyogc2VjdG9ycy90cmFjayAqLworCWQtPmRfbnRyYWNrcyA9IGdfaGVhZHM7ICAgICAgICAgICAgICAgLyogdHJhY2tzL2N5bGluZGVyIChoZWFkcykgKi8KKwlkLT5kX25jeWxpbmRlcnMgPSBnX2N5bGluZGVyczsKKwlkLT5kX3NlY3BlcmN5bCAgPSBnX3NlY3RvcnMgKiBnX2hlYWRzOy8qIHNlY3RvcnMvY3lsaW5kZXIgKi8KKwlpZiAoZC0+ZF9zZWNwZXJjeWwgPT0gMCkKKwkJZC0+ZF9zZWNwZXJjeWwgPSAxOyAgICAgICAgICAgLyogYXZvaWQgc2VnZmF1bHRzICovCisJZC0+ZF9zZWNwZXJ1bml0ID0gZC0+ZF9zZWNwZXJjeWwgKiBkLT5kX25jeWxpbmRlcnM7CisKKwlkLT5kX3JwbSA9IDM2MDA7CisJZC0+ZF9pbnRlcmxlYXZlID0gMTsKKwlkLT5kX3RyYWNrc2tldyA9IDA7CisJZC0+ZF9jeWxza2V3ID0gMDsKKwlkLT5kX2hlYWRzd2l0Y2ggPSAwOworCWQtPmRfdHJrc2VlayA9IDA7CisKKwlkLT5kX21hZ2ljMiA9IEJTRF9ESVNLTUFHSUM7CisJZC0+ZF9iYnNpemUgPSBCU0RfQkJTSVpFOworCWQtPmRfc2JzaXplID0gQlNEX1NCU0laRTsKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKKwlkLT5kX25wYXJ0aXRpb25zID0gNDsKKwlwcCA9ICZkLT5kX3BhcnRpdGlvbnNbMl07IC8qIFBhcnRpdGlvbiBDIHNob3VsZCBiZSBOZXRCU0QgcGFydGl0aW9uICovCisKKwlwcC0+cF9vZmZzZXQgPSBnZXRfc3RhcnRfc2VjdChwKTsKKwlwcC0+cF9zaXplICAgPSBnZXRfbnJfc2VjdHMocCk7CisJcHAtPnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKKwlwcCA9ICZkLT5kX3BhcnRpdGlvbnNbM107IC8qIFBhcnRpdGlvbiBEIHNob3VsZCBiZSB3aG9sZSBkaXNrICovCisKKwlwcC0+cF9vZmZzZXQgPSAwOworCXBwLT5wX3NpemUgICA9IGQtPmRfc2VjcGVydW5pdDsKKwlwcC0+cF9mc3R5cGUgPSBCU0RfRlNfVU5VU0VEOworI2Vsc2UKKwlkLT5kX25wYXJ0aXRpb25zID0gMzsKKwlwcCA9ICZkLT5kX3BhcnRpdGlvbnNbMl07ICAgICAgICAgICAgIC8qIFBhcnRpdGlvbiBDIHNob3VsZCBiZQorCQkJCQkJICAgdGhlIHdob2xlIGRpc2sgKi8KKwlwcC0+cF9vZmZzZXQgPSAwOworCXBwLT5wX3NpemUgICA9IGQtPmRfc2VjcGVydW5pdDsKKwlwcC0+cF9mc3R5cGUgPSBCU0RfRlNfVU5VU0VEOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlYWQgYSB4YnNkX2Rpc2tsYWJlbCBmcm9tIHNlY3RvciAwIG9yIGZyb20gdGhlIHN0YXJ0aW5nIHNlY3RvciBvZiBwLgorICogSWYgaXQgaGFzIHRoZSByaWdodCBtYWdpYywgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQKK3hic2RfcmVhZGxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApCit7CisJc3RydWN0IHhic2RfZGlza2xhYmVsICpkOworCWludCB0LCBzZWN0b3I7CisKKwlpZiAoIWJzZF9nbG9iYWxzX3B0cikKKwkJYnNkX2dsb2JhbHNfcHRyID0geHphbGxvYyhzaXplb2YoKmJzZF9nbG9iYWxzX3B0cikpOworCisJZCA9ICZ4YnNkX2RsYWJlbDsKKworCS8qIHAgaXMgdXNlZCBvbmx5IHRvIGdldCB0aGUgc3RhcnRpbmcgc2VjdG9yICovCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorCXNlY3RvciA9IChwID8gZ2V0X3N0YXJ0X3NlY3QocCkgOiAwKTsKKyNlbHNlCisJc2VjdG9yID0gMDsKKyNlbmRpZgorCisJc2Vla19zZWN0b3Ioc2VjdG9yKTsKKwlpZiAoQlNEX0JCU0laRSAhPSBmdWxsX3JlYWQoZGV2X2ZkLCBkaXNrbGFiZWxidWZmZXIsIEJTRF9CQlNJWkUpKQorCQlmZGlza19mYXRhbCh1bmFibGVfdG9fcmVhZCk7CisKKwltZW1tb3ZlKGQsICZkaXNrbGFiZWxidWZmZXJbQlNEX0xBQkVMU0VDVE9SICogU0VDVE9SX1NJWkUgKyBCU0RfTEFCRUxPRkZTRVRdLAorCQkgICBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKSk7CisKKwlpZiAoZC0+ZF9tYWdpYyAhPSBCU0RfRElTS01BR0lDIHx8IGQtPmRfbWFnaWMyICE9IEJTRF9ESVNLTUFHSUMpCisJCXJldHVybiAwOworCisJZm9yICh0ID0gZC0+ZF9ucGFydGl0aW9uczsgdCA8IEJTRF9NQVhQQVJUSVRJT05TOyB0KyspIHsKKwkJZC0+ZF9wYXJ0aXRpb25zW3RdLnBfc2l6ZSAgID0gMDsKKwkJZC0+ZF9wYXJ0aXRpb25zW3RdLnBfb2Zmc2V0ID0gMDsKKwkJZC0+ZF9wYXJ0aXRpb25zW3RdLnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKKwl9CisKKwlpZiAoZC0+ZF9ucGFydGl0aW9ucyA+IEJTRF9NQVhQQVJUSVRJT05TKQorCQlwcmludGYoIldhcm5pbmc6IHRvbyBtYW55IHBhcnRpdGlvbnMgKCV1LCBtYXhpbXVtIGlzICV1KVxuIiwKKwkJCWQtPmRfbnBhcnRpdGlvbnMsIEJTRF9NQVhQQVJUSVRJT05TKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAoreGJzZF93cml0ZWxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApCit7CisJc3RydWN0IHhic2RfZGlza2xhYmVsICpkID0gJnhic2RfZGxhYmVsOworCXVuc2lnbmVkIGludCBzZWN0b3I7CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX2hwcGFfXykKKwlzZWN0b3IgPSBnZXRfc3RhcnRfc2VjdChwKSArIEJTRF9MQUJFTFNFQ1RPUjsKKyNlbHNlCisJKHZvaWQpcDsgLyogc2lsZW5jZSB3YXJuaW5nICovCisJc2VjdG9yID0gQlNEX0xBQkVMU0VDVE9SOworI2VuZGlmCisKKwlkLT5kX2NoZWNrc3VtID0gMDsKKwlkLT5kX2NoZWNrc3VtID0geGJzZF9ka2Nrc3VtKGQpOworCisJLyogVGhpcyBpcyBuZWNlc3NhcnkgaWYgd2Ugd2FudCB0byB3cml0ZSB0aGUgYm9vdHN0cmFwIGxhdGVyLAorCSAgIG90aGVyd2lzZSB3ZSdkIHdyaXRlIHRoZSBvbGQgZGlza2xhYmVsIHdpdGggdGhlIGJvb3RzdHJhcC4KKwkqLworCW1lbW1vdmUoJmRpc2tsYWJlbGJ1ZmZlcltCU0RfTEFCRUxTRUNUT1IgKiBTRUNUT1JfU0laRSArIEJTRF9MQUJFTE9GRlNFVF0sCisJCWQsIHNpemVvZihzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwpKTsKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSAmJiBCU0RfTEFCRUxTRUNUT1IgPT0gMAorCWFscGhhX2Jvb3RibG9ja19jaGVja3N1bShkaXNrbGFiZWxidWZmZXIpOworCXNlZWtfc2VjdG9yKDApOworCXh3cml0ZShkZXZfZmQsIGRpc2tsYWJlbGJ1ZmZlciwgQlNEX0JCU0laRSk7CisjZWxzZQorCXNlZWtfc2VjdG9yKHNlY3Rvcik7CisJbHNlZWsoZGV2X2ZkLCBCU0RfTEFCRUxPRkZTRVQsIFNFRUtfQ1VSKTsKKwl4d3JpdGUoZGV2X2ZkLCBkLCBzaXplb2YoKmQpKTsKKyNlbmRpZgorCXN5bmNfZGlza3MoKTsKKwlyZXR1cm4gMTsKK30KKworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorc3RhdGljIGludAoreGJzZF90cmFuc2xhdGVfZnN0eXBlKGludCBsaW51eF90eXBlKQoreworCXN3aXRjaCAobGludXhfdHlwZSkgeworCWNhc2UgMHgwMTogLyogRE9TIDEyLWJpdCBGQVQgICAqLworCWNhc2UgMHgwNDogLyogRE9TIDE2LWJpdCA8MzJNICAqLworCWNhc2UgMHgwNjogLyogRE9TIDE2LWJpdCA+PTMyTSAqLworCWNhc2UgMHhlMTogLyogRE9TIGFjY2VzcyAgICAgICAqLworCWNhc2UgMHhlMzogLyogRE9TIFIvTyAgICAgICAgICAqLworCWNhc2UgMHhmMjogLyogRE9TIHNlY29uZGFyeSAgICAqLworCQlyZXR1cm4gQlNEX0ZTX01TRE9TOworCWNhc2UgMHgwNzogLyogT1MvMiBIUEZTICAgICAgICAqLworCQlyZXR1cm4gQlNEX0ZTX0hQRlM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEJTRF9GU19PVEhFUjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX2xpbmtfcGFydCh2b2lkKQoreworCWludCBrLCBpOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisKKwlrID0gZ2V0X3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpOworCisJaWYgKCF4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oJmkpKQorCQlyZXR1cm47CisKKwlwID0gZ2V0X3BhcnRfdGFibGUoayk7CisKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9zaXplICAgPSBnZXRfbnJfc2VjdHMocCk7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfb2Zmc2V0ID0gZ2V0X3N0YXJ0X3NlY3QocCk7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfZnN0eXBlID0geGJzZF90cmFuc2xhdGVfZnN0eXBlKHAtPnN5c19pbmQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyB2b2lkCithbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oY2hhciAqYm9vdCkKK3sKKwl1aW50NjRfdCAqZHAsIHN1bTsKKwlpbnQgaTsKKworCWRwID0gKHVpbnQ2NF90ICopYm9vdDsKKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKQorCQlzdW0gKz0gZHBbaV07CisJZHBbNjNdID0gc3VtOworfQorI2VuZGlmIC8qIF9fYWxwaGFfXyAqLworCisvKiBVbmRlZmluZSAnZ2xvYmFsJyB0cmlja3MgKi8KKyN1bmRlZiBkaXNrbGFiZWxidWZmZXIKKyN1bmRlZiB4YnNkX2RsYWJlbAorCisjZW5kaWYgLyogT1NGX0xBQkVMICovCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkaXNrX3NnaS5jIGIvdXRpbC1saW51eC9mZGlza19zZ2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODVmYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mZGlza19zZ2kuYwpAQCAtMCwwICsxLDg4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgQW5kcmVhcyBOZXVwZXIsIFNlcCAxOTk4LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorCisjZGVmaW5lIFNHSV9ERUJVRyAwCisKKyNkZWZpbmUgU0dJX1ZPTEhEUiAgICAgIDB4MDAKKy8qIDEgYW5kIDIgd2VyZSB1c2VkIGZvciBkcml2ZSB0eXBlcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IFNHSSAqLworI2RlZmluZSBTR0lfU1dBUCAgICAgICAgMHgwMworLyogNCBhbmQgNSB3ZXJlIGZvciBmaWxlc3lzdGVtIHR5cGVzIFNHSSBoYXZlbid0IGV2ZXIgc3VwcG9ydGVkIG9uIE1JUFMgQ1BVcyAqLworI2RlZmluZSBTR0lfVk9MVU1FICAgICAgMHgwNgorI2RlZmluZSBTR0lfRUZTICAgICAgICAgMHgwNworI2RlZmluZSBTR0lfTFZPTCAgICAgICAgMHgwOAorI2RlZmluZSBTR0lfUkxWT0wgICAgICAgMHgwOQorI2RlZmluZSBTR0lfWEZTICAgICAgICAgMHgwYQorI2RlZmluZSBTR0lfWEZTTE9HICAgICAgMHgwYgorI2RlZmluZSBTR0lfWExWICAgICAgICAgMHgwYworI2RlZmluZSBTR0lfWFZNICAgICAgICAgMHgwZAorI2RlZmluZSBTR0lfRU5USVJFX0RJU0sgU0dJX1ZPTFVNRQorCitzdHJ1Y3QgZGV2aWNlX3BhcmFtZXRlciB7IC8qIDQ4IGJ5dGVzICovCisJdW5zaWduZWQgY2hhciAgc2tldzsKKwl1bnNpZ25lZCBjaGFyICBnYXAxOworCXVuc2lnbmVkIGNoYXIgIGdhcDI7CisJdW5zaWduZWQgY2hhciAgc3BhcmVjeWw7CisJdW5zaWduZWQgc2hvcnQgcGN5bGNvdW50OworCXVuc2lnbmVkIHNob3J0IGhlYWRfdm9sMDsKKwl1bnNpZ25lZCBzaG9ydCBudHJrczsgICAvKiB0cmFja3MgaW4gY3lsIDAgb3Igdm9sIDAgKi8KKwl1bnNpZ25lZCBjaGFyICBjbWRfdGFnX3F1ZXVlX2RlcHRoOworCXVuc2lnbmVkIGNoYXIgIHVudXNlZDA7CisJdW5zaWduZWQgc2hvcnQgdW51c2VkMTsKKwl1bnNpZ25lZCBzaG9ydCBuc2VjdDsgICAvKiBzZWN0b3JzL3RyYWNrcyBpbiBjeWwgMCBvciB2b2wgMCAqLworCXVuc2lnbmVkIHNob3J0IGJ5dGVzOworCXVuc2lnbmVkIHNob3J0IGlsZmFjdDsKKwl1bnNpZ25lZCBpbnQgICBmbGFnczsgICAvKiBjb250cm9sbGVyIGZsYWdzICovCisJdW5zaWduZWQgaW50ICAgZGF0YXJhdGU7CisJdW5zaWduZWQgaW50ICAgcmV0cmllc19vbl9lcnJvcjsKKwl1bnNpZ25lZCBpbnQgICBtc19wZXJfd29yZDsKKwl1bnNpZ25lZCBzaG9ydCB4eWxvZ2ljc19nYXAxOworCXVuc2lnbmVkIHNob3J0IHh5bG9naWNzX3N5bmNkZWxheTsKKwl1bnNpZ25lZCBzaG9ydCB4eWxvZ2ljc19yZWFkZGVsYXk7CisJdW5zaWduZWQgc2hvcnQgeHlsb2dpY3NfZ2FwMjsKKwl1bnNpZ25lZCBzaG9ydCB4eWxvZ2ljc19yZWFkZ2F0ZTsKKwl1bnNpZ25lZCBzaG9ydCB4eWxvZ2ljc193cml0ZWNvbnQ7Cit9OworCisvKgorICogY29udHJvbGxlciBmbGFncworICovCisjZGVmaW5lIFNFQ1RPUl9TTElQICAgICAweDAxCisjZGVmaW5lIFNFQ1RPUl9GV0QgICAgICAweDAyCisjZGVmaW5lIFRSQUNLX0ZXRCAgICAgICAweDA0CisjZGVmaW5lIFRSQUNLX01VTFRJVk9MICAweDA4CisjZGVmaW5lIElHTk9SRV9FUlJPUlMgICAweDEwCisjZGVmaW5lIFJFU0VFSyAgICAgICAgICAweDIwCisjZGVmaW5lIEVOQUJMRV9DTURUQUdRICAweDQwCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgICBtYWdpYzsgICAgICAgICAgICAvKiBleHBlY3QgU0dJX0xBQkVMX01BR0lDICovCisJdW5zaWduZWQgc2hvcnQgYm9vdF9wYXJ0OyAgICAgICAgLyogYWN0aXZlIGJvb3QgcGFydGl0aW9uICovCisJdW5zaWduZWQgc2hvcnQgc3dhcF9wYXJ0OyAgICAgICAgLyogYWN0aXZlIHN3YXAgcGFydGl0aW9uICovCisJdW5zaWduZWQgY2hhciAgYm9vdF9maWxlWzE2XTsgICAgLyogbmFtZSBvZiB0aGUgYm9vdGZpbGUgKi8KKwlzdHJ1Y3QgZGV2aWNlX3BhcmFtZXRlciBkZXZwYXJhbTsgICAgICAgLyogIDEgKiA0OCBieXRlcyAqLworCXN0cnVjdCB2b2x1bWVfZGlyZWN0b3J5IHsgICAgICAgICAgICAgICAvKiAxNSAqIDE2IGJ5dGVzICovCisJCXVuc2lnbmVkIGNoYXIgdm9sX2ZpbGVfbmFtZVs4XTsgLyogYSBjaGFyYWN0ZXIgYXJyYXkgKi8KKwkJdW5zaWduZWQgaW50ICB2b2xfZmlsZV9zdGFydDsgICAvKiBudW1iZXIgb2YgbG9naWNhbCBibG9jayAqLworCQl1bnNpZ25lZCBpbnQgIHZvbF9maWxlX3NpemU7ICAgIC8qIG51bWJlciBvZiBieXRlcyAqLworCX0gZGlyZWN0b3J5WzE1XTsKKwlzdHJ1Y3Qgc2dpX3BhcnRpbmZvIHsgICAgICAgICAgICAgICAgICAgLyogMTYgKiAxMiBieXRlcyAqLworCQl1bnNpZ25lZCBpbnQgbnVtX3NlY3RvcnM7ICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKwkJdW5zaWduZWQgaW50IHN0YXJ0X3NlY3RvcjsgICAgICAvKiBtdXN0IGJlIGN5bGluZGVyIGFsaWduZWQgKi8KKwkJdW5zaWduZWQgaW50IGlkOworCX0gcGFydGl0aW9uc1sxNl07CisJdW5zaWduZWQgaW50ICAgY3N1bTsKKwl1bnNpZ25lZCBpbnQgICBmaWxsYnl0ZXM7Cit9IHNnaV9wYXJ0aXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgICBtYWdpYzsgICAgICAgICAgIC8qIGxvb2tzIGxpa2UgYSBtYWdpYyBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgICBhMjsKKwl1bnNpZ25lZCBpbnQgICBhMzsKKwl1bnNpZ25lZCBpbnQgICBhNDsKKwl1bnNpZ25lZCBpbnQgICBiMTsKKwl1bnNpZ25lZCBzaG9ydCBiMjsKKwl1bnNpZ25lZCBzaG9ydCBiMzsKKwl1bnNpZ25lZCBpbnQgICBjWzE2XTsKKwl1bnNpZ25lZCBzaG9ydCBkWzNdOworCXVuc2lnbmVkIGNoYXIgIHNjc2lfc3RyaW5nWzUwXTsKKwl1bnNpZ25lZCBjaGFyICBzZXJpYWxbMTM3XTsKKwl1bnNpZ25lZCBzaG9ydCBjaGVjazE4MTY7CisJdW5zaWduZWQgY2hhciAgaW5zdGFsbGVyWzIyNV07Cit9IHNnaWluZm87CisKKyNkZWZpbmUgU0dJX0xBQkVMX01BR0lDICAgICAgICAgMHgwYmU1YTk0MQorI2RlZmluZSBTR0lfTEFCRUxfTUFHSUNfU1dBUFBFRCAweDQxYTllNTBiCisjZGVmaW5lIFNHSV9JTkZPX01BR0lDICAgICAgICAgIDB4MDAwNzI5NTkKKyNkZWZpbmUgU0dJX0lORk9fTUFHSUNfU1dBUFBFRCAgMHg1OTI5MDcwMAorCisjZGVmaW5lIFNHSV9TU1dBUDE2KHgpIChzZ2lfb3RoZXJfZW5kaWFuID8gZmRpc2tfc3dhcDE2KHgpIDogKHVpbnQxNl90KSh4KSkKKyNkZWZpbmUgU0dJX1NTV0FQMzIoeCkgKHNnaV9vdGhlcl9lbmRpYW4gPyBmZGlza19zd2FwMzIoeCkgOiAodWludDMyX3QpKHgpKQorCisjZGVmaW5lIHNnaWxhYmVsICgoc2dpX3BhcnRpdGlvbiAqKU1CUmJ1ZmZlcikKKyNkZWZpbmUgc2dpcGFyYW0gKHNnaWxhYmVsLT5kZXZwYXJhbSkKKworLyoKKyAqCisgKiBmZGlza3NnaWxhYmVsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJlYXMgTmV1cGVyLCBTZXAgMTk5OC4KKyAqICAgICAgVGhpcyBmaWxlIG1heSBiZSBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCB1bmRlcgorICogICAgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBTYXQgTWFyIDIwIEVTVCAxOTk5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogICAgICBJbnRlcm5hdGlvbmFsaXphdGlvbgorICovCisKKworc3RhdGljIHNtYWxsaW50IHNnaV9vdGhlcl9lbmRpYW47IC8qIGJvb2wgKi8KK3N0YXRpYyBzbWFsbGludCBzZ2lfdm9sdW1lcyA9IDE7IC8qIG1heCAxNSAqLworCisvKgorICogb25seSBkZWFsaW5nIHdpdGggZnJlZSBibG9ja3MgaGVyZQorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZmlyc3Q7CisJdW5zaWduZWQgaW50IGxhc3Q7Cit9IGZyZWVibG9ja3M7CitzdGF0aWMgZnJlZWJsb2NrcyBmcmVlbGlzdFsxN107IC8qIDE2IHBhcnRpdGlvbnMgY2FuIHByb2R1Y2UgMTcgdmFjYW50IHNsb3RzICovCisKK3N0YXRpYyB2b2lkCitzZXRmcmVlbGlzdChpbnQgaSwgdW5zaWduZWQgaW50IGYsIHVuc2lnbmVkIGludCBsKQoreworCWZyZWVsaXN0W2ldLmZpcnN0ID0gZjsKKwlmcmVlbGlzdFtpXS5sYXN0ID0gbDsKK30KKworc3RhdGljIHZvaWQKK2FkZDJmcmVlbGlzdCh1bnNpZ25lZCBpbnQgZiwgdW5zaWduZWQgaW50IGwpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCisJCWlmIChmcmVlbGlzdFtpXS5sYXN0ID09IDApCisJCQlicmVhazsKKwlzZXRmcmVlbGlzdChpLCBmLCBsKTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFyZnJlZWxpc3Qodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKQorCQlzZXRmcmVlbGlzdChpLCAwLCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraXNpbmZyZWVsaXN0KHVuc2lnbmVkIGludCBiKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCisJCWlmIChmcmVlbGlzdFtpXS5maXJzdCA8PSBiICYmIGZyZWVsaXN0W2ldLmxhc3QgPj0gYikKKwkJCXJldHVybiBmcmVlbGlzdFtpXS5sYXN0OworCXJldHVybiAwOworfQorCS8qIHJldHVybiBsYXN0IHZhY2FudCBibG9jayBvZiB0aGlzIHN0cmlkZSAobmV2ZXIgMCkuICovCisJLyogdGhlICc+PScgaXMgbm90IHF1aXRlIGNvcnJlY3QsIGJ1dCBzaW1wbGlmaWVzIHRoZSBjb2RlICovCisvKgorICogZW5kIG9mIGZyZWUgYmxvY2tzIHNlY3Rpb24KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2dpX3N5c190eXBlc1tdID0geworLyogU0dJX1ZPTEhEUiAgICovCSJceDAwIiAiU0dJIHZvbGhkciIgICwKKy8qIDB4MDEgICAgICAgICAqLwkiXHgwMSIgIlNHSSB0cmtyZXBsIiAsCisvKiAweDAyICAgICAgICAgKi8JIlx4MDIiICJTR0kgc2VjcmVwbCIgLAorLyogU0dJX1NXQVAgICAgICovCSJceDAzIiAiU0dJIHJhdyIgICAgICwKKy8qIDB4MDQgICAgICAgICAqLwkiXHgwNCIgIlNHSSBic2QiICAgICAsCisvKiAweDA1ICAgICAgICAgKi8JIlx4MDUiICJTR0kgc3lzdiIgICAgLAorLyogU0dJX0VOVElSRV9ESVNLICAqLwkiXHgwNiIgIlNHSSB2b2x1bWUiICAsCisvKiBTR0lfRUZTICAgICAgKi8JIlx4MDciICJTR0kgZWZzIiAgICAgLAorLyogMHgwOCAgICAgICAgICovCSJceDA4IiAiU0dJIGx2b2wiICAgICwKKy8qIDB4MDkgICAgICAgICAqLwkiXHgwOSIgIlNHSSBybHZvbCIgICAsCisvKiBTR0lfWEZTICAgICAgKi8JIlx4MGEiICJTR0kgeGZzIiAgICAgLAorLyogU0dJX1hGU0xPRyAgICovCSJceDBiIiAiU0dJIHhmc2xvZyIgICwKKy8qIFNHSV9YTFYgICAgICAqLwkiXHgwYyIgIlNHSSB4bHYiICAgICAsCisvKiBTR0lfWFZNICAgICAgKi8JIlx4MGQiICJTR0kgeHZtIiAgICAgLAorLyogTElOVVhfU1dBUCAgICovCSJceDgyIiAiTGludXggc3dhcCIgICwKKy8qIExJTlVYX05BVElWRSAqLwkiXHg4MyIgIkxpbnV4IG5hdGl2ZSIsCisvKiBMSU5VWF9MVk0gICAgKi8JIlx4OGQiICJMaW51eCBMVk0iICAgLAorLyogTElOVVhfUkFJRCAgICovCSJceGZkIiAiTGludXggUkFJRCIgICwKKwkJCU5VTEwKK307CisKKworc3RhdGljIGludAorc2dpX2dldF9uc2VjdCh2b2lkKQoreworCXJldHVybiBTR0lfU1NXQVAxNihzZ2lsYWJlbC0+ZGV2cGFyYW0ubnNlY3QpOworfQorCitzdGF0aWMgaW50CitzZ2lfZ2V0X250cmtzKHZvaWQpCit7CisJcmV0dXJuIFNHSV9TU1dBUDE2KHNnaWxhYmVsLT5kZXZwYXJhbS5udHJrcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3R3b19zX2NvbXBsZW1lbnRfMzJiaXRfc3VtKHVuc2lnbmVkIGludCogYmFzZSwgaW50IHNpemUgLyogaW4gYnl0ZXMgKi8pCit7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGludCBzdW0gPSAwOworCisJc2l6ZSAvPSBzaXplb2YodW5zaWduZWQgaW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlzdW0gLT0gU0dJX1NTV0FQMzIoYmFzZVtpXSk7CisJcmV0dXJuIHN1bTsKK30KKwordm9pZCBCVUdfYmFkX3NnaV9wYXJ0aXRpb25fc2l6ZSh2b2lkKTsKKworc3RhdGljIGludAorY2hlY2tfc2dpX2xhYmVsKHZvaWQpCit7CisJaWYgKHNpemVvZihzZ2lfcGFydGl0aW9uKSA+IDUxMikgeworCQkvKiBBY2NvcmRpbmcgdG8gTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMgdGhlIGxhYmVsCisJCSAqIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIDUxMiBieXRlcyAqLworCQlCVUdfYmFkX3NnaV9wYXJ0aXRpb25fc2l6ZSgpOworCX0KKworCWlmIChzZ2lsYWJlbC0+bWFnaWMgIT0gU0dJX0xBQkVMX01BR0lDCisJICYmIHNnaWxhYmVsLT5tYWdpYyAhPSBTR0lfTEFCRUxfTUFHSUNfU1dBUFBFRAorCSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9ET1M7CisJCXJldHVybiAwOworCX0KKworCXNnaV9vdGhlcl9lbmRpYW4gPSAoc2dpbGFiZWwtPm1hZ2ljID09IFNHSV9MQUJFTF9NQUdJQ19TV0FQUEVEKTsKKwkvKgorCSAqIHRlc3QgZm9yIGNvcnJlY3QgY2hlY2tzdW0KKwkgKi8KKwlpZiAodHdvX3NfY29tcGxlbWVudF8zMmJpdF9zdW0oKHVuc2lnbmVkIGludCopc2dpbGFiZWwsCisJCQkJc2l6ZW9mKCpzZ2lsYWJlbCkpKSB7CisJCXByaW50ZigiRGV0ZWN0ZWQgc2dpIGRpc2tsYWJlbCB3aXRoIHdyb25nIGNoZWNrc3VtXG4iKTsKKwl9CisJdXBkYXRlX3VuaXRzKCk7CisJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfU0dJOworCWdfcGFydGl0aW9ucyA9IDE2OworCXNnaV92b2x1bWVzID0gMTU7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NnaV9nZXRfc3RhcnRfc2VjdG9yKGludCBpKQoreworCXJldHVybiBTR0lfU1NXQVAzMihzZ2lsYWJlbC0+cGFydGl0aW9uc1tpXS5zdGFydF9zZWN0b3IpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitzZ2lfZ2V0X251bV9zZWN0b3JzKGludCBpKQoreworCXJldHVybiBTR0lfU1NXQVAzMihzZ2lsYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycyk7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9nZXRfc3lzaWQoaW50IGkpCit7CisJcmV0dXJuIFNHSV9TU1dBUDMyKHNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLmlkKTsKK30KKworc3RhdGljIGludAorc2dpX2dldF9ib290cGFydGl0aW9uKHZvaWQpCit7CisJcmV0dXJuIFNHSV9TU1dBUDE2KHNnaWxhYmVsLT5ib290X3BhcnQpOworfQorCitzdGF0aWMgaW50CitzZ2lfZ2V0X3N3YXBwYXJ0aXRpb24odm9pZCkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMTYoc2dpbGFiZWwtPnN3YXBfcGFydCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfbGlzdF90YWJsZShpbnQgeHRyYSkKK3sKKwlpbnQgaSwgdywgd2Q7CisJaW50IGtwaSA9IDA7ICAgICAgICAgICAgICAgIC8qIGtlcm5lbCBwYXJ0aXRpb24gSUQgKi8KKworCWlmICh4dHJhKSB7CisJCXByaW50ZigiXG5EaXNrICVzIChTR0kgZGlzayBsYWJlbCk6ICV1IGhlYWRzLCAldSBzZWN0b3JzXG4iCisJCQkiJXUgY3lsaW5kZXJzLCAldSBwaHlzaWNhbCBjeWxpbmRlcnNcbiIKKwkJCSIldSBleHRyYSBzZWN0cy9jeWwsIGludGVybGVhdmUgJXU6MVxuIgorCQkJIiVzXG4iCisJCQkiVW5pdHMgPSAlcyBvZiAldSAqIDUxMiBieXRlc1xuXG4iLAorCQkJZGlza19kZXZpY2UsIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMsCisJCQlTR0lfU1NXQVAxNihzZ2lwYXJhbS5wY3lsY291bnQpLAorCQkJU0dJX1NTV0FQMTYoc2dpcGFyYW0uc3BhcmVjeWwpLAorCQkJU0dJX1NTV0FQMTYoc2dpcGFyYW0uaWxmYWN0KSwKKwkJCShjaGFyICopc2dpbGFiZWwsCisJCQlzdHJfdW5pdHMoUExVUkFMKSwgdW5pdHNfcGVyX3NlY3Rvcik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJcbkRpc2sgJXMgKFNHSSBkaXNrIGxhYmVsKTogIgorCQkJIiV1IGhlYWRzLCAldSBzZWN0b3JzLCAldSBjeWxpbmRlcnNcbiIKKwkJCSJVbml0cyA9ICVzIG9mICV1ICogNTEyIGJ5dGVzXG5cbiIsCisJCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBnX2N5bGluZGVycywKKwkJCXN0cl91bml0cyhQTFVSQUwpLCB1bml0c19wZXJfc2VjdG9yICk7CisJfQorCisJdyA9IHN0cmxlbihkaXNrX2RldmljZSk7CisJd2QgPSBzaXplb2YoIkRldmljZSIpIC0gMTsKKwlpZiAodyA8IHdkKQorCXcgPSB3ZDsKKworCXByaW50ZigiLS0tLS0gcGFydGl0aW9ucyAtLS0tLVxuIgorCQkiUHQjICUqcyAgSW5mbyAgICAgU3RhcnQgICAgICAgRW5kICAgU2VjdG9ycyAgSWQgIFN5c3RlbVxuIiwKKwkJdyArIDIsICJEZXZpY2UiKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMoaSkgfHwgU0dJX0RFQlVHKSB7CisJCQl1aW50MzJfdCBzdGFydCA9IHNnaV9nZXRfc3RhcnRfc2VjdG9yKGkpOworCQkJdWludDMyX3QgbGVuID0gc2dpX2dldF9udW1fc2VjdG9ycyhpKTsKKwkJCWtwaSsrOyAgICAgICAgICAgICAgLyogb25seSBjb3VudCBub25lbXB0eSBwYXJ0aXRpb25zICovCisJCQlwcmludGYoCisJCQkiJTJ1OiAlcyAlNHMgJTlsdSAlOWx1ICU5bHUgICUyeCAgJXNcbiIsCisvKiBmZGlzayBwYXJ0IG51bWJlciAqLwlpKzEsCisvKiBkZXZpY2UgKi8gICAgICAgICAgICBwYXJ0bmFtZShkaXNrX2RldmljZSwga3BpLCB3KzMpLAorLyogZmxhZ3MgKi8gICAgICAgICAgICAgKHNnaV9nZXRfc3dhcHBhcnRpdGlvbigpID09IGkpID8gInN3YXAiIDoKKy8qIGZsYWdzICovICAgICAgICAgICAgIChzZ2lfZ2V0X2Jvb3RwYXJ0aXRpb24oKSA9PSBpKSA/ICJib290IiA6ICIgICAgIiwKKy8qIHN0YXJ0ICovICAgICAgICAgICAgIChsb25nKSBzY3JvdW5kKHN0YXJ0KSwKKy8qIGVuZCAqLyAgICAgICAgICAgICAgIChsb25nKSBzY3JvdW5kKHN0YXJ0K2xlbiktMSwKKy8qIG5vIG9kZCBmbGFnIG9uIGVuZCAqLyhsb25nKSBsZW4sCisvKiB0eXBlIGlkICovICAgICAgICAgICBzZ2lfZ2V0X3N5c2lkKGkpLAorLyogdHlwZSBuYW1lICovICAgICAgICAgcGFydGl0aW9uX3R5cGUoc2dpX2dldF9zeXNpZChpKSkpOworCQl9CisJfQorCXByaW50ZigiLS0tLS0gQm9vdGluZm8gLS0tLS1cbkJvb3RmaWxlOiAlc1xuIgorCQkiLS0tLS0gRGlyZWN0b3J5IEVudHJpZXMgLS0tLS1cbiIsCisJCXNnaWxhYmVsLT5ib290X2ZpbGUpOworCWZvciAoaSA9IDA7IGkgPCBzZ2lfdm9sdW1lczsgaSsrKSB7CisJCWlmIChzZ2lsYWJlbC0+ZGlyZWN0b3J5W2ldLnZvbF9maWxlX3NpemUpIHsKKwkJCXVpbnQzMl90IHN0YXJ0ID0gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPmRpcmVjdG9yeVtpXS52b2xfZmlsZV9zdGFydCk7CisJCQl1aW50MzJfdCBsZW4gPSBTR0lfU1NXQVAzMihzZ2lsYWJlbC0+ZGlyZWN0b3J5W2ldLnZvbF9maWxlX3NpemUpOworCQkJdW5zaWduZWQgY2hhciAqbmFtZSA9IHNnaWxhYmVsLT5kaXJlY3RvcnlbaV0udm9sX2ZpbGVfbmFtZTsKKworCQkJcHJpbnRmKCIlMnU6ICUtMTBzIHNlY3RvciU1dSBzaXplJTh1XG4iLAorCQkJCWksIChjaGFyKiluYW1lLCAodW5zaWduZWQgaW50KSBzdGFydCwgKHVuc2lnbmVkIGludCkgbGVuKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfYm9vdHBhcnRpdGlvbihpbnQgaSkKK3sKKwlzZ2lsYWJlbC0+Ym9vdF9wYXJ0ID0gU0dJX1NTV0FQMTYoKChzaG9ydClpKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NnaV9nZXRfbGFzdGJsb2NrKHZvaWQpCit7CisJcmV0dXJuIGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVyczsKK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfc3dhcHBhcnRpdGlvbihpbnQgaSkKK3sKKwlzZ2lsYWJlbC0+c3dhcF9wYXJ0ID0gU0dJX1NTV0FQMTYoKChzaG9ydClpKSk7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9jaGVja19ib290ZmlsZShjb25zdCBjaGFyKiBhRmlsZSkKK3sKKwlpZiAoc3RybGVuKGFGaWxlKSA8IDMpIC8qICIvYVxuIiBpcyBtaW5pbXVtICovIHsKKwkJcHJpbnRmKCJcbkludmFsaWQgQm9vdGZpbGUhXG4iCisJCQkiXHRUaGUgYm9vdGZpbGUgbXVzdCBiZSBhbiBhYnNvbHV0ZSBub24temVybyBwYXRobmFtZSxcbiIKKwkJCSJcdGUuZy4gXCIvdW5peFwiIG9yIFwiL3VuaXguc2F2ZVwiLlxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RybGVuKGFGaWxlKSA+IDE2KSB7CisJCXByaW50ZigiXG5OYW1lIG9mIEJvb3RmaWxlIHRvbyBsb25nICg+MTYgYnl0ZXMpXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhRmlsZVswXSAhPSAnLycpIHsKKwkJcHJpbnRmKCJcbkJvb3RmaWxlIG11c3QgaGF2ZSBhIGZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RybmNtcChhRmlsZSwgKGNoYXIqKXNnaWxhYmVsLT5ib290X2ZpbGUsIDE2KSkgeworCQlwcmludGYoIlxuQmUgYXdhcmUsIHRoYXQgdGhlIGJvb3RmaWxlIGlzIG5vdCBjaGVja2VkIGZvciBleGlzdGVuY2UuXG4iCisJCQkgIlx0U0dJJ3MgZGVmYXVsdCBpcyBcIi91bml4XCIgYW5kIGZvciBiYWNrdXAgXCIvdW5peC5zYXZlXCIuXG4iKTsKKwkJLyogZmlsZW5hbWUgaXMgY29ycmVjdCBhbmQgZGlkIGNoYW5nZSAqLworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7ICAgLyogZmlsZW5hbWUgZGlkIG5vdCBjaGFuZ2UgKi8KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2dpX2dldF9ib290ZmlsZSh2b2lkKQoreworCXJldHVybiAoY2hhciopc2dpbGFiZWwtPmJvb3RfZmlsZTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfYm9vdGZpbGUoY29uc3QgY2hhciogYUZpbGUpCit7CisJaW50IGkgPSAwOworCisJaWYgKHNnaV9jaGVja19ib290ZmlsZShhRmlsZSkpIHsKKwkJd2hpbGUgKGkgPCAxNikgeworCQkJaWYgKChhRmlsZVtpXSAhPSAnXG4nKSAgLyogaW4gcHJpbmNpcGxlIGNhdWdodCBhZ2FpbiBieSBuZXh0IGxpbmUgKi8KKwkJCSAmJiAoc3RybGVuKGFGaWxlKSA+IGkpKQorCQkJCXNnaWxhYmVsLT5ib290X2ZpbGVbaV0gPSBhRmlsZVtpXTsKKwkJCWVsc2UKKwkJCQlzZ2lsYWJlbC0+Ym9vdF9maWxlW2ldID0gMDsKKwkJCWkrKzsKKwkJfQorCQlwcmludGYoIlxuXHRCb290ZmlsZSBpcyBjaGFuZ2VkIHRvIFwiJXNcIlxuIiwgc2dpbGFiZWwtPmJvb3RfZmlsZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY3JlYXRlX3NnaWluZm8odm9pZCkKK3sKKwkvKiBJIGtlZXAgU0dJJ3MgaGFiaXQgdG8gd3JpdGUgdGhlIHNnaWxhYmVsIHRvIHRoZSBzZWNvbmQgYmxvY2sgKi8KKwlzZ2lsYWJlbC0+ZGlyZWN0b3J5WzBdLnZvbF9maWxlX3N0YXJ0ID0gU0dJX1NTV0FQMzIoMik7CisJc2dpbGFiZWwtPmRpcmVjdG9yeVswXS52b2xfZmlsZV9zaXplID0gU0dJX1NTV0FQMzIoc2l6ZW9mKHNnaWluZm8pKTsKKwlzdHJuY3B5KChjaGFyKilzZ2lsYWJlbC0+ZGlyZWN0b3J5WzBdLnZvbF9maWxlX25hbWUsICJzZ2lsYWJlbCIsIDgpOworfQorCitzdGF0aWMgc2dpaW5mbyAqZmlsbF9zZ2lpbmZvKHZvaWQpOworCitzdGF0aWMgdm9pZAorc2dpX3dyaXRlX3RhYmxlKHZvaWQpCit7CisJc2dpbGFiZWwtPmNzdW0gPSAwOworCXNnaWxhYmVsLT5jc3VtID0gU0dJX1NTV0FQMzIodHdvX3NfY29tcGxlbWVudF8zMmJpdF9zdW0oCisJCQkodW5zaWduZWQgaW50KilzZ2lsYWJlbCwgc2l6ZW9mKCpzZ2lsYWJlbCkpKTsKKwlhc3NlcnQodHdvX3NfY29tcGxlbWVudF8zMmJpdF9zdW0oCisJCSh1bnNpZ25lZCBpbnQqKXNnaWxhYmVsLCBzaXplb2YoKnNnaWxhYmVsKSkgPT0gMCk7CisKKwl3cml0ZV9zZWN0b3IoMCwgc2dpbGFiZWwpOworCWlmICghc3RybmNtcCgoY2hhciopc2dpbGFiZWwtPmRpcmVjdG9yeVswXS52b2xfZmlsZV9uYW1lLCAic2dpbGFiZWwiLCA4KSkgeworCQkvKgorCQkgKiBrZWVwIHRoaXMgaGFiaXQgb2YgZmlyc3Qgd3JpdGluZyB0aGUgInNnaWxhYmVsIi4KKwkJICogSSBuZXZlciB0ZXN0ZWQgd2hldGhlciBpdCB3b3JrcyB3aXRob3V0IChBTiA5ODEwMDIpLgorCQkgKi8KKwkJc2dpaW5mbyAqaW5mbyA9IGZpbGxfc2dpaW5mbygpOworCQlpbnQgaW5mb3N0YXJ0YmxvY2sgPSBTR0lfU1NXQVAzMihzZ2lsYWJlbC0+ZGlyZWN0b3J5WzBdLnZvbF9maWxlX3N0YXJ0KTsKKwkJd3JpdGVfc2VjdG9yKGluZm9zdGFydGJsb2NrLCBpbmZvKTsKKwkJZnJlZShpbmZvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfc3RhcnQoaW50ICp4LCBpbnQgKnkpCit7CisJLyoKKwkgKiBzb3J0IGFjY29yZGluZyB0byBzdGFydCBzZWN0b3JzCisJICogYW5kIHByZWZlcnMgbGFyZ2VzdCBwYXJ0aXRpb246CisJICogZW50cnkgemVybyBpcyBlbnRpcmUgZGlzayBlbnRyeQorCSAqLworCXVuc2lnbmVkIGludCBpID0gKng7CisJdW5zaWduZWQgaW50IGogPSAqeTsKKwl1bnNpZ25lZCBpbnQgYSA9IHNnaV9nZXRfc3RhcnRfc2VjdG9yKGkpOworCXVuc2lnbmVkIGludCBiID0gc2dpX2dldF9zdGFydF9zZWN0b3Ioaik7CisJdW5zaWduZWQgaW50IGMgPSBzZ2lfZ2V0X251bV9zZWN0b3JzKGkpOworCXVuc2lnbmVkIGludCBkID0gc2dpX2dldF9udW1fc2VjdG9ycyhqKTsKKworCWlmIChhID09IGIpCisJCXJldHVybiAoZCA+IGMpID8gMSA6IChkID09IGMpID8gMCA6IC0xOworCXJldHVybiAoYSA+IGIpID8gMSA6IC0xOworfQorCisKK3N0YXRpYyBpbnQKK3ZlcmlmeV9zZ2koaW50IHZlcmJvc2UpCit7CisJaW50IEluZGV4WzE2XTsgICAgICAvKiBsaXN0IG9mIHZhbGlkIHBhcnRpdGlvbnMgKi8KKwlpbnQgc29ydGNvdW50ID0gMDsgIC8qIG51bWJlciBvZiB1c2VkIHBhcnRpdGlvbnMsIGkuZS4gbm9uLXplcm8gbGVuZ3RocyAqLworCWludCBlbnRpcmUgPSAwLCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RhcnQgPSAwOworCWxvbmcgbG9uZyBnYXAgPSAwOyAgICAgIC8qIGNvdW50IHVudXNlZCBibG9ja3MgKi8KKwl1bnNpZ25lZCBpbnQgbGFzdGJsb2NrID0gc2dpX2dldF9sYXN0YmxvY2soKTsKKworCWNsZWFyZnJlZWxpc3QoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoc2dpX2dldF9udW1fc2VjdG9ycyhpKSAhPSAwKSB7CisJCQlJbmRleFtzb3J0Y291bnQrK10gPSBpOworCQkJaWYgKHNnaV9nZXRfc3lzaWQoaSkgPT0gU0dJX0VOVElSRV9ESVNLKSB7CisJCQkJaWYgKGVudGlyZSsrID09IDEpIHsKKwkJCQkJaWYgKHZlcmJvc2UpCisJCQkJCQlwcmludGYoIk1vcmUgdGhhbiBvbmUgZW50aXJlIGRpc2sgZW50cnkgcHJlc2VudFxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChzb3J0Y291bnQgPT0gMCkgeworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigiTm8gcGFydGl0aW9ucyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIChsYXN0YmxvY2sgPiAwKSA/IDEgOiAobGFzdGJsb2NrID09IDApID8gMCA6IC0xOworCX0KKwlxc29ydChJbmRleCwgc29ydGNvdW50LCBzaXplb2YoSW5kZXhbMF0pLCAodm9pZCopY29tcGFyZV9zdGFydCk7CisJaWYgKHNnaV9nZXRfc3lzaWQoSW5kZXhbMF0pID09IFNHSV9FTlRJUkVfRElTSykgeworCQlpZiAoKEluZGV4WzBdICE9IDEwKSAmJiB2ZXJib3NlKQorCQkJcHJpbnRmKCJJUklYIGxpa2VzIHdoZW4gUGFydGl0aW9uIDExIGNvdmVycyB0aGUgZW50aXJlIGRpc2tcbiIpOworCQlpZiAoKHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4WzBdKSAhPSAwKSAmJiB2ZXJib3NlKQorCQkJcHJpbnRmKCJUaGUgZW50aXJlIGRpc2sgcGFydGl0aW9uIHNob3VsZCBzdGFydCAiCisJCQkJImF0IGJsb2NrIDAsXG4iCisJCQkJIm5vdCBhdCBkaXNrYmxvY2sgJXVcbiIsCisJCQkJc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbMF0pKTsKKwkJaWYgKFNHSV9ERUJVRykgICAgICAvKiBJIGRvIG5vdCB1bmRlcnN0YW5kIGhvdyBzb21lIGRpc2tzIGZ1bGZpbCBpdCAqLworCQkJaWYgKChzZ2lfZ2V0X251bV9zZWN0b3JzKEluZGV4WzBdKSAhPSBsYXN0YmxvY2spICYmIHZlcmJvc2UpCisJCQkJcHJpbnRmKCJUaGUgZW50aXJlIGRpc2sgcGFydGl0aW9uIGlzIG9ubHkgJXUgZGlza2Jsb2NrIGxhcmdlLFxuIgorCQkJCQkiYnV0IHRoZSBkaXNrIGlzICV1IGRpc2tibG9ja3MgbG9uZ1xuIiwKKwkJCQkJc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFswXSksIGxhc3RibG9jayk7CisJCQlsYXN0YmxvY2sgPSBzZ2lfZ2V0X251bV9zZWN0b3JzKEluZGV4WzBdKTsKKwl9IGVsc2UgeworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigiT25lIFBhcnRpdGlvbiAoIzExKSBzaG91bGQgY292ZXIgdGhlIGVudGlyZSBkaXNrXG4iKTsKKwkJaWYgKFNHSV9ERUJVRyA+IDIpCisJCQlwcmludGYoInN5c2lkPSV1XHRwYXJ0aXRpb249JXVcbiIsCisJCQkJc2dpX2dldF9zeXNpZChJbmRleFswXSksIEluZGV4WzBdKzEpOworCX0KKwlmb3IgKGkgPSAxLCBzdGFydCA9IDA7IGkgPCBzb3J0Y291bnQ7IGkrKykgeworCQlpbnQgY3lsc2l6ZSA9IHNnaV9nZXRfbnNlY3QoKSAqIHNnaV9nZXRfbnRya3MoKTsKKworCQlpZiAoKHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKSAlIGN5bHNpemUpICE9IDApIHsKKwkJCWlmIChTR0lfREVCVUcpICAgICAgLyogSSBkbyBub3QgdW5kZXJzdGFuZCBob3cgc29tZSBkaXNrcyBmdWxmaWwgaXQgKi8KKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lcyBub3Qgc3RhcnQgb24gY3lsaW5kZXIgYm91bmRhcnlcbiIsCisJCQkJCQlJbmRleFtpXSsxKTsKKwkJfQorCQlpZiAoc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFtpXSkgJSBjeWxzaXplICE9IDApIHsKKwkJCWlmIChTR0lfREVCVUcpICAgICAgLyogSSBkbyBub3QgdW5kZXJzdGFuZCBob3cgc29tZSBkaXNrcyBmdWxmaWwgaXQgKi8KKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lcyBub3QgZW5kIG9uIGN5bGluZGVyIGJvdW5kYXJ5XG4iLAorCQkJCQkJSW5kZXhbaV0rMSk7CisJCX0KKwkJLyogV2UgY2Fubm90IGhhbmRsZSBzZXZlcmFsICJlbnRpcmUgZGlzayIgZW50cmllcy4gKi8KKwkJaWYgKHNnaV9nZXRfc3lzaWQoSW5kZXhbaV0pID09IFNHSV9FTlRJUkVfRElTSykgY29udGludWU7CisJCWlmIChzdGFydCA+IHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKSkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRmKCJQYXJ0aXRpb25zICV1IGFuZCAldSBvdmVybGFwIGJ5ICV1IHNlY3RvcnNcbiIsCisJCQkJCUluZGV4W2ktMV0rMSwgSW5kZXhbaV0rMSwKKwkJCQkJc3RhcnQgLSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkpOworCQkJaWYgKGdhcCA+IDApIGdhcCA9IC1nYXA7CisJCQlpZiAoZ2FwID09IDApIGdhcCA9IC0xOworCQl9CisJCWlmIChzdGFydCA8IHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKSkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRmKCJVbnVzZWQgZ2FwIG9mICV1IHNlY3RvcnMgLSBzZWN0b3JzICV1LSV1XG4iLAorCQkJCQlzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkgLSBzdGFydCwKKwkJCQkJc3RhcnQsIHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKS0xKTsKKwkJCWdhcCArPSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkgLSBzdGFydDsKKwkJCWFkZDJmcmVlbGlzdChzdGFydCwgc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pKTsKKwkJfQorCQlzdGFydCA9IHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKQorCQkJICAgKyBzZ2lfZ2V0X251bV9zZWN0b3JzKEluZGV4W2ldKTsKKwkJaWYgKFNHSV9ERUJVRyA+IDEpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiJTJ1OiUxMnVcdCUxMnVcdCUxMnVcbiIsIEluZGV4W2ldLAorCQkJCQlzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSksCisJCQkJCXNnaV9nZXRfbnVtX3NlY3RvcnMoSW5kZXhbaV0pLAorCQkJCQlzZ2lfZ2V0X3N5c2lkKEluZGV4W2ldKSk7CisJCX0KKwl9CisJaWYgKHN0YXJ0IDwgbGFzdGJsb2NrKSB7CisJCWlmICh2ZXJib3NlKQorCQkJcHJpbnRmKCJVbnVzZWQgZ2FwIG9mICV1IHNlY3RvcnMgLSBzZWN0b3JzICV1LSV1XG4iLAorCQkJCWxhc3RibG9jayAtIHN0YXJ0LCBzdGFydCwgbGFzdGJsb2NrLTEpOworCQlnYXAgKz0gbGFzdGJsb2NrIC0gc3RhcnQ7CisJCWFkZDJmcmVlbGlzdChzdGFydCwgbGFzdGJsb2NrKTsKKwl9CisJLyoKKwkgKiBEb25lIHdpdGggYXJpdGhtZXRpY3MKKwkgKiBHbyBmb3IgZGV0YWlscyBub3cKKwkgKi8KKwlpZiAodmVyYm9zZSkgeworCQlpZiAoIXNnaV9nZXRfbnVtX3NlY3RvcnMoc2dpX2dldF9ib290cGFydGl0aW9uKCkpKSB7CisJCQlwcmludGYoIlxuVGhlIGJvb3QgcGFydGl0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJfQorCQlpZiAoIXNnaV9nZXRfbnVtX3NlY3RvcnMoc2dpX2dldF9zd2FwcGFydGl0aW9uKCkpKSB7CisJCQlwcmludGYoIlxuVGhlIHN3YXAgcGFydGl0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2dpX2dldF9zeXNpZChzZ2lfZ2V0X3N3YXBwYXJ0aXRpb24oKSkgIT0gU0dJX1NXQVApCisJCQkgJiYgKHNnaV9nZXRfc3lzaWQoc2dpX2dldF9zd2FwcGFydGl0aW9uKCkpICE9IExJTlVYX1NXQVApKQorCQkJCXByaW50ZigiXG5UaGUgc3dhcCBwYXJ0aXRpb24gaGFzIG5vIHN3YXAgdHlwZVxuIik7CisJCX0KKwkJaWYgKHNnaV9jaGVja19ib290ZmlsZSgiL3VuaXgiKSkKKwkJCXByaW50ZigiXHRZb3UgaGF2ZSBjaG9zZW4gYW4gdW51c3VhbCBib290IGZpbGUgbmFtZVxuIik7CisJfQorCXJldHVybiAoZ2FwID4gMCkgPyAxIDogKGdhcCA9PSAwKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludAorc2dpX2dhcHModm9pZCkKK3sKKwkvKgorCSAqIHJldHVybmVkIHZhbHVlIGlzOgorCSAqICA9IDAgOiBkaXNrIGlzIHByb3Blcmx5IGZpbGxlZCB0byB0aGUgcmltCisJICogIDwgMCA6IHRoZXJlIGlzIGFuIG92ZXJsYXAKKwkgKiAgPiAwIDogdGhlcmUgaXMgc3RpbGwgc29tZSB2YWNhbnQgc3BhY2UKKwkgKi8KKwlyZXR1cm4gdmVyaWZ5X3NnaSgwKTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9jaGFuZ2Vfc3lzaWQoaW50IGksIGludCBzeXMpCit7CisJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMoaSkgPT0gMCkgeyAvKiBjYXVnaHQgYWxyZWFkeSBiZWZvcmUsIC4uLiAqLworCQlwcmludGYoIlNvcnJ5IHlvdSBtYXkgY2hhbmdlIHRoZSBUYWcgb2Ygbm9uLWVtcHR5IHBhcnRpdGlvbnNcbiIpOworCQlyZXR1cm47CisJfQorCWlmICgoc3lzICE9IFNHSV9FTlRJUkVfRElTSykgJiYgKHN5cyAhPSBTR0lfVk9MSERSKQorCSAmJiAoc2dpX2dldF9zdGFydF9zZWN0b3IoaSkgPCAxKQorCSkgeworCQlyZWFkX21heWJlX2VtcHR5KAorCQkJIkl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHRoZSBwYXJ0aXRpb24gYXQgb2Zmc2V0IDBcbiIKKwkJCSJpcyBvZiB0eXBlIFwiU0dJIHZvbGhkclwiLCB0aGUgSVJJWCBzeXN0ZW0gd2lsbCByZWx5IG9uIGl0IHRvXG4iCisJCQkicmV0cmlldmUgZnJvbSBpdHMgZGlyZWN0b3J5IHN0YW5kYWxvbmUgdG9vbHMgbGlrZSBzYXNoIGFuZCBmeC5cbiIKKwkJCSJPbmx5IHRoZSBcIlNHSSB2b2x1bWVcIiBlbnRpcmUgZGlzayBzZWN0aW9uIG1heSB2aW9sYXRlIHRoaXMuXG4iCisJCQkiVHlwZSBZRVMgaWYgeW91IGFyZSBzdXJlIGFib3V0IHRhZ2dpbmcgdGhpcyBwYXJ0aXRpb24gZGlmZmVyZW50bHkuXG4iKTsKKwkJaWYgKHN0cmNtcChsaW5lX3B0ciwgIllFU1xuIikgIT0gMCkKKwkJCXJldHVybjsKKwl9CisJc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0uaWQgPSBTR0lfU1NXQVAzMihzeXMpOworfQorCisvKiByZXR1cm5zIHBhcnRpdGlvbiBpbmRleCBvZiBmaXJzdCBlbnRyeSBtYXJrZWQgYXMgZW50aXJlIGRpc2sgKi8KK3N0YXRpYyBpbnQKK3NnaV9lbnRpcmUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlpZiAoc2dpX2dldF9zeXNpZChpKSA9PSBTR0lfVk9MVU1FKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAorc2dpX3NldF9wYXJ0aXRpb24oaW50IGksIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGxlbmd0aCwgaW50IHN5cykKK3sKKwlzZ2lsYWJlbC0+cGFydGl0aW9uc1tpXS5pZCA9IFNHSV9TU1dBUDMyKHN5cyk7CisJc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMgPSBTR0lfU1NXQVAzMihsZW5ndGgpOworCXNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X3NlY3RvciA9IFNHSV9TU1dBUDMyKHN0YXJ0KTsKKwlzZXRfY2hhbmdlZChpKTsKKwlpZiAoc2dpX2dhcHMoKSA8IDApICAgICAvKiByZWJ1aWxkIGZyZWVsaXN0ICovCisJCXByaW50ZigiUGFydGl0aW9uIG92ZXJsYXAgZGV0ZWN0ZWRcbiIpOworfQorCitzdGF0aWMgdm9pZAorc2dpX3NldF9lbnRpcmUodm9pZCkKK3sKKwlpbnQgbjsKKworCWZvciAobiA9IDEwOyBuIDwgZ19wYXJ0aXRpb25zOyBuKyspIHsKKwkJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKG4pICkgeworCQkJc2dpX3NldF9wYXJ0aXRpb24obiwgMCwgc2dpX2dldF9sYXN0YmxvY2soKSwgU0dJX1ZPTFVNRSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfdm9saGRyKHZvaWQpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSA4OyBuIDwgZ19wYXJ0aXRpb25zOyBuKyspIHsKKwlpZiAoIXNnaV9nZXRfbnVtX3NlY3RvcnMobikpIHsKKwkJLyoKKwkJICogNSBjeWxpbmRlcnMgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlIEkgbGlrZQorCQkgKiBJUklYIDUuMyBzdG9yZWQgZmlsZXMgaW4gdGhlIHZvbHVtZSBoZWFkZXIKKwkJICogKGxpa2Ugc2FzaCwgc3ltbW9uLCBmeCwgaWRlKSB3aXRoIGNhLiAzMjAwCisJCSAqIHNlY3RvcnMuCisJCSAqLworCQlpZiAoZ19oZWFkcyAqIGdfc2VjdG9ycyAqIDUgPCBzZ2lfZ2V0X2xhc3RibG9jaygpKQorCQkJc2dpX3NldF9wYXJ0aXRpb24obiwgMCwgZ19oZWFkcyAqIGdfc2VjdG9ycyAqIDUsIFNHSV9WT0xIRFIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfZGVsZXRlX3BhcnRpdGlvbihpbnQgaSkKK3sKKwlzZ2lfc2V0X3BhcnRpdGlvbihpLCAwLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9hZGRfcGFydGl0aW9uKGludCBuLCBpbnQgc3lzKQoreworCWNoYXIgbWVzZ1syNTZdOworCXVuc2lnbmVkIGludCBmaXJzdCA9IDAsIGxhc3QgPSAwOworCisJaWYgKG4gPT0gMTApIHsKKwkJc3lzID0gU0dJX1ZPTFVNRTsKKwl9IGVsc2UgaWYgKG4gPT0gOCkgeworCQlzeXMgPSAwOworCX0KKwlpZiAoc2dpX2dldF9udW1fc2VjdG9ycyhuKSkgeworCQlwcmludGYobXNnX3BhcnRfYWxyZWFkeV9kZWZpbmVkLCBuICsgMSk7CisJCXJldHVybjsKKwl9CisJaWYgKChzZ2lfZW50aXJlKCkgPT0gLTEpICYmIChzeXMgIT0gU0dJX1ZPTFVNRSkpIHsKKwkJcHJpbnRmKCJBdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGVudGlyZSBkaXNrIGVudHJ5IGF1dG9tYXRpY2FsbHlcbiIpOworCQlzZ2lfc2V0X2VudGlyZSgpOworCQlzZ2lfc2V0X3ZvbGhkcigpOworCX0KKwlpZiAoKHNnaV9nYXBzKCkgPT0gMCkgJiYgKHN5cyAhPSBTR0lfVk9MVU1FKSkgeworCQlwcmludGYoIlRoZSBlbnRpcmUgZGlzayBpcyBhbHJlYWR5IGNvdmVyZWQgd2l0aCBwYXJ0aXRpb25zXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2dpX2dhcHMoKSA8IDApIHsKKwkJcHJpbnRmKCJZb3UgZ290IGEgcGFydGl0aW9uIG92ZXJsYXAgb24gdGhlIGRpc2suIEZpeCBpdCBmaXJzdCFcbiIpOworCQlyZXR1cm47CisJfQorCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwgIkZpcnN0ICVzIiwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHN5cyA9PSBTR0lfVk9MVU1FKSB7CisJCQlsYXN0ID0gc2dpX2dldF9sYXN0YmxvY2soKTsKKwkJCWZpcnN0ID0gcmVhZF9pbnQoMCwgMCwgbGFzdC0xLCAwLCBtZXNnKTsKKwkJCWlmIChmaXJzdCAhPSAwKSB7CisJCQkJcHJpbnRmKCJJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBlbGV2ZW50aCBwYXJ0aXRpb25cbiIKKwkJCQkJCSJjb3ZlcnMgdGhlIGVudGlyZSBkaXNrIGFuZCBpcyBvZiB0eXBlICdTR0kgdm9sdW1lJ1xuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmaXJzdCA9IGZyZWVsaXN0WzBdLmZpcnN0OworCQkJbGFzdCAgPSBmcmVlbGlzdFswXS5sYXN0OworCQkJZmlyc3QgPSByZWFkX2ludChzY3JvdW5kKGZpcnN0KSwgc2Nyb3VuZChmaXJzdCksIHNjcm91bmQobGFzdCktMSwKKwkJCQkwLCBtZXNnKTsKKwkJfQorCQlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCQlmaXJzdCAqPSB1bml0c19wZXJfc2VjdG9yOworCQllbHNlCisJCQlmaXJzdCA9IGZpcnN0OyAvKiBhbGlnbiB0byBjeWxpbmRlciBpZiB5b3Uga25vdyBob3cgLi4uICovCisJCWlmICghbGFzdCApCisJCQlsYXN0ID0gaXNpbmZyZWVsaXN0KGZpcnN0KTsKKwkJaWYgKGxhc3QgIT0gMCkKKwkJCWJyZWFrOworCQlwcmludGYoIllvdSB3aWxsIGdldCBhIHBhcnRpdGlvbiBvdmVybGFwIG9uIHRoZSBkaXNrLiAiCisJCQkJIkZpeCBpdCBmaXJzdCFcbiIpOworCX0KKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICIgTGFzdCAlcyIsIHN0cl91bml0cyhTSU5HVUxBUikpOworCWxhc3QgPSByZWFkX2ludChzY3JvdW5kKGZpcnN0KSwgc2Nyb3VuZChsYXN0KS0xLCBzY3JvdW5kKGxhc3QpLTEsCisJCQlzY3JvdW5kKGZpcnN0KSwgbWVzZykrMTsKKwlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCWxhc3QgKj0gdW5pdHNfcGVyX3NlY3RvcjsKKwllbHNlCisJCWxhc3QgPSBsYXN0OyAvKiBhbGlnbiB0byBjeWxpbmRlciBpZiBZb3Uga25vdyBob3cgLi4uICovCisJaWYgKCAoc3lzID09IFNHSV9WT0xVTUUpICYmIChmaXJzdCAhPSAwIHx8IGxhc3QgIT0gc2dpX2dldF9sYXN0YmxvY2soKSApICkKKwkJcHJpbnRmKCJJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBlbGV2ZW50aCBwYXJ0aXRpb25cbiIKKwkJCSJjb3ZlcnMgdGhlIGVudGlyZSBkaXNrIGFuZCBpcyBvZiB0eXBlICdTR0kgdm9sdW1lJ1xuIik7CisJc2dpX3NldF9wYXJ0aXRpb24obiwgZmlyc3QsIGxhc3QtZmlyc3QsIHN5cyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorc3RhdGljIHZvaWQKK2NyZWF0ZV9zZ2lsYWJlbCh2b2lkKQoreworCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJCXVuc2lnbmVkIGludCBuc2VjdDsKKwkJaW50IHN5c2lkOworCX0gb2xkWzRdOworCWludCBpID0gMDsKKwlsb25nIGxvbmdzZWN0b3JzOyAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBvbiB0aGUgZGV2aWNlICovCisJaW50IHJlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgcmVzdWx0IGZyb20gdGhlIGlvY3RsICovCisJaW50IHNlY19mYWM7ICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc2VjdG9yIGZhY3RvciAqLworCisJc2VjX2ZhYyA9IHNlY3Rvcl9zaXplIC8gNTEyOyAgICAvKiBkZXRlcm1pbmUgdGhlIHNlY3RvciBmYWN0b3IgKi8KKworCXByaW50Zihtc2dfYnVpbGRpbmdfbmV3X2xhYmVsLCAiU0dJIGRpc2tsYWJlbCIpOworCisJc2dpX290aGVyX2VuZGlhbiA9IEJCX0xJVFRMRV9FTkRJQU47CisJcmVzID0gaW9jdGwoZGV2X2ZkLCBCTEtHRVRTSVpFLCAmbG9uZ3NlY3RvcnMpOworCWlmICghaW9jdGwoZGV2X2ZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KSkgeworCQlnX2hlYWRzID0gZ2VvbWV0cnkuaGVhZHM7CisJCWdfc2VjdG9ycyA9IGdlb21ldHJ5LnNlY3RvcnM7CisJCWlmIChyZXMgPT0gMCkgeworCQkJLyogdGhlIGdldCBkZXZpY2Ugc2l6ZSBpb2N0bCB3YXMgc3VjY2Vzc2Z1bCAqLworCQkJZ19jeWxpbmRlcnMgPSBsb25nc2VjdG9ycyAvIChnX2hlYWRzICogZ19zZWN0b3JzKTsKKwkJCWdfY3lsaW5kZXJzIC89IHNlY19mYWM7CisJCX0gZWxzZSB7CisJCQkvKiBvdGhlcndpc2UgcHJpbnQgZXJyb3IgYW5kIHVzZSB0cnVuY2F0ZWQgdmVyc2lvbiAqLworCQkJZ19jeWxpbmRlcnMgPSBnZW9tZXRyeS5jeWxpbmRlcnM7CisJCQlwcmludGYoCisiV2FybmluZzogQkxLR0VUU0laRSBpb2N0bCBmYWlsZWQgb24gJXMuICBVc2luZyBnZW9tZXRyeSBjeWxpbmRlciB2YWx1ZSBvZiAldS5cbiIKKyJUaGlzIHZhbHVlIG1heSBiZSB0cnVuY2F0ZWQgZm9yIGRldmljZXMgPiAzMy44IEdCLlxuIiwgZGlza19kZXZpY2UsIGdfY3lsaW5kZXJzKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCW9sZFtpXS5zeXNpZCA9IDA7CisJCWlmICh2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKSkgeworCQkJaWYgKGdldF9wYXJ0X3RhYmxlKGkpLT5zeXNfaW5kKSB7CisJCQkJb2xkW2ldLnN5c2lkID0gZ2V0X3BhcnRfdGFibGUoaSktPnN5c19pbmQ7CisJCQkJb2xkW2ldLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoZ2V0X3BhcnRfdGFibGUoaSkpOworCQkJCW9sZFtpXS5uc2VjdCA9IGdldF9ucl9zZWN0cyhnZXRfcGFydF90YWJsZShpKSk7CisJCQkJcHJpbnRmKCJUcnlpbmcgdG8ga2VlcCBwYXJhbWV0ZXJzIG9mIHBhcnRpdGlvbiAldVxuIiwgaSk7CisJCQkJaWYgKFNHSV9ERUJVRykKKwkJCQkJcHJpbnRmKCJJRD0lMDJ4XHRTVEFSVD0ldVx0TEVOR1RIPSV1XG4iLAorCQkJCW9sZFtpXS5zeXNpZCwgb2xkW2ldLnN0YXJ0LCBvbGRbaV0ubnNlY3QpOworCQkJfQorCQl9CisJfQorCisJbWVtc2V0KE1CUmJ1ZmZlciwgMCwgc2l6ZW9mKE1CUmJ1ZmZlcikpOworCS8qIGZpZWxkcyB3aXRoICcvLycgYXJlIGFscmVhZHkgemVyb2VkIG91dCBieSBtZW1zZXQgYWJvdmUgKi8KKworCXNnaWxhYmVsLT5tYWdpYyA9IFNHSV9TU1dBUDMyKFNHSV9MQUJFTF9NQUdJQyk7CisJLy9zZ2lsYWJlbC0+Ym9vdF9wYXJ0ID0gU0dJX1NTV0FQMTYoMCk7CisJc2dpbGFiZWwtPnN3YXBfcGFydCA9IFNHSV9TU1dBUDE2KDEpOworCisJLy9tZW1zZXQoc2dpbGFiZWwtPmJvb3RfZmlsZSwgMCwgMTYpOworCXN0cmNweSgoY2hhciopc2dpbGFiZWwtPmJvb3RfZmlsZSwgIi91bml4Iik7IC8qIHNpemVvZihzZ2lsYWJlbC0+Ym9vdF9maWxlKSA9PSAxNiA+IDYgKi8KKworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnNrZXcgICAgICAgICAgICAgICAgICAgICA9ICgwKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5nYXAxICAgICAgICAgICAgICAgICAgICAgPSAoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uZ2FwMiAgICAgICAgICAgICAgICAgICAgID0gKDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnNwYXJlY3lsICAgICAgICAgICAgICAgICA9ICgwKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0ucGN5bGNvdW50ICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoZ2VvbWV0cnkuY3lsaW5kZXJzKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5oZWFkX3ZvbDAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNigwKTsKKwkvKiB0cmFja3MvY3lsaW5kZXIgKGhlYWRzKSAqLworCXNnaWxhYmVsLT5kZXZwYXJhbS5udHJrcyAgICAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNihnZW9tZXRyeS5oZWFkcyk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uY21kX3RhZ19xdWV1ZV9kZXB0aCAgICAgID0gKDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnVudXNlZDAgICAgICAgICAgICAgICAgICA9ICgwKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS51bnVzZWQxICAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNigwKTsKKwkvKiBzZWN0b3JzL3RyYWNrICovCisJc2dpbGFiZWwtPmRldnBhcmFtLm5zZWN0ICAgICAgICAgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KGdlb21ldHJ5LnNlY3RvcnMpOworCXNnaWxhYmVsLT5kZXZwYXJhbS5ieXRlcyAgICAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNig1MTIpOworCXNnaWxhYmVsLT5kZXZwYXJhbS5pbGZhY3QgICAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNigxKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0uZmxhZ3MgICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMzIoVFJBQ0tfRldEfAorCQkJCQkJCUlHTk9SRV9FUlJPUlN8UkVTRUVLKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5kYXRhcmF0ZSAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAzMigwKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0ucmV0cmllc19vbl9lcnJvciAgICAgICAgID0gU0dJX1NTV0FQMzIoMSk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ubXNfcGVyX3dvcmQgICAgICAgICAgICAgID0gU0dJX1NTV0FQMzIoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ueHlsb2dpY3NfZ2FwMSAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ueHlsb2dpY3Nfc3luY2RlbGF5ICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ueHlsb2dpY3NfcmVhZGRlbGF5ICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ueHlsb2dpY3NfZ2FwMiAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ueHlsb2dpY3NfcmVhZGdhdGUgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0ueHlsb2dpY3Nfd3JpdGVjb250ICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLy9tZW1zZXQoICYoc2dpbGFiZWwtPmRpcmVjdG9yeSksIDAsIHNpemVvZihzdHJ1Y3Qgdm9sdW1lX2RpcmVjdG9yeSkqMTUgKTsKKwkvL21lbXNldCggJihzZ2lsYWJlbC0+cGFydGl0aW9ucyksIDAsIHNpemVvZihzdHJ1Y3Qgc2dpX3BhcnRpbmZvKSoxNiApOworCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX1NHSTsKKwlnX3BhcnRpdGlvbnMgPSAxNjsKKwlzZ2lfdm9sdW1lcyA9IDE1OworCXNnaV9zZXRfZW50aXJlKCk7CisJc2dpX3NldF92b2xoZHIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChvbGRbaV0uc3lzaWQpIHsKKwkJCXNnaV9zZXRfcGFydGl0aW9uKGksIG9sZFtpXS5zdGFydCwgb2xkW2ldLm5zZWN0LCBvbGRbaV0uc3lzaWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc2dpX3NldF94Y3lsKHZvaWQpCit7CisJLyogZG8gbm90aGluZyBpbiB0aGUgYmVnaW5uaW5nICovCit9CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19BRFZBTkNFRCAqLworCisvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKi8KKworc3RhdGljIHNnaWluZm8gKgorZmlsbF9zZ2lpbmZvKHZvaWQpCit7CisJc2dpaW5mbyAqaW5mbyA9IHh6YWxsb2Moc2l6ZW9mKHNnaWluZm8pKTsKKworCWluZm8tPm1hZ2ljID0gU0dJX1NTV0FQMzIoU0dJX0lORk9fTUFHSUMpOworCWluZm8tPmIxID0gU0dJX1NTV0FQMzIoLTEpOworCWluZm8tPmIyID0gU0dJX1NTV0FQMTYoLTEpOworCWluZm8tPmIzID0gU0dJX1NTV0FQMTYoMSk7CisJLyogWW91IG1heSB3YW50IHRvIHJlcGxhY2UgdGhpcyBzdHJpbmcgISEhISEhISAqLworCXN0cmNweSggKGNoYXIqKWluZm8tPnNjc2lfc3RyaW5nLCAiSUJNIE9FTSAwNjYyUzEyICAgICAgICAgMyAzMCIgKTsKKwlzdHJjcHkoIChjaGFyKilpbmZvLT5zZXJpYWwsICIwMDAwIiApOworCWluZm8tPmNoZWNrMTgxNiA9IFNHSV9TU1dBUDE2KDE4KjI1NiArMTYgKTsKKwlzdHJjcHkoIChjaGFyKilpbmZvLT5pbnN0YWxsZXIsICJTZnggdmVyc2lvbiA1LjMsIE9jdCAxOCwgMTk5NCIgKTsKKwlyZXR1cm4gaW5mbzsKK30KKyNlbmRpZiAvKiBTR0lfTEFCRUwgKi8KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZmRpc2tfc3VuLmMgYi91dGlsLWxpbnV4L2ZkaXNrX3N1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmNjMDYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrX3N1bi5jCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogZmRpc2tfc3VuLmMKKyAqCisgKiBJIHRoaW5rIHRoaXMgaXMgbW9zdGx5LCBvciBlbnRpcmVseSwgZHVlIHRvCisgKiAgICAgIEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opLCBKdWx5IDE5OTYKKyAqCisgKiBNZXJnZWQgd2l0aCBmZGlzayBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcywgYWViLCBKdW5lIDE5OTguCisgKgorICogU2F0IE1hciAyMCBFU1QgMTk5OSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqICAgICAgSW50ZXJuYXRpb25hbGl6YXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVU5fTEFCRUwKKworI2RlZmluZSBTVU5PU19TV0FQIDMKKyNkZWZpbmUgU1VOX1dIT0xFX0RJU0sgNQorCisjZGVmaW5lIFNVTl9MQUJFTF9NQUdJQyAgICAgICAgICAweERBQkUKKyNkZWZpbmUgU1VOX0xBQkVMX01BR0lDX1NXQVBQRUQgIDB4QkVEQQorI2RlZmluZSBTVU5fU1NXQVAxNih4KSAoc3VuX290aGVyX2VuZGlhbiA/IGZkaXNrX3N3YXAxNih4KSA6ICh1aW50MTZfdCkoeCkpCisjZGVmaW5lIFNVTl9TU1dBUDMyKHgpIChzdW5fb3RoZXJfZW5kaWFuID8gZmRpc2tfc3dhcDMyKHgpIDogKHVpbnQzMl90KSh4KSkKKworLyogQ29waWVkIGZyb20gbGludXgvbWFqb3IuaCAqLworI2RlZmluZSBGTE9QUFlfTUFKT1IgICAgMgorCisjZGVmaW5lIFNDU0lfSU9DVExfR0VUX0lETFVOIDB4NTM4MgorCitzdGF0aWMgc21hbGxpbnQgc3VuX290aGVyX2VuZGlhbjsKK3N0YXRpYyBzbWFsbGludCBzY3NpX2Rpc2s7CitzdGF0aWMgc21hbGxpbnQgZmxvcHB5OworCisjaWZuZGVmIElERTBfTUFKT1IKKyNkZWZpbmUgSURFMF9NQUpPUiAzCisjZW5kaWYKKyNpZm5kZWYgSURFMV9NQUpPUgorI2RlZmluZSBJREUxX01BSk9SIDIyCisjZW5kaWYKKworc3RhdGljIHZvaWQKK2d1ZXNzX2RldmljZV90eXBlKHZvaWQpCit7CisJc3RydWN0IHN0YXQgYm9vdHN0YXQ7CisKKwlpZiAoZnN0YXQoZGV2X2ZkLCAmYm9vdHN0YXQpIDwgMCkgeworCQlzY3NpX2Rpc2sgPSAwOworCQlmbG9wcHkgPSAwOworCX0gZWxzZSBpZiAoU19JU0JMSyhib290c3RhdC5zdF9tb2RlKQorCQkmJiAobWFqb3IoYm9vdHN0YXQuc3RfcmRldikgPT0gSURFMF9NQUpPUiB8fAorCQkgICAgbWFqb3IoYm9vdHN0YXQuc3RfcmRldikgPT0gSURFMV9NQUpPUikpIHsKKwkJc2NzaV9kaXNrID0gMDsKKwkJZmxvcHB5ID0gMDsKKwl9IGVsc2UgaWYgKFNfSVNCTEsoYm9vdHN0YXQuc3RfbW9kZSkKKwkJJiYgbWFqb3IoYm9vdHN0YXQuc3RfcmRldikgPT0gRkxPUFBZX01BSk9SKSB7CisJCXNjc2lfZGlzayA9IDA7CisJCWZsb3BweSA9IDE7CisJfSBlbHNlIHsKKwkJc2NzaV9kaXNrID0gMTsKKwkJZmxvcHB5ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdW5fc3lzX3R5cGVzW10gPSB7CisJIlx4MDAiICJFbXB0eSIgICAgICAgLCAvKiAwICAgICAgICAgICAgKi8KKwkiXHgwMSIgIkJvb3QiICAgICAgICAsIC8qIDEgICAgICAgICAgICAqLworCSJceDAyIiAiU3VuT1Mgcm9vdCIgICwgLyogMiAgICAgICAgICAgICovCisJIlx4MDMiICJTdW5PUyBzd2FwIiAgLCAvKiBTVU5PU19TV0FQICAgKi8KKwkiXHgwNCIgIlN1bk9TIHVzciIgICAsIC8qIDQgICAgICAgICAgICAqLworCSJceDA1IiAiV2hvbGUgZGlzayIgICwgLyogU1VOX1dIT0xFX0RJU0sgICAqLworCSJceDA2IiAiU3VuT1Mgc3RhbmQiICwgLyogNiAgICAgICAgICAgICovCisJIlx4MDciICJTdW5PUyB2YXIiICAgLCAvKiA3ICAgICAgICAgICAgKi8KKwkiXHgwOCIgIlN1bk9TIGhvbWUiICAsIC8qIDggICAgICAgICAgICAqLworCSJceDgyIiAiTGludXggc3dhcCIgICwgLyogTElOVVhfU1dBUCAgICovCisJIlx4ODMiICJMaW51eCBuYXRpdmUiLCAvKiBMSU5VWF9OQVRJVkUgKi8KKwkiXHg4ZSIgIkxpbnV4IExWTSIgICAsIC8qIDB4OGUgICAgICAgICAqLworLyogTmV3ICgyLjIueCkgcmFpZCBwYXJ0aXRpb24gd2l0aCBhdXRvZGV0ZWN0IHVzaW5nIHBlcnNpc3RlbnQgc3VwZXJibG9jayAqLworCSJceGZkIiAiTGludXggcmFpZCBhdXRvZGV0ZWN0IiwgLyogMHhmZCAgICAgICAgICovCisJTlVMTAorfTsKKworCitzdGF0aWMgdm9pZAorc2V0X3N1bl9wYXJ0aXRpb24oaW50IGksIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBzdG9wLCBpbnQgc3lzaWQpCit7CisJc3VubGFiZWwtPmluZm9zW2ldLmlkID0gc3lzaWQ7CisJc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0uc3RhcnRfY3lsaW5kZXIgPQorCQlTVU5fU1NXQVAzMihzdGFydCAvIChnX2hlYWRzICogZ19zZWN0b3JzKSk7CisJc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMgPQorCQlTVU5fU1NXQVAzMihzdG9wIC0gc3RhcnQpOworCXNldF9jaGFuZ2VkKGkpOworfQorCitzdGF0aWMgaW50CitjaGVja19zdW5fbGFiZWwodm9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdXNoOworCWludCBjc3VtOworCisJaWYgKHN1bmxhYmVsLT5tYWdpYyAhPSBTVU5fTEFCRUxfTUFHSUMKKwkgJiYgc3VubGFiZWwtPm1hZ2ljICE9IFNVTl9MQUJFTF9NQUdJQ19TV0FQUEVECisJKSB7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0RPUzsKKwkJc3VuX290aGVyX2VuZGlhbiA9IDA7CisJCXJldHVybiAwOworCX0KKwlzdW5fb3RoZXJfZW5kaWFuID0gKHN1bmxhYmVsLT5tYWdpYyA9PSBTVU5fTEFCRUxfTUFHSUNfU1dBUFBFRCk7CisJdXNoID0gKCh1bnNpZ25lZCBzaG9ydCAqKSAoc3VubGFiZWwgKyAxKSkgLSAxOworCWZvciAoY3N1bSA9IDA7IHVzaCA+PSAodW5zaWduZWQgc2hvcnQgKilzdW5sYWJlbDspIGNzdW0gXj0gKnVzaC0tOworCWlmIChjc3VtKSB7CisJCXByaW50ZigiRGV0ZWN0ZWQgc3VuIGRpc2tsYWJlbCB3aXRoIHdyb25nIGNoZWNrc3VtLlxuIgorIlByb2JhYmx5IHlvdSdsbCBoYXZlIHRvIHNldCBhbGwgdGhlIHZhbHVlcyxcbiIKKyJlLmcuIGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnMgYW5kIHBhcnRpdGlvbnNcbiIKKyJvciBmb3JjZSBhIGZyZXNoIGxhYmVsIChzIGNvbW1hbmQgaW4gbWFpbiBtZW51KVxuIik7CisJfSBlbHNlIHsKKwkJZ19oZWFkcyA9IFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5udHJrcyk7CisJCWdfY3lsaW5kZXJzID0gU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5jeWwpOworCQlnX3NlY3RvcnMgPSBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bnNlY3QpOworCX0KKwl1cGRhdGVfdW5pdHMoKTsKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9TVU47CisJZ19wYXJ0aXRpb25zID0gODsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW5fcHJlZGVmaW5lZF9kcml2ZXMgeworCWNvbnN0IGNoYXIgKnZlbmRvcjsKKwljb25zdCBjaGFyICptb2RlbDsKKwl1bnNpZ25lZCBzaG9ydCBzcGFyZWN5bDsKKwl1bnNpZ25lZCBzaG9ydCBuY3lsOworCXVuc2lnbmVkIHNob3J0IG5hY3lsOworCXVuc2lnbmVkIHNob3J0IHBjeWxjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBudHJrczsKKwl1bnNpZ25lZCBzaG9ydCBuc2VjdDsKKwl1bnNpZ25lZCBzaG9ydCByc3BlZWQ7Cit9IHN1bl9kcml2ZXNbXSA9IHsKKwl7ICJRdWFudHVtIiwiUHJvRHJpdmUgODBTIiwxLDgzMiwyLDgzNCw2LDM0LDM2NjJ9LAorCXsgIlF1YW50dW0iLCJQcm9Ecml2ZSAxMDVTIiwxLDk3NCwyLDEwMTksNiwzNSwzNjYyfSwKKwl7ICJDREMiLCJXcmVuIElWIDk0MTcxLTM0NCIsMywxNTQ1LDIsMTU0OSw5LDQ2LDM2MDB9LAorCXsgIklCTSIsIkRQRVMtMzEwODAiLDAsNDkwMSwyLDQ5MDMsNCwxMDgsNTQwMH0sCisJeyAiSUJNIiwiRE9SUy0zMjE2MCIsMCwxMDE1LDIsMTAxNyw2Nyw2Miw1NDAwfSwKKwl7ICJJQk0iLCJETkVTLTMxODM1MCIsMCwxMTE5OSwyLDExNDc0LDEwLDMyMCw3MjAwfSwKKwl7ICJTRUFHQVRFIiwiU1QzNDM3MSIsMCwzODgwLDIsMzg4MiwxNiwxMzUsNzIyOH0sCisJeyAiIiwiU1VOMDEwNCIsMSw5NzQsMiwxMDE5LDYsMzUsMzY2Mn0sCisJeyAiIiwiU1VOMDIwNyIsNCwxMjU0LDIsMTI3Miw5LDM2LDM2MDB9LAorCXsgIiIsIlNVTjAzMjciLDMsMTU0NSwyLDE1NDksOSw0NiwzNjAwfSwKKwl7ICIiLCJTVU4wMzQwIiwwLDE1MzgsMiwxNTQ0LDYsNzIsNDIwMH0sCisJeyAiIiwiU1VOMDQyNCIsMiwxMTUxLDIsMjUwMCw5LDgwLDQ0MDB9LAorCXsgIiIsIlNVTjA1MzUiLDAsMTg2NiwyLDI1MDAsNyw4MCw1NDAwfSwKKwl7ICIiLCJTVU4wNjY5Iiw1LDE2MTQsMiwxNjMyLDE1LDU0LDM2MDB9LAorCXsgIiIsIlNVTjEuMEciLDUsMTcwMywyLDE5MzEsMTUsODAsMzU5N30sCisJeyAiIiwiU1VOMS4wNSIsMCwyMDM2LDIsMjAzOCwxNCw3Miw1NDAwfSwKKwl7ICIiLCJTVU4xLjNHIiw2LDE5NjUsMiwzNTAwLDE3LDgwLDU0MDB9LAorCXsgIiIsIlNVTjIuMUciLDAsMjczMywyLDM1MDAsMTksODAsNTQwMH0sCisJeyAiSU9NRUdBIiwiSmF6IiwwLDEwMTksMiwxMDIxLDY0LDMyLDUzOTR9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW5fcHJlZGVmaW5lZF9kcml2ZXMgKgorc3VuX2F1dG9jb25maWd1cmVfc2NzaSh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBzdW5fcHJlZGVmaW5lZF9kcml2ZXMgKnAgPSBOVUxMOworCisjaWZkZWYgU0NTSV9JT0NUTF9HRVRfSURMVU4KKwl1bnNpZ25lZCBpbnQgaWRbMl07CisJY2hhciBidWZmZXJbMjA0OF07CisJY2hhciBidWZmZXIyWzIwNDhdOworCUZJTEUgKnBmZDsKKwljaGFyICp2ZW5kb3I7CisJY2hhciAqbW9kZWw7CisJY2hhciAqcTsKKwlpbnQgaTsKKworCWlmIChpb2N0bChkZXZfZmQsIFNDU0lfSU9DVExfR0VUX0lETFVOLCAmaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCXNwcmludGYoYnVmZmVyLAorCQkiSG9zdDogc2NzaSV1IENoYW5uZWw6ICUwMnUgSWQ6ICUwMnUgTHVuOiAlMDJ1XG4iLAorCQkvKiBUaGlzIGlzIHZlcnkgd3JvbmcgKHdvcmtzIG9ubHkgaWYgeW91IGhhdmUgb25lIEhCQSksCisJCSAgIGJ1dCBJIGhhdmVuJ3QgZm91bmQgYSB3YXkgaG93IHRvIGdldCBob3N0bm8KKwkJICAgZnJvbSB0aGUgY3VycmVudCBrZXJuZWwgKi8KKwkJMCwKKwkJKGlkWzBdPj4xNikgJiAweGZmLAorCQlpZFswXSAmIDB4ZmYsCisJCShpZFswXT4+OCkgJiAweGZmCisJKTsKKwlwZmQgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2Mvc2NzaS9zY3NpIik7CisJaWYgKCFwZmQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXdoaWxlIChmZ2V0cyhidWZmZXIyLCAyMDQ4LCBwZmQpKSB7CisJCWlmIChzdHJjbXAoYnVmZmVyLCBidWZmZXIyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWZnZXRzKGJ1ZmZlcjIsIDIwNDgsIHBmZCkpCisJCQlicmVhazsKKwkJcSA9IHN0cnN0cihidWZmZXIyLCAiVmVuZG9yOiAiKTsKKwkJaWYgKCFxKQorCQkJYnJlYWs7CisJCXEgKz0gODsKKwkJdmVuZG9yID0gcTsKKwkJcSA9IHN0cnN0cihxLCAiICIpOworCQkqcSsrID0gJ1wwJzsgICAvKiB0cnVuY2F0ZSB2ZW5kb3IgbmFtZSAqLworCQlxID0gc3Ryc3RyKHEsICJNb2RlbDogIik7CisJCWlmICghcSkKKwkJCWJyZWFrOworCQkqcSA9ICdcMCc7CisJCXEgKz0gNzsKKwkJbW9kZWwgPSBxOworCQlxID0gc3Ryc3RyKHEsICIgUmV2OiAiKTsKKwkJaWYgKCFxKQorCQkJYnJlYWs7CisJCSpxID0gJ1wwJzsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3VuX2RyaXZlcyk7IGkrKykgeworCQkJaWYgKCpzdW5fZHJpdmVzW2ldLnZlbmRvciAmJiBzdHJjYXNlY21wKHN1bl9kcml2ZXNbaV0udmVuZG9yLCB2ZW5kb3IpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFzdHJzdHIobW9kZWwsIHN1bl9kcml2ZXNbaV0ubW9kZWwpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJBdXRvY29uZmlndXJlIGZvdW5kIGEgJXMlcyVzXG4iLAorCQkJCQlzdW5fZHJpdmVzW2ldLnZlbmRvciwKKwkJCQkJKCpzdW5fZHJpdmVzW2ldLnZlbmRvcikgPyAiICIgOiAiIiwKKwkJCQkJc3VuX2RyaXZlc1tpXS5tb2RlbCk7CisJCQlwID0gc3VuX2RyaXZlcyArIGk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJZmNsb3NlKHBmZCk7CisjZW5kaWYKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQKK2NyZWF0ZV9zdW5sYWJlbCh2b2lkKQoreworCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKKwl1bnNpZ25lZCBuZGl2OworCXVuc2lnbmVkIGNoYXIgYzsKKwljb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzICpwID0gTlVMTDsKKworCXByaW50Zihtc2dfYnVpbGRpbmdfbmV3X2xhYmVsLCAic3VuIGRpc2tsYWJlbCIpOworCisJc3VuX290aGVyX2VuZGlhbiA9IEJCX0xJVFRMRV9FTkRJQU47CisJbWVtc2V0KE1CUmJ1ZmZlciwgMCwgc2l6ZW9mKE1CUmJ1ZmZlcikpOworCXN1bmxhYmVsLT5tYWdpYyA9IFNVTl9TU1dBUDE2KFNVTl9MQUJFTF9NQUdJQyk7CisJaWYgKCFmbG9wcHkpIHsKKwkJdW5zaWduZWQgaTsKKwkJcHV0cygiRHJpdmUgdHlwZVxuIgorCQkgIiAgID8gICBhdXRvIGNvbmZpZ3VyZVxuIgorCQkgIiAgIDAgICBjdXN0b20gKHdpdGggaGFyZHdhcmUgZGV0ZWN0ZWQgZGVmYXVsdHMpIik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN1bl9kcml2ZXMpOyBpKyspIHsKKwkJCXByaW50ZigiICAgJWMgICAlcyVzJXNcbiIsCisJCQkJaSArICdhJywgc3VuX2RyaXZlc1tpXS52ZW5kb3IsCisJCQkJKCpzdW5fZHJpdmVzW2ldLnZlbmRvcikgPyAiICIgOiAiIiwKKwkJCQlzdW5fZHJpdmVzW2ldLm1vZGVsKTsKKwkJfQorCQl3aGlsZSAoMSkgeworCQkJYyA9IHJlYWRfbm9uZW1wdHkoIlNlbGVjdCB0eXBlICg/IGZvciBhdXRvLCAwIGZvciBjdXN0b20pOiAiKTsKKwkJCWlmIChjID09ICcwJykgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGMgPj0gJ2EnICYmIGMgPCAnYScgKyBBUlJBWV9TSVpFKHN1bl9kcml2ZXMpKSB7CisJCQkJcCA9IHN1bl9kcml2ZXMgKyBjIC0gJ2EnOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGMgPj0gJ0EnICYmIGMgPCAnQScgKyBBUlJBWV9TSVpFKHN1bl9kcml2ZXMpKSB7CisJCQkJcCA9IHN1bl9kcml2ZXMgKyBjIC0gJ0EnOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGMgPT0gJz8nICYmIHNjc2lfZGlzaykgeworCQkJCXAgPSBzdW5fYXV0b2NvbmZpZ3VyZV9zY3NpKCk7CisJCQkJaWYgKHApCisJCQkJCWJyZWFrOworCQkJCXByaW50ZigiQXV0b2NvbmZpZ3VyZSBmYWlsZWRcbiIpOworCQkJfQorCQl9CisJfQorCWlmICghcCB8fCBmbG9wcHkpIHsKKwkJaWYgKCFpb2N0bChkZXZfZmQsIEhESU9fR0VUR0VPLCAmZ2VvbWV0cnkpKSB7CisJCQlnX2hlYWRzID0gZ2VvbWV0cnkuaGVhZHM7CisJCQlnX3NlY3RvcnMgPSBnZW9tZXRyeS5zZWN0b3JzOworCQkJZ19jeWxpbmRlcnMgPSBnZW9tZXRyeS5jeWxpbmRlcnM7CisJCX0gZWxzZSB7CisJCQlnX2hlYWRzID0gMDsKKwkJCWdfc2VjdG9ycyA9IDA7CisJCQlnX2N5bGluZGVycyA9IDA7CisJCX0KKwkJaWYgKGZsb3BweSkgeworCQkJc3VubGFiZWwtPm5hY3lsID0gMDsKKwkJCXN1bmxhYmVsLT5wY3lsY291bnQgPSBTVU5fU1NXQVAxNihnX2N5bGluZGVycyk7CisJCQlzdW5sYWJlbC0+cnNwZWVkID0gU1VOX1NTV0FQMTYoMzAwKTsKKwkJCXN1bmxhYmVsLT5pbGZhY3QgPSBTVU5fU1NXQVAxNigxKTsKKwkJCXN1bmxhYmVsLT5zcGFyZWN5bCA9IDA7CisJCX0gZWxzZSB7CisJCQlnX2hlYWRzID0gcmVhZF9pbnQoMSwgZ19oZWFkcywgMTAyNCwgMCwgIkhlYWRzIik7CisJCQlnX3NlY3RvcnMgPSByZWFkX2ludCgxLCBnX3NlY3RvcnMsIDEwMjQsIDAsICJTZWN0b3JzL3RyYWNrIik7CisJCWlmIChnX2N5bGluZGVycykKKwkJCWdfY3lsaW5kZXJzID0gcmVhZF9pbnQoMSwgZ19jeWxpbmRlcnMgLSAyLCA2NTUzNSwgMCwgIkN5bGluZGVycyIpOworCQllbHNlCisJCQlnX2N5bGluZGVycyA9IHJlYWRfaW50KDEsIDAsIDY1NTM1LCAwLCAiQ3lsaW5kZXJzIik7CisJCQlzdW5sYWJlbC0+bmFjeWwgPSBTVU5fU1NXQVAxNihyZWFkX2ludCgwLCAyLCA2NTUzNSwgMCwgIkFsdGVybmF0ZSBjeWxpbmRlcnMiKSk7CisJCQlzdW5sYWJlbC0+cGN5bGNvdW50ID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgZ19jeWxpbmRlcnMgKyBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bmFjeWwpLCA2NTUzNSwgMCwgIlBoeXNpY2FsIGN5bGluZGVycyIpKTsKKwkJCXN1bmxhYmVsLT5yc3BlZWQgPSBTVU5fU1NXQVAxNihyZWFkX2ludCgxLCA1NDAwLCAxMDAwMDAsIDAsICJSb3RhdGlvbiBzcGVlZCAocnBtKSIpKTsKKwkJCXN1bmxhYmVsLT5pbGZhY3QgPSBTVU5fU1NXQVAxNihyZWFkX2ludCgxLCAxLCAzMiwgMCwgIkludGVybGVhdmUgZmFjdG9yIikpOworCQkJc3VubGFiZWwtPnNwYXJlY3lsID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgMCwgZ19zZWN0b3JzLCAwLCAiRXh0cmEgc2VjdG9ycyBwZXIgY3lsaW5kZXIiKSk7CisJCX0KKwl9IGVsc2UgeworCQlzdW5sYWJlbC0+c3BhcmVjeWwgPSBTVU5fU1NXQVAxNihwLT5zcGFyZWN5bCk7CisJCXN1bmxhYmVsLT5uY3lsID0gU1VOX1NTV0FQMTYocC0+bmN5bCk7CisJCXN1bmxhYmVsLT5uYWN5bCA9IFNVTl9TU1dBUDE2KHAtPm5hY3lsKTsKKwkJc3VubGFiZWwtPnBjeWxjb3VudCA9IFNVTl9TU1dBUDE2KHAtPnBjeWxjb3VudCk7CisJCXN1bmxhYmVsLT5udHJrcyA9IFNVTl9TU1dBUDE2KHAtPm50cmtzKTsKKwkJc3VubGFiZWwtPm5zZWN0ID0gU1VOX1NTV0FQMTYocC0+bnNlY3QpOworCQlzdW5sYWJlbC0+cnNwZWVkID0gU1VOX1NTV0FQMTYocC0+cnNwZWVkKTsKKwkJc3VubGFiZWwtPmlsZmFjdCA9IFNVTl9TU1dBUDE2KDEpOworCQlnX2N5bGluZGVycyA9IHAtPm5jeWw7CisJCWdfaGVhZHMgPSBwLT5udHJrczsKKwkJZ19zZWN0b3JzID0gcC0+bnNlY3Q7CisJCXB1dHMoIllvdSBtYXkgY2hhbmdlIGFsbCB0aGUgZGlzayBwYXJhbXMgZnJvbSB0aGUgeCBtZW51Iik7CisJfQorCisJc25wcmludGYoKGNoYXIgKikoc3VubGFiZWwtPmluZm8pLCBzaXplb2Yoc3VubGFiZWwtPmluZm8pLAorCQkiJXMlcyVzIGN5bCAldSBhbHQgJXUgaGQgJXUgc2VjICV1IiwKKwkJcCA/IHAtPnZlbmRvciA6ICIiLCAocCAmJiAqcC0+dmVuZG9yKSA/ICIgIiA6ICIiLAorCQlwID8gcC0+bW9kZWwgOiAoZmxvcHB5ID8gIjMsNVwiIGZsb3BweSIgOiAiTGludXggY3VzdG9tIiksCisJCWdfY3lsaW5kZXJzLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bmFjeWwpLCBnX2hlYWRzLCBnX3NlY3RvcnMpOworCisJc3VubGFiZWwtPm50cmtzID0gU1VOX1NTV0FQMTYoZ19oZWFkcyk7CisJc3VubGFiZWwtPm5zZWN0ID0gU1VOX1NTV0FQMTYoZ19zZWN0b3JzKTsKKwlzdW5sYWJlbC0+bmN5bCA9IFNVTl9TU1dBUDE2KGdfY3lsaW5kZXJzKTsKKwlpZiAoZmxvcHB5KQorCQlzZXRfc3VuX3BhcnRpdGlvbigwLCAwLCBnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnMsIExJTlVYX05BVElWRSk7CisJZWxzZSB7CisJCWlmIChnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnMgPj0gMTUwICogMjA0OCkgeworCQkJbmRpdiA9IGdfY3lsaW5kZXJzIC0gKDUwICogMjA0OCAvIChnX2hlYWRzICogZ19zZWN0b3JzKSk7IC8qIDUwTSBzd2FwICovCisJCX0gZWxzZQorCQkJbmRpdiA9IGdfY3lsaW5kZXJzICogMiAvIDM7CisJCXNldF9zdW5fcGFydGl0aW9uKDAsIDAsIG5kaXYgKiBnX2hlYWRzICogZ19zZWN0b3JzLCBMSU5VWF9OQVRJVkUpOworCQlzZXRfc3VuX3BhcnRpdGlvbigxLCBuZGl2ICogZ19oZWFkcyAqIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzLCBMSU5VWF9TV0FQKTsKKwkJc3VubGFiZWwtPmluZm9zWzFdLmZsYWdzIHw9IDB4MDE7IC8qIE5vdCBtb3VudGFibGUgKi8KKwl9CisJc2V0X3N1bl9wYXJ0aXRpb24oMiwgMCwgZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzLCBTVU5fV0hPTEVfRElTSyk7CisJeworCQl1bnNpZ25lZCBzaG9ydCAqdXNoID0gKHVuc2lnbmVkIHNob3J0ICopc3VubGFiZWw7CisJCXVuc2lnbmVkIHNob3J0IGNzdW0gPSAwOworCQl3aGlsZSAodXNoIDwgKHVuc2lnbmVkIHNob3J0ICopKCZzdW5sYWJlbC0+Y3N1bSkpCisJCQljc3VtIF49ICp1c2grKzsKKwkJc3VubGFiZWwtPmNzdW0gPSBjc3VtOworCX0KKworCXNldF9hbGxfdW5jaGFuZ2VkKCk7CisJc2V0X2NoYW5nZWQoMCk7CisJZ2V0X2Jvb3QoQ1JFQVRFX0VNUFRZX1NVTik7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfc3VuZmxhZ3MoaW50IGksIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwlpZiAoc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzICYgbWFzaykKKwkJc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzICY9IH5tYXNrOworCWVsc2UKKwkJc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzIHw9IG1hc2s7CisJc2V0X2NoYW5nZWQoaSk7Cit9CisKK3N0YXRpYyB2b2lkCitmZXRjaF9zdW4odW5zaWduZWQgKnN0YXJ0cywgdW5zaWduZWQgKmxlbnMsIHVuc2lnbmVkICpzdGFydCwgdW5zaWduZWQgKnN0b3ApCit7CisJaW50IGksIGNvbnRpbnVvdXMgPSAxOworCisJKnN0YXJ0ID0gMDsKKwkqc3RvcCA9IGdfY3lsaW5kZXJzICogZ19oZWFkcyAqIGdfc2VjdG9yczsKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJaWYgKHN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzCisJCSAmJiBzdW5sYWJlbC0+aW5mb3NbaV0uaWQKKwkJICYmIHN1bmxhYmVsLT5pbmZvc1tpXS5pZCAhPSBTVU5fV0hPTEVfRElTSykgeworCQkJc3RhcnRzW2ldID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0uc3RhcnRfY3lsaW5kZXIpICogZ19oZWFkcyAqIGdfc2VjdG9yczsKKwkJCWxlbnNbaV0gPSBTVU5fU1NXQVAzMihzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycyk7CisJCQlpZiAoY29udGludW91cykgeworCQkJCWlmIChzdGFydHNbaV0gPT0gKnN0YXJ0KQorCQkJCQkqc3RhcnQgKz0gbGVuc1tpXTsKKwkJCQllbHNlIGlmIChzdGFydHNbaV0gKyBsZW5zW2ldID49ICpzdG9wKQorCQkJCQkqc3RvcCA9IHN0YXJ0c1tpXTsKKwkJCQllbHNlCisJCQkJCWNvbnRpbnVvdXMgPSAwOworCQkJCQkvKiBUaGVyZSB3aWxsIGJlIHByb2JhYmx5IG1vcmUgZ2FwcworCQkJCQkgIHRoYW4gb25lLCBzbyBsZXRzIGNoZWNrIGFmdGVyd2FyZHMgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXJ0c1tpXSA9IDA7CisJCQlsZW5zW2ldID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkICp2ZXJpZnlfc3VuX3N0YXJ0czsKKworc3RhdGljIGludAordmVyaWZ5X3N1bl9jbXAoaW50ICphLCBpbnQgKmIpCit7CisJaWYgKCphID09IC0xKSByZXR1cm4gMTsKKwlpZiAoKmIgPT0gLTEpIHJldHVybiAtMTsKKwlpZiAodmVyaWZ5X3N1bl9zdGFydHNbKmFdID4gdmVyaWZ5X3N1bl9zdGFydHNbKmJdKSByZXR1cm4gMTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfc3VuKHZvaWQpCit7CisJdW5zaWduZWQgc3RhcnRzWzhdLCBsZW5zWzhdLCBzdGFydCwgc3RvcDsKKwlpbnQgaSxqLGssc3RhcnRvLGVuZG87CisJaW50IGFycmF5WzhdOworCisJdmVyaWZ5X3N1bl9zdGFydHMgPSBzdGFydHM7CisJZmV0Y2hfc3VuKHN0YXJ0cywgbGVucywgJnN0YXJ0LCAmc3RvcCk7CisJZm9yIChrID0gMDsgayA8IDc7IGsrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoayAmJiAobGVuc1tpXSAlIChnX2hlYWRzICogZ19zZWN0b3JzKSkpIHsKKwkJCQlwcmludGYoIlBhcnRpdGlvbiAldSBkb2Vzbid0IGVuZCBvbiBjeWxpbmRlciBib3VuZGFyeVxuIiwgaSsxKTsKKwkJCX0KKwkJCWlmIChsZW5zW2ldKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQkJaWYgKGxlbnNbal0pIHsKKwkJCQkJCWlmIChzdGFydHNbal0gPT0gc3RhcnRzW2ldK2xlbnNbaV0pIHsKKwkJCQkJCQlzdGFydHNbal0gPSBzdGFydHNbaV07IGxlbnNbal0gKz0gbGVuc1tpXTsKKwkJCQkJCQlsZW5zW2ldID0gMDsKKwkJCQkJCX0gZWxzZSBpZiAoc3RhcnRzW2ldID09IHN0YXJ0c1tqXStsZW5zW2pdKXsKKwkJCQkJCQlsZW5zW2pdICs9IGxlbnNbaV07CisJCQkJCQkJbGVuc1tpXSA9IDA7CisJCQkJCQl9IGVsc2UgaWYgKCFrKSB7CisJCQkJCQkJaWYgKHN0YXJ0c1tpXSA8IHN0YXJ0c1tqXStsZW5zW2pdCisJCQkJCQkJICYmIHN0YXJ0c1tqXSA8IHN0YXJ0c1tpXStsZW5zW2ldKSB7CisJCQkJCQkJCXN0YXJ0byA9IHN0YXJ0c1tpXTsKKwkJCQkJCQkJaWYgKHN0YXJ0c1tqXSA+IHN0YXJ0bykKKwkJCQkJCQkJCXN0YXJ0byA9IHN0YXJ0c1tqXTsKKwkJCQkJCQkJZW5kbyA9IHN0YXJ0c1tpXStsZW5zW2ldOworCQkJCQkJCQlpZiAoc3RhcnRzW2pdK2xlbnNbal0gPCBlbmRvKQorCQkJCQkJCQkJZW5kbyA9IHN0YXJ0c1tqXStsZW5zW2pdOworCQkJCQkJCQlwcmludGYoIlBhcnRpdGlvbiAldSBvdmVybGFwcyB3aXRoIG90aGVycyBpbiAiCisJCQkJCQkJCQkic2VjdG9ycyAldS0ldVxuIiwgaSsxLCBzdGFydG8sIGVuZG8pOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJfQorCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKGxlbnNbaV0pCisJCQlhcnJheVtpXSA9IGk7CisJCWVsc2UKKwkJCWFycmF5W2ldID0gLTE7CisJfQorCXFzb3J0KGFycmF5LCBBUlJBWV9TSVpFKGFycmF5KSwgc2l6ZW9mKGFycmF5WzBdKSwKKwkJKGludCAoKikoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKikpIHZlcmlmeV9zdW5fY21wKTsKKwlpZiAoYXJyYXlbMF0gPT0gLTEpIHsKKwkJcHJpbnRmKCJObyBwYXJ0aXRpb25zIGRlZmluZWRcbiIpOworCQlyZXR1cm47CisJfQorCXN0b3AgPSBnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJaWYgKHN0YXJ0c1thcnJheVswXV0pCisJCXByaW50ZigiVW51c2VkIGdhcCAtIHNlY3RvcnMgJXUtJXVcbiIsIDAsIHN0YXJ0c1thcnJheVswXV0pOworCWZvciAoaSA9IDA7IGkgPCA3ICYmIGFycmF5W2krMV0gIT0gLTE7IGkrKykgeworCQlwcmludGYoIlVudXNlZCBnYXAgLSBzZWN0b3JzICV1LSV1XG4iLCBzdGFydHNbYXJyYXlbaV1dK2xlbnNbYXJyYXlbaV1dLCBzdGFydHNbYXJyYXlbaSsxXV0pOworCX0KKwlzdGFydCA9IHN0YXJ0c1thcnJheVtpXV0gKyBsZW5zW2FycmF5W2ldXTsKKwlpZiAoc3RhcnQgPCBzdG9wKQorCQlwcmludGYoIlVudXNlZCBnYXAgLSBzZWN0b3JzICV1LSV1XG4iLCBzdGFydCwgc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfc3VuX3BhcnRpdGlvbihpbnQgbiwgaW50IHN5cykKK3sKKwl1bnNpZ25lZCBzdGFydCwgc3RvcCwgc3RvcDI7CisJdW5zaWduZWQgc3RhcnRzWzhdLCBsZW5zWzhdOworCWludCB3aG9sZV9kaXNrID0gMDsKKworCWNoYXIgbWVzZ1syNTZdOworCWludCBpLCBmaXJzdCwgbGFzdDsKKworCWlmIChzdW5sYWJlbC0+cGFydGl0aW9uc1tuXS5udW1fc2VjdG9ycyAmJiBzdW5sYWJlbC0+aW5mb3Nbbl0uaWQpIHsKKwkJcHJpbnRmKG1zZ19wYXJ0X2FscmVhZHlfZGVmaW5lZCwgbiArIDEpOworCQlyZXR1cm47CisJfQorCisJZmV0Y2hfc3VuKHN0YXJ0cywgbGVucywgJnN0YXJ0LCAmc3RvcCk7CisJaWYgKHN0b3AgPD0gc3RhcnQpIHsKKwkJaWYgKG4gPT0gMikKKwkJCXdob2xlX2Rpc2sgPSAxOworCQllbHNlIHsKKwkJCXByaW50ZigiT3RoZXIgcGFydGl0aW9ucyBhbHJlYWR5IGNvdmVyIHRoZSB3aG9sZSBkaXNrLlxuIgorCQkJCSJEZWxldGUvc2hyaW5rIHRoZW0gYmVmb3JlIHJldHJ5LlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLCAiRmlyc3QgJXMiLCBzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwl3aGlsZSAoMSkgeworCQlpZiAod2hvbGVfZGlzaykKKwkJCWZpcnN0ID0gcmVhZF9pbnQoMCwgMCwgMCwgMCwgbWVzZyk7CisJCWVsc2UKKwkJCWZpcnN0ID0gcmVhZF9pbnQoc2Nyb3VuZChzdGFydCksIHNjcm91bmQoc3RvcCkrMSwKKwkJCQkJIHNjcm91bmQoc3RvcCksIDAsIG1lc2cpOworCQlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMpCisJCQlmaXJzdCAqPSB1bml0c19wZXJfc2VjdG9yOworCQllbHNlCisJCQkvKiBTdGFydGluZyBzZWN0b3IgaGFzIHRvIGJlIHByb3Blcmx5IGFsaWduZWQgKi8KKwkJCWZpcnN0ID0gKGZpcnN0ICsgZ19oZWFkcyAqIGdfc2VjdG9ycyAtIDEpIC8gKGdfaGVhZHMgKiBnX3NlY3RvcnMpOworCQlpZiAobiA9PSAyICYmIGZpcnN0ICE9IDApCisJCQlwcmludGYoIlwKK0l0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHRoZSB0aGlyZCBwYXJ0aXRpb24gY292ZXJzIHRoZSB3aG9sZSBkaXNrXG5cCithbmQgaXMgb2YgdHlwZSAnV2hvbGUgZGlzaydcbiIpOworCQkvKiBld3QgYXNrcyB0byBhZGQ6ICJkb24ndCBzdGFydCBhIHBhcnRpdGlvbiBhdCBjeWwgMCIKKwkJICAgSG93ZXZlciwgZWRtdW5kb0ByYW5vLmRlbW9uLmNvLnVrIHdyaXRlczoKKwkJICAgIkluIGFkZGl0aW9uIHRvIGhhdmluZyBhIFN1biBwYXJ0aXRpb24gdGFibGUsIHRvIGJlIGFibGUgdG8KKwkJICAgYm9vdCBmcm9tIHRoZSBkaXNjLCB0aGUgZmlyc3QgcGFydGl0aW9uLCAvZGV2L3NkWDEsIG11c3QKKwkJICAgc3RhcnQgYXQgY3lsaW5kZXIgMC4gVGhpcyBtZWFucyB0aGF0IC9kZXYvc2RYMSBjb250YWlucworCQkgICB0aGUgcGFydGl0aW9uIHRhYmxlIGFuZCB0aGUgYm9vdCBibG9jaywgYXMgdGhlc2UgYXJlIHRoZQorCQkgICBmaXJzdCB0d28gc2VjdG9ycyBvZiB0aGUgZGlzYy4gVGhlcmVmb3JlIHlvdSBtdXN0IGJlCisJCSAgIGNhcmVmdWwgd2hhdCB5b3UgdXNlIC9kZXYvc2RYMSBmb3IuIEluIHBhcnRpY3VsYXIsIHlvdSBtdXN0CisJCSAgIG5vdCB1c2UgYSBwYXJ0aXRpb24gc3RhcnRpbmcgYXQgY3lsaW5kZXIgMCBmb3IgTGludXggc3dhcCwKKwkJICAgYXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIHBhcnRpdGlvbiB0YWJsZSBhbmQgdGhlIGJvb3QKKwkJICAgYmxvY2suIFlvdSBtYXksIGhvd2V2ZXIsIHVzZSBzdWNoIGEgcGFydGl0aW9uIGZvciBhIFVGUworCQkgICBvciBFWFQyIGZpbGUgc3lzdGVtLCBhcyB0aGVzZSBmaWxlIHN5c3RlbXMgbGVhdmUgdGhlIGZpcnN0CisJCSAgIDEwMjQgYnl0ZXMgdW5kaXN0dXJiZWQuICovCisJCS8qIE9uIHRoZSBvdGhlciBoYW5kLCBvbmUgc2hvdWxkIG5vdCB1c2UgcGFydGl0aW9ucworCQkgICBzdGFydGluZyBhdCBibG9jayAwIGluIGFuIG1kLCBvciB0aGUgbGFiZWwgd2lsbAorCQkgICBiZSB0cmFzaGVkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspCisJCQlpZiAobGVuc1tpXSAmJiBzdGFydHNbaV0gPD0gZmlyc3QgJiYgc3RhcnRzW2ldICsgbGVuc1tpXSA+IGZpcnN0KQorCQkJCWJyZWFrOworCQlpZiAoaSA8IGdfcGFydGl0aW9ucyAmJiAhd2hvbGVfZGlzaykgeworCQkJaWYgKG4gPT0gMiAmJiAhZmlyc3QpIHsKKwkJCQl3aG9sZV9kaXNrID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ZigiU2VjdG9yICV1IGlzIGFscmVhZHkgYWxsb2NhdGVkXG4iLCBmaXJzdCk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCXN0b3AgPSBnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJc3RvcDIgPSBzdG9wOworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlpZiAoc3RhcnRzW2ldID4gZmlyc3QgJiYgc3RhcnRzW2ldIDwgc3RvcCkKKwkJCXN0b3AgPSBzdGFydHNbaV07CisJfQorCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwKKwkJIkxhc3QgJXMgb3IgK3NpemUgb3IgK3NpemVNIG9yICtzaXplSyIsCisJCXN0cl91bml0cyhTSU5HVUxBUikpOworCWlmICh3aG9sZV9kaXNrKQorCQlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChzdG9wMiksIHNjcm91bmQoc3RvcDIpLCBzY3JvdW5kKHN0b3AyKSwKKwkJCQkwLCBtZXNnKTsKKwllbHNlIGlmIChuID09IDIgJiYgIWZpcnN0KQorCQlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQoc3RvcDIpLCBzY3JvdW5kKHN0b3AyKSwKKwkJCQlzY3JvdW5kKGZpcnN0KSwgbWVzZyk7CisJZWxzZQorCQlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQoc3RvcCksIHNjcm91bmQoc3RvcCksCisJCQkJc2Nyb3VuZChmaXJzdCksIG1lc2cpOworCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykKKwkJbGFzdCAqPSB1bml0c19wZXJfc2VjdG9yOworCWlmIChuID09IDIgJiYgIWZpcnN0KSB7CisJCWlmIChsYXN0ID49IHN0b3AyKSB7CisJCQl3aG9sZV9kaXNrID0gMTsKKwkJCWxhc3QgPSBzdG9wMjsKKwkJfSBlbHNlIGlmIChsYXN0ID4gc3RvcCkgeworCQkJcHJpbnRmKAorIllvdSBoYXZlbid0IGNvdmVyZWQgdGhlIHdob2xlIGRpc2sgd2l0aCB0aGUgM3JkIHBhcnRpdGlvbixcbiIKKyJidXQgeW91ciB2YWx1ZSAldSAlcyBjb3ZlcnMgc29tZSBvdGhlciBwYXJ0aXRpb24uXG4iCisiWW91ciBlbnRyeSBoYXMgYmVlbiBjaGFuZ2VkIHRvICV1ICVzXG4iLAorCQkJCXNjcm91bmQobGFzdCksIHN0cl91bml0cyhTSU5HVUxBUiksCisJCQkJc2Nyb3VuZChzdG9wKSwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJCQlsYXN0ID0gc3RvcDsKKwkJfQorCX0gZWxzZSBpZiAoIXdob2xlX2Rpc2sgJiYgbGFzdCA+IHN0b3ApCisJCWxhc3QgPSBzdG9wOworCisJaWYgKHdob2xlX2Rpc2spCisJCXN5cyA9IFNVTl9XSE9MRV9ESVNLOworCXNldF9zdW5fcGFydGl0aW9uKG4sIGZpcnN0LCBsYXN0LCBzeXMpOworfQorCitzdGF0aWMgdm9pZAorc3VuX2RlbGV0ZV9wYXJ0aXRpb24oaW50IGkpCit7CisJdW5zaWduZWQgaW50IG5zZWM7CisKKwlpZiAoaSA9PSAyCisJICYmIHN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9PSBTVU5fV0hPTEVfRElTSworCSAmJiAhc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0uc3RhcnRfY3lsaW5kZXIKKwkgJiYgKG5zZWMgPSBTVU5fU1NXQVAzMihzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycykpID09IGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVycykKKwkJcHJpbnRmKCJJZiB5b3Ugd2FudCB0byBtYWludGFpbiBTdW5PUy9Tb2xhcmlzIGNvbXBhdGliaWxpdHksICIKKwkJCSJjb25zaWRlciBsZWF2aW5nIHRoaXNcbiIKKwkJCSJwYXJ0aXRpb24gYXMgV2hvbGUgZGlzayAoNSksIHN0YXJ0aW5nIGF0IDAsIHdpdGggJXUgIgorCQkJInNlY3RvcnNcbiIsIG5zZWMpOworCXN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9IDA7CisJc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMgPSAwOworfQorCitzdGF0aWMgdm9pZAorc3VuX2NoYW5nZV9zeXNpZChpbnQgaSwgaW50IHN5cykKK3sKKwlpZiAoc3lzID09IExJTlVYX1NXQVAgJiYgIXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyKSB7CisJCXJlYWRfbWF5YmVfZW1wdHkoCisJCQkiSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgdGhlIHBhcnRpdGlvbiBhdCBvZmZzZXQgMFxuIgorCQkJImlzIFVGUywgRVhUMkZTIGZpbGVzeXN0ZW0gb3IgU3VuT1Mgc3dhcC4gUHV0dGluZyBMaW51eCBzd2FwXG4iCisJCQkidGhlcmUgbWF5IGRlc3Ryb3kgeW91ciBwYXJ0aXRpb24gdGFibGUgYW5kIGJvb3RibG9jay5cbiIKKwkJCSJUeXBlIFlFUyBpZiB5b3UncmUgdmVyeSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRoYXQgcGFydGl0aW9uXG4iCisJCQkidGFnZ2VkIHdpdGggODIgKExpbnV4IHN3YXApOiAiKTsKKwkJaWYgKHN0cmNtcCAobGluZV9wdHIsICJZRVNcbiIpKQorCQkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHN5cykgeworCWNhc2UgU1VOT1NfU1dBUDoKKwljYXNlIExJTlVYX1NXQVA6CisJCS8qIHN3YXBzIGFyZSBub3QgbW91bnRhYmxlIGJ5IGRlZmF1bHQgKi8KKwkJc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzIHw9IDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGFzc3VtZSBvdGhlciB0eXBlcyBhcmUgbW91bnRhYmxlOworCQkgICB1c2VyIGNhbiBjaGFuZ2UgaXQgYW55d2F5ICovCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmPSB+MHgwMTsKKwkJYnJlYWs7CisJfQorCXN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9IHN5czsKK30KKworc3RhdGljIHZvaWQKK3N1bl9saXN0X3RhYmxlKGludCB4dHJhKQoreworCWludCBpLCB3OworCisJdyA9IHN0cmxlbihkaXNrX2RldmljZSk7CisJaWYgKHh0cmEpCisJCXByaW50ZigKKwkJIlxuRGlzayAlcyAoU3VuIGRpc2sgbGFiZWwpOiAldSBoZWFkcywgJXUgc2VjdG9ycywgJXUgcnBtXG4iCisJCSIldSBjeWxpbmRlcnMsICV1IGFsdGVybmF0ZSBjeWxpbmRlcnMsICV1IHBoeXNpY2FsIGN5bGluZGVyc1xuIgorCQkiJXUgZXh0cmEgc2VjdHMvY3lsLCBpbnRlcmxlYXZlICV1OjFcbiIKKwkJIiVzXG4iCisJCSJVbml0cyA9ICVzIG9mICV1ICogNTEyIGJ5dGVzXG5cbiIsCisJCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+cnNwZWVkKSwKKwkJCWdfY3lsaW5kZXJzLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bmFjeWwpLAorCQkJU1VOX1NTV0FQMTYoc3VubGFiZWwtPnBjeWxjb3VudCksCisJCQlTVU5fU1NXQVAxNihzdW5sYWJlbC0+c3BhcmVjeWwpLAorCQkJU1VOX1NTV0FQMTYoc3VubGFiZWwtPmlsZmFjdCksCisJCQkoY2hhciAqKXN1bmxhYmVsLAorCQkJc3RyX3VuaXRzKFBMVVJBTCksIHVuaXRzX3Blcl9zZWN0b3IpOworCWVsc2UKKwkJcHJpbnRmKAorCSJcbkRpc2sgJXMgKFN1biBkaXNrIGxhYmVsKTogJXUgaGVhZHMsICV1IHNlY3RvcnMsICV1IGN5bGluZGVyc1xuIgorCSJVbml0cyA9ICVzIG9mICV1ICogNTEyIGJ5dGVzXG5cbiIsCisJCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBnX2N5bGluZGVycywKKwkJCXN0cl91bml0cyhQTFVSQUwpLCB1bml0c19wZXJfc2VjdG9yKTsKKworCXByaW50ZigiJSpzIEZsYWcgICAgU3RhcnQgICAgICAgRW5kICAgIEJsb2NrcyAgIElkICBTeXN0ZW1cbiIsCisJCXcgKyAxLCAiRGV2aWNlIik7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycykgeworCQkJdWludDMyX3Qgc3RhcnQgPSBTVU5fU1NXQVAzMihzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5zdGFydF9jeWxpbmRlcikgKiBnX2hlYWRzICogZ19zZWN0b3JzOworCQkJdWludDMyX3QgbGVuID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpOworCQkJcHJpbnRmKCIlcyAlYyVjICU5bHUgJTlsdSAlOWx1JWMgICUyeCAgJXNcbiIsCisJCQkJcGFydG5hbWUoZGlza19kZXZpY2UsIGkrMSwgdyksICAgICAgICAgICAgICAgICAgLyogZGV2aWNlICovCisJCQkJKHN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmIDB4MDEpID8gJ3UnIDogJyAnLCAgLyogZmxhZ3MgKi8KKwkJCQkoc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzICYgMHgxMCkgPyAncicgOiAnICcsCisJCQkJKGxvbmcpIHNjcm91bmQoc3RhcnQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgKi8KKwkJCQkobG9uZykgc2Nyb3VuZChzdGFydCtsZW4pLCAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgKi8KKwkJCQkobG9uZykgbGVuIC8gMiwgbGVuICYgMSA/ICcrJyA6ICcgJywgICAgICAgICAgICAvKiBvZGQgZmxhZyBvbiBlbmQgKi8KKwkJCQlzdW5sYWJlbC0+aW5mb3NbaV0uaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIGlkICovCisJCQkJcGFydGl0aW9uX3R5cGUoc3VubGFiZWwtPmluZm9zW2ldLmlkKSk7ICAgICAgICAgLyogdHlwZSBuYW1lICovCisJCX0KKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorCitzdGF0aWMgdm9pZAorc3VuX3NldF9hbHRfY3lsKHZvaWQpCit7CisJc3VubGFiZWwtPm5hY3lsID0KKwkJU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwgNjU1MzUsIDAsCisJCQkJIk51bWJlciBvZiBhbHRlcm5hdGUgY3lsaW5kZXJzIikpOworfQorCitzdGF0aWMgdm9pZAorc3VuX3NldF9uY3lsKGludCBjeWwpCit7CisJc3VubGFiZWwtPm5jeWwgPSBTVU5fU1NXQVAxNihjeWwpOworfQorCitzdGF0aWMgdm9pZAorc3VuX3NldF94Y3lsKHZvaWQpCit7CisJc3VubGFiZWwtPnNwYXJlY3lsID0KKwkJU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgU1VOX1NTV0FQMTYoc3VubGFiZWwtPnNwYXJlY3lsKSwgZ19zZWN0b3JzLCAwLAorCQkJCSJFeHRyYSBzZWN0b3JzIHBlciBjeWxpbmRlciIpKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9zZXRfaWxmYWN0KHZvaWQpCit7CisJc3VubGFiZWwtPmlsZmFjdCA9CisJCVNVTl9TU1dBUDE2KHJlYWRfaW50KDEsIFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5pbGZhY3QpLCAzMiwgMCwKKwkJCQkiSW50ZXJsZWF2ZSBmYWN0b3IiKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdW5fc2V0X3JzcGVlZCh2b2lkKQoreworCXN1bmxhYmVsLT5yc3BlZWQgPQorCQlTVU5fU1NXQVAxNihyZWFkX2ludCgxLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+cnNwZWVkKSwgMTAwMDAwLCAwLAorCQkJCSJSb3RhdGlvbiBzcGVlZCAocnBtKSIpKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9zZXRfcGN5bGNvdW50KHZvaWQpCit7CisJc3VubGFiZWwtPnBjeWxjb3VudCA9CisJCVNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5wY3lsY291bnQpLCA2NTUzNSwgMCwKKwkJCQkiTnVtYmVyIG9mIHBoeXNpY2FsIGN5bGluZGVycyIpKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0ZESVNLX0FEVkFOQ0VEICovCisKK3N0YXRpYyB2b2lkCitzdW5fd3JpdGVfdGFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdXNoID0gKHVuc2lnbmVkIHNob3J0ICopc3VubGFiZWw7CisJdW5zaWduZWQgc2hvcnQgY3N1bSA9IDA7CisKKwl3aGlsZSAodXNoIDwgKHVuc2lnbmVkIHNob3J0ICopKCZzdW5sYWJlbC0+Y3N1bSkpCisJCWNzdW0gXj0gKnVzaCsrOworCXN1bmxhYmVsLT5jc3VtID0gY3N1bTsKKwl3cml0ZV9zZWN0b3IoMCwgc3VubGFiZWwpOworfQorI2VuZGlmIC8qIFNVTl9MQUJFTCAqLwpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9maW5kZnMuYyBiL3V0aWwtbGludXgvZmluZGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllODk3OQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZmluZGZzLmMKQEAgLTAsMCArMSw0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIG1vdW50aW5nIGRldmljZXMgYnkgbGFiZWwvdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBKYXNvbiBTY2hvb24gPGZsb3lkcGlua0BnbWFpbC5jb20+CisgKiBTb21lIHBvcnRpb25zIGNyaWJiZWQgZnJvbSBlMmZzcHJvZ3MsIHV0aWwtbGludXgsIGRvc2ZzdG9vbHMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmaW5kZnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkxBQkVMPWxhYmVsIG9yIFVVSUQ9dXVpZCIKKy8vdXNhZ2U6I2RlZmluZSBmaW5kZnNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGaW5kIGEgZmlsZXN5c3RlbSBkZXZpY2UgYmFzZWQgb24gYSBsYWJlbCBvciBVVUlEIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmaW5kZnNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZmluZGZzIExBQkVMPU15RGV2aWNlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworaW50IGZpbmRmc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmluZGZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpkZXYgPSAqKythcmd2OworCisJaWYgKCFkZXYpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWlmIChzdHJuY21wKGRldiwgIi9kZXYvIiwgNSkgPT0gMCkgeworCQkvKiBKdXN0IHBhc3MgYW55IC9kZXYveHh4IG5hbWUgcmlnaHQgdGhyb3VnaC4KKwkJICogVGhpcyBtaWdodCBhaWQgaW4gc29tZSBzY3JpcHRzIGJlaW5nIGFibGUKKwkJICogdG8gY2FsbCB0aGlzIHVuY29uZGl0aW9uYWxseSAqLworCQlkZXYgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIE90aGVyd2lzZSwgaGFuZGxlIExBQkVMPXh4eCBhbmQgVVVJRD14eHgsCisJCSAqIGZhaWwgb24gYW55dGhpbmcgZWxzZSAqLworCQlpZiAoIXJlc29sdmVfbW91bnRfc3BlYyhhcmd2KSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAoKmFyZ3YgIT0gZGV2KSB7CisJCXB1dHMoKmFyZ3YpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2Zsb2NrLmMgYi91dGlsLWxpbnV4L2Zsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliZTRlZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZmxvY2suYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmbG9ja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1zeHVuXSBGRHx7RklMRSBbLWNdIFBST0cgQVJHU30iCisvL3VzYWdlOiNkZWZpbmUgZmxvY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJbVW5dbG9jayBmaWxlIGRlc2NyaXB0b3IsIG9yIGxvY2sgRklMRSwgcnVuIFBST0dcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2hhcmVkIGxvY2siCisvL3VzYWdlOiAgICAgIlxuCS14CUV4Y2x1c2l2ZSBsb2NrIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVW5sb2NrIEZEIgorLy91c2FnZTogICAgICJcbgktbglGYWlsIHJhdGhlciB0aGFuIHdhaXQiCisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBmbG9ja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmxvY2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBtb2RlLCBvcHQsIGZkOworCWVudW0geworCQlPUFRfcyA9ICgxIDw8IDApLAorCQlPUFRfeCA9ICgxIDw8IDEpLAorCQlPUFRfbiA9ICgxIDw8IDIpLAorCQlPUFRfdSA9ICgxIDw8IDMpLAorCQlPUFRfYyA9ICgxIDw8IDQpLAorCX07CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgZ2V0b3B0X2xvbmdvcHRzW10gQUxJR04xID0KKwkJInNoYXJlZFwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkiZXhjbHVzaXZlXDAiICAgTm9fYXJndW1lbnQgICAgICAgIngiCisJCSJ1bmxvY2tcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAidSIKKwkJIm5vbmJsb2NrXDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJuIgorCQk7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGdldG9wdF9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsKKworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrc3hudSIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGFyZ3ZbMV0pIHsKKwkJZmQgPSBvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZfE9fTk9DVFRZfE9fQ1JFQVQsIDA2NjYpOworCQlpZiAoZmQgPCAwICYmIGVycm5vID09IEVJU0RJUikKKwkJICAgICAgICBmZCA9IG9wZW4oYXJndlswXSwgT19SRE9OTFl8T19OT0NUVFkpOworCQlpZiAoZmQgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBhcmd2WzBdKTsKKwkJLy9UT0RPPyBjbG9zZV9vbl9leGVjX29uKGZkKTsKKwl9IGVsc2UgeworCQlmZCA9IHhhdG9pX3Bvc2l0aXZlKGFyZ3ZbMF0pOworCX0KKwlhcmd2Kys7CisKKwkvKiBJZiBpdCBpcyAiZmxvY2sgRklMRSAtYyBQUk9HIiwgdGhlbiAtYyBpc24ndCBjYXVnaHQgYnkgZ2V0b3B0MzI6CisJICogd2UgdXNlICIrIiBpbiBvcmRlciB0byBzdXBwb3J0ICJmbG9jayAtb3B0IEZJTEUgUFJPRyAtd2l0aC1vcHRzIiwKKwkgKiB3ZSBuZWVkIHRvIHJlbW92ZSAtYyBieSBoYW5kLgorCSAqIFRPRE86IGluIHVwc3RyZWFtLCAtYyAnUFJPRyBBUkdTJyBtZWFucyAicnVuIHNoIC1jICdQUk9HIEFSR1MnIgorCSAqLworCWlmIChhcmd2WzBdCisJICYmIGFyZ3ZbMF1bMF0gPT0gJy0nCisJICYmICggIChhcmd2WzBdWzFdID09ICdjJyAmJiAhYXJndlswXVsyXSkKKwkgICAgfHwgKEVOQUJMRV9MT05HX09QVFMgJiYgc3RyY21wKGFyZ3ZbMF0gKyAxLCAiLWNvbW1hbmQiKSA9PSAwKQorCSAgICApCisJKSB7CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoT1BUX3MgPT0gTE9DS19TSCAmJiBPUFRfeCA9PSBMT0NLX0VYICYmIE9QVF9uID09IExPQ0tfTkIgJiYgT1BUX3UgPT0gTE9DS19VTikgeworCQkvKiBXaXRoIHN1aXRhYmx5IG1hdGNoZWQgY29uc3RhbnRzLCBtb2RlIHNldHRpbmcgaXMgbXVjaCBzaW1wbGVyICovCisJCW1vZGUgPSBvcHQgJiAoTE9DS19TSCArIExPQ0tfRVggKyBMT0NLX05CICsgTE9DS19VTik7CisJCWlmICghKG1vZGUgJiB+TE9DS19OQikpCisJCQltb2RlIHw9IExPQ0tfRVg7CisJfSBlbHNlIHsKKwkJaWYgKG9wdCAmIE9QVF91KQorCQkJbW9kZSA9IExPQ0tfVU47CisJCWVsc2UgaWYgKG9wdCAmIE9QVF9zKQorCQkJbW9kZSA9IExPQ0tfU0g7CisJCWVsc2UKKwkJCW1vZGUgPSBMT0NLX0VYOworCQlpZiAob3B0ICYgT1BUX24pCisJCQltb2RlIHw9IExPQ0tfTkI7CisJfQorCisJaWYgKGZsb2NrKGZkLCBtb2RlKSAhPSAwKSB7CisJCWlmIChlcnJubyA9PSBFV09VTERCTE9DSykKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJfQorCisJaWYgKGFyZ3ZbMF0pCisJCXJldHVybiBzcGF3bl9hbmRfd2FpdChhcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZyZWVyYW1kaXNrLmMgYi91dGlsLWxpbnV4L2ZyZWVyYW1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5YWUxYQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZnJlZXJhbWRpc2suYwpAQCAtMCwwICsxLDQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmcmVlcmFtZGlzayBhbmQgZmRmbHVzaCBpbXBsZW1lbnRhdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYW5kIHdyaXR0ZW4gYnkgRW1hbnVlbGUgQ2FyYXR0aSA8d2l6QGlvbC5pdD4KKyAqIEFkanVzdGVkIGEgYml0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIFVuaWZpZWQgd2l0aCBmZGZsdXNoIGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmcmVlcmFtZGlza190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZyZWVyYW1kaXNrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHNwZWNpZmllZCByYW1kaXNrIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmcmVlcmFtZGlza19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmcmVlcmFtZGlzayAvZGV2L3JhbTJcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmRmbHVzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZkZmx1c2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGb3JjZSBmbG9wcHkgZGlzayBkcml2ZSB0byBkZXRlY3QgZGlzayBjaGFuZ2UiCisKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGcm9tIDxsaW51eC9mZC5oPiAqLworI2RlZmluZSBGREZMVVNIICBfSU8oMiwweDRiKQorCitpbnQgZnJlZXJhbWRpc2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZyZWVyYW1kaXNrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHhvcGVuKHNpbmdsZV9hcmd2KGFyZ3YpLCBPX1JEV1IpOworCisJLy8gQWN0IGxpa2UgZnJlZXJhbWRpc2ssIGZkZmx1c2gsIG9yIGJvdGggZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24uCisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsIChFTkFCTEVfRlJFRVJBTURJU0sgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ3InKQorCQkJfHwgIUVOQUJMRV9GREZMVVNIID8gQkxLRkxTQlVGIDogRkRGTFVTSCwgTlVMTCwgIiVzIiwgYXJndlsxXSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKGZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZzY2tfbWluaXguYyBiL3V0aWwtbGludXgvZnNja19taW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDhlY2IKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZzY2tfbWluaXguYwpAQCAtMCwwICsxLDEzMTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCisgKgorICogKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucworICoKKyAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KKyAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgorICoKKyAqIDE0LjExLjkxICAtCVRlc3Rpbmcgc2VlbXMgdG8gaGF2ZSBnb25lIHdlbGwuIEFkZGVkIHNvbWUKKyAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgorICoKKyAqIDE1LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb24gY29kZS4gSG9wZWZ1bGx5IGl0IG5vdGljZXMgbW9zdAorICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgorICoKKyAqIDE2LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb25zICh0aGFua3MgdG8gTWlrYSBKYWxhdmEpLiBNb3N0CisgKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCisgKgorICoKKyAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQorICoJCWtlcm5lbCBidWcgYXRlIG15IGVuaGFuY2VkIGZzY2sgaW4gZmVicnVhcnkuCisgKgorICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCisgKgorICogU2F0IE1hciAgNiAxODo1OTo0MiAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBPdXRwdXQgbmFtZWxlbiB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyYmxvY2sgaW5mb3JtYXRpb24KKyAqCisgKiBTYXQgT2N0ICA5IDExOjE3OjExIDE5OTMsIGZhaXRoQGNzLnVuYy5lZHU6IG1ha2UgZXhpdCBzdGF0dXMgY29uZm9ybQorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAorICoKKyAqIE1vbiBKYW4gIDMgMTE6MDY6NTIgMTk5NCAtIERyLiBXZXR0c3RlaW4gKGdyZWcld2luZC51dWNwQHBsYWlucy5ub2Rhay5lZHUpCisgKgkJCSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCisgKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCisgKgkJCSAgICAgIHByb2dyYW0gbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIgd2hlbiBwcm9ncmFtCisgKgkJCSAgICAgIGlzIGV4ZWN1dGVkLgorICoKKyAqIDMwLjEwLjk0IC0gYWRkZWQgc3VwcG9ydCBmb3IgdjIgZmlsZXN5c3RlbQorICogICAgICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKKyAqCisgKiAxMC4xMi45NCAgLSAgYWRkZWQgdGVzdCB0byBwcmV2ZW50IGNoZWNraW5nIG9mIG1vdW50ZWQgZnMgYWRhcHRlZAorICogICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCisgKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQorICoKKyAqIDAxLjA3Ljk2ICAtIEZpeGVkIHRoZSB2MiBmcyBzdHVmZiB0byB1c2UgdGhlIHJpZ2h0ICNkZWZpbmVzIGFuZCBzdWNoCisgKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCisgKgorICogMDIuMDcuOTYgIC0gQWRkZWQgQyBiaXQgZmlkZGxpbmcgcm91dGluZXMgZnJvbSBybWtAZWNzLnNvdG9uLmFjLnVrCisgKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQorICoJICAgICAgIHRoYXQgdGhlIEFSTSBpcyBwb3dlcmZ1bCBlbm91Z2ggdG8gZG8gdGhpcyBpbiBDIHdoZXJlYXMKKyAqICAgICAgICAgICAgIGkzODYgYW5kIG02NGsgbXVzdCB1c2UgYXNzZW1ibHkgdG8gZ2V0IGl0IGZhc3QgPjotKQorICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCisgKgkgICAgICAgKGphbmxAbWF0aC51aW8ubm8sIE5pY29sYWkgTGFuZ2ZlbGR0KQorICoKKyAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKKyAqICAgICAgICAgICAgIHdhcm5pbmdzLiAgQWRkZWQgbWM2OGsgYml0b3BzIGZyb20KKyAqCSAgICAgICBKb2VyZyBEb3JjaGFpbiA8ZG9yY2hhaW5AbXBpLXNiLm1wZy5kZT4uCisgKgorICogMDYuMTEuOTYgIC0gQWRkZWQgdjIgY29kZSBzdWJtaXR0ZWQgYnkgSm9lcmcgRG9yY2hhaW4sIGJ1dCB3cml0dGVuIGJ5CisgKiAgICAgICAgICAgICBBbmRyZWFzIFNjaHdhYi4KKyAqCisgKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNaWNraWV3aWN6IDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqCisgKgorICogSSd2ZSBoYWQgbm8gdGltZSB0byBhZGQgY29tbWVudHMgLSBob3BlZnVsbHkgdGhlIGZ1bmN0aW9uIG5hbWVzCisgKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCisgKiB0aGUgZmlsZSBzeXN0ZW0gaXMgcXVpZXNjZW50IC0gZG9uJ3QgdXNlIGl0IG9uIGEgbW91bnRlZCBkZXZpY2UKKyAqIHVubGVzcyB5b3UgY2FuIGJlIHN1cmUgbm9ib2R5IGlzIHdyaXRpbmcgdG8gaXQgKGFuZCByZW1lbWJlciB0aGF0IHRoZQorICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCisgKgorICogVXNhZ2U6IGZzY2sgWy1sYXJ2c21dIGRldmljZQorICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcworICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCisgKgktciBmb3IgcmVwYWlycyAoaW50ZXJhY3RpdmUpIChub3QgaW1wbGVtZW50ZWQpCisgKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCisgKgktcyBmb3Igc3VwZXJibG9jayBpbmZvCisgKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKKyAqCS1mIGZvcmNlIGZpbGVzeXN0ZW0gY2hlY2sgZXZlbiBpZiBmaWxlc3lzdGVtIG1hcmtlZCBhcyB2YWxpZAorICoKKyAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAorICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmc2NrX21pbml4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxhcnZzbWZdIEJMT0NLREVWIgorLy91c2FnZTojZGVmaW5lIGZzY2tfbWluaXhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGVjayBNSU5JWCBmaWxlc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIGZpbGVuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUGVyZm9ybSBpbnRlcmFjdGl2ZSByZXBhaXJzIgorLy91c2FnZTogICAgICJcbgktYQlQZXJmb3JtIGF1dG9tYXRpYyByZXBhaXJzIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcwlPdXRwdXQgc3VwZXJibG9jayBpbmZvcm1hdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JU2hvdyBcIm1vZGUgbm90IGNsZWFyZWRcIiB3YXJuaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgZmlsZSBzeXN0ZW0gY2hlY2siCisKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1pbml4LmgiCisKKyNpZm5kZWYgQkxLR0VUU0laRQorI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KKyNlbmRpZgorCitzdHJ1Y3QgQlVHX2JhZF9pbm9kZV9zaXplIHsKKwljaGFyIEJVR19iYWRfaW5vZGUxX3NpemVbKElOT0RFX1NJWkUxICogTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkgPyAtMSA6IDFdOworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorCWNoYXIgQlVHX2JhZF9pbm9kZTJfc2l6ZVsoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKSA/IC0xIDogMV07CisjZW5kaWYKK307CisKK2VudW0geworI2lmZGVmIFVOVVNFRAorCU1JTklYMV9MSU5LX01BWCA9IDI1MCwKKwlNSU5JWDJfTElOS19NQVggPSA2NTUzMCwKKwlNSU5JWF9JX01BUF9TTE9UUyA9IDgsCisJTUlOSVhfWl9NQVBfU0xPVFMgPSA2NCwKKwlNSU5JWF9WMSA9IDB4MDAwMSwgICAgICAvKiBvcmlnaW5hbCBtaW5peCBmcyAqLworCU1JTklYX1YyID0gMHgwMDAyLCAgICAgIC8qIG1pbml4IFYyIGZzICovCisjZW5kaWYKKwlNSU5JWF9OQU1FX01BWCA9IDI1NSwgICAgICAgICAvKiAjIGNoYXJzIGluIGEgZmlsZSBuYW1lICovCit9OworCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitlbnVtIHsgdmVyc2lvbjIgPSAwIH07CisjZW5kaWYKKworZW51bSB7IE1BWF9ERVBUSCA9IDMyIH07CisKK2VudW0geyBkZXZfZmQgPSAzIH07CisKK3N0cnVjdCBnbG9iYWxzIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwlzbWFsbGludCB2ZXJzaW9uMjsKKyNlbmRpZgorCXNtYWxsaW50IGNoYW5nZWQ7ICAvKiBpcyBmaWxlc3lzdGVtIG1vZGlmaWVkPyAqLworCXNtYWxsaW50IGVycm9yc191bmNvcnJlY3RlZDsgIC8qIGZsYWcgaWYgc29tZSBlcnJvciB3YXMgbm90IGNvcnJlY3RlZCAqLworCXNtYWxsaW50IHRlcm1pb3Nfc2V0OworCXNtYWxsaW50IGRpcnNpemU7CisJc21hbGxpbnQgbmFtZWxlbjsKKwljb25zdCBjaGFyICpkZXZpY2VfbmFtZTsKKwlpbnQgZGlyZWN0b3J5LCByZWd1bGFyLCBibG9ja2RldiwgY2hhcmRldiwgbGlua3MsIHN5bWxpbmtzLCB0b3RhbDsKKwljaGFyICppbm9kZV9idWZmZXI7CisKKwljaGFyICppbm9kZV9tYXA7CisJY2hhciAqem9uZV9tYXA7CisKKwl1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudDsKKwl1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50OworCisJLyogRmlsZS1uYW1lIGRhdGEgKi8KKwlpbnQgbmFtZV9kZXB0aDsKKwljaGFyICpuYW1lX2NvbXBvbmVudFtNQVhfREVQVEgrMV07CisKKwkvKiBCaWdnZXIgc3R1ZmYgKi8KKwlzdHJ1Y3QgdGVybWlvcyBzdl90ZXJtaW9zOworCWNoYXIgc3VwZXJibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CisJY2hhciBhZGRfem9uZV9pbmRfYmxrW0JMT0NLX1NJWkVdOworCWNoYXIgYWRkX3pvbmVfZGluZF9ibGtbQkxPQ0tfU0laRV07CisJSUZfRkVBVFVSRV9NSU5JWDIoY2hhciBhZGRfem9uZV90aW5kX2Jsa1tCTE9DS19TSVpFXTspCisJY2hhciBjaGVja19maWxlX2Jsa1tCTE9DS19TSVpFXTsKKworCS8qIEZpbGUtbmFtZSBkYXRhICovCisJY2hhciBjdXJyZW50X25hbWVbTUFYX0RFUFRIICogTUlOSVhfTkFNRV9NQVhdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorI2RlZmluZSB2ZXJzaW9uMiAgICAgICAgICAgKEcudmVyc2lvbjIgICAgICAgICAgICkKKyNlbmRpZgorI2RlZmluZSBjaGFuZ2VkICAgICAgICAgICAgKEcuY2hhbmdlZCAgICAgICAgICAgICkKKyNkZWZpbmUgZXJyb3JzX3VuY29ycmVjdGVkIChHLmVycm9yc191bmNvcnJlY3RlZCApCisjZGVmaW5lIHRlcm1pb3Nfc2V0ICAgICAgICAoRy50ZXJtaW9zX3NldCAgICAgICAgKQorI2RlZmluZSBkaXJzaXplICAgICAgICAgICAgKEcuZGlyc2l6ZSAgICAgICAgICAgICkKKyNkZWZpbmUgbmFtZWxlbiAgICAgICAgICAgIChHLm5hbWVsZW4gICAgICAgICAgICApCisjZGVmaW5lIGRldmljZV9uYW1lICAgICAgICAoRy5kZXZpY2VfbmFtZSAgICAgICAgKQorI2RlZmluZSBkaXJlY3RvcnkgICAgICAgICAgKEcuZGlyZWN0b3J5ICAgICAgICAgICkKKyNkZWZpbmUgcmVndWxhciAgICAgICAgICAgIChHLnJlZ3VsYXIgICAgICAgICAgICApCisjZGVmaW5lIGJsb2NrZGV2ICAgICAgICAgICAoRy5ibG9ja2RldiAgICAgICAgICAgKQorI2RlZmluZSBjaGFyZGV2ICAgICAgICAgICAgKEcuY2hhcmRldiAgICAgICAgICAgICkKKyNkZWZpbmUgbGlua3MgICAgICAgICAgICAgIChHLmxpbmtzICAgICAgICAgICAgICApCisjZGVmaW5lIHN5bWxpbmtzICAgICAgICAgICAoRy5zeW1saW5rcyAgICAgICAgICAgKQorI2RlZmluZSB0b3RhbCAgICAgICAgICAgICAgKEcudG90YWwgICAgICAgICAgICAgICkKKyNkZWZpbmUgaW5vZGVfYnVmZmVyICAgICAgIChHLmlub2RlX2J1ZmZlciAgICAgICApCisjZGVmaW5lIGlub2RlX21hcCAgICAgICAgICAoRy5pbm9kZV9tYXAgICAgICAgICAgKQorI2RlZmluZSB6b25lX21hcCAgICAgICAgICAgKEcuem9uZV9tYXAgICAgICAgICAgICkKKyNkZWZpbmUgaW5vZGVfY291bnQgICAgICAgIChHLmlub2RlX2NvdW50ICAgICAgICApCisjZGVmaW5lIHpvbmVfY291bnQgICAgICAgICAoRy56b25lX2NvdW50ICAgICAgICAgKQorI2RlZmluZSBuYW1lX2RlcHRoICAgICAgICAgKEcubmFtZV9kZXB0aCAgICAgICAgICkKKyNkZWZpbmUgbmFtZV9jb21wb25lbnQgICAgIChHLm5hbWVfY29tcG9uZW50ICAgICApCisjZGVmaW5lIHN2X3Rlcm1pb3MgICAgICAgICAoRy5zdl90ZXJtaW9zICAgICAgICAgKQorI2RlZmluZSBzdXBlcmJsb2NrX2J1ZmZlciAgKEcuc3VwZXJibG9ja19idWZmZXIgKQorI2RlZmluZSBhZGRfem9uZV9pbmRfYmxrICAgKEcuYWRkX3pvbmVfaW5kX2JsayAgICkKKyNkZWZpbmUgYWRkX3pvbmVfZGluZF9ibGsgIChHLmFkZF96b25lX2RpbmRfYmxrICApCisjZGVmaW5lIGFkZF96b25lX3RpbmRfYmxrICAoRy5hZGRfem9uZV90aW5kX2JsayAgKQorI2RlZmluZSBjaGVja19maWxlX2JsayAgICAgKEcuY2hlY2tfZmlsZV9ibGsgICAgICkKKyNkZWZpbmUgY3VycmVudF9uYW1lICAgICAgIChHLmN1cnJlbnRfbmFtZSAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJZGlyc2l6ZSA9IDE2OyBcCisJbmFtZWxlbiA9IDE0OyBcCisJY3VycmVudF9uYW1lWzBdID0gJy8nOyBcCisJLypjdXJyZW50X25hbWVbMV0gPSAnXDAnOyovIFwKKwluYW1lX2NvbXBvbmVudFswXSA9ICZjdXJyZW50X25hbWVbMF07IFwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBPUFRJT05fU1RSICJsYXJ2c21mIgorZW51bSB7CisJT1BUX2wgPSAoMSA8PCAwKSwKKwlPUFRfYSA9ICgxIDw8IDEpLAorCU9QVF9yID0gKDEgPDwgMiksCisJT1BUX3YgPSAoMSA8PCAzKSwKKwlPUFRfcyA9ICgxIDw8IDQpLAorCU9QVF93ID0gKDEgPDwgNSksCisJT1BUX2YgPSAoMSA8PCA2KSwKK307CisjZGVmaW5lIE9QVF9saXN0ICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbCkKKyNkZWZpbmUgT1BUX2F1dG9tYXRpYyAob3B0aW9uX21hc2szMiAmIE9QVF9hKQorI2RlZmluZSBPUFRfcmVwYWlyICAgIChvcHRpb25fbWFzazMyICYgT1BUX3IpCisjZGVmaW5lIE9QVF92ZXJib3NlICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikKKyNkZWZpbmUgT1BUX3Nob3cgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBPUFRfd2Fybl9tb2RlIChvcHRpb25fbWFzazMyICYgT1BUX3cpCisjZGVmaW5lIE9QVF9mb3JjZSAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZikKKy8qIG5vbi1hdXRvbWF0aWMgcmVwYWlycyByZXF1ZXN0ZWQ/ICovCisjZGVmaW5lIE9QVF9tYW51YWwgICAgKChvcHRpb25fbWFzazMyICYgKE9QVF9hfE9QVF9yKSkgPT0gT1BUX3IpCisKKworI2RlZmluZSBJbm9kZTEgKCgoc3RydWN0IG1pbml4MV9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCisjZGVmaW5lIElub2RlMiAoKChzdHJ1Y3QgbWluaXgyX2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKKworI2RlZmluZSBTdXBlciAoKihzdHJ1Y3QgbWluaXhfc3VwZXJibG9jayAqKShzdXBlcmJsb2NrX2J1ZmZlcikpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKyMgZGVmaW5lIFpPTkVTICAgICgodW5zaWduZWQpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKKyNlbHNlCisjIGRlZmluZSBaT05FUyAgICAoKHVuc2lnbmVkKShTdXBlci5zX256b25lcykpCisjZW5kaWYKKyNkZWZpbmUgSU5PREVTICAgICgodW5zaWduZWQpU3VwZXIuc19uaW5vZGVzKQorI2RlZmluZSBJTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX2ltYXBfYmxvY2tzKQorI2RlZmluZSBaTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX3ptYXBfYmxvY2tzKQorI2RlZmluZSBGSVJTVFpPTkUgKCh1bnNpZ25lZClTdXBlci5zX2ZpcnN0ZGF0YXpvbmUpCisjZGVmaW5lIFpPTkVTSVpFICAoKHVuc2lnbmVkKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKKyNkZWZpbmUgTUFYU0laRSAgICgodW5zaWduZWQpU3VwZXIuc19tYXhfc2l6ZSkKKyNkZWZpbmUgTUFHSUMgICAgIChTdXBlci5zX21hZ2ljKQorCisvKiBnY2MgbGlrZXMgdGhpcyBtb3JlIChjb2RlIGlzIHNtYWxsZXIpIHRoYW4gbWFjcm8gdmFyaWFudCAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgZGl2X3JvdW5kdXAodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHNpemUgKyBuLTEpIC8gbjsKK30KKworI2lmICFFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKyNkZWZpbmUgSU5PREVfQkxPQ0tTICAgICAgICAgICAgZGl2X3JvdW5kdXAoSU5PREVTLCBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykKKyNlbHNlCisjZGVmaW5lIElOT0RFX0JMT0NLUyAgICAgICAgICAgIGRpdl9yb3VuZHVwKElOT0RFUywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyA6IE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLKSkKKyNlbmRpZgorCisjZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFICAgICAgIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQorI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAgICAgICAgICAoMiArIElNQVBTICsgWk1BUFMgKyBJTk9ERV9CTE9DS1MpCisKKy8qIEJlZm9yZSB5b3UgYXNrICJ3aGVyZSB0aGV5IGNvbWUgZnJvbT8iOiAqLworLyogc2V0Yml0L2NscmJpdCBhcmUgc3VwcGxpZWQgYnkgc3lzL3BhcmFtLmggKi8KKworc3RhdGljIGludCBtaW5peF9iaXQoY29uc3QgY2hhciAqYSwgdW5zaWduZWQgaSkKK3sKKwlyZXR1cm4gKGFbaSA+PiAzXSAmICgxPDwoaSAmIDcpKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbml4X3NldGJpdChjaGFyICphLCB1bnNpZ25lZCBpKQoreworCXNldGJpdChhLCBpKTsKKwljaGFuZ2VkID0gMTsKK30KK3N0YXRpYyB2b2lkIG1pbml4X2NscmJpdChjaGFyICphLCB1bnNpZ25lZCBpKQoreworCWNscmJpdChhLCBpKTsKKwljaGFuZ2VkID0gMTsKK30KKworLyogTm90ZTogZG8gbm90IGFzc3VtZSAwLzEsIGl0IGlzIDAvbm9uemVybyAqLworI2RlZmluZSB6b25lX2luX3VzZSh4KSAgKG1pbml4X2JpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQorI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgKG1pbml4X2JpdChpbm9kZV9tYXAsKHgpKSkKKworI2RlZmluZSBtYXJrX2lub2RlKHgpICAgKG1pbml4X3NldGJpdChpbm9kZV9tYXAsKHgpKSkKKyNkZWZpbmUgdW5tYXJrX2lub2RlKHgpIChtaW5peF9jbHJiaXQoaW5vZGVfbWFwLCh4KSkpCisKKyNkZWZpbmUgbWFya196b25lKHgpICAgIChtaW5peF9zZXRiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKKyNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgIChtaW5peF9jbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKKworCitzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW5vKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW5vKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKHRlcm1pb3Nfc2V0KQorCQl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmc3ZfdGVybWlvcyk7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgc3RyKTsKK30KKworc3RhdGljIHZvaWQgcHVzaF9maWxlbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCS8vICAvZGlyL2Rpci9kaXIvZmlsZQorCS8vICBeICAgXiAgIF4KKwkvLyBbMF0gWzFdIFsyXSA8LW5hbWVfY29tcG9uZW50W2ldCisJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpIHsKKwkJaW50IGxlbjsKKwkJY2hhciAqcCA9IG5hbWVfY29tcG9uZW50W25hbWVfZGVwdGhdOworCQkqcCsrID0gJy8nOworCQlsZW4gPSBzcHJpbnRmKHAsICIlLipzIiwgbmFtZWxlbiwgbmFtZSk7CisJCW5hbWVfY29tcG9uZW50W25hbWVfZGVwdGggKyAxXSA9IHAgKyBsZW47CisJfQorCW5hbWVfZGVwdGgrKzsKK30KKworc3RhdGljIHZvaWQgcG9wX2ZpbGVuYW1lKHZvaWQpCit7CisJbmFtZV9kZXB0aC0tOworCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKSB7CisJCSpuYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoXSA9ICdcMCc7CisJCWlmICghbmFtZV9kZXB0aCkgeworCQkJY3VycmVudF9uYW1lWzBdID0gJy8nOworCQkJY3VycmVudF9uYW1lWzFdID0gJ1wwJzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGVmKQoreworCWludCBjOworCisJaWYgKCFPUFRfcmVwYWlyKSB7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCXJldHVybiAwOworCX0KKwlpZiAoT1BUX2F1dG9tYXRpYykgeworCQliYl9wdXRjaGFyKCdcbicpOworCQlpZiAoIWRlZikKKwkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCXJldHVybiBkZWY7CisJfQorCXByaW50ZihkZWYgPyAiJXMgKHkvbik/ICIgOiAiJXMgKG4veSk/ICIsIHN0cmluZyk7CisJZm9yICg7OykgeworCQlmZmx1c2hfYWxsKCk7CisJCWMgPSBnZXRjaGFyKCk7CisJCWlmIChjID09IEVPRikgeworCQkJaWYgKCFkZWYpCisJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwkJCXJldHVybiBkZWY7CisJCX0KKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCQljIHw9IDB4MjA7IC8qIHRvbG93ZXIgKi8KKwkJaWYgKGMgPT0gJ3knKSB7CisJCQlkZWYgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGMgPT0gJ24nKSB7CisJCQlkZWYgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRlZikKKwkJcHJpbnRmKCJ5XG4iKTsKKwllbHNlIHsKKwkJcHJpbnRmKCJuXG4iKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9CisJcmV0dXJuIGRlZjsKK30KKworLyoKKyAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCisgKiBtb3VudGVkIHBhcnRpdGlvbi4gIENvZGUgYWRhcHRlZCBmcm9tIGUyZnNjaywgQ29weXJpZ2h0IChDKSAxOTkzLAorICogMTk5NCBUaGVvZG9yZSBUcydvLiAgQWxzbyBsaWNlbnNlZCB1bmRlciBHUEwuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX21vdW50KHZvaWQpCit7CisJaWYgKGZpbmRfbW91bnRfcG9pbnQoZGV2aWNlX25hbWUsIDApKSB7CisJCWludCBjb250OworI2lmIEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVAorCQkvKgorCQkgKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQtb25seSwgdGhlbiAvZXRjL210YWIgaXMKKwkJICogcHJvYmFibHkgbm90IGNvcnJlY3Q7IHNvIHdlIHdvbid0IGlzc3VlIGEgd2FybmluZyBiYXNlZCBvbgorCQkgKiBpdC4KKwkJICovCisJCWludCBmZCA9IG9wZW4oYmJfcGF0aF9tdGFiX2ZpbGUsIE9fUkRXUik7CisKKwkJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykKKwkJCXJldHVybjsKKwkJY2xvc2UoZmQpOworI2VuZGlmCisJCXByaW50ZigiJXMgaXMgbW91bnRlZC4gIiwgZGV2aWNlX25hbWUpOworCQljb250ID0gMDsKKwkJaWYgKGlzYXR0eSgwKSAmJiBpc2F0dHkoMSkpCisJCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKKwkJaWYgKCFjb250KSB7CisJCQlwcmludGYoIkNoZWNrIGFib3J0ZWRcbiIpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJfQorfQorCisvKgorICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKKyAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAorICogaWYgYW4gZXJyb3Igd2FzIGNvcnJlY3RlZCwgYW5kIHJldHVybnMgdGhlIHpvbmUgKDAgZm9yIG5vIHpvbmUKKyAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KKyAqLworc3RhdGljIGludCBjaGVja196b25lX25yMih1aW50MzJfdCAqbnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJY29uc3QgY2hhciAqbXNnOworCWlmICghKm5yKQorCQlyZXR1cm4gMDsKKwlpZiAoKm5yIDwgRklSU1RaT05FKQorCQltc2cgPSAiPCBGSVJTVFpPTkUiOworCWVsc2UgaWYgKCpuciA+PSBaT05FUykKKwkJbXNnID0gIj49IFpPTkVTIjsKKwllbHNlCisJCXJldHVybiAqbnI7CisJcHJpbnRmKCJab25lIG5yICVzIGluIGZpbGUgJyVzJy4gIiwgbXNnLCBjdXJyZW50X25hbWUpOworCWlmIChhc2soIlJlbW92ZSBibG9jayIsIDEpKSB7CisJCSpuciA9IDA7CisJCSpjb3JyZWN0ZWQgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja196b25lX25yKHVpbnQxNl90ICpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwl1aW50MzJfdCBucjMyID0gKm5yOworCWludCByID0gY2hlY2tfem9uZV9ucjIoJm5yMzIsIGNvcnJlY3RlZCk7CisJKm5yID0gKHVpbnQxNl90KW5yMzI7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgorICovCitzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKHVuc2lnbmVkIG5yLCB2b2lkICphZGRyKQoreworCWlmICghbnIpIHsKKwkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOworCQlyZXR1cm47CisJfQorCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpOworCWlmIChCTE9DS19TSVpFICE9IGZ1bGxfcmVhZChkZXZfZmQsIGFkZHIsIEJMT0NLX1NJWkUpKSB7CisJCXByaW50ZigiJXM6IGJhZCBibG9jayAldSBpbiBmaWxlICclcydcbiIsCisJCQkJYmJfbXNnX3JlYWRfZXJyb3IsIG5yLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CisJfQorfQorCisvKgorICogd3JpdGVfYmxvY2sgd3JpdGVzIGJsb2NrIG5yIHRvIGRpc2suCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIG5yLCB2b2lkICphZGRyKQoreworCWlmICghbnIpCisJCXJldHVybjsKKwlpZiAobnIgPCBGSVJTVFpPTkUgfHwgbnIgPj0gWk9ORVMpIHsKKwkJcHJpbnRmKCJJbnRlcm5hbCBlcnJvcjogdHJ5aW5nIHRvIHdyaXRlIGJhZCBibG9ja1xuIgorCQkJICAgIldyaXRlIHJlcXVlc3QgaWdub3JlZFxuIik7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCXJldHVybjsKKwl9CisJeGxzZWVrKGRldl9mZCwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCk7CisJaWYgKEJMT0NLX1NJWkUgIT0gZnVsbF93cml0ZShkZXZfZmQsIGFkZHIsIEJMT0NLX1NJWkUpKSB7CisJCXByaW50ZigiJXM6IGJhZCBibG9jayAldSBpbiBmaWxlICclcydcbiIsCisJCQkJYmJfbXNnX3dyaXRlX2Vycm9yLCBuciwgY3VycmVudF9uYW1lKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9Cit9CisKKy8qCisgKiBtYXBfYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCisgKiBJdCBzZXRzICdjaGFuZ2VkJyBpZiB0aGUgaW5vZGUgaGFzIG5lZWRlZCBjaGFuZ2luZywgYW5kIHJlLXdyaXRlcworICogYW55IGluZGlyZWN0IGJsb2NrcyB3aXRoIGVycm9ycy4KKyAqLworc3RhdGljIGludCBtYXBfYmxvY2soc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGJsa25yKQoreworCXVpbnQxNl90IGluZFtCTE9DS19TSVpFID4+IDFdOworCWludCBibG9jaywgcmVzdWx0OworCXNtYWxsaW50IGJsa19jaGc7CisKKwlpZiAoYmxrbnIgPCA3KQorCQlyZXR1cm4gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKKwlibGtuciAtPSA3OworCWlmIChibGtuciA8IDUxMikgeworCQlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKKwkJZ290byBjb21tb247CisJfQorCWJsa25yIC09IDUxMjsKKwlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBpbmQpOyAvKiBkb3VibGUgaW5kaXJlY3QgKi8KKwlibGtfY2hnID0gMDsKKwlyZXN1bHQgPSBjaGVja196b25lX25yKCZpbmRbYmxrbnIgLyA1MTJdLCAmYmxrX2NoZyk7CisJaWYgKGJsa19jaGcpCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBpbmQpOworCWJsb2NrID0gcmVzdWx0OworIGNvbW1vbjoKKwlyZWFkX2Jsb2NrKGJsb2NrLCBpbmQpOworCWJsa19jaGcgPSAwOworCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoJmluZFtibGtuciAlIDUxMl0sICZibGtfY2hnKTsKKwlpZiAoYmxrX2NoZykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGluZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIGludCBtYXBfYmxvY2syKHN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBibGtucikKK3sKKwl1aW50MzJfdCBpbmRbQkxPQ0tfU0laRSA+PiAyXTsKKwlpbnQgYmxvY2ssIHJlc3VsdDsKKwlzbWFsbGludCBibGtfY2hnOworCisJaWYgKGJsa25yIDwgNykKKwkJcmV0dXJuIGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOworCWJsa25yIC09IDc7CisJaWYgKGJsa25yIDwgMjU2KSB7CisJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKKwkJZ290byBjb21tb24yOworCX0KKwlibGtuciAtPSAyNTY7CisJaWYgKGJsa25yIDwgMjU2ICogMjU2KSB7CisJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKKwkJZ290byBjb21tb24xOworCX0KKwlibGtuciAtPSAyNTYgKiAyNTY7CisJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOworCXJlYWRfYmxvY2soYmxvY2ssIGluZCk7IC8qIHRyaXBsZSBpbmRpcmVjdCAqLworCWJsa19jaGcgPSAwOworCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKCZpbmRbYmxrbnIgLyAoMjU2ICogMjU2KV0sICZibGtfY2hnKTsKKwlpZiAoYmxrX2NoZykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGluZCk7CisJYmxvY2sgPSByZXN1bHQ7CisgY29tbW9uMToKKwlyZWFkX2Jsb2NrKGJsb2NrLCBpbmQpOyAvKiBkb3VibGUgaW5kaXJlY3QgKi8KKwlibGtfY2hnID0gMDsKKwlyZXN1bHQgPSBjaGVja196b25lX25yMigmaW5kWyhibGtuciAvIDI1NikgJSAyNTZdLCAmYmxrX2NoZyk7CisJaWYgKGJsa19jaGcpCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBpbmQpOworCWJsb2NrID0gcmVzdWx0OworIGNvbW1vbjI6CisJcmVhZF9ibG9jayhibG9jaywgaW5kKTsKKwlibGtfY2hnID0gMDsKKwlyZXN1bHQgPSBjaGVja196b25lX25yMigmaW5kW2Jsa25yICUgMjU2XSwgJmJsa19jaGcpOworCWlmIChibGtfY2hnKQorCQl3cml0ZV9ibG9jayhibG9jaywgaW5kKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHdyaXRlX3N1cGVyYmxvY2sodm9pZCkKK3sKKwkvKgorCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKKwkgKiBhcmUgdW5jb3JyZWN0ZWQgZXJyb3JzLiAgVGhlIGZpbGVzeXN0ZW0gdmFsaWQgZmxhZyBpcworCSAqIHVuY29uZGl0aW9uYWxseSBzZXQgaWYgd2UgZ2V0IHRoaXMgZmFyLgorCSAqLworCVN1cGVyLnNfc3RhdGUgfD0gTUlOSVhfVkFMSURfRlMgfCBNSU5JWF9FUlJPUl9GUzsKKwlpZiAoIWVycm9yc191bmNvcnJlY3RlZCkKKwkJU3VwZXIuc19zdGF0ZSAmPSB+TUlOSVhfRVJST1JfRlM7CisKKwl4bHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisJaWYgKEJMT0NLX1NJWkUgIT0gZnVsbF93cml0ZShkZXZfZmQsIHN1cGVyYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKKwkJZGllKCJjYW4ndCB3cml0ZSBzdXBlcmJsb2NrIik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RhYmxlcyh2b2lkKQoreworCXdyaXRlX3N1cGVyYmxvY2soKTsKKworCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoZGV2X2ZkLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCisJCWRpZSgiY2FuJ3Qgd3JpdGUgaW5vZGUgbWFwIik7CisJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShkZXZfZmQsIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQorCQlkaWUoImNhbid0IHdyaXRlIHpvbmUgbWFwIik7CisJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHdyaXRlKGRldl9mZCwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCisJCWRpZSgiY2FuJ3Qgd3JpdGUgaW5vZGVzIik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9kaXJzaXplKHZvaWQpCit7CisJaW50IGJsb2NrOworCWNoYXIgYmxrW0JMT0NLX1NJWkVdOworCWludCBzaXplOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisJaWYgKHZlcnNpb24yKQorCQlibG9jayA9IElub2RlMltNSU5JWF9ST09UX0lOT10uaV96b25lWzBdOworCWVsc2UKKyNlbmRpZgorCQlibG9jayA9IElub2RlMVtNSU5JWF9ST09UX0lOT10uaV96b25lWzBdOworCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CisJZm9yIChzaXplID0gMTY7IHNpemUgPCBCTE9DS19TSVpFOyBzaXplIDw8PSAxKSB7CisJCWlmIChzdHJjbXAoYmxrICsgc2l6ZSArIDIsICIuLiIpID09IDApIHsKKwkJCWRpcnNpemUgPSBzaXplOworCQkJbmFtZWxlbiA9IHNpemUgLSAyOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qIHVzZSBkZWZhdWx0cyAqLworfQorCitzdGF0aWMgdm9pZCByZWFkX3N1cGVyYmxvY2sodm9pZCkKK3sKKwl4bHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisJaWYgKEJMT0NLX1NJWkUgIT0gZnVsbF9yZWFkKGRldl9mZCwgc3VwZXJibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQorCQlkaWUoImNhbid0IHJlYWQgc3VwZXJibG9jayIpOworCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgdG86CisJbmFtZWxlbiA9IDE0OworCWRpcnNpemUgPSAxNjsKKwl2ZXJzaW9uMiA9IDA7CisJKi8KKwlpZiAoTUFHSUMgPT0gTUlOSVgxX1NVUEVSX01BR0lDKSB7CisJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDFfU1VQRVJfTUFHSUMyKSB7CisJCW5hbWVsZW4gPSAzMDsKKwkJZGlyc2l6ZSA9IDMyOworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CisJCXZlcnNpb24yID0gMTsKKwl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKKwkJbmFtZWxlbiA9IDMwOworCQlkaXJzaXplID0gMzI7CisJCXZlcnNpb24yID0gMTsKKyNlbmRpZgorCX0gZWxzZQorCQlkaWUoImJhZCBtYWdpYyBudW1iZXIgaW4gc3VwZXJibG9jayIpOworCWlmIChaT05FU0laRSAhPSAwIHx8IEJMT0NLX1NJWkUgIT0gMTAyNCkKKwkJZGllKCJvbmx5IDFrIGJsb2Nrcy96b25lcyBzdXBwb3J0ZWQiKTsKKwlpZiAoSU1BUFMgKiBCTE9DS19TSVpFICogOCA8IElOT0RFUyArIDEpCisJCWRpZSgiYmFkIHNfaW1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXJibG9jayIpOworCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgWk9ORVMgLSBGSVJTVFpPTkUgKyAxKQorCQlkaWUoImJhZCBzX3ptYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyYmxvY2siKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF90YWJsZXModm9pZCkKK3sKKwlpbm9kZV9tYXAgPSB4emFsbG9jKElNQVBTICogQkxPQ0tfU0laRSk7CisJem9uZV9tYXAgPSB4emFsbG9jKFpNQVBTICogQkxPQ0tfU0laRSk7CisJaW5vZGVfYnVmZmVyID0geG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7CisJaW5vZGVfY291bnQgPSB4bWFsbG9jKElOT0RFUyArIDEpOworCXpvbmVfY291bnQgPSB4bWFsbG9jKFpPTkVTKTsKKwlpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoZGV2X2ZkLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCisJCWRpZSgiY2FuJ3QgcmVhZCBpbm9kZSBtYXAiKTsKKwlpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoZGV2X2ZkLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKKwkJZGllKCJjYW4ndCByZWFkIHpvbmUgbWFwIik7CisJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHJlYWQoZGV2X2ZkLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKKwkJZGllKCJjYW4ndCByZWFkIGlub2RlcyIpOworCWlmIChOT1JNX0ZJUlNUWk9ORSAhPSBGSVJTVFpPTkUpIHsKKwkJcHJpbnRmKCJ3YXJuaW5nOiBmaXJzdHpvbmUhPW5vcm1fZmlyc3R6b25lXG4iKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9CisJZ2V0X2RpcnNpemUoKTsKKwlpZiAoT1BUX3Nob3cpIHsKKwkJcHJpbnRmKCIldSBpbm9kZXNcbiIKKwkJCSIldSBibG9ja3NcbiIKKwkJCSJGaXJzdGRhdGF6b25lPSV1ICgldSlcbiIKKwkJCSJab25lc2l6ZT0ldVxuIgorCQkJIk1heHNpemU9JXVcbiIKKwkJCSJGaWxlc3lzdGVtIHN0YXRlPSV1XG4iCisJCQkibmFtZWxlbj0ldVxuXG4iLAorCQkJSU5PREVTLAorCQkJWk9ORVMsCisJCQlGSVJTVFpPTkUsIE5PUk1fRklSU1RaT05FLAorCQkJQkxPQ0tfU0laRSA8PCBaT05FU0laRSwKKwkJCU1BWFNJWkUsCisJCQlTdXBlci5zX3N0YXRlLAorCQkJbmFtZWxlbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfaW5vZGVfY29tbW9uKHVuc2lnbmVkIG5yLCB1aW50MTZfdCBpX21vZGUpCit7CisJdG90YWwrKzsKKwlpZiAoIWlub2RlX2NvdW50W25yXSkgeworCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKKwkJCXByaW50ZigiSW5vZGUgJWQgaXMgbWFya2VkIGFzICd1bnVzZWQnLCBidXQgaXQgaXMgdXNlZCAiCisJCQkJCSJmb3IgZmlsZSAnJXMnXG4iLCBuciwgY3VycmVudF9uYW1lKTsKKwkJCWlmIChPUFRfcmVwYWlyKSB7CisJCQkJaWYgKGFzaygiTWFyayBhcyAnaW4gdXNlJyIsIDEpKQorCQkJCQltYXJrX2lub2RlKG5yKTsKKwkJCQllbHNlCisJCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKFNfSVNESVIoaV9tb2RlKSkKKwkJCWRpcmVjdG9yeSsrOworCQllbHNlIGlmIChTX0lTUkVHKGlfbW9kZSkpCisJCQlyZWd1bGFyKys7CisJCWVsc2UgaWYgKFNfSVNDSFIoaV9tb2RlKSkKKwkJCWNoYXJkZXYrKzsKKwkJZWxzZSBpZiAoU19JU0JMSyhpX21vZGUpKQorCQkJYmxvY2tkZXYrKzsKKwkJZWxzZSBpZiAoU19JU0xOSyhpX21vZGUpKQorCQkJc3ltbGlua3MrKzsKKwkJZWxzZSBpZiAoU19JU1NPQ0soaV9tb2RlKSk7CisJCWVsc2UgaWYgKFNfSVNGSUZPKGlfbW9kZSkpOworCQllbHNlIHsKKwkJCXByaW50ZigiJXMgaGFzIG1vZGUgJTA1b1xuIiwgY3VycmVudF9uYW1lLCBpX21vZGUpOworCQl9CisJfSBlbHNlCisJCWxpbmtzKys7CisJaWYgKCErK2lub2RlX2NvdW50W25yXSkgeworCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWdcbiIpOworCQlpbm9kZV9jb3VudFtucl0tLTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWluaXgxX2lub2RlICpnZXRfaW5vZGUodW5zaWduZWQgbnIpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CisKKwlpZiAoIW5yIHx8IG5yID4gSU5PREVTKQorCQlyZXR1cm4gTlVMTDsKKwlpbm9kZSA9IElub2RlMSArIG5yOworCWdldF9pbm9kZV9jb21tb24obnIsIGlub2RlLT5pX21vZGUpOworCXJldHVybiBpbm9kZTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHN0cnVjdCBtaW5peDJfaW5vZGUgKmdldF9pbm9kZTIodW5zaWduZWQgbnIpCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CisKKwlpZiAoIW5yIHx8IG5yID4gSU5PREVTKQorCQlyZXR1cm4gTlVMTDsKKwlpbm9kZSA9IElub2RlMiArIG5yOworCWdldF9pbm9kZV9jb21tb24obnIsIGlub2RlLT5pX21vZGUpOworCXJldHVybiBpbm9kZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjaGVja19yb290KHZvaWQpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUgPSBJbm9kZTEgKyBNSU5JWF9ST09UX0lOTzsKKworCWlmICghaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCBjaGVja19yb290Mih2b2lkKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgTUlOSVhfUk9PVF9JTk87CisKKwlpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKK30KKyNlbHNlCit2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRkX3pvbmVfY29tbW9uKGludCBibG9jaywgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm4gMDsKKwlpZiAoem9uZV9jb3VudFtibG9ja10pIHsKKwkJcHJpbnRmKCJBbHJlYWR5IHVzZWQgYmxvY2sgaXMgcmV1c2VkIGluIGZpbGUgJyVzJy4gIiwKKwkJCQljdXJyZW50X25hbWUpOworCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CisJCQlibG9jayA9IDA7CisJCQkqY29ycmVjdGVkID0gMTsKKwkJCXJldHVybiAtMTsgLyogInBsZWFzZSB6ZXJvIG91dCAqem5yIiAqLworCQl9CisJfQorCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CisJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSAnJXMnIGlzIG1hcmtlZCBhcyAndW51c2VkJy4gIiwKKwkJCQlibG9jaywgY3VycmVudF9uYW1lKTsKKwkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQorCQkJbWFya196b25lKGJsb2NrKTsKKwl9CisJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQorCQl6b25lX2NvdW50W2Jsb2NrXS0tOworCXJldHVybiBibG9jazsKK30KKworc3RhdGljIGludCBhZGRfem9uZSh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBibG9jazsKKworCWJsb2NrID0gY2hlY2tfem9uZV9ucih6bnIsIGNvcnJlY3RlZCk7CisJYmxvY2sgPSBhZGRfem9uZV9jb21tb24oYmxvY2ssIGNvcnJlY3RlZCk7CisJaWYgKGJsb2NrID09IC0xKSB7CisJCSp6bnIgPSAwOworCQlibG9jayA9IDA7CisJfQorCXJldHVybiBibG9jazsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIGludCBhZGRfem9uZTIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgYmxvY2s7CisKKwlibG9jayA9IGNoZWNrX3pvbmVfbnIyKHpuciwgY29ycmVjdGVkKTsKKwlibG9jayA9IGFkZF96b25lX2NvbW1vbihibG9jaywgY29ycmVjdGVkKTsKKwlpZiAoYmxvY2sgPT0gLTEpIHsKKwkJKnpuciA9IDA7CisJCWJsb2NrID0gMDsKKwl9CisJcmV0dXJuIGJsb2NrOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOworCWlmICghYmxvY2spCisJCXJldHVybjsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKKwkJYWRkX3pvbmUoaSArICh1aW50MTZfdCAqKSBhZGRfem9uZV9pbmRfYmxrLCAmY2hnX2Jsayk7CisJaWYgKGNoZ19ibGspCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisJcmVhZF9ibG9jayhibG9jaywgYWRkX3pvbmVfaW5kX2Jsayk7CisJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQorCQlhZGRfem9uZTIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV9pbmRfYmxrLCAmY2hnX2Jsayk7CisJaWYgKGNoZ19ibGspCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kKHVpbnQxNl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJaW50IGk7CisJaW50IGJsb2NrOworCXNtYWxsaW50IGNoZ19ibGsgPSAwOworCisJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKKwkJYWRkX3pvbmVfaW5kKGkgKyAodWludDE2X3QgKikgYWRkX3pvbmVfZGluZF9ibGssICZjaGdfYmxrKTsKKwlpZiAoY2hnX2JsaykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgaTsKKwlpbnQgYmxvY2s7CisJc21hbGxpbnQgY2hnX2JsayA9IDA7CisKKwlibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCisJCWFkZF96b25lX2luZDIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV9kaW5kX2JsaywgJmNoZ19ibGspOworCWlmIChjaGdfYmxrKQorCQl3cml0ZV9ibG9jayhibG9jaywgYWRkX3pvbmVfZGluZF9ibGspOworfQorCitzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisJcmVhZF9ibG9jayhibG9jaywgYWRkX3pvbmVfdGluZF9ibGspOworCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKKwkJYWRkX3pvbmVfZGluZDIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV90aW5kX2JsaywgJmNoZ19ibGspOworCWlmIChjaGdfYmxrKQorCQl3cml0ZV9ibG9jayhibG9jaywgYWRkX3pvbmVfdGluZF9ibGspOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGkpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CisKKwlpZiAoIWkgfHwgaSA+IElOT0RFUykKKwkJcmV0dXJuOworCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCisJCXJldHVybjsKKwlpbm9kZSA9IElub2RlMSArIGk7CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpCisJICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpCisJICYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpCisJKSB7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9pbmQoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9kaW5kKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGNoZWNrX3pvbmVzMih1bnNpZ25lZCBpKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOworCisJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCisJCXJldHVybjsKKwlpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLworCQlyZXR1cm47CisJaW5vZGUgPSBJbm9kZTIgKyBpOworCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQorCQkmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCWFkZF96b25lMihpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOworCWFkZF96b25lX2luZDIoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOworCWFkZF96b25lX3RpbmQyKDkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY2hlY2tfZmlsZShzdHJ1Y3QgbWluaXgxX2lub2RlICpkaXIsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZTsKKwlpbnQgaW5vOworCWNoYXIgKm5hbWU7CisJaW50IGJsb2NrOworCisJYmxvY2sgPSBtYXBfYmxvY2soZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBjaGVja19maWxlX2Jsayk7CisJbmFtZSA9IGNoZWNrX2ZpbGVfYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKKwlpbm8gPSAqKHVpbnQxNl90ICopIChuYW1lIC0gMik7CisJaWYgKGlubyA+IElOT0RFUykgeworCQlwcmludGYoIiVzIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnJS4qcycuICIsCisJCQkJY3VycmVudF9uYW1lLCBuYW1lbGVuLCBuYW1lKTsKKwkJaWYgKGFzaygiUmVtb3ZlIiwgMSkpIHsKKwkJCSoodWludDE2X3QgKikgKG5hbWUgLSAyKSA9IDA7CisJCQl3cml0ZV9ibG9jayhibG9jaywgY2hlY2tfZmlsZV9ibGspOworCQl9CisJCWlubyA9IDA7CisJfQorCXB1c2hfZmlsZW5hbWUobmFtZSk7CisJaW5vZGUgPSBnZXRfaW5vZGUoaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKKwlpZiAoIW9mZnNldCkgeworCQlpZiAoaW5vZGUgJiYgTE9ORV9DSEFSKG5hbWUsICcuJykpCisJCQlyZXR1cm47CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9CisJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CisJCWlmIChpbm9kZSAmJiBzdHJjbXAoIi4uIiwgbmFtZSkgPT0gMCkKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWlmICghaW5vZGUpCisJCXJldHVybjsKKwlwdXNoX2ZpbGVuYW1lKG5hbWUpOworCWlmIChPUFRfbGlzdCkgeworCQlpZiAoT1BUX3ZlcmJvc2UpCisJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CisJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOworCX0KKwljaGVja196b25lcyhpbm8pOworCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZWN1cnNpdmVfY2hlY2soaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgY2hlY2tfZmlsZTIoc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CisJaW50IGlubzsKKwljaGFyICpuYW1lOworCWludCBibG9jazsKKworCWJsb2NrID0gbWFwX2Jsb2NrMihkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOworCXJlYWRfYmxvY2soYmxvY2ssIGNoZWNrX2ZpbGVfYmxrKTsKKwluYW1lID0gY2hlY2tfZmlsZV9ibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOworCWlubyA9ICoodWludDE2X3QgKikgKG5hbWUgLSAyKTsKKwlpZiAoaW5vID4gSU5PREVTKSB7CisJCXByaW50ZigiJXMgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICclLipzJy4gIiwKKwkJCQljdXJyZW50X25hbWUsIG5hbWVsZW4sIG5hbWUpOworCQlpZiAoYXNrKCJSZW1vdmUiLCAxKSkgeworCQkJKih1aW50MTZfdCAqKSAobmFtZSAtIDIpID0gMDsKKwkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBjaGVja19maWxlX2Jsayk7CisJCX0KKwkJaW5vID0gMDsKKwl9CisJcHVzaF9maWxlbmFtZShuYW1lKTsKKwlpbm9kZSA9IGdldF9pbm9kZTIoaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKKwlpZiAoIW9mZnNldCkgeworCQlpZiAoaW5vZGUgJiYgTE9ORV9DSEFSKG5hbWUsICcuJykpCisJCQlyZXR1cm47CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9CisJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CisJCWlmIChpbm9kZSAmJiBzdHJjbXAoIi4uIiwgbmFtZSkgPT0gMCkKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWlmICghaW5vZGUpCisJCXJldHVybjsKKwlwdXNoX2ZpbGVuYW1lKG5hbWUpOworCWlmIChPUFRfbGlzdCkgeworCQlpZiAoT1BUX3ZlcmJvc2UpCisJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CisJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOworCX0KKwljaGVja196b25lczIoaW5vKTsKKwlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmVjdXJzaXZlX2NoZWNrMihpbm8pOworCXBvcF9maWxlbmFtZSgpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbm8pCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqZGlyOworCXVuc2lnbmVkIG9mZnNldDsKKworCWRpciA9IElub2RlMSArIGlubzsKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlkaWUoImludGVybmFsIGVycm9yIik7CisJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQorCQljaGVja19maWxlKGRpciwgb2Zmc2V0KTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbm8pCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyOworCXVuc2lnbmVkIG9mZnNldDsKKworCWRpciA9IElub2RlMiArIGlubzsKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlkaWUoImludGVybmFsIGVycm9yIik7CisJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQorCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBiYWRfem9uZShpbnQgaSkKK3sKKwljaGFyIGJ1ZmZlcltCTE9DS19TSVpFXTsKKworCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCk7CisJcmV0dXJuIChCTE9DS19TSVpFICE9IGZ1bGxfcmVhZChkZXZfZmQsIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKKwkJaWYgKE9QVF93YXJuX21vZGUgJiYgSW5vZGUxW2ldLmlfbW9kZSAmJiAhaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKKwkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKKwkJCQlJbm9kZTFbaV0uaV9tb2RlID0gMDsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CisJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQorCQkJCXVubWFya19pbm9kZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJTZXQiLCAxKSkKKwkJCQltYXJrX2lub2RlKGkpOworCQl9CisJCWlmIChJbm9kZTFbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKKwkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGU9JTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiAiLAorCQkJCWksIElub2RlMVtpXS5pX21vZGUsIElub2RlMVtpXS5pX25saW5rcywKKwkJCQlpbm9kZV9jb3VudFtpXSk7CisJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgeworCQkJCUlub2RlMVtpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKKwkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQorCQkJY29udGludWU7CisJCWlmICghem9uZV9jb3VudFtpXSkgeworCQkJaWYgKGJhZF96b25lKGkpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CisJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKKwkJCQl1bm1hcmtfem9uZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCisJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGNoZWNrX2NvdW50czIodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKKwkJaWYgKE9QVF93YXJuX21vZGUgJiYgSW5vZGUyW2ldLmlfbW9kZSAmJiAhaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKKwkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKKwkJCQlJbm9kZTJbaV0uaV9tb2RlID0gMDsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CisJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQorCQkJCXVubWFya19pbm9kZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJTZXQiLCAxKSkKKwkJCQltYXJrX2lub2RlKGkpOworCQl9CisJCWlmIChJbm9kZTJbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKKwkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGU9JTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiAiLAorCQkJCWksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKKwkJCQlpbm9kZV9jb3VudFtpXSk7CisJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgeworCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKKwkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQorCQkJY29udGludWU7CisJCWlmICghem9uZV9jb3VudFtpXSkgeworCQkJaWYgKGJhZF96b25lKGkpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CisJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKKwkJCQl1bm1hcmtfem9uZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCisJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKK3sKKwltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKKwltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKKwljaGVja196b25lcyhNSU5JWF9ST09UX0lOTyk7CisJcmVjdXJzaXZlX2NoZWNrKE1JTklYX1JPT1RfSU5PKTsKKwljaGVja19jb3VudHMoKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgY2hlY2syKHZvaWQpCit7CisJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CisJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CisJY2hlY2tfem9uZXMyKE1JTklYX1JPT1RfSU5PKTsKKwlyZWN1cnNpdmVfY2hlY2syKE1JTklYX1JPT1RfSU5PKTsKKwljaGVja19jb3VudHMyKCk7Cit9CisjZWxzZQordm9pZCBjaGVjazIodm9pZCk7CisjZW5kaWYKKworaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0ZXJtaW9zIHRtcDsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSA4OworCisJSU5JVF9HKCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTphciI7IC8qIG9uZSBhcmd1bWVudDsgLWEgYXNzdW1lcyAtciAqLworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIpOworCWFyZ3YgKz0gb3B0aW5kOworCWRldmljZV9uYW1lID0gYXJndlswXTsKKworCWNoZWNrX21vdW50KCk7ICAvKiB0cnlpbmcgdG8gY2hlY2sgYSBtb3VudGVkIGZpbGVzeXN0ZW0/ICovCisJaWYgKE9QVF9tYW51YWwpIHsKKwkJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSkKKwkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOworCX0KKwl4bW92ZV9mZCh4b3BlbihkZXZpY2VfbmFtZSwgT1BUX3JlcGFpciA/IE9fUkRXUiA6IE9fUkRPTkxZKSwgZGV2X2ZkKTsKKworCS8qc3luYygpOyBwYXJhbm9pYT8gKi8KKwlyZWFkX3N1cGVyYmxvY2soKTsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjb250aW51ZSB3aXRoIHRoZSBjaGVja2luZy4KKwkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCisJICogZmxhZ3MgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSAtZiBzd2l0Y2ggd2FzIHNwZWNpZmllZCBvbiB0aGUKKwkgKiBjb21tYW5kIGxpbmUuCisJICovCisJcHJpbnRmKCIlczogJXNcbiIsIGFwcGxldF9uYW1lLCBiYl9iYW5uZXIpOworCisJaWYgKCEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKQorCSAmJiAoU3VwZXIuc19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSAmJiAhT1BUX2ZvcmNlCisJKSB7CisJCWlmIChPUFRfcmVwYWlyKQorCQkJcHJpbnRmKCIlcyBpcyBjbGVhbiwgY2hlY2sgaXMgc2tpcHBlZFxuIiwgZGV2aWNlX25hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKE9QVF9mb3JjZSkKKwkJcHJpbnRmKCJGb3JjaW5nIGZpbGVzeXN0ZW0gY2hlY2sgb24gJXNcbiIsIGRldmljZV9uYW1lKTsKKwllbHNlIGlmIChPUFRfcmVwYWlyKQorCQlwcmludGYoIkZpbGVzeXN0ZW0gb24gJXMgaXMgZGlydHksIG5lZWRzIGNoZWNraW5nXG4iLAorCQkJICAgZGV2aWNlX25hbWUpOworCisJcmVhZF90YWJsZXMoKTsKKworCWlmIChPUFRfbWFudWFsKSB7CisJCXRjZ2V0YXR0cigwLCAmc3ZfdGVybWlvcyk7CisJCXRtcCA9IHN2X3Rlcm1pb3M7CisJCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0bXApOworCQl0ZXJtaW9zX3NldCA9IDE7CisJfQorCisJaWYgKHZlcnNpb24yKSB7CisJCWNoZWNrX3Jvb3QyKCk7CisJCWNoZWNrMigpOworCX0gZWxzZSB7CisJCWNoZWNrX3Jvb3QoKTsKKwkJY2hlY2soKTsKKwl9CisKKwlpZiAoT1BUX3ZlcmJvc2UpIHsKKwkJaW50IGksIGZyZWVfY250OworCisJCWZvciAoaSA9IDEsIGZyZWVfY250ID0gMDsgaSA8PSBJTk9ERVM7IGkrKykKKwkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQorCQkJCWZyZWVfY250Kys7CisJCXByaW50ZigiXG4lNnUgaW5vZGVzIHVzZWQgKCV1JSUpXG4iLCAoSU5PREVTIC0gZnJlZV9jbnQpLAorCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWVfY250KSAvIElOT0RFUyk7CisJCWZvciAoaSA9IEZJUlNUWk9ORSwgZnJlZV9jbnQgPSAwOyBpIDwgWk9ORVM7IGkrKykKKwkJCWlmICghem9uZV9pbl91c2UoaSkpCisJCQkJZnJlZV9jbnQrKzsKKwkJcHJpbnRmKCIlNnUgem9uZXMgdXNlZCAoJXUlJSlcblxuIgorCQkJICAgIiU2dSByZWd1bGFyIGZpbGVzXG4iCisJCQkgICAiJTZ1IGRpcmVjdG9yaWVzXG4iCisJCQkgICAiJTZ1IGNoYXJhY3RlciBkZXZpY2UgZmlsZXNcbiIKKwkJCSAgICIlNnUgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCisJCQkgICAiJTZ1IGxpbmtzXG4iCisJCQkgICAiJTZ1IHN5bWJvbGljIGxpbmtzXG4iCisJCQkgICAiLS0tLS0tXG4iCisJCQkgICAiJTZ1IGZpbGVzXG4iLAorCQkJICAgKFpPTkVTIC0gZnJlZV9jbnQpLCAxMDAgKiAoWk9ORVMgLSBmcmVlX2NudCkgLyBaT05FUywKKwkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCisJCQkgICBsaW5rcyAtIDIgKiBkaXJlY3RvcnkgKyAxLCBzeW1saW5rcywKKwkJCSAgIHRvdGFsIC0gMiAqIGRpcmVjdG9yeSArIDEpOworCX0KKwlpZiAoY2hhbmdlZCkgeworCQl3cml0ZV90YWJsZXMoKTsKKwkJcHJpbnRmKCJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iKTsKKwkJc3luYygpOworCX0gZWxzZSBpZiAoT1BUX3JlcGFpcikKKwkJd3JpdGVfc3VwZXJibG9jaygpOworCisJaWYgKE9QVF9tYW51YWwpCisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZzdl90ZXJtaW9zKTsKKworCWlmIChjaGFuZ2VkKQorCQlyZXRjb2RlICs9IDM7CisJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKKwkJcmV0Y29kZSArPSA0OworCXJldHVybiByZXRjb2RlOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9nZXRvcHQuYyBiL3V0aWwtbGludXgvZ2V0b3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZWRmOAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZ2V0b3B0LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGdldG9wdC5jIC0gRW5oYW5jZWQgaW1wbGVtZW50YXRpb24gb2YgQlNEIGdldG9wdCgxKQorICogICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBWZXJzaW9uIDEuMC1iNDogVHVlIFNlcCAyMyAxOTk3LiBGaXJzdCBwdWJsaWMgcmVsZWFzZS4KKyAqIFZlcnNpb24gMS4wOiBXZWQgTm92IDE5IDE5OTcuCisgKiAgIEJ1bXBlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gMS4wCisgKiAgIEZpeGVkIG1pbm9yIHR5cG8gKENTSCBpbnN0ZWFkIG9mIFRDU0gpCisgKiBWZXJzaW9uIDEuMC4xOiBUdWUgSnVuIDMgMTk5OAorICogICBGaXhlZCBzaXplb2YgaW5zdGVhZCBvZiBzdHJsZW4gYnVnCisgKiAgIEJ1bXBlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gMS4wLjEKKyAqIFZlcnNpb24gMS4wLjI6IFRodSBKdW4gMTEgMTk5OCAobm90IHByZXNlbnQpCisgKiAgIEZpeGVkIGdjYy0yLjguMSB3YXJuaW5ncworICogICBGaXhlZCAtLXZlcnNpb24vLVYgb3B0aW9uIChub3QgcHJlc2VudCkKKyAqIFZlcnNpb24gMS4wLjU6IFR1ZSBKdW4gMjIgMTk5OQorICogICBNYWtlIC11IG9wdGlvbiB3b3JrIChub3QgcHJlc2VudCkKKyAqIFZlcnNpb24gMS4wLjY6IFR1ZSBKdW4gMjcgMjAwMAorICogICBObyBpbXBvcnRhbnQgY2hhbmdlcworICogVmVyc2lvbiAxLjEuMDogVHVlIEp1biAzMCAyMDAwCisgKiAgIEFkZGVkIE5MUyBzdXBwb3J0IChwYXJ0bHkgd3JpdHRlbiBieSBBcmthZGl1c3ogTWlja2lld2ljegorICogICAgIDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4pCisgKiBQb3J0ZWQgdG8gQnVzeWJveCAtIEFsZnJlZCBNLiBTem1pZHQgPGFtc0B0cmlsbGlhbi5pdHNsaW51eC5vcmc+CisgKiAgUmVtb3ZlZCAtLXZlcnNpb24vLVYgYW5kIC0taGVscC8taAorICogIFJlbW92ZWQgcGFyc2VfZXJyb3IoKSwgdXNpbmcgYmJfZXJyb3JfbXNnKCkgZnJvbSBCdXN5Ym94IGluc3RlYWQKKyAqICBSZXBsYWNlZCBvdXJfbWFsbG9jIHdpdGggeG1hbGxvYyBhbmQgb3VyX3JlYWxsb2Mgd2l0aCB4cmVhbGxvYworICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0b3B0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgZ2V0b3B0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgICAiCS1hLC0tYWx0ZXJuYXRpdmUJCUFsbG93IGxvbmcgb3B0aW9ucyBzdGFydGluZyB3aXRoIHNpbmdsZSAtIgorLy91c2FnZTogICAgICJcbgktbCwtLWxvbmdvcHRpb25zPWxvbmdvcHRzCUxvbmcgb3B0aW9ucyB0byBiZSByZWNvZ25pemVkIgorLy91c2FnZTogICAgICJcbgktbiwtLW5hbWU9cHJvZ25hbWUJCVRoZSBuYW1lIHVuZGVyIHdoaWNoIGVycm9ycyBhcmUgcmVwb3J0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1vLC0tb3B0aW9ucz1vcHRzdHJpbmcJCVNob3J0IG9wdGlvbnMgdG8gYmUgcmVjb2duaXplZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEsLS1xdWlldAkJCURpc2FibGUgZXJyb3IgcmVwb3J0aW5nIGJ5IGdldG9wdCgzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVEsLS1xdWlldC1vdXRwdXQJCU5vIG5vcm1hbCBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1zLC0tc2hlbGw9c2hlbGwJCVNldCBzaGVsbCBxdW90aW5nIGNvbnZlbnRpb25zIgorLy91c2FnZTogICAgICJcbgktVCwtLXRlc3QJCQlUZXN0IGZvciBnZXRvcHQoMSkgdmVyc2lvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11bnF1b3RlZAkJCURvbid0IHF1b3RlIHRoZSBvdXRwdXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICAgIgktYQkJQWxsb3cgbG9uZyBvcHRpb25zIHN0YXJ0aW5nIHdpdGggc2luZ2xlIC0iCisvL3VzYWdlOiAgICAgIlxuCS1sIGxvbmdvcHRzCUxvbmcgb3B0aW9ucyB0byBiZSByZWNvZ25pemVkIgorLy91c2FnZTogICAgICJcbgktbiBwcm9nbmFtZQlUaGUgbmFtZSB1bmRlciB3aGljaCBlcnJvcnMgYXJlIHJlcG9ydGVkIgorLy91c2FnZTogICAgICJcbgktbyBvcHRzdHJpbmcJU2hvcnQgb3B0aW9ucyB0byBiZSByZWNvZ25pemVkIgorLy91c2FnZTogICAgICJcbgktcQkJRGlzYWJsZSBlcnJvciByZXBvcnRpbmcgYnkgZ2V0b3B0KDMpIgorLy91c2FnZTogICAgICJcbgktUQkJTm8gbm9ybWFsIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgc2hlbGwJU2V0IHNoZWxsIHF1b3RpbmcgY29udmVudGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1UCQlUZXN0IGZvciBnZXRvcHQoMSkgdmVyc2lvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJCURvbid0IHF1b3RlIHRoZSBvdXRwdXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGdldG9wdF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBjYXQgZ2V0b3B0LnRlc3RcbiIKKy8vdXNhZ2U6ICAgICAgICIjIS9iaW4vc2hcbiIKKy8vdXNhZ2U6ICAgICAgICJHRVRPUFQ9YGdldG9wdCAtbyBhYjpjOjogLS1sb25nIGEtbG9uZyxiLWxvbmc6LGMtbG9uZzo6IFxcXG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgIC1uICdleGFtcGxlLmJ1c3lib3gnIC0tIFwiJEBcImBcbiIKKy8vdXNhZ2U6ICAgICAgICJpZiBbICQ/ICE9IDAgXTsgdGhlbiBleGl0IDE7IGZpXG4iCisvL3VzYWdlOiAgICAgICAiZXZhbCBzZXQgLS0gXCIkR0VUT1BUXCJcbiIKKy8vdXNhZ2U6ICAgICAgICJ3aGlsZSB0cnVlOyBkb1xuIgorLy91c2FnZTogICAgICAgIiBjYXNlICQxIGluXG4iCisvL3VzYWdlOiAgICAgICAiICAgLWF8LS1hLWxvbmcpIGVjaG8gXCJPcHRpb24gYVwiOyBzaGlmdDs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgLWJ8LS1iLWxvbmcpIGVjaG8gXCJPcHRpb24gYiwgYXJndW1lbnQgJyQyJ1wiOyBzaGlmdCAyOztcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAtY3wtLWMtbG9uZylcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgIGNhc2UgXCIkMlwiIGluXG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgIFwiXCIpIGVjaG8gXCJPcHRpb24gYywgbm8gYXJndW1lbnRcIjsgc2hpZnQgMjs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgICopICBlY2hvIFwiT3B0aW9uIGMsIGFyZ3VtZW50ICckMidcIjsgc2hpZnQgMjs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgICBlc2FjOztcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAtLSkgc2hpZnQ7IGJyZWFrOztcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAqKSBlY2hvIFwiSW50ZXJuYWwgZXJyb3IhXCI7IGV4aXQgMTs7XG4iCisvL3VzYWdlOiAgICAgICAiIGVzYWNcbiIKKy8vdXNhZ2U6ICAgICAgICJkb25lXG4iCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworIyBpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5PTl9PUFQgaXMgdGhlIGNvZGUgdGhhdCBpcyByZXR1cm5lZCB3aGVuIGEgbm9uLW9wdGlvbiBpcyBmb3VuZCBpbiAnKycKKyAgIG1vZGUgKi8KK2VudW0geworCU5PTl9PUFQgPSAxLAorI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisvKiBMT05HX09QVCBpcyB0aGUgY29kZSB0aGF0IGlzIHJldHVybmVkIHdoZW4gYSBsb25nIG9wdGlvbiBpcyBmb3VuZC4gKi8KKwlMT05HX09QVCA9IDIKKyNlbmRpZgorfTsKKworLyogRm9yIGZpbmRpbmcgYWN0aXZhdGVkIG9wdGlvbiBmbGFncy4gTXVzdCBtYXRjaCBnZXRvcHQzMiBjYWxsISAqLworZW51bSB7CisJT1BUX28JPSAweDEsCS8vIC1vCisJT1BUX24JPSAweDIsCS8vIC1uCisJT1BUX3EJPSAweDQsCS8vIC1xCisJT1BUX1EJPSAweDgsCS8vIC1RCisJT1BUX3MJPSAweDEwLAkvLyAtcworCU9QVF9UCT0gMHgyMCwJLy8gLVQKKwlPUFRfdQk9IDB4NDAsCS8vIC11CisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlPUFRfYQk9IDB4ODAsCS8vIC1hCisJT1BUX2wJPSAweDEwMCwgLy8gLWwKKyNlbmRpZgorCVNIRUxMX0lTX1RDU0ggPSAweDgwMDAsIC8qIGhpamFjayB0aGlzIGJpdCBmb3Igb3RoZXIgcHVycG9zZXMgKi8KK307CisKKy8qIDAgaXMgZ2V0b3B0X2xvbmcsIDEgaXMgZ2V0b3B0X2xvbmdfb25seSAqLworI2RlZmluZSBhbHRlcm5hdGl2ZSAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYSkKKworI2RlZmluZSBxdWlldF9lcnJvcnMgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkKKyNkZWZpbmUgcXVpZXRfb3V0cHV0IChvcHRpb25fbWFzazMyICYgT1BUX1EpCisjZGVmaW5lIHF1b3RlICAgICAgICAoIShvcHRpb25fbWFzazMyICYgT1BUX3UpKQorI2RlZmluZSBzaGVsbF9UQ1NIICAgKG9wdGlvbl9tYXNrMzIgJiBTSEVMTF9JU19UQ1NIKQorCisvKgorICogVGhpcyBmdW5jdGlvbiAnbm9ybWFsaXplcycgYSBzaW5nbGUgYXJndW1lbnQ6IGl0IHB1dHMgc2luZ2xlIHF1b3RlcyBhcm91bmQKKyAqIGl0IGFuZCBlc2NhcGVzIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycy4gSWYgcXVvdGUgaXMgZmFsc2UsIGl0IGp1c3QKKyAqIHJldHVybnMgaXRzIGFyZ3VtZW50LgorICogQmFzaCBvbmx5IG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50IGZvciBzaW5nbGUgcXVvdGVzOyB0Y3NoIGFsc28gcmVjb2duaXplcworICogZXhjbGFtYXRpb24gbWFya3Mgd2l0aGluIHNpbmdsZSBxdW90ZXMsIGFuZCBudWtlcyB3aGl0ZXNwYWNlLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IGlzIG92ZXJ3cml0dGVuIGJ5CisgKiBlYWNoIGNhbGwuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemUoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKmJ1ZnB0cjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCXN0YXRpYyBjaGFyICpCVUZGRVIgPSBOVUxMOworCWZyZWUoQlVGRkVSKTsKKyNlbHNlCisJY2hhciAqQlVGRkVSOworI2VuZGlmCisKKwlpZiAoIXF1b3RlKSB7IC8qIEp1c3QgY29weSBhcmcgKi8KKwkJQlVGRkVSID0geHN0cmR1cChhcmcpOworCQlyZXR1cm4gQlVGRkVSOworCX0KKworCS8qIEVhY2ggY2hhcmFjdGVyIGluIGFyZyBtYXkgdGFrZSB1cCB0byBmb3VyIGNoYXJhY3RlcnMgaW4gdGhlIHJlc3VsdDoKKwkgICBGb3IgYSBxdW90ZSB3ZSBuZWVkIGEgY2xvc2luZyBxdW90ZSwgYSBiYWNrc2xhc2gsIGEgcXVvdGUgYW5kIGFuCisJICAgb3BlbmluZyBxdW90ZSEgV2UgbmVlZCBhbHNvIHRoZSBnbG9iYWwgb3BlbmluZyBhbmQgY2xvc2luZyBxdW90ZSwKKwkgICBhbmQgb25lIGV4dHJhIGNoYXJhY3RlciBmb3IgJ1wwJy4gKi8KKwlCVUZGRVIgPSB4bWFsbG9jKHN0cmxlbihhcmcpKjQgKyAzKTsKKworCWJ1ZnB0ciA9IEJVRkZFUjsKKwkqYnVmcHRyICsrPSAnXCcnOworCisJd2hpbGUgKCphcmcpIHsKKwkJaWYgKCphcmcgPT0gJ1wnJykgeworCQkJLyogUXVvdGU6IHJlcGxhY2UgaXQgd2l0aDogJ1wnJyAqLworCQkJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkJCSpidWZwdHIgKys9ICdcXCc7CisJCQkqYnVmcHRyICsrPSAnXCcnOworCQkJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkJfSBlbHNlIGlmIChzaGVsbF9UQ1NIICYmICphcmcgPT0gJyEnKSB7CisJCQkvKiBFeGNsYW1hdGlvbiBtYXJrOiByZXBsYWNlIGl0IHdpdGg6IFwhICovCisJCQkqYnVmcHRyICsrPSAnXCcnOworCQkJKmJ1ZnB0ciArKz0gJ1xcJzsKKwkJCSpidWZwdHIgKys9ICchJzsKKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCX0gZWxzZSBpZiAoc2hlbGxfVENTSCAmJiAqYXJnID09ICdcbicpIHsKKwkJCS8qIE5ld2xpbmU6IHJlcGxhY2UgaXQgd2l0aDogXG4gKi8KKwkJCSpidWZwdHIgKys9ICdcXCc7CisJCQkqYnVmcHRyICsrPSAnbic7CisJCX0gZWxzZSBpZiAoc2hlbGxfVENTSCAmJiBpc3NwYWNlKCphcmcpKSB7CisJCQkvKiBOb24tbmV3bGluZSB3aGl0ZXNwYWNlOiByZXBsYWNlIGl0IHdpdGggXDx3cz4gKi8KKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCQkqYnVmcHRyICsrPSAnXFwnOworCQkJKmJ1ZnB0ciArKz0gKmFyZzsKKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCX0gZWxzZQorCQkJLyogSnVzdCBjb3B5ICovCisJCQkqYnVmcHRyICsrPSAqYXJnOworCQlhcmcrKzsKKwl9CisJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkqYnVmcHRyICsrPSAnXDAnOworCXJldHVybiBCVUZGRVI7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSB0aGUgb3V0cHV0LiBhcmd2WzBdIGlzIHRoZSBwcm9ncmFtIG5hbWUgKHVzZWQgZm9yIHJlcG9ydGluZyBlcnJvcnMpLgorICogYXJndlsxLi5dIGNvbnRhaW5zIHRoZSBvcHRpb25zIHRvIGJlIHBhcnNlZC4gYXJnYyBtdXN0IGJlIHRoZSBudW1iZXIgb2YKKyAqIGVsZW1lbnRzIGluIGFyZ3YgKGllLiAxIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLCBvbmx5IHRoZSBwcm9ncmFtIG5hbWUpLAorICogb3B0c3RyIG11c3QgY29udGFpbiB0aGUgc2hvcnQgb3B0aW9ucywgYW5kIGxvbmdvcHRzIHRoZSBsb25nIG9wdGlvbnMuCisgKiBPdGhlciBzZXR0aW5ncyBhcmUgZm91bmQgaW4gZ2xvYmFsIHZhcmlhYmxlcy4KKyAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworI2RlZmluZSBnZW5lcmF0ZV9vdXRwdXQoYXJndixhcmdjLG9wdHN0cixsb25nb3B0cykgXAorCWdlbmVyYXRlX291dHB1dChhcmd2LGFyZ2Msb3B0c3RyKQorI2VuZGlmCitzdGF0aWMgaW50IGdlbmVyYXRlX291dHB1dChjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKm9wdHN0ciwgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMpCit7CisJaW50IGV4aXRfY29kZSA9IDA7IC8qIFdlIGFzc3VtZSBldmVyeXRoaW5nIHdpbGwgYmUgT0sgKi8KKwlpbnQgb3B0OworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJaW50IGxvbmdpbmRleDsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKmNoYXJwdHI7CisKKwlpZiAocXVpZXRfZXJyb3JzKSAvKiBObyBlcnJvciByZXBvcnRpbmcgZnJvbSBnZXRvcHQoMykgKi8KKwkJb3B0ZXJyID0gMDsKKworCS8qIFdlIHVzZWQgaXQgYWxyZWFkeSBpbiBtYWluKCkgaW4gZ2V0b3B0MzIoKSwKKwkgKiB3ZSAqbXVzdCogcmVzZXQgZ2V0b3B0KDMpOiAqLworI2lmZGVmIF9fR0xJQkNfXworCW9wdGluZCA9IDA7CisjZWxzZSAvKiBCU0Qgc3R5bGUgKi8KKwlvcHRpbmQgPSAxOworCS8qIG9wdHJlc2V0ID0gMTsgKi8KKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJb3B0ID0KKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCQkJYWx0ZXJuYXRpdmUgPworCQkJZ2V0b3B0X2xvbmdfb25seShhcmdjLCBhcmd2LCBvcHRzdHIsIGxvbmdvcHRzLCAmbG9uZ2luZGV4KSA6CisJCQlnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBvcHRzdHIsIGxvbmdvcHRzLCAmbG9uZ2luZGV4KTsKKyNlbHNlCisJCQlnZXRvcHQoYXJnYywgYXJndiwgb3B0c3RyKTsKKyNlbmRpZgorCQlpZiAob3B0ID09IC0xKQorCQkJYnJlYWs7CisJCWlmIChvcHQgPT0gJz8nIHx8IG9wdCA9PSAnOicgKQorCQkJZXhpdF9jb2RlID0gMTsKKwkJZWxzZSBpZiAoIXF1aWV0X291dHB1dCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJCQlpZiAob3B0ID09IExPTkdfT1BUKSB7CisJCQkJcHJpbnRmKCIgLS0lcyIsIGxvbmdvcHRzW2xvbmdpbmRleF0ubmFtZSk7CisJCQkJaWYgKGxvbmdvcHRzW2xvbmdpbmRleF0uaGFzX2FyZykKKwkJCQkJcHJpbnRmKCIgJXMiLAorCQkJCQkJbm9ybWFsaXplKG9wdGFyZyA/IG9wdGFyZyA6ICIiKSk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJaWYgKG9wdCA9PSBOT05fT1BUKQorCQkJCXByaW50ZigiICVzIiwgbm9ybWFsaXplKG9wdGFyZykpOworCQkJZWxzZSB7CisJCQkJcHJpbnRmKCIgLSVjIiwgb3B0KTsKKwkJCQljaGFycHRyID0gc3RyY2hyKG9wdHN0ciwgb3B0KTsKKwkJCQlpZiAoY2hhcnB0ciAhPSBOVUxMICYmICorK2NoYXJwdHIgPT0gJzonKQorCQkJCQlwcmludGYoIiAlcyIsCisJCQkJCQlub3JtYWxpemUob3B0YXJnID8gb3B0YXJnIDogIiIpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghcXVpZXRfb3V0cHV0KSB7CisJCXByaW50ZigiIC0tIik7CisJCXdoaWxlIChvcHRpbmQgPCBhcmdjKQorCQkJcHJpbnRmKCIgJXMiLCBub3JtYWxpemUoYXJndltvcHRpbmQrK10pKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJcmV0dXJuIGV4aXRfY29kZTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisvKgorICogUmVnaXN0ZXIgc2V2ZXJhbCBsb25nIG9wdGlvbnMuIG9wdGlvbnMgaXMgYSBzdHJpbmcgb2YgbG9uZyBvcHRpb25zLAorICogc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciB3aGl0ZXNwYWNlLgorICogVGhpcyBudWtlcyBvcHRpb25zIQorICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiAqYWRkX2xvbmdfb3B0aW9ucyhzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnMsIGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGxvbmdfbnIgPSAwOworCWludCBhcmdfb3B0LCB0bGVuOworCWNoYXIgKnRva3B0ciA9IHN0cnRvayhvcHRpb25zLCAiLCBcdFxuIik7CisKKwlpZiAobG9uZ19vcHRpb25zKQorCQl3aGlsZSAobG9uZ19vcHRpb25zW2xvbmdfbnJdLm5hbWUpCisJCQlsb25nX25yKys7CisKKwl3aGlsZSAodG9rcHRyKSB7CisJCWFyZ19vcHQgPSBub19hcmd1bWVudDsKKwkJdGxlbiA9IHN0cmxlbih0b2twdHIpOworCQlpZiAodGxlbikgeworCQkJdGxlbi0tOworCQkJaWYgKHRva3B0clt0bGVuXSA9PSAnOicpIHsKKwkJCQlhcmdfb3B0ID0gcmVxdWlyZWRfYXJndW1lbnQ7CisJCQkJaWYgKHRsZW4gJiYgdG9rcHRyW3RsZW4tMV0gPT0gJzonKSB7CisJCQkJCXRsZW4tLTsKKwkJCQkJYXJnX29wdCA9IG9wdGlvbmFsX2FyZ3VtZW50OworCQkJCX0KKwkJCQl0b2twdHJbdGxlbl0gPSAnXDAnOworCQkJCWlmICh0bGVuID09IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlbXB0eSBsb25nIG9wdGlvbiBzcGVjaWZpZWQiKTsKKwkJCX0KKwkJCWxvbmdfb3B0aW9ucyA9IHhyZWFsbG9jX3ZlY3Rvcihsb25nX29wdGlvbnMsIDQsIGxvbmdfbnIpOworCQkJbG9uZ19vcHRpb25zW2xvbmdfbnJdLmhhc19hcmcgPSBhcmdfb3B0OworCQkJLypsb25nX29wdGlvbnNbbG9uZ19ucl0uZmxhZyA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCQkJbG9uZ19vcHRpb25zW2xvbmdfbnJdLnZhbCA9IExPTkdfT1BUOworCQkJbG9uZ19vcHRpb25zW2xvbmdfbnJdLm5hbWUgPSB4c3RyZHVwKHRva3B0cik7CisJCQlsb25nX25yKys7CisJCQkvKm1lbXNldCgmbG9uZ19vcHRpb25zW2xvbmdfbnJdLCAwLCBzaXplb2YobG9uZ19vcHRpb25zWzBdKSk7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCQl9CisJCXRva3B0ciA9IHN0cnRvayhOVUxMLCAiLCBcdFxuIik7CisJfQorCXJldHVybiBsb25nX29wdGlvbnM7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0X3NoZWxsKGNvbnN0IGNoYXIgKm5ld19zaGVsbCkKK3sKKwlpZiAoIXN0cmNtcChuZXdfc2hlbGwsICJiYXNoIikgfHwgIXN0cmNtcChuZXdfc2hlbGwsICJzaCIpKQorCQlyZXR1cm47CisJaWYgKCFzdHJjbXAobmV3X3NoZWxsLCAidGNzaCIpIHx8ICFzdHJjbXAobmV3X3NoZWxsLCAiY3NoIikpCisJCW9wdGlvbl9tYXNrMzIgfD0gU0hFTExfSVNfVENTSDsKKwllbHNlCisJCWJiX2Vycm9yX21zZygidW5rbm93biBzaGVsbCAnJXMnLCBhc3N1bWluZyBiYXNoIiwgbmV3X3NoZWxsKTsKK30KKworCisvKiBFeGl0IGNvZGVzOgorICogICAwKSBObyBlcnJvcnMsIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICogICAxKSBnZXRvcHQoMykgcmV0dXJuZWQgYW4gZXJyb3IuCisgKiAgIDIpIEEgcHJvYmxlbSB3aXRoIHBhcmFtZXRlciBwYXJzaW5nIGZvciBnZXRvcHQoMSkuCisgKiAgIDMpIEludGVybmFsIGVycm9yLCBvdXQgb2YgbWVtb3J5CisgKiAgIDQpIFJldHVybmVkIGZvciAtVAorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworc3RhdGljIGNvbnN0IGNoYXIgZ2V0b3B0X2xvbmdvcHRzW10gQUxJR04xID0KKwkib3B0aW9uc1wwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJvIgorCSJsb25nb3B0aW9uc1wwIiAgUmVxdWlyZWRfYXJndW1lbnQgImwiCisJInF1aWV0XDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkicXVpZXQtb3V0cHV0XDAiIE5vX2FyZ3VtZW50ICAgICAgICJRIgorCSJzaGVsbFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJInRlc3RcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiVCIKKwkidW5xdW90ZWRcMCIgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ1IgorCSJhbHRlcm5hdGl2ZVwwIiAgTm9fYXJndW1lbnQgICAgICAgImEiCisJIm5hbWVcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAibiIKKwk7CisjZW5kaWYKKworaW50IGdldG9wdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ2V0b3B0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm9wdHN0ciA9IE5VTEw7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWNvbnN0IGNoYXIgKmNvbXBhdGlibGU7CisJY2hhciAqc19hcmc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnMgPSBOVUxMOworCWxsaXN0X3QgKmxfYXJnID0gTlVMTDsKKyNlbmRpZgorCisJY29tcGF0aWJsZSA9IGdldGVudigiR0VUT1BUX0NPTVBBVElCTEUiKTsgLyogdXNlZCBhcyB5ZXMvbm8gZmxhZyAqLworCisJaWYgKGFyZ2MgPT0gMSkgeworCQlpZiAoY29tcGF0aWJsZSkgeworCQkJLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgb3JpZ2luYWwgZ2V0b3B0IGdhdmUgbm8gZXJyb3IKKwkJCSAgIHdoZW4gdGhlcmUgd2VyZSBubyBhcmd1bWVudHMuICovCisJCQlwcmludGYoIiAtLVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBvcHRzdHJpbmcgYXJndW1lbnQiKTsKKwl9CisKKwlpZiAoYXJndlsxXVswXSAhPSAnLScgfHwgY29tcGF0aWJsZSkgeworCQljaGFyICpzOworCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX3U7IC8qIHF1b3Rpbmcgb2ZmICovCisJCXMgPSB4c3RyZHVwKGFyZ3ZbMV0gKyBzdHJzcG4oYXJndlsxXSwgIi0rIikpOworCQlhcmd2WzFdID0gYXJndlswXTsKKwkJcmV0dXJuIGdlbmVyYXRlX291dHB1dChhcmd2KzEsIGFyZ2MtMSwgcywgbG9uZ19vcHRpb25zKTsKKwl9CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK286bjpxUXM6VHUiLCAmb3B0c3RyLCAmbmFtZSwgJnNfYXJnKTsKKyNlbHNlCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGdldG9wdF9sb25nb3B0czsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJsOjoiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrbzpuOnFRczpUdWFsOiIsCisJCQkJCSZvcHRzdHIsICZuYW1lLCAmc19hcmcsICZsX2FyZyk7CisJLyogRWZmZWN0dWF0ZSB0aGUgcmVhZCBvcHRpb25zIGZvciB0aGUgYXBwbGV0IGl0c2VsZiAqLworCXdoaWxlIChsX2FyZykgeworCQlsb25nX29wdGlvbnMgPSBhZGRfbG9uZ19vcHRpb25zKGxvbmdfb3B0aW9ucywgbGxpc3RfcG9wKCZsX2FyZykpOworCX0KKyNlbmRpZgorCisJaWYgKG9wdCAmIE9QVF9zKSB7CisJCXNldF9zaGVsbChzX2FyZyk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9UKSB7CisJCXJldHVybiA0OworCX0KKworCS8qIEFsbCBvcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBhcHBsZXQgaGF2ZSBub3cgYmVlbiBwYXJzZWQgKi8KKwlpZiAoIW9wdHN0cikgeworCQlpZiAob3B0aW5kID49IGFyZ2MpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBvcHRzdHJpbmcgYXJndW1lbnQiKTsKKwkJb3B0c3RyID0gYXJndltvcHRpbmQrK107CisJfQorCisJYXJndltvcHRpbmQtMV0gPSBuYW1lID8gbmFtZSA6IGFyZ3ZbMF07CisJcmV0dXJuIGdlbmVyYXRlX291dHB1dChhcmd2K29wdGluZC0xLCBhcmdjLW9wdGluZCsxLCBvcHRzdHIsIGxvbmdfb3B0aW9ucyk7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2hleGR1bXAuYyBiL3V0aWwtbGludXgvaGV4ZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzEyZjkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2hleGR1bXAuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGV4ZHVtcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICogQmFzZWQgb24gY29kZSBmcm9tIHV0aWwtbGludXggdiAyLjExbAorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OQorICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaGV4ZHVtcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1iY0NkZWZub3N2eCIgSUZfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UoIlIiKSAiXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaGV4ZHVtcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgRklMRXMgKG9yIHN0ZGluKSBpbiBhIHVzZXIgc3BlY2lmaWVkIGZvcm1hdFxuIgorLy91c2FnZTogICAgICJcbgktYgkJT25lLWJ5dGUgb2N0YWwgZGlzcGxheSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJCU9uZS1ieXRlIGNoYXJhY3RlciBkaXNwbGF5IgorLy91c2FnZTogICAgICJcbgktQwkJQ2Fub25pY2FsIGhleCtBU0NJSSwgMTYgYnl0ZXMgcGVyIGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1kCQlUd28tYnl0ZSBkZWNpbWFsIGRpc3BsYXkiCisvL3VzYWdlOiAgICAgIlxuCS1lIEZPUk1BVF9TVFJJTkciCisvL3VzYWdlOiAgICAgIlxuCS1mIEZPUk1BVF9GSUxFIgorLy91c2FnZTogICAgICJcbgktbiBMRU5HVEgJSW50ZXJwcmV0IG9ubHkgTEVOR1RIIGJ5dGVzIG9mIGlucHV0IgorLy91c2FnZTogICAgICJcbgktbwkJVHdvLWJ5dGUgb2N0YWwgZGlzcGxheSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgT0ZGU0VUCVNraXAgT0ZGU0VUIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktdgkJRGlzcGxheSBhbGwgaW5wdXQgZGF0YSIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJCVR3by1ieXRlIGhleGFkZWNpbWFsIGRpc3BsYXkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hFWERVTVBfUkVWRVJTRSgKKy8vdXNhZ2U6ICAgICAiXG4JLVIJCVJldmVyc2Ugb2YgJ2hleGR1bXAgLUN2JyIpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGhkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIGhkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiaGQgaXMgYW4gYWxpYXMgZm9yIGhleGR1bXAgLUMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImR1bXAuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworc3RhdGljIHZvaWQgYmJfZHVtcF9hZGRmaWxlKGR1bXBlcl90ICpkdW1wZXIsIGNoYXIgKm5hbWUpCit7CisJY2hhciAqcDsKKwlGSUxFICpmcDsKKwljaGFyICpidWY7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZChuYW1lKTsKKwl3aGlsZSAoKGJ1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCXAgPSBza2lwX3doaXRlc3BhY2UoYnVmKTsKKwkJaWYgKCpwICYmICgqcCAhPSAnIycpKSB7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsIHApOworCQl9CisJCWZyZWUoYnVmKTsKKwl9CisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkZF9zdHJpbmdzW10gPSB7CisJIlwiJTA3LjdfYXggXCIgMTYvMSBcIiUwM28gXCIgXCJcXG5cIiIsICAgLyogYiAqLworCSJcIiUwNy43X2F4IFwiIDE2LzEgXCIlM19jIFwiIFwiXFxuXCIiLCAgIC8qIGMgKi8KKwkiXCIlMDcuN19heCBcIiA4LzIgXCIgICUwNXUgXCIgXCJcXG5cIiIsICAvKiBkICovCisJIlwiJTA3LjdfYXggXCIgOC8yIFwiICUwNm8gXCIgXCJcXG5cIiIsICAgLyogbyAqLworCSJcIiUwNy43X2F4IFwiIDgvMiBcIiAgICUwNHggXCIgXCJcXG5cIiIsIC8qIHggKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGFkZF9maXJzdFtdIEFMSUdOMSA9ICJcIiUwNy43X0F4XG5cIiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGhleGR1bXBfb3B0c1tdIEFMSUdOMSA9ICJiY2RveENlOmY6bjpzOnYiIElGX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFKCJSIik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgc3VmZml4ZXNbXSA9IHsKKwl7ICJiIiwgNTEyIH0sCisJeyAiayIsIDEwMjQgfSwKKwl7ICJtIiwgMTAyNCoxMDI0IH0sCisJeyAiIiwgMCB9Cit9OworCitpbnQgaGV4ZHVtcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaGV4ZHVtcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlkdW1wZXJfdCAqZHVtcGVyID0gYWxsb2NfZHVtcGVyKCk7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgY2g7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFCisJRklMRSAqZnA7CisJc21hbGxpbnQgcmR1bXAgPSAwOworI2VuZGlmCisKKwlpZiAoRU5BQkxFX0hEICYmICFhcHBsZXRfbmFtZVsyXSkgeyAvKiB3ZSBhcmUgImhkIiAqLworCQljaCA9ICdDJzsKKwkJZ290byBoZF9hcHBsZXQ7CisJfQorCisJLyogV2UgY2Fubm90IHVzZSBnZXRvcHQzMjogaW4gaGV4ZHVtcCBvcHRpb25zIGFyZSBjdW11bGF0aXZlLgorCSAqIEUuZy4gImhleGR1bXAgLUMgLUMgZmlsZSIgc2hvdWxkIGR1bXAgZWFjaCBsaW5lIHR3aWNlICovCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCBoZXhkdW1wX29wdHMpKSA+IDApIHsKKwkJcCA9IHN0cmNocihoZXhkdW1wX29wdHMsIGNoKTsKKwkJaWYgKCFwKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoKHAgLSBoZXhkdW1wX29wdHMpIDwgNSkgeworCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCBhZGRfZmlyc3QpOworCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCBhZGRfc3RyaW5nc1soaW50KShwIC0gaGV4ZHVtcF9vcHRzKV0pOworCQl9CisJCS8qIFNhdmUgYSBsaXR0bGUgYml0IG9mIHNwYWNlIGJlbG93IGJ5IG9taXR0aW5nIHRoZSAnZWxzZSdzLiAqLworCQlpZiAoY2ggPT0gJ0MnKSB7CisgaGRfYXBwbGV0OgorCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDguOF9BeFxuXCIiKTsKKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA4LjhfYXggIFwiIDgvMSBcIiUwMnggXCIgXCIgIFwiIDgvMSBcIiUwMnggXCIgIik7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsICJcIiAgfFwiIDE2LzEgXCIlX3BcIiBcInxcXG5cIiIpOworCQl9CisJCWlmIChjaCA9PSAnZScpIHsKKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgb3B0YXJnKTsKKwkJfSAvKiBlbHNlICovCisJCWlmIChjaCA9PSAnZicpIHsKKwkJCWJiX2R1bXBfYWRkZmlsZShkdW1wZXIsIG9wdGFyZyk7CisJCX0gLyogZWxzZSAqLworCQlpZiAoY2ggPT0gJ24nKSB7CisJCQlkdW1wZXItPmR1bXBfbGVuZ3RoID0geGF0b2lfcG9zaXRpdmUob3B0YXJnKTsKKwkJfSAvKiBlbHNlICovCisJCWlmIChjaCA9PSAncycpIHsgLyogY29tcGF0OiAtcyBhY2NlcHRzIGhleCBudW1iZXJzIHRvbyAqLworCQkJZHVtcGVyLT5kdW1wX3NraXAgPSB4c3RydG91bF9yYW5nZV9zZngob3B0YXJnLCAvKmJhc2U6Ki8gMCwgLypsbzoqLyAwLCAvKmhpOiovIExPTkdfTUFYLCBzdWZmaXhlcyk7CisJCX0gLyogZWxzZSAqLworCQlpZiAoY2ggPT0gJ3YnKSB7CisJCQlkdW1wZXItPmR1bXBfdmZsYWcgPSBBTEw7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UKKwkJaWYgKGNoID09ICdSJykgeworCQkJcmR1bXAgPSAxOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoIWR1bXBlci0+ZnNoZWFkKSB7CisJCWJiX2R1bXBfYWRkKGR1bXBlciwgYWRkX2ZpcnN0KTsKKwkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19heCBcIiA4LzIgXCIlMDR4IFwiIFwiXFxuXCIiKTsKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UKKwlyZXR1cm4gYmJfZHVtcF9kdW1wKGR1bXBlciwgYXJndik7CisjZWxzZQorCWlmICghcmR1bXApIHsKKwkJcmV0dXJuIGJiX2R1bXBfZHVtcChkdW1wZXIsIGFyZ3YpOworCX0KKworCS8qIC1SOiByZXZlcnNlIG9mICdoZXhkdW1wIC1DdicgKi8KKwlmcCA9IHN0ZGluOworCWlmICghKmFyZ3YpIHsKKwkJYXJndi0tOworCQlnb3RvIGp1bXBfaW47CisJfQorCisJZG8geworCQljaGFyICpidWY7CisJCWZwID0geGZvcGVuX2Zvcl9yZWFkKCphcmd2KTsKKyBqdW1wX2luOgorCQl3aGlsZSAoKGJ1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCQlwID0gYnVmOworCQkJd2hpbGUgKDEpIHsKKwkJCQkvKiBza2lwIGFkZHJlc3Mgb3IgcHJldmlvdXMgYnl0ZSAqLworCQkJCXdoaWxlIChpc3hkaWdpdCgqcCkpIHArKzsKKwkJCQl3aGlsZSAoKnAgPT0gJyAnKSBwKys7CisJCQkJLyogJ3wnIGNoYXIgd2lsbCBicmVhayB0aGUgbGluZSAqLworCQkJCWlmICghaXN4ZGlnaXQoKnApIHx8IHNzY2FuZihwLCAiJXggIiwgJmNoKSAhPSAxKQorCQkJCQlicmVhazsKKwkJCQlwdXRjaGFyKGNoKTsKKwkJCX0KKwkJCWZyZWUoYnVmKTsKKwkJfQorCQlmY2xvc2UoZnApOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2h3Y2xvY2suYyBiL3V0aWwtbGludXgvaHdjbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGUyOWIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2h3Y2xvY2suYwpAQCAtMCwwICsxLDMyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBod2Nsb2NrIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvYmVydCBHcmllYmwgPGdyaWVibEBnbXguZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlICJydGNfLmgiCisKKy8qIGRpZmYgY29kZSBpcyBkaXNhYmxlZDogaXQncyBub3Qgc3lzL2h3IGNsb2NrIGRpZmYsIGl0J3Mgc29tZSB1c2VsZXNzCisgKiAidGltZSBiZXR3ZWVuIGh3Y2xvY2sgd2FzIHN0YXJ0ZWQgYW5kIHdlIHNhdyBDTU9TIHRpY2siIHF1YW50aXR5LgorICogSXQncyB1c2VsZXNzIHNpbmNlIGh3Y2xvY2sgaXMgc3RhcnRlZCBhdCBhIHJhbmRvbSBtb21lbnQsCisgKiB0aHVzIHRoZSBxdWFudGl0eSBpcyBhbHNvIHJhbmRvbSwgdXNlbGVzcy4gU2hvd2luZyAwLjAwMDAwMCBkb2VzIG5vdAorICogZGVwcml2ZSB1cyBmcm9tIGFueSB1c2VmdWwgaW5mby4KKyAqCisgKiBTSE9XX0hXQ0xPQ0tfRElGRiBjb2RlIGluIHRoaXMgZmlsZSBzaG93cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN5c3RlbQorICogYW5kIGh3IGNsb2NrLiBJdCBpcyB1c2VmdWwsIGJ1dCBub3QgY29tcGF0aWJsZSB3aXRoIHN0YW5kYXJkIGh3Y2xvY2suCisgKiBUaHVzIGRpc2FibGVkLgorICovCisjZGVmaW5lIFNIT1dfSFdDTE9DS19ESUZGIDAKKworCisjaWYgIVNIT1dfSFdDTE9DS19ESUZGCisjIGRlZmluZSByZWFkX3J0YyhwcF9ydGNuYW1lLCBzeXNfdHYsIHV0YykgcmVhZF9ydGMocHBfcnRjbmFtZSwgdXRjKQorI2VuZGlmCitzdGF0aWMgdGltZV90IHJlYWRfcnRjKGNvbnN0IGNoYXIgKipwcF9ydGNuYW1lLCBzdHJ1Y3QgdGltZXZhbCAqc3lzX3R2LCBpbnQgdXRjKQoreworCXN0cnVjdCB0bSB0bV90aW1lOworCWludCBmZDsKKworCWZkID0gcnRjX3hvcGVuKHBwX3J0Y25hbWUsIE9fUkRPTkxZKTsKKworCXJ0Y19yZWFkX3RtKCZ0bV90aW1lLCBmZCk7CisKKyNpZiBTSE9XX0hXQ0xPQ0tfRElGRgorCXsKKwkJaW50IGJlZm9yZSA9IHRtX3RpbWUudG1fc2VjOworCQl3aGlsZSAoMSkgeworCQkJcnRjX3JlYWRfdG0oJnRtX3RpbWUsIGZkKTsKKwkJCWdldHRpbWVvZmRheShzeXNfdHYsIE5VTEwpOworCQkJaWYgKGJlZm9yZSAhPSB0bV90aW1lLnRtX3NlYykKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gcnRjX3RtMnRpbWUoJnRtX3RpbWUsIHV0Yyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfY2xvY2soY29uc3QgY2hhciAqKnBwX3J0Y25hbWUsIGludCB1dGMpCit7CisjaWYgU0hPV19IV0NMT0NLX0RJRkYKKwlzdHJ1Y3QgdGltZXZhbCBzeXNfdHY7CisjZW5kaWYKKwl0aW1lX3QgdCA9IHJlYWRfcnRjKHBwX3J0Y25hbWUsICZzeXNfdHYsIHV0Yyk7CisKKyNpZiBFTkFCTEVfTE9DQUxFX1NVUFBPUlQKKwkvKiBTdGFuZGFyZCBod2Nsb2NrIHVzZXMgbG9jYWxlLXNwZWNpZmljIG91dHB1dCBmb3JtYXQgKi8KKwljaGFyIGNwWzY0XTsKKwlzdHJ1Y3QgdG0gKnB0bSA9IGxvY2FsdGltZSgmdCk7CisJc3RyZnRpbWUoY3AsIHNpemVvZihjcCksICIlYyIsIHB0bSk7CisjZWxzZQorCWNoYXIgKmNwID0gY3RpbWUoJnQpOworCXN0cmNocm51bChjcCwgJ1xuJylbMF0gPSAnXDAnOworI2VuZGlmCisKKyNpZiAhU0hPV19IV0NMT0NLX0RJRkYKKwlwcmludGYoIiVzICAwLjAwMDAwMCBzZWNvbmRzXG4iLCBjcCk7CisjZWxzZQorCXsKKwkJbG9uZyBkaWZmID0gc3lzX3R2LnR2X3NlYyAtIHQ7CisJCWlmIChkaWZmIDwgMCAvKiYmIHR2LnR2X3VzZWMgIT0gMCovKSB7CisJCQkvKiBXaHkgd2UgbmVlZCBkaWZmKys/ICovCisJCQkvKiBkaWZmID49IDAgaXMgb2s6IHwgZGlmZiA8IDAsIGNhbid0IGp1c3QgdXNlIHR2LnR2X3VzZWM6ICovCisJCQkvKiAgIDQ1LjUyMDgyMCAgICAgIHwgICA0My41MjA4MjAgKi8KKwkJCS8qIC0gNDQuMDAwMDAwICAgICAgfCAtIDQ1LjAwMDAwMCAqLworCQkJLyogPSAgMS41MjA4MjAgICAgICB8ID0gLTEuNDc5MTgwLCBub3QgLTIuNTIwODIwISAqLworCQkJZGlmZisrOworCQkJLyogU2hvdWxkIGJlIDEwMDAwMDAgLSB0di50dl91c2VjLCBidXQgdGhlbiB3ZSBtdXN0IGNoZWNrIHR2LnR2X3VzZWMgIT0gMCAqLworCQkJc3lzX3R2LnR2X3VzZWMgPSA5OTk5OTkgLSBzeXNfdHYudHZfdXNlYzsKKwkJfQorCQlwcmludGYoIiVzICAlbGQuJTA2bHUgc2Vjb25kc1xuIiwgY3AsIGRpZmYsICh1bnNpZ25lZCBsb25nKXN5c190di50dl91c2VjKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdG9fc3lzX2Nsb2NrKGNvbnN0IGNoYXIgKipwcF9ydGNuYW1lLCBpbnQgdXRjKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCB0aW1lem9uZSB0ejsKKworCXR6LnR6X21pbnV0ZXN3ZXN0ID0gdGltZXpvbmUvNjAgLSA2MCpkYXlsaWdodDsKKwl0ei50el9kc3R0aW1lID0gMDsKKworCXR2LnR2X3NlYyA9IHJlYWRfcnRjKHBwX3J0Y25hbWUsIE5VTEwsIHV0Yyk7CisJdHYudHZfdXNlYyA9IDA7CisJaWYgKHNldHRpbWVvZmRheSgmdHYsICZ0eikpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0dGltZW9mZGF5Iik7Cit9CisKK3N0YXRpYyB2b2lkIGZyb21fc3lzX2Nsb2NrKGNvbnN0IGNoYXIgKipwcF9ydGNuYW1lLCBpbnQgdXRjKQoreworI2lmIDEKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgdG0gdG1fdGltZTsKKwlpbnQgcnRjOworCisJcnRjID0gcnRjX3hvcGVuKHBwX3J0Y25hbWUsIE9fV1JPTkxZKTsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkvKiBQcmVwYXJlIHRtX3RpbWUgKi8KKwlpZiAoc2l6ZW9mKHRpbWVfdCkgPT0gc2l6ZW9mKHR2LnR2X3NlYykpIHsKKwkJaWYgKHV0YykKKwkJCWdtdGltZV9yKCh0aW1lX3QqKSZ0di50dl9zZWMsICZ0bV90aW1lKTsKKwkJZWxzZQorCQkJbG9jYWx0aW1lX3IoKHRpbWVfdCopJnR2LnR2X3NlYywgJnRtX3RpbWUpOworCX0gZWxzZSB7CisJCXRpbWVfdCB0ID0gdHYudHZfc2VjOworCQlpZiAodXRjKQorCQkJZ210aW1lX3IoJnQsICZ0bV90aW1lKTsKKwkJZWxzZQorCQkJbG9jYWx0aW1lX3IoJnQsICZ0bV90aW1lKTsKKwl9CisjZWxzZQorLyogQmxvYXRlZCBjb2RlIHdoaWNoIHRyaWVzIHRvIHNldCBodyBjbG9jayB3aXRoIGJldHRlciBwcmVjaXNpb24uCisgKiBPbiB4ODYsIGV2ZW4gdGhvdWdoIGNvZGUgZG9lcyBzZXQgaHcgY2xvY2sgd2l0aGluIDwxbXMgb2YgZXhhY3QKKyAqIHdob2xlIHNlY29uZHMsIGFwcGFyZW50bHkgaHcgY2xvY2sgKGF0IGxlYXN0IG9uIHNvbWUgbWFjaGluZXMpCisgKiBkb2Vzbid0IHJlc2V0IGludGVybmFsIGZyYWN0aW9uYWwgc2Vjb25kcyB0byAwLAorICogbWFraW5nIGFsbCB0aGlzIGEgcG9pbnRsZXNzIGV4Y2VyY2lzZS4KKyAqLworCS8qIElmIHdlIHNlZSB0aGF0IHdlIGFyZSBOIHVzZWMgYXdheSBmcm9tIHdob2xlIHNlY29uZCwKKwkgKiB3ZSdsbCBzbGVlcCBmb3IgTi1BREogdXNlY3MuIEFESiBjb3JyZWN0cyBmb3IgdGhlIGZhY3QKKwkgKiB0aGF0IENQVSBpcyBub3QgaW5maW5pdGVseSBmYXN0LgorCSAqIE9uIGluZmluaXRlbHkgZmFzdCBDUFUsIG5leHQgd2FrZXVwIHdvdWxkIGJlCisJICogb24gKGV4YWN0bHlfbmV4dF93aG9sZV9zZWNvbmQgLSBBREopLiBPbiByZWFsIENQVXMsCisJICogdGhpcyBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCB0aW1lIGFuZCB3aG9sZSBzZWNvbmQKKwkgKiBpcyBsZXNzIHRoYW4gQURKIChhc3N1bWluZyBzeXN0ZW0gaXNuJ3QgaGVhdmlseSBsb2FkZWQpLgorCSAqLworCS8qIFNtYWxsIHZhbHVlIG9mIDI1NnVzIGdpdmVzIHZlcnkgcHJlY2lzZSBzeW5jIGZvciAyKyBHSHogQ1BVcy4KKwkgKiBTbG93ZXIgQ1BVcyB3aWxsIGZhaWwgdG8gc3luYyBhbmQgd2lsbCBnbyB0byBiaWdnZXIKKwkgKiBBREogdmFsdWVzLiBxZW11LWVtdWxhdGVkIGFybXY0dGwgd2l0aCB+MTAwIE1IegorCSAqIHBlcmZvcm1hbmNlIGVuZHMgdXAgdXNpbmcgQURKIH49IDQqMTAyNCBhbmQgaXQgdGFrZXMKKwkgKiAyKyBzZWNzICgyIHRyaWVzIHdpdGggc3VjY2Vzc2l2ZWx5IGxhcmdlciBBREopCisJICogdG8gc3luYy4gRXZlbiBzdHJhY2VkIG9uZSBvbiB0aGUgc2FtZSBxZW11ICh2ZXJ5IHNsb3cpCisJICogdGFrZXMgb25seSA0IHRyaWVzLgorCSAqLworI2RlZmluZSBUV0VBS19VU0VDIDI1NgorCXVuc2lnbmVkIGFkaiA9IFRXRUFLX1VTRUM7CisJc3RydWN0IHRtIHRtX3RpbWU7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJaW50IHJ0YyA9IHJ0Y194b3BlbihwcF9ydGNuYW1lLCBPX1dST05MWSk7CisKKwkvKiBUcnkgdG8gY2F0Y2ggdGhlIG1vbWVudCB3aGVuIHdob2xlIHNlY29uZCBpcyBjbG9zZSAqLworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHJlbV91c2VjOworCQl0aW1lX3QgdDsKKworCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworCQl0ID0gdHYudHZfc2VjOworCQlyZW1fdXNlYyA9IDEwMDAwMDAgLSB0di50dl91c2VjOworCQlpZiAocmVtX3VzZWMgPCBhZGopIHsKKwkJCS8qIENsb3NlIGVub3VnaCAqLworIHNtYWxsX3JlbToKKwkJCXQrKzsKKwkJfQorCisJCS8qIFByZXBhcmUgdG1fdGltZSBmcm9tIHQgKi8KKwkJaWYgKHV0YykKKwkJCWdtdGltZV9yKCZ0LCAmdG1fdGltZSk7IC8qIG1heSByZWFkIC9ldGMveHh4IChpdCB0YWtlcyB0aW1lKSAqLworCQllbHNlCisJCQlsb2NhbHRpbWVfcigmdCwgJnRtX3RpbWUpOyAvKiBzYW1lICovCisKKwkJaWYgKGFkaiA+PSAzMioxMDI0KSB7CisJCQlicmVhazsgLyogMzIgbXMgZGlmZiBhbmQgc3RpbGwgbm8gbHVjaz8/IGdpdmUgdXAgdHJ5aW5nIHRvIHN5bmMgKi8KKwkJfQorCisJCS8qIGdtdGltZS9sb2NhbHRpbWUgdG9vayBzb21lIHRpbWUsIHJlLWdldCBjdXIgdGltZSAqLworCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworCQlpZiAodHYudHZfc2VjIDwgdCAvKiB3ZSBhcmUgc3RpbGwgaW4gb2xkIHNlY29uZCAqLworCQkgfHwgKHR2LnR2X3NlYyA9PSB0ICYmIHR2LnR2X3VzZWMgPCBhZGopIC8qIG5vdCB0b28gZmFyIGludG8gbmV4dCBzZWNvbmQgKi8KKwkJKSB7CisJCQlicmVhazsgLyogZ29vZCwgd2UgYXJlIGluIHN5bmMhICovCisJCX0KKworCQlyZW1fdXNlYyA9IDEwMDAwMDAgLSB0di50dl91c2VjOworCQlpZiAocmVtX3VzZWMgPCBhZGopIHsKKwkJCXQgPSB0di50dl9zZWM7CisJCQlnb3RvIHNtYWxsX3JlbTsgLyogYWxyZWFkeSBjbG9zZSB0byBuZXh0IHNlYywgZG9uJ3Qgc2xlZXAgKi8KKwkJfQorCisJCS8qIFRyeSB0byBzeW5jIHVwIGJ5IHNsZWVwaW5nICovCisJCXVzbGVlcChyZW1fdXNlYyAtIGFkaik7CisKKwkJLyogSnVtcCB0byAxbXMgZGlmZiwgdGhlbiBpbmNyZWFzZSBmYXN0ICh4Mik6IEVWRVJZIGxvb3AKKwkJICogdGFrZXMgfjEgc2VjLCBwZW9wbGUgd29uJ3QgbGlrZSBzbG93bHkgY29udmVyZ2luZyBjb2RlIGhlcmUhCisJCSAqLworCS8vYmJfZXJyb3JfbXNnKCJhZGo6JWQgdHYudHZfdXNlYzolZCIsIGFkaiwgKGludCl0di50dl91c2VjKTsKKwkJaWYgKGFkaiA8IDUxMikKKwkJCWFkaiA9IDUxMjsKKwkJLyogLi4uIGFuZCBpZiBsYXN0ICJvdmVyc2hvb3QiIGRvZXMgbm90IGxvb2sgaW5zYW5lbHkgYmlnLAorCQkgKiBqdXN0IHVzZSBpdCBhcyBhZGogaW5jcmVtZW50LiBUaGlzIG1ha2VzIGNvbnZlcmdlbmNlIGZhc3Rlci4KKwkJICovCisJCWlmICh0di50dl91c2VjIDwgYWRqICogOCkgeworCQkJYWRqICs9IHR2LnR2X3VzZWM7CisJCQljb250aW51ZTsKKwkJfQorCQlhZGogKj0gMjsKKwl9CisJLyogRGVidWcgYWlkIHRvIGZpbmQgIm9wdGltYWwiIFRXRUFLX1VTRUMgd2l0aCBuZWFybHkgZXhhY3Qgc3luYy4KKwkgKiBMb29rIGZvciBhIHZhbHVlIHdoaWNoIG1ha2VzIHR2X3VzZWMgY2xvc2UgdG8gOTk5OTk5IG9yIDAuCisJICogRm9yIDIuMjBHSHogSW50ZWwgQ29yZSAyOiBvcHRpbWFsIFRXRUFLX1VTRUMgfj0gMjAwCisJICovCisJLy9iYl9lcnJvcl9tc2coInR2LnR2X3VzZWM6JWQiLCAoaW50KXR2LnR2X3VzZWMpOworI2VuZGlmCisKKwl0bV90aW1lLnRtX2lzZHN0ID0gMDsKKwl4aW9jdGwocnRjLCBSVENfU0VUX1RJTUUsICZ0bV90aW1lKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UocnRjKTsKK30KKworLyoKKyAqIEF0IHN5c3RlbSBib290LCBrZXJuZWwgbWF5IHNldCBzeXN0ZW0gdGltZSBmcm9tIFJUQywKKyAqIGJ1dCBpdCBrbm93cyBub3RoaW5nIGFib3V0IHRpbWV6b25lcy4gSWYgUlRDIGlzIGluIGxvY2FsIHRpbWUsCisgKiB0aGVuIHN5c3RlbSB0aW1lIGlzIHdyb25nIC0gaXQgaXMgb2Zmc2V0IGJ5IHRpbWV6b25lLgorICogVGhpcyBvcHRpb24gY29ycmVjdHMgc3lzdGVtIHRpbWUgaWYgUlRDIGlzIGluIGxvY2FsIHRpbWUsCisgKiBhbmQgKGFsd2F5cykgc2V0cyBpbi1rZXJuZWwgdGltZXpvbmUuCisgKgorICogVGhpcyBpcyBhbiBhbHRlcm5hdGUgb3B0aW9uIHRvIC0taGN0b3N5cyB0aGF0IGRvZXMgbm90IHJlYWQgdGhlCisgKiBoYXJkd2FyZSBjbG9jay4KKyAqLworc3RhdGljIHZvaWQgc2V0X3N5c3RlbV9jbG9ja190aW1lem9uZShpbnQgdXRjKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCB0bSAqYnJva2VuOworCXN0cnVjdCB0aW1lem9uZSB0ejsKKworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCWJyb2tlbiA9IGxvY2FsdGltZSgmdHYudHZfc2VjKTsKKwl0ei50el9taW51dGVzd2VzdCA9IHRpbWV6b25lIC8gNjA7CisJaWYgKGJyb2tlbi0+dG1faXNkc3QpCisJCXR6LnR6X21pbnV0ZXN3ZXN0IC09IDYwOworCXR6LnR6X2RzdHRpbWUgPSAwOworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCWlmICghdXRjKQorCQl0di50dl9zZWMgKz0gdHoudHpfbWludXRlc3dlc3QgKiA2MDsKKwlpZiAoc2V0dGltZW9mZGF5KCZ0diwgJnR6KSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXR0aW1lb2ZkYXkiKTsKK30KKworLy91c2FnZTojZGVmaW5lIGh3Y2xvY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJbLXJ8LS1zaG93XSBbLXN8LS1oY3Rvc3lzXSBbLXd8LS1zeXN0b2hjXSBbLXR8LS1zeXN0el0iCisvL3VzYWdlOiAgICAgICAiIFstbHwtLWxvY2FsdGltZV0gWy11fC0tdXRjXSIKKy8vdXNhZ2U6ICAgICAgICIgWy1mfC0tcnRjIEZJTEVdIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1yXSBbLXNdIFstd10gWy10XSBbLWxdIFstdV0gWy1mIEZJTEVdIgorLy91c2FnZToJKQorLy91c2FnZTojZGVmaW5lIGh3Y2xvY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJRdWVyeSBhbmQgc2V0IGhhcmR3YXJlIGNsb2NrIChSVEMpXG4iCisvL3VzYWdlOiAgICAgIlxuCS1yCVNob3cgaGFyZHdhcmUgY2xvY2sgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2V0IHN5c3RlbSB0aW1lIGZyb20gaGFyZHdhcmUgY2xvY2siCisvL3VzYWdlOiAgICAgIlxuCS13CVNldCBoYXJkd2FyZSBjbG9jayBmcm9tIHN5c3RlbSB0aW1lIgorLy91c2FnZTogICAgICJcbgktdAlTZXQgaW4ta2VybmVsIHRpbWV6b25lLCBjb3JyZWN0IHN5c3RlbSB0aW1lIgorLy91c2FnZTogICAgICJcbgkJaWYgaGFyZHdhcmUgY2xvY2sgaXMgaW4gbG9jYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJQXNzdW1lIGhhcmR3YXJlIGNsb2NrIGlzIGtlcHQgaW4gVVRDIgorLy91c2FnZTogICAgICJcbgktbAlBc3N1bWUgaGFyZHdhcmUgY2xvY2sgaXMga2VwdCBpbiBsb2NhbCB0aW1lIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCVVzZSBzcGVjaWZpZWQgZGV2aWNlIChlLmcuIC9kZXYvcnRjMikiCisKKyNkZWZpbmUgSFdDTE9DS19PUFRfTE9DQUxUSU1FICAgMHgwMQorI2RlZmluZSBIV0NMT0NLX09QVF9VVEMgICAgICAgICAweDAyCisjZGVmaW5lIEhXQ0xPQ0tfT1BUX1NIT1cgICAgICAgIDB4MDQKKyNkZWZpbmUgSFdDTE9DS19PUFRfSENUT1NZUyAgICAgMHgwOAorI2RlZmluZSBIV0NMT0NLX09QVF9TWVNUT0hDICAgICAweDEwCisjZGVmaW5lIEhXQ0xPQ0tfT1BUX1NZU1RaICAgICAgIDB4MjAKKyNkZWZpbmUgSFdDTE9DS19PUFRfUlRDRklMRSAgICAgMHg0MAorCitpbnQgaHdjbG9ja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaHdjbG9ja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcnRjbmFtZSA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWludCB1dGM7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIGh3Y2xvY2tfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkibG9jYWx0aW1lXDAiIE5vX2FyZ3VtZW50ICJsIiAvKiBzaG9ydCBvcHQgaXMgbm9uLXN0YW5kYXJkICovCisJCSJ1dGNcMCIgICAgICAgTm9fYXJndW1lbnQgInUiCisJCSJzaG93XDAiICAgICAgTm9fYXJndW1lbnQgInIiCisJCSJoY3Rvc3lzXDAiICAgTm9fYXJndW1lbnQgInMiCisJCSJzeXN0b2hjXDAiICAgTm9fYXJndW1lbnQgInciCisJCSJzeXN0elwwIiAgICAgTm9fYXJndW1lbnQgInQiIC8qIHNob3J0IG9wdCBpcyBub24tc3RhbmRhcmQgKi8KKwkJInJ0Y1wwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZiIKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBod2Nsb2NrX2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAici0td3N0OnctLXJzdDpzLS13cnQ6dC0tcnN3OmwtLXU6dS0tbCI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImx1cnN3dGY6IiwgJnJ0Y25hbWUpOworCisJLyogSWYgLXUgb3IgLWwgd2Fzbid0IGdpdmVuIGNoZWNrIGlmIHdlIGFyZSB1c2luZyB1dGMgKi8KKwlpZiAob3B0ICYgKEhXQ0xPQ0tfT1BUX1VUQyB8IEhXQ0xPQ0tfT1BUX0xPQ0FMVElNRSkpCisJCXV0YyA9IChvcHQgJiBIV0NMT0NLX09QVF9VVEMpOworCWVsc2UKKwkJdXRjID0gcnRjX2FkanRpbWVfaXNfdXRjKCk7CisKKwlpZiAob3B0ICYgSFdDTE9DS19PUFRfSENUT1NZUykKKwkJdG9fc3lzX2Nsb2NrKCZydGNuYW1lLCB1dGMpOworCWVsc2UgaWYgKG9wdCAmIEhXQ0xPQ0tfT1BUX1NZU1RPSEMpCisJCWZyb21fc3lzX2Nsb2NrKCZydGNuYW1lLCB1dGMpOworCWVsc2UgaWYgKG9wdCAmIEhXQ0xPQ0tfT1BUX1NZU1RaKQorCQlzZXRfc3lzdGVtX2Nsb2NrX3RpbWV6b25lKHV0Yyk7CisJZWxzZQorCQkvKiBkZWZhdWx0IEhXQ0xPQ0tfT1BUX1NIT1cgKi8KKwkJc2hvd19jbG9jaygmcnRjbmFtZSwgdXRjKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9pcGNybS5jIGIvdXRpbC1saW51eC9pcGNybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDA1MGMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2lwY3JtLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlwY3JtLmMgLSB1dGlsaXR5IHRvIGFsbG93IHJlbW92YWwgb2YgSVBDIG9iamVjdHMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiAwMSBTZXB0IDIwMDQgLSBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+CisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGZyb20gdXRpbC1saW51eC0yLjEyYS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpcGNybV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1NUVMga2V5XSBbLW1xcyBpZF0iCisvL3VzYWdlOiNkZWZpbmUgaXBjcm1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVcHBlci1jYXNlIG9wdGlvbnMgTVFTIHJlbW92ZSBhbiBvYmplY3QgYnkgc2hta2V5IHZhbHVlLlxuIgorLy91c2FnZTogICAgICAgIkxvd2VyLWNhc2Ugb3B0aW9ucyByZW1vdmUgYW4gb2JqZWN0IGJ5IHNobWlkIHZhbHVlLlxuIgorLy91c2FnZTogICAgICJcbgktbU0JUmVtb3ZlIG1lbW9yeSBzZWdtZW50IGFmdGVyIGxhc3QgZGV0YWNoIgorLy91c2FnZTogICAgICJcbgktcVEJUmVtb3ZlIG1lc3NhZ2UgcXVldWUiCisvL3VzYWdlOiAgICAgIlxuCS1zUwlSZW1vdmUgc2VtYXBob3JlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogWC9PUEVOIHRlbGxzIHVzIHRvIHVzZSA8c3lzL3t0eXBlcyxpcGMsc2VtfS5oPiBmb3Igc2VtY3RsKCkgKi8KKy8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLG1zZ30uaD4gZm9yIG1zZ2N0bCgpICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisjaW5jbHVkZSA8c3lzL3NlbS5oPgorCisjaWYgZGVmaW5lZChfX0dOVV9MSUJSQVJZX18pICYmICFkZWZpbmVkKF9TRU1fU0VNVU5fVU5ERUZJTkVEKQorLyogdW5pb24gc2VtdW4gaXMgZGVmaW5lZCBieSBpbmNsdWRpbmcgPHN5cy9zZW0uaD4gKi8KKyNlbHNlCisvKiBhY2NvcmRpbmcgdG8gWC9PUEVOIHdlIGhhdmUgdG8gZGVmaW5lIGl0IG91cnNlbHZlcyAqLwordW5pb24gc2VtdW4geworCWludCB2YWw7CisJc3RydWN0IHNlbWlkX2RzICpidWY7CisJdW5zaWduZWQgc2hvcnQgKmFycmF5OworCXN0cnVjdCBzZW1pbmZvICpfX2J1ZjsKK307CisjZW5kaWYKKworI2RlZmluZSBJUENSTV9MRUdBQ1kgMQorCisKKyNpZiBJUENSTV9MRUdBQ1kKKwordHlwZWRlZiBlbnVtIHR5cGVfaWQgeworCVNITSwKKwlTRU0sCisJTVNHCit9IHR5cGVfaWQ7CisKK3N0YXRpYyBpbnQgcmVtb3ZlX2lkcyh0eXBlX2lkIHR5cGUsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgaWQ7CisJaW50IG5iX2Vycm9ycyA9IDA7CisJdW5pb24gc2VtdW4gYXJnOworCisJYXJnLnZhbCA9IDA7CisKKwl3aGlsZSAoYXJndlswXSkgeworCQlpZCA9IGJiX3N0cnRvdWwoYXJndlswXSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgaWQgPiBJTlRfTUFYKSB7CisJCQliYl9lcnJvcl9tc2coImludmFsaWQgaWQ6ICVzIiwgYXJndlswXSk7CisJCQluYl9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCWludCByZXQgPSAwOworCQkJaWYgKHR5cGUgPT0gU0VNKQorCQkJCXJldCA9IHNlbWN0bChpZCwgMCwgSVBDX1JNSUQsIGFyZyk7CisJCQllbHNlIGlmICh0eXBlID09IE1TRykKKwkJCQlyZXQgPSBtc2djdGwoaWQsIElQQ19STUlELCBOVUxMKTsKKwkJCWVsc2UgaWYgKHR5cGUgPT0gIFNITSkKKwkJCQlyZXQgPSBzaG1jdGwoaWQsIElQQ19STUlELCBOVUxMKTsKKworCQkJaWYgKHJldCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlbW92ZSBpZCAlcyIsIGFyZ3ZbMF0pOworCQkJCW5iX2Vycm9ycysrOworCQkJfQorCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gbmJfZXJyb3JzOworfQorI2VuZGlmIC8qIElQQ1JNX0xFR0FDWSAqLworCisKK2ludCBpcGNybV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBjcm1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGM7CisJaW50IGVycm9yID0gMDsKKworCS8qIGlmIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHdpdGhvdXQgcGFyYW1ldGVycywgZG8gbm90aGluZyAqLworCWlmIChhcmdjID09IDEpCisJCXJldHVybiAwOworI2lmIElQQ1JNX0xFR0FDWQorCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29tbWFuZCBpcyBiZWluZyBpbnZva2VkIGluIHRoZSBvbGQgd2F5IGlmIHNvCisJICAgdGhlbiBydW4gdGhlIG9sZCBjb2RlLiBWYWxpZCBjb21tYW5kcyBhcmUgbXNnLCBzaG0sIHNlbS4gKi8KKwl7CisJCXR5cGVfaWQgd2hhdCA9IDA7IC8qIHNpbGVuY2UgZ2NjICovCisJCWNoYXIgdzsKKworCQl3ID0gYXJndlsxXVswXTsKKwkJaWYgKCAoKHcgPT0gJ20nICYmIGFyZ3ZbMV1bMV0gPT0gJ3MnICYmIGFyZ3ZbMV1bMl0gPT0gJ2cnKQorCQkgICAgICAgfHwgKGFyZ3ZbMV1bMF0gPT0gJ3MnCisJCSAgICAgICAgICAgJiYgKCh3ID0gYXJndlsxXVsxXSkgPT0gJ2gnIHx8IHcgPT0gJ2UnKQorCQkgICAgICAgICAgICYmIGFyZ3ZbMV1bMl0gPT0gJ20nKQorCQkgICAgICkgJiYgYXJndlsxXVszXSA9PSAnXDAnCisJCSkgeworCQkJaWYgKGFyZ2MgPCAzKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQkJaWYgKHcgPT0gJ2gnKQorCQkJCXdoYXQgPSBTSE07CisJCQllbHNlIGlmICh3ID09ICdtJykKKwkJCQl3aGF0ID0gTVNHOworCQkJZWxzZSBpZiAodyA9PSAnZScpCisJCQkJd2hhdCA9IFNFTTsKKworCQkJaWYgKHJlbW92ZV9pZHMod2hhdCwgJmFyZ3ZbMl0pKQorCQkJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCXByaW50ZigicmVzb3VyY2UocykgZGVsZXRlZFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbmRpZiAvKiBJUENSTV9MRUdBQ1kgKi8KKworCS8qIHByb2Nlc3MgbmV3IHN5bnRheCB0byBjb25mb3JtIHdpdGggU1lTViBpcGNybSAqLworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAicTptOnM6UTpNOlM6aD8iKSkgIT0gLTEpIHsKKwkJaW50IHJlc3VsdDsKKwkJaW50IGlkID0gMDsKKwkJaW50IGlza2V5ID0gaXN1cHBlcihjKTsKKworCQkvKiBuZWVkZWQgdG8gZGVsZXRlIHNlbWFwaG9yZXMgKi8KKwkJdW5pb24gc2VtdW4gYXJnOworCisJCWFyZy52YWwgPSAwOworCisJCWlmICgoYyA9PSAnPycpIHx8IChjID09ICdoJykpIHsKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCisJCS8qIHdlIGRvbid0IG5lZWQgY2FzZSBpbmZvcm1hdGlvbiBhbnkgbW9yZSAqLworCQljID0gdG9sb3dlcihjKTsKKworCQkvKiBtYWtlIHN1cmUgdGhlIG9wdGlvbiBpcyBpbiByYW5nZTogYWxsb3dlZCBhcmUgcSwgbSwgcyAqLworCQlpZiAoYyAhPSAncScgJiYgYyAhPSAnbScgJiYgYyAhPSAncycpIHsKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCisJCWlmIChpc2tleSkgeworCQkJLyoga2V5cyBhcmUgaW4gaGV4IG9yIGRlY2ltYWwgKi8KKwkJCWtleV90IGtleSA9IHhzdHJ0b3VsKG9wdGFyZywgMCk7CisKKwkJCWlmIChrZXkgPT0gSVBDX1BSSVZBVEUpIHsKKwkJCQllcnJvcisrOworCQkJCWJiX2Vycm9yX21zZygiaWxsZWdhbCBrZXkgKCVzKSIsIG9wdGFyZyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIGNvbnZlcnQga2V5IHRvIGlkICovCisJCQlpZCA9ICgoYyA9PSAncScpID8gbXNnZ2V0KGtleSwgMCkgOgorCQkJCSAgKGMgPT0gJ20nKSA/IHNobWdldChrZXksIDAsIDApIDogc2VtZ2V0KGtleSwgMCwgMCkpOworCisJCQlpZiAoaWQgPCAwKSB7CisJCQkJY29uc3QgY2hhciAqZXJybXNnOworCisJCQkJZXJyb3IrKzsKKwkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQUNDRVM6CisJCQkJCWVycm1zZyA9ICJwZXJtaXNzaW9uIGRlbmllZCBmb3IiOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVJRFJNOgorCQkJCQllcnJtc2cgPSAiYWxyZWFkeSByZW1vdmVkIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFTk9FTlQ6CisJCQkJCWVycm1zZyA9ICJpbnZhbGlkIjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZXJybXNnID0gInVua25vd24gZXJyb3IgaW4iOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYmJfZXJyb3JfbXNnKCIlcyAlcyAoJXMpIiwgZXJybXNnLCAia2V5Iiwgb3B0YXJnKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGlkcyBhcmUgaW4gZGVjaW1hbCAqLworCQkJaWQgPSB4YXRvdWwob3B0YXJnKTsKKwkJfQorCisJCXJlc3VsdCA9ICgoYyA9PSAncScpID8gbXNnY3RsKGlkLCBJUENfUk1JRCwgTlVMTCkgOgorCQkJCSAgKGMgPT0gJ20nKSA/IHNobWN0bChpZCwgSVBDX1JNSUQsIE5VTEwpIDoKKwkJCQkgIHNlbWN0bChpZCwgMCwgSVBDX1JNSUQsIGFyZykpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWNvbnN0IGNoYXIgKmVycm1zZzsKKwkJCWNvbnN0IGNoYXIgKmNvbnN0IHdoYXQgPSBpc2tleSA/ICJrZXkiIDogImlkIjsKKworCQkJZXJyb3IrKzsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCWNhc2UgRUFDQ0VTOgorCQkJY2FzZSBFUEVSTToKKwkJCQllcnJtc2cgPSAicGVybWlzc2lvbiBkZW5pZWQgZm9yIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRUlOVkFMOgorCQkJCWVycm1zZyA9ICJpbnZhbGlkIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRUlEUk06CisJCQkJZXJybXNnID0gImFscmVhZHkgcmVtb3ZlZCI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWVycm1zZyA9ICJ1bmtub3duIGVycm9yIGluIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJiX2Vycm9yX21zZygiJXMgJXMgKCVzKSIsIGVycm1zZywgd2hhdCwgb3B0YXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyogcHJpbnQgdXNhZ2UgaWYgd2Ugc3RpbGwgaGF2ZSBzb21lIGFyZ3VtZW50cyBsZWZ0IG92ZXIgKi8KKwlpZiAob3B0aW5kICE9IGFyZ2MpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIGV4aXQgdmFsdWUgcmVmbGVjdHMgdGhlIG51bWJlciBvZiBlcnJvcnMgZW5jb3VudGVyZWQgKi8KKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2lwY3MuYyBiL3V0aWwtbGludXgvaXBjcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2RmNWUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2lwY3MuYwpAQCAtMCwwICsxLDYzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaXBjcy5jIC0tIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFsbG9jYXRlZCBpcGMgcmVzb3VyY2VzLgorICoKKyAqIDAxIFNlcHQgMjAwNCAtIFJvZG5leSBSYWRmb3JkIDxycmFkZm9yZEBtaW5kc3ByaW5nLmNvbT4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggZnJvbSB1dGlsLWxpbnV4LTIuMTJhLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlwY3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltbLXNtcV0gLWkgc2htaWRdIHwgW1stYXNtcV0gWy10Y3BsdV1dIgorLy91c2FnZTojZGVmaW5lIGlwY3NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWkJU2hvdyBzcGVjaWZpYyByZXNvdXJjZSIKKy8vdXNhZ2U6ICAgICAiXG5SZXNvdXJjZSBzcGVjaWZpY2F0aW9uOiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JU2hhcmVkIG1lbW9yeSBzZWdtZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJTWVzc2FnZSBxdWV1ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCVNlbWFwaG9yZSBhcnJheXMiCisvL3VzYWdlOiAgICAgIlxuCS1hCUFsbCAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuT3V0cHV0IGZvcm1hdDoiCisvL3VzYWdlOiAgICAgIlxuCS10CVRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1jCUNyZWF0b3IiCisvL3VzYWdlOiAgICAgIlxuCS1wCVBpZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGltaXRzIgorLy91c2FnZTogICAgICJcbgktdQlTdW1tYXJ5IgorCisvKiBYL09QRU4gdGVsbHMgdXMgdG8gdXNlIDxzeXMve3R5cGVzLGlwYyxzZW19Lmg+IGZvciBzZW1jdGwoKSAqLworLyogWC9PUEVOIHRlbGxzIHVzIHRvIHVzZSA8c3lzL3t0eXBlcyxpcGMsbXNnfS5oPiBmb3IgbXNnY3RsKCkgKi8KKy8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNobX0uaD4gZm9yIHNobWN0bCgpICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zZW0uaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFNITV9ERVNUIGFuZCBTSE1fTE9DS0VEIGFyZSBkZWZpbmVkIGluIGtlcm5lbCBoZWFkZXJzLAorICAgYnV0IGluc2lkZSAjaWZkZWYgX19LRVJORUxfXyAuLi4gI2VuZGlmICovCisjaWZuZGVmIFNITV9ERVNUCisvKiBzaG1fbW9kZSB1cHBlciBieXRlIGZsYWdzICovCisjZGVmaW5lIFNITV9ERVNUICAgICAgICAwMTAwMAkvKiBzZWdtZW50IHdpbGwgYmUgZGVzdHJveWVkIG9uIGxhc3QgZGV0YWNoICovCisjZGVmaW5lIFNITV9MT0NLRUQgICAgICAwMjAwMAkvKiBzZWdtZW50IHdpbGwgbm90IGJlIHN3YXBwZWQgKi8KKyNlbmRpZgorCisvKiBGb3Igb2xkZXIga2VybmVscyB0aGUgc2FtZSBob2xkcyBmb3IgdGhlIGRlZmluZXMgYmVsb3cgKi8KKyNpZm5kZWYgTVNHX1NUQVQKKyNkZWZpbmUgTVNHX1NUQVQJMTEKKyNkZWZpbmUgTVNHX0lORk8JMTIKKyNlbmRpZgorCisjaWZuZGVmIFNITV9TVEFUCisjZGVmaW5lIFNITV9TVEFUICAgICAgICAxMworI2RlZmluZSBTSE1fSU5GTyAgICAgICAgMTQKK3N0cnVjdCBzaG1faW5mbyB7CisJaW50IHVzZWRfaWRzOworCXVuc2lnbmVkIGxvbmcgc2htX3RvdDsJCS8qIHRvdGFsIGFsbG9jYXRlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHNobV9yc3M7CQkvKiB0b3RhbCByZXNpZGVudCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHNobV9zd3A7CQkvKiB0b3RhbCBzd2FwcGVkIHNobSAqLworCXVuc2lnbmVkIGxvbmcgc3dhcF9hdHRlbXB0czsKKwl1bnNpZ25lZCBsb25nIHN3YXBfc3VjY2Vzc2VzOworfTsKKyNlbmRpZgorCisjaWZuZGVmIFNFTV9TVEFUCisjZGVmaW5lIFNFTV9TVEFUCTE4CisjZGVmaW5lIFNFTV9JTkZPCTE5CisjZW5kaWYKKworLyogU29tZSB2ZXJzaW9ucyBvZiBsaWJjIG9ubHkgZGVmaW5lIElQQ19JTkZPIHdoZW4gX19VU0VfR05VIGlzIGRlZmluZWQuICovCisjaWZuZGVmIElQQ19JTkZPCisjZGVmaW5lIElQQ19JTkZPICAgICAgICAzCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBsYXN0IGFyZyBvZiBzZW1jdGwgaXMgYSB1bmlvbiBzZW11biwgYnV0IHdoZXJlIGlzIGl0IGRlZmluZWQ/CisgICBYL09QRU4gdGVsbHMgdXMgdG8gZGVmaW5lIGl0IG91cnNlbHZlcywgYnV0IHVudGlsIHJlY2VudGx5CisgICBMaW51eCBpbmNsdWRlIGZpbGVzIHdvdWxkIGFsc28gZGVmaW5lIGl0LiAqLworI2lmIGRlZmluZWQoX19HTlVfTElCUkFSWV9fKSAmJiAhZGVmaW5lZChfU0VNX1NFTVVOX1VOREVGSU5FRCkKKy8qIHVuaW9uIHNlbXVuIGlzIGRlZmluZWQgYnkgaW5jbHVkaW5nIDxzeXMvc2VtLmg+ICovCisjZWxzZQorLyogYWNjb3JkaW5nIHRvIFgvT1BFTiB3ZSBoYXZlIHRvIGRlZmluZSBpdCBvdXJzZWx2ZXMgKi8KK3VuaW9uIHNlbXVuIHsKKwlpbnQgdmFsOworCXN0cnVjdCBzZW1pZF9kcyAqYnVmOworCXVuc2lnbmVkIHNob3J0ICphcnJheTsKKwlzdHJ1Y3Qgc2VtaW5mbyAqX19idWY7Cit9OworI2VuZGlmCisKKy8qIFgvT1BFTiAoSmFuIDE5ODcpIGRvZXMgbm90IGRlZmluZSBmaWVsZHMga2V5LCBzZXEgaW4gc3RydWN0IGlwY19wZXJtOworICAgbGliYyA0LzUgZG9lcyBub3QgbWVudGlvbiBzdHJ1Y3QgaXBjX3Rlcm0gYXQgYWxsLCBidXQgaW5jbHVkZXMKKyAgIDxsaW51eC9pcGMuaD4sIHdoaWNoIGRlZmluZXMgYSBzdHJ1Y3QgaXBjX3Blcm0gd2l0aCBzdWNoIGZpZWxkcy4KKyAgIGdsaWJjLTEuMDkgaGFzIG5vIHN1cHBvcnQgZm9yIHN5c3YgaXBjLgorICAgZ2xpYmMgMiB1c2VzIF9fa2V5LCBfX3NlcSAqLworI2lmIGRlZmluZWQoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCisjZGVmaW5lIEtFWSBfX2tleQorI2Vsc2UKKyNkZWZpbmUgS0VZIGtleQorI2VuZGlmCisKKyNkZWZpbmUgTElNSVRTIDEKKyNkZWZpbmUgU1RBVFVTIDIKKyNkZWZpbmUgQ1JFQVRPUiAzCisjZGVmaW5lIFRJTUUgNAorI2RlZmluZSBQSUQgNQorCitzdGF0aWMgY2hhciBmb3JtYXQ7CisKK3N0YXRpYyB2b2lkIHByaW50X3Blcm1zKGludCBpZCwgc3RydWN0IGlwY19wZXJtICppcGNwKQoreworCXN0cnVjdCBwYXNzd2QgKnB3OworCXN0cnVjdCBncm91cCAqZ3I7CisKKwlwcmludGYoIiUtMTBkICUtMTBvIiwgaWQsIGlwY3AtPm1vZGUgJiAwNzc3KTsKKworCXB3ID0gZ2V0cHd1aWQoaXBjcC0+Y3VpZCk7CisJaWYgKHB3KQlwcmludGYoIiAlLTEwcyIsIHB3LT5wd19uYW1lKTsKKwllbHNlCXByaW50ZigiICUtMTBkIiwgaXBjcC0+Y3VpZCk7CisJZ3IgPSBnZXRncmdpZChpcGNwLT5jZ2lkKTsKKwlpZiAoZ3IpCXByaW50ZigiICUtMTBzIiwgZ3ItPmdyX25hbWUpOworCWVsc2UJcHJpbnRmKCIgJS0xMGQiLCBpcGNwLT5jZ2lkKTsKKworCXB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKTsKKwlpZiAocHcpCXByaW50ZigiICUtMTBzIiwgcHctPnB3X25hbWUpOworCWVsc2UJcHJpbnRmKCIgJS0xMGQiLCBpcGNwLT51aWQpOworCWdyID0gZ2V0Z3JnaWQoaXBjcC0+Z2lkKTsKKwlpZiAoZ3IpCXByaW50ZigiICUtMTBzXG4iLCBnci0+Z3JfbmFtZSk7CisJZWxzZQlwcmludGYoIiAlLTEwZFxuIiwgaXBjcC0+Z2lkKTsKK30KKworCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBkb19zaG0odm9pZCkKK3sKKwlpbnQgbWF4aWQsIHNobWlkLCBpZDsKKwlzdHJ1Y3Qgc2htaWRfZHMgc2htc2VnOworCXN0cnVjdCBzaG1faW5mbyBzaG1faW5mbzsKKwlzdHJ1Y3Qgc2htaW5mbyBzaG1pbmZvOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzaG1zZWcuc2htX3Blcm07CisJc3RydWN0IHBhc3N3ZCAqcHc7CisKKwltYXhpZCA9IHNobWN0bCgwLCBTSE1fSU5GTywgKHN0cnVjdCBzaG1pZF9kcyAqKSAodm9pZCAqKSAmc2htX2luZm8pOworCWlmIChtYXhpZCA8IDApIHsKKwkJcHJpbnRmKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yICVzXG4iLCAic2hhcmVkIG1lbW9yeSIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIExJTUlUUzoKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIkxpbWl0cyIpOworCQlpZiAoKHNobWN0bCgwLCBJUENfSU5GTywgKHN0cnVjdCBzaG1pZF9kcyAqKSAodm9pZCAqKSAmc2htaW5mbykpIDwgMCkKKwkJCXJldHVybjsKKwkJLyogZ2xpYmMgMi4xLjMgYW5kIGFsbCBlYXJsaWVyIGxpYmMncyBoYXZlIGludHMgYXMgZmllbGRzCisJCSAgIG9mIHN0cnVjdCBzaG1pbmZvOyBnbGliYyAyLjEuOTEgaGFzIHVuc2lnbmVkIGxvbmc7IGFjaCAqLworCQlwcmludGYoIm1heCBudW1iZXIgb2Ygc2VnbWVudHMgPSAlbHVcbiIKKwkJCQkgICJtYXggc2VnIHNpemUgKGtieXRlcykgPSAlbHVcbiIKKwkJCQkgICJtYXggdG90YWwgc2hhcmVkIG1lbW9yeSAocGFnZXMpID0gJWx1XG4iCisJCQkJICAibWluIHNlZyBzaXplIChieXRlcykgPSAlbHVcbiIsCisJCQkJICAodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1tbmksCisJCQkJICAodW5zaWduZWQgbG9uZykgKHNobWluZm8uc2htbWF4ID4+IDEwKSwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBzaG1pbmZvLnNobWFsbCwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBzaG1pbmZvLnNobW1pbik7CisJCXJldHVybjsKKworCWNhc2UgU1RBVFVTOgorCQlwcmludGYoIi0tLS0tLSBTaGFyZWQgTWVtb3J5ICVzIC0tLS0tLS0tXG4iLCAiU3RhdHVzIik7CisJCXByaW50ZigJICAic2VnbWVudHMgYWxsb2NhdGVkICVkXG4iCisJCQkJICAicGFnZXMgYWxsb2NhdGVkICVsZFxuIgorCQkJCSAgInBhZ2VzIHJlc2lkZW50ICAlbGRcbiIKKwkJCQkgICJwYWdlcyBzd2FwcGVkICAgJWxkXG4iCisJCQkJICAiU3dhcCBwZXJmb3JtYW5jZTogJWxkIGF0dGVtcHRzXHQlbGQgc3VjY2Vzc2VzXG4iLAorCQkJCSAgc2htX2luZm8udXNlZF9pZHMsCisJCQkJICBzaG1faW5mby5zaG1fdG90LAorCQkJCSAgc2htX2luZm8uc2htX3JzcywKKwkJCQkgIHNobV9pbmZvLnNobV9zd3AsCisJCQkJICBzaG1faW5mby5zd2FwX2F0dGVtcHRzLCBzaG1faW5mby5zd2FwX3N1Y2Nlc3Nlcyk7CisJCXJldHVybjsKKworCWNhc2UgQ1JFQVRPUjoKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIlNlZ21lbnQgQ3JlYXRvcnMvT3duZXJzIik7CisJCXByaW50ZigJICAiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisJCQkJICAic2htaWQiLCAicGVybXMiLCAiY3VpZCIsICJjZ2lkIiwgInVpZCIsICJnaWQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJTUU6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJBdHRhY2gvRGV0YWNoL0NoYW5nZSBUaW1lcyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMjBzICUtMjBzICUtMjBzXG4iLAorCQkJCSAgInNobWlkIiwgIm93bmVyIiwgImF0dGFjaGVkIiwgImRldGFjaGVkIiwgImNoYW5nZWQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJRDoKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIkNyZWF0b3IvTGFzdC1vcCIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSAgInNobWlkIiwgIm93bmVyIiwgImNwaWQiLCAibHBpZCIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJTZWdtZW50cyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzXG4iLAorCQkJCSAgImtleSIsICJzaG1pZCIsICJvd25lciIsICJwZXJtcyIsICJieXRlcyIsICJuYXR0Y2giLAorCQkJCSAgInN0YXR1cyIpOworCQlicmVhazsKKwl9CisKKwlmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKKwkJc2htaWQgPSBzaG1jdGwoaWQsIFNITV9TVEFULCAmc2htc2VnKTsKKwkJaWYgKHNobWlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpIHsKKwkJCXByaW50X3Blcm1zKHNobWlkLCBpcGNwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKTsKKwkJc3dpdGNoIChmb3JtYXQpIHsKKwkJY2FzZSBUSU1FOgorCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOworCQkJZWxzZQorCQkJCXByaW50ZigiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKKwkJCS8qIGN0aW1lIHVzZXMgc3RhdGljIGJ1ZmZlcjogdXNlIHNlcGFyYXRlIGNhbGxzICovCisJCQlwcmludGYoIiAlLTIwLjE2cyIsIHNobXNlZy5zaG1fYXRpbWUKKwkJCQkJICA/IGN0aW1lKCZzaG1zZWcuc2htX2F0aW1lKSArIDQgOiAiTm90IHNldCIpOworCQkJcHJpbnRmKCIgJS0yMC4xNnMiLCBzaG1zZWcuc2htX2R0aW1lCisJCQkJCSAgPyBjdGltZSgmc2htc2VnLnNobV9kdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKwkJCXByaW50ZigiICUtMjAuMTZzXG4iLCBzaG1zZWcuc2htX2N0aW1lCisJCQkJCSAgPyBjdGltZSgmc2htc2VnLnNobV9jdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKwkJCWJyZWFrOworCQljYXNlIFBJRDoKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtMTBkICUtMTBkIiwgc2htaWQsIGlwY3AtPnVpZCk7CisJCQlwcmludGYoIiAlLTEwZCAlLTEwZFxuIiwgc2htc2VnLnNobV9jcGlkLCBzaG1zZWcuc2htX2xwaWQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiMHglMDh4ICIsIGlwY3AtPktFWSk7CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwLjEwcyIsIHNobWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0xMG8gJS0xMGx1ICUtMTBsZCAlLTZzICUtNnNcbiIsIGlwY3AtPm1vZGUgJiAwNzc3LAorCQkJCQkgIC8qCisJCQkJCSAgICogZWFybGllcjogaW50LCBBdXN0aW4gaGFzIHNpemVfdAorCQkJCQkgICAqLworCQkJCQkgICh1bnNpZ25lZCBsb25nKSBzaG1zZWcuc2htX3NlZ3N6LAorCQkJCQkgIC8qCisJCQkJCSAgICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OworCQkJCQkgICAqIEF1c3RpbiBoYXMgc2htYXR0X3QKKwkJCQkJICAgKi8KKwkJCQkJICAobG9uZykgc2htc2VnLnNobV9uYXR0Y2gsCisJCQkJCSAgaXBjcC0+bW9kZSAmIFNITV9ERVNUID8gImRlc3QiIDogIiAiLAorCQkJCQkgIGlwY3AtPm1vZGUgJiBTSE1fTE9DS0VEID8gImxvY2tlZCIgOiAiICIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZG9fc2VtKHZvaWQpCit7CisJaW50IG1heGlkLCBzZW1pZCwgaWQ7CisJc3RydWN0IHNlbWlkX2RzIHNlbWFyeTsKKwlzdHJ1Y3Qgc2VtaW5mbyBzZW1pbmZvOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1hcnkuc2VtX3Blcm07CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdW5pb24gc2VtdW4gYXJnOworCisJYXJnLmFycmF5ID0gKHVuc2lnbmVkIHNob3J0ICopICh2b2lkICopICZzZW1pbmZvOworCW1heGlkID0gc2VtY3RsKDAsIDAsIFNFTV9JTkZPLCBhcmcpOworCWlmIChtYXhpZCA8IDApIHsKKwkJcHJpbnRmKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yICVzXG4iLCAic2VtYXBob3JlcyIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIExJTUlUUzoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiTGltaXRzIik7CisJCWFyZy5hcnJheSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAodm9pZCAqKSAmc2VtaW5mbzsJLyogZGFtbiB1bmlvbiAqLworCQlpZiAoKHNlbWN0bCgwLCAwLCBJUENfSU5GTywgYXJnKSkgPCAwKQorCQkJcmV0dXJuOworCQlwcmludGYoIm1heCBudW1iZXIgb2YgYXJyYXlzID0gJWRcbiIKKwkJCQkgICJtYXggc2VtYXBob3JlcyBwZXIgYXJyYXkgPSAlZFxuIgorCQkJCSAgIm1heCBzZW1hcGhvcmVzIHN5c3RlbSB3aWRlID0gJWRcbiIKKwkJCQkgICJtYXggb3BzIHBlciBzZW1vcCBjYWxsID0gJWRcbiIKKwkJCQkgICJzZW1hcGhvcmUgbWF4IHZhbHVlID0gJWRcbiIsCisJCQkJICBzZW1pbmZvLnNlbW1uaSwKKwkJCQkgIHNlbWluZm8uc2VtbXNsLAorCQkJCSAgc2VtaW5mby5zZW1tbnMsIHNlbWluZm8uc2Vtb3BtLCBzZW1pbmZvLnNlbXZteCk7CisJCXJldHVybjsKKworCWNhc2UgU1RBVFVTOgorCQlwcmludGYoIi0tLS0tLSBTZW1hcGhvcmUgJXMgLS0tLS0tLS1cbiIsICJTdGF0dXMiKTsKKwkJcHJpbnRmKAkgICJ1c2VkIGFycmF5cyA9ICVkXG4iCisJCQkJICAiYWxsb2NhdGVkIHNlbWFwaG9yZXMgPSAlZFxuIiwKKwkJCQkgIHNlbWluZm8uc2VtdXN6LCBzZW1pbmZvLnNlbWFlbSk7CisJCXJldHVybjsKKworCWNhc2UgQ1JFQVRPUjoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiQXJyYXlzIENyZWF0b3JzL093bmVycyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSAgInNlbWlkIiwgInBlcm1zIiwgImN1aWQiLCAiY2dpZCIsICJ1aWQiLCAiZ2lkIik7CisJCWJyZWFrOworCisJY2FzZSBUSU1FOgorCQlwcmludGYoIi0tLS0tLSBTaGFyZWQgTWVtb3J5ICVzIC0tLS0tLS0tXG4iLCAiT3BlcmF0aW9uL0NoYW5nZSBUaW1lcyIpOworCQlwcmludGYoCSAgIiUtOHMgJS0xMHMgJS0yNi4yNHMgJS0yNi4yNHNcbiIsCisJCQkJICAic2htaWQiLCAib3duZXIiLCAibGFzdC1vcCIsICJsYXN0LWNoYW5nZWQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJRDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIi0tLS0tLSBTZW1hcGhvcmUgJXMgLS0tLS0tLS1cbiIsICJBcnJheXMiKTsKKwkJcHJpbnRmKAkgICIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkgICJrZXkiLCAic2VtaWQiLCAib3duZXIiLCAicGVybXMiLCAibnNlbXMiKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDw9IG1heGlkOyBpZCsrKSB7CisJCWFyZy5idWYgPSAoc3RydWN0IHNlbWlkX2RzICopICZzZW1hcnk7CisJCXNlbWlkID0gc2VtY3RsKGlkLCAwLCBTRU1fU1RBVCwgYXJnKTsKKwkJaWYgKHNlbWlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpIHsKKwkJCXByaW50X3Blcm1zKHNlbWlkLCBpcGNwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKTsKKwkJc3dpdGNoIChmb3JtYXQpIHsKKwkJY2FzZSBUSU1FOgorCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS04ZCAlLTEwLjEwcyIsIHNlbWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLThkICUtMTBkIiwgc2VtaWQsIGlwY3AtPnVpZCk7CisJCQkvKiBjdGltZSB1c2VzIHN0YXRpYyBidWZmZXI6IHVzZSBzZXBhcmF0ZSBjYWxscyAqLworCQkJcHJpbnRmKCIgICUtMjYuMjRzIiwgc2VtYXJ5LnNlbV9vdGltZQorCQkJCQkgID8gY3RpbWUoJnNlbWFyeS5zZW1fb3RpbWUpIDogIk5vdCBzZXQiKTsKKwkJCXByaW50ZigiICUtMjYuMjRzXG4iLCBzZW1hcnkuc2VtX2N0aW1lCisJCQkJCSAgPyBjdGltZSgmc2VtYXJ5LnNlbV9jdGltZSkgOiAiTm90IHNldCIpOworCQkJYnJlYWs7CisJCWNhc2UgUElEOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiMHglMDh4ICIsIGlwY3AtPktFWSk7CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwLjlzIiwgc2VtaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtMTBkICUtOWQiLCBzZW1pZCwgaXBjcC0+dWlkKTsKKwkJCXByaW50ZigiICUtMTBvICUtMTBsZFxuIiwgaXBjcC0+bW9kZSAmIDA3NzcsCisJCQkJCSAgLyoKKwkJCQkJICAgKiBnbGliYy0yLjEuMyBhbmQgZWFybGllciBoYXMgdW5zaWduZWQgc2hvcnQ7CisJCQkJCSAgICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgorCQkJCQkgICAqIHVuc2lnbmVkIHNob3J0IGFuZCB1bnNpZ25lZCBsb25nCisJCQkJCSAgICogQXVzdGluIHByZXNjcmliZXMgdW5zaWduZWQgc2hvcnQuCisJCQkJCSAgICovCisJCQkJCSAgKGxvbmcpIHNlbWFyeS5zZW1fbnNlbXMpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZG9fbXNnKHZvaWQpCit7CisJaW50IG1heGlkLCBtc3FpZCwgaWQ7CisJc3RydWN0IG1zcWlkX2RzIG1zZ3F1ZTsKKwlzdHJ1Y3QgbXNnaW5mbyBtc2dpbmZvOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZtc2dxdWUubXNnX3Blcm07CisJc3RydWN0IHBhc3N3ZCAqcHc7CisKKwltYXhpZCA9IG1zZ2N0bCgwLCBNU0dfSU5GTywgKHN0cnVjdCBtc3FpZF9kcyAqKSAodm9pZCAqKSAmbXNnaW5mbyk7CisJaWYgKG1heGlkIDwgMCkgeworCQlwcmludGYoImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3IgJXNcbiIsICJtZXNzYWdlIHF1ZXVlcyIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIExJTUlUUzoKKwkJaWYgKChtc2djdGwoMCwgSVBDX0lORk8sIChzdHJ1Y3QgbXNxaWRfZHMgKikgKHZvaWQgKikgJm1zZ2luZm8pKSA8IDApCisJCQlyZXR1cm47CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgInM6IExpbWl0cyIpOworCQlwcmludGYoCSAgIm1heCBxdWV1ZXMgc3lzdGVtIHdpZGUgPSAlZFxuIgorCQkJCSAgIm1heCBzaXplIG9mIG1lc3NhZ2UgKGJ5dGVzKSA9ICVkXG4iCisJCQkJICAiZGVmYXVsdCBtYXggc2l6ZSBvZiBxdWV1ZSAoYnl0ZXMpID0gJWRcbiIsCisJCQkJICBtc2dpbmZvLm1zZ21uaSwgbXNnaW5mby5tc2dtYXgsIG1zZ2luZm8ubXNnbW5iKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFUVVM6CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgInM6IFN0YXR1cyIpOworCQlwcmludGYoCSAgImFsbG9jYXRlZCBxdWV1ZXMgPSAlZFxuIgorCQkJCSAgInVzZWQgaGVhZGVycyA9ICVkXG4iCisJCQkJICAidXNlZCBzcGFjZSA9ICVkIGJ5dGVzXG4iLAorCQkJCSAgbXNnaW5mby5tc2dwb29sLCBtc2dpbmZvLm1zZ21hcCwgbXNnaW5mby5tc2d0cWwpOworCQlyZXR1cm47CisKKwljYXNlIENSRUFUT1I6CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgIiBRdWV1ZXM6IENyZWF0b3JzL093bmVycyIpOworCQlwcmludGYoCSAgIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSAgIm1zcWlkIiwgInBlcm1zIiwgImN1aWQiLCAiY2dpZCIsICJ1aWQiLCAiZ2lkIik7CisJCWJyZWFrOworCisJY2FzZSBUSU1FOgorCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICIgUXVldWVzIFNlbmQvUmVjdi9DaGFuZ2UgVGltZXMiKTsKKwkJcHJpbnRmKAkgICIlLThzICUtMTBzICUtMjBzICUtMjBzICUtMjBzXG4iLAorCQkJCSAgIm1zcWlkIiwgIm93bmVyIiwgInNlbmQiLCAicmVjdiIsICJjaGFuZ2UiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJRDoKKwkJcHJpbnRmKCItLS0tLS0gTWVzc2FnZSVzIC0tLS0tLS0tXG4iLCAiIFF1ZXVlcyBQSURzIik7CisJCXByaW50ZigJICAiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisJCQkJICAibXNxaWQiLCAib3duZXIiLCAibHNwaWQiLCAibHJwaWQiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICIgUXVldWVzIik7CisJCXByaW50ZigJICAiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMnMgJS0xMnNcbiIsCisJCQkJICAia2V5IiwgIm1zcWlkIiwgIm93bmVyIiwgInBlcm1zIiwgInVzZWQtYnl0ZXMiLCAibWVzc2FnZXMiKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDw9IG1heGlkOyBpZCsrKSB7CisJCW1zcWlkID0gbXNnY3RsKGlkLCBNU0dfU1RBVCwgJm1zZ3F1ZSk7CisJCWlmIChtc3FpZCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSB7CisJCQlwcmludF9wZXJtcyhtc3FpZCwgaXBjcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CisJCXN3aXRjaCAoZm9ybWF0KSB7CisJCWNhc2UgVElNRToKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtOGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOworCQkJZWxzZQorCQkJCXByaW50ZigiJS04ZCAlLTEwZCIsIG1zcWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0yMC4xNnMiLCBtc2dxdWUubXNnX3N0aW1lCisJCQkJCSAgPyBjdGltZSgmbXNncXVlLm1zZ19zdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKwkJCXByaW50ZigiICUtMjAuMTZzIiwgbXNncXVlLm1zZ19ydGltZQorCQkJCQkgID8gY3RpbWUoJm1zZ3F1ZS5tc2dfcnRpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTIwLjE2c1xuIiwgbXNncXVlLm1zZ19jdGltZQorCQkJCQkgID8gY3RpbWUoJm1zZ3F1ZS5tc2dfY3RpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQSUQ6CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLThkICUtMTAuMTBzIiwgbXNxaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtOGQgJS0xMGQiLCBtc3FpZCwgaXBjcC0+dWlkKTsKKwkJCXByaW50ZigiICAlNWQgICAgICU1ZFxuIiwgbXNncXVlLm1zZ19sc3BpZCwgbXNncXVlLm1zZ19scnBpZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCIweCUwOHggIiwgaXBjcC0+S0VZKTsKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtMTBkICUtMTAuMTBzIiwgbXNxaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtMTBkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CisJCQlwcmludGYoIiAlLTEwbyAlLTEybGQgJS0xMmxkXG4iLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCQkJICAvKgorCQkJCQkgICAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKKwkJCQkJICAgKiBnbGliYy0yLjEuOTEgaGFzIHZhcmlhdGlvbiBiZXR3ZWVuCisJCQkJCSAgICogdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcKKwkJCQkJICAgKiBBdXN0aW4gaGFzIG1zZ3FudW1fdAorCQkJCQkgICAqLworCQkJCQkgIChsb25nKSBtc2dxdWUubXNnX2NieXRlcywgKGxvbmcpIG1zZ3F1ZS5tc2dfcW51bSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBwcmludF9zaG0oaW50IHNobWlkKQoreworCXN0cnVjdCBzaG1pZF9kcyBzaG1kczsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2htZHMuc2htX3Blcm07CisKKwlpZiAoc2htY3RsKHNobWlkLCBJUENfU1RBVCwgJnNobWRzKSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnKCJzaG1jdGwiKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiXG5TaGFyZWQgbWVtb3J5IFNlZ21lbnQgc2htaWQ9JWRcbiIKKwkJCSAgInVpZD0lZFx0Z2lkPSVkXHRjdWlkPSVkXHRjZ2lkPSVkXG4iCisJCQkgICJtb2RlPSUjb1x0YWNjZXNzX3Blcm1zPSUjb1xuIgorCQkJICAiYnl0ZXM9JWxkXHRscGlkPSVkXHRjcGlkPSVkXHRuYXR0Y2g9JWxkXG4iLAorCQkJICBzaG1pZCwKKwkJCSAgaXBjcC0+dWlkLCBpcGNwLT5naWQsIGlwY3AtPmN1aWQsIGlwY3AtPmNnaWQsCisJCQkgIGlwY3AtPm1vZGUsIGlwY3AtPm1vZGUgJiAwNzc3LAorCQkJICAobG9uZykgc2htZHMuc2htX3NlZ3N6LCBzaG1kcy5zaG1fbHBpZCwgc2htZHMuc2htX2NwaWQsCisJCQkgIChsb25nKSBzaG1kcy5zaG1fbmF0dGNoKTsKKwlwcmludGYoImF0dF90aW1lPSUtMjYuMjRzXG4iLAorCQkJICBzaG1kcy5zaG1fYXRpbWUgPyBjdGltZSgmc2htZHMuc2htX2F0aW1lKSA6ICJOb3Qgc2V0Iik7CisJcHJpbnRmKCJkZXRfdGltZT0lLTI2LjI0c1xuIiwKKwkJCSAgc2htZHMuc2htX2R0aW1lID8gY3RpbWUoJnNobWRzLnNobV9kdGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigiY2hhbmdlX3RpbWU9JS0yNi4yNHNcblxuIiwgY3RpbWUoJnNobWRzLnNobV9jdGltZSkpOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50X21zZyhpbnQgbXNxaWQpCit7CisJc3RydWN0IG1zcWlkX2RzIGJ1ZjsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmYnVmLm1zZ19wZXJtOworCisJaWYgKG1zZ2N0bChtc3FpZCwgSVBDX1NUQVQsICZidWYpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coIm1zZ2N0bCIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJcbk1lc3NhZ2UgUXVldWUgbXNxaWQ9JWRcbiIKKwkJCSAgInVpZD0lZFx0Z2lkPSVkXHRjdWlkPSVkXHRjZ2lkPSVkXHRtb2RlPSUjb1xuIgorCQkJICAiY2J5dGVzPSVsZFx0cWJ5dGVzPSVsZFx0cW51bT0lbGRcdGxzcGlkPSVkXHRscnBpZD0lZFxuIiwKKwkJCSAgbXNxaWQsIGlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLCBpcGNwLT5tb2RlLAorCQkJICAvKgorCQkJICAgKiBnbGliYy0yLjEuMyBhbmQgZWFybGllciBoYXMgdW5zaWduZWQgc2hvcnQ7CisJCQkgICAqIGdsaWJjLTIuMS45MSBoYXMgdmFyaWF0aW9uIGJldHdlZW4KKwkJCSAgICogdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcKKwkJCSAgICogQXVzdGluIGhhcyBtc2dxbnVtX3QgKGZvciBtc2dfcWJ5dGVzKQorCQkJICAgKi8KKwkJCSAgKGxvbmcpIGJ1Zi5tc2dfY2J5dGVzLCAobG9uZykgYnVmLm1zZ19xYnl0ZXMsCisJCQkgIChsb25nKSBidWYubXNnX3FudW0sIGJ1Zi5tc2dfbHNwaWQsIGJ1Zi5tc2dfbHJwaWQpOworCisJcHJpbnRmKCJzZW5kX3RpbWU9JS0yNi4yNHNcbiIsCisJCQkgIGJ1Zi5tc2dfc3RpbWUgPyBjdGltZSgmYnVmLm1zZ19zdGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigicmN2X3RpbWU9JS0yNi4yNHNcbiIsCisJCQkgIGJ1Zi5tc2dfcnRpbWUgPyBjdGltZSgmYnVmLm1zZ19ydGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigiY2hhbmdlX3RpbWU9JS0yNi4yNHNcblxuIiwKKwkJCSAgYnVmLm1zZ19jdGltZSA/IGN0aW1lKCZidWYubXNnX2N0aW1lKSA6ICJOb3Qgc2V0Iik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3NlbShpbnQgc2VtaWQpCit7CisJc3RydWN0IHNlbWlkX2RzIHNlbWRzOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1kcy5zZW1fcGVybTsKKwl1bmlvbiBzZW11biBhcmc7CisJdW5zaWduZWQgaW50IGk7CisKKwlhcmcuYnVmID0gJnNlbWRzOworCWlmIChzZW1jdGwoc2VtaWQsIDAsIElQQ19TVEFULCBhcmcpKSB7CisJCWJiX3BlcnJvcl9tc2coInNlbWN0bCIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJcblNlbWFwaG9yZSBBcnJheSBzZW1pZD0lZFxuIgorCQkJICAidWlkPSVkXHQgZ2lkPSVkXHQgY3VpZD0lZFx0IGNnaWQ9JWRcbiIKKwkJCSAgIm1vZGU9JSNvLCBhY2Nlc3NfcGVybXM9JSNvXG4iCisJCQkgICJuc2VtcyA9ICVsZFxuIgorCQkJICAib3RpbWUgPSAlLTI2LjI0c1xuIiwKKwkJCSAgc2VtaWQsCisJCQkgIGlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLAorCQkJICBpcGNwLT5tb2RlLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCSAgKGxvbmcpIHNlbWRzLnNlbV9uc2VtcywKKwkJCSAgc2VtZHMuc2VtX290aW1lID8gY3RpbWUoJnNlbWRzLnNlbV9vdGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigiY3RpbWUgPSAlLTI2LjI0c1xuIgorCQkJICAiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisJCQkgIGN0aW1lKCZzZW1kcy5zZW1fY3RpbWUpLAorCQkJICAic2VtbnVtIiwgInZhbHVlIiwgIm5jb3VudCIsICJ6Y291bnQiLCAicGlkIik7CisKKwlhcmcudmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2VtZHMuc2VtX25zZW1zOyBpKyspIHsKKwkJaW50IHZhbCwgbmNudCwgemNudCwgcGlkOworCisJCXZhbCA9IHNlbWN0bChzZW1pZCwgaSwgR0VUVkFMLCBhcmcpOworCQluY250ID0gc2VtY3RsKHNlbWlkLCBpLCBHRVROQ05ULCBhcmcpOworCQl6Y250ID0gc2VtY3RsKHNlbWlkLCBpLCBHRVRaQ05ULCBhcmcpOworCQlwaWQgPSBzZW1jdGwoc2VtaWQsIGksIEdFVFBJRCwgYXJnKTsKKwkJaWYgKHZhbCA8IDAgfHwgbmNudCA8IDAgfHwgemNudCA8IDAgfHwgcGlkIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZW1jdGwiKTsKKwkJfQorCQlwcmludGYoIiUtMTBkICUtMTBkICUtMTBkICUtMTBkICUtMTBkXG4iLCBpLCB2YWwsIG5jbnQsIHpjbnQsIHBpZCk7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKK2ludCBpcGNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpcGNzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaWQgPSAwOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqb3B0X2k7CisjZGVmaW5lIGZsYWdfcHJpbnQJKDE8PDApCisjZGVmaW5lIGZsYWdfbXNnCSgxPDwxKQorI2RlZmluZSBmbGFnX3NlbQkoMTw8MikKKyNkZWZpbmUgZmxhZ19zaG0JKDE8PDMpCisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiaTphcXNtdGNwbHUiLCAmb3B0X2kpOworCWlmIChvcHQgJiAweDEpIHsgLy8gLWkKKwkJaWQgPSB4YXRvaShvcHRfaSk7CisJCWZsYWdzIHw9IGZsYWdfcHJpbnQ7CisJfQorCWlmIChvcHQgJiAweDIpIGZsYWdzIHw9IGZsYWdfbXNnIHwgZmxhZ19zZW0gfCBmbGFnX3NobTsgLy8gLWEKKwlpZiAob3B0ICYgMHg0KSBmbGFncyB8PSBmbGFnX21zZzsgLy8gLXEKKwlpZiAob3B0ICYgMHg4KSBmbGFncyB8PSBmbGFnX3NlbTsgLy8gLXMKKwlpZiAob3B0ICYgMHgxMCkgZmxhZ3MgfD0gZmxhZ19zaG07IC8vIC1tCisJaWYgKG9wdCAmIDB4MjApIGZvcm1hdCA9IFRJTUU7IC8vIC10CisJaWYgKG9wdCAmIDB4NDApIGZvcm1hdCA9IENSRUFUT1I7IC8vIC1jCisJaWYgKG9wdCAmIDB4ODApIGZvcm1hdCA9IFBJRDsgLy8gLXAKKwlpZiAob3B0ICYgMHgxMDApIGZvcm1hdCA9IExJTUlUUzsgLy8gLWwKKwlpZiAob3B0ICYgMHgyMDApIGZvcm1hdCA9IFNUQVRVUzsgLy8gLXUKKworCWlmIChmbGFncyAmIGZsYWdfcHJpbnQpIHsKKwkJaWYgKGZsYWdzICYgZmxhZ19zaG0pIHsKKwkJCXByaW50X3NobShpZCk7CisJCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKwkJaWYgKGZsYWdzICYgZmxhZ19zZW0pIHsKKwkJCXByaW50X3NlbShpZCk7CisJCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKwkJaWYgKGZsYWdzICYgZmxhZ19tc2cpIHsKKwkJCXByaW50X21zZyhpZCk7CisJCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmICghKGZsYWdzICYgKGZsYWdfc2htIHwgZmxhZ19tc2cgfCBmbGFnX3NlbSkpKQorCQlmbGFncyB8PSBmbGFnX21zZyB8IGZsYWdfc2htIHwgZmxhZ19zZW07CisJYmJfcHV0Y2hhcignXG4nKTsKKworCWlmIChmbGFncyAmIGZsYWdfc2htKSB7CisJCWRvX3NobSgpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKwlpZiAoZmxhZ3MgJiBmbGFnX3NlbSkgeworCQlkb19zZW0oKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJaWYgKGZsYWdzICYgZmxhZ19tc2cpIHsKKwkJZG9fbXNnKCk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbG9zZXR1cC5jIGIvdXRpbC1saW51eC9sb3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbG9zZXR1cC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGxvc2V0dXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIE1hdHQgS3JhYWkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9zZXR1cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vIE9GU10gTE9PUERFViBGSUxFIC0gYXNzb2NpYXRlIGxvb3AgZGV2aWNlc1xuIgorLy91c2FnZTogICAgICAgIglsb3NldHVwIC1kIExPT1BERVYgLSBkaXNhc3NvY2lhdGVcbiIKKy8vdXNhZ2U6ICAgICAgICIJbG9zZXR1cCBbLWZdIC0gc2hvdyIKKy8vdXNhZ2U6I2RlZmluZSBsb3NldHVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1vIE9GUwlTdGFydCBPRlMgYnl0ZXMgaW50byBGSUxFIgorLy91c2FnZTogICAgICJcbgktZglTaG93IGZpcnN0IGZyZWUgbG9vcCBkZXZpY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxvc2V0dXBfbm90ZXNfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJObyBhcmd1bWVudHMgd2lsbCBkaXNwbGF5IGFsbCBjdXJyZW50IGFzc29jaWF0aW9ucy5cbiIKKy8vdXNhZ2U6ICAgICAgICJPbmUgYXJndW1lbnQgKGxvc2V0dXAgL2Rldi9sb29wMSkgd2lsbCBkaXNwbGF5IHRoZSBjdXJyZW50IGFzc29jaWF0aW9uXG4iCisvL3VzYWdlOiAgICAgICAiKGlmIGFueSksIG9yIGRpc2Fzc29jaWF0ZSBpdCAod2l0aCAtZCkuIFRoZSBkaXNwbGF5IHNob3dzIHRoZSBvZmZzZXRcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdGhlIGxvb3AgZGV2aWNlIGlzIGN1cnJlbnRseSBib3VuZCB0by5cblxuIgorLy91c2FnZTogICAgICAgIlR3byBhcmd1bWVudHMgKGxvc2V0dXAgL2Rldi9sb29wMSBmaWxlLmltZykgY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLFxuIgorLy91c2FnZTogICAgICAgIndpdGggYW4gb3B0aW9uYWwgb2Zmc2V0ICgtbyAxMjM0NSkuIEVuY3J5cHRpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iCisvL3VzYWdlOiAgICAgICAibG9zZXR1cCAtZiB3aWxsIHNob3cgdGhlIGZpcnN0IGxvb3AgZnJlZSBsb29wIGRldmljZVxuXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgbG9zZXR1cF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9zZXR1cF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWludCBuOworCWNoYXIgKm9wdF9vOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQgPSAwOworCWVudW0geworCQlPUFRfZCA9ICgxIDw8IDApLAorCQlPUFRfbyA9ICgxIDw8IDEpLAorCQlPUFRfZiA9ICgxIDw8IDIpLAorCX07CisKKwkvKiBtYXggMiBhcmdzLCBhbGwgb3B0cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzI6ZC0tb2Y6by0tZGY6Zi0tZG8iOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJkbzpmIiwgJm9wdF9vKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHQgPT0gT1BUX28pCisJCW9mZnNldCA9IHhhdG91bGwob3B0X28pOworCisJaWYgKG9wdCA9PSBPUFRfZCkgeworCQkvKiAtZCBCTE9DS0RFViAqLworCQlpZiAoIWFyZ3ZbMF0gfHwgYXJndlsxXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJaWYgKGRlbF9sb29wKGFyZ3ZbMF0pKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAoYXJndlswXSkgeworCQljaGFyICpzOworCisJCWlmIChvcHQgPT0gT1BUX2YpIC8qIC1mIHNob3VsZCBub3QgaGF2ZSBhcmd1bWVudHMgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQlpZiAoYXJndlsxXSkgeworCQkJLyogWy1vIE9GU10gQkxPQ0tERVYgRklMRSAqLworCQkJaWYgKHNldF9sb29wKCZhcmd2WzBdLCBhcmd2WzFdLCBvZmZzZXQpIDwgMCkKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGFyZ3ZbMF0pOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQkvKiBbLW8gT0ZTXSBCTE9DS0RFViAqLworCQlzID0gcXVlcnlfbG9vcChhcmd2WzBdKTsKKwkJaWYgKCFzKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJcHJpbnRmKCIlczogJXNcbiIsIGFyZ3ZbMF0sIHMpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKHMpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFstbyBPRlN8LWZdIHdpdGggbm8gcGFyYW1zICovCisJbiA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqczsKKwkJY2hhciBkZXZbTE9PUF9OQU1FU0laRV07CisKKwkJc3ByaW50ZihkZXYsIExPT1BfRk9STUFULCBuKTsKKwkJcyA9IHF1ZXJ5X2xvb3AoZGV2KTsKKwkJbisrOworCQlpZiAoIXMpIHsKKwkJCWlmIChuID4gOSAmJiBlcnJubyAmJiBlcnJubyAhPSBFTlhJTykKKwkJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQkJaWYgKG9wdCA9PSBPUFRfZikgeworCQkJCXB1dHMoZGV2KTsKKwkJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG9wdCAhPSBPUFRfZikKKwkJCQlwcmludGYoIiVzOiAlc1xuIiwgZGV2LCBzKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKHMpOworCQl9CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2xzcGNpLmMgYi91dGlsLWxpbnV4L2xzcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4NDg1OAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbHNwY2kuYwpAQCAtMCwwICsxLDExMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbHNwY2kgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIE1hbGVrIERlZ2FjaGkgPG1hbGVrLWRlZ2FjaGlAbGFwb3N0ZS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbHNwY2lfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbWtdIgorLy91c2FnZTojZGVmaW5lIGxzcGNpX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCBhbGwgUENJIGRldmljZXMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgktbQlQYXJzYWJsZSBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1rCVNob3cgZHJpdmVyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7CisJT1BUX20gPSAoMSA8PCAwKSwKKwlPUFRfayA9ICgxIDw8IDEpLAorfTsKKworLyoKKyAqIFBDSV9TTE9UX05BTUUgUENJX0NMQVNTOiBQQ0lfVklEOlBDSV9ESUQgW1BDSV9TVUJTWVNfVklEOlBDSV9TVUJTWVNfRElEXSBbRFJJVkVSXQorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlQWN0aW9uKAorCQljb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICp0b2tlbnNbM107CisJY2hhciAqcGNpX3Nsb3RfbmFtZSA9IE5VTEwsICpkcml2ZXIgPSBOVUxMOworCWludCBwY2lfY2xhc3MgPSAwLCBwY2lfdmlkID0gMCwgcGNpX2RpZCA9IDA7CisJaW50IHBjaV9zdWJzeXNfdmlkID0gMCwgcGNpX3N1YnN5c19kaWQgPSAwOworCisJY2hhciAqdWV2ZW50X2ZpbGVuYW1lID0gY29uY2F0X3BhdGhfZmlsZShmaWxlTmFtZSwgIi91ZXZlbnQiKTsKKwlwYXJzZXIgPSBjb25maWdfb3BlbjIodWV2ZW50X2ZpbGVuYW1lLCBmb3Blbl9mb3JfcmVhZCk7CisJZnJlZSh1ZXZlbnRfZmlsZW5hbWUpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCAzLCAyLCAiXDA6PSIsIFBBUlNFX05PUk1BTCkpIHsKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJEUklWRVIiKSA9PSAwKSB7CisJCQlkcml2ZXIgPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUENJX0NMQVNTIikgPT0gMCkgeworCQkJcGNpX2NsYXNzID0geHN0cnRvdSh0b2tlbnNbMV0sIDE2KT4+ODsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJQQ0lfSUQiKSA9PSAwKSB7CisJCQlwY2lfdmlkID0geHN0cnRvdSh0b2tlbnNbMV0sIDE2KTsKKwkJCXBjaV9kaWQgPSB4c3RydG91KHRva2Vuc1syXSwgMTYpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlBDSV9TVUJTWVNfSUQiKSA9PSAwKSB7CisJCQlwY2lfc3Vic3lzX3ZpZCA9IHhzdHJ0b3UodG9rZW5zWzFdLCAxNik7CisJCQlwY2lfc3Vic3lzX2RpZCA9IHhzdHJ0b3UodG9rZW5zWzJdLCAxNik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUENJX1NMT1RfTkFNRSIpID09IDApIHsKKwkJCXBjaV9zbG90X25hbWUgPSB4c3RyZHVwKHRva2Vuc1syXSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbSkgeworCQlwcmludGYoIiVzIFwiQ2xhc3MgJTA0eFwiIFwiJTA0eFwiIFwiJTA0eFwiIFwiJTA0eFwiIFwiJTA0eFwiIiwKKwkJICAgICAgIHBjaV9zbG90X25hbWUsIHBjaV9jbGFzcywgcGNpX3ZpZCwgcGNpX2RpZCwKKwkJICAgICAgIHBjaV9zdWJzeXNfdmlkLCBwY2lfc3Vic3lzX2RpZCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlcyBDbGFzcyAlMDR4OiAlMDR4OiUwNHgiLAorCQkgICAgICAgcGNpX3Nsb3RfbmFtZSwgcGNpX2NsYXNzLCBwY2lfdmlkLCBwY2lfZGlkKTsKKwl9CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfaykgJiYgZHJpdmVyKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX20pIHsKKwkJCXByaW50ZigiIFwiJXNcIiIsIGRyaXZlcik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiAlcyIsIGRyaXZlcik7CisJCX0KKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKworCWZyZWUoZHJpdmVyKTsKKwlmcmVlKHBjaV9zbG90X25hbWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBsc3BjaV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHNwY2lfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJtIiAvKm5vbi1jb21wYXQ6Ki8gImsiIC8qaWdub3JlZDoqLyAibnYiKTsKKworCXJlY3Vyc2l2ZV9hY3Rpb24oIi9zeXMvYnVzL3BjaS9kZXZpY2VzIiwKKwkJCUFDVElPTl9SRUNVUlNFLAorCQkJZmlsZUFjdGlvbiwKKwkJCU5VTEwsIC8qIGRpckFjdGlvbiAqLworCQkJTlVMTCwgLyogdXNlckRhdGEgKi8KKwkJCTAgLyogZGVwdGggKi8pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbHN1c2IuYyBiL3V0aWwtbGludXgvbHN1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDBmMjFlCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9sc3VzYi5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxzdXNiIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBNYWxlayBEZWdhY2hpIDxtYWxlay1kZWdhY2hpQGxhcG9zdGUubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxzdXNiX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBsc3VzYl9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlQWN0aW9uKAorCQljb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICp0b2tlbnNbNF07CisJY2hhciAqYnVzbnVtID0gTlVMTCwgKmRldm51bSA9IE5VTEw7CisJaW50IHByb2R1Y3RfdmlkID0gMCwgcHJvZHVjdF9kaWQgPSAwOworCWNoYXIgKnVldmVudF9maWxlbmFtZSA9IGNvbmNhdF9wYXRoX2ZpbGUoZmlsZU5hbWUsICIvdWV2ZW50Iik7CisKKwlwYXJzZXIgPSBjb25maWdfb3BlbjIodWV2ZW50X2ZpbGVuYW1lLCBmb3Blbl9mb3JfcmVhZCk7CisJZnJlZSh1ZXZlbnRfZmlsZW5hbWUpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCA0LCAyLCAiXFwvPSIsIFBBUlNFX05PUk1BTCkpIHsKKwkJaWYgKChwYXJzZXItPmxpbmVubyA9PSAxKSAmJiBzdHJjbXAodG9rZW5zWzBdLCAiREVWVFlQRSIpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJQUk9EVUNUIikgPT0gMCkgeworCQkJcHJvZHVjdF92aWQgPSB4c3RydG91KHRva2Vuc1sxXSwgMTYpOworCQkJcHJvZHVjdF9kaWQgPSB4c3RydG91KHRva2Vuc1syXSwgMTYpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIkJVU05VTSIpID09IDApIHsKKwkJCWJ1c251bSA9IHhzdHJkdXAodG9rZW5zWzFdKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJERVZOVU0iKSA9PSAwKSB7CisJCQlkZXZudW0gPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKworCWlmIChidXNudW0pIHsKKwkJcHJpbnRmKCJCdXMgJXMgRGV2aWNlICVzOiBJRCAlMDR4OiUwNHhcbiIsIGJ1c251bSwgZGV2bnVtLCBwcm9kdWN0X3ZpZCwgcHJvZHVjdF9kaWQpOworCQlmcmVlKGJ1c251bSk7CisJCWZyZWUoZGV2bnVtKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworaW50IGxzdXNiX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsc3VzYl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCS8qIG5vIG9wdGlvbnMsIG5vIGdldG9wdCAqLworCisJcmVjdXJzaXZlX2FjdGlvbigiL3N5cy9idXMvdXNiL2RldmljZXMiLAorCQkJQUNUSU9OX1JFQ1VSU0UsCisJCQlmaWxlQWN0aW9uLAorCQkJTlVMTCwgLyogZGlyQWN0aW9uICovCisJCQlOVUxMLCAvKiB1c2VyRGF0YSAqLworCQkJMCAvKiBkZXB0aCAqLyk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9tZGV2LmMgYi91dGlsLWxpbnV4L21kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE1MjdlCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9tZGV2LmMKQEAgLTAsMCArMSw2NTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1kZXYgLSBNaW5pIHVkZXYgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICogQ29weXJpZ2h0IDIwMDUgRnJhbmsgU29yZW5zb24gPGZyYW5rQHR1eHJvY2tzLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtZGV2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXNdIgorLy91c2FnZTojZGVmaW5lIG1kZXZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXMJU2NhbiAvc3lzIGFuZCBwb3B1bGF0ZSAvZGV2IGR1cmluZyBzeXN0ZW0gYm9vdFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIkl0IGNhbiBiZSBydW4gYnkga2VybmVsIGFzIGEgaG90cGx1ZyBoZWxwZXIuIFRvIGFjdGl2YXRlIGl0OlxuIgorLy91c2FnZTogICAgICAgIiBlY2hvIC9zYmluL21kZXYgPiAvcHJvYy9zeXMva2VybmVsL2hvdHBsdWdcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTURFVl9DT05GKAorLy91c2FnZTogICAgICAgIkl0IHVzZXMgL2V0Yy9tZGV2LmNvbmYgd2l0aCBsaW5lc1xuIgorLy91c2FnZTogICAgICAgIlstXURFVk5BTUUgVUlEOkdJRCBQRVJNIgorLy91c2FnZToJCQlJRl9GRUFUVVJFX01ERVZfUkVOQU1FKCIgWz58PVBBVEhdIikKKy8vdXNhZ2U6CQkJSUZfRkVBVFVSRV9NREVWX0VYRUMoIiBbQHwkfCpQUk9HXSIpCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1kZXZfbm90ZXNfdXNhZ2UgIiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTURFVl9DT05GSUcoCisvL3VzYWdlOiAgICAgICAiVGhlIG1kZXYgY29uZmlnIGZpbGUgY29udGFpbnMgbGluZXMgdGhhdCBsb29rIGxpa2U6XG4iCisvL3VzYWdlOiAgICAgICAiICBoZFthLXpdWzAtOV0qIDA6MyA2NjBcblxuIgorLy91c2FnZTogICAgICAgIlRoYXQncyBkZXZpY2UgbmFtZSAod2l0aCByZWdleCBtYXRjaCksIHVpZDpnaWQsIGFuZCBwZXJtaXNzaW9ucy5cblxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9NREVWX0VYRUMoCisvL3VzYWdlOiAgICAgICAiT3B0aW9uYWxseSwgdGhhdCBjYW4gYmUgZm9sbG93ZWQgKG9uIHRoZSBzYW1lIGxpbmUpIGJ5IGEgc3BlY2lhbCBjaGFyYWN0ZXJcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgYSBjb21tYW5kIGxpbmUgdG8gcnVuIGFmdGVyIGNyZWF0aW5nL2JlZm9yZSBkZWxldGluZyB0aGUgY29ycmVzcG9uZGluZ1xuIgorLy91c2FnZTogICAgICAgImRldmljZShzKS4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICRNREVWIGluZGljYXRlcyB0aGUgYWN0aXZlIGRldmljZSBub2RlXG4iCisvL3VzYWdlOiAgICAgICAiKHdoaWNoIGlzIHVzZWZ1bCBpZiBpdCdzIGEgcmVnZXggbWF0Y2gpLiBGb3IgZXhhbXBsZTpcblxuIgorLy91c2FnZTogICAgICAgIiAgaGRjIHJvb3Q6Y2Ryb20gNjYwICAqbG4gLXMgJE1ERVYgY2Ryb21cblxuIgorLy91c2FnZTogICAgICAgIlRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIEAgKHJ1biBhZnRlciBjcmVhdGluZyksICQgKHJ1biBiZWZvcmUgZGVsZXRpbmcpLFxuIgorLy91c2FnZTogICAgICAgImFuZCAqIChydW4gYm90aCBhZnRlciBjcmVhdGluZyBhbmQgYmVmb3JlIGRlbGV0aW5nKS4gVGhlIGNvbW1hbmRzIHJ1biBpblxuIgorLy91c2FnZTogICAgICAgInRoZSAvZGV2IGRpcmVjdG9yeSwgYW5kIHVzZSBzeXN0ZW0oKSB3aGljaCBjYWxscyAvYmluL3NoLlxuXG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgICAiQ29uZmlnIGZpbGUgcGFyc2luZyBzdG9wcyBvbiB0aGUgZmlyc3QgbWF0Y2hpbmcgbGluZS4gSWYgbm8gY29uZmlnXG4iCisvL3VzYWdlOiAgICAgICAiZW50cnkgaXMgbWF0Y2hlZCwgZGV2aWNlcyBhcmUgY3JlYXRlZCB3aXRoIGRlZmF1bHQgMDowIDY2MC4gKE1ha2VcbiIKKy8vdXNhZ2U6ICAgICAgICJ0aGUgbGFzdCBsaW5lIG1hdGNoIC4qIHRvIG92ZXJyaWRlIHRoaXMuKVxuXG4iCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorCisvKiAibWRldiAtcyIgc2NhbnMgL3N5cy9jbGFzcy94eHgsIGxvb2tpbmcgZm9yIGRpcmVjdG9yaWVzIHdoaWNoIGhhdmUgZGV2CisgKiBmaWxlIChpdCBpcyBvZiB0aGUgZm9ybSAiTTptXG4iKS4gRXhhbXBsZTogL3N5cy9jbGFzcy90dHkvdHR5MC9kZXYKKyAqIGNvbnRhaW5zICI0OjBcbiIuIERpcmVjdG9yeSBuYW1lIGlzIHRha2VuIGFzIGRldmljZSBuYW1lLCBwYXRoIGNvbXBvbmVudAorICogZGlyZWN0bHkgYWZ0ZXIgL3N5cy9jbGFzcy8gYXMgc3Vic3lzdGVtLiBJbiB0aGlzIGV4YW1wbGUsICJ0dHkwIiBhbmQgInR0eSIuCisgKiBUaGVuIG1kZXYgY3JlYXRlcyB0aGUgL2Rldi9kZXZpY2VfbmFtZSBub2RlLgorICogSWYgL3N5cy9jbGFzcy8uLi4vZGV2IGZpbGUgZG9lcyBub3QgZXhpc3QsIG1kZXYgc3RpbGwgbWF5IGFjdAorICogb24gdGhpcyBkZXZpY2U6IHNlZSAiQHwkfCpjb21tYW5kIGFyZ3MuLi4iIHBhcmFtZXRlciBpbiBjb25maWcgZmlsZS4KKyAqCisgKiBtZGV2IHcvbyBwYXJhbWV0ZXJzIGlzIGNhbGxlZCBhcyBob3RwbHVnIGhlbHBlci4gSXQgdGFrZXMgZGV2aWNlCisgKiBhbmQgc3Vic3lzdGVtIG5hbWVzIGZyb20gJERFVlBBVEggYW5kICRTVUJTWVNURU0sIGV4dHJhY3RzCisgKiBtYWosbWluIGZyb20gIi9zeXMvJERFVlBBVEgvZGV2IiBhbmQgYWxzbyBleGFtaW5lcworICogJEFDVElPTiAoImFkZCIvImRlbGV0ZSIpIGFuZCAkRklSTVdBUkUuCisgKgorICogSWYgYWN0aW9uIGlzICJhZGQiLCBtZGV2IGNyZWF0ZXMgL2Rldi9kZXZpY2VfbmFtZSBzaW1pbGFybHkgdG8gbWRldiAtcy4KKyAqICh0b2RvOiBleHBsYWluICJkZWxldGUiIGFuZCAkRklSTVdBUkUpCisgKgorICogSWYgL2V0Yy9tZGV2LmNvbmYgZXhpc3RzLCBpdCBtYXkgbW9kaWZ5IC9kZXYvZGV2aWNlX25hbWUncyBwcm9wZXJ0aWVzLgorICogL2V0Yy9tZGV2LmNvbmYgZmlsZSBmb3JtYXQ6CisgKgorICogWy1dW3N1YnN5c3RlbS9dZGV2aWNlICB1c2VyOmdycCAgbW9kZSAgWz58PXBhdGhdIFtAfCR8KmNvbW1hbmQgYXJncy4uLl0KKyAqIFstXUBtYWosbWluWy1taW4yXSAgICAgdXNlcjpncnAgIG1vZGUgIFs+fD1wYXRoXSBbQHwkfCpjb21tYW5kIGFyZ3MuLi5dCisgKiBbLV0kZW52dmFyPXZhbCAgICAgICAgIHVzZXI6Z3JwICBtb2RlICBbPnw9cGF0aF0gW0B8JHwqY29tbWFuZCBhcmdzLi4uXQorICoKKyAqIExlYWRpbmcgbWludXMgaW4gMXN0IGZpZWxkIG1lYW5zICJkb24ndCBzdG9wIG9uIHRoaXMgbGluZSIsIG90aGVyd2lzZQorICogc2VhcmNoIGlzIHN0b3BwZWQgYWZ0ZXIgdGhlIG1hdGNoaW5nIGxpbmUgaXMgZW5jb3VudGVyZWQuCisgKgorICogVGhlIGRldmljZSBuYW1lIG9yICJzdWJzeXN0ZW0vZGV2aWNlIiBjb21ibyBpcyBtYXRjaGVkIGFnYWluc3QgMXN0IGZpZWxkCisgKiAod2hpY2ggaXMgYSByZWdleCksIG9yIG1haixtaW4gaXMgbWF0Y2hlZCBhZ2FpbnN0IDFzdCBmaWVsZCwKKyAqIG9yIHNwZWNpZmllZCBlbnZpcm9ubWVudCB2YXJpYWJsZSAoYXMgcmVnZXgpIGlzIG1hdGNoZWQgYWdhaW5zdCAxc3QgZmllbGQuCisgKgorICogJGVudnZhcj12YWwgZm9ybWF0IGlzIHVzZWZ1bCBmb3IgbG9hZGluZyBtb2R1bGVzIGZvciBob3QtcGx1Z2dlZCBkZXZpY2VzCisgKiB3aGljaCBkbyBub3QgaGF2ZSBkcml2ZXIgbG9hZGVkIHlldC4gSW4gdGhpcyBjYXNlIC9zeXMvY2xhc3MvLi4uL2RldgorICogZG9lcyBub3QgZXhpc3QsIGJ1dCAkTU9EQUxJQVMgaXMgc2V0IHRvIG5lZWRlZCBtb2R1bGUncyBuYW1lCisgKiAoYWN0dWFsbHksIGFuIGFsaWFzIHRvIGl0KSBieSBrZXJuZWwuIFRoaXMgcnVsZSBpbnN0cnVjdHMgbWRldgorICogdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBleGl0OgorICogICAgJE1PREFMSUFTPS4qIDA6MCA2NjAgQG1vZHByb2JlICIkTU9EQUxJQVMiCisgKiBUaGUga2VybmVsIHdpbGwgZ2VuZXJhdGUgYW5vdGhlciBob3RwbHVnIGV2ZW50IHdoZW4gL3N5cy9jbGFzcy8uLi4vZGV2CisgKiBmaWxlIGFwcGVhcnMuCisgKgorICogV2hlbiBsaW5lIG1hdGNoZXMsIHRoZSBkZXZpY2Ugbm9kZSBpcyBjcmVhdGVkLCBjaG1vZCdlZCBhbmQgY2hvd24nZWQsCisgKiBtb3ZlZCB0byBwYXRoLCBhbmQgaWYgPnBhdGgsIGEgc3ltbGluayB0byBtb3ZlZCBub2RlIGlzIGNyZWF0ZWQsCisgKiBhbGwgdGhpcyBpZiAvc3lzL2NsYXNzLy4uLi9kZXYgZXhpc3RzLgorICogICAgRXhhbXBsZXM6CisgKiAgICA9bG9vcC8gICAgICAtIG1vdmVzIHRvIC9kZXYvbG9vcAorICogICAgPmRpc2svc2RhJTEgLSBtb3ZlcyB0byAvZGV2L2Rpc2svc2RhTiwgbWFrZXMgL2Rldi9zZGFOIGEgc3ltbGluaworICoKKyAqIFRoZW4gImNvbW1hbmQgYXJncy4uLiIgaXMgZXhlY3V0ZWQgKHZpYSBzaCAtYyAnY29tbWFuZCBhcmdzLi4uJykuCisgKiBAOmV4ZWN1dGUgb24gY3JlYXRpb24sICQ6b24gZGVsZXRpb24sICo6b24gYm90aC4KKyAqIFRoaXMgaGFwcGVucyByZWdhcmRsZXNzIG9mIC9zeXMvY2xhc3MvLi4uL2RldiBleGlzdGVuY2UuCisgKi8KKworc3RydWN0IGdsb2JhbHMgeworCWludCByb290X21ham9yLCByb290X21pbm9yOworCWNoYXIgKnN1YnN5c3RlbTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisKKy8qIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gL3N5cyBzeW1saW5rcyAqLworI2RlZmluZSBNQVhfU1lTRlNfREVQVEggMworCisvKiBXZSB1c2UgYWRkaXRpb25hbCA2NCsgYnl0ZXMgaW4gbWFrZV9kZXZpY2UoKSAqLworI2RlZmluZSBTQ1JBVENIX1NJWkUgODAKKworLyogQnVpbGRzIGFuIGFsaWFzIHBhdGguCisgKiBUaGlzIGZ1bmN0aW9uIHBvdGVudGlvbmFsbHkgcmVhbGxvY2F0ZXMgdGhlIGFsaWFzIHBhcmFtZXRlci4KKyAqIE9ubHkgdXNlZCBmb3IgRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUKKyAqLworc3RhdGljIGNoYXIgKmJ1aWxkX2FsaWFzKGNoYXIgKmFsaWFzLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKK3sKKwljaGFyICpkZXN0OworCisJLyogIj5iYXIvIjogcmVuYW1lIHRvIGJhci9kZXZpY2VfbmFtZSAqLworCS8qICI+YmFyWy9dYmF6IjogcmVuYW1lIHRvIGJhclsvXWJheiAqLworCWRlc3QgPSBzdHJyY2hyKGFsaWFzLCAnLycpOworCWlmIChkZXN0KSB7IC8qICI+YmFyL1tiYXpdIiA/ICovCisJCSpkZXN0ID0gJ1wwJzsgLyogbWtkaXIgYmFyICovCisJCWJiX21ha2VfZGlyZWN0b3J5KGFsaWFzLCAwNzU1LCBGSUxFVVRJTFNfUkVDVVIpOworCQkqZGVzdCA9ICcvJzsKKwkJaWYgKGRlc3RbMV0gPT0gJ1wwJykgeyAvKiAiPmJhci8iID0+ICI+YmFyL2RldmljZV9uYW1lIiAqLworCQkJZGVzdCA9IGFsaWFzOworCQkJYWxpYXMgPSBjb25jYXRfcGF0aF9maWxlKGFsaWFzLCBkZXZpY2VfbmFtZSk7CisJCQlmcmVlKGRlc3QpOworCQl9CisJfQorCisJcmV0dXJuIGFsaWFzOworfQorCisvKiBta25vZCBpbiAvZGV2IGJhc2VkIG9uIGEgcGF0aCBsaWtlICIvc3lzL2Jsb2NrL2hkYS9oZGExIgorICogTkIxOiBwYXRoIHBhcmFtZXRlciBuZWVkcyB0byBoYXZlIFNDUkFUQ0hfU0laRSBzY3JhdGNoIGJ5dGVzCisgKiBhZnRlciBOVUwsIGJ1dCB3ZSBwcm9taXNlIHRvIG5vdCBtYW5nbGUgKElPVzogdG8gcmVzdG9yZSBpZiBuZWVkZWQpCisgKiBwYXRoIHN0cmluZy4KKyAqIE5CMjogIm1kZXYgLXMiIG1heSBjYWxsIHVzIG1hbnkgdGltZXMsIGRvIG5vdCBsZWFrIG1lbW9yeS9mZHMhCisgKi8KK3N0YXRpYyB2b2lkIG1ha2VfZGV2aWNlKGNoYXIgKnBhdGgsIGludCBkZWxldGUpCit7CisJY2hhciAqZGV2aWNlX25hbWUsICpzdWJzeXN0ZW1fc2xhc2hfZGV2bmFtZTsKKwlpbnQgbWFqb3IsIG1pbm9yLCB0eXBlLCBsZW47CisJbW9kZV90IG1vZGU7CisJcGFyc2VyX3QgKnBhcnNlcjsKKworCS8qIFRyeSB0byByZWFkIG1ham9yL21pbm9yIHN0cmluZy4gIE5vdGUgdGhhdCB0aGUga2VybmVsIHB1dHMgXG4gYWZ0ZXIKKwkgKiB0aGUgZGF0YSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBudWxsIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcKKwkgKiBiZWNhdXNlIHNzY2FuZigpIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3Qgbm9uZGlnaXQsIHdoaWNoIFxuIGlzLgorCSAqIFdlIGFsc28gZGVwZW5kIG9uIHBhdGggaGF2aW5nIHdyaXRlYWJsZSBzcGFjZSBhZnRlciBpdC4KKwkgKi8KKwltYWpvciA9IC0xOworCWlmICghZGVsZXRlKSB7CisJCWNoYXIgKmRldl9tYWpfbWluID0gcGF0aCArIHN0cmxlbihwYXRoKTsKKworCQlzdHJjcHkoZGV2X21hal9taW4sICIvZGV2Iik7CisJCWxlbiA9IG9wZW5fcmVhZF9jbG9zZShwYXRoLCBkZXZfbWFqX21pbiArIDEsIDY0KTsKKwkJKmRldl9tYWpfbWluID0gJ1wwJzsKKwkJaWYgKGxlbiA8IDEpIHsKKwkJCWlmICghRU5BQkxFX0ZFQVRVUkVfTURFVl9FWEVDKQorCQkJCXJldHVybjsKKwkJCS8qIG5vICJkZXYiIGZpbGUsIGJ1dCB3ZSBjYW4gc3RpbGwgcnVuIHNjcmlwdHMKKwkJCSAqIGJhc2VkIG9uIGRldmljZSBuYW1lICovCisJCX0gZWxzZSBpZiAoc3NjYW5mKCsrZGV2X21hal9taW4sICIldToldSIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7CisJCQltYWpvciA9IC0xOworCQl9CisJfQorCS8qIGVsc2U6IGZvciBkZWxldGUsIC0xIHN0aWxsIGRlbGV0ZXMgdGhlIG5vZGUsIGJ1dCA8IC0xIHN1cHByZXNzZXMgdGhhdCAqLworCisJLyogRGV0ZXJtaW5lIGRldmljZSBuYW1lLCB0eXBlLCBtYWpvciBhbmQgbWlub3IgKi8KKwlkZXZpY2VfbmFtZSA9IChjaGFyKikgYmJfYmFzZW5hbWUocGF0aCk7CisJLyogaHR0cDovL2tlcm5lbC5vcmcvZG9jL3BlbmRpbmcvaG90cGx1Zy50eHQgc2F5cyB0aGF0IG9ubHkKKwkgKiAiL3N5cy9ibG9jay8uLi4iIGlzIGZvciBibG9jayBkZXZpY2VzLiAiL3N5cy9idXMiIGV0YyBpcyBub3QuCisJICogQnV0IHNpbmNlIDIuNi4yNSBibG9jayBkZXZpY2VzIGFyZSBhbHNvIGluIC9zeXMvY2xhc3MvYmxvY2suCisJICogV2UgdXNlIHN0cnN0cigiL2Jsb2NrLyIpIHRvIGZvcmVzdGFsbCBmdXR1cmUgc3VycHJpc2VzLiAqLworCXR5cGUgPSBTX0lGQ0hSOworCWlmIChzdHJzdHIocGF0aCwgIi9ibG9jay8iKSB8fCAoRy5zdWJzeXN0ZW0gJiYgc3RybmNtcChHLnN1YnN5c3RlbSwgImJsb2NrIiwgNSkgPT0gMCkpCisJCXR5cGUgPSBTX0lGQkxLOworCisJLyogTWFrZSBwYXRoIHBvaW50IHRvICJzdWJzeXN0ZW0vZGV2aWNlX25hbWUiICovCisJc3Vic3lzdGVtX3NsYXNoX2Rldm5hbWUgPSBOVUxMOworCS8qIENoZWNrIGZvciBjb2xkcGx1ZyBpbnZvY2F0aW9ucyBmaXJzdCAqLworCWlmIChzdHJuY21wKHBhdGgsICIvc3lzL2Jsb2NrLyIsIDExKSA9PSAwKSAvKiBsZWdhY3kgY2FzZSAqLworCQlwYXRoICs9IHNpemVvZigiL3N5cy8iKSAtIDE7CisJZWxzZSBpZiAoc3RybmNtcChwYXRoLCAiL3N5cy9jbGFzcy8iLCAxMSkgPT0gMCkKKwkJcGF0aCArPSBzaXplb2YoIi9zeXMvY2xhc3MvIikgLSAxOworCWVsc2UgeworCQkvKiBFeGFtcGxlIG9mIGEgaG90cGx1ZyBpbnZvY2F0aW9uOgorCQkgKiBTVUJTWVNURU09ImJsb2NrIgorCQkgKiBERVZQQVRIPSIvc3lzIiArICIvZGV2aWNlcy92aXJ0dWFsL210ZC9tdGQzL210ZGJsb2NrMyIKKwkJICogKCIvc3lzIiBpcyBhZGRlZCBieSBtZGV2X21haW4pCisJCSAqIC0gcGF0aCBkb2VzIG5vdCBjb250YWluIHN1YnN5c3RlbQorCQkgKi8KKwkJc3Vic3lzdGVtX3NsYXNoX2Rldm5hbWUgPSBjb25jYXRfcGF0aF9maWxlKEcuc3Vic3lzdGVtLCBkZXZpY2VfbmFtZSk7CisJCXBhdGggPSBzdWJzeXN0ZW1fc2xhc2hfZGV2bmFtZTsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGNvbmZpZyBmaWxlLCBsb29rIHVwIHVzZXIgc2V0dGluZ3MgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9DT05GKQorCQlwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9ldGMvbWRldi5jb25mIiwgZm9wZW5fZm9yX3JlYWQpOworCisJZG8geworCQlpbnQga2VlcF9tYXRjaGluZzsKKwkJc3RydWN0IGJiX3VpZGdpZF90IHVnaWQ7CisJCWNoYXIgKnRva2Vuc1s0XTsKKwkJY2hhciAqY29tbWFuZCA9IE5VTEw7CisJCWNoYXIgKmFsaWFzID0gTlVMTDsKKwkJY2hhciBhbGlhc2xpbmsgPSBhbGlhc2xpbms7IC8qIGZvciBjb21waWxlciAqLworCisJCS8qIERlZmF1bHRzIGluIGNhc2Ugd2Ugd29uJ3QgbWF0Y2ggYW55IGxpbmUgKi8KKwkJdWdpZC51aWQgPSB1Z2lkLmdpZCA9IDA7CisJCWtlZXBfbWF0Y2hpbmcgPSAwOworCQltb2RlID0gMDY2MDsKKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9DT05GCisJCSAmJiBjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgNCwgMywgIiMgXHQiLCBQQVJTRV9OT1JNQUwpCisJCSkgeworCQkJY2hhciAqdmFsOworCQkJY2hhciAqc3RyX3RvX21hdGNoOworCQkJcmVnbWF0Y2hfdCBvZmZbMSArIDkgKiBFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFBdOworCisJCQl2YWwgPSB0b2tlbnNbMF07CisJCQlrZWVwX21hdGNoaW5nID0gKCctJyA9PSB2YWxbMF0pOworCQkJdmFsICs9IGtlZXBfbWF0Y2hpbmc7IC8qIHN3YWxsb3cgbGVhZGluZyBkYXNoICovCisKKwkJCS8qIE1hdGNoIGFnYWluc3QgZWl0aGVyICJzdWJzeXN0ZW0vZGV2aWNlX25hbWUiCisJCQkgKiBvciAiZGV2aWNlX25hbWUiIGFsb25lICovCisJCQlzdHJfdG9fbWF0Y2ggPSBzdHJjaHIodmFsLCAnLycpID8gcGF0aCA6IGRldmljZV9uYW1lOworCisJCQkvKiBGaWVsZHM6IHJlZ2V4IHVpZDpnaWQgbW9kZSBbYWxpYXNdIFtjbWRdICovCisKKwkJCWlmICh2YWxbMF0gPT0gJ0AnKSB7CisJCQkJLyogQG1ham9yLG1pbm9yWy1taW5vcjJdICovCisJCQkJLyogKHVzZWZ1bCB3aGVuIG5hbWUgaXMgYW1iaWd1b3VzOgorCQkJCSAqICIvc3lzL2NsYXNzL3VzYi9scDAiIGFuZAorCQkJCSAqICIvc3lzL2NsYXNzL3ByaW50ZXIvbHAwIikgKi8KKwkJCQlpbnQgY21haiwgY21pbjAsIGNtaW4xLCBzYzsKKwkJCQlpZiAobWFqb3IgPCAwKQorCQkJCQljb250aW51ZTsgLyogbm8gZGV2LCBubyBtYXRjaCAqLworCQkJCXNjID0gc3NjYW5mKHZhbCwgIkAldSwldS0ldSIsICZjbWFqLCAmY21pbjAsICZjbWluMSk7CisJCQkJaWYgKHNjIDwgMQorCQkJCSB8fCBtYWpvciAhPSBjbWFqCisJCQkJIHx8IChzYyA9PSAyICYmIG1pbm9yICE9IGNtaW4wKQorCQkJCSB8fCAoc2MgPT0gMyAmJiAobWlub3IgPCBjbWluMCB8fCBtaW5vciA+IGNtaW4xKSkKKwkJCQkpIHsKKwkJCQkJY29udGludWU7IC8qIHRoaXMgbGluZSBkb2Vzbid0IG1hdGNoICovCisJCQkJfQorCQkJCWdvdG8gbGluZV9tYXRjaGVzOworCQkJfQorCQkJaWYgKHZhbFswXSA9PSAnJCcpIHsKKwkJCQkvKiByZWdleCB0byBtYXRjaCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworCQkJCWNoYXIgKmVxID0gc3RyY2hyKCsrdmFsLCAnPScpOworCQkJCWlmICghZXEpCisJCQkJCWNvbnRpbnVlOworCQkJCSplcSA9ICdcMCc7CisJCQkJc3RyX3RvX21hdGNoID0gZ2V0ZW52KHZhbCk7CisJCQkJaWYgKCFzdHJfdG9fbWF0Y2gpCisJCQkJCWNvbnRpbnVlOworCQkJCXN0cl90b19tYXRjaCAtPSBzdHJsZW4odmFsKSArIDE7CisJCQkJKmVxID0gJz0nOworCQkJfQorCQkJLyogZWxzZTogcmVnZXggdG8gbWF0Y2ggW3N1YnN5c3RlbS9dZGV2aWNlX25hbWUgKi8KKworCQkJeworCQkJCXJlZ2V4X3QgbWF0Y2g7CisJCQkJaW50IHJlc3VsdDsKKworCQkJCXhyZWdjb21wKCZtYXRjaCwgdmFsLCBSRUdfRVhURU5ERUQpOworCQkJCXJlc3VsdCA9IHJlZ2V4ZWMoJm1hdGNoLCBzdHJfdG9fbWF0Y2gsIEFSUkFZX1NJWkUob2ZmKSwgb2ZmLCAwKTsKKwkJCQlyZWdmcmVlKCZtYXRjaCk7CisJCQkJLy9iYl9lcnJvcl9tc2coIm1hdGNoZXM6Iik7CisJCQkJLy9mb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkUob2ZmKTsgaSsrKSB7CisJCQkJLy8JaWYgKG9mZltpXS5ybV9zbyA8IDApIGNvbnRpbnVlOworCQkJCS8vCWJiX2Vycm9yX21zZygibWF0Y2ggJWQ6ICclLipzJ1xuIiwgaSwKKwkJCQkvLwkJKGludCkob2ZmW2ldLnJtX2VvIC0gb2ZmW2ldLnJtX3NvKSwKKwkJCQkvLwkJZGV2aWNlX25hbWUgKyBvZmZbaV0ucm1fc28pOworCQkJCS8vfQorCisJCQkJLyogSWYgbm8gbWF0Y2gsIHNraXAgcmVzdCBvZiBsaW5lICovCisJCQkJLyogKHJlZ2V4ZWMgcmV0dXJucyB3aG9sZSBwYXR0ZXJuIGFzICJyYW5nZSIgMCkgKi8KKwkJCQlpZiAocmVzdWx0CisJCQkJIHx8IG9mZlswXS5ybV9zbworCQkJCSB8fCAoKGludClvZmZbMF0ucm1fZW8gIT0gKGludClzdHJsZW4oc3RyX3RvX21hdGNoKSkKKwkJCQkpIHsKKwkJCQkJY29udGludWU7IC8qIHRoaXMgbGluZSBkb2Vzbid0IG1hdGNoICovCisJCQkJfQorCQkJfQorIGxpbmVfbWF0Y2hlczoKKwkJCS8qIFRoaXMgbGluZSBtYXRjaGVzLiBTdG9wIHBhcnNpbmcgYWZ0ZXIgcGFyc2luZworCQkJICogdGhlIHJlc3QgdGhlIGxpbmUgdW5sZXNzIGtlZXBfbWF0Y2hpbmcgPT0gMSAqLworCisJCQkvKiAybmQgZmllbGQ6IHVpZDpnaWQgLSBkZXZpY2Ugb3duZXJzaGlwICovCisJCQlpZiAoZ2V0X3VpZGdpZCgmdWdpZCwgdG9rZW5zWzFdLCAvKmFsbG93X251bWVyaWM6Ki8gMSkgPT0gMCkKKwkJCQliYl9lcnJvcl9tc2coInVua25vd24gdXNlci9ncm91cCAlcyBvbiBsaW5lICVkIiwgdG9rZW5zWzFdLCBwYXJzZXItPmxpbmVubyk7CisKKwkJCS8qIDNyZCBmaWVsZDogbW9kZSAtIGRldmljZSBwZXJtaXNzaW9ucyAqLworCQkJYmJfcGFyc2VfbW9kZSh0b2tlbnNbMl0sICZtb2RlKTsKKworCQkJdmFsID0gdG9rZW5zWzNdOworCQkJLyogNHRoIGZpZWxkIChvcHQpOiAiPnw9YWxpYXMiIG9yICIhIiB0byBub3QgY3JlYXRlIHRoZSBub2RlICovCisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRSAmJiB2YWwpIHsKKwkJCQljaGFyICphLCAqcywgKnN0OworCisJCQkJYSA9IHZhbDsKKwkJCQlzID0gc3RyY2hybnVsKHZhbCwgJyAnKTsKKwkJCQlzdCA9IHN0cmNocm51bCh2YWwsICdcdCcpOworCQkJCWlmIChzdCA8IHMpCisJCQkJCXMgPSBzdDsKKwkJCQlzdCA9IChzWzBdICYmIHNbMV0pID8gcysxIDogTlVMTDsKKworCQkJCWFsaWFzbGluayA9IGFbMF07CisJCQkJaWYgKGFsaWFzbGluayA9PSAnIScgJiYgcyA9PSBhKzEpIHsKKwkJCQkJdmFsID0gc3Q7CisJCQkJCS8qICIhIjogc3VwcHJlc3Mgbm9kZSBjcmVhdGlvbi9kZWxldGlvbiAqLworCQkJCQltYWpvciA9IC0yOworCQkJCX0KKwkJCQllbHNlIGlmIChhbGlhc2xpbmsgPT0gJz4nIHx8IGFsaWFzbGluayA9PSAnPScpIHsKKwkJCQkJdmFsID0gc3Q7CisJCQkJCXNbMF0gPSAnXDAnOworCQkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQKSB7CisJCQkJCQljaGFyICpwOworCQkJCQkJdW5zaWduZWQgaSwgbjsKKworCQkJCQkJLyogc3Vic3RpdHV0ZSAlMS4uOSB3aXRoIG9mZlsxLi45XSwgaWYgYW55ICovCisJCQkJCQluID0gMDsKKwkJCQkJCXMgPSBhOworCQkJCQkJd2hpbGUgKCpzKQorCQkJCQkJCWlmICgqcysrID09ICclJykKKwkJCQkJCQkJbisrOworCisJCQkJCQlwID0gYWxpYXMgPSB4emFsbG9jKHN0cmxlbihhKSArIG4gKiBzdHJsZW4oc3RyX3RvX21hdGNoKSk7CisJCQkJCQlzID0gYSArIDE7CisJCQkJCQl3aGlsZSAoKnMpIHsKKwkJCQkJCQkqcCA9ICpzOworCQkJCQkJCWlmICgnJScgPT0gKnMpIHsKKwkJCQkJCQkJaSA9IChzWzFdIC0gJzAnKTsKKwkJCQkJCQkJaWYgKGkgPD0gOSAmJiBvZmZbaV0ucm1fc28gPj0gMCkgeworCQkJCQkJCQkJbiA9IG9mZltpXS5ybV9lbyAtIG9mZltpXS5ybV9zbzsKKwkJCQkJCQkJCXN0cm5jcHkocCwgc3RyX3RvX21hdGNoICsgb2ZmW2ldLnJtX3NvLCBuKTsKKwkJCQkJCQkJCXAgKz0gbiAtIDE7CisJCQkJCQkJCQlzKys7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJcCsrOworCQkJCQkJCXMrKzsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWFsaWFzID0geHN0cmR1cChhICsgMSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0VYRUMgJiYgdmFsKSB7CisJCQkJY29uc3QgY2hhciAqcyA9ICIkQCoiOworCQkJCWNvbnN0IGNoYXIgKnMyID0gc3RyY2hyKHMsIHZhbFswXSk7CisKKwkJCQlpZiAoIXMyKSB7CisJCQkJCWJiX2Vycm9yX21zZygiYmFkIGxpbmUgJXUiLCBwYXJzZXItPmxpbmVubyk7CisJCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRSkKKwkJCQkJCWZyZWUoYWxpYXMpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiBBcmUgd2UgcnVubmluZyB0aGlzIGNvbW1hbmQgbm93PworCQkJCSAqIFJ1biAkY21kIG9uIGRlbGV0ZSwgQGNtZCBvbiBjcmVhdGUsICpjbWQgb24gYm90aAorCQkJCSAqLworCQkJCWlmIChzMiAtIHMgIT0gZGVsZXRlKSB7CisJCQkJCS8qIFdlIGFyZSBoZXJlIGlmOiAnKicsCisJCQkJCSAqIG9yOiAnQCcgYW5kIGRlbGV0ZSA9IDAsCisJCQkJCSAqIG9yOiAnJCcgYW5kIGRlbGV0ZSA9IDEKKwkJCQkJICovCisJCQkJCWNvbW1hbmQgPSB4c3RyZHVwKHZhbCArIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIEVuZCBvZiBmaWVsZCBwYXJzaW5nICovCisKKwkJLyogIkV4ZWN1dGUiIHRoZSBsaW5lIHdlIGZvdW5kICovCisJCXsKKwkJCWNvbnN0IGNoYXIgKm5vZGVfbmFtZTsKKworCQkJbm9kZV9uYW1lID0gZGV2aWNlX25hbWU7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUgJiYgYWxpYXMpCisJCQkJbm9kZV9uYW1lID0gYWxpYXMgPSBidWlsZF9hbGlhcyhhbGlhcywgZGV2aWNlX25hbWUpOworCisJCQlpZiAoIWRlbGV0ZSAmJiBtYWpvciA+PSAwKSB7CisJCQkJaWYgKG1rbm9kKG5vZGVfbmFtZSwgbW9kZSB8IHR5cGUsIG1ha2VkZXYobWFqb3IsIG1pbm9yKSkgJiYgZXJybm8gIT0gRUVYSVNUKQorCQkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIG5vZGVfbmFtZSk7CisJCQkJaWYgKG1ham9yID09IEcucm9vdF9tYWpvciAmJiBtaW5vciA9PSBHLnJvb3RfbWlub3IpCisJCQkJCXN5bWxpbmsobm9kZV9uYW1lLCAicm9vdCIpOworCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0NPTkYpIHsKKwkJCQkJY2htb2Qobm9kZV9uYW1lLCBtb2RlKTsKKwkJCQkJY2hvd24obm9kZV9uYW1lLCB1Z2lkLnVpZCwgdWdpZC5naWQpOworCQkJCX0KKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUgJiYgYWxpYXMpIHsKKwkJCQkJaWYgKGFsaWFzbGluayA9PSAnPicpCisJCQkJCQlzeW1saW5rKG5vZGVfbmFtZSwgZGV2aWNlX25hbWUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfRVhFQyAmJiBjb21tYW5kKSB7CisJCQkJLyogc2V0ZW52IHdpbGwgbGVhayBtZW1vcnksIHVzZSBwdXRlbnYvdW5zZXRlbnYvZnJlZSAqLworCQkJCWNoYXIgKnMgPSB4YXNwcmludGYoIiVzPSVzIiwgIk1ERVYiLCBub2RlX25hbWUpOworCQkJCWNoYXIgKnMxID0geGFzcHJpbnRmKCIlcz0lcyIsICJTVUJTWVNURU0iLCBHLnN1YnN5c3RlbSk7CisJCQkJcHV0ZW52KHMpOworCQkJCXB1dGVudihzMSk7CisJCQkJaWYgKHN5c3RlbShjb21tYW5kKSA9PSAtMSkKKwkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcnVuICclcyciLCBjb21tYW5kKTsKKwkJCQliYl91bnNldGVudl9hbmRfZnJlZShzMSk7CisJCQkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUocyk7CisJCQkJZnJlZShjb21tYW5kKTsKKwkJCX0KKworCQkJaWYgKGRlbGV0ZSAmJiBtYWpvciA+PSAtMSkgeworCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRSAmJiBhbGlhcykgeworCQkJCQlpZiAoYWxpYXNsaW5rID09ICc+JykKKwkJCQkJCXVubGluayhkZXZpY2VfbmFtZSk7CisJCQkJfQorCQkJCXVubGluayhub2RlX25hbWUpOworCQkJfQorCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUpCisJCQkJZnJlZShhbGlhcyk7CisJCX0KKworCQkvKiBXZSBmb3VuZCBtYXRjaGluZyBsaW5lLgorCQkgKiBTdG9wIHVubGVzcyBpdCB3YXMgcHJlZml4ZWQgd2l0aCAnLScgKi8KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORiAmJiAha2VlcF9tYXRjaGluZykKKwkJCWJyZWFrOworCisJLyogZW5kIG9mICJ3aGlsZSBsaW5lIGlzIHJlYWQgZnJvbSAvZXRjL21kZXYuY29uZiIgKi8KKwl9IHdoaWxlIChFTkFCTEVfRkVBVFVSRV9NREVWX0NPTkYpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORikKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJZnJlZShzdWJzeXN0ZW1fc2xhc2hfZGV2bmFtZSk7Cit9CisKKy8qIEZpbGUgY2FsbGJhY2sgZm9yIC9zeXMvIHRyYXZlcnNhbCAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKGZpbGVOYW1lKSAtIDQ7IC8qIGNhbid0IHVuZGVyZmxvdyAqLworCWNoYXIgKnNjcmF0Y2ggPSB1c2VyRGF0YTsKKworCS8qIGxlbiBjaGVjayBpcyBmb3IgcGFyYW5vaWQgcmVhc29ucyAqLworCWlmIChzdHJjbXAoZmlsZU5hbWUgKyBsZW4sICIvZGV2IikgIT0gMCB8fCBsZW4gPj0gUEFUSF9NQVgpCisJCXJldHVybiBGQUxTRTsKKworCXN0cmNweShzY3JhdGNoLCBmaWxlTmFtZSk7CisJc2NyYXRjaFtsZW5dID0gJ1wwJzsKKwltYWtlX2RldmljZShzY3JhdGNoLCAvKmRlbGV0ZToqLyAwKTsKKworCXJldHVybiBUUlVFOworfQorCisvKiBEaXJlY3RvcnkgY2FsbGJhY2sgZm9yIC9zeXMvIHRyYXZlcnNhbCAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZGlyQWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lIFVOVVNFRF9QQVJBTSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCkKK3sKKwkvKiBFeHRyYWN0IGRldmljZSBzdWJzeXN0ZW0gLS0gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorCSAqIHVuZGVyIC9zeXMvY2xhc3MvICovCisJaWYgKDEgPT0gZGVwdGgpIHsKKwkJZnJlZShHLnN1YnN5c3RlbSk7CisJCUcuc3Vic3lzdGVtID0gc3RycmNocihmaWxlTmFtZSwgJy8nKTsKKwkJaWYgKEcuc3Vic3lzdGVtKQorCQkJRy5zdWJzeXN0ZW0gPSB4c3RyZHVwKEcuc3Vic3lzdGVtICsgMSk7CisJfQorCisJcmV0dXJuIChkZXB0aCA+PSBNQVhfU1lTRlNfREVQVEggPyBTS0lQIDogVFJVRSk7Cit9CisKKy8qIEZvciB0aGUgZnVsbCBnb3J5IGRldGFpbHMsIHNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlX2NsYXNzL1JFQURNRQorICoKKyAqIEZpcm13YXJlIGxvYWRpbmcgd29ya3MgbGlrZSB0aGlzOgorICogLSBrZXJuZWwgc2V0cyBGSVJNV0FSRSBlbnYgdmFyCisgKiAtIHVzZXJzcGFjZSBjaGVja3MgL2xpYi9maXJtd2FyZS8kRklSTVdBUkUKKyAqIC0gdXNlcnNwYWNlIHdhaXRzIGZvciAvc3lzLyRERVZQQVRIL2xvYWRpbmcgdG8gYXBwZWFyCisgKiAtIHVzZXJzcGFjZSB3cml0ZXMgIjEiIHRvIC9zeXMvJERFVlBBVEgvbG9hZGluZworICogLSB1c2Vyc3BhY2UgY29waWVzIC9saWIvZmlybXdhcmUvJEZJUk1XQVJFIGludG8gL3N5cy8kREVWUEFUSC9kYXRhCisgKiAtIHVzZXJzcGFjZSB3cml0ZXMgIjAiICh3b3JrZWQpIG9yICItMSIgKGZhaWxlZCkgdG8gL3N5cy8kREVWUEFUSC9sb2FkaW5nCisgKiAtIGtlcm5lbCBsb2FkcyBmaXJtd2FyZSBpbnRvIGRldmljZQorICovCitzdGF0aWMgdm9pZCBsb2FkX2Zpcm13YXJlKGNvbnN0IGNoYXIgKmZpcm13YXJlLCBjb25zdCBjaGFyICpzeXNmc19wYXRoKQoreworCWludCBjbnQ7CisJaW50IGZpcm13YXJlX2ZkLCBsb2FkaW5nX2ZkLCBkYXRhX2ZkOworCisJLyogY2hlY2sgZm9yIC9saWIvZmlybXdhcmUvJEZJUk1XQVJFICovCisJeGNoZGlyKCIvbGliL2Zpcm13YXJlIik7CisJZmlybXdhcmVfZmQgPSB4b3BlbihmaXJtd2FyZSwgT19SRE9OTFkpOworCisJLyogaW4gY2FzZSB3ZSBnb3RvIG91dCAuLi4gKi8KKwlkYXRhX2ZkID0gLTE7CisKKwkvKiBjaGVjayBmb3IgL3N5cy8kREVWUEFUSC9sb2FkaW5nIC4uLiBnaXZlIDMwIHNlY29uZHMgdG8gYXBwZWFyICovCisJeGNoZGlyKHN5c2ZzX3BhdGgpOworCWZvciAoY250ID0gMDsgY250IDwgMzA7ICsrY250KSB7CisJCWxvYWRpbmdfZmQgPSBvcGVuKCJsb2FkaW5nIiwgT19XUk9OTFkpOworCQlpZiAobG9hZGluZ19mZCAhPSAtMSkKKwkJCWdvdG8gbG9hZGluZzsKKwkJc2xlZXAoMSk7CisJfQorCWdvdG8gb3V0OworCisgbG9hZGluZzoKKwkvKiB0ZWxsIGtlcm5lbCB3ZSdyZSBsb2FkaW5nIGJ5ICJlY2hvIDEgPiAvc3lzLyRERVZQQVRIL2xvYWRpbmciICovCisJaWYgKGZ1bGxfd3JpdGUobG9hZGluZ19mZCwgIjEiLCAxKSAhPSAxKQorCQlnb3RvIG91dDsKKworCS8qIGxvYWQgZmlybXdhcmUgaW50byAvc3lzLyRERVZQQVRIL2RhdGEgKi8KKwlkYXRhX2ZkID0gb3BlbigiZGF0YSIsIE9fV1JPTkxZKTsKKwlpZiAoZGF0YV9mZCA9PSAtMSkKKwkJZ290byBvdXQ7CisJY250ID0gYmJfY29weWZkX2VvZihmaXJtd2FyZV9mZCwgZGF0YV9mZCk7CisKKwkvKiB0ZWxsIGtlcm5lbCByZXN1bHQgYnkgImVjaG8gWzB8LTFdID4gL3N5cy8kREVWUEFUSC9sb2FkaW5nIiAqLworCWlmIChjbnQgPiAwKQorCQlmdWxsX3dyaXRlKGxvYWRpbmdfZmQsICIwIiwgMSk7CisJZWxzZQorCQlmdWxsX3dyaXRlKGxvYWRpbmdfZmQsICItMSIsIDIpOworCisgb3V0OgorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmaXJtd2FyZV9mZCk7CisJCWNsb3NlKGxvYWRpbmdfZmQpOworCQljbG9zZShkYXRhX2ZkKTsKKwl9Cit9CisKK2ludCBtZGV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtZGV2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlSRVNFUlZFX0NPTkZJR19CVUZGRVIodGVtcCwgUEFUSF9NQVggKyBTQ1JBVENIX1NJWkUpOworCisJLyogV2UgY2FuIGJlIGNhbGxlZCBhcyBob3RwbHVnIGhlbHBlciAqLworCS8qIEtlcm5lbCBjYW5ub3QgcHJvdmlkZSBzdWl0YWJsZSBzdGRpbyBmZHMgZm9yIHVzLCBkbyBpdCBvdXJzZWxmICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKworCS8qIEZvcmNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc2V0dGluZ3MgZXhhY3RseSAqLworCXVtYXNrKDApOworCisJeGNoZGlyKCIvZGV2Iik7CisKKwlpZiAoYXJndlsxXSAmJiBzdHJjbXAoYXJndlsxXSwgIi1zIikgPT0gMCkgeworCQkvKiBTY2FuOgorCQkgKiBtZGV2IC1zCisJCSAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQl4c3RhdCgiLyIsICZzdCk7CisJCUcucm9vdF9tYWpvciA9IG1ham9yKHN0LnN0X2Rldik7CisJCUcucm9vdF9taW5vciA9IG1pbm9yKHN0LnN0X2Rldik7CisKKwkJLyogQUNUSU9OX0ZPTExPV0xJTktTIGlzIG5lZWRlZCBzaW5jZSBpbiBuZXdlciBrZXJuZWxzCisJCSAqIC9zeXMvYmxvY2svbG9vcCogKGZvciBleGFtcGxlKSBhcmUgc3ltbGlua3MgdG8gZGlycywKKwkJICogbm90IHJlYWwgZGlyZWN0b3JpZXMuCisJCSAqIChrZXJuZWwncyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBtYWtlcyB0aGVtIHJlYWwgZGlycywKKwkJICogYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdCBvbiB1c2VycykKKwkJICovCisJCWlmIChhY2Nlc3MoIi9zeXMvY2xhc3MvYmxvY2siLCBGX09LKSAhPSAwKSB7CisJCQkvKiBTY2FuIG9ic29sZXRlIC9zeXMvYmxvY2sgb25seSBpZiAvc3lzL2NsYXNzL2Jsb2NrCisJCQkgKiBkb2Vzbid0IGV4aXN0LiBPdGhlcndpc2Ugd2UnbGwgaGF2ZSBkdXBlcy4KKwkJCSAqIEFsc28sIGRvIG5vdCBjb21wbGFpbiBpZiBpdCBkb2Vzbid0IGV4aXN0LgorCQkJICogU29tZSBwZW9wbGUgY29uZmlndXJlIGtlcm5lbCB0byBoYXZlIG5vIGJsb2NrZGV2cy4KKwkJCSAqLworCQkJcmVjdXJzaXZlX2FjdGlvbigiL3N5cy9ibG9jayIsCisJCQkJQUNUSU9OX1JFQ1VSU0UgfCBBQ1RJT05fRk9MTE9XTElOS1MgfCBBQ1RJT05fUVVJRVQsCisJCQkJZmlsZUFjdGlvbiwgZGlyQWN0aW9uLCB0ZW1wLCAwKTsKKwkJfQorCQlyZWN1cnNpdmVfYWN0aW9uKCIvc3lzL2NsYXNzIiwKKwkJCUFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX0ZPTExPV0xJTktTLAorCQkJZmlsZUFjdGlvbiwgZGlyQWN0aW9uLCB0ZW1wLCAwKTsKKwl9IGVsc2UgeworCQljaGFyICpmdzsKKwkJY2hhciAqc2VxOworCQljaGFyICphY3Rpb247CisJCWNoYXIgKmVudl9wYXRoOworCQlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9ICJyZW1vdmVcMGFkZFwwIjsKKwkJZW51bSB7IE9QX3JlbW92ZSA9IDAsIE9QX2FkZCB9OworCQlzbWFsbHVpbnQgb3A7CisKKwkJLyogSG90cGx1ZzoKKwkJICogZW52IEFDVElPTj0uLi4gREVWUEFUSD0uLi4gU1VCU1lTVEVNPS4uLiBbU0VRTlVNPS4uLl0gbWRldgorCQkgKiBBQ1RJT04gY2FuIGJlICJhZGQiIG9yICJyZW1vdmUiCisJCSAqIERFVlBBVEggaXMgbGlrZSAiL2Jsb2NrL3NkYSIgb3IgIi9jbGFzcy9pbnB1dC9taWNlIgorCQkgKi8KKwkJYWN0aW9uID0gZ2V0ZW52KCJBQ1RJT04iKTsKKwkJZW52X3BhdGggPSBnZXRlbnYoIkRFVlBBVEgiKTsKKwkJRy5zdWJzeXN0ZW0gPSBnZXRlbnYoIlNVQlNZU1RFTSIpOworCQlpZiAoIWFjdGlvbiB8fCAhZW52X3BhdGggLyp8fCAhRy5zdWJzeXN0ZW0qLykKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJZncgPSBnZXRlbnYoIkZJUk1XQVJFIik7CisJCW9wID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgYWN0aW9uKTsKKwkJLyogSWYgaXQgZXhpc3RzLCBkb2VzIC9kZXYvbWRldi5zZXEgbWF0Y2ggJFNFUU5VTT8KKwkJICogSWYgaXQgZG9lcyBub3QgbWF0Y2gsIGVhcmxpZXIgbWRldiBpcyBydW5uaW5nCisJCSAqIGluIHBhcmFsbGVsLCBhbmQgd2UgbmVlZCB0byB3YWl0ICovCisJCXNlcSA9IGdldGVudigiU0VRTlVNIik7CisJCWlmIChzZXEpIHsKKwkJCWludCB0aW1lb3V0ID0gMjAwMCAvIDMyOyAvKiAyMDAwIG1zZWMgKi8KKwkJCWRvIHsKKwkJCQlpbnQgc2VxbGVuOworCQkJCWNoYXIgc2VxYnVmW3NpemVvZihpbnQpKjMgKyAyXTsKKworCQkJCXNlcWxlbiA9IG9wZW5fcmVhZF9jbG9zZSgibWRldi5zZXEiLCBzZXFidWYsIHNpemVvZihzZXFidWYpIC0gMSk7CisJCQkJaWYgKHNlcWxlbiA8IDApIHsKKwkJCQkJc2VxID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNlcWJ1ZltzZXFsZW5dID0gJ1wwJzsKKwkJCQlpZiAoc2VxYnVmWzBdID09ICdcbicgLyogc2VlZCBmaWxlPyAqLworCQkJCSB8fCBzdHJjbXAoc2VxLCBzZXFidWYpID09IDAgLyogY29ycmVjdCBpZHg/ICovCisJCQkJKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl1c2xlZXAoMzIqMTAwMCk7CisJCQl9IHdoaWxlICgtLXRpbWVvdXQpOworCQl9CisKKwkJc25wcmludGYodGVtcCwgUEFUSF9NQVgsICIvc3lzJXMiLCBlbnZfcGF0aCk7CisJCWlmIChvcCA9PSBPUF9yZW1vdmUpIHsKKwkJCS8qIElnbm9yaW5nICJyZW1vdmUgZmlybXdhcmUiLiBJdCB3YXMgcmVwb3J0ZWQKKwkJCSAqIHRvIGhhcHBlbiBhbmQgdG8gY2F1c2UgZXJyb25lb3VzIGRlbGV0aW9uCisJCQkgKiBvZiBkZXZpY2Ugbm9kZXMuICovCisJCQlpZiAoIWZ3KQorCQkJCW1ha2VfZGV2aWNlKHRlbXAsIC8qZGVsZXRlOiovIDEpOworCQl9CisJCWVsc2UgaWYgKG9wID09IE9QX2FkZCkgeworCQkJbWFrZV9kZXZpY2UodGVtcCwgLypkZWxldGU6Ki8gMCk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFKSB7CisJCQkJaWYgKGZ3KQorCQkJCQlsb2FkX2Zpcm13YXJlKGZ3LCB0ZW1wKTsKKwkJCX0KKwkJfQorCisJCWlmIChzZXEpIHsKKwkJCXhvcGVuX3h3cml0ZV9jbG9zZSgibWRldi5zZXEiLCB1dG9hKHhhdG91KHNlcSkgKyAxKSk7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCVJFTEVBU0VfQ09ORklHX0JVRkZFUih0ZW1wKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21pbml4LmggYi91dGlsLWxpbnV4L21pbml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmYmNmNwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWluaXguaApAQCAtMCwwICsxLDk4IEBACisvKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbWluaXggaW5vZGUgbGF5b3V0IG9uIGRpc2suCisgKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KKyAqLworc3RydWN0IG1pbml4MV9pbm9kZSB7CisJdWludDE2X3QgaV9tb2RlOworCXVpbnQxNl90IGlfdWlkOworCXVpbnQzMl90IGlfc2l6ZTsKKwl1aW50MzJfdCBpX3RpbWU7CisJdWludDhfdCAgaV9naWQ7CisJdWludDhfdCAgaV9ubGlua3M7CisJdWludDE2X3QgaV96b25lWzldOworfTsKKworLyoKKyAqIFRoZSBuZXcgbWluaXggaW5vZGUgaGFzIGFsbCB0aGUgdGltZSBlbnRyaWVzLCBhcyB3ZWxsIGFzCisgKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKKyAqIGluc3RlYWQgb2YgNysxKzEpLiBBbHNvLCBzb21lIHByZXZpb3VzbHkgOC1iaXQgdmFsdWVzIGFyZQorICogbm93IDE2LWJpdC4gVGhlIGlub2RlIGlzIG5vdyA2NCBieXRlcyBpbnN0ZWFkIG9mIDMyLgorICovCitzdHJ1Y3QgbWluaXgyX2lub2RlIHsKKwl1aW50MTZfdCBpX21vZGU7CisJdWludDE2X3QgaV9ubGlua3M7CisJdWludDE2X3QgaV91aWQ7CisJdWludDE2X3QgaV9naWQ7CisJdWludDMyX3QgaV9zaXplOworCXVpbnQzMl90IGlfYXRpbWU7CisJdWludDMyX3QgaV9tdGltZTsKKwl1aW50MzJfdCBpX2N0aW1lOworCXVpbnQzMl90IGlfem9uZVsxMF07Cit9OworCisvKgorICogbWluaXggc3VwZXJibG9jayBkYXRhIG9uIGRpc2sKKyAqLworc3RydWN0IG1pbml4X3N1cGVyYmxvY2sgeworCXVpbnQxNl90IHNfbmlub2RlczsKKwl1aW50MTZfdCBzX256b25lczsKKwl1aW50MTZfdCBzX2ltYXBfYmxvY2tzOworCXVpbnQxNl90IHNfem1hcF9ibG9ja3M7CisJdWludDE2X3Qgc19maXJzdGRhdGF6b25lOworCXVpbnQxNl90IHNfbG9nX3pvbmVfc2l6ZTsKKwl1aW50MzJfdCBzX21heF9zaXplOworCXVpbnQxNl90IHNfbWFnaWM7CisJdWludDE2X3Qgc19zdGF0ZTsKKwl1aW50MzJfdCBzX3pvbmVzOworfTsKKworc3RydWN0IG1pbml4X2Rpcl9lbnRyeSB7CisJdWludDE2X3QgaW5vZGU7CisJY2hhciBuYW1lW107Cit9OworCisvKiBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IG1vdW50LmggaGFzIHRoaXMgb25lICNkZWZpbmVkICovCisjdW5kZWYgQkxPQ0tfU0laRQorCitlbnVtIHsKKwlCTE9DS19TSVpFICAgICAgICAgICAgICA9IDEwMjQsCisJQklUU19QRVJfQkxPQ0sgICAgICAgICAgPSBCTE9DS19TSVpFIDw8IDMsCisKKwlNSU5JWF9ST09UX0lOTyAgICAgICAgICA9IDEsCisJTUlOSVhfQkFEX0lOTyAgICAgICAgICAgPSAyLAorCisJTUlOSVgxX1NVUEVSX01BR0lDICAgICAgPSAweDEzN0YsICAgICAgIC8qIG9yaWdpbmFsIG1pbml4IGZzICovCisJTUlOSVgxX1NVUEVSX01BR0lDMiAgICAgPSAweDEzOEYsICAgICAgIC8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCisJTUlOSVgyX1NVUEVSX01BR0lDICAgICAgPSAweDI0NjgsICAgICAgIC8qIG1pbml4IFYyIGZzICovCisJTUlOSVgyX1NVUEVSX01BR0lDMiAgICAgPSAweDI0NzgsICAgICAgIC8qIG1pbml4IFYyIGZzLCAzMCBjaGFyIG5hbWVzICovCisJTUlOSVhfVkFMSURfRlMgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qIGNsZWFuIGZzICovCisJTUlOSVhfRVJST1JfRlMgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qIGZzIGhhcyBlcnJvcnMgKi8KKworCUlOT0RFX1NJWkUxICAgICAgICAgICAgID0gc2l6ZW9mKHN0cnVjdCBtaW5peDFfaW5vZGUpLAorCUlOT0RFX1NJWkUyICAgICAgICAgICAgID0gc2l6ZW9mKHN0cnVjdCBtaW5peDJfaW5vZGUpLAorCU1JTklYMV9JTk9ERVNfUEVSX0JMT0NLID0gQkxPQ0tfU0laRSAvIHNpemVvZihzdHJ1Y3QgbWluaXgxX2lub2RlKSwKKwlNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyA9IEJMT0NLX1NJWkUgLyBzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSksCit9OworCisvKgorQmFzaWMgdGVzdCBzY3JpcHQgZm9yIHJlZ3Jlc3Npb25zIGluIG1rZnMvZnNjay4KK0NvcGllcyBjdXJyZW50IGRpciBpbnRvIGltYWdlICh0eXBpY2FsbHkgYmJveCBidWlsZCB0cmVlKS4KKworIyEvYmluL3NoCit0bXBkaXI9L3RtcC9taW5peHRlc3QtJCQKK3RtcGltZz0vdG1wL21pbml4LWltZy0kJAorCitta2RpciAkdG1wZGlyCitkZCBpZj0vZGV2L3plcm8gb2Y9JHRtcGltZyBicz0xTSBjb3VudD0yMCB8fCBleGl0CisuL2J1c3lib3ggbWtmcy5taW5peCAkdG1waW1nIHx8IGV4aXQKK21vdW50IC1vIGxvb3AgJHRtcGltZyAkdG1wZGlyIHx8IGV4aXQKK2NwIC1hICIkUFdEIiAkdG1wZGlyCit1bW91bnQgJHRtcGRpciB8fCBleGl0CisuL2J1c3lib3ggZnNjay5taW5peCAtdmZtICR0bXBpbWcgfHwgZXhpdAorZWNobyAiQ29udGludWU/IgorcmVhZCBqdW5rCisuL2J1c3lib3ggZnNjay5taW5peCAtdmZtbCAkdG1waW1nIHx8IGV4aXQKK3JtZGlyICR0bXBkaXIKK3JtICR0bXBpbWcKKworKi8KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbWtmc19leHQyLmMgYi91dGlsLWxpbnV4L21rZnNfZXh0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Y2NjOWMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L21rZnNfZXh0Mi5jCkBAIC0wLDAgKzEsNjk1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2ZzX2V4dDI6IHV0aWxpdHkgdG8gY3JlYXRlIEVYVDIgZmlsZXN5c3RlbQorICogaW5zcGlyZWQgYnkgZ2VuZXh0MmZzCisgKgorICogQnVzeWJveCdlZCAoMjAwOSkgYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rZnNfZXh0Ml90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1Gbl0gIgorLyogLy91c2FnZTogICAgIlstY3wtbCBmaWxlbmFtZV0gIiAqLworLy91c2FnZTogICAgICAgIlstYiBCTEtfU0laRV0gIgorLyogLy91c2FnZTogICAgIlstZiBmcmFnbWVudC1zaXplXSBbLWcgYmxvY2tzLXBlci1ncm91cF0gIiAqLworLy91c2FnZTogICAgICAgIlstaSBJTk9ERV9SQVRJT10gWy1JIElOT0RFX1NJWkVdICIKKy8qIC8vdXNhZ2U6ICAgICJbLWpdIFstSiBqb3VybmFsLW9wdGlvbnNdIFstTiBudW1iZXItb2YtaW5vZGVzXSAiICovCisvL3VzYWdlOiAgICAgICAiWy1tIFJFU0VSVkVEX1BFUkNFTlRdICIKKy8qIC8vdXNhZ2U6ICAgICJbLW8gY3JlYXRvci1vc10gWy1PIGZlYXR1cmVbLC4uLl1dIFstcV0gIiAqLworLyogLy91c2FnZTogICAgIltyIGZzLXJldmlzaW9uLWxldmVsXSBbLUUgZXh0ZW5kZWQtb3B0aW9uc10gWy12XSBbLUZdICIgKi8KKy8vdXNhZ2U6ICAgICAgICJbLUwgTEFCRUxdICIKKy8qIC8vdXNhZ2U6ICAgICJbLU0gbGFzdC1tb3VudGVkLWRpcmVjdG9yeV0gWy1TXSBbLVQgZmlsZXN5c3RlbS10eXBlXSAiICovCisvL3VzYWdlOiAgICAgICAiQkxPQ0tERVYgW0tCWVRFU10iCisvL3VzYWdlOiNkZWZpbmUgbWtmc19leHQyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1iIEJMS19TSVpFCUJsb2NrIHNpemUsIGJ5dGVzIgorLyogLy91c2FnZTogICJcbgktYwkJQ2hlY2sgZGV2aWNlIGZvciBiYWQgYmxvY2tzIiAqLworLyogLy91c2FnZTogICJcbgktRSBvcHRzCQlTZXQgZXh0ZW5kZWQgb3B0aW9ucyIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLWYgc2l6ZQkJRnJhZ21lbnQgc2l6ZSBpbiBieXRlcyIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLUYJCUZvcmNlIgorLyogLy91c2FnZTogICJcbgktZyBOCQlOdW1iZXIgb2YgYmxvY2tzIGluIGEgYmxvY2sgZ3JvdXAiICovCisvL3VzYWdlOiAgICAgIlxuCS1pIFJBVElPCU1heCBudW1iZXIgb2YgZmlsZXMgaXMgZmlsZXN5c3RlbV9zaXplIC8gUkFUSU8iCisvL3VzYWdlOiAgICAgIlxuCS1JIEJZVEVTCUlub2RlIHNpemUgKG1pbiAxMjgpIgorLyogLy91c2FnZTogICJcbgktagkJQ3JlYXRlIGEgam91cm5hbCAoZXh0MykiICovCisvKiAvL3VzYWdlOiAgIlxuCS1KIG9wdHMJCVNldCBqb3VybmFsIG9wdGlvbnMgKHNpemUvZGV2aWNlKSIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLWwgZmlsZQkJUmVhZCBiYWQgYmxvY2tzIGxpc3QgZnJvbSBmaWxlIiAqLworLy91c2FnZTogICAgICJcbgktTCBMQkwJCVZvbHVtZSBsYWJlbCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gUEVSQ0VOVAlQZXJjZW50IG9mIGJsb2NrcyB0byByZXNlcnZlIGZvciBhZG1pbiIKKy8qIC8vdXNhZ2U6ICAiXG4JLU0gZGlyCQlTZXQgbGFzdCBtb3VudGVkIGRpcmVjdG9yeSIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW4JCURyeSBydW4iCisvKiAvL3VzYWdlOiAgIlxuCS1OIE4JCU51bWJlciBvZiBpbm9kZXMgdG8gY3JlYXRlIiAqLworLyogLy91c2FnZTogICJcbgktbyBvcwkJU2V0IHRoZSAnY3JlYXRvciBvcycgZmllbGQiICovCisvKiAvL3VzYWdlOiAgIlxuCS1PIGZlYXR1cmVzCURpcl9pbmRleC9maWxldHlwZS9oYXNfam91cm5hbC9qb3VybmFsX2Rldi9zcGFyc2Vfc3VwZXIiICovCisvKiAvL3VzYWdlOiAgIlxuCS1xCQlRdWlldCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLXIgcmV2CQlTZXQgZmlsZXN5c3RlbSByZXZpc2lvbiIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLVMJCVdyaXRlIHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzIG9ubHkiICovCisvKiAvL3VzYWdlOiAgIlxuCS1UIGZzLXR5cGUJU2V0IHVzYWdlIHR5cGUgKG5ld3MvbGFyZ2VmaWxlL2xhcmdlZmlsZTQpIiAqLworLyogLy91c2FnZTogICJcbgktdgkJVmVyYm9zZSIgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX1JFU0VSVkVEX0dEVCAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX01LRlNfRVhUMl9ESVJfSU5ERVggICAgMQorCisvLyBmcm9tIGUyZnNwcm9ncworI2RlZmluZSBzX3Jlc2VydmVkX2dkdF9ibG9ja3Mgc19wYWRkaW5nMQorI2RlZmluZSBzX21rZnNfdGltZSAgICAgICAgICAgc19yZXNlcnZlZFswXQorI2RlZmluZSBzX2ZsYWdzICAgICAgICAgICAgICAgc19yZXNlcnZlZFsyMl0KKworI2RlZmluZSBFWFQyX0hBU0hfSEFMRl9NRDQgICAgICAgMQorI2RlZmluZSBFWFQyX0ZMQUdTX1NJR05FRF9IQVNIICAgMHgwMDAxCisjZGVmaW5lIEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSCAweDAwMDIKKworLy8gc3RvcmFnZSBoZWxwZXJzCitjaGFyIEJVR193cm9uZ19maWVsZF9zaXplKHZvaWQpOworI2RlZmluZSBTVE9SRV9MRShmaWVsZCwgdmFsdWUpIFwKK2RvIHsgXAorCWlmIChzaXplb2YoZmllbGQpID09IDQpIFwKKwkJZmllbGQgPSBTV0FQX0xFMzIodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAyKSBcCisJCWZpZWxkID0gU1dBUF9MRTE2KHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMSkgXAorCQlmaWVsZCA9ICh2YWx1ZSk7IFwKKwllbHNlIFwKKwkJQlVHX3dyb25nX2ZpZWxkX3NpemUoKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGRVRDSF9MRTMyKGZpZWxkKSBcCisJKHNpemVvZihmaWVsZCkgPT0gNCA/IFNXQVBfTEUzMihmaWVsZCkgOiBCVUdfd3JvbmdfZmllbGRfc2l6ZSgpKQorCisvLyBBbGwgZmllbGRzIGFyZSBsaXR0bGUtZW5kaWFuCitzdHJ1Y3QgZXh0Ml9kaXIgeworCXVpbnQzMl90IGlub2RlMTsKKwl1aW50MTZfdCByZWNfbGVuMTsKKwl1aW50OF90ICBuYW1lX2xlbjE7CisJdWludDhfdCAgZmlsZV90eXBlMTsKKwljaGFyICAgICBuYW1lMVs0XTsKKwl1aW50MzJfdCBpbm9kZTI7CisJdWludDE2X3QgcmVjX2xlbjI7CisJdWludDhfdCAgbmFtZV9sZW4yOworCXVpbnQ4X3QgIGZpbGVfdHlwZTI7CisJY2hhciAgICAgbmFtZTJbNF07CisJdWludDMyX3QgaW5vZGUzOworCXVpbnQxNl90IHJlY19sZW4zOworCXVpbnQ4X3QgIG5hbWVfbGVuMzsKKwl1aW50OF90ICBmaWxlX3R5cGUzOworCWNoYXIgICAgIG5hbWUzWzEyXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnRfbG9nMih1bnNpZ25lZCBhcmcpCit7CisJdW5zaWduZWQgciA9IDA7CisJd2hpbGUgKChhcmcgPj49IDEpICE9IDApCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLy8gdGFrZW4gZnJvbSBta2ZzX21pbml4LmMuIGxpYmJiIGNhbmRpZGF0ZT8KKy8vICJ1aW50MzJfdCBzaXplIiwgc2luY2Ugd2UgbmV2ZXIgdXNlIGl0IGZvciBhbnl0aGluZyA+MzIgYml0cworc3RhdGljIHVpbnQzMl90IGRpdl9yb3VuZHVwKHVpbnQzMl90IHNpemUsIHVpbnQzMl90IG4pCit7CisJLy8gT3ZlcmZsb3ctcmVzaXN0YW50CisJdWludDMyX3QgcmVzID0gc2l6ZSAvIG47CisJaWYgKHJlcyAqIG4gIT0gc2l6ZSkKKwkJcmVzKys7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGUodWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBibG9ja3NpemUsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpCit7CisJdWludDMyX3QgaTsKKworLy9iYl9pbmZvX21zZygiQUxMT0M6IFsldV1bJXVdWyV1XTogWyV1LSV1XTo9WyV4XSxbJXhdIiwgYmxvY2tzaXplLCBzdGFydCwgZW5kLCBzdGFydC84LCBibG9ja3NpemUgLSBlbmQvOCAtIDEsICgxIDw8IChzdGFydCAmIDcpKSAtIDEsICh1aW50OF90KSgweEZGMDAgPj4gKGVuZCAmIDcpKSk7CisJbWVtc2V0KGJpdG1hcCwgMCwgYmxvY2tzaXplKTsKKwlpID0gc3RhcnQgLyA4OworCW1lbXNldChiaXRtYXAsIDB4RkYsIGkpOworCWJpdG1hcFtpXSA9ICgxIDw8IChzdGFydCAmIDcpKSAtIDE7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMDExMTExMTEKKwlpID0gZW5kIC8gODsKKwliaXRtYXBbYmxvY2tzaXplIC0gaSAtIDFdIHw9IDB4N0YwMCA+PiAoZW5kICYgNyk7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMTExMTExMTAKKwltZW1zZXQoYml0bWFwICsgYmxvY2tzaXplIC0gaSwgMHhGRiwgaSk7IC8vIE4uQi4gbm8gb3ZlcmZsb3cgaGVyZSEKK30KKworc3RhdGljIHVpbnQzMl90IGhhc19zdXBlcih1aW50MzJfdCB4KQoreworCS8vIDAsIDEgYW5kIHBvd2VycyBvZiAzLCA1LCA3IHVwIHRvIDJeMzIgbGltaXQKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qgc3VwZXJzW10gPSB7CisJCTAsIDEsIDMsIDUsIDcsIDksIDI1LCAyNywgNDksIDgxLCAxMjUsIDI0MywgMzQzLCA2MjUsIDcyOSwKKwkJMjE4NywgMjQwMSwgMzEyNSwgNjU2MSwgMTU2MjUsIDE2ODA3LCAxOTY4MywgNTkwNDksIDc4MTI1LAorCQkxMTc2NDksIDE3NzE0NywgMzkwNjI1LCA1MzE0NDEsIDgyMzU0MywgMTU5NDMyMywgMTk1MzEyNSwKKwkJNDc4Mjk2OSwgNTc2NDgwMSwgOTc2NTYyNSwgMTQzNDg5MDcsIDQwMzUzNjA3LCA0MzA0NjcyMSwKKwkJNDg4MjgxMjUsIDEyOTE0MDE2MywgMjQ0MTQwNjI1LCAyODI0NzUyNDksIDM4NzQyMDQ4OSwKKwkJMTE2MjI2MTQ2NywgMTIyMDcwMzEyNSwgMTk3NzMyNjc0MywgMzQ4Njc4NDQwMS8qID4yXjMxICovLAorCX07CisJY29uc3QgdWludDMyX3QgKnNwID0gc3VwZXJzICsgQVJSQVlfU0laRShzdXBlcnMpOworCXdoaWxlICgxKSB7CisJCXNwLS07CisJCWlmICh4ID09ICpzcCkKKwkJCXJldHVybiAxOworCQlpZiAoeCA+ICpzcCkKKwkJCXJldHVybiAwOworCX0KK30KKworI2RlZmluZSBmZCAzCS8qIHByZWRlZmluZWQgb3V0cHV0IGRlc2NyaXB0b3IgKi8KKworc3RhdGljIHZvaWQgUFVUKHVpbnQ2NF90IG9mZiwgdm9pZCAqYnVmLCB1aW50MzJfdCBzaXplKQoreworLy8JYmJfaW5mb19tc2coIlBVVFslbGx1XTpbJXVdIiwgb2ZmLCBzaXplKTsKKwl4bHNlZWsoZmQsIG9mZiwgU0VFS19TRVQpOworCXh3cml0ZShmZCwgYnVmLCBzaXplKTsKK30KKworLy8gMTI4IGFuZCAyNTYtYnl0ZSBpbm9kZXM6CisvLyAxMjgtYnl0ZSBpbm9kZSBpcyBkZXNjcmliZWQgYnkgc3RydWN0IGV4dDJfaW5vZGUuCisvLyAyNTYtYnl0ZSBvbmUganVzdCBoYXMgdGhlc2UgZmllbGRzIGFwcGVuZGVkOgorLy8gICAgICBfX3UxNiAgIGlfZXh0cmFfaXNpemU7CisvLyAgICAgIF9fdTE2ICAgaV9wYWQxOworLy8gICAgICBfX3UzMiAgIGlfY3RpbWVfZXh0cmE7ICAvKiBleHRyYSBDaGFuZ2UgdGltZSAobnNlYyA8PCAyIHwgZXBvY2gpICovCisvLyAgICAgIF9fdTMyICAgaV9tdGltZV9leHRyYTsgIC8qIGV4dHJhIE1vZGlmaWNhdGlvbiB0aW1lIChuc2VjIDw8IDIgfCBlcG9jaCkgKi8KKy8vICAgICAgX191MzIgICBpX2F0aW1lX2V4dHJhOyAgLyogZXh0cmEgQWNjZXNzIHRpbWUgKG5zZWMgPDwgMiB8IGVwb2NoKSAqLworLy8gICAgICBfX3UzMiAgIGlfY3J0aW1lOyAgICAgICAvKiBGaWxlIGNyZWF0aW9uIHRpbWUgKi8KKy8vICAgICAgX191MzIgICBpX2NydGltZV9leHRyYTsgLyogZXh0cmEgRmlsZSBjcmVhdGlvbiB0aW1lIChuc2VjIDw8IDIgfCBlcG9jaCkqLworLy8gICAgICBfX3UzMiAgIGlfdmVyc2lvbl9oaTsgICAvKiBoaWdoIDMyIGJpdHMgZm9yIDY0LWJpdCB2ZXJzaW9uICovCisvLyB0aGUgcmVzdCBpcyBwYWRkaW5nLgorLy8KKy8vIGxpbnV4L2V4dDJfZnMuaCBoYXMgIiNkZWZpbmUgaV9zaXplX2hpZ2ggaV9kaXJfYWNsIiB3aGljaCBzdWdnZXN0cyB0aGF0IGV2ZW4KKy8vIDEyOC1ieXRlIGlub2RlIGlzIGNhcGFibGUgb2YgZGVzY3JpYmluZyBsYXJnZSBmaWxlcyAoaV9kaXJfYWNsIGlzIG1lYW5pbmdmdWwKKy8vIG9ubHkgZm9yIGRpcmVjdG9yaWVzLCB3aGljaCBuZXZlciBuZWVkIGlfc2l6ZV9oaWdoKS4KKy8vCisvLyBTdGFuZGFyZCBta2UyZnMgY3JlYXRlcyBhIGZpbGVzeXN0ZW0gd2l0aCAyNTYtYnl0ZSBpbm9kZXMgaWYgaXQgaXMKKy8vIGJpZ2dlciB0aGFuIDAuNUdCLgorCisvLyBTdGFuZGFyZCBta2UyZnMgMS40MS45OgorLy8gVXNhZ2U6IG1rZTJmcyBbLWN8LWwgZmlsZW5hbWVdIFstYiBibG9jay1zaXplXSBbLWYgZnJhZ21lbnQtc2l6ZV0KKy8vCVstaSBieXRlcy1wZXItaW5vZGVdIFstSSBpbm9kZS1zaXplXSBbLUogam91cm5hbC1vcHRpb25zXQorLy8JWy1HIG1ldGEgZ3JvdXAgc2l6ZV0gWy1OIG51bWJlci1vZi1pbm9kZXNdCisvLwlbLW0gcmVzZXJ2ZWQtYmxvY2tzLXBlcmNlbnRhZ2VdIFstbyBjcmVhdG9yLW9zXQorLy8JWy1nIGJsb2Nrcy1wZXItZ3JvdXBdIFstTCB2b2x1bWUtbGFiZWxdIFstTSBsYXN0LW1vdW50ZWQtZGlyZWN0b3J5XQorLy8JWy1PIGZlYXR1cmVbLC4uLl1dIFstciBmcy1yZXZpc2lvbl0gWy1FIGV4dGVuZGVkLW9wdGlvblssLi4uXV0KKy8vCVstVCBmcy10eXBlXSBbLVUgVVVJRF0gWy1qbnF2RlNWXSBkZXZpY2UgW2Jsb2Nrcy1jb3VudF0KKy8vCisvLyBPcHRpb25zIG5vdCBjb21tZW50ZWQgYmVsb3cgYXJlIHRha2VuIGJ1dCBzaWxlbnRseSBpZ25vcmVkOgorZW51bSB7CisJT1BUX2MgPSAxIDw8IDAsCisJT1BUX2wgPSAxIDw8IDEsCisJT1BUX2IgPSAxIDw8IDIsCQkvLyBibG9jayBzaXplLCBpbiBieXRlcworCU9QVF9mID0gMSA8PCAzLAorCU9QVF9pID0gMSA8PCA0LAkJLy8gYnl0ZXMgcGVyIGlub2RlCisJT1BUX0kgPSAxIDw8IDUsCQkvLyBjdXN0b20gaW5vZGUgc2l6ZSwgaW4gYnl0ZXMKKwlPUFRfSiA9IDEgPDwgNiwKKwlPUFRfRyA9IDEgPDwgNywKKwlPUFRfTiA9IDEgPDwgOCwKKwlPUFRfbSA9IDEgPDwgOSwJCS8vIHBlcmNlbnRhZ2Ugb2YgYmxvY2tzIHJlc2VydmVkIGZvciBzdXBlcnVzZXIKKwlPUFRfbyA9IDEgPDwgMTAsCisJT1BUX2cgPSAxIDw8IDExLAorCU9QVF9MID0gMSA8PCAxMiwJLy8gbGFiZWwKKwlPUFRfTSA9IDEgPDwgMTMsCisJT1BUX08gPSAxIDw8IDE0LAorCU9QVF9yID0gMSA8PCAxNSwKKwlPUFRfRSA9IDEgPDwgMTYsCisJT1BUX1QgPSAxIDw8IDE3LAorCU9QVF9VID0gMSA8PCAxOCwKKwlPUFRfaiA9IDEgPDwgMTksCisJT1BUX24gPSAxIDw8IDIwLAkvLyBkcnkgcnVuOiBkbyBub3Qgd3JpdGUgYW55dGhpbmcKKwlPUFRfcSA9IDEgPDwgMjEsCisJT1BUX3YgPSAxIDw8IDIyLAorCU9QVF9GID0gMSA8PCAyMywKKwlPUFRfUyA9IDEgPDwgMjQsCisJLy9PUFRfViA9IDEgPDwgMjUsCS8vIC1WIHZlcnNpb24uIGJib3ggYXBwbGV0cyBkb24ndCBzdXBwb3J0IHRoYXQKK307CisKK2ludCBta2ZzX2V4dDJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZnNfZXh0Ml9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaSwgcG9zLCBuOworCXVuc2lnbmVkIGJzLCBicGk7CisJdW5zaWduZWQgYmxvY2tzaXplLCBibG9ja3NpemVfbG9nMjsKKwl1bnNpZ25lZCBpbm9kZXNpemUsIHVzZXJfaW5vZGVzaXplOworCXVuc2lnbmVkIHJlc2VydmVkX3BlcmNlbnQgPSA1OworCXVuc2lnbmVkIGxvbmcgbG9uZyBraWxvYnl0ZXM7CisJdWludDMyX3QgbmJsb2NrcywgbmJsb2Nrc19mdWxsOworCXVpbnQzMl90IG5yZXNlcnZlZDsKKwl1aW50MzJfdCBuZ3JvdXBzOworCXVpbnQzMl90IGJ5dGVzX3Blcl9pbm9kZTsKKwl1aW50MzJfdCBmaXJzdF9ibG9jazsKKwl1aW50MzJfdCBpbm9kZXNfcGVyX2dyb3VwOworCXVpbnQzMl90IGdyb3VwX2Rlc2NfYmxvY2tzOworCXVpbnQzMl90IGlub2RlX3RhYmxlX2Jsb2NrczsKKwl1aW50MzJfdCBsb3N0X2FuZF9mb3VuZF9ibG9ja3M7CisJdGltZV90IHRpbWVzdGFtcDsKKwljb25zdCBjaGFyICpsYWJlbCA9ICIiOworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsgLy8gc3VwZXJibG9jaworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmdkOyAvLyBncm91cCBkZXNjcmlwdG9ycworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZTsKKwlzdHJ1Y3QgZXh0Ml9kaXIgKmRpcjsKKwl1aW50OF90ICpidWY7CisKKwkvLyB1c2luZyBnbG9iYWwgIm9wdGlvbl9tYXNrMzIiIGluc3RlYWQgb2YgbG9jYWwgIm9wdHMiOgorCS8vIHdlIGFyZSByZWdpc3RlciBzdGFydmVkIGhlcmUKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpiKzppKzpJKzptKyI7CisJLypvcHRzID0qLyBnZXRvcHQzMihhcmd2LCAiY2w6YjpmOmk6STpKOkc6TjptOm86ZzpMOk06TzpyOkU6VDpVOmpucXZGUyIsCisJCS8qbGJmaToqLyBOVUxMLCAmYnMsIE5VTEwsICZicGksCisJCS8qSUpHTjoqLyAmdXNlcl9pbm9kZXNpemUsIE5VTEwsIE5VTEwsIE5VTEwsCisJCS8qbW9nTDoqLyAmcmVzZXJ2ZWRfcGVyY2VudCwgTlVMTCwgTlVMTCwgJmxhYmVsLAorCQkvKk1PckU6Ki8gTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJLypUVToqLyBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsgLy8gYXJndlswXSAtLSBkZXZpY2UKKworCS8vIG9wZW4gdGhlIGRldmljZSwgY2hlY2sgdGhlIGRldmljZSBpcyBhIGJsb2NrIGRldmljZQorCXhtb3ZlX2ZkKHhvcGVuKGFyZ3ZbMF0sIE9fV1JPTkxZKSwgZmQpOworCXhmc3RhdChmZCwgJnN0LCBhcmd2WzBdKTsKKwlpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkgJiYgIShvcHRpb25fbWFzazMyICYgT1BUX0YpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsIGFyZ3ZbMF0pOworCisJLy8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZAorCS8vIE4uQi4gd2hhdCBpZiB3ZSBmb3JtYXQgYSBmaWxlPyBmaW5kX21vdW50X3BvaW50IHdpbGwgcmV0dXJuIGZhbHNlIG5lZ2F0aXZlIHNpbmNlCisJLy8gaXQgaXMgbG9vcCBibG9jayBkZXZpY2Ugd2hpY2ggaXMgbW91bnRlZCEKKwlpZiAoZmluZF9tb3VudF9wb2ludChhcmd2WzBdLCAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKworCS8vIGdldCBzaXplIGluIGtieXRlcworCWtpbG9ieXRlcyA9IGdldF92b2x1bWVfc2l6ZV9pbl9ieXRlcyhmZCwgYXJndlsxXSwgMTAyNCwgLypleHRlbmQ6Ki8gIShvcHRpb25fbWFzazMyICYgT1BUX24pKSAvIDEwMjQ7CisKKwlieXRlc19wZXJfaW5vZGUgPSAxNjM4NDsKKwlpZiAoa2lsb2J5dGVzIDwgNTEyKjEwMjQpCisJCWJ5dGVzX3Blcl9pbm9kZSA9IDQwOTY7CisJaWYgKGtpbG9ieXRlcyA8IDMqMTAyNCkKKwkJYnl0ZXNfcGVyX2lub2RlID0gODE5MjsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9pKQorCQlieXRlc19wZXJfaW5vZGUgPSBicGk7CisKKwkvLyBEZXRlcm1pbmUgYmxvY2sgc2l6ZSBhbmQgaW5vZGUgc2l6ZQorCS8vIGJsb2NrIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxMDI0CisJLy8gaW5vZGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDEyOAorCWJsb2Nrc2l6ZSA9IDEwMjQ7CisJaW5vZGVzaXplID0gc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKTsgLy8gMTI4CisJaWYgKGtpbG9ieXRlcyA+PSA1MTIqMTAyNCkgeyAvLyBta2UyZnMgMS40MS45IGNvbXBhdAorCQlibG9ja3NpemUgPSA0MDk2OworCQlpbm9kZXNpemUgPSAyNTY7CisJfQorCWlmIChFWFQyX01BWF9CTE9DS19TSVpFID4gNDA5NikgeworCQkvLyBraWxvYnl0ZXMgPj4gMjIgPT0gc2l6ZSBpbiA0Z2lnYWJ5dGUgY2h1bmtzLgorCQkvLyBpZiBzaXplID49IDE2ayBnaWdzLCBibG9ja3NpemUgbXVzdCBiZSBpbmNyZWFzZWQuCisJCS8vIFRyeSAibWtlMmZzIC1GIGltYWdlICQoKDE2ICogMTAyNCoxMDI0KjEwMjQpKSIKKwkJd2hpbGUgKChraWxvYnl0ZXMgPj4gMjIpID49IGJsb2Nrc2l6ZSkKKwkJCWJsb2Nrc2l6ZSAqPSAyOworCX0KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9iKQorCQlibG9ja3NpemUgPSBiczsKKwlpZiAoYmxvY2tzaXplIDwgRVhUMl9NSU5fQkxPQ0tfU0laRQorCSB8fCBibG9ja3NpemUgPiBFWFQyX01BWF9CTE9DS19TSVpFCisJIHx8IChibG9ja3NpemUgJiAoYmxvY2tzaXplIC0gMSkpIC8vIG5vdCBwb3dlciBvZiAyCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJibG9ja3NpemUgJXUgaXMgYmFkIiwgYmxvY2tzaXplKTsKKwl9CisJLy8gRG8gd2UgaGF2ZSBjdXN0b20gaW5vZGUgc2l6ZT8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9JKSB7CisJCWlmICh1c2VyX2lub2Rlc2l6ZSA8IHNpemVvZigqaW5vZGUpCisJCSB8fCB1c2VyX2lub2Rlc2l6ZSA+IGJsb2Nrc2l6ZQorCQkgfHwgKHVzZXJfaW5vZGVzaXplICYgKHVzZXJfaW5vZGVzaXplIC0gMSkpIC8vIG5vdCBwb3dlciBvZiAyCisJCSkgeworCQkJYmJfZXJyb3JfbXNnKCItJWMgaXMgYmFkIiwgJ0knKTsKKwkJfSBlbHNlIHsKKwkJCWlub2Rlc2l6ZSA9IHVzZXJfaW5vZGVzaXplOworCQl9CisJfQorCisJaWYgKChpbnQzMl90KWJ5dGVzX3Blcl9pbm9kZSA8IGJsb2Nrc2l6ZSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi0lYyBpcyBiYWQiLCAnaScpOworCS8vIG51bWJlciBvZiBiaXRzIGluIG9uZSBibG9jaywgaS5lLiA4KmJsb2Nrc2l6ZQorI2RlZmluZSBibG9ja3NfcGVyX2dyb3VwICg4ICogYmxvY2tzaXplKQorCWZpcnN0X2Jsb2NrID0gKEVYVDJfTUlOX0JMT0NLX1NJWkUgPT0gYmxvY2tzaXplKTsKKwlibG9ja3NpemVfbG9nMiA9IGludF9sb2cyKGJsb2Nrc2l6ZSk7CisKKwkvLyBEZXRlcm1pbmUgbnVtYmVyIG9mIGJsb2NrcworCWtpbG9ieXRlcyA+Pj0gKGJsb2Nrc2l6ZV9sb2cyIC0gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworCW5ibG9ja3MgPSBraWxvYnl0ZXM7CisJaWYgKG5ibG9ja3MgIT0ga2lsb2J5dGVzKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmxvY2sgY291bnQgZG9lc24ndCBmaXQgaW4gMzIgYml0cyIpOworI2RlZmluZSBraWxvYnl0ZXMga2lsb2J5dGVzX3VudXNlZF9hZnRlcl90aGlzCisJLy8gRXhwZXJpbWVudGFsbHksIHN0YW5kYXJkIG1rZTJmcyB3b24ndCB3b3JrIG9uIGltYWdlcyBzbWFsbGVyIHRoYW4gNjBrCisJaWYgKG5ibG9ja3MgPCA2MCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgPj0gNjAgYmxvY2tzIik7CisKKwkvLyBIb3cgbWFueSByZXNlcnZlZCBibG9ja3M/CisJaWYgKHJlc2VydmVkX3BlcmNlbnQgPiA1MCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi0lYyBpcyBiYWQiLCAnbScpOworCW5yZXNlcnZlZCA9ICh1aW50NjRfdCluYmxvY2tzICogcmVzZXJ2ZWRfcGVyY2VudCAvIDEwMDsKKworCS8vIE4uQi4ga2lsbGluZyBlMmZzcHJvZ3MgZmVhdHVyZSEgVW51c2VkIGJsb2NrcyBkb24ndCBhY2NvdW50IGluIGNhbGN1bGF0aW9ucworCW5ibG9ja3NfZnVsbCA9IG5ibG9ja3M7CisKKwkvLyBJZiBsYXN0IGJsb2NrIGdyb3VwIGlzIHRvbyBzbWFsbCwgbmJsb2NrcyBtYXkgYmUgZGVjcmVhc2VkIGluIG9yZGVyCisJLy8gdG8gZGlzY2FyZCBpdCwgYW5kIGNvbnRyb2wgcmV0dXJucyBoZXJlIHRvIHJlY2FsY3VsYXRlIHNvbWUKKwkvLyBwYXJhbWV0ZXJzLgorCS8vIE5vdGU6IGJsb2Nrc2l6ZSBhbmQgYnl0ZXNfcGVyX2lub2RlIGFyZSBuZXZlciByZWNhbGN1bGF0ZWQuCisgcmV0cnk6CisJLy8gTi5CLiBhIGJsb2NrIGdyb3VwIGNhbiBoYXZlIG5vIG1vcmUgdGhhbiBibG9ja3NfcGVyX2dyb3VwIGJsb2NrcworCW5ncm91cHMgPSBkaXZfcm91bmR1cChuYmxvY2tzIC0gZmlyc3RfYmxvY2ssIGJsb2Nrc19wZXJfZ3JvdXApOworCisJZ3JvdXBfZGVzY19ibG9ja3MgPSBkaXZfcm91bmR1cChuZ3JvdXBzLCBibG9ja3NpemUgLyBzaXplb2YoKmdkKSk7CisJLy8gVE9ETzogcmVzZXJ2ZWQgYmxvY2tzIG11c3QgYmUgbWFya2VkIGFzIHN1Y2ggaW4gdGhlIGJpdG1hcHMsCisJLy8gb3IgcmVzdWx0aW5nIGZpbGVzeXN0ZW0gaXMgY29ycnVwdAorCWlmIChFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfUkVTRVJWRURfR0RUKSB7CisJCS8qCisJCSAqIEZyb20gZTJmc3Byb2dzOiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBHRFQgYmxvY2tzIHRvIHJlc2VydmUgZm9yIG9ubGluZQorCQkgKiBmaWxlc3lzdGVtIGdyb3d0aC4KKwkJICogVGhlIGFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIEdEVCBibG9ja3Mgd2UgY2FuIHJlc2VydmUgaXMgZGV0ZXJtaW5lZCBieQorCQkgKiB0aGUgbnVtYmVyIG9mIGJsb2NrIHBvaW50ZXJzIHRoYXQgY2FuIGZpdCBpbnRvIGEgc2luZ2xlIGJsb2NrLgorCQkgKiBXZSBzZXQgaXQgYXQgMTAyNHggdGhlIGN1cnJlbnQgZmlsZXN5c3RlbSBzaXplLCBvcgorCQkgKiB0aGUgdXBwZXIgYmxvY2sgY291bnQgbGltaXQgKDJeMzIpLCB3aGljaGV2ZXIgaXMgbG93ZXIuCisJCSAqLworCQl1aW50MzJfdCByZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IDB4RkZGRkZGRkY7IC8vIG1heGltdW0gYmxvY2sgbnVtYmVyCisJCWlmIChuYmxvY2tzIDwgcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgLyAxMDI0KQorCQkJcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgPSBuYmxvY2tzICogMTAyNDsKKwkJcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgPSBkaXZfcm91bmR1cChyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyAtIGZpcnN0X2Jsb2NrLCBibG9ja3NfcGVyX2dyb3VwKTsKKwkJcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgPSBkaXZfcm91bmR1cChyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcywgYmxvY2tzaXplIC8gc2l6ZW9mKCpnZCkpIC0gZ3JvdXBfZGVzY19ibG9ja3M7CisJCWlmIChyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA+IGJsb2Nrc2l6ZSAvIHNpemVvZih1aW50MzJfdCkpCisJCQlyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IGJsb2Nrc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CisJCS8vVE9ETzogU1RPUkVfTEUoc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MpOworCQlncm91cF9kZXNjX2Jsb2NrcyArPSByZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrczsKKwl9CisKKwl7CisJCS8vIE4uQi4gZTJmc3Byb2dzIGRvZXMgYXMgZm9sbG93cyEKKwkJdWludDMyX3Qgb3ZlcmhlYWQsIHJlbWFpbmRlcjsKKwkJLy8gbmlub2RlcyBpcyB0aGUgbWF4IG51bWJlciBvZiBpbm9kZXMgaW4gdGhpcyBmaWxlc3lzdGVtCisJCXVpbnQzMl90IG5pbm9kZXMgPSAoKHVpbnQ2NF90KSBuYmxvY2tzX2Z1bGwgKiBibG9ja3NpemUpIC8gYnl0ZXNfcGVyX2lub2RlOworCQlpZiAobmlub2RlcyA8IEVYVDJfR09PRF9PTERfRklSU1RfSU5PKzEpCisJCQluaW5vZGVzID0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk8rMTsKKwkJaW5vZGVzX3Blcl9ncm91cCA9IGRpdl9yb3VuZHVwKG5pbm9kZXMsIG5ncm91cHMpOworCQkvLyBtaW5pbXVtIG51bWJlciBiZWNhdXNlIHRoZSBmaXJzdCBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTy0xIGFyZSByZXNlcnZlZAorCQlpZiAoaW5vZGVzX3Blcl9ncm91cCA8IDE2KQorCQkJaW5vZGVzX3Blcl9ncm91cCA9IDE2OworCQkvLyBhIGJsb2NrIGdyb3VwIGNhbid0IGhhdmUgbW9yZSBpbm9kZXMgdGhhbiBibG9ja3MKKwkJaWYgKGlub2Rlc19wZXJfZ3JvdXAgPiBibG9ja3NfcGVyX2dyb3VwKQorCQkJaW5vZGVzX3Blcl9ncm91cCA9IGJsb2Nrc19wZXJfZ3JvdXA7CisJCS8vIGFkanVzdCBpbm9kZXMgcGVyIGdyb3VwIHNvIHRoZXkgY29tcGxldGVseSBmaWxsIHRoZSBpbm9kZSB0YWJsZSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IKKwkJaW5vZGVzX3Blcl9ncm91cCA9IChkaXZfcm91bmR1cChpbm9kZXNfcGVyX2dyb3VwICogaW5vZGVzaXplLCBibG9ja3NpemUpICogYmxvY2tzaXplKSAvIGlub2Rlc2l6ZTsKKwkJLy8gbWFrZSBzdXJlIHRoZSBudW1iZXIgb2YgaW5vZGVzIHBlciBncm91cCBpcyBhIG11bHRpcGxlIG9mIDgKKwkJaW5vZGVzX3Blcl9ncm91cCAmPSB+NzsKKwkJaW5vZGVfdGFibGVfYmxvY2tzID0gZGl2X3JvdW5kdXAoaW5vZGVzX3Blcl9ncm91cCAqIGlub2Rlc2l6ZSwgYmxvY2tzaXplKTsKKworCQkvLyB0byBiZSB1c2VmdWwsIGxvc3QrZm91bmQgc2hvdWxkIG9jY3VweSBhdCBsZWFzdCAyIGJsb2NrcyAoYnV0IG5vdCBleGNlZWRpbmcgMTYqMTAyNCBieXRlcyksCisJCS8vIGFuZCBhdCBtb3N0IEVYVDJfTkRJUl9CTE9DS1MuIFNvIHJlc2VydmUgdGhlc2UgYmxvY2tzIHJpZ2h0IG5vdworCQkvKiBPciBlMmZzcHJvZ3MgY29tbWVudCB2ZXJiYXRpbSAod2hhdCBkb2VzIGl0IG1lYW4/KToKKwkJICogRW5zdXJlIHRoYXQgbG9zdCtmb3VuZCBpcyBhdCBsZWFzdCAyIGJsb2Nrcywgc28gd2UgYWx3YXlzCisJCSAqIHRlc3QgbGFyZ2UgZW1wdHkgYmxvY2tzIGZvciBiaWctYmxvY2sgZmlsZXN5c3RlbXMuICovCisJCWxvc3RfYW5kX2ZvdW5kX2Jsb2NrcyA9IE1JTihFWFQyX05ESVJfQkxPQ0tTLCAxNiA+PiAoYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRSkpOworCisJCS8vIHRoZSBsYXN0IGdyb3VwIG5lZWRzIG1vcmUgYXR0ZW50aW9uOiBpc24ndCBpdCB0b28gc21hbGwgZm9yIHBvc3NpYmxlIG92ZXJoZWFkPworCQlvdmVyaGVhZCA9IChoYXNfc3VwZXIobmdyb3VwcyAtIDEpID8gKDEvKnNiKi8gKyBncm91cF9kZXNjX2Jsb2NrcykgOiAwKSArIDEvKmJibXAqLyArIDEvKmlibXAqLyArIGlub2RlX3RhYmxlX2Jsb2NrczsKKwkJcmVtYWluZGVyID0gKG5ibG9ja3MgLSBmaXJzdF9ibG9jaykgJSBibG9ja3NfcGVyX2dyb3VwOworCQkvLy8vY2FuJ3QgaGFwcGVuLCBuYmxvY2tzID49IDYwIGd1YXJhbnRlZXMgdGhpcworCQkvLy8vaWYgKCgxID09IG5ncm91cHMpCisJCS8vLy8gJiYgcmVtYWluZGVyCisJCS8vLy8gJiYgKHJlbWFpbmRlciA8IG92ZXJoZWFkICsgMS8qICIvIiAqLyArIGxvc3RfYW5kX2ZvdW5kX2Jsb2NrcykKKwkJLy8vLykgeworCQkvLy8vCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3YXkgc21hbGwgZGV2aWNlIik7CisJCS8vLy99CisKKwkJLy8gU3RhbmRhcmQgbWtlMmZzIHVzZXMgNTAuIExvb2tzIGxpa2UgYSBidWcgaW4gb3VyIGNhbGN1bGF0aW9uCisJCS8vIG9mICJyZW1haW5kZXIiIG9yICJvdmVyaGVhZCIgLSB3ZSBkb24ndCBtYXRjaCBzdGFuZGFyZCBta2UyZnMKKwkJLy8gd2hlbiB3ZSB0cmFuc2l0aW9uIGZyb20gb25lIGdyb3VwIHRvIHR3byBncm91cHMKKwkJLy8gKGEgYml0IGFmdGVyIDhNIGltYWdlIHNpemUpLCBidXQgaXQgd29ya3MgZm9yIHR3by0+dGhyZWUgZ3JvdXBzCisJCS8vIHRyYW5zaXRpb24gKGF0IDE2TSkuCisJCWlmIChyZW1haW5kZXIgJiYgKHJlbWFpbmRlciA8IG92ZXJoZWFkICsgNTApKSB7CisvL2JiX2luZm9fbXNnKCJDSE9QWyV1XSIsIHJlbWFpbmRlcik7CisJCQluYmxvY2tzIC09IHJlbWFpbmRlcjsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwlpZiAobmJsb2Nrc19mdWxsIC0gbmJsb2NrcykKKwkJcHJpbnRmKCJ3YXJuaW5nOiAldSBibG9ja3MgdW51c2VkXG5cbiIsIG5ibG9ja3NfZnVsbCAtIG5ibG9ja3MpOworCXByaW50ZigKKwkJIkZpbGVzeXN0ZW0gbGFiZWw9JXNcbiIKKwkJIk9TIHR5cGU6IExpbnV4XG4iCisJCSJCbG9jayBzaXplPSV1IChsb2c9JXUpXG4iCisJCSJGcmFnbWVudCBzaXplPSV1IChsb2c9JXUpXG4iCisJCSIldSBpbm9kZXMsICV1IGJsb2Nrc1xuIgorCQkiJXUgYmxvY2tzICgldSUlKSByZXNlcnZlZCBmb3IgdGhlIHN1cGVyIHVzZXJcbiIKKwkJIkZpcnN0IGRhdGEgYmxvY2s9JXVcbiIKKwkJIk1heGltdW0gZmlsZXN5c3RlbSBibG9ja3M9JXVcbiIKKwkJIiV1IGJsb2NrIGdyb3Vwc1xuIgorCQkiJXUgYmxvY2tzIHBlciBncm91cCwgJXUgZnJhZ21lbnRzIHBlciBncm91cFxuIgorCQkiJXUgaW5vZGVzIHBlciBncm91cCIKKwkJLCBsYWJlbAorCQksIGJsb2Nrc2l6ZSwgYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRQorCQksIGJsb2Nrc2l6ZSwgYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRQorCQksIGlub2Rlc19wZXJfZ3JvdXAgKiBuZ3JvdXBzLCBuYmxvY2tzCisJCSwgbnJlc2VydmVkLCByZXNlcnZlZF9wZXJjZW50CisJCSwgZmlyc3RfYmxvY2sKKwkJLCBncm91cF9kZXNjX2Jsb2NrcyAqIChibG9ja3NpemUgLyAodW5zaWduZWQpc2l6ZW9mKCpnZCkpICogYmxvY2tzX3Blcl9ncm91cAorCQksIG5ncm91cHMKKwkJLCBibG9ja3NfcGVyX2dyb3VwLCBibG9ja3NfcGVyX2dyb3VwCisJCSwgaW5vZGVzX3Blcl9ncm91cAorCSk7CisJeworCQljb25zdCBjaGFyICpmbXQgPSAiXG5TdXBlcmJsb2NrIGJhY2t1cHMgc3RvcmVkIG9uIGJsb2NrczpcbiIKKwkJCSJcdCV1IjsKKwkJcG9zID0gZmlyc3RfYmxvY2s7CisJCWZvciAoaSA9IDE7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCXBvcyArPSBibG9ja3NfcGVyX2dyb3VwOworCQkJaWYgKGhhc19zdXBlcihpKSkgeworCQkJCXByaW50ZihmbXQsICh1bnNpZ25lZClwb3MpOworCQkJCWZtdCA9ICIsICV1IjsKKwkJCX0KKwkJfQorCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZShmZCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLy8gVE9ETzogMy81IHJlZnVzZSBpZiBtb3VudGVkCisJLy8gVE9ETzogNC81IGNvbXBhdCBvcHRpb25zCisJLy8gVE9ETzogMS81IHNhbml0eSBjaGVja3MKKwkvLyBUT0RPOiAwLzUgbW9yZSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzCisJLy8gVE9ETzogNC81IGJpZ2VuZGlhbm5lc3M6IHJlY2hlY2ssIHdhaXQgZm9yIEFSTSByZXBvcnRlcnMKKwkvLyBUT0RPOiAyLzUgcmVzZXJ2ZWQgR0RUOiBob3cgdG8gbWFyayBidXQgbm90IGFsbG9jYXRlPworCS8vIFRPRE86IDMvNSBkaXJfaW5kZXg/CisKKwkvLyBmaWxsIHRoZSBzdXBlcmJsb2NrCisJc2IgPSB4emFsbG9jKDEwMjQpOworCVNUT1JFX0xFKHNiLT5zX3Jldl9sZXZlbCwgRVhUMl9EWU5BTUlDX1JFVik7IC8vIHJldmlzaW9uIDEgZmlsZXN5c3RlbQorCVNUT1JFX0xFKHNiLT5zX21hZ2ljLCBFWFQyX1NVUEVSX01BR0lDKTsKKwlTVE9SRV9MRShzYi0+c19pbm9kZV9zaXplLCBpbm9kZXNpemUpOworCS8vIHNldCAiUmVxdWlyZWQgZXh0cmEgaXNpemUiIGFuZCAiRGVzaXJlZCBleHRyYSBpc2l6ZSIgZmllbGRzIHRvIDI4CisJaWYgKGlub2Rlc2l6ZSAhPSBzaXplb2YoKmlub2RlKSkKKwkJU1RPUkVfTEUoc2ItPnNfcmVzZXJ2ZWRbMjFdLCAweDAwMUMwMDFDKTsKKwlTVE9SRV9MRShzYi0+c19maXJzdF9pbm8sIEVYVDJfR09PRF9PTERfRklSU1RfSU5PKTsKKwlTVE9SRV9MRShzYi0+c19sb2dfYmxvY2tfc2l6ZSwgYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRSk7CisJU1RPUkVfTEUoc2ItPnNfbG9nX2ZyYWdfc2l6ZSwgYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRSk7CisJLy8gZmlyc3QgMTAyNCBieXRlcyBvZiB0aGUgZGV2aWNlIGFyZSBmb3IgYm9vdCByZWNvcmQuIElmIGJsb2NrIHNpemUgaXMgMTAyNCBieXRlcywgdGhlbgorCS8vIHRoZSBmaXJzdCBibG9jayBpcyAxLCBvdGhlcndpc2UgMAorCVNUT1JFX0xFKHNiLT5zX2ZpcnN0X2RhdGFfYmxvY2ssIGZpcnN0X2Jsb2NrKTsKKwkvLyBibG9jayBhbmQgaW5vZGUgYml0bWFwcyBvY2N1cHkgbm8gbW9yZSB0aGFuIG9uZSBibG9jaywgc28gbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIGlzCisJU1RPUkVfTEUoc2ItPnNfYmxvY2tzX3Blcl9ncm91cCwgYmxvY2tzX3Blcl9ncm91cCk7CisJU1RPUkVfTEUoc2ItPnNfZnJhZ3NfcGVyX2dyb3VwLCBibG9ja3NfcGVyX2dyb3VwKTsKKwkvLyBibG9ja3MKKwlTVE9SRV9MRShzYi0+c19ibG9ja3NfY291bnQsIG5ibG9ja3MpOworCS8vIHJlc2VydmUgYmxvY2tzIGZvciBzdXBlcnVzZXIKKwlTVE9SRV9MRShzYi0+c19yX2Jsb2Nrc19jb3VudCwgbnJlc2VydmVkKTsKKwkvLyBuaW5vZGVzCisJU1RPUkVfTEUoc2ItPnNfaW5vZGVzX3Blcl9ncm91cCwgaW5vZGVzX3Blcl9ncm91cCk7CisJU1RPUkVfTEUoc2ItPnNfaW5vZGVzX2NvdW50LCBpbm9kZXNfcGVyX2dyb3VwICogbmdyb3Vwcyk7CisJU1RPUkVfTEUoc2ItPnNfZnJlZV9pbm9kZXNfY291bnQsIGlub2Rlc19wZXJfZ3JvdXAgKiBuZ3JvdXBzIC0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCS8vIHRpbWVzdGFtcHMKKwl0aW1lc3RhbXAgPSB0aW1lKE5VTEwpOworCVNUT1JFX0xFKHNiLT5zX21rZnNfdGltZSwgdGltZXN0YW1wKTsKKwlTVE9SRV9MRShzYi0+c193dGltZSwgdGltZXN0YW1wKTsKKwlTVE9SRV9MRShzYi0+c19sYXN0Y2hlY2ssIHRpbWVzdGFtcCk7CisJLy8gbWlzYy4gVmFsdWVzIGFyZSBjaG9zZW4gdG8gbWF0Y2ggbWtlMmZzIDEuNDEuOQorCVNUT1JFX0xFKHNiLT5zX3N0YXRlLCAxKTsgLy8gVE9ETzogd2hhdCdzIDE/CisJU1RPUkVfTEUoc2ItPnNfY3JlYXRvcl9vcywgRVhUMl9PU19MSU5VWCk7CisJU1RPUkVfTEUoc2ItPnNfY2hlY2tpbnRlcnZhbCwgMjQqNjAqNjAgKiAxODApOyAvLyAxODAgZGF5cworCVNUT1JFX0xFKHNiLT5zX2Vycm9ycywgRVhUMl9FUlJPUlNfREVGQVVMVCk7CisJLy8gbWtlMmZzIDEuNDEuOSBhbHNvIHNldHMgRVhUM19GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUKKwkvLyBhbmQgaWYgPj0gMC41R0IsIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRS4KKwkvLyB3ZSB1c2UgdmFsdWVzIHdoaWNoIG1hdGNoICJta2UyZnMgLU8gXnJlc2l6ZV9pbm9kZSI6CisJLy8gaW4gdGhpcyBjYXNlIDEuNDEuOSBuZXZlciBzZXRzIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRS4KKwlTVE9SRV9MRShzYi0+c19mZWF0dXJlX2NvbXBhdCwgRVhUMl9GRUFUVVJFX0NPTVBBVF9TVVBQCisJCXwgKEVYVDJfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOTyAqIEVOQUJMRV9GRUFUVVJFX01LRlNfRVhUMl9SRVNFUlZFRF9HRFQpCisJCXwgKEVYVDJfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYICogRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX0RJUl9JTkRFWCkKKwkpOworCVNUT1JFX0xFKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQsIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSk7CisJU1RPUkVfTEUoc2ItPnNfZmVhdHVyZV9yb19jb21wYXQsIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKTsKKwlTVE9SRV9MRShzYi0+c19mbGFncywgRVhUMl9GTEFHU19VTlNJR05FRF9IQVNIICogRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX0RJUl9JTkRFWCk7CisJZ2VuZXJhdGVfdXVpZChzYi0+c191dWlkKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX0RJUl9JTkRFWCkgeworCQlTVE9SRV9MRShzYi0+c19kZWZfaGFzaF92ZXJzaW9uLCBFWFQyX0hBU0hfSEFMRl9NRDQpOworCQlnZW5lcmF0ZV91dWlkKCh1aW50OF90ICopc2ItPnNfaGFzaF9zZWVkKTsKKwl9CisJLyoKKwkgKiBGcm9tIGUyZnNwcm9nczogYWRkICJqaXR0ZXIiIHRvIHRoZSBzdXBlcmJsb2NrJ3MgY2hlY2sgaW50ZXJ2YWwgc28gdGhhdCB3ZQorCSAqIGRvbid0IGNoZWNrIGFsbCB0aGUgZmlsZXN5c3RlbXMgYXQgdGhlIHNhbWUgdGltZS4gIFdlIHVzZSBhCisJICoga2x1ZGd5IGhhY2sgb2YgdXNpbmcgdGhlIFVVSUQgdG8gZGVyaXZlIGEgcmFuZG9tIGppdHRlciB2YWx1ZS4KKwkgKi8KKwlTVE9SRV9MRShzYi0+c19tYXhfbW50X2NvdW50LAorCQlFWFQyX0RGTF9NQVhfTU5UX0NPVU5UCisJCSsgKHNiLT5zX3V1aWRbQVJSQVlfU0laRShzYi0+c191dWlkKS0xXSAlIEVYVDJfREZMX01BWF9NTlRfQ09VTlQpKTsKKworCS8vIHdyaXRlIHRoZSBsYWJlbAorCXNhZmVfc3RybmNweSgoY2hhciAqKXNiLT5zX3ZvbHVtZV9uYW1lLCBsYWJlbCwgc2l6ZW9mKHNiLT5zX3ZvbHVtZV9uYW1lKSk7CisKKwkvLyBjYWxjdWxhdGUgZmlsZXN5c3RlbSBza2VsZXRvbiBzdHJ1Y3R1cmVzCisJZ2QgPSB4emFsbG9jKGdyb3VwX2Rlc2NfYmxvY2tzICogYmxvY2tzaXplKTsKKwlidWYgPSB4bWFsbG9jKGJsb2Nrc2l6ZSk7CisJc2ItPnNfZnJlZV9ibG9ja3NfY291bnQgPSAwOworCWZvciAoaSA9IDAsIHBvcyA9IGZpcnN0X2Jsb2NrLCBuID0gbmJsb2NrcyAtIGZpcnN0X2Jsb2NrOworCQlpIDwgbmdyb3VwczsKKwkJaSsrLCBwb3MgKz0gYmxvY2tzX3Blcl9ncm91cCwgbiAtPSBibG9ja3NfcGVyX2dyb3VwCisJKSB7CisJCXVpbnQzMl90IG92ZXJoZWFkID0gcG9zICsgKGhhc19zdXBlcihpKSA/ICgxLypzYiovICsgZ3JvdXBfZGVzY19ibG9ja3MpIDogMCk7CisJCXVpbnQzMl90IGZyZWVfYmxvY2tzOworCQkvLyBmaWxsIGdyb3VwIGRlc2NyaXB0b3JzCisJCVNUT1JFX0xFKGdkW2ldLmJnX2Jsb2NrX2JpdG1hcCwgb3ZlcmhlYWQgKyAwKTsKKwkJU1RPUkVfTEUoZ2RbaV0uYmdfaW5vZGVfYml0bWFwLCBvdmVyaGVhZCArIDEpOworCQlTVE9SRV9MRShnZFtpXS5iZ19pbm9kZV90YWJsZSwgb3ZlcmhlYWQgKyAyKTsKKwkJb3ZlcmhlYWQgPSBvdmVyaGVhZCAtIHBvcyArIDEvKmJibXAqLyArIDEvKmlibXAqLyArIGlub2RlX3RhYmxlX2Jsb2NrczsKKwkJZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQgPSBpbm9kZXNfcGVyX2dyb3VwOworCQkvL1NUT1JFX0xFKGdkW2ldLmJnX3VzZWRfZGlyc19jb3VudCwgMCk7CisJCS8vIE4uQi4gYm90aCAiLyIgYW5kICIvbG9zdCtmb3VuZCIgYXJlIHdpdGhpbiB0aGUgZmlyc3QgYmxvY2sgZ3JvdXAKKwkJLy8gIi8iIG9jY3VwaWVzIDEgYmxvY2ssICIvbG9zdCtmb3VuZCIgb2NjdXBpZXMgbG9zdF9hbmRfZm91bmRfYmxvY2tzLi4uCisJCWlmICgwID09IGkpIHsKKwkJCS8vIC4uLiB0aHVzIGluY3JlYXNlZCBvdmVyaGVhZCBmb3IgdGhlIGZpcnN0IGJsb2NrIGdyb3VwIC4uLgorCQkJb3ZlcmhlYWQgKz0gMSArIGxvc3RfYW5kX2ZvdW5kX2Jsb2NrczsKKwkJCS8vIC4uLiBhbmQgMiB1c2VkIGRpcmVjdG9yaWVzCisJCQlTVE9SRV9MRShnZFtpXS5iZ191c2VkX2RpcnNfY291bnQsIDIpOworCQkJLy8gd2VsbCBrbm93biByZXNlcnZlZCBpbm9kZXMgYmVsb25nIHRvIHRoZSBmaXJzdCBibG9jayB0b28KKwkJCWdkW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50IC09IEVYVDJfR09PRF9PTERfRklSU1RfSU5POworCQl9CisKKwkJLy8gY2FjaGUgZnJlZSBibG9jayBjb3VudCBvZiB0aGUgZ3JvdXAKKwkJZnJlZV9ibG9ja3MgPSAobiA8IGJsb2Nrc19wZXJfZ3JvdXAgPyBuIDogYmxvY2tzX3Blcl9ncm91cCkgLSBvdmVyaGVhZDsKKworCQkvLyBtYXJrIHByZWFsbG9jYXRlZCBibG9ja3MgYXMgYWxsb2NhdGVkCisvL2JiX2luZm9fbXNnKCJBTExPQzogWyV1XVsldV1bJXVdIiwgYmxvY2tzaXplLCBvdmVyaGVhZCwgYmxvY2tzX3Blcl9ncm91cCAtIChmcmVlX2Jsb2NrcyArIG92ZXJoZWFkKSk7CisJCWFsbG9jYXRlKGJ1ZiwgYmxvY2tzaXplLAorCQkJLy8gcmVzZXJ2ZSAib3ZlcmhlYWQiIGJsb2NrcworCQkJb3ZlcmhlYWQsCisJCQkvLyBtYXJrIHVudXNlZCB0cmFpbGluZyBibG9ja3MKKwkJCWJsb2Nrc19wZXJfZ3JvdXAgLSAoZnJlZV9ibG9ja3MgKyBvdmVyaGVhZCkKKwkJKTsKKwkJLy8gZHVtcCBibG9jayBiaXRtYXAKKwkJUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFtpXS5iZ19ibG9ja19iaXRtYXApKSAqIGJsb2Nrc2l6ZSwgYnVmLCBibG9ja3NpemUpOworCQlTVE9SRV9MRShnZFtpXS5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgZnJlZV9ibG9ja3MpOworCisJCS8vIG1hcmsgcHJlYWxsb2NhdGVkIGlub2RlcyBhcyBhbGxvY2F0ZWQKKwkJYWxsb2NhdGUoYnVmLCBibG9ja3NpemUsCisJCQkvLyBtYXJrIHJlc2VydmVkIGlub2RlcworCQkJaW5vZGVzX3Blcl9ncm91cCAtIGdkW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50LAorCQkJLy8gbWFyayB1bnVzZWQgdHJhaWxpbmcgaW5vZGVzCisJCQlibG9ja3NfcGVyX2dyb3VwIC0gaW5vZGVzX3Blcl9ncm91cAorCQkpOworCQkvLyBkdW1wIGlub2RlIGJpdG1hcAorCQkvL1BVVCgodWludDY0X3QpKEZFVENIX0xFMzIoZ2RbaV0uYmdfYmxvY2tfYml0bWFwKSkgKiBibG9ja3NpemUsIGJ1ZiwgYmxvY2tzaXplKTsKKwkJLy9idXQgaXQncyByaWdodCBhZnRlciBibG9jayBiaXRtYXAsIHNvIHdlIGNhbiBqdXN0OgorCQl4d3JpdGUoZmQsIGJ1ZiwgYmxvY2tzaXplKTsKKwkJU1RPUkVfTEUoZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQsIGdkW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKworCQkvLyBjb3VudCBvdmVyYWxsIGZyZWUgYmxvY2tzCisJCXNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50ICs9IGZyZWVfYmxvY2tzOworCX0KKwlTVE9SRV9MRShzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCwgc2ItPnNfZnJlZV9ibG9ja3NfY291bnQpOworCisJLy8gZHVtcCBmaWxlc3lzdGVtIHNrZWxldG9uIHN0cnVjdHVyZXMKKy8vCXByaW50ZigiV3JpdGluZyBzdXBlcmJsb2NrcyBhbmQgZmlsZXN5c3RlbSBhY2NvdW50aW5nIGluZm9ybWF0aW9uOiAiKTsKKwlmb3IgKGkgPSAwLCBwb3MgPSBmaXJzdF9ibG9jazsgaSA8IG5ncm91cHM7IGkrKywgcG9zICs9IGJsb2Nrc19wZXJfZ3JvdXApIHsKKwkJLy8gZHVtcCBzdXBlcmJsb2NrIGFuZCBncm91cCBkZXNjcmlwdG9ycyBhbmQgdGhlaXIgYmFja3VwcworCQlpZiAoaGFzX3N1cGVyKGkpKSB7CisJCQkvLyBOLkIuIDEwMjQgYnl0ZSBibG9ja3MgYXJlIHNwZWNpYWwKKwkJCVBVVCgoKHVpbnQ2NF90KXBvcyAqIGJsb2Nrc2l6ZSkgKyAoKDAgPT0gaSAmJiAxMDI0ICE9IGJsb2Nrc2l6ZSkgPyAxMDI0IDogMCksCisJCQkJCXNiLCAxMDI0KTsKKwkJCVBVVCgoKHVpbnQ2NF90KXBvcyAqIGJsb2Nrc2l6ZSkgKyBibG9ja3NpemUsCisJCQkJCWdkLCBncm91cF9kZXNjX2Jsb2NrcyAqIGJsb2Nrc2l6ZSk7CisJCX0KKwl9CisKKwkvLyB6ZXJvIGJvb3Qgc2VjdG9ycworCW1lbXNldChidWYsIDAsIGJsb2Nrc2l6ZSk7CisJUFVUKDAsIGJ1ZiwgMTAyNCk7IC8vIE4uQi4gMTAyNCA8PSBibG9ja3NpemUsIHNvIGJ1ZlswLi4xMDIzXSBjb250YWlucyB6ZXJvcworCS8vIHplcm8gaW5vZGUgdGFibGVzCisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7ICsraSkKKwkJZm9yIChuID0gMDsgbiA8IGlub2RlX3RhYmxlX2Jsb2NrczsgKytuKQorCQkJUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFtpXS5iZ19pbm9kZV90YWJsZSkgKyBuKSAqIGJsb2Nrc2l6ZSwKKwkJCQlidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBwcmVwYXJlIGRpcmVjdG9yeSBpbm9kZQorCWlub2RlID0gKHN0cnVjdCBleHQyX2lub2RlICopYnVmOworCVNUT1JFX0xFKGlub2RlLT5pX21vZGUsIFNfSUZESVIgfCBTX0lSV1hVIHwgU19JUkdSUCB8IFNfSVJPVEggfCBTX0lYR1JQIHwgU19JWE9USCk7CisJU1RPUkVfTEUoaW5vZGUtPmlfbXRpbWUsIHRpbWVzdGFtcCk7CisJU1RPUkVfTEUoaW5vZGUtPmlfYXRpbWUsIHRpbWVzdGFtcCk7CisJU1RPUkVfTEUoaW5vZGUtPmlfY3RpbWUsIHRpbWVzdGFtcCk7CisJU1RPUkVfTEUoaW5vZGUtPmlfc2l6ZSwgYmxvY2tzaXplKTsKKwkvLyBpbm9kZS0+aV9ibG9ja3Mgc3RvcmVzIHRoZSBudW1iZXIgb2YgNTEyIGJ5dGUgZGF0YSBibG9ja3MKKwkvLyAoNTEyLCBiZWNhdXNlIGl0IGdvZXMgZGlyZWN0bHkgdG8gc3RydWN0IHN0YXQgd2l0aG91dCBzY2FsaW5nKQorCVNUT1JFX0xFKGlub2RlLT5pX2Jsb2NrcywgYmxvY2tzaXplIC8gNTEyKTsKKworCS8vIGR1bXAgcm9vdCBkaXIgaW5vZGUKKwlTVE9SRV9MRShpbm9kZS0+aV9saW5rc19jb3VudCwgMyk7IC8vICIvLiIsICIvLi4iLCAiL2xvc3QrZm91bmQvLi4iIHBvaW50IHRvIHRoaXMgaW5vZGUKKwlTVE9SRV9MRShpbm9kZS0+aV9ibG9ja1swXSwgRkVUQ0hfTEUzMihnZFswXS5iZ19pbm9kZV90YWJsZSkgKyBpbm9kZV90YWJsZV9ibG9ja3MpOworCVBVVCgoKHVpbnQ2NF90KUZFVENIX0xFMzIoZ2RbMF0uYmdfaW5vZGVfdGFibGUpICogYmxvY2tzaXplKSArIChFWFQyX1JPT1RfSU5PLTEpICogaW5vZGVzaXplLAorCQkJCWJ1ZiwgaW5vZGVzaXplKTsKKworCS8vIGR1bXAgbG9zdCtmb3VuZCBkaXIgaW5vZGUKKwlTVE9SRV9MRShpbm9kZS0+aV9saW5rc19jb3VudCwgMik7IC8vIGJvdGggIi9sb3N0K2ZvdW5kIiBhbmQgIi9sb3N0K2ZvdW5kLy4iIHBvaW50IHRvIHRoaXMgaW5vZGUKKwlTVE9SRV9MRShpbm9kZS0+aV9zaXplLCBsb3N0X2FuZF9mb3VuZF9ibG9ja3MgKiBibG9ja3NpemUpOworCVNUT1JFX0xFKGlub2RlLT5pX2Jsb2NrcywgKGxvc3RfYW5kX2ZvdW5kX2Jsb2NrcyAqIGJsb2Nrc2l6ZSkgLyA1MTIpOworCW4gPSBGRVRDSF9MRTMyKGlub2RlLT5pX2Jsb2NrWzBdKSArIDE7CisJZm9yIChpID0gMDsgaSA8IGxvc3RfYW5kX2ZvdW5kX2Jsb2NrczsgKytpKQorCQlTVE9SRV9MRShpbm9kZS0+aV9ibG9ja1tpXSwgaSArIG4pOyAvLyB1c2UgbmV4dCBibG9jaworLy9iYl9pbmZvX21zZygiTEFTVCBCTE9DSyBVU0VEWyV1XSIsIGkgKyBuKTsKKwlQVVQoKCh1aW50NjRfdClGRVRDSF9MRTMyKGdkWzBdLmJnX2lub2RlX3RhYmxlKSAqIGJsb2Nrc2l6ZSkgKyAoRVhUMl9HT09EX09MRF9GSVJTVF9JTk8tMSkgKiBpbm9kZXNpemUsCisJCQkJYnVmLCBpbm9kZXNpemUpOworCisJLy8gZHVtcCBkaXJlY3RvcmllcworCW1lbXNldChidWYsIDAsIGJsb2Nrc2l6ZSk7CisJZGlyID0gKHN0cnVjdCBleHQyX2RpciAqKWJ1ZjsKKworCS8vIGR1bXAgMm5kKyBibG9ja3Mgb2YgIi9sb3N0K2ZvdW5kIgorCVNUT1JFX0xFKGRpci0+cmVjX2xlbjEsIGJsb2Nrc2l6ZSk7IC8vIGUyZnNjayAxLjQxLjQgY29tcGF0ICgxLjQxLjkgZG9lcyBub3QgbmVlZCB0aGlzKQorCWZvciAoaSA9IDE7IGkgPCBsb3N0X2FuZF9mb3VuZF9ibG9ja3M7ICsraSkKKwkJUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFswXS5iZ19pbm9kZV90YWJsZSkgKyBpbm9kZV90YWJsZV9ibG9ja3MgKyAxK2kpICogYmxvY2tzaXplLAorCQkJCWJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIGR1bXAgMXN0IGJsb2NrIG9mICIvbG9zdCtmb3VuZCIKKwlTVE9SRV9MRShkaXItPmlub2RlMSwgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCVNUT1JFX0xFKGRpci0+cmVjX2xlbjEsIDEyKTsKKwlTVE9SRV9MRShkaXItPm5hbWVfbGVuMSwgMSk7CisJU1RPUkVfTEUoZGlyLT5maWxlX3R5cGUxLCBFWFQyX0ZUX0RJUik7CisJZGlyLT5uYW1lMVswXSA9ICcuJzsKKwlTVE9SRV9MRShkaXItPmlub2RlMiwgRVhUMl9ST09UX0lOTyk7CisJU1RPUkVfTEUoZGlyLT5yZWNfbGVuMiwgYmxvY2tzaXplIC0gMTIpOworCVNUT1JFX0xFKGRpci0+bmFtZV9sZW4yLCAyKTsKKwlTVE9SRV9MRShkaXItPmZpbGVfdHlwZTIsIEVYVDJfRlRfRElSKTsKKwlkaXItPm5hbWUyWzBdID0gJy4nOyBkaXItPm5hbWUyWzFdID0gJy4nOworCVBVVCgodWludDY0X3QpKEZFVENIX0xFMzIoZ2RbMF0uYmdfaW5vZGVfdGFibGUpICsgaW5vZGVfdGFibGVfYmxvY2tzICsgMSkgKiBibG9ja3NpemUsIGJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIGR1bXAgcm9vdCBkaXIgYmxvY2sKKwlTVE9SRV9MRShkaXItPmlub2RlMSwgRVhUMl9ST09UX0lOTyk7CisJU1RPUkVfTEUoZGlyLT5yZWNfbGVuMiwgMTIpOworCVNUT1JFX0xFKGRpci0+aW5vZGUzLCBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJU1RPUkVfTEUoZGlyLT5yZWNfbGVuMywgYmxvY2tzaXplIC0gMTIgLSAxMik7CisJU1RPUkVfTEUoZGlyLT5uYW1lX2xlbjMsIDEwKTsKKwlTVE9SRV9MRShkaXItPmZpbGVfdHlwZTMsIEVYVDJfRlRfRElSKTsKKwlzdHJjcHkoZGlyLT5uYW1lMywgImxvc3QrZm91bmQiKTsKKwlQVVQoKHVpbnQ2NF90KShGRVRDSF9MRTMyKGdkWzBdLmJnX2lub2RlX3RhYmxlKSArIGlub2RlX3RhYmxlX2Jsb2NrcyArIDApICogYmxvY2tzaXplLCBidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBjbGVhbnVwCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoYnVmKTsKKwkJZnJlZShnZCk7CisJCWZyZWUoc2IpOworCX0KKworCXhjbG9zZShmZCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbWtmc19leHQyLnR4dCBiL3V0aWwtbGludXgvbWtmc19leHQyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNkNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ta2ZzX2V4dDIudHh0CkBAIC0wLDAgKzEsNzcgQEAKK0RpZmZlcmVuY2UgYmV0d2VlbiBiYm94IG1rZTJmcyBhbmQgc3RhbmRhcmQgb25lIChkdW1wZTJmcyBjb21wYXJpc29uKToKKworW3VwZDogaW5vZGUgc2l6ZSBoYXMgYmVlbiBmaXhlZCBzaW5jZSB0aGVuXQorCitUd28gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXM6CistIHN0YW5kYXJkIG1rZTJmcyBoYXMgcmVzaXplX2lub2RlIGZlYXR1cmUgYW5kIHRodXMgaGFzIHJlc2VydmVkIEdEVCBibG9ja3MsCisgIHdoaWNoIGRlY3JlYXNlcyBmcmVlIGJsb2NrczsKKy0gaW5vZGUgc2l6ZTogMTI4LzI1NiAoc2luY2UgNjc5ODA3ayBpcyA+MC41Rywgc3RhbmRhcmQgbWtlMmZzIHVzZXMgImJpZyIgaW5vZGVzKQorICB0aGlzIGFmZmVjdHMgaW5vZGUgdGFibGUgaW4gYmxvY2sgZ3JvdXBzCisKK0ZpbGVzeXN0ZW0gdm9sdW1lIG5hbWU6ICAgPG5vbmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gdm9sdW1lIG5hbWU6ICAgPG5vbmU+CitMYXN0IG1vdW50ZWQgb246ICAgICAgICAgIDxub3QgYXZhaWxhYmxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IG1vdW50ZWQgb246ICAgICAgICAgIDxub3QgYXZhaWxhYmxlPgorRmlsZXN5c3RlbSBVVUlEOiAgICAgICAgICBmNDgzOTc2MC1jODliLTQ0YjctYWM1Mi0wOGI0ZTMyNmMwYjQgICAgICAgICAgRmlsZXN5c3RlbSBVVUlEOiAgICAgICAgICA3MTE3OTU1OC04YzhlLTRhNTYtYWQ1NC0wMTgwMDhmNWMzNTgKK0ZpbGVzeXN0ZW0gbWFnaWMgbnVtYmVyOiAgMHhFRjUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gbWFnaWMgbnVtYmVyOiAgMHhFRjUzCitGaWxlc3lzdGVtIHJldmlzaW9uICM6ICAgIDEgKGR5bmFtaWMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIHJldmlzaW9uICM6ICAgIDEgKGR5bmFtaWMpCitGaWxlc3lzdGVtIGZlYXR1cmVzOiAgICAgIGV4dF9hdHRyIGRpcl9pbmRleCBmaWxldHlwZSBzcGFyc2Vfc3VwZXIgICAgICBGaWxlc3lzdGVtIGZlYXR1cmVzOiAgICAgIGV4dF9hdHRyIHJlc2l6ZV9pbm9kZSBkaXJfaW5kZXggZmlsZXR5cGUgc3BhcnNlX3N1cGVyIGxhcmdlX2ZpbGUKK0ZpbGVzeXN0ZW0gZmxhZ3M6ICAgICAgICAgc2lnbmVkX2RpcmVjdG9yeV9oYXNoICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gZmxhZ3M6ICAgICAgICAgc2lnbmVkX2RpcmVjdG9yeV9oYXNoCitEZWZhdWx0IG1vdW50IG9wdGlvbnM6ICAgIChub25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IG1vdW50IG9wdGlvbnM6ICAgIChub25lKQorRmlsZXN5c3RlbSBzdGF0ZTogICAgICAgICBjbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSBzdGF0ZTogICAgICAgICBjbGVhbgorRXJyb3JzIGJlaGF2aW9yOiAgICAgICAgICBDb250aW51ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzIGJlaGF2aW9yOiAgICAgICAgICBDb250aW51ZQorRmlsZXN5c3RlbSBPUyB0eXBlOiAgICAgICBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSBPUyB0eXBlOiAgICAgICBMaW51eAorSW5vZGUgY291bnQ6ICAgICAgICAgICAgICA0MjYyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGUgY291bnQ6ICAgICAgICAgICAgICA0MjUyOAorQmxvY2sgY291bnQ6ICAgICAgICAgICAgICAxNjk5NTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2sgY291bnQ6ICAgICAgICAgICAgICAxNjk5NTEKK1Jlc2VydmVkIGJsb2NrIGNvdW50OiAgICAgODQ5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIGJsb2NrIGNvdW50OiAgICAgODQ5NworRnJlZSBibG9ja3M6ICAgICAgICAgICAgICAxNjg1OTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBibG9ja3M6ICAgICAgICAgICAgICAxNjcxMDMKK0ZyZWUgaW5vZGVzOiAgICAgICAgICAgICAgNDI2MTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgaW5vZGVzOiAgICAgICAgICAgICAgNDI1MTcKK0ZpcnN0IGJsb2NrOiAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0IGJsb2NrOiAgICAgICAgICAgICAgMAorQmxvY2sgc2l6ZTogICAgICAgICAgICAgICA0MDk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2sgc2l6ZTogICAgICAgICAgICAgICA0MDk2CitGcmFnbWVudCBzaXplOiAgICAgICAgICAgIDQwOTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBzaXplOiAgICAgICAgICAgIDQwOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIEdEVCBibG9ja3M6ICAgICAgNDEKK0Jsb2NrcyBwZXIgZ3JvdXA6ICAgICAgICAgMzI3NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrcyBwZXIgZ3JvdXA6ICAgICAgICAgMzI3NjgKK0ZyYWdtZW50cyBwZXIgZ3JvdXA6ICAgICAgMzI3NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50cyBwZXIgZ3JvdXA6ICAgICAgMzI3NjgKK0lub2RlcyBwZXIgZ3JvdXA6ICAgICAgICAgNzEwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlcyBwZXIgZ3JvdXA6ICAgICAgICAgNzA4OAorSW5vZGUgYmxvY2tzIHBlciBncm91cDogICAyMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGUgYmxvY2tzIHBlciBncm91cDogICA0NDMKK0ZpbGVzeXN0ZW0gY3JlYXRlZDogICAgICAgV2VkIE9jdCAyMSAxMzo0MDo1NSAyMDA5ICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gY3JlYXRlZDogICAgICAgV2VkIE9jdCAyMSAxMzo0MDo1NSAyMDA5CitMYXN0IG1vdW50IHRpbWU6ICAgICAgICAgIG4vYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IG1vdW50IHRpbWU6ICAgICAgICAgIG4vYQorTGFzdCB3cml0ZSB0aW1lOiAgICAgICAgICBXZWQgT2N0IDIxIDEzOjQwOjU1IDIwMDkgICAgICAgICAgICAgICAgICAgICAgTGFzdCB3cml0ZSB0aW1lOiAgICAgICAgICBXZWQgT2N0IDIxIDEzOjQwOjU1IDIwMDkKK01vdW50IGNvdW50OiAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdW50IGNvdW50OiAgICAgICAgICAgICAgMAorTWF4aW11bSBtb3VudCBjb3VudDogICAgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSBtb3VudCBjb3VudDogICAgICAzNworTGFzdCBjaGVja2VkOiAgICAgICAgICAgICBXZWQgT2N0IDIxIDEzOjQwOjU1IDIwMDkgICAgICAgICAgICAgICAgICAgICAgTGFzdCBjaGVja2VkOiAgICAgICAgICAgICBXZWQgT2N0IDIxIDEzOjQwOjU1IDIwMDkKK0NoZWNrIGludGVydmFsOiAgICAgICAgICAgMTU1NTIwMDAgKDYgbW9udGhzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGludGVydmFsOiAgICAgICAgICAgMTU1NTIwMDAgKDYgbW9udGhzKQorTmV4dCBjaGVjayBhZnRlcjogICAgICAgICBNb24gQXByIDE5IDEzOjQwOjU1IDIwMTAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBjaGVjayBhZnRlcjogICAgICAgICBNb24gQXByIDE5IDEzOjQwOjU1IDIwMTAKK1Jlc2VydmVkIGJsb2NrcyB1aWQ6ICAgICAgMCAodXNlciByb290KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIGJsb2NrcyB1aWQ6ICAgICAgMCAodXNlciByb290KQorUmVzZXJ2ZWQgYmxvY2tzIGdpZDogICAgICAwIChncm91cCByb290KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgYmxvY2tzIGdpZDogICAgICAwIChncm91cCByb290KQorRmlyc3QgaW5vZGU6ICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyc3QgaW5vZGU6ICAgICAgICAgICAgICAxMQorSW5vZGUgc2l6ZTogICAgICAgICAgICAgICAxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGUgc2l6ZTogICAgICAgICAgICAgICAyNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGV4dHJhIGlzaXplOiAgICAgMjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWQgZXh0cmEgaXNpemU6ICAgICAgMjgKK0RlZmF1bHQgZGlyZWN0b3J5IGhhc2g6ICAgaGFsZl9tZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZGlyZWN0b3J5IGhhc2g6ICAgaGFsZl9tZDQKK0RpcmVjdG9yeSBIYXNoIFNlZWQ6ICAgICAgZmY5NGQwNDctYzljYS00ZmU1LWI1NTMtOTM3YTc2MTAxYTg5ICAgICAgICAgIERpcmVjdG9yeSBIYXNoIFNlZWQ6ICAgICAgYzI3MGZkNDMtOTg2OC00YTkyLWFlOTktMDUwMDk4ZTEyODM1CisKKworR3JvdXAgMDogKEJsb2NrcyAwLTMyNzY3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgMDogKEJsb2NrcyAwLTMyNzY3KQorICBQcmltYXJ5IHN1cGVyYmxvY2sgYXQgMCwgR3JvdXAgZGVzY3JpcHRvcnMgYXQgMS0xICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5IHN1cGVyYmxvY2sgYXQgMCwgR3JvdXAgZGVzY3JpcHRvcnMgYXQgMS0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIEdEVCBibG9ja3MgYXQgMi00MgorICBCbG9jayBiaXRtYXAgYXQgMiAoKzIpLCBJbm9kZSBiaXRtYXAgYXQgMyAoKzMpICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBiaXRtYXAgYXQgNDMgKCs0MyksIElub2RlIGJpdG1hcCBhdCA0NCAoKzQ0KQorICBJbm9kZSB0YWJsZSBhdCA0LTIyNSAoKzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZSB0YWJsZSBhdCA0NS00ODcgKCs0NSkKKyAgMzI1MzcgZnJlZSBibG9ja3MsIDcwOTMgZnJlZSBpbm9kZXMsIDIgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAgICAgMzIyNzQgZnJlZSBibG9ja3MsIDcwNzcgZnJlZSBpbm9kZXMsIDIgZGlyZWN0b3JpZXMKKyAgRnJlZSBibG9ja3M6IDIzMS0zMjc2NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBibG9ja3M6IDQ5NC0zMjc2NworICBGcmVlIGlub2RlczogMTItNzEwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGlub2RlczogMTItNzA4OAorCitHcm91cCAxOiAoQmxvY2tzIDMyNzY4LTY1NTM1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCAxOiAoQmxvY2tzIDMyNzY4LTY1NTM1KQorICBCYWNrdXAgc3VwZXJibG9jayBhdCAzMjc2OCwgR3JvdXAgZGVzY3JpcHRvcnMgYXQgMzI3NjktMzI3NjkgICAgICAgICAgICBCYWNrdXAgc3VwZXJibG9jayBhdCAzMjc2OCwgR3JvdXAgZGVzY3JpcHRvcnMgYXQgMzI3NjktMzI3NjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgR0RUIGJsb2NrcyBhdCAzMjc3MC0zMjgxMAorICBCbG9jayBiaXRtYXAgYXQgMzI3NzAgKCsyKSwgSW5vZGUgYml0bWFwIGF0IDMyNzcxICgrMykgICAgICAgICAgICAgICAgICBCbG9jayBiaXRtYXAgYXQgMzI4MTEgKCs0MyksIElub2RlIGJpdG1hcCBhdCAzMjgxMiAoKzQ0KQorICBJbm9kZSB0YWJsZSBhdCAzMjc3Mi0zMjk5MyAoKzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZSB0YWJsZSBhdCAzMjgxMy0zMzI1NSAoKzQ1KQorICAzMjU0MiBmcmVlIGJsb2NrcywgNzEwNCBmcmVlIGlub2RlcywgMCBkaXJlY3RvcmllcyAgICAgICAgICAgICAgICAgICAgICAzMjI4MCBmcmVlIGJsb2NrcywgNzA4OCBmcmVlIGlub2RlcywgMCBkaXJlY3RvcmllcworICBGcmVlIGJsb2NrczogMzI5OTQtNjU1MzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGJsb2NrczogMzMyNTYtNjU1MzUKKyAgRnJlZSBpbm9kZXM6IDcxMDUtMTQyMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBpbm9kZXM6IDcwODktMTQxNzYKKworR3JvdXAgMjogKEJsb2NrcyA2NTUzNi05ODMwMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgMjogKEJsb2NrcyA2NTUzNi05ODMwMykKKyAgQmxvY2sgYml0bWFwIGF0IDY1NTM2ICgrMCksIElub2RlIGJpdG1hcCBhdCA2NTUzNyAoKzEpICAgICAgICAgICAgICAgICAgQmxvY2sgYml0bWFwIGF0IDY1NTM2ICgrMCksIElub2RlIGJpdG1hcCBhdCA2NTUzNyAoKzEpCisgIElub2RlIHRhYmxlIGF0IDY1NTM4LTY1NzU5ICgrMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlIHRhYmxlIGF0IDY1NTM4LTY1OTgwICgrMikKKyAgMzI1NDQgZnJlZSBibG9ja3MsIDcxMDQgZnJlZSBpbm9kZXMsIDAgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAgICAgMzIzMjMgZnJlZSBibG9ja3MsIDcwODggZnJlZSBpbm9kZXMsIDAgZGlyZWN0b3JpZXMKKyAgRnJlZSBibG9ja3M6IDY1NzYwLTk4MzAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBibG9ja3M6IDY1OTgxLTk4MzAzCisgIEZyZWUgaW5vZGVzOiAxNDIwOS0yMTMxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgaW5vZGVzOiAxNDE3Ny0yMTI2NAorLi4uCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21rZnNfZXh0Ml90ZXN0LnNoIGIvdXRpbC1saW51eC9ta2ZzX2V4dDJfdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTM0N2NjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ta2ZzX2V4dDJfdGVzdC5zaApAQCAtMCwwICsxLDEwNCBAQAorIyEvYmluL3NoCisKKyMgRGlzYWJsaW5nIGZlYXR1cmVzIHdlIGRvIG5vdCBtYXRjaCBleGFjdGx5Ogorc3lzdGVtX21rZTJmcz0nL3NiaW4vbWtlMmZzIC1PIF5yZXNpemVfaW5vZGUnCitiYm94X21rZTJmcz0nLi9idXN5Ym94IG1rZTJmcycKKworZ2VuX2ltYWdlKCkgeyAjIHBhcmFtczogbWtlMmZzX2ludm9jYXRpb24gaW1hZ2VfbmFtZQorICAgID4kMgorICAgIGRkIHNlZWs9JCgoa2lsb2J5dGVzLTEpKSBicz0xSyBjb3VudD0xIDwvZGV2L3plcm8gb2Y9JDIgPi9kZXYvbnVsbCAyPiYxIHx8IGV4aXQgMQorICAgICQxIC1GICQyICRraWxvYnl0ZXMgPiQyLnJhd19vdXQgMj4mMSB8fCByZXR1cm4gMQorICAgIGNhdCAkMi5yYXdfb3V0IFwKKyAgICB8IGdyZXAgLXYgJ15ta2UyZnMgWzAtOV0qXC5bMC05XSpcLlswLTldKiAnIFwKKyAgICB8IGdyZXAgLXYgJ15NYXhpbXVtIGZpbGVzeXN0ZW0nIFwKKyAgICB8IGdyZXAgLXYgJ15Xcml0aW5nIGlub2RlIHRhYmxlcycgXAorICAgIHwgZ3JlcCAtdiAnXldyaXRpbmcgc3VwZXJibG9ja3MgYW5kIGZpbGVzeXN0ZW0gYWNjb3VudGluZyBpbmZvcm1hdGlvbicgXAorICAgIHwgZ3JlcCAtdiAnXlRoaXMgZmlsZXN5c3RlbSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2hlY2tlZCBldmVyeScgXAorICAgIHwgZ3JlcCAtdiAnXjE4MCBkYXlzLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QnIFwKKyAgICB8IHNlZCAncy9ibG9ja3MqIHVudXNlZC4vYmxvY2tzIHVudXNlZC8nIFwKKyAgICB8IHNlZCAncy9ibG9jayBncm91cHMqL2Jsb2NrIGdyb3Vwcy8nIFwKKyAgICB8IHNlZCAncy8gKiQvLycgXAorICAgIHwgc2VkICdzL2Jsb2NrcyAoLiolKSByZXNlcnZlZC9ibG9ja3MgcmVzZXJ2ZWQvJyBcCisgICAgfCBncmVwIC12ICdeJCcgXAorICAgID4kMi5vdXQKK30KKwordGVzdF9ta2UyZnMoKSB7CisgICAgZWNobyBUZXN0aW5nICRraWxvYnl0ZXMKKworICAgIGdlbl9pbWFnZSAiJHN5c3RlbV9ta2UyZnMiIGltYWdlX3N0ZCB8fCByZXR1cm4gMQorICAgIGdlbl9pbWFnZSAiJGJib3hfbWtlMmZzIiAgIGltYWdlX2JiICB8fCByZXR1cm4gMQorCisgICAgZGlmZiAtdWEgaW1hZ2VfYmIub3V0IGltYWdlX3N0ZC5vdXQgPmltYWdlLm91dC5kaWZmIHx8IHsKKwljYXQgaW1hZ2Uub3V0LmRpZmYKKwlyZXR1cm4gMQorICAgIH0KKworICAgIGUyZnNjayAtZiAtbiBpbWFnZV9iYiA+aW1hZ2VfYmJfZTJmc2NrLm91dCAyPiYxIHx8IHsKKwllY2hvICJlMmZzY2sgZXJyb3Igb24gaW1hZ2VfYmIiCisJY2F0IGltYWdlX2JiX2UyZnNjay5vdXQKKwlleGl0IDEKKyAgICB9Cit9CisKKyMgLTpiYm94ICs6c3RhbmRhcmQKKworIyBraWxvYnl0ZXM9NjAgaXMgdGhlIG1pbmltYWwgYWxsb3dlZCBzaXplCitraWxvYnl0ZXM9NjAKK3doaWxlIHRydWU7IGRvCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCisgICAgOiAkKChraWxvYnl0ZXMrKykpCisgICAgdGVzdCAka2lsb2J5dGVzID0gMjAwICYmIGJyZWFrCitkb25lCisKKyMgVHJhbnNpdGlvbiBmcm9tIG9uZSBibG9jayBncm91cCB0byB0d28KKyMgZmFpbHMgaW4gWzgzNzguLjg0MTBdIHJhbmdlIHVubGVzcyAtTyBecmVzaXplX2lub2RlCitraWxvYnl0ZXM9JCgoMSAqIDgqMTAyNCAtIDUwKSkKK3doaWxlIHRydWU7IGRvCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCisgICAgOiAkKChraWxvYnl0ZXMrKykpCisgICAgdGVzdCAka2lsb2J5dGVzID0gJCgoMSAqIDgqMTAyNCArIDMwMCkpICYmIGJyZWFrCitkb25lCisKKyMgVHJhbnNpdGlvbiBmcm9tIDIgYmxvY2sgZ3JvdXBzIHRvIDMKKyMgd29ya3MKK2tpbG9ieXRlcz0kKCgyICogOCoxMDI0IC0gNTApKQord2hpbGUgdHJ1ZTsgZG8KKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKKyAgICA6ICQoKGtpbG9ieXRlcysrKSkKKyAgICB0ZXN0ICRraWxvYnl0ZXMgPSAkKCgyICogOCoxMDI0ICsgNDAwKSkgJiYgYnJlYWsKK2RvbmUKKworIyBUcmFuc2l0aW9uIGZyb20gMyBibG9jayBncm91cHMgdG8gNAorIyBmYWlscyBpbiBbMjQ4MjUuLjI0OTIyXSByYW5nZSB1bmxlc3MgLU8gXnJlc2l6ZV9pbm9kZQora2lsb2J5dGVzPSQoKDMgKiA4KjEwMjQgLSA1MCkpCit3aGlsZSB0cnVlOyBkbworICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorICAgIDogJCgoa2lsb2J5dGVzKyspKQorICAgIHRlc3QgJGtpbG9ieXRlcyA9ICQoKDMgKiA4KjEwMjQgKyA1MDApKSAmJiBicmVhaworZG9uZQorCisjIFRyYW5zaXRpb24gZnJvbSA0IGJsb2NrIGdyb3VwcyB0byA1CisjIHdvcmtzCitraWxvYnl0ZXM9JCgoNCAqIDgqMTAyNCAtIDUwKSkKK3doaWxlIHRydWU7IGRvCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCisgICAgOiAkKChraWxvYnl0ZXMrKykpCisgICAgdGVzdCAka2lsb2J5dGVzID0gJCgoNCAqIDgqMTAyNCArIDYwMCkpICYmIGJyZWFrCitkb25lCisKKyMgVHJhbnNpdGlvbiBmcm9tIDUgYmxvY2sgZ3JvdXBzIHRvIDYKKyMgZmFpbHMgaW4gWzQxMjMwLi40MTM5MV0gcmFuZ2UgdW5sZXNzIC1PIF5yZXNpemVfaW5vZGUKK2tpbG9ieXRlcz0kKCg1ICogOCoxMDI0IC0gNTApKQord2hpbGUgdHJ1ZTsgZG8KKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKKyAgICA6ICQoKGtpbG9ieXRlcysrKSkKKyAgICB0ZXN0ICRraWxvYnl0ZXMgPSAkKCg1ICogOCoxMDI0ICsgNzAwKSkgJiYgYnJlYWsKK2RvbmUKK2V4aXQKKworIyBSYW5kb20gc2l6ZXMKK3doaWxlIHRydWU7IGRvCisgICAga2lsb2J5dGVzPSQoKCAoUkFORE9NKlJBTkRPTSkgJSA1MDAwMDAwICsgNjApKQorICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorZG9uZQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ta2ZzX21pbml4LmMgYi91dGlsLWxpbnV4L21rZnNfbWluaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ3ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ta2ZzX21pbml4LmMKQEAgLTAsMCArMSw3NDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rZnMuYyAtIG1ha2UgYSBsaW51eCAobWluaXgpIGZpbGUtc3lzdGVtLgorICoKKyAqIChDKSAxOTkxIExpbnVzIFRvcnZhbGRzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIERELk1NLllZCisgKgorICogMjQuMTEuOTEgIC0JVGltZSBiZWdhbi4gVXNlZCB0aGUgZnNjayBzb3VyY2VzIHRvIGdldCBzdGFydGVkLgorICoKKyAqIDI1LjExLjkxICAtCUNvcnJlY3RlZCBzb21lIGJ1Z3MuIEFkZGVkIHN1cHBvcnQgZm9yICIuYmFkYmxvY2tzIgorICoJCVRoZSBhbGdvcml0aG0gZm9yICIuYmFkYmxvY2tzIiBpcyBhIGJpdCB3ZWlyZCwgYnV0CisgKgkJaXQgc2hvdWxkIHdvcmsuIE9oLCB3ZWxsLgorICoKKyAqIDI1LjAxLjkyICAtCUFkZGVkIHRoZSAtbCBvcHRpb24gZm9yIGdldHRpbmcgdGhlIGxpc3Qgb2YgYmFkIGJsb2NrcworICoJCW91dCBvZiBhIG5hbWVkIGZpbGUuIChEYXZlIFJpdmVycywgcml2ZXJzQHBvbmRzLnV1Y3ApCisgKgorICogMjguMDIuOTIgIC0JQWRkZWQgJS1pbmZvcm1hdGlvbiB3aGVuIHVzaW5nIC1jLgorICoKKyAqIDI4LjAyLjkzICAtCUFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIG5hbWVsZW5ndGhzIHRoYW4gdGhlIG9yaWdpbmFsCisgKgkJMTQgY2hhcmFjdGVycyBzbyB0aGF0IEkgY2FuIHRlc3QgdGhlIG5ldyBrZXJuZWwgcm91dGluZXMuLgorICoKKyAqIDA5LjEwLjkzICAtCU1ha2UgZXhpdCBzdGF0dXMgY29uZm9ybSB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAorICoJCShSaWsgRmFpdGgsIGZhaXRoQGNzLnVuYy5lZHUpCisgKgorICogMzEuMTAuOTMgIC0JQWRkZWQgaW5vZGUgcmVxdWVzdCBmZWF0dXJlLCBmb3IgYmFja3VwIGZsb3BwaWVzOiB1c2UKKyAqCQkzMiBpbm9kZXMsIGZvciBhIG5ld3MgcGFydGl0aW9uIHVzZSBtb3JlLgorICoJCShTY290dCBIZWF2bmVyLCBzZGhAcG8uY3dydS5lZHUpCisgKgorICogMDMuMDEuOTQgIC0JQWRkZWQgc3VwcG9ydCBmb3IgZmlsZSBzeXN0ZW0gdmFsaWQgZmxhZy4KKyAqCQkoRHIuIFdldHRzdGVpbiwgZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKKyAqCisgKiAzMC4xMC45NCAgLSAgYWRkZWQgc3VwcG9ydCBmb3IgdjIgZmlsZXN5c3RlbQorICoJICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKKyAqCisgKiAwOS4xMS45NCAgLQlBZGRlZCB0ZXN0IHRvIHByZXZlbnQgb3ZlcndyaXRlIG9mIG1vdW50ZWQgZnMgYWRhcHRlZAorICoJCWZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgbWtlMmZzCisgKgkJcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQorICoKKyAqIDAzLjIwLjk1ICAtCUNsZWFyIGZpcnN0IDUxMiBieXRlcyBvZiBmaWxlc3lzdGVtIHRvIG1ha2UgY2VydGFpbiB0aGF0CisgKgkJdGhlIGZpbGVzeXN0ZW0gaXMgbm90IG1pc2lkZW50aWZpZWQgYXMgYSBNUy1ET1MgRkFUIGZpbGVzeXN0ZW0uCisgKgkJKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCisgKgorICogMDIuMDcuOTYgIC0gIEFkZGVkIHNtYWxsIHBhdGNoIGZyb20gUnVzc2VsbCBLaW5nIHRvIG1ha2UgdGhlIHByb2dyYW0gYQorICoJCWdvb2QgZGVhbCBtb3JlIHBvcnRhYmxlIChqYW5sQG1hdGgudWlvLm5vKQorICoKKyAqIFVzYWdlOiAgbWtmcyBbLWMgfCAtbCBmaWxlbmFtZSBdIFstdl0gWy1uWFhdIFstaVhYXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQorICoKKyAqCS1jIGZvciByZWFkYWJpbGl0eSBjaGVja2luZyAoU0xPVyEpCisgKiAgICAgIC1sIGZvciBnZXR0aW5nIGEgbGlzdCBvZiBiYWQgYmxvY2tzIGZyb20gYSBmaWxlLgorICoJLW4gZm9yIG5hbWVsZW5ndGggKGN1cnJlbnRseSB0aGUga2VybmVsIG9ubHkgdXNlcyAxNCBvciAzMCkKKyAqCS1pIGZvciBudW1iZXIgb2YgaW5vZGVzCisgKgktdiBmb3IgdjIgZmlsZXN5c3RlbQorICoKKyAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAorICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgorICoKKyAqIE1vZGlmaWVkIGZvciBCdXN5Qm94IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGRlYmlhbi5vcmc+IC0tCisgKglyZW1vdmVkIGdldG9wdCBiYXNlZCBwYXJzZXIgYW5kIGFkZGVkIGEgaGFuZCByb2xsZWQgb25lLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX21pbml4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWMgfCAtbCBGSUxFXSBbLW5YWF0gWy1pWFhdIEJMT0NLREVWIFtLQllURVNdIgorLy91c2FnZTojZGVmaW5lIG1rZnNfbWluaXhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYWtlIGEgTUlOSVggZmlsZXN5c3RlbVxuIgorLy91c2FnZTogICAgICJcbgktYwkJQ2hlY2sgZGV2aWNlIGZvciBiYWQgYmxvY2tzIgorLy91c2FnZTogICAgICJcbgktbiBbMTR8MzBdCU1heGltdW0gbGVuZ3RoIG9mIGZpbGVuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWkgSU5PREVTCU51bWJlciBvZiBpbm9kZXMgZm9yIHRoZSBmaWxlc3lzdGVtIgorLy91c2FnZTogICAgICJcbgktbCBGSUxFCQlSZWFkIGJhZCBibG9ja3MgbGlzdCBmcm9tIEZJTEUiCisvL3VzYWdlOiAgICAgIlxuCS12CQlNYWtlIHZlcnNpb24gMiBmaWxlc3lzdGVtIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKworI2luY2x1ZGUgIm1pbml4LmgiCisKKy8qIFN0b3JlIHRoZSB2ZXJ5IHNhbWUgdGltZXMvdWlkcy9naWRzIGZvciBpbWFnZSBjb25zaXN0ZW5jeSAqLworI2lmIDEKKyMgZGVmaW5lIENVUl9USU1FIDAKKyMgZGVmaW5lIEdFVFVJRCAwCisjIGRlZmluZSBHRVRHSUQgMAorI2Vsc2UKKy8qIFdhcyB1c2luZyB0aGlzLiBJcyBpdCB1c2VmdWw/IE5COiB0aGlzIHdpbGwgYnJlYWsgdGVzdHN1aXRlICovCisjIGRlZmluZSBDVVJfVElNRSB0aW1lKE5VTEwpCisjIGRlZmluZSBHRVRVSUQgZ2V0dWlkKCkKKyMgZGVmaW5lIEdFVEdJRCBnZXRnaWQoKQorI2VuZGlmCisKK2VudW0geworCU1BWF9HT09EX0JMT0NLUyAgICAgICAgID0gNTEyLAorCVRFU1RfQlVGRkVSX0JMT0NLUyAgICAgID0gMTYsCit9OworCisjaWYgIUVOQUJMRV9GRUFUVVJFX01JTklYMgorZW51bSB7IHZlcnNpb24yID0gMCB9OworI2VuZGlmCisKK2VudW0geyBkZXZfZmQgPSAzIH07CisKK3N0cnVjdCBnbG9iYWxzIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwlzbWFsbGludCB2ZXJzaW9uMjsKKyNkZWZpbmUgdmVyc2lvbjIgRy52ZXJzaW9uMgorI2VuZGlmCisJY2hhciAqZGV2aWNlX25hbWU7CisJdWludDMyX3QgdG90YWxfYmxvY2tzOworCWludCBiYWRibG9ja3M7CisJaW50IG5hbWVsZW47CisJaW50IGRpcnNpemU7CisJaW50IG1hZ2ljOworCWNoYXIgKmlub2RlX2J1ZmZlcjsKKwljaGFyICppbm9kZV9tYXA7CisJY2hhciAqem9uZV9tYXA7CisJaW50IHVzZWRfZ29vZF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyByZXFfbnJfaW5vZGVzOworCXVuc2lnbmVkIGN1cnJlbnRseV90ZXN0aW5nOworCisJY2hhciByb290X2Jsb2NrW0JMT0NLX1NJWkVdOworCWNoYXIgc3VwZXJibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CisJY2hhciBib290X2Jsb2NrX2J1ZmZlcls1MTJdOworCXVuc2lnbmVkIHNob3J0IGdvb2RfYmxvY2tzX3RhYmxlW01BWF9HT09EX0JMT0NLU107CisJLyogY2hlY2tfYmxvY2tzKCk6IGJ1ZmZlcltdIHdhcyB0aGUgYmlnZ2VzdCBzdGF0aWMgaW4gZW50aXJlIGJib3ggKi8KKwljaGFyIGNoZWNrX2Jsb2Nrc19idWZmZXJbQkxPQ0tfU0laRSAqIFRFU1RfQlVGRkVSX0JMT0NLU107CisKKwl1bnNpZ25lZCBzaG9ydCBpbmRfYmxvY2sxW0JMT0NLX1NJWkUgPj4gMV07CisJdW5zaWduZWQgc2hvcnQgZGluZF9ibG9jazFbQkxPQ0tfU0laRSA+PiAxXTsKKwl1bnNpZ25lZCBsb25nIGluZF9ibG9jazJbQkxPQ0tfU0laRSA+PiAyXTsKKwl1bnNpZ25lZCBsb25nIGRpbmRfYmxvY2syW0JMT0NLX1NJWkUgPj4gMl07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBkaXZfcm91bmR1cCh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBuKQoreworCXJldHVybiAoc2l6ZSArIG4tMSkgLyBuOworfQorCisjZGVmaW5lIElOT0RFX0JVRjEgICAgICAgICAgICAgICgoKHN0cnVjdCBtaW5peDFfaW5vZGUqKUcuaW5vZGVfYnVmZmVyKSAtIDEpCisjZGVmaW5lIElOT0RFX0JVRjIgICAgICAgICAgICAgICgoKHN0cnVjdCBtaW5peDJfaW5vZGUqKUcuaW5vZGVfYnVmZmVyKSAtIDEpCisKKyNkZWZpbmUgU0IgICAgICAgICAgICAgICAgICAgICAgKCooc3RydWN0IG1pbml4X3N1cGVyYmxvY2sqKUcuc3VwZXJibG9ja19idWZmZXIpCisKKyNkZWZpbmUgU0JfSU5PREVTICAgICAgICAgICAgICAgKFNCLnNfbmlub2RlcykKKyNkZWZpbmUgU0JfSU1BUFMgICAgICAgICAgICAgICAgKFNCLnNfaW1hcF9ibG9ja3MpCisjZGVmaW5lIFNCX1pNQVBTICAgICAgICAgICAgICAgIChTQi5zX3ptYXBfYmxvY2tzKQorI2RlZmluZSBTQl9GSVJTVFpPTkUgICAgICAgICAgICAoU0Iuc19maXJzdGRhdGF6b25lKQorI2RlZmluZSBTQl9aT05FX1NJWkUgICAgICAgICAgICAoU0Iuc19sb2dfem9uZV9zaXplKQorI2RlZmluZSBTQl9NQVhTSVpFICAgICAgICAgICAgICAoU0Iuc19tYXhfc2l6ZSkKKyNkZWZpbmUgU0JfTUFHSUMgICAgICAgICAgICAgICAgKFNCLnNfbWFnaWMpCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisjIGRlZmluZSBTQl9aT05FUyAgICAgICAgICAgICAgIChTQi5zX256b25lcykKKyMgZGVmaW5lIElOT0RFX0JMT0NLUyAgICAgICAgICAgZGl2X3JvdW5kdXAoU0JfSU5PREVTLCBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykKKyNlbHNlCisjIGRlZmluZSBTQl9aT05FUyAgICAgICAgICAgICAgICh2ZXJzaW9uMiA/IFNCLnNfem9uZXMgOiBTQi5zX256b25lcykKKyMgZGVmaW5lIElOT0RFX0JMT0NLUyAgICAgICAgICAgZGl2X3JvdW5kdXAoU0JfSU5PREVTLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uMiA/IE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIDogTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0spKQorI2VuZGlmCisKKyNkZWZpbmUgSU5PREVfQlVGRkVSX1NJWkUgICAgICAgKElOT0RFX0JMT0NLUyAqIEJMT0NLX1NJWkUpCisjZGVmaW5lIE5PUk1fRklSU1RaT05FICAgICAgICAgICgyICsgU0JfSU1BUFMgKyBTQl9aTUFQUyArIElOT0RFX0JMT0NLUykKKworLyogQmVmb3JlIHlvdSBhc2sgIndoZXJlIHRoZXkgY29tZSBmcm9tPyI6ICovCisvKiBzZXRiaXQvY2xyYml0IGFyZSBzdXBwbGllZCBieSBzeXMvcGFyYW0uaCAqLworCitzdGF0aWMgaW50IG1pbml4X2JpdChjb25zdCBjaGFyKiBhLCB1bnNpZ25lZCBpKQoreworCXJldHVybiBhW2kgPj4gM10gJiAoMTw8KGkgJiA3KSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbml4X3NldGJpdChjaGFyICphLCB1bnNpZ25lZCBpKQoreworCXNldGJpdChhLCBpKTsKK30KK3N0YXRpYyB2b2lkIG1pbml4X2NscmJpdChjaGFyICphLCB1bnNpZ25lZCBpKQoreworCWNscmJpdChhLCBpKTsKK30KKworLyogTm90ZTogZG8gbm90IGFzc3VtZSAwLzEsIGl0IGlzIDAvbm9uemVybyAqLworI2RlZmluZSB6b25lX2luX3VzZSh4KSAgbWluaXhfYml0KEcuem9uZV9tYXAsKHgpLVNCX0ZJUlNUWk9ORSsxKQorLyojZGVmaW5lIGlub2RlX2luX3VzZSh4KSBtaW5peF9iaXQoRy5pbm9kZV9tYXAsKHgpKSovCisKKyNkZWZpbmUgbWFya19pbm9kZSh4KSAgIG1pbml4X3NldGJpdChHLmlub2RlX21hcCwoeCkpCisjZGVmaW5lIHVubWFya19pbm9kZSh4KSBtaW5peF9jbHJiaXQoRy5pbm9kZV9tYXAsKHgpKQorI2RlZmluZSBtYXJrX3pvbmUoeCkgICAgbWluaXhfc2V0Yml0KEcuem9uZV9tYXAsKHgpLVNCX0ZJUlNUWk9ORSsxKQorI2RlZmluZSB1bm1hcmtfem9uZSh4KSAgbWluaXhfY2xyYml0KEcuem9uZV9tYXAsKHgpLVNCX0ZJUlNUWk9ORSsxKQorCisjaWZuZGVmIEJMS0dFVFNJWkUKKyMgZGVmaW5lIEJMS0dFVFNJWkUgICAgIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KKyNlbmRpZgorCisKK3N0YXRpYyBsb25nIHZhbGlkX29mZnNldChpbnQgZmQsIGludCBvZmZzZXQpCit7CisJY2hhciBjaDsKKworCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAocmVhZChmZCwgJmNoLCAxKSA8IDEpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNvdW50X2Jsb2NrcyhpbnQgZmQpCit7CisJaW50IGhpZ2gsIGxvdzsKKworCWxvdyA9IDA7CisJZm9yIChoaWdoID0gMTsgdmFsaWRfb2Zmc2V0KGZkLCBoaWdoKTsgaGlnaCAqPSAyKQorCQlsb3cgPSBoaWdoOworCisJd2hpbGUgKGxvdyA8IGhpZ2ggLSAxKSB7CisJCWNvbnN0IGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOworCisJCWlmICh2YWxpZF9vZmZzZXQoZmQsIG1pZCkpCisJCQlsb3cgPSBtaWQ7CisJCWVsc2UKKwkJCWhpZ2ggPSBtaWQ7CisJfQorCXZhbGlkX29mZnNldChmZCwgMCk7CisJcmV0dXJuIChsb3cgKyAxKTsKK30KKworc3RhdGljIGludCBnZXRfc2l6ZShjb25zdCBjaGFyICpmaWxlKQoreworCWludCBmZDsKKwlsb25nIHNpemU7CisKKwlmZCA9IHhvcGVuKGZpbGUsIE9fUkRXUik7CisJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAoc2l6ZSAqIDUxMik7CisJfQorCisJc2l6ZSA9IGNvdW50X2Jsb2NrcyhmZCk7CisJY2xvc2UoZmQpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV90YWJsZXModm9pZCkKK3sKKwkvKiBNYXJrIHRoZSBzdXBlcmJsb2NrIHZhbGlkLiAqLworCVNCLnNfc3RhdGUgfD0gTUlOSVhfVkFMSURfRlM7CisJU0Iuc19zdGF0ZSAmPSB+TUlOSVhfRVJST1JfRlM7CisKKwltc2dfZW9sID0gInNlZWsgdG8gMCBmYWlsZWQiOworCXhsc2VlayhkZXZfZmQsIDAsIFNFRUtfU0VUKTsKKworCW1zZ19lb2wgPSAiY2FuJ3QgY2xlYXIgYm9vdCBzZWN0b3IiOworCXh3cml0ZShkZXZfZmQsIEcuYm9vdF9ibG9ja19idWZmZXIsIDUxMik7CisKKwltc2dfZW9sID0gInNlZWsgdG8gQkxPQ0tfU0laRSBmYWlsZWQiOworCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKworCW1zZ19lb2wgPSAiY2FuJ3Qgd3JpdGUgc3VwZXJibG9jayI7CisJeHdyaXRlKGRldl9mZCwgRy5zdXBlcmJsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSk7CisKKwltc2dfZW9sID0gImNhbid0IHdyaXRlIGlub2RlIG1hcCI7CisJeHdyaXRlKGRldl9mZCwgRy5pbm9kZV9tYXAsIFNCX0lNQVBTICogQkxPQ0tfU0laRSk7CisKKwltc2dfZW9sID0gImNhbid0IHdyaXRlIHpvbmUgbWFwIjsKKwl4d3JpdGUoZGV2X2ZkLCBHLnpvbmVfbWFwLCBTQl9aTUFQUyAqIEJMT0NLX1NJWkUpOworCisJbXNnX2VvbCA9ICJjYW4ndCB3cml0ZSBpbm9kZXMiOworCXh3cml0ZShkZXZfZmQsIEcuaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSk7CisKKwltc2dfZW9sID0gIlxuIjsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfYmxvY2soaW50IGJsaywgY2hhciAqYnVmZmVyKQoreworCXhsc2VlayhkZXZfZmQsIGJsayAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwl4d3JpdGUoZGV2X2ZkLCBidWZmZXIsIEJMT0NLX1NJWkUpOworfQorCitzdGF0aWMgaW50IGdldF9mcmVlX2Jsb2NrKHZvaWQpCit7CisJaW50IGJsazsKKworCWlmIChHLnVzZWRfZ29vZF9ibG9ja3MgKyAxID49IE1BWF9HT09EX0JMT0NLUykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGJhZCBibG9ja3MiKTsKKwlpZiAoRy51c2VkX2dvb2RfYmxvY2tzKQorCQlibGsgPSBHLmdvb2RfYmxvY2tzX3RhYmxlW0cudXNlZF9nb29kX2Jsb2NrcyAtIDFdICsgMTsKKwllbHNlCisJCWJsayA9IFNCX0ZJUlNUWk9ORTsKKwl3aGlsZSAoYmxrIDwgU0JfWk9ORVMgJiYgem9uZV9pbl91c2UoYmxrKSkKKwkJYmxrKys7CisJaWYgKGJsayA+PSBTQl9aT05FUykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBlbm91Z2ggZ29vZCBibG9ja3MiKTsKKwlHLmdvb2RfYmxvY2tzX3RhYmxlW0cudXNlZF9nb29kX2Jsb2Nrc10gPSBibGs7CisJRy51c2VkX2dvb2RfYmxvY2tzKys7CisJcmV0dXJuIGJsazsKK30KKworc3RhdGljIHZvaWQgbWFya19nb29kX2Jsb2Nrcyh2b2lkKQoreworCWludCBibGs7CisKKwlmb3IgKGJsayA9IDA7IGJsayA8IEcudXNlZF9nb29kX2Jsb2NrczsgYmxrKyspCisJCW1hcmtfem9uZShHLmdvb2RfYmxvY2tzX3RhYmxlW2Jsa10pOworfQorCitzdGF0aWMgaW50IG5leHQoaW50IHpvbmUpCit7CisJaWYgKCF6b25lKQorCQl6b25lID0gU0JfRklSU1RaT05FIC0gMTsKKwl3aGlsZSAoKyt6b25lIDwgU0JfWk9ORVMpCisJCWlmICh6b25lX2luX3VzZSh6b25lKSkKKwkJCXJldHVybiB6b25lOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYWtlX2JhZF9pbm9kZSh2b2lkKQoreworCXN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlID0gJklOT0RFX0JVRjFbTUlOSVhfQkFEX0lOT107CisJaW50IGksIGosIHpvbmU7CisJaW50IGluZCA9IDAsIGRpbmQgPSAwOworCS8qIG1vdmVkIHRvIGdsb2JhbHMgdG8gcmVkdWNlIHN0YWNrIHVzYWdlCisJdW5zaWduZWQgc2hvcnQgaW5kX2Jsb2NrW0JMT0NLX1NJWkUgPj4gMV07CisJdW5zaWduZWQgc2hvcnQgZGluZF9ibG9ja1tCTE9DS19TSVpFID4+IDFdOworCSovCisjZGVmaW5lIGluZF9ibG9jayAoRy5pbmRfYmxvY2sxKQorI2RlZmluZSBkaW5kX2Jsb2NrIChHLmRpbmRfYmxvY2sxKQorCisjZGVmaW5lIE5FWFRfQkFEICh6b25lID0gbmV4dCh6b25lKSkKKworCWlmICghRy5iYWRibG9ja3MpCisJCXJldHVybjsKKwltYXJrX2lub2RlKE1JTklYX0JBRF9JTk8pOworCWlub2RlLT5pX25saW5rcyA9IDE7CisJLyogQlRXLCBzZXR0aW5nIHRoaXMgbWFrZXMgYWxsIGltYWdlcyBkaWZmZXJlbnQgKi8KKwkvKiBpdCdzIGhhcmRlciB0byBjaGVjayBmb3IgYnVncyB0aGVuIC0gZGlmZiBpc24ndCBoZWxwZnVsIDooLi4uICovCisJaW5vZGUtPmlfdGltZSA9IENVUl9USU1FOworCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHICsgMDAwMDsKKwlpbm9kZS0+aV9zaXplID0gRy5iYWRibG9ja3MgKiBCTE9DS19TSVpFOworCXpvbmUgPSBuZXh0KDApOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaW5vZGUtPmlfem9uZVtpXSA9IHpvbmU7CisJCWlmICghTkVYVF9CQUQpCisJCQlnb3RvIGVuZF9iYWQ7CisJfQorCWlub2RlLT5pX3pvbmVbN10gPSBpbmQgPSBnZXRfZnJlZV9ibG9jaygpOworCW1lbXNldChpbmRfYmxvY2ssIDAsIEJMT0NLX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQlpbmRfYmxvY2tbaV0gPSB6b25lOworCQlpZiAoIU5FWFRfQkFEKQorCQkJZ290byBlbmRfYmFkOworCX0KKwlpbm9kZS0+aV96b25lWzhdID0gZGluZCA9IGdldF9mcmVlX2Jsb2NrKCk7CisJbWVtc2V0KGRpbmRfYmxvY2ssIDAsIEJMT0NLX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQl3cml0ZV9ibG9jayhpbmQsIChjaGFyICopIGluZF9ibG9jayk7CisJCWRpbmRfYmxvY2tbaV0gPSBpbmQgPSBnZXRfZnJlZV9ibG9jaygpOworCQltZW1zZXQoaW5kX2Jsb2NrLCAwLCBCTE9DS19TSVpFKTsKKwkJZm9yIChqID0gMDsgaiA8IDUxMjsgaisrKSB7CisJCQlpbmRfYmxvY2tbal0gPSB6b25lOworCQkJaWYgKCFORVhUX0JBRCkKKwkJCQlnb3RvIGVuZF9iYWQ7CisJCX0KKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGJhZCBibG9ja3MiKTsKKyBlbmRfYmFkOgorCWlmIChpbmQpCisJCXdyaXRlX2Jsb2NrKGluZCwgKGNoYXIgKikgaW5kX2Jsb2NrKTsKKwlpZiAoZGluZCkKKwkJd3JpdGVfYmxvY2soZGluZCwgKGNoYXIgKikgZGluZF9ibG9jayk7CisjdW5kZWYgaW5kX2Jsb2NrCisjdW5kZWYgZGluZF9ibG9jaworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCBtYWtlX2JhZF9pbm9kZTIodm9pZCkKK3sKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSA9ICZJTk9ERV9CVUYyW01JTklYX0JBRF9JTk9dOworCWludCBpLCBqLCB6b25lOworCWludCBpbmQgPSAwLCBkaW5kID0gMDsKKwkvKiBtb3ZlZCB0byBnbG9iYWxzIHRvIHJlZHVjZSBzdGFjayB1c2FnZQorCXVuc2lnbmVkIGxvbmcgaW5kX2Jsb2NrW0JMT0NLX1NJWkUgPj4gMl07CisJdW5zaWduZWQgbG9uZyBkaW5kX2Jsb2NrW0JMT0NLX1NJWkUgPj4gMl07CisJKi8KKyNkZWZpbmUgaW5kX2Jsb2NrIChHLmluZF9ibG9jazIpCisjZGVmaW5lIGRpbmRfYmxvY2sgKEcuZGluZF9ibG9jazIpCisKKwlpZiAoIUcuYmFkYmxvY2tzKQorCQlyZXR1cm47CisJbWFya19pbm9kZShNSU5JWF9CQURfSU5PKTsKKwlpbm9kZS0+aV9ubGlua3MgPSAxOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUl9USU1FOworCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHICsgMDAwMDsKKwlpbm9kZS0+aV9zaXplID0gRy5iYWRibG9ja3MgKiBCTE9DS19TSVpFOworCXpvbmUgPSBuZXh0KDApOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaW5vZGUtPmlfem9uZVtpXSA9IHpvbmU7CisJCWlmICghTkVYVF9CQUQpCisJCQlnb3RvIGVuZF9iYWQ7CisJfQorCWlub2RlLT5pX3pvbmVbN10gPSBpbmQgPSBnZXRfZnJlZV9ibG9jaygpOworCW1lbXNldChpbmRfYmxvY2ssIDAsIEJMT0NLX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbmRfYmxvY2tbaV0gPSB6b25lOworCQlpZiAoIU5FWFRfQkFEKQorCQkJZ290byBlbmRfYmFkOworCX0KKwlpbm9kZS0+aV96b25lWzhdID0gZGluZCA9IGdldF9mcmVlX2Jsb2NrKCk7CisJbWVtc2V0KGRpbmRfYmxvY2ssIDAsIEJMT0NLX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl3cml0ZV9ibG9jayhpbmQsIChjaGFyICopIGluZF9ibG9jayk7CisJCWRpbmRfYmxvY2tbaV0gPSBpbmQgPSBnZXRfZnJlZV9ibG9jaygpOworCQltZW1zZXQoaW5kX2Jsb2NrLCAwLCBCTE9DS19TSVpFKTsKKwkJZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisJCQlpbmRfYmxvY2tbal0gPSB6b25lOworCQkJaWYgKCFORVhUX0JBRCkKKwkJCQlnb3RvIGVuZF9iYWQ7CisJCX0KKwl9CisJLyogQ291bGQgbWFrZSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sgaGVyZSAqLworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBiYWQgYmxvY2tzIik7CisgZW5kX2JhZDoKKwlpZiAoaW5kKQorCQl3cml0ZV9ibG9jayhpbmQsIChjaGFyICopIGluZF9ibG9jayk7CisJaWYgKGRpbmQpCisJCXdyaXRlX2Jsb2NrKGRpbmQsIChjaGFyICopIGRpbmRfYmxvY2spOworI3VuZGVmIGluZF9ibG9jaworI3VuZGVmIGRpbmRfYmxvY2sKK30KKyNlbHNlCit2b2lkIG1ha2VfYmFkX2lub2RlMih2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtYWtlX3Jvb3RfaW5vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZSA9ICZJTk9ERV9CVUYxW01JTklYX1JPT1RfSU5PXTsKKworCW1hcmtfaW5vZGUoTUlOSVhfUk9PVF9JTk8pOworCWlub2RlLT5pX3pvbmVbMF0gPSBnZXRfZnJlZV9ibG9jaygpOworCWlub2RlLT5pX25saW5rcyA9IDI7CisJaW5vZGUtPmlfdGltZSA9IENVUl9USU1FOworCWlmIChHLmJhZGJsb2NrcykKKwkJaW5vZGUtPmlfc2l6ZSA9IDMgKiBHLmRpcnNpemU7CisJZWxzZSB7CisJCUcucm9vdF9ibG9ja1syICogRy5kaXJzaXplXSA9ICdcMCc7CisJCUcucm9vdF9ibG9ja1syICogRy5kaXJzaXplICsgMV0gPSAnXDAnOworCQlpbm9kZS0+aV9zaXplID0gMiAqIEcuZGlyc2l6ZTsKKwl9CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgKyAwNzU1OworCWlub2RlLT5pX3VpZCA9IEdFVFVJRDsKKwlpZiAoaW5vZGUtPmlfdWlkKQorCQlpbm9kZS0+aV9naWQgPSBHRVRHSUQ7CisJd3JpdGVfYmxvY2soaW5vZGUtPmlfem9uZVswXSwgRy5yb290X2Jsb2NrKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgbWFrZV9yb290X2lub2RlMih2b2lkKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gJklOT0RFX0JVRjJbTUlOSVhfUk9PVF9JTk9dOworCisJbWFya19pbm9kZShNSU5JWF9ST09UX0lOTyk7CisJaW5vZGUtPmlfem9uZVswXSA9IGdldF9mcmVlX2Jsb2NrKCk7CisJaW5vZGUtPmlfbmxpbmtzID0gMjsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJfVElNRTsKKwlpZiAoRy5iYWRibG9ja3MpCisJCWlub2RlLT5pX3NpemUgPSAzICogRy5kaXJzaXplOworCWVsc2UgeworCQlHLnJvb3RfYmxvY2tbMiAqIEcuZGlyc2l6ZV0gPSAnXDAnOworCQlHLnJvb3RfYmxvY2tbMiAqIEcuZGlyc2l6ZSArIDFdID0gJ1wwJzsKKwkJaW5vZGUtPmlfc2l6ZSA9IDIgKiBHLmRpcnNpemU7CisJfQorCWlub2RlLT5pX21vZGUgPSBTX0lGRElSICsgMDc1NTsKKwlpbm9kZS0+aV91aWQgPSBHRVRVSUQ7CisJaWYgKGlub2RlLT5pX3VpZCkKKwkJaW5vZGUtPmlfZ2lkID0gR0VUR0lEOworCXdyaXRlX2Jsb2NrKGlub2RlLT5pX3pvbmVbMF0sIEcucm9vdF9ibG9jayk7Cit9CisjZWxzZQordm9pZCBtYWtlX3Jvb3RfaW5vZGUyKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBQZXJmb3JtIGEgdGVzdCBvZiBhIGJsb2NrOyByZXR1cm4gdGhlIG51bWJlciBvZgorICogYmxvY2tzIHJlYWRhYmxlLgorICovCitzdGF0aWMgc2l6ZV90IGRvX2NoZWNrKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHRyeSwgdW5zaWduZWQgY3VycmVudF9ibG9jaykKK3sKKwlzc2l6ZV90IGdvdDsKKworCS8qIFNlZWsgdG8gdGhlIGNvcnJlY3QgbG9jLiAqLworCW1zZ19lb2wgPSAic2VlayBmYWlsZWQgZHVyaW5nIHRlc3Rpbmcgb2YgYmxvY2tzIjsKKwl4bHNlZWsoZGV2X2ZkLCBjdXJyZW50X2Jsb2NrICogQkxPQ0tfU0laRSwgU0VFS19TRVQpOworCW1zZ19lb2wgPSAiXG4iOworCisJLyogVHJ5IHRoZSByZWFkICovCisJZ290ID0gcmVhZChkZXZfZmQsIGJ1ZmZlciwgdHJ5ICogQkxPQ0tfU0laRSk7CisJaWYgKGdvdCA8IDApCisJCWdvdCA9IDA7CisJdHJ5ID0gKChzaXplX3QpZ290KSAvIEJMT0NLX1NJWkU7CisKKwlpZiAoZ290ICYgKEJMT0NLX1NJWkUgLSAxKSkKKwkJZnByaW50ZihzdGRlcnIsICJTaG9ydCByZWFkIGF0IGJsb2NrICV1XG4iLCAodW5zaWduZWQpKGN1cnJlbnRfYmxvY2sgKyB0cnkpKTsKKwlyZXR1cm4gdHJ5OworfQorCitzdGF0aWMgdm9pZCBhbGFybV9pbnRyKGludCBhbG51bSBVTlVTRURfUEFSQU0pCit7CisJaWYgKEcuY3VycmVudGx5X3Rlc3RpbmcgPj0gU0JfWk9ORVMpCisJCXJldHVybjsKKwlzaWduYWwoU0lHQUxSTSwgYWxhcm1faW50cik7CisJYWxhcm0oNSk7CisJaWYgKCFHLmN1cnJlbnRseV90ZXN0aW5nKQorCQlyZXR1cm47CisJcHJpbnRmKCIlZCAuLi4iLCBHLmN1cnJlbnRseV90ZXN0aW5nKTsKKwlmZmx1c2hfYWxsKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Jsb2Nrcyh2b2lkKQoreworCXNpemVfdCB0cnksIGdvdDsKKworCUcuY3VycmVudGx5X3Rlc3RpbmcgPSAwOworCXNpZ25hbChTSUdBTFJNLCBhbGFybV9pbnRyKTsKKwlhbGFybSg1KTsKKwl3aGlsZSAoRy5jdXJyZW50bHlfdGVzdGluZyA8IFNCX1pPTkVTKSB7CisJCW1zZ19lb2wgPSAic2VlayBmYWlsZWQgaW4gY2hlY2tfYmxvY2tzIjsKKwkJeGxzZWVrKGRldl9mZCwgRy5jdXJyZW50bHlfdGVzdGluZyAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwkJbXNnX2VvbCA9ICJcbiI7CisJCXRyeSA9IFRFU1RfQlVGRkVSX0JMT0NLUzsKKwkJaWYgKEcuY3VycmVudGx5X3Rlc3RpbmcgKyB0cnkgPiBTQl9aT05FUykKKwkJCXRyeSA9IFNCX1pPTkVTIC0gRy5jdXJyZW50bHlfdGVzdGluZzsKKwkJZ290ID0gZG9fY2hlY2soRy5jaGVja19ibG9ja3NfYnVmZmVyLCB0cnksIEcuY3VycmVudGx5X3Rlc3RpbmcpOworCQlHLmN1cnJlbnRseV90ZXN0aW5nICs9IGdvdDsKKwkJaWYgKGdvdCA9PSB0cnkpCisJCQljb250aW51ZTsKKwkJaWYgKEcuY3VycmVudGx5X3Rlc3RpbmcgPCBTQl9GSVJTVFpPTkUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGJsb2NrcyBiZWZvcmUgZGF0YS1hcmVhOiBjYW5ub3QgbWFrZSBmcyIpOworCQltYXJrX3pvbmUoRy5jdXJyZW50bHlfdGVzdGluZyk7CisJCUcuYmFkYmxvY2tzKys7CisJCUcuY3VycmVudGx5X3Rlc3RpbmcrKzsKKwl9CisJYWxhcm0oMCk7CisJcHJpbnRmKCIlZCBiYWQgYmxvY2socylcbiIsIEcuYmFkYmxvY2tzKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2xpc3RfYmxvY2tzKGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKmxpc3RmaWxlOworCXVuc2lnbmVkIGxvbmcgYmxvY2tubzsKKworCWxpc3RmaWxlID0geGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKwl3aGlsZSAoIWZlb2YobGlzdGZpbGUpKSB7CisJCWZzY2FuZihsaXN0ZmlsZSwgIiVsZFxuIiwgJmJsb2Nrbm8pOworCQltYXJrX3pvbmUoYmxvY2tubyk7CisJCUcuYmFkYmxvY2tzKys7CisJfQorCXByaW50ZigiJWQgYmFkIGJsb2NrKHMpXG4iLCBHLmJhZGJsb2Nrcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3RhYmxlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaW5vZGVzOworCXVuc2lnbmVkIG5vcm1fZmlyc3R6b25lOworCXVuc2lnbmVkIHNiX3ptYXBzOworCXVuc2lnbmVkIGk7CisKKwkvKiBtZW1zZXQoRy5zdXBlcmJsb2NrX2J1ZmZlciwgMCwgQkxPQ0tfU0laRSk7ICovCisJLyogbWVtc2V0KEcuYm9vdF9ibG9ja19idWZmZXIsIDAsIDUxMik7ICovCisJU0JfTUFHSUMgPSBHLm1hZ2ljOworCVNCX1pPTkVfU0laRSA9IDA7CisJU0JfTUFYU0laRSA9IHZlcnNpb24yID8gMHg3ZmZmZmZmZiA6ICg3ICsgNTEyICsgNTEyICogNTEyKSAqIDEwMjQ7CisJaWYgKHZlcnNpb24yKQorCQlTQi5zX3pvbmVzID0gRy50b3RhbF9ibG9ja3M7CisJZWxzZQorCQlTQi5zX256b25lcyA9IEcudG90YWxfYmxvY2tzOworCisJLyogc29tZSBtYWdpYyBucnM6IDEgaW5vZGUgLyAzIGJsb2NrcyAqLworCWlmIChHLnJlcV9ucl9pbm9kZXMgPT0gMCkKKwkJaW5vZGVzID0gRy50b3RhbF9ibG9ja3MgLyAzOworCWVsc2UKKwkJaW5vZGVzID0gRy5yZXFfbnJfaW5vZGVzOworCS8qIFJvdW5kIHVwIGlub2RlIGNvdW50IHRvIGZpbGwgYmxvY2sgc2l6ZSAqLworCWlmICh2ZXJzaW9uMikKKwkJaW5vZGVzID0gKGlub2RlcyArIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIC0gMSkgJgorCQkgICAgICAgICAgICAgICAgIH4oTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgLSAxKTsKKwllbHNlCisJCWlub2RlcyA9IChpbm9kZXMgKyBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSyAtIDEpICYKKwkJICAgICAgICAgICAgICAgICB+KE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLIC0gMSk7CisJaWYgKGlub2RlcyA+IDY1NTM1KQorCQlpbm9kZXMgPSA2NTUzNTsKKwlTQl9JTk9ERVMgPSBpbm9kZXM7CisJU0JfSU1BUFMgPSBkaXZfcm91bmR1cChTQl9JTk9ERVMgKyAxLCBCSVRTX1BFUl9CTE9DSyk7CisKKwkvKiBSZWFsIGJhZCBoYWNrIGJ1dCBvdmVyd2lzZSBta2ZzLm1pbml4IGNhbiBiZSB0aHJvd24KKwkgKiBpbiBpbmZpbml0ZSBsb29wLi4uCisJICogdHJ5OgorCSAqIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LmZzIGNvdW50PTEwIGJzPTEwMjQKKwkgKiBta2ZzLm1pbml4IC1pIDIwMCB0ZXN0LmZzCisJICovCisJLyogVGhpcyBjb2RlIGlzIG5vdCBpbnNhbmU6IE5PUk1fRklSU1RaT05FIGlzIG5vdCBhIGNvbnN0YW50LAorCSAqIGl0IGlzIGNhbGN1bGF0ZWQgZnJvbSBTQl9JTk9ERVMsIFNCX0lNQVBTIGFuZCBTQl9aTUFQUyAqLworCWkgPSA5OTk7CisJU0JfWk1BUFMgPSAwOworCWRvIHsKKwkJbm9ybV9maXJzdHpvbmUgPSBOT1JNX0ZJUlNUWk9ORTsKKwkJc2Jfem1hcHMgPSBkaXZfcm91bmR1cChHLnRvdGFsX2Jsb2NrcyAtIG5vcm1fZmlyc3R6b25lICsgMSwgQklUU19QRVJfQkxPQ0spOworCQlpZiAoU0JfWk1BUFMgPT0gc2Jfem1hcHMpIGdvdG8gZ290X2l0OworCQlTQl9aTUFQUyA9IHNiX3ptYXBzOworCQkvKiBuZXcgU0JfWk1BUFMsIG5lZWQgdG8gcmVjYWxjIE5PUk1fRklSU1RaT05FICovCisJfSB3aGlsZSAoLS1pKTsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW5jb21wYXRpYmxlIHNpemUvaW5vZGUgY291bnQsIHRyeSBkaWZmZXJlbnQgLWkgTiIpOworIGdvdF9pdDoKKworCVNCX0ZJUlNUWk9ORSA9IG5vcm1fZmlyc3R6b25lOworCUcuaW5vZGVfbWFwID0geG1hbGxvYyhTQl9JTUFQUyAqIEJMT0NLX1NJWkUpOworCUcuem9uZV9tYXAgPSB4bWFsbG9jKFNCX1pNQVBTICogQkxPQ0tfU0laRSk7CisJbWVtc2V0KEcuaW5vZGVfbWFwLCAweGZmLCBTQl9JTUFQUyAqIEJMT0NLX1NJWkUpOworCW1lbXNldChHLnpvbmVfbWFwLCAweGZmLCBTQl9aTUFQUyAqIEJMT0NLX1NJWkUpOworCWZvciAoaSA9IFNCX0ZJUlNUWk9ORTsgaSA8IFNCX1pPTkVTOyBpKyspCisJCXVubWFya196b25lKGkpOworCWZvciAoaSA9IE1JTklYX1JPT1RfSU5POyBpIDw9IFNCX0lOT0RFUzsgaSsrKQorCQl1bm1hcmtfaW5vZGUoaSk7CisJRy5pbm9kZV9idWZmZXIgPSB4emFsbG9jKElOT0RFX0JVRkZFUl9TSVpFKTsKKwlwcmludGYoIiVsZCBpbm9kZXNcbiIsIChsb25nKVNCX0lOT0RFUyk7CisJcHJpbnRmKCIlbGQgYmxvY2tzXG4iLCAobG9uZylTQl9aT05FUyk7CisJcHJpbnRmKCJGaXJzdGRhdGF6b25lPSVsZCAoJWxkKVxuIiwgKGxvbmcpU0JfRklSU1RaT05FLCAobG9uZylub3JtX2ZpcnN0em9uZSk7CisJcHJpbnRmKCJab25lc2l6ZT0lZFxuIiwgQkxPQ0tfU0laRSA8PCBTQl9aT05FX1NJWkUpOworCXByaW50ZigiTWF4c2l6ZT0lbGRcbiIsIChsb25nKVNCX01BWFNJWkUpOworfQorCitpbnQgbWtmc19taW5peF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtmc19taW5peF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKnRtcDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNoYXIgKnN0cl9pOworCWNoYXIgKmxpc3RmaWxlID0gTlVMTDsKKworCUlOSVRfRygpOworLyogZGVmYXVsdCAoY2hhbmdlZCB0byAzMCwgcGVyIExpbnVzJ3Mgc3VnZ2VzdGlvbiwgU3VuIE5vdiAyMSAwODowNTowNyAxOTkzKSAqLworCUcubmFtZWxlbiA9IDMwOworCUcuZGlyc2l6ZSA9IDMyOworCUcubWFnaWMgPSBNSU5JWDFfU1VQRVJfTUFHSUMyOworCisJaWYgKElOT0RFX1NJWkUxICogTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBpbm9kZSBzaXplIik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisJaWYgKElOT0RFX1NJWkUyICogTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBpbm9kZSBzaXplIik7CisjZW5kaWYKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm4rIjsgLyogLW4gTiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJjaTpsOm46diIsICZzdHJfaSwgJmxpc3RmaWxlLCAmRy5uYW1lbGVuKTsKKwlhcmd2ICs9IG9wdGluZDsKKwkvL2lmIChvcHQgJiAxKSAtYworCWlmIChvcHQgJiAyKSBHLnJlcV9ucl9pbm9kZXMgPSB4YXRvdWwoc3RyX2kpOyAvLyAtaQorCS8vaWYgKG9wdCAmIDQpIC1sCisJaWYgKG9wdCAmIDgpIHsgLy8gLW4KKwkJaWYgKEcubmFtZWxlbiA9PSAxNCkgRy5tYWdpYyA9IE1JTklYMV9TVVBFUl9NQUdJQzsKKwkJZWxzZSBpZiAoRy5uYW1lbGVuID09IDMwKSBHLm1hZ2ljID0gTUlOSVgxX1NVUEVSX01BR0lDMjsKKwkJZWxzZSBiYl9zaG93X3VzYWdlKCk7CisJCUcuZGlyc2l6ZSA9IEcubmFtZWxlbiArIDI7CisJfQorCWlmIChvcHQgJiAweDEwKSB7IC8vIC12CisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisJCXZlcnNpb24yID0gMTsKKyNlbHNlCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgY29tcGlsZWQgd2l0aCBtaW5peCB2MiBzdXBwb3J0Iik7CisjZW5kaWYKKwl9CisKKwlHLmRldmljZV9uYW1lID0gKmFyZ3YrKzsKKwlpZiAoIUcuZGV2aWNlX25hbWUpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoKmFyZ3YpCisJCUcudG90YWxfYmxvY2tzID0geGF0b3UzMigqYXJndik7CisJZWxzZQorCQlHLnRvdGFsX2Jsb2NrcyA9IGdldF9zaXplKEcuZGV2aWNlX25hbWUpIC8gMTAyNDsKKworCWlmIChHLnRvdGFsX2Jsb2NrcyA8IDEwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibXVzdCBoYXZlIGF0IGxlYXN0IDEwIGJsb2NrcyIpOworCisJaWYgKHZlcnNpb24yKSB7CisJCUcubWFnaWMgPSBNSU5JWDJfU1VQRVJfTUFHSUMyOworCQlpZiAoRy5uYW1lbGVuID09IDE0KQorCQkJRy5tYWdpYyA9IE1JTklYMl9TVVBFUl9NQUdJQzsKKwl9IGVsc2UgaWYgKEcudG90YWxfYmxvY2tzID4gNjU1MzUpCisJCUcudG90YWxfYmxvY2tzID0gNjU1MzU7CisKKwkvKiBDaGVjayBpZiBpdCBpcyBtb3VudGVkICovCisJaWYgKGZpbmRfbW91bnRfcG9pbnQoRy5kZXZpY2VfbmFtZSwgMCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmb3JtYXQgbW91bnRlZCBmaWxlc3lzdGVtIik7CisKKwl4bW92ZV9mZCh4b3BlbihHLmRldmljZV9uYW1lLCBPX1JEV1IpLCBkZXZfZmQpOworCXhmc3RhdChkZXZfZmQsICZzdGF0YnVmLCBHLmRldmljZV9uYW1lKTsKKwlpZiAoIVNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKKwkJb3B0ICY9IH4xOyAvLyBjbGVhciAtYyAoY2hlY2spCisKKy8qIEkgZG9uJ3Qga25vdyB3aHkgc29tZW9uZSBoYXMgc3BlY2lhbCBjb2RlIHRvIHByZXZlbnQgbWtmcy5taW5peAorICogb24gSURFIGRldmljZXMuIFdoeSBJREUgYnV0IG5vdCBTQ1NJLCBldGM/Li4uICovCisjaWYgMAorCWVsc2UgaWYgKHN0YXRidWYuc3RfcmRldiA9PSAweDAzMDAgfHwgc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDM0MCkKKwkJLyogd2hhdCBpcyB0aGlzPyAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid2lsbCBub3QgdHJ5ICIKKwkJCSJ0byBtYWtlIGZpbGVzeXN0ZW0gb24gJyVzJyIsIEcuZGV2aWNlX25hbWUpOworI2VuZGlmCisKKwl0bXAgPSBHLnJvb3RfYmxvY2s7CisJKihzaG9ydCAqKSB0bXAgPSAxOworCXN0cmNweSh0bXAgKyAyLCAiLiIpOworCXRtcCArPSBHLmRpcnNpemU7CisJKihzaG9ydCAqKSB0bXAgPSAxOworCXN0cmNweSh0bXAgKyAyLCAiLi4iKTsKKwl0bXAgKz0gRy5kaXJzaXplOworCSooc2hvcnQgKikgdG1wID0gMjsKKwlzdHJjcHkodG1wICsgMiwgIi5iYWRibG9ja3MiKTsKKworCXNldHVwX3RhYmxlcygpOworCisJaWYgKG9wdCAmIDEpIC8vIC1jID8KKwkJY2hlY2tfYmxvY2tzKCk7CisJZWxzZSBpZiAobGlzdGZpbGUpCisJCWdldF9saXN0X2Jsb2NrcyhsaXN0ZmlsZSk7CisKKwlpZiAodmVyc2lvbjIpIHsKKwkJbWFrZV9yb290X2lub2RlMigpOworCQltYWtlX2JhZF9pbm9kZTIoKTsKKwl9IGVsc2UgeworCQltYWtlX3Jvb3RfaW5vZGUoKTsKKwkJbWFrZV9iYWRfaW5vZGUoKTsKKwl9CisKKwltYXJrX2dvb2RfYmxvY2tzKCk7CisJd3JpdGVfdGFibGVzKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21rZnNfcmVpc2VyLmMgYi91dGlsLWxpbnV4L21rZnNfcmVpc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZmI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtmc19yZWlzZXIuYwpAQCAtMCwwICsxLDM3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtmc19yZWlzZXI6IHV0aWxpdHkgdG8gY3JlYXRlIFJlaXNlckZTIGZpbGVzeXN0ZW0KKyAqCisgKiBCdXN5Ym94J2VkICgyMDA5KSBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtmc19yZWlzZXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZl0gWy1sIExBQkVMXSBCTE9DS0RFViBbNEstQkxPQ0tTXSIKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX3JlaXNlcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1ha2UgYSBSZWlzZXJGUyBWMyBmaWxlc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktbCBMQkwJVm9sdW1lIGxhYmVsIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCitjaGFyIEJVR193cm9uZ19maWVsZF9zaXplKHZvaWQpOworI2RlZmluZSBTVE9SRV9MRShmaWVsZCwgdmFsdWUpIFwKK2RvIHsgXAorCWlmIChzaXplb2YoZmllbGQpID09IDQpIFwKKwkJZmllbGQgPSBTV0FQX0xFMzIodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAyKSBcCisJCWZpZWxkID0gU1dBUF9MRTE2KHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMSkgXAorCQlmaWVsZCA9ICh2YWx1ZSk7IFwKKwllbHNlIFwKKwkJQlVHX3dyb25nX2ZpZWxkX3NpemUoKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGRVRDSF9MRTMyKGZpZWxkKSBcCisJKHNpemVvZihmaWVsZCkgPT0gNCA/IFNXQVBfTEUzMihmaWVsZCkgOiBCVUdfd3JvbmdfZmllbGRfc2l6ZSgpKQorCitzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgeworCXVpbnQzMl90IGpwX2pvdXJuYWxfMXN0X2Jsb2NrOyAgICAgIC8qIHdoZXJlIGRvZXMgam91cm5hbCBzdGFydCBmcm9tIG9uIGl0cyBkZXZpY2UgKi8KKwl1aW50MzJfdCBqcF9qb3VybmFsX2RldjsgICAgICAgICAgICAvKiBqb3VybmFsIGRldmljZSBzdF9yZGV2ICovCisJdWludDMyX3QganBfam91cm5hbF9zaXplOyAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgam91cm5hbCBvbiBGUyBjcmVhdGlvbi4gdXNlZCB0byBtYWtlIHN1cmUgdGhleSBkb24ndCBvdmVyZmxvdyBpdCAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfdHJhbnNfbWF4OyAgICAgIC8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfbWFnaWM7ICAgICAgICAgIC8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICh0aGlzIHdhcyBzYl9qb3VybmFsX2Jsb2NrX2NvdW50KSAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfbWF4X2JhdGNoOyAgICAgIC8qIG1heCBudW1iZXIgb2YgYmxvY2tzIHRvIGJhdGNoIGludG8gYSB0cmFucyAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U7IC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jIGNvbW1pdCBiZSAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTsgIC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGEgdHJhbnNhY3Rpb24gYmUgKi8KK307CisKK3N0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciB7CisJdWludDMyX3QgamhfbGFzdF9mbHVzaF90cmFuc19pZDsgICAgLyogaWQgb2YgbGFzdCBmdWxseSBmbHVzaGVkIHRyYW5zYWN0aW9uICovCisJdWludDMyX3QgamhfZmlyc3RfdW5mbHVzaGVkX29mZnNldDsgLyogb2Zmc2V0IGluIHRoZSBsb2cgb2Ygd2hlcmUgdG8gc3RhcnQgcmVwbGF5IGFmdGVyIGEgY3Jhc2ggKi8KKwl1aW50MzJfdCBqaF9tb3VudF9pZDsKKwlzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgamhfam91cm5hbDsKKwl1aW50MzJfdCBqaF9sYXN0X2NoZWNrX21vdW50X2lkOyAgICAvKiB0aGUgbW91bnQgaWQgb2YgdGhlIGZzIGR1cmluZyB0aGUgbGFzdCByZWlzZXJmc2NrIC0tY2hlY2suICovCit9OworCitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90IHNiX2Jsb2NrX2NvdW50OyAgICAgICAgICAgIC8qIDAgbnVtYmVyIG9mIGJsb2NrIG9uIGRhdGEgZGV2aWNlICovCisJdWludDMyX3Qgc2JfZnJlZV9ibG9ja3M7ICAgICAgICAgICAgLyogNCBmcmVlIGJsb2NrcyBjb3VudCAqLworCXVpbnQzMl90IHNiX3Jvb3RfYmxvY2s7ICAgICAgICAgICAgIC8qIDggcm9vdCBvZiB0aGUgdHJlZSAqLworCisJc3RydWN0IGpvdXJuYWxfcGFyYW1zIHNiX2pvdXJuYWw7ICAgLyogMTIgKi8KKworCXVpbnQxNl90IHNiX2Jsb2Nrc2l6ZTsgICAgICAgICAgLyogNDQgKi8KKwl1aW50MTZfdCBzYl9vaWRfbWF4c2l6ZTsgICAgICAgIC8qIDQ2IG1heCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSwgc2VlIGdldF9vYmplY3RpZCgpIGNvbW1lbnRhcnkgKi8KKwl1aW50MTZfdCBzYl9vaWRfY3Vyc2l6ZTsgICAgICAgIC8qIDQ4IGN1cnJlbnQgc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXkgKi8KKwl1aW50MTZfdCBzYl91bW91bnRfc3RhdGU7ICAgICAgIC8qIDUwIHRoaXMgaXMgc2V0IHRvIDEgd2hlbiBmaWxlc3lzdGVtIHdhcyB1bW91bnRlZCwgdG8gMiAtIHdoZW4gbm90ICovCisKKwljaGFyIHNfbWFnaWNbMTBdOyAgICAgICAgICAgICAgIC8qIDUyICJSZUlzRXJGcyIgb3IgIlJlSXNFcjJGcyIgb3IgIlJlSXNFcjNGcyIgKi8KKwl1aW50MTZfdCBzYl9mc19zdGF0ZTsgICAgICAgICAgIC8qIDYyIGl0IGlzIHNldCB0byB1c2VkIGJ5IGZzY2sgdG8gbWFyayB3aGljaCBwaGFzZSBvZiByZWJ1aWxkaW5nIGlzIGRvbmUgKHVzZWQgZm9yIGZzY2sgZGVidWdnaW5nKSAqLworCXVpbnQzMl90IHNiX2hhc2hfZnVuY3Rpb25fY29kZTsgLyogNjQgY29kZSBvZiBmdWN0aW9uIHdoaWNoIHdhcy9pcy93aWxsIGJlIHVzZWQgdG8gc29ydCBuYW1lcyBpbiBhIGRpcmVjdG9yeS4gU2VlIGNvZGVzIGluIGFib3ZlICovCisJdWludDE2X3Qgc2JfdHJlZV9oZWlnaHQ7ICAgICAgICAvKiA2OCBoZWlnaHQgb2YgZmlsZXN5dGVtIHRyZWUuIFRyZWUgY29uc2lzdGluZyBvZiBvbmx5IG9uZSByb290IGJsb2NrIGhhcyAyIGhlcmUgKi8KKwl1aW50MTZfdCBzYl9ibWFwX25yOyAgICAgICAgICAgIC8qIDcwIGFtb3VudCBvZiBiaXRtYXAgYmxvY2tzIG5lZWRlZCB0byBhZGRyZXNzIGVhY2ggYmxvY2sgb2YgZmlsZSBzeXN0ZW0gKi8KKwl1aW50MTZfdCBzYl92ZXJzaW9uOyAgICAgICAgICAgIC8qIDcyIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwgKi8KKwl1aW50MTZfdCBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbDsgIC8qIDc0IHNpemUgaW4gYmxvY2tzIG9mIGpvdXJuYWwgYXJlYSBvbiBtYWluIGRldmljZSwgd2UgbmVlZCB0byBrZWVwIGFmdGVyIG5vbi1zdGFuZGFyZCBqb3VybmFsIHJlbG9jYXRpb24gKi8KKwl1aW50MzJfdCBzYl9pbm9kZV9nZW5lcmF0aW9uOyAgIC8qIDc2ICovCisJdWludDMyX3Qgc2JfZmxhZ3M7ICAgICAgICAgICAgICAvKiA4MCBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07ICAgICAgIC8qIDg0IGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOyAgICAgIC8qIDEwMCBmaWxlc3lzdGVtIHZvbHVtZSBsYWJlbCAqLworCXVpbnQxNl90IHNiX21udF9jb3VudDsgICAgICAgICAgLyogMTE2ICovCisJdWludDE2X3Qgc2JfbWF4X21udF9jb3VudDsgICAgICAvKiAxMTggKi8KKwl1aW50MzJfdCBzYl9sYXN0Y2hlY2s7ICAgICAgICAgIC8qIDEyMCAqLworCXVpbnQzMl90IHNiX2NoZWNrX2ludGVydmFsOyAgICAgLyogMTI0ICovCisvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MSgpIHNvIGFueSBhZGRpdGlvbnMgbXVzdCBiZSB1cGRhdGVkIHRoZXJlIGFzIHdlbGwuICovCisJY2hhciBzX3VudXNlZFs3Nl07ICAgICAgICAgICAgICAvKiAxMjggKi8KKwkvKiAyMDQgKi8KK307CisKKy8qIEhlYWRlciBvZiBhIGRpc2sgYmxvY2suICBNb3JlIHByZWNpc2VseSwgaGVhZGVyIG9mIGEgZm9ybWF0dGVkIGxlYWYKKyAgIG9yIGludGVybmFsIG5vZGUsIGFuZCBub3QgdGhlIGhlYWRlciBvZiBhbiB1bmZvcm1hdHRlZCBub2RlLiAqLworc3RydWN0IGJsb2NrX2hlYWQgeworCXVpbnQxNl90IGJsazJfbGV2ZWw7ICAgICAgICAvKiBMZXZlbCBvZiBhIGJsb2NrIGluIHRoZSB0cmVlLiAqLworCXVpbnQxNl90IGJsazJfbnJfaXRlbTsgICAgICAvKiBOdW1iZXIgb2Yga2V5cy9pdGVtcyBpbiBhIGJsb2NrLiAqLworCXVpbnQxNl90IGJsazJfZnJlZV9zcGFjZTsgICAvKiBCbG9jayBmcmVlIHNwYWNlIGluIGJ5dGVzLiAqLworCXVpbnQxNl90IGJsa19yZXNlcnZlZDsKKwl1aW50MzJfdCByZXNlcnZlZFs0XTsKK307CisKKyNkZWZpbmUgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgKDY0ICogMTAyNCkKKworI2RlZmluZSBSRUlTRVJGU18zXzZfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIyRnMiCisjZGVmaW5lIFJFSVNFUkZTX0ZPUk1BVF8zXzYgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NQVhfTU5UX0NPVU5UICAgMzAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgbW91bnRzICovCisjZGVmaW5lIERFRkFVTFRfQ0hFQ0tfSU5URVJWQUwgICgxODAgKiA2MCAqIDYwICogMjQpICAgIC8qIDE4MCBkYXlzICovCisKKyNkZWZpbmUgRlNfQ0xFQU5MWV9VTU9VTlRFRCAgICAgMSAvKiB0aGlzIHdhcyBSRUlTRVJGU19WQUxJRF9GUyAqLworCisjZGVmaW5lIEpPVVJOQUxfTUlOX1NJWkUgICAgICAgIDUxMgorLyogYmlnZ2VzdCBwb3NzaWJsZSBzaW5nbGUgdHJhbnNhY3Rpb24sIGRvbid0IGNoYW5nZSBmb3Igbm93ICg4LzMvOTkpICovCisjZGVmaW5lIEpPVVJOQUxfVFJBTlNfTUFYICAgICAgIDEwMjQKKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19NSU4gICAgICAgMjU2ICAgICAvKiBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgd29ya3MgKi8KKyNkZWZpbmUgSk9VUk5BTF9ERUZBVUxUX1JBVElPICAgOCAgICAgICAvKiBkZWZhdWx0IGpvdXJuYWwgc2l6ZSAvIG1heCB0cmFucyBsZW5ndGggKi8KKyNkZWZpbmUgSk9VUk5BTF9NSU5fUkFUSU8gICAgICAgMgorLyogbWF4IGJsb2NrcyB0byBiYXRjaCBpbnRvIG9uZSB0cmFuc2FjdGlvbiwgZG9uJ3QgbWFrZSB0aGlzIGFueSBiaWdnZXIgdGhhbiA5MDAgKi8KKyNkZWZpbmUgSk9VUk5BTF9NQVhfQkFUQ0ggICAgICAgOTAwCisjZGVmaW5lIEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UgIDMwCisKKworLy8gU3RhbmRhcmQgbWtyZWlzZXJmcyAzLjYuMjE6CisvLyAgIC1iIHwgLS1ibG9jay1zaXplIE4gICAgICAgICAgICAgIHNpemUgb2YgZmlsZS1zeXN0ZW0gYmxvY2ssIGluIGJ5dGVzCisvLyAgIC1qIHwgLS1qb3VybmFsLWRldmljZSBGSUxFICAgICAgIHBhdGggdG8gc2VwYXJhdGUgZGV2aWNlIHRvIGhvbGQgam91cm5hbAorLy8gICAtcyB8IC0tam91cm5hbC1zaXplIE4gICAgICAgICAgICBzaXplIG9mIHRoZSBqb3VybmFsIGluIGJsb2NrcworLy8gICAtbyB8IC0tam91cm5hbC1vZmZzZXQgTiAgICAgICAgICBvZmZzZXQgb2YgdGhlIGpvdXJuYWwgZnJvbSB0aGUgc3RhcnQgb2YKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlcGFyYXRlIGRldmljZSwgaW4gYmxvY2tzCisvLyAgIC10IHwgLS10cmFuc2FjdGlvbi1tYXgtc2l6ZSBOICAgIG1heGltYWwgc2l6ZSBvZiB0cmFuc2FjdGlvbiwgaW4gYmxvY2tzCisvLyAgIC1CIHwgLS1iYWRibG9ja3MgZmlsZSAgICAgICAgICAgIHN0b3JlIGFsbCBiYWQgYmxvY2tzIGdpdmVuIGluIGZpbGUgb24gdGhlIGZzCisvLyAgIC1oIHwgLS1oYXNoIHJ1cGFzb3Z8dGVhfHI1ICAgICAgIGhhc2ggZnVuY3Rpb24gdG8gdXNlIGJ5IGRlZmF1bHQKKy8vICAgLXUgfCAtLXV1aWQgVVVJRCAgICAgICAgICAgICAgICAgc3RvcmUgVVVJRCBpbiB0aGUgc3VwZXJibG9jaworLy8gICAtbCB8IC0tbGFiZWwgTEFCRUwgICAgICAgICAgICAgICBzdG9yZSBMQUJFTCBpbiB0aGUgc3VwZXJibG9jaworLy8gICAtLWZvcm1hdCAzLjV8My42ICAgICAgICAgICAgICAgICBvbGQgMy41IGZvcm1hdCBvciBuZXdlciAzLjYKKy8vICAgLWYgfCAtLWZvcmNlICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIG9uY2UsIG1ha2UgbWtyZWlzZXJmcyB0aGUgd2hvbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzaywgbm90IGJsb2NrIGRldmljZSBvciBtb3VudGVkIHBhcnRpdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHR3aWNlLCBkbyBub3QgYXNrIGZvciBjb25maXJtYXRpb24KKy8vICAgLXEgfCAtLXF1aWV0ICAgICAgICAgICAgICAgICAgICAgcXVpZXQgd29yayB3aXRob3V0IG1lc3NhZ2VzLCBwcm9ncmVzcyBhbmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25zLiBVc2VmdWwgaWYgcnVuIGluIGEgc2NyaXB0LiBGb3IgdXNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGVuZCB1c2VycyBvbmx5LgorLy8gICAtZCB8IC0tZGVidWcgICAgICAgICAgICAgICAgICAgICBwcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZHVyaW5nIG1rcmVpc2VyCisvLyAgIC1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHZlcnNpb24gYW5kIGV4aXQKKworLy8gT3B0aW9ucyBub3QgY29tbWVudGVkIGJlbG93IGFyZSB0YWtlbiBidXQgc2lsZW50bHkgaWdub3JlZDoKK2VudW0geworCU9QVF9iID0gMSA8PCAwLAorCU9QVF9qID0gMSA8PCAxLAorCU9QVF9zID0gMSA8PCAyLAorCU9QVF9vID0gMSA8PCAzLAorCU9QVF90ID0gMSA8PCA0LAorCU9QVF9CID0gMSA8PCA1LAorCU9QVF9oID0gMSA8PCA2LAorCU9QVF91ID0gMSA8PCA3LAorCU9QVF9sID0gMSA8PCA4LAkJLy8gbGFiZWwKKwlPUFRfZiA9IDEgPDwgOSwJCS8vIGFzayBubyBxdWVzdGlvbnMKKwlPUFRfcSA9IDEgPDwgMTAsCisJT1BUX2QgPSAxIDw8IDExLAorCS8vT1BUX1YgPSAxIDw8IDEyLAkvLyAtViB2ZXJzaW9uLiBiYm94IGFwcGxldHMgZG9uJ3Qgc3VwcG9ydCB0aGF0Cit9OworCitpbnQgbWtmc19yZWlzZXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZnNfcmVpc2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBibG9ja3NpemUgPSA0MDk2OworCXVuc2lnbmVkIGpvdXJuYWxfYmxvY2tzID0gODE5MjsKKwl1bnNpZ25lZCBibG9ja3MsIGJpdG1hcF9ibG9ja3MsIGksIGJsb2NrOworCXRpbWVfdCB0aW1lc3RhbXA7CisJY29uc3QgY2hhciAqbGFiZWwgPSAiIjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQ7CisJdWludDhfdCAqYnVmOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGpvdXJuYWxfcGFyYW1zICpqcDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqcm9vdDsKKworCS8vIHVzaW5nIGdsb2JhbCAib3B0aW9uX21hc2szMiIgaW5zdGVhZCBvZiBsb2NhbCAib3B0cyI6CisJLy8gd2UgYXJlIHJlZ2lzdGVyIHN0YXJ2ZWQgaGVyZQorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOmIrIjsKKwkvKm9wdHMgPSovIGdldG9wdDMyKGFyZ3YsICJiOmo6czpvOnQ6QjpoOnU6bDpmcWQiLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmbGFiZWwpOworCWFyZ3YgKz0gb3B0aW5kOyAvLyBhcmd2WzBdIC0tIGRldmljZQorCisJLy8gY2hlY2sgdGhlIGRldmljZSBpcyBhIGJsb2NrIGRldmljZQorCWZkID0geG9wZW4oYXJndlswXSwgT19XUk9OTFkgfCBPX0VYQ0wpOworCXhmc3RhdChmZCwgJnN0LCBhcmd2WzBdKTsKKwlpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkgJiYgIShvcHRpb25fbWFzazMyICYgT1BUX2YpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsIGFyZ3ZbMF0pOworCisJLy8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZAorCS8vIE4uQi4gd2hhdCBpZiB3ZSBmb3JtYXQgYSBmaWxlPyBmaW5kX21vdW50X3BvaW50IHdpbGwgcmV0dXJuIGZhbHNlIG5lZ2F0aXZlIHNpbmNlCisJLy8gaXQgaXMgbG9vcCBibG9jayBkZXZpY2Ugd2hpY2ggaXMgbW91bnRlZCEKKwlpZiAoZmluZF9tb3VudF9wb2ludChhcmd2WzBdLCAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKworCS8vIG9wZW4gdGhlIGRldmljZSwgZ2V0IHNpemUgaW4gYmxvY2tzCisJYmxvY2tzID0gZ2V0X3ZvbHVtZV9zaXplX2luX2J5dGVzKGZkLCBhcmd2WzFdLCBibG9ja3NpemUsIC8qZXh0ZW5kOiovIDEpIC8gYmxvY2tzaXplOworCisJLy8gYmxvY2sgbnVtYmVyIHNhbml0eSBjaGVjaworCS8vIHdlIGhhdmUgYSBsaW1pdDogc2tpcHBlZCBhcmVhLCBzdXBlciBibG9jaywgam91cm5hbCBhbmQgcm9vdCBibG9jaworCS8vIGFsbCBoYXZlIHRvIGJlIGFkZHJlc3NlZCBieSBvbmUgZmlyc3QgYml0bWFwCisJYmxvY2sgPSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvIGJsb2Nrc2l6ZSAvLyBib290IGFyZWEKKwkJKyAxCQkvLyBzYgorCQkrIDEJCS8vIGJpdG1hcCMwCisJCSsgam91cm5hbF9ibG9ja3MrMQkvLyBqb3VybmFsCisJOworCisJLy8gY291bnQgb3ZlcmhlYWQKKwliaXRtYXBfYmxvY2tzID0gKGJsb2NrcyAtIDEpIC8gKGJsb2Nrc2l6ZSAqIDgpICsgMTsKKwlpID0gYmxvY2sgKyBiaXRtYXBfYmxvY2tzOworCisJLy8gY2hlY2sgb3ZlcmhlYWQKKwlpZiAoTUlOKGJsb2Nrc2l6ZSAqIDgsIGJsb2NrcykgPCBpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmVlZCA+PSAldSBibG9ja3MiLCBpKTsKKworCS8vIGFzayBjb25maXJtYXRpb24/CisJLy8gVE9ETzogPz8/CisKKwkvLyB3aXBlIG91dCBmaXJzdCBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyBvZiBkZXZpY2UKKwkvLyBUT0RPOiBkbyB3ZSByZWFsbHkgbmVlZCB0byB3aXBlPyEKKwl4bHNlZWsoZmQsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTLCBTRUVLX1NFVCk7CisKKwkvLyBmaWxsIHN1cGVyYmxvY2sKKwlzYiA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKil4emFsbG9jKGJsb2Nrc2l6ZSk7CisJLy8gYmxvY2sgY291bnQKKwlTVE9SRV9MRShzYi0+c2JfYmxvY2tfY291bnQsIGJsb2Nrcyk7CisJU1RPUkVfTEUoc2ItPnNiX2ZyZWVfYmxvY2tzLCBibG9ja3MgLSBpKTsKKwkvLyBUT0RPOiBkZWN5cGhlciEKKwlTVE9SRV9MRShzYi0+c2Jfcm9vdF9ibG9jaywgYmxvY2spOworCS8vIGZpbGwgam91cm5hbCByZWxhdGVkIGZpZWxkcworCWpwID0gJnNiLT5zYl9qb3VybmFsOworCVNUT1JFX0xFKGpwLT5qcF9qb3VybmFsXzFzdF9ibG9jaywgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgLyBibG9ja3NpemUgKyAxLypzYiovICsgMS8qYm1wIzAqLyk7CisJdGltZXN0YW1wID0gdGltZShOVUxMKTsKKwlzcmFuZG9tKHRpbWVzdGFtcCk7CisJU1RPUkVfTEUoanAtPmpwX2pvdXJuYWxfbWFnaWMsIHJhbmRvbSgpKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF9zaXplLCBqb3VybmFsX2Jsb2Nrcyk7CisJU1RPUkVfTEUoanAtPmpwX2pvdXJuYWxfdHJhbnNfbWF4LCBKT1VSTkFMX1RSQU5TX01BWCk7CisJU1RPUkVfTEUoanAtPmpwX2pvdXJuYWxfbWF4X2JhdGNoLCBKT1VSTkFMX01BWF9CQVRDSCk7CisJU1RPUkVfTEUoanAtPmpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2UsIEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UpOworCS8vIHNpemVzCisJU1RPUkVfTEUoc2ItPnNiX2Jsb2Nrc2l6ZSwgYmxvY2tzaXplKTsKKwlTVE9SRV9MRShzYi0+c2Jfb2lkX21heHNpemUsIChibG9ja3NpemUgLSBzaXplb2YoKnNiKSkgLyBzaXplb2YodWludDMyX3QpIC8gMiAqIDIpOworCVNUT1JFX0xFKHNiLT5zYl9vaWRfY3Vyc2l6ZSwgMik7IC8vICIuIiBhbmQgIi4uIgorCXN0cmNweShzYi0+c19tYWdpYywgUkVJU0VSRlNfM182X1NVUEVSX01BR0lDX1NUUklORyk7CisJU1RPUkVfTEUoc2ItPnNiX2JtYXBfbnIsIChiaXRtYXBfYmxvY2tzID4gKCgxTEwgPDwgMTYpIC0gMSkpID8gMCA6IGJpdG1hcF9ibG9ja3MpOworCS8vIG1pc2MKKwlTVE9SRV9MRShzYi0+c2JfdmVyc2lvbiwgUkVJU0VSRlNfRk9STUFUXzNfNik7CisJU1RPUkVfTEUoc2ItPnNiX2xhc3RjaGVjaywgdGltZXN0YW1wKTsKKwlTVE9SRV9MRShzYi0+c2JfY2hlY2tfaW50ZXJ2YWwsIERFRkFVTFRfQ0hFQ0tfSU5URVJWQUwpOworCVNUT1JFX0xFKHNiLT5zYl9tbnRfY291bnQsIDEpOworCVNUT1JFX0xFKHNiLT5zYl9tYXhfbW50X2NvdW50LCBERUZBVUxUX01BWF9NTlRfQ09VTlQpOworCVNUT1JFX0xFKHNiLT5zYl91bW91bnRfc3RhdGUsIEZTX0NMRUFOTFlfVU1PVU5URUQpOworCVNUT1JFX0xFKHNiLT5zYl90cmVlX2hlaWdodCwgMik7CisJU1RPUkVfTEUoc2ItPnNiX2hhc2hfZnVuY3Rpb25fY29kZSwgMyk7IC8vIFI1X0hBU0gKKwlTVE9SRV9MRShzYi0+c2JfZmxhZ3MsIDEpOworCS8vU1RPUkVfTEUoc2ItPnNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsLCAwKTsKKwkvLyBjcmVhdGUgVVVJRAorCWdlbmVyYXRlX3V1aWQoc2ItPnNfdXVpZCk7CisJLy8gd3JpdGUgdGhlIGxhYmVsCisJc2FmZV9zdHJuY3B5KChjaGFyICopc2ItPnNfbGFiZWwsIGxhYmVsLCBzaXplb2Yoc2ItPnNfbGFiZWwpKTsKKworCS8vIFRPRE86IEVNUElSSUMhIEVORElBTk5FU1MhCisJLy8gc3VwZXJibG9jayBoYXMgb25seSAyMDQgYnl0ZXMuIFdoYXQgYXJlIHRoZXNlPworCWJ1ZiA9ICh1aW50OF90ICopc2I7CisJYnVmWzIwNV0gPSAxOworCWJ1ZlsyMDldID0gMzsKKworCS8vIHB1dCBzdXBlcmJsb2NrCisJeHdyaXRlKGZkLCBzYiwgYmxvY2tzaXplKTsKKworCS8vIGNyZWF0ZSBiaXRtYXBzCisJYnVmID0geHphbGxvYyhibG9ja3NpemUpOworCisJLy8gYml0bWFwICMwIHVzZXMgaW5pdGlhbCAiYmxvY2siKzEgYmxvY2tzCisJaSA9IGJsb2NrICsgMTsKKwltZW1zZXQoYnVmLCAweEZGLCBpIC8gOCk7CisJYnVmW2kgLyA4XSA9ICgxIDw8IChpICYgNykpIC0gMTsgLy8wLi43ID0+IDAwMDAwMDAwLi4wMTExMTExMQorCS8vIG1hcmsgdHJhaWxpbmcgYWJzZW50IGJsb2NrcywgaWYgYW55CisJaWYgKGJsb2NrcyA8IDgqYmxvY2tzaXplKSB7CisJCXVuc2lnbmVkIG4gPSA4KmJsb2Nrc2l6ZSAtIGJsb2NrczsKKwkJaSA9IG4gLyA4OworCQlidWZbYmxvY2tzaXplIC0gaSAtIDFdIHw9IDB4N0YwMCA+PiAobiAmIDcpOyAvLzAuLjcgPT4gMDAwMDAwMDAuLjExMTExMTEwCisJCW1lbXNldChidWYgKyBibG9ja3NpemUgLSBpLCAweEZGLCBpKTsgLy8gTi5CLiBubyBvdmVyZmxvdyBoZXJlIQorCX0KKwkvLyBwdXQgYml0bWFwICMwCisJeHdyaXRlKGZkLCBidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBub3cgZ28gam91cm5hbCBibG9ja3MKKwltZW1zZXQoYnVmLCAwLCBibG9ja3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsX2Jsb2NrczsgaSsrKQorCQl4d3JpdGUoZmQsIGJ1ZiwgYmxvY2tzaXplKTsKKwkvLyBkdW1wIGpvdXJuYWwgY29udHJvbCBibG9jaworCW1lbWNweSgmKChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKilidWYpLT5qaF9qb3VybmFsLCAmc2ItPnNiX2pvdXJuYWwsIHNpemVvZihzYi0+c2Jfam91cm5hbCkpOworCXh3cml0ZShmZCwgYnVmLCBibG9ja3NpemUpOworCisJLy8gb3RoZXIgYml0bWFwcyBhcmUgaW4gZXZlcnkgKDgqYmxvY2tzaXplKS10aCBibG9jaworCS8vIE4uQi4gdGhleSB1c2UgdGhlIG9ubHkgYmxvY2sgLS0gbmFtZWx5IGJpdG1hcCBpdHNlbGYhCisJYnVmWzBdID0gMHgwMTsKKwkvLyBwdXQgYml0bWFwcworCWZvciAoaSA9IDE7IGkgPCBiaXRtYXBfYmxvY2tzOyBpKyspIHsKKwkJeGxzZWVrKGZkLCBpKjgqYmxvY2tzaXplICogYmxvY2tzaXplLCBTRUVLX1NFVCk7CisJCS8vIG1hcmsgdHJhaWxpbmcgYWJzZW50IGJsb2NrcywgaWYgYW55CisJCWlmIChpID09IGJpdG1hcF9ibG9ja3MgLSAxICYmIChibG9ja3MgJSAoOCpibG9ja3NpemUpKSkgeworCQkJdW5zaWduZWQgbiA9IDgqYmxvY2tzaXplIC0gYmxvY2tzICUgKDgqYmxvY2tzaXplKTsKKwkJCXVuc2lnbmVkIGogPSBuIC8gODsKKwkJCWJ1ZltibG9ja3NpemUgLSBqIC0gMV0gfD0gMHg3RjAwID4+IChuICYgNyk7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMTExMTExMTAKKwkJCW1lbXNldChidWYgKyBibG9ja3NpemUgLSBqLCAweEZGLCBqKTsgLy8gTi5CLiBubyBvdmVyZmxvdyBoZXJlIQorCQl9CisJCXh3cml0ZShmZCwgYnVmLCBibG9ja3NpemUpOworCX0KKworCS8vIGZpbGwgcm9vdCBibG9jaworCS8vIGJsb2NrIGhlYWQKKwltZW1zZXQoYnVmLCAwLCBibG9ja3NpemUpOworCXJvb3QgPSAoc3RydWN0IGJsb2NrX2hlYWQgKilidWY7CisJU1RPUkVfTEUocm9vdC0+YmxrMl9sZXZlbCwgMSk7IC8vIGxlYWYgbm9kZQorCVNUT1JFX0xFKHJvb3QtPmJsazJfbnJfaXRlbSwgMik7IC8vICIuIiBhbmQgIi4uIgorCVNUT1JFX0xFKHJvb3QtPmJsazJfZnJlZV9zcGFjZSwgYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBibG9ja19oZWFkKSk7CisJLy8gaXRlbSBoZWFkCisJLy8gcm9vdCBkaXJlY3RvcnkKKwkvLyBUT0RPOiBFTVBJUklDISBFTkRJQU5ORVNTIQorCS8vIFRPRE86IGluZGVudGVkIGFzc2lnbm1lbnRzIHNlZW0gdG8gYmUgdGltZXN0YW1wcworYnVmWzRdID0gMDEzNDsKK2J1ZlsyNF0gPSAwMTsKK2J1ZlsyOF0gPSAwMjsKK2J1Zls0Ml0gPSAwNTQ7CitidWZbNDRdID0gMDMyNDsKK2J1Zls0NV0gPSAwMTc7CitidWZbNDZdID0gMDE7CitidWZbNDhdID0gMDE7CitidWZbNTJdID0gMDI7CitidWZbNTZdID0gMDE7CitidWZbNjBdID0gMDM2NDsKK2J1Zls2MV0gPSAwMTsKK2J1Zls2NF0gPSAwMjsKK2J1Zls2Nl0gPSAwNjA7CitidWZbNjhdID0gMDI0NDsKK2J1Zls2OV0gPSAwMTc7CitidWZbNDAwNF0gPSAwMTsKK2J1Zls0MDA4XSA9IDAxOworYnVmWzQwMTJdID0gMDI7CitidWZbNDAxNl0gPSAwNTA7CitidWZbNDAxOF0gPSAwNDsKK2J1Zls0MDIwXSA9IDAyOworYnVmWzQwMjhdID0gMDE7CitidWZbNDAzMl0gPSAwNDA7CitidWZbNDAzNF0gPSAwNDsKKworYnVmWzQwMzZdID0gMDU2OyBidWZbNDAzN10gPSAwNTY7CS8vICIuLiIKK2J1Zls0MDQ0XSA9IDA1NjsJCQkvLyAiLiIKKworYnVmWzQwNTJdID0gMDM1NTsKK2J1Zls0MDUzXSA9IDAxMDE7CitidWZbNDA1Nl0gPSAwMzsKK2J1Zls0MDYwXSA9IDA2MDsKKwkJYnVmWzQwNzZdID0gMDE3MzsKKwkJYnVmWzQwNzddID0gMDI0MDsKKwlidWZbNDA3OF0gPSAwMzQ0OworCWJ1Zls0MDc5XSA9IDAxMTI7CisJCWJ1Zls0MDgwXSA9IDAxNzM7CisJCWJ1Zls0MDgxXSA9IDAyNDA7CisJYnVmWzQwODJdID0gMDM0NDsKKwlidWZbNDA4M10gPSAwMTEyOworCQlidWZbNDA4NF0gPSAwMTczOworCQlidWZbNDA4NV0gPSAwMjQwOworCWJ1Zls0MDg2XSA9IDAzNDQ7CisJYnVmWzQwODddID0gMDExMjsKK2J1Zls0MDg4XSA9IDAxOworCisJLy8gcHV0IHJvb3QgYmxvY2sKKwl4bHNlZWsoZmQsIGJsb2NrICogYmxvY2tzaXplLCBTRUVLX1NFVCk7CisJeHdyaXRlKGZkLCBidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBjbGVhbnVwCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoYnVmKTsKKwkJZnJlZShzYik7CisJfQorCisJeGNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ta2ZzX3ZmYXQuYyBiL3V0aWwtbGludXgvbWtmc192ZmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MWVkMAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtmc192ZmF0LmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rZnNfdmZhdDogdXRpbGl0eSB0byBjcmVhdGUgRkFUMzIgZmlsZXN5c3RlbQorICogaW5zcGlyZWQgYnkgZG9zZnN0b29scworICoKKyAqIEJ1c3lib3gnZWQgKDIwMDkpIGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX3ZmYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdl0gWy1uIExBQkVMXSBCTE9DS0RFViBbS0JZVEVTXSIKKy8qIEFjY2VwdGVkIGJ1dCBpZ25vcmVkOgorICAgICAgICJbLWNdIFstQ10gWy1JXSBbLWwgYmFkLWJsb2NrLWZpbGVdIFstYiBiYWNrdXAtYm9vdC1zZWN0b3JdICIKKyAgICAgICAiWy1tIGJvb3QtbXNnLWZpbGVdIFstaSB2b2x1bWUtaWRdICIKKyAgICAgICAiWy1zIHNlY3RvcnMtcGVyLWNsdXN0ZXJdIFstUyBsb2dpY2FsLXNlY3Rvci1zaXplXSBbLWYgbnVtYmVyLW9mLUZBVHNdICIKKyAgICAgICAiWy1oIGhpZGRlbi1zZWN0b3JzXSBbLUYgZmF0LXNpemVdIFstciByb290LWRpci1lbnRyaWVzXSBbLVIgcmVzZXJ2ZWQtc2VjdG9yc10gIgorKi8KKy8vdXNhZ2U6I2RlZmluZSBta2ZzX3ZmYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYWtlIGEgRkFUMzIgZmlsZXN5c3RlbVxuIgorLyogLy91c2FnZTogICJcbgktYwlDaGVjayBkZXZpY2UgZm9yIGJhZCBibG9ja3MiICovCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvKiAvL3VzYWdlOiAgIlxuCS1JCUFsbG93IHRvIHVzZSBlbnRpcmUgZGlzayBkZXZpY2UgKGUuZy4gL2Rldi9oZGEpIiAqLworLy91c2FnZTogICAgICJcbgktbiBMQkwJVm9sdW1lIGxhYmVsIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+IC8qIEhESU9fR0VUR0VPICovCisjaW5jbHVkZSA8bGludXgvZmQuaD4gICAgLyogRkRHRVRQUk0gKi8KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4gICAvKiBCTEtTU1pHRVQgKi8KKyNpZiAhZGVmaW5lZChCTEtTU1pHRVQpCisjIGRlZmluZSBCTEtTU1pHRVQgX0lPKDB4MTIsIDEwNCkKKyNlbmRpZgorLy8jaW5jbHVkZSA8bGludXgvbXNkb3NfZnMuaD4KKworI2RlZmluZSBTRUNUT1JfU0laRSAgICAgICAgICAgICA1MTIKKworI2RlZmluZSBTRUNUT1JTX1BFUl9CTE9DSwkoQkxPQ0tfU0laRSAvIFNFQ1RPUl9TSVpFKQorCisvLyBNJCBzYXlzIHRoZSBoaWdoIDQgYml0cyBvZiBhIEZBVDMyIEZBVCBlbnRyeSBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgRU9GX0ZBVDMyICAgICAgIDB4MEZGRkZGRjgKKyNkZWZpbmUgQkFEX0ZBVDMyICAgICAgIDB4MEZGRkZGRjcKKyNkZWZpbmUgTUFYX0NMVVNUXzMyICAgIDB4MEZGRkZGRjAKKworI2RlZmluZSBBVFRSX1ZPTFVNRSAgICAgOAorCisjZGVmaW5lIE5VTV9GQVRTICAgICAgICAyCisKKy8qIEZBVDMyIGZpbGVzeXN0ZW0gbG9va3MgbGlrZSB0aGlzOgorICogc2VjdG9yIC1ubi4uLi0xOiAiaGlkZGVuIiBzZWN0b3JzLCBhbGwgc2VjdG9ycyBiZWZvcmUgdGhpcyBwYXJ0aXRpb24KKyAqICgtaCBoaWRkZW4tc2VjdG9ycyBzZXRzIGl0LiBVc2VmdWwgb25seSBmb3IgYm9vdCBsb2FkZXJzLAorICogIHRoZXkgbmVlZCB0byBrbm93IF9kaXNrXyBvZmZzZXQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkKKyAqICBhZGRyZXNzIHNlY3RvcnMgcmVsYXRpdmUgdG8gc3RhcnQgb2YgZGlzaykKKyAqIHNlY3RvciAwOiBib290IHNlY3RvcgorICogc2VjdG9yIDE6IGluZm8gc2VjdG9yCisgKiBzZWN0b3IgMjogc2V0IGFzaWRlIGZvciBib290IGNvZGUgd2hpY2ggZGlkbid0IGZpdCBpbnRvIHNlY3RvciAwCisgKiAuLi4oemVyby1maWxsZWQgc2VjdG9ycykuLi4KKyAqIHNlY3RvciBCOiBiYWNrdXAgY29weSBvZiBzZWN0b3IgMCBbQiBzZXQgYnkgLWIgYmFja3VwLWJvb3Qtc2VjdG9yXQorICogc2VjdG9yIEIrMTogYmFja3VwIGNvcHkgb2Ygc2VjdG9yIDEKKyAqIHNlY3RvciBCKzI6IGJhY2t1cCBjb3B5IG9mIHNlY3RvciAyCisgKiAuLi4oemVyby1maWxsZWQgc2VjdG9ycykuLi4KKyAqIHNlY3RvciBSOiBGQVQjMSBbUiBzZXQgYnkgLVIgcmVzZXJ2ZWQtc2VjdG9yc10KKyAqIC4uLihGQVQjMSkuLi4KKyAqIHNlY3RvciBSK2ZhdF9zaXplOiBGQVQjMgorICogLi4uKEZBVCMyKS4uLgorICogc2VjdG9yIFIrZmF0X3NpemUqMjogY2x1c3RlciAjMgorICogLi4uKGNsdXN0ZXIgIzIpLi4uCisgKiBzZWN0b3IgUitmYXRfc2l6ZSoyK2NsdXN0X3NpemU6IGNsdXN0ZXIgIzMKKyAqIC4uLih0aGUgcmVzdCBpcyBmaWxsZWQgYnkgY2x1c3RlcnMgdGlsbCB0aGUgZW5kKS4uLgorICovCisKK2VudW0geworLy8gUGVyaGFwcyB0aGlzIHNob3VsZCByZW1haW4gY29uc3RhbnQKKwlpbmZvX3NlY3Rvcl9udW1iZXIgPSAxLAorLy8gVE9ETzogbWFrZSB0aGVzZSBjbWRsaW5lIG9wdGlvbnMKKy8vIGRvbnQgZm9yZ2V0IHNhbml0eSBjaGVjazogYmFja3VwX2Jvb3Rfc2VjdG9yICsgMyA8PSByZXNlcnZlZF9zZWN0CisJYmFja3VwX2Jvb3Rfc2VjdG9yID0gMywKKwlyZXNlcnZlZF9zZWN0ICAgICAgPSA2LAorfTsKKworLy8gaG93IG1hbnkgYmxvY2tzIHdlIHRyeSB0byByZWFkIHdoaWxlIHRlc3RpbmcKKyNkZWZpbmUgVEVTVF9CVUZGRVJfQkxPQ0tTICAgICAgMTYKKworc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSB7CisJY2hhciAgICAgbmFtZVsxMV07ICAgICAgIC8qIDAwMCBuYW1lIGFuZCBleHRlbnNpb24gKi8KKwl1aW50OF90ICBhdHRyOyAgICAgICAgICAgLyogMDBiIGF0dHJpYnV0ZSBiaXRzICovCisJdWludDhfdCAgbGNhc2U7ICAgICAgICAgIC8qIDAwYyBjYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KKwl1aW50OF90ICBjdGltZV9jczsgICAgICAgLyogMDBkIGNyZWF0aW9uIHRpbWUsIGNlbnRpc2Vjb25kcyAoMC0xOTkpICovCisJdWludDE2X3QgY3RpbWU7ICAgICAgICAgIC8qIDAwZSBjcmVhdGlvbiB0aW1lICovCisJdWludDE2X3QgY2RhdGU7ICAgICAgICAgIC8qIDAxMCBjcmVhdGlvbiBkYXRlICovCisJdWludDE2X3QgYWRhdGU7ICAgICAgICAgIC8qIDAxMiBsYXN0IGFjY2VzcyBkYXRlICovCisJdWludDE2X3Qgc3RhcnRoaTsgICAgICAgIC8qIDAxNCBoaWdoIDE2IGJpdHMgb2YgY2x1c3RlciBpbiBGQVQzMiAqLworCXVpbnQxNl90IHRpbWU7ICAgICAgICAgICAvKiAwMTYgdGltZSAqLworCXVpbnQxNl90IGRhdGU7ICAgICAgICAgICAvKiAwMTggZGF0ZSAqLworCXVpbnQxNl90IHN0YXJ0OyAgICAgICAgICAvKiAwMWEgZmlyc3QgY2x1c3RlciAqLworCXVpbnQzMl90IHNpemU7ICAgICAgICAgICAvKiAwMWMgZmlsZSBzaXplIGluIGJ5dGVzICovCit9IFBBQ0tFRDsKKworLyogRXhhbXBsZSBvZiBib290IHNlY3RvcidzIGJlZ2lubmluZzoKKzAwMDAgIGViIDU4IDkwIDRkIDUzIDU3IDQ5IDRlICAzNCAyZSAzMSAwMCAwMiAwOCAyNiAwMCAgfC4uLk1TV0lONC4xLi4uJi58CiswMDEwICAwMiAwMCAwMCAwMCAwMCBmOCAwMCAwMCAgM2YgMDAgZmYgMDAgM2YgMDAgMDAgMDAgIHwuLi4uLi4uLj8uLi4/Li4ufAorMDAyMCAgNTQgOWIgZDAgMDAgMGQgMzQgMDAgMDAgIDAwIDAwIDAwIDAwIDAyIDAwIDAwIDAwICB8VC4uLi40Li4uLi4uLi4uLnwKKzAwMzAgIDAxIDAwIDA2IDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDQwICA4MCAwMCAyOSA3MSBkZiA1MSBlMCA0ZSAgNGYgMjAgNGUgNDEgNGQgNDUgMjAgMjAgIHwuLilxLlEuTk8gTkFNRSAgfAorMDA1MCAgMjAgMjAgNDYgNDEgNTQgMzMgMzIgMjAgIDIwIDIwIDMzIGM5IDhlIGQxIGJjIGY0ICB8ICBGQVQzMiAgIDMuLi4uLnwKKyovCitzdHJ1Y3QgbXNkb3Nfdm9sdW1lX2luZm8geyAvKiAob2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gc3RhcnQgb2YgYm9vdCBzZWN0b3IpICovCisJdWludDhfdCAgZHJpdmVfbnVtYmVyOyAgICAvKiAwNDAgQklPUyBkcml2ZSBudW1iZXIgKi8KKwl1aW50OF90ICByZXNlcnZlZDsgICAgICAgIC8qIDA0MSB1bnVzZWQgKi8KKwl1aW50OF90ICBleHRfYm9vdF9zaWduOwkgIC8qIDA0MiAweDI5IGlmIGZpZWxkcyBiZWxvdyBleGlzdCAoRE9TIDMuMyspICovCisJdWludDMyX3Qgdm9sdW1lX2lkMzI7ICAgICAvKiAwNDMgdm9sdW1lIElEIG51bWJlciAqLworCWNoYXIgICAgIHZvbHVtZV9sYWJlbFsxMV07LyogMDQ3IHZvbHVtZSBsYWJlbCAqLworCWNoYXIgICAgIGZzX3R5cGVbOF07ICAgICAgLyogMDUyIHR5cGljYWxseSAiRkFUbm4iICovCit9IFBBQ0tFRDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDVhIGVuZC4gVG90YWwgc2l6ZSAyNiAoMHgxYSkgYnl0ZXMgKi8KKworc3RydWN0IG1zZG9zX2Jvb3Rfc2VjdG9yIHsKKwkvKiBXZSB1c2Ugc3RyY3B5IHRvIGZpbGwgYm90aCwgYW5kIGdjYy00LjQueCBjb21wbGFpbnMgaWYgdGhleSBhcmUgc2VwYXJhdGUgKi8KKwljaGFyICAgICBib290X2p1bXBfYW5kX3N5c19pZFszKzhdOyAvKiAwMDAgc2hvcnQgb3IgbmVhciBqdW1wIGluc3RydWN0aW9uICovCisJLypjaGFyICAgc3lzdGVtX2lkWzhdOyovICAgICAvKiAwMDMgbmFtZSAtIGNhbiBiZSB1c2VkIHRvIHNwZWNpYWwgY2FzZSBwYXJ0aXRpb24gbWFuYWdlciB2b2x1bWVzICovCisJdWludDE2X3QgYnl0ZXNfcGVyX3NlY3Q7ICAgICAvKiAwMGIgYnl0ZXMgcGVyIGxvZ2ljYWwgc2VjdG9yICovCisJdWludDhfdCAgc2VjdF9wZXJfY2x1c3Q7ICAgICAvKiAwMGQgc2VjdG9ycy9jbHVzdGVyICovCisJdWludDE2X3QgcmVzZXJ2ZWRfc2VjdDsgICAgICAvKiAwMGUgcmVzZXJ2ZWQgc2VjdG9ycyAoc2VjdG9yIG9mZnNldCBvZiAxc3QgRkFUIHJlbGF0aXZlIHRvIHZvbHVtZSBzdGFydCkgKi8KKwl1aW50OF90ICBmYXRzOyAgICAgICAgICAgICAgIC8qIDAxMCBudW1iZXIgb2YgRkFUcyAqLworCXVpbnQxNl90IGRpcl9lbnRyaWVzOyAgICAgICAgLyogMDExIHJvb3QgZGlyZWN0b3J5IGVudHJpZXMgKi8KKwl1aW50MTZfdCB2b2x1bWVfc2l6ZV9zZWN0OyAgIC8qIDAxMyB2b2x1bWUgc2l6ZSBpbiBzZWN0b3JzICovCisJdWludDhfdCAgbWVkaWFfYnl0ZTsgICAgICAgICAvKiAwMTUgbWVkaWEgY29kZSAqLworCXVpbnQxNl90IHNlY3RfcGVyX2ZhdDsgICAgICAgLyogMDE2IHNlY3RvcnMvRkFUICovCisJdWludDE2X3Qgc2VjdF9wZXJfdHJhY2s7ICAgICAvKiAwMTggc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1aW50MTZfdCBoZWFkczsgICAgICAgICAgICAgIC8qIDAxYSBudW1iZXIgb2YgaGVhZHMgKi8KKwl1aW50MzJfdCBoaWRkZW47ICAgICAgICAgICAgIC8qIDAxYyBoaWRkZW4gc2VjdG9ycyAoc2VjdG9yIG9mZnNldCBvZiB2b2x1bWUgd2l0aGluIHBoeXNpY2FsIGRpc2spICovCisJdWludDMyX3QgZmF0MzJfdm9sdW1lX3NpemVfc2VjdDsgLyogMDIwIHZvbHVtZSBzaXplIGluIHNlY3RvcnMgKGlmIHZvbHVtZV9zaXplX3NlY3QgPT0gMCkgKi8KKwl1aW50MzJfdCBmYXQzMl9zZWN0X3Blcl9mYXQ7IC8qIDAyNCBzZWN0b3JzL0ZBVCAqLworCXVpbnQxNl90IGZhdDMyX2ZsYWdzOyAgICAgICAgLyogMDI4IGJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLworCXVpbnQ4X3QgIGZhdDMyX3ZlcnNpb25bMl07ICAgLyogMDJhIG1ham9yLCBtaW5vciBmaWxlc3lzdGVtIHZlcnNpb24gKEkgc2VlIDAsMCkgKi8KKwl1aW50MzJfdCBmYXQzMl9yb290X2NsdXN0ZXI7IC8qIDAyYyBmaXJzdCBjbHVzdGVyIGluIHJvb3QgZGlyZWN0b3J5ICovCisJdWludDE2X3QgZmF0MzJfaW5mb19zZWN0b3I7ICAvKiAwMzAgZmlsZXN5c3RlbSBpbmZvIHNlY3RvciAodXN1YWxseSAxKSAqLworCXVpbnQxNl90IGZhdDMyX2JhY2t1cF9ib290OyAgLyogMDMyIGJhY2t1cCBib290IHNlY3RvciAodXN1YWxseSA2KSAqLworCXVpbnQzMl90IHJlc2VydmVkMlszXTsgICAgICAgLyogMDM0IHVudXNlZCAqLworCXN0cnVjdCBtc2Rvc192b2x1bWVfaW5mbyB2aTsgLyogMDQwICovCisJY2hhciAgICAgYm9vdF9jb2RlWzB4MjAwIC0gMHg1YSAtIDJdOyAvKiAwNWEgKi8KKyNkZWZpbmUgQk9PVF9TSUdOIDB4QUE1NQorCXVpbnQxNl90IGJvb3Rfc2lnbjsgICAgICAgICAgLyogMWZlICovCit9IFBBQ0tFRDsKKworI2RlZmluZSBGQVRfRlNJTkZPX1NJRzEgMHg0MTYxNTI1MgorI2RlZmluZSBGQVRfRlNJTkZPX1NJRzIgMHg2MTQxNzI3Mgorc3RydWN0IGZhdDMyX2ZzaW5mbyB7CisJdWludDMyX3Qgc2lnbmF0dXJlMTsgICAgICAgICAvKiAweDUyLDB4NTIsMHg0MSwweDYxLCAiUlJhQSIgKi8KKwl1aW50MzJfdCByZXNlcnZlZDFbMTI4IC0gOF07CisJdWludDMyX3Qgc2lnbmF0dXJlMjsgICAgICAgICAvKiAweDcyLDB4NzIsMHg2MSwweDQxLCAicnJBYSIgKi8KKwl1aW50MzJfdCBmcmVlX2NsdXN0ZXJzOyAgICAgIC8qIGZyZWUgY2x1c3RlciBjb3VudC4gIC0xIGlmIHVua25vd24gKi8KKwl1aW50MzJfdCBuZXh0X2NsdXN0ZXI7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGNsdXN0ZXIgKi8KKwl1aW50MzJfdCByZXNlcnZlZDJbM107CisJdWludDE2X3QgcmVzZXJ2ZWQzOyAgICAgICAgICAvKiAxZmMgKi8KKwl1aW50MTZfdCBib290X3NpZ247ICAgICAgICAgIC8qIDFmZSAqLworfSBQQUNLRUQ7CisKK3N0cnVjdCBidWdfY2hlY2sgeworCWNoYXIgQlVHMVtzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAgKSA9PSAweDIwID8gMSA6IC0xXTsKKwljaGFyIEJVRzJbc2l6ZW9mKHN0cnVjdCBtc2Rvc192b2x1bWVfaW5mbykgPT0gMHgxYSA/IDEgOiAtMV07CisJY2hhciBCVUczW3NpemVvZihzdHJ1Y3QgbXNkb3NfYm9vdF9zZWN0b3IpID09IDB4MjAwID8gMSA6IC0xXTsKKwljaGFyIEJVRzRbc2l6ZW9mKHN0cnVjdCBmYXQzMl9mc2luZm8gICAgICkgPT0gMHgyMDAgPyAxIDogLTFdOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYm9vdF9jb2RlW10gQUxJR04xID0KKwkiXHgwZSIgICAgICAgICAgLyogMDVhOiAgICAgICAgIHB1c2ggIGNzICovCisJIlx4MWYiICAgICAgICAgIC8qIDA1YjogICAgICAgICBwb3AgICBkcyAqLworCSJceGJlXHg3N1x4N2MiICAvKiAgd3JpdGVfbXNnOiAgbW92ICAgc2ksIG9mZnNldCBtZXNzYWdlX3R4dCAqLworCSJceGFjIiAgICAgICAgICAvKiAwNWY6ICAgICAgICAgbG9kc2IgKi8KKwkiXHgyMlx4YzAiICAgICAgLyogMDYwOiAgICAgICAgIGFuZCAgIGFsLCBhbCAqLworCSJceDc0XHgwYiIgICAgICAvKiAwNjI6ICAgICAgICAganogICAga2V5X3ByZXNzICovCisJIlx4NTYiICAgICAgICAgIC8qIDA2NDogICAgICAgICBwdXNoICBzaSAqLworCSJceGI0XHgwZSIgICAgICAvKiAwNjU6ICAgICAgICAgbW92ICAgYWgsIDBlaCAqLworCSJceGJiXHgwN1x4MDAiICAvKiAwNjc6ICAgICAgICAgbW92ICAgYngsIDAwMDdoICovCisJIlx4Y2RceDEwIiAgICAgIC8qIDA2YTogICAgICAgICBpbnQgICAxMGggKi8KKwkiXHg1ZSIgICAgICAgICAgLyogMDZjOiAgICAgICAgIHBvcCAgIHNpICovCisJIlx4ZWJceGYwIiAgICAgIC8qIDA2ZDogICAgICAgICBqbXAgICB3cml0ZV9tc2cgKi8KKwkiXHgzMlx4ZTQiICAgICAgLyogIGtleV9wcmVzczogIHhvciAgIGFoLCBhaCAqLworCSJceGNkXHgxNiIgICAgICAvKiAwNzE6ICAgICAgICAgaW50ICAgMTZoICovCisJIlx4Y2RceDE5IiAgICAgIC8qIDA3MzogICAgICAgICBpbnQgICAxOWggKi8KKwkiXHhlYlx4ZmUiICAgICAgLyogIGZvbzogICAgICAgIGptcCAgIGZvbyAqLworCS8qIDA3NzogbWVzc2FnZV90eHQ6ICovCisJIlRoaXMgaXMgbm90IGEgYm9vdGFibGUgZGlza1xyXG4iOworCisKKyNkZWZpbmUgTUFSS19DTFVTVEVSKGNsdXN0ZXIsIHZhbHVlKSBcCisJKCh1aW50MzJfdCAqKWZhdClbY2x1c3Rlcl0gPSBTV0FQX0xFMzIodmFsdWUpCisKK3ZvaWQgQlVHX3Vuc3VwcG9ydGVkX2ZpZWxkX3NpemUodm9pZCk7CisjZGVmaW5lIFNUT1JFX0xFKGZpZWxkLCB2YWx1ZSkgXAorZG8geyBcCisJaWYgKHNpemVvZihmaWVsZCkgPT0gNCkgXAorCQlmaWVsZCA9IFNXQVBfTEUzMih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDIpIFwKKwkJZmllbGQgPSBTV0FQX0xFMTYodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAxKSBcCisJCWZpZWxkID0gKHZhbHVlKTsgXAorCWVsc2UgXAorCQlCVUdfdW5zdXBwb3J0ZWRfZmllbGRfc2l6ZSgpOyBcCit9IHdoaWxlICgwKQorCisvKiBjb21wYXQ6CisgKiBta2Rvc2ZzIDIuMTEgKDEyIE1hciAyMDA1KQorICogVXNhZ2U6IG1rZG9zZnMgWy1BXSBbLWNdIFstQ10gWy12XSBbLUldIFstbCBiYWQtYmxvY2stZmlsZV0KKyAqICAgICAgICBbLWIgYmFja3VwLWJvb3Qtc2VjdG9yXQorICogICAgICAgIFstbSBib290LW1zZy1maWxlXSBbLW4gdm9sdW1lLW5hbWVdIFstaSB2b2x1bWUtaWRdCisgKiAgICAgICAgWy1zIHNlY3RvcnMtcGVyLWNsdXN0ZXJdIFstUyBsb2dpY2FsLXNlY3Rvci1zaXplXQorICogICAgICAgIFstZiBudW1iZXItb2YtRkFUc10KKyAqICAgICAgICBbLWggaGlkZGVuLXNlY3RvcnNdIFstRiBmYXQtc2l6ZV0gWy1yIHJvb3QtZGlyLWVudHJpZXNdCisgKiAgICAgICAgWy1SIHJlc2VydmVkLXNlY3RvcnNdCisgKiAgICAgICAgL2Rldi9uYW1lIFtibG9ja3NdCisgKi8KK2ludCBta2ZzX3ZmYXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZnNfdmZhdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqdm9sdW1lX2xhYmVsID0gIiI7CisJY2hhciAqYnVmOworCWNoYXIgKmRldmljZV9uYW1lOworCXVvZmZfdCB2b2x1bWVfc2l6ZV9ieXRlczsKKwl1b2ZmX3Qgdm9sdW1lX3NpemVfc2VjdDsKKwl1aW50MzJfdCB0b3RhbF9jbHVzdDsKKwl1aW50MzJfdCB2b2x1bWVfaWQ7CisJaW50IGRldjsKKwl1bnNpZ25lZCBieXRlc19wZXJfc2VjdDsKKwl1bnNpZ25lZCBzZWN0X3Blcl9mYXQ7CisJdW5zaWduZWQgb3B0czsKKwl1aW50MTZfdCBzZWN0X3Blcl90cmFjazsKKwl1aW50OF90IG1lZGlhX2J5dGU7CisJdWludDhfdCBzZWN0X3Blcl9jbHVzdDsKKwl1aW50OF90IGhlYWRzOworCWVudW0geworCQlPUFRfQSA9IDEgPDwgMCwgIC8vIFtJR05PUkVEXSBhdGFyaSBmb3JtYXQKKwkJT1BUX2IgPSAxIDw8IDEsCSAvLyBbSUdOT1JFRF0gbG9jYXRpb24gb2YgYmFja3VwIGJvb3Qgc2VjdG9yCisJCU9QVF9jID0gMSA8PCAyLAkgLy8gW0lHTk9SRURdIGNoZWNrIGZpbGVzeXN0ZW0KKwkJT1BUX0MgPSAxIDw8IDMsCSAvLyBbSUdOT1JFRF0gY3JlYXRlIGEgbmV3IGZpbGUKKwkJT1BUX2YgPSAxIDw8IDQsCSAvLyBbSUdOT1JFRF0gbnVtYmVyIG9mIEZBVHMKKwkJT1BUX0YgPSAxIDw8IDUsCSAvLyBbSUdOT1JFRCwgaW1wbGllZCAzMl0gY2hvb3NlIEZBVCBzaXplCisJCU9QVF9oID0gMSA8PCA2LAkgLy8gW0lHTk9SRURdIG51bWJlciBvZiBoaWRkZW4gc2VjdG9ycworCQlPUFRfSSA9IDEgPDwgNywJIC8vIFtJR05PUkVEXSBkb24ndCBiYXJrIGF0IGVudGlyZSBkaXNrIGRldmljZXMKKwkJT1BUX2kgPSAxIDw8IDgsCSAvLyBbSUdOT1JFRF0gdm9sdW1lIElECisJCU9QVF9sID0gMSA8PCA5LAkgLy8gW0lHTk9SRURdIGJhZCBibG9jayBmaWxlbmFtZQorCQlPUFRfbSA9IDEgPDwgMTAsIC8vIFtJR05PUkVEXSBtZXNzYWdlIGZpbGUKKwkJT1BUX24gPSAxIDw8IDExLCAvLyB2b2x1bWUgbGFiZWwKKwkJT1BUX3IgPSAxIDw8IDEyLCAvLyBbSUdOT1JFRF0gcm9vdCBkaXJlY3RvcnkgZW50cmllcworCQlPUFRfUiA9IDEgPDwgMTMsIC8vIFtJR05PUkVEXSBudW1iZXIgb2YgcmVzZXJ2ZWQgc2VjdG9ycworCQlPUFRfcyA9IDEgPDwgMTQsIC8vIFtJR05PUkVEXSBzZWN0b3JzIHBlciBjbHVzdGVyCisJCU9QVF9TID0gMSA8PCAxNSwgLy8gW0lHTk9SRURdIHNlY3RvciBzaXplCisJCU9QVF92ID0gMSA8PCAxNiwgLy8gdmVyYm9zZQorCX07CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7Ly86Yis6Zis6Ris6aCs6cis6Uis6cys6Uys6dnY6Yy0tbDpsLS1jIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIkFiOmNDZjpGOmg6SWk6bDptOm46cjpSOnM6Uzp2IiwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgJnZvbHVtZV9sYWJlbCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyBjYWNoZSBkZXZpY2UgbmFtZQorCWRldmljZV9uYW1lID0gYXJndlswXTsKKwkvLyBkZWZhdWx0IHZvbHVtZSBJRCA9IGNyZWF0aW9uIHRpbWUKKwl2b2x1bWVfaWQgPSB0aW1lKE5VTEwpOworCisJZGV2ID0geG9wZW4oZGV2aWNlX25hbWUsIE9fUkRXUik7CisJeGZzdGF0KGRldiwgJnN0LCBkZXZpY2VfbmFtZSk7CisKKwkvLworCS8vIEdldCBpbWFnZSBzaXplIGFuZCBzZWN0b3Igc2l6ZQorCS8vCisJYnl0ZXNfcGVyX3NlY3QgPSBTRUNUT1JfU0laRTsKKwlpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKKwkJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCQlpZiAoIWFyZ3ZbMV0pCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImltYWdlIHNpemUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKwkJfQorCQkvLyBub3QgYSBibG9jayBkZXZpY2UsIHNraXAgYmFkIHNlY3RvcnMgY2hlY2sKKwkJb3B0cyAmPSB+T1BUX2M7CisJfSBlbHNlIHsKKwkJaW50IG1pbl9ieXRlc19wZXJfc2VjdDsKKyNpZiAwCisJCXVuc2lnbmVkIGRldmljZV9udW07CisJCS8vIGZvciB0cnVlIGJsb2NrIGRldmljZXMgd2UgZG8gY2hlY2sgc2FuaXR5CisJCWRldmljZV9udW0gPSBzdC5zdF9yZGV2ICYgMHhmZjNmOworCQkvLyBkbyB3ZSBhbGxvdyB0byBmb3JtYXQgdGhlIHdob2xlIGRpc2sgZGV2aWNlPworCQlpZiAoIShvcHRzICYgT1BUX0kpICYmICgKKwkJCWRldmljZV9udW0gPT0gMHgwMzAwIHx8IC8vIGhkYSwgaGRiCisJCQkoZGV2aWNlX251bSAmIDB4ZmYwZikgPT0gMHgwODAwIHx8IC8vIHNkCisJCQlkZXZpY2VfbnVtID09IDB4MGQwMCB8fCAvLyB4ZAorCQkJZGV2aWNlX251bSA9PSAweDE2MDAgKSAgLy8gaGRjLCBoZGQKKwkJKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndpbGwgbm90IHRyeSB0byBtYWtlIGZpbGVzeXN0ZW0gb24gZnVsbC1kaXNrIGRldmljZSAodXNlIC1JIGlmIHdhbnRlZCkiKTsKKwkJLy8gY2FuJ3Qgd29yayBvbiBtb3VudGVkIGZpbGVzeXN0ZW1zCisJCWlmIChmaW5kX21vdW50X3BvaW50KGRldmljZV9uYW1lLCAwKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmb3JtYXQgbW91bnRlZCBmaWxlc3lzdGVtIik7CisjZW5kaWYKKwkJLy8gZ2V0IHRydWUgc2VjdG9yIHNpemUKKwkJLy8gKHBhcmFtZXRlciBtdXN0IGJlIGludCosIG5vdCBsb25nKiBvciBzaXplX3QqKQorCQl4aW9jdGwoZGV2LCBCTEtTU1pHRVQsICZtaW5fYnl0ZXNfcGVyX3NlY3QpOworCQlpZiAobWluX2J5dGVzX3Blcl9zZWN0ID4gU0VDVE9SX1NJWkUpIHsKKwkJCWJ5dGVzX3Blcl9zZWN0ID0gbWluX2J5dGVzX3Blcl9zZWN0OworCQkJYmJfZXJyb3JfbXNnKCJmb3IgdGhpcyBkZXZpY2Ugc2VjdG9yIHNpemUgaXMgJXUiLCBtaW5fYnl0ZXNfcGVyX3NlY3QpOworCQl9CisJfQorCXZvbHVtZV9zaXplX2J5dGVzID0gZ2V0X3ZvbHVtZV9zaXplX2luX2J5dGVzKGRldiwgYXJndlsxXSwgMTAyNCwgLypleHRlbmQ6Ki8gMSk7CisJdm9sdW1lX3NpemVfc2VjdCA9IHZvbHVtZV9zaXplX2J5dGVzIC8gYnl0ZXNfcGVyX3NlY3Q7CisKKwkvLworCS8vIEZpbmQgb3V0IG9yIGd1ZXNzIG1lZGlhIHBhcmFtZXRlcnMKKwkvLworCW1lZGlhX2J5dGUgPSAweGY4OworCWhlYWRzID0gMjU1OworCXNlY3RfcGVyX3RyYWNrID0gNjM7CisJc2VjdF9wZXJfY2x1c3QgPSAxOworCXsKKwkJc3RydWN0IGhkX2dlb21ldHJ5IGdlb21ldHJ5OworCQkvLyBzaXplIChpbiBzZWN0b3JzKSwgc2VjdCAocGVyIHRyYWNrKSwgaGVhZAorCQlzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBwYXJhbTsKKworCQkvLyBOLkIuIHdoZXRoZXIgdG8gdXNlIEhESU9fR0VUR0VPIG9yIEhESU9fUkVRPworCQlpZiAoaW9jdGwoZGV2LCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KSA9PSAwCisJCSAmJiBnZW9tZXRyeS5zZWN0b3JzCisJCSAmJiBnZW9tZXRyeS5oZWFkcworCQkpIHsKKwkJCS8vIGhhcmQgZHJpdmUKKwkJCXNlY3RfcGVyX3RyYWNrID0gZ2VvbWV0cnkuc2VjdG9yczsKKwkJCWhlYWRzID0gZ2VvbWV0cnkuaGVhZHM7CisKKyBzZXRfY2x1c3Rlcl9zaXplOgorCQkJLyogRm9yIEZBVDMyLCB0cnkgdG8gZG8gdGhlIHNhbWUgYXMgTSQncyBmb3JtYXQgY29tbWFuZAorCQkJICogKHNlZSBodHRwOi8vd3d3Lndpbi50dWUubmwvfmFlYi9saW51eC9mcy9mYXQvZmF0Z2VuMTAzLnBkZiBwLiAyMCk6CisJCQkgKiBmcyBzaXplIDw9IDI2ME06IDAuNWsgY2x1c3RlcnMKKwkJCSAqIGZzIHNpemUgPD0gICA4RzogNGsgY2x1c3RlcnMKKwkJCSAqIGZzIHNpemUgPD0gIDE2RzogOGsgY2x1c3RlcnMKKwkJCSAqIGZzIHNpemUgPiAgIDE2RzogMTZrIGNsdXN0ZXJzCisJCQkgKi8KKwkJCXNlY3RfcGVyX2NsdXN0ID0gMTsKKwkJCWlmICh2b2x1bWVfc2l6ZV9ieXRlcyA+PSAyNjAqMTAyNCoxMDI0KSB7CisJCQkJc2VjdF9wZXJfY2x1c3QgPSA4OworCQkJCS8qIGZpZ2h0IGdjYzogKi8KKwkJCQkvKiAiZXJyb3I6IGludGVnZXIgb3ZlcmZsb3cgaW4gZXhwcmVzc2lvbiIgKi8KKwkJCQkvKiAiZXJyb3I6IHJpZ2h0IHNoaWZ0IGNvdW50ID49IHdpZHRoIG9mIHR5cGUiICovCisJCQkJaWYgKHNpemVvZihvZmZfdCkgPiA0KSB7CisJCQkJCXVuc2lnbmVkIHQgPSAodm9sdW1lX3NpemVfYnl0ZXMgPj4gMzEgPj4gMSk7CisJCQkJCWlmICh0ID49IDgvNCkKKwkJCQkJCXNlY3RfcGVyX2NsdXN0ID0gMTY7CisJCQkJCWlmICh0ID49IDE2LzQpCisJCQkJCQlzZWN0X3Blcl9jbHVzdCA9IDMyOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGZsb3BweSwgbG9vcCwgb3IgcmVndWxhciBmaWxlCisJCQlpbnQgbm90X2Zsb3BweSA9IGlvY3RsKGRldiwgRkRHRVRQUk0sICZwYXJhbSk7CisJCQlpZiAobm90X2Zsb3BweSA9PSAwKSB7CisJCQkJLy8gZmxvcHB5IGRpc2sKKwkJCQlzZWN0X3Blcl90cmFjayA9IHBhcmFtLnNlY3Q7CisJCQkJaGVhZHMgPSBwYXJhbS5oZWFkOworCQkJCXZvbHVtZV9zaXplX3NlY3QgPSBwYXJhbS5zaXplOworCQkJCXZvbHVtZV9zaXplX2J5dGVzID0gcGFyYW0uc2l6ZSAqIFNFQ1RPUl9TSVpFOworCQkJfQorCQkJLy8gc2V0dXAgdGhlIG1lZGlhIGRlc2NyaXB0b3IgYnl0ZQorCQkJc3dpdGNoICh2b2x1bWVfc2l6ZV9zZWN0KSB7CisJCQljYXNlIDIqMzYwOgkvLyA1LjI1IiwgMiwgOSwgNDAgLSAzNjBLCisJCQkJbWVkaWFfYnl0ZSA9IDB4ZmQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDIqNzIwOgkvLyAzLjUiLCAyLCA5LCA4MCAtIDcyMEsKKwkJCWNhc2UgMioxMjAwOgkvLyA1LjI1IiwgMiwgMTUsIDgwIC0gMTIwMEsKKwkJCQltZWRpYV9ieXRlID0gMHhmOTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CS8vIGFueXRoaW5nIGVsc2UKKwkJCQlpZiAobm90X2Zsb3BweSkKKwkJCQkJZ290byBzZXRfY2x1c3Rlcl9zaXplOworCQkJY2FzZSAyKjE0NDA6CS8vIDMuNSIsIDIsIDE4LCA4MCAtIDE0NDBLCisJCQljYXNlIDIqMjg4MDoJLy8gMy41IiwgMiwgMzYsIDgwIC0gMjg4MEsKKwkJCQltZWRpYV9ieXRlID0gMHhmMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIG5vdCBmbG9wcHksIGJ1dCBzaXplIG1hdGNoZXMgZmxvcHB5IGV4YWN0bHkuCisJCQkvLyBwZXJoYXBzIGl0IGlzIGEgZmxvcHB5IGltYWdlLgorCQkJLy8gd2UgYWxyZWFkeSBzZXQgbWVkaWFfYnl0ZSBhcyBpZiBpdCBpcyBhIGZsb3BweSwKKwkJCS8vIG5vdyBzZXQgc2VjdF9wZXJfdHJhY2sgYW5kIGhlYWRzLgorCQkJaGVhZHMgPSAyOworCQkJc2VjdF9wZXJfdHJhY2sgPSAodW5zaWduZWQpdm9sdW1lX3NpemVfc2VjdCAvIDE2MDsKKwkJCWlmIChzZWN0X3Blcl90cmFjayA8IDkpCisJCQkJc2VjdF9wZXJfdHJhY2sgPSA5OworCQl9CisJfQorCisJLy8KKwkvLyBDYWxjdWxhdGUgbnVtYmVyIG9mIGNsdXN0ZXJzLCBzZWN0b3JzL2NsdXN0ZXIsIHNlY3RvcnMvRkFUCisJLy8gKGFuIGluaXRpYWwgZ3Vlc3MgZm9yIHNlY3RfcGVyX2NsdXN0IHNob3VsZCBhbHJlYWR5IGJlIHNldCkKKwkvLworCS8vICJta2Rvc2ZzIC12IC1GIDMyIGltYWdlNWsgNSIgaXMgdGhlIG1pbmltdW06CisJLy8gMiBzZWN0b3JzIGZvciBGQVRzIGFuZCAyIGRhdGEgc2VjdG9ycworCWlmICgob2ZmX3QpKHZvbHVtZV9zaXplX3NlY3QgLSByZXNlcnZlZF9zZWN0KSA8IDQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0aGUgaW1hZ2UgaXMgdG9vIHNtYWxsIGZvciBGQVQzMiIpOworCXNlY3RfcGVyX2ZhdCA9IDE7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCWludCBzcGZfYWRqOworCQkJdW9mZl90IHRjbCA9ICh2b2x1bWVfc2l6ZV9zZWN0IC0gcmVzZXJ2ZWRfc2VjdCAtIE5VTV9GQVRTICogc2VjdF9wZXJfZmF0KSAvIHNlY3RfcGVyX2NsdXN0OworCQkJLy8gdGNsIG1heSBiZSA+IE1BWF9DTFVTVF8zMiBoZXJlLCBidXQgaXQgbWF5IGJlCisJCQkvLyBiZWNhdXNlIHNlY3RfcGVyX2ZhdCBpcyB1bmRlcmVzdGltYXRlZCwKKwkJCS8vIGFuZCB3aXRoIGluY3JlYXNlZCBzZWN0X3Blcl9mYXQgaXQgc3RpbGwgbWF5IGJlY29tZQorCQkJLy8gPD0gTUFYX0NMVVNUXzMyLiBUaGVyZWZvcmUsIHdlIGRvIG5vdCBjaGVjaworCQkJLy8gYWdhaW5zdCBNQVhfQ0xVU1RfMzIsIGJ1dCBhZ2FpbnN0IGEgYmlnZ2VyIGNvbnN0OgorCQkJaWYgKHRjbCA+IDB4ODBmZmZmZmYpCisJCQkJZ290byBuZXh0OworCQkJdG90YWxfY2x1c3QgPSB0Y2w7IC8vIGZpdHMgaW4gdWludDMyX3QKKwkJCS8vIEV2ZXJ5IGNsdXN0ZXIgbmVlZHMgNCBieXRlcyBpbiBGQVQuICsyIGVudHJpZXMgc2luY2UKKwkJCS8vIEZBVCBoYXMgc3BhY2UgZm9yIG5vbi1leGlzdGVudCBjbHVzdGVycyAwIGFuZCAxLgorCQkJLy8gTGV0J3Mgc2VlIGhvdyBtYW55IHNlY3RvcnMgdGhhdCBuZWVkcy4KKwkJCS8vTWF5IG92ZXJmbG93IGF0ICIqNCI6CisJCQkvL3NwZl9hZGogPSAoKHRvdGFsX2NsdXN0KzIpICogNCArIGJ5dGVzX3Blcl9zZWN0LTEpIC8gYnl0ZXNfcGVyX3NlY3QgLSBzZWN0X3Blcl9mYXQ7CisJCQkvL1NhbWUgaW4gdGhlIG1vcmUgb2JzY3VyZSwgbm9uLW92ZXJmbG93aW5nIGZvcm06CisJCQlzcGZfYWRqID0gKCh0b3RhbF9jbHVzdCsyKSArIChieXRlc19wZXJfc2VjdC80KS0xKSAvIChieXRlc19wZXJfc2VjdC80KSAtIHNlY3RfcGVyX2ZhdDsKKyNpZiAwCisJCQliYl9lcnJvcl9tc2coInNlY3RfcGVyX2NsdXN0OiV1IHNlY3RfcGVyX2ZhdDoldSB0b3RhbF9jbHVzdDoldSIsCisJCQkJCXNlY3RfcGVyX2NsdXN0LCBzZWN0X3Blcl9mYXQsIChpbnQpdGNsKTsKKwkJCWJiX2Vycm9yX21zZygiYWRqdXN0IHRvIHNlY3RfcGVyX2ZhdDolZCIsIHNwZl9hZGopOworI2VuZGlmCisJCQlpZiAoc3BmX2FkaiA8PSAwKSB7CisJCQkJLy8gZG8gbm90IG5lZWQgdG8gYWRqdXN0IHNlY3RfcGVyX2ZhdC4KKwkJCQkvLyBzbywgd2FzIHRvdGFsX2NsdXN0IHRvbyBiaWcgYWZ0ZXIgYWxsPworCQkJCWlmICh0b3RhbF9jbHVzdCA8PSBNQVhfQ0xVU1RfMzIpCisJCQkJCWdvdG8gZm91bmRfdG90YWxfY2x1c3Q7IC8vIG5vCisJCQkJLy8geWVzLCB0b3RhbF9jbHVzdCBpcyBfYSBiaXRfIHRvbyBiaWcKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQkvLyBhZGp1c3Qgc2VjdF9wZXJfZmF0LCBnbyBiYWNrIGFuZCByZWNhbGMgdG90YWxfY2x1c3QKKwkJCS8vIChub3RlOiBqdXN0ICJzZWN0X3Blcl9mYXQgKz0gc3BmX2FkaiIgaXNuJ3Qgb2spCisJCQlzZWN0X3Blcl9mYXQgKz0gKCh1bnNpZ25lZClzcGZfYWRqIC8gMikgfCAxOworCQl9CisgbmV4dDoKKwkJaWYgKHNlY3RfcGVyX2NsdXN0ID09IDEyOCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBtYWtlIEZBVDMyIHdpdGggPjEyOCBzZWN0b3JzL2NsdXN0ZXIiKTsKKwkJc2VjdF9wZXJfY2x1c3QgKj0gMjsKKwkJc2VjdF9wZXJfZmF0ID0gKHNlY3RfcGVyX2ZhdCAvIDIpIHwgMTsKKwl9CisgZm91bmRfdG90YWxfY2x1c3Q6CisKKwkvLworCS8vIFByaW50IGluZm8KKwkvLworCWlmIChvcHRzICYgT1BUX3YpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRGV2aWNlICclcyc6XG4iCisJCQkiaGVhZHM6JXUsIHNlY3RvcnMvdHJhY2s6JXUsIGJ5dGVzL3NlY3RvcjoldVxuIgorCQkJIm1lZGlhIGRlc2NyaXB0b3I6JTAyeFxuIgorCQkJInRvdGFsIHNlY3RvcnM6JSJPRkZfRk1UInUsIGNsdXN0ZXJzOiV1LCBzZWN0b3JzL2NsdXN0ZXI6JXVcbiIKKwkJCSJGQVRzOjIsIHNlY3RvcnMvRkFUOiV1XG4iCisJCQkidm9sdW1lSUQ6JTA4eCwgbGFiZWw6JyVzJ1xuIiwKKwkJCWRldmljZV9uYW1lLAorCQkJaGVhZHMsIHNlY3RfcGVyX3RyYWNrLCBieXRlc19wZXJfc2VjdCwKKwkJCShpbnQpbWVkaWFfYnl0ZSwKKwkJCXZvbHVtZV9zaXplX3NlY3QsIChpbnQpdG90YWxfY2x1c3QsIChpbnQpc2VjdF9wZXJfY2x1c3QsCisJCQlzZWN0X3Blcl9mYXQsCisJCQkoaW50KXZvbHVtZV9pZCwgdm9sdW1lX2xhYmVsCisJCSk7CisJfQorCisJLy8KKwkvLyBXcml0ZSBmaWxlc3lzdGVtIGltYWdlIHNlcXVlbnRpYWxseSAobm8gc2Vla2luZykKKwkvLworCXsKKwkJLy8gKGEgfCBiKSBpcyBwb29yIG1hbidzIG1heChhLCBiKQorCQl1bnNpZ25lZCBidWZzaXplID0gcmVzZXJ2ZWRfc2VjdDsKKwkJLy9idWZzaXplIHw9IHNlY3RfcGVyX2ZhdDsgLy8gY2FuIGJlIHF1aXRlIGxhcmdlCisJCWJ1ZnNpemUgfD0gMjsgLy8gdXNlIHRoaXMgaW5zdGVhZAorCQlidWZzaXplIHw9IHNlY3RfcGVyX2NsdXN0OworCQlidWYgPSB4emFsbG9jKGJ1ZnNpemUgKiBieXRlc19wZXJfc2VjdCk7CisJfQorCisJeyAvLyBib290IGFuZCBmc2luZm8gc2VjdG9ycywgYW5kIHRoZWlyIGNvcGllcworCQlzdHJ1Y3QgbXNkb3NfYm9vdF9zZWN0b3IgKmJvb3RfYmxrID0gKHZvaWQqKWJ1ZjsKKwkJc3RydWN0IGZhdDMyX2ZzaW5mbyAqaW5mbyA9ICh2b2lkKikoYnVmICsgYnl0ZXNfcGVyX3NlY3QpOworCisJCXN0cmNweShib290X2Jsay0+Ym9vdF9qdW1wX2FuZF9zeXNfaWQsICJceGViXHg1OFx4OTAiICJta2Rvc2ZzIik7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5ieXRlc19wZXJfc2VjdCwgYnl0ZXNfcGVyX3NlY3QpOworCQlTVE9SRV9MRShib290X2Jsay0+c2VjdF9wZXJfY2x1c3QsIHNlY3RfcGVyX2NsdXN0KTsKKwkJLy8gY2FzdCBpbiBuZWVkZWQgb24gYmlnIGVuZGlhbiB0byBzdXBwcmVzcyBhIHdhcm5pbmcKKwkJU1RPUkVfTEUoYm9vdF9ibGstPnJlc2VydmVkX3NlY3QsICh1aW50MTZfdClyZXNlcnZlZF9zZWN0KTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmZhdHMsIDIpOworCQkvL1NUT1JFX0xFKGJvb3RfYmxrLT5kaXJfZW50cmllcywgMCk7IC8vIGZvciBGQVQzMiwgc3RheXMgMAorCQlpZiAodm9sdW1lX3NpemVfc2VjdCA8PSAweGZmZmYpCisJCQlTVE9SRV9MRShib290X2Jsay0+dm9sdW1lX3NpemVfc2VjdCwgdm9sdW1lX3NpemVfc2VjdCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5tZWRpYV9ieXRlLCBtZWRpYV9ieXRlKTsKKwkJLy8gd3Jvbmc6IHRoaXMgd291bGQgbWFrZSBMaW51eCB0aGluayB0aGF0IGl0J3MgZmF0MTIvMTY6CisJCS8vaWYgKHNlY3RfcGVyX2ZhdCA8PSAweGZmZmYpCisJCS8vCVNUT1JFX0xFKGJvb3RfYmxrLT5zZWN0X3Blcl9mYXQsIHNlY3RfcGVyX2ZhdCk7CisJCS8vIHdvcmtzOgorCQkvL1NUT1JFX0xFKGJvb3RfYmxrLT5zZWN0X3Blcl9mYXQsIDApOworCQlTVE9SRV9MRShib290X2Jsay0+c2VjdF9wZXJfdHJhY2ssIHNlY3RfcGVyX3RyYWNrKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmhlYWRzLCBoZWFkcyk7CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPmhpZGRlbiwgMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl92b2x1bWVfc2l6ZV9zZWN0LCB2b2x1bWVfc2l6ZV9zZWN0KTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmZhdDMyX3NlY3RfcGVyX2ZhdCwgc2VjdF9wZXJfZmF0KTsKKwkJLy9TVE9SRV9MRShib290X2Jsay0+ZmF0MzJfZmxhZ3MsIDApOworCQkvL1NUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl92ZXJzaW9uWzJdLCAwLDApOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0MzJfcm9vdF9jbHVzdGVyLCAyKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmZhdDMyX2luZm9fc2VjdG9yLCBpbmZvX3NlY3Rvcl9udW1iZXIpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0MzJfYmFja3VwX2Jvb3QsIGJhY2t1cF9ib290X3NlY3Rvcik7CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPnJlc2VydmVkMlszXSwgMCwwLDApOworCQlTVE9SRV9MRShib290X2Jsay0+dmkuZXh0X2Jvb3Rfc2lnbiwgMHgyOSk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT52aS52b2x1bWVfaWQzMiwgdm9sdW1lX2lkKTsKKwkJc3RybmNweShib290X2Jsay0+dmkuZnNfdHlwZSwgIkZBVDMyICAgIiwgc2l6ZW9mKGJvb3RfYmxrLT52aS5mc190eXBlKSk7CisJCXN0cm5jcHkoYm9vdF9ibGstPnZpLnZvbHVtZV9sYWJlbCwgdm9sdW1lX2xhYmVsLCBzaXplb2YoYm9vdF9ibGstPnZpLnZvbHVtZV9sYWJlbCkpOworCQltZW1jcHkoYm9vdF9ibGstPmJvb3RfY29kZSwgYm9vdF9jb2RlLCBzaXplb2YoYm9vdF9jb2RlKSk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5ib290X3NpZ24sIEJPT1RfU0lHTik7CisKKwkJU1RPUkVfTEUoaW5mby0+c2lnbmF0dXJlMSwgRkFUX0ZTSU5GT19TSUcxKTsKKwkJU1RPUkVfTEUoaW5mby0+c2lnbmF0dXJlMiwgRkFUX0ZTSU5GT19TSUcyKTsKKwkJLy8gd2UndmUgYWxsb2NhdGVkIGNsdXN0ZXIgMiBmb3IgdGhlIHJvb3QgZGlyCisJCVNUT1JFX0xFKGluZm8tPmZyZWVfY2x1c3RlcnMsICh0b3RhbF9jbHVzdCAtIDEpKTsKKwkJU1RPUkVfTEUoaW5mby0+bmV4dF9jbHVzdGVyLCAyKTsKKwkJU1RPUkVfTEUoaW5mby0+Ym9vdF9zaWduLCBCT09UX1NJR04pOworCisJCS8vIDFzdCBjb3B5CisJCXh3cml0ZShkZXYsIGJ1ZiwgYnl0ZXNfcGVyX3NlY3QgKiBiYWNrdXBfYm9vdF9zZWN0b3IpOworCQkvLyAybmQgY29weSBhbmQgcG9zc2libHkgemVybyBzZWN0b3JzCisJCXh3cml0ZShkZXYsIGJ1ZiwgYnl0ZXNfcGVyX3NlY3QgKiAocmVzZXJ2ZWRfc2VjdCAtIGJhY2t1cF9ib290X3NlY3RvcikpOworCX0KKworCXsgLy8gZmlsZSBhbGxvY2F0aW9uIHRhYmxlcworCQl1bnNpZ25lZCBpLGo7CisJCXVuc2lnbmVkIGNoYXIgKmZhdCA9ICh2b2lkKilidWY7CisKKwkJbWVtc2V0KGJ1ZiwgMCwgYnl0ZXNfcGVyX3NlY3QgKiAyKTsKKwkJLy8gaW5pdGlhbCBGQVQgZW50cmllcworCQlNQVJLX0NMVVNURVIoMCwgMHgwZmZmZmYwMCB8IG1lZGlhX2J5dGUpOworCQlNQVJLX0NMVVNURVIoMSwgMHhmZmZmZmZmZik7CisJCS8vIG1hcmsgY2x1c3RlciAyIGFzIEVPRiAodXNlZCBmb3Igcm9vdCBkaXIpCisJCU1BUktfQ0xVU1RFUigyLCBFT0ZfRkFUMzIpOworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZBVFM7IGkrKykgeworCQkJeHdyaXRlKGRldiwgYnVmLCBieXRlc19wZXJfc2VjdCk7CisJCQlmb3IgKGogPSAxOyBqIDwgc2VjdF9wZXJfZmF0OyBqKyspCisJCQkJeHdyaXRlKGRldiwgYnVmICsgYnl0ZXNfcGVyX3NlY3QsIGJ5dGVzX3Blcl9zZWN0KTsKKwkJfQorCX0KKworCS8vIHJvb3QgZGlyZWN0b3J5CisJLy8gZW1wdHkgZGlyZWN0b3J5IGlzIGp1c3QgYSBzZXQgb2YgemVybyBieXRlcworCW1lbXNldChidWYsIDAsIHNlY3RfcGVyX2NsdXN0ICogYnl0ZXNfcGVyX3NlY3QpOworCWlmICh2b2x1bWVfbGFiZWxbMF0pIHsKKwkJLy8gY3JlYXRlIGRpciBlbnRyeSBmb3Igdm9sdW1lX2xhYmVsCisJCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworI2lmIDAKKwkJc3RydWN0IHRtIHRtX3RpbWU7CisJCXVpbnQxNl90IHQsIGQ7CisjZW5kaWYKKwkJZGUgPSAodm9pZCopYnVmOworCQlzdHJuY3B5KGRlLT5uYW1lLCB2b2x1bWVfbGFiZWwsIHNpemVvZihkZS0+bmFtZSkpOworCQlTVE9SRV9MRShkZS0+YXR0ciwgQVRUUl9WT0xVTUUpOworI2lmIDAKKwkJbG9jYWx0aW1lX3IoJmNyZWF0ZV90aW1lLCAmdG1fdGltZSk7CisJCXQgPSAodG1fdGltZS50bV9zZWMgPj4gMSkgKyAodG1fdGltZS50bV9taW4gPDwgNSkgKyAodG1fdGltZS50bV9ob3VyIDw8IDExKTsKKwkJZCA9IHRtX3RpbWUudG1fbWRheSArICgodG1fdGltZS50bV9tb24rMSkgPDwgNSkgKyAoKHRtX3RpbWUudG1feWVhci04MCkgPDwgOSk7CisJCVNUT1JFX0xFKGRlLT50aW1lLCB0KTsKKwkJU1RPUkVfTEUoZGUtPmRhdGUsIGQpOworCQkvL1NUT1JFX0xFKGRlLT5jdGltZV9jcywgMCk7CisJCWRlLT5jdGltZSA9IGRlLT50aW1lOworCQlkZS0+Y2RhdGUgPSBkZS0+ZGF0ZTsKKwkJZGUtPmFkYXRlID0gZGUtPmRhdGU7CisjZW5kaWYKKwl9CisJeHdyaXRlKGRldiwgYnVmLCBzZWN0X3Blcl9jbHVzdCAqIGJ5dGVzX3Blcl9zZWN0KTsKKworI2lmIDAKKwlpZiAob3B0cyAmIE9QVF9jKSB7CisJCXVvZmZfdCB2b2x1bWVfc2l6ZV9ibG9ja3M7CisJCXVuc2lnbmVkIHN0YXJ0X2RhdGFfc2VjdG9yOworCQl1bnNpZ25lZCBzdGFydF9kYXRhX2Jsb2NrOworCQl1bnNpZ25lZCBiYWRibG9ja3MgPSAwOworCQlpbnQgdHJ5LCBnb3Q7CisJCW9mZl90IGN1cnJlbnRseV90ZXN0aW5nOworCQljaGFyICpibGtidWYgPSB4bWFsbG9jKEJMT0NLX1NJWkUgKiBURVNUX0JVRkZFUl9CTE9DS1MpOworCisJCXZvbHVtZV9zaXplX2Jsb2NrcyA9ICh2b2x1bWVfc2l6ZV9ieXRlcyA+PiBCTE9DS19TSVpFX0JJVFMpOworCQkvLyBOLkIuIHRoZSB0d28gZm9sbG93aW5nIHZhcnMgYXJlIGluIGhhcmQgc2VjdG9ycywgaS5lLiBTRUNUT1JfU0laRSBieXRlIHNlY3RvcnMhCisJCXN0YXJ0X2RhdGFfc2VjdG9yID0gKHJlc2VydmVkX3NlY3QgKyBOVU1fRkFUUyAqIHNlY3RfcGVyX2ZhdCkgKiAoYnl0ZXNfcGVyX3NlY3QgLyBTRUNUT1JfU0laRSk7CisJCXN0YXJ0X2RhdGFfYmxvY2sgPSAoc3RhcnRfZGF0YV9zZWN0b3IgKyBTRUNUT1JTX1BFUl9CTE9DSyAtIDEpIC8gU0VDVE9SU19QRVJfQkxPQ0s7CisKKwkJYmJfaW5mb19tc2coInNlYXJjaGluZyBmb3IgYmFkIGJsb2NrcyAiKTsKKwkJY3VycmVudGx5X3Rlc3RpbmcgPSAwOworCQl0cnkgPSBURVNUX0JVRkZFUl9CTE9DS1M7CisJCXdoaWxlIChjdXJyZW50bHlfdGVzdGluZyA8IHZvbHVtZV9zaXplX2Jsb2NrcykgeworCQkJaWYgKGN1cnJlbnRseV90ZXN0aW5nICsgdHJ5ID4gdm9sdW1lX3NpemVfYmxvY2tzKQorCQkJCXRyeSA9IHZvbHVtZV9zaXplX2Jsb2NrcyAtIGN1cnJlbnRseV90ZXN0aW5nOworCQkJLy8gcGVyZm9ybSBhIHRlc3Qgb24gYSBibG9jay4gcmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzCisJCQkvLyB0aGF0IGNvdWxkIGJlIHJlYWQgc3VjY2Vzc2Z1bGx5LgorCQkJLy8gc2VlayB0byB0aGUgY29ycmVjdCBsb2NhdGlvbgorCQkJeGxzZWVrKGRldiwgY3VycmVudGx5X3Rlc3RpbmcgKiBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisJCQkvLyB0cnkgcmVhZGluZworCQkJZ290ID0gcmVhZChkZXYsIGJsa2J1ZiwgdHJ5ICogQkxPQ0tfU0laRSk7CisJCQlpZiAoZ290IDwgMCkKKwkJCQlnb3QgPSAwOworCQkJaWYgKGdvdCAmIChCTE9DS19TSVpFIC0gMSkpCisJCQkJYmJfZXJyb3JfbXNnKCJ1bmV4cGVjdGVkIHZhbHVlcyBpbiBkb19jaGVjazogcHJvYmFibHkgYnVncyIpOworCQkJZ290IC89IEJMT0NLX1NJWkU7CisJCQljdXJyZW50bHlfdGVzdGluZyArPSBnb3Q7CisJCQlpZiAoZ290ID09IHRyeSkgeworCQkJCXRyeSA9IFRFU1RfQlVGRkVSX0JMT0NLUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXRyeSA9IDE7CisJCQlpZiAoY3VycmVudGx5X3Rlc3RpbmcgPCBzdGFydF9kYXRhX2Jsb2NrKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgYmxvY2tzIGJlZm9yZSBkYXRhLWFyZWE6IGNhbm5vdCBtYWtlIGZzIik7CisKKwkJCS8vIG1hcmsgYWxsIG9mIHRoZSBzZWN0b3JzIGluIHRoZSBibG9jayBhcyBiYWQKKwkJCWZvciAoaSA9IDA7IGkgPCBTRUNUT1JTX1BFUl9CTE9DSzsgaSsrKSB7CisJCQkJaW50IGNsdXN0ZXIgPSAoY3VycmVudGx5X3Rlc3RpbmcgKiBTRUNUT1JTX1BFUl9CTE9DSyArIGkgLSBzdGFydF9kYXRhX3NlY3RvcikgLyAoaW50KSAoc2VjdF9wZXJfY2x1c3QpIC8gKGJ5dGVzX3Blcl9zZWN0IC8gU0VDVE9SX1NJWkUpOworCQkJCWlmIChjbHVzdGVyIDwgMCkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgY2x1c3RlciBudW1iZXIgaW4gbWFya19zZWN0b3I6IHByb2JhYmx5IGJ1ZyEiKTsKKwkJCQlNQVJLX0NMVVNURVIoY2x1c3RlciwgQkFEX0ZBVDMyKTsKKwkJCX0KKwkJCWJhZGJsb2NrcysrOworCQkJY3VycmVudGx5X3Rlc3RpbmcrKzsKKwkJfQorCQlmcmVlKGJsa2J1Zik7CisJCWlmIChiYWRibG9ja3MpCisJCQliYl9pbmZvX21zZygiJWQgYmFkIGJsb2NrKHMpIiwgYmFkYmxvY2tzKTsKKwl9CisjZW5kaWYKKworCS8vIGNsZWFudXAKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShidWYpOworCQljbG9zZShkZXYpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ta3N3YXAuYyBiL3V0aWwtbGludXgvbWtzd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkMmM0OQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtzd2FwLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogbWtzd2FwLmMgLSBmb3JtYXQgc3dhcCBkZXZpY2UgKExpbnV4IHYxIG9ubHkpCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBta3N3YXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstTCBMQkxdIEJMT0NLREVWIFtLQllURVNdIgorLy91c2FnZTojZGVmaW5lIG1rc3dhcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByZXBhcmUgQkxPQ0tERVYgdG8gYmUgdXNlZCBhcyBzd2FwIHBhcnRpdGlvblxuIgorLy91c2FnZTogICAgICJcbgktTCBMQkwJTGFiZWwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX1NFTElOVVgKK3N0YXRpYyB2b2lkIG1rc3dhcF9zZWxpbnV4X3NldGNvbnRleHQoaW50IGZkLCBjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0IHN0YnVmOworCisJaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJeGZzdGF0KGZkLCAmc3RidWYsIHBhdGgpOworCWlmIChTX0lTUkVHKHN0YnVmLnN0X21vZGUpKSB7CisJCXNlY3VyaXR5X2NvbnRleHRfdCBuZXdjb247CisJCXNlY3VyaXR5X2NvbnRleHRfdCBvbGRjb24gPSBOVUxMOworCQljb250ZXh0X3QgY29udGV4dDsKKworCQlpZiAoZmdldGZpbGVjb24oZmQsICZvbGRjb24pIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVOT0RBVEEpCisJCQkJZ290byBlcnJvcjsKKwkJCWlmIChtYXRjaHBhdGhjb24ocGF0aCwgc3RidWYuc3RfbW9kZSwgJm9sZGNvbikgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwkJY29udGV4dCA9IGNvbnRleHRfbmV3KG9sZGNvbik7CisJCWlmICghY29udGV4dCB8fCBjb250ZXh0X3R5cGVfc2V0KGNvbnRleHQsICJzd2FwZmlsZV90IikpCisJCQlnb3RvIGVycm9yOworCQluZXdjb24gPSBjb250ZXh0X3N0cihjb250ZXh0KTsKKwkJaWYgKCFuZXdjb24pCisJCQlnb3RvIGVycm9yOworCQkvKiBmc2V0ZmlsZWNvbl9yYXcgaXMgaGlkZGVuICovCisJCWlmIChzdHJjbXAob2xkY29uLCBuZXdjb24pICE9IDAgJiYgZnNldGZpbGVjb24oZmQsIG5ld2NvbikgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCQljb250ZXh0X2ZyZWUoY29udGV4dCk7CisJCQlmcmVlY29uKG9sZGNvbik7CisJCX0KKwl9CisJcmV0dXJuOworIGVycm9yOgorCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU0VMaW51eCByZWxhYmVsaW5nIGZhaWxlZCIpOworfQorI2Vsc2UKKyMgZGVmaW5lIG1rc3dhcF9zZWxpbnV4X3NldGNvbnRleHQoZmQsIHBhdGgpICgodm9pZCkwKQorI2VuZGlmCisKKy8qIGZyb20gTGludXggMi42LjIzICovCisvKgorICogTWFnaWMgaGVhZGVyIGZvciBhIHN3YXAgYXJlYS4gLi4uIE5vdGUgdGhhdCB0aGUgZmlyc3QKKyAqIGtpbG9ieXRlIGlzIHJlc2VydmVkIGZvciBib290IGxvYWRlciBvciBkaXNrIGxhYmVsIHN0dWZmLgorICovCitzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgeworLyoJY2hhciAgICAgYm9vdGJpdHNbMTAyNF07ICAgIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLworCXVpbnQzMl90IHZlcnNpb247ICAgICAgICAvKiBzZWNvbmQga2J5dGUsIHdvcmQgMCAqLworCXVpbnQzMl90IGxhc3RfcGFnZTsgICAgICAvKiAxICovCisJdWludDMyX3QgbnJfYmFkcGFnZXM7ICAgIC8qIDIgKi8KKwljaGFyICAgICBzd3NfdXVpZFsxNl07ICAgLyogMyw0LDUsNiAqLworCWNoYXIgICAgIHN3c192b2x1bWVbMTZdOyAvKiA3LDgsOSwxMCAqLworCXVpbnQzMl90IHBhZGRpbmdbMTE3XTsgICAvKiAxMS4uMTI3ICovCisJdWludDMyX3QgYmFkcGFnZXNbMV07ICAgIC8qIDEyOCAqLworCS8qIHRvdGFsIDEyOSAzMi1iaXQgd29yZHMgaW4gMm5kIGtpbG9ieXRlICovCit9IEZJWF9BTElBU0lORzsKKworI2RlZmluZSBOV09SRFMgMTI5CisjZGVmaW5lIGhkciAoKHN0cnVjdCBzd2FwX2hlYWRlcl92MSopYmJfY29tbW9uX2J1ZnNpejEpCisKK3N0cnVjdCBCVUdfc2l6ZXMgeworCWNoYXIgc3dhcF9oZWFkZXJfdjFfd3Jvbmdbc2l6ZW9mKCpoZHIpICAhPSAoTldPUkRTICogNCkgPyAtMSA6IDFdOworCWNoYXIgYnVmc2l6MV9pc190b29fc21hbGxbQ09NTU9OX0JVRlNJWkUgPCAoTldPUkRTICogNCkgPyAtMSA6IDFdOworfTsKKworLyogU3RvcmVkIHdpdGhvdXQgdGVybWluYXRpbmcgTlVMICovCitzdGF0aWMgY29uc3QgY2hhciBTV0FQU1BBQ0UyW3NpemVvZigiU1dBUFNQQUNFMiIpLTFdIEFMSUdOMSA9ICJTV0FQU1BBQ0UyIjsKKworaW50IG1rc3dhcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtzd2FwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJdW5zaWduZWQgcGFnZXNpemU7CisJb2ZmX3QgbGVuOworCWNvbnN0IGNoYXIgKmxhYmVsID0gIiI7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIGF0IGxlYXN0IG9uZSBwYXJhbSAqLworCS8qIFRPRE86IC1wIFBBR0VTWiwgLVUgVVVJRCAqLworCWdldG9wdDMyKGFyZ3YsICJMOiIsICZsYWJlbCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlmZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fV1JPTkxZKTsKKworCS8qIEZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgZGV2aWNlIGlzICovCisJbGVuID0gZ2V0X3ZvbHVtZV9zaXplX2luX2J5dGVzKGZkLCBhcmd2WzFdLCAxMDI0LCAvKmV4dGVuZDoqLyAxKTsKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisJbGVuIC09IHBhZ2VzaXplOworCisJLyogQW5ub3VuY2Ugb3VyIGludGVudGlvbnMgKi8KKwlwcmludGYoIlNldHRpbmcgdXAgc3dhcHNwYWNlIHZlcnNpb24gMSwgc2l6ZSA9ICUiT0ZGX0ZNVCJ1IGJ5dGVzXG4iLCBsZW4pOworCW1rc3dhcF9zZWxpbnV4X3NldGNvbnRleHQoZmQsIGFyZ3ZbMF0pOworCisJLyogaGRyIGlzIHplcm8tZmlsbGVkIHNvIGZhci4gQ2xlYXIgdGhlIGZpcnN0IGtieXRlLCBvciBlbHNlCisJICogbWtzd2FwLWluZyBmb3JtZXIgRkFUIHBhcnRpdGlvbiBkb2VzIE5PVCBlcmFzZSBpdHMgc2lnbmF0dXJlLgorCSAqCisJICogdXRpbC1saW51eC1uZyAyLjE3LjIgY2xhaW1zIHRvIGVyYXNlIGl0IG9ubHkgaWYgaXQgZG9lcyBub3Qgc2VlCisJICogYSBwYXJ0aXRpb24gdGFibGUgYW5kIGlzIG5vdCBydW4gb24gd2hvbGUgZGlzay4gLWYgZm9yY2VzIGl0LgorCSAqLworCXh3cml0ZShmZCwgaGRyLCAxMDI0KTsKKworCS8qIEZpbGwgdGhlIGhlYWRlci4gKi8KKwloZHItPnZlcnNpb24gPSAxOworCWhkci0+bGFzdF9wYWdlID0gKHVvZmZfdClsZW4gLyBwYWdlc2l6ZTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9NS1NXQVBfVVVJRCkgeworCQljaGFyIHV1aWRfc3RyaW5nWzMyXTsKKwkJZ2VuZXJhdGVfdXVpZCgodm9pZCopaGRyLT5zd3NfdXVpZCk7CisJCWJpbjJoZXgodXVpZF9zdHJpbmcsIGhkci0+c3dzX3V1aWQsIDE2KTsKKwkJLyogZi5lLiBVVUlEPWRmZDljMTczLWJlNTItNGQyNy05OWE1LWMzNGM2YzJmZjU1ZiAqLworCQlwcmludGYoIlVVSUQ9JS44cyIgICItJS40cy0lLjRzLSUuNHMtJS4xMnNcbiIsCisJCQl1dWlkX3N0cmluZywKKwkJCXV1aWRfc3RyaW5nKzgsCisJCQl1dWlkX3N0cmluZys4KzQsCisJCQl1dWlkX3N0cmluZys4KzQrNCwKKwkJCXV1aWRfc3RyaW5nKzgrNCs0KzQKKwkJKTsKKwl9CisJc2FmZV9zdHJuY3B5KGhkci0+c3dzX3ZvbHVtZSwgbGFiZWwsIDE2KTsKKworCS8qIFdyaXRlIHRoZSBoZWFkZXIuICBTeW5jIHRvIGRpc2sgYmVjYXVzZSBzb21lIGtlcm5lbCB2ZXJzaW9ucyBjaGVjaworCSAqIHNpZ25hdHVyZSBvbiBkaXNrIChub3QgaW4gY2FjaGUpIGR1cmluZyBzd2Fwb24uICovCisJeHdyaXRlKGZkLCBoZHIsIE5XT1JEUyAqIDQpOworCXhsc2VlayhmZCwgcGFnZXNpemUgLSAxMCwgU0VFS19TRVQpOworCXh3cml0ZShmZCwgU1dBUFNQQUNFMiwgMTApOworCWZzeW5jKGZkKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21vcmUuYyBiL3V0aWwtbGludXgvbW9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmY2ViNzEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L21vcmUuYwpAQCAtMCwwICsxLDIxMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBtb3JlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IEJydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPi4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMYXRlc3QgdmVyc2lvbiBibGVuZGVkIHRvZ2V0aGVyIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4sCisgKiBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgbW9yZSBpbXBsZW1lbnRhdGlvbiBieSBCcnVjZSwgYW5kIGNvZGUgZnJvbSB0aGUKKyAqIERlYmlhbiBib290LWZsb3BwaWVzIHRlYW0uCisgKgorICogVGVybWlvcyBjb3JyZWN0cyBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbW9yZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIG1vcmVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJWaWV3IEZJTEUgKG9yIHN0ZGluKSBvbmUgc2NyZWVuZnVsIGF0IGEgdGltZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbW9yZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkbWVzZyB8IG1vcmVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFN1cHBvcnQgZm9yIEZFQVRVUkVfVVNFX1RFUk1JT1MgKi8KKworc3RydWN0IGdsb2JhbHMgeworCWludCBjaW5fZmlsZW5vOworCXN0cnVjdCB0ZXJtaW9zIGluaXRpYWxfc2V0dGluZ3M7CisJc3RydWN0IHRlcm1pb3MgbmV3X3NldHRpbmdzOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKWJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSAoKHZvaWQpMCkKKyNkZWZpbmUgaW5pdGlhbF9zZXR0aW5ncyAoRy5pbml0aWFsX3NldHRpbmdzKQorI2RlZmluZSBuZXdfc2V0dGluZ3MgICAgIChHLm5ld19zZXR0aW5ncyAgICApCisjZGVmaW5lIGNpbl9maWxlbm8gICAgICAgKEcuY2luX2ZpbGVubyAgICAgICkKKworI2RlZmluZSBzZXRUZXJtU2V0dGluZ3MoZmQsIGFyZ3ApIFwKK2RvIHsgXAorCWlmIChFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUykgXAorCQl0Y3NldGF0dHIoZmQsIFRDU0FOT1csIGFyZ3ApOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBnZXRUZXJtU2V0dGluZ3MoZmQsIGFyZ3ApIHRjZ2V0YXR0cihmZCwgYXJncCkKKworc3RhdGljIHZvaWQgZ290c2lnKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCS8qIGJiX3B1dGNoYXJfc3RkZXJyIGRvZXNuJ3QgdXNlIHN0ZGlvIGJ1ZmZlcmluZywKKwkgKiB0aGVyZWZvcmUgaXQgaXMgc2FmZSBpbiBzaWduYWwgaGFuZGxlciAqLworCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCXNldFRlcm1TZXR0aW5ncyhjaW5fZmlsZW5vLCAmaW5pdGlhbF9zZXR0aW5ncyk7CisJX2V4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworI2RlZmluZSBDT05WRVJURURfVEFCX1NJWkUgOAorCitpbnQgbW9yZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbW9yZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGMgPSBjOyAvKiBmb3IgY29tcGlsZXIgKi8KKwlpbnQgbGluZXM7CisJaW50IGlucHV0ID0gMDsKKwlpbnQgc3BhY2VzID0gMDsKKwlpbnQgcGxlYXNlX2Rpc3BsYXlfbW9yZV9wcm9tcHQ7CisJc3RydWN0IHN0YXQgc3Q7CisJRklMRSAqZmlsZTsKKwlGSUxFICpjaW47CisJaW50IGxlbjsKKwl1bnNpZ25lZCB0ZXJtaW5hbF93aWR0aDsKKwl1bnNpZ25lZCB0ZXJtaW5hbF9oZWlnaHQ7CisKKwlJTklUX0coKTsKKworCWFyZ3YrKzsKKwkvKiBBbm90aGVyIHBvcHVsYXIgcGFnZXIsIG1vc3QsIGRldGVjdHMgd2hlbiBzdGRvdXQKKwkgKiBpcyBub3QgYSB0dHkgYW5kIHR1cm5zIGludG8gY2F0LiBUaGlzIG1ha2VzIHNlbnNlLiAqLworCWlmICghaXNhdHR5KFNURE9VVF9GSUxFTk8pKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCWNpbiA9IGZvcGVuX2Zvcl9yZWFkKENVUlJFTlRfVFRZKTsKKwlpZiAoIWNpbikKKwkJcmV0dXJuIGJiX2NhdChhcmd2KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUykgeworCQljaW5fZmlsZW5vID0gZmlsZW5vKGNpbik7CisJCWdldFRlcm1TZXR0aW5ncyhjaW5fZmlsZW5vLCAmaW5pdGlhbF9zZXR0aW5ncyk7CisJCW5ld19zZXR0aW5ncyA9IGluaXRpYWxfc2V0dGluZ3M7CisJCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH5JQ0FOT047CisJCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH5FQ0hPOworCQluZXdfc2V0dGluZ3MuY19jY1tWTUlOXSA9IDE7CisJCW5ld19zZXR0aW5ncy5jX2NjW1ZUSU1FXSA9IDA7CisJCXNldFRlcm1TZXR0aW5ncyhjaW5fZmlsZW5vLCAmbmV3X3NldHRpbmdzKTsKKwkJYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR0lOVCkKKwkJCSsgKDEgPDwgU0lHUVVJVCkKKwkJCSsgKDEgPDwgU0lHVEVSTSkKKwkJCSwgZ290c2lnKTsKKwl9CisKKwlkbyB7CisJCWZpbGUgPSBzdGRpbjsKKwkJaWYgKCphcmd2KSB7CisJCQlmaWxlID0gZm9wZW5fb3Jfd2FybigqYXJndiwgInIiKTsKKwkJCWlmICghZmlsZSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlzdC5zdF9zaXplID0gMDsKKwkJZnN0YXQoZmlsZW5vKGZpbGUpLCAmc3QpOworCisJCXBsZWFzZV9kaXNwbGF5X21vcmVfcHJvbXB0ID0gMDsKKwkJLyogbmV2ZXIgcmV0dXJucyB3LCBoIDw9IDEgKi8KKwkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChmaWxlbm8oY2luKSwgJnRlcm1pbmFsX3dpZHRoLCAmdGVybWluYWxfaGVpZ2h0KTsKKwkJdGVybWluYWxfaGVpZ2h0IC09IDE7CisKKwkJbGVuID0gMDsKKwkJbGluZXMgPSAwOworCQl3aGlsZSAoc3BhY2VzIHx8IChjID0gZ2V0YyhmaWxlKSkgIT0gRU9GKSB7CisJCQlpbnQgd3JhcDsKKwkJCWlmIChzcGFjZXMpCisJCQkJc3BhY2VzLS07CisgbG9vcF90b3A6CisJCQlpZiAoaW5wdXQgIT0gJ3InICYmIHBsZWFzZV9kaXNwbGF5X21vcmVfcHJvbXB0KSB7CisJCQkJbGVuID0gcHJpbnRmKCItLU1vcmUtLSAiKTsKKwkJCQlpZiAoc3Quc3Rfc2l6ZSAhPSAwKSB7CisJCQkJCXVvZmZfdCBkID0gKHVvZmZfdClzdC5zdF9zaXplIC8gMTAwOworCQkJCQlpZiAoZCA9PSAwKQorCQkJCQkJZCA9IDE7CisJCQkJCWxlbiArPSBwcmludGYoIigldSUlIG9mICUiT0ZGX0ZNVCJ1IGJ5dGVzKSIsCisJCQkJCQkoaW50KSAoKHVvZmZfdClmdGVsbG8oZmlsZSkgLyBkKSwKKwkJCQkJCXN0LnN0X3NpemUpOworCQkJCX0KKwkJCQlmZmx1c2hfYWxsKCk7CisKKwkJCQkvKgorCQkJCSAqIFdlJ3ZlIGp1c3QgZGlzcGxheWVkIHRoZSAiLS1Nb3JlLS0iIHByb21wdCwgc28gbm93IHdlIG5lZWQKKwkJCQkgKiB0byBnZXQgaW5wdXQgZnJvbSB0aGUgdXNlci4KKwkJCQkgKi8KKwkJCQlmb3IgKDs7KSB7CisJCQkJCWlucHV0ID0gZ2V0YyhjaW4pOworCQkJCQlpbnB1dCA9IHRvbG93ZXIoaW5wdXQpOworCQkJCQlpZiAoIUVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TKQorCQkJCQkJcHJpbnRmKCJcMDMzW0EiKTsgLyogY3Vyc29yIHVwICovCisJCQkJCS8qIEVyYXNlIHRoZSBsYXN0IG1lc3NhZ2UgKi8KKwkJCQkJcHJpbnRmKCJcciUqc1xyIiwgbGVuLCAiIik7CisKKwkJCQkJLyogRHVlIHRvIHZhcmlvdXMgbXVsdGlieXRlIGVzY2FwZQorCQkJCQkgKiBzZXF1ZW5jZXMsIGl0J3Mgbm90IG9rIHRvIGFjY2VwdAorCQkJCQkgKiBhbnkgaW5wdXQgYXMgYSBjb21tYW5kIHRvIHNjcm9sbAorCQkJCQkgKiB0aGUgc2NyZWVuLiBXZSBvbmx5IGFsbG93IGtub3duCisJCQkJCSAqIGNvbW1hbmRzLCBlbHNlIHdlIHNob3cgaGVscCBtc2cuICovCisJCQkJCWlmIChpbnB1dCA9PSAnICcgfHwgaW5wdXQgPT0gJ1xuJyB8fCBpbnB1dCA9PSAncScgfHwgaW5wdXQgPT0gJ3InKQorCQkJCQkJYnJlYWs7CisJCQkJCWxlbiA9IHByaW50ZigiKEVudGVyOm5leHQgbGluZSBTcGFjZTpuZXh0IHBhZ2UgUTpxdWl0IFI6c2hvdyB0aGUgcmVzdCkiKTsKKwkJCQl9CisJCQkJbGVuID0gMDsKKwkJCQlsaW5lcyA9IDA7CisJCQkJcGxlYXNlX2Rpc3BsYXlfbW9yZV9wcm9tcHQgPSAwOworCisJCQkJaWYgKGlucHV0ID09ICdxJykKKwkJCQkJZ290byBlbmQ7CisKKwkJCQkvKiBUaGUgdXNlciBtYXkgaGF2ZSByZXNpemVkIHRoZSB0ZXJtaW5hbC4KKwkJCQkgKiBSZS1yZWFkIHRoZSBkaW1lbnNpb25zLiAqLworCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUykgeworCQkJCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KGNpbl9maWxlbm8sICZ0ZXJtaW5hbF93aWR0aCwgJnRlcm1pbmFsX2hlaWdodCk7CisJCQkJCXRlcm1pbmFsX2hlaWdodCAtPSAxOworCQkJCX0KKwkJCX0KKworCQkJLyogQ3J1ZGVseSBjb252ZXJ0IHRhYnMgaW50byBzcGFjZXMsIHdoaWNoIGFyZQorCQkJICogYSBiYWppbGxpb24gdGltZXMgZWFzaWVyIHRvIGRlYWwgd2l0aC4gKi8KKwkJCWlmIChjID09ICdcdCcpIHsKKwkJCQlzcGFjZXMgPSAoKHVuc2lnbmVkKX5sZW4pICUgQ09OVkVSVEVEX1RBQl9TSVpFOworCQkJCWMgPSAnICc7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgdHdvIGlucHV0IHN0cmVhbXMgdG8gd29ycnkgYWJvdXQgaGVyZToKKwkJCSAqCisJCQkgKiBjICAgIDogdGhlIGNoYXJhY3RlciB3ZSBhcmUgcmVhZGluZyBmcm9tIHRoZSBmaWxlIGJlaW5nICJtb3JlZCIKKwkJCSAqIGlucHV0OiBhIGNoYXJhY3RlciByZWNlaXZlZCBmcm9tIHRoZSBrZXlib2FyZAorCQkJICoKKwkJCSAqIElmIHdlIGhpdCBhIG5ld2xpbmUgaW4gdGhlIF9maWxlXyBzdHJlYW0sIHdlIHdhbnQgdG8gdGVzdCBhbmQKKwkJCSAqIHNlZSBpZiBhbnkgY2hhcmFjdGVycyBoYXZlIGJlZW4gaGl0IGluIHRoZSBfaW5wdXRfIHN0cmVhbS4gVGhpcworCQkJICogYWxsb3dzIHRoZSB1c2VyIHRvIHF1aXQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUuCisJCQkgKi8KKwkJCXdyYXAgPSAoKytsZW4gPiB0ZXJtaW5hbF93aWR0aCk7CisJCQlpZiAoYyA9PSAnXG4nIHx8IHdyYXApIHsKKwkJCQkvKiBUaGVuIG91dHB1dHRpbmcgdGhpcyBjaGFyYWN0ZXIKKwkJCQkgKiB3aWxsIG1vdmUgdXMgdG8gYSBuZXcgbGluZS4gKi8KKwkJCQlpZiAoKytsaW5lcyA+PSB0ZXJtaW5hbF9oZWlnaHQgfHwgaW5wdXQgPT0gJ1xuJykKKwkJCQkJcGxlYXNlX2Rpc3BsYXlfbW9yZV9wcm9tcHQgPSAxOworCQkJCWxlbiA9IDA7CisJCQl9CisJCQlpZiAoYyAhPSAnXG4nICYmIHdyYXApIHsKKwkJCQkvKiBUaGVuIG91dHB1dHRpbmcgdGhpcyB3aWxsIGFsc28gcHV0IGEgY2hhcmFjdGVyIG9uCisJCQkJICogdGhlIGJlZ2lubmluZyBvZiB0aGF0IG5ldyBsaW5lLiBUaHVzIHdlIGZpcnN0IHdhbnQgdG8KKwkJCQkgKiBkaXNwbGF5IHRoZSBwcm9tcHQgKGlmIGFueSksIHNvIHdlIHNraXAgdGhlIHB1dGNoYXIoKQorCQkJCSAqIGFuZCBnbyBiYWNrIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AsIHdpdGhvdXQgcmVhZGluZworCQkJCSAqIGEgbmV3IGNoYXJhY3Rlci4gKi8KKwkJCQlnb3RvIGxvb3BfdG9wOworCQkJfQorCQkJLyogTXkgc21hbGwgbWluZCBjYW5ub3QgZmF0aG9tIGJhY2tzcGFjZXMgYW5kIFVURi04ICovCisJCQlwdXRjaGFyKGMpOworCQkJZGllX2lmX2ZlcnJvcl9zdGRvdXQoKTsgLyogaWYgdHR5IHdhcyBkZXN0cm95ZWQgKGNsb3NlZCB4dGVybSwgZXRjKSAqLworCQl9CisJCWZjbG9zZShmaWxlKTsKKwkJZmZsdXNoX2FsbCgpOworCX0gd2hpbGUgKCphcmd2ICYmICorK2FyZ3YpOworIGVuZDoKKwlzZXRUZXJtU2V0dGluZ3MoY2luX2ZpbGVubywgJmluaXRpYWxfc2V0dGluZ3MpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9tb3VudC5jIGIvdXRpbC1saW51eC9tb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTUzMmMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L21vdW50LmMKQEAgLTAsMCArMSwyMTk5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG1vdW50IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IEJydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPi4KKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLy8gRGVzaWduIG5vdGVzOiBUaGVyZSBpcyBubyBzcGVjIGZvciBtb3VudC4gIFJlbWluZCBtZSB0byB3cml0ZSBvbmUuCisvLworLy8gbW91bnRfbWFpbigpIGNhbGxzIHNpbmdsZW1vdW50KCkgd2hpY2ggY2FsbHMgbW91bnRfaXRfbm93KCkuCisvLworLy8gbW91bnRfbWFpbigpIGNhbiBsb29wIHRocm91Z2ggL2V0Yy9mc3RhYiBmb3IgbW91bnQgLWEKKy8vIHNpbmdsZW1vdW50KCkgY2FuIGxvb3AgdGhyb3VnaCAvZXRjL2ZpbGVzeXN0ZW1zIGZvciBmc3R5cGUgZGV0ZWN0aW9uLgorLy8gbW91bnRfaXRfbm93KCkgZG9lcyB0aGUgYWN0dWFsIG1vdW50LgorLy8KKworLy91c2FnZTojZGVmaW5lIG1vdW50X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gWy1vIE9QVFNdIERFVklDRSBOT0RFIgorLy91c2FnZTojZGVmaW5lIG1vdW50X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTW91bnQgYSBmaWxlc3lzdGVtLiBGaWxlc3lzdGVtIGF1dG9kZXRlY3Rpb24gcmVxdWlyZXMgL3Byb2MuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCQlNb3VudCBhbGwgZmlsZXN5c3RlbXMgaW4gZnN0YWIiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX0ZBS0UoCisvL3VzYWdlOglJRl9GRUFUVVJFX01UQUJfU1VQUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCVVwZGF0ZSAvZXRjL210YWIsIGJ1dCBkb24ndCBtb3VudCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX01UQUJfU1VQUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCURyeSBydW4iCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX0hFTFBFUlMoCisvL3VzYWdlOiAgICAgIlxuCS1pCQlEb24ndCBydW4gbW91bnQgaGVscGVyIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9NVEFCX1NVUFBPUlQoCisvL3VzYWdlOiAgICAgIlxuCS1uCQlEb24ndCB1cGRhdGUgL2V0Yy9tdGFiIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcgkJUmVhZC1vbmx5IG1vdW50IgorLy91c2FnZTogICAgICJcbgktdwkJUmVhZC13cml0ZSBtb3VudCAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS10IEZTVFlQRQlGaWxlc3lzdGVtIHR5cGUiCisvL3VzYWdlOiAgICAgIlxuCS1PIE9QVAkJTW91bnQgb25seSBmaWxlc3lzdGVtcyB3aXRoIG9wdGlvbiBPUFQgKC1hIG9ubHkpIgorLy91c2FnZTogICAgICJcbi1vIE9QVDoiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX0xPT1AoCisvL3VzYWdlOiAgICAgIlxuCWxvb3AJCUlnbm9yZWQgKGxvb3AgZGV2aWNlcyBhcmUgYXV0b2RldGVjdGVkKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfRkxBR1MoCisvL3VzYWdlOiAgICAgIlxuCVthXXN5bmMJCVdyaXRlcyBhcmUgW2Fdc3luY2hyb25vdXMiCisvL3VzYWdlOiAgICAgIlxuCVtub11hdGltZQlEaXNhYmxlL2VuYWJsZSB1cGRhdGVzIHRvIGlub2RlIGFjY2VzcyB0aW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JW25vXWRpcmF0aW1lCURpc2FibGUvZW5hYmxlIGF0aW1lIHVwZGF0ZXMgdG8gZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCVtub11yZWxhdGltZQlEaXNhYmxlL2VuYWJsZSBhdGltZSB1cGRhdGVzIHJlbGF0aXZlIHRvIG1vZGlmaWNhdGlvbiB0aW1lIgorLy91c2FnZTogICAgICJcbglbbm9dZGV2CQkoRGlzKWFsbG93IHVzZSBvZiBzcGVjaWFsIGRldmljZSBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JW25vXWV4ZWMJKERpcylhbGxvdyB1c2Ugb2YgZXhlY3V0YWJsZSBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JW25vXXN1aWQJKERpcylhbGxvdyBzZXQtdXNlci1pZC1yb290IHByb2dyYW1zIgorLy91c2FnZTogICAgICJcbglbcl1zaGFyZWQJQ29udmVydCBbcmVjdXJzaXZlbHldIHRvIGEgc2hhcmVkIHN1YnRyZWUiCisvL3VzYWdlOiAgICAgIlxuCVtyXXNsYXZlCUNvbnZlcnQgW3JlY3Vyc2l2ZWx5XSB0byBhIHNsYXZlIHN1YnRyZWUiCisvL3VzYWdlOiAgICAgIlxuCVtyXXByaXZhdGUJQ29udmVydCBbcmVjdXJzaXZlbHldIHRvIGEgcHJpdmF0ZSBzdWJ0cmVlIgorLy91c2FnZTogICAgICJcbglbdW5dYmluZGFibGUJTWFrZSBtb3VudCBwb2ludCBbdW5dYWJsZSB0byBiZSBiaW5kIG1vdW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCVtyXWJpbmQJCUJpbmQgYSBmaWxlIG9yIGRpcmVjdG9yeSBbcmVjdXJzaXZlbHldIHRvIGFub3RoZXIgbG9jYXRpb24iCisvL3VzYWdlOiAgICAgIlxuCW1vdmUJCVJlbG9jYXRlIGFuIGV4aXN0aW5nIG1vdW50IHBvaW50IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbglyZW1vdW50CQlSZW1vdW50IGEgbW91bnRlZCBmaWxlc3lzdGVtLCBjaGFuZ2luZyBmbGFncyIKKy8vdXNhZ2U6ICAgICAiXG4Jcm8vcncJCVNhbWUgYXMgLXIvLXciCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcblRoZXJlIGFyZSBmaWxlc3lzdGVtLXNwZWNpZmljIC1vIGZsYWdzLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbW91bnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbW91bnRcbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L2hkYTMgb24gLyB0eXBlIG1pbml4IChydylcbiIKKy8vdXNhZ2U6ICAgICAgICJwcm9jIG9uIC9wcm9jIHR5cGUgcHJvYyAocncpXG4iCisvL3VzYWdlOiAgICAgICAiZGV2cHRzIG9uIC9kZXYvcHRzIHR5cGUgZGV2cHRzIChydylcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50IC9kZXYvZmQwIC9tbnQgLXQgbXNkb3MgLW8gcm9cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50IC90bXAvZGlza2ltYWdlIC9vcHQgLXQgZXh0MiAtbyBsb29wXG4iCisvL3VzYWdlOiAgICAgICAiJCBtb3VudCBjZF9pbWFnZS5pc28gbXlkaXJcbiIKKy8vdXNhZ2U6I2RlZmluZSBtb3VudF9ub3Rlc191c2FnZQorLy91c2FnZTogICAgICAgIlJldHVybnMgMCBmb3Igc3VjY2VzcywgbnVtYmVyIG9mIGZhaWxlZCBtb3VudHMgZm9yIC1hLCBvciBlcnJubyBmb3Igb25lIG1vdW50LiIKKworI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorLy8gR3JhYiBtb3JlIGFzIG5lZWRlZCBmcm9tIHV0aWwtbGludXgncyBtb3VudC9tb3VudF9jb25zdGFudHMuaAorI2lmbmRlZiBNU19ESVJTWU5DCisjIGRlZmluZSBNU19ESVJTWU5DICAgICAoMSA8PCA3KSAvLyBEaXJlY3RvcnkgbW9kaWZpY2F0aW9ucyBhcmUgc3luY2hyb25vdXMKKyNlbmRpZgorI2lmbmRlZiBNU19VTklPTgorIyBkZWZpbmUgTVNfVU5JT04gICAgICAgKDEgPDwgOCkKKyNlbmRpZgorI2lmbmRlZiBNU19CSU5ECisjIGRlZmluZSBNU19CSU5EICAgICAgICAoMSA8PCAxMikKKyNlbmRpZgorI2lmbmRlZiBNU19NT1ZFCisjIGRlZmluZSBNU19NT1ZFICAgICAgICAoMSA8PCAxMykKKyNlbmRpZgorI2lmbmRlZiBNU19SRUNVUlNJVkUKKyMgZGVmaW5lIE1TX1JFQ1VSU0lWRSAgICgxIDw8IDE0KQorI2VuZGlmCisjaWZuZGVmIE1TX1NJTEVOVAorIyBkZWZpbmUgTVNfU0lMRU5UICAgICAgKDEgPDwgMTUpCisjZW5kaWYKKy8vIFRoZSBzaGFyZWQgc3VidHJlZSBzdHVmZiwgd2hpY2ggd2VudCBpbiBhcm91bmQgMi42LjE1CisjaWZuZGVmIE1TX1VOQklOREFCTEUKKyMgZGVmaW5lIE1TX1VOQklOREFCTEUgICgxIDw8IDE3KQorI2VuZGlmCisjaWZuZGVmIE1TX1BSSVZBVEUKKyMgZGVmaW5lIE1TX1BSSVZBVEUgICAgICgxIDw8IDE4KQorI2VuZGlmCisjaWZuZGVmIE1TX1NMQVZFCisjIGRlZmluZSBNU19TTEFWRSAgICAgICAoMSA8PCAxOSkKKyNlbmRpZgorI2lmbmRlZiBNU19TSEFSRUQKKyMgZGVmaW5lIE1TX1NIQVJFRCAgICAgICgxIDw8IDIwKQorI2VuZGlmCisjaWZuZGVmIE1TX1JFTEFUSU1FCisjIGRlZmluZSBNU19SRUxBVElNRSAgICAoMSA8PCAyMSkKKyNlbmRpZgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9MQUJFTAorIyBpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKyNlbHNlCisjIGRlZmluZSByZXNvbHZlX21vdW50X3NwZWMoZnNuYW1lKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvLyBOZWVkZWQgZm9yIG5mcyBzdXBwb3J0IG9ubHkKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI3VuZGVmIFRSVUUKKyN1bmRlZiBGQUxTRQorI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworLyogVGhpcyBpcyBqdXN0IGEgd2FybmluZyBvZiBhIGNvbW1vbiBtaXN0YWtlLiAgUG9zc2libHkgdGhpcyBzaG91bGQgYmUgYQorICogdWNsaWJjIGZhcSBlbnRyeSByYXRoZXIgdGhhbiBpbiBidXN5Ym94Li4uICovCisjIGlmIGRlZmluZWQoX19VQ0xJQkNfXykgJiYgISBkZWZpbmVkKF9fVUNMSUJDX0hBU19SUENfXykKKyMgIGVycm9yICJZb3UgbmVlZCB0byBidWlsZCB1Q2xpYmMgd2l0aCBVQ0xJQkNfSEFTX1JQQyBmb3IgTkZTIHN1cHBvcnQiCisjIGVuZGlmCisjIGluY2x1ZGUgPHJwYy9ycGMuaD4KKyMgaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgorIyBpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX2RpZXRsaWJjX18pCisvLyAxNi4xMi4yMDA2LCBTYW1wbyBLZWxsb21ha2kgKHNhbXBvQGlraS5maSkKKy8vIGRpZXRsaWJjLTAuMzAgZG9lcyBub3QgaGF2ZSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRtbnRlbnRfcigpCitzdGF0aWMgc3RydWN0IG1udGVudCAqZ2V0bW50ZW50X3IoRklMRSogc3RyZWFtLCBzdHJ1Y3QgbW50ZW50KiByZXN1bHQsCisJCWNoYXIqIGJ1ZmZlciBVTlVTRURfUEFSQU0sIGludCBidWZzaXplIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgbW50ZW50KiBtZW50ID0gZ2V0bW50ZW50KHN0cmVhbSk7CisJcmV0dXJuIG1lbWNweShyZXN1bHQsIG1lbnQsIHNpemVvZigqbWVudCkpOworfQorI2VuZGlmCisKKworLy8gTm90IHJlYWwgZmxhZ3MsIGJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2hlY2sgZm9yIHRoaXMuCitlbnVtIHsKKwlNT1VOVF9VU0VSUyAgPSAoMSA8PCAyOCkgKiBFTkFCTEVfREVTS1RPUCwKKwlNT1VOVF9OT0FVVE8gPSAoMSA8PCAyOSksCisJTU9VTlRfU1dBUCAgID0gKDEgPDwgMzApLAorfTsKKworCisjZGVmaW5lIE9QVElPTl9TVFIgIm86dDpyd2FuZnZzaU86IgorZW51bSB7CisJT1BUX28gPSAoMSA8PCAwKSwKKwlPUFRfdCA9ICgxIDw8IDEpLAorCU9QVF9yID0gKDEgPDwgMiksCisJT1BUX3cgPSAoMSA8PCAzKSwKKwlPUFRfYSA9ICgxIDw8IDQpLAorCU9QVF9uID0gKDEgPDwgNSksCisJT1BUX2YgPSAoMSA8PCA2KSwKKwlPUFRfdiA9ICgxIDw8IDcpLAorCU9QVF9zID0gKDEgPDwgOCksCisJT1BUX2kgPSAoMSA8PCA5KSwKKwlPUFRfTyA9ICgxIDw8IDEwKSwKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQKKyNkZWZpbmUgVVNFX01UQUIgKCEob3B0aW9uX21hc2szMiAmIE9QVF9uKSkKKyNlbHNlCisjZGVmaW5lIFVTRV9NVEFCIDAKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfRkFLRQorI2RlZmluZSBGQUtFX0lUIChvcHRpb25fbWFzazMyICYgT1BUX2YpCisjZWxzZQorI2RlZmluZSBGQUtFX0lUIDAKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUworI2RlZmluZSBIRUxQRVJTX0FMTE9XRUQgKCEob3B0aW9uX21hc2szMiAmIE9QVF9pKSkKKyNlbHNlCisjZGVmaW5lIEhFTFBFUlNfQUxMT1dFRCAwCisjZW5kaWYKKworCisvLyBUT0RPOiBtb3JlICJ1c2VyIiBmbGFnIGNvbXBhdGliaWxpdHkuCisvLyAidXNlciIgb3B0aW9uIChmcm9tIG1vdW50IG1hbnBhZ2UpOgorLy8gT25seSB0aGUgdXNlciB0aGF0IG1vdW50ZWQgYSBmaWxlc3lzdGVtIGNhbiB1bm1vdW50IGl0IGFnYWluLgorLy8gSWYgYW55IHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gdW5tb3VudCwgdGhlbiB1c2UgdXNlcnMgaW5zdGVhZCBvZiB1c2VyCisvLyBpbiB0aGUgZnN0YWIgbGluZS4gIFRoZSBvd25lciBvcHRpb24gaXMgc2ltaWxhciB0byB0aGUgdXNlciBvcHRpb24sCisvLyB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0IHRoZSB1c2VyIG11c3QgYmUgdGhlIG93bmVyIG9mIHRoZSBzcGVjaWFsIGZpbGUuCisvLyBUaGlzIG1heSBiZSB1c2VmdWwgZS5nLiBmb3IgL2Rldi9mZCBpZiBhIGxvZ2luIHNjcmlwdCBtYWtlcworLy8gdGhlIGNvbnNvbGUgdXNlciBvd25lciBvZiB0aGlzIGRldmljZS4KKworLy8gU3RhbmRhcmQgbW91bnQgb3B0aW9ucyAoZnJvbSAtbyBvcHRpb25zIG9yIC0tb3B0aW9ucyksCisvLyB3aXRoIGNvcnJlc3BvbmRpbmcgZmxhZ3MKK3N0YXRpYyBjb25zdCBpbnQzMl90IG1vdW50X29wdGlvbnNbXSA9IHsKKwkvLyBNU19GTEFHUyBzZXQgYSBiaXQuICB+TVNfRkxBR1MgZGlzYWJsZSB0aGF0IGJpdC4gIDAgZmxhZ3MgYXJlIE5PUHMuCisKKwlJRl9GRUFUVVJFX01PVU5UX0xPT1AoCisJCS8qICJsb29wIiAqLyAwLAorCSkKKworCUlGX0ZFQVRVUkVfTU9VTlRfRlNUQUIoCisJCS8qICJkZWZhdWx0cyIgKi8gMCwKKwkJLyogInF1aWV0IiAwIC0gZG8gbm90IGZpbHRlciBvdXQsIHZmYXQgd2FudHMgdG8gc2VlIGl0ICovCisJCS8qICJub2F1dG8iICovIE1PVU5UX05PQVVUTywKKwkJLyogInN3IiAgICAgKi8gTU9VTlRfU1dBUCwKKwkJLyogInN3YXAiICAgKi8gTU9VTlRfU1dBUCwKKwkJSUZfREVTS1RPUCgvKiAidXNlciIgICovIE1PVU5UX1VTRVJTLCkKKwkJSUZfREVTS1RPUCgvKiAidXNlcnMiICovIE1PVU5UX1VTRVJTLCkKKwkJLyogIl9uZXRkZXYiICovIDAsCisJKQorCisJSUZfRkVBVFVSRV9NT1VOVF9GTEFHUygKKwkJLy8gdmZzIGZsYWdzCisJCS8qICJub3N1aWQiICAgICAgKi8gTVNfTk9TVUlELAorCQkvKiAic3VpZCIgICAgICAgICovIH5NU19OT1NVSUQsCisJCS8qICJkZXYiICAgICAgICAgKi8gfk1TX05PREVWLAorCQkvKiAibm9kZXYiICAgICAgICovIE1TX05PREVWLAorCQkvKiAiZXhlYyIgICAgICAgICovIH5NU19OT0VYRUMsCisJCS8qICJub2V4ZWMiICAgICAgKi8gTVNfTk9FWEVDLAorCQkvKiAic3luYyIgICAgICAgICovIE1TX1NZTkNIUk9OT1VTLAorCQkvKiAiZGlyc3luYyIgICAgICovIE1TX0RJUlNZTkMsCisJCS8qICJhc3luYyIgICAgICAgKi8gfk1TX1NZTkNIUk9OT1VTLAorCQkvKiAiYXRpbWUiICAgICAgICovIH5NU19OT0FUSU1FLAorCQkvKiAibm9hdGltZSIgICAgICovIE1TX05PQVRJTUUsCisJCS8qICJkaXJhdGltZSIgICAgKi8gfk1TX05PRElSQVRJTUUsCisJCS8qICJub2RpcmF0aW1lIiAgKi8gTVNfTk9ESVJBVElNRSwKKwkJLyogIm1hbmQiICAgICAgICAqLyBNU19NQU5ETE9DSywKKwkJLyogIm5vbWFuZCIgICAgICAqLyB+TVNfTUFORExPQ0ssCisJCS8qICJyZWxhdGltZSIgICAgKi8gTVNfUkVMQVRJTUUsCisJCS8qICJub3JlbGF0aW1lIiAgKi8gfk1TX1JFTEFUSU1FLAorCQkvKiAibG91ZCIgICAgICAgICovIH5NU19TSUxFTlQsCisJCS8qICJyYmluZCIgICAgICAgKi8gTVNfQklORHxNU19SRUNVUlNJVkUsCisKKwkJLy8gYWN0aW9uIGZsYWdzCisJCS8qICJ1bmlvbiIgICAgICAgKi8gTVNfVU5JT04sCisJCS8qICJiaW5kIiAgICAgICAgKi8gTVNfQklORCwKKwkJLyogIm1vdmUiICAgICAgICAqLyBNU19NT1ZFLAorCQkvKiAic2hhcmVkIiAgICAgICovIE1TX1NIQVJFRCwKKwkJLyogInNsYXZlIiAgICAgICAqLyBNU19TTEFWRSwKKwkJLyogInByaXZhdGUiICAgICAqLyBNU19QUklWQVRFLAorCQkvKiAidW5iaW5kYWJsZSIgICovIE1TX1VOQklOREFCTEUsCisJCS8qICJyc2hhcmVkIiAgICAgKi8gTVNfU0hBUkVEfE1TX1JFQ1VSU0lWRSwKKwkJLyogInJzbGF2ZSIgICAgICAqLyBNU19TTEFWRXxNU19SRUNVUlNJVkUsCisJCS8qICJycHJpdmF0ZSIgICAgKi8gTVNfUFJJVkFURXxNU19SRUNVUlNJVkUsCisJCS8qICJydW5iaW5kYWJsZSIgKi8gTVNfVU5CSU5EQUJMRXxNU19SRUNVUlNJVkUsCisJKQorCisJLy8gQWx3YXlzIHVuZGVyc3Rvb2QuCisJLyogInJvIiAgICAgICovIE1TX1JET05MWSwgIC8vIHZmcyBmbGFnCisJLyogInJ3IiAgICAgICovIH5NU19SRE9OTFksIC8vIHZmcyBmbGFnCisJLyogInJlbW91bnQiICovIE1TX1JFTU9VTlQgIC8vIGFjdGlvbiBmbGFnCit9OworCitzdGF0aWMgY29uc3QgY2hhciBtb3VudF9vcHRpb25fc3RyW10gPQorCUlGX0ZFQVRVUkVfTU9VTlRfTE9PUCgKKwkJImxvb3BcMCIKKwkpCisJSUZfRkVBVFVSRV9NT1VOVF9GU1RBQigKKwkJImRlZmF1bHRzXDAiCisJCS8vICJxdWlldFwwIiAtIGRvIG5vdCBmaWx0ZXIgb3V0LCB2ZmF0IHdhbnRzIHRvIHNlZSBpdAorCQkibm9hdXRvXDAiCisJCSJzd1wwIgorCQkic3dhcFwwIgorCQlJRl9ERVNLVE9QKCJ1c2VyXDAiKQorCQlJRl9ERVNLVE9QKCJ1c2Vyc1wwIikKKwkJIl9uZXRkZXZcMCIKKwkpCisJSUZfRkVBVFVSRV9NT1VOVF9GTEFHUygKKwkJLy8gdmZzIGZsYWdzCisJCSJub3N1aWRcMCIKKwkJInN1aWRcMCIKKwkJImRldlwwIgorCQkibm9kZXZcMCIKKwkJImV4ZWNcMCIKKwkJIm5vZXhlY1wwIgorCQkic3luY1wwIgorCQkiZGlyc3luY1wwIgorCQkiYXN5bmNcMCIKKwkJImF0aW1lXDAiCisJCSJub2F0aW1lXDAiCisJCSJkaXJhdGltZVwwIgorCQkibm9kaXJhdGltZVwwIgorCQkibWFuZFwwIgorCQkibm9tYW5kXDAiCisJCSJyZWxhdGltZVwwIgorCQkibm9yZWxhdGltZVwwIgorCQkibG91ZFwwIgorCQkicmJpbmRcMCIKKworCQkvLyBhY3Rpb24gZmxhZ3MKKwkJInVuaW9uXDAiCisJCSJiaW5kXDAiCisJCSJtb3ZlXDAiCisJCSJtYWtlLXNoYXJlZFwwIgorCQkibWFrZS1zbGF2ZVwwIgorCQkibWFrZS1wcml2YXRlXDAiCisJCSJtYWtlLXVuYmluZGFibGVcMCIKKwkJIm1ha2UtcnNoYXJlZFwwIgorCQkibWFrZS1yc2xhdmVcMCIKKwkJIm1ha2UtcnByaXZhdGVcMCIKKwkJIm1ha2UtcnVuYmluZGFibGVcMCIKKwkpCisKKwkvLyBBbHdheXMgdW5kZXJzdG9vZC4KKwkicm9cMCIgICAgICAgIC8vIHZmcyBmbGFnCisJInJ3XDAiICAgICAgICAvLyB2ZnMgZmxhZworCSJyZW1vdW50XDAiICAgLy8gYWN0aW9uIGZsYWcKKzsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisJc21hbGx1aW50IG5mc19tb3VudF92ZXJzaW9uOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRQorCXVuc2lnbmVkIHZlcmJvc2U7CisjZW5kaWYKKwlsbGlzdF90ICpmc2xpc3Q7CisJY2hhciBnZXRtbnRlbnRfYnVmWzFdOworfSBGSVhfQUxJQVNJTkc7CitlbnVtIHsgR0VUTU5URU5UX0JVRlNJWkUgPSBDT01NT05fQlVGU0laRSAtIG9mZnNldG9mKHN0cnVjdCBnbG9iYWxzLCBnZXRtbnRlbnRfYnVmKSB9OworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIG5mc19tb3VudF92ZXJzaW9uIChHLm5mc19tb3VudF92ZXJzaW9uKQorI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX1ZFUkJPU0UKKyNkZWZpbmUgdmVyYm9zZSAgICAgICAgICAgKEcudmVyYm9zZSAgICAgICAgICApCisjZWxzZQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgZnNsaXN0ICAgICAgICAgICAgKEcuZnNsaXN0ICAgICAgICAgICApCisjZGVmaW5lIGdldG1udGVudF9idWYgICAgIChHLmdldG1udGVudF9idWYgICAgKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTVRBQl9TVVBQT1JUCisvKgorICogdXBkYXRlX210YWJfZW50cnlfb25fbW92ZSgpIGlzIHVzZWQgdG8gdXBkYXRlIGVudHJ5IGluIGNhc2Ugb2YgbW91bnQgLS1tb3ZlLgorICogd2UgYXJlIGxvb2tpbmcgZm9yIGV4aXN0aW5nIGVudHJpZXMgbW50X2RpciB3aGljaCBpcyBlcXVhbCB0byBtbnRfZnNuYW1lIG9mCisgKiBpbnB1dCBtbnRlbnQgYW5kIHJlcGxhY2UgaXQgYnkgbmV3IG9uZS4KKyAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHVwZGF0ZV9tdGFiX2VudHJ5X29uX21vdmUoY29uc3Qgc3RydWN0IG1udGVudCAqbXApCit7CisJc3RydWN0IG1udGVudCAqZW50cmllcywgKm07CisJaW50IGksIGNvdW50OworCUZJTEUgKm1vdW50VGFibGU7CisKKwltb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAiciIpOworCWlmICghbW91bnRUYWJsZSkgeworCQliYl9wZXJyb3JfbXNnKGJiX3BhdGhfbXRhYl9maWxlKTsKKwkJcmV0dXJuOworCX0KKworCWVudHJpZXMgPSBOVUxMOworCWNvdW50ID0gMDsKKwl3aGlsZSAoKG0gPSBnZXRtbnRlbnQobW91bnRUYWJsZSkpICE9IE5VTEwpIHsKKwkJZW50cmllcyA9IHhyZWFsbG9jX3ZlY3RvcihlbnRyaWVzLCAzLCBjb3VudCk7CisJCWVudHJpZXNbY291bnRdLm1udF9mc25hbWUgPSB4c3RyZHVwKG0tPm1udF9mc25hbWUpOworCQllbnRyaWVzW2NvdW50XS5tbnRfZGlyID0geHN0cmR1cChtLT5tbnRfZGlyKTsKKwkJZW50cmllc1tjb3VudF0ubW50X3R5cGUgPSB4c3RyZHVwKG0tPm1udF90eXBlKTsKKwkJZW50cmllc1tjb3VudF0ubW50X29wdHMgPSB4c3RyZHVwKG0tPm1udF9vcHRzKTsKKwkJZW50cmllc1tjb3VudF0ubW50X2ZyZXEgPSBtLT5tbnRfZnJlcTsKKwkJZW50cmllc1tjb3VudF0ubW50X3Bhc3NubyA9IG0tPm1udF9wYXNzbm87CisJCWNvdW50Kys7CisJfQorCWVuZG1udGVudChtb3VudFRhYmxlKTsKKworCW1vdW50VGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJ3Iik7CisJaWYgKG1vdW50VGFibGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWlmIChzdHJjbXAoZW50cmllc1tpXS5tbnRfZGlyLCBtcC0+bW50X2ZzbmFtZSkgIT0gMCkKKwkJCQlhZGRtbnRlbnQobW91bnRUYWJsZSwgJmVudHJpZXNbaV0pOworCQkJZWxzZQorCQkJCWFkZG1udGVudChtb3VudFRhYmxlLCBtcCk7CisJCX0KKwkJZW5kbW50ZW50KG1vdW50VGFibGUpOworCX0gZWxzZSBpZiAoZXJybm8gIT0gRVJPRlMpCisJCWJiX3BlcnJvcl9tc2coYmJfcGF0aF9tdGFiX2ZpbGUpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlmcmVlKGVudHJpZXNbaV0ubW50X2ZzbmFtZSk7CisJCQlmcmVlKGVudHJpZXNbaV0ubW50X2Rpcik7CisJCQlmcmVlKGVudHJpZXNbaV0ubW50X3R5cGUpOworCQkJZnJlZShlbnRyaWVzW2ldLm1udF9vcHRzKTsKKwkJfQorCQlmcmVlKGVudHJpZXMpOworCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRQorc3RhdGljIGludCB2ZXJib3NlX21vdW50KGNvbnN0IGNoYXIgKnNvdXJjZSwgY29uc3QgY2hhciAqdGFyZ2V0LAorCQljb25zdCBjaGFyICpmaWxlc3lzdGVtdHlwZSwKKwkJdW5zaWduZWQgbG9uZyBtb3VudGZsYWdzLCBjb25zdCB2b2lkICpkYXRhKQoreworCWludCByYzsKKworCWVycm5vID0gMDsKKwlyYyA9IG1vdW50KHNvdXJjZSwgdGFyZ2V0LCBmaWxlc3lzdGVtdHlwZSwgbW91bnRmbGFncywgZGF0YSk7CisJaWYgKHZlcmJvc2UgPj0gMikKKwkJYmJfcGVycm9yX21zZygibW91bnQoJyVzJywnJXMnLCclcycsMHglMDhseCwnJXMnKTolZCIsCisJCQlzb3VyY2UsIHRhcmdldCwgZmlsZXN5c3RlbXR5cGUsCisJCQltb3VudGZsYWdzLCAoY2hhciopZGF0YSwgcmMpOworCXJldHVybiByYzsKK30KKyNlbHNlCisjZGVmaW5lIHZlcmJvc2VfbW91bnQoLi4uKSBtb3VudChfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisvLyBBcHBlbmQgbW91bnQgb3B0aW9ucyB0byBzdHJpbmcKK3N0YXRpYyB2b2lkIGFwcGVuZF9tb3VudF9vcHRpb25zKGNoYXIgKipvbGRvcHRzLCBjb25zdCBjaGFyICpuZXdvcHRzKQoreworCWlmICgqb2xkb3B0cyAmJiAqKm9sZG9wdHMpIHsKKwkJLy8gRG8gbm90IGluc2VydCBvcHRpb25zIHdoaWNoIGFyZSBhbHJlYWR5IHRoZXJlCisJCXdoaWxlIChuZXdvcHRzWzBdKSB7CisJCQljaGFyICpwOworCQkJaW50IGxlbiA9IHN0cmxlbihuZXdvcHRzKTsKKwkJCXAgPSBzdHJjaHIobmV3b3B0cywgJywnKTsKKwkJCWlmIChwKSBsZW4gPSBwIC0gbmV3b3B0czsKKwkJCXAgPSAqb2xkb3B0czsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCFzdHJuY21wKHAsIG5ld29wdHMsIGxlbikKKwkJCQkgJiYgKHBbbGVuXSA9PSAnLCcgfHwgcFtsZW5dID09ICdcMCcpKQorCQkJCQlnb3RvIHNraXA7CisJCQkJcCA9IHN0cmNocihwLCcsJyk7CisJCQkJaWYgKCFwKSBicmVhazsKKwkJCQlwKys7CisJCQl9CisJCQlwID0geGFzcHJpbnRmKCIlcywlLipzIiwgKm9sZG9wdHMsIGxlbiwgbmV3b3B0cyk7CisJCQlmcmVlKCpvbGRvcHRzKTsKKwkJCSpvbGRvcHRzID0gcDsKKyBza2lwOgorCQkJbmV3b3B0cyArPSBsZW47CisJCQl3aGlsZSAobmV3b3B0c1swXSA9PSAnLCcpIG5ld29wdHMrKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZSgqb2xkb3B0cyk7CisJCSpvbGRvcHRzID0geHN0cmR1cChuZXdvcHRzKTsKKwl9Cit9CisKKy8vIFVzZSB0aGUgbW91bnRfb3B0aW9ucyBsaXN0IHRvIHBhcnNlIG9wdGlvbnMgaW50byBmbGFncy4KKy8vIEFsc28gdXBkYXRlIGxpc3Qgb2YgdW5yZWNvZ25pemVkIG9wdGlvbnMgaWYgdW5yZWNvZ25pemVkICE9IE5VTEwKK3N0YXRpYyBsb25nIHBhcnNlX21vdW50X29wdGlvbnMoY2hhciAqb3B0aW9ucywgY2hhciAqKnVucmVjb2duaXplZCkKK3sKKwlsb25nIGZsYWdzID0gTVNfU0lMRU5UOworCisJLy8gTG9vcCB0aHJvdWdoIG9wdGlvbnMKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGk7CisJCWNoYXIgKmNvbW1hID0gc3RyY2hyKG9wdGlvbnMsICcsJyk7CisJCWNvbnN0IGNoYXIgKm9wdGlvbl9zdHIgPSBtb3VudF9vcHRpb25fc3RyOworCisJCWlmIChjb21tYSkgKmNvbW1hID0gJ1wwJzsKKworLy8gRklYTUU6IHVzZSBoYXNtbnRvcHQoKQorCQkvLyBGaW5kIHRoaXMgb3B0aW9uIGluIG1vdW50X29wdGlvbnMKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW91bnRfb3B0aW9ucyk7IGkrKykgeworCQkJaWYgKHN0cmNhc2VjbXAob3B0aW9uX3N0ciwgb3B0aW9ucykgPT0gMCkgeworCQkJCWxvbmcgZmwgPSBtb3VudF9vcHRpb25zW2ldOworCQkJCWlmIChmbCA8IDApCisJCQkJCWZsYWdzICY9IGZsOworCQkJCWVsc2UKKwkJCQkJZmxhZ3MgfD0gZmw7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCW9wdGlvbl9zdHIgKz0gc3RybGVuKG9wdGlvbl9zdHIpICsgMTsKKwkJfQorCQkvLyBXZSBkaWQgbm90IHJlY29nbml6ZSB0aGlzIG9wdGlvbi4KKwkJLy8gSWYgInVucmVjb2duaXplZCIgaXMgbm90IE5VTEwsIGFwcGVuZCBvcHRpb24gdGhlcmUuCisJCS8vIE5vdGUgdGhhdCB3ZSBzaG91bGQgbm90IGFwcGVuZCAqZW1wdHkqIG9wdGlvbiAtCisJCS8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHBhc3MgTlVMTCwgbm90ICIiLCB0byAiZGF0YSIKKwkJLy8gcGFyYW1ldGVyIG9mIG1vdW50KDIpIHN5c2NhbGwuCisJCS8vIFRoaXMgaXMgY3J1Y2lhbCBmb3IgZmlsZXN5c3RlbXMgdGhhdCBkb24ndCBhY2NlcHQKKwkJLy8gYW55IGFyYml0cmFyeSBtb3VudCBvcHRpb25zLCBsaWtlIGNncm91cCBmczoKKwkJLy8gIm1vdW50IC10IGNncm91cCBub25lIC9tbnQiCisJCWlmIChvcHRpb25zWzBdICYmIHVucmVjb2duaXplZCkgeworCQkJLy8gQWRkIGl0IHRvIHN0cmZsYWdzLCB0byBwYXNzIG9uIHRvIGtlcm5lbAorCQkJY2hhciAqcCA9ICp1bnJlY29nbml6ZWQ7CisJCQl1bnNpZ25lZCBsZW4gPSBwID8gc3RybGVuKHApIDogMDsKKwkJCSp1bnJlY29nbml6ZWQgPSBwID0geHJlYWxsb2MocCwgbGVuICsgc3RybGVuKG9wdGlvbnMpICsgMik7CisKKwkJCS8vIENvbW1hIHNlcGFyYXRlZCBpZiBpdCdzIG5vdCB0aGUgZmlyc3Qgb25lCisJCQlpZiAobGVuKSBwW2xlbisrXSA9ICcsJzsKKwkJCXN0cmNweShwICsgbGVuLCBvcHRpb25zKTsKKwkJfQorIGZvdW5kOgorCQlpZiAoIWNvbW1hKQorCQkJYnJlYWs7CisJCS8vIEFkdmFuY2UgdG8gbmV4dCBvcHRpb24KKwkJKmNvbW1hID0gJywnOworCQlvcHRpb25zID0gKytjb21tYTsKKwl9CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8vIFJldHVybiBhIGxpc3Qgb2YgYWxsIGJsb2NrIGRldmljZSBiYWNrZWQgZmlsZXN5c3RlbXMKK3N0YXRpYyBsbGlzdF90ICpnZXRfYmxvY2tfYmFja2VkX2ZpbGVzeXN0ZW1zKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgZmlsZXN5c3RlbXNbMl1bc2l6ZW9mKCIvcHJvYy9maWxlc3lzdGVtcyIpXSA9IHsKKwkJIi9ldGMvZmlsZXN5c3RlbXMiLAorCQkiL3Byb2MvZmlsZXN5c3RlbXMiLAorCX07CisJY2hhciAqZnMsICpidWY7CisJbGxpc3RfdCAqbGlzdCA9IE5VTEw7CisJaW50IGk7CisJRklMRSAqZjsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZiA9IGZvcGVuX2Zvcl9yZWFkKGZpbGVzeXN0ZW1zW2ldKTsKKwkJaWYgKCFmKSBjb250aW51ZTsKKworCQl3aGlsZSAoKGJ1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZikpICE9IE5VTEwpIHsKKwkJCWlmIChzdHJuY21wKGJ1ZiwgIm5vZGV2IiwgNSkgPT0gMCAmJiBpc3NwYWNlKGJ1Zls1XSkpCisJCQkJY29udGludWU7CisJCQlmcyA9IHNraXBfd2hpdGVzcGFjZShidWYpOworCQkJaWYgKCpmcyA9PSAnIycgfHwgKmZzID09ICcqJyB8fCAhKmZzKQorCQkJCWNvbnRpbnVlOworCisJCQlsbGlzdF9hZGRfdG9fZW5kKCZsaXN0LCB4c3RyZHVwKGZzKSk7CisJCQlmcmVlKGJ1Zik7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmY2xvc2UoZik7CisJfQorCisJcmV0dXJuIGxpc3Q7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorc3RhdGljIHZvaWQgZGVsZXRlX2Jsb2NrX2JhY2tlZF9maWxlc3lzdGVtcyh2b2lkKQoreworCWxsaXN0X2ZyZWUoZnNsaXN0LCBmcmVlKTsKK30KKyNlbHNlCit2b2lkIGRlbGV0ZV9ibG9ja19iYWNrZWRfZmlsZXN5c3RlbXModm9pZCk7CisjZW5kaWYKKworLy8gUGVyZm9ybSBhY3R1YWwgbW91bnQgb2Ygc3BlY2lmaWMgZmlsZXN5c3RlbSBhdCBzcGVjaWZpYyBsb2NhdGlvbi4KKy8vIE5COiBtcC0+eHh4IGZpZWxkcyBtYXkgYmUgdHJhc2hlZCBvbiBleGl0CitzdGF0aWMgaW50IG1vdW50X2l0X25vdyhzdHJ1Y3QgbW50ZW50ICptcCwgbG9uZyB2ZnNmbGFncywgY2hhciAqZmlsdGVyb3B0cykKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKEZBS0VfSVQpIHsKKwkJaWYgKHZlcmJvc2UgPj0gMikKKwkJCWJiX2Vycm9yX21zZygid291bGQgZG8gbW91bnQoJyVzJywnJXMnLCclcycsMHglMDhseCwnJXMnKSIsCisJCQkJbXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyLCBtcC0+bW50X3R5cGUsCisJCQkJdmZzZmxhZ3MsIGZpbHRlcm9wdHMpOworCQlnb3RvIG10YWI7CisJfQorCisJLy8gTW91bnQsIHdpdGggZmFsbGJhY2sgdG8gcmVhZC1vbmx5IGlmIG5lY2Vzc2FyeS4KKwlmb3IgKDs7KSB7CisJCWVycm5vID0gMDsKKwkJcmMgPSB2ZXJib3NlX21vdW50KG1wLT5tbnRfZnNuYW1lLCBtcC0+bW50X2RpciwgbXAtPm1udF90eXBlLAorCQkJCXZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKworCQkvLyBJZiBtb3VudCBmYWlsZWQsIHRyeQorCQkvLyBoZWxwZXIgcHJvZ3JhbSBtb3VudC48bW50X3R5cGU+CisJCWlmIChIRUxQRVJTX0FMTE9XRUQgJiYgcmMgJiYgbXAtPm1udF90eXBlKSB7CisJCQljaGFyICphcmdzWzhdOworCQkJaW50IGVycm5vX3NhdmUgPSBlcnJubzsKKwkJCWFyZ3NbMF0gPSB4YXNwcmludGYoIm1vdW50LiVzIiwgbXAtPm1udF90eXBlKTsKKwkJCXJjID0gMTsKKwkJCWlmIChGQUtFX0lUKQorCQkJCWFyZ3NbcmMrK10gPSAoY2hhciAqKSItZiI7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTVRBQl9TVVBQT1JUICYmICFVU0VfTVRBQikKKwkJCQlhcmdzW3JjKytdID0gKGNoYXIgKikiLW4iOworCQkJYXJnc1tyYysrXSA9IG1wLT5tbnRfZnNuYW1lOworCQkJYXJnc1tyYysrXSA9IG1wLT5tbnRfZGlyOworCQkJaWYgKGZpbHRlcm9wdHMpIHsKKwkJCQlhcmdzW3JjKytdID0gKGNoYXIgKikiLW8iOworCQkJCWFyZ3NbcmMrK10gPSBmaWx0ZXJvcHRzOworCQkJfQorCQkJYXJnc1tyY10gPSBOVUxMOworCQkJcmMgPSBzcGF3bl9hbmRfd2FpdChhcmdzKTsKKwkJCWZyZWUoYXJnc1swXSk7CisJCQlpZiAoIXJjKQorCQkJCWJyZWFrOworCQkJZXJybm8gPSBlcnJub19zYXZlOworCQl9CisKKwkJaWYgKCFyYyB8fCAodmZzZmxhZ3MgJiBNU19SRE9OTFkpIHx8IChlcnJubyAhPSBFQUNDRVMgJiYgZXJybm8gIT0gRVJPRlMpKQorCQkJYnJlYWs7CisJCWlmICghKHZmc2ZsYWdzICYgTVNfU0lMRU5UKSkKKwkJCWJiX2Vycm9yX21zZygiJXMgaXMgd3JpdGUtcHJvdGVjdGVkLCBtb3VudGluZyByZWFkLW9ubHkiLAorCQkJCQkJbXAtPm1udF9mc25hbWUpOworCQl2ZnNmbGFncyB8PSBNU19SRE9OTFk7CisJfQorCisJLy8gQWJvcnQgZW50aXJlbHkgaWYgcGVybWlzc2lvbiBkZW5pZWQuCisKKwlpZiAocmMgJiYgZXJybm8gPT0gRVBFUk0pCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCisJLy8gSWYgdGhlIG1vdW50IHdhcyBzdWNjZXNzZnVsLCBhbmQgd2UncmUgbWFpbnRhaW5pbmcgYW4gb2xkLXN0eWxlCisJLy8gbXRhYiBmaWxlIGJ5IGhhbmQsIGFkZCB0aGUgbmV3IGVudHJ5IHRvIGl0IG5vdy4KKyBtdGFiOgorCWlmIChVU0VfTVRBQiAmJiAhcmMgJiYgISh2ZnNmbGFncyAmIE1TX1JFTU9VTlQpKSB7CisJCWNoYXIgKmZzbmFtZTsKKwkJRklMRSAqbW91bnRUYWJsZSA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgImErIik7CisJCWNvbnN0IGNoYXIgKm9wdGlvbl9zdHIgPSBtb3VudF9vcHRpb25fc3RyOworCQlpbnQgaTsKKworCQlpZiAoIW1vdW50VGFibGUpIHsKKwkJCWJiX3BlcnJvcl9tc2coYmJfcGF0aF9tdGFiX2ZpbGUpOworCQkJZ290byByZXQ7CisJCX0KKworCQkvLyBBZGQgdmZzIHN0cmluZyBmbGFncworCQlmb3IgKGkgPSAwOyBtb3VudF9vcHRpb25zW2ldICE9IE1TX1JFTU9VTlQ7IGkrKykgeworCQkJaWYgKG1vdW50X29wdGlvbnNbaV0gPiAwICYmIChtb3VudF9vcHRpb25zW2ldICYgdmZzZmxhZ3MpKQorCQkJCWFwcGVuZF9tb3VudF9vcHRpb25zKCYobXAtPm1udF9vcHRzKSwgb3B0aW9uX3N0cik7CisJCQlvcHRpb25fc3RyICs9IHN0cmxlbihvcHRpb25fc3RyKSArIDE7CisJCX0KKworCQkvLyBSZW1vdmUgdHJhaWxpbmcgLyAoaWYgYW55KSBmcm9tIGRpcmVjdG9yeSB3ZSBtb3VudGVkIG9uCisJCWkgPSBzdHJsZW4obXAtPm1udF9kaXIpIC0gMTsKKwkJd2hpbGUgKGkgPiAwICYmIG1wLT5tbnRfZGlyW2ldID09ICcvJykKKwkJCW1wLT5tbnRfZGlyW2ktLV0gPSAnXDAnOworCisJCS8vIENvbnZlcnQgdG8gY2Fub25pY2FsIHBhdGhuYW1lcyBhcyBuZWVkZWQKKwkJbXAtPm1udF9kaXIgPSBiYl9zaW1wbGlmeV9wYXRoKG1wLT5tbnRfZGlyKTsKKwkJZnNuYW1lID0gTlVMTDsKKwkJaWYgKCFtcC0+bW50X3R5cGUgfHwgISptcC0+bW50X3R5cGUpIHsgLy8gYmluZCBtb3VudAorCQkJbXAtPm1udF9mc25hbWUgPSBmc25hbWUgPSBiYl9zaW1wbGlmeV9wYXRoKG1wLT5tbnRfZnNuYW1lKTsKKwkJCW1wLT5tbnRfdHlwZSA9IChjaGFyKikiYmluZCI7CisJCX0KKwkJbXAtPm1udF9mcmVxID0gbXAtPm1udF9wYXNzbm8gPSAwOworCisJCS8vIFdyaXRlIGFuZCBjbG9zZQorI2lmIEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVAorCQlpZiAodmZzZmxhZ3MgJiBNU19NT1ZFKQorCQkJdXBkYXRlX210YWJfZW50cnlfb25fbW92ZShtcCk7CisJCWVsc2UKKyNlbmRpZgorCQkJYWRkbW50ZW50KG1vdW50VGFibGUsIG1wKTsKKwkJZW5kbW50ZW50KG1vdW50VGFibGUpOworCisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQkJZnJlZShtcC0+bW50X2Rpcik7CisJCQlmcmVlKGZzbmFtZSk7CisJCX0KKwl9CisgcmV0OgorCXJldHVybiByYzsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworCisvKgorICogTGludXggTkZTIG1vdW50CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgUmljayBTbGFka2V5IDxqcnNAd29ybGQuc3RkLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFdlZCBGZWIgIDggMTI6NTE6NDggMTk5NSwgYmlyb0B5Z2dkcmFzaWwuY29tIChSb3NzIEJpcm8pOiBhbGxvdyBhbGwgcG9ydAorICogbnVtYmVycyB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKiBGcmksIDggTWFyIDE5OTYgMTg6MDE6MzksIFN3ZW4gVGh1ZW1tbGVyIDxzd2VuQHVuaS1wYWRlcmJvcm4uZGU+OgorICogT21pdCB0aGUgY2FsbCB0byBjb25uZWN0KCkgZm9yIExpbnV4IHZlcnNpb24gMS4zLjExIG9yIGxhdGVyLgorICoKKyAqIFdlZCBPY3QgIDEgMjM6NTU6MjggMTk5NzogRGljayBTdHJlZWZsYW5kIDxkaWNrX3N0cmVlZmxhbmRAdGFza2luZy5jb20+CisgKiBJbXBsZW1lbnRlZCB0aGUgImJnIiwgImZnIiBhbmQgInJldHJ5IiBtb3VudCBvcHRpb25zIGZvciBORlMuCisgKgorICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWlja2lld2ljeiA8bWlzaWVrQG1pc2llay5ldS5vcmc+CisgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKgorICogTW9kaWZpZWQgYnkgT2xhZiBLaXJjaCBhbmQgVHJvbmQgTXlrbGVidXN0IGZvciBuZXcgTkZTIGNvZGUsCisgKiBwbHVzIE5GU3YzIHN0dWZmLgorICovCisKKyNkZWZpbmUgTU9VTlRQT1JUIDYzNQorI2RlZmluZSBNTlRQQVRITEVOIDEwMjQKKyNkZWZpbmUgTU5UTkFNTEVOIDI1NQorI2RlZmluZSBGSFNJWkUgMzIKKyNkZWZpbmUgRkhTSVpFMyA2NAorCit0eXBlZGVmIGNoYXIgZmhhbmRsZVtGSFNJWkVdOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGZoYW5kbGUzX2xlbjsKKwljaGFyICpmaGFuZGxlM192YWw7Cit9IGZoYW5kbGUzOworCitlbnVtIG1vdW50c3RhdDMgeworCU1OVF9PSyA9IDAsCisJTU5UM0VSUl9QRVJNID0gMSwKKwlNTlQzRVJSX05PRU5UID0gMiwKKwlNTlQzRVJSX0lPID0gNSwKKwlNTlQzRVJSX0FDQ0VTID0gMTMsCisJTU5UM0VSUl9OT1RESVIgPSAyMCwKKwlNTlQzRVJSX0lOVkFMID0gMjIsCisJTU5UM0VSUl9OQU1FVE9PTE9ORyA9IDYzLAorCU1OVDNFUlJfTk9UU1VQUCA9IDEwMDA0LAorCU1OVDNFUlJfU0VSVkVSRkFVTFQgPSAxMDAwNiwKK307Cit0eXBlZGVmIGVudW0gbW91bnRzdGF0MyBtb3VudHN0YXQzOworCitzdHJ1Y3QgZmhzdGF0dXMgeworCXVuc2lnbmVkIGludCBmaHNfc3RhdHVzOworCXVuaW9uIHsKKwkJZmhhbmRsZSBmaHNfZmhhbmRsZTsKKwl9IGZoc3RhdHVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZmhzdGF0dXMgZmhzdGF0dXM7CisKK3N0cnVjdCBtb3VudHJlczNfb2sgeworCWZoYW5kbGUzIGZoYW5kbGU7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGF1dGhfZmxhdm91cnNfbGVuOworCQljaGFyICphdXRoX2ZsYXZvdXJzX3ZhbDsKKwl9IGF1dGhfZmxhdm91cnM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW91bnRyZXMzX29rIG1vdW50cmVzM19vazsKKworc3RydWN0IG1vdW50cmVzMyB7CisJbW91bnRzdGF0MyBmaHNfc3RhdHVzOworCXVuaW9uIHsKKwkJbW91bnRyZXMzX29rIG1vdW50aW5mbzsKKwl9IG1vdW50cmVzM191OworfTsKK3R5cGVkZWYgc3RydWN0IG1vdW50cmVzMyBtb3VudHJlczM7CisKK3R5cGVkZWYgY2hhciAqZGlycGF0aDsKKwordHlwZWRlZiBjaGFyICpuYW1lOworCit0eXBlZGVmIHN0cnVjdCBtb3VudGJvZHkgKm1vdW50bGlzdDsKKworc3RydWN0IG1vdW50Ym9keSB7CisJbmFtZSBtbF9ob3N0bmFtZTsKKwlkaXJwYXRoIG1sX2RpcmVjdG9yeTsKKwltb3VudGxpc3QgbWxfbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBtb3VudGJvZHkgbW91bnRib2R5OworCit0eXBlZGVmIHN0cnVjdCBncm91cG5vZGUgKmdyb3VwczsKKworc3RydWN0IGdyb3Vwbm9kZSB7CisJbmFtZSBncl9uYW1lOworCWdyb3VwcyBncl9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IGdyb3Vwbm9kZSBncm91cG5vZGU7CisKK3R5cGVkZWYgc3RydWN0IGV4cG9ydG5vZGUgKmV4cG9ydHM7CisKK3N0cnVjdCBleHBvcnRub2RlIHsKKwlkaXJwYXRoIGV4X2RpcjsKKwlncm91cHMgZXhfZ3JvdXBzOworCWV4cG9ydHMgZXhfbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBleHBvcnRub2RlIGV4cG9ydG5vZGU7CisKK3N0cnVjdCBwcGF0aGNuZiB7CisJaW50IHBjX2xpbmtfbWF4OworCXNob3J0IHBjX21heF9jYW5vbjsKKwlzaG9ydCBwY19tYXhfaW5wdXQ7CisJc2hvcnQgcGNfbmFtZV9tYXg7CisJc2hvcnQgcGNfcGF0aF9tYXg7CisJc2hvcnQgcGNfcGlwZV9idWY7CisJdWludDhfdCBwY192ZGlzYWJsZTsKKwljaGFyIHBjX3h4eDsKKwlzaG9ydCBwY19tYXNrWzJdOworfTsKK3R5cGVkZWYgc3RydWN0IHBwYXRoY25mIHBwYXRoY25mOworCisjZGVmaW5lIE1PVU5UUFJPRyAxMDAwMDUKKyNkZWZpbmUgTU9VTlRWRVJTIDEKKworI2RlZmluZSBNT1VOVFBST0NfTlVMTCAwCisjZGVmaW5lIE1PVU5UUFJPQ19NTlQgMQorI2RlZmluZSBNT1VOVFBST0NfRFVNUCAyCisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UIDMKKyNkZWZpbmUgTU9VTlRQUk9DX1VNTlRBTEwgNAorI2RlZmluZSBNT1VOVFBST0NfRVhQT1JUIDUKKyNkZWZpbmUgTU9VTlRQUk9DX0VYUE9SVEFMTCA2CisKKyNkZWZpbmUgTU9VTlRWRVJTX1BPU0lYIDIKKworI2RlZmluZSBNT1VOVFBST0NfUEFUSENPTkYgNworCisjZGVmaW5lIE1PVU5UX1YzIDMKKworI2RlZmluZSBNT1VOVFBST0MzX05VTEwgMAorI2RlZmluZSBNT1VOVFBST0MzX01OVCAxCisjZGVmaW5lIE1PVU5UUFJPQzNfRFVNUCAyCisjZGVmaW5lIE1PVU5UUFJPQzNfVU1OVCAzCisjZGVmaW5lIE1PVU5UUFJPQzNfVU1OVEFMTCA0CisjZGVmaW5lIE1PVU5UUFJPQzNfRVhQT1JUIDUKKworZW51bSB7CisjaWZuZGVmIE5GU19GSFNJWkUKKwlORlNfRkhTSVpFID0gMzIsCisjZW5kaWYKKyNpZm5kZWYgTkZTX1BPUlQKKwlORlNfUE9SVCA9IDIwNDkKKyNlbmRpZgorfTsKKworLyoKKyAqIFdlIHdhbnQgdG8gYmUgYWJsZSB0byBjb21waWxlIG1vdW50IG9uIG9sZCBrZXJuZWxzIGluIHN1Y2ggYSB3YXkKKyAqIHRoYXQgdGhlIGJpbmFyeSB3aWxsIHdvcmsgd2VsbCBvbiBtb3JlIHJlY2VudCBrZXJuZWxzLgorICogVGh1cywgaWYgbmVjZXNzYXJ5IHdlIHRlYWNoIG5mc21vdW50LmMgdGhlIHN0cnVjdHVyZSBvZiBuZXcgZmllbGRzCisgKiB0aGF0IHdpbGwgY29tZSBsYXRlci4KKyAqCisgKiBNb3Jlb3ZlciwgdGhlIG5ldyBrZXJuZWwgaW5jbHVkZXMgY29uZmxpY3Qgd2l0aCBnbGliYyBpbmNsdWRlcworICogc28gaXQgaXMgZWFzaWVzdCB0byBpZ25vcmUgdGhlIGtlcm5lbCBhbHRvZ2V0aGVyIChhdCBjb21waWxlIHRpbWUpLgorICovCisKK3N0cnVjdCBuZnMyX2ZoIHsKKwljaGFyICAgICAgICAgICAgICAgICAgICBkYXRhWzMyXTsKK307CitzdHJ1Y3QgbmZzM19maCB7CisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBkYXRhWzY0XTsKK307CisKK3N0cnVjdCBuZnNfbW91bnRfZGF0YSB7CisJaW50CQl2ZXJzaW9uOwkJLyogMSAqLworCWludAkJZmQ7CQkJLyogMSAqLworCXN0cnVjdCBuZnMyX2ZoCW9sZF9yb290OwkJLyogMSAqLworCWludAkJZmxhZ3M7CQkJLyogMSAqLworCWludAkJcnNpemU7CQkJLyogMSAqLworCWludAkJd3NpemU7CQkJLyogMSAqLworCWludAkJdGltZW87CQkJLyogMSAqLworCWludAkJcmV0cmFuczsJCS8qIDEgKi8KKwlpbnQJCWFjcmVnbWluOwkJLyogMSAqLworCWludAkJYWNyZWdtYXg7CQkvKiAxICovCisJaW50CQlhY2Rpcm1pbjsJCS8qIDEgKi8KKwlpbnQJCWFjZGlybWF4OwkJLyogMSAqLworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwkJLyogMSAqLworCWNoYXIJCWhvc3RuYW1lWzI1Nl07CQkvKiAxICovCisJaW50CQluYW1sZW47CQkJLyogMiAqLworCXVuc2lnbmVkIGludAlic2l6ZTsJCQkvKiAzICovCisJc3RydWN0IG5mczNfZmgJcm9vdDsJCQkvKiA0ICovCit9OworCisvKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLworZW51bSB7CisJTkZTX01PVU5UX1NPRlQgPSAweDAwMDEsCS8qIDEgKi8KKwlORlNfTU9VTlRfSU5UUiA9IDB4MDAwMiwJLyogMSAqLworCU5GU19NT1VOVF9TRUNVUkUgPSAweDAwMDQsCS8qIDEgKi8KKwlORlNfTU9VTlRfUE9TSVggPSAweDAwMDgsCS8qIDEgKi8KKwlORlNfTU9VTlRfTk9DVE8gPSAweDAwMTAsCS8qIDEgKi8KKwlORlNfTU9VTlRfTk9BQyA9IDB4MDAyMCwJLyogMSAqLworCU5GU19NT1VOVF9UQ1AgPSAweDAwNDAsCQkvKiAyICovCisJTkZTX01PVU5UX1ZFUjMgPSAweDAwODAsCS8qIDMgKi8KKwlORlNfTU9VTlRfS0VSQkVST1MgPSAweDAxMDAsCS8qIDMgKi8KKwlORlNfTU9VTlRfTk9OTE0gPSAweDAyMDAsCS8qIDMgKi8KKwlORlNfTU9VTlRfTk9SRElSUExVUyA9IDB4NDAwMAorfTsKKworCisvKgorICogV2UgbmVlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZXMgYW5kCisgKiB0aGUgbG9jYWwgZXJybm8gdmFsdWVzIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUuCisgKgorICogQW5kcmVhcyBTY2h3YWIgPHNjaHdhYkBMUzUuaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OiBjaGFuZ2UgZXJybm86CisgKiAiYWZ0ZXIgI2luY2x1ZGUgPGVycm5vLmg+IHRoZSBzeW1ib2wgZXJybm8gaXMgcmVzZXJ2ZWQgZm9yIGFueSB1c2UsCisgKiAgaXQgY2Fubm90IGV2ZW4gYmUgdXNlZCBhcyBhIHN0cnVjdCB0YWcgb3IgZmllbGQgbmFtZSIuCisgKi8KKyNpZm5kZWYgRURRVU9UCisjIGRlZmluZSBFRFFVT1QgRU5PU1BDCisjZW5kaWYKKy8qIENvbnZlcnQgZWFjaCBORlNFUlJfQkxBSCBpbnRvIEVCTEFIICovCitzdGF0aWMgY29uc3QgdWludDhfdCBuZnNfZXJyX3N0YXRbXSA9IHsKKwkgMSwgIDIsICA1LCAgNiwgMTMsIDE3LAorCTE5LCAyMCwgMjEsIDIyLCAyNywgMjgsCisJMzAsIDYzLCA2NiwgNjksIDcwLCA3MQorfTsKKyNpZiAoIFwKKwlFUEVSTSB8IEVOT0VOVCAgICAgIHwgRUlPICAgICAgfCBFTlhJTyB8IEVBQ0NFU3wgRUVYSVNUIHwgXAorCUVOT0RFVnwgRU5PVERJUiAgICAgfCBFSVNESVIgICB8IEVJTlZBTHwgRUZCSUcgfCBFTk9TUEMgfCBcCisJRVJPRlMgfCBFTkFNRVRPT0xPTkd8IEVOT1RFTVBUWXwgRURRVU9UfCBFU1RBTEV8IEVSRU1PVEUpIDwgMjU2Cit0eXBlZGVmIHVpbnQ4X3QgbmZzX2Vycl90eXBlOworI2Vsc2UKK3R5cGVkZWYgdWludDE2X3QgbmZzX2Vycl90eXBlOworI2VuZGlmCitzdGF0aWMgY29uc3QgbmZzX2Vycl90eXBlIG5mc19lcnJfZXJybnVtW10gPSB7CisJRVBFUk0gLCBFTk9FTlQgICAgICAsIEVJTyAgICAgICwgRU5YSU8gLCBFQUNDRVMsIEVFWElTVCwKKwlFTk9ERVYsIEVOT1RESVIgICAgICwgRUlTRElSICAgLCBFSU5WQUwsIEVGQklHICwgRU5PU1BDLAorCUVST0ZTICwgRU5BTUVUT09MT05HLCBFTk9URU1QVFksIEVEUVVPVCwgRVNUQUxFLCBFUkVNT1RFCit9Oworc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdHVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmZzX2Vycl9zdGF0KTsgaSsrKSB7CisJCWlmIChuZnNfZXJyX3N0YXRbaV0gPT0gc3RhdHVzKQorCQkJcmV0dXJuIHN0cmVycm9yKG5mc19lcnJfZXJybnVtW2ldKTsKKwl9CisJcmV0dXJuIHhhc3ByaW50ZigidW5rbm93biBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZTogJWQiLCBzdGF0dXMpOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9maGFuZGxlKFhEUiAqeGRycywgZmhhbmRsZSBvYmpwKQoreworCXJldHVybiB4ZHJfb3BhcXVlKHhkcnMsIG9ianAsIEZIU0laRSk7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX2Zoc3RhdHVzKFhEUiAqeGRycywgZmhzdGF0dXMgKm9ianApCit7CisJaWYgKCF4ZHJfdV9pbnQoeGRycywgJm9ianAtPmZoc19zdGF0dXMpKQorCQkgcmV0dXJuIEZBTFNFOworCWlmIChvYmpwLT5maHNfc3RhdHVzID09IDApCisJCXJldHVybiB4ZHJfZmhhbmRsZSh4ZHJzLCBvYmpwLT5maHN0YXR1c191LmZoc19maGFuZGxlKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfZGlycGF0aChYRFIgKnhkcnMsIGRpcnBhdGggKm9ianApCit7CisJcmV0dXJuIHhkcl9zdHJpbmcoeGRycywgb2JqcCwgTU5UUEFUSExFTik7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX2ZoYW5kbGUzKFhEUiAqeGRycywgZmhhbmRsZTMgKm9ianApCit7CisJcmV0dXJuIHhkcl9ieXRlcyh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZmhhbmRsZTNfdmFsLAorCQkJICAgKHVuc2lnbmVkIGludCAqKSAmb2JqcC0+ZmhhbmRsZTNfbGVuLAorCQkJICAgRkhTSVpFMyk7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX21vdW50cmVzM19vayhYRFIgKnhkcnMsIG1vdW50cmVzM19vayAqb2JqcCkKK3sKKwlpZiAoIXhkcl9maGFuZGxlMyh4ZHJzLCAmb2JqcC0+ZmhhbmRsZSkpCisJCXJldHVybiBGQUxTRTsKKwlyZXR1cm4geGRyX2FycmF5KHhkcnMsICYob2JqcC0+YXV0aF9mbGF2b3Vycy5hdXRoX2ZsYXZvdXJzX3ZhbCksCisJCQkgICAmKG9ianAtPmF1dGhfZmxhdm91cnMuYXV0aF9mbGF2b3Vyc19sZW4pLAorCQkJICAgfjAsCisJCQkgICBzaXplb2YoaW50KSwKKwkJCSAgICh4ZHJwcm9jX3QpIHhkcl9pbnQpOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9tb3VudHN0YXQzKFhEUiAqeGRycywgbW91bnRzdGF0MyAqb2JqcCkKK3sKKwlyZXR1cm4geGRyX2VudW0oeGRycywgKGVudW1fdCAqKSBvYmpwKTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfbW91bnRyZXMzKFhEUiAqeGRycywgbW91bnRyZXMzICpvYmpwKQoreworCWlmICgheGRyX21vdW50c3RhdDMoeGRycywgJm9ianAtPmZoc19zdGF0dXMpKQorCQlyZXR1cm4gRkFMU0U7CisJaWYgKG9ianAtPmZoc19zdGF0dXMgPT0gTU5UX09LKQorCQlyZXR1cm4geGRyX21vdW50cmVzM19vayh4ZHJzLCAmb2JqcC0+bW91bnRyZXMzX3UubW91bnRpbmZvKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBNQVhfTkZTUFJPVCAoKG5mc19tb3VudF92ZXJzaW9uID49IDQpID8gMyA6IDIpCisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5LCB0aGUga2VybmVsIHByaW50cyBhbm5veWluZyBjb25zb2xlIG1lc3NhZ2VzCisgKiBpbiBjYXNlIG9mIGFuIHVuZXhwZWN0ZWQgbmZzIG1vdW50IHZlcnNpb24gKGluc3RlYWQgb2YKKyAqIGp1c3QgcmV0dXJuaW5nIHNvbWUgZXJyb3IpLiAgVGhlcmVmb3JlIHdlJ2xsIGhhdmUgdG8gdHJ5CisgKiBhbmQgZmlndXJlIG91dCB3aGF0IHZlcnNpb24gdGhlIGtlcm5lbCBleHBlY3RzLgorICoKKyAqIFZhcmlhYmxlczoKKyAqCUtFUk5FTF9ORlNfTU9VTlRfVkVSU0lPTjoga2VybmVsIHNvdXJjZXMgYXQgY29tcGlsZSB0aW1lCisgKglORlNfTU9VTlRfVkVSU0lPTjogdGhlc2UgbmZzbW91bnQgc291cmNlcyBhdCBjb21waWxlIHRpbWUKKyAqCW5mc19tb3VudF92ZXJzaW9uOiB2ZXJzaW9uIHRoaXMgc291cmNlIGFuZCBydW5uaW5nIGtlcm5lbCBjYW4gaGFuZGxlCisgKi8KK3N0YXRpYyB2b2lkCitmaW5kX2tlcm5lbF9uZnNfbW91bnRfdmVyc2lvbih2b2lkKQoreworCWludCBrZXJuZWxfdmVyc2lvbjsKKworCWlmIChuZnNfbW91bnRfdmVyc2lvbikKKwkJcmV0dXJuOworCisJbmZzX21vdW50X3ZlcnNpb24gPSA0OyAvKiBkZWZhdWx0ICovCisKKwlrZXJuZWxfdmVyc2lvbiA9IGdldF9saW51eF92ZXJzaW9uX2NvZGUoKTsKKwlpZiAoa2VybmVsX3ZlcnNpb24pIHsKKwkJaWYgKGtlcm5lbF92ZXJzaW9uIDwgS0VSTkVMX1ZFUlNJT04oMiwyLDE4KSkKKwkJCW5mc19tb3VudF92ZXJzaW9uID0gMzsKKwkJLyogZWxzZSB2NCBzaW5jZSAyLjMuOTlwcmU0ICovCisJfQorfQorCitzdGF0aWMgdm9pZAorZ2V0X21vdW50cG9ydChzdHJ1Y3QgcG1hcCAqcG1fbW50LAorCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2VydmVyX2FkZHIsCisJbG9uZyB1bnNpZ25lZCBwcm9nLAorCWxvbmcgdW5zaWduZWQgdmVyc2lvbiwKKwlsb25nIHVuc2lnbmVkIHByb3RvLAorCWxvbmcgdW5zaWduZWQgcG9ydCkKK3sKKwlzdHJ1Y3QgcG1hcGxpc3QgKnBtYXA7CisKKwlzZXJ2ZXJfYWRkci0+c2luX3BvcnQgPSBQTUFQUE9SVDsKKy8qIGdsaWJjIDIuNCAoc3RpbGwpIGhhcyBwbWFwX2dldG1hcHMoc3RydWN0IHNvY2thZGRyX2luICopLgorICogSSB1bmRlcnN0YW5kIGl0IGxpa2UgIklQdjYgZm9yIHRoaXMgaXMgbm90IDEwMCUgcmVhZHkiICovCisJcG1hcCA9IHBtYXBfZ2V0bWFwcyhzZXJ2ZXJfYWRkcik7CisKKwlpZiAodmVyc2lvbiA+IE1BWF9ORlNQUk9UKQorCQl2ZXJzaW9uID0gTUFYX05GU1BST1Q7CisJaWYgKCFwcm9nKQorCQlwcm9nID0gTU9VTlRQUk9HOworCXBtX21udC0+cG1fcHJvZyA9IHByb2c7CisJcG1fbW50LT5wbV92ZXJzID0gdmVyc2lvbjsKKwlwbV9tbnQtPnBtX3Byb3QgPSBwcm90bzsKKwlwbV9tbnQtPnBtX3BvcnQgPSBwb3J0OworCisJd2hpbGUgKHBtYXApIHsKKwkJaWYgKHBtYXAtPnBtbF9tYXAucG1fcHJvZyAhPSBwcm9nKQorCQkJZ290byBuZXh0OworCQlpZiAoIXZlcnNpb24gJiYgcG1fbW50LT5wbV92ZXJzID4gcG1hcC0+cG1sX21hcC5wbV92ZXJzKQorCQkJZ290byBuZXh0OworCQlpZiAodmVyc2lvbiA+IDIgJiYgcG1hcC0+cG1sX21hcC5wbV92ZXJzICE9IHZlcnNpb24pCisJCQlnb3RvIG5leHQ7CisJCWlmICh2ZXJzaW9uICYmIHZlcnNpb24gPD0gMiAmJiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiAyKQorCQkJZ290byBuZXh0OworCQlpZiAocG1hcC0+cG1sX21hcC5wbV92ZXJzID4gTUFYX05GU1BST1QKKwkJIHx8IChwcm90byAmJiBwbV9tbnQtPnBtX3Byb3QgJiYgcG1hcC0+cG1sX21hcC5wbV9wcm90ICE9IHByb3RvKQorCQkgfHwgKHBvcnQgJiYgcG1hcC0+cG1sX21hcC5wbV9wb3J0ICE9IHBvcnQpCisJCSkgeworCQkJZ290byBuZXh0OworCQl9CisJCW1lbWNweShwbV9tbnQsICZwbWFwLT5wbWxfbWFwLCBzaXplb2YoKnBtX21udCkpOworIG5leHQ6CisJCXBtYXAgPSBwbWFwLT5wbWxfbmV4dDsKKwl9CisJaWYgKCFwbV9tbnQtPnBtX3ZlcnMpCisJCXBtX21udC0+cG1fdmVycyA9IE1PVU5UVkVSUzsKKwlpZiAoIXBtX21udC0+cG1fcG9ydCkKKwkJcG1fbW50LT5wbV9wb3J0ID0gTU9VTlRQT1JUOworCWlmICghcG1fbW50LT5wbV9wcm90KQorCQlwbV9tbnQtPnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKK30KKworI2lmIEJCX01NVQorc3RhdGljIGludCBkYWVtb25pemUodm9pZCkKK3sKKwlpbnQgcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKSAvKiBlcnJvciAqLworCQlyZXR1cm4gLWVycm5vOworCWlmIChwaWQgPiAwKSAvKiBwYXJlbnQgKi8KKwkJcmV0dXJuIDA7CisJLyogY2hpbGQgKi8KKwljbG9zZSgwKTsKKwl4b3BlbihiYl9kZXZfbnVsbCwgT19SRFdSKTsKKwl4ZHVwMigwLCAxKTsKKwl4ZHVwMigwLCAyKTsKKwlzZXRzaWQoKTsKKwlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJcmV0dXJuIDE7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZGFlbW9uaXplKHZvaWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KKyNlbmRpZgorCisvKiBUT0RPICovCitzdGF0aWMgaW5saW5lIGludCB3ZV9zYXdfdGhpc19ob3N0X2JlZm9yZShjb25zdCBjaGFyICpob3N0bmFtZSBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJQQyBzdHJlcnJvciBhbmFsb2dzIGFyZSB0ZXJtaW5hbGx5IGlkaW90aWM6CisgKiAqbWFuZGF0b3J5KiBwcmVmaXggYW5kIFxuIGF0IGVuZC4KKyAqIFRoaXMgaG9wZWZ1bGx5IGhlbHBzLiBVc2FnZToKKyAqIGVycm9yX21zZ19ycGMoY2xudF8qZXJyb3IqKCIgIikpICovCitzdGF0aWMgdm9pZCBlcnJvcl9tc2dfcnBjKGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgbGVuOworCXdoaWxlIChtc2dbMF0gPT0gJyAnIHx8IG1zZ1swXSA9PSAnOicpIG1zZysrOworCWxlbiA9IHN0cmxlbihtc2cpOworCXdoaWxlIChsZW4gJiYgbXNnW2xlbi0xXSA9PSAnXG4nKSBsZW4tLTsKKwliYl9lcnJvcl9tc2coIiUuKnMiLCBsZW4sIG1zZyk7Cit9CisKKy8qIE5COiBtcC0+eHh4IGZpZWxkcyBtYXkgYmUgdHJhc2hlZCBvbiBleGl0ICovCitzdGF0aWMgTk9JTkxJTkUgaW50IG5mc21vdW50KHN0cnVjdCBtbnRlbnQgKm1wLCBsb25nIHZmc2ZsYWdzLCBjaGFyICpmaWx0ZXJvcHRzKQoreworCUNMSUVOVCAqbWNsaWVudDsKKwljaGFyICpob3N0bmFtZTsKKwljaGFyICpwYXRobmFtZTsKKwljaGFyICptb3VudGhvc3Q7CisJLyogcHJpb3IgdG8gMi42LjIzLCBrZXJuZWwgdG9vayBORlMgb3B0aW9ucyBpbiBhIGZvcm0gb2YgdGhpcyBzdHJ1Y3QKKwkgKiBvbmx5LiAyLjYuMjMrIGxvb2tzIGF0IGRhdGEtPnZlcnNpb24sIGFuZCBpZiBpdCdzIG5vdCAxLi42LAorCSAqIHRoZW4gZGF0YSBwb2ludGVyIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nLiAqLworCXN0cnVjdCBuZnNfbW91bnRfZGF0YSBkYXRhOworCWNoYXIgKm9wdDsKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcl9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiBtb3VudF9zZXJ2ZXJfYWRkcjsKKwlpbnQgbXNvY2ssIGZzb2NrOworCXVuaW9uIHsKKwkJc3RydWN0IGZoc3RhdHVzIG5mc3YyOworCQlzdHJ1Y3QgbW91bnRyZXMzIG5mc3YzOworCX0gc3RhdHVzOworCWludCBkYWVtb25pemVkOworCWNoYXIgKnM7CisJaW50IHBvcnQ7CisJaW50IG1vdW50cG9ydDsKKwlpbnQgcHJvdG87CisjaWYgQkJfTU1VCisJc21hbGxpbnQgYmcgPSAwOworI2Vsc2UKKwllbnVtIHsgYmcgPSAwIH07CisjZW5kaWYKKwlpbnQgcmV0cnk7CisJaW50IG1vdW50cHJvZzsKKwlpbnQgbW91bnR2ZXJzOworCWludCBuZnNwcm9nOworCWludCBuZnN2ZXJzOworCWludCByZXR2YWw7CisJLyogdGhlc2UgYWxsIGFyZSBvbmUtYml0IHJlYWxseS4gZ2NjIDQuMy4xIGxpa2VzIHRoaXMgY29tYmluYXRpb246ICovCisJc21hbGxpbnQgdGNwOworCXNtYWxsaW50IHNvZnQ7CisJaW50IGludHI7CisJaW50IHBvc2l4OworCWludCBub2N0bzsKKwlpbnQgbm9hYzsKKwlpbnQgbm9yZGlycGx1czsKKwlpbnQgbm9sb2NrOworCisJZmluZF9rZXJuZWxfbmZzX21vdW50X3ZlcnNpb24oKTsKKworCWRhZW1vbml6ZWQgPSAwOworCW1vdW50aG9zdCA9IE5VTEw7CisJcmV0dmFsID0gRVRJTUVET1VUOworCW1zb2NrID0gZnNvY2sgPSAtMTsKKwltY2xpZW50ID0gTlVMTDsKKworCS8qIE5COiBob3N0bmFtZSwgbW91bnRob3N0LCBmaWx0ZXJvcHRzIG11c3QgYmUgZnJlZSgpZCBwcmlvciB0byByZXR1cm4gKi8KKworCWZpbHRlcm9wdHMgPSB4c3RyZHVwKGZpbHRlcm9wdHMpOyAvKiBnb2luZyB0byB0cmFzaCBpdCBsYXRlci4uLiAqLworCisJaG9zdG5hbWUgPSB4c3RyZHVwKG1wLT5tbnRfZnNuYW1lKTsKKwkvKiBtb3VudF9tYWluKCkgZ3VhcmFudGVlcyB0aGF0ICc6JyBpcyB0aGVyZSAqLworCXMgPSBzdHJjaHIoaG9zdG5hbWUsICc6Jyk7CisJcGF0aG5hbWUgPSBzICsgMTsKKwkqcyA9ICdcMCc7CisJLyogSWdub3JlIGFsbCBidXQgZmlyc3QgaG9zdG5hbWUgaW4gcmVwbGljYXRlZCBtb3VudHMKKwkgICB1bnRpbCB0aGV5IGNhbiBiZSBmdWxseSBzdXBwb3J0ZWQuIChtYWNrQHNnaS5jb20pICovCisJcyA9IHN0cmNocihob3N0bmFtZSwgJywnKTsKKwlpZiAocykgeworCQkqcyA9ICdcMCc7CisJCWJiX2Vycm9yX21zZygid2FybmluZzogbXVsdGlwbGUgaG9zdG5hbWVzIG5vdCBzdXBwb3J0ZWQiKTsKKwl9CisKKwlzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpZiAoIWluZXRfYXRvbihob3N0bmFtZSwgJnNlcnZlcl9hZGRyLnNpbl9hZGRyKSkgeworCQlocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworCQlpZiAoaHAgPT0gTlVMTCkgeworCQkJYmJfaGVycm9yX21zZygiJXMiLCBob3N0bmFtZSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKGhwLT5oX2xlbmd0aCAhPSAoaW50KXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IElQdjQgaXMgc3VwcG9ydGVkIik7CisJCX0KKwkJbWVtY3B5KCZzZXJ2ZXJfYWRkci5zaW5fYWRkciwgaHAtPmhfYWRkcl9saXN0WzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwl9CisKKwltZW1jcHkoJm1vdW50X3NlcnZlcl9hZGRyLCAmc2VydmVyX2FkZHIsIHNpemVvZihtb3VudF9zZXJ2ZXJfYWRkcikpOworCisJLyogYWRkIElQIGFkZHJlc3MgdG8gbXRhYiBvcHRpb25zIGZvciB1c2Ugd2hlbiB1bm1vdW50aW5nICovCisKKwlpZiAoIW1wLT5tbnRfb3B0cykgeyAvKiBUT0RPOiBhY3R1YWxseSBtcC0+bW50X29wdHMgaXMgbmV2ZXIgTlVMTCAqLworCQltcC0+bW50X29wdHMgPSB4YXNwcmludGYoImFkZHI9JXMiLCBpbmV0X250b2Eoc2VydmVyX2FkZHIuc2luX2FkZHIpKTsKKwl9IGVsc2UgeworCQljaGFyICp0bXAgPSB4YXNwcmludGYoIiVzJXNhZGRyPSVzIiwgbXAtPm1udF9vcHRzLAorCQkJCQltcC0+bW50X29wdHNbMF0gPyAiLCIgOiAiIiwKKwkJCQkJaW5ldF9udG9hKHNlcnZlcl9hZGRyLnNpbl9hZGRyKSk7CisJCWZyZWUobXAtPm1udF9vcHRzKTsKKwkJbXAtPm1udF9vcHRzID0gdG1wOworCX0KKworCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMuCisJICogcnNpemUvd3NpemUgKGFuZCBic2l6ZSwgZm9yIHZlciA+PSAzKSBhcmUgbGVmdCAwIGluIG9yZGVyIHRvCisJICogbGV0IHRoZSBrZXJuZWwgZGVjaWRlLgorCSAqIHRpbWVvIGlzIGZpbGxlZCBpbiBhZnRlciB3ZSBrbm93IHdoZXRoZXIgaXQnbGwgYmUgVENQIG9yIFVEUC4gKi8KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS5yZXRyYW5zICA9IDM7CisJZGF0YS5hY3JlZ21pbiA9IDM7CisJZGF0YS5hY3JlZ21heCA9IDYwOworCWRhdGEuYWNkaXJtaW4gPSAzMDsKKwlkYXRhLmFjZGlybWF4ID0gNjA7CisJZGF0YS5uYW1sZW4gICA9IE5BTUVfTUFYOworCisJc29mdCA9IDA7CisJaW50ciA9IDA7CisJcG9zaXggPSAwOworCW5vY3RvID0gMDsKKwlub2xvY2sgPSAwOworCW5vYWMgPSAwOworCW5vcmRpcnBsdXMgPSAwOworCXJldHJ5ID0gMTAwMDA7CQkvKiAxMDAwMCBtaW51dGVzIH4gMSB3ZWVrICovCisJdGNwID0gMTsJCQkvKiBuZnMtdXRpbHMgdXNlcyB0Y3AgcGVyIGRlZmF1bHQgKi8KKworCW1vdW50cHJvZyA9IE1PVU5UUFJPRzsKKwltb3VudHZlcnMgPSAwOworCXBvcnQgPSAwOworCW1vdW50cG9ydCA9IDA7CisJbmZzcHJvZyA9IDEwMDAwMzsKKwluZnN2ZXJzID0gMDsKKworCS8qIHBhcnNlIG9wdGlvbnMgKi8KKwlpZiAoZmlsdGVyb3B0cykJZm9yIChvcHQgPSBzdHJ0b2soZmlsdGVyb3B0cywgIiwiKTsgb3B0OyBvcHQgPSBzdHJ0b2soTlVMTCwgIiwiKSkgeworCQljaGFyICpvcHRlcSA9IHN0cmNocihvcHQsICc9Jyk7CisJCWlmIChvcHRlcSkgeworCQkJaW50IHZhbCwgaWR4OworCQkJc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uc1tdIEFMSUdOMSA9CisJCQkJLyogMCAqLyAicnNpemVcMCIKKwkJCQkvKiAxICovICJ3c2l6ZVwwIgorCQkJCS8qIDIgKi8gInRpbWVvXDAiCisJCQkJLyogMyAqLyAicmV0cmFuc1wwIgorCQkJCS8qIDQgKi8gImFjcmVnbWluXDAiCisJCQkJLyogNSAqLyAiYWNyZWdtYXhcMCIKKwkJCQkvKiA2ICovICJhY2Rpcm1pblwwIgorCQkJCS8qIDcgKi8gImFjZGlybWF4XDAiCisJCQkJLyogOCAqLyAiYWN0aW1lb1wwIgorCQkJCS8qIDkgKi8gInJldHJ5XDAiCisJCQkJLyogMTAgKi8gInBvcnRcMCIKKwkJCQkvKiAxMSAqLyAibW91bnRwb3J0XDAiCisJCQkJLyogMTIgKi8gIm1vdW50aG9zdFwwIgorCQkJCS8qIDEzICovICJtb3VudHByb2dcMCIKKwkJCQkvKiAxNCAqLyAibW91bnR2ZXJzXDAiCisJCQkJLyogMTUgKi8gIm5mc3Byb2dcMCIKKwkJCQkvKiAxNiAqLyAibmZzdmVyc1wwIgorCQkJCS8qIDE3ICovICJ2ZXJzXDAiCisJCQkJLyogMTggKi8gInByb3RvXDAiCisJCQkJLyogMTkgKi8gIm5hbWxlblwwIgorCQkJCS8qIDIwICovICJhZGRyXDAiOworCisJCQkqb3B0ZXErKyA9ICdcMCc7CisJCQlpZHggPSBpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsIG9wdCk7CisJCQlzd2l0Y2ggKGlkeCkgeworCQkJY2FzZSAxMjogLy8gIm1vdW50aG9zdCIKKwkJCQltb3VudGhvc3QgPSB4c3RybmR1cChvcHRlcSwKKwkJCQkJCXN0cmNzcG4ob3B0ZXEsICIgXHRcblxyLCIpKTsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTg6IC8vICJwcm90byIKKwkJCQlpZiAoIXN0cm5jbXAob3B0ZXEsICJ0Y3AiLCAzKSkKKwkJCQkJdGNwID0gMTsKKwkJCQllbHNlIGlmICghc3RybmNtcChvcHRlcSwgInVkcCIsIDMpKQorCQkJCQl0Y3AgPSAwOworCQkJCWVsc2UKKwkJCQkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiB1bnJlY29nbml6ZWQgcHJvdG89IG9wdGlvbiIpOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAyMDogLy8gImFkZHIiIC0gaWdub3JlCisJCQkJY29udGludWU7CisJCQljYXNlIC0xOiAvLyB1bmtub3duCisJCQkJaWYgKHZmc2ZsYWdzICYgTVNfUkVNT1VOVCkKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCXZhbCA9IHhhdG9pX3Bvc2l0aXZlKG9wdGVxKTsKKwkJCXN3aXRjaCAoaWR4KSB7CisJCQljYXNlIDA6IC8vICJyc2l6ZSIKKwkJCQlkYXRhLnJzaXplID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxOiAvLyAid3NpemUiCisJCQkJZGF0YS53c2l6ZSA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMjogLy8gInRpbWVvIgorCQkJCWRhdGEudGltZW8gPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDM6IC8vICJyZXRyYW5zIgorCQkJCWRhdGEucmV0cmFucyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgNDogLy8gImFjcmVnbWluIgorCQkJCWRhdGEuYWNyZWdtaW4gPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDU6IC8vICJhY3JlZ21heCIKKwkJCQlkYXRhLmFjcmVnbWF4ID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSA2OiAvLyAiYWNkaXJtaW4iCisJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgNzogLy8gImFjZGlybWF4IgorCQkJCWRhdGEuYWNkaXJtYXggPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDg6IC8vICJhY3RpbWVvIgorCQkJCWRhdGEuYWNyZWdtaW4gPSB2YWw7CisJCQkJZGF0YS5hY3JlZ21heCA9IHZhbDsKKwkJCQlkYXRhLmFjZGlybWluID0gdmFsOworCQkJCWRhdGEuYWNkaXJtYXggPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDk6IC8vICJyZXRyeSIKKwkJCQlyZXRyeSA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTA6IC8vICJwb3J0IgorCQkJCXBvcnQgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDExOiAvLyAibW91bnRwb3J0IgorCQkJCW1vdW50cG9ydCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTM6IC8vICJtb3VudHByb2ciCisJCQkJbW91bnRwcm9nID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxNDogLy8gIm1vdW50dmVycyIKKwkJCQltb3VudHZlcnMgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE1OiAvLyAibmZzcHJvZyIKKwkJCQluZnNwcm9nID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxNjogLy8gIm5mc3ZlcnMiCisJCQljYXNlIDE3OiAvLyAidmVycyIKKwkJCQluZnN2ZXJzID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxOTogLy8gIm5hbWxlbiIKKwkJCQkvL2lmIChuZnNfbW91bnRfdmVyc2lvbiA+PSAyKQorCQkJCQlkYXRhLm5hbWxlbiA9IHZhbDsKKwkJCQkvL2Vsc2UKKwkJCQkvLwliYl9lcnJvcl9tc2coIndhcm5pbmc6IG9wdGlvbiBuYW1sZW4gaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJY29udGludWU7CisJCQlkZWZhdWx0OgorCQkJCWJiX2Vycm9yX21zZygidW5rbm93biBuZnMgbW91bnQgcGFyYW1ldGVyOiAlcz0lZCIsIG9wdCwgdmFsKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwkJZWxzZSB7IC8qIG5vdCBvZiB0aGUgZm9ybSBvcHQ9dmFsICovCisJCQlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0KKwkJCQkiYmdcMCIKKwkJCQkiZmdcMCIKKwkJCQkic29mdFwwIgorCQkJCSJoYXJkXDAiCisJCQkJImludHJcMCIKKwkJCQkicG9zaXhcMCIKKwkJCQkiY3RvXDAiCisJCQkJImFjXDAiCisJCQkJInRjcFwwIgorCQkJCSJ1ZHBcMCIKKwkJCQkibG9ja1wwIgorCQkJCSJyZGlycGx1c1wwIjsKKwkJCWludCB2YWwgPSAxOworCQkJaWYgKCFzdHJuY21wKG9wdCwgIm5vIiwgMikpIHsKKwkJCQl2YWwgPSAwOworCQkJCW9wdCArPSAyOworCQkJfQorCQkJc3dpdGNoIChpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsIG9wdCkpIHsKKwkJCWNhc2UgMDogLy8gImJnIgorI2lmIEJCX01NVQorCQkJCWJnID0gdmFsOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIDE6IC8vICJmZyIKKyNpZiBCQl9NTVUKKwkJCQliZyA9ICF2YWw7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgMjogLy8gInNvZnQiCisJCQkJc29mdCA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzogLy8gImhhcmQiCisJCQkJc29mdCA9ICF2YWw7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IC8vICJpbnRyIgorCQkJCWludHIgPSB2YWw7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6IC8vICJwb3NpeCIKKwkJCQlwb3NpeCA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjogLy8gImN0byIKKwkJCQlub2N0byA9ICF2YWw7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6IC8vICJhYyIKKwkJCQlub2FjID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgODogLy8gInRjcCIKKwkJCQl0Y3AgPSB2YWw7CisJCQkJYnJlYWs7CisJCQljYXNlIDk6IC8vICJ1ZHAiCisJCQkJdGNwID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6IC8vICJsb2NrIgorCQkJCWlmIChuZnNfbW91bnRfdmVyc2lvbiA+PSAzKQorCQkJCQlub2xvY2sgPSAhdmFsOworCQkJCWVsc2UKKwkJCQkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBvcHRpb24gbm9sb2NrIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6IC8vcmRpcnBsdXMKKwkJCQlub3JkaXJwbHVzID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIG5mcyBtb3VudCBvcHRpb246ICVzJXMiLCB2YWwgPyAiIiA6ICJubyIsIG9wdCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisJfQorCXByb3RvID0gKHRjcCkgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQOworCisJZGF0YS5mbGFncyA9IChzb2Z0ID8gTkZTX01PVU5UX1NPRlQgOiAwKQorCQl8IChpbnRyID8gTkZTX01PVU5UX0lOVFIgOiAwKQorCQl8IChwb3NpeCA/IE5GU19NT1VOVF9QT1NJWCA6IDApCisJCXwgKG5vY3RvID8gTkZTX01PVU5UX05PQ1RPIDogMCkKKwkJfCAobm9hYyA/IE5GU19NT1VOVF9OT0FDIDogMCkKKwkJfCAobm9yZGlycGx1cyA/IE5GU19NT1VOVF9OT1JESVJQTFVTIDogMCk7CisJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDIpCisJCWRhdGEuZmxhZ3MgfD0gKHRjcCA/IE5GU19NT1VOVF9UQ1AgOiAwKTsKKwlpZiAobmZzX21vdW50X3ZlcnNpb24gPj0gMykKKwkJZGF0YS5mbGFncyB8PSAobm9sb2NrID8gTkZTX01PVU5UX05PTkxNIDogMCk7CisJaWYgKG5mc3ZlcnMgPiBNQVhfTkZTUFJPVCB8fCBtb3VudHZlcnMgPiBNQVhfTkZTUFJPVCkgeworCQliYl9lcnJvcl9tc2coIk5GU3YlZCBub3Qgc3VwcG9ydGVkIiwgbmZzdmVycyk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKG5mc3ZlcnMgJiYgIW1vdW50dmVycykKKwkJbW91bnR2ZXJzID0gKG5mc3ZlcnMgPCAzKSA/IDEgOiBuZnN2ZXJzOworCWlmIChuZnN2ZXJzICYmIG5mc3ZlcnMgPCBtb3VudHZlcnMpIHsKKwkJbW91bnR2ZXJzID0gbmZzdmVyczsKKwl9CisKKwkvKiBBZGp1c3Qgb3B0aW9ucyBpZiBub25lIHNwZWNpZmllZCAqLworCWlmICghZGF0YS50aW1lbykKKwkJZGF0YS50aW1lbyA9IHRjcCA/IDcwIDogNzsKKworCWRhdGEudmVyc2lvbiA9IG5mc19tb3VudF92ZXJzaW9uOworCisJaWYgKHZmc2ZsYWdzICYgTVNfUkVNT1VOVCkKKwkJZ290byBkb19tb3VudDsKKworCS8qCisJICogSWYgdGhlIHByZXZpb3VzIG1vdW50IG9wZXJhdGlvbiBvbiB0aGUgc2FtZSBob3N0IHdhcworCSAqIGJhY2tncm91bmRlZCwgYW5kIHRoZSAiYmciIGZvciB0aGlzIG1vdW50IGlzIGFsc28gc2V0LAorCSAqIGdpdmUgdXAgaW1tZWRpYXRlbHksIHRvIGF2b2lkIHRoZSBpbml0aWFsIHRpbWVvdXQuCisJICovCisJaWYgKGJnICYmIHdlX3Nhd190aGlzX2hvc3RfYmVmb3JlKGhvc3RuYW1lKSkgeworCQlkYWVtb25pemVkID0gZGFlbW9uaXplKCk7CisJCWlmIChkYWVtb25pemVkIDw9IDApIHsgLyogcGFyZW50IG9yIGVycm9yICovCisJCQlyZXR2YWwgPSAtZGFlbW9uaXplZDsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorCisJLyogQ3JlYXRlIG1vdW50IGRhZW1vbiBjbGllbnQgKi8KKwkvKiBTZWUgaWYgdGhlIG5mcyBob3N0ID0gbW91bnQgaG9zdC4gKi8KKwlpZiAobW91bnRob3N0KSB7CisJCWlmIChtb3VudGhvc3RbMF0gPj0gJzAnICYmIG1vdW50aG9zdFswXSA8PSAnOScpIHsKKwkJCW1vdW50X3NlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJbW91bnRfc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGhvc3RuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWhwID0gZ2V0aG9zdGJ5bmFtZShtb3VudGhvc3QpOworCQkJaWYgKGhwID09IE5VTEwpIHsKKwkJCQliYl9oZXJyb3JfbXNnKCIlcyIsIG1vdW50aG9zdCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJaWYgKGhwLT5oX2xlbmd0aCAhPSAoaW50KXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib25seSBJUHY0IGlzIHN1cHBvcnRlZCIpOworCQkJfQorCQkJbW91bnRfc2VydmVyX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQltZW1jcHkoJm1vdW50X3NlcnZlcl9hZGRyLnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGxvb3AgaW1wbGVtZW50cyB0aGUgbW91bnQgcmV0cmllcy4gV2hlbiB0aGUgbW91bnQKKwkgKiB0aW1lcyBvdXQsIGFuZCB0aGUgImJnIiBvcHRpb24gaXMgc2V0LCB3ZSBiYWNrZ3JvdW5kIG91cnNlbGYKKwkgKiBhbmQgY29udGludWUgdHJ5aW5nLgorCSAqCisJICogVGhlIGNhc2Ugd2hlcmUgdGhlIG1vdW50IHBvaW50IGlzIG5vdCBwcmVzZW50IGFuZCB0aGUgImJnIgorCSAqIG9wdGlvbiBpcyBzZXQsIGlzIHRyZWF0ZWQgYXMgYSB0aW1lb3V0LiBUaGlzIGlzIGRvbmUgdG8KKwkgKiBzdXBwb3J0IG5lc3RlZCBtb3VudHMuCisJICoKKwkgKiBUaGUgInJldHJ5IiBjb3VudCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaXMgdGhlIG51bWJlciBvZgorCSAqIG1pbnV0ZXMgdG8gcmV0cnkgYmVmb3JlIGdpdmluZyB1cC4KKwkgKi8KKwl7CisJCXN0cnVjdCB0aW1ldmFsIHRvdGFsX3RpbWVvdXQ7CisJCXN0cnVjdCB0aW1ldmFsIHJldHJ5X3RpbWVvdXQ7CisJCXN0cnVjdCBwbWFwIHBtX21udDsKKwkJdGltZV90IHQ7CisJCXRpbWVfdCBwcmV2dDsKKwkJdGltZV90IHRpbWVvdXQ7CisKKwkJcmV0cnlfdGltZW91dC50dl9zZWMgPSAzOworCQlyZXRyeV90aW1lb3V0LnR2X3VzZWMgPSAwOworCQl0b3RhbF90aW1lb3V0LnR2X3NlYyA9IDIwOworCQl0b3RhbF90aW1lb3V0LnR2X3VzZWMgPSAwOworLyogRklYTUU6IHVzZSBtb25vdG9uaWMoKT8gKi8KKwkJdGltZW91dCA9IHRpbWUoTlVMTCkgKyA2MCAqIHJldHJ5OworCQlwcmV2dCA9IDA7CisJCXQgPSAzMDsKKyByZXRyeToKKwkJLyogQmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRvbyBtYW55IENQVSBjeWNsZXMgKi8KKwkJaWYgKHQgLSBwcmV2dCA8IDMwKQorCQkJc2xlZXAoMzApOworCisJCWdldF9tb3VudHBvcnQoJnBtX21udCwgJm1vdW50X3NlcnZlcl9hZGRyLAorCQkJCW1vdW50cHJvZywKKwkJCQltb3VudHZlcnMsCisJCQkJcHJvdG8sCisJCQkJbW91bnRwb3J0KTsKKwkJbmZzdmVycyA9IChwbV9tbnQucG1fdmVycyA8IDIpID8gMiA6IHBtX21udC5wbV92ZXJzOworCisJCS8qIGNvbnRhY3QgdGhlIG1vdW50IGRhZW1vbiB2aWEgVENQICovCisJCW1vdW50X3NlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG1fbW50LnBtX3BvcnQpOworCQltc29jayA9IFJQQ19BTllTT0NLOworCisJCXN3aXRjaCAocG1fbW50LnBtX3Byb3QpIHsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCW1jbGllbnQgPSBjbG50dWRwX2NyZWF0ZSgmbW91bnRfc2VydmVyX2FkZHIsCisJCQkJCQkgcG1fbW50LnBtX3Byb2csCisJCQkJCQkgcG1fbW50LnBtX3ZlcnMsCisJCQkJCQkgcmV0cnlfdGltZW91dCwKKwkJCQkJCSAmbXNvY2spOworCQkJaWYgKG1jbGllbnQpCisJCQkJYnJlYWs7CisJCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBtX21udC5wbV9wb3J0KTsKKwkJCW1zb2NrID0gUlBDX0FOWVNPQ0s7CisJCWNhc2UgSVBQUk9UT19UQ1A6CisJCQltY2xpZW50ID0gY2xudHRjcF9jcmVhdGUoJm1vdW50X3NlcnZlcl9hZGRyLAorCQkJCQkJIHBtX21udC5wbV9wcm9nLAorCQkJCQkJIHBtX21udC5wbV92ZXJzLAorCQkJCQkJICZtc29jaywgMCwgMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1jbGllbnQgPSBOVUxMOworCQl9CisJCWlmICghbWNsaWVudCkgeworCQkJaWYgKCFkYWVtb25pemVkICYmIHByZXZ0ID09IDApCisJCQkJZXJyb3JfbXNnX3JwYyhjbG50X3NwY3JlYXRlZXJyb3IoIiAiKSk7CisJCX0gZWxzZSB7CisJCQllbnVtIGNsbnRfc3RhdCBjbG50X3N0YXQ7CisKKwkJCS8qIFRyeSB0byBtb3VudCBob3N0bmFtZTpwYXRobmFtZSAqLworCQkJbWNsaWVudC0+Y2xfYXV0aCA9IGF1dGh1bml4X2NyZWF0ZV9kZWZhdWx0KCk7CisKKwkJCS8qIE1ha2UgcG9pbnRlcnMgaW4geGRyX21vdW50cmVzMyBOVUxMIHNvCisJCQkgKiB0aGF0IHhkcl9hcnJheSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB1cworCQkJICovCisJCQltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCisJCQlpZiAocG1fbW50LnBtX3ZlcnMgPT0gMykKKwkJCQljbG50X3N0YXQgPSBjbG50X2NhbGwobWNsaWVudCwgTU9VTlRQUk9DM19NTlQsCisJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLAorCQkJCQkgICAgICAoY2FkZHJfdCkgJnBhdGhuYW1lLAorCQkJCQkgICAgICAoeGRycHJvY190KSB4ZHJfbW91bnRyZXMzLAorCQkJCQkgICAgICAoY2FkZHJfdCkgJnN0YXR1cywKKwkJCQkJICAgICAgdG90YWxfdGltZW91dCk7CisJCQllbHNlCisJCQkJY2xudF9zdGF0ID0gY2xudF9jYWxsKG1jbGllbnQsIE1PVU5UUFJPQ19NTlQsCisJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLAorCQkJCQkgICAgICAoY2FkZHJfdCkgJnBhdGhuYW1lLAorCQkJCQkgICAgICAoeGRycHJvY190KSB4ZHJfZmhzdGF0dXMsCisJCQkJCSAgICAgIChjYWRkcl90KSAmc3RhdHVzLAorCQkJCQkgICAgICB0b3RhbF90aW1lb3V0KTsKKworCQkJaWYgKGNsbnRfc3RhdCA9PSBSUENfU1VDQ0VTUykKKwkJCQlnb3RvIHByZXBhcmVfa2VybmVsX2RhdGE7IC8qIHdlJ3JlIGRvbmUgKi8KKwkJCWlmIChlcnJubyAhPSBFQ09OTlJFRlVTRUQpIHsKKwkJCQllcnJvcl9tc2dfcnBjKGNsbnRfc3BlcnJvcihtY2xpZW50LCAiICIpKTsKKwkJCQlnb3RvIGZhaWw7CS8qIGRvbid0IHJldHJ5ICovCisJCQl9CisJCQkvKiBDb25uZWN0aW9uIHJlZnVzZWQgKi8KKwkJCWlmICghZGFlbW9uaXplZCAmJiBwcmV2dCA9PSAwKSAvKiBwcmludCBqdXN0IG9uY2UgKi8KKwkJCQllcnJvcl9tc2dfcnBjKGNsbnRfc3BlcnJvcihtY2xpZW50LCAiICIpKTsKKwkJCWF1dGhfZGVzdHJveShtY2xpZW50LT5jbF9hdXRoKTsKKwkJCWNsbnRfZGVzdHJveShtY2xpZW50KTsKKwkJCW1jbGllbnQgPSBOVUxMOworCQkJY2xvc2UobXNvY2spOworCQkJbXNvY2sgPSAtMTsKKwkJfQorCisJCS8qIFRpbWVvdXQuIFdlIGFyZSBnb2luZyB0byByZXRyeS4uLiBtYXliZSAqLworCQlpZiAoIWJnKQorCQkJZ290byBmYWlsOworCQlpZiAoIWRhZW1vbml6ZWQpIHsKKwkJCWRhZW1vbml6ZWQgPSBkYWVtb25pemUoKTsKKwkJCWlmIChkYWVtb25pemVkIDw9IDApIHsgLyogcGFyZW50IG9yIGVycm9yICovCisJCQkJcmV0dmFsID0gLWRhZW1vbml6ZWQ7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKwkJcHJldnQgPSB0OworCQl0ID0gdGltZShOVUxMKTsKKwkJaWYgKHQgPj0gdGltZW91dCkKKwkJCS8qIFRPRE8gZXJyb3IgbWVzc2FnZSAqLworCQkJZ290byBmYWlsOworCisJCWdvdG8gcmV0cnk7CisJfQorCisgcHJlcGFyZV9rZXJuZWxfZGF0YToKKworCWlmIChuZnN2ZXJzID09IDIpIHsKKwkJaWYgKHN0YXR1cy5uZnN2Mi5maHNfc3RhdHVzICE9IDApIHsKKwkJCWJiX2Vycm9yX21zZygiJXM6JXMgZmFpbGVkLCByZWFzb24gZ2l2ZW4gYnkgc2VydmVyOiAlcyIsCisJCQkJaG9zdG5hbWUsIHBhdGhuYW1lLAorCQkJCW5mc19zdHJlcnJvcihzdGF0dXMubmZzdjIuZmhzX3N0YXR1cykpOworCQkJZ290byBmYWlsOworCQl9CisJCW1lbWNweShkYXRhLnJvb3QuZGF0YSwKKwkJCQkoY2hhciAqKSBzdGF0dXMubmZzdjIuZmhzdGF0dXNfdS5maHNfZmhhbmRsZSwKKwkJCQlORlNfRkhTSVpFKTsKKwkJZGF0YS5yb290LnNpemUgPSBORlNfRkhTSVpFOworCQltZW1jcHkoZGF0YS5vbGRfcm9vdC5kYXRhLAorCQkJCShjaGFyICopIHN0YXR1cy5uZnN2Mi5maHN0YXR1c191LmZoc19maGFuZGxlLAorCQkJCU5GU19GSFNJWkUpOworCX0gZWxzZSB7CisJCWZoYW5kbGUzICpteV9maGFuZGxlOworCQlpZiAoc3RhdHVzLm5mc3YzLmZoc19zdGF0dXMgIT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCIlczolcyBmYWlsZWQsIHJlYXNvbiBnaXZlbiBieSBzZXJ2ZXI6ICVzIiwKKwkJCQlob3N0bmFtZSwgcGF0aG5hbWUsCisJCQkJbmZzX3N0cmVycm9yKHN0YXR1cy5uZnN2My5maHNfc3RhdHVzKSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbXlfZmhhbmRsZSA9ICZzdGF0dXMubmZzdjMubW91bnRyZXMzX3UubW91bnRpbmZvLmZoYW5kbGU7CisJCW1lbXNldChkYXRhLm9sZF9yb290LmRhdGEsIDAsIE5GU19GSFNJWkUpOworCQltZW1zZXQoJmRhdGEucm9vdCwgMCwgc2l6ZW9mKGRhdGEucm9vdCkpOworCQlkYXRhLnJvb3Quc2l6ZSA9IG15X2ZoYW5kbGUtPmZoYW5kbGUzX2xlbjsKKwkJbWVtY3B5KGRhdGEucm9vdC5kYXRhLAorCQkJCShjaGFyICopIG15X2ZoYW5kbGUtPmZoYW5kbGUzX3ZhbCwKKwkJCQlteV9maGFuZGxlLT5maGFuZGxlM19sZW4pOworCisJCWRhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1ZFUjM7CisJfQorCisJLyogQ3JlYXRlIG5mcyBzb2NrZXQgZm9yIGtlcm5lbCAqLworCWlmICh0Y3ApIHsKKwkJaWYgKG5mc19tb3VudF92ZXJzaW9uIDwgMykgeworCQkJYmJfZXJyb3JfbXNnKCJORlMgb3ZlciBUQ1AgaXMgbm90IHN1cHBvcnRlZCIpOworCQkJZ290byBmYWlsOworCQl9CisJCWZzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJfSBlbHNlCisJCWZzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoZnNvY2sgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIm5mcyBzb2NrZXQiKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoYmluZHJlc3Zwb3J0KGZzb2NrLCAwKSA8IDApIHsKKwkJYmJfcGVycm9yX21zZygibmZzIGJpbmRyZXN2cG9ydCIpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChwb3J0ID09IDApIHsKKwkJc2VydmVyX2FkZHIuc2luX3BvcnQgPSBQTUFQUE9SVDsKKwkJcG9ydCA9IHBtYXBfZ2V0cG9ydCgmc2VydmVyX2FkZHIsIG5mc3Byb2csIG5mc3ZlcnMsCisJCQkJCXRjcCA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFApOworCQlpZiAocG9ydCA9PSAwKQorCQkJcG9ydCA9IE5GU19QT1JUOworCX0KKwlzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisJLyogUHJlcGFyZSBkYXRhIHN0cnVjdHVyZSBmb3Iga2VybmVsICovCisJZGF0YS5mZCA9IGZzb2NrOworCW1lbWNweSgoY2hhciAqKSAmZGF0YS5hZGRyLCAoY2hhciAqKSAmc2VydmVyX2FkZHIsIHNpemVvZihkYXRhLmFkZHIpKTsKKwlzdHJuY3B5KGRhdGEuaG9zdG5hbWUsIGhvc3RuYW1lLCBzaXplb2YoZGF0YS5ob3N0bmFtZSkpOworCisJLyogQ2xlYW4gdXAgKi8KKwlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CisJY2xudF9kZXN0cm95KG1jbGllbnQpOworCWNsb3NlKG1zb2NrKTsKKwltc29jayA9IC0xOworCisJaWYgKGJnKSB7CisJCS8qIFdlIG11c3Qgd2FpdCB1bnRpbCBtb3VudCBkaXJlY3RvcnkgaXMgYXZhaWxhYmxlICovCisJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJCWludCBkZWxheSA9IDE7CisJCXdoaWxlIChzdGF0KG1wLT5tbnRfZGlyLCAmc3RhdGJ1ZikgPT0gLTEpIHsKKwkJCWlmICghZGFlbW9uaXplZCkgeworCQkJCWRhZW1vbml6ZWQgPSBkYWVtb25pemUoKTsKKwkJCQlpZiAoZGFlbW9uaXplZCA8PSAwKSB7IC8qIHBhcmVudCBvciBlcnJvciAqLworLyogRklYTUU6IHBhcmVudCBkb2Vzbid0IGNsb3NlIGZzb2NrIC0gPz8hICovCisJCQkJCXJldHZhbCA9IC1kYWVtb25pemVkOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQl9CisJCQlzbGVlcChkZWxheSk7CS8qIDEsIDIsIDQsIDgsIDE2LCAzMCwgLi4uICovCisJCQlkZWxheSAqPSAyOworCQkJaWYgKGRlbGF5ID4gMzApCisJCQkJZGVsYXkgPSAzMDsKKwkJfQorCX0KKworCS8qIFBlcmZvcm0gYWN0dWFsIG1vdW50ICovCisgZG9fbW91bnQ6CisJbXAtPm1udF90eXBlID0gKGNoYXIqKSJuZnMiOworCXJldHZhbCA9IG1vdW50X2l0X25vdyhtcCwgdmZzZmxhZ3MsIChjaGFyKikmZGF0YSk7CisJZ290byByZXQ7CisKKwkvKiBBYm9ydCAqLworIGZhaWw6CisJaWYgKG1zb2NrID49IDApIHsKKwkJaWYgKG1jbGllbnQpIHsKKwkJCWF1dGhfZGVzdHJveShtY2xpZW50LT5jbF9hdXRoKTsKKwkJCWNsbnRfZGVzdHJveShtY2xpZW50KTsKKwkJfQorCQljbG9zZShtc29jayk7CisJfQorCWlmIChmc29jayA+PSAwKQorCQljbG9zZShmc29jayk7CisKKyByZXQ6CisJZnJlZShob3N0bmFtZSk7CisJZnJlZShtb3VudGhvc3QpOworCWZyZWUoZmlsdGVyb3B0cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UgLy8gIUVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworCisvLyBOZXZlciBjYWxsZWQuIENhbGwgc2hvdWxkIGJlIG9wdGltaXplZCBvdXQuCitpbnQgbmZzbW91bnQoc3RydWN0IG1udGVudCAqbXAsIGxvbmcgdmZzZmxhZ3MsIGNoYXIgKmZpbHRlcm9wdHMpOworCisjZW5kaWYgLy8gIUVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworCisvLyBNb3VudCBvbmUgZGlyZWN0b3J5LiAgSGFuZGxlcyBDSUZTLCBORlMsIGxvb3BiYWNrLCBhdXRvYmluZCwgYW5kIGZpbGVzeXN0ZW0KKy8vIHR5cGUgZGV0ZWN0aW9uLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlLgorLy8gTkI6IG1wLT54eHggZmllbGRzIG1heSBiZSB0cmFzaGVkIG9uIGV4aXQKK3N0YXRpYyBpbnQgc2luZ2xlbW91bnQoc3RydWN0IG1udGVudCAqbXAsIGludCBpZ25vcmVfYnVzeSkKK3sKKwlpbnQgcmMgPSAtMTsKKwlsb25nIHZmc2ZsYWdzOworCWNoYXIgKmxvb3BGaWxlID0gTlVMTCwgKmZpbHRlcm9wdHMgPSBOVUxMOworCWxsaXN0X3QgKmZsID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWVycm5vID0gMDsKKworCXZmc2ZsYWdzID0gcGFyc2VfbW91bnRfb3B0aW9ucyhtcC0+bW50X29wdHMsICZmaWx0ZXJvcHRzKTsKKworCS8vIFRyZWF0IGZzdHlwZSAiYXV0byIgYXMgdW5zcGVjaWZpZWQKKwlpZiAobXAtPm1udF90eXBlICYmIHN0cmNtcChtcC0+bW50X3R5cGUsICJhdXRvIikgPT0gMCkKKwkJbXAtPm1udF90eXBlID0gTlVMTDsKKworCS8vIE1pZ2h0IHRoaXMgYmUgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0/CisJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0hFTFBFUlMgJiYgc3RyY2hyKG1wLT5tbnRfZnNuYW1lLCAnIycpKSB7CisJCWNoYXIgKmFyZ3NbMzVdOworCQljaGFyICpzOworCQlpbnQgbjsKKwkJLy8gZnNuYW1lOiAiY21kI2FyZzEjYXJnMi4uLiIKKwkJLy8gV0FSTklORzogYWxsb3dzIGV4ZWN1dGlvbiBvZiBhcmJpdHJhcnkgY29tbWFuZHMhCisJCS8vIFRyeSAibW91bnQgJ3NoIy1jI3NoJyBib2d1c19kaXIiLgorCQkvLyBJdCBpcyBzYWZlIE9OTFkgYmVjYXVzZSBub24tcm9vdAorCQkvLyBjYW5ub3QgdXNlIHR3by1hcmd1bWVudCBtb3VudCBjb21tYW5kCisJCS8vIGFuZCB1c2luZyBvbmUtYXJndW1lbnQgIm1vdW50ICdzaCMtYyNzaCciIGRvZXNuJ3Qgd29yazoKKwkJLy8gIm1vdW50OiBjYW4ndCBmaW5kIHNoIy1jI3NoIGluIC9ldGMvZnN0YWIiCisJCS8vIChpZiAvZXRjL2ZzdGFiIGhhcyBpdCwgaXQncyBvazogcm9vdCBzZXRzIHVwIC9ldGMvZnN0YWIpLgorCisJCXMgPSBtcC0+bW50X2ZzbmFtZTsKKwkJbiA9IDA7CisJCWFyZ3NbbisrXSA9IHM7CisJCXdoaWxlICgqcyAmJiBuIDwgMzUgLSAyKSB7CisJCQlpZiAoKnMrKyA9PSAnIycgJiYgKnMgIT0gJyMnKSB7CisJCQkJc1stMV0gPSAnXDAnOworCQkJCWFyZ3NbbisrXSA9IHM7CisJCQl9CisJCX0KKwkJYXJnc1tuKytdID0gbXAtPm1udF9kaXI7CisJCWFyZ3Nbbl0gPSBOVUxMOworCQlyYyA9IHNwYXduX2FuZF93YWl0KGFyZ3MpOworCQlnb3RvIHJlcG9ydF9lcnJvcjsKKwl9CisKKwkvLyBNaWdodCB0aGlzIGJlIGFuIENJRlMgZmlsZXN5c3RlbT8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfQ0lGUworCSAmJiAoIW1wLT5tbnRfdHlwZSB8fCBzdHJjbXAobXAtPm1udF90eXBlLCAiY2lmcyIpID09IDApCisJICYmIChtcC0+bW50X2ZzbmFtZVswXSA9PSAnLycgfHwgbXAtPm1udF9mc25hbWVbMF0gPT0gJ1xcJykKKwkgJiYgbXAtPm1udF9mc25hbWVbMF0gPT0gbXAtPm1udF9mc25hbWVbMV0KKwkpIHsKKwkJaW50IGxlbjsKKwkJY2hhciBjOworCQlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJCWNoYXIgKmhvc3RuYW1lLCAqZG90dGVkLCAqaXA7CisKKwkJaG9zdG5hbWUgPSBtcC0+bW50X2ZzbmFtZSArIDI7CisJCWxlbiA9IHN0cmNzcG4oaG9zdG5hbWUsICIvXFwiKTsKKwkJaWYgKGxlbiA9PSAwIHx8IGhvc3RuYW1lW2xlbl0gPT0gJ1wwJykKKwkJCWdvdG8gcmVwb3J0X2Vycm9yOworCQljID0gaG9zdG5hbWVbbGVuXTsKKwkJaG9zdG5hbWVbbGVuXSA9ICdcMCc7CisJCWxzYSA9IGhvc3Qyc29ja2FkZHIoaG9zdG5hbWUsIDApOworCQlob3N0bmFtZVtsZW5dID0gYzsKKwkJaWYgKCFsc2EpCisJCQlnb3RvIHJlcG9ydF9lcnJvcjsKKworCQkvLyBJbnNlcnQgImlwPS4uLiIgb3B0aW9uIGludG8gb3B0aW9ucworCQlkb3R0ZWQgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJmxzYS0+dS5zYSk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShsc2EpOworCQlpcCA9IHhhc3ByaW50ZigiaXA9JXMiLCBkb3R0ZWQpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZG90dGVkKTsKKwkJcGFyc2VfbW91bnRfb3B0aW9ucyhpcCwgJmZpbHRlcm9wdHMpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoaXApOworCisJCS8vICItbyBtYW5kIiBpcyByZXF1aXJlZCBbd2h5P10KKwkJdmZzZmxhZ3MgfD0gTVNfTUFORExPQ0s7CisJCW1wLT5tbnRfdHlwZSA9IChjaGFyKikiY2lmcyI7CisJCXJjID0gbW91bnRfaXRfbm93KG1wLCB2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisKKwkJZ290byByZXBvcnRfZXJyb3I7CisJfQorCisJLy8gTWlnaHQgdGhpcyBiZSBhbiBORlMgZmlsZXN5c3RlbT8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisJICYmICghbXAtPm1udF90eXBlIHx8IHN0cmNtcChtcC0+bW50X3R5cGUsICJuZnMiKSA9PSAwKQorCSAmJiBzdHJjaHIobXAtPm1udF9mc25hbWUsICc6JykgIT0gTlVMTAorCSkgeworCQlyYyA9IG5mc21vdW50KG1wLCB2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisJCWdvdG8gcmVwb3J0X2Vycm9yOworCX0KKworCS8vIExvb2sgYXQgdGhlIGZpbGUuICAoTm90IGZvdW5kIGlzbid0IGEgZmFpbHVyZSBmb3IgcmVtb3VudCwgb3IgZm9yCisJLy8gYSBzeW50aGV0aWMgZmlsZXN5c3RlbSBsaWtlIHByb2Mgb3Igc3lzZnMuKQorCS8vIChXZSB1c2Ugc3RhdCwgbm90IGxzdGF0LCBpbiBvcmRlciB0byBhbGxvdworCS8vIG1vdW50IHN5bWxpbmtfdG9fZmlsZV9vcl9ibGtkZXYgZGlyKQorCWlmICghc3RhdChtcC0+bW50X2ZzbmFtZSwgJnN0KQorCSAmJiAhKHZmc2ZsYWdzICYgKE1TX1JFTU9VTlQgfCBNU19CSU5EIHwgTVNfTU9WRSkpCisJKSB7CisJCS8vIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBsb29wYmFjayBkZXZpY2UgZm9yIGl0PworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTE9PUCAmJiBTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCQlsb29wRmlsZSA9IGJiX3NpbXBsaWZ5X3BhdGgobXAtPm1udF9mc25hbWUpOworCQkJbXAtPm1udF9mc25hbWUgPSBOVUxMOyAvLyB3aWxsIHJlY2VpdmUgbWFsbG9jZWQgbG9vcCBkZXYgbmFtZQorCQkJaWYgKHNldF9sb29wKCZtcC0+bW50X2ZzbmFtZSwgbG9vcEZpbGUsIDApIDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpCisJCQkJCWJiX2Vycm9yX21zZyhiYl9tc2dfcGVybV9kZW5pZWRfYXJlX3lvdV9yb290KTsKKwkJCQllbHNlCisJCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHNldHVwIGxvb3AgZGV2aWNlIik7CisJCQkJcmV0dXJuIGVycm5vOworCQkJfQorCisJCS8vIEF1dG9kZXRlY3QgYmluZCBtb3VudHMKKwkJfSBlbHNlIGlmIChTX0lTRElSKHN0LnN0X21vZGUpICYmICFtcC0+bW50X3R5cGUpCisJCQl2ZnNmbGFncyB8PSBNU19CSU5EOworCX0KKworCS8vIElmIHdlIGtub3cgdGhlIGZzdHlwZSAob3IgZG9uJ3QgbmVlZCB0byksIGp1bXAgc3RyYWlnaHQKKwkvLyB0byB0aGUgYWN0dWFsIG1vdW50LgorCWlmIChtcC0+bW50X3R5cGUgfHwgKHZmc2ZsYWdzICYgKE1TX1JFTU9VTlQgfCBNU19CSU5EIHwgTVNfTU9WRSkpKSB7CisJCXJjID0gbW91bnRfaXRfbm93KG1wLCB2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisJfSBlbHNlIHsKKwkJLy8gTG9vcCB0aHJvdWdoIGZpbGVzeXN0ZW0gdHlwZXMgdW50aWwgbW91bnQgc3VjY2VlZHMKKwkJLy8gb3Igd2UgcnVuIG91dAorCisJCS8vIEluaXRpYWxpemUgbGlzdCBvZiBibG9jayBiYWNrZWQgZmlsZXN5c3RlbXMuCisJCS8vIFRoaXMgaGFzIHRvIGJlIGRvbmUgaGVyZSBzbyB0aGF0IGR1cmluZyAibW91bnQgLWEiLAorCQkvLyBtb3VudHMgYWZ0ZXIgL3Byb2Mgc2hvd3MgdXAgY2FuIGF1dG9kZXRlY3QuCisJCWlmICghZnNsaXN0KSB7CisJCQlmc2xpc3QgPSBnZXRfYmxvY2tfYmFja2VkX2ZpbGVzeXN0ZW1zKCk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgZnNsaXN0KQorCQkJCWF0ZXhpdChkZWxldGVfYmxvY2tfYmFja2VkX2ZpbGVzeXN0ZW1zKTsKKwkJfQorCisJCWZvciAoZmwgPSBmc2xpc3Q7IGZsOyBmbCA9IGZsLT5saW5rKSB7CisJCQltcC0+bW50X3R5cGUgPSBmbC0+ZGF0YTsKKwkJCXJjID0gbW91bnRfaXRfbm93KG1wLCB2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisJCQlpZiAoIXJjKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLy8gSWYgbW91bnQgZmFpbGVkLCBjbGVhbiB1cCBsb29wIGZpbGUgKGlmIGFueSkuCisJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0xPT1AgJiYgcmMgJiYgbG9vcEZpbGUpIHsKKwkJZGVsX2xvb3AobXAtPm1udF9mc25hbWUpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJCWZyZWUobG9vcEZpbGUpOworCQkJZnJlZShtcC0+bW50X2ZzbmFtZSk7CisJCX0KKwl9CisKKyByZXBvcnRfZXJyb3I6CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKGZpbHRlcm9wdHMpOworCisJaWYgKGVycm5vID09IEVCVVNZICYmIGlnbm9yZV9idXN5KQorCQlyZXR1cm4gMDsKKwlpZiAocmMgIT0gMCkKKwkJYmJfcGVycm9yX21zZygibW91bnRpbmcgJXMgb24gJXMgZmFpbGVkIiwgbXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8vIC1PIHN1cHBvcnQKKy8vICAgIC1PIGludGVycHJldHMgYSBsaXN0IG9mIGZpbHRlciBvcHRpb25zIHdoaWNoIHNlbGVjdCB3aGV0aGVyIGEgbW91bnQKKy8vIHBvaW50IHdpbGwgYmUgbW91bnRlZDogb25seSBtb3VudHMgd2l0aCBvcHRpb25zIG1hdGNoaW5nICphbGwqIGZpbHRlcmluZworLy8gb3B0aW9ucyB3aWxsIGJlIHNlbGVjdGVkLgorLy8gICAgQnkgZGVmYXVsdCBlYWNoIC1PIGZpbHRlciBvcHRpb24gbXVzdCBiZSBwcmVzZW50IGluIHRoZSBsaXN0IG9mIG1vdW50CisvLyBvcHRpb25zLCBidXQgaWYgaXQgaXMgcHJlZml4ZWQgYnkgIm5vIiB0aGVuIGl0IG11c3QgYmUgYWJzZW50LgorLy8gRm9yIGV4YW1wbGUsCisvLyAgLU8gYSxub2IsYyAgbWF0Y2hlcyAgLW8gYSxjICBidXQgZmFpbHMgdG8gbWF0Y2ggIC1vIGEsYixjCisvLyAgICAgICAgICAgICAgKGFuZCBhbHNvIGZhaWxzIHRvIG1hdGNoICAtbyBhICBiZWNhdXNlICAtbyBjICBpcyBhYnNlbnQpLgorLy8KKy8vIEl0IGlzIGRpZmZlcmVudCBmcm9tIC10IGluIHRoYXQgZWFjaCBvcHRpb24gaXMgbWF0Y2hlZCBleGFjdGx5OyBhIGxlYWRpbmcKKy8vICJubyIgYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgb3B0aW9uIGRvZXMgbm90IG5lZ2F0ZSB0aGUgcmVzdC4KK3N0YXRpYyBpbnQgbWF0Y2hfb3B0KGNvbnN0IGNoYXIgKmZzX29wdF9pbiwgY29uc3QgY2hhciAqT19vcHQpCit7CisJaWYgKCFPX29wdCkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKk9fb3B0KSB7CisJCWNvbnN0IGNoYXIgKmZzX29wdCA9IGZzX29wdF9pbjsKKwkJaW50IE9fbGVuOworCQlpbnQgbWF0Y2g7CisKKwkJLy8gSWYgb3B0aW9uIGJlZ2lucyB3aXRoICJubyIgdGhlbiB0cmVhdCBhcyBhbiBpbnZlcnRlZCBtYXRjaDoKKwkJLy8gbWF0Y2hpbmcgaXMgYSBmYWlsdXJlCisJCW1hdGNoID0gMDsKKwkJaWYgKE9fb3B0WzBdID09ICduJyAmJiBPX29wdFsxXSA9PSAnbycpIHsKKwkJCW1hdGNoID0gMTsKKwkJCU9fb3B0ICs9IDI7CisJCX0KKwkJLy8gSXNvbGF0ZSB0aGUgY3VycmVudCBPIG9wdGlvbgorCQlPX2xlbiA9IHN0cmNocm51bChPX29wdCwgJywnKSAtIE9fb3B0OworCQkvLyBDaGVjayBmb3IgYSBtYXRjaCBhZ2FpbnN0IGV4aXN0aW5nIG9wdGlvbnMKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChzdHJuY21wKGZzX29wdCwgT19vcHQsIE9fbGVuKSA9PSAwCisJCQkgJiYgKGZzX29wdFtPX2xlbl0gPT0gJ1wwJyB8fCBmc19vcHRbT19sZW5dID09ICcsJykKKwkJCSkgeworCQkJCWlmIChtYXRjaCkKKwkJCQkJcmV0dXJuIDA7ICAvLyAibm8iIHByZWZpeCwgYnV0IG9wdGlvbiBmb3VuZAorCQkJCW1hdGNoID0gMTsgIC8vIGN1cnJlbnQgTyBvcHRpb24gZm91bmQsIGdvIGNoZWNrIG5leHQgb25lCisJCQkJYnJlYWs7CisJCQl9CisJCQlmc19vcHQgPSBzdHJjaHIoZnNfb3B0LCAnLCcpOworCQkJaWYgKCFmc19vcHQpCisJCQkJYnJlYWs7CisJCQlmc19vcHQrKzsKKwkJfQorCQlpZiAobWF0Y2ggPT0gMCkKKwkJCXJldHVybiAwOyAgICAgLy8gbWF0Y2ggd2FudGVkIGJ1dCBub3QgZm91bmQKKwkJaWYgKE9fb3B0W09fbGVuXSA9PSAnXDAnKSAvLyBlbmQ/CisJCQlicmVhazsKKwkJLy8gU3RlcCB0byB0aGUgbmV4dCBPIG9wdGlvbgorCQlPX29wdCArPSBPX2xlbiArIDE7CisJfQorCS8vIElmIHdlIGdldCBoZXJlIHRoZW4gZXZlcnl0aGluZyBtYXRjaGVkCisJcmV0dXJuIDE7Cit9CisKKy8vIFBhcnNlIG9wdGlvbnMsIGlmIG5lY2Vzc2FyeSBwYXJzZSBmc3RhYi9tdGFiLCBhbmQgY2FsbCBzaW5nbGVtb3VudCBmb3IKKy8vIGVhY2ggZGlyZWN0b3J5IHRvIGJlIG1vdW50ZWQuCitpbnQgbW91bnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vdW50X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpjbWRvcHRzID0geHphbGxvYygxKTsKKwljaGFyICpmc3R5cGUgPSBOVUxMOworCWNoYXIgKk9fb3B0bWF0Y2ggPSBOVUxMOworCWNoYXIgKnN0b3JhZ2VfcGF0aDsKKwlsbGlzdF90ICpsc3RfbyA9IE5VTEw7CisJY29uc3QgY2hhciAqZnN0YWJuYW1lOworCUZJTEUgKmZzdGFiOworCWludCBpLCBqOworCWludCByYyA9IEVYSVRfU1VDQ0VTUzsKKwl1bnNpZ25lZCBvcHQ7CisJc3RydWN0IG1udGVudCBtdHBhaXJbMl0sICptdGN1ciA9IG10cGFpcjsKKwlJRl9OT1RfREVTS1RPUChjb25zdCBpbnQgbm9ucm9vdCA9IDA7KQorCisJSUZfREVTS1RPUChpbnQgbm9ucm9vdCA9ICkgc2FuaXRpemVfZW52X2lmX3N1aWQoKTsKKworCS8vIFBhcnNlIGxvbmcgb3B0aW9ucywgbGlrZSAtLWJpbmQgYW5kIC0tbW92ZS4gIE5vdGUgdGhhdCAtbyBvcHRpb24KKwkvLyBhbmQgLS1vcHRpb24gYXJlIHN5bm9ueW1vdXMuICBZZXMsIHRoaXMgbWVhbnMgLS1yZW1vdW50LHJ3IHdvcmtzLgorCWZvciAoaSA9IGogPSAxOyBhcmd2W2ldOyBpKyspIHsKKwkJaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gJy0nKQorCQkJYXBwZW5kX21vdW50X29wdGlvbnMoJmNtZG9wdHMsIGFyZ3ZbaV0gKyAyKTsKKwkJZWxzZQorCQkJYXJndltqKytdID0gYXJndltpXTsKKwl9CisJYXJndltqXSA9IE5VTEw7CisKKwkvLyBQYXJzZSByZW1haW5pbmcgb3B0aW9ucworCS8vIE1heCAyIHBhcmFtczsgLW8gaXMgYSBsaXN0LCAtdiBpcyBhIGNvdW50ZXIKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/Mm86OiIgSUZfRkVBVFVSRV9NT1VOVF9WRVJCT1NFKCJ2diIpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsICZsc3RfbywgJmZzdHlwZSwgJk9fb3B0bWF0Y2gKKwkJCUlGX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRSgsICZ2ZXJib3NlKSk7CisJd2hpbGUgKGxzdF9vKSBhcHBlbmRfbW91bnRfb3B0aW9ucygmY21kb3B0cywgbGxpc3RfcG9wKCZsc3RfbykpOyAvLyAtbworCWlmIChvcHQgJiBPUFRfcikgYXBwZW5kX21vdW50X29wdGlvbnMoJmNtZG9wdHMsICJybyIpOyAvLyAtcgorCWlmIChvcHQgJiBPUFRfdykgYXBwZW5kX21vdW50X29wdGlvbnMoJmNtZG9wdHMsICJydyIpOyAvLyAtdworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gSWYgd2UgaGF2ZSBubyBhcmd1bWVudHMsIHNob3cgY3VycmVudGx5IG1vdW50ZWQgZmlsZXN5c3RlbXMKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJaWYgKCEob3B0ICYgT1BUX2EpKSB7CisJCQlGSUxFICptb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAiciIpOworCisJCQlpZiAoIW1vdW50VGFibGUpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vICVzIiwgYmJfcGF0aF9tdGFiX2ZpbGUpOworCisJCQl3aGlsZSAoZ2V0bW50ZW50X3IobW91bnRUYWJsZSwgJm10cGFpclswXSwgZ2V0bW50ZW50X2J1ZiwKKwkJCQkJCQkJR0VUTU5URU5UX0JVRlNJWkUpKQorCQkJeworCQkJCS8vIERvbid0IHNob3cgcm9vdGZzLiBGSVhNRTogd2h5Pz8KKwkJCQkvLyB1dGlsLWxpbnV4IDIuMTJhIGhhcHBpbHkgc2hvd3Mgcm9vdGZzLi4uCisJCQkJLy9pZiAoc3RyY21wKG10cGFpci0+bW50X2ZzbmFtZSwgInJvb3RmcyIpID09IDApIGNvbnRpbnVlOworCisJCQkJaWYgKCFmc3R5cGUgfHwgc3RyY21wKG10cGFpci0+bW50X3R5cGUsIGZzdHlwZSkgPT0gMCkKKwkJCQkJcHJpbnRmKCIlcyBvbiAlcyB0eXBlICVzICglcylcbiIsIG10cGFpci0+bW50X2ZzbmFtZSwKKwkJCQkJCQltdHBhaXItPm1udF9kaXIsIG10cGFpci0+bW50X3R5cGUsCisJCQkJCQkJbXRwYWlyLT5tbnRfb3B0cyk7CisJCQl9CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZW5kbW50ZW50KG1vdW50VGFibGUpOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQlzdG9yYWdlX3BhdGggPSBOVUxMOworCX0gZWxzZSB7CisJCS8vIFdoZW4gd2UgaGF2ZSB0d28gYXJndW1lbnRzLCB0aGUgc2Vjb25kIGlzIHRoZSBkaXJlY3RvcnkgYW5kIHdlIGNhbgorCQkvLyBza2lwIGxvb2tpbmcgYXQgZnN0YWIgZW50aXJlbHkuICBXZSBjYW4gYWx3YXlzIGFic3BhdGgoKSB0aGUgZGlyZWN0b3J5CisJCS8vIGFyZ3VtZW50IHdoZW4gd2UgZ2V0IGl0LgorCQlpZiAoYXJndlsxXSkgeworCQkJaWYgKG5vbnJvb3QpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCQkJbXRwYWlyLT5tbnRfZnNuYW1lID0gYXJndlswXTsKKwkJCW10cGFpci0+bW50X2RpciA9IGFyZ3ZbMV07CisJCQltdHBhaXItPm1udF90eXBlID0gZnN0eXBlOworCQkJbXRwYWlyLT5tbnRfb3B0cyA9IGNtZG9wdHM7CisJCQlyZXNvbHZlX21vdW50X3NwZWMoJm10cGFpci0+bW50X2ZzbmFtZSk7CisJCQlyYyA9IHNpbmdsZW1vdW50KG10cGFpciwgLyppZ25vcmVfYnVzeToqLyAwKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlzdG9yYWdlX3BhdGggPSBiYl9zaW1wbGlmeV9wYXRoKGFyZ3ZbMF0pOyAvLyBtYWxsb2NlZAorCX0KKworCS8vIFBhc3QgdGhpcyBwb2ludCwgd2UgYXJlIGhhbmRsaW5nIGVpdGhlciAibW91bnQgLWEgW29wdHNdIgorCS8vIG9yICJtb3VudCBbb3B0c10gc2luZ2xlX3BhcmFtIgorCisJaSA9IHBhcnNlX21vdW50X29wdGlvbnMoY21kb3B0cywgTlVMTCk7IC8vIEZJWE1FOiBzaG91bGQgYmUgImxvbmciLCBub3QgImludCIKKwlpZiAobm9ucm9vdCAmJiAoaSAmIH5NU19TSUxFTlQpKSAvLyBOb24tcm9vdCB1c2VycyBjYW5ub3Qgc3BlY2lmeSBmbGFncworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisKKwkvLyBJZiB3ZSBoYXZlIGEgc2hhcmVkIHN1YnRyZWUgZmxhZywgZG9uJ3Qgd29ycnkgYWJvdXQgZnN0YWIgb3IgbXRhYi4KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfRkxBR1MKKwkgJiYgKGkgJiAoTVNfU0hBUkVEIHwgTVNfUFJJVkFURSB8IE1TX1NMQVZFIHwgTVNfVU5CSU5EQUJMRSkpCisJKSB7CisJCS8vIHZlcmJvc2VfbW91bnQoc291cmNlLCB0YXJnZXQsIHR5cGUsIGZsYWdzLCBkYXRhKQorCQlyYyA9IHZlcmJvc2VfbW91bnQoIiIsIGFyZ3ZbMF0sICIiLCBpLCAiIik7CisJCWlmIChyYykKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJCXJldHVybiByYzsKKwl9CisKKwkvLyBPcGVuIGVpdGhlciBmc3RhYiBvciBtdGFiCisJZnN0YWJuYW1lID0gIi9ldGMvZnN0YWIiOworCWlmIChpICYgTVNfUkVNT1VOVCkgeworCQkvLyBXQVJOSU5HLiBJIGFtIG5vdCBzdXJlIHRoaXMgbWF0Y2hlcyB1dGlsLWxpbnV4J3MKKwkJLy8gYmVoYXZpb3IuIEl0J3MgcG9zc2libGUgdXRpbC1saW51eCBkb2VzIG5vdAorCQkvLyB0YWtlIC1vIG9wdHMgZnJvbSBtdGFiICh0YWtlcyBvbmx5IG1vdW50IHNvdXJjZSkuCisJCWZzdGFibmFtZSA9IGJiX3BhdGhfbXRhYl9maWxlOworCX0KKwlmc3RhYiA9IHNldG1udGVudChmc3RhYm5hbWUsICJyIik7CisJaWYgKCFmc3RhYikKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkICclcyciLCBmc3RhYm5hbWUpOworCisJLy8gTG9vcCB0aHJvdWdoIGVudHJpZXMgdW50aWwgd2UgZmluZCB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yCisJbWVtc2V0KG10cGFpciwgMCwgc2l6ZW9mKG10cGFpcikpOworCWZvciAoOzspIHsKKwkJc3RydWN0IG1udGVudCAqbXRvdGhlciA9IChtdGN1cj09bXRwYWlyID8gbXRwYWlyKzEgOiBtdHBhaXIpOworCisJCS8vIEdldCBuZXh0IGZzdGFiIGVudHJ5CisJCWlmICghZ2V0bW50ZW50X3IoZnN0YWIsIG10Y3VyLCBnZXRtbnRlbnRfYnVmCisJCQkJCSsgKG10Y3VyPT1tdHBhaXIgPyBHRVRNTlRFTlRfQlVGU0laRS8yIDogMCksCisJCQkJR0VUTU5URU5UX0JVRlNJWkUvMikKKwkJKSB7IC8vIEVuZCBvZiBmc3RhYi9tdGFiIGlzIHJlYWNoZWQKKwkJCW10Y3VyID0gbXRvdGhlcjsgLy8gdGhlIHRoaW5nIHdlIGZvdW5kIGxhc3QgdGltZQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBJZiB3ZSdyZSB0cnlpbmcgdG8gbW91bnQgc29tZXRoaW5nIHNwZWNpZmljIGFuZCB0aGlzIGlzbid0IGl0LAorCQkvLyBza2lwIGl0LiAgTm90ZSB3ZSBtdXN0IG1hdGNoIHRoZSBleGFjdCB0ZXh0IGluIGZzdGFiIChhbGEKKwkJLy8gInByb2MiKSBvciBhIGZ1bGwgcGF0aCBmcm9tIHJvb3QKKwkJaWYgKGFyZ3ZbMF0pIHsKKworCQkJLy8gSXMgdGhpcyB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yPworCQkJaWYgKHN0cmNtcChhcmd2WzBdLCBtdGN1ci0+bW50X2ZzbmFtZSkgIT0gMAorCQkJICYmIHN0cmNtcChzdG9yYWdlX3BhdGgsIG10Y3VyLT5tbnRfZnNuYW1lKSAhPSAwCisJCQkgJiYgc3RyY21wKGFyZ3ZbMF0sIG10Y3VyLT5tbnRfZGlyKSAhPSAwCisJCQkgJiYgc3RyY21wKHN0b3JhZ2VfcGF0aCwgbXRjdXItPm1udF9kaXIpICE9IDAKKwkJCSkgeworCQkJCWNvbnRpbnVlOyAvLyBubworCQkJfQorCisJCQkvLyBSZW1lbWJlciB0aGlzIGVudHJ5LiAgU29tZXRoaW5nIGxhdGVyIG1heSBoYXZlCisJCQkvLyBvdmVybW91bnRlZCBpdCwgYW5kIHdlIHdhbnQgdGhlIF9sYXN0XyBtYXRjaC4KKwkJCW10Y3VyID0gbXRvdGhlcjsKKworCQkvLyBJZiB3ZSdyZSBtb3VudGluZyBhbGwKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBtbnRlbnQgKm1wOworCQkJLy8gTm8sIG1vdW50IC1hIHdvbid0IG1vdW50IGFueXRoaW5nLAorCQkJLy8gZXZlbiB1c2VyIG1vdW50cywgZm9yIG1lcmUgaHVtYW5zCisJCQlpZiAobm9ucm9vdCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisKKwkJCS8vIERvZXMgdHlwZSBtYXRjaD8gKE5VTEwgbWF0Y2hlcyBhbHdheXMpCisJCQlpZiAoIW1hdGNoX2ZzdHlwZShtdGN1ciwgZnN0eXBlKSkKKwkJCQljb250aW51ZTsKKworCQkJLy8gU2tpcCBub2F1dG8gYW5kIHN3YXAgYW55d2F5CisJCQlpZiAoKHBhcnNlX21vdW50X29wdGlvbnMobXRjdXItPm1udF9vcHRzLCBOVUxMKSAmIChNT1VOVF9OT0FVVE8gfCBNT1VOVF9TV0FQKSkKKwkJCS8vIHN3YXAgaXMgYm9ndXMgImZzdHlwZSIsIHBhcnNlX21vdW50X29wdGlvbnMgY2FuJ3QgY2hlY2sgZnN0eXBlcworCQkJIHx8IHN0cmNhc2VjbXAobXRjdXItPm1udF90eXBlLCAic3dhcCIpID09IDAKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBEb2VzIChhdCBsZWFzdCBvbmUpIG9wdGlvbiBtYXRjaD8KKwkJCS8vIChOVUxMIG1hdGNoZXMgYWx3YXlzKQorCQkJaWYgKCFtYXRjaF9vcHQobXRjdXItPm1udF9vcHRzLCBPX29wdG1hdGNoKSkKKwkJCQljb250aW51ZTsKKworCQkJcmVzb2x2ZV9tb3VudF9zcGVjKCZtdGN1ci0+bW50X2ZzbmFtZSk7CisKKwkJCS8vIE5GUyBtb3VudHMgd2FudCB0aGlzIHRvIGJlIHhyZWFsbG9jLWFibGUKKwkJCW10Y3VyLT5tbnRfb3B0cyA9IHhzdHJkdXAobXRjdXItPm1udF9vcHRzKTsKKworCQkJLy8gSWYgbm90aGluZyBpcyBtb3VudGVkIG9uIHRoaXMgZGlyZWN0b3J5Li4uCisJCQkvLyAob3RoZXJ3aXNlIHJlcGVhdGVkICJtb3VudCAtYSIgbW91bnRzIGV2ZXJ5dGhpbmcgYWdhaW4pCisJCQltcCA9IGZpbmRfbW91bnRfcG9pbnQobXRjdXItPm1udF9kaXIsIC8qc3ViZGlyX3RvbzoqLyAwKTsKKwkJCS8vIFdlIGRvIG5vdCBjaGVjayBmc25hbWUgbWF0Y2ggb2YgZm91bmQgbW91bnQgcG9pbnQgLQorCQkJLy8gIi8iIG1heSBoYXZlIGZzbmFtZSBvZiAiL2Rldi9yb290IiB3aGlsZSBmc3RhYgorCQkJLy8gc2F5cyAiL2Rldi9zb21ldGhpbmdfZWxzZSIuCisJCQlpZiAobXApIHsKKwkJCQlpZiAodmVyYm9zZSkgeworCQkJCQliYl9lcnJvcl9tc2coImFjY29yZGluZyB0byAlcywgIgorCQkJCQkJIiVzIGlzIGFscmVhZHkgbW91bnRlZCBvbiAlcyIsCisJCQkJCQliYl9wYXRoX210YWJfZmlsZSwKKwkJCQkJCW1wLT5tbnRfZnNuYW1lLCBtcC0+bW50X2Rpcik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyAuLi5tb3VudCB0aGlzIHRoaW5nCisJCQkJaWYgKHNpbmdsZW1vdW50KG10Y3VyLCAvKmlnbm9yZV9idXN5OiovIDEpKSB7CisJCQkJCS8vIENvdW50IG51bWJlciBvZiBmYWlsZWQgbW91bnRzCisJCQkJCXJjKys7CisJCQkJfQorCQkJfQorCQkJZnJlZShtdGN1ci0+bW50X29wdHMpOworCQl9CisJfQorCisJLy8gRW5kIG9mIGZzdGFiL210YWIgaXMgcmVhY2hlZC4KKwkvLyBXZXJlIHdlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyBzcGVjaWZpYz8KKwlpZiAoYXJndlswXSkgeyAvLyB5ZXMKKwkJbG9uZyBsOworCisJCS8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBjb21wbGFpbgorCQlpZiAoIW10Y3VyLT5tbnRfZnNuYW1lKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgJXMgaW4gJXMiLAorCQkJCWFyZ3ZbMF0sIGZzdGFibmFtZSk7CisKKwkJLy8gV2hhdCBoYXBwZW5zIHdoZW4gd2UgdHJ5IHRvICJtb3VudCBzd2FwX3BhcnRpdGlvbiI/CisJCS8vIChmc3RhYiBjb250YWludHMgInN3YXBfcGFydGl0aW9uIHN3YXAgc3dhcCBkZWZhdWx0cyAwIDAiKQorCQkvLyB1dGlsLWxpbnV4LW5nIDIuMTMuMSBkb2VzIHRoaXM6CisJCS8vIHN0YXQoIi9zYmluL21vdW50LnN3YXAiLCAweDdmZmY2MmEzYTM1MCkgPSAtMSBFTk9FTlQgKE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkpCisJCS8vIG1vdW50KCJzd2FwX3BhcnRpdGlvbiIsICJzd2FwIiwgInN3YXAiLCBNU19NR0NfVkFMLCBOVUxMKSA9IC0xIEVOT0VOVCAoTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSkKKwkJLy8gbHN0YXQoInN3YXAiLCAweDdmZmY2MmEzYTY0MCkgICAgICAgICAgID0gLTEgRU5PRU5UIChObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5KQorCQkvLyB3cml0ZSgyLCAibW91bnQ6IG1vdW50IHBvaW50IHN3YXAgZG9lcyBub3QgZXhpc3RcbiIsIDM5KSA9IDM5CisJCS8vIGV4aXRfZ3JvdXAoMzIpICAgICAgICAgICAgICAgICAgICAgICAgICA9ID8KKyNpZiAwCisJCS8vIEluIGNhc2Ugd2Ugd2FudCB0byBzaW1wbHkgc2tpcCBzd2FwIHBhcnRpdGlvbnM6CisJCWwgPSBwYXJzZV9tb3VudF9vcHRpb25zKG10Y3VyLT5tbnRfb3B0cywgTlVMTCk7CisJCWlmICgobCAmIE1PVU5UX1NXQVApCisJCS8vIHN3YXAgaXMgYm9ndXMgImZzdHlwZSIsIHBhcnNlX21vdW50X29wdGlvbnMgY2FuJ3QgY2hlY2sgZnN0eXBlcworCQkgfHwgc3RyY2FzZWNtcChtdGN1ci0+bW50X3R5cGUsICJzd2FwIikgPT0gMAorCQkpIHsKKwkJCWdvdG8gcmV0OworCQl9CisjZW5kaWYKKwkJaWYgKG5vbnJvb3QpIHsKKwkJCS8vIGZzdGFiIG11c3QgaGF2ZSAidXNlcnMiIG9yICJ1c2VyIgorCQkJbCA9IHBhcnNlX21vdW50X29wdGlvbnMobXRjdXItPm1udF9vcHRzLCBOVUxMKTsKKwkJCWlmICghKGwgJiBNT1VOVF9VU0VSUykpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCQl9CisKKwkJLy91dGlsLWxpbnV4LTIuMTIgZG9lcyBub3QgZG8gdGhpcyBjaGVjay4KKwkJLy8vLyBJZiBub3RoaW5nIGlzIG1vdW50ZWQgb24gdGhpcyBkaXJlY3RvcnkuLi4KKwkJLy8vLyAob3RoZXJ3aXNlIHJlcGVhdGVkICJtb3VudCBGT08iIG1vdW50cyBGT08gYWdhaW4pCisJCS8vbXAgPSBmaW5kX21vdW50X3BvaW50KG10Y3VyLT5tbnRfZGlyLCAvKnN1YmRpcl90b286Ki8gMCk7CisJCS8vaWYgKG1wKSB7CisJCS8vCWJiX2Vycm9yX21zZygiYWNjb3JkaW5nIHRvICVzLCAiCisJCS8vCQkiJXMgaXMgYWxyZWFkeSBtb3VudGVkIG9uICVzIiwKKwkJLy8JCWJiX3BhdGhfbXRhYl9maWxlLAorCQkvLwkJbXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyKTsKKwkJLy99IGVsc2UgeworCQkJLy8gLi4ubW91bnQgdGhlIGxhc3QgdGhpbmcgd2UgZm91bmQKKwkJCW10Y3VyLT5tbnRfb3B0cyA9IHhzdHJkdXAobXRjdXItPm1udF9vcHRzKTsKKwkJCWFwcGVuZF9tb3VudF9vcHRpb25zKCYobXRjdXItPm1udF9vcHRzKSwgY21kb3B0cyk7CisJCQlyZXNvbHZlX21vdW50X3NwZWMoJm10cGFpci0+bW50X2ZzbmFtZSk7CisJCQlyYyA9IHNpbmdsZW1vdW50KG10Y3VyLCAvKmlnbm9yZV9idXN5OiovIDApOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWZyZWUobXRjdXItPm1udF9vcHRzKTsKKwkJLy99CisJfQorCisgLy9yZXQ6CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQllbmRtbnRlbnQoZnN0YWIpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKHN0b3JhZ2VfcGF0aCk7CisJCWZyZWUoY21kb3B0cyk7CisJfQorCisvL1RPRE86IGV4aXRjb2RlIHNob3VsZCBiZSBPUmVkIG1hc2sgb2YgKGZyb20gIm1hbiBtb3VudCIpOgorLy8gMCBzdWNjZXNzCisvLyAxIGluY29ycmVjdCBpbnZvY2F0aW9uIG9yIHBlcm1pc3Npb25zCisvLyAyIHN5c3RlbSBlcnJvciAob3V0IG9mIG1lbW9yeSwgY2Fubm90IGZvcmssIG5vIG1vcmUgbG9vcCBkZXZpY2VzKQorLy8gNCBpbnRlcm5hbCBtb3VudCBidWcgb3IgbWlzc2luZyBuZnMgc3VwcG9ydCBpbiBtb3VudAorLy8gOCB1c2VyIGludGVycnVwdAorLy8xNiBwcm9ibGVtcyB3cml0aW5nIG9yIGxvY2tpbmcgL2V0Yy9tdGFiCisvLzMyIG1vdW50IGZhaWx1cmUKKy8vNjQgc29tZSBtb3VudCBzdWNjZWVkZWQKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3Bpdm90X3Jvb3QuYyBiL3V0aWwtbGludXgvcGl2b3Rfcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjAxZmEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3Bpdm90X3Jvb3QuYwpAQCAtMCwwICsxLDM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwaXZvdF9yb290LmMgLSBDaGFuZ2Ugcm9vdCBmaWxlIHN5c3RlbS4gIEJhc2VkIG9uIHV0aWwtbGludXggMi4xMHMKKyAqCisgKiBidXN5Ym94ZWQgYnkgRXZpbiBSb2JlcnRzb24KKyAqIHBpdm90X3Jvb3Qgc3lzY2FsbCBzdHViYmVkIGJ5IEVyaWsgQW5kZXJzZW4sIHNvIGl0IHdpbGwgY29tcGlsZQorICogICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGtlcm5lbCBiZWluZyB1c2VkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHBpdm90X3Jvb3RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIk5FV19ST09UIFBVVF9PTEQiCisvL3VzYWdlOiNkZWZpbmUgcGl2b3Rfcm9vdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1vdmUgdGhlIGN1cnJlbnQgcm9vdCBmaWxlIHN5c3RlbSB0byBQVVRfT0xEIGFuZCBtYWtlIE5FV19ST09UXG4iCisvL3VzYWdlOiAgICAgICAidGhlIG5ldyByb290IGZpbGUgc3lzdGVtIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZXh0ZXJuIGludCBwaXZvdF9yb290KGNvbnN0IGNoYXIgKiBuZXdfcm9vdCxjb25zdCBjaGFyICogcHV0X29sZCk7CisKK2ludCBwaXZvdF9yb290X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwaXZvdF9yb290X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjICE9IDMpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWlmIChwaXZvdF9yb290KGFyZ3ZbMV0sIGFyZ3ZbMl0pIDwgMCkgeworCQkvKiBwcmludHMgInBpdm90X3Jvb3Q6IDxzdHJlcnJvciB0ZXh0PiIgKi8KKwkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9yZGF0ZS5jIGIvdXRpbC1saW51eC9yZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzZkOGYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3JkYXRlLmMKQEAgLTAsMCArMSw3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhlIFJkYXRlIGNvbW1hbmQgd2lsbCBhc2sgYSB0aW1lIHNlcnZlciBmb3IgdGhlIFJGQyA4NjggdGltZQorICogIGFuZCBvcHRpb25hbGx5IHNldCB0aGUgc3lzdGVtIHRpbWUuCisgKgorICogYnkgU3RlcmxpbmcgSHV4bGV5IDxzdGVybGluZ0BldXJvcGEuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvL3VzYWdlOiNkZWZpbmUgcmRhdGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstc3BdIEhPU1QiCisvL3VzYWdlOiNkZWZpbmUgcmRhdGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJHZXQgYW5kIHBvc3NpYmx5IHNldCB0aGUgc3lzdGVtIGRhdGUgYW5kIHRpbWUgZnJvbSBhIHJlbW90ZSBIT1NUXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVNldCB0aGUgc3lzdGVtIGRhdGUgYW5kIHRpbWUgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktcAlQcmludCB0aGUgZGF0ZSBhbmQgdGltZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geyBSRkNfODY4X0JJQVMgPSAyMjA4OTg4ODAwVUwgfTsKKworc3RhdGljIHZvaWQgc29ja2V0X3RpbWVvdXQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWVvdXQgY29ubmVjdGluZyB0byB0aW1lIHNlcnZlciIpOworfQorCitzdGF0aWMgdGltZV90IGFza3JlbW90ZWRhdGUoY29uc3QgY2hhciAqaG9zdCkKK3sKKwl1aW50MzJfdCBuZXR0OworCWludCBmZDsKKworCS8qIEFkZCBhIHRpbWVvdXQgZm9yIGRlYWQgb3IgaW5hY2Nlc3NpYmxlIHNlcnZlcnMgKi8KKwlhbGFybSgxMCk7CisJc2lnbmFsKFNJR0FMUk0sIHNvY2tldF90aW1lb3V0KTsKKworCWZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoaG9zdCwgYmJfbG9va3VwX3BvcnQoInRpbWUiLCAidGNwIiwgMzcpKTsKKworCWlmIChzYWZlX3JlYWQoZmQsICh2b2lkICopJm5ldHQsIDQpICE9IDQpICAgIC8qIHJlYWQgdGltZSBmcm9tIHNlcnZlciAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgZGlkIG5vdCBzZW5kIHRoZSBjb21wbGV0ZSB0aW1lIiwgaG9zdCk7CisJY2xvc2UoZmQpOworCisJLyogY29udmVydCBmcm9tIG5ldHdvcmsgYnl0ZSBvcmRlciB0byBsb2NhbCBieXRlIG9yZGVyLgorCSAqIFJGQyA4NjggdGltZSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMKKwkgKiBzaW5jZSAwMDowMCAobWlkbmlnaHQpIDEgSmFudWFyeSAxOTAwIEdNVAorCSAqIHRoZSBSRkMgODY4IHRpbWUgMiwyMDgsOTg4LDgwMCBjb3JyZXNwb25kcyB0byAwMDowMCAgMSBKYW4gMTk3MCBHTVQKKwkgKiBTdWJ0cmFjdCB0aGUgUkZDIDg2OCB0aW1lIHRvIGdldCBMaW51eCBlcG9jaAorCSAqLworCisJcmV0dXJuIG50b2hsKG5ldHQpIC0gUkZDXzg2OF9CSUFTOworfQorCitpbnQgcmRhdGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJkYXRlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl0aW1lX3QgcmVtb3RlX3RpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJzcCIpOworCisJcmVtb3RlX3RpbWUgPSBhc2tyZW1vdGVkYXRlKGFyZ3Zbb3B0aW5kXSk7CisKKwlpZiAoKGZsYWdzICYgMikgPT0gMCkgeworCQl0aW1lX3QgY3VycmVudF90aW1lOworCisJCXRpbWUoJmN1cnJlbnRfdGltZSk7CisJCWlmIChjdXJyZW50X3RpbWUgPT0gcmVtb3RlX3RpbWUpCisJCQliYl9lcnJvcl9tc2coImN1cnJlbnQgdGltZSBtYXRjaGVzIHJlbW90ZSB0aW1lIik7CisJCWVsc2UKKwkJCWlmIChzdGltZSgmcmVtb3RlX3RpbWUpIDwgMCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCB0aW1lIG9mIGRheSIpOworCX0KKworCWlmICgoZmxhZ3MgJiAxKSA9PSAwKQorCQlwcmludGYoIiVzIiwgY3RpbWUoJnJlbW90ZV90aW1lKSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9yZGV2LmMgYi91dGlsLWxpbnV4L3JkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjEyZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9yZGV2LmMKQEAgLTAsMCArMSwzMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcmRldiAtIHByaW50IGRldmljZSBub2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGVzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnVvdmF0aW9uIFN5c3RlbSBEZXNpZ25zLCBMTEMKKyAqICAgR3JhbnQgRXJpY2tzb24gPGdlcmlja3NvbkBudW92YXRpb25zLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcmRldl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHJkZXZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgZGV2aWNlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlc3lzdGVtIG1vdW50ZWQgYXQgJy8nIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSByZGV2X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJkZXZcbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L210ZGJsb2NrOSAvXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgcmRldl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmRldl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgY29uc3QgKiBjb25zdCByb290X2RldmljZSA9IGZpbmRfYmxvY2tfZGV2aWNlKCIvIik7CisKKwlpZiAocm9vdF9kZXZpY2UgIT0gTlVMTCkgeworCQlwcmludGYoIiVzIC9cbiIsIHJvb3RfZGV2aWNlKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvcmVhZHByb2ZpbGUuYyBiL3V0aWwtbGludXgvcmVhZHByb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ4MDExCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9yZWFkcHJvZmlsZS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgcmVhZHByb2ZpbGUuYyAtIHVzZWQgdG8gcmVhZCAvcHJvYy9wcm9maWxlCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NCwxOTk2IEFsZXNzYW5kcm8gUnViaW5pIChydWJpbmlAaXB2dmlzLnVuaXB2Lml0KQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1pY2tpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgorICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICogMTk5OS0wOS0wMSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGNlbGxvLmhwbC5ocC5jb20+CisgKiAtIDY0Yml0IGNsZWFuIHBhdGNoCisgKiAzRmViMjAwMSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CisgKiAtIC1NIG9wdGlvbiB0byB3cml0ZSBwcm9maWxlIG11bHRpcGxpZXIuCisgKiAyMDAxLTExLTA3IFdlcm5lciBBbG1lc2JlcmdlciA8d2FAYWxtZXNiZXJnZXIubmV0PgorICogLSBieXRlIG9yZGVyIGF1dG8tZGV0ZWN0aW9uIGFuZCAtbiBvcHRpb24KKyAqIDIwMDEtMTEtMDkgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CisgKiAtIHNraXAgc3RlcCBzaXplIChpbmRleCAwKQorICogMjAwMi0wMy0wOSBKb2huIExldm9uIDxtb3pAY29tcHNvYy5tYW4uYWMudWs+CisgKiAtIG1ha2UgbWFwbGluZW5vIGRvIHNvbWV0aGluZworICogMjAwMi0xMS0yOCBNYWRzIE1hcnRpbiBKb2VyZ2Vuc2VuICsKKyAqIC0gYWxzbyB0cnkgL2Jvb3QvU3lzdGVtLm1hcC1gdW5hbWUgLXJgCisgKiAyMDAzLTA0LTA5IFdlcm5lciBBbG1lc2JlcmdlciA8d2FAYWxtZXNiZXJnZXIubmV0PgorICogLSBmaXhlZCBvZmYtYnkgZWlnaHQgZXJyb3IgYW5kIGltcHJvdmVkIGhldXJpc3RpY3MgaW4gYnl0ZSBvcmRlciBkZXRlY3Rpb24KKyAqIDIwMDMtMDgtMTIgTmlraXRhIERhbmlsb3YgPE5pa2l0YUBOYW1lc3lzLkNPTT4KKyAqIC0gYWRkZWQgLXMgb3B0aW9uOyBleGFtcGxlIG9mIHVzZToKKyAqICJyZWFkcHJvZmlsZSAtcyAtbSAvYm9vdC9TeXN0ZW0ubWFwLXRlc3QgfCBncmVwIF9fZF9sb29rdXAgfCBzb3J0IC1uIC1rMyIKKyAqCisgKiBUYWtlbiBmcm9tIHV0aWwtbGludXggYW5kIGFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkKKyAqIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZWFkcHJvZmlsZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIHJlYWRwcm9maWxlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1tIG1hcGZpbGUJKERlZmF1bHQ6IC9ib290L1N5c3RlbS5tYXApIgorLy91c2FnZTogICAgICJcbgktcCBwcm9maWxlCShEZWZhdWx0OiAvcHJvYy9wcm9maWxlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLU0gTlVNCQlTZXQgdGhlIHByb2ZpbGluZyBtdWx0aXBsaWVyIHRvIE5VTSIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCVByaW50IG9ubHkgaW5mbyBhYm91dCB0aGUgc2FtcGxpbmcgc3RlcCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1hCQlQcmludCBhbGwgc3ltYm9scywgZXZlbiBpZiBjb3VudCBpcyAwIgorLy91c2FnZTogICAgICJcbgktYgkJUHJpbnQgaW5kaXZpZHVhbCBoaXN0b2dyYW0tYmluIGNvdW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJCVByaW50IGluZGl2aWR1YWwgY291bnRlcnMgd2l0aGluIGZ1bmN0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJCVJlc2V0IGFsbCB0aGUgY291bnRlcnMgKHJvb3Qgb25seSkiCisvL3VzYWdlOiAgICAgIlxuCS1uCQlEaXNhYmxlIGJ5dGUgb3JkZXIgYXV0by1kZXRlY3Rpb24iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKyNkZWZpbmUgU19MRU4gMTI4CisKKy8qIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRtYXBbXSBBTElHTjEgPSAiL2Jvb3QvU3lzdGVtLm1hcCI7CitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0cHJvW10gQUxJR04xID0gIi9wcm9jL3Byb2ZpbGUiOworCitpbnQgcmVhZHByb2ZpbGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlYWRwcm9maWxlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICptYXA7CisJY29uc3QgY2hhciAqbWFwRmlsZSwgKnByb0ZpbGU7CisJdW5zaWduZWQgbG9uZyBpbmR4ID0gMTsKKwlzaXplX3QgbGVuOworCXVpbnQ2NF90IGFkZDAgPSAwOworCXVuc2lnbmVkIGludCBzdGVwOworCXVuc2lnbmVkIGludCAqYnVmLCB0b3RhbCwgZm5fbGVuOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmbl9hZGQsIG5leHRfYWRkOyAgICAgLyogY3VycmVudCBhbmQgbmV4dCBhZGRyZXNzICovCisJY2hhciBmbl9uYW1lW1NfTEVOXSwgbmV4dF9uYW1lW1NfTEVOXTsgICAvKiBjdXJyZW50IGFuZCBuZXh0IG5hbWUgKi8KKwljaGFyIG1hcGxpbmVbU19MRU5dOworCWNoYXIgbW9kZVs4XTsKKwlpbnQgbWFwbGluZW5vID0gMTsKKwlpbnQgaGVhZGVyX3ByaW50ZWQ7CisJaW50IG11bHRpcGxpZXIgPSAwOworCXVuc2lnbmVkIG9wdDsKKwllbnVtIHsKKwkJT1BUX00gPSAoMSA8PCAwKSwKKwkJT1BUX20gPSAoMSA8PCAxKSwKKwkJT1BUX3AgPSAoMSA8PCAyKSwKKwkJT1BUX24gPSAoMSA8PCAzKSwKKwkJT1BUX2EgPSAoMSA8PCA0KSwKKwkJT1BUX2IgPSAoMSA8PCA1KSwKKwkJT1BUX3MgPSAoMSA8PCA2KSwKKwkJT1BUX2kgPSAoMSA8PCA3KSwKKwkJT1BUX3IgPSAoMSA8PCA4KSwKKwkJT1BUX3YgPSAoMSA8PCA5KSwKKwl9OworI2RlZmluZSBvcHRNdWx0ICAgIChvcHQgJiBPUFRfTSkKKyNkZWZpbmUgb3B0TmF0aXZlICAob3B0ICYgT1BUX24pCisjZGVmaW5lIG9wdEFsbCAgICAgKG9wdCAmIE9QVF9hKQorI2RlZmluZSBvcHRCaW5zICAgIChvcHQgJiBPUFRfYikKKyNkZWZpbmUgb3B0U3ViICAgICAob3B0ICYgT1BUX3MpCisjZGVmaW5lIG9wdEluZm8gICAgKG9wdCAmIE9QVF9pKQorI2RlZmluZSBvcHRSZXNldCAgIChvcHQgJiBPUFRfcikKKyNkZWZpbmUgb3B0VmVyYm9zZSAob3B0ICYgT1BUX3YpCisKKyNkZWZpbmUgbmV4dCAoY3VycmVudF4xKQorCisJcHJvRmlsZSA9IGRlZmF1bHRwcm87CisJbWFwRmlsZSA9IGRlZmF1bHRtYXA7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJNKyI7IC8qIC1NIE4gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiTTptOnA6bmFic2lydiIsICZtdWx0aXBsaWVyLCAmbWFwRmlsZSwgJnByb0ZpbGUpOworCisJaWYgKG9wdCAmIChPUFRfTXxPUFRfcikpIHsgLyogbXVsdCBvciByZXNldCwgb3IgYm90aCAqLworCQlpbnQgZmQsIHRvX3dyaXRlOworCisJCS8qCisJCSAqIFdoZW4gd3JpdGluZyB0aGUgbXVsdGlwbGllciwgaWYgdGhlIGxlbmd0aCBvZiB0aGUgd3JpdGUgaXMKKwkJICogbm90IHNpemVvZihpbnQpLCB0aGUgbXVsdGlwbGllciBpcyBub3QgY2hhbmdlZAorCQkgKi8KKwkJdG9fd3JpdGUgPSBzaXplb2YoaW50KTsKKwkJaWYgKCFvcHRNdWx0KQorCQkJdG9fd3JpdGUgPSAxOyAgLyogc3RoIGRpZmZlcmVudCBmcm9tIHNpemVvZihpbnQpICovCisKKwkJZmQgPSB4b3BlbihkZWZhdWx0cHJvLCBPX1dST05MWSk7CisJCXh3cml0ZShmZCwgJm11bHRpcGxpZXIsIHRvX3dyaXRlKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qCisJICogVXNlIGFuIGZkIGZvciB0aGUgcHJvZmlsaW5nIGJ1ZmZlciwgdG8gc2tpcCBzdGRpbyBvdmVyaGVhZAorCSAqLworCWxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwlidWYgPSB4bWFsbG9jX3hvcGVuX3JlYWRfY2xvc2UocHJvRmlsZSwgJmxlbik7CisJaWYgKCFvcHROYXRpdmUpIHsKKwkJaW50IGVudHJpZXMgPSBsZW4gLyBzaXplb2YoKmJ1Zik7CisJCWludCBiaWcgPSAwLCBzbWFsbCA9IDAsIGk7CisJCXVuc2lnbmVkICpwOworCisJCWZvciAocCA9IGJ1ZisxOyBwIDwgYnVmK2VudHJpZXM7IHArKykgeworCQkJaWYgKCpwICYgfjBVIDw8IChzaXplb2YoKmJ1ZikqNCkpCisJCQkJYmlnKys7CisJCQlpZiAoKnAgJiAoKDEgPDwgKHNpemVvZigqYnVmKSo0KSktMSkpCisJCQkJc21hbGwrKzsKKwkJfQorCQlpZiAoYmlnID4gc21hbGwpIHsKKwkJCWJiX2Vycm9yX21zZygiYXNzdW1pbmcgcmV2ZXJzZWQgYnl0ZSBvcmRlciwgIgorCQkJCSJ1c2UgLW4gdG8gZm9yY2UgbmF0aXZlIGJ5dGUgb3JkZXIiKTsKKwkJCWZvciAocCA9IGJ1ZjsgcCA8IGJ1ZitlbnRyaWVzOyBwKyspCisJCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZigqYnVmKS8yOyBpKyspIHsKKwkJCQkJdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopIHA7CisJCQkJCXVuc2lnbmVkIGNoYXIgdG1wOworCisJCQkJCXRtcCA9IGJbaV07CisJCQkJCWJbaV0gPSBiW3NpemVvZigqYnVmKS1pLTFdOworCQkJCQliW3NpemVvZigqYnVmKS1pLTFdID0gdG1wOworCQkJCX0KKwkJfQorCX0KKworCXN0ZXAgPSBidWZbMF07CisJaWYgKG9wdEluZm8pIHsKKwkJcHJpbnRmKCJTYW1wbGluZ19zdGVwOiAlaVxuIiwgc3RlcCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJdG90YWwgPSAwOworCisJbWFwID0geGZvcGVuX2Zvcl9yZWFkKG1hcEZpbGUpOworCisJd2hpbGUgKGZnZXRzKG1hcGxpbmUsIFNfTEVOLCBtYXApKSB7CisJCWlmIChzc2NhbmYobWFwbGluZSwgIiVsbHggJXMgJXMiLCAmZm5fYWRkLCBtb2RlLCBmbl9uYW1lKSAhPSAzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzKCVpKTogd3JvbmcgbWFwIGxpbmUiLAorCQkJCQkgICAgIG1hcEZpbGUsIG1hcGxpbmVubyk7CisKKwkJaWYgKCFzdHJjbXAoZm5fbmFtZSwgIl9zdGV4dCIpKSAvKiBvbmx5IGVsZiB3b3JrcyBsaWtlIHRoaXMgKi8geworCQkJYWRkMCA9IGZuX2FkZDsKKwkJCWJyZWFrOworCQl9CisJCW1hcGxpbmVubysrOworCX0KKworCWlmICghYWRkMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgXCJfc3RleHRcIiBpbiAlcyIsIG1hcEZpbGUpOworCisJLyoKKwkgKiBNYWluIGxvb3AuCisJICovCisJd2hpbGUgKGZnZXRzKG1hcGxpbmUsIFNfTEVOLCBtYXApKSB7CisJCXVuc2lnbmVkIGludCB0aGlzID0gMDsKKworCQlpZiAoc3NjYW5mKG1hcGxpbmUsICIlbGx4ICVzICVzIiwgJm5leHRfYWRkLCBtb2RlLCBuZXh0X25hbWUpICE9IDMpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMoJWkpOiB3cm9uZyBtYXAgbGluZSIsCisJCQkJCW1hcEZpbGUsIG1hcGxpbmVubyk7CisKKwkJaGVhZGVyX3ByaW50ZWQgPSAwOworCisJCS8qIGlnbm9yZSBhbnkgTEVBRElORyAoYmVmb3JlIGEgJ1t0VF0nIHN5bWJvbCBpcyBmb3VuZCkKKwkJICAgQWJzb2x1dGUgc3ltYm9scyAqLworCQlpZiAoKCptb2RlID09ICdBJyB8fCAqbW9kZSA9PSAnPycpICYmIHRvdGFsID09IDApIGNvbnRpbnVlOworCQlpZiAoKm1vZGUgIT0gJ1QnICYmICptb2RlICE9ICd0JworCQkgJiYgKm1vZGUgIT0gJ1cnICYmICptb2RlICE9ICd3JworCQkpIHsKKwkJCWJyZWFrOyAgLyogb25seSB0ZXh0IGlzIHByb2ZpbGVkICovCisJCX0KKworCQlpZiAoaW5keCA+PSBsZW4gLyBzaXplb2YoKmJ1ZikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvZmlsZSBhZGRyZXNzIG91dCBvZiByYW5nZS4gIgorCQkJCQkgICAgICJXcm9uZyBtYXAgZmlsZT8iKTsKKworCQl3aGlsZSAoaW5keCA8IChuZXh0X2FkZC1hZGQwKS9zdGVwKSB7CisJCQlpZiAob3B0QmlucyAmJiAoYnVmW2luZHhdIHx8IG9wdEFsbCkpIHsKKwkJCQlpZiAoIWhlYWRlcl9wcmludGVkKSB7CisJCQkJCXByaW50ZigiJXM6XG4iLCBmbl9uYW1lKTsKKwkJCQkJaGVhZGVyX3ByaW50ZWQgPSAxOworCQkJCX0KKwkJCQlwcmludGYoIlx0JSJQUkl4NjQiXHQldVxuIiwgKGluZHggLSAxKSpzdGVwICsgYWRkMCwgYnVmW2luZHhdKTsKKwkJCX0KKwkJCXRoaXMgKz0gYnVmW2luZHgrK107CisJCX0KKwkJdG90YWwgKz0gdGhpczsKKworCQlpZiAob3B0QmlucykgeworCQkJaWYgKG9wdFZlcmJvc2UgfHwgdGhpcyA+IDApCisJCQkJcHJpbnRmKCIgIHRvdGFsXHRcdFx0XHQldVxuIiwgdGhpcyk7CisJCX0gZWxzZSBpZiAoKHRoaXMgfHwgb3B0QWxsKQorCQkgICAgICAgICYmIChmbl9sZW4gPSBuZXh0X2FkZC1mbl9hZGQpICE9IDAKKwkJKSB7CisJCQlpZiAob3B0VmVyYm9zZSkKKwkJCQlwcmludGYoIiUwMTZsbHggJS00MHMgJTZpICU4LjRmXG4iLCBmbl9hZGQsCisJCQkJICAgICAgIGZuX25hbWUsIHRoaXMsIHRoaXMvKGRvdWJsZSlmbl9sZW4pOworCQkJZWxzZQorCQkJCXByaW50ZigiJTZpICUtNDBzICU4LjRmXG4iLAorCQkJCSAgICAgICB0aGlzLCBmbl9uYW1lLCB0aGlzLyhkb3VibGUpZm5fbGVuKTsKKwkJCWlmIChvcHRTdWIpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2NhbjsKKworCQkJCWZvciAoc2NhbiA9IChmbl9hZGQtYWRkMCkvc3RlcCArIDE7CisJCQkJICAgICBzY2FuIDwgKG5leHRfYWRkLWFkZDApL3N0ZXA7IHNjYW4rKykgeworCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKKworCQkJCQlhZGRyID0gKHNjYW4gLSAxKSpzdGVwICsgYWRkMDsKKwkJCQkJcHJpbnRmKCJcdCUjbGx4XHQlcyslI2xseFx0JXVcbiIsCisJCQkJCSAgICAgICBhZGRyLCBmbl9uYW1lLCBhZGRyIC0gZm5fYWRkLAorCQkJCQkgICAgICAgYnVmW3NjYW5dKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmbl9hZGQgPSBuZXh0X2FkZDsKKwkJc3RyY3B5KGZuX25hbWUsIG5leHRfbmFtZSk7CisKKwkJbWFwbGluZW5vKys7CisJfQorCisJLyogY2xvY2sgdGlja3MsIG91dCBvZiBrZXJuZWwgdGV4dCAtIHByb2JhYmx5IG1vZHVsZXMgKi8KKwlwcmludGYoIiU2aSAlc1xuIiwgYnVmW2xlbi9zaXplb2YoKmJ1ZiktMV0sICIqdW5rbm93bioiKTsKKworCS8qIHRyYWlsZXIgKi8KKwlpZiAob3B0VmVyYm9zZSkKKwkJcHJpbnRmKCIlMDE2eCAlLTQwcyAlNmkgJTguNGZcbiIsCisJCSAgICAgICAwLCAidG90YWwiLCB0b3RhbCwgdG90YWwvKGRvdWJsZSkoZm5fYWRkLWFkZDApKTsKKwllbHNlCisJCXByaW50ZigiJTZpICUtNDBzICU4LjRmXG4iLAorCQkgICAgICAgdG90YWwsICJ0b3RhbCIsIHRvdGFsLyhkb3VibGUpKGZuX2FkZC1hZGQwKSk7CisKKwlmY2xvc2UobWFwKTsKKwlmcmVlKGJ1Zik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9yZXYuYyBiL3V0aWwtbGludXgvcmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxYjIyZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvcmV2LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiByZXYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX1JFVihBUFBMRVQocmV2LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUkVWKSArPSByZXYubworCisvL2NvbmZpZzpjb25maWcgUkVWCisvL2NvbmZpZzoJYm9vbCAicmV2IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJldmVyc2UgbGluZXMgb2YgYSBmaWxlIG9yIGZpbGVzLgorCisvL3VzYWdlOiNkZWZpbmUgcmV2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgcmV2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiUmV2ZXJzZSBsaW5lcyBvZiBGSUxFIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKyN1bmRlZiBDSEFSX1QKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisjIGRlZmluZSBDSEFSX1Qgd2NoYXJfdAorI2Vsc2UKKyMgZGVmaW5lIENIQVJfVCBjaGFyCisjZW5kaWYKKworLyogSW4tcGxhY2UgaW52ZXJ0ICovCitzdGF0aWMgdm9pZCBzdHJyZXYoQ0hBUl9UICpzLCBpbnQgbGVuKQoreworCWludCBpOworCisJaWYgKGxlbiAhPSAwKSB7CisJCWxlbi0tOworCQlpZiAobGVuICE9IDAgJiYgc1tsZW5dID09ICdcbicpCisJCQlsZW4tLTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGxlbi0tKSB7CisJCUNIQVJfVCBjID0gc1tpXTsKKwkJc1tpXSA9IHNbbGVuXTsKKwkJc1tsZW5dID0gYzsKKwl9Cit9CisKK2ludCByZXZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJldl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbDsKKwlzaXplX3QgYnVmc2l6ZTsKKwljaGFyICpidWY7CisKKwlpbml0X3VuaWNvZGUoKTsKKworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pCisJCWFyZ3YgPSAoY2hhciAqKikmYmJfYXJndl9kYXNoOworCisJcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWJ1ZnNpemUgPSAyNTY7CisJYnVmID0geG1hbGxvYyhidWZzaXplKTsKKwlkbyB7CisJCXNpemVfdCBwb3M7CisJCUZJTEUgKmZwOworCisJCWZwID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndisrKTsKKwkJaWYgKCFmcCkgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKworCQlwb3MgPSAwOworCQl3aGlsZSAoMSkgeworCQkJLyogUmVhZCBvbmUgbGluZSAqLworCQkJYnVmW2J1ZnNpemUgLSAxXSA9IDE7IC8qIG5vdCAwICovCisJCQlpZiAoIWZnZXRzKGJ1ZiArIHBvcywgYnVmc2l6ZSAtIHBvcywgZnApKQorCQkJCWJyZWFrOyAvKiBFT0YvZXJyb3IgKi8KKwkJCWlmIChidWZbYnVmc2l6ZSAtIDFdID09ICdcMCcgLyogZmdldHMgZmlsbGVkIGVudGlyZSBidWZmZXIgKi8KKwkJCSAmJiBidWZbYnVmc2l6ZSAtIDJdICE9ICdcbicgLyogYW5kIGRpZCBub3QgcmVhZCAnXG4nICovCisJCQkgJiYgIWZlb2YoZnApCisJCQkpIHsKKwkJCQkvKiBMaW5lIGlzIHRvbyBsb25nLCBleHRlbmQgYnVmZmVyICovCisJCQkJcG9zID0gYnVmc2l6ZSAtIDE7CisJCQkJYnVmc2l6ZSArPSA2NCArIGJ1ZnNpemUgLyA4OworCQkJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgYnVmc2l6ZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFByb2Nlc3MgYW5kIHByaW50IGl0ICovCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJeworCQkJCXdjaGFyX3QgKnRtcCA9IHhtYWxsb2MoYnVmc2l6ZSAqIHNpemVvZih3Y2hhcl90KSk7CisJCQkJLyogQ29udmVydCB0byB3Y2hhcl90IChtaWdodCBlcnJvciBvdXQhKSAqLworCQkJCWludCBsZW4gID0gbWJzdG93Y3ModG1wLCBidWYsIGJ1ZnNpemUpOworCQkJCWlmIChsZW4gPj0gMCkgeworCQkJCQlzdHJyZXYodG1wLCBsZW4pOworCQkJCQkvKiBDb252ZXJ0IGJhY2sgdG8gY2hhciAqLworCQkJCQl3Y3N0b21icyhidWYsIHRtcCwgYnVmc2l6ZSk7CisJCQkJfQorCQkJCWZyZWUodG1wKTsKKwkJCX0KKyNlbHNlCisJCQlzdHJyZXYoYnVmLCBzdHJsZW4oYnVmKSk7CisjZW5kaWYKKwkJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwkJfQorCQlmY2xvc2UoZnApOworCX0gd2hpbGUgKCphcmd2KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShidWYpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ydGN3YWtlLmMgYi91dGlsLWxpbnV4L3J0Y3dha2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVhMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ydGN3YWtlLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBydGN3YWtlIC0tIGVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlIHVudGlsIHNwZWNpZmllZCB3YWtldXAgdGltZS4KKyAqCisgKiBUaGlzIHZlcnNpb24gd2FzIHRha2VuIGZyb20gdXRpbC1saW51eCBhbmQgc2NydWJiZWQgZG93biBmb3IgYnVzeWJveC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgdXNlcyBjcm9zcy1wbGF0Zm9ybSBMaW51eCBpbnRlcmZhY2VzIHRvIGVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlLAorICogYW5kIGxlYXZlIGl0IG5vIGxhdGVyIHRoYW4gYSBzcGVjaWZpZWQgdGltZS4gIEl0IHVzZXMgYW55IFJUQyBmcmFtZXdvcmsKKyAqIGRyaXZlciB0aGF0IHN1cHBvcnRzIHN0YW5kYXJkIGRyaXZlciBtb2RlbCB3YWtldXAgZmxhZ3MuCisgKgorICogVGhpcyBpcyBub3JtYWxseSB1c2VkIGxpa2UgdGhlIG9sZCAiYXBtc2xlZXAiIHV0aWxpdHksIHRvIHdha2UgZnJvbSBhCisgKiBzdXNwZW5kIHN0YXRlIGxpa2UgQUNQSSBTMSAoc3RhbmRieSkgb3IgUzMgKHN1c3BlbmQtdG8tUkFNKS4gIE1vc3QKKyAqIHBsYXRmb3JtcyBjYW4gaW1wbGVtZW50IHRob3NlIHdpdGhvdXQgYW5hbG9ndWVzIG9mIEJJT1MsIEFQTSwgb3IgQUNQSS4KKyAqCisgKiBPbiBzb21lIHN5c3RlbXMsIHRoaXMgY2FuIGFsc28gYmUgdXNlZCBsaWtlICJudnJhbS13YWtldXAiLCB3YWtpbmcKKyAqIGZyb20gc3RhdGVzIGxpa2UgQUNQSSBTNCAoc3VzcGVuZCB0byBkaXNrKS4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlCisgKiBwZXJzaXN0ZW50IG1lZGlhIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciBzdWNoIHN1c3BlbmQgbW9kZXMuCisgKgorICogVGhlIGJlc3Qgd2F5IHRvIHNldCB0aGUgc3lzdGVtJ3MgUlRDIGlzIHNvIHRoYXQgaXQgaG9sZHMgdGhlIGN1cnJlbnQKKyAqIHRpbWUgaW4gVVRDLiAgVXNlIHRoZSAiLWwiIGZsYWcgdG8gdGVsbCB0aGlzIHByb2dyYW0gdGhhdCB0aGUgc3lzdGVtCisgKiBSVEMgdXNlcyBhIGxvY2FsIHRpbWV6b25lIGluc3RlYWQgKG1heWJlIHlvdSBkdWFsLWJvb3QgTVMtV2luZG93cykuCisgKiBUaGF0IGZsYWcgc2hvdWxkIG5vdCBiZSBuZWVkZWQgb24gc3lzdGVtcyB3aXRoIGFkanRpbWUgc3VwcG9ydC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnRjd2FrZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hIHwgLWwgfCAtdV0gWy1kIERFVl0gWy1tIE1PREVdIFstcyBTRUMgfCAtdCBUSU1FXSIKKy8vdXNhZ2U6I2RlZmluZSBydGN3YWtlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRW50ZXIgYSBzeXN0ZW0gc2xlZXAgc3RhdGUgdW50aWwgc3BlY2lmaWVkIHdha2V1cCB0aW1lXG4iCisvL3VzYWdlOglJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1hLC0tYXV0bwlSZWFkIGNsb2NrIG1vZGUgZnJvbSBhZGp0aW1lIgorLy91c2FnZTogICAgICJcbgktbCwtLWxvY2FsCUNsb2NrIGlzIHNldCB0byBsb2NhbCB0aW1lIgorLy91c2FnZTogICAgICJcbgktdSwtLXV0YwlDbG9jayBpcyBzZXQgdG8gVVRDIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1kLC0tZGV2aWNlPURFVglTcGVjaWZ5IHRoZSBSVEMgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgktbSwtLW1vZGU9TU9ERQlTZXQgdGhlIHNsZWVwIHN0YXRlIChkZWZhdWx0OiBzdGFuZGJ5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zZWNvbmRzPVNFQyBTZXQgdGhlIHRpbWVvdXQgaW4gU0VDIHNlY29uZHMgZnJvbSBub3ciCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdGltZT1USU1FCVNldCB0aGUgdGltZW91dCB0byBUSU1FIHNlY29uZHMgZnJvbSBlcG9jaCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1hCVJlYWQgY2xvY2sgbW9kZSBmcm9tIGFkanRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1sCUNsb2NrIGlzIHNldCB0byBsb2NhbCB0aW1lIgorLy91c2FnZTogICAgICJcbgktdQlDbG9jayBpcyBzZXQgdG8gVVRDIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS1kIERFVglTcGVjaWZ5IHRoZSBSVEMgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgktbSBNT0RFCVNldCB0aGUgc2xlZXAgc3RhdGUgKGRlZmF1bHQ6IHN0YW5kYnkpIgorLy91c2FnZTogICAgICJcbgktcyBTRUMJU2V0IHRoZSB0aW1lb3V0IGluIFNFQyBzZWNvbmRzIGZyb20gbm93IgorLy91c2FnZTogICAgICJcbgktdCBUSU1FCVNldCB0aGUgdGltZW91dCB0byBUSU1FIHNlY29uZHMgZnJvbSBlcG9jaCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRjXy5oIgorCisjZGVmaW5lIFNZU19SVENfUEFUSCAgICIvc3lzL2NsYXNzL3J0Yy8lcy9kZXZpY2UvcG93ZXIvd2FrZXVwIgorI2RlZmluZSBTWVNfUE9XRVJfUEFUSCAiL3N5cy9wb3dlci9zdGF0ZSIKKyNkZWZpbmUgREVGQVVMVF9NT0RFICAgInN0YW5kYnkiCisKK3N0YXRpYyBOT0lOTElORSBib29sIG1heV93YWtldXAoY29uc3QgY2hhciAqcnRjbmFtZSkKK3sKKwlzc2l6ZV90IHJldDsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogc3RyaXAgIi9kZXYvIiBmcm9tIHRoZSBydGNuYW1lIGhlcmUgKi8KKwlydGNuYW1lID0gc2tpcF9kZXZfcGZ4KHJ0Y25hbWUpOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgU1lTX1JUQ19QQVRILCBydGNuYW1lKTsKKwlyZXQgPSBvcGVuX3JlYWRfY2xvc2UoYnVmLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogd2FrZXVwIGV2ZW50cyBjb3VsZCBiZSBkaXNhYmxlZCBvciBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIHN0cm5jbXAoYnVmLCAiZW5hYmxlZFxuIiwgOCkgPT0gMDsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2V0dXBfYWxhcm0oaW50IGZkLCB0aW1lX3QgKndha2V1cCwgdGltZV90IHJ0Y190aW1lKQoreworCXN0cnVjdCB0bSAqcHRtOworCXN0cnVjdCBsaW51eF9ydGNfd2thbHJtIHdha2U7CisKKwkvKiBUaGUgd2FrZXVwIHRpbWUgaXMgaW4gUE9TSVggdGltZSAobW9yZSBvciBsZXNzIFVUQykuCisJICogSWRlYWxseSBSVENzIHVzZSB0aGF0IHNhbWUgdGltZTsgYnV0IFBDcyBjYW4ndCBkbyB0aGF0CisJICogaWYgdGhleSBuZWVkIHRvIGJvb3QgTVMtV2luZG93cy4gIE1lc3N5Li4uCisJICoKKwkgKiBXaGVuIHJ1bm5pbmcgaW4gdXRjIG1vZGUgdGhpcyBwcm9jZXNzJ3MgdGltZXpvbmUgaXMgVVRDLAorCSAqIHNvIHdlJ2xsIHBhc3MgYSBVVEMgZGF0ZSB0byB0aGUgUlRDLgorCSAqCisJICogRWxzZSBtb2RlIGlzIGxvY2FsIHNvIHRoZSB0aW1lIGdpdmVuIHRvIHRoZSBSVEMKKwkgKiB3aWxsIGluc3RlYWQgdXNlIHRoZSBsb2NhbCB0aW1lIHpvbmUuCisJICovCisJcHRtID0gbG9jYWx0aW1lKHdha2V1cCk7CisKKwl3YWtlLnRpbWUudG1fc2VjID0gcHRtLT50bV9zZWM7CisJd2FrZS50aW1lLnRtX21pbiA9IHB0bS0+dG1fbWluOworCXdha2UudGltZS50bV9ob3VyID0gcHRtLT50bV9ob3VyOworCXdha2UudGltZS50bV9tZGF5ID0gcHRtLT50bV9tZGF5OworCXdha2UudGltZS50bV9tb24gPSBwdG0tPnRtX21vbjsKKwl3YWtlLnRpbWUudG1feWVhciA9IHB0bS0+dG1feWVhcjsKKwkvKiB3ZGF5LCB5ZGF5LCBhbmQgaXNkc3QgZmllbGRzIGFyZSB1bnVzZWQgYnkgTGludXggKi8KKwl3YWtlLnRpbWUudG1fd2RheSA9IC0xOworCXdha2UudGltZS50bV95ZGF5ID0gLTE7CisJd2FrZS50aW1lLnRtX2lzZHN0ID0gLTE7CisKKwkvKiBtYW55IHJ0YyBhbGFybXMgb25seSBzdXBwb3J0IHVwIHRvIDI0IGhvdXJzIGZyb20gJ25vdycsCisJICogc28gdXNlIHRoZSAibW9yZSB0aGFuIDI0IGhvdXJzIiByZXF1ZXN0IG9ubHkgaWYgd2UgbXVzdAorCSAqLworCWlmICgocnRjX3RpbWUgKyAoMjQgKiA2MCAqIDYwKSkgPiAqd2FrZXVwKSB7CisJCXhpb2N0bChmZCwgUlRDX0FMTV9TRVQsICZ3YWtlLnRpbWUpOworCQl4aW9jdGwoZmQsIFJUQ19BSUVfT04sIDApOworCX0gZWxzZSB7CisJCS8qIGF2b2lkIGFuIGV4dHJhIEFJRV9PTiBjYWxsICovCisJCXdha2UuZW5hYmxlZCA9IDE7CisJCXhpb2N0bChmZCwgUlRDX1dLQUxNX1NFVCwgJndha2UpOworCX0KK30KKworI2RlZmluZSBSVENXQUtFX09QVF9BVVRPICAgICAgICAgMHgwMQorI2RlZmluZSBSVENXQUtFX09QVF9MT0NBTCAgICAgICAgMHgwMgorI2RlZmluZSBSVENXQUtFX09QVF9VVEMgICAgICAgICAgMHgwNAorI2RlZmluZSBSVENXQUtFX09QVF9ERVZJQ0UgICAgICAgMHgwOAorI2RlZmluZSBSVENXQUtFX09QVF9TVVNQRU5EX01PREUgMHgxMAorI2RlZmluZSBSVENXQUtFX09QVF9TRUNPTkRTICAgICAgMHgyMAorI2RlZmluZSBSVENXQUtFX09QVF9USU1FICAgICAgICAgMHg0MAorCitpbnQgcnRjd2FrZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnRjd2FrZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdGltZV90IHJ0Y190aW1lOworCisJdW5zaWduZWQgb3B0OworCWNvbnN0IGNoYXIgKnJ0Y25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnN1c3BlbmQ7CisJY29uc3QgY2hhciAqb3B0X3NlY29uZHM7CisJY29uc3QgY2hhciAqb3B0X3RpbWU7CisKKwl0aW1lX3Qgc3lzX3RpbWU7CisJdGltZV90IGFsYXJtX3RpbWUgPSAwOworCXVuc2lnbmVkIHNlY29uZHMgPSAwOworCWludCB1dGMgPSAtMTsKKwlpbnQgZmQ7CisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgcnRjd2FrZV9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJhdXRvXDAiICAgIE5vX2FyZ3VtZW50ICJhIgorCQkibG9jYWxcMCIgICBOb19hcmd1bWVudCAibCIKKwkJInV0Y1wwIiAgICAgTm9fYXJndW1lbnQgInUiCisJCSJkZXZpY2VcMCIgIFJlcXVpcmVkX2FyZ3VtZW50ICJkIgorCQkibW9kZVwwIiAgICBSZXF1aXJlZF9hcmd1bWVudCAibSIKKwkJInNlY29uZHNcMCIgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJCSJ0aW1lXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQk7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHJ0Y3dha2VfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYWx1ZDptOnM6dDoiLCAmcnRjbmFtZSwgJnN1c3BlbmQsICZvcHRfc2Vjb25kcywgJm9wdF90aW1lKTsKKworCS8qIHRoaXMgaXMgdGhlIGRlZmF1bHQKKwlpZiAob3B0ICYgUlRDV0FLRV9PUFRfQVVUTykKKwkJdXRjID0gLTE7CisJKi8KKwlpZiAob3B0ICYgKFJUQ1dBS0VfT1BUX1VUQyB8IFJUQ1dBS0VfT1BUX0xPQ0FMKSkKKwkJdXRjID0gb3B0ICYgUlRDV0FLRV9PUFRfVVRDOworCWlmICghKG9wdCAmIFJUQ1dBS0VfT1BUX1NVU1BFTkRfTU9ERSkpCisJCXN1c3BlbmQgPSBERUZBVUxUX01PREU7CisJaWYgKG9wdCAmIFJUQ1dBS0VfT1BUX1NFQ09ORFMpCisJCS8qIGFsYXJtIHRpbWUsIHNlY29uZHMtdG8tc2xlZXAgKHJlbGF0aXZlKSAqLworCQlzZWNvbmRzID0geGF0b2kob3B0X3NlY29uZHMpOworCWlmIChvcHQgJiBSVENXQUtFX09QVF9USU1FKQorCQkvKiBhbGFybSB0aW1lLCB0aW1lX3QgKGFic29sdXRlLCBzZWNvbmRzIHNpbmNlIDEvMSAxOTcwIFVUQykgKi8KKwkJYWxhcm1fdGltZSA9IHhhdG9sKG9wdF90aW1lKTsKKworCWlmICghYWxhcm1fdGltZSAmJiAhc2Vjb25kcykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm11c3QgcHJvdmlkZSB3YWtlIHRpbWUiKTsKKworCWlmICh1dGMgPT0gLTEpCisJCXV0YyA9IHJ0Y19hZGp0aW1lX2lzX3V0YygpOworCisJLyogdGhlIHJ0Y25hbWUgaXMgcmVsYXRpdmUgdG8gL2RldiAqLworCXhjaGRpcigiL2RldiIpOworCisJLyogdGhpcyBSVEMgbXVzdCBleGlzdCBhbmQgKGlmIHdlJ2xsIHNsZWVwKSBiZSB3YWtldXAtZW5hYmxlZCAqLworCWZkID0gcnRjX3hvcGVuKCZydGNuYW1lLCBPX1JET05MWSk7CisKKwlpZiAoc3RyY21wKHN1c3BlbmQsICJvbiIpICYmICFtYXlfd2FrZXVwKHJ0Y25hbWUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgbm90IGVuYWJsZWQgZm9yIHdha2V1cCBldmVudHMiLCBydGNuYW1lKTsKKworCS8qIHJlbGF0aXZlIG9yIGFic29sdXRlIGFsYXJtIHRpbWUsIG5vcm1hbGl6ZWQgdG8gdGltZV90ICovCisJc3lzX3RpbWUgPSB0aW1lKE5VTEwpOworCXsKKwkJc3RydWN0IHRtIHRtX3RpbWU7CisJCXJ0Y19yZWFkX3RtKCZ0bV90aW1lLCBmZCk7CisJCXJ0Y190aW1lID0gcnRjX3RtMnRpbWUoJnRtX3RpbWUsIHV0Yyk7CisJfQorCisKKwlpZiAoYWxhcm1fdGltZSkgeworCQlpZiAoYWxhcm1fdGltZSA8IHN5c190aW1lKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWUgZG9lc24ndCBnbyBiYWNrd2FyZCB0byAlcyIsIGN0aW1lKCZhbGFybV90aW1lKSk7CisJCWFsYXJtX3RpbWUgKz0gc3lzX3RpbWUgLSBydGNfdGltZTsKKwl9IGVsc2UKKwkJYWxhcm1fdGltZSA9IHJ0Y190aW1lICsgc2Vjb25kcyArIDE7CisJc2V0dXBfYWxhcm0oZmQsICZhbGFybV90aW1lLCBydGNfdGltZSk7CisKKwlzeW5jKCk7CisJcHJpbnRmKCJ3YWtldXAgZnJvbSBcIiVzXCIgYXQgJXMiLCBzdXNwZW5kLCBjdGltZSgmYWxhcm1fdGltZSkpOworCWZmbHVzaF9hbGwoKTsKKwl1c2xlZXAoMTAgKiAxMDAwKTsKKworCWlmIChzdHJjbXAoc3VzcGVuZCwgIm9uIikpCisJCXhvcGVuX3h3cml0ZV9jbG9zZShTWVNfUE9XRVJfUEFUSCwgc3VzcGVuZCk7CisJZWxzZSB7CisJCS8qICJmYWtlIiBzdXNwZW5kIC4uLiB3ZSdsbCBkbyB0aGUgZGVsYXkgb3Vyc2VsdmVzICovCisJCXVuc2lnbmVkIGxvbmcgZGF0YTsKKworCQlkbyB7CisJCQlzc2l6ZV90IHJldCA9IHNhZmVfcmVhZChmZCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coInJ0YyByZWFkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKCEoZGF0YSAmIFJUQ19BRikpOworCX0KKworCXhpb2N0bChmZCwgUlRDX0FJRV9PRkYsIDApOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9zY3JpcHQuYyBiL3V0aWwtbGludXgvc2NyaXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiOTkxZAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvc2NyaXB0LmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNjcmlwdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIHBhc2NhbC5iZWxsYXJkQGFkcy1sdS5jb20KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gdXRpbC1saW51eCB2IDIuMTJyCisgKiBDb3B5cmlnaHQgKGMpIDE5ODAKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNjcmlwdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hZnEiIElGX1NDUklQVFJFUExBWSgidCIpICJdIFstYyBQUk9HXSBbT1VURklMRV0iCisvL3VzYWdlOiNkZWZpbmUgc2NyaXB0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUFwcGVuZCBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1jIFBST0cJUnVuIFBST0csIG5vdCBzaGVsbCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRmx1c2ggb3V0cHV0IGFmdGVyIGVhY2ggd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZToJSUZfU0NSSVBUUkVQTEFZKAorLy91c2FnZTogICAgICJcbgktdAlTZW5kIHRpbWluZyB0byBzdGRlcnIiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2NyaXB0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzY3JpcHRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBvcHQ7CisJaW50IG1vZGU7CisJaW50IGNoaWxkX3BpZDsKKwlpbnQgYXR0cl9vazsgLyogTkI6IDA6IG9rICovCisJaW50IHdpbnN6X29rOworCWludCBwdHk7CisJY2hhciBwdHlfbGluZVtHRVRQVFlfQlVGU0laRV07CisJc3RydWN0IHRlcm1pb3MgdHQsIHJ0dDsKKwlzdHJ1Y3Qgd2luc2l6ZSB3aW47CisJY29uc3QgY2hhciAqZm5hbWUgPSAidHlwZXNjcmlwdCI7CisJY29uc3QgY2hhciAqc2hlbGw7CisJY2hhciBzaGVsbF9vcHRbXSA9ICItaSI7CisJY2hhciAqc2hlbGxfYXJnID0gTlVMTDsKKwllbnVtIHsKKwkJT1BUX2EgPSAoMSA8PCAwKSwKKwkJT1BUX2MgPSAoMSA8PCAxKSwKKwkJT1BUX2YgPSAoMSA8PCAyKSwKKwkJT1BUX3EgPSAoMSA8PCAzKSwKKwkJT1BUX3QgPSAoMSA8PCA0KSwKKwl9OworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIGdldG9wdF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJhcHBlbmRcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCQkiY29tbWFuZFwwIiBSZXF1aXJlZF9hcmd1bWVudCAiYyIKKwkJImZsdXNoXDAiICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJCSJxdWlldFwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCQlJRl9TQ1JJUFRSRVBMQVkoInRpbWluZ1wwIiBOb19hcmd1bWVudCAidCIpCisJCTsKKworCWFwcGxldF9sb25nX29wdGlvbnMgPSBnZXRvcHRfbG9uZ29wdHM7CisjZW5kaWYKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsgLyogbWF4IG9uZSBhcmcgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYWM6ZnEiIElGX1NDUklQVFJFUExBWSgidCIpICwgJnNoZWxsX2FyZyk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlswXSkgeworCQlmbmFtZSA9IGFyZ3ZbMF07CisJfQorCW1vZGUgPSBPX0NSRUFUfE9fVFJVTkN8T19XUk9OTFk7CisJaWYgKG9wdCAmIE9QVF9hKSB7CisJCW1vZGUgPSBPX0NSRUFUfE9fQVBQRU5EfE9fV1JPTkxZOworCX0KKwlpZiAob3B0ICYgT1BUX2MpIHsKKwkJc2hlbGxfb3B0WzFdID0gJ2MnOworCX0KKwlpZiAoIShvcHQgJiBPUFRfcSkpIHsKKwkJcHJpbnRmKCJTY3JpcHQgc3RhcnRlZCwgZmlsZSBpcyAlc1xuIiwgZm5hbWUpOworCX0KKwlzaGVsbCA9IGdldF9zaGVsbF9uYW1lKCk7CisKKwlwdHkgPSB4Z2V0cHR5KHB0eV9saW5lKTsKKworCS8qIGdldCBjdXJyZW50IHN0ZGluJ3MgdHR5IHBhcmFtcyAqLworCWF0dHJfb2sgPSB0Y2dldGF0dHIoMCwgJnR0KTsKKwl3aW5zel9vayA9IGlvY3RsKDAsIFRJT0NHV0lOU1osIChjaGFyICopJndpbik7CisKKwlydHQgPSB0dDsKKwljZm1ha2VyYXcoJnJ0dCk7CisJcnR0LmNfbGZsYWcgJj0gfkVDSE87CisJdGNzZXRhdHRyKDAsIFRDU0FGTFVTSCwgJnJ0dCk7CisKKwkvKiAic2NyaXB0IiBmcm9tIHV0aWwtbGludXggZXhpdHMgd2hlbiBjaGlsZCBleGl0cywKKwkgKiB3ZSB3b3VsZG4ndCB3YWl0IGZvciBFT0YgZnJvbSBzbGF2ZSBwdHkKKwkgKiAob3V0cHV0IG1heSBiZSBwcm9kdWNlZCBieSBncmFuZGNoaWxkcmVuIG9mIGNoaWxkKSAqLworCXNpZ25hbChTSUdDSExELCByZWNvcmRfc2lnbm8pOworCisJLyogVE9ETzogU0lHV0lOQ0g/IHBhc3Mgd2luZG93IHNpemUgY2hhbmdlcyBkb3duIHRvIHNsYXZlPyAqLworCisJY2hpbGRfcGlkID0geHZmb3JrKCk7CisKKwlpZiAoY2hpbGRfcGlkKSB7CisJCS8qIHBhcmVudCAqLworI2RlZmluZSBidWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJCWludCBvdXRmZCwgY291bnQsIGxvb3A7CisJCWRvdWJsZSBvbGR0aW1lID0gRU5BQkxFX1NDUklQVFJFUExBWSA/IHRpbWUoTlVMTCkgOiAwOworCQlzbWFsbGludCBmZF9jb3VudCA9IDI7CisKKwkJb3V0ZmQgPSB4b3BlbihmbmFtZSwgbW9kZSk7CisJCXBmZFswXS5mZCA9IHB0eTsKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJcGZkWzFdLmZkID0gU1RESU5fRklMRU5POworCQlwZmRbMV0uZXZlbnRzID0gUE9MTElOOworCQluZGVsYXlfb24ocHR5KTsgLyogdGhpcyBkZXNjcmlwdG9yIGlzIG5vdCBzaGFyZWQsIGNhbiBkbyB0aGlzICovCisJCS8qIG5kZWxheV9vbihTVERJTl9GSUxFTk8pOyAtIE5PLCBzdGRpbiBjYW4gYmUgc2hhcmVkISBQaXR5IDooICovCisKKwkJLyogY29weSBzdGRpbiB0byBwdHkgbWFzdGVyIGlucHV0LAorCQkgKiBjb3B5IHB0eSBtYXN0ZXIgb3V0cHV0IHRvIHN0ZG91dCBhbmQgZmlsZSAqLworCQkvKiBUT0RPOiBkb24ndCB1c2UgZnVsbF93cml0ZSdzLCB1c2UgcHJvcGVyIHdyaXRlIGJ1ZmZlcmluZyAqLworCQl3aGlsZSAoZmRfY291bnQgJiYgIWJiX2dvdF9zaWduYWwpIHsKKwkJCS8qIG5vdCBzYWZlX3BvbGwhIHdlIHdhbnQgU0lHQ0hMRCB0byBFSU5UUiBwb2xsICovCisJCQlpZiAocG9sbChwZmQsIGZkX2NvdW50LCAtMSkgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQkJLyogSWYgY2hpbGQgZXhpdHMgdG9vIHF1aWNrbHksIHdlIG1heSBnZXQgRUlPOgorCQkJCSAqIGZvciBleGFtcGxlLCB0cnkgInNjcmlwdCAtYyB0cnVlIiAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBmZFswXS5yZXZlbnRzKSB7CisJCQkJZXJybm8gPSAwOworCQkJCWNvdW50ID0gc2FmZV9yZWFkKHB0eSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGNvdW50IDw9IDAgJiYgZXJybm8gIT0gRUFHQUlOKSB7CisJCQkJCS8qIGVyci9lb2YgZnJvbSBwdHk6IGV4aXQgKi8KKwkJCQkJZ290byByZXN0b3JlOworCQkJCX0KKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWlmIChFTkFCTEVfU0NSSVBUUkVQTEFZICYmIChvcHQgJiBPUFRfdCkpIHsKKwkJCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQkJCQkJZG91YmxlIG5ld3RpbWU7CisKKwkJCQkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJCQkJbmV3dGltZSA9IHR2LnR2X3NlYyArIChkb3VibGUpIHR2LnR2X3VzZWMgLyAxMDAwMDAwOworCQkJCQkJZnByaW50ZihzdGRlcnIsICIlZiAldVxuIiwgbmV3dGltZSAtIG9sZHRpbWUsIGNvdW50KTsKKwkJCQkJCW9sZHRpbWUgPSBuZXd0aW1lOworCQkJCQl9CisJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBjb3VudCk7CisJCQkJCWZ1bGxfd3JpdGUob3V0ZmQsIGJ1ZiwgY291bnQpOworCQkJCQlpZiAob3B0ICYgT1BUX2YpIHsKKwkJCQkJCWZzeW5jKG91dGZkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChwZmRbMV0ucmV2ZW50cykgeworCQkJCWNvdW50ID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGNvdW50IDw9IDApIHsKKwkJCQkJLyogZXJyL2VvZiBmcm9tIHN0ZGluOiBkb24ndCByZWFkIHN0ZGluIGFueW1vcmUgKi8KKwkJCQkJcGZkWzFdLnJldmVudHMgPSAwOworCQkJCQlmZF9jb3VudC0tOworCQkJCX0gZWxzZSB7CisJCQkJCWZ1bGxfd3JpdGUocHR5LCBidWYsIGNvdW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogSWYgbG9vcCB3YXMgZXhpdGVkIGJlY2F1c2UgU0lHQ0hMRCBoYW5kbGVyIHNldCBiYl9nb3Rfc2lnbmFsLAorCQkgKiB0aGVyZSBzdGlsbCBjYW4gYmUgc29tZSBidWZmZXJlZCBvdXRwdXQuIEJ1dCBkb250IGxvb3AgZm9yZXZlcjoKKwkJICogd2Ugd29uJ3QgcHVtcCBvcnBoYW5lZCBncmFuZGNoaWxkcmVuJ3Mgb3V0cHV0IGluZGVmaW5pdGVseS4KKwkJICogVGVzdGNhc2U6IHJ1bm5pbmcgdGhpcyBpbiBzY3JpcHQ6CisJCSAqICAgICAgZXhlYyBkZCBpZj0vZGV2L3plcm8gYnM9MU0gY291bnQ9MQorCQkgKiBtdXN0IGhhdmUgIjErMCByZWNvcmRzIGluLCAxKzAgcmVjb3JkcyBvdXQiIGNhcHR1cmVkIHRvby4KKwkJICogKHV0aWwtbGludXgncyBzY3JpcHQgZG9lc24ndCBkbyB0aGlzLiBidWdneSA6KSAqLworCQlsb29wID0gOTk5OworCQkvKiBwdHkgaXMgaW4gT19OT05CTE9DSyBtb2RlLCB3ZSBleGl0IGFzIHNvb24gYXMgYnVmZmVyIGlzIGVtcHR5ICovCisJCXdoaWxlICgtLWxvb3AgJiYgKGNvdW50ID0gc2FmZV9yZWFkKHB0eSwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkgeworCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIGNvdW50KTsKKwkJCWZ1bGxfd3JpdGUob3V0ZmQsIGJ1ZiwgY291bnQpOworCQl9CisgcmVzdG9yZToKKwkJaWYgKGF0dHJfb2sgPT0gMCkKKwkJCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZ0dCk7CisJCWlmICghKG9wdCAmIE9QVF9xKSkKKwkJCXByaW50ZigiU2NyaXB0IGRvbmUsIGZpbGUgaXMgJXNcbiIsIGZuYW1lKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBjaGlsZDogbWFrZSBwdHkgc2xhdmUgdG8gYmUgaW5wdXQsIG91dHB1dCwgZXJyb3I7IHJ1biBzaGVsbCAqLworCWNsb3NlKHB0eSk7IC8qIGNsb3NlIHB0eSBtYXN0ZXIgKi8KKwkvKiBvcGVuIHB0eSBzbGF2ZSB0byBmZCAwLDEsMiAqLworCWNsb3NlKDApOworCXhvcGVuKHB0eV9saW5lLCBPX1JEV1IpOyAvKiB1c2VzIGZkIDAgKi8KKwl4ZHVwMigwLCAxKTsKKwl4ZHVwMigwLCAyKTsKKwkvKiBjb3B5IG91ciBvcmlnaW5hbCBzdGRpbiB0dHkncyBwYXJhbWV0ZXJzIHRvIHB0eSAqLworCWlmIChhdHRyX29rID09IDApCisJCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZ0dCk7CisJaWYgKHdpbnN6X29rID09IDApCisJCWlvY3RsKDAsIFRJT0NTV0lOU1osIChjaGFyICopJndpbik7CisJLyogc2V0IHB0eSBhcyBhIGNvbnRyb2xsaW5nIHR0eSAqLworCXNldHNpZCgpOworCWlvY3RsKDAsIFRJT0NTQ1RUWSwgMCAvKiAwOiBkb24ndCBmb3JjaWJseSBzdGVhbCAqLyk7CisKKwkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJLypzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ki8KKwlleGVjbChzaGVsbCwgc2hlbGwsIHNoZWxsX29wdCwgc2hlbGxfYXJnLCAoY2hhciAqKSBOVUxMKTsKKwliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKHNoZWxsKTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvc2NyaXB0cmVwbGF5LmMgYi91dGlsLWxpbnV4L3NjcmlwdHJlcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3NjcmlwdHJlcGxheS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNjcmlwdHJlcGxheSAtIHBsYXkgYmFjayB0eXBlc2NyaXB0cywgdXNpbmcgdGltaW5nIGluZm9ybWF0aW9uCisgKgorICogcGFzY2FsLmJlbGxhcmRAYWRzLWx1LmNvbQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRyZXBsYXlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInRpbWluZ2ZpbGUgW3R5cGVzY3JpcHQgW2Rpdmlzb3JdXSIKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRyZXBsYXlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQbGF5IGJhY2sgdHlwZXNjcmlwdHMsIHVzaW5nIHRpbWluZyBpbmZvcm1hdGlvbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzY3JpcHRyZXBsYXlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNjcmlwdHJlcGxheV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqc2NyaXB0ID0gInR5cGVzY3JpcHQiOworCWRvdWJsZSBkZWxheSwgZmFjdG9yID0gMTAwMDAwMC4wOworCWludCBmZDsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCUZJTEUgKnRmcDsKKworCWlmICghYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKGFyZ3ZbMl0pIHsKKwkJc2NyaXB0ID0gYXJndlsyXTsKKwkJaWYgKGFyZ3ZbM10pCisJCQlmYWN0b3IgLz0gYXRvZihhcmd2WzNdKTsKKwl9CisKKwl0ZnAgPSB4Zm9wZW5fZm9yX3JlYWQoYXJndlsxXSk7CisJZmQgPSB4b3BlbihzY3JpcHQsIE9fUkRPTkxZKTsKKwl3aGlsZSAoZnNjYW5mKHRmcCwgIiVsZiAlbHVcbiIsICZkZWxheSwgJmNvdW50KSA9PSAyKSB7CisJCXVzbGVlcChkZWxheSAqIGZhY3Rvcik7CisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGZkLCBTVERPVVRfRklMRU5PLCBjb3VudCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJCWZjbG9zZSh0ZnApOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9zZXRhcmNoLmMgYi91dGlsLWxpbnV4L3NldGFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk0MjFhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9zZXRhcmNoLmMKQEAgLTAsMCArMSw2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGludXgzMi9saW51eDY0IGFsbG93cyBmb3IgY2hhbmdpbmcgdW5hbWUgZW11bGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRhcmNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJwZXJzb25hbGl0eSBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc2V0YXJjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlcnNvbmFsaXR5IG1heSBiZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIJbGludXgzMgkJU2V0IDMyYml0IHVuYW1lIGVtdWxhdGlvblxuIgorLy91c2FnZTogICAgICAgIglsaW51eDY0CQlTZXQgNjRiaXQgdW5hbWUgZW11bGF0aW9uIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsaW51eDMyX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBsaW51eDMyX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbGludXg2NF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgbGludXg2NF9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlIDxzeXMvcGVyc29uYWxpdHkuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRhcmNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRhcmNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcGVyczsKKworCS8qIEZpZ3VyZSBvdXQgd2hhdCBwZXJzb25hbGl0eSB3ZSBhcmUgc3VwcG9zZWQgdG8gc3dpdGNoIHRvIC4uLgorCSAqIHdlIGNhbiBiZSBpbnZva2VkIGFzIGVpdGhlcjoKKwkgKiBhcmd2WzBdLGFyZ3ZbMV0gPT0gInNldGFyY2giLCJwZXJzb25hbGl0eSIKKwkgKiBhcmd2WzBdICAgICAgICAgPT0gInBlcnNvbmFsaXR5IgorCSAqLworCWlmIChFTkFCTEVfU0VUQVJDSCAmJiBhcHBsZXRfbmFtZVswXSA9PSAncycKKwkgJiYgYXJndlsxXSAmJiBzdHJuY3B5KGFyZ3ZbMV0sICJsaW51eCIsIDUpCisJKSB7CisJCWFwcGxldF9uYW1lID0gYXJndlsxXTsKKwkJYXJndisrOworCX0KKwlpZiAoYXBwbGV0X25hbWVbNV0gPT0gJzYnKSAvKiBsaW51eDY0ICovCisJCXBlcnMgPSBQRVJfTElOVVg7CisJZWxzZSBpZiAoYXBwbGV0X25hbWVbNV0gPT0gJzMnKSAvKiBsaW51eDMyICovCisJCXBlcnMgPSBQRVJfTElOVVgzMjsKKwllbHNlCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWFyZ3YrKzsKKwlpZiAoYXJndlswXSA9PSBOVUxMKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiBUcnkgdG8gc2V0IHBlcnNvbmFsaXR5ICovCisJaWYgKHBlcnNvbmFsaXR5KHBlcnMpID49IDApIHsKKwkJLyogVHJ5IHRvIGV4ZWN1dGUgdGhlIHByb2dyYW0gKi8KKwkJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCX0KKworCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3N3YXBvbm9mZi5jIGIvdXRpbC1saW51eC9zd2Fwb25vZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNlMjRjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9zd2Fwb25vZmYuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzd2Fwb24vc3dhcG9mZiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb25fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYV0iIElGX0ZFQVRVUkVfU1dBUE9OX1BSSSgiIFstcCBQUkldIikgIiBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBzd2FwcGluZyBvbiBERVZJQ0VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU3RhcnQgc3dhcHBpbmcgb24gYWxsIHN3YXAgZGV2aWNlcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1dBUE9OX1BSSSgKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUFJJCVNldCBzd2FwIGRldmljZSBwcmlvcml0eSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc3dhcG9mZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hXSBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb2ZmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3RvcCBzd2FwcGluZyBvbiBERVZJQ0VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU3RvcCBzd2FwcGluZyBvbiBhbGwgc3dhcCBkZXZpY2VzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc3dhcC5oPgorI2lmbmRlZiBfX0JJT05JQ19fCisjIGluY2x1ZGUgPHN5cy9zd2FwLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX0xBQkVMCisjIGluY2x1ZGUgInZvbHVtZV9pZC5oIgorI2Vsc2UKKyMgZGVmaW5lIHJlc29sdmVfbW91bnRfc3BlYyhmc25hbWUpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZm5kZWYgTU5UVFlQRV9TV0FQCisjIGRlZmluZSBNTlRUWVBFX1NXQVAgInN3YXAiCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9QUkkKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgZmxhZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBnX2ZsYWdzIChHLmZsYWdzKQorI2Vsc2UKKyNkZWZpbmUgZ19mbGFncyAwCisjZW5kaWYKKworc3RhdGljIGludCBzd2FwX2VuYWJsZV9kaXNhYmxlKGNoYXIgKmRldmljZSkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBzdGF0IHN0OworCisJcmVzb2x2ZV9tb3VudF9zcGVjKCZkZXZpY2UpOworCXhzdGF0KGRldmljZSwgJnN0KTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisJLyogdGVzdCBmb3IgaG9sZXMgKi8KKwlpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJaWYgKHN0LnN0X2Jsb2NrcyAqIChvZmZfdCk1MTIgPCBzdC5zdF9zaXplKQorCQkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBzd2FwIGZpbGUgaGFzIGhvbGVzIik7CisjZW5kaWYKKworCWlmIChhcHBsZXRfbmFtZVs1XSA9PSAnbicpCisJCXN0YXR1cyA9IHN3YXBvbihkZXZpY2UsIGdfZmxhZ3MpOworCWVsc2UKKwkJc3RhdHVzID0gc3dhcG9mZihkZXZpY2UpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGRldmljZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2VtX2FsbCh2b2lkKQoreworCXN0cnVjdCBtbnRlbnQgKm07CisJRklMRSAqZjsKKwlpbnQgZXJyOworCisJZiA9IHNldG1udGVudCgiL2V0Yy9mc3RhYiIsICJyIik7CisJaWYgKGYgPT0gTlVMTCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCIvZXRjL2ZzdGFiIik7CisKKwllcnIgPSAwOworCXdoaWxlICgobSA9IGdldG1udGVudChmKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKG0tPm1udF90eXBlLCBNTlRUWVBFX1NXQVApID09IDApIHsKKwkJCS8qIHN3YXBvbiAtYSBzaG91bGQgaWdub3JlIGVudHJpZXMgd2l0aCBub2F1dG8sCisJCQkgKiBidXQgc3dhcG9mZiAtYSBzaG91bGQgcHJvY2VzcyB0aGVtICovCisJCQlpZiAoYXBwbGV0X25hbWVbNV0gIT0gJ24nCisJCQkgfHwgaGFzbW50b3B0KG0sIE1OVE9QVF9OT0FVVE8pID09IE5VTEwKKwkJCSkgeworCQkJCWVyciArPSBzd2FwX2VuYWJsZV9kaXNhYmxlKG0tPm1udF9mc25hbWUpOworCQkJfQorCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQllbmRtbnRlbnQoZik7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc3dhcF9vbl9vZmZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN3YXBfb25fb2ZmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0OworCisjaWYgIUVOQUJMRV9GRUFUVVJFX1NXQVBPTl9QUkkKKwlyZXQgPSBnZXRvcHQzMihhcmd2LCAiYSIpOworI2Vsc2UKKwlpZiAoYXBwbGV0X25hbWVbNV0gPT0gJ24nKQorCQlvcHRfY29tcGxlbWVudGFyeSA9ICJwKyI7CisJcmV0ID0gZ2V0b3B0MzIoYXJndiwgKGFwcGxldF9uYW1lWzVdID09ICduJykgPyAiYXA6IiA6ICJhIiwgJmdfZmxhZ3MpOworCisJaWYgKHJldCAmIDIpIHsgLy8gLXAKKwkJZ19mbGFncyA9IFNXQVBfRkxBR19QUkVGRVIgfAorCQkJKChnX2ZsYWdzICYgU1dBUF9GTEFHX1BSSU9fTUFTSykgPDwgU1dBUF9GTEFHX1BSSU9fU0hJRlQpOworCQlyZXQgJj0gMTsKKwl9CisjZW5kaWYKKworCWlmIChyZXQgLyogJiAxOiBub3QgbmVlZGVkICovKSAvLyAtYQorCQlyZXR1cm4gZG9fZW1fYWxsKCk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiByZXQgPSAwOyByZWR1bmRhbnQgKi8KKwlkbyB7CisJCXJldCArPSBzd2FwX2VuYWJsZV9kaXNhYmxlKCphcmd2KTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3N3aXRjaF9yb290LmMgYi91dGlsLWxpbnV4L3N3aXRjaF9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2YWUzNQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvc3dpdGNoX3Jvb3QuYwpAQCAtMCwwICsxLDIxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgMjAwNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIFN3aXRjaCBmcm9tIHJvb3RmcyB0byBhbm90aGVyIGZpbGVzeXN0ZW0gYXMgdGhlIHJvb3Qgb2YgdGhlIG1vdW50IHRyZWUuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3dpdGNoX3Jvb3RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyAvZGV2L2NvbnNvbGVdIE5FV19ST09UIE5FV19JTklUIFtBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2l0Y2hfcm9vdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZyZWUgaW5pdHJhbWZzIGFuZCBzd2l0Y2ggdG8gYW5vdGhlciByb290IGZzOlxuIgorLy91c2FnZTogICAgICAgImNocm9vdCB0byBORVdfUk9PVCwgZGVsZXRlIGFsbCBpbiAvLCBtb3ZlIE5FV19ST09UIHRvIC8sXG4iCisvL3VzYWdlOiAgICAgICAiZXhlY3V0ZSBORVdfSU5JVC4gUElEIG11c3QgYmUgMS4gTkVXX1JPT1QgbXVzdCBiZSBhIG1vdW50cG9pbnQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIERFVglSZW9wZW4gc3RkaW8gdG8gREVWIGFmdGVyIHN3aXRjaCIKKworI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorLy8gTWFrZSB1cCBmb3IgaGVhZGVyIGRlZmljaWVuY2llcworI2lmbmRlZiBSQU1GU19NQUdJQworIyBkZWZpbmUgUkFNRlNfTUFHSUMgKCh1bnNpZ25lZCkweDg1ODQ1OGY2KQorI2VuZGlmCisjaWZuZGVmIFRNUEZTX01BR0lDCisjIGRlZmluZSBUTVBGU19NQUdJQyAoKHVuc2lnbmVkKTB4MDEwMjE5OTQpCisjZW5kaWYKKyNpZm5kZWYgTVNfTU9WRQorIyBkZWZpbmUgTVNfTU9WRSAgICAgODE5MgorI2VuZGlmCisKKy8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBjb250ZW50cyBvZiByb290ZnMKK3N0YXRpYyB2b2lkIGRlbGV0ZV9jb250ZW50cyhjb25zdCBjaGFyICpkaXJlY3RvcnksIGRldl90IHJvb3RkZXYpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCS8vIERvbid0IGRlc2NlbmQgaW50byBvdGhlciBmaWxlc3lzdGVtcworCWlmIChsc3RhdChkaXJlY3RvcnksICZzdCkgfHwgc3Quc3RfZGV2ICE9IHJvb3RkZXYpCisJCXJldHVybjsKKworCS8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGVudHMgb2YgZGlyZWN0b3JpZXMKKwlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQlkaXIgPSBvcGVuZGlyKGRpcmVjdG9yeSk7CisJCWlmIChkaXIpIHsKKwkJCXdoaWxlICgoZCA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJCQljaGFyICpuZXdkaXIgPSBkLT5kX25hbWU7CisKKwkJCQkvLyBTa2lwIC4gYW5kIC4uCisJCQkJaWYgKERPVF9PUl9ET1RET1QobmV3ZGlyKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBSZWN1cnNlIHRvIGRlbGV0ZSBjb250ZW50cworCQkJCW5ld2RpciA9IGNvbmNhdF9wYXRoX2ZpbGUoZGlyZWN0b3J5LCBuZXdkaXIpOworCQkJCWRlbGV0ZV9jb250ZW50cyhuZXdkaXIsIHJvb3RkZXYpOworCQkJCWZyZWUobmV3ZGlyKTsKKwkJCX0KKwkJCWNsb3NlZGlyKGRpcik7CisKKwkJCS8vIERpcmVjdG9yeSBzaG91bGQgbm93IGJlIGVtcHR5LCB6YXAgaXQKKwkJCXJtZGlyKGRpcmVjdG9yeSk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBJdCB3YXNuJ3QgYSBkaXJlY3RvcnksIHphcCBpdAorCQl1bmxpbmsoZGlyZWN0b3J5KTsKKwl9Cit9CisKK2ludCBzd2l0Y2hfcm9vdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3dpdGNoX3Jvb3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm5ld3Jvb3QsICpjb25zb2xlID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlzdHJ1Y3Qgc3RhdGZzIHN0ZnM7CisJZGV2X3Qgcm9vdGRldjsKKworCS8vIFBhcnNlIGFyZ3MgKC1jIGNvbnNvbGUpCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTIiOyAvLyBtaW5pbXVtIDIgcGFyYW1zCisJZ2V0b3B0MzIoYXJndiwgIitjOiIsICZjb25zb2xlKTsgLy8gJysnOiBzdG9wIGF0IGZpcnN0IG5vbi1vcHRpb24KKwlhcmd2ICs9IG9wdGluZDsKKwluZXdyb290ID0gKmFyZ3YrKzsKKworCS8vIENoYW5nZSB0byBuZXcgcm9vdCBkaXJlY3RvcnkgYW5kIHZlcmlmeSBpdCdzIGEgZGlmZmVyZW50IGZzCisJeGNoZGlyKG5ld3Jvb3QpOworCXhzdGF0KCIvIiwgJnN0KTsKKwlyb290ZGV2ID0gc3Quc3RfZGV2OworCXhzdGF0KCIuIiwgJnN0KTsKKwlpZiAoc3Quc3RfZGV2ID09IHJvb3RkZXYgfHwgZ2V0cGlkKCkgIT0gMSkgeworCQkvLyBTaG93IHVzYWdlLCBpdCBzYXlzIG5ldyByb290IG11c3QgYmUgYSBtb3VudHBvaW50CisJCS8vIGFuZCB3ZSBtdXN0IGJlIFBJRCAxCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvLyBBZGRpdGlvbmFsIHNhbml0eSBjaGVja3M6IHdlJ3JlIGFib3V0IHRvIHJtIC1yZiAvLCBzbyBiZSBSRUFMTFkgU1VSRQorCS8vIHdlIG1lYW4gaXQuIEkgY291bGQgbWFrZSB0aGlzIGEgQ09ORklHIG9wdGlvbiwgYnV0IEkgd291bGQgZ2V0IGVtYWlsCisJLy8gZnJvbSBhbGwgdGhlIHBlb3BsZSB3aG8gV0lMTCBkZXN0cm95IHRoZWlyIGZpbGVzeXN0ZW1zLgorCWlmIChzdGF0KCIvaW5pdCIsICZzdCkgIT0gMCB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiL2luaXQgaXMgbm90IGEgcmVndWxhciBmaWxlIik7CisJfQorCXN0YXRmcygiLyIsICZzdGZzKTsgLy8gdGhpcyBuZXZlciBmYWlscworCWlmICgodW5zaWduZWQpc3Rmcy5mX3R5cGUgIT0gUkFNRlNfTUFHSUMKKwkgJiYgKHVuc2lnbmVkKXN0ZnMuZl90eXBlICE9IFRNUEZTX01BR0lDCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyb290IGZpbGVzeXN0ZW0gaXMgbm90IHJhbWZzL3RtcGZzIik7CisJfQorCisJLy8gWmFwIGV2ZXJ5dGhpbmcgb3V0IG9mIHJvb3RkZXYKKwlkZWxldGVfY29udGVudHMoIi8iLCByb290ZGV2KTsKKworCS8vIE92ZXJtb3VudCAvIHdpdGggbmV3ZGlyIGFuZCBjaHJvb3QgaW50byBpdAorCWlmIChtb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkpIHsKKwkJLy8gRm9yIGV4YW1wbGUsIGZhaWxzIHdoZW4gbmV3cm9vdCBpcyBub3QgYSBtb3VudHBvaW50CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgbW92aW5nIHJvb3QiKTsKKwl9CisJeGNocm9vdCgiLiIpOworCS8vIFRoZSBjaGRpciBpcyBuZWVkZWQgdG8gcmVjYWxjdWxhdGUgIi4iIGFuZCAiLi4iIGxpbmtzCisJeGNoZGlyKCIvIik7CisKKwkvLyBJZiBhIG5ldyBjb25zb2xlIHNwZWNpZmllZCwgcmVkaXJlY3Qgc3RkaW4vc3Rkb3V0L3N0ZGVyciB0byBpdAorCWlmIChjb25zb2xlKSB7CisJCWNsb3NlKDApOworCQl4b3Blbihjb25zb2xlLCBPX1JEV1IpOworCQl4ZHVwMigwLCAxKTsKKwkJeGR1cDIoMCwgMik7CisJfQorCisJLy8gRXhlYyByZWFsIGluaXQKKwlleGVjdihhcmd2WzBdLCBhcmd2KTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworfQorCisvKgorRnJvbTogUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KK0RhdGU6IFR1ZSwgSnVuIDE2LCAyMDA5IGF0IDc6NDcgUE0KK1N1YmplY3Q6IFJlOiBzd2l0Y2hfcm9vdC4uLgorCisuLi4KKy4uLgorLi4uCisKK0lmIHlvdSdyZSBfbm90XyBydW5uaW5nIG91dCBvZiBpbml0X3JhbWZzIChpZiBmb3IgZXhhbXBsZSB5b3UncmUgdXNpbmcgaW5pdHJkCitpbnN0ZWFkKSwgeW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2Ugc3dpdGNoX3Jvb3QgYmVjYXVzZSBpdCdzIHRoZSB3cm9uZyB0b29sLgorCitCYXNpY2FsbHkgd2hhdCB0aGUgc3Vja2VyIGRvZXMgaXMgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBzaGVsbCBzY3JpcHQ6CisKKyBmaW5kIC8gLXhkZXYgfCB4YXJncyBybSAtcmYKKyBjZCAiJDEiCisgc2hpZnQKKyBtb3VudCAtLW1vdmUgLiAvCisgZXhlYyBjaHJvb3QgLiAiJEAiCisKK1RoZXJlIGFyZSBhIGNvdXBsZSByZWFzb25zIHRoYXQgd29uJ3Qgd29yayBhcyBhIHNoZWxsIHNjcmlwdDoKKworMSkgSWYgeW91IGRlbGV0ZSB0aGUgY29tbWFuZHMgb3V0IG9mIHlvdXIgJFBBVEgsIHlvdXIgc2hlbGwgc2NyaXB0cyBjYW4ndCBydW4KK21vcmUgY29tbWFuZHMsIGJ1dCB5b3UgY2FuJ3Qgc3RhcnQgdXNpbmcgZHluYW1pY2FsbHkgbGlua2VkIF9uZXdfIGNvbW1hbmRzCit1bnRpbCBhZnRlciB5b3UgZG8gdGhlIGNocm9vdCBiZWNhdXNlIHRoZSBwYXRoIHRvIHRoZSBkeW5hbWljIGxpbmtlciBpcyB3cm9uZy4KK1NvIHRoZXJlJ3MgYSBzdGVwIHRoYXQgbmVlZHMgdG8gYmUgc29ydCBvZiBhdG9taWMgYnV0IGNhbid0IGJlIGFzIGEgc2hlbGwKK3NjcmlwdC4gIChZb3UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgd2l0aCBzdGF0aWMgbGlua2luZyBvciB2ZXJ5IGNhcmVmdWxseSBsYWlkCitvdXQgcGF0aHMgYW5kIHNlcXVlbmNpbmcsIGJ1dCBpdCdzIGJyaXR0bGUsIHVnbHksIGFuZCBub24tb2J2aW91cy4pCisKKzIpIFRoZSAiZmluZCB8IHJtIiBiaXQgd2lsbCBhY3VhbGx5IGRlbGV0ZSBldmVyeXRoaW5nIGJlY2F1c2UgdGhlIG1vdW50IHBvaW50cworc3RpbGwgc2hvdyB1cCAoZXZlbiBpZiB0aGVpciBjb250ZW50cyBkb24ndCksIGFuZCBybSAtcmYgd2lsbCB0aGVuIGhhcHBpbHkgemFwCit0aGF0LiAgU28gdGhlIGZpcnN0IGxpbmUgaXMgYW4gb3ZlcnNpbXBsaWZpY2F0aW9uIG9mIHdoYXQgeW91IG5lZWQgdG8gZG8gX25vdF8KK3RvIGRlc2NlbmQgaW50byBvdGhlciBmaWxlc3lzdGVtcyBhbmQgZGVsZXRlIHRoZWlyIGNvbnRlbnRzLgorCitUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgdG8gZnJlZSB1cCBtZW1vcnksIGJ5IHRoZSB3YXkuICBTaW5jZSBpbml0cmFtZnMgaXMgYQorcmFtZnMsIGRlbGV0aW5nIGl0cyBjb250ZW50cyBmcmVlcyB1cCB0aGUgbWVtb3J5IGl0IHVzZXMuICAoV2UgbGVhdmUgaXQgd2l0aAorb25lIHJlbWFpbmluZyBkZW50cnkgZm9yIHRoZSBuZXcgbW91bnQgcG9pbnQsIGJ1dCB0aGF0J3Mgb2suKQorCitOb3RlIHRoYXQgeW91IGNhbm5vdCBldmVyIHVtb3VudCByb290ZnMsIGZvciBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHJlYXNvbiB5b3UKK2Nhbid0IGtpbGwgUElEIDEuICBUaGUga2VybmVsIHRyYWNrcyBtb3VudCBwb2ludHMgYXMgYSBkb3VibHkgbGlua2VkIGxpc3QsIGFuZAordGhlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0L2VuZCBvZiB0aGF0IGxpc3QgYWx3YXlzIHBvaW50cyB0byBhbiBlbnRyeSB0aGF0J3MKK2tub3duIHRvIGJlIHRoZXJlIChyb290ZnMpLCBzbyBpdCBuZXZlciBoYXMgdG8gd29ycnkgYWJvdXQgbW92aW5nIHRoYXQgcG9pbnRlcgorYW5kIGl0IG5ldmVyIGhhcyB0byB3b3JyeSBhYm91dCB0aGUgbGlzdCBiZWluZyBlbXB0eS4gIChCYWNrIGFyb3VuZCAyLjYuMTMKK3RoZXJlIF93YXNfIGEgYnVnIHRoYXQgbGV0IHlvdSB1bW91bnQgcm9vdGZzLCBhbmQgdGhlIHN5c3RlbSBsb2NrZWQgaGFyZCB0aGUKK2luc3RhbnQgeW91IGRpZCBzbyBlbmRsZXNzbHkgbG9vcGluZyB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIG1vdW50IGxpc3QgYW5kCituZXZlciBzdG9wcGluZy4gIFRoZXkgZml4ZWQgaXQuKQorCitPaCwgYW5kIHRoZSByZWFzb24gd2UgbW91bnQgLS1tb3ZlIF9hbmRfIGRvIHRoZSBjaHJvb3QgaXMgZHVlIHRvIHRoZSB3YXkgIi8iCit3b3Jrcy4gIEVhY2ggcHJvY2VzcyBoYXMgdHdvIHNwZWNpYWwgc3ltbGlua3MsICIuIiwgYW5kICIvIi4gIEVhY2ggb2YgdGhlbQorcG9pbnRzIHRvIHRoZSBkZW50cnkgb2YgYSBkaXJlY3RvcnksIGFuZCBnaXZlIHlvdSBhIGxvY2F0aW9uIHBhdGhzIGNhbiBzdGFydAorZnJvbS4gIChIaXN0b3JpY2FsbHkgIi4uIiB3YXMgYWxzbyBzcGVjaWFsLCBiZWNhdXNlIHlvdSBjb3VsZCBlbnRlciBhCitkaXJlY3RvcnkgdmlhIGEgc3ltbGluayBzbyBiYWNraW5nIG91dCB0byB0aGUgZGlyZWN0b3J5IHlvdSBjYW1lIGZyb20gZG9lc24ndAorbmVjZXNzYXJpbHkgbWVhbiB0aGUgb25lIHBoeXNpY2FsbHkgYWJvdmUgd2hlcmUgIi4iIHBvaW50cyB0by4gIFRoZXNlIGRheXMgSQordGhpbmsgaXQncyBqdXN0IGhhbmRlZCBvZmYgdG8gdGhlIGZpbGVzeXN0ZW0uKQorCitBbnl3YXksIHBhdGggcmVzb2x1dGlvbiBzdGFydHMgd2l0aCAiLiIgb3IgIi8iIChhbHRob3VnaCB0aGUgIi4vIiBhdCB0aGUgc3RhcnQKK29mIHRoZSBwYXRoIG1heSBiZSBpbXBsaWNpdCksIG1lYW5pbmcgaXQncyByZWxhdGl2ZSB0byBvbmUgb2YgdGhvc2UgdHdvCitkaXJlY3Rvcmllcy4gIFlvdXIgY3VycmVudCBkaXJlY3RvcnksIGFuZCB5b3VyIGN1cnJlbnQgcm9vdCBkaXJlY3RvcnkuICBUaGUKK2NoZGlyKCkgc3lzY2FsbCBjaGFuZ2VzIHdoZXJlICIuIiBwb2ludHMgdG8sIGFuZCB0aGUgY2hyb290KCkgc3lzY2FsbCBjaGFuZ2VzCit3aGVyZSAiLyIgcG9pbnRzIHRvLiAgKEFnYWluLCBib3RoIGFyZSBwZXItcHJvY2VzcyB3aGljaCBpcyB3aHkgY2hyb290IG9ubHkKK2FmZmVjdHMgeW91ciBjdXJyZW50IHByb2Nlc3MgYW5kIGl0cyBjaGlsZCBwcm9jZXNzZXMuKQorCitOb3RlIHRoYXQgY2hyb290KCkgZG9lcyBfbm90XyBjaGFuZ2Ugd2hlcmUgIi4iIHBvaW50cyB0bywgYW5kIGJhY2sgYmVmb3JlIHRoZXkKK3B1dCBjcmF6eSBzZWN1cml0eSBjaGVja3MgaW50byB0aGUga2VybmVsIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgY291bGQgYmUKK3NvbWV3aGVyZSB5b3UgY291bGQgbm8gbG9uZ2VyIGFjY2VzcyBhZnRlciB0aGUgY2hyb290LiAgKFRoZSBjb21tYW5kIGxpbmUKK2Nocm9vdCBkb2VzIGEgY2QgYXMgd2VsbCwgdGhlIGNocm9vdCBfc3lzY2FsbF8gaXMgd2hhdCBJJ20gdGFsa2luZyBhYm91dC4pCisKK1RoZSByZWFzb24gbW91bnRpbmcgc29tZXRoaW5nIG5ldyBvdmVyIC8gaGFzIG5vIG9idmlvdXMgZWZmZWN0IGlzIHRoZSBzYW1lCityZWFzb24gbW91bnRpbmcgc29tZXRoaW5nIG92ZXIgeW91ciBjdXJyZW50IGRpcmVjdG9yeSBoYXMgbm8gb2J2aW91cyBlZmZlY3Q6Cit0aGUgLiBhbmQgLyBsaW5rcyBhcmVuJ3QgcmVjYWxjdWxhdGVkIGFmdGVyIGEgbW91bnQsIHNvIHRoZXkgc3RpbGwgcG9pbnQgdG8KK3RoZSBzYW1lIGRlbnRyeSB0aGV5IGRpZCBiZWZvcmUsIGV2ZW4gaWYgdGhhdCBkZW50cnkgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUKK2J5IG90aGVyIG1lYW5zLiAgTm90ZSB0aGF0ICJjZCAuIiBpcyBhIE5PUCwgYW5kICJjaHJvb3QgLyIgaXMgYSBub3A7IGJvdGggbG9vawordXAgdGhlIGNhY2hlZCBkZW50cnkgYW5kIHNldCBpdCByaWdodCBiYWNrLiAgVGhleSBkb24ndCByZS1wYXJzZSBhbnkgcGF0aHMsCitiZWNhdXNlIHRoZXkncmUgd2hhdCBhbGwgcGF0aHMgeW91ciBwcm9jZXNzIHVzZXMgd291bGQgYmUgcmVsYXRpdmUgdG8uCisKK1RoYXQncyB3aHkgdGhlIGNhcmVmdWwgc2VxdWVuY2luZyBhYm92ZTogd2UgY2QgaW50byB0aGUgbmV3IG1vdW50IHBvaW50IGJlZm9yZQord2UgZG8gdGhlIG1vdW50IC0tbW92ZS4gIE1vdmluZyB0aGUgbW91bnQgcG9pbnQgd291bGQgb3RoZXJ3aXNlIG1ha2UgaXQKK3RvdGFsbHkgaW5hY2Nlc3NpYmxlIHRvIGlzIGJlY2F1c2UgY2QtaW5nIHRvIHRoZSBvbGQgcGF0aCB3b3VsZG4ndCBnaXZlIGl0IHRvCit1cyBhbnltb3JlLCBhbmQgY2QgIi8iIGp1c3QgZ2l2ZXMgdXMgdGhlIGNhY2hlZCBkZW50cnkgZnJvbSB3aGVuIHRoZSBwcm9jZXNzCit3YXMgY3JlYXRlZCAoaW4gdGhpcyBjYXNlIHRoZSBvbGQgaW5pdHJhbWZzIG9uZSkuICBCdXQgdGhlICIuIiBzeW1saW5rIGdpdmVzCit1cyB0aGUgZGVudHJ5IG9mIHRoZSBmaWxlc3lzdGVtIHdlIGp1c3QgbW92ZWQsIHNvIHdlIGNhbiB0aGVuICJjaHJvb3QgLiIgdG8KK2NvcHkgdGhhdCBkZW50cnkgdG8gIi8iIGFuZCBnZXQgdGhlIG5ldyBmaWxlc3lzdGVtLiAgSWYgd2UgX2RpZG4ndF8gc2F2ZSB0aGF0CitkZW50cnkgaW4gIi4iIHdlIGNvdWxkbid0IGdldCBpdCBiYWNrIGFmdGVyIHRoZSBtb3VudCAtLW1vdmUuCisKKyhZZXMsIHRoaXMgaXMgYWxsIHNjcmV3eSBhbmQgSSBoYWQgdG8gZW1haWwgcXVlc3Rpb25zIHRvIExpbnVzIFRvcnZhbGRzIHRvIGdldAoraXQgc3RyYWlnaHQgbXlzZWxmLiAgSSBrZWVwIG1lYW5pbmcgdG8gd3JpdGUgdXAgYSAiaG93IG1vdW50IGFjdHVhbGx5IHdvcmtzIgorZG9jdW1lbnQgc29tZWRheS4uLikKKyovCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3Vtb3VudC5jIGIvdXRpbC1saW51eC91bW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjcxNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC91bW91bnQuYwpAQCAtMCwwICsxLDE5OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB1bW91bnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBGSUxFU1lTVEVNfERJUkVDVE9SWSIKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVbm1vdW50IGZpbGUgc3lzdGVtc1xuIgorLy91c2FnZToJSUZfRkVBVFVSRV9VTU9VTlRfQUxMKAorLy91c2FnZTogICAgICJcbgktYQlVbm1vdW50IGFsbCBmaWxlIHN5c3RlbXMiIElGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKCIgaW4gL2V0Yy9tdGFiIikKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktbglEb24ndCBlcmFzZSAvZXRjL210YWIgZW50cmllcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXIJVHJ5IHRvIHJlbW91bnQgZGV2aWNlcyBhcyByZWFkLW9ubHkgaWYgbW91bnQgaXMgYnVzeSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGF6eSB1bW91bnQgKGRldGFjaCBmaWxlc3lzdGVtKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgdW1vdW50IChpLmUuLCB1bnJlYWNoYWJsZSBORlMgc2VydmVyKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfTE9PUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRnJlZSBsb29wIGRldmljZSBpZiBpdCBoYXMgYmVlbiB1c2VkIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdW1vdW50IC9kZXYvaGRjMVxuIgorCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIGRlZmluZWQoX19kaWV0bGliY19fKQorLy8gVE9ETzogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZS4KKy8qIDE2LjEyLjIwMDYsIFNhbXBvIEtlbGxvbWFraSAoc2FtcG9AaWtpLmZpKQorICogZGlldGxpYmMtMC4zMCBkb2VzIG5vdCBoYXZlIGltcGxlbWVudGF0aW9uIG9mIGdldG1udGVudF9yKCkgKi8KK3N0YXRpYyBzdHJ1Y3QgbW50ZW50ICpnZXRtbnRlbnRfcihGSUxFKiBzdHJlYW0sIHN0cnVjdCBtbnRlbnQqIHJlc3VsdCwKKwkJY2hhciogYnVmZmVyIFVOVVNFRF9QQVJBTSwgaW50IGJ1ZnNpemUgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBtbnRlbnQqIG1lbnQgPSBnZXRtbnRlbnQoc3RyZWFtKTsKKwlyZXR1cm4gbWVtY3B5KHJlc3VsdCwgbWVudCwgc2l6ZW9mKCptZW50KSk7Cit9CisjZW5kaWYKKworLyogaWdub3JlZDogLXYgLWQgLXQgLWkgKi8KKyNkZWZpbmUgT1BUSU9OX1NUUklORyAgICAgICAgICAgImZsZG5yYSIgInZkdDppIgorI2RlZmluZSBPUFRfRk9SQ0UgICAgICAgICAgICAgICAoMSA8PCAwKSAvLyBTYW1lIGFzIE1OVF9GT1JDRQorI2RlZmluZSBPUFRfTEFaWSAgICAgICAgICAgICAgICAoMSA8PCAxKSAvLyBTYW1lIGFzIE1OVF9ERVRBQ0gKKyNkZWZpbmUgT1BUX0ZSRUVMT09QICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgT1BUX05PX01UQUIgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX1JFTU9VTlQgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgT1BUX0FMTCAgICAgICAgICAgICAgICAgKEVOQUJMRV9GRUFUVVJFX1VNT1VOVF9BTEwgPyAoMSA8PCA1KSA6IDApCisKK2ludCB1bW91bnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVtb3VudF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGRvRm9yY2U7CisJc3RydWN0IG1udGVudCBtZTsKKwlGSUxFICpmcDsKKwljaGFyICpmc3R5cGUgPSBOVUxMOworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgb3B0OworCXN0cnVjdCBtdGFiX2xpc3QgeworCQljaGFyICpkaXI7CisJCWNoYXIgKmRldmljZTsKKwkJc3RydWN0IG10YWJfbGlzdCAqbmV4dDsKKwl9ICptdGwsICptOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUklORywgJmZzdHlwZSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIE1OVF9GT1JDRSBhbmQgTU5UX0RFVEFDSCAoZnJvbSBsaW51eC9mcy5oKSBtdXN0IG1hdGNoCisJLy8gT1BUX0ZPUkNFIGFuZCBPUFRfTEFaWSwgb3RoZXJ3aXNlIHRoaXMgdHJpY2sgd29uJ3Qgd29yazoKKwlkb0ZvcmNlID0gTUFYKChvcHQgJiBPUFRfRk9SQ0UpLCAob3B0ICYgT1BUX0xBWlkpKTsKKworCS8qIEdldCBhIGxpc3Qgb2YgbW91bnQgcG9pbnRzIGZyb20gbXRhYi4gIFdlIHJlYWQgdGhlbSBhbGwgaW4gbm93IG1vc3RseQorCSAqIGZvciB1bW91bnQgLWEgKHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxpc3QgY2hhbmdpbmcgd2hpbGUKKwkgKiB3ZSBpdGVyYXRlIG92ZXIgaXQsIG9yIGFib3V0IGdldHRpbmcgc3R1Y2sgaW4gYSBsb29wIG9uIHRoZSBzYW1lIGZhaWxpbmcKKwkgKiBlbnRyeS4gIE5vdGljZSB0aGF0IHRoaXMgYWxzbyBuYXR1cmFsbHkgcmV2ZXJzZXMgdGhlIGxpc3Qgc28gdGhhdCAtYQorCSAqIHVtb3VudHMgdGhlIG1vc3QgcmVjZW50IGVudHJpZXMgZmlyc3QuICovCisJbSA9IG10bCA9IE5VTEw7CisKKwkvLyBJZiB3ZSdyZSB1bW91bnRpbmcgYWxsLCB0aGVuIG0gcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBhbmQKKwkvLyB0aGUgYXJndW1lbnQgbGlzdCBzaG91bGQgYmUgZW1wdHkgKHdoaWNoIHdpbGwgbWF0Y2ggYWxsKS4KKwlmcCA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKwlpZiAoIWZwKSB7CisJCWlmIChvcHQgJiBPUFRfQUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIGJiX3BhdGhfbXRhYl9maWxlKTsKKwl9IGVsc2UgeworCQl3aGlsZSAoZ2V0bW50ZW50X3IoZnAsICZtZSwgYmJfY29tbW9uX2J1ZnNpejEsIHNpemVvZihiYl9jb21tb25fYnVmc2l6MSkpKSB7CisJCQkvKiBNYXRjaCBmc3R5cGUgaWYgcGFzc2VkICovCisJCQlpZiAoIW1hdGNoX2ZzdHlwZSgmbWUsIGZzdHlwZSkpCisJCQkJY29udGludWU7CisJCQltID0geHphbGxvYyhzaXplb2YoKm0pKTsKKwkJCW0tPm5leHQgPSBtdGw7CisJCQltLT5kZXZpY2UgPSB4c3RyZHVwKG1lLm1udF9mc25hbWUpOworCQkJbS0+ZGlyID0geHN0cmR1cChtZS5tbnRfZGlyKTsKKwkJCW10bCA9IG07CisJCX0KKwkJZW5kbW50ZW50KGZwKTsKKwl9CisKKwkvLyBJZiB3ZSdyZSBub3QgdW1vdW50aW5nIGFsbCwgd2UgbmVlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuCisJaWYgKCEob3B0ICYgT1BUX0FMTCkgJiYgIWZzdHlwZSkgeworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCW0gPSBOVUxMOworCX0KKworCS8vIExvb3AgdGhyb3VnaCBldmVyeXRoaW5nIHdlJ3JlIHN1cHBvc2VkIHRvIHVtb3VudCwgYW5kIGRvIHNvLgorCWZvciAoOzspIHsKKwkJaW50IGN1cnN0YXQ7CisJCWNoYXIgKnphcGl0ID0gKmFyZ3Y7CisJCWNoYXIgKnBhdGg7CisKKwkJLy8gRG8gd2UgYWxyZWFkeSBrbm93IHdoYXQgdG8gdW1vdW50IHRoaXMgdGltZSB0aHJvdWdoIHRoZSBsb29wPworCQlpZiAobSkKKwkJCXBhdGggPSB4c3RyZHVwKG0tPmRpcik7CisJCS8vIEZvciB1bW91bnQgLWEsIGVuZCBvZiBtdGFiIG1lYW5zIHRpbWUgdG8gZXhpdC4KKwkJZWxzZSBpZiAob3B0ICYgT1BUX0FMTCkKKwkJCWJyZWFrOworCQkvLyBVc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChhbmQgbG9vayBpdCB1cCBpbiBtdGFiIGxpc3QpCisJCWVsc2UgeworCQkJaWYgKCF6YXBpdCkKKwkJCQlicmVhazsKKwkJCWFyZ3YrKzsKKwkJCXBhdGggPSB4bWFsbG9jX3JlYWxwYXRoKHphcGl0KTsKKwkJCWlmIChwYXRoKSB7CisJCQkJZm9yIChtID0gbXRsOyBtOyBtID0gbS0+bmV4dCkKKwkJCQkJaWYgKHN0cmNtcChwYXRoLCBtLT5kaXIpID09IDAgfHwgc3RyY21wKHBhdGgsIG0tPmRldmljZSkgPT0gMCkKKwkJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIElmIHdlIGNvdWxkbid0IGZpbmQgdGhpcyBzdWNrZXIgaW4gL2V0Yy9tdGFiLCBwdW50IGJ5IHBhc3Npbmcgb3VyCisJCS8vIGNvbW1hbmQgbGluZSBhcmd1bWVudCBzdHJhaWdodCB0byB0aGUgdW1vdW50IHN5c2NhbGwuICBPdGhlcndpc2UsCisJCS8vIHVtb3VudCB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgd2Ugd2VyZSBnaXZlbiB0aGUgYmxvY2sgZGV2aWNlLgorCQlpZiAobSkgemFwaXQgPSBtLT5kaXI7CisKKwkJLy8gTGV0J3MgYXNrIHRoZSB0aGluZyBuaWNlbHkgdG8gdW5tb3VudC4KKwkJY3Vyc3RhdCA9IHVtb3VudCh6YXBpdCk7CisKKwkJLy8gRm9yY2UgdGhlIHVubW91bnQsIGlmIG5lY2Vzc2FyeS4KKwkJaWYgKGN1cnN0YXQgJiYgZG9Gb3JjZSkKKwkJCWN1cnN0YXQgPSB1bW91bnQyKHphcGl0LCBkb0ZvcmNlKTsKKworCQkvLyBJZiBzdGlsbCBjYW4ndCB1bW91bnQsIG1heWJlIHJlbW91bnQgcmVhZC1vbmx5PworCQlpZiAoY3Vyc3RhdCkgeworCQkJaWYgKChvcHQgJiBPUFRfUkVNT1VOVCkgJiYgZXJybm8gPT0gRUJVU1kgJiYgbSkgeworCQkJCS8vIE5vdGUhIEV2ZW4gaWYgd2Ugc3VjY2VlZCBoZXJlLCBsYXRlciB3ZSBzaG91bGQgbm90CisJCQkJLy8gZnJlZSBsb29wIGRldmljZSBvciBlcmFzZSBtdGFiIGVudHJ5IQorCQkJCWNvbnN0IGNoYXIgKm1zZyA9ICIlcyBidXN5IC0gcmVtb3VudGVkIHJlYWQtb25seSI7CisJCQkJY3Vyc3RhdCA9IG1vdW50KG0tPmRldmljZSwgemFwaXQsIE5VTEwsIE1TX1JFTU9VTlR8TVNfUkRPTkxZLCBOVUxMKTsKKwkJCQlpZiAoY3Vyc3RhdCkgeworCQkJCQltc2cgPSAiY2FuJ3QgcmVtb3VudCAlcyByZWFkLW9ubHkiOworCQkJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJfQorCQkJCWJiX2Vycm9yX21zZyhtc2csIG0tPmRldmljZSk7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCAlc3Vtb3VudCAlcyIsIChkb0ZvcmNlID8gImZvcmNpYmx5ICIgOiAiIiksIHphcGl0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIERlLWFsbG9jYXRlIHRoZSBsb29wIGRldmljZS4gIFRoaXMgaW9jdGwgc2hvdWxkIGJlIGlnbm9yZWQgb24KKwkJCS8vIGFueSBub24tbG9vcCBibG9jayBkZXZpY2VzLgorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0xPT1AgJiYgKG9wdCAmIE9QVF9GUkVFTE9PUCkgJiYgbSkKKwkJCQlkZWxfbG9vcChtLT5kZXZpY2UpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVCAmJiAhKG9wdCAmIE9QVF9OT19NVEFCKSAmJiBtKQorCQkJCWVyYXNlX210YWIobS0+ZGlyKTsKKwkJfQorCisJCS8vIEZpbmQgbmV4dCBtYXRjaGluZyBtdGFiIGVudHJ5IGZvciAtYSBvciB1bW91bnQgL2RldgorCQkvLyBOb3RlIHRoaXMgbWVhbnMgdGhhdCAidW1vdW50IC9kZXYvYmxhaCIgd2lsbCB1bm1vdW50IGFsbCBpbnN0YW5jZXMKKwkJLy8gb2YgL2Rldi9ibGFoLCBub3QganVzdCB0aGUgbW9zdCByZWNlbnQuCisJCWlmIChtKSB7CisJCQl3aGlsZSAoKG0gPSBtLT5uZXh0KSAhPSBOVUxMKQorCQkJCS8vIE5COiBpZiBtIGlzIG5vbi1OVUxMLCBwYXRoIGlzIG5vbi1OVUxMIGFzIHdlbGwKKwkJCQlpZiAoKG9wdCAmIE9QVF9BTEwpIHx8IHN0cmNtcChwYXRoLCBtLT5kZXZpY2UpID09IDApCisJCQkJCWJyZWFrOworCQl9CisJCWZyZWUocGF0aCk7CisJfQorCisJLy8gRnJlZSBtdGFiIGxpc3QgaWYgbmVjZXNzYXJ5CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXdoaWxlIChtdGwpIHsKKwkJCW0gPSBtdGwtPm5leHQ7CisJCQlmcmVlKG10bC0+ZGV2aWNlKTsKKwkJCWZyZWUobXRsLT5kaXIpOworCQkJZnJlZShtdGwpOworCQkJbXRsID0gbTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9LYnVpbGQuc3JjIGIvdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRhNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDQ1IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX0JMS0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2Rldm5hbWUubworbGliLSQoQ09ORklHX0ZJTkRGUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2Rldm5hbWUubworbGliLSQoQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwpICAgICAgICAgICAgICAgKz0gZ2V0X2Rldm5hbWUubworCitsaWItJChDT05GSUdfVk9MVU1FSUQpICAgICAgICAgICAgICAgICAgICAgICAgICArPSB2b2x1bWVfaWQubyB1dGlsLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTKSAgICAgICAgICAgICs9IGJ0cmZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCkgICAgICAgICAgICAgICs9IGV4dC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQpICAgICAgICAgICAgICArPSBmYXQubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTKSAgICAgICAgICAgICAgKz0gaGZzLm8KKyMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ISUdIUE9JTlRSQUlEKSAgICArPSBoaWdocG9pbnQubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQpICAgICAgICAgICs9IGlzd19yYWlkLm8KKyMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MU0lSQUlEKSAgICAgICAgICArPSBsc2lfcmFpZC5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVklBUkFJRCkgICAgICAgICAgKz0gdmlhX3JhaWQubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NJTElDT05SQUlEKSAgICAgICs9IHNpbGljb25fcmFpZC5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRCkgICAgICAgKz0gbnZpZGlhX3JhaWQubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1BST01JU0VSQUlEKSAgICAgICs9IHByb21pc2VfcmFpZC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwKSAgICAgICAgICArPSBpc285NjYwLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUykgICAgICAgICAgICAgICs9IGpmcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQpICAgICAgICArPSBsaW51eF9yYWlkLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUCkgICAgICAgICs9IGxpbnV4X3N3YXAubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xWTSkgICAgICAgICAgICAgICs9IGx2bS5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTUFDKSAgICAgICAgICAgICAgKz0gbWFjLm8KKyMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9NU0RPUykgICAgICAgICAgICArPSBtc2Rvcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTKSAgICAgICAgICAgICArPSBudGZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTKSAgICAgICAgICs9IHJlaXNlcmZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERikgICAgICAgICAgICAgICs9IHVkZi5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVUZTKSAgICAgICAgICAgICAgKz0gdWZzLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUykgICAgICAgICAgICAgICs9IHhmcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMpICAgICAgICAgICArPSBjcmFtZnMubworIyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0hQRlMpICAgICAgICAgICAgICs9IGhwZnMubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlMpICAgICAgICAgICAgKz0gcm9tZnMubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTVikgICAgICAgICAgICAgKz0gc3lzdi5vCisjIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVgpICAgICAgICAgICAgKz0gbWluaXgubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUykgICAgICAgICAgICAgKz0gbHVrcy5vCitsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMikgICAgICAgICAgICArPSBvY2ZzMi5vCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9idHJmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvYnRyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdiODA5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvYnRyZnMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKyNkZWZpbmUgQlRSRlNfVVVJRF9TSVpFIDE2CisjZGVmaW5lIEJUUkZTX0xBQkVMX1NJWkUgMjU2CisjZGVmaW5lIEJUUkZTX0NTVU1fU0laRSAzMgorI2RlZmluZSBCVFJGU19GU0lEX1NJWkUgMTYKKworI2RlZmluZSBCVFJGU19NQUdJQyAiX0JIUmZTX00iCisKK3N0cnVjdCBidHJmc19kZXZfaXRlbSB7CisJdWludDY0X3QgZGV2aWQ7CisJdWludDY0X3QgdG90YWxfYnl0ZXM7CisJdWludDY0X3QgYnl0ZXNfdXNlZDsKKwl1aW50MzJfdCBpb19hbGlnbjsKKwl1aW50MzJfdCBpb193aWR0aDsKKwl1aW50MzJfdCBzZWN0b3Jfc2l6ZTsKKwl1aW50NjRfdCB0eXBlOworCXVpbnQ2NF90IGdlbmVyYXRpb247CisJdWludDY0X3Qgc3RhcnRfb2Zmc2V0OworCXVpbnQzMl90IGRldl9ncm91cDsKKwl1aW50OF90IHNlZWtfc3BlZWQ7CisJdWludDhfdCBiYW5kd2lkdGg7CisJdWludDhfdCB1dWlkW0JUUkZTX1VVSURfU0laRV07CisJdWludDhfdCBmc2lkW0JUUkZTX1VVSURfU0laRV07Cit9IFBBQ0tFRDsKKworc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90IGNzdW1bQlRSRlNfQ1NVTV9TSVpFXTsKKwl1aW50OF90IGZzaWRbQlRSRlNfRlNJRF9TSVpFXTsJLy8gVVVJRAorCXVpbnQ2NF90IGJ5dGVucjsKKwl1aW50NjRfdCBmbGFnczsKKwl1aW50OF90IG1hZ2ljWzhdOworCXVpbnQ2NF90IGdlbmVyYXRpb247CisJdWludDY0X3Qgcm9vdDsKKwl1aW50NjRfdCBjaHVua19yb290OworCXVpbnQ2NF90IGxvZ19yb290OworCXVpbnQ2NF90IGxvZ19yb290X3RyYW5zaWQ7CisJdWludDY0X3QgdG90YWxfYnl0ZXM7CisJdWludDY0X3QgYnl0ZXNfdXNlZDsKKwl1aW50NjRfdCByb290X2Rpcl9vYmplY3RpZDsKKwl1aW50NjRfdCBudW1fZGV2aWNlczsKKwl1aW50MzJfdCBzZWN0b3JzaXplOworCXVpbnQzMl90IG5vZGVzaXplOworCXVpbnQzMl90IGxlYWZzaXplOworCXVpbnQzMl90IHN0cmlwZXNpemU7CisJdWludDMyX3Qgc3lzX2NodW5rX2FycmF5X3NpemU7CisJdWludDY0X3QgY2h1bmtfcm9vdF9nZW5lcmF0aW9uOworCXVpbnQ2NF90IGNvbXBhdF9mbGFnczsKKwl1aW50NjRfdCBjb21wYXRfcm9fZmxhZ3M7CisJdWludDY0X3QgaW5jb21wYXRfZmxhZ3M7CisJdWludDE2X3QgY3N1bV90eXBlOworCXVpbnQ4X3Qgcm9vdF9sZXZlbDsKKwl1aW50OF90IGNodW5rX3Jvb3RfbGV2ZWw7CisJdWludDhfdCBsb2dfcm9vdF9sZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gZGV2X2l0ZW07CisJdWludDhfdCBsYWJlbFtCVFJGU19MQUJFTF9TSVpFXTsJLy8gTEFCRUwKKwkvLyAuLi4KK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9idHJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKwkvLyBidHJmcyBoYXMgc3VwZXJibG9ja3MgYXQgNjRLLCA2NE0gYW5kIDI1NkcKKwkvLyBtaW5pbXVtIGJ0cmZzIHNpemUgaXMgMjU2TQorCS8vIHNvIHdlIG5ldmVyIHN0ZXAgb3V0IHRoZSBkZXZpY2UgaWYgd2UgYW5hbHl6ZQorCS8vIHRoZSBmaXJzdCBhbmQgdGhlIHNlY29uZCBzdXBlcmJsb2NrcworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc2I7CisJdW5zaWduZWQgb2ZmID0gNjQ7CisKKwl3aGlsZSAob2ZmIDwgNjQqMTAyNCoxMDI0KSB7CisJCW9mZiAqPSAxMDI0OworCQlkYmcoImJ0cmZzOiBwcm9iaW5nIGF0IG9mZnNldCAweCV4Iiwgb2ZmKTsKKworCQlzYiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIHNpemVvZigqc2IpKTsKKwkJaWYgKHNiID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKG1lbWNtcChzYi0+bWFnaWMsIEJUUkZTX01BR0lDLCA4KSAhPSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8vIE4uQi46IGJ0cmZzIG5hdGl2ZWx5IHN1cHBvcnRzIDI1NiAoPlZPTFVNRV9JRF9MQUJFTF9TSVpFKSBzaXplIGxhYmVscworCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzYi0+bGFiZWwsIFZPTFVNRV9JRF9MQUJFTF9TSVpFKTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHNiLT5mc2lkLCBVVUlEX0RDRSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2NyYW1mcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvY3JhbWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlOTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2NyYW1mcy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBjcmFtZnNfc3VwZXIgeworCXVpbnQzMl90CW1hZ2ljOworCXVpbnQzMl90CXNpemU7CisJdWludDMyX3QJZmxhZ3M7CisJdWludDMyX3QJZnV0dXJlOworCXVpbnQ4X3QJCXNpZ25hdHVyZVsxNl07CisJc3RydWN0IGNyYW1mc19pbmZvIHsKKwkJdWludDMyX3QJY3JjOworCQl1aW50MzJfdAllZGl0aW9uOworCQl1aW50MzJfdAlibG9ja3M7CisJCXVpbnQzMl90CWZpbGVzOworCX0gUEFDS0VEIGluZm87CisJdWludDhfdAkJbmFtZVsxNl07Cit9IFBBQ0tFRDsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfY3JhbWZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBjcmFtZnNfc3VwZXIgKmNzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJY3MgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKGNzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChjcy0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoMHg0NTNkY2QyOCkpIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgY3MtPm5hbWUsIDE2KTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGNzLT5uYW1lLCAxNik7CisKKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJjcmFtZnMiOykKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvZXh0LmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9leHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE5NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvZXh0LmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWlub2Rlc19jb3VudDsKKwl1aW50MzJfdAlibG9ja3NfY291bnQ7CisJdWludDMyX3QJcl9ibG9ja3NfY291bnQ7CisJdWludDMyX3QJZnJlZV9ibG9ja3NfY291bnQ7CisJdWludDMyX3QJZnJlZV9pbm9kZXNfY291bnQ7CisJdWludDMyX3QJZmlyc3RfZGF0YV9ibG9jazsKKwl1aW50MzJfdAlsb2dfYmxvY2tfc2l6ZTsKKwl1aW50MzJfdAlkdW1teTNbN107CisJdWludDhfdAltYWdpY1syXTsKKwl1aW50MTZfdAlzdGF0ZTsKKwl1aW50MzJfdAlkdW1teTVbOF07CisJdWludDMyX3QJZmVhdHVyZV9jb21wYXQ7CisJdWludDMyX3QJZmVhdHVyZV9pbmNvbXBhdDsKKwl1aW50MzJfdAlmZWF0dXJlX3JvX2NvbXBhdDsKKwl1aW50OF90CXV1aWRbMTZdOworCXVpbnQ4X3QJdm9sdW1lX25hbWVbMTZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDAwMDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDAwMDAwOAorI2RlZmluZSBFWFRfU1VQRVJCTE9DS19PRkZTRVQJCQkweDQwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9leHQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzOworCisJZGJnKCJleHQ6IHByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwllcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBFWFRfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAoZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGVzLT5tYWdpY1swXSAhPSAwMTIzIHx8IGVzLT5tYWdpY1sxXSAhPSAwMzU3KSB7CisJCWRiZygiZXh0OiBubyBtYWdpYyBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgZXMtPnZvbHVtZV9uYW1lLCAxNik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGVzLT52b2x1bWVfbmFtZSwgMTYpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgZXMtPnV1aWQsIFVVSURfRENFKTsKKwlkYmcoImV4dDogbGFiZWwgJyVzJyB1dWlkICclcyciLCBpZC0+bGFiZWwsIGlkLT51dWlkKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0JMS0lEX1RZUEUKKwlpZiAoKGxlMzJfdG9fY3B1KGVzLT5mZWF0dXJlX2NvbXBhdCkgJiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSAhPSAwKQorCQlpZC0+dHlwZSA9ICJleHQzIjsKKwllbHNlCisJCWlkLT50eXBlID0gImV4dDIiOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2ZhdC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvZmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZmJiMgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2ZhdC5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisvKiBsaW51eC9tc2Rvc19mcy5oIHNheXM6ICovCisjZGVmaW5lIEZBVDEyX01BWAkJCTB4ZmY0CisjZGVmaW5lIEZBVDE2X01BWAkJCTB4ZmZmNAorI2RlZmluZSBGQVQzMl9NQVgJCQkweDBmZmZmZmY2CisKKyNkZWZpbmUgRkFUX0FUVFJfVk9MVU1FX0lECQkweDA4CisjZGVmaW5lIEZBVF9BVFRSX0RJUgkJCTB4MTAKKyNkZWZpbmUgRkFUX0FUVFJfTE9OR19OQU1FCQkweDBmCisjZGVmaW5lIEZBVF9BVFRSX01BU0sJCQkweDNmCisjZGVmaW5lIEZBVF9FTlRSWV9GUkVFCQkJMHhlNQorCitzdHJ1Y3QgdmZhdF9zdXBlcl9ibG9jayB7CisJdWludDhfdAkJYm9vdF9qdW1wWzNdOworCXVpbnQ4X3QJCXN5c2lkWzhdOworCXVpbnQxNl90CXNlY3Rvcl9zaXplX2J5dGVzOworCXVpbnQ4X3QJCXNlY3RvcnNfcGVyX2NsdXN0ZXI7CisJdWludDE2X3QJcmVzZXJ2ZWRfc2N0OworCXVpbnQ4X3QJCWZhdHM7CisJdWludDE2X3QJZGlyX2VudHJpZXM7CisJdWludDE2X3QJc2VjdG9yczsKKwl1aW50OF90CQltZWRpYTsKKwl1aW50MTZfdAlmYXRfbGVuZ3RoOworCXVpbnQxNl90CXNlY3NfdHJhY2s7CisJdWludDE2X3QJaGVhZHM7CisJdWludDMyX3QJaGlkZGVuOworCXVpbnQzMl90CXRvdGFsX3NlY3Q7CisJdW5pb24geworCQlzdHJ1Y3QgZmF0X3N1cGVyX2Jsb2NrIHsKKwkJCXVpbnQ4X3QJCXVua25vd25bM107CisJCQl1aW50OF90CQlzZXJub1s0XTsKKwkJCXVpbnQ4X3QJCWxhYmVsWzExXTsKKwkJCXVpbnQ4X3QJCW1hZ2ljWzhdOworCQkJdWludDhfdAkJZHVtbXkyWzE5Ml07CisJCQl1aW50OF90CQlwbWFnaWNbMl07CisJCX0gUEFDS0VEIGZhdDsKKwkJc3RydWN0IGZhdDMyX3N1cGVyX2Jsb2NrIHsKKwkJCXVpbnQzMl90CWZhdDMyX2xlbmd0aDsKKwkJCXVpbnQxNl90CWZsYWdzOworCQkJdWludDhfdAkJdmVyc2lvblsyXTsKKwkJCXVpbnQzMl90CXJvb3RfY2x1c3RlcjsKKwkJCXVpbnQxNl90CWluc2ZvX3NlY3RvcjsKKwkJCXVpbnQxNl90CWJhY2t1cF9ib290OworCQkJdWludDE2X3QJcmVzZXJ2ZWQyWzZdOworCQkJdWludDhfdAkJdW5rbm93blszXTsKKwkJCXVpbnQ4X3QJCXNlcm5vWzRdOworCQkJdWludDhfdAkJbGFiZWxbMTFdOworCQkJdWludDhfdAkJbWFnaWNbOF07CisJCQl1aW50OF90CQlkdW1teTJbMTY0XTsKKwkJCXVpbnQ4X3QJCXBtYWdpY1syXTsKKwkJfSBQQUNLRUQgZmF0MzI7CisJfSBQQUNLRUQgdHlwZTsKK30gUEFDS0VEOworCitzdHJ1Y3QgdmZhdF9kaXJfZW50cnkgeworCXVpbnQ4X3QJCW5hbWVbMTFdOworCXVpbnQ4X3QJCWF0dHI7CisJdWludDE2X3QJdGltZV9jcmVhdDsKKwl1aW50MTZfdAlkYXRlX2NyZWF0OworCXVpbnQxNl90CXRpbWVfYWNjOworCXVpbnQxNl90CWRhdGVfYWNjOworCXVpbnQxNl90CWNsdXN0ZXJfaGlnaDsKKwl1aW50MTZfdAl0aW1lX3dyaXRlOworCXVpbnQxNl90CWRhdGVfd3JpdGU7CisJdWludDE2X3QJY2x1c3Rlcl9sb3c7CisJdWludDMyX3QJc2l6ZTsKK30gUEFDS0VEOworCitzdGF0aWMgdWludDhfdCAqZ2V0X2F0dHJfdm9sdW1lX2lkKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSAqZGlyLCBpbnQgY291bnQpCit7CisJZm9yICg7LS1jb3VudCA+PSAwOyBkaXIrKykgeworCQkvKiBlbmQgbWFya2VyICovCisJCWlmIChkaXItPm5hbWVbMF0gPT0gMHgwMCkgeworCQkJZGJnKCJlbmQgb2YgZGlyIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGVtcHR5IGVudHJ5ICovCisJCWlmIChkaXItPm5hbWVbMF0gPT0gRkFUX0VOVFJZX0ZSRUUpCisJCQljb250aW51ZTsKKworCQkvKiBsb25nIG5hbWUgKi8KKwkJaWYgKChkaXItPmF0dHIgJiBGQVRfQVRUUl9NQVNLKSA9PSBGQVRfQVRUUl9MT05HX05BTUUpCisJCQljb250aW51ZTsKKworCQlpZiAoKGRpci0+YXR0ciAmIChGQVRfQVRUUl9WT0xVTUVfSUQgfCBGQVRfQVRUUl9ESVIpKSA9PSBGQVRfQVRUUl9WT0xVTUVfSUQpIHsKKwkJCS8qIGxhYmVscyBkbyBub3QgaGF2ZSBmaWxlIGRhdGEgKi8KKwkJCWlmIChkaXItPmNsdXN0ZXJfaGlnaCAhPSAwIHx8IGRpci0+Y2x1c3Rlcl9sb3cgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJZGJnKCJmb3VuZCBBVFRSX1ZPTFVNRV9JRCBpZCBpbiByb290IGRpciIpOworCQkJcmV0dXJuIGRpci0+bmFtZTsKKwkJfQorCisJCWRiZygic2tpcCBkaXIgZW50cnkiKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfdmZhdChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBmYXRfcGFydGl0aW9uX29mZiovKQoreworI2RlZmluZSBmYXRfcGFydGl0aW9uX29mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHZmYXRfc3VwZXJfYmxvY2sgKnZzOworCXN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSAqZGlyOworCXVpbnQxNl90IHNlY3Rvcl9zaXplX2J5dGVzOworCXVpbnQxNl90IGRpcl9lbnRyaWVzOworCXVpbnQzMl90IHNlY3RfY291bnQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfc2N0OworCXVpbnQzMl90IGZhdF9zaXplX3NjdDsKKwl1aW50MzJfdCByb290X2NsdXN0ZXI7CisJdWludDMyX3QgZGlyX3NpemVfc2N0OworCXVpbnQzMl90IGNsdXN0ZXJfY291bnQ7CisJdWludDY0X3Qgcm9vdF9zdGFydF9vZmY7CisJdWludDMyX3Qgc3RhcnRfZGF0YV9zY3Q7CisJdWludDhfdCAqYnVmOworCXVpbnQzMl90IGJ1Zl9zaXplOworCXVpbnQ4X3QgKmxhYmVsID0gTlVMTDsKKwl1aW50MzJfdCBuZXh0X2NsdXN0ZXI7CisJaW50IG1heGxvb3A7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGZhdF9wYXJ0aXRpb25fb2ZmKTsKKworCXZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmLCAweDIwMCk7CisJaWYgKHZzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIGJlbGlldmUgb25seSB0aGF0J3MgZmF0LCBkb24ndCB0cnVzdCB0aGUgdmVyc2lvbgorCSAqIHRoZSBjbHVzdGVyX2NvdW50IHdpbGwgdGVsbCB1cworCSAqLworCWlmIChtZW1jbXAodnMtPnN5c2lkLCAiTlRGUyIsIDQpID09IDApCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAodnMtPnR5cGUuZmF0MzIubWFnaWMsICJNU1dJTiIsIDUpID09IDApCisJCWdvdG8gdmFsaWQ7CisKKwlpZiAobWVtY21wKHZzLT50eXBlLmZhdDMyLm1hZ2ljLCAiRkFUMzIgICAiLCA4KSA9PSAwKQorCQlnb3RvIHZhbGlkOworCisJaWYgKG1lbWNtcCh2cy0+dHlwZS5mYXQubWFnaWMsICJGQVQxNiAgICIsIDgpID09IDApCisJCWdvdG8gdmFsaWQ7CisKKwlpZiAobWVtY21wKHZzLT50eXBlLmZhdC5tYWdpYywgIk1TRE9TIiwgNSkgPT0gMCkKKwkJZ290byB2YWxpZDsKKworCWlmIChtZW1jbXAodnMtPnR5cGUuZmF0Lm1hZ2ljLCAiRkFUMTIgICAiLCA4KSA9PSAwKQorCQlnb3RvIHZhbGlkOworCisJLyoKKwkgKiBUaGVyZSBhcmUgb2xkIGZsb3BwaWVzIG91dCB0aGVyZSB3aXRob3V0IGEgbWFnaWMsIHNvIHdlIGNoZWNrCisJICogZm9yIHdlbGwga25vd24gdmFsdWVzIGFuZCBndWVzcyBpZiBpdCdzIGEgZmF0IHZvbHVtZQorCSAqLworCisJLyogYm9vdCBqdW1wIGFkZHJlc3MgY2hlY2sgKi8KKwlpZiAoKHZzLT5ib290X2p1bXBbMF0gIT0gMHhlYiB8fCB2cy0+Ym9vdF9qdW1wWzJdICE9IDB4OTApCisJICYmIHZzLT5ib290X2p1bXBbMF0gIT0gMHhlOQorCSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogaGVhZHMgY2hlY2sgKi8KKwlpZiAodnMtPmhlYWRzID09IDApCisJCXJldHVybiAtMTsKKworCS8qIGNsdXN0ZXIgc2l6ZSBjaGVjayAqLworCWlmICh2cy0+c2VjdG9yc19wZXJfY2x1c3RlciA9PSAwCisJIHx8ICh2cy0+c2VjdG9yc19wZXJfY2x1c3RlciAmICh2cy0+c2VjdG9yc19wZXJfY2x1c3Rlci0xKSkKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG1lZGlhIGNoZWNrICovCisJaWYgKHZzLT5tZWRpYSA8IDB4ZjggJiYgdnMtPm1lZGlhICE9IDB4ZjApCisJCXJldHVybiAtMTsKKworCS8qIGZhdCBjb3VudCovCisJaWYgKHZzLT5mYXRzICE9IDIpCisJCXJldHVybiAtMTsKKworIHZhbGlkOgorCS8qIHNlY3RvciBzaXplIGNoZWNrICovCisJc2VjdG9yX3NpemVfYnl0ZXMgPSBsZTE2X3RvX2NwdSh2cy0+c2VjdG9yX3NpemVfYnl0ZXMpOworCWlmIChzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDIwMCAmJiBzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDQwMAorCSAmJiBzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDgwMCAmJiBzZWN0b3Jfc2l6ZV9ieXRlcyAhPSAweDEwMDAKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWRiZygic2VjdG9yX3NpemVfYnl0ZXMgMHgleCIsIHNlY3Rvcl9zaXplX2J5dGVzKTsKKwlkYmcoInNlY3RvcnNfcGVyX2NsdXN0ZXIgMHgleCIsIHZzLT5zZWN0b3JzX3Blcl9jbHVzdGVyKTsKKworCXJlc2VydmVkX3NjdCA9IGxlMTZfdG9fY3B1KHZzLT5yZXNlcnZlZF9zY3QpOworCWRiZygicmVzZXJ2ZWRfc2N0IDB4JXgiLCByZXNlcnZlZF9zY3QpOworCisJc2VjdF9jb3VudCA9IGxlMTZfdG9fY3B1KHZzLT5zZWN0b3JzKTsKKwlpZiAoc2VjdF9jb3VudCA9PSAwKQorCQlzZWN0X2NvdW50ID0gbGUzMl90b19jcHUodnMtPnRvdGFsX3NlY3QpOworCWRiZygic2VjdF9jb3VudCAweCV4Iiwgc2VjdF9jb3VudCk7CisKKwlmYXRfc2l6ZV9zY3QgPSBsZTE2X3RvX2NwdSh2cy0+ZmF0X2xlbmd0aCk7CisJaWYgKGZhdF9zaXplX3NjdCA9PSAwKQorCQlmYXRfc2l6ZV9zY3QgPSBsZTMyX3RvX2NwdSh2cy0+dHlwZS5mYXQzMi5mYXQzMl9sZW5ndGgpOworCWZhdF9zaXplX3NjdCAqPSB2cy0+ZmF0czsKKwlkYmcoImZhdF9zaXplX3NjdCAweCV4IiwgZmF0X3NpemVfc2N0KTsKKworCWRpcl9lbnRyaWVzID0gbGUxNl90b19jcHUodnMtPmRpcl9lbnRyaWVzKTsKKwlkaXJfc2l6ZV9zY3QgPSAoKGRpcl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSkpICsKKwkJCShzZWN0b3Jfc2l6ZV9ieXRlcy0xKSkgLyBzZWN0b3Jfc2l6ZV9ieXRlczsKKwlkYmcoImRpcl9zaXplX3NjdCAweCV4IiwgZGlyX3NpemVfc2N0KTsKKworCWNsdXN0ZXJfY291bnQgPSBzZWN0X2NvdW50IC0gKHJlc2VydmVkX3NjdCArIGZhdF9zaXplX3NjdCArIGRpcl9zaXplX3NjdCk7CisJY2x1c3Rlcl9jb3VudCAvPSB2cy0+c2VjdG9yc19wZXJfY2x1c3RlcjsKKwlkYmcoImNsdXN0ZXJfY291bnQgMHgleCIsIGNsdXN0ZXJfY291bnQpOworCisvLwlpZiAoY2x1c3Rlcl9jb3VudCA8IEZBVDEyX01BWCkgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiRkFUMTIiKTsKKy8vCX0gZWxzZSBpZiAoY2x1c3Rlcl9jb3VudCA8IEZBVDE2X01BWCkgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiRkFUMTYiKTsKKy8vCX0gZWxzZSB7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJGQVQzMiIpOworLy8JCWdvdG8gZmF0MzI7CisvLwl9CisJaWYgKGNsdXN0ZXJfY291bnQgPj0gRkFUMTZfTUFYKQorCQlnb3RvIGZhdDMyOworCisJLyogdGhlIGxhYmVsIG1heSBiZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJcm9vdF9zdGFydF9vZmYgPSAocmVzZXJ2ZWRfc2N0ICsgZmF0X3NpemVfc2N0KSAqIHNlY3Rvcl9zaXplX2J5dGVzOworCWRiZygicm9vdCBkaXIgc3RhcnQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcm9vdF9zdGFydF9vZmYpOworCWRiZygiZXhwZWN0ZWQgZW50cmllcyAweCV4IiwgZGlyX2VudHJpZXMpOworCisJYnVmX3NpemUgPSBkaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmZhdF9kaXJfZW50cnkpOworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBmYXRfcGFydGl0aW9uX29mZiArIHJvb3Rfc3RhcnRfb2ZmLCBidWZfc2l6ZSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlnb3RvIHJldDsKKworCWxhYmVsID0gZ2V0X2F0dHJfdm9sdW1lX2lkKChzdHJ1Y3QgdmZhdF9kaXJfZW50cnkqKSBidWYsIGRpcl9lbnRyaWVzKTsKKworCXZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmLCAweDIwMCk7CisJaWYgKHZzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChsYWJlbCAhPSBOVUxMICYmIG1lbWNtcChsYWJlbCwgIk5PIE5BTUUgICAgIiwgMTEpICE9IDApIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgbGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGxhYmVsLCAxMSk7CisJfSBlbHNlIGlmIChtZW1jbXAodnMtPnR5cGUuZmF0LmxhYmVsLCAiTk8gTkFNRSAgICAiLCAxMSkgIT0gMCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB2cy0+dHlwZS5mYXQubGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHZzLT50eXBlLmZhdC5sYWJlbCwgMTEpOworCX0KKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHZzLT50eXBlLmZhdC5zZXJubywgVVVJRF9ET1MpOworCWdvdG8gcmV0OworCisgZmF0MzI6CisJLyogRkFUMzIgcm9vdCBkaXIgaXMgYSBjbHVzdGVyIGNoYWluIGxpa2UgYW55IG90aGVyIGRpcmVjdG9yeSAqLworCWJ1Zl9zaXplID0gdnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXIgKiBzZWN0b3Jfc2l6ZV9ieXRlczsKKwlyb290X2NsdXN0ZXIgPSBsZTMyX3RvX2NwdSh2cy0+dHlwZS5mYXQzMi5yb290X2NsdXN0ZXIpOworCXN0YXJ0X2RhdGFfc2N0ID0gcmVzZXJ2ZWRfc2N0ICsgZmF0X3NpemVfc2N0OworCisJbmV4dF9jbHVzdGVyID0gcm9vdF9jbHVzdGVyOworCW1heGxvb3AgPSAxMDA7CisJd2hpbGUgKC0tbWF4bG9vcCkgeworCQl1aW50NjRfdCBuZXh0X29mZl9zY3Q7CisJCXVpbnQ2NF90IG5leHRfb2ZmOworCQl1aW50NjRfdCBmYXRfZW50cnlfb2ZmOworCQlpbnQgY291bnQ7CisKKwkJZGJnKCJuZXh0X2NsdXN0ZXIgMHgleCIsICh1bnNpZ25lZCluZXh0X2NsdXN0ZXIpOworCQluZXh0X29mZl9zY3QgPSAodWludDY0X3QpKG5leHRfY2x1c3RlciAtIDIpICogdnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXI7CisJCW5leHRfb2ZmID0gKHN0YXJ0X2RhdGFfc2N0ICsgbmV4dF9vZmZfc2N0KSAqIHNlY3Rvcl9zaXplX2J5dGVzOworCQlkYmcoImNsdXN0ZXIgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG5leHRfb2ZmKTsKKworCQkvKiBnZXQgY2x1c3RlciAqLworCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgZmF0X3BhcnRpdGlvbl9vZmYgKyBuZXh0X29mZiwgYnVmX3NpemUpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlnb3RvIHJldDsKKworCQlkaXIgPSAoc3RydWN0IHZmYXRfZGlyX2VudHJ5KikgYnVmOworCQljb3VudCA9IGJ1Zl9zaXplIC8gc2l6ZW9mKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSk7CisJCWRiZygiZXhwZWN0ZWQgZW50cmllcyAweCV4IiwgY291bnQpOworCisJCWxhYmVsID0gZ2V0X2F0dHJfdm9sdW1lX2lkKGRpciwgY291bnQpOworCQlpZiAobGFiZWwpCisJCQlicmVhazsKKworCQkvKiBnZXQgRkFUIGVudHJ5ICovCisJCWZhdF9lbnRyeV9vZmYgPSAocmVzZXJ2ZWRfc2N0ICogc2VjdG9yX3NpemVfYnl0ZXMpICsgKG5leHRfY2x1c3RlciAqIHNpemVvZih1aW50MzJfdCkpOworCQlkYmcoImZhdF9lbnRyeV9vZmYgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylmYXRfZW50cnlfb2ZmKTsKKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmICsgZmF0X2VudHJ5X29mZiwgYnVmX3NpemUpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlnb3RvIHJldDsKKworCQkvKiBzZXQgbmV4dCBjbHVzdGVyICovCisJCW5leHRfY2x1c3RlciA9IGxlMzJfdG9fY3B1KCoodWludDMyX3QqKWJ1ZikgJiAweDBmZmZmZmZmOworCQlpZiAobmV4dF9jbHVzdGVyIDwgMiB8fCBuZXh0X2NsdXN0ZXIgPiBGQVQzMl9NQVgpCisJCQlicmVhazsKKwl9CisJaWYgKG1heGxvb3AgPT0gMCkKKwkJZGJnKCJyZWFjaGVkIG1heGltdW0gZm9sbG93IGNvdW50IG9mIHJvb3QgY2x1c3RlciBjaGFpbiwgZ2l2ZSB1cCIpOworCisJdnMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgZmF0X3BhcnRpdGlvbl9vZmYsIDB4MjAwKTsKKwlpZiAodnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxhYmVsICE9IE5VTEwgJiYgbWVtY21wKGxhYmVsLCAiTk8gTkFNRSAgICAiLCAxMSkgIT0gMCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBsYWJlbCwgMTEpOworCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgbGFiZWwsIDExKTsKKwl9IGVsc2UgaWYgKG1lbWNtcCh2cy0+dHlwZS5mYXQzMi5sYWJlbCwgIk5PIE5BTUUgICAgIiwgMTEpICE9IDApIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgdnMtPnR5cGUuZmF0MzIubGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHZzLT50eXBlLmZhdDMyLmxhYmVsLCAxMSk7CisJfQorCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgdnMtPnR5cGUuZmF0MzIuc2Vybm8sIFVVSURfRE9TKTsKKworIHJldDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKwlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAidmZhdCI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9nZXRfZGV2bmFtZS5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvZ2V0X2Rldm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk5MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvZ2V0X2Rldm5hbWUuYwpAQCAtMCwwICsxLDMxMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIG1vdW50aW5nIGRldmljZXMgYnkgbGFiZWwvdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBKYXNvbiBTY2hvb24gPGZsb3lkcGlua0BnbWFpbC5jb20+CisgKiBTb21lIHBvcnRpb25zIGNyaWJiZWQgZnJvbSBlMmZzcHJvZ3MsIHV0aWwtbGludXgsIGRvc2ZzdG9vbHMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+IC8qIEJMS0dFVFNJWkU2NCAqLworI2lmICFkZWZpbmVkKEJMS0dFVFNJWkU2NCkKKyMgZGVmaW5lIEJMS0dFVFNJWkU2NCBfSU9SKDB4MTIsMTE0LHNpemVfdCkKKyNlbmRpZgorI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdGF0aWMgc3RydWN0IHV1aWRDYWNoZV9zIHsKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKm5leHQ7CisvLwlpbnQgbWFqb3IsIG1pbm9yOworCWNoYXIgKmRldmljZTsKKwljaGFyICpsYWJlbDsKKwljaGFyICp1Y191dWlkOyAvKiBwcmVmaXggbWFrZXMgaXQgZWFzaWVyIHRvIGdyZXAgZm9yICovCisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGNvbnN0IGNoYXIgKnR5cGU7KQorfSAqdXVpZENhY2hlOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX0JMS0lEX1RZUEUKKyNkZWZpbmUgZ2V0X2xhYmVsX3V1aWQoZmQsIGxhYmVsLCB1dWlkLCB0eXBlKSBcCisJZ2V0X2xhYmVsX3V1aWQoZmQsIGxhYmVsLCB1dWlkKQorI2RlZmluZSB1dWlkY2FjaGVfYWRkZW50cnkoZGV2aWNlLCBsYWJlbCwgdXVpZCwgdHlwZSkgXAorCXV1aWRjYWNoZV9hZGRlbnRyeShkZXZpY2UsIGxhYmVsLCB1dWlkKQorI2VuZGlmCisKKy8qIFJldHVybnMgITAgb24gZXJyb3IuCisgKiBPdGhlcndpc2UsIHJldHVybnMgbWFsbG9jJ2VkIHN0cmluZ3MgZm9yIGxhYmVsIGFuZCB1dWlkCisgKiAoYW5kIHRoZXkgY2FuJ3QgYmUgTlVMTCwgYWx0aG91Z2ggdGhleSBjYW4gYmUgIiIpLgorICogTkI6IGNsb3NlcyBmZC4gKi8KK3N0YXRpYyBpbnQKK2dldF9sYWJlbF91dWlkKGludCBmZCwgY2hhciAqKmxhYmVsLCBjaGFyICoqdXVpZCwgY29uc3QgY2hhciAqKnR5cGUpCit7CisJaW50IHJ2ID0gMTsKKwl1aW50NjRfdCBzaXplOworCXN0cnVjdCB2b2x1bWVfaWQgKnZpZDsKKworCS8qIGZkIGlzIG93bmVkIGJ5IHZpZCBub3cgKi8KKwl2aWQgPSB2b2x1bWVfaWRfb3Blbl9ub2RlKGZkKTsKKworCWlmIChpb2N0bCgvKnZpZC0+Ki9mZCwgQkxLR0VUU0laRTY0LCAmc2l6ZSkgIT0gMCkKKwkJc2l6ZSA9IDA7CisKKwlpZiAodm9sdW1lX2lkX3Byb2JlX2FsbCh2aWQsIC8qMCwqLyBzaXplKSAhPSAwKQorCQlnb3RvIHJldDsKKworCWlmICh2aWQtPmxhYmVsWzBdICE9ICdcMCcgfHwgdmlkLT51dWlkWzBdICE9ICdcMCcpIHsKKwkJKmxhYmVsID0geHN0cm5kdXAodmlkLT5sYWJlbCwgc2l6ZW9mKHZpZC0+bGFiZWwpKTsKKwkJKnV1aWQgID0geHN0cm5kdXAodmlkLT51dWlkLCBzaXplb2YodmlkLT51dWlkKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCQkqdHlwZSA9IHZpZC0+dHlwZTsKKwkJZGJnKCJmb3VuZCBsYWJlbCAnJXMnLCB1dWlkICclcycsIHR5cGUgJyVzJyIsICpsYWJlbCwgKnV1aWQsICp0eXBlKTsKKyNlbHNlCisJCWRiZygiZm91bmQgbGFiZWwgJyVzJywgdXVpZCAnJXMnIiwgKmxhYmVsLCAqdXVpZCk7CisjZW5kaWYKKwkJcnYgPSAwOworCX0KKyByZXQ6CisJZnJlZV92b2x1bWVfaWQodmlkKTsgLyogYWxzbyBjbG9zZXMgZmQgKi8KKwlyZXR1cm4gcnY7Cit9CisKKy8qIE5COiB3ZSB0YWtlIG93bmVyc2hpcCBvZiAobWFsbG9jJ2VkKSBsYWJlbCBhbmQgdXVpZCAqLworc3RhdGljIHZvaWQKK3V1aWRjYWNoZV9hZGRlbnRyeShjaGFyICpkZXZpY2UsIC8qaW50IG1ham9yLCBpbnQgbWlub3IsKi8gY2hhciAqbGFiZWwsIGNoYXIgKnV1aWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc3RydWN0IHV1aWRDYWNoZV9zICpsYXN0OworCisJaWYgKCF1dWlkQ2FjaGUpIHsKKwkJbGFzdCA9IHV1aWRDYWNoZSA9IHh6YWxsb2Moc2l6ZW9mKCp1dWlkQ2FjaGUpKTsKKwl9IGVsc2UgeworCQlmb3IgKGxhc3QgPSB1dWlkQ2FjaGU7IGxhc3QtPm5leHQ7IGxhc3QgPSBsYXN0LT5uZXh0KQorCQkJY29udGludWU7CisJCWxhc3QtPm5leHQgPSB4emFsbG9jKHNpemVvZigqdXVpZENhY2hlKSk7CisJCWxhc3QgPSBsYXN0LT5uZXh0OworCX0KKwkvKmxhc3QtPm5leHQgPSBOVUxMOyAtIHh6YWxsb2MgZGlkIGl0Ki8KKy8vCWxhc3QtPm1ham9yID0gbWFqb3I7CisvLwlsYXN0LT5taW5vciA9IG1pbm9yOworCWxhc3QtPmRldmljZSA9IGRldmljZTsKKwlsYXN0LT5sYWJlbCA9IGxhYmVsOworCWxhc3QtPnVjX3V1aWQgPSB1dWlkOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShsYXN0LT50eXBlID0gdHlwZTspCit9CisKKy8qIElmIGdldF9sYWJlbF91dWlkKCkgb24gZGV2aWNlX25hbWUgcmV0dXJucyBzdWNjZXNzLAorICogYWRkIGEgY2FjaGUgZW50cnkgZm9yIHRoaXMgZGV2aWNlLgorICogSWYgZGV2aWNlIG5vZGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgdGVtcG9yYXJpbHkgY3JlYXRlZC4gKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit1dWlkY2FjaGVfY2hlY2tfZGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYsCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBub3RlOiB0aGlzIGNoZWNrIHJlamVjdHMgbGlua3MgdG8gZGV2aWNlcywgYW1vbmcgb3RoZXIgbm9kZXMgKi8KKwlpZiAoIVNfSVNCTEsoc3RhdGJ1Zi0+c3RfbW9kZSkpCisJCXJldHVybiBUUlVFOworCisJLyogVXNlcnMgcmVwb3J0IHRoYXQgbXVja2luZyB3aXRoIGZsb3BwaWVzIChlc3BlY2lhbGx5IG5vbi1wcmVzZW50CisJICogb25lcykgaXMgc2lnbmlmaWNhbnQgUElUQS4gVGhpcyBpcyBhIGhvcnJpYmx5IGRpcnR5IGhhY2ssCisJICogYnV0IGl0IGlzIHZlcnkgdXNlZnVsIGluIHJlYWwgd29ybGQuCisJICogSWYgdGhpcyB3aWxsIGV2ZXIgbmVlZCB0byBiZSBlbmFibGVkLCBjb25zaWRlciB1c2luZyBPX05PTkJMT0NLLgorCSAqLworCWlmIChtYWpvcihzdGF0YnVmLT5zdF9yZGV2KSA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKworCWFkZF90b191dWlkX2NhY2hlKGRldmljZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3V1aWRjYWNoZV9pbml0KHZvaWQpCit7CisJZGJnKCJEQkc6IHV1aWRDYWNoZT0leCwgdXVpZENhY2hlIik7CisJaWYgKHV1aWRDYWNoZSkKKwkJcmV0dXJuOworCisJLyogV2Ugd2VyZSBzY2FubmluZyAvcHJvYy9wYXJ0aXRpb25zCisJICogYW5kIC9wcm9jL3N5cy9kZXYvY2Ryb20vaW5mbyBoZXJlLgorCSAqIE1pc3NlZCB2b2x1bWUgbWFuYWdlcnMuIEkgc2VlIHRoYXQgInN0YW5kYXJkIiBibGtpZCB1c2VzIHRoZXNlOgorCSAqIC9kZXYvbWFwcGVyL2NvbnRyb2wKKwkgKiAvcHJvYy9kZXZpY2VzCisJICogL3Byb2MvZXZtcy92b2x1bWVzCisJICogL3Byb2MvbHZtL1ZHcworCSAqIFRoaXMgaXMgdW5hY2NlcHRhYmx5IGNvbXBsZXguIExldCdzIGp1c3Qgc2NhbiAvZGV2LgorCSAqIChNYXliZSBhZGQgc2Nhbm5pbmcgb2YgL3N5cy9ibG9jay9YWFgvZGV2IGZvciBkZXZpY2VzCisJICogc29tZWhvdyBub3QgaGF2aW5nIHRoZWlyIC9kZXYvWFhYIGVudHJpZXMgY3JlYXRlZD8pICovCisKKwlyZWN1cnNpdmVfYWN0aW9uKCIvZGV2IiwgQUNUSU9OX1JFQ1VSU0UsCisJCXV1aWRjYWNoZV9jaGVja19kZXZpY2UsIC8qIGZpbGVfYWN0aW9uICovCisJCU5VTEwsIC8qIGRpcl9hY3Rpb24gKi8KKwkJTlVMTCwgLyogdXNlckRhdGEgKi8KKwkJMCAvKiBkZXB0aCAqLyk7Cit9CisKKyNkZWZpbmUgVVVJRCAgIDEKKyNkZWZpbmUgVk9MICAgIDIKKworI2lmZGVmIFVOVVNFRAorc3RhdGljIGNoYXIgKgorZ2V0X3NwZWNfYnlfeChpbnQgbiwgY29uc3QgY2hhciAqdCwgaW50ICptYWpvclB0ciwgaW50ICptaW5vclB0cikKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKnVjOworCisJdXVpZGNhY2hlX2luaXQoKTsKKwl1YyA9IHV1aWRDYWNoZTsKKworCXdoaWxlICh1YykgeworCQlzd2l0Y2ggKG4pIHsKKwkJY2FzZSBVVUlEOgorCQkJaWYgKHN0cmNtcCh0LCB1Yy0+dWNfdXVpZCkgPT0gMCkgeworCQkJCSptYWpvclB0ciA9IHVjLT5tYWpvcjsKKwkJCQkqbWlub3JQdHIgPSB1Yy0+bWlub3I7CisJCQkJcmV0dXJuIHVjLT5kZXZpY2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWT0w6CisJCQlpZiAoc3RyY21wKHQsIHVjLT5sYWJlbCkgPT0gMCkgeworCQkJCSptYWpvclB0ciA9IHVjLT5tYWpvcjsKKwkJCQkqbWlub3JQdHIgPSB1Yy0+bWlub3I7CisJCQkJcmV0dXJuIHVjLT5kZXZpY2U7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl1YyA9IHVjLT5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2Zyb21oZXgoY2hhciBjKQoreworCWlmIChpc2RpZ2l0KGMpKQorCQlyZXR1cm4gKGMgLSAnMCcpOworCXJldHVybiAoKGN8MHgyMCkgLSAnYScgKyAxMCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF9zcGVjX2J5X3V1aWQoY29uc3QgY2hhciAqcywgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKwl1bnNpZ25lZCBjaGFyIHV1aWRbMTZdOworCWludCBpOworCisJaWYgKHN0cmxlbihzKSAhPSAzNiB8fCBzWzhdICE9ICctJyB8fCBzWzEzXSAhPSAnLScKKwkgfHwgc1sxOF0gIT0gJy0nIHx8IHNbMjNdICE9ICctJworCSkgeworCQlnb3RvIGJhZF91dWlkOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoKnMgPT0gJy0nKQorCQkJcysrOworCQlpZiAoIWlzeGRpZ2l0KHNbMF0pIHx8ICFpc3hkaWdpdChzWzFdKSkKKwkJCWdvdG8gYmFkX3V1aWQ7CisJCXV1aWRbaV0gPSAoKGZyb21oZXgoc1swXSkgPDwgNCkgfCBmcm9taGV4KHNbMV0pKTsKKwkJcyArPSAyOworCX0KKwlyZXR1cm4gZ2V0X3NwZWNfYnlfeChVVUlELCAoY2hhciAqKXV1aWQsIG1ham9yLCBtaW5vcik7CisKKyBiYWRfdXVpZDoKKwlmcHJpbnRmKHN0ZGVyciwgXygibW91bnQ6IGJhZCBVVUlEIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfc3BlY19ieV92b2x1bWVfbGFiZWwoY29uc3QgY2hhciAqcywgaW50ICptYWpvciwgaW50ICptaW5vcikKK3sKKwlyZXR1cm4gZ2V0X3NwZWNfYnlfeChWT0wsIHMsIG1ham9yLCBtaW5vcik7Cit9CisjZW5kaWYgLy8gVU5VU0VECisKKy8qIFVzZWQgYnkgYmxraWQgKi8KK3ZvaWQgZGlzcGxheV91dWlkX2NhY2hlKHZvaWQpCit7CisJc3RydWN0IHV1aWRDYWNoZV9zICp1OworCisJdXVpZGNhY2hlX2luaXQoKTsKKwl1ID0gdXVpZENhY2hlOworCXdoaWxlICh1KSB7CisJCXByaW50ZigiJXM6IiwgdS0+ZGV2aWNlKTsKKwkJaWYgKHUtPmxhYmVsWzBdKQorCQkJcHJpbnRmKCIgTEFCRUw9XCIlc1wiIiwgdS0+bGFiZWwpOworCQlpZiAodS0+dWNfdXVpZFswXSkKKwkJCXByaW50ZigiIFVVSUQ9XCIlc1wiIiwgdS0+dWNfdXVpZCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCWlmICh1LT50eXBlKQorCQlwcmludGYoIiBUWVBFPVwiJXNcIiIsIHUtPnR5cGUpOworI2VuZGlmCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCXUgPSB1LT5uZXh0OworCX0KK30KKworaW50IGFkZF90b191dWlkX2NhY2hlKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwljaGFyICp1dWlkID0gdXVpZDsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqbGFiZWwgPSBsYWJlbDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9CTEtJRF9UWVBFCisJY29uc3QgY2hhciAqdHlwZSA9IHR5cGU7CisjZW5kaWYKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBnZXRfbGFiZWxfdXVpZCgpIGNsb3NlcyBmZCBpbiBhbGwgY2FzZXMgKHN1Y2Nlc3MgJiBmYWlsdXJlKSAqLworCWlmIChnZXRfbGFiZWxfdXVpZChmZCwgJmxhYmVsLCAmdXVpZCwgJnR5cGUpID09IDApIHsKKwkJLyogdXVpZGNhY2hlX2FkZGVudHJ5KCkgdGFrZXMgb3duZXJzaGlwIG9mIGFsbCBmb3VyIHBhcmFtcyAqLworCQl1dWlkY2FjaGVfYWRkZW50cnkoeHN0cmR1cChkZXZpY2UpLCAvKm1hLCBtaSwqLyBsYWJlbCwgdXVpZCwgdHlwZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBVc2VkIGJ5IG1vdW50IGFuZCBmaW5kZnMgKi8KKworY2hhciAqZ2V0X2Rldm5hbWVfZnJvbV9sYWJlbChjb25zdCBjaGFyICpzcGVjKQoreworCXN0cnVjdCB1dWlkQ2FjaGVfcyAqdWM7CisKKwl1dWlkY2FjaGVfaW5pdCgpOworCXVjID0gdXVpZENhY2hlOworCXdoaWxlICh1YykgeworCQlpZiAodWMtPmxhYmVsWzBdICYmIHN0cmNtcChzcGVjLCB1Yy0+bGFiZWwpID09IDApIHsKKwkJCXJldHVybiB4c3RyZHVwKHVjLT5kZXZpY2UpOworCQl9CisJCXVjID0gdWMtPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitjaGFyICpnZXRfZGV2bmFtZV9mcm9tX3V1aWQoY29uc3QgY2hhciAqc3BlYykKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKnVjOworCisJdXVpZGNhY2hlX2luaXQoKTsKKwl1YyA9IHV1aWRDYWNoZTsKKwl3aGlsZSAodWMpIHsKKwkJLyogY2FzZSBvZiBoZXggbnVtYmVycyBkb2Vzbid0IG1hdHRlciAqLworCQlpZiAoc3RyY2FzZWNtcChzcGVjLCB1Yy0+dWNfdXVpZCkgPT0gMCkgeworCQkJcmV0dXJuIHhzdHJkdXAodWMtPmRldmljZSk7CisJCX0KKwkJdWMgPSB1Yy0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCByZXNvbHZlX21vdW50X3NwZWMoY2hhciAqKmZzbmFtZSkKK3sKKwljaGFyICp0bXAgPSAqZnNuYW1lOworCisJaWYgKHN0cm5jbXAoKmZzbmFtZSwgIlVVSUQ9IiwgNSkgPT0gMCkKKwkJdG1wID0gZ2V0X2Rldm5hbWVfZnJvbV91dWlkKCpmc25hbWUgKyA1KTsKKwllbHNlIGlmIChzdHJuY21wKCpmc25hbWUsICJMQUJFTD0iLCA2KSA9PSAwKQorCQl0bXAgPSBnZXRfZGV2bmFtZV9mcm9tX2xhYmVsKCpmc25hbWUgKyA2KTsKKworCWlmICh0bXAgPT0gKmZzbmFtZSkKKwkJcmV0dXJuIDA7IC8qIG5vIFVVSUQ9IG9yIExBQkVMPSBwcmVmaXggZm91bmQgKi8KKworCWlmICh0bXApCisJCSpmc25hbWUgPSB0bXA7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9oZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2hmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjE5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9oZnMuYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGhmc19maW5kZXJfaW5mb3sKKwl1aW50MzJfdAlib290X2ZvbGRlcjsKKwl1aW50MzJfdAlzdGFydF9hcHA7CisJdWludDMyX3QJb3Blbl9mb2xkZXI7CisJdWludDMyX3QJb3M5X2ZvbGRlcjsKKwl1aW50MzJfdAlyZXNlcnZlZDsKKwl1aW50MzJfdAlvc3hfZm9sZGVyOworCXVpbnQ4X3QJCWlkWzhdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNfbWRiIHsKKwl1aW50OF90CQlzaWduYXR1cmVbMl07CisJdWludDMyX3QJY3JfZGF0ZTsKKwl1aW50MzJfdAlsc19Nb2Q7CisJdWludDE2X3QJYXRyYjsKKwl1aW50MTZfdAlubV9mbHM7CisJdWludDE2X3QJdmJtX3N0OworCXVpbnQxNl90CWFsbG9jX3B0cjsKKwl1aW50MTZfdAlubV9hbF9ibGtzOworCXVpbnQzMl90CWFsX2Jsa19zaXplOworCXVpbnQzMl90CWNscF9zaXplOworCXVpbnQxNl90CWFsX2JsX3N0OworCXVpbnQzMl90CW54dF9jbmlkOworCXVpbnQxNl90CWZyZWVfYmtzOworCXVpbnQ4X3QJCWxhYmVsX2xlbjsKKwl1aW50OF90CQlsYWJlbFsyN107CisJdWludDMyX3QJdm9sX2JrdXA7CisJdWludDE2X3QJdm9sX3NlcV9udW07CisJdWludDMyX3QJd3JfY250OworCXVpbnQzMl90CXh0X2NsdW1wX3NpemU7CisJdWludDMyX3QJY3RfY2x1bXBfc2l6ZTsKKwl1aW50MTZfdAludW1fcm9vdF9kaXJzOworCXVpbnQzMl90CWZpbGVfY291bnQ7CisJdWludDMyX3QJZGlyX2NvdW50OworCXN0cnVjdCBoZnNfZmluZGVyX2luZm8gZmluZGVyX2luZm87CisJdWludDhfdAkJZW1iZWRfc2lnWzJdOworCXVpbnQxNl90CWVtYmVkX3N0YXJ0YmxvY2s7CisJdWludDE2X3QJZW1iZWRfYmxvY2tjb3VudDsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yIHsKKwl1aW50MzJfdAluZXh0OworCXVpbnQzMl90CXByZXY7CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQloZWlnaHQ7CisJdWludDE2X3QJbnVtX3JlY3M7CisJdWludDE2X3QJcmVzZXJ2ZWQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IGhmc3BsdXNfYmhlYWRlcl9yZWNvcmQgeworCXVpbnQxNl90CWRlcHRoOworCXVpbnQzMl90CXJvb3Q7CisJdWludDMyX3QJbGVhZl9jb3VudDsKKwl1aW50MzJfdAlsZWFmX2hlYWQ7CisJdWludDMyX3QJbGVhZl90YWlsOworCXVpbnQxNl90CW5vZGVfc2l6ZTsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSB7CisJdWludDE2X3QJa2V5X2xlbjsKKwl1aW50MzJfdAlwYXJlbnRfaWQ7CisJdWludDE2X3QJdW5pY29kZV9sZW47CisJdWludDhfdAkJdW5pY29kZVsyNTUgKiAyXTsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19leHRlbnQgeworCXVpbnQzMl90CXN0YXJ0X2Jsb2NrOworCXVpbnQzMl90CWJsb2NrX2NvdW50OworfSBQQUNLRUQ7CisKKyNkZWZpbmUgSEZTUExVU19FWFRFTlRfQ09VTlQJCTgKK3N0cnVjdCBoZnNwbHVzX2ZvcmsgeworCXVpbnQ2NF90CXRvdGFsX3NpemU7CisJdWludDMyX3QJY2x1bXBfc2l6ZTsKKwl1aW50MzJfdAl0b3RhbF9ibG9ja3M7CisJc3RydWN0IGhmc3BsdXNfZXh0ZW50IGV4dGVudHNbSEZTUExVU19FWFRFTlRfQ09VTlRdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNwbHVzX3ZvbF9oZWFkZXIgeworCXVpbnQ4X3QJCXNpZ25hdHVyZVsyXTsKKwl1aW50MTZfdAl2ZXJzaW9uOworCXVpbnQzMl90CWF0dHJpYnV0ZXM7CisJdWludDMyX3QJbGFzdF9tb3VudF92ZXJzOworCXVpbnQzMl90CXJlc2VydmVkOworCXVpbnQzMl90CWNyZWF0ZV9kYXRlOworCXVpbnQzMl90CW1vZGlmeV9kYXRlOworCXVpbnQzMl90CWJhY2t1cF9kYXRlOworCXVpbnQzMl90CWNoZWNrZWRfZGF0ZTsKKwl1aW50MzJfdAlmaWxlX2NvdW50OworCXVpbnQzMl90CWZvbGRlcl9jb3VudDsKKwl1aW50MzJfdAlibG9ja3NpemU7CisJdWludDMyX3QJdG90YWxfYmxvY2tzOworCXVpbnQzMl90CWZyZWVfYmxvY2tzOworCXVpbnQzMl90CW5leHRfYWxsb2M7CisJdWludDMyX3QJcnNyY19jbHVtcF9zejsKKwl1aW50MzJfdAlkYXRhX2NsdW1wX3N6OworCXVpbnQzMl90CW5leHRfY25pZDsKKwl1aW50MzJfdAl3cml0ZV9jb3VudDsKKwl1aW50NjRfdAllbmNvZGluZ3NfYm1wOworCXN0cnVjdCBoZnNfZmluZGVyX2luZm8gZmluZGVyX2luZm87CisJc3RydWN0IGhmc3BsdXNfZm9yayBhbGxvY19maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmsgZXh0X2ZpbGU7CisJc3RydWN0IGhmc3BsdXNfZm9yayBjYXRfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIGF0dHJfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIHN0YXJ0X2ZpbGU7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBIRlNfU1VQRVJCTE9DS19PRkZTRVQJCTB4NDAwCisjZGVmaW5lIEhGU19OT0RFX0xFQUYJCQkweGZmCisjZGVmaW5lIEhGU1BMVVNfUE9SX0NOSUQJCTEKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaGZzX2hmc3BsdXMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisJdWludDY0X3Qgb2ZmID0gMDsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJdW5zaWduZWQgY2F0X2Jsb2NrOworCXVuc2lnbmVkIGV4dF9ibG9ja19zdGFydDsKKwl1bnNpZ25lZCBleHRfYmxvY2tfY291bnQ7CisJaW50IGV4dDsKKwl1bnNpZ25lZCBsZWFmX25vZGVfaGVhZDsKKwl1bnNpZ25lZCBsZWFmX25vZGVfY291bnQ7CisJdW5zaWduZWQgbGVhZl9ub2RlX3NpemU7CisJdW5zaWduZWQgbGVhZl9ibG9jazsKKwl1aW50NjRfdCBsZWFmX29mZjsKKwl1bnNpZ25lZCBhbGxvY19ibG9ja19zaXplOworCXVuc2lnbmVkIGFsbG9jX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIGVtYmVkX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIHJlY29yZF9jb3VudDsKKwlzdHJ1Y3QgaGZzcGx1c192b2xfaGVhZGVyICpoZnNwbHVzOworCXN0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IgKmRlc2NyOworCXN0cnVjdCBoZnNwbHVzX2JoZWFkZXJfcmVjb3JkICpibm9kZTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSAqa2V5OworCXVuc2lnbmVkIGxhYmVsX2xlbjsKKwlzdHJ1Y3QgaGZzcGx1c19leHRlbnQgZXh0ZW50c1tIRlNQTFVTX0VYVEVOVF9DT1VOVF07CisJc3RydWN0IGhmc19tZGIgKmhmczsKKwljb25zdCB1aW50OF90ICpidWY7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSEZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwloZnMgPSAoc3RydWN0IGhmc19tZGIgKikgYnVmOworCWlmIChoZnMtPnNpZ25hdHVyZVswXSAhPSAnQicgfHwgaGZzLT5zaWduYXR1cmVbMV0gIT0gJ0QnKQorCQlnb3RvIGNoZWNrcGx1czsKKworCS8qIGl0IG1heSBiZSBqdXN0IGEgaGZzIHdyYXBwZXIgZm9yIGhmcysgKi8KKwlpZiAoaGZzLT5lbWJlZF9zaWdbMF0gPT0gJ0gnICYmIGhmcy0+ZW1iZWRfc2lnWzFdID09ICcrJykgeworCQlhbGxvY19ibG9ja19zaXplID0gYmUzMl90b19jcHUoaGZzLT5hbF9ibGtfc2l6ZSk7CisJCWRiZygiYWxsb2NfYmxvY2tfc2l6ZSAweCV4IiwgYWxsb2NfYmxvY2tfc2l6ZSk7CisKKwkJYWxsb2NfZmlyc3RfYmxvY2sgPSBiZTE2X3RvX2NwdShoZnMtPmFsX2JsX3N0KTsKKwkJZGJnKCJhbGxvY19maXJzdF9ibG9jayAweCV4IiwgYWxsb2NfZmlyc3RfYmxvY2spOworCisJCWVtYmVkX2ZpcnN0X2Jsb2NrID0gYmUxNl90b19jcHUoaGZzLT5lbWJlZF9zdGFydGJsb2NrKTsKKwkJZGJnKCJlbWJlZF9maXJzdF9ibG9jayAweCV4IiwgZW1iZWRfZmlyc3RfYmxvY2spOworCisJCW9mZiArPSAoYWxsb2NfZmlyc3RfYmxvY2sgKiA1MTIpICsKKwkJICAgICAgIChlbWJlZF9maXJzdF9ibG9jayAqIGFsbG9jX2Jsb2NrX3NpemUpOworCQlkYmcoImhmcyB3cmFwcGVkIGhmcysgZm91bmQgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIEhGU19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gY2hlY2twbHVzOworCX0KKworCWlmIChoZnMtPmxhYmVsX2xlbiA+IDAgJiYgaGZzLT5sYWJlbF9sZW4gPCAyOCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBoZnMtPmxhYmVsLCBoZnMtPmxhYmVsX2xlbik7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBoZnMtPmxhYmVsLCBoZnMtPmxhYmVsX2xlbikgOworCX0KKworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgaGZzLT5maW5kZXJfaW5mby5pZCwgVVVJRF9IRlMpOworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJoZnMiOykKKworCXJldHVybiAwOworCisgY2hlY2twbHVzOgorCWhmc3BsdXMgPSAoc3RydWN0IGhmc3BsdXNfdm9sX2hlYWRlciAqKSBidWY7CisJaWYgKGhmcy0+c2lnbmF0dXJlWzBdID09ICdIJykKKwkJaWYgKGhmcy0+c2lnbmF0dXJlWzFdID09ICcrJyB8fCBoZnMtPnNpZ25hdHVyZVsxXSA9PSAnWCcpCisJCQlnb3RvIGhmc3BsdXM7CisJcmV0dXJuIC0xOworCisgaGZzcGx1czoKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIGhmc3BsdXMtPmZpbmRlcl9pbmZvLmlkLCBVVUlEX0hGUyk7CisKKwlibG9ja3NpemUgPSBiZTMyX3RvX2NwdShoZnNwbHVzLT5ibG9ja3NpemUpOworCWRiZygiYmxvY2tzaXplICV1IiwgYmxvY2tzaXplKTsKKworCW1lbWNweShleHRlbnRzLCBoZnNwbHVzLT5jYXRfZmlsZS5leHRlbnRzLCBzaXplb2YoZXh0ZW50cykpOworCWNhdF9ibG9jayA9IGJlMzJfdG9fY3B1KGV4dGVudHNbMF0uc3RhcnRfYmxvY2spOworCWRiZygiY2F0YWxvZyBzdGFydCBibG9jayAweCV4IiwgY2F0X2Jsb2NrKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoY2F0X2Jsb2NrICogYmxvY2tzaXplKSwgMHgyMDAwKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwlibm9kZSA9IChzdHJ1Y3QgaGZzcGx1c19iaGVhZGVyX3JlY29yZCAqKQorCQkmYnVmW3NpemVvZihzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yKV07CisKKwlsZWFmX25vZGVfaGVhZCA9IGJlMzJfdG9fY3B1KGJub2RlLT5sZWFmX2hlYWQpOworCWRiZygiY2F0YWxvZyBsZWFmIG5vZGUgMHgleCIsIGxlYWZfbm9kZV9oZWFkKTsKKworCWxlYWZfbm9kZV9zaXplID0gYmUxNl90b19jcHUoYm5vZGUtPm5vZGVfc2l6ZSk7CisJZGJnKCJsZWFmIG5vZGUgc2l6ZSAweCV4IiwgbGVhZl9ub2RlX3NpemUpOworCisJbGVhZl9ub2RlX2NvdW50ID0gYmUzMl90b19jcHUoYm5vZGUtPmxlYWZfY291bnQpOworCWRiZygibGVhZiBub2RlIGNvdW50IDB4JXgiLCBsZWFmX25vZGVfY291bnQpOworCWlmIChsZWFmX25vZGVfY291bnQgPT0gMCkKKwkJZ290byBmb3VuZDsKKworCWxlYWZfYmxvY2sgPSAobGVhZl9ub2RlX2hlYWQgKiBsZWFmX25vZGVfc2l6ZSkgLyBibG9ja3NpemU7CisKKwkvKiBnZXQgcGh5c2ljYWwgbG9jYXRpb24gKi8KKwlmb3IgKGV4dCA9IDA7IGV4dCA8IEhGU1BMVVNfRVhURU5UX0NPVU5UOyBleHQrKykgeworCQlleHRfYmxvY2tfc3RhcnQgPSBiZTMyX3RvX2NwdShleHRlbnRzW2V4dF0uc3RhcnRfYmxvY2spOworCQlleHRfYmxvY2tfY291bnQgPSBiZTMyX3RvX2NwdShleHRlbnRzW2V4dF0uYmxvY2tfY291bnQpOworCQlkYmcoImV4dGVudCBzdGFydCBibG9jayAweCV4LCBjb3VudCAweCV4IiwgZXh0X2Jsb2NrX3N0YXJ0LCBleHRfYmxvY2tfY291bnQpOworCisJCWlmIChleHRfYmxvY2tfY291bnQgPT0gMCkKKwkJCWdvdG8gZm91bmQ7CisKKwkJLyogdGhpcyBpcyBvdXIgZXh0ZW50ICovCisJCWlmIChsZWFmX2Jsb2NrIDwgZXh0X2Jsb2NrX2NvdW50KQorCQkJYnJlYWs7CisKKwkJbGVhZl9ibG9jayAtPSBleHRfYmxvY2tfY291bnQ7CisJfQorCWlmIChleHQgPT0gSEZTUExVU19FWFRFTlRfQ09VTlQpCisJCWdvdG8gZm91bmQ7CisJZGJnKCJmb3VuZCBibG9jayBpbiBleHRlbnQgJWkiLCBleHQpOworCisJbGVhZl9vZmYgPSAoZXh0X2Jsb2NrX3N0YXJ0ICsgbGVhZl9ibG9jaykgKiBibG9ja3NpemU7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbGVhZl9vZmYsIGxlYWZfbm9kZV9zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwlkZXNjciA9IChzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yICopIGJ1ZjsKKwlkYmcoImRlc2NyaXB0b3IgdHlwZSAweCV4IiwgZGVzY3ItPnR5cGUpOworCisJcmVjb3JkX2NvdW50ID0gYmUxNl90b19jcHUoZGVzY3ItPm51bV9yZWNzKTsKKwlkYmcoIm51bWJlciBvZiByZWNvcmRzICV1IiwgcmVjb3JkX2NvdW50KTsKKwlpZiAocmVjb3JkX2NvdW50ID09IDApCisJCWdvdG8gZm91bmQ7CisKKwlpZiAoZGVzY3ItPnR5cGUgIT0gSEZTX05PREVfTEVBRikKKwkJZ290byBmb3VuZDsKKworCWtleSA9IChzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSAqKQorCQkmYnVmW3NpemVvZihzdHJ1Y3QgaGZzcGx1c19ibm9kZV9kZXNjcmlwdG9yKV07CisKKwlkYmcoInBhcmVudCBpZCAweCV4IiwgYmUzMl90b19jcHUoa2V5LT5wYXJlbnRfaWQpKTsKKwlpZiAoa2V5LT5wYXJlbnRfaWQgIT0gY3B1X3RvX2JlMzIoSEZTUExVU19QT1JfQ05JRCkpCisJCWdvdG8gZm91bmQ7CisKKwlsYWJlbF9sZW4gPSBiZTE2X3RvX2NwdShrZXktPnVuaWNvZGVfbGVuKSAqIDI7CisJZGJnKCJsYWJlbCB1bmljb2RlMTYgbGVuICVpIiwgbGFiZWxfbGVuKTsKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBrZXktPnVuaWNvZGUsIGxhYmVsX2xlbik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoaWQsIGtleS0+dW5pY29kZSwgQkUsIGxhYmVsX2xlbik7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gImhmc3BsdXMiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9pc285NjYwLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9pc285NjYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3NjkzYQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2lzbzk2NjAuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworI2RlZmluZSBJU09fU1VQRVJCTE9DS19PRkZTRVQJCTB4ODAwMAorI2RlZmluZSBJU09fU0VDVE9SX1NJWkUJCQkweDgwMAorI2RlZmluZSBJU09fVkRfT0ZGU0VUCQkJKElTT19TVVBFUkJMT0NLX09GRlNFVCArIElTT19TRUNUT1JfU0laRSkKKyNkZWZpbmUgSVNPX1ZEX1BSSU1BUlkJCQkweDEKKyNkZWZpbmUgSVNPX1ZEX1NVUFBMRU1FTlRBUlkJCTB4MgorI2RlZmluZSBJU09fVkRfRU5ECQkJMHhmZgorI2RlZmluZSBJU09fVkRfTUFYCQkJMTYKKworc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJdmRfdHlwZTsKKwl1aW50OF90CQl2ZF9pZFs1XTsKKwl1aW50OF90CQl2ZF92ZXJzaW9uOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXN5c3RlbV9pZFszMl07CisJdWludDhfdAkJdm9sdW1lX2lkWzMyXTsKKwl1aW50OF90CQl1bnVzZWRbOF07CisJdWludDhfdAkJc3BhY2Vfc2l6ZVs4XTsKKwl1aW50OF90CQllc2NhcGVfc2VxdWVuY2VzWzhdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoaWdoX3NpZXJyYV92b2x1bWVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJZm9vWzhdOworCXVpbnQ4X3QJCXR5cGU7CisJdWludDhfdAkJaWRbNF07CisJdWludDhfdAkJdmVyc2lvbjsKK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9pc285NjYwKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICppczsKKwlzdHJ1Y3QgaGlnaF9zaWVycmFfdm9sdW1lX2Rlc2NyaXB0b3IgKmhzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIElTT19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaXMgPSAoc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciAqKSBidWY7CisKKwlpZiAobWVtY21wKGlzLT52ZF9pZCwgIkNEMDAxIiwgNSkgPT0gMCkgeworCQlpbnQgdmRfb2Zmc2V0OworCQlpbnQgaTsKKworCQlkYmcoInJlYWQgbGFiZWwgZnJvbSBQVkQiKTsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgaXMtPnZvbHVtZV9pZCwgMzIpOworCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgaXMtPnZvbHVtZV9pZCwgMzIpOworCisJCWRiZygibG9va2luZyBmb3IgU1ZEcyIpOworCQl2ZF9vZmZzZXQgPSBJU09fVkRfT0ZGU0VUOworCQlmb3IgKGkgPSAwOyBpIDwgSVNPX1ZEX01BWDsgaSsrKSB7CisJCQl1aW50OF90IHN2ZF9sYWJlbFs2NF07CisKKwkJCWlzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIHZkX29mZnNldCwgMHgyMDApOworCQkJaWYgKGlzID09IE5VTEwgfHwgaXMtPnZkX3R5cGUgPT0gSVNPX1ZEX0VORCkKKwkJCQlicmVhazsKKwkJCWlmIChpcy0+dmRfdHlwZSAhPSBJU09fVkRfU1VQUExFTUVOVEFSWSkKKwkJCQljb250aW51ZTsKKworCQkJZGJnKCJmb3VuZCBTVkQgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIChvZmYgKyB2ZF9vZmZzZXQpKTsKKwkJCWlmIChtZW1jbXAoaXMtPmVzY2FwZV9zZXF1ZW5jZXMsICIlL0AiLCAzKSA9PSAwCisJCQkgfHwgbWVtY21wKGlzLT5lc2NhcGVfc2VxdWVuY2VzLCAiJS9DIiwgMykgPT0gMAorCQkJIHx8IG1lbWNtcChpcy0+ZXNjYXBlX3NlcXVlbmNlcywgIiUvRSIsIDMpID09IDAKKwkJCSkgeworCQkJCWRiZygiSm9saWV0IGV4dGVuc2lvbiBmb3VuZCIpOworCQkJCXZvbHVtZV9pZF9zZXRfdW5pY29kZTE2KChjaGFyICopc3ZkX2xhYmVsLCBzaXplb2Yoc3ZkX2xhYmVsKSwgaXMtPnZvbHVtZV9pZCwgQkUsIDMyKTsKKwkJCQlpZiAobWVtY21wKGlkLT5sYWJlbCwgc3ZkX2xhYmVsLCAxNikgPT0gMCkgeworCQkJCQlkYmcoIlNWRCBsYWJlbCBpcyBpZGVudGljYWwsIHVzZSB0aGUgcG9zc2libHkgbG9uZ2VyIFBWRCBvbmUiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisvLwkJCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgaXMtPnZvbHVtZV9pZCwgMzIpOworCQkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzdmRfbGFiZWwsIDMyKTsKKy8vCQkJCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiSm9saWV0IEV4dGVuc2lvbiIpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCQl2ZF9vZmZzZXQgKz0gSVNPX1NFQ1RPUl9TSVpFOworCQl9CisJCWdvdG8gZm91bmQ7CisJfQorCisJaHMgPSAoc3RydWN0IGhpZ2hfc2llcnJhX3ZvbHVtZV9kZXNjcmlwdG9yICopIGJ1ZjsKKworCWlmIChtZW1jbXAoaHMtPmlkLCAiQ0RST00iLCA1KSA9PSAwKSB7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJIaWdoIFNpZXJyYSIpOworCQlnb3RvIGZvdW5kOworCX0KKworCXJldHVybiAtMTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJpc285NjYwIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2pmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvamZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzM2FmMgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2pmcy5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBqZnNfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCW1hZ2ljWzRdOworCXVpbnQzMl90CXZlcnNpb247CisJdWludDY0X3QJc2l6ZTsKKwl1aW50MzJfdAlic2l6ZTsKKwl1aW50MzJfdAlkdW1teTE7CisJdWludDMyX3QJcGJzaXplOworCXVpbnQzMl90CWR1bW15MlsyN107CisJdWludDhfdAkJdXVpZFsxNl07CisJdWludDhfdAkJbGFiZWxbMTZdOworCXVpbnQ4X3QJCWxvZ3V1aWRbMTZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgSkZTX1NVUEVSQkxPQ0tfT0ZGU0VUCQkJMHg4MDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2pmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3QgamZzX3N1cGVyX2Jsb2NrICpqczsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWpzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIEpGU19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChqcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKGpzLT5tYWdpYywgIkpGUzEiLCA0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBqcy0+bGFiZWwsIDE2KTsKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwganMtPmxhYmVsLCAxNik7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBqcy0+dXVpZCwgVVVJRF9EQ0UpOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImpmcyI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9saW51eF9yYWlkLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9saW51eF9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3JhaWQuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWRwX3N1cGVyX2Jsb2NrIHsKKwl1aW50MzJfdAltZF9tYWdpYzsKKwl1aW50MzJfdAltYWpvcl92ZXJzaW9uOworCXVpbnQzMl90CW1pbm9yX3ZlcnNpb247CisJdWludDMyX3QJcGF0Y2hfdmVyc2lvbjsKKwl1aW50MzJfdAlndmFsaWRfd29yZHM7CisJdWludDMyX3QJc2V0X3V1aWQwOworCXVpbnQzMl90CWN0aW1lOworCXVpbnQzMl90CWxldmVsOworCXVpbnQzMl90CXNpemU7CisJdWludDMyX3QJbnJfZGlza3M7CisJdWludDMyX3QJcmFpZF9kaXNrczsKKwl1aW50MzJfdAltZF9taW5vcjsKKwl1aW50MzJfdAlub3RfcGVyc2lzdGVudDsKKwl1aW50MzJfdAlzZXRfdXVpZDE7CisJdWludDMyX3QJc2V0X3V1aWQyOworCXVpbnQzMl90CXNldF91dWlkMzsKK30gUEFDS0VEOworCisjZGVmaW5lIE1EX1JFU0VSVkVEX0JZVEVTCQkweDEwMDAwCisjZGVmaW5lIE1EX01BR0lDCQkJMHhhOTJiNGVmYworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9saW51eF9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKQoreworCXR5cGVkZWYgdWludDMyX3QgYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJdWludDY0X3Qgc2JvZmY7CisJdWludDhfdCB1dWlkWzE2XTsKKwlzdHJ1Y3QgbWRwX3N1cGVyX2Jsb2NrICptZHA7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCwgc2l6ZSAweCVsbHgiLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworCisJaWYgKHNpemUgPCAweDEwMDAwKQorCQlyZXR1cm4gLTE7CisKKwlzYm9mZiA9IChzaXplICYgfihNRF9SRVNFUlZFRF9CWVRFUyAtIDEpKSAtIE1EX1JFU0VSVkVEX0JZVEVTOworCW1kcCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBzYm9mZiwgMHg4MDApOworCWlmIChtZHAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1kcC0+bWRfbWFnaWMgIT0gY3B1X3RvX2xlMzIoTURfTUFHSUMpKQorCQlyZXR1cm4gLTE7CisKKwkqKGFsaWFzZWRfdWludDMyX3QqKXV1aWQgPSBtZHAtPnNldF91dWlkMDsKKwltZW1jcHkoJnV1aWRbNF0sICZtZHAtPnNldF91dWlkMSwgMTIpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgdXVpZCwgVVVJRF9EQ0UpOworCisvLwlzbnByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCBzaXplb2YoaWQtPnR5cGVfdmVyc2lvbiktMSwgIiV1LiV1LiV1IiwKKy8vCQkgbGUzMl90b19jcHUobWRwLT5tYWpvcl92ZXJzaW9uKSwKKy8vCQkgbGUzMl90b19jcHUobWRwLT5taW5vcl92ZXJzaW9uKSwKKy8vCQkgbGUzMl90b19jcHUobWRwLT5wYXRjaF92ZXJzaW9uKSk7CisKKwlkYmcoImZvdW5kIHJhaWQgc2lnbmF0dXJlIik7CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUkFJRCk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImxpbnV4X3JhaWRfbWVtYmVyIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3N3YXAuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU1MzRhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbGludXhfc3dhcC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBzd2FwX2hlYWRlcl92MV8yIHsKKwl1aW50OF90CQlib290Yml0c1sxMDI0XTsKKwl1aW50MzJfdAl2ZXJzaW9uOworCXVpbnQzMl90CWxhc3RfcGFnZTsKKwl1aW50MzJfdAlucl9iYWRwYWdlczsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQl2b2x1bWVfbmFtZVsxNl07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBMQVJHRVNUX1BBR0VTSVpFCQkJMHg0MDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3N3YXAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIgKnN3OworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwl1bnNpZ25lZCBwYWdlOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJLyogdGhlIHN3YXAgc2lnbmF0dXJlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIFBBR0VfU0laRSAqLworCWZvciAocGFnZSA9IDB4MTAwMDsgcGFnZSA8PSBMQVJHRVNUX1BBR0VTSVpFOyBwYWdlIDw8PSAxKSB7CisJCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgcGFnZS0xMCwgMTApOworCQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKG1lbWNtcChidWYsICJTV0FQLVNQQUNFIiwgMTApID09IDApIHsKKy8vCQkJCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMSc7CisvLwkJCQlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCisJCQlpZiAobWVtY21wKGJ1ZiwgIlNXQVBTUEFDRTIiLCAxMCkgPT0gMAorCQkJIHx8IG1lbWNtcChidWYsICJTMVNVU1BFTkQiLCA5KSA9PSAwCisJCQkgfHwgbWVtY21wKGJ1ZiwgIlMyU1VTUEVORCIsIDkpID09IDAKKwkJCSB8fCBtZW1jbXAoYnVmLCAiVUxTVVNQRU5EIiwgOSkgPT0gMAorCQkJKSB7CisJCQkJc3cgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCBzaXplb2Yoc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIpKTsKKwkJCQlpZiAoc3cgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC0xOworLy8JCQkJaWQtPnR5cGVfdmVyc2lvblswXSA9ICcyJzsKKy8vCQkJCWlkLT50eXBlX3ZlcnNpb25bMV0gPSAnXDAnOworLy8JCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHN3LT52b2x1bWVfbmFtZSwgMTYpOworCQkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzdy0+dm9sdW1lX25hbWUsIDE2KTsKKwkJCQl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHN3LT51dWlkLCBVVUlEX0RDRSk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwl9CisJcmV0dXJuIC0xOworCitmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9PVEhFUik7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInN3YXAiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvbHVrcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbHVrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjM3NjYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9sdWtzLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFcuIE1pY2hhZWwgUGV0dWxsbyA8bWlrZUBmbHluLm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKyNkZWZpbmUgTFVLU19NQUdJQ19MICAgICAgICAgICAgIDYKKyNkZWZpbmUgVVVJRF9TVFJJTkdfTCAgICAgICAgICAgNDAKKyNkZWZpbmUgTFVLU19DSVBIRVJOQU1FX0wgICAgICAgMzIKKyNkZWZpbmUgTFVLU19DSVBIRVJNT0RFX0wgICAgICAgMzIKKyNkZWZpbmUgTFVLU19IQVNIU1BFQ19MICAgICAgICAgMzIKKyNkZWZpbmUgTFVLU19ESUdFU1RTSVpFICAgICAgICAgMjAKKyNkZWZpbmUgTFVLU19TQUxUU0laRSAgICAgICAgICAgMzIKKyNkZWZpbmUgTFVLU19OVU1LRVlTICAgICAgICAgICAgIDgKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgTFVLU19NQUdJQ1tdID0geyAnTCcsJ1UnLCdLJywnUycsIDB4YmEsIDB4YmUgfTsKKworc3RydWN0IGx1a3NfcGhkciB7CisJdWludDhfdAkJbWFnaWNbTFVLU19NQUdJQ19MXTsKKwl1aW50MTZfdAl2ZXJzaW9uOworCXVpbnQ4X3QJCWNpcGhlck5hbWVbTFVLU19DSVBIRVJOQU1FX0xdOworCXVpbnQ4X3QJCWNpcGhlck1vZGVbTFVLU19DSVBIRVJNT0RFX0xdOworCXVpbnQ4X3QJCWhhc2hTcGVjW0xVS1NfSEFTSFNQRUNfTF07CisJdWludDMyX3QJcGF5bG9hZE9mZnNldDsKKwl1aW50MzJfdAlrZXlCeXRlczsKKwl1aW50OF90CQlta0RpZ2VzdFtMVUtTX0RJR0VTVFNJWkVdOworCXVpbnQ4X3QJCW1rRGlnZXN0U2FsdFtMVUtTX1NBTFRTSVpFXTsKKwl1aW50MzJfdAlta0RpZ2VzdEl0ZXJhdGlvbnM7CisJdWludDhfdAkJdXVpZFtVVUlEX1NUUklOR19MXTsKKwlzdHJ1Y3QgeworCQl1aW50MzJfdAlhY3RpdmU7CisJCXVpbnQzMl90CXBhc3N3b3JkSXRlcmF0aW9uczsKKwkJdWludDhfdAkJcGFzc3dvcmRTYWx0W0xVS1NfU0FMVFNJWkVdOworCQl1aW50MzJfdAlrZXlNYXRlcmlhbE9mZnNldDsKKwkJdWludDMyX3QJc3RyaXBlczsKKwl9IGtleWJsb2NrW0xVS1NfTlVNS0VZU107Cit9OworCitlbnVtIHsKKwlFWFBFQ1RFRF9TSVpFX2x1a3NfcGhkciA9IDAKKwkJKyAxICogTFVLU19NQUdJQ19MCisJCSsgMgorCQkrIDEgKiBMVUtTX0NJUEhFUk5BTUVfTAorCQkrIDEgKiBMVUtTX0NJUEhFUk1PREVfTAorCQkrIDEgKiBMVUtTX0hBU0hTUEVDX0wKKwkJKyA0CisJCSsgNAorCQkrIDEgKiBMVUtTX0RJR0VTVFNJWkUKKwkJKyAxICogTFVLU19TQUxUU0laRQorCQkrIDQKKwkJKyAxICogVVVJRF9TVFJJTkdfTAorCQkrIExVS1NfTlVNS0VZUyAqICgwCisJCSAgKyA0CisJCSAgKyA0CisJCSAgKyAxICogTFVLU19TQUxUU0laRQorCQkgICsgNAorCQkgICsgNAorCQkgICkKK307CisKK3N0cnVjdCBCVUdfYmFkX3NpemVfbHVrc19waGRyIHsKKwljaGFyIEJVR19iYWRfc2l6ZV9sdWtzX3BoZHJbCisJCXNpemVvZihzdHJ1Y3QgbHVrc19waGRyKSA9PSBFWFBFQ1RFRF9TSVpFX2x1a3NfcGhkciA/CisJCTEgOiAtMV07Cit9OworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9sdWtzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBsdWtzX3BoZHIgKmhlYWRlcjsKKworCWhlYWRlciA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIHNpemVvZigqaGVhZGVyKSk7CisJaWYgKGhlYWRlciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKGhlYWRlci0+bWFnaWMsIExVS1NfTUFHSUMsIExVS1NfTUFHSUNfTCkpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0NSWVBUTyk7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBoZWFkZXItPnV1aWQsIFVVSURfRENFX1NUUklORyk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImNyeXB0b19MVUtTIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL250ZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL250ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdmMTQxCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbnRmcy5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbnRmc19zdXBlcl9ibG9jayB7CisJdWludDhfdAkJanVtcFszXTsKKwl1aW50OF90CQlvZW1faWRbOF07CisJdWludDE2X3QJYnl0ZXNfcGVyX3NlY3RvcjsKKwl1aW50OF90CQlzZWN0b3JzX3Blcl9jbHVzdGVyOworCXVpbnQxNl90CXJlc2VydmVkX3NlY3RvcnM7CisJdWludDhfdAkJZmF0czsKKwl1aW50MTZfdAlyb290X2VudHJpZXM7CisJdWludDE2X3QJc2VjdG9yczsKKwl1aW50OF90CQltZWRpYV90eXBlOworCXVpbnQxNl90CXNlY3RvcnNfcGVyX2ZhdDsKKwl1aW50MTZfdAlzZWN0b3JzX3Blcl90cmFjazsKKwl1aW50MTZfdAloZWFkczsKKwl1aW50MzJfdAloaWRkZW5fc2VjdG9yczsKKwl1aW50MzJfdAlsYXJnZV9zZWN0b3JzOworCXVpbnQxNl90CXVudXNlZFsyXTsKKwl1aW50NjRfdAludW1iZXJfb2Zfc2VjdG9yczsKKwl1aW50NjRfdAltZnRfY2x1c3Rlcl9sb2NhdGlvbjsKKwl1aW50NjRfdAltZnRfbWlycm9yX2NsdXN0ZXJfbG9jYXRpb247CisJaW50OF90CQljbHVzdGVyX3Blcl9tZnRfcmVjb3JkOworCXVpbnQ4X3QJCXJlc2VydmVkMVszXTsKKwlpbnQ4X3QJCWNsdXN0ZXJfcGVyX2luZGV4X3JlY29yZDsKKwl1aW50OF90CQlyZXNlcnZlZDJbM107CisJdWludDhfdAkJdm9sdW1lX3NlcmlhbFs4XTsKKwl1aW50MTZfdAljaGVja3N1bTsKK30gUEFDS0VEOworCitzdHJ1Y3QgbWFzdGVyX2ZpbGVfdGFibGVfcmVjb3JkIHsKKwl1aW50OF90CQltYWdpY1s0XTsKKwl1aW50MTZfdAl1c2Ffb2ZzOworCXVpbnQxNl90CXVzYV9jb3VudDsKKwl1aW50NjRfdAlsc247CisJdWludDE2X3QJc2VxdWVuY2VfbnVtYmVyOworCXVpbnQxNl90CWxpbmtfY291bnQ7CisJdWludDE2X3QJYXR0cnNfb2Zmc2V0OworCXVpbnQxNl90CWZsYWdzOworCXVpbnQzMl90CWJ5dGVzX2luX3VzZTsKKwl1aW50MzJfdAlieXRlc19hbGxvY2F0ZWQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IGZpbGVfYXR0cmlidXRlIHsKKwl1aW50MzJfdAl0eXBlOworCXVpbnQzMl90CWxlbjsKKwl1aW50OF90CQlub25fcmVzaWRlbnQ7CisJdWludDhfdAkJbmFtZV9sZW47CisJdWludDE2X3QJbmFtZV9vZmZzZXQ7CisJdWludDE2X3QJZmxhZ3M7CisJdWludDE2X3QJaW5zdGFuY2U7CisJdWludDMyX3QJdmFsdWVfbGVuOworCXVpbnQxNl90CXZhbHVlX29mZnNldDsKK30gUEFDS0VEOworCitzdHJ1Y3Qgdm9sdW1lX2luZm8geworCXVpbnQ2NF90CXJlc2VydmVkOworCXVpbnQ4X3QJCW1ham9yX3ZlcjsKKwl1aW50OF90CQltaW5vcl92ZXI7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBNRlRfUkVDT1JEX1ZPTFVNRQkJCTMKKyNkZWZpbmUgTUZUX1JFQ09SRF9BVFRSX1ZPTFVNRV9OQU1FCQkweDYwCisjZGVmaW5lIE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfSU5GTwkJMHg3MAorI2RlZmluZSBNRlRfUkVDT1JEX0FUVFJfT0JKRUNUX0lECQkweDQwCisjZGVmaW5lIE1GVF9SRUNPUkRfQVRUUl9FTkQJCQkweGZmZmZmZmZmdQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9udGZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXVuc2lnbmVkIHNlY3Rvcl9zaXplOworCXVuc2lnbmVkIGNsdXN0ZXJfc2l6ZTsKKwl1aW50NjRfdCBtZnRfY2x1c3RlcjsKKwl1aW50NjRfdCBtZnRfb2ZmOworCXVuc2lnbmVkIG1mdF9yZWNvcmRfc2l6ZTsKKwl1bnNpZ25lZCBhdHRyX3R5cGU7CisJdW5zaWduZWQgYXR0cl9vZmY7CisJdW5zaWduZWQgYXR0cl9sZW47CisJdW5zaWduZWQgdmFsX29mZjsKKwl1bnNpZ25lZCB2YWxfbGVuOworCXN0cnVjdCBtYXN0ZXJfZmlsZV90YWJsZV9yZWNvcmQgKm1mdHI7CisJc3RydWN0IG50ZnNfc3VwZXJfYmxvY2sgKm5zOworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwljb25zdCB1aW50OF90ICp2YWw7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlucyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAobnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChucy0+b2VtX2lkLCAiTlRGUyIsIDQpICE9IDApCisJCXJldHVybiAtMTsKKworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgbnMtPnZvbHVtZV9zZXJpYWwsIFVVSURfTlRGUyk7CisKKwlzZWN0b3Jfc2l6ZSA9IGxlMTZfdG9fY3B1KG5zLT5ieXRlc19wZXJfc2VjdG9yKTsKKwljbHVzdGVyX3NpemUgPSBucy0+c2VjdG9yc19wZXJfY2x1c3RlciAqIHNlY3Rvcl9zaXplOworCW1mdF9jbHVzdGVyID0gbGU2NF90b19jcHUobnMtPm1mdF9jbHVzdGVyX2xvY2F0aW9uKTsKKwltZnRfb2ZmID0gbWZ0X2NsdXN0ZXIgKiBjbHVzdGVyX3NpemU7CisKKwlpZiAobnMtPmNsdXN0ZXJfcGVyX21mdF9yZWNvcmQgPCAwKQorCQkvKiBzaXplID0gLWxvZzIobWZ0X3JlY29yZF9zaXplKTsgbm9ybWFsbHkgMTAyNCBCeXRlcyAqLworCQltZnRfcmVjb3JkX3NpemUgPSAxIDw8IC1ucy0+Y2x1c3Rlcl9wZXJfbWZ0X3JlY29yZDsKKwllbHNlCisJCW1mdF9yZWNvcmRfc2l6ZSA9IG5zLT5jbHVzdGVyX3Blcl9tZnRfcmVjb3JkICogY2x1c3Rlcl9zaXplOworCisJZGJnKCJzZWN0b3JzaXplICAweCV4Iiwgc2VjdG9yX3NpemUpOworCWRiZygiY2x1c3RlcnNpemUgMHgleCIsIGNsdXN0ZXJfc2l6ZSk7CisJZGJnKCJtZnRjbHVzdGVyICAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWZ0X2NsdXN0ZXIpOworCWRiZygibWZ0b2Zmc2V0ICAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBtZnRfb2ZmKTsKKwlkYmcoImNsdXN0ZXIgcGVyIG1mdF9yZWNvcmQgICVpIiwgbnMtPmNsdXN0ZXJfcGVyX21mdF9yZWNvcmQpOworCWRiZygibWZ0IHJlY29yZCBzaXplICAlaSIsIG1mdF9yZWNvcmRfc2l6ZSk7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWZ0X29mZiArIChNRlRfUkVDT1JEX1ZPTFVNRSAqIG1mdF9yZWNvcmRfc2l6ZSksCisJCQkgbWZ0X3JlY29yZF9zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwltZnRyID0gKHN0cnVjdCBtYXN0ZXJfZmlsZV90YWJsZV9yZWNvcmQqKSBidWY7CisKKwlkYmcoIm1mdHItPm1hZ2ljICclYyVjJWMlYyciLCBtZnRyLT5tYWdpY1swXSwgbWZ0ci0+bWFnaWNbMV0sIG1mdHItPm1hZ2ljWzJdLCBtZnRyLT5tYWdpY1szXSk7CisJaWYgKG1lbWNtcChtZnRyLT5tYWdpYywgIkZJTEUiLCA0KSAhPSAwKQorCQlnb3RvIGZvdW5kOworCisJYXR0cl9vZmYgPSBsZTE2X3RvX2NwdShtZnRyLT5hdHRyc19vZmZzZXQpOworCWRiZygiZmlsZSAkVm9sdW1lJ3MgYXR0cmlidXRlcyBhcmUgYXQgb2Zmc2V0ICVpIiwgYXR0cl9vZmYpOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGZpbGVfYXR0cmlidXRlICphdHRyOworCisJCWF0dHIgPSAoc3RydWN0IGZpbGVfYXR0cmlidXRlKikgJmJ1ZlthdHRyX29mZl07CisJCWF0dHJfdHlwZSA9IGxlMzJfdG9fY3B1KGF0dHItPnR5cGUpOworCQlhdHRyX2xlbiA9IGxlMTZfdG9fY3B1KGF0dHItPmxlbik7CisJCXZhbF9vZmYgPSBsZTE2X3RvX2NwdShhdHRyLT52YWx1ZV9vZmZzZXQpOworCQl2YWxfbGVuID0gbGUzMl90b19jcHUoYXR0ci0+dmFsdWVfbGVuKTsKKwkJYXR0cl9vZmYgKz0gYXR0cl9sZW47CisKKwkJaWYgKGF0dHJfbGVuID09IDApCisJCQlicmVhazsKKworCQlpZiAoYXR0cl9vZmYgPj0gbWZ0X3JlY29yZF9zaXplKQorCQkJYnJlYWs7CisKKwkJaWYgKGF0dHJfdHlwZSA9PSBNRlRfUkVDT1JEX0FUVFJfRU5EKQorCQkJYnJlYWs7CisKKwkJZGJnKCJmb3VuZCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBsZW4gJWksIGF0IG9mZnNldCAlaSIsCisJCSAgICBhdHRyX3R5cGUsIGF0dHJfbGVuLCBhdHRyX29mZik7CisKKy8vCQlpZiAoYXR0cl90eXBlID09IE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfSU5GTykgeworLy8JCQlzdHJ1Y3Qgdm9sdW1lX2luZm8gKmluZm87CisvLwkJCWRiZygiZm91bmQgaW5mbywgbGVuICVpIiwgdmFsX2xlbik7CisvLwkJCWluZm8gPSAoc3RydWN0IHZvbHVtZV9pbmZvKikgKCgodWludDhfdCAqKSBhdHRyKSArIHZhbF9vZmYpOworLy8JCQlzbnByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCBzaXplb2YoaWQtPnR5cGVfdmVyc2lvbiktMSwKKy8vCQkJCSAiJXUuJXUiLCBpbmZvLT5tYWpvcl92ZXIsIGluZm8tPm1pbm9yX3Zlcik7CisvLwkJfQorCisJCWlmIChhdHRyX3R5cGUgPT0gTUZUX1JFQ09SRF9BVFRSX1ZPTFVNRV9OQU1FKSB7CisJCQlkYmcoImZvdW5kIGxhYmVsLCBsZW4gJWkiLCB2YWxfbGVuKTsKKwkJCWlmICh2YWxfbGVuID4gVk9MVU1FX0lEX0xBQkVMX1NJWkUpCisJCQkJdmFsX2xlbiA9IFZPTFVNRV9JRF9MQUJFTF9TSVpFOworCisJCQl2YWwgPSAoKHVpbnQ4X3QgKikgYXR0cikgKyB2YWxfb2ZmOworLy8JCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgdmFsLCB2YWxfbGVuKTsKKwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KGlkLCB2YWwsIExFLCB2YWxfbGVuKTsKKwkJfQorCX0KKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJudGZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL29jZnMyLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9vY2ZzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGIxNTEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9vY2ZzMi5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgQW5kcmUgTWFzZWxsYSA8YW5kcmVAbWFzZWxsYS5uby1pcC5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisvKiBBbGwgdGhlc2UgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIG9jZnMyLXRvb2xzJ3Mgb2NmczJfZnMuaCAqLworI2RlZmluZSBPQ0ZTMl9WT0xfVVVJRF9MRU4JCQkxNgorI2RlZmluZSBPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTgkJCTY0CisjZGVmaW5lIE9DRlMyX1NVUEVSQkxPQ0tfT0ZGU0VUCQkJMHgyMDAwCisKKworLyogVGhpcyBpcyB0aGUgc3VwZXJibG9jay4gVGhlIE9DRlMyIGhlYWRlciBmaWxlcyBoYXZlIHN0cnVjdHMgaW4gc3RydWN0cy4KK1RoaXMgaXMgb25lIGhhcyBiZWVuIHNpbXBsaWZpZWQgc2luY2Ugd2Ugb25seSBjYXJlIGFib3V0IHRoZSBzdXBlcmJsb2NrLgorKi8KKworc3RydWN0IG9jZnMyX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90CQlpX3NpZ25hdHVyZVs4XTsJCQkvKiBTaWduYXR1cmUgZm9yIHZhbGlkYXRpb24gKi8KKwl1aW50MzJfdAlpX2dlbmVyYXRpb247CQkJLyogR2VuZXJhdGlvbiBudW1iZXIgKi8KKwlpbnQxNl90CQlpX3N1YmFsbG9jX3Nsb3Q7CQkJLyogU2xvdCBzdWJhbGxvY2F0b3IgdGhpcyBpbm9kZSBiZWxvbmdzIHRvICovCisJdWludDE2X3QJaV9zdWJhbGxvY19iaXQ7CQkJLyogQml0IG9mZnNldCBpbiBzdWJhbGxvY2F0b3IgYmxvY2sgZ3JvdXAgKi8KKwl1aW50MzJfdAlpX3Jlc2VydmVkMDsKKwl1aW50MzJfdAlpX2NsdXN0ZXJzOwkJCS8qIENsdXN0ZXIgY291bnQgKi8KKwl1aW50MzJfdAlpX3VpZDsJCQkJLyogT3duZXIgVUlEICovCisJdWludDMyX3QJaV9naWQ7CQkJCS8qIE93bmluZyBHSUQgKi8KKwl1aW50NjRfdAlpX3NpemU7CQkJCS8qIFNpemUgaW4gYnl0ZXMgKi8KKwl1aW50MTZfdAlpX21vZGU7CQkJCS8qIEZpbGUgbW9kZSAqLworCXVpbnQxNl90CWlfbGlua3NfY291bnQ7CQkJLyogTGlua3MgY291bnQgKi8KKwl1aW50MzJfdAlpX2ZsYWdzOwkJCQkvKiBGaWxlIGZsYWdzICovCisJdWludDY0X3QJaV9hdGltZTsJCQkJLyogQWNjZXNzIHRpbWUgKi8KKwl1aW50NjRfdAlpX2N0aW1lOwkJCQkvKiBDcmVhdGlvbiB0aW1lICovCisJdWludDY0X3QJaV9tdGltZTsJCQkJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwl1aW50NjRfdAlpX2R0aW1lOwkJCQkvKiBEZWxldGlvbiB0aW1lICovCisJdWludDY0X3QJaV9ibGtubzsJCQkJLyogT2Zmc2V0IG9uIGRpc2ssIGluIGJsb2NrcyAqLworCXVpbnQ2NF90CWlfbGFzdF9lYl9ibGs7CQkJLyogUG9pbnRlciB0byBsYXN0IGV4dGVudCBibG9jayAqLworCXVpbnQzMl90CWlfZnNfZ2VuZXJhdGlvbjsJCQkvKiBHZW5lcmF0aW9uIHBlciBmcy1pbnN0YW5jZSAqLworCXVpbnQzMl90CWlfYXRpbWVfbnNlYzsKKwl1aW50MzJfdAlpX2N0aW1lX25zZWM7CisJdWludDMyX3QJaV9tdGltZV9uc2VjOworCXVpbnQ2NF90CWlfcmVzZXJ2ZWQxWzldOworCXVpbnQ2NF90CWlfcGFkMTsJCQkJLyogR2VuZXJpYyB3YXkgdG8gcmVmZXIgdG8gdGhpcyA2NGJpdCB1bmlvbiAqLworCS8qIE5vcm1hbGx5IHRoZXJlIGlzIGEgdW5pb24gb2YgdGhlIGRpZmZlcmVudCBibG9jayB0eXBlcywgYnV0IHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgc3VwZXJibG9jay4gKi8KKwl1aW50MTZfdAlzX21ham9yX3Jldl9sZXZlbDsKKwl1aW50MTZfdAlzX21pbm9yX3Jldl9sZXZlbDsKKwl1aW50MTZfdAlzX21udF9jb3VudDsKKwlpbnQxNl90CQlzX21heF9tbnRfY291bnQ7CisJdWludDE2X3QJc19zdGF0ZTsJCQkJLyogRmlsZSBzeXN0ZW0gc3RhdGUgKi8KKwl1aW50MTZfdAlzX2Vycm9yczsJCQkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCXVpbnQzMl90CXNfY2hlY2tpbnRlcnZhbDsJCQkvKiBNYXggdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCXVpbnQ2NF90CXNfbGFzdGNoZWNrOwkJCS8qIFRpbWUgb2YgbGFzdCBjaGVjayAqLworCXVpbnQzMl90CXNfY3JlYXRvcl9vczsJCQkvKiBPUyAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9jb21wYXQ7CQkJLyogQ29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9pbmNvbXBhdDsJCS8qIEluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9yb19jb21wYXQ7CQkvKiBSZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJdWludDY0X3QJc19yb290X2Jsa25vOwkJCS8qIE9mZnNldCwgaW4gYmxvY2tzLCBvZiByb290IGRpcmVjdG9yeSBkaW5vZGUgKi8KKwl1aW50NjRfdAlzX3N5c3RlbV9kaXJfYmxrbm87CQkvKiBPZmZzZXQsIGluIGJsb2Nrcywgb2Ygc3lzdGVtIGRpcmVjdG9yeSBkaW5vZGUgKi8KKwl1aW50MzJfdAlzX2Jsb2Nrc2l6ZV9iaXRzOwkJCS8qIEJsb2Nrc2l6ZSBmb3IgdGhpcyBmcyAqLworCXVpbnQzMl90CXNfY2x1c3RlcnNpemVfYml0czsJCS8qIENsdXN0ZXJzaXplIGZvciB0aGlzIGZzICovCisJdWludDE2X3QJc19tYXhfc2xvdHM7CQkJLyogTWF4IG51bWJlciBvZiBzaW11bHRhbmVvdXMgbW91bnRzIGJlZm9yZSB0dW5lZnMgcmVxdWlyZWQgKi8KKwl1aW50MTZfdAlzX3Jlc2VydmVkMTsKKwl1aW50MzJfdAlzX3Jlc2VydmVkMjsKKwl1aW50NjRfdAlzX2ZpcnN0X2NsdXN0ZXJfZ3JvdXA7CQkvKiBCbG9jayBvZmZzZXQgb2YgMXN0IGNsdXN0ZXIgZ3JvdXAgaGVhZGVyICovCisJdWludDhfdAkJc19sYWJlbFtPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTl07CS8qIExhYmVsIGZvciBtb3VudGluZywgZXRjLiAqLworCXVpbnQ4X3QJCXNfdXVpZFtPQ0ZTMl9WT0xfVVVJRF9MRU5dOwkvKiAxMjgtYml0IHV1aWQgKi8KK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9vY2ZzMihzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3Qgb2NmczJfc3VwZXJfYmxvY2sgKm9zOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJb3MgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgT0NGUzJfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAob3MgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChvcy0+aV9zaWduYXR1cmUsICJPQ0ZTVjIiLCA2KSAhPSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBvcy0+c19sYWJlbCwgT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU4gPCBWT0xVTUVfSURfTEFCRUxfU0laRSA/CisvLwkJCQkJT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU4gOiBWT0xVTUVfSURfTEFCRUxfU0laRSk7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIG9zLT5zX2xhYmVsLCBPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTiA8IFZPTFVNRV9JRF9MQUJFTF9TSVpFID8KKwkJCQkJT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU4gOiBWT0xVTUVfSURfTEFCRUxfU0laRSk7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBvcy0+c191dWlkLCBVVUlEX0RDRSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gIm9jZnMyIjspCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yZWlzZXJmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvcmVpc2VyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I0YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvcmVpc2VyZnMuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRvYmlhcyBLbGF1c2VyIDx0a2xhdXNlckBhY2Nlc3MudW5pemguY2g+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWJsb2Nrc19jb3VudDsKKwl1aW50MzJfdAlmcmVlX2Jsb2NrczsKKwl1aW50MzJfdAlyb290X2Jsb2NrOworCXVpbnQzMl90CWpvdXJuYWxfYmxvY2s7CisJdWludDMyX3QJam91cm5hbF9kZXY7CisJdWludDMyX3QJb3JpZ19qb3VybmFsX3NpemU7CisJdWludDMyX3QJZHVtbXkyWzVdOworCXVpbnQxNl90CWJsb2Nrc2l6ZTsKKwl1aW50MTZfdAlkdW1teTNbM107CisJdWludDhfdAkJbWFnaWNbMTJdOworCXVpbnQzMl90CWR1bW15NFs1XTsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQlsYWJlbFsxNl07Cit9IFBBQ0tFRDsKKworc3RydWN0IHJlaXNlcjRfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCW1hZ2ljWzE2XTsKKwl1aW50MTZfdAlkdW1teVsyXTsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQlsYWJlbFsxNl07CisJdWludDY0X3QJZHVtbXkyOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgUkVJU0VSRlMxX1NVUEVSQkxPQ0tfT0ZGU0VUCQkweDIwMDAKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJCTE9DS19PRkZTRVQJCTB4MTAwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfcmVpc2VyZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwlzdHJ1Y3QgcmVpc2VyNF9zdXBlcl9ibG9jayAqcnM0OworCisJZGJnKCJyZWlzZXJmczogcHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXJzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIFJFSVNFUkZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKHJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyRnMiLCA4KSA9PSAwKSB7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFckZzLCBubyBsYWJlbCIpOworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiMy41Iik7CisJCWdvdG8gZm91bmQ7CisJfQorCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyMkZzIiwgOSkgPT0gMCkgeworCQlkYmcoInJlaXNlcmZzOiBSZUlzRXIyRnMiKTsKKy8vCQlzdHJjcHkoaWQtPnR5cGVfdmVyc2lvbiwgIjMuNiIpOworCQlnb3RvIGZvdW5kX2xhYmVsOworCX0KKwlpZiAobWVtY21wKHJzLT5tYWdpYywgIlJlSXNFcjNGcyIsIDkpID09IDApIHsKKwkJZGJnKCJyZWlzZXJmczogUmVJc0VyM0ZzIik7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJKUiIpOworCQlnb3RvIGZvdW5kX2xhYmVsOworCX0KKworCXJzNCA9IChzdHJ1Y3QgcmVpc2VyNF9zdXBlcl9ibG9jayAqKSByczsKKwlpZiAobWVtY21wKHJzNC0+bWFnaWMsICJSZUlzRXI0IiwgNykgPT0gMCkgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiNCIpOworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCByczQtPmxhYmVsLCAxNik7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCByczQtPmxhYmVsLCAxNik7CisJCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgcnM0LT51dWlkLCBVVUlEX0RDRSk7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFcjQsIGxhYmVsICclcycgdXVpZCAnJXMnIiwgaWQtPmxhYmVsLCBpZC0+dXVpZCk7CisJCWdvdG8gZm91bmQ7CisJfQorCisJcnMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgUkVJU0VSRlMxX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKHJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyRnMiLCA4KSA9PSAwKSB7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFckZzLCBubyBsYWJlbCIpOworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiMy41Iik7CisJCWdvdG8gZm91bmQ7CisJfQorCisJZGJnKCJyZWlzZXJmczogbm8gc2lnbmF0dXJlIGZvdW5kIik7CisJcmV0dXJuIC0xOworCisgZm91bmRfbGFiZWw6CisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgcnMtPmxhYmVsLCAxNik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHJzLT5sYWJlbCwgMTYpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgcnMtPnV1aWQsIFVVSURfRENFKTsKKwlkYmcoInJlaXNlcmZzOiBsYWJlbCAnJXMnIHV1aWQgJyVzJyIsIGlkLT5sYWJlbCwgaWQtPnV1aWQpOworCisgZm91bmQ6CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInJlaXNlcmZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3JvbWZzLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yb21mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjUzYmUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yb21mcy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCByb21mc19zdXBlciB7CisJdWludDhfdCBtYWdpY1s4XTsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGNoZWNrc3VtOworCXVpbnQ4X3QgbmFtZVtdOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3JvbWZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCByb21mc19zdXBlciAqcmZzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJcmZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiwgMHgyMDApOworCWlmIChyZnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChyZnMtPm1hZ2ljLCAiLXJvbTFmcy0iLCA0KSA9PSAwKSB7CisJCXNpemVfdCBsZW4gPSBzdHJsZW4oKGNoYXIgKilyZnMtPm5hbWUpOworCisJCWlmIChsZW4pIHsKKy8vCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHJmcy0+bmFtZSwgbGVuKTsKKwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCByZnMtPm5hbWUsIGxlbik7CisJCX0KKworLy8JCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKwkJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInJvbWZzIjspCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3N5c3YuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3N5c3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI5NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvc3lzdi5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisjZGVmaW5lIFNZU1ZfTklDSU5PRAkJCTEwMAorI2RlZmluZSBTWVNWX05JQ0ZSRUUJCQk1MAorCitzdHJ1Y3Qgc3lzdl9zdXBlciB7CisJdWludDE2X3QJc19pc2l6ZTsKKwl1aW50MTZfdAlzX3BhZDA7CisJdWludDMyX3QJc19mc2l6ZTsKKwl1aW50MTZfdAlzX25mcmVlOworCXVpbnQxNl90CXNfcGFkMTsKKwl1aW50MzJfdAlzX2ZyZWVbU1lTVl9OSUNGUkVFXTsKKwl1aW50MTZfdAlzX25pbm9kZTsKKwl1aW50MTZfdAlzX3BhZDI7CisJdWludDE2X3QJc19pbm9kZVtTWVNWX05JQ0lOT0RdOworCXVpbnQ4X3QJCXNfZmxvY2s7CisJdWludDhfdAkJc19pbG9jazsKKwl1aW50OF90CQlzX2Ztb2Q7CisJdWludDhfdAkJc19yb25seTsKKwl1aW50MzJfdAlzX3RpbWU7CisJdWludDE2X3QJc19kaW5mb1s0XTsKKwl1aW50MzJfdAlzX3RmcmVlOworCXVpbnQxNl90CXNfdGlub2RlOworCXVpbnQxNl90CXNfcGFkMzsKKwl1aW50OF90CQlzX2ZuYW1lWzZdOworCXVpbnQ4X3QJCXNfZnBhY2tbNl07CisJdWludDMyX3QJc19maWxsWzEyXTsKKwl1aW50MzJfdAlzX3N0YXRlOworCXVpbnQzMl90CXNfbWFnaWM7CisJdWludDMyX3QJc190eXBlOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgWEVOSVhfTklDSU5PRAkJCQkxMDAKKyNkZWZpbmUgWEVOSVhfTklDRlJFRQkJCQkxMDAKKworc3RydWN0IHhlbml4X3N1cGVyIHsKKwl1aW50MTZfdAlzX2lzaXplOworCXVpbnQzMl90CXNfZnNpemU7CisJdWludDE2X3QJc19uZnJlZTsKKwl1aW50MzJfdAlzX2ZyZWVbWEVOSVhfTklDRlJFRV07CisJdWludDE2X3QJc19uaW5vZGU7CisJdWludDE2X3QJc19pbm9kZVtYRU5JWF9OSUNJTk9EXTsKKwl1aW50OF90CQlzX2Zsb2NrOworCXVpbnQ4X3QJCXNfaWxvY2s7CisJdWludDhfdAkJc19mbW9kOworCXVpbnQ4X3QJCXNfcm9ubHk7CisJdWludDMyX3QJc190aW1lOworCXVpbnQzMl90CXNfdGZyZWU7CisJdWludDE2X3QJc190aW5vZGU7CisJdWludDE2X3QJc19kaW5mb1s0XTsKKwl1aW50OF90CQlzX2ZuYW1lWzZdOworCXVpbnQ4X3QJCXNfZnBhY2tbNl07CisJdWludDhfdAkJc19jbGVhbjsKKwl1aW50OF90CQlzX2ZpbGxbMzcxXTsKKwl1aW50MzJfdAlzX21hZ2ljOworCXVpbnQzMl90CXNfdHlwZTsKK30gUEFDS0VEOworCisjZGVmaW5lIFNZU1ZfU1VQRVJCTE9DS19CTE9DSwkJCTB4MDEKKyNkZWZpbmUgU1lTVl9NQUdJQwkJCQkweGZkMTg3ZTIwCisjZGVmaW5lIFhFTklYX1NVUEVSQkxPQ0tfQkxPQ0sJCQkweDE4CisjZGVmaW5lIFhFTklYX01BR0lDCQkJCTB4MmI1NTQ0CisjZGVmaW5lIFNZU1ZfTUFYX0JMT0NLU0laRQkJCTB4ODAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3N5c3Yoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHN5c3Zfc3VwZXIgKnZzOworCXN0cnVjdCB4ZW5peF9zdXBlciAqeHM7CisJdW5zaWduZWQgYm9mZjsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWZvciAoYm9mZiA9IDB4MjAwOyBib2ZmIDw9IFNZU1ZfTUFYX0JMT0NLU0laRTsgYm9mZiA8PD0gMSkgeworCQl2cyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoYm9mZiAqIFNZU1ZfU1VQRVJCTE9DS19CTE9DSyksIDB4MjAwKTsKKwkJaWYgKHZzID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHZzLT5zX21hZ2ljID09IGNwdV90b19sZTMyKFNZU1ZfTUFHSUMpIHx8IHZzLT5zX21hZ2ljID09IGNwdV90b19iZTMyKFNZU1ZfTUFHSUMpKSB7CisvLwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB2cy0+c19mbmFtZSwgNik7CisJCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgdnMtPnNfZm5hbWUsIDYpOworCQkJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInN5c3YiKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlmb3IgKGJvZmYgPSAweDIwMDsgYm9mZiA8PSBTWVNWX01BWF9CTE9DS1NJWkU7IGJvZmYgPDw9IDEpIHsKKwkJeHMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgKGJvZmYgKyBYRU5JWF9TVVBFUkJMT0NLX0JMT0NLKSwgMHgyMDApOworCQlpZiAoeHMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoeHMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMzIoWEVOSVhfTUFHSUMpIHx8IHhzLT5zX21hZ2ljID09IGNwdV90b19iZTMyKFhFTklYX01BR0lDKSkgeworLy8JCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgeHMtPnNfZm5hbWUsIDYpOworCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHhzLT5zX2ZuYW1lLCA2KTsKKwkJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ4ZW5peCI7KQorCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCXJldHVybiAtMTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdWRmLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91ZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYzYzhkCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdWRmLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB2b2x1bWVfZGVzY3JpcHRvciB7CisJc3RydWN0IGRlc2NyaXB0b3JfdGFnIHsKKwkJdWludDE2X3QJaWQ7CisJCXVpbnQxNl90CXZlcnNpb247CisJCXVpbnQ4X3QJCWNoZWNrc3VtOworCQl1aW50OF90CQlyZXNlcnZlZDsKKwkJdWludDE2X3QJc2VyaWFsOworCQl1aW50MTZfdAljcmM7CisJCXVpbnQxNl90CWNyY19sZW47CisJCXVpbnQzMl90CWxvY2F0aW9uOworCX0gUEFDS0VEIHRhZzsKKwl1bmlvbiB7CisJCXN0cnVjdCBhbmNob3JfZGVzY3JpcHRvciB7CisJCQl1aW50MzJfdAlsZW5ndGg7CisJCQl1aW50MzJfdAlsb2NhdGlvbjsKKwkJfSBQQUNLRUQgYW5jaG9yOworCQlzdHJ1Y3QgcHJpbWFyeV9kZXNjcmlwdG9yIHsKKwkJCXVpbnQzMl90CXNlcV9udW07CisJCQl1aW50MzJfdAlkZXNjX251bTsKKwkJCXN0cnVjdCBkc3RyaW5nIHsKKwkJCQl1aW50OF90CWNsZW47CisJCQkJdWludDhfdAljWzMxXTsKKwkJCX0gUEFDS0VEIGlkZW50OworCQl9IFBBQ0tFRCBwcmltYXJ5OworCX0gUEFDS0VEIHR5cGU7Cit9IFBBQ0tFRDsKKworc3RydWN0IHZvbHVtZV9zdHJ1Y3R1cmVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQlpZFs1XTsKKwl1aW50OF90CQl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgVURGX1ZTRF9PRkZTRVQJCQkweDgwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfdWRmKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCB2b2x1bWVfZGVzY3JpcHRvciAqdmQ7CisJc3RydWN0IHZvbHVtZV9zdHJ1Y3R1cmVfZGVzY3JpcHRvciAqdnNkOworCXVuc2lnbmVkIGJzOworCXVuc2lnbmVkIGI7CisJdW5zaWduZWQgdHlwZTsKKwl1bnNpZ25lZCBjb3VudDsKKwl1bnNpZ25lZCBsb2M7CisJdW5zaWduZWQgY2xlbjsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXZzZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBVREZfVlNEX09GRlNFVCwgMHgyMDApOworCWlmICh2c2QgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiTlNSMDIiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlpZiAobWVtY21wKHZzZC0+aWQsICJOU1IwMyIsIDUpID09IDApCisJCWdvdG8gYmxvY2tzaXplOworCWlmIChtZW1jbXAodnNkLT5pZCwgIkJFQTAxIiwgNSkgPT0gMCkKKwkJZ290byBibG9ja3NpemU7CisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiQk9PVDIiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlpZiAobWVtY21wKHZzZC0+aWQsICJDRDAwMSIsIDUpID09IDApCisJCWdvdG8gYmxvY2tzaXplOworCWlmIChtZW1jbXAodnNkLT5pZCwgIkNEVzAyIiwgNSkgPT0gMCkKKwkJZ290byBibG9ja3NpemU7CisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiVEVBMDMiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlyZXR1cm4gLTE7CisKK2Jsb2Nrc2l6ZToKKwkvKiBzZWFyY2ggdGhlIG5leHQgVlNEIHRvIGdldCB0aGUgbG9naWNhbCBibG9jayBzaXplIG9mIHRoZSB2b2x1bWUgKi8KKwlmb3IgKGJzID0gMHg4MDA7IGJzIDwgMHg4MDAwOyBicyArPSAweDgwMCkgeworCQl2c2QgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgVURGX1ZTRF9PRkZTRVQgKyBicywgMHg4MDApOworCQlpZiAodnNkID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWRiZygidGVzdCBmb3IgYmxvY2tzaXplOiAweCV4IiwgYnMpOworCQlpZiAodnNkLT5pZFswXSAhPSAnXDAnKQorCQkJZ290byBuc3I7CisJfQorCXJldHVybiAtMTsKKworbnNyOgorCS8qIHNlYXJjaCB0aGUgbGlzdCBvZiBWU0RzIGZvciBhIE5TUiBkZXNjcmlwdG9yICovCisJZm9yIChiID0gMDsgYiA8IDY0OyBiKyspIHsKKwkJdnNkID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIFVERl9WU0RfT0ZGU0VUICsgKGIgKiBicyksIDB4ODAwKTsKKwkJaWYgKHZzZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCWRiZygidnNkOiAlYyVjJWMlYyVjIiwKKwkJICAgIHZzZC0+aWRbMF0sIHZzZC0+aWRbMV0sIHZzZC0+aWRbMl0sIHZzZC0+aWRbM10sIHZzZC0+aWRbNF0pOworCisJCWlmICh2c2QtPmlkWzBdID09ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJCWlmIChtZW1jbXAodnNkLT5pZCwgIk5TUjAyIiwgNSkgPT0gMCkKKwkJCWdvdG8gYW5jaG9yOworCQlpZiAobWVtY21wKHZzZC0+aWQsICJOU1IwMyIsIDUpID09IDApCisJCQlnb3RvIGFuY2hvcjsKKwl9CisJcmV0dXJuIC0xOworCithbmNob3I6CisJLyogcmVhZCBhbmNob3Igdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwl2ZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoMjU2ICogYnMpLCAweDIwMCk7CisJaWYgKHZkID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXR5cGUgPSBsZTE2X3RvX2NwdSh2ZC0+dGFnLmlkKTsKKwlpZiAodHlwZSAhPSAyKSAvKiBUQUdfSURfQVZEUCAqLworCQlnb3RvIGZvdW5kOworCisJLyogZ2V0IGRlc3JpcHRvciBsaXN0IGFkZHJlc3MgYW5kIGJsb2NrIGNvdW50ICovCisJY291bnQgPSBsZTMyX3RvX2NwdSh2ZC0+dHlwZS5hbmNob3IubGVuZ3RoKSAvIGJzOworCWxvYyA9IGxlMzJfdG9fY3B1KHZkLT50eXBlLmFuY2hvci5sb2NhdGlvbik7CisJZGJnKCIweCV4IGRlc2NyaXB0b3JzIHN0YXJ0aW5nIGF0IGxvZ2ljYWwgc2Vjb3IgMHgleCIsIGNvdW50LCBsb2MpOworCisJLyogcGljayB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yIGZyb20gdGhlIGxpc3QgKi8KKwlmb3IgKGIgPSAwOyBiIDwgY291bnQ7IGIrKykgeworCQl2ZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoKGxvYyArIGIpICogYnMpLCAweDIwMCk7CisJCWlmICh2ZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCXR5cGUgPSBsZTE2X3RvX2NwdSh2ZC0+dGFnLmlkKTsKKwkJZGJnKCJkZXNjcmlwdG9yIHR5cGUgJWkiLCB0eXBlKTsKKworCQkvKiBjaGVjayB2YWxpZGl0eSAqLworCQlpZiAodHlwZSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwkJaWYgKGxlMzJfdG9fY3B1KHZkLT50YWcubG9jYXRpb24pICE9IGxvYyArIGIpCisJCQlnb3RvIGZvdW5kOworCisJCWlmICh0eXBlID09IDEpIC8qIFRBR19JRF9QVkQgKi8KKwkJCWdvdG8gcHZkOworCX0KKwlnb3RvIGZvdW5kOworCisgcHZkOgorLy8Jdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsICYodmQtPnR5cGUucHJpbWFyeS5pZGVudC5jbGVuKSwgMzIpOworCisJY2xlbiA9IHZkLT50eXBlLnByaW1hcnkuaWRlbnQuY2xlbjsKKwlkYmcoImxhYmVsIHN0cmluZyBjaGFyc2l6ZT0laSBiaXQiLCBjbGVuKTsKKwlpZiAoY2xlbiA9PSA4KQorCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgdmQtPnR5cGUucHJpbWFyeS5pZGVudC5jLCAzMSk7CisJZWxzZSBpZiAoY2xlbiA9PSAxNikKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoaWQsIHZkLT50eXBlLnByaW1hcnkuaWRlbnQuYywgQkUsIDMxKTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ1ZGYiOykKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9oaWdocG9pbnQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9oaWdocG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I3YjMyCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2hpZ2hwb2ludC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBocHQzN3hfbWV0YSB7CisJdWludDhfdAkJZmlsbGVyMVszMl07CisJdWludDMyX3QJbWFnaWM7Cit9IFBBQ0tFRDsKKworc3RydWN0IGhwdDQ1eF9tZXRhIHsKKwl1aW50MzJfdAltYWdpYzsKK30gUEFDS0VEOworCisjZGVmaW5lIEhQVDM3WF9DT05GSUdfT0ZGCQkweDEyMDAKKyNkZWZpbmUgSFBUMzdYX01BR0lDX09LCQkJMHg1YTc4MTZmMAorI2RlZmluZSBIUFQzN1hfTUFHSUNfQkFECQkweDVhNzgxNmZkCisKKyNkZWZpbmUgSFBUNDVYX01BR0lDX09LCQkJMHg1YTc4MTZmMworI2RlZmluZSBIUFQ0NVhfTUFHSUNfQkFECQkweDVhNzgxNmZkCisKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaGlnaHBvaW50XzM3eF9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJc3RydWN0IGhwdDM3eF9tZXRhICpocHQ7CisJdWludDMyX3QgbWFnaWM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlocHQgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSFBUMzdYX0NPTkZJR19PRkYsIDB4MjAwKTsKKwlpZiAoaHB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW1hZ2ljID0gaHB0LT5tYWdpYzsKKwlpZiAobWFnaWMgIT0gY3B1X3RvX2xlMzIoSFBUMzdYX01BR0lDX09LKSAmJiBtYWdpYyAhPSBjcHVfdG9fbGUzMihIUFQzN1hfTUFHSUNfQkFEKSkKKwkJcmV0dXJuIC0xOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUkFJRCk7CisvLwlpZC0+dHlwZSA9ICJoaWdocG9pbnRfcmFpZF9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXN0cnVjdCBocHQ0NXhfbWV0YSAqaHB0OworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXVpbnQzMl90IG1hZ2ljOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMTEpICogMHgyMDA7CisJaHB0ID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIG1ldGFfb2ZmLCAweDIwMCk7CisJaWYgKGhwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwltYWdpYyA9IGhwdC0+bWFnaWM7CisJaWYgKG1hZ2ljICE9IGNwdV90b19sZTMyKEhQVDQ1WF9NQUdJQ19PSykgJiYgbWFnaWMgIT0gY3B1X3RvX2xlMzIoSFBUNDVYX01BR0lDX0JBRCkpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiaGlnaHBvaW50X3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2hwZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9ocGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyOTUyNAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9ocGZzLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGhwZnNfc3VwZXIgeworCXVpbnQ4X3QJCW1hZ2ljWzRdOworCXVpbnQ4X3QJCXZlcnNpb247Cit9IFBBQ0tFRDsKKworI2RlZmluZSBIUEZTX1NVUEVSQkxPQ0tfT0ZGU0VUCQkJMHgyMDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hwZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdHJ1Y3QgaHBmc19zdXBlciAqaHM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlocyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBIUEZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGhzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAoaHMtPm1hZ2ljLCAiXHg0OVx4ZThceDk1XHhmOSIsIDQpID09IDApIHsKKy8vCQlzcHJpbnRmKGlkLT50eXBlX3ZlcnNpb24sICIldSIsIGhzLT52ZXJzaW9uKTsKKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisvLwkJaWQtPnR5cGUgPSAiaHBmcyI7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9pc3dfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2lzd19yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiNDdiMwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9pc3dfcmFpZC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBpc3dfbWV0YSB7CisJdWludDhfdAkJc2lnWzMyXTsKKwl1aW50MzJfdAljaGVja19zdW07CisJdWludDMyX3QJbXBiX3NpemU7CisJdWludDMyX3QJZmFtaWx5X251bTsKKwl1aW50MzJfdAlnZW5lcmF0aW9uX251bTsKK30gUEFDS0VEOworCisjZGVmaW5lIElTV19TSUdOQVRVUkUJCSJJbnRlbCBSYWlkIElTTSBDZmcgU2lnLiAiCisKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBpc3dfbWV0YSAqaXN3OworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMikgKiAweDIwMDsKKwlpc3cgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwlpZiAoaXN3ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAoaXN3LT5zaWcsIElTV19TSUdOQVRVUkUsIHNpemVvZihJU1dfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCW1lbWNweShpZC0+dHlwZV92ZXJzaW9uLCAmaXN3LT5zaWdbc2l6ZW9mKElTV19TSUdOQVRVUkUpLTFdLCA2KTsKKy8vCWlkLT50eXBlID0gImlzd19yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9sc2lfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2xzaV9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjYzhlZAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9sc2lfcmFpZC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBsc2lfbWV0YSB7CisJdWludDhfdAkJc2lnWzZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTFNJX1NJR05BVFVSRQkJIiRYSURFJCIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHNpX21lZ2FfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBsc2lfbWV0YSAqbHNpOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMSkgKiAweDIwMDsKKwlsc2kgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwlpZiAobHNpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAobHNpLT5zaWcsIExTSV9TSUdOQVRVUkUsIHNpemVvZihMU0lfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCWlkLT50eXBlID0gImxzaV9tZWdhX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2x2bS5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2x2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDY0OTgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbHZtLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGx2bTFfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJaWRbMl07Cit9IFBBQ0tFRDsKKworc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCWlkWzhdOworCXVpbnQ2NF90CXNlY3Rvcl94bDsKKwl1aW50MzJfdAljcmNfeGw7CisJdWludDMyX3QJb2Zmc2V0X3hsOworCXVpbnQ4X3QJCXR5cGVbOF07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBMVk0xX1NCX09GRgkJCTB4NDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2x2bTEoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdHJ1Y3QgbHZtMV9zdXBlcl9ibG9jayAqbHZtOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJbHZtID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIExWTTFfU0JfT0ZGLCAweDgwMCk7CisJaWYgKGx2bSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobHZtLT5pZFswXSAhPSAnSCcgfHwgbHZtLT5pZFsxXSAhPSAnTScpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiTFZNMV9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTFZNMl9MQUJFTF9JRAkJCSJMQUJFTE9ORSIKKyNkZWZpbmUgTFZNMkxBQkVMX1NDQU5fU0VDVE9SUwkJNAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9sdm0yKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJY29uc3QgdWludDhfdCAqYnVmOworCXVuc2lnbmVkIHNvZmY7CisJc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgKmx2bTsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIExWTTJMQUJFTF9TQ0FOX1NFQ1RPUlMgKiAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKworCWZvciAoc29mZiA9IDA7IHNvZmYgPCBMVk0yTEFCRUxfU0NBTl9TRUNUT1JTICogMHgyMDA7IHNvZmYgKz0gMHgyMDApIHsKKwkJbHZtID0gKHN0cnVjdCBsdm0yX3N1cGVyX2Jsb2NrICopICZidWZbc29mZl07CisKKwkJaWYgKG1lbWNtcChsdm0tPmlkLCBMVk0yX0xBQkVMX0lELCA4KSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCW1lbWNweShpZC0+dHlwZV92ZXJzaW9uLCBsdm0tPnR5cGUsIDgpOworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiTFZNMl9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWFjLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZWI5NwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tYWMuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IG1hY19kcml2ZXJfZGVzYyB7CisJdWludDhfdAkJc2lnbmF0dXJlWzJdOworCXVpbnQxNl90CWJsb2NrX3NpemU7CisJdWludDMyX3QJYmxvY2tfY291bnQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IG1hY19wYXJ0aXRpb24geworCXVpbnQ4X3QJCXNpZ25hdHVyZVsyXTsKKwl1aW50MTZfdAlyZXMxOworCXVpbnQzMl90CW1hcF9jb3VudDsKKwl1aW50MzJfdAlzdGFydF9ibG9jazsKKwl1aW50MzJfdAlibG9ja19jb3VudDsKKwl1aW50OF90CQluYW1lWzMyXTsKKwl1aW50OF90CQl0eXBlWzMyXTsKK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9tYWNfcGFydGl0aW9uX21hcChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmKQoreworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjICpkcml2ZXI7CisJc3RydWN0IG1hY19wYXJ0aXRpb24gKnBhcnQ7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIGJ1ZjsKKwlpZiAocGFydC0+c2lnbmF0dXJlWzBdID09ICdQJyAmJiBwYXJ0LT5zaWduYXR1cmVbMV0gPT0gJ00nIC8qICJQTSIgKi8KKwkgJiYgKG1lbWNtcChwYXJ0LT50eXBlLCAiQXBwbGVfcGFydGl0aW9uX21hcCIsIDE5KSA9PSAwKQorCSkgeworCQkvKiBsaW51eCBjcmVhdGVzIGFuIG93biBzdWJkZXZpY2UgZm9yIHRoZSBtYXAKKwkJICoganVzdCByZXR1cm4gdGhlIHR5cGUgaWYgdGhlIGRyaXZlIGhlYWRlciBpcyBtaXNzaW5nICovCisvLwkJdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFKTsKKy8vCQlpZC0+dHlwZSA9ICJtYWNfcGFydGl0aW9uX21hcCI7CisJCXJldHVybiAwOworCX0KKworCWRyaXZlciA9IChzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjICopIGJ1ZjsKKwlpZiAoZHJpdmVyLT5zaWduYXR1cmVbMF0gPT0gJ0UnICYmIGRyaXZlci0+c2lnbmF0dXJlWzFdID09ICdSJykgeyAvKiAiRVIiICovCisJCS8qIHdlIGFyZSBvbiBhIG1haW4gZGV2aWNlLCBsaWtlIGEgQ0QKKwkJICoganVzdCB0cnkgdG8gcHJvYmUgdGhlIGZpcnN0IHBhcnRpdGlvbiBmcm9tIHRoZSBtYXAgKi8KKwkJdW5zaWduZWQgYnNpemUgPSBiZTE2X3RvX2NwdShkcml2ZXItPmJsb2NrX3NpemUpOworCQlpbnQgcGFydF9jb3VudDsKKwkJaW50IGk7CisKKwkJLyogZ2V0IGZpcnN0IGVudHJ5IG9mIHBhcnRpdGlvbiB0YWJsZSAqLworCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgIGJzaXplLCAweDIwMCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIGJ1ZjsKKwkJaWYgKHBhcnQtPnNpZ25hdHVyZVswXSAhPSAnUCcgfHwgcGFydC0+c2lnbmF0dXJlWzFdICE9ICdNJykgLyogbm90ICJQTSIgKi8KKwkJCXJldHVybiAtMTsKKworCQlwYXJ0X2NvdW50ID0gYmUzMl90b19jcHUocGFydC0+bWFwX2NvdW50KTsKKwkJZGJnKCJleHBlY3RpbmcgJWQgcGFydGl0aW9uIGVudHJpZXMiLCBwYXJ0X2NvdW50KTsKKworCQlpZiAoaWQtPnBhcnRpdGlvbnMgIT0gTlVMTCkKKwkJCWZyZWUoaWQtPnBhcnRpdGlvbnMpOworCQlpZC0+cGFydGl0aW9ucyA9IHh6YWxsb2MocGFydF9jb3VudCAqIHNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbikpOworCisJCWlkLT5wYXJ0aXRpb25fY291bnQgPSBwYXJ0X2NvdW50OworCisJCWZvciAoaSA9IDA7IGkgPCBwYXJ0X2NvdW50OyBpKyspIHsKKwkJCXVpbnQ2NF90IHBvZmY7CisJCQl1aW50NjRfdCBwbGVuOworCisJCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgKChpKzEpICogYnNpemUpLCAweDIwMCk7CisJCQlpZiAoYnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCisJCQlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIGJ1ZjsKKwkJCWlmIChwYXJ0LT5zaWduYXR1cmVbMF0gIT0gJ1AnIHx8IHBhcnQtPnNpZ25hdHVyZVsxXSAhPSAnTScpIC8qIG5vdCAiUE0iICovCisJCQkJcmV0dXJuIC0xOworCisJCQlwb2ZmID0gYmUzMl90b19jcHUocGFydC0+c3RhcnRfYmxvY2spICogYnNpemU7CisJCQlwbGVuID0gYmUzMl90b19jcHUocGFydC0+YmxvY2tfY291bnQpICogYnNpemU7CisJCQlkYmcoImZvdW5kICclcycgcGFydGl0aW9uIGVudHJ5IGF0IDB4JWxseCwgbGVuIDB4JWxseCIsCisJCQkJCXBhcnQtPnR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHBsZW4pOworCisvLwkJCWlkLT5wYXJ0aXRpb25zW2ldLnB0X29mZiA9IHBvZmY7CisvLwkJCWlkLT5wYXJ0aXRpb25zW2ldLnB0X2xlbiA9IHBsZW47CisKKy8vCQkJaWYgKG1lbWNtcChwYXJ0LT50eXBlLCAiQXBwbGVfRnJlZSIsIDEwKSA9PSAwKSB7CisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoJmlkLT5wYXJ0aXRpb25zW2ldLCBWT0xVTUVfSURfVU5VU0VEKTsKKy8vCQkJfSBlbHNlIGlmIChtZW1jbXAocGFydC0+dHlwZSwgIkFwcGxlX3BhcnRpdGlvbl9tYXAiLCAxOSkgPT0gMCkgeworLy8JCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KCZpZC0+cGFydGl0aW9uc1tpXSwgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFKTsKKy8vCQkJfSBlbHNlIHsKKy8vCQkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydCgmaWQtPnBhcnRpdGlvbnNbaV0sIFZPTFVNRV9JRF9VTlBST0JFRCk7CisvLwkJCX0KKwkJfQorLy8JCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRSk7CisvLwkJaWQtPnR5cGUgPSAibWFjX3BhcnRpdGlvbl9tYXAiOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWluaXguYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9taW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWluaXguYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgeworCXVpbnQxNl90CXNfbmlub2RlczsKKwl1aW50MTZfdAlzX256b25lczsKKwl1aW50MTZfdAlzX2ltYXBfYmxvY2tzOworCXVpbnQxNl90CXNfem1hcF9ibG9ja3M7CisJdWludDE2X3QJc19maXJzdGRhdGF6b25lOworCXVpbnQxNl90CXNfbG9nX3pvbmVfc2l6ZTsKKwl1aW50MzJfdAlzX21heF9zaXplOworCXVpbnQxNl90CXNfbWFnaWM7CisJdWludDE2X3QJc19zdGF0ZTsKKwl1aW50MzJfdAlzX3pvbmVzOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTUlOSVhfU1VQRVJCTE9DS19PRkZTRVQJCQkweDQwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9taW5peChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmKQoreworCXN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqbXM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwltcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBNSU5JWF9TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChtcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobXMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoMHgxMzdmKSkgeworLy8JCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMSc7CisJCWdvdG8gZm91bmQ7CisJfQorCisJaWYgKG1zLT5zX21hZ2ljID09IGNwdV90b19sZTE2KDB4MTM4NykpIHsKKy8vCQlpZC0+dHlwZV92ZXJzaW9uWzBdID0gJzEnOworCQlnb3RvIGZvdW5kOworCX0KKworCWlmIChtcy0+c19tYWdpYyA9PSBjcHVfdG9fbGUxNigweDI0NjgpKSB7CisvLwkJaWQtPnR5cGVfdmVyc2lvblswXSA9ICcyJzsKKwkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAobXMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoMHgyNDc4KSkgeworLy8JCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMic7CisJCWdvdG8gZm91bmQ7CisJfQorCisJcmV0dXJuIC0xOworCisgZm91bmQ6CisvLwlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gIm1pbml4IjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tc2Rvcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX21zZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYjg4NQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tc2Rvcy5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbXNkb3NfcGFydGl0aW9uX2VudHJ5IHsKKwl1aW50OF90CQlib290X2luZDsKKwl1aW50OF90CQloZWFkOworCXVpbnQ4X3QJCXNlY3RvcjsKKwl1aW50OF90CQljeWw7CisJdWludDhfdAkJc3lzX2luZDsKKwl1aW50OF90CQllbmRfaGVhZDsKKwl1aW50OF90CQllbmRfc2VjdG9yOworCXVpbnQ4X3QJCWVuZF9jeWw7CisJdWludDMyX3QJc3RhcnRfc2VjdDsKKwl1aW50MzJfdAlucl9zZWN0czsKK30gUEFDS0VEOworCisjZGVmaW5lIE1TRE9TX1BBUlRUQUJMRV9PRkZTRVQJCTB4MWJlCisjZGVmaW5lIE1TRE9TX1NJR19PRkYJCQkweDFmZQorI2RlZmluZSBCU0laRQkJCQkweDIwMAorI2RlZmluZSBET1NfRVhURU5ERURfUEFSVElUSU9OCQkweDA1CisjZGVmaW5lIExJTlVYX0VYVEVOREVEX1BBUlRJVElPTgkweDg1CisjZGVmaW5lIFdJTjk4X0VYVEVOREVEX1BBUlRJVElPTgkweDBmCisjZGVmaW5lIExJTlVYX1JBSURfUEFSVElUSU9OCQkweGZkCisjZGVmaW5lIGlzX2V4dGVuZGVkKHR5cGUpIFwKKwkodHlwZSA9PSBET1NfRVhURU5ERURfUEFSVElUSU9OIHx8CVwKKwkgdHlwZSA9PSBXSU45OF9FWFRFTkRFRF9QQVJUSVRJT04gfHwJXAorCSB0eXBlID09IExJTlVYX0VYVEVOREVEX1BBUlRJVElPTikKKyNkZWZpbmUgaXNfcmFpZCh0eXBlKSBcCisJKHR5cGUgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX21zZG9zX3BhcnRfdGFibGUoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwljb25zdCB1aW50OF90ICpidWY7CisJaW50IGk7CisJdWludDY0X3QgcG9mZjsKKwl1aW50NjRfdCBwbGVuOworCXVpbnQ2NF90IGV4dGVuZGVkID0gMDsKKwl1aW50NjRfdCBjdXJyZW50OworCXVpbnQ2NF90IG5leHQ7CisJaW50IGxpbWl0OworCWludCBlbXB0eSA9IDE7CisJc3RydWN0IG1zZG9zX3BhcnRpdGlvbl9lbnRyeSAqcGFydDsKKwlzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbiAqcDsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChidWZbTVNET1NfU0lHX09GRl0gIT0gMHg1NSB8fCBidWZbTVNET1NfU0lHX09GRiArIDFdICE9IDB4YWEpCisJCXJldHVybiAtMTsKKworCS8qIGNoZWNrIGZsYWdzIG9uIGFsbCBlbnRyaWVzIGZvciBhIHZhbGlkIHBhcnRpdGlvbiB0YWJsZSAqLworCXBhcnQgPSAoc3RydWN0IG1zZG9zX3BhcnRpdGlvbl9lbnRyeSopICZidWZbTVNET1NfUEFSVFRBQkxFX09GRlNFVF07CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocGFydFtpXS5ib290X2luZCAhPSAwCisJCSAmJiBwYXJ0W2ldLmJvb3RfaW5kICE9IDB4ODAKKwkJKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAocGFydFtpXS5ucl9zZWN0cyAhPSAwKQorCQkJZW1wdHkgPSAwOworCX0KKwlpZiAoZW1wdHkgPT0gMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlkLT5wYXJ0aXRpb25zICE9IE5VTEwpCisJCWZyZWUoaWQtPnBhcnRpdGlvbnMpOworCWlkLT5wYXJ0aXRpb25zID0geHphbGxvYyhWT0xVTUVfSURfUEFSVElUSU9OU19NQVggKgorCQkJCXNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbikpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwb2ZmID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLnN0YXJ0X3NlY3QpICogQlNJWkU7CisJCXBsZW4gPSAodWludDY0X3QpIGxlMzJfdG9fY3B1KHBhcnRbaV0ubnJfc2VjdHMpICogQlNJWkU7CisKKwkJaWYgKHBsZW4gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXAgPSAmaWQtPnBhcnRpdGlvbnNbaV07CisKKy8vCQlwLT5wdF90eXBlX3JhdyA9IHBhcnRbaV0uc3lzX2luZDsKKworCQlpZiAoaXNfZXh0ZW5kZWQocGFydFtpXS5zeXNfaW5kKSkgeworCQkJZGJnKCJmb3VuZCBleHRlbmRlZCBwYXJ0aXRpb24gYXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9mZik7CisvLwkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydChwLCBWT0xVTUVfSURfUEFSVElUSU9OVEFCTEUpOworLy8JCQlwLT50eXBlID0gIm1zZG9zX2V4dGVuZGVkX3BhcnRpdGlvbiI7CisJCQlpZiAoZXh0ZW5kZWQgPT0gMCkKKwkJCQlleHRlbmRlZCA9IG9mZiArIHBvZmY7CisJCX0gZWxzZSB7CisJCQlkYmcoImZvdW5kIDB4JXggZGF0YSBwYXJ0aXRpb24gYXQgMHglbGx4LCBsZW4gMHglbGx4IiwKKwkJCSAgICBwYXJ0W2ldLnN5c19pbmQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBsZW4pOworCisvLwkJCWlmIChpc19yYWlkKHBhcnRbaV0uc3lzX2luZCkpCisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQocCwgVk9MVU1FX0lEX1JBSUQpOworLy8JCQllbHNlCisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQocCwgVk9MVU1FX0lEX1VOUFJPQkVEKTsKKwkJfQorCisvLwkJcC0+cHRfb2ZmID0gb2ZmICsgcG9mZjsKKy8vCQlwLT5wdF9sZW4gPSBwbGVuOworCQlpZC0+cGFydGl0aW9uX2NvdW50ID0gaSsxOworCX0KKworCW5leHQgPSBleHRlbmRlZDsKKwljdXJyZW50ID0gZXh0ZW5kZWQ7CisJbGltaXQgPSA1MDsKKworCS8qIGZvbGxvdyBleHRlbmRlZCBwYXJ0aXRpb24gY2hhaW4gYW5kIGFkZCBkYXRhIHBhcnRpdGlvbnMgKi8KKwl3aGlsZSAobmV4dCAhPSAwKSB7CisJCWlmIChsaW1pdC0tID09IDApIHsKKwkJCWRiZygiZXh0ZW5kZWQgY2hhaW4gbGltaXQgcmVhY2hlZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgY3VycmVudCwgMHgyMDApOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlicmVhazsKKworCQlwYXJ0ID0gKHN0cnVjdCBtc2Rvc19wYXJ0aXRpb25fZW50cnkqKSAmYnVmW01TRE9TX1BBUlRUQUJMRV9PRkZTRVRdOworCisJCWlmIChidWZbTVNET1NfU0lHX09GRl0gIT0gMHg1NSB8fCBidWZbTVNET1NfU0lHX09GRiArIDFdICE9IDB4YWEpCisJCQlicmVhazsKKworCQluZXh0ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlwb2ZmID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLnN0YXJ0X3NlY3QpICogQlNJWkU7CisJCQlwbGVuID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLm5yX3NlY3RzKSAqIEJTSVpFOworCisJCQlpZiAocGxlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaXNfZXh0ZW5kZWQocGFydFtpXS5zeXNfaW5kKSkgeworCQkJCWRiZygiZm91bmQgZXh0ZW5kZWQgcGFydGl0aW9uIGF0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYpOworCQkJCWlmIChuZXh0ID09IDApCisJCQkJCW5leHQgPSBleHRlbmRlZCArIHBvZmY7CisJCQl9IGVsc2UgeworCQkJCWRiZygiZm91bmQgMHgleCBkYXRhIHBhcnRpdGlvbiBhdCAweCVsbHgsIGxlbiAweCVsbHgiLAorCQkJCQlwYXJ0W2ldLnN5c19pbmQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBsZW4pOworCisJCQkJLyogd2UgYWx3YXlzIHN0YXJ0IGF0IHRoZSA1dGggZW50cnkgKi8KKy8vCQkJCXdoaWxlIChpZC0+cGFydGl0aW9uX2NvdW50IDwgNCkKKy8vCQkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoJmlkLT5wYXJ0aXRpb25zW2lkLT5wYXJ0aXRpb25fY291bnQrK10sIFZPTFVNRV9JRF9VTlVTRUQpOworCQkJCWlmIChpZC0+cGFydGl0aW9uX2NvdW50IDwgNCkKKwkJCQkJaWQtPnBhcnRpdGlvbl9jb3VudCA9IDQ7CisKKwkJCQlwID0gJmlkLT5wYXJ0aXRpb25zW2lkLT5wYXJ0aXRpb25fY291bnRdOworCisvLwkJCQlpZiAoaXNfcmFpZChwYXJ0W2ldLnN5c19pbmQpKQorLy8JCQkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydChwLCBWT0xVTUVfSURfUkFJRCk7CisvLwkJCQllbHNlCisvLwkJCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHAsIFZPTFVNRV9JRF9VTlBST0JFRCk7CisKKy8vCQkJCXAtPnB0X29mZiA9IGN1cnJlbnQgKyBwb2ZmOworLy8JCQkJcC0+cHRfbGVuID0gcGxlbjsKKwkJCQlpZC0+cGFydGl0aW9uX2NvdW50Kys7CisKKy8vCQkJCXAtPnB0X3R5cGVfcmF3ID0gcGFydFtpXS5zeXNfaW5kOworCisJCQkJaWYgKGlkLT5wYXJ0aXRpb25fY291bnQgPj0gVk9MVU1FX0lEX1BBUlRJVElPTlNfTUFYKSB7CisJCQkJCWRiZygidG9vIG1hbnkgcGFydGl0aW9ucyIpOworCQkJCQluZXh0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQljdXJyZW50ID0gbmV4dDsKKwl9CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRSk7CisvLwlpZC0+dHlwZSA9ICJtc2Rvc19wYXJ0aXRpb25fdGFibGUiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbnZpZGlhX3JhaWQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9udmlkaWFfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODQ3MjkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbnZpZGlhX3JhaWQuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbnZpZGlhX21ldGEgeworCXVpbnQ4X3QJCXZlbmRvcls4XTsKKwl1aW50MzJfdAlzaXplOworCXVpbnQzMl90CWNoa3N1bTsKKwl1aW50MTZfdAl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTlZJRElBX1NJR05BVFVSRQkJIk5WSURJQSIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnZpZGlhX3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgdWludDY0X3Qgc2l6ZSkKK3sKKwl1aW50NjRfdCBtZXRhX29mZjsKKwlzdHJ1Y3QgbnZpZGlhX21ldGEgKm52OworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMikgKiAweDIwMDsKKwludiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmIChudiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKG52LT52ZW5kb3IsIE5WSURJQV9TSUdOQVRVUkUsIHNpemVvZihOVklESUFfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCXNucHJpbnRmKGlkLT50eXBlX3ZlcnNpb24sIHNpemVvZihpZC0+dHlwZV92ZXJzaW9uKS0xLCAiJXUiLCBsZTE2X3RvX2NwdShudi0+dmVyc2lvbikpOworLy8JaWQtPnR5cGUgPSAibnZpZGlhX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Byb21pc2VfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Byb21pc2VfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGQwMDYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfcHJvbWlzZV9yYWlkLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IHByb21pc2VfbWV0YSB7CisJdWludDhfdAlzaWdbMjRdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgUERDX0NPTkZJR19PRkYJCTB4MTIwMAorI2RlZmluZSBQRENfU0lHTkFUVVJFCQkiUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuIgorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9wcm9taXNlX2Zhc3R0cmFja19yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYsIHVpbnQ2NF90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlY3RvcnNbXSA9IHsKKwkJNjMsIDI1NSwgMjU2LCAxNiwgMzk5CisJfTsKKworCXN0cnVjdCBwcm9taXNlX21ldGEgKnBkYzsKKwl1bnNpZ25lZCBpOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHg0MDAwMCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2VjdG9ycyk7IGkrKykgeworCQl1aW50NjRfdCBtZXRhX29mZjsKKworCQltZXRhX29mZiA9ICgoc2l6ZSAvIDB4MjAwKSAtIHNlY3RvcnNbaV0pICogMHgyMDA7CisJCXBkYyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCQlpZiAocGRjID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKG1lbWNtcChwZGMtPnNpZywgUERDX1NJR05BVFVSRSwgc2l6ZW9mKFBEQ19TSUdOQVRVUkUpLTEpID09IDApCisJCQlnb3RvIGZvdW5kOworCX0KKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCWlkLT50eXBlID0gInByb21pc2VfZmFzdHRyYWNrX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3NpbGljb25fcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3NpbGljb25fcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzQzOWUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfc2lsaWNvbl9yYWlkLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IHNpbGljb25fbWV0YSB7CisJdWludDhfdAkJdW5rbm93bjBbMHgyRV07CisJdWludDhfdAkJYXNjaWlfdmVyc2lvblsweDM2IC0gMHgyRV07CisJdWludDhfdAkJZGlza25hbWVbMHg1NiAtIDB4MzZdOworCXVpbnQ4X3QJCXVua25vd24xWzB4NjAgLSAweDU2XTsKKwl1aW50MzJfdAltYWdpYzsKKwl1aW50MzJfdAl1bmtub3duMWFbMHg2QyAtIDB4NjRdOworCXVpbnQzMl90CWFycmF5X3NlY3RvcnNfbG93OworCXVpbnQzMl90CWFycmF5X3NlY3RvcnNfaGlnaDsKKwl1aW50OF90CQl1bmtub3duMlsweDc4IC0gMHg3NF07CisJdWludDMyX3QJdGhpc2Rpc2tfc2VjdG9yczsKKwl1aW50OF90CQl1bmtub3duM1sweDEwMCAtIDB4N0NdOworCXVpbnQ4X3QJCXVua25vd240WzB4MTA0IC0gMHgxMDBdOworCXVpbnQxNl90CXByb2R1Y3RfaWQ7CisJdWludDE2X3QJdmVuZG9yX2lkOworCXVpbnQxNl90CW1pbm9yX3ZlcjsKKwl1aW50MTZfdAltYWpvcl92ZXI7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBTSUxJQ09OX01BR0lDCQkweDJGMDAwMDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3NpbGljb25fbWVkbGV5X3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgdWludDY0X3Qgc2l6ZSkKK3sKKwl1aW50NjRfdCBtZXRhX29mZjsKKwlzdHJ1Y3Qgc2lsaWNvbl9tZXRhICpzaWw7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCwgc2l6ZSAweCVsbHgiLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworCisJaWYgKHNpemUgPCAweDEwMDAwKQorCQlyZXR1cm4gLTE7CisKKwltZXRhX29mZiA9ICgoc2l6ZSAvIDB4MjAwKS0xKSAqIDB4MjAwOworCXNpbCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmIChzaWwgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNpbC0+bWFnaWMgIT0gY3B1X3RvX2xlMzIoU0lMSUNPTl9NQUdJQykpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8Jc25wcmludGYoaWQtPnR5cGVfdmVyc2lvbiwgc2l6ZW9mKGlkLT50eXBlX3ZlcnNpb24pLTEsICIldS4ldSIsCisvLwkJIGxlMTZfdG9fY3B1KHNpbC0+bWFqb3JfdmVyKSwgbGUxNl90b19jcHUoc2lsLT5taW5vcl92ZXIpKTsKKy8vCWlkLT50eXBlID0gInNpbGljb25fbWVkbGV5X3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Vmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Vmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTI1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfdWZzLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWZzX2xpbms7CisJdWludDMyX3QJZnNfcmxpbms7CisJdWludDMyX3QJZnNfc2Jsa25vOworCXVpbnQzMl90CWZzX2NibGtubzsKKwl1aW50MzJfdAlmc19pYmxrbm87CisJdWludDMyX3QJZnNfZGJsa25vOworCXVpbnQzMl90CWZzX2Nnb2Zmc2V0OworCXVpbnQzMl90CWZzX2NnbWFzazsKKwl1aW50MzJfdAlmc190aW1lOworCXVpbnQzMl90CWZzX3NpemU7CisJdWludDMyX3QJZnNfZHNpemU7CisJdWludDMyX3QJZnNfbmNnOworCXVpbnQzMl90CWZzX2JzaXplOworCXVpbnQzMl90CWZzX2ZzaXplOworCXVpbnQzMl90CWZzX2ZyYWc7CisJdWludDMyX3QJZnNfbWluZnJlZTsKKwl1aW50MzJfdAlmc19yb3RkZWxheTsKKwl1aW50MzJfdAlmc19ycHM7CisJdWludDMyX3QJZnNfYm1hc2s7CisJdWludDMyX3QJZnNfZm1hc2s7CisJdWludDMyX3QJZnNfYnNoaWZ0OworCXVpbnQzMl90CWZzX2ZzaGlmdDsKKwl1aW50MzJfdAlmc19tYXhjb250aWc7CisJdWludDMyX3QJZnNfbWF4YnBnOworCXVpbnQzMl90CWZzX2ZyYWdzaGlmdDsKKwl1aW50MzJfdAlmc19mc2J0b2RiOworCXVpbnQzMl90CWZzX3Nic2l6ZTsKKwl1aW50MzJfdAlmc19jc21hc2s7CisJdWludDMyX3QJZnNfY3NzaGlmdDsKKwl1aW50MzJfdAlmc19uaW5kaXI7CisJdWludDMyX3QJZnNfaW5vcGI7CisJdWludDMyX3QJZnNfbnNwZjsKKwl1aW50MzJfdAlmc19vcHRpbTsKKwl1aW50MzJfdAlmc19ucHNlY3Rfc3RhdGU7CisJdWludDMyX3QJZnNfaW50ZXJsZWF2ZTsKKwl1aW50MzJfdAlmc190cmFja3NrZXc7CisJdWludDMyX3QJZnNfaWRbMl07CisJdWludDMyX3QJZnNfY3NhZGRyOworCXVpbnQzMl90CWZzX2Nzc2l6ZTsKKwl1aW50MzJfdAlmc19jZ3NpemU7CisJdWludDMyX3QJZnNfbnRyYWs7CisJdWludDMyX3QJZnNfbnNlY3Q7CisJdWludDMyX3QJZnNfc3BjOworCXVpbnQzMl90CWZzX25jeWw7CisJdWludDMyX3QJZnNfY3BnOworCXVpbnQzMl90CWZzX2lwZzsKKwl1aW50MzJfdAlmc19mcGc7CisJc3RydWN0IHVmc19jc3VtIHsKKwkJdWludDMyX3QJY3NfbmRpcjsKKwkJdWludDMyX3QJY3NfbmJmcmVlOworCQl1aW50MzJfdAljc19uaWZyZWU7CisJCXVpbnQzMl90CWNzX25mZnJlZTsKKwl9IFBBQ0tFRCBmc19jc3RvdGFsOworCWludDhfdAkJZnNfZm1vZDsKKwlpbnQ4X3QJCWZzX2NsZWFuOworCWludDhfdAkJZnNfcm9ubHk7CisJaW50OF90CQlmc19mbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQ4X3QJZnNfZnNtbnRbNTEyXTsKKwkJCXVpbnQzMl90CWZzX2Nncm90b3I7CisJCQl1aW50MzJfdAlmc19jc3BbMzFdOworCQkJdWludDMyX3QJZnNfbWF4Y2x1c3RlcjsKKwkJCXVpbnQzMl90CWZzX2NwYzsKKwkJCXVpbnQxNl90CWZzX29wb3N0YmxbMTZdWzhdOworCQl9IFBBQ0tFRCBmc191MTsKKwkJc3RydWN0IHsKKwkJCWludDhfdAkJZnNfZnNtbnRbNDY4XTsKKwkJCXVpbnQ4X3QJCWZzX3ZvbG5hbWVbMzJdOworCQkJdWludDY0X3QJZnNfc3d1aWQ7CisJCQlpbnQzMl90CQlmc19wYWQ7CisJCQl1aW50MzJfdAlmc19jZ3JvdG9yOworCQkJdWludDMyX3QJZnNfb2NzcFsyOF07CisJCQl1aW50MzJfdAlmc19jb250aWdkaXJzOworCQkJdWludDMyX3QJZnNfY3NwOworCQkJdWludDMyX3QJZnNfbWF4Y2x1c3RlcjsKKwkJCXVpbnQzMl90CWZzX2FjdGl2ZTsKKwkJCWludDMyX3QJCWZzX29sZF9jcGM7CisJCQlpbnQzMl90CQlmc19tYXhic2l6ZTsKKwkJCWludDY0X3QJCWZzX3NwYXJlY29uNjRbMTddOworCQkJaW50NjRfdAkJZnNfc2Jsb2NrbG9jOworCQkJc3RydWN0IHVmczJfY3N1bV90b3RhbCB7CisJCQkJdWludDY0X3QJY3NfbmRpcjsKKwkJCQl1aW50NjRfdAljc19uYmZyZWU7CisJCQkJdWludDY0X3QJY3NfbmlmcmVlOworCQkJCXVpbnQ2NF90CWNzX25mZnJlZTsKKwkJCQl1aW50NjRfdAljc19udW1jbHVzdGVyczsKKwkJCQl1aW50NjRfdAljc19zcGFyZVszXTsKKwkJCX0gUEFDS0VEIGZzX2NzdG90YWw7CisJCQlzdHJ1Y3QgdWZzX3RpbWV2YWwgeworCQkJCWludDMyX3QJCXR2X3NlYzsKKwkJCQlpbnQzMl90CQl0dl91c2VjOworCQkJfSBQQUNLRUQgZnNfdGltZTsKKwkJCWludDY0X3QJCWZzX3NpemU7CisJCQlpbnQ2NF90CQlmc19kc2l6ZTsKKwkJCXVpbnQ2NF90CWZzX2NzYWRkcjsKKwkJCWludDY0X3QJCWZzX3BlbmRpbmdibG9ja3M7CisJCQlpbnQzMl90CQlmc19wZW5kaW5naW5vZGVzOworCQl9IFBBQ0tFRCBmc191MjsKKwl9ICBmc191MTE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJaW50MzJfdAkJZnNfc3BhcmVjb25bNTNdOworCQkJaW50MzJfdAkJZnNfcmVjbGFpbTsKKwkJCWludDMyX3QJCWZzX3NwYXJlY29uMlsxXTsKKwkJCWludDMyX3QJCWZzX3N0YXRlOworCQkJdWludDMyX3QJZnNfcWJtYXNrWzJdOworCQkJdWludDMyX3QJZnNfcWZtYXNrWzJdOworCQl9IFBBQ0tFRCBmc19zdW47CisJCXN0cnVjdCB7CisJCQlpbnQzMl90CQlmc19zcGFyZWNvbls1M107CisJCQlpbnQzMl90CQlmc19yZWNsYWltOworCQkJaW50MzJfdAkJZnNfc3BhcmVjb24yWzFdOworCQkJdWludDMyX3QJZnNfbnBzZWN0OworCQkJdWludDMyX3QJZnNfcWJtYXNrWzJdOworCQkJdWludDMyX3QJZnNfcWZtYXNrWzJdOworCQl9IFBBQ0tFRCBmc19zdW54ODY7CisJCXN0cnVjdCB7CisJCQlpbnQzMl90CQlmc19zcGFyZWNvbls1MF07CisJCQlpbnQzMl90CQlmc19jb250aWdzdW1zaXplOworCQkJaW50MzJfdAkJZnNfbWF4c3ltbGlua2xlbjsKKwkJCWludDMyX3QJCWZzX2lub2RlZm10OworCQkJdWludDMyX3QJZnNfbWF4ZmlsZXNpemVbMl07CisJCQl1aW50MzJfdAlmc19xYm1hc2tbMl07CisJCQl1aW50MzJfdAlmc19xZm1hc2tbMl07CisJCQlpbnQzMl90CQlmc19zdGF0ZTsKKwkJfSBQQUNLRUQgZnNfNDQ7CisJfSBmc191MjsKKwlpbnQzMl90CQlmc19wb3N0Ymxmb3JtYXQ7CisJaW50MzJfdAkJZnNfbnJwb3M7CisJaW50MzJfdAkJZnNfcG9zdGJsb2ZmOworCWludDMyX3QJCWZzX3JvdGJsb2ZmOworCXVpbnQzMl90CWZzX21hZ2ljOworCXVpbnQ4X3QJCWZzX3NwYWNlWzFdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgVUZTX01BR0lDCQkJMHgwMDAxMTk1NAorI2RlZmluZSBVRlMyX01BR0lDCQkJMHgxOTU0MDExOQorI2RlZmluZSBVRlNfTUFHSUNfRkVBCQkJMHgwMDE5NTYxMgorI2RlZmluZSBVRlNfTUFHSUNfTEZOCQkJMHgwMDA5NTAxNAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV91ZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdGF0aWMgY29uc3Qgc2hvcnQgb2Zmc2V0c1tdID0geyAwLCA4LCA2NCwgMjU2IH07CisKKwl1aW50MzJfdCBtYWdpYzsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnVmczsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9mZnNldHMpOyBpKyspIHsKKwkJdWZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIChvZmZzZXRzW2ldICogMHg0MDApLCAweDgwMCk7CisJCWlmICh1ZnMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlkYmcoIm9mZnNldCAweCV4Iiwgb2Zmc2V0c1tpXSAqIDB4NDAwKTsKKwkJbWFnaWMgPSB1ZnMtPmZzX21hZ2ljOworCQlpZiAoKG1hZ2ljID09IGNwdV90b19iZTMyKFVGU19NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTMl9NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTX01BR0lDX0ZFQSkpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTX01BR0lDX0xGTikpCisJCSkgeworCQkJZGJnKCJtYWdpYyAweCUwOHgoYmUpIiwgbWFnaWMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCQlpZiAoKG1hZ2ljID09IGNwdV90b19sZTMyKFVGU19NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTMl9NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTX01BR0lDX0ZFQSkpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTX01BR0lDX0xGTikpCisJCSkgeworCQkJZGJnKCJtYWdpYyAweCUwOHgobGUpIiwgbWFnaWMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gInVmcyI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF92aWFfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3ZpYV9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZWVjMQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF92aWFfcmFpZC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB2aWFfbWV0YSB7CisJdWludDE2X3QJc2lnbmF0dXJlOworCXVpbnQ4X3QJCXZlcnNpb25fbnVtYmVyOworCXN0cnVjdCB2aWFfYXJyYXkgeworCQl1aW50MTZfdAlkaXNrX2JpdHM7CisJCXVpbnQ4X3QJCWRpc2tfYXJyYXlfZXg7CisJCXVpbnQzMl90CWNhcGFjaXR5X2xvdzsKKwkJdWludDMyX3QJY2FwYWNpdHlfaGlnaDsKKwkJdWludDMyX3QJc2VyaWFsX2NoZWNrc3VtOworCX0gUEFDS0VEIGFycmF5OworCXVpbnQzMl90CXNlcmlhbF9jaGVja3N1bVs4XTsKKwl1aW50OF90CQljaGVja3N1bTsKK30gUEFDS0VEOworCisjZGVmaW5lIFZJQV9TSUdOQVRVUkUJCTB4QUE1NQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV92aWFfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCB2aWFfbWV0YSAqdmlhOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMSkgKiAweDIwMDsKKworCXZpYSA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmICh2aWEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHZpYS0+c2lnbmF0dXJlICE9IGNwdV90b19sZTE2KFZJQV9TSUdOQVRVUkUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodmlhLT52ZXJzaW9uX251bWJlciA+IDEpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGVfdmVyc2lvblswXSA9ICcwJyArIHZpYS0+dmVyc2lvbl9udW1iZXI7CisvLwlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKy8vCWlkLT50eXBlID0gInZpYV9yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3V0aWwuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc1YzdiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdXRpbC5jCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCit2b2lkIHZvbHVtZV9pZF9zZXRfdW5pY29kZTE2KGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgY29uc3QgdWludDhfdCAqYnVmLCBlbnVtIGVuZGlhbiBlbmRpYW5lc3MsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpLCBqOworCXVuc2lnbmVkIGM7CisKKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpICsgMiA8PSBjb3VudDsgaSArPSAyKSB7CisJCWlmIChlbmRpYW5lc3MgPT0gTEUpCisJCQljID0gKGJ1ZltpKzFdIDw8IDgpIHwgYnVmW2ldOworCQllbHNlCisJCQljID0gKGJ1ZltpXSA8PCA4KSB8IGJ1ZltpKzFdOworCQlpZiAoYyA9PSAwKSB7CisJCQlzdHJbal0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYyA8IDB4ODApIHsKKwkJCWlmIChqKzEgPj0gbGVuKQorCQkJCWJyZWFrOworCQkJc3RyW2orK10gPSAodWludDhfdCkgYzsKKwkJfSBlbHNlIGlmIChjIDwgMHg4MDApIHsKKwkJCWlmIChqKzIgPj0gbGVuKQorCQkJCWJyZWFrOworCQkJc3RyW2orK10gPSAodWludDhfdCkgKDB4YzAgfCAoYyA+PiA2KSk7CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHg4MCB8IChjICYgMHgzZikpOworCQl9IGVsc2UgeworCQkJaWYgKGorMyA+PSBsZW4pCisJCQkJYnJlYWs7CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHhlMCB8IChjID4+IDEyKSk7CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKwkJCXN0cltqKytdID0gKHVpbnQ4X3QpICgweDgwIHwgKGMgJiAweDNmKSk7CisJCX0KKwl9CisJc3RyW2pdID0gJ1wwJzsKK30KKworI2lmZGVmIFVOVVNFRAorc3RhdGljIGNvbnN0IGNoYXIgKnVzYWdlX3RvX3N0cmluZyhlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCkKK3sKKwlzd2l0Y2ggKHVzYWdlX2lkKSB7CisJY2FzZSBWT0xVTUVfSURfRklMRVNZU1RFTToKKwkJcmV0dXJuICJmaWxlc3lzdGVtIjsKKwljYXNlIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRToKKwkJcmV0dXJuICJwYXJ0aXRpb250YWJsZSI7CisJY2FzZSBWT0xVTUVfSURfT1RIRVI6CisJCXJldHVybiAib3RoZXIiOworCWNhc2UgVk9MVU1FX0lEX1JBSUQ6CisJCXJldHVybiAicmFpZCI7CisJY2FzZSBWT0xVTUVfSURfRElTS0xBQkVMOgorCQlyZXR1cm4gImRpc2tsYWJlbCI7CisJY2FzZSBWT0xVTUVfSURfQ1JZUFRPOgorCQlyZXR1cm4gImNyeXB0byI7CisJY2FzZSBWT0xVTUVfSURfVU5QUk9CRUQ6CisJCXJldHVybiAidW5wcm9iZWQiOworCWNhc2UgVk9MVU1FX0lEX1VOVVNFRDoKKwkJcmV0dXJuICJ1bnVzZWQiOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoc3RydWN0IHZvbHVtZV9pZF9wYXJ0aXRpb24gKnBhcnQsIGVudW0gdm9sdW1lX2lkX3VzYWdlIHVzYWdlX2lkKQoreworCXBhcnQtPnVzYWdlX2lkID0gdXNhZ2VfaWQ7CisJcGFydC0+dXNhZ2UgPSB1c2FnZV90b19zdHJpbmcodXNhZ2VfaWQpOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfdXNhZ2Uoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGVudW0gdm9sdW1lX2lkX3VzYWdlIHVzYWdlX2lkKQoreworCWlkLT51c2FnZV9pZCA9IHVzYWdlX2lkOworCWlkLT51c2FnZSA9IHVzYWdlX3RvX3N0cmluZyh1c2FnZV9pZCk7Cit9CisKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCW1lbWNweShpZC0+bGFiZWxfcmF3LCBidWYsIGNvdW50KTsKKwlpZC0+bGFiZWxfcmF3X2xlbiA9IGNvdW50OworfQorI2VuZGlmCisKKyNpZmRlZiBOT1RfTkVFREVECitzdGF0aWMgc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbikKK3sKKwlzaXplX3QgaTsKKwlpZiAoIW1heGxlbikgcmV0dXJuIDA7CisJaWYgKCFzKSByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyAqcyAmJiBpIDwgbWF4bGVuOyArK3MpICsraTsKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCit2b2lkIHZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpOworCisJbWVtY3B5KGlkLT5sYWJlbCwgYnVmLCBjb3VudCk7CisKKwkvKiByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCWkgPSBzdHJubGVuKGlkLT5sYWJlbCwgY291bnQpOworCXdoaWxlIChpLS0pIHsKKwkJaWYgKCFpc3NwYWNlKGlkLT5sYWJlbFtpXSkpCisJCQlicmVhazsKKwl9CisJaWQtPmxhYmVsW2krMV0gPSAnXDAnOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBjb25zdCB1aW50OF90ICpidWYsIGVudW0gZW5kaWFuIGVuZGlhbmVzcywgc2l6ZV90IGNvdW50KQoreworCSB2b2x1bWVfaWRfc2V0X3VuaWNvZGUxNihpZC0+bGFiZWwsIHNpemVvZihpZC0+bGFiZWwpLCBidWYsIGVuZGlhbmVzcywgY291bnQpOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfdXVpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgY29uc3QgdWludDhfdCAqYnVmLCBlbnVtIHV1aWRfZm9ybWF0IGZvcm1hdCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBVVUlEX0RPUzoKKwkJY291bnQgPSA0OworCQlicmVhazsKKwljYXNlIFVVSURfTlRGUzoKKwljYXNlIFVVSURfSEZTOgorCQljb3VudCA9IDg7CisJCWJyZWFrOworCWNhc2UgVVVJRF9EQ0U6CisJCWNvdW50ID0gMTY7CisJCWJyZWFrOworCWNhc2UgVVVJRF9EQ0VfU1RSSU5HOgorCQkvKiAzNiBpcyBvaywgaWQtPnV1aWQgaGFzIG9uZSBleHRyYSBieXRlIGZvciBOVUwgKi8KKwkJY291bnQgPSBWT0xVTUVfSURfVVVJRF9TSVpFOworCQlicmVhazsKKwl9CisvLwltZW1jcHkoaWQtPnV1aWRfcmF3LCBidWYsIGNvdW50KTsKKy8vCWlkLT51dWlkX3Jhd19sZW4gPSBjb3VudDsKKworCS8qIGlmIHNldCwgY3JlYXRlIHN0cmluZyBpbiB0aGUgc2FtZSBmb3JtYXQsIHRoZSBuYXRpdmUgcGxhdGZvcm0gdXNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpZiAoYnVmW2ldICE9IDApCisJCQlnb3RvIHNldDsKKwlyZXR1cm47IC8qIGFsbCBieXRlcyBhcmUgemVybywgbGVhdmUgaXQgZW1wdHkgKCIiKSAqLworCitzZXQ6CisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFVVSURfRE9TOgorCQlzcHJpbnRmKGlkLT51dWlkLCAiJTAyWCUwMlgtJTAyWCUwMlgiLAorCQkJYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX05URlM6CisJCXNwcmludGYoaWQtPnV1aWQsICIlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCIsCisJCQlidWZbN10sIGJ1Zls2XSwgYnVmWzVdLCBidWZbNF0sCisJCQlidWZbM10sIGJ1ZlsyXSwgYnVmWzFdLCBidWZbMF0pOworCQlicmVhazsKKwljYXNlIFVVSURfSEZTOgorCQlzcHJpbnRmKGlkLT51dWlkLCAiJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlgiLAorCQkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAorCQkJYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSwgYnVmWzddKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX0RDRToKKwkJc3ByaW50ZihpZC0+dXVpZCwKKwkJCSIlMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCQlidWZbNF0sIGJ1Zls1XSwKKwkJCWJ1Zls2XSwgYnVmWzddLAorCQkJYnVmWzhdLCBidWZbOV0sCisJCQlidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX0RDRV9TVFJJTkc6CisJCW1lbWNweShpZC0+dXVpZCwgYnVmLCBjb3VudCk7CisJCWlkLT51dWlkW2NvdW50XSA9ICdcMCc7CisJCWJyZWFrOworCX0KK30KKworLyogRG8gbm90IHVzZSB4bHNlZWsgaGVyZS4gV2l0aCBpdCwgc2luZ2xlIGNvcnJ1cHRlZCBmaWxlc3lzdGVtCisgKiBtYXkgcmVzdWx0IGluIGF0dGVtcHQgdG8gc2VlayBwYXN0IGRldmljZSAtPiBleGl0LgorICogSXQncyBiZXR0ZXIgdG8gaWdub3JlIHN1Y2ggZnMgYW5kIGNvbnRpbnVlLiAgKi8KK3ZvaWQgKnZvbHVtZV9pZF9nZXRfYnVmZmVyKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYsIHNpemVfdCBsZW4pCit7CisJdWludDhfdCAqZHN0OworCXVuc2lnbmVkIHNtYWxsX29mZjsKKwlzc2l6ZV90IHJlYWRfbGVuOworCisJZGJnKCJnZXQgYnVmZmVyIG9mZiAweCVsbHgoJWxsdSksIGxlbiAweCV6eCIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCBsZW4pOworCisJLyogY2hlY2sgaWYgcmVxdWVzdGVkIGFyZWEgZml0cyBpbiBzdXBlcmJsb2NrIGJ1ZmZlciAqLworCWlmIChvZmYgKyBsZW4gPD0gU0JfQlVGRkVSX1NJWkUKKwkgLyogJiYgb2ZmIDw9IFNCX0JVRkZFUl9TSVpFIC0gd2FudCB0aGlzIHBhcmFub2lkIG92ZXJmbG93IGNoZWNrPyAqLworCSkgeworCQlpZiAoaWQtPnNiYnVmID09IE5VTEwpIHsKKwkJCWlkLT5zYmJ1ZiA9IHhtYWxsb2MoU0JfQlVGRkVSX1NJWkUpOworCQl9CisJCXNtYWxsX29mZiA9IG9mZjsKKwkJZHN0ID0gaWQtPnNiYnVmOworCisJCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVhZCAqLworCQlsZW4gKz0gb2ZmOworCQlpZiAobGVuIDw9IGlkLT5zYmJ1Zl9sZW4pCisJCQlnb3RvIHJldDsgLyogd2UgYWxyZWFkeSBoYXZlIGl0ICovCisKKwkJZGJnKCJyZWFkIHNiYnVmIGxlbjoweCV4IiwgKHVuc2lnbmVkKSBsZW4pOworCQlpZC0+c2JidWZfbGVuID0gbGVuOworCQlvZmYgPSAwOworCQlnb3RvIGRvX3JlYWQ7CisJfQorCisJaWYgKGxlbiA+IFNFRUtfQlVGRkVSX1NJWkUpIHsKKwkJZGJnKCJzZWVrIGJ1ZmZlciB0b28gc21hbGwgJWQiLCBTRUVLX0JVRkZFUl9TSVpFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRzdCA9IGlkLT5zZWVrYnVmOworCisJLyogY2hlY2sgaWYgd2UgbmVlZCB0byByZWFkICovCisJaWYgKChvZmYgPj0gaWQtPnNlZWtidWZfb2ZmKQorCSAmJiAoKG9mZiArIGxlbikgPD0gKGlkLT5zZWVrYnVmX29mZiArIGlkLT5zZWVrYnVmX2xlbikpCisJKSB7CisJCXNtYWxsX29mZiA9IG9mZiAtIGlkLT5zZWVrYnVmX29mZjsgLyogY2FuJ3Qgb3ZlcmZsb3cgKi8KKwkJZ290byByZXQ7IC8qIHdlIGFscmVhZHkgaGF2ZSBpdCAqLworCX0KKworCWlkLT5zZWVrYnVmX29mZiA9IG9mZjsKKwlpZC0+c2Vla2J1Zl9sZW4gPSBsZW47CisJaWQtPnNlZWtidWYgPSB4cmVhbGxvYyhpZC0+c2Vla2J1ZiwgbGVuKTsKKwlzbWFsbF9vZmYgPSAwOworCWRzdCA9IGlkLT5zZWVrYnVmOworCWRiZygicmVhZCBzZWVrYnVmIG9mZjoweCVsbHggbGVuOjB4JXp4IiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsIGxlbik7CisgZG9fcmVhZDoKKwlpZiAobHNlZWsoaWQtPmZkLCBvZmYsIFNFRUtfU0VUKSAhPSBvZmYpIHsKKwkJZGJnKCJzZWVrKDB4JWxseCkgZmFpbGVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKwkJZ290byBlcnI7CisJfQorCXJlYWRfbGVuID0gZnVsbF9yZWFkKGlkLT5mZCwgZHN0LCBsZW4pOworCWlmIChyZWFkX2xlbiAhPSBsZW4pIHsKKwkJZGJnKCJyZXF1ZXN0ZWQgMHgleCBieXRlcywgZ290IDB4JXggYnl0ZXMiLAorCQkJCSh1bnNpZ25lZCkgbGVuLCAodW5zaWduZWQpIHJlYWRfbGVuKTsKKyBlcnI6CisJCS8qIE5vIGZpbGVzeXN0ZW0gY2FuIGJlIHRoaXMgdGlueS4gSXQncyBtb3N0IGxpa2VseQorCQkgKiBub24tYXNzb2NpYXRlZCBsb29wIGRldmljZSwgZW1wdHkgZHJpdmUgYW5kIHNvIG9uLgorCQkgKiBGbGFnIGl0LCBtYWtpbmcgaXQgcG9zc2libGUgdG8gc2hvcnQgY2lyY3VpdCBmdXR1cmUKKwkJICogYWNjZXNzZXMuIFJhdGlvbmFsZToKKwkJICogdXNlcnMgY29tcGxhaW5lZCBvZiBzbG93IGJsa2lkIGR1ZSB0byBlbXB0eSBmbG9wcHkgZHJpdmVzLgorCQkgKi8KKwkJaWYgKG9mZiA8IDY0KjEwMjQpCisJCQlpZC0+ZXJyb3IgPSAxOworCQkvKiBpZC0+c2Vla2J1Zl9sZW4gb3IgaWQtPnNiYnVmX2xlbiBpcyB3cm9uZyBub3chIEZpeGluZy4gKi8KKwkJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorIHJldDoKKwlyZXR1cm4gZHN0ICsgc21hbGxfb2ZmOworfQorCit2b2lkIHZvbHVtZV9pZF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2lkICppZCkKK3sKKwlmcmVlKGlkLT5zYmJ1Zik7CisJaWQtPnNiYnVmID0gTlVMTDsKKwlpZC0+c2JidWZfbGVuID0gMDsKKwlmcmVlKGlkLT5zZWVrYnVmKTsKKwlpZC0+c2Vla2J1ZiA9IE5VTEw7CisJaWQtPnNlZWtidWZfbGVuID0gMDsKKwlpZC0+c2Vla2J1Zl9vZmYgPSAwOyAvKiBwYXJhbm9pYSAqLworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC92b2x1bWVfaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDFkNGUwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKworLyogU29tZSBkZXRlY3Rpb24gcm91dGluZXMgZG8gbm90IHNldCBsYWJlbCBvciB1dWlkIGFueXdheSwKKyAqIHNvIHRoZXkgYXJlIGRpc2FibGVkLiAqLworCisvKiBMb29rcyBmb3IgcGFydGl0aW9ucywgd2UgZG9uJ3QgdXNlIGl0OiAqLworI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9NQUMgICAgICAgICAgIDAKKy8qICNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTVNET1MgICAgICAwIC0gTkI6IHRoaXMgb25lCisgKiB3YXMgbm90IHByb3Blcmx5IGFkZGVkIHRvIHByb2JlIHRhYmxlIGFueXdheSAtID8/ISAqLworCisvKiBOb25lIG9mIFJBSURzIGhhdmUgbGFiZWwgb3IgdXVpZCwgZXhjZXB0IExpbnV4UkFJRDogKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSElHSFBPSU5UUkFJRCAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQgICAgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MU0lSQUlEICAgICAgIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTFZNICAgICAgICAgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX05WSURJQVJBSUQgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9QUk9NSVNFUkFJRCAgIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfU0lMSUNPTlJBSUQgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1ZJQVJBSUQgICAgICAgMAorCisvKiBUaGVzZSBmaWxlc3lzdGVtcyBhbHNvIGhhdmUgbm8gbGFiZWwgb3IgdXVpZDogKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVggICAgICAgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0hQRlMgICAgICAgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9VRlMgICAgICAgICAgIDAKKworCit0eXBlZGVmIGludCBGQVNUX0ZVTkMgKCpyYWlkX3Byb2JlX2ZwdHIpKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCAvKnVpbnQ2NF90IG9mZiwqLyB1aW50NjRfdCBzaXplKTsKK3R5cGVkZWYgaW50IEZBU1RfRlVOQyAoKnByb2JlX2ZwdHIpKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLCB1aW50NjRfdCBvZmYqLyk7CisKK3N0YXRpYyBjb25zdCByYWlkX3Byb2JlX2ZwdHIgcmFpZDFbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfbGludXhfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQKKwl2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0xTSVJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfbHNpX21lZ2FfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1ZJQVJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfdmlhX3JhaWQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9TSUxJQ09OUkFJRAorCXZvbHVtZV9pZF9wcm9iZV9zaWxpY29uX21lZGxleV9yYWlkLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRAorCXZvbHVtZV9pZF9wcm9iZV9udmlkaWFfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1BST01JU0VSQUlECisJdm9sdW1lX2lkX3Byb2JlX3Byb21pc2VfZmFzdHRyYWNrX3JhaWQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9ISUdIUE9JTlRSQUlECisJdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHByb2JlX2ZwdHIgcmFpZDJbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MVk0KKwl2b2x1bWVfaWRfcHJvYmVfbHZtMSwKKwl2b2x1bWVfaWRfcHJvYmVfbHZtMiwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0hJR0hQT0lOVFJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfaGlnaHBvaW50XzM3eF9yYWlkLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTFVLUworCXZvbHVtZV9pZF9wcm9iZV9sdWtzLAorI2VuZGlmCit9OworCisvKiBzaWduYXR1cmUgaW4gdGhlIGZpcnN0IGJsb2NrLCBvbmx5IHNtYWxsIGJ1ZmZlciBuZWVkZWQgKi8KK3N0YXRpYyBjb25zdCBwcm9iZV9mcHRyIGZzMVtdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0ZBVAorCXZvbHVtZV9pZF9wcm9iZV92ZmF0LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUFDCisJdm9sdW1lX2lkX3Byb2JlX21hY19wYXJ0aXRpb25fbWFwLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfWEZTCisJdm9sdW1lX2lkX3Byb2JlX3hmcywKKyNlbmRpZgorfTsKKworLyogZmlsbCBidWZmZXIgd2l0aCBtYXhpbXVtICovCitzdGF0aWMgY29uc3QgcHJvYmVfZnB0ciBmczJbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAKKwl2b2x1bWVfaWRfcHJvYmVfbGludXhfc3dhcCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0VYVAorCXZvbHVtZV9pZF9wcm9iZV9leHQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUworCXZvbHVtZV9pZF9wcm9iZV9idHJmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTCisJdm9sdW1lX2lkX3Byb2JlX3JlaXNlcmZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSkZTCisJdm9sdW1lX2lkX3Byb2JlX2pmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1VERgorCXZvbHVtZV9pZF9wcm9iZV91ZGYsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwCisJdm9sdW1lX2lkX3Byb2JlX2lzbzk2NjAsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9IRlMKKwl2b2x1bWVfaWRfcHJvYmVfaGZzX2hmc3BsdXMsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9VRlMKKwl2b2x1bWVfaWRfcHJvYmVfdWZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTlRGUworCXZvbHVtZV9pZF9wcm9iZV9udGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTCisJdm9sdW1lX2lkX3Byb2JlX2NyYW1mcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTCisJdm9sdW1lX2lkX3Byb2JlX3JvbWZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSFBGUworCXZvbHVtZV9pZF9wcm9iZV9ocGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfU1lTVgorCXZvbHVtZV9pZF9wcm9iZV9zeXN2LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVgKKwl2b2x1bWVfaWRfcHJvYmVfbWluaXgsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMgorCXZvbHVtZV9pZF9wcm9iZV9vY2ZzMiwKKyNlbmRpZgorfTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfYWxsKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCAvKnVpbnQ2NF90IG9mZiwqLyB1aW50NjRfdCBzaXplKQoreworCXVuc2lnbmVkIGk7CisKKwkvKiBwcm9iZSBmb3IgcmFpZCBmaXJzdCwgY2F1c2UgZnMgcHJvYmVzIG1heSBiZSBzdWNjZXNzZnVsIG9uIHJhaWQgbWVtYmVycyAqLworCWlmIChzaXplKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhaWQxKTsgaSsrKSB7CisJCQlpZiAocmFpZDFbaV0oaWQsIC8qb2ZmLCovIHNpemUpID09IDApCisJCQkJZ290byByZXQ7CisJCQlpZiAoaWQtPmVycm9yKQorCQkJCWdvdG8gcmV0OworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFpZDIpOyBpKyspIHsKKwkJaWYgKHJhaWQyW2ldKGlkIC8qLG9mZiovKSA9PSAwKQorCQkJZ290byByZXQ7CisJCWlmIChpZC0+ZXJyb3IpCisJCQlnb3RvIHJldDsKKwl9CisKKwkvKiBzaWduYXR1cmUgaW4gdGhlIGZpcnN0IGJsb2NrLCBvbmx5IHNtYWxsIGJ1ZmZlciBuZWVkZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmczEpOyBpKyspIHsKKwkJaWYgKGZzMVtpXShpZCAvKixvZmYqLykgPT0gMCkKKwkJCWdvdG8gcmV0OworCQlpZiAoaWQtPmVycm9yKQorCQkJZ290byByZXQ7CisJfQorCisJLyogZmlsbCBidWZmZXIgd2l0aCBtYXhpbXVtICovCisJdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIDAsIFNCX0JVRkZFUl9TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzMik7IGkrKykgeworCQlpZiAoZnMyW2ldKGlkIC8qLG9mZiovKSA9PSAwKQorCQkJZ290byByZXQ7CisJCWlmIChpZC0+ZXJyb3IpCisJCQlnb3RvIHJldDsKKwl9CisKKyByZXQ6CisJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKwlyZXR1cm4gKC0gaWQtPmVycm9yKTsgLyogMCBvciAtMSAqLworfQorCisvKiBvcGVuIHZvbHVtZSBieSBkZXZpY2Ugbm9kZSAqLworc3RydWN0IHZvbHVtZV9pZCogRkFTVF9GVU5DIHZvbHVtZV9pZF9vcGVuX25vZGUoaW50IGZkKQoreworCXN0cnVjdCB2b2x1bWVfaWQgKmlkOworCisJaWQgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkKSk7CisJaWQtPmZkID0gZmQ7CisJLy8vKiBjbG9zZSBmZCBvbiBkZXZpY2UgY2xvc2UgKi8KKwkvL2lkLT5mZF9jbG9zZSA9IDE7CisJcmV0dXJuIGlkOworfQorCisjaWZkZWYgVU5VU0VECisvKiBvcGVuIHZvbHVtZSBieSBtYWpvci9taW5vciAqLworc3RydWN0IHZvbHVtZV9pZCogRkFTVF9GVU5DIHZvbHVtZV9pZF9vcGVuX2Rldl90KGRldl90IGRldnQpCit7CisJc3RydWN0IHZvbHVtZV9pZCAqaWQ7CisJY2hhciAqdG1wX25vZGVbVk9MVU1FX0lEX1BBVEhfTUFYXTsKKworCXRtcF9ub2RlID0geGFzcHJpbnRmKCIvZGV2Ly52b2x1bWVfaWQtJXUtJXUtJXUiLAorCQkodW5zaWduZWQpZ2V0cGlkKCksICh1bnNpZ25lZCltYWpvcihkZXZ0KSwgKHVuc2lnbmVkKW1pbm9yKGRldnQpKTsKKworCS8qIGNyZWF0ZSB0ZW1wb3Jhcnkgbm9kZSB0byBvcGVuIGJsb2NrIGRldmljZSAqLworCXVubGluayh0bXBfbm9kZSk7CisJaWYgKG1rbm9kKHRtcF9ub2RlLCAoU19JRkJMSyB8IDA2MDApLCBkZXZ0KSAhPSAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1rbm9kKCVzKSIsIHRtcF9ub2RlKTsKKworCWlkID0gdm9sdW1lX2lkX29wZW5fbm9kZSh0bXBfbm9kZSk7CisJdW5saW5rKHRtcF9ub2RlKTsKKwlmcmVlKHRtcF9ub2RlKTsKKwlyZXR1cm4gaWQ7Cit9CisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgZnJlZV92b2x1bWVfaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQpCit7CisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybjsKKworCS8vaWYgKGlkLT5mZF9jbG9zZSAhPSAwKSAtIGFsd2F5cyB0cnVlCisJCWNsb3NlKGlkLT5mZCk7CisJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKKwlmcmVlKGlkLT5wYXJ0aXRpb25zKTsKKyNlbmRpZgorCWZyZWUoaWQpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkX2ludGVybmFsLmggYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC92b2x1bWVfaWRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY0MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkX2ludGVybmFsLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKyNkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisvKiAjZGVmaW5lIGRiZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykgKi8KKworLyogdm9sdW1lX2lkLmggKi8KKworI2RlZmluZSBWT0xVTUVfSURfVkVSU0lPTgkJNDgKKworI2RlZmluZSBWT0xVTUVfSURfTEFCRUxfU0laRQkJNjQKKyNkZWZpbmUgVk9MVU1FX0lEX1VVSURfU0laRQkJMzYKKyNkZWZpbmUgVk9MVU1FX0lEX0ZPUk1BVF9TSVpFCQkzMgorI2RlZmluZSBWT0xVTUVfSURfUEFSVElUSU9OU19NQVgJMjU2CisKK2VudW0gdm9sdW1lX2lkX3VzYWdlIHsKKwlWT0xVTUVfSURfVU5VU0VELAorCVZPTFVNRV9JRF9VTlBST0JFRCwKKwlWT0xVTUVfSURfT1RIRVIsCisJVk9MVU1FX0lEX0ZJTEVTWVNURU0sCisJVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFLAorCVZPTFVNRV9JRF9SQUlELAorCVZPTFVNRV9JRF9ESVNLTEFCRUwsCisJVk9MVU1FX0lEX0NSWVBUTywKK307CisKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKK3N0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uIHsKKy8vCWNvbnN0IGNoYXIJKnR5cGU7CisvLwljb25zdCBjaGFyCSp1c2FnZTsKKy8vCXNtYWxsaW50CXVzYWdlX2lkOworLy8JdWludDhfdAkJcHRfdHlwZV9yYXc7CisvLwl1aW50NjRfdAlwdF9vZmY7CisvLwl1aW50NjRfdAlwdF9sZW47Cit9OworI2VuZGlmCisKK3N0cnVjdCB2b2x1bWVfaWQgeworCWludAkJZmQ7CisvLwlpbnQJCWZkX2Nsb3NlOjE7CisJaW50CQllcnJvcjsKKwlzaXplX3QJCXNiYnVmX2xlbjsKKwlzaXplX3QJCXNlZWtidWZfbGVuOworCXVpbnQ4X3QJCSpzYmJ1ZjsKKwl1aW50OF90CQkqc2Vla2J1ZjsKKwl1aW50NjRfdAlzZWVrYnVmX29mZjsKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKKwlzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbiAqcGFydGl0aW9uczsKKwlzaXplX3QJCXBhcnRpdGlvbl9jb3VudDsKKyNlbmRpZgorLy8JdWludDhfdAkJbGFiZWxfcmF3W1ZPTFVNRV9JRF9MQUJFTF9TSVpFXTsKKy8vCXNpemVfdAkJbGFiZWxfcmF3X2xlbjsKKwljaGFyCQlsYWJlbFtWT0xVTUVfSURfTEFCRUxfU0laRSsxXTsKKy8vCXVpbnQ4X3QJCXV1aWRfcmF3W1ZPTFVNRV9JRF9VVUlEX1NJWkVdOworLy8Jc2l6ZV90CQl1dWlkX3Jhd19sZW47CisJLyogdXVpZCBpcyBzdG9yZWQgaW4gQVNDSUkgKG5vdCBiaW5hcnkpIGZvcm0gaGVyZTogKi8KKwljaGFyCQl1dWlkW1ZPTFVNRV9JRF9VVUlEX1NJWkUrMV07CisvLwljaGFyCQl0eXBlX3ZlcnNpb25bVk9MVU1FX0lEX0ZPUk1BVF9TSVpFXTsKKy8vCXNtYWxsaW50CXVzYWdlX2lkOworLy8JY29uc3QgY2hhcgkqdXNhZ2U7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCWNvbnN0IGNoYXIJKnR5cGU7CisjZW5kaWYKK307CisKK3N0cnVjdCB2b2x1bWVfaWQqIEZBU1RfRlVOQyB2b2x1bWVfaWRfb3Blbl9ub2RlKGludCBmZCk7CitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9hbGwoc3RydWN0IHZvbHVtZV9pZCAqaWQsIC8qdWludDY0X3Qgb2ZmLCovIHVpbnQ2NF90IHNpemUpOwordm9pZCBGQVNUX0ZVTkMgZnJlZV92b2x1bWVfaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQpOworCisvKiB1dGlsLmggKi8KKworLyogc2l6ZSBvZiBzdXBlcmJsb2NrIGJ1ZmZlciwgcmVpc2VyZnMgYmxvY2sgaXMgYXQgNjRrICovCisjZGVmaW5lIFNCX0JVRkZFUl9TSVpFCQkJCTB4MTEwMDAKKy8qIHNpemUgb2Ygc2VlayBidWZmZXIsIEZBVCBjbHVzdGVyIGlzIDMyayBtYXggKi8KKyNkZWZpbmUgU0VFS19CVUZGRVJfU0laRQkJCTB4MTAwMDAKKworI2RlZmluZSBic3dhcDE2KHgpICh1aW50MTZfdCkJKCBcCisJCQkJKCgodWludDE2X3QpKHgpICYgMHgwMGZmdSkgPDwgOCkgfCBcCisJCQkJKCgodWludDE2X3QpKHgpICYgMHhmZjAwdSkgPj4gOCkpCisKKyNkZWZpbmUgYnN3YXAzMih4KSAodWludDMyX3QpCSggXAorCQkJCSgoKHVpbnQzMl90KSh4KSAmIDB4ZmYwMDAwMDB1KSA+PiAyNCkgfCBcCisJCQkJKCgodWludDMyX3QpKHgpICYgMHgwMGZmMDAwMHUpID4+ICA4KSB8IFwKKwkJCQkoKCh1aW50MzJfdCkoeCkgJiAweDAwMDBmZjAwdSkgPDwgIDgpIHwgXAorCQkJCSgoKHVpbnQzMl90KSh4KSAmIDB4MDAwMDAwZmZ1KSA8PCAyNCkpCisKKyNkZWZpbmUgYnN3YXA2NCh4KSAodWludDY0X3QpCSggXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMGZmMDAwMDAwMDAwMHVsbCkgPj4gMjQpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gIDgpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgIDgpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMGZmMDAwMHVsbCkgPDwgMjQpIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApIHwgXAorCQkJCSgoKHVpbnQ2NF90KSh4KSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpKQorCisjaWYgQkJfTElUVExFX0VORElBTgorI2RlZmluZSBsZTE2X3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkgKHgpCisjZGVmaW5lIGxlNjRfdG9fY3B1KHgpICh4KQorI2RlZmluZSBiZTE2X3RvX2NwdSh4KSBic3dhcDE2KHgpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHgpIGJzd2FwMzIoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMTYoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTMyKHgpICh4KQorI2RlZmluZSBjcHVfdG9fYmUzMih4KSBic3dhcDMyKHgpCisjZWxzZQorI2RlZmluZSBsZTE2X3RvX2NwdSh4KSBic3dhcDE2KHgpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHgpIGJzd2FwMzIoeCkKKyNkZWZpbmUgbGU2NF90b19jcHUoeCkgYnN3YXA2NCh4KQorI2RlZmluZSBiZTE2X3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgYmUzMl90b19jcHUoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpIGJzd2FwMTYoeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkgYnN3YXAzMih4KQorI2RlZmluZSBjcHVfdG9fYmUzMih4KSAoeCkKKyNlbmRpZgorCitlbnVtIHV1aWRfZm9ybWF0IHsKKwlVVUlEX0RDRV9TVFJJTkcsCisJVVVJRF9EQ0UsCisJVVVJRF9ET1MsCisJVVVJRF9OVEZTLAorCVVVSURfSEZTLAorfTsKKworZW51bSBlbmRpYW4geworCUxFID0gMCwKKwlCRSA9IDEKK307CisKK3ZvaWQgdm9sdW1lX2lkX3NldF91bmljb2RlMTYoY2hhciAqc3RyLCBzaXplX3QgbGVuLCBjb25zdCB1aW50OF90ICpidWYsIGVudW0gZW5kaWFuIGVuZGlhbmVzcywgc2l6ZV90IGNvdW50KTsKKy8vdm9pZCB2b2x1bWVfaWRfc2V0X3VzYWdlKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCk7CisvL3ZvaWQgdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHN0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uICpwYXJ0LCBlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCk7CisvL3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSBlbmRpYW4gZW5kaWFuZXNzLCBzaXplX3QgY291bnQpOwordm9pZCB2b2x1bWVfaWRfc2V0X3V1aWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSB1dWlkX2Zvcm1hdCBmb3JtYXQpOwordm9pZCAqdm9sdW1lX2lkX2dldF9idWZmZXIoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgc2l6ZV90IGxlbik7Cit2b2lkIHZvbHVtZV9pZF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2lkICppZCk7CisKKworLyogUHJvYmUgcm91dGluZXMgKi8KKworLyogUkFJRCAqLworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF8zN3hfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8sIHVpbnQ2NF90IHNpemUpOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xzaV9tZWdhX3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8sIHVpbnQ2NF90IHNpemUpOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX252aWRpYV9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9wcm9taXNlX2Zhc3R0cmFja19yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9zaWxpY29uX21lZGxleV9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV92aWFfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHZtMShzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2x2bTIoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvKiBGUyAqLworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9idHJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2NyYW1mcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2V4dChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3ZmYXQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9oZnNfaGZzcGx1cyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaHBmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2lzbzk2NjAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9qZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9saW51eF9zd2FwKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHVrcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbWFjX3BhcnRpdGlvbl9tYXAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX21pbml4KHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9tc2Rvc19wYXJ0X3RhYmxlKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnRmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX29jZnMyKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfcmVpc2VyZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9yb21mcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3N5c3Yoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV91ZGYoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3VmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3hmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC94ZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3hmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzQ2MDIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC94ZnMuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90CW1hZ2ljWzRdOworCXVpbnQzMl90CWJsb2Nrc2l6ZTsKKwl1aW50NjRfdAlkYmxvY2tzOworCXVpbnQ2NF90CXJibG9ja3M7CisJdWludDMyX3QJZHVtbXkxWzJdOworCXVpbnQ4X3QJdXVpZFsxNl07CisJdWludDMyX3QJZHVtbXkyWzE1XTsKKwl1aW50OF90CWZuYW1lWzEyXTsKKwl1aW50MzJfdAlkdW1teTNbMl07CisJdWludDY0X3QJaWNvdW50OworCXVpbnQ2NF90CWlmcmVlOworCXVpbnQ2NF90CWZkYmxvY2tzOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3hmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3QgeGZzX3N1cGVyX2Jsb2NrICp4czsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXhzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiwgMHgyMDApOworCWlmICh4cyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKHhzLT5tYWdpYywgIlhGU0IiLCA0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB4cy0+Zm5hbWUsIDEyKTsKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgeHMtPmZuYW1lLCAxMik7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCB4cy0+dXVpZCwgVVVJRF9EQ0UpOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInhmcyI7KQorCisJcmV0dXJuIDA7Cit9Cg==